ZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Jhc2UuZ3lwIGIvc3JjL2Jhc2UvYmFzZS5neXAKaW5kZXggNWVjY2YxMy4uZTQ0MjM0MCAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvYmFzZS5neXAKKysrIGIvc3JjL2Jhc2UvYmFzZS5neXAKQEAgLTY5MiwyNCArNjkyLDYgQEAKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgXSwKICAgICB9LAotCi0KLSAgICAjIEluY2x1ZGUgdGhpcyB0YXJnZXQgZm9yIGEgbWFpbigpIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGluc3RhbnRpYXRlcwotICAgICMgYW5kIHJ1bnMgYSBiYXNlOjpUZXN0U3VpdGUuCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ3J1bl9hbGxfdW5pdHRlc3RzJywKLSAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICd0ZXN0X3N1cHBvcnRfYmFzZScsCi0gICAgICBdLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICd0ZXN0L3J1bl9hbGxfdW5pdHRlc3RzLmNjJywKLSAgICAgIF0sCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAotICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAotICAgICAgXSwKLSAgICB9LAogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdiYXNlX3VuaXR0ZXN0cycsCiAgICAgICAndHlwZSc6ICc8KGd0ZXN0X3RhcmdldF90eXBlKScsCkBAIC05NDgsNyArOTMwLDYgQEAKICAgICAgICAgJ2Jhc2UnLAogICAgICAgICAnYmFzZV9pMThuJywKICAgICAgICAgJ2Jhc2Vfc3RhdGljJywKLSAgICAgICAgJ3J1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJ3Rlc3Rfc3VwcG9ydF9iYXNlJywKICAgICAgICAgJ3RoaXJkX3BhcnR5L2R5bmFtaWNfYW5ub3RhdGlvbnMvZHluYW1pY19hbm5vdGF0aW9ucy5neXA6ZHluYW1pY19hbm5vdGF0aW9ucycsCiAgICAgICBdLApAQCAtOTY5LDYgKzk1MCw3IEBACiAgICAgICAgICMgRGVzdHJ1Y3RvciBpcyBleHBsaWNpdGx5IGRlbGV0ZWQuCiAgICAgICAgIDQ2MjQsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyc8KERFUFRIKS9iYXNlL3Rlc3QvdGVzdC5neXBpJ10sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAndGVzdF9zdXBwb3J0X2Jhc2UnLApkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZmlsZXMvZmlsZV9lbnVtZXJhdG9yX3N0YXJib2FyZC5jYyBiL3NyYy9iYXNlL2ZpbGVzL2ZpbGVfZW51bWVyYXRvcl9zdGFyYm9hcmQuY2MKaW5kZXggMWMyYjNmMC4uNzBlOTU5MCAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZmlsZXMvZmlsZV9lbnVtZXJhdG9yX3N0YXJib2FyZC5jYworKysgYi9zcmMvYmFzZS9maWxlcy9maWxlX2VudW1lcmF0b3Jfc3RhcmJvYXJkLmNjCkBAIC0xMDcsMTAgKzEwNywyMyBAQAogICB9OwogCiAgIHN0ZDo6dmVjdG9yPEZpbGVFbnVtZXJhdG9yOjpGaWxlSW5mbz4gcmV0OwotICBTYkRpcmVjdG9yeUVudHJ5IGVudHJ5OwogICAvLyBXZSB0ZXN0IGlmIFNiRGlyZWN0b3J5R2V0TmV4dCByZXR1cm5zIHBhcmVudCBkaXJlY3RvcnkgZmlsZSBkZXNjcmlwdG9yKC4uKQogICAvLyBiZWNhdXNlIHRoZSBkZWZpbml0aW9uIG9mIFNiRGlyZWN0b3J5R2V0TmV4dCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdC4KICAgYm9vbCBmb3VuZF9kb3RfZG90ID0gZmFsc2U7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisgIHN0ZDo6dmVjdG9yPGNoYXI+IGVudHJ5KFNCX0ZJTEVfTUFYX05BTUUpOworCisgIHdoaWxlIChTYkRpcmVjdG9yeUdldE5leHQoZGlyLCBlbnRyeS5kYXRhKCksIGVudHJ5LnNpemUoKSkpIHsKKyAgICBjb25zdCBjaGFyIGRvdF9kb3Rfc3RyW10gPSAiLi4iOworICAgIGlmICghU2JTdHJpbmdDb21wYXJlKGVudHJ5LmRhdGEoKSwgZG90X2RvdF9zdHIsIHNpemVvZihkb3RfZG90X3N0cikpKSB7CisgICAgICBmb3VuZF9kb3RfZG90ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0LnB1c2hfYmFjayhHZW5lcmF0ZUVudHJ5KGVudHJ5LmRhdGEoKSkpOworICB9CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKyAgU2JEaXJlY3RvcnlFbnRyeSBlbnRyeTsKKwogICB3aGlsZSAoU2JEaXJlY3RvcnlHZXROZXh0KGRpciwgJmVudHJ5KSkgewogICAgIGNvbnN0IGNoYXIgZG90X2RvdF9zdHJbXSA9ICIuLiI7CiAgICAgaWYgKCFTYlN0cmluZ0NvbXBhcmUoZW50cnkubmFtZSwgZG90X2RvdF9zdHIsIHNpemVvZihkb3RfZG90X3N0cikpKSB7CkBAIC0xMTgsNiArMTMxLDggQEAKICAgICB9CiAgICAgcmV0LnB1c2hfYmFjayhHZW5lcmF0ZUVudHJ5KGVudHJ5Lm5hbWUpKTsKICAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisKICAgaWYgKCFmb3VuZF9kb3RfZG90KSB7CiAgICAgcmV0LnB1c2hfYmFjayhHZW5lcmF0ZUVudHJ5KCIuLiIpKTsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvdGFzay90YXNrX3NjaGVkdWxlci9zY2hlZHVsZXJfd29ya2VyX3Bvb2xfaW1wbC5jYyBiL3NyYy9iYXNlL3Rhc2svdGFza19zY2hlZHVsZXIvc2NoZWR1bGVyX3dvcmtlcl9wb29sX2ltcGwuY2MKaW5kZXggMDI0NTRlZC4uZGE2MTE2MyAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvdGFzay90YXNrX3NjaGVkdWxlci9zY2hlZHVsZXJfd29ya2VyX3Bvb2xfaW1wbC5jYworKysgYi9zcmMvYmFzZS90YXNrL3Rhc2tfc2NoZWR1bGVyL3NjaGVkdWxlcl93b3JrZXJfcG9vbF9pbXBsLmNjCkBAIC01MCw3ICs1MCw3IEBACiAgICAgIlRhc2tTY2hlZHVsZXIuTnVtVGFza3NCZXR3ZWVuV2FpdHMuIjsKIGNvbnN0ZXhwciBjaGFyIGtOdW1UaHJlYWRzSGlzdG9ncmFtUHJlZml4W10gPSAiVGFza1NjaGVkdWxlci5OdW1Xb3JrZXJzLiI7CiAjaWZkZWYgU1RBUkJPQVJECi1jb25zdGV4cHIgc2l6ZV90IGtNYXhOdW1iZXJPZldvcmtlcnMgPSBTQl9NQVhfVEhSRUFEUzsKK2NvbnN0IHNpemVfdCBrTWF4TnVtYmVyT2ZXb3JrZXJzID0gU0JfTUFYX1RIUkVBRFM7CiAjZWxzZQogY29uc3RleHByIHNpemVfdCBrTWF4TnVtYmVyT2ZXb3JrZXJzID0gMjU2OwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvYmFzZS90YXNrL3Rhc2tfc2NoZWR1bGVyL3NjaGVkdWxlcl93b3JrZXJfcG9vbF9pbXBsX3VuaXR0ZXN0LmNjIGIvc3JjL2Jhc2UvdGFzay90YXNrX3NjaGVkdWxlci9zY2hlZHVsZXJfd29ya2VyX3Bvb2xfaW1wbF91bml0dGVzdC5jYwppbmRleCAwZmFkNjM0Li44MTY0MTVmIDEwMDY0NAotLS0gYS9zcmMvYmFzZS90YXNrL3Rhc2tfc2NoZWR1bGVyL3NjaGVkdWxlcl93b3JrZXJfcG9vbF9pbXBsX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy9iYXNlL3Rhc2svdGFza19zY2hlZHVsZXIvc2NoZWR1bGVyX3dvcmtlcl9wb29sX2ltcGxfdW5pdHRlc3QuY2MKQEAgLTE0MTUsNyArMTQxNSw3IEBACiAvLyBsZWF2ZXMgdGhlIHBvb2wgaW4gYSB2YWxpZCBzdGF0ZSB3aXRoIHJlZ2FyZHMgdG8gbWF4IHRhc2tzLgogVEVTVF9GKFRhc2tTY2hlZHVsZXJXb3JrZXJQb29sQmxvY2tpbmdUZXN0LCBNYXhpbXVtV29ya2Vyc1Rlc3QpIHsKICNpZmRlZiBTVEFSQk9BUkQKLSAgY29uc3RleHByIHNpemVfdCBrTWF4TnVtYmVyT2ZXb3JrZXJzID0gU0JfTUFYX1RIUkVBRFM7CisgIGNvbnN0IHNpemVfdCBrTWF4TnVtYmVyT2ZXb3JrZXJzID0gU0JfTUFYX1RIUkVBRFM7CiAjZWxzZQogICBjb25zdGV4cHIgc2l6ZV90IGtNYXhOdW1iZXJPZldvcmtlcnMgPSAyNTY7CiAjZW5kaWYKQEAgLTE2NjUsNyArMTY2NSw3IEBACiAvLyB0ZXN0IGZvciBodHRwczovL2NyYnVnLmNvbS84MTA0NjQuCiBURVNUX0YoVGFza1NjaGVkdWxlcldvcmtlclBvb2xJbXBsU3RhcnRJbkJvZHlUZXN0LCBSYWN5Q2xlYW51cCkgewogI2lmZGVmIFNUQVJCT0FSRAotICBjb25zdGV4cHIgc2l6ZV90IGtMb2NhbE1heFRhc2tzID0gU0JfTUFYX1RIUkVBRFM7CisgIGNvbnN0IHNpemVfdCBrTG9jYWxNYXhUYXNrcyA9IFNCX01BWF9USFJFQURTOwogI2Vsc2UKICNpZiBkZWZpbmVkKE9TX0ZVQ0hTSUEpCiAgIC8vIEZ1Y2hzaWEgKyBRRU1VIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGggKm1hbnkqIHRocmVhZHMgYmVpbmcKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL3Rlc3QvdGVzdC5neXBpIGIvc3JjL2Jhc2UvdGVzdC90ZXN0Lmd5cGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5ZDE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYXNlL3Rlc3QvdGVzdC5neXBpCkBAIC0wLDAgKzEsMTYgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyMgSW5jbHVkZSB0aGlzIGZpbGUgZm9yIGEgbWFpbigpIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGluc3RhbnRpYXRlcyBhbmQgcnVucyBhCisjIGJhc2U6OlRlc3RTdWl0ZS4KK3sKKyAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDp0ZXN0X3N1cHBvcnRfYmFzZScsCisgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKKyAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAorICBdLAorICAnc291cmNlcyc6IFsKKyAgICAnPChERVBUSCkvYmFzZS90ZXN0L3J1bl9hbGxfdW5pdHRlc3RzLmNjJywKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL3RpbWUvdGltZV91bml0dGVzdC5jYyBiL3NyYy9iYXNlL3RpbWUvdGltZV91bml0dGVzdC5jYwppbmRleCA4N2Q0Y2M1Li5hOGE0YTU4IDEwMDY0NAotLS0gYS9zcmMvYmFzZS90aW1lL3RpbWVfdW5pdHRlc3QuY2MKKysrIGIvc3JjL2Jhc2UvdGltZS90aW1lX3VuaXR0ZXN0LmNjCkBAIC0xMDAwLDE0ICsxMDAwLDIyIEBACiAvLyBzdGF0aWMKIFRocmVhZFRpY2tzIFRocmVhZFRpY2tzT3ZlcnJpZGU6Om5vd190aWNrc187CiAKLSNpZiBTQl9IQVMoVElNRV9USFJFQURfTk9XKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04gfHwgXAorICAgIFNCX0hBUyhUSU1FX1RIUkVBRF9OT1cpCiAvLyBJT1MgZG9lc24ndCBzdXBwb3J0IFRocmVhZFRpY2tzOjpOb3coKS4KLSNpZiBkZWZpbmVkKE9TX0lPUykgfHwgU0JfSEFTKFRJTUVfVEhSRUFEX05PVykKKyNpZiBkZWZpbmVkKE9TX0lPUykKICNkZWZpbmUgTUFZQkVfTm93T3ZlcnJpZGUgRElTQUJMRURfTm93T3ZlcnJpZGUKICNlbHNlCiAjZGVmaW5lIE1BWUJFX05vd092ZXJyaWRlIE5vd092ZXJyaWRlCiAjZW5kaWYKIFRFU1QoVGhyZWFkVGlja3MsIE1BWUJFX05vd092ZXJyaWRlKSB7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorICBpZiAoIVNiVGltZUlzVGltZVRocmVhZE5vd1N1cHBvcnRlZCgpKSB7CisgICAgU0JfTE9HKElORk8pIDw8ICJUaW1lIHRocmVhZCBub3cgbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkLiI7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKwogICBUaHJlYWRUaWNrc092ZXJyaWRlOjpub3dfdGlja3NfID0gVGhyZWFkVGlja3M6Ok1pbigpOwogCiAgIC8vIE92ZXJyaWRlIGlzIG5vdCBhY3RpdmUuIEFsbCBOb3coKSBtZXRob2RzIHNob3VsZCByZXR1cm4gYSBzZW5zaWJsZSB2YWx1ZS4KQEAgLTEwNDMsNyArMTA1MSw4IEBACiAgIEVYUEVDVF9MRShpbml0aWFsX3RocmVhZF90aWNrcywgc3VidGxlOjpUaHJlYWRUaWNrc05vd0lnbm9yaW5nT3ZlcnJpZGUoKSk7CiAgIEVYUEVDVF9HVChUaHJlYWRUaWNrczo6TWF4KCksIHN1YnRsZTo6VGhyZWFkVGlja3NOb3dJZ25vcmluZ092ZXJyaWRlKCkpOwogfQotI2VuZGlmICAvLyBTQl9IQVMoVElNRV9USFJFQURfTk9XKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OIHx8CisgICAgICAgIC8vIFNCX0hBUyhUSU1FX1RIUkVBRF9OT1cpCiAKIFRFU1QoVGhyZWFkVGlja3MsIFRocmVhZE5vdykgewogICBpZiAoVGhyZWFkVGlja3M6OklzU3VwcG9ydGVkKCkpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvQ0hBTkdFTE9HLm1kIGIvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKaW5kZXggMDZmZTljNy4uY2NlN2IwZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKKysrIGIvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKQEAgLTYsMTYgKzYsMjggQEAKIAogIC0gKipEZXZUb29scyBhbmQgV2ViRHJpdmVyIGxpc3RlbiB0byBBTlkgaW50ZXJmYWNlLCBleGNlcHQgb24gTGludXguKioKIAotICBEZXZUb29scyBhbmQgV2ViRHJpdmVyIHNlcnZlcnMgbGlzdGVuIHRvIGNvbm5lY3Rpb25zIG9uIGFueSBuZXR3b3JrIGludGVyZmFjZQotICBieSBkZWZhdWx0LCBleGNlcHQgb24gTGludXggd2hlcmUgdGhleSBsaXN0ZW4gb25seSB0byBsb29wYmFjayAobG9jYWxob3N0KSBieQotICBkZWZhdWx0LiBBIG5ldyAiLS1kZXZfc2VydmVyc19saXN0ZW5faXAiIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8KLSAgc3BlY2lmeSBhIGRpZmZlcmVudCBpbnRlcmZhY2UgZm9yIGJvdGggb2YgdGhlbSB0byBsaXN0ZW4gdG8uCisgICBEZXZUb29scyBhbmQgV2ViRHJpdmVyIHNlcnZlcnMgbGlzdGVuIHRvIGNvbm5lY3Rpb25zIG9uIGFueSBuZXR3b3JrIGludGVyZmFjZQorICAgYnkgZGVmYXVsdCwgZXhjZXB0IG9uIExpbnV4IHdoZXJlIHRoZXkgbGlzdGVuIG9ubHkgdG8gbG9vcGJhY2sgKGxvY2FsaG9zdCkgYnkKKyAgIGRlZmF1bHQuIEEgbmV3ICItLWRldl9zZXJ2ZXJzX2xpc3Rlbl9pcCIgY29tbWFuZCBsaW5lIHBhcmFtZXRlciBjYW4gYmUgdXNlZAorICAgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBpbnRlcmZhY2UgZm9yIGJvdGggb2YgdGhlbSB0byBsaXN0ZW4gdG8uCiAKICAtICoqRGV2VG9vbHMgc2hvd3MgYXN5bmNocm9ub3VzIHN0YWNrIHRyYWNlcy4qKgogCi0gIFdoZW4gc3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgd2l0aGluIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBhbiBhc3luY2hyb25vdXMKLSAgb3BlcmF0aW9uLCB0aGUgY2FsbCBzdGFjayBpbiBEZXZUb29scyBub3cgc2hvd3MgYm90aCB0aGUgY3VycmVudCBmdW5jdGlvbiBhcwotICB3ZWxsIGFzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3YXMgaW5pdGlhdGVkLgorICAgV2hlbiBzdG9wcGVkIGF0IGEgYnJlYWtwb2ludCB3aXRoaW4gdGhlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIGFuIGFzeW5jaHJvbm91cworICAgb3BlcmF0aW9uLCB0aGUgY2FsbCBzdGFjayBpbiBEZXZUb29scyBub3cgc2hvd3MgYm90aCB0aGUgY3VycmVudCBmdW5jdGlvbiBhcworICAgd2VsbCBhcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2FzIGluaXRpYXRlZC4KKworIC0gKipPcHRpbWl6ZWQgbmV0d29yayBidWZmZXIgbWFuYWdlbWVudCBhbmQgbm90aWZpY2F0aW9uIGhhbmRsaW5nLioqCisKKyAgIFJlZHVjZWQgdW5uZWNlc3NhcnkgYnVmZmVyIGNvcHlpbmcgZHVyaW5nIG5ldHdvcmsgZG93bmxvYWRpbmcgd2hpY2ggcmVzdWx0cworICAgaW4gdGhlIHJlZHVjdGlvbiBvZiBDUFUgdXNhZ2Ugb24gYm90aCB0aGUgTmV0d29ya01vZHVsZSB0aHJlYWQgYW5kIHRoZQorICAgTWFpbldlYk1vZHVsZSB0aHJlYWQuICBQZWFrIG1lbW9yeSB1c2FnZSBkdXJpbmcgZG93bmxvYWRpbmcgaXMgYWxzbyByZWR1Y2VkLgorICAgQWxzbyByZWR1Y2VkIHJlZHVuZGFudCBub3RpZmljYXRpb25zIGZyb20gdGhlIE5ldHdvcmtNb2R1bGUgdGhyZWFkIHRvIHRoZQorICAgTWFpbldlYk1vZHVsZSB0aHJlYWQgb24gZG93bmxvYWRpbmcgcHJvZ3Jlc3Nlcy4KKyAgIENQVSB1dGlsaXphdGlvbiBvZiBib3RoIHRocmVhZHMgaXMgcmVkdWNlZCBieSBtb3JlIHRoYW4gMTAlIHdpdGggdGhlIGFib3ZlCisgICBvcHRpbWl6YXRpb25zIG9uIHNvbWUgbGVzcyBwb3dlcmZ1bCBwbGF0Zm9ybXMgZHVyaW5nIGhpZ2ggYml0cmF0ZSBjb250ZW50CisgICBwbGF5YmFjay4gIFRoZSBsb3dlciBDUFUgdXRpbGl6YXRpb24gb2YgdGhlIE1haW5XZWJNb2R1bGUgdGhyZWFkIGFsbG93cyBpdCB0bworICAgcHJvY2VzcyBvdGhlciB0YXNrcyAobGlrZSBKYXZhc2NyaXB0IGV4ZWN1dGlvbikgbW9yZSByZXNwb25zaXZlbHkuCiAKICMjIFZlcnNpb24gMjAKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb190ZXN0Lmd5cCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fdGVzdC5neXAKaW5kZXggYzM1NGE4NS4uYzRlMzk3OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb190ZXN0Lmd5cAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX3Rlc3QuZ3lwCkBAIC0yNiw3ICsyNiw2IEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWEvbWVkaWEuZ3lwOm1lZGlhJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKIApAQCAtMzQsNiArMzMsNyBAQAogICAgICAgICAjICAgICAgIFNjcmlwdFZhbHVlRmFjdG9yeSBoYXMgbm9uLXZpcnR1YWwgbWV0aG9kIENyZWF0ZVByb21pc2UoKS4KICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zY3JpcHQvZW5naW5lLmd5cDplbmdpbmUnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwIGIvc3JjL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwCmluZGV4IGEzNGM1OWYuLmY4NDlmZjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9iYXNlLmd5cAorKysgYi9zcmMvY29iYWx0L2Jhc2UvYmFzZS5neXAKQEAgLTExMSwxMCArMTExLDEwIEBACiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJ2Jhc2UnLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdiYXNlX3Rlc3RfZGVwbG95JywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy90ZXN0aW5nLmd5cCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy90ZXN0aW5nLmd5cAppbmRleCBjZmE2YzNkLi4yODk4ZjA3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGVzdGluZy5neXAKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Rlc3RpbmcuZ3lwCkBAIC0xODcsMTIgKzE4NywxMiBAQAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3NjcmlwdC9lbmdpbmUuZ3lwOmVuZ2luZScsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdiaW5kaW5ncycsCiAgICAgICAgICdiaW5kaW5nc190ZXN0X2ltcGxlbWVudGF0aW9uJywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKIAogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL1JFQURNRS5tZCBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL1JFQURNRS5tZAppbmRleCBkODMwOTA2Li42YTY5NmVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9SRUFETUUubWQKKysrIGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvUkVBRE1FLm1kCkBAIC04NCw2ICs4NCw2IEBACiAgIDEuIEFkZCBhIHB5dGhvbiB0ZXN0IHNjcmlwdCBpbiB0ZXN0cy8uCiAgIDIuIEFkZCB0YXJnZXQgd2ViIHBhZ2UocykgYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzKGlmIGFueSkgdG8gdGVzdGRhdGEvLgogICAzLiBBZGQgdGhlIHRlc3QgbmFtZShuYW1lIG9mIHRoZSBweXRob24gdGVzdCBzY3JpcHQpIHRvIGJsYWNrX2JveF90ZXN0cy5weQotICAgICB0byBhdXRvbWF0ZSBuZXcgdGVzdC4gQWRkIHRoZSBuYW1lIHRvIGVpdGhlciB0aGUgbGlzdCBvZiB0ZXN0cyByZXF1aXJpbmcKKyAgICAgdG8gYXV0b21hdGUgbmV3IHRlc3QuIEFkZCB0aGUgbmFtZSB0byB0aGUgbGlzdCBvZiB0ZXN0cyByZXF1aXJpbmcKICAgICAgYXBwIGxhdW5jaGVyIHN1cHBvcnQgZm9yIHN5c3RlbSBzaWduYWxzKGUuZy4gc3VzcGVuZC9yZXN1bWUpLCBvciB0aGUgbGlzdAotICAgICBvZiB0ZXN0cyB0aGF0IGRvbid0LgorICAgICBvZiB0ZXN0cyByZXF1aXJpbmcgZGVlcCBsaW5rIHN1cHBvcnQsIG9yIHRoZSBsaXN0IG9mIHRlc3RzIHRoYXQgZG9uJ3QuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9ibGFja19ib3hfdGVzdHMucHkgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9ibGFja19ib3hfdGVzdHMucHkKaW5kZXggYzIwOWY5MS4uYmZjOGNlNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvYmxhY2tfYm94X3Rlc3RzLnB5CisrKyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL2JsYWNrX2JveF90ZXN0cy5weQpAQCAtMTIsNyArMTIsNiBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0KIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCkBAIC01NCw2ICs1MywxMSBAQAogICAgICd3ZWJfZGVidWdnZXInLAogICAgICd3ZWJfcGxhdGZvcm1fdGVzdHMnLAogXQorIyBUaGVzZSB0ZXN0cyBjYW4gb25seSBiZSBydW4gb24gcGxhdGZvcm1zIHdob3NlIGFwcCBsYXVuY2hlciBjYW4gc2VuZCBkZWVwCisjIGxpbmtzLgorX1RFU1RTX05FRURJTkdfREVFUF9MSU5LID0gWworICAgICdmaXJlX2RlZXBfbGlua19iZWZvcmVfbG9hZCcsCitdCiAjIExvY2F0aW9uIG9mIHRlc3QgZmlsZXMuCiBfVEVTVF9ESVJfUEFUSCA9ICdjb2JhbHQuYmxhY2tfYm94X3Rlc3RzLnRlc3RzLicKICMgUGxhdGZvcm0gZGVwZW5kZW50IGRldmljZSBwYXJhbWV0ZXJzLgpAQCAtMTA4LDEwICsxMTIsMTMgQEAKICAgICAgIG91dHB1dF9maWxlPU5vbmUsCiAgICAgICBvdXRfZGlyZWN0b3J5PW91dF9kaXJlY3RvcnkpCiAKKyAgdGVzdF90YXJnZXRzID0gX1RFU1RTX05PX1NJR05BTAorCiAgIGlmIGxhdW5jaGVyLlN1cHBvcnRzU3VzcGVuZFJlc3VtZSgpOgotICAgIHRlc3RfdGFyZ2V0cyA9IF9URVNUU19ORUVESU5HX1NZU1RFTV9TSUdOQUwgKyBfVEVTVFNfTk9fU0lHTkFMCi0gIGVsc2U6Ci0gICAgdGVzdF90YXJnZXRzID0gX1RFU1RTX05PX1NJR05BTAorICAgIHRlc3RfdGFyZ2V0cyArPSBfVEVTVFNfTkVFRElOR19TWVNURU1fU0lHTkFMCisKKyAgaWYgbGF1bmNoZXIuU3VwcG9ydHNEZWVwTGluaygpOgorICAgIHRlc3RfdGFyZ2V0cyArPSBfVEVTVFNfTkVFRElOR19ERUVQX0xJTksKIAogICB0ZXN0X3N1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKICAgZm9yIHRlc3QgaW4gdGVzdF90YXJnZXRzOgpAQCAtMTIzLDggKzEzMCwxMiBAQAogY2xhc3MgQmxhY2tCb3hUZXN0cyhvYmplY3QpOgogICAiIiJIZWxwZXIgY2xhc3MgdG8gcnVuIGFsbCBibGFjayBib3ggdGVzdHMgYW5kIHJldHVybiByZXN1bHRzLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYmluZGluZ19hZGRyZXNzLCBwcm94eV9hZGRyZXNzPU5vbmUsCi0gICAgICAgICAgICAgICBwcm94eV9wb3J0PU5vbmUsIHRlc3RfbmFtZT1Ob25lLCB3cHRfaHR0cF9wb3J0PU5vbmUpOgorICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgIHNlcnZlcl9iaW5kaW5nX2FkZHJlc3MsCisgICAgICAgICAgICAgICBwcm94eV9hZGRyZXNzPU5vbmUsCisgICAgICAgICAgICAgICBwcm94eV9wb3J0PU5vbmUsCisgICAgICAgICAgICAgICB0ZXN0X25hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgIHdwdF9odHRwX3BvcnQ9Tm9uZSk6CiAgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLkRFQlVHKQogCiAgICAgIyBTZXR1cCBnbG9iYWwgdmFyaWFibGVzIHVzZWQgYnkgdGVzdCBjYXNlcwpAQCAtMTU5LDIyICsxNzAsMjEgQEAKICAgICAjIFRlc3QgZG9tYWlucyB1c2VkIGluIHdlYiBwbGF0Zm9ybSB0ZXN0cyB0byBiZSByZXNvbHZlZCB0byB0aGUgc2VydmVyCiAgICAgIyBiaW5kaW5nIGFkZHJlc3MuCiAgICAgaG9zdHMgPSBbCi0gICAgICAgICd3ZWItcGxhdGZvcm0udGVzdCcsCi0gICAgICAgICd3d3cud2ViLXBsYXRmb3JtLnRlc3QnLAotICAgICAgICAnd3d3MS53ZWItcGxhdGZvcm0udGVzdCcsCi0gICAgICAgICd3d3cyLndlYi1wbGF0Zm9ybS50ZXN0JywKLSAgICAgICAgJ3huLS1uOGo2ZHM1M2x3d2tycWh2MjhhLndlYi1wbGF0Zm9ybS50ZXN0JywKKyAgICAgICAgJ3dlYi1wbGF0Zm9ybS50ZXN0JywgJ3d3dy53ZWItcGxhdGZvcm0udGVzdCcsICd3d3cxLndlYi1wbGF0Zm9ybS50ZXN0JywKKyAgICAgICAgJ3d3dzIud2ViLXBsYXRmb3JtLnRlc3QnLCAneG4tLW44ajZkczUzbHd3a3JxaHYyOGEud2ViLXBsYXRmb3JtLnRlc3QnLAogICAgICAgICAneG4tLWx2ZS02bGFkLndlYi1wbGF0Zm9ybS50ZXN0JwogICAgIF0KLSAgICBzZWxmLmhvc3RfcmVzb2x2ZV9tYXAgPSBkaWN0KFsoaG9zdCwgc2VydmVyX2JpbmRpbmdfYWRkcmVzcykgZm9yIGhvc3QgaW4gaG9zdHNdKQorICAgIHNlbGYuaG9zdF9yZXNvbHZlX21hcCA9IGRpY3QoWworICAgICAgICAoaG9zdCwgc2VydmVyX2JpbmRpbmdfYWRkcmVzcykgZm9yIGhvc3QgaW4gaG9zdHMKKyAgICBdKQogCiAgIGRlZiBSdW4oc2VsZik6CiAgICAgaWYgc2VsZi5wcm94eV9wb3J0ID09ICctMSc6CiAgICAgICByZXR1cm4gMQogICAgIGxvZ2dpbmcuaW5mbygnVXNpbmcgcHJveHkgcG9ydDogJXMnLCBzZWxmLnByb3h5X3BvcnQpCiAKLSAgICB3aXRoIFByb3h5U2VydmVyKHBvcnQ9c2VsZi5wcm94eV9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgaG9zdF9yZXNvbHZlX21hcD1zZWxmLmhvc3RfcmVzb2x2ZV9tYXApOgorICAgIHdpdGggUHJveHlTZXJ2ZXIoCisgICAgICAgIHBvcnQ9c2VsZi5wcm94eV9wb3J0LCBob3N0X3Jlc29sdmVfbWFwPXNlbGYuaG9zdF9yZXNvbHZlX21hcCk6CiAgICAgICBpZiBzZWxmLnRlc3RfbmFtZToKICAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbU1vZHVsZSgKICAgICAgICAgICAgIGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKF9URVNUX0RJUl9QQVRIICsgc2VsZi50ZXN0X25hbWUpKQpAQCAtMTk5LDcgKzIwOSw4IEBACiAgICAgICBzb2Nrcy5hcHBlbmQoKGFkZHJlc3MsIHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkpKQogICAgIHRyeToKICAgICAgIGZvciBfIGluIHJhbmdlKF9QT1JUX1NFTEVDVElPTl9SRVRSWV9MSU1JVCk6Ci0gICAgICAgIHBvcnQgPSByYW5kb20ucmFuZGludChfUE9SVF9TRUxFQ1RJT05fUkFOR0VbMF0sIF9QT1JUX1NFTEVDVElPTl9SQU5HRVsxXSkKKyAgICAgICAgcG9ydCA9IHJhbmRvbS5yYW5kaW50KF9QT1JUX1NFTEVDVElPTl9SQU5HRVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QT1JUX1NFTEVDVElPTl9SQU5HRVsxXSkKICAgICAgICAgdW51c2VkID0gVHJ1ZQogICAgICAgICBmb3Igc29jayBpbiBzb2NrczoKICAgICAgICAgICByZXN1bHQgPSBzb2NrWzFdLmNvbm5lY3RfZXgoKHNvY2tbMF0sIHBvcnQpKQpAQCAtMjA4LDkgKzIxOSw4IEBACiAgICAgICAgICAgICBicmVhawogICAgICAgICBpZiB1bnVzZWQ6CiAgICAgICAgICAgcmV0dXJuIHBvcnQKLSAgICAgIGxvZ2dpbmcuZXJyb3IoCi0gICAgICAgICAgJ0NhbiBub3QgZmluZCB1bnVzZWQgcG9ydCBvbiBhZGRyZXNzZXMgd2l0aGluICVzIGF0dGVtcHRzLicgJQotICAgICAgICAgIF9QT1JUX1NFTEVDVElPTl9SRVRSWV9MSU1JVCkKKyAgICAgIGxvZ2dpbmcuZXJyb3IoJ0NhbiBub3QgZmluZCB1bnVzZWQgcG9ydCBvbiBhZGRyZXNzZXMgd2l0aGluICVzIGF0dGVtcHRzLicsCisgICAgICAgICAgICAgICAgICAgIF9QT1JUX1NFTEVDVElPTl9SRVRSWV9MSU1JVCkKICAgICAgIHJldHVybiAtMQogICAgIGZpbmFsbHk6CiAgICAgICBmb3Igc29jayBpbiBzb2NrczoKQEAgLTIxOSwyOCArMjI5LDMzIEBACiAKIGRlZiBtYWluKCk6CiAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZXJ2ZXJfYmluZGluZ19hZGRyZXNzJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PScxMjcuMC4wLjEnLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0JpbmRpbmcgYWRkcmVzcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdGVzdCBzZXJ2ZXIuJykKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcm94eV9hZGRyZXNzJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0oJ0FkZHJlc3MgdG8gdGhlIHByb3h5IHNlcnZlciB0aGF0IGFsbCBibGFjayBib3gnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzIGFyZSBydW4gdGhyb3VnaC4gSWYgbm90IHNwZWNpZmllZCwgdGhlJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXJ2ZXIgYmluZGluZyBhZGRyZXNzIGlzIHVzZWQuJykpCi0gIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJveHlfcG9ydCcsCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9KCdQb3J0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm94eSBzZXJ2ZXIgdGhhdCBhbGwnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JsYWNrIGJveCB0ZXN0cyBhcmUgcnVuIHRocm91Z2guIElmIG5vdCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkLCBhIHJhbmRvbSBmcmVlIHBvcnQgaXMgdXNlZC4nKSkKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS10ZXN0X25hbWUnLAotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnTmFtZSBvZiB0ZXN0IHRvIGJlIHJ1bi4gSWYgbm90IHNwZWNpZmllZCwgYWxsICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdHMgYXJlIHJ1bi4nKSkKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS13cHRfaHR0cF9wb3J0JywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9KCdQb3J0IHVzZWQgdG8gY3JlYXRlIHRoZSB3ZWIgcGxhdGZvcm0gdGVzdCBodHRwJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyLiBJZiBub3Qgc3BlY2lmaWVkLCBhIHJhbmRvbSBmcmVlIHBvcnQgaXMnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VkLicpKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tc2VydmVyX2JpbmRpbmdfYWRkcmVzcycsCisgICAgICBkZWZhdWx0PScxMjcuMC4wLjEnLAorICAgICAgaGVscD0nQmluZGluZyBhZGRyZXNzIHVzZWQgdG8gY3JlYXRlIHRoZSB0ZXN0IHNlcnZlci4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tcHJveHlfYWRkcmVzcycsCisgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICBoZWxwPSgnQWRkcmVzcyB0byB0aGUgcHJveHkgc2VydmVyIHRoYXQgYWxsIGJsYWNrIGJveCcKKyAgICAgICAgICAgICd0ZXN0cyBhcmUgcnVuIHRocm91Z2guIElmIG5vdCBzcGVjaWZpZWQsIHRoZScKKyAgICAgICAgICAgICdzZXJ2ZXIgYmluZGluZyBhZGRyZXNzIGlzIHVzZWQuJykpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS1wcm94eV9wb3J0JywKKyAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgIGhlbHA9KCdQb3J0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm94eSBzZXJ2ZXIgdGhhdCBhbGwnCisgICAgICAgICAgICAnYmxhY2sgYm94IHRlc3RzIGFyZSBydW4gdGhyb3VnaC4gSWYgbm90JworICAgICAgICAgICAgJ3NwZWNpZmllZCwgYSByYW5kb20gZnJlZSBwb3J0IGlzIHVzZWQuJykpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS10ZXN0X25hbWUnLAorICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgaGVscD0oJ05hbWUgb2YgdGVzdCB0byBiZSBydW4uIElmIG5vdCBzcGVjaWZpZWQsIGFsbCAnCisgICAgICAgICAgICAndGVzdHMgYXJlIHJ1bi4nKSkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLXdwdF9odHRwX3BvcnQnLAorICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgaGVscD0oJ1BvcnQgdXNlZCB0byBjcmVhdGUgdGhlIHdlYiBwbGF0Zm9ybSB0ZXN0IGh0dHAnCisgICAgICAgICAgICAnc2VydmVyLiBJZiBub3Qgc3BlY2lmaWVkLCBhIHJhbmRvbSBmcmVlIHBvcnQgaXMnCisgICAgICAgICAgICAndXNlZC4nKSkKICAgYXJncywgXyA9IHBhcnNlci5wYXJzZV9rbm93bl9hcmdzKCkKIAogICB0ZXN0X29iamVjdCA9IEJsYWNrQm94VGVzdHMoYXJncy5zZXJ2ZXJfYmluZGluZ19hZGRyZXNzLCBhcmdzLnByb3h5X2FkZHJlc3MsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9wcm94eV9zZXJ2ZXIucHkgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9wcm94eV9zZXJ2ZXIucHkKaW5kZXggZWUyOWEzOS4uZGY2YzAzYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvcHJveHlfc2VydmVyLnB5CisrKyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Byb3h5X3NlcnZlci5weQpAQCAtMzIsNyArMzIsNyBAQAogCiBjbGFzcyBQcm94eVNlcnZlcihvYmplY3QpOgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0bmFtZT0nMC4wLjAuMCcsIHBvcnQ9JzgwMDAnLCBob3N0X3Jlc29sdmVfbWFwPU5vbmUpOgorICBkZWYgX19pbml0X18oc2VsZiwgaG9zdG5hbWU9JzEyNy4wLjAuMScsIHBvcnQ9JzgwMDAnLCBob3N0X3Jlc29sdmVfbWFwPU5vbmUpOgogICAgIHNlbGYuY29tbWFuZCA9IFsKICAgICAgICAgJ3B5dGhvbicsCiAgICAgICAgIG9zLnBhdGguam9pbihTUkNfRElSLCAndGhpcmRfcGFydHknLCAncHJveHlfcHknLCAncHJveHkucHknKSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL2ZpcmVfZGVlcF9saW5rX2JlZm9yZV9sb2FkLmh0bWwgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9maXJlX2RlZXBfbGlua19iZWZvcmVfbG9hZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTg2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9maXJlX2RlZXBfbGlua19iZWZvcmVfbG9hZC5odG1sCkBAIC0wLDAgKzEsNyBAQAorPEhUTUw+CisgIDxIRUFEPjwvSEVBRD4KKyAgPEJPRFk+CisgICAgPHNjcmlwdCBzcmM9J2JsYWNrX2JveF9qc190ZXN0X3V0aWxzLmpzJz48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0nZmlyZV9kZWVwX2xpbmtfYmVmb3JlX2xvYWQuanMnPjwvc2NyaXB0PgorICA8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9maXJlX2RlZXBfbGlua19iZWZvcmVfbG9hZC5qcyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL2ZpcmVfZGVlcF9saW5rX2JlZm9yZV9sb2FkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMjEyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9maXJlX2RlZXBfbGlua19iZWZvcmVfbG9hZC5qcwpAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEZhaWwgaWYgdGhlIGRlZXAgbGluayBpcyBub3QgcmVjZWl2ZWQgd2l0aGluIDE1IHNlY29uZHMuCit2YXIga1RpbWVvdXQgPSAxNSAqIDEwMDA7Cit2YXIgZmFpbFRpbWVyID0gc2V0VGltZW91dChmYWlsLCBrVGltZW91dCk7CisKK2Z1bmN0aW9uIGZhaWwoKSB7CisgICAgY29uc29sZS5sb2coIkZhaWxpbmcgZHVlIHRvIHRpbWVvdXQhIik7CisgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Cit9CisKKy8vIFRoZSB0ZXN0IHNlbmRzICJsaW5rIDEiLCAibGluayAyIiwgImxpbmsgMyIgYmVmb3JlIGxvYWQgJiBzbyBvbmx5ICJsaW5rIDMiCisvLyBzaG91bGQgYmUgaGFuZGxlZC4KK2Z1bmN0aW9uIGxpc3RlbmVyKGxpbmspIHsKKyAgICBjb25zb2xlLmxvZygiUmVjZWl2ZWQgbGluazogIiArIGxpbmsudG9TdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWwoImxpbmsgMyIsIGxpbmspOworICAgIGNvbnNvbGUubG9nKCJFbmRpbmcgdGVzdCIpOworICAgIG9uRW5kVGVzdCgpOworICAgIGNsZWFyVGltZW91dChmYWlsVGltZXIpOworfQorCitoNXZjYy5ydW50aW1lLm9uRGVlcExpbmsuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworY29uc29sZS5sb2coIkxpc3RlbmVyIGFkZGVkIik7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvZmlyZV9kZWVwX2xpbmtfYmVmb3JlX2xvYWQucHkgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9maXJlX2RlZXBfbGlua19iZWZvcmVfbG9hZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNkYWJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvZmlyZV9kZWVwX2xpbmtfYmVmb3JlX2xvYWQucHkKQEAgLTAsMCArMSwxMTkgQEAKKyMgQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiVGVzdHMgc2VuZGluZyBkZWVwIGxpbmtzIGJlZm9yZSBsb2FkLiIiIgorCisjIFRoaXMgdGVzdCBzY3JpcHQgd29ya3MgYnkgc3BsaXR0aW5nIHRoZSB3b3JrIG92ZXIgMyB0aHJlYWRzLCBzbyB0aGF0IHRoZXkKKyMgY2FuIGVhY2ggbWFrZSBwcm9ncmVzcyBldmVuIGlmIHRoZXkgY29tZSBhY3Jvc3MgYmxvY2tpbmcgb3BlcmF0aW9ucy4KKyMgVGhlIHRocmVlIHRocmVhZHMgYXJlOgorIyAgIDEuIE1haW4gdGhyZWFkLCBydW5zIEJsYWNrQm94VGVzdENhc2UsIHNlbmRzIHN1c3BlbmQvcmVzdW1lIHNpZ25hbHMsIGV0Yy4KKyMgICAyLiBIVFRQIFNlcnZlciwgcmVzcG9uc2libGUgZm9yIHNsb3dseSByZXNwb25kaW5nIHRvIGEgZmV0Y2ggb2YgYSBqYXZhc2NyaXB0CisjICAgICAgZmlsZS4KKyMgICAzLiBXZWJkcml2ZXIgdGhyZWFkLCBpbnN0cnVjdHMgQ29iYWx0IHRvIG5hdmlnYXRlIHRvIGEgVVJMCisjCisjIFN0ZXBzIGluIH4gY2hyb25vbG9naWNhbCBvcmRlcjoKKyMgICAxLiBDcmVhdGUgYSBUQ1Agc29ja2V0IGFuZCBsaXN0ZW4gb24gYWxsIGludGVyZmFjZXMuCisjICAgMi4gU3RhcnQgQ29iYWx0LCBhbmQgcG9pbnQgaXQgdG8gdGhlIHNvY2tldCBjcmVhdGVkIGluIFN0ZXAgMS4KKyMgICAzLiBTZW5kIDMgZGVlcCBsaW5rcy4KKyMgICA0LiBMb2FkICYgcnVuIHRoZSBqYXZhc2NyaXB0IHJlc291cmNlLgorIyAgIDUuIENoZWNrIHRvIHNlZSBpZiBKU1Rlc3RzU3VjY2VlZGVkKCkuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBfZW52ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LGctYmFkLWltcG9ydC1vcmRlcgorCitpbXBvcnQgb3MKK2ltcG9ydCBTaW1wbGVIVFRQU2VydmVyCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgdXJscGFyc2UKKworZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzIGltcG9ydCBibGFja19ib3hfdGVzdHMKK2Zyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cy50aHJlYWRlZF93ZWJfc2VydmVyIGltcG9ydCBNYWtlUmVxdWVzdEhhbmRsZXJDbGFzcworZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzLnRocmVhZGVkX3dlYl9zZXJ2ZXIgaW1wb3J0IFRocmVhZGVkV2ViU2VydmVyCisKK19GSVJFX0RFRVBfTElOS19CRUZPUkVfTE9BRF9IVE1MID0gJ2ZpcmVfZGVlcF9saW5rX2JlZm9yZV9sb2FkLmh0bWwnCitfRklSRV9ERUVQX0xJTktfQkVGT1JFX0xPQURfSlMgPSAnZmlyZV9kZWVwX2xpbmtfYmVmb3JlX2xvYWQuanMnCitfTUFYX0FMTE9UVEVEX1RJTUVfU0VDT05EUyA9IDYwCisKK19saW5rc19maXJlZCA9IHRocmVhZGluZy5FdmVudCgpCisKKyMgVGhlIGJhc2UgcGF0aCBvZiB0aGUgcmVxdWVzdGVkIGFzc2V0cyBpcyB0aGUgcGFyZW50IGRpcmVjdG9yeS4KK19TRVJWRVJfUk9PVF9QQVRIID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIG9zLnBhcmRpcikKKworCitjbGFzcyBKYXZhc2NyaXB0UmVxdWVzdERldGVjdG9yKE1ha2VSZXF1ZXN0SGFuZGxlckNsYXNzKF9TRVJWRVJfUk9PVF9QQVRIKSk6CisgICIiIlByb3hpZXMgZXZlcnl0aGluZyB0byBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIsIGV4Y2VwdCBzb21lIHBhdGhzLiIiIgorCisgIGRlZiBkb19HRVQoc2VsZik6ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyAgICAiIiJIYW5kbGVzIEhUVFAgR0VUIHJlcXVlc3RzIGZvciByZXNvdXJjZXMuIiIiCisKKyAgICBwYXJzZWRfcGF0aCA9IHVybHBhcnNlLnVybHBhcnNlKHNlbGYucGF0aCkKKyAgICBpZiBwYXJzZWRfcGF0aC5wYXRoID09ICcvdGVzdGRhdGEvJyArIF9GSVJFX0RFRVBfTElOS19CRUZPUkVfTE9BRF9KUzoKKyAgICAgICMgSXQgaXMgaW1wb3J0YW50IG5vdCB0byBzZW5kIGFueSByZXNwb25zZSBiYWNrLCBzbyB3ZSBibG9jay4KKyAgICAgIHByaW50KCdXYWl0aW5nIG9uIGxpbmtzIHRvIGJlIGZpcmVkLicpCisgICAgICBfbGlua3NfZmlyZWQud2FpdCgpCisgICAgICBwcmludCgnTGlua3MgaGF2ZSBiZWVuIGZpcmVkLiBHZXR0aW5nIEpTLicpCisKKyAgICByZXR1cm4gU2ltcGxlSFRUUFNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIuZG9fR0VUKHNlbGYpCisKKworY2xhc3MgRmlyZURlZXBMaW5rQmVmb3JlTG9hZChibGFja19ib3hfdGVzdHMuQmxhY2tCb3hUZXN0Q2FzZSk6CisgICIiIlRlc3RzIGZpcmluZyBkZWVwIGxpbmtzIGJlZm9yZSB3ZWIgbW9kdWxlIGlzIGxvYWRlZC4iIiIKKworICBkZWYgX0xvYWRQYWdlKHNlbGYsIHdlYmRyaXZlciwgdXJsKToKKyAgICAiIiJJbnN0cnVjdHMgd2ViZHJpdmVyIHRvIG5hdmlnYXRlIHRvIHVybC4iIiIKKyAgICB0cnk6CisgICAgICAjIE5vdGU6IFRoZSBmb2xsb3dpbmcgaXMgYSBibG9ja2luZyByZXF1ZXN0LCBhbmQgcmV0dXJucyBvbmx5IHdoZW4gdGhlCisgICAgICAjIHBhZ2UgaGFzIGZ1bGx5IGxvYWRlZC4gIEluIHRoaXMgdGVzdCwgdGhlIHBhZ2Ugd2lsbCBub3QgZnVsbHkgbG9hZAorICAgICAgIyBzbywgdGhpcyBkb2VzIG5vdCByZXR1cm4gdW50aWwgQ29iYWx0IGV4aXRzLgorICAgICAgd2ViZHJpdmVyLmdldCh1cmwpCisgICAgZXhjZXB0OiAgIyBweWxpbnQ6IGRpc2FibGU9YmFyZS1leGNlcHQKKyAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorCisgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKworICAgICMgU3RlcCAyLiBTdGFydCBDb2JhbHQsIGFuZCBwb2ludCBpdCB0byB0aGUgc29ja2V0IGNyZWF0ZWQgaW4gU3RlcCAxLgorICAgIHRyeToKKyAgICAgIHdpdGggVGhyZWFkZWRXZWJTZXJ2ZXIoSmF2YXNjcmlwdFJlcXVlc3REZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5HZXRCaW5kaW5nQWRkcmVzcygpKSBhcyBzZXJ2ZXI6CisgICAgICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIodXJsPSdhYm91dDpibGFuaycpIGFzIHJ1bm5lcjoKKyAgICAgICAgICB0YXJnZXRfdXJsID0gc2VydmVyLkdldFVSTChmaWxlX25hbWU9Jy4uL3Rlc3RkYXRhLycgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9GSVJFX0RFRVBfTElOS19CRUZPUkVfTE9BRF9IVE1MKQorICAgICAgICAgIGNvYmFsdF9sYXVuY2hlcl90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgICB0YXJnZXQ9RmlyZURlZXBMaW5rQmVmb3JlTG9hZC5fTG9hZFBhZ2UsCisgICAgICAgICAgICAgIGFyZ3M9KHNlbGYsIHJ1bm5lci53ZWJkcml2ZXIsIHRhcmdldF91cmwpKQorICAgICAgICAgIGNvYmFsdF9sYXVuY2hlcl90aHJlYWQuc3RhcnQoKQorCisgICAgICAgICAgIyBTdGVwIDMuIFNlbmQgMyBkZWVwIGxpbmtzCisgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgNCk6CisgICAgICAgICAgICBsaW5rID0gJ2xpbmsgJyArIHN0cihpKQorICAgICAgICAgICAgcHJpbnQoJ1NlbmRpbmcgbGluayA6ICcgKyBsaW5rKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5TZW5kRGVlcExpbmsobGluaykgPT0gMCkKKyAgICAgICAgICBwcmludCgnTGlua3MgZmlyZWQuJykKKyAgICAgICAgICAjIFN0ZXAgNC4gTG9hZCAmIHJ1biB0aGUgamF2YXNjcmlwdCByZXNvdXJjZS4KKyAgICAgICAgICBfbGlua3NfZmlyZWQuc2V0KCkKKworICAgICAgICAgICMgU3RlcCA1LiBDaGVjayB0byBzZWUgaWYgSlNUZXN0c1N1Y2NlZWRlZCgpLgorICAgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgY2FsbCB3aWxsIGNoZWNrIHRoZSBET00gbXVsdGlwbGUgdGltZXMgZm9yIGEgcGVyaW9kCisgICAgICAgICAgIyBvZiB0aW1lIChjdXJyZW50IGRlZmF1bHQgaXMgMzAgc2Vjb25kcykuCisgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCisgICAgZXhjZXB0OiAgIyBweWxpbnQ6IGRpc2FibGU9YmFyZS1leGNlcHQKKyAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgIyBDb25zaWRlciBhbiBleGNlcHRpb24gYmVpbmcgdGhyb3duIGFzIGEgdGVzdCBmYWlsdXJlLgorICAgICAgc2VsZi5hc3NlcnRUcnVlKEZhbHNlKQorICAgIGZpbmFsbHk6CisgICAgICBwcmludCgnQ2xlYW5pbmcgdXAuJykKKyAgICAgIF9saW5rc19maXJlZC5zZXQoKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCmluZGV4IDliNzY5NzUuLjI2ODRjYjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MKQEAgLTY3OCwxMiArNjc4LDE4IEBACiAgIG9wdGlvbnMud2ViX21vZHVsZV9vcHRpb25zLmNzcF9lbmZvcmNlbWVudF9tb2RlID0gZG9tOjprQ3NwRW5mb3JjZW1lbnRFbmFibGU7CiAKICAgb3B0aW9ucy5yZXF1ZXN0ZWRfdmlld3BvcnRfc2l6ZSA9IHJlcXVlc3RlZF92aWV3cG9ydF9zaXplOworICBvcHRpb25zLndlYl9tb2R1bGVfbG9hZGVkX2NhbGxiYWNrID0KKyAgICAgIGJhc2U6OkJpbmQoJkFwcGxpY2F0aW9uOjpEaXNwYXRjaEVhcmx5RGVlcExpbmssIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwogICBhY2NvdW50X21hbmFnZXJfLnJlc2V0KG5ldyBhY2NvdW50OjpBY2NvdW50TWFuYWdlcigpKTsKICAgYnJvd3Nlcl9tb2R1bGVfLnJlc2V0KAogICAgICAgbmV3IEJyb3dzZXJNb2R1bGUoaW5pdGlhbF91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvdWxkX3ByZWxvYWQgPyBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVByZWxvYWRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRfZGlzcGF0Y2hlcl8sIGFjY291bnRfbWFuYWdlcl8uZ2V0KCksIG9wdGlvbnMpKTsKKyNpZiBTQl9JUyhFVkVSR1JFRU4pCisgIHVwZGF0ZXJfbW9kdWxlXy5yZXNldChuZXcgdXBkYXRlcjo6VXBkYXRlck1vZHVsZSgKKyAgICAgIG1lc3NhZ2VfbG9vcF8sIGJyb3dzZXJfbW9kdWxlXy0+R2V0TmV0d29ya01vZHVsZSgpKSk7CisjZW5kaWYKICAgVXBkYXRlVXNlckFnZW50KCk7CiAKICAgYXBwX3N0YXR1c18gPSAoc2hvdWxkX3ByZWxvYWQgPyBrUHJlbG9hZGluZ0FwcFN0YXR1cyA6IGtSdW5uaW5nQXBwU3RhdHVzKTsKQEAgLTc4NSw2ICs3OTEsMTEgQEAKICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhkdXJhdGlvbl9pbl9zZWNvbmRzKSk7CiAgIH0KICNlbmRpZiAgLy8gRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUworCisjaWYgU0JfSVMoRVZFUkdSRUVOKQorICAvLyBSdW4gdGhlIGZpcnN0IHVwZGF0ZSBjaGVjayBhZnRlciB0aGUgYXBwbGljYXRpb24gaXMgc3RhcnRlZC4KKyAgdXBkYXRlcl9tb2R1bGVfLT5VcGRhdGUoKTsKKyNlbmRpZgogfQogCiBBcHBsaWNhdGlvbjo6fkFwcGxpY2F0aW9uKCkgewpAQCAtODYxLDYgKzg3Miw3IEBACiAKIHZvaWQgQXBwbGljYXRpb246OkhhbmRsZVN0YXJib2FyZEV2ZW50KGNvbnN0IFNiRXZlbnQqIHN0YXJib2FyZF9ldmVudCkgewogICBEQ0hFQ0soc3RhcmJvYXJkX2V2ZW50KTsKKyAgRENIRUNLX0VRKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwogCiAgIC8vIEZvcndhcmQgaW5wdXQgZXZlbnRzIHRvIHxTeXN0ZW1XaW5kb3d8LgogICBpZiAoc3RhcmJvYXJkX2V2ZW50LT50eXBlID09IGtTYkV2ZW50VHlwZUlucHV0KSB7CkBAIC05MTYsNyArOTI4LDEzIEBACiAgICAgICAgIC8vIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCiAgICAgY2FzZSBrU2JFdmVudFR5cGVMaW5rOiB7CiAgICAgICBjb25zdCBjaGFyKiBsaW5rID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHN0YXJib2FyZF9ldmVudC0+ZGF0YSk7Ci0gICAgICBEaXNwYXRjaEV2ZW50SW50ZXJuYWwobmV3IGJhc2U6OkRlZXBMaW5rRXZlbnQobGluaykpOworICAgICAgaWYgKGJyb3dzZXJfbW9kdWxlXy0+SXNXZWJNb2R1bGVMb2FkZWQoKSkgeworICAgICAgICBETE9HKElORk8pIDw8ICJEaXNwYXRjaGluZyBkZWVwIGxpbmsgIiA8PCBsaW5rOworICAgICAgICBEaXNwYXRjaEV2ZW50SW50ZXJuYWwobmV3IGJhc2U6OkRlZXBMaW5rRXZlbnQobGluaykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRExPRyhJTkZPKSA8PCAiU3RvcmluZyBkZWVwIGxpbmsgIiA8PCBsaW5rOworICAgICAgICBlYXJseV9kZWVwX2xpbmtfID0gbGluazsKKyAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIGtTYkV2ZW50VHlwZUFjY2Vzc2libGl0eVNldHRpbmdzQ2hhbmdlZDoKQEAgLTEyMDEsNSArMTIxOSwxNCBAQAogfQogI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9ERUJVR0dFUikgJiYgZGVmaW5lZChTVEFSQk9BUkRfQUxMT1dTX01FTU9SWV9UUkFDS0lORykKIAordm9pZCBBcHBsaWNhdGlvbjo6RGlzcGF0Y2hFYXJseURlZXBMaW5rKCkgeworICBpZiAoZWFybHlfZGVlcF9saW5rXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIERMT0coSU5GTykgPDwgIkRpc3BhdGNoaW5nIGVhcmx5IGRlZXAgbGluayAiIDw8IGVhcmx5X2RlZXBfbGlua187CisgIERpc3BhdGNoRXZlbnRJbnRlcm5hbChuZXcgYmFzZTo6RGVlcExpbmtFdmVudChlYXJseV9kZWVwX2xpbmtfLmNfc3RyKCkpKTsKKyAgZWFybHlfZGVlcF9saW5rXyA9ICIiOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uaAppbmRleCBkYjU1ODc1Li43MzFmNDJmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uaAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uaApAQCAtMjgsNiArMjgsOSBAQAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvdG9vbC5oIgogI2luY2x1ZGUgImNvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuaCIKKyNpZiBTQl9JUyhFVkVSR1JFRU4pCisjaW5jbHVkZSAiY29iYWx0L3VwZGF0ZXIvdXBkYXRlcl9tb2R1bGUuaCIKKyNlbmRpZgogI2luY2x1ZGUgInN0YXJib2FyZC9ldmVudC5oIgogCiAjaWYgZGVmaW5lZChFTkFCTEVfV0VCRFJJVkVSKQpAQCAtMTAxLDYgKzEwNCwxMSBAQAogICAvLyBNYWluIGNvbXBvbmVudHMgb2YgdGhlIENvYmFsdCBicm93c2VyIGFwcGxpY2F0aW9uLgogICBzdGQ6OnVuaXF1ZV9wdHI8QnJvd3Nlck1vZHVsZT4gYnJvd3Nlcl9tb2R1bGVfOwogCisjaWYgU0JfSVMoRVZFUkdSRUVOKQorICAvLyBDb2JhbHQgVXBkYXRlci4KKyAgc3RkOjp1bmlxdWVfcHRyPHVwZGF0ZXI6OlVwZGF0ZXJNb2R1bGU+IHVwZGF0ZXJfbW9kdWxlXzsKKyNlbmRpZgorCiAgIC8vIEV2ZW50IGNhbGxiYWNrcy4KICAgYmFzZTo6RXZlbnRDYWxsYmFjayBuZXR3b3JrX2V2ZW50X2NhbGxiYWNrXzsKICAgYmFzZTo6RXZlbnRDYWxsYmFjayBkZWVwX2xpbmtfZXZlbnRfY2FsbGJhY2tfOwpAQCAtMjEyLDYgKzIyMCwxMyBAQAogICB2b2lkIE9uTWVtb3J5VHJhY2tlckNvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOwogI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9ERUJVR0dFUikgJiYgZGVmaW5lZChTVEFSQk9BUkRfQUxMT1dTX01FTU9SWV9UUkFDS0lORykKIAorICAvLyBUaGUgbGF0ZXN0IGxpbmsgcmVjZWl2ZWQgYmVmb3JlIHRoZSBXZWIgTW9kdWxlIGlzIGxvYWRlZCBpcyBzdG9yZWQgaGVyZS4KKyAgc3RkOjpzdHJpbmcgZWFybHlfZGVlcF9saW5rXzsKKworICAvLyBEaXNwYWNoIGV2ZW50cyBmb3IgZWFybHkgZGVlcGxpbmsuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHRoZSBXZWIKKyAgLy8gTW9kdWxlIGlzIGxvYWRlZC4KKyAgdm9pZCBEaXNwYXRjaEVhcmx5RGVlcExpbmsoKTsKKwogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXBwbGljYXRpb24pOwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXIuZ3lwIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXIuZ3lwCmluZGV4IDVhYzY5ZTAuLjY2NmM2ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXAKQEAgLTE1LDYgKzE1LDcgQEAKIHsKICAgJ3ZhcmlhYmxlcyc6IHsKICAgICAnc2JfcGVkYW50aWNfd2FybmluZ3MnOiAxLAorICAgICdoYXNfdXBkYXRlciUnIDogJzwhKHB5dGhvbiAuLi8uLi9idWlsZC9maWxlX2V4aXN0cy5weSA8KERFUFRIKS9jb2JhbHQvdXBkYXRlci91cGRhdGVyLmd5cCknLAogICB9LAogICAndGFyZ2V0cyc6IFsKICAgICB7CkBAIC0yMTMsNiArMjE0LDExIEBACiAgICAgICAgICAgICAnQ09CQUxUX01FU0hfQ0FDSEVfU0laRV9JTl9CWVRFUz08KG1lc2hfY2FjaGVfc2l6ZV9pbl9ieXRlcyknLAogICAgICAgICAgIF0sCiAgICAgICAgIH1dLAorICAgICAgICBbJ3NiX2V2ZXJncmVlbiA9PSAxIGFuZCBoYXNfdXBkYXRlciA9PSAiVHJ1ZSInLCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdXBkYXRlci91cGRhdGVyLmd5cDp1cGRhdGVyJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgfSwKIApAQCAtMjQxLDExICsyNDcsMTEgQEAKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cDpzcGVlY2gnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZS5neXA6c3RvcmFnZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlLmd5cDpzdG9yYWdlX3VwZ3JhZGVfY29weV90ZXN0X2RhdGEnLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAnYnJvd3NlcicsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cAppbmRleCAyOWNiYzlkLi5iZWI4ZTc4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXAKQEAgLTIzMiw2ICsyMzIsNyBAQAogICAgICAgICAnLi4vYXVkaW8vYXVkaW9fbm9kZV9jaGFubmVsX2NvdW50X21vZGUuaWRsJywKICAgICAgICAgJy4uL2F1ZGlvL2F1ZGlvX25vZGVfY2hhbm5lbF9pbnRlcnByZXRhdGlvbi5pZGwnLAogICAgICAgICAnLi4vZGVidWcvY29uc29sZS9jb25zb2xlX2NvbW1hbmQuaWRsJywKKyAgICAgICAgJy4uL2RlYnVnL2NvbnNvbGUvZGVidWdfY29uc29sZV9tb2RlLmlkbCcsCiAgICAgICAgICcuLi9kb20vYmxvYl9wcm9wZXJ0eV9iYWcuaWRsJywKICAgICAgICAgJy4uL2RvbS9jYXB0aW9ucy9jYXB0aW9uX2NoYXJhY3Rlcl9lZGdlX3N0eWxlLmlkbCcsCiAgICAgICAgICcuLi9kb20vY2FwdGlvbnMvY2FwdGlvbl9jb2xvci5pZGwnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjCmluZGV4IDYwNTJiMjMuLjliNGIwN2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuY2MKQEAgLTMxMCw3ICszMTAsOCBAQAogICAgICAgbWFpbl93ZWJfbW9kdWxlX2dlbmVyYXRpb25fKDApLAogICAgICAgbmV4dF90aW1lbGluZV9pZF8oMSksCiAgICAgICBjdXJyZW50X3NwbGFzaF9zY3JlZW5fdGltZWxpbmVfaWRfKC0xKSwKLSAgICAgIGN1cnJlbnRfbWFpbl93ZWJfbW9kdWxlX3RpbWVsaW5lX2lkXygtMSkgeworICAgICAgY3VycmVudF9tYWluX3dlYl9tb2R1bGVfdGltZWxpbmVfaWRfKC0xKSwKKyAgICAgIHdlYl9tb2R1bGVfbG9hZGVkX2NhbGxiYWNrXyhvcHRpb25zXy53ZWJfbW9kdWxlX2xvYWRlZF9jYWxsYmFjaykgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6YnJvd3NlciIsICJCcm93c2VyTW9kdWxlOjpCcm93c2VyTW9kdWxlKCkiKTsKIAogICAvLyBBcHBseSBwbGF0Zm9ybSBtZW1vcnkgc2V0dGluZyBhZGp1c3RtZW50cyBhbmQgZGVmYXVsdHMuCkBAIC0zNDUsNyArMzQ2LDE4IEBACiAjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdHRVIpCiAgIGRlYnVnX2NvbnNvbGVfbGF5ZXJfID0gcmVuZGVyX3RyZWVfY29tYmluZXJfLkNyZWF0ZUxheWVyKGtEZWJ1Z0NvbnNvbGVaSW5kZXgpOwogI2VuZGlmCi0gIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaChicm93c2VyOjpzd2l0Y2hlczo6a1FyQ29kZU92ZXJsYXkpKSB7CisKKyAgaW50IHFyX2NvZGVfb3ZlcmxheV9zbG90cyA9IDQ7CisgIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaChzd2l0Y2hlczo6a1FyQ29kZU92ZXJsYXkpKSB7CisgICAgYXV0byBzbG90c19pbl9zdHJpbmcgPQorICAgICAgICBjb21tYW5kX2xpbmUtPkdldFN3aXRjaFZhbHVlQVNDSUkoc3dpdGNoZXM6OmtRckNvZGVPdmVybGF5KTsKKyAgICBpZiAoIXNsb3RzX2luX3N0cmluZy5lbXB0eSgpKSB7CisgICAgICBhdXRvIHJlc3VsdCA9IGJhc2U6OlN0cmluZ1RvSW50KHNsb3RzX2luX3N0cmluZywgJnFyX2NvZGVfb3ZlcmxheV9zbG90cyk7CisgICAgICBEQ0hFQ0socmVzdWx0KSA8PCAiRmFpbGVkIHRvIGNvbnZlcnQgdmFsdWUgb2YgLS0iCisgICAgICAgICAgICAgICAgICAgICA8PCBzd2l0Y2hlczo6a1FyQ29kZU92ZXJsYXkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICAgPDwgcXJfY29kZV9vdmVybGF5X3Nsb3RzIDw8ICIgdG8gaW50LiI7CisgICAgICBEQ0hFQ0tfR1QocXJfY29kZV9vdmVybGF5X3Nsb3RzLCAwKTsKKyAgICB9CiAgICAgcXJfb3ZlcmxheV9pbmZvX2xheWVyXyA9CiAgICAgICAgIHJlbmRlcl90cmVlX2NvbWJpbmVyXy5DcmVhdGVMYXllcihrT3ZlcmxheUluZm9aSW5kZXgpOwogICB9IGVsc2UgewpAQCAtNDMwLDcgKzQ0Miw3IEBACiAgIGlmIChxcl9vdmVybGF5X2luZm9fbGF5ZXJfKSB7CiAgICAgbWF0aDo6U2l6ZSB3aWR0aF9oZWlnaHQgPSBHZXRWaWV3cG9ydFNpemUoKS53aWR0aF9oZWlnaHQoKTsKICAgICBxcl9jb2RlX292ZXJsYXlfLnJlc2V0KG5ldyBvdmVybGF5X2luZm86OlFyQ29kZU92ZXJsYXkoCi0gICAgICAgIHdpZHRoX2hlaWdodCwgR2V0UmVzb3VyY2VQcm92aWRlcigpLAorICAgICAgICB3aWR0aF9oZWlnaHQsIHFyX2NvZGVfb3ZlcmxheV9zbG90cywgR2V0UmVzb3VyY2VQcm92aWRlcigpLAogICAgICAgICBiYXNlOjpCaW5kKCZCcm93c2VyTW9kdWxlOjpRdWV1ZU9uUXJDb2RlT3ZlcmxheVJlbmRlclRyZWVQcm9kdWNlZCwKICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpOwogICB9CkBAIC02ODAsNyArNjkyLDEyIEBACiAgIG9uX2Vycm9yX3JldHJ5X2NvdW50XyA9IDA7CiAKICAgb25fbG9hZF9ldmVudF90aW1lXyA9IGJhc2U6OlRpbWVUaWNrczo6Tm93KCkuVG9JbnRlcm5hbFZhbHVlKCk7CisKICAgd2ViX21vZHVsZV9sb2FkZWRfLlNpZ25hbCgpOworCisgIGlmICghd2ViX21vZHVsZV9sb2FkZWRfY2FsbGJhY2tfLmlzX251bGwoKSkgeworICAgIHdlYl9tb2R1bGVfbG9hZGVkX2NhbGxiYWNrXy5SdW4oKTsKKyAgfQogfQogCiBib29sIEJyb3dzZXJNb2R1bGU6OldhaXRGb3JMb2FkKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgdGltZW91dCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaAppbmRleCBiNDQ0MThhLi5mNGY5YWE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaApAQCAtMTA2LDYgKzEwNiw3IEBACiAgICAgYmFzZTo6T3B0aW9uYWw8Y3Nzb206OlZpZXdwb3J0U2l6ZT4gcmVxdWVzdGVkX3ZpZXdwb3J0X3NpemU7CiAgICAgYm9vbCBlbmFibGVfc3BsYXNoX3NjcmVlbl9vbl9yZWxvYWRzOwogICAgIGJvb2wgZW5hYmxlX29uX3NjcmVlbl9rZXlib2FyZCA9IHRydWU7CisgICAgYmFzZTo6Q2xvc3VyZSB3ZWJfbW9kdWxlX2xvYWRlZF9jYWxsYmFjazsKICAgfTsKIAogICAvLyBUeXBlIGZvciBhIGNvbGxlY3Rpb24gb2YgVVJMIGhhbmRsZXIgY2FsbGJhY2tzIHRoYXQgY2FuIHBvdGVudGlhbGx5IGhhbmRsZQpAQCAtMTE5LDYgKzEyMCw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CiAgIH5Ccm93c2VyTW9kdWxlKCk7CiAKKyAgbmV0d29yazo6TmV0d29ya01vZHVsZSogR2V0TmV0d29ya01vZHVsZSgpIHsgcmV0dXJuICZuZXR3b3JrX21vZHVsZV87IH0KICAgc3RkOjpzdHJpbmcgR2V0VXNlckFnZW50KCkgeyByZXR1cm4gbmV0d29ya19tb2R1bGVfLkdldFVzZXJBZ2VudCgpOyB9CiAKICAgLy8gUmVjcmVhdGVzIHdlYiBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gVVJMLiBJbiB0aGUgY2FzZSB3aGVyZSBDb2JhbHQgaXMKQEAgLTIxMCw2ICsyMTIsOCBAQAogICAgICAgY29uc3QgYmFzZTo6QWNjZXNzaWJpbGl0eUNhcHRpb25TZXR0aW5nc0NoYW5nZWRFdmVudCogZXZlbnQpOwogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9DQVBUSU9OU19SRVFVSVJFRF9WRVJTSU9OIHx8IFNCX0hBUyhDQVBUSU9OUykKIAorICBib29sIElzV2ViTW9kdWxlTG9hZGVkKCkgeyByZXR1cm4gd2ViX21vZHVsZV9sb2FkZWRfLklzU2lnbmFsZWQoKTsgfQorCiAgcHJpdmF0ZToKICNpZiBTQl9IQVMoQ09SRV9EVU1QX0hBTkRMRVJfU1VQUE9SVCkKICAgc3RhdGljIHZvaWQgQ29yZUR1bXBIYW5kbGVyKHZvaWQqIGJyb3dzZXJfbW9kdWxlX2FzX3ZvaWQpOwpAQCAtNjY2LDYgKzY3MCw5IEBACiAgIC8vIGJ5IGF1dG9tZW0uICBXZSB3YW50IHRoaXMgc28gdGhhdCB3ZSBjYW4gY2hlY2sgdGhhdCBpdCBuZXZlciBjaGFuZ2VzLCBzaW5jZQogICAvLyB3ZSBkbyBub3QgaGF2ZSB0aGUgYWJpbGl0eSB0byBtb2RpZnkgaXQgYWZ0ZXIgc3RhcnR1cC4KICAgYmFzZTo6T3B0aW9uYWw8aW50NjRfdD4gamF2YXNjcmlwdF9nY190aHJlc2hvbGRfaW5fYnl0ZXNfOworCisgIC8vIENhbGxiYWNrIHRvIHJ1biB3aGVuIHRoZSBXZWIgTW9kdWxlIGlzIGxvYWRlZC4KKyAgYmFzZTo6Q2xvc3VyZSB3ZWJfbW9kdWxlX2xvYWRlZF9jYWxsYmFja187CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2NvYmFsdC5neXAgYi9zcmMvY29iYWx0L2Jyb3dzZXIvY29iYWx0Lmd5cAppbmRleCA4MzIwZjliLi40NzFlOWVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvY29iYWx0Lmd5cAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvY29iYWx0Lmd5cApAQCAtMTUsNyArMTUsNiBAQAogewogICAndmFyaWFibGVzJzogewogICAgICdzYl9wZWRhbnRpY193YXJuaW5ncyc6IDEsCi0gICAgJ2hhc191cGRhdGVyJScgOiAnPCEocHl0aG9uIC4uLy4uL2J1aWxkL2ZpbGVfZXhpc3RzLnB5IDwoREVQVEgpL2NvYmFsdC91cGRhdGVyL3VwZGF0ZXIuZ3lwKScsCiAgIH0sCiAgICd0YXJnZXRzJzogWwogICAgIHsKQEAgLTM0LDExICszMyw2IEBACiAgICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvc3BsYXNoX3NjcmVlbi9zcGxhc2hfc2NyZWVuLmd5cDpjb3B5X3NwbGFzaF9zY3JlZW4nLAogICAgICAgICAgIF0sCiAgICAgICAgIH1dLAotICAgICAgICBbJ3NiX2V2ZXJncmVlbiA9PSAxIGFuZCBoYXNfdXBkYXRlciA9PSAiVHJ1ZSInLCB7Ci0gICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdXBkYXRlci91cGRhdGVyLmd5cDp1cGRhdGVyJywKLSAgICAgICAgICBdLAotICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgfSwKICAgICB7CkBAIC05MSw3ICs4NSw3IEBACiAgICAgICAgIH0sCiAgICAgICBdCiAgICAgfV0sCi0gICAgWydmaW5hbF9leGVjdXRhYmxlX3R5cGUgPT0gInNoYXJlZF9saWJyYXJ5IicsIHsKKyAgICBbJ2ZpbmFsX2V4ZWN1dGFibGVfdHlwZSA9PSAic2hhcmVkX2xpYnJhcnkiIGFuZCBzYl9ldmVyZ3JlZW4gIT0gMScsIHsKICAgICAgICd0YXJnZXRzJzogWwogICAgICAgICB7CiAgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvYmFsdF9iaW4nLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5jYwppbmRleCA1NjIyM2Q5Li4zNmI1Y2FhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5jYwpAQCAtMzMsOSArMzMsMTEgQEAKIGNvbnN0IGNoYXIga0luaXRpYWxEZWJ1Z0NvbnNvbGVVcmxbXSA9CiAgICAgImZpbGU6Ly8vY29iYWx0L2RlYnVnL2NvbnNvbGUvZGVidWdfY29uc29sZS5odG1sIjsKIAotY29uc3QgY2hhciBrRGVidWdDb25zb2xlT2ZmU3RyaW5nW10gPSAib2ZmIjsKLWNvbnN0IGNoYXIga0RlYnVnQ29uc29sZU9uU3RyaW5nW10gPSAib24iOwotY29uc3QgY2hhciBrRGVidWdDb25zb2xlSHVkU3RyaW5nW10gPSAiaHVkIjsKK2NvbnN0IGNoYXIga0RlYnVnQ29uc29sZU1vZGVPZmZTdHJpbmdbXSA9ICJvZmYiOworY29uc3QgY2hhciBrRGVidWdDb25zb2xlTW9kZUh1ZFN0cmluZ1tdID0gImh1ZCI7Citjb25zdCBjaGFyIGtEZWJ1Z0NvbnNvbGVNb2RlRGVidWdTdHJpbmdbXSA9ICJkZWJ1ZyI7Citjb25zdCBjaGFyIGtEZWJ1Z0NvbnNvbGVNb2RlRGVidWdTdHJpbmdBbGlhc1tdID0gIm9uIjsgIC8vIExlZ2FjeSBuYW1lIG9mIG1vZGUuCitjb25zdCBjaGFyIGtEZWJ1Z0NvbnNvbGVNb2RlTWVkaWFTdHJpbmdbXSA9ICJtZWRpYSI7CiAKIC8vIENvbnZlcnQgZnJvbSBhIGRlYnVnIGNvbnNvbGUgdmlzaWJpbGl0eSBzZXR0aW5nIHN0cmluZyB0byBhbiBpbnRlZ2VyCiAvLyB2YWx1ZSBzcGVjaWZpZWQgYnkgYSBjb25zdGFudCBkZWZpbmVkIGluIGRlYnVnOjpjb25zb2xlOjpEZWJ1Z0h1Yi4KQEAgLTQ0LDEyICs0NiwxNiBAQAogICAvLyBTdGF0aWMgY2FzdGluZyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB3aGF0IGFwcGVhcnMgdG8gYmUgYQogICAvLyBjb21waWxlciBlcnJvciBvbiBMaW51eCB3aGVuIGltcGxpY2l0bHkgY29uc3RydWN0aW5nIGEgYmFzZTo6T3B0aW9uYWw8aW50PgogICAvLyBmcm9tIGEgc3RhdGljIGNvbnN0IGludC4KLSAgaWYgKG1vZGVfc3RyaW5nID09IGtEZWJ1Z0NvbnNvbGVPZmZTdHJpbmcpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkZWJ1Zzo6Y29uc29sZTo6RGVidWdIdWI6OmtEZWJ1Z0NvbnNvbGVPZmYpOwotICB9IGVsc2UgaWYgKG1vZGVfc3RyaW5nID09IGtEZWJ1Z0NvbnNvbGVIdWRTdHJpbmcpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkZWJ1Zzo6Y29uc29sZTo6RGVidWdIdWI6OmtEZWJ1Z0NvbnNvbGVIdWQpOwotICB9IGVsc2UgaWYgKG1vZGVfc3RyaW5nID09IGtEZWJ1Z0NvbnNvbGVPblN0cmluZykgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGRlYnVnOjpjb25zb2xlOjpEZWJ1Z0h1Yjo6a0RlYnVnQ29uc29sZU9uKTsKKyAgaWYgKG1vZGVfc3RyaW5nID09IGtEZWJ1Z0NvbnNvbGVNb2RlT2ZmU3RyaW5nKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZGVidWc6OmNvbnNvbGU6OmtEZWJ1Z0NvbnNvbGVNb2RlT2ZmKTsKKyAgfSBlbHNlIGlmIChtb2RlX3N0cmluZyA9PSBrRGVidWdDb25zb2xlTW9kZUh1ZFN0cmluZykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGRlYnVnOjpjb25zb2xlOjprRGVidWdDb25zb2xlTW9kZUh1ZCk7CisgIH0gZWxzZSBpZiAobW9kZV9zdHJpbmcgPT0ga0RlYnVnQ29uc29sZU1vZGVEZWJ1Z1N0cmluZykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGRlYnVnOjpjb25zb2xlOjprRGVidWdDb25zb2xlTW9kZURlYnVnKTsKKyAgfSBlbHNlIGlmIChtb2RlX3N0cmluZyA9PSBrRGVidWdDb25zb2xlTW9kZURlYnVnU3RyaW5nQWxpYXMpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkZWJ1Zzo6Y29uc29sZTo6a0RlYnVnQ29uc29sZU1vZGVEZWJ1Zyk7CisgIH0gZWxzZSBpZiAobW9kZV9zdHJpbmcgPT0ga0RlYnVnQ29uc29sZU1vZGVNZWRpYVN0cmluZykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGRlYnVnOjpjb25zb2xlOjprRGVidWdDb25zb2xlTW9kZU1lZGlhKTsKICAgfSBlbHNlIHsKICAgICBETE9HKFdBUk5JTkcpIDw8ICJEZWJ1ZyBjb25zb2xlIG1vZGUgXCIiIDw8IG1vZGVfc3RyaW5nCiAgICAgICAgICAgICAgICAgICA8PCAiXCIgbm90IHJlY29nbml6ZWQuIjsKQEAgLTgyLDcgKzg4LDcgQEAKICAgfQogCiAgIC8vIEJ5IGRlZmF1bHQgdGhlIGRlYnVnIGNvbnNvbGUgaXMgb2ZmLgotICByZXR1cm4gZGVidWc6OmNvbnNvbGU6OkRlYnVnSHViOjprRGVidWdDb25zb2xlT2ZmOworICByZXR1cm4gZGVidWc6OmNvbnNvbGU6OmtEZWJ1Z0NvbnNvbGVNb2RlT2ZmOwogfQogCiAvLyBBIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIERlYnVnSHViIG9iamVjdCwgdG8gYmUgaW5qZWN0ZWQgaW50byBXZWJNb2R1bGUuCkBAIC0xNDcsOCArMTUzLDggQEAKIAogYm9vbCBEZWJ1Z0NvbnNvbGU6OlNob3VsZEluamVjdElucHV0RXZlbnRzKCkgewogICBzd2l0Y2ggKEdldE1vZGUoKSkgewotICAgIGNhc2UgZGVidWc6OmNvbnNvbGU6OkRlYnVnSHViOjprRGVidWdDb25zb2xlT2ZmOgotICAgIGNhc2UgZGVidWc6OmNvbnNvbGU6OkRlYnVnSHViOjprRGVidWdDb25zb2xlSHVkOgorICAgIGNhc2UgZGVidWc6OmNvbnNvbGU6OmtEZWJ1Z0NvbnNvbGVNb2RlT2ZmOgorICAgIGNhc2UgZGVidWc6OmNvbnNvbGU6OmtEZWJ1Z0NvbnNvbGVNb2RlSHVkOgogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE5NywxMiArMjAzLDEyIEBACiAKIHZvaWQgRGVidWdDb25zb2xlOjpDeWNsZU1vZGUoKSB7CiAgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobW9kZV9tdXRleF8pOwotICBtb2RlXyA9IChtb2RlXyArIDEpICUgZGVidWc6OmNvbnNvbGU6OkRlYnVnSHViOjprRGVidWdDb25zb2xlTnVtTW9kZXM7CisgIG1vZGVfID0gKG1vZGVfICsgMSkgJSBkZWJ1Zzo6Y29uc29sZTo6a0RlYnVnQ29uc29sZU1vZGVDb3VudDsKIH0KIAotaW50IERlYnVnQ29uc29sZTo6R2V0TW9kZSgpIHsKK2RlYnVnOjpjb25zb2xlOjpEZWJ1Z0NvbnNvbGVNb2RlIERlYnVnQ29uc29sZTo6R2V0TW9kZSgpIHsKICAgYmFzZTo6QXV0b0xvY2sgbG9jayhtb2RlX211dGV4Xyk7Ci0gIHJldHVybiBtb2RlXzsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGRlYnVnOjpjb25zb2xlOjpEZWJ1Z0NvbnNvbGVNb2RlPihtb2RlXyk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBicm93c2VyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5oIGIvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUuaAppbmRleCBiYjFmZTI1Li5mMzY4ZmM1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbi5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL2xpZmVjeWNsZV9vYnNlcnZlci5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvY29uc29sZS9kZWJ1Z19jb25zb2xlX21vZGUuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvY29uc29sZS9kZWJ1Z19odWIuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2lucHV0X2V2ZW50X2luaXQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50X2luaXQuaCIKQEAgLTg2LDcgKzg3LDcgQEAKIAogICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjb25zb2xlIGlzIGluIGEgbW9kZSB0aGF0IGlzIHZpc2libGUuCiAgIGJvb2wgSXNWaXNpYmxlKCkgewotICAgIHJldHVybiAoR2V0TW9kZSgpICE9IGRlYnVnOjpjb25zb2xlOjpEZWJ1Z0h1Yjo6a0RlYnVnQ29uc29sZU9mZik7CisgICAgcmV0dXJuIChHZXRNb2RlKCkgIT0gZGVidWc6OmNvbnNvbGU6OmtEZWJ1Z0NvbnNvbGVNb2RlT2ZmKTsKICAgfQogCiAgIHZvaWQgU2V0U2l6ZShjb25zdCBjc3NvbTo6Vmlld3BvcnRTaXplJiB3aW5kb3dfZGltZW5zaW9ucywKQEAgLTExNCw3ICsxMTUsNyBAQAogICB9CiAKICAgLy8gUmV0dXJucyB0aGUgY3VycmVudGx5IHNldCBkZWJ1ZyBjb25zb2xlIHZpc2liaWxpdHkgbW9kZS4KLSAgaW50IEdldE1vZGUoKTsKKyAgZGVidWc6OmNvbnNvbGU6OkRlYnVnQ29uc29sZU1vZGUgR2V0TW9kZSgpOwogCiAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGRlYnVnIGNvbnNvbGUgaXMgaW4gYSBzdGF0ZSB3aGVyZSBpdCBzaG91bGQgcm91dGUKICAgLy8gaW5wdXQgZXZlbnRzIHRvIGl0cyB3ZWIgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmNjCmluZGV4IGVkYjg0OWIuLjEyNzU1NmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuY2MKQEAgLTMxNSw3ICszMTUsMTAgQEAKIGNvbnN0IGNoYXIga1FyQ29kZU92ZXJsYXlbXSA9ICJxcl9jb2RlX292ZXJsYXkiOwogY29uc3QgY2hhciBrUXJDb2RlT3ZlcmxheUhlbHBbXSA9CiAgICAgIkRpc3BsYXkgUXJDb2RlIGJhc2VkIG92ZXJsYXkgaW5mb3JtYXRpb24uIFRoZXNlIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIgotICAgICIgZm9yIHBlcmZvcm1hbmNlIHR1bmluZyBvciBwbGF5YmFjayBxdWFsaXR5IGNoZWNrLiI7CisgICAgIiBmb3IgcGVyZm9ybWFuY2UgdHVuaW5nIG9yIHBsYXliYWNrIHF1YWxpdHkgY2hlY2suICBCeSBkZWZhdWx0IHFyIGNvZGUiCisgICAgIiB3aWxsIGJlIGRpc3BsYXllZCBpbiA0IGRpZmZlcmVudCBsb2NhdGlvbnMgb24gdGhlIHNjcmVlbiBhbHRlcm5hdGl2ZWx5LCIKKyAgICAiIGFuZCB0aGUgbnVtYmVyIG9mIGxvY2F0aW9ucyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc3BlY2lmeWluZyBpdCBhcyB0aGUgIgorICAgICIgdmFsdWUgb2YgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIsIGxpa2UgJy0tcXJfY29kZV9vdmVybGF5PTYnLiI7CiAKIGNvbnN0IGNoYXIga1JlZHVjZUNwdU1lbW9yeUJ5W10gPSAicmVkdWNlX2NwdV9tZW1vcnlfYnkiOwogY29uc3QgY2hhciBrUmVkdWNlQ3B1TWVtb3J5QnlIZWxwW10gPQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9hbGwuZ3lwIGIvc3JjL2NvYmFsdC9idWlsZC9hbGwuZ3lwCmluZGV4IGUwZDNiMjAuLmU0ODQwNTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnVpbGQvYWxsLmd5cAorKysgYi9zcmMvY29iYWx0L2J1aWxkL2FsbC5neXAKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvZWxmX2xvYWRlci9lbGZfbG9hZGVyLmd5cDplbGZfbG9hZGVyX3Rlc3RfZGVwbG95JywKICAgICAgICAgICBdLAogICAgICAgICB9XSwKLSAgICAgICAgWydoYXNfbG9hZGVyX2FwcCA9PSAiVHJ1ZSInLCB7CisgICAgICAgIFsnaGFzX2xvYWRlcl9hcHAgPT0gIlRydWUiIGFuZCBzYl9ldmVyZ3JlZW4gIT0gMScsIHsKICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9sb2FkZXJfYXBwL2xvYWRlcl9hcHAuZ3lwOionLAogICAgICAgICAgIF0sCkBAIC0xMTQsNiArMTE0LDcgQEAKICAgICAgICAgWydzYl9ldmVyZ3JlZW49PTEnLCB7CiAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9tdXNsL211c2wuZ3lwOm11c2xfdW5pdHRlc3RzJywKKyAgICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbG9hZGVyX2FwcC9pbnN0YWxsYXRpb25fbWFuYWdlci5neXA6KicsCiAgICAgICAgICAgXSwKICAgICAgICAgfV0sCiAgICAgICBdLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZCBiL3NyYy9jb2JhbHQvYnVpbGQvYnVpbGQuaWQKaW5kZXggYTg2ZjhhNS4uZTQxMTk3MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZAorKysgYi9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkCkBAIC0xICsxIEBACi0yMzQxNDQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisyMzkyODcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2NzcC9jc3AuZ3lwIGIvc3JjL2NvYmFsdC9jc3AvY3NwLmd5cAppbmRleCBlYWVhZjRiLi41NjQ4ODhkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9jc3AuZ3lwCisrKyBiL3NyYy9jb2JhbHQvY3NwL2NzcC5neXAKQEAgLTU3LDEyICs1NywxMiBAQAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ2NzcCcsCiAgICAgICAgICdjc3BfY29weV90ZXN0X2RhdGEnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2Nzc19wYXJzZXIuZ3lwIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2Nzc19wYXJzZXIuZ3lwCmluZGV4IDNjMWY2YzYuLmQ0OThjYTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9jc3NfcGFyc2VyLmd5cAorKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvY3NzX3BhcnNlci5neXAKQEAgLTEzMiwxMiArMTMyLDEyIEBACiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAnY3NzX2dyYW1tYXInLAogICAgICAgICAnY3NzX3BhcnNlcicsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmgKaW5kZXggZjJjMGI5Zi4uNTU3NzQyZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgImJhc2UvY29udGFpbmVycy9zbWFsbF9tYXAuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3VudXNlZC5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3Byb3BlcnR5X2RlZmluaXRpb25zLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlLmgiCiAKQEAgLTUxNCw2ICs1MTUsMTggQEAKICAgICByZXR1cm4gaXNfaW5saW5lX2JlZm9yZV9ibG9ja2lmaWNhdGlvbl87CiAgIH0KIAorICBib29sIElzQ29udGFpbmluZ0Jsb2NrRm9yUG9zaXRpb25BYnNvbHV0ZUVsZW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBJc1Bvc2l0aW9uZWQoKSB8fCBJc1RyYW5zZm9ybWVkKCk7CisgIH0KKworICBib29sIElzUG9zaXRpb25lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcG9zaXRpb24oKSAhPSBjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRTdGF0aWMoKTsKKyAgfQorCisgIGJvb2wgSXNUcmFuc2Zvcm1lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJhbnNmb3JtKCkgIT0gY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0Tm9uZSgpOworICB9CisKICBwcm90ZWN0ZWQ6CiAgIHZvaWQgU2V0UHJvcGVydHlWYWx1ZShjb25zdCBQcm9wZXJ0eUtleSBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiB2YWx1ZSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc29tX3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NvbV90ZXN0Lmd5cAppbmRleCBkMDhmM2Q4Li45MmZiNWQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc29tX3Rlc3QuZ3lwCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3Nzb21fdGVzdC5neXAKQEAgLTU4LDEwICs1OCwxMCBAQAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvY3NzX3BhcnNlci9jc3NfcGFyc2VyLmd5cDpjc3NfcGFyc2VyJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9jc3NvbS9jc3NvbS5neXA6Y3Nzb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbnRlbnQvZG9tX2FnZW50LmpzIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbnRlbnQvZG9tX2FnZW50LmpzCmluZGV4IDJkY2YzNjkuLmY3MDI1NjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb250ZW50L2RvbV9hZ2VudC5qcworKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29udGVudC9kb21fYWdlbnQuanMKQEAgLTgyLDEzICs4Miw2IEBACiAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXN1bHQpOwogfQogCi0vLyBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggb2YgYSBub2RlLiBUaGlzIHBzZXVkby1jb21tYW5kIGluIHRoZSBET00gZG9tYWluIGlzCi0vLyBhIGhlbHBlciBmb3IgdGhlIEMrKyB8RE9NQWdlbnQ6OkhpZ2hsaWdodE5vZGV8LgotY29tbWFuZHMuX2dldEJvdW5kaW5nQ2xpZW50UmVjdCA9IGZ1bmN0aW9uKHBhcmFtcykgewotICB2YXIgbm9kZSA9IGNvbW1hbmRzLl9maW5kTm9kZShwYXJhbXMpOwotICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7Ci19Ci0KIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBOb2RlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNwZWNpZmllZCBub2RlLgogLy8gQWRkcyB0aGUgbm9kZSdzIGNoaWxkcmVuIHVwIHRvIHRoZSBzcGVjaWZpZWQgZGVwdGguIEEgbmVnYXRpdmUgZGVwdGggd2lsbAogLy8gY2F1c2UgYWxsIGRlc2NlbmRhbnRzIHRvIGJlIGFkZGVkLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbnRlbnQvb3ZlcmxheV9hZ2VudC5qcyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb250ZW50L292ZXJsYXlfYWdlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwZjgyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb250ZW50L292ZXJsYXlfYWdlbnQuanMKQEAgLTAsMCArMSwxNzkgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGZ1bmN0aW9uKGRlYnVnQmFja2VuZCkgeworCisvLyBBdHRhY2ggbWV0aG9kcyB0byBoYW5kbGUgY29tbWFuZHMgaW4gdGhlICdPdmVybGF5JyBkZXZ0b29scyBkb21haW4uCisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvT3ZlcmxheQorbGV0IGNvbW1hbmRzID0gZGVidWdCYWNrZW5kLk92ZXJsYXkgPSB7fTsKKworLy8gUmV0dXJucyBub24tb3ZlcmxhcHBpbmcgcmVjdGFuZ2xlcyB0byBoaWdobGlnaHQgZm9yIHRoZSBib3ggbW9kZWwgb2YgYSBub2RlLgorLy8gVGhpcyBwc2V1ZG8tY29tbWFuZCBpbiB0aGUgT3ZlcmxheSBkb21haW4gaXMgYSBoZWxwZXIgZm9yIHRoZSBDKysKKy8vIHxPdmVybGF5QWdlbnQ6OkhpZ2hsaWdodE5vZGV8LgorY29tbWFuZHMuX2hpZ2hsaWdodE5vZGVSZWN0cyA9IGZ1bmN0aW9uKHBhcmFtcykgeworICBsZXQgbm9kZSA9IGRlYnVnQmFja2VuZC5ET00uX2ZpbmROb2RlKHBhcmFtcyk7CisgIGxldCBjb25maWcgPSBwYXJhbXMuaGlnaGxpZ2h0Q29uZmlnIHx8IHt9OworICBsZXQgaGlnaGxpZ2h0cyA9IFtdOworICBpZiAobm9kZSAmJiBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgeworICAgIGxldCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTsKKyAgICBsZXQgY29udGVudCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisgICAgbGV0IGNvbG9yOworICAgIGxldCBib3g7CisKKyAgICBsZXQgdHJhbnNmb3JtZWQgPSBpc05vZGVUcmFuc2Zvcm1lZChub2RlKTsKKworICAgIGlmICghdHJhbnNmb3JtZWQpIHsKKyAgICAgIC8vIE1hcmdpbgorICAgICAgY29sb3IgPSBjb25maWcubWFyZ2luQ29sb3I7CisgICAgICBib3ggPSBzdHlsZUJveChzdHlsZXMsICdtYXJnaW4nKTsKKyAgICAgIGlmIChjb2xvcikgeworICAgICAgICBib3hSZWN0cyhjb250ZW50LCBib3gpLmZvckVhY2goCisgICAgICAgICAgICByZWN0ID0+IGhpZ2hsaWdodHMucHVzaChoaWdobGlnaHRQYXJhbXMocmVjdCwgY29sb3IpKSk7CisgICAgICB9CisKKyAgICAgIC8vIEJvcmRlcgorICAgICAgY29sb3IgPSBjb25maWcuYm9yZGVyQ29sb3I7CisgICAgICBib3ggPSBzdHlsZUJveChzdHlsZXMsICdib3JkZXInKTsKKyAgICAgIGlmIChjb2xvcikgeworICAgICAgICBib3hSZWN0cyhjb250ZW50LCBib3gpLmZvckVhY2goCisgICAgICAgICAgICByZWN0ID0+IGhpZ2hsaWdodHMucHVzaChoaWdobGlnaHRQYXJhbXMocmVjdCwgY29sb3IpKSk7CisgICAgICB9CisgICAgICBjb250ZW50ID0gaW5zZXRSZWN0KGNvbnRlbnQsIGJveCk7CisKKyAgICAgIC8vIFBhZGRpbmcKKyAgICAgIGNvbG9yID0gY29uZmlnLnBhZGRpbmdDb2xvcjsKKyAgICAgIGJveCA9IHN0eWxlQm94KHN0eWxlcywgJ3BhZGRpbmcnKTsKKyAgICAgIGlmIChjb2xvcikgeworICAgICAgICBib3hSZWN0cyhjb250ZW50LCBib3gpLmZvckVhY2goCisgICAgICAgICAgICByZWN0ID0+IGhpZ2hsaWdodHMucHVzaChoaWdobGlnaHRQYXJhbXMocmVjdCwgY29sb3IpKSk7CisgICAgICB9CisgICAgICBjb250ZW50ID0gaW5zZXRSZWN0KGNvbnRlbnQsIGJveCk7CisgICAgfQorCisgICAgLy8gQ29udGVudAorICAgIGNvbG9yID0gY29uZmlnLmNvbnRlbnRDb2xvcjsKKyAgICBpZiAoY29sb3IpIHsKKyAgICAgIGxldCBoaWdobGlnaHQgPSBoaWdobGlnaHRQYXJhbXMoY29udGVudCwgY29sb3IpOworICAgICAgaWYgKHRyYW5zZm9ybWVkKSB7CisgICAgICAgIGhpZ2hsaWdodC5vdXRsaW5lQ29sb3IgPSB7cjogMjU1LCBnOiAwLCBiOiAyNTUsIGE6IDEuMH07CisgICAgICB9CisgICAgICBoaWdobGlnaHRzLnB1c2goaGlnaGxpZ2h0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtoaWdobGlnaHRSZWN0czogaGlnaGxpZ2h0c30pOworfQorCisvLyBSZXR1cm5zIHRoZSBpbnNldCB3aWR0aCBvZiB0aGUgNCBzaWRlcyBvZiBhIGJveCBpbiB0aGUgY29tcHV0ZWQgc3R5bGUsIHdpdGgKKy8vIG1hcmdpbiBiZWluZyBuZWdhdGl2ZSB0byBwbGFjZSBpdCBvdXRzaWRlIHRoZSByZWN0LgorZnVuY3Rpb24gc3R5bGVCb3goc3R5bGVzLCBib3hOYW1lKSB7CisgIGxldCBzdWZmaXggPSBib3hOYW1lID09ICdib3JkZXInID8gJy13aWR0aCcgOiAnJzsKKyAgbGV0IHNpZ24gPSBib3hOYW1lID09ICdtYXJnaW4nID8gLTEgOiAxOworICBsZXQgYm94ID0ge307CisgIFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uZm9yRWFjaChzaWRlID0+IHsKKyAgICBsZXQgd2lkdGggPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShgJHtib3hOYW1lfS0ke3NpZGV9JHtzdWZmaXh9YCk7CisgICAgYm94W3NpZGVdID0gc2lnbiAqIHBhcnNlRmxvYXQod2lkdGgpIHx8IDA7CisgIH0pOworICByZXR1cm4gYm94OworfQorCitmdW5jdGlvbiBpc05vZGVUcmFuc2Zvcm1lZChub2RlKSB7CisgIHdoaWxlIChub2RlKSB7CisgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLnRyYW5zZm9ybSAhPT0gJ25vbmUnKSByZXR1cm4gdHJ1ZTsKKyAgICBub2RlID0gbm9kZS5vZmZzZXRQYXJlbnQ7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1vdmVybGFwcGluZyByZWN0YW5nbGVzIGZvciB0aGUgYm94IGFyb3VuZCB0aGUgaW5zaWRlCisvLyBvZiB8cmVjdHwsIGJ1dCB0aGUgcmVjdGFuZ2xlIGZvciBhbnkgYm94IHNpZGUgd2l0aCBuZWdhdGl2ZSB3aWR0aCB3aWxsIGJlCisvLyBvbiB0aGUgb3V0c2lkZSBvZiB8cmVjdHwuCitmdW5jdGlvbiBib3hSZWN0cyhyZWN0LCBib3gpIHsKKyAgLy8gU3RhcnQgb3V0IGFzc3VtaW5nIGJveCB3aWR0aHMgYXJlIGFsbCBwb3NpdGl2ZS4KKyAgbGV0IG91dGVyVCA9IHJlY3QueTsKKyAgbGV0IG91dGVyQiA9IHJlY3QueSArIHJlY3QuaGVpZ2h0OworICBsZXQgb3V0ZXJMID0gcmVjdC54OworICBsZXQgb3V0ZXJSID0gcmVjdC54ICsgcmVjdC53aWR0aDsKKyAgbGV0IGlubmVyVCA9IG91dGVyVCArIGJveC50b3A7CisgIGxldCBpbm5lckIgPSBvdXRlckIgLSBib3guYm90dG9tOworICBsZXQgaW5uZXJMID0gb3V0ZXJMICsgYm94LmxlZnQ7CisgIGxldCBpbm5lclIgPSAgb3V0ZXJSIC0gYm94LnJpZ2h0OworCisgIC8vIFN3YXAgYW55IGlubmVyL291dGVyICJpbnZlcnRlZCIgYnkgYSBuZWdhdGl2ZSBib3ggc2lkZS4KKyAgaWYgKG91dGVyVCA+IGlubmVyVCkgW291dGVyVCwgaW5uZXJUXSA9IFtpbm5lclQsIG91dGVyVF07CisgIGlmIChvdXRlckIgPCBpbm5lckIpIFtvdXRlckIsIGlubmVyQl0gPSBbaW5uZXJCLCBvdXRlckJdOworICBpZiAob3V0ZXJMID4gaW5uZXJMKSBbb3V0ZXJMLCBpbm5lckxdID0gW2lubmVyTCwgb3V0ZXJMXTsKKyAgaWYgKG91dGVyUiA8IGlubmVyUikgW291dGVyUiwgaW5uZXJSXSA9IFtpbm5lclIsIG91dGVyUl07CisKKyAgLy8gKy0tLS0tLS0tLS0tLS0tKworICAvLyB8ICAgICAgICAgICAgICB8CisgIC8vICstLSstLS0tLS0tLSstLSsKKyAgLy8gfCAgfCAgICAgICAgfCAgfAorICAvLyB8ICB8ICAgICAgICB8ICB8CisgIC8vICstLSstLS0tLS0tLSstLSsKKyAgLy8gfCAgICAgICAgICAgICAgfAorICAvLyArLS0tLS0tLS0tLS0tLS0rCisgIHJldHVybiBbCisgICAgLy8gdG9wCisgICAgeyB4OiBvdXRlckwsCisgICAgICB5OiBvdXRlclQsCisgICAgICB3aWR0aDogb3V0ZXJSIC0gb3V0ZXJMLAorICAgICAgaGVpZ2h0OiBpbm5lclQgLSBvdXRlclQgfSwKKyAgICAvLyBib3R0b20KKyAgICB7IHg6IG91dGVyTCwKKyAgICAgIHk6IGlubmVyQiwKKyAgICAgIHdpZHRoOiBvdXRlclIgLSBvdXRlckwsCisgICAgICBoZWlnaHQ6IG91dGVyQiAtIGlubmVyQiB9LAorICAgIC8vIGxlZnQKKyAgICB7IHg6IG91dGVyTCwKKyAgICAgIHk6IGlubmVyVCwKKyAgICAgIHdpZHRoOiBpbm5lckwgLSBvdXRlckwsCisgICAgICBoZWlnaHQ6IGlubmVyQiAtIGlubmVyVCB9LAorICAgIC8vIHJpZ2h0CisgICAgeyB4OiBpbm5lclIsCisgICAgICB5OiBpbm5lclQsCisgICAgICB3aWR0aDogb3V0ZXJSIC0gaW5uZXJSLAorICAgICAgaGVpZ2h0OiBpbm5lckIgLSBpbm5lclQgfSwKKyAgXTsKK30KKworLy8gUmV0dXJucyB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIGJveCBhcm91bmQgdGhlIGluc2lkZXMgcmVtb3ZlZC4KK2Z1bmN0aW9uIGluc2V0UmVjdChyZWN0LCBib3gpIHsKKyAgcmV0dXJuIHsKKyAgICB4OiByZWN0LnggKyBib3gubGVmdCwKKyAgICB5OiByZWN0LnkgKyBib3gudG9wLAorICAgIHdpZHRoOiByZWN0LndpZHRoIC0gYm94LmxlZnQgLSBib3gucmlnaHQsCisgICAgaGVpZ2h0OiByZWN0LmhlaWdodCAtIGJveC50b3AgLSBib3guYm90dG9tIH07Cit9CisKKy8vIFJldHVybnMgcGFyYW1ldGVycyBtYXRjaGluZyB0aGUgRGV2VG9vbHMgcHJvdG9jb2wgIk92ZXJsYXkuaGlnaGxpZ2h0UmVjdCIKKy8vIHBhcmFtZXRlcnMsIGFzIGV4cGVjdGVkIGJ5IHRoZSBuYXRpdmUgb3ZlcmxheSBhZ2VudC4KK2Z1bmN0aW9uIGhpZ2hsaWdodFBhcmFtcyhyZWN0LCBjb2xvcikgeworICAvLyBDb3B5IGVhY2ggcHJvcGVydHkgcmF0aGVyIHRoYW4gd2hvbGUgb2JqZWN0cyB0byBlbnN1cmUgdGhpcyBjYW4gYmUKKyAgLy8gY29udmVydGVkIHdpdGggSlNPTi5zZXJpYWxpemUoKS4KKyAgcmV0dXJuIHsKKyAgICB4OiByZWN0LngsCisgICAgeTogcmVjdC55LAorICAgIHdpZHRoOiByZWN0LndpZHRoLAorICAgIGhlaWdodDogcmVjdC5oZWlnaHQsCisgICAgY29sb3I6IHsKKyAgICAgIHI6IGNvbG9yLnIsCisgICAgICBnOiBjb2xvci5nLAorICAgICAgYjogY29sb3IuYiwKKyAgICAgIGE6IGNvbG9yLmEsCisgICAgfSwKKyAgfTsKK30KKworLy8gVE9ETzogUGFzcyBkZWJ1Z0JhY2tlbmQgZnJvbSBDKysgaW5zdGVhZCBvZiBnZXR0aW5nIGl0IGZyb20gdGhlIHdpbmRvdy4KK30pKHdpbmRvdy5kZWJ1Z0JhY2tlbmQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2Nzc19hZ2VudC5jYyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jc3NfYWdlbnQuY2MKaW5kZXggMzg5MTRlNS4uMWRlNjY5YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2Nzc19hZ2VudC5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY3NzX2FnZW50LmNjCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9jc3NfYWdlbnQuaCIKIAorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9jdW1lbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTY1LDcgKzY2LDggQEAKICAgQ1NTU3R5bGVSdWxlU2VxdWVuY2UgY3NzX3J1bGVzOwogICBhdXRvIGh0bWxfZWxlbWVudCA9IGVsZW1lbnQtPkFzSFRNTEVsZW1lbnQoKTsKICAgaWYgKGh0bWxfZWxlbWVudCkgewotICAgIGh0bWxfZWxlbWVudC0+VXBkYXRlTWF0Y2hpbmdSdWxlcygpOworICAgIGh0bWxfZWxlbWVudC0+bm9kZV9kb2N1bWVudCgpLT5VcGRhdGVDb21wdXRlZFN0eWxlT25FbGVtZW50QW5kQW5jZXN0b3IoCisgICAgICAgIGh0bWxfZWxlbWVudC5nZXQoKSk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBtYXRjaGluZ19ydWxlIDogKmh0bWxfZWxlbWVudC0+bWF0Y2hpbmdfcnVsZXMoKSkgewogICAgICAgY3NzX3J1bGVzLnB1c2hfYmFjayhtYXRjaGluZ19ydWxlLmZpcnN0KTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX21vZHVsZS5jYwppbmRleCAwYTg1NGEyLi41NDM0Nzg5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19tb2R1bGUuY2MKQEAgLTI5LDYgKzI5LDcgQEAKIGNvbnN0ZXhwciBjaGFyIGtMb2dBZ2VudFtdID0gIkxvZ0FnZW50IjsKIGNvbnN0ZXhwciBjaGFyIGtEb21BZ2VudFtdID0gIkRvbUFnZW50IjsKIGNvbnN0ZXhwciBjaGFyIGtDc3NBZ2VudFtdID0gIkNzc0FnZW50IjsKK2NvbnN0ZXhwciBjaGFyIGtPdmVybGF5QWdlbnRbXSA9ICJPdmVybGF5QWdlbnQiOwogY29uc3RleHByIGNoYXIga1BhZ2VBZ2VudFtdID0gIlBhZ2VBZ2VudCI7CiBjb25zdGV4cHIgY2hhciBrVHJhY2luZ0FnZW50W10gPSAiVHJhY2luZ0FnZW50IjsKIApAQCAtMTUyLDcgKzE1Myw3IEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJMYXllcj4gcGFnZV9yZW5kZXJfbGF5ZXIobmV3IFJlbmRlckxheWVyKGJhc2U6OkJpbmQoCiAgICAgICAmUmVuZGVyT3ZlcmxheTo6U2V0T3ZlcmxheSwgYmFzZTo6VW5yZXRhaW5lZChkYXRhLnJlbmRlcl9vdmVybGF5KSkpKTsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyTGF5ZXI+IGRvbV9yZW5kZXJfbGF5ZXIobmV3IFJlbmRlckxheWVyKAorICBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyTGF5ZXI+IG92ZXJsYXlfcmVuZGVyX2xheWVyKG5ldyBSZW5kZXJMYXllcigKICAgICAgIGJhc2U6OkJpbmQoJlJlbmRlckxheWVyOjpTZXRCYWNrTGF5ZXIsIHBhZ2VfcmVuZGVyX2xheWVyLT5Bc1dlYWtQdHIoKSkpKTsKIAogICAvLyBDcmVhdGUgdGhlIGFnZW50cyB0aGF0IGltcGxlbWVudCB0aGUgdmFyaW91cyBkZXZ0b29scyBwcm90b2NvbCBkb21haW5zIGJ5CkBAIC0xNjcsOSArMTY4LDEwIEBACiAgIH0KICAgY29uc29sZV9hZ2VudF8ucmVzZXQobmV3IENvbnNvbGVBZ2VudChkZWJ1Z19kaXNwYXRjaGVyXy5nZXQoKSwgZGF0YS5jb25zb2xlKSk7CiAgIGxvZ19hZ2VudF8ucmVzZXQobmV3IExvZ0FnZW50KGRlYnVnX2Rpc3BhdGNoZXJfLmdldCgpKSk7Ci0gIGRvbV9hZ2VudF8ucmVzZXQoCi0gICAgICBuZXcgRE9NQWdlbnQoZGVidWdfZGlzcGF0Y2hlcl8uZ2V0KCksIHN0ZDo6bW92ZShkb21fcmVuZGVyX2xheWVyKSkpOworICBkb21fYWdlbnRfLnJlc2V0KG5ldyBET01BZ2VudChkZWJ1Z19kaXNwYXRjaGVyXy5nZXQoKSkpOwogICBjc3NfYWdlbnRfID0gV3JhcFJlZkNvdW50ZWQobmV3IENTU0FnZW50KGRlYnVnX2Rpc3BhdGNoZXJfLmdldCgpKSk7CisgIG92ZXJsYXlfYWdlbnRfLnJlc2V0KG5ldyBPdmVybGF5QWdlbnQoZGVidWdfZGlzcGF0Y2hlcl8uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG92ZXJsYXlfcmVuZGVyX2xheWVyKSkpOwogICBwYWdlX2FnZW50Xy5yZXNldChuZXcgUGFnZUFnZW50KGRlYnVnX2Rpc3BhdGNoZXJfLmdldCgpLCBkYXRhLndpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGFnZV9yZW5kZXJfbGF5ZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzb3VyY2VfcHJvdmlkZXIpKTsKQEAgLTIwMSw2ICsyMDMsNyBAQAogICBsb2dfYWdlbnRfLT5UaGF3KFJlbW92ZUFnZW50U3RhdGUoa0xvZ0FnZW50LCBhZ2VudHNfc3RhdGUpKTsKICAgZG9tX2FnZW50Xy0+VGhhdyhSZW1vdmVBZ2VudFN0YXRlKGtEb21BZ2VudCwgYWdlbnRzX3N0YXRlKSk7CiAgIGNzc19hZ2VudF8tPlRoYXcoUmVtb3ZlQWdlbnRTdGF0ZShrQ3NzQWdlbnQsIGFnZW50c19zdGF0ZSkpOworICBvdmVybGF5X2FnZW50Xy0+VGhhdyhSZW1vdmVBZ2VudFN0YXRlKGtPdmVybGF5QWdlbnQsIGFnZW50c19zdGF0ZSkpOwogICBwYWdlX2FnZW50Xy0+VGhhdyhSZW1vdmVBZ2VudFN0YXRlKGtQYWdlQWdlbnQsIGFnZW50c19zdGF0ZSkpOwogICB0cmFjaW5nX2FnZW50Xy0+VGhhdyhSZW1vdmVBZ2VudFN0YXRlKGtUcmFjaW5nQWdlbnQsIGFnZW50c19zdGF0ZSkpOwogCkBAIC0yMjgsNiArMjMxLDcgQEAKICAgU3RvcmVBZ2VudFN0YXRlKGFnZW50c19zdGF0ZSwga0xvZ0FnZW50LCBsb2dfYWdlbnRfLT5GcmVlemUoKSk7CiAgIFN0b3JlQWdlbnRTdGF0ZShhZ2VudHNfc3RhdGUsIGtEb21BZ2VudCwgZG9tX2FnZW50Xy0+RnJlZXplKCkpOwogICBTdG9yZUFnZW50U3RhdGUoYWdlbnRzX3N0YXRlLCBrQ3NzQWdlbnQsIGNzc19hZ2VudF8tPkZyZWV6ZSgpKTsKKyAgU3RvcmVBZ2VudFN0YXRlKGFnZW50c19zdGF0ZSwga092ZXJsYXlBZ2VudCwgb3ZlcmxheV9hZ2VudF8tPkZyZWV6ZSgpKTsKICAgU3RvcmVBZ2VudFN0YXRlKGFnZW50c19zdGF0ZSwga1BhZ2VBZ2VudCwgcGFnZV9hZ2VudF8tPkZyZWV6ZSgpKTsKICAgU3RvcmVBZ2VudFN0YXRlKGFnZW50c19zdGF0ZSwga1RyYWNpbmdBZ2VudCwgdHJhY2luZ19hZ2VudF8tPkZyZWV6ZSgpKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX21vZHVsZS5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX21vZHVsZS5oCmluZGV4IDA3YmI2NDIuLjExZjM0YmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z2dlcl9zdGF0ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RvbV9hZ2VudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2xvZ19hZ2VudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL292ZXJsYXlfYWdlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9wYWdlX2FnZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvcmVuZGVyX292ZXJsYXkuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9ydW50aW1lX2FnZW50LmgiCkBAIC0xNDYsNiArMTQ3LDcgQEAKICAgc3RkOjp1bmlxdWVfcHRyPExvZ0FnZW50PiBsb2dfYWdlbnRfOwogICBzdGQ6OnVuaXF1ZV9wdHI8RE9NQWdlbnQ+IGRvbV9hZ2VudF87CiAgIHNjb3BlZF9yZWZwdHI8Q1NTQWdlbnQ+IGNzc19hZ2VudF87CisgIHN0ZDo6dW5pcXVlX3B0cjxPdmVybGF5QWdlbnQ+IG92ZXJsYXlfYWdlbnRfOwogICBzdGQ6OnVuaXF1ZV9wdHI8UGFnZUFnZW50PiBwYWdlX2FnZW50XzsKICAgc3RkOjp1bmlxdWVfcHRyPFJ1bnRpbWVBZ2VudD4gcnVudGltZV9hZ2VudF87CiAgIHN0ZDo6dW5pcXVlX3B0cjxTY3JpcHREZWJ1Z2dlckFnZW50PiBzY3JpcHRfZGVidWdnZXJfYWdlbnRfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RvbV9hZ2VudC5jYyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kb21fYWdlbnQuY2MKaW5kZXggMjY4ZTI2Yi4uZjNkNTMyMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RvbV9hZ2VudC5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZG9tX2FnZW50LmNjCkBAIC0xNCwxNiArMTQsNiBAQAogCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvZG9tX2FnZW50LmgiCiAKLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiY29iYWx0L21hdGgvbWF0cml4M19mLmgiCi0jaW5jbHVkZSAiY29iYWx0L21hdGgvdHJhbnNmb3JtXzJkLmgiCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2JydXNoLmgiCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2NvbG9yX3JnYmEuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvcmVjdF9ub2RlLmgiCi0KIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGRlYnVnIHsKIG5hbWVzcGFjZSBiYWNrZW5kIHsKQEAgLTM3LDE3ICsyNywxMyBAQAogY29uc3RleHByIGNoYXIga1NjcmlwdEZpbGVbXSA9ICJkb21fYWdlbnQuanMiOwogfSAgLy8gbmFtZXNwYWNlCiAKLURPTUFnZW50OjpET01BZ2VudChEZWJ1Z0Rpc3BhdGNoZXIqIGRpc3BhdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlbmRlckxheWVyPiByZW5kZXJfbGF5ZXIpCitET01BZ2VudDo6RE9NQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyKQogICAgIDogZGlzcGF0Y2hlcl8oZGlzcGF0Y2hlciksCi0gICAgICByZW5kZXJfbGF5ZXJfKHN0ZDo6bW92ZShyZW5kZXJfbGF5ZXIpKSwKICAgICAgIEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVChjb21tYW5kc18odGhpcywga0luc3BlY3RvckRvbWFpbikpIHsKICAgRENIRUNLKGRpc3BhdGNoZXJfKTsKIAogICBjb21tYW5kc19bImRpc2FibGUiXSA9ICZET01BZ2VudDo6RGlzYWJsZTsKICAgY29tbWFuZHNfWyJlbmFibGUiXSA9ICZET01BZ2VudDo6RW5hYmxlOwotICBjb21tYW5kc19bImhpZ2hsaWdodE5vZGUiXSA9ICZET01BZ2VudDo6SGlnaGxpZ2h0Tm9kZTsKLSAgY29tbWFuZHNfWyJoaWRlSGlnaGxpZ2h0Il0gPSAmRE9NQWdlbnQ6OkhpZGVIaWdobGlnaHQ7CiB9CiAKIHZvaWQgRE9NQWdlbnQ6OlRoYXcoSlNPTk9iamVjdCBhZ2VudF9zdGF0ZSkgewpAQCAtNzIsNzcgKzU4LDYgQEAKIAogdm9pZCBET01BZ2VudDo6RGlzYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7IGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7IH0KIAotLy8gVW5saWtlIG1vc3Qgb3RoZXIgRE9NIGNvbW1hbmQgaGFuZGxlcnMsIHRoaXMgb25lIGlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZAotLy8gaW4gSmF2YVNjcmlwdC4gSW5zdGVhZCwgdGhlIEpTIG9iamVjdCBpcyB1c2VkIHRvIGxvb2sgdXAgdGhlIG5vZGUgZnJvbSB0aGUKLS8vIHBhcmFtZXRlcnMgYW5kIHJldHVybiBpdHMgYm91bmRpbmcgY2xpZW50IHJlY3QsIHRoZW4gdGhlIGhpZ2hsaWdodCBpdHNlbGYKLS8vIGlzIHJlbmRlcmVkIGJ5IGNhbGxpbmcgdGhlIEMrKyBmdW5jdGlvbiB8UmVuZGVySGlnaGxpZ2h0fCB0byBzZXQgdGhlIHJlbmRlcgotLy8gb3ZlcmxheS4KLXZvaWQgRE9NQWdlbnQ6OkhpZ2hsaWdodE5vZGUoY29uc3QgQ29tbWFuZCYgY29tbWFuZCkgewotICAvLyBHZXQgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0gIEpTT05PYmplY3QganNvbl9kb21fcmVjdCA9IGRpc3BhdGNoZXJfLT5SdW5TY3JpcHRDb21tYW5kKAotICAgICAgImRvbS5fZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgY29tbWFuZC5HZXRQYXJhbXMoKSk7Ci0gIGRvdWJsZSB4ID0gMC4wOwotICBkb3VibGUgeSA9IDAuMDsKLSAgZG91YmxlIHdpZHRoID0gMC4wOwotICBkb3VibGUgaGVpZ2h0ID0gMC4wOwotICBqc29uX2RvbV9yZWN0LT5HZXREb3VibGUoInJlc3VsdC54IiwgJngpOwotICBqc29uX2RvbV9yZWN0LT5HZXREb3VibGUoInJlc3VsdC55IiwgJnkpOwotICBqc29uX2RvbV9yZWN0LT5HZXREb3VibGUoInJlc3VsdC53aWR0aCIsICZ3aWR0aCk7Ci0gIGpzb25fZG9tX3JlY3QtPkdldERvdWJsZSgicmVzdWx0LmhlaWdodCIsICZoZWlnaHQpOwotCi0gIHNjb3BlZF9yZWZwdHI8ZG9tOjpET01SZWN0PiBkb21fcmVjdCgKLSAgICAgIG5ldyBkb206OkRPTVJlY3Qoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpLCBzdGF0aWNfY2FzdDxmbG9hdD4oeSksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCksIHN0YXRpY19jYXN0PGZsb2F0PihoZWlnaHQpKSk7Ci0KLSAgLy8gfGhpZ2hsaWdodF9jb25maWdfdmFsdWV8IHN0aWxsIG93bmVkIGJ5IHxwYXJhbXN8LgotICBKU09OT2JqZWN0IHBhcmFtcyA9IEpTT05QYXJzZShjb21tYW5kLkdldFBhcmFtcygpKTsKLSAgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBoaWdobGlnaHRfY29uZmlnX3ZhbHVlID0gTlVMTDsKLSAgYm9vbCBnb3RfaGlnaGxpZ2h0X2NvbmZpZyA9Ci0gICAgICBwYXJhbXMtPkdldERpY3Rpb25hcnkoImhpZ2hsaWdodENvbmZpZyIsICZoaWdobGlnaHRfY29uZmlnX3ZhbHVlKTsKLSAgRENIRUNLKGdvdF9oaWdobGlnaHRfY29uZmlnKTsKLSAgRENIRUNLKGhpZ2hsaWdodF9jb25maWdfdmFsdWUpOwotCi0gIFJlbmRlckhpZ2hsaWdodChkb21fcmVjdCwgaGlnaGxpZ2h0X2NvbmZpZ192YWx1ZSk7Ci0KLSAgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsKLX0KLQotdm9pZCBET01BZ2VudDo6SGlkZUhpZ2hsaWdodChjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7Ci0gIHJlbmRlcl9sYXllcl8tPlNldEZyb250TGF5ZXIoc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4oKSk7Ci0gIGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7Ci19Ci0KLXZvaWQgRE9NQWdlbnQ6OlJlbmRlckhpZ2hsaWdodCgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6RE9NUmVjdD4mIGJvdW5kaW5nX3JlY3QsCi0gICAgY29uc3QgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBoaWdobGlnaHRfY29uZmlnX3ZhbHVlKSB7Ci0gIC8vIFRPRE86IFNob3VsZCBhbHNvIHJlbmRlciBib3JkZXJzLCBldGMuCi0KLSAgLy8gQ29udGVudCBjb2xvciBpcyBvcHRpb25hbCBpbiB0aGUgcGFyYW1ldGVycywgc28gdXNlIGEgZmFsbGJhY2suCi0gIGludCByID0gMTEyOwotICBpbnQgZyA9IDE2ODsKLSAgaW50IGIgPSAyMTk7Ci0gIGRvdWJsZSBhID0gMC42NjsKLSAgY29uc3QgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBjb250ZW50X2NvbG9yID0gTlVMTDsKLSAgYm9vbCBnb3RfY29udGVudF9jb2xvciA9Ci0gICAgICBoaWdobGlnaHRfY29uZmlnX3ZhbHVlLT5HZXREaWN0aW9uYXJ5KCJjb250ZW50Q29sb3IiLCAmY29udGVudF9jb2xvcik7Ci0gIGlmIChnb3RfY29udGVudF9jb2xvciAmJiBjb250ZW50X2NvbG9yKSB7Ci0gICAgY29udGVudF9jb2xvci0+R2V0SW50ZWdlcigiciIsICZyKTsKLSAgICBjb250ZW50X2NvbG9yLT5HZXRJbnRlZ2VyKCJnIiwgJmcpOwotICAgIGNvbnRlbnRfY29sb3ItPkdldEludGVnZXIoImIiLCAmYik7Ci0gICAgY29udGVudF9jb2xvci0+R2V0RG91YmxlKCJhIiwgJmEpOwotICB9Ci0gIHJlbmRlcl90cmVlOjpDb2xvclJHQkEgY29sb3IociAvIDI1NS4wZiwgZyAvIDI1NS4wZiwgYiAvIDI1NS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oYSkpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxyZW5kZXJfdHJlZTo6QnJ1c2g+IGJhY2tncm91bmRfYnJ1c2goCi0gICAgICBuZXcgcmVuZGVyX3RyZWU6OlNvbGlkQ29sb3JCcnVzaChjb2xvcikpOwotICBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiByZWN0ID0gbmV3IHJlbmRlcl90cmVlOjpSZWN0Tm9kZSgKLSAgICAgIG1hdGg6OlJlY3RGKGJvdW5kaW5nX3JlY3QtPngoKSwgYm91bmRpbmdfcmVjdC0+eSgpLAotICAgICAgICAgICAgICAgICAgYm91bmRpbmdfcmVjdC0+d2lkdGgoKSwgYm91bmRpbmdfcmVjdC0+aGVpZ2h0KCkpLAotICAgICAgc3RkOjptb3ZlKGJhY2tncm91bmRfYnJ1c2gpKTsKLSAgcmVuZGVyX2xheWVyXy0+U2V0RnJvbnRMYXllcihyZWN0KTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKIH0gIC8vIG5hbWVzcGFjZSBkZWJ1ZwogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RvbV9hZ2VudC5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RvbV9hZ2VudC5oCmluZGV4IGIxZDUzMzkuLjZlNTlmZmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kb21fYWdlbnQuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZG9tX2FnZW50LmgKQEAgLTE0LDE2ICsxNCwxMCBAQAogI2lmbmRlZiBDT0JBTFRfREVCVUdfQkFDS0VORF9ET01fQUdFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RFQlVHX0JBQ0tFTkRfRE9NX0FHRU5UX0hfCiAKLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9jb21tYW5kX21hcC5oIgogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9yZW5kZXJfbGF5ZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvY29tbWFuZC5oIgogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9qc29uX29iamVjdC5oIgotI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3JlY3QuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgZGVidWcgewpAQCAtMzEsOCArMjUsNyBAQAogCiBjbGFzcyBET01BZ2VudCB7CiAgcHVibGljOgotICBET01BZ2VudChEZWJ1Z0Rpc3BhdGNoZXIqIGRpc3BhdGNoZXIsCi0gICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJMYXllcj4gcmVuZGVyX2xheWVyKTsKKyAgZXhwbGljaXQgRE9NQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyKTsKIAogICB2b2lkIFRoYXcoSlNPTk9iamVjdCBhZ2VudF9zdGF0ZSk7CiAgIEpTT05PYmplY3QgRnJlZXplKCk7CkBAIC00MSwyMiArMzQsOCBAQAogICB2b2lkIEVuYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKICAgdm9pZCBEaXNhYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOwogCi0gIC8vIEhpZ2hsaWdodHMgYSBzcGVjaWZpZWQgbm9kZSBhY2NvcmRpbmcgdG8gaGlnaGxpZ2h0IHBhcmFtZXRlcnMuCi0gIHZvaWQgSGlnaGxpZ2h0Tm9kZShjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKLQotICAvLyBIaWRlcyB0aGUgbm9kZSBoaWdobGlnaHRpbmcuCi0gIHZvaWQgSGlkZUhpZ2hsaWdodChjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKLQotICAvLyBSZW5kZXJzIGEgaGlnaGxpZ2h0IHRvIHRoZSBvdmVybGF5LgotICB2b2lkIFJlbmRlckhpZ2hsaWdodChjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6RE9NUmVjdD4mIGJvdW5kaW5nX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSogaGlnaGxpZ2h0X2NvbmZpZ192YWx1ZSk7Ci0KLSAgLy8gSGVscGVyIG9iamVjdCB0byBjb25uZWN0IHRvIHRoZSBkZWJ1ZyBkaXNwYXRjaGVyLCBldGMuCiAgIERlYnVnRGlzcGF0Y2hlciogZGlzcGF0Y2hlcl87CiAKLSAgLy8gUmVuZGVyIGxheWVyIG93bmVkIGJ5IHRoaXMgb2JqZWN0LgotICBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyTGF5ZXI+IHJlbmRlcl9sYXllcl87Ci0KICAgLy8gTWFwIG9mIG1lbWJlciBmdW5jdGlvbnMgaW1wbGVtZW50aW5nIGNvbW1hbmRzLgogICBDb21tYW5kTWFwPERPTUFnZW50PiBjb21tYW5kc187CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9vdmVybGF5X2FnZW50LmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL292ZXJsYXlfYWdlbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5Njc1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9vdmVybGF5X2FnZW50LmNjCkBAIC0wLDAgKzEsMTYyIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9vdmVybGF5X2FnZW50LmgiCisKKyNpbmNsdWRlICJjb2JhbHQvbWF0aC9jbGFtcC5oIgorI2luY2x1ZGUgImNvYmFsdC9tYXRoL3JlY3RfZi5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9icnVzaC5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9jb2xvcl9yZ2JhLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2NvbXBvc2l0aW9uX25vZGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvcmVjdF9ub2RlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRlYnVnIHsKK25hbWVzcGFjZSBiYWNrZW5kIHsKKwordXNpbmcgYmFzZTo6VmFsdWU7Cit1c2luZyBtYXRoOjpDbGFtcDsKK3VzaW5nIHJlbmRlcl90cmVlOjpDb2xvclJHQkE7CisKK25hbWVzcGFjZSB7CisvLyBEZWZpbml0aW9ucyBmcm9tIHRoZSBzZXQgc3BlY2lmaWVkIGhlcmU6CisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvT3ZlcmxheQorY29uc3RleHByIGNoYXIga0luc3BlY3RvckRvbWFpbltdID0gIk92ZXJsYXkiOworCisvLyBGaWxlIHRvIGxvYWQgSmF2YVNjcmlwdCBPdmVybGF5IERldlRvb2xzIGRvbWFpbiBpbXBsZW1lbnRhdGlvbiBmcm9tLgorY29uc3RleHByIGNoYXIga1NjcmlwdEZpbGVbXSA9ICJvdmVybGF5X2FnZW50LmpzIjsKKworLy8gUmV0dXJucyB0aGUgZmxvYXQgdmFsdWUgb2YgYSBwYXJhbSwgb3IgMC4wIGlmIHVuZGVmaW5lZCBvciBub24tbnVtZXJpYy4KK2Zsb2F0IEdldEZsb2F0UGFyYW0oY29uc3QgVmFsdWUqIHBhcmFtcywgYmFzZTo6U3RyaW5nUGllY2Uga2V5KSB7CisgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMtPmlzX2RpY3QoKSkgcmV0dXJuIDAuMGY7CisgIGNvbnN0IFZhbHVlKiB2ID0gcGFyYW1zLT5GaW5kS2V5KGtleSk7CisgIGlmICghdiB8fCAhKHYtPmlzX2RvdWJsZSgpIHx8IHYtPmlzX2ludCgpKSkgcmV0dXJuIDAuMGY7CisgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4odi0+R2V0RG91YmxlKCkpOworfQorCisvLyBSZXR1cm5zIGFuIFJHQkEgY29sb3IgZGVmaW5lZCBieSBhIHBhcmFtLCBvciB0cmFuc3BhcmVudCBpZiB1bmRlZmluZWQuCitDb2xvclJHQkEgUmVuZGVyQ29sb3IoY29uc3QgVmFsdWUqIHBhcmFtcykgeworICBmbG9hdCByID0gR2V0RmxvYXRQYXJhbShwYXJhbXMsICJyIikgLyAyNTUuMGY7CisgIGZsb2F0IGcgPSBHZXRGbG9hdFBhcmFtKHBhcmFtcywgImciKSAvIDI1NS4wZjsKKyAgZmxvYXQgYiA9IEdldEZsb2F0UGFyYW0ocGFyYW1zLCAiYiIpIC8gMjU1LjBmOworICBmbG9hdCBhID0gR2V0RmxvYXRQYXJhbShwYXJhbXMsICJhIik7CisgIHJldHVybiBDb2xvclJHQkEoQ2xhbXAociwgMC4wZiwgMS4wZiksIENsYW1wKGcsIDAuMGYsIDEuMGYpLAorICAgICAgICAgICAgICAgICAgIENsYW1wKGIsIDAuMGYsIDEuMGYpLCBDbGFtcChhLCAwLjBmLCAxLjBmKSk7Cit9CisKKy8vIFJldHVybnMgYSByZWN0YW5nbGUgdG8gcmVuZGVyIGFjY29yZGluZyB0byB0aGUgcGFyYW1zIGZvciB0aGUgRGV2VG9vbHMKKy8vICJPdmVybGF5LmhpZ2hsaWdodFJlY3QiIGNvbW1hbmQuCisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvT3ZlcmxheSNtZXRob2QtaGlnaGxpZ2h0UmVjdAorc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6UmVjdE5vZGU+IFJlbmRlckhpZ2hsaWdodFJlY3QoY29uc3QgVmFsdWUqIHBhcmFtcykgeworICBmbG9hdCB4ID0gR2V0RmxvYXRQYXJhbShwYXJhbXMsICJ4Iik7CisgIGZsb2F0IHkgPSBHZXRGbG9hdFBhcmFtKHBhcmFtcywgInkiKTsKKyAgZmxvYXQgd2lkdGggPSBHZXRGbG9hdFBhcmFtKHBhcmFtcywgIndpZHRoIik7CisgIGZsb2F0IGhlaWdodCA9IEdldEZsb2F0UGFyYW0ocGFyYW1zLCAiaGVpZ2h0Iik7CisgIENvbG9yUkdCQSBjb2xvcihSZW5kZXJDb2xvcihwYXJhbXMtPkZpbmRLZXkoImNvbG9yIikpKTsKKyAgY29uc3QgVmFsdWUqIG91dGxpbmVfcGFyYW0gPSBwYXJhbXMtPkZpbmRLZXkoIm91dGxpbmVDb2xvciIpOworICBDb2xvclJHQkEgb3V0bGluZV9jb2xvcihSZW5kZXJDb2xvcihvdXRsaW5lX3BhcmFtKSk7CisgIGZsb2F0IG91dGxpbmVfd2lkdGggPSBvdXRsaW5lX3BhcmFtID8gMS4wZiA6IDAuMGY7CisgIHJldHVybiBiYXNlOjpNYWtlUmVmQ291bnRlZDxyZW5kZXJfdHJlZTo6UmVjdE5vZGU+KAorICAgICAgbWF0aDo6UmVjdEYoeCwgeSwgd2lkdGgsIGhlaWdodCksCisgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHJlbmRlcl90cmVlOjpTb2xpZENvbG9yQnJ1c2g+KGNvbG9yKSwKKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8cmVuZGVyX3RyZWU6OkJvcmRlcj4ocmVuZGVyX3RyZWU6OkJvcmRlclNpZGUoCisgICAgICAgICAgb3V0bGluZV93aWR0aCwgcmVuZGVyX3RyZWU6OmtCb3JkZXJTdHlsZVNvbGlkLCBvdXRsaW5lX2NvbG9yKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworT3ZlcmxheUFnZW50OjpPdmVybGF5QWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlbmRlckxheWVyPiByZW5kZXJfbGF5ZXIpCisgICAgOiBkaXNwYXRjaGVyXyhkaXNwYXRjaGVyKSwKKyAgICAgIHJlbmRlcl9sYXllcl8oc3RkOjptb3ZlKHJlbmRlcl9sYXllcikpLAorICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGNvbW1hbmRzXyh0aGlzLCBrSW5zcGVjdG9yRG9tYWluKSkgeworICBEQ0hFQ0soZGlzcGF0Y2hlcl8pOworICBEQ0hFQ0socmVuZGVyX2xheWVyXyk7CisKKyAgY29tbWFuZHNfWyJkaXNhYmxlIl0gPSAmT3ZlcmxheUFnZW50OjpEaXNhYmxlOworICBjb21tYW5kc19bImVuYWJsZSJdID0gJk92ZXJsYXlBZ2VudDo6RW5hYmxlOworICBjb21tYW5kc19bImhpZ2hsaWdodE5vZGUiXSA9ICZPdmVybGF5QWdlbnQ6OkhpZ2hsaWdodE5vZGU7CisgIGNvbW1hbmRzX1siaGlnaGxpZ2h0UmVjdCJdID0gJk92ZXJsYXlBZ2VudDo6SGlnaGxpZ2h0UmVjdDsKKyAgY29tbWFuZHNfWyJoaWRlSGlnaGxpZ2h0Il0gPSAmT3ZlcmxheUFnZW50OjpIaWRlSGlnaGxpZ2h0OworfQorCit2b2lkIE92ZXJsYXlBZ2VudDo6VGhhdyhKU09OT2JqZWN0IGFnZW50X3N0YXRlKSB7CisgIGRpc3BhdGNoZXJfLT5BZGREb21haW4oa0luc3BlY3RvckRvbWFpbiwgY29tbWFuZHNfLkJpbmQoKSk7CisgIHNjcmlwdF9sb2FkZWRfID0gZGlzcGF0Y2hlcl8tPlJ1blNjcmlwdEZpbGUoa1NjcmlwdEZpbGUpOworICBETE9HX0lGKEVSUk9SLCAhc2NyaXB0X2xvYWRlZF8pIDw8ICJGYWlsZWQgdG8gbG9hZCAiIDw8IGtTY3JpcHRGaWxlOworfQorCitKU09OT2JqZWN0IE92ZXJsYXlBZ2VudDo6RnJlZXplKCkgeworICBkaXNwYXRjaGVyXy0+UmVtb3ZlRG9tYWluKGtJbnNwZWN0b3JEb21haW4pOworICByZXR1cm4gSlNPTk9iamVjdCgpOworfQorCit2b2lkIE92ZXJsYXlBZ2VudDo6RW5hYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKKyAgaWYgKHNjcmlwdF9sb2FkZWRfKSB7CisgICAgZW5hYmxlZF8gPSB0cnVlOworICAgIGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7CisgIH0gZWxzZSB7CisgICAgY29tbWFuZC5TZW5kRXJyb3JSZXNwb25zZShDb21tYW5kOjprSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIE92ZXJsYXkgaW5zcGVjdG9yLiIpOworICB9Cit9CisKK3ZvaWQgT3ZlcmxheUFnZW50OjpEaXNhYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKKyAgZW5hYmxlZF8gPSBmYWxzZTsKKyAgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsKK30KKwordm9pZCBPdmVybGF5QWdlbnQ6OkhpZ2hsaWdodE5vZGUoY29uc3QgQ29tbWFuZCYgY29tbWFuZCkgeworICBpZiAoIWVuYWJsZWRfKSB7CisgICAgY29tbWFuZC5TZW5kRXJyb3JSZXNwb25zZShDb21tYW5kOjprSW52YWxpZFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3ZlcmxheSBpbnNwZWN0b3Igbm90IGVuYWJsZWQuIik7CisgICAgcmV0dXJuOworICB9CisgIC8vIFVzZSB0aGUgaW5qZWN0ZWQgSmF2YVNjcmlwdCBoZWxwZXIgdG8gZ2V0IHRoZSByZWN0YW5nbGVzIHRvIGhpZ2hsaWdodCBmb3IKKyAgLy8gdGhlIHNwZWNpZmllZCBub2RlLgorICBKU09OT2JqZWN0IHJlY3RzX3Jlc3BvbnNlID0gZGlzcGF0Y2hlcl8tPlJ1blNjcmlwdENvbW1hbmQoCisgICAgICAiT3ZlcmxheS5faGlnaGxpZ2h0Tm9kZVJlY3RzIiwgY29tbWFuZC5HZXRQYXJhbXMoKSk7CisgIGNvbnN0IFZhbHVlKiBoaWdobGlnaHRfcmVjdHMgPQorICAgICAgcmVjdHNfcmVzcG9uc2UtPkZpbmRQYXRoKHsicmVzdWx0IiwgImhpZ2hsaWdodFJlY3RzIn0pOworICBpZiAoIWhpZ2hsaWdodF9yZWN0cykgeworICAgIGNvbW1hbmQuU2VuZEVycm9yUmVzcG9uc2UoQ29tbWFuZDo6a0ludmFsaWRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IG5vZGUgaGlnaGxpZ2h0cy4iKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBSZW5kZXIgYWxsIHRoZSBoaWdobGlnaHQgcmVjdHMgYXMgY2hpbGRyZW4gb2YgYSBDb21wb3NpdGlvbk5vZGUuCisgIHJlbmRlcl90cmVlOjpDb21wb3NpdGlvbk5vZGU6OkJ1aWxkZXIgYnVpbGRlcjsKKyAgZm9yIChjb25zdCBWYWx1ZSYgcmVjdF9wYXJhbXMgOiBoaWdobGlnaHRfcmVjdHMtPkdldExpc3QoKSkgeworICAgIGJ1aWxkZXIuQWRkQ2hpbGQoUmVuZGVySGlnaGxpZ2h0UmVjdCgmcmVjdF9wYXJhbXMpKTsKKyAgfQorICByZW5kZXJfbGF5ZXJfLT5TZXRGcm9udExheWVyKAorICAgICAgYmFzZTo6TWFrZVJlZkNvdW50ZWQ8cmVuZGVyX3RyZWU6OkNvbXBvc2l0aW9uTm9kZT4oYnVpbGRlcikpOworCisgIGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7Cit9CisKK3ZvaWQgT3ZlcmxheUFnZW50OjpIaWdobGlnaHRSZWN0KGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKKyAgSlNPTk9iamVjdCBwYXJhbXMgPSBKU09OUGFyc2UoY29tbWFuZC5HZXRQYXJhbXMoKSk7CisgIHJlbmRlcl9sYXllcl8tPlNldEZyb250TGF5ZXIoUmVuZGVySGlnaGxpZ2h0UmVjdChwYXJhbXMuZ2V0KCkpKTsKKyAgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsKK30KKwordm9pZCBPdmVybGF5QWdlbnQ6OkhpZGVIaWdobGlnaHQoY29uc3QgQ29tbWFuZCYgY29tbWFuZCkgeworICByZW5kZXJfbGF5ZXJfLT5TZXRGcm9udExheWVyKHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+KCkpOworICBjb21tYW5kLlNlbmRSZXNwb25zZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFja2VuZAorfSAgLy8gbmFtZXNwYWNlIGRlYnVnCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvb3ZlcmxheV9hZ2VudC5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL292ZXJsYXlfYWdlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjc0MjViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL292ZXJsYXlfYWdlbnQuaApAQCAtMCwwICsxLDYxIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjaWZuZGVmIENPQkFMVF9ERUJVR19CQUNLRU5EX09WRVJMQVlfQUdFTlRfSF8KKyNkZWZpbmUgQ09CQUxUX0RFQlVHX0JBQ0tFTkRfT1ZFUkxBWV9BR0VOVF9IXworCisjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvY29tbWFuZF9tYXAuaCIKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19kaXNwYXRjaGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvcmVuZGVyX2xheWVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2NvbW1hbmQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvanNvbl9vYmplY3QuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZGVidWcgeworbmFtZXNwYWNlIGJhY2tlbmQgeworCitjbGFzcyBPdmVybGF5QWdlbnQgeworIHB1YmxpYzoKKyAgT3ZlcmxheUFnZW50KERlYnVnRGlzcGF0Y2hlciogZGlzcGF0Y2hlciwKKyAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJMYXllcj4gcmVuZGVyX2xheWVyKTsKKworICB2b2lkIFRoYXcoSlNPTk9iamVjdCBhZ2VudF9zdGF0ZSk7CisgIEpTT05PYmplY3QgRnJlZXplKCk7CisKKyBwcml2YXRlOgorICB2b2lkIEVuYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKKyAgdm9pZCBEaXNhYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOworCisgIHZvaWQgSGlnaGxpZ2h0Tm9kZShjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKKyAgdm9pZCBIaWdobGlnaHRSZWN0KGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOworICB2b2lkIEhpZGVIaWdobGlnaHQoY29uc3QgQ29tbWFuZCYgY29tbWFuZCk7CisKKyAgRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyXzsKKworICAvLyBSZW5kZXIgbGF5ZXIgb3duZWQgYnkgdGhpcyBvYmplY3QuCisgIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJMYXllcj4gcmVuZGVyX2xheWVyXzsKKworICAvLyBNYXAgb2YgbWVtYmVyIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgY29tbWFuZHMuCisgIENvbW1hbmRNYXA8T3ZlcmxheUFnZW50PiBjb21tYW5kc187CisKKyAgLy8gV2hldGhlciB3ZSBzdWNjZXNzZnVsbHkgbG9hZGVkIHRoZSBhZ2VudCdzIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24uCisgIGJvb2wgc2NyaXB0X2xvYWRlZF8gPSBmYWxzZTsKKworICBib29sIGVuYWJsZWRfID0gZmFsc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFja2VuZAorfSAgLy8gbmFtZXNwYWNlIGRlYnVnCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RFQlVHX0JBQ0tFTkRfT1ZFUkxBWV9BR0VOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvY29uc29sZV9tYW5hZ2VyLmpzIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvY29uc29sZV9tYW5hZ2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMmUwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9jb25zb2xlX21hbmFnZXIuanMKQEAgLTAsMCArMSwxOTYgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwordmFyIGNvbnNvbGVNYW5hZ2VyID0gbnVsbDsKKworZnVuY3Rpb24gc3RhcnQoKSB7CisgIHdpbmRvdy5jb25zb2xlTWFuYWdlciA9IG5ldyBDb25zb2xlTWFuYWdlcigpOworfQorCit3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHN0YXJ0KTsKKworZnVuY3Rpb24gQ29uc29sZU1hbmFnZXIoKSB7CisgIC8vIEhhbmRsZXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZWJ1Z2dlci4KKyAgdGhpcy5kZWJ1Z2dlckNsaWVudCA9IG5ldyBEZWJ1Z2dlckNsaWVudCgpOworICAvLyBOdW1iZXIgb2YgYW5pbWF0aW9uIGZyYW1lIHNhbXBsZXMgc2luY2UgdGhlIGxhc3QgdXBkYXRlLgorICB0aGlzLmFuaW1hdGlvbkZyYW1lU2FtcGxlcyA9IDA7CisgIC8vIEEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGludGVyYWN0aXZlIGNvbnNvbGVzLgorICAvLyBFYWNoIGl0ZW0gY29udGFpbnMgdGhlIG1vZGUgYW5kIHRoZSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBjb25zb2xlLgorICB0aGlzLmNvbnNvbGVSZWdpc3RyeSA9IG51bGw7CisKKyAgdGhpcy5pbml0aWFsaXplQ29uc29sZXMoKTsKKworICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlkb3duLmJpbmQodGhpcykpOworICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuaGFuZGxlS2V5dXAuYmluZCh0aGlzKSk7CisgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgdGhpcy5oYW5kbGVLZXlwcmVzcy5iaW5kKHRoaXMpKTsKKyAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLmhhbmRsZVdoZWVsLmJpbmQodGhpcykpOworICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuaGFuZGxlSW5wdXQuYmluZCh0aGlzKSk7CisgIGlmICh0eXBlb2Ygd2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQgIT0gJ3VuZGVmaW5lZCcKKyAgICAgICYmIHdpbmRvdy5vblNjcmVlbktleWJvYXJkKSB7CisgICAgd2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQub25JbnB1dCA9IHRoaXMuaGFuZGxlSW5wdXQuYmluZCh0aGlzKTsKKyAgfQorICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZS5iaW5kKHRoaXMpKTsKK30KKworQ29uc29sZU1hbmFnZXIucHJvdG90eXBlLmluaXRpYWxpemVDb25zb2xlcyA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmNvbnNvbGVSZWdpc3RyeSA9IFsKKyAgICB7CisgICAgICBjb25zb2xlOiBuZXcgRGVidWdDb25zb2xlKHRoaXMuZGVidWdnZXJDbGllbnQpLAorICAgICAgbW9kZTogJ2RlYnVnJywKKyAgICAgIGJvZHlDbGFzczogJ2RlYnVnQ29uc29sZSBodWQnLAorICAgIH0sCisgICAgeworICAgICAgY29uc29sZTogbmV3IE1lZGlhQ29uc29sZSh0aGlzLmRlYnVnZ2VyQ2xpZW50KSwKKyAgICAgIG1vZGU6ICdtZWRpYScsCisgICAgICBib2R5Q2xhc3M6ICdtZWRpYUNvbnNvbGUnLAorICAgIH0sCisgIF07CisKKyAgdGhpcy5odWRDb25zb2xlID0gdGhpcy5jb25zb2xlUmVnaXN0cnlbMF0uY29uc29sZTsKKworICB0aGlzLmNvbnNvbGVSZWdpc3RyeS5mb3JFYWNoKCBlbnRyeSA9PiB7CisgICAgbGV0IGVuc3VyZUNvbnNvbGVzQXJlVmFsaWQgPSBmdW5jdGlvbihtZXRob2QpIHsKKyAgICAgIGlmKHR5cGVvZiBlbnRyeS5jb25zb2xlW21ldGhvZF0gIT0gImZ1bmN0aW9uIikgeworICAgICAgICBjb25zb2xlLndhcm4oYENvbnNvbGUgIiR7ZW50cnkubW9kZX0iICR7bWV0aG9kfSgpIGlzIG5vdCBpbXBsZW1lbnRlZC4gXAorICAgICAgICAgICAgUHJvdmlkaW5nIGRlZmF1bHQgZW1wdHkgaW1wbGVtZW50YXRpb24uYCk7CisgICAgICAgIC8vIFByb3ZpZGUgYSBkZWZhdWx0IG5vdC1pbXBsZW1lbnRlZCB3YXJuaW5nIG1lc3NhZ2UuCisgICAgICAgIGxldCBjb25zb2xlTmFtZSA9IGVudHJ5Lm1vZGU7CisgICAgICAgIGxldCBub3RJbXBsZW1lbnRlZE1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICBjb25zb2xlLmxvZygKKyAgICAgICAgICAgICAgYENvbnNvbGUgIiR7Y29uc29sZU5hbWV9IiAke21ldGhvZH0oKSBpcyBub3QgaW1wbGVtZW50ZWQuYCk7CisgICAgICAgIH07CisgICAgICAgIGVudHJ5LmNvbnNvbGVbbWV0aG9kXSA9IG5vdEltcGxlbWVudGVkTWVzc2FnZTsKKyAgICAgIH0KKyAgICB9OworICAgIGVuc3VyZUNvbnNvbGVzQXJlVmFsaWQoInVwZGF0ZSIpOworICAgIGVuc3VyZUNvbnNvbGVzQXJlVmFsaWQoInNldFZpc2libGUiKTsKKyAgICBlbnN1cmVDb25zb2xlc0FyZVZhbGlkKCJvbktleWRvd24iKTsKKyAgICBlbnN1cmVDb25zb2xlc0FyZVZhbGlkKCJvbktleXVwIik7CisgICAgZW5zdXJlQ29uc29sZXNBcmVWYWxpZCgib25LZXlwcmVzcyIpOworICAgIGVuc3VyZUNvbnNvbGVzQXJlVmFsaWQoIm9uSW5wdXQiKTsKKyAgICBlbnN1cmVDb25zb2xlc0FyZVZhbGlkKCJvbldoZWVsIik7CisgIH0pOworfQorCitDb25zb2xlTWFuYWdlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7CisgIGxldCBtb2RlID0gd2luZG93LmRlYnVnSHViLmdldERlYnVnQ29uc29sZU1vZGUoKTsKKworICBpZiAobW9kZSAhPT0gJ29mZicpIHsKKyAgICB0aGlzLmRlYnVnZ2VyQ2xpZW50LmF0dGFjaCgpOworICB9CisKKyAgbGV0IGFjdGl2ZUNvbnNvbGUgPSB0aGlzLmdldEFjdGl2ZUNvbnNvbGUoKTsKKyAgbGV0IGJvZHlDbGFzcyA9ICcnOworICBpZiAobW9kZSA9PSAnaHVkJykgeworICAgIGJvZHlDbGFzcyA9ICdodWQnOworICAgIC8vIFRoZSBIVUQgaXMgb3duZWQgYnkgdGhlIGRlYnVnIGNvbnNvbGUsIGJ1dCBzaW5jZSBpdCBoYXMgaXRzIG93biBtb2RlCisgICAgLy8gZGVkaWNhdGVkIHRvIGl0LCBpdCBuZWVkcyB0byBiZSBzcGVjaWZpY2FsbHkgdXBkYXRlZCB3aGVuIGl0IGlzIHZpc2libGUuCisgICAgLy8gVE9ETzogRmFjdG9yIG91dCBodWRDb25zb2xlIGludG8gaXRzIG93biBjb25zb2xlLgorICAgIHRoaXMuaHVkQ29uc29sZS51cGRhdGVIdWQoKTsKKyAgfSBlbHNlIGlmIChtb2RlICE9ICdvZmYnICYmIG1vZGUgIT0gJ2h1ZCcpIHsKKyAgICBib2R5Q2xhc3MgPSBhY3RpdmVDb25zb2xlLmJvZHlDbGFzczsKKyAgfQorICBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9IGJvZHlDbGFzczsKKworICB0aGlzLmNvbnNvbGVSZWdpc3RyeS5mb3JFYWNoKChlbnRyeSkgPT4geworICAgIGVudHJ5LmNvbnNvbGUuc2V0VmlzaWJsZShlbnRyeSA9PSBhY3RpdmVDb25zb2xlKTsKKyAgfSk7CisKKyAgaWYgKG1vZGUgIT09ICdvZmYnKSB7CisgICAgaWYgKGFjdGl2ZUNvbnNvbGUpIHsgYWN0aXZlQ29uc29sZS5jb25zb2xlLnVwZGF0ZSgpOyB9CisgIH0KK30KKworLy8gQW5pbWF0aW9uIGNhbGxiYWNrOiB1cGRhdGVzIHN0YXRlIGFuZCBhbmltYXRlZCBub2Rlcy4KK0NvbnNvbGVNYW5hZ2VyLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24odGltZSkgeworICBjb25zdCBzdWJzYW1wbGUgPSA4OworICB0aGlzLmFuaW1hdGlvbkZyYW1lU2FtcGxlcyA9ICh0aGlzLmFuaW1hdGlvbkZyYW1lU2FtcGxlcyArIDEpICUgc3Vic2FtcGxlOworICBpZiAodGhpcy5hbmltYXRpb25GcmFtZVNhbXBsZXMgPT0gMCkgeworICAgIHRoaXMudXBkYXRlKCk7CisgIH0KKyAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUuYmluZCh0aGlzKSk7Cit9CisKK0NvbnNvbGVNYW5hZ2VyLnByb3RvdHlwZS5nZXRBY3RpdmVDb25zb2xlID0gZnVuY3Rpb24oKSB7CisgIGxldCBtb2RlID0gd2luZG93LmRlYnVnSHViLmdldERlYnVnQ29uc29sZU1vZGUoKTsKKyAgcmV0dXJuIHRoaXMuY29uc29sZVJlZ2lzdHJ5LmZpbmQoIGVudHJ5ID0+IGVudHJ5Lm1vZGUgPT09IG1vZGUgKTsKK30KKworQ29uc29sZU1hbmFnZXIucHJvdG90eXBlLmhhbmRsZUtleWRvd24gPSAgZnVuY3Rpb24oZXZlbnQpIHsKKyAgLy8gTWFwIG9mICdVbmlkZW50aWZpZWQnIGFkZGl0aW9uYWwgQ29iYWx0IGtleUNvZGVzIHRvIGVxdWl2YWxlbnQga2V5cy4KKyAgY29uc3QgdW5pZGVudGlmaWVkQ29iYWx0S2V5TWFwID0geworICAgIC8vIGtTYktleUdhbWVwYWQxCisgICAgMHg4MDAwOiAnRW50ZXInLAorICAgIC8vIGtTYktleUdhbWVwYWQyCisgICAgMHg4MDAxOiAnRXNjJywKKyAgICAvLyBrU2JLZXlHYW1lcGFkMworICAgIDB4ODAwMjogJ0hvbWUnLAorICAgIC8vIGtTYktleUdhbWVwYWQ1CisgICAgMHg4MDA4OiAnRW50ZXInLAorICAgIC8vIGtTYktleUdhbWVwYWQ2CisgICAgMHg4MDA5OiAnRW50ZXInLAorICAgIC8vIGtTYktleUdhbWVwYWREUGFkVXAKKyAgICAweDgwMEM6ICdBcnJvd1VwJywKKyAgICAvLyBrU2JLZXlHYW1lcGFkRFBhZERvd24KKyAgICAweDgwMEQ6ICdBcnJvd0Rvd24nLAorICAgIC8vIGtTYktleUdhbWVwYWREUGFkTGVmdAorICAgIDB4ODAwRTogJ0Fycm93TGVmdCcsCisgICAgLy8ga1NiS2V5R2FtZXBhZERQYWRSaWdodAorICAgIDB4ODAwRjogJ0Fycm93UmlnaHQnLAorICAgIC8vIGtTYktleUdhbWVwYWRMZWZ0U3RpY2tVcAorICAgIDB4ODAxMTogJ0Fycm93VXAnLAorICAgIC8vIGtTYktleUdhbWVwYWRMZWZ0U3RpY2tEb3duCisgICAgMHg4MDEyOiAnQXJyb3dEb3duJywKKyAgICAvLyBrU2JLZXlHYW1lcGFkTGVmdFN0aWNrTGVmdAorICAgIDB4ODAxMzogJ0Fycm93TGVmdCcsCisgICAgLy8ga1NiS2V5R2FtZXBhZExlZnRTdGlja1JpZ2h0CisgICAgMHg4MDE0OiAnQXJyb3dSaWdodCcsCisgICAgLy8ga1NiS2V5R2FtZXBhZFJpZ2h0U3RpY2tVcAorICAgIDB4ODAxNTogJ0Fycm93VXAnLAorICAgIC8vIGtTYktleUdhbWVwYWRSaWdodFN0aWNrRG93bgorICAgIDB4ODAxNjogJ0Fycm93RG93bicsCisgICAgLy8ga1NiS2V5R2FtZXBhZFJpZ2h0U3RpY2tMZWZ0CisgICAgMHg4MDE3OiAnQXJyb3dMZWZ0JywKKyAgICAvLyBrU2JLZXlHYW1lcGFkUmlnaHRTdGlja1JpZ2h0CisgICAgMHg4MDE4OiAnQXJyb3dSaWdodCcKKyAgfTsKKworICBsZXQga2V5ID0gZXZlbnQua2V5OworICBpZiAoa2V5ID09ICdVbmlkZW50aWZpZWQnKSB7CisgICAga2V5ID0gdW5pZGVudGlmaWVkQ29iYWx0S2V5TWFwW2V2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnOworICB9CisKKyAgbGV0IGFjdGl2ZSA9IHRoaXMuZ2V0QWN0aXZlQ29uc29sZSgpOworICBpZiAoYWN0aXZlKSB7IGFjdGl2ZS5jb25zb2xlLm9uS2V5ZG93bihldmVudCk7IH0KK30KKworQ29uc29sZU1hbmFnZXIucHJvdG90eXBlLmhhbmRsZUtleXVwID0gZnVuY3Rpb24oZXZlbnQpIHsKKyAgbGV0IGFjdGl2ZSA9IHRoaXMuZ2V0QWN0aXZlQ29uc29sZSgpOworICBpZiAoYWN0aXZlKSB7IGFjdGl2ZS5jb25zb2xlLm9uS2V5dXAoZXZlbnQpOyB9Cit9CisKK0NvbnNvbGVNYW5hZ2VyLnByb3RvdHlwZS5oYW5kbGVLZXlwcmVzcyA9IGZ1bmN0aW9uKGV2ZW50KSB7CisgIGxldCBhY3RpdmUgPSB0aGlzLmdldEFjdGl2ZUNvbnNvbGUoKTsKKyAgaWYgKGFjdGl2ZSkgeyBhY3RpdmUuY29uc29sZS5vbktleXByZXNzKGV2ZW50KTsgfQorfQorCitDb25zb2xlTWFuYWdlci5wcm90b3R5cGUuaGFuZGxlSW5wdXQgPSBmdW5jdGlvbihldmVudCkgeworICBsZXQgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmVDb25zb2xlKCk7CisgIGlmIChhY3RpdmUpIHsgYWN0aXZlLmNvbnNvbGUub25JbnB1dChldmVudCk7IH0KK30KKworQ29uc29sZU1hbmFnZXIucHJvdG90eXBlLmhhbmRsZVdoZWVsID0gZnVuY3Rpb24oZXZlbnQpIHsKKyAgbGV0IGFjdGl2ZSA9IHRoaXMuZ2V0QWN0aXZlQ29uc29sZSgpOworICBpZiAoYWN0aXZlKSB7IGFjdGl2ZS5jb25zb2xlLm9uV2hlZWwoZXZlbnQpOyB9Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9kZWJ1Z19jb21tYW5kcy5qcyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L2RlYnVnX2NvbW1hbmRzLmpzCmluZGV4IGU5MTc1NGQuLjhjNDQ1NmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L2RlYnVnX2NvbW1hbmRzLmpzCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L2RlYnVnX2NvbW1hbmRzLmpzCkBAIC0xMywxMTQgKzEzLDExNyBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIGZ1bmN0aW9uIGluaXREZWJ1Z0NvbW1hbmRzKCkgewotICBkZWJ1ZyA9IG5ldyBPYmplY3QoKTsKLSAgZCA9IGRlYnVnOworICBsZXQgZGVidWdDb21tYW5kcyA9IHt9OwogCi0gIGRlYnVnLmN2YWxMaXN0ID0gZnVuY3Rpb24oKSB7CisgIGRlYnVnQ29tbWFuZHMuY3ZhbExpc3QgPSBmdW5jdGlvbigpIHsKICAgICB2YXIgcmVzdWx0ID0gY29uc29sZVZhbHVlcy5saXN0QWxsKCk7Ci0gICAgcHJpbnRUb01lc3NhZ2VMb2cobWVzc2FnZUxvZy5JTlRFUkFDVElWRSwgcmVzdWx0KTsKKyAgICBwcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLklOVEVSQUNUSVZFLCByZXN1bHQpOwogICB9Ci0gIGRlYnVnLmN2YWxMaXN0LnNob3J0SGVscCA9ICdMaXN0IGFsbCByZWdpc3RlcmVkIGNvbnNvbGUgdmFsdWVzLic7Ci0gIGRlYnVnLmN2YWxMaXN0LmxvbmdIZWxwID0KKyAgZGVidWdDb21tYW5kcy5jdmFsTGlzdC5zaG9ydEhlbHAgPSAnTGlzdCBhbGwgcmVnaXN0ZXJlZCBjb25zb2xlIHZhbHVlcy4nOworICBkZWJ1Z0NvbW1hbmRzLmN2YWxMaXN0LmxvbmdIZWxwID0KICAgICAgICdMaXN0IGFsbCByZWdpc3RlcmVkIGNvbnNvbGUgdmFsdWVzIHRoYXQgY2FuIGJlIGRpc3BsYXllZC5cbicgKwogICAgICAgJ1lvdSBjYW4gY2hhbmdlIHdoYXQgc3Vic2V0IGlzIGRpc3BsYXllZCBpbiB0aGUgSFVEIHVzaW5nICcgKwogICAgICAgJ3RoZSBjdmFsQWRkIGFuZCBjdmFsUmVtb3ZlIGRlYnVnIG1ldGhvZHMuJzsKIAotICBkZWJ1Zy5jdmFsQWRkID0gZnVuY3Rpb24oc3Vic3RyaW5nVG9NYXRjaCkgeworICBkZWJ1Z0NvbW1hbmRzLmN2YWxBZGQgPSBmdW5jdGlvbihzdWJzdHJpbmdUb01hdGNoKSB7CiAgICAgdmFyIHJlc3VsdCA9IGNvbnNvbGVWYWx1ZXMuYWRkQWN0aXZlKHN1YnN0cmluZ1RvTWF0Y2gpOwotICAgIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsIHJlc3VsdCk7CisgICAgcHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5JTlRFUkFDVElWRSwgcmVzdWx0KTsKICAgICAvLyBBZnRlciBlYWNoIGNoYW5nZSwgc2F2ZSB0aGUgYWN0aXZlIHNldCB3aXRoIHRoZSBkZWZhdWx0IGtleS4KICAgICB0aGlzLmN2YWxTYXZlKCk7CiAgIH0KLSAgZGVidWcuY3ZhbEFkZC5zaG9ydEhlbHAgPSAnQWRkcyBvbmUgb3IgbW9yZSBjb25zb2xlcyB2YWx1ZSB0byB0aGUgSFVELic7Ci0gIGRlYnVnLmN2YWxBZGQubG9uZ0hlbHAgPQorICBkZWJ1Z0NvbW1hbmRzLmN2YWxBZGQuc2hvcnRIZWxwID0KKyAgICAgICdBZGRzIG9uZSBvciBtb3JlIGNvbnNvbGVzIHZhbHVlIHRvIHRoZSBIVUQuJzsKKyAgZGVidWdDb21tYW5kcy5jdmFsQWRkLmxvbmdIZWxwID0KICAgICAgICdBZGRzIGFueSBvZiB0aGUgcmVnaXN0ZXJlZCBjb25zb2x2ZSB2YWx1ZXMgKGRpc3BsYXllZCB3aXRoIGN2YWxMaXN0KSAnICsKICAgICAgICd0byB0aGUgSFVEIHdob3NlIG5hbWUgbWF0Y2hlcyBvbmUgb2YgdGhlIHNwZWNpZmllZCBzcGFjZS1zZXBhcmF0ZWQgJwogICAgICAgJ3ByZWZpeGVzLic7CiAKLSAgZGVidWcuY3ZhbFJlbW92ZSA9IGZ1bmN0aW9uKHN1YnN0cmluZ1RvTWF0Y2gpIHsKKyAgZGVidWdDb21tYW5kcy5jdmFsUmVtb3ZlID0gZnVuY3Rpb24oc3Vic3RyaW5nVG9NYXRjaCkgewogICAgIHZhciByZXN1bHQgPSBjb25zb2xlVmFsdWVzLnJlbW92ZUFjdGl2ZShzdWJzdHJpbmdUb01hdGNoKTsKLSAgICBwcmludFRvTWVzc2FnZUxvZyhtZXNzYWdlTG9nLklOVEVSQUNUSVZFLCByZXN1bHQpOworICAgIHByaW50VG9NZXNzYWdlTG9nKE1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsIHJlc3VsdCk7CiAgICAgLy8gQWZ0ZXIgZWFjaCBjaGFuZ2UsIHNhdmUgdGhlIGFjdGl2ZSBzZXQgd2l0aCB0aGUgZGVmYXVsdCBrZXkuCiAgICAgdGhpcy5jdmFsU2F2ZSgpOwogICB9Ci0gIGRlYnVnLmN2YWxSZW1vdmUuc2hvcnRIZWxwID0KKyAgZGVidWdDb21tYW5kcy5jdmFsUmVtb3ZlLnNob3J0SGVscCA9CiAgICAgICAnUmVtb3ZlcyBvbmUgb3IgbW9yZSBjb25zb2xlcyB2YWx1ZSBmcm9tIHRoZSBIVUQuJzsKLSAgZGVidWcuY3ZhbFJlbW92ZS5sb25nSGVscCA9CisgIGRlYnVnQ29tbWFuZHMuY3ZhbFJlbW92ZS5sb25nSGVscCA9CiAgICAgICAnUmVtb3ZlcyBhbnkgb2YgdGhlIGNvbnNvbHZlIHZhbHVlcyBkaXNwbGF5ZWQgaW4gdGhlIEhVRCAnICsKICAgICAgICd3aG9zZSBuYW1lIG1hdGNoZXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3BhY2Utc2VwYXJhdGVkIHByZWZpeGVzLic7CiAKLSAgZGVidWcuY3ZhbFNhdmUgPSBmdW5jdGlvbihrZXkpIHsKKyAgZGVidWdDb21tYW5kcy5jdmFsU2F2ZSA9IGZ1bmN0aW9uKGtleSkgewogICAgIHZhciByZXN1bHQgPSBjb25zb2xlVmFsdWVzLnNhdmVBY3RpdmVTZXQoa2V5KTsKLSAgICBwcmludFRvTWVzc2FnZUxvZyhtZXNzYWdlTG9nLklOVEVSQUNUSVZFLCByZXN1bHQpOworICAgIHByaW50VG9NZXNzYWdlTG9nKE1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsIHJlc3VsdCk7CiAgIH0KLSAgZGVidWcuY3ZhbFNhdmUuc2hvcnRIZWxwID0KKyAgZGVidWdDb21tYW5kcy5jdmFsU2F2ZS5zaG9ydEhlbHAgPQogICAgICAgJ1NhdmVzIHRoZSBjdXJyZW50IHNldCBvZiBjb25zb2xlIHZhbHVlcyBkaXNwbGF5ZWQgaW4gdGhlIEhVRC4nOwotICBkZWJ1Zy5jdmFsU2F2ZS5sb25nSGVscCA9CisgIGRlYnVnQ29tbWFuZHMuY3ZhbFNhdmUubG9uZ0hlbHAgPQogICAgICAgJ1NhdmVzIHRoZSBzZXQgb2YgY29uc29sZSB2YWx1ZXMgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgSFVEICcgKwogICAgICAgJ3RvIHdlYiBsb2NhbCBzdG9yYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQga2V5LiBTYXZlZCBkaXNwbGF5IHNldHMgY2FuICcgKwogICAgICAgJ2JlIHJlbG9hZGVkIGxhdGVyIHVzaW5nIHRoZSBjdmFsTG9hZCBkZWJ1ZyBtZXRob2QgYW5kIHRoZSBzYW1lIGtleS5cbicgKwogICAgICAgJ0lmIG5vIGtleSBpcyBzcGVjaWZpZWQsIHVzZXMgYSBkZWZhdWx0IHZhbHVlLic7CiAKLSAgZGVidWcuY3ZhbExvYWQgPSBmdW5jdGlvbihrZXkpIHsKKyAgZGVidWdDb21tYW5kcy5jdmFsTG9hZCA9IGZ1bmN0aW9uKGtleSkgewogICAgIHZhciByZXN1bHQgPSBjb25zb2xlVmFsdWVzLmxvYWRBY3RpdmVTZXQoa2V5KTsKLSAgICBwcmludFRvTWVzc2FnZUxvZyhtZXNzYWdlTG9nLklOVEVSQUNUSVZFLCByZXN1bHQpOworICAgIHByaW50VG9NZXNzYWdlTG9nKE1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsIHJlc3VsdCk7CiAgIH0KLSAgZGVidWcuY3ZhbExvYWQuc2hvcnRIZWxwID0KKyAgZGVidWdDb21tYW5kcy5jdmFsTG9hZC5zaG9ydEhlbHAgPQogICAgICAgJ0xvYWRzIGEgcHJldmlvdXNseSBzdG9yZWQgc2V0IG9mIGNvbnNvbGUgdmFsdWVzIGRpc3BsYXllZCBpbiB0aGUgSFVELic7Ci0gIGRlYnVnLmN2YWxMb2FkLmxvbmdIZWxwID0KKyAgZGVidWdDb21tYW5kcy5jdmFsTG9hZC5sb25nSGVscCA9CiAgICAgICAnTG9hZHMgdGhlIHNldCBvZiBjb25zb2xlIHZhbHVlcyBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSBIVUQgJyArCiAgICAgICAnZnJvbSBhIHNldCBwcmV2aW91c2x5IHNhdmVkIGluIHdlYiBsb2NhbCBzdG9yYWdlIHVzaW5nIHRoZSBjdmFsU2F2ZSAnICsKICAgICAgICdkZWJ1ZyBtZXRob2QgYW5kIHRoZSBzYW1lIGtleS5cbicgKwogICAgICAgJ0lmIG5vIGtleSBpcyBzcGVjaWZpZWQsIHVzZXMgYSBkZWZhdWx0IHZhbHVlLic7CiAKLSAgZGVidWcuaGlzdG9yeSA9IGhpc3Rvcnk7Ci0gIGRlYnVnLmhpc3Rvcnkuc2hvcnRIZWxwID0gJ0Rpc3BsYXkgY29tbWFuZCBoaXN0b3J5Lic7Ci0gIGRlYnVnLmhpc3RvcnkubG9uZ0hlbHAgPQorICBkZWJ1Z0NvbW1hbmRzLmhpc3RvcnkgPSBoaXN0b3J5OworICBkZWJ1Z0NvbW1hbmRzLmhpc3Rvcnkuc2hvcnRIZWxwID0gJ0Rpc3BsYXkgY29tbWFuZCBoaXN0b3J5Lic7CisgIGRlYnVnQ29tbWFuZHMuaGlzdG9yeS5sb25nSGVscCA9CiAgICAgICAnRGlzcGxheSBhIGxpc3Qgb2YgYWxsIHByZXZpb3VzbHkgZXhlY3V0ZWQgY29tbWFuZHMgd2l0aCBhbiAnKwogICAgICAgJ2luZGV4LiBZb3UgY2FuIHJlLWV4ZWN1dGUgYW55IG9mIHRoZSBjb21tYW5kcyBmcm9tIHRoZSAnICsKICAgICAgICdoaXN0b3J5IGJ5IHR5cGluZyAiISIgZm9sbG93ZWQgYnkgdGhlIGluZGV4IG9mIHRoYXQgY29tbWFuZC4nCiAKLSAgZGVidWcuaGVscCA9IGhlbHA7Ci0gIGRlYnVnLmhlbHAuc2hvcnRIZWxwID0gJ0Rpc3BsYXkgdGhpcyBtZXNzYWdlLCBvciBkZXRhaWwgZm9yIGEgc3BlY2lmaWMgY29tbWFuZC4nOwotICBkZWJ1Zy5oZWxwLmxvbmdIZWxwID0KKyAgZGVidWdDb21tYW5kcy5oZWxwID0gaGVscC5iaW5kKHRoaXMsIGRlYnVnQ29tbWFuZHMpOworICBkZWJ1Z0NvbW1hbmRzLmhlbHAuc2hvcnRIZWxwID0KKyAgICAgICdEaXNwbGF5IHRoaXMgbWVzc2FnZSwgb3IgZGV0YWlsIGZvciBhIHNwZWNpZmljIGNvbW1hbmQuJzsKKyAgZGVidWdDb21tYW5kcy5oZWxwLmxvbmdIZWxwID0KICAgICAgICdXaXRoIG5vIGFyZ3VtZW50cywgZGlzcGxheXMgYSBzdW1tYXJ5IG9mIGFsbCBjb21tYW5kcy4gSWYgdGhlIG5hbWUgb2YgJyArCiAgICAgICAnYSBjb21tYW5kIGlzIHNwZWNpZmllZCwgZGlzcGxheXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoYXQgY29tbWFuZC4nOwogCi0gIGRlYnVnLmRpciA9IGRpcjsKLSAgZGVidWcuZGlyLnNob3J0SGVscCA9CisgIGRlYnVnQ29tbWFuZHMuZGlyID0gZGlyOworICBkZWJ1Z0NvbW1hbmRzLmRpci5zaG9ydEhlbHAgPQogICAgICAgJ0xpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBpbiB0aGUgbWFpbiB3ZWIgbW9kdWxlLic7Ci0gIGRlYnVnLmRpci5sb25nSGVscCA9CisgIGRlYnVnQ29tbWFuZHMuZGlyLmxvbmdIZWxwID0KICAgICAgICdMaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbiB0aGUgbWFpbiB3ZWIgbW9kdWxlLiAnICsKICAgICAgICdSZW1lbWJlciB0byBlbmNsb3NlIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgaW4gcXVvdGVzLic7CiAKLSAgZGVidWcuZGVidWdnZXIgPSBmdW5jdGlvbigpIHsKKyAgZGVidWdDb21tYW5kcy5kZWJ1Z2dlciA9IGZ1bmN0aW9uKCkgewogICAgIHJldHVybiBkZWJ1Z2dlckNsaWVudDsKICAgfQotICBkZWJ1Zy5kZWJ1Z2dlci5zaG9ydEhlbHAgPQorICBkZWJ1Z0NvbW1hbmRzLmRlYnVnZ2VyLnNob3J0SGVscCA9CiAgICAgICAnR2V0IHRoZSBkZWJ1Z2dlciBjbGllbnQnOwotICBkZWJ1Zy5kZWJ1Z2dlci5sb25nSGVscCA9CisgIGRlYnVnQ29tbWFuZHMuZGVidWdnZXIubG9uZ0hlbHAgPQogICAgICAgJ0dldCB0aGUgZGVidWdnZXIgY2xpZW50LiBUaGUgZGVidWdnZXIgY2xpZW50IGNhbiBiZSB1c2VkIHRvIGlzc3VlICcgKwogICAgICAgJ0phdmFTY3JpcHQgZGVidWdnaW5nIGNvbW1hbmRzIHRvIHRoZSBtYWluIHdlYiBtb2R1bGUuJzsKIAotICBhZGRDb25zb2xlQ29tbWFuZHMoKTsKKyAgYWRkQ29uc29sZUNvbW1hbmRzKGRlYnVnQ29tbWFuZHMpOworCisgIHJldHVybiBkZWJ1Z0NvbW1hbmRzOwogfQogCi1mdW5jdGlvbiBoZWxwKGNvbW1hbmQpIHsKK2Z1bmN0aW9uIGhlbHAoZGVidWdDb21tYW5kcywgY29tbWFuZCkgewogICB2YXIgaGVscFN0cmluZyA9ICcnOwogICBpZiAoY29tbWFuZCkgewogICAgIC8vIERldGFpbGVkIGhlbHAgb24gYSBzcGVjaWZpYyBjb21tYW5kLgotICAgIGlmIChkZWJ1Z1tjb21tYW5kXSkgewotICAgICAgaGVscFN0cmluZyA9IGRlYnVnW2NvbW1hbmRdLmxvbmdIZWxwOworICAgIGlmIChkZWJ1Z0NvbW1hbmRzW2NvbW1hbmRdKSB7CisgICAgICBoZWxwU3RyaW5nID0gZGVidWdDb21tYW5kc1tjb21tYW5kXS5sb25nSGVscDsKICAgICB9IGVsc2UgewogICAgICAgaGVscFN0cmluZyA9ICdDb21tYW5kICInICsgY29tbWFuZCArICciIG5vdCBmb3VuZC4nOwogICAgIH0KICAgfSBlbHNlIHsKICAgICAvLyBTdW1tYXJ5IGhlbHAgZm9yIGFsbCBjb21tYW5kcy4KICAgICBoZWxwU3RyaW5nID0gJ0NvYmFsdCBEZWJ1ZyBDb25zb2xlIGNvbW1hbmRzOlxuXG4nOwotICAgIGZvciAoY21kIGluIGRlYnVnKSB7CisgICAgZm9yIChjbWQgaW4gZGVidWdDb21tYW5kcykgewogICAgICAgaGVscFN0cmluZyArPSAnZGVidWcuJyArIGNtZCArICcoKSAtICc7Ci0gICAgICBoZWxwU3RyaW5nICs9IGRlYnVnW2NtZF0uc2hvcnRIZWxwICsgJ1xuJzsKKyAgICAgIGhlbHBTdHJpbmcgKz0gZGVidWdDb21tYW5kc1tjbWRdLnNob3J0SGVscCArICdcbic7CiAgICAgfQogICAgIGhlbHBTdHJpbmcgKz0KICAgICAgICAgJ1xuWW91IGFyZSBlbnRlcmluZyBKYXZhU2NyaXB0LCBzbyByZW1lbWJlciB0byB1c2UgcGFyZW50aGVzZXMsICcgKwpAQCAtMTI5LDEzICsxMzIsMTMgQEAKICAgICAgICAgJ0FsbCBvdGhlciB0ZXh0IHdpbGwgYmUgZXhlY3V0ZWQgYXMgSmF2YVNjcmlwdCBpbiB0aGUgbWFpbiB3ZWIgJyArCiAgICAgICAgICdtb2R1bGUuXG4nOwogICB9Ci0gIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsIGhlbHBTdHJpbmcpOworICBwcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLklOVEVSQUNUSVZFLCBoZWxwU3RyaW5nKTsKIH0KIAogZnVuY3Rpb24gaGlzdG9yeSgpIHsKICAgdmFyIGhpc3RvcnkgPSBjb21tYW5kSW5wdXQuZ2V0SGlzdG9yeSgpOwogICBmb3IgKHZhciBpID0gMDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpICs9IDEpIHsKLSAgICBwcmludFRvTWVzc2FnZUxvZyhtZXNzYWdlTG9nLklOVEVSQUNUSVZFLCBpICsgJyAnICsgaGlzdG9yeVtpXSk7CisgICAgcHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5JTlRFUkFDVElWRSwgaSArICcgJyArIGhpc3RvcnlbaV0pOwogICB9CiB9CiAKQEAgLTE0OCwxOCArMTUxLDE4IEBACiAgIGV4ZWN1dGVNYWluKGpzKTsKIH0KIAotZnVuY3Rpb24gYWRkQ29uc29sZUNvbW1hbmRzKCkgeworZnVuY3Rpb24gYWRkQ29uc29sZUNvbW1hbmRzKGRlYnVnQ29tbWFuZHMpIHsKICAgdmFyIGNvbnNvbGVDb21tYW5kcyA9IHdpbmRvdy5kZWJ1Z0h1Yi5jb25zb2xlQ29tbWFuZHM7CiAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uc29sZUNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7CiAgICAgdmFyIGMgPSBjb25zb2xlQ29tbWFuZHNbaV07Ci0gICAgYWRkT25lQ29uc29sZUNvbW1hbmQoYy5jb21tYW5kLCBjLnNob3J0SGVscCwgYy5sb25nSGVscCk7CisgICAgYWRkT25lQ29uc29sZUNvbW1hbmQoZGVidWdDb21tYW5kcywgYy5jb21tYW5kLCBjLnNob3J0SGVscCwgYy5sb25nSGVscCk7CiAgIH0KIH0KIAotZnVuY3Rpb24gYWRkT25lQ29uc29sZUNvbW1hbmQoY29tbWFuZCwgc2hvcnRIZWxwLCBsb25nSGVscCkgewotICBkZWJ1Z1tjb21tYW5kXSA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKK2Z1bmN0aW9uIGFkZE9uZUNvbnNvbGVDb21tYW5kKGRlYnVnQ29tbWFuZHMsIGNvbW1hbmQsIHNob3J0SGVscCwgbG9uZ0hlbHApIHsKKyAgZGVidWdDb21tYW5kc1tjb21tYW5kXSA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICB3aW5kb3cuZGVidWdIdWIuc2VuZENvbnNvbGVDb21tYW5kKGNvbW1hbmQsIG1lc3NhZ2UpOwogICB9Ci0gIGRlYnVnW2NvbW1hbmRdLnNob3J0SGVscCA9IHNob3J0SGVscDsKLSAgZGVidWdbY29tbWFuZF0ubG9uZ0hlbHAgPSBsb25nSGVscDsKKyAgZGVidWdDb21tYW5kc1tjb21tYW5kXS5zaG9ydEhlbHAgPSBzaG9ydEhlbHA7CisgIGRlYnVnQ29tbWFuZHNbY29tbWFuZF0ubG9uZ0hlbHAgPSBsb25nSGVscDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L2RlYnVnX2NvbnNvbGUuY3NzIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvZGVidWdfY29uc29sZS5jc3MKaW5kZXggZDBjY2M0ZC4uZjA4N2YyNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvZGVidWdfY29uc29sZS5jc3MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvZGVidWdfY29uc29sZS5jc3MKQEAgLTEyLDYgKzEyLDkgQEAKICAgY29sb3I6ICNGRkZGRkY7CiAgIGRpc3BsYXk6IG5vbmU7CiB9Citib2R5Lmh1ZCAjaHVkRnJhbWUgeworICBkaXNwbGF5OiBibG9jazsKK30KIAogI2h1ZCB7CiAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKQEAgLTI3LDcgKzMwLDcgQEAKICAgcGFkZGluZzogMC42MjVlbTsKIH0KIAotI2NvbnNvbGVGcmFtZSB7CisjZGVidWdDb25zb2xlRnJhbWUgewogICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgIHRvcDogMDsKICAgbGVmdDogMDsKQEAgLTM4LDYgKzQxLDkgQEAKICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgZGlzcGxheTogbm9uZTsKIH0KK2JvZHkuZGVidWdDb25zb2xlICNkZWJ1Z0NvbnNvbGVGcmFtZSB7CisgIGRpc3BsYXk6IGJsb2NrOworfQogCiAjbWVzc2FnZUNvbnRhaW5lckZyYW1lIHsKICAgcG9zaXRpb246IGFic29sdXRlOwpAQCAtMTIyLDMgKzEyOCwzMyBAQAogICBib3JkZXItc3R5bGU6IHNvbGlkOwogICBwYWRkaW5nOiAwLjYyNWVtOwogfQorCisjbWVkaWFDb25zb2xlRnJhbWUgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogNzUlOworICBsZWZ0OiAwOworICBib3R0b206IDA7CisgIHJpZ2h0OiAwOworICB3aWR0aDogMTAwJTsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMjgsIDEyOCwgMTI4LCAwLjYpOworICBjb2xvcjogI0ZGRkZGRjsKKyAgZGlzcGxheTogbm9uZTsKK30KK2JvZHkubWVkaWFDb25zb2xlICNtZWRpYUNvbnNvbGVGcmFtZSB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjbWVkaWFDb25zb2xlIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IDAuNjI1ZW07CisgIGxlZnQ6IDAuNjI1ZW07CisgIGJvdHRvbTogMC42MjVlbTsKKyAgcmlnaHQ6IDAuNjI1ZW07CisgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsKKyAgY29sb3I6ICNGRkZGRkY7CisgIGJvcmRlcjogMC4wNjI1ZW07CisgIGJvcmRlci1jb2xvcjogIzYwNjA2MDsKKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKKyAgcGFkZGluZzogMC42MjVlbTsKKyAgd2hpdGUtc3BhY2U6IHByZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L2RlYnVnX2NvbnNvbGUuaHRtbCBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L2RlYnVnX2NvbnNvbGUuaHRtbAppbmRleCBhNjBjNmU0Li5iYWVkMmZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9kZWJ1Z19jb25zb2xlLmh0bWwKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvZGVidWdfY29uc29sZS5odG1sCkBAIC01LDIzICs1LDI4IEBACiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImRlYnVnX2NvbnNvbGUuY3NzIj4KIDwvaGVhZD4KIAorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iY29uc29sZV9tYW5hZ2VyLmpzIj48L3NjcmlwdD4KIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRlYnVnX2NvbnNvbGUuanMiPjwvc2NyaXB0PgogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iY29uc29sZV92YWx1ZXMuanMiPjwvc2NyaXB0PgogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibWVzc2FnZV9sb2cuanMiPjwvc2NyaXB0PgogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iY29tbWFuZF9pbnB1dC5qcyI+PC9zY3JpcHQ+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJkZWJ1Z19jb21tYW5kcy5qcyI+PC9zY3JpcHQ+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJkZWJ1Z2dlcl9jbGllbnQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibWVkaWFfY29uc29sZS5qcyI+PC9zY3JpcHQ+CiAKIDxib2R5PgogICA8ZGl2IGlkPSJodWRGcmFtZSI+CiAgICAgPGRpdiBpZD0iaHVkIj48L2Rpdj4KICAgPC9kaXY+Ci0gIDxkaXYgaWQ9ImNvbnNvbGVGcmFtZSI+CisgIDxkaXYgaWQ9ImRlYnVnQ29uc29sZUZyYW1lIj4KICAgICA8ZGl2IGlkPSJtZXNzYWdlQ29udGFpbmVyRnJhbWUiPgotICAgICAgPGRpdiBpZCA9ICJtZXNzYWdlQ29udGFpbmVyIj48L2Rpdj4KKyAgICAgIDxkaXYgaWQ9Im1lc3NhZ2VDb250YWluZXIiPjwvZGl2PgogICAgIDwvZGl2PgogICAgIDxkaXYgaWQ9ImluIj4+IF88L2Rpdj4KICAgPC9kaXY+CisgIDxkaXYgaWQ9Im1lZGlhQ29uc29sZUZyYW1lIj4KKyAgICA8ZGl2IGlkPSJtZWRpYUNvbnNvbGUiPjwvZGl2PgorICA8L2Rpdj4KIDwvYm9keT4KIAogPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvZGVidWdfY29uc29sZS5qcyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L2RlYnVnX2NvbnNvbGUuanMKaW5kZXggZTEwMjhkNS4uMDg4Yjc0NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvZGVidWdfY29uc29sZS5qcworKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9kZWJ1Z19jb25zb2xlLmpzCkBAIC0xMiwxNzEgKzEyLDc4IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotCi0vLyBUZXh0IHRoZSB1c2VyIGhhcyB0eXBlZCBzaW5jZSBsYXN0IGhpdHRpbmcgRW50ZXIKLXZhciBpbnB1dFRleHQgPSAnJzsKLS8vIFRoZSBET00gbm9kZSB1c2VkIGFzIGEgY29udGFpbmVyIGZvciBtZXNzYWdlIG5vZGVzLgotdmFyIG1lc3NhZ2VMb2cgPSBudWxsOwotLy8gU3RvcmVzIGFuZCBtYW5pcHVsYXRlcyB0aGUgc2V0IG9mIGNvbnNvbGUgdmFsdWVzLgotdmFyIGNvbnNvbGVWYWx1ZXMgPSBudWxsOwotLy8gSGFuZGxlcyBjb21tYW5kIGlucHV0LCBlZGl0aW5nLCBoaXN0b3J5IHRyYXZlcnNhbCwgZXRjLgotdmFyIGNvbW1hbmRJbnB1dCA9IG51bGw7Ci0vLyBPYmplY3QgdG8gc3RvcmUgbWV0aG9kcyB0byBiZSBleGVjdXRlZCBpbiB0aGUgZGVidWcgY29uc29sZS4KLXZhciBkZWJ1ZyA9IG51bGw7Ci0vLyBTaG9ydGhhbmQgcmVmZXJlbmNlIGZvciB0aGUgZGVidWcgb2JqZWN0LgotdmFyIGQgPSBudWxsOwotLy8gSGFuZGxlcyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRlYnVnZ2VyLgotdmFyIGRlYnVnZ2VyQ2xpZW50ID0gbnVsbDsKLS8vIE51bWJlciBvZiBhbmltYXRpb24gZnJhbWUgc2FtcGxlcyBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuCi12YXIgYW5pbWF0aW9uRnJhbWVTYW1wbGVzID0gMDsKLQotLy8gTWFwIG9mICdVbmlkZW50aWZpZWQnIGFkZGl0aW9uYWwgQ29iYWx0IGtleUNvZGVzIHRvIGVxdWl2YWxlbnQga2V5cy4KLXZhciB1bmlkZW50aWZpZWRDb2JhbHRLZXlNYXAgPSB7Ci0gIC8vIGtTYktleUdhbWVwYWQxCi0gIDB4ODAwMDogJ0VudGVyJywKLSAgLy8ga1NiS2V5R2FtZXBhZDIKLSAgMHg4MDAxOiAnRXNjJywKLSAgLy8ga1NiS2V5R2FtZXBhZDMKLSAgMHg4MDAyOiAnSG9tZScsCi0gIC8vIGtTYktleUdhbWVwYWQ1Ci0gIDB4ODAwODogJ0VudGVyJywKLSAgLy8ga1NiS2V5R2FtZXBhZDYKLSAgMHg4MDA5OiAnRW50ZXInLAotICAvLyBrU2JLZXlHYW1lcGFkRFBhZFVwCi0gIDB4ODAwQzogJ0Fycm93VXAnLAotICAvLyBrU2JLZXlHYW1lcGFkRFBhZERvd24KLSAgMHg4MDBEOiAnQXJyb3dEb3duJywKLSAgLy8ga1NiS2V5R2FtZXBhZERQYWRMZWZ0Ci0gIDB4ODAwRTogJ0Fycm93TGVmdCcsCi0gIC8vIGtTYktleUdhbWVwYWREUGFkUmlnaHQKLSAgMHg4MDBGOiAnQXJyb3dSaWdodCcsCi0gIC8vIGtTYktleUdhbWVwYWRMZWZ0U3RpY2tVcAotICAweDgwMTE6ICdBcnJvd1VwJywKLSAgLy8ga1NiS2V5R2FtZXBhZExlZnRTdGlja0Rvd24KLSAgMHg4MDEyOiAnQXJyb3dEb3duJywKLSAgLy8ga1NiS2V5R2FtZXBhZExlZnRTdGlja0xlZnQKLSAgMHg4MDEzOiAnQXJyb3dMZWZ0JywKLSAgLy8ga1NiS2V5R2FtZXBhZExlZnRTdGlja1JpZ2h0Ci0gIDB4ODAxNDogJ0Fycm93UmlnaHQnLAotICAvLyBrU2JLZXlHYW1lcGFkUmlnaHRTdGlja1VwCi0gIDB4ODAxNTogJ0Fycm93VXAnLAotICAvLyBrU2JLZXlHYW1lcGFkUmlnaHRTdGlja0Rvd24KLSAgMHg4MDE2OiAnQXJyb3dEb3duJywKLSAgLy8ga1NiS2V5R2FtZXBhZFJpZ2h0U3RpY2tMZWZ0Ci0gIDB4ODAxNzogJ0Fycm93TGVmdCcsCi0gIC8vIGtTYktleUdhbWVwYWRSaWdodFN0aWNrUmlnaHQKLSAgMHg4MDE4OiAnQXJyb3dSaWdodCcKLX07Ci0KLWZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VMb2coKSB7Ci0gIHZhciBtZXNzYWdlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2VDb250YWluZXInKTsKLSAgbWVzc2FnZUxvZyA9IG5ldyBNZXNzYWdlTG9nKG1lc3NhZ2VDb250YWluZXIpOwotfQotCi1mdW5jdGlvbiBjcmVhdGVDb21tYW5kSW5wdXQoKSB7Ci0gIHZhciBpbnB1dEVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW4nKTsKLSAgdGhpcy5jb21tYW5kSW5wdXQgPSBuZXcgQ29tbWFuZElucHV0KGlucHV0RWxlbSk7Ci19Ci0KLWZ1bmN0aW9uIGNyZWF0ZUNvbnNvbGVWYWx1ZXMoKSB7Ci0gIC8vIENyZWF0ZSB0aGUgY29uc29sZSB2YWx1ZXMgYW5kIGF0dGVtcHQgdG8gbG9hZCB0aGUgYWN0aXZlIHNldCB1c2luZyB0aGUKLSAgLy8gZGVmYXVsdCBrZXkuIElmIHRoaXMgZmFpbHMsIGl0IHdpbGwgbGVhdmUgdGhlIGFjdGl2ZSBzZXQgZXF1YWwgdG8gdGhlCi0gIC8vIGFsbCByZWdpc3RlcmVkIENWYWxzLgotICBjb25zb2xlVmFsdWVzID0gbmV3IENvbnNvbGVWYWx1ZXMoKTsKLSAgdmFyIGxvYWRSZXN1bHQgPSBjb25zb2xlVmFsdWVzLmxvYWRBY3RpdmVTZXQoKTsKLSAgcHJpbnRUb01lc3NhZ2VMb2cobWVzc2FnZUxvZy5JTlRFUkFDVElWRSwgbG9hZFJlc3VsdCk7Ci19Ci0KLWZ1bmN0aW9uIGNyZWF0ZURlYnVnZ2VyQ2xpZW50KCkgewotICBkZWJ1Z2dlckNsaWVudCA9IG5ldyBEZWJ1Z2dlckNsaWVudCgpOwotfQotCi1mdW5jdGlvbiBzaG93QmxvY2tFbGVtKGVsZW0sIGRvU2hvdykgewotICBpZiAoZWxlbSkgewotICAgIHZhciBkaXNwbGF5ID0gZG9TaG93ID8gJ2Jsb2NrJyA6ICdub25lJzsKLSAgICBpZiAoZWxlbS5zdHlsZS5kaXNwbGF5ICE9IGRpc3BsYXkpIHsKLSAgICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7Ci0gICAgfQorLy8gR2xvYmFsIGZvciBvdGhlciBtb2R1bGVzIHRvIHVzZS4KK2Z1bmN0aW9uIHByaW50VG9NZXNzYWdlTG9nKHNldmVyaXR5LCBtZXNzYWdlKSB7CisgIGlmICh3aW5kb3cuZGVidWdDb25zb2xlSW5zdGFuY2UpIHsKKyAgICB3aW5kb3cuZGVidWdDb25zb2xlSW5zdGFuY2UucHJpbnRUb01lc3NhZ2VMb2coc2V2ZXJpdHksIG1lc3NhZ2UpOwogICB9CiB9CiAKLWZ1bmN0aW9uIHNob3dDb25zb2xlKGRvU2hvdykgewotICBzaG93QmxvY2tFbGVtKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25zb2xlRnJhbWUnKSwgZG9TaG93KTsKLSAgbWVzc2FnZUxvZy5zZXRWaXNpYmxlKGRvU2hvdyk7CitmdW5jdGlvbiBEZWJ1Z0NvbnNvbGUoZGVidWdnZXJDbGllbnQpIHsKKyAgd2luZG93LmRlYnVnQ29uc29sZUluc3RhbmNlID0gdGhpczsKKworICB0aGlzLmRlYnVnZ2VyQ2xpZW50ID0gZGVidWdnZXJDbGllbnQ7CisgIC8vIFRleHQgdGhlIHVzZXIgaGFzIHR5cGVkIHNpbmNlIGxhc3QgaGl0dGluZyBFbnRlcgorICB0aGlzLmlucHV0VGV4dCA9ICcnOworCisgIHRoaXMuY29tbWFuZElucHV0ID0gbmV3IENvbW1hbmRJbnB1dChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW4nKSk7CisgIHRoaXMubWVzc2FnZUxvZyA9IG5ldyBNZXNzYWdlTG9nKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlQ29udGFpbmVyJykpOworCisgIHRoaXMuY29uc29sZVZhbHVlcyA9IG5ldyBDb25zb2xlVmFsdWVzKCk7CisgIGxldCBsb2FkUmVzdWx0ID0gdGhpcy5jb25zb2xlVmFsdWVzLmxvYWRBY3RpdmVTZXQoKTsKKyAgdGhpcy5wcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLklOVEVSQUNUSVZFLCBsb2FkUmVzdWx0KTsKKworICB0aGlzLmRlYnVnQ29tbWFuZHMgPSBpbml0RGVidWdDb21tYW5kcygpOwogfQogCi1mdW5jdGlvbiBpc0NvbnNvbGVWaXNpYmxlKCkgewotICB2YXIgbW9kZSA9IHdpbmRvdy5kZWJ1Z0h1Yi5nZXREZWJ1Z0NvbnNvbGVNb2RlKCk7Ci0gIHJldHVybiBtb2RlID49IHdpbmRvdy5kZWJ1Z0h1Yi5ERUJVR19DT05TT0xFX09OOworRGVidWdDb25zb2xlLnByb3RvdHlwZS5wcmludFRvTWVzc2FnZUxvZyA9IGZ1bmN0aW9uKHNldmVyaXR5LCBtZXNzYWdlKSB7CisgIHRoaXMubWVzc2FnZUxvZy5hZGRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlKTsKIH0KIAotZnVuY3Rpb24gcHJpbnRUb01lc3NhZ2VMb2coc2V2ZXJpdHksIG1lc3NhZ2UpIHsKLSAgbWVzc2FnZUxvZy5hZGRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlKTsKLX0KLQotZnVuY3Rpb24gc2hvd0h1ZChkb1Nob3cpIHsKLSAgc2hvd0Jsb2NrRWxlbShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaHVkRnJhbWUnKSwgZG9TaG93KTsKLX0KLQotZnVuY3Rpb24gcHJpbnRUb0h1ZChtZXNzYWdlKSB7Ci0gIHZhciBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2h1ZCcpOworRGVidWdDb25zb2xlLnByb3RvdHlwZS5wcmludFRvSHVkID0gZnVuY3Rpb24obWVzc2FnZSkgeworICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdodWQnKTsKICAgZWxlbS50ZXh0Q29udGVudCA9IG1lc3NhZ2U7CiB9CiAKLWZ1bmN0aW9uIHVwZGF0ZUh1ZCh0aW1lKSB7Ci0gIHZhciBtb2RlID0gd2luZG93LmRlYnVnSHViLmdldERlYnVnQ29uc29sZU1vZGUoKTsKLSAgaWYgKG1vZGUgPj0gd2luZG93LmRlYnVnSHViLkRFQlVHX0NPTlNPTEVfSFVEKSB7Ci0gICAgY29uc29sZVZhbHVlcy51cGRhdGUoKTsKLSAgICB2YXIgY3ZhbFN0cmluZyA9IGNvbnNvbGVWYWx1ZXMudG9TdHJpbmcoKTsKLSAgICBwcmludFRvSHVkKGN2YWxTdHJpbmcpOwotICB9CitEZWJ1Z0NvbnNvbGUucHJvdG90eXBlLnVwZGF0ZUh1ZCA9IGZ1bmN0aW9uKCkgeworICBsZXQgbW9kZSA9IHdpbmRvdy5kZWJ1Z0h1Yi5nZXREZWJ1Z0NvbnNvbGVNb2RlKCk7CisgIHRoaXMuY29uc29sZVZhbHVlcy51cGRhdGUoKTsKKyAgbGV0IGN2YWxTdHJpbmcgPSB0aGlzLmNvbnNvbGVWYWx1ZXMudG9TdHJpbmcoKTsKKyAgdGhpcy5wcmludFRvSHVkKGN2YWxTdHJpbmcpOwogfQogCi1mdW5jdGlvbiB1cGRhdGVNb2RlKCkgewotICB2YXIgbW9kZSA9IHdpbmRvdy5kZWJ1Z0h1Yi5nZXREZWJ1Z0NvbnNvbGVNb2RlKCk7Ci0gIHNob3dDb25zb2xlKG1vZGUgPj0gd2luZG93LmRlYnVnSHViLkRFQlVHX0NPTlNPTEVfT04pOwotICBzaG93SHVkKG1vZGUgPj0gd2luZG93LmRlYnVnSHViLkRFQlVHX0NPTlNPTEVfSFVEKTsKK0RlYnVnQ29uc29sZS5wcm90b3R5cGUuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uKHZpc2libGUpIHsKKyAgdGhpcy5tZXNzYWdlTG9nLnNldFZpc2libGUodmlzaWJsZSk7CiB9CiAKLS8vIEFuaW1hdGlvbiBjYWxsYmFjazogdXBkYXRlcyBzdGF0ZSBhbmQgYW5pbWF0ZWQgbm9kZXMuCi1mdW5jdGlvbiBhbmltYXRlKHRpbWUpIHsKLSAgdmFyIHN1YnNhbXBsZSA9IDg7Ci0gIGFuaW1hdGlvbkZyYW1lU2FtcGxlcyA9IChhbmltYXRpb25GcmFtZVNhbXBsZXMgKyAxKSAlIHN1YnNhbXBsZTsKLSAgaWYgKGFuaW1hdGlvbkZyYW1lU2FtcGxlcyA9PSAwKSB7Ci0gICAgdXBkYXRlTW9kZSgpOwotICAgIHVwZGF0ZUh1ZCh0aW1lKTsKLSAgICBpZiAoaXNDb25zb2xlVmlzaWJsZSgpKSB7Ci0gICAgICBjb21tYW5kSW5wdXQuYW5pbWF0ZUJsaW5rKCk7Ci0gICAgICAvLyBUaGlzIHdpbGwgZG8gbm90aGluZyBpZiBkZWJ1Z2dlciBpcyBhbHJlYWR5IGF0dGFjaGVkLgotICAgICAgZGVidWdnZXJDbGllbnQuYXR0YWNoKCk7Ci0gICAgfQotICB9Ci0gIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7CitEZWJ1Z0NvbnNvbGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmNvbW1hbmRJbnB1dC5hbmltYXRlQmxpbmsoKTsKKyAgdGhpcy51cGRhdGVIdWQoKTsKIH0KIAogLy8gRXhlY3V0ZXMgYSBjb21tYW5kIGZyb20gdGhlIGhpc3RvcnkgYnVmZmVyLgogLy8gSW5kZXggc2hvdWxkIGJlIGFuIGludGVnZXIgKHBvc2l0aXZlIGlzIGFuIGFic29sdXRlIGluZGV4LCBuZWdhdGl2ZSBpcyBhCiAvLyBudW1iZXIgb2YgY29tbWFuZHMgYmFjayBmcm9tIHRoZSBjdXJyZW50KSBvciAnIScgdG8gZXhlY3V0ZSB0aGUgbGFzdCBjb21tYW5kLgotZnVuY3Rpb24gZXhlY3V0ZUNvbW1hbmRGcm9tSGlzdG9yeShpZHgpIHsKK0RlYnVnQ29uc29sZS5wcm90b3R5cGUuZXhlY3V0ZUNvbW1hbmRGcm9tSGlzdG9yeSA9IGZ1bmN0aW9uKGlkeCkgewogICBpZiAoaWR4ID09ICchJykgewogICAgIGlkeCA9IC0xOwogICB9CiAgIGlkeCA9IHBhcnNlSW50KGlkeCk7Ci0gIGNvbW1hbmRJbnB1dC5zZXRDdXJyZW50Q29tbWFuZEZyb21IaXN0b3J5KGlkeCk7Ci0gIGV4ZWN1dGVDdXJyZW50Q29tbWFuZCgpOworICB0aGlzLmNvbW1hbmRJbnB1dC5zZXRDdXJyZW50Q29tbWFuZEZyb21IaXN0b3J5KGlkeCk7CisgIHRoaXMuZXhlY3V0ZUN1cnJlbnRDb21tYW5kKCk7CiB9CiAKIC8vIFNwZWNpYWwgY29tbWFuZHMgdGhhdCBhcmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHksIG5vdCBhcyBKYXZhU2NyaXB0LAogLy8gZS5nLiAhTiB0byBleGVjdXRlIHRoZSBOdGggY29tbWFuZCBpbiB0aGUgaGlzdG9yeSBidWZmZXIuCiAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbW1hbmQgaXMgcHJvY2Vzc2VkIGhlcmUsIGZhbHNlIG90aGVyd2lzZS4KLWZ1bmN0aW9uIGV4ZWN1dGVJbW1lZGlhdGUoY29tbWFuZCkgeworRGVidWdDb25zb2xlLnByb3RvdHlwZS5leGVjdXRlSW1tZWRpYXRlID0gZnVuY3Rpb24oY29tbWFuZCkgewogICBpZiAoY29tbWFuZFswXSA9PSAnIScpIHsKLSAgICBleGVjdXRlQ29tbWFuZEZyb21IaXN0b3J5KGNvbW1hbmQuc3Vic3RyaW5nKDEpKTsKKyAgICB0aGlzLmV4ZWN1dGVDb21tYW5kRnJvbUhpc3RvcnkoY29tbWFuZC5zdWJzdHJpbmcoMSkpOwogICAgIHJldHVybiB0cnVlOwogICB9IGVsc2UgaWYgKGNvbW1hbmQudHJpbSgpID09ICdoZWxwJykgewogICAgIC8vIFRyZWF0ICdoZWxwJyBhcyBhIHNwZWNpYWwgY2FzZSBmb3IgdXNlcnMgbm90IGV4cGVjdGluZyBKUyBleGVjdXRpb24uCiAgICAgaGVscCgpOwotICAgIGNvbW1hbmRJbnB1dC5jbGVhckN1cnJlbnRDb21tYW5kKCk7CisgICAgdGhpcy5jb21tYW5kSW5wdXQuY2xlYXJDdXJyZW50Q29tbWFuZCgpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAgIHJldHVybiBmYWxzZTsKQEAgLTE4NSw5ICs5MiwxMSBAQAogLy8gSmF2YVNjcmlwdCBjb21tYW5kcyBleGVjdXRlZCBpbiB0aGlzIChkZWJ1ZyBjb25zb2xlKSB3ZWIgbW9kdWxlLgogLy8gVGhlIG9ubHkgY29tbWFuZHMgd2UgZXhlY3V0ZSBoZXJlIGFyZSBtZXRob2RzIG9mIHRoZSBkZWJ1ZyBvYmplY3QKIC8vIChvciBpdHMgc2hvcnRoYW5kIGVxdWl2YWxlbnQpLgotZnVuY3Rpb24gZXhlY3V0ZURlYnVnKGNvbW1hbmQpIHsKK0RlYnVnQ29uc29sZS5wcm90b3R5cGUuZXhlY3V0ZURlYnVnID0gZnVuY3Rpb24oY29tbWFuZCkgewogICBpZiAoY29tbWFuZC50cmltKCkuaW5kZXhPZignZGVidWcuJykgPT0gMCB8fAogICAgICAgY29tbWFuZC50cmltKCkuaW5kZXhPZignZC4nKSA9PSAwKSB7CisgICAgbGV0IGRlYnVnID0gdGhpcy5kZWJ1Z0NvbW1hbmRzOworICAgIGxldCBkID0gdGhpcy5kZWJ1Z0NvbW1hbmRzOwogICAgIGV2YWwoY29tbWFuZCk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTE5Nyw4ICsxMDYsOSBAQAogLy8gRXhlY3V0ZSBhIGNvbW1hbmQgYXMgSmF2YVNjcmlwdCBpbiB0aGUgbWFpbiB3ZWIgbW9kdWxlLgogLy8gVXNlIHRoZSBkZWJ1Z2dlciBldmFsdWF0ZSBjb21tYW5kLCB3aGljaCBnaXZlcyB1cyBDb21tYW5kIExpbmUgQVBJIGFjY2VzcwogLy8gYW5kIHJpY2ggcmVzdWx0cyB3aXRoIG9iamVjdCBwcmV2aWV3LgotZnVuY3Rpb24gZXhlY3V0ZU1haW4oY29tbWFuZCkgewotICBkZWJ1Z2dlckNsaWVudC5ldmFsdWF0ZShjb21tYW5kKTsKK0RlYnVnQ29uc29sZS5wcm90b3R5cGUuZXhlY3V0ZU1haW4gPSBmdW5jdGlvbihjb21tYW5kKSB7CisgIGxldCBjYWxsYmFjayA9IHRoaXMucHJpbnRUb0xvZ0NhbGxiYWNrLmJpbmQodGhpcyk7CisgIHRoaXMuZGVidWdnZXJDbGllbnQuZXZhbHVhdGUoY29tbWFuZCwgY2FsbGJhY2spOwogfQogCiAvLyBFeGVjdXRlcyBhIGNvbW1hbmQgZW50ZXJlZCBieSB0aGUgdXNlci4KQEAgLTIwOCwxMTggKzExOCwxMTIgQEAKIC8vIDMuIElmIG5vIG1hdGNoaW5nIGNvbW1hbmQgaXMgZm91bmQsIHBhc3MgdG8gdGhlIENvYmFsdCBEZWJ1Z0h1Yi4KIC8vICAgIERlYnVnSHViIHdpbGwgZXhlY3V0ZSBhbnkgY29tbWFuZHMgcmVjb2duaXplZCBvbiB0aGUgQysrIHNpZGUsCiAvLyAgICBvciBwYXNzIHRvIHRoZSBtYWluIHdlYiBtb2R1bGUgdG8gYmUgZXhlY3V0ZWQgYXMgSmF2YVNjcmlwdC4KLWZ1bmN0aW9uIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpIHsKLSAgaWYgKGV4ZWN1dGVJbW1lZGlhdGUoY29tbWFuZCkpIHsKLSAgICBwcmludFRvTWVzc2FnZUxvZyhtZXNzYWdlTG9nLklOVEVSQUNUSVZFLCAnJyk7CitEZWJ1Z0NvbnNvbGUucHJvdG90eXBlLmV4ZWN1dGVDb21tYW5kID0gZnVuY3Rpb24oY29tbWFuZCkgeworICBpZiAodGhpcy5leGVjdXRlSW1tZWRpYXRlKGNvbW1hbmQpKSB7CisgICAgdGhpcy5wcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLklOVEVSQUNUSVZFLCAnJyk7CiAgICAgcmV0dXJuOwogICB9Ci0gIGNvbW1hbmRJbnB1dC5zdG9yZUFuZENsZWFyQ3VycmVudENvbW1hbmQoKTsKLSAgaWYgKGV4ZWN1dGVEZWJ1Zyhjb21tYW5kKSkgewotICAgIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsICcnKTsKKyAgdGhpcy5jb21tYW5kSW5wdXQuc3RvcmVBbmRDbGVhckN1cnJlbnRDb21tYW5kKCk7CisgIGlmICh0aGlzLmV4ZWN1dGVEZWJ1Zyhjb21tYW5kKSkgeworICAgIHRoaXMucHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5JTlRFUkFDVElWRSwgJycpOwogICAgIHJldHVybjsKICAgfQotICBleGVjdXRlTWFpbihjb21tYW5kKTsKKyAgdGhpcy5leGVjdXRlTWFpbihjb21tYW5kKTsKIH0KIAogLy8gRXhlY3V0ZXMgdGhlIGN1cnJlbnQgY29tbWFuZCBpbiB0aGUgQ29tbWFuZElucHV0IG9iamVjdC4KIC8vIFR5cGljYWxseSBjYWxsZWQgd2hlbiB0aGUgdXNlciBoaXRzIEVudGVyLgotZnVuY3Rpb24gZXhlY3V0ZUN1cnJlbnRDb21tYW5kKCkgewotICB2YXIgY29tbWFuZCA9IGNvbW1hbmRJbnB1dC5nZXRDdXJyZW50Q29tbWFuZCgpOwotICBwcmludFRvTWVzc2FnZUxvZyhtZXNzYWdlTG9nLklOVEVSQUNUSVZFLCAnPiAnICsgY29tbWFuZCk7Ci0gIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOworRGVidWdDb25zb2xlLnByb3RvdHlwZS5leGVjdXRlQ3VycmVudENvbW1hbmQgPSBmdW5jdGlvbigpIHsKKyAgbGV0IGNvbW1hbmQgPSB0aGlzLmNvbW1hbmRJbnB1dC5nZXRDdXJyZW50Q29tbWFuZCgpOworICB0aGlzLnByaW50VG9NZXNzYWdlTG9nKE1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsICc+ICcgKyBjb21tYW5kKTsKKyAgdGhpcy5leGVjdXRlQ29tbWFuZChjb21tYW5kKTsKIH0KIAotZnVuY3Rpb24gb25XaGVlbChldmVudCkgeworRGVidWdDb25zb2xlLnByb3RvdHlwZS5vbldoZWVsID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHsKLSAgICBtZXNzYWdlTG9nLnNjcm9sbERvd24oZXZlbnQuZGVsdGFZKTsKKyAgICB0aGlzLm1lc3NhZ2VMb2cuc2Nyb2xsRG93bihldmVudC5kZWx0YVkpOwogICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHsKLSAgICBtZXNzYWdlTG9nLnNjcm9sbFVwKC1ldmVudC5kZWx0YVkpOworICAgIHRoaXMubWVzc2FnZUxvZy5zY3JvbGxVcCgtZXZlbnQuZGVsdGFZKTsKICAgfQogfQogCi1mdW5jdGlvbiBvbktleWRvd24oZXZlbnQpIHsKLSAgdmFyIGtleSA9IGV2ZW50LmtleTsKLSAgaWYgKGtleSA9PSAnVW5pZGVudGlmaWVkJykgewotICAgIGtleSA9IHVuaWRlbnRpZmllZENvYmFsdEtleU1hcFtldmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJzsKLSAgfQorRGVidWdDb25zb2xlLnByb3RvdHlwZS5vbktleWRvd24gPSBmdW5jdGlvbihldmVudCkgeworICBsZXQga2V5ID0gZXZlbnQua2V5OwogCiAgIGlmIChrZXkgPT0gJ0Fycm93TGVmdCcpIHsKLSAgICBjb21tYW5kSW5wdXQubW92ZUN1cnNvcigtMSk7CisgICAgdGhpcy5jb21tYW5kSW5wdXQubW92ZUN1cnNvcigtMSk7CiAgIH0gZWxzZSBpZiAoa2V5ID09ICdBcnJvd1JpZ2h0JykgewotICAgIGNvbW1hbmRJbnB1dC5tb3ZlQ3Vyc29yKDEpOworICAgIHRoaXMuY29tbWFuZElucHV0Lm1vdmVDdXJzb3IoMSk7CiAgIH0gZWxzZSBpZiAoa2V5ID09ICdBcnJvd1VwJykgewotICAgIGNvbW1hbmRJbnB1dC5iYWNrKCk7CisgICAgdGhpcy5jb21tYW5kSW5wdXQuYmFjaygpOwogICB9IGVsc2UgIGlmIChrZXkgPT0gJ0Fycm93RG93bicpIHsKLSAgICBjb21tYW5kSW5wdXQuZm9yd2FyZCgpOworICAgIHRoaXMuY29tbWFuZElucHV0LmZvcndhcmQoKTsKICAgfSBlbHNlIGlmIChrZXkgPT0gJ0JhY2tzcGFjZScpIHsKLSAgICBjb21tYW5kSW5wdXQuZGVsZXRlQ2hhckJlaGluZEN1cnNvcigpOworICAgIHRoaXMuY29tbWFuZElucHV0LmRlbGV0ZUNoYXJCZWhpbmRDdXJzb3IoKTsKICAgfSBlbHNlIGlmIChrZXkgPT0gJ0VudGVyJykgewotICAgIGV4ZWN1dGVDdXJyZW50Q29tbWFuZCgpOworICAgIHRoaXMuZXhlY3V0ZUN1cnJlbnRDb21tYW5kKCk7CiAgIH0gZWxzZSBpZiAoa2V5ID09ICdQYWdlVXAnKSB7Ci0gICAgbWVzc2FnZUxvZy5wYWdlVXAoKTsKKyAgICB0aGlzLm1lc3NhZ2VMb2cucGFnZVVwKCk7CiAgIH0gZWxzZSBpZiAoa2V5ID09ICdQYWdlRG93bicpIHsKLSAgICBtZXNzYWdlTG9nLnBhZ2VEb3duKCk7CisgICAgdGhpcy5tZXNzYWdlTG9nLnBhZ2VEb3duKCk7CiAgIH0gZWxzZSBpZiAoa2V5ID09ICdEZWxldGUnKSB7Ci0gICAgY29tbWFuZElucHV0LmRlbGV0ZUNoYXJBdEN1cnNvcigpOworICAgIHRoaXMuY29tbWFuZElucHV0LmRlbGV0ZUNoYXJBdEN1cnNvcigpOwogICB9IGVsc2UgaWYgKGtleSA9PSAnSG9tZScpIHsKICAgICBpZiAoZXZlbnQuY3RybEtleSkgewotICAgICAgbWVzc2FnZUxvZy50b0hlYWQoKTsKKyAgICAgIHRoaXMubWVzc2FnZUxvZy50b0hlYWQoKTsKICAgICB9IGVsc2UgewotICAgICAgY29tbWFuZElucHV0Lm1vdmVDdXJzb3IoLTEwMDApOworICAgICAgdGhpcy5jb21tYW5kSW5wdXQubW92ZUN1cnNvcigtMTAwMCk7CiAgICAgfQogICB9IGVsc2UgaWYgKGtleSA9PSAnRW5kJykgewogICAgIGlmIChldmVudC5jdHJsS2V5KSB7Ci0gICAgICBtZXNzYWdlTG9nLnRvVGFpbCgpOworICAgICAgdGhpcy5tZXNzYWdlTG9nLnRvVGFpbCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICBjb21tYW5kSW5wdXQubW92ZUN1cnNvcigxMDAwKTsKKyAgICAgIHRoaXMuY29tbWFuZElucHV0Lm1vdmVDdXJzb3IoMTAwMCk7CiAgICAgfQogICB9CiB9CiAKLWZ1bmN0aW9uIG9uS2V5dXAoZXZlbnQpIHt9CitEZWJ1Z0NvbnNvbGUucHJvdG90eXBlLm9uS2V5dXAgPSBmdW5jdGlvbihldmVudCkge30KIAotZnVuY3Rpb24gb25LZXlwcmVzcyhldmVudCkgewotICB2YXIgbW9kZSA9IHdpbmRvdy5kZWJ1Z0h1Yi5nZXREZWJ1Z0NvbnNvbGVNb2RlKCk7Ci0gIGlmIChtb2RlID49IHdpbmRvdy5kZWJ1Z0h1Yi5ERUJVR19DT05TT0xFX09OKSB7Ci0gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKLSAgICB2YXIgYyA9IGV2ZW50LmNoYXJDb2RlOwotICAgIC8vIElmIHdlIGhhdmUgYSBwcmludGFibGUgY2hhcmFjdGVyLCBpbnNlcnQgaXQ7IG90aGVyd2lzZSBpZ25vcmUuCi0gICAgaWYgKGMgPj0gMHgyMCAmJiBjIDw9IDB4N2UpIHsKLSAgICAgIGNvbW1hbmRJbnB1dC5pbnNlcnRTdHJpbmdCZWhpbmRDdXJzb3IoU3RyaW5nLmZyb21DaGFyQ29kZShjKSk7Ci0gICAgfQorRGVidWdDb25zb2xlLnByb3RvdHlwZS5vbktleXByZXNzID0gZnVuY3Rpb24oZXZlbnQpIHsKKyAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgIGxldCBjID0gZXZlbnQuY2hhckNvZGU7CisgIC8vIElmIHdlIGhhdmUgYSBwcmludGFibGUgY2hhcmFjdGVyLCBpbnNlcnQgaXQ7IG90aGVyd2lzZSBpZ25vcmUuCisgIGlmIChjID49IDB4MjAgJiYgYyA8PSAweDdlKSB7CisgICAgdGhpcy5jb21tYW5kSW5wdXQuaW5zZXJ0U3RyaW5nQmVoaW5kQ3Vyc29yKFN0cmluZy5mcm9tQ2hhckNvZGUoYykpOwogICB9CiB9CiAKLWZ1bmN0aW9uIG9uSW5wdXQoZXZlbnQpIHsKK0RlYnVnQ29uc29sZS5wcm90b3R5cGUub25JbnB1dCA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgIGNvbnNvbGUubG9nKCdJbiBEZWJ1Z0NvbnNvbGUgb25JbnB1dCwgZXZlbnQuZGF0YSAnICsgZXZlbnQuZGF0YSk7Ci0gIHZhciBtb2RlID0gd2luZG93LmRlYnVnSHViLmdldERlYnVnQ29uc29sZU1vZGUoKTsKLSAgaWYgKG1vZGUgPj0gd2luZG93LmRlYnVnSHViLkRFQlVHX0NPTlNPTEVfT04gJiYgZXZlbnQuZGF0YSkgeworICBpZiAoZXZlbnQuZGF0YSkgewogICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ci0gICAgY29tbWFuZElucHV0Lmluc2VydFN0cmluZ0JlaGluZEN1cnNvcihldmVudC5kYXRhKTsKKyAgICB0aGlzLmNvbW1hbmRJbnB1dC5pbnNlcnRTdHJpbmdCZWhpbmRDdXJzb3IoZXZlbnQuZGF0YSk7CiAgIH0KIH0KIAotZnVuY3Rpb24gc3RhcnQoKSB7Ci0gIGNyZWF0ZUNvbW1hbmRJbnB1dCgpOwotICBjcmVhdGVNZXNzYWdlTG9nKCk7Ci0gIGNyZWF0ZURlYnVnZ2VyQ2xpZW50KCk7Ci0gIHNob3dIdWQoZmFsc2UpOwotICBzaG93Q29uc29sZShmYWxzZSk7Ci0gIGNyZWF0ZUNvbnNvbGVWYWx1ZXMoKTsKLSAgaW5pdERlYnVnQ29tbWFuZHMoKTsKLSAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTsKLSAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBvbktleXByZXNzKTsKLSAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5ZG93bik7Ci0gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25LZXl1cCk7Ci0gIGlmICh0eXBlb2Ygd2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQgIT0gJ3VuZGVmaW5lZCcKLSAgICAgICYmIHdpbmRvdy5vblNjcmVlbktleWJvYXJkKSB7Ci0gICAgd2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQub25pbnB1dCA9IG9uSW5wdXQ7CitEZWJ1Z0NvbnNvbGUucHJvdG90eXBlLnByaW50VG9Mb2dDYWxsYmFjayA9IGZ1bmN0aW9uKHJlc3VsdCkgeworICBpZiAocmVzdWx0Lndhc1Rocm93bikgeworICAgIHRoaXMucHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAnVW5jYXVnaHQgJyArIHJlc3VsdC5yZXN1bHQuZGVzY3JpcHRpb24pOworICB9IGVsc2UgaWYgKHJlc3VsdC5yZXN1bHQucHJldmlldykgeworICAgIHRoaXMucHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5JTkZPLCByZXN1bHQucmVzdWx0LnByZXZpZXcuZGVzY3JpcHRpb24pOworICAgIGlmIChyZXN1bHQucmVzdWx0LnByZXZpZXcucHJvcGVydGllcykgeworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQucmVzdWx0LnByZXZpZXcucHJvcGVydGllcy5sZW5ndGg7ICsraSkgeworICAgICAgICBsZXQgcHJvcGVydHkgPSByZXN1bHQucmVzdWx0LnByZXZpZXcucHJvcGVydGllc1tpXTsKKyAgICAgICAgdGhpcy5wcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLklORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICcgICcgKyBwcm9wZXJ0eS5uYW1lICsgJzogJyArIHByb3BlcnR5LnZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdC5yZXN1bHQucHJldmlldy5vdmVyZmxvdykgeworICAgICAgdGhpcy5wcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLklORk8sICcgIC4uLicpOworICAgIH0KKyAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0LmRlc2NyaXB0aW9uKSB7CisgICAgdGhpcy5wcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLklORk8sIHJlc3VsdC5yZXN1bHQuZGVzY3JpcHRpb24pOworICB9IGVsc2UgaWYgKHJlc3VsdC5yZXN1bHQudmFsdWUpIHsKKyAgICB0aGlzLnByaW50VG9NZXNzYWdlTG9nKE1lc3NhZ2VMb2cuSU5GTywgcmVzdWx0LnJlc3VsdC52YWx1ZS50b1N0cmluZygpKTsKICAgfQotICBjdXJyID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpOwotICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpOworICB0aGlzLnByaW50VG9NZXNzYWdlTG9nKE1lc3NhZ2VMb2cuSU5GTywgJycpOwogfQotCi13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHN0YXJ0KTsKLQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvZGVidWdnZXJfY2xpZW50LmpzIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvZGVidWdnZXJfY2xpZW50LmpzCmluZGV4IGNjMmIxNjguLjJjZWIzZTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L2RlYnVnZ2VyX2NsaWVudC5qcworKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9kZWJ1Z2dlcl9jbGllbnQuanMKQEAgLTI4LDcgKzI4LDcgQEAKIERlYnVnZ2VyQ2xpZW50LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbigpIHsKICAgaWYgKHRoaXMuYXR0YWNoU3RhdGUgPT0gdGhpcy5ERUJVR0dFUl9ERVRBQ0hFRCkgewogICAgIHRoaXMuYXR0YWNoU3RhdGUgPSB0aGlzLkRFQlVHR0VSX0FUVEFDSElORzsKLSAgICBwcmludFRvTWVzc2FnZUxvZyhtZXNzYWdlTG9nLklOVEVSQUNUSVZFLAorICAgIHByaW50VG9NZXNzYWdlTG9nKE1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsCiAgICAgICAgICAgICAgICAgICAgICAgJ0F0dGVtcHRpbmcgdG8gYXR0YWNoIHRvIGRlYnVnZ2VyLi4uJyk7CiAgICAgdGhpcy5zY3JpcHRzID0gW107CiAgICAgZGVidWdIdWIub25FdmVudC5hZGRMaXN0ZW5lcih0aGlzLm9uRXZlbnRDYWxsYmFjayk7CkBAIC0zNyw3ICszNyw3IEBACiAgICAgdGhpcy5zZW5kQ29tbWFuZCgnTG9nLmVuYWJsZScpOwogICAgIHRoaXMuc2VuZENvbW1hbmQoJ1J1bnRpbWUuZW5hYmxlJyk7CiAgIH0gZWxzZSBpZiAodGhpcy5hdHRhY2hTdGF0ZSA9PSB0aGlzLkRFQlVHR0VSX0FUVEFDSElORykgewotICAgIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsCisgICAgcHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5JTlRFUkFDVElWRSwKICAgICAgICAgICAgICAgICAgICAgICAnU3RpbGwgYXR0ZW1wdGluZyB0byBhdHRhY2ggdG8gZGVidWdnZXIuLi4nKTsKICAgfQogfQpAQCAtNDksNyArNDksNyBAQAogICBmb3IgKHZhciBpIGluIHRoaXMuc2NyaXB0cykgewogICAgIHZhciBpbmRleCA9IHRoaXMucGFkKGksIDMpOwogICAgIHZhciBzY3JpcHRVcmwgPSB0aGlzLnNjcmlwdHNbaV0udXJsOwotICAgIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsIGluZGV4ICsgJzogJyArIHNjcmlwdFVybCk7CisgICAgcHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5JTlRFUkFDVElWRSwgaW5kZXggKyAnOiAnICsgc2NyaXB0VXJsKTsKICAgfQogfQogCkBAIC03NCwxMiArNzQsMTEgQEAKICAgdmFyIGxpbmVzID0gc2NyaXB0U291cmNlLnNwbGl0KCdcbicpOwogICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgdmFyIGluZGV4ID0gdGhpcy5wYWQoaSArIDEsIDQpOwotICAgIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5GTywgaW5kZXggKyAnOiAnICsgbGluZXNbaV0pOworICAgIHByaW50VG9NZXNzYWdlTG9nKE1lc3NhZ2VMb2cuSU5GTywgaW5kZXggKyAnOiAnICsgbGluZXNbaV0pOwogICB9CiB9CiAKLURlYnVnZ2VyQ2xpZW50LnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKLSAgdmFyIGNhbGxiYWNrID0gdGhpcy5ldmFsdWF0ZUNhbGxiYWNrLmJpbmQodGhpcyk7CitEZWJ1Z2dlckNsaWVudC5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbihleHByZXNzaW9uLCBjYWxsYmFjaykgewogICB2YXIgbWV0aG9kID0gJ1J1bnRpbWUuZXZhbHVhdGUnOwogICB2YXIgcGFyYW1zID0ge307CiAgIHBhcmFtcy5jb250ZXh0SWQgPSB0aGlzLmV4ZWN1dGlvbkNvbnRleHQ7CkBAIC05MSwzMCArOTAsNiBAQAogICB0aGlzLnNlbmRDb21tYW5kKG1ldGhvZCwgcGFyYW1zLCBjYWxsYmFjayk7CiB9CiAKLURlYnVnZ2VyQ2xpZW50LnByb3RvdHlwZS5ldmFsdWF0ZUNhbGxiYWNrID0gZnVuY3Rpb24ocmVzdWx0KSB7Ci0gIGlmIChyZXN1bHQud2FzVGhyb3duKSB7Ci0gICAgcHJpbnRUb01lc3NhZ2VMb2cobWVzc2FnZUxvZy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAnVW5jYXVnaHQgJyArIHJlc3VsdC5yZXN1bHQuZGVzY3JpcHRpb24pOwotICB9IGVsc2UgaWYgKHJlc3VsdC5yZXN1bHQucHJldmlldykgewotICAgIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5GTywgcmVzdWx0LnJlc3VsdC5wcmV2aWV3LmRlc2NyaXB0aW9uKTsKLSAgICBpZiAocmVzdWx0LnJlc3VsdC5wcmV2aWV3LnByb3BlcnRpZXMpIHsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LnJlc3VsdC5wcmV2aWV3LnByb3BlcnRpZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgdmFyIHByb3BlcnR5ID0gcmVzdWx0LnJlc3VsdC5wcmV2aWV3LnByb3BlcnRpZXNbaV07Ci0gICAgICAgIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgJyArIHByb3BlcnR5Lm5hbWUgKyAnOiAnICsgcHJvcGVydHkudmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocmVzdWx0LnJlc3VsdC5wcmV2aWV3Lm92ZXJmbG93KSB7Ci0gICAgICBwcmludFRvTWVzc2FnZUxvZyhtZXNzYWdlTG9nLklORk8sICcgIC4uLicpOwotICAgIH0KLSAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0LmRlc2NyaXB0aW9uKSB7Ci0gICAgcHJpbnRUb01lc3NhZ2VMb2cobWVzc2FnZUxvZy5JTkZPLCByZXN1bHQucmVzdWx0LmRlc2NyaXB0aW9uKTsKLSAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0LnZhbHVlKSB7Ci0gICAgcHJpbnRUb01lc3NhZ2VMb2cobWVzc2FnZUxvZy5JTkZPLCByZXN1bHQucmVzdWx0LnZhbHVlLnRvU3RyaW5nKCkpOwotICB9Ci0gIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5GTywgJycpOwotfQotCiAvLyBBbGwgZGVidWdnZXIgY29tbWFuZHMgYXJlIHJvdXRlZCB0aHJvdWdoIHRoaXMgbWV0aG9kLiBDb252ZXJ0cyB0aGUgY29tbWFuZAogLy8gcGFyYW1ldGVycyBpbnRvIGEgSlNPTiBzdHJpbmcgdG8gcGFzcyB0byB0aGUgZGVidWcgZGlzcGF0Y2hlci4KIERlYnVnZ2VyQ2xpZW50LnByb3RvdHlwZS5zZW5kQ29tbWFuZCA9IGZ1bmN0aW9uKG1ldGhvZCwgY29tbWFuZFBhcmFtcywKQEAgLTEzMyw3ICsxMDgsNyBAQAogCiAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5lcnJvcikgewogICAgIHByaW50VG9NZXNzYWdlTG9nKAotICAgICAgICBtZXNzYWdlTG9nLkVSUk9SLAorICAgICAgICBNZXNzYWdlTG9nLkVSUk9SLAogICAgICAgICAnW0VSUk9SKCcgKyByZXNwb25zZS5lcnJvci5jb2RlICsgJyk6JyArIG1ldGhvZCArICddICcgKwogICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3IubWVzc2FnZSk7CiAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHsKQEAgLTE0OSwxMCArMTI0LDEwIEBACiAKIERlYnVnZ2VyQ2xpZW50LnByb3RvdHlwZS5vbkF0dGFjaCA9IGZ1bmN0aW9uKCkgewogICBpZiAoZGVidWdIdWIubGFzdEVycm9yKSB7Ci0gICAgcHJpbnRUb01lc3NhZ2VMb2cobWVzc2FnZUxvZy5XQVJOSU5HLCAnQ291bGQgbm90IGF0dGFjaCB0byBkZWJ1Z2dlci4nKTsKKyAgICBwcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLldBUk5JTkcsICdDb3VsZCBub3QgYXR0YWNoIHRvIGRlYnVnZ2VyLicpOwogICAgIHRoaXMuYXR0YWNoU3RhdGUgPSB0aGlzLkRFQlVHR0VSX0RFVEFDSEVEOwogICB9IGVsc2UgewotICAgIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsICdEZWJ1Z2dlciBhdHRhY2hlZC4nKTsKKyAgICBwcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLklOVEVSQUNUSVZFLCAnRGVidWdnZXIgYXR0YWNoZWQuJyk7CiAgICAgdGhpcy5hdHRhY2hTdGF0ZSA9IHRoaXMuREVCVUdHRVJfQVRUQUNIRUQ7CiAgIH0KIH0KQEAgLTE3OCwxMyArMTUzLDEzIEBACiB9CiAKIERlYnVnZ2VyQ2xpZW50LnByb3RvdHlwZS5vbkRldGFjaGVkID0gZnVuY3Rpb24oKSB7Ci0gIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5URVJBQ1RJVkUsICdEZWJ1Z2dlciBkZXRhY2hlZC4nKTsKKyAgcHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5JTlRFUkFDVElWRSwgJ0RlYnVnZ2VyIGRldGFjaGVkLicpOwogICB0aGlzLmF0dGFjaFN0YXRlID0gdGhpcy5ERUJVR0dFUl9ERVRBQ0hFRDsKIH0KIAogRGVidWdnZXJDbGllbnQucHJvdG90eXBlLm9uRXhlY3V0aW9uQ29udGV4dENyZWF0ZWQgPSBmdW5jdGlvbihwYXJhbXMpIHsKICAgdGhpcy5leGVjdXRpb25Db250ZXh0ID0gcGFyYW1zLmNvbnRleHQuaWQ7Ci0gIHByaW50VG9NZXNzYWdlTG9nKG1lc3NhZ2VMb2cuSU5GTywKKyAgcHJpbnRUb01lc3NhZ2VMb2coTWVzc2FnZUxvZy5JTkZPLAogICAgICAgICAgICAgICAgICAgICAnRXhlY3V0aW9uIGNvbnRleHQgY3JlYXRlZDogJyArIHRoaXMuZXhlY3V0aW9uQ29udGV4dCk7CiB9CiAKQEAgLTIwNSw5ICsxODAsOSBAQAogRGVidWdnZXJDbGllbnQucHJvdG90eXBlLm9uQ29uc29sZUFwaUNhbGxlZCA9IGZ1bmN0aW9uKHBhcmFtcykgewogICB2YXIgc2V2ZXJpdHkgPSBwYXJhbXMudHlwZTsKICAgaWYgKHNldmVyaXR5ID09PSAiYXNzZXJ0IikgewotICAgIHNldmVyaXR5ID0gbWVzc2FnZUxvZy5FUlJPUjsKKyAgICBzZXZlcml0eSA9IE1lc3NhZ2VMb2cuRVJST1I7CiAgIH0gZWxzZSBpZiAoc2V2ZXJpdHkgPT09ICJsb2ciKSB7Ci0gICAgc2V2ZXJpdHkgPSBtZXNzYWdlTG9nLklORk87CisgICAgc2V2ZXJpdHkgPSBNZXNzYWdlTG9nLklORk87CiAgIH0KIAogICB2YXIgbWVzc2FnZSA9ICcnOwpAQCAtMjIyLDcgKzE5Nyw3IEBACiAgICAgfQogICB9CiAKLSAgcHJpbnRUb01lc3NhZ2VMb2cobWVzc2FnZUxvZy5DT05TT0xFICsgc2V2ZXJpdHksIG1lc3NhZ2UpOworICBwcmludFRvTWVzc2FnZUxvZyhNZXNzYWdlTG9nLkNPTlNPTEUgKyBzZXZlcml0eSwgbWVzc2FnZSk7CiB9CiAKIERlYnVnZ2VyQ2xpZW50LnByb3RvdHlwZS5vblNjcmlwdFBhcnNlZCA9IGZ1bmN0aW9uKHBhcmFtcykgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvbWVkaWFfY29uc29sZS5qcyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L21lZGlhX2NvbnNvbGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiMzNkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L21lZGlhX2NvbnNvbGUuanMKQEAgLTAsMCArMSwyMjEgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY29uc3Qga05ld2xpbmUgPSAnXHJcbic7CisKK2NvbnN0IGtNZWRpYUNvbnNvbGVGcmFtZSA9ICdtZWRpYUNvbnNvbGVGcmFtZSc7CisKK2NvbnN0IHZpZGVvQ29kZWNGYW1pbGllcyA9IFsnYXYwMScsICdhdmMxJywgJ2F2YzMnLCAnaGV2MScsICdodmMxJywgJ3ZwMDknLAorICAgICAgJ3ZwOCcsICd2cDknXTsKK2NvbnN0IGF1ZGlvQ29kZWNGYW1pbGllcyA9IFsnYWMtMycsICdlYy0zJywgJ21wNGEnLCAnb3B1cycsICd2b3JiaXMnXTsKKworY29uc3Qga0FsdE1vZGlmaWVyID0gJ0EtJzsKK2NvbnN0IGtDdHJsTW9kaWZpZXIgPSAnQy0nOworCitmdW5jdGlvbiBNZWRpYUNvbnNvbGUoZGVidWdnZXJDbGllbnQpIHsKKyAgbGV0IG1lZGlhQ29uc29sZU5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWFDb25zb2xlJyk7CisKKyAgdGhpcy5kZWJ1Z2dlckNsaWVudCA9IGRlYnVnZ2VyQ2xpZW50OworICB0aGlzLmdldERpc2FibGVkTWVkaWFDb2RlY3MgPSB3aW5kb3cuZGVidWdIdWIuY1ZhbC5nZXRWYWx1ZS5iaW5kKAorICAgICAgd2luZG93LmRlYnVnSHViLmNWYWwsICdNZWRpYS5EaXNhYmxlZE1lZGlhQ29kZWNzJyk7CisgIHRoaXMuc2V0RGlzYWJsZWRNZWRpYUNvZGVjcyA9IHdpbmRvdy5kZWJ1Z0h1Yi5zZW5kQ29uc29sZUNvbW1hbmQuYmluZCgKKyAgICAgIHdpbmRvdy5kZWJ1Z0h1YiwgJ2Rpc2FibGVfbWVkaWFfY29kZWNzJyk7CisgIHRoaXMubGFzdFVwZGF0ZVRpbWUgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7CisgIHRoaXMudXBkYXRlUGVyaW9kID0gMTAwMDsKKworICAvLyBSZWdpc3RyeSBvZiBhbGwgdGhlIGhvdGtleXMgYW5kIHRoZWlyIGZ1bmN0aW9uIGhhbmRsZXJzLgorICAvLyBOT1RFOiBUaGlzIGlzIG5vdCB0aGUgZnVsbCBsaXN0LCBzaW5jZSBtb3JlIHdpbGwgYmUgYWRkZWQgb25jZSB0aGUgY29kZWMKKyAgLy8gc3BlY2lmaWMgY29udHJvbHMgYXJlIHJlZ2lzdGVyZWQuCisgIHRoaXMuaG90a2V5UmVnaXN0cnkgPSBuZXcgTWFwKFsKKyAgICAgIFsncCcsIHtoYW5kbGVyOiB0aGlzLm9uUGxheVBhdXNlLmJpbmQodGhpcyksIGhlbHA6ICcocClhdXNlLyhwKWxheSd9XSwKKyAgICAgIFsnXScsIHtoYW5kbGVyOiB0aGlzLm9uSW5jcmVhc2VQbGF5YmFja1JhdGUuYmluZCh0aGlzKSwKKyAgICAgICAgaGVscDogJyhdKUluY3JlYXNlIFBsYXliYWNrIFJhdGUnfV0sCisgICAgICBbJ1snLCB7aGFuZGxlcjogdGhpcy5vbkRlY3JlYXNlUGxheWJhY2tSYXRlLmJpbmQodGhpcyksCisgICAgICAgIGhlbHA6ICcoWylEZWNyZWFzZSBQbGF5YmFjayBSYXRlJ31dLAorICBdKTsKKworICB0aGlzLmhvdGtleUhlbHBOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpOworICBtZWRpYUNvbnNvbGVOb2RlLmFwcGVuZENoaWxkKHRoaXMuaG90a2V5SGVscE5vZGUpOworCisgIC8vIER5bmFtaWNhbGx5IGFkZGVkIGRpdiB3aWxsIGJlIGNoYW5nZWQgYXMgd2UgZ2V0IHN0YXRlIGluZm9ybWF0aW9uLgorICBsZXQgcGxheWVyU3RhdGVFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgIHRoaXMucGxheWVyU3RhdGVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpOworICBwbGF5ZXJTdGF0ZUVsZW0uYXBwZW5kQ2hpbGQodGhpcy5wbGF5ZXJTdGF0ZVRleHQpOworICBtZWRpYUNvbnNvbGVOb2RlLmFwcGVuZENoaWxkKHBsYXllclN0YXRlRWxlbSk7CisKKyAgdGhpcy5wcmludFRvTWVkaWFDb25zb2xlQ2FsbGJhY2sgPSB0aGlzLnByaW50VG9NZWRpYUNvbnNvbGUuYmluZCh0aGlzKTsKKyAgdGhpcy5jb2RlY1N1cHBvcnRNYXAgPSBuZXcgTWFwKCk7CisgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlOworfQorCitNZWRpYUNvbnNvbGUucHJvdG90eXBlLnNldFZpc2libGUgPSBmdW5jdGlvbih2aXNpYmxlKSB7CisgIGlmICh2aXNpYmxlKSB7CisgICAgdGhpcy5pbml0aWFsaXplKCk7CisgIH0KK30KKworTWVkaWFDb25zb2xlLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7CisgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7IHJldHVybjsgfQorCisgIHRoaXMuZGVidWdnZXJDbGllbnQuYXR0YWNoKCk7CisgIHRoaXMuaW5pdGlhbGl6ZU1lZGlhQ29uc29sZUNvbnRleHQoKTsKKyAgdGhpcy5pbml0aWFsaXplU3VwcG9ydGVkQ29kZWNzKCk7CisKKyAgLy8gU2luY2UgfGluaXRpYWxpemVTdXBwb3J0ZWRDb2RlY3N8IGlzIHJlc29sdmVkIGFzeW5jaHJvbm91c2x5LCB3ZSBuZWVkIHRvCisgIC8vIHdhaXQgdW50aWwgfGNvZGVjU3VwcG9ydE1hcHwgaXMgZnVsbHkgcG9wdWxhdGVkIGJlZm9yZSBmaW5pc2hpbmcgdGhlIHJlc3QKKyAgLy8gb2YgdGhlIGluaXRpYWxpemF0aW9uLgorICBpZiAodGhpcy5jb2RlY1N1cHBvcnRNYXAuc2l6ZSA+IDApIHsKKyAgICB0aGlzLnJlZ2lzdGVyQ29kZWNIb3RrZXlzKCk7CisgICAgdGhpcy5nZW5lcmF0ZUhvdGtleUhlbHBUZXh0KCk7CisgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorfQorCitNZWRpYUNvbnNvbGUucHJvdG90eXBlLmluaXRpYWxpemVNZWRpYUNvbnNvbGVDb250ZXh0ID0gZnVuY3Rpb24oKSB7CisgIGxldCBqcyA9IGRlYnVnSHViLnJlYWREZWJ1Z0NvbnRlbnRUZXh0KCdjb25zb2xlL21lZGlhX2NvbnNvbGVfY29udGV4dC5qcycpOworICB0aGlzLmRlYnVnZ2VyQ2xpZW50LmV2YWx1YXRlKGpzKTsKK30KKworTWVkaWFDb25zb2xlLnByb3RvdHlwZS5pbml0aWFsaXplU3VwcG9ydGVkQ29kZWNzID0gZnVuY3Rpb24oKSB7CisgIGlmICh0aGlzLmNvZGVjU3VwcG9ydE1hcC5zaXplID4gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRsZVN1cHBvcnRRdWVyeVJlc3BvbnNlKHJlc3BvbnNlKSB7CisgICAgbGV0IHJlc3VsdHMgPSBKU09OLnBhcnNlKHJlc3BvbnNlLnJlc3VsdC52YWx1ZSk7CisgICAgcmVzdWx0cy5mb3JFYWNoKHJlY29yZCA9PiB7CisgICAgICBsZXQgY29kZWNGYW1pbHkgPSByZWNvcmRbMF07CisgICAgICBsZXQgaXNTdXBwb3J0ZWQgPSByZWNvcmRbMV0gfHwgISF0aGlzLmNvZGVjU3VwcG9ydE1hcC5nZXQoY29kZWNGYW1pbHkpOworICAgICAgdGhpcy5jb2RlY1N1cHBvcnRNYXAuc2V0KGNvZGVjRmFtaWx5LCBpc1N1cHBvcnRlZCk7CisgICAgfSk7CisgIH07CisKKyAgdGhpcy5kZWJ1Z2dlckNsaWVudC5ldmFsdWF0ZShgX21lZGlhQ29uc29sZUNvbnRleHQuZ2V0U3VwcG9ydGVkQ29kZWNzKClgLAorICAgICAgaGFuZGxlU3VwcG9ydFF1ZXJ5UmVzcG9uc2UuYmluZCh0aGlzKSk7Cit9CisKK01lZGlhQ29uc29sZS5wcm90b3R5cGUucmVnaXN0ZXJDb2RlY0hvdGtleXMgPSBmdW5jdGlvbigpIHsKKyAgLy8gQ29kZWMgY29udHJvbCBob3RrZXlzIGFyZSBvZiB0aGUgZm9ybTogTW9kaWZpZXIgKyBOdW1iZXIuCisgIC8vIER1ZSB0byB0aGUgbGFyZ2UgbnVtYmVyIG9mIGNvZGVjcywgd2Ugc3BsaXQgYWxsIHRoZSB2aWRlbyBjb2RlY3MgaW50byBDdHJsCisgIC8vIGFuZCBhbGwgdGhlIGF1ZGlvIGNvZGVjcyBpbnRvIEFsdC4KKyAgLy8gIkMtIiBwcmVmaXggaW5kaWNhdGVzIGEga2V5IHdpdGggdGhlIGN0cmxLZXkgbW9kaWZpZXIuCisgIC8vICJBLSIgcHJlZml4IGluZGljYXRlcyBhIGtleSB3aXRoIHRoZSBhbHRLZXkgbW9kaWZpZXIuCisgIC8vIEFkZGl0aW9uYWxseSwgd2Ugb25seSByZWdpc3RlciB0aG9zZSBob3RrZXlzIHRoYXQgd2UgZmlsdGVyIGFzIHN1cHBvcnRlZC4KKyAgZnVuY3Rpb24gcmVnaXN0ZXJDb2RlY0hvdGtleShtb2RpZmllciwgY29kZWMsIGluZGV4KSB7CisgICAgaWYgKCF0aGlzLmNvZGVjU3VwcG9ydE1hcC5nZXQoY29kZWMpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGxldCBtb2RBbmROdW0gPSBgJHttb2RpZmllcn0ke2luZGV4ICsgMX1gOworICAgIGxldCBoZWxwU3RyID0gYCggJHttb2RBbmROdW19ICkgJHtjb2RlY31gOworICAgIHRoaXMuaG90a2V5UmVnaXN0cnkuc2V0KG1vZEFuZE51bSwgeworICAgICAgaGFuZGxlcjogdGhpcy5vblRvZ2dsZUNvZGVjLmJpbmQodGhpcywgY29kZWMpLAorICAgICAgaGVscDogaGVscFN0cgorICAgIH0pOworICB9OworICB2aWRlb0NvZGVjRmFtaWxpZXMuZm9yRWFjaChyZWdpc3RlckNvZGVjSG90a2V5LmJpbmQodGhpcywga0N0cmxNb2RpZmllcikpOworICBhdWRpb0NvZGVjRmFtaWxpZXMuZm9yRWFjaChyZWdpc3RlckNvZGVjSG90a2V5LmJpbmQodGhpcywga0FsdE1vZGlmaWVyKSk7Cit9CisKK01lZGlhQ29uc29sZS5wcm90b3R5cGUuZ2VuZXJhdGVIb3RrZXlIZWxwVGV4dCA9IGZ1bmN0aW9uKCkgeworICAvLyBHZW5lcmF0ZSB0aGUgaGVscCB0ZXh0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXQgdGhlIHRvcCBvZiB0aGUgY29uc29sZQorICAvLyBvdXRwdXQuCisgIGxldCBob3RrZXlzSGVscCA9IGBIb3RrZXlzOiAke2tOZXdsaW5lfWA7CisgIGhvdGtleXNIZWxwICs9IGBDdHJsK051bSB0b2dnbGVzIHZpZGVvIGNvZGVjcyAke2tOZXdsaW5lfWA7CisgIGhvdGtleXNIZWxwICs9IGBBbHQrTnVtIHRvZ2dsZXMgYXVkaW8gY29kZWNzICR7a05ld2xpbmV9YDsKKyAgY29uc3QgZ2VuZXJhdGVIZWxwVGV4dCA9IGZ1bmN0aW9uKGhvdGtleUluZm8sIGhvdGtleSwgbWFwKSB7CisgICAgaG90a2V5c0hlbHAgKz0gaG90a2V5SW5mby5oZWxwICsgJywgJzsKKyAgfTsKKyAgdGhpcy5ob3RrZXlSZWdpc3RyeS5mb3JFYWNoKGdlbmVyYXRlSGVscFRleHQpOworICBob3RrZXlzSGVscCA9IGhvdGtleXNIZWxwLnN1YnN0cmluZygwLCBob3RrZXlzSGVscC5sZW5ndGgtMik7CisgIGhvdGtleXNIZWxwICs9IGtOZXdsaW5lOworICBob3RrZXlzSGVscCArPSBrTmV3bGluZTsKKyAgaG90a2V5c0hlbHAgKz0ga05ld2xpbmU7CisKKyAgdGhpcy5ob3RrZXlIZWxwTm9kZS5ub2RlVmFsdWUgPSBob3RrZXlzSGVscDsKK30KKworTWVkaWFDb25zb2xlLnByb3RvdHlwZS5wYXJzZVN0YXRlRnJvbVJlc3BvbnNlID0gZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgLy8gVE9ETzogSGFuZGxlIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGV4Y2VwdGlvbkRldGFpbHMuCisgIC8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sLzEtMy9SdW50aW1lI21ldGhvZC1ldmFsdWF0ZQorICByZXR1cm4gSlNPTi5wYXJzZShyZXNwb25zZS5yZXN1bHQudmFsdWUpOworfQorCitNZWRpYUNvbnNvbGUucHJvdG90eXBlLnByaW50VG9NZWRpYUNvbnNvbGUgPSBmdW5jdGlvbihyZXNwb25zZSkgeworICBjb25zdCBzdGF0ZSA9IHRoaXMucGFyc2VTdGF0ZUZyb21SZXNwb25zZShyZXNwb25zZSk7CisgIGxldCB2aWRlb1N0YXR1cyA9ICdObyBwcmltYXJ5IHZpZGVvLic7CisgIGlmKHN0YXRlLmhhc1ByaW1hcnlWaWRlbykgeyB2aWRlb1N0YXR1cyA9ICcnOyB9CisgIHRoaXMucGxheWVyU3RhdGVUZXh0LnRleHRDb250ZW50ID0KKyAgICAgIGBQcmltYXJ5IFZpZGVvOiAke3ZpZGVvU3RhdHVzfSAke2tOZXdsaW5lfSBcCisgICAgICBQYXVzZWQ6ICR7c3RhdGUucGF1c2VkfSAke2tOZXdsaW5lfSBcCisgICAgICBDdXJyZW50IFRpbWU6ICR7c3RhdGUuY3VycmVudFRpbWV9ICR7a05ld2xpbmV9IFwKKyAgICAgIER1cmF0aW9uOiAke3N0YXRlLmR1cmF0aW9ufSAke2tOZXdsaW5lfSBcCisgICAgICBQbGF5YmFjayBSYXRlOiAke3N0YXRlLnBsYXliYWNrUmF0ZX0gXAorICAgICAgKGRlZmF1bHQ6ICR7c3RhdGUuZGVmYXVsdFBsYXliYWNrUmF0ZX0pICR7a05ld2xpbmV9IFwKKyAgICAgIERpc2FibGVkIE1lZGlhIENvZGVjczogJHtzdGF0ZS5kaXNhYmxlZE1lZGlhQ29kZWNzfWA7Cit9CisKK01lZGlhQ29uc29sZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7CisgIGNvbnN0IHQgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7CisgIGlmICh0ID4gdGhpcy5sYXN0VXBkYXRlVGltZSArIHRoaXMudXBkYXRlUGVyaW9kKSB7CisgICAgdGhpcy5sYXN0VXBkYXRlVGltZSA9IHQ7CisgICAgdGhpcy5kZWJ1Z2dlckNsaWVudC5ldmFsdWF0ZSgnX21lZGlhQ29uc29sZUNvbnRleHQuZ2V0UGxheWVyU3RhdGUoKScsCisgICAgICAgIHRoaXMucHJpbnRUb01lZGlhQ29uc29sZUNhbGxiYWNrKTsKKyAgfQorfQorCitNZWRpYUNvbnNvbGUucHJvdG90eXBlLm9uV2hlZWwgPSBmdW5jdGlvbihldmVudCkge30KKworTWVkaWFDb25zb2xlLnByb3RvdHlwZS5vbktleXVwID0gZnVuY3Rpb24oZXZlbnQpIHt9CisKK01lZGlhQ29uc29sZS5wcm90b3R5cGUub25LZXlwcmVzcyA9IGZ1bmN0aW9uKGV2ZW50KSB7fQorCitNZWRpYUNvbnNvbGUucHJvdG90eXBlLm9uSW5wdXQgPSBmdW5jdGlvbihldmVudCkge30KKworTWVkaWFDb25zb2xlLnByb3RvdHlwZS5vbktleWRvd24gPSBmdW5jdGlvbihldmVudCkgeworICBsZXQgbWF0Y2hlZEhvdGtleUVudHJ5ID0gbnVsbDsKKyAgdGhpcy5ob3RrZXlSZWdpc3RyeS5mb3JFYWNoKGZ1bmN0aW9uKGhvdGtleUluZm8sIGhvdGtleSwgbWFwKSB7CisgICAgbGV0IGV2ZW50S2V5ID0gZXZlbnQua2V5OworICAgIGlmKGV2ZW50LmFsdEtleSkgeyBldmVudEtleSA9IGtBbHRNb2RpZmllciArIGV2ZW50S2V5OyB9CisgICAgaWYoZXZlbnQuY3RybEtleSkgeyBldmVudEtleSA9IGtDdHJsTW9kaWZpZXIgKyBldmVudEtleTsgfQorICAgIGlmKGV2ZW50S2V5ID09IGhvdGtleSkgeworICAgICAgbWF0Y2hlZEhvdGtleUVudHJ5ID0gaG90a2V5SW5mbzsKKyAgICB9CisgIH0pOworICBpZiAobWF0Y2hlZEhvdGtleUVudHJ5KSB7CisgICAgbWF0Y2hlZEhvdGtleUVudHJ5LmhhbmRsZXIoKTsKKyAgfQorfQorCitNZWRpYUNvbnNvbGUucHJvdG90eXBlLm9uUGxheVBhdXNlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZGVidWdnZXJDbGllbnQuZXZhbHVhdGUoJ19tZWRpYUNvbnNvbGVDb250ZXh0LnRvZ2dsZVBsYXlQYXVzZSgpJywKKyAgICAgIHRoaXMucHJpbnRUb01lZGlhQ29uc29sZUNhbGxiYWNrKTsKK30KKworTWVkaWFDb25zb2xlLnByb3RvdHlwZS5vbkluY3JlYXNlUGxheWJhY2tSYXRlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZGVidWdnZXJDbGllbnQuZXZhbHVhdGUoJ19tZWRpYUNvbnNvbGVDb250ZXh0LmluY3JlYXNlUGxheWJhY2tSYXRlKCknLAorICAgICAgdGhpcy5wcmludFRvTWVkaWFDb25zb2xlQ2FsbGJhY2spOworfQorCitNZWRpYUNvbnNvbGUucHJvdG90eXBlLm9uRGVjcmVhc2VQbGF5YmFja1JhdGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5kZWJ1Z2dlckNsaWVudC5ldmFsdWF0ZSgnX21lZGlhQ29uc29sZUNvbnRleHQuZGVjcmVhc2VQbGF5YmFja1JhdGUoKScsCisgICAgICB0aGlzLnByaW50VG9NZWRpYUNvbnNvbGVDYWxsYmFjayk7Cit9CisKK01lZGlhQ29uc29sZS5wcm90b3R5cGUub25Ub2dnbGVDb2RlYyA9IGZ1bmN0aW9uKGNvZGVjVG9Ub2dnbGUpIHsKKyAgbGV0IGNvZGVjcyA9IHRoaXMuZ2V0RGlzYWJsZWRNZWRpYUNvZGVjcygpLnNwbGl0KCI7Iik7CisgIGNvZGVjcyA9IGNvZGVjcy5maWx0ZXIocyA9PiBzLmxlbmd0aCA+IDApOworICB0b2dnbGVkID0gY29kZWNzLmZpbHRlcihjID0+IGMgIT0gY29kZWNUb1RvZ2dsZSk7CisgIGlmKGNvZGVjcy5sZW5ndGggPT0gdG9nZ2xlZC5sZW5ndGgpIHsgdG9nZ2xlZC5wdXNoKGNvZGVjVG9Ub2dnbGUpOyB9CisgIHRoaXMuc2V0RGlzYWJsZWRNZWRpYUNvZGVjcyh0b2dnbGVkLmpvaW4oJzsnKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9tZWRpYV9jb25zb2xlX2NvbnRleHQuanMgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9tZWRpYV9jb25zb2xlX2NvbnRleHQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwZGYwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9jb250ZW50L21lZGlhX2NvbnNvbGVfY29udGV4dC5qcwpAQCAtMCwwICsxLDE2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZnVuY3Rpb24oKSB7CisKK2xldCBjdHggPSB3aW5kb3cuX21lZGlhQ29uc29sZUNvbnRleHQgPSB7fTsKKworLy8gTk9URTogUGxhY2UgYWxsICJwcml2YXRlIiBtZW1iZXJzIGFuZCBtZXRob2RzIG9mIHxfbWVkaWFDb25zb2xlQ29udGV4dHwKKy8vIGJlbG93LiBQcml2YXRlIGZ1bmN0aW9ucyBhcmUgbm90IGF0dGFjaGVkIHRvIHRoZSB8X21lZGlhQ29uc29sZUNvbnRleHR8CisvLyBkaXJlY3RseS4gUmF0aGVyIHRoZXkgYXJlIHJlZmVyZW5jZWQgd2l0aGluIHRoZSBwdWJsaWMgZnVuY3Rpb25zLCB3aGljaAorLy8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkLgorCitjb25zdCBrUGxheWJhY2tSYXRlcyA9IFswLjI1LCAwLjUsIDAuNzUsIDEuMCwgMS4yNSwgMS41LCAxLjc1LCAyLjBdOworCitmdW5jdGlvbiBnZXRQcmltYXJ5VmlkZW8oKSB7CisgIGNvbnN0IGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd2aWRlbycpOworICBpZiAoZWxlbSAmJiBlbGVtLmxlbmd0aCA+IDApIHsKKyAgICBsZXQgcHJpbWFyeSA9IG51bGw7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtLmxlbmd0aDsgaSsrKSB7CisgICAgICBjb25zdCByZWN0ID0gZWxlbVtpXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgICAgIGlmIChyZWN0LndpZHRoID09IHdpbmRvdy5pbm5lcldpZHRoICYmCisgICAgICAgICAgcmVjdC5oZWlnaHQgPT0gd2luZG93LmlubmVySGVpZ2h0KSB7CisgICAgICAgIGlmIChwcmltYXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICBjb25zb2xlLndhcm4oJ1R3byB2aWRlbyBlbGVtZW50cyBmb3VuZCB3aXRoIHRoZSBzYW1lXAorICAgICAgICAgICAgICBkaW1lbnNpb25zIGFzIHRoZSBtYWluIHdpbmRvdy4nKTsKKyAgICAgICAgfQorICAgICAgICBwcmltYXJ5ID0gZWxlbVtpXTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHByaW1hcnk7CisgIH0KKyAgcmV0dXJuIG51bGw7Cit9OworCitmdW5jdGlvbiBleHRyYWN0U3RhdGUodmlkZW8sIGRpc2FibGVkTWVkaWFDb2RlY3MpIHsKKyAgbGV0IHN0YXRlID0ge307CisgIHN0YXRlLmRpc2FibGVkTWVkaWFDb2RlY3MgPSBkaXNhYmxlZE1lZGlhQ29kZWNzOworICBzdGF0ZS5oYXNQcmltYXJ5VmlkZW8gPSBmYWxzZTsKKyAgaWYgKHZpZGVvKSB7CisgICAgc3RhdGUuaGFzUHJpbWFyeVZpZGVvID0gdHJ1ZTsKKyAgICBzdGF0ZS5wYXVzZWQgPSB2aWRlby5wYXVzZWQ7CisgICAgc3RhdGUuY3VycmVudFRpbWUgPSB2aWRlby5jdXJyZW50VGltZTsKKyAgICBzdGF0ZS5kdXJhdGlvbiA9IHZpZGVvLmR1cmF0aW9uOworICAgIHN0YXRlLmRlZmF1bHRQbGF5YmFja1JhdGUgPSB2aWRlby5kZWZhdWx0UGxheWJhY2tSYXRlOworICAgIHN0YXRlLnBsYXliYWNrUmF0ZSA9IHZpZGVvLnBsYXliYWNrUmF0ZTsKKyAgfQorICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3RhdGUpOworfTsKKworZnVuY3Rpb24gZ2V0RGlzYWJsZWRNZWRpYUNvZGVjcygpIHsKKyAgcmV0dXJuIHdpbmRvdy5oNXZjYy5jVmFsLmdldFZhbHVlKCJNZWRpYS5EaXNhYmxlZE1lZGlhQ29kZWNzIik7Cit9OworCisvLyBOT1RFOiBQbGFjZSBhbGwgcHVibGljIG1lbWJlcnMgYW5kIG1ldGhvZHMgb2YgfF9tZWRpYUNvbnNvbGVDb250ZXh0fAorLy8gYmVsb3cuIFRoZXkgZm9ybSBjbG9zdXJlcyB3aXRoIHRoZSBhYm92ZSAicHJpdmF0ZSIgbWVtYmVycyBhbmQgbWV0aG9kcworLy8gYW5kIGhlbmNlIGNhbiB1c2UgdGhlbSBkaXJlY3RseSwgd2l0aG91dCByZWZlcmVuY2luZyB8dGhpc3wuCisKK2N0eC5nZXRQbGF5ZXJTdGF0ZSA9IGZ1bmN0aW9uKCkgeworICBjb25zdCB2aWRlbyA9IGdldFByaW1hcnlWaWRlbygpOworICBjb25zdCBkaXNhYmxlZE1lZGlhQ29kZWNzID0gZ2V0RGlzYWJsZWRNZWRpYUNvZGVjcygpOworICByZXR1cm4gZXh0cmFjdFN0YXRlKHZpZGVvLCBkaXNhYmxlZE1lZGlhQ29kZWNzKTsKK307CisKK2N0eC50b2dnbGVQbGF5UGF1c2UgPSBmdW5jdGlvbigpIHsKKyAgbGV0IHZpZGVvID0gZ2V0UHJpbWFyeVZpZGVvKCk7CisgIGlmICh2aWRlbykgeworICAgIGlmICh2aWRlby5wYXVzZWQpIHsKKyAgICAgIHZpZGVvLnBsYXkoKTsKKyAgICB9IGVsc2UgeworICAgICAgdmlkZW8ucGF1c2UoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGV4dHJhY3RTdGF0ZSh2aWRlbywgZ2V0RGlzYWJsZWRNZWRpYUNvZGVjcygpKTsKK307CisKK2N0eC5pbmNyZWFzZVBsYXliYWNrUmF0ZSA9IGZ1bmN0aW9uKCkgeworICBsZXQgdmlkZW8gPSBnZXRQcmltYXJ5VmlkZW8oKTsKKyAgaWYgKHZpZGVvKSB7CisgICAgbGV0IGkgPSBrUGxheWJhY2tSYXRlcy5pbmRleE9mKHZpZGVvLnBsYXliYWNrUmF0ZSk7CisgICAgaSA9IE1hdGgubWluKGkgKyAxLCBrUGxheWJhY2tSYXRlcy5sZW5ndGggLSAxKTsKKyAgICB2aWRlby5wbGF5YmFja1JhdGUgPSBrUGxheWJhY2tSYXRlc1tpXTsKKyAgfQorICByZXR1cm4gZXh0cmFjdFN0YXRlKHZpZGVvLCBnZXREaXNhYmxlZE1lZGlhQ29kZWNzKCkpOworfTsKKworY3R4LmRlY3JlYXNlUGxheWJhY2tSYXRlID0gZnVuY3Rpb24oKSB7CisgIGxldCB2aWRlbyA9IGdldFByaW1hcnlWaWRlbygpOworICBpZiAodmlkZW8pIHsKKyAgICBsZXQgaSA9IGtQbGF5YmFja1JhdGVzLmluZGV4T2YodmlkZW8ucGxheWJhY2tSYXRlKTsKKyAgICBpID0gTWF0aC5tYXgoaSAtIDEsIDApOworICAgIHZpZGVvLnBsYXliYWNrUmF0ZSA9IGtQbGF5YmFja1JhdGVzW2ldOworICB9CisgIHJldHVybiBleHRyYWN0U3RhdGUodmlkZW8sIGdldERpc2FibGVkTWVkaWFDb2RlY3MoKSk7Cit9OworCitjdHguZ2V0U3VwcG9ydGVkQ29kZWNzID0gZnVuY3Rpb24oKSB7CisgIC8vIEJ5IHF1ZXJ5aW5nIGFsbCB0aGUgcG9zc2libGUgbWltZSBhbmQgY29kZWMgcGFpcnMsIHdlIGNhbiBkZXRlcm1pbmUKKyAgLy8gd2hpY2ggY29kZWNzIGFyZSB2YWxpZCB0byBjb250cm9sIGFuZCB0b2dnbGUuICBXZSB1c2UgYXJiaXRyYXJpbHktCisgIC8vIGNob3NlbiBjb2RlYyBzdWJmb3JtYXRzIHRvIGRldGVybWluZSBpZiB0aGUgZW50aXJlIGZhbWlseSBpcworICAvLyBzdXBwb3J0ZWQuCisgIGNvbnN0IGtWaWRlb0NvZGVjcyA9IFsKKyAgICAgICdhdjAxLjAuMDRNLjEwLjAuMTEwLjA5LjE2LjA5LjAnLAorICAgICAgJ2F2YzEuNjQwMDI4JywKKyAgICAgICdodmMxLjEuMi5MOTMuQjAnLAorICAgICAgJ3ZwMDkuMDIuMTAuMTAuMDEuMDkuMTYuMDkuMDEnLAorICAgICAgJ3ZwOCcsCisgICAgICAndnA5JywKKyAgXTsKKyAgY29uc3Qga1ZpZGVvTUlNRXMgPSBbCisgICAgICAndmlkZW8vbXBlZycsCisgICAgICAndmlkZW8vbXA0JywKKyAgICAgICd2aWRlby9vZ2cnLAorICAgICAgJ3ZpZGVvL3dlYm0nLAorICBdOworICBjb25zdCBrQXVkaW9Db2RlY3MgPSBbCisgICAgICAnYWMtMycsCisgICAgICAnZWMtMycsCisgICAgICAnbXA0YS40MC4yJywKKyAgICAgICdvcHVzJywKKyAgICAgICd2b3JiaXMnLAorICBdOworICBjb25zdCBrQXVkaW9NSU1FcyA9IFsKKyAgICAgICdhdWRpby9mbGFjJywKKyAgICAgICdhdWRpby9tcGVnJywKKyAgICAgICdhdWRpby9tcDMnLAorICAgICAgJ2F1ZGlvL21wNCcsCisgICAgICAnYXVkaW8vb2dnJywKKyAgICAgICdhdWRpby93YXYnLAorICAgICAgJ2F1ZGlvL3dlYm0nLAorICAgICAgJ2F1ZGlvL3gtbTRhJywKKyAgXTsKKworICBsZXQgcmVzdWx0cyA9IFtdOworICBrVmlkZW9NSU1Fcy5mb3JFYWNoKG1pbWUgPT4geworICAgIGtWaWRlb0NvZGVjcy5mb3JFYWNoKGNvZGVjID0+IHsKKyAgICAgIGxldCBmYW1pbHkgPSBjb2RlYy5zcGxpdCgnLicpWzBdOworICAgICAgbGV0IG1pbWVDb2RlYyA9IG1pbWUgKyAnOyBjb2RlY3MgPSInICsgY29kZWMgKyAnIic7CisgICAgICByZXN1bHRzLnB1c2goW2ZhbWlseSwgTWVkaWFTb3VyY2UuaXNUeXBlU3VwcG9ydGVkKG1pbWVDb2RlYyldKTsKKyAgICB9KQorICB9KTsKKyAga0F1ZGlvTUlNRXMuZm9yRWFjaChtaW1lID0+IHsKKyAgICBrQXVkaW9Db2RlY3MuZm9yRWFjaChjb2RlYyA9PiB7CisgICAgICBsZXQgZmFtaWx5ID0gY29kZWMuc3BsaXQoJy4nKVswXTsKKyAgICAgIGxldCBtaW1lQ29kZWMgPSBtaW1lICsgJzsgY29kZWNzID0iJyArIGNvZGVjICsgJyInOworICAgICAgcmVzdWx0cy5wdXNoKFtmYW1pbHksIE1lZGlhU291cmNlLmlzVHlwZVN1cHBvcnRlZChtaW1lQ29kZWMpXSk7CisgICAgfSkKKyAgfSk7CisgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXN1bHRzKTsKK30KKworfSkoKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2NvbnRlbnQvbWVzc2FnZV9sb2cuanMgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9tZXNzYWdlX2xvZy5qcwppbmRleCAwMzQzM2JmLi5jMjJiNTEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9tZXNzYWdlX2xvZy5qcworKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvY29udGVudC9tZXNzYWdlX2xvZy5qcwpAQCAtNzcsMTYgKzc3LDYgQEAKIAogLy8gQ29uc3RydWN0b3IgZm9yIHRoZSBtZXNzYWdlIGxvZyBvYmplY3QgaXRzZWxmLgogZnVuY3Rpb24gTWVzc2FnZUxvZyhtZXNzYWdlQ29udGFpbmVyKSB7Ci0gIC8vIExvZyBsZXZlbHMgZGVmaW5lZCBieSB0aGUgJ2xldmVsJyBwcm9wZXJ0eSBvZiBMb2dFbnRyeQotICAvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvTG9nI3R5cGUtTG9nRW50cnkKLSAgdGhpcy5WRVJCT1NFID0gInZlcmJvc2UiOwotICB0aGlzLklORk8gPSAiaW5mbyI7Ci0gIHRoaXMuV0FSTklORyA9ICJ3YXJuaW5nIjsKLSAgdGhpcy5FUlJPUiA9ICJlcnJvciI7Ci0gIC8vIEN1c3RvbSBsZXZlbCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbnNvbGUuCi0gIHRoaXMuSU5URVJBQ1RJVkUgPSAiaW50ZXJhY3RpdmUiOwotICAvLyBQcmVmaXggb24gc2V2ZXJpdHkgZm9yIG1lc3NhZ2VzIGZyb20gdGhlIEpTIGNvbnNvbGUuCi0gIHRoaXMuQ09OU09MRSA9ICcqJzsKICAgLy8gTnVtYmVyIG9mIGl0ZW1zIHRvIGRpc3BsYXkgb24gYSBzaW5nbGUgcGFnZS4KICAgdGhpcy5QQUdFX1NJWkUgPSA1MDsKICAgLy8gTnVtYmVyIG9mIGl0ZW1zIHRvIHNjcm9sbCB3aGVuIHRoZSB1c2VyIHBhZ2VzIHVwIG9yIGRvd24uCkBAIC0xMDMsNiArOTMsMTcgQEAKICAgdGhpcy52aXNpYmxlID0gZmFsc2U7CiB9CiAKKy8vIExvZyBsZXZlbHMgZGVmaW5lZCBieSB0aGUgJ2xldmVsJyBwcm9wZXJ0eSBvZiBMb2dFbnRyeQorLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL0xvZyN0eXBlLUxvZ0VudHJ5CitNZXNzYWdlTG9nLlZFUkJPU0UgPSAidmVyYm9zZSI7CitNZXNzYWdlTG9nLklORk8gPSAiaW5mbyI7CitNZXNzYWdlTG9nLldBUk5JTkcgPSAid2FybmluZyI7CitNZXNzYWdlTG9nLkVSUk9SID0gImVycm9yIjsKKy8vIEN1c3RvbSBsZXZlbCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbnNvbGUuCitNZXNzYWdlTG9nLklOVEVSQUNUSVZFID0gImludGVyYWN0aXZlIjsKKy8vIFByZWZpeCBvbiBzZXZlcml0eSBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgSlMgY29uc29sZS4KK01lc3NhZ2VMb2cuQ09OU09MRSA9ICcqJzsKKwogTWVzc2FnZUxvZy5wcm90b3R5cGUuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uKHZpc2libGUpIHsKICAgdmFyIHdhc1Zpc2libGUgPSB0aGlzLnZpc2libGU7CiAgIHRoaXMudmlzaWJsZSA9IHZpc2libGU7CkBAIC0xMzEsOCArMTMyLDggQEAKICAgZWxlbS5jbGFzc05hbWUgPSAnbWVzc2FnZSc7CiAgIHZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWVzc2FnZSk7CiAKLSAgaWYgKHNldmVyaXR5LnN0YXJ0c1dpdGgodGhpcy5DT05TT0xFKSkgewotICAgIHNldmVyaXR5ID0gc2V2ZXJpdHkuc3Vic3RyKHRoaXMuQ09OU09MRS5sZW5ndGgpOworICBpZiAoc2V2ZXJpdHkuc3RhcnRzV2l0aChNZXNzYWdlTG9nLkNPTlNPTEUpKSB7CisgICAgc2V2ZXJpdHkgPSBzZXZlcml0eS5zdWJzdHIoTWVzc2FnZUxvZy5DT05TT0xFLmxlbmd0aCk7CiAgICAgZWxlbS5jbGFzc0xpc3QuYWRkKCdjb25zb2xlJyk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2RlYnVnX2NvbnNvbGVfbW9kZS5pZGwgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvZGVidWdfY29uc29sZV9tb2RlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDE2M2UyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2RlYnVnX2NvbnNvbGVfbW9kZS5pZGwKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBDdXN0b20gaW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRlYnVnZ2VyLCBtb2RlbGVkIGFmdGVyCisvLyBjaHJvbWUuZGVidWdnZXIgZXh0ZW5zaW9uIEFQSS4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9kZWJ1Z2dlcgorCitlbnVtIERlYnVnQ29uc29sZU1vZGUgeworICAib2ZmIiwKKyAgImh1ZCIsCisgICJkZWJ1ZyIsCisgICJtZWRpYSIsCisgICJjb3VudCIKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvZGVidWdfaHViLmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2RlYnVnX2h1Yi5jYwppbmRleCBlODc2MGQ1Li4yZDllY2RjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvZGVidWdfaHViLmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9kZWJ1Z19odWIuY2MKQEAgLTE3LDkgKzE3LDEzIEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHNldD4KIAorI2luY2x1ZGUgImJhc2UvZmlsZXMvZmlsZV9wYXRoLmgiCisjaW5jbHVkZSAiYmFzZS9maWxlcy9maWxlX3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL2pzb24vanNvbl93cml0ZXIuaCIKKyNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgogI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvY192YWwuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9jb2JhbHRfcGF0aHMuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvY29uc29sZS9jb21tYW5kX21hbmFnZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvanNvbl9vYmplY3QuaCIKIApAQCAtMjcsNiArMzEsMTAgQEAKIG5hbWVzcGFjZSBkZWJ1ZyB7CiBuYW1lc3BhY2UgY29uc29sZSB7CiAKK25hbWVzcGFjZSB7Citjb25zdGV4cHIgY2hhciBrQ29udGVudERpcltdID0gImNvYmFsdC9kZWJ1ZyI7Cit9ICAvLyBuYW1lc3BhY2UKKwogRGVidWdIdWI6OkRlYnVnSHViKAogICAgIGNvbnN0IEdldEh1ZE1vZGVDYWxsYmFjayYgZ2V0X2h1ZF9tb2RlX2NhbGxiYWNrLAogICAgIGNvbnN0IENyZWF0ZURlYnVnQ2xpZW50Q2FsbGJhY2smIGNyZWF0ZV9kZWJ1Z19jbGllbnRfY2FsbGJhY2spCkBAIC0zNyw3ICs0NSw3IEBACiAKIERlYnVnSHViOjp+RGVidWdIdWIoKSB7fQogCi1pbnQgRGVidWdIdWI6OkdldERlYnVnQ29uc29sZU1vZGUoKSBjb25zdCB7CitkZWJ1Zzo6Y29uc29sZTo6RGVidWdDb25zb2xlTW9kZSBEZWJ1Z0h1Yjo6R2V0RGVidWdDb25zb2xlTW9kZSgpIGNvbnN0IHsKICAgcmV0dXJuIGdldF9odWRfbW9kZV9jYWxsYmFja18uUnVuKCk7CiB9CiAKQEAgLTYyLDYgKzcwLDIxIEBACiAgIGNhbGxiYWNrX3JlZmVyZW5jZS52YWx1ZSgpLlJ1bigpOwogfQogCitzdGQ6OnN0cmluZyBEZWJ1Z0h1Yjo6UmVhZERlYnVnQ29udGVudFRleHQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICBiYXNlOjpGaWxlUGF0aCBmaWxlX3BhdGg7CisgIGJhc2U6OlBhdGhTZXJ2aWNlOjpHZXQocGF0aHM6OkRJUl9DT0JBTFRfV0VCX1JPT1QsICZmaWxlX3BhdGgpOworICBmaWxlX3BhdGggPSBmaWxlX3BhdGguQXBwZW5kQVNDSUkoa0NvbnRlbnREaXIpOworICBmaWxlX3BhdGggPSBmaWxlX3BhdGguQXBwZW5kQVNDSUkoZmlsZW5hbWUpOworCisgIHN0ZDo6c3RyaW5nIHRleHQ7CisgIGlmICghYmFzZTo6UmVhZEZpbGVUb1N0cmluZyhmaWxlX3BhdGgsICZ0ZXh0KSkgeworICAgIERMT0coV0FSTklORykgPDwgIkNhbm5vdCByZWFkIGZpbGU6ICIgPDwgZmlsZV9wYXRoLnZhbHVlKCk7CisgIH0KKyAgcmV0dXJuIHRleHQ7Cit9CisKIHZvaWQgRGVidWdIdWI6OlNlbmRDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYganNvbl9wYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNwb25zZUNhbGxiYWNrQXJnJiBjYWxsYmFjaykgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2RlYnVnX2h1Yi5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2RlYnVnX2h1Yi5oCmluZGV4IGNiMDI0NDQuLjMxOWU4NjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9kZWJ1Z19odWIuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGUvZGVidWdfaHViLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX2xvb3AuaCIKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2NvbnNvbGUvY29uc29sZV9jb21tYW5kLmgiCisjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2NvbnNvbGUvZGVidWdfY29uc29sZV9tb2RlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2NvbnNvbGUvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2RlYnVnX2NsaWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vY192YWxfdmlldy5oIgpAQCAtNDMsNyArNDQsNyBAQAogIHB1YmxpYzoKICAgLy8gRnVuY3Rpb24gc2lnbmF0dXJlIHRvIGNhbGwgd2hlbiB3ZSBuZWVkIHRvIHF1ZXJ5IGZvciB0aGUgSHVkIHZpc2liaWxpdHkKICAgLy8gbW9kZS4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazxpbnQoKT4gR2V0SHVkTW9kZUNhbGxiYWNrOworICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPGRlYnVnOjpjb25zb2xlOjpEZWJ1Z0NvbnNvbGVNb2RlKCk+IEdldEh1ZE1vZGVDYWxsYmFjazsKIAogICAvLyBKYXZhU2NyaXB0IGNhbGxiYWNrIHRvIGJlIHJ1biB3aGVuIGRlYnVnZ2VyIGF0dGFjaGVzL2RldGFjaGVzLgogICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjx2b2lkKCk+IEF0dGFjaENhbGxiYWNrOwpAQCAtNTQsMTIgKzU1LDYgQEAKICAgICAgIFJlc3BvbnNlQ2FsbGJhY2s7CiAgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxSZXNwb25zZUNhbGxiYWNrPiBSZXNwb25zZUNhbGxiYWNrQXJnOwogCi0gIC8vIERlYnVnIGNvbnNvbGUgdmlzaWJpbGl0eSBtb2Rlcy4KLSAgc3RhdGljIGNvbnN0IGludCBrRGVidWdDb25zb2xlT2ZmID0gMDsKLSAgc3RhdGljIGNvbnN0IGludCBrRGVidWdDb25zb2xlSHVkID0gMTsKLSAgc3RhdGljIGNvbnN0IGludCBrRGVidWdDb25zb2xlT24gPSAyOwotICBzdGF0aWMgY29uc3QgaW50IGtEZWJ1Z0NvbnNvbGVOdW1Nb2RlcyA9IGtEZWJ1Z0NvbnNvbGVPbiArIDE7Ci0KICAgLy8gVGhyZWFkLXNhZmUgcmVmLWNvdW50ZWQgc3RydWN0IHVzZWQgdG8gcGFzcyBhc3luY2hyb25vdXNseSBleGVjdXRlZAogICAvLyByZXNwb25zZSBjYWxsYmFja3MgYXJvdW5kLiBTdG9yZXMgdGhlIG1lc3NhZ2UgbG9vcCB0aGUgY2FsbGJhY2sgbXVzdCBiZQogICAvLyBleGVjdXRlZCBvbiBhcyB3ZWxsIGFzIHRoZSBjYWxsYmFjayBpdHNlbGYuCkBAIC04MCwxMSArNzUsMTUgQEAKIAogICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6Q1ZhbFZpZXc+JiBjX3ZhbCgpIGNvbnN0IHsgcmV0dXJuIGNfdmFsXzsgfQogCi0gIGludCBHZXREZWJ1Z0NvbnNvbGVNb2RlKCkgY29uc3Q7CisgIGRlYnVnOjpjb25zb2xlOjpEZWJ1Z0NvbnNvbGVNb2RlIEdldERlYnVnQ29uc29sZU1vZGUoKSBjb25zdDsKIAogICB2b2lkIEF0dGFjaChjb25zdCBBdHRhY2hDYWxsYmFja0FyZyYgY2FsbGJhY2spOwogICB2b2lkIERldGFjaChjb25zdCBBdHRhY2hDYWxsYmFja0FyZyYgY2FsbGJhY2spOwogCisgIC8vIFJlYWQgYSB0ZXh0IGZpbGUgZnJvbSB0aGUgY29udGVudC93ZWIvY29iYWx0L2RlYnVnLyBkaXJlY3RvcnkgYW5kIHJldHVybgorICAvLyBpdHMgY29udGVudHMuCisgIHN0ZDo6c3RyaW5nIFJlYWREZWJ1Z0NvbnRlbnRUZXh0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisKICAgLy8gU2VuZHMgYSBkZXZ0b29scyBwcm90b2NvbCBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBtYWluCiAgIC8vIFdlYk1vZHVsZSB0aGF0IGlzIGJlaW5nIGRlYnVnZ2VkLgogICB2b2lkIFNlbmRDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uX3BhcmFtcywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZS9kZWJ1Z19odWIuaWRsIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2RlYnVnX2h1Yi5pZGwKaW5kZXggMjFhZjdkNi4uYTlhZmIwMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2RlYnVnX2h1Yi5pZGwKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlL2RlYnVnX2h1Yi5pZGwKQEAgLTE5LDE3ICsxOSwxNCBAQAogWwogICBDb25kaXRpb25hbD1FTkFCTEVfREVCVUdHRVIKIF0gaW50ZXJmYWNlIERlYnVnSHViIHsKLSAgY29uc3QgbG9uZyBERUJVR19DT05TT0xFX09GRiA9IDA7Ci0gIGNvbnN0IGxvbmcgREVCVUdfQ09OU09MRV9IVUQgPSAxOwotICBjb25zdCBsb25nIERFQlVHX0NPTlNPTEVfT04gPSAyOwotCiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBDVmFsVmlldyBjVmFsOwogCi0gIGxvbmcgZ2V0RGVidWdDb25zb2xlTW9kZSgpOworICBEZWJ1Z0NvbnNvbGVNb2RlIGdldERlYnVnQ29uc29sZU1vZGUoKTsKIAogICB2b2lkIGF0dGFjaChBdHRhY2hDYWxsYmFjayBjYik7CiAgIHZvaWQgZGV0YWNoKEF0dGFjaENhbGxiYWNrIGNiKTsKIAorICBET01TdHJpbmcgcmVhZERlYnVnQ29udGVudFRleHQoRE9NU3RyaW5nIGZpbGVuYW1lKTsKICAgdm9pZCBzZW5kQ29tbWFuZChET01TdHJpbmcgbWV0aG9kLCBET01TdHJpbmcganNvblBhcmFtcywgUmVzcG9uc2VDYWxsYmFjayBjYik7CiAKICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZz8gbGFzdEVycm9yOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Zy5neXAgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnLmd5cAppbmRleCAwNTlhY2Y5Li4zNWRhMDQ0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnLmd5cAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnLmd5cApAQCAtNDAsNiArNDAsOCBAQAogICAgICAgICAnYmFja2VuZC9kb21fYWdlbnQuaCcsCiAgICAgICAgICdiYWNrZW5kL2xvZ19hZ2VudC5jYycsCiAgICAgICAgICdiYWNrZW5kL2xvZ19hZ2VudC5oJywKKyAgICAgICAgJ2JhY2tlbmQvb3ZlcmxheV9hZ2VudC5jYycsCisgICAgICAgICdiYWNrZW5kL292ZXJsYXlfYWdlbnQuaCcsCiAgICAgICAgICdiYWNrZW5kL3BhZ2VfYWdlbnQuY2MnLAogICAgICAgICAnYmFja2VuZC9wYWdlX2FnZW50LmgnLAogICAgICAgICAnYmFja2VuZC9yZW5kZXJfbGF5ZXIuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb2Mvd2ViX2RlYnVnZ2luZy5tZCBiL3NyYy9jb2JhbHQvZG9jL3dlYl9kZWJ1Z2dpbmcubWQKaW5kZXggYjQzYTU5Yi4uYzQ3MTFkYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb2Mvd2ViX2RlYnVnZ2luZy5tZAorKysgYi9zcmMvY29iYWx0L2RvYy93ZWJfZGVidWdnaW5nLm1kCkBAIC0xNTgsOSArMTU4LDYgQEAKIAogIyMgVGlwcwogCi0qICAgRG9uJ3Qgb3BlbiBDb2JhbHQncyBjb25zb2xlIG92ZXJsYXkgYmVmb3JlIGF0dGFjaGluZyB0aGUgcmVtb3RlIERldlRvb2xzIGFzCi0gICAgdGhhdCBjYW4gY2F1c2UgdGhlIGxhdHRlciBub3QgdG8gd29yay4KLQogKiAgIFlvdSBjYW4gbWFrZSBDb2JhbHQgcmVsb2FkIHRoZSBjdXJyZW50IHBhZ2UgYnkgcHJlc3NpbmcgRjUgaW4gdGhlIENvYmFsdAogICAgIHdpbmRvdywgb3IgY3RybC1SIGluIHRoZSByZW1vdGUgRGV2VG9vbHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nCiAgICAgc3RhcnR1cCBjb2RlIGluIHRoZSB3ZWIgYXBwLiBJdCBtYXkgYWxzbyBoZWxwIGluIGNhc2Ugc29tZSBzb3VyY2UgZmlsZSBpcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC9kb20vZG9tX3Rlc3QuZ3lwCmluZGV4IDdkZDZkMTQuLjI5YTBhMmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV90ZXN0Lmd5cAorKysgYi9zcmMvY29iYWx0L2RvbS9kb21fdGVzdC5neXAKQEAgLTc3LDEwICs3NywxMCBAQAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwOmxvYWRlcicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc2tpYS5neXA6c2tpYScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3BlZWNoL3NwZWVjaC5neXA6c3BlZWNoJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKIAogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5jYyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5jYwppbmRleCAzNTcwYzE0Li41YTljNzc1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zZXNzaW9uLmNjCkBAIC0yMTUsMTIgKzIxNSwxMCBAQAogICAvLyA1LjIuIFVzZSBDRE0gdG8gY2xvc2UgdGhlIGtleSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uLgogICBkcm1fc3lzdGVtX3Nlc3Npb25fLT5DbG9zZSgpOwogCi0gIC8vIExldCB8TWVkaWFLZXlzfCBrbm93IHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdAotICAvLyBvZiBvcGVuIHNlc3Npb25zLgotICBjbG9zZWRfY2FsbGJhY2tfLlJ1bih0aGlzKTsKLQorI2lmICFTQl9IQVMoRFJNX1NFU1NJT05fQ0xPU0VEKQogICAvLyA1LjMuMS4gUnVuIHRoZSBTZXNzaW9uIENsb3NlZCBhbGdvcml0aG0gb24gdGhlIHNlc3Npb24uCiAgIE9uU2Vzc2lvbkNsb3NlZCgpOworI2VuZGlmICAvLyAhU0JfSEFTKERSTV9TRVNTSU9OX0NMT1NFRCkKIAogICAvLyA1LjMuMi4gUmVzb2x2ZSBwcm9taXNlLgogICBwcm9taXNlLT5SZXNvbHZlKCk7CkBAIC00MTYsNiArNDE0LDEwIEBACiAgIC8vICAgIC0gVE9ETzogSW1wbGVtZW50IGV4cGlyYXRpb24uCiAgIC8vIDcuIFJlc29sdmUgcHJvbWlzZS4KICAgY2xvc2VkX3Byb21pc2VfcmVmZXJlbmNlXy52YWx1ZSgpLlJlc29sdmUoKTsKKworICAvLyBMZXQgfE1lZGlhS2V5c3wga25vdyB0aGF0IHRoZSBzZXNzaW9uIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QKKyAgLy8gb2Ygb3BlbiBzZXNzaW9ucy4KKyAgY2xvc2VkX2NhbGxiYWNrXy5SdW4odGhpcyk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBlbWUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5jYwppbmRleCAxZDNhNTIyLi43Yjc0ODNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmNjCkBAIC01MzUsNyArNTM1LDcgQEAKICAgLy8gICAgIGhhcyBubyBhc3NvY2lhdGVkIHNjcm9sbGluZyBib3gsIG9yIHRoZSBlbGVtZW50IGhhcyBubyBvdmVyZmxvdywKICAgLy8gICAgIHRlcm1pbmF0ZSB0aGVzZSBzdGVwcy4KICAgaWYgKCFsYXlvdXRfYm94ZXNfIHx8Ci0gICAgICBzY3JvbGxfd2lkdGgoKSA8PSBsYXlvdXRfYm94ZXNfLT5HZXRQYWRkaW5nRWRnZVdpZHRoKCkgKSB7CisgICAgICBzY3JvbGxfd2lkdGgoKSA8PSBsYXlvdXRfYm94ZXNfLT5HZXRQYWRkaW5nRWRnZVdpZHRoKCkpIHsKICAgICAvLyBNYWtlIHN1cmUgdGhlIFVJIG5hdmlnYXRpb24gY29udGFpbmVyIGlzIHNldCB0byB0aGUgZXhwZWN0ZWQgMC4KICAgICB4ID0gMC4wZjsKICAgfQpAQCAtNTk3LDcgKzU5Nyw3IEBACiB9CiAKIC8vIEFsZ29yaXRobSBmb3Igb2Zmc2V0UGFyZW50OgotLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS12aWV3LTIwMTMxMjE3LyNkb20taHRtbGVsZW1lbnQtb2Zmc2V0cGFyZW50CisvLyAgIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9kYXRlLzIwMTktMTAtMTEvY3Nzb20tdmlldy8jZXh0ZW5zaW9ucy10by10aGUtaHRtbGVsZW1lbnQtaW50ZXJmYWNlCiBFbGVtZW50KiBIVE1MRWxlbWVudDo6b2Zmc2V0X3BhcmVudCgpIHsKICAgRENIRUNLKG5vZGVfZG9jdW1lbnQoKSk7CiAgIG5vZGVfZG9jdW1lbnQoKS0+RG9TeW5jaHJvbm91c0xheW91dCgpOwpAQCAtNjE3LDcgKzYxNyw5IEBACiAgIC8vIDIuIFJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3RvciBlbGVtZW50IG9mIHRoZSBlbGVtZW50IGZvciB3aGljaCBhdCBsZWFzdAogICAvLyAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlIGFuZCB0ZXJtaW5hdGUgdGhpcyBhbGdvcml0aG0gaWYgc3VjaCBhbgogICAvLyAgICBhbmNlc3RvciBpcyBmb3VuZDoKLSAgLy8gICAgLiBUaGUgY29tcHV0ZWQgdmFsdWUgb2YgdGhlICdwb3NpdGlvbicgcHJvcGVydHkgaXMgbm90ICdzdGF0aWMnLgorICAvLyAgICAuIFRoZSBlbGVtZW50IGlzIGEgY29udGFpbmluZyBibG9jayBvZiBhYnNvbHV0ZWx5LXBvc2l0aW9uZWQgZGVzY2VuZGFudHMKKyAgLy8gICAgICAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgYWJzb2x1dGVseS1wb3NpdGlvbmVkCisgIC8vICAgICAgIGRlc2NlbmRhbnRzKS4KICAgLy8gICAgLiBJdCBpcyB0aGUgSFRNTCBib2R5IGVsZW1lbnQuCiAgIGZvciAoTm9kZSogYW5jZXN0b3Jfbm9kZSA9IHBhcmVudF9ub2RlKCk7IGFuY2VzdG9yX25vZGU7CiAgICAgICAgYW5jZXN0b3Jfbm9kZSA9IGFuY2VzdG9yX25vZGUtPnBhcmVudF9ub2RlKCkpIHsKQEAgLTYzMSw4ICs2MzMsOCBAQAogICAgIH0KICAgICBEQ0hFQ0soYW5jZXN0b3JfaHRtbF9lbGVtZW50LT5jb21wdXRlZF9zdHlsZSgpKTsKICAgICBpZiAoYW5jZXN0b3JfaHRtbF9lbGVtZW50LT5Bc0hUTUxCb2R5RWxlbWVudCgpIHx8Ci0gICAgICAgIGFuY2VzdG9yX2h0bWxfZWxlbWVudC0+Y29tcHV0ZWRfc3R5bGUoKS0+cG9zaXRpb24oKSAhPQotICAgICAgICAgICAgY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0U3RhdGljKCkpIHsKKyAgICAgICAgYW5jZXN0b3JfaHRtbF9lbGVtZW50LT5jb21wdXRlZF9zdHlsZSgpCisgICAgICAgICAgICAtPklzQ29udGFpbmluZ0Jsb2NrRm9yUG9zaXRpb25BYnNvbHV0ZUVsZW1lbnRzKCkpIHsKICAgICAgIHJldHVybiBhbmNlc3Rvcl9lbGVtZW50OwogICAgIH0KICAgfQpAQCAtMTE0NCwyNCArMTE0NiwyMyBAQAogICBkaXJlY3Rpb25hbGl0eV8gPSBiYXNlOjpudWxsb3B0OwogfQogCi12b2lkIEhUTUxFbGVtZW50OjpPblVpTmF2Qmx1cigpIHsKLSAgQmx1cigpOwotfQordm9pZCBIVE1MRWxlbWVudDo6T25VaU5hdkJsdXIoKSB7IEJsdXIoKTsgfQogCiB2b2lkIEhUTUxFbGVtZW50OjpPblVpTmF2Rm9jdXMoKSB7CiAgIC8vIEVuc3VyZSB0aGUgZm9jdXNpbmcgc3RlcHMgZG8gbm90IHRyaWdnZXIgdGhlIFVJIG5hdmlnYXRpb24gaXRlbSB0bwogICAvLyBmb3JjZSBmb2N1cyBhZ2Fpbi4KLSAgc2NvcGVkX3JlZnB0cjx1aV9uYXZpZ2F0aW9uOjpOYXZJdGVtPiB0ZW1wX2l0ZW0gPSB1aV9uYXZfaXRlbV87Ci0gIHVpX25hdl9pdGVtXyA9IG51bGxwdHI7Ci0gIEZvY3VzKCk7Ci0gIHVpX25hdl9pdGVtXyA9IHRlbXBfaXRlbTsKKyAgaWYgKCF1aV9uYXZfZm9jdXNpbmdfKSB7CisgICAgdWlfbmF2X2ZvY3VzaW5nXyA9IHRydWU7CisgICAgRm9jdXMoKTsKKyAgICB1aV9uYXZfZm9jdXNpbmdfID0gZmFsc2U7CisgIH0KIH0KIAogdm9pZCBIVE1MRWxlbWVudDo6T25VaU5hdlNjcm9sbCgpIHsKICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbm9kZV9kb2N1bWVudCgpOwogICBzY29wZWRfcmVmcHRyPFdpbmRvdz4gd2luZG93KGRvY3VtZW50ID8gZG9jdW1lbnQtPndpbmRvdygpIDogbnVsbHB0cik7Ci0gIERpc3BhdGNoRXZlbnQobmV3IFVJRXZlbnQoYmFzZTo6VG9rZW5zOjpzY3JvbGwoKSwKLSAgICAgICAgICAgICAgICBFdmVudDo6a0J1YmJsZXMsIEV2ZW50OjprTm90Q2FuY2VsYWJsZSwgd2luZG93KSk7CisgIERpc3BhdGNoRXZlbnQobmV3IFVJRXZlbnQoYmFzZTo6VG9rZW5zOjpzY3JvbGwoKSwgRXZlbnQ6OmtCdWJibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50OjprTm90Q2FuY2VsYWJsZSwgd2luZG93KSk7CiB9CiAKIEhUTUxFbGVtZW50OjpIVE1MRWxlbWVudChEb2N1bWVudCogZG9jdW1lbnQsIGJhc2U6OlRva2VuIGxvY2FsX25hbWUpCkBAIC0xMzQyLDcgKzEzNDMsNyBAQAogICBDbGVhclJ1bGVNYXRjaGluZ1N0YXRlKCk7CiAKICAgLy8gU2V0IHRoZSBmb2N1cyBpdGVtIGZvciB0aGUgVUkgbmF2aWdhdGlvbiBzeXN0ZW0uCi0gIGlmICh1aV9uYXZfaXRlbV8gJiYgIXVpX25hdl9pdGVtXy0+SXNDb250YWluZXIoKSkgeworICBpZiAodWlfbmF2X2l0ZW1fICYmICF1aV9uYXZfaXRlbV8tPklzQ29udGFpbmVyKCkgJiYgIXVpX25hdl9mb2N1c2luZ18pIHsKICAgICAvLyBPbmx5IG5hdmlnYXRpb24gaXRlbXMgYXR0YWNoZWQgdG8gdGhlIHJvb3QgY29udGFpbmVyIGFyZSBpbnRlcmFjdGFibGUuCiAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBhIGNvbnRhaW5lciwgdGhlbiBmb3JjZSBhIGxheW91dCB0bwogICAgIC8vIGNvbm5lY3QgaXRlbXMgdG8gdGhlaXIgY29udGFpbmVycyBhbmQgZXZlbnR1YWxseSB0byB0aGUgcm9vdCBjb250YWluZXIuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5oCmluZGV4IDUxNjZiZjguLmQxZjU0OGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5oCkBAIC00OTMsNiArNDkzLDEyIEBACiAgIC8vIGJveGVzIHdpdGhvdXQgcmVxdWlyaW5nIGEgbmV3IGxheW91dC4KICAgc2NvcGVkX3JlZnB0cjx1aV9uYXZpZ2F0aW9uOjpOYXZJdGVtPiB1aV9uYXZfaXRlbV87CiAKKyAgLy8gVGhpcyB0ZW1wb3JhcnkgZmxhZyBpcyB1c2VkIHRvIGF2b2lkIGEgY3ljbGUgb24gZm9jdXMgY2hhbmdlcy4gV2hlbiB0aGUKKyAgLy8gSFRNTCBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLCBpdCBtdXN0IGluZm9ybSB0aGUgVUkgbmF2aWdhdGlvbiBpdGVtLiBXaGVuCisgIC8vIHRoZSBVSSBuYXZpZ2F0aW9uIGl0ZW0gcmVjZWl2ZXMgZm9jdXMgKGVpdGhlciBieSBjYWxsaW5nIFNldEZvY3VzIG9yIGJ5IGFuCisgIC8vIHVwZGF0ZSBmcm9tIHRoZSBVSSBlbmdpbmUpLCBpdCB3aWxsIHRlbGwgdGhlIEhUTUwgZWxlbWVudCBpdCB3YXMgZm9jdXNlZC4KKyAgYm9vbCB1aV9uYXZfZm9jdXNpbmdfID0gZmFsc2U7CisKICAgLy8gSFRNTEVsZW1lbnQgaXMgYSBmcmllbmQgb2YgQW5pbWF0YWJsZSBzbyB0aGF0IGFuaW1hdGFibGUgY2FuIGluc2VydCBhbmQKICAgLy8gcmVtb3ZlIGFuaW1hdGlvbnMgaW50byBIVE1MRWxlbWVudCdzIHNldCBvZiBhbmltYXRpb25zLgogICBmcmllbmQgY2xhc3MgRE9NQW5pbWF0YWJsZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9zb3VyY2VfYnVmZmVyLmNjCmluZGV4IDA4ZWE2ZTQuLmI5OWZkZTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlci5jYwpAQCAtNDUsOSArNDUsNiBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vc291cmNlX2J1ZmZlci5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgpAQCAtOTQsMjEgKzkxLDExIEBACiAgICAgICBpZF8oaWQpLAogICAgICAgY2h1bmtfZGVtdXhlcl8oY2h1bmtfZGVtdXhlciksCiAgICAgICBtZWRpYV9zb3VyY2VfKG1lZGlhX3NvdXJjZSksCi0gICAgICB0cmFja19kZWZhdWx0c18obmV3IFRyYWNrRGVmYXVsdExpc3QoTlVMTCkpLAogICAgICAgZXZlbnRfcXVldWVfKGV2ZW50X3F1ZXVlKSwKLSAgICAgIG1vZGVfKGtTb3VyY2VCdWZmZXJBcHBlbmRNb2RlU2VnbWVudHMpLAotICAgICAgdXBkYXRpbmdfKGZhbHNlKSwKLSAgICAgIHRpbWVzdGFtcF9vZmZzZXRfKDApLAogICAgICAgYXVkaW9fdHJhY2tzXygKICAgICAgICAgICBuZXcgQXVkaW9UcmFja0xpc3Qoc2V0dGluZ3MsIG1lZGlhX3NvdXJjZS0+R2V0TWVkaWFFbGVtZW50KCkpKSwKICAgICAgIHZpZGVvX3RyYWNrc18oCi0gICAgICAgICAgbmV3IFZpZGVvVHJhY2tMaXN0KHNldHRpbmdzLCBtZWRpYV9zb3VyY2UtPkdldE1lZGlhRWxlbWVudCgpKSksCi0gICAgICBhcHBlbmRfd2luZG93X3N0YXJ0XygwKSwKLSAgICAgIGFwcGVuZF93aW5kb3dfZW5kXyhzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpLAotICAgICAgZmlyc3RfaW5pdGlhbGl6YXRpb25fc2VnbWVudF9yZWNlaXZlZF8oZmFsc2UpLAotICAgICAgcGVuZGluZ19hcHBlbmRfZGF0YV9vZmZzZXRfKDApLAotICAgICAgcGVuZGluZ19yZW1vdmVfc3RhcnRfKC0xKSwKLSAgICAgIHBlbmRpbmdfcmVtb3ZlX2VuZF8oLTEpIHsKKyAgICAgICAgICBuZXcgVmlkZW9UcmFja0xpc3Qoc2V0dGluZ3MsIG1lZGlhX3NvdXJjZS0+R2V0TWVkaWFFbGVtZW50KCkpKSB7CiAgIERDSEVDSyghaWRfLmVtcHR5KCkpOwogICBEQ0hFQ0sobWVkaWFfc291cmNlXyk7CiAgIERDSEVDSyhjaHVua19kZW11eGVyKTsKQEAgLTM0MCw2ICszMjcsOSBAQAogICBjaHVua19kZW11eGVyXyA9IE5VTEw7CiAgIG1lZGlhX3NvdXJjZV8gPSBOVUxMOwogICBldmVudF9xdWV1ZV8gPSBOVUxMOworCisgIHBlbmRpbmdfYXBwZW5kX2RhdGFfLnJlc2V0KCk7CisgIHBlbmRpbmdfYXBwZW5kX2RhdGFfY2FwYWNpdHlfID0gMDsKIH0KIAogZG91YmxlIFNvdXJjZUJ1ZmZlcjo6R2V0SGlnaGVzdFByZXNlbnRhdGlvblRpbWVzdGFtcCgpIGNvbnN0IHsKQEAgLTQxOSw4ICs0MDksMTUgQEAKIAogICBEQ0hFQ0soZGF0YSB8fCBzaXplID09IDApOwogICBpZiAoZGF0YSkgewotICAgIHBlbmRpbmdfYXBwZW5kX2RhdGFfLmluc2VydChwZW5kaW5nX2FwcGVuZF9kYXRhXy5lbmQoKSwgZGF0YSwgZGF0YSArIHNpemUpOworICAgIERDSEVDS19FUShwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8sIDB1KTsKKyAgICBpZiAocGVuZGluZ19hcHBlbmRfZGF0YV9jYXBhY2l0eV8gPCBzaXplKSB7CisgICAgICBwZW5kaW5nX2FwcGVuZF9kYXRhXy5yZXNldCgpOworICAgICAgcGVuZGluZ19hcHBlbmRfZGF0YV8ucmVzZXQobmV3IHVpbnQ4X3Rbc2l6ZV0pOworICAgICAgcGVuZGluZ19hcHBlbmRfZGF0YV9jYXBhY2l0eV8gPSBzaXplOworICAgIH0KKyAgICBTYk1lbW9yeUNvcHkocGVuZGluZ19hcHBlbmRfZGF0YV8uZ2V0KCksIGRhdGEsIHNpemUpOwogICB9CisgIHBlbmRpbmdfYXBwZW5kX2RhdGFfc2l6ZV8gPSBzaXplOwogICBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8gPSAwOwogCiAgIHVwZGF0aW5nXyA9IHRydWU7CkBAIC00MzYsMTUgKzQzMywxNCBAQAogCiAgIERDSEVDSyh1cGRhdGluZ18pOwogCi0gIERDSEVDS19HRShwZW5kaW5nX2FwcGVuZF9kYXRhXy5zaXplKCksIHBlbmRpbmdfYXBwZW5kX2RhdGFfb2Zmc2V0Xyk7Ci0gIHNpemVfdCBhcHBlbmRfc2l6ZSA9Ci0gICAgICBwZW5kaW5nX2FwcGVuZF9kYXRhXy5zaXplKCkgLSBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF87CisgIERDSEVDS19HRShwZW5kaW5nX2FwcGVuZF9kYXRhX3NpemVfLCBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8pOworICBzaXplX3QgYXBwZW5kX3NpemUgPSBwZW5kaW5nX2FwcGVuZF9kYXRhX3NpemVfIC0gcGVuZGluZ19hcHBlbmRfZGF0YV9vZmZzZXRfOwogICBhcHBlbmRfc2l6ZSA9IHN0ZDo6bWluKGFwcGVuZF9zaXplLCBrTWF4QXBwZW5kU2l6ZSk7CiAKLSAgdWludDggZHVtbXlbMV07CisgIHVpbnQ4X3QgZHVtbXk7CiAgIGNvbnN0IHVpbnQ4KiBkYXRhX3RvX2FwcGVuZCA9Ci0gICAgICBhcHBlbmRfc2l6ZSA+IDAgPyAmcGVuZGluZ19hcHBlbmRfZGF0YV9bMF0gKyBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8KLSAgICAgICAgICAgICAgICAgICAgICA6IGR1bW15OworICAgICAgYXBwZW5kX3NpemUgPiAwID8gcGVuZGluZ19hcHBlbmRfZGF0YV8uZ2V0KCkgKyBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8KKyAgICAgICAgICAgICAgICAgICAgICA6ICZkdW1teTsKIAogICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wX29mZnNldCA9IERvdWJsZVRvVGltZURlbHRhKHRpbWVzdGFtcF9vZmZzZXRfKTsKICAgYm9vbCBzdWNjZXNzID0gY2h1bmtfZGVtdXhlcl8tPkFwcGVuZERhdGEoCkBAIC00NTYsMjAgKzQ1MiwyMCBAQAogICB9CiAKICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgcGVuZGluZ19hcHBlbmRfZGF0YV8uY2xlYXIoKTsKKyAgICBwZW5kaW5nX2FwcGVuZF9kYXRhX3NpemVfID0gMDsKICAgICBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8gPSAwOwogICAgIEFwcGVuZEVycm9yKCk7CiAgIH0gZWxzZSB7CiAgICAgcGVuZGluZ19hcHBlbmRfZGF0YV9vZmZzZXRfICs9IGFwcGVuZF9zaXplOwogCi0gICAgaWYgKHBlbmRpbmdfYXBwZW5kX2RhdGFfb2Zmc2V0XyA8IHBlbmRpbmdfYXBwZW5kX2RhdGFfLnNpemUoKSkgeworICAgIGlmIChwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8gPCBwZW5kaW5nX2FwcGVuZF9kYXRhX3NpemVfKSB7CiAgICAgICBhcHBlbmRfdGltZXJfLlN0YXJ0KEZST01fSEVSRSwgYmFzZTo6VGltZURlbHRhKCksIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZTb3VyY2VCdWZmZXI6Ok9uQXBwZW5kVGltZXIpOwogICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHVwZGF0aW5nXyA9IGZhbHNlOwotICAgIHBlbmRpbmdfYXBwZW5kX2RhdGFfLmNsZWFyKCk7CisgICAgcGVuZGluZ19hcHBlbmRfZGF0YV9zaXplXyA9IDA7CiAgICAgcGVuZGluZ19hcHBlbmRfZGF0YV9vZmZzZXRfID0gMDsKIAogICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjp1cGRhdGUoKSk7CkBAIC01MjQsNyArNTIwLDcgQEAKICAgRENIRUNLX0VRKHBlbmRpbmdfcmVtb3ZlX3N0YXJ0XywgLTEpOwogCiAgIGFwcGVuZF90aW1lcl8uU3RvcCgpOwotICBwZW5kaW5nX2FwcGVuZF9kYXRhXy5jbGVhcigpOworICBwZW5kaW5nX2FwcGVuZF9kYXRhX3NpemVfID0gMDsKICAgcGVuZGluZ19hcHBlbmRfZGF0YV9vZmZzZXRfID0gMDsKIAogICB1cGRhdGluZ18gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuaCBiL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuaAppbmRleCBlZmRkMzRiLi4yYWE0YTNmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9zb3VyY2VfYnVmZmVyLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlci5oCkBAIC00NSw2ICs0NSw3IEBACiAjaWZuZGVmIENPQkFMVF9ET01fU09VUkNFX0JVRkZFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1NPVVJDRV9CVUZGRVJfSF8KIAorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTE3MCwyNSArMTcxLDI3IEBACiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGlkXzsKICAgbWVkaWE6OkNodW5rRGVtdXhlciogY2h1bmtfZGVtdXhlcl87CiAgIE1lZGlhU291cmNlKiBtZWRpYV9zb3VyY2VfOwotICBzY29wZWRfcmVmcHRyPFRyYWNrRGVmYXVsdExpc3Q+IHRyYWNrX2RlZmF1bHRzXzsKKyAgc2NvcGVkX3JlZnB0cjxUcmFja0RlZmF1bHRMaXN0PiB0cmFja19kZWZhdWx0c18gPSBuZXcgVHJhY2tEZWZhdWx0TGlzdChOVUxMKTsKICAgRXZlbnRRdWV1ZSogZXZlbnRfcXVldWVfOwogCi0gIFNvdXJjZUJ1ZmZlckFwcGVuZE1vZGUgbW9kZV87Ci0gIGJvb2wgdXBkYXRpbmdfOwotICBkb3VibGUgdGltZXN0YW1wX29mZnNldF87CisgIFNvdXJjZUJ1ZmZlckFwcGVuZE1vZGUgbW9kZV8gPSBrU291cmNlQnVmZmVyQXBwZW5kTW9kZVNlZ21lbnRzOworICBib29sIHVwZGF0aW5nXyA9IGZhbHNlOworICBkb3VibGUgdGltZXN0YW1wX29mZnNldF8gPSAwOwogICBzY29wZWRfcmVmcHRyPEF1ZGlvVHJhY2tMaXN0PiBhdWRpb190cmFja3NfOwogICBzY29wZWRfcmVmcHRyPFZpZGVvVHJhY2tMaXN0PiB2aWRlb190cmFja3NfOwotICBkb3VibGUgYXBwZW5kX3dpbmRvd19zdGFydF87Ci0gIGRvdWJsZSBhcHBlbmRfd2luZG93X2VuZF87CisgIGRvdWJsZSBhcHBlbmRfd2luZG93X3N0YXJ0XyA9IDA7CisgIGRvdWJsZSBhcHBlbmRfd2luZG93X2VuZF8gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CiAKICAgYmFzZTo6T25lU2hvdFRpbWVyIGFwcGVuZF90aW1lcl87Ci0gIGJvb2wgZmlyc3RfaW5pdGlhbGl6YXRpb25fc2VnbWVudF9yZWNlaXZlZF87Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBlbmRpbmdfYXBwZW5kX2RhdGFfOwotICBzaXplX3QgcGVuZGluZ19hcHBlbmRfZGF0YV9vZmZzZXRfOworICBib29sIGZpcnN0X2luaXRpYWxpemF0aW9uX3NlZ21lbnRfcmVjZWl2ZWRfID0gZmFsc2U7CisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHBlbmRpbmdfYXBwZW5kX2RhdGFfOworICBzaXplX3QgcGVuZGluZ19hcHBlbmRfZGF0YV9jYXBhY2l0eV8gPSAwOworICBzaXplX3QgcGVuZGluZ19hcHBlbmRfZGF0YV9zaXplXyA9IDA7CisgIHNpemVfdCBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8gPSAwOwogCiAgIGJhc2U6Ok9uZVNob3RUaW1lciByZW1vdmVfdGltZXJfOwotICBkb3VibGUgcGVuZGluZ19yZW1vdmVfc3RhcnRfOwotICBkb3VibGUgcGVuZGluZ19yZW1vdmVfZW5kXzsKKyAgZG91YmxlIHBlbmRpbmdfcmVtb3ZlX3N0YXJ0XyA9IC0xOworICBkb3VibGUgcGVuZGluZ19yZW1vdmVfZW5kXyA9IC0xOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGRvbQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2RvbV9wYXJzZXJfdGVzdC5neXAgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvZG9tX3BhcnNlcl90ZXN0Lmd5cAppbmRleCA2NzMwZDI1Li5hZWRiNjEyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvZG9tX3BhcnNlcl90ZXN0Lmd5cAorKysgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvZG9tX3BhcnNlcl90ZXN0Lmd5cApAQCAtMjgsMTAgKzI4LDEwIEBACiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL2RvbS5neXA6ZG9tJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vdGVzdGluZy9kb21fdGVzdGluZy5neXA6ZG9tX3Rlc3RpbmcnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbV9wYXJzZXIvZG9tX3BhcnNlci5neXA6ZG9tX3BhcnNlcicsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvaHRtbF9kZWNvZGVyLmNjIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2h0bWxfZGVjb2Rlci5jYwppbmRleCAwYWRiZWYwLi5iNjYyNTI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvaHRtbF9kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9odG1sX2RlY29kZXIuY2MKQEAgLTY0LDcgKzY0LDEwIEBACiAgICAgICByZXF1aXJlX2NzcF8gPT0gY3NwOjprQ1NQT3B0aW9uYWwpIHsKICAgICByZXR1cm4gbG9hZGVyOjprTG9hZFJlc3BvbnNlQ29udGludWU7CiAgIH0gZWxzZSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkZhaWx1cmUgcmVjZWl2aW5nIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGhlYWRlcnMiOworICAgIExPRyhFUlJPUikgPDwgIkZhaWx1cmUgcmVjZWl2aW5nIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGhlYWRlcnMgIgorICAgICAgICAgICAgICAgICAgImZvciBVUkw6ICIgPDwgdXJsX2ZldGNoZXItPkdldFVSTCgpIDw8ICIuIjsKKyAgICBMT0coRVJST1IpIDw8ICJUaGUgc2VydmVyICptdXN0KiBzZW5kIENTUCBoZWFkZXJzIG9yIENvYmFsdCB3aWxsIG5vdCAiCisgICAgICAgICAgICAgICAgICAibG9hZCB0aGUgcGFnZS4iOwogICAgIHJldHVybiBsb2FkZXI6OmtMb2FkUmVzcG9uc2VBYm9ydDsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9leHRlbnNpb24vZXh0ZW5zaW9uLmd5cCBiL3NyYy9jb2JhbHQvZXh0ZW5zaW9uL2V4dGVuc2lvbi5neXAKaW5kZXggMzQwZmJjOS4uYmY2M2MwZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9leHRlbnNpb24vZXh0ZW5zaW9uLmd5cAorKysgYi9zcmMvY29iYWx0L2V4dGVuc2lvbi9leHRlbnNpb24uZ3lwCkBAIC0yNiwxMSArMjYsMTEgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8QChjb2JhbHRfcGxhdGZvcm1fZGVwZW5kZW5jaWVzKScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zdGFyYm9hcmQuZ3lwOnN0YXJib2FyZCcsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ2V4dGVuc2lvbl90ZXN0X2RlcGxveScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2V4dGVuc2lvbi9leHRlbnNpb25fdGVzdC5jYyBiL3NyYy9jb2JhbHQvZXh0ZW5zaW9uL2V4dGVuc2lvbl90ZXN0LmNjCmluZGV4IDA0NGJkZGUuLjI2MTViYTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZXh0ZW5zaW9uL2V4dGVuc2lvbl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZXh0ZW5zaW9uL2V4dGVuc2lvbl90ZXN0LmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8Y21hdGg+CiAKICNpbmNsdWRlICJjb2JhbHQvZXh0ZW5zaW9uL2dyYXBoaWNzLmgiCisjaW5jbHVkZSAiY29iYWx0L2V4dGVuc2lvbi9pbnN0YWxsYXRpb25fbWFuYWdlci5oIgogI2luY2x1ZGUgImNvYmFsdC9leHRlbnNpb24vcGxhdGZvcm1fc2VydmljZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKQEAgLTM0LDcgKzM1LDggQEAKICAgfQogCiAgIEVYUEVDVF9TVFJFUShleHRlbnNpb25fYXBpLT5uYW1lLCBrRXh0ZW5zaW9uTmFtZSk7Ci0gIEVYUEVDVF9FUShleHRlbnNpb25fYXBpLT52ZXJzaW9uLCAxKSA8PCAiSW52YWxpZCB2ZXJzaW9uIjsKKyAgRVhQRUNUX1RSVUUoZXh0ZW5zaW9uX2FwaS0+dmVyc2lvbiA9PSAxIHx8CisgICAgICAgICAgICAgIGV4dGVuc2lvbl9hcGktPnZlcnNpb24gPT0gMikgPDwgIkludmFsaWQgdmVyc2lvbiI7CiAgIEVYUEVDVF9UUlVFKGV4dGVuc2lvbl9hcGktPkhhcyAhPSBOVUxMKTsKICAgRVhQRUNUX1RSVUUoZXh0ZW5zaW9uX2FwaS0+T3BlbiAhPSBOVUxMKTsKICAgRVhQRUNUX1RSVUUoZXh0ZW5zaW9uX2FwaS0+Q2xvc2UgIT0gTlVMTCk7CkBAIC01NywxOSArNTksNTIgQEAKICAgfQogCiAgIEVYUEVDVF9TVFJFUShleHRlbnNpb25fYXBpLT5uYW1lLCBrRXh0ZW5zaW9uTmFtZSk7Ci0gIEVYUEVDVF9FUShleHRlbnNpb25fYXBpLT52ZXJzaW9uLCAxKSA8PCAiSW52YWxpZCB2ZXJzaW9uIjsKKyAgRVhQRUNUX1RSVUUoZXh0ZW5zaW9uX2FwaS0+dmVyc2lvbiA9PSAxIHx8CisgICAgICAgICAgICAgIGV4dGVuc2lvbl9hcGktPnZlcnNpb24gPT0gMikgPDwgIkludmFsaWQgdmVyc2lvbiI7CiAgIEVYUEVDVF9UUlVFKGV4dGVuc2lvbl9hcGktPkdldE1heGltdW1GcmFtZUludGVydmFsSW5NaWxsaXNlY29uZHMgIT0gTlVMTCk7CisgIGlmIChleHRlbnNpb25fYXBpLT52ZXJzaW9uID49IDIpIHsKKyAgICBFWFBFQ1RfVFJVRShleHRlbnNpb25fYXBpLT5HZXRNaW5pbXVtRnJhbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzICE9IE5VTEwpOworICB9CiAKICAgZmxvYXQgbWF4aW11bV9mcmFtZV9pbnRlcnZhbCA9CiAgICAgICBleHRlbnNpb25fYXBpLT5HZXRNYXhpbXVtRnJhbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKCk7CiAgIEVYUEVDVF9GQUxTRShzdGQ6OmlzbmFuKG1heGltdW1fZnJhbWVfaW50ZXJ2YWwpKTsKIAorICBpZiAoZXh0ZW5zaW9uX2FwaS0+dmVyc2lvbiA+PSAyKSB7CisgICAgZmxvYXQgbWluaW11bV9mcmFtZV9pbnRlcnZhbCA9CisgICAgICBleHRlbnNpb25fYXBpLT5HZXRNaW5pbXVtRnJhbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKCk7CisgICAgRVhQRUNUX0dUKG1pbmltdW1fZnJhbWVfaW50ZXJ2YWwsIDApOworICB9CiAgIGNvbnN0IEV4dGVuc2lvbkFwaSogc2Vjb25kX2V4dGVuc2lvbl9hcGkgPSBzdGF0aWNfY2FzdDxjb25zdCBFeHRlbnNpb25BcGkqPigKICAgICAgIFNiU3lzdGVtR2V0RXh0ZW5zaW9uKGtFeHRlbnNpb25OYW1lKSk7CiAgIEVYUEVDVF9FUShzZWNvbmRfZXh0ZW5zaW9uX2FwaSwgZXh0ZW5zaW9uX2FwaSkKICAgICAgIDw8ICJFeHRlbnNpb24gc3RydWN0IHNob3VsZCBiZSBhIHNpbmdsZXRvbiI7CiB9CiAKK1RFU1QoRXh0ZW5zaW9uVGVzdCwgSW5zdGFsbGF0aW9uTWFuYWdlcikgeworICB0eXBlZGVmIENvYmFsdEV4dGVuc2lvbkluc3RhbGxhdGlvbk1hbmFnZXJBcGkgRXh0ZW5zaW9uQXBpOworICBjb25zdCBjaGFyKiBrRXh0ZW5zaW9uTmFtZSA9IGtDb2JhbHRFeHRlbnNpb25JbnN0YWxsYXRpb25NYW5hZ2VyTmFtZTsKKworICBjb25zdCBFeHRlbnNpb25BcGkqIGV4dGVuc2lvbl9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgRXh0ZW5zaW9uQXBpKj4oU2JTeXN0ZW1HZXRFeHRlbnNpb24oa0V4dGVuc2lvbk5hbWUpKTsKKyAgaWYgKCFleHRlbnNpb25fYXBpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgRVhQRUNUX1NUUkVRKGV4dGVuc2lvbl9hcGktPm5hbWUsIGtFeHRlbnNpb25OYW1lKTsKKyAgRVhQRUNUX1RSVUUoZXh0ZW5zaW9uX2FwaS0+dmVyc2lvbiA9PSAxIHx8CisgICAgICAgICAgICAgIGV4dGVuc2lvbl9hcGktPnZlcnNpb24gPT0gMikgPDwgIkludmFsaWQgdmVyc2lvbiI7CisgIEVYUEVDVF9UUlVFKGV4dGVuc2lvbl9hcGktPkdldEN1cnJlbnRJbnN0YWxsYXRpb25JbmRleCAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZXh0ZW5zaW9uX2FwaS0+TWFya0luc3RhbGxhdGlvblN1Y2Nlc3NmdWwgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGV4dGVuc2lvbl9hcGktPlJlcXVlc3RSb2xsRm9yd2FyZFRvSW5zdGFsbGF0aW9uICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShleHRlbnNpb25fYXBpLT5HZXRJbnN0YWxsYXRpb25QYXRoICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShleHRlbnNpb25fYXBpLT5TZWxlY3ROZXdJbnN0YWxsYXRpb25JbmRleCAhPSBOVUxMKTsKKworICBjb25zdCBFeHRlbnNpb25BcGkqIHNlY29uZF9leHRlbnNpb25fYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEV4dGVuc2lvbkFwaSo+KFNiU3lzdGVtR2V0RXh0ZW5zaW9uKGtFeHRlbnNpb25OYW1lKSk7CisgIEVYUEVDVF9FUShzZWNvbmRfZXh0ZW5zaW9uX2FwaSwgZXh0ZW5zaW9uX2FwaSkKKyAgICAgIDw8ICJFeHRlbnNpb24gc3RydWN0IHNob3VsZCBiZSBhIHNpbmdsZXRvbiI7Cit9CiB9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDExCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2V4dGVuc2lvbi9ncmFwaGljcy5oIGIvc3JjL2NvYmFsdC9leHRlbnNpb24vZ3JhcGhpY3MuaAppbmRleCBiNjhhYzlmLi5iMGUyYmI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2V4dGVuc2lvbi9ncmFwaGljcy5oCisrKyBiL3NyYy9jb2JhbHQvZXh0ZW5zaW9uL2dyYXBoaWNzLmgKQEAgLTQ4LDYgKzQ4LDE1IEBACiAgIC8vIHByZWNlZGVuY2Ugb3ZlciB0aGlzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1pbmltdW0gZnJhbWUgdGltZSBpcyA4bXMgYW5kCiAgIC8vIHRoZSBtYXhpbXVtIGZyYW1lIGludGVydmFsIGlzIDBtcywgdGhlbiB0aGUgcmVuZGVyZXIgd2lsbCB0YXJnZXQgMTI1IGZwcy4KICAgZmxvYXQgKCpHZXRNYXhpbXVtRnJhbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKSgpOworCisgIC8vIFRoZSBmaWVsZHMgYmVsb3cgdGhpcyBwb2ludCB3ZXJlIGFkZGVkIGluIHZlcnNpb24gMiBvciBsYXRlci4KKworICAvLyBBbGxvdyB0aHJvdHRsaW5nIG9mIHRoZSBmcmFtZSByYXRlLiBUaGlzIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgorICAvLyBtaWxsaXNlY29uZHMgYW5kIGNhbiBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gS2VlcCBpbiBtaW5kIHRoYXQKKyAgLy8gc3dhcHBpbmcgZnJhbWVzIG1heSB0YWtlIHNvbWUgYWRkaXRpb25hbCBwcm9jZXNzaW5nIHRpbWUsIHNvIGl0IG1heSBiZQorICAvLyBiZXR0ZXIgdG8gc3BlY2lmeSBhIGxvd2VyIGRlbGF5LiBGb3IgZXhhbXBsZSwgJzMzJyBpbnN0ZWFkIG9mICczMy4zMycKKyAgLy8gZm9yIDMwIEh6IHJlZnJlc2guCisgIGZsb2F0ICgqR2V0TWluaW11bUZyYW1lSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcykoKTsKIH0gQ29iYWx0RXh0ZW5zaW9uR3JhcGhpY3NBcGk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9leHRlbnNpb24vaW5zdGFsbGF0aW9uX21hbmFnZXIuaCBiL3NyYy9jb2JhbHQvZXh0ZW5zaW9uL2luc3RhbGxhdGlvbl9tYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5OWNkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZXh0ZW5zaW9uL2luc3RhbGxhdGlvbl9tYW5hZ2VyLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9FWFRFTlNJT05fSU5TVEFMTEFUSU9OX01BTkFHRVJfSF8KKyNkZWZpbmUgQ09CQUxUX0VYVEVOU0lPTl9JTlNUQUxMQVRJT05fTUFOQUdFUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorCisjZGVmaW5lIElNX0VYVF9FUlJPUiAtMQorI2RlZmluZSBJTV9FWFRfU1VDQ0VTUyAwCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBrQ29iYWx0RXh0ZW5zaW9uSW5zdGFsbGF0aW9uTWFuYWdlck5hbWUgXAorICAiZGV2LmNvYmFsdC5leHRlbnNpb24uSW5zdGFsbGF0aW9uTWFuYWdlciIKKwordHlwZWRlZiBzdHJ1Y3QgQ29iYWx0RXh0ZW5zaW9uSW5zdGFsbGF0aW9uTWFuYWdlckFwaSB7CisgIC8vIE5hbWUgc2hvdWxkIGJlIHRoZSBzdHJpbmcga0NvYmFsdEV4dGVuc2lvbkluc3RhbGxhdGlvbk1hbmFnZXJOYW1lLgorICAvLyBUaGlzIGhlbHBzIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGV4dGVuc2lvbiBBUEkgaXMgY29ycmVjdC4KKyAgY29uc3QgY2hhciogbmFtZTsKKworICAvLyBUaGlzIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgQVBJIHRoYXQgaXMgaW1wbGVtZW50ZWQuCisgIHVpbnQzMl90IHZlcnNpb247CisKKyAgLy8gSW5zdGFsbGF0aW9uIE1hbmFnZXIgQVBJIHdyYXBwZXIuCisgIC8vIEZvciBtb3JlIGRldGFpbHMsIGNoZWNrOgorICAvLyAgc3RhcmJvYXJkL2xvYWRlcl9hcHAvaW5zdGFsbGF0aW9uX21hbmFnZXIuaAorICBpbnQgKCpHZXRDdXJyZW50SW5zdGFsbGF0aW9uSW5kZXgpKCk7CisgIGludCAoKk1hcmtJbnN0YWxsYXRpb25TdWNjZXNzZnVsKShpbnQgaW5zdGFsbGF0aW9uX2luZGV4KTsKKyAgaW50ICgqUmVxdWVzdFJvbGxGb3J3YXJkVG9JbnN0YWxsYXRpb24pKGludCBpbnN0YWxsYXRpb25faW5kZXgpOworICBpbnQgKCpHZXRJbnN0YWxsYXRpb25QYXRoKShpbnQgaW5zdGFsbGF0aW9uX2luZGV4LCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF0aF9sZW5ndGgpOworICBpbnQgKCpTZWxlY3ROZXdJbnN0YWxsYXRpb25JbmRleCkoKTsKK30gQ29iYWx0RXh0ZW5zaW9uSW5zdGFsbGF0aW9uTWFuYWdlckFwaTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBDT0JBTFRfRVhURU5TSU9OX0lOU1RBTExBVElPTl9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Rlc2t0b3AuY2MgYi9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Rlc2t0b3AuY2MKaW5kZXggODVjY2JiMS4uMjIxYjA0ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9kZXNrdG9wLmNjCisrKyBiL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZGVza3RvcC5jYwpAQCAtMjQxLDggKzI0MSw3IEBACiAgIGtleXByZXNzX2dlbmVyYXRvcl9maWx0ZXJfLkhhbmRsZUtleWJvYXJkRXZlbnQodHlwZSwga2V5Ym9hcmRfZXZlbnQpOwogCiAgIGludDMyX3Qga2V5X2NvZGVfaW5faW50MzIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihrZXlfY29kZSk7Ci0gIG92ZXJsYXlfaW5mbzo6T3ZlcmxheUluZm9SZWdpc3RyeTo6UmVnaXN0ZXIoCi0gICAgICAiaW5wdXRfbWFuYWdlcjprZXlkb3duIiwgJmtleV9jb2RlX2luX2ludDMyLCBzaXplb2Yoa2V5X2NvZGVfaW5faW50MzIpKTsKKyAgb3ZlcmxheV9pbmZvOjpPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZWdpc3Rlcigia2V5ZG93biIsIGtleV9jb2RlX2luX2ludDMyKTsKIH0KIAogdm9pZCBJbnB1dERldmljZU1hbmFnZXJEZXNrdG9wOjpIYW5kbGVQb2ludGVyRXZlbnQoCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9ib3guY2MgYi9zcmMvY29iYWx0L2xheW91dC9ib3guY2MKaW5kZXggNGVmZjgyNy4uYWM0ZWJlZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2JveC5jYwpAQCAtMTMyLDExICsxMzIsMTEgQEAKIEJveDo6fkJveCgpIHsgbGF5b3V0X3N0YXRfdHJhY2tlcl8tPk9uQm94RGVzdHJveWVkKCk7IH0KIAogYm9vbCBCb3g6OklzUG9zaXRpb25lZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbXB1dGVkX3N0eWxlKCktPnBvc2l0aW9uKCkgIT0gY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0U3RhdGljKCk7CisgIHJldHVybiBjb21wdXRlZF9zdHlsZSgpLT5Jc1Bvc2l0aW9uZWQoKTsKIH0KIAogYm9vbCBCb3g6OklzVHJhbnNmb3JtZWQoKSBjb25zdCB7Ci0gIHJldHVybiBjb21wdXRlZF9zdHlsZSgpLT50cmFuc2Zvcm0oKSAhPSBjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXROb25lKCk7CisgIHJldHVybiBjb21wdXRlZF9zdHlsZSgpLT5Jc1RyYW5zZm9ybWVkKCk7CiB9CiAKIGJvb2wgQm94OjpJc0Fic29sdXRlbHlQb3NpdGlvbmVkKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvY29udGFpbmVyX2JveC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2NvbnRhaW5lcl9ib3guY2MKaW5kZXggM2M5ZWY5ZS4uYWNkZGRmZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvY29udGFpbmVyX2JveC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9jb250YWluZXJfYm94LmNjCkBAIC0xNzAsNyArMTcwLDggQEAKIH0KIAogYm9vbCBDb250YWluZXJCb3g6OklzQ29udGFpbmluZ0Jsb2NrRm9yUG9zaXRpb25BYnNvbHV0ZUVsZW1lbnRzKCkgY29uc3QgewotICByZXR1cm4gcGFyZW50KCkgPT0gTlVMTCB8fCBJc1Bvc2l0aW9uZWQoKSB8fCBJc1RyYW5zZm9ybWVkKCk7CisgIHJldHVybiBwYXJlbnQoKSA9PSBOVUxMIHx8CisgICAgICAgICBjb21wdXRlZF9zdHlsZSgpLT5Jc0NvbnRhaW5pbmdCbG9ja0ZvclBvc2l0aW9uQWJzb2x1dGVFbGVtZW50cygpOwogfQogCiBib29sIENvbnRhaW5lckJveDo6SXNDb250YWluaW5nQmxvY2tGb3JQb3NpdGlvbkZpeGVkRWxlbWVudHMoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9sYXlvdXQuZ3lwIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0Lmd5cAppbmRleCBiZWYxNjg2Li5lNjA4MzkwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9sYXlvdXQuZ3lwCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dC5neXAKQEAgLTEzOCwxMSArMTM4LDExIEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Nzc19wYXJzZXIvY3NzX3BhcnNlci5neXA6Y3NzX3BhcnNlcicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbGF5b3V0L2xheW91dC5neXA6bGF5b3V0X3Rlc3RpbmcnLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAnbGF5b3V0JywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKIAogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xpbmVfYm94LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV9ib3guY2MKaW5kZXggYTczYTQwMS4uNzViODNjMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV9ib3guY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV9ib3guY2MKQEAgLTg3MSw5ICs4NzEsOCBAQAogICAvLyBUaGUgc3RhcnQgZWRnZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGVsbGlwc2lzIHdhcyBldmVudHVhbGx5IHBsYWNlZC4gVGhpcwogICAvLyB3aWxsIGJlIHNldCBieSBUcnlQbGFjZUVsbGlwc2lzT3JQcm9jZXNzUGxhY2VkRWxsaXBzaXMoKSB3aXRoaW4gb25lIG9mIHRoZQogICAvLyBjaGlsZCBib3hlcy4KLSAgLy8gTk9URTogV2hpbGUgdGhpcyBpcyBpcyBndWFyYW50ZWVkIHRvIGJlIHNldCBsYXRlciwgaW5pdGlhbGl6aW5nIGl0IGhlcmUKLSAgLy8ga2VlcHMgY29tcGlsZXJzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgaXQgYmVpbmcgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZQotICAvLyBiZWxvdy4KKyAgLy8gTk9URTogV2hpbGUgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIHNldCBsYXRlciwgaW5pdGlhbGl6aW5nIGl0IGhlcmUga2VlcHMKKyAgLy8gY29tcGlsZXJzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgaXQgYmVpbmcgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBiZWxvdy4KICAgTGF5b3V0VW5pdCBwbGFjZWRfc3RhcnRfZWRnZV9vZmZzZXQ7CiAKICAgLy8gV2FsayBlYWNoIGJveCB3aXRoaW4gdGhlIGxpbmUgaW4gYmFzZSBkaXJlY3Rpb24gb3JkZXIgYXR0ZW1wdGluZyB0byBwbGFjZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3Rlc3RzLmd5cCBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF90ZXN0cy5neXAKaW5kZXggMzU2ODNiMi4uMDViMzRhNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3Rlc3RzLmd5cAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfdGVzdHMuZ3lwCkBAIC02NSwxMiArNjUsMTIgQEAKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6YnJvd3NlcicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXIuZ3lwOnJlbmRlcl90cmVlX3BpeGVsX3Rlc3RlcicsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS91cmwvdXJsLmd5cDp1cmwnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAnbGF5b3V0X3Rlc3RfdXRpbHMnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogCiAgICAgewpAQCAtOTQsMTIgKzk0LDEyIEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cDpicm93c2VyJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3VybC91cmwuZ3lwOnVybCcsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdsYXlvdXRfdGVzdF91dGlscycsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3AvaW1nLXNyYy5odG1sIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NwL2ltZy1zcmMuaHRtbAppbmRleCBhZDYyOGFmLi4yMGE1OWVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3AvaW1nLXNyYy5odG1sCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2NzcC9pbWctc3JjLmh0bWwKQEAgLTI0LDYgKzI0LDcgQEAKICAgICB2YXIgZGl2X2lkcyA9IFsiaW5zZWN1cmUiLCAic2VjdXJlIl07CiAKICAgICB2YXIgdXJscyA9IFsiaHR0cDovLyIgKyBpbWFnZV9iYXNlLCAiaHR0cHM6Ly8iICsgaW1hZ2VfYmFzZV07CisgICAgdmFyIG51bV9lcnJvcnMgPSAwOwogICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICB2YXIgZGl2bmFtZSA9IGRpdl9pZHNbaV07CiAgICAgICB2YXIgdXJsID0gdXJsc1tpXTsKQEAgLTM2LDggKzM3LDEyIEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGltYWdlc1tpXS5vbmVycm9yID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgd29uJ3QgYmUgY2FsbGVkIGR1ZSB0byBhbiBvdXRzdGFuZGluZyBidWcuCisgICAgICAgICsrbnVtX2Vycm9yczsKICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGxvYWRpbmc6ICcgKyB0aGlzLnNyYyk7CisgICAgICAgIGlmIChudW1fZXJyb3JzID49IDIpIHsKKyAgICAgICAgICBjb25zb2xlLmxvZygnTW9yZSBlcnJvcnMgdGhhbiBleHBlY3RlZCEnKTsKKyAgICAgICAgICB3aW5kb3cudGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7CisgICAgICAgIH0KICAgICAgIH0KICAgICAgIGltYWdlc1tpXS5zcmMgPSB1cmxzW2ldOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5neXAgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwCmluZGV4IDg3Y2RhZGUuLmQwNWQ0NDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5neXAKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmd5cApAQCAtMTU5LDcgKzE1OSw2IEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWF0aC9tYXRoLmd5cDptYXRoJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L290cy9vdHMuZ3lwOm90cycsCkBAIC0xNjcsNiArMTY2LDcgQEAKICAgICAgICAgJ2xvYWRlcl9jb3B5X3Rlc3RfZGF0YScsCiAgICAgICAgICc8QChjb2JhbHRfcGxhdGZvcm1fZGVwZW5kZW5jaWVzKScsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9uZXRfZmV0Y2hlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL25ldF9mZXRjaGVyLmNjCmluZGV4IDMzMDI0MTguLmJmNWEwOTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL25ldF9mZXRjaGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL25ldF9mZXRjaGVyLmNjCkBAIC0xNzIsMTEgKzE3MiwxMyBAQAogICAgIGF1dG8qIGRvd25sb2FkX2RhdGFfd3JpdGVyID0KICAgICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8VVJMRmV0Y2hlclN0cmluZ1dyaXRlcio+KAogICAgICAgICAgICAgc291cmNlLT5HZXRSZXNwb25zZVdyaXRlcigpKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRhdGEgPSBkb3dubG9hZF9kYXRhX3dyaXRlci0+ZGF0YSgpOwotICAgIGlmICghZGF0YS0+ZW1wdHkoKSkgeworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgZG93bmxvYWRfZGF0YV93cml0ZXItPkdldEFuZFJlc2V0RGF0YSgmZGF0YSk7CisgICAgaWYgKCFkYXRhLmVtcHR5KCkpIHsKICAgICAgIERMT0coSU5GTykgPDwgImluIE9uVVJMRmV0Y2hDb21wbGV0ZSBkYXRhIHN0aWxsIGhhcyBieXRlczogIgotICAgICAgICAgICAgICAgICA8PCBkYXRhLT5zaXplKCk7Ci0gICAgICBoYW5kbGVyKCktPk9uUmVjZWl2ZWRQYXNzZWQodGhpcywgc3RkOjptb3ZlKGRhdGEpKTsKKyAgICAgICAgICAgICAgICAgPDwgZGF0YS5zaXplKCk7CisgICAgICBoYW5kbGVyKCktPk9uUmVjZWl2ZWRQYXNzZWQoCisgICAgICAgICAgdGhpcywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPihuZXcgc3RkOjpzdHJpbmcoc3RkOjptb3ZlKGRhdGEpKSkpOwogICAgIH0KICAgICBoYW5kbGVyKCktPk9uRG9uZSh0aGlzKTsKICAgfSBlbHNlIHsKQEAgLTIwOSwxNSArMjExLDE3IEBACiAgICAgYXV0byogZG93bmxvYWRfZGF0YV93cml0ZXIgPQogICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxVUkxGZXRjaGVyU3RyaW5nV3JpdGVyKj4oCiAgICAgICAgICAgICBzb3VyY2UtPkdldFJlc3BvbnNlV3JpdGVyKCkpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IGRvd25sb2FkX2RhdGFfd3JpdGVyLT5kYXRhKCk7Ci0gICAgaWYgKGRhdGEtPmVtcHR5KCkpIHsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIGRvd25sb2FkX2RhdGFfd3JpdGVyLT5HZXRBbmRSZXNldERhdGEoJmRhdGEpOworICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKICAgICAgIHJldHVybjsKICAgICB9CiAjaWYgZGVmaW5lZChIQU5ETEVfQ09SRV9EVU1QKQogICAgIG5ldF9mZXRjaGVyX2xvZy5HZXQoKS5JbmNyZW1lbnRGZXRjaGVkQnl0ZXMoCi0gICAgICAgIHN0YXRpY19jYXN0PGludD4oZGF0YS0+bGVuZ3RoKCkpKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihkYXRhLmxlbmd0aCgpKSk7CiAjZW5kaWYKLSAgICBoYW5kbGVyKCktPk9uUmVjZWl2ZWRQYXNzZWQodGhpcywgc3RkOjptb3ZlKGRhdGEpKTsKKyAgICBoYW5kbGVyKCktPk9uUmVjZWl2ZWRQYXNzZWQoCisgICAgICAgIHRoaXMsIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4obmV3IHN0ZDo6c3RyaW5nKHN0ZDo6bW92ZShkYXRhKSkpKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci91cmxfZmV0Y2hlcl9zdHJpbmdfd3JpdGVyLmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvdXJsX2ZldGNoZXJfc3RyaW5nX3dyaXRlci5jYwppbmRleCBiNTgzNzk5Li41NGFlODFhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci91cmxfZmV0Y2hlcl9zdHJpbmdfd3JpdGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL3VybF9mZXRjaGVyX3N0cmluZ193cml0ZXIuY2MKQEAgLTEzLDYgKzEzLDggQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci91cmxfZmV0Y2hlcl9zdHJpbmdfd3JpdGVyLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJuZXQvYmFzZS9uZXRfZXJyb3JzLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtMjQsNiArMjYsMTAgQEAKIC8vICAgRENIRUNLKGNvbnN1bWVyX3Rhc2tfcnVubmVyKTsKIC8vIH0KIAorbmFtZXNwYWNlIHsKK2NvbnN0IGludDY0X3Qga1ByZUFsbG9jYXRlVGhyZXNob2xkID0gNjQgKiAxMDI0OworfSAgLy8gbmFtZXNwYWNlCisKIFVSTEZldGNoZXJTdHJpbmdXcml0ZXI6OlVSTEZldGNoZXJTdHJpbmdXcml0ZXIoKSA9IGRlZmF1bHQ7CiAKIFVSTEZldGNoZXJTdHJpbmdXcml0ZXI6On5VUkxGZXRjaGVyU3RyaW5nV3JpdGVyKCkgPSBkZWZhdWx0OwpAQCAtMzMsMjIgKzM5LDU2IEBACiAgIHJldHVybiBuZXQ6Ok9LOwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IFVSTEZldGNoZXJTdHJpbmdXcml0ZXI6OmRhdGEoKSB7Cit2b2lkIFVSTEZldGNoZXJTdHJpbmdXcml0ZXI6Ok9uUmVzcG9uc2VTdGFydGVkKGludDY0X3QgY29udGVudF9sZW5ndGgpIHsKICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgaWYgKCFkYXRhXykgewotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPigpOworCisgIGlmIChjb250ZW50X2xlbmd0aCA+PSAwKSB7CisgICAgY29udGVudF9sZW5ndGhfID0gY29udGVudF9sZW5ndGg7CiAgIH0KLSAgcmV0dXJuIHN0ZDo6bW92ZShkYXRhXyk7Cit9CisKK2Jvb2wgVVJMRmV0Y2hlclN0cmluZ1dyaXRlcjo6SGFzRGF0YSgpIGNvbnN0IHsKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgcmV0dXJuICFkYXRhXy5lbXB0eSgpOworfQorCit2b2lkIFVSTEZldGNoZXJTdHJpbmdXcml0ZXI6OkdldEFuZFJlc2V0RGF0YShzdGQ6OnN0cmluZyogZGF0YSkgeworICBEQ0hFQ0soZGF0YSk7CisKKyAgc3RkOjpzdHJpbmcgZW1wdHk7CisgIGRhdGEtPnN3YXAoZW1wdHkpOworCisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIGRhdGFfLnN3YXAoKmRhdGEpOwogfQogCiBpbnQgVVJMRmV0Y2hlclN0cmluZ1dyaXRlcjo6V3JpdGUobmV0OjpJT0J1ZmZlciogYnVmZmVyLCBpbnQgbnVtX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldDo6Q29tcGxldGlvbk9uY2VDYWxsYmFjayAvKmNhbGxiYWNrKi8pIHsKICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgaWYgKCFkYXRhXykgewotICAgIGRhdGFfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnN0cmluZz4oKTsKKworICBpZiAoY29udGVudF9vZmZzZXRfID09IDAgJiYgbnVtX2J5dGVzIDw9IGNvbnRlbnRfbGVuZ3RoXykgeworICAgIC8vIFByZS1hbGxvY2F0ZSB0aGUgd2hvbGUgYnVmZmVyIGZvciBzbWFsbCBkb3dubG9hZHMsIGhvcGUgdGhhdCBhbGwgZGF0YSBjYW4KKyAgICAvLyBiZSBkb3dubG9hZGVkIGJlZm9yZSBHZXRBbmRSZXNldERhdGEoKSBpcyBjYWxsZWQuCisgICAgaWYgKGNvbnRlbnRfbGVuZ3RoXyA8PSBrUHJlQWxsb2NhdGVUaHJlc2hvbGQpIHsKKyAgICAgIGRhdGFfLnJlc2VydmUoY29udGVudF9sZW5ndGhfKTsKKyAgICB9IGVsc2UgeworICAgICAgZGF0YV8ucmVzZXJ2ZShrUHJlQWxsb2NhdGVUaHJlc2hvbGQpOworICAgIH0KICAgfQogCi0gIGRhdGFfLT5hcHBlbmQoYnVmZmVyLT5kYXRhKCksIG51bV9ieXRlcyk7CisgIGlmIChjb250ZW50X2xlbmd0aF8gPiAwICYmIGNvbnRlbnRfbGVuZ3RoXyA+IGNvbnRlbnRfb2Zmc2V0XyAmJgorICAgICAgZGF0YV8uc2l6ZSgpICsgbnVtX2J5dGVzID4gZGF0YV8uY2FwYWNpdHkoKSkgeworICAgIC8vIFRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCwgYW5kIHN0ZDo6c3RyaW5nIGlzIGdvaW5nIHRvIGRvdWJsZQorICAgIC8vIHRoZSBhbGxvY2F0aW9uLiAgU28gYSBjb250ZW50IGluICIxTSArIDEiIGJ5dGVzIG1heSBlbmQgdXAgYWxsb2NhdGluZyAyTQorICAgIC8vIGJ5dGVzLiAgVHJ5IHRvIHJlc2VydmUgdGhlIHByb3BlciBzaXplIHRvIGF2b2lkIHRoaXMuCisgICAgYXV0byBjb250ZW50X3JlbWFpbmluZyA9IGNvbnRlbnRfbGVuZ3RoXyAtIGNvbnRlbnRfb2Zmc2V0XzsKKyAgICBpZiAoZGF0YV8uc2l6ZSgpICsgY29udGVudF9yZW1haW5pbmcgPCBkYXRhXy5jYXBhY2l0eSgpICogMikgeworICAgICAgZGF0YV8ucmVzZXJ2ZShkYXRhXy5zaXplKCkgKyBjb250ZW50X3JlbWFpbmluZyk7CisgICAgfQorICB9CisKKyAgZGF0YV8uYXBwZW5kKGJ1ZmZlci0+ZGF0YSgpLCBudW1fYnl0ZXMpOworICBjb250ZW50X29mZnNldF8gKz0gbnVtX2J5dGVzOwogICAvLyBjb25zdW1lcl90YXNrX3J1bm5lcl8tPlBvc3RUYXNrKEZST01fSEVSRSwKICAgLy8gYmFzZTo6QmluZCgob25fd3JpdGVfY2FsbGJhY2tfLlJ1biksIHN0ZDo6bW92ZShkYXRhKSkpOwogICByZXR1cm4gbnVtX2J5dGVzOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvdXJsX2ZldGNoZXJfc3RyaW5nX3dyaXRlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvdXJsX2ZldGNoZXJfc3RyaW5nX3dyaXRlci5oCmluZGV4IDNiYWI0YTYuLjcyZDg3ZTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL3VybF9mZXRjaGVyX3N0cmluZ193cml0ZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci91cmxfZmV0Y2hlcl9zdHJpbmdfd3JpdGVyLmgKQEAgLTM1LDE5ICszNSwyMiBAQAogICBVUkxGZXRjaGVyU3RyaW5nV3JpdGVyKCk7CiAgIH5VUkxGZXRjaGVyU3RyaW5nV3JpdGVyKCkgb3ZlcnJpZGU7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiBkYXRhKCk7CisgIGJvb2wgSGFzRGF0YSgpIGNvbnN0OworICB2b2lkIEdldEFuZFJlc2V0RGF0YShzdGQ6OnN0cmluZyogZGF0YSk7CiAKICAgLy8gVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyIG92ZXJyaWRlczoKICAgaW50IEluaXRpYWxpemUobmV0OjpDb21wbGV0aW9uT25jZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKKyAgdm9pZCBPblJlc3BvbnNlU3RhcnRlZChpbnQ2NF90IGNvbnRlbnRfbGVuZ3RoKSBvdmVycmlkZTsKICAgaW50IFdyaXRlKG5ldDo6SU9CdWZmZXIqIGJ1ZmZlciwgaW50IG51bV9ieXRlcywKICAgICAgICAgICAgIG5ldDo6Q29tcGxldGlvbk9uY2VDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CiAgIGludCBGaW5pc2goaW50IG5ldF9lcnJvciwgbmV0OjpDb21wbGV0aW9uT25jZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKIAogIHByaXZhdGU6Ci0gIC8vIFRoaXMgY2xhc3MgY2FuIGJlIGFjY2Vzc2VkIGJ5IGJvdGggbmV0d29yayB0aHJlYWQgYW5kIE1haW5XZWJNb2R1bGUKLSAgLy8gdGhyZWFkLgotICBiYXNlOjpMb2NrIGxvY2tfOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRhdGFfOworICAvLyBUaGlzIGNsYXNzIGNhbiBiZSBhY2Nlc3NlZCBieSBib3RoIG5ldHdvcmsgdGhyZWFkIGFuZCBNYWluV2ViTW9kdWxlIHRocmVhZC4KKyAgbXV0YWJsZSBiYXNlOjpMb2NrIGxvY2tfOworICBpbnQ2NF90IGNvbnRlbnRfbGVuZ3RoXyA9IC0xOworICBpbnQ2NF90IGNvbnRlbnRfb2Zmc2V0XyA9IDA7CisgIHN0ZDo6c3RyaW5nIGRhdGFfOwogICAvLyBPbldyaXRlQ2FsbGJhY2sgb25fd3JpdGVfY2FsbGJhY2tfOwogICAvLyBiYXNlOjpUYXNrUnVubmVyKiBjb25zdW1lcl90YXNrX3J1bm5lcl87CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWF0aC9tYXRoLmd5cCBiL3NyYy9jb2JhbHQvbWF0aC9tYXRoLmd5cAppbmRleCA1ZmMwMzI2Li4zNDRlYzU3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21hdGgvbWF0aC5neXAKKysrIGIvc3JjL2NvYmFsdC9tYXRoL21hdGguZ3lwCkBAIC05MCwxMCArOTAsMTAgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdtYXRoJywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnbWF0aF90ZXN0X2RlcGxveScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZHJtX3N5c3RlbS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmNjCmluZGV4IDhhZDQxMTguLmI5NGM4NTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmNjCkBAIC0yOCw4ICsyOCw3IEBACiBERUNMQVJFX0lOU1RBTkNFX0NPVU5URVIoRHJtU3lzdGVtKTsKIAogRHJtU3lzdGVtOjpTZXNzaW9uOjpTZXNzaW9uKAotICAgIERybVN5c3RlbSogZHJtX3N5c3RlbQotICAgICwKKyAgICBEcm1TeXN0ZW0qIGRybV9zeXN0ZW0sCiAgICAgU2Vzc2lvblVwZGF0ZUtleVN0YXR1c2VzQ2FsbGJhY2sgdXBkYXRlX2tleV9zdGF0dXNlc19jYWxsYmFjawogI2lmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCiAgICAgLApAQCAtNDEsNyArNDAsOCBAQAogI2lmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCiAgICAgICBzZXNzaW9uX2Nsb3NlZF9jYWxsYmFja18oc2Vzc2lvbl9jbG9zZWRfY2FsbGJhY2spLAogI2VuZGlmICAvLyBTQl9IQVMoRFJNX1NFU1NJT05fQ0xPU0VEKQotICAgICAgY2xvc2VkXyhmYWxzZSkgeworICAgICAgY2xvc2VkXyhmYWxzZSksCisgICAgICB3ZWFrX2ZhY3RvcnlfKHRoaXMpIHsKICAgRENIRUNLKCF1cGRhdGVfa2V5X3N0YXR1c2VzX2NhbGxiYWNrXy5pc19udWxsKCkpOwogI2lmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCiAgIERDSEVDSyghc2Vzc2lvbl9jbG9zZWRfY2FsbGJhY2tfLmlzX251bGwoKSk7CkBAIC02OSw3ICs2OSw3IEBACiAgIHVwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFja18gPQogICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9nZW5lcmF0ZWRfY2FsbGJhY2s7CiAgIGRybV9zeXN0ZW1fLT5HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KAotICAgICAgdGhpcywgdHlwZSwgaW5pdF9kYXRhLCBpbml0X2RhdGFfbGVuZ3RoLAorICAgICAgd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIHR5cGUsIGluaXRfZGF0YSwgaW5pdF9kYXRhX2xlbmd0aCwKICAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3RfZ2VuZXJhdGVkX2NhbGxiYWNrLAogICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9kaWRfbm90X2dlbmVyYXRlX2NhbGxiYWNrKTsKIH0KQEAgLTE2OSw4ICsxNjksOCBAQAogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAxMAogCiB2b2lkIERybVN5c3RlbTo6R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdCgKLSAgICBTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgdWludDhfdCogaW5pdF9kYXRhLAotICAgIGludCBpbml0X2RhdGFfbGVuZ3RoLAorICAgIGNvbnN0IGJhc2U6OldlYWtQdHI8U2Vzc2lvbj4mIHNlc3Npb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgIGNvbnN0IHVpbnQ4X3QqIGluaXRfZGF0YSwgaW50IGluaXRfZGF0YV9sZW5ndGgsCiAgICAgY29uc3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWRDYWxsYmFjayYKICAgICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9nZW5lcmF0ZWRfY2FsbGJhY2ssCiAgICAgY29uc3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZUNhbGxiYWNrJgpAQCAtMjIxLDYgKzIyMSw4IEBACiAgICAgU2Vzc2lvblRpY2tldEFuZE9wdGlvbmFsSWQgdGlja2V0X2FuZF9vcHRpb25hbF9pZCwgU2JEcm1TdGF0dXMgc3RhdHVzLAogICAgIFNiRHJtU2Vzc2lvblJlcXVlc3RUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlLAogICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OFtdPiBtZXNzYWdlLCBpbnQgbWVzc2FnZV9zaXplKSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCiAgIGludCB0aWNrZXQgPSB0aWNrZXRfYW5kX29wdGlvbmFsX2lkLnRpY2tldDsKICAgY29uc3QgYmFzZTo6T3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzZXNzaW9uX2lkID0gdGlja2V0X2FuZF9vcHRpb25hbF9pZC5pZDsKICAgaWYgKFNiRHJtVGlja2V0SXNWYWxpZCh0aWNrZXQpKSB7CkBAIC0yMzcsMjEgKzIzOSwyNSBAQAogICAgIGNvbnN0IFNlc3Npb25VcGRhdGVSZXF1ZXN0JiBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0ID0KICAgICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9pdGVyYXRvci0+c2Vjb25kOwogCi0gICAgLy8gSW50ZXJwcmV0IHRoZSByZXN1bHQuCi0gICAgaWYgKHNlc3Npb25faWQpIHsKLSAgICAgIC8vIFN1Y2Nlc3NmdWwgcmVxdWVzdCBnZW5lcmF0aW9uLgorICAgIC8vIEFzIERybVN5c3RlbTo6U2Vzc2lvbiBtYXkgYmUgcmVsZWFzZWQsIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIHVzaW5nIGl0LgorICAgIGlmIChzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LnNlc3Npb24gJiYKKyAgICAgICAgIXNlc3Npb25fdXBkYXRlX3JlcXVlc3Quc2Vzc2lvbi0+aXNfY2xvc2VkKCkpIHsKKyAgICAgIC8vIEludGVycHJldCB0aGUgcmVzdWx0LgorICAgICAgaWYgKHNlc3Npb25faWQpIHsKKyAgICAgICAgLy8gU3VjY2Vzc2Z1bCByZXF1ZXN0IGdlbmVyYXRpb24uCiAKLSAgICAgIC8vIEVuYWJsZSBzZXNzaW9uIGxvb2t1cCBieSBpZCB3aGljaCBpcyB1c2VkIGJ5IHNwb250YW5lb3VzIGNhbGxiYWNrcy4KLSAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3Quc2Vzc2lvbi0+c2V0X2lkKCpzZXNzaW9uX2lkKTsKLSAgICAgIGlkX3RvX3Nlc3Npb25fbWFwXy5pbnNlcnQoCi0gICAgICAgICAgc3RkOjptYWtlX3BhaXIoKnNlc3Npb25faWQsIHNlc3Npb25fdXBkYXRlX3JlcXVlc3Quc2Vzc2lvbikpOworICAgICAgICAvLyBFbmFibGUgc2Vzc2lvbiBsb29rdXAgYnkgaWQgd2hpY2ggaXMgdXNlZCBieSBzcG9udGFuZW91cyBjYWxsYmFja3MuCisgICAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3Quc2Vzc2lvbi0+c2V0X2lkKCpzZXNzaW9uX2lkKTsKKyAgICAgICAgaWRfdG9fc2Vzc2lvbl9tYXBfLmluc2VydCgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCpzZXNzaW9uX2lkLCBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LnNlc3Npb24pKTsKIAotICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5nZW5lcmF0ZWRfY2FsbGJhY2suUnVuKHR5cGUsIHN0ZDo6bW92ZShtZXNzYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBGYWlsdXJlIGR1cmluZyByZXF1ZXN0IGdlbmVyYXRpb24uCi0gICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmRpZF9ub3RfZ2VuZXJhdGVfY2FsbGJhY2suUnVuKHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSk7CisgICAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3QuZ2VuZXJhdGVkX2NhbGxiYWNrLlJ1bih0eXBlLCBzdGQ6Om1vdmUobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NpemUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRmFpbHVyZSBkdXJpbmcgcmVxdWVzdCBnZW5lcmF0aW9uLgorICAgICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmRpZF9ub3RfZ2VuZXJhdGVfY2FsbGJhY2suUnVuKHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvLyBTd2VlcCB0aGUgY29udGV4dCBvZiB8R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdHwgb25jZSBsaWNlbnNlIHVwZGF0ZWQuCkBAIC0yNzQsMTUgKzI4MCwxOSBAQAogICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBzZXNzaW9uIGlkOiAiIDw8ICpzZXNzaW9uX2lkIDw8ICIuIjsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgU2Vzc2lvbiogc2Vzc2lvbiA9IHNlc3Npb25faXRlcmF0b3ItPnNlY29uZDsKIAotICAgIHNlc3Npb24tPnVwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFjaygpLlJ1bih0eXBlLCBzdGQ6Om1vdmUobWVzc2FnZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Vfc2l6ZSk7CisgICAgLy8gQXMgRHJtU3lzdGVtOjpTZXNzaW9uIG1heSBiZSByZWxlYXNlZCwgbmVlZCB0byBjaGVjayBpdCBiZWZvcmUgdXNpbmcgaXQuCisgICAgaWYgKHNlc3Npb25faXRlcmF0b3ItPnNlY29uZCkgeworICAgICAgc2Vzc2lvbl9pdGVyYXRvci0+c2Vjb25kLT51cGRhdGVfcmVxdWVzdF9nZW5lcmF0ZWRfY2FsbGJhY2soKS5SdW4oCisgICAgICAgICAgdHlwZSwgc3RkOjptb3ZlKG1lc3NhZ2UpLCBtZXNzYWdlX3NpemUpOworICAgIH0KICAgfQogfQogCiB2b2lkIERybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlZChpbnQgdGlja2V0LCBTYkRybVN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKwogICAvLyBSZXN0b3JlIHRoZSBjb250ZXh0IG9mIHxVcGRhdGVTZXNzaW9ufC4KICAgVGlja2V0VG9TZXNzaW9uVXBkYXRlTWFwOjppdGVyYXRvciBzZXNzaW9uX3VwZGF0ZV9pdGVyYXRvciA9CiAgICAgICB0aWNrZXRfdG9fc2Vzc2lvbl91cGRhdGVfbWFwXy5maW5kKHRpY2tldCk7CkBAIC0zMDYsNiArMzE2LDggQEAKIHZvaWQgRHJtU3lzdGVtOjpPblNlc3Npb25LZXlTdGF0dXNDaGFuZ2VkKAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGtleV9pZHMsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U2JEcm1LZXlTdGF0dXM+JiBrZXlfc3RhdHVzZXMpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKICAgLy8gRmluZCB0aGUgc2Vzc2lvbiBieSBJRC4KICAgSWRUb1Nlc3Npb25NYXA6Oml0ZXJhdG9yIHNlc3Npb25faXRlcmF0b3IgPQogICAgICAgaWRfdG9fc2Vzc2lvbl9tYXBfLmZpbmQoc2Vzc2lvbl9pZCk7CkBAIC0zMTMsMTMgKzMyNSwxOCBAQAogICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gc2Vzc2lvbiBpZDogIiA8PCBzZXNzaW9uX2lkIDw8ICIuIjsKICAgICByZXR1cm47CiAgIH0KLSAgU2Vzc2lvbiogc2Vzc2lvbiA9IHNlc3Npb25faXRlcmF0b3ItPnNlY29uZDsKIAotICBzZXNzaW9uLT51cGRhdGVfa2V5X3N0YXR1c2VzX2NhbGxiYWNrKCkuUnVuKGtleV9pZHMsIGtleV9zdGF0dXNlcyk7CisgIC8vIEFzIERybVN5c3RlbTo6U2Vzc2lvbiBtYXkgYmUgcmVsZWFzZWQsIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIHVzaW5nIGl0LgorICBpZiAoc2Vzc2lvbl9pdGVyYXRvci0+c2Vjb25kKSB7CisgICAgc2Vzc2lvbl9pdGVyYXRvci0+c2Vjb25kLT51cGRhdGVfa2V5X3N0YXR1c2VzX2NhbGxiYWNrKCkuUnVuKGtleV9pZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9zdGF0dXNlcyk7CisgIH0KIH0KIAogI2lmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCiB2b2lkIERybVN5c3RlbTo6T25TZXNzaW9uQ2xvc2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCiAgIC8vIEZpbmQgdGhlIHNlc3Npb24gYnkgSUQuCiAgIElkVG9TZXNzaW9uTWFwOjppdGVyYXRvciBzZXNzaW9uX2l0ZXJhdG9yID0KICAgICAgIGlkX3RvX3Nlc3Npb25fbWFwXy5maW5kKHNlc3Npb25faWQpOwpAQCAtMzI3LDkgKzM0NCwxMSBAQAogICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gc2Vzc2lvbiBpZDogIiA8PCBzZXNzaW9uX2lkIDw8ICIuIjsKICAgICByZXR1cm47CiAgIH0KLSAgU2Vzc2lvbiogc2Vzc2lvbiA9IHNlc3Npb25faXRlcmF0b3ItPnNlY29uZDsKIAotICBzZXNzaW9uLT5zZXNzaW9uX2Nsb3NlZF9jYWxsYmFjaygpLlJ1bigpOworICAvLyBBcyBEcm1TeXN0ZW06OlNlc3Npb24gbWF5IGJlIHJlbGVhc2VkLCBuZWVkIHRvIGNoZWNrIGl0IGJlZm9yZSB1c2luZyBpdC4KKyAgaWYgKHNlc3Npb25faXRlcmF0b3ItPnNlY29uZCkgeworICAgIHNlc3Npb25faXRlcmF0b3ItPnNlY29uZC0+c2Vzc2lvbl9jbG9zZWRfY2FsbGJhY2soKS5SdW4oKTsKKyAgfQogICBpZF90b19zZXNzaW9uX21hcF8uZXJhc2Uoc2Vzc2lvbl9pdGVyYXRvcik7CiB9CiAjZW5kaWYgIC8vIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCkBAIC0zMzcsNiArMzU2LDggQEAKICNpZiBTQl9BUElfVkVSU0lPTiA+PSAxMAogdm9pZCBEcm1TeXN0ZW06Ok9uU2VydmVyQ2VydGlmaWNhdGVVcGRhdGVkKGludCB0aWNrZXQsIFNiRHJtU3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKwogICBhdXRvIGl0ZXIgPSB0aWNrZXRfdG9fc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfbWFwXy5maW5kKHRpY2tldCk7CiAgIGlmIChpdGVyID09IHRpY2tldF90b19zZXJ2ZXJfY2VydGlmaWNhdGVfdXBkYXRlZF9tYXBfLmVuZCgpKSB7CiAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biB0aWNrZXQ6ICIgPDwgdGlja2V0IDw8ICIuIjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZHJtX3N5c3RlbS5oCmluZGV4IGQ0MjkwZjguLmE4MGJmMzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uaApAQCAtMTMyLDYgKzEzMiw4IEBACiAgICAgLy8gU3VwcG9ydHMgc3BvbnRhbmVvdXMgaW52b2NhdGlvbnMgb2YgfFNiRHJtU2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jfC4KICAgICBTZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZENhbGxiYWNrIHVwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFja187CiAKKyAgICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxTZXNzaW9uPiB3ZWFrX2ZhY3RvcnlfOworCiAgICAgZnJpZW5kIGNsYXNzIERybVN5c3RlbTsKIAogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXNzaW9uKTsKQEAgLTE2MCwxNCArMTYyLDE0IEBACiAgcHJpdmF0ZToKICAgLy8gU3RvcmVzIGNvbnRleHQgb2YgfEdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3R8LgogICBzdHJ1Y3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3QgewotICAgIFNlc3Npb24qIHNlc3Npb247CisgICAgYmFzZTo6V2Vha1B0cjxTZXNzaW9uPiBzZXNzaW9uOwogICAgIFNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkQ2FsbGJhY2sgZ2VuZXJhdGVkX2NhbGxiYWNrOwogICAgIFNlc3Npb25VcGRhdGVSZXF1ZXN0RGlkTm90R2VuZXJhdGVDYWxsYmFjayBkaWRfbm90X2dlbmVyYXRlX2NhbGxiYWNrOwogICB9OwogICB0eXBlZGVmIGJhc2U6Omhhc2hfbWFwPGludCwgU2Vzc2lvblVwZGF0ZVJlcXVlc3Q+CiAgICAgICBUaWNrZXRUb1Nlc3Npb25VcGRhdGVSZXF1ZXN0TWFwOwogCi0gIHR5cGVkZWYgYmFzZTo6aGFzaF9tYXA8c3RkOjpzdHJpbmcsIFNlc3Npb24qPiBJZFRvU2Vzc2lvbk1hcDsKKyAgdHlwZWRlZiBiYXNlOjpoYXNoX21hcDxzdGQ6OnN0cmluZywgYmFzZTo6V2Vha1B0cjxTZXNzaW9uPj4gSWRUb1Nlc3Npb25NYXA7CiAKICAgdHlwZWRlZiBiYXNlOjpoYXNoX21hcDxpbnQsIFNlcnZlckNlcnRpZmljYXRlVXBkYXRlZENhbGxiYWNrPgogICAgICAgVGlja2V0VG9TZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRNYXA7CkBAIC0xODgsOCArMTkwLDggQEAKIAogICAvLyBQcml2YXRlIEFQSSBmb3IgfFNlc3Npb258LgogICB2b2lkIEdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoCi0gICAgICBTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgdWludDhfdCogaW5pdF9kYXRhLAotICAgICAgaW50IGluaXRfZGF0YV9sZW5ndGgsCisgICAgICBjb25zdCBiYXNlOjpXZWFrUHRyPFNlc3Npb24+JiBzZXNzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGluaXRfZGF0YSwgaW50IGluaXRfZGF0YV9sZW5ndGgsCiAgICAgICBjb25zdCBTZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZENhbGxiYWNrJgogICAgICAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3RfZ2VuZXJhdGVkX2NhbGxiYWNrLAogICAgICAgY29uc3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZUNhbGxiYWNrJgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYwppbmRleCBjNDFlOWFjLi5kMGM3ZTkyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYwpAQCAtMjY4LDYgKzI2OCw3IEBACiAgIERDSEVDSyh0YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgZGVjb2Rlcl9idWZmZXJfY2FjaGVfLkNsZWFyQWxsKCk7CisgIHNlZWtfcGVuZGluZ18gPSBmYWxzZTsKIAogICBpZiAoc3RhdGVfID09IGtTdXNwZW5kZWQpIHsKICAgICBwcmVyb2xsX3RpbWVzdGFtcF8gPSB0aW1lOwpAQCAtMjkwLDcgKzI5MSw2IEBACiAgIFNiUGxheWVyU2VlazIocGxheWVyXywgdGltZS5Jbk1pY3Jvc2Vjb25kcygpLCB0aWNrZXRfKTsKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCAxMAogCi0gIHNlZWtfcGVuZGluZ18gPSBmYWxzZTsKICAgU2JQbGF5ZXJTZXRQbGF5YmFja1JhdGUocGxheWVyXywgcGxheWJhY2tfcmF0ZV8pOwogfQogCkBAIC00MzQsMTMgKzQzNCwxNCBAQAogCiAgIFNiUGxheWVyU2V0UGxheWJhY2tSYXRlKHBsYXllcl8sIDAuMCk7CiAKKyAgc2V0X2JvdW5kc19oZWxwZXJfLT5TZXRQbGF5ZXIoTlVMTCk7CisKICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKICAgR2V0SW5mb19Mb2NrZWQoJmNhY2hlZF92aWRlb19mcmFtZXNfZGVjb2RlZF8sICZjYWNoZWRfdmlkZW9fZnJhbWVzX2Ryb3BwZWRfLAogICAgICAgICAgICAgICAgICAmcHJlcm9sbF90aW1lc3RhbXBfKTsKIAogICBzdGF0ZV8gPSBrU3VzcGVuZGVkOwogCi0gIHNldF9ib3VuZHNfaGVscGVyXy0+U2V0UGxheWVyKE5VTEwpOwogICB2aWRlb19mcmFtZV9wcm92aWRlcl8tPlNldE91dHB1dE1vZGUoVmlkZW9GcmFtZVByb3ZpZGVyOjprT3V0cHV0TW9kZUludmFsaWQpOwogICB2aWRlb19mcmFtZV9wcm92aWRlcl8tPlJlc2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9mZXRjaGVyX2J1ZmZlcmVkX2RhdGFfc291cmNlLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9mZXRjaGVyX2J1ZmZlcmVkX2RhdGFfc291cmNlLmNjCmluZGV4IGNiZjZmNDEuLjI1NGYzODYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2ZldGNoZXJfYnVmZmVyZWRfZGF0YV9zb3VyY2UuY2MKQEAgLTIxMSwxMiArMjExLDEzIEBACiAgIGF1dG8qIGRvd25sb2FkX2RhdGFfd3JpdGVyID0KICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PGxvYWRlcjo6VVJMRmV0Y2hlclN0cmluZ1dyaXRlcio+KAogICAgICAgICAgIHNvdXJjZS0+R2V0UmVzcG9uc2VXcml0ZXIoKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZG93bmxvYWRfZGF0YSA9IGRvd25sb2FkX2RhdGFfd3JpdGVyLT5kYXRhKCk7Ci0gIHNpemVfdCBzaXplID0gZG93bmxvYWRfZGF0YS0+c2l6ZSgpOworICBzdGQ6OnN0cmluZyBkb3dubG9hZGVkX2RhdGE7CisgIGRvd25sb2FkX2RhdGFfd3JpdGVyLT5HZXRBbmRSZXNldERhdGEoJmRvd25sb2FkZWRfZGF0YSk7CisgIHNpemVfdCBzaXplID0gZG93bmxvYWRlZF9kYXRhLnNpemUoKTsKICAgaWYgKHNpemUgPT0gMCkgewogICAgIHJldHVybjsKICAgfQotICBjb25zdCB1aW50OCogZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkb3dubG9hZF9kYXRhLT5kYXRhKCkpOworICBjb25zdCB1aW50OCogZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkb3dubG9hZGVkX2RhdGEuZGF0YSgpKTsKICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKIAogICBpZiAoZmV0Y2hlcl8uZ2V0KCkgIT0gc291cmNlIHx8IGVycm9yX29jY3VyZWRfKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZldGNoZXJfYnVmZmVyZWRfZGF0YV9zb3VyY2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5oCmluZGV4IDZlY2E2MDIuLjY2ZmVmNTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeS5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvb3JpZ2luLmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci91cmxfZmV0Y2hlcl9zdHJpbmdfd3JpdGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3BsYXllci9idWZmZXJlZF9kYXRhX3NvdXJjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmgiCiAjaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L3VybF9mZXRjaGVyLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL21lZGlhLmd5cCBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWEuZ3lwCmluZGV4IDdjZDg3OTMuLjM4YjE1N2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWEuZ3lwCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWEuZ3lwCkBAIC0yMzIsNyArMjMyLDYgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICdtZWRpYScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgIF0sCkBAIC0yNDEsNiArMjQwLDcgQEAKICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfbXA0X21hcF91bml0dGVzdC5jYycsCiAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtX3VuaXR0ZXN0LmNjJywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnbWVkaWFfdGVzdF9kZXBsb3knLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2Z1enplcl9hcHAuY2MgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZnV6emVyX2FwcC5jYwppbmRleCA5YTlkMGMyLi4xOGY1OGFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZnV6emVyX2FwcC5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZnV6emVyX2FwcC5jYwpAQCAtMTEzLDExICsxMTMsMjEgQEAKICAgICByZXR1cm47CiAgIH0KIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gZW50cnkoU0JfRklMRV9NQVhfTkFNRSk7CisKKyAgd2hpbGUgKFNiRGlyZWN0b3J5R2V0TmV4dChkaXJlY3RvcnksIGVudHJ5LmRhdGEoKSwgZW50cnkuc2l6ZSgpKSkgeworICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IHBhdGhfbmFtZSArIFNCX0ZJTEVfU0VQX1NUUklORyArIGVudHJ5LmRhdGEoKTsKKyAgICBBZGRGaWxlKGZpbGVfbmFtZSwgbWluX3JhdGlvLCBtYXhfcmF0aW8sIGluaXRpYWxfc2VlZCk7CisgIH0KKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogICBTYkRpcmVjdG9yeUVudHJ5IGVudHJ5OworCiAgIHdoaWxlIChTYkRpcmVjdG9yeUdldE5leHQoZGlyZWN0b3J5LCAmZW50cnkpKSB7CiAgICAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lID0gcGF0aF9uYW1lICsgU0JfRklMRV9TRVBfU1RSSU5HICsgZW50cnkubmFtZTsKICAgICBBZGRGaWxlKGZpbGVfbmFtZSwgbWluX3JhdGlvLCBtYXhfcmF0aW8sIGluaXRpYWxfc2VlZCk7CiAgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogCiAgIFNiRGlyZWN0b3J5Q2xvc2UoZGlyZWN0b3J5KTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9jYXB0dXJlX3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2NhcHR1cmVfdGVzdC5neXAKaW5kZXggYTI4MDY5Yy4uMmQzMzBhYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2NhcHR1cmVfdGVzdC5neXAKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2NhcHR1cmVfdGVzdC5neXAKQEAgLTM1LDEwICszNSwxMCBAQAogICAgICAgICAjIEZvciBGYWtlIE1pY3JvcGhvbmUuCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3BlZWNoL3NwZWVjaC5neXA6c3BlZWNoJywKIAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb25fdGVzdC5neXAgYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl90ZXN0Lmd5cAppbmRleCBhYTEzNWMxLi45YzJjOGQ3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl90ZXN0Lmd5cAorKysgYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl90ZXN0Lmd5cApAQCAtMjQsMTAgKzI0LDEwIEBACiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmd5cDptZWRpYV9zZXNzaW9uJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6YnJvd3NlcicsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ21lZGlhX3Nlc3Npb25fdGVzdF9kZXBsb3knLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX3Rlc3QuZ3lwCmluZGV4IGFjNTc4MDEuLmE3Y2M1YjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbV90ZXN0Lmd5cAorKysgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fdGVzdC5neXAKQEAgLTMyLDEwICszMiwxMCBAQAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW0uZ3lwOm1lZGlhX3N0cmVhbScsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvbG9jYWxfbmV0d29yay5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay9sb2NhbF9uZXR3b3JrLmNjCmluZGV4IDg2MmViMTkuLjA3ZTU3NjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9sb2NhbF9uZXR3b3JrLmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9sb2NhbF9uZXR3b3JrLmNjCkBAIC04Myw3ICs4Myw3IEBACiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKChpcC5hZGRyZXNzWzBdID09IDE3MikgJiYKLSAgICAgICAgKChpcC5hZGRyZXNzWzFdID49IDE2KSB8fCAoaXAuYWRkcmVzc1sxXSA8PSAzMSkpKSB7CisgICAgICAgICgoaXAuYWRkcmVzc1sxXSA+PSAxNikgJiYgKGlwLmFkZHJlc3NbMV0gPD0gMzEpKSkgewogICAgICAgLy8gSVAgaXMgaW4gcmFuZ2UgMTcyLjE2LjAuMCAtIDE3Mi4zMS4yNTUuMjU1ICgxNzIuMTYvMTIgcHJlZml4KS4KICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrLmd5cCBiL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrLmd5cAppbmRleCAwOGU3MDM2Li5jMDZjOWU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29yay5neXAKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmsuZ3lwCkBAIC0xMTYsMTEgKzExNiwxMSBAQAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ25ldHdvcmsnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICduZXR3b3JrX3Rlc3RfZGVwbG95JywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mby5neXAgYi9zcmMvY29iYWx0L292ZXJsYXlfaW5mby9vdmVybGF5X2luZm8uZ3lwCmluZGV4IDc4YzRiMGYuLjlhYWI3ZjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mby5neXAKKysrIGIvc3JjL2NvYmFsdC9vdmVybGF5X2luZm8vb3ZlcmxheV9pbmZvLmd5cApAQCAtNDIsOSArNDIsOSBAQAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mby5neXA6b3ZlcmxheV9pbmZvJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKIAogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeS5jYyBiL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeS5jYwppbmRleCA2YjAxNDQ4Li4xMzQxMzc0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L292ZXJsYXlfaW5mby9vdmVybGF5X2luZm9fcmVnaXN0cnkuY2MKKysrIGIvc3JjL2NvYmFsdC9vdmVybGF5X2luZm8vb3ZlcmxheV9pbmZvX3JlZ2lzdHJ5LmNjCkBAIC0zMiw4ICszMiw3IEBACiAgIHZvaWQgRGlzYWJsZSgpOwogCiAgIHZvaWQgUmVnaXN0ZXIoY29uc3QgY2hhciogY2F0ZWdvcnksIGNvbnN0IGNoYXIqIHN0cik7Ci0gIHZvaWQgUmVnaXN0ZXIoY29uc3QgY2hhciogY2F0ZWdvcnksIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOwotICB2b2lkIFJldHJpZXZlQW5kQ2xlYXIoc3RkOjp2ZWN0b3I8dWludDhfdD4qIGluZm9zKTsKKyAgdm9pZCBSZXRyaWV2ZUFuZENsZWFyKHN0ZDo6c3RyaW5nKiBpbmZvcyk7CiAKICBwcml2YXRlOgogICAvLyBSZXNlcnZlIGVub3VnaCBkYXRhIGZvciB8aW5mb3NffCB0byBhdm9pZCBleHRyYSBhbGxjYXRpb25zLgpAQCAtNDgsNyArNDcsNyBAQAogCiAgIGJvb2wgZW5hYmxlZF8gPSB0cnVlOwogICBzdGFyYm9hcmQ6Ok11dGV4IG11dGV4XzsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5mb3NfOworICBzdGQ6OnN0cmluZyBpbmZvc187CiB9OwogCiAvLyBzdGF0aWMKQEAgLTY0LDQwICs2MywyNSBAQAogICBpbmZvc18uY2xlYXIoKTsKIH0KIAotdm9pZCBPdmVybGF5SW5mb1JlZ2lzdHJ5SW1wbDo6UmVnaXN0ZXIoY29uc3QgY2hhciogY2F0ZWdvcnksIGNvbnN0IGNoYXIqIHN0cikgewotICBhdXRvIGxlbmd0aCA9IFNiU3RyaW5nR2V0TGVuZ3RoKHN0cik7Ci0gIFJlZ2lzdGVyKGNhdGVnb3J5LCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzdHIpLCBsZW5ndGgpOwotfQotCi12b2lkIE92ZXJsYXlJbmZvUmVnaXN0cnlJbXBsOjpSZWdpc3Rlcihjb25zdCBjaGFyKiBjYXRlZ29yeSwgY29uc3Qgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUpIHsKK3ZvaWQgT3ZlcmxheUluZm9SZWdpc3RyeUltcGw6OlJlZ2lzdGVyKGNvbnN0IGNoYXIqIGNhdGVnb3J5LCBjb25zdCBjaGFyKiBkYXRhKSB7CiAgIERDSEVDSyhTYlN0cmluZ0ZpbmRDaGFyYWN0ZXIoCiAgICAgICAgICAgICAgY2F0ZWdvcnksIHN0YXRpY19jYXN0PGNoYXI+KE92ZXJsYXlJbmZvUmVnaXN0cnk6OmtEZWxpbWl0ZXIpKSA9PQogICAgICAgICAgTlVMTCkKICAgICAgIDw8ICJDYXRlZ29yeSAiIDw8IGNhdGVnb3J5CiAgICAgICA8PCAiIGNhbm5vdCBjb250YWluIHRoZSBkZWxpbWl0ZXI6IiA8PCBPdmVybGF5SW5mb1JlZ2lzdHJ5OjprRGVsaW1pdGVyOwotICBhdXRvIGNhdGVnb3J5X3NpemUgPSBTYlN0cmluZ0dldExlbmd0aChjYXRlZ29yeSk7Ci0gIGF1dG8gdG90YWxfc2l6ZSA9IGNhdGVnb3J5X3NpemUgKyAxICsgZGF0YV9zaXplOwotCi0gIERDSEVDS19HVChjYXRlZ29yeV9zaXplLCAwdSk7Ci0gIC8vIFVzZSB8a01heFNpemVPZkRhdGEgKyAwfCB0byBhdm9pZCBsaW5rIGVycm9yIGNhdXNlZCBieSBEQ0hFQ0tfTEUuCi0gIERDSEVDS19MRSh0b3RhbF9zaXplLCBPdmVybGF5SW5mb1JlZ2lzdHJ5OjprTWF4U2l6ZU9mRGF0YSArIDApOwotCi0gIHN0YXJib2FyZDo6U2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOwotICAvLyBVc2UgfGtNYXhOdW1iZXJPZlBlbmRpbmdPdmVybGF5SW5mbyArIDB8IHRvIGF2b2lkIGxpbmsgZXJyb3IgY2F1c2VkIGJ5Ci0gIC8vIERDSEVDS19MRS4KLSAgRENIRUNLX0xFKGluZm9zXy5zaXplKCkgKyB0b3RhbF9zaXplLAotICAgICAgICAgICAgT3ZlcmxheUluZm9SZWdpc3RyeTo6a01heE51bWJlck9mUGVuZGluZ092ZXJsYXlJbmZvICsgMCk7Ci0gIGlmIChlbmFibGVkXykgewotICAgIGluZm9zXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4odG90YWxfc2l6ZSkpOwotICAgIGluZm9zXy5pbnNlcnQoaW5mb3NfLmVuZCgpLCBjYXRlZ29yeSwgY2F0ZWdvcnkgKyBjYXRlZ29yeV9zaXplKTsKLSAgICBpbmZvc18ucHVzaF9iYWNrKGtEZWxpbWl0ZXIpOwotICAgIGluZm9zXy5pbnNlcnQoaW5mb3NfLmVuZCgpLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSksCi0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSkgKyBkYXRhX3NpemUpOworICBEQ0hFQ0soU2JTdHJpbmdGaW5kQ2hhcmFjdGVyKAorICAgICAgICAgICAgIGRhdGEsIHN0YXRpY19jYXN0PGNoYXI+KE92ZXJsYXlJbmZvUmVnaXN0cnk6OmtEZWxpbWl0ZXIpKSA9PSBOVUxMKQorICAgICAgPDwgIkRhdGEgIiA8PCBkYXRhCisgICAgICA8PCAiIGNhbm5vdCBjb250YWluIHRoZSBkZWxpbWl0ZXI6IiA8PCBPdmVybGF5SW5mb1JlZ2lzdHJ5OjprRGVsaW1pdGVyOworICBpZiAoIWluZm9zXy5lbXB0eSgpKSB7CisgICAgaW5mb3NfICs9IGtEZWxpbWl0ZXI7CiAgIH0KKyAgaW5mb3NfICs9IGNhdGVnb3J5OworICBpbmZvc18gKz0ga0RlbGltaXRlcjsKKyAgaW5mb3NfICs9IGRhdGE7CiB9CiAKLXZvaWQgT3ZlcmxheUluZm9SZWdpc3RyeUltcGw6OlJldHJpZXZlQW5kQ2xlYXIoc3RkOjp2ZWN0b3I8dWludDhfdD4qIGluZm9zKSB7Cit2b2lkIE92ZXJsYXlJbmZvUmVnaXN0cnlJbXBsOjpSZXRyaWV2ZUFuZENsZWFyKHN0ZDo6c3RyaW5nKiBpbmZvcykgewogICBEQ0hFQ0soaW5mb3MpOwogCiAgIHN0YXJib2FyZDo6U2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOwpAQCAtMTE0LDE2ICs5OCwzMCBAQAogICBPdmVybGF5SW5mb1JlZ2lzdHJ5SW1wbDo6R2V0SW5zdGFuY2UoKS0+RGlzYWJsZSgpOwogfQogCi12b2lkIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJlZ2lzdGVyKGNvbnN0IGNoYXIqIGNhdGVnb3J5LCBjb25zdCBjaGFyKiBzdHIpIHsKLSAgT3ZlcmxheUluZm9SZWdpc3RyeUltcGw6OkdldEluc3RhbmNlKCktPlJlZ2lzdGVyKGNhdGVnb3J5LCBzdHIpOwordm9pZCBPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZWdpc3Rlcihjb25zdCBjaGFyKiBjYXRlZ29yeSwgY29uc3QgY2hhciogZGF0YSkgeworICBPdmVybGF5SW5mb1JlZ2lzdHJ5SW1wbDo6R2V0SW5zdGFuY2UoKS0+UmVnaXN0ZXIoY2F0ZWdvcnksIGRhdGEpOwogfQogCiB2b2lkIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJlZ2lzdGVyKGNvbnN0IGNoYXIqIGNhdGVnb3J5LCBjb25zdCB2b2lkKiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplKSB7Ci0gIE92ZXJsYXlJbmZvUmVnaXN0cnlJbXBsOjpHZXRJbnN0YW5jZSgpLT5SZWdpc3RlcihjYXRlZ29yeSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgY29uc3QgY2hhciBrSGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisKKyAgY29uc3QgdWludDhfdCogZGF0YV9hc19ieXRlcyA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKTsKKyAgc3RkOjpzdHJpbmcgZGF0YV9pbl9oZXg7CisKKyAgZGF0YV9pbl9oZXgucmVzZXJ2ZShkYXRhX3NpemUgKiAyKTsKKworICB3aGlsZSAoZGF0YV9zaXplID4gMCkgeworICAgIGRhdGFfaW5faGV4ICs9IGtIZXhbKmRhdGFfYXNfYnl0ZXMgLyAxNl07CisgICAgZGF0YV9pbl9oZXggKz0ga0hleFsqZGF0YV9hc19ieXRlcyAlIDE2XTsKKyAgICArK2RhdGFfYXNfYnl0ZXM7CisgICAgLS1kYXRhX3NpemU7CisgIH0KKyAgT3ZlcmxheUluZm9SZWdpc3RyeUltcGw6OkdldEluc3RhbmNlKCktPlJlZ2lzdGVyKGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9pbl9oZXguY19zdHIoKSk7CiB9CiAKLXZvaWQgT3ZlcmxheUluZm9SZWdpc3RyeTo6UmV0cmlldmVBbmRDbGVhcihzdGQ6OnZlY3Rvcjx1aW50OF90PiogaW5mb3MpIHsKK3ZvaWQgT3ZlcmxheUluZm9SZWdpc3RyeTo6UmV0cmlldmVBbmRDbGVhcihzdGQ6OnN0cmluZyogaW5mb3MpIHsKICAgT3ZlcmxheUluZm9SZWdpc3RyeUltcGw6OkdldEluc3RhbmNlKCktPlJldHJpZXZlQW5kQ2xlYXIoaW5mb3MpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L292ZXJsYXlfaW5mby9vdmVybGF5X2luZm9fcmVnaXN0cnkuaCBiL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeS5oCmluZGV4IGFjNDUxOTAuLjdkZTJhMjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeS5oCisrKyBiL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeS5oCkBAIC0xNSwzNCArMTUsMjcgQEAKICNpZm5kZWYgQ09CQUxUX09WRVJMQVlfSU5GT19PVkVSTEFZX0lORk9fUkVHSVNUUllfSF8KICNkZWZpbmUgQ09CQUxUX09WRVJMQVlfSU5GT19PVkVSTEFZX0lORk9fUkVHSVNUUllfSF8KIAotI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBvdmVybGF5X2luZm8gewogCi0vLyBUaGlzIGNsYXNzIGFsbG93cyByZWdpc3RlciBvZiBhcmJpdHJhcnkgb3ZlcmxheSBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZgotLy8gc3RyaW5nIG9yIGJpbmFyeSBkYXRhIGZyb20gYW55d2hlcmUgaW5zaWRlIENvYmFsdC4gIEl0IGFsc28gYWxsb3dzIGEgY29uc3VtZXIKLS8vIHRvIHJldHJpZXZlIGFuZCBjbGVhciBhbGwgcmVnaXN0ZXJlZCBpbmZvLCBzdWNoIGluZm8gd2lsbCBiZSBkaXNwbGF5ZWQgYXMKLS8vIG92ZXJsYXkuCisvLyBUaGlzIGNsYXNzIGFsbG93cyByZWdpc3RlciBvZiBhcmJpdHJhcnkgb3ZlcmxheSBpbmZvcm1hdGlvbiBmcm9tIGFueXdoZXJlCisvLyBpbnNpZGUgQ29iYWx0LiAgSXQgYWxzbyBhbGxvd3MgYSBjb25zdW1lciB0byByZXRyaWV2ZSBhbmQgY2xlYXIgYWxsCisvLyByZWdpc3RlcmVkIGluZm8sIHN1Y2ggaW5mbyB3aWxsIGJlIGRpc3BsYXllZCBhcyBvdmVybGF5LiAgVGhlIGRhdGEgaXMgc3RvcmVkCisvLyBhcyBzdGQ6OnN0cmluZyBpbnRlcm5hbGx5LgogLy8gVGhlIGNsYXNzIGlzIHRocmVhZCBzYWZlIGFuZCBhbGwgaXRzIG1ldGhvZHMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gYW55IHRocmVhZC4KIC8vIE9uIGF2ZXJhZ2UgaXQgZXhwZWN0cyB0byBoYXZlIGxlc3MgdGhhbiAxMCBzdWNoIGluZm8gcmVnaXN0ZXJlZCBwZXIgZnJhbWUuCiAvLwotLy8gVGhlIGJpbmFyeSBkYXRhIG9yIHN0cmluZyBhcmUgc3RvcmVkIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotLy8gWzxvbmUgYnl0ZSBzaXplPiA8c2l6ZSBieXRlcyBkYXRhPl0qCi0vLyBFYWNoIGRhdGEgZW50cnkgY29udGFpbnMgYSBzdHJpbmcgY2F0ZWdvcnkgYW5kIHNvbWUgYmluYXJ5IGRhdGEsIHNlcGFyYXRlZCBieQotLy8gdGhlIGRlbGltaXRlciAnPCcuCi0vLyBGb3IgZXhhbXBsZSwgdGhlIG92ZXJsYXkgaW5mb3MgKCJtZWRpYSIsICJwdHMiKSwgKCJyZW5kZXJlciIsICJmcHNceDYwIiksIGFuZAotLy8gKCJkb20iLCAia2V5ZG93biIpIHdpbGwgYmUgc3RvcmVkIGFzCi0vLyAgICdceDA5JywgJ20nLCAnZScsICdkJywgJ2knLCAnYScsICc8JywgJ3AnLCAndCcsICdzJywKLS8vICAgJ1x4MGQnLCAncicsICdlJywgJ24nLCAnZCcsICdlJywgJ3InLCAnZScsICdyJywgJzwnLCAnZicsICdwJywgJ3MnLCAnXHg2MCcsCi0vLyAgICdceDBiJywgJ2QnLCAnbycsICdtJywgJzwnLCAnaycsICdlJywgJ3knLCAnZCcsICdvJywgJ3cnLCAnbicsCi0vLyBhbmQgdGhlIHNpemUgb2YgdGhlIHZlY3RvciB3aWxsIGJlIDM2LiAgTm90ZSB0aGF0IEMgc3RyaW5ncyB3b24ndCBiZSBOVUxMCi0vLyB0ZXJtaW5hdGVkIGFuZCB0aGVpciBzaXplcyBhcmUgY2FsY3VsYXRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgZGF0YS4KKy8vIFRoZSBpbmZvIGlzIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKy8vICAgbmFtZTAsdmFsdWUwLG5hbWUxLHZhbHVlMSwuLi4KKy8vIEJpbmFyeSBkYXRhIHdpbGwgYmUgY29udmVydGVkIGludG8gaGV4IHN0cmluZyBiZWZvcmUgc3RvcmluZy4KIGNsYXNzIE92ZXJsYXlJbmZvUmVnaXN0cnkgewogIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RlbGltaXRlciA9ICc8JzsgIC8vICc6JyBkb2Vzbid0IHdvcmsgd2l0aCBzb21lIHNjYW5uZXJzCisgIHN0YXRpYyBjb25zdCBjaGFyIGtEZWxpbWl0ZXIgPSAnLCc7ICAvLyAnOicgZG9lc24ndCB3b3JrIHdpdGggc29tZSBzY2FubmVycwogICAvLyBUaGUgc2l6ZSBvZiBjYXRlZ29yeSBhbmQgZGF0YSBjb21iaW5lZCBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCiAgIC8vIGtNYXhTaXplT2ZEYXRhIC0gMS4gIFRoZSBleHRyYSByb29tIG9mIG9uZSBieXRlIGlzIHVzZWQgYnkgdGhlIGRlbGltaXRlci4KICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4U2l6ZU9mRGF0YSA9IDI1NTsKQEAgLTUyLDE0ICs0NSwyMCBAQAogCiAgIHN0YXRpYyB2b2lkIERpc2FibGUoKTsKIAotICAvLyB8Y2F0ZWdvcnl8IGNhbm5vdCBjb250YWluICc6Jy4gIFRoZSBzdW0gb2Ygc2l6ZSBvZiB8Y2F0ZWdvcnl8IGFuZCB8c3RyaW5nfAotICAvLyBjYW5ub3QgZXhjZWVkIDI1NC4gIEl0IGxlYXZlcyByb29tIGZvciB0aGUgZGVsaW1pdGVyLgotICBzdGF0aWMgdm9pZCBSZWdpc3Rlcihjb25zdCBjaGFyKiBjYXRlZ29yeSwgY29uc3QgY2hhciogc3RyKTsKLSAgLy8gfGNhdGVnb3J5fCBjYW5ub3QgY29udGFpbiAnOicuICBUaGUgc3VtIG9mIHNpemUgb2YgfGNhdGVnb3J5fCBhbmQgfGRhdGF8Ci0gIC8vIGNhbm5vdCBleGNlZWQgMjU0LiAgSXQgbGVhdmVzIHJvb20gZm9yIHRoZSBkZWxpbWl0ZXIuCisgIC8vIEJvdGggfGNhdGVnb3J5fCBhbmQgfGRhdGF8IGNhbm5vdCBjb250YWluIHRoZSBkZWxpbWl0ZXIuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIGNhdGVnb3J5LCBjb25zdCBjaGFyKiBkYXRhKTsKKyAgLy8gQm90aCB8Y2F0ZWdvcnl8IGFuZCB8ZGF0YXwgY2Fubm90IGNvbnRhaW4gdGhlIGRlbGltaXRlci4KICAgc3RhdGljIHZvaWQgUmVnaXN0ZXIoY29uc3QgY2hhciogY2F0ZWdvcnksIGNvbnN0IHZvaWQqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUpOwotICBzdGF0aWMgdm9pZCBSZXRyaWV2ZUFuZENsZWFyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBpbmZvcyk7CisgIC8vIEJvdGggfGNhdGVnb3J5fCBhbmQgfGRhdGF8IGNhbm5vdCBjb250YWluIHRoZSBkZWxpbWl0ZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgdm9pZCBSZWdpc3Rlcihjb25zdCBjaGFyKiBjYXRlZ29yeSwgVCBkYXRhKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgZGF0YTsKKyAgICBSZWdpc3RlcihjYXRlZ29yeSwgc3Muc3RyKCkuY19zdHIoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBSZXRyaWV2ZUFuZENsZWFyKHN0ZDo6c3RyaW5nKiBpbmZvcyk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2Ugb3ZlcmxheV9pbmZvCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L292ZXJsYXlfaW5mby9vdmVybGF5X2luZm9fcmVnaXN0cnlfdGVzdC5jYyBiL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeV90ZXN0LmNjCmluZGV4IGNlMDMxZWUuLjBiNWQ5N2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeV90ZXN0LmNjCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ19zcGxpdC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKQEAgLTI5LDU2ICszMCwzNiBAQAogCiBuYW1lc3BhY2UgewogCi10eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4+IFZhbHVlUGFpcjsKK3R5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gVmFsdWVQYWlyOwogCiAvLyBTZWUgY29tbWVudCBvZiBPdmVybGF5SW5mb1JlZ2lzdHJ5IGZvciBmb3JtYXQgb2YgfGluZm98Lgotc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPiBQYXJzZU92ZXJsYXlJbmZvKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGluZm8pIHsKLSAgc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPiBwYXJzZWRfaW5mb3M7Citib29sIFBhcnNlT3ZlcmxheUluZm8oc3RkOjpzdHJpbmcgaW5mb3MsIHN0ZDo6dmVjdG9yPFZhbHVlUGFpcj4qIHZhbHVlcykgeworICBDSEVDSyh2YWx1ZXMpOwogCi0gIHdoaWxlICghaW5mby5lbXB0eSgpKSB7Ci0gICAgLy8gUGFyc2UgdGhlIHNpemUKLSAgICBzaXplX3Qgc2l6ZSA9IGluZm9bMF07Ci0gICAgaW5mby5lcmFzZShpbmZvLmJlZ2luKCkpOworICBjb25zdCBjaGFyIGRlbGltaXRlcltdID0ge092ZXJsYXlJbmZvUmVnaXN0cnk6OmtEZWxpbWl0ZXIsIDB9OwogCi0gICAgQ0hFQ0tfTEUoc2l6ZSwgaW5mby5zaXplKCkpOwotCi0gICAgLy8gUGFyc2UgdGhlIGNhdGVnb3J5IG5hbWUKLSAgICBjb25zdCBhdXRvIGtEZWxpbWl0ZXIgPSBPdmVybGF5SW5mb1JlZ2lzdHJ5OjprRGVsaW1pdGVyOwotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZChpbmZvLmJlZ2luKCksIGluZm8uZW5kKCksIGtEZWxpbWl0ZXIpOwotICAgIENIRUNLKGl0ZXIgIT0gaW5mby5lbmQoKSk7Ci0KLSAgICBjb25zdCBhdXRvIGNhdGVnb3J5X2xlbmd0aCA9IGl0ZXIgLSBpbmZvLmJlZ2luKCk7Ci0gICAgQ0hFQ0tfTEUoc3RhdGljX2Nhc3Q8c2l6ZV90PihjYXRlZ29yeV9sZW5ndGgpLCBzaXplKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KAotICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihpbmZvLmRhdGEoKSksCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGluZm8uZGF0YSgpKSArIGNhdGVnb3J5X2xlbmd0aCk7Ci0KLSAgICAvLyBQYXJzZSB0aGUgZGF0YQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEoaW5mby5iZWdpbigpICsgY2F0ZWdvcnlfbGVuZ3RoICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYmVnaW4oKSArIHNpemUpOwotICAgIGluZm8uZXJhc2UoaW5mby5iZWdpbigpLCBpbmZvLmJlZ2luKCkgKyBzaXplKTsKLQotICAgIHBhcnNlZF9pbmZvcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2F0ZWdvcnksIGRhdGEpKTsKKyAgYXV0byB0b2tlbnMgPSBiYXNlOjpTcGxpdFN0cmluZyhpbmZvcywgZGVsaW1pdGVyLCBiYXNlOjpLRUVQX1dISVRFU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U1BMSVRfV0FOVF9BTEwpOworICBpZiAodG9rZW5zLnNpemUoKSAlIDIgIT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIENIRUNLKGluZm8uZW1wdHkoKSk7Ci0gIHJldHVybiBwYXJzZWRfaW5mb3M7Ci19CisgIHdoaWxlICghdG9rZW5zLmVtcHR5KCkpIHsKKyAgICB2YWx1ZXMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcih0b2tlbnNbMF0sIHRva2Vuc1sxXSkpOworICAgIHRva2Vucy5lcmFzZSh0b2tlbnMuYmVnaW4oKSwgdG9rZW5zLmJlZ2luKCkgKyAyKTsKKyAgfQogCi1ib29sIElzU2FtZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gZGF0YS5zaXplKCkgPT0gc3RyLnNpemUoKSAmJgotICAgICAgICAgU2JNZW1vcnlDb21wYXJlKGRhdGEuZGF0YSgpLCBzdHIuY19zdHIoKSwgZGF0YS5zaXplKCkpID09IDA7CisgIHJldHVybiB0cnVlOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAogVEVTVChPdmVybGF5SW5mb1JlZ2lzdHJ5VGVzdCwgUmV0cmlldmVPbkVtcHR5RGF0YSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbmZvcygnYScpOworICBzdGQ6OnN0cmluZyBpbmZvcygiYSIpOwogICBPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZXRyaWV2ZUFuZENsZWFyKCZpbmZvcyk7CiAgIEVYUEVDVF9UUlVFKGluZm9zLmVtcHR5KCkpOwogCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGluZm9zMSgnYScpOworICBzdGQ6OnN0cmluZyBpbmZvczEoImIiKTsKICAgT3ZlcmxheUluZm9SZWdpc3RyeTo6UmV0cmlldmVBbmRDbGVhcigmaW5mb3MxKTsKICAgRVhQRUNUX1RSVUUoaW5mb3MxLmVtcHR5KCkpOwogfQpAQCAtOTIsMzMgKzczLDEzIEBACiAKICAgICBPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZWdpc3RlcihrQ2F0ZWdvcnksIHZhbHVlLmNfc3RyKCkpOwogCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5mb3MoJ2EnKTsKKyAgICBzdGQ6OnN0cmluZyBpbmZvcygiYSIpOwogICAgIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJldHJpZXZlQW5kQ2xlYXIoJmluZm9zKTsKLSAgICBhdXRvIHBhcnNlZF9pbmZvcyA9IFBhcnNlT3ZlcmxheUluZm8oaW5mb3MpOworICAgIHN0ZDo6dmVjdG9yPFZhbHVlUGFpcj4gcGFyc2VkX2luZm9zOworICAgIEFTU0VSVF9UUlVFKFBhcnNlT3ZlcmxheUluZm8oaW5mb3MsICZwYXJzZWRfaW5mb3MpKTsKICAgICBFWFBFQ1RfRVEocGFyc2VkX2luZm9zLnNpemUoKSwgMSk7CiAgICAgRVhQRUNUX0VRKHBhcnNlZF9pbmZvc1swXS5maXJzdCwga0NhdGVnb3J5KTsKLSAgICBFWFBFQ1RfVFJVRShJc1NhbWUocGFyc2VkX2luZm9zWzBdLnNlY29uZCwgdmFsdWUpKTsKLQotICAgIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJldHJpZXZlQW5kQ2xlYXIoJmluZm9zKTsKLSAgICBFWFBFQ1RfVFJVRShpbmZvcy5lbXB0eSgpKTsKLSAgfQotfQotCi1URVNUKE92ZXJsYXlJbmZvUmVnaXN0cnlUZXN0LCBSZWdpc3RlclNpbmdsZUJpbmFyeVN0cmluZ0FuZFJldHJpZXZlKSB7Ci0gIGNvbnN0IGNoYXIga0NhdGVnb3J5W10gPSAiY2F0ZWdvcnkiOwotICBjb25zdCBzaXplX3Qga01heERhdGFTaXplID0gMjA7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4RGF0YVNpemU7ICsraSkgewotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKGksIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkgJSAyKSk7Ci0KLSAgICBPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZWdpc3RlcihrQ2F0ZWdvcnksIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGluZm9zKCdhJyk7Ci0gICAgT3ZlcmxheUluZm9SZWdpc3RyeTo6UmV0cmlldmVBbmRDbGVhcigmaW5mb3MpOwotICAgIGF1dG8gcGFyc2VkX2luZm9zID0gUGFyc2VPdmVybGF5SW5mbyhpbmZvcyk7Ci0gICAgRVhQRUNUX0VRKHBhcnNlZF9pbmZvcy5zaXplKCksIDEpOwotICAgIEVYUEVDVF9FUShwYXJzZWRfaW5mb3NbMF0uZmlyc3QsIGtDYXRlZ29yeSk7Ci0gICAgRVhQRUNUX1RSVUUocGFyc2VkX2luZm9zWzBdLnNlY29uZCA9PSB2YWx1ZSk7CisgICAgRVhQRUNUX0VRKHBhcnNlZF9pbmZvc1swXS5zZWNvbmQsIHZhbHVlKTsKIAogICAgIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJldHJpZXZlQW5kQ2xlYXIoJmluZm9zKTsKICAgICBFWFBFQ1RfVFJVRShpbmZvcy5lbXB0eSgpKTsKQEAgLTEzNyw5ICs5OCwxMCBAQAogICAgIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJlZ2lzdGVyKGtDYXRlZ29yeSwgdmFsdWVzLmJhY2soKS5jX3N0cigpKTsKICAgfQogCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGluZm9zKCdhJyk7CisgIHN0ZDo6c3RyaW5nIGluZm9zKCJhIik7CiAgIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJldHJpZXZlQW5kQ2xlYXIoJmluZm9zKTsKLSAgYXV0byBwYXJzZWRfaW5mb3MgPSBQYXJzZU92ZXJsYXlJbmZvKGluZm9zKTsKKyAgc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPiBwYXJzZWRfaW5mb3M7CisgIEFTU0VSVF9UUlVFKFBhcnNlT3ZlcmxheUluZm8oaW5mb3MsICZwYXJzZWRfaW5mb3MpKTsKICAgT3ZlcmxheUluZm9SZWdpc3RyeTo6UmV0cmlldmVBbmRDbGVhcigmaW5mb3MpOwogICBFWFBFQ1RfVFJVRShpbmZvcy5lbXB0eSgpKTsKIApAQCAtMTQ3LDM1ICsxMDksMTkgQEAKIAogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJpbmdMZW5ndGg7ICsraSkgewogICAgIEVYUEVDVF9FUShwYXJzZWRfaW5mb3NbaV0uZmlyc3QsIGtDYXRlZ29yeSk7Ci0gICAgRVhQRUNUX1RSVUUoSXNTYW1lKHBhcnNlZF9pbmZvc1tpXS5zZWNvbmQsIHZhbHVlc1tpXSkpOworICAgIEVYUEVDVF9FUShwYXJzZWRfaW5mb3NbaV0uc2Vjb25kLCB2YWx1ZXNbaV0pOwogICB9CiB9CiAKLVRFU1QoT3ZlcmxheUluZm9SZWdpc3RyeVRlc3QsIFJlZ2lzdGVyTXVsdGlwbGVCaW5hcnlEYXRhQW5kUmV0cmlldmUpIHsKLSAgY29uc3QgY2hhciBrQ2F0ZWdvcnlbXSA9ICJjIjsKLSAgY29uc3Qgc2l6ZV90IGtNYXhEYXRhU2l6ZSA9IDIwOworVEVTVChPdmVybGF5SW5mb1JlZ2lzdHJ5VGVzdCwgUmVnaXN0ZXJNdWx0aXBsZVR5cGVzKSB7CisgIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJlZ2lzdGVyKCJzdHJpbmciLCAic3RyaW5nX3ZhbHVlIik7CisgIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJlZ2lzdGVyKCJpbnQiLCAtMTIzNDUpOworICBPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZWdpc3RlcigidWludDY0IiwgMTIzNDU2Nzg5MDEydSk7CiAKLSAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHZhbHVlczsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhEYXRhU2l6ZTsgKytpKSB7Ci0gICAgdmFsdWVzLnB1c2hfYmFjayhzdGQ6OnZlY3Rvcjx1aW50OF90PihpLCBzdGF0aWNfY2FzdDx1aW50OF90PihpICUgMikpKTsKLQotICAgIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJlZ2lzdGVyKGtDYXRlZ29yeSwgdmFsdWVzLmJhY2soKS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmJhY2soKS5zaXplKCkpOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5mb3MoJ2EnKTsKKyAgc3RkOjpzdHJpbmcgaW5mb3MoImEiKTsKICAgT3ZlcmxheUluZm9SZWdpc3RyeTo6UmV0cmlldmVBbmRDbGVhcigmaW5mb3MpOwotICBhdXRvIHBhcnNlZF9pbmZvcyA9IFBhcnNlT3ZlcmxheUluZm8oaW5mb3MpOwotICBPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZXRyaWV2ZUFuZENsZWFyKCZpbmZvcyk7Ci0gIEVYUEVDVF9UUlVFKGluZm9zLmVtcHR5KCkpOwogCi0gIEFTU0VSVF9FUShwYXJzZWRfaW5mb3Muc2l6ZSgpLCBrTWF4RGF0YVNpemUpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heERhdGFTaXplOyArK2kpIHsKLSAgICBFWFBFQ1RfRVEocGFyc2VkX2luZm9zW2ldLmZpcnN0LCBrQ2F0ZWdvcnkpOwotICAgIEVYUEVDVF9UUlVFKHBhcnNlZF9pbmZvc1tpXS5zZWNvbmQgPT0gdmFsdWVzW2ldKTsKLSAgfQorICBFWFBFQ1RfRVEoaW5mb3MsICJzdHJpbmcsc3RyaW5nX3ZhbHVlLGludCwtMTIzNDUsdWludDY0LDEyMzQ1Njc4OTAxMiIpOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugb3ZlcmxheV9pbmZvCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L292ZXJsYXlfaW5mby9xcl9jb2RlX292ZXJsYXkuY2MgYi9zcmMvY29iYWx0L292ZXJsYXlfaW5mby9xcl9jb2RlX292ZXJsYXkuY2MKaW5kZXggNmZlZTAzMS4uZjQ2OTFkMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9vdmVybGF5X2luZm8vcXJfY29kZV9vdmVybGF5LmNjCisrKyBiL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL3FyX2NvZGVfb3ZlcmxheS5jYwpAQCAtMTUsMTMgKzE1LDE0IEBACiAjaW5jbHVkZSAiY29iYWx0L292ZXJsYXlfaW5mby9xcl9jb2RlX292ZXJsYXkuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImJhc2UvdHJhY2VfZXZlbnQvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mb19yZWdpc3RyeS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9hbmltYXRpb25zL2FuaW1hdGVfbm9kZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9RUi1Db2RlLWdlbmVyYXRvci9jcHAvUXJDb2RlLmhwcCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC0zMiwxNiArMzMsMjAgQEAKIHVzaW5nIHFyY29kZWdlbjo6UXJDb2RlOwogdXNpbmcgcmVuZGVyX3RyZWU6OkltYWdlOwogdXNpbmcgcmVuZGVyX3RyZWU6OkltYWdlTm9kZTsKK3VzaW5nIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyOwogCi1jb25zdCBpbnQga01vZHVsZURpbWVuc2lvbkluUGl4ZWxzID0gNDsKK2NvbnN0IGludCBrTWluaW11bVFyQ29kZVZlcnNpb24gPSAzOwogY29uc3QgaW50IGtQaXhlbFNpemVJbkJ5dGVzID0gNDsKLWNvbnN0IHVpbnQzMl90IGtCbGFjayA9IDB4MDAwMDAwMDA7CisjaWYgU0JfSVNfQklHX0VORElBTgorY29uc3QgdWludDMyX3Qga0JsYWNrID0gMHgwMDAwMDBGRjsKKyNlbHNlICAgLy8gU0JfSVNfQklHX0VORElBTgorY29uc3QgdWludDMyX3Qga0JsYWNrID0gMHhGRjAwMDAwMDsKKyNlbmRpZiAgLy8gU0JfSVNfQklHX0VORElBTgogY29uc3QgdWludDMyX3Qga1doaXRlID0gMHhGRkZGRkZGRjsKIGNvbnN0IHVpbnQzMl90IGtCb3JkZXJDb2xvciA9IGtXaGl0ZTsKLWNvbnN0IGludCBrQ29kZUJvcmRlckluUGl4ZWxzID0gMTY7Ci1jb25zdCBpbnQga1NjcmVlbk1hcmdpbkluUGl4ZWxzID0gMTI4OworY29uc3QgaW50IGtTY3JlZW5NYXJnaW5JblBpeGVscyA9IDY0OwogCi1pbnQ2NF90IHNfZnJhbWVfY291bnRfID0gMDsKK3VpbnQzMl90IHNfZnJhbWVfaW5kZXhfID0gMDsKIAogdm9pZCBEcmF3UmVjdChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaF9pbl9ieXRlcywgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldF9idWZmZXIpIHsKQEAgLTU1LDQzICs2MCw0NSBAQAogICB9CiB9CiAKLXZvaWQgRHJhd1FyQ29kZShjb25zdCBRckNvZGUmIHFyX2NvZGUsIGludCBwaXRjaF9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXRfYnVmZmVyKSB7Cit2b2lkIERyYXdRckNvZGUoY29uc3QgUXJDb2RlJiBxcl9jb2RlLCBpbnQgbW9kdWxlX2RpbWVuc2lvbl9pbl9waXhlbHMsCisgICAgICAgICAgICAgICAgaW50IHBpdGNoX2luX2J5dGVzLCB1aW50OF90KiB0YXJnZXRfYnVmZmVyKSB7CiAgIHVpbnQ4X3QqIHJvd19kYXRhID0gdGFyZ2V0X2J1ZmZlcjsKICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcXJfY29kZS5nZXRTaXplKCk7ICsrcm93KSB7CiAgICAgdWludDhfdCogY29sdW1uX2RhdGEgPSByb3dfZGF0YTsKICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBxcl9jb2RlLmdldFNpemUoKTsgKytjb2x1bW4pIHsKLSAgICAgIERyYXdSZWN0KGtNb2R1bGVEaW1lbnNpb25JblBpeGVscywga01vZHVsZURpbWVuc2lvbkluUGl4ZWxzLAorICAgICAgRHJhd1JlY3QobW9kdWxlX2RpbWVuc2lvbl9pbl9waXhlbHMsIG1vZHVsZV9kaW1lbnNpb25faW5fcGl4ZWxzLAogICAgICAgICAgICAgICAgcGl0Y2hfaW5fYnl0ZXMsIHFyX2NvZGUuZ2V0TW9kdWxlKHJvdywgY29sdW1uKSA/IGtCbGFjayA6IGtXaGl0ZSwKICAgICAgICAgICAgICAgIGNvbHVtbl9kYXRhKTsKLSAgICAgIGNvbHVtbl9kYXRhICs9IGtQaXhlbFNpemVJbkJ5dGVzICoga01vZHVsZURpbWVuc2lvbkluUGl4ZWxzOworICAgICAgY29sdW1uX2RhdGEgKz0ga1BpeGVsU2l6ZUluQnl0ZXMgKiBtb2R1bGVfZGltZW5zaW9uX2luX3BpeGVsczsKICAgICB9CiAKLSAgICByb3dfZGF0YSArPSBwaXRjaF9pbl9ieXRlcyAqIGtNb2R1bGVEaW1lbnNpb25JblBpeGVsczsKKyAgICByb3dfZGF0YSArPSBwaXRjaF9pbl9ieXRlcyAqIG1vZHVsZV9kaW1lbnNpb25faW5fcGl4ZWxzOwogICB9CiB9CiAKLXNjb3BlZF9yZWZwdHI8SW1hZ2U+IENyZWF0ZUltYWdlRm9yUXJDb2RlcygKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxRckNvZGU+JiBxcl9jb2RlcywgY29uc3QgbWF0aDo6U2l6ZSYgc2NyZWVuX3NpemUsCi0gICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKSB7Ci0gIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpvdmVybGF5X2luZm8iLCAiQ3JlYXRlSW1hZ2VGb3JRckNvZGVzKCkiKTsKK3Njb3BlZF9yZWZwdHI8SW1hZ2U+IENyZWF0ZUltYWdlRm9yUXJDb2RlKGNvbnN0IFFyQ29kZSYgcXJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlNpemUmIHNjcmVlbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6Om92ZXJsYXlfaW5mbyIsICJDcmVhdGVJbWFnZUZvclFyQ29kZSgpIik7CiAKLSAgaW50IG1heF9jb2RlX3NpemUgPSAwOworICBjb25zdCBpbnQgbW9kdWxlX2RpbWVuc2lvbl9pbl9waXhlbHMgPSBzY3JlZW5fc2l6ZS5oZWlnaHQoKSA+IDEwODAgPyAxNiA6IDg7CisgIGNvbnN0IGludCBjb2RlX2JvcmRlcl9pbl9waXhlbHMgPSBtb2R1bGVfZGltZW5zaW9uX2luX3BpeGVscyAqIDI7CiAKLSAgZm9yIChhdXRvJiBxcl9jb2RlIDogcXJfY29kZXMpIHsKLSAgICBtYXhfY29kZV9zaXplID0gc3RkOjptYXgobWF4X2NvZGVfc2l6ZSwgcXJfY29kZS5nZXRTaXplKCkpOwotICB9CisgIGludCBxcl9jb2RlX3NpemVfaW5fYmxvY2tzID0gcXJfY29kZS5nZXRTaXplKCk7CiAKLSAgaW50IGNvbHVtbiA9Ci0gICAgICAoc2NyZWVuX3NpemUud2lkdGgoKSAtIGtTY3JlZW5NYXJnaW5JblBpeGVscyAqIDIgLSBrQ29kZUJvcmRlckluUGl4ZWxzKSAvCi0gICAgICAobWF4X2NvZGVfc2l6ZSAqIGtNb2R1bGVEaW1lbnNpb25JblBpeGVscyArIGtDb2RlQm9yZGVySW5QaXhlbHMpOwotICBjb2x1bW4gPSBzdGQ6Om1pbihjb2x1bW4sIHN0YXRpY19jYXN0PGludD4ocXJfY29kZXMuc2l6ZSgpKSk7Ci0gIGludCByb3cgPSAoc3RhdGljX2Nhc3Q8aW50Pihxcl9jb2Rlcy5zaXplKCkpICsgY29sdW1uIC0gMSkgLyBjb2x1bW47CisgIGludCBjb2x1bW4gPSAoc2NyZWVuX3NpemUud2lkdGgoKSAtIGtTY3JlZW5NYXJnaW5JblBpeGVscyAqIDIgLQorICAgICAgICAgICAgICAgIGNvZGVfYm9yZGVyX2luX3BpeGVscykgLworICAgICAgICAgICAgICAgKHFyX2NvZGVfc2l6ZV9pbl9ibG9ja3MgKiBtb2R1bGVfZGltZW5zaW9uX2luX3BpeGVscyArCisgICAgICAgICAgICAgICAgY29kZV9ib3JkZXJfaW5fcGl4ZWxzKTsKKyAgY29sdW1uID0gc3RkOjptaW4oY29sdW1uLCBzbG90cyk7CisgIGludCByb3cgPSAoc2xvdHMgKyBjb2x1bW4gLSAxKSAvIGNvbHVtbjsKIAotICBpbnQgaW1hZ2Vfd2lkdGggPSBjb2x1bW4gKiBtYXhfY29kZV9zaXplICoga01vZHVsZURpbWVuc2lvbkluUGl4ZWxzICsKLSAgICAgICAgICAgICAgICAgICAga0NvZGVCb3JkZXJJblBpeGVscyAqIChjb2x1bW4gKyAxKTsKLSAgaW50IGltYWdlX2hlaWdodCA9IHJvdyAqIG1heF9jb2RlX3NpemUgKiBrTW9kdWxlRGltZW5zaW9uSW5QaXhlbHMgKwotICAgICAgICAgICAgICAgICAgICAga0NvZGVCb3JkZXJJblBpeGVscyAqIChyb3cgKyAxKTsKKyAgaW50IGltYWdlX3dpZHRoID0KKyAgICAgIGNvbHVtbiAqIHFyX2NvZGVfc2l6ZV9pbl9ibG9ja3MgKiBtb2R1bGVfZGltZW5zaW9uX2luX3BpeGVscyArCisgICAgICBjb2RlX2JvcmRlcl9pbl9waXhlbHMgKiAoY29sdW1uICsgMSk7CisgIGludCBpbWFnZV9oZWlnaHQgPSByb3cgKiBxcl9jb2RlX3NpemVfaW5fYmxvY2tzICogbW9kdWxlX2RpbWVuc2lvbl9pbl9waXhlbHMgKworICAgICAgICAgICAgICAgICAgICAgY29kZV9ib3JkZXJfaW5fcGl4ZWxzICogKHJvdyArIDEpOwogCiAgIGF1dG8gaW1hZ2VfZGF0YSA9IHJlc291cmNlX3Byb3ZpZGVyLT5BbGxvY2F0ZUltYWdlRGF0YSgKICAgICAgIG1hdGg6OlNpemUoaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCksIHJlbmRlcl90cmVlOjprUGl4ZWxGb3JtYXRSR0JBOCwKQEAgLTk5LDU5ICsxMDYsNjMgQEAKICAgRENIRUNLKGltYWdlX2RhdGEpOwogICBhdXRvIGltYWdlX2Rlc2MgPSBpbWFnZV9kYXRhLT5HZXREZXNjcmlwdG9yKCk7CiAKLSAgc2l6ZV90IHFyX2NvZGVfaW5kZXggPSAwOworICB1aW50MzJfdCBzbG90X2luZGV4ID0gMDsKICAgYXV0byByb3dfZGF0YSA9IGltYWdlX2RhdGEtPkdldE1lbW9yeSgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IHJvdzsgKytpKSB7Ci0gICAgLy8gRHJhdyB0aGUgdG9wIGJvcmRlciBvZiBhbGwgcXIgY29kZXMgaW4gdGhlIHJvdy4KLSAgICBEcmF3UmVjdChpbWFnZV93aWR0aCwga0NvZGVCb3JkZXJJblBpeGVscywgaW1hZ2VfZGVzYy5waXRjaF9pbl9ieXRlcywKKyAgICAvLyBEcmF3IHRoZSB0b3AgYm9yZGVyIG9mIGFsbCBxciBjb2RlIGJsb2NrcyBpbiB0aGUgcm93LgorICAgIERyYXdSZWN0KGltYWdlX3dpZHRoLCBjb2RlX2JvcmRlcl9pbl9waXhlbHMsIGltYWdlX2Rlc2MucGl0Y2hfaW5fYnl0ZXMsCiAgICAgICAgICAgICAga0JvcmRlckNvbG9yLCByb3dfZGF0YSk7Ci0gICAgcm93X2RhdGEgKz0ga0NvZGVCb3JkZXJJblBpeGVscyAqIGltYWdlX2Rlc2MucGl0Y2hfaW5fYnl0ZXM7CisgICAgcm93X2RhdGEgKz0gY29kZV9ib3JkZXJfaW5fcGl4ZWxzICogaW1hZ2VfZGVzYy5waXRjaF9pbl9ieXRlczsKICAgICBhdXRvIGNvbHVtbl9kYXRhID0gcm93X2RhdGE7CiAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbjsgKytqKSB7CiAgICAgICAvLyBEcmF3IHRoZSBsZWZ0IGJvcmRlci4KLSAgICAgIERyYXdSZWN0KGtDb2RlQm9yZGVySW5QaXhlbHMsIG1heF9jb2RlX3NpemUgKiBrTW9kdWxlRGltZW5zaW9uSW5QaXhlbHMsCisgICAgICBEcmF3UmVjdChjb2RlX2JvcmRlcl9pbl9waXhlbHMsCisgICAgICAgICAgICAgICBxcl9jb2RlX3NpemVfaW5fYmxvY2tzICogbW9kdWxlX2RpbWVuc2lvbl9pbl9waXhlbHMsCiAgICAgICAgICAgICAgICBpbWFnZV9kZXNjLnBpdGNoX2luX2J5dGVzLCBrQm9yZGVyQ29sb3IsIGNvbHVtbl9kYXRhKTsKLSAgICAgIGNvbHVtbl9kYXRhICs9IGtDb2RlQm9yZGVySW5QaXhlbHMgKiBrUGl4ZWxTaXplSW5CeXRlczsKLSAgICAgIGlmIChxcl9jb2RlX2luZGV4IDwgcXJfY29kZXMuc2l6ZSgpKSB7CisgICAgICBjb2x1bW5fZGF0YSArPSBjb2RlX2JvcmRlcl9pbl9waXhlbHMgKiBrUGl4ZWxTaXplSW5CeXRlczsKKyAgICAgIGlmIChzbG90X2luZGV4ID09IHNfZnJhbWVfaW5kZXhfICUgc2xvdHMpIHsKICAgICAgICAgLy8gRHJhdyBxciBjb2RlLgotICAgICAgICBEcmF3UXJDb2RlKHFyX2NvZGVzW3FyX2NvZGVfaW5kZXhdLCBpbWFnZV9kZXNjLnBpdGNoX2luX2J5dGVzLAotICAgICAgICAgICAgICAgICAgIGNvbHVtbl9kYXRhKTsKLSAgICAgICAgKytxcl9jb2RlX2luZGV4OworICAgICAgICBEcmF3UXJDb2RlKHFyX2NvZGUsIG1vZHVsZV9kaW1lbnNpb25faW5fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgIGltYWdlX2Rlc2MucGl0Y2hfaW5fYnl0ZXMsIGNvbHVtbl9kYXRhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERyYXdSZWN0KHFyX2NvZGVfc2l6ZV9pbl9ibG9ja3MgKiBtb2R1bGVfZGltZW5zaW9uX2luX3BpeGVscywKKyAgICAgICAgICAgICAgICAgcXJfY29kZV9zaXplX2luX2Jsb2NrcyAqIG1vZHVsZV9kaW1lbnNpb25faW5fcGl4ZWxzLAorICAgICAgICAgICAgICAgICBpbWFnZV9kZXNjLnBpdGNoX2luX2J5dGVzLCBrQmxhY2ssIGNvbHVtbl9kYXRhKTsKICAgICAgIH0KLSAgICAgIGNvbHVtbl9kYXRhICs9Ci0gICAgICAgICAgbWF4X2NvZGVfc2l6ZSAqIGtNb2R1bGVEaW1lbnNpb25JblBpeGVscyAqIGtQaXhlbFNpemVJbkJ5dGVzOworICAgICAgKytzbG90X2luZGV4OworICAgICAgY29sdW1uX2RhdGEgKz0gcXJfY29kZV9zaXplX2luX2Jsb2NrcyAqIG1vZHVsZV9kaW1lbnNpb25faW5fcGl4ZWxzICoKKyAgICAgICAgICAgICAgICAgICAgIGtQaXhlbFNpemVJbkJ5dGVzOwogICAgIH0KIAogICAgIC8vIERyYXcgdGhlIHJpZ2h0IGJvcmRlciBvZiB0aGUgcm93LgotICAgIERyYXdSZWN0KGtDb2RlQm9yZGVySW5QaXhlbHMsIG1heF9jb2RlX3NpemUgKiBrTW9kdWxlRGltZW5zaW9uSW5QaXhlbHMsCisgICAgRHJhd1JlY3QoY29kZV9ib3JkZXJfaW5fcGl4ZWxzLAorICAgICAgICAgICAgIHFyX2NvZGVfc2l6ZV9pbl9ibG9ja3MgKiBtb2R1bGVfZGltZW5zaW9uX2luX3BpeGVscywKICAgICAgICAgICAgICBpbWFnZV9kZXNjLnBpdGNoX2luX2J5dGVzLCBrQm9yZGVyQ29sb3IsIGNvbHVtbl9kYXRhKTsKIAotICAgIHJvd19kYXRhICs9Ci0gICAgICAgIG1heF9jb2RlX3NpemUgKiBrTW9kdWxlRGltZW5zaW9uSW5QaXhlbHMgKiBpbWFnZV9kZXNjLnBpdGNoX2luX2J5dGVzOworICAgIHJvd19kYXRhICs9IHFyX2NvZGVfc2l6ZV9pbl9ibG9ja3MgKiBtb2R1bGVfZGltZW5zaW9uX2luX3BpeGVscyAqCisgICAgICAgICAgICAgICAgaW1hZ2VfZGVzYy5waXRjaF9pbl9ieXRlczsKICAgfQogCiAgIC8vIERyYXcgdGhlIGJvdHRvbSBib3JkZXIgb2YgYWxsIHFyIGNvZGUuCi0gIERyYXdSZWN0KGltYWdlX3dpZHRoLCBrQ29kZUJvcmRlckluUGl4ZWxzLCBpbWFnZV9kZXNjLnBpdGNoX2luX2J5dGVzLAorICBEcmF3UmVjdChpbWFnZV93aWR0aCwgY29kZV9ib3JkZXJfaW5fcGl4ZWxzLCBpbWFnZV9kZXNjLnBpdGNoX2luX2J5dGVzLAogICAgICAgICAgICBrQm9yZGVyQ29sb3IsIHJvd19kYXRhKTsKIAogICByZXR1cm4gcmVzb3VyY2VfcHJvdmlkZXItPkNyZWF0ZUltYWdlKHN0ZDo6bW92ZShpbWFnZV9kYXRhKSk7CiB9CiAKLXZvaWQgQW5pbWF0ZUNCKG1hdGg6OlNpemUgc2NyZWVuX3NpemUsCi0gICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6SW1hZ2VOb2RlOjpCdWlsZGVyKiBpbWFnZV9ub2RlLAotICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWUpIHsKK3ZvaWQgQW5pbWF0ZUNCKG1hdGg6OlNpemUgc2NyZWVuX3NpemUsIGludCBzbG90cywKKyAgICAgICAgICAgICAgIFJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAorICAgICAgICAgICAgICAgSW1hZ2VOb2RlOjpCdWlsZGVyKiBpbWFnZV9ub2RlLCBiYXNlOjpUaW1lRGVsdGEgdGltZSkgewogICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHRpbWUpOwogICBEQ0hFQ0soaW1hZ2Vfbm9kZSk7CiAKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6Om92ZXJsYXlfaW5mbyIsICJBbmltYXRlQ0IoKSIpOwogCi0gIE92ZXJsYXlJbmZvUmVnaXN0cnk6OlJlZ2lzdGVyKCJvdmVybGF5X2luZm86ZnJhbWVfY291bnQiLCAmc19mcmFtZV9jb3VudF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzX2ZyYW1lX2NvdW50XykpOwotICArK3NfZnJhbWVfY291bnRfOworICBPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZWdpc3RlcigiZnJhbWUiLCBzX2ZyYW1lX2luZGV4Xyk7CisgICsrc19mcmFtZV9pbmRleF87CiAKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5mb3M7CisgIHN0ZDo6c3RyaW5nIGluZm9zOwogICBPdmVybGF5SW5mb1JlZ2lzdHJ5OjpSZXRyaWV2ZUFuZENsZWFyKCZpbmZvcyk7CiAKICAgaWYgKGluZm9zLmVtcHR5KCkpIHsKQEAgLTE1OSwyNiArMTcwLDI1IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgLy8gVXNlIGEgdmVjdG9yIGluIGNhc2Ugd2UgZGVjaWRlIHRvIHN3aXRjaCBiYWNrIHRvIG11bHRpcGxlIHFyIGNvZGVzLgotICBzdGQ6OnZlY3RvcjxRckNvZGU+IHFyX2NvZGVzOwotICBxcl9jb2Rlcy5lbXBsYWNlX2JhY2soUXJDb2RlOjplbmNvZGVCaW5hcnkoaW5mb3MsIFFyQ29kZTo6RWNjOjpMT1cpKTsKLQorICBhdXRvIHFyY29kZSA9IFFyQ29kZTo6ZW5jb2RlVGV4dChpbmZvcy5jX3N0cigpLCBRckNvZGU6OkVjYzo6TE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWluaW11bVFyQ29kZVZlcnNpb24pOwogICBpbWFnZV9ub2RlLT5zb3VyY2UgPQotICAgICAgQ3JlYXRlSW1hZ2VGb3JRckNvZGVzKHFyX2NvZGVzLCBzY3JlZW5fc2l6ZSwgcmVzb3VyY2VfcHJvdmlkZXIpOworICAgICAgQ3JlYXRlSW1hZ2VGb3JRckNvZGUocXJjb2RlLCBzY3JlZW5fc2l6ZSwgc2xvdHMsIHJlc291cmNlX3Byb3ZpZGVyKTsKICAgYXV0byBpbWFnZV9zaXplID0gaW1hZ2Vfbm9kZS0+c291cmNlLT5HZXRTaXplKCk7Ci0gIC8vIFRPRE86IE1vdmUgdGhlIFFSIGNvZGUgYmV0d2VlbiBkcmF3cyB0byBhdm9pZCB0ZWFyaW5nLgotICBpbWFnZV9ub2RlLT5kZXN0aW5hdGlvbl9yZWN0ID0KLSAgICAgIG1hdGg6OlJlY3RGKGtTY3JlZW5NYXJnaW5JblBpeGVscywga1NjcmVlbk1hcmdpbkluUGl4ZWxzLAotICAgICAgICAgICAgICAgICAgaW1hZ2Vfc2l6ZS53aWR0aCgpLCBpbWFnZV9zaXplLmhlaWdodCgpKTsKKyAgaW1hZ2Vfbm9kZS0+ZGVzdGluYXRpb25fcmVjdCA9IG1hdGg6OlJlY3RGKAorICAgICAgc2NyZWVuX3NpemUud2lkdGgoKSAtIGltYWdlX3NpemUud2lkdGgoKSAtIGtTY3JlZW5NYXJnaW5JblBpeGVscywKKyAgICAgIHNjcmVlbl9zaXplLmhlaWdodCgpIC0gaW1hZ2Vfc2l6ZS5oZWlnaHQoKSAtIGtTY3JlZW5NYXJnaW5JblBpeGVscywKKyAgICAgIGltYWdlX3NpemUud2lkdGgoKSwgaW1hZ2Vfc2l6ZS5oZWlnaHQoKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCiBRckNvZGVPdmVybGF5OjpRckNvZGVPdmVybGF5KAotICAgIGNvbnN0IG1hdGg6OlNpemUmIHNjcmVlbl9zaXplLAotICAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlciwKKyAgICBjb25zdCBtYXRoOjpTaXplJiBzY3JlZW5fc2l6ZSwgaW50IHNsb3RzLAorICAgIFJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAogICAgIGNvbnN0IFJlbmRlclRyZWVQcm9kdWNlZENCJiByZW5kZXJfdHJlZV9wcm9kdWNlZF9jYikKICAgICA6IHJlbmRlcl90cmVlX3Byb2R1Y2VkX2NiXyhyZW5kZXJfdHJlZV9wcm9kdWNlZF9jYiksCisgICAgICBzbG90c18oc2xvdHMpLAogICAgICAgc2NyZWVuX3NpemVfKHNjcmVlbl9zaXplKSwKICAgICAgIHJlc291cmNlX3Byb3ZpZGVyXyhyZXNvdXJjZV9wcm92aWRlcikgewogICBEQ0hFQ0tfR1Qoc2NyZWVuX3NpemUud2lkdGgoKSwgMCk7CkBAIC0xOTYsOCArMjA2LDcgQEAKICAgVXBkYXRlUmVuZGVyVHJlZSgpOwogfQogCi12b2lkIFFyQ29kZU92ZXJsYXk6OlNldFJlc291cmNlUHJvdmlkZXIoCi0gICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKSB7Cit2b2lkIFFyQ29kZU92ZXJsYXk6OlNldFJlc291cmNlUHJvdmlkZXIoUmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpIHsKICAgcmVzb3VyY2VfcHJvdmlkZXJfID0gcmVzb3VyY2VfcHJvdmlkZXI7CiAgIFVwZGF0ZVJlbmRlclRyZWUoKTsKIH0KQEAgLTIxMiw4ICsyMjEsOCBAQAogICBzY29wZWRfcmVmcHRyPEltYWdlTm9kZT4gaW1hZ2Vfbm9kZSA9IG5ldyBJbWFnZU5vZGUobnVsbHB0cik7CiAgIHJlbmRlcl90cmVlOjphbmltYXRpb25zOjpBbmltYXRlTm9kZTo6QnVpbGRlciBhbmltYXRlX25vZGVfYnVpbGRlcjsKIAotICBhbmltYXRlX25vZGVfYnVpbGRlci5BZGQoCi0gICAgICBpbWFnZV9ub2RlLCBiYXNlOjpCaW5kKEFuaW1hdGVDQiwgc2NyZWVuX3NpemVfLCByZXNvdXJjZV9wcm92aWRlcl8pKTsKKyAgYW5pbWF0ZV9ub2RlX2J1aWxkZXIuQWRkKGltYWdlX25vZGUsIGJhc2U6OkJpbmQoQW5pbWF0ZUNCLCBzY3JlZW5fc2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzXywgcmVzb3VyY2VfcHJvdmlkZXJfKSk7CiAKICAgcmVuZGVyX3RyZWVfcHJvZHVjZWRfY2JfLlJ1bihuZXcgcmVuZGVyX3RyZWU6OmFuaW1hdGlvbnM6OkFuaW1hdGVOb2RlKAogICAgICAgYW5pbWF0ZV9ub2RlX2J1aWxkZXIsIGltYWdlX25vZGUpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL3FyX2NvZGVfb3ZlcmxheS5oIGIvc3JjL2NvYmFsdC9vdmVybGF5X2luZm8vcXJfY29kZV9vdmVybGF5LmgKaW5kZXggNWQ1YWExNS4uMDJkNjMwYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9vdmVybGF5X2luZm8vcXJfY29kZV9vdmVybGF5LmgKKysrIGIvc3JjL2NvYmFsdC9vdmVybGF5X2luZm8vcXJfY29kZV9vdmVybGF5LmgKQEAgLTMxLDcgKzMxLDcgQEAKICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+Jik+CiAgICAgICBSZW5kZXJUcmVlUHJvZHVjZWRDQjsKIAotICBRckNvZGVPdmVybGF5KGNvbnN0IG1hdGg6OlNpemUmIHNjcmVlbl9zaXplLAorICBRckNvZGVPdmVybGF5KGNvbnN0IG1hdGg6OlNpemUmIHNjcmVlbl9zaXplLCBpbnQgc2xvdHMsCiAgICAgICAgICAgICAgICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAogICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclRyZWVQcm9kdWNlZENCJiByZW5kZXJfdHJlZV9wcm9kdWNlZF9jYik7CiAKQEAgLTQxLDcgKzQxLDExIEBACiAgcHJpdmF0ZToKICAgdm9pZCBVcGRhdGVSZW5kZXJUcmVlKCk7CiAKLSAgUmVuZGVyVHJlZVByb2R1Y2VkQ0IgcmVuZGVyX3RyZWVfcHJvZHVjZWRfY2JfOworICBjb25zdCBSZW5kZXJUcmVlUHJvZHVjZWRDQiByZW5kZXJfdHJlZV9wcm9kdWNlZF9jYl87CisgIC8vIFFyIGNvZGVzIGFyZSBkaXNwbGF5ZWQgaW4gcm90YXRpbmcgcG9zaXRpb25zIHNvIGl0IHdvbid0IGJlIGJsdXJyZWQgZHVyaW5nCisgIC8vIGNhcHR1cmUuICBUaGUgbnVtYmVyIG9mIHJvdGF0aW5nIHBvc2l0aW9ucyBhcmUgc3BlY2lmaWVkIGJ5IHxzbG90c198LgorICBjb25zdCBpbnQgc2xvdHNfOworCiAgIG1hdGg6OlNpemUgc2NyZWVuX3NpemVfOwogICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXJfOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcGFnZV92aXNpYmlsaXR5L3BhZ2VfdmlzaWJpbGl0eS5neXAgYi9zcmMvY29iYWx0L3BhZ2VfdmlzaWJpbGl0eS9wYWdlX3Zpc2liaWxpdHkuZ3lwCmluZGV4IGJlZjVmMDguLjRkODU0NDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcGFnZV92aXNpYmlsaXR5L3BhZ2VfdmlzaWJpbGl0eS5neXAKKysrIGIvc3JjL2NvYmFsdC9wYWdlX3Zpc2liaWxpdHkvcGFnZV92aXNpYmlsaXR5Lmd5cApAQCAtNDcsMTEgKzQ3LDExIEBACiAgICAgICAgICdwYWdlX3Zpc2liaWxpdHlfc3RhdGVfdGVzdC5jYycsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ3BhZ2VfdmlzaWJpbGl0eScsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ3BhZ2VfdmlzaWJpbGl0eV90ZXN0X2RlcGxveScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JlbmRlcl90cmVlLmd5cCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVuZGVyX3RyZWUuZ3lwCmluZGV4IGM3YzBlYzkuLjhmNzQwNTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVuZGVyX3RyZWUuZ3lwCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVuZGVyX3RyZWUuZ3lwCkBAIC0xMDQsMTIgKzEwNCwxMiBAQAogICAgICAgICAnbm9kZV92aXNpdG9yX3Rlc3QuY2MnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdhbmltYXRpb25zJywKICAgICAgICAgJ3JlbmRlcl90cmVlJywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKIAogICAgICMgRGVwbG95cyB0aGUgcmVuZGVyIHRyZWUgbGlicmFyeSB0ZXN0IG9uIGEgY29uc29sZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9iYWNrZW5kLmd5cCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9iYWNrZW5kLmd5cAppbmRleCAzZmYyZGU0Li5hM2I1ZTg1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmFja2VuZC5neXAKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JhY2tlbmQuZ3lwCkBAIC0yMyw3ICsyMyw2IEBACiAgICAgICAgICdyZW5kZXJfdGFyZ2V0LmNjJywKICAgICAgICAgJ3JlbmRlcl90YXJnZXQuaCcsCiAgICAgICBdLAotCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWF0aC9tYXRoLmd5cDptYXRoJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19jb250ZXh0LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuY2MKaW5kZXggMTJmMGUzYy4uNDAwOGIzMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuY2MKQEAgLTUyLDYgKzUyLDE2IEBACiAgIHJldHVybiAtMS4wZjsKIH0KIAorZmxvYXQgR3JhcGhpY3NDb250ZXh0OjpHZXRNaW5pbXVtRnJhbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKCkgeworICBpZiAoZ3JhcGhpY3NfZXh0ZW5zaW9uXyAmJiBncmFwaGljc19leHRlbnNpb25fLT52ZXJzaW9uID49IDIpIHsKKyAgICByZXR1cm4gZ3JhcGhpY3NfZXh0ZW5zaW9uXy0+R2V0TWluaW11bUZyYW1lSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcygpOworICB9CisKKyAgLy8gUmV0dXJuIG5lZ2F0aXZlIHZhbHVlLCBpZiB0aGUgR3JhcGhpY3NFeHRlbnNpb24gaXMgbm90IGltcGxlbWVudGVkCisgIC8vIG9yIHRoZSBHcmFwaGljc0V4dGVuc2lvbiB2ZXJzaW9uIGlzIGJlbG93IDIuCisgIHJldHVybiAtMS4wZjsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKIH0gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19jb250ZXh0LmgKaW5kZXggODYyMWY1ZS4uZWFkMjhjMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3NfY29udGV4dC5oCkBAIC04NSw2ICs4NSwxNSBAQAogICAvLyBvbmx5IGJlIHByZXNlbnRlZCB3aGVuIHNvbWV0aGluZyBjaGFuZ2VzLgogICB2aXJ0dWFsIGZsb2F0IEdldE1heGltdW1GcmFtZUludGVydmFsSW5NaWxsaXNlY29uZHMoKTsKIAorICAvLyBBbGxvdyB0aHJvdHRsaW5nIG9mIHRoZSBmcmFtZSByYXRlLiBUaGlzIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgorICAvLyBtaWxsaXNlY29uZHMgYW5kIGNhbiBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gS2VlcCBpbiBtaW5kIHRoYXQKKyAgLy8gc3dhcHBpbmcgZnJhbWVzIG1heSB0YWtlIHNvbWUgYWRkaXRpb25hbCBwcm9jZXNzaW5nIHRpbWUsIHNvIGl0IG1heSBiZQorICAvLyBiZXR0ZXIgdG8gc3BlY2lmeSBhIGxvd2VyIGRlbGF5LiBGb3IgZXhhbXBsZSwgJzMzJyBpbnN0ZWFkIG9mICczMy4zMycKKyAgLy8gZm9yIDMwIEh6IHJlZnJlc2guIElmIGltcGxlbWVudGVkLCB0aGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZ3lwCisgIC8vIHZhcmlhYmxlICdjb2JhbHRfbWluaW11bV9mcmFtZV90aW1lX2luX21pbGxpc2Vjb25kcycuCisgIC8vIE5vdGU6IFJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgYnkgdGhlIHBsYXRmb3JtLgorICB2aXJ0dWFsIGZsb2F0IEdldE1pbmltdW1GcmFtZUludGVydmFsSW5NaWxsaXNlY29uZHMoKTsKKwogIHByaXZhdGU6CiAgIEdyYXBoaWNzU3lzdGVtKiBzeXN0ZW1fOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9waXBlbGluZS5jYwppbmRleCBlZjU0NzI2Li5lMmRhZDIzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuY2MKQEAgLTI5OCwxMiArMjk4LDIwIEBACiAgICAgLy8gc3dhcHMuIEl0IGlzIHBvc3NpYmxlIHRoYXQgYSBzdWJtaXNzaW9uIGlzIG5vdCByZW5kZXJlZCAodGhpcyBjYW4KICAgICAvLyBoYXBwZW4gaWYgdGhlIHJlbmRlciB0cmVlIGhhcyBub3QgY2hhbmdlZCBiZXR3ZWVuIHN1Ym1pc3Npb25zKSwgc28gbm8KICAgICAvLyBmcmFtZSBzd2FwIG9jY3VycywgYW5kIHRoZSBtaW5pbXVtIGZyYW1lIHRpbWUgaXMgdGhlIG9ubHkgdGhyb3R0bGUuCisgICAgZmxvYXQgbWluaW11bV9mcmFtZV9pbnRlcnZhbF9taWxsaXNlY29uZHMgPQorICAgICAgICBncmFwaGljc19jb250ZXh0XworICAgICAgICAgICAgPyBncmFwaGljc19jb250ZXh0Xy0+R2V0TWluaW11bUZyYW1lSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcygpCisgICAgICAgICAgICA6IC0xLjBmOwogICAgIENPTVBJTEVfQVNTRVJUKENPQkFMVF9NSU5JTVVNX0ZSQU1FX1RJTUVfSU5fTUlMTElTRUNPTkRTID4gMCwKICAgICAgICAgICAgICAgICAgICBmcmFtZV90aW1lX211c3RfYmVfcG9zaXRpdmUpOworICAgIGlmIChtaW5pbXVtX2ZyYW1lX2ludGVydmFsX21pbGxpc2Vjb25kcyA8IDAuMGYpIHsKKyAgICAgIG1pbmltdW1fZnJhbWVfaW50ZXJ2YWxfbWlsbGlzZWNvbmRzID0KKyAgICAgICAgICBDT0JBTFRfTUlOSU1VTV9GUkFNRV9USU1FX0lOX01JTExJU0VDT05EUzsKKyAgICB9CisgICAgRENIRUNLKG1pbmltdW1fZnJhbWVfaW50ZXJ2YWxfbWlsbGlzZWNvbmRzID4gMC4wZik7CiAgICAgcmFzdGVyaXplX3RpbWVyXy5lbXBsYWNlKAogICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kc0QoCi0gICAgICAgICAgICBDT0JBTFRfTUlOSU1VTV9GUkFNRV9USU1FX0lOX01JTExJU0VDT05EUyksCisgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kc0QobWluaW11bV9mcmFtZV9pbnRlcnZhbF9taWxsaXNlY29uZHMpLAogICAgICAgICBiYXNlOjpCaW5kUmVwZWF0aW5nKCZQaXBlbGluZTo6UmFzdGVyaXplQ3VycmVudFRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwogICAgIHJhc3Rlcml6ZV90aW1lcl8tPlJlc2V0KCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yYXN0ZXJpemVyLmd5cCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jhc3Rlcml6ZXIuZ3lwCmluZGV4IGY5ODlhNmQuLmFmMDNiN2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jhc3Rlcml6ZXIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jhc3Rlcml6ZXIuZ3lwCkBAIC0xMDMsMTAgKzEwMywxMCBAQAogCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnaGFyZHdhcmVfcmFzdGVyaXplcicsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKIAogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvdGV4dHVyZWRfbWVzaF9yZW5kZXJlci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvdGV4dHVyZWRfbWVzaF9yZW5kZXJlci5jYwppbmRleCBiM2U1NmIyLi4wZmQyYWIyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3RleHR1cmVkX21lc2hfcmVuZGVyZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC90ZXh0dXJlZF9tZXNoX3JlbmRlcmVyLmNjCkBAIC04NSwxMCArODUsMTcgQEAKICAgICAxLjE2NGYsIDIuMTEyZiwgMC4wZiwgICAtMS4xMjg3NWYsIDAuMGYsICAgMC4wZiwgICAgMC4wZiwgICAgMS4wZn07CiAKIC8vIFVzZWQgZm9yIDEwYml0IHVubm9ybWFsaXplZCBZVVYgaW1hZ2VzLgorLy8gWSBpcyBiZXR3ZWVuIDY0IGFuZCA5NDAgaW5jbHVzaXZlLiBVIGFuZCBWIGFyZSBiZXR3ZWVuIDY0IGFuZCA5NjAgaW5jbHVzaXZlLgorLy8gaXQgaXMgMTAyMy8oOTQwLTY0KSA9IDEuMTY3OCBmb3IgWSBhbmQgMTAyMy8oOTYwLTY0KSA9IDEuMTQxNyBmb3IgVSBhbmQgVi4KKy8vIDY0IGlzIHRoZSBzY2FsZSBmYWN0b3IgZm9yIDEwIGJpdC4KKy8vIElucHV0IFlVViBtdXN0IGJlIHN1YnRyYWN0ZWQgYnkgKDAuMDYyNSwgMC41LCAwLjUpLCBzbworLy8gLTEuMTY3OCAqIDAuMDYyNSAgLSAwICogMC41ICAgICAgICAgLSAxLjY4MzUgKiAwLjUgICAgPSAtMC45MTQ3CisvLyAtMS4xNjc4ICogMC4wNjI1ICAtKC0wLjE4NzggKiAwLjUpICAtICgtMC42NTIyICogMC41KSA9IDAuMzQ3CisvLyAtMS4xNjc4ICogMC4wNjI1ICAtICgyLjE0NzlmICogMC41KSAtIDAgKiAwLjUgICAgICAgICA9IC0xLjE0NjkKIGNvbnN0IGZsb2F0IGsxMEJpdEJUMjAyMENvbG9yTWF0cml4WzE2XSA9IHsKLSAgICA2NCAqIDEuMTY3OGYsIDAuMGYsICAgICAgICAgIDY0ICogMS42ODM1ZiwgIC0wLjk2OTI1ZiwKLSAgICA2NCAqIDEuMTY3OGYsIDY0ICogLTAuMTg3OGYsIDY0ICogLTAuNjUyMmYsIDAuMzAwMjVmLAotICAgIDY0ICogMS4xNjc4ZiwgNjQgKiAyLjE0NzlmLCAgMC4wZiwgICAgICAgICAgLTEuMTI4NzVmLAorICAgIDY0ICogMS4xNjc4ZiwgMC4wZiwgICAgICAgICAgNjQgKiAxLjY4MzVmLCAgLTAuOTE0N2YsCisgICAgNjQgKiAxLjE2NzhmLCA2NCAqIC0wLjE4NzhmLCA2NCAqIC0wLjY1MjJmLCAwLjM0N2YsCisgICAgNjQgKiAxLjE2NzhmLCA2NCAqIDIuMTQ3OWYsICAwLjBmLCAgICAgICAgICAtMS4xNDY5ZiwKICAgICAwLjBmLCAgICAgICAgIDAuMGYsICAgICAgICAgIDAuMGYsICAgICAgICAgIDEuMGZ9OwogCiBjb25zdCBmbG9hdCogR2V0Q29sb3JNYXRyaXhGb3JJbWFnZVR5cGUoCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyLmd5cCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXIuZ3lwCmluZGV4IDg5ZDY4MDQuLmI5YjU5ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXIuZ3lwCkBAIC0xMDEsNyArMTAxLDYgQEAKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdyZW5kZXJfdHJlZV9waXhlbF90ZXN0ZXInLApAQCAtMTEyLDYgKzExMSw3IEBACiAgICAgICAgICAgJ2RlZmluZXMnIDogWydFTkFCTEVfTUFQX1RPX01FU0gnXSwKICAgICAgICAgfV0sCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ3JlbmRlcmVyX2NvcHlfdGVzdF9kYXRhJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX3V0aWxzLmd5cCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX3V0aWxzLmd5cAppbmRleCBkYmVhMTkwLi5mNTZkZGM2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ191dGlscy5neXAKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfdXRpbHMuZ3lwCkBAIC00NCwxMiArNDQsMTIgQEAKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdwbmdfdXRpbHMnLAogICAgICAgICAncG5nX3V0aWxzX2NvcHlfdGVzdF9kYXRhJywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAncG5nX3V0aWxzX2JlbmNobWFyaycsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NhbXBsZXMvc2ltcGxlX2V4YW1wbGUvc2ltcGxlX2V4YW1wbGUuZ3lwIGIvc3JjL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlL3NpbXBsZV9leGFtcGxlLmd5cAppbmRleCA1NTQ4ZmMyLi43YTYyMjZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NhbXBsZXMvc2ltcGxlX2V4YW1wbGUvc2ltcGxlX2V4YW1wbGUuZ3lwCisrKyBiL3NyYy9jb2JhbHQvc2FtcGxlcy9zaW1wbGVfZXhhbXBsZS9zaW1wbGVfZXhhbXBsZS5neXAKQEAgLTkxLDExICs5MSwxMSBAQAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ3NpbXBsZV9leGFtcGxlX2xpYicsCiAgICAgICAgICdzaW1wbGVfZXhhbXBsZV9jb3B5X3Rlc3RfZGF0YScsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAKICAgICAjIFRoaXMgdGFyZ2V0IGlzIG9wdGlvbmFsIGFuZCBpcyBvbmx5IG5lZWRlZCBpZiB0ZXN0cyBhcmUgdXNpbmcKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L2FycmF5X2J1ZmZlci5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvYXJyYXlfYnVmZmVyLmgKaW5kZXggODUwZmM1Mi4uZWI1YWNjZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvYXJyYXlfYnVmZmVyLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvYXJyYXlfYnVmZmVyLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9BUlJBWV9CVUZGRVJfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9BUlJBWV9CVUZGRVJfSF8KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKQEAgLTgxLDYgKzgyLDcgQEAKIC8vICAgRENIRUNLX0VRKGRhdGEuZGF0YSgpLCBudWxscHRyKTsKIGNsYXNzIFByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YSB7CiAgcHVibGljOgorICBQcmVhbGxvY2F0ZWRBcnJheUJ1ZmZlckRhdGEoKSA9IGRlZmF1bHQ7CiAgIGV4cGxpY2l0IFByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YShzaXplX3QgYnl0ZV9sZW5ndGgpOwogICB+UHJlYWxsb2NhdGVkQXJyYXlCdWZmZXJEYXRhKCk7CiAKQEAgLTg5LDggKzkxLDE3IEBACiAgICAgICBkZWZhdWx0OwogCiAgIHZvaWQqIGRhdGEoKSB7IHJldHVybiBkYXRhXzsgfQorICBjb25zdCB2b2lkKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gZGF0YV87IH0KICAgc2l6ZV90IGJ5dGVfbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gYnl0ZV9sZW5ndGhfOyB9CiAKKyAgdm9pZCBTd2FwKFByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YSogdGhhdCkgeworICAgIERDSEVDSyh0aGF0KTsKKworICAgIHN0ZDo6c3dhcChkYXRhXywgdGhhdC0+ZGF0YV8pOworICAgIHN0ZDo6c3dhcChieXRlX2xlbmd0aF8sIHRoYXQtPmJ5dGVfbGVuZ3RoXyk7CisgIH0KKyAgdm9pZCBSZXNpemUoc2l6ZV90IG5ld19ieXRlX2xlbmd0aCk7CisKICBwcml2YXRlOgogICBQcmVhbGxvY2F0ZWRBcnJheUJ1ZmZlckRhdGEoY29uc3QgUHJlYWxsb2NhdGVkQXJyYXlCdWZmZXJEYXRhJikgPSBkZWxldGU7CiAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YSYpID0gZGVsZXRlOwpAQCAtMTA2LDggKzExNyw4IEBACiAgICAgYnl0ZV9sZW5ndGhfID0gMHU7CiAgIH0KIAotICB2b2lkKiBkYXRhXzsKLSAgc2l6ZV90IGJ5dGVfbGVuZ3RoXzsKKyAgdm9pZCogZGF0YV8gPSBudWxscHRyOworICBzaXplX3QgYnl0ZV9sZW5ndGhfID0gMHU7CiAKICAgZnJpZW5kIEFycmF5QnVmZmVyOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2FycmF5X2J1ZmZlci5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2FycmF5X2J1ZmZlci5jYwppbmRleCAxZmE3YTQzLi43MTRhNTgyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19hcnJheV9idWZmZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfYXJyYXlfYnVmZmVyLmNjCkBAIC0xMiwxMSArMTIsMTMgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfYXJyYXlfYnVmZmVyLmgiCiAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2Ugc2NyaXB0IHsKQEAgLTM2LDYgKzM4LDIyIEBACiAgIH0KIH0KIAordm9pZCBQcmVhbGxvY2F0ZWRBcnJheUJ1ZmZlckRhdGE6OlJlc2l6ZShzaXplX3QgbmV3X2J5dGVfbGVuZ3RoKSB7CisgIGlmIChieXRlX2xlbmd0aF8gPT0gbmV3X2J5dGVfbGVuZ3RoKSB7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8gbmV3X2RhdGEgPSBqc19tYWxsb2MobmV3X2J5dGVfbGVuZ3RoKTsKKyAgRENIRUNLKG5ld19kYXRhKTsKKyAgaWYgKGRhdGFfKSB7CisgICAgaWYgKG5ld19kYXRhKSB7CisgICAgICBTYk1lbW9yeUNvcHkobmV3X2RhdGEsIGRhdGFfLCBzdGQ6Om1pbihieXRlX2xlbmd0aF8sIG5ld19ieXRlX2xlbmd0aCkpOworICAgIH0KKyAgICBqc19mcmVlKGRhdGFfKTsKKyAgfQorICBkYXRhXyA9IG5ld19kYXRhOworICBieXRlX2xlbmd0aF8gPSBuZXdfYnl0ZV9sZW5ndGg7Cit9CisKIC8vIHN0YXRpYwogSGFuZGxlPEFycmF5QnVmZmVyPiBBcnJheUJ1ZmZlcjo6TmV3KEdsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVfbGVuZ3RoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX2FycmF5X2J1ZmZlci5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfYXJyYXlfYnVmZmVyLmNjCmluZGV4IDEzMDg3YWYuLjdmZThiM2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfYXJyYXlfYnVmZmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfYXJyYXlfYnVmZmVyLmNjCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC92OGMvdjhjX2FycmF5X2J1ZmZlci5oIgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHNjcmlwdCB7CkBAIC0zNCw2ICszNSwxMSBAQAogICB9CiB9CiAKK3ZvaWQgUHJlYWxsb2NhdGVkQXJyYXlCdWZmZXJEYXRhOjpSZXNpemUoc2l6ZV90IG5ld19ieXRlX2xlbmd0aCkgeworICBkYXRhXyA9IFNiTWVtb3J5UmVhbGxvY2F0ZShkYXRhXywgbmV3X2J5dGVfbGVuZ3RoKTsKKyAgYnl0ZV9sZW5ndGhfID0gbmV3X2J5dGVfbGVuZ3RoOworfQorCiAvLyBzdGF0aWMKIEhhbmRsZTxBcnJheUJ1ZmZlcj4gQXJyYXlCdWZmZXI6Ok5ldyhHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlX2xlbmd0aCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19jYWxsYmFja19mdW5jdGlvbi5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19jYWxsYmFja19mdW5jdGlvbi5oCmluZGV4IGI5NTg0NTcuLmMwNjk3MjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfY2FsbGJhY2tfZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX2NhbGxiYWNrX2Z1bmN0aW9uLmgKQEAgLTIyLDYgKzIyLDggQEAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9WOENfVjhDX0NBTExCQUNLX0ZVTkNUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfVjhDX1Y4Q19DQUxMQkFDS19GVU5DVElPTl9IXwogCisjaW5jbHVkZSA8c3RyaW5nPgorCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvdjhjL2NvbnZlcnNpb25faGVscGVycy5oIgpAQCAtOTAsNiArOTIsNyBAQAogCiAgICAgRW50cnlTY29wZSBlbnRyeV9zY29wZShpc29sYXRlXyk7CiAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZV8tPkdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChpc29sYXRlXyk7CiAKICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvV2ViSURMLyNlcy1pbnZva2luZy1jYWxsYmFjay1mdW5jdGlvbnMKICAgICAvLyBDYWxsYmFjayAndGhpcycgaXMgc2V0IHRvIG51bGwsIHVubGVzcyBvdmVycmlkZGVuIGJ5IG90aGVyIHNwZWNpZmljYXRpb25zCkBAIC0xMTAsNyArMTEzLDE2IEBACiAgICAgICAgIGZ1bmN0aW9uX2FzX29iamVjdC0+Q2FsbEFzRnVuY3Rpb24oY29udGV4dCwgdGhpc192YWx1ZSwgYXJnYywgYXJndik7CiAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmV0dXJuX3ZhbHVlOwogICAgIGlmICghbWF5YmVfcmV0dXJuX3ZhbHVlLlRvTG9jYWwoJnJldHVybl92YWx1ZSkpIHsKLSAgICAgIE5PVElNUExFTUVOVEVEKCk7CisgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHN0YWNrOworICAgICAgaWYgKHRyeV9jYXRjaC5TdGFja1RyYWNlKGNvbnRleHQpLlRvTG9jYWwoJnN0YWNrKSkgeworICAgICAgICBkZXNjcmlwdGlvbiA9ICp2ODo6U3RyaW5nOjpVdGY4VmFsdWUoaXNvbGF0ZV8sIHN0YWNrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2NyaXB0aW9uID0gKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlXywgdHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKKyAgICAgIH0KKyAgICAgIGlmIChkZXNjcmlwdGlvbi5lbXB0eSgpKSBkZXNjcmlwdGlvbiA9ICJVbmtub3duIGV4Y2VwdGlvbiI7CisgICAgICAvLyBUT0RPOiBTZW5kIHRoZSBkZXNjcmlwdGlvbiB0byB0aGUgY29uc29sZSBpbnN0ZWFkIG9mIGxvZ2dpbmcgaXQuCisgICAgICBMT0coRVJST1IpIDw8IGRlc2NyaXB0aW9uOwogICAgICAgY2FsbGJhY2tfcmVzdWx0LmV4Y2VwdGlvbiA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdCA9IENvbnZlcnRDYWxsYmFja1JldHVyblZhbHVlPFI+KGlzb2xhdGVfLCByZXR1cm5fdmFsdWUpOwpAQCAtMTMzLDggKzE0NSw3IEBACiAgIFY4Y0NhbGxiYWNrRnVuY3Rpb24odjg6Oklzb2xhdGUqIGlzb2xhdGUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhhbmRsZSkKICAgICAgIDogU2NvcGVkUGVyc2lzdGVudChpc29sYXRlLCBoYW5kbGUpLCBpc29sYXRlXyhpc29sYXRlKSB7fQogCi0gIENhbGxiYWNrUmVzdWx0PFI+IFJ1biggICAgICB0eXBlbmFtZQotICAgICAgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExKQorICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4odHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExKQogICAgICAgY29uc3Qgb3ZlcnJpZGUgewogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBEQ0hFQ0soIXRoaXMtPklzRW1wdHkoKSk7CkBAIC0xNDYsNiArMTU3LDcgQEAKIAogICAgIEVudHJ5U2NvcGUgZW50cnlfc2NvcGUoaXNvbGF0ZV8pOwogICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGVfLT5HZXRDdXJyZW50Q29udGV4dCgpOworICAgIHY4OjpUcnlDYXRjaCB0cnlfY2F0Y2goaXNvbGF0ZV8pOwogCiAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1dlYklETC8jZXMtaW52b2tpbmctY2FsbGJhY2stZnVuY3Rpb25zCiAgICAgLy8gQ2FsbGJhY2sgJ3RoaXMnIGlzIHNldCB0byBudWxsLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBvdGhlciBzcGVjaWZpY2F0aW9ucwpAQCAtMTY4LDcgKzE4MCwxNiBAQAogICAgICAgICBmdW5jdGlvbl9hc19vYmplY3QtPkNhbGxBc0Z1bmN0aW9uKGNvbnRleHQsIHRoaXNfdmFsdWUsIGFyZ2MsIGFyZ3YpOwogICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJldHVybl92YWx1ZTsKICAgICBpZiAoIW1heWJlX3JldHVybl92YWx1ZS5Ub0xvY2FsKCZyZXR1cm5fdmFsdWUpKSB7Ci0gICAgICBOT1RJTVBMRU1FTlRFRCgpOworICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBzdGFjazsKKyAgICAgIGlmICh0cnlfY2F0Y2guU3RhY2tUcmFjZShjb250ZXh0KS5Ub0xvY2FsKCZzdGFjaykpIHsKKyAgICAgICAgZGVzY3JpcHRpb24gPSAqdjg6OlN0cmluZzo6VXRmOFZhbHVlKGlzb2xhdGVfLCBzdGFjayk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXNjcmlwdGlvbiA9ICp2ODo6U3RyaW5nOjpVdGY4VmFsdWUoaXNvbGF0ZV8sIHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CisgICAgICB9CisgICAgICBpZiAoZGVzY3JpcHRpb24uZW1wdHkoKSkgZGVzY3JpcHRpb24gPSAiVW5rbm93biBleGNlcHRpb24iOworICAgICAgLy8gVE9ETzogU2VuZCB0aGUgZGVzY3JpcHRpb24gdG8gdGhlIGNvbnNvbGUgaW5zdGVhZCBvZiBsb2dnaW5nIGl0LgorICAgICAgTE9HKEVSUk9SKSA8PCBkZXNjcmlwdGlvbjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICBjYWxsYmFja19yZXN1bHQgPSBDb252ZXJ0Q2FsbGJhY2tSZXR1cm5WYWx1ZTxSPihpc29sYXRlXywgcmV0dXJuX3ZhbHVlKTsKQEAgLTE5MSw4ICsyMTIsNyBAQAogICBWOGNDYWxsYmFja0Z1bmN0aW9uKHY4OjpJc29sYXRlKiBpc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBoYW5kbGUpCiAgICAgICA6IFNjb3BlZFBlcnNpc3RlbnQoaXNvbGF0ZSwgaGFuZGxlKSwgaXNvbGF0ZV8oaXNvbGF0ZSkge30KIAotICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oICAgICAgdHlwZW5hbWUKLSAgICAgIENhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKKyAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKICAgICAgIHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTI+OjpGb3J3YXJkVHlwZSBhMikKICAgICAgIGNvbnN0IG92ZXJyaWRlIHsKICAgICBDYWxsYmFja1Jlc3VsdDxSPiBjYWxsYmFja19yZXN1bHQ7CkBAIC0yMDUsNiArMjI1LDcgQEAKIAogICAgIEVudHJ5U2NvcGUgZW50cnlfc2NvcGUoaXNvbGF0ZV8pOwogICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGVfLT5HZXRDdXJyZW50Q29udGV4dCgpOworICAgIHY4OjpUcnlDYXRjaCB0cnlfY2F0Y2goaXNvbGF0ZV8pOwogCiAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1dlYklETC8jZXMtaW52b2tpbmctY2FsbGJhY2stZnVuY3Rpb25zCiAgICAgLy8gQ2FsbGJhY2sgJ3RoaXMnIGlzIHNldCB0byBudWxsLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBvdGhlciBzcGVjaWZpY2F0aW9ucwpAQCAtMjI4LDcgKzI0OSwxNiBAQAogICAgICAgICBmdW5jdGlvbl9hc19vYmplY3QtPkNhbGxBc0Z1bmN0aW9uKGNvbnRleHQsIHRoaXNfdmFsdWUsIGFyZ2MsIGFyZ3YpOwogICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJldHVybl92YWx1ZTsKICAgICBpZiAoIW1heWJlX3JldHVybl92YWx1ZS5Ub0xvY2FsKCZyZXR1cm5fdmFsdWUpKSB7Ci0gICAgICBOT1RJTVBMRU1FTlRFRCgpOworICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBzdGFjazsKKyAgICAgIGlmICh0cnlfY2F0Y2guU3RhY2tUcmFjZShjb250ZXh0KS5Ub0xvY2FsKCZzdGFjaykpIHsKKyAgICAgICAgZGVzY3JpcHRpb24gPSAqdjg6OlN0cmluZzo6VXRmOFZhbHVlKGlzb2xhdGVfLCBzdGFjayk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXNjcmlwdGlvbiA9ICp2ODo6U3RyaW5nOjpVdGY4VmFsdWUoaXNvbGF0ZV8sIHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CisgICAgICB9CisgICAgICBpZiAoZGVzY3JpcHRpb24uZW1wdHkoKSkgZGVzY3JpcHRpb24gPSAiVW5rbm93biBleGNlcHRpb24iOworICAgICAgLy8gVE9ETzogU2VuZCB0aGUgZGVzY3JpcHRpb24gdG8gdGhlIGNvbnNvbGUgaW5zdGVhZCBvZiBsb2dnaW5nIGl0LgorICAgICAgTE9HKEVSUk9SKSA8PCBkZXNjcmlwdGlvbjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICBjYWxsYmFja19yZXN1bHQgPSBDb252ZXJ0Q2FsbGJhY2tSZXR1cm5WYWx1ZTxSPihpc29sYXRlXywgcmV0dXJuX3ZhbHVlKTsKQEAgLTI1MSw4ICsyODEsNyBAQAogICBWOGNDYWxsYmFja0Z1bmN0aW9uKHY4OjpJc29sYXRlKiBpc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBoYW5kbGUpCiAgICAgICA6IFNjb3BlZFBlcnNpc3RlbnQoaXNvbGF0ZSwgaGFuZGxlKSwgaXNvbGF0ZV8oaXNvbGF0ZSkge30KIAotICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oICAgICAgdHlwZW5hbWUKLSAgICAgIENhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKKyAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKICAgICAgIHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTI+OjpGb3J3YXJkVHlwZSBhMiwKICAgICAgIHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTM+OjpGb3J3YXJkVHlwZSBhMykKICAgICAgIGNvbnN0IG92ZXJyaWRlIHsKQEAgLTI2Niw2ICsyOTUsNyBAQAogCiAgICAgRW50cnlTY29wZSBlbnRyeV9zY29wZShpc29sYXRlXyk7CiAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZV8tPkdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChpc29sYXRlXyk7CiAKICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvV2ViSURMLyNlcy1pbnZva2luZy1jYWxsYmFjay1mdW5jdGlvbnMKICAgICAvLyBDYWxsYmFjayAndGhpcycgaXMgc2V0IHRvIG51bGwsIHVubGVzcyBvdmVycmlkZGVuIGJ5IG90aGVyIHNwZWNpZmljYXRpb25zCkBAIC0yOTAsNyArMzIwLDE2IEBACiAgICAgICAgIGZ1bmN0aW9uX2FzX29iamVjdC0+Q2FsbEFzRnVuY3Rpb24oY29udGV4dCwgdGhpc192YWx1ZSwgYXJnYywgYXJndik7CiAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmV0dXJuX3ZhbHVlOwogICAgIGlmICghbWF5YmVfcmV0dXJuX3ZhbHVlLlRvTG9jYWwoJnJldHVybl92YWx1ZSkpIHsKLSAgICAgIE5PVElNUExFTUVOVEVEKCk7CisgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHN0YWNrOworICAgICAgaWYgKHRyeV9jYXRjaC5TdGFja1RyYWNlKGNvbnRleHQpLlRvTG9jYWwoJnN0YWNrKSkgeworICAgICAgICBkZXNjcmlwdGlvbiA9ICp2ODo6U3RyaW5nOjpVdGY4VmFsdWUoaXNvbGF0ZV8sIHN0YWNrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2NyaXB0aW9uID0gKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlXywgdHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKKyAgICAgIH0KKyAgICAgIGlmIChkZXNjcmlwdGlvbi5lbXB0eSgpKSBkZXNjcmlwdGlvbiA9ICJVbmtub3duIGV4Y2VwdGlvbiI7CisgICAgICAvLyBUT0RPOiBTZW5kIHRoZSBkZXNjcmlwdGlvbiB0byB0aGUgY29uc29sZSBpbnN0ZWFkIG9mIGxvZ2dpbmcgaXQuCisgICAgICBMT0coRVJST1IpIDw8IGRlc2NyaXB0aW9uOwogICAgICAgY2FsbGJhY2tfcmVzdWx0LmV4Y2VwdGlvbiA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdCA9IENvbnZlcnRDYWxsYmFja1JldHVyblZhbHVlPFI+KGlzb2xhdGVfLCByZXR1cm5fdmFsdWUpOwpAQCAtMzEzLDggKzM1Miw3IEBACiAgIFY4Y0NhbGxiYWNrRnVuY3Rpb24odjg6Oklzb2xhdGUqIGlzb2xhdGUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhhbmRsZSkKICAgICAgIDogU2NvcGVkUGVyc2lzdGVudChpc29sYXRlLCBoYW5kbGUpLCBpc29sYXRlXyhpc29sYXRlKSB7fQogCi0gIENhbGxiYWNrUmVzdWx0PFI+IFJ1biggICAgICB0eXBlbmFtZQotICAgICAgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAorICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4odHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAogICAgICAgdHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMj46OkZvcndhcmRUeXBlIGEyLAogICAgICAgdHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMz46OkZvcndhcmRUeXBlIGEzLAogICAgICAgdHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBND46OkZvcndhcmRUeXBlIGE0KQpAQCAtMzI5LDYgKzM2Nyw3IEBACiAKICAgICBFbnRyeVNjb3BlIGVudHJ5X3Njb3BlKGlzb2xhdGVfKTsKICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlXy0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgICB2ODo6VHJ5Q2F0Y2ggdHJ5X2NhdGNoKGlzb2xhdGVfKTsKIAogICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XZWJJREwvI2VzLWludm9raW5nLWNhbGxiYWNrLWZ1bmN0aW9ucwogICAgIC8vIENhbGxiYWNrICd0aGlzJyBpcyBzZXQgdG8gbnVsbCwgdW5sZXNzIG92ZXJyaWRkZW4gYnkgb3RoZXIgc3BlY2lmaWNhdGlvbnMKQEAgLTM1NCw3ICszOTMsMTYgQEAKICAgICAgICAgZnVuY3Rpb25fYXNfb2JqZWN0LT5DYWxsQXNGdW5jdGlvbihjb250ZXh0LCB0aGlzX3ZhbHVlLCBhcmdjLCBhcmd2KTsKICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXR1cm5fdmFsdWU7CiAgICAgaWYgKCFtYXliZV9yZXR1cm5fdmFsdWUuVG9Mb2NhbCgmcmV0dXJuX3ZhbHVlKSkgewotICAgICAgTk9USU1QTEVNRU5URUQoKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gc3RhY2s7CisgICAgICBpZiAodHJ5X2NhdGNoLlN0YWNrVHJhY2UoY29udGV4dCkuVG9Mb2NhbCgmc3RhY2spKSB7CisgICAgICAgIGRlc2NyaXB0aW9uID0gKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlXywgc3RhY2spOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRpb24gPSAqdjg6OlN0cmluZzo6VXRmOFZhbHVlKGlzb2xhdGVfLCB0cnlfY2F0Y2guRXhjZXB0aW9uKCkpOworICAgICAgfQorICAgICAgaWYgKGRlc2NyaXB0aW9uLmVtcHR5KCkpIGRlc2NyaXB0aW9uID0gIlVua25vd24gZXhjZXB0aW9uIjsKKyAgICAgIC8vIFRPRE86IFNlbmQgdGhlIGRlc2NyaXB0aW9uIHRvIHRoZSBjb25zb2xlIGluc3RlYWQgb2YgbG9nZ2luZyBpdC4KKyAgICAgIExPRyhFUlJPUikgPDwgZGVzY3JpcHRpb247CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgY2FsbGJhY2tfcmVzdWx0ID0gQ29udmVydENhbGxiYWNrUmV0dXJuVmFsdWU8Uj4oaXNvbGF0ZV8sIHJldHVybl92YWx1ZSk7CkBAIC0zNzgsOCArNDI2LDcgQEAKICAgVjhjQ2FsbGJhY2tGdW5jdGlvbih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaGFuZGxlKQogICAgICAgOiBTY29wZWRQZXJzaXN0ZW50KGlzb2xhdGUsIGhhbmRsZSksIGlzb2xhdGVfKGlzb2xhdGUpIHt9CiAKLSAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKCAgICAgIHR5cGVuYW1lCi0gICAgICBDYWxsYmFja1BhcmFtVHJhaXRzPEExPjo6Rm9yd2FyZFR5cGUgYTEsCisgIENhbGxiYWNrUmVzdWx0PFI+IFJ1bih0eXBlbmFtZSBDYWxsYmFja1BhcmFtVHJhaXRzPEExPjo6Rm9yd2FyZFR5cGUgYTEsCiAgICAgICB0eXBlbmFtZSBDYWxsYmFja1BhcmFtVHJhaXRzPEEyPjo6Rm9yd2FyZFR5cGUgYTIsCiAgICAgICB0eXBlbmFtZSBDYWxsYmFja1BhcmFtVHJhaXRzPEEzPjo6Rm9yd2FyZFR5cGUgYTMsCiAgICAgICB0eXBlbmFtZSBDYWxsYmFja1BhcmFtVHJhaXRzPEE0Pjo6Rm9yd2FyZFR5cGUgYTQsCkBAIC0zOTUsNiArNDQyLDcgQEAKIAogICAgIEVudHJ5U2NvcGUgZW50cnlfc2NvcGUoaXNvbGF0ZV8pOwogICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGVfLT5HZXRDdXJyZW50Q29udGV4dCgpOworICAgIHY4OjpUcnlDYXRjaCB0cnlfY2F0Y2goaXNvbGF0ZV8pOwogCiAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1dlYklETC8jZXMtaW52b2tpbmctY2FsbGJhY2stZnVuY3Rpb25zCiAgICAgLy8gQ2FsbGJhY2sgJ3RoaXMnIGlzIHNldCB0byBudWxsLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBvdGhlciBzcGVjaWZpY2F0aW9ucwpAQCAtNDIxLDcgKzQ2OSwxNiBAQAogICAgICAgICBmdW5jdGlvbl9hc19vYmplY3QtPkNhbGxBc0Z1bmN0aW9uKGNvbnRleHQsIHRoaXNfdmFsdWUsIGFyZ2MsIGFyZ3YpOwogICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJldHVybl92YWx1ZTsKICAgICBpZiAoIW1heWJlX3JldHVybl92YWx1ZS5Ub0xvY2FsKCZyZXR1cm5fdmFsdWUpKSB7Ci0gICAgICBOT1RJTVBMRU1FTlRFRCgpOworICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBzdGFjazsKKyAgICAgIGlmICh0cnlfY2F0Y2guU3RhY2tUcmFjZShjb250ZXh0KS5Ub0xvY2FsKCZzdGFjaykpIHsKKyAgICAgICAgZGVzY3JpcHRpb24gPSAqdjg6OlN0cmluZzo6VXRmOFZhbHVlKGlzb2xhdGVfLCBzdGFjayk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXNjcmlwdGlvbiA9ICp2ODo6U3RyaW5nOjpVdGY4VmFsdWUoaXNvbGF0ZV8sIHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CisgICAgICB9CisgICAgICBpZiAoZGVzY3JpcHRpb24uZW1wdHkoKSkgZGVzY3JpcHRpb24gPSAiVW5rbm93biBleGNlcHRpb24iOworICAgICAgLy8gVE9ETzogU2VuZCB0aGUgZGVzY3JpcHRpb24gdG8gdGhlIGNvbnNvbGUgaW5zdGVhZCBvZiBsb2dnaW5nIGl0LgorICAgICAgTE9HKEVSUk9SKSA8PCBkZXNjcmlwdGlvbjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICBjYWxsYmFja19yZXN1bHQgPSBDb252ZXJ0Q2FsbGJhY2tSZXR1cm5WYWx1ZTxSPihpc29sYXRlXywgcmV0dXJuX3ZhbHVlKTsKQEAgLTQ0NSw4ICs1MDIsNyBAQAogICBWOGNDYWxsYmFja0Z1bmN0aW9uKHY4OjpJc29sYXRlKiBpc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBoYW5kbGUpCiAgICAgICA6IFNjb3BlZFBlcnNpc3RlbnQoaXNvbGF0ZSwgaGFuZGxlKSwgaXNvbGF0ZV8oaXNvbGF0ZSkge30KIAotICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oICAgICAgdHlwZW5hbWUKLSAgICAgIENhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKKyAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKICAgICAgIHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTI+OjpGb3J3YXJkVHlwZSBhMiwKICAgICAgIHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTM+OjpGb3J3YXJkVHlwZSBhMywKICAgICAgIHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QTQ+OjpGb3J3YXJkVHlwZSBhNCwKQEAgLTQ2Myw2ICs1MTksNyBAQAogCiAgICAgRW50cnlTY29wZSBlbnRyeV9zY29wZShpc29sYXRlXyk7CiAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZV8tPkdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChpc29sYXRlXyk7CiAKICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvV2ViSURMLyNlcy1pbnZva2luZy1jYWxsYmFjay1mdW5jdGlvbnMKICAgICAvLyBDYWxsYmFjayAndGhpcycgaXMgc2V0IHRvIG51bGwsIHVubGVzcyBvdmVycmlkZGVuIGJ5IG90aGVyIHNwZWNpZmljYXRpb25zCkBAIC00OTAsNyArNTQ3LDE2IEBACiAgICAgICAgIGZ1bmN0aW9uX2FzX29iamVjdC0+Q2FsbEFzRnVuY3Rpb24oY29udGV4dCwgdGhpc192YWx1ZSwgYXJnYywgYXJndik7CiAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmV0dXJuX3ZhbHVlOwogICAgIGlmICghbWF5YmVfcmV0dXJuX3ZhbHVlLlRvTG9jYWwoJnJldHVybl92YWx1ZSkpIHsKLSAgICAgIE5PVElNUExFTUVOVEVEKCk7CisgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHN0YWNrOworICAgICAgaWYgKHRyeV9jYXRjaC5TdGFja1RyYWNlKGNvbnRleHQpLlRvTG9jYWwoJnN0YWNrKSkgeworICAgICAgICBkZXNjcmlwdGlvbiA9ICp2ODo6U3RyaW5nOjpVdGY4VmFsdWUoaXNvbGF0ZV8sIHN0YWNrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2NyaXB0aW9uID0gKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlXywgdHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKKyAgICAgIH0KKyAgICAgIGlmIChkZXNjcmlwdGlvbi5lbXB0eSgpKSBkZXNjcmlwdGlvbiA9ICJVbmtub3duIGV4Y2VwdGlvbiI7CisgICAgICAvLyBUT0RPOiBTZW5kIHRoZSBkZXNjcmlwdGlvbiB0byB0aGUgY29uc29sZSBpbnN0ZWFkIG9mIGxvZ2dpbmcgaXQuCisgICAgICBMT0coRVJST1IpIDw8IGRlc2NyaXB0aW9uOwogICAgICAgY2FsbGJhY2tfcmVzdWx0LmV4Y2VwdGlvbiA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdCA9IENvbnZlcnRDYWxsYmFja1JldHVyblZhbHVlPFI+KGlzb2xhdGVfLCByZXR1cm5fdmFsdWUpOwpAQCAtNTE0LDggKzU4MCw3IEBACiAgIFY4Y0NhbGxiYWNrRnVuY3Rpb24odjg6Oklzb2xhdGUqIGlzb2xhdGUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhhbmRsZSkKICAgICAgIDogU2NvcGVkUGVyc2lzdGVudChpc29sYXRlLCBoYW5kbGUpLCBpc29sYXRlXyhpc29sYXRlKSB7fQogCi0gIENhbGxiYWNrUmVzdWx0PFI+IFJ1biggICAgICB0eXBlbmFtZQotICAgICAgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAorICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4odHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAogICAgICAgdHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMj46OkZvcndhcmRUeXBlIGEyLAogICAgICAgdHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBMz46OkZvcndhcmRUeXBlIGEzLAogICAgICAgdHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBND46OkZvcndhcmRUeXBlIGE0LApAQCAtNTMzLDYgKzU5OCw3IEBACiAKICAgICBFbnRyeVNjb3BlIGVudHJ5X3Njb3BlKGlzb2xhdGVfKTsKICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlXy0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgICB2ODo6VHJ5Q2F0Y2ggdHJ5X2NhdGNoKGlzb2xhdGVfKTsKIAogICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XZWJJREwvI2VzLWludm9raW5nLWNhbGxiYWNrLWZ1bmN0aW9ucwogICAgIC8vIENhbGxiYWNrICd0aGlzJyBpcyBzZXQgdG8gbnVsbCwgdW5sZXNzIG92ZXJyaWRkZW4gYnkgb3RoZXIgc3BlY2lmaWNhdGlvbnMKQEAgLTU2MSw3ICs2MjcsMTYgQEAKICAgICAgICAgZnVuY3Rpb25fYXNfb2JqZWN0LT5DYWxsQXNGdW5jdGlvbihjb250ZXh0LCB0aGlzX3ZhbHVlLCBhcmdjLCBhcmd2KTsKICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXR1cm5fdmFsdWU7CiAgICAgaWYgKCFtYXliZV9yZXR1cm5fdmFsdWUuVG9Mb2NhbCgmcmV0dXJuX3ZhbHVlKSkgewotICAgICAgTk9USU1QTEVNRU5URUQoKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gc3RhY2s7CisgICAgICBpZiAodHJ5X2NhdGNoLlN0YWNrVHJhY2UoY29udGV4dCkuVG9Mb2NhbCgmc3RhY2spKSB7CisgICAgICAgIGRlc2NyaXB0aW9uID0gKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlXywgc3RhY2spOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRpb24gPSAqdjg6OlN0cmluZzo6VXRmOFZhbHVlKGlzb2xhdGVfLCB0cnlfY2F0Y2guRXhjZXB0aW9uKCkpOworICAgICAgfQorICAgICAgaWYgKGRlc2NyaXB0aW9uLmVtcHR5KCkpIGRlc2NyaXB0aW9uID0gIlVua25vd24gZXhjZXB0aW9uIjsKKyAgICAgIC8vIFRPRE86IFNlbmQgdGhlIGRlc2NyaXB0aW9uIHRvIHRoZSBjb25zb2xlIGluc3RlYWQgb2YgbG9nZ2luZyBpdC4KKyAgICAgIExPRyhFUlJPUikgPDwgZGVzY3JpcHRpb247CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgY2FsbGJhY2tfcmVzdWx0ID0gQ29udmVydENhbGxiYWNrUmV0dXJuVmFsdWU8Uj4oaXNvbGF0ZV8sIHJldHVybl92YWx1ZSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX2NhbGxiYWNrX2Z1bmN0aW9uLmgucHVtcCBiL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfY2FsbGJhY2tfZnVuY3Rpb24uaC5wdW1wCmluZGV4IDQyYzlmZmIuLjhiZjhjZDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfY2FsbGJhY2tfZnVuY3Rpb24uaC5wdW1wCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfY2FsbGJhY2tfZnVuY3Rpb24uaC5wdW1wCkBAIC0yNyw2ICsyNyw4IEBACiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfVjhDX1Y4Q19DQUxMQkFDS19GVU5DVElPTl9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX1Y4Q19WOENfQ0FMTEJBQ0tfRlVOQ1RJT05fSF8KIAorI2luY2x1ZGUgPHN0cmluZz4KKwogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Y4Yy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKQEAgLTk1LDggKzk3LDggQEAKICAgVjhjQ2FsbGJhY2tGdW5jdGlvbih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaGFuZGxlKQogICAgICAgOiBTY29wZWRQZXJzaXN0ZW50KGlzb2xhdGUsIGhhbmRsZSksIGlzb2xhdGVfKGlzb2xhdGUpIHt9CiAKLSAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKCRmb3IgQVJHICwgW1sKLSAgICAgIHR5cGVuYW1lIENhbGxiYWNrUGFyYW1UcmFpdHM8QSQoQVJHKT46OkZvcndhcmRUeXBlIGEkKEFSRyldXSkKKyAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKCRmb3IgQVJHICwKKyAgICAgIFtbdHlwZW5hbWUgQ2FsbGJhY2tQYXJhbVRyYWl0czxBJChBUkcpPjo6Rm9yd2FyZFR5cGUgYSQoQVJHKV1dKQogICAgICAgY29uc3Qgb3ZlcnJpZGUgewogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBEQ0hFQ0soIXRoaXMtPklzRW1wdHkoKSk7CkBAIC0xMDgsNiArMTEwLDcgQEAKIAogICAgIEVudHJ5U2NvcGUgZW50cnlfc2NvcGUoaXNvbGF0ZV8pOwogICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGVfLT5HZXRDdXJyZW50Q29udGV4dCgpOworICAgIHY4OjpUcnlDYXRjaCB0cnlfY2F0Y2goaXNvbGF0ZV8pOwogCiAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1dlYklETC8jZXMtaW52b2tpbmctY2FsbGJhY2stZnVuY3Rpb25zCiAgICAgLy8gQ2FsbGJhY2sgJ3RoaXMnIGlzIHNldCB0byBudWxsLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBvdGhlciBzcGVjaWZpY2F0aW9ucwpAQCAtMTM0LDcgKzEzNywxNiBAQAogICAgIHY4OjpNYXliZUxvY2FsPHY4OjpWYWx1ZT4gbWF5YmVfcmV0dXJuX3ZhbHVlID0gZnVuY3Rpb25fYXNfb2JqZWN0LT5DYWxsQXNGdW5jdGlvbihjb250ZXh0LCB0aGlzX3ZhbHVlLCBhcmdjLCBhcmd2KTsKICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXR1cm5fdmFsdWU7CiAgICAgaWYgKCFtYXliZV9yZXR1cm5fdmFsdWUuVG9Mb2NhbCgmcmV0dXJuX3ZhbHVlKSkgewotICAgICAgTk9USU1QTEVNRU5URUQoKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gc3RhY2s7CisgICAgICBpZiAodHJ5X2NhdGNoLlN0YWNrVHJhY2UoY29udGV4dCkuVG9Mb2NhbCgmc3RhY2spKSB7CisgICAgICAgIGRlc2NyaXB0aW9uID0gKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlXywgc3RhY2spOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRpb24gPSAqdjg6OlN0cmluZzo6VXRmOFZhbHVlKGlzb2xhdGVfLCB0cnlfY2F0Y2guRXhjZXB0aW9uKCkpOworICAgICAgfQorICAgICAgaWYgKGRlc2NyaXB0aW9uLmVtcHR5KCkpIGRlc2NyaXB0aW9uID0gIlVua25vd24gZXhjZXB0aW9uIjsKKyAgICAgIC8vIFRPRE86IFNlbmQgdGhlIGRlc2NyaXB0aW9uIHRvIHRoZSBjb25zb2xlIGluc3RlYWQgb2YgbG9nZ2luZyBpdC4KKyAgICAgIExPRyhFUlJPUikgPDwgZGVzY3JpcHRpb247CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgY2FsbGJhY2tfcmVzdWx0ID0gQ29udmVydENhbGxiYWNrUmV0dXJuVmFsdWU8Uj4oaXNvbGF0ZV8sIHJldHVybl92YWx1ZSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3BlZWNoX3NlcnZpY2UuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3BlZWNoX3NlcnZpY2UuY2MKaW5kZXggMjMxYmYwNi4uMzBkNzQ2MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3NwZWVjaF9zZXJ2aWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5jYwpAQCAtMjI5LDE4ICsyMjksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19sYXN0X2NodW5rKSk7CiB9CiAKKy8vIFRPRE86IFJlZmFjdG9yIE9uVVJMRmV0Y2hEb3dubG9hZFByb2dyZXNzKCkgaW50byBhIHByaXZhdGUgZnVuY3Rpb24gdGhhdCBpcworLy8gICAgICAgY2FsbGVkIGJ5IE9uVVJMRmV0Y2hEb3dubG9hZFByb2dyZXNzKCkgYW5kIE9uVVJMRmV0Y2hDb21wbGV0ZSgpLCB0bworLy8gICAgICAgZXhwbGljaXRseSByZW1vdmUgdGhlIHVucmVmZXJlbmNlZCBwYXJhbWV0ZXJzLgogdm9pZCBHb29nbGVTcGVlY2hTZXJ2aWNlOjpPblVSTEZldGNoRG93bmxvYWRQcm9ncmVzcygKICAgICBjb25zdCBuZXQ6OlVSTEZldGNoZXIqIHNvdXJjZSwgaW50NjRfdCAvKmN1cnJlbnQqLywgaW50NjRfdCAvKnRvdGFsKi8sCiAgICAgaW50NjRfdCAvKmN1cnJlbnRfbmV0d29ya19ieXRlcyovKSB7CiAgIERDSEVDS19FUSh0aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiBkYXRhID0gZG93bmxvYWRfZGF0YV93cml0ZXJfLT5kYXRhKCk7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIGRvd25sb2FkX2RhdGFfd3JpdGVyXy0+R2V0QW5kUmVzZXREYXRhKCZkYXRhKTsKIAogICBjb25zdCBuZXQ6OlVSTFJlcXVlc3RTdGF0dXMmIHN0YXR1cyA9IHNvdXJjZS0+R2V0U3RhdHVzKCk7CiAgIGNvbnN0IGludCByZXNwb25zZV9jb2RlID0gc291cmNlLT5HZXRSZXNwb25zZUNvZGUoKTsKIAogICBpZiAoc291cmNlID09IGRvd25zdHJlYW1fZmV0Y2hlcl8uZ2V0KCkpIHsKICAgICBpZiAoc3RhdHVzLmlzX3N1Y2Nlc3MoKSAmJiBJc1Jlc3BvbnNlQ29kZVN1Y2Nlc3MocmVzcG9uc2VfY29kZSkpIHsKLSAgICAgIGNodW5rZWRfYnl0ZV9idWZmZXJfLkFwcGVuZCgqZGF0YSk7CisgICAgICBjaHVua2VkX2J5dGVfYnVmZmVyXy5BcHBlbmQoZGF0YSk7CiAgICAgICB3aGlsZSAoY2h1bmtlZF9ieXRlX2J1ZmZlcl8uSGFzQ2h1bmtzKCkpIHsKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gY2h1bmsgPQogICAgICAgICAgICAgY2h1bmtlZF9ieXRlX2J1ZmZlcl8uUG9wQ2h1bmsoKTsKQEAgLTI3MiwxMiArMjc2LDExIEBACiAKIHZvaWQgR29vZ2xlU3BlZWNoU2VydmljZTo6T25VUkxGZXRjaENvbXBsZXRlKGNvbnN0IG5ldDo6VVJMRmV0Y2hlciogc291cmNlKSB7CiAgIERDSEVDS19FUSh0aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiByZW1haW5pbmdfZGF0YSA9IGRvd25sb2FkX2RhdGFfd3JpdGVyXy0+ZGF0YSgpOwotICBpbnQ2NF90IGxlbmd0aCA9IHJlbWFpbmluZ19kYXRhLT5sZW5ndGgoKTsKLSAgaWYgKHJlbWFpbmluZ19kYXRhICYmIGxlbmd0aCA+IDApIHsKLSAgICBPblVSTEZldGNoRG93bmxvYWRQcm9ncmVzcyhzb3VyY2UsIGxlbmd0aCwgbGVuZ3RoLCBsZW5ndGgpOworICBpZiAoZG93bmxvYWRfZGF0YV93cml0ZXJfLT5IYXNEYXRhKCkpIHsKKyAgICAvLyBFeHBsaWNpdGx5IHBhc3MgJy0xJyBmb3IgYWxsIHNpemVzLCBhcyBpdCBpcyBub3QgdXNlZCBieQorICAgIC8vIE9uVVJMRmV0Y2hEb3dubG9hZFByb2dyZXNzKCk7CisgICAgT25VUkxGZXRjaERvd25sb2FkUHJvZ3Jlc3Moc291cmNlLCAtMSwgLTEsIC0xKTsKICAgfQotICAvLyBuby1vcC4KIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3BlZWNoX3NlcnZpY2UuaCBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5oCmluZGV4IGE2OWZmOWQuLjM3Njg2MzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5oCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5oCkBAIC02OCw3ICs2OCw3IEBACiAKICAgLy8gbmV0OjpVUkxGZXRjaGVyRGVsZWdhdGUgaW50ZXJmYWNlCiAgIHZvaWQgT25VUkxGZXRjaERvd25sb2FkUHJvZ3Jlc3MoY29uc3QgbmV0OjpVUkxGZXRjaGVyKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50LCBpbnQ2NF90IHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLypjdXJyZW50Ki8sIGludDY0X3QgLyp0b3RhbCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLypjdXJyZW50X25ldHdvcmtfYnl0ZXMqLykgb3ZlcnJpZGU7CiAgIHZvaWQgT25VUkxGZXRjaENvbXBsZXRlKGNvbnN0IG5ldDo6VVJMRmV0Y2hlciogc291cmNlKSBvdmVycmlkZTsKICAgdm9pZCBPblVSTEZldGNoVXBsb2FkUHJvZ3Jlc3MoY29uc3QgbmV0OjpVUkxGZXRjaGVyKiAvKnNvdXJjZSovLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2UuZ3lwIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2UuZ3lwCmluZGV4IDliNzc1NzguLjk2ZWE3YmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlLmd5cAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZS5neXAKQEAgLTU1LDEyICs1NSwxMiBAQAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ3N0b3JhZ2UnLAogICAgICAgICAnc3RvcmFnZV91cGdyYWRlX2NvcHlfdGVzdF9kYXRhJywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnc3RvcmFnZV90ZXN0X2RlcGxveScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmUuZ3lwIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlL3N0b3JlLmd5cAppbmRleCBkODBhODc2Li4xY2Y5ZmM0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmUuZ3lwCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yZS5neXAKQEAgLTM5LDExICszOSwxMSBAQAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ21lbW9yeV9zdG9yZScsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ21lbW9yeV9zdG9yZV90ZXN0X2RlcGxveScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS91cGdyYWRlLmd5cCBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuZ3lwCmluZGV4IDEwNjZmMWEuLjIzYTE5NmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuZ3lwCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuZ3lwCkBAIC00OCwxMSArNDgsMTEgQEAKICAgICAgICAgJ3N0b3JhZ2VfdXBncmFkZScsCiAgICAgICAgICdzdG9yYWdlX3VwZ3JhZGVfY29weV90ZXN0X2ZpbGVzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWYuZ3lwOnByb3RvYnVmX2xpdGUnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdzdG9yYWdlX3VwZ3JhZGVfdGVzdF9kZXBsb3knLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90ZXN0L3J1bl9hbGxfdW5pdHRlc3RzLmNjIGIvc3JjL2NvYmFsdC90ZXN0L3J1bl9hbGxfdW5pdHRlc3RzLmNjCmluZGV4IDkwMDI1ZWMuLjBkNjlmMGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdGVzdC9ydW5fYWxsX3VuaXR0ZXN0cy5jYworKysgYi9zcmMvY29iYWx0L3Rlc3QvcnVuX2FsbF91bml0dGVzdHMuY2MKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogbmFtZXNwYWNlIHsKLQogaW50IEluaXRBbmRSdW5BbGxUZXN0cyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgYmFzZTo6Q29tbWFuZExpbmU6OkluaXQoYXJnYywgYXJndik7CiAgIGJhc2U6OkF0RXhpdE1hbmFnZXIgZXhpdF9tYW5hZ2VyOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGFmMmVhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvdGVzdC90ZXN0Lmd5cAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTcgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi17Ci0gICd0YXJnZXRzJzogWwotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdydW5fYWxsX3VuaXR0ZXN0cycsCi0gICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDp0ZXN0X3N1cHBvcnRfYmFzZScsCi0gICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCi0gICAgICBdLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdydW5fYWxsX3VuaXR0ZXN0cy5jYycsCi0gICAgICBdLAotICAgIH0sCi0gIF0KLX0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdGVzdC90ZXN0Lmd5cGkgYi9zcmMvY29iYWx0L3Rlc3QvdGVzdC5neXBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjRlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3Rlc3QvdGVzdC5neXBpCkBAIC0wLDAgKzEsMjMgQEAKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCit7CisgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6dGVzdF9zdXBwb3J0X2Jhc2UnLAorICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCisgIF0sCisgICdzb3VyY2VzJzogWworICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC9ydW5fYWxsX3VuaXR0ZXN0cy5jYycsCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3Rvb2xzL2F1dG9tYXRlZF90ZXN0aW5nL2NvYmFsdF9ydW5uZXIucHkgYi9zcmMvY29iYWx0L3Rvb2xzL2F1dG9tYXRlZF90ZXN0aW5nL2NvYmFsdF9ydW5uZXIucHkKaW5kZXggM2YzOTJjOS4uNTZhMWIyNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC90b29scy9hdXRvbWF0ZWRfdGVzdGluZy9jb2JhbHRfcnVubmVyLnB5CisrKyBiL3NyYy9jb2JhbHQvdG9vbHMvYXV0b21hdGVkX3Rlc3RpbmcvY29iYWx0X3J1bm5lci5weQpAQCAtMTEsNiArMTEsNyBAQAogaW1wb3J0IHRocmVhZAogaW1wb3J0IHRocmVhZGluZwogaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKIAogaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKIGZyb20gY29iYWx0LnRvb2xzLmF1dG9tYXRlZF90ZXN0aW5nIGltcG9ydCBjX3ZhbF9uYW1lcwpAQCAtMTQxLDYgKzE0MiwxMCBAQAogICAgICIiIlNlbmRzIGEgc3lzdGVtIHNpZ25hbCB0byBwdXQgQ29iYWx0IGludG8gc3VzcGVuZCBzdGF0ZS4iIiIKICAgICBzZWxmLmxhdW5jaGVyLlNlbmRTdXNwZW5kKCkKIAorICBkZWYgU2VuZERlZXBMaW5rKHNlbGYsIGxpbmspOgorICAgICIiIlNlbmRzIGEgZGVlcCBsaW5rIHRvIENvYmFsdC4iIiIKKyAgICByZXR1cm4gc2VsZi5sYXVuY2hlci5TZW5kRGVlcExpbmsobGluaykKKwogICBkZWYgR2V0VVJMKHNlbGYpOgogICAgIHJldHVybiBzZWxmLnVybAogCkBAIC0yNTQsMTAgKzI1OSwxOCBAQAogCiAgIGRlZiBfS2lsbExhdW5jaGVyKHNlbGYpOgogICAgICIiIktpbGxzIHRoZSBsYXVuY2hlciBhbmQgaXRzIGF0dGFjaGVkIENvYmFsdCBpbnN0YW5jZS4iIiIKKyAgICB3YWl0X2Zvcl9ydW5uZXJfdGhyZWFkID0gVHJ1ZQogICAgIGlmIHNlbGYuQ2FuRXhlY3V0ZUphdmFTY3JpcHQoKToKLSAgICAgIHNlbGYuRXhlY3V0ZUphdmFTY3JpcHQoJ3dpbmRvdy5jbG9zZSgpOycpCisgICAgICB0cnk6CisgICAgICAgIHNlbGYuRXhlY3V0ZUphdmFTY3JpcHQoJ3dpbmRvdy5jbG9zZSgpOycpCisgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICB3YWl0X2Zvcl9ydW5uZXJfdGhyZWFkID0gRmFsc2UKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgICAgICcqKipBbiBleGNlcHRpb24gd2FzIHJhaXNlZCB3aGlsZSB0cnlpbmcgdG8gY2xvc2UgdGhlIGFwcDonKQorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9c3lzLnN0ZGVycikKIAotICAgIHNlbGYucnVubmVyX3RocmVhZC5qb2luKENPQkFMVF9FWElUX1RJTUVPVVRfU0VDT05EUykKKyAgICBpZiB3YWl0X2Zvcl9ydW5uZXJfdGhyZWFkOgorICAgICAgc2VsZi5ydW5uZXJfdGhyZWFkLmpvaW4oQ09CQUxUX0VYSVRfVElNRU9VVF9TRUNPTkRTKQogICAgIGlmIHNlbGYucnVubmVyX3RocmVhZC5pc0FsaXZlKCk6CiAgICAgICBzeXMuc3RkZXJyLndyaXRlKAogICAgICAgICAgICcqKipSdW5uZXIgdGhyZWFkIHN0aWxsIGFsaXZlIGFmdGVyIHNlbmRpbmcgZ3JhY2VmdWwgc2h1dGRvd24gY29tbWFuZCwgdHJ5IGFnYWluIGJ5IGtpbGxpbmcgYXBwKioqXG4nCkBAIC01MDMsNyArNTE2LDcgQEAKICAgZGV2aWNlX3BhcmFtcy5jb25maWcgPSBhcmdzLmNvbmZpZwogICBkZXZpY2VfcGFyYW1zLmRldmljZV9pZCA9IGFyZ3MuZGV2aWNlX2lkCiAgIGRldmljZV9wYXJhbXMub3V0X2RpcmVjdG9yeSA9IGFyZ3Mub3V0X2RpcmVjdG9yeQotICBpZiBhcmdzLnRhcmdldF9wYXJhbXMgPT0gTm9uZToKKyAgaWYgYXJncy50YXJnZXRfcGFyYW1zIGlzIE5vbmU6CiAgICAgZGV2aWNlX3BhcmFtcy50YXJnZXRfcGFyYW1zID0gW10KICAgZWxzZToKICAgICBkZXZpY2VfcGFyYW1zLnRhcmdldF9wYXJhbXMgPSBbYXJncy50YXJnZXRfcGFyYW1zXQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy93ZWJfYW5pbWF0aW9ucy5neXAgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL3dlYl9hbmltYXRpb25zLmd5cAppbmRleCBmZjJlYWY4Li5jMzUwNzQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL3dlYl9hbmltYXRpb25zLmd5cAorKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL3dlYl9hbmltYXRpb25zLmd5cApAQCAtNTcsMTAgKzU3LDEwIEBACiAgICAgICAgICd3ZWJfYW5pbWF0aW9ucycsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvY3NzX3BhcnNlci9jc3NfcGFyc2VyLmd5cDpjc3NfcGFyc2VyJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9jc3NvbS9jc3NvbS5neXA6Y3Nzb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyZWVuY2FzdC9zY3JlZW5jYXN0X21vZHVsZS5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NjcmVlbmNhc3Qvc2NyZWVuY2FzdF9tb2R1bGUuY2MKaW5kZXggZGRiZGJiZC4uOWRmNTI2OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyZWVuY2FzdC9zY3JlZW5jYXN0X21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JlZW5jYXN0L3NjcmVlbmNhc3RfbW9kdWxlLmNjCkBAIC0zMSw2ICszMSw4IEBACiAKIG5hbWVzcGFjZSB7CiBjb25zdCBjaGFyIGtKcGVnQ29udGVudFR5cGVbXSA9ICJpbWFnZS9qcGVnIjsKKy8vIEFkZCBzY3JlZW5jYXN0IGZyYW1lIHJhdGUgYXMgMzAgZnBzLgorY29uc3QgaW50IGtTY3JlZW5jYXN0RnJhbWVzUGVyU2Vjb25kID0gMzA7CiB9CiAKIFNjcmVlbmNhc3RNb2R1bGU6OlNjcmVlbmNhc3RNb2R1bGUoCkBAIC04OCw3ICs5MCw3IEBACiAgICAgICBiYXNlOjpCaW5kKCZTY3JlZW5jYXN0TW9kdWxlOjpUYWtlU2NyZWVuc2hvdCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7CiAgIHNjcmVlbnNob3RfdGltZXJfLT5TdGFydChGUk9NX0hFUkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09CQUxUX01JTklNVU1fRlJBTUVfVElNRV9JTl9NSUxMSVNFQ09ORFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAuMGYgLyBrU2NyZWVuY2FzdEZyYW1lc1BlclNlY29uZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5zaG90X2V2ZW50KTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViZHJpdmVyLmd5cCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYmRyaXZlci5neXAKaW5kZXggZjM0NGQ3NS4uNDkxNTMxZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViZHJpdmVyLmd5cAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci93ZWJkcml2ZXIuZ3lwCkBAIC05NCw3ICs5NCw2IEBACiAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsgJ2NvcHlfd2ViZHJpdmVyX2RhdGEnLCBdLAogICAgICAgICAgICdkZWZpbmVzJzogWwogICAgICAgICAgICAgJ0VOQUJMRV9XRUJEUklWRVInLAotICAgICAgICAgICAgJ0NPQkFMVF9NSU5JTVVNX0ZSQU1FX1RJTUVfSU5fTUlMTElTRUNPTkRTPTwoY29iYWx0X21pbmltdW1fZnJhbWVfdGltZV9pbl9taWxsaXNlY29uZHMpJywKICAgICAgICAgICBdLAogICAgICAgICAgICdhbGxfZGVwZW5kZW50X3NldHRpbmdzJzogewogICAgICAgICAgICAgJ2RlZmluZXMnOiBbICdFTkFCTEVfV0VCRFJJVkVSJywgXSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYmRyaXZlcl90ZXN0Lmd5cCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYmRyaXZlcl90ZXN0Lmd5cAppbmRleCA5MzQyZmRjLi4zM2M4YWI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci93ZWJkcml2ZXJfdGVzdC5neXAKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViZHJpdmVyX3Rlc3QuZ3lwCkBAIC0xNSwxMSArMTUsMTEgQEAKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6YnJvd3NlcicsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICd3ZWJkcml2ZXJfY29weV90ZXN0X2RhdGEnLAogICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwaScgXSwKICAgICB9LAogCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJzb2NrZXQvY29iYWx0X3dlYl9zb2NrZXRfZXZlbnRfaGFuZGxlci5jYyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L2NvYmFsdF93ZWJfc29ja2V0X2V2ZW50X2hhbmRsZXIuY2MKaW5kZXggMWQzZGIyZS4uMzk5YzE5YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJzb2NrZXQvY29iYWx0X3dlYl9zb2NrZXRfZXZlbnRfaGFuZGxlci5jYworKysgYi9zcmMvY29iYWx0L3dlYnNvY2tldC9jb2JhbHRfd2ViX3NvY2tldF9ldmVudF9oYW5kbGVyLmNjCkBAIC0xMzIsNSArMTMyLDkgQEAKICAgY3JlYXRvcl8tPk9uV3JpdGVEb25lKGJ5dGVzX3dyaXR0ZW4pOwogfQogCit2b2lkIENvYmFsdFdlYlNvY2tldEV2ZW50SGFuZGxlcjo6T25GbG93Q29udHJvbChpbnQ2NF90IHF1b3RhKSB7CisgIGNyZWF0b3JfLT5PbkZsb3dDb250cm9sKHF1b3RhKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHdlYnNvY2tldAogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L2NvYmFsdF93ZWJfc29ja2V0X2V2ZW50X2hhbmRsZXIuaCBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L2NvYmFsdF93ZWJfc29ja2V0X2V2ZW50X2hhbmRsZXIuaAppbmRleCA2Y2I5MmZiLi5iOTc0ODk1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYnNvY2tldC9jb2JhbHRfd2ViX3NvY2tldF9ldmVudF9oYW5kbGVyLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvY29iYWx0X3dlYl9zb2NrZXRfZXZlbnRfaGFuZGxlci5oCkBAIC01Nyw3ICs1Nyw3IEBACiAgIC8vIENhbGxlZCB0byBwcm92aWRlIG1vcmUgc2VuZCBxdW90YSBmb3IgdGhpcyBjaGFubmVsIHRvIHRoZSByZW5kZXJlcgogICAvLyBwcm9jZXNzLiBDdXJyZW50bHkgdGhlIHF1b3RhIHVuaXRzIGFyZSBhbHdheXMgYnl0ZXMgb2YgbWVzc2FnZSBib2R5CiAgIC8vIGRhdGEuIEluIGZ1dHVyZSBpdCBtaWdodCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgbXVsdGlwbGV4aW5nIGluIHVzZS4KLSAgdmlydHVhbCB2b2lkIE9uRmxvd0NvbnRyb2woaW50NjRfdCAvKnF1b3RhKi8pIG92ZXJyaWRlIHt9CisgIHZpcnR1YWwgdm9pZCBPbkZsb3dDb250cm9sKGludDY0X3QgcXVvdGEpIG92ZXJyaWRlOwogCiAgIC8vIENhbGxlZCB3aGVuIHRoZSByZW1vdGUgc2VydmVyIGhhcyBTdGFydGVkIHRoZSBXZWJTb2NrZXQgQ2xvc2luZwogICAvLyBIYW5kc2hha2UuIFRoZSBjbGllbnQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHNlbmQgYW55IG1vcmUgbWVzc2FnZXMgYWZ0ZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L21vY2tfd2Vic29ja2V0X2NoYW5uZWwuY2MgYi9zcmMvY29iYWx0L3dlYnNvY2tldC9tb2NrX3dlYnNvY2tldF9jaGFubmVsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzE3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3dlYnNvY2tldC9tb2NrX3dlYnNvY2tldF9jaGFubmVsLmNjCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvYmFsdC93ZWJzb2NrZXQvbW9ja193ZWJzb2NrZXRfY2hhbm5lbC5oIgorI2luY2x1ZGUgImNvYmFsdC93ZWJzb2NrZXQvY29iYWx0X3dlYl9zb2NrZXRfZXZlbnRfaGFuZGxlci5oIgorCisvLyBHZW5lcmF0ZWQgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IgR01vY2sgb2JqZWN0cyBhcmUgdmVyeSBsYXJnZS4gQnkKKy8vIHB1dHRpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGZpbGUgd2UgY2FuIHNwZWVkIHVwIGNvbXBpbGUgdGltZXMuCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHdlYnNvY2tldCB7CisKK01vY2tXZWJTb2NrZXRDaGFubmVsOjpNb2NrV2ViU29ja2V0Q2hhbm5lbCgKKyAgICBXZWJTb2NrZXRJbXBsKiBpbXBsLCBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSkKKyAgICA6IG5ldDo6V2ViU29ja2V0Q2hhbm5lbChzdGQ6OnVuaXF1ZV9wdHI8bmV0OjpXZWJTb2NrZXRFdmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb2JhbHRXZWJTb2NrZXRFdmVudEhhbmRsZXIoaW1wbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfbW9kdWxlLT51cmxfcmVxdWVzdF9jb250ZXh0KCkpIHt9CisKK01vY2tXZWJTb2NrZXRDaGFubmVsOjp+TW9ja1dlYlNvY2tldENoYW5uZWwoKSA9IGRlZmF1bHQ7CisKK30gIC8vIG5hbWVzcGFjZSB3ZWJzb2NrZXQKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC9tb2NrX3dlYnNvY2tldF9jaGFubmVsLmggYi9zcmMvY29iYWx0L3dlYnNvY2tldC9tb2NrX3dlYnNvY2tldF9jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViYjUzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L21vY2tfd2Vic29ja2V0X2NoYW5uZWwuaApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgVEhJUkRfUEFSVFlfQkxJTktfUkVOREVSRVJfTU9EVUxFU19XRUJTT0NLRVRTX01PQ0tfV0VCU09DS0VUX0NIQU5ORUxfSF8KKyNkZWZpbmUgVEhJUkRfUEFSVFlfQkxJTktfUkVOREVSRVJfTU9EVUxFU19XRUJTT0NLRVRTX01PQ0tfV0VCU09DS0VUX0NIQU5ORUxfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9yZWZwdHIuaCIKKyNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCisjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbC5oIgorI2luY2x1ZGUgIm5ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9jaGFubmVsLmgiCisjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHdlYnNvY2tldCB7CisKK2NsYXNzIFNvdXJjZUxvY2F0aW9uOworCitjbGFzcyBNb2NrV2ViU29ja2V0Q2hhbm5lbCA6IHB1YmxpYyBuZXQ6OldlYlNvY2tldENoYW5uZWwgeworIHB1YmxpYzoKKyAgTW9ja1dlYlNvY2tldENoYW5uZWwoV2ViU29ja2V0SW1wbCogaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yazo6TmV0d29ya01vZHVsZSogbmV0d29ya19tb2R1bGUpOworICB+TW9ja1dlYlNvY2tldENoYW5uZWwoKTsKKworICBNT0NLX01FVEhPRDQoTW9ja1NlbmRGcmFtZSwKKyAgICAgICAgICAgICAgIG5ldDo6V2ViU29ja2V0Q2hhbm5lbDo6Q2hhbm5lbFN0YXRlKAorICAgICAgICAgICAgICAgICAgIGJvb2wgZmluLCBuZXQ6OldlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUgb3BfY29kZSwKKyAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPG5ldDo6SU9CdWZmZXI+IGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKSk7CisgIG5ldDo6V2ViU29ja2V0Q2hhbm5lbDo6Q2hhbm5lbFN0YXRlIFNlbmRGcmFtZSgKKyAgICAgIGJvb2wgZmluLCBuZXQ6OldlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUgb3BfY29kZSwKKyAgICAgIHNjb3BlZF9yZWZwdHI8bmV0OjpJT0J1ZmZlcj4gYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpIG92ZXJyaWRlIHsKKyAgICBiYXNlOjpBdXRvTG9jayBzY29wZWRfbG9jayhsb2NrXyk7CisgICAgcmV0dXJuIE1vY2tTZW5kRnJhbWUoZmluLCBvcF9jb2RlLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKyAgfQorCisgIGJhc2U6OkxvY2smIGxvY2soKSB7IHJldHVybiBsb2NrXzsgfQorCisgcHJpdmF0ZToKKyAgYmFzZTo6TG9jayBsb2NrXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSB3ZWJzb2NrZXQKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBUSElSRF9QQVJUWV9CTElOS19SRU5ERVJFUl9NT0RVTEVTX1dFQlNPQ0tFVFNfTU9DS19XRUJTT0NLRVRfQ0hBTk5FTF9IXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXQuaCBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXQuaAppbmRleCAzOWVmMmVjLi4xMzM0YWViIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0LmgKKysrIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldC5oCkBAIC0yNDIsNiArMjQyLDcgQEAKICAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKFdlYlNvY2tldFRlc3QsIEZhaWxJbnZhbGlkU3ViUHJvdG9jb2xzKTsKICAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKFdlYlNvY2tldFRlc3QsIFN1YlByb3RvY29scyk7CiAgIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhXZWJTb2NrZXRUZXN0LCBEdXBsaWNhdGVkU3ViUHJvdG9jb2xzKTsKKyAgZnJpZW5kIGNsYXNzIFdlYlNvY2tldEltcGxUZXN0OwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXZWJTb2NrZXQpOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbC5jYyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbC5jYwppbmRleCA4NDRkOGY3Li4xOWUyMDYyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2ltcGwuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldF9pbXBsLmNjCkBAIC0yNyw5ICsyNyw2IEBACiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXQuaCIKICNpbmNsdWRlICJuZXQvaHR0cC9odHRwX3V0aWwuaCIKLSNpbmNsdWRlICJuZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZXJyb3JzLmgiCi0jaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2ZyYW1lLmgiCi0jaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2hhbmRzaGFrZV9zdHJlYW1fY3JlYXRlX2hlbHBlci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC03Miw2ICs2OSw3IEBACiAgIC8vIHByaW9yaXR5IHRocmVhZCBtaWdodCBiZSByZXF1aXJlZC4gIEludmVzdGlnYXRpb24gaXMgbmVlZGVkLgogICBkZWxlZ2F0ZV90YXNrX3J1bm5lcl8gPQogICAgICAgbmV0d29ya19tb2R1bGVfLT51cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlcigpLT5HZXROZXR3b3JrVGFza1J1bm5lcigpOworICBEQ0hFQ0soZGVsZWdhdGVfdGFza19ydW5uZXJfKTsKICAgYmFzZTo6V2FpdGFibGVFdmVudCBjaGFubmVsX2NyZWF0ZWRfZXZlbnQoCiAgICAgICBiYXNlOjpXYWl0YWJsZUV2ZW50OjpSZXNldFBvbGljeTo6TUFOVUFMLAogICAgICAgYmFzZTo6V2FpdGFibGVFdmVudDo6SW5pdGlhbFN0YXRlOjpOT1RfU0lHTkFMRUQpOwpAQCAtMTYzLDYgKzE2MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX3N1YnByb3RvY29sKSk7CiB9CiAKK3ZvaWQgV2ViU29ja2V0SW1wbDo6T25GbG93Q29udHJvbChpbnQ2NF90IHF1b3RhKSB7CisgIERDSEVDSyhjdXJyZW50X3F1b3RhXyA+PSAwKTsKKyAgY3VycmVudF9xdW90YV8gKz0gcXVvdGE7CisgIFByb2Nlc3NTZW5kUXVldWUoKTsKK30KKwogdm9pZCBXZWJTb2NrZXRJbXBsOjpPbldlYlNvY2tldENvbm5lY3RlZCgKICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VsZWN0ZWRfc3VicHJvdG9jb2wpIHsKICAgRENIRUNLX0NBTExFRF9PTl9WQUxJRF9USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKQEAgLTI2MCwxMyArMjY0LDQwIEBACiAgICAgRExPRyhXQVJOSU5HKSA8PCAiQXR0ZW1wdCB0byBzZW5kIG92ZXIgYSBjbG9zZWQgY2hhbm5lbC4iOwogICAgIHJldHVybjsKICAgfQorICBTZW5kUXVldWVNZXNzYWdlIG5ld19tZXNzYWdlID0ge2lvX2J1ZmZlciwgbGVuZ3RoLCBvcF9jb2RlfTsKKyAgc2VuZF9xdWV1ZV8ucHVzaChzdGQ6Om1vdmUobmV3X21lc3NhZ2UpKTsKKyAgUHJvY2Vzc1NlbmRRdWV1ZSgpOworfQogCi0gIC8vIHRoaXMgYmVoYXZpb3IgaXMgbm90IGp1c3QgYW4gb3B0aW1pemF0aW9uLCBidXQgcmVxdWlyZWQgaW4gY2FzZQotICAvLyB3ZSBhcmUgY2xvc2luZyB0aGUgY29ubmVjdGlvbgotICBhdXRvIGNoYW5uZWxfc3RhdGUgPQotICAgICAgd2Vic29ja2V0X2NoYW5uZWxfLT5TZW5kRnJhbWUodHJ1ZSAvKmZpbiovLCBvcF9jb2RlLCBpb19idWZmZXIsIGxlbmd0aCk7Ci0gIGlmIChjaGFubmVsX3N0YXRlID09IG5ldDo6V2ViU29ja2V0Q2hhbm5lbDo6Q0hBTk5FTF9ERUxFVEVEKSB7Ci0gICAgd2Vic29ja2V0X2NoYW5uZWxfLnJlc2V0KCk7Cit2b2lkIFdlYlNvY2tldEltcGw6OlByb2Nlc3NTZW5kUXVldWUoKSB7CisgIERDSEVDSyhkZWxlZ2F0ZV90YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIHdoaWxlIChjdXJyZW50X3F1b3RhXyA+IDAgJiYgIXNlbmRfcXVldWVfLmVtcHR5KCkpIHsKKyAgICBTZW5kUXVldWVNZXNzYWdlIG1lc3NhZ2UgPSBzZW5kX3F1ZXVlXy5mcm9udCgpOworICAgIHNpemVfdCBjdXJyZW50X21lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGggLSBzZW50X3NpemVfb2ZfdG9wX21lc3NhZ2VfOworICAgIGJvb2wgZmluYWwgPSBmYWxzZTsKKyAgICBpZiAoY3VycmVudF9xdW90YV8gPCBzdGF0aWNfY2FzdDxpbnQ2NF90PihjdXJyZW50X21lc3NhZ2VfbGVuZ3RoKSkgeworICAgICAgLy8gcXVvdGEgaXMgbm90IGVub3VnaCB0byBzZW5kIHRoZSB0b3AgbWVzc2FnZS4KKyAgICAgIHNjb3BlZF9yZWZwdHI8bmV0OjpJT0J1ZmZlcj4gbmV3X2lvX2J1ZmZlcigKKyAgICAgICAgICBuZXcgbmV0OjpJT0J1ZmZlcihzdGF0aWNfY2FzdDxzaXplX3Q+KGN1cnJlbnRfcXVvdGFfKSkpOworICAgICAgU2JNZW1vcnlDb3B5KG5ld19pb19idWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlvX2J1ZmZlci0+ZGF0YSgpICsgc2VudF9zaXplX29mX3RvcF9tZXNzYWdlXywKKyAgICAgICAgICAgICAgICAgICBjdXJyZW50X3F1b3RhXyk7CisgICAgICBzZW50X3NpemVfb2ZfdG9wX21lc3NhZ2VfICs9IGN1cnJlbnRfcXVvdGFfOworICAgICAgbWVzc2FnZS5pb19idWZmZXIgPSBuZXdfaW9fYnVmZmVyOworICAgICAgY3VycmVudF9tZXNzYWdlX2xlbmd0aCA9IGN1cnJlbnRfcXVvdGFfOworICAgICAgY3VycmVudF9xdW90YV8gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTZW50IGFsbCBvZiB0aGUgcmVtYWluaW5nIHRvcCBtZXNzYWdlLgorICAgICAgZmluYWwgPSB0cnVlOworICAgICAgc2VuZF9xdWV1ZV8ucG9wKCk7CisgICAgICBzZW50X3NpemVfb2ZfdG9wX21lc3NhZ2VfID0gMDsKKyAgICAgIGN1cnJlbnRfcXVvdGFfIC09IGN1cnJlbnRfbWVzc2FnZV9sZW5ndGg7CisgICAgfQorICAgIGF1dG8gY2hhbm5lbF9zdGF0ZSA9IHdlYnNvY2tldF9jaGFubmVsXy0+U2VuZEZyYW1lKAorICAgICAgICBmaW5hbCwgbWVzc2FnZS5vcF9jb2RlLCBtZXNzYWdlLmlvX2J1ZmZlciwgY3VycmVudF9tZXNzYWdlX2xlbmd0aCk7CisgICAgaWYgKGNoYW5uZWxfc3RhdGUgPT0gbmV0OjpXZWJTb2NrZXRDaGFubmVsOjpDSEFOTkVMX0RFTEVURUQpIHsKKyAgICAgIHdlYnNvY2tldF9jaGFubmVsXy5yZXNldCgpOworICAgIH0KICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2ltcGwuaCBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbC5oCmluZGV4IDVlNTk3N2QuLjZjNjU2MjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbC5oCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbC5oCkBAIC0xNiw2ICsxNiw3IEBACiAjZGVmaW5lIENPQkFMVF9XRUJTT0NLRVRfV0VCX1NPQ0tFVF9JTVBMX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtMzIsNyArMzMsMTAgQEAKICNpbmNsdWRlICJjb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfbWVzc2FnZV9jb250YWluZXIuaCIKICNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaCIKICNpbmNsdWRlICJuZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfY2hhbm5lbC5oIgorI2luY2x1ZGUgIm5ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9lcnJvcnMuaCIKKyNpbmNsdWRlICJuZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWUuaCIKICNpbmNsdWRlICJuZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWVfcGFyc2VyLmgiCisjaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2hhbmRzaGFrZV9zdHJlYW1fY3JlYXRlX2hlbHBlci5oIgogI2luY2x1ZGUgInVybC9ndXJsLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtODUsNiArODksOCBAQAogCiAgIHZvaWQgT25IYW5kc2hha2VDb21wbGV0ZShjb25zdCBzdGQ6OnN0cmluZyYgc2VsZWN0ZWRfc3VicHJvdG9jb2wpOwogCisgIHZvaWQgT25GbG93Q29udHJvbChpbnQ2NF90IHF1b3RhKTsKKwogICBzdHJ1Y3QgQ2xvc2VJbmZvIHsKICAgICBDbG9zZUluZm8oY29uc3QgbmV0OjpXZWJTb2NrZXRFcnJvciBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQogICAgICAgICA6IGNvZGUoY29kZSksIHJlYXNvbihyZWFzb24pIHt9CkBAIC0xMDgsNiArMTE0LDcgQEAKICAgYm9vbCBTZW5kSGVscGVyKGNvbnN0IG5ldDo6V2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSBvcF9jb2RlLAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSwgc3RkOjpzaXplX3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yX21lc3NhZ2UpOworICB2b2lkIFByb2Nlc3NTZW5kUXVldWUoKTsKIAogICB2b2lkIE9uV2ViU29ja2V0Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWxlY3RlZF9zdWJwcm90b2NvbCk7CiAgIHZvaWQgT25XZWJTb2NrZXREaXNjb25uZWN0ZWQoYm9vbCB3YXNfY2xlYW4sIHVpbnQxNiBjb2RlLApAQCAtMTI1LDExICsxMzIsMjMgQEAKICAgc3RkOjpzdHJpbmcgb3JpZ2luXzsKICAgR1VSTCBjb25uZWN0X3VybF87CiAKKyAgLy8gRGF0YSBidWZmZXJpbmcgYW5kIGZsb3cgY29udHJvbC4KKyAgLy8gU2hvdWxkIG9ubHkgYmUgbW9kaWZpZWQgb24gZGVsZWdhdGUobmV0d29yaykgdGhyZWFkLgorICBpbnQ2NF90IGN1cnJlbnRfcXVvdGFfID0gMDsKKyAgc3RydWN0IFNlbmRRdWV1ZU1lc3NhZ2UgeworICAgIHNjb3BlZF9yZWZwdHI8bmV0OjpJT0J1ZmZlcj4gaW9fYnVmZmVyOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgbmV0OjpXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlIG9wX2NvZGU7CisgIH07CisgIHN0ZDo6cXVldWU8U2VuZFF1ZXVlTWVzc2FnZT4gc2VuZF9xdWV1ZV87CisgIHNpemVfdCBzZW50X3NpemVfb2ZfdG9wX21lc3NhZ2VfID0gMDsKKwogICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IGRlbGVnYXRlX3Rhc2tfcnVubmVyXzsKICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiBvd25lcl90YXNrX3J1bm5lcl87CiAKICAgfldlYlNvY2tldEltcGwoKTsKICAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFdlYlNvY2tldEltcGw+OworICBmcmllbmQgY2xhc3MgV2ViU29ja2V0SW1wbFRlc3Q7CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYlNvY2tldEltcGwpOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbF90ZXN0LmNjIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldF9pbXBsX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyZDBhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbF90ZXN0LmNjCkBAIC0wLDAgKzEsMjMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbC5oIgorI2luY2x1ZGUgImNvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90ZXN0L3Njb3BlZF90YXNrX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vd2luZG93LmgiCisjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Rlc3RpbmcvbW9ja19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvd2Vic29ja2V0L21vY2tfd2Vic29ja2V0X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnOwordXNpbmcgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrOwordXNpbmcgOjp0ZXN0aW5nOjpEZWZhdWx0VmFsdWU7Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojp0ZXN0aW5nOjpNb2NrRXhjZXB0aW9uU3RhdGU7CisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHdlYnNvY2tldCB7CituYW1lc3BhY2UgeworLy8gVGhlc2UgbGltaXRzIGFyZSBjb3BpZWQgZnJvbSBuZXQ6OldlYlNvY2tldENoYW5uZWwgaW1wbGVtZW50YXRpb24uCitjb25zdCBpbnQga0RlZmF1bHRTZW5kUXVvdGFIaWdoV2F0ZXJNYXJrID0gMSA8PCAxNzsKK2NvbnN0IGludCBrODAwS0IgPSA4MDA7Citjb25zdCBpbnQga1Rvb011Y2ggPSBrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmsgKyAxOworY29uc3QgaW50IGtXYXlUb29NdWNoID0ga0RlZmF1bHRTZW5kUXVvdGFIaWdoV2F0ZXJNYXJrICogMiArIDE7Citjb25zdCBpbnQgazUxMktCID0gNTEyOworCitjbGFzcyBGYWtlU2V0dGluZ3MgOiBwdWJsaWMgZG9tOjpET01TZXR0aW5ncyB7CisgcHVibGljOgorICBGYWtlU2V0dGluZ3MoKQorICAgICAgOiBkb206OkRPTVNldHRpbmdzKDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm51bGxfZGVidWdnZXJfaG9va3NfLCBOVUxMKSwKKyAgICAgICAgYmFzZV8oImh0dHBzOi8vMTI3LjAuMC4xOjEyMzQiKSB7CisgICAgbmV0d29ya19tb2R1bGVfLnJlc2V0KG5ldyBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKCkpOworICAgIHRoaXMtPnNldF9uZXR3b3JrX21vZHVsZShuZXR3b3JrX21vZHVsZV8uZ2V0KCkpOworICB9CisgIGNvbnN0IEdVUkwmIGJhc2VfdXJsKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gYmFzZV87IH0KKworICAvLyBwdWJsaWMgbWVtYmVycywgc28gdGhhdCB0aGV5J3JlIGVhc2llciBmb3IgdGVzdGluZy4KKyAgYmFzZTo6TnVsbERlYnVnZ2VySG9va3MgbnVsbF9kZWJ1Z2dlcl9ob29rc187CisgIEdVUkwgYmFzZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxuZXR3b3JrOjpOZXR3b3JrTW9kdWxlPiBuZXR3b3JrX21vZHVsZV87Cit9OworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIFdlYlNvY2tldEltcGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBkb206OkRPTVNldHRpbmdzKiBzZXR0aW5ncygpIGNvbnN0IHsgcmV0dXJuIHNldHRpbmdzXy5nZXQoKTsgfQorICB2b2lkIEFkZFF1b3RhKGludCBxdW90YSkgeworICAgIG5ldHdvcmtfdGFza19ydW5uZXJfLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmQoJldlYlNvY2tldEltcGw6Ok9uRmxvd0NvbnRyb2wsIHdlYnNvY2tldF9pbXBsXywgcXVvdGEpKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBXZWJTb2NrZXRJbXBsVGVzdCgpIDogc2V0dGluZ3NfKG5ldyBGYWtlU2V0dGluZ3MoKSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdWJfcHJvdG9jb2xzOworICAgIHN1Yl9wcm90b2NvbHMucHVzaF9iYWNrKCJjaGF0Iik7CisgICAgLy8gVXNlIGxvY2FsIFVSTCBzbyB0aGF0IFdlYlNvY2tldCB3aWxsIG5vdCBjb21wbGFpbiBhYm91dCBVUkwgZm9ybWF0LgorICAgIHdzXyA9IG5ldyBXZWJTb2NrZXQoc2V0dGluZ3MoKSwgIndzczovLzEyNy4wLjAuMToxMjM0Iiwgc3ViX3Byb3RvY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGVfLCBmYWxzZSk7CisKKyAgICB3ZWJzb2NrZXRfaW1wbF8gPSB3c18tPmltcGxfOworICAgIG5ldHdvcmtfdGFza19ydW5uZXJfID0gc2V0dGluZ3NfLT5uZXR3b3JrX21vZHVsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT51cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXROZXR3b3JrVGFza1J1bm5lcigpOworICAgIC8vIFRoZSBob2xkZXIgaXMgb25seSBjcmVhdGVkIHRvIGJlIGJhc2U6OlBhc3NlZCgpIG9uIHRoZSBuZXh0IGxpbmUsIGl0IHdpbGwKKyAgICAvLyBiZSBlbXB0eSBzbyBkbyBub3QgdXNlIGl0IGxhdGVyLgorICAgIG5ldHdvcmtfdGFza19ydW5uZXJfLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmQoCisgICAgICAgICAgICBbXShzY29wZWRfcmVmcHRyPFdlYlNvY2tldEltcGw+IHdlYnNvY2tldF9pbXBsLAorICAgICAgICAgICAgICAgTW9ja1dlYlNvY2tldENoYW5uZWwqKiBtb2NrX2NoYW5uZWxfc2xvdCwKKyAgICAgICAgICAgICAgIGRvbTo6RE9NU2V0dGluZ3MqIHNldHRpbmdzKSB7CisgICAgICAgICAgICAgICptb2NrX2NoYW5uZWxfc2xvdCA9IG5ldyBNb2NrV2ViU29ja2V0Q2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgIHdlYnNvY2tldF9pbXBsLmdldCgpLCBzZXR0aW5ncy0+bmV0d29ya19tb2R1bGUoKSk7CisgICAgICAgICAgICAgIHdlYnNvY2tldF9pbXBsLT53ZWJzb2NrZXRfY2hhbm5lbF8gPQorICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPG5ldDo6V2ViU29ja2V0Q2hhbm5lbD4oKm1vY2tfY2hhbm5lbF9zbG90KTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB3ZWJzb2NrZXRfaW1wbF8sICZtb2NrX2NoYW5uZWxfLCBzZXR0aW5ncygpKSk7CisgIH0KKyAgfldlYlNvY2tldEltcGxUZXN0KCkgeworICAgIG5ldHdvcmtfdGFza19ydW5uZXJfLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmQoJldlYlNvY2tldEltcGw6Ok9uQ2xvc2UsIHdlYnNvY2tldF9pbXBsXywgdHJ1ZSAvKndhc19jbGFuKi8sCisgICAgICAgICAgICAgICAgICAgbmV0OjprV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZSAvKmVycm9yX2NvZGUqLywKKyAgICAgICAgICAgICAgICAgICAiIiAvKmNsb3NlX3JlYXNvbiovKSk7CisgIH0KKworICBiYXNlOjp0ZXN0OjpTY29wZWRUYXNrRW52aXJvbm1lbnQgZW52XzsKKworICBzdGQ6OnVuaXF1ZV9wdHI8RmFrZVNldHRpbmdzPiBzZXR0aW5nc187CisgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gbmV0d29ya190YXNrX3J1bm5lcl87CisgIHNjb3BlZF9yZWZwdHI8V2ViU29ja2V0PiB3c187CisgIHNjb3BlZF9yZWZwdHI8V2ViU29ja2V0SW1wbD4gd2Vic29ja2V0X2ltcGxfOworICBNb2NrV2ViU29ja2V0Q2hhbm5lbCogbW9ja19jaGFubmVsXzsKKyAgU3RyaWN0TW9jazxNb2NrRXhjZXB0aW9uU3RhdGU+IGV4Y2VwdGlvbl9zdGF0ZV87Cit9OworCitURVNUX0YoV2ViU29ja2V0SW1wbFRlc3QsIE5vcm1hbFNpemVSZXF1ZXN0KSB7CisgIC8vIE5vcm1hbGx5IHRoZSBoaWdoIHdhdGVybWFyayBxdW90YSBpcyBnaXZlbiBhdCB3ZWJzb2NrZXQgY29ubmVjdGlvbiBzdWNjZXNzLgorICBBZGRRdW90YShrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmspOworCisgIHsKKyAgICBiYXNlOjpBdXRvTG9jayBzY29wZWRfbG9jayhtb2NrX2NoYW5uZWxfLT5sb2NrKCkpOworICAgIC8vIG1vY2tfY2hhbm5lbF8gaXMgY3JlYXRlZCBhbmQgdXNlZCBvbiBuZXR3b3JrIHRocmVhZC4KKyAgICBFWFBFQ1RfQ0FMTCgKKyAgICAgICAgKm1vY2tfY2hhbm5lbF8sCisgICAgICAgIE1vY2tTZW5kRnJhbWUodHJ1ZSwgbmV0OjpXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZVRleHQsIF8sIGs4MDBLQikpCisgICAgICAgIC5UaW1lcygxKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKG5ldDo6V2ViU29ja2V0Q2hhbm5lbDo6Q0hBTk5FTF9BTElWRSkpOworICB9CisKKyAgY2hhciBkYXRhW2s4MDBLQl07CisgIGludDMyIGJ1ZmZlcmVkX2Ftb3VudCA9IDA7CisgIHN0ZDo6c3RyaW5nIGVycm9yOworICB3ZWJzb2NrZXRfaW1wbF8tPlNlbmRUZXh0KGRhdGEsIGs4MDBLQiwgJmJ1ZmZlcmVkX2Ftb3VudCwgJmVycm9yKTsKK30KKworVEVTVF9GKFdlYlNvY2tldEltcGxUZXN0LCBMYXJnZVJlcXVlc3QpIHsKKyAgQWRkUXVvdGEoa0RlZmF1bHRTZW5kUXVvdGFIaWdoV2F0ZXJNYXJrKTsKKworICAvLyBtb2NrX2NoYW5uZWxfIGlzIGNyZWF0ZWQgYW5kIHVzZWQgb24gbmV0d29yayB0aHJlYWQuCisgIHsKKyAgICBiYXNlOjpBdXRvTG9jayBzY29wZWRfbG9jayhtb2NrX2NoYW5uZWxfLT5sb2NrKCkpOworICAgIEVYUEVDVF9DQUxMKCptb2NrX2NoYW5uZWxfLAorICAgICAgICAgICAgICAgIE1vY2tTZW5kRnJhbWUodHJ1ZSwgbmV0OjpXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZVRleHQsIF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmspKQorICAgICAgICAuVGltZXMoMSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybihuZXQ6OldlYlNvY2tldENoYW5uZWw6OkNIQU5ORUxfQUxJVkUpKTsKKyAgfQorCisgIGNoYXIgZGF0YVtrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmtdOworICBpbnQzMiBidWZmZXJlZF9hbW91bnQgPSAwOworICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgd2Vic29ja2V0X2ltcGxfLT5TZW5kVGV4dChkYXRhLCBrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcmVkX2Ftb3VudCwgJmVycm9yKTsKK30KKworVEVTVF9GKFdlYlNvY2tldEltcGxUZXN0LCBPdmVyTGltaXRSZXF1ZXN0KSB7CisgIEFkZFF1b3RhKGtEZWZhdWx0U2VuZFF1b3RhSGlnaFdhdGVyTWFyayk7CisKKyAgLy8gbW9ja19jaGFubmVsXyBpcyBjcmVhdGVkIGFuZCB1c2VkIG9uIG5ldHdvcmsgdGhyZWFkLgorICB7CisgICAgYmFzZTo6QXV0b0xvY2sgc2NvcGVkX2xvY2sobW9ja19jaGFubmVsXy0+bG9jaygpKTsKKyAgICBFWFBFQ1RfQ0FMTCgqbW9ja19jaGFubmVsXywKKyAgICAgICAgICAgICAgICBNb2NrU2VuZEZyYW1lKGZhbHNlLCBuZXQ6OldlYlNvY2tldEZyYW1lSGVhZGVyOjprT3BDb2RlVGV4dCwgXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0U2VuZFF1b3RhSGlnaFdhdGVyTWFyaykpCisgICAgICAgIC5UaW1lcygyKQorICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKG5ldDo6V2ViU29ja2V0Q2hhbm5lbDo6Q0hBTk5FTF9BTElWRSkpOworCisgICAgRVhQRUNUX0NBTEwoCisgICAgICAgICptb2NrX2NoYW5uZWxfLAorICAgICAgICBNb2NrU2VuZEZyYW1lKHRydWUsIG5ldDo6V2ViU29ja2V0RnJhbWVIZWFkZXI6OmtPcENvZGVUZXh0LCBfLCAxKSkKKyAgICAgICAgLlRpbWVzKDEpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4obmV0OjpXZWJTb2NrZXRDaGFubmVsOjpDSEFOTkVMX0FMSVZFKSk7CisgIH0KKworICBjaGFyIGRhdGFba1dheVRvb011Y2hdOworICBpbnQzMiBidWZmZXJlZF9hbW91bnQgPSAwOworICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgd2Vic29ja2V0X2ltcGxfLT5TZW5kVGV4dChkYXRhLCBrV2F5VG9vTXVjaCwgJmJ1ZmZlcmVkX2Ftb3VudCwgJmVycm9yKTsKKworICBBZGRRdW90YShrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmspOworICBBZGRRdW90YShrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmspOworfQorCisKK1RFU1RfRihXZWJTb2NrZXRJbXBsVGVzdCwgUmV1c2VTb2NrZXRGb3JMYXJnZVJlcXVlc3QpIHsKKyAgQWRkUXVvdGEoa0RlZmF1bHRTZW5kUXVvdGFIaWdoV2F0ZXJNYXJrKTsKKworICAvLyBtb2NrX2NoYW5uZWxfIGlzIGNyZWF0ZWQgYW5kIHVzZWQgb24gbmV0d29yayB0aHJlYWQuCisgIHsKKyAgICBiYXNlOjpBdXRvTG9jayBzY29wZWRfbG9jayhtb2NrX2NoYW5uZWxfLT5sb2NrKCkpOworICAgIEVYUEVDVF9DQUxMKCptb2NrX2NoYW5uZWxfLAorICAgICAgICAgICAgICAgIE1vY2tTZW5kRnJhbWUoZmFsc2UsIG5ldDo6V2ViU29ja2V0RnJhbWVIZWFkZXI6OmtPcENvZGVCaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLCBrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmspKQorICAgICAgICAuVGltZXMoMSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybihuZXQ6OldlYlNvY2tldENoYW5uZWw6OkNIQU5ORUxfQUxJVkUpKTsKKyAgICBFWFBFQ1RfQ0FMTCgKKyAgICAgICAgKm1vY2tfY2hhbm5lbF8sCisgICAgICAgIE1vY2tTZW5kRnJhbWUodHJ1ZSwgbmV0OjpXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZUJpbmFyeSwgXywgMSkpCisgICAgICAgIC5UaW1lcygxKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKG5ldDo6V2ViU29ja2V0Q2hhbm5lbDo6Q0hBTk5FTF9BTElWRSkpOworICAgIEVYUEVDVF9DQUxMKCptb2NrX2NoYW5uZWxfLAorICAgICAgICAgICAgICAgIE1vY2tTZW5kRnJhbWUoZmFsc2UsIG5ldDo6V2ViU29ja2V0RnJhbWVIZWFkZXI6OmtPcENvZGVUZXh0LCBfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazUxMktCIC0gMSkpCisgICAgICAgIC5UaW1lcygxKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKG5ldDo6V2ViU29ja2V0Q2hhbm5lbDo6Q0hBTk5FTF9BTElWRSkpOworICAgIEVYUEVDVF9DQUxMKCptb2NrX2NoYW5uZWxfLAorICAgICAgICAgICAgICAgIE1vY2tTZW5kRnJhbWUodHJ1ZSwgbmV0OjpXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZVRleHQsIF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVG9vTXVjaCAtIChrNTEyS0IgLSAxKSkpCisgICAgICAgIC5UaW1lcygxKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKG5ldDo6V2ViU29ja2V0Q2hhbm5lbDo6Q0hBTk5FTF9BTElWRSkpOworICB9CisKKyAgY2hhciBkYXRhW2tUb29NdWNoXTsKKyAgaW50MzIgYnVmZmVyZWRfYW1vdW50ID0gMDsKKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIHdlYnNvY2tldF9pbXBsXy0+U2VuZEJpbmFyeShkYXRhLCBrVG9vTXVjaCwgJmJ1ZmZlcmVkX2Ftb3VudCwgJmVycm9yKTsKKyAgd2Vic29ja2V0X2ltcGxfLT5TZW5kVGV4dChkYXRhLCBrVG9vTXVjaCwgJmJ1ZmZlcmVkX2Ftb3VudCwgJmVycm9yKTsKKworICBBZGRRdW90YShrNTEyS0IpOworICBBZGRRdW90YShrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmspOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd2Vic29ja2V0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X3Rlc3QuY2MKaW5kZXggNTc1YjQ2Yy4uZjg1ZDRiYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfdGVzdC5jYwpAQCAtMzYsNiArMzYsNyBAQAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2Ugd2Vic29ja2V0IHsKIAorbmFtZXNwYWNlIHsKIGNsYXNzIEZha2VTZXR0aW5ncyA6IHB1YmxpYyBkb206OnRlc3Rpbmc6OlN0dWJFbnZpcm9ubWVudFNldHRpbmdzIHsKICBwdWJsaWM6CiAgIEZha2VTZXR0aW5ncygpIDogYmFzZV8oImh0dHBzOi8vZXhhbXBsZS5jb20iKSB7CkBAIC00OCw2ICs0OSw3IEBACiAgIEdVUkwgYmFzZV87CiAgIHN0ZDo6dW5pcXVlX3B0cjxuZXR3b3JrOjpOZXR3b3JrTW9kdWxlPiBuZXR3b3JrX21vZHVsZV87CiB9OworfSAgLy8gbmFtZXNwYWNlCiAKIGNsYXNzIFdlYlNvY2tldFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKICBwdWJsaWM6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJzb2NrZXQuZ3lwIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2Vic29ja2V0Lmd5cAppbmRleCA4OGUyYmFkLi5jM2JmYjNhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJzb2NrZXQuZ3lwCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYnNvY2tldC5neXAKQEAgLTQ3LDExICs0NywxMiBAQAogICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICd3ZWJfc29ja2V0X3Rlc3QuY2MnLAorICAgICAgICAnbW9ja193ZWJzb2NrZXRfY2hhbm5lbC5jYycsCisgICAgICAgICd3ZWJfc29ja2V0X2ltcGxfdGVzdC5jYycsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJ3dlYnNvY2tldCcsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL2RvbS5neXA6ZG9tJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3VybC91cmwuZ3lwOnVybCcsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCkBAIC02OCw2ICs2OSw3IEBACiAgICAgICAgICAgXSwKICAgICAgICAgfV0sCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXBpJyBdLAogICAgIH0sCiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci91cmxfZmV0Y2hlcl9idWZmZXJfd3JpdGVyLmNjIGIvc3JjL2NvYmFsdC94aHIvdXJsX2ZldGNoZXJfYnVmZmVyX3dyaXRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGM0Mzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC94aHIvdXJsX2ZldGNoZXJfYnVmZmVyX3dyaXRlci5jYwpAQCAtMCwwICsxLDMwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC94aHIvdXJsX2ZldGNoZXJfYnVmZmVyX3dyaXRlci5oIgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAibmV0L2Jhc2UvbmV0X2Vycm9ycy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgeGhyIHsKKworbmFtZXNwYWNlIHsKKworLy8gQWxsb2NhdGUgNjRLQiBpZiB0aGUgdG90YWwgc2l6ZSBpcyB1bmtub3duIHRvIGF2b2lkIGFsbG9jYXRpbmcgc21hbGwgYnVmZmVyCisvLyB0b28gbWFueSB0aW1lcy4KK2NvbnN0IGludDY0X3Qga0RlZmF1bHRQcmVBbGxvY2F0ZVNpemVJbkJ5dGVzID0gNjQgKiAxMDI0OworCit2b2lkIFJlbGVhc2VNZW1vcnkoc3RkOjpzdHJpbmcqIHN0cikgeworICBEQ0hFQ0soc3RyKTsKKyAgc3RkOjpzdHJpbmcgZW1wdHk7CisgIHN0ci0+c3dhcChlbXB0eSk7Cit9CisKK3ZvaWQgUmVsZWFzZU1lbW9yeShzY3JpcHQ6OlByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YSogZGF0YSkgeworICBEQ0hFQ0soZGF0YSk7CisgIHNjcmlwdDo6UHJlYWxsb2NhdGVkQXJyYXlCdWZmZXJEYXRhIGVtcHR5OworICBkYXRhLT5Td2FwKCZlbXB0eSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6OkJ1ZmZlcjo6QnVmZmVyKFR5cGUgdHlwZSkgOiB0eXBlXyh0eXBlKSB7fQorCit2b2lkIFVSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6QnVmZmVyOjpEaXNhYmxlUHJlYWxsb2NhdGUoKSB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisKKyAgRENIRUNLX0VRKEdldFNpemVfTG9ja2VkKCksIDB1KTsKKyAgYWxsb3dfcHJlYWxsb2NhdGVfID0gZmFsc2U7Cit9CisKK3ZvaWQgVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXI6OkNsZWFyKCkgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworCisgIFJlbGVhc2VNZW1vcnkoJmRhdGFfYXNfc3RyaW5nXyk7CisgIFJlbGVhc2VNZW1vcnkoJmNvcHlfb2ZfZGF0YV9hc19zdHJpbmdfKTsKKyAgUmVsZWFzZU1lbW9yeSgmZGF0YV9hc19hcnJheV9idWZmZXJfKTsKKworICBkb3dubG9hZF9wcm9ncmVzc18gPSAwOworICBkYXRhX2FzX2FycmF5X2J1ZmZlcl9zaXplXyA9IDA7Cit9CisKK2ludDY0X3QgVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXI6OkdldEFuZFJlc2V0RG93bmxvYWRQcm9ncmVzcygpIHsKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgZG93bmxvYWRfcHJvZ3Jlc3NfID0gR2V0U2l6ZV9Mb2NrZWQoKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGRvd25sb2FkX3Byb2dyZXNzXyk7Cit9CisKK2Jvb2wgVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXI6Okhhc1Byb2dyZXNzU2luY2VMYXN0R2V0QW5kUmVzZXQoKSBjb25zdCB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIHJldHVybiBHZXRTaXplX0xvY2tlZCgpID4gZG93bmxvYWRfcHJvZ3Jlc3NfOworfQorCitjb25zdCBzdGQ6OnN0cmluZyYKK1VSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6QnVmZmVyOjpHZXRSZWZlcmVuY2VPZlN0cmluZ0FuZFNlYWwoKSB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisKKyAgVXBkYXRlVHlwZV9Mb2NrZWQoa1N0cmluZyk7CisgIGFsbG93X3dyaXRlXyA9IGZhbHNlOworCisgIHJldHVybiBkYXRhX2FzX3N0cmluZ187Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJgorVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXI6OkdldFRlbXBvcmFyeVJlZmVyZW5jZU9mU3RyaW5nKCkgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworCisgIC8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGZ1cnRoZXIgb3B0aW1pemVkIGJ5IGFsd2F5cyByZXR1cm4gcmVmZXJlbmNlIG9mCisgIC8vIHxkYXRhX2FzX3N0cmluZ198LCBhbmQgb25seSBtYWtlIGEgY29weSB3aGVuIHxkYXRhX2FzX3N0cmluZ198IGlzIGV4dGVuZGVkLgorICAvLyAgSXQgaXMgbm90IGRvbmUgYXMgR2V0VGVtcG9yYXJ5UmVmZXJlbmNlT2ZTdHJpbmcoKSBpcyBjdXJyZW50bHkgbm90CisgIC8vIHRyaWdnZXJlZC4gIEl0IHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiBKUyBhcHAgaXMgcmV0cmlldmluZyByZXNwb25zZVRleHQKKyAgLy8gd2hpbGUgdGhlIHJlcXVlc3QgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MuCisKKyAgaWYgKHR5cGVfID09IGtTdHJpbmcpIHsKKyAgICBjb3B5X29mX2RhdGFfYXNfc3RyaW5nXyA9IGRhdGFfYXNfc3RyaW5nXzsKKyAgfSBlbHNlIHsKKyAgICBEQ0hFQ0tfRVEodHlwZV8sIGtBcnJheUJ1ZmZlcik7CisgICAgY29uc3QgY2hhciogYmVnaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YV9hc19hcnJheV9idWZmZXJfLmRhdGEoKSk7CisgICAgY29weV9vZl9kYXRhX2FzX3N0cmluZ18uYXNzaWduKGJlZ2luLCBiZWdpbiArIGRhdGFfYXNfYXJyYXlfYnVmZmVyX3NpemVfKTsKKyAgfQorCisgIHJldHVybiBjb3B5X29mX2RhdGFfYXNfc3RyaW5nXzsKK30KKwordm9pZCBVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6OkJ1ZmZlcjo6R2V0QW5kUmVzZXQoc3RkOjpzdHJpbmcqIHN0cikgeworICBEQ0hFQ0soc3RyKTsKKworICBSZWxlYXNlTWVtb3J5KHN0cik7CisKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKworICBVcGRhdGVUeXBlX0xvY2tlZChrU3RyaW5nKTsKKworICBpZiAoY2FwYWNpdHlfa25vd25fICYmIGRhdGFfYXNfc3RyaW5nXy5zaXplKCkgIT0gZGF0YV9hc19zdHJpbmdfLmNhcGFjaXR5KCkpIHsKKyAgICBETE9HKFdBUk5JTkcpIDw8ICJTdHJpbmcgc2l6ZSAiIDw8IGRhdGFfYXNfc3RyaW5nXy5zaXplKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgaXMgZGlmZmVyZW50IHRoYW4gaXRzIHByZXNldCBjYXBhY2l0eSAiCisgICAgICAgICAgICAgICAgICA8PCBkYXRhX2FzX3N0cmluZ18uY2FwYWNpdHkoKTsKKyAgfQorCisgIGRhdGFfYXNfc3RyaW5nXy5zd2FwKCpzdHIpOworfQorCit2b2lkIFVSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6QnVmZmVyOjpHZXRBbmRSZXNldCgKKyAgICBQcmVhbGxvY2F0ZWRBcnJheUJ1ZmZlckRhdGEqIGRhdGEpIHsKKyAgRENIRUNLKGRhdGEpOworCisgIFJlbGVhc2VNZW1vcnkoZGF0YSk7CisKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKworICBVcGRhdGVUeXBlX0xvY2tlZChrQXJyYXlCdWZmZXIpOworCisgIGlmIChkYXRhX2FzX2FycmF5X2J1ZmZlcl8uYnl0ZV9sZW5ndGgoKSAhPSBkYXRhX2FzX2FycmF5X2J1ZmZlcl9zaXplXykgeworICAgIERDSEVDS19MVChkYXRhX2FzX2FycmF5X2J1ZmZlcl9zaXplXywgZGF0YV9hc19hcnJheV9idWZmZXJfLmJ5dGVfbGVuZ3RoKCkpOworICAgIERMT0dfSUYoV0FSTklORywgY2FwYWNpdHlfa25vd25fKQorICAgICAgICA8PCAiQXJyYXlCdWZmZXIgc2l6ZSAiIDw8IGRhdGFfYXNfYXJyYXlfYnVmZmVyX3NpemVfCisgICAgICAgIDw8ICIgaXMgZGlmZmVyZW50IHRoYW4gaXRzIHByZXNldCBjYXBhY2l0eSAiCisgICAgICAgIDw8IGRhdGFfYXNfYXJyYXlfYnVmZmVyXy5ieXRlX2xlbmd0aCgpOworICAgIGRhdGFfYXNfYXJyYXlfYnVmZmVyXy5SZXNpemUoZGF0YV9hc19hcnJheV9idWZmZXJfc2l6ZV8pOworICB9CisgIGRhdGFfYXNfYXJyYXlfYnVmZmVyXy5Td2FwKGRhdGEpOworfQorCit2b2lkIFVSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6QnVmZmVyOjpNYXliZVByZWFsbG9jYXRlKGludDY0X3QgY2FwYWNpdHkpIHsKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKworICBpZiAoIWFsbG93X3ByZWFsbG9jYXRlXykgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjYXBhY2l0eSA8IDApIHsKKyAgICBjYXBhY2l0eSA9IGtEZWZhdWx0UHJlQWxsb2NhdGVTaXplSW5CeXRlczsKKyAgfSBlbHNlIHsKKyAgICBjYXBhY2l0eV9rbm93bl8gPSB0cnVlOworICB9CisKKyAgaWYgKGNhcGFjaXR5ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBrU3RyaW5nOgorICAgICAgRENIRUNLX0VRKGRhdGFfYXNfc3RyaW5nXy5zaXplKCksIDB1KTsKKyAgICAgIGRhdGFfYXNfc3RyaW5nXy5yZXNlcnZlKGNhcGFjaXR5KTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIGtBcnJheUJ1ZmZlcjoKKyAgICAgIERDSEVDS19FUShkYXRhX2FzX2FycmF5X2J1ZmZlcl9zaXplXywgMHUpOworICAgICAgZGF0YV9hc19hcnJheV9idWZmZXJfLlJlc2l6ZShjYXBhY2l0eSk7CisgICAgICByZXR1cm47CisgIH0KKyAgTk9UUkVBQ0hFRCgpOworfQorCit2b2lkIFVSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6QnVmZmVyOjpXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2J5dGVzKSB7CisgIERDSEVDS19HRShudW1fYnl0ZXMsIDApOworCisgIGlmIChudW1fYnl0ZXMgPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisKKyAgRENIRUNLKGFsbG93X3dyaXRlXyk7CisKKyAgaWYgKCFhbGxvd193cml0ZV8pIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodHlwZV8gPT0ga1N0cmluZykgeworICAgIGlmIChjYXBhY2l0eV9rbm93bl8gJiYKKyAgICAgICAgbnVtX2J5dGVzICsgZGF0YV9hc19zdHJpbmdfLnNpemUoKSA+PSBkYXRhX2FzX3N0cmluZ18uY2FwYWNpdHkoKSkgeworICAgICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJEYXRhIHdyaXR0ZW4gaXMgbGFyZ2VyIHRoYW4gdGhlIHByZXNldCBjYXBhY2l0eSAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZGF0YV9hc19zdHJpbmdfLmNhcGFjaXR5KCk7CisgICAgfQorICAgIGRhdGFfYXNfc3RyaW5nXy5hcHBlbmQoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlciksIG51bV9ieXRlcyk7CisgICAgcmV0dXJuOworICB9CisKKyAgRENIRUNLX0VRKHR5cGVfLCBrQXJyYXlCdWZmZXIpOworICBpZiAoZGF0YV9hc19hcnJheV9idWZmZXJfc2l6ZV8gKyBudW1fYnl0ZXMgPgorICAgICAgZGF0YV9hc19hcnJheV9idWZmZXJfLmJ5dGVfbGVuZ3RoKCkpIHsKKyAgICBpZiAoY2FwYWNpdHlfa25vd25fKSB7CisgICAgICBTQl9MT0coV0FSTklORykgPDwgIkRhdGEgd3JpdHRlbiBpcyBsYXJnZXIgdGhhbiB0aGUgcHJlc2V0IGNhcGFjaXR5ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBkYXRhX2FzX2FycmF5X2J1ZmZlcl8uYnl0ZV9sZW5ndGgoKTsKKyAgICB9CisgICAgZGF0YV9hc19hcnJheV9idWZmZXJfLlJlc2l6ZShkYXRhX2FzX2FycmF5X2J1ZmZlcl9zaXplXyArIG51bV9ieXRlcyk7CisgIH0KKworICBhdXRvIGRlc3RpbmF0aW9uID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRhdGFfYXNfYXJyYXlfYnVmZmVyXy5kYXRhKCkpICsKKyAgICAgICAgICAgICAgICAgICAgIGRhdGFfYXNfYXJyYXlfYnVmZmVyX3NpemVfOworICBTYk1lbW9yeUNvcHkoZGVzdGluYXRpb24sIGJ1ZmZlciwgbnVtX2J5dGVzKTsKKyAgZGF0YV9hc19hcnJheV9idWZmZXJfc2l6ZV8gKz0gbnVtX2J5dGVzOworfQorCitzaXplX3QgVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXI6OkdldFNpemVfTG9ja2VkKCkgY29uc3QgeworICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOworCisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIGtTdHJpbmc6CisgICAgICByZXR1cm4gZGF0YV9hc19zdHJpbmdfLnNpemUoKTsKKyAgICBjYXNlIGtBcnJheUJ1ZmZlcjoKKyAgICAgIHJldHVybiBkYXRhX2FzX2FycmF5X2J1ZmZlcl9zaXplXzsKKyAgfQorICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiAwOworfQorCit2b2lkIFVSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6QnVmZmVyOjpVcGRhdGVUeXBlX0xvY2tlZChUeXBlIHR5cGUpIHsKKyAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKKworICBpZiAodHlwZV8gPT0gdHlwZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDSyhhbGxvd193cml0ZV8pOworCisgIERMT0dfSUYoV0FSTklORywgR2V0U2l6ZV9Mb2NrZWQoKSA+IDApCisgICAgICA8PCAiQ2hhbmdlIHJlc3BvbnNlIHR5cGUgZnJvbSAiIDw8IHR5cGVfIDw8ICIgdG8gIiA8PCB0eXBlCisgICAgICA8PCAiIGFmdGVyIHJlc3BvbnNlIGlzIHN0YXJ0ZWQsIHdoaWNoIGlzIGxlc3MgZWZmaWNpZW50LiI7CisKKyAgaWYgKHR5cGVfID09IGtTdHJpbmcpIHsKKyAgICBEQ0hFQ0tfRVEodHlwZSwga0FycmF5QnVmZmVyKTsKKyAgICBEQ0hFQ0tfRVEoZGF0YV9hc19hcnJheV9idWZmZXJfc2l6ZV8sIDB1KTsKKyAgICBEQ0hFQ0tfRVEoZGF0YV9hc19hcnJheV9idWZmZXJfLmJ5dGVfbGVuZ3RoKCksIDB1KTsKKyAgfSBlbHNlIHsKKyAgICBEQ0hFQ0tfRVEodHlwZV8sIGtBcnJheUJ1ZmZlcik7CisgICAgRENIRUNLX0VRKHR5cGUsIGtTdHJpbmcpOworICAgIERDSEVDS19FUShkYXRhX2FzX3N0cmluZ18uc2l6ZSgpLCAwdSk7CisgIH0KKworICB0eXBlXyA9IHR5cGU7CisKKyAgaWYgKHR5cGUgPT0ga0FycmF5QnVmZmVyKSB7CisgICAgZGF0YV9hc19hcnJheV9idWZmZXJfLlJlc2l6ZShkYXRhX2FzX3N0cmluZ18uY2FwYWNpdHkoKSk7CisgICAgZGF0YV9hc19hcnJheV9idWZmZXJfc2l6ZV8gPSBkYXRhX2FzX3N0cmluZ18uc2l6ZSgpOworICAgIFNiTWVtb3J5Q29weShkYXRhX2FzX2FycmF5X2J1ZmZlcl8uZGF0YSgpLCBkYXRhX2FzX3N0cmluZ18uZGF0YSgpLAorICAgICAgICAgICAgICAgICBkYXRhX2FzX2FycmF5X2J1ZmZlcl9zaXplXyk7CisKKyAgICBSZWxlYXNlTWVtb3J5KCZkYXRhX2FzX3N0cmluZ18pOworICAgIFJlbGVhc2VNZW1vcnkoJmNvcHlfb2ZfZGF0YV9hc19zdHJpbmdfKTsKKyAgICByZXR1cm47CisgIH0KKworICBkYXRhX2FzX3N0cmluZ18ucmVzZXJ2ZShkYXRhX2FzX2FycmF5X2J1ZmZlcl8uYnl0ZV9sZW5ndGgoKSk7CisgIGRhdGFfYXNfc3RyaW5nXy5hcHBlbmQoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGFfYXNfYXJyYXlfYnVmZmVyXy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfYXNfYXJyYXlfYnVmZmVyX3NpemVfKTsKKworICBSZWxlYXNlTWVtb3J5KCZkYXRhX2FzX2FycmF5X2J1ZmZlcl8pOworICBkYXRhX2FzX2FycmF5X2J1ZmZlcl9zaXplXyA9IDA7Cit9CisKK1VSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6VVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyPiYgYnVmZmVyKQorICAgIDogYnVmZmVyXyhidWZmZXIpIHsKKyAgRENIRUNLKGJ1ZmZlcl8pOworfQorCitVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6On5VUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXIoKSA9IGRlZmF1bHQ7CisKK2ludCBVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6OkluaXRpYWxpemUoCisgICAgbmV0OjpDb21wbGV0aW9uT25jZUNhbGxiYWNrIC8qY2FsbGJhY2sqLykgeworICByZXR1cm4gbmV0OjpPSzsKK30KKwordm9pZCBVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6Ok9uUmVzcG9uc2VTdGFydGVkKGludDY0X3QgY29udGVudF9sZW5ndGgpIHsKKyAgYnVmZmVyXy0+TWF5YmVQcmVhbGxvY2F0ZShjb250ZW50X2xlbmd0aCk7Cit9CisKK2ludCBVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6OldyaXRlKG5ldDo6SU9CdWZmZXIqIGJ1ZmZlciwgaW50IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldDo6Q29tcGxldGlvbk9uY2VDYWxsYmFjayAvKmNhbGxiYWNrKi8pIHsKKyAgYnVmZmVyXy0+V3JpdGUoYnVmZmVyLT5kYXRhKCksIG51bV9ieXRlcyk7CisgIHJldHVybiBudW1fYnl0ZXM7Cit9CisKK2ludCBVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6OkZpbmlzaChpbnQgLypuZXRfZXJyb3IqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXQ6OkNvbXBsZXRpb25PbmNlQ2FsbGJhY2sgLypjYWxsYmFjayovKSB7CisgIHJldHVybiBuZXQ6Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgeGhyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci91cmxfZmV0Y2hlcl9idWZmZXJfd3JpdGVyLmggYi9zcmMvY29iYWx0L3hoci91cmxfZmV0Y2hlcl9idWZmZXJfd3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyY2UzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQveGhyL3VybF9mZXRjaGVyX2J1ZmZlcl93cml0ZXIuaApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfWEhSX1VSTF9GRVRDSEVSX0JVRkZFUl9XUklURVJfSF8KKyNkZWZpbmUgQ09CQUxUX1hIUl9VUkxfRkVUQ0hFUl9CVUZGRVJfV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgorI2luY2x1ZGUgImJhc2UvdGFza19ydW5uZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2FycmF5X2J1ZmZlci5oIgorI2luY2x1ZGUgIm5ldC9iYXNlL2lvX2J1ZmZlci5oIgorI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9yZXNwb25zZV93cml0ZXIuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgeGhyIHsKKworY2xhc3MgVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyIDogcHVibGljIG5ldDo6VVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyIHsKKyBwdWJsaWM6CisgIGNsYXNzIEJ1ZmZlciA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxCdWZmZXI+IHsKKyAgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHNjcmlwdDo6UHJlYWxsb2NhdGVkQXJyYXlCdWZmZXJEYXRhIFByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YTsKKworICAgIGVudW0gVHlwZSB7CisgICAgICBrU3RyaW5nLAorICAgICAga0FycmF5QnVmZmVyLAorICAgIH07CisKKyAgICBleHBsaWNpdCBCdWZmZXIoVHlwZSB0eXBlKTsKKworICAgIHZvaWQgRGlzYWJsZVByZWFsbG9jYXRlKCk7CisgICAgdm9pZCBDbGVhcigpOworCisgICAgaW50NjRfdCBHZXRBbmRSZXNldERvd25sb2FkUHJvZ3Jlc3MoKTsKKyAgICBib29sIEhhc1Byb2dyZXNzU2luY2VMYXN0R2V0QW5kUmVzZXQoKSBjb25zdDsKKworICAgIC8vIFdoZW4gdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBjYWxsZWQsIFdyaXRlKCkgY2FuIG5vIGxvbmdlciBiZSBjYWxsZWQgdG8KKyAgICAvLyBhcHBlbmQgbW9yZSBkYXRhLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8KKyAgICAvLyBlbnN1cmUgc3VjaCBiZWhhdmlvci4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgR2V0UmVmZXJlbmNlT2ZTdHJpbmdBbmRTZWFsKCk7CisgICAgLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHN0ZDo6c3RyaW5nIGNvbnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBkYXRhCisgICAgLy8gZG93bmxvYWRlZCBzbyBmYXIuICBUaGUgcmVmZXJlbmNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgdW50aWwgYW5vdGhlcgorICAgIC8vIHB1YmxpYyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIHRoaXMgb2JqZWN0LgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRUZW1wb3JhcnlSZWZlcmVuY2VPZlN0cmluZygpOworCisgICAgdm9pZCBHZXRBbmRSZXNldChzdGQ6OnN0cmluZyogc3RyKTsKKyAgICB2b2lkIEdldEFuZFJlc2V0KFByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YSogZGF0YSk7CisKKyAgICB2b2lkIE1heWJlUHJlYWxsb2NhdGUoaW50NjRfdCBjYXBhY2l0eSk7CisgICAgdm9pZCBXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsIGludCBudW1fYnl0ZXMpOworCisgICBwcml2YXRlOgorICAgIHNpemVfdCBHZXRTaXplX0xvY2tlZCgpIGNvbnN0OworCisgICAgLy8gSXQgaXMgcG9zc2libGUgKGJ1dCBleHRyZW1lbHkgcmFyZSkgdGhhdCBKUyBhcHAgY2hhbmdlcyByZXNwb25zZSB0eXBlCisgICAgLy8gYWZ0ZXIgc29tZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gb24gdGhlIG5ldHdvcmsgdGhyZWFkLCBpbiBzdWNoIGNhc2Ugd2UKKyAgICAvLyBhbGxvdyB0byBjaGFuZ2UgdGhlIGJ1ZmZlciB0eXBlIGR5bmFtaWNhbGx5LgorICAgIHZvaWQgVXBkYXRlVHlwZV9Mb2NrZWQoVHlwZSB0eXBlKTsKKworICAgIFR5cGUgdHlwZV87CisgICAgYm9vbCBhbGxvd19wcmVhbGxvY2F0ZV8gPSB0cnVlOworICAgIGJvb2wgY2FwYWNpdHlfa25vd25fID0gZmFsc2U7CisKKyAgICAvLyBUaGlzIGNsYXNzIGNhbiBiZSBhY2Nlc3NlZCBieSBib3RoIG5ldHdvcmsgYW5kIE1haW5XZWJNb2R1bGUgdGhyZWFkcy4KKyAgICBtdXRhYmxlIGJhc2U6OkxvY2sgbG9ja187CisKKyAgICBib29sIGFsbG93X3dyaXRlXyA9IHRydWU7CisgICAgc2l6ZV90IGRvd25sb2FkX3Byb2dyZXNzXyA9IDA7CisKKyAgICAvLyBEYXRhIGlzIHN0b3JlZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBidWZmZXJzLCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZgorICAgIC8vIHx0eXBlX3wuCisgICAgc3RkOjpzdHJpbmcgZGF0YV9hc19zdHJpbmdfOworICAgIC8vIEZvciB1c2UgaW4gR2V0UmVmZXJlbmNlT2ZTdHJpbmcoKSBzbyBpdCBjYW4gcmV0dXJuIGEgcmVmZXJlbmNlLgorICAgIHN0ZDo6c3RyaW5nIGNvcHlfb2ZfZGF0YV9hc19zdHJpbmdfOworICAgIFByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YSBkYXRhX2FzX2FycmF5X2J1ZmZlcl87CisgICAgc2l6ZV90IGRhdGFfYXNfYXJyYXlfYnVmZmVyX3NpemVfID0gMDsKKyAgfTsKKworICBleHBsaWNpdCBVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBidWZmZXIpOworICB+VVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyIG92ZXJyaWRlczoKKyAgaW50IEluaXRpYWxpemUobmV0OjpDb21wbGV0aW9uT25jZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKKyAgdm9pZCBPblJlc3BvbnNlU3RhcnRlZChpbnQ2NF90IGNvbnRlbnRfbGVuZ3RoKSBvdmVycmlkZTsKKyAgaW50IFdyaXRlKG5ldDo6SU9CdWZmZXIqIGJ1ZmZlciwgaW50IG51bV9ieXRlcywKKyAgICAgICAgICAgIG5ldDo6Q29tcGxldGlvbk9uY2VDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CisgIGludCBGaW5pc2goaW50IG5ldF9lcnJvciwgbmV0OjpDb21wbGV0aW9uT25jZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBidWZmZXJfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHhocgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9YSFJfVVJMX0ZFVENIRVJfQlVGRkVSX1dSSVRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC94aHIveGhyLmd5cCBiL3NyYy9jb2JhbHQveGhyL3hoci5neXAKaW5kZXggZWZmNzJlNy4uODZjMDI5ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC94aHIveGhyLmd5cAorKysgYi9zcmMvY29iYWx0L3hoci94aHIuZ3lwCkBAIC0yMSw2ICsyMSw4IEBACiAgICAgICAndGFyZ2V0X25hbWUnOiAneGhyJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAndXJsX2ZldGNoZXJfYnVmZmVyX3dyaXRlci5jYycsCisgICAgICAgICd1cmxfZmV0Y2hlcl9idWZmZXJfd3JpdGVyLmgnLAogICAgICAgICAneGhyX3Jlc3BvbnNlX2RhdGEuY2MnLAogICAgICAgICAneGhyX3Jlc3BvbnNlX2RhdGEuaCcsCiAgICAgICAgICd4bWxfaHR0cF9yZXF1ZXN0LmNjJywKQEAgLTYyLDcgKzY0LDYgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAneGhyJywKQEAgLTcxLDYgKzcyLDcgQEAKICAgICAgICAgIyAgICAgICBTY3JpcHRWYWx1ZUZhY3RvcnkgaGFzIG5vbi12aXJ0dWFsIG1ldGhvZCBDcmVhdGVQcm9taXNlKCkuCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc2NyaXB0L2VuZ2luZS5neXA6ZW5naW5lJywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cGknIF0sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAneGhyX3Rlc3RfZGVwbG95JywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuY2MgYi9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmNjCmluZGV4IGRlOTVjYzQuLjBhZTcwN2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdC5jYwpAQCAtNTEsMTAgKzUxLDYgQEAKIC8vIEhvdyBtYW55IG1pbGxpc2Vjb25kcyBtdXN0IGVsYXBzZSBiZXR3ZWVuIGVhY2ggcHJvZ3Jlc3MgZXZlbnQgbm90aWZpY2F0aW9uLgogY29uc3QgaW50IGtQcm9ncmVzc1BlcmlvZE1zID0gNTA7CiAKLS8vIEFsbG9jYXRlIDY0S0Igb24gcmVjZWl2aW5nIHRoZSBmaXJzdCBjaHVuayB0byBhdm9pZCBhbGxvY2F0aW5nIHNtYWxsIGJ1ZmZlcgotLy8gdG9vIG1hbnkgdGltZXMuCi1jb25zdCBzaXplX3Qga0luaXRpYWxSZWNlaXZpbmdCdWZmZXJTaXplID0gNjQgKiAxMDI0OwotCiBjb25zdCBjaGFyKiBrUmVzcG9uc2VUeXBlc1tdID0gewogICAgICIiLCAgICAgICAgICAgICAvLyBrRGVmYXVsdAogICAgICJ0ZXh0IiwgICAgICAgICAvLyBrVGV4dApAQCAtMTY4LDYgKzE2NCw4IEBACiAKIFhNTEh0dHBSZXF1ZXN0OjpYTUxIdHRwUmVxdWVzdChzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzKQogICAgIDogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldChzZXR0aW5ncyksCisgICAgICByZXNwb25zZV9ib2R5XyhuZXcgVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXIoCisgICAgICAgICAgVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXI6OmtTdHJpbmcpKSwKICAgICAgIHNldHRpbmdzXyhiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxkb206OkRPTVNldHRpbmdzKj4oc2V0dGluZ3MpKSwKICAgICAgIHN0YXRlXyhrVW5zZW50KSwKICAgICAgIHJlc3BvbnNlX3R5cGVfKGtEZWZhdWx0KSwKQEAgLTIwMyw3ICsyMDEsNyBAQAogICB9CiAgIENoYW5nZVN0YXRlKGtVbnNlbnQpOwogCi0gIHJlc3BvbnNlX2JvZHlfLkNsZWFyKCk7CisgIHJlc3BvbnNlX2JvZHlfLT5DbGVhcigpOwogICByZXNwb25zZV9hcnJheV9idWZmZXJfcmVmZXJlbmNlXy5yZXNldCgpOwogfQogCkBAIC00ODUsNyArNDgzLDE0IEBACiAgICAgcmV0dXJuIGJhc2U6OkVtcHR5U3RyaW5nKCk7CiAgIH0KIAotICByZXR1cm4gcmVzcG9uc2VfYm9keV8uc3RyaW5nKCk7CisgIC8vIE5vdGUgdGhhdCB0aGUgY29udmVyc2lvbiBmcm9tIHxyZXNwb25zZV9ib2R5X3wgdG8gc3RkOjpzdHJpbmcgd2hlbiB8c3RhdGVffAorICAvLyBpc24ndCBrRG9uZSBpc24ndCBlZmZpY2llbnQgZm9yIGxhcmdlIHJlc3BvbnNlcy4gIEZvcnR1bmF0ZWx5IHRoaXMgZmVhdHVyZQorICAvLyBpcyByYXJlbHkgdXNlZC4KKyAgaWYgKHN0YXRlXyA9PSBrTG9hZGluZykgeworICAgIExPRyhXQVJOSU5HKSA8PCAiUmV0cmlldmluZyByZXNwb25zZVRleHQgd2hpbGUgbG9hZGluZyBjYW4gYmUgaW5lZmZpY2llbnQuIjsKKyAgICByZXR1cm4gcmVzcG9uc2VfYm9keV8tPkdldFRlbXBvcmFyeVJlZmVyZW5jZU9mU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIHJlc3BvbnNlX2JvZHlfLT5HZXRSZWZlcmVuY2VPZlN0cmluZ0FuZFNlYWwoKTsKIH0KIAogLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTQvV0QtWE1MSHR0cFJlcXVlc3QtMjAxNDAxMzAvI3RoZS1yZXNwb25zZXhtbC1hdHRyaWJ1dGUKQEAgLTY1OSwxOSArNjY0LDYgQEAKICAgICBmZXRjaF9tb2RlX2NhbGxiYWNrXy0+dmFsdWUoKS5SdW4oaXNfY3Jvc3Nfb3JpZ2luXyk7CiAgIH0KIAotICAvLyBSZXNlcnZlIHNwYWNlIGZvciB0aGUgY29udGVudCBpbiB0aGUgY2FzZSBvZiBhIHJlZ3VsYXIgWEhSIHJlcXVlc3QuCi0gIERDSEVDS19FUShyZXNwb25zZV9ib2R5Xy5zaXplKCksIDB1KTsKLSAgaWYgKCFmZXRjaF9jYWxsYmFja18pIHsKLSAgICBjb25zdCBpbnQ2NCBjb250ZW50X2xlbmd0aCA9IGh0dHBfcmVzcG9uc2VfaGVhZGVyc18tPkdldENvbnRlbnRMZW5ndGgoKTsKLQotICAgIC8vIElmIHdlIGtub3cgdGhlIGV2ZW50dWFsIGNvbnRlbnQgbGVuZ3RoLCBhbGxvY2F0ZSB0aGUgdG90YWwgcmVzcG9uc2UgYm9keS4KLSAgICAvLyBPdGhlcndpc2UganVzdCByZXNlcnZlIGEgcmVhc29uYWJseSBsYXJnZSBpbml0aWFsIGNodW5rLgotICAgIHNpemVfdCBieXRlc190b19yZXNlcnZlID0gY29udGVudF9sZW5ndGggPiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxzaXplX3Q+KGNvbnRlbnRfbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0luaXRpYWxSZWNlaXZpbmdCdWZmZXJTaXplOwotICAgIHJlc3BvbnNlX2JvZHlfLlJlc2VydmUoYnl0ZXNfdG9fcmVzZXJ2ZSk7Ci0gIH0KLQogICAvLyBGdXJ0aGVyIGZpbHRlciByZXNwb25zZSBoZWFkZXJzIGFzIFhIUidzIG1vZGUgaXMgY29ycwogICBpZiAoaXNfY3Jvc3Nfb3JpZ2luXykgewogICAgIHNpemVfdCBpdGVyID0gMDsKQEAgLTcwNyw3ICs2OTksNyBAQAogCiAgIENoYW5nZVN0YXRlKGtIZWFkZXJzUmVjZWl2ZWQpOwogCi0gIFVwZGF0ZVByb2dyZXNzKCk7CisgIFVwZGF0ZVByb2dyZXNzKDApOwogfQogCiB2b2lkIFhNTEh0dHBSZXF1ZXN0OjpPblVSTEZldGNoRG93bmxvYWRQcm9ncmVzcygKQEAgLTcxNywyNyArNzA5LDE5IEBACiAgIERDSEVDS19DQUxMRURfT05fVkFMSURfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CiAgIERDSEVDS19ORShzdGF0ZV8sIGtEb25lKTsKIAotICBhdXRvKiBkb3dubG9hZF9kYXRhX3dyaXRlciA9Ci0gICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxsb2FkZXI6OlVSTEZldGNoZXJTdHJpbmdXcml0ZXIqPigKLSAgICAgICAgICBzb3VyY2UtPkdldFJlc3BvbnNlV3JpdGVyKCkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRvd25sb2FkX2RhdGEgPSBkb3dubG9hZF9kYXRhX3dyaXRlci0+ZGF0YSgpOwotICBpZiAoIWRvd25sb2FkX2RhdGEuZ2V0KCkgfHwgZG93bmxvYWRfZGF0YS0+ZW1wdHkoKSkgeworICBpZiAocmVzcG9uc2VfYm9keV8tPkhhc1Byb2dyZXNzU2luY2VMYXN0R2V0QW5kUmVzZXQoKSA9PSAwKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIC8vIFByZXNlcnZlIHRoZSByZXNwb25zZSBib2R5IG9ubHkgZm9yIHJlZ3VsYXIgWEhSIHJlcXVlc3RzLiBGZXRjaCByZXF1ZXN0cwotICAvLyBwcm9jZXNzIHRoZSByZXNwb25zZSBpbiBwaWVjZXMsIHNvIGRvIG5vdCBuZWVkIHRvIGtlZXAgdGhlIHdob2xlIHJlc3BvbnNlLgotICBpZiAoIWZldGNoX2NhbGxiYWNrXykgewotICAgIHJlc3BvbnNlX2JvZHlfLkFwcGVuZChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oZG93bmxvYWRfZGF0YS0+ZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGF0YS0+c2l6ZSgpKTsKLSAgfQogCiAgIC8vIFNpZ25hbCB0byBKYXZhU2NyaXB0IHRoYXQgbmV3IGRhdGEgaXMgbm93IGF2YWlsYWJsZS4KICAgQ2hhbmdlU3RhdGUoa0xvYWRpbmcpOwogCiAgIGlmIChmZXRjaF9jYWxsYmFja18pIHsKKyAgICBzdGQ6OnN0cmluZyBkb3dubG9hZGVkX2RhdGE7CisgICAgcmVzcG9uc2VfYm9keV8tPkdldEFuZFJlc2V0KCZkb3dubG9hZGVkX2RhdGEpOwogICAgIHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6VWludDhBcnJheT4gZGF0YSA9CiAgICAgICAgIHNjcmlwdDo6VWludDhBcnJheTo6TmV3KHNldHRpbmdzXy0+Z2xvYmFsX2Vudmlyb25tZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RhdGEtPmRhdGEoKSwgZG93bmxvYWRfZGF0YS0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZF9kYXRhLmRhdGEoKSwgZG93bmxvYWRlZF9kYXRhLnNpemUoKSk7CiAgICAgZmV0Y2hfY2FsbGJhY2tfLT52YWx1ZSgpLlJ1bihkYXRhKTsKICAgfQogCkBAIC03NDYsNyArNzMwLDkgQEAKICAgY29uc3QgYmFzZTo6VGltZURlbHRhIGVsYXBzZWQobm93IC0gbGFzdF9wcm9ncmVzc190aW1lXyk7CiAgIGlmIChlbGFwc2VkID4gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGtQcm9ncmVzc1BlcmlvZE1zKSkgewogICAgIGxhc3RfcHJvZ3Jlc3NfdGltZV8gPSBub3c7Ci0gICAgVXBkYXRlUHJvZ3Jlc3MoKTsKKyAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB3ZSBoYXZlIHRvIGZpcmUgcHJvZ3Jlc3MgZXZlbnQgd2l0aCAwIGxvYWRlZCBieXRlcworICAgIC8vIHdoZW4gdXNlZCBhcyBGZXRjaCBBUEkuCisgICAgVXBkYXRlUHJvZ3Jlc3MocmVzcG9uc2VfYm9keV8tPkdldEFuZFJlc2V0RG93bmxvYWRQcm9ncmVzcygpKTsKICAgfQogfQogCkBAIC03ODcsNyArNzczLDcgQEAKICAgICAgIEZpcmVQcm9ncmVzc0V2ZW50KHVwbG9hZF8sIGJhc2U6OlRva2Vuczo6bG9hZGVuZCgpKTsKICAgICB9CiAgICAgQ2hhbmdlU3RhdGUoa0RvbmUpOwotICAgIFVwZGF0ZVByb2dyZXNzKCk7CisgICAgVXBkYXRlUHJvZ3Jlc3MocmVzcG9uc2VfYm9keV8tPkdldEFuZFJlc2V0RG93bmxvYWRQcm9ncmVzcygpKTsKICAgICAvLyBVbmRvIHRoZSByZWYgd2UgYWRkZWQgaW4gU2VuZCgpCiAgICAgRGVjcmVtZW50QWN0aXZlUmVxdWVzdHMoKTsKICAgfSBlbHNlIHsKQEAgLTEwMzgsMTMgKzEwMjQsMTQgQEAKICAgICAvLyBUaGUgcmVxdWVzdCBpcyBkb25lIHNvIGl0IGlzIHNhZmUgdG8gb25seSBrZWVwIHRoZSBBcnJheUJ1ZmZlciBhbmQgY2xlYXIKICAgICAvLyB8cmVzcG9uc2VfYm9keV98LiAgQXMgfHJlc3BvbnNlX2JvZHlffCB3aWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUKICAgICAvLyByZXF1ZXN0IGlzIHJlLW9wZW5lZC4KLSAgICBhdXRvIGFycmF5X2J1ZmZlciA9Ci0gICAgICAgIHNjcmlwdDo6QXJyYXlCdWZmZXI6Ok5ldyhzZXR0aW5nc18tPmdsb2JhbF9lbnZpcm9ubWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfYm9keV8uZGF0YSgpLCByZXNwb25zZV9ib2R5Xy5zaXplKCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlByZWFsbG9jYXRlZEFycmF5QnVmZmVyRGF0YT4gZG93bmxvYWRlZF9kYXRhKAorICAgICAgICBuZXcgc2NyaXB0OjpQcmVhbGxvY2F0ZWRBcnJheUJ1ZmZlckRhdGEoKSk7CisgICAgcmVzcG9uc2VfYm9keV8tPkdldEFuZFJlc2V0KGRvd25sb2FkZWRfZGF0YS5nZXQoKSk7CisgICAgYXV0byBhcnJheV9idWZmZXIgPSBzY3JpcHQ6OkFycmF5QnVmZmVyOjpOZXcoCisgICAgICAgIHNldHRpbmdzXy0+Z2xvYmFsX2Vudmlyb25tZW50KCksIHN0ZDo6bW92ZShkb3dubG9hZGVkX2RhdGEpKTsKICAgICByZXNwb25zZV9hcnJheV9idWZmZXJfcmVmZXJlbmNlXy5yZXNldCgKICAgICAgICAgbmV3IHNjcmlwdDo6U2NyaXB0VmFsdWU8c2NyaXB0OjpBcnJheUJ1ZmZlcj46OlJlZmVyZW5jZSh0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2J1ZmZlcikpOwotICAgIHJlc3BvbnNlX2JvZHlfLkNsZWFyKCk7CiAgICAgcmV0dXJuIGFycmF5X2J1ZmZlcjsKICAgfSBlbHNlIHsKICAgICByZXR1cm4gc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpBcnJheUJ1ZmZlcj4oCkBAIC0xMDUyLDEwICsxMDM5LDkgQEAKICAgfQogfQogCi12b2lkIFhNTEh0dHBSZXF1ZXN0OjpVcGRhdGVQcm9ncmVzcygpIHsKK3ZvaWQgWE1MSHR0cFJlcXVlc3Q6OlVwZGF0ZVByb2dyZXNzKGludDY0X3QgcmVjZWl2ZWRfbGVuZ3RoKSB7CiAgIERDSEVDSyhodHRwX3Jlc3BvbnNlX2hlYWRlcnNfKTsKICAgY29uc3QgaW50NjQgY29udGVudF9sZW5ndGggPSBodHRwX3Jlc3BvbnNlX2hlYWRlcnNfLT5HZXRDb250ZW50TGVuZ3RoKCk7Ci0gIGNvbnN0IGludDY0IHJlY2VpdmVkX2xlbmd0aCA9IHN0YXRpY19jYXN0PGludDY0PihyZXNwb25zZV9ib2R5Xy5zaXplKCkpOwogICBjb25zdCBib29sIGxlbmd0aF9jb21wdXRhYmxlID0KICAgICAgIGNvbnRlbnRfbGVuZ3RoID4gMCAmJiByZWNlaXZlZF9sZW5ndGggPD0gY29udGVudF9sZW5ndGg7CiAgIGNvbnN0IHVpbnQ2NCB0b3RhbCA9CkBAIC0xMTExLDE1ICsxMDk3LDI0IEBACiB2b2lkIFhNTEh0dHBSZXF1ZXN0OjpTdGFydFJlcXVlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHJlcXVlc3RfYm9keSkgewogICBUUkFDS19NRU1PUllfU0NPUEUoIlhIUiIpOwogCi0gIHJlc3BvbnNlX2JvZHlfLkNsZWFyKCk7CiAgIHJlc3BvbnNlX2FycmF5X2J1ZmZlcl9yZWZlcmVuY2VfLnJlc2V0KCk7CiAKICAgbmV0d29yazo6TmV0d29ya01vZHVsZSogbmV0d29ya19tb2R1bGUgPQogICAgICAgc2V0dGluZ3NfLT5mZXRjaGVyX2ZhY3RvcnkoKS0+bmV0d29ya19tb2R1bGUoKTsKICAgdXJsX2ZldGNoZXJfID0gbmV0OjpVUkxGZXRjaGVyOjpDcmVhdGUocmVxdWVzdF91cmxfLCBtZXRob2RfLCB0aGlzKTsKICAgdXJsX2ZldGNoZXJfLT5TZXRSZXF1ZXN0Q29udGV4dChuZXR3b3JrX21vZHVsZS0+dXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIoKSk7CisgIGlmIChmZXRjaF9jYWxsYmFja18pIHsKKyAgICByZXNwb25zZV9ib2R5XyA9IG5ldyBVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6OkJ1ZmZlcigKKyAgICAgICAgVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXI6OmtTdHJpbmcpOworICAgIHJlc3BvbnNlX2JvZHlfLT5EaXNhYmxlUHJlYWxsb2NhdGUoKTsKKyAgfSBlbHNlIHsKKyAgICByZXNwb25zZV9ib2R5XyA9IG5ldyBVUkxGZXRjaGVyUmVzcG9uc2VXcml0ZXI6OkJ1ZmZlcigKKyAgICAgICAgcmVzcG9uc2VfdHlwZV8gPT0ga0FycmF5QnVmZmVyCisgICAgICAgICAgICA/IFVSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6QnVmZmVyOjprQXJyYXlCdWZmZXIKKyAgICAgICAgICAgIDogVVJMRmV0Y2hlclJlc3BvbnNlV3JpdGVyOjpCdWZmZXI6OmtTdHJpbmcpOworICB9CiAgIHN0ZDo6dW5pcXVlX3B0cjxuZXQ6OlVSTEZldGNoZXJSZXNwb25zZVdyaXRlcj4gZG93bmxvYWRfZGF0YV93cml0ZXIoCi0gICAgICBuZXcgbG9hZGVyOjpVUkxGZXRjaGVyU3RyaW5nV3JpdGVyKCkpOworICAgICAgbmV3IFVSTEZldGNoZXJSZXNwb25zZVdyaXRlcihyZXNwb25zZV9ib2R5XykpOwogICB1cmxfZmV0Y2hlcl8tPlNhdmVSZXNwb25zZVdpdGhXcml0ZXIoc3RkOjptb3ZlKGRvd25sb2FkX2RhdGFfd3JpdGVyKSk7CiAgIC8vIERvbid0IHJldHJ5LCBsZXQgdGhlIGNhbGxlciBkZWFsIHdpdGggaXQuCiAgIHVybF9mZXRjaGVyXy0+U2V0QXV0b21hdGljYWxseVJldHJ5T241eHgoZmFsc2UpOwpAQCAtMTE5Nyw5ICsxMTkyLDExIEBACiAgICAgICAoeGhyLnJlc3BvbnNlX3R5cGVfID09IFhNTEh0dHBSZXF1ZXN0OjprRGVmYXVsdCB8fAogICAgICAgIHhoci5yZXNwb25zZV90eXBlXyA9PSBYTUxIdHRwUmVxdWVzdDo6a1RleHQpKSB7CiAgICAgc2l6ZV90IGtNYXhTaXplID0gNDA5NjsKLSAgICByZXNwb25zZV90ZXh0ID0gYmFzZTo6U3RyaW5nUGllY2UoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHhoci5yZXNwb25zZV9ib2R5Xy5kYXRhKCkpLAotICAgICAgICBzdGQ6Om1pbihrTWF4U2l6ZSwgeGhyLnJlc3BvbnNlX2JvZHlfLnNpemUoKSkpOworICAgIGNvbnN0IGF1dG8mIHJlc3BvbnNlX2JvZHkgPQorICAgICAgICB4aHIucmVzcG9uc2VfYm9keV8tPkdldFRlbXBvcmFyeVJlZmVyZW5jZU9mU3RyaW5nKCk7CisgICAgcmVzcG9uc2VfdGV4dCA9CisgICAgICAgIGJhc2U6OlN0cmluZ1BpZWNlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlX2JvZHkuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptaW4oa01heFNpemUsIHJlc3BvbnNlX2JvZHkuc2l6ZSgpKSk7CiAgIH0KIAogICBzdGQ6OnN0cmluZyB4aHJfb3V0ID0gYmFzZTo6U3RyaW5nUHJpbnRmKApAQCAtMTIzMSw2ICsxMjI4LDggQEAKIAogLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTQvV0QtWE1MSHR0cFJlcXVlc3QtMjAxNDAxMzAvI2RvY3VtZW50LXJlc3BvbnNlLWVudGl0eS1ib2R5CiBzY29wZWRfcmVmcHRyPGRvbTo6RG9jdW1lbnQ+IFhNTEh0dHBSZXF1ZXN0OjpHZXREb2N1bWVudFJlc3BvbnNlRW50aXR5Qm9keSgpIHsKKyAgRENIRUNLX0VRKHN0YXRlXywga0RvbmUpOworCiAgIC8vIFN0ZXAgMS4uNQogICBjb25zdCBzdGQ6OnN0cmluZyBmaW5hbF9taW1lX3R5cGUgPQogICAgICAgbWltZV90eXBlX292ZXJyaWRlXy5lbXB0eSgpID8gcmVzcG9uc2VfbWltZV90eXBlXyA6IG1pbWVfdHlwZV9vdmVycmlkZV87CkBAIC0xMjUwLDggKzEyNDksOCBAQAogICAgICAgYmFzZTo6QmluZCgmWE1MSHR0cFJlcXVlc3Q6OlhNTERlY29kZXJMb2FkQ29tcGxldGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwogICBoYXNfeG1sX2RlY29kZXJfZXJyb3JfID0gZmFsc2U7Ci0gIHhtbF9kZWNvZGVyLkRlY29kZUNodW5rKHJlc3BvbnNlX2JvZHlfLnN0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX2JvZHlfLnN0cmluZygpLnNpemUoKSk7CisgIHhtbF9kZWNvZGVyLkRlY29kZUNodW5rKHJlc3BvbnNlX2JvZHlfLT5HZXRSZWZlcmVuY2VPZlN0cmluZ0FuZFNlYWwoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZV9ib2R5Xy0+R2V0UmVmZXJlbmNlT2ZTdHJpbmdBbmRTZWFsKCkuc2l6ZSgpKTsKICAgeG1sX2RlY29kZXIuRmluaXNoKCk7CiAgIGlmIChoYXNfeG1sX2RlY29kZXJfZXJyb3JfKSB7CiAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmggYi9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmgKaW5kZXggNmZmMGY3Ni4uNGRkNTM3NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdC5oCisrKyBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuaApAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC90eXBlZF9hcnJheXMuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3VuaW9uX3R5cGUuaCIKLSNpbmNsdWRlICJjb2JhbHQveGhyL3hocl9yZXNwb25zZV9kYXRhLmgiCisjaW5jbHVkZSAiY29iYWx0L3hoci91cmxfZmV0Y2hlcl9idWZmZXJfd3JpdGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X2V2ZW50X3RhcmdldC5oIgogI2luY2x1ZGUgImNvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdF91cGxvYWQuaCIKICNpbmNsdWRlICJuZXQvaHR0cC9odHRwX3JlcXVlc3RfaGVhZGVycy5oIgpAQCAtMjE2LDcgKzIxNiw3IEBACiAgIC8vIFJldHVybiBhcnJheSBidWZmZXIgcmVzcG9uc2UgYm9keSBhcyBhbiBBcnJheUJ1ZmZlci4KICAgc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpBcnJheUJ1ZmZlcj4gcmVzcG9uc2VfYXJyYXlfYnVmZmVyKCk7CiAKLSAgdm9pZCBVcGRhdGVQcm9ncmVzcygpOworICB2b2lkIFVwZGF0ZVByb2dyZXNzKGludDY0X3QgcmVjZWl2ZWRfbGVuZ3RoKTsKIAogICB2b2lkIFN0YXJ0UmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYgcmVxdWVzdF9ib2R5KTsKIApAQCAtMjUzLDcgKzI1Myw3IEBACiAKICAgc3RkOjp1bmlxdWVfcHRyPG5ldDo6VVJMRmV0Y2hlcj4gdXJsX2ZldGNoZXJfOwogICBzY29wZWRfcmVmcHRyPG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycz4gaHR0cF9yZXNwb25zZV9oZWFkZXJzXzsKLSAgWGhyUmVzcG9uc2VEYXRhIHJlc3BvbnNlX2JvZHlfOworICBzY29wZWRfcmVmcHRyPFVSTEZldGNoZXJSZXNwb25zZVdyaXRlcjo6QnVmZmVyPiByZXNwb25zZV9ib2R5XzsKICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6U2NyaXB0VmFsdWU8c2NyaXB0OjpBcnJheUJ1ZmZlcj46OlJlZmVyZW5jZT4KICAgICAgIHJlc3BvbnNlX2FycmF5X2J1ZmZlcl9yZWZlcmVuY2VfOwogICBzY29wZWRfcmVmcHRyPFhNTEh0dHBSZXF1ZXN0VXBsb2FkPiB1cGxvYWRfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvbnRlbnQvYnJvd3Nlci9zcGVlY2gvc3BlZWNoLmd5cCBiL3NyYy9jb250ZW50L2Jyb3dzZXIvc3BlZWNoL3NwZWVjaC5neXAKaW5kZXggMzk3YjM3Mi4uZTU2MjE3NyAxMDA2NDQKLS0tIGEvc3JjL2NvbnRlbnQvYnJvd3Nlci9zcGVlY2gvc3BlZWNoLmd5cAorKysgYi9zcmMvY29udGVudC9icm93c2VyL3NwZWVjaC9zcGVlY2guZ3lwCkBAIC0zOSwxMiArMzksMTIgQEAKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnc3BlZWNoJywKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDp0ZXN0X3N1cHBvcnRfYmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWEvbWVkaWEuZ3lwOm1lZGlhJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zdGFyYm9hcmQuZ3lwOnN0YXJib2FyZCcsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWyc8KERFUFRIKS9iYXNlL3Rlc3QvdGVzdC5neXBpJ10sCiAgICAgfSwKIAogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY3J5cHRvLmd5cCBiL3NyYy9jcnlwdG8vY3J5cHRvLmd5cAppbmRleCAzNTRkNjg5Li40ODYxMGM2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NyeXB0by5neXAKKysrIGIvc3JjL2NyeXB0by9jcnlwdG8uZ3lwCkBAIC04OCwxMCArODgsMTAgQEAKICAgICAgICAgJ2NyeXB0bycsCiAgICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDp0ZXN0X3N1cHBvcnRfYmFzZScsCi0gICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJzwoREVQVEgpL2Jhc2UvdGVzdC90ZXN0Lmd5cGknXSwKICAgICB9LAogICBdLAogICAnY29uZGl0aW9ucyc6IFsKZGlmZiAtLWdpdCBhL3NyYy9uYi9hbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaW1wbC5jYyBiL3NyYy9uYi9hbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaW1wbC5jYwppbmRleCA1OGVhYjM2Li42YjA4ZWVhIDEwMDY0NAotLS0gYS9zcmMvbmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyX2ltcGwuY2MKKysrIGIvc3JjL25iL2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlcl9pbXBsLmNjCkBAIC0yMzEsNyArMjMxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewogICAvLyBXZSBtaWdodCBkbyBzb21ldGhpbmcgbW9yZSBpbnRlcmVzdGluZyB3aXRoIE1hcE1lbW9yeSBjYWxscyBsYXRlci4KKyAgTWVtb3J5VHJhY2tlckltcGwqIHQgPSBzdGF0aWNfY2FzdDxNZW1vcnlUcmFja2VySW1wbCo+KGNvbnRleHQpOworICB0LT5QdXNoQWxsb2NhdGlvbkdyb3VwQnlOYW1lKCJNYXBwZWQgTWVtb3J5Iik7CiAgIE9uTWFsbG9jKGNvbnRleHQsIG1lbW9yeSwgc2l6ZSk7CisgIHQtPlBvcEFsbG9jYXRpb25Hcm91cCgpOwogfQogCiB2b2lkIE1lbW9yeVRyYWNrZXJJbXBsOjpPblVuTWFwTWVtKHZvaWQqIGNvbnRleHQsCmRpZmYgLS1naXQgYS9zcmMvbmIvZml4ZWRfbm9fZnJlZV9hbGxvY2F0b3IuY2MgYi9zcmMvbmIvZml4ZWRfbm9fZnJlZV9hbGxvY2F0b3IuY2MKaW5kZXggOWM2MDYxNy4uZjRmOGUxYyAxMDA2NDQKLS0tIGEvc3JjL25iL2ZpeGVkX25vX2ZyZWVfYWxsb2NhdG9yLmNjCisrKyBiL3NyYy9uYi9maXhlZF9ub19mcmVlX2FsbG9jYXRvci5jYwpAQCAtMTYsOCArMTYsNiBAQAogCiAjaW5jbHVkZSAibmIvZml4ZWRfbm9fZnJlZV9hbGxvY2F0b3IuaCIKIAotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQogI2luY2x1ZGUgIm5iL3BvaW50ZXJfYXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbG9nLmgiCiAKQEAgLTU0LDggKzUyLDYgQEAKIHZvaWQqIEZpeGVkTm9GcmVlQWxsb2NhdG9yOjpBbGxvY2F0ZShzdGQ6OnNpemVfdCogc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBhbGlnbm1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGlnbl9wb2ludGVyKSB7Ci0gICpzaXplID0gc3RkOjptYXg8c3RkOjpzaXplX3Q+KCpzaXplLCAxKTsKLQogICAvLyBGaW5kIHRoZSBuZXh0IGFsaWduZWQgbWVtb3J5IGF2YWlsYWJsZS4KICAgdWludDhfdCogYWxpZ25lZF9uZXh0X21lbW9yeSA9CiAgICAgICBBc1BvaW50ZXIoQWxpZ25VcChBc0ludGVnZXIobmV4dF9tZW1vcnlfKSwgYWxpZ25tZW50KSk7CmRpZmYgLS1naXQgYS9zcmMvbmIvcmV1c2VfYWxsb2NhdG9yX2Jhc2UuY2MgYi9zcmMvbmIvcmV1c2VfYWxsb2NhdG9yX2Jhc2UuY2MKaW5kZXggMDNlOTkwMy4uOTUxODlhYyAxMDA2NDQKLS0tIGEvc3JjL25iL3JldXNlX2FsbG9jYXRvcl9iYXNlLmNjCisrKyBiL3NyYy9uYi9yZXVzZV9hbGxvY2F0b3JfYmFzZS5jYwpAQCAtMzU4LDE4ICszNTgsNDUgQEAKICAgLy8gYWxsb2NhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB8c2l6ZXwgYW5kIHRoZSBzaXplIG9mIHRoZSByaWdodCBtb3N0IGJsb2NrCiAgIC8vIGluIHRoZSBob3BlIHRoYXQgdGhleSBhcmUgY29udGludW91cyBhbmQgY2FuIGJlIGNvbm5lY3QgdG8gYSBibG9jayB0aGF0IGlzCiAgIC8vIGxhcmdlIGVub3VnaCB0byBmdWxmaWxsIHxzaXplfC4KLSAgc2l6ZV90IHNpemVfZGlmZmVyZW5jZSA9IHNpemUgLSBmcmVlX2Jsb2Nrc18ucmJlZ2luKCktPnNpemUoKTsKLSAgaWYgKG1heF9jYXBhY2l0eV8gJiYgY2FwYWNpdHlfICsgc2l6ZV9kaWZmZXJlbmNlID4gbWF4X2NhcGFjaXR5XykgeworICBzaXplX3QgZnJlZV9hZGRyZXNzID0gQXNJbnRlZ2VyKGZyZWVfYmxvY2tzXy5yYmVnaW4oKS0+YWRkcmVzcygpKTsKKyAgc2l6ZV90IGZyZWVfc2l6ZSA9IGZyZWVfYmxvY2tzXy5yYmVnaW4oKS0+c2l6ZSgpOworICBzaXplX3QgYWxpZ25lZF9hZGRyZXNzID0gQWxpZ25VcChmcmVlX2FkZHJlc3MsIGFsaWdubWVudCk7CisgIC8vIEluIG9yZGVyIHRvIGNhbGN1bGF0ZSB8c2l6ZV90b19hbGxvY2F0ZXwsIHdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdHdvCisgIC8vIHBvc3NpYmxlIHNjZW5hcmlvczogd2hlbiB8YWxpZ25lZF9hZGRyZXNzfCBpcyB3aXRoaW4gdGhlIGZyZWUgYmxvY2sgcmVnaW9uLAorICAvLyBvciB3aGVuIGl0IGlzIGFmdGVyIHRoZSBmcmVlIGJsb2NrIHJlZ2lvbi4KKyAgLy8KKyAgLy8gU2NlbmFyaW8gMToKKyAgLy8KKyAgLy8gfGZyZWVfYWRkcmVzc3wgICAgICB8ZnJlZV9hZGRyZXNzICsgZnJlZV9zaXplfAorICAvLyAgIHwgICAgICAgICAgICAgICAgIHwKKyAgLy8gICB8IDwtIGZyZWVfc2l6ZSAtPiB8IDwtIHNpemVfdG9fYWxsb2NhdGUgLT4gfAorICAvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vICAgICAgICAgICAgICAgfDwtICAgICAgICAgIHNpemUgICAgICAgICAgIC0+IHwKKyAgLy8gICAgICAgICAgICAgICB8CisgIC8vIHxhbGlnbmVkX2FkZHJlc3N8CisgIC8vCisgIC8vIFNjZW5hcmlvIDI6CisgIC8vCisgIC8vIHxmcmVlX2FkZHJlc3N8CisgIC8vICAgfAorICAvLyAgIHwgPC0gZnJlZV9zaXplIC0+IHwgPC0gc2l6ZV90b19hbGxvY2F0ZSAtPiB8CisgIC8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDwtIHNpemUgLT4gfAorICAvLyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAgLy8gfGZyZWVfYWRkcmVzcyArIGZyZWVfc2l6ZXwgIHxhbGlnbmVkX2FkZHJlc3N8CisgIHNpemVfdCBzaXplX3RvX2FsbG9jYXRlID0gYWxpZ25lZF9hZGRyZXNzICsgc2l6ZSAtIGZyZWVfYWRkcmVzcyAtIGZyZWVfc2l6ZTsKKyAgaWYgKG1heF9jYXBhY2l0eV8gJiYgY2FwYWNpdHlfICsgc2l6ZV90b19hbGxvY2F0ZSA+IG1heF9jYXBhY2l0eV8pIHsKICAgICByZXR1cm4gZnJlZV9ibG9ja3NfLmVuZCgpOwogICB9Ci0gIHB0ciA9IGZhbGxiYWNrX2FsbG9jYXRvcl8tPkFsbG9jYXRlRm9yQWxpZ25tZW50KCZzaXplX2RpZmZlcmVuY2UsIGFsaWdubWVudCk7CisgIFNCX0RDSEVDSyhzaXplX3RvX2FsbG9jYXRlID4gMCk7CisgIHB0ciA9IGZhbGxiYWNrX2FsbG9jYXRvcl8tPkFsbG9jYXRlRm9yQWxpZ25tZW50KCZzaXplX3RvX2FsbG9jYXRlLCAxKTsKICAgaWYgKHB0ciA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIGZyZWVfYmxvY2tzXy5lbmQoKTsKICAgfQogCiAgIGZhbGxiYWNrX2FsbG9jYXRpb25zXy5wdXNoX2JhY2socHRyKTsKLSAgY2FwYWNpdHlfICs9IHNpemVfZGlmZmVyZW5jZTsKLSAgQWRkRnJlZUJsb2NrKE1lbW9yeUJsb2NrKHB0ciwgc2l6ZV9kaWZmZXJlbmNlKSk7CisgIGNhcGFjaXR5XyArPSBzaXplX3RvX2FsbG9jYXRlOworICBBZGRGcmVlQmxvY2soTWVtb3J5QmxvY2socHRyLCBzaXplX3RvX2FsbG9jYXRlKSk7CiAgIEZyZWVCbG9ja1NldDo6aXRlcmF0b3IgaXRlciA9IGZyZWVfYmxvY2tzXy5lbmQoKTsKICAgLS1pdGVyOwogICByZXR1cm4gaXRlci0+Q2FuRnVsbGZpbGwoc2l6ZSwgYWxpZ25tZW50KSA/IGl0ZXIgOiBmcmVlX2Jsb2Nrc18uZW5kKCk7CmRpZmYgLS1naXQgYS9zcmMvbmV0L2Jhc2UvaXBfZW5kcG9pbnQuY2MgYi9zcmMvbmV0L2Jhc2UvaXBfZW5kcG9pbnQuY2MKaW5kZXggMWVkMjIxZi4uMDc2ZDQ5YyAxMDA2NDQKLS0tIGEvc3JjL25ldC9iYXNlL2lwX2VuZHBvaW50LmNjCisrKyBiL3NyYy9uZXQvYmFzZS9pcF9lbmRwb2ludC5jYwpAQCAtNTQsNyArNTQsNyBAQAogCiAgICAgZGVmYXVsdDoKICAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9zcmMvbmV0L2NlcnQvaW50ZXJuYWwvdHJ1c3Rfc3RvcmVfaW5fbWVtb3J5X3N0YXJib2FyZC5jYyBiL3NyYy9uZXQvY2VydC9pbnRlcm5hbC90cnVzdF9zdG9yZV9pbl9tZW1vcnlfc3RhcmJvYXJkLmNjCmluZGV4IDNkNTNiMjAuLmUzZjA4NTYgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvY2VydC9pbnRlcm5hbC90cnVzdF9zdG9yZV9pbl9tZW1vcnlfc3RhcmJvYXJkLmNjCisrKyBiL3NyYy9uZXQvY2VydC9pbnRlcm5hbC90cnVzdF9zdG9yZV9pbl9tZW1vcnlfc3RhcmJvYXJkLmNjCkBAIC03NSw4ICs3NSwyMCBAQAogI2VuZGlmCiAgICAgcmV0dXJuIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4oKTsKICAgfQotICBTYkRpcmVjdG9yeUVudHJ5IGRpcl9lbnRyeTsKKwogICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHRydXN0ZWRfY2VydHNfb25fZGlzazsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisgIHN0ZDo6dmVjdG9yPGNoYXI+IGRpcl9lbnRyeShTQl9GSUxFX01BWF9OQU1FKTsKKworICB3aGlsZSAoU2JEaXJlY3RvcnlHZXROZXh0KHNiX2NlcnRzX2RpcmVjdG9yeSwgZGlyX2VudHJ5LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJfZW50cnkuc2l6ZSgpKSkgeworICAgIGlmIChTYlN0cmluZ0dldExlbmd0aChkaXJfZW50cnkuZGF0YSgpKSAhPSBrQ2VydEZpbGVOYW1lTGVuZ3RoKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdHJ1c3RlZF9jZXJ0c19vbl9kaXNrLmVtcGxhY2UoZGlyX2VudHJ5LmRhdGEoKSk7CisgIH0KKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorICBTYkRpcmVjdG9yeUVudHJ5IGRpcl9lbnRyeTsKIAogICB3aGlsZSAoU2JEaXJlY3RvcnlHZXROZXh0KHNiX2NlcnRzX2RpcmVjdG9yeSwgJmRpcl9lbnRyeSkpIHsKICAgICBpZiAoU2JTdHJpbmdHZXRMZW5ndGgoZGlyX2VudHJ5Lm5hbWUpICE9IGtDZXJ0RmlsZU5hbWVMZW5ndGgpIHsKQEAgLTg0LDYgKzk2LDggQEAKICAgICB9CiAgICAgdHJ1c3RlZF9jZXJ0c19vbl9kaXNrLmVtcGxhY2UoZGlyX2VudHJ5Lm5hbWUpOwogICB9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKwogICBTYkRpcmVjdG9yeUNsb3NlKHNiX2NlcnRzX2RpcmVjdG9yeSk7CiAgIHJldHVybiBzdGQ6Om1vdmUodHJ1c3RlZF9jZXJ0c19vbl9kaXNrKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9uZXQvZGlhbC9kaWFsX3VkcF9zZXJ2ZXIuY2MgYi9zcmMvbmV0L2RpYWwvZGlhbF91ZHBfc2VydmVyLmNjCmluZGV4IGFmZmQ5MzQuLmJjYTEwMDUgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvZGlhbC9kaWFsX3VkcF9zZXJ2ZXIuY2MKKysrIGIvc3JjL25ldC9kaWFsL2RpYWxfdWRwX3NlcnZlci5jYwpAQCAtMTQwLDIwICsxNDAsMjMgQEAKICAgLy8gSWYgTS1TZWFyY2ggcmVxdWVzdCB3YXMgdmFsaWQsIHNlbmQgcmVzcG9uc2UuIEVsc2UsIGtlZXAgcXVpZXQuCiAgIGlmIChQYXJzZVNlYXJjaFJlcXVlc3Qoc3RkOjpzdHJpbmcocmVhZF9idWZfLT5kYXRhKCkpKSkgewogICAgIGF1dG8gcmVzcG9uc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPigpOwotICAgICpyZXNwb25zZSA9IENvbnN0cnVjdFNlYXJjaFJlc3BvbnNlKCk7CisgICAgKnJlc3BvbnNlID0gc3RkOjptb3ZlKENvbnN0cnVjdFNlYXJjaFJlc3BvbnNlKCkpOwogICAgIC8vIFVzaW5nIHRoZSBmYWtlIElPQnVmZmVyIHRvIGF2b2lkIGFub3RoZXIgY29weS4KICAgICBzY29wZWRfcmVmcHRyPFdyYXBwZWRJT0J1ZmZlcj4gZmFrZV9idWZmZXIgPQogICAgICAgICBuZXcgV3JhcHBlZElPQnVmZmVyKHJlc3BvbnNlLT5kYXRhKCkpOwogICAgIC8vIEFmdGVyIG9wdGltaXphdGlvbiwgc29tZSBjb21waWxlciB3aWxsIGRlcmVmZXJlbmNlIGFuZCBnZXQgcmVzcG9uc2Ugc2l6ZQogICAgIC8vIGxhdGVyIHRoYW4gcGFzc2luZyByZXNwb25zZS4KICAgICBhdXRvIHJlc3BvbnNlX3NpemUgPSByZXNwb25zZS0+c2l6ZSgpOwotICAgIGF1dG8gcmVzdWx0ID0gc29ja2V0Xy0+U2VuZFRvKAorICAgIGludCByZXN1bHQgPSBzb2NrZXRfLT5TZW5kVG8oCiAgICAgICAgIGZha2VfYnVmZmVyLmdldCgpLCByZXNwb25zZV9zaXplLCBjbGllbnRfYWRkcmVzc18sCi0gICAgICAgIGJhc2U6OkJpbmQoW10oc2NvcGVkX3JlZnB0cjxXcmFwcGVkSU9CdWZmZXI+LAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4sIGludCAvKnJ2Ki8pIHt9LAorICAgICAgICBiYXNlOjpCaW5kKCZEaWFsVWRwU2VydmVyOjpXcml0ZUNvbXBsZXRlLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIGZha2VfYnVmZmVyLCBiYXNlOjpQYXNzZWQoJnJlc3BvbnNlKSkpOwotICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8ICJTb2NrZXQgU2VudFRvIGVycm9yIGNvZGU6ICIgPDwgcmVzdWx0OworICAgIGlmIChyZXN1bHQgPT0gRVJSX0lPX1BFTkRJTkcpIHsKKyAgICAgIC8vIFdyaXRlQ29tcGxldGUgaXMgcmVzcG9uc2libGUgZm9yIHBvc3RpbmcgdGhlIG5leHQgY2FsbGJhY2sgdG8gYWNjZXB0CisgICAgICAvLyBjb25uZWN0aW9uLgorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocmVzdWx0IDwgMCkgeworICAgICAgTE9HKEVSUk9SKSA8PCAiVURQU29ja2V0IFNlbmRUbyBlcnJvcjogIiA8PCByZXN1bHQ7CiAgICAgfQogICB9CiAKQEAgLTE2Niw2ICsxNjksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CiB9CiAKK3ZvaWQgRGlhbFVkcFNlcnZlcjo6V3JpdGVDb21wbGV0ZShzY29wZWRfcmVmcHRyPFdyYXBwZWRJT0J1ZmZlcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnYpIHsKKyAgaWYgKHJ2IDwgMCkgeworICAgIExPRyhFUlJPUikgPDwgIlVEUFNvY2tldCBjb21wbGV0aW9uIGNhbGxiYWNrIGVycm9yOiAiIDw8IHJ2OworICB9CisgIHRocmVhZF8udGFza19ydW5uZXIoKS0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkRpYWxVZHBTZXJ2ZXI6OkFjY2VwdEFuZFByb2Nlc3NDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKK30KKwogLy8gUGFyc2UgYSByZXF1ZXN0IHRvIG1ha2Ugc3VyZSBpdCBpcyBhIE0tU2VhcmNoLgogYm9vbCBEaWFsVWRwU2VydmVyOjpQYXJzZVNlYXJjaFJlcXVlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHJlcXVlc3QpIHsKICAgSHR0cFNlcnZlclJlcXVlc3RJbmZvIGluZm87CkBAIC0yMTUsNyArMjI5LDcgQEAKIAogLy8gU2luY2Ugd2UgYXJlIGNvbnN0cnVjdGluZyBhIHJlc3BvbnNlIGZyb20gdXNlci1nZW5lcmF0ZWQgc3RyaW5nLAogLy8gZW5zdXJlIGFsbCB1c2VyLWdlbmVyYXRlZCBzdHJpbmdzIHBhc3MgdGhyb3VnaCBTdHJpbmdQcmludGYuCi1jb25zdCBzdGQ6OnN0cmluZyBEaWFsVWRwU2VydmVyOjpDb25zdHJ1Y3RTZWFyY2hSZXNwb25zZSgpIGNvbnN0IHsKK3N0ZDo6c3RyaW5nIERpYWxVZHBTZXJ2ZXI6OkNvbnN0cnVjdFNlYXJjaFJlc3BvbnNlKCkgY29uc3QgewogICBEQ0hFQ0soIWxvY2F0aW9uX3VybF8uZW1wdHkoKSk7CiAKICAgc3RkOjpzdHJpbmcgcmV0KCJIVFRQLzEuMSAyMDAgT0tcclxuIik7CkBAIC0yMzcsNyArMjUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbFN5c3RlbUNvbmZpZzo6R2V0SW5zdGFuY2UoKS0+bW9kZWxfdXVpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlhbFN0UmVxdWVzdCkpOwogICByZXQuYXBwZW5kKCJcclxuIik7Ci0gIHJldHVybiByZXQ7CisgIHJldHVybiBzdGQ6Om1vdmUocmV0KTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIG5ldApkaWZmIC0tZ2l0IGEvc3JjL25ldC9kaWFsL2RpYWxfdWRwX3NlcnZlci5oIGIvc3JjL25ldC9kaWFsL2RpYWxfdWRwX3NlcnZlci5oCmluZGV4IGMzMTE1YzkuLjdhZjE3NWEgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvZGlhbC9kaWFsX3VkcF9zZXJ2ZXIuaAorKysgYi9zcmMvbmV0L2RpYWwvZGlhbF91ZHBfc2VydmVyLmgKQEAgLTMwLDYgKzMwLDEwIEBACiAKICAgdmlydHVhbCB2b2lkIERpZENsb3NlKFVEUFNvY2tldCogc29jayk7CiAKKyAgdm9pZCBXcml0ZUNvbXBsZXRlKHNjb3BlZF9yZWZwdHI8V3JhcHBlZElPQnVmZmVyPiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgcnYpOworCiAgcHJpdmF0ZToKICAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKERpYWxVZHBTZXJ2ZXJUZXN0LCBQYXJzZVNlYXJjaFJlcXVlc3QpOwogCkBAIC00Miw3ICs0Niw3IEBACiAgIHZvaWQgQWNjZXB0QW5kUHJvY2Vzc0Nvbm5lY3Rpb24oKTsKIAogICAvLyBDb25zdHJ1Y3QgdGhlIGFwcHJvcHJpYXRlIHNlYXJjaCByZXNwb25zZS4KLSAgY29uc3Qgc3RkOjpzdHJpbmcgQ29uc3RydWN0U2VhcmNoUmVzcG9uc2UoKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgQ29uc3RydWN0U2VhcmNoUmVzcG9uc2UoKSBjb25zdDsKIAogICAvLyBQYXJzZSBhIHJlcXVlc3QgdG8gbWFrZSBzdXJlIGl0IGlzIGEgTS1TZWFyY2guCiAgIHN0YXRpYyBib29sIFBhcnNlU2VhcmNoUmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYgcmVxdWVzdCk7CmRpZmYgLS1naXQgYS9zcmMvbmV0L2Rpc2tfY2FjaGUvc2ltcGxlL3NpbXBsZV9pbmRleF9maWxlX3N0YXJib2FyZC5jYyBiL3NyYy9uZXQvZGlza19jYWNoZS9zaW1wbGUvc2ltcGxlX2luZGV4X2ZpbGVfc3RhcmJvYXJkLmNjCmluZGV4IDNmOTYzNGIuLjI5ZDkxM2IgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvZGlza19jYWNoZS9zaW1wbGUvc2ltcGxlX2luZGV4X2ZpbGVfc3RhcmJvYXJkLmNjCisrKyBiL3NyYy9uZXQvZGlza19jYWNoZS9zaW1wbGUvc2ltcGxlX2luZGV4X2ZpbGVfc3RhcmJvYXJkLmNjCkBAIC0zMyw3ICszMywxOSBAQAogICAgIFBMT0coRVJST1IpIDw8ICJvcGVuZGlyICIgPDwgY2FjaGVfcGF0aC52YWx1ZSgpIDw8ICIsIGVycm9uOiAiIDw8IGVycm9yOwogICAgIHJldHVybiBmYWxzZTsKICAgfQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gZW50cnkoU0JfRklMRV9NQVhfTkFNRSk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoIVNiRGlyZWN0b3J5R2V0TmV4dChkaXIsIGVudHJ5LmRhdGEoKSwgZW50cnkuc2l6ZSgpKSkgeworICAgICAgUExPRyhFUlJPUikgPDwgInJlYWRkaXIgIiA8PCBjYWNoZV9wYXRoLnZhbHVlKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lKGVudHJ5LmRhdGEoKSk7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KICAgU2JEaXJlY3RvcnlFbnRyeSBlbnRyeTsKKwogICB3aGlsZSAodHJ1ZSkgewogICAgIGlmICghU2JEaXJlY3RvcnlHZXROZXh0KGRpciwgJmVudHJ5KSkgewogICAgICAgUExPRyhFUlJPUikgPDwgInJlYWRkaXIgIiA8PCBjYWNoZV9wYXRoLnZhbHVlKCk7CkBAIC00MSw2ICs1Myw3IEBACiAgICAgfQogCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lKGVudHJ5Lm5hbWUpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAgICAgaWYgKGZpbGVfbmFtZSA9PSAiLiIgfHwgZmlsZV9uYW1lID09ICIuLiIpCiAgICAgICBjb250aW51ZTsKICAgICBjb25zdCBiYXNlOjpGaWxlUGF0aCBmaWxlX3BhdGggPQpkaWZmIC0tZ2l0IGEvc3JjL25ldC9zb2NrZXQvdHJhbnNwb3J0X2NsaWVudF9zb2NrZXRfcG9vbC5jYyBiL3NyYy9uZXQvc29ja2V0L3RyYW5zcG9ydF9jbGllbnRfc29ja2V0X3Bvb2wuY2MKaW5kZXggZjU2ODlhYi4uMjYzZTE3YzIgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvc29ja2V0L3RyYW5zcG9ydF9jbGllbnRfc29ja2V0X3Bvb2wuY2MKKysrIGIvc3JjL25ldC9zb2NrZXQvdHJhbnNwb3J0X2NsaWVudF9zb2NrZXRfcG9vbC5jYwpAQCAtMjU4LDYgKzI1OCwxNSBAQAogaW50IFRyYW5zcG9ydENvbm5lY3RKb2I6OkRvUmVzb2x2ZUhvc3RDb21wbGV0ZShpbnQgcmVzdWx0KSB7CiAgIFRSQUNFX0VWRU5UMChrTmV0VHJhY2luZ0NhdGVnb3J5LAogICAgICAgICAgICAgICAgIlRyYW5zcG9ydENvbm5lY3RKb2I6OkRvUmVzb2x2ZUhvc3RDb21wbGV0ZSIpOworI2lmZGVmIFNUQVJCT0FSRAorICAgIC8vIFByZWZlcmVudGlhbGx5IGNvbm5lY3QgdG8gYW4gSVB2NCBhZGRyZXNzIGZpcnN0LCBpZiBhdmFpbGFibGUuIFNvbWUKKyAgICAvLyBob3N0cyBtYXkgaGF2ZSBJUHY2IGFkZHJlc3NlcyB0byB3aGljaCB3ZSBjYW4gY29ubmVjdCwgYnV0IHRoZSByZWFkCisgICAgLy8gbWF5IHN0aWxsIGZhaWwgaWYgdGhlIG5ldHdvcmsgaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQuIFRoZSBleGlzdGluZworICAgIC8vIGNvZGUgaGFzIGEgZmFsbGJhY2sgbWVjaGFuaXNtIHRvIHRyeSBkaWZmZXJlbnQgSVBzIGluIHxhZGRyZXNzZXNffAorICAgIC8vIHdoZW4gY29ubmVjdGlvbiBmYWlscy4gSG93ZXZlciwgaW4gdGhpcyBjYXNlLCBhIGNvbm5lY3Rpb24gY2FuIGJlIG1hZGUKKyAgICAvLyB3aXRoIHRoZSBJUHY2IGFkZHJlc3MsIGJ1dCB0aGUgcmVhZCBmYWlscy4KKyAgICBNYWtlQWRkcmVzc0xpc3RTdGFydFdpdGhJUHY0KCZhZGRyZXNzZXNfKTsKKyNlbmRpZgogICBjb25uZWN0X3RpbWluZ18uZG5zX2VuZCA9IGJhc2U6OlRpbWVUaWNrczo6Tm93KCk7CiAgIC8vIE92ZXJ3cml0ZSBjb25uZWN0aW9uIHN0YXJ0IHRpbWUsIHNpbmNlIGZvciBjb25uZWN0aW9ucyB0aGF0IGRvIG5vdCBnbwogICAvLyB0aHJvdWdoIHByb3hpZXMsIHxjb25uZWN0X3N0YXJ0fCBzaG91bGQgbm90IGluY2x1ZGUgZG5zIGxvb2t1cCB0aW1lLgpkaWZmIC0tZ2l0IGEvc3JjL25ldC9zb2NrZXQvdHJhbnNwb3J0X2NsaWVudF9zb2NrZXRfcG9vbF91bml0dGVzdC5jYyBiL3NyYy9uZXQvc29ja2V0L3RyYW5zcG9ydF9jbGllbnRfc29ja2V0X3Bvb2xfdW5pdHRlc3QuY2MKaW5kZXggOWQ2NGM0My4uZThjNzU0MyAxMDA2NDQKLS0tIGEvc3JjL25ldC9zb2NrZXQvdHJhbnNwb3J0X2NsaWVudF9zb2NrZXRfcG9vbF91bml0dGVzdC5jYworKysgYi9zcmMvbmV0L3NvY2tldC90cmFuc3BvcnRfY2xpZW50X3NvY2tldF9wb29sX3VuaXR0ZXN0LmNjCkBAIC04NTYsNiArODU2LDEwIEBACiAgIGhhbmRsZS5SZXNldCgpOwogfQogCisvLyBEaXNhYmxlIHRoaXMgdGVzdCBzaW5jZSB0aGUgVHJhbnNwb3J0Q29ubmVjdEpvYjo6RG9SZXNvbHZlSG9zdENvbXBsZXRlCisvLyBjdXN0b21pemF0aW9uIGNhdXNlcyB0aGUgSVB2NCBhZGRyZXNzIHRvIGJlIHRyaWVkIGZpcnN0LCB0aHVzIGJyZWFraW5nCisvLyB0aGUgYXNzdW1wdGlvbnMgb2YgdGhpcyB0ZXN0LgorI2lmbmRlZiBTVEFSQk9BUkQKIC8vIFRlc3QgdGhlIGNhc2Ugb2YgdGhlIElQdjYgYWRkcmVzcyBzdGFsbGluZywgYW5kIGZhbGxpbmcgYmFjayB0byB0aGUgSVB2NAogLy8gc29ja2V0IHdoaWNoIGZpbmlzaGVzIGZpcnN0LgogVEVTVF9GKFRyYW5zcG9ydENsaWVudFNvY2tldFBvb2xUZXN0LCBJUHY2RmFsbGJhY2tTb2NrZXRJUHY0RmluaXNoZXNGaXJzdCkgewpAQCAtOTAzLDcgKzkwNywxMiBAQAogCiAgIEVYUEVDVF9FUSgyLCBjbGllbnRfc29ja2V0X2ZhY3RvcnlfLmFsbG9jYXRpb25fY291bnQoKSk7CiB9CisjZW5kaWYKIAorLy8gRGlzYWJsZSB0aGlzIHRlc3Qgc2luY2UgdGhlIFRyYW5zcG9ydENvbm5lY3RKb2I6OkRvUmVzb2x2ZUhvc3RDb21wbGV0ZQorLy8gY3VzdG9taXphdGlvbiBjYXVzZXMgdGhlIElQdjQgYWRkcmVzcyB0byBiZSB0cmllZCBmaXJzdCwgdGh1cyBicmVha2luZworLy8gdGhlIGFzc3VtcHRpb25zIG9mIHRoaXMgdGVzdC4KKyNpZm5kZWYgU1RBUkJPQVJECiAvLyBUZXN0IHRoZSBjYXNlIG9mIHRoZSBJUHY2IGFkZHJlc3MgYmVpbmcgc2xvdywgdGh1cyBmYWxsaW5nIGJhY2sgdG8gdHJ5aW5nIHRvCiAvLyBjb25uZWN0IHRvIHRoZSBJUHY0IGFkZHJlc3MsIGJ1dCBoYXZpbmcgdGhlIGNvbm5lY3QgdG8gdGhlIElQdjYgYWRkcmVzcwogLy8gZmluaXNoIGZpcnN0LgpAQCAtOTU1LDYgKzk2NCw3IEBACiAKICAgRVhQRUNUX0VRKDIsIGNsaWVudF9zb2NrZXRfZmFjdG9yeV8uYWxsb2NhdGlvbl9jb3VudCgpKTsKIH0KKyNlbmRpZgogCiBURVNUX0YoVHJhbnNwb3J0Q2xpZW50U29ja2V0UG9vbFRlc3QsIElQdjZOb0lQdjRBZGRyZXNzZXNUb0ZhbGxiYWNrVG8pIHsKICAgLy8gQ3JlYXRlIGEgcG9vbCB3aXRob3V0IGJhY2t1cCBqb2JzLgpAQCAtMTA3Miw2ICsxMDgyLDEwIEBACiAgIEVYUEVDVF9UUlVFKHNvY2tldF9kYXRhLklzVXNpbmdUQ1BGYXN0T3BlbigpKTsKIH0KIAorLy8gRGlzYWJsZSB0aGlzIHRlc3Qgc2luY2UgdGhlIFRyYW5zcG9ydENvbm5lY3RKb2I6OkRvUmVzb2x2ZUhvc3RDb21wbGV0ZQorLy8gY3VzdG9taXphdGlvbiBjYXVzZXMgdGhlIElQdjQgYWRkcmVzcyB0byBiZSB0cmllZCBmaXJzdCwgdGh1cyBicmVha2luZworLy8gdGhlIGFzc3VtcHRpb25zIG9mIHRoaXMgdGVzdC4KKyNpZm5kZWYgU1RBUkJPQVJECiAvLyBUZXN0IHRoYXQgaWYgVENQIEZhc3RPcGVuIGlzIGVuYWJsZWQsIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nIHdoZW4gdGhlcmUKIC8vIGlzIGEgSVB2NiBhZGRyZXNzIHdpdGggZmFsbGJhY2sgdG8gYW4gSVB2NCBhZGRyZXNzLiBUaGlzIHRlc3QgdGVzdHMgdGhlIGNhc2UKIC8vIHdoZW4gdGhlIElQdjYgY29ubmVjdCBmYWlscyBhbmQgdGhlIElQdjQgb25lIHN1Y2NlZWRzLgpAQCAtMTE0MSw2ICsxMTU1LDcgQEAKICAgLy8gVmVyaWZ5IHRoYXQgVENQIEZhc3RPcGVuIHdhcyBub3QgdHVybmVkIG9uIGZvciB0aGUgc29ja2V0LgogICBFWFBFQ1RfRkFMU0Uoc29ja2V0X2RhdGEuSXNVc2luZ1RDUEZhc3RPcGVuKCkpOwogfQorI2VuZGlmCiAKIC8vIFRlc3QgdGhhdCBTb2NrZXRUYWcgcGFzc2VkIGludG8gVHJhbnNwb3J0Q2xpZW50U29ja2V0UG9vbCBpcyBhcHBsaWVkIHRvCiAvLyByZXR1cm5lZCBzb2NrZXRzLgpkaWZmIC0tZ2l0IGEvc3JjL25ldC9zb2NrZXQvdWRwX3NvY2tldF9zdGFyYm9hcmQuY2MgYi9zcmMvbmV0L3NvY2tldC91ZHBfc29ja2V0X3N0YXJib2FyZC5jYwppbmRleCA3MDdmYjc0Li4zNjljZjY4IDEwMDY0NAotLS0gYS9zcmMvbmV0L3NvY2tldC91ZHBfc29ja2V0X3N0YXJib2FyZC5jYworKysgYi9zcmMvbmV0L3NvY2tldC91ZHBfc29ja2V0X3N0YXJib2FyZC5jYwpAQCAtNDQxLDcgKzQ0MSw3IEBACiAKICAgaWYgKHJlc3VsdCAhPSBFUlJfSU9fUEVORElORykgewogICAgIElQRW5kUG9pbnQgbG9nX2FkZHJlc3M7Ci0gICAgaWYgKGxvZ19hZGRyZXNzLkZyb21TYlNvY2tldEFkZHJlc3MoJnNiX2FkZHJlc3MpKSB7CisgICAgaWYgKHJlc3VsdCA8IDAgfHwgIWxvZ19hZGRyZXNzLkZyb21TYlNvY2tldEFkZHJlc3MoJnNiX2FkZHJlc3MpKSB7CiAgICAgICBMb2dSZWFkKHJlc3VsdCwgYnVmLT5kYXRhKCksIE5VTEwpOwogICAgIH0gZWxzZSB7CiAgICAgICBMb2dSZWFkKHJlc3VsdCwgYnVmLT5kYXRhKCksICZsb2dfYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9zcmMvbmV0L3VybF9yZXF1ZXN0L3VybF9mZXRjaGVyX2NvcmUuY2MgYi9zcmMvbmV0L3VybF9yZXF1ZXN0L3VybF9mZXRjaGVyX2NvcmUuY2MKaW5kZXggNmQ3YjdmNC4uNDhjOTljMCAxMDA2NDQKLS0tIGEvc3JjL25ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9jb3JlLmNjCisrKyBiL3NyYy9uZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfY29yZS5jYwpAQCAtMjcsMTUgKzI3LDQ1IEBACiAjaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0X2NvbnRleHQuaCIKICNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaCIKICNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfdGhyb3R0bGVyX21hbmFnZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgogI2luY2x1ZGUgInVybC9vcmlnaW4uaCIKIAogbmFtZXNwYWNlIHsKIAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorY29uc3QgU2JUaW1lIGtJbmZvcm1Eb3dubG9hZFByb2dyZXNzSW50ZXJ2YWwgPSA1MCAqIGtTYlRpbWVNaWxsaXNlY29uZDsKKyNlbHNlICAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiBjb25zdCBpbnQga0J1ZmZlclNpemUgPSA0MDk2OworI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKKwogY29uc3QgaW50IGtVcGxvYWRQcm9ncmVzc1RpbWVySW50ZXJ2YWwgPSAxMDA7CisKIGJvb2wgZ19pZ25vcmVfY2VydGlmaWNhdGVfcmVxdWVzdHMgPSBmYWxzZTsKIAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQoraW50IEdldElPQnVmZmVyU2l6ZUJ5Q29udGVudFNpemUoaW50IGNvbnRlbnRfc2l6ZSkgeworICAvLyBJZiB8Y29udGVudF9zaXplfCBpcyB1bmtub3duLCB1c2UgNjRrIGFzIGJ1ZmZlciBzaXplLgorICBpZiAoY29udGVudF9zaXplIDwgMCkgeworICAgIHJldHVybiA2NCAqIDEwMjQ7CisgIH0KKyAgLy8gSWYgdGhlIGNvbnRlbnQgaXMgcmVhbGx5IHNtYWxsLCB1c2UgNGsgYW55d2F5LgorICBpZiAoY29udGVudF9zaXplIDw9IDQgKiAxMDI0KSB7CisgICAgcmV0dXJuIDQgKiAxMDI0OworICB9CisgIC8vIElmIHRoZSBjb250ZW50IGlzIG1lZGl1bSBzaXplZCwgdXNlIHRoZSBzaXplIGFzIGJ1ZmZlciBzaXplLgorICBpZiAoY29udGVudF9zaXplIDwgNjQgKiAxMDI0KSB7CisgICAgcmV0dXJuIGNvbnRlbnRfc2l6ZTsKKyAgfQorICAvLyBJZiB0aGUgY29udGVudCBpcyBmYWlybHkgbGFyZ2UsIHVzZSBhIG11Y2ggbGFyZ2VyIGJ1ZmZlciBzaXplLgorICBpZiAoY29udGVudF9zaXplID49IDUxMiAqIDEwMjQpIHsKKyAgICByZXR1cm4gMjU2ICogMTAyNDsKKyAgfQorICAvLyBPdGhlcndpc2UgdXNlIDY0ayBhcyBidWZmZXIgc2l6ZS4KKyAgcmV0dXJuIDY0ICogMTAyNDsKK30KKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCisKIH0gIC8vIG5hbWVzcGFjZQogCiBuYW1lc3BhY2UgbmV0IHsKQEAgLTgwLDYgKzExMCw5IEBACiAgICAgICBsb2FkX2ZsYWdzXyhMT0FEX05PUk1BTCksCiAgICAgICBhbGxvd19jcmVkZW50aWFsc18oYmFzZTo6bnVsbG9wdCksCiAgICAgICByZXNwb25zZV9jb2RlXyhVUkxGZXRjaGVyOjpSRVNQT05TRV9DT0RFX0lOVkFMSUQpLAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICAgICAgaW9fYnVmZmVyX3NpemVfKEdldElPQnVmZmVyU2l6ZUJ5Q29udGVudFNpemUoLTEpKSwKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAgICAgICB1cmxfcmVxdWVzdF9kYXRhX2tleV8oTlVMTCksCiAgICAgICB3YXNfZmV0Y2hlZF92aWFfcHJveHlfKGZhbHNlKSwKICAgICAgIHdhc19jYWNoZWRfKGZhbHNlKSwKQEAgLTQ0MiwxNSArNDc1LDIyIEBACiAgIH0KIAogICBEQ0hFQ0soIWJ1ZmZlcl8pOwotICBpZiAocmVxdWVzdF90eXBlXyAhPSBVUkxGZXRjaGVyOjpIRUFEKQotICAgIGJ1ZmZlcl8gPSBiYXNlOjpNYWtlUmVmQ291bnRlZDxJT0J1ZmZlcj4oa0J1ZmZlclNpemUpOwogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICBpZiAocmVxdWVzdF90eXBlXyAhPSBVUkxGZXRjaGVyOjpIRUFEKSB7CisgICAgcmVzcG9uc2Vfd3JpdGVyXy0+T25SZXNwb25zZVN0YXJ0ZWQodG90YWxfcmVzcG9uc2VfYnl0ZXNfKTsKKyAgICBpb19idWZmZXJfc2l6ZV8gPSBHZXRJT0J1ZmZlclNpemVCeUNvbnRlbnRTaXplKHRvdGFsX3Jlc3BvbnNlX2J5dGVzXyk7CisgICAgYnVmZmVyXyA9IGJhc2U6Ok1ha2VSZWZDb3VudGVkPElPQnVmZmVyPihpb19idWZmZXJfc2l6ZV8pOworICB9CisKICAgLy8gV2UgdXBkYXRlIHRoaXMgZWFybGllciB0aGFuIE9uUmVhZENvbXBsZXRlZCgpLCBzbyB0aGF0IHRoZSBkZWxlZ2F0ZQogICAvLyBjYW4ga25vdyBhYm91dCBpdCBpZiB0aGV5IGNhbGwgR2V0VVJMKCkgaW4gYW55IGNhbGxiYWNrLgogICBpZiAoIXN0b3BwZWRfb25fcmVkaXJlY3RfKSB7CiAgICAgdXJsXyA9IHJlcXVlc3RfLT51cmwoKTsKICAgfQogICBJbmZvcm1EZWxlZ2F0ZVJlc3BvbnNlU3RhcnRlZCgpOworI2Vsc2UgICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKKyAgaWYgKHJlcXVlc3RfdHlwZV8gIT0gVVJMRmV0Y2hlcjo6SEVBRCkKKyAgICBidWZmZXJfID0gYmFzZTo6TWFrZVJlZkNvdW50ZWQ8SU9CdWZmZXI+KGtCdWZmZXJTaXplKTsKICNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAgIFJlYWRSZXNwb25zZSgpOwogfQpAQCAtNDgwLDYgKzUyMCwzNSBAQAogICBpZiAodGhyb3R0bGVyX21hbmFnZXIpCiAgICAgdXJsX3Rocm90dGxlcl9lbnRyeV8gPSB0aHJvdHRsZXJfbWFuYWdlci0+UmVnaXN0ZXJSZXF1ZXN0VXJsKHVybF8pOwogCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgIC8vIFByaW1lIGl0IHRvIHRoZSBjdXJyZW50IHRpbWUgc28gaXQgaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlIGxvb3AsIG9yIGV2ZXJ5CisgIC8vIHRpbWUgd2hlbiB0aGUgbG9vcCB0YWtlcyB8a0luZm9ybURvd25sb2FkUHJvZ3Jlc3NJbnRlcnZhbHwuCisgIFNiVGltZSBkb3dubG9hZF9wcm9ncmVzc19pbmZvcm1lZF9hdCA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICBib29sIGRpZF9yZWFkX2FmdGVyX2luZm9ybV9kb3dubG9hZF9wcm9ncmVzcyA9IGZhbHNlOworCisgIHdoaWxlIChieXRlc19yZWFkID4gMCkgeworICAgIGN1cnJlbnRfcmVzcG9uc2VfYnl0ZXNfICs9IGJ5dGVzX3JlYWQ7CisgICAgZGlkX3JlYWRfYWZ0ZXJfaW5mb3JtX2Rvd25sb2FkX3Byb2dyZXNzID0gdHJ1ZTsKKyAgICBhdXRvIG5vdyA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICAgIGlmIChub3cgLSBkb3dubG9hZF9wcm9ncmVzc19pbmZvcm1lZF9hdCA+IGtJbmZvcm1Eb3dubG9hZFByb2dyZXNzSW50ZXJ2YWwpIHsKKyAgICAgIEluZm9ybURlbGVnYXRlRG93bmxvYWRQcm9ncmVzcygpOworICAgICAgZG93bmxvYWRfcHJvZ3Jlc3NfaW5mb3JtZWRfYXQgPSBub3c7CisgICAgICBkaWRfcmVhZF9hZnRlcl9pbmZvcm1fZG93bmxvYWRfcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgcmVzdWx0ID0gV3JpdGVCdWZmZXIoCisgICAgICAgIGJhc2U6Ok1ha2VSZWZDb3VudGVkPERyYWluYWJsZUlPQnVmZmVyPihidWZmZXJfLCBieXRlc19yZWFkKSk7CisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgIC8vIFdyaXRlIGZhaWxlZCBvciB3YWl0aW5nIGZvciB3cml0ZSBjb21wbGV0aW9uLgorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBieXRlc19yZWFkID0gcmVxdWVzdF8tPlJlYWQoYnVmZmVyXy5nZXQoKSwgaW9fYnVmZmVyX3NpemVfKTsKKyAgfQorCisgIGlmIChkaWRfcmVhZF9hZnRlcl9pbmZvcm1fZG93bmxvYWRfcHJvZ3Jlc3MpIHsKKyAgICBJbmZvcm1EZWxlZ2F0ZURvd25sb2FkUHJvZ3Jlc3MoKTsKKyAgfQorI2Vsc2UgICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKICAgd2hpbGUgKGJ5dGVzX3JlYWQgPiAwKSB7CiAgICAgY3VycmVudF9yZXNwb25zZV9ieXRlc18gKz0gYnl0ZXNfcmVhZDsKICAgICBJbmZvcm1EZWxlZ2F0ZURvd25sb2FkUHJvZ3Jlc3MoKTsKQEAgLTQ5Miw2ICs1NjEsNyBAQAogICAgIH0KICAgICBieXRlc19yZWFkID0gcmVxdWVzdF8tPlJlYWQoYnVmZmVyXy5nZXQoKSwga0J1ZmZlclNpemUpOwogICB9CisjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQogCiAgIC8vIFNlZSBjb21tZW50cyByZTogSEVBRCByZXF1ZXN0cyBpbiBSZWFkUmVzcG9uc2UoKS4KICAgaWYgKGJ5dGVzX3JlYWQgIT0gRVJSX0lPX1BFTkRJTkcgfHwgcmVxdWVzdF90eXBlXyA9PSBVUkxGZXRjaGVyOjpIRUFEKSB7CkBAIC05MzMsOCArMTAwMywxMyBAQAogICAvLyBjb21wbGV0ZWQgaW1tZWRpYXRlbHksIHdpdGhvdXQgdHJ5aW5nIHRvIHJlYWQgYW55IGRhdGEgYmFjayAoYWxsIHdlIGNhcmUKICAgLy8gYWJvdXQgaXMgdGhlIHJlc3BvbnNlIGNvZGUgYW5kIGhlYWRlcnMsIHdoaWNoIHdlIGFscmVhZHkgaGF2ZSkuCiAgIGludCBieXRlc19yZWFkID0gMDsKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyAgaWYgKHJlcXVlc3RfdHlwZV8gIT0gVVJMRmV0Y2hlcjo6SEVBRCkKKyAgICBieXRlc19yZWFkID0gcmVxdWVzdF8tPlJlYWQoYnVmZmVyXy5nZXQoKSwgaW9fYnVmZmVyX3NpemVfKTsKKyNlbHNlICAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAgIGlmIChyZXF1ZXN0X3R5cGVfICE9IFVSTEZldGNoZXI6OkhFQUQpCiAgICAgYnl0ZXNfcmVhZCA9IHJlcXVlc3RfLT5SZWFkKGJ1ZmZlcl8uZ2V0KCksIGtCdWZmZXJTaXplKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAKICAgT25SZWFkQ29tcGxldGVkKHJlcXVlc3RfLmdldCgpLCBieXRlc19yZWFkKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9uZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfY29yZS5oIGIvc3JjL25ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9jb3JlLmgKaW5kZXggMDVlYmQ2Ny4uM2ExOGUxOCAxMDA2NDQKLS0tIGEvc3JjL25ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9jb3JlLmgKKysrIGIvc3JjL25ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9jb3JlLmgKQEAgLTI1OCw2ICsyNTgsMTAgQEAKICAgLy8gV2hldGhlciBjcmVkZW50aWFscyBhcmUgc2VudCBhbG9uZyB3aXRoIHRoZSByZXF1ZXN0LgogICBiYXNlOjpPcHRpb25hbDxib29sPiBhbGxvd19jcmVkZW50aWFsc187CiAgIGludCByZXNwb25zZV9jb2RlXzsgICAgICAgICAgICAgICAgLy8gSFRUUCBzdGF0dXMgY29kZSBmb3IgdGhlIHJlcXVlc3QKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICBpbnQgaW9fYnVmZmVyX3NpemVfOworI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKICAgc2NvcGVkX3JlZnB0cjxJT0J1ZmZlcj4gYnVmZmVyXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIGJ1ZmZlcgogICBzY29wZWRfcmVmcHRyPFVSTFJlcXVlc3RDb250ZXh0R2V0dGVyPiByZXF1ZXN0X2NvbnRleHRfZ2V0dGVyXzsKZGlmZiAtLWdpdCBhL3NyYy9uZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfcmVzcG9uc2Vfd3JpdGVyLmggYi9zcmMvbmV0L3VybF9yZXF1ZXN0L3VybF9mZXRjaGVyX3Jlc3BvbnNlX3dyaXRlci5oCmluZGV4IDEwNzZhM2UuLmJkNGNhMTQgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfcmVzcG9uc2Vfd3JpdGVyLmgKKysrIGIvc3JjL25ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9yZXNwb25zZV93cml0ZXIuaApAQCAtMzcsNiArMzcsMTMgQEAKICAgLy8gSW5pdGlhbGl6ZSgpIHN1Y2Nlc3MgcmVzdWx0cyBpbiBkaXNjYXJkaW5nIGFscmVhZHkgd3JpdHRlbiBkYXRhLgogICB2aXJ0dWFsIGludCBJbml0aWFsaXplKENvbXBsZXRpb25PbmNlQ2FsbGJhY2sgY2FsbGJhY2spID0gMDsKIAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICAvLyBUaGUgdXNlciBvZiB0aGlzIGNsYXNzICptYXkqIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgYW55IGNhbGxzIHRvIFdyaXRlKCkKKyAgLy8gdG8gcHJpbWUgdGhlIGluc3RhbmNlIHdpdGggcmVzcG9uc2Ugc2l6ZSwgc28gaXQgaGFzIGEgY2hhbmNlIHRvIGRvIHNvbWUKKyAgLy8gcHJlcGFyYXRpb24gd29yaywgbGlrZSBwcmUtYWxsb2NhdGUgdGhlIGJ1ZmZlci4KKyAgdmlydHVhbCB2b2lkIE9uUmVzcG9uc2VTdGFydGVkKGludDY0X3QgY29udGVudF9sZW5ndGgpID0gMDsKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCisKICAgLy8gV3JpdGVzIHxudW1fYnl0ZXN8IGJ5dGVzIGluIHxidWZmZXJ8LCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCiAgIC8vIHdyaXR0ZW4gb3IgYW4gZXJyb3IgY29kZS4gSWYgRVJSX0lPX1BFTkRJTkcgaXMgcmV0dXJuZWQsIHxjYWxsYmFja3wgd2lsbCBiZQogICAvLyBydW4gbGF0ZXIgd2l0aCB0aGUgcmVzdWx0LgpAQCAtNzAsNiArNzcsOSBAQAogCiAgIC8vIFVSTEZldGNoZXJSZXNwb25zZVdyaXRlciBvdmVycmlkZXM6CiAgIGludCBJbml0aWFsaXplKENvbXBsZXRpb25PbmNlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICB2b2lkIE9uUmVzcG9uc2VTdGFydGVkKGludDY0X3QgLypjb250ZW50X2xlbmd0aCovKSBvdmVycmlkZSB7fQorI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKICAgaW50IFdyaXRlKElPQnVmZmVyKiBidWZmZXIsCiAgICAgICAgICAgICBpbnQgbnVtX2J5dGVzLAogICAgICAgICAgICAgQ29tcGxldGlvbk9uY2VDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CkBAIC05Niw2ICsxMDYsOSBAQAogCiAgIC8vIFVSTEZldGNoZXJSZXNwb25zZVdyaXRlciBvdmVycmlkZXM6CiAgIGludCBJbml0aWFsaXplKENvbXBsZXRpb25PbmNlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICB2b2lkIE9uUmVzcG9uc2VTdGFydGVkKGludDY0X3QgLypjb250ZW50X2xlbmd0aCovKSBvdmVycmlkZSB7fQorI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKICAgaW50IFdyaXRlKElPQnVmZmVyKiBidWZmZXIsCiAgICAgICAgICAgICBpbnQgbnVtX2J5dGVzLAogICAgICAgICAgICAgQ29tcGxldGlvbk9uY2VDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2NoYW5uZWwuaCBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfY2hhbm5lbC5oCmluZGV4IDJlYWUzODguLmQ5MTRhMDggMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfY2hhbm5lbC5oCisrKyBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfY2hhbm5lbC5oCkBAIC05MCwxMCArOTAsMTUgQEAKICAgLy8gY2hhcmFjdGVyIGJvdW5kYXJpZXMuIENhbGxpbmcgU2VuZEZyYW1lIG1heSByZXN1bHQgaW4gc3luY2hyb25vdXMgY2FsbHMgdG8KICAgLy8gfGV2ZW50X2ludGVyZmFjZV98IHdoaWNoIG1heSByZXN1bHQgaW4gdGhpcyBvYmplY3QgYmVpbmcgZGVsZXRlZC4gSW4gdGhhdAogICAvLyBjYXNlLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgQ0hBTk5FTF9ERUxFVEVELgorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICAvLyBNYWtlIGl0IHZpcnR1YWwgdG8gZW5hYmxlIG1vY2tpbmcgZm9yIHVuaXQgdGVzdHMuCisgIHZpcnR1YWwgQ2hhbm5lbFN0YXRlIFNlbmRGcmFtZShib29sIGZpbiwKKyNlbHNlCiAgIENoYW5uZWxTdGF0ZSBTZW5kRnJhbWUoYm9vbCBmaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8SU9CdWZmZXI+IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlIG9wX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPElPQnVmZmVyPiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUpOwogCiAgIC8vIFNlbmRzIHxxdW90YXwgdW5pdHMgb2YgZmxvdyBjb250cm9sIHRvIHRoZSByZW1vdGUgc2lkZS4gSWYgdGhlIHVuZGVybHlpbmcKICAgLy8gdHJhbnNwb3J0IGhhcyBhIGNvbmNlcHQgb2YgfHF1b3RhfCwgdGhlbiBpdCBwZXJtaXRzIHRoZSByZW1vdGUgc2VydmVyIHRvCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvbWVkaWEvQXVkaW9PdXRwdXRNYW5hZ2VyLmphdmEgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvbWVkaWEvQXVkaW9PdXRwdXRNYW5hZ2VyLmphdmEKaW5kZXggMjEwNWU1Yi4uNGEwOTFmOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L21lZGlhL0F1ZGlvT3V0cHV0TWFuYWdlci5qYXZhCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9tZWRpYS9BdWRpb091dHB1dE1hbmFnZXIuamF2YQpAQCAtMTksNyArMTksOSBAQAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5UYXJnZXRBcGk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBkZXYuY29iYWx0LnV0aWwuTG9nOwogaW1wb3J0IGRldi5jb2JhbHQudXRpbC5Vc2VkQnlOYXRpdmU7CkBAIC0xMDUsNCArMTA3LDI1IEBACiAgICAgfQogICAgIHJldHVybiBtYXhDaGFubmVsczsKICAgfQorCisgIC8qKiBSZXR1cm5zIHRoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIG9mIEF1ZGlvVHJhY2suICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBAVXNlZEJ5TmF0aXZlCisgIGludCBnZXRNaW5CdWZmZXJTaXplKGludCBzYW1wbGVUeXBlLCBpbnQgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCkgeworICAgIGludCBjaGFubmVsQ29uZmlnOworICAgIHN3aXRjaCAoY2hhbm5lbENvdW50KSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGNoYW5uZWxDb25maWcgPSBBdWRpb0Zvcm1hdC5DSEFOTkVMX09VVF9NT05POworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgY2hhbm5lbENvbmZpZyA9IEF1ZGlvRm9ybWF0LkNIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY6CisgICAgICAgIGNoYW5uZWxDb25maWcgPSBBdWRpb0Zvcm1hdC5DSEFOTkVMX09VVF81UE9JTlQxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjaGFubmVsIGNvdW50OiAiICsgY2hhbm5lbENvdW50KTsKKyAgICB9CisgICAgcmV0dXJuIEF1ZGlvVHJhY2suZ2V0TWluQnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBjaGFubmVsQ29uZmlnLCBzYW1wbGVUeXBlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb19zaW5rX2dldF9taW5fYnVmZmVyX3NpemVfaW5fZnJhbWVzLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb19zaW5rX2dldF9taW5fYnVmZmVyX3NpemVfaW5fZnJhbWVzLmNjCmluZGV4IDJiZDdjM2YuLmM2YWY3OTAgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXVkaW9fc2lua19nZXRfbWluX2J1ZmZlcl9zaXplX2luX2ZyYW1lcy5jYworKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX3NpbmtfZ2V0X21pbl9idWZmZXJfc2l6ZV9pbl9mcmFtZXMuY2MKQEAgLTIwLDEwICsyMCw2IEBACiBpbnQgU2JBdWRpb1NpbmtHZXRNaW5CdWZmZXJTaXplSW5GcmFtZXMoaW50IGNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeikgewotICAvLyBDdXJyZW50bHksIHdlIG9ubHkgdXNlIHxtaW5fcmVxdWlyZWRfZnJhbWVzX3wgZm9yIHdlYiBhdWRpbywgd2hpY2gKLSAgLy8gb25seSBzdXBwb3J0cyA0OGsgbW9ubyBvciBzdGVyZW8gc291bmQuCi0gIFNCX0RDSEVDSyhzYW1wbGluZ19mcmVxdWVuY3lfaHogPT0gNDgwMDApOwotCiAgIGlmIChjaGFubmVscyA8PSAwIHx8IGNoYW5uZWxzID4gU2JBdWRpb1NpbmtHZXRNYXhDaGFubmVscygpKSB7CiAgICAgU0JfTE9HKEVSUk9SKSA8PCAiTm90IHN1cHBvcnQgY2hhbm5lbHMgY291bnQgIiA8PCBjaGFubmVsczsKICAgICByZXR1cm4gLTE7CkBAIC0zMyw3ICsyOSw3IEBACiAgICAgU0JfTE9HKEVSUk9SKSA8PCAiTm90IHN1cHBvcnQgc2FtcGxlIHR5cGUgIiA8PCBzYW1wbGVfdHlwZTsKICAgICByZXR1cm4gLTE7CiAgIH0KLSAgaWYgKHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiA8PSAwKSB7CisgIGlmIChzYW1wbGluZ19mcmVxdWVuY3lfaHogPD0gMCB8fCBzYW1wbGluZ19mcmVxdWVuY3lfaHogPj0gNTAwMDApIHsKICAgICBTQl9MT0coRVJST1IpIDw8ICJOb3Qgc3VwcG9ydCBzYW1wbGUgZnJlcXVlbmN5ICIgPDwgc2FtcGxpbmdfZnJlcXVlbmN5X2h6OwogICAgIHJldHVybiAtMTsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb19zaW5rX21pbl9yZXF1aXJlZF9mcmFtZXNfdGVzdGVyLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb19zaW5rX21pbl9yZXF1aXJlZF9mcmFtZXNfdGVzdGVyLmNjCmluZGV4IGU5YTg3YTMuLjYyNzY2NDEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXVkaW9fc2lua19taW5fcmVxdWlyZWRfZnJhbWVzX3Rlc3Rlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX3NpbmtfbWluX3JlcXVpcmVkX2ZyYW1lc190ZXN0ZXIuY2MKQEAgLTM5LDIyICszOSwxOCBAQAogfQogfSAgLy8gbmFtZXNwYWNlCiAKLU1pblJlcXVpcmVkRnJhbWVzVGVzdGVyOjpNaW5SZXF1aXJlZEZyYW1lc1Rlc3RlcihpbnQgYXVkaW9fc2lua19idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3JlcXVpcmVkX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdF9yZXF1aXJlZF9mcmFtZXMsCitNaW5SZXF1aXJlZEZyYW1lc1Rlc3Rlcjo6TWluUmVxdWlyZWRGcmFtZXNUZXN0ZXIoaW50IG1heF9yZXF1aXJlZF9mcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVpcmVkX2ZyYW1lc19pbmNyZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9zdGFibGVfcGxheWVkX2ZyYW1lcykKLSAgICA6IGF1ZGlvX3NpbmtfYnVmZmVyX3NpemVfKGF1ZGlvX3NpbmtfYnVmZmVyX3NpemUpLAotICAgICAgbWF4X3JlcXVpcmVkX2ZyYW1lc18obWF4X3JlcXVpcmVkX2ZyYW1lcyksCi0gICAgICBkZWZhdWx0X3JlcXVpcmVkX2ZyYW1lc18oZGVmYXVsdF9yZXF1aXJlZF9mcmFtZXMpLAorICAgIDogbWF4X3JlcXVpcmVkX2ZyYW1lc18obWF4X3JlcXVpcmVkX2ZyYW1lcyksCiAgICAgICByZXF1aXJlZF9mcmFtZXNfaW5jcmVtZW50XyhyZXF1aXJlZF9mcmFtZXNfaW5jcmVtZW50KSwKICAgICAgIG1pbl9zdGFibGVfcGxheWVkX2ZyYW1lc18obWluX3N0YWJsZV9wbGF5ZWRfZnJhbWVzKSwKICAgICAgIGNvbmRpdGlvbl92YXJpYWJsZV8obXV0ZXhfKSwKLSAgICAgIGRlc3Ryb3llZF8oZmFsc2UpIHt9CisgICAgICBkZXN0cm95aW5nXyhmYWxzZSkge30KIAogTWluUmVxdWlyZWRGcmFtZXNUZXN0ZXI6On5NaW5SZXF1aXJlZEZyYW1lc1Rlc3RlcigpIHsKICAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBkZXN0cm95ZWRfLnN0b3JlKHRydWUpOworICBkZXN0cm95aW5nXy5zdG9yZSh0cnVlKTsKICAgaWYgKFNiVGhyZWFkSXNWYWxpZCh0ZXN0ZXJfdGhyZWFkXykpIHsKICAgICB7CiAgICAgICBTY29wZWRMb2NrIHNjb3BlZF9sb2NrKG11dGV4Xyk7CkBAIC02NSwxOSArNjEsMjQgQEAKICAgfQogfQogCi12b2lkIE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyOjpTdGFydFRlc3QoCit2b2lkIE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyOjpBZGRUZXN0KAogICAgIGludCBudW1iZXJfb2ZfY2hhbm5lbHMsCiAgICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwKICAgICBpbnQgc2FtcGxlX3JhdGUsCi0gICAgT25NaW5SZXF1aXJlZEZyYW1lc1JlY2VpdmVkQ2FsbGJhY2sgcmVjZWl2ZWRfY2IpIHsKKyAgICBjb25zdCBPbk1pblJlcXVpcmVkRnJhbWVzUmVjZWl2ZWRDYWxsYmFjayYgcmVjZWl2ZWRfY2IsCisgICAgaW50IGRlZmF1bHRfcmVxdWlyZWRfZnJhbWVzKSB7CiAgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgLy8gTWluUmVxdWlyZWRGcmFtZXNUZXN0ZXIgb25seSBzdXBwb3J0cyB0byBkbyB0ZXN0IG9uY2Ugbm93LgorICAvLyBNaW5SZXF1aXJlZEZyYW1lc1Rlc3RlciBkb2Vzbid0IHN1cHBvcnQgdG8gYWRkIHRlc3QgYWZ0ZXIgc3RhcnRzLgogICBTQl9EQ0hFQ0soIVNiVGhyZWFkSXNWYWxpZCh0ZXN0ZXJfdGhyZWFkXykpOwogCi0gIG51bWJlcl9vZl9jaGFubmVsc18gPSBudW1iZXJfb2ZfY2hhbm5lbHM7Ci0gIHNhbXBsZV90eXBlXyA9IHNhbXBsZV90eXBlOwotICBzYW1wbGVfcmF0ZV8gPSBzYW1wbGVfcmF0ZTsKLSAgcmVjZWl2ZWRfY2JfID0gcmVjZWl2ZWRfY2I7CisgIHRlc3RfdGFza3NfLmVtcGxhY2VfYmFjayhudW1iZXJfb2ZfY2hhbm5lbHMsIHNhbXBsZV90eXBlLCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkX2NiLCBkZWZhdWx0X3JlcXVpcmVkX2ZyYW1lcyk7Cit9CisKK3ZvaWQgTWluUmVxdWlyZWRGcmFtZXNUZXN0ZXI6OlN0YXJ0KCkgeworICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIC8vIE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyIG9ubHkgc3VwcG9ydHMgdG8gc3RhcnQgb25jZS4KKyAgU0JfRENIRUNLKCFTYlRocmVhZElzVmFsaWQodGVzdGVyX3RocmVhZF8pKTsKIAogICB0ZXN0ZXJfdGhyZWFkXyA9CiAgICAgICBTYlRocmVhZENyZWF0ZSgwLCBrU2JUaHJlYWRQcmlvcml0eUxvd2VzdCwga1NiVGhyZWFkTm9BZmZpbml0eSwgdHJ1ZSwKQEAgLTk3LDQ1ICs5OCw1MSBAQAogCiB2b2lkIE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyOjpUZXN0ZXJUaHJlYWRGdW5jKCkgewogICBib29sIHdhaXRfdGltZW91dCA9IGZhbHNlOwotICAvLyBDdXJyZW50bHksIHdlIG9ubHkgc3VwcG9ydCB0ZXN0IG9uY2UuIEJ1dCB3ZSBjYW4gcHV0IGZvbGxvd2luZyBjb2RlcyBpbgotICAvLyBhIGZvciBsb29wIGVhc2lseSB0byBzdXBwb3J0IHRlc3QgbXVsdGlwbGUgdGltZXMuCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNpbGVuY2VfYnVmZmVyKAotICAgICAgbWF4X3JlcXVpcmVkX2ZyYW1lc18gKiBudW1iZXJfb2ZfY2hhbm5lbHNfICogR2V0U2FtcGxlU2l6ZShzYW1wbGVfdHlwZV8pLAotICAgICAgMCk7Ci0gIHZvaWQqIGZyYW1lX2J1ZmZlcnNbMV07Ci0gIGZyYW1lX2J1ZmZlcnNbMF0gPSBzaWxlbmNlX2J1ZmZlci5kYXRhKCk7Ci0gIC8vIFNldCBkZWZhdWx0IHZhbHVlcy4KLSAgbWluX3JlcXVpcmVkX2ZyYW1lc18gPSBkZWZhdWx0X3JlcXVpcmVkX2ZyYW1lc187Ci0gIHRvdGFsX2NvbnN1bWVkX2ZyYW1lc18gPSAwOwotICBsYXN0X3VuZGVycnVuX2NvdW50XyA9IC0xOwotICBsYXN0X3RvdGFsX2NvbnN1bWVkX2ZyYW1lc18gPSAwOwotICB7Ci0gICAgU2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOwotICAgIC8vIE5lZWQgdG8gY2hlY2sgfGRlc3Ryb3llZF98IGJlZm9yZSBzdGFydCwgYXMgTWluUmVxdWlyZWRGcmFtZXNUZXN0ZXIgbWF5CisgIGZvciAoY29uc3QgVGVzdFRhc2smIHRhc2sgOiB0ZXN0X3Rhc2tzXykgeworICAgIC8vIE5lZWQgdG8gY2hlY2sgfGRlc3Ryb3lpbmdffCBiZWZvcmUgc3RhcnQsIGFzIE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyIG1heQogICAgIC8vIGJlIGRlc3Ryb3llZCBpbW1lZGlhdGVseSBhZnRlciB0ZXN0ZXIgdGhyZWFkIHN0YXJ0ZWQuCi0gICAgaWYgKCFkZXN0cm95ZWRfLmxvYWQoKSkgewotICAgICAgYXVkaW9fc2lua18gPSBuZXcgQXVkaW9UcmFja0F1ZGlvU2luaygKLSAgICAgICAgICBOVUxMLCBudW1iZXJfb2ZfY2hhbm5lbHNfLCBzYW1wbGVfcmF0ZV8sIHNhbXBsZV90eXBlXywgZnJhbWVfYnVmZmVycywKLSAgICAgICAgICBtYXhfcmVxdWlyZWRfZnJhbWVzXywKLSAgICAgICAgICBhdWRpb19zaW5rX2J1ZmZlcl9zaXplXyAqIG51bWJlcl9vZl9jaGFubmVsc18gKgotICAgICAgICAgICAgICBHZXRTYW1wbGVTaXplKHNhbXBsZV90eXBlXyksCi0gICAgICAgICAgJk1pblJlcXVpcmVkRnJhbWVzVGVzdGVyOjpVcGRhdGVTb3VyY2VTdGF0dXNGdW5jLAotICAgICAgICAgICZNaW5SZXF1aXJlZEZyYW1lc1Rlc3Rlcjo6Q29uc3VtZUZyYW1lc0Z1bmMsIHRoaXMpOwotICAgICAgd2FpdF90aW1lb3V0ID0gIWNvbmRpdGlvbl92YXJpYWJsZV8uV2FpdFRpbWVkKGtTYlRpbWVTZWNvbmQgKiA1KTsKLSAgICAgIGlmICh3YWl0X3RpbWVvdXQpIHsKLSAgICAgICAgU0JfTE9HKEVSUk9SKSA8PCAiQXVkaW8gc2luayBtaW4gcmVxdWlyZWQgZnJhbWVzIHRlc3RlciB0aW1lb3V0LiI7Ci0gICAgICAgIFNCX05PVFJFQUNIRUQoKTsKLSAgICAgIH0KKyAgICBpZiAoZGVzdHJveWluZ18ubG9hZCgpKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gIH0KLSAgZGVsZXRlIGF1ZGlvX3NpbmtfOwotICBhdWRpb19zaW5rXyA9IG51bGxwdHI7Ci0gIC8vIENhbGwgfHJlY2VpdmVkX2NiX3wgYWZ0ZXIgYXVkaW8gc2luayB0aHJlYWQgaXMgZW5kZWQuCi0gIC8vIHxudW1iZXJfb2ZfY2hhbm5lbHNffCwgfHNhbXBsZV90eXBlX3wsIHxzYW1wbGVfcmF0ZV98IGFuZAotICAvLyB8bWluX3JlcXVpcmVkX2ZyYW1lc198IGFyZSBzaGFyZWQgYmV0d2VlbiB0d28gdGhyZWFkcy4KLSAgaWYgKCFkZXN0cm95ZWRfLmxvYWQoKSAmJiAhd2FpdF90aW1lb3V0KSB7Ci0gICAgcmVjZWl2ZWRfY2JfKG51bWJlcl9vZl9jaGFubmVsc18sIHNhbXBsZV90eXBlXywgc2FtcGxlX3JhdGVfLAotICAgICAgICAgICAgICAgICBtaW5fcmVxdWlyZWRfZnJhbWVzXyk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lsZW5jZV9idWZmZXIobWF4X3JlcXVpcmVkX2ZyYW1lc18gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLm51bWJlcl9vZl9jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNhbXBsZVNpemUodGFzay5zYW1wbGVfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgdm9pZCogZnJhbWVfYnVmZmVyc1sxXTsKKyAgICBmcmFtZV9idWZmZXJzWzBdID0gc2lsZW5jZV9idWZmZXIuZGF0YSgpOworCisgICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzLgorICAgIG1pbl9yZXF1aXJlZF9mcmFtZXNfID0gdGFzay5kZWZhdWx0X3JlcXVpcmVkX2ZyYW1lczsKKyAgICB0b3RhbF9jb25zdW1lZF9mcmFtZXNfID0gMDsKKyAgICBsYXN0X3VuZGVycnVuX2NvdW50XyA9IC0xOworICAgIGxhc3RfdG90YWxfY29uc3VtZWRfZnJhbWVzXyA9IDA7CisKKyAgICBhdWRpb19zaW5rXyA9IG5ldyBBdWRpb1RyYWNrQXVkaW9TaW5rKAorICAgICAgICBOVUxMLCB0YXNrLm51bWJlcl9vZl9jaGFubmVscywgdGFzay5zYW1wbGVfcmF0ZSwgdGFzay5zYW1wbGVfdHlwZSwKKyAgICAgICAgZnJhbWVfYnVmZmVycywgbWF4X3JlcXVpcmVkX2ZyYW1lc18sCisgICAgICAgIG1pbl9yZXF1aXJlZF9mcmFtZXNfICogdGFzay5udW1iZXJfb2ZfY2hhbm5lbHMgKgorICAgICAgICAgICAgR2V0U2FtcGxlU2l6ZSh0YXNrLnNhbXBsZV90eXBlKSwKKyAgICAgICAgJk1pblJlcXVpcmVkRnJhbWVzVGVzdGVyOjpVcGRhdGVTb3VyY2VTdGF0dXNGdW5jLAorICAgICAgICAmTWluUmVxdWlyZWRGcmFtZXNUZXN0ZXI6OkNvbnN1bWVGcmFtZXNGdW5jLCB0aGlzKTsKKyAgICB7CisgICAgICBTY29wZWRMb2NrIHNjb3BlZF9sb2NrKG11dGV4Xyk7CisgICAgICB3YWl0X3RpbWVvdXQgPSAhY29uZGl0aW9uX3ZhcmlhYmxlXy5XYWl0VGltZWQoa1NiVGltZVNlY29uZCAqIDUpOworICAgIH0KKworICAgIGlmICh3YWl0X3RpbWVvdXQpIHsKKyAgICAgIFNCX0xPRyhFUlJPUikgPDwgIkF1ZGlvIHNpbmsgbWluIHJlcXVpcmVkIGZyYW1lcyB0ZXN0ZXIgdGltZW91dC4iOworICAgICAgU0JfTk9UUkVBQ0hFRCgpOworICAgIH0KKworICAgIGRlbGV0ZSBhdWRpb19zaW5rXzsKKyAgICBhdWRpb19zaW5rXyA9IG51bGxwdHI7CisKKyAgICAvLyBDYWxsIHxyZWNlaXZlZF9jYl98IGFmdGVyIGF1ZGlvIHNpbmsgdGhyZWFkIGlzIGVuZGVkLgorICAgIC8vIHxtaW5fcmVxdWlyZWRfZnJhbWVzX3wgaXMgc2hhcmVkIGJldHdlZW4gdHdvIHRocmVhZHMuCisgICAgaWYgKCFkZXN0cm95aW5nXy5sb2FkKCkgJiYgIXdhaXRfdGltZW91dCkgeworICAgICAgdGFzay5yZWNlaXZlZF9jYih0YXNrLm51bWJlcl9vZl9jaGFubmVscywgdGFzay5zYW1wbGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGFzay5zYW1wbGVfcmF0ZSwgbWluX3JlcXVpcmVkX2ZyYW1lc18pOworICAgIH0KICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX3NpbmtfbWluX3JlcXVpcmVkX2ZyYW1lc190ZXN0ZXIuaCBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXVkaW9fc2lua19taW5fcmVxdWlyZWRfZnJhbWVzX3Rlc3Rlci5oCmluZGV4IDllNTMxMzQuLjI5MDAxMWQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXVkaW9fc2lua19taW5fcmVxdWlyZWRfZnJhbWVzX3Rlc3Rlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXVkaW9fc2lua19taW5fcmVxdWlyZWRfZnJhbWVzX3Rlc3Rlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL2NvbmRpdGlvbl92YXJpYWJsZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbXV0ZXguaCIKQEAgLTQwLDE5ICs0MSwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX3JlcXVpcmVkX2ZyYW1lcyk+CiAgICAgICBPbk1pblJlcXVpcmVkRnJhbWVzUmVjZWl2ZWRDYWxsYmFjazsKIAotICBNaW5SZXF1aXJlZEZyYW1lc1Rlc3RlcihpbnQgYXVkaW9fc2lua19idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9yZXF1aXJlZF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0X3JlcXVpcmVkX2ZyYW1lcywKKyAgTWluUmVxdWlyZWRGcmFtZXNUZXN0ZXIoaW50IG1heF9yZXF1aXJlZF9mcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1aXJlZF9mcmFtZXNfaW5jcmVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX3N0YWJsZV9wbGF5ZWRfZnJhbWVzKTsKICAgfk1pblJlcXVpcmVkRnJhbWVzVGVzdGVyKCk7CiAKLSAgdm9pZCBTdGFydFRlc3QoaW50IG51bWJlcl9vZl9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICBPbk1pblJlcXVpcmVkRnJhbWVzUmVjZWl2ZWRDYWxsYmFjayByZWNlaXZlZF9jYik7CisgIHZvaWQgQWRkVGVzdChpbnQgbnVtYmVyX29mX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwKKyAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgIGNvbnN0IE9uTWluUmVxdWlyZWRGcmFtZXNSZWNlaXZlZENhbGxiYWNrJiByZWNlaXZlZF9jYiwKKyAgICAgICAgICAgICAgIGludCBkZWZhdWx0X3JlcXVpcmVkX2ZyYW1lcyk7CisKKyAgdm9pZCBTdGFydCgpOwogCiAgcHJpdmF0ZToKKyAgc3RydWN0IFRlc3RUYXNrIHsKKyAgICBUZXN0VGFzayhpbnQgbnVtYmVyX29mX2NoYW5uZWxzLAorICAgICAgICAgICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUsCisgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlLAorICAgICAgICAgICAgIE9uTWluUmVxdWlyZWRGcmFtZXNSZWNlaXZlZENhbGxiYWNrIHJlY2VpdmVkX2NiLAorICAgICAgICAgICAgIGludCBkZWZhdWx0X3JlcXVpcmVkX2ZyYW1lcykKKyAgICAgICAgOiBudW1iZXJfb2ZfY2hhbm5lbHMobnVtYmVyX29mX2NoYW5uZWxzKSwKKyAgICAgICAgICBzYW1wbGVfdHlwZShzYW1wbGVfdHlwZSksCisgICAgICAgICAgc2FtcGxlX3JhdGUoc2FtcGxlX3JhdGUpLAorICAgICAgICAgIHJlY2VpdmVkX2NiKHJlY2VpdmVkX2NiKSwKKyAgICAgICAgICBkZWZhdWx0X3JlcXVpcmVkX2ZyYW1lcyhkZWZhdWx0X3JlcXVpcmVkX2ZyYW1lcykge30KKworICAgIGNvbnN0IGludCBudW1iZXJfb2ZfY2hhbm5lbHM7CisgICAgY29uc3QgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZTsKKyAgICBjb25zdCBpbnQgc2FtcGxlX3JhdGU7CisgICAgY29uc3QgT25NaW5SZXF1aXJlZEZyYW1lc1JlY2VpdmVkQ2FsbGJhY2sgcmVjZWl2ZWRfY2I7CisgICAgY29uc3QgaW50IGRlZmF1bHRfcmVxdWlyZWRfZnJhbWVzOworICB9OworCiAgIHN0YXRpYyB2b2lkKiBUZXN0ZXJUaHJlYWRFbnRyeVBvaW50KHZvaWQqIGNvbnRleHQpOwogICB2b2lkIFRlc3RlclRocmVhZEZ1bmMoKTsKIApAQCAtNzMsMjQgKzk0LDE2IEBACiAgIE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyKGNvbnN0IE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyJikgPSBkZWxldGU7CiAgIE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyJiBvcGVyYXRvcj0oY29uc3QgTWluUmVxdWlyZWRGcmFtZXNUZXN0ZXImKSA9IGRlbGV0ZTsKIAotICBjb25zdCBpbnQgYXVkaW9fc2lua19idWZmZXJfc2l6ZV87CiAgIGNvbnN0IGludCBtYXhfcmVxdWlyZWRfZnJhbWVzXzsKLSAgY29uc3QgaW50IGRlZmF1bHRfcmVxdWlyZWRfZnJhbWVzXzsKICAgY29uc3QgaW50IHJlcXVpcmVkX2ZyYW1lc19pbmNyZW1lbnRfOwogICBjb25zdCBpbnQgbWluX3N0YWJsZV9wbGF5ZWRfZnJhbWVzXzsKIAogICA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwogCi0gIC8vIFNoYXJlZCB2YXJpYWJsZXMgYmV0d2VlbiB0ZXN0ZXIgdGhyZWFkIGFuZCBhdWRpbyBzaW5rIHRocmVhZC4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgVGVzdFRhc2s+IHRlc3RfdGFza3NfOwogICBBdWRpb1RyYWNrQXVkaW9TaW5rKiBhdWRpb19zaW5rXyA9IG51bGxwdHI7Ci0gIGludCBudW1iZXJfb2ZfY2hhbm5lbHNfOwotICBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNhbXBsZV90eXBlXzsKLSAgaW50IHNhbXBsZV9yYXRlXzsKICAgaW50IG1pbl9yZXF1aXJlZF9mcmFtZXNfOwogCi0gIC8vIFVzZWQgb25seSBieSB0ZXN0ZXIgdGhyZWFkLgotICBPbk1pblJlcXVpcmVkRnJhbWVzUmVjZWl2ZWRDYWxsYmFjayByZWNlaXZlZF9jYl87Ci0KICAgLy8gVXNlZCBvbmx5IGJ5IGF1ZGlvIHNpbmsgdGhyZWFkLgogICBpbnQgdG90YWxfY29uc3VtZWRfZnJhbWVzXzsKICAgaW50IGxhc3RfdW5kZXJydW5fY291bnRfOwpAQCAtOTksNyArMTEyLDcgQEAKICAgTXV0ZXggbXV0ZXhfOwogICBDb25kaXRpb25WYXJpYWJsZSBjb25kaXRpb25fdmFyaWFibGVfOwogICBTYlRocmVhZCB0ZXN0ZXJfdGhyZWFkXyA9IGtTYlRocmVhZEludmFsaWQ7Ci0gIHN0ZDo6YXRvbWljX2Jvb2wgZGVzdHJveWVkXzsKKyAgc3RkOjphdG9taWNfYm9vbCBkZXN0cm95aW5nXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXVkaW9fdHJhY2tfYXVkaW9fc2lua190eXBlLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb190cmFja19hdWRpb19zaW5rX3R5cGUuY2MKaW5kZXggOTk0ZDkwNC4uMzYzZDRmOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb190cmFja19hdWRpb19zaW5rX3R5cGUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb190cmFja19hdWRpb19zaW5rX3R5cGUuY2MKQEAgLTM1LDEyICszNSwxMyBAQAogY29uc3QgamludCBrTm9PZmZzZXQgPSAwOwogY29uc3Qgc2l6ZV90IGtTaWxlbmNlRnJhbWVzUGVyQXBwZW5kID0gMTAyNDsKIAotY29uc3QgaW50IGtBdWRpb1NpbmtCdWZmZXJTaXplID0gNCAqIDEwMjQ7CiBjb25zdCBpbnQga01heFJlcXVpcmVkRnJhbWVzID0gMTYgKiAxMDI0OwotY29uc3QgaW50IGtEZWZhdWx0UmVxdWlyZWRGcmFtZXMgPSA4ICogMTAyNDsKIGNvbnN0IGludCBrUmVxdWlyZWRGcmFtZXNJbmNyZW1lbnQgPSAyICogMTAyNDsKIGNvbnN0IGludCBrTWluU3RhYmxlUGxheWVkRnJhbWVzID0gMTIgKiAxMDI0OwogCitjb25zdCBpbnQga1NhbXBsZUZyZXF1ZW5jeTIyayA9IDIyMDUwOworY29uc3QgaW50IGtTYW1wbGVGcmVxdWVuY3k0OGsgPSA0ODAwMDsKKwogLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHR3byB2YWxpZCBzdGFyYm9hcmQgYXVkaW8gc2FtcGxlCiAvLyB0eXBlcy4KIHNpemVfdCBHZXRTYW1wbGVTaXplKFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUpIHsKQEAgLTgwLDcgKzgxLDcgQEAKICAgICBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNhbXBsZV90eXBlLAogICAgIFNiQXVkaW9TaW5rRnJhbWVCdWZmZXJzIGZyYW1lX2J1ZmZlcnMsCiAgICAgaW50IGZyYW1lc19wZXJfY2hhbm5lbCwKLSAgICBpbnQgcHJlZmVycmVkX2J1ZmZlcl9zaXplLAorICAgIGludCBwcmVmZXJyZWRfYnVmZmVyX3NpemVfaW5fYnl0ZXMsCiAgICAgU2JBdWRpb1NpbmtVcGRhdGVTb3VyY2VTdGF0dXNGdW5jIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMsCiAgICAgU2JBdWRpb1NpbmtDb25zdW1lRnJhbWVzRnVuYyBjb25zdW1lX2ZyYW1lX2Z1bmMsCiAgICAgdm9pZCogY29udGV4dCkKQEAgLTExMyw3ICsxMTQsNyBAQAogICAgICAgal9hdWRpb19vdXRwdXRfbWFuYWdlci5HZXQoKSwgImNyZWF0ZUF1ZGlvVHJhY2tCcmlkZ2UiLAogICAgICAgIihJSUlJKUxkZXYvY29iYWx0L21lZGlhL0F1ZGlvVHJhY2tCcmlkZ2U7IiwKICAgICAgIEdldEF1ZGlvRm9ybWF0U2FtcGxlVHlwZShzYW1wbGVfdHlwZV8pLCBzYW1wbGluZ19mcmVxdWVuY3lfaHpfLCBjaGFubmVsc18sCi0gICAgICBwcmVmZXJyZWRfYnVmZmVyX3NpemUpOworICAgICAgcHJlZmVycmVkX2J1ZmZlcl9zaXplX2luX2J5dGVzKTsKICAgaWYgKCFqX2F1ZGlvX3RyYWNrX2JyaWRnZSkgewogICAgIHJldHVybjsKICAgfQpAQCAtMzU4LDE2ICszNTksMjUgQEAKICAgICBpbnQgc2FtcGxpbmdfZnJlcXVlbmN5X2h6KSB7CiAgIFNCX0RDSEVDSyhhdWRpb190cmFja19hdWRpb19zaW5rX3R5cGVfKTsKIAotICByZXR1cm4gYXVkaW9fdHJhY2tfYXVkaW9fc2lua190eXBlXy0+bWluX3JlcXVpcmVkX2ZyYW1lc18ubG9hZCgpOworICBKbmlFbnZFeHQqIGVudiA9IEpuaUVudkV4dDo6R2V0KCk7CisgIFNjb3BlZExvY2FsSmF2YVJlZjxqb2JqZWN0PiBqX2F1ZGlvX291dHB1dF9tYW5hZ2VyKAorICAgICAgZW52LT5DYWxsU3RhcmJvYXJkT2JqZWN0TWV0aG9kT3JBYm9ydCgKKyAgICAgICAgICAiZ2V0QXVkaW9PdXRwdXRNYW5hZ2VyIiwgIigpTGRldi9jb2JhbHQvbWVkaWEvQXVkaW9PdXRwdXRNYW5hZ2VyOyIpKTsKKyAgaW50IGF1ZGlvX3RyYWNrX21pbl9idWZmZXJfc2l6ZSA9IHN0YXRpY19jYXN0PGludD4oZW52LT5DYWxsSW50TWV0aG9kT3JBYm9ydCgKKyAgICAgIGpfYXVkaW9fb3V0cHV0X21hbmFnZXIuR2V0KCksICJnZXRNaW5CdWZmZXJTaXplIiwgIihJSUkpSSIsCisgICAgICBHZXRBdWRpb0Zvcm1hdFNhbXBsZVR5cGUoc2FtcGxlX3R5cGUpLCBzYW1wbGluZ19mcmVxdWVuY3lfaHosIGNoYW5uZWxzKSk7CisgIGludCBhdWRpb190cmFja19taW5fYnVmZmVyX3NpemVfaW5fZnJhbWVzID0KKyAgICAgIGF1ZGlvX3RyYWNrX21pbl9idWZmZXJfc2l6ZSAvIGNoYW5uZWxzIC8gR2V0U2FtcGxlU2l6ZShzYW1wbGVfdHlwZSk7CisgIHJldHVybiBzdGQ6Om1heCgKKyAgICAgIGF1ZGlvX3RyYWNrX21pbl9idWZmZXJfc2l6ZV9pbl9mcmFtZXMsCisgICAgICBhdWRpb190cmFja19hdWRpb19zaW5rX3R5cGVfLT5HZXRNaW5CdWZmZXJTaXplSW5GcmFtZXNJbnRlcm5hbCgKKyAgICAgICAgICBjaGFubmVscywgc2FtcGxlX3R5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeikpOwogfQogCiBBdWRpb1RyYWNrQXVkaW9TaW5rVHlwZTo6QXVkaW9UcmFja0F1ZGlvU2lua1R5cGUoKQotICAgIDogbWluX3JlcXVpcmVkX2ZyYW1lc190ZXN0ZXJfKGtBdWRpb1NpbmtCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhSZXF1aXJlZEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdFJlcXVpcmVkRnJhbWVzLAorICAgIDogbWluX3JlcXVpcmVkX2ZyYW1lc190ZXN0ZXJfKGtNYXhSZXF1aXJlZEZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZWRGcmFtZXNJbmNyZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01pblN0YWJsZVBsYXllZEZyYW1lcyksCi0gICAgICBtaW5fcmVxdWlyZWRfZnJhbWVzXyhrTWF4UmVxdWlyZWRGcmFtZXMpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01pblN0YWJsZVBsYXllZEZyYW1lcykge30KIAogU2JBdWRpb1NpbmsgQXVkaW9UcmFja0F1ZGlvU2lua1R5cGU6OkNyZWF0ZSgKICAgICBpbnQgY2hhbm5lbHMsCkBAIC0zODQsMTMgKzM5NCwxMyBAQAogICAvLyBsYXJnZSBidWZmZXIgbWF5IGNhdXNlIEF1ZGlvVHJhY2sgbm90IGFibGUgdG8gc3RhcnQuIEFuZCBDb2JhbHQgbm93IHdyaXRlCiAgIC8vIG5vIG1vcmUgdGhhbiAxcyBvZiBhdWRpbyBkYXRhIGFuZCBubyBtb3JlIHRoYW4gMC41IGFoZWFkIHRvIHN0YXJib2FyZAogICAvLyBwbGF5ZXIsIGxpbWl0IHRoZSBidWZmZXIgc2l6ZSB0byBzdG9yZSBhdCBtb3N0IDAuNXMgb2YgYXVkaW8gZGF0YS4KLSAgaW50IHByZWZlcnJlZF9idWZmZXJfc2l6ZSA9CisgIGludCBwcmVmZXJyZWRfYnVmZmVyX3NpemVfaW5fYnl0ZXMgPQogICAgICAgc3RkOjptaW4oZnJhbWVzX3Blcl9jaGFubmVsLCBzYW1wbGluZ19mcmVxdWVuY3lfaHogLyAyKSAqIGNoYW5uZWxzICoKICAgICAgIEdldFNhbXBsZVNpemUoYXVkaW9fc2FtcGxlX3R5cGUpOwogICBBdWRpb1RyYWNrQXVkaW9TaW5rKiBhdWRpb19zaW5rID0gbmV3IEF1ZGlvVHJhY2tBdWRpb1NpbmsoCiAgICAgICB0aGlzLCBjaGFubmVscywgc2FtcGxpbmdfZnJlcXVlbmN5X2h6LCBhdWRpb19zYW1wbGVfdHlwZSwgZnJhbWVfYnVmZmVycywKLSAgICAgIGZyYW1lc19wZXJfY2hhbm5lbCwgcHJlZmVycmVkX2J1ZmZlcl9zaXplLCB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLAotICAgICAgY29uc3VtZV9mcmFtZXNfZnVuYywgY29udGV4dCk7CisgICAgICBmcmFtZXNfcGVyX2NoYW5uZWwsIHByZWZlcnJlZF9idWZmZXJfc2l6ZV9pbl9ieXRlcywKKyAgICAgIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMsIGNvbnN1bWVfZnJhbWVzX2Z1bmMsIGNvbnRleHQpOwogICBpZiAoIWF1ZGlvX3NpbmstPklzQXVkaW9UcmFja1ZhbGlkKCkpIHsKICAgICBTQl9ETE9HKEVSUk9SKQogICAgICAgICA8PCAiQXVkaW9UcmFja0F1ZGlvU2lua1R5cGU6OkNyZWF0ZSBmYWlsZWQgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIjsKQEAgLTQwNyw3ICs0MTcsOCBAQAogICAgICAgICBTQl9MT0coSU5GTykgPDwgIlJlY2VpdmVkIG1pbiByZXF1aXJlZCBmcmFtZXMgIiA8PCBtaW5fcmVxdWlyZWRfZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciAiIDw8IG51bWJlcl9vZl9jaGFubmVscyA8PCAiIGNoYW5uZWxzLCAiCiAgICAgICAgICAgICAgICAgICAgICA8PCBzYW1wbGVfcmF0ZSA8PCAiaHouIjsKLSAgICAgICAgbWluX3JlcXVpcmVkX2ZyYW1lc18uc3RvcmUobWluX3JlcXVpcmVkX2ZyYW1lcyk7CisgICAgICAgIFNjb3BlZExvY2sgbG9jayhtaW5fcmVxdWlyZWRfZnJhbWVzX21hcF9tdXRleF8pOworICAgICAgICBtaW5fcmVxdWlyZWRfZnJhbWVzX21hcF9bc2FtcGxlX3JhdGVdID0gbWluX3JlcXVpcmVkX2ZyYW1lczsKICAgICAgIH07CiAKICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSA9IGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlRmxvYXQzMjsKQEAgLTQxNSwxMiArNDI2LDMzIEBACiAgICAgc2FtcGxlX3R5cGUgPSBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUludDE2RGVwcmVjYXRlZDsKICAgICBTQl9EQ0hFQ0soU2JBdWRpb1NpbmtJc0F1ZGlvU2FtcGxlVHlwZVN1cHBvcnRlZChzYW1wbGVfdHlwZSkpOwogICB9CisgIG1pbl9yZXF1aXJlZF9mcmFtZXNfdGVzdGVyXy5BZGRUZXN0KDIsIHNhbXBsZV90eXBlLCBrU2FtcGxlRnJlcXVlbmN5NDhrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1pblJlcXVpcmVkRnJhbWVzRm9yV2ViQXVkaW9SZWNlaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAqIDEwMjQpOworICBtaW5fcmVxdWlyZWRfZnJhbWVzX3Rlc3Rlcl8uQWRkVGVzdCgyLCBzYW1wbGVfdHlwZSwga1NhbXBsZUZyZXF1ZW5jeTIyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25NaW5SZXF1aXJlZEZyYW1lc0ZvcldlYkF1ZGlvUmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiAxMDI0KTsKKyAgbWluX3JlcXVpcmVkX2ZyYW1lc190ZXN0ZXJfLlN0YXJ0KCk7Cit9CiAKLSAgLy8gQ3VycmVudGx5LCBjb2JhbHQgb25seSB1c2UgfG1pbl9yZXF1aXJlZF9mcmFtZXNffCBmb3Igd2ViIGF1ZGlvLCB3aGljaAotICAvLyBvbmx5IHN1cHBvcnRzIDQ4ayBtb25vIG9yIHN0ZXJlbyBzb3VuZC4gSXQgc2hvdWxkIGJlIGZpbmUgbm93IHRvIG9ubHkKLSAgLy8gdGVzdCA0OGsgc3RlcmVvIHNvdW5kLgotICBtaW5fcmVxdWlyZWRfZnJhbWVzX3Rlc3Rlcl8uU3RhcnRUZXN0KDIsIHNhbXBsZV90eXBlLCA0ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1pblJlcXVpcmVkRnJhbWVzRm9yV2ViQXVkaW9SZWNlaXZlZCk7CitpbnQgQXVkaW9UcmFja0F1ZGlvU2lua1R5cGU6OkdldE1pbkJ1ZmZlclNpemVJbkZyYW1lc0ludGVybmFsKAorICAgIGludCBjaGFubmVscywKKyAgICBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNhbXBsZV90eXBlLAorICAgIGludCBzYW1wbGluZ19mcmVxdWVuY3lfaHopIHsKKyAgaWYgKHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiA8PSBrU2FtcGxlRnJlcXVlbmN5MjJrKSB7CisgICAgU2NvcGVkTG9jayBsb2NrKG1pbl9yZXF1aXJlZF9mcmFtZXNfbWFwX211dGV4Xyk7CisgICAgaWYgKG1pbl9yZXF1aXJlZF9mcmFtZXNfbWFwXy5maW5kKGtTYW1wbGVGcmVxdWVuY3kyMmspICE9CisgICAgICAgIG1pbl9yZXF1aXJlZF9mcmFtZXNfbWFwXy5lbmQoKSkgeworICAgICAgcmV0dXJuIG1pbl9yZXF1aXJlZF9mcmFtZXNfbWFwX1trU2FtcGxlRnJlcXVlbmN5MjJrXTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc2FtcGxpbmdfZnJlcXVlbmN5X2h6IDw9IGtTYW1wbGVGcmVxdWVuY3k0OGspIHsKKyAgICBTY29wZWRMb2NrIGxvY2sobWluX3JlcXVpcmVkX2ZyYW1lc19tYXBfbXV0ZXhfKTsKKyAgICBpZiAobWluX3JlcXVpcmVkX2ZyYW1lc19tYXBfLmZpbmQoa1NhbXBsZUZyZXF1ZW5jeTQ4aykgIT0KKyAgICAgICAgbWluX3JlcXVpcmVkX2ZyYW1lc19tYXBfLmVuZCgpKSB7CisgICAgICByZXR1cm4gbWluX3JlcXVpcmVkX2ZyYW1lc19tYXBfW2tTYW1wbGVGcmVxdWVuY3k0OGtdOworICAgIH0KKyAgfQorICByZXR1cm4ga01heFJlcXVpcmVkRnJhbWVzOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX3RyYWNrX2F1ZGlvX3NpbmtfdHlwZS5oIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb190cmFja19hdWRpb19zaW5rX3R5cGUuaAppbmRleCA4MjFhMTQ2Li45NjZmYTI3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX3RyYWNrX2F1ZGlvX3NpbmtfdHlwZS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXVkaW9fdHJhY2tfYXVkaW9fc2lua190eXBlLmgKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KIAogI2luY2x1ZGUgInN0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb19zaW5rX21pbl9yZXF1aXJlZF9mcmFtZXNfdGVzdGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2puaV9lbnZfZXh0LmgiCkBAIC02OCw4ICs2OSwxNCBAQAogICB2b2lkIFRlc3RNaW5SZXF1aXJlZEZyYW1lcygpOwogCiAgcHJpdmF0ZToKLSAgc3RkOjphdG9taWNfaW50IG1pbl9yZXF1aXJlZF9mcmFtZXNfOworICBpbnQgR2V0TWluQnVmZmVyU2l6ZUluRnJhbWVzSW50ZXJuYWwoaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ19mcmVxdWVuY3lfaHopOworCiAgIE1pblJlcXVpcmVkRnJhbWVzVGVzdGVyIG1pbl9yZXF1aXJlZF9mcmFtZXNfdGVzdGVyXzsKKyAgTXV0ZXggbWluX3JlcXVpcmVkX2ZyYW1lc19tYXBfbXV0ZXhfOworICAvLyBUaGUgbWluaW11bSBmcmFtZXMgcmVxdWlyZWQgdG8gYXZvaWQgdW5kZXJydW5zIG9mIGRpZmZlcmVudCBmcmVxdWVuY2llcy4KKyAgc3RkOjptYXA8aW50LCBpbnQ+IG1pbl9yZXF1aXJlZF9mcmFtZXNfbWFwXzsKIH07CiAKIGNsYXNzIEF1ZGlvVHJhY2tBdWRpb1NpbmsgOiBwdWJsaWMgU2JBdWRpb1NpbmtQcml2YXRlIHsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvY29uZmlndXJhdGlvbl9jb25zdGFudHMuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViM2M4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmNjCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzIGZvciBhIHBsYXRmb3JtLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmgiCisKKy8vIERldGVybWluZXMgdGhlIGFsaWdubWVudCB0aGF0IGFsbG9jYXRpb25zIHNob3VsZCBoYXZlIG9uIHRoaXMgcGxhdGZvcm0uCitjb25zdCBzaXplX3Qga1NiTWFsbG9jQWxpZ25tZW50ID0gMTY7CisKKy8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KK2NvbnN0IGludDMyX3Qga1NiTWF4VGhyZWFkTmFtZUxlbmd0aCA9IDE2OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDdhYmMyMDguLmM1MTEwZjggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTI5MSw5ICsyOTEsNiBAQAogLy8gc3BlY2lmeSB0aGF0LgogI2RlZmluZSBTQl9ORVRXT1JLX0lPX0JVRkZFUl9BTElHTk1FTlQgMTYKIAotLy8gRGV0ZXJtaW5lcyB0aGUgYWxpZ25tZW50IHRoYXQgYWxsb2NhdGlvbnMgc2hvdWxkIGhhdmUgb24gdGhpcyBwbGF0Zm9ybS4KLSNkZWZpbmUgU0JfTUFMTE9DX0FMSUdOTUVOVCAoKHNpemVfdCkxNlUpCi0KIC8vIERldGVybWluZXMgdGhlIHRocmVzaGhvbGQgb2YgYWxsb2NhdGlvbiBzaXplIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCBtbWFwCiAvLyAoaWYgYXZhaWxhYmxlKSwgcmF0aGVyIHRoYW4gYWxsb2NhdGVkIHdpdGhpbiB0aGUgY29yZSBoZWFwLgogI2RlZmluZSBTQl9ERUZBVUxUX01NQVBfVEhSRVNIT0xEICgoc2l6ZV90KSgyNTYgKiAxMDI0VSkpCkBAIC0zMzAsOSArMzI3LDYgQEAKIC8vIHRvIG5vdCBpbmNsdWRlIGhlcmUgdG8gZGVjcmVhc2Ugc3ltYm9sIHBvbGx1dGlvbi4KICNkZWZpbmUgU0JfTUFYX1RIUkVBRF9MT0NBTF9LRVlTIDEyOAogCi0vLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCAxNgotCiAvLyAtLS0gVHVuZWFibGUgUGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHRoZSBuZXR3b3JrIHJlY2VpdmUgYnVmZmVyIHNpemUgaW4gYnl0ZXMsIHNldCB2aWEKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvZGlyZWN0b3J5X2dldF9uZXh0LmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9kaXJlY3RvcnlfZ2V0X25leHQuY2MKaW5kZXggZjFlNWIwMi4uNTI1ZmRmNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9kaXJlY3RvcnlfZ2V0X25leHQuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9kaXJlY3RvcnlfZ2V0X25leHQuY2MKQEAgLTE1LDIxICsxNSwyNCBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9kaXJlY3RvcnkuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQvYXNzZXRfbWFuYWdlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2RpcmVjdG9yeV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaXNvL2ltcGwvZGlyZWN0b3J5X2dldF9uZXh0LmgiCiAKLWJvb2wgU2JEaXJlY3RvcnlHZXROZXh0KFNiRGlyZWN0b3J5IGRpcmVjdG9yeSwgU2JEaXJlY3RvcnlFbnRyeSogb3V0X2VudHJ5KSB7Ci0gIGlmIChkaXJlY3RvcnkgJiYgZGlyZWN0b3J5LT5hc3NldF9kaXIgJiYgb3V0X2VudHJ5KSB7Citib29sIFNiRGlyZWN0b3J5R2V0TmV4dChTYkRpcmVjdG9yeSBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBvdXRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0X2VudHJ5X3NpemUpIHsKKyAgaWYgKGRpcmVjdG9yeSAmJiBkaXJlY3RvcnktPmFzc2V0X2RpciAmJiBvdXRfZW50cnkgJiYKKyAgICAgIG91dF9lbnRyeV9zaXplID49IFNCX0ZJTEVfTUFYX05BTUUpIHsKICAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUgPSBBQXNzZXREaXJfZ2V0TmV4dEZpbGVOYW1lKGRpcmVjdG9yeS0+YXNzZXRfZGlyKTsKICAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgc2l6ZV90IHNpemUgPSBTQl9BUlJBWV9TSVpFX0lOVChvdXRfZW50cnktPm5hbWUpOwotICAgIFNiU3RyaW5nQ29weShvdXRfZW50cnktPm5hbWUsIGZpbGVfbmFtZSwgc2l6ZSk7CisgICAgU2JTdHJpbmdDb3B5KG91dF9lbnRyeSwgZmlsZV9uYW1lLCBvdXRfZW50cnlfc2l6ZSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICByZXR1cm4gOjpzdGFyYm9hcmQ6OnNoYXJlZDo6aXNvOjppbXBsOjpTYkRpcmVjdG9yeUdldE5leHQoZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2VudHJ5KTsKKyAgcmV0dXJuIDo6c3RhcmJvYXJkOjpzaGFyZWQ6Omlzbzo6aW1wbDo6U2JEaXJlY3RvcnlHZXROZXh0KAorICAgICAgZGlyZWN0b3J5LCBvdXRfZW50cnksIG91dF9lbnRyeV9zaXplKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQppbmRleCBjMDZjYzYwLi5kNWYyM2UwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5neXBpCkBAIC0yMCw3ICsyMCw4IEBACiAgICAgJ3RhcmdldF9vcyc6ICdhbmRyb2lkJywKICAgICAnZmluYWxfZXhlY3V0YWJsZV90eXBlJzogJ3NoYXJlZF9saWJyYXJ5JywKICAgICAnZ3Rlc3RfdGFyZ2V0X3R5cGUnOiAnc2hhcmVkX2xpYnJhcnknLAotICAgICdzYl93aWRldmluZV9wbGF0Zm9ybScgOiAnYW5kcm9pZCcsCisgICAgJ3NiX3dpZGV2aW5lX3BsYXRmb3JtJzogJ2FuZHJvaWQnLAorICAgICdzYl9lbmFibGVfYmVuY2htYXJrJzogMSwKIAogICAgICdnbF90eXBlJzogJ3N5c3RlbV9nbGVzMicsCiAgICAgJ2VuYWJsZV9yZW1vdGVfZGVidWdnaW5nJzogMCwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfZGVjb2Rlci5jYwppbmRleCBmMWEzZGZiLi4yNGVkOGE0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2RlY29kZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9kZWNvZGVyLmNjCkBAIC0zNDMsNyArMzQzLDcgQEAKICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBpbnB1dF9idWZmZXJfaW5kaWNlcykgewogICBTQl9EQ0hFQ0sobWVkaWFfY29kZWNfYnJpZGdlXyk7CiAKLSAgLy8gRHVyaW5nIHNlY3VyZSBwbGF5YmFjaywgYW5kIG9ubHkgc2VjdXJlIHBsYXliYWNrLCBpcyBpcyBwb3NzaWJsZSB0aGF0IG91cgorICAvLyBEdXJpbmcgc2VjdXJlIHBsYXliYWNrLCBhbmQgb25seSBzZWN1cmUgcGxheWJhY2ssIGl0IGlzIHBvc3NpYmxlIHRoYXQgb3VyCiAgIC8vIGF0dGVtcHQgdG8gZW5xdWV1ZSBhbiBpbnB1dCBidWZmZXIgd2lsbCBiZSByZWplY3RlZCBieSBNZWRpYUNvZGVjIGJlY2F1c2UKICAgLy8gd2UgZG8gbm90IGhhdmUgYSBrZXkgeWV0LiAgSW4gdGhpcyBjYXNlLCB3ZSBob2xkIG9uIHRvIHRoZSBpbnB1dCBidWZmZXIKICAgLy8gdGhhdCB3ZSBoYXZlIGFscmVhZHkgc2V0IHVwLCBhbmQgcmVwZWF0ZWRseSBhdHRlbXB0IHRvIGVucXVldWUgaXQgdW50aWwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYwppbmRleCBjMmY1MmFhLi4xMTdmZDk3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9wbGF5ZXJfY29tcG9uZW50c19pbXBsLmNjCkBAIC01OCw4ICs1OCwxMSBAQAogICAgICAgICAgIHJldHVybiBhdWRpb19kZWNvZGVyX2ltcGwuUGFzc0FzPEF1ZGlvRGVjb2Rlcj4oKTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIGlmIChhdWRpb19zYW1wbGVfaW5mby5jb2RlYyA9PSBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzKSB7Ci0gICAgICAgIHJldHVybiBzY29wZWRfcHRyPEF1ZGlvRGVjb2Rlcj4oCisgICAgICAgIHNjb3BlZF9wdHI8T3B1c0F1ZGlvRGVjb2Rlcj4gYXVkaW9fZGVjb2Rlcl9pbXBsKAogICAgICAgICAgICAgbmV3IE9wdXNBdWRpb0RlY29kZXIoYXVkaW9fc2FtcGxlX2luZm8pKTsKKyAgICAgICAgaWYgKGF1ZGlvX2RlY29kZXJfaW1wbC0+aXNfdmFsaWQoKSkgeworICAgICAgICAgIHJldHVybiBhdWRpb19kZWNvZGVyX2ltcGwuUGFzc0FzPEF1ZGlvRGVjb2Rlcj4oKTsKKyAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgU0JfTk9UUkVBQ0hFRCgpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKaW5kZXggYWQ4OTQzNS4uZDhmYjEwZSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCkBAIC04MCw2ICs4MCw3IEBACiAgICAgICAgICdiaW9uaWMvcHJpdmF0ZS9iaW9uaWNfbWFjcm9zLmgnLAogICAgICAgICAnYmlvbmljL3ByaXZhdGUvRXJybm9SZXN0b3Jlci5oJywKICAgICAgICAgJ2NvbmZpZ3VyYXRpb25fcHVibGljLmgnLAorICAgICAgICAnY29uZmlndXJhdGlvbl9jb25zdGFudHMuY2MnLAogICAgICAgICAnZGVjb2RlX3RhcmdldF9jcmVhdGUuY2MnLAogICAgICAgICAnZGVjb2RlX3RhcmdldF9jcmVhdGUuaCcsCiAgICAgICAgICdkZWNvZGVfdGFyZ2V0X2dldF9pbmZvLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdmlkZW9fZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdmlkZW9fZGVjb2Rlci5jYwppbmRleCAyMjdiNTRjLi5iM2Q1NDJiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3ZpZGVvX2RlY29kZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb19kZWNvZGVyLmNjCkBAIC01MjQsMjEgKzUyNCwxNiBAQAogICAgIGlmIChoYXNfbmV3X3RleHR1cmUpIHsKICAgICAgIHVwZGF0ZVRleEltYWdlKGRlY29kZV90YXJnZXRfLT5kYXRhLT5zdXJmYWNlX3RleHR1cmUpOwogCisgICAgICBkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby5wbGFuZXNbMF0ud2lkdGggPSBmcmFtZV93aWR0aF87CisgICAgICBkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby5wbGFuZXNbMF0uaGVpZ2h0ID0gZnJhbWVfaGVpZ2h0XzsKKyAgICAgIGRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLndpZHRoID0gZnJhbWVfd2lkdGhfOworICAgICAgZGVjb2RlX3RhcmdldF8tPmRhdGEtPmluZm8uaGVpZ2h0ID0gZnJhbWVfaGVpZ2h0XzsKKwogICAgICAgZmxvYXQgbWF0cml4NHg0WzE2XTsKICAgICAgIGdldFRyYW5zZm9ybU1hdHJpeChkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+c3VyZmFjZV90ZXh0dXJlLCBtYXRyaXg0eDQpOwogICAgICAgU2V0RGVjb2RlVGFyZ2V0Q29udGVudFJlZ2lvbkZyb21NYXRyaXgoCi0gICAgICAgICAgJmRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLnBsYW5lc1swXS5jb250ZW50X3JlZ2lvbiwgMSwgMSwKLSAgICAgICAgICBtYXRyaXg0eDQpOwotCi0gICAgICAvLyBNYXJrIHRoZSBkZWNvZGUgdGFyZ2V0J3Mgd2lkdGggYW5kIGhlaWdodCBhcyAxLCBzbyB0aGF0IHRoZQotICAgICAgLy8gfGNvbnRlbnRfcmVnaW9ufCdzIGNvb3JkaW5hdGVzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgbm9ybWFsaXplZAotICAgICAgLy8gY29vcmRpbmF0ZXMuICBUaGlzIGlzIG5pY2UgYmVjYXVzZSBvbiBBbmRyb2lkIHdlJ3JlIG5ldmVyIGV4cGxpY2l0bHkKLSAgICAgIC8vIHRvbGQgdGhlIHRleHR1cmUgd2lkdGgvaGVpZ2h0LCBhbmQgd2UgYXJlIG9ubHkgcHJvdmlkZWQgdGhlIGNvbnRlbnQKLSAgICAgIC8vIHJlZ2lvbiB2aWEgbm9ybWFsaXplZCBjb29yZGluYXRlcy4KLSAgICAgIGRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLnBsYW5lc1swXS53aWR0aCA9IDE7Ci0gICAgICBkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby5wbGFuZXNbMF0uaGVpZ2h0ID0gMTsKLSAgICAgIGRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLndpZHRoID0gMTsKLSAgICAgIGRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLmhlaWdodCA9IDE7CisgICAgICAgICAgJmRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLnBsYW5lc1swXS5jb250ZW50X3JlZ2lvbiwgZnJhbWVfd2lkdGhfLAorICAgICAgICAgIGZyYW1lX2hlaWdodF8sIG1hdHJpeDR4NCk7CiAKICAgICAgIGlmICghZmlyc3RfdGV4dHVyZV9yZWNlaXZlZF8pIHsKICAgICAgICAgZmlyc3RfdGV4dHVyZV9yZWNlaXZlZF8gPSB0cnVlOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9iZW5jaG1hcmsvYmVuY2htYXJrLmd5cCBiL3NyYy9zdGFyYm9hcmQvYmVuY2htYXJrL2JlbmNobWFyay5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2MjZhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvYmVuY2htYXJrL2JlbmNobWFyay5neXAKQEAgLTAsMCArMSw0NyBAQAorIyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2JlbmNobWFyaycsCisgICAgICAndHlwZSc6ICc8KGZpbmFsX2V4ZWN1dGFibGVfdHlwZSknLAorICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICMgVGhpcyBhbGxvd3MgdGhlIGJlbmNobWFya3MgdG8gaW5jbHVkZSBpbnRlcm5hbCBvbmx5IGhlYWRlciBmaWxlcy4KKyAgICAgICAgJ1NUQVJCT0FSRF9JTVBMRU1FTlRBVElPTicsCisgICAgICBdLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvYmVuY2htYXJrL21lbW9yeV9iZW5jaG1hcmsuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2JlbmNobWFyay90aHJlYWRfYmVuY2htYXJrLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9jb21tb24vYmVuY2htYXJrX21haW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8QChjb2JhbHRfcGxhdGZvcm1fZGVwZW5kZW5jaWVzKScsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cDpzdGFyYm9hcmQnLAorICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9nb29nbGVfYmVuY2htYXJrLmd5cDpnb29nbGVfYmVuY2htYXJrJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYmVuY2htYXJrX2RlcGxveScsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdiZW5jaG1hcmsnLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdleGVjdXRhYmxlX25hbWUnOiAnYmVuY2htYXJrJywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvZGVwbG95Lmd5cGknIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYmVuY2htYXJrL21lbW9yeV9iZW5jaG1hcmsuY2MgYi9zcmMvc3RhcmJvYXJkL2JlbmNobWFyay9tZW1vcnlfYmVuY2htYXJrLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTNjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2JlbmNobWFyay9tZW1vcnlfYmVuY2htYXJrLmNjCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvaW5jbHVkZS9iZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgeworCit2b2lkIEJNX01lbW9yeUNvcHkoOjpiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICB2b2lkKiBtZW1vcnkxID0gU2JNZW1vcnlBbGxvY2F0ZShzdGF0ZS5yYW5nZSgwKSk7CisgIHZvaWQqIG1lbW9yeTIgPSBTYk1lbW9yeUFsbG9jYXRlKHN0YXRlLnJhbmdlKDApKTsKKworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgU2JNZW1vcnlDb3B5KG1lbW9yeTEsIG1lbW9yeTIsIHN0YXRlLnJhbmdlKDApKTsKKyAgICA6OmJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpOworICB9CisgIHN0YXRlLlNldEJ5dGVzUHJvY2Vzc2VkKGludDY0X3Qoc3RhdGUuaXRlcmF0aW9ucygpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qoc3RhdGUucmFuZ2UoMCkpKTsKKworICBTYk1lbW9yeURlYWxsb2NhdGUobWVtb3J5MSk7CisgIFNiTWVtb3J5RGVhbGxvY2F0ZShtZW1vcnkyKTsKK30KKwordm9pZCBCTV9NZW1vcnlNb3ZlKDo6YmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgdm9pZCogbWVtb3J5MSA9IFNiTWVtb3J5QWxsb2NhdGUoc3RhdGUucmFuZ2UoMCkpOworICB2b2lkKiBtZW1vcnkyID0gU2JNZW1vcnlBbGxvY2F0ZShzdGF0ZS5yYW5nZSgwKSk7CisKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIFNiTWVtb3J5TW92ZShtZW1vcnkxLCBtZW1vcnkyLCBzdGF0ZS5yYW5nZSgwKSk7CisgICAgOjpiZW5jaG1hcms6OkNsb2JiZXJNZW1vcnkoKTsKKyAgfQorICBzdGF0ZS5TZXRCeXRlc1Byb2Nlc3NlZChpbnQ2NF90KHN0YXRlLml0ZXJhdGlvbnMoKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KHN0YXRlLnJhbmdlKDApKSk7CisKKyAgU2JNZW1vcnlEZWFsbG9jYXRlKG1lbW9yeTEpOworICBTYk1lbW9yeURlYWxsb2NhdGUobWVtb3J5Mik7Cit9CisKK0JFTkNITUFSSyhCTV9NZW1vcnlDb3B5KS0+UmFuZ2VNdWx0aXBsaWVyKDQpLT5SYW5nZSgxNiwgMTAyNCAqIDEwMjQpOworQkVOQ0hNQVJLKEJNX01lbW9yeUNvcHkpCisgICAgLT5BcmcoMTAyNCAqIDEwMjQpCisgICAgLT5EZW5zZVRocmVhZFJhbmdlKDEsIDQpCisgICAgLT5Vc2VSZWFsVGltZSgpOworQkVOQ0hNQVJLKEJNX01lbW9yeU1vdmUpLT5BcmcoMTAyNCAqIDEwMjQpOworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBiZW5jaG1hcmsKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYmVuY2htYXJrL3RocmVhZF9iZW5jaG1hcmsuY2MgYi9zcmMvc3RhcmJvYXJkL2JlbmNobWFyay90aHJlYWRfYmVuY2htYXJrLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTJlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2JlbmNobWFyay90aHJlYWRfYmVuY2htYXJrLmNjCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvaW5jbHVkZS9iZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgeworCit2b2lkIEJNX0ludGVnZXJBY2N1bXVsYXRpb24oOjpiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBjb25zdCBpbnQga0l0ZXJhdGlvbnMgPSAxMDI0ICogMTAyNDsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGludCB4ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtJdGVyYXRpb25zOyArK2kpIHsKKyAgICAgIDo6YmVuY2htYXJrOjpEb05vdE9wdGltaXplKHggKz0gaSk7CisgICAgfQorICB9CisgIHN0YXRlLlNldEl0ZW1zUHJvY2Vzc2VkKGtJdGVyYXRpb25zKTsKK30KKworQkVOQ0hNQVJLKEJNX0ludGVnZXJBY2N1bXVsYXRpb24pLT5EZW5zZVRocmVhZFJhbmdlKDEsIDgpLT5Vc2VSZWFsVGltZSgpOworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBiZW5jaG1hcmsKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYnVpbGQvYmFzZV9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2J1aWxkL2Jhc2VfY29uZmlndXJhdGlvbi5neXBpCmluZGV4IDM4YjA3NGYuLmMwZGZiOGIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYnVpbGQvYmFzZV9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9idWlsZC9iYXNlX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMTIxLDYgKzEyMSw5IEBACiAgICAgIyBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHBsYXllciBpcyBmaWx0ZXIgYmFzZWQuCiAgICAgJ3NiX2ZpbHRlcl9iYXNlZF9wbGF5ZXIlJzogMSwKIAorICAgICMgVXNlZCB0byBlbmFibGUgYmVuY2htYXJrcy4KKyAgICAnc2JfZW5hYmxlX2JlbmNobWFyayUnOiAwLAorCiAgICAgIyBUaGlzIHZhcmlhYmxlIGRpY3RhdGVzIHdoZXRoZXIgYSBnaXZlbiBneXAgdGFyZ2V0IHNob3VsZCBiZSBjb21waWxlZCB3aXRoCiAgICAgIyBvcHRpbWl6YXRpb24gZmxhZ3MgZm9yIHNpemUgdnMuIHNwZWVkLgogICAgICdvcHRpbWl6ZV90YXJnZXRfZm9yX3NwZWVkJSc6IDAsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbW1vbi9iZW5jaG1hcmtfbWFpbi5jYyBiL3NyYy9zdGFyYm9hcmQvY29tbW9uL2JlbmNobWFya19tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDBhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2NvbW1vbi9iZW5jaG1hcmtfbWFpbi5jYwpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvd3JhcF9tYWluL3dyYXBfbWFpbi5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9ldmVudC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2luY2x1ZGUvYmVuY2htYXJrL2JlbmNobWFyay5oIgorCituYW1lc3BhY2UgeworaW50IFJ1bkFsbEJlbmNobWFya3MoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6YmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsKKyAgOjpiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoKTsKKyAgcmV0dXJuIDA7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworLy8gV2hlbiB3ZSBhcmUgYnVpbGRpbmcgRXZlcmdyZWVuIHdlIG5lZWQgdG8gZXhwb3J0IFNiRXZlbnRIYW5kbGUgc28gdGhhdCB0aGUKKy8vIEVMRiBsb2FkZXIgY2FuIGZpbmQgYW5kIGludm9rZSBpdC4KKyNpZiBTQl9JUyhFVkVSR1JFRU4pCitTQl9FWFBPUlQKKyNlbmRpZiAgLy8gU0JfSVMoRVZFUkdSRUVOKQorU1RBUkJPQVJEX1dSQVBfU0lNUExFX01BSU4oUnVuQWxsQmVuY2htYXJrcyk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCBiL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCmluZGV4IGQ2NTA0MTQuLjYwN2EyNGYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCisrKyBiL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCkBAIC0xODAsNiArMTgwLDM2IEBACiAvLyAgdmFsdWVzIGFyZSBjb25zdW1lZCwgdGFrZSBhIGxvb2sgYXQgLy9zdGFyYm9hcmQvc2FiaS4KICNkZWZpbmUgU0JfU0FCSV9GSUxFX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKKy8vIFVwZGF0ZXMgdGhlIEFQSSBndWFyYW50ZWVzIG9mIFNiTXV0ZXhBY3F1aXJlVHJ5LgorLy8gU2JNdXRleEFjcXVpcmVUcnkgbm93IGhhcyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBpdCBpcyBpbnZva2VkIG9uIGEgbXV0ZXgKKy8vIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgYnkgdGhlIGNhbGxpbmcgdGhyZWFkLiBJbiBhZGRpdGlvbiwgc2luY2UKKy8vIFNiTXV0ZXhBY3F1aXJlVHJ5IHdhcyB1c2VkIGluIFNiTXV0ZXhEZXN0cm95LCBTYk11dGV4RGVzdHJveSBub3cgaGFzCisvLyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBpbnZva2VkIG9uIGEgbG9ja2VkIG11dGV4LgorI2RlZmluZSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisKKy8vIE1pZ3JhdGUgdGhlIFN0YXJib2FyZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIG1hY3JvcyB0byBleHRlcm4gY29uc3RzLgorLy8KKy8vIFRoZSBtaWdyYXRpb24gYWxsb3dzIENvYmFsdCB0byBtYWtlIHBsYXRmb3JtIGxldmVsIGRlY2lzaW9ucyBhdCBydW50aW1lCisvLyBpbnN0ZWFkIG9mIGNvbXBpbGUgdGltZSB3aGljaCBsZXRzIHVzIGNyZWF0ZSBhIG1vcmUgY29tcHJlaGVuc2l2ZSBDb2JhbHQKKy8vIGJpbmFyeS4KKy8vCisvLyBUaGlzIG1lYW5zIENvYmFsdCBtdXN0IHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGVzZSBtYWNyb3MgdGhhdCB3b3VsZCBub3QKKy8vIHRyYW5zbGF0ZSB3ZWxsIHRvIGNvbnN0YW50cywgaS5lLiBpbiBjb21waWxlIHRpbWUgcmVmZXJlbmNlcyBvciBpbml0aWFsaXppbmcKKy8vIGFycmF5cy4gVGhlcmVmb3JlLCB3ZSBuZWVkZWQgdG8gY2hhbmdlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBmdW5jdGlvbgorLy8gYFNiRGlyZWN0b3J5R2V0TmV4dGAgaW4gInN0YXJib2FyZC9kaXJlY3RvcnkuaCIuIEJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdG8KKy8vIHVzZSB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLCB3ZSBwYXNzIGluIGEgYy1zdHJpbmcgYW5kIGxlbmd0aCB0byB0aGUgZnVuY3Rpb24KKy8vIHRvIGFjaGlldmUgdGhlIHNhbWUgcmVzdWx0IGFzIGJlZm9yZSB3aGVuIHBhc3NpbmcgaW4gYSBgU2JEaXJlY3RvcnlFbnRyeWAuCisvLworLy8gQSBwbGF0Zm9ybSB3aWxsIGRlZmluZSB0aGUgZXh0ZXJuIGNvbnN0YW50cyBkZWNsYXJlZCBpbgorLy8gInN0YXJib2FyZC9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5oIi4gVGhlIGRlZmluaXRpb25zIGFyZSBkb25lIGluCisvLyAic3RhcmJvYXJkLzxQTEFURk9STV9QQVRIPi9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5jYyIuCisvLworLy8gVGhlIGV4YWN0IG1hcHBpbmcgYmV0d2VlbiBtYWNyb3MgYW5kIGV4dGVybiB2YXJpYWJsZXMgY2FuIGJlIGZvdW5kIGluCisvLyAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY29uZmlndXJhdGlvbl9jb25zdGFudHNfY29tcGF0aWJpbGl0eV9kZWZpbmVzLmgiCisvLyB0aG91Z2ggdGhlIG5hbWluZyBzY2hlbWUgaXMgdmVyeSBuZWFybHkgdGhlIHNhbWU6IHRoZSBvbGQgU0JfRk9PIG1hY3JvIHdpbGwKKy8vIGFsd2F5cyBiZWNvbWUgdGhlIGNvbnN0YW50IGtTYkZvby4KKyNkZWZpbmUgU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKwogLy8gLS0tIFJlbGVhc2UgQ2FuZGlkYXRlIEZlYXR1cmUgRGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIC0tLSBDb21tb24gRGV0ZWN0ZWQgRmVhdHVyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjY1LDYgKzI5NSwxNCBAQAogLy8gYW5kIGFsbCBjb25maWd1cmF0aW9ucy4KICNpbmNsdWRlIFNUQVJCT0FSRF9DT05GSUdVUkFUSU9OX0lOQ0xVREUKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorLy8gQWZ0ZXIgU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTiwgd2Ugc3RhcnQgdG8gdXNlIHJ1bnRpbWUgY29uc3RhbnRzCisvLyBpbnN0ZWFkIG9mIG1hY3JvcyBmb3IgY2VydGFpbiBwbGF0Zm9ybSBkZXBlbmRlbnQgY29uZmlndXJhdGlvbnMuIFRoaXMgZmlsZQorLy8gc3Vic3RpdHV0ZXMgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJ1bnRpbWUgY29uc3RhbnRzIHNvCisvLyB3ZSBkb24ndCByZWZlcmVuY2UgdGhlc2UgY29uc3RhbnRzIHdoZW4gdGhleSBhcmVuJ3QgZGVmaW5lZC4KKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jb25maWd1cmF0aW9uX2NvbnN0YW50c19jb21wYXRpYmlsaXR5X2RlZmluZXMuaCIKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisKIC8vIC0tLSBPdmVycmlkYWJsZSBIZWxwZXIgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBTVEFSQk9BUkRfQ09ORklHVVJBVElPTl9JTkNMVURFCkBAIC01ODYsMTAgKzYyNCwzMCBAQAogI2Vycm9yICJZb3VyIHBsYXRmb3JtIG11c3QgZGVmaW5lIFNCX01BWF9USFJFQURfTE9DQUxfS0VZUy4iCiAjZW5kaWYKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKworI2lmIGRlZmluZWQoU0JfTUFMTE9DX0FMSUdOTUVOVCkKKyNlcnJvciBcCisgICAgIlNCX01BTExPQ19BTElHTk1FTlQgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIGluIFN0YXJib2FyZCAiIFwKKyJ2ZXJzaW9ucyAxMiBhbmQgbGF0ZXIuIEluc3RlYWQsIGRlZmluZSBrU2JNYWxsb2NBbGlnbm1lbnQgaW4gIiBcCisic3RhcmJvYXJkLzxQTEFURk9STV9QQVRIPi9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5jYy4iCisjZW5kaWYKKworI2lmIGRlZmluZWQoU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCkKKyNlcnJvciBcCisgICAgIlNCX01BWF9USFJFQURfTkFNRV9MRU5HVEggc2hvdWxkIG5vdCBiZSBkZWZpbmVkIGluIFN0YXJib2FyZCAiIFwKKyJ2ZXJzaW9ucyAxMiBhbmQgbGF0ZXIuIEluc3RlYWQsIGRlZmluZSBrU2JNYXhUaHJlYWROYW1lTGVuZ3RoIGluICIgXAorInN0YXJib2FyZC88UExBVEZPUk1fUEFUSD4vY29uZmlndXJhdGlvbl9jb25zdGFudHMuY2MuIgorI2VuZGlmCisKKyNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisKICNpZiAhZGVmaW5lZChTQl9NQVhfVEhSRUFEX05BTUVfTEVOR1RIKQogI2Vycm9yICJZb3VyIHBsYXRmb3JtIG11c3QgZGVmaW5lIFNCX01BWF9USFJFQURfTkFNRV9MRU5HVEguIgogI2VuZGlmCiAKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorCiAjaWYgKFNCX0FQSV9WRVJTSU9OIDwgMTIgJiYgIWRlZmluZWQoU0JfSEFTX01JQ1JPUEhPTkUpKQogI2Vycm9yIFwKICAgICAiWW91ciBwbGF0Zm9ybSBtdXN0IGRlZmluZSBTQl9IQVNfTUlDUk9QSE9ORSBpbiBBUEkgdmVyc2lvbnMgMTEgb3IgZWFybGllci4iCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmggYi9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3NzJkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbl9jb25zdGFudHMuaApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIE1vZHVsZSBPdmVydmlldzogU3RhcmJvYXJkIENvbmZpZ3VyYXRpb24gVmFyaWFibGVzIG1vZHVsZQorLy8KKy8vIERlY2xhcmVzIGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB3ZSB3aWxsIG5lZWQgdG8gdXNlIGF0IHJ1bnRpbWUuCisvLyBUaGVzZSB2YXJpYWJsZXMgZGVzY3JpYmUgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaW4gZGV0YWlsIHRvIGFsbG93IGNvYmFsdCB0bworLy8gbWFrZSBydW50aW1lIGRlY2lzaW9ucyBiYXNlZCBvbiBwZXIgcGxhdGZvcm0gY29uZmlndXJhdGlvbnMuCisKKyNpZm5kZWYgU1RBUkJPQVJEX0NPTkZJR1VSQVRJT05fQ09OU1RBTlRTX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9DT05GSUdVUkFUSU9OX0NPTlNUQU5UU19IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisKKy8vIERldGVybWluZXMgdGhlIGFsaWdubWVudCB0aGF0IGFsbG9jYXRpb25zIHNob3VsZCBoYXZlIG9uIHRoaXMgcGxhdGZvcm0uCitleHRlcm4gY29uc3Qgc2l6ZV90IGtTYk1hbGxvY0FsaWdubWVudDsKKworLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBuYW1lIGZvciBhIHRocmVhZCwgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbmF0b3IuCitleHRlcm4gY29uc3QgaW50MzJfdCBrU2JNYXhUaHJlYWROYW1lTGVuZ3RoOworCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKworI2VuZGlmICAvLyBTVEFSQk9BUkRfQ09ORklHVVJBVElPTl9DT05TVEFOVFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvZGlyZWN0b3J5LmggYi9zcmMvc3RhcmJvYXJkL2RpcmVjdG9yeS5oCmluZGV4IGM5MDMyYjIuLjk3ZWY0NDggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvZGlyZWN0b3J5LmgKKysrIGIvc3JjL3N0YXJib2FyZC9kaXJlY3RvcnkuaApAQCAtMzQsMTEgKzM0LDEzIEBACiAvLyBBIGhhbmRsZSB0byBhbiBvcGVuIGRpcmVjdG9yeSBzdHJlYW0uCiB0eXBlZGVmIHN0cnVjdCBTYkRpcmVjdG9yeVByaXZhdGUqIFNiRGlyZWN0b3J5OwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAvLyBSZXByZXNlbnRzIGEgZGlyZWN0b3J5IGVudHJ5LgogdHlwZWRlZiBzdHJ1Y3QgU2JEaXJlY3RvcnlFbnRyeSB7CiAgIC8vIFRoZSBuYW1lIG9mIHRoaXMgZGlyZWN0b3J5IGVudHJ5LgogICBjaGFyIG5hbWVbU0JfRklMRV9NQVhfTkFNRV07CiB9IFNiRGlyZWN0b3J5RW50cnk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogCiAvLyBXZWxsLWRlZmluZWQgdmFsdWUgZm9yIGFuIGludmFsaWQgZGlyZWN0b3J5IHN0cmVhbSBoYW5kbGUuCiAjZGVmaW5lIGtTYkRpcmVjdG9yeUludmFsaWQgKChTYkRpcmVjdG9yeSlOVUxMKQpAQCAtNjQsNiArNjYsMjQgQEAKIC8vIHxkaXJlY3Rvcnl8OiBUaGUgZGlyZWN0b3J5IHN0cmVhbSBoYW5kbGUgdG8gY2xvc2UuCiBTQl9FWFBPUlQgYm9vbCBTYkRpcmVjdG9yeUNsb3NlKFNiRGlyZWN0b3J5IGRpcmVjdG9yeSk7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisvLyBQb3B1bGF0ZXMgfG91dF9lbnRyeXwgd2l0aCB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBzdHJlYW0sCisvLyBhbmQgbW92ZXMgdGhlIHN0cmVhbSBmb3J3YXJkIGJ5IG9uZSBlbnRyeS4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgfHRydWV8IGlmIHRoZXJlIHdhcyBhIG5leHQgZGlyZWN0b3J5LCBhbmQgfGZhbHNlfAorLy8gYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5IHN0cmVhbSBvciBpZiB8b3V0X2VudHJ5X3NpemV8IGlzIHNtYWxsZXIgdGhhbgorLy8gU0JfRklMRV9NQVhfTkFNRS4KKy8vCisvLyB8ZGlyZWN0b3J5fDogVGhlIGRpcmVjdG9yeSBzdHJlYW0gZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbmV4dCBkaXJlY3RvcnkuCisvLyB8b3V0X2VudHJ5fDogVGhlIG51bGwgdGVybWluYXRlZCBzdHJpbmcgdG8gYmUgcG9wdWxhdGVkIHdpdGggdGhlIG5leHQKKy8vICAgICAgICAgICAgICBkaXJlY3RvcnkgZW50cnkuIFRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoaXMgc3RyaW5nIHNob3VsZCBiZQorLy8gICAgICAgICAgICAgIGVxdWFsIHRvIHxvdXRfZW50cnlfc2l6ZXwuCisvLyB8b3V0X2VudHJ5X3NpemV8OiBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgYWxsb2NhdGVkIGZvciB8b3V0X2VudHJ5fC4gVGhpcworLy8gICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGF0IGxlYXN0IGVxdWFsIHRvIFNCX0ZJTEVfTUFYX05BTUUuCitTQl9FWFBPUlQgYm9vbCBTYkRpcmVjdG9yeUdldE5leHQoU2JEaXJlY3RvcnkgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG91dF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0X2VudHJ5X3NpemUpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAvLyBQb3B1bGF0ZXMgfG91dF9lbnRyeXwgd2l0aCB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBzdHJlYW0sCiAvLyBhbmQgbW92ZXMgdGhlIHN0cmVhbSBmb3J3YXJkIGJ5IG9uZSBlbnRyeS4KIC8vCkBAIC03NCw2ICs5NCw3IEBACiAvLyB8b3V0X2VudHJ5fDogVGhlIHZhcmlhYmxlIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeS4KIFNCX0VYUE9SVCBib29sIFNiRGlyZWN0b3J5R2V0TmV4dChTYkRpcmVjdG9yeSBkaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEaXJlY3RvcnlFbnRyeSogb3V0X2VudHJ5KTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogCiAvLyBJbmRpY2F0ZXMgd2hldGhlciBTYkRpcmVjdG9yeU9wZW4gaXMgYWxsb3dlZCBmb3IgdGhlIGdpdmVuIHxwYXRofC4KIC8vCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5jYyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzA2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5jYwpAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBjb25maWd1cmF0aW9uIGNvbnN0YW50cyBmb3IgYSBwbGF0Zm9ybS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5oIgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorCisvLyBEZXRlcm1pbmVzIHRoZSBhbGlnbm1lbnQgdGhhdCBhbGxvY2F0aW9ucyBzaG91bGQgaGF2ZSBvbiB0aGlzIHBsYXRmb3JtLgorY29uc3Qgc2l6ZV90IGtTYk1hbGxvY0FsaWdubWVudCA9IDE2OworCisvLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBuYW1lIGZvciBhIHRocmVhZCwgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbmF0b3IuCitjb25zdCBpbnQzMl90IGtTYk1heFRocmVhZE5hbWVMZW5ndGggPSAxNjsKKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCBiM2FlZmY3Li40ODU3NTNjIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTI4Nyw4ICsyODcsMTAgQEAKIC8vIHNwZWNpZnkgdGhhdC4KICNkZWZpbmUgU0JfTkVUV09SS19JT19CVUZGRVJfQUxJR05NRU5UIDE2CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KIC8vIERldGVybWluZXMgdGhlIGFsaWdubWVudCB0aGF0IGFsbG9jYXRpb25zIHNob3VsZCBoYXZlIG9uIHRoaXMgcGxhdGZvcm0uCiAjZGVmaW5lIFNCX01BTExPQ19BTElHTk1FTlQgKChzaXplX3QpMTZVKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KIAogLy8gRGV0ZXJtaW5lcyB0aGUgdGhyZXNoaG9sZCBvZiBhbGxvY2F0aW9uIHNpemUgdGhhdCBzaG91bGQgYmUgZG9uZSB3aXRoIG1tYXAKIC8vIChpZiBhdmFpbGFibGUpLCByYXRoZXIgdGhhbiBhbGxvY2F0ZWQgd2l0aGluIHRoZSBjb3JlIGhlYXAuCkBAIC0zMTksOCArMzIxLDEwIEBACiAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkIGxvY2FsIHN0b3JhZ2Uga2V5cyBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KICNkZWZpbmUgU0JfTUFYX1RIUkVBRF9MT0NBTF9LRVlTIDUxMgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAvLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KICNkZWZpbmUgU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCAxNgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KIAogLy8gLS0tIFR1bmVhYmxlIFBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5neXBpCmluZGV4IGIyMjQ5MzUuLmI1NjU1NDMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMjUsNiArMjUsOCBAQAogICAgICd0YXJnZXRfb3MnOiAnbGludXgnLAogICAgICd5YXNtX2V4aXN0cyc6IDEsCiAgICAgJ3NiX3dpZGV2aW5lX3BsYXRmb3JtJyA6ICdsaW51eCcsCisgICAgJ3NiX2Rpc2FibGVfb3B1c19zc2UnOiAxLAorICAgICdzYl9lbmFibGVfYmVuY2htYXJrJzogMSwKIAogICAgICdwbGF0Zm9ybV9saWJyYXJpZXMnOiBbCiAgICAgICAnLWxhc291bmQnLApAQCAtNDUsMTQgKzQ3LDE0IEBACiAgICAgICAndXNlX2RsbWFsbG9jX2FsbG9jYXRvciUnOiAwLAogICAgIH0sCiAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgIFsnc2JfZXZlcmdyZWVuICE9IDEnLCB7Ci0gICAgICAgICAgIyBUT0RPOiBhbGxvdyBzdGFyYm9hcmRfcGxhdGZvcm0gdG8gdXNlIHN5c3RlbSBsaWJjL2xpYmMrKyBpbiB0aGUKLSAgICAgICAgICAjIGZ1dHVyZS4gRm9yIG5vdywgaWYgdGhpcyBmbGFncyBpcyBlbmFibGVkLCBhIHdhcm5pbmcgZW1lcmdlIHNheWluZwotICAgICAgICAgICMgaXQncyB1bnVzZWQgYW55d2F5LgotICAgICAgICAgICdsaW5rZXJfZmxhZ3MnOiBbCi0gICAgICAgICAgICAnLXN0YXRpYy1saWJzdGRjKysnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAorICAgICAgWydzYl9ldmVyZ3JlZW4gIT0gMScsIHsKKyAgICAgICAgIyBUT0RPOiBhbGxvdyBzdGFyYm9hcmRfcGxhdGZvcm0gdG8gdXNlIHN5c3RlbSBsaWJjL2xpYmMrKyBpbiB0aGUKKyAgICAgICAgIyBmdXR1cmUuIEZvciBub3csIGlmIHRoaXMgZmxhZ3MgaXMgZW5hYmxlZCwgYSB3YXJuaW5nIGVtZXJnZSBzYXlpbmcKKyAgICAgICAgIyBpdCdzIHVudXNlZCBhbnl3YXkuCisgICAgICAgICdsaW5rZXJfZmxhZ3MnOiBbCisgICAgICAgICAgJy1zdGF0aWMtbGlic3RkYysrJywKKyAgICAgICAgXSwKKyAgICAgIH1dLAogICAgIF0sCiAgIH0sCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2xhdW5jaGVyLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvbGF1bmNoZXIucHkKaW5kZXggNjYyZTY4ZC4uZTViYThmMSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvbGF1bmNoZXIucHkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvbGF1bmNoZXIucHkKQEAgLTI1LDYgKzI1LDcgQEAKIAogaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKIGZyb20gc3RhcmJvYXJkLnRvb2xzIGltcG9ydCBhYnN0cmFjdF9sYXVuY2hlcgorZnJvbSBzdGFyYm9hcmQudG9vbHMgaW1wb3J0IHNlbmRfbGluawogCiBTVEFUVVNfQ0hBTkdFX1RJTUVPVVQgPSAxNQogCkBAIC0xMjQsNiArMTI1LDE1IEBACiAgICAgZWxzZToKICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkNhbm5vdCBzZW5kIHN1c3BlbmQgdG8gZXhlY3V0YWJsZTsgaXQgaXMgY2xvc2VkLlxuIikKIAorICBkZWYgU3VwcG9ydHNEZWVwTGluayhzZWxmKToKKyAgICByZXR1cm4gVHJ1ZQorCisgIGRlZiBTZW5kRGVlcExpbmsoc2VsZiwgbGluayk6CisgICAgIyBUaGUgY29ubmVjdCBjYWxsIGluIFNlbmRMaW5rIG9jY2Fzc2lvbmFsbHkgZmFpbHMuIFJldHJ5IGEgZmV3IHRpbWVzIGlmIHRoaXMgaGFwcGVucy4KKyAgICBjb25uZWN0aW9uX2F0dGVtcHRzID0gMworICAgIHJldHVybiBzZW5kX2xpbmsuU2VuZExpbmsoCisgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5leGVjdXRhYmxlKSwgbGluaywgY29ubmVjdGlvbl9hdHRlbXB0cykKKwogICBkZWYgV2FpdEZvclByb2Nlc3NTdGF0dXMoc2VsZiwgdGFyZ2V0X3N0YXR1cywgdGltZW91dCk6CiAgICAgIiIiV2FpdCBmb3IgQ29iYWx0IHRvIHR1cm4gdG8gdGFyZ2V0IHN0YXR1cyB3aXRoaW4gc3BlY2lmaWVkIHRpbWVvdXQgbGltaXQuCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9wbGF5ZXJfY29tcG9uZW50c19pbXBsLmNjCmluZGV4IDUzNjUyZWYuLjIwYmFhYWYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvbGliYW9tL2FvbV92aWRlb19kZWNvZGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9saWJkZTI2NS9kZTI2NV92aWRlb19kZWNvZGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9saWJ2cHgvdnB4X3ZpZGVvX2RlY29kZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hZGFwdGl2ZV9hdWRpb19kZWNvZGVyX2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19kZWNvZGVyX2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9zaW5rLmgiCkBAIC01MiwxNSArNTMsMjUgQEAKICAgICBTQl9EQ0hFQ0soYXVkaW9fZGVjb2Rlcik7CiAgICAgU0JfRENIRUNLKGF1ZGlvX3JlbmRlcmVyX3NpbmspOwogCisgICAgdHlwZWRlZiA6OnN0YXJib2FyZDo6c2hhcmVkOjpmZm1wZWc6OkF1ZGlvRGVjb2RlciBGZm1wZWdBdWRpb0RlY29kZXI7CisgICAgdHlwZWRlZiA6OnN0YXJib2FyZDo6c2hhcmVkOjpvcHVzOjpPcHVzQXVkaW9EZWNvZGVyIE9wdXNBdWRpb0RlY29kZXI7CisKICNpZiBTQl9BUElfVkVSU0lPTiA+PSAxMQogICAgIGF1dG8gZGVjb2Rlcl9jcmVhdG9yID0gW10oY29uc3QgU2JNZWRpYUF1ZGlvU2FtcGxlSW5mbyYgYXVkaW9fc2FtcGxlX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtKSB7Ci0gICAgICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OmZmbXBlZzo6QXVkaW9EZWNvZGVyIEF1ZGlvRGVjb2RlckltcGw7Ci0KLSAgICAgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVySW1wbD4gYXVkaW9fZGVjb2Rlcl9pbXBsKAotICAgICAgICAgIEF1ZGlvRGVjb2RlckltcGw6OkNyZWF0ZShhdWRpb19zYW1wbGVfaW5mby5jb2RlYywgYXVkaW9fc2FtcGxlX2luZm8pKTsKLSAgICAgIGlmIChhdWRpb19kZWNvZGVyX2ltcGwgJiYgYXVkaW9fZGVjb2Rlcl9pbXBsLT5pc192YWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBhdWRpb19kZWNvZGVyX2ltcGwuUGFzc0FzPEF1ZGlvRGVjb2Rlcj4oKTsKKyAgICAgIGlmIChhdWRpb19zYW1wbGVfaW5mby5jb2RlYyA9PSBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzKSB7CisgICAgICAgIHNjb3BlZF9wdHI8T3B1c0F1ZGlvRGVjb2Rlcj4gYXVkaW9fZGVjb2Rlcl9pbXBsKAorICAgICAgICAgICAgbmV3IE9wdXNBdWRpb0RlY29kZXIoYXVkaW9fc2FtcGxlX2luZm8pKTsKKyAgICAgICAgaWYgKGF1ZGlvX2RlY29kZXJfaW1wbC0+aXNfdmFsaWQoKSkgeworICAgICAgICAgIHJldHVybiBhdWRpb19kZWNvZGVyX2ltcGwuUGFzc0FzPEF1ZGlvRGVjb2Rlcj4oKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2NvcGVkX3B0cjxGZm1wZWdBdWRpb0RlY29kZXI+IGF1ZGlvX2RlY29kZXJfaW1wbCgKKyAgICAgICAgICAgIEZmbXBlZ0F1ZGlvRGVjb2Rlcjo6Q3JlYXRlKGF1ZGlvX3NhbXBsZV9pbmZvLmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX2luZm8pKTsKKyAgICAgICAgaWYgKGF1ZGlvX2RlY29kZXJfaW1wbCAmJiBhdWRpb19kZWNvZGVyX2ltcGwtPmlzX3ZhbGlkKCkpIHsKKyAgICAgICAgICByZXR1cm4gYXVkaW9fZGVjb2Rlcl9pbXBsLlBhc3NBczxBdWRpb0RlY29kZXI+KCk7CisgICAgICAgIH0KICAgICAgIH0KICAgICAgIHJldHVybiBzY29wZWRfcHRyPEF1ZGlvRGVjb2Rlcj4oKTsKICAgICB9OwpAQCAtNjksMTQgKzgwLDIzIEBACiAgICAgICAgIG5ldyBBZGFwdGl2ZUF1ZGlvRGVjb2RlcihhdWRpb19wYXJhbWV0ZXJzLmF1ZGlvX3NhbXBsZV9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGFyYW1ldGVycy5kcm1fc3lzdGVtLCBkZWNvZGVyX2NyZWF0b3IpKTsKICNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTEKLSAgICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OmZmbXBlZzo6QXVkaW9EZWNvZGVyIEF1ZGlvRGVjb2RlckltcGw7Ci0KLSAgICBzY29wZWRfcHRyPEF1ZGlvRGVjb2RlckltcGw+IGF1ZGlvX2RlY29kZXJfaW1wbChBdWRpb0RlY29kZXJJbXBsOjpDcmVhdGUoCi0gICAgICAgIGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9fY29kZWMsIGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9fc2FtcGxlX2luZm8pKTsKLSAgICBpZiAoYXVkaW9fZGVjb2Rlcl9pbXBsICYmIGF1ZGlvX2RlY29kZXJfaW1wbC0+aXNfdmFsaWQoKSkgewotICAgICAgYXVkaW9fZGVjb2Rlci0+cmVzZXQoYXVkaW9fZGVjb2Rlcl9pbXBsLnJlbGVhc2UoKSk7CisgICAgaWYgKGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9fY29kZWMgPT0ga1NiTWVkaWFBdWRpb0NvZGVjT3B1cykgeworICAgICAgc2NvcGVkX3B0cjxPcHVzQXVkaW9EZWNvZGVyPiBhdWRpb19kZWNvZGVyX2ltcGwoCisgICAgICAgICAgbmV3IE9wdXNBdWRpb0RlY29kZXIoYXVkaW9fcGFyYW1ldGVycy5hdWRpb19zYW1wbGVfaW5mbykpOworICAgICAgaWYgKGF1ZGlvX2RlY29kZXJfaW1wbCAmJiBhdWRpb19kZWNvZGVyX2ltcGwtPmlzX3ZhbGlkKCkpIHsKKyAgICAgICAgYXVkaW9fZGVjb2Rlci0+cmVzZXQoYXVkaW9fZGVjb2Rlcl9pbXBsLnJlbGVhc2UoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdWRpb19kZWNvZGVyLT5yZXNldCgpOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBhdWRpb19kZWNvZGVyLT5yZXNldCgpOworICAgICAgc2NvcGVkX3B0cjxGZm1wZWdBdWRpb0RlY29kZXI+IGF1ZGlvX2RlY29kZXJfaW1wbCgKKyAgICAgICAgICBGZm1wZWdBdWRpb0RlY29kZXI6OkNyZWF0ZShhdWRpb19wYXJhbWV0ZXJzLmF1ZGlvX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9fc2FtcGxlX2luZm8pKTsKKyAgICAgIGlmIChhdWRpb19kZWNvZGVyX2ltcGwgJiYgYXVkaW9fZGVjb2Rlcl9pbXBsLT5pc192YWxpZCgpKSB7CisgICAgICAgIGF1ZGlvX2RlY29kZXItPnJlc2V0KGF1ZGlvX2RlY29kZXJfaW1wbC5yZWxlYXNlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXVkaW9fZGVjb2Rlci0+cmVzZXQoKTsKKyAgICAgIH0KICAgICB9CiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDExCiAgICAgYXVkaW9fcmVuZGVyZXJfc2luay0+cmVzZXQobmV3IEF1ZGlvUmVuZGVyZXJTaW5rSW1wbCk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCmluZGV4IGQzMzU5NDYuLmI5Mjg2YjMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCkBAIC0zMSw2ICszMSw3IEBACiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb21tYW5kX2xpbmVfZGVmYXVsdHMuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29tbWFuZF9saW5lX2RlZmF1bHRzLmgnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9kZWNvZGVfdGFyZ2V0X2dldF9pbmZvLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oJywKQEAgLTEyNSw2ICsxMjYsOCBAQAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbm91c2VyL3VzZXJfZ2V0X3Byb3BlcnR5LmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL25vdXNlci91c2VyX2dldF9zaWduZWRfaW4uY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbm91c2VyL3VzZXJfaW50ZXJuYWwuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvb3B1cy9vcHVzX2F1ZGlvX2RlY29kZXIuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvb3B1cy9vcHVzX2F1ZGlvX2RlY29kZXIuaCcsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9wb3NpeC9kaXJlY3RvcnlfY3JlYXRlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3Bvc2l4L2ZpbGVfYXRvbWljX3JlcGxhY2UuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvcG9zaXgvZmlsZV9jYW5fb3Blbi5jYycsCkBAIC0zODIsNiArMzg1LDcgQEAKICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9kZTI2NV9pbmNsdWRlcy9kZTI2NV9pbmNsdWRlcy5neXA6ZGUyNjUnLAogICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2RsbWFsbG9jL2RsbWFsbG9jLmd5cDpkbG1hbGxvYycsCiAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvbGliZXZlbnQvbGliZXZlbnQuZ3lwOmxpYmV2ZW50JywKKyAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9vcHVzL29wdXMuZ3lwOm9wdXMnLAogICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L3B1bHNlYXVkaW9faW5jbHVkZXMvcHVsc2VhdWRpb19pbmNsdWRlcy5neXA6cHVsc2VhdWRpbycsCiAgICAgXSwKICAgICAnY29uZGl0aW9ucyc6IFsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbXV0ZXguaCBiL3NyYy9zdGFyYm9hcmQvbXV0ZXguaAppbmRleCAwZjYyMjZlLi5hZmQ4OTI3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL211dGV4LmgKKysrIGIvc3JjL3N0YXJib2FyZC9tdXRleC5oCkBAIC01NCwxMCArNTQsMTcgQEAKIC8vIHxvdXRfbXV0ZXh8OiBUaGUgaGFuZGxlIHRvIHRoZSBuZXdseSBjcmVhdGVkIG11dGV4LgogU0JfRVhQT1JUIGJvb2wgU2JNdXRleENyZWF0ZShTYk11dGV4KiBvdXRfbXV0ZXgpOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTVVURVhfQUNRVUlSRV9UUllfQVBJX0NIQU5HRV9WRVJTSU9OCisvLyBEZXN0cm95cyBhIG11dGV4LiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkZXN0cnVjdGlvbiB3YXMKKy8vIHN1Y2Nlc3NmdWwuIERlc3Ryb3lpbmcgYSBsb2NrZWQgbXV0ZXggcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCisvLworLy8gfG11dGV4fDogVGhlIG11dGV4IHRvIGJlIGludmFsaWRhdGVkLgorI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KIC8vIERlc3Ryb3lzIGEgbXV0ZXguIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlc3RydWN0aW9uIHdhcwogLy8gc3VjY2Vzc2Z1bC4KIC8vCiAvLyB8bXV0ZXh8OiBUaGUgbXV0ZXggdG8gYmUgaW52YWxpZGF0ZWQuCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX01VVEVYX0FDUVVJUkVfVFJZX0FQSV9DSEFOR0VfVkVSU0lPTgogU0JfRVhQT1JUIGJvb2wgU2JNdXRleERlc3Ryb3koU2JNdXRleCogbXV0ZXgpOwogCiAvLyBBY3F1aXJlcyB8bXV0ZXh8LCBibG9ja2luZyBpbmRlZmluaXRlbHkuIFRoZSByZXR1cm4gdmFsdWUgaWRlbnRpZmllcwpAQCAtNjcsMTEgKzc0LDE5IEBACiAvLyB8bXV0ZXh8OiBUaGUgbXV0ZXggdG8gYmUgYWNxdWlyZWQuCiBTQl9FWFBPUlQgU2JNdXRleFJlc3VsdCBTYk11dGV4QWNxdWlyZShTYk11dGV4KiBtdXRleCk7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KKy8vIEFjcXVpcmVzIHxtdXRleHwsIHdpdGhvdXQgYmxvY2tpbmcuIFRoZSByZXR1cm4gdmFsdWUgaWRlbnRpZmllcworLy8gdGhlIGFjcXVpc2l0aW9uIHJlc3VsdC4gU2JNdXRleGVzIGFyZSBub3QgcmVlbnRyYW50LCBzbyBhIHJlY3Vyc2l2ZQorLy8gYWNxdWlzaXRpb24gaGFzIHVuZGVmaW5lZCBiZWhhdmlvci4KKy8vCisvLyB8bXV0ZXh8OiBUaGUgbXV0ZXggdG8gYmUgYWNxdWlyZWQuCisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX01VVEVYX0FDUVVJUkVfVFJZX0FQSV9DSEFOR0VfVkVSU0lPTgogLy8gQWNxdWlyZXMgfG11dGV4fCwgd2l0aG91dCBibG9ja2luZy4gVGhlIHJldHVybiB2YWx1ZSBpZGVudGlmaWVzCiAvLyB0aGUgYWNxdWlzaXRpb24gcmVzdWx0LiBTYk11dGV4ZXMgYXJlIG5vdCByZWVudHJhbnQsIHNvIGEgcmVjdXJzaXZlCiAvLyBhY3F1aXNpdGlvbiBhbHdheXMgZmFpbHMuCiAvLwogLy8gfG11dGV4fDogVGhlIG11dGV4IHRvIGJlIGFjcXVpcmVkLgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KIFNCX0VYUE9SVCBTYk11dGV4UmVzdWx0IFNiTXV0ZXhBY3F1aXJlVHJ5KFNiTXV0ZXgqIG11dGV4KTsKIAogLy8gUmVsZWFzZXMgfG11dGV4fCBoZWxkIGJ5IHRoZSBjdXJyZW50IHRocmVhZC4gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9hdWRpb19zaW5rX2hlbHBlcnMuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvYXVkaW9fc2lua19oZWxwZXJzLmNjCmluZGV4IDA4MmNlNjIuLmIwYTBkOWMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9hdWRpb19zaW5rX2hlbHBlcnMuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2F1ZGlvX3NpbmtfaGVscGVycy5jYwpAQCAtMTQsNiArMTQsOCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvYXVkaW9fc2lua19oZWxwZXJzLmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL2xvZy5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTEwNywxMyArMTA5LDEyIEBACiAKIHZvaWQgQXVkaW9TaW5rVGVzdEVudmlyb25tZW50OjpBcHBlbmRGcmFtZShpbnQgZnJhbWVzX3RvX2FwcGVuZCkgewogICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgZnJhbWVzX2FwcGVuZGVkXyArPSBmcmFtZXNfdG9fYXBwZW5kOworICBBcHBlbmRGcmFtZV9Mb2NrZWQoZnJhbWVzX3RvX2FwcGVuZCk7CiB9CiAKLWludCBBdWRpb1NpbmtUZXN0RW52aXJvbm1lbnQ6OkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlQW1vdW50KCkgY29uc3QgeworaW50IEF1ZGlvU2lua1Rlc3RFbnZpcm9ubWVudDo6R2V0RnJhbWVCdWZmZXJGcmVlU3BhY2VJbkZyYW1lcygpIGNvbnN0IHsKICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gIGludCBmcmFtZXNfaW5fYnVmZmVyID0gZnJhbWVzX2FwcGVuZGVkXyAtIGZyYW1lc19jb25zdW1lZF87Ci0gIHJldHVybiBmcmFtZV9idWZmZXJzXy5mcmFtZXNfcGVyX2NoYW5uZWwoKSAtIGZyYW1lc19pbl9idWZmZXI7CisgIHJldHVybiBHZXRGcmFtZUJ1ZmZlckZyZWVTcGFjZUluRnJhbWVzX0xvY2tlZCgpOwogfQogCiBib29sIEF1ZGlvU2lua1Rlc3RFbnZpcm9ubWVudDo6V2FpdFVudGlsVXBkYXRlU3RhdHVzQ2FsbGVkKCkgewpAQCAtMTQ3LDIwICsxNDgsNDggQEAKIH0KIAogYm9vbCBBdWRpb1NpbmtUZXN0RW52aXJvbm1lbnQ6OldhaXRVbnRpbEFsbEZyYW1lc0FyZUNvbnN1bWVkKCkgeworICBjb25zdCBpbnQga01heGltdW1GcmFtZXNQZXJBcHBlbmQgPSAxMDI0OworCiAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwogICBpc19lb3NfcmVhY2hlZF8gPSB0cnVlOworICBpbnQgZnJhbWVzX2FwcGVuZGVkX2JlZm9yZV9lb3MgPSBmcmFtZXNfYXBwZW5kZWRfOwogICBTYlRpbWVNb25vdG9uaWMgc3RhcnQgPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKLSAgd2hpbGUgKGZyYW1lc19hcHBlbmRlZF8gIT0gZnJhbWVzX2NvbnN1bWVkXykgeworICBpbnQgc2lsZW5jZV9mcmFtZXNfYXBwZW5kZWQgPSAwOworCisgIHdoaWxlIChmcmFtZXNfY29uc3VtZWRfIDwgZnJhbWVzX2FwcGVuZGVkX2JlZm9yZV9lb3MpIHsKICAgICBTYlRpbWUgdGltZV9lbGFwc2VkID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCkgLSBzdGFydDsKICAgICBpZiAodGltZV9lbGFwc2VkID49IGtUaW1lVG9UcnkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgU2JUaW1lIHRpbWVfdG9fd2FpdCA9IGtUaW1lVG9UcnkgLSB0aW1lX2VsYXBzZWQ7CisKKyAgICAvLyBBcHBlbmQgc2lsZW5jZSBhcyBzb21lIGF1ZGlvIHNpbmsgaW1wbGVtZW50YXRpb25zIHdvbid0IGJlIGFibGUgdG8gZmluaXNoCisgICAgLy8gcGxheWJhY2sgdG8gdGhlIGxhc3QgZnJhbWVzIGZpbGxlZC4KKyAgICBpbnQgc2lsZW5jZV9mcmFtZXNfdG9fYXBwZW5kID0KKyAgICAgICAgc3RkOjptaW4oe0dldEZyYW1lQnVmZmVyRnJlZVNwYWNlSW5GcmFtZXNfTG9ja2VkKCksCisgICAgICAgICAgICAgICAgICBmcmFtZV9idWZmZXJzXy5mcmFtZXNfcGVyX2NoYW5uZWwoKSAtIHNpbGVuY2VfZnJhbWVzX2FwcGVuZGVkLAorICAgICAgICAgICAgICAgICAga01heGltdW1GcmFtZXNQZXJBcHBlbmR9KTsKKyAgICBBcHBlbmRGcmFtZV9Mb2NrZWQoc2lsZW5jZV9mcmFtZXNfdG9fYXBwZW5kKTsKKyAgICBzaWxlbmNlX2ZyYW1lc19hcHBlbmRlZCArPSBzaWxlbmNlX2ZyYW1lc190b19hcHBlbmQ7CisKICAgICBjb25kaXRpb25fdmFyaWFibGVfLldhaXRUaW1lZCh0aW1lX3RvX3dhaXQpOwogICB9CiAgIHJldHVybiB0cnVlOwogfQogCit2b2lkIEF1ZGlvU2lua1Rlc3RFbnZpcm9ubWVudDo6QXBwZW5kRnJhbWVfTG9ja2VkKGludCBmcmFtZXNfdG9fYXBwZW5kKSB7CisgIG11dGV4Xy5EQ2hlY2tBY3F1aXJlZCgpOworCisgIGZyYW1lc19hcHBlbmRlZF8gKz0gZnJhbWVzX3RvX2FwcGVuZDsKK30KKworaW50IEF1ZGlvU2lua1Rlc3RFbnZpcm9ubWVudDo6R2V0RnJhbWVCdWZmZXJGcmVlU3BhY2VJbkZyYW1lc19Mb2NrZWQoKSBjb25zdCB7CisgIG11dGV4Xy5EQ2hlY2tBY3F1aXJlZCgpOworCisgIGludCBmcmFtZXNfaW5fYnVmZmVyID0gZnJhbWVzX2FwcGVuZGVkXyAtIGZyYW1lc19jb25zdW1lZF87CisgIHJldHVybiBmcmFtZV9idWZmZXJzXy5mcmFtZXNfcGVyX2NoYW5uZWwoKSAtIGZyYW1lc19pbl9idWZmZXI7Cit9CisKIHZvaWQgQXVkaW9TaW5rVGVzdEVudmlyb25tZW50OjpPblVwZGF0ZVNvdXJjZVN0YXR1cyhpbnQqIGZyYW1lc19pbl9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvZmZzZXRfaW5fZnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX3BsYXlpbmcsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvYXVkaW9fc2lua19oZWxwZXJzLmggYi9zcmMvc3RhcmJvYXJkL25wbGIvYXVkaW9fc2lua19oZWxwZXJzLmgKaW5kZXggMjE1Y2U5NC4uNzI5MjFlMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2F1ZGlvX3NpbmtfaGVscGVycy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9hdWRpb19zaW5rX2hlbHBlcnMuaApAQCAtODEsNyArODEsNyBAQAogICB9CiAgIHZvaWQgU2V0SXNQbGF5aW5nKGJvb2wgaXNfcGxheWluZyk7CiAgIHZvaWQgQXBwZW5kRnJhbWUoaW50IGZyYW1lc190b19hcHBlbmQpOwotICBpbnQgR2V0RnJhbWVCdWZmZXJGcmVlU3BhY2VBbW91bnQoKSBjb25zdDsKKyAgaW50IEdldEZyYW1lQnVmZmVyRnJlZVNwYWNlSW5GcmFtZXMoKSBjb25zdDsKIAogICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBleHBlY3RlZCBjb25kaXRpb24gYXJlIG1ldC4KICAgLy8gUmV0dXJuIGZhbHNlIG9uIHRpbWVvdXQuCkBAIC05MCw2ICs5MCw4IEBACiAgIGJvb2wgV2FpdFVudGlsQWxsRnJhbWVzQXJlQ29uc3VtZWQoKTsKIAogIHByaXZhdGU6CisgIHZvaWQgQXBwZW5kRnJhbWVfTG9ja2VkKGludCBmcmFtZXNfdG9fYXBwZW5kKTsKKyAgaW50IEdldEZyYW1lQnVmZmVyRnJlZVNwYWNlSW5GcmFtZXNfTG9ja2VkKCkgY29uc3Q7CiAgIHZvaWQgT25VcGRhdGVTb3VyY2VTdGF0dXMoaW50KiBmcmFtZXNfaW5fYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb2Zmc2V0X2luX2ZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBpc19wbGF5aW5nLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2F1ZGlvX3NpbmtfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9hdWRpb19zaW5rX3Rlc3QuY2MKaW5kZXggY2FhNzg3MC4uZTZjMDU5YiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2F1ZGlvX3NpbmtfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvYXVkaW9fc2lua190ZXN0LmNjCkBAIC02Niw4ICs2Niw4IEBACiAgIGVudmlyb25tZW50LkFwcGVuZEZyYW1lKGZyYW1lc190b19hcHBlbmQpOwogCiAgIEVYUEVDVF9UUlVFKGVudmlyb25tZW50LldhaXRVbnRpbFNvbWVGcmFtZXNBcmVDb25zdW1lZCgpKTsKLSAgQVNTRVJUX0dUKGVudmlyb25tZW50LkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlQW1vdW50KCksIDApOwotICBlbnZpcm9ubWVudC5BcHBlbmRGcmFtZShlbnZpcm9ubWVudC5HZXRGcmFtZUJ1ZmZlckZyZWVTcGFjZUFtb3VudCgpKTsKKyAgQVNTRVJUX0dUKGVudmlyb25tZW50LkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlSW5GcmFtZXMoKSwgMCk7CisgIGVudmlyb25tZW50LkFwcGVuZEZyYW1lKGVudmlyb25tZW50LkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlSW5GcmFtZXMoKSk7CiAgIEVYUEVDVF9UUlVFKGVudmlyb25tZW50LldhaXRVbnRpbEFsbEZyYW1lc0FyZUNvbnN1bWVkKCkpOwogfQogCkBAIC04MiwxMCArODIsMTAgQEAKICAgaW50IGZyYW1lc190b19hcHBlbmQgPSBmcmFtZV9idWZmZXJzLmZyYW1lc19wZXJfY2hhbm5lbCgpOwogICBlbnZpcm9ubWVudC5BcHBlbmRGcmFtZShmcmFtZXNfdG9fYXBwZW5kKTsKIAotICBpbnQgZnJlZV9zcGFjZSA9IGVudmlyb25tZW50LkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlQW1vdW50KCk7CisgIGludCBmcmVlX3NwYWNlID0gZW52aXJvbm1lbnQuR2V0RnJhbWVCdWZmZXJGcmVlU3BhY2VJbkZyYW1lcygpOwogICBFWFBFQ1RfVFJVRShlbnZpcm9ubWVudC5XYWl0VW50aWxVcGRhdGVTdGF0dXNDYWxsZWQoKSk7CiAgIEVYUEVDVF9UUlVFKGVudmlyb25tZW50LldhaXRVbnRpbFVwZGF0ZVN0YXR1c0NhbGxlZCgpKTsKLSAgRVhQRUNUX0VRKGZyZWVfc3BhY2UsIGVudmlyb25tZW50LkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlQW1vdW50KCkpOworICBFWFBFQ1RfRVEoZnJlZV9zcGFjZSwgZW52aXJvbm1lbnQuR2V0RnJhbWVCdWZmZXJGcmVlU3BhY2VJbkZyYW1lcygpKTsKICAgZW52aXJvbm1lbnQuU2V0SXNQbGF5aW5nKHRydWUpOwogICBFWFBFQ1RfVFJVRShlbnZpcm9ubWVudC5XYWl0VW50aWxTb21lRnJhbWVzQXJlQ29uc3VtZWQoKSk7CiB9CkBAIC0xMDEsOCArMTAxLDggQEAKIAogICBFWFBFQ1RfVFJVRShlbnZpcm9ubWVudC5XYWl0VW50aWxTb21lRnJhbWVzQXJlQ29uc3VtZWQoKSk7CiAgIFNiVGhyZWFkU2xlZXAoMjUwICoga1NiVGltZU1pbGxpc2Vjb25kKTsKLSAgQVNTRVJUX0dUKGVudmlyb25tZW50LkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlQW1vdW50KCksIDApOwotICBlbnZpcm9ubWVudC5BcHBlbmRGcmFtZShlbnZpcm9ubWVudC5HZXRGcmFtZUJ1ZmZlckZyZWVTcGFjZUFtb3VudCgpKTsKKyAgQVNTRVJUX0dUKGVudmlyb25tZW50LkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlSW5GcmFtZXMoKSwgMCk7CisgIGVudmlyb25tZW50LkFwcGVuZEZyYW1lKGVudmlyb25tZW50LkdldEZyYW1lQnVmZmVyRnJlZVNwYWNlSW5GcmFtZXMoKSk7CiAgIEVYUEVDVF9UUlVFKGVudmlyb25tZW50LldhaXRVbnRpbEFsbEZyYW1lc0FyZUNvbnN1bWVkKCkpOwogfQogCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgaW50IGZyYW1lc190b19hcHBlbmQgPSBzYW1wbGVfcmF0ZSAvIDQ7CiAKICAgd2hpbGUgKGZyYW1lc190b19hcHBlbmQgPiAwKSB7Ci0gICAgaW50IGZyZWVfc3BhY2UgPSBlbnZpcm9ubWVudC5HZXRGcmFtZUJ1ZmZlckZyZWVTcGFjZUFtb3VudCgpOworICAgIGludCBmcmVlX3NwYWNlID0gZW52aXJvbm1lbnQuR2V0RnJhbWVCdWZmZXJGcmVlU3BhY2VJbkZyYW1lcygpOwogICAgIGVudmlyb25tZW50LkFwcGVuZEZyYW1lKHN0ZDo6bWluKGZyZWVfc3BhY2UsIGZyYW1lc190b19hcHBlbmQpKTsKICAgICBmcmFtZXNfdG9fYXBwZW5kIC09IHN0ZDo6bWluKGZyZWVfc3BhY2UsIGZyYW1lc190b19hcHBlbmQpOwogICAgIEFTU0VSVF9UUlVFKGVudmlyb25tZW50LldhaXRVbnRpbFNvbWVGcmFtZXNBcmVDb25zdW1lZCgpKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9jb25kaXRpb25fdmFyaWFibGVfd2FpdF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3Rlc3QuY2MKaW5kZXggM2U0MjEwOS4uNjU4NmQ2YyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3Rlc3QuY2MKQEAgLTUyLDcgKzUyLDcgQEAKICAgY29uc3QgaW50IGtNYW55ID0gU0JfTUFYX1RIUkVBRFMgPiA2NCA/IDY0IDogU0JfTUFYX1RIUkVBRFM7CiAgIFdhaXRlckNvbnRleHQgY29udGV4dDsKIAotICBTYlRocmVhZCB0aHJlYWRzW2tNYW55XTsKKyAgc3RkOjp2ZWN0b3I8U2JUaHJlYWQ+IHRocmVhZHMoa01hbnkpOwogICBmb3IgKGludCBpID0gMDsgaSA8IGtNYW55OyArK2kpIHsKICAgICB0aHJlYWRzW2ldID0gU2JUaHJlYWRDcmVhdGUoMCwga1NiVGhyZWFkTm9Qcmlvcml0eSwga1NiVGhyZWFkTm9BZmZpbml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgTlVMTCwgV2FpdGVyRW50cnlQb2ludCwgJmNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2RpcmVjdG9yeV9nZXRfbmV4dF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2RpcmVjdG9yeV9nZXRfbmV4dF90ZXN0LmNjCmluZGV4IDI0YzA1YmEuLjgwYTYxZWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9kaXJlY3RvcnlfZ2V0X25leHRfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvZGlyZWN0b3J5X2dldF9uZXh0X3Rlc3QuY2MKQEAgLTUwLDE3ICs1MCwyNiBAQAogICBTdHJpbmdTZXQgbmFtZXNfdG9fZmluZChuYW1lcyk7CiAgIGludCBjb3VudCA9IDA7CiAgIHdoaWxlICh0cnVlKSB7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGVudHJ5KFNCX0ZJTEVfTUFYX05BTUUsIDApOworICAgIGlmICghU2JEaXJlY3RvcnlHZXROZXh0KGRpcmVjdG9yeSwgZW50cnkuZGF0YSgpLCBlbnRyeS5zaXplKCkpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY29uc3QgY2hhciogZW50cnlfbmFtZSA9IGVudHJ5LmRhdGEoKTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogICAgIFNiRGlyZWN0b3J5RW50cnkgZW50cnkgPSB7MH07CiAgICAgaWYgKCFTYkRpcmVjdG9yeUdldE5leHQoZGlyZWN0b3J5LCAmZW50cnkpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgY29uc3QgY2hhciogZW50cnlfbmFtZSA9IGVudHJ5Lm5hbWU7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KIAogICAgIC8vIFNiRGlyZWN0b3J5RW50cnkganVzdCBjb250YWlucyB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIGFic29sdXRlIHBhdGggdG8KICAgICAvLyB0aGUgZmlsZSwgYnV0IFNjb3BlZFJhbmRvbUZpbGU6OmZpbGVuYW1lKCkgcmV0dXJucyB0aGUgZnVsbCBwYXRoLgogICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lOwogICAgIGZpbGVuYW1lICs9IGRpcmVjdG9yeV9uYW1lOwogICAgIGZpbGVuYW1lICs9IFNCX0ZJTEVfU0VQX0NIQVI7Ci0gICAgZmlsZW5hbWUgKz0gZW50cnkubmFtZTsKKyAgICBmaWxlbmFtZSArPSBlbnRyeV9uYW1lOwogCiAgICAgU3RyaW5nU2V0OjppdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzX3RvX2ZpbmQuZmluZChmaWxlbmFtZSk7CiAgICAgaWYgKGl0ZXJhdG9yICE9IG5hbWVzX3RvX2ZpbmQuZW5kKCkpIHsKQEAgLTY4LDcgKzc3LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgLy8gSWYgaXQgaXNuJ3QgaW4gfG5hbWVzX3RvX2ZpbmR8LCBtYWtlIHN1cmUgaXQncyBzb21lIGV4dGVybmFsIGVudHJ5IGFuZAogICAgICAgLy8gbm90IG9uZSBvZiBvdXJzLiBPdGhlcndpc2UsIGFuIGVudHJ5IG11c3QgaGF2ZSBzaG93biB1cCB0d2ljZS4KLSAgICAgIEVYUEVDVF9UUlVFKG5hbWVzLmZpbmQoZW50cnkubmFtZSkgPT0gbmFtZXMuZW5kKCkpOworICAgICAgRVhQRUNUX1RSVUUobmFtZXMuZmluZChlbnRyeV9uYW1lKSA9PSBuYW1lcy5lbmQoKSk7CiAgICAgfQogICB9CiAKQEAgLTc5LDggKzg4LDE0IEBACiB9CiAKIFRFU1QoU2JEaXJlY3RvcnlHZXROZXh0VGVzdCwgRmFpbHVyZUludmFsaWRTYkRpcmVjdG9yeSkgeworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gZW50cnkoU0JfRklMRV9NQVhfTkFNRSwgMCk7CisgIEVYUEVDVF9GQUxTRShTYkRpcmVjdG9yeUdldE5leHQoa1NiRGlyZWN0b3J5SW52YWxpZCwgZW50cnkuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNpemUoKSkpOworI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KICAgU2JEaXJlY3RvcnlFbnRyeSBlbnRyeSA9IHswfTsKICAgRVhQRUNUX0ZBTFNFKFNiRGlyZWN0b3J5R2V0TmV4dChrU2JEaXJlY3RvcnlJbnZhbGlkLCAmZW50cnkpKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogfQogCiBURVNUKFNiRGlyZWN0b3J5R2V0TmV4dFRlc3QsIEZhaWx1cmVOdWxsRW50cnkpIHsKQEAgLTk1LDEyICsxMTAsMjAgQEAKICAgU2JEaXJlY3RvcnkgZGlyZWN0b3J5ID0gU2JEaXJlY3RvcnlPcGVuKHBhdGguY19zdHIoKSwgJmVycm9yKTsKICAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlJc1ZhbGlkKGRpcmVjdG9yeSkpOwogICBFWFBFQ1RfRVEoa1NiRmlsZU9rLCBlcnJvcik7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorICBFWFBFQ1RfRkFMU0UoU2JEaXJlY3RvcnlHZXROZXh0KGRpcmVjdG9yeSwgTlVMTCwgU0JfRklMRV9NQVhfTkFNRSkpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAgIEVYUEVDVF9GQUxTRShTYkRpcmVjdG9yeUdldE5leHQoZGlyZWN0b3J5LCBOVUxMKSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KICAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlDbG9zZShkaXJlY3RvcnkpKTsKIH0KIAogVEVTVChTYkRpcmVjdG9yeUdldE5leHRUZXN0LCBGYWlsdXJlSW52YWxpZEFuZE51bGwpIHsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisgIEVYUEVDVF9GQUxTRShTYkRpcmVjdG9yeUdldE5leHQoa1NiRGlyZWN0b3J5SW52YWxpZCwgTlVMTCwgU0JfRklMRV9NQVhfTkFNRSkpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAgIEVYUEVDVF9GQUxTRShTYkRpcmVjdG9yeUdldE5leHQoa1NiRGlyZWN0b3J5SW52YWxpZCwgTlVMTCkpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiB9CiAKIFRFU1QoU2JEaXJlY3RvcnlHZXROZXh0VGVzdCwgRmFpbHVyZU9uRW1wdHlEaXJlY3RvcnkpIHsKQEAgLTExMiwxMSArMTM1LDQyIEBACiAgIEFTU0VSVF9UUlVFKFNiRGlyZWN0b3J5SXNWYWxpZChkaXJlY3RvcnkpKTsKICAgQVNTRVJUX0VRKGtTYkZpbGVPaywgZXJyb3IpOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorICBzdGQ6OnZlY3RvcjxjaGFyPiBlbnRyeShTQl9GSUxFX01BWF9OQU1FLCAwKTsKKyAgRVhQRUNUX0ZBTFNFKFNiRGlyZWN0b3J5R2V0TmV4dChkaXJlY3RvcnksIGVudHJ5LmRhdGEoKSwgZW50cnkuc2l6ZSgpKSk7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KICAgU2JEaXJlY3RvcnlFbnRyeSBlbnRyeSA9IHswfTsKICAgRVhQRUNUX0ZBTFNFKFNiRGlyZWN0b3J5R2V0TmV4dChkaXJlY3RvcnksICZlbnRyeSkpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAgIEFTU0VSVF9UUlVFKFNiRGlyZWN0b3J5Q2xvc2UoZGlyZWN0b3J5KSk7CiB9CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCitURVNUKFNiRGlyZWN0b3J5R2V0TmV4dFRlc3QsIEZhaWx1cmVPbkluc3VmZmljaWVudFNpemUpIHsKKyAgU2NvcGVkUmFuZG9tRmlsZSBmaWxlOworICBzdGQ6OnN0cmluZyBkaXJlY3RvcnlfbmFtZSA9IGZpbGUuZmlsZW5hbWUoKTsKKyAgZGlyZWN0b3J5X25hbWUucmVzaXplKGRpcmVjdG9yeV9uYW1lLmZpbmRfbGFzdF9vZihTQl9GSUxFX1NFUF9DSEFSKSk7CisgIEVYUEVDVF9UUlVFKFNiRmlsZUV4aXN0cyhkaXJlY3RvcnlfbmFtZS5jX3N0cigpKSkKKyAgICAgIDw8ICJEaXJlY3RvcnlfbmFtZSBpcyAiIDw8IGRpcmVjdG9yeV9uYW1lOworCisgIFNiRmlsZUVycm9yIGVycm9yID0ga1NiRmlsZUVycm9yTWF4OworICBTYkRpcmVjdG9yeSBkaXJlY3RvcnkgPSBTYkRpcmVjdG9yeU9wZW4oZGlyZWN0b3J5X25hbWUuY19zdHIoKSwgJmVycm9yKTsKKyAgRVhQRUNUX1RSVUUoU2JEaXJlY3RvcnlJc1ZhbGlkKGRpcmVjdG9yeSkpOworICBFWFBFQ1RfRVEoa1NiRmlsZU9rLCBlcnJvcik7CisKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gZW50cnkoU0JfRklMRV9NQVhfTkFNRSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgU0JfRklMRV9NQVhfTkFNRTsgaSsrKQorICAgIGVudHJ5W2ldID0gaTsKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gZW50cnlfY29weSA9IGVudHJ5OworICBFWFBFQ1RfRVEoU2JEaXJlY3RvcnlHZXROZXh0KGRpcmVjdG9yeSwgZW50cnkuZGF0YSgpLCAwKSwgZmFsc2UpOworICBFWFBFQ1RfRVEoZW50cnkuc2l6ZSgpLCBTQl9GSUxFX01BWF9OQU1FKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBTQl9GSUxFX01BWF9OQU1FOyBpKyspCisgICAgRVhQRUNUX0VRKGVudHJ5W2ldLCBlbnRyeV9jb3B5W2ldKTsKKworICBFWFBFQ1RfVFJVRShTYkRpcmVjdG9yeUNsb3NlKGRpcmVjdG9yeSkpOworfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisKIH0gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9kaXJlY3Rvcnlfb3Blbl90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2RpcmVjdG9yeV9vcGVuX3Rlc3QuY2MKaW5kZXggNWI0MzM2Ny4uZjlkMzE1NSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2RpcmVjdG9yeV9vcGVuX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2RpcmVjdG9yeV9vcGVuX3Rlc3QuY2MKQEAgLTU1LDE2ICs1NSwxNiBAQAogICBFWFBFQ1RfRklMRV9FWElTVFMocGF0aCk7CiAKICAgY29uc3QgaW50IGtNYW55ID0gU0JfRklMRV9NQVhfT1BFTjsKLSAgU2JEaXJlY3RvcnkgZGlyZWN0b3JpZXNba01hbnldID0gezB9OworICBzdGQ6OnZlY3RvcjxTYkRpcmVjdG9yeT4gZGlyZWN0b3JpZXMoa01hbnksIDApOwogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgU0JfQVJSQVlfU0laRV9JTlQoZGlyZWN0b3JpZXMpOyArK2kpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rvcmllcy5zaXplKCk7ICsraSkgewogICAgIFNiRmlsZUVycm9yIGVycm9yID0ga1NiRmlsZUVycm9yTWF4OwogICAgIGRpcmVjdG9yaWVzW2ldID0gU2JEaXJlY3RvcnlPcGVuKHBhdGguY19zdHIoKSwgJmVycm9yKTsKICAgICBFWFBFQ1RfVFJVRShTYkRpcmVjdG9yeUlzVmFsaWQoZGlyZWN0b3JpZXNbaV0pKTsKICAgICBFWFBFQ1RfRVEoa1NiRmlsZU9rLCBlcnJvcik7CiAgIH0KIAotICBmb3IgKGludCBpID0gMDsgaSA8IFNCX0FSUkFZX1NJWkVfSU5UKGRpcmVjdG9yaWVzKTsgKytpKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0b3JpZXMuc2l6ZSgpOyArK2kpIHsKICAgICBFWFBFQ1RfVFJVRShTYkRpcmVjdG9yeUNsb3NlKGRpcmVjdG9yaWVzW2ldKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9mbGF0X21hcF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2ZsYXRfbWFwX3Rlc3QuY2MKaW5kZXggZGRlODYyNS4uNDU2NDI5MCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2ZsYXRfbWFwX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2ZsYXRfbWFwX3Rlc3QuY2MKQEAgLTkwLDExICs5MCwxNCBAQAogfQogCiBTYlRpbWVNb25vdG9uaWMgR2V0VGhyZWFkVGltZU1vbm90b25pY05vdygpIHsKLSNpZiBTQl9IQVMoVElNRV9USFJFQURfTk9XKQotICByZXR1cm4gU2JUaW1lR2V0TW9ub3RvbmljVGhyZWFkTm93KCk7Ci0jZWxzZQotICByZXR1cm4gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfVElNRV9USFJFQURfTk9XX1JFUVVJUkVEX1ZFUlNJT04gfHwgXAorICAgIFNCX0hBUyhUSU1FX1RIUkVBRF9OT1cpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfVElNRV9USFJFQURfTk9XX1JFUVVJUkVEX1ZFUlNJT04KKyAgaWYgKFNiVGltZUlzVGltZVRocmVhZE5vd1N1cHBvcnRlZCgpKQogI2VuZGlmCisgICAgcmV0dXJuIFNiVGltZUdldE1vbm90b25pY1RocmVhZE5vdygpOworI2VuZGlmCisgIHJldHVybiBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKIH0KIAogLy8gR2VuZXJpYyBzdHJpbmdpZmljYXRpb24gb2YgdGhlIGlucHV0IG1hcCB0eXBlLiBUaGlzIGFsbG93cyBnb29kIGVycm9yCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvbXV0ZXhfYWNxdWlyZV90cnlfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9tdXRleF9hY3F1aXJlX3RyeV90ZXN0LmNjCmluZGV4IGQ0MjRmMWMuLjgwNmY1ZjggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9tdXRleF9hY3F1aXJlX3RyeV90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9tdXRleF9hY3F1aXJlX3RyeV90ZXN0LmNjCkBAIC0xNiwxMCArMTYsMzAgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTVVURVhfQUNRVUlSRV9UUllfQVBJX0NIQU5HRV9WRVJTSU9OCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvdGhyZWFkX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX01VVEVYX0FDUVVJUkVfVFJZX0FQSV9DSEFOR0VfVkVSU0lPTgorCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIG5hbWVzcGFjZSB7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KK3N0cnVjdCBUZXN0Q29udGV4dCB7CisgIGV4cGxpY2l0IFRlc3RDb250ZXh0KFNiTXV0ZXgqIG11dGV4KSA6IHdhc19sb2NrZWRfKGZhbHNlKSwgbXV0ZXhfKG11dGV4KSB7fQorICBib29sIHdhc19sb2NrZWRfOworICBTYk11dGV4KiBtdXRleF87Cit9OworCit2b2lkKiBFbnRyeVBvaW50KHZvaWQqIHBhcmFtZXRlcikgeworICBUZXN0Q29udGV4dCogY29udGV4dCA9IHN0YXRpY19jYXN0PFRlc3RDb250ZXh0Kj4ocGFyYW1ldGVyKTsKKyAgY29udGV4dC0+d2FzX2xvY2tlZF8gPQorICAgICAgKFNiTXV0ZXhBY3F1aXJlVHJ5KGNvbnRleHQtPm11dGV4XykgPT0ga1NiTXV0ZXhBY3F1aXJlZCk7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KKwogVEVTVChTYk11dGV4QWNxdWlyZVRyeVRlc3QsIFN1bm55RGF5VW5jb250ZW5kZWQpIHsKICAgU2JNdXRleCBtdXRleDsKICAgRVhQRUNUX1RSVUUoU2JNdXRleENyZWF0ZSgmbXV0ZXgpKTsKQEAgLTQ2LDkgKzY2LDIwIEBACiAgIEVYUEVDVF9FUShyZXN1bHQsIGtTYk11dGV4QWNxdWlyZWQpOwogICBFWFBFQ1RfVFJVRShTYk11dGV4SXNTdWNjZXNzKHJlc3VsdCkpOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTVVURVhfQUNRVUlSRV9UUllfQVBJX0NIQU5HRV9WRVJTSU9OCisgIFRlc3RDb250ZXh0IGNvbnRleHQoJm11dGV4KTsKKyAgU2JUaHJlYWQgdGhyZWFkID0KKyAgICAgIFNiVGhyZWFkQ3JlYXRlKDAsIGtTYlRocmVhZE5vUHJpb3JpdHksIGtTYlRocmVhZE5vQWZmaW5pdHksIHRydWUsCisgICAgICAgICAgICAgICAgICAgICBucGxiOjprVGhyZWFkTmFtZSwgJkVudHJ5UG9pbnQsICZjb250ZXh0KTsKKworICBFWFBFQ1RfVFJVRShTYlRocmVhZElzVmFsaWQodGhyZWFkKSk7CisgIEVYUEVDVF9UUlVFKFNiVGhyZWFkSm9pbih0aHJlYWQsIE5VTEwpKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbnRleHQud2FzX2xvY2tlZF8pOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KICAgcmVzdWx0ID0gU2JNdXRleEFjcXVpcmVUcnkoJm11dGV4KTsKICAgRVhQRUNUX0VRKHJlc3VsdCwga1NiTXV0ZXhCdXN5KTsKICAgRVhQRUNUX0ZBTFNFKFNiTXV0ZXhJc1N1Y2Nlc3MocmVzdWx0KSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX01VVEVYX0FDUVVJUkVfVFJZX0FQSV9DSEFOR0VfVkVSU0lPTgogCiAgIEVYUEVDVF9UUlVFKFNiTXV0ZXhSZWxlYXNlKCZtdXRleCkpOwogICBFWFBFQ1RfVFJVRShTYk11dGV4RGVzdHJveSgmbXV0ZXgpKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9tdXRleF9kZXN0cm95X3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvbXV0ZXhfZGVzdHJveV90ZXN0LmNjCmluZGV4IDkyMzk1YjYuLjAyZTA3MmQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9tdXRleF9kZXN0cm95X3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL211dGV4X2Rlc3Ryb3lfdGVzdC5jYwpAQCAtMjcsNiArMjcsMTAgQEAKICAgRVhQRUNUX1RSVUUoU2JNdXRleERlc3Ryb3koJm11dGV4KSk7CiB9CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KKy8vIERlc3Ryb3lpbmcgYSBtdXRleCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIGlzIHVuZGVmaW5lZCBiZWhhdmlvcgorLy8gYW5kIGNhbm5vdCBiZSB0ZXN0ZWQuCisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX01VVEVYX0FDUVVJUkVfVFJZX0FQSV9DSEFOR0VfVkVSU0lPTgogVEVTVChTYk11dGV4RGVzdHJveVRlc3QsIFJhaW55RGF5RGVzdHJveUhlbGQpIHsKICAgU2JNdXRleCBtdXRleDsKICAgRVhQRUNUX1RSVUUoU2JNdXRleENyZWF0ZSgmbXV0ZXgpKTsKQEAgLTM5LDYgKzQzLDcgQEAKICAgRVhQRUNUX1RSVUUoU2JNdXRleFJlbGVhc2UoJm11dGV4KSk7CiAgIEVYUEVDVF9UUlVFKFNiTXV0ZXhEZXN0cm95KCZtdXRleCkpOwogfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KIAogVEVTVChTYk11dGV4RGVzdHJveVRlc3QsIFJhaW55RGF5TnVsbCkgewogICBFWFBFQ1RfRkFMU0UoU2JNdXRleERlc3Ryb3koTlVMTCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL25wbGIuZ3lwIGIvc3JjL3N0YXJib2FyZC9ucGxiL25wbGIuZ3lwCmluZGV4IGNkMjgwYjYuLjY3MzllYmUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9ucGxiLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvbnBsYi5neXAKQEAgLTE2NSw2ICsxNjUsNyBAQAogICAgICAgICAnbWVtb3J5X21hcF90ZXN0LmNjJywKICAgICAgICAgJ21lbW9yeV9tb3ZlX3Rlc3QuY2MnLAogICAgICAgICAnbWVtb3J5X3JlYWxsb2NhdGVfdGVzdC5jYycsCisgICAgICAgICdtZW1vcnlfcmVwb3J0ZXJfdGVzdC5jYycsCiAgICAgICAgICdtZW1vcnlfc2V0X3Rlc3QuY2MnLAogICAgICAgICAnbWljcm9waG9uZV9jbG9zZV90ZXN0LmNjJywKICAgICAgICAgJ21pY3JvcGhvbmVfY3JlYXRlX3Rlc3QuY2MnLApAQCAtMzE0LDggKzMxNSw2IEBACiAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgWydzYl9ldmVyZ3JlZW4gIT0gMScsIHsKICAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICMgU2VnZmF1bHRzIGZvciBDb2JhbHQgRXZlcmdyZWVuLgotICAgICAgICAgICAgJ21lbW9yeV9yZXBvcnRlcl90ZXN0LmNjJywKICAgICAgICAgICAgICMgU2VnZmF1bHRzIG9yIGNhdXNlcyB1bnJlc29sdmVkIHN5bWJvbHMgZm9yIENvYmFsdCBFdmVyZ3JlZW4uCiAgICAgICAgICAgICAnbWVkaWFfc2V0X2F1ZGlvX3dyaXRlX2R1cmF0aW9uX3Rlc3QuY2MnLAogICAgICAgICAgIF0sCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvb25jZV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL29uY2VfdGVzdC5jYwppbmRleCAwODg1ODYwLi5iMjc0M2I4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvb25jZV90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9vbmNlX3Rlc3QuY2MKQEAgLTk4LDcgKzk4LDcgQEAKIC8vIHJvdXRpbmUgZ290IGNhbGxlZCBleGFjdGx5IG9uZSB0aW1lLgogVEVTVChTYk9uY2VUZXN0LCBTdW5ueURheU11bHRpcGxlVGhyZWFkc0luaXQpIHsKICAgY29uc3QgaW50IGtNYW55ID0gU0JfTUFYX1RIUkVBRFM7Ci0gIFNiVGhyZWFkIHRocmVhZHNba01hbnldOworICBzdGQ6OnZlY3RvcjxTYlRocmVhZD4gdGhyZWFkcyhrTWFueSk7CiAKICAgY29uc3QgaW50IGtJdGVyYXRpb25Db3VudCA9IDEwOwogICBmb3IgKGludCBpID0gMDsgaSA8IGtJdGVyYXRpb25Db3VudDsgKytpKSB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvc2FiaS9zYWJpLmd5cGkgYi9zcmMvc3RhcmJvYXJkL25wbGIvc2FiaS9zYWJpLmd5cGkKaW5kZXggM2Q3NjIzMS4uMTljNjllZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3NhYmkvc2FiaS5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zYWJpL3NhYmkuZ3lwaQpAQCAtMTcsNiArMTcsNyBAQAogICAgICdzYWJpX3NvdXJjZXMnOiBbCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL25wbGIvc2FiaS9hbGlnbm1lbnRfdGVzdC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL25wbGIvc2FiaS9lbmRpYW5uZXNzX3Rlc3QuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9ucGxiL3NhYmkvc2lnbmVkbmVzc19hbmRfc2l6ZV9vZl9lbnVtX3Rlc3QuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9ucGxiL3NhYmkvc2lnbmVkbmVzc19vZl9jaGFyX3Rlc3QuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9ucGxiL3NhYmkvc2l6ZV90ZXN0LmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbnBsYi9zYWJpL3N0cnVjdF9hbGlnbm1lbnRfdGVzdC5jYycsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvc2FiaS9zaWduZWRuZXNzX2FuZF9zaXplX29mX2VudW1fdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zYWJpL3NpZ25lZG5lc3NfYW5kX3NpemVfb2ZfZW51bV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjZjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc2FiaS9zaWduZWRuZXNzX2FuZF9zaXplX29mX2VudW1fdGVzdC5jYwpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfU0FCSV9GSUxFX1ZFUlNJT04KKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2Ugc2FiaSB7CituYW1lc3BhY2UgeworCit0eXBlZGVmIGVudW0gR2VuZXJpY0VudW1UeXBlIHsKKyAga09ubHlUYWcsCit9IEdlbmVyaWNFbnVtVHlwZTsKKworU0JfQ09NUElMRV9BU1NFUlQoKHN0YXRpY19jYXN0PEdlbmVyaWNFbnVtVHlwZT4oLTEpIDwgMCkgPT0gU0JfSEFTX1NJR05FRF9FTlVNLAorICAgICAgICAgICAgICAgICAgU0JfSEFTX1NJR05FRF9FTlVNX2lzX2luY29uc2lzdGVudF93aXRoX3NpZ25fb2ZfZW51bSk7CisKK1NCX0NPTVBJTEVfQVNTRVJUKHNpemVvZihHZW5lcmljRW51bVR5cGUpID09IFNCX1NJWkVfT0ZfRU5VTSwKKyAgICAgICAgICAgICAgICAgIFNCX1NJWkVfT0ZfRU5VTV9pc19pbmNvbnNpc3RlbnRfd2l0aF9zaXplb2ZfZW51bSk7CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHNhYmkKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9TQUJJX0ZJTEVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3NvY2tldF93YWl0ZXJfYWRkX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl9hZGRfdGVzdC5jYwppbmRleCBiNTYzOTVjLi5hOTQyYzExIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl9hZGRfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl9hZGRfdGVzdC5jYwpAQCAtNjcsNyArNjcsNyBAQAogICBFWFBFQ1RfVFJVRShTYlNvY2tldFdhaXRlcklzVmFsaWQod2FpdGVyKSk7CiAKICAgY29uc3QgaW50IGtNYW55ID0gU0JfRklMRV9NQVhfT1BFTjsKLSAgU2JTb2NrZXQgc29ja2V0c1trTWFueV0gPSB7MH07CisgIHN0ZDo6dmVjdG9yPFNiU29ja2V0PiBzb2NrZXRzKGtNYW55LCAwKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWFueTsgKytpKSB7CiAgICAgc29ja2V0c1tpXSA9IFNiU29ja2V0Q3JlYXRlKEdldEFkZHJlc3NUeXBlKCksIGtTYlNvY2tldFByb3RvY29sVGNwKTsKICAgICBBU1NFUlRfVFJVRShTYlNvY2tldElzVmFsaWQoc29ja2V0c1tpXSkpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX2NhbmNlbF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX2NhbmNlbF90ZXN0LmNjCmluZGV4IDA3NDNkYzkuLjYzMGU0NWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9jYW5jZWxfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3JlY29nbml6ZXJfY2FuY2VsX3Rlc3QuY2MKQEAgLTIwLDkgKzIwLDEyIEBACiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIAotI2lmIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1NQRUVDSF9SRUNPR05JWkVSX1JFUVVJUkVEX1ZFUlNJT04gfHwgXAorICAgIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQogCiBURVNUX0YoU3BlZWNoUmVjb2duaXplclRlc3QsIENhbmNlbFRlc3RTdW5ueURheSkgeworICBpZiAoU2tpcExvY2FsZSgpKQorICAgIHJldHVybjsKICAgU2JTcGVlY2hSZWNvZ25pemVyIHJlY29nbml6ZXIgPSBTYlNwZWVjaFJlY29nbml6ZXJDcmVhdGUoaGFuZGxlcigpKTsKICAgRVhQRUNUX1RSVUUoU2JTcGVlY2hSZWNvZ25pemVySXNWYWxpZChyZWNvZ25pemVyKSk7CiAgIFNiU3BlZWNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0ge3RydWUsIHRydWUsIDF9OwpAQCAtMzgsNiArNDEsOCBAQAogfQogCiBURVNUX0YoU3BlZWNoUmVjb2duaXplclRlc3QsIENhbmNlbElzQ2FsbGVkTXVsdGlwbGVUaW1lcykgeworICBpZiAoU2tpcExvY2FsZSgpKQorICAgIHJldHVybjsKICAgU2JTcGVlY2hSZWNvZ25pemVyIHJlY29nbml6ZXIgPSBTYlNwZWVjaFJlY29nbml6ZXJDcmVhdGUoaGFuZGxlcigpKTsKICAgRVhQRUNUX1RSVUUoU2JTcGVlY2hSZWNvZ25pemVySXNWYWxpZChyZWNvZ25pemVyKSk7CiAgIFNiU3BlZWNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0ge3RydWUsIGZhbHNlLCAxfTsKQEAgLTU1LDYgKzYwLDggQEAKIH0KIAogVEVTVF9GKFNwZWVjaFJlY29nbml6ZXJUZXN0LCBDYW5jZWxUZXN0U3RhcnRJc05vdENhbGxlZCkgeworICBpZiAoU2tpcExvY2FsZSgpKQorICAgIHJldHVybjsKICAgU2JTcGVlY2hSZWNvZ25pemVyIHJlY29nbml6ZXIgPSBTYlNwZWVjaFJlY29nbml6ZXJDcmVhdGUoaGFuZGxlcigpKTsKICAgRVhQRUNUX1RSVUUoU2JTcGVlY2hSZWNvZ25pemVySXNWYWxpZChyZWNvZ25pemVyKSk7CiAgIFNiU3BlZWNoUmVjb2duaXplckNhbmNlbChyZWNvZ25pemVyKTsKQEAgLTYyLDEwICs2OSwxMyBAQAogfQogCiBURVNUX0YoU3BlZWNoUmVjb2duaXplclRlc3QsIENhbmNlbFdpdGhJbnZhbGlkU3BlZWNoUmVjb2duaXplcikgeworICBpZiAoU2tpcExvY2FsZSgpKQorICAgIHJldHVybjsKICAgU2JTcGVlY2hSZWNvZ25pemVyQ2FuY2VsKGtTYlNwZWVjaFJlY29nbml6ZXJJbnZhbGlkKTsKIH0KIAotI2VuZGlmICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfU1BFRUNIX1JFQ09HTklaRVJfUkVRVUlSRURfVkVSU0lPTiB8fAorICAgICAgICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKIAogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9jcmVhdGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9jcmVhdGVfdGVzdC5jYwppbmRleCBhZGZiYzIwLi41MmRhMGM3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3JlY29nbml6ZXJfY3JlYXRlX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX2NyZWF0ZV90ZXN0LmNjCkBAIC0xOSwxNSArMTksMTkgQEAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIG5wbGIgewogCi0jaWYgU0JfSEFTKFNQRUVDSF9SRUNPR05JWkVSKSAmJiBTQl9BUElfVkVSU0lPTiA+PSA1CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfU1BFRUNIX1JFQ09HTklaRVJfUkVRVUlSRURfVkVSU0lPTiB8fCBcCisgICAgU0JfSEFTKFNQRUVDSF9SRUNPR05JWkVSKSAmJiBTQl9BUElfVkVSU0lPTiA+PSA1CiAKIFRFU1RfRihTcGVlY2hSZWNvZ25pemVyVGVzdCwgQ3JlYXRlVGVzdFN1bm55RGF5KSB7CisgIGlmIChTa2lwTG9jYWxlKCkpCisgICAgcmV0dXJuOwogICBTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplciA9IFNiU3BlZWNoUmVjb2duaXplckNyZWF0ZShoYW5kbGVyKCkpOwogICBFWFBFQ1RfVFJVRShTYlNwZWVjaFJlY29nbml6ZXJJc1ZhbGlkKHJlY29nbml6ZXIpKTsKICAgU2JTcGVlY2hSZWNvZ25pemVyRGVzdHJveShyZWNvZ25pemVyKTsKIH0KIAotI2VuZGlmICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfU1BFRUNIX1JFQ09HTklaRVJfUkVRVUlSRURfVkVSU0lPTiB8fAorICAgICAgICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKIAogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9kZXN0cm95X3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3JlY29nbml6ZXJfZGVzdHJveV90ZXN0LmNjCmluZGV4IDg1N2ZjOTYuLmYyZjVmZTEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9kZXN0cm95X3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX2Rlc3Ryb3lfdGVzdC5jYwpAQCAtMTksMTMgKzE5LDE4IEBACiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIAotI2lmIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1NQRUVDSF9SRUNPR05JWkVSX1JFUVVJUkVEX1ZFUlNJT04gfHwgXAorICAgIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQogCiBURVNUX0YoU3BlZWNoUmVjb2duaXplclRlc3QsIERlc3Ryb3lJbnZhbGlkU3BlZWNoUmVjb2duaXplcikgeworICBpZiAoU2tpcExvY2FsZSgpKQorICAgIHJldHVybjsKICAgU2JTcGVlY2hSZWNvZ25pemVyRGVzdHJveShrU2JTcGVlY2hSZWNvZ25pemVySW52YWxpZCk7CiB9CiAKIFRFU1RfRihTcGVlY2hSZWNvZ25pemVyVGVzdCwgRGVzdHJveVJlY29nbml6ZXJXaXRob3V0U3RvcHBpbmcpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkKKyAgICByZXR1cm47CiAgIFNiU3BlZWNoUmVjb2duaXplciByZWNvZ25pemVyID0gU2JTcGVlY2hSZWNvZ25pemVyQ3JlYXRlKGhhbmRsZXIoKSk7CiAgIEVYUEVDVF9UUlVFKFNiU3BlZWNoUmVjb2duaXplcklzVmFsaWQocmVjb2duaXplcikpOwogICBTYlNwZWVjaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHt0cnVlLCB0cnVlLCAxfTsKQEAgLTMzLDcgKzM4LDggQEAKICAgU2JTcGVlY2hSZWNvZ25pemVyRGVzdHJveShyZWNvZ25pemVyKTsKIH0KIAotI2VuZGlmICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfU1BFRUNIX1JFQ09HTklaRVJfUkVRVUlSRURfVkVSU0lPTiB8fAorICAgICAgICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKIAogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9oZWxwZXIuaCBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9oZWxwZXIuaAppbmRleCBjYmE2MzFjLi41YWIyM2IwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3JlY29nbml6ZXJfaGVscGVyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX2hlbHBlci5oCkBAIC0yNSw3ICsyNSw4IEBACiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIAotI2lmIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1NQRUVDSF9SRUNPR05JWkVSX1JFUVVJUkVEX1ZFUlNJT04gfHwgXAorICAgIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQogCiBjbGFzcyBTcGVlY2hSZWNvZ25pemVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewogIHB1YmxpYzoKQEAgLTQ4LDYgKzQ5LDI2IEBACiAgIH0KIAogIHByb3RlY3RlZDoKKyAgYm9vbCBpc1Rlc3RGaXh0dXJlU3VwcG9ydGVkOworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gV2UgaW5jbHVkZSBhbGwgQVBJIHRlc3RzIGF0IGNvbXBpbGUgdGltZSBhZnRlciBTdGFyYm9hcmQgdmVyc2lvbiAxMiwgc28KKyAgICAvLyB3ZSBtdXN0IGRvIGEgcnVudGltZSBjaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhhdCBBUEkgKGFuZAorICAgIC8vIHRodXMgdGhlIHRlc3QgZml4dHVyZSkgaXMgc3VwcG9ydGVkLgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1NQRUVDSF9SRUNPR05JWkVSX1JFUVVJUkVEX1ZFUlNJT04KKyAgICBpc1Rlc3RGaXh0dXJlU3VwcG9ydGVkID0gU2JTcGVlY2hSZWNvZ25pemVySXNTdXBwb3J0ZWQoKTsKKyNlbHNlCisgICAgaXNUZXN0Rml4dHVyZVN1cHBvcnRlZCA9IHRydWU7CisjZW5kaWYKKyAgfQorCisgIC8vIFRPRE86IFVzZSBHVEVTVF9TS0lQIGluIHxTZXRVcHwgd2hlbiB3ZSBoYXZlIGEgbmV3ZXIgdmVyc2lvbiBvZiBndGVzdC4KKyAgYm9vbCBTa2lwTG9jYWxlKCkgeworICAgIGlmICghaXNUZXN0Rml4dHVyZVN1cHBvcnRlZCkgeworICAgICAgU0JfTE9HKElORk8pIDw8ICJTcGVlY2ggcmVjb2duaXplciBub3Qgc3VwcG9ydGVkLiBUZXN0IHNraXBwZWQuIjsKKyAgICB9CisgICAgcmV0dXJuICFpc1Rlc3RGaXh0dXJlU3VwcG9ydGVkOworICB9CisKICAgLy8gUGVyIHRlc3QgdGVhcmRvd24uCiAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKICAgICAvLyBXYWl0IGZvciB0aGUgc3BlZWNoIHJlY29nbml6ZXIgc2VydmVyIHRvIHRlYXIgZG93biBpbiBvcmRlciB0byBzdGFydApAQCAtNjIsNyArODMsOCBAQAogICBTYlNwZWVjaFJlY29nbml6ZXJIYW5kbGVyIGhhbmRsZXJfOwogfTsKIAotI2VuZGlmICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfU1BFRUNIX1JFQ09HTklaRVJfUkVRVUlSRURfVkVSU0lPTiB8fAorICAgICAgICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKIAogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9zdGFydF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX3N0YXJ0X3Rlc3QuY2MKaW5kZXggMTU5MjJmNi4uODVhY2ViYyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX3N0YXJ0X3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX3N0YXJ0X3Rlc3QuY2MKQEAgLTE5LDkgKzE5LDEyIEBACiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIAotI2lmIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1NQRUVDSF9SRUNPR05JWkVSX1JFUVVJUkVEX1ZFUlNJT04gfHwgXAorICAgIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQogCiBURVNUX0YoU3BlZWNoUmVjb2duaXplclRlc3QsIFN0YXJ0VGVzdFN1bm55RGF5KSB7CisgIGlmIChTa2lwTG9jYWxlKCkpCisgICAgcmV0dXJuOwogICBTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplciA9IFNiU3BlZWNoUmVjb2duaXplckNyZWF0ZShoYW5kbGVyKCkpOwogICBFWFBFQ1RfVFJVRShTYlNwZWVjaFJlY29nbml6ZXJJc1ZhbGlkKHJlY29nbml6ZXIpKTsKICAgU2JTcGVlY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSB7ZmFsc2UsIGZhbHNlLCAxfTsKQEAgLTM2LDYgKzM5LDggQEAKIH0KIAogVEVTVF9GKFNwZWVjaFJlY29nbml6ZXJUZXN0LCBTdGFydFJlY29nbml6ZXJXaXRoQ29udGludW91c1JlY29nbml0aW9uKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpCisgICAgcmV0dXJuOwogICBTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplciA9IFNiU3BlZWNoUmVjb2duaXplckNyZWF0ZShoYW5kbGVyKCkpOwogICBFWFBFQ1RfVFJVRShTYlNwZWVjaFJlY29nbml6ZXJJc1ZhbGlkKHJlY29nbml6ZXIpKTsKICAgU2JTcGVlY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSB7dHJ1ZSwgZmFsc2UsIDF9OwpAQCAtNTAsNiArNTUsOCBAQAogfQogCiBURVNUX0YoU3BlZWNoUmVjb2duaXplclRlc3QsIFN0YXJ0UmVjb2duaXplcldpdGhJbnRlcmltUmVzdWx0cykgeworICBpZiAoU2tpcExvY2FsZSgpKQorICAgIHJldHVybjsKICAgU2JTcGVlY2hSZWNvZ25pemVyIHJlY29nbml6ZXIgPSBTYlNwZWVjaFJlY29nbml6ZXJDcmVhdGUoaGFuZGxlcigpKTsKICAgRVhQRUNUX1RSVUUoU2JTcGVlY2hSZWNvZ25pemVySXNWYWxpZChyZWNvZ25pemVyKSk7CiAgIFNiU3BlZWNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0ge2ZhbHNlLCB0cnVlLCAxfTsKQEAgLTY0LDYgKzcxLDggQEAKIH0KIAogVEVTVF9GKFNwZWVjaFJlY29nbml6ZXJUZXN0LCBTdGFydFJlY29nbml6ZXJXaXRoMTBNYXhBbHRlcm5hdGl2ZXMpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkKKyAgICByZXR1cm47CiAgIFNiU3BlZWNoUmVjb2duaXplciByZWNvZ25pemVyID0gU2JTcGVlY2hSZWNvZ25pemVyQ3JlYXRlKGhhbmRsZXIoKSk7CiAgIEVYUEVDVF9UUlVFKFNiU3BlZWNoUmVjb2duaXplcklzVmFsaWQocmVjb2duaXplcikpOwogICBTYlNwZWVjaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHt0cnVlLCB0cnVlLCAxMH07CkBAIC03OCw2ICs4Nyw4IEBACiB9CiAKIFRFU1RfRihTcGVlY2hSZWNvZ25pemVyVGVzdCwgU3RhcnRJc0NhbGxlZE11bHRpcGxlVGltZXMpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkKKyAgICByZXR1cm47CiAgIFNiU3BlZWNoUmVjb2duaXplciByZWNvZ25pemVyID0gU2JTcGVlY2hSZWNvZ25pemVyQ3JlYXRlKGhhbmRsZXIoKSk7CiAgIEVYUEVDVF9UUlVFKFNiU3BlZWNoUmVjb2duaXplcklzVmFsaWQocmVjb2duaXplcikpOwogICBTYlNwZWVjaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHt0cnVlLCB0cnVlLCAxfTsKQEAgLTk1LDEzICsxMDYsMTYgQEAKIH0KIAogVEVTVF9GKFNwZWVjaFJlY29nbml6ZXJUZXN0LCBTdGFydFdpdGhJbnZhbGlkU3BlZWNoUmVjb2duaXplcikgeworICBpZiAoU2tpcExvY2FsZSgpKQorICAgIHJldHVybjsKICAgU2JTcGVlY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSB7dHJ1ZSwgdHJ1ZSwgMX07CiAgIGJvb2wgc3VjY2VzcyA9CiAgICAgICBTYlNwZWVjaFJlY29nbml6ZXJTdGFydChrU2JTcGVlY2hSZWNvZ25pemVySW52YWxpZCwgJmNvbmZpZ3VyYXRpb24pOwogICBFWFBFQ1RfRkFMU0Uoc3VjY2Vzcyk7CiB9CiAKLSNlbmRpZiAgLy8gU0JfSEFTKFNQRUVDSF9SRUNPR05JWkVSKSAmJiBTQl9BUElfVkVSU0lPTiA+PSA1CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1NQRUVDSF9SRUNPR05JWkVSX1JFUVVJUkVEX1ZFUlNJT04gfHwKKyAgICAgICAgLy8gU0JfSEFTKFNQRUVDSF9SRUNPR05JWkVSKSAmJiBTQl9BUElfVkVSU0lPTiA+PSA1CiAKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3JlY29nbml6ZXJfc3RvcF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX3N0b3BfdGVzdC5jYwppbmRleCBiYmFkMTI1Li5kODgwOGJlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3JlY29nbml6ZXJfc3RvcF90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9zdG9wX3Rlc3QuY2MKQEAgLTE5LDkgKzE5LDEyIEBACiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIAotI2lmIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1NQRUVDSF9SRUNPR05JWkVSX1JFUVVJUkVEX1ZFUlNJT04gfHwgXAorICAgIFNCX0hBUyhTUEVFQ0hfUkVDT0dOSVpFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gNQogCiBURVNUX0YoU3BlZWNoUmVjb2duaXplclRlc3QsIFN0b3BJc0NhbGxlZE11bHRpcGxlVGltZXMpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkKKyAgICByZXR1cm47CiAgIFNiU3BlZWNoUmVjb2duaXplciByZWNvZ25pemVyID0gU2JTcGVlY2hSZWNvZ25pemVyQ3JlYXRlKGhhbmRsZXIoKSk7CiAgIEVYUEVDVF9UUlVFKFNiU3BlZWNoUmVjb2duaXplcklzVmFsaWQocmVjb2duaXplcikpOwogICBTYlNwZWVjaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHt0cnVlLCB0cnVlLCAxfTsKQEAgLTM3LDcgKzQwLDggQEAKICAgU2JTcGVlY2hSZWNvZ25pemVyRGVzdHJveShyZWNvZ25pemVyKTsKIH0KIAotI2VuZGlmICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfU1BFRUNIX1JFQ09HTklaRVJfUkVRVUlSRURfVkVSU0lPTiB8fAorICAgICAgICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKIAogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfc3ludGhlc2lzX2Jhc2ljX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3N5bnRoZXNpc19iYXNpY190ZXN0LmNjCmluZGV4IGU2YjA5ZTMuLjY1YTJmMWQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfc3ludGhlc2lzX2Jhc2ljX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9zeW50aGVzaXNfYmFzaWNfdGVzdC5jYwpAQCAtMTksMTQgKzE5LDIyIEBACiBuYW1lc3BhY2UgbnBsYiB7CiBuYW1lc3BhY2UgewogCi0jaWYgU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfU1BFRUNIX1NZTlRIRVNJU19SRVFVSVJFRF9WRVJTSU9OIHx8IFwKKyAgICBTQl9IQVMoU1BFRUNIX1NZTlRIRVNJUykKIAogVEVTVChTYlNwZWVjaFN5bnRoZXNpc0Jhc2ljVGVzdCwgQmFzaWMpIHsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9TUEVFQ0hfU1lOVEhFU0lTX1JFUVVJUkVEX1ZFUlNJT04KKyAgaWYgKCFTYlNwZWVjaFN5bnRoZXNpc0lzU3VwcG9ydGVkKCkpIHsKKyAgICBTQl9MT0coSU5GTykgPDwgIlNwZWVjaCBzeW50aGVzaXMgbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkLiI7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKICAgU2JTcGVlY2hTeW50aGVzaXNTcGVhaygiSGVsbG8iKTsKICAgU2JTcGVlY2hTeW50aGVzaXNDYW5jZWwoKTsKIH0KIAotI2VuZGlmICAvLyBTQl9IQVMoU1BFRUNIX1NZTlRIRVNJUykKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfU1BFRUNIX1NZTlRIRVNJU19SRVFVSVJFRF9WRVJTSU9OIHx8CisgICAgICAgIC8vIFNCX0hBUyhTUEVFQ0hfU1lOVEhFU0lTKQogCiB9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvdGhyZWFkX2NyZWF0ZV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3RocmVhZF9jcmVhdGVfdGVzdC5jYwppbmRleCA3MTZlMDAxLi43NGQ0YmVmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvdGhyZWFkX2NyZWF0ZV90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi90aHJlYWRfY3JlYXRlX3Rlc3QuY2MKQEAgLTE0Miw3ICsxNDIsNyBAQAogCiBURVNUKFNiVGhyZWFkQ3JlYXRlVGVzdCwgU3VtbWVydGltZSkgewogICBjb25zdCBpbnQga01hbnkgPSBTQl9NQVhfVEhSRUFEUzsKLSAgU2JUaHJlYWQgdGhyZWFkc1trTWFueV07CisgIHN0ZDo6dmVjdG9yPFNiVGhyZWFkPiB0aHJlYWRzKGtNYW55KTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWFueTsgKytpKSB7CiAgICAgdGhyZWFkc1tpXSA9IFNiVGhyZWFkQ3JlYXRlKDAsIGtTYlRocmVhZE5vUHJpb3JpdHksIGtTYlRocmVhZE5vQWZmaW5pdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIG5wbGI6OmtUaHJlYWROYW1lLCBucGxiOjpBZGRPbmVFbnRyeVBvaW50LApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3RocmVhZF9sb2NhbF92YWx1ZV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3RocmVhZF9sb2NhbF92YWx1ZV90ZXN0LmNjCmluZGV4IGRjZWRlNmMuLjRjOTRmMGYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi90aHJlYWRfbG9jYWxfdmFsdWVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvdGhyZWFkX2xvY2FsX3ZhbHVlX3Rlc3QuY2MKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBURVNUKFNiVGhyZWFkTG9jYWxWYWx1ZVRlc3QsIFN1bm55RGF5TWFueSkgewogICBjb25zdCBpbnQga01hbnkgPSAoMiAqIFNCX01BWF9USFJFQURfTE9DQUxfS0VZUykgLyAzOwotICBTYlRocmVhZExvY2FsS2V5IGtleXNba01hbnldOworICBzdGQ6OnZlY3RvcjxTYlRocmVhZExvY2FsS2V5PiBrZXlzKGtNYW55KTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGtNYW55OyArK2kpIHsKICAgICBrZXlzW2ldID0gU2JUaHJlYWRDcmVhdGVMb2NhbEtleShOVUxMKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmNjIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9jb25zdGFudHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzYzg4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmNjCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzIGZvciBhIHBsYXRmb3JtLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmgiCisKKy8vIERldGVybWluZXMgdGhlIGFsaWdubWVudCB0aGF0IGFsbG9jYXRpb25zIHNob3VsZCBoYXZlIG9uIHRoaXMgcGxhdGZvcm0uCitjb25zdCBzaXplX3Qga1NiTWFsbG9jQWxpZ25tZW50ID0gMTY7CisKKy8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KK2NvbnN0IGludDMyX3Qga1NiTWF4VGhyZWFkTmFtZUxlbmd0aCA9IDE2OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggYmJlYjA4NS4uMTNjZDM2OCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0yODgsOSArMjg4LDYgQEAKIC8vIHNwZWNpZnkgdGhhdC4KICNkZWZpbmUgU0JfTkVUV09SS19JT19CVUZGRVJfQUxJR05NRU5UIDE2CiAKLS8vIERldGVybWluZXMgdGhlIGFsaWdubWVudCB0aGF0IGFsbG9jYXRpb25zIHNob3VsZCBoYXZlIG9uIHRoaXMgcGxhdGZvcm0uCi0jZGVmaW5lIFNCX01BTExPQ19BTElHTk1FTlQgKChzaXplX3QpMTZVKQotCiAvLyBEZXRlcm1pbmVzIHRoZSB0aHJlc2hob2xkIG9mIGFsbG9jYXRpb24gc2l6ZSB0aGF0IHNob3VsZCBiZSBkb25lIHdpdGggbW1hcAogLy8gKGlmIGF2YWlsYWJsZSksIHJhdGhlciB0aGFuIGFsbG9jYXRlZCB3aXRoaW4gdGhlIGNvcmUgaGVhcC4KICNkZWZpbmUgU0JfREVGQVVMVF9NTUFQX1RIUkVTSE9MRCAoKHNpemVfdCkoMjU2ICogMTAyNFUpKQpAQCAtMzI5LDkgKzMyNiw2IEBACiAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkIGxvY2FsIHN0b3JhZ2Uga2V5cyBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KICNkZWZpbmUgU0JfTUFYX1RIUkVBRF9MT0NBTF9LRVlTIDUxMgogCi0vLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCAxNgotCiAvLyAtLS0gVGltaW5nIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbiBBUEkgdG8gcmV0cmlldmUgaG93IGxvbmcgdGhlIGN1cnJlbnQgdGhyZWFkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCmluZGV4IDE3NDk4ZWMuLmQ0M2E5YWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCkBAIC00Myw2ICs0Myw3IEBACiAgICAgICAgICc8QChmaWx0ZXJfYmFzZWRfcGxheWVyX3NvdXJjZXMpJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvYXRvbWljX3B1YmxpYy5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3lzdGVtX2dldF9jb25uZWN0aW9uX3R5cGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zeXN0ZW1fZ2V0X2RldmljZV90eXBlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3lzdGVtX2dldF9wYXRoLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2lzby9kaXJlY3RvcnlfZ2V0X25leHQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9pc28vZGlyZWN0b3J5X2dldF9uZXh0LmNjCmluZGV4IGU0NzhhMzkuLjEwMWVmMDggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2lzby9kaXJlY3RvcnlfZ2V0X25leHQuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvaXNvL2RpcmVjdG9yeV9nZXRfbmV4dC5jYwpAQCAtMTYsNyArMTYsMTYgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaXNvL2ltcGwvZGlyZWN0b3J5X2dldF9uZXh0LmgiCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCitib29sIFNiRGlyZWN0b3J5R2V0TmV4dChTYkRpcmVjdG9yeSBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBvdXRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0X2VudHJ5X3NpemUpIHsKKyAgcmV0dXJuIDo6c3RhcmJvYXJkOjpzaGFyZWQ6Omlzbzo6aW1wbDo6U2JEaXJlY3RvcnlHZXROZXh0KAorICAgICAgZGlyZWN0b3J5LCBvdXRfZW50cnksIG91dF9lbnRyeV9zaXplKTsKK30KKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogYm9vbCBTYkRpcmVjdG9yeUdldE5leHQoU2JEaXJlY3RvcnkgZGlyZWN0b3J5LCBTYkRpcmVjdG9yeUVudHJ5KiBvdXRfZW50cnkpIHsKICAgcmV0dXJuIDo6c3RhcmJvYXJkOjpzaGFyZWQ6Omlzbzo6aW1wbDo6U2JEaXJlY3RvcnlHZXROZXh0KGRpcmVjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9lbnRyeSk7CiB9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2lzby9pbXBsL2RpcmVjdG9yeV9nZXRfbmV4dC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvaXNvL2ltcGwvZGlyZWN0b3J5X2dldF9uZXh0LmgKaW5kZXggMWJiNGExZC4uNzRkM2MzOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvaXNvL2ltcGwvZGlyZWN0b3J5X2dldF9uZXh0LmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvaXNvL2ltcGwvZGlyZWN0b3J5X2dldF9uZXh0LmgKQEAgLTMxLDcgKzMxLDE2IEBACiBuYW1lc3BhY2UgaXNvIHsKIG5hbWVzcGFjZSBpbXBsIHsKIAotYm9vbCBTYkRpcmVjdG9yeUdldE5leHQoU2JEaXJlY3RvcnkgZGlyZWN0b3J5LCBTYkRpcmVjdG9yeUVudHJ5KiBvdXRfZW50cnkpIHsKK2Jvb2wgU2JEaXJlY3RvcnlHZXROZXh0KFNiRGlyZWN0b3J5IGRpcmVjdG9yeSwKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBvdXRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0X2VudHJ5X3NpemUpIHsKKyAgaWYgKG91dF9lbnRyeV9zaXplIDwgU0JfRklMRV9NQVhfTkFNRSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisgICAgICAgICAgICAgICAgICAgICAgICBTYkRpcmVjdG9yeUVudHJ5KiBvdXRfZW50cnkpIHsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogICBpZiAoIWRpcmVjdG9yeSB8fCAhZGlyZWN0b3J5LT5kaXJlY3RvcnkgfHwgIW91dF9lbnRyeSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtNTQsOCArNjMsMTMgQEAKICAgICB9CiAgIH0gd2hpbGUgKHRydWUpOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorICBTYlN0cmluZ0NvcHkob3V0X2VudHJ5LCBkaXJlbnQtPmRfbmFtZSwgb3V0X2VudHJ5X3NpemUpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAgIFNiU3RyaW5nQ29weShvdXRfZW50cnktPm5hbWUsIGRpcmVudC0+ZF9uYW1lLAogICAgICAgICAgICAgICAgU0JfQVJSQVlfU0laRV9JTlQob3V0X2VudHJ5LT5uYW1lKSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKwogICByZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGludXgvZGV2X2lucHV0L2Rldl9pbnB1dC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L2Rldl9pbnB1dC9kZXZfaW5wdXQuY2MKaW5kZXggNGU3NmJiNC4uMmFjY2E1OCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGludXgvZGV2X2lucHV0L2Rldl9pbnB1dC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9kZXZfaW5wdXQvZGV2X2lucHV0LmNjCkBAIC03NjksNyArNzY5LDE5IEBACiAgIH0KIAogICB3aGlsZSAodHJ1ZSkgeworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKyAgICBzdGQ6OnZlY3RvcjxjaGFyPiBlbnRyeShTQl9GSUxFX01BWF9OQU1FKTsKKworICAgIGlmICghU2JEaXJlY3RvcnlHZXROZXh0KGRpcmVjdG9yeSwgZW50cnkuZGF0YSgpLCBTQl9GSUxFX01BWF9OQU1FKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGtEZXZpY2VQYXRoOworICAgIHBhdGggKz0gIi8iOworICAgIHBhdGggKz0gZW50cnkuZGF0YSgpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAgICAgU2JEaXJlY3RvcnlFbnRyeSBlbnRyeTsKKwogICAgIGlmICghU2JEaXJlY3RvcnlHZXROZXh0KGRpcmVjdG9yeSwgJmVudHJ5KSkgewogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNzc3LDYgKzc4OSw3IEBACiAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGtEZXZpY2VQYXRoOwogICAgIHBhdGggKz0gIi8iOwogICAgIHBhdGggKz0gZW50cnkubmFtZTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogCiAgICAgaWYgKFNiRGlyZWN0b3J5Q2FuT3BlbihwYXRoLmNfc3RyKCkpKSB7CiAgICAgICAvLyBUaGlzIGlzIGEgc3ViZGlyZWN0b3J5LiBTa2lwLgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGludXgvdGhyZWFkX3NldF9uYW1lLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGludXgvdGhyZWFkX3NldF9uYW1lLmNjCmluZGV4IGY2MDY2ZWMuLmJlOTdmMTUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3RocmVhZF9zZXRfbmFtZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saW51eC90aHJlYWRfc2V0X25hbWUuY2MKQEAgLTIyLDEzICsyMiwxNSBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zdHJpbmcuaCIKIAorI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5oIgorCiB2b2lkIFNiVGhyZWFkU2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CiAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcmVuYW1lIHRoZSBtYWluIHRocmVhZC4KICAgaWYgKFNiVGhyZWFkR2V0SWQoKSA9PSBnZXRwaWQoKSkgewogICAgIHJldHVybjsKICAgfQogCi0gIGNoYXIgYnVmZmVyW1NCX01BWF9USFJFQURfTkFNRV9MRU5HVEhdID0ge307CisgIGNoYXIgYnVmZmVyW2tTYk1heFRocmVhZE5hbWVMZW5ndGhdOwogCiAgIGlmIChTYlN0cmluZ0dldExlbmd0aChuYW1lKSA+PSBTQl9BUlJBWV9TSVpFX0lOVChidWZmZXIpKSB7CiAgICAgU2JTdHJpbmdDb3B5KGJ1ZmZlciwgbmFtZSwgU0JfQVJSQVlfU0laRV9JTlQoYnVmZmVyKSk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9vcHVzL29wdXNfYXVkaW9fZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmNjCmluZGV4IDA0ZGQwYTYuLjVjYTNkOTQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmNjCkBAIC0yNyw3ICsyNyw2IEBACiBuYW1lc3BhY2Ugb3B1cyB7CiAKIG5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga01heE9wdXNGcmFtZXNQZXJBVSA9IDk2MDA7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgaW50IG5iX3N0cmVhbXM7CkBAIC01MiwxNSArNTEsNiBAQAogT3B1c0F1ZGlvRGVjb2Rlcjo6T3B1c0F1ZGlvRGVjb2RlcigKICAgICBjb25zdCBTYk1lZGlhQXVkaW9TYW1wbGVJbmZvJiBhdWRpb19zYW1wbGVfaW5mbykKICAgICA6IGF1ZGlvX3NhbXBsZV9pbmZvXyhhdWRpb19zYW1wbGVfaW5mbykgewotI2lmIFNCX0hBU19RVUlSSyhTVVBQT1JUX0lOVDE2X0FVRElPX1NBTVBMRVMpCi0gIHdvcmtpbmdfYnVmZmVyXy5yZXNpemUoa01heE9wdXNGcmFtZXNQZXJBVSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX2luZm9fLm51bWJlcl9vZl9jaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wdXNfaW50MTYpKTsKLSNlbHNlICAgLy8gU0JfSEFTX1FVSVJLKFNVUFBPUlRfSU5UMTZfQVVESU9fU0FNUExFUykKLSAgd29ya2luZ19idWZmZXJfLnJlc2l6ZShrTWF4T3B1c0ZyYW1lc1BlckFVICoKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfaW5mb18ubnVtYmVyX29mX2NoYW5uZWxzICogc2l6ZW9mKGZsb2F0KSk7Ci0jZW5kaWYgIC8vIFNCX0hBU19RVUlSSyhTVVBQT1JUX0lOVDE2X0FVRElPX1NBTVBMRVMpCi0KICAgaW50IGVycm9yOwogICBpbnQgY2hhbm5lbHMgPSBhdWRpb19zYW1wbGVfaW5mb18ubnVtYmVyX29mX2NoYW5uZWxzOwogICBpZiAoY2hhbm5lbHMgPiA4IHx8IGNoYW5uZWxzIDwgMSkgewpAQCAtMTA2LDI4ICs5Niw0NCBAQAogICBTQl9EQ0hFQ0soaW5wdXRfYnVmZmVyKTsKICAgU0JfRENIRUNLKG91dHB1dF9jYl8pOwogCi0gIFNjaGVkdWxlKGNvbnN1bWVkX2NiKTsKLQogICBpZiAoc3RyZWFtX2VuZGVkXykgewogICAgIFNCX0xPRyhFUlJPUikgPDwgIkRlY29kZSgpIGlzIGNhbGxlZCBhZnRlciBXcml0ZUVuZE9mU3RyZWFtKCkgaXMgY2FsbGVkLiI7CiAgICAgcmV0dXJuOwogICB9CiAKKyAgc2NvcGVkX3JlZnB0cjxEZWNvZGVkQXVkaW8+IGRlY29kZWRfYXVkaW8gPSBuZXcgRGVjb2RlZEF1ZGlvKAorICAgICAgYXVkaW9fc2FtcGxlX2luZm9fLm51bWJlcl9vZl9jaGFubmVscywgR2V0U2FtcGxlVHlwZSgpLAorICAgICAga1NiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGVJbnRlcmxlYXZlZCwgaW5wdXRfYnVmZmVyLT50aW1lc3RhbXAoKSwKKyAgICAgIGF1ZGlvX3NhbXBsZV9pbmZvXy5udW1iZXJfb2ZfY2hhbm5lbHMgKiBmcmFtZXNfcGVyX2F1XyAqCisgICAgICAgICAgc3RhcmJvYXJkOjptZWRpYTo6R2V0Qnl0ZXNQZXJTYW1wbGUoR2V0U2FtcGxlVHlwZSgpKSk7CisKICNpZiBTQl9IQVNfUVVJUksoU1VQUE9SVF9JTlQxNl9BVURJT19TQU1QTEVTKQogICBjb25zdCBjaGFyIGtEZWNvZGVGdW5jdGlvbk5hbWVbXSA9ICJvcHVzX211bHRpc3RyZWFtX2RlY29kZSI7CiAgIGludCBkZWNvZGVkX2ZyYW1lcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKAogICAgICAgZGVjb2Rlcl8sIHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihpbnB1dF9idWZmZXItPmRhdGEoKSksCiAgICAgICBpbnB1dF9idWZmZXItPnNpemUoKSwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8b3B1c19pbnQxNio+KHdvcmtpbmdfYnVmZmVyXy5kYXRhKCkpLAotICAgICAga01heE9wdXNGcmFtZXNQZXJBVSwgMCk7CisgICAgICByZWludGVycHJldF9jYXN0PG9wdXNfaW50MTYqPihkZWNvZGVkX2F1ZGlvLT5idWZmZXIoKSksIGZyYW1lc19wZXJfYXVfLAorICAgICAgMCk7CiAjZWxzZSAgIC8vIFNCX0hBU19RVUlSSyhTVVBQT1JUX0lOVDE2X0FVRElPX1NBTVBMRVMpCiAgIGNvbnN0IGNoYXIga0RlY29kZUZ1bmN0aW9uTmFtZVtdID0gIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlX2Zsb2F0IjsKICAgaW50IGRlY29kZWRfZnJhbWVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVfZmxvYXQoCiAgICAgICBkZWNvZGVyXywgc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0X2J1ZmZlci0+ZGF0YSgpKSwKLSAgICAgIGlucHV0X2J1ZmZlci0+c2l6ZSgpLCByZWludGVycHJldF9jYXN0PGZsb2F0Kj4od29ya2luZ19idWZmZXJfLmRhdGEoKSksCi0gICAgICBrTWF4T3B1c0ZyYW1lc1BlckFVLCAwKTsKKyAgICAgIGlucHV0X2J1ZmZlci0+c2l6ZSgpLCByZWludGVycHJldF9jYXN0PGZsb2F0Kj4oZGVjb2RlZF9hdWRpby0+YnVmZmVyKCkpLAorICAgICAgZnJhbWVzX3Blcl9hdV8sIDApOwogI2VuZGlmICAvLyBTQl9IQVNfUVVJUksoU1VQUE9SVF9JTlQxNl9BVURJT19TQU1QTEVTKQorICBpZiAoZGVjb2RlZF9mcmFtZXMgPT0gT1BVU19CVUZGRVJfVE9PX1NNQUxMICYmCisgICAgICBmcmFtZXNfcGVyX2F1XyA8IGtNYXhPcHVzRnJhbWVzUGVyQVUpIHsKKyAgICBmcmFtZXNfcGVyX2F1XyA9IGtNYXhPcHVzRnJhbWVzUGVyQVU7CisgICAgLy8gU2VuZCB0byBkZWNvZGUgYWdhaW4gd2l0aCB0aGUgbmV3IHxmcmFtZXNfcGVyX2F1X3wuCisgICAgRGVjb2RlKGlucHV0X2J1ZmZlciwgY29uc3VtZWRfY2IpOworICAgIHJldHVybjsKKyAgfQogICBpZiAoZGVjb2RlZF9mcmFtZXMgPD0gMCkgeworICAgIC8vIFdoZW4gdGhlIGZvbGxvd2luZyBjaGVjayBmYWlscywgaXQgaW5kaWNhdGVzIHRoYXQgfGZyYW1lc19wZXJfYXVffCBpcworICAgIC8vIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB8a01heE9wdXNGcmFtZXNQZXJBVXwsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAvLyBmb3IgT3B1cy4KKyAgICBTQl9EQ0hFQ0soZGVjb2RlZF9mcmFtZXMgIT0gT1BVU19CVUZGRVJfVE9PX1NNQUxMKTsKKwogICAgIC8vIFRPRE86IENvbnNpZGVyIGZpbGwgaXQgd2l0aCBzaWxlbmNlLgogICAgIFNCX0xPRyhFUlJPUikgPDwga0RlY29kZUZ1bmN0aW9uTmFtZQogICAgICAgICAgICAgICAgICAgPDwgIigpIGZhaWxlZCB3aXRoIGVycm9yIGNvZGU6ICIgPDwgZGVjb2RlZF9mcmFtZXM7CkBAIC0xNDEsMTQgKzE0NywxMyBAQAogICAgIHJldHVybjsKICAgfQogCi0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlZEF1ZGlvPiBkZWNvZGVkX2F1ZGlvID0gbmV3IERlY29kZWRBdWRpbygKLSAgICAgIGF1ZGlvX3NhbXBsZV9pbmZvXy5udW1iZXJfb2ZfY2hhbm5lbHMsIEdldFNhbXBsZVR5cGUoKSwKLSAgICAgIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQsIGlucHV0X2J1ZmZlci0+dGltZXN0YW1wKCksCi0gICAgICBhdWRpb19zYW1wbGVfaW5mb18ubnVtYmVyX29mX2NoYW5uZWxzICogZGVjb2RlZF9mcmFtZXMgKgotICAgICAgICAgIHN0YXJib2FyZDo6bWVkaWE6OkdldEJ5dGVzUGVyU2FtcGxlKEdldFNhbXBsZVR5cGUoKSkpOwotICBTYk1lbW9yeUNvcHkoZGVjb2RlZF9hdWRpby0+YnVmZmVyKCksIHdvcmtpbmdfYnVmZmVyXy5kYXRhKCksCi0gICAgICAgICAgICAgICBkZWNvZGVkX2F1ZGlvLT5zaXplKCkpOworICBmcmFtZXNfcGVyX2F1XyA9IGRlY29kZWRfZnJhbWVzOworICBkZWNvZGVkX2F1ZGlvLT5TaHJpbmtUbyhhdWRpb19zYW1wbGVfaW5mb18ubnVtYmVyX29mX2NoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzX3Blcl9hdV8gKgorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFyYm9hcmQ6Om1lZGlhOjpHZXRCeXRlc1BlclNhbXBsZShHZXRTYW1wbGVUeXBlKCkpKTsKKwogICBkZWNvZGVkX2F1ZGlvc18ucHVzaChkZWNvZGVkX2F1ZGlvKTsKKyAgU2NoZWR1bGUoY29uc3VtZWRfY2IpOwogICBTY2hlZHVsZShvdXRwdXRfY2JfKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvb3B1cy9vcHVzX2F1ZGlvX2RlY29kZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmgKaW5kZXggNjg5YzMzZC4uMmMwZjJkOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvb3B1cy9vcHVzX2F1ZGlvX2RlY29kZXIuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9vcHVzL29wdXNfYXVkaW9fZGVjb2Rlci5oCkBAIC00OCw2ICs0OCw4IEBACiAgIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKIAogIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBpbnQga01heE9wdXNGcmFtZXNQZXJBVSA9IDk2MDA7CisKICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBHZXRTYW1wbGVUeXBlKCkgY29uc3Q7CiAKICAgT3V0cHV0Q0Igb3V0cHV0X2NiXzsKQEAgLTU3LDcgKzU5LDcgQEAKICAgYm9vbCBzdHJlYW1fZW5kZWRfID0gZmFsc2U7CiAgIHN0ZDo6cXVldWU8c2NvcGVkX3JlZnB0cjxEZWNvZGVkQXVkaW8+ID4gZGVjb2RlZF9hdWRpb3NfOwogICBTYk1lZGlhQXVkaW9TYW1wbGVJbmZvIGF1ZGlvX3NhbXBsZV9pbmZvXzsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gd29ya2luZ19idWZmZXJfOworICBpbnQgZnJhbWVzX3Blcl9hdV8gPSBrTWF4T3B1c0ZyYW1lc1BlckFVOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIG9wdXMKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3B0aHJlYWQvbXV0ZXhfZGVzdHJveS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3B0aHJlYWQvbXV0ZXhfZGVzdHJveS5jYwppbmRleCA3OTljODNkLi5hYTg1ZDljIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wdGhyZWFkL211dGV4X2Rlc3Ryb3kuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvcHRocmVhZC9tdXRleF9kZXN0cm95LmNjCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvcHRocmVhZC9pc19zdWNjZXNzLmgiCiAKIGJvb2wgU2JNdXRleERlc3Ryb3koU2JNdXRleCogbXV0ZXgpIHsKQEAgLTI0LDYgKzI1LDExIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVVRFWF9BQ1FVSVJFX1RSWV9BUElfQ0hBTkdFX1ZFUlNJT04KKyAgLy8gQm90aCB0cnlpbmcgdG8gcmVjdXJzaXZlbHkgYWNxdWlyZSBhIG11dGV4IHRoYXQgaXMgbG9ja2VkIGJ5IHRoZSBjYWxsaW5nCisgIC8vIHRocmVhZCwgYXMgd2VsbCBhcyBkZWxldGluZyBhIGxvY2tlZCBtdXRleCwgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgcmV0dXJuIElzU3VjY2VzcyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kobXV0ZXgpKTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTVVURVhfQUNRVUlSRV9UUllfQVBJX0NIQU5HRV9WRVJTSU9OCiAgIC8vIERlc3Ryb3lpbmcgYSBsb2NrZWQgbXV0ZXggaXMgdW5kZWZpbmVkLCBzbyBmYWlsIGlmIHRoZSBtdXRleCBpcwogICAvLyBhbHJlYWR5IGxvY2tlZCwKICAgaWYgKCFJc1N1Y2Nlc3MocHRocmVhZF9tdXRleF90cnlsb2NrKG11dGV4KSkpIHsKQEAgLTMzLDQgKzM5LDUgQEAKIAogICByZXR1cm4gSXNTdWNjZXNzKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KSkgJiYKICAgICAgICAgIElzU3VjY2VzcyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kobXV0ZXgpKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTVVURVhfQUNRVUlSRV9UUllfQVBJX0NIQU5HRV9WRVJTSU9OCiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9hdWRpb19zaW5rX3R5cGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9hdWRpb19zaW5rX3R5cGUuY2MKaW5kZXggM2JmYTg4My4uZmY4N2RlMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvcHVsc2UvcHVsc2VfYXVkaW9fc2lua190eXBlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2F1ZGlvX3NpbmtfdHlwZS5jYwpAQCAtMzAsNiArMzAsMTkgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKIAorI2lmIGRlZmluZWQoQUREUkVTU19TQU5JVElaRVIpCisvLyBCeSBkZWZhdWx0LCBMZWFrIFNhbml0aXplciBhbmQgQWRkcmVzcyBTYW5pdGl6ZXIgaXMgZXhwZWN0ZWQgdG8gZXhpc3QKKy8vIHRvZ2V0aGVyLiBIb3dldmVyLCB0aGlzIGlzIG5vdCB0cnVlIGZvciBhbGwgcGxhdGZvcm1zLgorLy8gSEFTX0xFQUtfU0FOVElaSUVSPTAgZXhwbGljaXRseSByZW1vdmVzIHRoZSBMZWFrIFNhbml0aXplciBmcm9tIGNvZGUuCisjaWZuZGVmIEhBU19MRUFLX1NBTklUSVpFUgorI2RlZmluZSBIQVNfTEVBS19TQU5JVElaRVIgMQorI2VuZGlmICAvLyBIQVNfTEVBS19TQU5JVElaRVIKKyNlbmRpZiAgLy8gZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikKKworI2lmIEhBU19MRUFLX1NBTklUSVpFUgorI2luY2x1ZGUgPHNhbml0aXplci9sc2FuX2ludGVyZmFjZS5oPgorI2VuZGlmICAvLyBIQVNfTEVBS19TQU5JVElaRVIKKwogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBwdWxzZSB7CkBAIC00MjQsNyArNDM3LDEzIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIC8vIENyZWF0ZSBwdWxzZSBjb250ZXh0LgorI2lmIEhBU19MRUFLX1NBTklUSVpFUgorICBfX2xzYW5fZGlzYWJsZSgpOworI2VuZGlmCiAgIGNvbnRleHRfID0gcGFfY29udGV4dF9uZXcocGFfbWFpbmxvb3BfZ2V0X2FwaShtYWlubG9vcF8pLCAiY29iYWx0X2F1ZGlvIik7CisjaWYgSEFTX0xFQUtfU0FOSVRJWkVSCisgIF9fbHNhbl9lbmFibGUoKTsKKyNlbmRpZgogICBpZiAoIWNvbnRleHRfKSB7CiAgICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJQdWxzZSBhdWRpbyBlcnJvcjogY2Fubm90IGNyZWF0ZSBjb250ZXh0LiI7CiAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzX2NvbXBhdGliaWxpdHlfZGVmaW5lcy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzX2NvbXBhdGliaWxpdHlfZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODVlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY29uZmlndXJhdGlvbl9jb25zdGFudHNfY29tcGF0aWJpbGl0eV9kZWZpbmVzLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBtYWNyb3MgdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKy8vIGFmdGVyIHRoZSBjaGFuZ2UgdGhhdCBtaWdyYXRlZCBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gbWFjcm9zIHRvIGV4dGVybgorLy8gdmFyaWFibGVzLgorCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX0NPTkZJR1VSQVRJT05fQ09OU1RBTlRTX0NPTVBBVElCSUxJVFlfREVGSU5FU19IXworI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9DT05GSUdVUkFUSU9OX0NPTlNUQU5UU19DT01QQVRJQklMSVRZX0RFRklORVNfSF8KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKworI2Vycm9yIFwKKyAgICAiVGhpcyBmaWxlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIFN0YXJib2FyZCB2ZXJzaW9ucyBiZWZvcmUgMTIuIFBsZWFzZSBkbyAiIFwKKyJub3QgaW5jbHVkZSB0aGlzIGZpbGUgb3RoZXJ3aXNlLiIKKworI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKworI2RlZmluZSBrU2JNYWxsb2NBbGlnbm1lbnQgU0JfTUFMTE9DX0FMSUdOTUVOVAorCisjZGVmaW5lIGtTYk1heFRocmVhZE5hbWVMZW5ndGggU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSAorCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KKworI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9DT05GSUdVUkFUSU9OX0NPTlNUQU5UU19DT01QQVRJQklMSVRZX0RFRklORVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuY2MKaW5kZXggZGU2ZjE2MC4uNWY4N2JjMyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuY2MKQEAgLTE1Myw4ICsxNTMsMTAgQEAKICAgSm9iVG9rZW4gam9iX3Rva2VuKGN1cnJlbnRfam9iX3Rva2VuXyk7CiAgIEpvYlJlY29yZCBqb2JfcmVjb3JkID0ge2pvYl90b2tlbiwgam9iLCBvd25lcn07CiAjaWYgRU5BQkxFX0pPQl9RVUVVRV9QUk9GSUxJTkcKLSAgam9iX3JlY29yZC5zdGFja19zaXplID0KLSAgICAgIFNiU3lzdGVtR2V0U3RhY2soam9iX3JlY29yZC5zdGFjaywga1Byb2ZpbGVTdGFja0RlcHRoKTsKKyAgaWYgKGtQcm9maWxlU3RhY2tEZXB0aCA+IDApIHsKKyAgICBqb2JfcmVjb3JkLnN0YWNrX3NpemUgPQorICAgICAgICBTYlN5c3RlbUdldFN0YWNrKGpvYl9yZWNvcmQuc3RhY2ssIGtQcm9maWxlU3RhY2tEZXB0aCk7CisgIH0KICNlbmRpZiAgLy8gRU5BQkxFX0pPQl9RVUVVRV9QUk9GSUxJTkcKIAogICBTYlRpbWVNb25vdG9uaWMgdGltZV90b19ydW5fam9iID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCkgKyBkZWxheTsKQEAgLTIwMiw2ICsyMDQsOSBAQAogICAgIGlmICh0aW1lX3RvX2pvYl9yZWNvcmRfbWFwXy5lbXB0eSgpICYmIHdhaXRfZm9yX25leHRfam9iKSB7CiAgICAgICAvLyB8a1NiVGltZU1heHwgbWFrZXMgbW9yZSBzZW5zZSBoZXJlLCBidXQgfGtTYlRpbWVEYXl8IGlzIG11Y2ggc2FmZXIuCiAgICAgICBjb25kaXRpb25fLldhaXRUaW1lZChrU2JUaW1lRGF5KTsKKyNpZiBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORworICAgICAgKyt3YWl0X3RpbWVzXzsKKyNlbmRpZiAgLy8gRU5BQkxFX0pPQl9RVUVVRV9QUk9GSUxJTkcKICAgICB9CiAgICAgaWYgKHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmVtcHR5KCkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIxMiw2ICsyMTcsOSBAQAogICAgIGlmIChkZWxheSA+IDApIHsKICAgICAgIGlmICh3YWl0X2Zvcl9uZXh0X2pvYikgewogICAgICAgICBjb25kaXRpb25fLldhaXRUaW1lZChkZWxheSk7CisjaWYgRU5BQkxFX0pPQl9RVUVVRV9QUk9GSUxJTkcKKyAgICAgICAgKyt3YWl0X3RpbWVzXzsKKyNlbmRpZiAgLy8gRU5BQkxFX0pPQl9RVUVVRV9QUk9GSUxJTkcKICAgICAgICAgaWYgKHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmVtcHR5KCkpIHsKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTIzOSw2ICsyNDcsOCBAQAogICBqb2JfcmVjb3JkLmpvYigpOwogCiAjaWYgRU5BQkxFX0pPQl9RVUVVRV9QUk9GSUxJTkcKKyAgKytqb2JzX3Byb2Nlc3NlZF87CisKICAgYXV0byBub3cgPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKICAgYXV0byBlbGFwc2VkID0gbm93IC0gc3RhcnQ7CiAgIGlmIChlbGFwc2VkID4gbWF4X2pvYl9pbnRlcnZhbF8pIHsKQEAgLTI0Niw3ICsyNTYsMTAgQEAKICAgICBtYXhfam9iX2ludGVydmFsXyA9IGVsYXBzZWQ7CiAgIH0KICAgaWYgKG5vdyAtIGxhc3RfcmVzZXRfdGltZV8gPiBrUHJvZmlsZVJlc2V0SW50ZXJ2YWwpIHsKLSAgICBTQl9MT0coSU5GTykgPDwgIj09PT09PT09PT09PT09PT0gTWF4IGpvYiB0YWtlcyAiIDw8IG1heF9qb2JfaW50ZXJ2YWxfOworICAgIFNCX0xPRyhJTkZPKSA8PCAiPT09PT09PT09PT09PT09PSAiIDw8IGpvYnNfcHJvY2Vzc2VkXworICAgICAgICAgICAgICAgICA8PCAiIGpvYnMgcHJvY2Vzc2VkLCBhbmQgd2FpdGVkIGZvciAiIDw8IHdhaXRfdGltZXNfCisgICAgICAgICAgICAgICAgIDw8ICIgdGltZXMgc2luY2UgbGFzdCByZXNldCBvbiAweCIgPDwgdGhpcworICAgICAgICAgICAgICAgICA8PCAiLCBtYXggam9iIHRha2VzICIgPDwgbWF4X2pvYl9pbnRlcnZhbF87CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JfcmVjb3JkLnN0YWNrX3NpemU7ICsraSkgewogICAgICAgY2hhciBmdW5jdGlvbl9uYW1lWzEwMjRdOwogICAgICAgaWYgKFNiU3lzdGVtU3ltYm9saXplKGpvYl9yZWNvcmQuc3RhY2tbaV0sIGZ1bmN0aW9uX25hbWUsCkBAIC0yNTgsNiArMjcxLDggQEAKICAgICB9CiAgICAgbGFzdF9yZXNldF90aW1lXyA9IG5vdzsKICAgICBtYXhfam9iX2ludGVydmFsXyA9IDA7CisgICAgam9ic19wcm9jZXNzZWRfID0gMDsKKyAgICB3YWl0X3RpbWVzXyA9IDA7CiAgIH0KICNlbmRpZiAgLy8gRU5BQkxFX0pPQl9RVUVVRV9QUk9GSUxJTkcKICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuaAppbmRleCAyMzFjMWQ0Li5iMjM2ZmNkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmgKQEAgLTE2Myw2ICsxNjMsOCBAQAogICBTYlRpbWVNb25vdG9uaWMgbGFzdF9yZXNldF90aW1lXyA9IFNiVGltZUdldE1vbm90b25pY05vdygpOwogICBKb2JSZWNvcmQgam9iX3JlY29yZF93aXRoX21heF9pbnRlcnZhbF87CiAgIFNiVGltZU1vbm90b25pYyBtYXhfam9iX2ludGVydmFsXyA9IDA7CisgIGludCBqb2JzX3Byb2Nlc3NlZF8gPSAwOworICBpbnQgd2FpdF90aW1lc18gPSAwOwogI2VuZGlmICAvLyBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3RocmVhZF9sb2NhbF9zdG9yYWdlX2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3RocmVhZF9sb2NhbF9zdG9yYWdlX2ludGVybmFsLmNjCmluZGV4IDBlMjg4MjguLmY5ODk5NGIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC90aHJlYWRfbG9jYWxfc3RvcmFnZV9pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvdGhyZWFkX2xvY2FsX3N0b3JhZ2VfaW50ZXJuYWwuY2MKQEAgLTIyOSw3ICsyMjksMTIgQEAKICAgS2V5UmVjb3JkKiByZWNvcmQgPSAmZGF0YV8tPmtleV90YWJsZV9ba2V5LT5pbmRleF07CiAKICAgcmVjb3JkLT5kZXN0cnVjdG9yID0gZGVzdHJ1Y3RvcjsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCisgIFNiTWVtb3J5U2V0KHJlY29yZC0+dmFsdWVzLmRhdGEoKSwgMCwKKyAgICAgICAgICAgICAgcmVjb3JkLT52YWx1ZXMuc2l6ZSgpICogc2l6ZW9mKHJlY29yZC0+dmFsdWVzWzBdKSk7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZFQVRVUkVfUlVOVElNRV9DT05GSUdTX1ZFUlNJT04KICAgU2JNZW1vcnlTZXQocmVjb3JkLT52YWx1ZXMsIDAsIHNpemVvZihyZWNvcmQtPnZhbHVlcykpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAgIHJlY29yZC0+dmFsaWQgPSB0cnVlOwogCiAgIHJldHVybiBrZXk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvdGhyZWFkX2xvY2FsX3N0b3JhZ2VfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC90aHJlYWRfbG9jYWxfc3RvcmFnZV9pbnRlcm5hbC5oCmluZGV4IDk0MzhmYTkuLjMxMmI5OGIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC90aHJlYWRfbG9jYWxfc3RvcmFnZV9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC90aHJlYWRfbG9jYWxfc3RvcmFnZV9pbnRlcm5hbC5oCkBAIC0xNSw2ICsxNSw4IEBACiAjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1RIUkVBRF9MT0NBTF9TVE9SQUdFX0lOVEVSTkFMX0hfCiAjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1RIUkVBRF9MT0NBTF9TVE9SQUdFX0lOVEVSTkFMX0hfCiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL211dGV4LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCkBAIC01NSw3ICs1NywxMSBAQAogICBzdHJ1Y3QgS2V5UmVjb3JkIHsKICAgICBib29sIHZhbGlkOwogICAgIFNiVGhyZWFkTG9jYWxEZXN0cnVjdG9yIGRlc3RydWN0b3I7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgorICAgIHN0ZDo6dmVjdG9yPHZvaWQqPiB2YWx1ZXMoa01heFRocmVhZHMpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9GRUFUVVJFX1JVTlRJTUVfQ09ORklHU19WRVJTSU9OCiAgICAgdm9pZCogdmFsdWVzW2tNYXhUaHJlYWRzXTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRkVBVFVSRV9SVU5USU1FX0NPTkZJR1NfVkVSU0lPTgogICB9OwogCiAgIC8vIFNldHMgdXAgdGhlIHNwZWNpZmllZCBrZXkuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RpcmVjdG9yeV9nZXRfbmV4dC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGlyZWN0b3J5X2dldF9uZXh0LmNjCmluZGV4IDUxNzNkNGUuLjg5ODc1OTggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGlyZWN0b3J5X2dldF9uZXh0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGlyZWN0b3J5X2dldF9uZXh0LmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgogCiBib29sIFNiRGlyZWN0b3J5R2V0TmV4dChTYkRpcmVjdG9yeSAvKmRpcmVjdG9yeSovLAotICAgICAgICAgICAgICAgICAgICAgICAgU2JEaXJlY3RvcnlFbnRyeSogLypvdXRfZW50cnkqLykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogLypvdXRfZW50cnkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAvKiBvdXRfZW50cnlfc2l6ZSAqLykgewogICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZF9hbGwuZ3lwIGIvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmRfYWxsLmd5cAppbmRleCA3NmJiNDQ4Li5iZmM1OGIzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZF9hbGwuZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkX2FsbC5neXAKQEAgLTg5LDYgKzg5LDExIEBACiAgICAgICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90b29scy90b29scy5neXA6KicsCiAgICAgICAgICAgXSwKICAgICAgICAgfV0sCisgICAgICAgIFsnc2JfZW5hYmxlX2JlbmNobWFyaz09MScsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9iZW5jaG1hcmsvYmVuY2htYXJrLmd5cDoqJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgfSwKICAgXSwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkX2hlYWRlcnNfb25seS5neXAgYi9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZF9oZWFkZXJzX29ubHkuZ3lwCmluZGV4IDY1NDZmNzYuLmRiOTU0ZjUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkX2hlYWRlcnNfb25seS5neXAKKysrIGIvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmRfaGVhZGVyc19vbmx5Lmd5cApAQCAtMzMsNiArMzMsNyBAQAogICAgICAgICAnY2hhcmFjdGVyLmgnLAogICAgICAgICAnY29uZGl0aW9uX3ZhcmlhYmxlLmgnLAogICAgICAgICAnY29uZmlndXJhdGlvbi5oJywKKyAgICAgICAgJ2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmgnLAogICAgICAgICAnY3B1X2ZlYXR1cmVzLmgnLAogICAgICAgICAnZGVjb2RlX3RhcmdldC5oJywKICAgICAgICAgJ2RpcmVjdG9yeS5oJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5jYyBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNjODg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmNjCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzIGZvciBhIHBsYXRmb3JtLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmgiCisKKy8vIERldGVybWluZXMgdGhlIGFsaWdubWVudCB0aGF0IGFsbG9jYXRpb25zIHNob3VsZCBoYXZlIG9uIHRoaXMgcGxhdGZvcm0uCitjb25zdCBzaXplX3Qga1NiTWFsbG9jQWxpZ25tZW50ID0gMTY7CisKKy8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KK2NvbnN0IGludDMyX3Qga1NiTWF4VGhyZWFkTmFtZUxlbmd0aCA9IDE2OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCAyNjViZTJhLi45NWVhZjFmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMzY3LDkgKzM2Nyw2IEBACiAvLyBzcGVjaWZ5IHRoYXQuCiAjZGVmaW5lIFNCX05FVFdPUktfSU9fQlVGRkVSX0FMSUdOTUVOVCAxNgogCi0vLyBEZXRlcm1pbmVzIHRoZSBhbGlnbm1lbnQgdGhhdCBhbGxvY2F0aW9ucyBzaG91bGQgaGF2ZSBvbiB0aGlzIHBsYXRmb3JtLgotI2RlZmluZSBTQl9NQUxMT0NfQUxJR05NRU5UICgoc2l6ZV90KTE2VSkKLQogLy8gRGV0ZXJtaW5lcyB0aGUgdGhyZXNoaG9sZCBvZiBhbGxvY2F0aW9uIHNpemUgdGhhdCBzaG91bGQgYmUgZG9uZSB3aXRoIG1tYXAKIC8vIChpZiBhdmFpbGFibGUpLCByYXRoZXIgdGhhbiBhbGxvY2F0ZWQgd2l0aGluIHRoZSBjb3JlIGhlYXAuCiAjZGVmaW5lIFNCX0RFRkFVTFRfTU1BUF9USFJFU0hPTEQgKChzaXplX3QpKDI1NiAqIDEwMjRVKSkKQEAgLTM5OCw5ICszOTUsNiBAQAogLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZCBsb2NhbCBzdG9yYWdlIGtleXMgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0uCiAjZGVmaW5lIFNCX01BWF9USFJFQURfTE9DQUxfS0VZUyA1MTIKIAotLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBuYW1lIGZvciBhIHRocmVhZCwgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbmF0b3IuCi0jZGVmaW5lIFNCX01BWF9USFJFQURfTkFNRV9MRU5HVEggMTYKLQogLy8gLS0tIFRpbWluZyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW4gQVBJIHRvIHJldHJpZXZlIGhvdyBsb25nIHRoZSBjdXJyZW50IHRocmVhZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdHViL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAgYi9zcmMvc3RhcmJvYXJkL3N0dWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCA1OTcxZDAzLi41YmFmMGNhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL3N0dWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApAQCAtMjQsNiArMjQsNyBAQAogICAgICAgICAnYXBwbGljYXRpb25fc3R1Yi5jYycsCiAgICAgICAgICdhcHBsaWNhdGlvbl9zdHViLmgnLAogICAgICAgICAnYXRvbWljX3B1YmxpYy5oJywKKyAgICAgICAgJ2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmNjJywKICAgICAgICAgJ21haW4uY2MnLAogICAgICAgICAndGhyZWFkX3R5cGVzX3B1YmxpYy5oJywKICAgICAgICAgIyBJbmNsdWRlIHByaXZhdGUgc3R1YnMsIGlmIHByZXNlbnQuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL2Fic3RyYWN0X2xhdW5jaGVyLnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9hYnN0cmFjdF9sYXVuY2hlci5weQppbmRleCA5MGRjMjg4Li5hOWI1MDYzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL2Fic3RyYWN0X2xhdW5jaGVyLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvYWJzdHJhY3RfbGF1bmNoZXIucHkKQEAgLTE3Miw2ICsxNzIsMjMgQEAKIAogICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU3VzcGVuZCBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHBsYXRmb3JtLiIpCiAKKyAgZGVmIFN1cHBvcnRzRGVlcExpbmsoc2VsZik6CisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIFNlbmREZWVwTGluayhzZWxmLCBsaW5rKToKKyAgICAiIiJTZW5kcyBkZWVwIGxpbmsgdG8gdGhlIGxhdW5jaGVyJ3MgZXhlY3V0YWJsZS4KKworICAgIEFyZ3M6CisgICAgICBsaW5rOiAgTGluayB0byBzZW5kIHRvIHRoZSBleGVjdXRhYmxlLgorCisgICAgUmFpc2VzOgorICAgICAgUnVudGltZUVycm9yOiBEZWVwIGxpbmsgbm90IHN1cHBvcnRlZCBvbiBwbGF0Zm9ybS4KKyAgICAiIiIKKworICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgIkRlZXAgbGluayBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHBsYXRmb3JtIChsaW5rIHt9IHNlbnQpLiIuZm9ybWF0KAorICAgICAgICAgICAgbGluaykpCisKICAgZGVmIEdldFN0YXJ0dXBUaW1lb3V0KHNlbGYpOgogICAgICIiIkdldHMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGFzc3VtaW5nIGEgbGF1bmNoZXIgdGltZW91dC4iIiIKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9wYWNrYWdlLnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9wYWNrYWdlLnB5CmluZGV4IDhlMzI0NWMuLjcxNjU5NmIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvcGFja2FnZS5weQorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL3BhY2thZ2UucHkKQEAgLTMzLDcgKzMzLDggQEAKICAgICBwYXRoOiBQYXRoIHRvIHRoZSBwbGF0Zm9ybQogICAgIHJvb3RfbW9kdWxlOiBBbiBhbHJlYWR5LWxvYWRlZCBtb2R1bGUKICAgICBtb2R1bGVfbmFtZTogTmFtZSBvZiBhIHB5dGhvbiBtb2R1bGUgdG8gbG9hZC4gSWYgTm9uZSwgbG9hZCB0aGUgcGxhdGZvcm0KLSAgICAgICAgZGlyZWN0b3J5IGFzIGEgcHl0aG9uIG1vZHVsZS4KKyAgICAgIGRpcmVjdG9yeSBhcyBhIHB5dGhvbiBtb2R1bGUuCisKICAgUmV0dXJuczoKICAgICBBIG1vZHVsZSBsb2FkZWQgd2l0aCBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZQogICBUaHJvd3M6CkBAIC05NSw4ICs5Niw5IEBACiAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBweWxpbnQ6IGRpc2FibGU9YnJvYWQtZXhjZXB0CiAgICAgICAjIENhdGNoIGFsbCBleGNlcHRpb25zIHRvIGF2b2lkIGFuIGVycm9yIGluIG9uZSBwbGF0Zm9ybSdzIFBhY2thZ2VyCiAgICAgICAjIGhhbHRpbmcgdGhlIHNjcmlwdCBmb3Igb3RoZXIgcGxhdGZvcm1zJyBwYWNrYWdlcnMuCi0gICAgICBsb2dnaW5nLndhcm5pbmcoJ0V4Y2VwdGlvbiBpdGVyYXRpbmcgc3VwcG9ydGVkIHBsYXRmb3JtIGZvciBwbGF0Zm9ybSAnCi0gICAgICAgICAgICAgICAgICAgICAgJyVzOiAlcy4nLCBwbGF0Zm9ybV9pbmZvLm5hbWUsIGUpCisgICAgICBsb2dnaW5nLndhcm5pbmcoCisgICAgICAgICAgJ0V4Y2VwdGlvbiBpdGVyYXRpbmcgc3VwcG9ydGVkIHBsYXRmb3JtIGZvciBwbGF0Zm9ybSAnCisgICAgICAgICAgJyVzOiAlcy4nLCBwbGF0Zm9ybV9pbmZvLm5hbWUsIGUpCiAKICAgcmV0dXJuIHBhY2thZ2VyX21vZHVsZXMKIApAQCAtMTIxLDEwICsxMjMsOSBAQAogCiAgICAgQXJnczoKICAgICAgIHRhcmdldHM6IEEgbGlzdCBvZiB0YXJnZXRzIHRvIGluc3RhbGwgdGhlIHBhY2thZ2UgdG8sIG9yIE5vbmUgb24gcGxhdGZvcm1zCi0gICAgICAgICAgdGhhdCBzdXBwb3J0IGluc3RhbGxpbmcgdG8gYSBkZWZhdWx0IHRhcmdldC4KLQotICAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGltcGxlbWVudCBwbGF0Zm9ybS1zcGVjaWZpYyBzdGVwcyB0bwotICAgIGluc3RhbGwgdGhlIHBhY2thZ2UgZm9yIHRoYXQgcGxhdGZvcm0uCisgICAgICAgIHRoYXQgc3VwcG9ydCBpbnN0YWxsaW5nIHRvIGEgZGVmYXVsdCB0YXJnZXQuICBUaGlzIG1ldGhvZCBjYW4gYmUKKyAgICAgICAgb3ZlcnJpZGRlbiB0byBpbXBsZW1lbnQgcGxhdGZvcm0tc3BlY2lmaWMgc3RlcHMgdG8gaW5zdGFsbCB0aGUgcGFja2FnZQorICAgICAgICBmb3IgdGhhdCBwbGF0Zm9ybS4KICAgICAiIiIKICAgICBkZWwgdGFyZ2V0cwogCkBAIC0xNDgsNiArMTQ5LDcgQEAKICAgICBjb25zdHJ1Y3Rvci4KICAgICBBcmdzOgogICAgICAgb3B0aW9uczogQSBuYW1lc3BhY2Ugb2JqZWN0IHJldHVybmVkIGZyb20gQXJndW1lbnRQYXJzZXIucGFyc2VfYXJncworCiAgICAgUmV0dXJuczoKICAgICAgIEEgZGljdCBvZiBrd2FyZ3MgdG8gYmUgcGFzc2VkIHRvIHRoZSBQYWNrYWdlIGNvbnN0cnVjdG9yLgogICAgICIiIgpAQCAtMTY4LDEyICsxNzAsMTIgQEAKICAgZGVmIEdldFBsYXRmb3JtSW5mbyhzZWxmLCBwbGF0Zm9ybV9uYW1lKToKICAgICByZXR1cm4gc2VsZi5wbGF0Zm9ybV9pbmZvcy5nZXQocGxhdGZvcm1fbmFtZSwgTm9uZSkKIAotICBkZWYgR2V0QXBwbGljYXRpb25QYWNrYWdlSW5mbyhzZWxmLCBwbGF0Zm9ybV9uYW1lLCBhcHBsY2lhdGlvbl9uYW1lKToKKyAgZGVmIEdldEFwcGxpY2F0aW9uUGFja2FnZUluZm8oc2VsZiwgcGxhdGZvcm1fbmFtZSwgYXBwbGljYXRpb25fbmFtZSk6CiAgICAgIiIiR2V0IGFwcGxpY2F0aW9uLXNwZWNpZmljIHBhY2thZ2luZyBpbmZvcm1hdGlvbi4iIiIKICAgICBwbGF0Zm9ybV9pbmZvID0gc2VsZi5HZXRQbGF0Zm9ybUluZm8ocGxhdGZvcm1fbmFtZSkKICAgICB0cnk6CiAgICAgICByZXR1cm4gX0ltcG9ydE1vZHVsZShwbGF0Zm9ybV9pbmZvLnBhdGgsIHN0YXJib2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICclcy5wYWNrYWdlJyAlIGFwcGxjaWF0aW9uX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMucGFja2FnZScgJSBhcHBsaWNhdGlvbl9uYW1lKQogICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBlOgogICAgICAgIyBObyBwYWNrYWdlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGZvciB0aGlzIHBsYXRmb3JtLgogICAgICAgbG9nZ2luZy5kZWJ1ZygnRmFpbGVkIHRvIGltcG9ydCBjb2JhbHQucGFja2FnZTogJXMnLCBlKQpAQCAtMTg3LDYgKzE4OSw3IEBACiAgICAgICBzb3VyY2VfZGlyOiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHBhY2thZ2VkLgogICAgICAgb3V0cHV0X2RpcjogVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBwYWNrYWdlIGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuCiAgICAgICAqKmt3YXJnczogUGxhdGZvcm0tc3BlY2lmaWMgYXJndW1lbnRzLgorCiAgICAgUmV0dXJuczoKICAgICAgIEEgUGFja2FnZUJhc2UgaW5zdGFuY2UuCiAgICAgIiIiCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL3BvcnRfc3ltbGluay5weSBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvcG9ydF9zeW1saW5rLnB5CmluZGV4IGFmZDEyMDIuLmJkN2E3YTEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvcG9ydF9zeW1saW5rLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvcG9ydF9zeW1saW5rLnB5CkBAIC0xMzYsNiArMTM2LDExIEBACiAgIGZvcm1hdHRlcl9jbGFzcyA9IGFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlcgogICBwYXJzZXIgPSBNeVBhcnNlcihlcGlsb2c9aGVscF9tc2csIGZvcm1hdHRlcl9jbGFzcz1mb3JtYXR0ZXJfY2xhc3MpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLWEnLAorICAgICAgJy0tdXNlX2Fic29sdXRlX3N5bWxpbmtzJywKKyAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICBoZWxwPSdHZW5lcmF0ZWQgc3ltbGlua3MgYXJlIHN0b3JlZCBhcyBhYnNvbHV0ZSBwYXRocy4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgJy1mJywKICAgICAgICctLWZvcmNlJywKICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCkBAIC0xNTUsNiArMTYwLDkgQEAKICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKIAogICBmb2xkZXJfcGF0aCwgbGlua19wYXRoID0gYXJncy5saW5rCisgIGlmIGFyZ3MudXNlX2Fic29sdXRlX3N5bWxpbmtzOgorICAgIGZvbGRlcl9wYXRoID0gb3MucGF0aC5hYnNwYXRoKGZvbGRlcl9wYXRoKQorICAgIGxpbmtfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChsaW5rX3BhdGgpCiAgIGlmICcuJyBpbiBmb2xkZXJfcGF0aDoKICAgICBkMSA9IG9zLnBhdGguYWJzcGF0aChmb2xkZXJfcGF0aCkKICAgZWxzZToKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvc2VuZF9saW5rLnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9zZW5kX2xpbmsucHkKaW5kZXggNzRkNDdmNC4uMTBhNWE1ZCAxMDA3NTUKLS0tIGEvc3JjL3N0YXJib2FyZC90b29scy9zZW5kX2xpbmsucHkKKysrIGIvc3JjL3N0YXJib2FyZC90b29scy9zZW5kX2xpbmsucHkKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBzeXMKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHRleHR3cmFwCitpbXBvcnQgdGltZQogCiAKIGRlZiBfVW5jYXNlKHRleHQpOgpAQCAtNzYsNyArNzcsMjAgQEAKICAgcmV0dXJuIE5vbmUKIAogCi1kZWYgX1NlbmRMaW5rKGV4ZWN1dGFibGUsIGxpbmspOgorZGVmIF9Db25uZWN0V2l0aFJldHJ5KHMsIHBvcnQsIG51bV9hdHRlbXB0cyk6CisgIGZvciBhdHRlbXB0IGluIHJhbmdlKG51bV9hdHRlbXB0cyk6CisgICAgaWYgYXR0ZW1wdCA+IDA6CisgICAgICB0aW1lLnNsZWVwKDEpCisgICAgdHJ5OgorICAgICAgcy5jb25uZWN0KCgnbG9jYWxob3N0JywgcG9ydCkpCisgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCAoUnVudGltZUVycm9yLCBJT0Vycm9yKToKKyAgICAgIGxvZ2dpbmcuZXJyb3IoJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHBvcnQgJWQsIGF0dGVtcHQgJWQgLyAlZCcsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQsIG51bV9hdHRlbXB0cykKKyAgcmV0dXJuIEZhbHNlCisKKworZGVmIFNlbmRMaW5rKGV4ZWN1dGFibGUsIGxpbmssIGNvbm5lY3Rpb25fYXR0ZW1wdHM9MSk6CiAgICIiIlNlbmRzIGEgbGluayB0byB0aGUgcHJvY2VzcyBzdGFydGluZyB3aXRoIHRoZSBnaXZlbiBleGVjdXRhYmxlIG5hbWUuIiIiCiAKICAgcGlkcyA9IF9HZXRQaWRzKGV4ZWN1dGFibGUpCkBAIC0xMDksNyArMTIzLDkgQEAKIAogICB0cnk6CiAgICAgd2l0aCBjbG9zaW5nKHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkpIGFzIHM6Ci0gICAgICBzLmNvbm5lY3QoKCdsb2NhbGhvc3QnLCBwb3J0KSkKKyAgICAgIGlmIG5vdCBfQ29ubmVjdFdpdGhSZXRyeShzLCBwb3J0LCBjb25uZWN0aW9uX2F0dGVtcHRzKToKKyAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHBvcnQ6ICVkJywgcG9ydCkKKyAgICAgICAgcmV0dXJuIDEKICAgICAgIHRlcm1pbmF0ZWRfbGluayA9IGxpbmsgKyAnXHgwMCcKICAgICAgIGJ5dGVzX3NlbnQgPSAwCiAgICAgICB3aGlsZSBieXRlc19zZW50IDwgbGVuKHRlcm1pbmF0ZWRfbGluayk6CkBAIC0xMzgsNyArMTU0LDcgQEAKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICdsaW5rJywgdHlwZT1zdHIsIGhlbHA9J1RoZSBsaW5rIGNvbnRlbnQgdG8gc2VuZCB0byB0aGUgZXhlY3V0YWJsZS4nKQogICBhcmd1bWVudHMgPSBwYXJzZXIucGFyc2VfYXJncygpCi0gIHJldHVybiBfU2VuZExpbmsoYXJndW1lbnRzLmV4ZWN1dGFibGUsIGFyZ3VtZW50cy5saW5rKQorICByZXR1cm4gU2VuZExpbmsoYXJndW1lbnRzLmV4ZWN1dGFibGUsIGFyZ3VtZW50cy5saW5rKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL3N5bWJvbGl6ZS9fZW52LnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9zeW1ib2xpemUvX2Vudi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjE5MDhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC90b29scy9zeW1ib2xpemUvX2Vudi5weQpAQCAtMCwwICsxLDI2IEBACisjCisjIENvcHlyaWdodCAyMDE3IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyIiIkFzayB0aGUgcGFyZW50IGRpcmVjdG9yeSB0byBsb2FkIHRoZSBwcm9qZWN0IGVudmlyb25tZW50LiIiIgorCitmcm9tIGltcCBpbXBvcnQgbG9hZF9zb3VyY2UKK2Zyb20gb3MgaW1wb3J0IHBhdGgKK2ltcG9ydCBzeXMKKworX0VOViA9IHBhdGguYWJzcGF0aChwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgcGF0aC5wYXJkaXIsICdfZW52LnB5JykpCitpZiBub3QgcGF0aC5leGlzdHMoX0VOVik6CisgIHByaW50ICclczogQ2FuXCd0IGZpbmQgcmVwbyByb290LlxuTWlzc2luZyBwYXJlbnQ6ICVzJyAlIChfX2ZpbGVfXywgX0VOVikKKyAgc3lzLmV4aXQoMSkKK2xvYWRfc291cmNlKCcnLCBfRU5WKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9zeW1ib2xpemUvc3ltYm9saXplLnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9zeW1ib2xpemUvc3ltYm9saXplLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMTM1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL3N5bWJvbGl6ZS9zeW1ib2xpemUucHkKQEAgLTAsMCArMSwxNTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIkxpZ2h0d2VpZ2h0IHV0aWxpdHkgdG8gc2ltcGxpZnkgcmVzb2x2aW5nIHN0YWNrIHRyYWNlcyBhbmQgY3Jhc2hlcy4KKworVGhpcyB0b29sIHN1cHBvcnRzIHRocmVlIGRpZmZlcmVudCBmb3JtYXRzIGZvciBjcmFzaGVzIGFuZCBzdGFjayB0cmFjZXMsIGJ1dCBjYW4KK2Vhc2lseSBiZSBleHBhbmRlZCBmb3IgYWRkaXRpb24gY2FzZXMuIEV4YW1wbGVzIG9mIGN1cnJlbnQgZm9ybWF0cyBhcmUgYXMKK2ZvbGxvd3M6CisKKyAgQWRkcmVzcyBTYW5pdGl6ZXIKKyAgICAjMSAweDdmZGM1OWJiYWE2YiAgKDx1bmtub3duIG1vZHVsZT4pCisKKyAgQ29iYWx0CisgICAgPHVua25vd24+IFsweDdlZmNkZjFmZDUyYl0KKworICBSYXcKKyAgICAweDdlZmNkZjFmZDUyYgorCitUaGUgcmVzdWx0cyBvZiB0aGUgc3ltYm9saXplciB3aWxsIG9ubHkgYmUgaW5jbHVkZWQgaWYgaXQgd2FzIGFibGUgdG8gZmluZCB0aGUKK25hbWUgb2YgdGhlIHN5bWJvbCwgYW5kIGl0IGRvZXMgbm90IGFwcGVhciB0byBiZSBtYWxmb3JtZWQuIFRoZSBvbmx5IGV4Y2VwdGlvbgoraXMgd2hlbiB0aGUgbGluZSB3YXMgbWF0Y2hlZCB3aXRoIHRoZSB8X1JBV3wgcmVndWxhciBleHByZXNzaW9uIGluIHdoaWNoIGNhc2UgaXQKK3dpbGwgYWx3YXlzIG91dHB1dCB0aGUgcmVzdWx0cyBvZiB0aGUgc3ltYm9saXplci4KKyIiIgorCitpbXBvcnQgX2VudiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydAorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCitmcm9tIHN0YXJib2FyZC5idWlsZCBpbXBvcnQgY2xhbmcKK2Zyb20gc3RhcmJvYXJkLnRvb2xzIGltcG9ydCBidWlsZAorCitfU1lNQk9MSVpFUiA9IG9zLnBhdGguam9pbigKKyAgICBidWlsZC5HZXRUb29sY2hhaW5zRGlyKCksICd4ODZfNjQtbGludXgtZ251LWNsYW5nLWNocm9taXVtLXt9Jy5mb3JtYXQoCisgICAgICAgIGNsYW5nLkdldENsYW5nU3BlY2lmaWNhdGlvbigpLnJldmlzaW9uKSwgJ2JpbicsICdsbHZtLXN5bWJvbGl6ZXInKQorCitfUkVfQVNBTiA9IHJlLmNvbXBpbGUoCisgICAgcidccyooI1swLTldezEsM30pXHMqKDB4W2EtejAtOV0qKVxzKlwoPHVua25vd25cc21vZHVsZT5cKScpCitfUkVfQ09CQUxUID0gcmUuY29tcGlsZShyJ1xzKjx1bmtub3duPiBcWygweFthLXowLTldKilcXVxzKicpCitfUkVfUkFXID0gcmUuY29tcGlsZShyJ14oMHhbYS16MC05XSopJCcpCisKKworZGVmIF9TeW1ib2xpemUoZmlsZW5hbWUsIGxpYnJhcnksIGJhc2VfYWRkcmVzcyk6CisgICIiIkF0dGVtcHRzIHRvIHJlc29sdmUgbWVtb3J5IGFkZHJlc3NlcyB3aXRoaW4gdGhlIGZpbGUgc3BlY2lmaWVkLgorCisgIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgdGhyb3VnaCB0aGUgZmlsZSBzcGVjaWZpZWQgbGluZSBieSBsaW5lLiBXaGVuIGEgbGluZSBpcworICBmb3VuZCB0aGF0IG1hdGNoZXMgb25lIG9mIG91ciByZWd1bGFyIGV4cHJlc3Npb25zIGl0IHdpbGwgc3RvcCBhbmQgaW52b2tlCisgIGxsdm0tc3ltYm9saXplciB3aXRoIHRoZSBvZmZzZXQgb2YgdGhlIHN5bWJvbCBhbmQgdGhlIGxpYnJhcnkgc3BlY2lmaWVkLiBUaGUKKyAgcmVzdWx0cyBhcmUgdmVyaWZpZWQgYW5kIHRoZSBvdXRwdXQgZm9ybWF0dGVkIHRvIG1hdGNoIHdoaWNoZXZlciBjcmFzaC1zdHlsZQorICBpcyBiZWluZyB1c2VkLgorCisgIEFyZ3M6CisgICAgZmlsZW5hbWU6ICAgICBUaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzdGFjayB0cmFjZS4KKyAgICBsaWJyYXJ5OiAgICAgIFRoZSBwYXRoIHRvIHRoZSBsaWJyYXJ5IHRoYXQgaXMgYmVsaWV2ZWQgdG8gaGF2ZSB0aGUgc3ltYm9sLgorICAgIGJhc2VfYWRkcmVzczogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbGlicmFyeSB3aGVuIGl0IHdhcyBsb2FkZWQgYW5kCisgICAgICBjcmFzaGVkLCB0eXBpY2FsbHkgZm91bmQgaW4gdGhlIGxvZ3MuCisgICIiIgorICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ZpbGUgbm90IGZvdW5kOiB7fS4nLmZvcm1hdChmaWxlbmFtZSkpCisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhsaWJyYXJ5KToKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdMaWJyYXJ5IG5vdCBmb3VuZDoge30uJy5mb3JtYXQobGlicmFyeSkpCisgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZjoKKyAgICBmb3IgbGluZSBpbiBmOgorICAgICAgIyBBZGRyZXNzIFNhbml0aXplcgorICAgICAgbWF0Y2ggPSBfUkVfQVNBTi5tYXRjaChsaW5lKQorICAgICAgaWYgbWF0Y2g6CisgICAgICAgIG9mZnNldCA9IGludChtYXRjaC5ncm91cCgyKSwgMCkgLSBpbnQoYmFzZV9hZGRyZXNzLCAwKQorICAgICAgICByZXN1bHRzID0gX1J1blN5bWJvbGl6ZXIobGlicmFyeSwgc3RyKG9mZnNldCkpCisgICAgICAgIGlmIHJlc3VsdHMgYW5kICc/JyBub3QgaW4gcmVzdWx0c1swXSBhbmQgJz8nIG5vdCBpbiByZXN1bHRzWzFdOgorICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJyAgICB7fSB7fSBpbiB7fSB7fVxuJy5mb3JtYXQoCisgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKDEpLCBoZXgob2Zmc2V0KSwgcmVzdWx0c1swXSwgcmVzdWx0c1sxXSkpCisgICAgICAgICAgY29udGludWUKKyAgICAgICMgQ29iYWx0CisgICAgICBtYXRjaCA9IF9SRV9DT0JBTFQubWF0Y2gobGluZSkKKyAgICAgIGlmIG1hdGNoOgorICAgICAgICBvZmZzZXQgPSBpbnQobWF0Y2guZ3JvdXAoMSksIDApIC0gaW50KGJhc2VfYWRkcmVzcywgMCkKKyAgICAgICAgcmVzdWx0cyA9IF9SdW5TeW1ib2xpemVyKGxpYnJhcnksIHN0cihvZmZzZXQpKQorICAgICAgICBpZiByZXN1bHRzIGFuZCAnPycgbm90IGluIHJlc3VsdHNbMF06CisgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnICAgICAgICB7fSBbe31dXG4nLmZvcm1hdChoZXgob2Zmc2V0KSwgcmVzdWx0c1swXSkpCisgICAgICAgICAgY29udGludWUKKyAgICAgICMgUmF3CisgICAgICBtYXRjaCA9IF9SRV9SQVcubWF0Y2gobGluZSkKKyAgICAgIGlmIG1hdGNoOgorICAgICAgICBvZmZzZXQgPSBpbnQobWF0Y2guZ3JvdXAoMSksIDApIC0gaW50KGJhc2VfYWRkcmVzcywgMCkKKyAgICAgICAgcmVzdWx0cyA9IF9SdW5TeW1ib2xpemVyKGxpYnJhcnksIHN0cihvZmZzZXQpKQorICAgICAgICBpZiByZXN1bHRzOgorICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ3t9IHt9IGluIHt9XG4nLmZvcm1hdCgKKyAgICAgICAgICAgICAgaGV4KG9mZnNldCksIHJlc3VsdHNbMF0sIHJlc3VsdHNbMV0pKQorICAgICAgICAgIGNvbnRpbnVlCisgICAgICBzeXMuc3Rkb3V0LndyaXRlKGxpbmUpCisKKworZGVmIF9SdW5TeW1ib2xpemVyKGxpYnJhcnksIG9mZnNldCk6CisgICIiIlVzZXMgYSBleHRlcm5hbCBzeW1ib2xpemVyIHRvb2wgdG8gcmVzb2x2ZSBzeW1ib2wgbmFtZXMuCisKKyAgQXJnczoKKyAgICBsaWJyYXJ5OiBUaGUgcGF0aCB0byB0aGUgbGlicmFyeSB0aGF0IGlzIGJlbGlldmVkIHRvIGhhdmUgdGhlIHN5bWJvbC4KKyAgICBvZmZzZXQ6ICBUaGUgb2Zmc2V0IGludG8gdGhlIGxpYnJhcnkgb2YgdGhlIHN5bWJvbCB3ZSBhcmUgbG9va2luZyBmb3IuCisgICIiIgorICBpZiBpbnQob2Zmc2V0KSA+PSAwOgorICAgIGNvbW1hbmQgPSBzdWJwcm9jZXNzLlBvcGVuKFtfU1lNQk9MSVpFUiwgJy1lJywgbGlicmFyeSwgb2Zmc2V0LCAnLWYnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgIHJlc3VsdHMgPSBjb21tYW5kLmNvbW11bmljYXRlKCkKKyAgICBpZiBjb21tYW5kLnJldHVybmNvZGUgPT0gMDoKKyAgICAgIHJldHVybiByZXN1bHRzWzBdLnNwbGl0KG9zLmxpbmVzZXApCisgIHJldHVybiBOb25lCisKKworZGVmIG1haW4oKToKKyAgYXJnX3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgYXJnX3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLWYnLAorICAgICAgJy0tZmlsZW5hbWUnLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9J1RoZSBwYXRoIHRvIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHN0YWNrIHRyYWNlcywgY3Jhc2hlcywgb3IgcmF3IGFkZHJlc3Nlcy4nCisgICkKKyAgYXJnX3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLWwnLAorICAgICAgJy0tbGlicmFyeScsCisgICAgICByZXF1aXJlZD1UcnVlLAorICAgICAgaGVscD0nVGhlIHBhdGggdG8gdGhlIGxpYnJhcnkgdGhhdCBpcyBiZWxpZXZlZCB0byBjb250YWluIHRoZSBhZGRyZXNzZXMuJykKKyAgYXJnX3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnYmFzZV9hZGRyZXNzJywKKyAgICAgIHR5cGU9c3RyLAorICAgICAgbmFyZ3M9MSwKKyAgICAgIGhlbHA9J1RoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGxpYnJhcnkuJykKKyAgYXJncywgXyA9IGFyZ19wYXJzZXIucGFyc2Vfa25vd25fYXJncygpCisKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKF9TWU1CT0xJWkVSKToKKyAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAnUGxlYXNlIHVwZGF0ZSB7fSB3aXRoIGEgdmFsaWQgbGx2bS1zeW1ib2xpemVyIHBhdGguJy5mb3JtYXQoX19maWxlX18pKQorCisgIHJldHVybiBfU3ltYm9saXplKGFyZ3MuZmlsZW5hbWUsIGFyZ3MubGlicmFyeSwgYXJncy5iYXNlX2FkZHJlc3NbMF0pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy90ZXN0aW5nL3Rlc3RfcnVubmVyLnB5IGIvc3JjL3N0YXJib2FyZC90b29scy90ZXN0aW5nL3Rlc3RfcnVubmVyLnB5CmluZGV4IGJhOGYyYjYuLmFjMDM0NTcgMTAwNzU1Ci0tLSBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvdGVzdGluZy90ZXN0X3J1bm5lci5weQorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9ydW5uZXIucHkKQEAgLTQxNiw4ICs0MTYsNyBAQAogICAgICAgICBjb3ZlcmFnZV9kaXJlY3Rvcnk9c2VsZi5jb3ZlcmFnZV9kaXJlY3RvcnksCiAgICAgICAgIGVudl92YXJpYWJsZXM9ZW52LAogICAgICAgICBsb2FkZXJfcGxhdGZvcm09c2VsZi5sb2FkZXJfcGxhdGZvcm0sCi0gICAgICAgIGxvYWRlcl9jb25maWc9c2VsZi5sb2FkZXJfY29uZmlnLAotICAgICAgICBsb2FkZXJfb3V0X2RpcmVjdG9yeT1zZWxmLmxvYWRlcl9vdXRfZGlyZWN0b3J5KQorICAgICAgICBsb2FkZXJfY29uZmlnPXNlbGYubG9hZGVyX2NvbmZpZykKIAogICAgIHRlc3RfcmVhZGVyID0gVGVzdExpbmVSZWFkZXIocmVhZF9waXBlKQogICAgIHRlc3RfbGF1bmNoZXIgPSBUZXN0TGF1bmNoZXIobGF1bmNoZXIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvUVItQ29kZS1nZW5lcmF0b3IvY3BwL1FyQ29kZS5jcHAgYi9zcmMvdGhpcmRfcGFydHkvUVItQ29kZS1nZW5lcmF0b3IvY3BwL1FyQ29kZS5jcHAKaW5kZXggMGY3ODkyMC4uMGRiYzA4NiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L1FSLUNvZGUtZ2VuZXJhdG9yL2NwcC9RckNvZGUuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9RUi1Db2RlLWdlbmVyYXRvci9jcHAvUXJDb2RlLmNwcApAQCAtNTQsOSArNTQsOSBAQAogfQogCiAKLVFyQ29kZSBRckNvZGU6OmVuY29kZVRleHQoY29uc3QgY2hhciAqdGV4dCwgRWNjIGVjbCkgeworUXJDb2RlIFFyQ29kZTo6ZW5jb2RlVGV4dChjb25zdCBjaGFyICp0ZXh0LCBFY2MgZWNsLCBpbnQgbWluVmVyc2lvbikgewogCXZlY3RvcjxRclNlZ21lbnQ+IHNlZ3MgPSBRclNlZ21lbnQ6Om1ha2VTZWdtZW50cyh0ZXh0KTsKLQlyZXR1cm4gZW5jb2RlU2VnbWVudHMoc2VncywgZWNsKTsKKwlyZXR1cm4gZW5jb2RlU2VnbWVudHMoc2VncywgZWNsLCBtaW5WZXJzaW9uKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvUVItQ29kZS1nZW5lcmF0b3IvY3BwL1FyQ29kZS5ocHAgYi9zcmMvdGhpcmRfcGFydHkvUVItQ29kZS1nZW5lcmF0b3IvY3BwL1FyQ29kZS5ocHAKaW5kZXggMTRhM2Y2MS4uMzFkZDFkNyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L1FSLUNvZGUtZ2VuZXJhdG9yL2NwcC9RckNvZGUuaHBwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9RUi1Db2RlLWdlbmVyYXRvci9jcHAvUXJDb2RlLmhwcApAQCAtNjQsNyArNjQsNyBAQAogCSAqIFFSIENvZGUgdmVyc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGNob3NlbiBmb3IgdGhlIG91dHB1dC4gVGhlIEVDQyBsZXZlbCBvZiB0aGUgcmVzdWx0IG1heSBiZSBoaWdoZXIgdGhhbgogCSAqIHRoZSBlY2wgYXJndW1lbnQgaWYgaXQgY2FuIGJlIGRvbmUgd2l0aG91dCBpbmNyZWFzaW5nIHRoZSB2ZXJzaW9uLgogCSAqLwotCXB1YmxpYzogc3RhdGljIFFyQ29kZSBlbmNvZGVUZXh0KGNvbnN0IGNoYXIgKnRleHQsIEVjYyBlY2wpOworCXB1YmxpYzogc3RhdGljIFFyQ29kZSBlbmNvZGVUZXh0KGNvbnN0IGNoYXIgKnRleHQsIEVjYyBlY2wsIGludCBtaW5WZXJzaW9uKTsKIAkKIAkKIAkvKiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL2FuZ2xlX2hkci5oIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvYW5nbGVfaGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5ZGQ2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL2FuZ2xlX2hkci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBBTkdMRV9IRFJfSF8KKyNkZWZpbmUgQU5HTEVfSERSX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBTZXRIZHJBbmdsZU1vZGVFbmFibGVkKGJvb2wgZmxhZyk7Citib29sIElzSGRyQW5nbGVNb2RlRW5hYmxlZCgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIEFOR0xFX0hEUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9jb21tb24vYW5nbGVfaGRyLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvY29tbW9uL2FuZ2xlX2hkci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3NWNiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvY29tbW9uL2FuZ2xlX2hkci5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAiYW5nbGVfaGRyLmgiCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvYXRvbWljLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9sb2cuaCIKKworbmFtZXNwYWNlIGFuZ2xlCit7CisKK3N0YXJib2FyZDo6YXRvbWljX2ludDMyX3QgaGRyX2FuZ2xlX21vZGVfZW5hYmxlKDApOworCit9CisKK3ZvaWQgU2V0SGRyQW5nbGVNb2RlRW5hYmxlZChib29sIGZsYWcpCit7CisgICAgaWYgKCFmbGFnICYmIGFuZ2xlOjpoZHJfYW5nbGVfbW9kZV9lbmFibGUubG9hZCgpID09IDApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFuZ2xlOjpoZHJfYW5nbGVfbW9kZV9lbmFibGUuZmV0Y2hfYWRkKGZsYWcgPyAxIDogLTEpOworICAgIFNCX0RDSEVDSyhhbmdsZTo6aGRyX2FuZ2xlX21vZGVfZW5hYmxlLmxvYWQoKSA+PSAwKTsKK30KKworYm9vbCBJc0hkckFuZ2xlTW9kZUVuYWJsZWQoKQoreworICAgIHJldHVybiBhbmdsZTo6aGRyX2FuZ2xlX21vZGVfZW5hYmxlLmxvYWQoKSA+IDA7Cit9CisjZW5kaWYgIC8vIFNUQVJCT0FSRApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvRHluYW1pY0hMU0wuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvRHluYW1pY0hMU0wuY3BwCmluZGV4IGI0MzY2ZTcuLmI2NjllOGMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL0R5bmFtaWNITFNMLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9EeW5hbWljSExTTC5jcHAKQEAgLTI2LDYgKzI2LDYzIEBACiBuYW1lc3BhY2UKIHsKIAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorLy8gVGhlIGZvbGxvd2luZyBudW1iZXJzIGFyZSByZWNlaXZlZCBmcm9tIFJlY29tbWVuZGF0aW9uIElUVSAtIFIgQlQgLjIxMDAgLSAyKDA3IC8gMjAxOCksCisvLyB0YWJsZSA0IC0gUFEgc3lzdGVtIHJlZmVyZW5jZSBub24gbGluZWFyIHRyYW5zZmVyIGZ1bmN0aW9ucworLy8gYzEgPSAwLjgzNTkzNzU7CisvLyBjMiA9IDE4Ljg1MTU2MjU7CisvLyBjMyA9IDE4LjY4NzU7CisvLyBtMSA9IDAuMTU5MzAxNzU4MTI1OworLy8gbTIgPSA3OC44NDM3NTsKK2NvbnN0IHN0ZDo6c3RyaW5nIEJUNzA5X1RPX0JUMjAyMF9TSEFERVIgPQorICAgICJzdHJ1Y3QgUFNfT1VUUFVUXG4iCisgICAgIntcbiIKKyAgICAiICAgIGZsb2F0NCBnbF9Db2xvcjAgOiBTVl9UQVJHRVQwO1xuIgorICAgICJ9O1xuIgorICAgICIjZGVmaW5lIGtSZWZXaGl0ZUxldmVsU1JHQiAyOTAuMGZcbiIKKyAgICAiI2RlZmluZSBrUmVmV2hpdGVMZXZlbFBRIDEwMDAwLjBmXG4iCisgICAgInN0YXRpYyBjb25zdCBmbG9hdDN4MyBCVDcwOV9UT19CVDIwMjAgPSB7IC8vIHJlZjogQVJJQiBTVEQtQjYyIGFuZCBCVC4yMDg3XG4iCisgICAgIiAgMC42Mjc0LCAgICAwLjMyOTMsICAgIDAuMDQzMyxcbiIKKyAgICAiICAwLjA2OTEsICAgIDAuOTE5NSwgICAgMC4wMTE0LFxuIgorICAgICIgIDAuMDE2NCwgICAgMC4wODgwLCAgICAwLjg5NTZcbiIKKyAgICAifTtcbiIKKyAgICAiZmxvYXQzIFNSR0JfRU9URihmbG9hdDMgRSlcbiIKKyAgICAie1xuIgorICAgICIgIGZsb2F0MyBkYXJrID0gRS8xMi45MjtcbiIKKyAgICAiICBmbG9hdDMgbGlnaHQgPSBwb3coYWJzKChFKzAuMDU1KS8oMSswLjA1NSkpLCAyLjQpO1xuIgorICAgICIgIGJvb2wzIGNyaSA9IEUgPD0gMC4wNDA0NTtcbiIKKyAgICAiICBmbG9hdDMgY3JpX2Zsb2F0ID0gKGZsb2F0Myljcmk7XG4iCisgICAgIiAgZmxvYXQzIHIgPSBsZXJwKGxpZ2h0LCBkYXJrLCBjcmlfZmxvYXQpO1xuIgorICAgICIgIHIgPSByICoga1JlZldoaXRlTGV2ZWxTUkdCO1xuIgorICAgICIgIHJldHVybiByO1xuIgorICAgICJ9XG4iCisgICAgIi8vaW5wdXQ6IG5vcm1hbGl6ZWQgTCBpbiB1bml0cyBvZiBSZWZXaGl0ZSAoMS4wPTEwMG5pdHMpLCBvdXRwdXQ6IG5vcm1hbGl6ZWQgRVxuIgorICAgICJmbG9hdDMgUFFfT0VURihmbG9hdDMgTClcbiIKKyAgICAie1xuIgorICAgICIgIGNvbnN0IGZsb2F0IGMxID0gMC44MzU5Mzc1O1xuIgorICAgICIgIGNvbnN0IGZsb2F0IGMyID0gMTguODUxNTYyNTtcbiIKKyAgICAiICBjb25zdCBmbG9hdCBjMyA9IDE4LjY4NzU7XG4iCisgICAgIiAgY29uc3QgZmxvYXQgbTEgPSAwLjE1OTMwMTc1ODEyNTtcbiIKKyAgICAiICBjb25zdCBmbG9hdCBtMiA9IDc4Ljg0Mzc1O1xuIgorICAgICIgIEwgPSBMIC8ga1JlZldoaXRlTGV2ZWxQUTtcbiIKKyAgICAiICBmbG9hdDMgTG0xID0gcG93KGFicyhMKSwgbTEpO1xuIgorICAgICIgIGZsb2F0MyBYID0gKGMxICsgYzIgKiBMbTEpIC8gKDEgKyBjMyAqIExtMSk7XG4iCisgICAgIiAgZmxvYXQzIHJlcyA9IHBvdyhhYnMoWCksIG0yKTtcbiIKKyAgICAiICByZXR1cm4gcmVzO1xuIgorICAgICJ9XG4iCisgICAgIlBTX09VVFBVVCBnZW5lcmF0ZU91dHB1dCgpXG4iCisgICAgIntcbiIKKyAgICAiICAgIFBTX09VVFBVVCBvdXRwdXQ7XG4iCisgICAgIiAgIFxuIgorICAgICIgICAgZmxvYXQzIGlucHV0X2NvbG9ycyA9IGdsX0NvbG9yWzBdLnJnYjtcbiIKKyAgICAiICAgIGZsb2F0MyBsaW5fb3NkX2dyYXBoaWNzID0gU1JHQl9FT1RGKGlucHV0X2NvbG9ycyk7XG4iCisgICAgIiAgICBsaW5fb3NkX2dyYXBoaWNzID0gIG11bChCVDcwOV9UT19CVDIwMjAsIGxpbl9vc2RfZ3JhcGhpY3MpO1xuIgorICAgICIgICAgb3V0cHV0LmdsX0NvbG9yMC5yZ2IgPSBQUV9PRVRGKGxpbl9vc2RfZ3JhcGhpY3MpO1xuIgorICAgICIgICAgb3V0cHV0LmdsX0NvbG9yMC5hID0gZ2xfQ29sb3JbMF0uYTtcbiIKKyAgICAiICAgIHJldHVybiBvdXRwdXQ7XG4iCisgICAgIn1cbiI7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCiBzdGQ6OnN0cmluZyBITFNMQ29tcG9uZW50VHlwZVN0cmluZyhHTGVudW0gY29tcG9uZW50VHlwZSkKIHsKICAgICBzd2l0Y2ggKGNvbXBvbmVudFR5cGUpCkBAIC0zMjIsNiArMzc5LDIxIEBACiAgICAgcmV0dXJuIHBpeGVsSExTTDsKIH0KIAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorc3RkOjpzdHJpbmcgRHluYW1pY0hMU0w6OmdlbmVyYXRlUGl4ZWxTaGFkZXJGb3JIZHJPdXRwdXRTaWduYXR1cmUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNvdXJjZVNoYWRlciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaXhlbFNoYWRlck91dHB1dFZhcmlhYmxlPiAmb3V0cHV0VmFyaWFibGVzLAorICAgIGJvb2wgdXNlc0ZyYWdEZXB0aCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxHTGVudW0+ICZvdXRwdXRMYXlvdXQpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmcgcGl4ZWxITFNMKHNvdXJjZVNoYWRlcik7CisgICAgc2l6ZV90IG91dHB1dEluc2VydGlvblBvcyA9IHBpeGVsSExTTC5maW5kKFBJWEVMX09VVFBVVF9TVFVCX1NUUklORyk7CisgICAgcGl4ZWxITFNMLnJlcGxhY2Uob3V0cHV0SW5zZXJ0aW9uUG9zLCBzdHJsZW4oUElYRUxfT1VUUFVUX1NUVUJfU1RSSU5HKSwgQlQ3MDlfVE9fQlQyMDIwX1NIQURFUik7CisKKyAgICByZXR1cm4gcGl4ZWxITFNMOworfQorI2VuZGlmICAvLyBTVEFSQk9BUkQKKwogdm9pZCBEeW5hbWljSExTTDo6Z2VuZXJhdGVWYXJ5aW5nTGlua0hMU0woY29uc3QgVmFyeWluZ1BhY2tpbmcgJnZhcnlpbmdQYWNraW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVpbHRpbkluZm8gJmJ1aWx0aW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9ncmFtVXNlc1BvaW50U2l6ZSwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL0R5bmFtaWNITFNMLmggYi9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9EeW5hbWljSExTTC5oCmluZGV4IDA5NzJhNjIuLmMwYmZjMDUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL0R5bmFtaWNITFNMLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvRHluYW1pY0hMU0wuaApAQCAtMTEyLDYgKzExMiwxMyBAQAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc291cmNlU2hhZGVyLAogICAgICAgICBjb25zdCBnbDo6SW5wdXRMYXlvdXQgJmlucHV0TGF5b3V0LAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaDo6QXR0cmlidXRlPiAmc2hhZGVyQXR0cmlidXRlcykgY29uc3Q7CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVQaXhlbFNoYWRlckZvckhkck91dHB1dFNpZ25hdHVyZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNvdXJjZVNoYWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGl4ZWxTaGFkZXJPdXRwdXRWYXJpYWJsZT4gJm91dHB1dFZhcmlhYmxlcywKKyAgICAgICAgYm9vbCB1c2VzRnJhZ0RlcHRoLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxHTGVudW0+ICZvdXRwdXRMYXlvdXQpIGNvbnN0OworI2VuZGlmICAvLyBTVEFSQk9BUkQKICAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVBpeGVsU2hhZGVyRm9yT3V0cHV0U2lnbmF0dXJlKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc291cmNlU2hhZGVyLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaXhlbFNoYWRlck91dHB1dFZhcmlhYmxlPiAmb3V0cHV0VmFyaWFibGVzLApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvUHJvZ3JhbUQzRC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9Qcm9ncmFtRDNELmNwcAppbmRleCBkYjUzMWVlLi43ODliY2VkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9Qcm9ncmFtRDNELmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9Qcm9ncmFtRDNELmNwcApAQCAtMTE0OCw2ICsxMTQ4LDc2IEBACiB7CiB9CiAKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKK2dsOjpFcnJvciBQcm9ncmFtRDNEOjpnZXRQaXhlbEV4ZWN1dGFibGVGb3JIZHJGcmFtZWJ1ZmZlcihjb25zdCBnbDo6RnJhbWVidWZmZXIgKmZibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJFeGVjdXRhYmxlRDNEICoqb3V0RXhlY3V0YWJsZSkKK3sKKyAgICBtUGl4ZWxTaGFkZXJPdXRwdXRGb3JtYXRDYWNoZS5jbGVhcigpOworCisgICAgY29uc3QgRnJhbWVidWZmZXJEM0QgKmZib0QzRCA9IEdldEltcGxBczxGcmFtZWJ1ZmZlckQzRD4oZmJvKTsKKyAgICBjb25zdCBnbDo6QXR0YWNobWVudExpc3QgJmNvbG9yYnVmZmVycyA9IGZib0QzRC0+Z2V0Q29sb3JBdHRhY2htZW50c0ZvclJlbmRlcigpOworCisgICAgZm9yIChzaXplX3QgY29sb3JBdHRhY2htZW50ID0gMDsgY29sb3JBdHRhY2htZW50IDwgY29sb3JidWZmZXJzLnNpemUoKTsgKytjb2xvckF0dGFjaG1lbnQpCisgICAgeworICAgICAgICBjb25zdCBnbDo6RnJhbWVidWZmZXJBdHRhY2htZW50ICpjb2xvcmJ1ZmZlciA9IGNvbG9yYnVmZmVyc1tjb2xvckF0dGFjaG1lbnRdOworCisgICAgICAgIGlmIChjb2xvcmJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgbVBpeGVsU2hhZGVyT3V0cHV0Rm9ybWF0Q2FjaGUucHVzaF9iYWNrKGNvbG9yYnVmZmVyLT5nZXRCaW5kaW5nKCkgPT0gR0xfQkFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdMX0NPTE9SX0FUVEFDSE1FTlQwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sb3JidWZmZXItPmdldEJpbmRpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtUGl4ZWxTaGFkZXJPdXRwdXRGb3JtYXRDYWNoZS5wdXNoX2JhY2soR0xfTk9ORSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZ2V0UGl4ZWxFeGVjdXRhYmxlRm9ySGRyT3V0cHV0TGF5b3V0KG1QaXhlbFNoYWRlck91dHB1dEZvcm1hdENhY2hlLCBvdXRFeGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Cit9CisKK2dsOjpFcnJvciBQcm9ncmFtRDNEOjpnZXRQaXhlbEV4ZWN1dGFibGVGb3JIZHJPdXRwdXRMYXlvdXQoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8R0xlbnVtPiAmb3V0cHV0U2lnbmF0dXJlLAorICAgIFNoYWRlckV4ZWN1dGFibGVEM0QgKipvdXRFeGVjdXRhYmxlLAorICAgIGdsOjpJbmZvTG9nICppbmZvTG9nKQoreworICAgIGlmIChtUGl4ZWxIZHJFeGVjdXRhYmxlKQorICAgIHsKKyAgICAgICAgKm91dEV4ZWN1dGFibGUgPSBtUGl4ZWxIZHJFeGVjdXRhYmxlLT5zaGFkZXJFeGVjdXRhYmxlKCk7CisgICAgICAgIHJldHVybiBnbDo6Tm9FcnJvcigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGZpbmFsUGl4ZWxITFNMID0gbUR5bmFtaWNITFNMLT5nZW5lcmF0ZVBpeGVsU2hhZGVyRm9ySGRyT3V0cHV0U2lnbmF0dXJlKAorICAgICAgICBtUGl4ZWxITFNMLCBtUGl4ZWxTaGFkZXJLZXksIG1Vc2VzRnJhZ0RlcHRoLCBvdXRwdXRTaWduYXR1cmUpOworCisgICAgLy8gR2VuZXJhdGUgbmV3IHBpeGVsIGV4ZWN1dGFibGUKKyAgICBTaGFkZXJFeGVjdXRhYmxlRDNEICpwaXhlbEV4ZWN1dGFibGUgPSBudWxscHRyOworCisgICAgZ2w6OkluZm9Mb2cgdGVtcEluZm9Mb2c7CisgICAgZ2w6OkluZm9Mb2cgKmN1cnJlbnRJbmZvTG9nID0gaW5mb0xvZyA/IGluZm9Mb2cgOiAmdGVtcEluZm9Mb2c7CisKKyAgICBBTkdMRV9UUlkobVJlbmRlcmVyLT5jb21waWxlVG9FeGVjdXRhYmxlKAorICAgICAgICAqY3VycmVudEluZm9Mb2csIGZpbmFsUGl4ZWxITFNMLCBTSEFERVJfUElYRUwsIG1TdHJlYW1PdXRWYXJ5aW5ncywKKyAgICAgICAgKG1TdGF0ZS5nZXRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlck1vZGUoKSA9PSBHTF9TRVBBUkFURV9BVFRSSUJTKSwgbVBpeGVsV29ya2Fyb3VuZHMsCisgICAgICAgICZwaXhlbEV4ZWN1dGFibGUpKTsKKworICAgIGlmIChwaXhlbEV4ZWN1dGFibGUpCisgICAgeworICAgICAgICBtUGl4ZWxIZHJFeGVjdXRhYmxlID0KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQaXhlbEV4ZWN1dGFibGU+KG5ldyBQaXhlbEV4ZWN1dGFibGUob3V0cHV0U2lnbmF0dXJlLCBwaXhlbEV4ZWN1dGFibGUpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWluZm9Mb2cpCisgICAgeworICAgICAgICBFUlIoKSA8PCAiRXJyb3IgY29tcGlsaW5nIEJUNzA5IHRvIEJUMjAyMCBwaXhlbCBleGVjdXRhYmxlOiIgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgIDw8IHRlbXBJbmZvTG9nLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICAqb3V0RXhlY3V0YWJsZSA9IHBpeGVsRXhlY3V0YWJsZTsKKyAgICByZXR1cm4gZ2w6Ok5vRXJyb3IoKTsKK30KKyNlbmRpZiAgLy8gU1RBUkJPQVJECisKIGdsOjpFcnJvciBQcm9ncmFtRDNEOjpnZXRQaXhlbEV4ZWN1dGFibGVGb3JGcmFtZWJ1ZmZlcihjb25zdCBnbDo6RnJhbWVidWZmZXIgKmZibywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJFeGVjdXRhYmxlRDNEICoqb3V0RXhlY3V0YWJsZSkKIHsKQEAgLTIzMjgsNiArMjM5OCw5IEBACiB7CiAgICAgbVZlcnRleEV4ZWN1dGFibGVzLmNsZWFyKCk7CiAgICAgbVBpeGVsRXhlY3V0YWJsZXMuY2xlYXIoKTsKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyAgICBtUGl4ZWxIZHJFeGVjdXRhYmxlLnJlc2V0KCk7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAogCiAgICAgZm9yIChhdXRvICZnZW9tZXRyeUV4ZWN1dGFibGUgOiBtR2VvbWV0cnlFeGVjdXRhYmxlcykKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9Qcm9ncmFtRDNELmggYi9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9Qcm9ncmFtRDNELmgKaW5kZXggMTliN2RiZi4uZDYwMTVmYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvUHJvZ3JhbUQzRC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL1Byb2dyYW1EM0QuaApAQCAtMTcwLDYgKzE3MCwxMyBAQAogICAgIGdsOjpFcnJvciBnZXRQaXhlbEV4ZWN1dGFibGVGb3JPdXRwdXRMYXlvdXQoY29uc3Qgc3RkOjp2ZWN0b3I8R0xlbnVtPiAmb3V0cHV0TGF5b3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyRXhlY3V0YWJsZUQzRCAqKm91dEV4ZWN0dWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbDo6SW5mb0xvZyAqaW5mb0xvZyk7CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgICAgZ2w6OkVycm9yIGdldFBpeGVsRXhlY3V0YWJsZUZvckhkckZyYW1lYnVmZmVyKGNvbnN0IGdsOjpGcmFtZWJ1ZmZlciAqZmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJFeGVjdXRhYmxlRDNEICoqb3V0RXhlY3R1YWJsZSk7CisgICAgZ2w6OkVycm9yIGdldFBpeGVsRXhlY3V0YWJsZUZvckhkck91dHB1dExheW91dChjb25zdCBzdGQ6OnZlY3RvcjxHTGVudW0+ICZvdXRwdXRMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJFeGVjdXRhYmxlRDNEICoqb3V0RXhlY3R1YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsOjpJbmZvTG9nICppbmZvTG9nKTsKKyNlbmRpZiAgLy8gU1RBUkJPQVJECiAgICAgZ2w6OkVycm9yIGdldFZlcnRleEV4ZWN1dGFibGVGb3JJbnB1dExheW91dChjb25zdCBnbDo6SW5wdXRMYXlvdXQgJmlucHV0TGF5b3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyRXhlY3V0YWJsZUQzRCAqKm91dEV4ZWN0dWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbDo6SW5mb0xvZyAqaW5mb0xvZyk7CkBAIC0zOTYsNyArNDAzLDkgQEAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UGl4ZWxFeGVjdXRhYmxlPj4gbVBpeGVsRXhlY3V0YWJsZXM7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNoYWRlckV4ZWN1dGFibGVEM0Q+PiBtR2VvbWV0cnlFeGVjdXRhYmxlczsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2hhZGVyRXhlY3V0YWJsZUQzRD4gbUNvbXB1dGVFeGVjdXRhYmxlOwotCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgICAgc3RkOjp1bmlxdWVfcHRyPFBpeGVsRXhlY3V0YWJsZT4gbVBpeGVsSGRyRXhlY3V0YWJsZTsKKyNlbmRpZiAgLy8gU1RBUkJPQVJECiAgICAgc3RkOjpzdHJpbmcgbVZlcnRleEhMU0w7CiAgICAgYW5nbGU6OkNvbXBpbGVyV29ya2Fyb3VuZHNEM0QgbVZlcnRleFdvcmthcm91bmRzOwogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9kM2QxMS9SZW5kZXJlcjExLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL1JlbmRlcmVyMTEuY3BwCmluZGV4IGQ5YjBiMjcuLjFhODYwMWQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL1JlbmRlcmVyMTEuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL1JlbmRlcmVyMTEuY3BwCkBAIC0xMyw2ICsxMyw5IEBACiAjaW5jbHVkZSA8dmVyc2lvbmhlbHBlcnMuaD4KICNpbmNsdWRlIDxzc3RyZWFtPgogCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAiYW5nbGVfaGRyLmgiCisjZW5kaWYgIC8vIFNUQVJCT0FSRAogI2luY2x1ZGUgImNvbW1vbi90bHMuaCIKICNpbmNsdWRlICJjb21tb24vdXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAibGliQU5HTEUvQnVmZmVyLmgiCkBAIC0zNzgsNiArMzgxLDM1IEBACiAKIGNvbnN0IHVpbnQzMl90IFNjcmF0Y2hNZW1vcnlCdWZmZXJMaWZldGltZSA9IDEwMDA7CiAKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKK2FuZ2xlOjpGb3JtYXQ6OklEIEdldFRleHR1cmVGb3JtYXRJZChjb25zdCBnbDo6Q29udGV4dFN0YXRlICZkYXRhKQoreworICAgIGNvbnN0IGF1dG8gJmdsU3RhdGUgICAgPSBkYXRhLmdldFN0YXRlKCk7CisgICAgUHJvZ3JhbUQzRCAqcHJvZ3JhbUQzRCA9IEdldEltcGxBczxQcm9ncmFtRDNEPihnbFN0YXRlLmdldFByb2dyYW0oKSk7CisKKyAgICBnbDo6U2FtcGxlclR5cGUgdHlwZSAgICAgID0gZ2w6OlNBTVBMRVJfUElYRUw7CisgICAgdW5zaWduZWQgaW50IHNhbXBsZXJSYW5nZSA9IHByb2dyYW1EM0QtPmdldFVzZWRTYW1wbGVyUmFuZ2UodHlwZSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzYW1wbGVyUmFuZ2U7IGkrKykKKyAgICB7CisgICAgICAgIEdMaW50IHRleHR1cmVVbml0ID0gcHJvZ3JhbUQzRC0+Z2V0U2FtcGxlck1hcHBpbmcodHlwZSwgaSwgZGF0YS5nZXRDYXBzKCkpOworICAgICAgICBpZiAodGV4dHVyZVVuaXQgIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsOjpUZXh0dXJlICp0ZXh0dXJlID0gZGF0YS5nZXRTdGF0ZSgpLmdldFNhbXBsZXJUZXh0dXJlKAorICAgICAgICAgICAgICAgIHRleHR1cmVVbml0LCBwcm9ncmFtRDNELT5nZXRTYW1wbGVyVGV4dHVyZVR5cGUodHlwZSwgaSkpOworICAgICAgICAgICAgQVNTRVJUKHRleHR1cmUpOworICAgICAgICAgICAgcng6OlRleHR1cmVEM0QgKnRleHR1cmVEM0QgPSBHZXRJbXBsQXM8VGV4dHVyZUQzRD4odGV4dHVyZSk7CisgICAgICAgICAgICBUZXh0dXJlU3RvcmFnZSAqdGV4U3RvcmFnZSA9IG51bGxwdHI7CisgICAgICAgICAgICB0ZXh0dXJlRDNELT5nZXROYXRpdmVUZXh0dXJlKCZ0ZXhTdG9yYWdlKTsKKyAgICAgICAgICAgIGlmICh0ZXhTdG9yYWdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRBczxUZXh0dXJlU3RvcmFnZTExXzJEPih0ZXhTdG9yYWdlKS0+Z2V0Rm9ybWF0KCkuaWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFuZ2xlOjpGb3JtYXQ6OklEOjpOT05FOworfQorI2VuZGlmICAvLyBTVEFSQk9BUkQKKwogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBSZW5kZXJlcjExOjpSZW5kZXJlcjExKGVnbDo6RGlzcGxheSAqZGlzcGxheSkKQEAgLTI0NTUsNyArMjQ4NywzMCBAQAogCiAgICAgY29uc3QgZ2w6OkZyYW1lYnVmZmVyICpkcmF3RnJhbWVidWZmZXIgPSBnbFN0YXRlLmdldERyYXdGcmFtZWJ1ZmZlcigpOwogICAgIFNoYWRlckV4ZWN1dGFibGVEM0QgKnBpeGVsRXhlICAgICAgICAgID0gbnVsbHB0cjsKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyAgICAvLyBXaGlsZSAxMC1iaXQgSERSIHZpZGVvIGlzIHBsYXlpbmcgd2UgcnVuIHRoZSBwaXhlbCBzaGFkZXIgdG8gYXBwbHkgY29sb3Igc3BhY2UgZm9yIGFsbCBVSQorICAgIC8vIGVsZW1lbnRzIGNvbnZlcnNpb24gZnJvbSA4LWJpdCB0byAxMC1iaXQgZm9yIGFsbCBkcmF3IGNhbGxzIHRoYXQgZG8gbm90IGludm9sdmUgdGhlIEhEUiB2aWRlbworICAgIC8vIHRleHR1cmUgKGxvb2sgYXQgc3BlYyBJVFUgLSBSIEJUIC4yMTAwIC0gMigwNyAvIDIwMTgpIGZvciBCVDcwOSB0byBCVDIwMjAgdHJhbnNmb3JtKS4gVGhpcworICAgIC8vIGNvbnZlcnNpb24gIGlzIGFwcGxpY2FibGUgb25seSBvbmNlIHdoZW4gd2UgZHJhdyB0byB0aGUgZGlzcGxheSAtIGRyYXdGcmFtZWJ1ZmZlci0+aWQoKSBpcyAwLgorICAgIGlmIChJc0hkckFuZ2xlTW9kZUVuYWJsZWQoKSAmJiBkcmF3RnJhbWVidWZmZXItPmlkKCkgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChHZXRUZXh0dXJlRm9ybWF0SWQoZGF0YSkgPT0gYW5nbGU6OkZvcm1hdDo6SUQ6OlIxMEcxMEIxMEEyX1VOT1JNIHx8CisgICAgICAgICAgICBHZXRUZXh0dXJlRm9ybWF0SWQoZGF0YSkgPT0gYW5nbGU6OkZvcm1hdDo6SUQ6OlIxNl9VTk9STSkKKyAgICAgICAgeworICAgICAgICAgICAgQU5HTEVfVFJZKHByb2dyYW1EM0QtPmdldFBpeGVsRXhlY3V0YWJsZUZvckZyYW1lYnVmZmVyKGRyYXdGcmFtZWJ1ZmZlciwgJnBpeGVsRXhlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBBTkdMRV9UUlkocHJvZ3JhbUQzRC0+Z2V0UGl4ZWxFeGVjdXRhYmxlRm9ySGRyRnJhbWVidWZmZXIoZHJhd0ZyYW1lYnVmZmVyLCAmcGl4ZWxFeGUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBBTkdMRV9UUlkocHJvZ3JhbUQzRC0+Z2V0UGl4ZWxFeGVjdXRhYmxlRm9yRnJhbWVidWZmZXIoZHJhd0ZyYW1lYnVmZmVyLCAmcGl4ZWxFeGUpKTsKKyAgICB9CisjZWxzZQogICAgIEFOR0xFX1RSWShwcm9ncmFtRDNELT5nZXRQaXhlbEV4ZWN1dGFibGVGb3JGcmFtZWJ1ZmZlcihkcmF3RnJhbWVidWZmZXIsICZwaXhlbEV4ZSkpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKIAogICAgIFNoYWRlckV4ZWN1dGFibGVEM0QgKmdlb21ldHJ5RXhlID0gbnVsbHB0cjsKICAgICBBTkdMRV9UUlkoCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9kM2QxMS9Td2FwQ2hhaW4xMS5jcHAgYi9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9kM2QxMS9Td2FwQ2hhaW4xMS5jcHAKaW5kZXggYThmNDYyNy4uNGQ2OTNmMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvU3dhcENoYWluMTEuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL1N3YXBDaGFpbjExLmNwcApAQCAtMTAsNiArMTAsOSBAQAogCiAjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgogCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAiYW5nbGVfaGRyLmgiCisjZW5kaWYgIC8vIFNUQVJCT0FSRAogI2luY2x1ZGUgImxpYkFOR0xFL2ZlYXR1cmVzLmgiCiAjaW5jbHVkZSAibGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL2Zvcm1hdHV0aWxzMTEuaCIKICNpbmNsdWRlICJsaWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvTmF0aXZlV2luZG93MTEuaCIKQEAgLTIzLDYgKzI2LDEyIEBACiAjaW5jbHVkZSAibGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL3NoYWRlcnMvY29tcGlsZWQvcGFzc3Rocm91Z2hyZ2JhMmQxMXBzLmgiCiAjaW5jbHVkZSAibGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL3NoYWRlcnMvY29tcGlsZWQvcGFzc3Rocm91Z2hyZ2JhMmRtczExcHMuaCIKIAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgPGluaXRndWlkLmg+CisjaW5jbHVkZSA8ZHhnaTFfNC5oPgorI2luY2x1ZGUgPGR4Z2kxXzYuaD4KKyNlbmRpZiAgLy8gU1RBUkJPQVJECisKICNpZmRlZiBBTkdMRV9FTkFCTEVfS0VZRURNVVRFWAogI2RlZmluZSBBTkdMRV9SRVNPVVJDRV9TSEFSRV9UWVBFIEQzRDExX1JFU09VUkNFX01JU0NfU0hBUkVEX0tFWUVETVVURVgKICNlbHNlCkBAIC03NTMsNiArNzYyLDM3IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgICAgaWYgKElzSGRyQW5nbGVNb2RlRW5hYmxlZCgpKQorICAgIHsKKyAgICAgICAgaWYgKG1DdXJyZW50Q29sb3JTcGFjZSAhPSBEWEdJX0NPTE9SX1NQQUNFX1JHQl9GVUxMX0cyMDg0X05PTkVfUDIwMjApCisgICAgICAgIHsKKyAgICAgICAgICAgIElEWEdJU3dhcENoYWluMyAqc3dhcENoYWluMyA9IHN0YXRpY19jYXN0PElEWEdJU3dhcENoYWluMyAqPihtU3dhcENoYWluKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN3YXBDaGFpbjMtPlNldENvbG9yU3BhY2UxKERYR0lfQ09MT1JfU1BBQ0VfUkdCX0ZVTExfRzIwODRfTk9ORV9QMjAyMCk7CisgICAgICAgICAgICBpZiAoRkFJTEVEKHJlc3VsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVJSKCkgPDwgIkNvbG9yIHNwYWNlIERYR0lfQ09MT1JfU1BBQ0VfUkdCX0ZVTExfRzIwODRfTk9ORV9QMjAyMCBzZXR1cCBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gRUdMX0JBRF9DT05GSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudENvbG9yU3BhY2UgPSBEWEdJX0NPTE9SX1NQQUNFX1JHQl9GVUxMX0cyMDg0X05PTkVfUDIwMjA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKG1DdXJyZW50Q29sb3JTcGFjZSAhPSBEWEdJX0NPTE9SX1NQQUNFX1JHQl9GVUxMX0cyMl9OT05FX1A3MDkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElEWEdJU3dhcENoYWluMyAqc3dhcENoYWluMyA9IHN0YXRpY19jYXN0PElEWEdJU3dhcENoYWluMyAqPihtU3dhcENoYWluKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN3YXBDaGFpbjMtPlNldENvbG9yU3BhY2UxKERYR0lfQ09MT1JfU1BBQ0VfUkdCX0ZVTExfRzIyX05PTkVfUDcwOSk7CisgICAgICAgICAgICBpZiAoRkFJTEVEKHJlc3VsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVJSKCkgPDwgIkNvbG9yIHNwYWNlIERYR0lfQ09MT1JfU1BBQ0VfUkdCX0ZVTExfRzIyX05PTkVfUDcwOSBzZXR1cCBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gRUdMX0JBRF9DT05GSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudENvbG9yU3BhY2UgPSBEWEdJX0NPTE9SX1NQQUNFX1JHQl9GVUxMX0cyMl9OT05FX1A3MDk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCiAgICAgbVJlbmRlcmVyLT5vblN3YXAoKTsKIAogICAgIHJldHVybiBFR0xfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL1N3YXBDaGFpbjExLmggYi9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9kM2QxMS9Td2FwQ2hhaW4xMS5oCmluZGV4IDg1YmQzNWQuLjcxYjlhZDQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL1N3YXBDaGFpbjExLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvU3dhcENoYWluMTEuaApAQCAtMTE0LDYgKzExNCw5IEBACiAKICAgICBFR0xpbnQgbUVHTFNhbXBsZXM7CiAgICAgTE9OR0xPTkcgbVFQQ0ZyZXF1ZW5jeTsKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyAgICBEWEdJX0NPTE9SX1NQQUNFX1RZUEUgbUN1cnJlbnRDb2xvclNwYWNlID0gRFhHSV9DT0xPUl9TUEFDRV9DVVNUT007CisjZW5kaWYgLy8gU1RBUkJPQVJECiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgcngKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL1RleHR1cmVTdG9yYWdlMTEuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvVGV4dHVyZVN0b3JhZ2UxMS5jcHAKaW5kZXggNWVkYzY1ZC4uNDQ5ZTgxMSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvVGV4dHVyZVN0b3JhZ2UxMS5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvVGV4dHVyZVN0b3JhZ2UxMS5jcHAKQEAgLTI2NCw2ICsyNjQsMTUgQEAKICAgICByZXR1cm4gZ2w6Ok5vRXJyb3IoKTsKIH0KIAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorY29uc3QgYW5nbGU6OkZvcm1hdCAmVGV4dHVyZVN0b3JhZ2UxMV8yRDo6Z2V0Rm9ybWF0KCkKK3sKKyAgICBEM0QxMV9URVhUVVJFMkRfREVTQyBkZXNjID0gezB9OworICAgIG1UZXh0dXJlLT5HZXREZXNjKCZkZXNjKTsKKyAgICByZXR1cm4gZDNkMTFfYW5nbGU6OkdldEZvcm1hdChkZXNjLkZvcm1hdCk7Cit9CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCiBnbDo6RXJyb3IgVGV4dHVyZVN0b3JhZ2UxMTo6Z2V0Q2FjaGVkT3JDcmVhdGVTUlYoY29uc3QgU1JWS2V5ICZrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQzRDExU2hhZGVyUmVzb3VyY2VWaWV3ICoqb3V0U1JWKQogewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvVGV4dHVyZVN0b3JhZ2UxMS5oIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvVGV4dHVyZVN0b3JhZ2UxMS5oCmluZGV4IDM2NmM3ZWEzLi45NzEyMTk0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9kM2QxMS9UZXh0dXJlU3RvcmFnZTExLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvVGV4dHVyZVN0b3JhZ2UxMS5oCkBAIC0xNzMsNiArMTczLDkgQEAKICAgICBnbDo6RXJyb3IgcmVsZWFzZUFzc29jaWF0ZWRJbWFnZShjb25zdCBnbDo6SW1hZ2VJbmRleCAmaW5kZXgsIEltYWdlMTEgKmluY29taW5nSW1hZ2UpIG92ZXJyaWRlOwogCiAgICAgZ2w6OkVycm9yIHVzZUxldmVsWmVyb1dvcmthcm91bmRUZXh0dXJlKGJvb2wgdXNlTGV2ZWxaZXJvVGV4dHVyZSkgb3ZlcnJpZGU7CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgICAgY29uc3QgYW5nbGU6OkZvcm1hdCAmZ2V0Rm9ybWF0KCk7CisjZW5kaWYgLy8gU1RBUkJPQVJECiAKICAgcHJvdGVjdGVkOgogICAgIGdsOjpFcnJvciBnZXRTd2l6emxlVGV4dHVyZShJRDNEMTFSZXNvdXJjZSAqKm91dFRleHR1cmUpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJHTEVTdjIuZ3lwaSBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliR0xFU3YyLmd5cGkKaW5kZXggYWEwNWU0Yy4uYjY5MTU1OCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJHTEVTdjIuZ3lwaQorKysgYi9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkdMRVN2Mi5neXBpCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2NvbW1vbi9NZW1vcnlCdWZmZXIuY3BwJywKICAgICAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvY29tbW9uL01lbW9yeUJ1ZmZlci5oJywKICAgICAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvY29tbW9uL09wdGlvbmFsLmgnLAorICAgICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9jb21tb24vYW5nbGVfaGRyLmNwcCcsCiAgICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2NvbW1vbi9hbmdsZXV0aWxzLmNwcCcsCiAgICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2NvbW1vbi9hbmdsZXV0aWxzLmgnLAogICAgICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9jb21tb24vYml0c2V0X3V0aWxzLmgnLApAQCAtOTIsNiArOTMsNyBAQAogICAgICAgICAnbGliYW5nbGVfaW5jbHVkZXMnOgogICAgICAgICBbCiAgICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYW5nbGUvaW5jbHVkZS9hbmdsZV9nbC5oJywKKyAgICAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL2FuZ2xlX2hkci5oJywKICAgICAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL2V4cG9ydC5oJywKICAgICAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL0VHTC9lZ2wuaCcsCiAgICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYW5nbGUvaW5jbHVkZS9FR0wvZWdsZXh0LmgnLApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2RsbWFsbG9jL2RsbWFsbG9jX2NvbmZpZy5oIGIvc3JjL3RoaXJkX3BhcnR5L2RsbWFsbG9jL2RsbWFsbG9jX2NvbmZpZy5oCmluZGV4IDhiODU0M2YuLjkzMzVmNTAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9kbG1hbGxvYy9kbG1hbGxvY19jb25maWcuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvZGxtYWxsb2MvZGxtYWxsb2NfY29uZmlnLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gIC8vIGZvciBzc2l6ZV90LCBtYXliZSBzaG91bGQgYWRkIHRvIHN0YXJib2FyZC90eXBlcy5oCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKIC8vIERlZmluZSBTVEFSQk9BUkRfSU1QTEVNRU5UQVRJT04gdG8gYWxsb3cgaW5jbHVzaW9uIG9mIGFuIGludGVybmFsIFN0YXJib2FyZAogLy8gaGVhZGVyLiBUaGlzIGlzICJva2F5IiBiZWNhdXNlIGRsbWFsbG9jIGlzIGVzc2VudGlhbGx5IGFuIGltcGxlbWVudGF0aW9uCkBAIC0xMzIsNyArMTMzLDcgQEAKICNkZWZpbmUgREVGQVVMVF9NTUFQX1RIUkVTSE9MRCBTQl9ERUZBVUxUX01NQVBfVEhSRVNIT0xECiAjZW5kaWYKIAotI2RlZmluZSBNQUxMT0NfQUxJR05NRU5UIFNCX01BTExPQ19BTElHTk1FTlQKKyNkZWZpbmUgTUFMTE9DX0FMSUdOTUVOVCBrU2JNYWxsb2NBbGlnbm1lbnQKICNkZWZpbmUgRk9SQ0VJTkxJTkUgU0JfQ19GT1JDRV9JTkxJTkUKICNkZWZpbmUgTk9JTkxJTkUgU0JfQ19OT0lOTElORQogI2RlZmluZSBMQUNLU19VTklTVERfSCAxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay8uY2xhbmctZm9ybWF0IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QwMGZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDUgQEAKKy0tLQorTGFuZ3VhZ2U6ICAgICAgICBDcHAKK0Jhc2VkT25TdHlsZTogIEdvb2dsZQorUG9pbnRlckFsaWdubWVudDogTGVmdAorLi4uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay8udHJhdmlzLWxpYmN4eC1zZXR1cC5zaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrLy50cmF2aXMtbGliY3h4LXNldHVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTE3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay8udHJhdmlzLWxpYmN4eC1zZXR1cC5zaApAQCAtMCwwICsxLDI4IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMgSW5zdGFsbCBhIG5ld2VyIENNYWtlIHZlcnNpb24KK2N1cmwgLXNTTCBodHRwczovL2NtYWtlLm9yZy9maWxlcy92My42L2NtYWtlLTMuNi4xLUxpbnV4LXg4Nl82NC5zaCAtbyBpbnN0YWxsLWNtYWtlLnNoCitjaG1vZCAreCBpbnN0YWxsLWNtYWtlLnNoCitzdWRvIC4vaW5zdGFsbC1jbWFrZS5zaCAtLXByZWZpeD0vdXNyL2xvY2FsIC0tc2tpcC1saWNlbnNlCisKKyMgQ2hlY2tvdXQgTExWTSBzb3VyY2VzCitnaXQgY2xvbmUgLS1kZXB0aD0xIGh0dHBzOi8vZ2l0aHViLmNvbS9sbHZtLW1pcnJvci9sbHZtLmdpdCBsbHZtLXNvdXJjZQorZ2l0IGNsb25lIC0tZGVwdGg9MSBodHRwczovL2dpdGh1Yi5jb20vbGx2bS1taXJyb3IvbGliY3h4LmdpdCBsbHZtLXNvdXJjZS9wcm9qZWN0cy9saWJjeHgKK2dpdCBjbG9uZSAtLWRlcHRoPTEgaHR0cHM6Ly9naXRodWIuY29tL2xsdm0tbWlycm9yL2xpYmN4eGFiaS5naXQgbGx2bS1zb3VyY2UvcHJvamVjdHMvbGliY3h4YWJpCisKKyMgU2V0dXAgbGliYysrIG9wdGlvbnMKK2lmIFsgLXogIiRCVUlMRF8zMl9CSVRTIiBdOyB0aGVuCisgIGV4cG9ydCBCVUlMRF8zMl9CSVRTPU9GRiAmJiBlY2hvIGRpc2FibGluZyAzMiBiaXQgYnVpbGQKK2ZpCisKKyMgQnVpbGQgYW5kIGluc3RhbGwgbGliYysrIChVc2UgdW5zdGFibGUgQUJJIGZvciBiZXR0ZXIgc2FuaXRpemVyIGNvdmVyYWdlKQorbWtkaXIgbGx2bS1idWlsZCAmJiBjZCBsbHZtLWJ1aWxkCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9JHtDX0NPTVBJTEVSfSAtRENNQUtFX0NYWF9DT01QSUxFUj0ke0NPTVBJTEVSfSBcCisgICAgICAtRENNQUtFX0JVSUxEX1RZUEU9UmVsV2l0aERlYkluZm8gLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0vdXNyIFwKKyAgICAgIC1ETElCQ1hYX0FCSV9VTlNUQUJMRT1PTiBcCisgICAgICAtRExMVk1fVVNFX1NBTklUSVpFUj0ke0xJQkNYWF9TQU5JVElaRVJ9IFwKKyAgICAgIC1ETExWTV9CVUlMRF8zMl9CSVRTPSR7QlVJTERfMzJfQklUU30gXAorICAgICAgLi4vbGx2bS1zb3VyY2UKK21ha2UgY3h4IC1qMgorc3VkbyBtYWtlIGluc3RhbGwtY3h4YWJpIGluc3RhbGwtY3h4CitjZCAuLi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrLy50cmF2aXMueW1sIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvLnRyYXZpcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2Y2ZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMjM1IEBACitzdWRvOiByZXF1aXJlZAorZGlzdDogdHJ1c3R5CitsYW5ndWFnZTogY3BwCisKK2VudjoKKyAgZ2xvYmFsOgorICAgIC0gL3Vzci9sb2NhbC9iaW46JFBBVEgKKworbWF0cml4OgorICBpbmNsdWRlOgorICAgIC0gY29tcGlsZXI6IGdjYworICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGxjb3YKKyAgICAgIGVudjogQ09NUElMRVI9ZysrIENfQ09NUElMRVI9Z2NjIEJVSUxEX1RZUEU9Q292ZXJhZ2UKKyAgICAtIGNvbXBpbGVyOiBnY2MKKyAgICAgIGVudjogQ09NUElMRVI9ZysrIENfQ09NUElMRVI9Z2NjIEJVSUxEX1RZUEU9RGVidWcKKyAgICAtIGNvbXBpbGVyOiBnY2MKKyAgICAgIGVudjogQ09NUElMRVI9ZysrIENfQ09NUElMRVI9Z2NjIEJVSUxEX1RZUEU9UmVsZWFzZQorICAgIC0gY29tcGlsZXI6IGdjYworICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGcrKy1tdWx0aWxpYgorICAgICAgICAgICAgLSBsaWJjNjppMzg2CisgICAgICBlbnY6CisgICAgICAgIC0gQ09NUElMRVI9ZysrCisgICAgICAgIC0gQ19DT01QSUxFUj1nY2MKKyAgICAgICAgLSBCVUlMRF9UWVBFPURlYnVnCisgICAgICAgIC0gQlVJTERfMzJfQklUUz1PTgorICAgICAgICAtIEVYVFJBX0ZMQUdTPSItbTMyIgorICAgIC0gY29tcGlsZXI6IGdjYworICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGcrKy1tdWx0aWxpYgorICAgICAgICAgICAgLSBsaWJjNjppMzg2CisgICAgICBlbnY6CisgICAgICAgIC0gQ09NUElMRVI9ZysrCisgICAgICAgIC0gQ19DT01QSUxFUj1nY2MKKyAgICAgICAgLSBCVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgLSBCVUlMRF8zMl9CSVRTPU9OCisgICAgICAgIC0gRVhUUkFfRkxBR1M9Ii1tMzIiCisgICAgLSBjb21waWxlcjogZ2NjCisgICAgICBlbnY6CisgICAgICAgIC0gSU5TVEFMTF9HQ0M2X0ZST01fUFBBPTEKKyAgICAgICAgLSBDT01QSUxFUj1nKystNiBDX0NPTVBJTEVSPWdjYy02ICBCVUlMRF9UWVBFPURlYnVnCisgICAgICAgIC0gRU5BQkxFX1NBTklUSVpFUj0xCisgICAgICAgIC0gRVhUUkFfRkxBR1M9Ii1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1nIC1PMiAtZnNhbml0aXplPXVuZGVmaW5lZCxhZGRyZXNzIC1mdXNlLWxkPWdvbGQiCisgICAgLSBjb21waWxlcjogY2xhbmcKKyAgICAgIGVudjogQ09NUElMRVI9Y2xhbmcrKyBDX0NPTVBJTEVSPWNsYW5nIEJVSUxEX1RZUEU9RGVidWcKKyAgICAtIGNvbXBpbGVyOiBjbGFuZworICAgICAgZW52OiBDT01QSUxFUj1jbGFuZysrIENfQ09NUElMRVI9Y2xhbmcgQlVJTERfVFlQRT1SZWxlYXNlCisgICAgIyBDbGFuZyB3LyBsaWJjKysKKyAgICAtIGNvbXBpbGVyOiBjbGFuZworICAgICAgZGlzdDogeGVuaWFsCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIGNsYW5nLTMuOAorICAgICAgZW52OgorICAgICAgICAtIElOU1RBTExfR0NDNl9GUk9NX1BQQT0xCisgICAgICAgIC0gQ09NUElMRVI9Y2xhbmcrKy0zLjggQ19DT01QSUxFUj1jbGFuZy0zLjggQlVJTERfVFlQRT1EZWJ1ZworICAgICAgICAtIExJQkNYWF9CVUlMRD0xCisgICAgICAgIC0gRVhUUkFfQ1hYX0ZMQUdTPSItc3RkbGliPWxpYmMrKyIKKyAgICAtIGNvbXBpbGVyOiBjbGFuZworICAgICAgZGlzdDogeGVuaWFsCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIGNsYW5nLTMuOAorICAgICAgZW52OgorICAgICAgICAtIElOU1RBTExfR0NDNl9GUk9NX1BQQT0xCisgICAgICAgIC0gQ09NUElMRVI9Y2xhbmcrKy0zLjggQ19DT01QSUxFUj1jbGFuZy0zLjggQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgIC0gTElCQ1hYX0JVSUxEPTEKKyAgICAgICAgLSBFWFRSQV9DWFhfRkxBR1M9Ii1zdGRsaWI9bGliYysrIgorICAgICMgQ2xhbmcgdy8gMzJiaXQgbGliYysrCisgICAgLSBjb21waWxlcjogY2xhbmcKKyAgICAgIGRpc3Q6IHhlbmlhbAorICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGNsYW5nLTMuOAorICAgICAgICAgICAgLSBnKystbXVsdGlsaWIKKyAgICAgICAgICAgIC0gbGliYzY6aTM4NgorICAgICAgZW52OgorICAgICAgICAtIElOU1RBTExfR0NDNl9GUk9NX1BQQT0xCisgICAgICAgIC0gQ09NUElMRVI9Y2xhbmcrKy0zLjggQ19DT01QSUxFUj1jbGFuZy0zLjggQlVJTERfVFlQRT1EZWJ1ZworICAgICAgICAtIExJQkNYWF9CVUlMRD0xCisgICAgICAgIC0gQlVJTERfMzJfQklUUz1PTgorICAgICAgICAtIEVYVFJBX0ZMQUdTPSItbTMyIgorICAgICAgICAtIEVYVFJBX0NYWF9GTEFHUz0iLXN0ZGxpYj1saWJjKysiCisgICAgIyBDbGFuZyB3LyAzMmJpdCBsaWJjKysKKyAgICAtIGNvbXBpbGVyOiBjbGFuZworICAgICAgZGlzdDogeGVuaWFsCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIC0gY2xhbmctMy44CisgICAgICAgICAgICAtIGcrKy1tdWx0aWxpYgorICAgICAgICAgICAgLSBsaWJjNjppMzg2CisgICAgICBlbnY6CisgICAgICAgIC0gSU5TVEFMTF9HQ0M2X0ZST01fUFBBPTEKKyAgICAgICAgLSBDT01QSUxFUj1jbGFuZysrLTMuOCBDX0NPTVBJTEVSPWNsYW5nLTMuOCBCVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgLSBMSUJDWFhfQlVJTEQ9MQorICAgICAgICAtIEJVSUxEXzMyX0JJVFM9T04KKyAgICAgICAgLSBFWFRSQV9GTEFHUz0iLW0zMiIKKyAgICAgICAgLSBFWFRSQV9DWFhfRkxBR1M9Ii1zdGRsaWI9bGliYysrIgorICAgICMgQ2xhbmcgdy8gbGliYysrLCBBU0FOLCBVQlNBTgorICAgIC0gY29tcGlsZXI6IGNsYW5nCisgICAgICBkaXN0OiB4ZW5pYWwKKyAgICAgIGFkZG9uczoKKyAgICAgICAgYXB0OgorICAgICAgICAgIHBhY2thZ2VzOgorICAgICAgICAgICAgY2xhbmctMy44CisgICAgICBlbnY6CisgICAgICAgIC0gSU5TVEFMTF9HQ0M2X0ZST01fUFBBPTEKKyAgICAgICAgLSBDT01QSUxFUj1jbGFuZysrLTMuOCBDX0NPTVBJTEVSPWNsYW5nLTMuOCBCVUlMRF9UWVBFPURlYnVnCisgICAgICAgIC0gTElCQ1hYX0JVSUxEPTEgTElCQ1hYX1NBTklUSVpFUj0iVW5kZWZpbmVkO0FkZHJlc3MiCisgICAgICAgIC0gRU5BQkxFX1NBTklUSVpFUj0xCisgICAgICAgIC0gRVhUUkFfRkxBR1M9Ii1nIC1PMiAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZnNhbml0aXplPXVuZGVmaW5lZCxhZGRyZXNzIC1mbm8tc2FuaXRpemUtcmVjb3Zlcj1hbGwiCisgICAgICAgIC0gRVhUUkFfQ1hYX0ZMQUdTPSItc3RkbGliPWxpYmMrKyIKKyAgICAgICAgLSBVQlNBTl9PUFRJT05TPXByaW50X3N0YWNrdHJhY2U9MQorICAgICMgQ2xhbmcgdy8gbGliYysrIGFuZCBNU0FOCisgICAgLSBjb21waWxlcjogY2xhbmcKKyAgICAgIGRpc3Q6IHhlbmlhbAorICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICBjbGFuZy0zLjgKKyAgICAgIGVudjoKKyAgICAgICAgLSBJTlNUQUxMX0dDQzZfRlJPTV9QUEE9MQorICAgICAgICAtIENPTVBJTEVSPWNsYW5nKystMy44IENfQ09NUElMRVI9Y2xhbmctMy44IEJVSUxEX1RZUEU9RGVidWcKKyAgICAgICAgLSBMSUJDWFhfQlVJTEQ9MSBMSUJDWFhfU0FOSVRJWkVSPU1lbW9yeVdpdGhPcmlnaW5zCisgICAgICAgIC0gRU5BQkxFX1NBTklUSVpFUj0xCisgICAgICAgIC0gRVhUUkFfRkxBR1M9Ii1nIC1PMiAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIgorICAgICAgICAtIEVYVFJBX0NYWF9GTEFHUz0iLXN0ZGxpYj1saWJjKysiCisgICAgIyBDbGFuZyB3LyBsaWJjKysgYW5kIE1TQU4KKyAgICAtIGNvbXBpbGVyOiBjbGFuZworICAgICAgZGlzdDogeGVuaWFsCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIGNsYW5nLTMuOAorICAgICAgZW52OgorICAgICAgICAtIElOU1RBTExfR0NDNl9GUk9NX1BQQT0xCisgICAgICAgIC0gQ09NUElMRVI9Y2xhbmcrKy0zLjggQ19DT01QSUxFUj1jbGFuZy0zLjggQlVJTERfVFlQRT1SZWxXaXRoRGViSW5mbworICAgICAgICAtIExJQkNYWF9CVUlMRD0xIExJQkNYWF9TQU5JVElaRVI9VGhyZWFkCisgICAgICAgIC0gRU5BQkxFX1NBTklUSVpFUj0xCisgICAgICAgIC0gRVhUUkFfRkxBR1M9Ii1nIC1PMiAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZnNhbml0aXplPXRocmVhZCAtZm5vLXNhbml0aXplLXJlY292ZXI9YWxsIgorICAgICAgICAtIEVYVFJBX0NYWF9GTEFHUz0iLXN0ZGxpYj1saWJjKysiCisgICAgLSBvczogb3N4CisgICAgICBvc3hfaW1hZ2U6IHhjb2RlOC4zCisgICAgICBjb21waWxlcjogY2xhbmcKKyAgICAgIGVudjoKKyAgICAgICAgLSBDT01QSUxFUj1jbGFuZysrIEJVSUxEX1RZUEU9RGVidWcKKyAgICAtIG9zOiBvc3gKKyAgICAgIG9zeF9pbWFnZTogeGNvZGU4LjMKKyAgICAgIGNvbXBpbGVyOiBjbGFuZworICAgICAgZW52OgorICAgICAgICAtIENPTVBJTEVSPWNsYW5nKysgQlVJTERfVFlQRT1SZWxlYXNlCisgICAgLSBvczogb3N4CisgICAgICBvc3hfaW1hZ2U6IHhjb2RlOC4zCisgICAgICBjb21waWxlcjogY2xhbmcKKyAgICAgIGVudjoKKyAgICAgICAgLSBDT01QSUxFUj1jbGFuZysrCisgICAgICAgIC0gQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgIC0gQlVJTERfMzJfQklUUz1PTgorICAgICAgICAtIEVYVFJBX0ZMQUdTPSItbTMyIgorICAgIC0gb3M6IG9zeAorICAgICAgb3N4X2ltYWdlOiB4Y29kZTguMworICAgICAgY29tcGlsZXI6IGdjYworICAgICAgZW52OgorICAgICAgICAtIENPTVBJTEVSPWcrKy03IENfQ09NUElMRVI9Z2NjLTcgIEJVSUxEX1RZUEU9RGVidWcKKworYmVmb3JlX3NjcmlwdDoKKyAgLSBpZiBbIC1uICIke0xJQkNYWF9CVUlMRH0iIF07IHRoZW4KKyAgICAgIHNvdXJjZSAudHJhdmlzLWxpYmN4eC1zZXR1cC5zaDsKKyAgICBmaQorICAtIGlmIFsgLW4gIiR7RU5BQkxFX1NBTklUSVpFUn0iIF07IHRoZW4KKyAgICAgIGV4cG9ydCBFWFRSQV9PUFRJT05TPSItREJFTkNITUFSS19FTkFCTEVfQVNTRU1CTFlfVEVTVFM9T0ZGIjsKKyAgICBlbHNlCisgICAgICBleHBvcnQgRVhUUkFfT1BUSU9OUz0iIjsKKyAgICBmaQorICAtIG1rZGlyIC1wIGJ1aWxkICYmIGNkIGJ1aWxkCisKK2JlZm9yZV9pbnN0YWxsOgorICAtIGlmIFsgLXogIiRCVUlMRF8zMl9CSVRTIiBdOyB0aGVuCisgICAgICBleHBvcnQgQlVJTERfMzJfQklUUz1PRkYgJiYgZWNobyBkaXNhYmxpbmcgMzIgYml0IGJ1aWxkOworICAgIGZpCisgIC0gaWYgWyAtbiAiJHtJTlNUQUxMX0dDQzZfRlJPTV9QUEF9IiBdOyB0aGVuCisgICAgICBzdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSAteSAicHBhOnVidW50dS10b29sY2hhaW4tci90ZXN0IjsKKyAgICAgIHN1ZG8gYXB0LWdldCB1cGRhdGUgLS1vcHRpb24gQWNxdWlyZTo6UmV0cmllcz0xMDAgLS1vcHRpb24gQWNxdWlyZTo6aHR0cDo6VGltZW91dD0iNjAiOworICAgIGZpCisKK2luc3RhbGw6CisgIC0gaWYgWyAtbiAiJHtJTlNUQUxMX0dDQzZfRlJPTV9QUEF9IiBdOyB0aGVuCisgICAgICB0cmF2aXNfd2FpdCBzdWRvIC1FIGFwdC1nZXQgLXlxIC0tbm8taW5zdGFsbC1zdWdnZXN0cyAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBpbnN0YWxsIGcrKy02OworICAgIGZpCisgIC0gaWYgWyAiJHtUUkFWSVNfT1NfTkFNRX0iID09ICJsaW51eCIgLWEgIiR7QlVJTERfMzJfQklUU30iID09ICJPRkYiIF07IHRoZW4KKyAgICAgIHRyYXZpc193YWl0IHN1ZG8gLUUgYXB0LWdldCAteSAtLW5vLWluc3RhbGwtc3VnZ2VzdHMgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgaW5zdGFsbCBsbHZtLTMuOS10b29sczsKKyAgICAgIHN1ZG8gY3AgL3Vzci9saWIvbGx2bS0zLjkvYmluL0ZpbGVDaGVjayAvdXNyL2xvY2FsL2Jpbi87CisgICAgZmkKKyAgLSBpZiBbICIke0JVSUxEX1RZUEV9IiA9PSAiQ292ZXJhZ2UiIC1hICIke1RSQVZJU19PU19OQU1FfSIgPT0gImxpbnV4IiBdOyB0aGVuCisgICAgICBQQVRIPX4vLmxvY2FsL2Jpbjoke1BBVEh9OworICAgICAgcGlwIGluc3RhbGwgLS11c2VyIC0tdXBncmFkZSBwaXA7CisgICAgICB0cmF2aXNfd2FpdCBwaXAgaW5zdGFsbCAtLXVzZXIgY3BwLWNvdmVyYWxsczsKKyAgICBmaQorICAtIGlmIFsgIiR7Q19DT01QSUxFUn0iID09ICJnY2MtNyIgLWEgIiR7VFJBVklTX09TX05BTUV9IiA9PSAib3N4IiBdOyB0aGVuCisgICAgICBybSAtZiAvdXNyL2xvY2FsL2luY2x1ZGUvYysrOworICAgICAgYnJldyB1cGRhdGU7CisgICAgICB0cmF2aXNfd2FpdCBicmV3IGluc3RhbGwgZ2NjQDc7CisgICAgZmkKKyAgLSBpZiBbICIke1RSQVZJU19PU19OQU1FfSIgPT0gImxpbnV4IiBdOyB0aGVuCisgICAgICBzdWRvIGFwdC1nZXQgdXBkYXRlIC1xcTsKKyAgICAgIHN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSB1bnppcCBjbWFrZTM7CisgICAgICB3Z2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL3JlbGVhc2VzL2Rvd25sb2FkLzAuMTAuMS9iYXplbC0wLjEwLjEtaW5zdGFsbGVyLWxpbnV4LXg4Nl82NC5zaCAtLW91dHB1dC1kb2N1bWVudCBiYXplbC1pbnN0YWxsZXIuc2g7CisgICAgICB0cmF2aXNfd2FpdCBzdWRvIGJhc2ggYmF6ZWwtaW5zdGFsbGVyLnNoOworICAgIGZpCisgIC0gaWYgWyAiJHtUUkFWSVNfT1NfTkFNRX0iID09ICJvc3giIF07IHRoZW4KKyAgICAgIGN1cmwgLUwgLW8gYmF6ZWwtaW5zdGFsbGVyLnNoIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL3JlbGVhc2VzL2Rvd25sb2FkLzAuMTAuMS9iYXplbC0wLjEwLjEtaW5zdGFsbGVyLWRhcndpbi14ODZfNjQuc2g7CisgICAgICB0cmF2aXNfd2FpdCBzdWRvIGJhc2ggYmF6ZWwtaW5zdGFsbGVyLnNoOworICAgIGZpCisKK3NjcmlwdDoKKyAgLSBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9JHtDX0NPTVBJTEVSfSAtRENNQUtFX0NYWF9DT01QSUxFUj0ke0NPTVBJTEVSfSAtRENNQUtFX0JVSUxEX1RZUEU9JHtCVUlMRF9UWVBFfSAtRENNQUtFX0NfRkxBR1M9IiR7RVhUUkFfRkxBR1N9IiAtRENNQUtFX0NYWF9GTEFHUz0iJHtFWFRSQV9GTEFHU30gJHtFWFRSQV9DWFhfRkxBR1N9IiAtREJFTkNITUFSS19ET1dOTE9BRF9ERVBFTkRFTkNJRVM9T04gLURCRU5DSE1BUktfQlVJTERfMzJfQklUUz0ke0JVSUxEXzMyX0JJVFN9ICR7RVhUUkFfT1BUSU9OU30gLi4KKyAgLSBtYWtlCisgIC0gY3Rlc3QgLUMgJHtCVUlMRF9UWVBFfSAtLW91dHB1dC1vbi1mYWlsdXJlCisgIC0gYmF6ZWwgdGVzdCAtYyBkYmcgLS1kZWZpbmUgZ29vZ2xlX2JlbmNobWFyay5oYXZlX3JlZ2V4PXBvc2l4IC0tYW5ub3VuY2VfcmMgLS12ZXJib3NlX2ZhaWx1cmVzIC0tdGVzdF9vdXRwdXQ9ZXJyb3JzIC0ta2VlcF9nb2luZyAvL3Rlc3QvLi4uCisKK2FmdGVyX3N1Y2Nlc3M6CisgIC0gaWYgWyAiJHtCVUlMRF9UWVBFfSIgPT0gIkNvdmVyYWdlIiAtYSAiJHtUUkFWSVNfT1NfTkFNRX0iID09ICJsaW51eCIgXTsgdGhlbgorICAgICAgY292ZXJhbGxzIC0taW5jbHVkZSBzcmMgLS1pbmNsdWRlIGluY2x1ZGUgLS1nY292LW9wdGlvbnMgJ1wtbHAnIC0tcm9vdCAuLiAtLWJ1aWxkLXJvb3QgLjsKKyAgICBmaQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvLnljbV9leHRyYV9jb25mLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvLnljbV9leHRyYV9jb25mLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NDlkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay8ueWNtX2V4dHJhX2NvbmYucHkKQEAgLTAsMCArMSwxMTUgQEAKK2ltcG9ydCBvcworaW1wb3J0IHljbV9jb3JlCisKKyMgVGhlc2UgYXJlIHRoZSBjb21waWxhdGlvbiBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBjYXNlIHRoZXJlJ3Mgbm8KKyMgY29tcGlsYXRpb24gZGF0YWJhc2Ugc2V0IChieSBkZWZhdWx0LCBvbmUgaXMgbm90IHNldCkuCisjIENIQU5HRSBUSElTIExJU1QgT0YgRkxBR1MuIFlFUywgVEhJUyBJUyBUSEUgRFJPSUQgWU9VIEhBVkUgQkVFTiBMT09LSU5HIEZPUi4KK2ZsYWdzID0gWworJy1XYWxsJywKKyctV2Vycm9yJywKKyctcGVkYW50aWMtZXJyb3JzJywKKyctc3RkPWMrKzB4JywKKyctZm5vLXN0cmljdC1hbGlhc2luZycsCisnLU8zJywKKyctRE5ERUJVRycsCisjIC4uLmFuZCB0aGUgc2FtZSB0aGluZyBnb2VzIGZvciB0aGUgbWFnaWMgLXggb3B0aW9uIHdoaWNoIHNwZWNpZmllcyB0aGUKKyMgbGFuZ3VhZ2UgdGhhdCB0aGUgZmlsZXMgdG8gYmUgY29tcGlsZWQgYXJlIHdyaXR0ZW4gaW4uIFRoaXMgaXMgbW9zdGx5CisjIHJlbGV2YW50IGZvciBjKysgaGVhZGVycy4KKyMgRm9yIGEgQyBwcm9qZWN0LCB5b3Ugd291bGQgc2V0IHRoaXMgdG8gJ2MnIGluc3RlYWQgb2YgJ2MrKycuCisnLXgnLCAnYysrJywKKyctSScsICdpbmNsdWRlJywKKyctaXN5c3RlbScsICcvdXNyL2luY2x1ZGUnLAorJy1pc3lzdGVtJywgJy91c3IvbG9jYWwvaW5jbHVkZScsCitdCisKKworIyBTZXQgdGhpcyB0byB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZm9sZGVyIChOT1QgdGhlIGZpbGUhKSBjb250YWluaW5nIHRoZQorIyBjb21waWxlX2NvbW1hbmRzLmpzb24gZmlsZSB0byB1c2UgdGhhdCBpbnN0ZWFkIG9mICdmbGFncycuIFNlZSBoZXJlIGZvcgorIyBtb3JlIGRldGFpbHM6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0pTT05Db21waWxhdGlvbkRhdGFiYXNlLmh0bWwKKyMKKyMgTW9zdCBwcm9qZWN0cyB3aWxsIE5PVCBuZWVkIHRvIHNldCB0aGlzIHRvIGFueXRoaW5nOyB5b3UgY2FuIGp1c3QgY2hhbmdlIHRoZQorIyAnZmxhZ3MnIGxpc3Qgb2YgY29tcGlsYXRpb24gZmxhZ3MuIE5vdGljZSB0aGF0IFlDTSBpdHNlbGYgdXNlcyB0aGF0IGFwcHJvYWNoLgorY29tcGlsYXRpb25fZGF0YWJhc2VfZm9sZGVyID0gJycKKworaWYgb3MucGF0aC5leGlzdHMoIGNvbXBpbGF0aW9uX2RhdGFiYXNlX2ZvbGRlciApOgorICBkYXRhYmFzZSA9IHljbV9jb3JlLkNvbXBpbGF0aW9uRGF0YWJhc2UoIGNvbXBpbGF0aW9uX2RhdGFiYXNlX2ZvbGRlciApCitlbHNlOgorICBkYXRhYmFzZSA9IE5vbmUKKworU09VUkNFX0VYVEVOU0lPTlMgPSBbICcuY2MnIF0KKworZGVmIERpcmVjdG9yeU9mVGhpc1NjcmlwdCgpOgorICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKCBvcy5wYXRoLmFic3BhdGgoIF9fZmlsZV9fICkgKQorCisKK2RlZiBNYWtlUmVsYXRpdmVQYXRoc0luRmxhZ3NBYnNvbHV0ZSggZmxhZ3MsIHdvcmtpbmdfZGlyZWN0b3J5ICk6CisgIGlmIG5vdCB3b3JraW5nX2RpcmVjdG9yeToKKyAgICByZXR1cm4gbGlzdCggZmxhZ3MgKQorICBuZXdfZmxhZ3MgPSBbXQorICBtYWtlX25leHRfYWJzb2x1dGUgPSBGYWxzZQorICBwYXRoX2ZsYWdzID0gWyAnLWlzeXN0ZW0nLCAnLUknLCAnLWlxdW90ZScsICctLXN5c3Jvb3Q9JyBdCisgIGZvciBmbGFnIGluIGZsYWdzOgorICAgIG5ld19mbGFnID0gZmxhZworCisgICAgaWYgbWFrZV9uZXh0X2Fic29sdXRlOgorICAgICAgbWFrZV9uZXh0X2Fic29sdXRlID0gRmFsc2UKKyAgICAgIGlmIG5vdCBmbGFnLnN0YXJ0c3dpdGgoICcvJyApOgorICAgICAgICBuZXdfZmxhZyA9IG9zLnBhdGguam9pbiggd29ya2luZ19kaXJlY3RvcnksIGZsYWcgKQorCisgICAgZm9yIHBhdGhfZmxhZyBpbiBwYXRoX2ZsYWdzOgorICAgICAgaWYgZmxhZyA9PSBwYXRoX2ZsYWc6CisgICAgICAgIG1ha2VfbmV4dF9hYnNvbHV0ZSA9IFRydWUKKyAgICAgICAgYnJlYWsKKworICAgICAgaWYgZmxhZy5zdGFydHN3aXRoKCBwYXRoX2ZsYWcgKToKKyAgICAgICAgcGF0aCA9IGZsYWdbIGxlbiggcGF0aF9mbGFnICk6IF0KKyAgICAgICAgbmV3X2ZsYWcgPSBwYXRoX2ZsYWcgKyBvcy5wYXRoLmpvaW4oIHdvcmtpbmdfZGlyZWN0b3J5LCBwYXRoICkKKyAgICAgICAgYnJlYWsKKworICAgIGlmIG5ld19mbGFnOgorICAgICAgbmV3X2ZsYWdzLmFwcGVuZCggbmV3X2ZsYWcgKQorICByZXR1cm4gbmV3X2ZsYWdzCisKKworZGVmIElzSGVhZGVyRmlsZSggZmlsZW5hbWUgKToKKyAgZXh0ZW5zaW9uID0gb3MucGF0aC5zcGxpdGV4dCggZmlsZW5hbWUgKVsgMSBdCisgIHJldHVybiBleHRlbnNpb24gaW4gWyAnLmgnLCAnLmh4eCcsICcuaHBwJywgJy5oaCcgXQorCisKK2RlZiBHZXRDb21waWxhdGlvbkluZm9Gb3JGaWxlKCBmaWxlbmFtZSApOgorICAjIFRoZSBjb21waWxhdGlvbl9jb21tYW5kcy5qc29uIGZpbGUgZ2VuZXJhdGVkIGJ5IENNYWtlIGRvZXMgbm90IGhhdmUgZW50cmllcworICAjIGZvciBoZWFkZXIgZmlsZXMuIFNvIHdlIGRvIG91ciBiZXN0IGJ5IGFza2luZyB0aGUgZGIgZm9yIGZsYWdzIGZvciBhCisgICMgY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZSwgaWYgYW55LiBJZiBvbmUgZXhpc3RzLCB0aGUgZmxhZ3MgZm9yIHRoYXQgZmlsZQorICAjIHNob3VsZCBiZSBnb29kIGVub3VnaC4KKyAgaWYgSXNIZWFkZXJGaWxlKCBmaWxlbmFtZSApOgorICAgIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdGV4dCggZmlsZW5hbWUgKVsgMCBdCisgICAgZm9yIGV4dGVuc2lvbiBpbiBTT1VSQ0VfRVhURU5TSU9OUzoKKyAgICAgIHJlcGxhY2VtZW50X2ZpbGUgPSBiYXNlbmFtZSArIGV4dGVuc2lvbgorICAgICAgaWYgb3MucGF0aC5leGlzdHMoIHJlcGxhY2VtZW50X2ZpbGUgKToKKyAgICAgICAgY29tcGlsYXRpb25faW5mbyA9IGRhdGFiYXNlLkdldENvbXBpbGF0aW9uSW5mb0ZvckZpbGUoCisgICAgICAgICAgcmVwbGFjZW1lbnRfZmlsZSApCisgICAgICAgIGlmIGNvbXBpbGF0aW9uX2luZm8uY29tcGlsZXJfZmxhZ3NfOgorICAgICAgICAgIHJldHVybiBjb21waWxhdGlvbl9pbmZvCisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIGRhdGFiYXNlLkdldENvbXBpbGF0aW9uSW5mb0ZvckZpbGUoIGZpbGVuYW1lICkKKworCitkZWYgRmxhZ3NGb3JGaWxlKCBmaWxlbmFtZSwgKiprd2FyZ3MgKToKKyAgaWYgZGF0YWJhc2U6CisgICAgIyBCZWFyIGluIG1pbmQgdGhhdCBjb21waWxhdGlvbl9pbmZvLmNvbXBpbGVyX2ZsYWdzXyBkb2VzIE5PVCByZXR1cm4gYQorICAgICMgcHl0aG9uIGxpc3QsIGJ1dCBhICJsaXN0LWxpa2UiIFN0cmluZ1ZlYyBvYmplY3QKKyAgICBjb21waWxhdGlvbl9pbmZvID0gR2V0Q29tcGlsYXRpb25JbmZvRm9yRmlsZSggZmlsZW5hbWUgKQorICAgIGlmIG5vdCBjb21waWxhdGlvbl9pbmZvOgorICAgICAgcmV0dXJuIE5vbmUKKworICAgIGZpbmFsX2ZsYWdzID0gTWFrZVJlbGF0aXZlUGF0aHNJbkZsYWdzQWJzb2x1dGUoCisgICAgICBjb21waWxhdGlvbl9pbmZvLmNvbXBpbGVyX2ZsYWdzXywKKyAgICAgIGNvbXBpbGF0aW9uX2luZm8uY29tcGlsZXJfd29ya2luZ19kaXJfICkKKyAgZWxzZToKKyAgICByZWxhdGl2ZV90byA9IERpcmVjdG9yeU9mVGhpc1NjcmlwdCgpCisgICAgZmluYWxfZmxhZ3MgPSBNYWtlUmVsYXRpdmVQYXRoc0luRmxhZ3NBYnNvbHV0ZSggZmxhZ3MsIHJlbGF0aXZlX3RvICkKKworICByZXR1cm4geworICAgICdmbGFncyc6IGZpbmFsX2ZsYWdzLAorICAgICdkb19jYWNoZSc6IFRydWUKKyAgfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvQVVUSE9SUyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjNGM4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0FVVEhPUlMKQEAgLTAsMCArMSw1NCBAQAorIyBUaGlzIGlzIHRoZSBvZmZpY2lhbCBsaXN0IG9mIGJlbmNobWFyayBhdXRob3JzIGZvciBjb3B5cmlnaHQgcHVycG9zZXMuCisjIFRoaXMgZmlsZSBpcyBkaXN0aW5jdCBmcm9tIHRoZSBDT05UUklCVVRPUlMgZmlsZXMuCisjIFNlZSB0aGUgbGF0dGVyIGZvciBhbiBleHBsYW5hdGlvbi4KKyMKKyMgTmFtZXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgZmlsZSBhczoKKyMJTmFtZSBvciBPcmdhbml6YXRpb24gPGVtYWlsIGFkZHJlc3M+CisjIFRoZSBlbWFpbCBhZGRyZXNzIGlzIG5vdCByZXF1aXJlZCBmb3Igb3JnYW5pemF0aW9ucy4KKyMKKyMgUGxlYXNlIGtlZXAgdGhlIGxpc3Qgc29ydGVkLgorCitBbGJlcnQgUHJldG9yaXVzIDxwcmV0b2FsYkBnbWFpbC5jb20+CitBbGV4IFN0ZWVsZSA8c3RlZWxlYWwxMjNAZ21haWwuY29tPgorQW5kcml5IEJlcmVzdG92c2t5eSA8YmVyZXN0b3Zza3l5QGdtYWlsLmNvbT4KK0FybmUgQmVlciA8YXJuZUB0d29iZWVyLmRlPgorQ2FydG8KK0NocmlzdG9waGVyIFNleW1vdXIgPGNocmlzLmouc2V5bW91ckBob3RtYWlsLmNvbT4KK0NvbGluIEJyYWxleSA8YnJhbGV5LmNvbGluQGdtYWlsLmNvbT4KK0RhbmllbCBIYXJ2ZXkgPGRhbmllbGhhcnZleTQ1OEBnbWFpbC5jb20+CitEYXZpZCBDb2V1cmpvbGx5IDxkYXZpZC5jb2V1cmpvbGx5QGxpcmlzLmNucnMuZnI+CitEZW5peiBFdnJlbmNpIDxkZW5pemV2cmVuY2lAZ21haWwuY29tPgorRGlyYWMgUmVzZWFyY2ggCitEb21pbmlrIEN6YXJub3RhIDxkb21pbmlrLmIuY3phcm5vdGFAZ21haWwuY29tPgorRXJpYyBCYWNrdXMgPGVyaWNfYmFja3VzQGFsdW0ubWl0LmVkdT4KK0VyaWMgRmlzZWxpZXIgPGVyaWNAZWZjcy5jYT4KK0V1Z2VuZSBaaHVrIDxldWdlbmUuemh1a0BnbWFpbC5jb20+CitFdmdlbnkgU2Fmcm9ub3YgPGRpdmlzaW9uNDk0QGdtYWlsLmNvbT4KK0ZlZGVyaWNvIEZpY2FyZWxsaSA8ZmVkZXJpY28uZmljYXJlbGxpQGdtYWlsLmNvbT4KK0ZlbGl4IEhvbWFubiA8bGludXhhdWRpb0BzaG93bGFib3IuZGU+CitHb29nbGUgSW5jLgorSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbgorSXNtYWVsIEppbWVuZXogTWFydGluZXogPGlzbWFlbC5qaW1lbmV6Lm1hcnRpbmV6QGdtYWlsLmNvbT4KK0plcm4tS3VhbiBMZW9uZyA8amVybmt1YW5AZ21haWwuY29tPgorSmlhblhpb25nIFpob3UgPHpob3VqaWFueGlvbmcyQGdtYWlsLmNvbT4KK0pvYW8gUGF1bG8gTWFnYWxoYWVzIDxqb2FvcHBtYWdhbGhhZXNAZ21haWwuY29tPgorSnVzc2kgS251dXR0aWxhIDxqdXNzaS5rbnV1dHRpbGFAZ21haWwuY29tPgorS2FpdG8gVWRhZ2F3YSA8dW1pcmVvbkBnbWFpbC5jb20+CitLaXNoYW4gS3VtYXIgPGt1bWFyLmtpc2hhbkBvdXRsb29rLmNvbT4KK0xlaSBYdSA8ZWRkeXh1QGdtYWlsLmNvbT4KK01hdHQgQ2xhcmtzb24gPG1hdHR5Y2xhcmtzb25AZ21haWwuY29tPgorTWF4aW0gVmFmaW4gPG1heHZhZmluQGdtYWlsLmNvbT4KK01vbmdvREIgSW5jLgorTmljayBIdXRjaGluc29uIDxuc2h1dGNoaW5zb25AZ21haWwuY29tPgorT2xla3NhbmRyIFNvY2hrYSA8c2FzaGEuc29jaGthQGdtYWlsLmNvbT4KK09yaSBMaXZuZWggPG9yaS5saXZuZWhAZ21haWwuY29tPgorUGF1bCBSZWRtb25kIDxwYXVsLnJlZG1vbmRAZ21haWwuY29tPgorUmFkb3NsYXYgWW92Y2hldiA8cmFkb3NsYXYudG1AZ21haWwuY29tPgorUm9tYW4gTGViZWRldiA8bGViZWRldi5yaUBnbWFpbC5jb20+CitTYXlhbiBCaGF0dGFjaGFyamVlIDxhZXJvLnNheWFuQGdtYWlsLmNvbT4KK1NodW8gQ2hlbiA8Y2hlbnNodW9AY2hlbnNodW8uY29tPgorU3RlaW5hciBILiBHdW5kZXJzb24gPHNndW5kZXJzb25AYmlnZm9vdC5jb20+CitTdHJpcGUsIEluYy4KK1lpeHVhbiBRaXUgPHlpeHVhbnFAZ21haWwuY29tPgorWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPgorWmJpZ25pZXcgU2tvd3JvbiA8emJ5Y2hzQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0JVSUxELmJhemVsIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvQlVJTEQuYmF6ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3YTAxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0JVSUxELmJhemVsCkBAIC0wLDAgKzEsNDQgQEAKK2xpY2Vuc2VzKFsibm90aWNlIl0pCisKK2NvbmZpZ19zZXR0aW5nKAorICAgIG5hbWUgPSAid2luZG93cyIsCisgICAgdmFsdWVzID0geworICAgICAgICAiY3B1IjogIng2NF93aW5kb3dzIiwKKyAgICB9LAorICAgIHZpc2liaWxpdHkgPSBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKykKKworbG9hZCgiQHJ1bGVzX2NjLy9jYzpkZWZzLmJ6bCIsICJjY19saWJyYXJ5IikKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gImJlbmNobWFyayIsCisgICAgc3JjcyA9IGdsb2IoCisgICAgICAgIFsKKyAgICAgICAgICAgICJzcmMvKi5jYyIsCisgICAgICAgICAgICAic3JjLyouaCIsCisgICAgICAgIF0sCisgICAgICAgIGV4Y2x1ZGUgPSBbInNyYy9iZW5jaG1hcmtfbWFpbi5jYyJdLAorICAgICksCisgICAgaGRycyA9IFsiaW5jbHVkZS9iZW5jaG1hcmsvYmVuY2htYXJrLmgiXSwKKyAgICBsaW5rb3B0cyA9IHNlbGVjdCh7CisgICAgICAgICI6d2luZG93cyI6IFsiLURFRkFVTFRMSUI6c2hsd2FwaS5saWIiXSwKKyAgICAgICAgIi8vY29uZGl0aW9uczpkZWZhdWx0IjogWyItcHRocmVhZCJdLAorICAgIH0pLAorICAgIHN0cmlwX2luY2x1ZGVfcHJlZml4ID0gImluY2x1ZGUiLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gImJlbmNobWFya19tYWluIiwKKyAgICBzcmNzID0gWyJzcmMvYmVuY2htYXJrX21haW4uY2MiXSwKKyAgICBoZHJzID0gWyJpbmNsdWRlL2JlbmNobWFyay9iZW5jaG1hcmsuaCJdLAorICAgIHN0cmlwX2luY2x1ZGVfcHJlZml4ID0gImluY2x1ZGUiLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKyAgICBkZXBzID0gWyI6YmVuY2htYXJrIl0sCispCisKK2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJiZW5jaG1hcmtfaW50ZXJuYWxfaGVhZGVycyIsCisgICAgaGRycyA9IGdsb2IoWyJzcmMvKi5oIl0pLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdGVzdDpfX3BrZ19fIl0sCispCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZmUxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI3NyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZCAoVkVSU0lPTiAzLjUuMSkKKworZm9yZWFjaChwCisgICAgQ01QMDA0OCAjIE9LIHRvIGNsZWFyIFBST0pFQ1RfVkVSU0lPTiBvbiBwcm9qZWN0KCkKKyAgICBDTVAwMDU0ICMgQ01ha2UgMy4xCisgICAgQ01QMDA1NiAjIGV4cG9ydCBFWEVfTElOS0VSX0ZMQUdTIHRvIHRyeV9ydW4KKyAgICBDTVAwMDU3ICMgU3VwcG9ydCBubyBpZigpIElOX0xJU1Qgb3BlcmF0b3IKKyAgICBDTVAwMDYzICMgSG9ub3IgdmlzaWJpbGl0eSBwcm9wZXJ0aWVzIGZvciBhbGwgdGFyZ2V0cworICAgICkKKyAgaWYoUE9MSUNZICR7cH0pCisgICAgY21ha2VfcG9saWN5KFNFVCAke3B9IE5FVykKKyAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCisKK3Byb2plY3QgKGJlbmNobWFyayBDWFgpCisKK29wdGlvbihCRU5DSE1BUktfRU5BQkxFX1RFU1RJTkcgIkVuYWJsZSB0ZXN0aW5nIG9mIHRoZSBiZW5jaG1hcmsgbGlicmFyeS4iIE9OKQorb3B0aW9uKEJFTkNITUFSS19FTkFCTEVfRVhDRVBUSU9OUyAiRW5hYmxlIHRoZSB1c2Ugb2YgZXhjZXB0aW9ucyBpbiB0aGUgYmVuY2htYXJrIGxpYnJhcnkuIiBPTikKK29wdGlvbihCRU5DSE1BUktfRU5BQkxFX0xUTyAiRW5hYmxlIGxpbmsgdGltZSBvcHRpbWlzYXRpb24gb2YgdGhlIGJlbmNobWFyayBsaWJyYXJ5LiIgT0ZGKQorb3B0aW9uKEJFTkNITUFSS19VU0VfTElCQ1hYICJCdWlsZCBhbmQgdGVzdCB1c2luZyBsaWJjKysgYXMgdGhlIHN0YW5kYXJkIGxpYnJhcnkuIiBPRkYpCitpZihOT1QgTVNWQykKKyAgb3B0aW9uKEJFTkNITUFSS19CVUlMRF8zMl9CSVRTICJCdWlsZCBhIDMyIGJpdCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiIgT0ZGKQorZWxzZSgpCisgIHNldChCRU5DSE1BUktfQlVJTERfMzJfQklUUyBPRkYgQ0FDSEUgQk9PTCAiQnVpbGQgYSAzMiBiaXQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSAtIHVuc3VwcG9ydGVkIHdoZW4gdXNpbmcgTVNWQykiIEZPUkNFKQorZW5kaWYoKQorb3B0aW9uKEJFTkNITUFSS19FTkFCTEVfSU5TVEFMTCAiRW5hYmxlIGluc3RhbGxhdGlvbiBvZiBiZW5jaG1hcmsuIChQcm9qZWN0cyBlbWJlZGRpbmcgYmVuY2htYXJrIG1heSB3YW50IHRvIHR1cm4gdGhpcyBPRkYuKSIgT04pCisKKyMgQWxsb3cgdW5tZXQgZGVwZW5kZW5jaWVzIHRvIGJlIG1ldCB1c2luZyBDTWFrZSdzIEV4dGVybmFsUHJvamVjdCBtZWNoYW5pY3MsIHdoaWNoCisjIG1heSByZXF1aXJlIGRvd25sb2FkaW5nIHRoZSBzb3VyY2UgY29kZS4KK29wdGlvbihCRU5DSE1BUktfRE9XTkxPQURfREVQRU5ERU5DSUVTICJBbGxvdyB0aGUgZG93bmxvYWRpbmcgYW5kIGluLXRyZWUgYnVpbGRpbmcgb2YgdW5tZXQgZGVwZW5kZW5jaWVzIiBPRkYpCisKKyMgVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBidWlsZGluZyBhbmQgcnVubmluZyB1bml0IHRlc3RzIHdoaWNoIGRlcGVuZCBvbiBndGVzdAorIyBpbiBjYXNlcyB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUgdG8gYnVpbGQgb3IgZmluZCBhIHZhbGlkIHZlcnNpb24gb2YgZ3Rlc3QuCitvcHRpb24oQkVOQ0hNQVJLX0VOQUJMRV9HVEVTVF9URVNUUyAiRW5hYmxlIGJ1aWxkaW5nIHRoZSB1bml0IHRlc3RzIHdoaWNoIGRlcGVuZCBvbiBndGVzdCIgT04pCisKK3NldChDTUFLRV9XSU5ET1dTX0VYUE9SVF9BTExfU1lNQk9MUyBPTikKK3NldChFTkFCTEVfQVNTRU1CTFlfVEVTVFNfREVGQVVMVCBPRkYpCitmdW5jdGlvbihzaG91bGRfZW5hYmxlX2Fzc2VtYmx5X3Rlc3RzKQorICBpZihDTUFLRV9CVUlMRF9UWVBFKQorICAgIHN0cmluZyhUT0xPV0VSICR7Q01BS0VfQlVJTERfVFlQRX0gQ01BS0VfQlVJTERfVFlQRV9MT1dFUikKKyAgICBpZiAoJHtDTUFLRV9CVUlMRF9UWVBFX0xPV0VSfSBNQVRDSEVTICJjb3ZlcmFnZSIpCisgICAgICAjIEZJWE1FOiBUaGUgLS1jb3ZlcmFnZSBmbGFnIG5lZWRzIHRvIGJlIHJlbW92ZWQgd2hlbiBidWlsZGluZyBhc3NlbWJseQorICAgICAgIyB0ZXN0cyBmb3IgdGhpcyB0byB3b3JrLgorICAgICAgcmV0dXJuKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgaWYgKE1TVkMpCisgICAgcmV0dXJuKCkKKyAgZWxzZWlmKE5PVCBDTUFLRV9TWVNURU1fUFJPQ0VTU09SIE1BVENIRVMgIng4Nl82NCIpCisgICAgcmV0dXJuKCkKKyAgZWxzZWlmKE5PVCBDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgIyBGSVhNRTogTWFrZSB0aGVzZSB3b3JrIG9uIDMyIGJpdCBidWlsZHMKKyAgICByZXR1cm4oKQorICBlbHNlaWYoQkVOQ0hNQVJLX0JVSUxEXzMyX0JJVFMpCisgICAgICMgRklYTUU6IE1ha2UgdGhlc2Ugd29yayBvbiAzMiBiaXQgYnVpbGRzCisgICAgcmV0dXJuKCkKKyAgZW5kaWYoKQorICBmaW5kX3Byb2dyYW0oTExWTV9GSUxFQ0hFQ0tfRVhFIEZpbGVDaGVjaykKKyAgaWYgKExMVk1fRklMRUNIRUNLX0VYRSkKKyAgICBzZXQoTExWTV9GSUxFQ0hFQ0tfRVhFICIke0xMVk1fRklMRUNIRUNLX0VYRX0iIENBQ0hFIFBBVEggImxsdm0gZmlsZWNoZWNrIiBGT1JDRSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiTExWTSBGaWxlQ2hlY2sgRm91bmQ6ICR7TExWTV9GSUxFQ0hFQ0tfRVhFfSIpCisgIGVsc2UoKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGYWlsZWQgdG8gZmluZCBMTFZNIEZpbGVDaGVjayIpCisgICAgcmV0dXJuKCkKKyAgZW5kaWYoKQorICBzZXQoRU5BQkxFX0FTU0VNQkxZX1RFU1RTX0RFRkFVTFQgT04gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorc2hvdWxkX2VuYWJsZV9hc3NlbWJseV90ZXN0cygpCisKKyMgVGhpcyBvcHRpb24gZGlzYWJsZXMgdGhlIGJ1aWxkaW5nIGFuZCBydW5uaW5nIG9mIHRoZSBhc3NlbWJseSB2ZXJpZmljYXRpb24gdGVzdHMKK29wdGlvbihCRU5DSE1BUktfRU5BQkxFX0FTU0VNQkxZX1RFU1RTICJFbmFibGUgYnVpbGRpbmcgYW5kIHJ1bm5pbmcgdGhlIGFzc2VtYmx5IHRlc3RzIgorICAgICR7RU5BQkxFX0FTU0VNQkxZX1RFU1RTX0RFRkFVTFR9KQorCisjIE1ha2Ugc3VyZSB3ZSBjYW4gaW1wb3J0IG91dCBDTWFrZSBmdW5jdGlvbnMKK2xpc3QoQVBQRU5EIENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvTW9kdWxlcyIpCitsaXN0KEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlIikKKworCisjIFJlYWQgdGhlIGdpdCB0YWdzIHRvIGRldGVybWluZSB0aGUgcHJvamVjdCB2ZXJzaW9uCitpbmNsdWRlKEdldEdpdFZlcnNpb24pCitnZXRfZ2l0X3ZlcnNpb24oR0lUX1ZFUlNJT04pCisKKyMgVGVsbCB0aGUgdXNlciB3aGF0IHZlcnNpb25zIHdlIGFyZSB1c2luZworc3RyaW5nKFJFR0VYIE1BVENIICJbMC05XStcXC5bMC05XStcXC5bMC05XSsiIFZFUlNJT04gJHtHSVRfVkVSU0lPTn0pCittZXNzYWdlKFNUQVRVUyAiVmVyc2lvbjogJHtWRVJTSU9OfSIpCisKKyMgVGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcmllcworc2V0KEdFTkVSSUNfTElCX1ZFUlNJT04gJHtWRVJTSU9OfSkKK3N0cmluZyhTVUJTVFJJTkcgJHtWRVJTSU9OfSAwIDEgR0VORVJJQ19MSUJfU09WRVJTSU9OKQorCisjIEltcG9ydCBvdXIgQ01ha2UgbW9kdWxlcworaW5jbHVkZShDaGVja0NYWENvbXBpbGVyRmxhZykKK2luY2x1ZGUoQWRkQ1hYQ29tcGlsZXJGbGFnKQoraW5jbHVkZShDWFhGZWF0dXJlQ2hlY2spCisKK2lmIChCRU5DSE1BUktfQlVJTERfMzJfQklUUykKKyAgYWRkX3JlcXVpcmVkX2N4eF9jb21waWxlcl9mbGFnKC1tMzIpCitlbmRpZigpCisKK2lmIChNU1ZDKQorICAjIFR1cm4gY29tcGlsZXIgd2FybmluZ3MgdXAgdG8gMTEKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlstL11XWzEtNF0iICIiIENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IikKKyAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC9XNCIpCisgIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTKQorCisgIGlmIChOT1QgQkVOQ0hNQVJLX0VOQUJMRV9FWENFUFRJT05TKQorICAgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtRUhzLSkKKyAgICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLUVIYS0pCisgICAgYWRkX2RlZmluaXRpb25zKC1EX0hBU19FWENFUFRJT05TPTApCisgIGVuZGlmKCkKKyAgIyBMaW5rIHRpbWUgb3B0aW1pc2F0aW9uCisgIGlmIChCRU5DSE1BUktfRU5BQkxFX0xUTykKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IC9HTCIpCisgICAgc2V0KENNQUtFX1NUQVRJQ19MSU5LRVJfRkxBR1NfUkVMRUFTRSAiJHtDTUFLRV9TVEFUSUNfTElOS0VSX0ZMQUdTX1JFTEVBU0V9IC9MVENHIikKKyAgICBzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU19SRUxFQVNFICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1NfUkVMRUFTRX0gL0xUQ0ciKQorICAgIHNldChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU19SRUxFQVNFfSAvTFRDRyIpCisKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GT30gL0dMIikKKyAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiWy0vXUlOQ1JFTUVOVEFMIiAiL0lOQ1JFTUVOVEFMOk5PIiBDTUFLRV9TVEFUSUNfTElOS0VSX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX1NUQVRJQ19MSU5LRVJfRkxBR1NfUkVMV0lUSERFQklORk99IikKKyAgICBzZXQoQ01BS0VfU1RBVElDX0xJTktFUl9GTEFHU19SRUxXSVRIREVCSU5GTyAiJHtDTUFLRV9TVEFUSUNfTElOS0VSX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSAvTFRDRyIpCisgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlstL11JTkNSRU1FTlRBTCIgIi9JTkNSRU1FTlRBTDpOTyIgQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU19SRUxXSVRIREVCSU5GTyAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSIpCisgICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1NfUkVMV0lUSERFQklORk8gIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU19SRUxXSVRIREVCSU5GT30gL0xUQ0ciKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJbLS9dSU5DUkVNRU5UQUwiICIvSU5DUkVNRU5UQUw6Tk8iIENNQUtFX0VYRV9MSU5LRVJfRkxBR1NfUkVMV0lUSERFQklORk8gIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU19SRUxXSVRIREVCSU5GT30iKQorICAgIHNldChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX0VYRV9MSU5LRVJfRkxBR1NfUkVMV0lUSERFQklORk99IC9MVENHIikKKworICAgIHNldChDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTCAiJHtDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTH0gL0dMIikKKyAgICBzZXQoQ01BS0VfU1RBVElDX0xJTktFUl9GTEFHU19NSU5TSVpFUkVMICIke0NNQUtFX1NUQVRJQ19MSU5LRVJfRkxBR1NfTUlOU0laRVJFTH0gL0xUQ0ciKQorICAgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTX01JTlNJWkVSRUwgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU19NSU5TSVpFUkVMfSAvTFRDRyIpCisgICAgc2V0KENNQUtFX0VYRV9MSU5LRVJfRkxBR1NfTUlOU0laRVJFTCAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX01JTlNJWkVSRUx9IC9MVENHIikKKyAgZW5kaWYoKQorZWxzZSgpCisgICMgVHJ5IGFuZCBlbmFibGUgQysrMTEuIERvbid0IHVzZSBDKysxNCBiZWNhdXNlIGl0IGRvZXNuJ3Qgd29yayBpbiBzb21lCisgICMgY29uZmlndXJhdGlvbnMuCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtc3RkPWMrKzExKQorICBpZiAoTk9UIEhBVkVfQ1hYX0ZMQUdfU1REX0NYWDExKQorICAgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtc3RkPWMrKzB4KQorICBlbmRpZigpCisKKyAgIyBUdXJuIGNvbXBpbGVyIHdhcm5pbmdzIHVwIHRvIDExCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtV2FsbCkKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1XZXh0cmEpCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtV3NoYWRvdykKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1XZXJyb3IgUkVMRUFTRSkKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1XZXJyb3IgUkVMV0lUSERFQklORk8pCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtV2Vycm9yIE1JTlNJWkVSRUwpCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtcGVkYW50aWMpCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtcGVkYW50aWMtZXJyb3JzKQorICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLVdzaG9ydGVuLTY0LXRvLTMyKQorICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLWZzdHJpY3QtYWxpYXNpbmcpCisgICMgRGlzYWJsZSB3YXJuaW5ncyByZWdhcmRpbmcgZGVwcmVjYXRlZCBwYXJ0cyBvZiB0aGUgbGlicmFyeSB3aGlsZSBidWlsZGluZworICAjIGFuZCB0ZXN0aW5nIHRob3NlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5LgorICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLVduby1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucykKKyAgaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiSW50ZWwiKQorICAgICMgSW50ZWwgc2lsZW50bHkgaWdub3JlcyAnLVduby1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucycsCisgICAgIyB3YXJuaW5nIG5vLiAxNzg2IG11c3QgYmUgZXhwbGljaXRseSBkaXNhYmxlZC4KKyAgICAjIFNlZSAjNjMxIGZvciByYXRpb25hbGUuCisgICAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC13ZDE3ODYpCisgIGVuZGlmKCkKKyAgIyBEaXNhYmxlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGZvciByZWxlYXNlIGJ1aWxkcyAod2hlbiAtV2Vycm9yIGlzIGVuYWJsZWQpLgorICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLVduby1kZXByZWNhdGVkIFJFTEVBU0UpCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtV25vLWRlcHJlY2F0ZWQgUkVMV0lUSERFQklORk8pCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtV25vLWRlcHJlY2F0ZWQgTUlOU0laRVJFTCkKKyAgaWYgKE5PVCBCRU5DSE1BUktfRU5BQkxFX0VYQ0VQVElPTlMpCisgICAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1mbm8tZXhjZXB0aW9ucykKKyAgZW5kaWYoKQorCisgIGlmIChIQVZFX0NYWF9GTEFHX0ZTVFJJQ1RfQUxJQVNJTkcpCisgICAgaWYgKE5PVCBDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkludGVsIikgI0lDQzE3dTI6IE1hbnkgZmFsc2UgcG9zaXRpdmVzIGZvciBXc3RyaWN0LWFsaWFzaW5nCisgICAgICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLVdzdHJpY3QtYWxpYXNpbmcpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgICMgSUNDMTd1Mjogb3ZlcmxvYWRlZCB2aXJ0dWFsIGZ1bmN0aW9uICJiZW5jaG1hcms6OkZpeHR1cmU6OlNldFVwIiBpcyBvbmx5IHBhcnRpYWxseSBvdmVycmlkZGVuCisgICMgKGJlY2F1c2Ugb2YgZGVwcmVjYXRlZCBvdmVybG9hZCkKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC13ZDY1NCkKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1XdGhyZWFkLXNhZmV0eSkKKyAgaWYgKEhBVkVfQ1hYX0ZMQUdfV1RIUkVBRF9TQUZFVFkpCisgICAgY3h4X2ZlYXR1cmVfY2hlY2soVEhSRUFEX1NBRkVUWV9BVFRSSUJVVEVTKQorICBlbmRpZigpCisKKyAgIyBPbiBtb3N0IFVOSVggbGlrZSBwbGF0Zm9ybXMgZysrIGFuZCBjbGFuZysrIGRlZmluZSBfR05VX1NPVVJDRSBhcyBhCisgICMgcHJlZGVmaW5lZCBtYWNybywgd2hpY2ggdHVybnMgb24gYWxsIG9mIHRoZSB3b25kZXJmdWwgbGliYyBleHRlbnNpb25zLgorICAjIEhvd2V2ZXIgZysrIGRvZXNuJ3QgZG8gdGhpcyBpbiBDeWd3aW4gc28gd2UgaGF2ZSB0byBkZWZpbmUgaXQgb3Vyc2VsZnMKKyAgIyBzaW5jZSB3ZSBkZXBlbmQgb24gR05VL1BPU0lYL0JTRCBleHRlbnNpb25zLgorICBpZiAoQ1lHV0lOKQorICAgIGFkZF9kZWZpbml0aW9ucygtRF9HTlVfU09VUkNFPTEpCisgIGVuZGlmKCkKKworICBpZiAoUU5YTlRPKQorICAgIGFkZF9kZWZpbml0aW9ucygtRF9RTlhfU09VUkNFKQorICBlbmRpZigpCisKKyAgIyBMaW5rIHRpbWUgb3B0aW1pc2F0aW9uCisgIGlmIChCRU5DSE1BUktfRU5BQkxFX0xUTykKKyAgICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLWZsdG8pCisgICAgaWYgKCIke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0iIFNUUkVRVUFMICJHTlUiKQorICAgICAgZmluZF9wcm9ncmFtKEdDQ19BUiBnY2MtYXIpCisgICAgICBpZiAoR0NDX0FSKQorICAgICAgICBzZXQoQ01BS0VfQVIgJHtHQ0NfQVJ9KQorICAgICAgZW5kaWYoKQorICAgICAgZmluZF9wcm9ncmFtKEdDQ19SQU5MSUIgZ2NjLXJhbmxpYikKKyAgICAgIGlmIChHQ0NfUkFOTElCKQorICAgICAgICBzZXQoQ01BS0VfUkFOTElCICR7R0NDX1JBTkxJQn0pCisgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCIke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0iIE1BVENIRVMgIkNsYW5nIikKKyAgICAgIGluY2x1ZGUobGx2bS10b29sY2hhaW4pCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgIyBDb3ZlcmFnZSBidWlsZCB0eXBlCisgIHNldChCRU5DSE1BUktfQ1hYX0ZMQUdTX0NPVkVSQUdFICIke0NNQUtFX0NYWF9GTEFHU19ERUJVR30iCisgICAgQ0FDSEUgU1RSSU5HICJGbGFncyB1c2VkIGJ5IHRoZSBDKysgY29tcGlsZXIgZHVyaW5nIGNvdmVyYWdlIGJ1aWxkcy4iCisgICAgRk9SQ0UpCisgIHNldChCRU5DSE1BUktfRVhFX0xJTktFUl9GTEFHU19DT1ZFUkFHRSAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX0RFQlVHfSIKKyAgICBDQUNIRSBTVFJJTkcgIkZsYWdzIHVzZWQgZm9yIGxpbmtpbmcgYmluYXJpZXMgZHVyaW5nIGNvdmVyYWdlIGJ1aWxkcy4iCisgICAgRk9SQ0UpCisgIHNldChCRU5DSE1BUktfU0hBUkVEX0xJTktFUl9GTEFHU19DT1ZFUkFHRSAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTX0RFQlVHfSIKKyAgICBDQUNIRSBTVFJJTkcgIkZsYWdzIHVzZWQgYnkgdGhlIHNoYXJlZCBsaWJyYXJpZXMgbGlua2VyIGR1cmluZyBjb3ZlcmFnZSBidWlsZHMuIgorICAgIEZPUkNFKQorICBtYXJrX2FzX2FkdmFuY2VkKAorICAgIEJFTkNITUFSS19DWFhfRkxBR1NfQ09WRVJBR0UKKyAgICBCRU5DSE1BUktfRVhFX0xJTktFUl9GTEFHU19DT1ZFUkFHRQorICAgIEJFTkNITUFSS19TSEFSRURfTElOS0VSX0ZMQUdTX0NPVkVSQUdFKQorICBzZXQoQ01BS0VfQlVJTERfVFlQRSAiJHtDTUFLRV9CVUlMRF9UWVBFfSIgQ0FDSEUgU1RSSU5HCisgICAgIkNob29zZSB0aGUgdHlwZSBvZiBidWlsZCwgb3B0aW9ucyBhcmU6IE5vbmUgRGVidWcgUmVsZWFzZSBSZWxXaXRoRGViSW5mbyBNaW5TaXplUmVsIENvdmVyYWdlLiIpCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtLWNvdmVyYWdlIENPVkVSQUdFKQorZW5kaWYoKQorCitpZiAoQkVOQ0hNQVJLX1VTRV9MSUJDWFgpCisgIGlmICgiJHtDTUFLRV9DWFhfQ09NUElMRVJfSUR9IiBNQVRDSEVTICJDbGFuZyIpCisgICAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1zdGRsaWI9bGliYysrKQorICBlbHNlaWYgKCIke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0iIFNUUkVRVUFMICJHTlUiIE9SCisgICAgICAgICAgIiR7Q01BS0VfQ1hYX0NPTVBJTEVSX0lEfSIgU1RSRVFVQUwgIkludGVsIikKKyAgICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLW5vc3RkaW5jKyspCisgICAgbWVzc2FnZShXQVJOSU5HICJsaWJjKysgaGVhZGVyIHBhdGggbXVzdCBiZSBtYW51YWxseSBzcGVjaWZpZWQgdXNpbmcgQ01BS0VfQ1hYX0ZMQUdTIikKKyAgICAjIEFkZGluZyAtbm9kZWZhdWx0bGlicyBkaXJlY3RseSB0byBDTUFLRV88VFlQRT5fTElOS0VSX0ZMQUdTIHdpbGwgYnJlYWsKKyAgICAjIGNvbmZpZ3VyYXRpb24gY2hlY2tzIHN1Y2ggYXMgJ2ZpbmRfcGFja2FnZShUaHJlYWRzKScKKyAgICBsaXN0KEFQUEVORCBCRU5DSE1BUktfQ1hYX0xJTktFUl9GTEFHUyAtbm9kZWZhdWx0bGlicykKKyAgICAjIC1sYysrIGNhbm5vdCBiZSBhZGRlZCBkaXJlY3RseSB0byBDTUFLRV88VFlQRT5fTElOS0VSX0ZMQUdTIGJlY2F1c2UKKyAgICAjIGxpbmtlciBmbGFncyBhcHBlYXIgYmVmb3JlIGFsbCBsaW5rZXIgaW5wdXRzIGFuZCAtbGMrKyBtdXN0IGFwcGVhciBhZnRlci4KKyAgICBsaXN0KEFQUEVORCBCRU5DSE1BUktfQ1hYX0xJQlJBUklFUyBjKyspCisgIGVsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIi1EQkVOQ0hNQVJLX1VTRV9MSUJDWFg6Qk9PTD1PTiBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb21waWxlciIpCisgIGVuZGlmKCkKK2VuZGlmKEJFTkNITUFSS19VU0VfTElCQ1hYKQorCisjIEMrKyBmZWF0dXJlIGNoZWNrcworIyBEZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSB0byB1c2UKK2N4eF9mZWF0dXJlX2NoZWNrKFNURF9SRUdFWCkKK2N4eF9mZWF0dXJlX2NoZWNrKEdOVV9QT1NJWF9SRUdFWCkKK2N4eF9mZWF0dXJlX2NoZWNrKFBPU0lYX1JFR0VYKQoraWYoTk9UIEhBVkVfU1REX1JFR0VYIEFORCBOT1QgSEFWRV9HTlVfUE9TSVhfUkVHRVggQU5EIE5PVCBIQVZFX1BPU0lYX1JFR0VYKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYmFja2VuZCIpCitlbmRpZigpCitpZiAoTk9UIEJFTkNITUFSS19FTkFCTEVfRVhDRVBUSU9OUyBBTkQgSEFWRV9TVERfUkVHRVgKKyAgICAgICAgQU5EIE5PVCBIQVZFX0dOVV9QT1NJWF9SRUdFWCBBTkQgTk9UIEhBVkVfUE9TSVhfUkVHRVgpCisgIG1lc3NhZ2UoV0FSTklORyAiVXNpbmcgc3RkOjpyZWdleCB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCIpCitlbmRpZigpCitjeHhfZmVhdHVyZV9jaGVjayhTVEVBRFlfQ0xPQ0spCisjIEVuc3VyZSB3ZSBoYXZlIHB0aHJlYWRzCitzZXQoVEhSRUFEU19QUkVGRVJfUFRIUkVBRF9GTEFHIE9OKQorZmluZF9wYWNrYWdlKFRocmVhZHMgUkVRVUlSRUQpCisKKyMgU2V0IHVwIGRpcmVjdG9yaWVzCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7UFJPSkVDVF9TT1VSQ0VfRElSfS9pbmNsdWRlKQorCisjIEJ1aWxkIHRoZSB0YXJnZXRzCithZGRfc3ViZGlyZWN0b3J5KHNyYykKKworaWYgKEJFTkNITUFSS19FTkFCTEVfVEVTVElORykKKyAgZW5hYmxlX3Rlc3RpbmcoKQorICBpZiAoQkVOQ0hNQVJLX0VOQUJMRV9HVEVTVF9URVNUUyBBTkQKKyAgICAgIE5PVCAoVEFSR0VUIGd0ZXN0IEFORCBUQVJHRVQgZ3Rlc3RfbWFpbiBBTkQKKyAgICAgICAgICAgVEFSR0VUIGdtb2NrIEFORCBUQVJHRVQgZ21vY2tfbWFpbikpCisgICAgaW5jbHVkZShHb29nbGVUZXN0KQorICBlbmRpZigpCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0NPTlRSSUJVVElORy5tZCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0NPTlRSSUJVVElORy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RlNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvQ09OVFJJQlVUSU5HLm1kCkBAIC0wLDAgKzEsNTggQEAKKyMgSG93IHRvIGNvbnRyaWJ1dGUgIworCitXZSdkIGxvdmUgdG8gYWNjZXB0IHlvdXIgcGF0Y2hlcyBhbmQgY29udHJpYnV0aW9ucyB0byB0aGlzIHByb2plY3QuICBUaGVyZSBhcmUKK2EganVzdCBhIGZldyBzbWFsbCBndWlkZWxpbmVzIHlvdSBuZWVkIHRvIGZvbGxvdy4KKworCisjIyBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAjIworCitDb250cmlidXRpb25zIHRvIGFueSBHb29nbGUgcHJvamVjdCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgQ29udHJpYnV0b3IKK0xpY2Vuc2UgQWdyZWVtZW50LiAgVGhpcyBpcyBub3QgYSBjb3B5cmlnaHQgKiphc3NpZ25tZW50KiosIGl0IHNpbXBseSBnaXZlcworR29vZ2xlIHBlcm1pc3Npb24gdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgeW91ciBjb250cmlidXRpb25zIGFzIHBhcnQgb2YgdGhlCitwcm9qZWN0LgorCisgICogSWYgeW91IGFyZSBhbiBpbmRpdmlkdWFsIHdyaXRpbmcgb3JpZ2luYWwgc291cmNlIGNvZGUgYW5kIHlvdSdyZSBzdXJlIHlvdQorICAgIG93biB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5LCB0aGVuIHlvdSdsbCBuZWVkIHRvIHNpZ24gYW4gW2luZGl2aWR1YWwKKyAgICBDTEFdW10uCisKKyAgKiBJZiB5b3Ugd29yayBmb3IgYSBjb21wYW55IHRoYXQgd2FudHMgdG8gYWxsb3cgeW91IHRvIGNvbnRyaWJ1dGUgeW91ciB3b3JrLAorICAgIHRoZW4geW91J2xsIG5lZWQgdG8gc2lnbiBhIFtjb3Jwb3JhdGUgQ0xBXVtdLgorCitZb3UgZ2VuZXJhbGx5IG9ubHkgbmVlZCB0byBzdWJtaXQgYSBDTEEgb25jZSwgc28gaWYgeW91J3ZlIGFscmVhZHkgc3VibWl0dGVkCitvbmUgKGV2ZW4gaWYgaXQgd2FzIGZvciBhIGRpZmZlcmVudCBwcm9qZWN0KSwgeW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gZG8gaXQKK2FnYWluLgorCitbaW5kaXZpZHVhbCBDTEFdOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9vcGVuLXNvdXJjZS9jbGEvaW5kaXZpZHVhbAorW2NvcnBvcmF0ZSBDTEFdOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9vcGVuLXNvdXJjZS9jbGEvY29ycG9yYXRlCisKK09uY2UgeW91ciBDTEEgaXMgc3VibWl0dGVkIChvciBpZiB5b3UgYWxyZWFkeSBzdWJtaXR0ZWQgb25lIGZvcgorYW5vdGhlciBHb29nbGUgcHJvamVjdCksIG1ha2UgYSBjb21taXQgYWRkaW5nIHlvdXJzZWxmIHRvIHRoZQorW0FVVEhPUlNdW10gYW5kIFtDT05UUklCVVRPUlNdW10gZmlsZXMuIFRoaXMgY29tbWl0IGNhbiBiZSBwYXJ0CitvZiB5b3VyIGZpcnN0IFtwdWxsIHJlcXVlc3RdW10uCisKK1tBVVRIT1JTXTogQVVUSE9SUworW0NPTlRSSUJVVE9SU106IENPTlRSSUJVVE9SUworCisKKyMjIFN1Ym1pdHRpbmcgYSBwYXRjaCAjIworCisgIDEuIEl0J3MgZ2VuZXJhbGx5IGJlc3QgdG8gc3RhcnQgYnkgb3BlbmluZyBhIG5ldyBpc3N1ZSBkZXNjcmliaW5nIHRoZSBidWcgb3IKKyAgICAgZmVhdHVyZSB5b3UncmUgaW50ZW5kaW5nIHRvIGZpeC4gIEV2ZW4gaWYgeW91IHRoaW5rIGl0J3MgcmVsYXRpdmVseSBtaW5vciwKKyAgICAgaXQncyBoZWxwZnVsIHRvIGtub3cgd2hhdCBwZW9wbGUgYXJlIHdvcmtpbmcgb24uICBNZW50aW9uIGluIHRoZSBpbml0aWFsCisgICAgIGlzc3VlIHRoYXQgeW91IGFyZSBwbGFubmluZyB0byB3b3JrIG9uIHRoYXQgYnVnIG9yIGZlYXR1cmUgc28gdGhhdCBpdCBjYW4KKyAgICAgYmUgYXNzaWduZWQgdG8geW91LgorCisgIDEuIEZvbGxvdyB0aGUgbm9ybWFsIHByb2Nlc3Mgb2YgW2ZvcmtpbmddW10gdGhlIHByb2plY3QsIGFuZCBzZXR1cCBhIG5ldworICAgICBicmFuY2ggdG8gd29yayBpbi4gIEl0J3MgaW1wb3J0YW50IHRoYXQgZWFjaCBncm91cCBvZiBjaGFuZ2VzIGJlIGRvbmUgaW4KKyAgICAgc2VwYXJhdGUgYnJhbmNoZXMgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYSBwdWxsIHJlcXVlc3Qgb25seSBpbmNsdWRlcyB0aGUKKyAgICAgY29tbWl0cyByZWxhdGVkIHRvIHRoYXQgYnVnIG9yIGZlYXR1cmUuCisKKyAgMS4gRG8geW91ciBiZXN0IHRvIGhhdmUgW3dlbGwtZm9ybWVkIGNvbW1pdCBtZXNzYWdlc11bXSBmb3IgZWFjaCBjaGFuZ2UuCisgICAgIFRoaXMgcHJvdmlkZXMgY29uc2lzdGVuY3kgdGhyb3VnaG91dCB0aGUgcHJvamVjdCwgYW5kIGVuc3VyZXMgdGhhdCBjb21taXQKKyAgICAgbWVzc2FnZXMgYXJlIGFibGUgdG8gYmUgZm9ybWF0dGVkIHByb3Blcmx5IGJ5IHZhcmlvdXMgZ2l0IHRvb2xzLgorCisgIDEuIEZpbmFsbHksIHB1c2ggdGhlIGNvbW1pdHMgdG8geW91ciBmb3JrIGFuZCBzdWJtaXQgYSBbcHVsbCByZXF1ZXN0XVtdLgorCitbZm9ya2luZ106IGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2ZvcmstYS1yZXBvCitbd2VsbC1mb3JtZWQgY29tbWl0IG1lc3NhZ2VzXTogaHR0cDovL3RiYWdnZXJ5LmNvbS8yMDA4LzA0LzE5L2Etbm90ZS1hYm91dC1naXQtY29tbWl0LW1lc3NhZ2VzLmh0bWwKK1twdWxsIHJlcXVlc3RdOiBodHRwczovL2hlbHAuZ2l0aHViLmNvbS9hcnRpY2xlcy9jcmVhdGluZy1hLXB1bGwtcmVxdWVzdApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvQ09OVFJJQlVUT1JTIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvQ09OVFJJQlVUT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjRhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9DT05UUklCVVRPUlMKQEAgLTAsMCArMSw3NiBAQAorIyBQZW9wbGUgd2hvIGhhdmUgYWdyZWVkIHRvIG9uZSBvZiB0aGUgQ0xBcyBhbmQgY2FuIGNvbnRyaWJ1dGUgcGF0Y2hlcy4KKyMgVGhlIEFVVEhPUlMgZmlsZSBsaXN0cyB0aGUgY29weXJpZ2h0IGhvbGRlcnM7IHRoaXMgZmlsZQorIyBsaXN0cyBwZW9wbGUuICBGb3IgZXhhbXBsZSwgR29vZ2xlIGVtcGxveWVlcyBhcmUgbGlzdGVkIGhlcmUKKyMgYnV0IG5vdCBpbiBBVVRIT1JTLCBiZWNhdXNlIEdvb2dsZSBob2xkcyB0aGUgY29weXJpZ2h0LgorIworIyBOYW1lcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhpcyBmaWxlIG9ubHkgYWZ0ZXIgdmVyaWZ5aW5nIHRoYXQKKyMgdGhlIGluZGl2aWR1YWwgb3IgdGhlIGluZGl2aWR1YWwncyBvcmdhbml6YXRpb24gaGFzIGFncmVlZCB0bworIyB0aGUgYXBwcm9wcmlhdGUgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQsIGZvdW5kIGhlcmU6CisjCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL29wZW4tc291cmNlL2NsYS9pbmRpdmlkdWFsCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL29wZW4tc291cmNlL2NsYS9jb3Jwb3JhdGUKKyMKKyMgVGhlIGFncmVlbWVudCBmb3IgaW5kaXZpZHVhbHMgY2FuIGJlIGZpbGxlZCBvdXQgb24gdGhlIHdlYi4KKyMKKyMgV2hlbiBhZGRpbmcgSiBSYW5kb20gQ29udHJpYnV0b3IncyBuYW1lIHRvIHRoaXMgZmlsZSwKKyMgZWl0aGVyIEoncyBuYW1lIG9yIEoncyBvcmdhbml6YXRpb24ncyBuYW1lIHNob3VsZCBiZQorIyBhZGRlZCB0byB0aGUgQVVUSE9SUyBmaWxlLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKKyMgaW5kaXZpZHVhbCBvciBjb3Jwb3JhdGUgQ0xBIHdhcyB1c2VkLgorIworIyBOYW1lcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhpcyBmaWxlIGFzOgorIyAgICAgTmFtZSA8ZW1haWwgYWRkcmVzcz4KKyMKKyMgUGxlYXNlIGtlZXAgdGhlIGxpc3Qgc29ydGVkLgorCitBbGJlcnQgUHJldG9yaXVzIDxwcmV0b2FsYkBnbWFpbC5jb20+CitBbGV4IFN0ZWVsZSA8c3RlZWxhbDEyM0BnbWFpbC5jb20+CitBbmRyaXkgQmVyZXN0b3Zza3l5IDxiZXJlc3RvdnNreXlAZ21haWwuY29tPgorQXJuZSBCZWVyIDxhcm5lQHR3b2JlZXIuZGU+CitCaWxseSBSb2JlcnQgTydOZWFsIElJSSA8YmlsbHkub25lYWxAZ21haWwuY29tPiA8YmlvbkBtaWNyb3NvZnQuY29tPgorQ2hyaXMgS2VubmVsbHkgPGNrZW5uZWxseUBnb29nbGUuY29tPiA8Y2tlbm5lbGx5QGNrZW5uZWxseS5jb20+CitDaHJpc3RvcGhlciBTZXltb3VyIDxjaHJpcy5qLnNleW1vdXJAaG90bWFpbC5jb20+CitDb2xpbiBCcmFsZXkgPGJyYWxleS5jb2xpbkBnbWFpbC5jb20+CitDeXJpbGxlIEZhdWNoZXV4IDxjeXJpbGxlLmZhdWNoZXV4QGdtYWlsLmNvbT4KK0RhbmllbCBIYXJ2ZXkgPGRhbmllbGhhcnZleTQ1OEBnbWFpbC5jb20+CitEYXZpZCBDb2V1cmpvbGx5IDxkYXZpZC5jb2V1cmpvbGx5QGxpcmlzLmNucnMuZnI+CitEZW5peiBFdnJlbmNpIDxkZW5pemV2cmVuY2lAZ21haWwuY29tPgorRG9taW5pYyBIYW1vbiA8ZG1hQHN0cmlweXNvY2suY29tPiA8ZG9taW5pY0Bnb29nbGUuY29tPgorRG9taW5payBDemFybm90YSA8ZG9taW5pay5iLmN6YXJub3RhQGdtYWlsLmNvbT4KK0VyaWMgQmFja3VzIDxlcmljX2JhY2t1c0BhbHVtLm1pdC5lZHU+CitFcmljIEZpc2VsaWVyIDxlcmljQGVmY3MuY2E+CitFdWdlbmUgWmh1ayA8ZXVnZW5lLnpodWtAZ21haWwuY29tPgorRXZnZW55IFNhZnJvbm92IDxkaXZpc2lvbjQ5NEBnbWFpbC5jb20+CitGZWRlcmljbyBGaWNhcmVsbGkgPGZlZGVyaWNvLmZpY2FyZWxsaUBnbWFpbC5jb20+CitGZWxpeCBIb21hbm4gPGxpbnV4YXVkaW9Ac2hvd2xhYm9yLmRlPgorR2VvZmZyZXkgTWFydGluLU5vYmxlIDxnY21uQGdvb2dsZS5jb20+IDxnbW5nZW9mZnJleUBnbWFpbC5jb20+CitIYW5uZXMgSGF1c3dlZGVsbCA8aDJAZnNmZS5vcmc+CitJc21hZWwgSmltZW5leiBNYXJ0aW5leiA8aXNtYWVsLmppbWVuZXoubWFydGluZXpAZ21haWwuY29tPgorSmVybi1LdWFuIExlb25nIDxqZXJua3VhbkBnbWFpbC5jb20+CitKaWFuWGlvbmcgWmhvdSA8emhvdWppYW54aW9uZzJAZ21haWwuY29tPgorSm9hbyBQYXVsbyBNYWdhbGhhZXMgPGpvYW9wcG1hZ2FsaGFlc0BnbWFpbC5jb20+CitKb2huIE1pbGxpa2luIDxqbWlsbGlraW5Ac3RyaXBlLmNvbT4KK0p1c3NpIEtudXV0dGlsYSA8anVzc2kua251dXR0aWxhQGdtYWlsLmNvbT4KK0thaSBXb2xmIDxrYWkud29sZkBnbWFpbC5jb20+CitLYWl0byBVZGFnYXdhIDx1bWlyZW9uQGdtYWlsLmNvbT4KK0tpc2hhbiBLdW1hciA8a3VtYXIua2lzaGFuQG91dGxvb2suY29tPgorTGVpIFh1IDxlZGR5eHVAZ21haWwuY29tPgorTWF0dCBDbGFya3NvbiA8bWF0dHljbGFya3NvbkBnbWFpbC5jb20+CitNYXhpbSBWYWZpbiA8bWF4dmFmaW5AZ21haWwuY29tPgorTmljayBIdXRjaGluc29uIDxuc2h1dGNoaW5zb25AZ21haWwuY29tPgorT2xla3NhbmRyIFNvY2hrYSA8c2FzaGEuc29jaGthQGdtYWlsLmNvbT4KK09yaSBMaXZuZWggPG9yaS5saXZuZWhAZ21haWwuY29tPgorUGFzY2FsIExlcm95IDxwaGxAZ29vZ2xlLmNvbT4KK1BhdWwgUmVkbW9uZCA8cGF1bC5yZWRtb25kQGdtYWlsLmNvbT4KK1BpZXJyZSBQaGFuZXVmIDxwcGhhbmV1ZkBnb29nbGUuY29tPgorUmFkb3NsYXYgWW92Y2hldiA8cmFkb3NsYXYudG1AZ21haWwuY29tPgorUmF1bCBNYXJpbiA8cm1yb2RyaWd1ZXpAY2FydG9kYi5jb20+CitSYXkgR2xvdmVyIDxyYXkuZ2xvdmVyQHVrLmlibS5jb20+CitSb2JlcnQgR3VvIDxyb2JlcnQuZ3VvQG1vbmdvZGIuY29tPgorUm9tYW4gTGViZWRldiA8bGViZWRldi5yaUBnbWFpbC5jb20+CitTYXlhbiBCaGF0dGFjaGFyamVlIDxhZXJvLnNheWFuQGdtYWlsLmNvbT4KK1NodW8gQ2hlbiA8Y2hlbnNodW9AY2hlbnNodW8uY29tPgorVG9iaWFzIFVsdmfDpXJkIDx0b2JpYXMudWx2Z2FyZEBkaXJhYy5zZT4KK1RvbSBNYWRhbXMgPHRvbS5lai5tYWRhbXNAZ21haWwuY29tPiA8dG1hZGFtc0Bnb29nbGUuY29tPgorWWl4dWFuIFFpdSA8eWl4dWFucUBnbWFpbC5jb20+CitZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+CitaYmlnbmlldyBTa293cm9uIDx6YnljaHNAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvTElDRU5TRSBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL0xJQ0VOU0UKQEAgLTAsMCArMSwyMDIgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3MmFiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL1JFQURNRS5tZApAQCAtMCwwICsxLDEyNzAgQEAKKyMgQmVuY2htYXJrCisKK1shW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2dvb2dsZS9iZW5jaG1hcmsuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvZ29vZ2xlL2JlbmNobWFyaykKK1shW0J1aWxkIHN0YXR1c10oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vYXBpL3Byb2plY3RzL3N0YXR1cy91MHFzeXA3dDF0azdjcHhzL2JyYW5jaC9tYXN0ZXI/c3ZnPXRydWUpXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L2dvb2dsZS9iZW5jaG1hcmsvYnJhbmNoL21hc3RlcikKK1shW0NvdmVyYWdlIFN0YXR1c10oaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vcmVwb3MvZ29vZ2xlL2JlbmNobWFyay9iYWRnZS5zdmcpXShodHRwczovL2NvdmVyYWxscy5pby9yL2dvb2dsZS9iZW5jaG1hcmspCitbIVtzbGFja2luXShodHRwczovL3NsYWNraW4taXF0ZnFucHp4ZC5ub3cuc2gvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9zbGFja2luLWlxdGZxbnB6eGQubm93LnNoLykKKworQSBsaWJyYXJ5IHRvIGJlbmNobWFyayBjb2RlIHNuaXBwZXRzLCBzaW1pbGFyIHRvIHVuaXQgdGVzdHMuIEV4YW1wbGU6CisKK2BgYGMrKworI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKworc3RhdGljIHZvaWQgQk1fU29tZUZ1bmN0aW9uKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIC8vIFBlcmZvcm0gc2V0dXAgaGVyZQorICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgLy8gVGhpcyBjb2RlIGdldHMgdGltZWQKKyAgICBTb21lRnVuY3Rpb24oKTsKKyAgfQorfQorLy8gUmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIGFzIGEgYmVuY2htYXJrCitCRU5DSE1BUksoQk1fU29tZUZ1bmN0aW9uKTsKKy8vIFJ1biB0aGUgYmVuY2htYXJrCitCRU5DSE1BUktfTUFJTigpOworYGBgCisKK1RvIGdldCBzdGFydGVkLCBzZWUgW1JlcXVpcmVtZW50c10oI3JlcXVpcmVtZW50cykgYW5kCitbSW5zdGFsbGF0aW9uXSgjaW5zdGFsbGF0aW9uKS4gU2VlIFtVc2FnZV0oI3VzYWdlKSBmb3IgYSBmdWxsIGV4YW1wbGUgYW5kIHRoZQorW1VzZXIgR3VpZGVdKCN1c2VyLWd1aWRlKSBmb3IgYSBtb3JlIGNvbXByZWhlbnNpdmUgZmVhdHVyZSBvdmVydmlldy4KKworSXQgbWF5IGFsc28gaGVscCB0byByZWFkIHRoZSBbR29vZ2xlIFRlc3QgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0L2Jsb2IvbWFzdGVyL2dvb2dsZXRlc3QvZG9jcy9wcmltZXIubWQpCithcyBzb21lIG9mIHRoZSBzdHJ1Y3R1cmFsIGFzcGVjdHMgb2YgdGhlIEFQSXMgYXJlIHNpbWlsYXIuCisKKyMjIyBSZXNvdXJjZXMKKworW0Rpc2N1c3Npb24gZ3JvdXBdKGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZC9mb3J1bS9iZW5jaG1hcmstZGlzY3VzcykKKworSVJDIGNoYW5uZWw6IFtmcmVlbm9kZV0oaHR0cHM6Ly9mcmVlbm9kZS5uZXQpICNnb29nbGViZW5jaG1hcmsKKworW0FkZGl0aW9uYWwgVG9vbGluZyBEb2N1bWVudGF0aW9uXShkb2NzL3Rvb2xzLm1kKQorCitbQXNzZW1ibHkgVGVzdGluZyBEb2N1bWVudGF0aW9uXShkb2NzL0Fzc2VtYmx5VGVzdHMubWQpCisKKyMjIFJlcXVpcmVtZW50cworCitUaGUgbGlicmFyeSBjYW4gYmUgdXNlZCB3aXRoIEMrKzAzLiBIb3dldmVyLCBpdCByZXF1aXJlcyBDKysxMSB0byBidWlsZCwKK2luY2x1ZGluZyBjb21waWxlciBhbmQgc3RhbmRhcmQgbGlicmFyeSBzdXBwb3J0LgorCitUaGUgZm9sbG93aW5nIG1pbmltdW0gdmVyc2lvbnMgYXJlIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5OgorCisqIEdDQyA0LjgKKyogQ2xhbmcgMy40CisqIFZpc3VhbCBTdHVkaW8gMTQgMjAxNQorKiBJbnRlbCAyMDE1IFVwZGF0ZSAxCisKK1NlZSBbUGxhdGZvcm0tU3BlY2lmaWMgQnVpbGQgSW5zdHJ1Y3Rpb25zXSgjcGxhdGZvcm0tc3BlY2lmaWMtYnVpbGQtaW5zdHJ1Y3Rpb25zKS4KKworIyMgSW5zdGFsbGF0aW9uCisKK1RoaXMgZGVzY3JpYmVzIHRoZSBpbnN0YWxsYXRpb24gcHJvY2VzcyB1c2luZyBjbWFrZS4gQXMgcHJlLXJlcXVpc2l0ZXMsIHlvdSdsbAorbmVlZCBnaXQgYW5kIGNtYWtlIGluc3RhbGxlZC4KKworX1NlZSBbZGVwZW5kZW5jaWVzLm1kXShkZXBlbmRlbmNpZXMubWQpIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIHN1cHBvcnRlZAordmVyc2lvbnMgb2YgYnVpbGQgdG9vbHMuXworCitgYGBiYXNoCisjIENoZWNrIG91dCB0aGUgbGlicmFyeS4KKyQgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYmVuY2htYXJrLmdpdAorIyBCZW5jaG1hcmsgcmVxdWlyZXMgR29vZ2xlIFRlc3QgYXMgYSBkZXBlbmRlbmN5LiBBZGQgdGhlIHNvdXJjZSB0cmVlIGFzIGEgc3ViZGlyZWN0b3J5LgorJCBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0LmdpdCBiZW5jaG1hcmsvZ29vZ2xldGVzdAorIyBHbyB0byB0aGUgbGlicmFyeSByb290IGRpcmVjdG9yeQorJCBjZCBiZW5jaG1hcmsKKyMgTWFrZSBhIGJ1aWxkIGRpcmVjdG9yeSB0byBwbGFjZSB0aGUgYnVpbGQgb3V0cHV0LgorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZAorIyBHZW5lcmF0ZSBhIE1ha2VmaWxlIHdpdGggY21ha2UuCisjIFVzZSBjbWFrZSAtRyA8Z2VuZXJhdG9yPiB0byBnZW5lcmF0ZSBhIGRpZmZlcmVudCBmaWxlIHR5cGUuCiskIGNtYWtlIC4uLworIyBCdWlsZCB0aGUgbGlicmFyeS4KKyMgVXNlIG1ha2UgLWo8bnVtYmVyX29mX3BhcmFsbGVsX2pvYnM+IHRvIHNwZWVkIHVwIHRoZSBidWlsZCBwcm9jZXNzLCBlLmcuIG1ha2UgLWo4IC4KKyQgbWFrZQorYGBgCitUaGlzIGJ1aWxkcyB0aGUgYGJlbmNobWFya2AgYW5kIGBiZW5jaG1hcmtfbWFpbmAgbGlicmFyaWVzIGFuZCB0ZXN0cy4KK09uIGEgdW5peCBzeXN0ZW0sIHRoZSBidWlsZCBkaXJlY3Rvcnkgc2hvdWxkIG5vdyBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKK2BgYAorL2JlbmNobWFyaworICAvYnVpbGQKKyAgICAvc3JjCisgICAgICAvbGliYmVuY2htYXJrLmEKKyAgICAgIC9saWJiZW5jaG1hcmtfbWFpbi5hCisgICAgL3Rlc3QKKyAgICAgIC4uLgorYGBgCisKK05leHQsIHlvdSBjYW4gcnVuIHRoZSB0ZXN0cyB0byBjaGVjayB0aGUgYnVpbGQuCisKK2BgYGJhc2gKKyQgbWFrZSB0ZXN0CitgYGAKKworSWYgeW91IHdhbnQgdG8gaW5zdGFsbCB0aGUgbGlicmFyeSBnbG9iYWxseSwgYWxzbyBydW46CisKK2BgYAorc3VkbyBtYWtlIGluc3RhbGwKK2BgYAorCitOb3RlIHRoYXQgR29vZ2xlIEJlbmNobWFyayByZXF1aXJlcyBHb29nbGUgVGVzdCB0byBidWlsZCBhbmQgcnVuIHRoZSB0ZXN0cy4gVGhpcworZGVwZW5kZW5jeSBjYW4gYmUgcHJvdmlkZWQgdHdvIHdheXM6CisKKyogQ2hlY2tvdXQgdGhlIEdvb2dsZSBUZXN0IHNvdXJjZXMgaW50byBgYmVuY2htYXJrL2dvb2dsZXRlc3RgIGFzIGFib3ZlLgorKiBPdGhlcndpc2UsIGlmIGAtREJFTkNITUFSS19ET1dOTE9BRF9ERVBFTkRFTkNJRVM9T05gIGlzIHNwZWNpZmllZCBkdXJpbmcKKyAgY29uZmlndXJhdGlvbiwgdGhlIGxpYnJhcnkgd2lsbCBhdXRvbWF0aWNhbGx5IGRvd25sb2FkIGFuZCBidWlsZCBhbnkgcmVxdWlyZWQKKyAgZGVwZW5kZW5jaWVzLgorCitJZiB5b3UgZG8gbm90IHdpc2ggdG8gYnVpbGQgYW5kIHJ1biB0aGUgdGVzdHMsIGFkZCBgLURCRU5DSE1BUktfRU5BQkxFX0dURVNUX1RFU1RTPU9GRmAKK3RvIGBDTUFLRV9BUkdTYC4KKworIyMjIERlYnVnIHZzIFJlbGVhc2UKKworQnkgZGVmYXVsdCwgYmVuY2htYXJrIGJ1aWxkcyBhcyBhIGRlYnVnIGxpYnJhcnkuIFlvdSB3aWxsIHNlZSBhIHdhcm5pbmcgaW4gdGhlCitvdXRwdXQgd2hlbiB0aGlzIGlzIHRoZSBjYXNlLiBUbyBidWlsZCBpdCBhcyBhIHJlbGVhc2UgbGlicmFyeSBpbnN0ZWFkLCB1c2U6CisKK2BgYAorY21ha2UgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKK2BgYAorCitUbyBlbmFibGUgbGluay10aW1lIG9wdGltaXNhdGlvbiwgdXNlCisKK2BgYAorY21ha2UgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UgLURCRU5DSE1BUktfRU5BQkxFX0xUTz10cnVlCitgYGAKKworSWYgeW91IGFyZSB1c2luZyBnY2MsIHlvdSBtaWdodCBuZWVkIHRvIHNldCBgR0NDX0FSYCBhbmQgYEdDQ19SQU5MSUJgIGNtYWtlCitjYWNoZSB2YXJpYWJsZXMsIGlmIGF1dG9kZXRlY3Rpb24gZmFpbHMuCisKK0lmIHlvdSBhcmUgdXNpbmcgY2xhbmcsIHlvdSBtYXkgbmVlZCB0byBzZXQgYExMVk1BUl9FWEVDVVRBQkxFYCwKK2BMTFZNTk1fRVhFQ1VUQUJMRWAgYW5kIGBMTFZNUkFOTElCX0VYRUNVVEFCTEVgIGNtYWtlIGNhY2hlIHZhcmlhYmxlcy4KKworCisjIyMgU3RhYmxlIGFuZCBFeHBlcmltZW50YWwgTGlicmFyeSBWZXJzaW9ucworCitUaGUgbWFpbiBicmFuY2ggY29udGFpbnMgdGhlIGxhdGVzdCBzdGFibGUgdmVyc2lvbiBvZiB0aGUgYmVuY2htYXJraW5nIGxpYnJhcnk7Cit0aGUgQVBJIG9mIHdoaWNoIGNhbiBiZSBjb25zaWRlcmVkIGxhcmdlbHkgc3RhYmxlLCB3aXRoIHNvdXJjZSBicmVha2luZyBjaGFuZ2VzCitiZWluZyBtYWRlIG9ubHkgdXBvbiB0aGUgcmVsZWFzZSBvZiBhIG5ldyBtYWpvciB2ZXJzaW9uLgorCitOZXdlciwgZXhwZXJpbWVudGFsLCBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQgYW5kIHRlc3RlZCBvbiB0aGUKK1tgdjJgIGJyYW5jaF0oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9iZW5jaG1hcmsvdHJlZS92MikuIFVzZXJzIHdobyB3aXNoCit0byB1c2UsIHRlc3QsIGFuZCBwcm92aWRlIGZlZWRiYWNrIG9uIHRoZSBuZXcgZmVhdHVyZXMgYXJlIGVuY291cmFnZWQgdG8gdHJ5Cit0aGlzIGJyYW5jaC4gSG93ZXZlciwgdGhpcyBicmFuY2ggcHJvdmlkZXMgbm8gc3RhYmlsaXR5IGd1YXJhbnRlZXMgYW5kIHJlc2VydmVzCit0aGUgcmlnaHQgdG8gY2hhbmdlIGFuZCBicmVhayB0aGUgQVBJIGF0IGFueSB0aW1lLgorCisjIyBVc2FnZQorCisjIyMgQmFzaWMgdXNhZ2UKKworRGVmaW5lIGEgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyB0aGUgY29kZSB0byBtZWFzdXJlLCByZWdpc3RlciBpdCBhcyBhIGJlbmNobWFyaworZnVuY3Rpb24gdXNpbmcgdGhlIGBCRU5DSE1BUktgIG1hY3JvLCBhbmQgZW5zdXJlIGFuIGFwcHJvcHJpYXRlIGBtYWluYCBmdW5jdGlvbgoraXMgYXZhaWxhYmxlOgorCitgYGBjKysKKyNpbmNsdWRlIDxiZW5jaG1hcmsvYmVuY2htYXJrLmg+CisKK3N0YXRpYyB2b2lkIEJNX1N0cmluZ0NyZWF0aW9uKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpCisgICAgc3RkOjpzdHJpbmcgZW1wdHlfc3RyaW5nOworfQorLy8gUmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIGFzIGEgYmVuY2htYXJrCitCRU5DSE1BUksoQk1fU3RyaW5nQ3JlYXRpb24pOworCisvLyBEZWZpbmUgYW5vdGhlciBiZW5jaG1hcmsKK3N0YXRpYyB2b2lkIEJNX1N0cmluZ0NvcHkoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RkOjpzdHJpbmcgeCA9ICJoZWxsbyI7CisgIGZvciAoYXV0byBfIDogc3RhdGUpCisgICAgc3RkOjpzdHJpbmcgY29weSh4KTsKK30KK0JFTkNITUFSSyhCTV9TdHJpbmdDb3B5KTsKKworQkVOQ0hNQVJLX01BSU4oKTsKK2BgYAorCitUbyBydW4gdGhlIGJlbmNobWFyaywgY29tcGlsZSBhbmQgbGluayBhZ2FpbnN0IHRoZSBgYmVuY2htYXJrYCBsaWJyYXJ5CisobGliYmVuY2htYXJrLmEvLnNvKS4gSWYgeW91IGZvbGxvd2VkIHRoZSBidWlsZCBzdGVwcyBhYm92ZSwgdGhpcworbGlicmFyeSB3aWxsIGJlIHVuZGVyIHRoZSBidWlsZCBkaXJlY3RvcnkgeW91IGNyZWF0ZWQuCisKK2BgYGJhc2gKKyMgRXhhbXBsZSBvbiBsaW51eCBhZnRlciBydW5uaW5nIHRoZSBidWlsZCBzdGVwcyBhYm92ZS4gQXNzdW1lcyB0aGUKKyMgYGJlbmNobWFya2AgYW5kIGBidWlsZGAgZGlyZWN0b3JpZXMgYXJlIHVuZGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyQgZysrIG15YmVuY2htYXJrLmNjIC1zdGQ9YysrMTEgLWlzeXN0ZW0gYmVuY2htYXJrL2luY2x1ZGUgXAorICAtTGJlbmNobWFyay9idWlsZC9zcmMgLWxiZW5jaG1hcmsgLWxwdGhyZWFkIC1vIG15YmVuY2htYXJrCitgYGAKKworQWx0ZXJuYXRpdmVseSwgbGluayBhZ2FpbnN0IHRoZSBgYmVuY2htYXJrX21haW5gIGxpYnJhcnkgYW5kIHJlbW92ZQorYEJFTkNITUFSS19NQUlOKCk7YCBhYm92ZSB0byBnZXQgdGhlIHNhbWUgYmVoYXZpb3IuCisKK1RoZSBjb21waWxlZCBleGVjdXRhYmxlIHdpbGwgcnVuIGFsbCBiZW5jaG1hcmtzIGJ5IGRlZmF1bHQuIFBhc3MgdGhlIGAtLWhlbHBgCitmbGFnIGZvciBvcHRpb24gaW5mb3JtYXRpb24gb3Igc2VlIHRoZSBndWlkZSBiZWxvdy4KKworIyMgUGxhdGZvcm0gU3BlY2lmaWMgQnVpbGQgSW5zdHJ1Y3Rpb25zCisKKyMjIyBCdWlsZGluZyB3aXRoIEdDQworCitXaGVuIHRoZSBsaWJyYXJ5IGlzIGJ1aWx0IHVzaW5nIEdDQyBpdCBpcyBuZWNlc3NhcnkgdG8gbGluayB3aXRoIHRoZSBwdGhyZWFkCitsaWJyYXJ5IGR1ZSB0byBob3cgR0NDIGltcGxlbWVudHMgYHN0ZDo6dGhyZWFkYC4gRmFpbGluZyB0byBsaW5rIHRvIHB0aHJlYWQgd2lsbAorbGVhZCB0byBydW50aW1lIGV4Y2VwdGlvbnMgKHVubGVzcyB5b3UncmUgdXNpbmcgbGliYysrKSwgbm90IGxpbmtlciBlcnJvcnMuIFNlZQorW2lzc3VlICM2N10oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9iZW5jaG1hcmsvaXNzdWVzLzY3KSBmb3IgbW9yZSBkZXRhaWxzLiBZb3UKK2NhbiBsaW5rIHRvIHB0aHJlYWQgYnkgYWRkaW5nIGAtcHRocmVhZGAgdG8geW91ciBsaW5rZXIgY29tbWFuZC4gTm90ZSwgeW91IGNhbgorYWxzbyB1c2UgYC1scHRocmVhZGAsIGJ1dCB0aGVyZSBhcmUgcG90ZW50aWFsIGlzc3VlcyB3aXRoIG9yZGVyaW5nIG9mIGNvbW1hbmQKK2xpbmUgcGFyYW1ldGVycyBpZiB5b3UgdXNlIHRoYXQuCisKKyMjIyBCdWlsZGluZyB3aXRoIFZpc3VhbCBTdHVkaW8gMjAxNSBvciAyMDE3CisKK1RoZSBgc2hsd2FwaWAgbGlicmFyeSAoYC1sc2hsd2FwaWApIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgYSBjYWxsIHRvIGBDUFVJbmZvYCB3aGljaCByZWFkcyB0aGUgcmVnaXN0cnkuIEVpdGhlciBhZGQgYHNobHdhcGkubGliYCB1bmRlciBgWyBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgPiBMaW5rZXIgPiBJbnB1dCBdYCwgb3IgdXNlIHRoZSBmb2xsb3dpbmc6CisKK2BgYAorLy8gQWx0ZXJuYXRpdmVseSwgY2FuIGFkZCBsaWJyYXJpZXMgdXNpbmcgbGlua2VyIG9wdGlvbnMuCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIGNvbW1lbnQgKCBsaWIsICJTaGx3YXBpLmxpYiIgKQorI2lmZGVmIF9ERUJVRworI3ByYWdtYSBjb21tZW50ICggbGliLCAiYmVuY2htYXJrZC5saWIiICkKKyNlbHNlCisjcHJhZ21hIGNvbW1lbnQgKCBsaWIsICJiZW5jaG1hcmsubGliIiApCisjZW5kaWYKKyNlbmRpZgorYGBgCisKK0NhbiBhbHNvIHVzZSB0aGUgZ3JhcGhpY2FsIHZlcnNpb24gb2YgQ01ha2U6CisqIE9wZW4gYENNYWtlIEdVSWAuCisqIFVuZGVyIGBXaGVyZSB0byBidWlsZCB0aGUgYmluYXJpZXNgLCBzYW1lIHBhdGggYXMgc291cmNlIHBsdXMgYGJ1aWxkYC4KKyogVW5kZXIgYENNQUtFX0lOU1RBTExfUFJFRklYYCwgc2FtZSBwYXRoIGFzIHNvdXJjZSBwbHVzIGBpbnN0YWxsYC4KKyogQ2xpY2sgYENvbmZpZ3VyZWAsIGBHZW5lcmF0ZWAsIGBPcGVuIFByb2plY3RgLgorKiBJZiBidWlsZCBmYWlscywgdHJ5IGRlbGV0aW5nIGVudGlyZSBkaXJlY3RvcnkgYW5kIHN0YXJ0aW5nIGFnYWluLCBvciB1bnRpY2tpbmcgb3B0aW9ucyB0byBidWlsZCBsZXNzLgorCisjIyMgQnVpbGRpbmcgd2l0aCBJbnRlbCAyMDE1IFVwZGF0ZSAxIG9yIEludGVsIFN5c3RlbSBTdHVkaW8gVXBkYXRlIDQKKworU2VlIGluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgd2l0aCBWaXN1YWwgU3R1ZGlvLiBPbmNlIGJ1aWx0LCByaWdodCBjbGljayBvbiB0aGUgc29sdXRpb24gYW5kIGNoYW5nZSB0aGUgYnVpbGQgdG8gSW50ZWwuCisKKyMjIyBCdWlsZGluZyBvbiBTb2xhcmlzCisKK0lmIHlvdSdyZSBydW5uaW5nIGJlbmNobWFya3Mgb24gc29sYXJpcywgeW91J2xsIHdhbnQgdGhlIGtzdGF0IGxpYnJhcnkgbGlua2VkIGluCit0b28gKGAtbGtzdGF0YCkuCisKKyMjIFVzZXIgR3VpZGUKKworIyMjIENvbW1hbmQgTGluZQorCitbT3V0cHV0IEZvcm1hdHNdKCNvdXRwdXQtZm9ybWF0cykKKworW091dHB1dCBGaWxlc10oI291dHB1dC1maWxlcykKKworW1J1bm5pbmcgQmVuY2htYXJrc10oI3J1bm5pbmctYmVuY2htYXJrcykKKworW1J1bm5pbmcgYSBTdWJzZXQgb2YgQmVuY2htYXJrc10oI3J1bm5pbmctYS1zdWJzZXQtb2YtYmVuY2htYXJrcykKKworW1Jlc3VsdCBDb21wYXJpc29uXSgjcmVzdWx0LWNvbXBhcmlzb24pCisKKyMjIyBMaWJyYXJ5CisKK1tSdW50aW1lIGFuZCBSZXBvcnRpbmcgQ29uc2lkZXJhdGlvbnNdKCNydW50aW1lLWFuZC1yZXBvcnRpbmctY29uc2lkZXJhdGlvbnMpCisKK1tQYXNzaW5nIEFyZ3VtZW50c10oI3Bhc3NpbmctYXJndW1lbnRzKQorCitbQ2FsY3VsYXRpbmcgQXN5bXB0b3RpYyBDb21wbGV4aXR5XSgjYXN5bXB0b3RpYy1jb21wbGV4aXR5KQorCitbVGVtcGxhdGVkIEJlbmNobWFya3NdKCN0ZW1wbGF0ZWQtYmVuY2htYXJrcykKKworW0ZpeHR1cmVzXSgjZml4dHVyZXMpCisKK1tDdXN0b20gQ291bnRlcnNdKCNjdXN0b20tY291bnRlcnMpCisKK1tNdWx0aXRocmVhZGVkIEJlbmNobWFya3NdKCNtdWx0aXRocmVhZGVkLWJlbmNobWFya3MpCisKK1tDUFUgVGltZXJzXSgjY3B1LXRpbWVycykKKworW01hbnVhbCBUaW1pbmddKCNtYW51YWwtdGltaW5nKQorCitbU2V0dGluZyB0aGUgVGltZSBVbml0XSgjc2V0dGluZy10aGUtdGltZS11bml0KQorCitbUHJldmVudGluZyBPcHRpbWl6YXRpb25dKCNwcmV2ZW50aW5nLW9wdGltaXphdGlvbikKKworW1JlcG9ydGluZyBTdGF0aXN0aWNzXSgjcmVwb3J0aW5nLXN0YXRpc3RpY3MpCisKK1tDdXN0b20gU3RhdGlzdGljc10oI2N1c3RvbS1zdGF0aXN0aWNzKQorCitbVXNpbmcgUmVnaXN0ZXJCZW5jaG1hcmtdKCN1c2luZy1yZWdpc3Rlci1iZW5jaG1hcmspCisKK1tFeGl0aW5nIHdpdGggYW4gRXJyb3JdKCNleGl0aW5nLXdpdGgtYW4tZXJyb3IpCisKK1tBIEZhc3RlciBLZWVwUnVubmluZyBMb29wXSgjYS1mYXN0ZXIta2VlcC1ydW5uaW5nLWxvb3ApCisKK1tEaXNhYmxpbmcgQ1BVIEZyZXF1ZW5jeSBTY2FsaW5nXSgjZGlzYWJsaW5nLWNwdS1mcmVxdWVuY3ktc2NhbGluZykKKworCis8YSBuYW1lPSJvdXRwdXQtZm9ybWF0cyIgLz4KKworIyMjIE91dHB1dCBGb3JtYXRzCisKK1RoZSBsaWJyYXJ5IHN1cHBvcnRzIG11bHRpcGxlIG91dHB1dCBmb3JtYXRzLiBVc2UgdGhlCitgLS1iZW5jaG1hcmtfZm9ybWF0PTxjb25zb2xlfGpzb258Y3N2PmAgZmxhZyAob3Igc2V0IHRoZQorYEJFTkNITUFSS19GT1JNQVQ9PGNvbnNvbGV8anNvbnxjc3Y+YCBlbnZpcm9ubWVudCB2YXJpYWJsZSkgdG8gc2V0Cit0aGUgZm9ybWF0IHR5cGUuIGBjb25zb2xlYCBpcyB0aGUgZGVmYXVsdCBmb3JtYXQuCisKK1RoZSBDb25zb2xlIGZvcm1hdCBpcyBpbnRlbmRlZCB0byBiZSBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4gQnkgZGVmYXVsdAordGhlIGZvcm1hdCBnZW5lcmF0ZXMgY29sb3Igb3V0cHV0LiBDb250ZXh0IGlzIG91dHB1dCBvbiBzdGRlcnIgYW5kIHRoZQordGFidWxhciBkYXRhIG9uIHN0ZG91dC4gRXhhbXBsZSB0YWJ1bGFyIG91dHB1dCBsb29rcyBsaWtlOgorCitgYGAKK0JlbmNobWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lKG5zKSAgICBDUFUobnMpIEl0ZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JNX1NldEluc2VydC8xMDI0LzEgICAgICAgICAgICAgICAgICAgICAgICAyODkyOCAgICAgIDI5MzQ5ICAgICAgMjM4NTMgIDEzMy4wOTdrQi9zICAgMzMuMjc0MmsgaXRlbXMvcworQk1fU2V0SW5zZXJ0LzEwMjQvOCAgICAgICAgICAgICAgICAgICAgICAgIDMyMDY1ICAgICAgMzI5MTMgICAgICAyMTM3NSAgOTQ5LjQ4N2tCL3MgICAyMzcuMzcyayBpdGVtcy9zCitCTV9TZXRJbnNlcnQvMTAyNC8xMCAgICAgICAgICAgICAgICAgICAgICAgMzMxNTcgICAgICAzMzY0OCAgICAgIDIxNDMxICAxLjEzMzY5TUIvcyAgIDI5MC4yMjVrIGl0ZW1zL3MKK2BgYAorCitUaGUgSlNPTiBmb3JtYXQgb3V0cHV0cyBodW1hbiByZWFkYWJsZSBqc29uIHNwbGl0IGludG8gdHdvIHRvcCBsZXZlbCBhdHRyaWJ1dGVzLgorVGhlIGBjb250ZXh0YCBhdHRyaWJ1dGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJ1biBpbiBnZW5lcmFsLCBpbmNsdWRpbmcKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBDUFUgYW5kIHRoZSBkYXRlLgorVGhlIGBiZW5jaG1hcmtzYCBhdHRyaWJ1dGUgY29udGFpbnMgYSBsaXN0IG9mIGV2ZXJ5IGJlbmNobWFyayBydW4uIEV4YW1wbGUganNvbgorb3V0cHV0IGxvb2tzIGxpa2U6CisKK2BgYGpzb24KK3sKKyAgImNvbnRleHQiOiB7CisgICAgImRhdGUiOiAiMjAxNS8wMy8xNy0xODo0MDoyNSIsCisgICAgIm51bV9jcHVzIjogNDAsCisgICAgIm1oel9wZXJfY3B1IjogMjgwMSwKKyAgICAiY3B1X3NjYWxpbmdfZW5hYmxlZCI6IGZhbHNlLAorICAgICJidWlsZF90eXBlIjogImRlYnVnIgorICB9LAorICAiYmVuY2htYXJrcyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV9TZXRJbnNlcnQvMTAyNC8xIiwKKyAgICAgICJpdGVyYXRpb25zIjogOTQ4NzcsCisgICAgICAicmVhbF90aW1lIjogMjkyNzUsCisgICAgICAiY3B1X3RpbWUiOiAyOTgzNiwKKyAgICAgICJieXRlc19wZXJfc2Vjb25kIjogMTM0MDY2LAorICAgICAgIml0ZW1zX3Blcl9zZWNvbmQiOiAzMzUxNgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fU2V0SW5zZXJ0LzEwMjQvOCIsCisgICAgICAiaXRlcmF0aW9ucyI6IDIxNjA5LAorICAgICAgInJlYWxfdGltZSI6IDMyMzE3LAorICAgICAgImNwdV90aW1lIjogMzI0MjksCisgICAgICAiYnl0ZXNfcGVyX3NlY29uZCI6IDk4Njc3MCwKKyAgICAgICJpdGVtc19wZXJfc2Vjb25kIjogMjQ2NjkzCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV9TZXRJbnNlcnQvMTAyNC8xMCIsCisgICAgICAiaXRlcmF0aW9ucyI6IDIxMzkzLAorICAgICAgInJlYWxfdGltZSI6IDMyNzI0LAorICAgICAgImNwdV90aW1lIjogMzMzNTUsCisgICAgICAiYnl0ZXNfcGVyX3NlY29uZCI6IDExOTkyMjYsCisgICAgICAiaXRlbXNfcGVyX3NlY29uZCI6IDI5OTgwNworICAgIH0KKyAgXQorfQorYGBgCisKK1RoZSBDU1YgZm9ybWF0IG91dHB1dHMgY29tbWEtc2VwYXJhdGVkIHZhbHVlcy4gVGhlIGBjb250ZXh0YCBpcyBvdXRwdXQgb24gc3RkZXJyCithbmQgdGhlIENTViBpdHNlbGYgb24gc3Rkb3V0LiBFeGFtcGxlIENTViBvdXRwdXQgbG9va3MgbGlrZToKKworYGBgCituYW1lLGl0ZXJhdGlvbnMscmVhbF90aW1lLGNwdV90aW1lLGJ5dGVzX3Blcl9zZWNvbmQsaXRlbXNfcGVyX3NlY29uZCxsYWJlbAorIkJNX1NldEluc2VydC8xMDI0LzEiLDY1NDY1LDE3ODkwLjcsODQwNy40NSw0NzU3NjgsMTE4OTQyLAorIkJNX1NldEluc2VydC8xMDI0LzgiLDExNjYwNiwxODgxMC4xLDk3NjYuNjQsMy4yNzY0NmUrMDYsODE5MTE1LAorIkJNX1NldEluc2VydC8xMDI0LzEwIiwxMDYzNjUsMTcyMzguNCw4NDIxLjUzLDQuNzQ5NzNlKzA2LDEuMTg3NDNlKzA2LAorYGBgCisKKzxhIG5hbWU9Im91dHB1dC1maWxlcyIgLz4KKworIyMjIE91dHB1dCBGaWxlcworCitXcml0ZSBiZW5jaG1hcmsgcmVzdWx0cyB0byBhIGZpbGUgd2l0aCB0aGUgYC0tYmVuY2htYXJrX291dD08ZmlsZW5hbWU+YCBvcHRpb24KKyhvciBzZXQgYEJFTkNITUFSS19PVVRgKS4gU3BlY2lmeSB0aGUgb3V0cHV0IGZvcm1hdCB3aXRoCitgLS1iZW5jaG1hcmtfb3V0X2Zvcm1hdD17anNvbnxjb25zb2xlfGNzdn1gIChvciBzZXQKK2BCRU5DSE1BUktfT1VUX0ZPUk1BVD17anNvbnxjb25zb2xlfGNzdn1gKS4gTm90ZSB0aGF0IHNwZWNpZnlpbmcKK2AtLWJlbmNobWFya19vdXRgIGRvZXMgbm90IHN1cHByZXNzIHRoZSBjb25zb2xlIG91dHB1dC4KKworPGEgbmFtZT0icnVubmluZy1iZW5jaG1hcmtzIiAvPgorCisjIyMgUnVubmluZyBCZW5jaG1hcmtzCisKK0JlbmNobWFya3MgYXJlIGV4ZWN1dGVkIGJ5IHJ1bm5pbmcgdGhlIHByb2R1Y2VkIGJpbmFyaWVzLiBCZW5jaG1hcmtzIGJpbmFyaWVzLAorYnkgZGVmYXVsdCwgYWNjZXB0IG9wdGlvbnMgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGVpdGhlciB0aHJvdWdoIHRoZWlyIGNvbW1hbmQKK2xpbmUgaW50ZXJmYWNlIG9yIGJ5IHNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBleGVjdXRpb24uIEZvciBldmVyeQorYC0tb3B0aW9uX2ZsYWc9PHZhbHVlPmAgQ0xJIHN3aXRjaCwgYSBjb3JyZXNwb25kaW5nIGVudmlyb25tZW50IHZhcmlhYmxlCitgT1BUSU9OX0ZMQUc9PHZhbHVlPmAgZXhpc3QgYW5kIGlzIHVzZWQgYXMgZGVmYXVsdCBpZiBzZXQgKENMSSBzd2l0Y2hlcyBhbHdheXMKKyBwcmV2YWlscykuIEEgY29tcGxldGUgbGlzdCBvZiBDTEkgb3B0aW9ucyBpcyBhdmFpbGFibGUgcnVubmluZyBiZW5jaG1hcmtzCisgd2l0aCB0aGUgYC0taGVscGAgc3dpdGNoLgorCis8YSBuYW1lPSJydW5uaW5nLWEtc3Vic2V0LW9mLWJlbmNobWFya3MiIC8+CisKKyMjIyBSdW5uaW5nIGEgU3Vic2V0IG9mIEJlbmNobWFya3MKKworVGhlIGAtLWJlbmNobWFya19maWx0ZXI9PHJlZ2V4PmAgb3B0aW9uIChvciBgQkVOQ0hNQVJLX0ZJTFRFUj08cmVnZXg+YAorZW52aXJvbm1lbnQgdmFyaWFibGUpIGNhbiBiZSB1c2VkIHRvIG9ubHkgcnVuIHRoZSBiZW5jaG1hcmtzIHRoYXQgbWF0Y2gKK3RoZSBzcGVjaWZpZWQgYDxyZWdleD5gLiBGb3IgZXhhbXBsZToKKworYGBgYmFzaAorJCAuL3J1bl9iZW5jaG1hcmtzLnggLS1iZW5jaG1hcmtfZmlsdGVyPUJNX21lbWNweS8zMgorUnVuIG9uICgxIFggMjMwMCBNSHogQ1BVICkKKzIwMTYtMDYtMjUgMTk6MzQ6MjQKK0JlbmNobWFyayAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgQ1BVIEl0ZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JNX21lbWNweS8zMiAgICAgICAgICAxMSBucyAgICAgICAgIDExIG5zICAgNzk1NDU0NTUKK0JNX21lbWNweS8zMmsgICAgICAgMjE4MSBucyAgICAgICAyMTg1IG5zICAgICAzMjQwNzQKK0JNX21lbWNweS8zMiAgICAgICAgICAxMiBucyAgICAgICAgIDEyIG5zICAgNTQ2ODc1MDAKK0JNX21lbWNweS8zMmsgICAgICAgMTgzNCBucyAgICAgICAxODM3IG5zICAgICAzNTcxNDMKK2BgYAorCis8YSBuYW1lPSJyZXN1bHQtY29tcGFyaXNvbiIgLz4KKworIyMjIFJlc3VsdCBjb21wYXJpc29uCisKK0l0IGlzIHBvc3NpYmxlIHRvIGNvbXBhcmUgdGhlIGJlbmNobWFya2luZyByZXN1bHRzLgorU2VlIFtBZGRpdGlvbmFsIFRvb2xpbmcgRG9jdW1lbnRhdGlvbl0oZG9jcy90b29scy5tZCkKKworPGEgbmFtZT0icnVudGltZS1hbmQtcmVwb3J0aW5nLWNvbnNpZGVyYXRpb25zIiAvPgorCisjIyMgUnVudGltZSBhbmQgUmVwb3J0aW5nIENvbnNpZGVyYXRpb25zCisKK1doZW4gdGhlIGJlbmNobWFyayBiaW5hcnkgaXMgZXhlY3V0ZWQsIGVhY2ggYmVuY2htYXJrIGZ1bmN0aW9uIGlzIHJ1biBzZXJpYWxseS4KK1RoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBydW4gaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBieSBydW5uaW5nIHRoZQorYmVuY2htYXJrIGEgZmV3IHRpbWVzIGFuZCBtZWFzdXJpbmcgdGhlIHRpbWUgdGFrZW4gYW5kIGVuc3VyaW5nIHRoYXQgdGhlCit1bHRpbWF0ZSByZXN1bHQgd2lsbCBiZSBzdGF0aXN0aWNhbGx5IHN0YWJsZS4gQXMgc3VjaCwgZmFzdGVyIGJlbmNobWFyaworZnVuY3Rpb25zIHdpbGwgYmUgcnVuIGZvciBtb3JlIGl0ZXJhdGlvbnMgdGhhbiBzbG93ZXIgYmVuY2htYXJrIGZ1bmN0aW9ucywgYW5kCit0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaXMgdGh1cyByZXBvcnRlZC4KKworSW4gYWxsIGNhc2VzLCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIHdoaWNoIHRoZSBiZW5jaG1hcmsgaXMgcnVuIGlzCitnb3Zlcm5lZCBieSB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGJlbmNobWFyayB0YWtlcy4gQ29uY3JldGVseSwgdGhlIG51bWJlciBvZgoraXRlcmF0aW9ucyBpcyBhdCBsZWFzdCBvbmUsIG5vdCBtb3JlIHRoYW4gMWU5LCB1bnRpbCBDUFUgdGltZSBpcyBncmVhdGVyIHRoYW4KK3RoZSBtaW5pbXVtIHRpbWUsIG9yIHRoZSB3YWxsY2xvY2sgdGltZSBpcyA1eCBtaW5pbXVtIHRpbWUuIFRoZSBtaW5pbXVtIHRpbWUgaXMKK3NldCBwZXIgYmVuY2htYXJrIGJ5IGNhbGxpbmcgYE1pblRpbWVgIG9uIHRoZSByZWdpc3RlcmVkIGJlbmNobWFyayBvYmplY3QuCisKK0F2ZXJhZ2UgdGltaW5ncyBhcmUgdGhlbiByZXBvcnRlZCBvdmVyIHRoZSBpdGVyYXRpb25zIHJ1bi4gSWYgbXVsdGlwbGUKK3JlcGV0aXRpb25zIGFyZSByZXF1ZXN0ZWQgdXNpbmcgdGhlIGAtLWJlbmNobWFya19yZXBldGl0aW9uc2AgY29tbWFuZC1saW5lCitvcHRpb24sIG9yIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLCB0aGUgYmVuY2htYXJrIGZ1bmN0aW9uIHdpbGwgYmUgcnVuIHNldmVyYWwKK3RpbWVzIGFuZCBzdGF0aXN0aWNhbCByZXN1bHRzIGFjcm9zcyB0aGVzZSByZXBldGl0aW9ucyB3aWxsIGFsc28gYmUgcmVwb3J0ZWQuCisKK0FzIHdlbGwgYXMgdGhlIHBlci1iZW5jaG1hcmsgZW50cmllcywgYSBwcmVhbWJsZSBpbiB0aGUgcmVwb3J0IHdpbGwgaW5jbHVkZQoraW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hY2hpbmUgb24gd2hpY2ggdGhlIGJlbmNobWFya3MgYXJlIHJ1bi4KKworPGEgbmFtZT0icGFzc2luZy1hcmd1bWVudHMiIC8+CisKKyMjIyBQYXNzaW5nIEFyZ3VtZW50cworCitTb21ldGltZXMgYSBmYW1pbHkgb2YgYmVuY2htYXJrcyBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aCBqdXN0IG9uZSByb3V0aW5lIHRoYXQKK3Rha2VzIGFuIGV4dHJhIGFyZ3VtZW50IHRvIHNwZWNpZnkgd2hpY2ggb25lIG9mIHRoZSBmYW1pbHkgb2YgYmVuY2htYXJrcyB0bworcnVuLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgYSBmYW1pbHkgb2YgYmVuY2htYXJrcyBmb3IKK21lYXN1cmluZyB0aGUgc3BlZWQgb2YgYG1lbWNweSgpYCBjYWxscyBvZiBkaWZmZXJlbnQgbGVuZ3RoczoKKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV9tZW1jcHkoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgY2hhciogc3JjID0gbmV3IGNoYXJbc3RhdGUucmFuZ2UoMCldOworICBjaGFyKiBkc3QgPSBuZXcgY2hhcltzdGF0ZS5yYW5nZSgwKV07CisgIG1lbXNldChzcmMsICd4Jywgc3RhdGUucmFuZ2UoMCkpOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKQorICAgIG1lbWNweShkc3QsIHNyYywgc3RhdGUucmFuZ2UoMCkpOworICBzdGF0ZS5TZXRCeXRlc1Byb2Nlc3NlZChpbnQ2NF90KHN0YXRlLml0ZXJhdGlvbnMoKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KHN0YXRlLnJhbmdlKDApKSk7CisgIGRlbGV0ZVtdIHNyYzsKKyAgZGVsZXRlW10gZHN0OworfQorQkVOQ0hNQVJLKEJNX21lbWNweSktPkFyZyg4KS0+QXJnKDY0KS0+QXJnKDUxMiktPkFyZygxPDwxMCktPkFyZyg4PDwxMCk7CitgYGAKKworVGhlIHByZWNlZGluZyBjb2RlIGlzIHF1aXRlIHJlcGV0aXRpdmUsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCB0aGUgZm9sbG93aW5nCitzaG9ydC1oYW5kLiBUaGUgZm9sbG93aW5nIGludm9jYXRpb24gd2lsbCBwaWNrIGEgZmV3IGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBpbgordGhlIHNwZWNpZmllZCByYW5nZSBhbmQgd2lsbCBnZW5lcmF0ZSBhIGJlbmNobWFyayBmb3IgZWFjaCBzdWNoIGFyZ3VtZW50LgorCitgYGBjKysKK0JFTkNITUFSSyhCTV9tZW1jcHkpLT5SYW5nZSg4LCA4PDwxMCk7CitgYGAKKworQnkgZGVmYXVsdCB0aGUgYXJndW1lbnRzIGluIHRoZSByYW5nZSBhcmUgZ2VuZXJhdGVkIGluIG11bHRpcGxlcyBvZiBlaWdodCBhbmQKK3RoZSBjb21tYW5kIGFib3ZlIHNlbGVjdHMgWyA4LCA2NCwgNTEyLCA0aywgOGsgXS4gSW4gdGhlIGZvbGxvd2luZyBjb2RlIHRoZQorcmFuZ2UgbXVsdGlwbGllciBpcyBjaGFuZ2VkIHRvIG11bHRpcGxlcyBvZiB0d28uCisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX21lbWNweSktPlJhbmdlTXVsdGlwbGllcigyKS0+UmFuZ2UoOCwgODw8MTApOworYGBgCisKK05vdyBhcmd1bWVudHMgZ2VuZXJhdGVkIGFyZSBbIDgsIDE2LCAzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDJrLCA0aywgOGsgXS4KKworVGhlIHByZWNlZGluZyBjb2RlIHNob3dzIGEgbWV0aG9kIG9mIGRlZmluaW5nIGEgc3BhcnNlIHJhbmdlLiAgVGhlIGZvbGxvd2luZworZXhhbXBsZSBzaG93cyBhIG1ldGhvZCBvZiBkZWZpbmluZyBhIGRlbnNlIHJhbmdlLiBJdCBpcyB0aGVuIHVzZWQgdG8gYmVuY2htYXJrCit0aGUgcGVyZm9ybWFuY2Ugb2YgYHN0ZDo6dmVjdG9yYCBpbml0aWFsaXphdGlvbiBmb3IgdW5pZm9ybWx5IGluY3JlYXNpbmcgc2l6ZXMuCisKK2BgYGMrKworc3RhdGljIHZvaWQgQk1fRGVuc2VSYW5nZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IoYXV0byBfIDogc3RhdGUpIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHYoc3RhdGUucmFuZ2UoMCksIHN0YXRlLnJhbmdlKDApKTsKKyAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUodi5kYXRhKCkpOworICAgIGJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpOworICB9Cit9CitCRU5DSE1BUksoQk1fRGVuc2VSYW5nZSktPkRlbnNlUmFuZ2UoMCwgMTAyNCwgMTI4KTsKK2BgYAorCitOb3cgYXJndW1lbnRzIGdlbmVyYXRlZCBhcmUgWyAwLCAxMjgsIDI1NiwgMzg0LCA1MTIsIDY0MCwgNzY4LCA4OTYsIDEwMjQgXS4KKworWW91IG1pZ2h0IGhhdmUgYSBiZW5jaG1hcmsgdGhhdCBkZXBlbmRzIG9uIHR3byBvciBtb3JlIGlucHV0cy4gRm9yIGV4YW1wbGUsIHRoZQorZm9sbG93aW5nIGNvZGUgZGVmaW5lcyBhIGZhbWlseSBvZiBiZW5jaG1hcmtzIGZvciBtZWFzdXJpbmcgdGhlIHNwZWVkIG9mIHNldAoraW5zZXJ0aW9uLgorCitgYGBjKysKK3N0YXRpYyB2b2lkIEJNX1NldEluc2VydChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBzdGQ6OnNldDxpbnQ+IGRhdGE7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBzdGF0ZS5QYXVzZVRpbWluZygpOworICAgIGRhdGEgPSBDb25zdHJ1Y3RSYW5kb21TZXQoc3RhdGUucmFuZ2UoMCkpOworICAgIHN0YXRlLlJlc3VtZVRpbWluZygpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3RhdGUucmFuZ2UoMSk7ICsraikKKyAgICAgIGRhdGEuaW5zZXJ0KFJhbmRvbU51bWJlcigpKTsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX1NldEluc2VydCkKKyAgICAtPkFyZ3MoezE8PDEwLCAxMjh9KQorICAgIC0+QXJncyh7Mjw8MTAsIDEyOH0pCisgICAgLT5BcmdzKHs0PDwxMCwgMTI4fSkKKyAgICAtPkFyZ3Moezg8PDEwLCAxMjh9KQorICAgIC0+QXJncyh7MTw8MTAsIDUxMn0pCisgICAgLT5BcmdzKHsyPDwxMCwgNTEyfSkKKyAgICAtPkFyZ3MoezQ8PDEwLCA1MTJ9KQorICAgIC0+QXJncyh7ODw8MTAsIDUxMn0pOworYGBgCisKK1RoZSBwcmVjZWRpbmcgY29kZSBpcyBxdWl0ZSByZXBldGl0aXZlLCBhbmQgY2FuIGJlIHJlcGxhY2VkIHdpdGggdGhlIGZvbGxvd2luZworc2hvcnQtaGFuZC4gVGhlIGZvbGxvd2luZyBtYWNybyB3aWxsIHBpY2sgYSBmZXcgYXBwcm9wcmlhdGUgYXJndW1lbnRzIGluIHRoZQorcHJvZHVjdCBvZiB0aGUgdHdvIHNwZWNpZmllZCByYW5nZXMgYW5kIHdpbGwgZ2VuZXJhdGUgYSBiZW5jaG1hcmsgZm9yIGVhY2ggc3VjaAorcGFpci4KKworYGBgYysrCitCRU5DSE1BUksoQk1fU2V0SW5zZXJ0KS0+UmFuZ2VzKHt7MTw8MTAsIDg8PDEwfSwgezEyOCwgNTEyfX0pOworYGBgCisKK0ZvciBtb3JlIGNvbXBsZXggcGF0dGVybnMgb2YgaW5wdXRzLCBwYXNzaW5nIGEgY3VzdG9tIGZ1bmN0aW9uIHRvIGBBcHBseWAgYWxsb3dzCitwcm9ncmFtbWF0aWMgc3BlY2lmaWNhdGlvbiBvZiBhbiBhcmJpdHJhcnkgc2V0IG9mIGFyZ3VtZW50cyBvbiB3aGljaCB0byBydW4gdGhlCitiZW5jaG1hcmsuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBlbnVtZXJhdGVzIGEgZGVuc2UgcmFuZ2Ugb24gb25lIHBhcmFtZXRlciwKK2FuZCBhIHNwYXJzZSByYW5nZSBvbiB0aGUgc2Vjb25kLgorCitgYGBjKysKK3N0YXRpYyB2b2lkIEN1c3RvbUFyZ3VtZW50cyhiZW5jaG1hcms6OmludGVybmFsOjpCZW5jaG1hcmsqIGIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMTA7ICsraSkKKyAgICBmb3IgKGludCBqID0gMzI7IGogPD0gMTAyNCoxMDI0OyBqICo9IDgpCisgICAgICBiLT5BcmdzKHtpLCBqfSk7Cit9CitCRU5DSE1BUksoQk1fU2V0SW5zZXJ0KS0+QXBwbHkoQ3VzdG9tQXJndW1lbnRzKTsKK2BgYAorCisjIyMjIFBhc3NpbmcgQXJiaXRyYXJ5IEFyZ3VtZW50cyB0byBhIEJlbmNobWFyaworCitJbiBDKysxMSBpdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgYSBiZW5jaG1hcmsgdGhhdCB0YWtlcyBhbiBhcmJpdHJhcnkgbnVtYmVyCitvZiBleHRyYSBhcmd1bWVudHMuIFRoZSBgQkVOQ0hNQVJLX0NBUFRVUkUoZnVuYywgdGVzdF9jYXNlX25hbWUsIC4uLmFyZ3MpYAorbWFjcm8gY3JlYXRlcyBhIGJlbmNobWFyayB0aGF0IGludm9rZXMgYGZ1bmNgICB3aXRoIHRoZSBgYmVuY2htYXJrOjpTdGF0ZWAgYXMKK3RoZSBmaXJzdCBhcmd1bWVudCBmb2xsb3dlZCBieSB0aGUgc3BlY2lmaWVkIGBhcmdzLi4uYC4KK1RoZSBgdGVzdF9jYXNlX25hbWVgIGlzIGFwcGVuZGVkIHRvIHRoZSBuYW1lIG9mIHRoZSBiZW5jaG1hcmsgYW5kCitzaG91bGQgZGVzY3JpYmUgdGhlIHZhbHVlcyBwYXNzZWQuCisKK2BgYGMrKwordGVtcGxhdGUgPGNsYXNzIC4uLkV4dHJhQXJncz4KK3ZvaWQgQk1fdGFrZXNfYXJncyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgRXh0cmFBcmdzJiYuLi4gZXh0cmFfYXJncykgeworICBbLi4uXQorfQorLy8gUmVnaXN0ZXJzIGEgYmVuY2htYXJrIG5hbWVkICJCTV90YWtlc19hcmdzL2ludF9zdHJpbmdfdGVzdCIgdGhhdCBwYXNzZXMKKy8vIHRoZSBzcGVjaWZpZWQgdmFsdWVzIHRvIGBleHRyYV9hcmdzYC4KK0JFTkNITUFSS19DQVBUVVJFKEJNX3Rha2VzX2FyZ3MsIGludF9zdHJpbmdfdGVzdCwgNDIsIHN0ZDo6c3RyaW5nKCJhYmMiKSk7CitgYGAKKworTm90ZSB0aGF0IGVsZW1lbnRzIG9mIGAuLi5hcmdzYCBtYXkgcmVmZXIgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gVXNlcnMgc2hvdWxkCithdm9pZCBtb2RpZnlpbmcgZ2xvYmFsIHN0YXRlIGluc2lkZSBvZiBhIGJlbmNobWFyay4KKworPGEgbmFtZT0iYXN5bXB0b3RpYy1jb21wbGV4aXR5IiAvPgorCisjIyMgQ2FsY3VsYXRpbmcgQXN5bXB0b3RpYyBDb21wbGV4aXR5IChCaWcgTykKKworQXN5bXB0b3RpYyBjb21wbGV4aXR5IG1pZ2h0IGJlIGNhbGN1bGF0ZWQgZm9yIGEgZmFtaWx5IG9mIGJlbmNobWFya3MuIFRoZQorZm9sbG93aW5nIGNvZGUgd2lsbCBjYWxjdWxhdGUgdGhlIGNvZWZmaWNpZW50IGZvciB0aGUgaGlnaC1vcmRlciB0ZXJtIGluIHRoZQorcnVubmluZyB0aW1lIGFuZCB0aGUgbm9ybWFsaXplZCByb290LW1lYW4gc3F1YXJlIGVycm9yIG9mIHN0cmluZyBjb21wYXJpc29uLgorCitgYGBjKysKK3N0YXRpYyB2b2lkIEJNX1N0cmluZ0NvbXBhcmUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RkOjpzdHJpbmcgczEoc3RhdGUucmFuZ2UoMCksICctJyk7CisgIHN0ZDo6c3RyaW5nIHMyKHN0YXRlLnJhbmdlKDApLCAnLScpOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHMxLmNvbXBhcmUoczIpKTsKKyAgfQorICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7Cit9CitCRU5DSE1BUksoQk1fU3RyaW5nQ29tcGFyZSkKKyAgICAtPlJhbmdlTXVsdGlwbGllcigyKS0+UmFuZ2UoMTw8MTAsIDE8PDE4KS0+Q29tcGxleGl0eShiZW5jaG1hcms6Om9OKTsKK2BgYAorCitBcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGludm9jYXRpb24sIGFzeW1wdG90aWMgY29tcGxleGl0eSBtaWdodCBhbHNvIGJlCitjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkuCisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX1N0cmluZ0NvbXBhcmUpCisgICAgLT5SYW5nZU11bHRpcGxpZXIoMiktPlJhbmdlKDE8PDEwLCAxPDwxOCktPkNvbXBsZXhpdHkoKTsKK2BgYAorCitUaGUgZm9sbG93aW5nIGNvZGUgd2lsbCBzcGVjaWZ5IGFzeW1wdG90aWMgY29tcGxleGl0eSB3aXRoIGEgbGFtYmRhIGZ1bmN0aW9uLAordGhhdCBtaWdodCBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBoaWdoLW9yZGVyIHRlcm0gY2FsY3VsYXRpb24uCisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX1N0cmluZ0NvbXBhcmUpLT5SYW5nZU11bHRpcGxpZXIoMikKKyAgICAtPlJhbmdlKDE8PDEwLCAxPDwxOCktPkNvbXBsZXhpdHkoW10oaW50NjRfdCBuKS0+ZG91Ymxle3JldHVybiBuOyB9KTsKK2BgYAorCis8YSBuYW1lPSJ0ZW1wbGF0ZWQtYmVuY2htYXJrcyIgLz4KKworIyMjIFRlbXBsYXRlZCBCZW5jaG1hcmtzCisKK1RoaXMgZXhhbXBsZSBwcm9kdWNlcyBhbmQgY29uc3VtZXMgbWVzc2FnZXMgb2Ygc2l6ZSBgc2l6ZW9mKHYpYCBgcmFuZ2VfeGAKK3RpbWVzLiBJdCBhbHNvIG91dHB1dHMgdGhyb3VnaHB1dCBpbiB0aGUgYWJzZW5jZSBvZiBtdWx0aXByb2dyYW1taW5nLgorCitgYGBjKysKK3RlbXBsYXRlIDxjbGFzcyBRPiB2b2lkIEJNX1NlcXVlbnRpYWwoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgUSBxOworICB0eXBlbmFtZSBROjp2YWx1ZV90eXBlIHY7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBmb3IgKGludCBpID0gc3RhdGUucmFuZ2UoMCk7IGktLTsgKQorICAgICAgcS5wdXNoKHYpOworICAgIGZvciAoaW50IGUgPSBzdGF0ZS5yYW5nZSgwKTsgZS0tOyApCisgICAgICBxLldhaXQoJnYpOworICB9CisgIC8vIGFjdHVhbGx5IG1lc3NhZ2VzLCBub3QgYnl0ZXM6CisgIHN0YXRlLlNldEJ5dGVzUHJvY2Vzc2VkKAorICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RhdGUuaXRlcmF0aW9ucygpKSpzdGF0ZS5yYW5nZSgwKSk7Cit9CitCRU5DSE1BUktfVEVNUExBVEUoQk1fU2VxdWVudGlhbCwgV2FpdFF1ZXVlPGludD4pLT5SYW5nZSgxPDwwLCAxPDwxMCk7CitgYGAKKworVGhyZWUgbWFjcm9zIGFyZSBwcm92aWRlZCBmb3IgYWRkaW5nIGJlbmNobWFyayB0ZW1wbGF0ZXMuCisKK2BgYGMrKworI2lmZGVmIEJFTkNITUFSS19IQVNfQ1hYMTEKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFKGZ1bmMsIC4uLikgLy8gVGFrZXMgYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzLgorI2Vsc2UgLy8gQysrIDwgQysrMTEKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFKGZ1bmMsIGFyZzEpCisjZW5kaWYKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFMShmdW5jLCBhcmcxKQorI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEUyKGZ1bmMsIGFyZzEsIGFyZzIpCitgYGAKKworPGEgbmFtZT0iZml4dHVyZXMiIC8+CisKKyMjIyBGaXh0dXJlcworCitGaXh0dXJlIHRlc3RzIGFyZSBjcmVhdGVkIGJ5IGZpcnN0IGRlZmluaW5nIGEgdHlwZSB0aGF0IGRlcml2ZXMgZnJvbQorYDo6YmVuY2htYXJrOjpGaXh0dXJlYCBhbmQgdGhlbiBjcmVhdGluZy9yZWdpc3RlcmluZyB0aGUgdGVzdHMgdXNpbmcgdGhlCitmb2xsb3dpbmcgbWFjcm9zOgorCisqIGBCRU5DSE1BUktfRihDbGFzc05hbWUsIE1ldGhvZClgCisqIGBCRU5DSE1BUktfREVGSU5FX0YoQ2xhc3NOYW1lLCBNZXRob2QpYAorKiBgQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQ2xhc3NOYW1lLCBNZXRob2QpYAorCitGb3IgRXhhbXBsZToKKworYGBgYysrCitjbGFzcyBNeUZpeHR1cmUgOiBwdWJsaWMgYmVuY2htYXJrOjpGaXh0dXJlIHsKK3B1YmxpYzoKKyAgdm9pZCBTZXRVcChjb25zdCA6OmJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIH0KKworICB2b2lkIFRlYXJEb3duKGNvbnN0IDo6YmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgfQorfTsKKworQkVOQ0hNQVJLX0YoTXlGaXh0dXJlLCBGb29UZXN0KShiZW5jaG1hcms6OlN0YXRlJiBzdCkgeworICAgZm9yIChhdXRvIF8gOiBzdCkgeworICAgICAuLi4KKyAgfQorfQorCitCRU5DSE1BUktfREVGSU5FX0YoTXlGaXh0dXJlLCBCYXJUZXN0KShiZW5jaG1hcms6OlN0YXRlJiBzdCkgeworICAgZm9yIChhdXRvIF8gOiBzdCkgeworICAgICAuLi4KKyAgfQorfQorLyogQmFyVGVzdCBpcyBOT1QgcmVnaXN0ZXJlZCAqLworQkVOQ0hNQVJLX1JFR0lTVEVSX0YoTXlGaXh0dXJlLCBCYXJUZXN0KS0+VGhyZWFkcygyKTsKKy8qIEJhclRlc3QgaXMgbm93IHJlZ2lzdGVyZWQgKi8KK2BgYAorCisjIyMjIFRlbXBsYXRlZCBGaXh0dXJlcworCitBbHNvIHlvdSBjYW4gY3JlYXRlIHRlbXBsYXRlZCBmaXh0dXJlIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCisqIGBCRU5DSE1BUktfVEVNUExBVEVfRihDbGFzc05hbWUsIE1ldGhvZCwgLi4uKWAKKyogYEJFTkNITUFSS19URU1QTEFURV9ERUZJTkVfRihDbGFzc05hbWUsIE1ldGhvZCwgLi4uKWAKKworRm9yIGV4YW1wbGU6CisKK2BgYGMrKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIE15Rml4dHVyZSA6IHB1YmxpYyBiZW5jaG1hcms6OkZpeHR1cmUge307CisKK0JFTkNITUFSS19URU1QTEFURV9GKE15Rml4dHVyZSwgSW50VGVzdCwgaW50KShiZW5jaG1hcms6OlN0YXRlJiBzdCkgeworICAgZm9yIChhdXRvIF8gOiBzdCkgeworICAgICAuLi4KKyAgfQorfQorCitCRU5DSE1BUktfVEVNUExBVEVfREVGSU5FX0YoTXlGaXh0dXJlLCBEb3VibGVUZXN0LCBkb3VibGUpKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgICBmb3IgKGF1dG8gXyA6IHN0KSB7CisgICAgIC4uLgorICB9Cit9CisKK0JFTkNITUFSS19SRUdJU1RFUl9GKE15Rml4dHVyZSwgRG91YmxlVGVzdCktPlRocmVhZHMoMik7CitgYGAKKworPGEgbmFtZT0iY3VzdG9tLWNvdW50ZXJzIiAvPgorCisjIyMgQ3VzdG9tIENvdW50ZXJzCisKK1lvdSBjYW4gYWRkIHlvdXIgb3duIGNvdW50ZXJzIHdpdGggdXNlci1kZWZpbmVkIG5hbWVzLiBUaGUgZXhhbXBsZSBiZWxvdword2lsbCBhZGQgY29sdW1ucyAiRm9vIiwgIkJhciIgYW5kICJCYXoiIGluIGl0cyBvdXRwdXQ6CisKK2BgYGMrKworc3RhdGljIHZvaWQgVXNlckNvdW50ZXJzRXhhbXBsZTEoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZG91YmxlIG51bUZvb3MgPSAwLCBudW1CYXJzID0gMCwgbnVtQmF6cyA9IDA7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAvLyAuLi4gY291bnQgRm9vLEJhcixCYXogZXZlbnRzCisgIH0KKyAgc3RhdGUuY291bnRlcnNbIkZvbyJdID0gbnVtRm9vczsKKyAgc3RhdGUuY291bnRlcnNbIkJhciJdID0gbnVtQmFyczsKKyAgc3RhdGUuY291bnRlcnNbIkJheiJdID0gbnVtQmF6czsKK30KK2BgYAorCitUaGUgYHN0YXRlLmNvdW50ZXJzYCBvYmplY3QgaXMgYSBgc3RkOjptYXBgIHdpdGggYHN0ZDo6c3RyaW5nYCBrZXlzCithbmQgYENvdW50ZXJgIHZhbHVlcy4gVGhlIGxhdHRlciBpcyBhIGBkb3VibGVgLWxpa2UgY2xhc3MsIHZpYSBhbiBpbXBsaWNpdAorY29udmVyc2lvbiB0byBgZG91YmxlJmAuIFRodXMgeW91IGNhbiB1c2UgYWxsIG9mIHRoZSBzdGFuZGFyZCBhcml0aG1ldGljCithc3NpZ25tZW50IG9wZXJhdG9ycyAoYD0sKz0sLT0sKj0sLz1gKSB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGVhY2ggY291bnRlci4KKworSW4gbXVsdGl0aHJlYWRlZCBiZW5jaG1hcmtzLCBlYWNoIGNvdW50ZXIgaXMgc2V0IG9uIHRoZSBjYWxsaW5nIHRocmVhZCBvbmx5LgorV2hlbiB0aGUgYmVuY2htYXJrIGZpbmlzaGVzLCB0aGUgY291bnRlcnMgZnJvbSBlYWNoIHRocmVhZCB3aWxsIGJlIHN1bW1lZDsKK3RoZSByZXN1bHRpbmcgc3VtIGlzIHRoZSB2YWx1ZSB3aGljaCB3aWxsIGJlIHNob3duIGZvciB0aGUgYmVuY2htYXJrLgorCitUaGUgYENvdW50ZXJgIGNvbnN0cnVjdG9yIGFjY2VwdHMgdGhyZWUgcGFyYW1ldGVyczogdGhlIHZhbHVlIGFzIGEgYGRvdWJsZWAKKzsgYSBiaXQgZmxhZyB3aGljaCBhbGxvd3MgeW91IHRvIHNob3cgY291bnRlcnMgYXMgcmF0ZXMsIGFuZC9vciBhcyBwZXItdGhyZWFkCitpdGVyYXRpb24sIGFuZC9vciBhcyBwZXItdGhyZWFkIGF2ZXJhZ2VzLCBhbmQvb3IgaXRlcmF0aW9uIGludmFyaWFudHMsCithbmQvb3IgZmluYWxseSBpbnZlcnRpbmcgdGhlIHJlc3VsdDsgYW5kIGEgZmxhZyBzcGVjaWZ5aW5nIHRoZSAndW5pdCcgLSBpLmUuCitpcyAxayBhIDEwMDAgKGRlZmF1bHQsIGBiZW5jaG1hcms6OkNvdW50ZXI6Ok9uZUs6OmtJczEwMDBgKSwgb3IgMTAyNAorKGBiZW5jaG1hcms6OkNvdW50ZXI6Ok9uZUs6OmtJczEwMjRgKT8KKworYGBgYysrCisgIC8vIHNldHMgYSBzaW1wbGUgY291bnRlcgorICBzdGF0ZS5jb3VudGVyc1siRm9vIl0gPSBudW1Gb29zOworCisgIC8vIFNldCB0aGUgY291bnRlciBhcyBhIHJhdGUuIEl0IHdpbGwgYmUgcHJlc2VudGVkIGRpdmlkZWQKKyAgLy8gYnkgdGhlIGR1cmF0aW9uIG9mIHRoZSBiZW5jaG1hcmsuCisgIC8vIE1lYW5pbmc6IHBlciBvbmUgc2Vjb25kLCBob3cgbWFueSAnZm9vJ3MgYXJlIHByb2Nlc3NlZD8KKyAgc3RhdGUuY291bnRlcnNbIkZvb1JhdGUiXSA9IENvdW50ZXIobnVtRm9vcywgYmVuY2htYXJrOjpDb3VudGVyOjprSXNSYXRlKTsKKworICAvLyBTZXQgdGhlIGNvdW50ZXIgYXMgYSByYXRlLiBJdCB3aWxsIGJlIHByZXNlbnRlZCBkaXZpZGVkCisgIC8vIGJ5IHRoZSBkdXJhdGlvbiBvZiB0aGUgYmVuY2htYXJrLCBhbmQgdGhlIHJlc3VsdCBpbnZlcnRlZC4KKyAgLy8gTWVhbmluZzogaG93IG1hbnkgc2Vjb25kcyBpdCB0YWtlcyB0byBwcm9jZXNzIG9uZSAnZm9vJz8KKyAgc3RhdGUuY291bnRlcnNbIkZvb0ludlJhdGUiXSA9IENvdW50ZXIobnVtRm9vcywgYmVuY2htYXJrOjpDb3VudGVyOjprSXNSYXRlIHwgYmVuY2htYXJrOjpDb3VudGVyOjprSW52ZXJ0KTsKKworICAvLyBTZXQgdGhlIGNvdW50ZXIgYXMgYSB0aHJlYWQtYXZlcmFnZSBxdWFudGl0eS4gSXQgd2lsbAorICAvLyBiZSBwcmVzZW50ZWQgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIHRocmVhZHMuCisgIHN0YXRlLmNvdW50ZXJzWyJGb29BdmciXSA9IENvdW50ZXIobnVtRm9vcywgYmVuY2htYXJrOjpDb3VudGVyOjprQXZnVGhyZWFkcyk7CisKKyAgLy8gVGhlcmUncyBhbHNvIGEgY29tYmluZWQgZmxhZzoKKyAgc3RhdGUuY291bnRlcnNbIkZvb0F2Z1JhdGUiXSA9IENvdW50ZXIobnVtRm9vcyxiZW5jaG1hcms6OkNvdW50ZXI6OmtBdmdUaHJlYWRzUmF0ZSk7CisKKyAgLy8gVGhpcyBzYXlzIHRoYXQgd2UgcHJvY2VzcyB3aXRoIHRoZSByYXRlIG9mIHN0YXRlLnJhbmdlKDApIGJ5dGVzIGV2ZXJ5IGl0ZXJhdGlvbjoKKyAgc3RhdGUuY291bnRlcnNbIkJ5dGVzUHJvY2Vzc2VkIl0gPSBDb3VudGVyKHN0YXRlLnJhbmdlKDApLCBiZW5jaG1hcms6OkNvdW50ZXI6OmtJc0l0ZXJhdGlvbkludmFyaWFudFJhdGUsIGJlbmNobWFyazo6Q291bnRlcjo6T25lSzo6a0lzMTAyNCk7CitgYGAKKworV2hlbiB5b3UncmUgY29tcGlsaW5nIGluIEMrKzExIG1vZGUgb3IgbGF0ZXIgeW91IGNhbiB1c2UgYGluc2VydCgpYCB3aXRoCitgc3RkOjppbml0aWFsaXplcl9saXN0YDoKKworYGBgYysrCisgIC8vIFdpdGggQysrMTEsIHRoaXMgY2FuIGJlIGRvbmU6CisgIHN0YXRlLmNvdW50ZXJzLmluc2VydCh7eyJGb28iLCBudW1Gb29zfSwgeyJCYXIiLCBudW1CYXJzfSwgeyJCYXoiLCBudW1CYXpzfX0pOworICAvLyAuLi4gaW5zdGVhZCBvZjoKKyAgc3RhdGUuY291bnRlcnNbIkZvbyJdID0gbnVtRm9vczsKKyAgc3RhdGUuY291bnRlcnNbIkJhciJdID0gbnVtQmFyczsKKyAgc3RhdGUuY291bnRlcnNbIkJheiJdID0gbnVtQmF6czsKK2BgYAorCisjIyMjIENvdW50ZXIgUmVwb3J0aW5nCisKK1doZW4gdXNpbmcgdGhlIGNvbnNvbGUgcmVwb3J0ZXIsIGJ5IGRlZmF1bHQsIHVzZXIgY291bnRlcnMgYXJlIHByaW50ZWQgYXQKK3RoZSBlbmQgYWZ0ZXIgdGhlIHRhYmxlLCB0aGUgc2FtZSB3YXkgYXMgYGBieXRlc19wcm9jZXNzZWRgYCBhbmQKK2BgaXRlbXNfcHJvY2Vzc2VkYGAuIFRoaXMgaXMgYmVzdCBmb3IgY2FzZXMgaW4gd2hpY2ggdGhlcmUgYXJlIGZldyBjb3VudGVycywKK29yIHdoZXJlIHRoZXJlIGFyZSBvbmx5IGEgY291cGxlIG9mIGxpbmVzIHBlciBiZW5jaG1hcmsuIEhlcmUncyBhbiBleGFtcGxlIG9mCit0aGUgZGVmYXVsdCBvdXRwdXQ6CisKK2BgYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCZW5jaG1hcmsgICAgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICBDUFUgSXRlcmF0aW9ucyBVc2VyQ291bnRlcnMuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fVXNlckNvdW50ZXIvdGhyZWFkczo4ICAgICAgMjI0OCBucyAgICAgIDEwMjc3IG5zICAgICAgNjg4MDggQmFyPTE2IEJhdD00MCBCYXo9MjQgRm9vPTgKK0JNX1VzZXJDb3VudGVyL3RocmVhZHM6MSAgICAgIDk3OTcgbnMgICAgICAgOTc4OCBucyAgICAgIDcxNTIzIEJhcj0yIEJhdD01IEJhej0zIEZvbz0xMDI0bQorQk1fVXNlckNvdW50ZXIvdGhyZWFkczoyICAgICAgNDkyNCBucyAgICAgICA5ODQyIG5zICAgICAgNzEwMzYgQmFyPTQgQmF0PTEwIEJhej02IEZvbz0yCitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjQgICAgICAyNTg5IG5zICAgICAgMTAyODQgbnMgICAgICA2ODAxMiBCYXI9OCBCYXQ9MjAgQmF6PTEyIEZvbz00CitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjggICAgICAyMjEyIG5zICAgICAgMTAyODcgbnMgICAgICA2ODA0MCBCYXI9MTYgQmF0PTQwIEJhej0yNCBGb289OAorQk1fVXNlckNvdW50ZXIvdGhyZWFkczoxNiAgICAgMTc4MiBucyAgICAgIDEwMjc4IG5zICAgICAgNjgxNDQgQmFyPTMyIEJhdD04MCBCYXo9NDggRm9vPTE2CitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjMyICAgICAxMjkxIG5zICAgICAgMTAyOTYgbnMgICAgICA2ODI1NiBCYXI9NjQgQmF0PTE2MCBCYXo9OTYgRm9vPTMyCitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjQgICAgICAyNjE1IG5zICAgICAgMTAzMDcgbnMgICAgICA2ODA0MCBCYXI9OCBCYXQ9MjAgQmF6PTEyIEZvbz00CitCTV9GYWN0b3JpYWwgICAgICAgICAgICAgICAgICAgIDI2IG5zICAgICAgICAgMjYgbnMgICAyNjYwODk3OSA0MDMyMAorQk1fRmFjdG9yaWFsL3JlYWxfdGltZSAgICAgICAgICAyNiBucyAgICAgICAgIDI2IG5zICAgMjY1ODc5MzYgNDAzMjAKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvMSAgICAgICAgICAgMTYgbnMgICAgICAgICAxNiBucyAgIDQ1NzA0MjU1IDAKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvOCAgICAgICAgICAgNzMgbnMgICAgICAgICA3MyBucyAgICA5NTIwOTI3IDMuMjgzNzQKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvNjQgICAgICAgICA2MDkgbnMgICAgICAgIDYwOSBucyAgICAxMTQwNjQ3IDMuMTU3NDYKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvNTEyICAgICAgIDQ5MDAgbnMgICAgICAgNDkwMSBucyAgICAgMTQyNjk2IDMuMTQzNTUKK2BgYAorCitJZiB0aGlzIGRvZXNuJ3Qgc3VpdCB5b3UsIHlvdSBjYW4gcHJpbnQgZWFjaCBjb3VudGVyIGFzIGEgdGFibGUgY29sdW1uIGJ5CitwYXNzaW5nIHRoZSBmbGFnIGAtLWJlbmNobWFya19jb3VudGVyc190YWJ1bGFyPXRydWVgIHRvIHRoZSBiZW5jaG1hcmsKK2FwcGxpY2F0aW9uLiBUaGlzIGlzIGJlc3QgZm9yIGNhc2VzIGluIHdoaWNoIHRoZXJlIGFyZSBhIGxvdCBvZiBjb3VudGVycywgb3IKK2EgbG90IG9mIGxpbmVzIHBlciBpbmRpdmlkdWFsIGJlbmNobWFyay4gTm90ZSB0aGF0IHRoaXMgd2lsbCB0cmlnZ2VyIGEKK3JlcHJpbnRpbmcgb2YgdGhlIHRhYmxlIGhlYWRlciBhbnkgdGltZSB0aGUgY291bnRlciBzZXQgY2hhbmdlcyBiZXR3ZWVuCitpbmRpdmlkdWFsIGJlbmNobWFya3MuIEhlcmUncyBhbiBleGFtcGxlIG9mIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHdoZW4KK2AtLWJlbmNobWFya19jb3VudGVyc190YWJ1bGFyPXRydWVgIGlzIHBhc3NlZDoKKworYGBgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbmNobWFyayAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgIENQVSBJdGVyYXRpb25zICAgIEJhciAgIEJhdCAgIEJheiAgIEZvbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjggICAgICAyMTk4IG5zICAgICAgIDk5NTMgbnMgICAgICA3MDY4OCAgICAgMTYgICAgNDAgICAgMjQgICAgIDgKK0JNX1VzZXJDb3VudGVyL3RocmVhZHM6MSAgICAgIDk1MDQgbnMgICAgICAgOTUwNCBucyAgICAgIDczNzg3ICAgICAgMiAgICAgNSAgICAgMyAgICAgMQorQk1fVXNlckNvdW50ZXIvdGhyZWFkczoyICAgICAgNDc3NSBucyAgICAgICA5NTUwIG5zICAgICAgNzI2MDYgICAgICA0ICAgIDEwICAgICA2ICAgICAyCitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjQgICAgICAyNTA4IG5zICAgICAgIDk5NTEgbnMgICAgICA3MDMzMiAgICAgIDggICAgMjAgICAgMTIgICAgIDQKK0JNX1VzZXJDb3VudGVyL3RocmVhZHM6OCAgICAgIDIwNTUgbnMgICAgICAgOTkzMyBucyAgICAgIDcwMzQ0ICAgICAxNiAgICA0MCAgICAyNCAgICAgOAorQk1fVXNlckNvdW50ZXIvdGhyZWFkczoxNiAgICAgMTYxMCBucyAgICAgICA5OTQ2IG5zICAgICAgNzA3MjAgICAgIDMyICAgIDgwICAgIDQ4ICAgIDE2CitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjMyICAgICAxMTkyIG5zICAgICAgIDk5NDggbnMgICAgICA3MDQ5NiAgICAgNjQgICAxNjAgICAgOTYgICAgMzIKK0JNX1VzZXJDb3VudGVyL3RocmVhZHM6NCAgICAgIDI1MDYgbnMgICAgICAgOTk0OSBucyAgICAgIDcwMzMyICAgICAgOCAgICAyMCAgICAxMiAgICAgNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbmNobWFyayAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgIENQVSBJdGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fRmFjdG9yaWFsICAgICAgICAgICAgICAgICAgICAyNiBucyAgICAgICAgIDI2IG5zICAgMjYzOTIyNDUgNDAzMjAKK0JNX0ZhY3RvcmlhbC9yZWFsX3RpbWUgICAgICAgICAgMjYgbnMgICAgICAgICAyNiBucyAgIDI2NDk0MTA3IDQwMzIwCitCTV9DYWxjdWxhdGVQaVJhbmdlLzEgICAgICAgICAgIDE1IG5zICAgICAgICAgMTUgbnMgICA0NTU3MTU5NyAwCitCTV9DYWxjdWxhdGVQaVJhbmdlLzggICAgICAgICAgIDc0IG5zICAgICAgICAgNzQgbnMgICAgOTQ1MDIxMiAzLjI4Mzc0CitCTV9DYWxjdWxhdGVQaVJhbmdlLzY0ICAgICAgICAgNTk1IG5zICAgICAgICA1OTUgbnMgICAgMTE3MzkwMSAzLjE1NzQ2CitCTV9DYWxjdWxhdGVQaVJhbmdlLzUxMiAgICAgICA0NzUyIG5zICAgICAgIDQ3NTIgbnMgICAgIDE0NzM4MCAzLjE0MzU1CitCTV9DYWxjdWxhdGVQaVJhbmdlLzRrICAgICAgIDM3OTcwIG5zICAgICAgMzc5NzIgbnMgICAgICAxODQ1MyAzLjE0MTg0CitCTV9DYWxjdWxhdGVQaVJhbmdlLzMyayAgICAgMzAzNzMzIG5zICAgICAzMDM3NDQgbnMgICAgICAgMjMwNSAzLjE0MTYyCitCTV9DYWxjdWxhdGVQaVJhbmdlLzI1NmsgICAyNDM0MDk1IG5zICAgIDI0MzQxODYgbnMgICAgICAgIDI4OCAzLjE0MTYKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvMTAyNGsgIDk3MjExNDAgbnMgICAgOTcyMTQxMyBucyAgICAgICAgIDcxIDMuMTQxNTkKK0JNX0NhbGN1bGF0ZVBpL3RocmVhZHM6OCAgICAgIDIyNTUgbnMgICAgICAgOTk0MyBucyAgICAgIDcwOTM2CitgYGAKKworTm90ZSBhYm92ZSB0aGUgYWRkaXRpb25hbCBoZWFkZXIgcHJpbnRlZCB3aGVuIHRoZSBiZW5jaG1hcmsgY2hhbmdlcyBmcm9tCitgYEJNX1VzZXJDb3VudGVyYGAgdG8gYGBCTV9GYWN0b3JpYWxgYC4gVGhpcyBpcyBiZWNhdXNlIGBgQk1fRmFjdG9yaWFsYGAgZG9lcworbm90IGhhdmUgdGhlIHNhbWUgY291bnRlciBzZXQgYXMgYGBCTV9Vc2VyQ291bnRlcmBgLgorCis8YSBuYW1lPSJtdWx0aXRocmVhZGVkLWJlbmNobWFya3MiLz4KKworIyMjIE11bHRpdGhyZWFkZWQgQmVuY2htYXJrcworCitJbiBhIG11bHRpdGhyZWFkZWQgdGVzdCAoYmVuY2htYXJrIGludm9rZWQgYnkgbXVsdGlwbGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseSksCitpdCBpcyBndWFyYW50ZWVkIHRoYXQgbm9uZSBvZiB0aGUgdGhyZWFkcyB3aWxsIHN0YXJ0IHVudGlsIGFsbCBoYXZlIHJlYWNoZWQKK3RoZSBzdGFydCBvZiB0aGUgYmVuY2htYXJrIGxvb3AsIGFuZCBhbGwgd2lsbCBoYXZlIGZpbmlzaGVkIGJlZm9yZSBhbnkgdGhyZWFkCitleGl0cyB0aGUgYmVuY2htYXJrIGxvb3AuIChUaGlzIGJlaGF2aW9yIGlzIGFsc28gcHJvdmlkZWQgYnkgdGhlIGBLZWVwUnVubmluZygpYAorQVBJKSBBcyBzdWNoLCBhbnkgZ2xvYmFsIHNldHVwIG9yIHRlYXJkb3duIGNhbiBiZSB3cmFwcGVkIGluIGEgY2hlY2sgYWdhaW5zdCB0aGUgdGhyZWFkCitpbmRleDoKKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV9NdWx0aVRocmVhZGVkKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGlmIChzdGF0ZS50aHJlYWRfaW5kZXggPT0gMCkgeworICAgIC8vIFNldHVwIGNvZGUgaGVyZS4KKyAgfQorICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgLy8gUnVuIHRoZSB0ZXN0IGFzIG5vcm1hbC4KKyAgfQorICBpZiAoc3RhdGUudGhyZWFkX2luZGV4ID09IDApIHsKKyAgICAvLyBUZWFyZG93biBjb2RlIGhlcmUuCisgIH0KK30KK0JFTkNITUFSSyhCTV9NdWx0aVRocmVhZGVkKS0+VGhyZWFkcygyKTsKK2BgYAorCitJZiB0aGUgYmVuY2htYXJrZWQgY29kZSBpdHNlbGYgdXNlcyB0aHJlYWRzIGFuZCB5b3Ugd2FudCB0byBjb21wYXJlIGl0IHRvCitzaW5nbGUtdGhyZWFkZWQgY29kZSwgeW91IG1heSB3YW50IHRvIHVzZSByZWFsLXRpbWUgKCJ3YWxsY2xvY2siKSBtZWFzdXJlbWVudHMKK2ZvciBsYXRlbmN5IGNvbXBhcmlzb25zOgorCitgYGBjKysKK0JFTkNITUFSSyhCTV90ZXN0KS0+UmFuZ2UoOCwgODw8MTApLT5Vc2VSZWFsVGltZSgpOworYGBgCisKK1dpdGhvdXQgYFVzZVJlYWxUaW1lYCwgQ1BVIHRpbWUgaXMgdXNlZCBieSBkZWZhdWx0LgorCis8YSBuYW1lPSJjcHUtdGltZXJzIiAvPgorCisjIyMgQ1BVIFRpbWVycworCitCeSBkZWZhdWx0LCB0aGUgQ1BVIHRpbWVyIG9ubHkgbWVhc3VyZXMgdGhlIHRpbWUgc3BlbnQgYnkgdGhlIG1haW4gdGhyZWFkLgorSWYgdGhlIGJlbmNobWFyayBpdHNlbGYgdXNlcyB0aHJlYWRzIGludGVybmFsbHksIHRoaXMgbWVhc3VyZW1lbnQgbWF5IG5vdAorYmUgd2hhdCB5b3UgYXJlIGxvb2tpbmcgZm9yLiBJbnN0ZWFkLCB0aGVyZSBpcyBhIHdheSB0byBtZWFzdXJlIHRoZSB0b3RhbAorQ1BVIHVzYWdlIG9mIHRoZSBwcm9jZXNzLCBieSBhbGwgdGhlIHRocmVhZHMuCisKK2BgYGMrKwordm9pZCBjYWxsZWUoaW50IGkpOworCitzdGF0aWMgdm9pZCBNeU1haW4oaW50IHNpemUpIHsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvcgorICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIGNhbGxlZShpKTsKK30KKworc3RhdGljIHZvaWQgQk1fT3Blbk1QKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpCisgICAgTXlNYWluKHN0YXRlLnJhbmdlKDApKTsKK30KKworLy8gTWVhc3VyZSB0aGUgdGltZSBzcGVudCBieSB0aGUgbWFpbiB0aHJlYWQsIHVzZSBpdCB0byBkZWNpZGUgZm9yIGhvdyBsb25nIHRvCisvLyBydW4gdGhlIGJlbmNobWFyayBsb29wLiBEZXBlbmRpbmcgb24gdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCBtYXkKKy8vIG1lYXN1cmUgdG8gYW55d2hlcmUgZnJvbSBuZWFyLXplcm8gKHRoZSBvdmVyaGVhZCBzcGVudCBiZWZvcmUvYWZ0ZXIgd29yaworLy8gaGFuZG9mZiB0byB3b3JrZXIgdGhyZWFkW3NdKSB0byB0aGUgd2hvbGUgc2luZ2xlLXRocmVhZCB0aW1lLgorQkVOQ0hNQVJLKEJNX09wZW5NUCktPlJhbmdlKDgsIDg8PDEwKTsKKworLy8gTWVhc3VyZSB0aGUgdXNlci12aXNpYmxlIHRpbWUsIHRoZSB3YWxsIGNsb2NrIChsaXRlcmFsbHksIHRoZSB0aW1lIHRoYXQKKy8vIGhhcyBwYXNzZWQgb24gdGhlIGNsb2NrIG9uIHRoZSB3YWxsKSwgdXNlIGl0IHRvIGRlY2lkZSBmb3IgaG93IGxvbmcgdG8KKy8vIHJ1biB0aGUgYmVuY2htYXJrIGxvb3AuIFRoaXMgd2lsbCBhbHdheXMgYmUgbWVhbmluZ2Z1bCwgYW4gd2lsbCBtYXRjaCB0aGUKKy8vIHRpbWUgc3BlbnQgYnkgdGhlIG1haW4gdGhyZWFkIGluIHNpbmdsZS10aHJlYWRlZCBjYXNlLCBpbiBnZW5lcmFsIGRlY3JlYXNpbmcKKy8vIHdpdGggdGhlIG51bWJlciBvZiBpbnRlcm5hbCB0aHJlYWRzIGRvaW5nIHRoZSB3b3JrLgorQkVOQ0hNQVJLKEJNX09wZW5NUCktPlJhbmdlKDgsIDg8PDEwKS0+VXNlUmVhbFRpbWUoKTsKKworLy8gTWVhc3VyZSB0aGUgdG90YWwgQ1BVIGNvbnN1bXB0aW9uLCB1c2UgaXQgdG8gZGVjaWRlIGZvciBob3cgbG9uZyB0bworLy8gcnVuIHRoZSBiZW5jaG1hcmsgbG9vcC4gVGhpcyB3aWxsIGFsd2F5cyBtZWFzdXJlIHRvIG5vIGxlc3MgdGhhbiB0aGUKKy8vIHRpbWUgc3BlbnQgYnkgdGhlIG1haW4gdGhyZWFkIGluIHNpbmdsZS10aHJlYWRlZCBjYXNlLgorQkVOQ0hNQVJLKEJNX09wZW5NUCktPlJhbmdlKDgsIDg8PDEwKS0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCk7CisKKy8vIEEgbWl4dHVyZSBvZiB0aGUgbGFzdCB0d28uIE1lYXN1cmUgdGhlIHRvdGFsIENQVSBjb25zdW1wdGlvbiwgYnV0IHVzZSB0aGUKKy8vIHdhbGwgY2xvY2sgdG8gZGVjaWRlIGZvciBob3cgbG9uZyB0byBydW4gdGhlIGJlbmNobWFyayBsb29wLgorQkVOQ0hNQVJLKEJNX09wZW5NUCktPlJhbmdlKDgsIDg8PDEwKS0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCktPlVzZVJlYWxUaW1lKCk7CitgYGAKKworIyMjIyBDb250cm9sbGluZyBUaW1lcnMKKworTm9ybWFsbHksIHRoZSBlbnRpcmUgZHVyYXRpb24gb2YgdGhlIHdvcmsgbG9vcCAoYGZvciAoYXV0byBfIDogc3RhdGUpIHt9YCkKK2lzIG1lYXN1cmVkLiBCdXQgc29tZXRpbWVzLCBpdCBpcyBuZWNlc3NhcnkgdG8gZG8gc29tZSB3b3JrIGluc2lkZSBvZgordGhhdCBsb29wLCBldmVyeSBpdGVyYXRpb24sIGJ1dCB3aXRob3V0IGNvdW50aW5nIHRoYXQgdGltZSB0byB0aGUgYmVuY2htYXJrIHRpbWUuCitUaGF0IGlzIHBvc3NpYmxlLCBhbHRob3VnaCBpdCBpcyBub3QgcmVjb21tZW5kZWQsIHNpbmNlIGl0IGhhcyBoaWdoIG92ZXJoZWFkLgorCitgYGBjKysKK3N0YXRpYyB2b2lkIEJNX1NldEluc2VydF9XaXRoX1RpbWVyX0NvbnRyb2woYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RkOjpzZXQ8aW50PiBkYXRhOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsgLy8gU3RvcCB0aW1lcnMuIFRoZXkgd2lsbCBub3QgY291bnQgdW50aWwgdGhleSBhcmUgcmVzdW1lZC4KKyAgICBkYXRhID0gQ29uc3RydWN0UmFuZG9tU2V0KHN0YXRlLnJhbmdlKDApKTsgLy8gRG8gc29tZXRoaW5nIHRoYXQgc2hvdWxkIG5vdCBiZSBtZWFzdXJlZAorICAgIHN0YXRlLlJlc3VtZVRpbWluZygpOyAvLyBBbmQgcmVzdW1lIHRpbWVycy4gVGhleSBhcmUgbm93IGNvdW50aW5nIGFnYWluLgorICAgIC8vIFRoZSByZXN0IHdpbGwgYmUgbWVhc3VyZWQuCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdGF0ZS5yYW5nZSgxKTsgKytqKQorICAgICAgZGF0YS5pbnNlcnQoUmFuZG9tTnVtYmVyKCkpOworICB9Cit9CitCRU5DSE1BUksoQk1fU2V0SW5zZXJ0X1dpdGhfVGltZXJfQ29udHJvbCktPlJhbmdlcyh7ezE8PDEwLCA4PDwxMH0sIHsxMjgsIDUxMn19KTsKK2BgYAorCis8YSBuYW1lPSJtYW51YWwtdGltaW5nIiAvPgorCisjIyMgTWFudWFsIFRpbWluZworCitGb3IgYmVuY2htYXJraW5nIHNvbWV0aGluZyBmb3Igd2hpY2ggbmVpdGhlciBDUFUgdGltZSBub3IgcmVhbC10aW1lIGFyZQorY29ycmVjdCBvciBhY2N1cmF0ZSBlbm91Z2gsIGNvbXBsZXRlbHkgbWFudWFsIHRpbWluZyBpcyBzdXBwb3J0ZWQgdXNpbmcKK3RoZSBgVXNlTWFudWFsVGltZWAgZnVuY3Rpb24uCisKK1doZW4gYFVzZU1hbnVhbFRpbWVgIGlzIHVzZWQsIHRoZSBiZW5jaG1hcmtlZCBjb2RlIG11c3QgY2FsbAorYFNldEl0ZXJhdGlvblRpbWVgIG9uY2UgcGVyIGl0ZXJhdGlvbiBvZiB0aGUgYmVuY2htYXJrIGxvb3AgdG8KK3JlcG9ydCB0aGUgbWFudWFsbHkgbWVhc3VyZWQgdGltZS4KKworQW4gZXhhbXBsZSB1c2UgY2FzZSBmb3IgdGhpcyBpcyBiZW5jaG1hcmtpbmcgR1BVIGV4ZWN1dGlvbiAoZS5nLiBPcGVuQ0wKK29yIENVREEga2VybmVscywgT3BlbkdMIG9yIFZ1bGthbiBvciBEaXJlY3QzRCBkcmF3IGNhbGxzKSwgd2hpY2ggY2Fubm90CitiZSBhY2N1cmF0ZWx5IG1lYXN1cmVkIHVzaW5nIENQVSB0aW1lIG9yIHJlYWwtdGltZS4gSW5zdGVhZCwgdGhleSBjYW4gYmUKK21lYXN1cmVkIGFjY3VyYXRlbHkgdXNpbmcgYSBkZWRpY2F0ZWQgQVBJLCBhbmQgdGhlc2UgbWVhc3VyZW1lbnQgcmVzdWx0cworY2FuIGJlIHJlcG9ydGVkIGJhY2sgd2l0aCBgU2V0SXRlcmF0aW9uVGltZWAuCisKK2BgYGMrKworc3RhdGljIHZvaWQgQk1fTWFudWFsVGltaW5nKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGludCBtaWNyb3NlY29uZHMgPSBzdGF0ZS5yYW5nZSgwKTsKKyAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWNybz4gc2xlZXBfZHVyYXRpb24geworICAgIHN0YXRpY19jYXN0PGRvdWJsZT4obWljcm9zZWNvbmRzKQorICB9OworCisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgLy8gU2ltdWxhdGUgc29tZSB1c2VmdWwgd29ya2xvYWQgd2l0aCBhIHNsZWVwCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHNsZWVwX2R1cmF0aW9uKTsKKyAgICBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworCisgICAgYXV0byBlbGFwc2VkX3NlY29uZHMgPQorICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4+KAorICAgICAgICBlbmQgLSBzdGFydCk7CisKKyAgICBzdGF0ZS5TZXRJdGVyYXRpb25UaW1lKGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpKTsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX01hbnVhbFRpbWluZyktPlJhbmdlKDEsIDE8PDE3KS0+VXNlTWFudWFsVGltZSgpOworYGBgCisKKzxhIG5hbWU9InNldHRpbmctdGhlLXRpbWUtdW5pdCIgLz4KKworIyMjIFNldHRpbmcgdGhlIFRpbWUgVW5pdAorCitJZiBhIGJlbmNobWFyayBydW5zIGEgZmV3IG1pbGxpc2Vjb25kcyBpdCBtYXkgYmUgaGFyZCB0byB2aXN1YWxseSBjb21wYXJlIHRoZQorbWVhc3VyZWQgdGltZXMsIHNpbmNlIHRoZSBvdXRwdXQgZGF0YSBpcyBnaXZlbiBpbiBuYW5vc2Vjb25kcyBwZXIgZGVmYXVsdC4gSW4KK29yZGVyIHRvIG1hbnVhbGx5IHNldCB0aGUgdGltZSB1bml0LCB5b3UgY2FuIHNwZWNpZnkgaXQgbWFudWFsbHk6CisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX3Rlc3QpLT5Vbml0KGJlbmNobWFyazo6a01pbGxpc2Vjb25kKTsKK2BgYAorCis8YSBuYW1lPSJwcmV2ZW50aW5nLW9wdGltaXphdGlvbiIgLz4KKworIyMjIFByZXZlbnRpbmcgT3B0aW1pemF0aW9uCisKK1RvIHByZXZlbnQgYSB2YWx1ZSBvciBleHByZXNzaW9uIGZyb20gYmVpbmcgb3B0aW1pemVkIGF3YXkgYnkgdGhlIGNvbXBpbGVyCit0aGUgYGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSguLi4pYCBhbmQgYGJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpYAorZnVuY3Rpb25zIGNhbiBiZSB1c2VkLgorCitgYGBjKysKK3N0YXRpYyB2b2lkIEJNX3Rlc3QoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgICAgaW50IHggPSAwOworICAgICAgZm9yIChpbnQgaT0wOyBpIDwgNjQ7ICsraSkgeworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoeCArPSBpKTsKKyAgICAgIH0KKyAgfQorfQorYGBgCisKK2BEb05vdE9wdGltaXplKDxleHByPilgIGZvcmNlcyB0aGUgICpyZXN1bHQqIG9mIGA8ZXhwcj5gIHRvIGJlIHN0b3JlZCBpbiBlaXRoZXIKK21lbW9yeSBvciBhIHJlZ2lzdGVyLiBGb3IgR05VIGJhc2VkIGNvbXBpbGVycyBpdCBhY3RzIGFzIHJlYWQvd3JpdGUgYmFycmllcgorZm9yIGdsb2JhbCBtZW1vcnkuIE1vcmUgc3BlY2lmaWNhbGx5IGl0IGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gZmx1c2ggcGVuZGluZword3JpdGVzIHRvIG1lbW9yeSBhbmQgcmVsb2FkIGFueSBvdGhlciB2YWx1ZXMgYXMgbmVjZXNzYXJ5LgorCitOb3RlIHRoYXQgYERvTm90T3B0aW1pemUoPGV4cHI+KWAgZG9lcyBub3QgcHJldmVudCBvcHRpbWl6YXRpb25zIG9uIGA8ZXhwcj5gCitpbiBhbnkgd2F5LiBgPGV4cHI+YCBtYXkgZXZlbiBiZSByZW1vdmVkIGVudGlyZWx5IHdoZW4gdGhlIHJlc3VsdCBpcyBhbHJlYWR5Citrbm93bi4gRm9yIGV4YW1wbGU6CisKK2BgYGMrKworICAvKiBFeGFtcGxlIDE6IGA8ZXhwcj5gIGlzIHJlbW92ZWQgZW50aXJlbHkuICovCisgIGludCBmb28oaW50IHgpIHsgcmV0dXJuIHggKyA0MjsgfQorICB3aGlsZSAoLi4uKSBEb05vdE9wdGltaXplKGZvbygwKSk7IC8vIE9wdGltaXplZCB0byBEb05vdE9wdGltaXplKDQyKTsKKworICAvKiAgRXhhbXBsZSAyOiBSZXN1bHQgb2YgJzxleHByPicgaXMgb25seSByZXVzZWQgKi8KKyAgaW50IGJhcihpbnQpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7CisgIHdoaWxlICguLi4pIERvTm90T3B0aW1pemUoYmFyKDApKTsgLy8gT3B0aW1pemVkIHRvOgorICAvLyBpbnQgX19yZXN1bHRfXyA9IGJhcigwKTsKKyAgLy8gd2hpbGUgKC4uLikgRG9Ob3RPcHRpbWl6ZShfX3Jlc3VsdF9fKTsKK2BgYAorCitUaGUgc2Vjb25kIHRvb2wgZm9yIHByZXZlbnRpbmcgb3B0aW1pemF0aW9ucyBpcyBgQ2xvYmJlck1lbW9yeSgpYC4gSW4gZXNzZW5jZQorYENsb2JiZXJNZW1vcnkoKWAgZm9yY2VzIHRoZSBjb21waWxlciB0byBwZXJmb3JtIGFsbCBwZW5kaW5nIHdyaXRlcyB0byBnbG9iYWwKK21lbW9yeS4gTWVtb3J5IG1hbmFnZWQgYnkgYmxvY2sgc2NvcGUgb2JqZWN0cyBtdXN0IGJlICJlc2NhcGVkIiB1c2luZworYERvTm90T3B0aW1pemUoLi4uKWAgYmVmb3JlIGl0IGNhbiBiZSBjbG9iYmVyZWQuIEluIHRoZSBiZWxvdyBleGFtcGxlCitgQ2xvYmJlck1lbW9yeSgpYCBwcmV2ZW50cyB0aGUgY2FsbCB0byBgdi5wdXNoX2JhY2soNDIpYCBmcm9tIGJlaW5nIG9wdGltaXplZAorYXdheS4KKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV92ZWN0b3JfcHVzaF9iYWNrKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgICAgdi5yZXNlcnZlKDEpOworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh2LmRhdGEoKSk7IC8vIEFsbG93IHYuZGF0YSgpIHRvIGJlIGNsb2JiZXJlZC4KKyAgICB2LnB1c2hfYmFjayg0Mik7CisgICAgYmVuY2htYXJrOjpDbG9iYmVyTWVtb3J5KCk7IC8vIEZvcmNlIDQyIHRvIGJlIHdyaXR0ZW4gdG8gbWVtb3J5LgorICB9Cit9CitgYGAKKworTm90ZSB0aGF0IGBDbG9iYmVyTWVtb3J5KClgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBHTlUgb3IgTVNWQyBiYXNlZCBjb21waWxlcnMuCisKKzxhIG5hbWU9InJlcG9ydGluZy1zdGF0aXN0aWNzIiAvPgorCisjIyMgU3RhdGlzdGljczogUmVwb3J0aW5nIHRoZSBNZWFuLCBNZWRpYW4gYW5kIFN0YW5kYXJkIERldmlhdGlvbiBvZiBSZXBlYXRlZCBCZW5jaG1hcmtzCisKK0J5IGRlZmF1bHQgZWFjaCBiZW5jaG1hcmsgaXMgcnVuIG9uY2UgYW5kIHRoYXQgc2luZ2xlIHJlc3VsdCBpcyByZXBvcnRlZC4KK0hvd2V2ZXIgYmVuY2htYXJrcyBhcmUgb2Z0ZW4gbm9pc3kgYW5kIGEgc2luZ2xlIHJlc3VsdCBtYXkgbm90IGJlIHJlcHJlc2VudGF0aXZlCitvZiB0aGUgb3ZlcmFsbCBiZWhhdmlvci4gRm9yIHRoaXMgcmVhc29uIGl0J3MgcG9zc2libGUgdG8gcmVwZWF0ZWRseSByZXJ1biB0aGUKK2JlbmNobWFyay4KKworVGhlIG51bWJlciBvZiBydW5zIG9mIGVhY2ggYmVuY2htYXJrIGlzIHNwZWNpZmllZCBnbG9iYWxseSBieSB0aGUKK2AtLWJlbmNobWFya19yZXBldGl0aW9uc2AgZmxhZyBvciBvbiBhIHBlciBiZW5jaG1hcmsgYmFzaXMgYnkgY2FsbGluZworYFJlcGV0aXRpb25zYCBvbiB0aGUgcmVnaXN0ZXJlZCBiZW5jaG1hcmsgb2JqZWN0LiBXaGVuIGEgYmVuY2htYXJrIGlzIHJ1biBtb3JlCit0aGFuIG9uY2UgdGhlIG1lYW4sIG1lZGlhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBydW5zIHdpbGwgYmUgcmVwb3J0ZWQuCisKK0FkZGl0aW9uYWxseSB0aGUgYC0tYmVuY2htYXJrX3JlcG9ydF9hZ2dyZWdhdGVzX29ubHk9e3RydWV8ZmFsc2V9YCwKK2AtLWJlbmNobWFya19kaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seT17dHJ1ZXxmYWxzZX1gIGZsYWdzIG9yCitgUmVwb3J0QWdncmVnYXRlc09ubHkoYm9vbClgLCBgRGlzcGxheUFnZ3JlZ2F0ZXNPbmx5KGJvb2wpYCBmdW5jdGlvbnMgY2FuIGJlCit1c2VkIHRvIGNoYW5nZSBob3cgcmVwZWF0ZWQgdGVzdHMgYXJlIHJlcG9ydGVkLiBCeSBkZWZhdWx0IHRoZSByZXN1bHQgb2YgZWFjaAorcmVwZWF0ZWQgcnVuIGlzIHJlcG9ydGVkLiBXaGVuIGByZXBvcnQgYWdncmVnYXRlcyBvbmx5YCBvcHRpb24gaXMgYHRydWVgLAorb25seSB0aGUgYWdncmVnYXRlcyAoaS5lLiBtZWFuLCBtZWRpYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiwgbWF5YmUgY29tcGxleGl0eQorbWVhc3VyZW1lbnRzIGlmIHRoZXkgd2VyZSByZXF1ZXN0ZWQpIG9mIHRoZSBydW5zIGlzIHJlcG9ydGVkLCB0byBib3RoIHRoZQorcmVwb3J0ZXJzIC0gc3RhbmRhcmQgb3V0cHV0IChjb25zb2xlKSwgYW5kIHRoZSBmaWxlLgorSG93ZXZlciB3aGVuIG9ubHkgdGhlIGBkaXNwbGF5IGFnZ3JlZ2F0ZXMgb25seWAgb3B0aW9uIGlzIGB0cnVlYCwKK29ubHkgdGhlIGFnZ3JlZ2F0ZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCB3aGlsZSB0aGUgZmlsZQorb3V0cHV0IHN0aWxsIGNvbnRhaW5zIGV2ZXJ5dGhpbmcuCitDYWxsaW5nIGBSZXBvcnRBZ2dyZWdhdGVzT25seShib29sKWAgLyBgRGlzcGxheUFnZ3JlZ2F0ZXNPbmx5KGJvb2wpYCBvbiBhCityZWdpc3RlcmVkIGJlbmNobWFyayBvYmplY3Qgb3ZlcnJpZGVzIHRoZSB2YWx1ZSBvZiB0aGUgYXBwcm9wcmlhdGUgZmxhZyBmb3IgdGhhdAorYmVuY2htYXJrLgorCis8YSBuYW1lPSJjdXN0b20tc3RhdGlzdGljcyIgLz4KKworIyMjIEN1c3RvbSBTdGF0aXN0aWNzCisKK1doaWxlIGhhdmluZyBtZWFuLCBtZWRpYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBuaWNlLCB0aGlzIG1heSBub3QgYmUKK2Vub3VnaCBmb3IgZXZlcnlvbmUuIEZvciBleGFtcGxlIHlvdSBtYXkgd2FudCB0byBrbm93IHdoYXQgdGhlIGxhcmdlc3QKK29ic2VydmF0aW9uIGlzLCBlLmcuIGJlY2F1c2UgeW91IGhhdmUgc29tZSByZWFsLXRpbWUgY29uc3RyYWludHMuIFRoaXMgaXMgZWFzeS4KK1RoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHNwZWNpZnkgYSBjdXN0b20gc3RhdGlzdGljIHRvIGJlIGNhbGN1bGF0ZWQsIGRlZmluZWQKK2J5IGEgbGFtYmRhIGZ1bmN0aW9uLgorCitgYGBjKysKK3ZvaWQgQk1fc3Bpbl9lbXB0eShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCBzdGF0ZS5yYW5nZSgwKTsgKyt4KSB7CisgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoeCk7CisgICAgfQorICB9Cit9CisKK0JFTkNITUFSSyhCTV9zcGluX2VtcHR5KQorICAtPkNvbXB1dGVTdGF0aXN0aWNzKCJtYXgiLCBbXShjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB2KSAtPiBkb3VibGUgeworICAgIHJldHVybiAqKHN0ZDo6bWF4X2VsZW1lbnQoc3RkOjpiZWdpbih2KSwgc3RkOjplbmQodikpKTsKKyAgfSkKKyAgLT5BcmcoNTEyKTsKK2BgYAorCis8YSBuYW1lPSJ1c2luZy1yZWdpc3Rlci1iZW5jaG1hcmsiIC8+CisKKyMjIyBVc2luZyBSZWdpc3RlckJlbmNobWFyayhuYW1lLCBmbiwgYXJncy4uLikKKworVGhlIGBSZWdpc3RlckJlbmNobWFyayhuYW1lLCBmdW5jLCBhcmdzLi4uKWAgZnVuY3Rpb24gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUKK3dheSB0byBjcmVhdGUgYW5kIHJlZ2lzdGVyIGJlbmNobWFya3MuCitgUmVnaXN0ZXJCZW5jaG1hcmsobmFtZSwgZnVuYywgYXJncy4uLilgIGNyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIHJldHVybnMgYQorcG9pbnRlciB0byBhIG5ldyBiZW5jaG1hcmsgd2l0aCB0aGUgc3BlY2lmaWVkIGBuYW1lYCB0aGF0IGludm9rZXMKK2BmdW5jKHN0LCBhcmdzLi4uKWAgd2hlcmUgYHN0YCBpcyBhIGBiZW5jaG1hcms6OlN0YXRlYCBvYmplY3QuCisKK1VubGlrZSB0aGUgYEJFTkNITUFSS2AgcmVnaXN0cmF0aW9uIG1hY3Jvcywgd2hpY2ggY2FuIG9ubHkgYmUgdXNlZCBhdCB0aGUgZ2xvYmFsCitzY29wZSwgdGhlIGBSZWdpc3RlckJlbmNobWFya2AgY2FuIGJlIGNhbGxlZCBhbnl3aGVyZS4gVGhpcyBhbGxvd3MgZm9yCitiZW5jaG1hcmsgdGVzdHMgdG8gYmUgcmVnaXN0ZXJlZCBwcm9ncmFtbWF0aWNhbGx5LgorCitBZGRpdGlvbmFsbHkgYFJlZ2lzdGVyQmVuY2htYXJrYCBhbGxvd3MgYW55IGNhbGxhYmxlIG9iamVjdCB0byBiZSByZWdpc3RlcmVkCithcyBhIGJlbmNobWFyay4gSW5jbHVkaW5nIGNhcHR1cmluZyBsYW1iZGFzIGFuZCBmdW5jdGlvbiBvYmplY3RzLgorCitGb3IgRXhhbXBsZToKK2BgYGMrKworYXV0byBCTV90ZXN0ID0gW10oYmVuY2htYXJrOjpTdGF0ZSYgc3QsIGF1dG8gSW5wdXRzKSB7IC8qIC4uLiAqLyB9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgZm9yIChhdXRvJiB0ZXN0X2lucHV0IDogeyAvKiAuLi4gKi8gfSkKKyAgICAgIGJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsodGVzdF9pbnB1dC5uYW1lKCksIEJNX3Rlc3QsIHRlc3RfaW5wdXQpOworICBiZW5jaG1hcms6OkluaXRpYWxpemUoJmFyZ2MsIGFyZ3YpOworICBiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoKTsKK30KK2BgYAorCis8YSBuYW1lPSJleGl0aW5nLXdpdGgtYW4tZXJyb3IiIC8+CisKKyMjIyBFeGl0aW5nIHdpdGggYW4gRXJyb3IKKworV2hlbiBlcnJvcnMgY2F1c2VkIGJ5IGV4dGVybmFsIGluZmx1ZW5jZXMsIHN1Y2ggYXMgZmlsZSBJL08gYW5kIG5ldHdvcmsKK2NvbW11bmljYXRpb24sIG9jY3VyIHdpdGhpbiBhIGJlbmNobWFyayB0aGUKK2BTdGF0ZTo6U2tpcFdpdGhFcnJvcihjb25zdCBjaGFyKiBtc2cpYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBza2lwIHRoYXQgcnVuCitvZiBiZW5jaG1hcmsgYW5kIHJlcG9ydCB0aGUgZXJyb3IuIE5vdGUgdGhhdCBvbmx5IGZ1dHVyZSBpdGVyYXRpb25zIG9mIHRoZQorYEtlZXBSdW5uaW5nKClgIGFyZSBza2lwcGVkLiBGb3IgdGhlIHJhbmdlZC1mb3IgdmVyc2lvbiBvZiB0aGUgYmVuY2htYXJrIGxvb3AKK1VzZXJzIG11c3QgZXhwbGljaXRseSBleGl0IHRoZSBsb29wLCBvdGhlcndpc2UgYWxsIGl0ZXJhdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQuCitVc2VycyBtYXkgZXhwbGljaXRseSByZXR1cm4gdG8gZXhpdCB0aGUgYmVuY2htYXJrIGltbWVkaWF0ZWx5LgorCitUaGUgYFNraXBXaXRoRXJyb3IoLi4uKWAgZnVuY3Rpb24gbWF5IGJlIHVzZWQgYXQgYW55IHBvaW50IHdpdGhpbiB0aGUgYmVuY2htYXJrLAoraW5jbHVkaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGJlbmNobWFyayBsb29wLgorCitGb3IgZXhhbXBsZToKKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV90ZXN0KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGF1dG8gcmVzb3VyY2UgPSBHZXRSZXNvdXJjZSgpOworICBpZiAoIXJlc291cmNlLmdvb2QoKSkgeworICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiUmVzb3VyY2UgaXMgbm90IGdvb2QhIik7CisgICAgICAvLyBLZWVwUnVubmluZygpIGxvb3Agd2lsbCBub3QgYmUgZW50ZXJlZC4KKyAgfQorICB3aGlsZSAoc3RhdGUuS2VlcFJ1bm5pbmcoKSkgeworICAgICAgYXV0byBkYXRhID0gcmVzb3VyY2UucmVhZF9kYXRhKCk7CisgICAgICBpZiAoIXJlc291cmNlLmdvb2QoKSkgeworICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJGYWlsZWQgdG8gcmVhZCBkYXRhISIpOworICAgICAgICBicmVhazsgLy8gTmVlZGVkIHRvIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGl0ZXJhdGlvbi4KKyAgICAgfQorICAgICBkb19zdHVmZihkYXRhKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBCTV90ZXN0X3JhbmdlZF9mbyhiZW5jaG1hcms6OlN0YXRlICYgc3RhdGUpIHsKKyAgc3RhdGUuU2tpcFdpdGhFcnJvcigidGVzdCB3aWxsIG5vdCBiZSBlbnRlcmVkIik7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJGYWlsZWQhIik7CisgICAgYnJlYWs7IC8vIFJFUVVJUkVEIHRvIHByZXZlbnQgYWxsIGZ1cnRoZXIgaXRlcmF0aW9ucy4KKyAgfQorfQorYGBgCis8YSBuYW1lPSJhLWZhc3Rlci1rZWVwLXJ1bm5pbmctbG9vcCIgLz4KKworIyMjIEEgRmFzdGVyIEtlZXBSdW5uaW5nIExvb3AKKworSW4gQysrMTEgbW9kZSwgYSByYW5nZWQtYmFzZWQgZm9yIGxvb3Agc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0bwordGhlIGBLZWVwUnVubmluZ2AgbG9vcCBmb3IgcnVubmluZyB0aGUgYmVuY2htYXJrcy4gRm9yIGV4YW1wbGU6CisKK2BgYGMrKworc3RhdGljIHZvaWQgQk1fRmFzdChiZW5jaG1hcms6OlN0YXRlICZzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgRmFzdE9wZXJhdGlvbigpOworICB9Cit9CitCRU5DSE1BUksoQk1fRmFzdCk7CitgYGAKKworVGhlIHJlYXNvbiB0aGUgcmFuZ2VkLWZvciBsb29wIGlzIGZhc3RlciB0aGFuIHVzaW5nIGBLZWVwUnVubmluZ2AsIGlzCitiZWNhdXNlIGBLZWVwUnVubmluZ2AgcmVxdWlyZXMgYSBtZW1vcnkgbG9hZCBhbmQgc3RvcmUgb2YgdGhlIGl0ZXJhdGlvbiBjb3VudAorZXZlciBpdGVyYXRpb24sIHdoZXJlYXMgdGhlIHJhbmdlZC1mb3IgdmFyaWFudCBpcyBhYmxlIHRvIGtlZXAgdGhlIGl0ZXJhdGlvbiBjb3VudAoraW4gYSByZWdpc3Rlci4KKworRm9yIGV4YW1wbGUsIGFuIGVtcHR5IGlubmVyIGxvb3Agb2YgdXNpbmcgdGhlIHJhbmdlZC1iYXNlZCBmb3IgbWV0aG9kIGxvb2tzIGxpa2U6CisKK2BgYGFzbQorIyBMb29wIEluaXQKKyAgbW92IHJieCwgcXdvcmQgcHRyIFtyMTQgKyAxMDRdCisgIGNhbGwgYmVuY2htYXJrOjpTdGF0ZTo6U3RhcnRLZWVwUnVubmluZygpCisgIHRlc3QgcmJ4LCByYngKKyAgamUgLkxvb3BFbmQKKy5Mb29wSGVhZGVyOiAjID0+VGhpcyBJbm5lciBMb29wIEhlYWRlcjogRGVwdGg9MQorICBhZGQgcmJ4LCAtMQorICBqbmUgLkxvb3BIZWFkZXIKKy5Mb29wRW5kOgorYGBgCisKK0NvbXBhcmVkIHRvIGFuIGVtcHR5IGBLZWVwUnVubmluZ2AgbG9vcCwgd2hpY2ggbG9va3MgbGlrZToKKworYGBgYXNtCisuTG9vcEhlYWRlcjogIyBpbiBMb29wOiBIZWFkZXI9QkIwXzMgRGVwdGg9MQorICBjbXAgYnl0ZSBwdHIgW3JieF0sIDEKKyAgam5lIC5Mb29wSW5pdAorLkxvb3BCb2R5OiAjID0+VGhpcyBJbm5lciBMb29wIEhlYWRlcjogRGVwdGg9MQorICBtb3YgcmF4LCBxd29yZCBwdHIgW3JieCArIDhdCisgIGxlYSByY3gsIFtyYXggKyAxXQorICBtb3YgcXdvcmQgcHRyIFtyYnggKyA4XSwgcmN4CisgIGNtcCByYXgsIHF3b3JkIHB0ciBbcmJ4ICsgMTA0XQorICBqYiAuTG9vcEhlYWRlcgorICBqbXAgLkxvb3BFbmQKKy5Mb29wSW5pdDoKKyAgbW92IHJkaSwgcmJ4CisgIGNhbGwgYmVuY2htYXJrOjpTdGF0ZTo6U3RhcnRLZWVwUnVubmluZygpCisgIGptcCAuTG9vcEJvZHkKKy5Mb29wRW5kOgorYGBgCisKK1VubGVzcyBDKyswMyBjb21wYXRpYmlsaXR5IGlzIHJlcXVpcmVkLCB0aGUgcmFuZ2VkLWZvciB2YXJpYW50IG9mIHdyaXRpbmcKK3RoZSBiZW5jaG1hcmsgbG9vcCBzaG91bGQgYmUgcHJlZmVycmVkLgorCis8YSBuYW1lPSJkaXNhYmxpbmctY3B1LWZyZXF1ZW5jeS1zY2FsaW5nIiAvPgorCisjIyMgRGlzYWJsaW5nIENQVSBGcmVxdWVuY3kgU2NhbGluZworCitJZiB5b3Ugc2VlIHRoaXMgZXJyb3I6CisKK2BgYAorKioqV0FSTklORyoqKiBDUFUgc2NhbGluZyBpcyBlbmFibGVkLCB0aGUgYmVuY2htYXJrIHJlYWwgdGltZSBtZWFzdXJlbWVudHMgbWF5IGJlIG5vaXN5IGFuZCB3aWxsIGluY3VyIGV4dHJhIG92ZXJoZWFkLgorYGBgCisKK3lvdSBtaWdodCB3YW50IHRvIGRpc2FibGUgdGhlIENQVSBmcmVxdWVuY3kgc2NhbGluZyB3aGlsZSBydW5uaW5nIHRoZSBiZW5jaG1hcms6CisKK2BgYGJhc2gKK3N1ZG8gY3B1cG93ZXIgZnJlcXVlbmN5LXNldCAtLWdvdmVybm9yIHBlcmZvcm1hbmNlCisuL215YmVuY2gKK3N1ZG8gY3B1cG93ZXIgZnJlcXVlbmN5LXNldCAtLWdvdmVybm9yIHBvd2Vyc2F2ZQorYGBgCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9XT1JLU1BBQ0UgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9XT1JLU1BBQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmMjQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL1dPUktTUEFDRQpAQCAtMCwwICsxLDE1IEBACit3b3Jrc3BhY2UobmFtZSA9ICJjb21fZ2l0aHViX2dvb2dsZV9iZW5jaG1hcmsiKQorCitsb2FkKCJAYmF6ZWxfdG9vbHMvL3Rvb2xzL2J1aWxkX2RlZnMvcmVwbzpodHRwLmJ6bCIsICJodHRwX2FyY2hpdmUiKQorCitodHRwX2FyY2hpdmUoCisgICAgbmFtZSA9ICJydWxlc19jYyIsCisgICAgc3RyaXBfcHJlZml4ID0gInJ1bGVzX2NjLWE1MDgyMzVkZjkyZTcxZDUzN2ZjYmFlMGM3Yzk1MmVhNjk1N2E5MTIiLAorICAgIHVybHMgPSBbImh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL3J1bGVzX2NjL2FyY2hpdmUvYTUwODIzNWRmOTJlNzFkNTM3ZmNiYWUwYzdjOTUyZWE2OTU3YTkxMi56aXAiXSwKKykKKworaHR0cF9hcmNoaXZlKAorICAgIG5hbWUgPSAiY29tX2dvb2dsZV9nb29nbGV0ZXN0IiwKKyAgICBzdHJpcF9wcmVmaXggPSAiZ29vZ2xldGVzdC0zZjBjZjZiNjJhZDFlYjUwZDg3MzY1MzgzNjNkMzU4MGRkNjQwYzNlIiwKKyAgICB1cmxzID0gWyJodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QvYXJjaGl2ZS8zZjBjZjZiNjJhZDFlYjUwZDg3MzY1MzgzNjNkMzU4MGRkNjQwYzNlLnppcCJdLAorKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvX2NvbmZpZy55bWwgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9fY29uZmlnLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg1NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvX2NvbmZpZy55bWwKQEAgLTAsMCArMSBAQAordGhlbWU6IGpla3lsbC10aGVtZS1taWRuaWdodApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2FwcHZleW9yLnltbCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2FwcHZleW9yLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRhOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvYXBwdmV5b3IueW1sCkBAIC0wLDAgKzEsNTAgQEAKK3ZlcnNpb246ICd7YnVpbGR9JworCitpbWFnZTogVmlzdWFsIFN0dWRpbyAyMDE3CisKK2NvbmZpZ3VyYXRpb246CisgIC0gRGVidWcKKyAgLSBSZWxlYXNlCisKK2Vudmlyb25tZW50OgorICBtYXRyaXg6CisgICAgLSBjb21waWxlcjogbXN2Yy0xNS1zZWgKKyAgICAgIGdlbmVyYXRvcjogIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyIKKworICAgIC0gY29tcGlsZXI6IG1zdmMtMTUtc2VoCisgICAgICBnZW5lcmF0b3I6ICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgV2luNjQiCisKKyAgICAtIGNvbXBpbGVyOiBtc3ZjLTE0LXNlaAorICAgICAgZ2VuZXJhdG9yOiAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IgorCisgICAgLSBjb21waWxlcjogbXN2Yy0xNC1zZWgKKyAgICAgIGdlbmVyYXRvcjogIlZpc3VhbCBTdHVkaW8gMTQgMjAxNSBXaW42NCIKKworICAgIC0gY29tcGlsZXI6IGdjYy01LjMuMC1wb3NpeAorICAgICAgZ2VuZXJhdG9yOiAiTWluR1cgTWFrZWZpbGVzIgorICAgICAgY3h4X3BhdGg6ICdDOlxtaW5ndy13NjRcaTY4Ni01LjMuMC1wb3NpeC1kd2FyZi1ydF92NC1yZXYwXG1pbmd3MzJcYmluJworICAgICAgQVBQVkVZT1JfQlVJTERfV09SS0VSX0lNQUdFOiBWaXN1YWwgU3R1ZGlvIDIwMTUKKworbWF0cml4OgorICBmYXN0X2ZpbmlzaDogdHJ1ZQorCitpbnN0YWxsOgorICAjIGdpdCBiYXNoIGNvbmZsaWN0cyB3aXRoIE1pbkdXIG1ha2VmaWxlcworICAtIGlmICIlZ2VuZXJhdG9yJSI9PSJNaW5HVyBNYWtlZmlsZXMiIChzZXQgIlBBVEg9JVBBVEg6QzpcUHJvZ3JhbSBGaWxlc1xHaXRcdXNyXGJpbjs9JSIpCisgIC0gaWYgbm90ICIlY3h4X3BhdGglIj09IiIgKHNldCAiUEFUSD0lUEFUSCU7JWN4eF9wYXRoJSIpCisKK2J1aWxkX3NjcmlwdDoKKyAgLSBtZCBfYnVpbGQgLUZvcmNlCisgIC0gY2QgX2J1aWxkCisgIC0gZWNobyAlY29uZmlndXJhdGlvbiUKKyAgLSBjbWFrZSAtRyAiJWdlbmVyYXRvciUiICItRENNQUtFX0JVSUxEX1RZUEU9JWNvbmZpZ3VyYXRpb24lIiAtREJFTkNITUFSS19ET1dOTE9BRF9ERVBFTkRFTkNJRVM9T04gLi4KKyAgLSBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJWNvbmZpZ3VyYXRpb24lCisKK3Rlc3Rfc2NyaXB0OgorICAtIGN0ZXN0IC0tYnVpbGQtY29uZmlnICVjb25maWd1cmF0aW9uJSAtLXRpbWVvdXQgMzAwIC0tb3V0cHV0LW9uLWZhaWx1cmUKKworYXJ0aWZhY3RzOgorICAtIHBhdGg6ICdfYnVpbGQvQ01ha2VGaWxlcy8qLmxvZycKKyAgICBuYW1lOiBsb2dzCisgIC0gcGF0aDogJ19idWlsZC9UZXN0aW5nLyoqLyoueG1sJworICAgIG5hbWU6IHRlc3RfcmVzdWx0cwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvQWRkQ1hYQ29tcGlsZXJGbGFnLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvQWRkQ1hYQ29tcGlsZXJGbGFnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDIwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9BZGRDWFhDb21waWxlckZsYWcuY21ha2UKQEAgLTAsMCArMSw3NCBAQAorIyAtIEFkZHMgYSBjb21waWxlciBmbGFnIGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUgY29tcGlsZXIKKyMKKyMgVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhhdCB0aGUgc3VwcGxpZWQgY29tcGlsZXIgZmxhZyBpcyBzdXBwb3J0ZWQgYW5kIHRoZW4KKyMgYWRkcyBpdCB0byB0aGUgY29ycmVzcG9uZGluZyBjb21waWxlciBmbGFncworIworIyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKDxGTEFHPiBbPFZBUklBTlQ+XSkKKyMKKyMgLSBFeGFtcGxlCisjCisjIGluY2x1ZGUoQWRkQ1hYQ29tcGlsZXJGbGFnKQorIyBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLVdhbGwpCisjIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtbm8tc3RyaWN0LWFsaWFzaW5nIFJFTEVBU0UpCisjIFJlcXVpcmVzIENNYWtlIDIuNisKKworaWYoX19hZGRfY3h4X2NvbXBpbGVyX2ZsYWcpCisgIHJldHVybigpCitlbmRpZigpCitzZXQoX19hZGRfY3h4X2NvbXBpbGVyX2ZsYWcgSU5DTFVERUQpCisKK2luY2x1ZGUoQ2hlY2tDWFhDb21waWxlckZsYWcpCisKK2Z1bmN0aW9uKG1hbmdsZV9jb21waWxlcl9mbGFnIEZMQUcgT1VUUFVUKQorICBzdHJpbmcoVE9VUFBFUiAiSEFWRV9DWFhfRkxBR18ke0ZMQUd9IiBTQU5JVElaRURfRkxBRykKKyAgc3RyaW5nKFJFUExBQ0UgIisiICJYIiBTQU5JVElaRURfRkxBRyAke1NBTklUSVpFRF9GTEFHfSkKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlteQS1aYS16XzAtOV0iICJfIiBTQU5JVElaRURfRkxBRyAke1NBTklUSVpFRF9GTEFHfSkKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl8rIiAiXyIgU0FOSVRJWkVEX0ZMQUcgJHtTQU5JVElaRURfRkxBR30pCisgIHNldCgke09VVFBVVH0gIiR7U0FOSVRJWkVEX0ZMQUd9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbihtYW5nbGVfY29tcGlsZXJfZmxhZykKKworZnVuY3Rpb24oYWRkX2N4eF9jb21waWxlcl9mbGFnIEZMQUcpCisgIG1hbmdsZV9jb21waWxlcl9mbGFnKCIke0ZMQUd9IiBNQU5HTEVEX0ZMQUcpCisgIHNldChPTERfQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7Q01BS0VfUkVRVUlSRURfRkxBR1N9IikKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSAke0ZMQUd9IikKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIiR7RkxBR30iICR7TUFOR0xFRF9GTEFHfSkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke09MRF9DTUFLRV9SRVFVSVJFRF9GTEFHU30iKQorICBpZigke01BTkdMRURfRkxBR30pCisgICAgc2V0KFZBUklBTlQgJHtBUkdWMX0pCisgICAgaWYoQVJHVjEpCisgICAgICBzdHJpbmcoVE9VUFBFUiAiXyR7VkFSSUFOVH0iIFZBUklBTlQpCisgICAgZW5kaWYoKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1Mke1ZBUklBTlR9ICIke0NNQUtFX0NYWF9GTEFHUyR7VkFSSUFOVH19ICR7QkVOQ0hNQVJLX0NYWF9GTEFHUyR7VkFSSUFOVH19ICR7RkxBR30iIFBBUkVOVF9TQ09QRSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCitmdW5jdGlvbihhZGRfcmVxdWlyZWRfY3h4X2NvbXBpbGVyX2ZsYWcgRkxBRykKKyAgbWFuZ2xlX2NvbXBpbGVyX2ZsYWcoIiR7RkxBR30iIE1BTkdMRURfRkxBRykKKyAgc2V0KE9MRF9DTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtDTUFLRV9SRVFVSVJFRF9GTEFHU30iKQorICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7Q01BS0VfUkVRVUlSRURfRkxBR1N9ICR7RkxBR30iKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygiJHtGTEFHfSIgJHtNQU5HTEVEX0ZMQUd9KQorICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7T0xEX0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSIpCisgIGlmKCR7TUFOR0xFRF9GTEFHfSkKKyAgICBzZXQoVkFSSUFOVCAke0FSR1YxfSkKKyAgICBpZihBUkdWMSkKKyAgICAgIHN0cmluZyhUT1VQUEVSICJfJHtWQVJJQU5UfSIgVkFSSUFOVCkKKyAgICBlbmRpZigpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyR7VkFSSUFOVH0gIiR7Q01BS0VfQ1hYX0ZMQUdTJHtWQVJJQU5UfX0gJHtGTEFHfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICIke0NNQUtFX0VYRV9MSU5LRVJfRkxBR1N9ICR7RkxBR30iIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSAke0ZMQUd9IiBQQVJFTlRfU0NPUEUpCisgICAgc2V0KENNQUtFX01PRFVMRV9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfTU9EVUxFX0xJTktFUl9GTEFHU30gJHtGTEFHfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtDTUFLRV9SRVFVSVJFRF9GTEFHU30gJHtGTEFHfSIgUEFSRU5UX1NDT1BFKQorICBlbHNlKCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJSZXF1aXJlZCBmbGFnICcke0ZMQUd9JyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21waWxlciIpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24oY2hlY2tfY3h4X3dhcm5pbmdfZmxhZyBGTEFHKQorICBtYW5nbGVfY29tcGlsZXJfZmxhZygiJHtGTEFHfSIgTUFOR0xFRF9GTEFHKQorICBzZXQoT0xEX0NNQUtFX1JFUVVJUkVEX0ZMQUdTICIke0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSIpCisgICMgQWRkIC1XZXJyb3IgdG8gZW5zdXJlIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgYW4gZXJyb3IgaWYgdGhlIHdhcm5pbmcgZmxhZworICAjIGRvZXNuJ3QgZXhpc3QuCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtDTUFLRV9SRVFVSVJFRF9GTEFHU30gLVdlcnJvciAke0ZMQUd9IikKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIiR7RkxBR30iICR7TUFOR0xFRF9GTEFHfSkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke09MRF9DTUFLRV9SRVFVSVJFRF9GTEFHU30iKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvQ1hYRmVhdHVyZUNoZWNrLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvQ1hYRmVhdHVyZUNoZWNrLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OWQ1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9DWFhGZWF0dXJlQ2hlY2suY21ha2UKQEAgLTAsMCArMSw2NCBAQAorIyAtIENvbXBpbGUgYW5kIHJ1biBjb2RlIHRvIGNoZWNrIGZvciBDKysgZmVhdHVyZXMKKyMKKyMgVGhpcyBmdW5jdGlvbnMgY29tcGlsZXMgYSBzb3VyY2UgZmlsZSB1bmRlciB0aGUgYGNtYWtlYCBmb2xkZXIKKyMgYW5kIGFkZHMgdGhlIGNvcnJlc3BvbmRpbmcgYEhBVkVfW0ZJTEVOQU1FXWAgZmxhZyB0byB0aGUgQ01ha2UKKyMgZW52aXJvbm1lbnQKKyMKKyMgIGN4eF9mZWF0dXJlX2NoZWNrKDxGTEFHPiBbPFZBUklBTlQ+XSkKKyMKKyMgLSBFeGFtcGxlCisjCisjIGluY2x1ZGUoQ1hYRmVhdHVyZUNoZWNrKQorIyBjeHhfZmVhdHVyZV9jaGVjayhTVERfUkVHRVgpCisjIFJlcXVpcmVzIENNYWtlIDIuOC4xMisKKworaWYoX19jeHhfZmVhdHVyZV9jaGVjaykKKyAgcmV0dXJuKCkKK2VuZGlmKCkKK3NldChfX2N4eF9mZWF0dXJlX2NoZWNrIElOQ0xVREVEKQorCitmdW5jdGlvbihjeHhfZmVhdHVyZV9jaGVjayBGSUxFKQorICBzdHJpbmcoVE9MT1dFUiAke0ZJTEV9IEZJTEUpCisgIHN0cmluZyhUT1VQUEVSICR7RklMRX0gVkFSKQorICBzdHJpbmcoVE9VUFBFUiAiSEFWRV8ke1ZBUn0iIEZFQVRVUkUpCisgIGlmIChERUZJTkVEIEhBVkVfJHtWQVJ9KQorICAgIHNldChIQVZFXyR7VkFSfSAxIFBBUkVOVF9TQ09QRSkKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURIQVZFXyR7VkFSfSkKKyAgICByZXR1cm4oKQorICBlbmRpZigpCisKKyAgaWYgKE5PVCBERUZJTkVEIENPTVBJTEVfJHtGRUFUVVJFfSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7RkVBVFVSRX0iKQorICAgIGlmKENNQUtFX0NST1NTQ09NUElMSU5HKQorICAgICAgdHJ5X2NvbXBpbGUoQ09NUElMRV8ke0ZFQVRVUkV9CisgICAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlLyR7RklMRX0uY3BwCisgICAgICAgICAgICAgIENNQUtFX0ZMQUdTICR7QkVOQ0hNQVJLX0NYWF9MSU5LRVJfRkxBR1N9CisgICAgICAgICAgICAgIExJTktfTElCUkFSSUVTICR7QkVOQ0hNQVJLX0NYWF9MSUJSQVJJRVN9KQorICAgICAgaWYoQ09NUElMRV8ke0ZFQVRVUkV9KQorICAgICAgICBtZXNzYWdlKFdBUk5JTkcKKyAgICAgICAgICAgICAgIklmIHlvdSBzZWUgYnVpbGQgZmFpbHVyZXMgZHVlIHRvIGNyb3NzIGNvbXBpbGF0aW9uLCB0cnkgc2V0dGluZyBIQVZFXyR7VkFSfSB0byAwIikKKyAgICAgICAgc2V0KFJVTl8ke0ZFQVRVUkV9IDAgQ0FDSEUgSU5URVJOQUwgIiIpCisgICAgICBlbHNlKCkKKyAgICAgICAgc2V0KFJVTl8ke0ZFQVRVUkV9IDEgQ0FDSEUgSU5URVJOQUwgIiIpCisgICAgICBlbmRpZigpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7RkVBVFVSRX0iKQorICAgICAgdHJ5X3J1bihSVU5fJHtGRUFUVVJFfSBDT01QSUxFXyR7RkVBVFVSRX0KKyAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvJHtGSUxFfS5jcHAKKyAgICAgICAgICAgICAgQ01BS0VfRkxBR1MgJHtCRU5DSE1BUktfQ1hYX0xJTktFUl9GTEFHU30KKyAgICAgICAgICAgICAgTElOS19MSUJSQVJJRVMgJHtCRU5DSE1BUktfQ1hYX0xJQlJBUklFU30pCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgaWYoUlVOXyR7RkVBVFVSRX0gRVFVQUwgMCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7RkVBVFVSRX0gLS0gc3VjY2VzcyIpCisgICAgc2V0KEhBVkVfJHtWQVJ9IDEgUEFSRU5UX1NDT1BFKQorICAgIGFkZF9kZWZpbml0aW9ucygtREhBVkVfJHtWQVJ9KQorICBlbHNlKCkKKyAgICBpZihOT1QgQ09NUElMRV8ke0ZFQVRVUkV9KQorICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke0ZFQVRVUkV9IC0tIGZhaWxlZCB0byBjb21waWxlIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtGRUFUVVJFfSAtLSBjb21waWxlZCBidXQgZmFpbGVkIHRvIHJ1biIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9Db25maWcuY21ha2UuaW4gYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9Db25maWcuY21ha2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5MjU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL0NvbmZpZy5jbWFrZS5pbgpAQCAtMCwwICsxIEBACitpbmNsdWRlKCIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9L0B0YXJnZXRzX2V4cG9ydF9uYW1lQC5jbWFrZSIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9HZXRHaXRWZXJzaW9uLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvR2V0R2l0VmVyc2lvbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjEwZjIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvR2V0R2l0VmVyc2lvbi5jbWFrZQpAQCAtMCwwICsxLDU0IEBACisjIC0gUmV0dXJucyBhIHZlcnNpb24gc3RyaW5nIGZyb20gR2l0IHRhZ3MKKyMKKyMgVGhpcyBmdW5jdGlvbiBpbnNwZWN0cyB0aGUgYW5ub3RhdGVkIGdpdCB0YWdzIGZvciB0aGUgcHJvamVjdCBhbmQgcmV0dXJucyBhIHN0cmluZworIyBpbnRvIGEgQ01ha2UgdmFyaWFibGUKKyMKKyMgIGdldF9naXRfdmVyc2lvbig8dmFyPikKKyMKKyMgLSBFeGFtcGxlCisjCisjIGluY2x1ZGUoR2V0R2l0VmVyc2lvbikKKyMgZ2V0X2dpdF92ZXJzaW9uKEdJVF9WRVJTSU9OKQorIworIyBSZXF1aXJlcyBDTWFrZSAyLjguMTErCitmaW5kX3BhY2thZ2UoR2l0KQorCitpZihfX2dldF9naXRfdmVyc2lvbikKKyAgcmV0dXJuKCkKK2VuZGlmKCkKK3NldChfX2dldF9naXRfdmVyc2lvbiBJTkNMVURFRCkKKworZnVuY3Rpb24oZ2V0X2dpdF92ZXJzaW9uIHZhcikKKyAgaWYoR0lUX0VYRUNVVEFCTEUpCisgICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0dJVF9FWEVDVVRBQkxFfSBkZXNjcmliZSAtLW1hdGNoICJ2WzAtOV0qLlswLTldKi5bMC05XSoiIC0tYWJicmV2PTgKKyAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke1BST0pFQ1RfU09VUkNFX0RJUn0KKyAgICAgICAgICBSRVNVTFRfVkFSSUFCTEUgc3RhdHVzCisgICAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdJVF9WRVJTSU9OCisgICAgICAgICAgRVJST1JfUVVJRVQpCisgICAgICBpZigke3N0YXR1c30pCisgICAgICAgICAgc2V0KEdJVF9WRVJTSU9OICJ2MC4wLjAiKQorICAgICAgZWxzZSgpCisgICAgICAgICAgc3RyaW5nKFNUUklQICR7R0lUX1ZFUlNJT059IEdJVF9WRVJTSU9OKQorICAgICAgICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICItWzAtOV0rLWciICItIiBHSVRfVkVSU0lPTiAke0dJVF9WRVJTSU9OfSkKKyAgICAgIGVuZGlmKCkKKworICAgICAgIyBXb3JrIG91dCBpZiB0aGUgcmVwb3NpdG9yeSBpcyBkaXJ0eQorICAgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtHSVRfRVhFQ1VUQUJMRX0gdXBkYXRlLWluZGV4IC1xIC0tcmVmcmVzaAorICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7UFJPSkVDVF9TT1VSQ0VfRElSfQorICAgICAgICAgIE9VVFBVVF9RVUlFVAorICAgICAgICAgIEVSUk9SX1FVSUVUKQorICAgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtHSVRfRVhFQ1VUQUJMRX0gZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEIC0tCisgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9CisgICAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdJVF9ESUZGX0lOREVYCisgICAgICAgICAgRVJST1JfUVVJRVQpCisgICAgICBzdHJpbmcoQ09NUEFSRSBOT1RFUVVBTCAiJHtHSVRfRElGRl9JTkRFWH0iICIiIEdJVF9ESVJUWSkKKyAgICAgIGlmICgke0dJVF9ESVJUWX0pCisgICAgICAgICAgc2V0KEdJVF9WRVJTSU9OICIke0dJVF9WRVJTSU9OfS1kaXJ0eSIpCisgICAgICBlbmRpZigpCisgIGVsc2UoKQorICAgICAgc2V0KEdJVF9WRVJTSU9OICJ2MC4wLjAiKQorICBlbmRpZigpCisKKyAgbWVzc2FnZShTVEFUVVMgImdpdCBWZXJzaW9uOiAke0dJVF9WRVJTSU9OfSIpCisgIHNldCgke3Zhcn0gJHtHSVRfVkVSU0lPTn0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvR29vZ2xlVGVzdC5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL0dvb2dsZVRlc3QuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2MTFmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL0dvb2dsZVRlc3QuY21ha2UKQEAgLTAsMCArMSw0MSBAQAorIyBEb3dubG9hZCBhbmQgdW5wYWNrIGdvb2dsZXRlc3QgYXQgY29uZmlndXJlIHRpbWUKK3NldChHT09HTEVURVNUX1BSRUZJWCAiJHtiZW5jaG1hcmtfQklOQVJZX0RJUn0vdGhpcmRfcGFydHkvZ29vZ2xldGVzdCIpCitjb25maWd1cmVfZmlsZSgke2JlbmNobWFya19TT1VSQ0VfRElSfS9jbWFrZS9Hb29nbGVUZXN0LmNtYWtlLmluICR7R09PR0xFVEVTVF9QUkVGSVh9L0NNYWtlTGlzdHMudHh0IEBPTkxZKQorCitzZXQoR09PR0xFVEVTVF9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZ29vZ2xldGVzdCIgQ0FDSEUgUEFUSCAiIikgIyBNaW5kIHRoZSBxdW90ZXMKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUcgIiR7Q01BS0VfR0VORVJBVE9SfSIKKyAgLURBTExPV19ET1dOTE9BRElOR19HT09HTEVURVNUPSR7QkVOQ0hNQVJLX0RPV05MT0FEX0RFUEVOREVOQ0lFU30gLURHT09HTEVURVNUX1BBVEg6UEFUSD0ke0dPT0dMRVRFU1RfUEFUSH0gLgorICBSRVNVTFRfVkFSSUFCTEUgcmVzdWx0CisgIFdPUktJTkdfRElSRUNUT1JZICR7R09PR0xFVEVTVF9QUkVGSVh9CispCisKK2lmKHJlc3VsdCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ01ha2Ugc3RlcCBmb3IgZ29vZ2xldGVzdCBmYWlsZWQ6ICR7cmVzdWx0fSIpCitlbmRpZigpCisKK2V4ZWN1dGVfcHJvY2VzcygKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC0tYnVpbGQgLgorICBSRVNVTFRfVkFSSUFCTEUgcmVzdWx0CisgIFdPUktJTkdfRElSRUNUT1JZICR7R09PR0xFVEVTVF9QUkVGSVh9CispCisKK2lmKHJlc3VsdCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQnVpbGQgc3RlcCBmb3IgZ29vZ2xldGVzdCBmYWlsZWQ6ICR7cmVzdWx0fSIpCitlbmRpZigpCisKKyMgUHJldmVudCBvdmVycmlkaW5nIHRoZSBwYXJlbnQgcHJvamVjdCdzIGNvbXBpbGVyL2xpbmtlcgorIyBzZXR0aW5ncyBvbiBXaW5kb3dzCitzZXQoZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQorCitpbmNsdWRlKCR7R09PR0xFVEVTVF9QUkVGSVh9L2dvb2dsZXRlc3QtcGF0aHMuY21ha2UpCisKKyMgQWRkIGdvb2dsZXRlc3QgZGlyZWN0bHkgdG8gb3VyIGJ1aWxkLiBUaGlzIGRlZmluZXMKKyMgdGhlIGd0ZXN0IGFuZCBndGVzdF9tYWluIHRhcmdldHMuCithZGRfc3ViZGlyZWN0b3J5KCR7R09PR0xFVEVTVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgICAgICAke0dPT0dMRVRFU1RfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgICAgRVhDTFVERV9GUk9NX0FMTCkKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGd0ZXN0IFBST1BFUlRJRVMgSU5URVJGQUNFX1NZU1RFTV9JTkNMVURFX0RJUkVDVE9SSUVTICQ8VEFSR0VUX1BST1BFUlRZOmd0ZXN0LElOVEVSRkFDRV9JTkNMVURFX0RJUkVDVE9SSUVTPikKK3NldF90YXJnZXRfcHJvcGVydGllcyhndGVzdF9tYWluIFBST1BFUlRJRVMgSU5URVJGQUNFX1NZU1RFTV9JTkNMVURFX0RJUkVDVE9SSUVTICQ8VEFSR0VUX1BST1BFUlRZOmd0ZXN0X21haW4sSU5URVJGQUNFX0lOQ0xVREVfRElSRUNUT1JJRVM+KQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGdtb2NrIFBST1BFUlRJRVMgSU5URVJGQUNFX1NZU1RFTV9JTkNMVURFX0RJUkVDVE9SSUVTICQ8VEFSR0VUX1BST1BFUlRZOmdtb2NrLElOVEVSRkFDRV9JTkNMVURFX0RJUkVDVE9SSUVTPikKK3NldF90YXJnZXRfcHJvcGVydGllcyhnbW9ja19tYWluIFBST1BFUlRJRVMgSU5URVJGQUNFX1NZU1RFTV9JTkNMVURFX0RJUkVDVE9SSUVTICQ8VEFSR0VUX1BST1BFUlRZOmdtb2NrX21haW4sSU5URVJGQUNFX0lOQ0xVREVfRElSRUNUT1JJRVM+KQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvR29vZ2xlVGVzdC5jbWFrZS5pbiBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL0dvb2dsZVRlc3QuY21ha2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4MThlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL0dvb2dsZVRlc3QuY21ha2UuaW4KQEAgLTAsMCArMSw1OCBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMikKKworcHJvamVjdChnb29nbGV0ZXN0LWRvd25sb2FkIE5PTkUpCisKKyMgRW5hYmxlIEV4dGVybmFsUHJvamVjdCBDTWFrZSBtb2R1bGUKK2luY2x1ZGUoRXh0ZXJuYWxQcm9qZWN0KQorCitvcHRpb24oQUxMT1dfRE9XTkxPQURJTkdfR09PR0xFVEVTVCAiSWYgZ29vZ2xldGVzdCBzcmMgdHJlZSBpcyBub3QgZm91bmQgaW4gbG9jYXRpb24gc3BlY2lmaWVkIGJ5IEdPT0dMRVRFU1RfUEFUSCwgZG8gZmV0Y2ggdGhlIGFyY2hpdmUgZnJvbSBpbnRlcm5ldCIgT0ZGKQorc2V0KEdPT0dMRVRFU1RfUEFUSCAiL3Vzci9zcmMvZ29vZ2xldGVzdCIgQ0FDSEUgUEFUSAorICAgICAgICAgICAgICAgICAgICAiUGF0aCB0byB0aGUgZ29vZ2xldGVzdCByb290IHRyZWUuIFNob3VsZCBjb250YWluIGdvb2dsZXRlc3QgYW5kIGdvb2dsZW1vY2sgc3ViZGlycy4gQW5kIENNYWtlTGlzdHMudHh0IGluIHJvb3QsIGFuZCBpbiBib3RoIG9mIHRoZXNlIHN1YmRpcnMiKQorCisjIERvd25sb2FkIGFuZCBpbnN0YWxsIEdvb2dsZVRlc3QKKworbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEdvb2dsZSBUZXN0IHNvdXJjZXMiKQorbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEdvb2dsZSBUZXN0IHNvdXJjZXMgaW4gJHtHT09HTEVURVNUX1BBVEh9IikKK2lmKEVYSVNUUyAiJHtHT09HTEVURVNUX1BBVEh9IiAgICAgICAgICAgIEFORCBJU19ESVJFQ1RPUlkgIiR7R09PR0xFVEVTVF9QQVRIfSIgICAgICAgICAgICBBTkQgRVhJU1RTICIke0dPT0dMRVRFU1RfUEFUSH0vQ01ha2VMaXN0cy50eHQiIEFORAorICAgRVhJU1RTICIke0dPT0dMRVRFU1RfUEFUSH0vZ29vZ2xldGVzdCIgQU5EIElTX0RJUkVDVE9SWSAiJHtHT09HTEVURVNUX1BBVEh9L2dvb2dsZXRlc3QiIEFORCBFWElTVFMgIiR7R09PR0xFVEVTVF9QQVRIfS9nb29nbGV0ZXN0L0NNYWtlTGlzdHMudHh0IiBBTkQKKyAgIEVYSVNUUyAiJHtHT09HTEVURVNUX1BBVEh9L2dvb2dsZW1vY2siIEFORCBJU19ESVJFQ1RPUlkgIiR7R09PR0xFVEVTVF9QQVRIfS9nb29nbGVtb2NrIiBBTkQgRVhJU1RTICIke0dPT0dMRVRFU1RfUEFUSH0vZ29vZ2xlbW9jay9DTWFrZUxpc3RzLnR4dCIpCisgIG1lc3NhZ2UoU1RBVFVTICJGb3VuZCBHb29nbGUgVGVzdCBpbiAke0dPT0dMRVRFU1RfUEFUSH0iKQorCisgIEV4dGVybmFsUHJvamVjdF9BZGQoCisgICAgZ29vZ2xldGVzdAorICAgIFBSRUZJWCAgICAgICAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9IgorICAgIERPV05MT0FEX0RJUiAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9L2Rvd25sb2FkIgorICAgIFNPVVJDRV9ESVIgICAgICAgICIke0dPT0dMRVRFU1RfUEFUSH0iICMgdXNlIGV4aXN0aW5nIHNyYyBkaXIuCisgICAgQklOQVJZX0RJUiAgICAgICAgIiR7Q01BS0VfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgQ09ORklHVVJFX0NPTU1BTkQgIiIKKyAgICBCVUlMRF9DT01NQU5EICAgICAiIgorICAgIElOU1RBTExfQ09NTUFORCAgICIiCisgICAgVEVTVF9DT01NQU5EICAgICAgIiIKKyAgKQorZWxzZSgpCisgIGlmKE5PVCBBTExPV19ET1dOTE9BRElOR19HT09HTEVURVNUKQorICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiRGlkIG5vdCBmaW5kIEdvb2dsZSBUZXN0IHNvdXJjZXMhIEVpdGhlciBwYXNzIGNvcnJlY3QgcGF0aCBpbiBHT09HTEVURVNUX1BBVEgsIG9yIGVuYWJsZSBBTExPV19ET1dOTE9BRElOR19HT09HTEVURVNULCBvciBkaXNhYmxlIEJFTkNITUFSS19FTkFCTEVfR1RFU1RfVEVTVFMgLyBCRU5DSE1BUktfRU5BQkxFX1RFU1RJTkcuIikKKyAgZWxzZSgpCisgICAgbWVzc2FnZShXQVJOSU5HICJEaWQgbm90IGZpbmQgR29vZ2xlIFRlc3Qgc291cmNlcyEgRmV0Y2hpbmcgZnJvbSB3ZWIuLi4iKQorICAgIEV4dGVybmFsUHJvamVjdF9BZGQoCisgICAgICBnb29nbGV0ZXN0CisgICAgICBHSVRfUkVQT1NJVE9SWSAgICBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QuZ2l0CisgICAgICBHSVRfVEFHICAgICAgICAgICBtYXN0ZXIKKyAgICAgIFBSRUZJWCAgICAgICAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9IgorICAgICAgU1RBTVBfRElSICAgICAgICAgIiR7Q01BS0VfQklOQVJZX0RJUn0vc3RhbXAiCisgICAgICBET1dOTE9BRF9ESVIgICAgICAiJHtDTUFLRV9CSU5BUllfRElSfS9kb3dubG9hZCIKKyAgICAgIFNPVVJDRV9ESVIgICAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9L3NyYyIKKyAgICAgIEJJTkFSWV9ESVIgICAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9L2J1aWxkIgorICAgICAgQ09ORklHVVJFX0NPTU1BTkQgIiIKKyAgICAgIEJVSUxEX0NPTU1BTkQgICAgICIiCisgICAgICBJTlNUQUxMX0NPTU1BTkQgICAiIgorICAgICAgVEVTVF9DT01NQU5EICAgICAgIiIKKyAgICApCisgIGVuZGlmKCkKK2VuZGlmKCkKKworRXh0ZXJuYWxQcm9qZWN0X0dldF9Qcm9wZXJ0eShnb29nbGV0ZXN0IFNPVVJDRV9ESVIgQklOQVJZX0RJUikKK2ZpbGUoV1JJVEUgZ29vZ2xldGVzdC1wYXRocy5jbWFrZQorInNldChHT09HTEVURVNUX1NPVVJDRV9ESVIgXCIke1NPVVJDRV9ESVJ9XCIpCitzZXQoR09PR0xFVEVTVF9CSU5BUllfRElSIFwiJHtCSU5BUllfRElSfVwiKQorIikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL01vZHVsZXMvRmluZExMVk1Bci5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL01vZHVsZXMvRmluZExMVk1Bci5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQ2OTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvTW9kdWxlcy9GaW5kTExWTUFyLmNtYWtlCkBAIC0wLDAgKzEsMTYgQEAKK2luY2x1ZGUoRmVhdHVyZVN1bW1hcnkpCisKK2ZpbmRfcHJvZ3JhbShMTFZNQVJfRVhFQ1VUQUJMRQorICBOQU1FUyBsbHZtLWFyCisgIERPQyAiVGhlIGxsdm0tYXIgZXhlY3V0YWJsZSIKKyAgKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKExMVk1BcgorICBERUZBVUxUX01TRworICBMTFZNQVJfRVhFQ1VUQUJMRSkKKworU0VUX1BBQ0tBR0VfUFJPUEVSVElFUyhMTFZNQXIgUFJPUEVSVElFUworICBVUkwgaHR0cHM6Ly9sbHZtLm9yZy9kb2NzL0NvbW1hbmRHdWlkZS9sbHZtLWFyLmh0bWwKKyAgREVTQ1JJUFRJT04gImNyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzIgorKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvTW9kdWxlcy9GaW5kTExWTU5tLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvTW9kdWxlcy9GaW5kTExWTU5tLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjQzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9Nb2R1bGVzL0ZpbmRMTFZNTm0uY21ha2UKQEAgLTAsMCArMSwxNiBAQAoraW5jbHVkZShGZWF0dXJlU3VtbWFyeSkKKworZmluZF9wcm9ncmFtKExMVk1OTV9FWEVDVVRBQkxFCisgIE5BTUVTIGxsdm0tbm0KKyAgRE9DICJUaGUgbGx2bS1ubSBleGVjdXRhYmxlIgorICApCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoTExWTU5tCisgIERFRkFVTFRfTVNHCisgIExMVk1OTV9FWEVDVVRBQkxFKQorCitTRVRfUEFDS0FHRV9QUk9QRVJUSUVTKExMVk1ObSBQUk9QRVJUSUVTCisgIFVSTCBodHRwczovL2xsdm0ub3JnL2RvY3MvQ29tbWFuZEd1aWRlL2xsdm0tbm0uaHRtbAorICBERVNDUklQVElPTiAibGlzdCBMTFZNIGJpdGNvZGUgYW5kIG9iamVjdCBmaWxl4oCZcyBzeW1ib2wgdGFibGUiCispCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9Nb2R1bGVzL0ZpbmRMTFZNUmFuTGliLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvTW9kdWxlcy9GaW5kTExWTVJhbkxpYi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjUzZTFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvTW9kdWxlcy9GaW5kTExWTVJhbkxpYi5jbWFrZQpAQCAtMCwwICsxLDE1IEBACitpbmNsdWRlKEZlYXR1cmVTdW1tYXJ5KQorCitmaW5kX3Byb2dyYW0oTExWTVJBTkxJQl9FWEVDVVRBQkxFCisgIE5BTUVTIGxsdm0tcmFubGliCisgIERPQyAiVGhlIGxsdm0tcmFubGliIGV4ZWN1dGFibGUiCisgICkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhMTFZNUmFuTGliCisgIERFRkFVTFRfTVNHCisgIExMVk1SQU5MSUJfRVhFQ1VUQUJMRSkKKworU0VUX1BBQ0tBR0VfUFJPUEVSVElFUyhMTFZNUmFuTGliIFBST1BFUlRJRVMKKyAgREVTQ1JJUFRJT04gImdlbmVyYXRlIGluZGV4IGZvciBMTFZNIGFyY2hpdmUiCispCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9iZW5jaG1hcmsucGMuaW4gYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9iZW5jaG1hcmsucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjYThmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL2JlbmNobWFyay5wYy5pbgpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9QENNQUtFX0lOU1RBTExfUFJFRklYQAorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYgoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBAUFJPSkVDVF9OQU1FQAorRGVzY3JpcHRpb246IEdvb2dsZSBtaWNyb2JlbmNobWFyayBmcmFtZXdvcmsKK1ZlcnNpb246IEBWRVJTSU9OQAorCitMaWJzOiAtTCR7bGliZGlyfSAtbGJlbmNobWFyaworTGlicy5wcml2YXRlOiAtbHB0aHJlYWQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9nbnVfcG9zaXhfcmVnZXguY3BwIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvZ251X3Bvc2l4X3JlZ2V4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI5MWNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvZ251X3Bvc2l4X3JlZ2V4LmNwcApAQCAtMCwwICsxLDEyIEBACisjaW5jbHVkZSA8Z251cmVnZXguaD4KKyNpbmNsdWRlIDxzdHJpbmc+CitpbnQgbWFpbigpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gInRlc3QwMTU5IjsKKyAgcmVnZXhfdCByZTsKKyAgaW50IGVjID0gcmVnY29tcCgmcmUsICJeW2Etel0rWzAtOV0rJCIsIFJFR19FWFRFTkRFRCB8IFJFR19OT1NVQik7CisgIGlmIChlYyAhPSAwKSB7CisgICAgcmV0dXJuIGVjOworICB9CisgIHJldHVybiByZWdleGVjKCZyZSwgc3RyLmNfc3RyKCksIDAsIG51bGxwdHIsIDApID8gLTEgOiAwOworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9sbHZtLXRvb2xjaGFpbi5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL2xsdm0tdG9vbGNoYWluLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTE5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9sbHZtLXRvb2xjaGFpbi5jbWFrZQpAQCAtMCwwICsxLDggQEAKK2ZpbmRfcGFja2FnZShMTFZNQXIgUkVRVUlSRUQpCitzZXQoQ01BS0VfQVIgIiR7TExWTUFSX0VYRUNVVEFCTEV9IiBDQUNIRSBGSUxFUEFUSCAiIiBGT1JDRSkKKworZmluZF9wYWNrYWdlKExMVk1ObSBSRVFVSVJFRCkKK3NldChDTUFLRV9OTSAiJHtMTFZNTk1fRVhFQ1VUQUJMRX0iIENBQ0hFIEZJTEVQQVRIICIiIEZPUkNFKQorCitmaW5kX3BhY2thZ2UoTExWTVJhbkxpYiBSRVFVSVJFRCkKK3NldChDTUFLRV9SQU5MSUIgIiR7TExWTVJBTkxJQl9FWEVDVVRBQkxFfSIgQ0FDSEUgRklMRVBBVEggIiIgRk9SQ0UpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9wb3NpeF9yZWdleC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9wb3NpeF9yZWdleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2ZGM2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL3Bvc2l4X3JlZ2V4LmNwcApAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzdHJpbmc+CitpbnQgbWFpbigpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gInRlc3QwMTU5IjsKKyAgcmVnZXhfdCByZTsKKyAgaW50IGVjID0gcmVnY29tcCgmcmUsICJeW2Etel0rWzAtOV0rJCIsIFJFR19FWFRFTkRFRCB8IFJFR19OT1NVQik7CisgIGlmIChlYyAhPSAwKSB7CisgICAgcmV0dXJuIGVjOworICB9CisgIGludCByZXQgPSByZWdleGVjKCZyZSwgc3RyLmNfc3RyKCksIDAsIG51bGxwdHIsIDApID8gLTEgOiAwOworICByZWdmcmVlKCZyZSk7CisgIHJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL3NwbGl0X2xpc3QuY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9zcGxpdF9saXN0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWVkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9zcGxpdF9saXN0LmNtYWtlCkBAIC0wLDAgKzEsMyBAQAorbWFjcm8oc3BsaXRfbGlzdCBsaXN0bmFtZSkKKyAgc3RyaW5nKFJFUExBQ0UgIjsiICIgIiAke2xpc3RuYW1lfSAiJHske2xpc3RuYW1lfX0iKQorZW5kbWFjcm8oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2Uvc3RkX3JlZ2V4LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL3N0ZF9yZWdleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2ZjJhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL3N0ZF9yZWdleC5jcHAKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgPHJlZ2V4PgorI2luY2x1ZGUgPHN0cmluZz4KK2ludCBtYWluKCkgeworICBjb25zdCBzdGQ6OnN0cmluZyBzdHIgPSAidGVzdDAxNTkiOworICBzdGQ6OnJlZ2V4IHJlOworICByZSA9IHN0ZDo6cmVnZXgoIl5bYS16XStbMC05XSskIiwKKyAgICAgICBzdGQ6OnJlZ2V4X2NvbnN0YW50czo6ZXh0ZW5kZWQgfCBzdGQ6OnJlZ2V4X2NvbnN0YW50czo6bm9zdWJzKTsKKyAgcmV0dXJuIHN0ZDo6cmVnZXhfc2VhcmNoKHN0ciwgcmUpID8gMCA6IC0xOworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jbWFrZS9zdGVhZHlfY2xvY2suY3BwIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2Uvc3RlYWR5X2Nsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ1MGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2Uvc3RlYWR5X2Nsb2NrLmNwcApAQCAtMCwwICsxLDcgQEAKKyNpbmNsdWRlIDxjaHJvbm8+CisKK2ludCBtYWluKCkgeworICAgIHR5cGVkZWYgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jayBDbG9jazsKKyAgICBDbG9jazo6dGltZV9wb2ludCB0cCA9IENsb2NrOjpub3coKTsKKyAgICAoKHZvaWQpdHApOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY21ha2UvdGhyZWFkX3NhZmV0eV9hdHRyaWJ1dGVzLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL3RocmVhZF9zYWZldHlfYXR0cmlidXRlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxNjFiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NtYWtlL3RocmVhZF9zYWZldHlfYXR0cmlidXRlcy5jcHAKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIEhBVkVfVEhSRUFEX1NBRkVUWV9BVFRSSUJVVEVTCisjaW5jbHVkZSAiLi4vc3JjL211dGV4LmgiCisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NvbmFuL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY29uYW4vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViOTJjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NvbmFuL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMSkKK3Byb2plY3QoY21ha2Vfd3JhcHBlcikKKworaW5jbHVkZShjb25hbmJ1aWxkaW5mby5jbWFrZSkKK2NvbmFuX2Jhc2ljX3NldHVwKCkKKworaW5jbHVkZSgke0NNQUtFX1NPVVJDRV9ESVJ9L0NNYWtlTGlzdHNPcmlnaW5hbC50eHQpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jb25hbi90ZXN0X3BhY2thZ2UvQ01ha2VMaXN0cy50eHQgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jb25hbi90ZXN0X3BhY2thZ2UvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5YTZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NvbmFuL3Rlc3RfcGFja2FnZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEwIEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjExKQorcHJvamVjdCh0ZXN0X3BhY2thZ2UpCisKK3NldChDTUFLRV9WRVJCT1NFX01BS0VGSUxFIFRSVUUpCisKK2luY2x1ZGUoJHtDTUFLRV9CSU5BUllfRElSfS9jb25hbmJ1aWxkaW5mby5jbWFrZSkKK2NvbmFuX2Jhc2ljX3NldHVwKCkKKworYWRkX2V4ZWN1dGFibGUoJHtQUk9KRUNUX05BTUV9IHRlc3RfcGFja2FnZS5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoJHtQUk9KRUNUX05BTUV9ICR7Q09OQU5fTElCU30pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jb25hbi90ZXN0X3BhY2thZ2UvY29uYW5maWxlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY29uYW4vdGVzdF9wYWNrYWdlL2NvbmFuZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjNmNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY29uYW4vdGVzdF9wYWNrYWdlL2NvbmFuZmlsZS5weQpAQCAtMCwwICsxLDE5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKK2Zyb20gY29uYW5zIGltcG9ydCBDb25hbkZpbGUsIENNYWtlCitpbXBvcnQgb3MKKworCitjbGFzcyBUZXN0UGFja2FnZUNvbmFuKENvbmFuRmlsZSk6CisgICAgc2V0dGluZ3MgPSAib3MiLCAiY29tcGlsZXIiLCAiYnVpbGRfdHlwZSIsICJhcmNoIgorICAgIGdlbmVyYXRvcnMgPSAiY21ha2UiCisKKyAgICBkZWYgYnVpbGQoc2VsZik6CisgICAgICAgIGNtYWtlID0gQ01ha2Uoc2VsZikKKyAgICAgICAgY21ha2UuY29uZmlndXJlKCkKKyAgICAgICAgY21ha2UuYnVpbGQoKQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGJpbl9wYXRoID0gb3MucGF0aC5qb2luKCJiaW4iLCAidGVzdF9wYWNrYWdlIikKKyAgICAgICAgc2VsZi5ydW4oYmluX3BhdGgsIHJ1bl9lbnZpcm9ubWVudD1UcnVlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY29uYW4vdGVzdF9wYWNrYWdlL3Rlc3RfcGFja2FnZS5jcHAgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jb25hbi90ZXN0X3BhY2thZ2UvdGVzdF9wYWNrYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE3ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvY29uYW4vdGVzdF9wYWNrYWdlL3Rlc3RfcGFja2FnZS5jcHAKQEAgLTAsMCArMSwxOCBAQAorI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKwordm9pZCBCTV9TdHJpbmdDcmVhdGlvbihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZygpKQorICAgICAgICBzdGQ6OnN0cmluZyBlbXB0eV9zdHJpbmc7Cit9CisKK0JFTkNITUFSSyhCTV9TdHJpbmdDcmVhdGlvbik7CisKK3ZvaWQgQk1fU3RyaW5nQ29weShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIHN0ZDo6c3RyaW5nIHggPSAiaGVsbG8iOworICAgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZygpKQorICAgICAgICBzdGQ6OnN0cmluZyBjb3B5KHgpOworfQorCitCRU5DSE1BUksoQk1fU3RyaW5nQ29weSk7CisKK0JFTkNITUFSS19NQUlOKCk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jb25hbmZpbGUucHkgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9jb25hbmZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxZmM1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2NvbmFuZmlsZS5weQpAQCAtMCwwICsxLDc5IEBACitmcm9tIGNvbmFucyBpbXBvcnQgQ29uYW5GaWxlLCBDTWFrZSwgdG9vbHMKK2Zyb20gY29uYW5zLmVycm9ycyBpbXBvcnQgQ29uYW5JbnZhbGlkQ29uZmlndXJhdGlvbgoraW1wb3J0IHNodXRpbAoraW1wb3J0IG9zCisKKworY2xhc3MgR29vZ2xlQmVuY2htYXJrQ29uYW4oQ29uYW5GaWxlKToKKyAgICBuYW1lID0gImJlbmNobWFyayIKKyAgICBkZXNjcmlwdGlvbiA9ICJBIG1pY3JvYmVuY2htYXJrIHN1cHBvcnQgbGlicmFyeS4iCisgICAgdG9waWNzID0gKCJjb25hbiIsICJiZW5jaG1hcmsiLCAiZ29vZ2xlIiwgIm1pY3JvYmVuY2htYXJrIikKKyAgICB1cmwgPSAiaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9iZW5jaG1hcmsiCisgICAgaG9tZXBhZ2UgPSAiaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9iZW5jaG1hcmsiCisgICAgYXV0aG9yID0gIkdvb2dsZSBJbmMuIgorICAgIGxpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKKyAgICBleHBvcnRzX3NvdXJjZXMgPSBbIioiXQorICAgIGdlbmVyYXRvcnMgPSAiY21ha2UiCisKKyAgICBzZXR0aW5ncyA9ICJhcmNoIiwgImJ1aWxkX3R5cGUiLCAiY29tcGlsZXIiLCAib3MiCisgICAgb3B0aW9ucyA9IHsKKyAgICAgICAgInNoYXJlZCI6IFtUcnVlLCBGYWxzZV0sCisgICAgICAgICJmUElDIjogW1RydWUsIEZhbHNlXSwKKyAgICAgICAgImVuYWJsZV9sdG8iOiBbVHJ1ZSwgRmFsc2VdLAorICAgICAgICAiZW5hYmxlX2V4Y2VwdGlvbnMiOiBbVHJ1ZSwgRmFsc2VdCisgICAgfQorICAgIGRlZmF1bHRfb3B0aW9ucyA9IHsic2hhcmVkIjogRmFsc2UsICJmUElDIjogVHJ1ZSwgImVuYWJsZV9sdG8iOiBGYWxzZSwgImVuYWJsZV9leGNlcHRpb25zIjogVHJ1ZX0KKworICAgIF9idWlsZF9zdWJmb2xkZXIgPSAiLiIKKworICAgIGRlZiBzb3VyY2Uoc2VsZik6CisgICAgICAgICMgV3JhcCB0aGUgb3JpZ2luYWwgQ01ha2UgZmlsZSB0byBjYWxsIGNvbmFuX2Jhc2ljX3NldHVwCisgICAgICAgIHNodXRpbC5tb3ZlKCJDTWFrZUxpc3RzLnR4dCIsICJDTWFrZUxpc3RzT3JpZ2luYWwudHh0IikKKyAgICAgICAgc2h1dGlsLm1vdmUob3MucGF0aC5qb2luKCJjb25hbiIsICJDTWFrZUxpc3RzLnR4dCIpLCAiQ01ha2VMaXN0cy50eHQiKQorCisgICAgZGVmIGNvbmZpZ19vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNldHRpbmdzLm9zID09ICJXaW5kb3dzIjoKKyAgICAgICAgICAgIGlmIHNlbGYuc2V0dGluZ3MuY29tcGlsZXIgPT0gIlZpc3VhbCBTdHVkaW8iIGFuZCBmbG9hdChzZWxmLnNldHRpbmdzLmNvbXBpbGVyLnZlcnNpb24udmFsdWUpIDw9IDEyOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbmFuSW52YWxpZENvbmZpZ3VyYXRpb24oInt9IHt9IGRvZXMgbm90IHN1cHBvcnQgVmlzdWFsIFN0dWRpbyA8PSAxMiIuZm9ybWF0KHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKSkKKyAgICAgICAgICAgIGRlbCBzZWxmLm9wdGlvbnMuZlBJQworCisgICAgZGVmIGNvbmZpZ3VyZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zZXR0aW5ncy5vcyA9PSAiV2luZG93cyIgYW5kIHNlbGYub3B0aW9ucy5zaGFyZWQ6CisgICAgICAgICAgICByYWlzZSBDb25hbkludmFsaWRDb25maWd1cmF0aW9uKCJXaW5kb3dzIHNoYXJlZCBidWlsZHMgYXJlIG5vdCBzdXBwb3J0ZWQgcmlnaHQgbm93LCBzZWUgaXNzdWUgIzYzOSIpCisKKyAgICBkZWYgX2NvbmZpZ3VyZV9jbWFrZShzZWxmKToKKyAgICAgICAgY21ha2UgPSBDTWFrZShzZWxmKQorCisgICAgICAgIGNtYWtlLmRlZmluaXRpb25zWyJCRU5DSE1BUktfRU5BQkxFX1RFU1RJTkciXSA9ICJPRkYiCisgICAgICAgIGNtYWtlLmRlZmluaXRpb25zWyJCRU5DSE1BUktfRU5BQkxFX0dURVNUX1RFU1RTIl0gPSAiT0ZGIgorICAgICAgICBjbWFrZS5kZWZpbml0aW9uc1siQkVOQ0hNQVJLX0VOQUJMRV9MVE8iXSA9ICJPTiIgaWYgc2VsZi5vcHRpb25zLmVuYWJsZV9sdG8gZWxzZSAiT0ZGIgorICAgICAgICBjbWFrZS5kZWZpbml0aW9uc1siQkVOQ0hNQVJLX0VOQUJMRV9FWENFUFRJT05TIl0gPSAiT04iIGlmIHNlbGYub3B0aW9ucy5lbmFibGVfZXhjZXB0aW9ucyBlbHNlICJPRkYiCisKKyAgICAgICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9iZW5jaG1hcmsvcHVsbC82MzggZm9yIFdpbmRvd3MgMzIgYnVpbGQgZXhwbGFuYXRpb24KKyAgICAgICAgaWYgc2VsZi5zZXR0aW5ncy5vcyAhPSAiV2luZG93cyI6CisgICAgICAgICAgICBjbWFrZS5kZWZpbml0aW9uc1siQkVOQ0hNQVJLX0JVSUxEXzMyX0JJVFMiXSA9ICJPTiIgaWYgIjY0IiBub3QgaW4gc3RyKHNlbGYuc2V0dGluZ3MuYXJjaCkgZWxzZSAiT0ZGIgorICAgICAgICAgICAgY21ha2UuZGVmaW5pdGlvbnNbIkJFTkNITUFSS19VU0VfTElCQ1hYIl0gPSAiT04iIGlmIChzdHIoc2VsZi5zZXR0aW5ncy5jb21waWxlci5saWJjeHgpID09ICJsaWJjKysiKSBlbHNlICJPRkYiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWFrZS5kZWZpbml0aW9uc1siQkVOQ0hNQVJLX1VTRV9MSUJDWFgiXSA9ICJPRkYiCisKKyAgICAgICAgY21ha2UuY29uZmlndXJlKGJ1aWxkX2ZvbGRlcj1zZWxmLl9idWlsZF9zdWJmb2xkZXIpCisgICAgICAgIHJldHVybiBjbWFrZQorCisgICAgZGVmIGJ1aWxkKHNlbGYpOgorICAgICAgICBjbWFrZSA9IHNlbGYuX2NvbmZpZ3VyZV9jbWFrZSgpCisgICAgICAgIGNtYWtlLmJ1aWxkKCkKKworICAgIGRlZiBwYWNrYWdlKHNlbGYpOgorICAgICAgICBjbWFrZSA9IHNlbGYuX2NvbmZpZ3VyZV9jbWFrZSgpCisgICAgICAgIGNtYWtlLmluc3RhbGwoKQorCisgICAgICAgIHNlbGYuY29weShwYXR0ZXJuPSJMSUNFTlNFIiwgZHN0PSJsaWNlbnNlcyIpCisKKyAgICBkZWYgcGFja2FnZV9pbmZvKHNlbGYpOgorICAgICAgICBzZWxmLmNwcF9pbmZvLmxpYnMgPSB0b29scy5jb2xsZWN0X2xpYnMoc2VsZikKKyAgICAgICAgaWYgc2VsZi5zZXR0aW5ncy5vcyA9PSAiTGludXgiOgorICAgICAgICAgICAgc2VsZi5jcHBfaW5mby5saWJzLmV4dGVuZChbInB0aHJlYWQiLCAicnQiXSkKKyAgICAgICAgZWxpZiBzZWxmLnNldHRpbmdzLm9zID09ICJXaW5kb3dzIjoKKyAgICAgICAgICAgIHNlbGYuY3BwX2luZm8ubGlicy5hcHBlbmQoInNobHdhcGkiKQorICAgICAgICBlbGlmIHNlbGYuc2V0dGluZ3Mub3MgPT0gIlN1bk9TIjoKKyAgICAgICAgICAgIHNlbGYuY3BwX2luZm8ubGlicy5hcHBlbmQoImtzdGF0IikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2RlcGVuZGVuY2llcy5tZCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2RlcGVuZGVuY2llcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjg5YjRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvZGVwZW5kZW5jaWVzLm1kCkBAIC0wLDAgKzEsMTggQEAKKyMgQnVpbGQgdG9vbCBkZXBlbmRlbmN5IHBvbGljeQorCitUbyBlbnN1cmUgdGhlIGJyb2FkZXN0IGNvbXBhdGliaWxpdHkgd2hlbiBidWlsZGluZyB0aGUgYmVuY2htYXJrIGxpYnJhcnksIGJ1dAorc3RpbGwgYWxsb3cgZm9yd2FyZCBwcm9ncmVzcywgd2UgcmVxdWlyZSBhbnkgYnVpbGQgdG9vbGluZyB0byBiZSBhdmFpbGFibGUgZm9yOgorCisqIERlYmlhbiBzdGFibGUgQU5ECisqIFRoZSBsYXN0IHR3byBVYnVudHUgTFRTIHJlbGVhc2VzIEFORAorCitDdXJyZW50bHksIHRoaXMgbWVhbnMgdXNpbmcgYnVpbGQgdG9vbCB2ZXJzaW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIFVidW50dQorMTYuMDQgKFhlbmlhbCksIFVidW50dSAxOC4wNCAoQmlvbmljKSwgYW5kIERlYmlhbiBzdHJldGNoLgorCitfTm90ZSwgW3RyYXZpc10oLnRyYXZpcy55bWwpIHJ1bnMgdW5kZXIgVWJ1bnR1IDE0LjA0IChUcnVzdHkpIGZvciBsaW51eCBidWlsZHMuXworCisjIyBjbWFrZQorVGhlIGN1cnJlbnQgc3VwcG9ydGVkIHZlcnNpb24gaXMgY21ha2UgMy41LjEgYXMgb2YgMjAxOC0wNi0wNi4KKworX05vdGUsIHRoaXMgdmVyc2lvbiBpcyBhbHNvIGF2YWlsYWJsZSBmb3IgVWJ1bnR1IDE0LjA0LCB0aGUgcHJldmlvdXMgVWJ1bnR1IExUUworcmVsZWFzZSwgYXMgYGNtYWtlM2AuXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvZG9jcy9Bc3NlbWJseVRlc3RzLm1kIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvZG9jcy9Bc3NlbWJseVRlc3RzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYmRjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9kb2NzL0Fzc2VtYmx5VGVzdHMubWQKQEAgLTAsMCArMSwxNDcgQEAKKyMgQXNzZW1ibHkgVGVzdHMKKworVGhlIEJlbmNobWFyayBsaWJyYXJ5IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB3aG9zZSBwcmltYXJ5CitwdXJwb3NlIGluIHRvIGFmZmVjdCBhc3NlbWJseSBnZW5lcmF0aW9uLCBpbmNsdWRpbmcgYERvTm90T3B0aW1pemVgCithbmQgYENsb2JiZXJNZW1vcnlgLiBJbiBhZGRpdGlvbiB0aGVyZSBhcmUgb3RoZXIgZnVuY3Rpb25zLAorc3VjaCBhcyBgS2VlcFJ1bm5pbmdgLCBmb3Igd2hpY2ggZ2VuZXJhdGluZyBnb29kIGFzc2VtYmx5IGlzIHBhcmFtb3VudC4KKworRm9yIHRoZXNlIGZ1bmN0aW9ucyBpdCdzIGltcG9ydGFudCB0byBoYXZlIHRlc3RzIHRoYXQgdmVyaWZ5IHRoZQorY29ycmVjdG5lc3MgYW5kIHF1YWxpdHkgb2YgdGhlIGltcGxlbWVudGF0aW9uLiBUaGlzIHJlcXVpcmVzIHRlc3RpbmcKK3RoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIuCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0aGUgQmVuY2htYXJrIGxpYnJhcnkgdGVzdHMgY29tcGlsZXIgb3V0cHV0LAorYXMgd2VsbCBhcyBob3cgdG8gcHJvcGVybHkgd3JpdGUgbmV3IHRlc3RzLgorCisKKyMjIEFuYXRvbXkgb2YgYSBUZXN0CisKK1dyaXRpbmcgYSB0ZXN0IGhhcyB0d28gc3RlcHM6CisKKyogV3JpdGUgdGhlIGNvZGUgeW91IHdhbnQgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZm9yLgorKiBBZGQgYC8vIENIRUNLYCBsaW5lcyB0byBtYXRjaCBhZ2FpbnN0IHRoZSB2ZXJpZmllZCBhc3NlbWJseS4KKworRXhhbXBsZToKK2BgYGMrKworCisvLyBDSEVDSy1MQUJFTDogdGVzdF9hZGQ6CitleHRlcm4gIkMiIGludCB0ZXN0X2FkZCgpIHsKKyAgICBleHRlcm4gaW50IEV4dGVybkludDsKKyAgICByZXR1cm4gRXh0ZXJuSW50ICsgMTsKKworICAgIC8vIENIRUNLOiBtb3ZsIEV4dGVybkludCglcmlwKSwgJWVheAorICAgIC8vIENIRUNLOiBhZGRsICVlYXgKKyAgICAvLyBDSEVDSzogcmV0Cit9CisKK2BgYAorCisjIyMjIExMVk0gRmlsZWNoZWNrCisKK1tMTFZNJ3MgRmlsZWNoZWNrXShodHRwczovL2xsdm0ub3JnL2RvY3MvQ29tbWFuZEd1aWRlL0ZpbGVDaGVjay5odG1sKQoraXMgdXNlZCB0byB0ZXN0IHRoZSBnZW5lcmF0ZWQgYXNzZW1ibHkgYWdhaW5zdCB0aGUgYC8vIENIRUNLYCBsaW5lcworc3BlY2lmaWVkIGluIHRoZSB0ZXN0cyBzb3VyY2UgZmlsZS4gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbgorbGlua2VkIGFib3ZlIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gd3JpdGUgYENIRUNLYCBkaXJlY3RpdmVzLgorCisjIyMjIFRpcHMgYW5kIFRyaWNrczoKKworKiBUZXN0cyBzaG91bGQgbWF0Y2ggdGhlIG1pbmltYWwgYW1vdW50IG9mIG91dHB1dCByZXF1aXJlZCB0byBlc3RhYmxpc2gKK2NvcnJlY3RuZXNzLiBgQ0hFQ0tgIGRpcmVjdGl2ZXMgZG9uJ3QgaGF2ZSB0byBtYXRjaCBvbiB0aGUgZXhhY3QgbmV4dCBsaW5lCithZnRlciB0aGUgcHJldmlvdXMgbWF0Y2gsIHNvIHRlc3RzIHNob3VsZCBvbWl0IGNoZWNrcyBmb3IgdW5pbXBvcnRhbnQKK2JpdHMgb2YgYXNzZW1ibHkuIChbYENIRUNLLU5FWFRgXShodHRwczovL2xsdm0ub3JnL2RvY3MvQ29tbWFuZEd1aWRlL0ZpbGVDaGVjay5odG1sI3RoZS1jaGVjay1uZXh0LWRpcmVjdGl2ZSkKK2NhbiBiZSB1c2VkIHRvIGVuc3VyZSBhIG1hdGNoIG9jY3VycyBleGFjdGx5IGFmdGVyIHRoZSBwcmV2aW91cyBtYXRjaCkuCisKKyogVGhlIHRlc3RzIGFyZSBjb21waWxlZCB3aXRoIGAtTzMgLWcwYC4gU28gd2UncmUgb25seSB0ZXN0aW5nIHRoZQorb3B0aW1pemVkIG91dHB1dC4KKworKiBUaGUgYXNzZW1ibHkgb3V0cHV0IGlzIGZ1cnRoZXIgY2xlYW5lZCB1cCB1c2luZyBgdG9vbHMvc3RyaXBfYXNtLnB5YC4KK1RoaXMgcmVtb3ZlcyBjb21tZW50cywgYXNzZW1ibGVyIGRpcmVjdGl2ZXMsIGFuZCB1bnVzZWQgbGFiZWxzIGJlZm9yZQordGhlIHRlc3QgaXMgcnVuLgorCisqIFRoZSBnZW5lcmF0ZWQgYW5kIHN0cmlwcGVkIGFzc2VtYmx5IGZpbGUgZm9yIGEgdGVzdCBpcyBvdXRwdXQgdW5kZXIKK2A8YnVpbGQtZGlyZWN0b3J5Pi90ZXN0Lzx0ZXN0LW5hbWU+LnNgCisKKyogRmlsZWNoZWNrIHN1cHBvcnRzIHVzaW5nIFtgQ0hFQ0tgIHByZWZpeGVzXShodHRwczovL2xsdm0ub3JnL2RvY3MvQ29tbWFuZEd1aWRlL0ZpbGVDaGVjay5odG1sI2NtZG9wdGlvbi1jaGVjay1wcmVmaXhlcykKK3RvIHNwZWNpZnkgbGluZXMgdGhhdCBzaG91bGQgb25seSBtYXRjaCBpbiBjZXJ0YWluIHNpdHVhdGlvbnMuCitUaGUgQmVuY2htYXJrIHRlc3RzIHVzZSBgQ0hFQ0stQ0xBTkdgIGFuZCBgQ0hFQ0stR05VYCBmb3IgbGluZXMgdGhhdAorYXJlIG9ubHkgZXhwZWN0ZWQgdG8gbWF0Y2ggQ2xhbmcgb3IgR0NDJ3Mgb3V0cHV0IHJlc3BlY3RpdmVseS4gTm9ybWFsCitgQ0hFQ0tgIGxpbmVzIG1hdGNoIGFnYWluc3QgYWxsIGNvbXBpbGVycy4gKE5vdGU6IGBDSEVDSy1OT1RgIGFuZAorYENIRUNLLUxBQkVMYCBhcmUgTk9UIHByZWZpeGVzLiBUaGV5IGFyZSB2ZXJzaW9ucyBvZiBub24tcHJlZml4ZWQKK2BDSEVDS2AgbGluZXMpCisKKyogVXNlIGBleHRlcm4gIkMiYCB0byBkaXNhYmxlIG5hbWUgbWFuZ2xpbmcgZm9yIHNwZWNpZmljIGZ1bmN0aW9ucy4gVGhpcworbWFrZXMgdGhlbSBlYXNpZXIgdG8gbmFtZSBpbiB0aGUgYENIRUNLYCBsaW5lcy4KKworCisjIyBQcm9ibGVtcyBXcml0aW5nIFBvcnRhYmxlIFRlc3RzCisKK1dyaXRpbmcgdGVzdHMgd2hpY2ggY2hlY2sgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IGEgY29tcGlsZXIgYXJlCitpbmhlcmVudGx5IG5vbi1wb3J0YWJsZS4gRGlmZmVyZW50IGNvbXBpbGVycyBhbmQgZXZlbiBkaWZmZXJlbnQgY29tcGlsZXIKK3ZlcnNpb25zIG1heSBnZW5lcmF0ZSBlbnRpcmVseSBkaWZmZXJlbnQgY29kZS4gVGhlIEJlbmNobWFyayB0ZXN0cworbXVzdCB0b2xlcmF0ZSB0aGlzLgorCitMTFZNIEZpbGVjaGVjayBwcm92aWRlcyBhIG51bWJlciBvZiBtZWNoYW5pc21zIHRvIGhlbHAgd3JpdGUKKyJtb3JlIHBvcnRhYmxlIiB0ZXN0czsgaW5jbHVkaW5nIFttYXRjaGluZyB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zXShodHRwczovL2xsdm0ub3JnL2RvY3MvQ29tbWFuZEd1aWRlL0ZpbGVDaGVjay5odG1sI2ZpbGVjaGVjay1wYXR0ZXJuLW1hdGNoaW5nLXN5bnRheCksCithbGxvd2luZyB0aGUgY3JlYXRpb24gb2YgW25hbWVkIHZhcmlhYmxlc10oaHR0cHM6Ly9sbHZtLm9yZy9kb2NzL0NvbW1hbmRHdWlkZS9GaWxlQ2hlY2suaHRtbCNmaWxlY2hlY2stdmFyaWFibGVzKQorZm9yIGxhdGVyIG1hdGNoaW5nLCBhbmQgW2NoZWNraW5nIG5vbi1zZXF1ZW50aWFsIG1hdGNoZXNdKGh0dHBzOi8vbGx2bS5vcmcvZG9jcy9Db21tYW5kR3VpZGUvRmlsZUNoZWNrLmh0bWwjdGhlLWNoZWNrLWRhZy1kaXJlY3RpdmUpLgorCisjIyMjIENhcHR1cmluZyBWYXJpYWJsZXMKKworRm9yIGV4YW1wbGUsIHNheSBHQ0Mgc3RvcmVzIGEgdmFyaWFibGUgaW4gYSByZWdpc3RlciBidXQgQ2xhbmcgc3RvcmVzCitpdCBpbiBtZW1vcnkuIFRvIHdyaXRlIGEgdGVzdCB0aGF0IHRvbGVyYXRlcyBib3RoIGNhc2VzIHdlICJjYXB0dXJlIgordGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBzdG9yZSwgYW5kIHRoZW4gdXNlIHRoZSBjYXB0dXJlZCBleHByZXNzaW9uCit0byB3cml0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0LgorCitgYGBjKysKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X2Rpdl9ub19vcF9pbnRvX3NocjoKK2V4dGVybiAiQyIgdm9pZCB0ZXN0X2Rpdl9ub19vcF9pbnRvX3NocihpbnQgdmFsdWUpIHsKKyAgICBpbnQgZGl2aXNvciA9IDI7CisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGRpdmlzb3IpOyAvLyBoaWRlIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcHRpbWl6ZXIKKyAgICByZXR1cm4gdmFsdWUgLyBkaXZpc29yOworCisgICAgLy8gQ0hFQ0s6IG1vdmwgJDIsIFtbREVTVDouKl1dCisgICAgLy8gQ0hFQ0s6IGlkaXZsIFtbREVTVF1dCisgICAgLy8gQ0hFQ0s6IHJldAorfQorYGBgCisKKyMjIyMgVXNpbmcgUmVndWxhciBFeHByZXNzaW9ucyB0byBNYXRjaCBEaWZmZXJpbmcgT3V0cHV0CisKK09mdGVuIHRlc3RzIHJlcXVpcmUgdGVzdGluZyBhc3NlbWJseSBsaW5lcyB3aGljaCBtYXkgc3VidGx5IGRpZmZlcgorYmV0d2VlbiBjb21waWxlcnMgb3IgY29tcGlsZXIgdmVyc2lvbnMuIEEgY29tbW9uIGV4YW1wbGUgb2YgdGhpcworaXMgbWF0Y2hpbmcgc3RhY2sgZnJhbWUgYWRkcmVzc2VzLiBJbiB0aGlzIGNhc2UgcmVndWxhciBleHByZXNzaW9ucworY2FuIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIGRpZmZlcmluZyBiaXRzIG9mIG91dHB1dC4gRm9yIGV4YW1wbGU6CisKK2BgYGMrKworaW50IEV4dGVybkludDsKK3N0cnVjdCBQb2ludCB7IGludCB4LCB5LCB6OyB9OworCisvLyBDSEVDSy1MQUJFTDogdGVzdF9zdG9yZV9wb2ludDoKK2V4dGVybiAiQyIgdm9pZCB0ZXN0X3N0b3JlX3BvaW50KCkgeworICAgIFBvaW50IHB7RXh0ZXJuSW50LCBFeHRlcm5JbnQsIEV4dGVybkludH07CisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHApOworCisgICAgLy8gQ0hFQ0s6IG1vdmwgRXh0ZXJuSW50KCVyaXApLCAlZWF4CisgICAgLy8gQ0hFQ0s6IG1vdmwgJWVheCwgLXt7WzAtOV0rfX0oJXJzcCkKKyAgICAvLyBDSEVDSzogbW92bCAlZWF4LCAte3tbMC05XSt9fSglcnNwKQorICAgIC8vIENIRUNLOiBtb3ZsICVlYXgsIC17e1swLTldK319KCVyc3ApCisgICAgLy8gQ0hFQ0s6IHJldAorfQorYGBgCisKKyMjIEN1cnJlbnQgUmVxdWlyZW1lbnRzIGFuZCBMaW1pdGF0aW9ucworCitUaGUgdGVzdHMgcmVxdWlyZSBGaWxlY2hlY2sgdG8gYmUgaW5zdGFsbGVkIGFsb25nIHRoZSBgUEFUSGAgb2YgdGhlCitidWlsZCBtYWNoaW5lLiBPdGhlcndpc2UgdGhlIHRlc3RzIHdpbGwgYmUgZGlzYWJsZWQuCisKK0FkZGl0aW9uYWxseSwgYXMgbWVudGlvbmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBjb2RlZ2VuIHRlc3RzIGFyZQoraW5oZXJlbnRseSBub24tcG9ydGFibGUuIEN1cnJlbnRseSB0aGUgdGVzdHMgYXJlIGxpbWl0ZWQgdG86CisKKyogeDg2XzY0IHRhcmdldHMuCisqIENvbXBpbGVkIHdpdGggR0NDIG9yIENsYW5nCisKK0Z1cnRoZXIgd29yayBjb3VsZCBiZSBkb25lLCBhdCBsZWFzdCBvbiBhIGxpbWl0ZWQgYmFzaXMsIHRvIGV4dGVuZCB0aGUKK3Rlc3RzIHRvIG90aGVyIGFyY2hpdGVjdHVyZXMgYW5kIGNvbXBpbGVycyAodXNpbmcgYENIRUNLYCBwcmVmaXhlcykuCisKK0Z1cnRoZXJtb3JlLCB0aGUgdGVzdHMgZmFpbCBmb3IgYnVpbGRzIHdoaWNoIHNwZWNpZnkgYWRkaXRpb25hbCBmbGFncwordGhhdCBtb2RpZnkgY29kZSBnZW5lcmF0aW9uLCBpbmNsdWRpbmcgYC0tY292ZXJhZ2VgIG9yIGAtZnNhbml0aXplPWAuCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2RvY3MvX2NvbmZpZy55bWwgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9kb2NzL19jb25maWcueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODU0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9kb2NzL19jb25maWcueW1sCkBAIC0wLDAgKzEgQEAKK3RoZW1lOiBqZWt5bGwtdGhlbWUtbWlkbmlnaHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9kb2NzL3Rvb2xzLm1kIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvZG9jcy90b29scy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTNiMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvZG9jcy90b29scy5tZApAQCAtMCwwICsxLDE5OSBAQAorIyBCZW5jaG1hcmsgVG9vbHMKKworIyMgY29tcGFyZS5weQorCitUaGUgYGNvbXBhcmUucHlgIGNhbiBiZSB1c2VkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdCBvZiBiZW5jaG1hcmtzLgorCisqKk5PVEUqKjogdGhlIHV0aWxpdHkgcmVsaWVzIG9uIHRoZSBzY2lweSBwYWNrYWdlIHdoaWNoIGNhbiBiZSBpbnN0YWxsZWQgdXNpbmcgW3RoZXNlIGluc3RydWN0aW9uc10oaHR0cHM6Ly93d3cuc2NpcHkub3JnL2luc3RhbGwuaHRtbCkuCisKKyMjIyBEaXNwbGF5aW5nIGFnZ3JlZ2F0ZXMgb25seQorCitUaGUgc3dpdGNoIGAtYWAgLyBgLS1kaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seWAgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUKK2Rpc3BsYXltZW50IG9mIHRoZSBub3JtYWwgaXRlcmF0aW9ucyB2cyB0aGUgYWdncmVnYXRlcy4gV2hlbiBwYXNzZWQsIGl0IHdpbGwKK2JlIHBhc3N0aHJvdWdoIHRvIHRoZSBiZW5jaG1hcmsgYmluYXJpZXMgdG8gYmUgcnVuLCBhbmQgd2lsbCBiZSBhY2NvdW50ZWQgZm9yCitpbiB0aGUgdG9vbCBpdHNlbGY7IG9ubHkgdGhlIGFnZ3JlZ2F0ZXMgd2lsbCBiZSBkaXNwbGF5ZWQsIGJ1dCBub3Qgbm9ybWFsIHJ1bnMuCitJdCBvbmx5IGFmZmVjdHMgdGhlIGRpc3BsYXksIHRoZSBzZXBhcmF0ZSBydW5zIHdpbGwgc3RpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUKK3RoZSBVIHRlc3QuCisKKyMjIyBNb2RlcyBvZiBvcGVyYXRpb24KKworVGhlcmUgYXJlIHRocmVlIG1vZGVzIG9mIG9wZXJhdGlvbjoKKworMS4gSnVzdCBjb21wYXJlIHR3byBiZW5jaG1hcmtzCitUaGUgcHJvZ3JhbSBpcyBpbnZva2VkIGxpa2U6CisKK2BgYCBiYXNoCiskIGNvbXBhcmUucHkgYmVuY2htYXJrcyA8YmVuY2htYXJrX2Jhc2VsaW5lPiA8YmVuY2htYXJrX2NvbnRlbmRlcj4gW2JlbmNobWFyayBvcHRpb25zXS4uLgorYGBgCitXaGVyZSBgPGJlbmNobWFya19iYXNlbGluZT5gIGFuZCBgPGJlbmNobWFya19jb250ZW5kZXI+YCBlaXRoZXIgc3BlY2lmeSBhIGJlbmNobWFyayBleGVjdXRhYmxlIGZpbGUsIG9yIGEgSlNPTiBvdXRwdXQgZmlsZS4gVGhlIHR5cGUgb2YgdGhlIGlucHV0IGZpbGUgaXMgYXV0b21hdGljYWxseSBkZXRlY3RlZC4gSWYgYSBiZW5jaG1hcmsgZXhlY3V0YWJsZSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgYmVuY2htYXJrIGlzIHJ1biB0byBvYnRhaW4gdGhlIHJlc3VsdHMuIE90aGVyd2lzZSB0aGUgcmVzdWx0cyBhcmUgc2ltcGx5IGxvYWRlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KKworYFtiZW5jaG1hcmsgb3B0aW9uc11gIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBiZW5jaG1hcmtzIGludm9jYXRpb25zLiBUaGV5IGNhbiBiZSBhbnl0aGluZyB0aGF0IGJpbmFyeSBhY2NlcHRzLCBiZSBpdCBlaXRoZXIgbm9ybWFsIGAtLWJlbmNobWFya18qYCBwYXJhbWV0ZXJzLCBvciBzb21lIGN1c3RvbSBwYXJhbWV0ZXJzIHlvdXIgYmluYXJ5IHRha2VzLgorCitFeGFtcGxlIG91dHB1dDoKK2BgYAorJCAuL2NvbXBhcmUucHkgYmVuY2htYXJrcyAuL2Eub3V0IC4vYS5vdXQKK1JVTk5JTkc6IC4vYS5vdXQgLS1iZW5jaG1hcmtfb3V0PS90bXAvdG1wckJUNW5XCitSdW4gb24gKDggWCA0MDAwIE1IeiBDUFUgcykKKzIwMTctMTEtMDcgMjE6MTY6NDQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQmVuY2htYXJrICAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgQ1BVIEl0ZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fbWVtY3B5LzggICAgICAgICAgICAzNiBucyAgICAgICAgIDM2IG5zICAgMTkxMDE1NzcgICAyMTEuNjY5TUIvcworQk1fbWVtY3B5LzY0ICAgICAgICAgICA3NiBucyAgICAgICAgIDc2IG5zICAgIDk0MTI1NzEgICA4MDAuMTk5TUIvcworQk1fbWVtY3B5LzUxMiAgICAgICAgICA4NCBucyAgICAgICAgIDg0IG5zICAgIDgyNDkwNzAgICA1LjY0NzcxR0IvcworQk1fbWVtY3B5LzEwMjQgICAgICAgIDExNiBucyAgICAgICAgMTE2IG5zICAgIDYxODE3NjMgICA4LjE5NTA1R0IvcworQk1fbWVtY3B5LzgxOTIgICAgICAgIDY0MyBucyAgICAgICAgNjQzIG5zICAgIDEwNjI4NTUgICAxMS44NjM2R0IvcworQk1fY29weS84ICAgICAgICAgICAgIDIyMiBucyAgICAgICAgMjIyIG5zICAgIDMxMzc5ODcgICAzNC4zNzcyTUIvcworQk1fY29weS82NCAgICAgICAgICAgMTYwOCBucyAgICAgICAxNjA4IG5zICAgICA0MzI3NTggICAzNy45NTAxTUIvcworQk1fY29weS81MTIgICAgICAgICAxMjU4OSBucyAgICAgIDEyNTg5IG5zICAgICAgNTQ4MDYgICAzOC43ODY3TUIvcworQk1fY29weS8xMDI0ICAgICAgICAyNTE2OSBucyAgICAgIDI1MTY5IG5zICAgICAgMjc3MTMgICAzOC44MDAzTUIvcworQk1fY29weS84MTkyICAgICAgIDIwMTE2NSBucyAgICAgMjAxMTEyIG5zICAgICAgIDM0ODYgICAzOC44NDY2TUIvcworUlVOTklORzogLi9hLm91dCAtLWJlbmNobWFya19vdXQ9L3RtcC90bXB0MXd3R18KK1J1biBvbiAoOCBYIDQwMDAgTUh6IENQVSBzKQorMjAxNy0xMS0wNyAyMToxNjo1MworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCZW5jaG1hcmsgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICBDUFUgSXRlcmF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCTV9tZW1jcHkvOCAgICAgICAgICAgIDM2IG5zICAgICAgICAgMzYgbnMgICAxOTM5NzkwMyAgIDIxMS4yNTVNQi9zCitCTV9tZW1jcHkvNjQgICAgICAgICAgIDczIG5zICAgICAgICAgNzMgbnMgICAgOTY5MTE3NCAgIDgzOS42MzVNQi9zCitCTV9tZW1jcHkvNTEyICAgICAgICAgIDg1IG5zICAgICAgICAgODUgbnMgICAgODMxMjMyOSAgIDUuNjAxMDFHQi9zCitCTV9tZW1jcHkvMTAyNCAgICAgICAgMTE4IG5zICAgICAgICAxMTggbnMgICAgNjQzODc3NCAgIDguMTE2MDhHQi9zCitCTV9tZW1jcHkvODE5MiAgICAgICAgNjU2IG5zICAgICAgICA2NTYgbnMgICAgMTA2ODY0NCAgIDExLjYyNzdHQi9zCitCTV9jb3B5LzggICAgICAgICAgICAgMjIzIG5zICAgICAgICAyMjMgbnMgICAgMzE0Njk3NyAgIDM0LjIzMzhNQi9zCitCTV9jb3B5LzY0ICAgICAgICAgICAxNjExIG5zICAgICAgIDE2MTEgbnMgICAgIDQzNTM0MCAgIDM3Ljg3NTFNQi9zCitCTV9jb3B5LzUxMiAgICAgICAgIDEyNjIyIG5zICAgICAgMTI2MjIgbnMgICAgICA1NDgxOCAgIDM4LjY4NDRNQi9zCitCTV9jb3B5LzEwMjQgICAgICAgIDI1MjU3IG5zICAgICAgMjUyMzkgbnMgICAgICAyNzc3OSAgIDM4LjY5MjdNQi9zCitCTV9jb3B5LzgxOTIgICAgICAgMjA1MDEzIG5zICAgICAyMDUwMTAgbnMgICAgICAgMzQ3OSAgICAzOC4xMDhNQi9zCitDb21wYXJpbmcgLi9hLm91dCB0byAuL2Eub3V0CitCZW5jaG1hcmsgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgICAgQ1BVICAgICAgVGltZSBPbGQgICAgICBUaW1lIE5ldyAgICAgICBDUFUgT2xkICAgICAgIENQVSBOZXcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fbWVtY3B5LzggICAgICAgICAgICArMC4wMDIwICAgICAgICAgKzAuMDAyMCAgICAgICAgICAgIDM2ICAgICAgICAgICAgMzYgICAgICAgICAgICAzNiAgICAgICAgICAgIDM2CitCTV9tZW1jcHkvNjQgICAgICAgICAgIC0wLjA0NjggICAgICAgICAtMC4wNDcwICAgICAgICAgICAgNzYgICAgICAgICAgICA3MyAgICAgICAgICAgIDc2ICAgICAgICAgICAgNzMKK0JNX21lbWNweS81MTIgICAgICAgICAgKzAuMDA4MSAgICAgICAgICswLjAwODMgICAgICAgICAgICA4NCAgICAgICAgICAgIDg1ICAgICAgICAgICAgODQgICAgICAgICAgICA4NQorQk1fbWVtY3B5LzEwMjQgICAgICAgICArMC4wMDk4ICAgICAgICAgKzAuMDA5NyAgICAgICAgICAgMTE2ICAgICAgICAgICAxMTggICAgICAgICAgIDExNiAgICAgICAgICAgMTE4CitCTV9tZW1jcHkvODE5MiAgICAgICAgICswLjAyMDAgICAgICAgICArMC4wMjAzICAgICAgICAgICA2NDMgICAgICAgICAgIDY1NiAgICAgICAgICAgNjQzICAgICAgICAgICA2NTYKK0JNX2NvcHkvOCAgICAgICAgICAgICAgKzAuMDA0NiAgICAgICAgICswLjAwNDIgICAgICAgICAgIDIyMiAgICAgICAgICAgMjIzICAgICAgICAgICAyMjIgICAgICAgICAgIDIyMworQk1fY29weS82NCAgICAgICAgICAgICArMC4wMDIwICAgICAgICAgKzAuMDAyMCAgICAgICAgICAxNjA4ICAgICAgICAgIDE2MTEgICAgICAgICAgMTYwOCAgICAgICAgICAxNjExCitCTV9jb3B5LzUxMiAgICAgICAgICAgICswLjAwMjcgICAgICAgICArMC4wMDI2ICAgICAgICAgMTI1ODkgICAgICAgICAxMjYyMiAgICAgICAgIDEyNTg5ICAgICAgICAgMTI2MjIKK0JNX2NvcHkvMTAyNCAgICAgICAgICAgKzAuMDAzNSAgICAgICAgICswLjAwMjggICAgICAgICAyNTE2OSAgICAgICAgIDI1MjU3ICAgICAgICAgMjUxNjkgICAgICAgICAyNTIzOQorQk1fY29weS84MTkyICAgICAgICAgICArMC4wMTkxICAgICAgICAgKzAuMDE5NCAgICAgICAgMjAxMTY1ICAgICAgICAyMDUwMTMgICAgICAgIDIwMTExMiAgICAgICAgMjA1MDEwCitgYGAKKworV2hhdCBpdCBkb2VzIGlzIGZvciB0aGUgZXZlcnkgYmVuY2htYXJrIGZyb20gdGhlIGZpcnN0IHJ1biBpdCBsb29rcyBmb3IgdGhlIGJlbmNobWFyayB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2Vjb25kIHJ1biwgYW5kIHRoZW4gY29tcGFyZXMgdGhlIHJlc3VsdHMuIElmIHRoZSBuYW1lcyBkaWZmZXIsIHRoZSBiZW5jaG1hcmsgaXMgb21pdHRlZCBmcm9tIHRoZSBkaWZmLgorQXMgeW91IGNhbiBub3RlLCB0aGUgdmFsdWVzIGluIGBUaW1lYCBhbmQgYENQVWAgY29sdW1ucyBhcmUgY2FsY3VsYXRlZCBhcyBgKG5ldyAtIG9sZCkgLyB8b2xkfGAuCisKKzIuIENvbXBhcmUgdHdvIGRpZmZlcmVudCBmaWx0ZXJzIG9mIG9uZSBiZW5jaG1hcmsKK1RoZSBwcm9ncmFtIGlzIGludm9rZWQgbGlrZToKKworYGBgIGJhc2gKKyQgY29tcGFyZS5weSBmaWx0ZXJzIDxiZW5jaG1hcms+IDxmaWx0ZXJfYmFzZWxpbmU+IDxmaWx0ZXJfY29udGVuZGVyPiBbYmVuY2htYXJrIG9wdGlvbnNdLi4uCitgYGAKK1doZXJlIGA8YmVuY2htYXJrPmAgZWl0aGVyIHNwZWNpZnkgYSBiZW5jaG1hcmsgZXhlY3V0YWJsZSBmaWxlLCBvciBhIEpTT04gb3V0cHV0IGZpbGUuIFRoZSB0eXBlIG9mIHRoZSBpbnB1dCBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQuIElmIGEgYmVuY2htYXJrIGV4ZWN1dGFibGUgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGJlbmNobWFyayBpcyBydW4gdG8gb2J0YWluIHRoZSByZXN1bHRzLiBPdGhlcndpc2UgdGhlIHJlc3VsdHMgYXJlIHNpbXBseSBsb2FkZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCisKK1doZXJlIGA8ZmlsdGVyX2Jhc2VsaW5lPmAgYW5kIGA8ZmlsdGVyX2NvbnRlbmRlcj5gIGFyZSB0aGUgc2FtZSByZWdleCBmaWx0ZXJzIHRoYXQgeW91IHdvdWxkIHBhc3MgdG8gdGhlIGBbLS1iZW5jaG1hcmtfZmlsdGVyPTxyZWdleD5dYCBwYXJhbWV0ZXIgb2YgdGhlIGJlbmNobWFyayBiaW5hcnkuCisKK2BbYmVuY2htYXJrIG9wdGlvbnNdYCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgYmVuY2htYXJrcyBpbnZvY2F0aW9ucy4gVGhleSBjYW4gYmUgYW55dGhpbmcgdGhhdCBiaW5hcnkgYWNjZXB0cywgYmUgaXQgZWl0aGVyIG5vcm1hbCBgLS1iZW5jaG1hcmtfKmAgcGFyYW1ldGVycywgb3Igc29tZSBjdXN0b20gcGFyYW1ldGVycyB5b3VyIGJpbmFyeSB0YWtlcy4KKworRXhhbXBsZSBvdXRwdXQ6CitgYGAKKyQgLi9jb21wYXJlLnB5IGZpbHRlcnMgLi9hLm91dCBCTV9tZW1jcHkgQk1fY29weQorUlVOTklORzogLi9hLm91dCAtLWJlbmNobWFya19maWx0ZXI9Qk1fbWVtY3B5IC0tYmVuY2htYXJrX291dD0vdG1wL3RtcEJXS2swaworUnVuIG9uICg4IFggNDAwMCBNSHogQ1BVIHMpCisyMDE3LTExLTA3IDIxOjM3OjI4CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbmNobWFyayAgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgIENQVSBJdGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JNX21lbWNweS84ICAgICAgICAgICAgMzYgbnMgICAgICAgICAzNiBucyAgIDE3ODkxNDkxICAgMjExLjIxNU1CL3MKK0JNX21lbWNweS82NCAgICAgICAgICAgNzQgbnMgICAgICAgICA3NCBucyAgICA5NDAwOTk5ICAgODI1LjY0Nk1CL3MKK0JNX21lbWNweS81MTIgICAgICAgICAgODcgbnMgICAgICAgICA4NyBucyAgICA4MDI3NDUzICAgNS40NjEyNkdCL3MKK0JNX21lbWNweS8xMDI0ICAgICAgICAxMTEgbnMgICAgICAgIDExMSBucyAgICA2MTE2ODUzICAgIDguNTY0OEdCL3MKK0JNX21lbWNweS84MTkyICAgICAgICA2NTcgbnMgICAgICAgIDY1NiBucyAgICAxMDY0Njc5ICAgMTEuNjI0N0dCL3MKK1JVTk5JTkc6IC4vYS5vdXQgLS1iZW5jaG1hcmtfZmlsdGVyPUJNX2NvcHkgLS1iZW5jaG1hcmtfb3V0PS90bXAvdG1wQXZXY09NCitSdW4gb24gKDggWCA0MDAwIE1IeiBDUFUgcykKKzIwMTctMTEtMDcgMjE6Mzc6MzMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbmNobWFyayAgICAgICAgICAgICBUaW1lICAgICAgICAgICBDUFUgSXRlcmF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fY29weS84ICAgICAgICAgICAyMjcgbnMgICAgICAgIDIyNyBucyAgICAzMDM4NzAwICAgMzMuNjI2NE1CL3MKK0JNX2NvcHkvNjQgICAgICAgICAxNjQwIG5zICAgICAgIDE2NDAgbnMgICAgIDQyNjg5MyAgIDM3LjIxNTRNQi9zCitCTV9jb3B5LzUxMiAgICAgICAxMjgwNCBucyAgICAgIDEyODAxIG5zICAgICAgNTU0MTcgICAzOC4xNDQ0TUIvcworQk1fY29weS8xMDI0ICAgICAgMjU0MDkgbnMgICAgICAyNTQwNyBucyAgICAgIDI3NTE2ICAgMzguNDM2NU1CL3MKK0JNX2NvcHkvODE5MiAgICAgMjAyOTg2IG5zICAgICAyMDI5OTAgbnMgICAgICAgMzQ1NCAgIDM4LjQ4NzFNQi9zCitDb21wYXJpbmcgQk1fbWVtY3B5IHRvIEJNX2NvcHkgKGZyb20gLi9hLm91dCkKK0JlbmNobWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgIENQVSAgICAgIFRpbWUgT2xkICAgICAgVGltZSBOZXcgICAgICAgQ1BVIE9sZCAgICAgICBDUFUgTmV3CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW0JNX21lbWNweSB2cy4gQk1fY29weV0vOCAgICAgICAgICAgICs1LjI4MjkgICAgICAgICArNS4yODEyICAgICAgICAgICAgMzYgICAgICAgICAgIDIyNyAgICAgICAgICAgIDM2ICAgICAgICAgICAyMjcKK1tCTV9tZW1jcHkgdnMuIEJNX2NvcHldLzY0ICAgICAgICAgICsyMS4xNzE5ICAgICAgICArMjEuMTg1NiAgICAgICAgICAgIDc0ICAgICAgICAgIDE2NDAgICAgICAgICAgICA3NCAgICAgICAgICAxNjQwCitbQk1fbWVtY3B5IHZzLiBCTV9jb3B5XS81MTIgICAgICAgICsxNDUuNjQ4NyAgICAgICArMTQ1LjYwOTcgICAgICAgICAgICA4NyAgICAgICAgIDEyODA0ICAgICAgICAgICAgODcgICAgICAgICAxMjgwMQorW0JNX21lbWNweSB2cy4gQk1fY29weV0vMTAyNCAgICAgICArMjI3LjE4NjAgICAgICAgKzIyNy4xNzc2ICAgICAgICAgICAxMTEgICAgICAgICAyNTQwOSAgICAgICAgICAgMTExICAgICAgICAgMjU0MDcKK1tCTV9tZW1jcHkgdnMuIEJNX2NvcHldLzgxOTIgICAgICAgKzMwOC4xNjY0ICAgICAgICszMDguMjg5OCAgICAgICAgICAgNjU3ICAgICAgICAyMDI5ODYgICAgICAgICAgIDY1NiAgICAgICAgMjAyOTkwCitgYGAKKworQXMgeW91IGNhbiBzZWUsIGl0IGFwcGxpZXMgZmlsdGVyIHRvIHRoZSBiZW5jaG1hcmtzLCBib3RoIHdoZW4gcnVubmluZyB0aGUgYmVuY2htYXJrLCBhbmQgYmVmb3JlIGRvaW5nIHRoZSBkaWZmLiBBbmQgdG8gbWFrZSB0aGUgZGlmZiB3b3JrLCB0aGUgbWF0Y2hlcyBhcmUgcmVwbGFjZWQgd2l0aCBzb21lIGNvbW1vbiBzdHJpbmcuIFRodXMsIHlvdSBjYW4gY29tcGFyZSB0d28gZGlmZmVyZW50IGJlbmNobWFyayBmYW1pbGllcyB3aXRoaW4gb25lIGJlbmNobWFyayBiaW5hcnkuCitBcyB5b3UgY2FuIG5vdGUsIHRoZSB2YWx1ZXMgaW4gYFRpbWVgIGFuZCBgQ1BVYCBjb2x1bW5zIGFyZSBjYWxjdWxhdGVkIGFzIGAobmV3IC0gb2xkKSAvIHxvbGR8YC4KKworMy4gQ29tcGFyZSBmaWx0ZXIgb25lIGZyb20gYmVuY2htYXJrIG9uZSB0byBmaWx0ZXIgdHdvIGZyb20gYmVuY2htYXJrIHR3bzoKK1RoZSBwcm9ncmFtIGlzIGludm9rZWQgbGlrZToKKworYGBgIGJhc2gKKyQgY29tcGFyZS5weSBmaWx0ZXJzIDxiZW5jaG1hcmtfYmFzZWxpbmU+IDxmaWx0ZXJfYmFzZWxpbmU+IDxiZW5jaG1hcmtfY29udGVuZGVyPiA8ZmlsdGVyX2NvbnRlbmRlcj4gW2JlbmNobWFyayBvcHRpb25zXS4uLgorYGBgCisKK1doZXJlIGA8YmVuY2htYXJrX2Jhc2VsaW5lPmAgYW5kIGA8YmVuY2htYXJrX2NvbnRlbmRlcj5gIGVpdGhlciBzcGVjaWZ5IGEgYmVuY2htYXJrIGV4ZWN1dGFibGUgZmlsZSwgb3IgYSBKU09OIG91dHB1dCBmaWxlLiBUaGUgdHlwZSBvZiB0aGUgaW5wdXQgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLiBJZiBhIGJlbmNobWFyayBleGVjdXRhYmxlIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBiZW5jaG1hcmsgaXMgcnVuIHRvIG9idGFpbiB0aGUgcmVzdWx0cy4gT3RoZXJ3aXNlIHRoZSByZXN1bHRzIGFyZSBzaW1wbHkgbG9hZGVkIGZyb20gdGhlIG91dHB1dCBmaWxlLgorCitXaGVyZSBgPGZpbHRlcl9iYXNlbGluZT5gIGFuZCBgPGZpbHRlcl9jb250ZW5kZXI+YCBhcmUgdGhlIHNhbWUgcmVnZXggZmlsdGVycyB0aGF0IHlvdSB3b3VsZCBwYXNzIHRvIHRoZSBgWy0tYmVuY2htYXJrX2ZpbHRlcj08cmVnZXg+XWAgcGFyYW1ldGVyIG9mIHRoZSBiZW5jaG1hcmsgYmluYXJ5LgorCitgW2JlbmNobWFyayBvcHRpb25zXWAgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGJlbmNobWFya3MgaW52b2NhdGlvbnMuIFRoZXkgY2FuIGJlIGFueXRoaW5nIHRoYXQgYmluYXJ5IGFjY2VwdHMsIGJlIGl0IGVpdGhlciBub3JtYWwgYC0tYmVuY2htYXJrXypgIHBhcmFtZXRlcnMsIG9yIHNvbWUgY3VzdG9tIHBhcmFtZXRlcnMgeW91ciBiaW5hcnkgdGFrZXMuCisKK0V4YW1wbGUgb3V0cHV0OgorYGBgCiskIC4vY29tcGFyZS5weSBiZW5jaG1hcmtzZmlsdGVyZWQgLi9hLm91dCBCTV9tZW1jcHkgLi9hLm91dCBCTV9jb3B5CitSVU5OSU5HOiAuL2Eub3V0IC0tYmVuY2htYXJrX2ZpbHRlcj1CTV9tZW1jcHkgLS1iZW5jaG1hcmtfb3V0PS90bXAvdG1wX0Z2YllnCitSdW4gb24gKDggWCA0MDAwIE1IeiBDUFUgcykKKzIwMTctMTEtMDcgMjE6Mzg6MjcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQmVuY2htYXJrICAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgQ1BVIEl0ZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fbWVtY3B5LzggICAgICAgICAgICAzNyBucyAgICAgICAgIDM3IG5zICAgMTg5NTM0ODIgICAyMDQuMTE4TUIvcworQk1fbWVtY3B5LzY0ICAgICAgICAgICA3NCBucyAgICAgICAgIDc0IG5zICAgIDkyMDY1NzggICA4MjguMjQ1TUIvcworQk1fbWVtY3B5LzUxMiAgICAgICAgICA5MSBucyAgICAgICAgIDkxIG5zICAgIDgwODYxOTUgICA1LjI1NDc2R0IvcworQk1fbWVtY3B5LzEwMjQgICAgICAgIDEyMCBucyAgICAgICAgMTIwIG5zICAgIDU4MDQ1MTMgICA3Ljk1NjYyR0IvcworQk1fbWVtY3B5LzgxOTIgICAgICAgIDY2NCBucyAgICAgICAgNjY0IG5zICAgIDEwMjgzNjMgICAxMS40OTQ4R0IvcworUlVOTklORzogLi9hLm91dCAtLWJlbmNobWFya19maWx0ZXI9Qk1fY29weSAtLWJlbmNobWFya19vdXQ9L3RtcC90bXBEZkw1aUUKK1J1biBvbiAoOCBYIDQwMDAgTUh6IENQVSBzKQorMjAxNy0xMS0wNyAyMTozODozMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQmVuY2htYXJrICAgICAgICAgICAgIFRpbWUgICAgICAgICAgIENQVSBJdGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCTV9jb3B5LzggICAgICAgICAgIDIzMCBucyAgICAgICAgMjMwIG5zICAgIDI5ODU5MDkgICAzMy4xMTYxTUIvcworQk1fY29weS82NCAgICAgICAgIDE2NTQgbnMgICAgICAgMTY1MyBucyAgICAgNDE5NDA4ICAgMzYuOTEzN01CL3MKK0JNX2NvcHkvNTEyICAgICAgIDEzMTIyIG5zICAgICAgMTMxMjAgbnMgICAgICA1MzQwMyAgIDM3LjIxNTZNQi9zCitCTV9jb3B5LzEwMjQgICAgICAyNjY3OSBucyAgICAgIDI2NjY2IG5zICAgICAgMjY1NzUgICAzNi42MjE4TUIvcworQk1fY29weS84MTkyICAgICAyMTUwNjggbnMgICAgIDIxNTA1MyBucyAgICAgICAzMjIxICAgMzYuMzI4M01CL3MKK0NvbXBhcmluZyBCTV9tZW1jcHkgKGZyb20gLi9hLm91dCkgdG8gQk1fY29weSAoZnJvbSAuL2Eub3V0KQorQmVuY2htYXJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgICAgQ1BVICAgICAgVGltZSBPbGQgICAgICBUaW1lIE5ldyAgICAgICBDUFUgT2xkICAgICAgIENQVSBOZXcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbQk1fbWVtY3B5IHZzLiBCTV9jb3B5XS84ICAgICAgICAgICAgKzUuMTY0OSAgICAgICAgICs1LjE2MzcgICAgICAgICAgICAzNyAgICAgICAgICAgMjMwICAgICAgICAgICAgMzcgICAgICAgICAgIDIzMAorW0JNX21lbWNweSB2cy4gQk1fY29weV0vNjQgICAgICAgICAgKzIxLjQzNTIgICAgICAgICsyMS40Mzc0ICAgICAgICAgICAgNzQgICAgICAgICAgMTY1NCAgICAgICAgICAgIDc0ICAgICAgICAgIDE2NTMKK1tCTV9tZW1jcHkgdnMuIEJNX2NvcHldLzUxMiAgICAgICAgKzE0My42MDIyICAgICAgICsxNDMuNTg2NSAgICAgICAgICAgIDkxICAgICAgICAgMTMxMjIgICAgICAgICAgICA5MSAgICAgICAgIDEzMTIwCitbQk1fbWVtY3B5IHZzLiBCTV9jb3B5XS8xMDI0ICAgICAgICsyMjEuNTkwMyAgICAgICArMjIxLjQ3OTAgICAgICAgICAgIDEyMCAgICAgICAgIDI2Njc5ICAgICAgICAgICAxMjAgICAgICAgICAyNjY2NgorW0JNX21lbWNweSB2cy4gQk1fY29weV0vODE5MiAgICAgICArMzIyLjkwNTkgICAgICAgKzMyMy4wMDk2ICAgICAgICAgICA2NjQgICAgICAgIDIxNTA2OCAgICAgICAgICAgNjY0ICAgICAgICAyMTUwNTMKK2BgYAorVGhpcyBpcyBhIG1peCBvZiB0aGUgcHJldmlvdXMgdHdvIG1vZGVzLCB0d28gKHBvdGVudGlhbGx5IGRpZmZlcmVudCkgYmVuY2htYXJrIGJpbmFyaWVzIGFyZSBydW4sIGFuZCBhIGRpZmZlcmVudCBmaWx0ZXIgaXMgYXBwbGllZCB0byBlYWNoIG9uZS4KK0FzIHlvdSBjYW4gbm90ZSwgdGhlIHZhbHVlcyBpbiBgVGltZWAgYW5kIGBDUFVgIGNvbHVtbnMgYXJlIGNhbGN1bGF0ZWQgYXMgYChuZXcgLSBvbGQpIC8gfG9sZHxgLgorCisjIyMgVSB0ZXN0CisKK0lmIHRoZXJlIGlzIGEgc3VmZmljaWVudCByZXBldGl0aW9uIGNvdW50IG9mIHRoZSBiZW5jaG1hcmtzLCB0aGUgdG9vbCBjYW4gZG8KK2EgW1UgVGVzdF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWFubiVFMiU4MCU5M1doaXRuZXlfVV90ZXN0KSwgb2YgdGhlCitudWxsIGh5cG90aGVzaXMgdGhhdCBpdCBpcyBlcXVhbGx5IGxpa2VseSB0aGF0IGEgcmFuZG9tbHkgc2VsZWN0ZWQgdmFsdWUgZnJvbQorb25lIHNhbXBsZSB3aWxsIGJlIGxlc3MgdGhhbiBvciBncmVhdGVyIHRoYW4gYSByYW5kb21seSBzZWxlY3RlZCB2YWx1ZSBmcm9tIGEKK3NlY29uZCBzYW1wbGUuCisKK0lmIHRoZSBjYWxjdWxhdGVkIHAtdmFsdWUgaXMgYmVsb3cgdGhpcyB2YWx1ZSBpcyBsb3dlciB0aGFuIHRoZSBzaWduaWZpY2FuY2UKK2xldmVsIGFscGhhLCB0aGVuIHRoZSByZXN1bHQgaXMgc2FpZCB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFuZCB0aGUKK251bGwgaHlwb3RoZXNpcyBpcyByZWplY3RlZC4gV2hpY2ggaW4gb3RoZXIgd29yZHMgbWVhbnMgdGhhdCB0aGUgdHdvIGJlbmNobWFya3MKK2FyZW4ndCBpZGVudGljYWwuCisKKyoqV0FSTklORyoqOiByZXF1aXJlcyAqKkxBUkdFKiogKG5vIGxlc3MgdGhhbiA5KSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgdG8gYmUKK21lYW5pbmdmdWwhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9nb29nbGVfYmVuY2htYXJrLmd5cCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL2dvb2dsZV9iZW5jaG1hcmsuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjQyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9nb29nbGVfYmVuY2htYXJrLmd5cApAQCAtMCwwICsxLDQ1IEBACisjIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworeworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZ29vZ2xlX2JlbmNobWFyaycsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3NyYy9iZW5jaG1hcmsuY2MnLAorICAgICAgICAnc3JjL2JlbmNobWFya19hcGlfaW50ZXJuYWwuY2MnLAorICAgICAgICAnc3JjL2JlbmNobWFya19uYW1lLmNjJywKKyAgICAgICAgJ3NyYy9iZW5jaG1hcmtfcmVnaXN0ZXIuY2MnLAorICAgICAgICAnc3JjL2JlbmNobWFya19ydW5uZXIuY2MnLAorICAgICAgICAnc3JjL2NvbG9ycHJpbnRfc3RhcmJvYXJkLmNjJywKKyAgICAgICAgJ3NyYy9jb21tYW5kbGluZWZsYWdzLmNjJywKKyAgICAgICAgJ3NyYy9jb21wbGV4aXR5LmNjJywKKyAgICAgICAgJ3NyYy9jb25zb2xlX3JlcG9ydGVyLmNjJywKKyAgICAgICAgJ3NyYy9jb3VudGVyLmNjJywKKyAgICAgICAgJ3NyYy9jc3ZfcmVwb3J0ZXIuY2MnLAorICAgICAgICAnc3JjL2pzb25fcmVwb3J0ZXIuY2MnLAorICAgICAgICAnc3JjL3JlcG9ydGVyLmNjJywKKyAgICAgICAgJ3NyYy9zbGVlcC5jYycsCisgICAgICAgICdzcmMvc3RhdGlzdGljcy5jYycsCisgICAgICAgICdzcmMvc3RyaW5nX3V0aWwuY2MnLAorICAgICAgICAnc3JjL3N5c2luZm8uY2MnLAorICAgICAgICAnc3JjL3RpbWVycy5jYycsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgJ2luY2x1ZGUnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvaW5jbHVkZS9iZW5jaG1hcmsvYmVuY2htYXJrLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9pbmNsdWRlL2JlbmNobWFyay9iZW5jaG1hcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRlMjEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvaW5jbHVkZS9iZW5jaG1hcmsvYmVuY2htYXJrLmgKQEAgLTAsMCArMSwxNTg2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBTdXBwb3J0IGZvciByZWdpc3RlcmluZyBiZW5jaG1hcmtzIGZvciBmdW5jdGlvbnMuCisKKy8qIEV4YW1wbGUgdXNhZ2U6CisvLyBEZWZpbmUgYSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBjb2RlIHRvIGJlIG1lYXN1cmVkIGEKKy8vIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXM6CitzdGF0aWMgdm9pZCBCTV9TdHJpbmdDcmVhdGlvbihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKQorICAgIHN0ZDo6c3RyaW5nIGVtcHR5X3N0cmluZzsKK30KKworLy8gUmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIGFzIGEgYmVuY2htYXJrCitCRU5DSE1BUksoQk1fU3RyaW5nQ3JlYXRpb24pOworCisvLyBEZWZpbmUgYW5vdGhlciBiZW5jaG1hcmsKK3N0YXRpYyB2b2lkIEJNX1N0cmluZ0NvcHkoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RkOjpzdHJpbmcgeCA9ICJoZWxsbyI7CisgIGZvciAoYXV0byBfIDogc3RhdGUpCisgICAgc3RkOjpzdHJpbmcgY29weSh4KTsKK30KK0JFTkNITUFSSyhCTV9TdHJpbmdDb3B5KTsKKworLy8gQXVnbWVudCB0aGUgbWFpbigpIHByb2dyYW0gdG8gaW52b2tlIGJlbmNobWFya3MgaWYgc3BlY2lmaWVkCisvLyB2aWEgdGhlIC0tYmVuY2htYXJrcyBjb21tYW5kIGxpbmUgZmxhZy4gIEUuZy4sCisvLyAgICAgICBteV91bml0dGVzdCAtLWJlbmNobWFya19maWx0ZXI9YWxsCisvLyAgICAgICBteV91bml0dGVzdCAtLWJlbmNobWFya19maWx0ZXI9Qk1fU3RyaW5nQ3JlYXRpb24KKy8vICAgICAgIG15X3VuaXR0ZXN0IC0tYmVuY2htYXJrX2ZpbHRlcj1TdHJpbmcKKy8vICAgICAgIG15X3VuaXR0ZXN0IC0tYmVuY2htYXJrX2ZpbHRlcj0nQ29weXxDcmVhdGlvbicKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBiZW5jaG1hcms6OkluaXRpYWxpemUoJmFyZ2MsIGFyZ3YpOworICBiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFNvbWV0aW1lcyBhIGZhbWlseSBvZiBtaWNyb2JlbmNobWFya3MgY2FuIGJlIGltcGxlbWVudGVkIHdpdGgKKy8vIGp1c3Qgb25lIHJvdXRpbmUgdGhhdCB0YWtlcyBhbiBleHRyYSBhcmd1bWVudCB0byBzcGVjaWZ5IHdoaWNoCisvLyBvbmUgb2YgdGhlIGZhbWlseSBvZiBiZW5jaG1hcmtzIHRvIHJ1bi4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCisvLyBjb2RlIGRlZmluZXMgYSBmYW1pbHkgb2YgbWljcm9iZW5jaG1hcmtzIGZvciBtZWFzdXJpbmcgdGhlIHNwZWVkCisvLyBvZiBtZW1jcHkoKSBjYWxscyBvZiBkaWZmZXJlbnQgbGVuZ3RoczoKKworc3RhdGljIHZvaWQgQk1fbWVtY3B5KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGNoYXIqIHNyYyA9IG5ldyBjaGFyW3N0YXRlLnJhbmdlKDApXTsgY2hhciogZHN0ID0gbmV3IGNoYXJbc3RhdGUucmFuZ2UoMCldOworICBtZW1zZXQoc3JjLCAneCcsIHN0YXRlLnJhbmdlKDApKTsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHN0YXRlLnJhbmdlKDApKTsKKyAgc3RhdGUuU2V0Qnl0ZXNQcm9jZXNzZWQoc3RhdGUuaXRlcmF0aW9ucygpICogc3RhdGUucmFuZ2UoMCkpOworICBkZWxldGVbXSBzcmM7IGRlbGV0ZVtdIGRzdDsKK30KK0JFTkNITUFSSyhCTV9tZW1jcHkpLT5BcmcoOCktPkFyZyg2NCktPkFyZyg1MTIpLT5BcmcoMTw8MTApLT5BcmcoODw8MTApOworCisvLyBUaGUgcHJlY2VkaW5nIGNvZGUgaXMgcXVpdGUgcmVwZXRpdGl2ZSwgYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRoIHRoZQorLy8gZm9sbG93aW5nIHNob3J0LWhhbmQuICBUaGUgZm9sbG93aW5nIGludm9jYXRpb24gd2lsbCBwaWNrIGEgZmV3CisvLyBhcHByb3ByaWF0ZSBhcmd1bWVudHMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSBhbmQgd2lsbCBnZW5lcmF0ZSBhCisvLyBtaWNyb2JlbmNobWFyayBmb3IgZWFjaCBzdWNoIGFyZ3VtZW50LgorQkVOQ0hNQVJLKEJNX21lbWNweSktPlJhbmdlKDgsIDg8PDEwKTsKKworLy8gWW91IG1pZ2h0IGhhdmUgYSBtaWNyb2JlbmNobWFyayB0aGF0IGRlcGVuZHMgb24gdHdvIGlucHV0cy4gIEZvcgorLy8gZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgYSBmYW1pbHkgb2YgbWljcm9iZW5jaG1hcmtzIGZvcgorLy8gbWVhc3VyaW5nIHRoZSBzcGVlZCBvZiBzZXQgaW5zZXJ0aW9uLgorc3RhdGljIHZvaWQgQk1fU2V0SW5zZXJ0KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIHNldDxpbnQ+IGRhdGE7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBzdGF0ZS5QYXVzZVRpbWluZygpOworICAgIGRhdGEgPSBDb25zdHJ1Y3RSYW5kb21TZXQoc3RhdGUucmFuZ2UoMCkpOworICAgIHN0YXRlLlJlc3VtZVRpbWluZygpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3RhdGUucmFuZ2UoMSk7ICsraikKKyAgICAgIGRhdGEuaW5zZXJ0KFJhbmRvbU51bWJlcigpKTsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX1NldEluc2VydCkKKyAgIC0+QXJncyh7MTw8MTAsIDEyOH0pCisgICAtPkFyZ3MoezI8PDEwLCAxMjh9KQorICAgLT5BcmdzKHs0PDwxMCwgMTI4fSkKKyAgIC0+QXJncyh7ODw8MTAsIDEyOH0pCisgICAtPkFyZ3MoezE8PDEwLCA1MTJ9KQorICAgLT5BcmdzKHsyPDwxMCwgNTEyfSkKKyAgIC0+QXJncyh7NDw8MTAsIDUxMn0pCisgICAtPkFyZ3Moezg8PDEwLCA1MTJ9KTsKKworLy8gVGhlIHByZWNlZGluZyBjb2RlIGlzIHF1aXRlIHJlcGV0aXRpdmUsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aAorLy8gdGhlIGZvbGxvd2luZyBzaG9ydC1oYW5kLiAgVGhlIGZvbGxvd2luZyBtYWNybyB3aWxsIHBpY2sgYSBmZXcKKy8vIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBpbiB0aGUgcHJvZHVjdCBvZiB0aGUgdHdvIHNwZWNpZmllZCByYW5nZXMKKy8vIGFuZCB3aWxsIGdlbmVyYXRlIGEgbWljcm9iZW5jaG1hcmsgZm9yIGVhY2ggc3VjaCBwYWlyLgorQkVOQ0hNQVJLKEJNX1NldEluc2VydCktPlJhbmdlcyh7ezE8PDEwLCA4PDwxMH0sIHsxMjgsIDUxMn19KTsKKworLy8gRm9yIG1vcmUgY29tcGxleCBwYXR0ZXJucyBvZiBpbnB1dHMsIHBhc3NpbmcgYSBjdXN0b20gZnVuY3Rpb24KKy8vIHRvIEFwcGx5IGFsbG93cyBwcm9ncmFtbWF0aWMgc3BlY2lmaWNhdGlvbiBvZiBhbgorLy8gYXJiaXRyYXJ5IHNldCBvZiBhcmd1bWVudHMgdG8gcnVuIHRoZSBtaWNyb2JlbmNobWFyayBvbi4KKy8vIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBlbnVtZXJhdGVzIGEgZGVuc2UgcmFuZ2Ugb24KKy8vIG9uZSBwYXJhbWV0ZXIsIGFuZCBhIHNwYXJzZSByYW5nZSBvbiB0aGUgc2Vjb25kLgorc3RhdGljIHZvaWQgQ3VzdG9tQXJndW1lbnRzKGJlbmNobWFyazo6aW50ZXJuYWw6OkJlbmNobWFyayogYikgeworICBmb3IgKGludCBpID0gMDsgaSA8PSAxMDsgKytpKQorICAgIGZvciAoaW50IGogPSAzMjsgaiA8PSAxMDI0KjEwMjQ7IGogKj0gOCkKKyAgICAgIGItPkFyZ3Moe2ksIGp9KTsKK30KK0JFTkNITUFSSyhCTV9TZXRJbnNlcnQpLT5BcHBseShDdXN0b21Bcmd1bWVudHMpOworCisvLyBUZW1wbGF0ZWQgbWljcm9iZW5jaG1hcmtzIHdvcmsgdGhlIHNhbWUgd2F5OgorLy8gUHJvZHVjZSB0aGVuIGNvbnN1bWUgJ3NpemUnIG1lc3NhZ2VzICdpdGVycycgdGltZXMKKy8vIE1lYXN1cmVzIHRocm91Z2hwdXQgaW4gdGhlIGFic2VuY2Ugb2YgbXVsdGlwcm9ncmFtbWluZy4KK3RlbXBsYXRlIDxjbGFzcyBRPiBpbnQgQk1fU2VxdWVudGlhbChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBRIHE7CisgIHR5cGVuYW1lIFE6OnZhbHVlX3R5cGUgdjsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGZvciAoaW50IGkgPSBzdGF0ZS5yYW5nZSgwKTsgaS0tOyApCisgICAgICBxLnB1c2godik7CisgICAgZm9yIChpbnQgZSA9IHN0YXRlLnJhbmdlKDApOyBlLS07ICkKKyAgICAgIHEuV2FpdCgmdik7CisgIH0KKyAgLy8gYWN0dWFsbHkgbWVzc2FnZXMsIG5vdCBieXRlczoKKyAgc3RhdGUuU2V0Qnl0ZXNQcm9jZXNzZWQoc3RhdGUuaXRlcmF0aW9ucygpICogc3RhdGUucmFuZ2UoMCkpOworfQorQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1NlcXVlbnRpYWwsIFdhaXRRdWV1ZTxpbnQ+KS0+UmFuZ2UoMTw8MCwgMTw8MTApOworCitVc2UgYEJlbmNobWFyazo6TWluVGltZShkb3VibGUgdClgIHRvIHNldCB0aGUgbWluaW11bSB0aW1lIHVzZWQgdG8gcnVuIHRoZQorYmVuY2htYXJrLiBUaGlzIG9wdGlvbiBvdmVycmlkZXMgdGhlIGBiZW5jaG1hcmtfbWluX3RpbWVgIGZsYWcuCisKK3ZvaWQgQk1fdGVzdChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworIC4uLiBib2R5IC4uLgorfQorQkVOQ0hNQVJLKEJNX3Rlc3QpLT5NaW5UaW1lKDIuMCk7IC8vIFJ1biBmb3IgYXQgbGVhc3QgMiBzZWNvbmRzLgorCitJbiBhIG11bHRpdGhyZWFkZWQgdGVzdCwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IG5vbmUgb2YgdGhlIHRocmVhZHMgd2lsbCBzdGFydAordW50aWwgYWxsIGhhdmUgcmVhY2hlZCB0aGUgbG9vcCBzdGFydCwgYW5kIGFsbCB3aWxsIGhhdmUgZmluaXNoZWQgYmVmb3JlIGFueQordGhyZWFkIGV4aXRzIHRoZSBsb29wIGJvZHkuIEFzIHN1Y2gsIGFueSBnbG9iYWwgc2V0dXAgb3IgdGVhcmRvd24geW91IHdhbnQgdG8KK2RvIGNhbiBiZSB3cmFwcGVkIGluIGEgY2hlY2sgYWdhaW5zdCB0aGUgdGhyZWFkIGluZGV4OgorCitzdGF0aWMgdm9pZCBCTV9NdWx0aVRocmVhZGVkKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGlmIChzdGF0ZS50aHJlYWRfaW5kZXggPT0gMCkgeworICAgIC8vIFNldHVwIGNvZGUgaGVyZS4KKyAgfQorICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgLy8gUnVuIHRoZSB0ZXN0IGFzIG5vcm1hbC4KKyAgfQorICBpZiAoc3RhdGUudGhyZWFkX2luZGV4ID09IDApIHsKKyAgICAvLyBUZWFyZG93biBjb2RlIGhlcmUuCisgIH0KK30KK0JFTkNITUFSSyhCTV9NdWx0aVRocmVhZGVkKS0+VGhyZWFkcyg0KTsKKworCitJZiBhIGJlbmNobWFyayBydW5zIGEgZmV3IG1pbGxpc2Vjb25kcyBpdCBtYXkgYmUgaGFyZCB0byB2aXN1YWxseSBjb21wYXJlIHRoZQorbWVhc3VyZWQgdGltZXMsIHNpbmNlIHRoZSBvdXRwdXQgZGF0YSBpcyBnaXZlbiBpbiBuYW5vc2Vjb25kcyBwZXIgZGVmYXVsdC4gSW4KK29yZGVyIHRvIG1hbnVhbGx5IHNldCB0aGUgdGltZSB1bml0LCB5b3UgY2FuIHNwZWNpZnkgaXQgbWFudWFsbHk6CisKK0JFTkNITUFSSyhCTV90ZXN0KS0+VW5pdChiZW5jaG1hcms6OmtNaWxsaXNlY29uZCk7CisqLworCisjaWZuZGVmIEJFTkNITUFSS19CRU5DSE1BUktfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0JFTkNITUFSS19IXworCisvLyBUaGUgX01TVkNfTEFORyBjaGVjayBzaG91bGQgZGV0ZWN0IFZpc3VhbCBTdHVkaW8gMjAxNSBVcGRhdGUgMyBhbmQgbmV3ZXIuCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCB8fCAoZGVmaW5lZChfTVNWQ19MQU5HKSAmJiBfTVNWQ19MQU5HID49IDIwMTEwM0wpCisjZGVmaW5lIEJFTkNITUFSS19IQVNfQ1hYMTEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19IQVNfQ1hYMTEpCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgPGludHJpbi5oPiAgLy8gZm9yIF9SZWFkV3JpdGVCYXJyaWVyCisjZW5kaWYKKworI2lmbmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCisjZGVmaW5lIEJFTkNITUFSS19ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlTmFtZSYgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAgXAorICBUeXBlTmFtZSYgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgQkVOQ0hNQVJLX1VOVVNFRCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2RlZmluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyNkZWZpbmUgQkVOQ0hNQVJLX05PRVhDRVBUIG5vZXhjZXB0CisjZGVmaW5lIEJFTkNITUFSS19OT0VYQ0VQVF9PUCh4KSBub2V4Y2VwdCh4KQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19jbGFuZ19fKQorI2RlZmluZSBCRU5DSE1BUktfVU5VU0VECisjZGVmaW5lIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIF9fZm9yY2VpbmxpbmUKKyNpZiBfTVNDX1ZFUiA+PSAxOTAwCisjZGVmaW5lIEJFTkNITUFSS19OT0VYQ0VQVCBub2V4Y2VwdAorI2RlZmluZSBCRU5DSE1BUktfTk9FWENFUFRfT1AoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19OT0VYQ0VQVAorI2RlZmluZSBCRU5DSE1BUktfTk9FWENFUFRfT1AoeCkKKyNlbmRpZgorI2RlZmluZSBfX2Z1bmNfXyBfX0ZVTkNUSU9OX18KKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19VTlVTRUQKKyNkZWZpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyNkZWZpbmUgQkVOQ0hNQVJLX05PRVhDRVBUCisjZGVmaW5lIEJFTkNITUFSS19OT0VYQ0VQVF9PUCh4KQorI2VuZGlmCisKKyNkZWZpbmUgQkVOQ0hNQVJLX0lOVEVSTkFMX1RPU1RSSU5HMih4KSAjeAorI2RlZmluZSBCRU5DSE1BUktfSU5URVJOQUxfVE9TVFJJTkcoeCkgQkVOQ0hNQVJLX0lOVEVSTkFMX1RPU1RSSU5HMih4KQorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIEJFTkNITUFSS19CVUlMVElOX0VYUEVDVCh4LCB5KSBfX2J1aWx0aW5fZXhwZWN0KHgsIHkpCisjZGVmaW5lIEJFTkNITUFSS19ERVBSRUNBVEVEX01TRyhtc2cpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQobXNnKSkpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfQlVJTFRJTl9FWFBFQ1QoeCwgeSkgeAorI2RlZmluZSBCRU5DSE1BUktfREVQUkVDQVRFRF9NU0cobXNnKQorI2RlZmluZSBCRU5DSE1BUktfV0FSTklOR19NU0cobXNnKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19wcmFnbWEobWVzc2FnZShfX0ZJTEVfXyAiKCIgQkVOQ0hNQVJLX0lOVEVSTkFMX1RPU1RSSU5HKCBcCisgICAgICBfX0xJTkVfXykgIikgOiB3YXJuaW5nIG5vdGU6ICIgbXNnKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19jbGFuZ19fKQorI2RlZmluZSBCRU5DSE1BUktfR0NDX1ZFUlNJT04gKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pCisjZW5kaWYKKworI2lmbmRlZiBfX2hhc19idWlsdGluCisjZGVmaW5lIF9faGFzX2J1aWx0aW4oeCkgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBfX2hhc19idWlsdGluKF9fYnVpbHRpbl91bnJlYWNoYWJsZSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1VOUkVBQ0hBQkxFKCkgX19idWlsdGluX3VucmVhY2hhYmxlKCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIEJFTkNITUFSS19VTlJFQUNIQUJMRSgpIF9fYXNzdW1lKGZhbHNlKQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX1VOUkVBQ0hBQkxFKCkgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CitjbGFzcyBCZW5jaG1hcmtSZXBvcnRlcjsKK2NsYXNzIE1lbW9yeU1hbmFnZXI7CisKK3ZvaWQgSW5pdGlhbGl6ZShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKKworLy8gUmVwb3J0IHRvIHN0ZG91dCBhbGwgYXJndW1lbnRzIGluICdhcmd2JyBhcyB1bnJlY29nbml6ZWQgZXhjZXB0IHRoZSBmaXJzdC4KKy8vIFJldHVybnMgdHJ1ZSB0aGVyZSBpcyBhdCBsZWFzdCBvbiB1bnJlY29nbml6ZWQgYXJndW1lbnQgKGkuZS4gJ2FyZ2MnID4gMSkuCitib29sIFJlcG9ydFVucmVjb2duaXplZEFyZ3VtZW50cyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpOworCisvLyBHZW5lcmF0ZSBhIGxpc3Qgb2YgYmVuY2htYXJrcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIC0tYmVuY2htYXJrX2ZpbHRlciBmbGFnCisvLyBhbmQgaWYgLS1iZW5jaG1hcmtfbGlzdF90ZXN0cyBpcyBzcGVjaWZpZWQgcmV0dXJuIGFmdGVyIHByaW50aW5nIHRoZSBuYW1lCisvLyBvZiBlYWNoIG1hdGNoaW5nIGJlbmNobWFyay4gT3RoZXJ3aXNlIHJ1biBlYWNoIG1hdGNoaW5nIGJlbmNobWFyayBhbmQKKy8vIHJlcG9ydCB0aGUgcmVzdWx0cy4KKy8vCisvLyBUaGUgc2Vjb25kIGFuZCB0aGlyZCBvdmVybG9hZCB1c2UgdGhlIHNwZWNpZmllZCAnZGlzcGxheV9yZXBvcnRlcicgYW5kCisvLyAgJ2ZpbGVfcmVwb3J0ZXInIHJlc3BlY3RpdmVseS4gJ2ZpbGVfcmVwb3J0ZXInIHdpbGwgd3JpdGUgdG8gdGhlIGZpbGUKKy8vICBzcGVjaWZpZWQKKy8vICAgYnkgJy0tYmVuY2htYXJrX291dHB1dCcuIElmICctLWJlbmNobWFya19vdXRwdXQnIGlzIG5vdCBnaXZlbiB0aGUKKy8vICAnZmlsZV9yZXBvcnRlcicgaXMgaWdub3JlZC4KKy8vCisvLyBSRVRVUk5TOiBUaGUgbnVtYmVyIG9mIG1hdGNoaW5nIGJlbmNobWFya3MuCitzaXplX3QgUnVuU3BlY2lmaWVkQmVuY2htYXJrcygpOworc2l6ZV90IFJ1blNwZWNpZmllZEJlbmNobWFya3MoQmVuY2htYXJrUmVwb3J0ZXIqIGRpc3BsYXlfcmVwb3J0ZXIpOworc2l6ZV90IFJ1blNwZWNpZmllZEJlbmNobWFya3MoQmVuY2htYXJrUmVwb3J0ZXIqIGRpc3BsYXlfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmtSZXBvcnRlciogZmlsZV9yZXBvcnRlcik7CisKKy8vIFJlZ2lzdGVyIGEgTWVtb3J5TWFuYWdlciBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb2xsZWN0IGFuZCByZXBvcnQKKy8vIGFsbG9jYXRpb24gbWVhc3VyZW1lbnRzIGZvciBiZW5jaG1hcmsgcnVucy4KK3ZvaWQgUmVnaXN0ZXJNZW1vcnlNYW5hZ2VyKE1lbW9yeU1hbmFnZXIqIG1lbW9yeV9tYW5hZ2VyKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIEJlbmNobWFyazsKK2NsYXNzIEJlbmNobWFya0ltcDsKK2NsYXNzIEJlbmNobWFya0ZhbWlsaWVzOworCit2b2lkIFVzZUNoYXJQb2ludGVyKGNoYXIgY29uc3Qgdm9sYXRpbGUqKTsKKworLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIgYW5kIHJlZ2lzdGVyIHRoZSBiZW5jaG1hcmsuIFJldHVybiB0aGUKKy8vIHJlZ2lzdGVyZWQgYmVuY2htYXJrLgorQmVuY2htYXJrKiBSZWdpc3RlckJlbmNobWFya0ludGVybmFsKEJlbmNobWFyayopOworCisvLyBFbnN1cmUgdGhhdCB0aGUgc3RhbmRhcmQgc3RyZWFtcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgaW4gZXZlcnkgVFUuCitpbnQgSW5pdGlhbGl6ZVN0cmVhbXMoKTsKK0JFTkNITUFSS19VTlVTRUQgc3RhdGljIGludCBzdHJlYW1faW5pdF9hbmNob3IgPSBJbml0aWFsaXplU3RyZWFtcygpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmICghZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19jbGFuZ19fKSkgfHwgZGVmaW5lZChfX3BuYWNsX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fRU1TQ1JJUFRFTl9fKQorI2RlZmluZSBCRU5DSE1BUktfSEFTX05PX0lOTElORV9BU1NFTUJMWQorI2VuZGlmCisKKy8vIFRoZSBEb05vdE9wdGltaXplKC4uLikgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcHJldmVudCBhIHZhbHVlIG9yCisvLyBleHByZXNzaW9uIGZyb20gYmVpbmcgb3B0aW1pemVkIGF3YXkgYnkgdGhlIGNvbXBpbGVyLiBUaGlzIGZ1bmN0aW9uIGlzCisvLyBpbnRlbmRlZCB0byBhZGQgbGl0dGxlIHRvIG5vIG92ZXJoZWFkLgorLy8gU2VlOiBodHRwczovL3lvdXR1LmJlL25YYXhrMjd6d2xrP3Q9MjQ0MQorI2lmbmRlZiBCRU5DSE1BUktfSEFTX05PX0lOTElORV9BU1NFTUJMWQordGVtcGxhdGUgPGNsYXNzIFRwPgoraW5saW5lIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIHZvaWQgRG9Ob3RPcHRpbWl6ZShUcCBjb25zdCYgdmFsdWUpIHsKKyAgYXNtIHZvbGF0aWxlKCIiIDogOiAicixtIih2YWx1ZSkgOiAibWVtb3J5Iik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcD4KK2lubGluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSB2b2lkIERvTm90T3B0aW1pemUoVHAmIHZhbHVlKSB7CisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisgIGFzbSB2b2xhdGlsZSgiIiA6ICIrcixtIih2YWx1ZSkgOiA6ICJtZW1vcnkiKTsKKyNlbHNlCisgIGFzbSB2b2xhdGlsZSgiIiA6ICIrbSxyIih2YWx1ZSkgOiA6ICJtZW1vcnkiKTsKKyNlbmRpZgorfQorCisvLyBGb3JjZSB0aGUgY29tcGlsZXIgdG8gZmx1c2ggcGVuZGluZyB3cml0ZXMgdG8gZ2xvYmFsIG1lbW9yeS4gQWN0cyBhcyBhbgorLy8gZWZmZWN0aXZlIHJlYWQvd3JpdGUgYmFycmllcgoraW5saW5lIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIHZvaWQgQ2xvYmJlck1lbW9yeSgpIHsKKyAgYXNtIHZvbGF0aWxlKCIiIDogOiA6ICJtZW1vcnkiKTsKK30KKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0ZW1wbGF0ZSA8Y2xhc3MgVHA+CitpbmxpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgdm9pZCBEb05vdE9wdGltaXplKFRwIGNvbnN0JiB2YWx1ZSkgeworICBpbnRlcm5hbDo6VXNlQ2hhclBvaW50ZXIoJnJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciBjb25zdCB2b2xhdGlsZSY+KHZhbHVlKSk7CisgIF9SZWFkV3JpdGVCYXJyaWVyKCk7Cit9CisKK2lubGluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSB2b2lkIENsb2JiZXJNZW1vcnkoKSB7IF9SZWFkV3JpdGVCYXJyaWVyKCk7IH0KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgVHA+CitpbmxpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgdm9pZCBEb05vdE9wdGltaXplKFRwIGNvbnN0JiB2YWx1ZSkgeworICBpbnRlcm5hbDo6VXNlQ2hhclBvaW50ZXIoJnJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciBjb25zdCB2b2xhdGlsZSY+KHZhbHVlKSk7Cit9CisvLyBGSVhNRSBBZGQgQ2xvYmJlck1lbW9yeSgpIGZvciBub24tZ251IGFuZCBub24tbXN2YyBjb21waWxlcnMKKyNlbmRpZgorCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIHVzZXItZGVmaW5lZCBjb3VudGVycy4KK2NsYXNzIENvdW50ZXIgeworIHB1YmxpYzoKKyAgZW51bSBGbGFncyB7CisgICAga0RlZmF1bHRzID0gMCwKKyAgICAvLyBNYXJrIHRoZSBjb3VudGVyIGFzIGEgcmF0ZS4gSXQgd2lsbCBiZSBwcmVzZW50ZWQgZGl2aWRlZAorICAgIC8vIGJ5IHRoZSBkdXJhdGlvbiBvZiB0aGUgYmVuY2htYXJrLgorICAgIGtJc1JhdGUgPSAxVSA8PCAwVSwKKyAgICAvLyBNYXJrIHRoZSBjb3VudGVyIGFzIGEgdGhyZWFkLWF2ZXJhZ2UgcXVhbnRpdHkuIEl0IHdpbGwgYmUKKyAgICAvLyBwcmVzZW50ZWQgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIHRocmVhZHMuCisgICAga0F2Z1RocmVhZHMgPSAxVSA8PCAxVSwKKyAgICAvLyBNYXJrIHRoZSBjb3VudGVyIGFzIGEgdGhyZWFkLWF2ZXJhZ2UgcmF0ZS4gU2VlIGFib3ZlLgorICAgIGtBdmdUaHJlYWRzUmF0ZSA9IGtJc1JhdGUgfCBrQXZnVGhyZWFkcywKKyAgICAvLyBNYXJrIHRoZSBjb3VudGVyIGFzIGEgY29uc3RhbnQgdmFsdWUsIHZhbGlkL3NhbWUgZm9yICpldmVyeSogaXRlcmF0aW9uLgorICAgIC8vIFdoZW4gcmVwb3J0aW5nLCBpdCB3aWxsIGJlICptdWx0aXBsaWVkKiBieSB0aGUgaXRlcmF0aW9uIGNvdW50LgorICAgIGtJc0l0ZXJhdGlvbkludmFyaWFudCA9IDFVIDw8IDJVLAorICAgIC8vIE1hcmsgdGhlIGNvdW50ZXIgYXMgYSBjb25zdGFudCByYXRlLgorICAgIC8vIFdoZW4gcmVwb3J0aW5nLCBpdCB3aWxsIGJlICptdWx0aXBsaWVkKiBieSB0aGUgaXRlcmF0aW9uIGNvdW50CisgICAgLy8gYW5kIHRoZW4gZGl2aWRlZCBieSB0aGUgZHVyYXRpb24gb2YgdGhlIGJlbmNobWFyay4KKyAgICBrSXNJdGVyYXRpb25JbnZhcmlhbnRSYXRlID0ga0lzUmF0ZSB8IGtJc0l0ZXJhdGlvbkludmFyaWFudCwKKyAgICAvLyBNYXJrIHRoZSBjb3VudGVyIGFzIGEgaXRlcmF0aW9uLWF2ZXJhZ2UgcXVhbnRpdHkuCisgICAgLy8gSXQgd2lsbCBiZSBwcmVzZW50ZWQgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuCisgICAga0F2Z0l0ZXJhdGlvbnMgPSAxVSA8PCAzVSwKKyAgICAvLyBNYXJrIHRoZSBjb3VudGVyIGFzIGEgaXRlcmF0aW9uLWF2ZXJhZ2UgcmF0ZS4gU2VlIGFib3ZlLgorICAgIGtBdmdJdGVyYXRpb25zUmF0ZSA9IGtJc1JhdGUgfCBrQXZnSXRlcmF0aW9ucywKKworICAgIC8vIEluIHRoZSBlbmQsIGludmVydCB0aGUgcmVzdWx0LiBUaGlzIGlzIGFsd2F5cyBkb25lIGxhc3QhCisgICAga0ludmVydCA9IDFVIDw8IDMxVQorICB9OworCisgIGVudW0gT25lSyB7CisgICAgLy8gMScwMDAgaXRlbXMgcGVyIDFrCisgICAga0lzMTAwMCA9IDEwMDAsCisgICAgLy8gMScwMjQgaXRlbXMgcGVyIDFrCisgICAga0lzMTAyNCA9IDEwMjQKKyAgfTsKKworICBkb3VibGUgdmFsdWU7CisgIEZsYWdzIGZsYWdzOworICBPbmVLIG9uZUs7CisKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgQ291bnRlcihkb3VibGUgdiA9IDAuLCBGbGFncyBmID0ga0RlZmF1bHRzLCBPbmVLIGsgPSBrSXMxMDAwKQorICAgICAgOiB2YWx1ZSh2KSwgZmxhZ3MoZiksIG9uZUsoaykge30KKworICBCRU5DSE1BUktfQUxXQVlTX0lOTElORSBvcGVyYXRvciBkb3VibGUgY29uc3QmKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgb3BlcmF0b3IgZG91YmxlJigpIHsgcmV0dXJuIHZhbHVlOyB9Cit9OworCisvLyBBIGhlbHBlciBmb3IgdXNlciBjb2RlIHRvIGNyZWF0ZSB1bmZvcmVzZWVuIGNvbWJpbmF0aW9ucyBvZiBGbGFncywgd2l0aG91dAorLy8gaGF2aW5nIHRvIGRvIHRoaXMgY2FzdCBtYW51YWxseSBlYWNoIHRpbWUsIG9yIHByb3ZpZGluZyB0aGlzIG9wZXJhdG9yLgorQ291bnRlcjo6RmxhZ3MgaW5saW5lIG9wZXJhdG9yfChjb25zdCBDb3VudGVyOjpGbGFncyYgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb3VudGVyOjpGbGFncyYgUkhTKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDb3VudGVyOjpGbGFncz4oc3RhdGljX2Nhc3Q8aW50PihMSFMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KFJIUykpOworfQorCisvLyBUaGlzIGlzIHRoZSBjb250YWluZXIgZm9yIHRoZSB1c2VyLWRlZmluZWQgY291bnRlcnMuCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDb3VudGVyPiBVc2VyQ291bnRlcnM7CisKKy8vIFRpbWVVbml0IGlzIHBhc3NlZCB0byBhIGJlbmNobWFyayBpbiBvcmRlciB0byBzcGVjaWZ5IHRoZSBvcmRlciBvZiBtYWduaXR1ZGUKKy8vIGZvciB0aGUgbWVhc3VyZWQgdGltZS4KK2VudW0gVGltZVVuaXQgeyBrTmFub3NlY29uZCwga01pY3Jvc2Vjb25kLCBrTWlsbGlzZWNvbmQgfTsKKworLy8gQmlnTyBpcyBwYXNzZWQgdG8gYSBiZW5jaG1hcmsgaW4gb3JkZXIgdG8gc3BlY2lmeSB0aGUgYXN5bXB0b3RpYworLy8gY29tcHV0YXRpb25hbAorLy8gY29tcGxleGl0eSBmb3IgdGhlIGJlbmNobWFyay4gSW4gY2FzZSBvQXV0byBpcyBzZWxlY3RlZCwgY29tcGxleGl0eSB3aWxsIGJlCisvLyBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGJlc3QgZml0LgorZW51bSBCaWdPIHsgb05vbmUsIG8xLCBvTiwgb05TcXVhcmVkLCBvTkN1YmVkLCBvTG9nTiwgb05Mb2dOLCBvQXV0bywgb0xhbWJkYSB9OworCit0eXBlZGVmIHVpbnQ2NF90IEl0ZXJhdGlvbkNvdW50OworCisvLyBCaWdPRnVuYyBpcyBwYXNzZWQgdG8gYSBiZW5jaG1hcmsgaW4gb3JkZXIgdG8gc3BlY2lmeSB0aGUgYXN5bXB0b3RpYworLy8gY29tcHV0YXRpb25hbCBjb21wbGV4aXR5IGZvciB0aGUgYmVuY2htYXJrLgordHlwZWRlZiBkb3VibGUoQmlnT0Z1bmMpKEl0ZXJhdGlvbkNvdW50KTsKKworLy8gU3RhdGlzdGljc0Z1bmMgaXMgcGFzc2VkIHRvIGEgYmVuY2htYXJrIGluIG9yZGVyIHRvIGNvbXB1dGUgc29tZSBkZXNjcmlwdGl2ZQorLy8gc3RhdGlzdGljcyBvdmVyIGFsbCB0aGUgbWVhc3VyZW1lbnRzIG9mIHNvbWUgdHlwZQordHlwZWRlZiBkb3VibGUoU3RhdGlzdGljc0Z1bmMpKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3N0cnVjdCBTdGF0aXN0aWNzIHsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIFN0YXRpc3RpY3NGdW5jKiBjb21wdXRlXzsKKworICBTdGF0aXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBTdGF0aXN0aWNzRnVuYyogY29tcHV0ZSkKKyAgICAgIDogbmFtZV8obmFtZSksIGNvbXB1dGVfKGNvbXB1dGUpIHt9Cit9OworCitzdHJ1Y3QgQmVuY2htYXJrSW5zdGFuY2U7CitjbGFzcyBUaHJlYWRUaW1lcjsKK2NsYXNzIFRocmVhZE1hbmFnZXI7CisKK2VudW0gQWdncmVnYXRpb25SZXBvcnRNb2RlCisjaWYgZGVmaW5lZChCRU5DSE1BUktfSEFTX0NYWDExKQorICAgIDogdW5zaWduZWQKKyNlbHNlCisjZW5kaWYKK3sKKyAgLy8gVGhlIG1vZGUgaGFzIG5vdCBiZWVuIG1hbnVhbGx5IHNwZWNpZmllZAorICBBUk1fVW5zcGVjaWZpZWQgPSAwLAorICAvLyBUaGUgbW9kZSBpcyB1c2VyLXNwZWNpZmllZC4KKyAgLy8gVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBzZXQgd2hlbiB0aGUgZm9sbG93aW5nIGJpdC1mbGFncyBhcmUgc2V0LgorICBBUk1fRGVmYXVsdCA9IDFVIDw8IDBVLAorICAvLyBGaWxlIHJlcG9ydGVyIHNob3VsZCBvbmx5IG91dHB1dCBhZ2dyZWdhdGVzLgorICBBUk1fRmlsZVJlcG9ydEFnZ3JlZ2F0ZXNPbmx5ID0gMVUgPDwgMVUsCisgIC8vIERpc3BsYXkgcmVwb3J0ZXIgc2hvdWxkIG9ubHkgb3V0cHV0IGFnZ3JlZ2F0ZXMKKyAgQVJNX0Rpc3BsYXlSZXBvcnRBZ2dyZWdhdGVzT25seSA9IDFVIDw8IDJVLAorICAvLyBCb3RoIHJlcG9ydGVycyBzaG91bGQgb25seSBkaXNwbGF5IGFnZ3JlZ2F0ZXMuCisgIEFSTV9SZXBvcnRBZ2dyZWdhdGVzT25seSA9CisgICAgICBBUk1fRmlsZVJlcG9ydEFnZ3JlZ2F0ZXNPbmx5IHwgQVJNX0Rpc3BsYXlSZXBvcnRBZ2dyZWdhdGVzT25seQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFN0YXRlIGlzIHBhc3NlZCB0byBhIHJ1bm5pbmcgQmVuY2htYXJrIGFuZCBjb250YWlucyBzdGF0ZSBmb3IgdGhlCisvLyBiZW5jaG1hcmsgdG8gdXNlLgorY2xhc3MgU3RhdGUgeworIHB1YmxpYzoKKyAgc3RydWN0IFN0YXRlSXRlcmF0b3I7CisgIGZyaWVuZCBzdHJ1Y3QgU3RhdGVJdGVyYXRvcjsKKworICAvLyBSZXR1cm5zIGl0ZXJhdG9ycyB1c2VkIHRvIHJ1biBlYWNoIGl0ZXJhdGlvbiBvZiBhIGJlbmNobWFyayB1c2luZyBhCisgIC8vIEMrKzExIHJhbmdlZC1iYXNlZCBmb3IgbG9vcC4gVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LgorICAvLworICAvLyBSRVFVSVJFUzogVGhlIGJlbmNobWFyayBoYXMgbm90IHN0YXJ0ZWQgcnVubmluZyB5ZXQuIE5laXRoZXIgYmVnaW4gbm9yIGVuZAorICAvLyBoYXZlIGJlZW4gY2FsbGVkIHByZXZpb3VzbHkuCisgIC8vCisgIC8vIE5PVEU6IEtlZXBSdW5uaW5nIG1heSBub3QgYmUgdXNlZCBhZnRlciBjYWxsaW5nIGVpdGhlciBvZiB0aGVzZSBmdW5jdGlvbnMuCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIFN0YXRlSXRlcmF0b3IgYmVnaW4oKTsKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgU3RhdGVJdGVyYXRvciBlbmQoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGJlbmNobWFyayBzaG91bGQgY29udGludWUgdGhyb3VnaCBhbm90aGVyIGl0ZXJhdGlvbi4KKyAgLy8gTk9URTogQSBiZW5jaG1hcmsgbWF5IG5vdCByZXR1cm4gZnJvbSB0aGUgdGVzdCB1bnRpbCBLZWVwUnVubmluZygpIGhhcworICAvLyByZXR1cm5lZCBmYWxzZS4KKyAgYm9vbCBLZWVwUnVubmluZygpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGJlbmNobWFyayBzaG91bGQgcnVuIG4gbW9yZSBpdGVyYXRpb25zLgorICAvLyBSRVFVSVJFUzogJ24nID4gMC4KKyAgLy8gTk9URTogQSBiZW5jaG1hcmsgbXVzdCBub3QgcmV0dXJuIGZyb20gdGhlIHRlc3QgdW50aWwgS2VlcFJ1bm5pbmdCYXRjaCgpCisgIC8vIGhhcyByZXR1cm5lZCBmYWxzZS4KKyAgLy8gTk9URTogS2VlcFJ1bm5pbmdCYXRjaCgpIG1heSBvdmVyc2hvb3QgYnkgdXAgdG8gJ24nIGl0ZXJhdGlvbnMuCisgIC8vCisgIC8vIEludGVuZGVkIHVzYWdlOgorICAvLyAgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZ0JhdGNoKDEwMDApKSB7CisgIC8vICAgICAvLyBwcm9jZXNzIDEwMDAgZWxlbWVudHMKKyAgLy8gICB9CisgIGJvb2wgS2VlcFJ1bm5pbmdCYXRjaChJdGVyYXRpb25Db3VudCBuKTsKKworICAvLyBSRVFVSVJFUzogdGltZXIgaXMgcnVubmluZyBhbmQgJ1NraXBXaXRoRXJyb3IoLi4uKScgaGFzIG5vdCBiZWVuIGNhbGxlZAorICAvLyAgICAgICAgICAgYnkgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAvLyBTdG9wIHRoZSBiZW5jaG1hcmsgdGltZXIuICBJZiBub3QgY2FsbGVkLCB0aGUgdGltZXIgd2lsbCBiZQorICAvLyBhdXRvbWF0aWNhbGx5IHN0b3BwZWQgYWZ0ZXIgdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBiZW5jaG1hcmsgbG9vcC4KKyAgLy8KKyAgLy8gRm9yIHRocmVhZGVkIGJlbmNobWFya3MgdGhlIFBhdXNlVGltaW5nKCkgZnVuY3Rpb24gb25seSBwYXVzZXMgdGhlIHRpbWluZworICAvLyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAvLworICAvLyBOT1RFOiBUaGUgInJlYWwgdGltZSIgbWVhc3VyZW1lbnQgaXMgcGVyLXRocmVhZC4gSWYgZGlmZmVyZW50IHRocmVhZHMKKyAgLy8gcmVwb3J0IGRpZmZlcmVudCBtZWFzdXJlbWVudHMgdGhlIGxhcmdlc3Qgb25lIGlzIHJlcG9ydGVkLgorICAvLworICAvLyBOT1RFOiBQYXVzZVRpbWluZygpL1Jlc3VtZVRpbWluZygpIGFyZSByZWxhdGl2ZWx5CisgIC8vIGhlYXZ5d2VpZ2h0LCBhbmQgc28gdGhlaXIgdXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgYXZvaWRlZAorICAvLyB3aXRoaW4gZWFjaCBiZW5jaG1hcmsgaXRlcmF0aW9uLCBpZiBwb3NzaWJsZS4KKyAgdm9pZCBQYXVzZVRpbWluZygpOworCisgIC8vIFJFUVVJUkVTOiB0aW1lciBpcyBub3QgcnVubmluZyBhbmQgJ1NraXBXaXRoRXJyb3IoLi4uKScgaGFzIG5vdCBiZWVuIGNhbGxlZAorICAvLyAgICAgICAgICAgYnkgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAvLyBTdGFydCB0aGUgYmVuY2htYXJrIHRpbWVyLiAgVGhlIHRpbWVyIGlzIE5PVCBydW5uaW5nIG9uIGVudHJhbmNlIHRvIHRoZQorICAvLyBiZW5jaG1hcmsgZnVuY3Rpb24uIEl0IGJlZ2lucyBydW5uaW5nIGFmdGVyIGNvbnRyb2wgZmxvdyBlbnRlcnMgdGhlCisgIC8vIGJlbmNobWFyayBsb29wLgorICAvLworICAvLyBOT1RFOiBQYXVzZVRpbWluZygpL1Jlc3VtZVRpbWluZygpIGFyZSByZWxhdGl2ZWx5CisgIC8vIGhlYXZ5d2VpZ2h0LCBhbmQgc28gdGhlaXIgdXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgYXZvaWRlZAorICAvLyB3aXRoaW4gZWFjaCBiZW5jaG1hcmsgaXRlcmF0aW9uLCBpZiBwb3NzaWJsZS4KKyAgdm9pZCBSZXN1bWVUaW1pbmcoKTsKKworICAvLyBSRVFVSVJFUzogJ1NraXBXaXRoRXJyb3IoLi4uKScgaGFzIG5vdCBiZWVuIGNhbGxlZCBwcmV2aW91c2x5IGJ5IHRoZQorICAvLyAgICAgICAgICAgIGN1cnJlbnQgdGhyZWFkLgorICAvLyBSZXBvcnQgdGhlIGJlbmNobWFyayBhcyByZXN1bHRpbmcgaW4gYW4gZXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkICdtc2cnLgorICAvLyBBZnRlciB0aGlzIGNhbGwgdGhlIHVzZXIgbWF5IGV4cGxpY2l0bHkgJ3JldHVybicgZnJvbSB0aGUgYmVuY2htYXJrLgorICAvLworICAvLyBJZiB0aGUgcmFuZ2VkLWZvciBzdHlsZSBvZiBiZW5jaG1hcmsgbG9vcCBpcyB1c2VkLCB0aGUgdXNlciBtdXN0IGV4cGxpY2l0bHkKKyAgLy8gYnJlYWsgZnJvbSB0aGUgbG9vcCwgb3RoZXJ3aXNlIGFsbCBmdXR1cmUgaXRlcmF0aW9ucyB3aWxsIGJlIHJ1bi4KKyAgLy8gSWYgdGhlICdLZWVwUnVubmluZygpJyBsb29wIGlzIHVzZWQgdGhlIGN1cnJlbnQgdGhyZWFkIHdpbGwgYXV0b21hdGljYWxseQorICAvLyBleGl0IHRoZSBsb29wIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgaXRlcmF0aW9uLgorICAvLworICAvLyBGb3IgdGhyZWFkZWQgYmVuY2htYXJrcyBvbmx5IHRoZSBjdXJyZW50IHRocmVhZCBzdG9wcyBleGVjdXRpbmcgYW5kIGZ1dHVyZQorICAvLyBjYWxscyB0byBgS2VlcFJ1bm5pbmcoKWAgd2lsbCBibG9jayB1bnRpbCBhbGwgdGhyZWFkcyBoYXZlIGNvbXBsZXRlZAorICAvLyB0aGUgYEtlZXBSdW5uaW5nKClgIGxvb3AuIElmIG11bHRpcGxlIHRocmVhZHMgcmVwb3J0IGFuIGVycm9yIG9ubHkgdGhlCisgIC8vIGZpcnN0IGVycm9yIG1lc3NhZ2UgaXMgdXNlZC4KKyAgLy8KKyAgLy8gTk9URTogQ2FsbGluZyAnU2tpcFdpdGhFcnJvciguLi4pJyBkb2VzIG5vdCBjYXVzZSB0aGUgYmVuY2htYXJrIHRvIGV4aXQKKyAgLy8gdGhlIGN1cnJlbnQgc2NvcGUgaW1tZWRpYXRlbHkuIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB3aXRoaW4KKyAgLy8gdGhlICdLZWVwUnVubmluZygpJyBsb29wIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiB3aWxsIGZpbmlzaC4gSXQgaXMgdGhlIHVzZXJzCisgIC8vIHJlc3BvbnNpYmlsaXR5IHRvIGV4aXQgdGhlIHNjb3BlIGFzIG5lZWRlZC4KKyAgdm9pZCBTa2lwV2l0aEVycm9yKGNvbnN0IGNoYXIqIG1zZyk7CisKKyAgLy8gUkVRVUlSRVM6IGNhbGxlZCBleGFjdGx5IG9uY2UgcGVyIGl0ZXJhdGlvbiBvZiB0aGUgYmVuY2htYXJraW5nIGxvb3AuCisgIC8vIFNldCB0aGUgbWFudWFsbHkgbWVhc3VyZWQgdGltZSBmb3IgdGhpcyBiZW5jaG1hcmsgaXRlcmF0aW9uLCB3aGljaAorICAvLyBpcyB1c2VkIGluc3RlYWQgb2YgYXV0b21hdGljYWxseSBtZWFzdXJlZCB0aW1lIGlmIFVzZU1hbnVhbFRpbWUoKSB3YXMKKyAgLy8gc3BlY2lmaWVkLgorICAvLworICAvLyBGb3IgdGhyZWFkZWQgYmVuY2htYXJrcyB0aGUgZmluYWwgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGxhcmdlc3QKKyAgLy8gcmVwb3J0ZWQgdmFsdWVzLgorICB2b2lkIFNldEl0ZXJhdGlvblRpbWUoZG91YmxlIHNlY29uZHMpOworCisgIC8vIFNldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZCBieSB0aGUgY3VycmVudCBiZW5jaG1hcmsKKyAgLy8gZXhlY3V0aW9uLiAgVGhpcyByb3V0aW5lIGlzIHR5cGljYWxseSBjYWxsZWQgb25jZSBhdCB0aGUgZW5kIG9mIGEKKyAgLy8gdGhyb3VnaHB1dCBvcmllbnRlZCBiZW5jaG1hcmsuCisgIC8vCisgIC8vIFJFUVVJUkVTOiBhIGJlbmNobWFyayBoYXMgZXhpdGVkIGl0cyBiZW5jaG1hcmtpbmcgbG9vcC4KKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBTZXRCeXRlc1Byb2Nlc3NlZChpbnQ2NF90IGJ5dGVzKSB7CisgICAgY291bnRlcnNbImJ5dGVzX3Blcl9zZWNvbmQiXSA9CisgICAgICAgIENvdW50ZXIoc3RhdGljX2Nhc3Q8ZG91YmxlPihieXRlcyksIENvdW50ZXI6OmtJc1JhdGUsIENvdW50ZXI6OmtJczEwMjQpOworICB9CisKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgaW50NjRfdCBieXRlc19wcm9jZXNzZWQoKSBjb25zdCB7CisgICAgaWYgKGNvdW50ZXJzLmZpbmQoImJ5dGVzX3Blcl9zZWNvbmQiKSAhPSBjb3VudGVycy5lbmQoKSkKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90Pihjb3VudGVycy5hdCgiYnl0ZXNfcGVyX3NlY29uZCIpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIElmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBjb21wbGV4aXR5X24gPiAwIGFuZCBjb21wbGV4aXR5IHJlcG9ydCBpcworICAvLyByZXF1ZXN0ZWQgZm9yIHRoZQorICAvLyBmYW1pbHkgYmVuY2htYXJrLCB0aGVuIGN1cnJlbnQgYmVuY2htYXJrIHdpbGwgYmUgcGFydCBvZiB0aGUgY29tcHV0YXRpb24KKyAgLy8gYW5kIGNvbXBsZXhpdHlfbiB3aWxsCisgIC8vIHJlcHJlc2VudCB0aGUgbGVuZ3RoIG9mIE4uCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIHZvaWQgU2V0Q29tcGxleGl0eU4oaW50NjRfdCBjb21wbGV4aXR5X24pIHsgY29tcGxleGl0eV9uXyA9IGNvbXBsZXhpdHlfbjsgfQorCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIGludDY0X3QgY29tcGxleGl0eV9sZW5ndGhfbigpIGNvbnN0IHsgcmV0dXJuIGNvbXBsZXhpdHlfbl87IH0KKworICAvLyBJZiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggaXRlbXMgPiAwLCB0aGVuIGFuIGl0ZW1zL3MKKyAgLy8gbGFiZWwgaXMgcHJpbnRlZCBvbiB0aGUgYmVuY2htYXJrIHJlcG9ydCBsaW5lIGZvciB0aGUgY3VycmVudGx5CisgIC8vIGV4ZWN1dGluZyBiZW5jaG1hcmsuIEl0IGlzIHR5cGljYWxseSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBhIHByb2Nlc3NpbmcKKyAgLy8gYmVuY2htYXJrIHdoZXJlIGEgcHJvY2Vzc2luZyBpdGVtcy9zZWNvbmQgb3V0cHV0IGlzIGRlc2lyZWQuCisgIC8vCisgIC8vIFJFUVVJUkVTOiBhIGJlbmNobWFyayBoYXMgZXhpdGVkIGl0cyBiZW5jaG1hcmtpbmcgbG9vcC4KKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBTZXRJdGVtc1Byb2Nlc3NlZChpbnQ2NF90IGl0ZW1zKSB7CisgICAgY291bnRlcnNbIml0ZW1zX3Blcl9zZWNvbmQiXSA9CisgICAgICAgIENvdW50ZXIoc3RhdGljX2Nhc3Q8ZG91YmxlPihpdGVtcyksIGJlbmNobWFyazo6Q291bnRlcjo6a0lzUmF0ZSk7CisgIH0KKworICBCRU5DSE1BUktfQUxXQVlTX0lOTElORQorICBpbnQ2NF90IGl0ZW1zX3Byb2Nlc3NlZCgpIGNvbnN0IHsKKyAgICBpZiAoY291bnRlcnMuZmluZCgiaXRlbXNfcGVyX3NlY29uZCIpICE9IGNvdW50ZXJzLmVuZCgpKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGNvdW50ZXJzLmF0KCJpdGVtc19wZXJfc2Vjb25kIikpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gSWYgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHNwZWNpZmllZCBsYWJlbCBpcyBwcmludGVkIGF0IHRoZQorICAvLyBlbmQgb2YgdGhlIGJlbmNobWFyayByZXBvcnQgbGluZSBmb3IgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcKKyAgLy8gYmVuY2htYXJrLiAgRXhhbXBsZToKKyAgLy8gIHN0YXRpYyB2b2lkIEJNX0NvbXByZXNzKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIC8vICAgIC4uLgorICAvLyAgICBkb3VibGUgY29tcHJlc3MgPSBpbnB1dF9zaXplIC8gb3V0cHV0X3NpemU7CisgIC8vICAgIHN0YXRlLlNldExhYmVsKFN0ckZvcm1hdCgiY29tcHJlc3M6JS4xZiUlIiwgMTAwLjAqY29tcHJlc3Npb24pKTsKKyAgLy8gIH0KKyAgLy8gUHJvZHVjZXMgb3V0cHV0IHRoYXQgbG9va3MgbGlrZToKKyAgLy8gIEJNX0NvbXByZXNzICAgNTAgICAgICAgICA1MCAgIDE0MTE1MDM4ICBjb21wcmVzczoyNy4zJQorICAvLworICAvLyBSRVFVSVJFUzogYSBiZW5jaG1hcmsgaGFzIGV4aXRlZCBpdHMgYmVuY2htYXJraW5nIGxvb3AuCisgIHZvaWQgU2V0TGFiZWwoY29uc3QgY2hhciogbGFiZWwpOworCisgIHZvaWQgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgU2V0TGFiZWwoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHRoaXMtPlNldExhYmVsKHN0ci5jX3N0cigpKTsKKyAgfQorCisgIC8vIFJhbmdlIGFyZ3VtZW50cyBmb3IgdGhpcyBydW4uIENIRUNLcyBpZiB0aGUgYXJndW1lbnQgaGFzIGJlZW4gc2V0LgorICBCRU5DSE1BUktfQUxXQVlTX0lOTElORQorICBpbnQ2NF90IHJhbmdlKHN0ZDo6c2l6ZV90IHBvcyA9IDApIGNvbnN0IHsKKyAgICBhc3NlcnQocmFuZ2VfLnNpemUoKSA+IHBvcyk7CisgICAgcmV0dXJuIHJhbmdlX1twb3NdOworICB9CisKKyAgQkVOQ0hNQVJLX0RFUFJFQ0FURURfTVNHKCJ1c2UgJ3JhbmdlKDApJyBpbnN0ZWFkIikKKyAgaW50NjRfdCByYW5nZV94KCkgY29uc3QgeyByZXR1cm4gcmFuZ2UoMCk7IH0KKworICBCRU5DSE1BUktfREVQUkVDQVRFRF9NU0coInVzZSAncmFuZ2UoMSknIGluc3RlYWQiKQorICBpbnQ2NF90IHJhbmdlX3koKSBjb25zdCB7IHJldHVybiByYW5nZSgxKTsgfQorCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIEl0ZXJhdGlvbkNvdW50IGl0ZXJhdGlvbnMoKSBjb25zdCB7CisgICAgaWYgKEJFTkNITUFSS19CVUlMVElOX0VYUEVDVCghc3RhcnRlZF8sIGZhbHNlKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtYXhfaXRlcmF0aW9ucyAtIHRvdGFsX2l0ZXJhdGlvbnNfICsgYmF0Y2hfbGVmdG92ZXJfOworICB9CisKKyBwcml2YXRlCisgICAgIDogIC8vIGl0ZW1zIHdlIGV4cGVjdCBvbiB0aGUgZmlyc3QgY2FjaGUgbGluZSAoaWUgNjQgYnl0ZXMgb2YgdGhlIHN0cnVjdCkKKyAgLy8gV2hlbiB0b3RhbF9pdGVyYXRpb25zXyBpcyAwLCBLZWVwUnVubmluZygpIGFuZCBmcmllbmRzIHdpbGwgcmV0dXJuIGZhbHNlLgorICAvLyBNYXkgYmUgbGFyZ2VyIHRoYW4gbWF4X2l0ZXJhdGlvbnMuCisgIEl0ZXJhdGlvbkNvdW50IHRvdGFsX2l0ZXJhdGlvbnNfOworCisgIC8vIFdoZW4gdXNpbmcgS2VlcFJ1bm5pbmdCYXRjaCgpLCBiYXRjaF9sZWZ0b3Zlcl8gaG9sZHMgdGhlIG51bWJlciBvZgorICAvLyBpdGVyYXRpb25zIGJleW9uZCBtYXhfaXRlcnMgdGhhdCB3ZXJlIHJ1bi4gVXNlZCB0byB0cmFjaworICAvLyBjb21wbGV0ZWRfaXRlcmF0aW9uc18gYWNjdXJhdGVseS4KKyAgSXRlcmF0aW9uQ291bnQgYmF0Y2hfbGVmdG92ZXJfOworCisgcHVibGljOgorICBjb25zdCBJdGVyYXRpb25Db3VudCBtYXhfaXRlcmF0aW9uczsKKworIHByaXZhdGU6CisgIGJvb2wgc3RhcnRlZF87CisgIGJvb2wgZmluaXNoZWRfOworICBib29sIGVycm9yX29jY3VycmVkXzsKKworIHByaXZhdGU6ICAvLyBpdGVtcyB3ZSBkb24ndCBuZWVkIG9uIHRoZSBmaXJzdCBjYWNoZSBsaW5lCisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHJhbmdlXzsKKworICBpbnQ2NF90IGNvbXBsZXhpdHlfbl87CisKKyBwdWJsaWM6CisgIC8vIENvbnRhaW5lciBmb3IgdXNlci1kZWZpbmVkIGNvdW50ZXJzLgorICBVc2VyQ291bnRlcnMgY291bnRlcnM7CisgIC8vIEluZGV4IG9mIHRoZSBleGVjdXRpbmcgdGhyZWFkLiBWYWx1ZXMgZnJvbSBbMCwgdGhyZWFkcykuCisgIGNvbnN0IGludCB0aHJlYWRfaW5kZXg7CisgIC8vIE51bWJlciBvZiB0aHJlYWRzIGNvbmN1cnJlbnRseSBleGVjdXRpbmcgdGhlIGJlbmNobWFyay4KKyAgY29uc3QgaW50IHRocmVhZHM7CisKKyBwcml2YXRlOgorICBTdGF0ZShJdGVyYXRpb25Db3VudCBtYXhfaXRlcnMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiByYW5nZXMsCisgICAgICAgIGludCB0aHJlYWRfaSwgaW50IG5fdGhyZWFkcywgaW50ZXJuYWw6OlRocmVhZFRpbWVyKiB0aW1lciwKKyAgICAgICAgaW50ZXJuYWw6OlRocmVhZE1hbmFnZXIqIG1hbmFnZXIpOworCisgIHZvaWQgU3RhcnRLZWVwUnVubmluZygpOworICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBLZWVwUnVubmluZygpIGFuZCBLZWVwUnVubmluZ0JhdGNoKCkuCisgIC8vIGlzX2JhdGNoIG11c3QgYmUgdHJ1ZSB1bmxlc3MgbiBpcyAxLgorICBib29sIEtlZXBSdW5uaW5nSW50ZXJuYWwoSXRlcmF0aW9uQ291bnQgbiwgYm9vbCBpc19iYXRjaCk7CisgIHZvaWQgRmluaXNoS2VlcFJ1bm5pbmcoKTsKKyAgaW50ZXJuYWw6OlRocmVhZFRpbWVyKiB0aW1lcl87CisgIGludGVybmFsOjpUaHJlYWRNYW5hZ2VyKiBtYW5hZ2VyXzsKKworICBmcmllbmQgc3RydWN0IGludGVybmFsOjpCZW5jaG1hcmtJbnN0YW5jZTsKK307CisKK2lubGluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSBib29sIFN0YXRlOjpLZWVwUnVubmluZygpIHsKKyAgcmV0dXJuIEtlZXBSdW5uaW5nSW50ZXJuYWwoMSwgLyppc19iYXRjaD0qL2ZhbHNlKTsKK30KKworaW5saW5lIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIGJvb2wgU3RhdGU6OktlZXBSdW5uaW5nQmF0Y2goSXRlcmF0aW9uQ291bnQgbikgeworICByZXR1cm4gS2VlcFJ1bm5pbmdJbnRlcm5hbChuLCAvKmlzX2JhdGNoPSovdHJ1ZSk7Cit9CisKK2lubGluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSBib29sIFN0YXRlOjpLZWVwUnVubmluZ0ludGVybmFsKEl0ZXJhdGlvbkNvdW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2JhdGNoKSB7CisgIC8vIHRvdGFsX2l0ZXJhdGlvbnNfIGlzIHNldCB0byAwIGJ5IHRoZSBjb25zdHJ1Y3RvciwgYW5kIGFsd2F5cyBzZXQgdG8gYQorICAvLyBub256ZXJvIHZhbHVlIGJ5IFN0YXJ0S2VwUnVubmluZygpLgorICBhc3NlcnQobiA+IDApOworICAvLyBuIG11c3QgYmUgMSB1bmxlc3MgaXNfYmF0Y2ggaXMgdHJ1ZS4KKyAgYXNzZXJ0KGlzX2JhdGNoIHx8IG4gPT0gMSk7CisgIGlmIChCRU5DSE1BUktfQlVJTFRJTl9FWFBFQ1QodG90YWxfaXRlcmF0aW9uc18gPj0gbiwgdHJ1ZSkpIHsKKyAgICB0b3RhbF9pdGVyYXRpb25zXyAtPSBuOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICghc3RhcnRlZF8pIHsKKyAgICBTdGFydEtlZXBSdW5uaW5nKCk7CisgICAgaWYgKCFlcnJvcl9vY2N1cnJlZF8gJiYgdG90YWxfaXRlcmF0aW9uc18gPj0gbikgeworICAgICAgdG90YWxfaXRlcmF0aW9uc18gLT0gbjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICAvLyBGb3Igbm9uLWJhdGNoIHJ1bnMsIHRvdGFsX2l0ZXJhdGlvbnNfIG11c3QgYmUgMCBieSBub3cuCisgIGlmIChpc19iYXRjaCAmJiB0b3RhbF9pdGVyYXRpb25zXyAhPSAwKSB7CisgICAgYmF0Y2hfbGVmdG92ZXJfID0gbiAtIHRvdGFsX2l0ZXJhdGlvbnNfOworICAgIHRvdGFsX2l0ZXJhdGlvbnNfID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBGaW5pc2hLZWVwUnVubmluZygpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cnVjdCBTdGF0ZTo6U3RhdGVJdGVyYXRvciB7CisgIHN0cnVjdCBCRU5DSE1BUktfVU5VU0VEIFZhbHVlIHt9OworICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgVmFsdWUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBWYWx1ZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgVmFsdWUgcG9pbnRlcjsKKyAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU3RhdGU7CisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIFN0YXRlSXRlcmF0b3IoKSA6IGNhY2hlZF8oMCksIHBhcmVudF8oKSB7fQorCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIGV4cGxpY2l0IFN0YXRlSXRlcmF0b3IoU3RhdGUqIHN0KQorICAgICAgOiBjYWNoZWRfKHN0LT5lcnJvcl9vY2N1cnJlZF8gPyAwIDogc3QtPm1heF9pdGVyYXRpb25zKSwgcGFyZW50XyhzdCkge30KKworIHB1YmxpYzoKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgVmFsdWUgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gVmFsdWUoKTsgfQorCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIFN0YXRlSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KGNhY2hlZF8gPiAwKTsKKyAgICAtLWNhY2hlZF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgYm9vbCBvcGVyYXRvciE9KFN0YXRlSXRlcmF0b3IgY29uc3QmKSBjb25zdCB7CisgICAgaWYgKEJFTkNITUFSS19CVUlMVElOX0VYUEVDVChjYWNoZWRfICE9IDAsIHRydWUpKSByZXR1cm4gdHJ1ZTsKKyAgICBwYXJlbnRfLT5GaW5pc2hLZWVwUnVubmluZygpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgSXRlcmF0aW9uQ291bnQgY2FjaGVkXzsKKyAgU3RhdGUqIGNvbnN0IHBhcmVudF87Cit9OworCitpbmxpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgU3RhdGU6OlN0YXRlSXRlcmF0b3IgU3RhdGU6OmJlZ2luKCkgeworICByZXR1cm4gU3RhdGVJdGVyYXRvcih0aGlzKTsKK30KK2lubGluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSBTdGF0ZTo6U3RhdGVJdGVyYXRvciBTdGF0ZTo6ZW5kKCkgeworICBTdGFydEtlZXBSdW5uaW5nKCk7CisgIHJldHVybiBTdGF0ZUl0ZXJhdG9yKCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3R5cGVkZWYgdm9pZChGdW5jdGlvbikoU3RhdGUmKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCZW5jaG1hcmsgcmVnaXN0cmF0aW9uIG9iamVjdC4gIFRoZSBCRU5DSE1BUksoKSBtYWNybyBleHBhbmRzCisvLyBpbnRvIGFuIGludGVybmFsOjpCZW5jaG1hcmsqIG9iamVjdC4gIFZhcmlvdXMgbWV0aG9kcyBjYW4KKy8vIGJlIGNhbGxlZCBvbiB0aGlzIG9iamVjdCB0byBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGJlbmNobWFyay4KKy8vIEVhY2ggbWV0aG9kIHJldHVybnMgInRoaXMiIHNvIHRoYXQgbXVsdGlwbGUgbWV0aG9kIGNhbGxzIGNhbgorLy8gY2hhaW5lZCBpbnRvIG9uZSBleHByZXNzaW9uLgorY2xhc3MgQmVuY2htYXJrIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkJlbmNobWFyaygpOworCisgIC8vIE5vdGU6IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhbGwgcmV0dXJuICJ0aGlzIiBzbyB0aGF0IG11bHRpcGxlCisgIC8vIG1ldGhvZCBjYWxscyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlciBpbiBvbmUgZXhwcmVzc2lvbi4KKworICAvLyBSdW4gdGhpcyBiZW5jaG1hcmsgb25jZSB3aXRoICJ4IiBhcyB0aGUgZXh0cmEgYXJndW1lbnQgcGFzc2VkCisgIC8vIHRvIHRoZSBmdW5jdGlvbi4KKyAgLy8gUkVRVUlSRVM6IFRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG11c3QgYWNjZXB0IGFuIGFyZzEuCisgIEJlbmNobWFyayogQXJnKGludDY0X3QgeCk7CisKKyAgLy8gUnVuIHRoaXMgYmVuY2htYXJrIHdpdGggdGhlIGdpdmVuIHRpbWUgdW5pdCBmb3IgdGhlIGdlbmVyYXRlZCBvdXRwdXQgcmVwb3J0CisgIEJlbmNobWFyayogVW5pdChUaW1lVW5pdCB1bml0KTsKKworICAvLyBSdW4gdGhpcyBiZW5jaG1hcmsgb25jZSBmb3IgYSBudW1iZXIgb2YgdmFsdWVzIHBpY2tlZCBmcm9tIHRoZQorICAvLyByYW5nZSBbc3RhcnQuLmxpbWl0XS4gIChzdGFydCBhbmQgbGltaXQgYXJlIGFsd2F5cyBwaWNrZWQuKQorICAvLyBSRVFVSVJFUzogVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgbXVzdCBhY2NlcHQgYW4gYXJnMS4KKyAgQmVuY2htYXJrKiBSYW5nZShpbnQ2NF90IHN0YXJ0LCBpbnQ2NF90IGxpbWl0KTsKKworICAvLyBSdW4gdGhpcyBiZW5jaG1hcmsgb25jZSBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UgW3N0YXJ0Li5saW1pdF0gd2l0aAorICAvLyBzcGVjaWZpYyBzdGVwCisgIC8vIFJFUVVJUkVTOiBUaGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBtdXN0IGFjY2VwdCBhbiBhcmcxLgorICBCZW5jaG1hcmsqIERlbnNlUmFuZ2UoaW50NjRfdCBzdGFydCwgaW50NjRfdCBsaW1pdCwgaW50IHN0ZXAgPSAxKTsKKworICAvLyBSdW4gdGhpcyBiZW5jaG1hcmsgb25jZSB3aXRoICJhcmdzIiBhcyB0aGUgZXh0cmEgYXJndW1lbnRzIHBhc3NlZAorICAvLyB0byB0aGUgZnVuY3Rpb24uCisgIC8vIFJFUVVJUkVTOiBUaGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBtdXN0IGFjY2VwdCBhcmcxLCBhcmcyIC4uLgorICBCZW5jaG1hcmsqIEFyZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGFyZ3MpOworCisgIC8vIEVxdWl2YWxlbnQgdG8gQXJncyh7eCwgeX0pCisgIC8vIE5PVEU6IFRoaXMgaXMgYSBsZWdhY3kgQysrMDMgaW50ZXJmYWNlIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuCisgIC8vICAgTmV3IGNvZGUgc2hvdWxkIHVzZSAnQXJncycuCisgIEJlbmNobWFyayogQXJnUGFpcihpbnQ2NF90IHgsIGludDY0X3QgeSkgeworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGFyZ3M7CisgICAgYXJncy5wdXNoX2JhY2soeCk7CisgICAgYXJncy5wdXNoX2JhY2soeSk7CisgICAgcmV0dXJuIEFyZ3MoYXJncyk7CisgIH0KKworICAvLyBSdW4gdGhpcyBiZW5jaG1hcmsgb25jZSBmb3IgYSBudW1iZXIgb2YgdmFsdWVzIHBpY2tlZCBmcm9tIHRoZQorICAvLyByYW5nZXMgW3N0YXJ0Li5saW1pdF0uICAoc3RhcnRzIGFuZCBsaW1pdHMgYXJlIGFsd2F5cyBwaWNrZWQuKQorICAvLyBSRVFVSVJFUzogVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgbXVzdCBhY2NlcHQgYXJnMSwgYXJnMiAuLi4KKyAgQmVuY2htYXJrKiBSYW5nZXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDY0X3QsIGludDY0X3Q+ID4mIHJhbmdlcyk7CisKKyAgLy8gRXF1aXZhbGVudCB0byBBcmdOYW1lcyh7bmFtZX0pCisgIEJlbmNobWFyayogQXJnTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgLy8gU2V0IHRoZSBhcmd1bWVudCBuYW1lcyB0byBkaXNwbGF5IGluIHRoZSBiZW5jaG1hcmsgbmFtZS4gSWYgbm90IGNhbGxlZCwKKyAgLy8gb25seSBhcmd1bWVudCB2YWx1ZXMgd2lsbCBiZSBzaG93bi4KKyAgQmVuY2htYXJrKiBBcmdOYW1lcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG5hbWVzKTsKKworICAvLyBFcXVpdmFsZW50IHRvIFJhbmdlcyh7e2xvMSwgaGkxfSwge2xvMiwgaGkyfX0pLgorICAvLyBOT1RFOiBUaGlzIGlzIGEgbGVnYWN5IEMrKzAzIGludGVyZmFjZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LgorICAvLyAgIE5ldyBjb2RlIHNob3VsZCB1c2UgJ1JhbmdlcycuCisgIEJlbmNobWFyayogUmFuZ2VQYWlyKGludDY0X3QgbG8xLCBpbnQ2NF90IGhpMSwgaW50NjRfdCBsbzIsIGludDY0X3QgaGkyKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDY0X3QsIGludDY0X3Q+ID4gcmFuZ2VzOworICAgIHJhbmdlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobG8xLCBoaTEpKTsKKyAgICByYW5nZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGxvMiwgaGkyKSk7CisgICAgcmV0dXJuIFJhbmdlcyhyYW5nZXMpOworICB9CisKKyAgLy8gUGFzcyB0aGlzIGJlbmNobWFyayBvYmplY3QgdG8gKmZ1bmMsIHdoaWNoIGNhbiBjdXN0b21pemUKKyAgLy8gdGhlIGJlbmNobWFyayBieSBjYWxsaW5nIHZhcmlvdXMgbWV0aG9kcyBsaWtlIEFyZywgQXJncywKKyAgLy8gVGhyZWFkcywgZXRjLgorICBCZW5jaG1hcmsqIEFwcGx5KHZvaWQgKCpmdW5jKShCZW5jaG1hcmsqIGJlbmNobWFyaykpOworCisgIC8vIFNldCB0aGUgcmFuZ2UgbXVsdGlwbGllciBmb3Igbm9uLWRlbnNlIHJhbmdlLiBJZiBub3QgY2FsbGVkLCB0aGUgcmFuZ2UKKyAgLy8gbXVsdGlwbGllciBrUmFuZ2VNdWx0aXBsaWVyIHdpbGwgYmUgdXNlZC4KKyAgQmVuY2htYXJrKiBSYW5nZU11bHRpcGxpZXIoaW50IG11bHRpcGxpZXIpOworCisgIC8vIFNldCB0aGUgbWluaW11bSBhbW91bnQgb2YgdGltZSB0byB1c2Ugd2hlbiBydW5uaW5nIHRoaXMgYmVuY2htYXJrLiBUaGlzCisgIC8vIG9wdGlvbiBvdmVycmlkZXMgdGhlIGBiZW5jaG1hcmtfbWluX3RpbWVgIGZsYWcuCisgIC8vIFJFUVVJUkVTOiBgdCA+IDBgIGFuZCBgSXRlcmF0aW9uc2AgaGFzIG5vdCBiZWVuIGNhbGxlZCBvbiB0aGlzIGJlbmNobWFyay4KKyAgQmVuY2htYXJrKiBNaW5UaW1lKGRvdWJsZSB0KTsKKworICAvLyBTcGVjaWZ5IHRoZSBhbW91bnQgb2YgaXRlcmF0aW9ucyB0aGF0IHNob3VsZCBiZSBydW4gYnkgdGhpcyBiZW5jaG1hcmsuCisgIC8vIFJFUVVJUkVTOiAnbiA+IDAnIGFuZCBgTWluVGltZWAgaGFzIG5vdCBiZWVuIGNhbGxlZCBvbiB0aGlzIGJlbmNobWFyay4KKyAgLy8KKyAgLy8gTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gKmV4YWN0KiBpdGVyYXRpb24gY29udHJvbCBpcworICAvLyAgIG5lZWRlZCBhbmQgbmV2ZXIgdG8gY29udHJvbCBvciBsaW1pdCBob3cgbG9uZyBhIGJlbmNobWFyayBydW5zLCB3aGVyZQorICAvLyBgLS1iZW5jaG1hcmtfbWluX3RpbWU9TmAgb3IgYE1pblRpbWUoLi4uKWAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgQmVuY2htYXJrKiBJdGVyYXRpb25zKEl0ZXJhdGlvbkNvdW50IG4pOworCisgIC8vIFNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lcyB0byByZXBlYXQgdGhpcyBiZW5jaG1hcmsuIFRoaXMgb3B0aW9uIG92ZXJyaWRlcworICAvLyB0aGUgYGJlbmNobWFya19yZXBldGl0aW9uc2AgZmxhZy4KKyAgLy8gUkVRVUlSRVM6IGBuID4gMGAKKyAgQmVuY2htYXJrKiBSZXBldGl0aW9ucyhpbnQgbik7CisKKyAgLy8gU3BlY2lmeSBpZiBlYWNoIHJlcGV0aXRpb24gb2YgdGhlIGJlbmNobWFyayBzaG91bGQgYmUgcmVwb3J0ZWQgc2VwYXJhdGVseQorICAvLyBvciBpZiBvbmx5IHRoZSBmaW5hbCBzdGF0aXN0aWNzIHNob3VsZCBiZSByZXBvcnRlZC4gSWYgdGhlIGJlbmNobWFyaworICAvLyBpcyBub3QgcmVwZWF0ZWQgdGhlbiB0aGUgc2luZ2xlIHJlc3VsdCBpcyBhbHdheXMgcmVwb3J0ZWQuCisgIC8vIEFwcGxpZXMgdG8gKkFMTCogcmVwb3J0ZXJzIChkaXNwbGF5IGFuZCBmaWxlKS4KKyAgQmVuY2htYXJrKiBSZXBvcnRBZ2dyZWdhdGVzT25seShib29sIHZhbHVlID0gdHJ1ZSk7CisKKyAgLy8gU2FtZSBhcyBSZXBvcnRBZ2dyZWdhdGVzT25seSgpLCBidXQgYXBwbGllcyB0byBkaXNwbGF5IHJlcG9ydGVyIG9ubHkuCisgIEJlbmNobWFyayogRGlzcGxheUFnZ3JlZ2F0ZXNPbmx5KGJvb2wgdmFsdWUgPSB0cnVlKTsKKworICAvLyBCeSBkZWZhdWx0LCB0aGUgQ1BVIHRpbWUgaXMgbWVhc3VyZWQgb25seSBmb3IgdGhlIG1haW4gdGhyZWFkLCB3aGljaCBtYXkKKyAgLy8gYmUgdW5yZXByZXNlbnRhdGl2ZSBpZiB0aGUgYmVuY2htYXJrIHVzZXMgdGhyZWFkcyBpbnRlcm5hbGx5LiBJZiBjYWxsZWQsCisgIC8vIHRoZSB0b3RhbCBDUFUgdGltZSBzcGVudCBieSBhbGwgdGhlIHRocmVhZHMgd2lsbCBiZSBtZWFzdXJlZCBpbnN0ZWFkLgorICAvLyBCeSBkZWZhdWx0LCB0aGUgb25seSB0aGUgbWFpbiB0aHJlYWQgQ1BVIHRpbWUgd2lsbCBiZSBtZWFzdXJlZC4KKyAgQmVuY2htYXJrKiBNZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKTsKKworICAvLyBJZiBhIHBhcnRpY3VsYXIgYmVuY2htYXJrIHNob3VsZCB1c2UgdGhlIFdhbGwgY2xvY2sgaW5zdGVhZCBvZiB0aGUgQ1BVIHRpbWUKKyAgLy8gKGJlIGl0IGVpdGhlciB0aGUgQ1BVIHRpbWUgb2YgdGhlIG1haW4gdGhyZWFkIG9ubHkgKGRlZmF1bHQpLCBvciB0aGUKKyAgLy8gdG90YWwgQ1BVIHVzYWdlIG9mIHRoZSBiZW5jaG1hcmspLCBjYWxsIHRoaXMgbWV0aG9kLiBJZiBjYWxsZWQsIHRoZSBlbGFwc2VkCisgIC8vICh3YWxsKSB0aW1lIHdpbGwgYmUgdXNlZCB0byBjb250cm9sIGhvdyBtYW55IGl0ZXJhdGlvbnMgYXJlIHJ1biwgYW5kIGluIHRoZQorICAvLyBwcmludGluZyBvZiBpdGVtcy9zZWNvbmQgb3IgTUIvc2Vjb25kcyB2YWx1ZXMuCisgIC8vIElmIG5vdCBjYWxsZWQsIHRoZSBDUFUgdGltZSB1c2VkIGJ5IHRoZSBiZW5jaG1hcmsgd2lsbCBiZSB1c2VkLgorICBCZW5jaG1hcmsqIFVzZVJlYWxUaW1lKCk7CisKKyAgLy8gSWYgYSBiZW5jaG1hcmsgbXVzdCBtZWFzdXJlIHRpbWUgbWFudWFsbHkgKGUuZy4gaWYgR1BVIGV4ZWN1dGlvbiB0aW1lIGlzCisgIC8vIGJlaW5nCisgIC8vIG1lYXN1cmVkKSwgY2FsbCB0aGlzIG1ldGhvZC4gSWYgY2FsbGVkLCBlYWNoIGJlbmNobWFyayBpdGVyYXRpb24gc2hvdWxkCisgIC8vIGNhbGwKKyAgLy8gU2V0SXRlcmF0aW9uVGltZShzZWNvbmRzKSB0byByZXBvcnQgdGhlIG1lYXN1cmVkIHRpbWUsIHdoaWNoIHdpbGwgYmUgdXNlZAorICAvLyB0byBjb250cm9sIGhvdyBtYW55IGl0ZXJhdGlvbnMgYXJlIHJ1biwgYW5kIGluIHRoZSBwcmludGluZyBvZiBpdGVtcy9zZWNvbmQKKyAgLy8gb3IgTUIvc2Vjb25kIHZhbHVlcy4KKyAgQmVuY2htYXJrKiBVc2VNYW51YWxUaW1lKCk7CisKKyAgLy8gU2V0IHRoZSBhc3ltcHRvdGljIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSBmb3IgdGhlIGJlbmNobWFyay4gSWYgY2FsbGVkCisgIC8vIHRoZSBhc3ltcHRvdGljIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSB3aWxsIGJlIHNob3duIG9uIHRoZSBvdXRwdXQuCisgIEJlbmNobWFyayogQ29tcGxleGl0eShCaWdPIGNvbXBsZXhpdHkgPSBiZW5jaG1hcms6Om9BdXRvKTsKKworICAvLyBTZXQgdGhlIGFzeW1wdG90aWMgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5IGZvciB0aGUgYmVuY2htYXJrLiBJZiBjYWxsZWQKKyAgLy8gdGhlIGFzeW1wdG90aWMgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5IHdpbGwgYmUgc2hvd24gb24gdGhlIG91dHB1dC4KKyAgQmVuY2htYXJrKiBDb21wbGV4aXR5KEJpZ09GdW5jKiBjb21wbGV4aXR5KTsKKworICAvLyBBZGQgdGhpcyBzdGF0aXN0aWNzIHRvIGJlIGNvbXB1dGVkIG92ZXIgYWxsIHRoZSB2YWx1ZXMgb2YgYmVuY2htYXJrIHJ1bgorICBCZW5jaG1hcmsqIENvbXB1dGVTdGF0aXN0aWNzKHN0ZDo6c3RyaW5nIG5hbWUsIFN0YXRpc3RpY3NGdW5jKiBzdGF0aXN0aWNzKTsKKworICAvLyBTdXBwb3J0IGZvciBydW5uaW5nIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBiZW5jaG1hcmsgY29uY3VycmVudGx5CisgIC8vIGluIG11bHRpcGxlIHRocmVhZHMuICBUaGlzIG1heSBiZSB1c2VmdWwgd2hlbiBtZWFzdXJpbmcgdGhlIHNjYWxpbmcKKyAgLy8gb2Ygc29tZSBwaWVjZSBvZiBjb2RlLgorCisgIC8vIFJ1biBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBiZW5jaG1hcmsgY29uY3VycmVudGx5IGluIHQgdGhyZWFkcy4KKyAgQmVuY2htYXJrKiBUaHJlYWRzKGludCB0KTsKKworICAvLyBQaWNrIGEgc2V0IG9mIHZhbHVlcyBUIGZyb20gW21pbl90aHJlYWRzLG1heF90aHJlYWRzXS4KKyAgLy8gbWluX3RocmVhZHMgYW5kIG1heF90aHJlYWRzIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gVC4gIFJ1biB0aGlzCisgIC8vIGJlbmNobWFyayBvbmNlIGZvciBlYWNoIHZhbHVlIGluIFQuICBUaGUgYmVuY2htYXJrIHJ1biBmb3IgYQorICAvLyBwYXJ0aWN1bGFyIHZhbHVlIHQgY29uc2lzdHMgb2YgdCB0aHJlYWRzIHJ1bm5pbmcgdGhlIGJlbmNobWFyaworICAvLyBmdW5jdGlvbiBjb25jdXJyZW50bHkuICBGb3IgZXhhbXBsZSwgY29uc2lkZXI6CisgIC8vICAgIEJFTkNITUFSSyhGb28pLT5UaHJlYWRSYW5nZSgxLDE2KTsKKyAgLy8gVGhpcyB3aWxsIHJ1biB0aGUgZm9sbG93aW5nIGJlbmNobWFya3M6CisgIC8vICAgIEZvbyBpbiAxIHRocmVhZAorICAvLyAgICBGb28gaW4gMiB0aHJlYWRzCisgIC8vICAgIEZvbyBpbiA0IHRocmVhZHMKKyAgLy8gICAgRm9vIGluIDggdGhyZWFkcworICAvLyAgICBGb28gaW4gMTYgdGhyZWFkcworICBCZW5jaG1hcmsqIFRocmVhZFJhbmdlKGludCBtaW5fdGhyZWFkcywgaW50IG1heF90aHJlYWRzKTsKKworICAvLyBGb3IgZWFjaCB2YWx1ZSBuIGluIHRoZSByYW5nZSwgcnVuIHRoaXMgYmVuY2htYXJrIG9uY2UgdXNpbmcgbiB0aHJlYWRzLgorICAvLyBtaW5fdGhyZWFkcyBhbmQgbWF4X3RocmVhZHMgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UuCisgIC8vIHN0cmlkZSBzcGVjaWZpZXMgdGhlIGluY3JlbWVudC4gRS5nLiBEZW5zZVRocmVhZFJhbmdlKDEsIDgsIDMpIHN0YXJ0cworICAvLyBhIGJlbmNobWFyayB3aXRoIDEsIDQsIDcgYW5kIDggdGhyZWFkcy4KKyAgQmVuY2htYXJrKiBEZW5zZVRocmVhZFJhbmdlKGludCBtaW5fdGhyZWFkcywgaW50IG1heF90aHJlYWRzLCBpbnQgc3RyaWRlID0gMSk7CisKKyAgLy8gRXF1aXZhbGVudCB0byBUaHJlYWRSYW5nZShOdW1DUFVzKCksIE51bUNQVXMoKSkKKyAgQmVuY2htYXJrKiBUaHJlYWRQZXJDcHUoKTsKKworICB2aXJ0dWFsIHZvaWQgUnVuKFN0YXRlJiBzdGF0ZSkgPSAwOworCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBCZW5jaG1hcmsoY29uc3QgY2hhciogbmFtZSk7CisgIEJlbmNobWFyayhCZW5jaG1hcmsgY29uc3QmKTsKKyAgdm9pZCBTZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIGludCBBcmdzQ250KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQmVuY2htYXJrRmFtaWxpZXM7CisKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIEFnZ3JlZ2F0aW9uUmVwb3J0TW9kZSBhZ2dyZWdhdGlvbl9yZXBvcnRfbW9kZV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdfbmFtZXNfOyAgICAgICAvLyBBcmdzIGZvciBhbGwgYmVuY2htYXJrIHJ1bnMKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50NjRfdD4gPiBhcmdzXzsgIC8vIEFyZ3MgZm9yIGFsbCBiZW5jaG1hcmsgcnVucworICBUaW1lVW5pdCB0aW1lX3VuaXRfOworICBpbnQgcmFuZ2VfbXVsdGlwbGllcl87CisgIGRvdWJsZSBtaW5fdGltZV87CisgIEl0ZXJhdGlvbkNvdW50IGl0ZXJhdGlvbnNfOworICBpbnQgcmVwZXRpdGlvbnNfOworICBib29sIG1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZV87CisgIGJvb2wgdXNlX3JlYWxfdGltZV87CisgIGJvb2wgdXNlX21hbnVhbF90aW1lXzsKKyAgQmlnTyBjb21wbGV4aXR5XzsKKyAgQmlnT0Z1bmMqIGNvbXBsZXhpdHlfbGFtYmRhXzsKKyAgc3RkOjp2ZWN0b3I8U3RhdGlzdGljcz4gc3RhdGlzdGljc187CisgIHN0ZDo6dmVjdG9yPGludD4gdGhyZWFkX2NvdW50c187CisKKyAgQmVuY2htYXJrJiBvcGVyYXRvcj0oQmVuY2htYXJrIGNvbnN0Jik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQ3JlYXRlIGFuZCByZWdpc3RlciBhIGJlbmNobWFyayB3aXRoIHRoZSBzcGVjaWZpZWQgJ25hbWUnIHRoYXQgaW52b2tlcworLy8gdGhlIHNwZWNpZmllZCBmdW5jdG9yICdmbicuCisvLworLy8gUkVUVVJOUzogQSBwb2ludGVyIHRvIHRoZSByZWdpc3RlcmVkIGJlbmNobWFyay4KK2ludGVybmFsOjpCZW5jaG1hcmsqIFJlZ2lzdGVyQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6RnVuY3Rpb24qIGZuKTsKKworI2lmIGRlZmluZWQoQkVOQ0hNQVJLX0hBU19DWFgxMSkKK3RlbXBsYXRlIDxjbGFzcyBMYW1iZGE+CitpbnRlcm5hbDo6QmVuY2htYXJrKiBSZWdpc3RlckJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lLCBMYW1iZGEmJiBmbik7CisjZW5kaWYKKworLy8gUmVtb3ZlIGFsbCByZWdpc3RlcmVkIGJlbmNobWFya3MuIEFsbCBwb2ludGVycyB0byBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKKy8vIGJlbmNobWFya3MgYXJlIGludmFsaWRhdGVkLgordm9pZCBDbGVhclJlZ2lzdGVyZWRCZW5jaG1hcmtzKCk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBUaGUgY2xhc3MgdXNlZCB0byBob2xkIGFsbCBCZW5jaG1hcmtzIGNyZWF0ZWQgZnJvbSBzdGF0aWMgZnVuY3Rpb24uCisvLyAoaWUgdGhvc2UgY3JlYXRlZCB1c2luZyB0aGUgQkVOQ0hNQVJLKC4uLikgbWFjcm9zLgorY2xhc3MgRnVuY3Rpb25CZW5jaG1hcmsgOiBwdWJsaWMgQmVuY2htYXJrIHsKKyBwdWJsaWM6CisgIEZ1bmN0aW9uQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsIEZ1bmN0aW9uKiBmdW5jKQorICAgICAgOiBCZW5jaG1hcmsobmFtZSksIGZ1bmNfKGZ1bmMpIHt9CisKKyAgdmlydHVhbCB2b2lkIFJ1bihTdGF0ZSYgc3QpOworCisgcHJpdmF0ZToKKyAgRnVuY3Rpb24qIGZ1bmNfOworfTsKKworI2lmZGVmIEJFTkNITUFSS19IQVNfQ1hYMTEKK3RlbXBsYXRlIDxjbGFzcyBMYW1iZGE+CitjbGFzcyBMYW1iZGFCZW5jaG1hcmsgOiBwdWJsaWMgQmVuY2htYXJrIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBSdW4oU3RhdGUmIHN0KSB7IGxhbWJkYV8oc3QpOyB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgT0xhbWJkYT4KKyAgTGFtYmRhQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsIE9MYW1iZGEmJiBsYW0pCisgICAgICA6IEJlbmNobWFyayhuYW1lKSwgbGFtYmRhXyhzdGQ6OmZvcndhcmQ8T0xhbWJkYT4obGFtKSkge30KKworICBMYW1iZGFCZW5jaG1hcmsoTGFtYmRhQmVuY2htYXJrIGNvbnN0JikgPSBkZWxldGU7CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgTGFtPgorICBmcmllbmQgQmVuY2htYXJrKiA6OmJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsoY29uc3QgY2hhciosIExhbSYmKTsKKworICBMYW1iZGEgbGFtYmRhXzsKK307CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK2lubGluZSBpbnRlcm5hbDo6QmVuY2htYXJrKiBSZWdpc3RlckJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGdW5jdGlvbiogZm4pIHsKKyAgcmV0dXJuIGludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKAorICAgICAgOjpuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQmVuY2htYXJrKG5hbWUsIGZuKSk7Cit9CisKKyNpZmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCit0ZW1wbGF0ZSA8Y2xhc3MgTGFtYmRhPgoraW50ZXJuYWw6OkJlbmNobWFyayogUmVnaXN0ZXJCZW5jaG1hcmsoY29uc3QgY2hhciogbmFtZSwgTGFtYmRhJiYgZm4pIHsKKyAgdXNpbmcgQmVuY2hUeXBlID0KKyAgICAgIGludGVybmFsOjpMYW1iZGFCZW5jaG1hcms8dHlwZW5hbWUgc3RkOjpkZWNheTxMYW1iZGE+Ojp0eXBlPjsKKyAgcmV0dXJuIGludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKAorICAgICAgOjpuZXcgQmVuY2hUeXBlKG5hbWUsIHN0ZDo6Zm9yd2FyZDxMYW1iZGE+KGZuKSkpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19IQVNfQ1hYMTEpICYmIFwKKyAgICAoIWRlZmluZWQoQkVOQ0hNQVJLX0dDQ19WRVJTSU9OKSB8fCBCRU5DSE1BUktfR0NDX1ZFUlNJT04gPj0gNDA5KQordGVtcGxhdGUgPGNsYXNzIExhbWJkYSwgY2xhc3MuLi4gQXJncz4KK2ludGVybmFsOjpCZW5jaG1hcmsqIFJlZ2lzdGVyQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsIExhbWJkYSYmIGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyYmLi4uIGFyZ3MpIHsKKyAgcmV0dXJuIGJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsoCisgICAgICBuYW1lLCBbPV0oYmVuY2htYXJrOjpTdGF0ZSYgc3QpIHsgZm4oc3QsIGFyZ3MuLi4pOyB9KTsKK30KKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19IQVNfTk9fVkFSSUFESUNfUkVHSVNURVJfQkVOQ0hNQVJLCisjZW5kaWYKKworLy8gVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBmaXh0dXJlIHRlc3RzLgorY2xhc3MgRml4dHVyZSA6IHB1YmxpYyBpbnRlcm5hbDo6QmVuY2htYXJrIHsKKyBwdWJsaWM6CisgIEZpeHR1cmUoKSA6IGludGVybmFsOjpCZW5jaG1hcmsoIiIpIHt9CisKKyAgdmlydHVhbCB2b2lkIFJ1bihTdGF0ZSYgc3QpIHsKKyAgICB0aGlzLT5TZXRVcChzdCk7CisgICAgdGhpcy0+QmVuY2htYXJrQ2FzZShzdCk7CisgICAgdGhpcy0+VGVhckRvd24oc3QpOworICB9CisKKyAgLy8gVGhlc2Ugd2lsbCBiZSBkZXByZWNhdGVkIC4uLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoY29uc3QgU3RhdGUmKSB7fQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oY29uc3QgU3RhdGUmKSB7fQorICAvLyAuLi4gSW4gZmF2b3Igb2YgdGhlc2UuCisgIHZpcnR1YWwgdm9pZCBTZXRVcChTdGF0ZSYgc3QpIHsgU2V0VXAoY29uc3RfY2FzdDxjb25zdCBTdGF0ZSY+KHN0KSk7IH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKFN0YXRlJiBzdCkgeyBUZWFyRG93bihjb25zdF9jYXN0PGNvbnN0IFN0YXRlJj4oc3QpKTsgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgQmVuY2htYXJrQ2FzZShTdGF0ZSYpID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWNybyB0byByZWdpc3RlciBiZW5jaG1hcmtzCisKKy8vIENoZWNrIHRoYXQgX19DT1VOVEVSX18gaXMgZGVmaW5lZCBhbmQgdGhhdCBfX0NPVU5URVJfXyBpbmNyZWFzZXMgYnkgMQorLy8gZXZlcnkgdGltZSBpdCBpcyBleHBhbmRlZC4gWCArIDEgPT0gWCArIDAgaXMgdXNlZCBpbiBjYXNlIFggaXMgZGVmaW5lZCB0byBiZQorLy8gZW1wdHkuIElmIFggaXMgZW1wdHkgdGhlIGV4cHJlc3Npb24gYmVjb21lcyAoKzEgPT0gKzApLgorI2lmIGRlZmluZWQoX19DT1VOVEVSX18pICYmIChfX0NPVU5URVJfXyArIDEgPT0gX19DT1VOVEVSX18gKyAwKQorI2RlZmluZSBCRU5DSE1BUktfUFJJVkFURV9VTklRVUVfSUQgX19DT1VOVEVSX18KKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19QUklWQVRFX1VOSVFVRV9JRCBfX0xJTkVfXworI2VuZGlmCisKKy8vIEhlbHBlcnMgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIHZhcmlhYmxlIG5hbWVzCisjZGVmaW5lIEJFTkNITUFSS19QUklWQVRFX05BTUUobikgXAorICBCRU5DSE1BUktfUFJJVkFURV9DT05DQVQoX2JlbmNobWFya18sIEJFTkNITUFSS19QUklWQVRFX1VOSVFVRV9JRCwgbikKKyNkZWZpbmUgQkVOQ0hNQVJLX1BSSVZBVEVfQ09OQ0FUKGEsIGIsIGMpIEJFTkNITUFSS19QUklWQVRFX0NPTkNBVDIoYSwgYiwgYykKKyNkZWZpbmUgQkVOQ0hNQVJLX1BSSVZBVEVfQ09OQ0FUMihhLCBiLCBjKSBhIyNiIyNjCisKKyNkZWZpbmUgQkVOQ0hNQVJLX1BSSVZBVEVfREVDTEFSRShuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIDo6YmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrKiBCRU5DSE1BUktfUFJJVkFURV9OQU1FKG4pIFwKKyAgICAgIEJFTkNITUFSS19VTlVTRUQKKworI2RlZmluZSBCRU5DSE1BUksobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCRU5DSE1BUktfUFJJVkFURV9ERUNMQVJFKG4pID0gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKDo6YmVuY2htYXJrOjppbnRlcm5hbDo6UmVnaXN0ZXJCZW5jaG1hcmtJbnRlcm5hbCggXAorICAgICAgICAgIG5ldyA6OmJlbmNobWFyazo6aW50ZXJuYWw6OkZ1bmN0aW9uQmVuY2htYXJrKCNuLCBuKSkpCisKKy8vIE9sZC1zdHlsZSBtYWNyb3MKKyNkZWZpbmUgQkVOQ0hNQVJLX1dJVEhfQVJHKG4sIGEpIEJFTkNITUFSSyhuKS0+QXJnKChhKSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1dJVEhfQVJHMihuLCBhMSwgYTIpIEJFTkNITUFSSyhuKS0+QXJncyh7KGExKSwgKGEyKX0pCisjZGVmaW5lIEJFTkNITUFSS19XSVRIX1VOSVQobiwgdCkgQkVOQ0hNQVJLKG4pLT5Vbml0KCh0KSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1JBTkdFKG4sIGxvLCBoaSkgQkVOQ0hNQVJLKG4pLT5SYW5nZSgobG8pLCAoaGkpKQorI2RlZmluZSBCRU5DSE1BUktfUkFOR0UyKG4sIGwxLCBoMSwgbDIsIGgyKSBcCisgIEJFTkNITUFSSyhuKS0+UmFuZ2VQYWlyKHt7KGwxKSwgKGgxKX0sIHsobDIpLCAoaDIpfX0pCisKKyNpZmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCisKKy8vIFJlZ2lzdGVyIGEgYmVuY2htYXJrIHdoaWNoIGludm9rZXMgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSBgZnVuY2AKKy8vIHdpdGggdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmllZCBieSBgLi4uYC4KKy8vCisvLyBGb3IgZXhhbXBsZToKKy8vCisvLyB0ZW1wbGF0ZSA8Y2xhc3MgLi4uRXh0cmFBcmdzPmAKKy8vIHZvaWQgQk1fdGFrZXNfYXJncyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgRXh0cmFBcmdzJiYuLi4gZXh0cmFfYXJncykgeworLy8gIFsuLi5dCisvL30KKy8vIC8qIFJlZ2lzdGVycyBhIGJlbmNobWFyayBuYW1lZCAiQk1fdGFrZXNfYXJncy9pbnRfc3RyaW5nX3Rlc3RgICovCisvLyBCRU5DSE1BUktfQ0FQVFVSRShCTV90YWtlc19hcmdzLCBpbnRfc3RyaW5nX3Rlc3QsIDQyLCBzdGQ6OnN0cmluZygiYWJjIikpOworI2RlZmluZSBCRU5DSE1BUktfQ0FQVFVSRShmdW5jLCB0ZXN0X2Nhc2VfbmFtZSwgLi4uKSAgICAgXAorICBCRU5DSE1BUktfUFJJVkFURV9ERUNMQVJFKGZ1bmMpID0gICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKDo6YmVuY2htYXJrOjppbnRlcm5hbDo6UmVnaXN0ZXJCZW5jaG1hcmtJbnRlcm5hbCggXAorICAgICAgICAgIG5ldyA6OmJlbmNobWFyazo6aW50ZXJuYWw6OkZ1bmN0aW9uQmVuY2htYXJrKCAgXAorICAgICAgICAgICAgICAjZnVuYyAiLyIgI3Rlc3RfY2FzZV9uYW1lLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBbXSg6OmJlbmNobWFyazo6U3RhdGUmIHN0KSB7IGZ1bmMoc3QsIF9fVkFfQVJHU19fKTsgfSkpKQorCisjZW5kaWYgIC8vIEJFTkNITUFSS19IQVNfQ1hYMTEKKworLy8gVGhpcyB3aWxsIHJlZ2lzdGVyIGEgYmVuY2htYXJrIGZvciBhIHRlbXBsYXRpemVkIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CisvLworLy8gdGVtcGxhdGU8aW50IGFyZz4KKy8vIHZvaWQgQk1fRm9vKGludCBpdGVycyk7CisvLworLy8gQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX0ZvbywgMSk7CisvLworLy8gd2lsbCByZWdpc3RlciBCTV9Gb288MT4gYXMgYSBiZW5jaG1hcmsuCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURTEobiwgYSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJFTkNITUFSS19QUklWQVRFX0RFQ0xBUkUobikgPSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoOjpiZW5jaG1hcms6OmludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKCBcCisgICAgICAgICAgbmV3IDo6YmVuY2htYXJrOjppbnRlcm5hbDo6RnVuY3Rpb25CZW5jaG1hcmsoI24gIjwiICNhICI+IiwgbjxhPikpKQorCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURTIobiwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQkVOQ0hNQVJLX1BSSVZBVEVfREVDTEFSRShuKSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKDo6YmVuY2htYXJrOjppbnRlcm5hbDo6UmVnaXN0ZXJCZW5jaG1hcmtJbnRlcm5hbCggICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbmV3IDo6YmVuY2htYXJrOjppbnRlcm5hbDo6RnVuY3Rpb25CZW5jaG1hcmsoI24gIjwiICNhICIsIiAjYiAiPiIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuPGEsIGI+KSkpCisKKyNpZmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURShuLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJFTkNITUFSS19QUklWQVRFX0RFQ0xBUkUobikgPSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoOjpiZW5jaG1hcms6OmludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKCBcCisgICAgICAgICAgbmV3IDo6YmVuY2htYXJrOjppbnRlcm5hbDo6RnVuY3Rpb25CZW5jaG1hcmsoICBcCisgICAgICAgICAgICAgICNuICI8IiAjX19WQV9BUkdTX18gIj4iLCBuPF9fVkFfQVJHU19fPikpKQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFKG4sIGEpIEJFTkNITUFSS19URU1QTEFURTEobiwgYSkKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNITUFSS19QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCkgICAgICAgIFwKKyAgY2xhc3MgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcmsgOiBwdWJsaWMgQmFzZUNsYXNzIHsgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcmsoKSA6IEJhc2VDbGFzcygpIHsgICAgICAgIFwKKyAgICAgIHRoaXMtPlNldE5hbWUoI0Jhc2VDbGFzcyAiLyIgI01ldGhvZCk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZpcnR1YWwgdm9pZCBCZW5jaG1hcmtDYXNlKDo6YmVuY2htYXJrOjpTdGF0ZSYpOyAgICAgICAgICBcCisgIH07CisKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFMV9QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkgXAorICBjbGFzcyBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyayA6IHB1YmxpYyBCYXNlQ2xhc3M8YT4geyAgICBcCisgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyaygpIDogQmFzZUNsYXNzPGE+KCkgeyAgICAgICAgICAgXAorICAgICAgdGhpcy0+U2V0TmFtZSgjQmFzZUNsYXNzICI8IiAjYSAiPi8iICNNZXRob2QpOyAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmlydHVhbCB2b2lkIEJlbmNobWFya0Nhc2UoOjpiZW5jaG1hcms6OlN0YXRlJik7ICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEUyX1BSSVZBVEVfREVDTEFSRV9GKEJhc2VDbGFzcywgTWV0aG9kLCBhLCBiKSBcCisgIGNsYXNzIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrIDogcHVibGljIEJhc2VDbGFzczxhLCBiPiB7ICAgIFwKKyAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrKCkgOiBCYXNlQ2xhc3M8YSwgYj4oKSB7ICAgICAgICAgICBcCisgICAgICB0aGlzLT5TZXROYW1lKCNCYXNlQ2xhc3MgIjwiICNhICIsIiAjYiAiPi8iICNNZXRob2QpOyAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgQmVuY2htYXJrQ2FzZSg6OmJlbmNobWFyazo6U3RhdGUmKTsgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjaWZkZWYgQkVOQ0hNQVJLX0hBU19DWFgxMQorI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEVfUFJJVkFURV9ERUNMQVJFX0YoQmFzZUNsYXNzLCBNZXRob2QsIC4uLikgICAgICAgXAorICBjbGFzcyBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyayA6IHB1YmxpYyBCYXNlQ2xhc3M8X19WQV9BUkdTX18+IHsgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrKCkgOiBCYXNlQ2xhc3M8X19WQV9BUkdTX18+KCkgeyAgICAgICAgXAorICAgICAgdGhpcy0+U2V0TmFtZSgjQmFzZUNsYXNzICI8IiAjX19WQV9BUkdTX18gIj4vIiAjTWV0aG9kKTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZpcnR1YWwgdm9pZCBCZW5jaG1hcmtDYXNlKDo6YmVuY2htYXJrOjpTdGF0ZSYpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFX1BSSVZBVEVfREVDTEFSRV9GKG4sIGEpIFwKKyAgQkVOQ0hNQVJLX1RFTVBMQVRFMV9QUklWQVRFX0RFQ0xBUkVfRihuLCBhKQorI2VuZGlmCisKKyNkZWZpbmUgQkVOQ0hNQVJLX0RFRklORV9GKEJhc2VDbGFzcywgTWV0aG9kKSAgICBcCisgIEJFTkNITUFSS19QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCkgXAorICB2b2lkIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrOjpCZW5jaG1hcmtDYXNlCisKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFMV9ERUZJTkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkgICAgXAorICBCRU5DSE1BUktfVEVNUExBVEUxX1BSSVZBVEVfREVDTEFSRV9GKEJhc2VDbGFzcywgTWV0aG9kLCBhKSBcCisgIHZvaWQgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcms6OkJlbmNobWFya0Nhc2UKKworI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEUyX0RFRklORV9GKEJhc2VDbGFzcywgTWV0aG9kLCBhLCBiKSAgICBcCisgIEJFTkNITUFSS19URU1QTEFURTJfUFJJVkFURV9ERUNMQVJFX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEsIGIpIFwKKyAgdm9pZCBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyazo6QmVuY2htYXJrQ2FzZQorCisjaWZkZWYgQkVOQ0hNQVJLX0hBU19DWFgxMQorI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEVfREVGSU5FX0YoQmFzZUNsYXNzLCBNZXRob2QsIC4uLikgICAgICAgICAgICBcCisgIEJFTkNITUFSS19URU1QTEFURV9QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgX19WQV9BUkdTX18pIFwKKyAgdm9pZCBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyazo6QmVuY2htYXJrQ2FzZQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFX0RFRklORV9GKEJhc2VDbGFzcywgTWV0aG9kLCBhKSBcCisgIEJFTkNITUFSS19URU1QTEFURTFfREVGSU5FX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEpCisjZW5kaWYKKworI2RlZmluZSBCRU5DSE1BUktfUkVHSVNURVJfRihCYXNlQ2xhc3MsIE1ldGhvZCkgXAorICBCRU5DSE1BUktfUFJJVkFURV9SRUdJU1RFUl9GKEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrKQorCisjZGVmaW5lIEJFTkNITUFSS19QUklWQVRFX1JFR0lTVEVSX0YoVGVzdE5hbWUpIFwKKyAgQkVOQ0hNQVJLX1BSSVZBVEVfREVDTEFSRShUZXN0TmFtZSkgPSAgICAgICAgXAorICAgICAgKDo6YmVuY2htYXJrOjppbnRlcm5hbDo6UmVnaXN0ZXJCZW5jaG1hcmtJbnRlcm5hbChuZXcgVGVzdE5hbWUoKSkpCisKKy8vIFRoaXMgbWFjcm8gd2lsbCBkZWZpbmUgYW5kIHJlZ2lzdGVyIGEgYmVuY2htYXJrIHdpdGhpbiBhIGZpeHR1cmUgY2xhc3MuCisjZGVmaW5lIEJFTkNITUFSS19GKEJhc2VDbGFzcywgTWV0aG9kKSAgICAgICAgICAgXAorICBCRU5DSE1BUktfUFJJVkFURV9ERUNMQVJFX0YoQmFzZUNsYXNzLCBNZXRob2QpIFwKKyAgQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQmFzZUNsYXNzLCBNZXRob2QpOyAgICAgICBcCisgIHZvaWQgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcms6OkJlbmNobWFya0Nhc2UKKworI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEUxX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEpICAgICAgICAgICBcCisgIEJFTkNITUFSS19URU1QTEFURTFfUFJJVkFURV9ERUNMQVJFX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEpIFwKKyAgQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQmFzZUNsYXNzLCBNZXRob2QpOyAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrOjpCZW5jaG1hcmtDYXNlCisKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFMl9GKEJhc2VDbGFzcywgTWV0aG9kLCBhLCBiKSAgICAgICAgICAgXAorICBCRU5DSE1BUktfVEVNUExBVEUyX1BSSVZBVEVfREVDTEFSRV9GKEJhc2VDbGFzcywgTWV0aG9kLCBhLCBiKSBcCisgIEJFTkNITUFSS19SRUdJU1RFUl9GKEJhc2VDbGFzcywgTWV0aG9kKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyazo6QmVuY2htYXJrQ2FzZQorCisjaWZkZWYgQkVOQ0hNQVJLX0hBU19DWFgxMQorI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgLi4uKSAgICAgICAgICAgICAgICAgICBcCisgIEJFTkNITUFSS19URU1QTEFURV9QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgX19WQV9BUkdTX18pIFwKKyAgQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQmFzZUNsYXNzLCBNZXRob2QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrOjpCZW5jaG1hcmtDYXNlCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkgXAorICBCRU5DSE1BUktfVEVNUExBVEUxX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEpCisjZW5kaWYKKworLy8gSGVscGVyIG1hY3JvIHRvIGNyZWF0ZSBhIG1haW4gcm91dGluZSBpbiBhIHRlc3QgdGhhdCBydW5zIHRoZSBiZW5jaG1hcmtzCisjZGVmaW5lIEJFTkNITUFSS19NQUlOKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpiZW5jaG1hcms6OkluaXRpYWxpemUoJmFyZ2MsIGFyZ3YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKDo6YmVuY2htYXJrOjpSZXBvcnRVbnJlY29nbml6ZWRBcmd1bWVudHMoYXJnYywgYXJndikpIHJldHVybiAxOyBcCisgICAgOjpiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBtYWluKGludCwgY2hhcioqKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJlbmNobWFyayBSZXBvcnRlcnMKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK3N0cnVjdCBDUFVJbmZvIHsKKyAgc3RydWN0IENhY2hlSW5mbyB7CisgICAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgICBpbnQgbGV2ZWw7CisgICAgaW50IHNpemU7CisgICAgaW50IG51bV9zaGFyaW5nOworICB9OworCisgIGludCBudW1fY3B1czsKKyAgZG91YmxlIGN5Y2xlc19wZXJfc2Vjb25kOworICBzdGQ6OnZlY3RvcjxDYWNoZUluZm8+IGNhY2hlczsKKyAgYm9vbCBzY2FsaW5nX2VuYWJsZWQ7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gbG9hZF9hdmc7CisKKyAgc3RhdGljIGNvbnN0IENQVUluZm8mIEdldCgpOworCisgcHJpdmF0ZToKKyAgQ1BVSW5mbygpOworICBCRU5DSE1BUktfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENQVUluZm8pOworfTsKKworLy8gQWRkaW5nIFN0cnVjdCBmb3IgU3lzdGVtIEluZm9ybWF0aW9uCitzdHJ1Y3QgU3lzdGVtSW5mbyB7CisgIHN0ZDo6c3RyaW5nIG5hbWU7CisgIHN0YXRpYyBjb25zdCBTeXN0ZW1JbmZvJiBHZXQoKTsKKworIHByaXZhdGU6CisgIFN5c3RlbUluZm8oKTsKKyAgQkVOQ0hNQVJLX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTeXN0ZW1JbmZvKTsKK307CisKKy8vIEJlbmNobWFya05hbWUgY29udGFpbnMgdGhlIGNvbXBvbmVudHMgb2YgdGhlIEJlbmNobWFyaydzIG5hbWUKKy8vIHdoaWNoIGFsbG93cyBpbmRpdmlkdWFsIGZpZWxkcyB0byBiZSBtb2RpZmllZCBvciBjbGVhcmVkIGJlZm9yZQorLy8gYnVpbGRpbmcgdGhlIGZpbmFsIG5hbWUgdXNpbmcgJ3N0cigpJy4KK3N0cnVjdCBCZW5jaG1hcmtOYW1lIHsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZTsKKyAgc3RkOjpzdHJpbmcgYXJnczsKKyAgc3RkOjpzdHJpbmcgbWluX3RpbWU7CisgIHN0ZDo6c3RyaW5nIGl0ZXJhdGlvbnM7CisgIHN0ZDo6c3RyaW5nIHJlcGV0aXRpb25zOworICBzdGQ6OnN0cmluZyB0aW1lX3R5cGU7CisgIHN0ZDo6c3RyaW5nIHRocmVhZHM7CisKKyAgLy8gUmV0dXJuIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGJlbmNobWFyayB3aXRoIGVhY2ggbm9uLWVtcHR5CisgIC8vIGZpZWxkIHNlcGFyYXRlZCBieSBhICcvJworICBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdDsKK307CisKKy8vIEludGVyZmFjZSBmb3IgY3VzdG9tIGJlbmNobWFyayByZXN1bHQgcHJpbnRlcnMuCisvLyBCeSBkZWZhdWx0LCBiZW5jaG1hcmsgcmVwb3J0cyBhcmUgcHJpbnRlZCB0byBzdGRvdXQuIEhvd2V2ZXIgYW4gYXBwbGljYXRpb24KKy8vIGNhbiBjb250cm9sIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVwb3J0cyBieSBjYWxsaW5nCisvLyBSdW5TcGVjaWZpZWRCZW5jaG1hcmtzIGFuZCBwYXNzaW5nIGl0IGEgY3VzdG9tIHJlcG9ydGVyIG9iamVjdC4KKy8vIFRoZSByZXBvcnRlciBvYmplY3QgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UuCitjbGFzcyBCZW5jaG1hcmtSZXBvcnRlciB7CisgcHVibGljOgorICBzdHJ1Y3QgQ29udGV4dCB7CisgICAgQ1BVSW5mbyBjb25zdCYgY3B1X2luZm87CisgICAgU3lzdGVtSW5mbyBjb25zdCYgc3lzX2luZm87CisgICAgLy8gVGhlIG51bWJlciBvZiBjaGFycyBpbiB0aGUgbG9uZ2VzdCBiZW5jaG1hcmsgbmFtZS4KKyAgICBzaXplX3QgbmFtZV9maWVsZF93aWR0aDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZXhlY3V0YWJsZV9uYW1lOworICAgIENvbnRleHQoKTsKKyAgfTsKKworICBzdHJ1Y3QgUnVuIHsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBub19yZXBldGl0aW9uX2luZGV4ID0gLTE7CisgICAgZW51bSBSdW5UeXBlIHsgUlRfSXRlcmF0aW9uLCBSVF9BZ2dyZWdhdGUgfTsKKworICAgIFJ1bigpCisgICAgICAgIDogcnVuX3R5cGUoUlRfSXRlcmF0aW9uKSwKKyAgICAgICAgICBlcnJvcl9vY2N1cnJlZChmYWxzZSksCisgICAgICAgICAgaXRlcmF0aW9ucygxKSwKKyAgICAgICAgICB0aHJlYWRzKDEpLAorICAgICAgICAgIHRpbWVfdW5pdChrTmFub3NlY29uZCksCisgICAgICAgICAgcmVhbF9hY2N1bXVsYXRlZF90aW1lKDApLAorICAgICAgICAgIGNwdV9hY2N1bXVsYXRlZF90aW1lKDApLAorICAgICAgICAgIG1heF9oZWFwYnl0ZXNfdXNlZCgwKSwKKyAgICAgICAgICBjb21wbGV4aXR5KG9Ob25lKSwKKyAgICAgICAgICBjb21wbGV4aXR5X2xhbWJkYSgpLAorICAgICAgICAgIGNvbXBsZXhpdHlfbigwKSwKKyAgICAgICAgICByZXBvcnRfYmlnX28oZmFsc2UpLAorICAgICAgICAgIHJlcG9ydF9ybXMoZmFsc2UpLAorICAgICAgICAgIGNvdW50ZXJzKCksCisgICAgICAgICAgaGFzX21lbW9yeV9yZXN1bHQoZmFsc2UpLAorICAgICAgICAgIGFsbG9jc19wZXJfaXRlcigwLjApLAorICAgICAgICAgIG1heF9ieXRlc191c2VkKDApIHt9CisKKyAgICBzdGQ6OnN0cmluZyBiZW5jaG1hcmtfbmFtZSgpIGNvbnN0OworICAgIEJlbmNobWFya05hbWUgcnVuX25hbWU7CisgICAgUnVuVHlwZSBydW5fdHlwZTsKKyAgICBzdGQ6OnN0cmluZyBhZ2dyZWdhdGVfbmFtZTsKKyAgICBzdGQ6OnN0cmluZyByZXBvcnRfbGFiZWw7ICAvLyBFbXB0eSBpZiBub3Qgc2V0IGJ5IGJlbmNobWFyay4KKyAgICBib29sIGVycm9yX29jY3VycmVkOworICAgIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2U7CisKKyAgICBJdGVyYXRpb25Db3VudCBpdGVyYXRpb25zOworICAgIGludDY0X3QgdGhyZWFkczsKKyAgICBpbnQ2NF90IHJlcGV0aXRpb25faW5kZXg7CisgICAgaW50NjRfdCByZXBldGl0aW9uczsKKyAgICBUaW1lVW5pdCB0aW1lX3VuaXQ7CisgICAgZG91YmxlIHJlYWxfYWNjdW11bGF0ZWRfdGltZTsKKyAgICBkb3VibGUgY3B1X2FjY3VtdWxhdGVkX3RpbWU7CisKKyAgICAvLyBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHJlYWwgdGltZSBwZXIgaXRlcmF0aW9uIGluIHRoZSB1bml0CisgICAgLy8gc3BlY2lmaWVkIGJ5ICd0aW1lX3VuaXQnLgorICAgIC8vIE5PVEU6IElmICdpdGVyYXRpb25zJyBpcyB6ZXJvIHRoZSByZXR1cm5lZCB2YWx1ZSByZXByZXNlbnRzIHRoZQorICAgIC8vIGFjY3VtdWxhdGVkIHRpbWUuCisgICAgZG91YmxlIEdldEFkanVzdGVkUmVhbFRpbWUoKSBjb25zdDsKKworICAgIC8vIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgY3B1IHRpbWUgcGVyIGl0ZXJhdGlvbiBpbiB0aGUgdW5pdAorICAgIC8vIHNwZWNpZmllZCBieSAndGltZV91bml0Jy4KKyAgICAvLyBOT1RFOiBJZiAnaXRlcmF0aW9ucycgaXMgemVybyB0aGUgcmV0dXJuZWQgdmFsdWUgcmVwcmVzZW50cyB0aGUKKyAgICAvLyBhY2N1bXVsYXRlZCB0aW1lLgorICAgIGRvdWJsZSBHZXRBZGp1c3RlZENQVVRpbWUoKSBjb25zdDsKKworICAgIC8vIFRoaXMgaXMgc2V0IHRvIDAuMCBpZiBtZW1vcnkgdHJhY2luZyBpcyBub3QgZW5hYmxlZC4KKyAgICBkb3VibGUgbWF4X2hlYXBieXRlc191c2VkOworCisgICAgLy8gS2VlcCB0cmFjayBvZiBhcmd1bWVudHMgdG8gY29tcHV0ZSBhc3ltcHRvdGljIGNvbXBsZXhpdHkKKyAgICBCaWdPIGNvbXBsZXhpdHk7CisgICAgQmlnT0Z1bmMqIGNvbXBsZXhpdHlfbGFtYmRhOworICAgIGludDY0X3QgY29tcGxleGl0eV9uOworCisgICAgLy8gd2hhdCBzdGF0aXN0aWNzIHRvIGNvbXB1dGUgZnJvbSB0aGUgbWVhc3VyZW1lbnRzCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OlN0YXRpc3RpY3M+KiBzdGF0aXN0aWNzOworCisgICAgLy8gSW5mb3JtIHByaW50IGZ1bmN0aW9uIHdoZXRoZXIgdGhlIGN1cnJlbnQgcnVuIGlzIGEgY29tcGxleGl0eSByZXBvcnQKKyAgICBib29sIHJlcG9ydF9iaWdfbzsKKyAgICBib29sIHJlcG9ydF9ybXM7CisKKyAgICBVc2VyQ291bnRlcnMgY291bnRlcnM7CisKKyAgICAvLyBNZW1vcnkgbWV0cmljcy4KKyAgICBib29sIGhhc19tZW1vcnlfcmVzdWx0OworICAgIGRvdWJsZSBhbGxvY3NfcGVyX2l0ZXI7CisgICAgaW50NjRfdCBtYXhfYnl0ZXNfdXNlZDsKKyAgfTsKKworICAvLyBDb25zdHJ1Y3QgYSBCZW5jaG1hcmtSZXBvcnRlciB3aXRoIHRoZSBvdXRwdXQgc3RyZWFtIHNldCB0byAnc3RkOjpjb3V0JworICAvLyBhbmQgdGhlIGVycm9yIHN0cmVhbSBzZXQgdG8gJ3N0ZDo6Y2VycicKKyAgQmVuY2htYXJrUmVwb3J0ZXIoKTsKKworICAvLyBDYWxsZWQgb25jZSBmb3IgZXZlcnkgc3VpdGUgb2YgYmVuY2htYXJrcyBydW4uCisgIC8vIFRoZSBwYXJhbWV0ZXIgImNvbnRleHQiIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgdGhlCisgIC8vIHJlcG9ydGVyIG1heSB3aXNoIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgaXRzIHJlcG9ydCwgZm9yIGV4YW1wbGUgdGhlCisgIC8vIHBsYXRmb3JtIHVuZGVyIHdoaWNoIHRoZSBiZW5jaG1hcmtzIGFyZSBydW5uaW5nLiBUaGUgYmVuY2htYXJrIHJ1biBpcworICAvLyBuZXZlciBzdGFydGVkIGlmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgYWxsb3dpbmcgdGhlIHJlcG9ydGVyCisgIC8vIHRvIHNraXAgcnVucyBiYXNlZCBvbiB0aGUgY29udGV4dCBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCBib29sIFJlcG9ydENvbnRleHQoY29uc3QgQ29udGV4dCYgY29udGV4dCkgPSAwOworCisgIC8vIENhbGxlZCBvbmNlIGZvciBlYWNoIGdyb3VwIG9mIGJlbmNobWFyayBydW5zLCBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dAorICAvLyBjcHUtdGltZSBhbmQgaGVhcCBtZW1vcnkgdXNhZ2UgZHVyaW5nIHRoZSBiZW5jaG1hcmsgcnVuLiBJZiB0aGUgZ3JvdXAKKyAgLy8gb2YgcnVucyBjb250YWluZWQgbW9yZSB0aGFuIHR3byBlbnRyaWVzIHRoZW4gJ3JlcG9ydCcgY29udGFpbnMgYWRkaXRpb25hbAorICAvLyBlbGVtZW50cyByZXByZXNlbnRpbmcgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aG9zZSBydW5zLgorICAvLyBBZGRpdGlvbmFsbHkgaWYgdGhpcyBncm91cCBvZiBydW5zIHdhcyB0aGUgbGFzdCBpbiBhIGZhbWlseSBvZiBiZW5jaG1hcmtzCisgIC8vICdyZXBvcnRzJyBjb250YWlucyBhZGRpdGlvbmFsIGVudHJpZXMgcmVwcmVzZW50aW5nIHRoZSBhc3ltcHRvdGljCisgIC8vIGNvbXBsZXhpdHkgYW5kIFJNUyBvZiB0aGF0IGJlbmNobWFyayBmYW1pbHkuCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRSdW5zKGNvbnN0IHN0ZDo6dmVjdG9yPFJ1bj4mIHJlcG9ydCkgPSAwOworCisgIC8vIENhbGxlZCBvbmNlIGFuZCBvbmx5IG9uY2UgYWZ0ZXIgZXZlciBncm91cCBvZiBiZW5jaG1hcmtzIGlzIHJ1biBhbmQKKyAgLy8gcmVwb3J0ZWQuCisgIHZpcnR1YWwgdm9pZCBGaW5hbGl6ZSgpIHt9CisKKyAgLy8gUkVRVUlSRVM6IFRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSAnb3V0JyBpcyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lCisgIC8vIG9mIHRoZSByZXBvcnRlci4KKyAgdm9pZCBTZXRPdXRwdXRTdHJlYW0oc3RkOjpvc3RyZWFtKiBvdXQpIHsKKyAgICBhc3NlcnQob3V0KTsKKyAgICBvdXRwdXRfc3RyZWFtXyA9IG91dDsKKyAgfQorCisgIC8vIFJFUVVJUkVTOiBUaGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgJ2VycicgaXMgdmFsaWQgZm9yIHRoZSBsaWZldGltZQorICAvLyBvZiB0aGUgcmVwb3J0ZXIuCisgIHZvaWQgU2V0RXJyb3JTdHJlYW0oc3RkOjpvc3RyZWFtKiBlcnIpIHsKKyAgICBhc3NlcnQoZXJyKTsKKyAgICBlcnJvcl9zdHJlYW1fID0gZXJyOworICB9CisKKyAgc3RkOjpvc3RyZWFtJiBHZXRPdXRwdXRTdHJlYW0oKSBjb25zdCB7IHJldHVybiAqb3V0cHV0X3N0cmVhbV87IH0KKworICBzdGQ6Om9zdHJlYW0mIEdldEVycm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gKmVycm9yX3N0cmVhbV87IH0KKworICB2aXJ0dWFsIH5CZW5jaG1hcmtSZXBvcnRlcigpOworCisgIC8vIFdyaXRlIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHRvICdvdXQnIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkCisgIC8vICdjb250ZXh0Jy4KKyAgLy8gUkVRVUlSRVM6ICdvdXQnIGlzIG5vbi1udWxsLgorICBzdGF0aWMgdm9pZCBQcmludEJhc2ljQ29udGV4dChzdGQ6Om9zdHJlYW0qIG91dCwgQ29udGV4dCBjb25zdCYgY29udGV4dCk7CisKKyBwcml2YXRlOgorICBzdGQ6Om9zdHJlYW0qIG91dHB1dF9zdHJlYW1fOworICBzdGQ6Om9zdHJlYW0qIGVycm9yX3N0cmVhbV87Cit9OworCisvLyBTaW1wbGUgcmVwb3J0ZXIgdGhhdCBvdXRwdXRzIGJlbmNobWFyayBkYXRhIHRvIHRoZSBjb25zb2xlLiBUaGlzIGlzIHRoZQorLy8gZGVmYXVsdCByZXBvcnRlciB1c2VkIGJ5IFJ1blNwZWNpZmllZEJlbmNobWFya3MoKS4KK2NsYXNzIENvbnNvbGVSZXBvcnRlciA6IHB1YmxpYyBCZW5jaG1hcmtSZXBvcnRlciB7CisgcHVibGljOgorICBlbnVtIE91dHB1dE9wdGlvbnMgeworICAgIE9PX05vbmUgPSAwLAorICAgIE9PX0NvbG9yID0gMSwKKyAgICBPT19UYWJ1bGFyID0gMiwKKyAgICBPT19Db2xvclRhYnVsYXIgPSBPT19Db2xvciB8IE9PX1RhYnVsYXIsCisgICAgT09fRGVmYXVsdHMgPSBPT19Db2xvclRhYnVsYXIKKyAgfTsKKyAgZXhwbGljaXQgQ29uc29sZVJlcG9ydGVyKE91dHB1dE9wdGlvbnMgb3B0c18gPSBPT19EZWZhdWx0cykKKyAgICAgIDogb3V0cHV0X29wdGlvbnNfKG9wdHNfKSwKKyAgICAgICAgbmFtZV9maWVsZF93aWR0aF8oMCksCisgICAgICAgIHByZXZfY291bnRlcnNfKCksCisgICAgICAgIHByaW50ZWRfaGVhZGVyXyhmYWxzZSkge30KKworICB2aXJ0dWFsIGJvb2wgUmVwb3J0Q29udGV4dChjb25zdCBDb250ZXh0JiBjb250ZXh0KTsKKyAgdmlydHVhbCB2b2lkIFJlcG9ydFJ1bnMoY29uc3Qgc3RkOjp2ZWN0b3I8UnVuPiYgcmVwb3J0cyk7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBQcmludFJ1bkRhdGEoY29uc3QgUnVuJiByZXBvcnQpOworICB2aXJ0dWFsIHZvaWQgUHJpbnRIZWFkZXIoY29uc3QgUnVuJiByZXBvcnQpOworCisgIE91dHB1dE9wdGlvbnMgb3V0cHV0X29wdGlvbnNfOworICBzaXplX3QgbmFtZV9maWVsZF93aWR0aF87CisgIFVzZXJDb3VudGVycyBwcmV2X2NvdW50ZXJzXzsKKyAgYm9vbCBwcmludGVkX2hlYWRlcl87Cit9OworCitjbGFzcyBKU09OUmVwb3J0ZXIgOiBwdWJsaWMgQmVuY2htYXJrUmVwb3J0ZXIgeworIHB1YmxpYzoKKyAgSlNPTlJlcG9ydGVyKCkgOiBmaXJzdF9yZXBvcnRfKHRydWUpIHt9CisgIHZpcnR1YWwgYm9vbCBSZXBvcnRDb250ZXh0KGNvbnN0IENvbnRleHQmIGNvbnRleHQpOworICB2aXJ0dWFsIHZvaWQgUmVwb3J0UnVucyhjb25zdCBzdGQ6OnZlY3RvcjxSdW4+JiByZXBvcnRzKTsKKyAgdmlydHVhbCB2b2lkIEZpbmFsaXplKCk7CisKKyBwcml2YXRlOgorICB2b2lkIFByaW50UnVuRGF0YShjb25zdCBSdW4mIHJlcG9ydCk7CisKKyAgYm9vbCBmaXJzdF9yZXBvcnRfOworfTsKKworY2xhc3MgQkVOQ0hNQVJLX0RFUFJFQ0FURURfTVNHKAorICAgICJUaGUgQ1NWIFJlcG9ydGVyIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlIikgQ1NWUmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBCZW5jaG1hcmtSZXBvcnRlciB7CisgcHVibGljOgorICBDU1ZSZXBvcnRlcigpIDogcHJpbnRlZF9oZWFkZXJfKGZhbHNlKSB7fQorICB2aXJ0dWFsIGJvb2wgUmVwb3J0Q29udGV4dChjb25zdCBDb250ZXh0JiBjb250ZXh0KTsKKyAgdmlydHVhbCB2b2lkIFJlcG9ydFJ1bnMoY29uc3Qgc3RkOjp2ZWN0b3I8UnVuPiYgcmVwb3J0cyk7CisKKyBwcml2YXRlOgorICB2b2lkIFByaW50UnVuRGF0YShjb25zdCBSdW4mIHJlcG9ydCk7CisKKyAgYm9vbCBwcmludGVkX2hlYWRlcl87CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB1c2VyX2NvdW50ZXJfbmFtZXNfOworfTsKKworLy8gSWYgYSBNZW1vcnlNYW5hZ2VyIGlzIHJlZ2lzdGVyZWQsIGl0IGNhbiBiZSB1c2VkIHRvIGNvbGxlY3QgYW5kIHJlcG9ydAorLy8gYWxsb2NhdGlvbiBtZXRyaWNzIGZvciBhIHJ1biBvZiB0aGUgYmVuY2htYXJrLgorY2xhc3MgTWVtb3J5TWFuYWdlciB7CisgcHVibGljOgorICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICBSZXN1bHQoKSA6IG51bV9hbGxvY3MoMCksIG1heF9ieXRlc191c2VkKDApIHt9CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zIG1hZGUgaW4gdG90YWwgYmV0d2VlbiBTdGFydCBhbmQgU3RvcC4KKyAgICBpbnQ2NF90IG51bV9hbGxvY3M7CisKKyAgICAvLyBUaGUgcGVhayBtZW1vcnkgdXNlIGJldHdlZW4gU3RhcnQgYW5kIFN0b3AuCisgICAgaW50NjRfdCBtYXhfYnl0ZXNfdXNlZDsKKyAgfTsKKworICB2aXJ0dWFsIH5NZW1vcnlNYW5hZ2VyKCkge30KKworICAvLyBJbXBsZW1lbnQgdGhpcyB0byBzdGFydCByZWNvcmRpbmcgYWxsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCB2b2lkIFN0YXJ0KCkgPSAwOworCisgIC8vIEltcGxlbWVudCB0aGlzIHRvIHN0b3AgcmVjb3JkaW5nIGFuZCBmaWxsIG91dCB0aGUgZ2l2ZW4gUmVzdWx0IHN0cnVjdHVyZS4KKyAgdmlydHVhbCB2b2lkIFN0b3AoUmVzdWx0KiByZXN1bHQpID0gMDsKK307CisKK2lubGluZSBjb25zdCBjaGFyKiBHZXRUaW1lVW5pdFN0cmluZyhUaW1lVW5pdCB1bml0KSB7CisgIHN3aXRjaCAodW5pdCkgeworICAgIGNhc2Uga01pbGxpc2Vjb25kOgorICAgICAgcmV0dXJuICJtcyI7CisgICAgY2FzZSBrTWljcm9zZWNvbmQ6CisgICAgICByZXR1cm4gInVzIjsKKyAgICBjYXNlIGtOYW5vc2Vjb25kOgorICAgICAgcmV0dXJuICJucyI7CisgIH0KKyAgQkVOQ0hNQVJLX1VOUkVBQ0hBQkxFKCk7Cit9CisKK2lubGluZSBkb3VibGUgR2V0VGltZVVuaXRNdWx0aXBsaWVyKFRpbWVVbml0IHVuaXQpIHsKKyAgc3dpdGNoICh1bml0KSB7CisgICAgY2FzZSBrTWlsbGlzZWNvbmQ6CisgICAgICByZXR1cm4gMWUzOworICAgIGNhc2Uga01pY3Jvc2Vjb25kOgorICAgICAgcmV0dXJuIDFlNjsKKyAgICBjYXNlIGtOYW5vc2Vjb25kOgorICAgICAgcmV0dXJuIDFlOTsKKyAgfQorICBCRU5DSE1BUktfVU5SRUFDSEFCTEUoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19CRU5DSE1BUktfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL21pbmd3LnB5IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvbWluZ3cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjZjRiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL21pbmd3LnB5CkBAIC0wLDAgKzEsMzIwIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGVuY29kaW5nOiB1dGYtOAorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBlcnJubworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdGVtcGZpbGUKKwordHJ5OgorICAgIGltcG9ydCB3aW5yZWcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgX3dpbnJlZyBhcyB3aW5yZWcKK3RyeToKKyAgICBpbXBvcnQgdXJsbGliLnJlcXVlc3QgYXMgcmVxdWVzdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCB1cmxsaWIgYXMgcmVxdWVzdAordHJ5OgorICAgIGltcG9ydCB1cmxsaWIucGFyc2UgYXMgcGFyc2UKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgdXJscGFyc2UgYXMgcGFyc2UKKworY2xhc3MgRW1wdHlMb2dnZXIob2JqZWN0KToKKyAgICAnJycKKyAgICBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHBlcmZvcm1zIG5vIGxvZ2dpbmcKKyAgICAnJycKKyAgICBkZWYgZGVidWcoc2VsZiwgKmssICoqa3cpOgorICAgICAgICBwYXNzCisgICAgZGVmIGluZm8oc2VsZiwgKmssICoqa3cpOgorICAgICAgICBwYXNzCisgICAgZGVmIHdhcm4oc2VsZiwgKmssICoqa3cpOgorICAgICAgICBwYXNzCisgICAgZGVmIGVycm9yKHNlbGYsICprLCAqKmt3KToKKyAgICAgICAgcGFzcworICAgIGRlZiBjcml0aWNhbChzZWxmLCAqaywgKiprdyk6CisgICAgICAgIHBhc3MKKyAgICBkZWYgc2V0TGV2ZWwoc2VsZiwgKmssICoqa3cpOgorICAgICAgICBwYXNzCisKK3VybHMgPSAoCisgICAgJ2h0dHA6Ly9kb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvbWluZ3ctdzY0L1Rvb2xjaGFpbnMlMjAnCisgICAgICAgICd0YXJnZXR0aW5nJTIwV2luMzIvUGVyc29uYWwlMjBCdWlsZHMvbWluZ3ctYnVpbGRzL2luc3RhbGxlci8nCisgICAgICAgICdyZXBvc2l0b3J5LnR4dCcsCisgICAgJ2h0dHA6Ly9kb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvbWluZ3didWlsZHMvaG9zdC13aW5kb3dzLycKKyAgICAgICAgJ3JlcG9zaXRvcnkudHh0JworKQorJycnCitBIGxpc3Qgb2YgbWluZ3ctYnVpbGQgcmVwb3NpdG9yaWVzCisnJycKKworZGVmIHJlcG9zaXRvcnkodXJscyA9IHVybHMsIGxvZyA9IEVtcHR5TG9nZ2VyKCkpOgorICAgICcnJworICAgIERvd25sb2FkcyBhbmQgcGFyc2UgbWluZ3ctYnVpbGQgcmVwb3NpdG9yeSBmaWxlcyBhbmQgcGFyc2VzIHRoZW0KKyAgICAnJycKKyAgICBsb2cuaW5mbygnZ2V0dGluZyBtaW5ndy1idWlsZHMgcmVwb3NpdG9yeScpCisgICAgdmVyc2lvbnMgPSB7fQorICAgIHJlX3NvdXJjZWZvcmdlID0gcmUuY29tcGlsZShyJ2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvKFteL10rKS9maWxlcycpCisgICAgcmVfc3ViID0gcidodHRwOi8vZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L1wxJworICAgIGZvciB1cmwgaW4gdXJsczoKKyAgICAgICAgbG9nLmRlYnVnKCcgLSByZXF1ZXN0aW5nOiAlcycsIHVybCkKKyAgICAgICAgc29ja2V0ID0gcmVxdWVzdC51cmxvcGVuKHVybCkKKyAgICAgICAgcmVwbyA9IHNvY2tldC5yZWFkKCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocmVwbywgc3RyKToKKyAgICAgICAgICAgIHJlcG8gPSByZXBvLmRlY29kZSgpOworICAgICAgICBzb2NrZXQuY2xvc2UoKQorICAgICAgICBmb3IgZW50cnkgaW4gcmVwby5zcGxpdCgnXG4nKVs6LTFdOgorICAgICAgICAgICAgdmFsdWUgPSBlbnRyeS5zcGxpdCgnfCcpCisgICAgICAgICAgICB2ZXJzaW9uID0gdHVwbGUoW2ludChuKSBmb3IgbiBpbiB2YWx1ZVswXS5zdHJpcCgpLnNwbGl0KCcuJyldKQorICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25zLnNldGRlZmF1bHQodmVyc2lvbiwge30pCisgICAgICAgICAgICBhcmNoID0gdmFsdWVbMV0uc3RyaXAoKQorICAgICAgICAgICAgaWYgYXJjaCA9PSAneDMyJzoKKyAgICAgICAgICAgICAgICBhcmNoID0gJ2k2ODYnCisgICAgICAgICAgICBlbGlmIGFyY2ggPT0gJ3g2NCc6CisgICAgICAgICAgICAgICAgYXJjaCA9ICd4ODZfNjQnCisgICAgICAgICAgICBhcmNoID0gdmVyc2lvbi5zZXRkZWZhdWx0KGFyY2gsIHt9KQorICAgICAgICAgICAgdGhyZWFkaW5nID0gYXJjaC5zZXRkZWZhdWx0KHZhbHVlWzJdLnN0cmlwKCksIHt9KQorICAgICAgICAgICAgZXhjZXB0aW9ucyA9IHRocmVhZGluZy5zZXRkZWZhdWx0KHZhbHVlWzNdLnN0cmlwKCksIHt9KQorICAgICAgICAgICAgcmV2aXNpb24gPSBleGNlcHRpb25zLnNldGRlZmF1bHQoaW50KHZhbHVlWzRdLnN0cmlwKClbMzpdKSwKKyAgICAgICAgICAgICAgICByZV9zb3VyY2Vmb3JnZS5zdWIocmVfc3ViLCB2YWx1ZVs1XS5zdHJpcCgpKSkKKyAgICByZXR1cm4gdmVyc2lvbnMKKworZGVmIGZpbmRfaW5fcGF0aChmaWxlLCBwYXRoPU5vbmUpOgorICAgICcnJworICAgIEF0dGVtcHRzIHRvIGZpbmQgYW4gZXhlY3V0YWJsZSBpbiB0aGUgcGF0aAorICAgICcnJworICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgZmlsZSArPSAnLmV4ZScKKyAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgIHBhdGggPSBvcy5lbnZpcm9uLmdldCgnUEFUSCcsICcnKQorICAgIGlmIHR5cGUocGF0aCkgaXMgdHlwZSgnJyk6CisgICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KG9zLnBhdGhzZXApCisgICAgcmV0dXJuIGxpc3QoZmlsdGVyKG9zLnBhdGguZXhpc3RzLAorICAgICAgICBtYXAobGFtYmRhIGRpciwgZmlsZT1maWxlOiBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlKSwgcGF0aCkpKQorCitkZWYgZmluZF83emlwKGxvZyA9IEVtcHR5TG9nZ2VyKCkpOgorICAgICcnJworICAgIEF0dGVtcHRzIHRvIGZpbmQgN3ppcCBmb3IgdW5wYWNraW5nIHRoZSBtaW5ndy1idWlsZCBhcmNoaXZlcworICAgICcnJworICAgIGxvZy5pbmZvKCdmaW5kaW5nIDd6aXAnKQorICAgIHBhdGggPSBmaW5kX2luX3BhdGgoJzd6JykKKyAgICBpZiBub3QgcGF0aDoKKyAgICAgICAga2V5ID0gd2lucmVnLk9wZW5LZXkod2lucmVnLkhLRVlfTE9DQUxfTUFDSElORSwgcidTT0ZUV0FSRVw3LVppcCcpCisgICAgICAgIHBhdGgsIF8gPSB3aW5yZWcuUXVlcnlWYWx1ZUV4KGtleSwgJ1BhdGgnKQorICAgICAgICBwYXRoID0gW29zLnBhdGguam9pbihwYXRoLCAnN3ouZXhlJyldCisgICAgbG9nLmRlYnVnKCdmb3VuZCBcJyVzXCcnLCBwYXRoWzBdKQorICAgIHJldHVybiBwYXRoWzBdCisKK2ZpbmRfN3ppcCgpCisKK2RlZiB1bnBhY2soYXJjaGl2ZSwgbG9jYXRpb24sIGxvZyA9IEVtcHR5TG9nZ2VyKCkpOgorICAgICcnJworICAgIFVucGFja3MgYSBtaW5ndy1idWlsZHMgYXJjaGl2ZQorICAgICcnJworICAgIHNldmVuemlwID0gZmluZF83emlwKGxvZykKKyAgICBsb2cuaW5mbygndW5wYWNraW5nICVzJywgb3MucGF0aC5iYXNlbmFtZShhcmNoaXZlKSkKKyAgICBjbWQgPSBbc2V2ZW56aXAsICd4JywgYXJjaGl2ZSwgJy1vJyArIGxvY2F0aW9uLCAnLXknXQorICAgIGxvZy5kZWJ1ZygnIC0gJXInLCBjbWQpCisgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICd3JykgYXMgZGV2bnVsbDoKKyAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKGNtZCwgc3Rkb3V0ID0gZGV2bnVsbCkKKworZGVmIGRvd25sb2FkKHVybCwgbG9jYXRpb24sIGxvZyA9IEVtcHR5TG9nZ2VyKCkpOgorICAgICcnJworICAgIERvd25sb2FkcyBhbmQgdW5wYWNrcyBhIG1pbmd3LWJ1aWxkcyBhcmNoaXZlCisgICAgJycnCisgICAgbG9nLmluZm8oJ2Rvd25sb2FkaW5nIE1pbkdXJykKKyAgICBsb2cuZGVidWcoJyAtIHVybDogJXMnLCB1cmwpCisgICAgbG9nLmRlYnVnKCcgLSBsb2NhdGlvbjogJXMnLCBsb2NhdGlvbikKKworICAgIHJlX2NvbnRlbnQgPSByZS5jb21waWxlKHInYXR0YWNobWVudDtbIFx0XSpmaWxlbmFtZT0oIik/KFteIl0qKSgiKT9bXHJcbl0qJykKKworICAgIHN0cmVhbSA9IHJlcXVlc3QudXJsb3Blbih1cmwpCisgICAgdHJ5OgorICAgICAgICBjb250ZW50ID0gc3RyZWFtLmdldGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicpIG9yICcnCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBjb250ZW50ID0gc3RyZWFtLmhlYWRlcnMuZ2V0aGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJykgb3IgJycKKyAgICBtYXRjaGVzID0gcmVfY29udGVudC5tYXRjaChjb250ZW50KQorICAgIGlmIG1hdGNoZXM6CisgICAgICAgIGZpbGVuYW1lID0gbWF0Y2hlcy5ncm91cCgyKQorICAgIGVsc2U6CisgICAgICAgIHBhcnNlZCA9IHBhcnNlLnVybHBhcnNlKHN0cmVhbS5nZXR1cmwoKSkKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhcnNlZC5wYXRoKQorCisgICAgdHJ5OgorICAgICAgICBvcy5tYWtlZGlycyhsb2NhdGlvbikKKyAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVCBhbmQgb3MucGF0aC5pc2Rpcihsb2NhdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZQorCisgICAgYXJjaGl2ZSA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgZmlsZW5hbWUpCisgICAgd2l0aCBvcGVuKGFyY2hpdmUsICd3YicpIGFzIG91dDoKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGJ1ZiA9IHN0cmVhbS5yZWFkKDEwMjQpCisgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvdXQud3JpdGUoYnVmKQorICAgIHVucGFjayhhcmNoaXZlLCBsb2NhdGlvbiwgbG9nID0gbG9nKQorICAgIG9zLnJlbW92ZShhcmNoaXZlKQorCisgICAgcG9zc2libGUgPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sICdtaW5ndzY0JykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocG9zc2libGUpOgorICAgICAgICBwb3NzaWJsZSA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgJ21pbmd3MzInKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocG9zc2libGUpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRmFpbGVkIHRvIGZpbmQgdW5wYWNrZWQgTWluR1c6ICcgKyBwb3NzaWJsZSkKKyAgICByZXR1cm4gcG9zc2libGUKKworZGVmIHJvb3QobG9jYXRpb24gPSBOb25lLCBhcmNoID0gTm9uZSwgdmVyc2lvbiA9IE5vbmUsIHRocmVhZGluZyA9IE5vbmUsCisgICAgICAgIGV4Y2VwdGlvbnMgPSBOb25lLCByZXZpc2lvbiA9IE5vbmUsIGxvZyA9IEVtcHR5TG9nZ2VyKCkpOgorICAgICcnJworICAgIFJldHVybnMgdGhlIHJvb3QgZm9sZGVyIG9mIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgbWluZ3ctYnVpbGRzIHZhcmlhbnQKKyAgICBvZiBnY2MuIFdpbGwgZG93bmxvYWQgdGhlIGNvbXBpbGVyIGlmIG5lZWRlZAorICAgICcnJworCisgICAgIyBHZXQgdGhlIHJlcG9zaXRvcnkgaWYgd2UgZG9uJ3QgaGF2ZSBhbGwgdGhlIGluZm9ybWF0aW9uCisgICAgaWYgbm90IChhcmNoIGFuZCB2ZXJzaW9uIGFuZCB0aHJlYWRpbmcgYW5kIGV4Y2VwdGlvbnMgYW5kIHJldmlzaW9uKToKKyAgICAgICAgdmVyc2lvbnMgPSByZXBvc2l0b3J5KGxvZyA9IGxvZykKKworICAgICMgRGV0ZXJtaW5lIHNvbWUgZGVmYXVsdHMKKyAgICB2ZXJzaW9uID0gdmVyc2lvbiBvciBtYXgodmVyc2lvbnMua2V5cygpKQorICAgIGlmIG5vdCBhcmNoOgorICAgICAgICBhcmNoID0gcGxhdGZvcm0ubWFjaGluZSgpLmxvd2VyKCkKKyAgICAgICAgaWYgYXJjaCA9PSAneDg2JzoKKyAgICAgICAgICAgIGFyY2ggPSAnaTY4NicKKyAgICAgICAgZWxpZiBhcmNoID09ICdhbWQ2NCc6CisgICAgICAgICAgICBhcmNoID0gJ3g4Nl82NCcKKyAgICBpZiBub3QgdGhyZWFkaW5nOgorICAgICAgICBrZXlzID0gdmVyc2lvbnNbdmVyc2lvbl1bYXJjaF0ua2V5cygpCisgICAgICAgIGlmICdwb3NpeCcgaW4ga2V5czoKKyAgICAgICAgICAgIHRocmVhZGluZyA9ICdwb3NpeCcKKyAgICAgICAgZWxpZiAnd2luMzInIGluIGtleXM6CisgICAgICAgICAgICB0aHJlYWRpbmcgPSAnd2luMzInCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aHJlYWRpbmcgPSBrZXlzWzBdCisgICAgaWYgbm90IGV4Y2VwdGlvbnM6CisgICAgICAgIGtleXMgPSB2ZXJzaW9uc1t2ZXJzaW9uXVthcmNoXVt0aHJlYWRpbmddLmtleXMoKQorICAgICAgICBpZiAnc2VoJyBpbiBrZXlzOgorICAgICAgICAgICAgZXhjZXB0aW9ucyA9ICdzZWgnCisgICAgICAgIGVsaWYgJ3NqbGonIGluIGtleXM6CisgICAgICAgICAgICBleGNlcHRpb25zID0gJ3NqbGonCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGNlcHRpb25zID0ga2V5c1swXQorICAgIGlmIHJldmlzaW9uIGlzIE5vbmU6CisgICAgICAgIHJldmlzaW9uID0gbWF4KHZlcnNpb25zW3ZlcnNpb25dW2FyY2hdW3RocmVhZGluZ11bZXhjZXB0aW9uc10ua2V5cygpKQorICAgIGlmIG5vdCBsb2NhdGlvbjoKKyAgICAgICAgbG9jYXRpb24gPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCAnbWluZ3ctYnVpbGRzJykKKworICAgICMgR2V0IHRoZSBkb3dubG9hZCB1cmwKKyAgICB1cmwgPSB2ZXJzaW9uc1t2ZXJzaW9uXVthcmNoXVt0aHJlYWRpbmddW2V4Y2VwdGlvbnNdW3JldmlzaW9uXQorCisgICAgIyBUZWxsIHRoZSB1c2VyIHdoYXR6enVwCisgICAgbG9nLmluZm8oJ2ZpbmRpbmcgTWluR1cgJXMnLCAnLicuam9pbihzdHIodikgZm9yIHYgaW4gdmVyc2lvbikpCisgICAgbG9nLmRlYnVnKCcgLSBhcmNoOiAlcycsIGFyY2gpCisgICAgbG9nLmRlYnVnKCcgLSB0aHJlYWRpbmc6ICVzJywgdGhyZWFkaW5nKQorICAgIGxvZy5kZWJ1ZygnIC0gZXhjZXB0aW9uczogJXMnLCBleGNlcHRpb25zKQorICAgIGxvZy5kZWJ1ZygnIC0gcmV2aXNpb246ICVzJywgcmV2aXNpb24pCisgICAgbG9nLmRlYnVnKCcgLSB1cmw6ICVzJywgdXJsKQorCisgICAgIyBTdG9yZSBlYWNoIHNwZWNpZmljIHJldmlzaW9uIGRpZmZlcmVudGx5CisgICAgc2x1ZyA9ICd7dmVyc2lvbn0te2FyY2h9LXt0aHJlYWRpbmd9LXtleGNlcHRpb25zfS1yZXZ7cmV2aXNpb259JworICAgIHNsdWcgPSBzbHVnLmZvcm1hdCgKKyAgICAgICAgdmVyc2lvbiA9ICcuJy5qb2luKHN0cih2KSBmb3IgdiBpbiB2ZXJzaW9uKSwKKyAgICAgICAgYXJjaCA9IGFyY2gsCisgICAgICAgIHRocmVhZGluZyA9IHRocmVhZGluZywKKyAgICAgICAgZXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnMsCisgICAgICAgIHJldmlzaW9uID0gcmV2aXNpb24KKyAgICApCisgICAgaWYgYXJjaCA9PSAneDg2XzY0JzoKKyAgICAgICAgcm9vdF9kaXIgPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIHNsdWcsICdtaW5ndzY0JykKKyAgICBlbGlmIGFyY2ggPT0gJ2k2ODYnOgorICAgICAgICByb290X2RpciA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgc2x1ZywgJ21pbmd3MzInKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gTWluR1cgYXJjaDogJyArIGFyY2gpCisKKyAgICAjIERvd25sb2FkIGlmIG5lZWRlZAorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyb290X2Rpcik6CisgICAgICAgIGRvd25sb2FkZWQgPSBkb3dubG9hZCh1cmwsIG9zLnBhdGguam9pbihsb2NhdGlvbiwgc2x1ZyksIGxvZyA9IGxvZykKKyAgICAgICAgaWYgZG93bmxvYWRlZCAhPSByb290X2RpcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1RoZSBsb2NhdGlvbiBvZiBtaW5ndyBkaWQgbm90IG1hdGNoXG4lc1xuJXMnCisgICAgICAgICAgICAgICAgJSAoZG93bmxvYWRlZCwgcm9vdF9kaXIpKQorCisgICAgcmV0dXJuIHJvb3RfZGlyCisKK2RlZiBzdHIydmVyKHN0cmluZyk6CisgICAgJycnCisgICAgQ29udmVydHMgYSB2ZXJzaW9uIHN0cmluZyBpbnRvIGEgdHVwbGUKKyAgICAnJycKKyAgICB0cnk6CisgICAgICAgIHZlcnNpb24gPSB0dXBsZShpbnQodikgZm9yIHYgaW4gc3RyaW5nLnNwbGl0KCcuJykpCisgICAgICAgIGlmIGxlbih2ZXJzaW9uKSBpcyBub3QgMzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKKyAgICAgICAgICAgICdwbGVhc2UgcHJvdmlkZSBhIHRocmVlIGRpZ2l0IHZlcnNpb24gc3RyaW5nJykKKyAgICByZXR1cm4gdmVyc2lvbgorCitkZWYgbWFpbigpOgorICAgICcnJworICAgIEludm9rZWQgd2hlbiB0aGUgc2NyaXB0IGlzIHJ1biBkaXJlY3RseSBieSB0aGUgcHl0aG9uIGludGVycHJldGVyCisgICAgJycnCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICAgIGRlc2NyaXB0aW9uID0gJ0Rvd25sb2FkcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgTWluR1cnLAorICAgICAgICBmb3JtYXR0ZXJfY2xhc3MgPSBhcmdwYXJzZS5Bcmd1bWVudERlZmF1bHRzSGVscEZvcm1hdHRlcgorICAgICkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWxvY2F0aW9uJywKKyAgICAgICAgaGVscCA9ICd0aGUgbG9jYXRpb24gdG8gZG93bmxvYWQgdGhlIGNvbXBpbGVyIHRvJywKKyAgICAgICAgZGVmYXVsdCA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICdtaW5ndy1idWlsZHMnKSkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWFyY2gnLCByZXF1aXJlZCA9IFRydWUsIGNob2ljZXMgPSBbJ2k2ODYnLCAneDg2XzY0J10sCisgICAgICAgIGhlbHAgPSAndGhlIHRhcmdldCBNaW5HVyBhcmNoaXRlY3R1cmUgc3RyaW5nJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcnNpb24nLCB0eXBlID0gc3RyMnZlciwKKyAgICAgICAgaGVscCA9ICd0aGUgdmVyc2lvbiBvZiBHQ0MgdG8gZG93bmxvYWQnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdGhyZWFkaW5nJywgY2hvaWNlcyA9IFsncG9zaXgnLCAnd2luMzInXSwKKyAgICAgICAgaGVscCA9ICd0aGUgdGhyZWFkaW5nIHR5cGUgb2YgdGhlIGNvbXBpbGVyJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWV4Y2VwdGlvbnMnLCBjaG9pY2VzID0gWydzamxqJywgJ3NlaCcsICdkd2FyZiddLAorICAgICAgICBoZWxwID0gJ3RoZSBtZXRob2QgdG8gdGhyb3cgZXhjZXB0aW9ucycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1yZXZpc2lvbicsIHR5cGU9aW50LAorICAgICAgICBoZWxwID0gJ3RoZSByZXZpc2lvbiBvZiB0aGUgTWluR1cgcmVsZWFzZScpCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICBoZWxwPSdpbmNyZWFzZSB0aGUgc2NyaXB0IG91dHB1dCB2ZXJib3NpdHknKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgIGhlbHA9J29ubHkgcHJpbnQgZXJyb3JzIGFuZCB3YXJuaW5nJykKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgIyBDcmVhdGUgdGhlIGxvZ2dlcgorICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdtaW5ndycpCisgICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCisgICAgZm9ybWF0dGVyID0gbG9nZ2luZy5Gb3JtYXR0ZXIoJyUobWVzc2FnZSlzJykKKyAgICBoYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCisgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKKyAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIGlmIGFyZ3MucXVpZXQ6CisgICAgICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLldBUk4pCisgICAgaWYgYXJncy52ZXJib3NlOgorICAgICAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKKworICAgICMgR2V0IE1pbkdXCisgICAgcm9vdF9kaXIgPSByb290KGxvY2F0aW9uID0gYXJncy5sb2NhdGlvbiwgYXJjaCA9IGFyZ3MuYXJjaCwKKyAgICAgICAgdmVyc2lvbiA9IGFyZ3MudmVyc2lvbiwgdGhyZWFkaW5nID0gYXJncy50aHJlYWRpbmcsCisgICAgICAgIGV4Y2VwdGlvbnMgPSBhcmdzLmV4Y2VwdGlvbnMsIHJldmlzaW9uID0gYXJncy5yZXZpc2lvbiwKKyAgICAgICAgbG9nID0gbG9nZ2VyKQorCisgICAgc3lzLnN0ZG91dC53cml0ZSgnJXNcbicgJSBvcy5wYXRoLmpvaW4ocm9vdF9kaXIsICdiaW4nKSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0cnk6CisgICAgICAgIG1haW4oKQorICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ0lPIGVycm9yOiAlc1xuJyAlIGUpCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnT1MgZXJyb3I6ICVzXG4nICUgZSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQgYXMgZToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnS2lsbGVkXG4nKQorICAgICAgICBzeXMuZXhpdCgxKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvcmVsZWFzaW5nLm1kIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvcmVsZWFzaW5nLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2Q3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9yZWxlYXNpbmcubWQKQEAgLTAsMCArMSwxNiBAQAorIyBIb3cgdG8gcmVsZWFzZQorCisqIE1ha2Ugc3VyZSB5b3UncmUgb24gbWFzdGVyIGFuZCBzeW5jZWQgdG8gSEVBRAorKiBFbnN1cmUgdGhlIHByb2plY3QgYnVpbGRzIGFuZCB0ZXN0cyBydW4gKHNhbml0eSBjaGVjayBvbmx5LCBvYnZpb3VzbHkpCisgICAgKiBgcGFyYWxsZWwgLWowIGV4ZWMgOjo6IHRlc3QvKl90ZXN0YCBjYW4gaGVscCBlbnN1cmUgZXZlcnl0aGluZyBhdCBsZWFzdAorICAgICAgcGFzc2VzCisqIFByZXBhcmUgcmVsZWFzZSBub3RlcworICAgICogYGdpdCBsb2cgJChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9MCAtLXRhZ3MpLi5IRUFEYCBnaXZlcyB5b3UgdGhlIGxpc3Qgb2YKKyAgICAgIGNvbW1pdHMgYmV0d2VlbiB0aGUgbGFzdCBhbm5vdGF0ZWQgdGFnIGFuZCBIRUFECisgICAgKiBQaWNrIHRoZSBtb3N0IGludGVyZXN0aW5nLgorKiBDcmVhdGUgYSByZWxlYXNlIHRocm91Z2ggZ2l0aHViJ3MgaW50ZXJmYWNlCisgICAgKiBOb3RlIHRoaXMgd2lsbCBjcmVhdGUgYSBsaWdodHdlaWdodCB0YWcuCisgICAgKiBVcGRhdGUgdGhpcyB0byBhbiBhbm5vdGF0ZWQgdGFnOgorICAgICAgKiBgZ2l0IHB1bGwgLS10YWdzYAorICAgICAgKiBgZ2l0IHRhZyAtYSAtZiA8dGFnPiA8dGFnPmAKKyAgICAgICogYGdpdCBwdXNoIC0tZm9yY2Ugb3JpZ2luYApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjE0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMTIgQEAKKyMgQWxsb3cgdGhlIHNvdXJjZSBmaWxlcyB0byBmaW5kIGhlYWRlcnMgaW4gc3JjLworaW5jbHVkZShHTlVJbnN0YWxsRGlycykKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3NyYykKKworaWYgKERFRklORUQgQkVOQ0hNQVJLX0NYWF9MSU5LRVJfRkxBR1MpCisgIGxpc3QoQVBQRU5EIENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgJHtCRU5DSE1BUktfQ1hYX0xJTktFUl9GTEFHU30pCisgIGxpc3QoQVBQRU5EIENNQUtFX01PRFVMRV9MSU5LRVJfRkxBR1MgJHtCRU5DSE1BUktfQ1hYX0xJTktFUl9GTEFHU30pCitlbmRpZigpCisKK2ZpbGUoR0xPQgorICBTT1VSQ0VfRklMRVMKKyAgICAqLmNjCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2luY2x1ZGUvYmVuY2htYXJrLyouaAorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8qLmgpCitmaWxlKEdMT0IgQkVOQ0hNQVJLX01BSU4gImJlbmNobWFya19tYWluLmNjIikKK2ZvcmVhY2goaXRlbSAke0JFTkNITUFSS19NQUlOfSkKKyAgbGlzdChSRU1PVkVfSVRFTSBTT1VSQ0VfRklMRVMgIiR7aXRlbX0iKQorZW5kZm9yZWFjaCgpCisKK2FkZF9saWJyYXJ5KGJlbmNobWFyayAke1NPVVJDRV9GSUxFU30pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoYmVuY2htYXJrIFBST1BFUlRJRVMKKyAgT1VUUFVUX05BTUUgImJlbmNobWFyayIKKyAgVkVSU0lPTiAke0dFTkVSSUNfTElCX1ZFUlNJT059CisgIFNPVkVSU0lPTiAke0dFTkVSSUNfTElCX1NPVkVSU0lPTn0KKykKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKGJlbmNobWFyayBQVUJMSUMKKyAgICAkPEJVSUxEX0lOVEVSRkFDRToke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vaW5jbHVkZT4KKyAgICApCisKKyMgTGluayB0aHJlYWRzLgordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJlbmNobWFyayAgJHtCRU5DSE1BUktfQ1hYX0xJQlJBUklFU30gJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKK2ZpbmRfbGlicmFyeShMSUJSVCBydCkKK2lmKExJQlJUKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoYmVuY2htYXJrICR7TElCUlR9KQorZW5kaWYoKQorCitpZihDTUFLRV9CVUlMRF9UWVBFKQorICBzdHJpbmcoVE9VUFBFUiAke0NNQUtFX0JVSUxEX1RZUEV9IENNQUtFX0JVSUxEX1RZUEVfVVBQRVIpCitlbmRpZigpCitpZihOT1QgQ01BS0VfVEhSRUFEX0xJQlNfSU5JVCBBTkQgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke0NNQUtFX0NYWF9GTEFHU18ke0NNQUtFX0JVSUxEX1RZUEVfVVBQRVJ9fSIgTUFUQ0hFUyAiLiotZnNhbml0aXplPVteIF0qYWRkcmVzcy4qIikKKyAgbWVzc2FnZShXQVJOSU5HICJDTWFrZSdzIEZpbmRUaHJlYWRzLmNtYWtlIGRpZCBub3QgZmFpbCwgYnV0IENNQUtFX1RIUkVBRF9MSUJTX0lOSVQgZW5kZWQgdXAgYmVpbmcgZW1wdHkuIFRoaXMgd2FzIGZpeGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9LaXR3YXJlL0NNYWtlL2NvbW1pdC9kNTMzMTcxMzBlODQ4OThjNTMyOGMyMzcxODZkYmQ5OTVhYWYxYzEyIExldCdzIGd1ZXNzIHRoYXQgLXB0aHJlYWQgaXMgc3VmZmljaWVudC4iKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoYmVuY2htYXJrIC1wdGhyZWFkKQorZW5kaWYoKQorCisjIFdlIG5lZWQgZXh0cmEgbGlicmFyaWVzIG9uIFdpbmRvd3MKK2lmKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIldpbmRvd3MiKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoYmVuY2htYXJrIHNobHdhcGkpCitlbmRpZigpCisKKyMgV2UgbmVlZCBleHRyYSBsaWJyYXJpZXMgb24gU29sYXJpcworaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiU3VuT1MiKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoYmVuY2htYXJrIGtzdGF0KQorZW5kaWYoKQorCisjIEJlbmNobWFyayBtYWluIGxpYnJhcnkKK2FkZF9saWJyYXJ5KGJlbmNobWFya19tYWluICJiZW5jaG1hcmtfbWFpbi5jYyIpCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoYmVuY2htYXJrX21haW4gUFJPUEVSVElFUworICBPVVRQVVRfTkFNRSAiYmVuY2htYXJrX21haW4iCisgIFZFUlNJT04gJHtHRU5FUklDX0xJQl9WRVJTSU9OfQorICBTT1ZFUlNJT04gJHtHRU5FUklDX0xJQl9TT1ZFUlNJT059CispCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhiZW5jaG1hcmsgUFVCTElDCisgICAgJDxCVUlMRF9JTlRFUkZBQ0U6JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL2luY2x1ZGU+CisgICAgKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJlbmNobWFya19tYWluIGJlbmNobWFyaykKKworCitzZXQoZ2VuZXJhdGVkX2RpciAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbmVyYXRlZCIpCisKK3NldCh2ZXJzaW9uX2NvbmZpZyAiJHtnZW5lcmF0ZWRfZGlyfS8ke1BST0pFQ1RfTkFNRX1Db25maWdWZXJzaW9uLmNtYWtlIikKK3NldChwcm9qZWN0X2NvbmZpZyAiJHtnZW5lcmF0ZWRfZGlyfS8ke1BST0pFQ1RfTkFNRX1Db25maWcuY21ha2UiKQorc2V0KHBrZ19jb25maWcgIiR7Z2VuZXJhdGVkX2Rpcn0vJHtQUk9KRUNUX05BTUV9LnBjIikKK3NldCh0YXJnZXRzX2V4cG9ydF9uYW1lICIke1BST0pFQ1RfTkFNRX1UYXJnZXRzIikKKworc2V0KG5hbWVzcGFjZSAiJHtQUk9KRUNUX05BTUV9OjoiKQorCitpbmNsdWRlKENNYWtlUGFja2FnZUNvbmZpZ0hlbHBlcnMpCit3cml0ZV9iYXNpY19wYWNrYWdlX3ZlcnNpb25fZmlsZSgKKyAgIiR7dmVyc2lvbl9jb25maWd9IiBWRVJTSU9OICR7R0VORVJJQ19MSUJfVkVSU0lPTn0gQ09NUEFUSUJJTElUWSBTYW1lTWFqb3JWZXJzaW9uCispCisKK2NvbmZpZ3VyZV9maWxlKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vY21ha2UvQ29uZmlnLmNtYWtlLmluIiAiJHtwcm9qZWN0X2NvbmZpZ30iIEBPTkxZKQorY29uZmlndXJlX2ZpbGUoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jbWFrZS9iZW5jaG1hcmsucGMuaW4iICIke3BrZ19jb25maWd9IiBAT05MWSkKKworaWYgKEJFTkNITUFSS19FTkFCTEVfSU5TVEFMTCkKKyAgIyBJbnN0YWxsIHRhcmdldCAod2lsbCBpbnN0YWxsIHRoZSBsaWJyYXJ5IHRvIHNwZWNpZmllZCBDTUFLRV9JTlNUQUxMX1BSRUZJWCB2YXJpYWJsZSkKKyAgaW5zdGFsbCgKKyAgICBUQVJHRVRTIGJlbmNobWFyayBiZW5jaG1hcmtfbWFpbgorICAgIEVYUE9SVCAke3RhcmdldHNfZXhwb3J0X25hbWV9CisgICAgQVJDSElWRSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfQorICAgIExJQlJBUlkgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0KKyAgICBSVU5USU1FIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9CSU5ESVJ9CisgICAgSU5DTFVERVMgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9KQorCisgIGluc3RhbGwoCisgICAgRElSRUNUT1JZICIke1BST0pFQ1RfU09VUkNFX0RJUn0vaW5jbHVkZS9iZW5jaG1hcmsiCisgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9CisgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi4qaCIpCisKKyAgaW5zdGFsbCgKKyAgICAgIEZJTEVTICIke3Byb2plY3RfY29uZmlnfSIgIiR7dmVyc2lvbl9jb25maWd9IgorICAgICAgREVTVElOQVRJT04gIiR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9L2NtYWtlLyR7UFJPSkVDVF9OQU1FfSIpCisKKyAgaW5zdGFsbCgKKyAgICAgIEZJTEVTICIke3BrZ19jb25maWd9IgorICAgICAgREVTVElOQVRJT04gIiR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9L3BrZ2NvbmZpZyIpCisKKyAgaW5zdGFsbCgKKyAgICAgIEVYUE9SVCAiJHt0YXJnZXRzX2V4cG9ydF9uYW1lfSIKKyAgICAgIE5BTUVTUEFDRSAiJHtuYW1lc3BhY2V9IgorICAgICAgREVTVElOQVRJT04gIiR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9L2NtYWtlLyR7UFJPSkVDVF9OQU1FfSIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvYXJyYXlzaXplLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvYXJyYXlzaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNTBmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9hcnJheXNpemUuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIEJFTkNITUFSS19BUlJBWVNJWkVfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0FSUkFZU0laRV9IXworCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKy8vIFRoZSBhcnJheXNpemUoYXJyKSBtYWNybyByZXR1cm5zIHRoZSAjIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5IGFyci4KKy8vIFRoZSBleHByZXNzaW9uIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCBhbmQgdGhlcmVmb3JlIGNhbiBiZQorLy8gdXNlZCBpbiBkZWZpbmluZyBuZXcgYXJyYXlzLCBmb3IgZXhhbXBsZS4gIElmIHlvdSB1c2UgYXJyYXlzaXplIG9uCisvLyBhIHBvaW50ZXIgYnkgbWlzdGFrZSwgeW91IHdpbGwgZ2V0IGEgY29tcGlsZS10aW1lIGVycm9yLgorLy8KKworLy8gVGhpcyB0ZW1wbGF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpcyB1c2VkIGluIGRlZmluaW5nIGFycmF5c2l6ZS4KKy8vIE5vdGUgdGhhdCB0aGUgZnVuY3Rpb24gZG9lc24ndCBuZWVkIGFuIGltcGxlbWVudGF0aW9uLCBhcyB3ZSBvbmx5CisvLyB1c2UgaXRzIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitjaGFyICgmQXJyYXlTaXplSGVscGVyKFQgKCZhcnJheSlbTl0pKVtOXTsKKworLy8gVGhhdCBnY2Mgd2FudHMgYm90aCBvZiB0aGVzZSBwcm90b3R5cGVzIHNlZW1zIG15c3RlcmlvdXMuIFZDLCBmb3IKKy8vIGl0cyBwYXJ0LCBjYW4ndCBkZWNpZGUgd2hpY2ggdG8gdXNlIChhbm90aGVyIG15c3RlcnkpLiBNYXRjaGluZyBvZgorLy8gdGVtcGxhdGUgb3ZlcmxvYWRzOiB0aGUgZmluYWwgZnJvbnRpZXIuCisjaWZuZGVmIENPTVBJTEVSX01TVkMKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NoYXIgKCZBcnJheVNpemVIZWxwZXIoY29uc3QgVCAoJmFycmF5KVtOXSkpW05dOworI2VuZGlmCisKKyNkZWZpbmUgYXJyYXlzaXplKGFycmF5KSAoc2l6ZW9mKDo6YmVuY2htYXJrOjppbnRlcm5hbDo6QXJyYXlTaXplSGVscGVyKGFycmF5KSkpCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX0FSUkFZU0laRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFyay5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmsuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1MWI5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmsuY2MKQEAgLTAsMCArMSw0OTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAiYmVuY2htYXJrX2FwaV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImJlbmNobWFya19ydW5uZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKworI2lmbmRlZiBCRU5DSE1BUktfT1NfV0lORE9XUworI2lmbmRlZiBCRU5DSE1BUktfT1NfRlVDSFNJQQorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJjb2xvcnByaW50LmgiCisjaW5jbHVkZSAiY29tbWFuZGxpbmVmbGFncy5oIgorI2luY2x1ZGUgImNvbXBsZXhpdHkuaCIKKyNpbmNsdWRlICJjb3VudGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibXV0ZXguaCIKKyNpbmNsdWRlICJyZS5oIgorI2luY2x1ZGUgInN0YXRpc3RpY3MuaCIKKyNpbmNsdWRlICJzdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgInRocmVhZF9tYW5hZ2VyLmgiCisjaW5jbHVkZSAidGhyZWFkX3RpbWVyLmgiCisKKy8vIFByaW50IGEgbGlzdCBvZiBiZW5jaG1hcmtzLiBUaGlzIG9wdGlvbiBvdmVycmlkZXMgYWxsIG90aGVyIG9wdGlvbnMuCitERUZJTkVfYm9vbChiZW5jaG1hcmtfbGlzdF90ZXN0cywgZmFsc2UpOworCisvLyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHNwZWNpZmllcyB0aGUgc2V0IG9mIGJlbmNobWFya3MgdG8gZXhlY3V0ZS4gIElmCisvLyB0aGlzIGZsYWcgaXMgZW1wdHksIG9yIGlmIHRoaXMgZmxhZyBpcyB0aGUgc3RyaW5nIFwiYWxsXCIsIGFsbCBiZW5jaG1hcmtzCisvLyBsaW5rZWQgaW50byB0aGUgYmluYXJ5IGFyZSBydW4uCitERUZJTkVfc3RyaW5nKGJlbmNobWFya19maWx0ZXIsICIuIik7CisKKy8vIE1pbmltdW0gbnVtYmVyIG9mIHNlY29uZHMgd2Ugc2hvdWxkIHJ1biBiZW5jaG1hcmsgYmVmb3JlIHJlc3VsdHMgYXJlCisvLyBjb25zaWRlcmVkIHNpZ25pZmljYW50LiAgRm9yIGNwdS10aW1lIGJhc2VkIHRlc3RzLCB0aGlzIGlzIHRoZSBsb3dlciBib3VuZAorLy8gb24gdGhlIHRvdGFsIGNwdSB0aW1lIHVzZWQgYnkgYWxsIHRocmVhZHMgdGhhdCBtYWtlIHVwIHRoZSB0ZXN0LiAgRm9yCisvLyByZWFsLXRpbWUgYmFzZWQgdGVzdHMsIHRoaXMgaXMgdGhlIGxvd2VyIGJvdW5kIG9uIHRoZSBlbGFwc2VkIHRpbWUgb2YgdGhlCisvLyBiZW5jaG1hcmsgZXhlY3V0aW9uLCByZWdhcmRsZXNzIG9mIG51bWJlciBvZiB0aHJlYWRzLgorREVGSU5FX2RvdWJsZShiZW5jaG1hcmtfbWluX3RpbWUsIDAuNSk7CisKKy8vIFRoZSBudW1iZXIgb2YgcnVucyBvZiBlYWNoIGJlbmNobWFyay4gSWYgZ3JlYXRlciB0aGFuIDEsIHRoZSBtZWFuIGFuZAorLy8gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBydW5zIHdpbGwgYmUgcmVwb3J0ZWQuCitERUZJTkVfaW50MzIoYmVuY2htYXJrX3JlcGV0aXRpb25zLCAxKTsKKworLy8gUmVwb3J0IHRoZSByZXN1bHQgb2YgZWFjaCBiZW5jaG1hcmsgcmVwZXRpdGlvbnMuIFdoZW4gJ3RydWUnIGlzIHNwZWNpZmllZAorLy8gb25seSB0aGUgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBhbmQgb3RoZXIgc3RhdGlzdGljcyBhcmUgcmVwb3J0ZWQgZm9yCisvLyByZXBlYXRlZCBiZW5jaG1hcmtzLiBBZmZlY3RzIGFsbCByZXBvcnRlcnMuCitERUZJTkVfYm9vbChiZW5jaG1hcmtfcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seSwgZmFsc2UpOworCisvLyBEaXNwbGF5IHRoZSByZXN1bHQgb2YgZWFjaCBiZW5jaG1hcmsgcmVwZXRpdGlvbnMuIFdoZW4gJ3RydWUnIGlzIHNwZWNpZmllZAorLy8gb25seSB0aGUgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBhbmQgb3RoZXIgc3RhdGlzdGljcyBhcmUgZGlzcGxheWVkIGZvcgorLy8gcmVwZWF0ZWQgYmVuY2htYXJrcy4gVW5saWtlIGJlbmNobWFya19yZXBvcnRfYWdncmVnYXRlc19vbmx5LCBvbmx5IGFmZmVjdHMKKy8vIHRoZSBkaXNwbGF5IHJlcG9ydGVyLCBidXQgICpOT1QqIGZpbGUgcmVwb3J0ZXIsIHdoaWNoIHdpbGwgc3RpbGwgY29udGFpbgorLy8gYWxsIHRoZSBvdXRwdXQuCitERUZJTkVfYm9vbChiZW5jaG1hcmtfZGlzcGxheV9hZ2dyZWdhdGVzX29ubHksIGZhbHNlKTsKKworLy8gVGhlIGZvcm1hdCB0byB1c2UgZm9yIGNvbnNvbGUgb3V0cHV0LgorLy8gVmFsaWQgdmFsdWVzIGFyZSAnY29uc29sZScsICdqc29uJywgb3IgJ2NzdicuCitERUZJTkVfc3RyaW5nKGJlbmNobWFya19mb3JtYXQsICJjb25zb2xlIik7CisKKy8vIFRoZSBmb3JtYXQgdG8gdXNlIGZvciBmaWxlIG91dHB1dC4KKy8vIFZhbGlkIHZhbHVlcyBhcmUgJ2NvbnNvbGUnLCAnanNvbicsIG9yICdjc3YnLgorREVGSU5FX3N0cmluZyhiZW5jaG1hcmtfb3V0X2Zvcm1hdCwgImpzb24iKTsKKworLy8gVGhlIGZpbGUgdG8gd3JpdGUgYWRkaXRpb25hbCBvdXRwdXQgdG8uCitERUZJTkVfc3RyaW5nKGJlbmNobWFya19vdXQsICIiKTsKKworLy8gV2hldGhlciB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuICBWYWxpZCB2YWx1ZXM6CisvLyAndHJ1ZScvJ3llcycvMSwgJ2ZhbHNlJy8nbm8nLzAsIGFuZCAnYXV0bycuICdhdXRvJyBtZWFucyB0byB1c2UgY29sb3JzIGlmCisvLyB0aGUgb3V0cHV0IGlzIGJlaW5nIHNlbnQgdG8gYSB0ZXJtaW5hbCBhbmQgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMKKy8vIHNldCB0byBhIHRlcm1pbmFsIHR5cGUgdGhhdCBzdXBwb3J0cyBjb2xvcnMuCitERUZJTkVfc3RyaW5nKGJlbmNobWFya19jb2xvciwgImF1dG8iKTsKKworLy8gV2hldGhlciB0byB1c2UgdGFidWxhciBmb3JtYXQgd2hlbiBwcmludGluZyB1c2VyIGNvdW50ZXJzIHRvIHRoZSBjb25zb2xlLgorLy8gVmFsaWQgdmFsdWVzOiAndHJ1ZScvJ3llcycvMSwgJ2ZhbHNlJy8nbm8nLzAuICBEZWZhdWx0cyB0byBmYWxzZS4KK0RFRklORV9ib29sKGJlbmNobWFya19jb3VudGVyc190YWJ1bGFyLCBmYWxzZSk7CisKKy8vIFRoZSBsZXZlbCBvZiB2ZXJib3NlIGxvZ2dpbmcgdG8gb3V0cHV0CitERUZJTkVfaW50MzIodiwgMCk7CisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBGSVhNRTogd291bGRuJ3QgTFRPIG1lc3MgdGhpcyB1cD8KK3ZvaWQgVXNlQ2hhclBvaW50ZXIoY2hhciBjb25zdCB2b2xhdGlsZSopIHt9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitTdGF0ZTo6U3RhdGUoSXRlcmF0aW9uQ291bnQgbWF4X2l0ZXJzLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgcmFuZ2VzLAorICAgICAgICAgICAgIGludCB0aHJlYWRfaSwgaW50IG5fdGhyZWFkcywgaW50ZXJuYWw6OlRocmVhZFRpbWVyKiB0aW1lciwKKyAgICAgICAgICAgICBpbnRlcm5hbDo6VGhyZWFkTWFuYWdlciogbWFuYWdlcikKKyAgICA6IHRvdGFsX2l0ZXJhdGlvbnNfKDApLAorICAgICAgYmF0Y2hfbGVmdG92ZXJfKDApLAorICAgICAgbWF4X2l0ZXJhdGlvbnMobWF4X2l0ZXJzKSwKKyAgICAgIHN0YXJ0ZWRfKGZhbHNlKSwKKyAgICAgIGZpbmlzaGVkXyhmYWxzZSksCisgICAgICBlcnJvcl9vY2N1cnJlZF8oZmFsc2UpLAorICAgICAgcmFuZ2VfKHJhbmdlcyksCisgICAgICBjb21wbGV4aXR5X25fKDApLAorICAgICAgY291bnRlcnMoKSwKKyAgICAgIHRocmVhZF9pbmRleCh0aHJlYWRfaSksCisgICAgICB0aHJlYWRzKG5fdGhyZWFkcyksCisgICAgICB0aW1lcl8odGltZXIpLAorICAgICAgbWFuYWdlcl8obWFuYWdlcikgeworICBDSEVDSyhtYXhfaXRlcmF0aW9ucyAhPSAwKSA8PCAiQXQgbGVhc3Qgb25lIGl0ZXJhdGlvbiBtdXN0IGJlIHJ1biI7CisgIENIRUNLX0xUKHRocmVhZF9pbmRleCwgdGhyZWFkcykgPDwgInRocmVhZF9pbmRleCBtdXN0IGJlIGxlc3MgdGhhbiB0aHJlYWRzIjsKKworICAvLyBOb3RlOiBUaGUgdXNlIG9mIG9mZnNldG9mIGJlbG93IGlzIHRlY2huaWNhbGx5IHVuZGVmaW5lZCB1bnRpbCBDKysxNworICAvLyBiZWNhdXNlIFN0YXRlIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCB0eXBlLiBIb3dldmVyLCBhbGwgY29tcGlsZXJzCisgIC8vIGN1cnJlbnRseSBwcm92aWRlIHdlbGwtZGVmaW5lZCBiZWhhdmlvciBhcyBhbiBleHRlbnNpb24gKHdoaWNoIGlzCisgIC8vIGRlbW9uc3RyYXRlZCBzaW5jZSBjb25zdGV4cHIgZXZhbHVhdGlvbiBtdXN0IGRpYWdub3NlIGFsbCB1bmRlZmluZWQKKyAgLy8gYmVoYXZpb3IpLiBIb3dldmVyLCBHQ0MgYW5kIENsYW5nIGFsc28gd2FybiBhYm91dCB0aGlzIHVzZSBvZiBvZmZzZXRvZiwKKyAgLy8gd2hpY2ggbXVzdCBiZSBzdXBwcmVzc2VkLgorI2lmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyNwcmFnbWEgd2FybmluZyBwdXNoCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDE4NzUpCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XaW52YWxpZC1vZmZzZXRvZiIKKyNlbmRpZgorICAvLyBPZmZzZXQgdGVzdHMgdG8gZW5zdXJlIGNvbW1vbmx5IGFjY2Vzc2VkIGRhdGEgaXMgb24gdGhlIGZpcnN0IGNhY2hlIGxpbmUuCisgIGNvbnN0IGludCBjYWNoZV9saW5lX3NpemUgPSA2NDsKKyAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihTdGF0ZSwgZXJyb3Jfb2NjdXJyZWRfKSA8PQorICAgICAgICAgICAgICAgICAgICAoY2FjaGVfbGluZV9zaXplIC0gc2l6ZW9mKGVycm9yX29jY3VycmVkXykpLAorICAgICAgICAgICAgICAgICIiKTsKKyNpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjcHJhZ21hIHdhcm5pbmcgcG9wCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorfQorCit2b2lkIFN0YXRlOjpQYXVzZVRpbWluZygpIHsKKyAgLy8gQWRkIGluIHRpbWUgYWNjdW11bGF0ZWQgc28gZmFyCisgIENIRUNLKHN0YXJ0ZWRfICYmICFmaW5pc2hlZF8gJiYgIWVycm9yX29jY3VycmVkXyk7CisgIHRpbWVyXy0+U3RvcFRpbWVyKCk7Cit9CisKK3ZvaWQgU3RhdGU6OlJlc3VtZVRpbWluZygpIHsKKyAgQ0hFQ0soc3RhcnRlZF8gJiYgIWZpbmlzaGVkXyAmJiAhZXJyb3Jfb2NjdXJyZWRfKTsKKyAgdGltZXJfLT5TdGFydFRpbWVyKCk7Cit9CisKK3ZvaWQgU3RhdGU6OlNraXBXaXRoRXJyb3IoY29uc3QgY2hhciogbXNnKSB7CisgIENIRUNLKG1zZyk7CisgIGVycm9yX29jY3VycmVkXyA9IHRydWU7CisgIHsKKyAgICBNdXRleExvY2sgbChtYW5hZ2VyXy0+R2V0QmVuY2htYXJrTXV0ZXgoKSk7CisgICAgaWYgKG1hbmFnZXJfLT5yZXN1bHRzLmhhc19lcnJvcl8gPT0gZmFsc2UpIHsKKyAgICAgIG1hbmFnZXJfLT5yZXN1bHRzLmVycm9yX21lc3NhZ2VfID0gbXNnOworICAgICAgbWFuYWdlcl8tPnJlc3VsdHMuaGFzX2Vycm9yXyA9IHRydWU7CisgICAgfQorICB9CisgIHRvdGFsX2l0ZXJhdGlvbnNfID0gMDsKKyAgaWYgKHRpbWVyXy0+cnVubmluZygpKSB0aW1lcl8tPlN0b3BUaW1lcigpOworfQorCit2b2lkIFN0YXRlOjpTZXRJdGVyYXRpb25UaW1lKGRvdWJsZSBzZWNvbmRzKSB7CisgIHRpbWVyXy0+U2V0SXRlcmF0aW9uVGltZShzZWNvbmRzKTsKK30KKwordm9pZCBTdGF0ZTo6U2V0TGFiZWwoY29uc3QgY2hhciogbGFiZWwpIHsKKyAgTXV0ZXhMb2NrIGwobWFuYWdlcl8tPkdldEJlbmNobWFya011dGV4KCkpOworICBtYW5hZ2VyXy0+cmVzdWx0cy5yZXBvcnRfbGFiZWxfID0gbGFiZWw7Cit9CisKK3ZvaWQgU3RhdGU6OlN0YXJ0S2VlcFJ1bm5pbmcoKSB7CisgIENIRUNLKCFzdGFydGVkXyAmJiAhZmluaXNoZWRfKTsKKyAgc3RhcnRlZF8gPSB0cnVlOworICB0b3RhbF9pdGVyYXRpb25zXyA9IGVycm9yX29jY3VycmVkXyA/IDAgOiBtYXhfaXRlcmF0aW9uczsKKyAgbWFuYWdlcl8tPlN0YXJ0U3RvcEJhcnJpZXIoKTsKKyAgaWYgKCFlcnJvcl9vY2N1cnJlZF8pIFJlc3VtZVRpbWluZygpOworfQorCit2b2lkIFN0YXRlOjpGaW5pc2hLZWVwUnVubmluZygpIHsKKyAgQ0hFQ0soc3RhcnRlZF8gJiYgKCFmaW5pc2hlZF8gfHwgZXJyb3Jfb2NjdXJyZWRfKSk7CisgIGlmICghZXJyb3Jfb2NjdXJyZWRfKSB7CisgICAgUGF1c2VUaW1pbmcoKTsKKyAgfQorICAvLyBUb3RhbCBpdGVyYXRpb25zIGhhcyBub3cgd3JhcHBlZCBhcm91bmQgcGFzdCAwLiBGaXggdGhpcy4KKyAgdG90YWxfaXRlcmF0aW9uc18gPSAwOworICBmaW5pc2hlZF8gPSB0cnVlOworICBtYW5hZ2VyXy0+U3RhcnRTdG9wQmFycmllcigpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKwordm9pZCBSdW5CZW5jaG1hcmtzKGNvbnN0IHN0ZDo6dmVjdG9yPEJlbmNobWFya0luc3RhbmNlPiYgYmVuY2htYXJrcywKKyAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmtSZXBvcnRlciogZGlzcGxheV9yZXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmtSZXBvcnRlciogZmlsZV9yZXBvcnRlcikgeworICAvLyBOb3RlIHRoZSBmaWxlX3JlcG9ydGVyIGNhbiBiZSBudWxsLgorICBDSEVDSyhkaXNwbGF5X3JlcG9ydGVyICE9IG51bGxwdHIpOworCisgIC8vIERldGVybWluZSB0aGUgd2lkdGggb2YgdGhlIG5hbWUgZmllbGQgdXNpbmcgYSBtaW5pbXVtIHdpZHRoIG9mIDEwLgorICBib29sIG1pZ2h0X2hhdmVfYWdncmVnYXRlcyA9IEZMQUdTX2JlbmNobWFya19yZXBldGl0aW9ucyA+IDE7CisgIHNpemVfdCBuYW1lX2ZpZWxkX3dpZHRoID0gMTA7CisgIHNpemVfdCBzdGF0X2ZpZWxkX3dpZHRoID0gMDsKKyAgZm9yIChjb25zdCBCZW5jaG1hcmtJbnN0YW5jZSYgYmVuY2htYXJrIDogYmVuY2htYXJrcykgeworICAgIG5hbWVfZmllbGRfd2lkdGggPQorICAgICAgICBzdGQ6Om1heDxzaXplX3Q+KG5hbWVfZmllbGRfd2lkdGgsIGJlbmNobWFyay5uYW1lLnN0cigpLnNpemUoKSk7CisgICAgbWlnaHRfaGF2ZV9hZ2dyZWdhdGVzIHw9IGJlbmNobWFyay5yZXBldGl0aW9ucyA+IDE7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIFN0YXQgOiAqYmVuY2htYXJrLnN0YXRpc3RpY3MpCisgICAgICBzdGF0X2ZpZWxkX3dpZHRoID0gc3RkOjptYXg8c2l6ZV90PihzdGF0X2ZpZWxkX3dpZHRoLCBTdGF0Lm5hbWVfLnNpemUoKSk7CisgIH0KKyAgaWYgKG1pZ2h0X2hhdmVfYWdncmVnYXRlcykgbmFtZV9maWVsZF93aWR0aCArPSAxICsgc3RhdF9maWVsZF93aWR0aDsKKworICAvLyBQcmludCBoZWFkZXIgaGVyZQorICBCZW5jaG1hcmtSZXBvcnRlcjo6Q29udGV4dCBjb250ZXh0OworICBjb250ZXh0Lm5hbWVfZmllbGRfd2lkdGggPSBuYW1lX2ZpZWxkX3dpZHRoOworCisgIC8vIEtlZXAgdHJhY2sgb2YgcnVubmluZyB0aW1lcyBvZiBhbGwgaW5zdGFuY2VzIG9mIGN1cnJlbnQgYmVuY2htYXJrCisgIHN0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+IGNvbXBsZXhpdHlfcmVwb3J0czsKKworICAvLyBXZSBmbHVzaCBzdHJlYW1zIGFmdGVyIGludm9raW5nIHJlcG9ydGVyIG1ldGhvZHMgdGhhdCB3cml0ZSB0byB0aGVtLiBUaGlzCisgIC8vIGVuc3VyZXMgdXNlcnMgZ2V0IHRpbWVseSB1cGRhdGVzIGV2ZW4gd2hlbiBzdHJlYW1zIGFyZSBub3QgbGluZS1idWZmZXJlZC4KKyAgYXV0byBmbHVzaFN0cmVhbXMgPSBbXShCZW5jaG1hcmtSZXBvcnRlciogcmVwb3J0ZXIpIHsKKyAgICBpZiAoIXJlcG9ydGVyKSByZXR1cm47CisgICAgc3RkOjpmbHVzaChyZXBvcnRlci0+R2V0T3V0cHV0U3RyZWFtKCkpOworICAgIHN0ZDo6Zmx1c2gocmVwb3J0ZXItPkdldEVycm9yU3RyZWFtKCkpOworICB9OworCisgIGlmIChkaXNwbGF5X3JlcG9ydGVyLT5SZXBvcnRDb250ZXh0KGNvbnRleHQpICYmCisgICAgICAoIWZpbGVfcmVwb3J0ZXIgfHwgZmlsZV9yZXBvcnRlci0+UmVwb3J0Q29udGV4dChjb250ZXh0KSkpIHsKKyAgICBmbHVzaFN0cmVhbXMoZGlzcGxheV9yZXBvcnRlcik7CisgICAgZmx1c2hTdHJlYW1zKGZpbGVfcmVwb3J0ZXIpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBiZW5jaG1hcmsgOiBiZW5jaG1hcmtzKSB7CisgICAgICBSdW5SZXN1bHRzIHJ1bl9yZXN1bHRzID0gUnVuQmVuY2htYXJrKGJlbmNobWFyaywgJmNvbXBsZXhpdHlfcmVwb3J0cyk7CisKKyAgICAgIGF1dG8gcmVwb3J0ID0gWyZydW5fcmVzdWx0c10oQmVuY2htYXJrUmVwb3J0ZXIqIHJlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydF9hZ2dyZWdhdGVzX29ubHkpIHsKKyAgICAgICAgYXNzZXJ0KHJlcG9ydGVyKTsKKyAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGFnZ3JlZ2F0ZXMsIGRvIG91dHB1dCBub24tYWdncmVnYXRlcy4KKyAgICAgICAgcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seSAmPSAhcnVuX3Jlc3VsdHMuYWdncmVnYXRlc19vbmx5LmVtcHR5KCk7CisgICAgICAgIGlmICghcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seSkKKyAgICAgICAgICByZXBvcnRlci0+UmVwb3J0UnVucyhydW5fcmVzdWx0cy5ub25fYWdncmVnYXRlcyk7CisgICAgICAgIGlmICghcnVuX3Jlc3VsdHMuYWdncmVnYXRlc19vbmx5LmVtcHR5KCkpCisgICAgICAgICAgcmVwb3J0ZXItPlJlcG9ydFJ1bnMocnVuX3Jlc3VsdHMuYWdncmVnYXRlc19vbmx5KTsKKyAgICAgIH07CisKKyAgICAgIHJlcG9ydChkaXNwbGF5X3JlcG9ydGVyLCBydW5fcmVzdWx0cy5kaXNwbGF5X3JlcG9ydF9hZ2dyZWdhdGVzX29ubHkpOworICAgICAgaWYgKGZpbGVfcmVwb3J0ZXIpCisgICAgICAgIHJlcG9ydChmaWxlX3JlcG9ydGVyLCBydW5fcmVzdWx0cy5maWxlX3JlcG9ydF9hZ2dyZWdhdGVzX29ubHkpOworCisgICAgICBmbHVzaFN0cmVhbXMoZGlzcGxheV9yZXBvcnRlcik7CisgICAgICBmbHVzaFN0cmVhbXMoZmlsZV9yZXBvcnRlcik7CisgICAgfQorICB9CisgIGRpc3BsYXlfcmVwb3J0ZXItPkZpbmFsaXplKCk7CisgIGlmIChmaWxlX3JlcG9ydGVyKSBmaWxlX3JlcG9ydGVyLT5GaW5hbGl6ZSgpOworICBmbHVzaFN0cmVhbXMoZGlzcGxheV9yZXBvcnRlcik7CisgIGZsdXNoU3RyZWFtcyhmaWxlX3JlcG9ydGVyKTsKK30KKworLy8gRGlzYWJsZSBkZXByZWNhdGVkIHdhcm5pbmdzIHRlbXBvcmFyaWx5IGJlY2F1c2Ugd2UgbmVlZCB0byByZWZlcmVuY2UKKy8vIENTVlJlcG9ydGVyIGJ1dCBkb24ndCB3YW50IHRvIHRyaWdnZXIgLVdlcnJvcj0tV2RlcHJlY2F0ZWQKKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZCIKKyNlbmRpZgorCitzdGQ6OnVuaXF1ZV9wdHI8QmVuY2htYXJrUmVwb3J0ZXI+IENyZWF0ZVJlcG9ydGVyKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBDb25zb2xlUmVwb3J0ZXI6Ok91dHB1dE9wdGlvbnMgb3V0cHV0X29wdHMpIHsKKyAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9wdHI8QmVuY2htYXJrUmVwb3J0ZXI+IFB0clR5cGU7CisgIGlmIChuYW1lID09ICJjb25zb2xlIikgeworICAgIHJldHVybiBQdHJUeXBlKG5ldyBDb25zb2xlUmVwb3J0ZXIob3V0cHV0X29wdHMpKTsKKyAgfSBlbHNlIGlmIChuYW1lID09ICJqc29uIikgeworICAgIHJldHVybiBQdHJUeXBlKG5ldyBKU09OUmVwb3J0ZXIpOworICB9IGVsc2UgaWYgKG5hbWUgPT0gImNzdiIpIHsKKyAgICByZXR1cm4gUHRyVHlwZShuZXcgQ1NWUmVwb3J0ZXIpOworICB9IGVsc2UgeworICAgIHN0ZDo6Y2VyciA8PCAiVW5leHBlY3RlZCBmb3JtYXQ6ICciIDw8IG5hbWUgPDwgIidcbiI7CisgICAgc3RkOjpleGl0KDEpOworICB9Cit9CisKKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCit9ICAvLyBlbmQgbmFtZXNwYWNlCisKK2Jvb2wgSXNaZXJvKGRvdWJsZSBuKSB7CisgIHJldHVybiBzdGQ6OmFicyhuKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworfQorCitDb25zb2xlUmVwb3J0ZXI6Ok91dHB1dE9wdGlvbnMgR2V0T3V0cHV0T3B0aW9ucyhib29sIGZvcmNlX25vX2NvbG9yKSB7CisgIGludCBvdXRwdXRfb3B0cyA9IENvbnNvbGVSZXBvcnRlcjo6T09fRGVmYXVsdHM7CisgIGF1dG8gaXNfYmVuY2htYXJrX2NvbG9yID0gW2ZvcmNlX25vX2NvbG9yXSgpIC0+IGJvb2wgeworICAgIGlmIChmb3JjZV9ub19jb2xvcikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoRkxBR1NfYmVuY2htYXJrX2NvbG9yID09ICJhdXRvIikgeworICAgICAgcmV0dXJuIElzQ29sb3JUZXJtaW5hbCgpOworICAgIH0KKyAgICByZXR1cm4gSXNUcnV0aHlGbGFnVmFsdWUoRkxBR1NfYmVuY2htYXJrX2NvbG9yKTsKKyAgfTsKKyAgaWYgKGlzX2JlbmNobWFya19jb2xvcigpKSB7CisgICAgb3V0cHV0X29wdHMgfD0gQ29uc29sZVJlcG9ydGVyOjpPT19Db2xvcjsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXRfb3B0cyAmPSB+Q29uc29sZVJlcG9ydGVyOjpPT19Db2xvcjsKKyAgfQorICBpZiAoRkxBR1NfYmVuY2htYXJrX2NvdW50ZXJzX3RhYnVsYXIpIHsKKyAgICBvdXRwdXRfb3B0cyB8PSBDb25zb2xlUmVwb3J0ZXI6Ok9PX1RhYnVsYXI7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0X29wdHMgJj0gfkNvbnNvbGVSZXBvcnRlcjo6T09fVGFidWxhcjsKKyAgfQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29uc29sZVJlcG9ydGVyOjpPdXRwdXRPcHRpb25zPihvdXRwdXRfb3B0cyk7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworc2l6ZV90IFJ1blNwZWNpZmllZEJlbmNobWFya3MoKSB7CisgIHJldHVybiBSdW5TcGVjaWZpZWRCZW5jaG1hcmtzKG51bGxwdHIsIG51bGxwdHIpOworfQorCitzaXplX3QgUnVuU3BlY2lmaWVkQmVuY2htYXJrcyhCZW5jaG1hcmtSZXBvcnRlciogZGlzcGxheV9yZXBvcnRlcikgeworICByZXR1cm4gUnVuU3BlY2lmaWVkQmVuY2htYXJrcyhkaXNwbGF5X3JlcG9ydGVyLCBudWxscHRyKTsKK30KKworc2l6ZV90IFJ1blNwZWNpZmllZEJlbmNobWFya3MoQmVuY2htYXJrUmVwb3J0ZXIqIGRpc3BsYXlfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmtSZXBvcnRlciogZmlsZV9yZXBvcnRlcikgeworICBzdGQ6OnN0cmluZyBzcGVjID0gRkxBR1NfYmVuY2htYXJrX2ZpbHRlcjsKKyAgaWYgKHNwZWMuZW1wdHkoKSB8fCBzcGVjID09ICJhbGwiKQorICAgIHNwZWMgPSAiLiI7ICAvLyBSZWdleHAgdGhhdCBtYXRjaGVzIGFsbCBiZW5jaG1hcmtzCisKKyAgLy8gU2V0dXAgdGhlIHJlcG9ydGVycworICBzdGQ6Om9mc3RyZWFtIG91dHB1dF9maWxlOworICBzdGQ6OnVuaXF1ZV9wdHI8QmVuY2htYXJrUmVwb3J0ZXI+IGRlZmF1bHRfZGlzcGxheV9yZXBvcnRlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEJlbmNobWFya1JlcG9ydGVyPiBkZWZhdWx0X2ZpbGVfcmVwb3J0ZXI7CisgIGlmICghZGlzcGxheV9yZXBvcnRlcikgeworICAgIGRlZmF1bHRfZGlzcGxheV9yZXBvcnRlciA9IGludGVybmFsOjpDcmVhdGVSZXBvcnRlcigKKyAgICAgICAgRkxBR1NfYmVuY2htYXJrX2Zvcm1hdCwgaW50ZXJuYWw6OkdldE91dHB1dE9wdGlvbnMoKSk7CisgICAgZGlzcGxheV9yZXBvcnRlciA9IGRlZmF1bHRfZGlzcGxheV9yZXBvcnRlci5nZXQoKTsKKyAgfQorICBhdXRvJiBPdXQgPSBkaXNwbGF5X3JlcG9ydGVyLT5HZXRPdXRwdXRTdHJlYW0oKTsKKyAgYXV0byYgRXJyID0gZGlzcGxheV9yZXBvcnRlci0+R2V0RXJyb3JTdHJlYW0oKTsKKworICBzdGQ6OnN0cmluZyBjb25zdCYgZm5hbWUgPSBGTEFHU19iZW5jaG1hcmtfb3V0OworICBpZiAoZm5hbWUuZW1wdHkoKSAmJiBmaWxlX3JlcG9ydGVyKSB7CisgICAgRXJyIDw8ICJBIGN1c3RvbSBmaWxlIHJlcG9ydGVyIHdhcyBwcm92aWRlZCBidXQgIgorICAgICAgICAgICAiLS1iZW5jaG1hcmtfb3V0PTxmaWxlPiB3YXMgbm90IHNwZWNpZmllZC4iCisgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmV4aXQoMSk7CisgIH0KKyAgaWYgKCFmbmFtZS5lbXB0eSgpKSB7CisgICAgb3V0cHV0X2ZpbGUub3BlbihmbmFtZSk7CisgICAgaWYgKCFvdXRwdXRfZmlsZS5pc19vcGVuKCkpIHsKKyAgICAgIEVyciA8PCAiaW52YWxpZCBmaWxlIG5hbWU6ICciIDw8IGZuYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6ZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKCFmaWxlX3JlcG9ydGVyKSB7CisgICAgICBkZWZhdWx0X2ZpbGVfcmVwb3J0ZXIgPSBpbnRlcm5hbDo6Q3JlYXRlUmVwb3J0ZXIoCisgICAgICAgICAgRkxBR1NfYmVuY2htYXJrX291dF9mb3JtYXQsIENvbnNvbGVSZXBvcnRlcjo6T09fTm9uZSk7CisgICAgICBmaWxlX3JlcG9ydGVyID0gZGVmYXVsdF9maWxlX3JlcG9ydGVyLmdldCgpOworICAgIH0KKyAgICBmaWxlX3JlcG9ydGVyLT5TZXRPdXRwdXRTdHJlYW0oJm91dHB1dF9maWxlKTsKKyAgICBmaWxlX3JlcG9ydGVyLT5TZXRFcnJvclN0cmVhbSgmb3V0cHV0X2ZpbGUpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OkJlbmNobWFya0luc3RhbmNlPiBiZW5jaG1hcmtzOworICBpZiAoIUZpbmRCZW5jaG1hcmtzSW50ZXJuYWwoc3BlYywgJmJlbmNobWFya3MsICZFcnIpKSByZXR1cm4gMDsKKworICBpZiAoYmVuY2htYXJrcy5lbXB0eSgpKSB7CisgICAgRXJyIDw8ICJGYWlsZWQgdG8gbWF0Y2ggYW55IGJlbmNobWFya3MgYWdhaW5zdCByZWdleDogIiA8PCBzcGVjIDw8ICJcbiI7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoRkxBR1NfYmVuY2htYXJrX2xpc3RfdGVzdHMpIHsKKyAgICBmb3IgKGF1dG8gY29uc3QmIGJlbmNobWFyayA6IGJlbmNobWFya3MpCisgICAgICBPdXQgPDwgYmVuY2htYXJrLm5hbWUuc3RyKCkgPDwgIlxuIjsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcm5hbDo6UnVuQmVuY2htYXJrcyhiZW5jaG1hcmtzLCBkaXNwbGF5X3JlcG9ydGVyLCBmaWxlX3JlcG9ydGVyKTsKKyAgfQorCisgIHJldHVybiBiZW5jaG1hcmtzLnNpemUoKTsKK30KKwordm9pZCBSZWdpc3Rlck1lbW9yeU1hbmFnZXIoTWVtb3J5TWFuYWdlciogbWFuYWdlcikgeworICBpbnRlcm5hbDo6bWVtb3J5X21hbmFnZXIgPSBtYW5hZ2VyOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit2b2lkIFByaW50VXNhZ2VBbmRFeGl0KCkgeworICBmcHJpbnRmKHN0ZG91dCwKKyAgICAgICAgICAiYmVuY2htYXJrIgorICAgICAgICAgICIgWy0tYmVuY2htYXJrX2xpc3RfdGVzdHM9e3RydWV8ZmFsc2V9XVxuIgorICAgICAgICAgICIgICAgICAgICAgWy0tYmVuY2htYXJrX2ZpbHRlcj08cmVnZXg+XVxuIgorICAgICAgICAgICIgICAgICAgICAgWy0tYmVuY2htYXJrX21pbl90aW1lPTxtaW5fdGltZT5dXG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS1iZW5jaG1hcmtfcmVwZXRpdGlvbnM9PG51bV9yZXBldGl0aW9ucz5dXG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS1iZW5jaG1hcmtfcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seT17dHJ1ZXxmYWxzZX1dXG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS1iZW5jaG1hcmtfZGlzcGxheV9hZ2dyZWdhdGVzX29ubHk9e3RydWV8ZmFsc2V9XVxuIgorICAgICAgICAgICIgICAgICAgICAgWy0tYmVuY2htYXJrX2Zvcm1hdD08Y29uc29sZXxqc29ufGNzdj5dXG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS1iZW5jaG1hcmtfb3V0PTxmaWxlbmFtZT5dXG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS1iZW5jaG1hcmtfb3V0X2Zvcm1hdD08anNvbnxjb25zb2xlfGNzdj5dXG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS1iZW5jaG1hcmtfY29sb3I9e2F1dG98dHJ1ZXxmYWxzZX1dXG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS1iZW5jaG1hcmtfY291bnRlcnNfdGFidWxhcj17dHJ1ZXxmYWxzZX1dXG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS12PTx2ZXJib3NpdHk+XVxuIik7CisgIGV4aXQoMCk7Cit9CisKK3ZvaWQgUGFyc2VDb21tYW5kTGluZUZsYWdzKGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGJlbmNobWFyazsKKyAgQmVuY2htYXJrUmVwb3J0ZXI6OkNvbnRleHQ6OmV4ZWN1dGFibGVfbmFtZSA9CisgICAgICAoYXJnYyAmJiAqYXJnYyA+IDApID8gYXJndlswXSA6ICJ1bmtub3duIjsKKyAgZm9yIChpbnQgaSA9IDE7IGFyZ2MgJiYgaSA8ICphcmdjOyArK2kpIHsKKyAgICBpZiAoUGFyc2VCb29sRmxhZyhhcmd2W2ldLCAiYmVuY2htYXJrX2xpc3RfdGVzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICZGTEFHU19iZW5jaG1hcmtfbGlzdF90ZXN0cykgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfZmlsdGVyIiwgJkZMQUdTX2JlbmNobWFya19maWx0ZXIpIHx8CisgICAgICAgIFBhcnNlRG91YmxlRmxhZyhhcmd2W2ldLCAiYmVuY2htYXJrX21pbl90aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZGTEFHU19iZW5jaG1hcmtfbWluX3RpbWUpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfcmVwZXRpdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAmRkxBR1NfYmVuY2htYXJrX3JlcGV0aXRpb25zKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seSIsCisgICAgICAgICAgICAgICAgICAgICAgJkZMQUdTX2JlbmNobWFya19yZXBvcnRfYWdncmVnYXRlc19vbmx5KSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkiLAorICAgICAgICAgICAgICAgICAgICAgICZGTEFHU19iZW5jaG1hcmtfZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmd2W2ldLCAiYmVuY2htYXJrX2Zvcm1hdCIsICZGTEFHU19iZW5jaG1hcmtfZm9ybWF0KSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJndltpXSwgImJlbmNobWFya19vdXQiLCAmRkxBR1NfYmVuY2htYXJrX291dCkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfb3V0X2Zvcm1hdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmRkxBR1NfYmVuY2htYXJrX291dF9mb3JtYXQpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmd2W2ldLCAiYmVuY2htYXJrX2NvbG9yIiwgJkZMQUdTX2JlbmNobWFya19jb2xvcikgfHwKKyAgICAgICAgLy8gImNvbG9yX3ByaW50IiBpcyB0aGUgZGVwcmVjYXRlZCBuYW1lIGZvciAiYmVuY2htYXJrX2NvbG9yIi4KKyAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMuCisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmd2W2ldLCAiY29sb3JfcHJpbnQiLCAmRkxBR1NfYmVuY2htYXJrX2NvbG9yKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfY291bnRlcnNfdGFidWxhciIsCisgICAgICAgICAgICAgICAgICAgICAgJkZMQUdTX2JlbmNobWFya19jb3VudGVyc190YWJ1bGFyKSB8fAorICAgICAgICBQYXJzZUludDMyRmxhZyhhcmd2W2ldLCAidiIsICZGTEFHU192KSkgeworICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2MgLSAxOyArK2opIGFyZ3Zbal0gPSBhcmd2W2ogKyAxXTsKKworICAgICAgLS0oKmFyZ2MpOworICAgICAgLS1pOworICAgIH0gZWxzZSBpZiAoSXNGbGFnKGFyZ3ZbaV0sICJoZWxwIikpIHsKKyAgICAgIFByaW50VXNhZ2VBbmRFeGl0KCk7CisgICAgfQorICB9CisgIGZvciAoYXV0byBjb25zdCogZmxhZyA6CisgICAgICAgeyZGTEFHU19iZW5jaG1hcmtfZm9ybWF0LCAmRkxBR1NfYmVuY2htYXJrX291dF9mb3JtYXR9KQorICAgIGlmICgqZmxhZyAhPSAiY29uc29sZSIgJiYgKmZsYWcgIT0gImpzb24iICYmICpmbGFnICE9ICJjc3YiKSB7CisgICAgICBQcmludFVzYWdlQW5kRXhpdCgpOworICAgIH0KKyAgaWYgKEZMQUdTX2JlbmNobWFya19jb2xvci5lbXB0eSgpKSB7CisgICAgUHJpbnRVc2FnZUFuZEV4aXQoKTsKKyAgfQorfQorCitpbnQgSW5pdGlhbGl6ZVN0cmVhbXMoKSB7CisgIHN0YXRpYyBzdGQ6Omlvc19iYXNlOjpJbml0IGluaXQ7CisgIHJldHVybiAwOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3ZvaWQgSW5pdGlhbGl6ZShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludGVybmFsOjpQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoYXJnYywgYXJndik7CisgIGludGVybmFsOjpMb2dMZXZlbCgpID0gRkxBR1NfdjsKK30KKworYm9vbCBSZXBvcnRVbnJlY29nbml6ZWRBcmd1bWVudHMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogZXJyb3I6IHVucmVjb2duaXplZCBjb21tYW5kLWxpbmUgZmxhZzogJXNcbiIsIGFyZ3ZbMF0sCisgICAgICAgICAgICBhcmd2W2ldKTsKKyAgfQorICByZXR1cm4gYXJnYyA+IDE7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvYmVuY2htYXJrX2FwaV9pbnRlcm5hbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfYXBpX2ludGVybmFsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjhhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvYmVuY2htYXJrX2FwaV9pbnRlcm5hbC5jYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiYmVuY2htYXJrX2FwaV9pbnRlcm5hbC5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK1N0YXRlIEJlbmNobWFya0luc3RhbmNlOjpSdW4oSXRlcmF0aW9uQ291bnQgaXRlcnMsIGludCB0aHJlYWRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUaHJlYWRUaW1lciogdGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUaHJlYWRNYW5hZ2VyKiBtYW5hZ2VyKSBjb25zdCB7CisgIFN0YXRlIHN0KGl0ZXJzLCBhcmcsIHRocmVhZF9pZCwgdGhyZWFkcywgdGltZXIsIG1hbmFnZXIpOworICBiZW5jaG1hcmstPlJ1bihzdCk7CisgIHJldHVybiBzdDsKK30KKworfSAgLy8gaW50ZXJuYWwKK30gIC8vIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19hcGlfaW50ZXJuYWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfYXBpX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0ZWZmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfYXBpX2ludGVybmFsLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBCRU5DSE1BUktfQVBJX0lOVEVSTkFMX0gKKyNkZWZpbmUgQkVOQ0hNQVJLX0FQSV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAiY29tbWFuZGxpbmVmbGFncy5oIgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBJbmZvcm1hdGlvbiBrZXB0IHBlciBiZW5jaG1hcmsgd2UgbWF5IHdhbnQgdG8gcnVuCitzdHJ1Y3QgQmVuY2htYXJrSW5zdGFuY2UgeworICBCZW5jaG1hcmtOYW1lIG5hbWU7CisgIEJlbmNobWFyayogYmVuY2htYXJrOworICBBZ2dyZWdhdGlvblJlcG9ydE1vZGUgYWdncmVnYXRpb25fcmVwb3J0X21vZGU7CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGFyZzsKKyAgVGltZVVuaXQgdGltZV91bml0OworICBpbnQgcmFuZ2VfbXVsdGlwbGllcjsKKyAgYm9vbCBtZWFzdXJlX3Byb2Nlc3NfY3B1X3RpbWU7CisgIGJvb2wgdXNlX3JlYWxfdGltZTsKKyAgYm9vbCB1c2VfbWFudWFsX3RpbWU7CisgIEJpZ08gY29tcGxleGl0eTsKKyAgQmlnT0Z1bmMqIGNvbXBsZXhpdHlfbGFtYmRhOworICBVc2VyQ291bnRlcnMgY291bnRlcnM7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFN0YXRpc3RpY3M+KiBzdGF0aXN0aWNzOworICBib29sIGxhc3RfYmVuY2htYXJrX2luc3RhbmNlOworICBpbnQgcmVwZXRpdGlvbnM7CisgIGRvdWJsZSBtaW5fdGltZTsKKyAgSXRlcmF0aW9uQ291bnQgaXRlcmF0aW9uczsKKyAgaW50IHRocmVhZHM7ICAvLyBOdW1iZXIgb2YgY29uY3VycmVudCB0aHJlYWRzIHRvIHVzCisKKyAgU3RhdGUgUnVuKEl0ZXJhdGlvbkNvdW50IGl0ZXJzLCBpbnQgdGhyZWFkX2lkLCBpbnRlcm5hbDo6VGhyZWFkVGltZXIqIHRpbWVyLAorICAgICAgICAgICAgaW50ZXJuYWw6OlRocmVhZE1hbmFnZXIqIG1hbmFnZXIpIGNvbnN0OworfTsKKworYm9vbCBGaW5kQmVuY2htYXJrc0ludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiByZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxCZW5jaG1hcmtJbnN0YW5jZT4qIGJlbmNobWFya3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBFcnIpOworCitib29sIElzWmVybyhkb3VibGUgbik7CisKK0NvbnNvbGVSZXBvcnRlcjo6T3V0cHV0T3B0aW9ucyBHZXRPdXRwdXRPcHRpb25zKGJvb2wgZm9yY2Vfbm9fY29sb3IgPSBmYWxzZSk7CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX0FQSV9JTlRFUk5BTF9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvYmVuY2htYXJrX21haW4uY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvYmVuY2htYXJrX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiMjQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfbWFpbi5jYwpAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19uYW1lLmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19uYW1lLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMTdlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvYmVuY2htYXJrX25hbWUuY2MKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK25hbWVzcGFjZSB7CisKKy8vIENvbXB1dGUgdGhlIHRvdGFsIHNpemUgb2YgYSBwYWNrIG9mIHN0ZDo6c3RyaW5ncworc2l6ZV90IHNpemVfaW1wbCgpIHsgcmV0dXJuIDA7IH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lLi4uIFRhaWw+CitzaXplX3Qgc2l6ZV9pbXBsKGNvbnN0IEhlYWQmIGhlYWQsIGNvbnN0IFRhaWwmLi4uIHRhaWwpIHsKKyAgcmV0dXJuIGhlYWQuc2l6ZSgpICsgc2l6ZV9pbXBsKHRhaWwuLi4pOworfQorCisvLyBKb2luIGEgcGFjayBvZiBzdGQ6OnN0cmluZ3MgdXNpbmcgYSBkZWxpbWl0ZXIKKy8vIFRPRE86IHVzZSBhYnNsOjpTdHJKb2luCit2b2lkIGpvaW5faW1wbChzdGQ6OnN0cmluZyYsIGNoYXIpIHt9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBIZWFkLCB0eXBlbmFtZS4uLiBUYWlsPgordm9pZCBqb2luX2ltcGwoc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIgZGVsaW1pdGVyLCBjb25zdCBIZWFkJiBoZWFkLAorICAgICAgICAgICAgICAgY29uc3QgVGFpbCYuLi4gdGFpbCkgeworICBpZiAoIXMuZW1wdHkoKSAmJiAhaGVhZC5lbXB0eSgpKSB7CisgICAgcyArPSBkZWxpbWl0ZXI7CisgIH0KKworICBzICs9IGhlYWQ7CisKKyAgam9pbl9pbXBsKHMsIGRlbGltaXRlciwgdGFpbC4uLik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KK3N0ZDo6c3RyaW5nIGpvaW4oY2hhciBkZWxpbWl0ZXIsIGNvbnN0IFRzJi4uLiB0cykgeworICBzdGQ6OnN0cmluZyBzOworICBzLnJlc2VydmUoc2l6ZW9mLi4uKFRzKSArIHNpemVfaW1wbCh0cy4uLikpOworICBqb2luX2ltcGwocywgZGVsaW1pdGVyLCB0cy4uLik7CisgIHJldHVybiBzOworfQorfSAgLy8gbmFtZXNwYWNlCisKK3N0ZDo6c3RyaW5nIEJlbmNobWFya05hbWU6OnN0cigpIGNvbnN0IHsKKyAgcmV0dXJuIGpvaW4oJy8nLCBmdW5jdGlvbl9uYW1lLCBhcmdzLCBtaW5fdGltZSwgaXRlcmF0aW9ucywgcmVwZXRpdGlvbnMsCisgICAgICAgICAgICAgIHRpbWVfdHlwZSwgdGhyZWFkcyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYmVuY2htYXJrCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvYmVuY2htYXJrX3JlZ2lzdGVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19yZWdpc3Rlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2EzOWIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19yZWdpc3Rlci5jYwpAQCAtMCwwICsxLDUwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImJlbmNobWFya19yZWdpc3Rlci5oIgorCisjaWZuZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisjaWZuZGVmIEJFTkNITUFSS19PU19GVUNIU0lBCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaWZuZGVmIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZW5kaWYKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgImJlbmNobWFya19hcGlfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgImNvbW1hbmRsaW5lZmxhZ3MuaCIKKyNpbmNsdWRlICJjb21wbGV4aXR5LmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibXV0ZXguaCIKKyNpbmNsdWRlICJyZS5oIgorI2luY2x1ZGUgInN0YXRpc3RpY3MuaCIKKyNpbmNsdWRlICJzdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgInRpbWVycy5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworbmFtZXNwYWNlIHsKKy8vIEZvciBub24tZGVuc2UgUmFuZ2UsIGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIHBvd2VycyBvZiBrUmFuZ2VNdWx0aXBsaWVyLgorc3RhdGljIGNvbnN0IGludCBrUmFuZ2VNdWx0aXBsaWVyID0gODsKKy8vIFRoZSBzaXplIG9mIGEgYmVuY2htYXJrIGZhbWlseSBkZXRlcm1pbmVzIGlzIHRoZSBudW1iZXIgb2YgaW5wdXRzIHRvIHJlcGVhdAorLy8gdGhlIGJlbmNobWFyayBvbi4gSWYgdGhpcyBpcyAibGFyZ2UiIHRoZW4gd2FybiB0aGUgdXNlciBkdXJpbmcgY29uZmlndXJhdGlvbi4KK3N0YXRpYyBjb25zdCBzaXplX3Qga01heEZhbWlseVNpemUgPSAxMDA7Cit9ICAvLyBlbmQgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgQmVuY2htYXJrRmFtaWxpZXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLyBDbGFzcyBmb3IgbWFuYWdpbmcgcmVnaXN0ZXJlZCBiZW5jaG1hcmtzLiAgTm90ZSB0aGF0IGVhY2ggcmVnaXN0ZXJlZAorLy8gYmVuY2htYXJrIGlkZW50aWZpZXMgYSBmYW1pbHkgb2YgcmVsYXRlZCBiZW5jaG1hcmtzIHRvIHJ1bi4KK2NsYXNzIEJlbmNobWFya0ZhbWlsaWVzIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBCZW5jaG1hcmtGYW1pbGllcyogR2V0SW5zdGFuY2UoKTsKKworICAvLyBSZWdpc3RlcnMgYSBiZW5jaG1hcmsgZmFtaWx5IGFuZCByZXR1cm5zIHRoZSBpbmRleCBhc3NpZ25lZCB0byBpdC4KKyAgc2l6ZV90IEFkZEJlbmNobWFyayhzdGQ6OnVuaXF1ZV9wdHI8QmVuY2htYXJrPiBmYW1pbHkpOworCisgIC8vIENsZWFyIGFsbCByZWdpc3RlcmVkIGJlbmNobWFyayBmYW1pbGllcy4KKyAgdm9pZCBDbGVhckJlbmNobWFya3MoKTsKKworICAvLyBFeHRyYWN0IHRoZSBsaXN0IG9mIGJlbmNobWFyayBpbnN0YW5jZXMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkCisgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgYm9vbCBGaW5kQmVuY2htYXJrcyhzdGQ6OnN0cmluZyByZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxCZW5jaG1hcmtJbnN0YW5jZT4qIGJlbmNobWFya3MsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBFcnIpOworCisgcHJpdmF0ZToKKyAgQmVuY2htYXJrRmFtaWxpZXMoKSB7fQorCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxCZW5jaG1hcms+PiBmYW1pbGllc187CisgIE11dGV4IG11dGV4XzsKK307CisKK0JlbmNobWFya0ZhbWlsaWVzKiBCZW5jaG1hcmtGYW1pbGllczo6R2V0SW5zdGFuY2UoKSB7CisgIHN0YXRpYyBCZW5jaG1hcmtGYW1pbGllcyBpbnN0YW5jZTsKKyAgcmV0dXJuICZpbnN0YW5jZTsKK30KKworc2l6ZV90IEJlbmNobWFya0ZhbWlsaWVzOjpBZGRCZW5jaG1hcmsoc3RkOjp1bmlxdWVfcHRyPEJlbmNobWFyaz4gZmFtaWx5KSB7CisgIE11dGV4TG9jayBsKG11dGV4Xyk7CisgIHNpemVfdCBpbmRleCA9IGZhbWlsaWVzXy5zaXplKCk7CisgIGZhbWlsaWVzXy5wdXNoX2JhY2soc3RkOjptb3ZlKGZhbWlseSkpOworICByZXR1cm4gaW5kZXg7Cit9CisKK3ZvaWQgQmVuY2htYXJrRmFtaWxpZXM6OkNsZWFyQmVuY2htYXJrcygpIHsKKyAgTXV0ZXhMb2NrIGwobXV0ZXhfKTsKKyAgZmFtaWxpZXNfLmNsZWFyKCk7CisgIGZhbWlsaWVzXy5zaHJpbmtfdG9fZml0KCk7Cit9CisKK2Jvb2wgQmVuY2htYXJrRmFtaWxpZXM6OkZpbmRCZW5jaG1hcmtzKAorICAgIHN0ZDo6c3RyaW5nIHNwZWMsIHN0ZDo6dmVjdG9yPEJlbmNobWFya0luc3RhbmNlPiogYmVuY2htYXJrcywKKyAgICBzdGQ6Om9zdHJlYW0qIEVyclN0cmVhbSkgeworICBDSEVDSyhFcnJTdHJlYW0pOworICBhdXRvJiBFcnIgPSAqRXJyU3RyZWFtOworICAvLyBNYWtlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvdXQgb2YgY29tbWFuZC1saW5lIGZsYWcKKyAgc3RkOjpzdHJpbmcgZXJyb3JfbXNnOworICBSZWdleCByZTsKKyAgYm9vbCBpc05lZ2F0aXZlRmlsdGVyID0gZmFsc2U7CisgIGlmIChzcGVjWzBdID09ICctJykgeworICAgIHNwZWMucmVwbGFjZSgwLCAxLCAiIik7CisgICAgaXNOZWdhdGl2ZUZpbHRlciA9IHRydWU7CisgIH0KKyAgaWYgKCFyZS5Jbml0KHNwZWMsICZlcnJvcl9tc2cpKSB7CisgICAgRXJyIDw8ICJDb3VsZCBub3QgY29tcGlsZSBiZW5jaG1hcmsgcmU6ICIgPDwgZXJyb3JfbXNnIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBTcGVjaWFsIGxpc3Qgb2YgdGhyZWFkIGNvdW50cyB0byB1c2Ugd2hlbiBub25lIGFyZSBzcGVjaWZpZWQKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiBvbmVfdGhyZWFkID0gezF9OworCisgIE11dGV4TG9jayBsKG11dGV4Xyk7CisgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEJlbmNobWFyaz4mIGZhbWlseSA6IGZhbWlsaWVzXykgeworICAgIC8vIEZhbWlseSB3YXMgZGVsZXRlZCBvciBiZW5jaG1hcmsgZG9lc24ndCBtYXRjaAorICAgIGlmICghZmFtaWx5KSBjb250aW51ZTsKKworICAgIGlmIChmYW1pbHktPkFyZ3NDbnQoKSA9PSAtMSkgeworICAgICAgZmFtaWx5LT5BcmdzKHt9KTsKKyAgICB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiogdGhyZWFkX2NvdW50cyA9CisgICAgICAgIChmYW1pbHktPnRocmVhZF9jb3VudHNfLmVtcHR5KCkKKyAgICAgICAgICAgICA/ICZvbmVfdGhyZWFkCisgICAgICAgICAgICAgOiAmc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjp2ZWN0b3I8aW50PiY+KGZhbWlseS0+dGhyZWFkX2NvdW50c18pKTsKKyAgICBjb25zdCBzaXplX3QgZmFtaWx5X3NpemUgPSBmYW1pbHktPmFyZ3NfLnNpemUoKSAqIHRocmVhZF9jb3VudHMtPnNpemUoKTsKKyAgICAvLyBUaGUgYmVuY2htYXJrIHdpbGwgYmUgcnVuIGF0IGxlYXN0ICdmYW1pbHlfc2l6ZScgZGlmZmVyZW50IGlucHV0cy4KKyAgICAvLyBJZiAnZmFtaWx5X3NpemUnIGlzIHZlcnkgbGFyZ2Ugd2FybiB0aGUgdXNlci4KKyAgICBpZiAoZmFtaWx5X3NpemUgPiBrTWF4RmFtaWx5U2l6ZSkgeworICAgICAgRXJyIDw8ICJUaGUgbnVtYmVyIG9mIGlucHV0cyBpcyB2ZXJ5IGxhcmdlLiAiIDw8IGZhbWlseS0+bmFtZV8KKyAgICAgICAgICA8PCAiIHdpbGwgYmUgcmVwZWF0ZWQgYXQgbGVhc3QgIiA8PCBmYW1pbHlfc2l6ZSA8PCAiIHRpbWVzLlxuIjsKKyAgICB9CisgICAgLy8gcmVzZXJ2ZSBpbiB0aGUgc3BlY2lhbCBjYXNlIHRoZSByZWdleCAiLiIsIHNpbmNlIHdlIGtub3cgdGhlIGZpbmFsCisgICAgLy8gZmFtaWx5IHNpemUuCisgICAgaWYgKHNwZWMgPT0gIi4iKSBiZW5jaG1hcmtzLT5yZXNlcnZlKGZhbWlseV9zaXplKTsKKworICAgIGZvciAoYXV0byBjb25zdCYgYXJncyA6IGZhbWlseS0+YXJnc18pIHsKKyAgICAgIGZvciAoaW50IG51bV90aHJlYWRzIDogKnRocmVhZF9jb3VudHMpIHsKKyAgICAgICAgQmVuY2htYXJrSW5zdGFuY2UgaW5zdGFuY2U7CisgICAgICAgIGluc3RhbmNlLm5hbWUuZnVuY3Rpb25fbmFtZSA9IGZhbWlseS0+bmFtZV87CisgICAgICAgIGluc3RhbmNlLmJlbmNobWFyayA9IGZhbWlseS5nZXQoKTsKKyAgICAgICAgaW5zdGFuY2UuYWdncmVnYXRpb25fcmVwb3J0X21vZGUgPSBmYW1pbHktPmFnZ3JlZ2F0aW9uX3JlcG9ydF9tb2RlXzsKKyAgICAgICAgaW5zdGFuY2UuYXJnID0gYXJnczsKKyAgICAgICAgaW5zdGFuY2UudGltZV91bml0ID0gZmFtaWx5LT50aW1lX3VuaXRfOworICAgICAgICBpbnN0YW5jZS5yYW5nZV9tdWx0aXBsaWVyID0gZmFtaWx5LT5yYW5nZV9tdWx0aXBsaWVyXzsKKyAgICAgICAgaW5zdGFuY2UubWluX3RpbWUgPSBmYW1pbHktPm1pbl90aW1lXzsKKyAgICAgICAgaW5zdGFuY2UuaXRlcmF0aW9ucyA9IGZhbWlseS0+aXRlcmF0aW9uc187CisgICAgICAgIGluc3RhbmNlLnJlcGV0aXRpb25zID0gZmFtaWx5LT5yZXBldGl0aW9uc187CisgICAgICAgIGluc3RhbmNlLm1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZSA9IGZhbWlseS0+bWVhc3VyZV9wcm9jZXNzX2NwdV90aW1lXzsKKyAgICAgICAgaW5zdGFuY2UudXNlX3JlYWxfdGltZSA9IGZhbWlseS0+dXNlX3JlYWxfdGltZV87CisgICAgICAgIGluc3RhbmNlLnVzZV9tYW51YWxfdGltZSA9IGZhbWlseS0+dXNlX21hbnVhbF90aW1lXzsKKyAgICAgICAgaW5zdGFuY2UuY29tcGxleGl0eSA9IGZhbWlseS0+Y29tcGxleGl0eV87CisgICAgICAgIGluc3RhbmNlLmNvbXBsZXhpdHlfbGFtYmRhID0gZmFtaWx5LT5jb21wbGV4aXR5X2xhbWJkYV87CisgICAgICAgIGluc3RhbmNlLnN0YXRpc3RpY3MgPSAmZmFtaWx5LT5zdGF0aXN0aWNzXzsKKyAgICAgICAgaW5zdGFuY2UudGhyZWFkcyA9IG51bV90aHJlYWRzOworCisgICAgICAgIC8vIEFkZCBhcmd1bWVudHMgdG8gaW5zdGFuY2UgbmFtZQorICAgICAgICBzaXplX3QgYXJnX2kgPSAwOworICAgICAgICBmb3IgKGF1dG8gY29uc3QmIGFyZyA6IGFyZ3MpIHsKKyAgICAgICAgICBpZiAoIWluc3RhbmNlLm5hbWUuYXJncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpbnN0YW5jZS5uYW1lLmFyZ3MgKz0gJy8nOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChhcmdfaSA8IGZhbWlseS0+YXJnX25hbWVzXy5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIGFyZ19uYW1lID0gZmFtaWx5LT5hcmdfbmFtZXNfW2FyZ19pXTsKKyAgICAgICAgICAgIGlmICghYXJnX25hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICBpbnN0YW5jZS5uYW1lLmFyZ3MgKz0gU3RyRm9ybWF0KCIlczoiLCBhcmdfbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbnN0YW5jZS5uYW1lLmFyZ3MgKz0gU3RyRm9ybWF0KCIlIiBQUklkNjQsIGFyZyk7CisgICAgICAgICAgKythcmdfaTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghSXNaZXJvKGZhbWlseS0+bWluX3RpbWVfKSkKKyAgICAgICAgICBpbnN0YW5jZS5uYW1lLm1pbl90aW1lID0KKyAgICAgICAgICAgICAgU3RyRm9ybWF0KCJtaW5fdGltZTolMC4zZiIsIGZhbWlseS0+bWluX3RpbWVfKTsKKyAgICAgICAgaWYgKGZhbWlseS0+aXRlcmF0aW9uc18gIT0gMCkgeworICAgICAgICAgIGluc3RhbmNlLm5hbWUuaXRlcmF0aW9ucyA9CisgICAgICAgICAgICAgIFN0ckZvcm1hdCgiaXRlcmF0aW9uczolbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oZmFtaWx5LT5pdGVyYXRpb25zXykpOworICAgICAgICB9CisgICAgICAgIGlmIChmYW1pbHktPnJlcGV0aXRpb25zXyAhPSAwKQorICAgICAgICAgIGluc3RhbmNlLm5hbWUucmVwZXRpdGlvbnMgPQorICAgICAgICAgICAgICBTdHJGb3JtYXQoInJlcGVhdHM6JWQiLCBmYW1pbHktPnJlcGV0aXRpb25zXyk7CisKKyAgICAgICAgaWYgKGZhbWlseS0+bWVhc3VyZV9wcm9jZXNzX2NwdV90aW1lXykgeworICAgICAgICAgIGluc3RhbmNlLm5hbWUudGltZV90eXBlID0gInByb2Nlc3NfdGltZSI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFtaWx5LT51c2VfbWFudWFsX3RpbWVfKSB7CisgICAgICAgICAgaWYgKCFpbnN0YW5jZS5uYW1lLnRpbWVfdHlwZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBpbnN0YW5jZS5uYW1lLnRpbWVfdHlwZSArPSAnLyc7CisgICAgICAgICAgfQorICAgICAgICAgIGluc3RhbmNlLm5hbWUudGltZV90eXBlICs9ICJtYW51YWxfdGltZSI7CisgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LT51c2VfcmVhbF90aW1lXykgeworICAgICAgICAgIGlmICghaW5zdGFuY2UubmFtZS50aW1lX3R5cGUuZW1wdHkoKSkgeworICAgICAgICAgICAgaW5zdGFuY2UubmFtZS50aW1lX3R5cGUgKz0gJy8nOworICAgICAgICAgIH0KKyAgICAgICAgICBpbnN0YW5jZS5uYW1lLnRpbWVfdHlwZSArPSAicmVhbF90aW1lIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZCB0byB0aGUgbmFtZQorICAgICAgICBpZiAoIWZhbWlseS0+dGhyZWFkX2NvdW50c18uZW1wdHkoKSkgeworICAgICAgICAgIGluc3RhbmNlLm5hbWUudGhyZWFkcyA9IFN0ckZvcm1hdCgidGhyZWFkczolZCIsIGluc3RhbmNlLnRocmVhZHMpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgYXV0byBmdWxsX25hbWUgPSBpbnN0YW5jZS5uYW1lLnN0cigpOworICAgICAgICBpZiAoKHJlLk1hdGNoKGZ1bGxfbmFtZSkgJiYgIWlzTmVnYXRpdmVGaWx0ZXIpIHx8CisgICAgICAgICAgICAoIXJlLk1hdGNoKGZ1bGxfbmFtZSkgJiYgaXNOZWdhdGl2ZUZpbHRlcikpIHsKKyAgICAgICAgICBpbnN0YW5jZS5sYXN0X2JlbmNobWFya19pbnN0YW5jZSA9ICgmYXJncyA9PSAmZmFtaWx5LT5hcmdzXy5iYWNrKCkpOworICAgICAgICAgIGJlbmNobWFya3MtPnB1c2hfYmFjayhzdGQ6Om1vdmUoaW5zdGFuY2UpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworQmVuY2htYXJrKiBSZWdpc3RlckJlbmNobWFya0ludGVybmFsKEJlbmNobWFyayogYmVuY2gpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEJlbmNobWFyaz4gYmVuY2hfcHRyKGJlbmNoKTsKKyAgQmVuY2htYXJrRmFtaWxpZXMqIGZhbWlsaWVzID0gQmVuY2htYXJrRmFtaWxpZXM6OkdldEluc3RhbmNlKCk7CisgIGZhbWlsaWVzLT5BZGRCZW5jaG1hcmsoc3RkOjptb3ZlKGJlbmNoX3B0cikpOworICByZXR1cm4gYmVuY2g7Cit9CisKKy8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGlzIGEgaGFjayBzbyB0aGF0IGJlbmNobWFyay5jYyBjYW4gYWNjZXNzCisvLyBgQmVuY2htYXJrRmFtaWxpZXNgCitib29sIEZpbmRCZW5jaG1hcmtzSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJlbmNobWFya0luc3RhbmNlPiogYmVuY2htYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0qIEVycikgeworICByZXR1cm4gQmVuY2htYXJrRmFtaWxpZXM6OkdldEluc3RhbmNlKCktPkZpbmRCZW5jaG1hcmtzKHJlLCBiZW5jaG1hcmtzLCBFcnIpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlbmNobWFyaworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKK0JlbmNobWFyazo6QmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUpCisgICAgOiBuYW1lXyhuYW1lKSwKKyAgICAgIGFnZ3JlZ2F0aW9uX3JlcG9ydF9tb2RlXyhBUk1fVW5zcGVjaWZpZWQpLAorICAgICAgdGltZV91bml0XyhrTmFub3NlY29uZCksCisgICAgICByYW5nZV9tdWx0aXBsaWVyXyhrUmFuZ2VNdWx0aXBsaWVyKSwKKyAgICAgIG1pbl90aW1lXygwKSwKKyAgICAgIGl0ZXJhdGlvbnNfKDApLAorICAgICAgcmVwZXRpdGlvbnNfKDApLAorICAgICAgbWVhc3VyZV9wcm9jZXNzX2NwdV90aW1lXyhmYWxzZSksCisgICAgICB1c2VfcmVhbF90aW1lXyhmYWxzZSksCisgICAgICB1c2VfbWFudWFsX3RpbWVfKGZhbHNlKSwKKyAgICAgIGNvbXBsZXhpdHlfKG9Ob25lKSwKKyAgICAgIGNvbXBsZXhpdHlfbGFtYmRhXyhudWxscHRyKSB7CisgIENvbXB1dGVTdGF0aXN0aWNzKCJtZWFuIiwgU3RhdGlzdGljc01lYW4pOworICBDb21wdXRlU3RhdGlzdGljcygibWVkaWFuIiwgU3RhdGlzdGljc01lZGlhbik7CisgIENvbXB1dGVTdGF0aXN0aWNzKCJzdGRkZXYiLCBTdGF0aXN0aWNzU3RkRGV2KTsKK30KKworQmVuY2htYXJrOjp+QmVuY2htYXJrKCkge30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OkFyZyhpbnQ2NF90IHgpIHsKKyAgQ0hFQ0soQXJnc0NudCgpID09IC0xIHx8IEFyZ3NDbnQoKSA9PSAxKTsKKyAgYXJnc18ucHVzaF9iYWNrKHt4fSk7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6VW5pdChUaW1lVW5pdCB1bml0KSB7CisgIHRpbWVfdW5pdF8gPSB1bml0OworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlJhbmdlKGludDY0X3Qgc3RhcnQsIGludDY0X3QgbGltaXQpIHsKKyAgQ0hFQ0soQXJnc0NudCgpID09IC0xIHx8IEFyZ3NDbnQoKSA9PSAxKTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gYXJnbGlzdDsKKyAgQWRkUmFuZ2UoJmFyZ2xpc3QsIHN0YXJ0LCBsaW1pdCwgcmFuZ2VfbXVsdGlwbGllcl8pOworCisgIGZvciAoaW50NjRfdCBpIDogYXJnbGlzdCkgeworICAgIGFyZ3NfLnB1c2hfYmFjayh7aX0pOworICB9CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6UmFuZ2VzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQ2NF90LCBpbnQ2NF90Pj4mIHJhbmdlcykgeworICBDSEVDSyhBcmdzQ250KCkgPT0gLTEgfHwgQXJnc0NudCgpID09IHN0YXRpY19jYXN0PGludD4ocmFuZ2VzLnNpemUoKSkpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ2NF90Pj4gYXJnbGlzdHMocmFuZ2VzLnNpemUoKSk7CisgIHN0ZDo6c2l6ZV90IHRvdGFsID0gMTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHJhbmdlcy5zaXplKCk7IGkrKykgeworICAgIEFkZFJhbmdlKCZhcmdsaXN0c1tpXSwgcmFuZ2VzW2ldLmZpcnN0LCByYW5nZXNbaV0uc2Vjb25kLAorICAgICAgICAgICAgIHJhbmdlX211bHRpcGxpZXJfKTsKKyAgICB0b3RhbCAqPSBhcmdsaXN0c1tpXS5zaXplKCk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gY3RyKGFyZ2xpc3RzLnNpemUoKSwgMCk7CisKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiB0bXA7CisgICAgdG1wLnJlc2VydmUoYXJnbGlzdHMuc2l6ZSgpKTsKKworICAgIGZvciAoc3RkOjpzaXplX3QgaiA9IDA7IGogPCBhcmdsaXN0cy5zaXplKCk7IGorKykgeworICAgICAgdG1wLnB1c2hfYmFjayhhcmdsaXN0c1tqXS5hdChjdHJbal0pKTsKKyAgICB9CisKKyAgICBhcmdzXy5wdXNoX2JhY2soc3RkOjptb3ZlKHRtcCkpOworCisgICAgZm9yIChzdGQ6OnNpemVfdCBqID0gMDsgaiA8IGFyZ2xpc3RzLnNpemUoKTsgaisrKSB7CisgICAgICBpZiAoY3RyW2pdICsgMSA8IGFyZ2xpc3RzW2pdLnNpemUoKSkgeworICAgICAgICArK2N0cltqXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjdHJbal0gPSAwOworICAgIH0KKyAgfQorICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OkFyZ05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgQ0hFQ0soQXJnc0NudCgpID09IC0xIHx8IEFyZ3NDbnQoKSA9PSAxKTsKKyAgYXJnX25hbWVzXyA9IHtuYW1lfTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpBcmdOYW1lcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG5hbWVzKSB7CisgIENIRUNLKEFyZ3NDbnQoKSA9PSAtMSB8fCBBcmdzQ250KCkgPT0gc3RhdGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKTsKKyAgYXJnX25hbWVzXyA9IG5hbWVzOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OkRlbnNlUmFuZ2UoaW50NjRfdCBzdGFydCwgaW50NjRfdCBsaW1pdCwgaW50IHN0ZXApIHsKKyAgQ0hFQ0soQXJnc0NudCgpID09IC0xIHx8IEFyZ3NDbnQoKSA9PSAxKTsKKyAgQ0hFQ0tfTEUoc3RhcnQsIGxpbWl0KTsKKyAgZm9yIChpbnQ2NF90IGFyZyA9IHN0YXJ0OyBhcmcgPD0gbGltaXQ7IGFyZyArPSBzdGVwKSB7CisgICAgYXJnc18ucHVzaF9iYWNrKHthcmd9KTsKKyAgfQorICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OkFyZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGFyZ3MpIHsKKyAgQ0hFQ0soQXJnc0NudCgpID09IC0xIHx8IEFyZ3NDbnQoKSA9PSBzdGF0aWNfY2FzdDxpbnQ+KGFyZ3Muc2l6ZSgpKSk7CisgIGFyZ3NfLnB1c2hfYmFjayhhcmdzKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpBcHBseSh2b2lkICgqY3VzdG9tX2FyZ3VtZW50cykoQmVuY2htYXJrKiBiZW5jaG1hcmspKSB7CisgIGN1c3RvbV9hcmd1bWVudHModGhpcyk7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6UmFuZ2VNdWx0aXBsaWVyKGludCBtdWx0aXBsaWVyKSB7CisgIENIRUNLKG11bHRpcGxpZXIgPiAxKTsKKyAgcmFuZ2VfbXVsdGlwbGllcl8gPSBtdWx0aXBsaWVyOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6Ok1pblRpbWUoZG91YmxlIHQpIHsKKyAgQ0hFQ0sodCA+IDAuMCk7CisgIENIRUNLKGl0ZXJhdGlvbnNfID09IDApOworICBtaW5fdGltZV8gPSB0OworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6Okl0ZXJhdGlvbnMoSXRlcmF0aW9uQ291bnQgbikgeworICBDSEVDSyhuID4gMCk7CisgIENIRUNLKElzWmVybyhtaW5fdGltZV8pKTsKKyAgaXRlcmF0aW9uc18gPSBuOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlJlcGV0aXRpb25zKGludCBuKSB7CisgIENIRUNLKG4gPiAwKTsKKyAgcmVwZXRpdGlvbnNfID0gbjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpSZXBvcnRBZ2dyZWdhdGVzT25seShib29sIHZhbHVlKSB7CisgIGFnZ3JlZ2F0aW9uX3JlcG9ydF9tb2RlXyA9IHZhbHVlID8gQVJNX1JlcG9ydEFnZ3JlZ2F0ZXNPbmx5IDogQVJNX0RlZmF1bHQ7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6RGlzcGxheUFnZ3JlZ2F0ZXNPbmx5KGJvb2wgdmFsdWUpIHsKKyAgLy8gSWYgd2Ugd2VyZSBjYWxsZWQsIHRoZSByZXBvcnQgbW9kZSBpcyBubyBsb25nZXIgJ3Vuc3BlY2lmaWVkJywgaW4gYW55IGNhc2UuCisgIGFnZ3JlZ2F0aW9uX3JlcG9ydF9tb2RlXyA9IHN0YXRpY19jYXN0PEFnZ3JlZ2F0aW9uUmVwb3J0TW9kZT4oCisgICAgICBhZ2dyZWdhdGlvbl9yZXBvcnRfbW9kZV8gfCBBUk1fRGVmYXVsdCk7CisKKyAgaWYgKHZhbHVlKSB7CisgICAgYWdncmVnYXRpb25fcmVwb3J0X21vZGVfID0gc3RhdGljX2Nhc3Q8QWdncmVnYXRpb25SZXBvcnRNb2RlPigKKyAgICAgICAgYWdncmVnYXRpb25fcmVwb3J0X21vZGVfIHwgQVJNX0Rpc3BsYXlSZXBvcnRBZ2dyZWdhdGVzT25seSk7CisgIH0gZWxzZSB7CisgICAgYWdncmVnYXRpb25fcmVwb3J0X21vZGVfID0gc3RhdGljX2Nhc3Q8QWdncmVnYXRpb25SZXBvcnRNb2RlPigKKyAgICAgICAgYWdncmVnYXRpb25fcmVwb3J0X21vZGVfICYgfkFSTV9EaXNwbGF5UmVwb3J0QWdncmVnYXRlc09ubHkpOworICB9CisKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpNZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKSB7CisgIC8vIENhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggVXNlUmVhbFRpbWUoKSAvIFVzZU1hbnVhbFRpbWUoKS4KKyAgbWVhc3VyZV9wcm9jZXNzX2NwdV90aW1lXyA9IHRydWU7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6VXNlUmVhbFRpbWUoKSB7CisgIENIRUNLKCF1c2VfbWFudWFsX3RpbWVfKQorICAgICAgPDwgIkNhbm5vdCBzZXQgVXNlUmVhbFRpbWUgYW5kIFVzZU1hbnVhbFRpbWUgc2ltdWx0YW5lb3VzbHkuIjsKKyAgdXNlX3JlYWxfdGltZV8gPSB0cnVlOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlVzZU1hbnVhbFRpbWUoKSB7CisgIENIRUNLKCF1c2VfcmVhbF90aW1lXykKKyAgICAgIDw8ICJDYW5ub3Qgc2V0IFVzZVJlYWxUaW1lIGFuZCBVc2VNYW51YWxUaW1lIHNpbXVsdGFuZW91c2x5LiI7CisgIHVzZV9tYW51YWxfdGltZV8gPSB0cnVlOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OkNvbXBsZXhpdHkoQmlnTyBjb21wbGV4aXR5KSB7CisgIGNvbXBsZXhpdHlfID0gY29tcGxleGl0eTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpDb21wbGV4aXR5KEJpZ09GdW5jKiBjb21wbGV4aXR5KSB7CisgIGNvbXBsZXhpdHlfbGFtYmRhXyA9IGNvbXBsZXhpdHk7CisgIGNvbXBsZXhpdHlfID0gb0xhbWJkYTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpDb21wdXRlU3RhdGlzdGljcyhzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpc3RpY3NGdW5jKiBzdGF0aXN0aWNzKSB7CisgIHN0YXRpc3RpY3NfLmVtcGxhY2VfYmFjayhuYW1lLCBzdGF0aXN0aWNzKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpUaHJlYWRzKGludCB0KSB7CisgIENIRUNLX0dUKHQsIDApOworICB0aHJlYWRfY291bnRzXy5wdXNoX2JhY2sodCk7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6VGhyZWFkUmFuZ2UoaW50IG1pbl90aHJlYWRzLCBpbnQgbWF4X3RocmVhZHMpIHsKKyAgQ0hFQ0tfR1QobWluX3RocmVhZHMsIDApOworICBDSEVDS19HRShtYXhfdGhyZWFkcywgbWluX3RocmVhZHMpOworCisgIEFkZFJhbmdlKCZ0aHJlYWRfY291bnRzXywgbWluX3RocmVhZHMsIG1heF90aHJlYWRzLCAyKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpEZW5zZVRocmVhZFJhbmdlKGludCBtaW5fdGhyZWFkcywgaW50IG1heF90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICBDSEVDS19HVChtaW5fdGhyZWFkcywgMCk7CisgIENIRUNLX0dFKG1heF90aHJlYWRzLCBtaW5fdGhyZWFkcyk7CisgIENIRUNLX0dFKHN0cmlkZSwgMSk7CisKKyAgZm9yIChhdXRvIGkgPSBtaW5fdGhyZWFkczsgaSA8IG1heF90aHJlYWRzOyBpICs9IHN0cmlkZSkgeworICAgIHRocmVhZF9jb3VudHNfLnB1c2hfYmFjayhpKTsKKyAgfQorICB0aHJlYWRfY291bnRzXy5wdXNoX2JhY2sobWF4X3RocmVhZHMpOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlRocmVhZFBlckNwdSgpIHsKKyAgdGhyZWFkX2NvdW50c18ucHVzaF9iYWNrKENQVUluZm86OkdldCgpLm51bV9jcHVzKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3ZvaWQgQmVuY2htYXJrOjpTZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsgbmFtZV8gPSBuYW1lOyB9CisKK2ludCBCZW5jaG1hcms6OkFyZ3NDbnQoKSBjb25zdCB7CisgIGlmIChhcmdzXy5lbXB0eSgpKSB7CisgICAgaWYgKGFyZ19uYW1lc18uZW1wdHkoKSkgcmV0dXJuIC0xOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGFyZ19uYW1lc18uc2l6ZSgpKTsKKyAgfQorICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihhcmdzXy5mcm9udCgpLnNpemUoKSk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25CZW5jaG1hcmsKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCit2b2lkIEZ1bmN0aW9uQmVuY2htYXJrOjpSdW4oU3RhdGUmIHN0KSB7IGZ1bmNfKHN0KTsgfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3ZvaWQgQ2xlYXJSZWdpc3RlcmVkQmVuY2htYXJrcygpIHsKKyAgaW50ZXJuYWw6OkJlbmNobWFya0ZhbWlsaWVzOjpHZXRJbnN0YW5jZSgpLT5DbGVhckJlbmNobWFya3MoKTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfcmVnaXN0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfcmVnaXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM3N2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19yZWdpc3Rlci5oCkBAIC0wLDAgKzEsMTA3IEBACisjaWZuZGVmIEJFTkNITUFSS19SRUdJU1RFUl9ICisjZGVmaW5lIEJFTkNITUFSS19SRUdJU1RFUl9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjaGVjay5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEFwcGVuZCB0aGUgcG93ZXJzIG9mICdtdWx0JyBpbiB0aGUgY2xvc2VkIGludGVydmFsIFtsbywgaGldLgorLy8gUmV0dXJucyBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlIGluc2VydGVkIHJhbmdlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OnZlY3RvcjxUPjo6aXRlcmF0b3IKK0FkZFBvd2VycyhzdGQ6OnZlY3RvcjxUPiogZHN0LCBUIGxvLCBUIGhpLCBpbnQgbXVsdCkgeworICBDSEVDS19HRShsbywgMCk7CisgIENIRUNLX0dFKGhpLCBsbyk7CisgIENIRUNLX0dFKG11bHQsIDIpOworCisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSBkc3QtPnNpemUoKTsKKworICBzdGF0aWMgY29uc3QgVCBrbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisKKyAgLy8gU3BhY2Ugb3V0IHRoZSB2YWx1ZXMgaW4gbXVsdGlwbGVzIG9mICJtdWx0IgorICBmb3IgKFQgaSA9IDE7IGkgPD0gaGk7IGkgKj0gbXVsdCkgeworICAgIGlmIChpID49IGxvKSB7CisgICAgICBkc3QtPnB1c2hfYmFjayhpKTsKKyAgICB9CisgICAgLy8gQnJlYWsgdGhlIGxvb3AgaGVyZSBzaW5jZSBtdWx0aXBseWluZyBieQorICAgIC8vICdtdWx0JyB3b3VsZCBtb3ZlIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIFQKKyAgICBpZiAoaSA+IGttYXggLyBtdWx0KSBicmVhazsKKyAgfQorCisgIHJldHVybiBkc3QtPmJlZ2luKCkgKyBzdGFydF9vZmZzZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBBZGROZWdhdGVkUG93ZXJzKHN0ZDo6dmVjdG9yPFQ+KiBkc3QsIFQgbG8sIFQgaGksIGludCBtdWx0KSB7CisgIC8vIFdlIG5lZ2F0ZSBsbyBhbmQgaGkgc28gd2UgcmVxdWlyZSB0aGF0IHRoZXkgY2Fubm90IGJlIGVxdWFsIHRvICdtaW4nLgorICBDSEVDS19HVChsbywgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCkpOworICBDSEVDS19HVChoaSwgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCkpOworICBDSEVDS19HRShoaSwgbG8pOworICBDSEVDS19MRShoaSwgMCk7CisKKyAgLy8gQWRkIHBvc2l0aXZlIHBvd2VycywgdGhlbiBuZWdhdGUgYW5kIHJldmVyc2UuCisgIC8vIENhc3RzIG5lY2Vzc2FyeSBzaW5jZSBzbWFsbCBpbnRlZ2VycyBnZXQgcHJvbW90ZWQKKyAgLy8gdG8gJ2ludCcgd2hlbiBuZWdhdGluZy4KKyAgY29uc3QgYXV0byBsb19jb21wbGVtZW50ID0gc3RhdGljX2Nhc3Q8VD4oLWxvKTsKKyAgY29uc3QgYXV0byBoaV9jb21wbGVtZW50ID0gc3RhdGljX2Nhc3Q8VD4oLWhpKTsKKworICBjb25zdCBhdXRvIGl0ID0gQWRkUG93ZXJzKGRzdCwgaGlfY29tcGxlbWVudCwgbG9fY29tcGxlbWVudCwgbXVsdCk7CisKKyAgc3RkOjpmb3JfZWFjaChpdCwgZHN0LT5lbmQoKSwgW10oVCYgdCkgeyB0ICo9IC0xOyB9KTsKKyAgc3RkOjpyZXZlcnNlKGl0LCBkc3QtPmVuZCgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEFkZFJhbmdlKHN0ZDo6dmVjdG9yPFQ+KiBkc3QsIFQgbG8sIFQgaGksIGludCBtdWx0KSB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgJiYgc3RkOjppc19zaWduZWQ8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJBcmdzIHR5cGUgbXVzdCBiZSBhIHNpZ25lZCBpbnRlZ2VyIik7CisKKyAgQ0hFQ0tfR0UoaGksIGxvKTsKKyAgQ0hFQ0tfR0UobXVsdCwgMik7CisKKyAgLy8gQWRkICJsbyIKKyAgZHN0LT5wdXNoX2JhY2sobG8pOworCisgIC8vIEhhbmRsZSBsbyA9PSBoaSBhcyBhIHNwZWNpYWwgY2FzZSwgc28gd2UgdGhlbiBrbm93CisgIC8vIGxvIDwgaGkgYW5kIHNvIGl0IGlzIHNhZmUgdG8gYWRkIDEgdG8gbG8gYW5kIHN1YnRyYWN0IDEKKyAgLy8gZnJvbSBoaSB3aXRob3V0IGZhbGxpbmcgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgVC4KKyAgaWYgKGxvID09IGhpKSByZXR1cm47CisKKyAgLy8gRW5zdXJlIHRoYXQgbG9faW5uZXIgPD0gaGlfaW5uZXIgYmVsb3cuCisgIGlmIChsbyArIDEgPT0gaGkpIHsKKyAgICBkc3QtPnB1c2hfYmFjayhoaSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQWRkIGFsbCBwb3dlcnMgb2YgJ211bHQnIGluIHRoZSByYW5nZSBbbG8rMSwgaGktMV0gKGluY2x1c2l2ZSkuCisgIGNvbnN0IGF1dG8gbG9faW5uZXIgPSBzdGF0aWNfY2FzdDxUPihsbyArIDEpOworICBjb25zdCBhdXRvIGhpX2lubmVyID0gc3RhdGljX2Nhc3Q8VD4oaGkgLSAxKTsKKworICAvLyBJbnNlcnQgbmVnYXRpdmUgdmFsdWVzCisgIGlmIChsb19pbm5lciA8IDApIHsKKyAgICBBZGROZWdhdGVkUG93ZXJzKGRzdCwgbG9faW5uZXIsIHN0ZDo6bWluKGhpX2lubmVyLCBUey0xfSksIG11bHQpOworICB9CisKKyAgLy8gVHJlYXQgMCBhcyBhIHNwZWNpYWwgY2FzZSAoc2VlIGRpc2N1c3Npb24gb24gIzc2MikuCisgIGlmIChsbyA8PSAwICYmIGhpID49IDApIHsKKyAgICBkc3QtPnB1c2hfYmFjaygwKTsKKyAgfQorCisgIC8vIEluc2VydCBwb3NpdGl2ZSB2YWx1ZXMKKyAgaWYgKGhpX2lubmVyID4gMCkgeworICAgIEFkZFBvd2Vycyhkc3QsIHN0ZDo6bWF4KGxvX2lubmVyLCBUezF9KSwgaGlfaW5uZXIsIG11bHQpOworICB9CisKKyAgLy8gQWRkICJoaSIgKGlmIGRpZmZlcmVudCBmcm9tIGxhc3QgdmFsdWUpLgorICBpZiAoaGkgIT0gZHN0LT5iYWNrKCkpIHsKKyAgICBkc3QtPnB1c2hfYmFjayhoaSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX1JFR0lTVEVSX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfcnVubmVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19ydW5uZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3ZmFjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfcnVubmVyLmNjCkBAIC0wLDAgKzEsMzYxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYmVuY2htYXJrX3J1bm5lci5oIgorI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKyNpbmNsdWRlICJiZW5jaG1hcmtfYXBpX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisKKyNpZm5kZWYgQkVOQ0hNQVJLX09TX1dJTkRPV1MKKyNpZm5kZWYgQkVOQ0hNQVJLX09TX0ZVQ0hTSUEKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiY29sb3JwcmludC5oIgorI2luY2x1ZGUgImNvbW1hbmRsaW5lZmxhZ3MuaCIKKyNpbmNsdWRlICJjb21wbGV4aXR5LmgiCisjaW5jbHVkZSAiY291bnRlci5oIgorI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm11dGV4LmgiCisjaW5jbHVkZSAicmUuaCIKKyNpbmNsdWRlICJzdGF0aXN0aWNzLmgiCisjaW5jbHVkZSAic3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJ0aHJlYWRfbWFuYWdlci5oIgorI2luY2x1ZGUgInRocmVhZF90aW1lci5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworTWVtb3J5TWFuYWdlciogbWVtb3J5X21hbmFnZXIgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3RleHByIEl0ZXJhdGlvbkNvdW50IGtNYXhJdGVyYXRpb25zID0gMTAwMDAwMDAwMDsKKworQmVuY2htYXJrUmVwb3J0ZXI6OlJ1biBDcmVhdGVSdW5SZXBvcnQoCisgICAgY29uc3QgYmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrSW5zdGFuY2UmIGIsCisgICAgY29uc3QgaW50ZXJuYWw6OlRocmVhZE1hbmFnZXI6OlJlc3VsdCYgcmVzdWx0cywKKyAgICBJdGVyYXRpb25Db3VudCBtZW1vcnlfaXRlcmF0aW9ucywKKyAgICBjb25zdCBNZW1vcnlNYW5hZ2VyOjpSZXN1bHQmIG1lbW9yeV9yZXN1bHQsIGRvdWJsZSBzZWNvbmRzLAorICAgIGludDY0X3QgcmVwZXRpdGlvbl9pbmRleCkgeworICAvLyBDcmVhdGUgcmVwb3J0IGFib3V0IHRoaXMgYmVuY2htYXJrIHJ1bi4KKyAgQmVuY2htYXJrUmVwb3J0ZXI6OlJ1biByZXBvcnQ7CisKKyAgcmVwb3J0LnJ1bl9uYW1lID0gYi5uYW1lOworICByZXBvcnQuZXJyb3Jfb2NjdXJyZWQgPSByZXN1bHRzLmhhc19lcnJvcl87CisgIHJlcG9ydC5lcnJvcl9tZXNzYWdlID0gcmVzdWx0cy5lcnJvcl9tZXNzYWdlXzsKKyAgcmVwb3J0LnJlcG9ydF9sYWJlbCA9IHJlc3VsdHMucmVwb3J0X2xhYmVsXzsKKyAgLy8gVGhpcyBpcyB0aGUgdG90YWwgaXRlcmF0aW9ucyBhY3Jvc3MgYWxsIHRocmVhZHMuCisgIHJlcG9ydC5pdGVyYXRpb25zID0gcmVzdWx0cy5pdGVyYXRpb25zOworICByZXBvcnQudGltZV91bml0ID0gYi50aW1lX3VuaXQ7CisgIHJlcG9ydC50aHJlYWRzID0gYi50aHJlYWRzOworICByZXBvcnQucmVwZXRpdGlvbl9pbmRleCA9IHJlcGV0aXRpb25faW5kZXg7CisgIHJlcG9ydC5yZXBldGl0aW9ucyA9IGIucmVwZXRpdGlvbnM7CisKKyAgaWYgKCFyZXBvcnQuZXJyb3Jfb2NjdXJyZWQpIHsKKyAgICBpZiAoYi51c2VfbWFudWFsX3RpbWUpIHsKKyAgICAgIHJlcG9ydC5yZWFsX2FjY3VtdWxhdGVkX3RpbWUgPSByZXN1bHRzLm1hbnVhbF90aW1lX3VzZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcG9ydC5yZWFsX2FjY3VtdWxhdGVkX3RpbWUgPSByZXN1bHRzLnJlYWxfdGltZV91c2VkOworICAgIH0KKyAgICByZXBvcnQuY3B1X2FjY3VtdWxhdGVkX3RpbWUgPSByZXN1bHRzLmNwdV90aW1lX3VzZWQ7CisgICAgcmVwb3J0LmNvbXBsZXhpdHlfbiA9IHJlc3VsdHMuY29tcGxleGl0eV9uOworICAgIHJlcG9ydC5jb21wbGV4aXR5ID0gYi5jb21wbGV4aXR5OworICAgIHJlcG9ydC5jb21wbGV4aXR5X2xhbWJkYSA9IGIuY29tcGxleGl0eV9sYW1iZGE7CisgICAgcmVwb3J0LnN0YXRpc3RpY3MgPSBiLnN0YXRpc3RpY3M7CisgICAgcmVwb3J0LmNvdW50ZXJzID0gcmVzdWx0cy5jb3VudGVyczsKKworICAgIGlmIChtZW1vcnlfaXRlcmF0aW9ucyA+IDApIHsKKyAgICAgIHJlcG9ydC5oYXNfbWVtb3J5X3Jlc3VsdCA9IHRydWU7CisgICAgICByZXBvcnQuYWxsb2NzX3Blcl9pdGVyID0KKyAgICAgICAgICBtZW1vcnlfaXRlcmF0aW9ucyA/IHN0YXRpY19jYXN0PGRvdWJsZT4obWVtb3J5X3Jlc3VsdC5udW1fYWxsb2NzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X2l0ZXJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICByZXBvcnQubWF4X2J5dGVzX3VzZWQgPSBtZW1vcnlfcmVzdWx0Lm1heF9ieXRlc191c2VkOworICAgIH0KKworICAgIGludGVybmFsOjpGaW5pc2goJnJlcG9ydC5jb3VudGVycywgcmVzdWx0cy5pdGVyYXRpb25zLCBzZWNvbmRzLCBiLnRocmVhZHMpOworICB9CisgIHJldHVybiByZXBvcnQ7Cit9CisKKy8vIEV4ZWN1dGUgb25lIHRocmVhZCBvZiBiZW5jaG1hcmsgYiBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaXRlcmF0aW9ucy4KKy8vIEFkZHMgdGhlIHN0YXRzIGNvbGxlY3RlZCBmb3IgdGhlIHRocmVhZCBpbnRvICp0b3RhbC4KK3ZvaWQgUnVuSW5UaHJlYWQoY29uc3QgQmVuY2htYXJrSW5zdGFuY2UqIGIsIEl0ZXJhdGlvbkNvdW50IGl0ZXJzLAorICAgICAgICAgICAgICAgICBpbnQgdGhyZWFkX2lkLCBUaHJlYWRNYW5hZ2VyKiBtYW5hZ2VyKSB7CisgIGludGVybmFsOjpUaHJlYWRUaW1lciB0aW1lcigKKyAgICAgIGItPm1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZQorICAgICAgICAgID8gaW50ZXJuYWw6OlRocmVhZFRpbWVyOjpDcmVhdGVQcm9jZXNzQ3B1VGltZSgpCisgICAgICAgICAgOiBpbnRlcm5hbDo6VGhyZWFkVGltZXI6OkNyZWF0ZSgpKTsKKyAgU3RhdGUgc3QgPSBiLT5SdW4oaXRlcnMsIHRocmVhZF9pZCwgJnRpbWVyLCBtYW5hZ2VyKTsKKyAgQ0hFQ0soc3QuaXRlcmF0aW9ucygpID49IHN0Lm1heF9pdGVyYXRpb25zKQorICAgICAgPDwgIkJlbmNobWFyayByZXR1cm5lZCBiZWZvcmUgU3RhdGU6OktlZXBSdW5uaW5nKCkgcmV0dXJuZWQgZmFsc2UhIjsKKyAgeworICAgIE11dGV4TG9jayBsKG1hbmFnZXItPkdldEJlbmNobWFya011dGV4KCkpOworICAgIGludGVybmFsOjpUaHJlYWRNYW5hZ2VyOjpSZXN1bHQmIHJlc3VsdHMgPSBtYW5hZ2VyLT5yZXN1bHRzOworICAgIHJlc3VsdHMuaXRlcmF0aW9ucyArPSBzdC5pdGVyYXRpb25zKCk7CisgICAgcmVzdWx0cy5jcHVfdGltZV91c2VkICs9IHRpbWVyLmNwdV90aW1lX3VzZWQoKTsKKyAgICByZXN1bHRzLnJlYWxfdGltZV91c2VkICs9IHRpbWVyLnJlYWxfdGltZV91c2VkKCk7CisgICAgcmVzdWx0cy5tYW51YWxfdGltZV91c2VkICs9IHRpbWVyLm1hbnVhbF90aW1lX3VzZWQoKTsKKyAgICByZXN1bHRzLmNvbXBsZXhpdHlfbiArPSBzdC5jb21wbGV4aXR5X2xlbmd0aF9uKCk7CisgICAgaW50ZXJuYWw6OkluY3JlbWVudCgmcmVzdWx0cy5jb3VudGVycywgc3QuY291bnRlcnMpOworICB9CisgIG1hbmFnZXItPk5vdGlmeVRocmVhZENvbXBsZXRlKCk7Cit9CisKK2NsYXNzIEJlbmNobWFya1J1bm5lciB7CisgcHVibGljOgorICBCZW5jaG1hcmtSdW5uZXIoY29uc3QgYmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrSW5zdGFuY2UmIGJfLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4qIGNvbXBsZXhpdHlfcmVwb3J0c18pCisgICAgICA6IGIoYl8pLAorICAgICAgICBjb21wbGV4aXR5X3JlcG9ydHMoKmNvbXBsZXhpdHlfcmVwb3J0c18pLAorICAgICAgICBtaW5fdGltZSghSXNaZXJvKGIubWluX3RpbWUpID8gYi5taW5fdGltZSA6IEZMQUdTX2JlbmNobWFya19taW5fdGltZSksCisgICAgICAgIHJlcGVhdHMoYi5yZXBldGl0aW9ucyAhPSAwID8gYi5yZXBldGl0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZMQUdTX2JlbmNobWFya19yZXBldGl0aW9ucyksCisgICAgICAgIGhhc19leHBsaWNpdF9pdGVyYXRpb25fY291bnQoYi5pdGVyYXRpb25zICE9IDApLAorICAgICAgICBwb29sKGIudGhyZWFkcyAtIDEpLAorICAgICAgICBpdGVycyhoYXNfZXhwbGljaXRfaXRlcmF0aW9uX2NvdW50ID8gYi5pdGVyYXRpb25zIDogMSkgeworICAgIHJ1bl9yZXN1bHRzLmRpc3BsYXlfcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seSA9CisgICAgICAgIChGTEFHU19iZW5jaG1hcmtfcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seSB8fAorICAgICAgICAgRkxBR1NfYmVuY2htYXJrX2Rpc3BsYXlfYWdncmVnYXRlc19vbmx5KTsKKyAgICBydW5fcmVzdWx0cy5maWxlX3JlcG9ydF9hZ2dyZWdhdGVzX29ubHkgPQorICAgICAgICBGTEFHU19iZW5jaG1hcmtfcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seTsKKyAgICBpZiAoYi5hZ2dyZWdhdGlvbl9yZXBvcnRfbW9kZSAhPSBpbnRlcm5hbDo6QVJNX1Vuc3BlY2lmaWVkKSB7CisgICAgICBydW5fcmVzdWx0cy5kaXNwbGF5X3JlcG9ydF9hZ2dyZWdhdGVzX29ubHkgPQorICAgICAgICAgIChiLmFnZ3JlZ2F0aW9uX3JlcG9ydF9tb2RlICYKKyAgICAgICAgICAgaW50ZXJuYWw6OkFSTV9EaXNwbGF5UmVwb3J0QWdncmVnYXRlc09ubHkpOworICAgICAgcnVuX3Jlc3VsdHMuZmlsZV9yZXBvcnRfYWdncmVnYXRlc19vbmx5ID0KKyAgICAgICAgICAoYi5hZ2dyZWdhdGlvbl9yZXBvcnRfbW9kZSAmIGludGVybmFsOjpBUk1fRmlsZVJlcG9ydEFnZ3JlZ2F0ZXNPbmx5KTsKKyAgICB9CisKKyAgICBmb3IgKGludCByZXBldGl0aW9uX251bSA9IDA7IHJlcGV0aXRpb25fbnVtIDwgcmVwZWF0czsgcmVwZXRpdGlvbl9udW0rKykgeworICAgICAgRG9PbmVSZXBldGl0aW9uKHJlcGV0aXRpb25fbnVtKTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgYWRkaXRpb25hbCBzdGF0aXN0aWNzCisgICAgcnVuX3Jlc3VsdHMuYWdncmVnYXRlc19vbmx5ID0gQ29tcHV0ZVN0YXRzKHJ1bl9yZXN1bHRzLm5vbl9hZ2dyZWdhdGVzKTsKKworICAgIC8vIE1heWJlIGNhbGN1bGF0ZSBjb21wbGV4aXR5IHJlcG9ydAorICAgIGlmICgoYi5jb21wbGV4aXR5ICE9IG9Ob25lKSAmJiBiLmxhc3RfYmVuY2htYXJrX2luc3RhbmNlKSB7CisgICAgICBhdXRvIGFkZGl0aW9uYWxfcnVuX3N0YXRzID0gQ29tcHV0ZUJpZ08oY29tcGxleGl0eV9yZXBvcnRzKTsKKyAgICAgIHJ1bl9yZXN1bHRzLmFnZ3JlZ2F0ZXNfb25seS5pbnNlcnQocnVuX3Jlc3VsdHMuYWdncmVnYXRlc19vbmx5LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX3J1bl9zdGF0cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX3J1bl9zdGF0cy5lbmQoKSk7CisgICAgICBjb21wbGV4aXR5X3JlcG9ydHMuY2xlYXIoKTsKKyAgICB9CisgIH0KKworICBSdW5SZXN1bHRzJiYgZ2V0X3Jlc3VsdHMoKSB7IHJldHVybiBzdGQ6Om1vdmUocnVuX3Jlc3VsdHMpOyB9CisKKyBwcml2YXRlOgorICBSdW5SZXN1bHRzIHJ1bl9yZXN1bHRzOworCisgIGNvbnN0IGJlbmNobWFyazo6aW50ZXJuYWw6OkJlbmNobWFya0luc3RhbmNlJiBiOworICBzdGQ6OnZlY3RvcjxCZW5jaG1hcmtSZXBvcnRlcjo6UnVuPiYgY29tcGxleGl0eV9yZXBvcnRzOworCisgIGNvbnN0IGRvdWJsZSBtaW5fdGltZTsKKyAgY29uc3QgaW50IHJlcGVhdHM7CisgIGNvbnN0IGJvb2wgaGFzX2V4cGxpY2l0X2l0ZXJhdGlvbl9jb3VudDsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnRocmVhZD4gcG9vbDsKKworICBJdGVyYXRpb25Db3VudCBpdGVyczsgIC8vIHByZXNlcnZlZCBiZXR3ZWVuIHJlcGV0aXRpb25zIQorICAvLyBTbyBvbmx5IHRoZSBmaXJzdCByZXBldGl0aW9uIGhhcyB0byBmaW5kL2NhbGN1bGF0ZSBpdCwKKyAgLy8gdGhlIG90aGVyIHJlcGV0aXRpb25zIHdpbGwganVzdCB1c2UgdGhhdCBwcmVjb21wdXRlZCBpdGVyYXRpb24gY291bnQuCisKKyAgc3RydWN0IEl0ZXJhdGlvblJlc3VsdHMgeworICAgIGludGVybmFsOjpUaHJlYWRNYW5hZ2VyOjpSZXN1bHQgcmVzdWx0czsKKyAgICBJdGVyYXRpb25Db3VudCBpdGVyczsKKyAgICBkb3VibGUgc2Vjb25kczsKKyAgfTsKKyAgSXRlcmF0aW9uUmVzdWx0cyBEb05JdGVyYXRpb25zKCkgeworICAgIFZMT0coMikgPDwgIlJ1bm5pbmcgIiA8PCBiLm5hbWUuc3RyKCkgPDwgIiBmb3IgIiA8PCBpdGVycyA8PCAiXG4iOworCisgICAgc3RkOjp1bmlxdWVfcHRyPGludGVybmFsOjpUaHJlYWRNYW5hZ2VyPiBtYW5hZ2VyOworICAgIG1hbmFnZXIucmVzZXQobmV3IGludGVybmFsOjpUaHJlYWRNYW5hZ2VyKGIudGhyZWFkcykpOworCisgICAgLy8gUnVuIGFsbCBidXQgb25lIHRocmVhZCBpbiBzZXBhcmF0ZSB0aHJlYWRzCisgICAgZm9yIChzdGQ6OnNpemVfdCB0aSA9IDA7IHRpIDwgcG9vbC5zaXplKCk7ICsrdGkpIHsKKyAgICAgIHBvb2xbdGldID0gc3RkOjp0aHJlYWQoJlJ1bkluVGhyZWFkLCAmYiwgaXRlcnMsIHN0YXRpY19jYXN0PGludD4odGkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXQoKSk7CisgICAgfQorICAgIC8vIEFuZCBydW4gb25lIHRocmVhZCBoZXJlIGRpcmVjdGx5LgorICAgIC8vIChJZiB3ZSB3ZXJlIGFza2VkIHRvIHJ1biBqdXN0IG9uZSB0aHJlYWQsIHdlIGRvbid0IGNyZWF0ZSBuZXcgdGhyZWFkcy4pCisgICAgLy8gWWVzLCB3ZSBuZWVkIHRvIGRvIHRoaXMgaGVyZSAqYWZ0ZXIqIHdlIHN0YXJ0IHRoZSBzZXBhcmF0ZSB0aHJlYWRzLgorICAgIFJ1bkluVGhyZWFkKCZiLCBpdGVycywgMCwgbWFuYWdlci5nZXQoKSk7CisKKyAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIGZpbmlzaGVkLiBOb3cgbGV0J3Mgd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZHMuCisgICAgbWFuYWdlci0+V2FpdEZvckFsbFRocmVhZHMoKTsKKyAgICBmb3IgKHN0ZDo6dGhyZWFkJiB0aHJlYWQgOiBwb29sKSB0aHJlYWQuam9pbigpOworCisgICAgSXRlcmF0aW9uUmVzdWx0cyBpOworICAgIC8vIEFjcXVpcmUgdGhlIG1lYXN1cmVtZW50cy9jb3VudGVycyBmcm9tIHRoZSBtYW5hZ2VyLCBVTkRFUiBUSEUgTE9DSyEKKyAgICB7CisgICAgICBNdXRleExvY2sgbChtYW5hZ2VyLT5HZXRCZW5jaG1hcmtNdXRleCgpKTsKKyAgICAgIGkucmVzdWx0cyA9IG1hbmFnZXItPnJlc3VsdHM7CisgICAgfQorCisgICAgLy8gQW5kIGdldCByaWQgb2YgdGhlIG1hbmFnZXIuCisgICAgbWFuYWdlci5yZXNldCgpOworCisgICAgLy8gQWRqdXN0IHJlYWwvbWFudWFsIHRpbWUgc3RhdHMgc2luY2UgdGhleSB3ZXJlIHJlcG9ydGVkIHBlciB0aHJlYWQuCisgICAgaS5yZXN1bHRzLnJlYWxfdGltZV91c2VkIC89IGIudGhyZWFkczsKKyAgICBpLnJlc3VsdHMubWFudWFsX3RpbWVfdXNlZCAvPSBiLnRocmVhZHM7CisgICAgLy8gSWYgd2Ugd2VyZSBtZWFzdXJpbmcgd2hvbGUtcHJvY2VzcyBDUFUgdXNhZ2UsIGFkanVzdCB0aGUgQ1BVIHRpbWUgdG9vLgorICAgIGlmIChiLm1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZSkgaS5yZXN1bHRzLmNwdV90aW1lX3VzZWQgLz0gYi50aHJlYWRzOworCisgICAgVkxPRygyKSA8PCAiUmFuIGluICIgPDwgaS5yZXN1bHRzLmNwdV90aW1lX3VzZWQgPDwgIi8iCisgICAgICAgICAgICA8PCBpLnJlc3VsdHMucmVhbF90aW1lX3VzZWQgPDwgIlxuIjsKKworICAgIC8vIFNvIGZvciBob3cgbG9uZyB3ZXJlIHdlIHJ1bm5pbmc/CisgICAgaS5pdGVycyA9IGl0ZXJzOworICAgIC8vIEJhc2UgZGVjaXNpb25zIG9mZiBvZiByZWFsIHRpbWUgaWYgcmVxdWVzdGVkIGJ5IHRoaXMgYmVuY2htYXJrLgorICAgIGkuc2Vjb25kcyA9IGkucmVzdWx0cy5jcHVfdGltZV91c2VkOworICAgIGlmIChiLnVzZV9tYW51YWxfdGltZSkgeworICAgICAgaS5zZWNvbmRzID0gaS5yZXN1bHRzLm1hbnVhbF90aW1lX3VzZWQ7CisgICAgfSBlbHNlIGlmIChiLnVzZV9yZWFsX3RpbWUpIHsKKyAgICAgIGkuc2Vjb25kcyA9IGkucmVzdWx0cy5yZWFsX3RpbWVfdXNlZDsKKyAgICB9CisKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIEl0ZXJhdGlvbkNvdW50IFByZWRpY3ROdW1JdGVyc05lZWRlZChjb25zdCBJdGVyYXRpb25SZXN1bHRzJiBpKSBjb25zdCB7CisgICAgLy8gU2VlIGhvdyBtdWNoIGl0ZXJhdGlvbnMgc2hvdWxkIGJlIGluY3JlYXNlZCBieS4KKyAgICAvLyBOb3RlOiBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvIHdpdGggbWF4KHNlY29uZHMsIDFucykuCisgICAgZG91YmxlIG11bHRpcGxpZXIgPSBtaW5fdGltZSAqIDEuNCAvIHN0ZDo6bWF4KGkuc2Vjb25kcywgMWUtOSk7CisgICAgLy8gSWYgb3VyIGxhc3QgcnVuIHdhcyBhdCBsZWFzdCAxMCUgb2YgRkxBR1NfYmVuY2htYXJrX21pbl90aW1lIHRoZW4gd2UKKyAgICAvLyB1c2UgdGhlIG11bHRpcGxpZXIgZGlyZWN0bHkuCisgICAgLy8gT3RoZXJ3aXNlIHdlIHVzZSBhdCBtb3N0IDEwIHRpbWVzIGV4cGFuc2lvbi4KKyAgICAvLyBOT1RFOiBXaGVuIHRoZSBsYXN0IHJ1biB3YXMgYXQgbGVhc3QgMTAlIG9mIHRoZSBtaW4gdGltZSB0aGUgbWF4CisgICAgLy8gZXhwYW5zaW9uIHNob3VsZCBiZSAxNHguCisgICAgYm9vbCBpc19zaWduaWZpY2FudCA9IChpLnNlY29uZHMgLyBtaW5fdGltZSkgPiAwLjE7CisgICAgbXVsdGlwbGllciA9IGlzX3NpZ25pZmljYW50ID8gbXVsdGlwbGllciA6IHN0ZDo6bWluKDEwLjAsIG11bHRpcGxpZXIpOworICAgIGlmIChtdWx0aXBsaWVyIDw9IDEuMCkgbXVsdGlwbGllciA9IDIuMDsKKworICAgIC8vIFNvIHdoYXQgc2VlbXMgdG8gYmUgdGhlIHN1ZmZpY2llbnRseS1sYXJnZSBpdGVyYXRpb24gY291bnQ/IFJvdW5kIHVwLgorICAgIGNvbnN0IEl0ZXJhdGlvbkNvdW50IG1heF9uZXh0X2l0ZXJzID0KKyAgICAgICAgc3RkOjpscm91bmQoc3RkOjptYXgobXVsdGlwbGllciAqIGkuaXRlcnMsIGkuaXRlcnMgKyAxLjApKTsKKyAgICAvLyBCdXQgd2UgZG8gaGF2ZSAqc29tZSogc2FuaXR5IGxpbWl0cyB0aG91Z2guLgorICAgIGNvbnN0IEl0ZXJhdGlvbkNvdW50IG5leHRfaXRlcnMgPSBzdGQ6Om1pbihtYXhfbmV4dF9pdGVycywga01heEl0ZXJhdGlvbnMpOworCisgICAgVkxPRygzKSA8PCAiTmV4dCBpdGVyczogIiA8PCBuZXh0X2l0ZXJzIDw8ICIsICIgPDwgbXVsdGlwbGllciA8PCAiXG4iOworICAgIHJldHVybiBuZXh0X2l0ZXJzOyAgLy8gcm91bmQgdXAgYmVmb3JlIGNvbnZlcnNpb24gdG8gaW50ZWdlci4KKyAgfQorCisgIGJvb2wgU2hvdWxkUmVwb3J0SXRlcmF0aW9uUmVzdWx0cyhjb25zdCBJdGVyYXRpb25SZXN1bHRzJiBpKSBjb25zdCB7CisgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgcnVuIHNob3VsZCBiZSByZXBvcnRlZDsKKyAgICAvLyBFaXRoZXIgaXQgaGFzIHJ1biBmb3IgYSBzdWZmaWNpZW50IGFtb3VudCBvZiB0aW1lCisgICAgLy8gb3IgYmVjYXVzZSBhbiBlcnJvciB3YXMgcmVwb3J0ZWQuCisgICAgcmV0dXJuIGkucmVzdWx0cy5oYXNfZXJyb3JfIHx8CisgICAgICAgICAgIGkuaXRlcnMgPj0ga01heEl0ZXJhdGlvbnMgfHwgIC8vIFRvbyBtYW55IGl0ZXJhdGlvbnMgYWxyZWFkeS4KKyAgICAgICAgICAgaS5zZWNvbmRzID49IG1pbl90aW1lIHx8ICAgICAgLy8gVGhlIGVsYXBzZWQgdGltZSBpcyBsYXJnZSBlbm91Z2guCisgICAgICAgICAgIC8vIENQVSB0aW1lIGlzIHNwZWNpZmllZCBidXQgdGhlIGVsYXBzZWQgcmVhbCB0aW1lIGdyZWF0bHkgZXhjZWVkcworICAgICAgICAgICAvLyB0aGUgbWluaW11bSB0aW1lLgorICAgICAgICAgICAvLyBOb3RlIHRoYXQgdXNlciBwcm92aWRlZCB0aW1lcnMgYXJlIGV4Y2VwdCBmcm9tIHRoaXMgc2FuaXR5IGNoZWNrLgorICAgICAgICAgICAoKGkucmVzdWx0cy5yZWFsX3RpbWVfdXNlZCA+PSA1ICogbWluX3RpbWUpICYmICFiLnVzZV9tYW51YWxfdGltZSk7CisgIH0KKworICB2b2lkIERvT25lUmVwZXRpdGlvbihpbnQ2NF90IHJlcGV0aXRpb25faW5kZXgpIHsKKyAgICBjb25zdCBib29sIGlzX3RoZV9maXJzdF9yZXBldGl0aW9uID0gcmVwZXRpdGlvbl9pbmRleCA9PSAwOworICAgIEl0ZXJhdGlvblJlc3VsdHMgaTsKKworICAgIC8vIFdlICptYXkqIGJlIGdyYWR1YWxseSBpbmNyZWFzaW5nIHRoZSBsZW5ndGggKGl0ZXJhdGlvbiBjb3VudCkKKyAgICAvLyBvZiB0aGUgYmVuY2htYXJrIHVudGlsIHdlIGRlY2lkZSB0aGUgcmVzdWx0cyBhcmUgc2lnbmlmaWNhbnQuCisgICAgLy8gQW5kIG9uY2Ugd2UgZG8sIHdlIHJlcG9ydCB0aG9zZSBsYXN0IHJlc3VsdHMgYW5kIGV4aXQuCisgICAgLy8gUGxlYXNlIGRvIG5vdGUgdGhhdCB0aGUgaWYgdGhlcmUgYXJlIHJlcGV0aXRpb25zLCB0aGUgaXRlcmF0aW9uIGNvdW50CisgICAgLy8gaXMgKm9ubHkqIGNhbGN1bGF0ZWQgZm9yIHRoZSAqZmlyc3QqIHJlcGV0aXRpb24sIGFuZCBvdGhlciByZXBldGl0aW9ucworICAgIC8vIHNpbXBseSB1c2UgdGhhdCBwcmVjb21wdXRlZCBpdGVyYXRpb24gY291bnQuCisgICAgZm9yICg7OykgeworICAgICAgaSA9IERvTkl0ZXJhdGlvbnMoKTsKKworICAgICAgLy8gRG8gd2UgY29uc2lkZXIgdGhlIHJlc3VsdHMgdG8gYmUgc2lnbmlmaWNhbnQ/CisgICAgICAvLyBJZiB3ZSBhcmUgZG9pbmcgcmVwZXRpdGlvbnMsIGFuZCB0aGUgZmlyc3QgcmVwZXRpdGlvbiB3YXMgYWxyZWFkeSBkb25lLAorICAgICAgLy8gaXQgaGFzIGNhbGN1bGF0ZWQgdGhlIGNvcnJlY3QgaXRlcmF0aW9uIHRpbWUsIHNvIHdlIGhhdmUgcnVuIHRoYXQgdmVyeQorICAgICAgLy8gaXRlcmF0aW9uIGNvdW50IGp1c3Qgbm93LiBObyBuZWVkIHRvIGNhbGN1bGF0ZSBhbnl0aGluZy4gSnVzdCByZXBvcnQuCisgICAgICAvLyBFbHNlLCB0aGUgbm9ybWFsIHJ1bGVzIGFwcGx5LgorICAgICAgY29uc3QgYm9vbCByZXN1bHRzX2FyZV9zaWduaWZpY2FudCA9ICFpc190aGVfZmlyc3RfcmVwZXRpdGlvbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19leHBsaWNpdF9pdGVyYXRpb25fY291bnQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG91bGRSZXBvcnRJdGVyYXRpb25SZXN1bHRzKGkpOworCisgICAgICBpZiAocmVzdWx0c19hcmVfc2lnbmlmaWNhbnQpIGJyZWFrOyAgLy8gR29vZCwgbGV0J3MgcmVwb3J0IHRoZW0hCisKKyAgICAgIC8vIE5vcGUsIGJhZCBpdGVyYXRpb24uIExldCdzIHJlLWVzdGltYXRlIHRoZSBob3BlZnVsbHktc3VmZmljaWVudAorICAgICAgLy8gaXRlcmF0aW9uIGNvdW50LCBhbmQgcnVuIHRoZSBiZW5jaG1hcmsgYWdhaW4uLi4KKworICAgICAgaXRlcnMgPSBQcmVkaWN0TnVtSXRlcnNOZWVkZWQoaSk7CisgICAgICBhc3NlcnQoaXRlcnMgPiBpLml0ZXJzICYmCisgICAgICAgICAgICAgImlmIHdlIGRpZCBtb3JlIGl0ZXJhdGlvbnMgdGhhbiB3ZSB3YW50IHRvIGRvIHRoZSBuZXh0IHRpbWUsICIKKyAgICAgICAgICAgICAidGhlbiB3ZSBzaG91bGQgaGF2ZSBhY2NlcHRlZCB0aGUgY3VycmVudCBpdGVyYXRpb24gcnVuLiIpOworICAgIH0KKworICAgIC8vIE9oLCBvbmUgbGFzdCB0aGluZywgd2UgbmVlZCB0byBhbHNvIHByb2R1Y2UgdGhlICdtZW1vcnkgbWVhc3VyZW1lbnRzJy4uCisgICAgTWVtb3J5TWFuYWdlcjo6UmVzdWx0IG1lbW9yeV9yZXN1bHQ7CisgICAgSXRlcmF0aW9uQ291bnQgbWVtb3J5X2l0ZXJhdGlvbnMgPSAwOworICAgIGlmIChtZW1vcnlfbWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAvLyBPbmx5IHJ1biBhIGZldyBpdGVyYXRpb25zIHRvIHJlZHVjZSB0aGUgaW1wYWN0IG9mIG9uZS10aW1lCisgICAgICAvLyBhbGxvY2F0aW9ucyBpbiBiZW5jaG1hcmtzIHRoYXQgYXJlIG5vdCBwcm9wZXJseSBtYW5hZ2VkLgorICAgICAgbWVtb3J5X2l0ZXJhdGlvbnMgPSBzdGQ6Om1pbjxJdGVyYXRpb25Db3VudD4oMTYsIGl0ZXJzKTsKKyAgICAgIG1lbW9yeV9tYW5hZ2VyLT5TdGFydCgpOworICAgICAgc3RkOjp1bmlxdWVfcHRyPGludGVybmFsOjpUaHJlYWRNYW5hZ2VyPiBtYW5hZ2VyOworICAgICAgbWFuYWdlci5yZXNldChuZXcgaW50ZXJuYWw6OlRocmVhZE1hbmFnZXIoMSkpOworICAgICAgUnVuSW5UaHJlYWQoJmIsIG1lbW9yeV9pdGVyYXRpb25zLCAwLCBtYW5hZ2VyLmdldCgpKTsKKyAgICAgIG1hbmFnZXItPldhaXRGb3JBbGxUaHJlYWRzKCk7CisgICAgICBtYW5hZ2VyLnJlc2V0KCk7CisKKyAgICAgIG1lbW9yeV9tYW5hZ2VyLT5TdG9wKCZtZW1vcnlfcmVzdWx0KTsKKyAgICB9CisKKyAgICAvLyBPaywgbm93IGFjdHVhbHkgcmVwb3J0LgorICAgIEJlbmNobWFya1JlcG9ydGVyOjpSdW4gcmVwb3J0ID0KKyAgICAgICAgQ3JlYXRlUnVuUmVwb3J0KGIsIGkucmVzdWx0cywgbWVtb3J5X2l0ZXJhdGlvbnMsIG1lbW9yeV9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpLnNlY29uZHMsIHJlcGV0aXRpb25faW5kZXgpOworCisgICAgaWYgKCFyZXBvcnQuZXJyb3Jfb2NjdXJyZWQgJiYgYi5jb21wbGV4aXR5ICE9IG9Ob25lKQorICAgICAgY29tcGxleGl0eV9yZXBvcnRzLnB1c2hfYmFjayhyZXBvcnQpOworCisgICAgcnVuX3Jlc3VsdHMubm9uX2FnZ3JlZ2F0ZXMucHVzaF9iYWNrKHJlcG9ydCk7CisgIH0KK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKworUnVuUmVzdWx0cyBSdW5CZW5jaG1hcmsoCisgICAgY29uc3QgYmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrSW5zdGFuY2UmIGIsCisgICAgc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4qIGNvbXBsZXhpdHlfcmVwb3J0cykgeworICBpbnRlcm5hbDo6QmVuY2htYXJrUnVubmVyIHIoYiwgY29tcGxleGl0eV9yZXBvcnRzKTsKKyAgcmV0dXJuIHIuZ2V0X3Jlc3VsdHMoKTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19ydW5uZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfcnVubmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlODI4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfcnVubmVyLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBCRU5DSE1BUktfUlVOTkVSX0hfCisjZGVmaW5lIEJFTkNITUFSS19SVU5ORVJfSF8KKworI2luY2x1ZGUgImJlbmNobWFya19hcGlfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKworREVDTEFSRV9kb3VibGUoYmVuY2htYXJrX21pbl90aW1lKTsKKworREVDTEFSRV9pbnQzMihiZW5jaG1hcmtfcmVwZXRpdGlvbnMpOworCitERUNMQVJFX2Jvb2woYmVuY2htYXJrX3JlcG9ydF9hZ2dyZWdhdGVzX29ubHkpOworCitERUNMQVJFX2Jvb2woYmVuY2htYXJrX2Rpc3BsYXlfYWdncmVnYXRlc19vbmx5KTsKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2V4dGVybiBNZW1vcnlNYW5hZ2VyKiBtZW1vcnlfbWFuYWdlcjsKKworc3RydWN0IFJ1blJlc3VsdHMgeworICBzdGQ6OnZlY3RvcjxCZW5jaG1hcmtSZXBvcnRlcjo6UnVuPiBub25fYWdncmVnYXRlczsKKyAgc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4gYWdncmVnYXRlc19vbmx5OworCisgIGJvb2wgZGlzcGxheV9yZXBvcnRfYWdncmVnYXRlc19vbmx5ID0gZmFsc2U7CisgIGJvb2wgZmlsZV9yZXBvcnRfYWdncmVnYXRlc19vbmx5ID0gZmFsc2U7Cit9OworCitSdW5SZXN1bHRzIFJ1bkJlbmNobWFyaygKKyAgICBjb25zdCBiZW5jaG1hcms6OmludGVybmFsOjpCZW5jaG1hcmtJbnN0YW5jZSYgYiwKKyAgICBzdGQ6OnZlY3RvcjxCZW5jaG1hcmtSZXBvcnRlcjo6UnVuPiogY29tcGxleGl0eV9yZXBvcnRzKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX1JVTk5FUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NoZWNrLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWY4MjUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NoZWNrLmgKQEAgLTAsMCArMSw4MiBAQAorI2lmbmRlZiBDSEVDS19IXworI2RlZmluZSBDSEVDS19IXworCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisjaW5jbHVkZSAibG9nLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordHlwZWRlZiB2b2lkKEFib3J0SGFuZGxlclQpKCk7CisKK2lubGluZSBBYm9ydEhhbmRsZXJUKiYgR2V0QWJvcnRIYW5kbGVyKCkgeworICBzdGF0aWMgQWJvcnRIYW5kbGVyVCogaGFuZGxlciA9ICZzdGQ6OmFib3J0OworICByZXR1cm4gaGFuZGxlcjsKK30KKworQkVOQ0hNQVJLX05PUkVUVVJOIGlubGluZSB2b2lkIENhbGxBYm9ydEhhbmRsZXIoKSB7CisgIEdldEFib3J0SGFuZGxlcigpKCk7CisgIHN0ZDo6YWJvcnQoKTsgIC8vIGZhbGxiYWNrIHRvIGVuZm9yY2Ugbm9yZXR1cm4KK30KKworLy8gQ2hlY2tIYW5kbGVyIGlzIHRoZSBjbGFzcyBjb25zdHJ1Y3RlZCBieSBmYWlsaW5nIENIRUNLIG1hY3Jvcy4gQ2hlY2tIYW5kbGVyCisvLyB3aWxsIGxvZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmFpbHVyZXMgYW5kIGFib3J0IHdoZW4gaXQgaXMgZGVzdHJ1Y3RlZC4KK2NsYXNzIENoZWNrSGFuZGxlciB7CisgcHVibGljOgorICBDaGVja0hhbmRsZXIoY29uc3QgY2hhciogY2hlY2ssIGNvbnN0IGNoYXIqIGZpbGUsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQorICAgICAgOiBsb2dfKEdldEVycm9yTG9nSW5zdGFuY2UoKSkgeworICAgIGxvZ18gPDwgZmlsZSA8PCAiOiIgPDwgbGluZSA8PCAiOiAiIDw8IGZ1bmMgPDwgIjogQ2hlY2sgYCIgPDwgY2hlY2sKKyAgICAgICAgIDw8ICInIGZhaWxlZC4gIjsKKyAgfQorCisgIExvZ1R5cGUmIEdldExvZygpIHsgcmV0dXJuIGxvZ187IH0KKworICBCRU5DSE1BUktfTk9SRVRVUk4gfkNoZWNrSGFuZGxlcigpIEJFTkNITUFSS19OT0VYQ0VQVF9PUChmYWxzZSkgeworICAgIGxvZ18gPDwgc3RkOjplbmRsOworICAgIENhbGxBYm9ydEhhbmRsZXIoKTsKKyAgfQorCisgIENoZWNrSGFuZGxlciYgb3BlcmF0b3I9KGNvbnN0IENoZWNrSGFuZGxlciYpID0gZGVsZXRlOworICBDaGVja0hhbmRsZXIoY29uc3QgQ2hlY2tIYW5kbGVyJikgPSBkZWxldGU7CisgIENoZWNrSGFuZGxlcigpID0gZGVsZXRlOworCisgcHJpdmF0ZToKKyAgTG9nVHlwZSYgbG9nXzsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKy8vIFRoZSBDSEVDSyBtYWNybyByZXR1cm5zIGEgc3RkOjpvc3RyZWFtIG9iamVjdCB0aGF0IGNhbiBoYXZlIGV4dHJhIGluZm9ybWF0aW9uCisvLyB3cml0dGVuIHRvIGl0LgorI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgQ0hFQ0soYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYiA/IDo6YmVuY2htYXJrOjppbnRlcm5hbDo6R2V0TnVsbExvZ0luc3RhbmNlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIDogOjpiZW5jaG1hcms6OmludGVybmFsOjpDaGVja0hhbmRsZXIoI2IsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pIFwKKyAgICAgICAgICAgLkdldExvZygpKQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0soYikgOjpiZW5jaG1hcms6OmludGVybmFsOjpHZXROdWxsTG9nSW5zdGFuY2UoKQorI2VuZGlmCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKy8vIHByZXNlcnZlIHdoaXRlc3BhY2luZyBiZXR3ZWVuIG9wZXJhdG9ycyBmb3IgYWxpZ25tZW50CisjZGVmaW5lIENIRUNLX0VRKGEsIGIpIENIRUNLKChhKSA9PSAoYikpCisjZGVmaW5lIENIRUNLX05FKGEsIGIpIENIRUNLKChhKSAhPSAoYikpCisjZGVmaW5lIENIRUNLX0dFKGEsIGIpIENIRUNLKChhKSA+PSAoYikpCisjZGVmaW5lIENIRUNLX0xFKGEsIGIpIENIRUNLKChhKSA8PSAoYikpCisjZGVmaW5lIENIRUNLX0dUKGEsIGIpIENIRUNLKChhKSA+IChiKSkKKyNkZWZpbmUgQ0hFQ0tfTFQoYSwgYikgQ0hFQ0soKGEpIDwgKGIpKQorCisjZGVmaW5lIENIRUNLX0ZMT0FUX0VRKGEsIGIsIGVwcykgQ0hFQ0soc3RkOjpmYWJzKChhKSAtIChiKSkgPCAgKGVwcykpCisjZGVmaW5lIENIRUNLX0ZMT0FUX05FKGEsIGIsIGVwcykgQ0hFQ0soc3RkOjpmYWJzKChhKSAtIChiKSkgPj0gKGVwcykpCisjZGVmaW5lIENIRUNLX0ZMT0FUX0dFKGEsIGIsIGVwcykgQ0hFQ0soKGEpIC0gKGIpID4gLShlcHMpKQorI2RlZmluZSBDSEVDS19GTE9BVF9MRShhLCBiLCBlcHMpIENIRUNLKChiKSAtIChhKSA+IC0oZXBzKSkKKyNkZWZpbmUgQ0hFQ0tfRkxPQVRfR1QoYSwgYiwgZXBzKSBDSEVDSygoYSkgLSAoYikgPiAgKGVwcykpCisjZGVmaW5lIENIRUNLX0ZMT0FUX0xUKGEsIGIsIGVwcykgQ0hFQ0soKGIpIC0gKGEpID4gIChlcHMpKQorLy9jbGFuZy1mb3JtYXQgb24KKworI2VuZGlmICAvLyBDSEVDS19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvbG9ycHJpbnQuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29sb3JwcmludC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmY2YTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvbG9ycHJpbnQuY2MKQEAgLTAsMCArMSwxODggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2xvcnByaW50LmgiCisKKyNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisKKyNpZmRlZiBCRU5DSE1BUktfT1NfV0lORE9XUworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX09TX1dJTkRPV1MKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgeworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCit0eXBlZGVmIFdPUkQgUGxhdGZvcm1Db2xvckNvZGU7CisjZWxzZQordHlwZWRlZiBjb25zdCBjaGFyKiBQbGF0Zm9ybUNvbG9yQ29kZTsKKyNlbmRpZgorCitQbGF0Zm9ybUNvbG9yQ29kZSBHZXRQbGF0Zm9ybUNvbG9yQ29kZShMb2dDb2xvciBjb2xvcikgeworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDoKKyAgICAgIHJldHVybiBGT1JFR1JPVU5EX1JFRDsKKyAgICBjYXNlIENPTE9SX0dSRUVOOgorICAgICAgcmV0dXJuIEZPUkVHUk9VTkRfR1JFRU47CisgICAgY2FzZSBDT0xPUl9ZRUxMT1c6CisgICAgICByZXR1cm4gRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOOworICAgIGNhc2UgQ09MT1JfQkxVRToKKyAgICAgIHJldHVybiBGT1JFR1JPVU5EX0JMVUU7CisgICAgY2FzZSBDT0xPUl9NQUdFTlRBOgorICAgICAgcmV0dXJuIEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfUkVEOworICAgIGNhc2UgQ09MT1JfQ1lBTjoKKyAgICAgIHJldHVybiBGT1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0dSRUVOOworICAgIGNhc2UgQ09MT1JfV0hJVEU6ICAvLyBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdAorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorI2Vsc2UKKyAgc3dpdGNoIChjb2xvcikgeworICAgIGNhc2UgQ09MT1JfUkVEOgorICAgICAgcmV0dXJuICIxIjsKKyAgICBjYXNlIENPTE9SX0dSRUVOOgorICAgICAgcmV0dXJuICIyIjsKKyAgICBjYXNlIENPTE9SX1lFTExPVzoKKyAgICAgIHJldHVybiAiMyI7CisgICAgY2FzZSBDT0xPUl9CTFVFOgorICAgICAgcmV0dXJuICI0IjsKKyAgICBjYXNlIENPTE9SX01BR0VOVEE6CisgICAgICByZXR1cm4gIjUiOworICAgIGNhc2UgQ09MT1JfQ1lBTjoKKyAgICAgIHJldHVybiAiNiI7CisgICAgY2FzZSBDT0xPUl9XSElURToKKyAgICAgIHJldHVybiAiNyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxscHRyOworICB9OworI2VuZGlmCit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKworc3RkOjpzdHJpbmcgRm9ybWF0U3RyaW5nKGNvbnN0IGNoYXIqIG1zZywgdmFfbGlzdCBhcmdzKSB7CisgIC8vIHdlIG1pZ2h0IG5lZWQgYSBzZWNvbmQgc2hvdCBhdCB0aGlzLCBzbyBwcmUtZW1wdGl2bHkgbWFrZSBhIGNvcHkKKyAgdmFfbGlzdCBhcmdzX2NwOworICB2YV9jb3B5KGFyZ3NfY3AsIGFyZ3MpOworCisgIHN0ZDo6c2l6ZV90IHNpemUgPSAyNTY7CisgIGNoYXIgbG9jYWxfYnVmZlsyNTZdOworICBhdXRvIHJldCA9IHZzbnByaW50Zihsb2NhbF9idWZmLCBzaXplLCBtc2csIGFyZ3NfY3ApOworCisgIHZhX2VuZChhcmdzX2NwKTsKKworICAvLyBjdXJyZW50bHkgdGhlcmUgaXMgbm8gZXJyb3IgaGFuZGxpbmcgZm9yIGZhaWx1cmUsIHNvIHRoaXMgaXMgaGFjay4KKyAgQ0hFQ0socmV0ID49IDApOworCisgIGlmIChyZXQgPT0gMCkgIC8vIGhhbmRsZSBlbXB0eSBleHBhbnNpb24KKyAgICByZXR1cm4ge307CisgIGVsc2UgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IHNpemUpCisgICAgcmV0dXJuIGxvY2FsX2J1ZmY7CisgIGVsc2UgeworICAgIC8vIHdlIGRpZCBub3QgcHJvdmlkZSBhIGxvbmcgZW5vdWdoIGJ1ZmZlciBvbiBvdXIgZmlyc3QgYXR0ZW1wdC4KKyAgICBzaXplID0gKHNpemVfdClyZXQgKyAxOyAgLy8gKyAxIGZvciB0aGUgbnVsbCBieXRlCisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gYnVmZihuZXcgY2hhcltzaXplXSk7CisgICAgcmV0ID0gdnNucHJpbnRmKGJ1ZmYuZ2V0KCksIHNpemUsIG1zZywgYXJncyk7CisgICAgQ0hFQ0socmV0ID4gMCAmJiAoKHNpemVfdClyZXQpIDwgc2l6ZSk7CisgICAgcmV0dXJuIGJ1ZmYuZ2V0KCk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgRm9ybWF0U3RyaW5nKGNvbnN0IGNoYXIqIG1zZywgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgbXNnKTsKKyAgYXV0byB0bXAgPSBGb3JtYXRTdHJpbmcobXNnLCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICByZXR1cm4gdG1wOworfQorCit2b2lkIENvbG9yUHJpbnRmKHN0ZDo6b3N0cmVhbSYgb3V0LCBMb2dDb2xvciBjb2xvciwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICBDb2xvclByaW50ZihvdXQsIGNvbG9yLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgQ29sb3JQcmludGYoc3RkOjpvc3RyZWFtJiBvdXQsIExvZ0NvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsCisgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgeworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisgICgodm9pZClvdXQpOyAgLy8gc3VwcHJlc3MgdW51c2VkIHdhcm5pbmcKKworICBjb25zdCBIQU5ETEUgc3Rkb3V0X2hhbmRsZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisKKyAgLy8gR2V0cyB0aGUgY3VycmVudCB0ZXh0IGNvbG9yLgorICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBidWZmZXJfaW5mbzsKKyAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oc3Rkb3V0X2hhbmRsZSwgJmJ1ZmZlcl9pbmZvKTsKKyAgY29uc3QgV09SRCBvbGRfY29sb3JfYXR0cnMgPSBidWZmZXJfaW5mby53QXR0cmlidXRlczsKKworICAvLyBXZSBuZWVkIHRvIGZsdXNoIHRoZSBzdHJlYW0gYnVmZmVycyBpbnRvIHRoZSBjb25zb2xlIGJlZm9yZSBlYWNoCisgIC8vIFNldENvbnNvbGVUZXh0QXR0cmlidXRlIGNhbGwgbGVzdCBpdCBhZmZlY3QgdGhlIHRleHQgdGhhdCBpcyBhbHJlYWR5CisgIC8vIHByaW50ZWQgYnV0IGhhcyBub3QgeWV0IHJlYWNoZWQgdGhlIGNvbnNvbGUuCisgIGZmbHVzaChzdGRvdXQpOworICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQbGF0Zm9ybUNvbG9yQ29kZShjb2xvcikgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKworICBmZmx1c2goc3Rkb3V0KTsKKyAgLy8gUmVzdG9yZXMgdGhlIHRleHQgY29sb3IuCisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsIG9sZF9jb2xvcl9hdHRycyk7CisjZWxzZQorICBjb25zdCBjaGFyKiBjb2xvcl9jb2RlID0gR2V0UGxhdGZvcm1Db2xvckNvZGUoY29sb3IpOworICBpZiAoY29sb3JfY29kZSkgb3V0IDw8IEZvcm1hdFN0cmluZygiXDAzM1swOzMlc20iLCBjb2xvcl9jb2RlKTsKKyAgb3V0IDw8IEZvcm1hdFN0cmluZyhmbXQsIGFyZ3MpIDw8ICJcMDMzW20iOworI2VuZGlmCit9CisKK2Jvb2wgSXNDb2xvclRlcm1pbmFsKCkgeworI2lmIEJFTkNITUFSS19PU19XSU5ET1dTCisgIC8vIE9uIFdpbmRvd3MgdGhlIFRFUk0gdmFyaWFibGUgaXMgdXN1YWxseSBub3Qgc2V0LCBidXQgdGhlCisgIC8vIGNvbnNvbGUgdGhlcmUgZG9lcyBzdXBwb3J0IGNvbG9ycy4KKyAgcmV0dXJuIDAgIT0gX2lzYXR0eShfZmlsZW5vKHN0ZG91dCkpOworI2Vsc2UKKyAgLy8gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBURVJNIHZhcmlhYmxlLiBUaGlzIGxpc3Qgb2YKKyAgLy8gc3VwcG9ydGVkIFRFUk0gdmFsdWVzIGlzIGNvcGllZCBmcm9tIEdvb2dsZSBUZXN0OgorICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0L2Jsb2IvbWFzdGVyL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LmNjI0wyOTI1Pi4KKyAgY29uc3QgY2hhciogY29uc3QgU1VQUE9SVEVEX1RFUk1fVkFMVUVTW10gPSB7CisgICAgICAieHRlcm0iLCAgICAgICAgICJ4dGVybS1jb2xvciIsICAgICAieHRlcm0tMjU2Y29sb3IiLAorICAgICAgInNjcmVlbiIsICAgICAgICAic2NyZWVuLTI1NmNvbG9yIiwgInRtdXgiLAorICAgICAgInRtdXgtMjU2Y29sb3IiLCAicnh2dC11bmljb2RlIiwgICAgInJ4dnQtdW5pY29kZS0yNTZjb2xvciIsCisgICAgICAibGludXgiLCAgICAgICAgICJjeWd3aW4iLAorICB9OworCisgIGNvbnN0IGNoYXIqIGNvbnN0IHRlcm0gPSBnZXRlbnYoIlRFUk0iKTsKKworICBib29sIHRlcm1fc3VwcG9ydHNfY29sb3IgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBjaGFyKiBjYW5kaWRhdGUgOiBTVVBQT1JURURfVEVSTV9WQUxVRVMpIHsKKyAgICBpZiAodGVybSAmJiAwID09IHN0cmNtcCh0ZXJtLCBjYW5kaWRhdGUpKSB7CisgICAgICB0ZXJtX3N1cHBvcnRzX2NvbG9yID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAwICE9IGlzYXR0eShmaWxlbm8oc3Rkb3V0KSkgJiYgdGVybV9zdXBwb3J0c19jb2xvcjsKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX09TX1dJTkRPV1MKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jb2xvcnByaW50LmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29sb3JwcmludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNmZhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29sb3JwcmludC5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgQkVOQ0hNQVJLX0NPTE9SUFJJTlRfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0NPTE9SUFJJTlRfSF8KKworI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK2VudW0gTG9nQ29sb3IgeworICBDT0xPUl9ERUZBVUxULAorICBDT0xPUl9SRUQsCisgIENPTE9SX0dSRUVOLAorICBDT0xPUl9ZRUxMT1csCisgIENPTE9SX0JMVUUsCisgIENPTE9SX01BR0VOVEEsCisgIENPTE9SX0NZQU4sCisgIENPTE9SX1dISVRFCit9OworCitzdGQ6OnN0cmluZyBGb3JtYXRTdHJpbmcoY29uc3QgY2hhciogbXNnLCB2YV9saXN0IGFyZ3MpOworc3RkOjpzdHJpbmcgRm9ybWF0U3RyaW5nKGNvbnN0IGNoYXIqIG1zZywgLi4uKTsKKwordm9pZCBDb2xvclByaW50ZihzdGQ6Om9zdHJlYW0mIG91dCwgTG9nQ29sb3IgY29sb3IsIGNvbnN0IGNoYXIqIGZtdCwKKyAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKTsKK3ZvaWQgQ29sb3JQcmludGYoc3RkOjpvc3RyZWFtJiBvdXQsIExvZ0NvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBzdGRvdXQgYXBwZWFycyB0byBiZSBhIHRlcm1pbmFsIHRoYXQgc3VwcG9ydHMgY29sb3JlZAorLy8gb3V0cHV0LCBmYWxzZSBvdGhlcndpc2UuCitib29sIElzQ29sb3JUZXJtaW5hbCgpOworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19DT0xPUlBSSU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29sb3JwcmludF9zdGFyYm9hcmQuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29sb3JwcmludF9zdGFyYm9hcmQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4ZDVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jb2xvcnByaW50X3N0YXJib2FyZC5jYwpAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2xvcnByaW50LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCitzdGQ6OnN0cmluZyBGb3JtYXRTdHJpbmcoY29uc3QgY2hhciogbXNnLCB2YV9saXN0IGFyZ3MpIHsKKyAgdmFfbGlzdCBhcmdzX2NvcHk7CisgIHZhX2NvcHkoYXJnc19jb3B5LCBhcmdzKTsKKworICBpbnQgZXhwZWN0ZWRfc2l6ZSA9IDo6U2JTdHJpbmdGb3JtYXQoTlVMTCwgMCwgbXNnLCBhcmdzX2NvcHkpOworCisgIHZhX2VuZChhcmdzX2NvcHkpOworCisgIGlmIChleHBlY3RlZF9zaXplIDw9IDApIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZmZlcihleHBlY3RlZF9zaXplICsgMSk7CisgIDo6U2JTdHJpbmdGb3JtYXQoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSwgbXNnLCBhcmdzKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlci5kYXRhKCksIGV4cGVjdGVkX3NpemUpOworfQorCitzdGQ6OnN0cmluZyBGb3JtYXRTdHJpbmcoY29uc3QgY2hhciogbXNnLCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBtc2cpOworICBhdXRvIHRtcCA9IEZvcm1hdFN0cmluZyhtc2csIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHJldHVybiB0bXA7Cit9CisKK3ZvaWQgQ29sb3JQcmludGYoc3RkOjpvc3RyZWFtJiBvdXQsIExvZ0NvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIENvbG9yUHJpbnRmKG91dCwgY29sb3IsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBDb2xvclByaW50ZihzdGQ6Om9zdHJlYW0mIG91dCwgTG9nQ29sb3IgY29sb3IsIGNvbnN0IGNoYXIqIGZtdCwKKyAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7CisgIG91dCA8PCBGb3JtYXRTdHJpbmcoZm10LCBhcmdzKTsKK30KKworYm9vbCBJc0NvbG9yVGVybWluYWwoKSB7IHJldHVybiBmYWxzZTsgfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvbW1hbmRsaW5lZmxhZ3MuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29tbWFuZGxpbmVmbGFncy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTYwZjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvbW1hbmRsaW5lZmxhZ3MuY2MKQEAgLTAsMCArMSwyMjggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb21tYW5kbGluZWZsYWdzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworbmFtZXNwYWNlIHsKKworLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcworLy8gdGhlIHJlc3VsdCB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUKKy8vIHVuY2hhbmdlZCBhbmQgcmV0dXJucyBmYWxzZS4KK2Jvb2wgUGFyc2VJbnQzMihjb25zdCBzdGQ6OnN0cmluZyYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgaW50MzJfdCogdmFsdWUpIHsKKyAgLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBhIGRlY2ltYWwgaW50ZWdlci4KKyAgY2hhciogZW5kID0gbnVsbHB0cjsKKyAgY29uc3QgbG9uZyBsb25nX3ZhbHVlID0gc3RydG9sKHN0ciwgJmVuZCwgMTApOyAgLy8gTk9MSU5UCisKKyAgLy8gSGFzIHN0cnRvbCgpIGNvbnN1bWVkIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmc/CisgIGlmICgqZW5kICE9ICdcMCcpIHsKKyAgICAvLyBObyAtIGFuIGludmFsaWQgY2hhcmFjdGVyIHdhcyBlbmNvdW50ZXJlZC4KKyAgICBzdGQ6OmNlcnIgPDwgc3JjX3RleHQgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCAiCisgICAgICAgICAgICAgIDw8ICJidXQgYWN0dWFsbHkgaGFzIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiLlxuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJcyB0aGUgcGFyc2VkIHZhbHVlIGluIHRoZSByYW5nZSBvZiBhbiBJbnQzMj8KKyAgY29uc3QgaW50MzJfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihsb25nX3ZhbHVlKTsKKyAgaWYgKGxvbmdfdmFsdWUgPT0gc3RkOjpudW1lcmljX2xpbWl0czxsb25nPjo6bWF4KCkgfHwKKyAgICAgIGxvbmdfdmFsdWUgPT0gc3RkOjpudW1lcmljX2xpbWl0czxsb25nPjo6bWluKCkgfHwKKyAgICAgIC8vIFRoZSBwYXJzZWQgdmFsdWUgb3ZlcmZsb3dzIGFzIGEgbG9uZy4gIChzdHJ0b2woKSByZXR1cm5zCisgICAgICAvLyBMT05HX01BWCBvciBMT05HX01JTiB3aGVuIHRoZSBpbnB1dCBvdmVyZmxvd3MuKQorICAgICAgcmVzdWx0ICE9IGxvbmdfdmFsdWUKKyAgICAgIC8vIFRoZSBwYXJzZWQgdmFsdWUgb3ZlcmZsb3dzIGFzIGFuIEludDMyLgorICApIHsKKyAgICBzdGQ6OmNlcnIgPDwgc3JjX3RleHQgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCAiCisgICAgICAgICAgICAgIDw8ICJidXQgYWN0dWFsbHkgaGFzIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiLCAiCisgICAgICAgICAgICAgIDw8ICJ3aGljaCBvdmVyZmxvd3MuXG4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSBkb3VibGUuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMgdGhlIHJlc3VsdCB0byAqdmFsdWUgYW5kCisvLyByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlIHVuY2hhbmdlZCBhbmQgcmV0dXJucyBmYWxzZS4KK2Jvb2wgUGFyc2VEb3VibGUoY29uc3Qgc3RkOjpzdHJpbmcmIHNyY190ZXh0LCBjb25zdCBjaGFyKiBzdHIsIGRvdWJsZSogdmFsdWUpIHsKKyAgLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBhIGRlY2ltYWwgaW50ZWdlci4KKyAgY2hhciogZW5kID0gbnVsbHB0cjsKKyAgY29uc3QgZG91YmxlIGRvdWJsZV92YWx1ZSA9IHN0cnRvZChzdHIsICZlbmQpOyAgLy8gTk9MSU5UCisKKyAgLy8gSGFzIHN0cnRvbCgpIGNvbnN1bWVkIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmc/CisgIGlmICgqZW5kICE9ICdcMCcpIHsKKyAgICAvLyBObyAtIGFuIGludmFsaWQgY2hhcmFjdGVyIHdhcyBlbmNvdW50ZXJlZC4KKyAgICBzdGQ6OmNlcnIgPDwgc3JjX3RleHQgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIGRvdWJsZSwgIgorICAgICAgICAgICAgICA8PCAiYnV0IGFjdHVhbGx5IGhhcyB2YWx1ZSBcIiIgPDwgc3RyIDw8ICJcIi5cbiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnZhbHVlID0gZG91YmxlX3ZhbHVlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUKKy8vIGdpdmVuIGZsYWcuICBGb3IgZXhhbXBsZSwgRmxhZ1RvRW52VmFyKCJmb28iKSB3aWxsIHJldHVybgorLy8gIkJFTkNITUFSS19GT08iIGluIHRoZSBvcGVuLXNvdXJjZSB2ZXJzaW9uLgorc3RhdGljIHN0ZDo6c3RyaW5nIEZsYWdUb0VudlZhcihjb25zdCBjaGFyKiBmbGFnKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYWdfc3RyKGZsYWcpOworCisgIHN0ZDo6c3RyaW5nIGVudl92YXI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGZsYWdfc3RyLmxlbmd0aCgpOyArK2kpCisgICAgZW52X3ZhciArPSBzdGF0aWNfY2FzdDxjaGFyPig6OnRvdXBwZXIoZmxhZ19zdHIuY19zdHIoKVtpXSkpOworCisgIHJldHVybiAiQkVOQ0hNQVJLXyIgKyBlbnZfdmFyOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBCb29sRnJvbUVudihjb25zdCBjaGFyKiBmbGFnLCBib29sIGRlZmF1bHRfdmFsKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IGdldGVudihlbnZfdmFyLmNfc3RyKCkpOworICByZXR1cm4gdmFsdWVfc3RyID09IG51bGxwdHIgPyBkZWZhdWx0X3ZhbCA6IElzVHJ1dGh5RmxhZ1ZhbHVlKHZhbHVlX3N0cik7Cit9CisKK2ludDMyX3QgSW50MzJGcm9tRW52KGNvbnN0IGNoYXIqIGZsYWcsIGludDMyX3QgZGVmYXVsdF92YWwpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gZ2V0ZW52KGVudl92YXIuY19zdHIoKSk7CisgIGludDMyX3QgdmFsdWUgPSBkZWZhdWx0X3ZhbDsKKyAgaWYgKHZhbHVlX3N0ciA9PSBudWxscHRyIHx8CisgICAgICAhUGFyc2VJbnQzMihzdGQ6OnN0cmluZygiRW52aXJvbm1lbnQgdmFyaWFibGUgIikgKyBlbnZfdmFyLCB2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsOworICB9CisgIHJldHVybiB2YWx1ZTsKK30KKworZG91YmxlIERvdWJsZUZyb21FbnYoY29uc3QgY2hhciogZmxhZywgZG91YmxlIGRlZmF1bHRfdmFsKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IGdldGVudihlbnZfdmFyLmNfc3RyKCkpOworICBkb3VibGUgdmFsdWUgPSBkZWZhdWx0X3ZhbDsKKyAgaWYgKHZhbHVlX3N0ciA9PSBudWxscHRyIHx8CisgICAgICAhUGFyc2VEb3VibGUoc3RkOjpzdHJpbmcoIkVudmlyb25tZW50IHZhcmlhYmxlICIpICsgZW52X3ZhciwgdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWw7CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfQorCitjb25zdCBjaGFyKiBTdHJpbmdGcm9tRW52KGNvbnN0IGNoYXIqIGZsYWcsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlID0gZ2V0ZW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiB2YWx1ZSA9PSBudWxscHRyID8gZGVmYXVsdF92YWwgOiB2YWx1ZTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlCisvLyB0aGUgZm9ybWF0ICItLWZsYWc9dmFsdWUiLiAgV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlICI9dmFsdWUiCisvLyBwYXJ0IGNhbiBiZSBvbWl0dGVkLgorLy8KKy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnLCBvciBudWxscHRyIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KK2NvbnN0IGNoYXIqIFBhcnNlRmxhZ1ZhbHVlKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmX29wdGlvbmFsKSB7CisgIC8vIHN0ciBhbmQgZmxhZyBtdXN0IG5vdCBiZSBudWxscHRyLgorICBpZiAoc3RyID09IG51bGxwdHIgfHwgZmxhZyA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKworICAvLyBUaGUgZmxhZyBtdXN0IHN0YXJ0IHdpdGggIi0tIi4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmxhZ19zdHIgPSBzdGQ6OnN0cmluZygiLS0iKSArIHN0ZDo6c3RyaW5nKGZsYWcpOworICBjb25zdCBzaXplX3QgZmxhZ19sZW4gPSBmbGFnX3N0ci5sZW5ndGgoKTsKKyAgaWYgKHN0cm5jbXAoc3RyLCBmbGFnX3N0ci5jX3N0cigpLCBmbGFnX2xlbikgIT0gMCkgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gU2tpcHMgdGhlIGZsYWcgbmFtZS4KKyAgY29uc3QgY2hhciogZmxhZ19lbmQgPSBzdHIgKyBmbGFnX2xlbjsKKworICAvLyBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCBpdCdzIE9LIHRvIG5vdCBoYXZlIGEgIj12YWx1ZSIgcGFydC4KKyAgaWYgKGRlZl9vcHRpb25hbCAmJiAoZmxhZ19lbmRbMF0gPT0gJ1wwJykpIHJldHVybiBmbGFnX2VuZDsKKworICAvLyBJZiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG1vcmUgY2hhcmFjdGVycyBhZnRlciB0aGUKKyAgLy8gZmxhZyBuYW1lLCBvciBpZiBkZWZfb3B0aW9uYWwgaXMgZmFsc2UsIHRoZXJlIG11c3QgYmUgYSAnPScgYWZ0ZXIKKyAgLy8gdGhlIGZsYWcgbmFtZS4KKyAgaWYgKGZsYWdfZW5kWzBdICE9ICc9JykgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIGFmdGVyICI9Ii4KKyAgcmV0dXJuIGZsYWdfZW5kICsgMTsKK30KKworYm9vbCBQYXJzZUJvb2xGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgYm9vbCogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIGJvb2wuCisgICp2YWx1ZSA9IElzVHJ1dGh5RmxhZ1ZhbHVlKHZhbHVlX3N0cik7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlSW50MzJGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgaW50MzJfdCogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworCisgIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KKyAgcmV0dXJuIFBhcnNlSW50MzIoc3RkOjpzdHJpbmcoIlRoZSB2YWx1ZSBvZiBmbGFnIC0tIikgKyBmbGFnLCB2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKK30KKworYm9vbCBQYXJzZURvdWJsZUZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBkb3VibGUqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCisgIHJldHVybiBQYXJzZURvdWJsZShzdGQ6OnN0cmluZygiVGhlIHZhbHVlIG9mIGZsYWcgLS0iKSArIGZsYWcsIHZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKK30KKworYm9vbCBQYXJzZVN0cmluZ0ZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBzdGQ6OnN0cmluZyogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworCisgICp2YWx1ZSA9IHZhbHVlX3N0cjsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSXNGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZykgeworICByZXR1cm4gKFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSkgIT0gbnVsbHB0cik7Cit9CisKK2Jvb2wgSXNUcnV0aHlGbGFnVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGlmICh2YWx1ZS5zaXplKCkgPT0gMSkgeworICAgIGNoYXIgdiA9IHZhbHVlWzBdOworICAgIHJldHVybiBpc2FsbnVtKHYpICYmCisgICAgICAgICAgICEodiA9PSAnMCcgfHwgdiA9PSAnZicgfHwgdiA9PSAnRicgfHwgdiA9PSAnbicgfHwgdiA9PSAnTicpOworICB9IGVsc2UgaWYgKCF2YWx1ZS5lbXB0eSgpKSB7CisgICAgc3RkOjpzdHJpbmcgdmFsdWVfbG93ZXIodmFsdWUpOworICAgIHN0ZDo6dHJhbnNmb3JtKHZhbHVlX2xvd2VyLmJlZ2luKCksIHZhbHVlX2xvd2VyLmVuZCgpLAorICAgICAgICAgICAgICAgICAgIHZhbHVlX2xvd2VyLmJlZ2luKCksIDo6dG9sb3dlcik7CisgICAgcmV0dXJuICEodmFsdWVfbG93ZXIgPT0gImZhbHNlIiB8fCB2YWx1ZV9sb3dlciA9PSAibm8iIHx8CisgICAgICAgICAgICAgdmFsdWVfbG93ZXIgPT0gIm9mZiIpOworICB9IGVsc2UKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jb21tYW5kbGluZWZsYWdzLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29tbWFuZGxpbmVmbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWY2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29tbWFuZGxpbmVmbGFncy5oCkBAIC0wLDAgKzEsMTAzIEBACisjaWZuZGVmIEJFTkNITUFSS19DT01NQU5ETElORUZMQUdTX0hfCisjZGVmaW5lIEJFTkNITUFSS19DT01NQU5ETElORUZMQUdTX0hfCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworLy8gTWFjcm8gZm9yIHJlZmVyZW5jaW5nIGZsYWdzLgorI2RlZmluZSBGTEFHKG5hbWUpIEZMQUdTXyMjbmFtZQorCisvLyBNYWNyb3MgZm9yIGRlY2xhcmluZyBmbGFncy4KKyNkZWZpbmUgREVDTEFSRV9ib29sKG5hbWUpIGV4dGVybiBib29sIEZMQUcobmFtZSkKKyNkZWZpbmUgREVDTEFSRV9pbnQzMihuYW1lKSBleHRlcm4gaW50MzJfdCBGTEFHKG5hbWUpCisjZGVmaW5lIERFQ0xBUkVfZG91YmxlKG5hbWUpIGV4dGVybiBkb3VibGUgRkxBRyhuYW1lKQorI2RlZmluZSBERUNMQVJFX3N0cmluZyhuYW1lKSBleHRlcm4gc3RkOjpzdHJpbmcgRkxBRyhuYW1lKQorCisvLyBNYWNyb3MgZm9yIGRlZmluaW5nIGZsYWdzLgorI2RlZmluZSBERUZJTkVfYm9vbChuYW1lLCBkZWZhdWx0X3ZhbCkgICAgICAgICAgICBcCisgIGJvb2wgRkxBRyhuYW1lKSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiZW5jaG1hcms6OkJvb2xGcm9tRW52KCNuYW1lLCBkZWZhdWx0X3ZhbCkKKyNkZWZpbmUgREVGSU5FX2ludDMyKG5hbWUsIGRlZmF1bHRfdmFsKSAgICAgICAgICAgXAorICBpbnQzMl90IEZMQUcobmFtZSkgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmVuY2htYXJrOjpJbnQzMkZyb21FbnYoI25hbWUsIGRlZmF1bHRfdmFsKQorI2RlZmluZSBERUZJTkVfZG91YmxlKG5hbWUsIGRlZmF1bHRfdmFsKSAgICAgICAgICBcCisgIGRvdWJsZSBGTEFHKG5hbWUpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiZW5jaG1hcms6OkRvdWJsZUZyb21FbnYoI25hbWUsIGRlZmF1bHRfdmFsKQorI2RlZmluZSBERUZJTkVfc3RyaW5nKG5hbWUsIGRlZmF1bHRfdmFsKSAgICAgICAgICBcCisgIHN0ZDo6c3RyaW5nIEZMQUcobmFtZSkgPSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiZW5jaG1hcms6OlN0cmluZ0Zyb21FbnYoI25hbWUsIGRlZmF1bHRfdmFsKQorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworLy8gUGFyc2VzIGEgYm9vbCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZmxhZy4KKy8vCisvLyBJZiB0aGUgdmFyaWFibGUgZXhpc3RzLCByZXR1cm5zIElzVHJ1dGh5RmxhZ1ZhbHVlKCkgdmFsdWU7ICBpZiBub3QsCisvLyByZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlLgorYm9vbCBCb29sRnJvbUVudihjb25zdCBjaGFyKiBmbGFnLCBib29sIGRlZmF1bHRfdmFsKTsKKworLy8gUGFyc2VzIGFuIEludDMyIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmbGFnLgorLy8KKy8vIElmIHRoZSB2YXJpYWJsZSBleGlzdHMsIHJldHVybnMgUGFyc2VJbnQzMigpIHZhbHVlOyAgaWYgbm90LCByZXR1cm5zCisvLyB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZS4KK2ludDMyX3QgSW50MzJGcm9tRW52KGNvbnN0IGNoYXIqIGZsYWcsIGludDMyX3QgZGVmYXVsdF92YWwpOworCisvLyBQYXJzZXMgYW4gRG91YmxlIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmbGFnLgorLy8KKy8vIElmIHRoZSB2YXJpYWJsZSBleGlzdHMsIHJldHVybnMgUGFyc2VEb3VibGUoKTsgIGlmIG5vdCwgcmV0dXJucworLy8gdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUuCitkb3VibGUgRG91YmxlRnJvbUVudihjb25zdCBjaGFyKiBmbGFnLCBkb3VibGUgZGVmYXVsdF92YWwpOworCisvLyBQYXJzZXMgYSBzdHJpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZsYWcuCisvLworLy8gSWYgdmFyaWFibGUgZXhpc3RzLCByZXR1cm5zIGl0cyB2YWx1ZTsgIGlmIG5vdCwgcmV0dXJucworLy8gdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUuCitjb25zdCBjaGFyKiBTdHJpbmdGcm9tRW52KGNvbnN0IGNoYXIqIGZsYWcsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsKTsKKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIGJvb2wgZmxhZywgaW4gdGhlIGZvcm0gb2YgZWl0aGVyCisvLyAiLS1mbGFnPXZhbHVlIiBvciAiLS1mbGFnIi4KKy8vCisvLyBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlIGlmIGl0IHBhc3NlcyBJc1RydXRoeVZhbHVlKCkuCisvLworLy8gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZS4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZUJvb2xGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgYm9vbCogdmFsdWUpOworCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mCisvLyAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZUludDMyRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIGludDMyX3QqIHZhbHVlKTsKKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIERvdWJsZSBmbGFnLCBpbiB0aGUgZm9ybSBvZgorLy8gIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VEb3VibGVGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgZG91YmxlKiB2YWx1ZSk7CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YKKy8vICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlU3RyaW5nRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIGZsYWcuCitib29sIElzRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcpOworCisvLyBSZXR1cm5zIHRydWUgdW5sZXNzIHZhbHVlIHN0YXJ0cyB3aXRoIG9uZSBvZjogJzAnLCAnZicsICdGJywgJ24nIG9yICdOJywgb3IKKy8vIHNvbWUgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIuIEFsc28gcmV0dXJucyBmYWxzZSBpZiB0aGUgdmFsdWUgbWF0Y2hlcworLy8gb25lIG9mICdubycsICdmYWxzZScsICdvZmYnIChjYXNlLWluc2Vuc2l0aXZlKS4gQXMgYSBzcGVjaWFsIGNhc2UsIGFsc28KKy8vIHJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBJc1RydXRoeUZsYWdWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19DT01NQU5ETElORUZMQUdTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29tcGxleGl0eS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jb21wbGV4aXR5LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWQ2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29tcGxleGl0eS5jYwpAQCAtMCwwICsxLDIzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgSXNtYWVsIEppbWVuZXogTWFydGluZXouIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFNvdXJjZSBwcm9qZWN0IDogaHR0cHM6Ly9naXRodWIuY29tL2lzbWFlbEppbWVuZXovY3BwLmxlYXN0c3EKKy8vIEFkYXB0ZWQgdG8gYmUgdXNlZCB3aXRoIGdvb2dsZSBiZW5jaG1hcmsKKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgImNvbXBsZXhpdHkuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKKy8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW50IHNjYWxhYmlsaXR5IGZvcm1zCitCaWdPRnVuYyogRml0dGluZ0N1cnZlKEJpZ08gY29tcGxleGl0eSkgeworICBzdGF0aWMgY29uc3QgZG91YmxlIGtMb2cyRSA9IDEuNDQyNjk1MDQwODg4OTYzNDA3MzY7CisgIHN3aXRjaCAoY29tcGxleGl0eSkgeworICAgIGNhc2Ugb046CisgICAgICByZXR1cm4gW10oSXRlcmF0aW9uQ291bnQgbikgLT4gZG91YmxlIHsgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obik7IH07CisgICAgY2FzZSBvTlNxdWFyZWQ6CisgICAgICByZXR1cm4gW10oSXRlcmF0aW9uQ291bnQgbikgLT4gZG91YmxlIHsgcmV0dXJuIHN0ZDo6cG93KG4sIDIpOyB9OworICAgIGNhc2Ugb05DdWJlZDoKKyAgICAgIHJldHVybiBbXShJdGVyYXRpb25Db3VudCBuKSAtPiBkb3VibGUgeyByZXR1cm4gc3RkOjpwb3cobiwgMyk7IH07CisgICAgY2FzZSBvTG9nTjoKKyAgICAgIC8qIE5vdGU6IGNhbid0IHVzZSBsb2cyIGJlY2F1c2UgQW5kcm9pZCdzIEdOVSBTVEwgbGFja3MgaXQgKi8KKyAgICAgIHJldHVybgorICAgICAgICAgIFtdKEl0ZXJhdGlvbkNvdW50IG4pIHsgcmV0dXJuIGtMb2cyRSAqIGxvZyhzdGF0aWNfY2FzdDxkb3VibGU+KG4pKTsgfTsKKyAgICBjYXNlIG9OTG9nTjoKKyAgICAgIC8qIE5vdGU6IGNhbid0IHVzZSBsb2cyIGJlY2F1c2UgQW5kcm9pZCdzIEdOVSBTVEwgbGFja3MgaXQgKi8KKyAgICAgIHJldHVybiBbXShJdGVyYXRpb25Db3VudCBuKSB7CisgICAgICAgIHJldHVybiBrTG9nMkUgKiBuICogbG9nKHN0YXRpY19jYXN0PGRvdWJsZT4obikpOworICAgICAgfTsKKyAgICBjYXNlIG8xOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gW10oSXRlcmF0aW9uQ291bnQpIHsgcmV0dXJuIDEuMDsgfTsKKyAgfQorfQorCisvLyBGdW5jdGlvbiB0byByZXR1cm4gYW4gc3RyaW5nIGZvciB0aGUgY2FsY3VsYXRlZCBjb21wbGV4aXR5CitzdGQ6OnN0cmluZyBHZXRCaWdPU3RyaW5nKEJpZ08gY29tcGxleGl0eSkgeworICBzd2l0Y2ggKGNvbXBsZXhpdHkpIHsKKyAgICBjYXNlIG9OOgorICAgICAgcmV0dXJuICJOIjsKKyAgICBjYXNlIG9OU3F1YXJlZDoKKyAgICAgIHJldHVybiAiTl4yIjsKKyAgICBjYXNlIG9OQ3ViZWQ6CisgICAgICByZXR1cm4gIk5eMyI7CisgICAgY2FzZSBvTG9nTjoKKyAgICAgIHJldHVybiAibGdOIjsKKyAgICBjYXNlIG9OTG9nTjoKKyAgICAgIHJldHVybiAiTmxnTiI7CisgICAgY2FzZSBvMToKKyAgICAgIHJldHVybiAiKDEpIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJmKE4pIjsKKyAgfQorfQorCisvLyBGaW5kIHRoZSBjb2VmZmljaWVudCBmb3IgdGhlIGhpZ2gtb3JkZXIgdGVybSBpbiB0aGUgcnVubmluZyB0aW1lLCBieQorLy8gbWluaW1pemluZyB0aGUgc3VtIG9mIHNxdWFyZXMgb2YgcmVsYXRpdmUgZXJyb3IsIGZvciB0aGUgZml0dGluZyBjdXJ2ZQorLy8gZ2l2ZW4gYnkgdGhlIGxhbWJkYSBleHByZXNzaW9uLgorLy8gICAtIG4gICAgICAgICAgICAgOiBWZWN0b3IgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgYmVuY2htYXJrIHRlc3RzLgorLy8gICAtIHRpbWUgICAgICAgICAgOiBWZWN0b3IgY29udGFpbmluZyB0aGUgdGltZXMgZm9yIHRoZSBiZW5jaG1hcmsgdGVzdHMuCisvLyAgIC0gZml0dGluZ19jdXJ2ZSA6IGxhbWJkYSBleHByZXNzaW9uIChlLmcuIFtdKGludDY0X3Qgbikge3JldHVybiBuOyB9OykuCisKKy8vIEZvciBhIGRlZXBlciBleHBsYW5hdGlvbiBvbiB0aGUgYWxnb3JpdGhtIGxvZ2ljLCBwbGVhc2UgcmVmZXIgdG8KKy8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xlYXN0X3NxdWFyZXMjTGVhc3Rfc3F1YXJlcyxfcmVncmVzc2lvbl9hbmFseXNpc19hbmRfc3RhdGlzdGljcworCitMZWFzdFNxIE1pbmltYWxMZWFzdFNxKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICBCaWdPRnVuYyogZml0dGluZ19jdXJ2ZSkgeworICBkb3VibGUgc2lnbWFfZ24gPSAwLjA7CisgIGRvdWJsZSBzaWdtYV9nbl9zcXVhcmVkID0gMC4wOworICBkb3VibGUgc2lnbWFfdGltZSA9IDAuMDsKKyAgZG91YmxlIHNpZ21hX3RpbWVfZ24gPSAwLjA7CisKKyAgLy8gQ2FsY3VsYXRlIGxlYXN0IHNxdWFyZSBmaXR0aW5nIHBhcmFtZXRlcgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG4uc2l6ZSgpOyArK2kpIHsKKyAgICBkb3VibGUgZ25faSA9IGZpdHRpbmdfY3VydmUobltpXSk7CisgICAgc2lnbWFfZ24gKz0gZ25faTsKKyAgICBzaWdtYV9nbl9zcXVhcmVkICs9IGduX2kgKiBnbl9pOworICAgIHNpZ21hX3RpbWUgKz0gdGltZVtpXTsKKyAgICBzaWdtYV90aW1lX2duICs9IHRpbWVbaV0gKiBnbl9pOworICB9CisKKyAgTGVhc3RTcSByZXN1bHQ7CisgIHJlc3VsdC5jb21wbGV4aXR5ID0gb0xhbWJkYTsKKworICAvLyBDYWxjdWxhdGUgY29tcGxleGl0eS4KKyAgcmVzdWx0LmNvZWYgPSBzaWdtYV90aW1lX2duIC8gc2lnbWFfZ25fc3F1YXJlZDsKKworICAvLyBDYWxjdWxhdGUgUk1TCisgIGRvdWJsZSBybXMgPSAwLjA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbi5zaXplKCk7ICsraSkgeworICAgIGRvdWJsZSBmaXQgPSByZXN1bHQuY29lZiAqIGZpdHRpbmdfY3VydmUobltpXSk7CisgICAgcm1zICs9IHBvdygodGltZVtpXSAtIGZpdCksIDIpOworICB9CisKKyAgLy8gTm9ybWFsaXplZCBSTVMgYnkgdGhlIG1lYW4gb2YgdGhlIG9ic2VydmVkIHZhbHVlcworICBkb3VibGUgbWVhbiA9IHNpZ21hX3RpbWUgLyBuLnNpemUoKTsKKyAgcmVzdWx0LnJtcyA9IHNxcnQocm1zIC8gbi5zaXplKCkpIC8gbWVhbjsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBGaW5kIHRoZSBjb2VmZmljaWVudCBmb3IgdGhlIGhpZ2gtb3JkZXIgdGVybSBpbiB0aGUgcnVubmluZyB0aW1lLCBieQorLy8gbWluaW1pemluZyB0aGUgc3VtIG9mIHNxdWFyZXMgb2YgcmVsYXRpdmUgZXJyb3IuCisvLyAgIC0gbiAgICAgICAgICA6IFZlY3RvciBjb250YWluaW5nIHRoZSBzaXplIG9mIHRoZSBiZW5jaG1hcmsgdGVzdHMuCisvLyAgIC0gdGltZSAgICAgICA6IFZlY3RvciBjb250YWluaW5nIHRoZSB0aW1lcyBmb3IgdGhlIGJlbmNobWFyayB0ZXN0cy4KKy8vICAgLSBjb21wbGV4aXR5IDogSWYgZGlmZmVyZW50IHRoYW4gb0F1dG8sIHRoZSBmaXR0aW5nIGN1cnZlIHdpbGwgc3RpY2sgdG8KKy8vICAgICAgICAgICAgICAgICAgdGhpcyBvbmUuIElmIGl0IGlzIG9BdXRvLCBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgdGhlIGJlc3QKKy8vICAgICAgICAgICAgICAgICAgZml0dGluZyBjdXJ2ZS4KK0xlYXN0U3EgTWluaW1hbExlYXN0U3EoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHRpbWUsIGNvbnN0IEJpZ08gY29tcGxleGl0eSkgeworICBDSEVDS19FUShuLnNpemUoKSwgdGltZS5zaXplKCkpOworICBDSEVDS19HRShuLnNpemUoKSwgMik7ICAvLyBEbyBub3QgY29tcHV0ZSBmaXR0aW5nIGN1cnZlIGlzIGxlc3MgdGhhbiB0d28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVuY2htYXJrIHJ1bnMgYXJlIGdpdmVuCisgIENIRUNLX05FKGNvbXBsZXhpdHksIG9Ob25lKTsKKworICBMZWFzdFNxIGJlc3RfZml0OworCisgIGlmIChjb21wbGV4aXR5ID09IG9BdXRvKSB7CisgICAgc3RkOjp2ZWN0b3I8QmlnTz4gZml0X2N1cnZlcyA9IHtvTG9nTiwgb04sIG9OTG9nTiwgb05TcXVhcmVkLCBvTkN1YmVkfTsKKworICAgIC8vIFRha2UgbzEgYXMgZGVmYXVsdCBiZXN0IGZpdHRpbmcgY3VydmUKKyAgICBiZXN0X2ZpdCA9IE1pbmltYWxMZWFzdFNxKG4sIHRpbWUsIEZpdHRpbmdDdXJ2ZShvMSkpOworICAgIGJlc3RfZml0LmNvbXBsZXhpdHkgPSBvMTsKKworICAgIC8vIENvbXB1dGUgYWxsIHBvc3NpYmxlIGZpdHRpbmcgY3VydmVzIGFuZCBzdGljayB0byB0aGUgYmVzdCBvbmUKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZpdCA6IGZpdF9jdXJ2ZXMpIHsKKyAgICAgIExlYXN0U3EgY3VycmVudF9maXQgPSBNaW5pbWFsTGVhc3RTcShuLCB0aW1lLCBGaXR0aW5nQ3VydmUoZml0KSk7CisgICAgICBpZiAoY3VycmVudF9maXQucm1zIDwgYmVzdF9maXQucm1zKSB7CisgICAgICAgIGJlc3RfZml0ID0gY3VycmVudF9maXQ7CisgICAgICAgIGJlc3RfZml0LmNvbXBsZXhpdHkgPSBmaXQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGJlc3RfZml0ID0gTWluaW1hbExlYXN0U3EobiwgdGltZSwgRml0dGluZ0N1cnZlKGNvbXBsZXhpdHkpKTsKKyAgICBiZXN0X2ZpdC5jb21wbGV4aXR5ID0gY29tcGxleGl0eTsKKyAgfQorCisgIHJldHVybiBiZXN0X2ZpdDsKK30KKworc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4gQ29tcHV0ZUJpZ08oCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4mIHJlcG9ydHMpIHsKKyAgdHlwZWRlZiBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuIFJ1bjsKKyAgc3RkOjp2ZWN0b3I8UnVuPiByZXN1bHRzOworCisgIGlmIChyZXBvcnRzLnNpemUoKSA8IDIpIHJldHVybiByZXN1bHRzOworCisgIC8vIEFjY3VtdWxhdG9ycy4KKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbjsKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiByZWFsX3RpbWU7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gY3B1X3RpbWU7CisKKyAgLy8gUG9wdWxhdGUgdGhlIGFjY3VtdWxhdG9ycy4KKyAgZm9yIChjb25zdCBSdW4mIHJ1biA6IHJlcG9ydHMpIHsKKyAgICBDSEVDS19HVChydW4uY29tcGxleGl0eV9uLCAwKSA8PCAiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBTZXRDb21wbGV4aXR5Tj8iOworICAgIG4ucHVzaF9iYWNrKHJ1bi5jb21wbGV4aXR5X24pOworICAgIHJlYWxfdGltZS5wdXNoX2JhY2socnVuLnJlYWxfYWNjdW11bGF0ZWRfdGltZSAvIHJ1bi5pdGVyYXRpb25zKTsKKyAgICBjcHVfdGltZS5wdXNoX2JhY2socnVuLmNwdV9hY2N1bXVsYXRlZF90aW1lIC8gcnVuLml0ZXJhdGlvbnMpOworICB9CisKKyAgTGVhc3RTcSByZXN1bHRfY3B1OworICBMZWFzdFNxIHJlc3VsdF9yZWFsOworCisgIGlmIChyZXBvcnRzWzBdLmNvbXBsZXhpdHkgPT0gb0xhbWJkYSkgeworICAgIHJlc3VsdF9jcHUgPSBNaW5pbWFsTGVhc3RTcShuLCBjcHVfdGltZSwgcmVwb3J0c1swXS5jb21wbGV4aXR5X2xhbWJkYSk7CisgICAgcmVzdWx0X3JlYWwgPSBNaW5pbWFsTGVhc3RTcShuLCByZWFsX3RpbWUsIHJlcG9ydHNbMF0uY29tcGxleGl0eV9sYW1iZGEpOworICB9IGVsc2UgeworICAgIHJlc3VsdF9jcHUgPSBNaW5pbWFsTGVhc3RTcShuLCBjcHVfdGltZSwgcmVwb3J0c1swXS5jb21wbGV4aXR5KTsKKyAgICByZXN1bHRfcmVhbCA9IE1pbmltYWxMZWFzdFNxKG4sIHJlYWxfdGltZSwgcmVzdWx0X2NwdS5jb21wbGV4aXR5KTsKKyAgfQorCisgIC8vIERyb3AgdGhlICdhcmdzJyB3aGVuIHJlcG9ydGluZyBjb21wbGV4aXR5LgorICBhdXRvIHJ1bl9uYW1lID0gcmVwb3J0c1swXS5ydW5fbmFtZTsKKyAgcnVuX25hbWUuYXJncy5jbGVhcigpOworCisgIC8vIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBhY2N1bXVsYXRvciB0byBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuJ3MuCisgIFJ1biBiaWdfbzsKKyAgYmlnX28ucnVuX25hbWUgPSBydW5fbmFtZTsKKyAgYmlnX28ucnVuX3R5cGUgPSBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuOjpSVF9BZ2dyZWdhdGU7CisgIGJpZ19vLnJlcGV0aXRpb25zID0gcmVwb3J0c1swXS5yZXBldGl0aW9uczsKKyAgYmlnX28ucmVwZXRpdGlvbl9pbmRleCA9IFJ1bjo6bm9fcmVwZXRpdGlvbl9pbmRleDsKKyAgYmlnX28udGhyZWFkcyA9IHJlcG9ydHNbMF0udGhyZWFkczsKKyAgYmlnX28uYWdncmVnYXRlX25hbWUgPSAiQmlnTyI7CisgIGJpZ19vLnJlcG9ydF9sYWJlbCA9IHJlcG9ydHNbMF0ucmVwb3J0X2xhYmVsOworICBiaWdfby5pdGVyYXRpb25zID0gMDsKKyAgYmlnX28ucmVhbF9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0X3JlYWwuY29lZjsKKyAgYmlnX28uY3B1X2FjY3VtdWxhdGVkX3RpbWUgPSByZXN1bHRfY3B1LmNvZWY7CisgIGJpZ19vLnJlcG9ydF9iaWdfbyA9IHRydWU7CisgIGJpZ19vLmNvbXBsZXhpdHkgPSByZXN1bHRfY3B1LmNvbXBsZXhpdHk7CisKKyAgLy8gQWxsIHRoZSB0aW1lIHJlc3VsdHMgYXJlIHJlcG9ydGVkIGFmdGVyIGJlaW5nIG11bHRpcGxpZWQgYnkgdGhlCisgIC8vIHRpbWUgdW5pdCBtdWx0aXBsaWVyLiBCdXQgc2luY2UgUk1TIGlzIGEgcmVsYXRpdmUgcXVhbnRpdHkgaXQKKyAgLy8gc2hvdWxkIG5vdCBiZSBtdWx0aXBsaWVkIGF0IGFsbC4gU28sIGhlcmUsIHdlIF9kaXZpZGVfIGl0IGJ5IHRoZQorICAvLyBtdWx0aXBsaWVyIHNvIHRoYXQgd2hlbiBpdCBpcyBtdWx0aXBsaWVkIGxhdGVyIHRoZSByZXN1bHQgaXMgdGhlCisgIC8vIGNvcnJlY3Qgb25lLgorICBkb3VibGUgbXVsdGlwbGllciA9IEdldFRpbWVVbml0TXVsdGlwbGllcihyZXBvcnRzWzBdLnRpbWVfdW5pdCk7CisKKyAgLy8gT25seSBhZGQgbGFiZWwgdG8gbWVhbi9zdGRkZXYgaWYgaXQgaXMgc2FtZSBmb3IgYWxsIHJ1bnMKKyAgUnVuIHJtczsKKyAgcm1zLnJ1bl9uYW1lID0gcnVuX25hbWU7CisgIHJtcy5ydW5fdHlwZSA9IEJlbmNobWFya1JlcG9ydGVyOjpSdW46OlJUX0FnZ3JlZ2F0ZTsKKyAgcm1zLmFnZ3JlZ2F0ZV9uYW1lID0gIlJNUyI7CisgIHJtcy5yZXBvcnRfbGFiZWwgPSBiaWdfby5yZXBvcnRfbGFiZWw7CisgIHJtcy5pdGVyYXRpb25zID0gMDsKKyAgcm1zLnJlcGV0aXRpb25faW5kZXggPSBSdW46Om5vX3JlcGV0aXRpb25faW5kZXg7CisgIHJtcy5yZXBldGl0aW9ucyA9IHJlcG9ydHNbMF0ucmVwZXRpdGlvbnM7CisgIHJtcy50aHJlYWRzID0gcmVwb3J0c1swXS50aHJlYWRzOworICBybXMucmVhbF9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0X3JlYWwucm1zIC8gbXVsdGlwbGllcjsKKyAgcm1zLmNwdV9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0X2NwdS5ybXMgLyBtdWx0aXBsaWVyOworICBybXMucmVwb3J0X3JtcyA9IHRydWU7CisgIHJtcy5jb21wbGV4aXR5ID0gcmVzdWx0X2NwdS5jb21wbGV4aXR5OworICAvLyBkb24ndCBmb3JnZXQgdG8ga2VlcCB0aGUgdGltZSB1bml0LCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvCisgIC8vIHJlY292ZXIgdGhlIGNvcnJlY3QgdmFsdWUuCisgIHJtcy50aW1lX3VuaXQgPSByZXBvcnRzWzBdLnRpbWVfdW5pdDsKKworICByZXN1bHRzLnB1c2hfYmFjayhiaWdfbyk7CisgIHJlc3VsdHMucHVzaF9iYWNrKHJtcyk7CisgIHJldHVybiByZXN1bHRzOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvbXBsZXhpdHkuaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jb21wbGV4aXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyOWI0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jb21wbGV4aXR5LmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgSXNtYWVsIEppbWVuZXogTWFydGluZXouIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFNvdXJjZSBwcm9qZWN0IDogaHR0cHM6Ly9naXRodWIuY29tL2lzbWFlbEppbWVuZXovY3BwLmxlYXN0c3EKKy8vIEFkYXB0ZWQgdG8gYmUgdXNlZCB3aXRoIGdvb2dsZSBiZW5jaG1hcmsKKworI2lmbmRlZiBDT01QTEVYSVRZX0hfCisjZGVmaW5lIENPTVBMRVhJVFlfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCisvLyBSZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgYmlnTyBhbmQgUk1TIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkCisvLyBsaXN0IG9mIHJlcG9ydHMuIElmICdyZXBvcnRzLnNpemUoKSA8IDInIGFuIGVtcHR5IHZlY3RvciBpcyByZXR1cm5lZC4KK3N0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+IENvbXB1dGVCaWdPKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+JiByZXBvcnRzKTsKKworLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdCByZXR1cm5lZCBieSBNaW5pbWFsTGVhc3RTcQorLy8gICAtIGNvZWYgICAgICAgIDogRXN0aW1hdGVkIGNvZWZpY2llbnQgZm9yIHRoZSBoaWdoLW9yZGVyIHRlcm0gYXMKKy8vICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlZCBmcm9tIGRhdGEuCisvLyAgIC0gcm1zICAgICAgICAgOiBOb3JtYWxpemVkIFJvb3QgTWVhbiBTcXVhcmVkIEVycm9yLgorLy8gICAtIGNvbXBsZXhpdHkgIDogU2NhbGFiaWxpdHkgZm9ybSAoZS5nLiBvTiwgb05Mb2dOKS4gSW4gY2FzZSBhIHNjYWxhYmlsaXR5CisvLyAgICAgICAgICAgICAgICAgICBmb3JtIGhhcyBiZWVuIHByb3ZpZGVkIHRvIE1pbmltYWxMZWFzdFNxIHRoaXMgd2lsbCByZXR1cm4KKy8vICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHZhbHVlLiBJbiBjYXNlIEJpZ086Om9BdXRvIGhhcyBiZWVuIHNlbGVjdGVkLCB0aGlzCisvLyAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgd2lsbCByZXR1cm4gdGhlIGJlc3QgZml0dGluZyBjdXJ2ZSBkZXRlY3RlZC4KKworc3RydWN0IExlYXN0U3EgeworICBMZWFzdFNxKCkgOiBjb2VmKDAuMCksIHJtcygwLjApLCBjb21wbGV4aXR5KG9Ob25lKSB7fQorCisgIGRvdWJsZSBjb2VmOworICBkb3VibGUgcm1zOworICBCaWdPIGNvbXBsZXhpdHk7Cit9OworCisvLyBGdW5jdGlvbiB0byByZXR1cm4gYW4gc3RyaW5nIGZvciB0aGUgY2FsY3VsYXRlZCBjb21wbGV4aXR5CitzdGQ6OnN0cmluZyBHZXRCaWdPU3RyaW5nKEJpZ08gY29tcGxleGl0eSk7CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQ09NUExFWElUWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvbnNvbGVfcmVwb3J0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY29uc29sZV9yZXBvcnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQ3NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvbnNvbGVfcmVwb3J0ZXIuY2MKQEAgLTAsMCArMSwxNzcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiY29sb3JwcmludC5oIgorI2luY2x1ZGUgImNvbW1hbmRsaW5lZmxhZ3MuaCIKKyNpbmNsdWRlICJjb21wbGV4aXR5LmgiCisjaW5jbHVkZSAiY291bnRlci5oIgorI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorI2luY2x1ZGUgInN0cmluZ191dGlsLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCitib29sIENvbnNvbGVSZXBvcnRlcjo6UmVwb3J0Q29udGV4dChjb25zdCBDb250ZXh0JiBjb250ZXh0KSB7CisgIG5hbWVfZmllbGRfd2lkdGhfID0gY29udGV4dC5uYW1lX2ZpZWxkX3dpZHRoOworICBwcmludGVkX2hlYWRlcl8gPSBmYWxzZTsKKyAgcHJldl9jb3VudGVyc18uY2xlYXIoKTsKKworICBQcmludEJhc2ljQ29udGV4dCgmR2V0RXJyb3JTdHJlYW0oKSwgY29udGV4dCk7CisKKyNpZmRlZiBCRU5DSE1BUktfT1NfV0lORE9XUworICBpZiAoKG91dHB1dF9vcHRpb25zXyAmIE9PX0NvbG9yKSAmJiAmc3RkOjpjb3V0ICE9ICZHZXRPdXRwdXRTdHJlYW0oKSkgeworICAgIEdldEVycm9yU3RyZWFtKCkKKyAgICAgICAgPDwgIkNvbG9yIHByaW50aW5nIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBzdGRvdXQgb24gd2luZG93cy4iCisgICAgICAgICAgICIgRGlzYWJsaW5nIGNvbG9yIHByaW50aW5nXG4iOworICAgIG91dHB1dF9vcHRpb25zXyA9IHN0YXRpY19jYXN0PCBPdXRwdXRPcHRpb25zID4ob3V0cHV0X29wdGlvbnNfICYgfk9PX0NvbG9yKTsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29uc29sZVJlcG9ydGVyOjpQcmludEhlYWRlcihjb25zdCBSdW4mIHJ1bikgeworICBzdGQ6OnN0cmluZyBzdHIgPSBGb3JtYXRTdHJpbmcoIiUtKnMgJTEzcyAlMTVzICUxMnMiLCBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVfZmllbGRfd2lkdGhfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZW5jaG1hcmsiLCAiVGltZSIsICJDUFUiLCAiSXRlcmF0aW9ucyIpOworICBpZighcnVuLmNvdW50ZXJzLmVtcHR5KCkpIHsKKyAgICBpZihvdXRwdXRfb3B0aW9uc18gJiBPT19UYWJ1bGFyKSB7CisgICAgICBmb3IoYXV0byBjb25zdCYgYyA6IHJ1bi5jb3VudGVycykgeworICAgICAgICBzdHIgKz0gRm9ybWF0U3RyaW5nKCIgJTEwcyIsIGMuZmlyc3QuY19zdHIoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAiIFVzZXJDb3VudGVycy4uLiI7CisgICAgfQorICB9CisgIHN0ZDo6c3RyaW5nIGxpbmUgPSBzdGQ6OnN0cmluZyhzdHIubGVuZ3RoKCksICctJyk7CisgIEdldE91dHB1dFN0cmVhbSgpIDw8IGxpbmUgPDwgIlxuIiA8PCBzdHIgPDwgIlxuIiA8PCBsaW5lIDw8ICJcbiI7Cit9CisKK3ZvaWQgQ29uc29sZVJlcG9ydGVyOjpSZXBvcnRSdW5zKGNvbnN0IHN0ZDo6dmVjdG9yPFJ1bj4mIHJlcG9ydHMpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBydW4gOiByZXBvcnRzKSB7CisgICAgLy8gcHJpbnQgdGhlIGhlYWRlcjoKKyAgICAvLyAtLS0gaWYgbm9uZSB3YXMgcHJpbnRlZCB5ZXQKKyAgICBib29sIHByaW50X2hlYWRlciA9ICFwcmludGVkX2hlYWRlcl87CisgICAgLy8gLS0tIG9yIGlmIHRoZSBmb3JtYXQgaXMgdGFidWxhciBhbmQgdGhpcyBydW4KKyAgICAvLyAgICAgaGFzIGRpZmZlcmVudCBmaWVsZHMgZnJvbSB0aGUgcHJldiBoZWFkZXIKKyAgICBwcmludF9oZWFkZXIgfD0gKG91dHB1dF9vcHRpb25zXyAmIE9PX1RhYnVsYXIpICYmCisgICAgICAgICAgICAgICAgICAgICghaW50ZXJuYWw6OlNhbWVOYW1lcyhydW4uY291bnRlcnMsIHByZXZfY291bnRlcnNfKSk7CisgICAgaWYgKHByaW50X2hlYWRlcikgeworICAgICAgcHJpbnRlZF9oZWFkZXJfID0gdHJ1ZTsKKyAgICAgIHByZXZfY291bnRlcnNfID0gcnVuLmNvdW50ZXJzOworICAgICAgUHJpbnRIZWFkZXIocnVuKTsKKyAgICB9CisgICAgLy8gQXMgYW4gYWx0ZXJuYXRpdmUgdG8gcHJpbnRpbmcgdGhlIGhlYWRlcnMgbGlrZSB0aGlzLCB3ZSBjb3VsZCBzb3J0CisgICAgLy8gdGhlIGJlbmNobWFya3MgYnkgaGVhZGVyIGFuZCB0aGVuIHByaW50LiBCdXQgdGhpcyB3b3VsZCByZXF1aXJlCisgICAgLy8gd2FpdGluZyBmb3IgdGhlIGZ1bGwgcmVzdWx0cyBiZWZvcmUgcHJpbnRpbmcsIG9yIHByaW50aW5nIHR3aWNlLgorICAgIFByaW50UnVuRGF0YShydW4pOworICB9Cit9CisKK3N0YXRpYyB2b2lkIElnbm9yZUNvbG9yUHJpbnQoc3RkOjpvc3RyZWFtJiBvdXQsIExvZ0NvbG9yLCBjb25zdCBjaGFyKiBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIG91dCA8PCBGb3JtYXRTdHJpbmcoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworfQorCisKK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUaW1lKGRvdWJsZSB0aW1lKSB7CisgIC8vIEFsaWduIGRlY2ltYWwgcGxhY2VzLi4uCisgIGlmICh0aW1lIDwgMS4wKSB7CisgICAgcmV0dXJuIEZvcm1hdFN0cmluZygiJTEwLjNmIiwgdGltZSk7CisgIH0KKyAgaWYgKHRpbWUgPCAxMC4wKSB7CisgICAgcmV0dXJuIEZvcm1hdFN0cmluZygiJTEwLjJmIiwgdGltZSk7CisgIH0KKyAgaWYgKHRpbWUgPCAxMDAuMCkgeworICAgIHJldHVybiBGb3JtYXRTdHJpbmcoIiUxMC4xZiIsIHRpbWUpOworICB9CisgIHJldHVybiBGb3JtYXRTdHJpbmcoIiUxMC4wZiIsIHRpbWUpOworfQorCit2b2lkIENvbnNvbGVSZXBvcnRlcjo6UHJpbnRSdW5EYXRhKGNvbnN0IFJ1biYgcmVzdWx0KSB7CisgIHR5cGVkZWYgdm9pZChQcmludGVyRm4pKHN0ZDo6b3N0cmVhbSYsIExvZ0NvbG9yLCBjb25zdCBjaGFyKiwgLi4uKTsKKyAgYXV0byYgT3V0ID0gR2V0T3V0cHV0U3RyZWFtKCk7CisgIFByaW50ZXJGbiogcHJpbnRlciA9IChvdXRwdXRfb3B0aW9uc18gJiBPT19Db2xvcikgPworICAgICAgICAgICAgICAgICAgICAgICAgIChQcmludGVyRm4qKUNvbG9yUHJpbnRmIDogSWdub3JlQ29sb3JQcmludDsKKyAgYXV0byBuYW1lX2NvbG9yID0KKyAgICAgIChyZXN1bHQucmVwb3J0X2JpZ19vIHx8IHJlc3VsdC5yZXBvcnRfcm1zKSA/IENPTE9SX0JMVUUgOiBDT0xPUl9HUkVFTjsKKyAgcHJpbnRlcihPdXQsIG5hbWVfY29sb3IsICIlLSpzICIsIG5hbWVfZmllbGRfd2lkdGhfLAorICAgICAgICAgIHJlc3VsdC5iZW5jaG1hcmtfbmFtZSgpLmNfc3RyKCkpOworCisgIGlmIChyZXN1bHQuZXJyb3Jfb2NjdXJyZWQpIHsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfUkVELCAiRVJST1IgT0NDVVJSRUQ6IFwnJXNcJyIsCisgICAgICAgICAgICByZXN1bHQuZXJyb3JfbWVzc2FnZS5jX3N0cigpKTsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfREVGQVVMVCwgIlxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgZG91YmxlIHJlYWxfdGltZSA9IHJlc3VsdC5HZXRBZGp1c3RlZFJlYWxUaW1lKCk7CisgIGNvbnN0IGRvdWJsZSBjcHVfdGltZSA9IHJlc3VsdC5HZXRBZGp1c3RlZENQVVRpbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVhbF90aW1lX3N0ciA9IEZvcm1hdFRpbWUocmVhbF90aW1lKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY3B1X3RpbWVfc3RyID0gRm9ybWF0VGltZShjcHVfdGltZSk7CisKKworICBpZiAocmVzdWx0LnJlcG9ydF9iaWdfbykgeworICAgIHN0ZDo6c3RyaW5nIGJpZ19vID0gR2V0QmlnT1N0cmluZyhyZXN1bHQuY29tcGxleGl0eSk7CisgICAgcHJpbnRlcihPdXQsIENPTE9SX1lFTExPVywgIiUxMC4yZiAlLTRzICUxMC4yZiAlLTRzICIsIHJlYWxfdGltZSwgYmlnX28uY19zdHIoKSwKKyAgICAgICAgICAgIGNwdV90aW1lLCBiaWdfby5jX3N0cigpKTsKKyAgfSBlbHNlIGlmIChyZXN1bHQucmVwb3J0X3JtcykgeworICAgIHByaW50ZXIoT3V0LCBDT0xPUl9ZRUxMT1csICIlMTAuMGYgJS00cyAlMTAuMGYgJS00cyAiLCByZWFsX3RpbWUgKiAxMDAsICIlIiwKKyAgICAgICAgICAgIGNwdV90aW1lICogMTAwLCAiJSIpOworICB9IGVsc2UgeworICAgIGNvbnN0IGNoYXIqIHRpbWVMYWJlbCA9IEdldFRpbWVVbml0U3RyaW5nKHJlc3VsdC50aW1lX3VuaXQpOworICAgIHByaW50ZXIoT3V0LCBDT0xPUl9ZRUxMT1csICIlcyAlLTRzICVzICUtNHMgIiwgcmVhbF90aW1lX3N0ci5jX3N0cigpLCB0aW1lTGFiZWwsCisgICAgICAgICAgICBjcHVfdGltZV9zdHIuY19zdHIoKSwgdGltZUxhYmVsKTsKKyAgfQorCisgIGlmICghcmVzdWx0LnJlcG9ydF9iaWdfbyAmJiAhcmVzdWx0LnJlcG9ydF9ybXMpIHsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfQ1lBTiwgIiUxMGxsZCIsIHJlc3VsdC5pdGVyYXRpb25zKTsKKyAgfQorCisgIGZvciAoYXV0byYgYyA6IHJlc3VsdC5jb3VudGVycykgeworICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGNOYW1lTGVuID0gc3RkOjptYXgoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSgxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmZpcnN0Lmxlbmd0aCgpKTsKKyAgICBhdXRvIGNvbnN0JiBzID0gSHVtYW5SZWFkYWJsZU51bWJlcihjLnNlY29uZC52YWx1ZSwgYy5zZWNvbmQub25lSyk7CisgICAgY29uc3QgY2hhciogdW5pdCA9ICIiOworICAgIGlmIChjLnNlY29uZC5mbGFncyAmIENvdW50ZXI6OmtJc1JhdGUpCisgICAgICB1bml0ID0gKGMuc2Vjb25kLmZsYWdzICYgQ291bnRlcjo6a0ludmVydCkgPyAicyIgOiAiL3MiOworICAgIGlmIChvdXRwdXRfb3B0aW9uc18gJiBPT19UYWJ1bGFyKSB7CisgICAgICBwcmludGVyKE91dCwgQ09MT1JfREVGQVVMVCwgIiAlKnMlcyIsIGNOYW1lTGVuIC0gc3RybGVuKHVuaXQpLCBzLmNfc3RyKCksCisgICAgICAgICAgICAgIHVuaXQpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyKE91dCwgQ09MT1JfREVGQVVMVCwgIiAlcz0lcyVzIiwgYy5maXJzdC5jX3N0cigpLCBzLmNfc3RyKCksIHVuaXQpOworICAgIH0KKyAgfQorCisgIGlmICghcmVzdWx0LnJlcG9ydF9sYWJlbC5lbXB0eSgpKSB7CisgICAgcHJpbnRlcihPdXQsIENPTE9SX0RFRkFVTFQsICIgJXMiLCByZXN1bHQucmVwb3J0X2xhYmVsLmNfc3RyKCkpOworICB9CisKKyAgcHJpbnRlcihPdXQsIENPTE9SX0RFRkFVTFQsICJcbiIpOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvdW50ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY291bnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjViNzhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2NvdW50ZXIuY2MKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvdW50ZXIuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitkb3VibGUgRmluaXNoKENvdW50ZXIgY29uc3QmIGMsIEl0ZXJhdGlvbkNvdW50IGl0ZXJhdGlvbnMsIGRvdWJsZSBjcHVfdGltZSwKKyAgICAgICAgICAgICAgZG91YmxlIG51bV90aHJlYWRzKSB7CisgIGRvdWJsZSB2ID0gYy52YWx1ZTsKKyAgaWYgKGMuZmxhZ3MgJiBDb3VudGVyOjprSXNSYXRlKSB7CisgICAgdiAvPSBjcHVfdGltZTsKKyAgfQorICBpZiAoYy5mbGFncyAmIENvdW50ZXI6OmtBdmdUaHJlYWRzKSB7CisgICAgdiAvPSBudW1fdGhyZWFkczsKKyAgfQorICBpZiAoYy5mbGFncyAmIENvdW50ZXI6OmtJc0l0ZXJhdGlvbkludmFyaWFudCkgeworICAgIHYgKj0gaXRlcmF0aW9uczsKKyAgfQorICBpZiAoYy5mbGFncyAmIENvdW50ZXI6OmtBdmdJdGVyYXRpb25zKSB7CisgICAgdiAvPSBpdGVyYXRpb25zOworICB9CisKKyAgaWYgKGMuZmxhZ3MgJiBDb3VudGVyOjprSW52ZXJ0KSB7ICAvLyBJbnZlcnQgaXMgKmFsd2F5cyogbGFzdC4KKyAgICB2ID0gMS4wIC8gdjsKKyAgfQorICByZXR1cm4gdjsKK30KKwordm9pZCBGaW5pc2goVXNlckNvdW50ZXJzKiBsLCBJdGVyYXRpb25Db3VudCBpdGVyYXRpb25zLCBkb3VibGUgY3B1X3RpbWUsCisgICAgICAgICAgICBkb3VibGUgbnVtX3RocmVhZHMpIHsKKyAgZm9yIChhdXRvJiBjIDogKmwpIHsKKyAgICBjLnNlY29uZC52YWx1ZSA9IEZpbmlzaChjLnNlY29uZCwgaXRlcmF0aW9ucywgY3B1X3RpbWUsIG51bV90aHJlYWRzKTsKKyAgfQorfQorCit2b2lkIEluY3JlbWVudChVc2VyQ291bnRlcnMqIGwsIFVzZXJDb3VudGVycyBjb25zdCYgcikgeworICAvLyBhZGQgY291bnRlcnMgcHJlc2VudCBpbiBib3RoIG9yIGp1c3QgaW4gKmwKKyAgZm9yIChhdXRvJiBjIDogKmwpIHsKKyAgICBhdXRvIGl0ID0gci5maW5kKGMuZmlyc3QpOworICAgIGlmIChpdCAhPSByLmVuZCgpKSB7CisgICAgICBjLnNlY29uZC52YWx1ZSA9IGMuc2Vjb25kICsgaXQtPnNlY29uZDsKKyAgICB9CisgIH0KKyAgLy8gYWRkIGNvdW50ZXJzIHByZXNlbnQgaW4gciwgYnV0IG5vdCBpbiAqbAorICBmb3IgKGF1dG8gY29uc3QmIHRjIDogcikgeworICAgIGF1dG8gaXQgPSBsLT5maW5kKHRjLmZpcnN0KTsKKyAgICBpZiAoaXQgPT0gbC0+ZW5kKCkpIHsKKyAgICAgICgqbClbdGMuZmlyc3RdID0gdGMuc2Vjb25kOworICAgIH0KKyAgfQorfQorCitib29sIFNhbWVOYW1lcyhVc2VyQ291bnRlcnMgY29uc3QmIGwsIFVzZXJDb3VudGVycyBjb25zdCYgcikgeworICBpZiAoJmwgPT0gJnIpIHJldHVybiB0cnVlOworICBpZiAobC5zaXplKCkgIT0gci5zaXplKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChhdXRvIGNvbnN0JiBjIDogbCkgeworICAgIGlmIChyLmZpbmQoYy5maXJzdCkgPT0gci5lbmQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jb3VudGVyLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY291bnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNWE1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY291bnRlci5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQkVOQ0hNQVJLX0NPVU5URVJfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0NPVU5URVJfSF8KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKKy8vIHRoZXNlIGNvdW50ZXItcmVsYXRlZCBmdW5jdGlvbnMgYXJlIGhpZGRlbiB0byByZWR1Y2UgQVBJIHN1cmZhY2UuCituYW1lc3BhY2UgaW50ZXJuYWwgewordm9pZCBGaW5pc2goVXNlckNvdW50ZXJzKiBsLCBJdGVyYXRpb25Db3VudCBpdGVyYXRpb25zLCBkb3VibGUgdGltZSwKKyAgICAgICAgICAgIGRvdWJsZSBudW1fdGhyZWFkcyk7Cit2b2lkIEluY3JlbWVudChVc2VyQ291bnRlcnMqIGwsIFVzZXJDb3VudGVycyBjb25zdCYgcik7Citib29sIFNhbWVOYW1lcyhVc2VyQ291bnRlcnMgY29uc3QmIGwsIFVzZXJDb3VudGVycyBjb25zdCYgcik7Cit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX0NPVU5URVJfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jc3ZfcmVwb3J0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY3N2X3JlcG9ydGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMmMxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY3N2X3JlcG9ydGVyLmNjCkBAIC0wLDAgKzEsMTU0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgImNvbXBsZXhpdHkuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgInN0cmluZ191dGlsLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisKKy8vIEZpbGUgZm9ybWF0IHJlZmVyZW5jZTogaHR0cDovL2Vkb2Nlby5jb20vdXRpbGl0YXMvY3N2LWZpbGUtZm9ybWF0LgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworbmFtZXNwYWNlIHsKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlbGVtZW50cyA9IHsKKyAgICAibmFtZSIsICAgICAgICAgICAiaXRlcmF0aW9ucyIsICAgICAgICJyZWFsX3RpbWUiLCAgICAgICAgImNwdV90aW1lIiwKKyAgICAidGltZV91bml0IiwgICAgICAiYnl0ZXNfcGVyX3NlY29uZCIsICJpdGVtc19wZXJfc2Vjb25kIiwgImxhYmVsIiwKKyAgICAiZXJyb3Jfb2NjdXJyZWQiLCAiZXJyb3JfbWVzc2FnZSJ9OworfSAgLy8gbmFtZXNwYWNlCisKK3N0ZDo6c3RyaW5nIENzdkVzY2FwZShjb25zdCBzdGQ6OnN0cmluZyAmIHMpIHsKKyAgc3RkOjpzdHJpbmcgdG1wOworICB0bXAucmVzZXJ2ZShzLnNpemUoKSArIDIpOworICBmb3IgKGNoYXIgYyA6IHMpIHsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlICciJyA6IHRtcCArPSAiXCJcIiI7IGJyZWFrOworICAgIGRlZmF1bHQgIDogdG1wICs9IGM7IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gJyInICsgdG1wICsgJyInOworfQorCitib29sIENTVlJlcG9ydGVyOjpSZXBvcnRDb250ZXh0KGNvbnN0IENvbnRleHQmIGNvbnRleHQpIHsKKyAgUHJpbnRCYXNpY0NvbnRleHQoJkdldEVycm9yU3RyZWFtKCksIGNvbnRleHQpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDU1ZSZXBvcnRlcjo6UmVwb3J0UnVucyhjb25zdCBzdGQ6OnZlY3RvcjxSdW4+JiByZXBvcnRzKSB7CisgIHN0ZDo6b3N0cmVhbSYgT3V0ID0gR2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgaWYgKCFwcmludGVkX2hlYWRlcl8pIHsKKyAgICAvLyBzYXZlIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHVzZXIgY291bnRlcnMKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJ1biA6IHJlcG9ydHMpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgY250IDogcnVuLmNvdW50ZXJzKSB7CisgICAgICAgIGlmIChjbnQuZmlyc3QgPT0gImJ5dGVzX3Blcl9zZWNvbmQiIHx8IGNudC5maXJzdCA9PSAiaXRlbXNfcGVyX3NlY29uZCIpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIHVzZXJfY291bnRlcl9uYW1lc18uaW5zZXJ0KGNudC5maXJzdCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gcHJpbnQgdGhlIGhlYWRlcgorICAgIGZvciAoYXV0byBCID0gZWxlbWVudHMuYmVnaW4oKTsgQiAhPSBlbGVtZW50cy5lbmQoKTspIHsKKyAgICAgIE91dCA8PCAqQisrOworICAgICAgaWYgKEIgIT0gZWxlbWVudHMuZW5kKCkpIE91dCA8PCAiLCI7CisgICAgfQorICAgIGZvciAoYXV0byBCID0gdXNlcl9jb3VudGVyX25hbWVzXy5iZWdpbigpOworICAgICAgICAgQiAhPSB1c2VyX2NvdW50ZXJfbmFtZXNfLmVuZCgpOykgeworICAgICAgT3V0IDw8ICIsXCIiIDw8ICpCKysgPDwgIlwiIjsKKyAgICB9CisgICAgT3V0IDw8ICJcbiI7CisKKyAgICBwcmludGVkX2hlYWRlcl8gPSB0cnVlOworICB9IGVsc2UgeworICAgIC8vIGNoZWNrIHRoYXQgYWxsIHRoZSBjdXJyZW50IGNvdW50ZXJzIGFyZSBzYXZlZCBpbiB0aGUgbmFtZSBzZXQKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJ1biA6IHJlcG9ydHMpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgY250IDogcnVuLmNvdW50ZXJzKSB7CisgICAgICAgIGlmIChjbnQuZmlyc3QgPT0gImJ5dGVzX3Blcl9zZWNvbmQiIHx8IGNudC5maXJzdCA9PSAiaXRlbXNfcGVyX3NlY29uZCIpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIENIRUNLKHVzZXJfY291bnRlcl9uYW1lc18uZmluZChjbnQuZmlyc3QpICE9IHVzZXJfY291bnRlcl9uYW1lc18uZW5kKCkpCisgICAgICAgICAgICA8PCAiQWxsIGNvdW50ZXJzIG11c3QgYmUgcHJlc2VudCBpbiBlYWNoIHJ1bi4gIgorICAgICAgICAgICAgPDwgIkNvdW50ZXIgbmFtZWQgXCIiIDw8IGNudC5maXJzdAorICAgICAgICAgICAgPDwgIlwiIHdhcyBub3QgaW4gYSBydW4gYWZ0ZXIgYmVpbmcgYWRkZWQgdG8gdGhlIGhlYWRlciI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gcHJpbnQgcmVzdWx0cyBmb3IgZWFjaCBydW4KKyAgZm9yIChjb25zdCBhdXRvJiBydW4gOiByZXBvcnRzKSB7CisgICAgUHJpbnRSdW5EYXRhKHJ1bik7CisgIH0KK30KKwordm9pZCBDU1ZSZXBvcnRlcjo6UHJpbnRSdW5EYXRhKGNvbnN0IFJ1biYgcnVuKSB7CisgIHN0ZDo6b3N0cmVhbSYgT3V0ID0gR2V0T3V0cHV0U3RyZWFtKCk7CisgIE91dCA8PCBDc3ZFc2NhcGUocnVuLmJlbmNobWFya19uYW1lKCkpIDw8ICIsIjsKKyAgaWYgKHJ1bi5lcnJvcl9vY2N1cnJlZCkgeworICAgIE91dCA8PCBzdGQ6OnN0cmluZyhlbGVtZW50cy5zaXplKCkgLSAzLCAnLCcpOworICAgIE91dCA8PCAidHJ1ZSwiOworICAgIE91dCA8PCBDc3ZFc2NhcGUocnVuLmVycm9yX21lc3NhZ2UpIDw8ICJcbiI7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRG8gbm90IHByaW50IGl0ZXJhdGlvbiBvbiBiaWdPIGFuZCBSTVMgcmVwb3J0CisgIGlmICghcnVuLnJlcG9ydF9iaWdfbyAmJiAhcnVuLnJlcG9ydF9ybXMpIHsKKyAgICBPdXQgPDwgcnVuLml0ZXJhdGlvbnM7CisgIH0KKyAgT3V0IDw8ICIsIjsKKworICBPdXQgPDwgcnVuLkdldEFkanVzdGVkUmVhbFRpbWUoKSA8PCAiLCI7CisgIE91dCA8PCBydW4uR2V0QWRqdXN0ZWRDUFVUaW1lKCkgPDwgIiwiOworCisgIC8vIERvIG5vdCBwcmludCB0aW1lTGFiZWwgb24gYmlnTyBhbmQgUk1TIHJlcG9ydAorICBpZiAocnVuLnJlcG9ydF9iaWdfbykgeworICAgIE91dCA8PCBHZXRCaWdPU3RyaW5nKHJ1bi5jb21wbGV4aXR5KTsKKyAgfSBlbHNlIGlmICghcnVuLnJlcG9ydF9ybXMpIHsKKyAgICBPdXQgPDwgR2V0VGltZVVuaXRTdHJpbmcocnVuLnRpbWVfdW5pdCk7CisgIH0KKyAgT3V0IDw8ICIsIjsKKworICBpZiAocnVuLmNvdW50ZXJzLmZpbmQoImJ5dGVzX3Blcl9zZWNvbmQiKSAhPSBydW4uY291bnRlcnMuZW5kKCkpIHsKKyAgICBPdXQgPDwgcnVuLmNvdW50ZXJzLmF0KCJieXRlc19wZXJfc2Vjb25kIik7CisgIH0KKyAgT3V0IDw8ICIsIjsKKyAgaWYgKHJ1bi5jb3VudGVycy5maW5kKCJpdGVtc19wZXJfc2Vjb25kIikgIT0gcnVuLmNvdW50ZXJzLmVuZCgpKSB7CisgICAgT3V0IDw8IHJ1bi5jb3VudGVycy5hdCgiaXRlbXNfcGVyX3NlY29uZCIpOworICB9CisgIE91dCA8PCAiLCI7CisgIGlmICghcnVuLnJlcG9ydF9sYWJlbC5lbXB0eSgpKSB7CisgICAgT3V0IDw8IENzdkVzY2FwZShydW4ucmVwb3J0X2xhYmVsKTsKKyAgfQorICBPdXQgPDwgIiwsIjsgIC8vIGZvciBlcnJvcl9vY2N1cnJlZCBhbmQgZXJyb3JfbWVzc2FnZQorCisgIC8vIFByaW50IHVzZXIgY291bnRlcnMKKyAgZm9yIChjb25zdCBhdXRvJiB1Y24gOiB1c2VyX2NvdW50ZXJfbmFtZXNfKSB7CisgICAgYXV0byBpdCA9IHJ1bi5jb3VudGVycy5maW5kKHVjbik7CisgICAgaWYgKGl0ID09IHJ1bi5jb3VudGVycy5lbmQoKSkgeworICAgICAgT3V0IDw8ICIsIjsKKyAgICB9IGVsc2UgeworICAgICAgT3V0IDw8ICIsIiA8PCBpdC0+c2Vjb25kOworICAgIH0KKyAgfQorICBPdXQgPDwgJ1xuJzsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9jeWNsZWNsb2NrLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY3ljbGVjbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDYyYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvY3ljbGVjbG9jay5oCkBAIC0wLDAgKzEsMTkyIEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDeWNsZUNsb2NrCisvLyAgICBBIEN5Y2xlQ2xvY2sgdGVsbHMgeW91IHRoZSBjdXJyZW50IHRpbWUgaW4gQ3ljbGVzLiAgVGhlICJ0aW1lIgorLy8gICAgaXMgYWN0dWFsbHkgdGltZSBzaW5jZSBwb3dlci1vbi4gIFRoaXMgaXMgbGlrZSB0aW1lKCkgYnV0IGRvZXNuJ3QKKy8vICAgIGludm9sdmUgYSBzeXN0ZW0gY2FsbCBhbmQgaXMgbXVjaCBtb3JlIHByZWNpc2UuCisvLworLy8gTk9URTogTm90IGFsbCBjcHUvcGxhdGZvcm0va2VybmVsIGNvbWJpbmF0aW9ucyBndWFyYW50ZWUgdGhhdCB0aGlzCisvLyBjbG9jayBpbmNyZW1lbnRzIGF0IGEgY29uc3RhbnQgcmF0ZSBvciBpcyBzeW5jaHJvbml6ZWQgYWNyb3NzIGFsbCBsb2dpY2FsCisvLyBjcHVzIGluIGEgc3lzdGVtLgorLy8KKy8vIElmIHlvdSBuZWVkIHRoZSBhYm92ZSBndWFyYW50ZWVzLCBwbGVhc2UgY29uc2lkZXIgdXNpbmcgYSBkaWZmZXJlbnQKKy8vIEFQSS4gVGhlcmUgYXJlIGVmZm9ydHMgdG8gcHJvdmlkZSBhbiBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgYSBtaWxsaXNlY29uZAorLy8gZ3JhbnVsYXJpdHkgYW5kIGltcGxlbWVudGVkIGFzIGEgbWVtb3J5IHJlYWQuIEEgbWVtb3J5IHJlYWQgaXMgZ2VuZXJhbGx5CisvLyBjaGVhcGVyIHRoYW4gdGhlIEN5Y2xlQ2xvY2sgZm9yIG1hbnkgYXJjaGl0ZWN0dXJlcy4KKy8vCisvLyBBbHNvLCBpbiBzb21lIG91dCBvZiBvcmRlciBDUFUgaW1wbGVtZW50YXRpb25zLCB0aGUgQ3ljbGVDbG9jayBpcyBub3QKKy8vIHNlcmlhbGl6aW5nLiBTbyBpZiB5b3UncmUgdHJ5aW5nIHRvIGNvdW50IGF0IGN5Y2xlcyBncmFudWxhcml0eSwgeW91cgorLy8gZGF0YSBtaWdodCBiZSBpbmFjY3VyYXRlIGR1ZSB0byBvdXQgb2Ygb3JkZXIgaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEJFTkNITUFSS19DWUNMRUNMT0NLX0hfCisjZGVmaW5lIEJFTkNITUFSS19DWUNMRUNMT0NLX0hfCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorCisjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfTUFDT1NYKQorI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+CisjZW5kaWYKKy8vIEZvciBNU1ZDLCB3ZSB3YW50IHRvIHVzZSAnX2FzbSByZHRzYycgd2hlbiBwb3NzaWJsZSAoc2luY2UgaXQgd29ya3MKKy8vIHdpdGggZXZlbiBhbmNpZW50IE1TVkMgY29tcGlsZXJzKSwgYW5kIHdoZW4gbm90IHBvc3NpYmxlIHRoZQorLy8gX19yZHRzYyBpbnRyaW5zaWMsIGRlY2xhcmVkIGluIDxpbnRyaW4uaD4uICBVbmZvcnR1bmF0ZWx5LCBpbiBzb21lCisvLyBlbnZpcm9ubWVudHMsIDx3aW5kb3dzLmg+IGFuZCA8aW50cmluLmg+IGhhdmUgY29uZmxpY3RpbmcKKy8vIGRlY2xhcmF0aW9ucyBvZiBzb21lIG90aGVyIGludHJpbnNpY3MsIGJyZWFraW5nIGNvbXBpbGF0aW9uLgorLy8gVGhlcmVmb3JlLCB3ZSBzaW1wbHkgZGVjbGFyZSBfX3JkdHNjIG91cnNlbHZlcy4gU2VlIGFsc28KKy8vIGh0dHA6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vVmlzdWFsU3R1ZGlvL2ZlZWRiYWNrL2RldGFpbHMvMjYyMDQ3CisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKSAmJiAhZGVmaW5lZChfTV9JWDg2KQorZXh0ZXJuICJDIiB1aW50NjRfdCBfX3JkdHNjKCk7CisjcHJhZ21hIGludHJpbnNpYyhfX3JkdHNjKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChCRU5DSE1BUktfT1NfV0lORE9XUykgfHwgZGVmaW5lZChCRU5DSE1BUktfT1NfTUlOR1cpCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworI2lmZGVmIEJFTkNITUFSS19PU19FTVNDUklQVEVOCisjaW5jbHVkZSA8ZW1zY3JpcHRlbi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworLy8gTk9URTogb25seSBpMzg2IGFuZCB4ODZfNjQgaGF2ZSBiZWVuIHdlbGwgdGVzdGVkLgorLy8gUFBDLCBzcGFyYywgYWxwaGEsIGFuZCBpYTY0IGFyZSBiYXNlZCBvbgorLy8gICAgaHR0cDovL3BldGVyLmt1c2NzaWsuY29tL3dvcmRwcmVzcy8/cD0xNAorLy8gd2l0aCBtb2RpZmljYXRpb25zIGJ5IG0zYi4gIFNlZSBhbHNvCisvLyAgICBodHRwczovL3NldGlzdm4uc3NsLmJlcmtlbGV5LmVkdS9zdm4vbGliL2ZmdHctMy4wLjEva2VybmVsL2N5Y2xlLmgKK25hbWVzcGFjZSBjeWNsZWNsb2NrIHsKKy8vIFRoaXMgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBzaW5jZSBwb3dlci1vbi4gIFRocmVhZC1zYWZlLgoraW5saW5lIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIGludDY0X3QgTm93KCkgeworI2lmIGRlZmluZWQoQkVOQ0hNQVJLX09TX01BQ09TWCkKKyAgLy8gdGhpcyBnb2VzIGF0IHRoZSB0b3AgYmVjYXVzZSB3ZSBuZWVkIEFMTCBNYWNzLCByZWdhcmRsZXNzIG9mCisgIC8vIGFyY2hpdGVjdHVyZSwgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgIm1hY2ggdGltZSB1bml0cyIgdGhhdAorICAvLyBoYXZlIHBhc3NlZCBzaW5jZSBzdGFydHVwLiAgU2VlIHN5c2luZm8uY2Mgd2hlcmUKKyAgLy8gSW5pdGlhbGl6ZVN5c3RlbUluZm8oKSBzZXRzIHRoZSBzdXBwb3NlZCBjcHUgY2xvY2sgZnJlcXVlbmN5IG9mCisgIC8vIG1hY3MgdG8gdGhlIG51bWJlciBvZiBtYWNoIHRpbWUgdW5pdHMgcGVyIHNlY29uZCwgbm90IGFjdHVhbAorICAvLyBDUFUgY2xvY2sgZnJlcXVlbmN5ICh3aGljaCBjYW4gY2hhbmdlIGluIHRoZSBmYWNlIG9mIENQVQorICAvLyBmcmVxdWVuY3kgc2NhbGluZykuICBBbHNvIG5vdGUgdGhhdCB3aGVuIHRoZSBNYWMgc2xlZXBzLCB0aGlzCisgIC8vIGNvdW50ZXIgcGF1c2VzOyBpdCBkb2VzIG5vdCBjb250aW51ZSBjb3VudGluZywgbm9yIGRvZXMgaXQKKyAgLy8gcmVzZXQgdG8gemVyby4KKyAgcmV0dXJuIG1hY2hfYWJzb2x1dGVfdGltZSgpOworI2VsaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfRU1TQ1JJUFRFTikKKyAgLy8gdGhpcyBnb2VzIGFib3ZlIHg4Ni1zcGVjaWZpYyBjb2RlIGJlY2F1c2Ugb2xkIHZlcnNpb25zIG9mIEVtc2NyaXB0ZW4KKyAgLy8gZGVmaW5lIF9feDg2XzY0X18sIGFsdGhvdWdoIHRoZXkgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggaXQuCisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90PihlbXNjcmlwdGVuX2dldF9ub3coKSAqIDFlKzYpOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyAgaW50NjRfdCByZXQ7CisgIF9fYXNtX18gdm9sYXRpbGUoInJkdHNjIiA6ICI9QSIocmV0KSk7CisgIHJldHVybiByZXQ7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hbWQ2NF9fKQorICB1aW50NjRfdCBsb3csIGhpZ2g7CisgIF9fYXNtX18gdm9sYXRpbGUoInJkdHNjIiA6ICI9YSIobG93KSwgIj1kIihoaWdoKSk7CisgIHJldHVybiAoaGlnaCA8PCAzMikgfCBsb3c7CisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fcHBjX18pCisgIC8vIFRoaXMgcmV0dXJucyBhIHRpbWUtYmFzZSwgd2hpY2ggaXMgbm90IGFsd2F5cyBwcmVjaXNlbHkgYSBjeWNsZS1jb3VudC4KKyAgaW50NjRfdCB0YmwsIHRidTAsIHRidTE7CisgIGFzbSgibWZ0YnUgJTAiIDogIj1yIih0YnUwKSk7CisgIGFzbSgibWZ0YiAgJTAiIDogIj1yIih0YmwpKTsKKyAgYXNtKCJtZnRidSAlMCIgOiAiPXIiKHRidTEpKTsKKyAgdGJsICY9IC1zdGF0aWNfY2FzdDxpbnQ2NF90Pih0YnUwID09IHRidTEpOworICAvLyBoaWdoIDMyIGJpdHMgaW4gdGJ1MTsgbG93IDMyIGJpdHMgaW4gdGJsICAodGJ1MCBpcyBnYXJiYWdlKQorICByZXR1cm4gKHRidTEgPDwgMzIpIHwgdGJsOworI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisgIGludDY0X3QgdGljazsKKyAgYXNtKCIuYnl0ZSAweDgzLCAweDQxLCAweDAwLCAweDAwIik7CisgIGFzbSgibW92ICAgJSVnMSwgJTAiIDogIj1yIih0aWNrKSk7CisgIHJldHVybiB0aWNrOworI2VsaWYgZGVmaW5lZChfX2lhNjRfXykKKyAgaW50NjRfdCBpdGM7CisgIGFzbSgibW92ICUwID0gYXIuaXRjIiA6ICI9ciIoaXRjKSk7CisgIHJldHVybiBpdGM7CisjZWxpZiBkZWZpbmVkKENPTVBJTEVSX01TVkMpICYmIGRlZmluZWQoX01fSVg4NikKKyAgLy8gT2xkZXIgTVNWQyBjb21waWxlcnMgKGxpa2UgNy54KSBkb24ndCBzZWVtIHRvIHN1cHBvcnQgdGhlCisgIC8vIF9fcmR0c2MgaW50cmluc2ljIHByb3Blcmx5LCBzbyBJIHByZWZlciB0byB1c2UgX2FzbSBpbnN0ZWFkCisgIC8vIHdoZW4gSSBrbm93IGl0IHdpbGwgd29yay4gIE90aGVyd2lzZSwgSSdsbCB1c2UgX19yZHRzYyBhbmQgaG9wZQorICAvLyB0aGUgY29kZSBpcyBiZWluZyBjb21waWxlZCB3aXRoIGEgbm9uLWFuY2llbnQgY29tcGlsZXIuCisgIF9hc20gcmR0c2MKKyNlbGlmIGRlZmluZWQoQ09NUElMRVJfTVNWQykKKyAgcmV0dXJuIF9fcmR0c2MoKTsKKyNlbGlmIGRlZmluZWQoQkVOQ0hNQVJLX09TX05BQ0wpCisgIC8vIE5hdGl2ZSBDbGllbnQgdmFsaWRhdG9yIG9uIHg4Ni94ODYtNjQgYWxsb3dzIFJEVFNDIGluc3RydWN0aW9ucywKKyAgLy8gYW5kIHRoaXMgY2FzZSBpcyBoYW5kbGVkIGFib3ZlLiBOYXRpdmUgQ2xpZW50IHZhbGlkYXRvciBvbiBBUk0KKyAgLy8gcmVqZWN0cyBNUkMgaW5zdHJ1Y3Rpb25zICh1c2VkIGluIHRoZSBBUk0tc3BlY2lmaWMgc2VxdWVuY2UgYmVsb3cpLAorICAvLyBzbyB3ZSBoYW5kbGUgaXQgaGVyZS4gUG9ydGFibGUgTmF0aXZlIENsaWVudCBjb21waWxlcyB0bworICAvLyBhcmNoaXRlY3R1cmUtYWdub3N0aWMgYnl0ZWNvZGUsIHdoaWNoIGRvZXNuJ3QgcHJvdmlkZSBhbnkKKyAgLy8gY3ljbGUgY291bnRlciBhY2Nlc3MgbW5lbW9uaWNzLgorCisgIC8vIE5hdGl2ZSBDbGllbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgQVBJIHRvIGFjY2VzcyBjeWNsZSBjb3VudGVyLgorICAvLyBVc2UgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIC4uLikgaW5zdGVhZCBvZiBnZXR0aW1lb2ZkYXkKKyAgLy8gYmVjYXVzZSBpcyBwcm92aWRlcyBuYW5vc2Vjb25kIHJlc29sdXRpb24gKHdoaWNoIGlzIG5vdGljYWJsZSBhdAorICAvLyBsZWFzdCBmb3IgUE5hQ2wgbW9kdWxlcyBydW5uaW5nIG9uIHg4NiBNYWMgJiBMaW51eCkuCisgIC8vIEluaXRpYWxpemUgdG8gYWx3YXlzIHJldHVybiAwIGlmIGNsb2NrX2dldHRpbWUgZmFpbHMuCisgIHN0cnVjdCB0aW1lc3BlYyB0cyA9IHswLCAwfTsKKyAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0cy50dl9zZWMpICogMTAwMDAwMDAwMCArIHRzLnR2X25zZWM7CisjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorICAvLyBTeXN0ZW0gdGltZXIgb2YgQVJNdjggcnVucyBhdCBhIGRpZmZlcmVudCBmcmVxdWVuY3kgdGhhbiB0aGUgQ1BVJ3MuCisgIC8vIFRoZSBmcmVxdWVuY3kgaXMgZml4ZWQsIHR5cGljYWxseSBpbiB0aGUgcmFuZ2UgMS01ME1Iei4gIEl0IGNhbiBiZQorICAvLyByZWFkIGF0IENOVEZSUSBzcGVjaWFsIHJlZ2lzdGVyLiAgV2UgYXNzdW1lIHRoZSBPUyBoYXMgc2V0IHVwCisgIC8vIHRoZSB2aXJ0dWFsIHRpbWVyIHByb3Blcmx5LgorICBpbnQ2NF90IHZpcnR1YWxfdGltZXJfdmFsdWU7CisgIGFzbSB2b2xhdGlsZSgibXJzICUwLCBjbnR2Y3RfZWwwIiA6ICI9ciIodmlydHVhbF90aW1lcl92YWx1ZSkpOworICByZXR1cm4gdmlydHVhbF90aW1lcl92YWx1ZTsKKyNlbGlmIGRlZmluZWQoX19BUk1fQVJDSCkKKyAgLy8gVjYgaXMgdGhlIGVhcmxpZXN0IGFyY2ggdGhhdCBoYXMgYSBzdGFuZGFyZCBjeWNsZWNvdW50CisgIC8vIE5hdGl2ZSBDbGllbnQgdmFsaWRhdG9yIGRvZXNuJ3QgYWxsb3cgTVJDIGluc3RydWN0aW9ucy4KKyNpZiAoX19BUk1fQVJDSCA+PSA2KQorICB1aW50MzJfdCBwbWNjbnRyOworICB1aW50MzJfdCBwbXVzZXJlbjsKKyAgdWludDMyX3QgcG1jbnRlbnNldDsKKyAgLy8gUmVhZCB0aGUgdXNlciBtb2RlIHBlcmYgbW9uaXRvciBjb3VudGVyIGFjY2VzcyBwZXJtaXNzaW9ucy4KKyAgYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxNCwgMCIgOiAiPXIiKHBtdXNlcmVuKSk7CisgIGlmIChwbXVzZXJlbiAmIDEpIHsgIC8vIEFsbG93cyByZWFkaW5nIHBlcmZtb24gY291bnRlcnMgZm9yIHVzZXIgbW9kZSBjb2RlLgorICAgIGFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMCwgJTAsIGM5LCBjMTIsIDEiIDogIj1yIihwbWNudGVuc2V0KSk7CisgICAgaWYgKHBtY250ZW5zZXQgJiAweDgwMDAwMDAwdWwpIHsgIC8vIElzIGl0IGNvdW50aW5nPworICAgICAgYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMCIgOiAiPXIiKHBtY2NudHIpKTsKKyAgICAgIC8vIFRoZSBjb3VudGVyIGlzIHNldCB1cCB0byBjb3VudCBldmVyeSA2NHRoIGN5Y2xlCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4ocG1jY250cikgKiA2NDsgIC8vIFNob3VsZCBvcHRpbWl6ZSB0byA8PCA2CisgICAgfQorICB9CisjZW5kaWYKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGdldHRpbWVvZmRheSgmdHYsIG51bGxwdHIpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4odHYudHZfc2VjKSAqIDEwMDAwMDAgKyB0di50dl91c2VjOworI2VsaWYgZGVmaW5lZChfX21pcHNfXykKKyAgLy8gbWlwcyBhcHBhcmVudGx5IG9ubHkgYWxsb3dzIHJkdHNjIGZvciBzdXBlcnVzZXJzLCBzbyB3ZSBmYWxsCisgIC8vIGJhY2sgdG8gZ2V0dGltZW9mZGF5LiAgSXQncyBwb3NzaWJsZSBjbG9ja19nZXR0aW1lIHdvdWxkIGJlIGJldHRlci4KKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGdldHRpbWVvZmRheSgmdHYsIG51bGxwdHIpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4odHYudHZfc2VjKSAqIDEwMDAwMDAgKyB0di50dl91c2VjOworI2VsaWYgZGVmaW5lZChfX3MzOTBfXykgIC8vIENvdmVycyBib3RoIHMzOTAgYW5kIHMzOTB4LgorICAvLyBSZXR1cm4gdGhlIENQVSBjbG9jay4KKyAgdWludDY0X3QgdHNjOworICBhc20oInN0Y2sgJTAiIDogIj1RIih0c2MpIDogOiAiY2MiKTsKKyAgcmV0dXJuIHRzYzsKKyNlbGlmIGRlZmluZWQoX19yaXNjdikgLy8gUklTQy1WCisgIC8vIFVzZSBSRENZQ0xFIChhbmQgUkRDWUNMRUggb24gcmlzY3YzMikKKyNpZiBfX3Jpc2N2X3hsZW4gPT0gMzIKKyAgdWludDY0X3QgY3ljbGVzX2xvdywgY3ljbGVzX2hpMCwgY3ljbGVzX2hpMTsKKyAgYXNtKCJyZGN5Y2xlaCAlMCIgOiAiPXIiKGN5Y2xlc19oaTApKTsKKyAgYXNtKCJyZGN5Y2xlICUwIiA6ICI9ciIoY3ljbGVzX2xvKSk7CisgIGFzbSgicmRjeWNsZWggJTAiIDogIj1yIihjeWNsZXNfaGkxKSk7CisgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgUG93ZXJQQyBvdmVyZmxvdyBkZXRlY3Rpb24sIGFib3ZlCisgIGN5Y2xlc19sbyAmPSAtc3RhdGljX2Nhc3Q8aW50NjRfdD4oY3ljbGVzX2hpMCA9PSBjeWNsZXNfaGkxKTsKKyAgcmV0dXJuIChjeWNsZXNfaGkxIDw8IDMyKSB8IGN5Y2xlc19sbzsKKyNlbHNlCisgIHVpbnQ2NF90IGN5Y2xlczsKKyAgYXNtKCJyZGN5Y2xlICUwIiA6ICI9ciIoY3ljbGVzKSk7CisgIHJldHVybiBjeWNsZXM7CisjZW5kaWYKKyNlbHNlCisvLyBUaGUgc29mdCBmYWlsb3ZlciB0byBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaXMgYXV0b21hdGljIG9ubHkgZm9yIEFSTS4KKy8vIEZvciBvdGhlciBwbGF0Zm9ybXMgdGhlIGRldmVsb3BlciBpcyBleHBlY3RlZCB0byBtYWtlIGFuIGF0dGVtcHQgdG8gY3JlYXRlCisvLyBhIGZhc3QgaW1wbGVtZW50YXRpb24gYW5kIHVzZSBnZW5lcmljIHZlcnNpb24gaWYgbm90aGluZyBiZXR0ZXIgaXMgYXZhaWxhYmxlLgorI2Vycm9yIFlvdSBuZWVkIHRvIGRlZmluZSBDeWNsZVRpbWVyIGZvciB5b3VyIE9TIGFuZCBDUFUKKyNlbmRpZgorfQorfSAgLy8gZW5kIG5hbWVzcGFjZSBjeWNsZWNsb2NrCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19DWUNMRUNMT0NLX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvaW50ZXJuYWxfbWFjcm9zLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvaW50ZXJuYWxfbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkZjAwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9pbnRlcm5hbF9tYWNyb3MuaApAQCAtMCwwICsxLDk0IEBACisjaWZuZGVmIEJFTkNITUFSS19JTlRFUk5BTF9NQUNST1NfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0lOVEVSTkFMX01BQ1JPU19IXworCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCisvKiBOZWVkZWQgdG8gZGV0ZWN0IFNUTCAqLworI2luY2x1ZGUgPGNzdGRsaWI+CisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworI2lmbmRlZiBfX2hhc19mZWF0dXJlCisjZGVmaW5lIF9faGFzX2ZlYXR1cmUoeCkgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyAgI2lmICFkZWZpbmVkKENPTVBJTEVSX0NMQU5HKQorICAgICNkZWZpbmUgQ09NUElMRVJfQ0xBTkcKKyAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAjaWYgIWRlZmluZWQoQ09NUElMRVJfTVNWQykKKyAgICAjZGVmaW5lIENPTVBJTEVSX01TVkMKKyAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorICAjaWYgIWRlZmluZWQoQ09NUElMRVJfR0NDKQorICAgICNkZWZpbmUgQ09NUElMRVJfR0NDCisgICNlbmRpZgorI2VuZGlmCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9hdHRyaWJ1dGVzKQorICAjZGVmaW5lIEJFTkNITUFSS19OT1JFVFVSTiBbW25vcmV0dXJuXV0KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisgICNkZWZpbmUgQkVOQ0hNQVJLX05PUkVUVVJOIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyNlbGlmIGRlZmluZWQoQ09NUElMRVJfTVNWQykKKyAgI2RlZmluZSBCRU5DSE1BUktfTk9SRVRVUk4gX19kZWNsc3BlYyhub3JldHVybikKKyNlbHNlCisgICNkZWZpbmUgQkVOQ0hNQVJLX05PUkVUVVJOCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKyAgI2RlZmluZSBCRU5DSE1BUktfT1NfQ1lHV0lOIDEKKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorICAjZGVmaW5lIEJFTkNITUFSS19PU19XSU5ET1dTIDEKKyAgI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICAgI2RlZmluZSBCRU5DSE1BUktfT1NfTUlOR1cgMQorICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorICAjZGVmaW5lIEJFTkNITUFSS19PU19BUFBMRSAxCisgICNpbmNsdWRlICJUYXJnZXRDb25kaXRpb25hbHMuaCIKKyAgI2lmIGRlZmluZWQoVEFSR0VUX09TX01BQykKKyAgICAjZGVmaW5lIEJFTkNITUFSS19PU19NQUNPU1ggMQorICAgICNpZiBkZWZpbmVkKFRBUkdFVF9PU19JUEhPTkUpCisgICAgICAjZGVmaW5lIEJFTkNITUFSS19PU19JT1MgMQorICAgICNlbmRpZgorICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCisgICNkZWZpbmUgQkVOQ0hNQVJLX09TX0ZSRUVCU0QgMQorI2VsaWYgZGVmaW5lZChfX05ldEJTRF9fKQorICAjZGVmaW5lIEJFTkNITUFSS19PU19ORVRCU0QgMQorI2VsaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyAgI2RlZmluZSBCRU5DSE1BUktfT1NfT1BFTkJTRCAxCisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgI2RlZmluZSBCRU5DSE1BUktfT1NfTElOVVggMQorI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyAgI2RlZmluZSBCRU5DSE1BUktfT1NfTkFDTCAxCisjZWxpZiBkZWZpbmVkKF9fRU1TQ1JJUFRFTl9fKQorICAjZGVmaW5lIEJFTkNITUFSS19PU19FTVNDUklQVEVOIDEKKyNlbGlmIGRlZmluZWQoX19ydGVtc19fKQorICAjZGVmaW5lIEJFTkNITUFSS19PU19SVEVNUyAxCisjZWxpZiBkZWZpbmVkKF9fRnVjaHNpYV9fKQorI2RlZmluZSBCRU5DSE1BUktfT1NfRlVDSFNJQSAxCisjZWxpZiBkZWZpbmVkIChfX1NWUjQpICYmIGRlZmluZWQgKF9fc3VuKQorI2RlZmluZSBCRU5DSE1BUktfT1NfU09MQVJJUyAxCisjZWxpZiBkZWZpbmVkKF9fUU5YX18pCisjZGVmaW5lIEJFTkNITUFSS19PU19RTlggMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBkZWZpbmVkKF9fR0xJQkNYWF9fKQorI2RlZmluZSBCRU5DSE1BUktfU1RMX0FORFJPSURfR05VU1RMIDEKKyNlbmRpZgorCisjaWYgIV9faGFzX2ZlYXR1cmUoY3h4X2V4Y2VwdGlvbnMpICYmICFkZWZpbmVkKF9fY3BwX2V4Y2VwdGlvbnMpIFwKKyAgICAgJiYgIWRlZmluZWQoX19FWENFUFRJT05TKQorICAjZGVmaW5lIEJFTkNITUFSS19IQVNfTk9fRVhDRVBUSU9OUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTVBJTEVSX0NMQU5HKSB8fCBkZWZpbmVkKENPTVBJTEVSX0dDQykKKyAgI2RlZmluZSBCRU5DSE1BUktfTUFZQkVfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorICAjZGVmaW5lIEJFTkNITUFSS19NQVlCRV9VTlVTRUQKKyNlbmRpZgorCisvLyBjbGFuZy1mb3JtYXQgb24KKworI2VuZGlmICAvLyBCRU5DSE1BUktfSU5URVJOQUxfTUFDUk9TX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvanNvbl9yZXBvcnRlci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9qc29uX3JlcG9ydGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZjNjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvanNvbl9yZXBvcnRlci5jYwpAQCAtMCwwICsxLDI1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKyNpbmNsdWRlICJjb21wbGV4aXR5LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpb21hbmlwPiAgLy8gZm9yIHNldHByZWNpc2lvbgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAic3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJ0aW1lcnMuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6c3RyaW5nIFN0ckVzY2FwZShjb25zdCBzdGQ6OnN0cmluZyAmIHMpIHsKKyAgc3RkOjpzdHJpbmcgdG1wOworICB0bXAucmVzZXJ2ZShzLnNpemUoKSk7CisgIGZvciAoY2hhciBjIDogcykgeworICAgIHN3aXRjaCAoYykgeworICAgIGNhc2UgJ1xiJzogdG1wICs9ICJcXGIiOyBicmVhazsKKyAgICBjYXNlICdcZic6IHRtcCArPSAiXFxmIjsgYnJlYWs7CisgICAgY2FzZSAnXG4nOiB0bXAgKz0gIlxcbiI7IGJyZWFrOworICAgIGNhc2UgJ1xyJzogdG1wICs9ICJcXHIiOyBicmVhazsKKyAgICBjYXNlICdcdCc6IHRtcCArPSAiXFx0IjsgYnJlYWs7CisgICAgY2FzZSAnXFwnOiB0bXAgKz0gIlxcXFwiOyBicmVhazsKKyAgICBjYXNlICciJyA6IHRtcCArPSAiXFxcIiI7IGJyZWFrOworICAgIGRlZmF1bHQgIDogdG1wICs9IGM7IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gdG1wOworfQorCitzdGQ6OnN0cmluZyBGb3JtYXRLVihzdGQ6OnN0cmluZyBjb25zdCYga2V5LCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUpIHsKKyAgcmV0dXJuIFN0ckZvcm1hdCgiXCIlc1wiOiBcIiVzXCIiLCBTdHJFc2NhcGUoa2V5KS5jX3N0cigpLCBTdHJFc2NhcGUodmFsdWUpLmNfc3RyKCkpOworfQorCitzdGQ6OnN0cmluZyBGb3JtYXRLVihzdGQ6OnN0cmluZyBjb25zdCYga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICByZXR1cm4gU3RyRm9ybWF0KCJcIiVzXCI6IFwiJXNcIiIsIFN0ckVzY2FwZShrZXkpLmNfc3RyKCksIFN0ckVzY2FwZSh2YWx1ZSkuY19zdHIoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIEZvcm1hdEtWKHN0ZDo6c3RyaW5nIGNvbnN0JiBrZXksIGJvb2wgdmFsdWUpIHsKKyAgcmV0dXJuIFN0ckZvcm1hdCgiXCIlc1wiOiAlcyIsIFN0ckVzY2FwZShrZXkpLmNfc3RyKCksIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Cit9CisKK3N0ZDo6c3RyaW5nIEZvcm1hdEtWKHN0ZDo6c3RyaW5nIGNvbnN0JiBrZXksIGludDY0X3QgdmFsdWUpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8ICciJyA8PCBTdHJFc2NhcGUoa2V5KSA8PCAiXCI6ICIgPDwgdmFsdWU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgRm9ybWF0S1Yoc3RkOjpzdHJpbmcgY29uc3QmIGtleSwgSXRlcmF0aW9uQ291bnQgdmFsdWUpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8ICciJyA8PCBTdHJFc2NhcGUoa2V5KSA8PCAiXCI6ICIgPDwgdmFsdWU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgRm9ybWF0S1Yoc3RkOjpzdHJpbmcgY29uc3QmIGtleSwgZG91YmxlIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAnIicgPDwgU3RyRXNjYXBlKGtleSkgPDwgIlwiOiAiOworCisgIGlmIChzdGQ6OmlzbmFuKHZhbHVlKSkKKyAgICBzcyA8PCAodmFsdWUgPCAwID8gIi0iIDogIiIpIDw8ICJOYU4iOworICBlbHNlIGlmIChzdGQ6OmlzaW5mKHZhbHVlKSkKKyAgICBzcyA8PCAodmFsdWUgPCAwID8gIi0iIDogIiIpIDw8ICJJbmZpbml0eSI7CisgIGVsc2UgeworICAgIGNvbnN0IGF1dG8gbWF4X2RpZ2l0czEwID0KKyAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxkZWNsdHlwZSh2YWx1ZSk+OjptYXhfZGlnaXRzMTA7CisgICAgY29uc3QgYXV0byBtYXhfZnJhY3Rpb25hbF9kaWdpdHMxMCA9IG1heF9kaWdpdHMxMCAtIDE7CisgICAgc3MgPDwgc3RkOjpzY2llbnRpZmljIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKG1heF9mcmFjdGlvbmFsX2RpZ2l0czEwKQorICAgICAgIDw8IHZhbHVlOworICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworaW50NjRfdCBSb3VuZERvdWJsZShkb3VibGUgdikgeyByZXR1cm4gc3RkOjpscm91bmQodik7IH0KKworfSAgLy8gZW5kIG5hbWVzcGFjZQorCitib29sIEpTT05SZXBvcnRlcjo6UmVwb3J0Q29udGV4dChjb25zdCBDb250ZXh0JiBjb250ZXh0KSB7CisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gR2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgb3V0IDw8ICJ7XG4iOworICBzdGQ6OnN0cmluZyBpbm5lcl9pbmRlbnQoMiwgJyAnKTsKKworICAvLyBPcGVuIGNvbnRleHQgYmxvY2sgYW5kIHByaW50IGNvbnRleHQgaW5mb3JtYXRpb24uCisgIG91dCA8PCBpbm5lcl9pbmRlbnQgPDwgIlwiY29udGV4dFwiOiB7XG4iOworICBzdGQ6OnN0cmluZyBpbmRlbnQoNCwgJyAnKTsKKworICBzdGQ6OnN0cmluZyB3YWxsdGltZV92YWx1ZSA9IExvY2FsRGF0ZVRpbWVTdHJpbmcoKTsKKyAgb3V0IDw8IGluZGVudCA8PCBGb3JtYXRLVigiZGF0ZSIsIHdhbGx0aW1lX3ZhbHVlKSA8PCAiLFxuIjsKKworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJob3N0X25hbWUiLCBjb250ZXh0LnN5c19pbmZvLm5hbWUpIDw8ICIsXG4iOworCisgIGlmIChDb250ZXh0OjpleGVjdXRhYmxlX25hbWUpIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJleGVjdXRhYmxlIiwgQ29udGV4dDo6ZXhlY3V0YWJsZV9uYW1lKSA8PCAiLFxuIjsKKyAgfQorCisgIENQVUluZm8gY29uc3QmIGluZm8gPSBjb250ZXh0LmNwdV9pbmZvOworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJudW1fY3B1cyIsIHN0YXRpY19jYXN0PGludDY0X3Q+KGluZm8ubnVtX2NwdXMpKQorICAgICAgPDwgIixcbiI7CisgIG91dCA8PCBpbmRlbnQKKyAgICAgIDw8IEZvcm1hdEtWKCJtaHpfcGVyX2NwdSIsCisgICAgICAgICAgICAgICAgICBSb3VuZERvdWJsZShpbmZvLmN5Y2xlc19wZXJfc2Vjb25kIC8gMTAwMDAwMC4wKSkKKyAgICAgIDw8ICIsXG4iOworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJjcHVfc2NhbGluZ19lbmFibGVkIiwgaW5mby5zY2FsaW5nX2VuYWJsZWQpCisgICAgICA8PCAiLFxuIjsKKworICBvdXQgPDwgaW5kZW50IDw8ICJcImNhY2hlc1wiOiBbXG4iOworICBpbmRlbnQgPSBzdGQ6OnN0cmluZyg2LCAnICcpOworICBzdGQ6OnN0cmluZyBjYWNoZV9pbmRlbnQoOCwgJyAnKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvLmNhY2hlcy5zaXplKCk7ICsraSkgeworICAgIGF1dG8mIENJID0gaW5mby5jYWNoZXNbaV07CisgICAgb3V0IDw8IGluZGVudCA8PCAie1xuIjsKKyAgICBvdXQgPDwgY2FjaGVfaW5kZW50IDw8IEZvcm1hdEtWKCJ0eXBlIiwgQ0kudHlwZSkgPDwgIixcbiI7CisgICAgb3V0IDw8IGNhY2hlX2luZGVudCA8PCBGb3JtYXRLVigibGV2ZWwiLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihDSS5sZXZlbCkpCisgICAgICAgIDw8ICIsXG4iOworICAgIG91dCA8PCBjYWNoZV9pbmRlbnQKKyAgICAgICAgPDwgRm9ybWF0S1YoInNpemUiLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihDSS5zaXplKSkgPDwgIixcbiI7CisgICAgb3V0IDw8IGNhY2hlX2luZGVudAorICAgICAgICA8PCBGb3JtYXRLVigibnVtX3NoYXJpbmciLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihDSS5udW1fc2hhcmluZykpCisgICAgICAgIDw8ICJcbiI7CisgICAgb3V0IDw8IGluZGVudCA8PCAifSI7CisgICAgaWYgKGkgIT0gaW5mby5jYWNoZXMuc2l6ZSgpIC0gMSkgb3V0IDw8ICIsIjsKKyAgICBvdXQgPDwgIlxuIjsKKyAgfQorICBpbmRlbnQgPSBzdGQ6OnN0cmluZyg0LCAnICcpOworICBvdXQgPDwgaW5kZW50IDw8ICJdLFxuIjsKKyAgb3V0IDw8IGluZGVudCA8PCAiXCJsb2FkX2F2Z1wiOiBbIjsKKyAgZm9yIChhdXRvIGl0ID0gaW5mby5sb2FkX2F2Zy5iZWdpbigpOyBpdCAhPSBpbmZvLmxvYWRfYXZnLmVuZCgpOykgeworICAgIG91dCA8PCAqaXQrKzsKKyAgICBpZiAoaXQgIT0gaW5mby5sb2FkX2F2Zy5lbmQoKSkgb3V0IDw8ICIsIjsKKyAgfQorICBvdXQgPDwgIl0sXG4iOworCisjaWYgZGVmaW5lZChOREVCVUcpCisgIGNvbnN0IGNoYXIgYnVpbGRfdHlwZVtdID0gInJlbGVhc2UiOworI2Vsc2UKKyAgY29uc3QgY2hhciBidWlsZF90eXBlW10gPSAiZGVidWciOworI2VuZGlmCisgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoImxpYnJhcnlfYnVpbGRfdHlwZSIsIGJ1aWxkX3R5cGUpIDw8ICJcbiI7CisgIC8vIENsb3NlIGNvbnRleHQgYmxvY2sgYW5kIG9wZW4gdGhlIGxpc3Qgb2YgYmVuY2htYXJrcy4KKyAgb3V0IDw8IGlubmVyX2luZGVudCA8PCAifSxcbiI7CisgIG91dCA8PCBpbm5lcl9pbmRlbnQgPDwgIlwiYmVuY2htYXJrc1wiOiBbXG4iOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBKU09OUmVwb3J0ZXI6OlJlcG9ydFJ1bnMoc3RkOjp2ZWN0b3I8UnVuPiBjb25zdCYgcmVwb3J0cykgeworICBpZiAocmVwb3J0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6c3RyaW5nIGluZGVudCg0LCAnICcpOworICBzdGQ6Om9zdHJlYW0mIG91dCA9IEdldE91dHB1dFN0cmVhbSgpOworICBpZiAoIWZpcnN0X3JlcG9ydF8pIHsKKyAgICBvdXQgPDwgIixcbiI7CisgIH0KKyAgZmlyc3RfcmVwb3J0XyA9IGZhbHNlOworCisgIGZvciAoYXV0byBpdCA9IHJlcG9ydHMuYmVnaW4oKTsgaXQgIT0gcmVwb3J0cy5lbmQoKTsgKytpdCkgeworICAgIG91dCA8PCBpbmRlbnQgPDwgIntcbiI7CisgICAgUHJpbnRSdW5EYXRhKCppdCk7CisgICAgb3V0IDw8IGluZGVudCA8PCAnfSc7CisgICAgYXV0byBpdF9jcCA9IGl0OworICAgIGlmICgrK2l0X2NwICE9IHJlcG9ydHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLFxuIjsKKyAgICB9CisgIH0KK30KKwordm9pZCBKU09OUmVwb3J0ZXI6OkZpbmFsaXplKCkgeworICAvLyBDbG9zZSB0aGUgbGlzdCBvZiBiZW5jaG1hcmtzIGFuZCB0aGUgdG9wIGxldmVsIG9iamVjdC4KKyAgR2V0T3V0cHV0U3RyZWFtKCkgPDwgIlxuICBdXG59XG4iOworfQorCit2b2lkIEpTT05SZXBvcnRlcjo6UHJpbnRSdW5EYXRhKFJ1biBjb25zdCYgcnVuKSB7CisgIHN0ZDo6c3RyaW5nIGluZGVudCg2LCAnICcpOworICBzdGQ6Om9zdHJlYW0mIG91dCA9IEdldE91dHB1dFN0cmVhbSgpOworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJuYW1lIiwgcnVuLmJlbmNobWFya19uYW1lKCkpIDw8ICIsXG4iOworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJydW5fbmFtZSIsIHJ1bi5ydW5fbmFtZS5zdHIoKSkgPDwgIixcbiI7CisgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoInJ1bl90eXBlIiwgWyZydW5dKCkgLT4gY29uc3QgY2hhciogeworICAgIHN3aXRjaCAocnVuLnJ1bl90eXBlKSB7CisgICAgICBjYXNlIEJlbmNobWFya1JlcG9ydGVyOjpSdW46OlJUX0l0ZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuICJpdGVyYXRpb24iOworICAgICAgY2FzZSBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuOjpSVF9BZ2dyZWdhdGU6CisgICAgICAgIHJldHVybiAiYWdncmVnYXRlIjsKKyAgICB9CisgICAgQkVOQ0hNQVJLX1VOUkVBQ0hBQkxFKCk7CisgIH0oKSkgPDwgIixcbiI7CisgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoInJlcGV0aXRpb25zIiwgcnVuLnJlcGV0aXRpb25zKSA8PCAiLFxuIjsKKyAgaWYgKHJ1bi5ydW5fdHlwZSAhPSBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuOjpSVF9BZ2dyZWdhdGUpIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJyZXBldGl0aW9uX2luZGV4IiwgcnVuLnJlcGV0aXRpb25faW5kZXgpCisgICAgICAgIDw8ICIsXG4iOworICB9CisgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoInRocmVhZHMiLCBydW4udGhyZWFkcykgPDwgIixcbiI7CisgIGlmIChydW4ucnVuX3R5cGUgPT0gQmVuY2htYXJrUmVwb3J0ZXI6OlJ1bjo6UlRfQWdncmVnYXRlKSB7CisgICAgb3V0IDw8IGluZGVudCA8PCBGb3JtYXRLVigiYWdncmVnYXRlX25hbWUiLCBydW4uYWdncmVnYXRlX25hbWUpIDw8ICIsXG4iOworICB9CisgIGlmIChydW4uZXJyb3Jfb2NjdXJyZWQpIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJlcnJvcl9vY2N1cnJlZCIsIHJ1bi5lcnJvcl9vY2N1cnJlZCkgPDwgIixcbiI7CisgICAgb3V0IDw8IGluZGVudCA8PCBGb3JtYXRLVigiZXJyb3JfbWVzc2FnZSIsIHJ1bi5lcnJvcl9tZXNzYWdlKSA8PCAiLFxuIjsKKyAgfQorICBpZiAoIXJ1bi5yZXBvcnRfYmlnX28gJiYgIXJ1bi5yZXBvcnRfcm1zKSB7CisgICAgb3V0IDw8IGluZGVudCA8PCBGb3JtYXRLVigiaXRlcmF0aW9ucyIsIHJ1bi5pdGVyYXRpb25zKSA8PCAiLFxuIjsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJyZWFsX3RpbWUiLCBydW4uR2V0QWRqdXN0ZWRSZWFsVGltZSgpKSA8PCAiLFxuIjsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJjcHVfdGltZSIsIHJ1bi5HZXRBZGp1c3RlZENQVVRpbWUoKSk7CisgICAgb3V0IDw8ICIsXG4iCisgICAgICAgIDw8IGluZGVudCA8PCBGb3JtYXRLVigidGltZV91bml0IiwgR2V0VGltZVVuaXRTdHJpbmcocnVuLnRpbWVfdW5pdCkpOworICB9IGVsc2UgaWYgKHJ1bi5yZXBvcnRfYmlnX28pIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJjcHVfY29lZmZpY2llbnQiLCBydW4uR2V0QWRqdXN0ZWRDUFVUaW1lKCkpCisgICAgICAgIDw8ICIsXG4iOworICAgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoInJlYWxfY29lZmZpY2llbnQiLCBydW4uR2V0QWRqdXN0ZWRSZWFsVGltZSgpKQorICAgICAgICA8PCAiLFxuIjsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJiaWdfbyIsIEdldEJpZ09TdHJpbmcocnVuLmNvbXBsZXhpdHkpKSA8PCAiLFxuIjsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJ0aW1lX3VuaXQiLCBHZXRUaW1lVW5pdFN0cmluZyhydW4udGltZV91bml0KSk7CisgIH0gZWxzZSBpZiAocnVuLnJlcG9ydF9ybXMpIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJybXMiLCBydW4uR2V0QWRqdXN0ZWRDUFVUaW1lKCkpOworICB9CisKKyAgZm9yIChhdXRvJiBjIDogcnVuLmNvdW50ZXJzKSB7CisgICAgb3V0IDw8ICIsXG4iIDw8IGluZGVudCA8PCBGb3JtYXRLVihjLmZpcnN0LCBjLnNlY29uZCk7CisgIH0KKworICBpZiAocnVuLmhhc19tZW1vcnlfcmVzdWx0KSB7CisgICAgb3V0IDw8ICIsXG4iIDw8IGluZGVudCA8PCBGb3JtYXRLVigiYWxsb2NzX3Blcl9pdGVyIiwgcnVuLmFsbG9jc19wZXJfaXRlcik7CisgICAgb3V0IDw8ICIsXG4iIDw8IGluZGVudCA8PCBGb3JtYXRLVigibWF4X2J5dGVzX3VzZWQiLCBydW4ubWF4X2J5dGVzX3VzZWQpOworICB9CisKKyAgaWYgKCFydW4ucmVwb3J0X2xhYmVsLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIixcbiIgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJsYWJlbCIsIHJ1bi5yZXBvcnRfbGFiZWwpOworICB9CisgIG91dCA8PCAnXG4nOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2xvZy5oIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDBjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvbG9nLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBCRU5DSE1BUktfTE9HX0hfCisjZGVmaW5lIEJFTkNITUFSS19MT0dfSF8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG9zdHJlYW0+CisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08Y2hhcj4mKEVuZExUeXBlKShzdGQ6OmJhc2ljX29zdHJlYW08Y2hhcj4mKTsKKworY2xhc3MgTG9nVHlwZSB7CisgIGZyaWVuZCBMb2dUeXBlJiBHZXROdWxsTG9nSW5zdGFuY2UoKTsKKyAgZnJpZW5kIExvZ1R5cGUmIEdldEVycm9yTG9nSW5zdGFuY2UoKTsKKworICAvLyBGSVhNRTogQWRkIGxvY2tpbmcgdG8gb3V0cHV0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHA+CisgIGZyaWVuZCBMb2dUeXBlJiBvcGVyYXRvcjw8KExvZ1R5cGUmLCBUcCBjb25zdCYpOworICBmcmllbmQgTG9nVHlwZSYgb3BlcmF0b3I8PChMb2dUeXBlJiwgRW5kTFR5cGUqKTsKKworIHByaXZhdGU6CisgIExvZ1R5cGUoc3RkOjpvc3RyZWFtKiBvdXQpIDogb3V0XyhvdXQpIHt9CisgIHN0ZDo6b3N0cmVhbSogb3V0XzsKKyAgQkVOQ0hNQVJLX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb2dUeXBlKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUcD4KK0xvZ1R5cGUmIG9wZXJhdG9yPDwoTG9nVHlwZSYgbG9nLCBUcCBjb25zdCYgdmFsdWUpIHsKKyAgaWYgKGxvZy5vdXRfKSB7CisgICAgKmxvZy5vdXRfIDw8IHZhbHVlOworICB9CisgIHJldHVybiBsb2c7Cit9CisKK2lubGluZSBMb2dUeXBlJiBvcGVyYXRvcjw8KExvZ1R5cGUmIGxvZywgRW5kTFR5cGUqIG0pIHsKKyAgaWYgKGxvZy5vdXRfKSB7CisgICAgKmxvZy5vdXRfIDw8IG07CisgIH0KKyAgcmV0dXJuIGxvZzsKK30KKworaW5saW5lIGludCYgTG9nTGV2ZWwoKSB7CisgIHN0YXRpYyBpbnQgbG9nX2xldmVsID0gMDsKKyAgcmV0dXJuIGxvZ19sZXZlbDsKK30KKworaW5saW5lIExvZ1R5cGUmIEdldE51bGxMb2dJbnN0YW5jZSgpIHsKKyAgc3RhdGljIExvZ1R5cGUgbG9nKG51bGxwdHIpOworICByZXR1cm4gbG9nOworfQorCitpbmxpbmUgTG9nVHlwZSYgR2V0RXJyb3JMb2dJbnN0YW5jZSgpIHsKKyAgc3RhdGljIExvZ1R5cGUgbG9nKCZzdGQ6OmNsb2cpOworICByZXR1cm4gbG9nOworfQorCitpbmxpbmUgTG9nVHlwZSYgR2V0TG9nSW5zdGFuY2VGb3JMZXZlbChpbnQgbGV2ZWwpIHsKKyAgaWYgKGxldmVsIDw9IExvZ0xldmVsKCkpIHsKKyAgICByZXR1cm4gR2V0RXJyb3JMb2dJbnN0YW5jZSgpOworICB9CisgIHJldHVybiBHZXROdWxsTG9nSW5zdGFuY2UoKTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2RlZmluZSBWTE9HKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoOjpiZW5jaG1hcms6OmludGVybmFsOjpHZXRMb2dJbnN0YW5jZUZvckxldmVsKHgpIDw8ICItLSBMT0coIiA8PCB4IDw8ICIpOiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIikKKy8vIGNsYW5nLWZvcm1hdCBvbgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvbXV0ZXguaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDYxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvbXV0ZXguaApAQCAtMCwwICsxLDE1NSBAQAorI2lmbmRlZiBCRU5DSE1BUktfTVVURVhfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX01VVEVYX0hfCisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlICJjaGVjay5oIgorCisvLyBFbmFibGUgdGhyZWFkIHNhZmV0eSBhdHRyaWJ1dGVzIG9ubHkgd2l0aCBjbGFuZy4KKy8vIFRoZSBhdHRyaWJ1dGVzIGNhbiBiZSBzYWZlbHkgZXJhc2VkIHdoZW4gY29tcGlsaW5nIHdpdGggb3RoZXIgY29tcGlsZXJzLgorI2lmIGRlZmluZWQoSEFWRV9USFJFQURfU0FGRVRZX0FUVFJJQlVURVMpCisjZGVmaW5lIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHgpIF9fYXR0cmlidXRlX18oKHgpKQorI2Vsc2UKKyNkZWZpbmUgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oeCkgIC8vIG5vLW9wCisjZW5kaWYKKworI2RlZmluZSBDQVBBQklMSVRZKHgpIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGNhcGFiaWxpdHkoeCkpCisKKyNkZWZpbmUgU0NPUEVEX0NBUEFCSUxJVFkgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oc2NvcGVkX2xvY2thYmxlKQorCisjZGVmaW5lIEdVQVJERURfQlkoeCkgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oZ3VhcmRlZF9ieSh4KSkKKworI2RlZmluZSBQVF9HVUFSREVEX0JZKHgpIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHB0X2d1YXJkZWRfYnkoeCkpCisKKyNkZWZpbmUgQUNRVUlSRURfQkVGT1JFKC4uLikgXAorICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhhY3F1aXJlZF9iZWZvcmUoX19WQV9BUkdTX18pKQorCisjZGVmaW5lIEFDUVVJUkVEX0FGVEVSKC4uLikgXAorICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhhY3F1aXJlZF9hZnRlcihfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgUkVRVUlSRVMoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHJlcXVpcmVzX2NhcGFiaWxpdHkoX19WQV9BUkdTX18pKQorCisjZGVmaW5lIFJFUVVJUkVTX1NIQVJFRCguLi4pIFwKKyAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18ocmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkoX19WQV9BUkdTX18pKQorCisjZGVmaW5lIEFDUVVJUkUoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGFjcXVpcmVfY2FwYWJpbGl0eShfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgQUNRVUlSRV9TSEFSRUQoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkoX19WQV9BUkdTX18pKQorCisjZGVmaW5lIFJFTEVBU0UoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHJlbGVhc2VfY2FwYWJpbGl0eShfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgUkVMRUFTRV9TSEFSRUQoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHJlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHkoX19WQV9BUkdTX18pKQorCisjZGVmaW5lIFRSWV9BQ1FVSVJFKC4uLikgXAorICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyh0cnlfYWNxdWlyZV9jYXBhYmlsaXR5KF9fVkFfQVJHU19fKSkKKworI2RlZmluZSBUUllfQUNRVUlSRV9TSEFSRUQoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5KF9fVkFfQVJHU19fKSkKKworI2RlZmluZSBFWENMVURFUyguLi4pIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGxvY2tzX2V4Y2x1ZGVkKF9fVkFfQVJHU19fKSkKKworI2RlZmluZSBBU1NFUlRfQ0FQQUJJTElUWSh4KSBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhhc3NlcnRfY2FwYWJpbGl0eSh4KSkKKworI2RlZmluZSBBU1NFUlRfU0hBUkVEX0NBUEFCSUxJVFkoeCkgXAorICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhhc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkoeCkpCisKKyNkZWZpbmUgUkVUVVJOX0NBUEFCSUxJVFkoeCkgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18obG9ja19yZXR1cm5lZCh4KSkKKworI2RlZmluZSBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIFwKKyAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18obm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcykKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK3R5cGVkZWYgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgQ29uZGl0aW9uOworCisvLyBOT1RFOiBXcmFwcGVycyBmb3Igc3RkOjptdXRleCBhbmQgc3RkOjp1bmlxdWVfbG9jayBhcmUgcHJvdmlkZWQgc28gdGhhdAorLy8gd2UgY2FuIGFubm90YXRlIHRoZW0gd2l0aCB0aHJlYWQgc2FmZXR5IGF0dHJpYnV0ZXMgYW5kIHVzZSB0aGUKKy8vIC1XdGhyZWFkLXNhZmV0eSB3YXJuaW5nIHdpdGggY2xhbmcuIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IHR5cGVzIGNhbm5vdCBiZQorLy8gdXNlZCBkaXJlY3RseSBiZWNhdXNlIHRoZXkgZG8gbm90IHByb3ZpZGVkIHRoZSByZXF1aXJlZCBhbm5vdGF0aW9ucy4KK2NsYXNzIENBUEFCSUxJVFkoIm11dGV4IikgTXV0ZXggeworIHB1YmxpYzoKKyAgTXV0ZXgoKSB7fQorCisgIHZvaWQgbG9jaygpIEFDUVVJUkUoKSB7IG11dF8ubG9jaygpOyB9CisgIHZvaWQgdW5sb2NrKCkgUkVMRUFTRSgpIHsgbXV0Xy51bmxvY2soKTsgfQorICBzdGQ6Om11dGV4JiBuYXRpdmVfaGFuZGxlKCkgeyByZXR1cm4gbXV0XzsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjptdXRleCBtdXRfOworfTsKKworY2xhc3MgU0NPUEVEX0NBUEFCSUxJVFkgTXV0ZXhMb2NrIHsKKyAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IE11dGV4TG9ja0ltcDsKKworIHB1YmxpYzoKKyAgTXV0ZXhMb2NrKE11dGV4JiBtKSBBQ1FVSVJFKG0pIDogbWxfKG0ubmF0aXZlX2hhbmRsZSgpKSB7fQorICB+TXV0ZXhMb2NrKCkgUkVMRUFTRSgpIHt9CisgIE11dGV4TG9ja0ltcCYgbmF0aXZlX2hhbmRsZSgpIHsgcmV0dXJuIG1sXzsgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXhMb2NrSW1wIG1sXzsKK307CisKK2NsYXNzIEJhcnJpZXIgeworIHB1YmxpYzoKKyAgQmFycmllcihpbnQgbnVtX3RocmVhZHMpIDogcnVubmluZ190aHJlYWRzXyhudW1fdGhyZWFkcykge30KKworICAvLyBDYWxsZWQgYnkgZWFjaCB0aHJlYWQKKyAgYm9vbCB3YWl0KCkgRVhDTFVERVMobG9ja18pIHsKKyAgICBib29sIGxhc3RfdGhyZWFkID0gZmFsc2U7CisgICAgeworICAgICAgTXV0ZXhMb2NrIG1sKGxvY2tfKTsKKyAgICAgIGxhc3RfdGhyZWFkID0gY3JlYXRlQmFycmllcihtbCk7CisgICAgfQorICAgIGlmIChsYXN0X3RocmVhZCkgcGhhc2VfY29uZGl0aW9uXy5ub3RpZnlfYWxsKCk7CisgICAgcmV0dXJuIGxhc3RfdGhyZWFkOworICB9CisKKyAgdm9pZCByZW1vdmVUaHJlYWQoKSBFWENMVURFUyhsb2NrXykgeworICAgIE11dGV4TG9jayBtbChsb2NrXyk7CisgICAgLS1ydW5uaW5nX3RocmVhZHNfOworICAgIGlmIChlbnRlcmVkXyAhPSAwKSBwaGFzZV9jb25kaXRpb25fLm5vdGlmeV9hbGwoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXggbG9ja187CisgIENvbmRpdGlvbiBwaGFzZV9jb25kaXRpb25fOworICBpbnQgcnVubmluZ190aHJlYWRzXzsKKworICAvLyBTdGF0ZSBmb3IgYmFycmllciBtYW5hZ2VtZW50CisgIGludCBwaGFzZV9udW1iZXJfID0gMDsKKyAgaW50IGVudGVyZWRfID0gMDsgIC8vIE51bWJlciBvZiB0aHJlYWRzIHRoYXQgaGF2ZSBlbnRlcmVkIHRoaXMgYmFycmllcgorCisgIC8vIEVudGVyIHRoZSBiYXJyaWVyIGFuZCB3YWl0IHVudGlsIGFsbCBvdGhlciB0aHJlYWRzIGhhdmUgYWxzbworICAvLyBlbnRlcmVkIHRoZSBiYXJyaWVyLiAgUmV0dXJucyBpZmYgdGhpcyBpcyB0aGUgbGFzdCB0aHJlYWQgdG8KKyAgLy8gZW50ZXIgdGhlIGJhcnJpZXIuCisgIGJvb2wgY3JlYXRlQmFycmllcihNdXRleExvY2smIG1sKSBSRVFVSVJFUyhsb2NrXykgeworICAgIENIRUNLX0xUKGVudGVyZWRfLCBydW5uaW5nX3RocmVhZHNfKTsKKyAgICBlbnRlcmVkXysrOworICAgIGlmIChlbnRlcmVkXyA8IHJ1bm5pbmdfdGhyZWFkc18pIHsKKyAgICAgIC8vIFdhaXQgZm9yIGFsbCB0aHJlYWRzIHRvIGVudGVyCisgICAgICBpbnQgcGhhc2VfbnVtYmVyX2NwID0gcGhhc2VfbnVtYmVyXzsKKyAgICAgIGF1dG8gY2IgPSBbdGhpcywgcGhhc2VfbnVtYmVyX2NwXSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPnBoYXNlX251bWJlcl8gPiBwaGFzZV9udW1iZXJfY3AgfHwKKyAgICAgICAgICAgICAgIGVudGVyZWRfID09IHJ1bm5pbmdfdGhyZWFkc187ICAvLyBBIHRocmVhZCBoYXMgYWJvcnRlZCBpbiBlcnJvcgorICAgICAgfTsKKyAgICAgIHBoYXNlX2NvbmRpdGlvbl8ud2FpdChtbC5uYXRpdmVfaGFuZGxlKCksIGNiKTsKKyAgICAgIGlmIChwaGFzZV9udW1iZXJfID4gcGhhc2VfbnVtYmVyX2NwKSByZXR1cm4gZmFsc2U7CisgICAgICAvLyBlbHNlIChydW5uaW5nX3RocmVhZHNfID09IGVudGVyZWRfKSBhbmQgd2UgYXJlIHRoZSBsYXN0IHRocmVhZC4KKyAgICB9CisgICAgLy8gTGFzdCB0aHJlYWQgaGFzIHJlYWNoZWQgdGhlIGJhcnJpZXIKKyAgICBwaGFzZV9udW1iZXJfKys7CisgICAgZW50ZXJlZF8gPSAwOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19NVVRFWF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3JlLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmUyNTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3JlLmgKQEAgLTAsMCArMSwxNTggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQkVOQ0hNQVJLX1JFX0hfCisjZGVmaW5lIEJFTkNITUFSS19SRV9IXworCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworI2lmICFkZWZpbmVkKEhBVkVfU1REX1JFR0VYKSAmJiBcCisgICAgIWRlZmluZWQoSEFWRV9HTlVfUE9TSVhfUkVHRVgpICYmIFwKKyAgICAhZGVmaW5lZChIQVZFX1BPU0lYX1JFR0VYKQorICAvLyBObyBleHBsaWNpdCByZWdleCBzZWxlY3Rpb247IGRldGVjdCBiYXNlZCBvbiBidWlsdGluIGhpbnRzLgorICAjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfTElOVVgpIHx8IGRlZmluZWQoQkVOQ0hNQVJLX09TX0FQUExFKQorICAgICNkZWZpbmUgSEFWRV9QT1NJWF9SRUdFWCAxCisgICNlbGlmIF9fY3BsdXNwbHVzID49IDE5OTcxMUwKKyAgICAjZGVmaW5lIEhBVkVfU1REX1JFR0VYIDEKKyAgI2VuZGlmCisjZW5kaWYKKworLy8gUHJlZmVyIEMgcmVnZXggbGlicmFyaWVzIHdoZW4gY29tcGlsaW5nIHcvbyBleGNlcHRpb25zIHNvIHRoYXQgd2UgY2FuCisvLyBjb3JyZWN0bHkgcmVwb3J0IGVycm9ycy4KKyNpZiBkZWZpbmVkKEJFTkNITUFSS19IQVNfTk9fRVhDRVBUSU9OUykgJiYgXAorICAgIGRlZmluZWQoQkVOQ0hNQVJLX0hBVkVfU1REX1JFR0VYKSAmJiBcCisgICAgKGRlZmluZWQoSEFWRV9HTlVfUE9TSVhfUkVHRVgpIHx8IGRlZmluZWQoSEFWRV9QT1NJWF9SRUdFWCkpCisgICN1bmRlZiBIQVZFX1NURF9SRUdFWAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfU1REX1JFR0VYKQorICAjaW5jbHVkZSA8cmVnZXg+CisjZWxpZiBkZWZpbmVkKEhBVkVfR05VX1BPU0lYX1JFR0VYKQorICAjaW5jbHVkZSA8Z251cmVnZXguaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9QT1NJWF9SRUdFWCkKKyAgI2luY2x1ZGUgPHJlZ2V4Lmg+CisjZWxzZQorI2Vycm9yIE5vIHJlZ3VsYXIgZXhwcmVzc2lvbiBiYWNrZW5kIHdhcyBmb3VuZCEKKyNlbmRpZgorCisvLyBjbGFuZy1mb3JtYXQgb24KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNoZWNrLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCisvLyBBIHdyYXBwZXIgYXJvdW5kIHRoZSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24gQVBJIHRoYXQgcHJvdmlkZXMgYXV0b21hdGljCisvLyBjbGVhbnVwCitjbGFzcyBSZWdleCB7CisgcHVibGljOgorICBSZWdleCgpIDogaW5pdF8oZmFsc2UpIHt9CisKKyAgflJlZ2V4KCk7CisKKyAgLy8gQ29tcGlsZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVyIGZyb20gc3BlYy4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICAvLworICAvLyBPbiBmYWlsdXJlIChhbmQgaWYgZXJyb3IgaXMgbm90IG51bGxwdHIpLCBlcnJvciBpcyBwb3B1bGF0ZWQgd2l0aCBhIGh1bWFuCisgIC8vIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLgorICBib29sIEluaXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNwZWMsIHN0ZDo6c3RyaW5nKiBlcnJvcik7CisKKyAgLy8gUmV0dXJucyB3aGV0aGVyIHN0ciBtYXRjaGVzIHRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24uCisgIGJvb2wgTWF0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyBwcml2YXRlOgorICBib29sIGluaXRfOworLy8gVW5kZXJseWluZyByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0CisjaWYgZGVmaW5lZChIQVZFX1NURF9SRUdFWCkKKyAgc3RkOjpyZWdleCByZV87CisjZWxpZiBkZWZpbmVkKEhBVkVfUE9TSVhfUkVHRVgpIHx8IGRlZmluZWQoSEFWRV9HTlVfUE9TSVhfUkVHRVgpCisgIHJlZ2V4X3QgcmVfOworI2Vsc2UKKyNlcnJvciBObyByZWd1bGFyIGV4cHJlc3Npb24gYmFja2VuZCBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUKKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQoSEFWRV9TVERfUkVHRVgpCisKK2lubGluZSBib29sIFJlZ2V4OjpJbml0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzcGVjLCBzdGQ6OnN0cmluZyogZXJyb3IpIHsKKyNpZmRlZiBCRU5DSE1BUktfSEFTX05PX0VYQ0VQVElPTlMKKyAgKCh2b2lkKWVycm9yKTsgIC8vIHN1cHByZXNzIHVudXNlZCB3YXJuaW5nCisjZWxzZQorICB0cnkgeworI2VuZGlmCisgIHJlXyA9IHN0ZDo6cmVnZXgoc3BlYywgc3RkOjpyZWdleF9jb25zdGFudHM6OmV4dGVuZGVkKTsKKyAgaW5pdF8gPSB0cnVlOworI2lmbmRlZiBCRU5DSE1BUktfSEFTX05PX0VYQ0VQVElPTlMKK30KK2NhdGNoIChjb25zdCBzdGQ6OnJlZ2V4X2Vycm9yJiBlKSB7CisgIGlmIChlcnJvcikgeworICAgICplcnJvciA9IGUud2hhdCgpOworICB9Cit9CisjZW5kaWYKK3JldHVybiBpbml0XzsKK30KKworaW5saW5lIFJlZ2V4Ojp+UmVnZXgoKSB7fQorCitpbmxpbmUgYm9vbCBSZWdleDo6TWF0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBpZiAoIWluaXRfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBzdGQ6OnJlZ2V4X3NlYXJjaChzdHIsIHJlXyk7Cit9CisKKyNlbHNlCitpbmxpbmUgYm9vbCBSZWdleDo6SW5pdChjb25zdCBzdGQ6OnN0cmluZyYgc3BlYywgc3RkOjpzdHJpbmcqIGVycm9yKSB7CisgIGludCBlYyA9IHJlZ2NvbXAoJnJlXywgc3BlYy5jX3N0cigpLCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOworICBpZiAoZWMgIT0gMCkgeworICAgIGlmIChlcnJvcikgeworICAgICAgc2l6ZV90IG5lZWRlZCA9IHJlZ2Vycm9yKGVjLCAmcmVfLCBudWxscHRyLCAwKTsKKyAgICAgIGNoYXIqIGVycmJ1ZiA9IG5ldyBjaGFyW25lZWRlZF07CisgICAgICByZWdlcnJvcihlYywgJnJlXywgZXJyYnVmLCBuZWVkZWQpOworCisgICAgICAvLyByZWdlcnJvciByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVjZXNzYXJ5IHRvIG51bGwgdGVybWluYXRlCisgICAgICAvLyB0aGUgc3RyaW5nLCBzbyB3ZSBtb3ZlIHRoYXQgd2hlbiBhc3NpZ25pbmcgdG8gZXJyb3IuCisgICAgICBDSEVDS19ORShuZWVkZWQsIDApOworICAgICAgZXJyb3ItPmFzc2lnbihlcnJidWYsIG5lZWRlZCAtIDEpOworCisgICAgICBkZWxldGVbXSBlcnJidWY7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW5pdF8gPSB0cnVlOworICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIFJlZ2V4Ojp+UmVnZXgoKSB7CisgIGlmIChpbml0XykgeworICAgIHJlZ2ZyZWUoJnJlXyk7CisgIH0KK30KKworaW5saW5lIGJvb2wgUmVnZXg6Ok1hdGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgaWYgKCFpbml0XykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gcmVnZXhlYygmcmVfLCBzdHIuY19zdHIoKSwgMCwgbnVsbHB0ciwgMCkgPT0gMDsKK30KKyNlbmRpZgorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19SRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3JlcG9ydGVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3JlcG9ydGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTZhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvcmVwb3J0ZXIuY2MKQEAgLTAsMCArMSwxNDAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisKKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RyaW5nX3V0aWwuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgeworCitjbGFzcyBzYmxvZ19vc3RyZWFtYnVmIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IHNibG9nX29zdHJlYW1idWYoU2JMb2dQcmlvcml0eSBwcmlvcml0eSkgOiBwcmlvcml0eV8ocHJpb3JpdHkpIHt9CisKKyAgc3RkOjpzdHJlYW1zaXplIHhzcHV0bihjb25zdCBjaGFyX3R5cGUgKnMsIHN0ZDo6c3RyZWFtc2l6ZSBuKSBvdmVycmlkZSB7CisgICAgYnVmZmVyXy5pbnNlcnQoYnVmZmVyXy5lbmQoKSwgcywgcyArIG4pOworICAgIGlmIChidWZmZXJfLmJhY2soKSA9PSAnXG4nKSB7CisgICAgICBTYkxvZyhwcmlvcml0eV8sIGJ1ZmZlcl8uY19zdHIoKSk7CisgICAgICBidWZmZXJfLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBuOworICB9CisKKyBwcml2YXRlOgorICBTYkxvZ1ByaW9yaXR5IHByaW9yaXR5XzsKKyAgc3RkOjpzdHJpbmcgYnVmZmVyXzsKK307CisKK3N0ZDo6b3N0cmVhbSAqR2V0T3V0cHV0U3RyZWFtKCkgeworICBzdGF0aWMgc2Jsb2dfb3N0cmVhbWJ1ZiBzdHJlYW1idWYoa1NiTG9nUHJpb3JpdHlJbmZvKTsKKyAgc3RhdGljIHN0ZDo6b3N0cmVhbSBvcygmc3RyZWFtYnVmKTsKKyAgcmV0dXJuICZvczsKK30KKworc3RkOjpvc3RyZWFtICpHZXRFcnJvclN0cmVhbSgpIHsKKyAgc3RhdGljIHNibG9nX29zdHJlYW1idWYgc3RyZWFtYnVmKGtTYkxvZ1ByaW9yaXR5RXJyb3IpOworICBzdGF0aWMgc3RkOjpvc3RyZWFtIG9zKCZzdHJlYW1idWYpOworICByZXR1cm4gJm9zOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQmVuY2htYXJrUmVwb3J0ZXI6OkJlbmNobWFya1JlcG9ydGVyKCkKKyAgICA6IG91dHB1dF9zdHJlYW1fKGJlbmNobWFyazo6R2V0T3V0cHV0U3RyZWFtKCkpLAorICAgICAgZXJyb3Jfc3RyZWFtXyhiZW5jaG1hcms6OkdldEVycm9yU3RyZWFtKCkpIHt9CisKK0JlbmNobWFya1JlcG9ydGVyOjp+QmVuY2htYXJrUmVwb3J0ZXIoKSB7fQorCit2b2lkIEJlbmNobWFya1JlcG9ydGVyOjpQcmludEJhc2ljQ29udGV4dChzdGQ6Om9zdHJlYW0gKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29uc3QgJmNvbnRleHQpIHsKKyAgQ0hFQ0sob3V0KSA8PCAiY2Fubm90IGJlIG51bGwiOworICBhdXRvICZPdXQgPSAqb3V0OworCisgIE91dCA8PCBMb2NhbERhdGVUaW1lU3RyaW5nKCkgPDwgIlxuIjsKKworICBpZiAoY29udGV4dC5leGVjdXRhYmxlX25hbWUpCisgICAgT3V0IDw8ICJSdW5uaW5nICIgPDwgY29udGV4dC5leGVjdXRhYmxlX25hbWUgPDwgIlxuIjsKKworICBjb25zdCBDUFVJbmZvICZpbmZvID0gY29udGV4dC5jcHVfaW5mbzsKKyAgT3V0IDw8ICJSdW4gb24gKCIgPDwgaW5mby5udW1fY3B1cyA8PCAiIFggIgorICAgICAgPDwgKGluZm8uY3ljbGVzX3Blcl9zZWNvbmQgLyAxMDAwMDAwLjApIDw8ICIgTUh6IENQVSAiCisgICAgICA8PCAoKGluZm8ubnVtX2NwdXMgPiAxKSA/ICJzIiA6ICIiKSA8PCAiKVxuIjsKKyAgaWYgKGluZm8uY2FjaGVzLnNpemUoKSAhPSAwKSB7CisgICAgT3V0IDw8ICJDUFUgQ2FjaGVzOlxuIjsKKyAgICBmb3IgKGF1dG8gJkNJbmZvIDogaW5mby5jYWNoZXMpIHsKKyAgICAgIE91dCA8PCAiICBMIiA8PCBDSW5mby5sZXZlbCA8PCAiICIgPDwgQ0luZm8udHlwZSA8PCAiICIKKyAgICAgICAgICA8PCAoQ0luZm8uc2l6ZSAvIDEwMjQpIDw8ICIgS2lCIjsKKyAgICAgIGlmIChDSW5mby5udW1fc2hhcmluZyAhPSAwKQorICAgICAgICBPdXQgPDwgIiAoeCIgPDwgKGluZm8ubnVtX2NwdXMgLyBDSW5mby5udW1fc2hhcmluZykgPDwgIikiOworICAgICAgT3V0IDw8ICJcbiI7CisgICAgfQorICB9CisgIGlmICghaW5mby5sb2FkX2F2Zy5lbXB0eSgpKSB7CisgICAgT3V0IDw8ICJMb2FkIEF2ZXJhZ2U6ICI7CisgICAgZm9yIChhdXRvIEl0ID0gaW5mby5sb2FkX2F2Zy5iZWdpbigpOyBJdCAhPSBpbmZvLmxvYWRfYXZnLmVuZCgpOykgeworICAgICAgT3V0IDw8IFN0ckZvcm1hdCgiJS4yZiIsICpJdCsrKTsKKyAgICAgIGlmIChJdCAhPSBpbmZvLmxvYWRfYXZnLmVuZCgpKSBPdXQgPDwgIiwgIjsKKyAgICB9CisgICAgT3V0IDw8ICJcbiI7CisgIH0KKworICBpZiAoaW5mby5zY2FsaW5nX2VuYWJsZWQpIHsKKyAgICBPdXQgPDwgIioqKldBUk5JTkcqKiogQ1BVIHNjYWxpbmcgaXMgZW5hYmxlZCwgdGhlIGJlbmNobWFyayAiCisgICAgICAgICAgICJyZWFsIHRpbWUgbWVhc3VyZW1lbnRzIG1heSBiZSBub2lzeSBhbmQgd2lsbCBpbmN1ciBleHRyYSAiCisgICAgICAgICAgICJvdmVyaGVhZC5cbiI7CisgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgT3V0IDw8ICIqKipXQVJOSU5HKioqIExpYnJhcnkgd2FzIGJ1aWx0IGFzIERFQlVHLiBUaW1pbmdzIG1heSBiZSAiCisgICAgICAgICAiYWZmZWN0ZWQuXG4iOworI2VuZGlmCit9CisKKy8vIE5vIGluaXRpYWxpemVyIGJlY2F1c2UgaXQncyBhbHJlYWR5IGluaXRpYWxpemVkIHRvIE5VTEwuCitjb25zdCBjaGFyICpCZW5jaG1hcmtSZXBvcnRlcjo6Q29udGV4dDo6ZXhlY3V0YWJsZV9uYW1lOworCitCZW5jaG1hcmtSZXBvcnRlcjo6Q29udGV4dDo6Q29udGV4dCgpCisgICAgOiBjcHVfaW5mbyhDUFVJbmZvOjpHZXQoKSksIHN5c19pbmZvKFN5c3RlbUluZm86OkdldCgpKSB7fQorCitzdGQ6OnN0cmluZyBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuOjpiZW5jaG1hcmtfbmFtZSgpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgbmFtZSA9IHJ1bl9uYW1lLnN0cigpOworICBpZiAocnVuX3R5cGUgPT0gUlRfQWdncmVnYXRlKSB7CisgICAgbmFtZSArPSAiXyIgKyBhZ2dyZWdhdGVfbmFtZTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworZG91YmxlIEJlbmNobWFya1JlcG9ydGVyOjpSdW46OkdldEFkanVzdGVkUmVhbFRpbWUoKSBjb25zdCB7CisgIGRvdWJsZSBuZXdfdGltZSA9IHJlYWxfYWNjdW11bGF0ZWRfdGltZSAqIEdldFRpbWVVbml0TXVsdGlwbGllcih0aW1lX3VuaXQpOworICBpZiAoaXRlcmF0aW9ucyAhPSAwKSBuZXdfdGltZSAvPSBzdGF0aWNfY2FzdDxkb3VibGU+KGl0ZXJhdGlvbnMpOworICByZXR1cm4gbmV3X3RpbWU7Cit9CisKK2RvdWJsZSBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuOjpHZXRBZGp1c3RlZENQVVRpbWUoKSBjb25zdCB7CisgIGRvdWJsZSBuZXdfdGltZSA9IGNwdV9hY2N1bXVsYXRlZF90aW1lICogR2V0VGltZVVuaXRNdWx0aXBsaWVyKHRpbWVfdW5pdCk7CisgIGlmIChpdGVyYXRpb25zICE9IDApIG5ld190aW1lIC89IHN0YXRpY19jYXN0PGRvdWJsZT4oaXRlcmF0aW9ucyk7CisgIHJldHVybiBuZXdfdGltZTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zbGVlcC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zbGVlcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTEyYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3NsZWVwLmNjCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzbGVlcC5oIgorCisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisvLyBXaW5kb3cncyBTbGVlcCB0YWtlcyBtaWxsaXNlY29uZHMgYXJndW1lbnQuCit2b2lkIFNsZWVwRm9yTWlsbGlzZWNvbmRzKGludCBtaWxsaXNlY29uZHMpIHsgU2xlZXAobWlsbGlzZWNvbmRzKTsgfQordm9pZCBTbGVlcEZvclNlY29uZHMoZG91YmxlIHNlY29uZHMpIHsKKyAgU2xlZXBGb3JNaWxsaXNlY29uZHMoc3RhdGljX2Nhc3Q8aW50PihrTnVtTWlsbGlzUGVyU2Vjb25kICogc2Vjb25kcykpOworfQorI2Vsc2UgICAvLyBCRU5DSE1BUktfT1NfV0lORE9XUwordm9pZCBTbGVlcEZvck1pY3Jvc2Vjb25kcyhpbnQgbWljcm9zZWNvbmRzKSB7CisgIHN0cnVjdCB0aW1lc3BlYyBzbGVlcF90aW1lOworICBzbGVlcF90aW1lLnR2X3NlYyA9IG1pY3Jvc2Vjb25kcyAvIGtOdW1NaWNyb3NQZXJTZWNvbmQ7CisgIHNsZWVwX3RpbWUudHZfbnNlYyA9IChtaWNyb3NlY29uZHMgJSBrTnVtTWljcm9zUGVyU2Vjb25kKSAqIGtOdW1OYW5vc1Blck1pY3JvOworICB3aGlsZSAobmFub3NsZWVwKCZzbGVlcF90aW1lLCAmc2xlZXBfdGltZSkgIT0gMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICA7ICAvLyBJZ25vcmUgc2lnbmFscyBhbmQgd2FpdCBmb3IgdGhlIGZ1bGwgaW50ZXJ2YWwgdG8gZWxhcHNlLgorfQorCit2b2lkIFNsZWVwRm9yTWlsbGlzZWNvbmRzKGludCBtaWxsaXNlY29uZHMpIHsKKyAgU2xlZXBGb3JNaWNyb3NlY29uZHMobWlsbGlzZWNvbmRzICoga051bU1pY3Jvc1Blck1pbGxpKTsKK30KKwordm9pZCBTbGVlcEZvclNlY29uZHMoZG91YmxlIHNlY29uZHMpIHsKKyAgU2xlZXBGb3JNaWNyb3NlY29uZHMoc3RhdGljX2Nhc3Q8aW50PihzZWNvbmRzICoga051bU1pY3Jvc1BlclNlY29uZCkpOworfQorI2VuZGlmICAvLyBCRU5DSE1BUktfT1NfV0lORE9XUworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zbGVlcC5oIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3NsZWVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NTUxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zbGVlcC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgQkVOQ0hNQVJLX1NMRUVQX0hfCisjZGVmaW5lIEJFTkNITUFSS19TTEVFUF9IXworCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK2NvbnN0IGludCBrTnVtTWlsbGlzUGVyU2Vjb25kID0gMTAwMDsKK2NvbnN0IGludCBrTnVtTWljcm9zUGVyTWlsbGkgPSAxMDAwOworY29uc3QgaW50IGtOdW1NaWNyb3NQZXJTZWNvbmQgPSBrTnVtTWlsbGlzUGVyU2Vjb25kICogMTAwMDsKK2NvbnN0IGludCBrTnVtTmFub3NQZXJNaWNybyA9IDEwMDA7Citjb25zdCBpbnQga051bU5hbm9zUGVyU2Vjb25kID0ga051bU5hbm9zUGVyTWljcm8gKiBrTnVtTWljcm9zUGVyU2Vjb25kOworCit2b2lkIFNsZWVwRm9yTWlsbGlzZWNvbmRzKGludCBtaWxsaXNlY29uZHMpOwordm9pZCBTbGVlcEZvclNlY29uZHMoZG91YmxlIHNlY29uZHMpOworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworI2VuZGlmICAvLyBCRU5DSE1BUktfU0xFRVBfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zdGF0aXN0aWNzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3N0YXRpc3RpY3MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1YTNkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zdGF0aXN0aWNzLmNjCkBAIC0wLDAgKzEsMTkzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBJc21hZWwgSmltZW5leiBNYXJ0aW5lei4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFJvbWFuIExlYmVkZXYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAic3RhdGlzdGljcy5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworYXV0byBTdGF0aXN0aWNzU3VtID0gW10oY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdikgeworICByZXR1cm4gc3RkOjphY2N1bXVsYXRlKHYuYmVnaW4oKSwgdi5lbmQoKSwgMC4wKTsKK307CisKK2RvdWJsZSBTdGF0aXN0aWNzTWVhbihjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB2KSB7CisgIGlmICh2LmVtcHR5KCkpIHJldHVybiAwLjA7CisgIHJldHVybiBTdGF0aXN0aWNzU3VtKHYpICogKDEuMCAvIHYuc2l6ZSgpKTsKK30KKworZG91YmxlIFN0YXRpc3RpY3NNZWRpYW4oY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdikgeworICBpZiAodi5zaXplKCkgPCAzKSByZXR1cm4gU3RhdGlzdGljc01lYW4odik7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gY29weSh2KTsKKworICBhdXRvIGNlbnRlciA9IGNvcHkuYmVnaW4oKSArIHYuc2l6ZSgpIC8gMjsKKyAgc3RkOjpudGhfZWxlbWVudChjb3B5LmJlZ2luKCksIGNlbnRlciwgY29weS5lbmQoKSk7CisKKyAgLy8gZGlkIHdlIGhhdmUgYW4gb2RkIG51bWJlciBvZiBzYW1wbGVzPworICAvLyBpZiB5ZXMsIHRoZW4gY2VudGVyIGlzIHRoZSBtZWRpYW4KKyAgLy8gaXQgbm8sIHRoZW4gd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBhdmVyYWdlIGJldHdlZW4gY2VudGVyIGFuZCB0aGUgdmFsdWUKKyAgLy8gYmVmb3JlCisgIGlmICh2LnNpemUoKSAlIDIgPT0gMSkgcmV0dXJuICpjZW50ZXI7CisgIGF1dG8gY2VudGVyMiA9IGNvcHkuYmVnaW4oKSArIHYuc2l6ZSgpIC8gMiAtIDE7CisgIHN0ZDo6bnRoX2VsZW1lbnQoY29weS5iZWdpbigpLCBjZW50ZXIyLCBjb3B5LmVuZCgpKTsKKyAgcmV0dXJuICgqY2VudGVyICsgKmNlbnRlcjIpIC8gMi4wOworfQorCisvLyBSZXR1cm4gdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiB0aGlzIHNhbXBsZSBzZXQKK2F1dG8gU3VtU3F1YXJlcyA9IFtdKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHYpIHsKKyAgcmV0dXJuIHN0ZDo6aW5uZXJfcHJvZHVjdCh2LmJlZ2luKCksIHYuZW5kKCksIHYuYmVnaW4oKSwgMC4wKTsKK307CisKK2F1dG8gU3FyID0gW10oY29uc3QgZG91YmxlIGRhdCkgeyByZXR1cm4gZGF0ICogZGF0OyB9OworYXV0byBTcXJ0ID0gW10oY29uc3QgZG91YmxlIGRhdCkgeworICAvLyBBdm9pZCBOYU4gZHVlIHRvIGltcHJlY2lzaW9uIGluIHRoZSBjYWxjdWxhdGlvbnMKKyAgaWYgKGRhdCA8IDAuMCkgcmV0dXJuIDAuMDsKKyAgcmV0dXJuIHN0ZDo6c3FydChkYXQpOworfTsKKworZG91YmxlIFN0YXRpc3RpY3NTdGREZXYoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdikgeworICBjb25zdCBhdXRvIG1lYW4gPSBTdGF0aXN0aWNzTWVhbih2KTsKKyAgaWYgKHYuZW1wdHkoKSkgcmV0dXJuIG1lYW47CisKKyAgLy8gU2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyB1bmRlZmluZWQgZm9yIG4gPSAxCisgIGlmICh2LnNpemUoKSA9PSAxKSByZXR1cm4gMC4wOworCisgIGNvbnN0IGRvdWJsZSBhdmdfc3F1YXJlcyA9IFN1bVNxdWFyZXModikgKiAoMS4wIC8gdi5zaXplKCkpOworICByZXR1cm4gU3FydCh2LnNpemUoKSAvICh2LnNpemUoKSAtIDEuMCkgKiAoYXZnX3NxdWFyZXMgLSBTcXIobWVhbikpKTsKK30KKworc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4gQ29tcHV0ZVN0YXRzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+JiByZXBvcnRzKSB7CisgIHR5cGVkZWYgQmVuY2htYXJrUmVwb3J0ZXI6OlJ1biBSdW47CisgIHN0ZDo6dmVjdG9yPFJ1bj4gcmVzdWx0czsKKworICBhdXRvIGVycm9yX2NvdW50ID0KKyAgICAgIHN0ZDo6Y291bnRfaWYocmVwb3J0cy5iZWdpbigpLCByZXBvcnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBbXShSdW4gY29uc3QmIHJ1bikgeyByZXR1cm4gcnVuLmVycm9yX29jY3VycmVkOyB9KTsKKworICBpZiAocmVwb3J0cy5zaXplKCkgLSBlcnJvcl9jb3VudCA8IDIpIHsKKyAgICAvLyBXZSBkb24ndCByZXBvcnQgYWdncmVnYXRlZCBkYXRhIGlmIHRoZXJlIHdhcyBhIHNpbmdsZSBydW4uCisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKworICAvLyBBY2N1bXVsYXRvcnMuCisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gcmVhbF9hY2N1bXVsYXRlZF90aW1lX3N0YXQ7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gY3B1X2FjY3VtdWxhdGVkX3RpbWVfc3RhdDsKKworICByZWFsX2FjY3VtdWxhdGVkX3RpbWVfc3RhdC5yZXNlcnZlKHJlcG9ydHMuc2l6ZSgpKTsKKyAgY3B1X2FjY3VtdWxhdGVkX3RpbWVfc3RhdC5yZXNlcnZlKHJlcG9ydHMuc2l6ZSgpKTsKKworICAvLyBBbGwgcmVwZXRpdGlvbnMgc2hvdWxkIGJlIHJ1biB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBpdGVyYXRpb25zIHNvIHdlCisgIC8vIGNhbiB0YWtlIHRoaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlyc3QgYmVuY2htYXJrLgorICBjb25zdCBJdGVyYXRpb25Db3VudCBydW5faXRlcmF0aW9ucyA9IHJlcG9ydHMuZnJvbnQoKS5pdGVyYXRpb25zOworICAvLyBjcmVhdGUgc3RhdHMgZm9yIHVzZXIgY291bnRlcnMKKyAgc3RydWN0IENvdW50ZXJTdGF0IHsKKyAgICBDb3VudGVyIGM7CisgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBzOworICB9OworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ291bnRlclN0YXQ+IGNvdW50ZXJfc3RhdHM7CisgIGZvciAoUnVuIGNvbnN0JiByIDogcmVwb3J0cykgeworICAgIGZvciAoYXV0byBjb25zdCYgY250IDogci5jb3VudGVycykgeworICAgICAgYXV0byBpdCA9IGNvdW50ZXJfc3RhdHMuZmluZChjbnQuZmlyc3QpOworICAgICAgaWYgKGl0ID09IGNvdW50ZXJfc3RhdHMuZW5kKCkpIHsKKyAgICAgICAgY291bnRlcl9zdGF0cy5pbnNlcnQoe2NudC5maXJzdCwge2NudC5zZWNvbmQsIHN0ZDo6dmVjdG9yPGRvdWJsZT57fX19KTsKKyAgICAgICAgaXQgPSBjb3VudGVyX3N0YXRzLmZpbmQoY250LmZpcnN0KTsKKyAgICAgICAgaXQtPnNlY29uZC5zLnJlc2VydmUocmVwb3J0cy5zaXplKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0tfRVEoY291bnRlcl9zdGF0c1tjbnQuZmlyc3RdLmMuZmxhZ3MsIGNudC5zZWNvbmQuZmxhZ3MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFBvcHVsYXRlIHRoZSBhY2N1bXVsYXRvcnMuCisgIGZvciAoUnVuIGNvbnN0JiBydW4gOiByZXBvcnRzKSB7CisgICAgQ0hFQ0tfRVEocmVwb3J0c1swXS5iZW5jaG1hcmtfbmFtZSgpLCBydW4uYmVuY2htYXJrX25hbWUoKSk7CisgICAgQ0hFQ0tfRVEocnVuX2l0ZXJhdGlvbnMsIHJ1bi5pdGVyYXRpb25zKTsKKyAgICBpZiAocnVuLmVycm9yX29jY3VycmVkKSBjb250aW51ZTsKKyAgICByZWFsX2FjY3VtdWxhdGVkX3RpbWVfc3RhdC5lbXBsYWNlX2JhY2socnVuLnJlYWxfYWNjdW11bGF0ZWRfdGltZSk7CisgICAgY3B1X2FjY3VtdWxhdGVkX3RpbWVfc3RhdC5lbXBsYWNlX2JhY2socnVuLmNwdV9hY2N1bXVsYXRlZF90aW1lKTsKKyAgICAvLyB1c2VyIGNvdW50ZXJzCisgICAgZm9yIChhdXRvIGNvbnN0JiBjbnQgOiBydW4uY291bnRlcnMpIHsKKyAgICAgIGF1dG8gaXQgPSBjb3VudGVyX3N0YXRzLmZpbmQoY250LmZpcnN0KTsKKyAgICAgIENIRUNLX05FKGl0LCBjb3VudGVyX3N0YXRzLmVuZCgpKTsKKyAgICAgIGl0LT5zZWNvbmQucy5lbXBsYWNlX2JhY2soY250LnNlY29uZCk7CisgICAgfQorICB9CisKKyAgLy8gT25seSBhZGQgbGFiZWwgaWYgaXQgaXMgc2FtZSBmb3IgYWxsIHJ1bnMKKyAgc3RkOjpzdHJpbmcgcmVwb3J0X2xhYmVsID0gcmVwb3J0c1swXS5yZXBvcnRfbGFiZWw7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDE7IGkgPCByZXBvcnRzLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHJlcG9ydHNbaV0ucmVwb3J0X2xhYmVsICE9IHJlcG9ydF9sYWJlbCkgeworICAgICAgcmVwb3J0X2xhYmVsID0gIiI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBjb25zdCBkb3VibGUgaXRlcmF0aW9uX3Jlc2NhbGVfZmFjdG9yID0KKyAgICAgIGRvdWJsZShyZXBvcnRzLnNpemUoKSkgLyBkb3VibGUocnVuX2l0ZXJhdGlvbnMpOworCisgIGZvciAoY29uc3QgYXV0byYgU3RhdCA6ICpyZXBvcnRzWzBdLnN0YXRpc3RpY3MpIHsKKyAgICAvLyBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgYWNjdW11bGF0b3IgdG8gQmVuY2htYXJrUmVwb3J0ZXI6OlJ1bidzLgorICAgIFJ1biBkYXRhOworICAgIGRhdGEucnVuX25hbWUgPSByZXBvcnRzWzBdLnJ1bl9uYW1lOworICAgIGRhdGEucnVuX3R5cGUgPSBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuOjpSVF9BZ2dyZWdhdGU7CisgICAgZGF0YS50aHJlYWRzID0gcmVwb3J0c1swXS50aHJlYWRzOworICAgIGRhdGEucmVwZXRpdGlvbnMgPSByZXBvcnRzWzBdLnJlcGV0aXRpb25zOworICAgIGRhdGEucmVwZXRpdGlvbl9pbmRleCA9IFJ1bjo6bm9fcmVwZXRpdGlvbl9pbmRleDsKKyAgICBkYXRhLmFnZ3JlZ2F0ZV9uYW1lID0gU3RhdC5uYW1lXzsKKyAgICBkYXRhLnJlcG9ydF9sYWJlbCA9IHJlcG9ydF9sYWJlbDsKKworICAgIC8vIEl0IGlzIGluY29ycmVjdCB0byBzYXkgdGhhdCBhbiBhZ2dyZWdhdGUgaXMgY29tcHV0ZWQgb3ZlcgorICAgIC8vIHJ1bidzIGl0ZXJhdGlvbnMsIGJlY2F1c2UgdGhvc2UgaXRlcmF0aW9ucyBhbHJlYWR5IGdvdCBhdmVyYWdlZC4KKyAgICAvLyBTaW1pbGFybHksIGlmIHRoZXJlIGFyZSBOIHJlcGV0aXRpb25zIHdpdGggMSBpdGVyYXRpb25zIGVhY2gsCisgICAgLy8gYW4gYWdncmVnYXRlIHdpbGwgYmUgY29tcHV0ZWQgb3ZlciBOIG1lYXN1cmVtZW50cywgbm90IDEuCisgICAgLy8gVGh1cyBpdCBpcyBiZXN0IHRvIHNpbXBseSB1c2UgdGhlIGNvdW50IG9mIHNlcGFyYXRlIHJlcG9ydHMuCisgICAgZGF0YS5pdGVyYXRpb25zID0gcmVwb3J0cy5zaXplKCk7CisKKyAgICBkYXRhLnJlYWxfYWNjdW11bGF0ZWRfdGltZSA9IFN0YXQuY29tcHV0ZV8ocmVhbF9hY2N1bXVsYXRlZF90aW1lX3N0YXQpOworICAgIGRhdGEuY3B1X2FjY3VtdWxhdGVkX3RpbWUgPSBTdGF0LmNvbXB1dGVfKGNwdV9hY2N1bXVsYXRlZF90aW1lX3N0YXQpOworCisgICAgLy8gV2Ugd2lsbCBkaXZpZGUgdGhlc2UgdGltZXMgYnkgZGF0YS5pdGVyYXRpb25zIHdoZW4gcmVwb3J0aW5nLCBidXQgdGhlCisgICAgLy8gZGF0YS5pdGVyYXRpb25zIGlzIG5vdCBuZXNzZXNhaXJseSB0aGUgc2NhbGUgb2YgdGhlc2UgbWVhc3VyZW1lbnRzLAorICAgIC8vIGJlY2F1c2UgaW4gZWFjaCByZXBldGl0aW9uLCB0aGVzZSB0aW1lcnMgYXJlIHN1bSBvdmVyIGFsbCB0aGUgaXRlcmF0aW9ucy4KKyAgICAvLyBBbmQgaWYgd2Ugd2FudCB0byBzYXkgdGhhdCB0aGUgc3RhdHMgYXJlIG92ZXIgTiByZXBldGl0aW9ucyBhbmQgbm90CisgICAgLy8gTSBpdGVyYXRpb25zLCB3ZSBuZWVkIHRvIG11bHRpcGx5IHRoZXNlIGJ5IChOL00pLgorICAgIGRhdGEucmVhbF9hY2N1bXVsYXRlZF90aW1lICo9IGl0ZXJhdGlvbl9yZXNjYWxlX2ZhY3RvcjsKKyAgICBkYXRhLmNwdV9hY2N1bXVsYXRlZF90aW1lICo9IGl0ZXJhdGlvbl9yZXNjYWxlX2ZhY3RvcjsKKworICAgIGRhdGEudGltZV91bml0ID0gcmVwb3J0c1swXS50aW1lX3VuaXQ7CisKKyAgICAvLyB1c2VyIGNvdW50ZXJzCisgICAgZm9yIChhdXRvIGNvbnN0JiBrdiA6IGNvdW50ZXJfc3RhdHMpIHsKKyAgICAgIC8vIERvICpOT1QqIHJlc2NhbGUgdGhlIGN1c3RvbSBjb3VudGVycy4gVGhleSBhcmUgYWxyZWFkeSBwcm9wZXJseSBzY2FsZWQuCisgICAgICBjb25zdCBhdXRvIHVjX3N0YXQgPSBTdGF0LmNvbXB1dGVfKGt2LnNlY29uZC5zKTsKKyAgICAgIGF1dG8gYyA9IENvdW50ZXIodWNfc3RhdCwgY291bnRlcl9zdGF0c1trdi5maXJzdF0uYy5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcl9zdGF0c1trdi5maXJzdF0uYy5vbmVLKTsKKyAgICAgIGRhdGEuY291bnRlcnNba3YuZmlyc3RdID0gYzsKKyAgICB9CisKKyAgICByZXN1bHRzLnB1c2hfYmFjayhkYXRhKTsKKyAgfQorCisgIHJldHVybiByZXN1bHRzOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3N0YXRpc3RpY3MuaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zdGF0aXN0aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjY2M4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zdGF0aXN0aWNzLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgSXNtYWVsIEppbWVuZXogTWFydGluZXouIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBSb21hbiBMZWJlZGV2LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIFNUQVRJU1RJQ1NfSF8KKyNkZWZpbmUgU1RBVElTVElDU19IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworLy8gUmV0dXJuIGEgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG1lYW4sIG1lZGlhbiBhbmQgc3RhbmRhcmQgZGV2YXRpb24gaW5mb3JtYXRpb24KKy8vIChhbmQgYW55IHVzZXItc3BlY2lmaWVkIGluZm8pIGZvciB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgcmVwb3J0cy4gSWYgJ3JlcG9ydHMnCisvLyBjb250YWlucyBsZXNzIHRoYW4gdHdvIG5vbi1lcnJvcmVkIHJ1bnMgYW4gZW1wdHkgdmVjdG9yIGlzIHJldHVybmVkCitzdGQ6OnZlY3RvcjxCZW5jaG1hcmtSZXBvcnRlcjo6UnVuPiBDb21wdXRlU3RhdHMoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4mIHJlcG9ydHMpOworCitkb3VibGUgU3RhdGlzdGljc01lYW4oY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdik7Citkb3VibGUgU3RhdGlzdGljc01lZGlhbihjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB2KTsKK2RvdWJsZSBTdGF0aXN0aWNzU3RkRGV2KGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHYpOworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIFNUQVRJU1RJQ1NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zdHJpbmdfdXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zdHJpbmdfdXRpbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWIwMWExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3N0cmluZ191dGlsLmNjCkBAIC0wLDAgKzEsMjUyIEBACisjaW5jbHVkZSAic3RyaW5nX3V0aWwuaCIKKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAiYXJyYXlzaXplLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworbmFtZXNwYWNlIHsKKworLy8ga2lsbywgTWVnYSwgR2lnYSwgVGVyYSwgUGV0YSwgRXhhLCBaZXR0YSwgWW90dGEuCitjb25zdCBjaGFyIGtCaWdTSVVuaXRzW10gPSAia01HVFBFWlkiOworLy8gS2liaSwgTWViaSwgR2liaSwgVGViaSwgUGViaSwgRXhiaSwgWmViaSwgWW9iaS4KK2NvbnN0IGNoYXIga0JpZ0lFQ1VuaXRzW10gPSAiS01HVFBFWlkiOworLy8gbWlsbGksIG1pY3JvLCBuYW5vLCBwaWNvLCBmZW10bywgYXR0bywgemVwdG8sIHlvY3RvLgorY29uc3QgY2hhciBrU21hbGxTSVVuaXRzW10gPSAibXVucGZhenkiOworCisvLyBXZSByZXF1aXJlIHRoYXQgYWxsIHRocmVlIGFycmF5cyBoYXZlIHRoZSBzYW1lIHNpemUuCitzdGF0aWNfYXNzZXJ0KGFycmF5c2l6ZShrQmlnU0lVbml0cykgPT0gYXJyYXlzaXplKGtCaWdJRUNVbml0cyksCisgICAgICAgICAgICAgICJTSSBhbmQgSUVDIHVuaXQgYXJyYXlzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSIpOworc3RhdGljX2Fzc2VydChhcnJheXNpemUoa1NtYWxsU0lVbml0cykgPT0gYXJyYXlzaXplKGtCaWdTSVVuaXRzKSwKKyAgICAgICAgICAgICAgIlNtYWxsIFNJIGFuZCBCaWcgU0kgdW5pdCBhcnJheXMgbXVzdCBiZSB0aGUgc2FtZSBzaXplIik7CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtVbml0c1NpemUgPSBhcnJheXNpemUoa0JpZ1NJVW5pdHMpOworCit2b2lkIFRvRXhwb25lbnRBbmRNYW50aXNzYShkb3VibGUgdmFsLCBkb3VibGUgdGhyZXNoLCBpbnQgcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG9uZV9rLCBzdGQ6OnN0cmluZyogbWFudGlzc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBleHBvbmVudCkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBtYW50aXNzYV9zdHJlYW07CisKKyAgaWYgKHZhbCA8IDApIHsKKyAgICBtYW50aXNzYV9zdHJlYW0gPDwgIi0iOworICAgIHZhbCA9IC12YWw7CisgIH0KKworICAvLyBBZGp1c3QgdGhyZXNob2xkIHNvIHRoYXQgaXQgbmV2ZXIgZXhjbHVkZXMgdGhpbmdzIHdoaWNoIGNhbid0IGJlIHJlbmRlcmVkCisgIC8vIGluICdwcmVjaXNpb24nIGRpZ2l0cy4KKyAgY29uc3QgZG91YmxlIGFkanVzdGVkX3RocmVzaG9sZCA9CisgICAgICBzdGQ6Om1heCh0aHJlc2gsIDEuMCAvIHN0ZDo6cG93KDEwLjAsIHByZWNpc2lvbikpOworICBjb25zdCBkb3VibGUgYmlnX3RocmVzaG9sZCA9IGFkanVzdGVkX3RocmVzaG9sZCAqIG9uZV9rOworICBjb25zdCBkb3VibGUgc21hbGxfdGhyZXNob2xkID0gYWRqdXN0ZWRfdGhyZXNob2xkOworICAvLyBWYWx1ZXMgaW4gXXNpbXBsZV90aHJlc2hvbGQsc21hbGxfdGhyZXNob2xkWyB3aWxsIGJlIHByaW50ZWQgYXMtaXMKKyAgY29uc3QgZG91YmxlIHNpbXBsZV90aHJlc2hvbGQgPSAwLjAxOworCisgIGlmICh2YWwgPiBiaWdfdGhyZXNob2xkKSB7CisgICAgLy8gUG9zaXRpdmUgcG93ZXJzCisgICAgZG91YmxlIHNjYWxlZCA9IHZhbDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5c2l6ZShrQmlnU0lVbml0cyk7ICsraSkgeworICAgICAgc2NhbGVkIC89IG9uZV9rOworICAgICAgaWYgKHNjYWxlZCA8PSBiaWdfdGhyZXNob2xkKSB7CisgICAgICAgIG1hbnRpc3NhX3N0cmVhbSA8PCBzY2FsZWQ7CisgICAgICAgICpleHBvbmVudCA9IGkgKyAxOworICAgICAgICAqbWFudGlzc2EgPSBtYW50aXNzYV9zdHJlYW0uc3RyKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgbWFudGlzc2Ffc3RyZWFtIDw8IHZhbDsKKyAgICAqZXhwb25lbnQgPSAwOworICB9IGVsc2UgaWYgKHZhbCA8IHNtYWxsX3RocmVzaG9sZCkgeworICAgIC8vIE5lZ2F0aXZlIHBvd2VycworICAgIGlmICh2YWwgPCBzaW1wbGVfdGhyZXNob2xkKSB7CisgICAgICBkb3VibGUgc2NhbGVkID0gdmFsOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoa1NtYWxsU0lVbml0cyk7ICsraSkgeworICAgICAgICBzY2FsZWQgKj0gb25lX2s7CisgICAgICAgIGlmIChzY2FsZWQgPj0gc21hbGxfdGhyZXNob2xkKSB7CisgICAgICAgICAgbWFudGlzc2Ffc3RyZWFtIDw8IHNjYWxlZDsKKyAgICAgICAgICAqZXhwb25lbnQgPSAtc3RhdGljX2Nhc3Q8aW50NjRfdD4oaSArIDEpOworICAgICAgICAgICptYW50aXNzYSA9IG1hbnRpc3NhX3N0cmVhbS5zdHIoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWFudGlzc2Ffc3RyZWFtIDw8IHZhbDsKKyAgICAqZXhwb25lbnQgPSAwOworICB9IGVsc2UgeworICAgIG1hbnRpc3NhX3N0cmVhbSA8PCB2YWw7CisgICAgKmV4cG9uZW50ID0gMDsKKyAgfQorICAqbWFudGlzc2EgPSBtYW50aXNzYV9zdHJlYW0uc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIEV4cG9uZW50VG9QcmVmaXgoaW50NjRfdCBleHBvbmVudCwgYm9vbCBpZWMpIHsKKyAgaWYgKGV4cG9uZW50ID09IDApIHJldHVybiAiIjsKKworICBjb25zdCBpbnQ2NF90IGluZGV4ID0gKGV4cG9uZW50ID4gMCA/IGV4cG9uZW50IC0gMSA6IC1leHBvbmVudCAtIDEpOworICBpZiAoaW5kZXggPj0ga1VuaXRzU2l6ZSkgcmV0dXJuICIiOworCisgIGNvbnN0IGNoYXIqIGFycmF5ID0KKyAgICAgIChleHBvbmVudCA+IDAgPyAoaWVjID8ga0JpZ0lFQ1VuaXRzIDoga0JpZ1NJVW5pdHMpIDoga1NtYWxsU0lVbml0cyk7CisgIGlmIChpZWMpCisgICAgcmV0dXJuIGFycmF5W2luZGV4XSArIHN0ZDo6c3RyaW5nKCJpIik7CisgIGVsc2UKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoMSwgYXJyYXlbaW5kZXhdKTsKK30KKworc3RkOjpzdHJpbmcgVG9CaW5hcnlTdHJpbmdGdWxseVNwZWNpZmllZChkb3VibGUgdmFsdWUsIGRvdWJsZSB0aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVjaXNpb24sIGRvdWJsZSBvbmVfayA9IDEwMjQuMCkgeworICBzdGQ6OnN0cmluZyBtYW50aXNzYTsKKyAgaW50NjRfdCBleHBvbmVudDsKKyAgVG9FeHBvbmVudEFuZE1hbnRpc3NhKHZhbHVlLCB0aHJlc2hvbGQsIHByZWNpc2lvbiwgb25lX2ssICZtYW50aXNzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZleHBvbmVudCk7CisgIHJldHVybiBtYW50aXNzYSArIEV4cG9uZW50VG9QcmVmaXgoZXhwb25lbnQsIGZhbHNlKTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZQorCit2b2lkIEFwcGVuZEh1bWFuUmVhZGFibGUoaW50IG4sIHN0ZDo6c3RyaW5nKiBzdHIpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIC8vIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgU0kgcHJlZml4LgorICBzcyA8PCBUb0JpbmFyeVN0cmluZ0Z1bGx5U3BlY2lmaWVkKG4sIDEuMCwgMCk7CisgICpzdHIgKz0gc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIEh1bWFuUmVhZGFibGVOdW1iZXIoZG91YmxlIG4sIGRvdWJsZSBvbmVfaykgeworICAvLyAxLjEgbWVhbnMgdGhhdCBmaWd1cmVzIHVwIHRvIDEuMWsgc2hvdWxkIGJlIHNob3duIHdpdGggdGhlIG5leHQgdW5pdCBkb3duOworICAvLyB0aGlzIHNvZnRlbnMgZWRnZSBlZmZlY3RzLgorICAvLyAxIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIHNob3cgb25lIGRlY2ltYWwgcGxhY2Ugb2YgcHJlY2lzaW9uLgorICByZXR1cm4gVG9CaW5hcnlTdHJpbmdGdWxseVNwZWNpZmllZChuLCAxLjEsIDEsIG9uZV9rKTsKK30KKworc3RkOjpzdHJpbmcgU3RyRm9ybWF0SW1wKGNvbnN0IGNoYXIqIG1zZywgdmFfbGlzdCBhcmdzKSB7CisgIC8vIHdlIG1pZ2h0IG5lZWQgYSBzZWNvbmQgc2hvdCBhdCB0aGlzLCBzbyBwcmUtZW1wdGl2bHkgbWFrZSBhIGNvcHkKKyAgdmFfbGlzdCBhcmdzX2NwOworICB2YV9jb3B5KGFyZ3NfY3AsIGFyZ3MpOworCisgIC8vIFRPRE8oZXJpY3dmKTogdXNlIHN0ZDo6YXJyYXkgZm9yIGZpcnN0IGF0dGVtcHQgdG8gYXZvaWQgb25lIG1lbW9yeQorICAvLyBhbGxvY2F0aW9uIGd1ZXNzIHdoYXQgdGhlIHNpemUgbWlnaHQgYmUKKyAgc3RkOjphcnJheTxjaGFyLCAyNTY+IGxvY2FsX2J1ZmY7CisgIHN0ZDo6c2l6ZV90IHNpemUgPSBsb2NhbF9idWZmLnNpemUoKTsKKyAgLy8gMjAxNS0xMC0wODogdnNucHJpbnRmIGlzIHVzZWQgaW5zdGVhZCBvZiBzbmQ6OnZzbnByaW50ZiBkdWUgdG8gYSBsaW1pdGF0aW9uCisgIC8vIGluIHRoZSBhbmRyb2lkLW5kaworICBhdXRvIHJldCA9IHZzbnByaW50Zihsb2NhbF9idWZmLmRhdGEoKSwgc2l6ZSwgbXNnLCBhcmdzX2NwKTsKKworICB2YV9lbmQoYXJnc19jcCk7CisKKyAgLy8gaGFuZGxlIGVtcHR5IGV4cGFuc2lvbgorICBpZiAocmV0ID09IDApIHJldHVybiBzdGQ6OnN0cmluZ3t9OworICBpZiAoc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHJldCkgPCBzaXplKQorICAgIHJldHVybiBzdGQ6OnN0cmluZyhsb2NhbF9idWZmLmRhdGEoKSk7CisKKyAgLy8gd2UgZGlkIG5vdCBwcm92aWRlIGEgbG9uZyBlbm91Z2ggYnVmZmVyIG9uIG91ciBmaXJzdCBhdHRlbXB0LgorICAvLyBhZGQgMSB0byBzaXplIHRvIGFjY291bnQgZm9yIG51bGwtYnl0ZSBpbiBzaXplIGNhc3QgdG8gcHJldmVudCBvdmVyZmxvdworICBzaXplID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHJldCkgKyAxOworICBhdXRvIGJ1ZmZfcHRyID0gc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4obmV3IGNoYXJbc2l6ZV0pOworICAvLyAyMDE1LTEwLTA4OiB2c25wcmludGYgaXMgdXNlZCBpbnN0ZWFkIG9mIHNuZDo6dnNucHJpbnRmIGR1ZSB0byBhIGxpbWl0YXRpb24KKyAgLy8gaW4gdGhlIGFuZHJvaWQtbmRrCisgIHJldCA9IHZzbnByaW50ZihidWZmX3B0ci5nZXQoKSwgc2l6ZSwgbXNnLCBhcmdzKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZfcHRyLmdldCgpKTsKK30KKworc3RkOjpzdHJpbmcgU3RyRm9ybWF0KGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgc3RkOjpzdHJpbmcgdG1wID0gU3RyRm9ybWF0SW1wKGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcmV0dXJuIHRtcDsKK30KKworI2lmZGVmIEJFTkNITUFSS19TVExfQU5EUk9JRF9HTlVTVEwKKy8qCisgKiBHTlUgU1RMIGluIEFuZHJvaWQgTkRLIGxhY2tzIHN1cHBvcnQgZm9yIHNvbWUgQysrMTEgZnVuY3Rpb25zLCBpbmNsdWRpbmcKKyAqIHN0b3VsLCBzdG9pLCBzdG9kLiBXZSByZWltcGxlbWVudCB0aGVtIGhlcmUgdXNpbmcgQyBmdW5jdGlvbnMgc3RydG91bCwKKyAqIHN0cnRvbCwgc3RydG9kLiBOb3RlIHRoYXQgcmVpbXBsZW1lbnRlZCBmdW5jdGlvbnMgYXJlIGluIGJlbmNobWFyazo6CisgKiBuYW1lc3BhY2UsIG5vdCBzdGQ6OiBuYW1lc3BhY2UuCisgKi8KK3Vuc2lnbmVkIGxvbmcgc3RvdWwoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgc2l6ZV90KiBwb3MsIGludCBiYXNlKSB7CisgIC8qIFJlY29yZCBwcmV2aW91cyBlcnJubyAqLworICBjb25zdCBpbnQgb2xkRXJybm8gPSBlcnJubzsKKyAgZXJybm8gPSAwOworCisgIGNvbnN0IGNoYXIqIHN0clN0YXJ0ID0gc3RyLmNfc3RyKCk7CisgIGNoYXIqIHN0ckVuZCA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHN0clN0YXJ0KTsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyByZXN1bHQgPSBzdHJ0b3VsKHN0clN0YXJ0LCAmc3RyRW5kLCBiYXNlKTsKKworICBjb25zdCBpbnQgc3RydG91bEVycm5vID0gZXJybm87CisgIC8qIFJlc3RvcmUgcHJldmlvdXMgZXJybm8gKi8KKyAgZXJybm8gPSBvbGRFcnJubzsKKworICAvKiBDaGVjayBmb3IgZXJyb3JzIGFuZCByZXR1cm4gKi8KKyAgaWYgKHN0cnRvdWxFcnJubyA9PSBFUkFOR0UpIHsKKyAgICB0aHJvdyBzdGQ6Om91dF9vZl9yYW5nZSgKKyAgICAgICJzdG91bCBmYWlsZWQ6ICIgKyBzdHIgKyAiIGlzIG91dHNpZGUgb2YgcmFuZ2Ugb2YgdW5zaWduZWQgbG9uZyIpOworICB9IGVsc2UgaWYgKHN0ckVuZCA9PSBzdHJTdGFydCB8fCBzdHJ0b3VsRXJybm8gIT0gMCkgeworICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgKKyAgICAgICJzdG91bCBmYWlsZWQ6ICIgKyBzdHIgKyAiIGlzIG5vdCBhbiBpbnRlZ2VyIik7CisgIH0KKyAgaWYgKHBvcyAhPSBudWxscHRyKSB7CisgICAgKnBvcyA9IHN0YXRpY19jYXN0PHNpemVfdD4oc3RyRW5kIC0gc3RyU3RhcnQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBzdG9pKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIHNpemVfdCogcG9zLCBpbnQgYmFzZSkgeworICAvKiBSZWNvcmQgcHJldmlvdXMgZXJybm8gKi8KKyAgY29uc3QgaW50IG9sZEVycm5vID0gZXJybm87CisgIGVycm5vID0gMDsKKworICBjb25zdCBjaGFyKiBzdHJTdGFydCA9IHN0ci5jX3N0cigpOworICBjaGFyKiBzdHJFbmQgPSBjb25zdF9jYXN0PGNoYXIqPihzdHJTdGFydCk7CisgIGNvbnN0IGxvbmcgcmVzdWx0ID0gc3RydG9sKHN0clN0YXJ0LCAmc3RyRW5kLCBiYXNlKTsKKworICBjb25zdCBpbnQgc3RydG9sRXJybm8gPSBlcnJubzsKKyAgLyogUmVzdG9yZSBwcmV2aW91cyBlcnJubyAqLworICBlcnJubyA9IG9sZEVycm5vOworCisgIC8qIENoZWNrIGZvciBlcnJvcnMgYW5kIHJldHVybiAqLworICBpZiAoc3RydG9sRXJybm8gPT0gRVJBTkdFIHx8IGxvbmcoaW50KHJlc3VsdCkpICE9IHJlc3VsdCkgeworICAgIHRocm93IHN0ZDo6b3V0X29mX3JhbmdlKAorICAgICAgInN0b3VsIGZhaWxlZDogIiArIHN0ciArICIgaXMgb3V0c2lkZSBvZiByYW5nZSBvZiBpbnQiKTsKKyAgfSBlbHNlIGlmIChzdHJFbmQgPT0gc3RyU3RhcnQgfHwgc3RydG9sRXJybm8gIT0gMCkgeworICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgKKyAgICAgICJzdG91bCBmYWlsZWQ6ICIgKyBzdHIgKyAiIGlzIG5vdCBhbiBpbnRlZ2VyIik7CisgIH0KKyAgaWYgKHBvcyAhPSBudWxscHRyKSB7CisgICAgKnBvcyA9IHN0YXRpY19jYXN0PHNpemVfdD4oc3RyRW5kIC0gc3RyU3RhcnQpOworICB9CisgIHJldHVybiBpbnQocmVzdWx0KTsKK30KKworZG91YmxlIHN0b2QoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgc2l6ZV90KiBwb3MpIHsKKyAgLyogUmVjb3JkIHByZXZpb3VzIGVycm5vICovCisgIGNvbnN0IGludCBvbGRFcnJubyA9IGVycm5vOworICBlcnJubyA9IDA7CisKKyAgY29uc3QgY2hhciogc3RyU3RhcnQgPSBzdHIuY19zdHIoKTsKKyAgY2hhciogc3RyRW5kID0gY29uc3RfY2FzdDxjaGFyKj4oc3RyU3RhcnQpOworICBjb25zdCBkb3VibGUgcmVzdWx0ID0gc3RydG9kKHN0clN0YXJ0LCAmc3RyRW5kKTsKKworICAvKiBSZXN0b3JlIHByZXZpb3VzIGVycm5vICovCisgIGNvbnN0IGludCBzdHJ0b2RFcnJubyA9IGVycm5vOworICBlcnJubyA9IG9sZEVycm5vOworCisgIC8qIENoZWNrIGZvciBlcnJvcnMgYW5kIHJldHVybiAqLworICBpZiAoc3RydG9kRXJybm8gPT0gRVJBTkdFKSB7CisgICAgdGhyb3cgc3RkOjpvdXRfb2ZfcmFuZ2UoCisgICAgICAic3RvdWwgZmFpbGVkOiAiICsgc3RyICsgIiBpcyBvdXRzaWRlIG9mIHJhbmdlIG9mIGludCIpOworICB9IGVsc2UgaWYgKHN0ckVuZCA9PSBzdHJTdGFydCB8fCBzdHJ0b2RFcnJubyAhPSAwKSB7CisgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KAorICAgICAgInN0b3VsIGZhaWxlZDogIiArIHN0ciArICIgaXMgbm90IGFuIGludGVnZXIiKTsKKyAgfQorICBpZiAocG9zICE9IG51bGxwdHIpIHsKKyAgICAqcG9zID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzdHJFbmQgLSBzdHJTdGFydCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3N0cmluZ191dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvc3RyaW5nX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ3YjRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3N0cmluZ191dGlsLmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBCRU5DSE1BUktfU1RSSU5HX1VUSUxfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX1NUUklOR19VVElMX0hfCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKwordm9pZCBBcHBlbmRIdW1hblJlYWRhYmxlKGludCBuLCBzdGQ6OnN0cmluZyogc3RyKTsKKworc3RkOjpzdHJpbmcgSHVtYW5SZWFkYWJsZU51bWJlcihkb3VibGUgbiwgZG91YmxlIG9uZV9rID0gMTAyNC4wKTsKKworI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQoX19NSU5HV19QUklOVEZfRk9STUFULCAxLCAyKSkpCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKQorI2VuZGlmCitzdGQ6OnN0cmluZworU3RyRm9ybWF0KGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgU3RyQ2F0SW1wKHN0ZDo6b3N0cmVhbSYgb3V0KSBCRU5DSE1BUktfTk9FWENFUFQgeworICByZXR1cm4gb3V0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRmlyc3QsIGNsYXNzLi4uIFJlc3Q+CitpbmxpbmUgc3RkOjpvc3RyZWFtJiBTdHJDYXRJbXAoc3RkOjpvc3RyZWFtJiBvdXQsIEZpcnN0JiYgZiwgUmVzdCYmLi4uIHJlc3QpIHsKKyAgb3V0IDw8IHN0ZDo6Zm9yd2FyZDxGaXJzdD4oZik7CisgIHJldHVybiBTdHJDYXRJbXAob3V0LCBzdGQ6OmZvcndhcmQ8UmVzdD4ocmVzdCkuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KK2lubGluZSBzdGQ6OnN0cmluZyBTdHJDYXQoQXJncyYmLi4uIGFyZ3MpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOworICBTdHJDYXRJbXAoc3MsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworI2lmZGVmIEJFTkNITUFSS19TVExfQU5EUk9JRF9HTlVTVEwKKy8qCisgKiBHTlUgU1RMIGluIEFuZHJvaWQgTkRLIGxhY2tzIHN1cHBvcnQgZm9yIHNvbWUgQysrMTEgZnVuY3Rpb25zLCBpbmNsdWRpbmcKKyAqIHN0b3VsLCBzdG9pLCBzdG9kLiBXZSByZWltcGxlbWVudCB0aGVtIGhlcmUgdXNpbmcgQyBmdW5jdGlvbnMgc3RydG91bCwKKyAqIHN0cnRvbCwgc3RydG9kLiBOb3RlIHRoYXQgcmVpbXBsZW1lbnRlZCBmdW5jdGlvbnMgYXJlIGluIGJlbmNobWFyazo6CisgKiBuYW1lc3BhY2UsIG5vdCBzdGQ6OiBuYW1lc3BhY2UuCisgKi8KK3Vuc2lnbmVkIGxvbmcgc3RvdWwoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgc2l6ZV90KiBwb3MgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UgPSAxMCk7CitpbnQgc3RvaShjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBzaXplX3QqIHBvcyA9IG51bGxwdHIsIGludCBiYXNlID0gMTApOworZG91YmxlIHN0b2QoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgc2l6ZV90KiBwb3MgPSBudWxscHRyKTsKKyNlbHNlCit1c2luZyBzdGQ6OnN0b3VsOwordXNpbmcgc3RkOjpzdG9pOwordXNpbmcgc3RkOjpzdG9kOworI2VuZGlmCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX1NUUklOR19VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvc3lzaW5mby5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy9zeXNpbmZvLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViN2M0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvc3lzaW5mby5jYwpAQCAtMCwwICsxLDcwOCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorCisjaWZkZWYgQkVOQ0hNQVJLX09TX1dJTkRPV1MKKyNpbmNsdWRlIDxzaGx3YXBpLmg+CisjdW5kZWYgU3RyQ2F0ICAvLyBEb24ndCBsZXQgU3RyQ2F0IGluIHN0cmluZ191dGlsLmggYmUgcmVuYW1lZCB0byBsc3RyY2F0QQorI2luY2x1ZGUgPHZlcnNpb25oZWxwZXJzLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGNvZGVjdnQ+CisjZWxzZQorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZuZGVmIEJFTkNITUFSS19PU19GVUNIU0lBCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gdGhpcyBoZWFkZXIgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgJ3N5cy9zeXNjdGwuaCcgdG8gYXZvaWQgY29tcGlsYXRpb24gZXJyb3Igb24gRnJlZUJTRAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmIGRlZmluZWQgQkVOQ0hNQVJLX09TX0ZSRUVCU0QgfHwgZGVmaW5lZCBCRU5DSE1BUktfT1NfTUFDT1NYIHx8IFwKKyAgICBkZWZpbmVkIEJFTkNITUFSS19PU19ORVRCU0QgfHwgZGVmaW5lZCBCRU5DSE1BUktfT1NfT1BFTkJTRAorI2RlZmluZSBCRU5DSE1BUktfSEFTX1NZU0NUTAorI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfU09MQVJJUykKKyNpbmNsdWRlIDxrc3RhdC5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfUU5YKQorI2luY2x1ZGUgPHN5cy9zeXNwYWdlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGxvY2FsZT4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiY3ljbGVjbG9jay5oIgorI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNsZWVwLmgiCisjaW5jbHVkZSAic3RyaW5nX3V0aWwuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgeworCit2b2lkIFByaW50SW1wKHN0ZDo6b3N0cmVhbSYgb3V0KSB7IG91dCA8PCBzdGQ6OmVuZGw7IH0KKwordGVtcGxhdGUgPGNsYXNzIEZpcnN0LCBjbGFzcy4uLiBSZXN0Pgordm9pZCBQcmludEltcChzdGQ6Om9zdHJlYW0mIG91dCwgRmlyc3QmJiBmLCBSZXN0JiYuLi4gcmVzdCkgeworICBvdXQgPDwgc3RkOjpmb3J3YXJkPEZpcnN0PihmKTsKKyAgUHJpbnRJbXAob3V0LCBzdGQ6OmZvcndhcmQ8UmVzdD4ocmVzdCkuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KK0JFTkNITUFSS19OT1JFVFVSTiB2b2lkIFByaW50RXJyb3JBbmREaWUoQXJncyYmLi4uIGFyZ3MpIHsKKyAgUHJpbnRJbXAoc3RkOjpjZXJyLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICBzdGQ6OmV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworI2lmZGVmIEJFTkNITUFSS19IQVNfU1lTQ1RMCisKKy8vLyBWYWx1ZVVuaW9uIC0gQSB0eXBlIHVzZWQgdG8gY29ycmVjdGx5IGFsaWFzIHRoZSBieXRlLWZvci1ieXRlIG91dHB1dCBvZgorLy8vIGBzeXNjdGxgIHdpdGggdGhlIHJlc3VsdCB0eXBlIGl0J3MgdG8gYmUgaW50ZXJwcmV0ZWQgYXMuCitzdHJ1Y3QgVmFsdWVVbmlvbiB7CisgIHVuaW9uIERhdGFUIHsKKyAgICB1aW50MzJfdCB1aW50MzJfdmFsdWU7CisgICAgdWludDY0X3QgdWludDY0X3ZhbHVlOworICAgIC8vIEZvciBjb3JyZWN0IGFsaWFzaW5nIG9mIHVuaW9uIG1lbWJlcnMgZnJvbSBieXRlcy4KKyAgICBjaGFyIGJ5dGVzWzhdOworICB9OworICB1c2luZyBEYXRhUHRyID0gc3RkOjp1bmlxdWVfcHRyPERhdGFULCBkZWNsdHlwZSgmc3RkOjpmcmVlKT47CisKKyAgLy8gVGhlIHNpemUgb2YgdGhlIGRhdGEgdW5pb24gbWVtYmVyICsgaXRzIHRyYWlsaW5nIGFycmF5IHNpemUuCisgIHNpemVfdCBTaXplOworICBEYXRhUHRyIEJ1ZmY7CisKKyBwdWJsaWM6CisgIFZhbHVlVW5pb24oKSA6IFNpemUoMCksIEJ1ZmYobnVsbHB0ciwgJnN0ZDo6ZnJlZSkge30KKworICBleHBsaWNpdCBWYWx1ZVVuaW9uKHNpemVfdCBCdWZmU2l6ZSkKKyAgICAgIDogU2l6ZShzaXplb2YoRGF0YVQpICsgQnVmZlNpemUpLAorICAgICAgICBCdWZmKDo6bmV3IChzdGQ6Om1hbGxvYyhTaXplKSkgRGF0YVQoKSwgJnN0ZDo6ZnJlZSkge30KKworICBWYWx1ZVVuaW9uKFZhbHVlVW5pb24mJiBvdGhlcikgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBib29sKEJ1ZmYpOyB9CisKKyAgY2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIEJ1ZmYtPmJ5dGVzOyB9CisKKyAgc3RkOjpzdHJpbmcgR2V0QXNTdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdGQ6OnN0cmluZyhkYXRhKCkpOyB9CisKKyAgaW50NjRfdCBHZXRBc0ludGVnZXIoKSBjb25zdCB7CisgICAgaWYgKFNpemUgPT0gc2l6ZW9mKEJ1ZmYtPnVpbnQzMl92YWx1ZSkpCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oQnVmZi0+dWludDMyX3ZhbHVlKTsKKyAgICBlbHNlIGlmIChTaXplID09IHNpemVvZihCdWZmLT51aW50NjRfdmFsdWUpKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KEJ1ZmYtPnVpbnQ2NF92YWx1ZSk7CisgICAgQkVOQ0hNQVJLX1VOUkVBQ0hBQkxFKCk7CisgIH0KKworICB1aW50NjRfdCBHZXRBc1Vuc2lnbmVkKCkgY29uc3QgeworICAgIGlmIChTaXplID09IHNpemVvZihCdWZmLT51aW50MzJfdmFsdWUpKQorICAgICAgcmV0dXJuIEJ1ZmYtPnVpbnQzMl92YWx1ZTsKKyAgICBlbHNlIGlmIChTaXplID09IHNpemVvZihCdWZmLT51aW50NjRfdmFsdWUpKQorICAgICAgcmV0dXJuIEJ1ZmYtPnVpbnQ2NF92YWx1ZTsKKyAgICBCRU5DSE1BUktfVU5SRUFDSEFCTEUoKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBULCBpbnQgTj4KKyAgc3RkOjphcnJheTxULCBOPiBHZXRBc0FycmF5KCkgeworICAgIGNvbnN0IGludCBBcnJTaXplID0gc2l6ZW9mKFQpICogTjsKKyAgICBDSEVDS19MRShBcnJTaXplLCBTaXplKTsKKyAgICBzdGQ6OmFycmF5PFQsIE4+IEFycjsKKyAgICBzdGQ6Om1lbWNweShBcnIuZGF0YSgpLCBkYXRhKCksIEFyclNpemUpOworICAgIHJldHVybiBBcnI7CisgIH0KK307CisKK1ZhbHVlVW5pb24gR2V0U3lzY3RsSW1wKHN0ZDo6c3RyaW5nIGNvbnN0JiBOYW1lKSB7CisjaWYgZGVmaW5lZCBCRU5DSE1BUktfT1NfT1BFTkJTRAorICBpbnQgbWliWzJdOworCisgIG1pYlswXSA9IENUTF9IVzsKKyAgaWYgKChOYW1lID09ICJody5uY3B1IikgfHwgKE5hbWUgPT0gImh3LmNwdXNwZWVkIikpeworICAgIFZhbHVlVW5pb24gYnVmZihzaXplb2YoaW50KSk7CisKKyAgICBpZiAoTmFtZSA9PSAiaHcubmNwdSIpIHsKKyAgICAgIG1pYlsxXSA9IEhXX05DUFU7CisgICAgfSBlbHNlIHsKKyAgICAgIG1pYlsxXSA9IEhXX0NQVVNQRUVEOworICAgIH0KKworICAgIGlmIChzeXNjdGwobWliLCAyLCBidWZmLmRhdGEoKSwgJmJ1ZmYuU2l6ZSwgbnVsbHB0ciwgMCkgPT0gLTEpIHsKKyAgICAgIHJldHVybiBWYWx1ZVVuaW9uKCk7CisgICAgfQorICAgIHJldHVybiBidWZmOworICB9CisgIHJldHVybiBWYWx1ZVVuaW9uKCk7CisjZWxzZQorICBzaXplX3QgQ3VyQnVmZlNpemUgPSAwOworICBpZiAoc3lzY3RsYnluYW1lKE5hbWUuY19zdHIoKSwgbnVsbHB0ciwgJkN1ckJ1ZmZTaXplLCBudWxscHRyLCAwKSA9PSAtMSkKKyAgICByZXR1cm4gVmFsdWVVbmlvbigpOworCisgIFZhbHVlVW5pb24gYnVmZihDdXJCdWZmU2l6ZSk7CisgIGlmIChzeXNjdGxieW5hbWUoTmFtZS5jX3N0cigpLCBidWZmLmRhdGEoKSwgJmJ1ZmYuU2l6ZSwgbnVsbHB0ciwgMCkgPT0gMCkKKyAgICByZXR1cm4gYnVmZjsKKyAgcmV0dXJuIFZhbHVlVW5pb24oKTsKKyNlbmRpZgorfQorCitCRU5DSE1BUktfTUFZQkVfVU5VU0VECitib29sIEdldFN5c2N0bChzdGQ6OnN0cmluZyBjb25zdCYgTmFtZSwgc3RkOjpzdHJpbmcqIE91dCkgeworICBPdXQtPmNsZWFyKCk7CisgIGF1dG8gQnVmZiA9IEdldFN5c2N0bEltcChOYW1lKTsKKyAgaWYgKCFCdWZmKSByZXR1cm4gZmFsc2U7CisgIE91dC0+YXNzaWduKEJ1ZmYuZGF0YSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcCwKKyAgICAgICAgICBjbGFzcyA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VHA+Ojp2YWx1ZT46OnR5cGU+Citib29sIEdldFN5c2N0bChzdGQ6OnN0cmluZyBjb25zdCYgTmFtZSwgVHAqIE91dCkgeworICAqT3V0ID0gMDsKKyAgYXV0byBCdWZmID0gR2V0U3lzY3RsSW1wKE5hbWUpOworICBpZiAoIUJ1ZmYpIHJldHVybiBmYWxzZTsKKyAgKk91dCA9IHN0YXRpY19jYXN0PFRwPihCdWZmLkdldEFzVW5zaWduZWQoKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHAsIHNpemVfdCBOPgorYm9vbCBHZXRTeXNjdGwoc3RkOjpzdHJpbmcgY29uc3QmIE5hbWUsIHN0ZDo6YXJyYXk8VHAsIE4+KiBPdXQpIHsKKyAgYXV0byBCdWZmID0gR2V0U3lzY3RsSW1wKE5hbWUpOworICBpZiAoIUJ1ZmYpIHJldHVybiBmYWxzZTsKKyAgKk91dCA9IEJ1ZmYuR2V0QXNBcnJheTxUcCwgTj4oKTsKKyAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIEFyZ1Q+Citib29sIFJlYWRGcm9tRmlsZShzdGQ6OnN0cmluZyBjb25zdCYgZm5hbWUsIEFyZ1QqIGFyZykgeworICAqYXJnID0gQXJnVCgpOworICBzdGQ6Omlmc3RyZWFtIGYoZm5hbWUuY19zdHIoKSk7CisgIGlmICghZi5pc19vcGVuKCkpIHJldHVybiBmYWxzZTsKKyAgZiA+PiAqYXJnOworICByZXR1cm4gZi5nb29kKCk7Cit9CisKK2Jvb2wgQ3B1U2NhbGluZ0VuYWJsZWQoaW50IG51bV9jcHVzKSB7CisgIC8vIFdlIGRvbid0IGhhdmUgYSB2YWxpZCBDUFUgY291bnQsIHNvIGRvbid0IGV2ZW4gYm90aGVyLgorICBpZiAobnVtX2NwdXMgPD0gMCkgcmV0dXJuIGZhbHNlOworI2lmZGVmIEJFTkNITUFSS19PU19RTlgKKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisjaWZuZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisgIC8vIE9uIExpbnV4LCB0aGUgQ1BVZnJlcSBzdWJzeXN0ZW0gZXhwb3NlcyBDUFUgaW5mb3JtYXRpb24gYXMgZmlsZXMgb24gdGhlCisgIC8vIGxvY2FsIGZpbGUgc3lzdGVtLiBJZiByZWFkaW5nIHRoZSBleHBvcnRlZCBmaWxlcyBmYWlscywgdGhlbiB3ZSBtYXkgbm90IGJlCisgIC8vIHJ1bm5pbmcgb24gTGludXgsIHNvIHdlIHNpbGVudGx5IGlnbm9yZSBhbGwgdGhlIHJlYWQgZXJyb3JzLgorICBzdGQ6OnN0cmluZyByZXM7CisgIGZvciAoaW50IGNwdSA9IDA7IGNwdSA8IG51bV9jcHVzOyArK2NwdSkgeworICAgIHN0ZDo6c3RyaW5nIGdvdmVybm9yX2ZpbGUgPQorICAgICAgICBTdHJDYXQoIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSIsIGNwdSwgIi9jcHVmcmVxL3NjYWxpbmdfZ292ZXJub3IiKTsKKyAgICBpZiAoUmVhZEZyb21GaWxlKGdvdmVybm9yX2ZpbGUsICZyZXMpICYmIHJlcyAhPSAicGVyZm9ybWFuY2UiKSByZXR1cm4gdHJ1ZTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBmYWxzZTsKK30KKworaW50IENvdW50U2V0Qml0c0luQ1BVTWFwKHN0ZDo6c3RyaW5nIFZhbCkgeworICBhdXRvIENvdW50Qml0cyA9IFtdKHN0ZDo6c3RyaW5nIFBhcnQpIHsKKyAgICB1c2luZyBDUFVNYXNrID0gc3RkOjpiaXRzZXQ8c2l6ZW9mKHN0ZDo6dWludHB0cl90KSAqIENIQVJfQklUPjsKKyAgICBQYXJ0ID0gIjB4IiArIFBhcnQ7CisgICAgQ1BVTWFzayBNYXNrKGJlbmNobWFyazo6c3RvdWwoUGFydCwgbnVsbHB0ciwgMTYpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihNYXNrLmNvdW50KCkpOworICB9OworICBzaXplX3QgUG9zOworICBpbnQgdG90YWwgPSAwOworICB3aGlsZSAoKFBvcyA9IFZhbC5maW5kKCcsJykpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgdG90YWwgKz0gQ291bnRCaXRzKFZhbC5zdWJzdHIoMCwgUG9zKSk7CisgICAgVmFsID0gVmFsLnN1YnN0cihQb3MgKyAxKTsKKyAgfQorICBpZiAoIVZhbC5lbXB0eSgpKSB7CisgICAgdG90YWwgKz0gQ291bnRCaXRzKFZhbCk7CisgIH0KKyAgcmV0dXJuIHRvdGFsOworfQorCitCRU5DSE1BUktfTUFZQkVfVU5VU0VECitzdGQ6OnZlY3RvcjxDUFVJbmZvOjpDYWNoZUluZm8+IEdldENhY2hlU2l6ZXNGcm9tS1ZGUygpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BVSW5mbzo6Q2FjaGVJbmZvPiByZXM7CisgIHN0ZDo6c3RyaW5nIGRpciA9ICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL2NhY2hlLyI7CisgIGludCBJZHggPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIENQVUluZm86OkNhY2hlSW5mbyBpbmZvOworICAgIHN0ZDo6c3RyaW5nIEZQYXRoID0gU3RyQ2F0KGRpciwgImluZGV4IiwgSWR4KyssICIvIik7CisgICAgc3RkOjppZnN0cmVhbSBmKFN0ckNhdChGUGF0aCwgInNpemUiKS5jX3N0cigpKTsKKyAgICBpZiAoIWYuaXNfb3BlbigpKSBicmVhazsKKyAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgZiA+PiBpbmZvLnNpemU7CisgICAgaWYgKGYuZmFpbCgpKQorICAgICAgUHJpbnRFcnJvckFuZERpZSgiRmFpbGVkIHdoaWxlIHJlYWRpbmcgZmlsZSAnIiwgRlBhdGgsICJzaXplJyIpOworICAgIGlmIChmLmdvb2QoKSkgeworICAgICAgZiA+PiBzdWZmaXg7CisgICAgICBpZiAoZi5iYWQoKSkKKyAgICAgICAgUHJpbnRFcnJvckFuZERpZSgKKyAgICAgICAgICAgICJJbnZhbGlkIGNhY2hlIHNpemUgZm9ybWF0OiBmYWlsZWQgdG8gcmVhZCBzaXplIHN1ZmZpeCIpOworICAgICAgZWxzZSBpZiAoZiAmJiBzdWZmaXggIT0gIksiKQorICAgICAgICBQcmludEVycm9yQW5kRGllKCJJbnZhbGlkIGNhY2hlIHNpemUgZm9ybWF0OiBFeHBlY3RlZCBieXRlcyAiLCBzdWZmaXgpOworICAgICAgZWxzZSBpZiAoc3VmZml4ID09ICJLIikKKyAgICAgICAgaW5mby5zaXplICo9IDEwMjQ7CisgICAgfQorICAgIGlmICghUmVhZEZyb21GaWxlKFN0ckNhdChGUGF0aCwgInR5cGUiKSwgJmluZm8udHlwZSkpCisgICAgICBQcmludEVycm9yQW5kRGllKCJGYWlsZWQgdG8gcmVhZCBmcm9tIGZpbGUgIiwgRlBhdGgsICJ0eXBlIik7CisgICAgaWYgKCFSZWFkRnJvbUZpbGUoU3RyQ2F0KEZQYXRoLCAibGV2ZWwiKSwgJmluZm8ubGV2ZWwpKQorICAgICAgUHJpbnRFcnJvckFuZERpZSgiRmFpbGVkIHRvIHJlYWQgZnJvbSBmaWxlICIsIEZQYXRoLCAibGV2ZWwiKTsKKyAgICBzdGQ6OnN0cmluZyBtYXBfc3RyOworICAgIGlmICghUmVhZEZyb21GaWxlKFN0ckNhdChGUGF0aCwgInNoYXJlZF9jcHVfbWFwIiksICZtYXBfc3RyKSkKKyAgICAgIFByaW50RXJyb3JBbmREaWUoIkZhaWxlZCB0byByZWFkIGZyb20gZmlsZSAiLCBGUGF0aCwgInNoYXJlZF9jcHVfbWFwIik7CisgICAgaW5mby5udW1fc2hhcmluZyA9IENvdW50U2V0Qml0c0luQ1BVTWFwKG1hcF9zdHIpOworICAgIHJlcy5wdXNoX2JhY2soaW5mbyk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisjaWZkZWYgQkVOQ0hNQVJLX09TX01BQ09TWAorc3RkOjp2ZWN0b3I8Q1BVSW5mbzo6Q2FjaGVJbmZvPiBHZXRDYWNoZVNpemVzTWFjT1NYKCkgeworICBzdGQ6OnZlY3RvcjxDUFVJbmZvOjpDYWNoZUluZm8+IHJlczsKKyAgc3RkOjphcnJheTx1aW50NjRfdCwgND4gQ2FjaGVDb3VudHN7ezAsIDAsIDAsIDB9fTsKKyAgR2V0U3lzY3RsKCJody5jYWNoZWNvbmZpZyIsICZDYWNoZUNvdW50cyk7CisKKyAgc3RydWN0IHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHN0ZDo6c3RyaW5nIHR5cGU7CisgICAgaW50IGxldmVsOworICAgIHVpbnQ2NF90IG51bV9zaGFyaW5nOworICB9IENhc2VzW10gPSB7eyJody5sMWRjYWNoZXNpemUiLCAiRGF0YSIsIDEsIENhY2hlQ291bnRzWzFdfSwKKyAgICAgICAgICAgICAgIHsiaHcubDFpY2FjaGVzaXplIiwgIkluc3RydWN0aW9uIiwgMSwgQ2FjaGVDb3VudHNbMV19LAorICAgICAgICAgICAgICAgeyJody5sMmNhY2hlc2l6ZSIsICJVbmlmaWVkIiwgMiwgQ2FjaGVDb3VudHNbMl19LAorICAgICAgICAgICAgICAgeyJody5sM2NhY2hlc2l6ZSIsICJVbmlmaWVkIiwgMywgQ2FjaGVDb3VudHNbM119fTsKKyAgZm9yIChhdXRvJiBDIDogQ2FzZXMpIHsKKyAgICBpbnQgdmFsOworICAgIGlmICghR2V0U3lzY3RsKEMubmFtZSwgJnZhbCkpIGNvbnRpbnVlOworICAgIENQVUluZm86OkNhY2hlSW5mbyBpbmZvOworICAgIGluZm8udHlwZSA9IEMudHlwZTsKKyAgICBpbmZvLmxldmVsID0gQy5sZXZlbDsKKyAgICBpbmZvLnNpemUgPSB2YWw7CisgICAgaW5mby5udW1fc2hhcmluZyA9IHN0YXRpY19jYXN0PGludD4oQy5udW1fc2hhcmluZyk7CisgICAgcmVzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW5mbykpOworICB9CisgIHJldHVybiByZXM7Cit9CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorc3RkOjp2ZWN0b3I8Q1BVSW5mbzo6Q2FjaGVJbmZvPiBHZXRDYWNoZVNpemVzV2luZG93cygpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BVSW5mbzo6Q2FjaGVJbmZvPiByZXM7CisgIERXT1JEIGJ1ZmZlcl9zaXplID0gMDsKKyAgdXNpbmcgUEluZm8gPSBTWVNURU1fTE9HSUNBTF9QUk9DRVNTT1JfSU5GT1JNQVRJT047CisgIHVzaW5nIENJbmZvID0gQ0FDSEVfREVTQ1JJUFRPUjsKKworICB1c2luZyBVUHRyID0gc3RkOjp1bmlxdWVfcHRyPFBJbmZvLCBkZWNsdHlwZSgmc3RkOjpmcmVlKT47CisgIEdldExvZ2ljYWxQcm9jZXNzb3JJbmZvcm1hdGlvbihudWxscHRyLCAmYnVmZmVyX3NpemUpOworICBVUHRyIGJ1ZmYoKFBJbmZvKiltYWxsb2MoYnVmZmVyX3NpemUpLCAmc3RkOjpmcmVlKTsKKyAgaWYgKCFHZXRMb2dpY2FsUHJvY2Vzc29ySW5mb3JtYXRpb24oYnVmZi5nZXQoKSwgJmJ1ZmZlcl9zaXplKSkKKyAgICBQcmludEVycm9yQW5kRGllKCJGYWlsZWQgZHVyaW5nIGNhbGwgdG8gR2V0TG9naWNhbFByb2Nlc3NvckluZm9ybWF0aW9uOiAiLAorICAgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOworCisgIFBJbmZvKiBpdCA9IGJ1ZmYuZ2V0KCk7CisgIFBJbmZvKiBlbmQgPSBidWZmLmdldCgpICsgKGJ1ZmZlcl9zaXplIC8gc2l6ZW9mKFBJbmZvKSk7CisKKyAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpdC0+UmVsYXRpb25zaGlwICE9IFJlbGF0aW9uQ2FjaGUpIGNvbnRpbnVlOworICAgIHVzaW5nIEJpdFNldCA9IHN0ZDo6Yml0c2V0PHNpemVvZihVTE9OR19QVFIpICogQ0hBUl9CSVQ+OworICAgIEJpdFNldCBCKGl0LT5Qcm9jZXNzb3JNYXNrKTsKKyAgICAvLyBUbyBwcmV2ZW50IGR1cGxpY2F0ZXMsIG9ubHkgY29uc2lkZXIgY2FjaGVzIHdoZXJlIENQVSAwIGlzIHNwZWNpZmllZAorICAgIGlmICghQi50ZXN0KDApKSBjb250aW51ZTsKKyAgICBDSW5mbyogQ2FjaGUgPSAmaXQtPkNhY2hlOworICAgIENQVUluZm86OkNhY2hlSW5mbyBDOworICAgIEMubnVtX3NoYXJpbmcgPSBzdGF0aWNfY2FzdDxpbnQ+KEIuY291bnQoKSk7CisgICAgQy5sZXZlbCA9IENhY2hlLT5MZXZlbDsKKyAgICBDLnNpemUgPSBDYWNoZS0+U2l6ZTsKKyAgICBzd2l0Y2ggKENhY2hlLT5UeXBlKSB7CisgICAgICBjYXNlIENhY2hlVW5pZmllZDoKKyAgICAgICAgQy50eXBlID0gIlVuaWZpZWQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ2FjaGVJbnN0cnVjdGlvbjoKKyAgICAgICAgQy50eXBlID0gIkluc3RydWN0aW9uIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENhY2hlRGF0YToKKyAgICAgICAgQy50eXBlID0gIkRhdGEiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ2FjaGVUcmFjZToKKyAgICAgICAgQy50eXBlID0gIlRyYWNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBDLnR5cGUgPSAiVW5rbm93biI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXMucHVzaF9iYWNrKEMpOworICB9CisgIHJldHVybiByZXM7Cit9CisjZWxpZiBCRU5DSE1BUktfT1NfUU5YCitzdGQ6OnZlY3RvcjxDUFVJbmZvOjpDYWNoZUluZm8+IEdldENhY2hlU2l6ZXNRTlgoKSB7CisgIHN0ZDo6dmVjdG9yPENQVUluZm86OkNhY2hlSW5mbz4gcmVzOworICBzdHJ1Y3QgY2FjaGVhdHRyX2VudHJ5ICpjYWNoZSA9IFNZU1BBR0VfRU5UUlkoY2FjaGVhdHRyKTsKKyAgdWludDMyX3QgY29uc3QgZWxzaXplID0gU1lTUEFHRV9FTEVNRU5UX1NJWkUoY2FjaGVhdHRyKTsKKyAgaW50IG51bSA9IFNZU1BBR0VfRU5UUllfU0laRShjYWNoZWF0dHIpIC8gZWxzaXplIDsKKyAgZm9yKGludCBpID0gMDsgaSA8IG51bTsgKytpICkgeworICAgIENQVUluZm86OkNhY2hlSW5mbyBpbmZvOworICAgIHN3aXRjaCAoY2FjaGUtPmZsYWdzKXsKKyAgICAgIGNhc2UgQ0FDSEVfRkxBR19JTlNUUiA6CisgICAgICAgIGluZm8udHlwZSA9ICJJbnN0cnVjdGlvbiI7CisgICAgICAgIGluZm8ubGV2ZWwgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FDSEVfRkxBR19EQVRBIDoKKyAgICAgICAgaW5mby50eXBlID0gIkRhdGEiOworICAgICAgICBpbmZvLmxldmVsID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENBQ0hFX0ZMQUdfVU5JRklFRCA6CisgICAgICAgIGluZm8udHlwZSA9ICJVbmlmaWVkIjsKKyAgICAgICAgaW5mby5sZXZlbCA9IDI7CisgICAgICBjYXNlIENBQ0hFX0ZMQUdfU0hBUkVEIDoKKyAgICAgICAgaW5mby50eXBlID0gIlNoYXJlZCI7CisgICAgICAgIGluZm8ubGV2ZWwgPSAzOworICAgICAgZGVmYXVsdCA6CisgICAgICAgIGNvbnRpbnVlOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaW5mby5zaXplID0gY2FjaGUtPmxpbmVfc2l6ZSAqIGNhY2hlLT5udW1fbGluZXM7CisgICAgaW5mby5udW1fc2hhcmluZyA9IDA7CisgICAgcmVzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW5mbykpOworICAgIGNhY2hlID0gU1lTUEFHRV9BUlJBWV9BREpfT0ZGU0VUKGNhY2hlYXR0ciwgY2FjaGUsIGVsc2l6ZSk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCitzdGQ6OnZlY3RvcjxDUFVJbmZvOjpDYWNoZUluZm8+IEdldENhY2hlU2l6ZXMoKSB7CisjaWZkZWYgQkVOQ0hNQVJLX09TX01BQ09TWAorICByZXR1cm4gR2V0Q2FjaGVTaXplc01hY09TWCgpOworI2VsaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfV0lORE9XUykKKyAgcmV0dXJuIEdldENhY2hlU2l6ZXNXaW5kb3dzKCk7CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19RTlgpCisgIHJldHVybiBHZXRDYWNoZVNpemVzUU5YKCk7CisjZWxzZQorICByZXR1cm4gR2V0Q2FjaGVTaXplc0Zyb21LVkZTKCk7CisjZW5kaWYKK30KKworc3RkOjpzdHJpbmcgR2V0U3lzdGVtTmFtZSgpIHsKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorICBzdGQ6OnN0cmluZyBzdHI7CisgIGNvbnN0IHVuc2lnbmVkIENPVU5UID0gTUFYX0NPTVBVVEVSTkFNRV9MRU5HVEgrMTsKKyAgVENIQVIgIGhvc3RuYW1lW0NPVU5UXSA9IHsnXDAnfTsKKyAgRFdPUkQgRFdDT1VOVCA9IENPVU5UOworICBpZiAoIUdldENvbXB1dGVyTmFtZShob3N0bmFtZSwgJkRXQ09VTlQpKQorICAgIHJldHVybiBzdGQ6OnN0cmluZygiIik7CisjaWZuZGVmIFVOSUNPREUKKyAgc3RyID0gc3RkOjpzdHJpbmcoaG9zdG5hbWUsIERXQ09VTlQpOworI2Vsc2UKKyAgLy9Vc2luZyB3c3RyaW5nX2NvbnZlcnQsIElzIGRlcHJlY2F0ZWQgaW4gQysrMTcKKyAgdXNpbmcgY29udmVydF90eXBlID0gc3RkOjpjb2RlY3Z0X3V0Zjg8d2NoYXJfdD47CisgIHN0ZDo6d3N0cmluZ19jb252ZXJ0PGNvbnZlcnRfdHlwZSwgd2NoYXJfdD4gY29udmVydGVyOworICBzdGQ6OndzdHJpbmcgd1N0cihob3N0bmFtZSwgRFdDT1VOVCk7CisgIHN0ciA9IGNvbnZlcnRlci50b19ieXRlcyh3U3RyKTsKKyNlbmRpZgorICByZXR1cm4gc3RyOworI2Vsc2UgLy8gZGVmaW5lZChCRU5DSE1BUktfT1NfV0lORE9XUykKKyNpZm5kZWYgSE9TVF9OQU1FX01BWAorI2lmZGVmIEJFTkNITUFSS19IQVNfU1lTQ1RMIC8vIEJTRC9NYWMgRG9lc250IGhhdmUgSE9TVF9OQU1FX01BWCBkZWZpbmVkCisjZGVmaW5lIEhPU1RfTkFNRV9NQVggNjQKKyNlbGlmIGRlZmluZWQoQkVOQ0hNQVJLX09TX05BQ0wpCisjZGVmaW5lIEhPU1RfTkFNRV9NQVggNjQKKyNlbGlmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1FOWCkKKyNkZWZpbmUgSE9TVF9OQU1FX01BWCAxNTQKKyNlbGlmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1JURU1TKQorI2RlZmluZSBIT1NUX05BTUVfTUFYIDI1NgorI2Vsc2UKKyN3YXJuaW5nICJIT1NUX05BTUVfTUFYIG5vdCBkZWZpbmVkLiB1c2luZyA2NCIKKyNkZWZpbmUgSE9TVF9OQU1FX01BWCA2NAorI2VuZGlmCisjZW5kaWYgLy8gZGVmIEhPU1RfTkFNRV9NQVgKKyAgY2hhciBob3N0bmFtZVtIT1NUX05BTUVfTUFYXTsKKyAgaW50IHJldFZhbCA9IGdldGhvc3RuYW1lKGhvc3RuYW1lLCBIT1NUX05BTUVfTUFYKTsKKyAgaWYgKHJldFZhbCAhPSAwKSByZXR1cm4gc3RkOjpzdHJpbmcoIiIpOworICByZXR1cm4gc3RkOjpzdHJpbmcoaG9zdG5hbWUpOworI2VuZGlmIC8vIENhdGNoLWFsbCBQT1NJWCBibG9jay4KK30KKworaW50IEdldE51bUNQVXMoKSB7CisjaWZkZWYgQkVOQ0hNQVJLX0hBU19TWVNDVEwKKyAgaW50IE51bUNQVSA9IC0xOworICBpZiAoR2V0U3lzY3RsKCJody5uY3B1IiwgJk51bUNQVSkpIHJldHVybiBOdW1DUFU7CisgIGZwcmludGYoc3RkZXJyLCAiRXJyOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgc3RkOjpleGl0KEVYSVRfRkFJTFVSRSk7CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorICBTWVNURU1fSU5GTyBzeXNpbmZvOworICAvLyBVc2UgbWVtc2V0IGFzIG9wcG9zZWQgdG8gPSB7fSB0byBhdm9pZCBHQ0MgbWlzc2luZyBpbml0aWFsaXplciBmYWxzZQorICAvLyBwb3NpdGl2ZXMuCisgIHN0ZDo6bWVtc2V0KCZzeXNpbmZvLCAwLCBzaXplb2YoU1lTVEVNX0lORk8pKTsKKyAgR2V0U3lzdGVtSW5mbygmc3lzaW5mbyk7CisgIHJldHVybiBzeXNpbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOyAgLy8gbnVtYmVyIG9mIGxvZ2ljYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3JzIGluIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JvdXAKKyNlbGlmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1NPTEFSSVMpCisgIC8vIFJldHVybnMgLTEgaW4gY2FzZSBvZiBhIGZhaWx1cmUuCisgIGludCBOdW1DUFUgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyAgaWYgKE51bUNQVSA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKSBmYWlsZWQgd2l0aCBlcnJvcjogJXNcbiIsCisgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICB9CisgIHJldHVybiBOdW1DUFU7CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19RTlgpCisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KF9zeXNwYWdlX3B0ci0+bnVtX2NwdSk7CisjZWxzZQorICBpbnQgTnVtQ1BVcyA9IDA7CisgIGludCBNYXhJRCA9IC0xOworICBzdGQ6Omlmc3RyZWFtIGYoIi9wcm9jL2NwdWluZm8iKTsKKyAgaWYgKCFmLmlzX29wZW4oKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiZmFpbGVkIHRvIG9wZW4gL3Byb2MvY3B1aW5mb1xuIjsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgS2V5ID0gInByb2Nlc3NvciI7CisgIHN0ZDo6c3RyaW5nIGxuOworICB3aGlsZSAoc3RkOjpnZXRsaW5lKGYsIGxuKSkgeworICAgIGlmIChsbi5lbXB0eSgpKSBjb250aW51ZTsKKyAgICBzaXplX3QgU3BsaXRJZHggPSBsbi5maW5kKCc6Jyk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisjaWYgZGVmaW5lZChfX3MzOTBfXykKKyAgICAvLyBzMzkwIGhhcyBhbm90aGVyIGZvcm1hdCBpbiAvcHJvYy9jcHVpbmZvCisgICAgLy8gaXQgbmVlZHMgdG8gYmUgcGFyc2VkIGRpZmZlcmVudGx5CisgICAgaWYgKFNwbGl0SWR4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB2YWx1ZSA9IGxuLnN1YnN0cihLZXkuc2l6ZSgpKzEsU3BsaXRJZHgtS2V5LnNpemUoKS0xKTsKKyNlbHNlCisgICAgaWYgKFNwbGl0SWR4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB2YWx1ZSA9IGxuLnN1YnN0cihTcGxpdElkeCArIDEpOworI2VuZGlmCisgICAgaWYgKGxuLnNpemUoKSA+PSBLZXkuc2l6ZSgpICYmIGxuLmNvbXBhcmUoMCwgS2V5LnNpemUoKSwgS2V5KSA9PSAwKSB7CisgICAgICBOdW1DUFVzKys7CisgICAgICBpZiAoIXZhbHVlLmVtcHR5KCkpIHsKKyAgICAgICAgaW50IEN1cklEID0gYmVuY2htYXJrOjpzdG9pKHZhbHVlKTsKKyAgICAgICAgTWF4SUQgPSBzdGQ6Om1heChDdXJJRCwgTWF4SUQpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoZi5iYWQoKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiRmFpbHVyZSByZWFkaW5nIC9wcm9jL2NwdWluZm9cbiI7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghZi5lb2YoKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIHJlYWQgdG8gZW5kIG9mIC9wcm9jL2NwdWluZm9cbiI7CisgICAgcmV0dXJuIC0xOworICB9CisgIGYuY2xvc2UoKTsKKworICBpZiAoKE1heElEICsgMSkgIT0gTnVtQ1BVcykgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkNQVSBJRCBhc3NpZ25tZW50cyBpbiAvcHJvYy9jcHVpbmZvIHNlZW0gbWVzc2VkIHVwLiIKKyAgICAgICAgICAgICIgVGhpcyBpcyB1c3VhbGx5IGNhdXNlZCBieSBhIGJhZCBCSU9TLlxuIik7CisgIH0KKyAgcmV0dXJuIE51bUNQVXM7CisjZW5kaWYKKyAgQkVOQ0hNQVJLX1VOUkVBQ0hBQkxFKCk7Cit9CisKK2RvdWJsZSBHZXRDUFVDeWNsZXNQZXJTZWNvbmQoKSB7CisjaWYgZGVmaW5lZCBCRU5DSE1BUktfT1NfTElOVVggfHwgZGVmaW5lZCBCRU5DSE1BUktfT1NfQ1lHV0lOCisgIGxvbmcgZnJlcTsKKworICAvLyBJZiB0aGUga2VybmVsIGlzIGV4cG9ydGluZyB0aGUgdHNjIGZyZXF1ZW5jeSB1c2UgdGhhdC4gVGhlcmUgYXJlIGlzc3VlcworICAvLyB3aGVyZSBjcHVpbmZvX21heF9mcmVxIGNhbm5vdCBiZSByZWxpZWQgb24gYmVjYXVzZSB0aGUgQklPUyBtYXkgYmUKKyAgLy8gZXhwb3JpbnRnIGFuIGludmFsaWQgcC1zdGF0ZSAob24geDg2KSBvciBwLXN0YXRlcyBtYXkgYmUgdXNlZCB0byBwdXQgdGhlCisgIC8vIHByb2Nlc3NvciBpbiBhIG5ldyBtb2RlICh0dXJibyBtb2RlKS4gRXNzZW50aWFsbHksIHRob3NlIGZyZXF1ZW5jaWVzCisgIC8vIGNhbm5vdCBhbHdheXMgYmUgcmVsaWVkIHVwb24uIFRoZSBzYW1lIHJlYXNvbnMgYXBwbHkgdG8gL3Byb2MvY3B1aW5mbyBhcworICAvLyB3ZWxsLgorICBpZiAoUmVhZEZyb21GaWxlKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL3RzY19mcmVxX2toeiIsICZmcmVxKQorICAgICAgLy8gSWYgQ1BVIHNjYWxpbmcgaXMgaW4gZWZmZWN0LCB3ZSB3YW50IHRvIHVzZSB0aGUgKm1heGltdW0qIGZyZXF1ZW5jeSwKKyAgICAgIC8vIG5vdCB3aGF0ZXZlciBDUFUgc3BlZWQgc29tZSByYW5kb20gcHJvY2Vzc29yIGhhcHBlbnMgdG8gYmUgdXNpbmcgbm93LgorICAgICAgfHwgUmVhZEZyb21GaWxlKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL2NwdWZyZXEvY3B1aW5mb19tYXhfZnJlcSIsCisgICAgICAgICAgICAgICAgICAgICAgJmZyZXEpKSB7CisgICAgLy8gVGhlIHZhbHVlIGlzIGluIGtIeiAoYXMgdGhlIGZpbGUgbmFtZSBzdWdnZXN0cykuICBGb3IgZXhhbXBsZSwgb24gYQorICAgIC8vIDJHSHogd2FycHN0YXRpb24sIHRoZSBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSAiMjAwMDAwMCIuCisgICAgcmV0dXJuIGZyZXEgKiAxMDAwLjA7CisgIH0KKworICBjb25zdCBkb3VibGUgZXJyb3JfdmFsdWUgPSAtMTsKKyAgZG91YmxlIGJvZ29fY2xvY2sgPSBlcnJvcl92YWx1ZTsKKworICBzdGQ6Omlmc3RyZWFtIGYoIi9wcm9jL2NwdWluZm8iKTsKKyAgaWYgKCFmLmlzX29wZW4oKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiZmFpbGVkIHRvIG9wZW4gL3Byb2MvY3B1aW5mb1xuIjsKKyAgICByZXR1cm4gZXJyb3JfdmFsdWU7CisgIH0KKworICBhdXRvIHN0YXJ0c1dpdGhLZXkgPSBbXShzdGQ6OnN0cmluZyBjb25zdCYgVmFsdWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBLZXkpIHsKKyAgICBpZiAoS2V5LnNpemUoKSA+IFZhbHVlLnNpemUoKSkgcmV0dXJuIGZhbHNlOworICAgIGF1dG8gQ21wID0gWyZdKGNoYXIgWCwgY2hhciBZKSB7CisgICAgICByZXR1cm4gc3RkOjp0b2xvd2VyKFgpID09IHN0ZDo6dG9sb3dlcihZKTsKKyAgICB9OworICAgIHJldHVybiBzdGQ6OmVxdWFsKEtleS5iZWdpbigpLCBLZXkuZW5kKCksIFZhbHVlLmJlZ2luKCksIENtcCk7CisgIH07CisKKyAgc3RkOjpzdHJpbmcgbG47CisgIHdoaWxlIChzdGQ6OmdldGxpbmUoZiwgbG4pKSB7CisgICAgaWYgKGxuLmVtcHR5KCkpIGNvbnRpbnVlOworICAgIHNpemVfdCBTcGxpdElkeCA9IGxuLmZpbmQoJzonKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICBpZiAoU3BsaXRJZHggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHZhbHVlID0gbG4uc3Vic3RyKFNwbGl0SWR4ICsgMSk7CisgICAgLy8gV2hlbiBwYXJzaW5nIHRoZSAiY3B1IE1IeiIgYW5kICJib2dvbWlwcyIgKGZhbGxiYWNrKSBlbnRyaWVzLCB3ZSBvbmx5CisgICAgLy8gYWNjZXB0IHBvc2l0aXZlIHZhbHVlcy4gU29tZSBlbnZpcm9ubWVudHMgKHZpcnR1YWwgbWFjaGluZXMpIHJlcG9ydCB6ZXJvLAorICAgIC8vIHdoaWNoIHdvdWxkIGNhdXNlIGluZmluaXRlIGxvb3BpbmcgaW4gV2FsbFRpbWVfSW5pdC4KKyAgICBpZiAoc3RhcnRzV2l0aEtleShsbiwgImNwdSBNSHoiKSkgeworICAgICAgaWYgKCF2YWx1ZS5lbXB0eSgpKSB7CisgICAgICAgIGRvdWJsZSBjeWNsZXNfcGVyX3NlY29uZCA9IGJlbmNobWFyazo6c3RvZCh2YWx1ZSkgKiAxMDAwMDAwLjA7CisgICAgICAgIGlmIChjeWNsZXNfcGVyX3NlY29uZCA+IDApIHJldHVybiBjeWNsZXNfcGVyX3NlY29uZDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGhLZXkobG4sICJib2dvbWlwcyIpKSB7CisgICAgICBpZiAoIXZhbHVlLmVtcHR5KCkpIHsKKyAgICAgICAgYm9nb19jbG9jayA9IGJlbmNobWFyazo6c3RvZCh2YWx1ZSkgKiAxMDAwMDAwLjA7CisgICAgICAgIGlmIChib2dvX2Nsb2NrIDwgMC4wKSBib2dvX2Nsb2NrID0gZXJyb3JfdmFsdWU7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChmLmJhZCgpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJGYWlsdXJlIHJlYWRpbmcgL3Byb2MvY3B1aW5mb1xuIjsKKyAgICByZXR1cm4gZXJyb3JfdmFsdWU7CisgIH0KKyAgaWYgKCFmLmVvZigpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJGYWlsZWQgdG8gcmVhZCB0byBlbmQgb2YgL3Byb2MvY3B1aW5mb1xuIjsKKyAgICByZXR1cm4gZXJyb3JfdmFsdWU7CisgIH0KKyAgZi5jbG9zZSgpOworICAvLyBJZiB3ZSBmb3VuZCB0aGUgYm9nb21pcHMgY2xvY2ssIGJ1dCBub3RoaW5nIGJldHRlciwgd2UnbGwgdXNlIGl0IChidXQKKyAgLy8gd2UncmUgbm90IGhhcHB5IGFib3V0IGl0KTsgb3RoZXJ3aXNlLCBmYWxsYmFjayB0byB0aGUgcm91Z2ggZXN0aW1hdGlvbgorICAvLyBiZWxvdy4KKyAgaWYgKGJvZ29fY2xvY2sgPj0gMC4wKSByZXR1cm4gYm9nb19jbG9jazsKKworI2VsaWYgZGVmaW5lZCBCRU5DSE1BUktfSEFTX1NZU0NUTAorICBjb25zdGV4cHIgYXV0byogRnJlcVN0ciA9CisjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfRlJFRUJTRCkgfHwgZGVmaW5lZChCRU5DSE1BUktfT1NfTkVUQlNEKQorICAgICAgIm1hY2hkZXAudHNjX2ZyZXEiOworI2VsaWYgZGVmaW5lZCBCRU5DSE1BUktfT1NfT1BFTkJTRAorICAgICAgImh3LmNwdXNwZWVkIjsKKyNlbHNlCisgICAgICAiaHcuY3B1ZnJlcXVlbmN5IjsKKyNlbmRpZgorICB1bnNpZ25lZCBsb25nIGxvbmcgaHogPSAwOworI2lmIGRlZmluZWQgQkVOQ0hNQVJLX09TX09QRU5CU0QKKyAgaWYgKEdldFN5c2N0bChGcmVxU3RyLCAmaHopKSByZXR1cm4gaHogKiAxMDAwMDAwOworI2Vsc2UKKyAgaWYgKEdldFN5c2N0bChGcmVxU3RyLCAmaHopKSByZXR1cm4gaHo7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZGV0ZXJtaW5lIGNsb2NrIHJhdGUgZnJvbSBzeXNjdGw6ICVzOiAlc1xuIiwKKyAgICAgICAgICBGcmVxU3RyLCBzdHJlcnJvcihlcnJubykpOworCisjZWxpZiBkZWZpbmVkIEJFTkNITUFSS19PU19XSU5ET1dTCisgIC8vIEluIE5ULCByZWFkIE1IeiBmcm9tIHRoZSByZWdpc3RyeS4gSWYgd2UgZmFpbCB0byBkbyBzbyBvciB3ZSdyZSBpbiB3aW45eAorICAvLyB0aGVuIG1ha2UgYSBjcnVkZSBlc3RpbWF0ZS4KKyAgRFdPUkQgZGF0YSwgZGF0YV9zaXplID0gc2l6ZW9mKGRhdGEpOworICBpZiAoSXNXaW5kb3dzWFBPckdyZWF0ZXIoKSAmJgorICAgICAgU1VDQ0VFREVEKAorICAgICAgICAgIFNIR2V0VmFsdWVBKEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAiSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTeXN0ZW1cXENlbnRyYWxQcm9jZXNzb3JcXDAiLAorICAgICAgICAgICAgICAgICAgICAgICJ+TUh6IiwgbnVsbHB0ciwgJmRhdGEsICZkYXRhX3NpemUpKSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPigoaW50NjRfdClkYXRhICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkoMTAwMCAqIDEwMDApKTsgIC8vIHdhcyBtaHoKKyNlbGlmIGRlZmluZWQgKEJFTkNITUFSS19PU19TT0xBUklTKQorICBrc3RhdF9jdGxfdCAqa2MgPSBrc3RhdF9vcGVuKCk7CisgIGlmICgha2MpIHsKKyAgICBzdGQ6OmNlcnIgPDwgImZhaWxlZCB0byBvcGVuIC9kZXYva3N0YXRcbiI7CisgICAgcmV0dXJuIC0xOworICB9CisgIGtzdGF0X3QgKmtzcCA9IGtzdGF0X2xvb2t1cChrYywgKGNoYXIqKSJjcHVfaW5mbyIsIC0xLCAoY2hhciopImNwdV9pbmZvMCIpOworICBpZiAoIWtzcCkgeworICAgIHN0ZDo6Y2VyciA8PCAiZmFpbGVkIHRvIGxvb2t1cCBpbiAvZGV2L2tzdGF0XG4iOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoa3N0YXRfcmVhZChrYywga3NwLCBOVUxMKSA8IDApIHsKKyAgICBzdGQ6OmNlcnIgPDwgImZhaWxlZCB0byByZWFkIGZyb20gL2Rldi9rc3RhdFxuIjsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAga3N0YXRfbmFtZWRfdCAqa25wID0KKyAgICAgIChrc3RhdF9uYW1lZF90Kilrc3RhdF9kYXRhX2xvb2t1cChrc3AsIChjaGFyKikiY3VycmVudF9jbG9ja19IeiIpOworICBpZiAoIWtucCkgeworICAgIHN0ZDo6Y2VyciA8PCAiZmFpbGVkIHRvIGxvb2t1cCBkYXRhIGluIC9kZXYva3N0YXRcbiI7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChrbnAtPmRhdGFfdHlwZSAhPSBLU1RBVF9EQVRBX1VJTlQ2NCkgeworICAgIHN0ZDo6Y2VyciA8PCAiY3VycmVudF9jbG9ja19IeiBpcyBvZiB1bmV4cGVjdGVkIGRhdGEgdHlwZTogIgorICAgICAgICAgICAgICA8PCBrbnAtPmRhdGFfdHlwZSA8PCAiXG4iOworICAgIHJldHVybiAtMTsKKyAgfQorICBkb3VibGUgY2xvY2tfaHogPSBrbnAtPnZhbHVlLnVpNjQ7CisgIGtzdGF0X2Nsb3NlKGtjKTsKKyAgcmV0dXJuIGNsb2NrX2h6OworI2VsaWYgZGVmaW5lZCAoQkVOQ0hNQVJLX09TX1FOWCkKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oKGludDY0X3QpKFNZU1BBR0VfRU5UUlkoY3B1aW5mbyktPnNwZWVkKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSgxMDAwICogMTAwMCkpOworI2VuZGlmCisgIC8vIElmIHdlJ3ZlIGZhbGxlbiB0aHJvdWdoLCBhdHRlbXB0IHRvIHJvdWdobHkgZXN0aW1hdGUgdGhlIENQVSBjbG9jayByYXRlLgorICBjb25zdCBpbnQgZXN0aW1hdGVfdGltZV9tcyA9IDEwMDA7CisgIGNvbnN0IGF1dG8gc3RhcnRfdGlja3MgPSBjeWNsZWNsb2NrOjpOb3coKTsKKyAgU2xlZXBGb3JNaWxsaXNlY29uZHMoZXN0aW1hdGVfdGltZV9tcyk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGN5Y2xlY2xvY2s6Ok5vdygpIC0gc3RhcnRfdGlja3MpOworfQorCitzdGQ6OnZlY3Rvcjxkb3VibGU+IEdldExvYWRBdmcoKSB7CisjaWYgKGRlZmluZWQgQkVOQ0hNQVJLX09TX0ZSRUVCU0QgfHwgZGVmaW5lZChCRU5DSE1BUktfT1NfTElOVVgpIHx8IFwKKyAgICBkZWZpbmVkIEJFTkNITUFSS19PU19NQUNPU1ggfHwgZGVmaW5lZCBCRU5DSE1BUktfT1NfTkVUQlNEIHx8ICBcCisgICAgZGVmaW5lZCBCRU5DSE1BUktfT1NfT1BFTkJTRCkgJiYgIWRlZmluZWQoX19BTkRST0lEX18pCisgIGNvbnN0ZXhwciBpbnQga01heFNhbXBsZXMgPSAzOworICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHJlcyhrTWF4U2FtcGxlcywgMC4wKTsKKyAgY29uc3QgaW50IG5lbGVtID0gZ2V0bG9hZGF2ZyhyZXMuZGF0YSgpLCBrTWF4U2FtcGxlcyk7CisgIGlmIChuZWxlbSA8IDEpIHsKKyAgICByZXMuY2xlYXIoKTsKKyAgfSBlbHNlIHsKKyAgICByZXMucmVzaXplKG5lbGVtKTsKKyAgfQorICByZXR1cm4gcmVzOworI2Vsc2UKKyAgcmV0dXJuIHt9OworI2VuZGlmCit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKworY29uc3QgQ1BVSW5mbyYgQ1BVSW5mbzo6R2V0KCkgeworICBzdGF0aWMgY29uc3QgQ1BVSW5mbyogaW5mbyA9IG5ldyBDUFVJbmZvKCk7CisgIHJldHVybiAqaW5mbzsKK30KKworQ1BVSW5mbzo6Q1BVSW5mbygpCisgICAgOiBudW1fY3B1cyhHZXROdW1DUFVzKCkpLAorICAgICAgY3ljbGVzX3Blcl9zZWNvbmQoR2V0Q1BVQ3ljbGVzUGVyU2Vjb25kKCkpLAorICAgICAgY2FjaGVzKEdldENhY2hlU2l6ZXMoKSksCisgICAgICBzY2FsaW5nX2VuYWJsZWQoQ3B1U2NhbGluZ0VuYWJsZWQobnVtX2NwdXMpKSwKKyAgICAgIGxvYWRfYXZnKEdldExvYWRBdmcoKSkge30KKworCitjb25zdCBTeXN0ZW1JbmZvJiBTeXN0ZW1JbmZvOjpHZXQoKSB7CisgIHN0YXRpYyBjb25zdCBTeXN0ZW1JbmZvKiBpbmZvID0gbmV3IFN5c3RlbUluZm8oKTsKKyAgcmV0dXJuICppbmZvOworfQorCitTeXN0ZW1JbmZvOjpTeXN0ZW1JbmZvKCkgOiBuYW1lKEdldFN5c3RlbU5hbWUoKSkge30KK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvdGhyZWFkX21hbmFnZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy90aHJlYWRfbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZTJkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvdGhyZWFkX21hbmFnZXIuaApAQCAtMCwwICsxLDY0IEBACisjaWZuZGVmIEJFTkNITUFSS19USFJFQURfTUFOQUdFUl9ICisjZGVmaW5lIEJFTkNITUFSS19USFJFQURfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAibXV0ZXguaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBUaHJlYWRNYW5hZ2VyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFRocmVhZE1hbmFnZXIoaW50IG51bV90aHJlYWRzKQorICAgICAgOiBhbGl2ZV90aHJlYWRzXyhudW1fdGhyZWFkcyksIHN0YXJ0X3N0b3BfYmFycmllcl8obnVtX3RocmVhZHMpIHt9CisKKyAgTXV0ZXgmIEdldEJlbmNobWFya011dGV4KCkgY29uc3QgUkVUVVJOX0NBUEFCSUxJVFkoYmVuY2htYXJrX211dGV4XykgeworICAgIHJldHVybiBiZW5jaG1hcmtfbXV0ZXhfOworICB9CisKKyAgYm9vbCBTdGFydFN0b3BCYXJyaWVyKCkgRVhDTFVERVMoZW5kX2NvbmRfbXV0ZXhfKSB7CisgICAgcmV0dXJuIHN0YXJ0X3N0b3BfYmFycmllcl8ud2FpdCgpOworICB9CisKKyAgdm9pZCBOb3RpZnlUaHJlYWRDb21wbGV0ZSgpIEVYQ0xVREVTKGVuZF9jb25kX211dGV4XykgeworICAgIHN0YXJ0X3N0b3BfYmFycmllcl8ucmVtb3ZlVGhyZWFkKCk7CisgICAgaWYgKC0tYWxpdmVfdGhyZWFkc18gPT0gMCkgeworICAgICAgTXV0ZXhMb2NrIGxvY2soZW5kX2NvbmRfbXV0ZXhfKTsKKyAgICAgIGVuZF9jb25kaXRpb25fLm5vdGlmeV9hbGwoKTsKKyAgICB9CisgIH0KKworICB2b2lkIFdhaXRGb3JBbGxUaHJlYWRzKCkgRVhDTFVERVMoZW5kX2NvbmRfbXV0ZXhfKSB7CisgICAgTXV0ZXhMb2NrIGxvY2soZW5kX2NvbmRfbXV0ZXhfKTsKKyAgICBlbmRfY29uZGl0aW9uXy53YWl0KGxvY2submF0aXZlX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdKCkgeyByZXR1cm4gYWxpdmVfdGhyZWFkc18gPT0gMDsgfSk7CisgIH0KKworIHB1YmxpYzoKKyAgc3RydWN0IFJlc3VsdCB7CisgICAgSXRlcmF0aW9uQ291bnQgaXRlcmF0aW9ucyA9IDA7CisgICAgZG91YmxlIHJlYWxfdGltZV91c2VkID0gMDsKKyAgICBkb3VibGUgY3B1X3RpbWVfdXNlZCA9IDA7CisgICAgZG91YmxlIG1hbnVhbF90aW1lX3VzZWQgPSAwOworICAgIGludDY0X3QgY29tcGxleGl0eV9uID0gMDsKKyAgICBzdGQ6OnN0cmluZyByZXBvcnRfbGFiZWxfOworICAgIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2VfOworICAgIGJvb2wgaGFzX2Vycm9yXyA9IGZhbHNlOworICAgIFVzZXJDb3VudGVycyBjb3VudGVyczsKKyAgfTsKKyAgR1VBUkRFRF9CWShHZXRCZW5jaG1hcmtNdXRleCgpKSBSZXN1bHQgcmVzdWx0czsKKworIHByaXZhdGU6CisgIG11dGFibGUgTXV0ZXggYmVuY2htYXJrX211dGV4XzsKKyAgc3RkOjphdG9taWM8aW50PiBhbGl2ZV90aHJlYWRzXzsKKyAgQmFycmllciBzdGFydF9zdG9wX2JhcnJpZXJfOworICBNdXRleCBlbmRfY29uZF9tdXRleF87CisgIENvbmRpdGlvbiBlbmRfY29uZGl0aW9uXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19USFJFQURfTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvdGhyZWFkX3RpbWVyLmggYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvdGhyZWFkX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwM2NhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy90aHJlYWRfdGltZXIuaApAQCAtMCwwICsxLDg2IEBACisjaWZuZGVmIEJFTkNITUFSS19USFJFQURfVElNRVJfSAorI2RlZmluZSBCRU5DSE1BUktfVEhSRUFEX1RJTUVSX0gKKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgVGhyZWFkVGltZXIgeworICBleHBsaWNpdCBUaHJlYWRUaW1lcihib29sIG1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZV8pCisgICAgICA6IG1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZShtZWFzdXJlX3Byb2Nlc3NfY3B1X3RpbWVfKSB7fQorCisgcHVibGljOgorICBzdGF0aWMgVGhyZWFkVGltZXIgQ3JlYXRlKCkgeworICAgIHJldHVybiBUaHJlYWRUaW1lcigvKm1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZV89Ki9mYWxzZSk7CisgIH0KKyAgc3RhdGljIFRocmVhZFRpbWVyIENyZWF0ZVByb2Nlc3NDcHVUaW1lKCkgeworICAgIHJldHVybiBUaHJlYWRUaW1lcigvKm1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZV89Ki90cnVlKTsKKyAgfQorCisgIC8vIENhbGxlZCBieSBlYWNoIHRocmVhZAorICB2b2lkIFN0YXJ0VGltZXIoKSB7CisgICAgcnVubmluZ18gPSB0cnVlOworICAgIHN0YXJ0X3JlYWxfdGltZV8gPSBDaHJvbm9DbG9ja05vdygpOworICAgIHN0YXJ0X2NwdV90aW1lXyA9IFJlYWRDcHVUaW1lck9mQ2hvaWNlKCk7CisgIH0KKworICAvLyBDYWxsZWQgYnkgZWFjaCB0aHJlYWQKKyAgdm9pZCBTdG9wVGltZXIoKSB7CisgICAgQ0hFQ0socnVubmluZ18pOworICAgIHJ1bm5pbmdfID0gZmFsc2U7CisgICAgcmVhbF90aW1lX3VzZWRfICs9IENocm9ub0Nsb2NrTm93KCkgLSBzdGFydF9yZWFsX3RpbWVfOworICAgIC8vIEZsb2F0aW5nIHBvaW50IGVycm9yIGNhbiByZXN1bHQgaW4gdGhlIHN1YnRyYWN0aW9uIHByb2R1Y2luZyBhIG5lZ2F0aXZlCisgICAgLy8gdGltZS4gR3VhcmQgYWdhaW5zdCB0aGF0LgorICAgIGNwdV90aW1lX3VzZWRfICs9CisgICAgICAgIHN0ZDo6bWF4PGRvdWJsZT4oUmVhZENwdVRpbWVyT2ZDaG9pY2UoKSAtIHN0YXJ0X2NwdV90aW1lXywgMCk7CisgIH0KKworICAvLyBDYWxsZWQgYnkgZWFjaCB0aHJlYWQKKyAgdm9pZCBTZXRJdGVyYXRpb25UaW1lKGRvdWJsZSBzZWNvbmRzKSB7IG1hbnVhbF90aW1lX3VzZWRfICs9IHNlY29uZHM7IH0KKworICBib29sIHJ1bm5pbmcoKSBjb25zdCB7IHJldHVybiBydW5uaW5nXzsgfQorCisgIC8vIFJFUVVJUkVTOiB0aW1lciBpcyBub3QgcnVubmluZworICBkb3VibGUgcmVhbF90aW1lX3VzZWQoKSBjb25zdCB7CisgICAgQ0hFQ0soIXJ1bm5pbmdfKTsKKyAgICByZXR1cm4gcmVhbF90aW1lX3VzZWRfOworICB9CisKKyAgLy8gUkVRVUlSRVM6IHRpbWVyIGlzIG5vdCBydW5uaW5nCisgIGRvdWJsZSBjcHVfdGltZV91c2VkKCkgY29uc3QgeworICAgIENIRUNLKCFydW5uaW5nXyk7CisgICAgcmV0dXJuIGNwdV90aW1lX3VzZWRfOworICB9CisKKyAgLy8gUkVRVUlSRVM6IHRpbWVyIGlzIG5vdCBydW5uaW5nCisgIGRvdWJsZSBtYW51YWxfdGltZV91c2VkKCkgY29uc3QgeworICAgIENIRUNLKCFydW5uaW5nXyk7CisgICAgcmV0dXJuIG1hbnVhbF90aW1lX3VzZWRfOworICB9CisKKyBwcml2YXRlOgorICBkb3VibGUgUmVhZENwdVRpbWVyT2ZDaG9pY2UoKSBjb25zdCB7CisgICAgaWYgKG1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZSkgcmV0dXJuIFByb2Nlc3NDUFVVc2FnZSgpOworICAgIHJldHVybiBUaHJlYWRDUFVVc2FnZSgpOworICB9CisKKyAgLy8gc2hvdWxkIHRoZSB0aHJlYWQsIG9yIHRoZSBwcm9jZXNzLCB0aW1lIGJlIG1lYXN1cmVkPworICBjb25zdCBib29sIG1lYXN1cmVfcHJvY2Vzc19jcHVfdGltZTsKKworICBib29sIHJ1bm5pbmdfID0gZmFsc2U7ICAgICAgICAvLyBJcyB0aGUgdGltZXIgcnVubmluZworICBkb3VibGUgc3RhcnRfcmVhbF90aW1lXyA9IDA7ICAvLyBJZiBydW5uaW5nXworICBkb3VibGUgc3RhcnRfY3B1X3RpbWVfID0gMDsgICAvLyBJZiBydW5uaW5nXworCisgIC8vIEFjY3VtdWxhdGVkIHRpbWUgc28gZmFyIChkb2VzIG5vdCBjb250YWluIGN1cnJlbnQgc2xpY2UgaWYgcnVubmluZ18pCisgIGRvdWJsZSByZWFsX3RpbWVfdXNlZF8gPSAwOworICBkb3VibGUgY3B1X3RpbWVfdXNlZF8gPSAwOworICAvLyBNYW51YWxseSBzZXQgaXRlcmF0aW9uIHRpbWUuIFVzZXIgc2V0cyB0aGlzIHdpdGggU2V0SXRlcmF0aW9uVGltZShzZWNvbmRzKS4KKyAgZG91YmxlIG1hbnVhbF90aW1lX3VzZWRfID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19USFJFQURfVElNRVJfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3RpbWVycy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy90aW1lcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxM2ZmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3NyYy90aW1lcnMuY2MKQEAgLTAsMCArMSwyMTcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJ0aW1lcnMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisjaW5jbHVkZSA8c2hsd2FwaS5oPgorI3VuZGVmIFN0ckNhdCAgLy8gRG9uJ3QgbGV0IFN0ckNhdCBpbiBzdHJpbmdfdXRpbC5oIGJlIHJlbmFtZWQgdG8gbHN0cmNhdEEKKyNpbmNsdWRlIDx2ZXJzaW9uaGVscGVycy5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZm5kZWYgQkVOQ0hNQVJLX09TX0ZVQ0hTSUEKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyB0aGlzIGhlYWRlciBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSAnc3lzL3N5c2N0bC5oJyB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvciBvbiBGcmVlQlNECisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWYgZGVmaW5lZCBCRU5DSE1BUktfT1NfRlJFRUJTRCB8fCBkZWZpbmVkIEJFTkNITUFSS19PU19NQUNPU1gKKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19NQUNPU1gpCisjaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KKyNpbmNsdWRlIDxtYWNoL21hY2hfcG9ydC5oPgorI2luY2x1ZGUgPG1hY2gvdGhyZWFkX2FjdC5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEJFTkNITUFSS19PU19FTVNDUklQVEVOCisjaW5jbHVkZSA8ZW1zY3JpcHRlbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2xlZXAuaCIKKyNpbmNsdWRlICJzdHJpbmdfdXRpbC5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworLy8gU3VwcHJlc3MgdW51c2VkIHdhcm5pbmdzIG9uIGhlbHBlciBmdW5jdGlvbnMuCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCisjZW5kaWYKKworbmFtZXNwYWNlIHsKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorZG91YmxlIE1ha2VUaW1lKEZJTEVUSU1FIGNvbnN0JiBrZXJuZWxfdGltZSwgRklMRVRJTUUgY29uc3QmIHVzZXJfdGltZSkgeworICBVTEFSR0VfSU5URUdFUiBrZXJuZWw7CisgIFVMQVJHRV9JTlRFR0VSIHVzZXI7CisgIGtlcm5lbC5IaWdoUGFydCA9IGtlcm5lbF90aW1lLmR3SGlnaERhdGVUaW1lOworICBrZXJuZWwuTG93UGFydCA9IGtlcm5lbF90aW1lLmR3TG93RGF0ZVRpbWU7CisgIHVzZXIuSGlnaFBhcnQgPSB1c2VyX3RpbWUuZHdIaWdoRGF0ZVRpbWU7CisgIHVzZXIuTG93UGFydCA9IHVzZXJfdGltZS5kd0xvd0RhdGVUaW1lOworICByZXR1cm4gKHN0YXRpY19jYXN0PGRvdWJsZT4oa2VybmVsLlF1YWRQYXJ0KSArCisgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPih1c2VyLlF1YWRQYXJ0KSkgKgorICAgICAgICAgMWUtNzsKK30KKyNlbGlmICFkZWZpbmVkKEJFTkNITUFSS19PU19GVUNIU0lBKQorZG91YmxlIE1ha2VUaW1lKHN0cnVjdCBydXNhZ2UgY29uc3QmIHJ1KSB7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8ZG91YmxlPihydS5ydV91dGltZS50dl9zZWMpICsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KHJ1LnJ1X3V0aW1lLnR2X3VzZWMpICogMWUtNiArCisgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihydS5ydV9zdGltZS50dl9zZWMpICsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KHJ1LnJ1X3N0aW1lLnR2X3VzZWMpICogMWUtNik7Cit9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19NQUNPU1gpCitkb3VibGUgTWFrZVRpbWUodGhyZWFkX2Jhc2ljX2luZm9fZGF0YV90IGNvbnN0JiBpbmZvKSB7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8ZG91YmxlPihpbmZvLnVzZXJfdGltZS5zZWNvbmRzKSArCisgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihpbmZvLnVzZXJfdGltZS5taWNyb3NlY29uZHMpICogMWUtNiArCisgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihpbmZvLnN5c3RlbV90aW1lLnNlY29uZHMpICsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGluZm8uc3lzdGVtX3RpbWUubWljcm9zZWNvbmRzKSAqIDFlLTYpOworfQorI2VuZGlmCisjaWYgZGVmaW5lZChDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQpIHx8IGRlZmluZWQoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCitkb3VibGUgTWFrZVRpbWUoc3RydWN0IHRpbWVzcGVjIGNvbnN0JiB0cykgeworICByZXR1cm4gdHMudHZfc2VjICsgKHN0YXRpY19jYXN0PGRvdWJsZT4odHMudHZfbnNlYykgKiAxZS05KTsKK30KKyNlbmRpZgorCitCRU5DSE1BUktfTk9SRVRVUk4gc3RhdGljIHZvaWQgRGlhZ25vc2VBbmRFeGl0KGNvbnN0IGNoYXIqIG1zZykgeworICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiAiIDw8IG1zZyA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6ZXhpdChFWElUX0ZBSUxVUkUpOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlCisKK2RvdWJsZSBQcm9jZXNzQ1BVVXNhZ2UoKSB7CisjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfV0lORE9XUykKKyAgSEFORExFIHByb2MgPSBHZXRDdXJyZW50UHJvY2VzcygpOworICBGSUxFVElNRSBjcmVhdGlvbl90aW1lOworICBGSUxFVElNRSBleGl0X3RpbWU7CisgIEZJTEVUSU1FIGtlcm5lbF90aW1lOworICBGSUxFVElNRSB1c2VyX3RpbWU7CisgIGlmIChHZXRQcm9jZXNzVGltZXMocHJvYywgJmNyZWF0aW9uX3RpbWUsICZleGl0X3RpbWUsICZrZXJuZWxfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAmdXNlcl90aW1lKSkKKyAgICByZXR1cm4gTWFrZVRpbWUoa2VybmVsX3RpbWUsIHVzZXJfdGltZSk7CisgIERpYWdub3NlQW5kRXhpdCgiR2V0UHJvY2Nlc3NUaW1lcygpIGZhaWxlZCIpOworI2VsaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfRU1TQ1JJUFRFTikKKyAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsIC4uLikgcmV0dXJucyAwIG9uIEVtc2NyaXB0ZW4uCisgIC8vIFVzZSBFbXNjcmlwdGVuLXNwZWNpZmljIEFQSS4gUmVwb3J0ZWQgQ1BVIHRpbWUgd291bGQgYmUgZXhhY3RseSB0aGUKKyAgLy8gc2FtZSBhcyB0b3RhbCB0aW1lLCBidXQgdGhpcyBpcyBvayBiZWNhdXNlIHRoZXJlIGFyZW4ndCBsb25nLWxhdGVuY3kKKyAgLy8gc3luY3Jvbm91cyBzeXN0ZW0gY2FsbHMgaW4gRW1zY3JpcHRlbi4KKyAgcmV0dXJuIGVtc2NyaXB0ZW5fZ2V0X25vdygpICogMWUtMzsKKyNlbGlmIGRlZmluZWQoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEKSAmJiAhZGVmaW5lZChCRU5DSE1BUktfT1NfTUFDT1NYKQorICAvLyBGSVhNRSBXZSB3YW50IHRvIHVzZSBjbG9ja19nZXR0aW1lLCBidXQgaXRzIG5vdCBhdmFpbGFibGUgaW4gTWFjT1MgMTAuMTEuIFNlZQorICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2JlbmNobWFyay9wdWxsLzI5MgorICBzdHJ1Y3QgdGltZXNwZWMgc3BlYzsKKyAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmc3BlYykgPT0gMCkKKyAgICByZXR1cm4gTWFrZVRpbWUoc3BlYyk7CisgIERpYWdub3NlQW5kRXhpdCgiY2xvY2tfZ2V0dGltZShDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsIC4uLikgZmFpbGVkIik7CisjZWxzZQorICBzdHJ1Y3QgcnVzYWdlIHJ1OworICBpZiAoZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUpID09IDApIHJldHVybiBNYWtlVGltZShydSk7CisgIERpYWdub3NlQW5kRXhpdCgiZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAuLi4pIGZhaWxlZCIpOworI2VuZGlmCit9CisKK2RvdWJsZSBUaHJlYWRDUFVVc2FnZSgpIHsKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorICBIQU5ETEUgdGhpc190aHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkKCk7CisgIEZJTEVUSU1FIGNyZWF0aW9uX3RpbWU7CisgIEZJTEVUSU1FIGV4aXRfdGltZTsKKyAgRklMRVRJTUUga2VybmVsX3RpbWU7CisgIEZJTEVUSU1FIHVzZXJfdGltZTsKKyAgR2V0VGhyZWFkVGltZXModGhpc190aHJlYWQsICZjcmVhdGlvbl90aW1lLCAmZXhpdF90aW1lLCAma2VybmVsX3RpbWUsCisgICAgICAgICAgICAgICAgICZ1c2VyX3RpbWUpOworICByZXR1cm4gTWFrZVRpbWUoa2VybmVsX3RpbWUsIHVzZXJfdGltZSk7CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19NQUNPU1gpCisgIC8vIEZJWE1FIFdlIHdhbnQgdG8gdXNlIGNsb2NrX2dldHRpbWUsIGJ1dCBpdHMgbm90IGF2YWlsYWJsZSBpbiBNYWNPUyAxMC4xMS4gU2VlCisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYmVuY2htYXJrL3B1bGwvMjkyCisgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgY291bnQgPSBUSFJFQURfQkFTSUNfSU5GT19DT1VOVDsKKyAgdGhyZWFkX2Jhc2ljX2luZm9fZGF0YV90IGluZm87CisgIG1hY2hfcG9ydF90IHRocmVhZCA9IHB0aHJlYWRfbWFjaF90aHJlYWRfbnAocHRocmVhZF9zZWxmKCkpOworICBpZiAodGhyZWFkX2luZm8odGhyZWFkLCBUSFJFQURfQkFTSUNfSU5GTywgKHRocmVhZF9pbmZvX3QpJmluZm8sICZjb3VudCkgPT0KKyAgICAgIEtFUk5fU1VDQ0VTUykgeworICAgIHJldHVybiBNYWtlVGltZShpbmZvKTsKKyAgfQorICBEaWFnbm9zZUFuZEV4aXQoIlRocmVhZENQVVVzYWdlKCkgZmFpbGVkIHdoZW4gZXZhbHVhdGluZyB0aHJlYWRfaW5mbyIpOworI2VsaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfRU1TQ1JJUFRFTikKKyAgLy8gRW1zY3JpcHRlbiBkb2Vzbid0IHN1cHBvcnQgdHJhZGl0aW9uYWwgdGhyZWFkcworICByZXR1cm4gUHJvY2Vzc0NQVVVzYWdlKCk7CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19SVEVNUykKKyAgLy8gUlRFTVMgZG9lc24ndCBzdXBwb3J0IENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELiBTZWUKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1JURU1TL3J0ZW1zL2Jsb2IvbWFzdGVyL2NwdWtpdC9wb3NpeC9zcmMvY2xvY2tnZXR0aW1lLmMKKyAgcmV0dXJuIFByb2Nlc3NDUFVVc2FnZSgpOworI2VsaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfU09MQVJJUykKKyAgc3RydWN0IHJ1c2FnZSBydTsKKyAgaWYgKGdldHJ1c2FnZShSVVNBR0VfTFdQLCAmcnUpID09IDApIHJldHVybiBNYWtlVGltZShydSk7CisgIERpYWdub3NlQW5kRXhpdCgiZ2V0cnVzYWdlKFJVU0FHRV9MV1AsIC4uLikgZmFpbGVkIik7CisjZWxpZiBkZWZpbmVkKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQorICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELCAmdHMpID09IDApIHJldHVybiBNYWtlVGltZSh0cyk7CisgIERpYWdub3NlQW5kRXhpdCgiY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgLi4uKSBmYWlsZWQiKTsKKyNlbHNlCisjZXJyb3IgUGVyLXRocmVhZCB0aW1pbmcgaXMgbm90IGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbS4KKyNlbmRpZgorfQorCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBEYXRlVGltZVN0cmluZyhib29sIGxvY2FsKSB7CisgIHR5cGVkZWYgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jayBDbG9jazsKKyAgc3RkOjp0aW1lX3Qgbm93ID0gQ2xvY2s6OnRvX3RpbWVfdChDbG9jazo6bm93KCkpOworICBjb25zdCBzdGQ6OnNpemVfdCBrU3RvcmFnZVNpemUgPSAxMjg7CisgIGNoYXIgc3RvcmFnZVtrU3RvcmFnZVNpemVdOworICBzdGQ6OnNpemVfdCB3cml0dGVuOworCisgIGlmIChsb2NhbCkgeworI2lmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1dJTkRPV1MpCisgICAgd3JpdHRlbiA9CisgICAgICAgIHN0ZDo6c3RyZnRpbWUoc3RvcmFnZSwgc2l6ZW9mKHN0b3JhZ2UpLCAiJXggJVgiLCA6OmxvY2FsdGltZSgmbm93KSk7CisjZWxzZQorICAgIHN0ZDo6dG0gdGltZWluZm87CisgICAgOjpsb2NhbHRpbWVfcigmbm93LCAmdGltZWluZm8pOworICAgIHdyaXR0ZW4gPSBzdGQ6OnN0cmZ0aW1lKHN0b3JhZ2UsIHNpemVvZihzdG9yYWdlKSwgIiVGICVUIiwgJnRpbWVpbmZvKTsKKyNlbmRpZgorICB9IGVsc2UgeworI2lmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1dJTkRPV1MpCisgICAgd3JpdHRlbiA9IHN0ZDo6c3RyZnRpbWUoc3RvcmFnZSwgc2l6ZW9mKHN0b3JhZ2UpLCAiJXggJVgiLCA6OmdtdGltZSgmbm93KSk7CisjZWxzZQorICAgIHN0ZDo6dG0gdGltZWluZm87CisgICAgOjpnbXRpbWVfcigmbm93LCAmdGltZWluZm8pOworICAgIHdyaXR0ZW4gPSBzdGQ6OnN0cmZ0aW1lKHN0b3JhZ2UsIHNpemVvZihzdG9yYWdlKSwgIiVGICVUIiwgJnRpbWVpbmZvKTsKKyNlbmRpZgorICB9CisgIENIRUNLKHdyaXR0ZW4gPCBrU3RvcmFnZVNpemUpOworICAoKHZvaWQpd3JpdHRlbik7ICAvLyBwcmV2ZW50IHVudXNlZCB2YXJpYWJsZSBpbiBvcHRpbWl6ZWQgbW9kZS4KKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKHN0b3JhZ2UpOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlCisKK3N0ZDo6c3RyaW5nIExvY2FsRGF0ZVRpbWVTdHJpbmcoKSB7IHJldHVybiBEYXRlVGltZVN0cmluZyh0cnVlKTsgfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3RpbWVycy5oIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvc3JjL3RpbWVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjA2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay9zcmMvdGltZXJzLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBCRU5DSE1BUktfVElNRVJTX0gKKyNkZWZpbmUgQkVOQ0hNQVJLX1RJTUVSU19ICisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworLy8gUmV0dXJuIHRoZSBDUFUgdXNhZ2Ugb2YgdGhlIGN1cnJlbnQgcHJvY2VzcworZG91YmxlIFByb2Nlc3NDUFVVc2FnZSgpOworCisvLyBSZXR1cm4gdGhlIENQVSB1c2FnZSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgcHJvY2VzcworZG91YmxlIENoaWxkcmVuQ1BVVXNhZ2UoKTsKKworLy8gUmV0dXJuIHRoZSBDUFUgdXNhZ2Ugb2YgdGhlIGN1cnJlbnQgdGhyZWFkCitkb3VibGUgVGhyZWFkQ1BVVXNhZ2UoKTsKKworI2lmIGRlZmluZWQoSEFWRV9TVEVBRFlfQ0xPQ0spCit0ZW1wbGF0ZSA8Ym9vbCBIaWdoUmVzSXNTdGVhZHkgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjppc19zdGVhZHk+CitzdHJ1Y3QgQ2hvb3NlU3RlYWR5Q2xvY2sgeworICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2sgdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ2hvb3NlU3RlYWR5Q2xvY2s8ZmFsc2U+IHsKKyAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrIHR5cGU7Cit9OworI2VuZGlmCisKK3N0cnVjdCBDaG9vc2VDbG9ja1R5cGUgeworI2lmIGRlZmluZWQoSEFWRV9TVEVBRFlfQ0xPQ0spCisgIHR5cGVkZWYgQ2hvb3NlU3RlYWR5Q2xvY2s8Pjo6dHlwZSB0eXBlOworI2Vsc2UKKyAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrIHR5cGU7CisjZW5kaWYKK307CisKK2lubGluZSBkb3VibGUgQ2hyb25vQ2xvY2tOb3coKSB7CisgIHR5cGVkZWYgQ2hvb3NlQ2xvY2tUeXBlOjp0eXBlIENsb2NrVHlwZTsKKyAgdXNpbmcgRnBTZWNvbmRzID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjpjaHJvbm86OnNlY29uZHM6OnBlcmlvZD47CisgIHJldHVybiBGcFNlY29uZHMoQ2xvY2tUeXBlOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7Cit9CisKK3N0ZDo6c3RyaW5nIExvY2FsRGF0ZVRpbWVTdHJpbmcoKTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworI2VuZGlmICAvLyBCRU5DSE1BUktfVElNRVJTX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvQXNzZW1ibHlUZXN0cy5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvQXNzZW1ibHlUZXN0cy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDA3ODU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9Bc3NlbWJseVRlc3RzLmNtYWtlCkBAIC0wLDAgKzEsNDYgQEAKKworaW5jbHVkZShzcGxpdF9saXN0KQorCitzZXQoQVNNX1RFU1RfRkxBR1MgIiIpCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygtTzMgQkVOQ0hNQVJLX0hBU19PM19GTEFHKQoraWYgKEJFTkNITUFSS19IQVNfTzNfRkxBRykKKyAgbGlzdChBUFBFTkQgQVNNX1RFU1RfRkxBR1MgLU8zKQorZW5kaWYoKQorCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygtZzAgQkVOQ0hNQVJLX0hBU19HMF9GTEFHKQoraWYgKEJFTkNITUFSS19IQVNfRzBfRkxBRykKKyAgbGlzdChBUFBFTkQgQVNNX1RFU1RfRkxBR1MgLWcwKQorZW5kaWYoKQorCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygtZm5vLXN0YWNrLXByb3RlY3RvciBCRU5DSE1BUktfSEFTX0ZOT19TVEFDS19QUk9URUNUT1JfRkxBRykKK2lmIChCRU5DSE1BUktfSEFTX0ZOT19TVEFDS19QUk9URUNUT1JfRkxBRykKKyAgbGlzdChBUFBFTkQgQVNNX1RFU1RfRkxBR1MgLWZuby1zdGFjay1wcm90ZWN0b3IpCitlbmRpZigpCisKK3NwbGl0X2xpc3QoQVNNX1RFU1RfRkxBR1MpCitzdHJpbmcoVE9VUFBFUiAiJHtDTUFLRV9DWFhfQ09NUElMRVJfSUR9IiBBU01fVEVTVF9DT01QSUxFUikKKworbWFjcm8oYWRkX2ZpbGVjaGVja190ZXN0IG5hbWUpCisgIGNtYWtlX3BhcnNlX2FyZ3VtZW50cyhBUkcgIiIgIiIgIkNIRUNLX1BSRUZJWEVTIiAke0FSR1Z9KQorICBhZGRfbGlicmFyeSgke25hbWV9IE9CSkVDVCAke25hbWV9LmNjKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfSBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1TICR7QVNNX1RFU1RfRkxBR1N9IikKKyAgc2V0KEFTTV9PVVRQVVRfRklMRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7bmFtZX0ucyIpCisgIGFkZF9jdXN0b21fdGFyZ2V0KGNvcHlfJHtuYW1lfSBBTEwKKyAgICAgIENPTU1BTkQgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rvb2xzL3N0cmlwX2FzbS5weQorICAgICAgICAkPFRBUkdFVF9PQkpFQ1RTOiR7bmFtZX0+CisgICAgICAgICR7QVNNX09VVFBVVF9GSUxFfQorICAgICAgQllQUk9EVUNUUyAke0FTTV9PVVRQVVRfRklMRX0pCisgIGFkZF9kZXBlbmRlbmNpZXMoY29weV8ke25hbWV9ICR7bmFtZX0pCisgIGlmIChOT1QgQVJHX0NIRUNLX1BSRUZJWEVTKQorICAgIHNldChBUkdfQ0hFQ0tfUFJFRklYRVMgIkNIRUNLIikKKyAgZW5kaWYoKQorICBmb3JlYWNoKHByZWZpeCAke0FSR19DSEVDS19QUkVGSVhFU30pCisgICAgYWRkX3Rlc3QoTkFNRSBydW5fJHtuYW1lfV8ke3ByZWZpeH0KKyAgICAgICAgQ09NTUFORAorICAgICAgICAgICR7TExWTV9GSUxFQ0hFQ0tfRVhFfSAke25hbWV9LmNjCisgICAgICAgICAgLS1pbnB1dC1maWxlPSR7QVNNX09VVFBVVF9GSUxFfQorICAgICAgICAgIC0tY2hlY2stcHJlZml4ZXM9Q0hFQ0ssQ0hFQ0stJHtBU01fVEVTVF9DT01QSUxFUn0KKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICBlbmRmb3JlYWNoKCkKK2VuZG1hY3JvKCkKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9CVUlMRCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvQlVJTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiOGNiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvQlVJTEQKQEAgLTAsMCArMSw3MyBAQAorVEVTVF9DT1BUUyA9IFsKKyAgICAiLXBlZGFudGljIiwKKyAgICAiLXBlZGFudGljLWVycm9ycyIsCisgICAgIi1zdGQ9YysrMTEiLAorICAgICItV2FsbCIsCisgICAgIi1XZXh0cmEiLAorICAgICItV3NoYWRvdyIsCisgICAgIyAgICAiLVdzaG9ydGVuLTY0LXRvLTMyIiwKKyAgICAiLVdmbG9hdC1lcXVhbCIsCisgICAgIi1mc3RyaWN0LWFsaWFzaW5nIiwKK10KKworUEVSX1NSQ19DT1BUUyA9ICh7CisgICAgImN4eDAzX3Rlc3QuY2MiOiBbIi1zdGQ9YysrMDMiXSwKKyAgICAjIFNvbWUgb2YgdGhlIGlzc3VlcyB3aXRoIERvTm90T3B0aW1pemUgb25seSBvY2N1ciB3aGVuIG9wdGltaXphdGlvbiBpcyBlbmFibGVkCisgICAgImRvbm90b3B0aW1pemVfdGVzdC5jYyI6IFsiLU8zIl0sCit9KQorCitURVNUX0FSR1MgPSBbIi0tYmVuY2htYXJrX21pbl90aW1lPTAuMDEiXQorCitQRVJfU1JDX1RFU1RfQVJHUyA9ICh7CisgICAgInVzZXJfY291bnRlcnNfdGFidWxhcl90ZXN0LmNjIjogWyItLWJlbmNobWFya19jb3VudGVyc190YWJ1bGFyPXRydWUiXSwKK30pCisKK2xvYWQoIkBydWxlc19jYy8vY2M6ZGVmcy5iemwiLCAiY2NfbGlicmFyeSIsICJjY190ZXN0IikKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gIm91dHB1dF90ZXN0X2hlbHBlciIsCisgICAgdGVzdG9ubHkgPSAxLAorICAgIHNyY3MgPSBbIm91dHB1dF90ZXN0X2hlbHBlci5jYyJdLAorICAgIGhkcnMgPSBbIm91dHB1dF90ZXN0LmgiXSwKKyAgICBjb3B0cyA9IFRFU1RfQ09QVFMsCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vOmJlbmNobWFyayIsCisgICAgICAgICIvLzpiZW5jaG1hcmtfaW50ZXJuYWxfaGVhZGVycyIsCisgICAgXSwKKykKKworWworICAgIGNjX3Rlc3QoCisgICAgICAgIG5hbWUgPSB0ZXN0X3NyY1s6LWxlbigiLmNjIildLAorICAgICAgICBzaXplID0gInNtYWxsIiwKKyAgICAgICAgc3JjcyA9IFt0ZXN0X3NyY10sCisgICAgICAgIGFyZ3MgPSBURVNUX0FSR1MgKyBQRVJfU1JDX1RFU1RfQVJHUy5nZXQodGVzdF9zcmMsIFtdKSwKKyAgICAgICAgY29wdHMgPSBURVNUX0NPUFRTICsgUEVSX1NSQ19DT1BUUy5nZXQodGVzdF9zcmMsIFtdKSwKKyAgICAgICAgZGVwcyA9IFsKKyAgICAgICAgICAgICI6b3V0cHV0X3Rlc3RfaGVscGVyIiwKKyAgICAgICAgICAgICIvLzpiZW5jaG1hcmsiLAorICAgICAgICAgICAgIi8vOmJlbmNobWFya19pbnRlcm5hbF9oZWFkZXJzIiwKKyAgICAgICAgICAgICJAY29tX2dvb2dsZV9nb29nbGV0ZXN0Ly86Z3Rlc3QiLAorICAgICAgICBdICsgKAorICAgICAgICAgICAgWyJAY29tX2dvb2dsZV9nb29nbGV0ZXN0Ly86Z3Rlc3RfbWFpbiJdIGlmICh0ZXN0X3NyY1stbGVuKCJndGVzdC5jYyIpOl0gPT0gImd0ZXN0LmNjIikgZWxzZSBbXQorICAgICAgICApLAorICAgICAgICAjIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgYXNzZW1ibHkgdGVzdHMgdG8gYmF6ZWwuCisgICAgICAgICMgU2VlIElzc3VlICM1NTYKKyAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2JlbmNobWFyay9pc3N1ZXMvNTU2CisgICAgKQorICAgIGZvciB0ZXN0X3NyYyBpbiBnbG9iKAorICAgICAgICBbIip0ZXN0LmNjIl0sCisgICAgICAgIGV4Y2x1ZGUgPSBbCisgICAgICAgICAgICAiKl9hc3NlbWJseV90ZXN0LmNjIiwKKyAgICAgICAgICAgICJsaW5rX21haW5fdGVzdC5jYyIsCisgICAgICAgIF0sCisgICAgKQorXQorCitjY190ZXN0KAorICAgIG5hbWUgPSAibGlua19tYWluX3Rlc3QiLAorICAgIHNpemUgPSAic21hbGwiLAorICAgIHNyY3MgPSBbImxpbmtfbWFpbl90ZXN0LmNjIl0sCisgICAgY29wdHMgPSBURVNUX0NPUFRTLAorICAgIGRlcHMgPSBbIi8vOmJlbmNobWFya19tYWluIl0sCispCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNiMWExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI1OSBAQAorIyBFbmFibGUgdGhlIHRlc3RzCisKK2ZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEKQoraW5jbHVkZShDaGVja0NYWENvbXBpbGVyRmxhZykKKworIyBOT1RFOiBTb21lIHRlc3RzIHVzZSBgPGNhc3NlcnQ+YCB0byBwZXJmb3JtIHRoZSB0ZXN0LiBUaGVyZWZvcmUgd2UgbXVzdAorIyBzdHJpcCAtRE5ERUJVRyBmcm9tIHRoZSBkZWZhdWx0IENNYWtlIGZsYWdzIGluIERFQlVHIG1vZGUuCitzdHJpbmcoVE9VUFBFUiAiJHtDTUFLRV9CVUlMRF9UWVBFfSIgdXBwZXJjYXNlX0NNQUtFX0JVSUxEX1RZUEUpCitpZiggTk9UIHVwcGVyY2FzZV9DTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJERUJVRyIgKQorICBhZGRfZGVmaW5pdGlvbnMoIC1VTkRFQlVHICkKKyAgYWRkX2RlZmluaXRpb25zKC1EVEVTVF9CRU5DSE1BUktfTElCUkFSWV9IQVNfTk9fQVNTRVJUSU9OUykKKyAgIyBBbHNvIHJlbW92ZSAvRCBOREVCVUcgdG8gYXZvaWQgTVNWQyB3YXJuaW5ncyBhYm91dCBjb25mbGljdGluZyBkZWZpbmVzLgorICBmb3JlYWNoIChmbGFnc192YXJfdG9fc2NydWIKKyAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFCisgICAgICBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgIENNQUtFX0NYWF9GTEFHU19NSU5TSVpFUkVMCisgICAgICBDTUFLRV9DX0ZMQUdTX1JFTEVBU0UKKyAgICAgIENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgIENNQUtFX0NfRkxBR1NfTUlOU0laRVJFTCkKKyAgICBzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIihefCApWy8tXUQgKk5ERUJVRygkfCApIiAiICIKKyAgICAgICIke2ZsYWdzX3Zhcl90b19zY3J1Yn0iICIkeyR7ZmxhZ3NfdmFyX3RvX3NjcnVifX0iKQorICBlbmRmb3JlYWNoKCkKK2VuZGlmKCkKKworY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLU8zIEJFTkNITUFSS19IQVNfTzNfRkxBRykKK3NldChCRU5DSE1BUktfTzNfRkxBRyAiIikKK2lmIChCRU5DSE1BUktfSEFTX08zX0ZMQUcpCisgIHNldChCRU5DSE1BUktfTzNfRkxBRyAiLU8zIikKK2VuZGlmKCkKKworIyBOT1RFOiBUaGVzZSBmbGFncyBtdXN0IGJlIGFkZGVkIGFmdGVyIGZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEKSBvdGhlcndpc2UKKyMgdGhleSB3aWxsIGJyZWFrIHRoZSBjb25maWd1cmF0aW9uIGNoZWNrLgoraWYgKERFRklORUQgQkVOQ0hNQVJLX0NYWF9MSU5LRVJfRkxBR1MpCisgIGxpc3QoQVBQRU5EIENNQUtFX0VYRV9MSU5LRVJfRkxBR1MgJHtCRU5DSE1BUktfQ1hYX0xJTktFUl9GTEFHU30pCitlbmRpZigpCisKK2FkZF9saWJyYXJ5KG91dHB1dF90ZXN0X2hlbHBlciBTVEFUSUMgb3V0cHV0X3Rlc3RfaGVscGVyLmNjIG91dHB1dF90ZXN0LmgpCisKK21hY3JvKGNvbXBpbGVfYmVuY2htYXJrX3Rlc3QgbmFtZSkKKyAgYWRkX2V4ZWN1dGFibGUoJHtuYW1lfSAiJHtuYW1lfS5jYyIpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9IGJlbmNobWFyayAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQorZW5kbWFjcm8oY29tcGlsZV9iZW5jaG1hcmtfdGVzdCkKKworbWFjcm8oY29tcGlsZV9iZW5jaG1hcmtfdGVzdF93aXRoX21haW4gbmFtZSkKKyAgYWRkX2V4ZWN1dGFibGUoJHtuYW1lfSAiJHtuYW1lfS5jYyIpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9IGJlbmNobWFya19tYWluKQorZW5kbWFjcm8oY29tcGlsZV9iZW5jaG1hcmtfdGVzdF93aXRoX21haW4pCisKK21hY3JvKGNvbXBpbGVfb3V0cHV0X3Rlc3QgbmFtZSkKKyAgYWRkX2V4ZWN1dGFibGUoJHtuYW1lfSAiJHtuYW1lfS5jYyIgb3V0cHV0X3Rlc3QuaCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gb3V0cHV0X3Rlc3RfaGVscGVyIGJlbmNobWFyaworICAgICAgICAgICR7QkVOQ0hNQVJLX0NYWF9MSUJSQVJJRVN9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCitlbmRtYWNybyhjb21waWxlX291dHB1dF90ZXN0KQorCisjIERlbW9uc3RyYXRpb24gZXhlY3V0YWJsZQorY29tcGlsZV9iZW5jaG1hcmtfdGVzdChiZW5jaG1hcmtfdGVzdCkKK2FkZF90ZXN0KE5BTUUgYmVuY2htYXJrIENPTU1BTkQgYmVuY2htYXJrX3Rlc3QgLS1iZW5jaG1hcmtfbWluX3RpbWU9MC4wMSkKKworY29tcGlsZV9iZW5jaG1hcmtfdGVzdChmaWx0ZXJfdGVzdCkKK21hY3JvKGFkZF9maWx0ZXJfdGVzdCBuYW1lIGZpbHRlciBleHBlY3QpCisgIGFkZF90ZXN0KE5BTUUgJHtuYW1lfSBDT01NQU5EIGZpbHRlcl90ZXN0IC0tYmVuY2htYXJrX21pbl90aW1lPTAuMDEgLS1iZW5jaG1hcmtfZmlsdGVyPSR7ZmlsdGVyfSAke2V4cGVjdH0pCisgIGFkZF90ZXN0KE5BTUUgJHtuYW1lfV9saXN0X29ubHkgQ09NTUFORCBmaWx0ZXJfdGVzdCAtLWJlbmNobWFya19saXN0X3Rlc3RzIC0tYmVuY2htYXJrX2ZpbHRlcj0ke2ZpbHRlcn0gJHtleHBlY3R9KQorZW5kbWFjcm8oYWRkX2ZpbHRlcl90ZXN0KQorCithZGRfZmlsdGVyX3Rlc3QoZmlsdGVyX3NpbXBsZSAiRm9vIiAzKQorYWRkX2ZpbHRlcl90ZXN0KGZpbHRlcl9zaW1wbGVfbmVnYXRpdmUgIi1Gb28iIDIpCithZGRfZmlsdGVyX3Rlc3QoZmlsdGVyX3N1ZmZpeCAiQk1fLioiIDQpCithZGRfZmlsdGVyX3Rlc3QoZmlsdGVyX3N1ZmZpeF9uZWdhdGl2ZSAiLUJNXy4qIiAxKQorYWRkX2ZpbHRlcl90ZXN0KGZpbHRlcl9yZWdleF9hbGwgIi4qIiA1KQorYWRkX2ZpbHRlcl90ZXN0KGZpbHRlcl9yZWdleF9hbGxfbmVnYXRpdmUgIi0uKiIgMCkKK2FkZF9maWx0ZXJfdGVzdChmaWx0ZXJfcmVnZXhfYmxhbmsgIiIgNSkKK2FkZF9maWx0ZXJfdGVzdChmaWx0ZXJfcmVnZXhfYmxhbmtfbmVnYXRpdmUgIi0iIDApCithZGRfZmlsdGVyX3Rlc3QoZmlsdGVyX3JlZ2V4X25vbmUgIm1vbmtleSIgMCkKK2FkZF9maWx0ZXJfdGVzdChmaWx0ZXJfcmVnZXhfbm9uZV9uZWdhdGl2ZSAiLW1vbmtleSIgNSkKK2FkZF9maWx0ZXJfdGVzdChmaWx0ZXJfcmVnZXhfd2lsZGNhcmQgIi4qRm9vLioiIDMpCithZGRfZmlsdGVyX3Rlc3QoZmlsdGVyX3JlZ2V4X3dpbGRjYXJkX25lZ2F0aXZlICItLipGb28uKiIgMikKK2FkZF9maWx0ZXJfdGVzdChmaWx0ZXJfcmVnZXhfYmVnaW4gIl5CTV8uKiIgNCkKK2FkZF9maWx0ZXJfdGVzdChmaWx0ZXJfcmVnZXhfYmVnaW5fbmVnYXRpdmUgIi1eQk1fLioiIDEpCithZGRfZmlsdGVyX3Rlc3QoZmlsdGVyX3JlZ2V4X2JlZ2luMiAiXk4iIDEpCithZGRfZmlsdGVyX3Rlc3QoZmlsdGVyX3JlZ2V4X2JlZ2luMl9uZWdhdGl2ZSAiLV5OIiA0KQorYWRkX2ZpbHRlcl90ZXN0KGZpbHRlcl9yZWdleF9lbmQgIi4qQmEkIiAxKQorYWRkX2ZpbHRlcl90ZXN0KGZpbHRlcl9yZWdleF9lbmRfbmVnYXRpdmUgIi0uKkJhJCIgNCkKKworY29tcGlsZV9iZW5jaG1hcmtfdGVzdChvcHRpb25zX3Rlc3QpCithZGRfdGVzdChOQU1FIG9wdGlvbnNfYmVuY2htYXJrcyBDT01NQU5EIG9wdGlvbnNfdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorCitjb21waWxlX2JlbmNobWFya190ZXN0KGJhc2ljX3Rlc3QpCithZGRfdGVzdChOQU1FIGJhc2ljX2JlbmNobWFyayBDT01NQU5EIGJhc2ljX3Rlc3QgLS1iZW5jaG1hcmtfbWluX3RpbWU9MC4wMSkKKworY29tcGlsZV9iZW5jaG1hcmtfdGVzdChkaWFnbm9zdGljc190ZXN0KQorYWRkX3Rlc3QoTkFNRSBkaWFnbm9zdGljc190ZXN0IENPTU1BTkQgZGlhZ25vc3RpY3NfdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorCitjb21waWxlX2JlbmNobWFya190ZXN0KHNraXBfd2l0aF9lcnJvcl90ZXN0KQorYWRkX3Rlc3QoTkFNRSBza2lwX3dpdGhfZXJyb3JfdGVzdCBDT01NQU5EIHNraXBfd2l0aF9lcnJvcl90ZXN0IC0tYmVuY2htYXJrX21pbl90aW1lPTAuMDEpCisKK2NvbXBpbGVfYmVuY2htYXJrX3Rlc3QoZG9ub3RvcHRpbWl6ZV90ZXN0KQorIyBTb21lIG9mIHRoZSBpc3N1ZXMgd2l0aCBEb05vdE9wdGltaXplIG9ubHkgb2NjdXIgd2hlbiBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZAorY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLU8zIEJFTkNITUFSS19IQVNfTzNfRkxBRykKK2lmIChCRU5DSE1BUktfSEFTX08zX0ZMQUcpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhkb25vdG9wdGltaXplX3Rlc3QgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItTzMiKQorZW5kaWYoKQorYWRkX3Rlc3QoTkFNRSBkb25vdG9wdGltaXplX3Rlc3QgQ09NTUFORCBkb25vdG9wdGltaXplX3Rlc3QgLS1iZW5jaG1hcmtfbWluX3RpbWU9MC4wMSkKKworY29tcGlsZV9iZW5jaG1hcmtfdGVzdChmaXh0dXJlX3Rlc3QpCithZGRfdGVzdChOQU1FIGZpeHR1cmVfdGVzdCBDT01NQU5EIGZpeHR1cmVfdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorCitjb21waWxlX2JlbmNobWFya190ZXN0KHJlZ2lzdGVyX2JlbmNobWFya190ZXN0KQorYWRkX3Rlc3QoTkFNRSByZWdpc3Rlcl9iZW5jaG1hcmtfdGVzdCBDT01NQU5EIHJlZ2lzdGVyX2JlbmNobWFya190ZXN0IC0tYmVuY2htYXJrX21pbl90aW1lPTAuMDEpCisKK2NvbXBpbGVfYmVuY2htYXJrX3Rlc3QobWFwX3Rlc3QpCithZGRfdGVzdChOQU1FIG1hcF90ZXN0IENPTU1BTkQgbWFwX3Rlc3QgLS1iZW5jaG1hcmtfbWluX3RpbWU9MC4wMSkKKworY29tcGlsZV9iZW5jaG1hcmtfdGVzdChtdWx0aXBsZV9yYW5nZXNfdGVzdCkKK2FkZF90ZXN0KE5BTUUgbXVsdGlwbGVfcmFuZ2VzX3Rlc3QgQ09NTUFORCBtdWx0aXBsZV9yYW5nZXNfdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorCitjb21waWxlX2JlbmNobWFya190ZXN0X3dpdGhfbWFpbihsaW5rX21haW5fdGVzdCkKK2FkZF90ZXN0KE5BTUUgbGlua19tYWluX3Rlc3QgQ09NTUFORCBsaW5rX21haW5fdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorCitjb21waWxlX291dHB1dF90ZXN0KHJlcG9ydGVyX291dHB1dF90ZXN0KQorYWRkX3Rlc3QoTkFNRSByZXBvcnRlcl9vdXRwdXRfdGVzdCBDT01NQU5EIHJlcG9ydGVyX291dHB1dF90ZXN0IC0tYmVuY2htYXJrX21pbl90aW1lPTAuMDEpCisKK2NvbXBpbGVfb3V0cHV0X3Rlc3QodGVtcGxhdGVkX2ZpeHR1cmVfdGVzdCkKK2FkZF90ZXN0KE5BTUUgdGVtcGxhdGVkX2ZpeHR1cmVfdGVzdCBDT01NQU5EIHRlbXBsYXRlZF9maXh0dXJlX3Rlc3QgLS1iZW5jaG1hcmtfbWluX3RpbWU9MC4wMSkKKworY29tcGlsZV9vdXRwdXRfdGVzdCh1c2VyX2NvdW50ZXJzX3Rlc3QpCithZGRfdGVzdChOQU1FIHVzZXJfY291bnRlcnNfdGVzdCBDT01NQU5EIHVzZXJfY291bnRlcnNfdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorCitjb21waWxlX291dHB1dF90ZXN0KGludGVybmFsX3RocmVhZGluZ190ZXN0KQorYWRkX3Rlc3QoTkFNRSBpbnRlcm5hbF90aHJlYWRpbmdfdGVzdCBDT01NQU5EIGludGVybmFsX3RocmVhZGluZ190ZXN0IC0tYmVuY2htYXJrX21pbl90aW1lPTAuMDEpCisKK2NvbXBpbGVfb3V0cHV0X3Rlc3QocmVwb3J0X2FnZ3JlZ2F0ZXNfb25seV90ZXN0KQorYWRkX3Rlc3QoTkFNRSByZXBvcnRfYWdncmVnYXRlc19vbmx5X3Rlc3QgQ09NTUFORCByZXBvcnRfYWdncmVnYXRlc19vbmx5X3Rlc3QgLS1iZW5jaG1hcmtfbWluX3RpbWU9MC4wMSkKKworY29tcGlsZV9vdXRwdXRfdGVzdChkaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seV90ZXN0KQorYWRkX3Rlc3QoTkFNRSBkaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seV90ZXN0IENPTU1BTkQgZGlzcGxheV9hZ2dyZWdhdGVzX29ubHlfdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorCitjb21waWxlX291dHB1dF90ZXN0KHVzZXJfY291bnRlcnNfdGFidWxhcl90ZXN0KQorYWRkX3Rlc3QoTkFNRSB1c2VyX2NvdW50ZXJzX3RhYnVsYXJfdGVzdCBDT01NQU5EIHVzZXJfY291bnRlcnNfdGFidWxhcl90ZXN0IC0tYmVuY2htYXJrX2NvdW50ZXJzX3RhYnVsYXI9dHJ1ZSAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorCitjb21waWxlX291dHB1dF90ZXN0KHVzZXJfY291bnRlcnNfdGhvdXNhbmRzX3Rlc3QpCithZGRfdGVzdChOQU1FIHVzZXJfY291bnRlcnNfdGhvdXNhbmRzX3Rlc3QgQ09NTUFORCB1c2VyX2NvdW50ZXJzX3Rob3VzYW5kc190ZXN0IC0tYmVuY2htYXJrX21pbl90aW1lPTAuMDEpCisKK2NvbXBpbGVfb3V0cHV0X3Rlc3QobWVtb3J5X21hbmFnZXJfdGVzdCkKK2FkZF90ZXN0KE5BTUUgbWVtb3J5X21hbmFnZXJfdGVzdCBDT01NQU5EIG1lbW9yeV9tYW5hZ2VyX3Rlc3QgLS1iZW5jaG1hcmtfbWluX3RpbWU9MC4wMSkKKworY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLXN0ZD1jKyswMyBCRU5DSE1BUktfSEFTX0NYWDAzX0ZMQUcpCitpZiAoQkVOQ0hNQVJLX0hBU19DWFgwM19GTEFHKQorICBjb21waWxlX2JlbmNobWFya190ZXN0KGN4eDAzX3Rlc3QpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhjeHgwM190ZXN0CisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0ZMQUdTICItc3RkPWMrKzAzIikKKyAgIyBsaWJzdGRjKysgcHJvdmlkZXMgZGlmZmVyZW50IGRlZmluaXRpb25zIHdpdGhpbiA8bWFwPiBiZXR3ZWVuIGRpYWxlY3RzLiBXaGVuCisgICMgTFRPIGlzIGVuYWJsZWQgYW5kIC1XZXJyb3IgaXMgc3BlY2lmaWVkIEdDQyBkaWFnbm9zZXMgdGhpcyBPRFIgdmlvbGF0aW9uCisgICMgY2F1c2luZyB0aGUgdGVzdCB0byBmYWlsIHRvIGNvbXBpbGUuIFRvIHByZXZlbnQgdGhpcyB3ZSBleHBsaWNpdGx5IGRpc2FibGUKKyAgIyB0aGUgd2FybmluZy4KKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLVduby1vZHIgQkVOQ0hNQVJLX0hBU19XTk9fT0RSKQorICBpZiAoQkVOQ0hNQVJLX0VOQUJMRV9MVE8gQU5EIEJFTkNITUFSS19IQVNfV05PX09EUikKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoY3h4MDNfdGVzdAorICAgICAgICBQUk9QRVJUSUVTCisgICAgICAgIExJTktfRkxBR1MgIi1Xbm8tb2RyIikKKyAgZW5kaWYoKQorICBhZGRfdGVzdChOQU1FIGN4eDAzIENPTU1BTkQgY3h4MDNfdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0wLjAxKQorZW5kaWYoKQorCisjIEF0dGVtcHQgdG8gd29yayBhcm91bmQgZmxha3kgdGVzdCBmYWlsdXJlcyB3aGVuIHJ1bm5pbmcgb24gQXBwdmV5b3Igc2VydmVycy4KK2lmIChERUZJTkVEIEVOVntBUFBWRVlPUn0pCisgIHNldChDT01QTEVYSVRZX01JTl9USU1FICIwLjUiKQorZWxzZSgpCisgIHNldChDT01QTEVYSVRZX01JTl9USU1FICIwLjAxIikKK2VuZGlmKCkKK2NvbXBpbGVfb3V0cHV0X3Rlc3QoY29tcGxleGl0eV90ZXN0KQorYWRkX3Rlc3QoTkFNRSBjb21wbGV4aXR5X2JlbmNobWFyayBDT01NQU5EIGNvbXBsZXhpdHlfdGVzdCAtLWJlbmNobWFya19taW5fdGltZT0ke0NPTVBMRVhJVFlfTUlOX1RJTUV9KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdvb2dsZVRlc3QgVW5pdCBUZXN0cworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiAoQkVOQ0hNQVJLX0VOQUJMRV9HVEVTVF9URVNUUykKKyAgbWFjcm8oY29tcGlsZV9ndGVzdCBuYW1lKQorICAgIGFkZF9leGVjdXRhYmxlKCR7bmFtZX0gIiR7bmFtZX0uY2MiKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9IGJlbmNobWFyaworICAgICAgICBnbW9ja19tYWluICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCisgIGVuZG1hY3JvKGNvbXBpbGVfZ3Rlc3QpCisKKyAgbWFjcm8oYWRkX2d0ZXN0IG5hbWUpCisgICAgY29tcGlsZV9ndGVzdCgke25hbWV9KQorICAgIGFkZF90ZXN0KE5BTUUgJHtuYW1lfSBDT01NQU5EICR7bmFtZX0pCisgIGVuZG1hY3JvKCkKKworICBhZGRfZ3Rlc3QoYmVuY2htYXJrX2d0ZXN0KQorICBhZGRfZ3Rlc3QoYmVuY2htYXJrX25hbWVfZ3Rlc3QpCisgIGFkZF9ndGVzdChjb21tYW5kbGluZWZsYWdzX2d0ZXN0KQorICBhZGRfZ3Rlc3Qoc3RhdGlzdGljc19ndGVzdCkKKyAgYWRkX2d0ZXN0KHN0cmluZ191dGlsX2d0ZXN0KQorZW5kaWYoQkVOQ0hNQVJLX0VOQUJMRV9HVEVTVF9URVNUUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBc3NlbWJseSBVbml0IFRlc3RzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmIChCRU5DSE1BUktfRU5BQkxFX0FTU0VNQkxZX1RFU1RTKQorICBpZiAoTk9UIExMVk1fRklMRUNIRUNLX0VYRSkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJMTFZNIEZpbGVDaGVjayBpcyByZXF1aXJlZCB3aGVuIGluY2x1ZGluZyB0aGlzIGZpbGUiKQorICBlbmRpZigpCisgIGluY2x1ZGUoQXNzZW1ibHlUZXN0cy5jbWFrZSkKKyAgYWRkX2ZpbGVjaGVja190ZXN0KGRvbm90b3B0aW1pemVfYXNzZW1ibHlfdGVzdCkKKyAgYWRkX2ZpbGVjaGVja190ZXN0KHN0YXRlX2Fzc2VtYmx5X3Rlc3QpCisgIGFkZF9maWxlY2hlY2tfdGVzdChjbG9iYmVyX21lbW9yeV9hc3NlbWJseV90ZXN0KQorZW5kaWYoKQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb2RlIENvdmVyYWdlIENvbmZpZ3VyYXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBZGQgdGhlIGNvdmVyYWdlIGNvbW1hbmQocykKK2lmKENNQUtFX0JVSUxEX1RZUEUpCisgIHN0cmluZyhUT0xPV0VSICR7Q01BS0VfQlVJTERfVFlQRX0gQ01BS0VfQlVJTERfVFlQRV9MT1dFUikKK2VuZGlmKCkKK2lmICgke0NNQUtFX0JVSUxEX1RZUEVfTE9XRVJ9IE1BVENIRVMgImNvdmVyYWdlIikKKyAgZmluZF9wcm9ncmFtKEdDT1YgZ2NvdikKKyAgZmluZF9wcm9ncmFtKExDT1YgbGNvdikKKyAgZmluZF9wcm9ncmFtKEdFTkhUTUwgZ2VuaHRtbCkKKyAgZmluZF9wcm9ncmFtKENURVNUIGN0ZXN0KQorICBpZiAoR0NPViBBTkQgTENPViBBTkQgR0VOSFRNTCBBTkQgQ1RFU1QgQU5EIEhBVkVfQ1hYX0ZMQUdfQ09WRVJBR0UpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgT1VUUFVUICR7Q01BS0VfQklOQVJZX0RJUn0vbGNvdi9pbmRleC5odG1sCisgICAgICBDT01NQU5EICR7TENPVn0gLXEgLXogLWQgLgorICAgICAgQ09NTUFORCAke0xDT1Z9IC1xIC0tbm8tZXh0ZXJuYWwgLWMgLWIgIiR7Q01BS0VfU09VUkNFX0RJUn0iIC1kIC4gLW8gYmVmb3JlLmxjb3YgLWkKKyAgICAgIENPTU1BTkQgJHtDVEVTVH0gLS1mb3JjZS1uZXctY3Rlc3QtcHJvY2VzcworICAgICAgQ09NTUFORCAke0xDT1Z9IC1xIC0tbm8tZXh0ZXJuYWwgLWMgLWIgIiR7Q01BS0VfU09VUkNFX0RJUn0iIC1kIC4gLW8gYWZ0ZXIubGNvdgorICAgICAgQ09NTUFORCAke0xDT1Z9IC1xIC1hIGJlZm9yZS5sY292IC1hIGFmdGVyLmxjb3YgLS1vdXRwdXQtZmlsZSBmaW5hbC5sY292CisgICAgICBDT01NQU5EICR7TENPVn0gLXEgLXIgZmluYWwubGNvdiAiJyR7Q01BS0VfU09VUkNFX0RJUn0vdGVzdC8qJyIgLW8gZmluYWwubGNvdgorICAgICAgQ09NTUFORCAke0dFTkhUTUx9IGZpbmFsLmxjb3YgLW8gbGNvdiAtLWRlbWFuZ2xlLWNwcCAtLXNvcnQgLXAgIiR7Q01BS0VfQklOQVJZX0RJUn0iIC10IGJlbmNobWFyaworICAgICAgREVQRU5EUyBmaWx0ZXJfdGVzdCBiZW5jaG1hcmtfdGVzdCBvcHRpb25zX3Rlc3QgYmFzaWNfdGVzdCBmaXh0dXJlX3Rlc3QgY3h4MDNfdGVzdCBjb21wbGV4aXR5X3Rlc3QKKyAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0KKyAgICAgIENPTU1FTlQgIlJ1bm5pbmcgTENPViIKKyAgICApCisgICAgYWRkX2N1c3RvbV90YXJnZXQoY292ZXJhZ2UKKyAgICAgIERFUEVORFMgJHtDTUFLRV9CSU5BUllfRElSfS9sY292L2luZGV4Lmh0bWwKKyAgICAgIENPTU1FTlQgIkxDT1YgcmVwb3J0IGF0IGxjb3YvaW5kZXguaHRtbCIKKyAgICApCisgICAgbWVzc2FnZShTVEFUVVMgIkNvdmVyYWdlIGNvbW1hbmQgYWRkZWQiKQorICBlbHNlKCkKKyAgICBpZiAoSEFWRV9DWFhfRkxBR19DT1ZFUkFHRSkKKyAgICAgIHNldChDWFhfRkxBR19DT1ZFUkFHRV9NRVNTQUdFIHN1cHBvcnRlZCkKKyAgICBlbHNlKCkKKyAgICAgIHNldChDWFhfRkxBR19DT1ZFUkFHRV9NRVNTQUdFIHVuYXZhaWxhYmxlKQorICAgIGVuZGlmKCkKKyAgICBtZXNzYWdlKFdBUk5JTkcKKyAgICAgICJDb3ZlcmFnZSBub3QgYXZhaWxhYmxlOlxuIgorICAgICAgIiAgZ2NvdjogJHtHQ09WfVxuIgorICAgICAgIiAgbGNvdjogJHtMQ09WfVxuIgorICAgICAgIiAgZ2VuaHRtbDogJHtHRU5IVE1MfVxuIgorICAgICAgIiAgY3Rlc3Q6ICR7Q1RFU1R9XG4iCisgICAgICAiICAtLWNvdmVyYWdlIGZsYWc6ICR7Q1hYX0ZMQUdfQ09WRVJBR0VfTUVTU0FHRX0iKQorICBlbmRpZigpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2Jhc2ljX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2Jhc2ljX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzZGQxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvYmFzaWNfdGVzdC5jYwpAQCAtMCwwICsxLDEzNiBAQAorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCisjZGVmaW5lIEJBU0lDX0JFTkNITUFSS19URVNUKHgpIEJFTkNITUFSSyh4KS0+QXJnKDgpLT5BcmcoNTEyKS0+QXJnKDgxOTIpCisKK3ZvaWQgQk1fZW1wdHkoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9Cit9CitCRU5DSE1BUksoQk1fZW1wdHkpOworQkVOQ0hNQVJLKEJNX2VtcHR5KS0+VGhyZWFkUGVyQ3B1KCk7CisKK3ZvaWQgQk1fc3Bpbl9lbXB0eShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCBzdGF0ZS5yYW5nZSgwKTsgKyt4KSB7CisgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoeCk7CisgICAgfQorICB9Cit9CitCQVNJQ19CRU5DSE1BUktfVEVTVChCTV9zcGluX2VtcHR5KTsKK0JBU0lDX0JFTkNITUFSS19URVNUKEJNX3NwaW5fZW1wdHkpLT5UaHJlYWRQZXJDcHUoKTsKKwordm9pZCBCTV9zcGluX3BhdXNlX2JlZm9yZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLnJhbmdlKDApOyArK2kpIHsKKyAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoaSk7CisgIH0KKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGUucmFuZ2UoMCk7ICsraSkgeworICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGkpOworICAgIH0KKyAgfQorfQorQkFTSUNfQkVOQ0hNQVJLX1RFU1QoQk1fc3Bpbl9wYXVzZV9iZWZvcmUpOworQkFTSUNfQkVOQ0hNQVJLX1RFU1QoQk1fc3Bpbl9wYXVzZV9iZWZvcmUpLT5UaHJlYWRQZXJDcHUoKTsKKwordm9pZCBCTV9zcGluX3BhdXNlX2R1cmluZyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLnJhbmdlKDApOyArK2kpIHsKKyAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShpKTsKKyAgICB9CisgICAgc3RhdGUuUmVzdW1lVGltaW5nKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZS5yYW5nZSgwKTsgKytpKSB7CisgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoaSk7CisgICAgfQorICB9Cit9CitCQVNJQ19CRU5DSE1BUktfVEVTVChCTV9zcGluX3BhdXNlX2R1cmluZyk7CitCQVNJQ19CRU5DSE1BUktfVEVTVChCTV9zcGluX3BhdXNlX2R1cmluZyktPlRocmVhZFBlckNwdSgpOworCit2b2lkIEJNX3BhdXNlX2R1cmluZyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsKKyAgICBzdGF0ZS5SZXN1bWVUaW1pbmcoKTsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX3BhdXNlX2R1cmluZyk7CitCRU5DSE1BUksoQk1fcGF1c2VfZHVyaW5nKS0+VGhyZWFkUGVyQ3B1KCk7CitCRU5DSE1BUksoQk1fcGF1c2VfZHVyaW5nKS0+VXNlUmVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9wYXVzZV9kdXJpbmcpLT5Vc2VSZWFsVGltZSgpLT5UaHJlYWRQZXJDcHUoKTsKKwordm9pZCBCTV9zcGluX3BhdXNlX2FmdGVyKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLnJhbmdlKDApOyArK2kpIHsKKyAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShpKTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZS5yYW5nZSgwKTsgKytpKSB7CisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGkpOworICB9Cit9CitCQVNJQ19CRU5DSE1BUktfVEVTVChCTV9zcGluX3BhdXNlX2FmdGVyKTsKK0JBU0lDX0JFTkNITUFSS19URVNUKEJNX3NwaW5fcGF1c2VfYWZ0ZXIpLT5UaHJlYWRQZXJDcHUoKTsKKwordm9pZCBCTV9zcGluX3BhdXNlX2JlZm9yZV9hbmRfYWZ0ZXIoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZS5yYW5nZSgwKTsgKytpKSB7CisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGkpOworICB9CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLnJhbmdlKDApOyArK2kpIHsKKyAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShpKTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZS5yYW5nZSgwKTsgKytpKSB7CisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGkpOworICB9Cit9CitCQVNJQ19CRU5DSE1BUktfVEVTVChCTV9zcGluX3BhdXNlX2JlZm9yZV9hbmRfYWZ0ZXIpOworQkFTSUNfQkVOQ0hNQVJLX1RFU1QoQk1fc3Bpbl9wYXVzZV9iZWZvcmVfYW5kX2FmdGVyKS0+VGhyZWFkUGVyQ3B1KCk7CisKK3ZvaWQgQk1fZW1wdHlfc3RvcF9zdGFydChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9lbXB0eV9zdG9wX3N0YXJ0KTsKK0JFTkNITUFSSyhCTV9lbXB0eV9zdG9wX3N0YXJ0KS0+VGhyZWFkUGVyQ3B1KCk7CisKKwordm9pZCBCTV9LZWVwUnVubmluZyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBiZW5jaG1hcms6Okl0ZXJhdGlvbkNvdW50IGl0ZXJfY291bnQgPSAwOworICBhc3NlcnQoaXRlcl9jb3VudCA9PSBzdGF0ZS5pdGVyYXRpb25zKCkpOworICB3aGlsZSAoc3RhdGUuS2VlcFJ1bm5pbmcoKSkgeworICAgICsraXRlcl9jb3VudDsKKyAgfQorICBhc3NlcnQoaXRlcl9jb3VudCA9PSBzdGF0ZS5pdGVyYXRpb25zKCkpOworfQorQkVOQ0hNQVJLKEJNX0tlZXBSdW5uaW5nKTsKKwordm9pZCBCTV9LZWVwUnVubmluZ0JhdGNoKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIC8vIENob29zZSBhIHByaW1lIGJhdGNoIHNpemUgdG8gYXZvaWQgZXZlbmx5IGRpdmlkaW5nIG1heF9pdGVyYXRpb25zLgorICBjb25zdCBiZW5jaG1hcms6Okl0ZXJhdGlvbkNvdW50IGJhdGNoX3NpemUgPSAxMDE7CisgIGJlbmNobWFyazo6SXRlcmF0aW9uQ291bnQgaXRlcl9jb3VudCA9IDA7CisgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZ0JhdGNoKGJhdGNoX3NpemUpKSB7CisgICAgaXRlcl9jb3VudCArPSBiYXRjaF9zaXplOworICB9CisgIGFzc2VydChzdGF0ZS5pdGVyYXRpb25zKCkgPT0gaXRlcl9jb3VudCk7Cit9CitCRU5DSE1BUksoQk1fS2VlcFJ1bm5pbmdCYXRjaCk7CisKK3ZvaWQgQk1fUmFuZ2VkRm9yKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGJlbmNobWFyazo6SXRlcmF0aW9uQ291bnQgaXRlcl9jb3VudCA9IDA7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICArK2l0ZXJfY291bnQ7CisgIH0KKyAgYXNzZXJ0KGl0ZXJfY291bnQgPT0gc3RhdGUubWF4X2l0ZXJhdGlvbnMpOworfQorQkVOQ0hNQVJLKEJNX1JhbmdlZEZvcik7CisKKy8vIEVuc3VyZSB0aGF0IFN0YXRlSXRlcmF0b3IgcHJvdmlkZXMgYWxsIHRoZSBuZWNlc3NhcnkgdHlwZWRlZnMgcmVxdWlyZWQgdG8KKy8vIGluc3RhbnRpYXRlIHN0ZDo6aXRlcmF0b3JfdHJhaXRzLgorc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8CisgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGJlbmNobWFyazo6U3RhdGU6OlN0YXRlSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorICB0eXBlbmFtZSBiZW5jaG1hcms6OlN0YXRlOjpTdGF0ZUl0ZXJhdG9yOjp2YWx1ZV90eXBlPjo6dmFsdWUsICIiKTsKKworQkVOQ0hNQVJLX01BSU4oKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvYmVuY2htYXJrX2d0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9iZW5jaG1hcmtfZ3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1N2IyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvYmVuY2htYXJrX2d0ZXN0LmNjCkBAIC0wLDAgKzEsMTI4IEBACisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiLi4vc3JjL2JlbmNobWFya19yZWdpc3Rlci5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworVEVTVChBZGRSYW5nZVRlc3QsIFNpbXBsZSkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGRzdDsKKyAgQWRkUmFuZ2UoJmRzdCwgMSwgMiwgMik7CisgIEVYUEVDVF9USEFUKGRzdCwgdGVzdGluZzo6RWxlbWVudHNBcmUoMSwgMikpOworfQorCitURVNUKEFkZFJhbmdlVGVzdCwgU2ltcGxlNjQpIHsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZHN0OworICBBZGRSYW5nZSgmZHN0LCBzdGF0aWNfY2FzdDxpbnQ2NF90PigxKSwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oMiksIDIpOworICBFWFBFQ1RfVEhBVChkc3QsIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKDEsIDIpKTsKK30KKworVEVTVChBZGRSYW5nZVRlc3QsIEFkdmFuY2VkKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gZHN0OworICBBZGRSYW5nZSgmZHN0LCA1LCAxNSwgMik7CisgIEVYUEVDVF9USEFUKGRzdCwgdGVzdGluZzo6RWxlbWVudHNBcmUoNSwgOCwgMTUpKTsKK30KKworVEVTVChBZGRSYW5nZVRlc3QsIEFkdmFuY2VkNjQpIHsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZHN0OworICBBZGRSYW5nZSgmZHN0LCBzdGF0aWNfY2FzdDxpbnQ2NF90Pig1KSwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oMTUpLCAyKTsKKyAgRVhQRUNUX1RIQVQoZHN0LCB0ZXN0aW5nOjpFbGVtZW50c0FyZSg1LCA4LCAxNSkpOworfQorCitURVNUKEFkZFJhbmdlVGVzdCwgRnVsbFJhbmdlOCkgeworICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IGRzdDsKKyAgQWRkUmFuZ2UoJmRzdCwgaW50OF90ezF9LCBzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCgpLCA4KTsKKyAgRVhQRUNUX1RIQVQoZHN0LCB0ZXN0aW5nOjpFbGVtZW50c0FyZSgxLCA4LCA2NCwgMTI3KSk7Cit9CisKK1RFU1QoQWRkUmFuZ2VUZXN0LCBGdWxsUmFuZ2U2NCkgeworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkc3Q7CisgIEFkZFJhbmdlKCZkc3QsIGludDY0X3R7MX0sIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpLCAxMDI0KTsKKyAgRVhQRUNUX1RIQVQoCisgICAgICBkc3QsIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKDFMTCwgMTAyNExMLCAxMDQ4NTc2TEwsIDEwNzM3NDE4MjRMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5OTUxMTYyNzc3NkxMLCAxMTI1ODk5OTA2ODQyNjI0TEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTI5MjE1MDQ2MDY4NDY5NzZMTCwgOTIyMzM3MjAzNjg1NDc3NTgwN0xMKSk7Cit9CisKK1RFU1QoQWRkUmFuZ2VUZXN0LCBOZWdhdGl2ZVJhbmdlcykgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGRzdDsKKyAgQWRkUmFuZ2UoJmRzdCwgLTgsIDAsIDIpOworICBFWFBFQ1RfVEhBVChkc3QsIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKC04LCAtNCwgLTIsIC0xLCAwKSk7Cit9CisKK1RFU1QoQWRkUmFuZ2VUZXN0LCBTdHJpY3RseU5lZ2F0aXZlKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gZHN0OworICBBZGRSYW5nZSgmZHN0LCAtOCwgLTEsIDIpOworICBFWFBFQ1RfVEhBVChkc3QsIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKC04LCAtNCwgLTIsIC0xKSk7Cit9CisKK1RFU1QoQWRkUmFuZ2VUZXN0LCBTeW1tZXRyaWNOZWdhdGl2ZVJhbmdlcykgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGRzdDsKKyAgQWRkUmFuZ2UoJmRzdCwgLTgsIDgsIDIpOworICBFWFBFQ1RfVEhBVChkc3QsIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKC04LCAtNCwgLTIsIC0xLCAwLCAxLCAyLCA0LCA4KSk7Cit9CisKK1RFU1QoQWRkUmFuZ2VUZXN0LCBTeW1tZXRyaWNOZWdhdGl2ZVJhbmdlc09kZE11bHQpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBkc3Q7CisgIEFkZFJhbmdlKCZkc3QsIC0zMCwgMzIsIDUpOworICBFWFBFQ1RfVEhBVChkc3QsIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKC0zMCwgLTI1LCAtNSwgLTEsIDAsIDEsIDUsIDI1LCAzMikpOworfQorCitURVNUKEFkZFJhbmdlVGVzdCwgTmVnYXRpdmVSYW5nZXNBc3ltbWV0cmljKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gZHN0OworICBBZGRSYW5nZSgmZHN0LCAtMywgNSwgMik7CisgIEVYUEVDVF9USEFUKGRzdCwgdGVzdGluZzo6RWxlbWVudHNBcmUoLTMsIC0yLCAtMSwgMCwgMSwgMiwgNCwgNSkpOworfQorCitURVNUKEFkZFJhbmdlVGVzdCwgTmVnYXRpdmVSYW5nZXNMYXJnZVN0ZXApIHsKKyAgLy8gQWx3YXlzIGluY2x1ZGUgLTEsIDAsIDEgd2hlbiBjcm9zc2luZyB6ZXJvLgorICBzdGQ6OnZlY3RvcjxpbnQ+IGRzdDsKKyAgQWRkUmFuZ2UoJmRzdCwgLTgsIDgsIDEwKTsKKyAgRVhQRUNUX1RIQVQoZHN0LCB0ZXN0aW5nOjpFbGVtZW50c0FyZSgtOCwgLTEsIDAsIDEsIDgpKTsKK30KKworVEVTVChBZGRSYW5nZVRlc3QsIFplcm9Pbmx5UmFuZ2UpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBkc3Q7CisgIEFkZFJhbmdlKCZkc3QsIDAsIDAsIDIpOworICBFWFBFQ1RfVEhBVChkc3QsIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKDApKTsKK30KKworVEVTVChBZGRSYW5nZVRlc3QsIE5lZ2F0aXZlUmFuZ2U2NCkgeworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkc3Q7CisgIEFkZFJhbmdlPGludDY0X3Q+KCZkc3QsIC00LCA0LCAyKTsKKyAgRVhQRUNUX1RIQVQoZHN0LCB0ZXN0aW5nOjpFbGVtZW50c0FyZSgtNCwgLTIsIC0xLCAwLCAxLCAyLCA0KSk7Cit9CisKK1RFU1QoQWRkUmFuZ2VUZXN0LCBOZWdhdGl2ZVJhbmdlUHJlc2VydmVzRXhpc3RpbmdPcmRlcikgeworICAvLyBJZiBlbGVtZW50cyBhbHJlYWR5IGV4aXN0IGluIHRoZSByYW5nZSwgZW5zdXJlIHdlIGRvbid0IGNoYW5nZQorICAvLyB0aGVpciBvcmRlcmluZyBieSBhZGRpbmcgbmVnYXRpdmUgdmFsdWVzLgorICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkc3QgPSB7MSwgMiwgM307CisgIEFkZFJhbmdlPGludDY0X3Q+KCZkc3QsIC0yLCAyLCAyKTsKKyAgRVhQRUNUX1RIQVQoZHN0LCB0ZXN0aW5nOjpFbGVtZW50c0FyZSgxLCAyLCAzLCAtMiwgLTEsIDAsIDEsIDIpKTsKK30KKworVEVTVChBZGRSYW5nZVRlc3QsIEZ1bGxOZWdhdGl2ZVJhbmdlNjQpIHsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZHN0OworICBjb25zdCBhdXRvIG1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpOworICBjb25zdCBhdXRvIG1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworICBBZGRSYW5nZSgmZHN0LCBtaW4sIG1heCwgMTAyNCk7CisgIEVYUEVDVF9USEFUKAorICAgICAgZHN0LCB0ZXN0aW5nOjpFbGVtZW50c0FyZUFycmF5KHN0ZDo6dmVjdG9yPGludDY0X3Q+eworICAgICAgICAgICAgICAgbWluLCAtMTE1MjkyMTUwNDYwNjg0Njk3NkxMLCAtMTEyNTg5OTkwNjg0MjYyNExMLAorICAgICAgICAgICAgICAgLTEwOTk1MTE2Mjc3NzZMTCwgLTEwNzM3NDE4MjRMTCwgLTEwNDg1NzZMTCwgLTEwMjRMTCwgLTFMTCwgMExMLAorICAgICAgICAgICAgICAgMUxMLCAxMDI0TEwsIDEwNDg1NzZMTCwgMTA3Mzc0MTgyNExMLCAxMDk5NTExNjI3Nzc2TEwsCisgICAgICAgICAgICAgICAxMTI1ODk5OTA2ODQyNjI0TEwsIDExNTI5MjE1MDQ2MDY4NDY5NzZMTCwgbWF4fSkpOworfQorCitURVNUKEFkZFJhbmdlVGVzdCwgU2ltcGxlOCkgeworICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IGRzdDsKKyAgQWRkUmFuZ2U8aW50OF90PigmZHN0LCAxLCA4LCAyKTsKKyAgRVhQRUNUX1RIQVQoZHN0LCB0ZXN0aW5nOjpFbGVtZW50c0FyZSgxLCAyLCA0LCA4KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYmVuY2htYXJrCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2JlbmNobWFya19uYW1lX2d0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9iZW5jaG1hcmtfbmFtZV9ndGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI0MDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9iZW5jaG1hcmtfbmFtZV9ndGVzdC5jYwpAQCAtMCwwICsxLDc0IEBACisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBiZW5jaG1hcms7Cit1c2luZyBuYW1lc3BhY2UgYmVuY2htYXJrOjppbnRlcm5hbDsKKworVEVTVChCZW5jaG1hcmtOYW1lVGVzdCwgRW1wdHkpIHsKKyAgY29uc3QgYXV0byBuYW1lID0gQmVuY2htYXJrTmFtZSgpOworICBFWFBFQ1RfRVEobmFtZS5zdHIoKSwgc3RkOjpzdHJpbmcoKSk7Cit9CisKK1RFU1QoQmVuY2htYXJrTmFtZVRlc3QsIEZ1bmN0aW9uTmFtZSkgeworICBhdXRvIG5hbWUgPSBCZW5jaG1hcmtOYW1lKCk7CisgIG5hbWUuZnVuY3Rpb25fbmFtZSA9ICJmdW5jdGlvbl9uYW1lIjsKKyAgRVhQRUNUX0VRKG5hbWUuc3RyKCksICJmdW5jdGlvbl9uYW1lIik7Cit9CisKK1RFU1QoQmVuY2htYXJrTmFtZVRlc3QsIEZ1bmN0aW9uTmFtZUFuZEFyZ3MpIHsKKyAgYXV0byBuYW1lID0gQmVuY2htYXJrTmFtZSgpOworICBuYW1lLmZ1bmN0aW9uX25hbWUgPSAiZnVuY3Rpb25fbmFtZSI7CisgIG5hbWUuYXJncyA9ICJzb21lX2FyZ3M6My80LzUiOworICBFWFBFQ1RfRVEobmFtZS5zdHIoKSwgImZ1bmN0aW9uX25hbWUvc29tZV9hcmdzOjMvNC81Iik7Cit9CisKK1RFU1QoQmVuY2htYXJrTmFtZVRlc3QsIE1pblRpbWUpIHsKKyAgYXV0byBuYW1lID0gQmVuY2htYXJrTmFtZSgpOworICBuYW1lLmZ1bmN0aW9uX25hbWUgPSAiZnVuY3Rpb25fbmFtZSI7CisgIG5hbWUuYXJncyA9ICJzb21lX2FyZ3M6My80IjsKKyAgbmFtZS5taW5fdGltZSA9ICJtaW5fdGltZTozLjRzIjsKKyAgRVhQRUNUX0VRKG5hbWUuc3RyKCksICJmdW5jdGlvbl9uYW1lL3NvbWVfYXJnczozLzQvbWluX3RpbWU6My40cyIpOworfQorCitURVNUKEJlbmNobWFya05hbWVUZXN0LCBJdGVyYXRpb25zKSB7CisgIGF1dG8gbmFtZSA9IEJlbmNobWFya05hbWUoKTsKKyAgbmFtZS5mdW5jdGlvbl9uYW1lID0gImZ1bmN0aW9uX25hbWUiOworICBuYW1lLm1pbl90aW1lID0gIm1pbl90aW1lOjMuNHMiOworICBuYW1lLml0ZXJhdGlvbnMgPSAiaXRlcmF0aW9uczo0MiI7CisgIEVYUEVDVF9FUShuYW1lLnN0cigpLCAiZnVuY3Rpb25fbmFtZS9taW5fdGltZTozLjRzL2l0ZXJhdGlvbnM6NDIiKTsKK30KKworVEVTVChCZW5jaG1hcmtOYW1lVGVzdCwgUmVwZXRpdGlvbnMpIHsKKyAgYXV0byBuYW1lID0gQmVuY2htYXJrTmFtZSgpOworICBuYW1lLmZ1bmN0aW9uX25hbWUgPSAiZnVuY3Rpb25fbmFtZSI7CisgIG5hbWUubWluX3RpbWUgPSAibWluX3RpbWU6My40cyI7CisgIG5hbWUucmVwZXRpdGlvbnMgPSAicmVwZXRpdGlvbnM6MjQiOworICBFWFBFQ1RfRVEobmFtZS5zdHIoKSwgImZ1bmN0aW9uX25hbWUvbWluX3RpbWU6My40cy9yZXBldGl0aW9uczoyNCIpOworfQorCitURVNUKEJlbmNobWFya05hbWVUZXN0LCBUaW1lVHlwZSkgeworICBhdXRvIG5hbWUgPSBCZW5jaG1hcmtOYW1lKCk7CisgIG5hbWUuZnVuY3Rpb25fbmFtZSA9ICJmdW5jdGlvbl9uYW1lIjsKKyAgbmFtZS5taW5fdGltZSA9ICJtaW5fdGltZTozLjRzIjsKKyAgbmFtZS50aW1lX3R5cGUgPSAiaGFtbWVyX3RpbWUiOworICBFWFBFQ1RfRVEobmFtZS5zdHIoKSwgImZ1bmN0aW9uX25hbWUvbWluX3RpbWU6My40cy9oYW1tZXJfdGltZSIpOworfQorCitURVNUKEJlbmNobWFya05hbWVUZXN0LCBUaHJlYWRzKSB7CisgIGF1dG8gbmFtZSA9IEJlbmNobWFya05hbWUoKTsKKyAgbmFtZS5mdW5jdGlvbl9uYW1lID0gImZ1bmN0aW9uX25hbWUiOworICBuYW1lLm1pbl90aW1lID0gIm1pbl90aW1lOjMuNHMiOworICBuYW1lLnRocmVhZHMgPSAidGhyZWFkczoyNTYiOworICBFWFBFQ1RfRVEobmFtZS5zdHIoKSwgImZ1bmN0aW9uX25hbWUvbWluX3RpbWU6My40cy90aHJlYWRzOjI1NiIpOworfQorCitURVNUKEJlbmNobWFya05hbWVUZXN0LCBUZXN0RW1wdHlGdW5jdGlvbk5hbWUpIHsKKyAgYXV0byBuYW1lID0gQmVuY2htYXJrTmFtZSgpOworICBuYW1lLmFyZ3MgPSAiZmlyc3Q6My9zZWNvbmQ6NCI7CisgIG5hbWUudGhyZWFkcyA9ICJ0aHJlYWRzOjIyIjsKKyAgRVhQRUNUX0VRKG5hbWUuc3RyKCksICJmaXJzdDozL3NlY29uZDo0L3RocmVhZHM6MjIiKTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9iZW5jaG1hcmtfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvYmVuY2htYXJrX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkNGY1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvYmVuY2htYXJrX3Rlc3QuY2MKQEAgLTAsMCArMSwyNDUgQEAKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIEJFTkNITUFSS19OT0lOTElORSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTk9JTkxJTkUKKyNlbmRpZgorCituYW1lc3BhY2UgeworCitpbnQgQkVOQ0hNQVJLX05PSU5MSU5FIEZhY3RvcmlhbCh1aW50MzJfdCBuKSB7CisgIHJldHVybiAobiA9PSAxKSA/IDEgOiBuICogRmFjdG9yaWFsKG4gLSAxKTsKK30KKworZG91YmxlIENhbGN1bGF0ZVBpKGludCBkZXB0aCkgeworICBkb3VibGUgcGkgPSAwLjA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7ICsraSkgeworICAgIGRvdWJsZSBudW1lcmF0b3IgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCgoaSAlIDIpICogMikgLSAxKTsKKyAgICBkb3VibGUgZGVub21pbmF0b3IgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCgyICogaSkgLSAxKTsKKyAgICBwaSArPSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjsKKyAgfQorICByZXR1cm4gKHBpIC0gMS4wKSAqIDQ7Cit9CisKK3N0ZDo6c2V0PGludDY0X3Q+IENvbnN0cnVjdFJhbmRvbVNldChpbnQ2NF90IHNpemUpIHsKKyAgc3RkOjpzZXQ8aW50NjRfdD4gczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHMuaW5zZXJ0KHMuZW5kKCksIGkpOworICByZXR1cm4gczsKK30KKworc3RkOjptdXRleCB0ZXN0X3ZlY3Rvcl9tdTsKK3N0ZDo6dmVjdG9yPGludD4qIHRlc3RfdmVjdG9yID0gbnVsbHB0cjsKKworfSAgLy8gZW5kIG5hbWVzcGFjZQorCitzdGF0aWMgdm9pZCBCTV9GYWN0b3JpYWwoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgaW50IGZhY180MiA9IDA7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIGZhY180MiA9IEZhY3RvcmlhbCg4KTsKKyAgLy8gUHJldmVudCBjb21waWxlciBvcHRpbWl6YXRpb25zCisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBmYWNfNDI7CisgIHN0YXRlLlNldExhYmVsKHNzLnN0cigpKTsKK30KK0JFTkNITUFSSyhCTV9GYWN0b3JpYWwpOworQkVOQ0hNQVJLKEJNX0ZhY3RvcmlhbCktPlVzZVJlYWxUaW1lKCk7CisKK3N0YXRpYyB2b2lkIEJNX0NhbGN1bGF0ZVBpUmFuZ2UoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZG91YmxlIHBpID0gMC4wOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSBwaSA9IENhbGN1bGF0ZVBpKHN0YXRpY19jYXN0PGludD4oc3RhdGUucmFuZ2UoMCkpKTsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHBpOworICBzdGF0ZS5TZXRMYWJlbChzcy5zdHIoKSk7Cit9CitCRU5DSE1BUktfUkFOR0UoQk1fQ2FsY3VsYXRlUGlSYW5nZSwgMSwgMTAyNCAqIDEwMjQpOworCitzdGF0aWMgdm9pZCBCTV9DYWxjdWxhdGVQaShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBzdGF0aWMgY29uc3QgaW50IGRlcHRoID0gMTAyNDsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShDYWxjdWxhdGVQaShzdGF0aWNfY2FzdDxpbnQ+KGRlcHRoKSkpOworICB9Cit9CitCRU5DSE1BUksoQk1fQ2FsY3VsYXRlUGkpLT5UaHJlYWRzKDgpOworQkVOQ0hNQVJLKEJNX0NhbGN1bGF0ZVBpKS0+VGhyZWFkUmFuZ2UoMSwgMzIpOworQkVOQ0hNQVJLKEJNX0NhbGN1bGF0ZVBpKS0+VGhyZWFkUGVyQ3B1KCk7CisKK3N0YXRpYyB2b2lkIEJNX1NldEluc2VydChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBzdGQ6OnNldDxpbnQ2NF90PiBkYXRhOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsKKyAgICBkYXRhID0gQ29uc3RydWN0UmFuZG9tU2V0KHN0YXRlLnJhbmdlKDApKTsKKyAgICBzdGF0ZS5SZXN1bWVUaW1pbmcoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlLnJhbmdlKDEpOyArK2opIGRhdGEuaW5zZXJ0KHJhbmQoKSk7CisgIH0KKyAgc3RhdGUuU2V0SXRlbXNQcm9jZXNzZWQoc3RhdGUuaXRlcmF0aW9ucygpICogc3RhdGUucmFuZ2UoMSkpOworICBzdGF0ZS5TZXRCeXRlc1Byb2Nlc3NlZChzdGF0ZS5pdGVyYXRpb25zKCkgKiBzdGF0ZS5yYW5nZSgxKSAqIHNpemVvZihpbnQpKTsKK30KKworLy8gVGVzdCBtYW55IGluc2VydHMgYXQgb25jZSB0byByZWR1Y2UgdGhlIHRvdGFsIGl0ZXJhdGlvbnMgbmVlZGVkLiBPdGhlcndpc2UsIHRoZSBzbG93ZXIsCisvLyBub24tdGltZWQgcGFydCBvZiBlYWNoIGl0ZXJhdGlvbiB3aWxsIG1ha2UgdGhlIGJlbmNobWFyayB0YWtlIGZvcmV2ZXIuCitCRU5DSE1BUksoQk1fU2V0SW5zZXJ0KS0+UmFuZ2VzKHt7MSA8PCAxMCwgOCA8PCAxMH0sIHsxMjgsIDUxMn19KTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lciwKKyAgICAgICAgICB0eXBlbmFtZSBWYWx1ZVR5cGUgPSB0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+CitzdGF0aWMgdm9pZCBCTV9TZXF1ZW50aWFsKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIFZhbHVlVHlwZSB2ID0gNDI7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBDb250YWluZXIgYzsKKyAgICBmb3IgKGludDY0X3QgaSA9IHN0YXRlLnJhbmdlKDApOyAtLWk7KSBjLnB1c2hfYmFjayh2KTsKKyAgfQorICBjb25zdCBpbnQ2NF90IGl0ZW1zX3Byb2Nlc3NlZCA9IHN0YXRlLml0ZXJhdGlvbnMoKSAqIHN0YXRlLnJhbmdlKDApOworICBzdGF0ZS5TZXRJdGVtc1Byb2Nlc3NlZChpdGVtc19wcm9jZXNzZWQpOworICBzdGF0ZS5TZXRCeXRlc1Byb2Nlc3NlZChpdGVtc19wcm9jZXNzZWQgKiBzaXplb2YodikpOworfQorQkVOQ0hNQVJLX1RFTVBMQVRFMihCTV9TZXF1ZW50aWFsLCBzdGQ6OnZlY3RvcjxpbnQ+LCBpbnQpCisgICAgLT5SYW5nZSgxIDw8IDAsIDEgPDwgMTApOworQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1NlcXVlbnRpYWwsIHN0ZDo6bGlzdDxpbnQ+KS0+UmFuZ2UoMSA8PCAwLCAxIDw8IDEwKTsKKy8vIFRlc3QgdGhlIHZhcmlhZGljIHZlcnNpb24gb2YgQkVOQ0hNQVJLX1RFTVBMQVRFIGluIEMrKzExIGFuZCBiZXlvbmQuCisjaWZkZWYgQkVOQ0hNQVJLX0hBU19DWFgxMQorQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1NlcXVlbnRpYWwsIHN0ZDo6dmVjdG9yPGludD4sIGludCktPkFyZyg1MTIpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIEJNX1N0cmluZ0NvbXBhcmUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc2l6ZV90IGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oc3RhdGUucmFuZ2UoMCkpOworICBzdGQ6OnN0cmluZyBzMShsZW4sICctJyk7CisgIHN0ZDo6c3RyaW5nIHMyKGxlbiwgJy0nKTsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHMxLmNvbXBhcmUoczIpKTsKK30KK0JFTkNITUFSSyhCTV9TdHJpbmdDb21wYXJlKS0+UmFuZ2UoMSwgMSA8PCAyMCk7CisKK3N0YXRpYyB2b2lkIEJNX1NldHVwVGVhcmRvd24oYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgaWYgKHN0YXRlLnRocmVhZF9pbmRleCA9PSAwKSB7CisgICAgLy8gTm8gbmVlZCB0byBsb2NrIHRlc3RfdmVjdG9yX211IGhlcmUgYXMgdGhpcyBpcyBydW5uaW5nIHNpbmdsZS10aHJlYWRlZC4KKyAgICB0ZXN0X3ZlY3RvciA9IG5ldyBzdGQ6OnZlY3RvcjxpbnQ+KCk7CisgIH0KKyAgaW50IGkgPSAwOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwodGVzdF92ZWN0b3JfbXUpOworICAgIGlmIChpICUgMiA9PSAwKQorICAgICAgdGVzdF92ZWN0b3ItPnB1c2hfYmFjayhpKTsKKyAgICBlbHNlCisgICAgICB0ZXN0X3ZlY3Rvci0+cG9wX2JhY2soKTsKKyAgICArK2k7CisgIH0KKyAgaWYgKHN0YXRlLnRocmVhZF9pbmRleCA9PSAwKSB7CisgICAgZGVsZXRlIHRlc3RfdmVjdG9yOworICB9Cit9CitCRU5DSE1BUksoQk1fU2V0dXBUZWFyZG93biktPlRocmVhZFBlckNwdSgpOworCitzdGF0aWMgdm9pZCBCTV9Mb25nVGVzdChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBkb3VibGUgdHJhY2tlciA9IDAuMDsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGUucmFuZ2UoMCk7ICsraSkKKyAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh0cmFja2VyICs9IGkpOworICB9Cit9CitCRU5DSE1BUksoQk1fTG9uZ1Rlc3QpLT5SYW5nZSgxIDw8IDE2LCAxIDw8IDI4KTsKKworc3RhdGljIHZvaWQgQk1fUGFyYWxsZWxNZW1zZXQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgaW50NjRfdCBzaXplID0gc3RhdGUucmFuZ2UoMCkgLyBzdGF0aWNfY2FzdDxpbnQ2NF90PihzaXplb2YoaW50KSk7CisgIGludCB0aHJlYWRfc2l6ZSA9IHN0YXRpY19jYXN0PGludD4oc2l6ZSkgLyBzdGF0ZS50aHJlYWRzOworICBpbnQgZnJvbSA9IHRocmVhZF9zaXplICogc3RhdGUudGhyZWFkX2luZGV4OworICBpbnQgdG8gPSBmcm9tICsgdGhyZWFkX3NpemU7CisKKyAgaWYgKHN0YXRlLnRocmVhZF9pbmRleCA9PSAwKSB7CisgICAgdGVzdF92ZWN0b3IgPSBuZXcgc3RkOjp2ZWN0b3I8aW50PihzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpKTsKKyAgfQorCisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBmb3IgKGludCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHsKKyAgICAgIC8vIE5vIG5lZWQgdG8gbG9jayB0ZXN0X3ZlY3Rvcl9tdSBhcyByYW5nZXMKKyAgICAgIC8vIGRvIG5vdCBvdmVybGFwIGJldHdlZW4gdGhyZWFkcy4KKyAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh0ZXN0X3ZlY3Rvci0+YXQoaSkgPSAxKTsKKyAgICB9CisgIH0KKworICBpZiAoc3RhdGUudGhyZWFkX2luZGV4ID09IDApIHsKKyAgICBkZWxldGUgdGVzdF92ZWN0b3I7CisgIH0KK30KK0JFTkNITUFSSyhCTV9QYXJhbGxlbE1lbXNldCktPkFyZygxMCA8PCAyMCktPlRocmVhZFJhbmdlKDEsIDQpOworCitzdGF0aWMgdm9pZCBCTV9NYW51YWxUaW1pbmcoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgaW50NjRfdCBzbGVwdF9mb3IgPSAwOworICBpbnQ2NF90IG1pY3Jvc2Vjb25kcyA9IHN0YXRlLnJhbmdlKDApOworICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pY3JvPiBzbGVlcF9kdXJhdGlvbnsKKyAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4obWljcm9zZWNvbmRzKX07CisKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAvLyBTaW11bGF0ZSBzb21lIHVzZWZ1bCB3b3JrbG9hZCB3aXRoIGEgc2xlZXAKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoCisgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcz4oc2xlZXBfZHVyYXRpb24pKTsKKyAgICBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworCisgICAgYXV0byBlbGFwc2VkID0KKyAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4+KGVuZCAtIHN0YXJ0KTsKKworICAgIHN0YXRlLlNldEl0ZXJhdGlvblRpbWUoZWxhcHNlZC5jb3VudCgpKTsKKyAgICBzbGVwdF9mb3IgKz0gbWljcm9zZWNvbmRzOworICB9CisgIHN0YXRlLlNldEl0ZW1zUHJvY2Vzc2VkKHNsZXB0X2Zvcik7Cit9CitCRU5DSE1BUksoQk1fTWFudWFsVGltaW5nKS0+UmFuZ2UoMSwgMSA8PCAxNCktPlVzZVJlYWxUaW1lKCk7CitCRU5DSE1BUksoQk1fTWFudWFsVGltaW5nKS0+UmFuZ2UoMSwgMSA8PCAxNCktPlVzZU1hbnVhbFRpbWUoKTsKKworI2lmZGVmIEJFTkNITUFSS19IQVNfQ1hYMTEKKwordGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+Cit2b2lkIEJNX3dpdGhfYXJncyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgQXJncyYmLi4uKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorQkVOQ0hNQVJLX0NBUFRVUkUoQk1fd2l0aF9hcmdzLCBpbnRfdGVzdCwgNDIsIDQzLCA0NCk7CitCRU5DSE1BUktfQ0FQVFVSRShCTV93aXRoX2FyZ3MsIHN0cmluZ19hbmRfcGFpcl90ZXN0LCBzdGQ6OnN0cmluZygiYWJjIiksCisgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8aW50LCBkb3VibGU+KDQyLCAzLjgpKTsKKwordm9pZCBCTV9ub25fdGVtcGxhdGVfYXJncyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgaW50LCBkb3VibGUpIHsKKyAgd2hpbGUoc3RhdGUuS2VlcFJ1bm5pbmcoKSkge30KK30KK0JFTkNITUFSS19DQVBUVVJFKEJNX25vbl90ZW1wbGF0ZV9hcmdzLCBiYXNpY190ZXN0LCAwLCAwKTsKKworI2VuZGlmICAvLyBCRU5DSE1BUktfSEFTX0NYWDExCisKK3N0YXRpYyB2b2lkIEJNX0RlbnNlVGhyZWFkUmFuZ2VzKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgIHN3aXRjaCAoc3QucmFuZ2UoMCkpIHsKKyAgICBjYXNlIDE6CisgICAgICBhc3NlcnQoc3QudGhyZWFkcyA9PSAxIHx8IHN0LnRocmVhZHMgPT0gMiB8fCBzdC50aHJlYWRzID09IDMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgYXNzZXJ0KHN0LnRocmVhZHMgPT0gMSB8fCBzdC50aHJlYWRzID09IDMgfHwgc3QudGhyZWFkcyA9PSA0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGFzc2VydChzdC50aHJlYWRzID09IDUgfHwgc3QudGhyZWFkcyA9PSA4IHx8IHN0LnRocmVhZHMgPT0gMTEgfHwKKyAgICAgICAgICAgICBzdC50aHJlYWRzID09IDE0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoZmFsc2UgJiYgIkludmFsaWQgdGVzdCBjYXNlIG51bWJlciIpOworICB9CisgIHdoaWxlIChzdC5LZWVwUnVubmluZygpKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9EZW5zZVRocmVhZFJhbmdlcyktPkFyZygxKS0+RGVuc2VUaHJlYWRSYW5nZSgxLCAzKTsKK0JFTkNITUFSSyhCTV9EZW5zZVRocmVhZFJhbmdlcyktPkFyZygyKS0+RGVuc2VUaHJlYWRSYW5nZSgxLCA0LCAyKTsKK0JFTkNITUFSSyhCTV9EZW5zZVRocmVhZFJhbmdlcyktPkFyZygzKS0+RGVuc2VUaHJlYWRSYW5nZSg1LCAxNCwgMyk7CisKK0JFTkNITUFSS19NQUlOKCk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2Nsb2JiZXJfbWVtb3J5X2Fzc2VtYmx5X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2Nsb2JiZXJfbWVtb3J5X2Fzc2VtYmx5X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxOTExYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvY2xvYmJlcl9tZW1vcnlfYXNzZW1ibHlfdGVzdC5jYwpAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSA8YmVuY2htYXJrL2JlbmNobWFyay5oPgorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdyZXR1cm4tdHlwZSIKKyNlbmRpZgorCitleHRlcm4gIkMiIHsKKworZXh0ZXJuIGludCBFeHRlcm5JbnQ7CitleHRlcm4gaW50IEV4dGVybkludDI7CitleHRlcm4gaW50IEV4dGVybkludDM7CisKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfYmFzaWM6CitleHRlcm4gIkMiIHZvaWQgdGVzdF9iYXNpYygpIHsKKyAgaW50IHg7CisgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSgmeCk7CisgIHggPSAxMDE7CisgIGJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpOworICAvLyBDSEVDSzogbGVhcSBbW0RFU1Q6W14sXStdXSwgJXJheAorICAvLyBDSEVDSzogbW92bCAkMTAxLCBbW0RFU1RdXQorICAvLyBDSEVDSzogcmV0Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3JlZHVuZGFudF9zdG9yZToKK2V4dGVybiAiQyIgdm9pZCB0ZXN0X3JlZHVuZGFudF9zdG9yZSgpIHsKKyAgRXh0ZXJuSW50ID0gMzsKKyAgYmVuY2htYXJrOjpDbG9iYmVyTWVtb3J5KCk7CisgIEV4dGVybkludCA9IDUxOworICAvLyBDSEVDSy1EQUc6IEV4dGVybkludAorICAvLyBDSEVDSy1EQUc6IG1vdmwgJDMKKyAgLy8gQ0hFQ0s6IG1vdmwgJDUxCit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3JlZHVuZGFudF9yZWFkOgorZXh0ZXJuICJDIiB2b2lkIHRlc3RfcmVkdW5kYW50X3JlYWQoKSB7CisgIGludCB4OworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoJngpOworICB4ID0gRXh0ZXJuSW50OworICBiZW5jaG1hcms6OkNsb2JiZXJNZW1vcnkoKTsKKyAgeCA9IEV4dGVybkludDI7CisgIC8vIENIRUNLOiBsZWFxIFtbREVTVDpbXixdK11dLCAlcmF4CisgIC8vIENIRUNLOiBFeHRlcm5JbnQoJXJpcCkKKyAgLy8gQ0hFQ0s6IG1vdmwgJWVheCwgW1tERVNUXV0KKyAgLy8gQ0hFQ0stTk9UOiBFeHRlcm5JbnQyCisgIC8vIENIRUNLOiByZXQKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfcmVkdW5kYW50X3JlYWQyOgorZXh0ZXJuICJDIiB2b2lkIHRlc3RfcmVkdW5kYW50X3JlYWQyKCkgeworICBpbnQgeDsKKyAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKCZ4KTsKKyAgeCA9IEV4dGVybkludDsKKyAgYmVuY2htYXJrOjpDbG9iYmVyTWVtb3J5KCk7CisgIHggPSBFeHRlcm5JbnQyOworICBiZW5jaG1hcms6OkNsb2JiZXJNZW1vcnkoKTsKKyAgLy8gQ0hFQ0s6IGxlYXEgW1tERVNUOlteLF0rXV0sICVyYXgKKyAgLy8gQ0hFQ0s6IEV4dGVybkludCglcmlwKQorICAvLyBDSEVDSzogbW92bCAlZWF4LCBbW0RFU1RdXQorICAvLyBDSEVDSzogRXh0ZXJuSW50MiglcmlwKQorICAvLyBDSEVDSzogbW92bCAlZWF4LCBbW0RFU1RdXQorICAvLyBDSEVDSzogcmV0Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2NvbW1hbmRsaW5lZmxhZ3NfZ3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2NvbW1hbmRsaW5lZmxhZ3NfZ3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiZGI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvY29tbWFuZGxpbmVmbGFnc19ndGVzdC5jYwpAQCAtMCwwICsxLDIwMSBAQAorI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpbmNsdWRlICIuLi9zcmMvY29tbWFuZGxpbmVmbGFncy5oIgorI2luY2x1ZGUgIi4uL3NyYy9pbnRlcm5hbF9tYWNyb3MuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK25hbWVzcGFjZSB7CisKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQoraW50IHNldGVudihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSkgeworICBpZiAoIW92ZXJ3cml0ZSkgeworICAgIC8vIE5PVEU6IGdldGVudl9zIGlzIGZhciBzdXBlcmlvciBidXQgbm90IGF2YWlsYWJsZSB1bmRlciBtaW5ndy4KKyAgICBjaGFyKiBlbnZfdmFsdWUgPSBnZXRlbnYobmFtZSk7CisgICAgaWYgKGVudl92YWx1ZSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIHJldHVybiBfcHV0ZW52X3MobmFtZSwgdmFsdWUpOworfQorCitpbnQgdW5zZXRlbnYoY29uc3QgY2hhciogbmFtZSkgeworICByZXR1cm4gX3B1dGVudl9zKG5hbWUsICIiKTsKK30KKworI2VuZGlmICAvLyBCRU5DSE1BUktfT1NfV0lORE9XUworCitURVNUKEJvb2xGcm9tRW52LCBEZWZhdWx0KSB7CisgIEFTU0VSVF9FUSh1bnNldGVudigiQkVOQ0hNQVJLX05PVF9JTl9FTlYiKSwgMCk7CisgIEVYUEVDVF9FUShCb29sRnJvbUVudigibm90X2luX2VudiIsIHRydWUpLCB0cnVlKTsKK30KKworVEVTVChCb29sRnJvbUVudiwgRmFsc2UpIHsKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICIwIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIHRydWUpLCBmYWxzZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJOIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIHRydWUpLCBmYWxzZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJuIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIHRydWUpLCBmYWxzZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJOTyIsIDEpLCAwKTsKKyAgRVhQRUNUX0VRKEJvb2xGcm9tRW52KCJpbl9lbnYiLCB0cnVlKSwgZmFsc2UpOworICB1bnNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIpOworCisgIEFTU0VSVF9FUShzZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiLCAiTm8iLCAxKSwgMCk7CisgIEVYUEVDVF9FUShCb29sRnJvbUVudigiaW5fZW52IiwgdHJ1ZSksIGZhbHNlKTsKKyAgdW5zZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiKTsKKworICBBU1NFUlRfRVEoc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIiwgIm5vIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIHRydWUpLCBmYWxzZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJGIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIHRydWUpLCBmYWxzZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJmIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIHRydWUpLCBmYWxzZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJGQUxTRSIsIDEpLCAwKTsKKyAgRVhQRUNUX0VRKEJvb2xGcm9tRW52KCJpbl9lbnYiLCB0cnVlKSwgZmFsc2UpOworICB1bnNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIpOworCisgIEFTU0VSVF9FUShzZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiLCAiRmFsc2UiLCAxKSwgMCk7CisgIEVYUEVDVF9FUShCb29sRnJvbUVudigiaW5fZW52IiwgdHJ1ZSksIGZhbHNlKTsKKyAgdW5zZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiKTsKKworICBBU1NFUlRfRVEoc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIiwgImZhbHNlIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIHRydWUpLCBmYWxzZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJPRkYiLCAxKSwgMCk7CisgIEVYUEVDVF9FUShCb29sRnJvbUVudigiaW5fZW52IiwgdHJ1ZSksIGZhbHNlKTsKKyAgdW5zZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiKTsKKworICBBU1NFUlRfRVEoc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIiwgIk9mZiIsIDEpLCAwKTsKKyAgRVhQRUNUX0VRKEJvb2xGcm9tRW52KCJpbl9lbnYiLCB0cnVlKSwgZmFsc2UpOworICB1bnNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIpOworCisgIEFTU0VSVF9FUShzZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiLCAib2ZmIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIHRydWUpLCBmYWxzZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7Cit9CisKK1RFU1QoQm9vbEZyb21FbnYsIFRydWUpIHsKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICIxIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJZIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJ5IiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJZRVMiLCAxKSwgMCk7CisgIEVYUEVDVF9FUShCb29sRnJvbUVudigiaW5fZW52IiwgZmFsc2UpLCB0cnVlKTsKKyAgdW5zZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiKTsKKworICBBU1NFUlRfRVEoc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIiwgIlllcyIsIDEpLCAwKTsKKyAgRVhQRUNUX0VRKEJvb2xGcm9tRW52KCJpbl9lbnYiLCBmYWxzZSksIHRydWUpOworICB1bnNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIpOworCisgIEFTU0VSVF9FUShzZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiLCAieWVzIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJUIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJ0IiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJUUlVFIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJUcnVlIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJ0cnVlIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJPTiIsIDEpLCAwKTsKKyAgRVhQRUNUX0VRKEJvb2xGcm9tRW52KCJpbl9lbnYiLCBmYWxzZSksIHRydWUpOworICB1bnNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIpOworCisgIEFTU0VSVF9FUShzZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiLCAiT24iLCAxKSwgMCk7CisgIEVYUEVDVF9FUShCb29sRnJvbUVudigiaW5fZW52IiwgZmFsc2UpLCB0cnVlKTsKKyAgdW5zZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiKTsKKworICBBU1NFUlRfRVEoc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIiwgIm9uIiwgMSksIDApOworICBFWFBFQ1RfRVEoQm9vbEZyb21FbnYoImluX2VudiIsIGZhbHNlKSwgdHJ1ZSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7CisKKyNpZm5kZWYgQkVOQ0hNQVJLX09TX1dJTkRPV1MKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICIiLCAxKSwgMCk7CisgIEVYUEVDVF9FUShCb29sRnJvbUVudigiaW5fZW52IiwgZmFsc2UpLCB0cnVlKTsKKyAgdW5zZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiKTsKKyNlbmRpZgorfQorCitURVNUKEludDMyRnJvbUVudiwgTm90SW5FbnYpIHsKKyAgQVNTRVJUX0VRKHVuc2V0ZW52KCJCRU5DSE1BUktfTk9UX0lOX0VOViIpLCAwKTsKKyAgRVhQRUNUX0VRKEludDMyRnJvbUVudigibm90X2luX2VudiIsIDQyKSwgNDIpOworfQorCitURVNUKEludDMyRnJvbUVudiwgSW52YWxpZEludGVnZXIpIHsKKyAgQVNTRVJUX0VRKHNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIsICJmb28iLCAxKSwgMCk7CisgIEVYUEVDVF9FUShJbnQzMkZyb21FbnYoImluX2VudiIsIDQyKSwgNDIpOworICB1bnNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIpOworfQorCitURVNUKEludDMyRnJvbUVudiwgVmFsaWRJbnRlZ2VyKSB7CisgIEFTU0VSVF9FUShzZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiLCAiNDIiLCAxKSwgMCk7CisgIEVYUEVDVF9FUShJbnQzMkZyb21FbnYoImluX2VudiIsIDY0KSwgNDIpOworICB1bnNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIpOworfQorCitURVNUKERvdWJsZUZyb21FbnYsIE5vdEluRW52KSB7CisgIEFTU0VSVF9FUSh1bnNldGVudigiQkVOQ0hNQVJLX05PVF9JTl9FTlYiKSwgMCk7CisgIEVYUEVDVF9FUShEb3VibGVGcm9tRW52KCJub3RfaW5fZW52IiwgMC41MSksIDAuNTEpOworfQorCitURVNUKERvdWJsZUZyb21FbnYsIEludmFsaWRSZWFsKSB7CisgIEFTU0VSVF9FUShzZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiLCAiZm9vIiwgMSksIDApOworICBFWFBFQ1RfRVEoRG91YmxlRnJvbUVudigiaW5fZW52IiwgMC41MSksIDAuNTEpOworICB1bnNldGVudigiQkVOQ0hNQVJLX0lOX0VOViIpOworfQorCitURVNUKERvdWJsZUZyb21FbnYsIFZhbGlkUmVhbCkgeworICBBU1NFUlRfRVEoc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIiwgIjAuNTEiLCAxKSwgMCk7CisgIEVYUEVDVF9FUShEb3VibGVGcm9tRW52KCJpbl9lbnYiLCAwLjcxKSwgMC41MSk7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7Cit9CisKK1RFU1QoU3RyaW5nRnJvbUVudiwgRGVmYXVsdCkgeworICBBU1NFUlRfRVEodW5zZXRlbnYoIkJFTkNITUFSS19OT1RfSU5fRU5WIiksIDApOworICBFWFBFQ1RfU1RSRVEoU3RyaW5nRnJvbUVudigibm90X2luX2VudiIsICJmb28iKSwgImZvbyIpOworfQorCitURVNUKFN0cmluZ0Zyb21FbnYsIFZhbGlkKSB7CisgIEFTU0VSVF9FUShzZXRlbnYoIkJFTkNITUFSS19JTl9FTlYiLCAiZm9vIiwgMSksIDApOworICBFWFBFQ1RfU1RSRVEoU3RyaW5nRnJvbUVudigiaW5fZW52IiwgImJhciIpLCAiZm9vIik7CisgIHVuc2V0ZW52KCJCRU5DSE1BUktfSU5fRU5WIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9jb21wbGV4aXR5X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2NvbXBsZXhpdHlfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjgxZmRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9jb21wbGV4aXR5X3Rlc3QuY2MKQEAgLTAsMCArMSwyMTMgQEAKKyN1bmRlZiBOREVCVUcKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAib3V0cHV0X3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworI2RlZmluZSBBRERfQ09NUExFWElUWV9DQVNFUyguLi4pIFwKKyAgaW50IENPTkNBVChkdW1teSwgX19MSU5FX18pID0gQWRkQ29tcGxleGl0eVRlc3QoX19WQV9BUkdTX18pCisKK2ludCBBZGRDb21wbGV4aXR5VGVzdChzdGQ6OnN0cmluZyB0ZXN0X25hbWUsIHN0ZDo6c3RyaW5nIGJpZ19vX3Rlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBybXNfdGVzdF9uYW1lLCBzdGQ6OnN0cmluZyBiaWdfbykgeworICBTZXRTdWJzdGl0dXRpb25zKHt7IiVuYW1lIiwgdGVzdF9uYW1lfSwKKyAgICAgICAgICAgICAgICAgICAgeyIlYmlnb19uYW1lIiwgYmlnX29fdGVzdF9uYW1lfSwKKyAgICAgICAgICAgICAgICAgICAgeyIlcm1zX25hbWUiLCBybXNfdGVzdF9uYW1lfSwKKyAgICAgICAgICAgICAgICAgICAgeyIlYmlnb19zdHIiLCAiWyBdKiAlZmxvYXQgIiArIGJpZ19vfSwKKyAgICAgICAgICAgICAgICAgICAgeyIlYmlnbyIsIGJpZ19vfSwKKyAgICAgICAgICAgICAgICAgICAgeyIlcm1zIiwgIlsgXSpbMC05XSsgJSJ9fSk7CisgIEFkZENhc2VzKAorICAgICAgVENfQ29uc29sZU91dCwKKyAgICAgIHt7Il4lYmlnb19uYW1lICViaWdvX3N0ciAlYmlnb19zdHJbIF0qJCJ9LAorICAgICAgIHsiXiViaWdvX25hbWUiLCBNUl9Ob3R9LCAgLy8gQXNzZXJ0IHdlIHdlIGRpZG4ndCBvbmx5IG1hdGNoZWQgYSBuYW1lLgorICAgICAgIHsiXiVybXNfbmFtZSAlcm1zICVybXNbIF0qJCIsIE1SX05leHR9fSk7CisgIEFkZENhc2VzKFRDX0pTT05PdXQsIHt7IlwibmFtZVwiOiBcIiViaWdvX25hbWVcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCIlbmFtZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcImFnZ3JlZ2F0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJcImFnZ3JlZ2F0ZV9uYW1lXCI6IFwiQmlnT1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJjcHVfY29lZmZpY2llbnRcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZWFsX2NvZWZmaWNpZW50XCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IlwiYmlnX29cIjogXCIlYmlnb1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ9IiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IlwibmFtZVwiOiBcIiVybXNfbmFtZVwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIiVuYW1lXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiYWdncmVnYXRlXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IlwiYWdncmVnYXRlX25hbWVcIjogXCJSTVNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7Ilwicm1zXCI6ICVmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CisgIEFkZENhc2VzKFRDX0NTVk91dCwge3siXlwiJWJpZ29fbmFtZVwiLCwlZmxvYXQsJWZsb2F0LCViaWdvLCwsLCwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXlwiJWJpZ29fbmFtZVwiIiwgTVJfTm90fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJeXCIlcm1zX25hbWVcIiwsJWZsb2F0LCVmbG9hdCwsLCwsLCQiLCBNUl9OZXh0fX0pOworICByZXR1cm4gMDsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdGluZyBCaWdPIE8oMSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK3ZvaWQgQk1fQ29tcGxleGl0eV9PMShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSgmaSk7CisgICAgfQorICB9CisgIHN0YXRlLlNldENvbXBsZXhpdHlOKHN0YXRlLnJhbmdlKDApKTsKK30KK0JFTkNITUFSSyhCTV9Db21wbGV4aXR5X08xKS0+UmFuZ2UoMSwgMSA8PCAxOCktPkNvbXBsZXhpdHkoYmVuY2htYXJrOjpvMSk7CitCRU5DSE1BUksoQk1fQ29tcGxleGl0eV9PMSktPlJhbmdlKDEsIDEgPDwgMTgpLT5Db21wbGV4aXR5KCk7CitCRU5DSE1BUksoQk1fQ29tcGxleGl0eV9PMSkKKyAgICAtPlJhbmdlKDEsIDEgPDwgMTgpCisgICAgLT5Db21wbGV4aXR5KFtdKGJlbmNobWFyazo6SXRlcmF0aW9uQ291bnQpIHsgcmV0dXJuIDEuMDsgfSk7CisKK2NvbnN0IGNoYXIgKm9uZV90ZXN0X25hbWUgPSAiQk1fQ29tcGxleGl0eV9PMSI7Citjb25zdCBjaGFyICpiaWdfb18xX3Rlc3RfbmFtZSA9ICJCTV9Db21wbGV4aXR5X08xX0JpZ08iOworY29uc3QgY2hhciAqcm1zX29fMV90ZXN0X25hbWUgPSAiQk1fQ29tcGxleGl0eV9PMV9STVMiOworY29uc3QgY2hhciAqZW51bV9iaWdfb18xID0gIlxcKFswLTldK1xcKSI7CisvLyBGSVhNRTogVG9sZXJhdGUgYm90aCAnKDEpJyBhbmQgJ2xnTicgYXMgb3V0cHV0IHdoZW4gdGhlIGNvbXBsZXhpdHkgaXMgYXV0bworLy8gZGVkdWNlZC4KKy8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2JlbmNobWFyay9pc3N1ZXMvMjcyCitjb25zdCBjaGFyICphdXRvX2JpZ19vXzEgPSAiKFxcKFswLTldK1xcKSl8KGxnTikiOworY29uc3QgY2hhciAqbGFtYmRhX2JpZ19vXzEgPSAiZlxcKE5cXCkiOworCisvLyBBZGQgZW51bSB0ZXN0cworQUREX0NPTVBMRVhJVFlfQ0FTRVMob25lX3Rlc3RfbmFtZSwgYmlnX29fMV90ZXN0X25hbWUsIHJtc19vXzFfdGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgZW51bV9iaWdfb18xKTsKKworLy8gQWRkIGF1dG8gZW51bSB0ZXN0cworQUREX0NPTVBMRVhJVFlfQ0FTRVMob25lX3Rlc3RfbmFtZSwgYmlnX29fMV90ZXN0X25hbWUsIHJtc19vXzFfdGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgYXV0b19iaWdfb18xKTsKKworLy8gQWRkIGxhbWJkYSB0ZXN0cworQUREX0NPTVBMRVhJVFlfQ0FTRVMob25lX3Rlc3RfbmFtZSwgYmlnX29fMV90ZXN0X25hbWUsIHJtc19vXzFfdGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2JpZ19vXzEpOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdGluZyBCaWdPIE8oTikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK3N0ZDo6dmVjdG9yPGludD4gQ29uc3RydWN0UmFuZG9tVmVjdG9yKGludDY0X3Qgc2l6ZSkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIHYucmVzZXJ2ZShzdGF0aWNfY2FzdDxpbnQ+KHNpemUpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICB2LnB1c2hfYmFjayhzdGF0aWNfY2FzdDxpbnQ+KHN0ZDo6cmFuZCgpICUgc2l6ZSkpOworICB9CisgIHJldHVybiB2OworfQorCit2b2lkIEJNX0NvbXBsZXhpdHlfT19OKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGF1dG8gdiA9IENvbnN0cnVjdFJhbmRvbVZlY3RvcihzdGF0ZS5yYW5nZSgwKSk7CisgIC8vIFRlc3Qgd29yc3QgY2FzZSBzY2VuYXJpbyAoaXRlbSBub3QgaW4gdmVjdG9yKQorICBjb25zdCBpbnQ2NF90IGl0ZW1fbm90X2luX3ZlY3RvciA9IHN0YXRlLnJhbmdlKDApICogMjsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGQ6OmZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCBpdGVtX25vdF9pbl92ZWN0b3IpKTsKKyAgfQorICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7Cit9CitCRU5DSE1BUksoQk1fQ29tcGxleGl0eV9PX04pCisgICAgLT5SYW5nZU11bHRpcGxpZXIoMikKKyAgICAtPlJhbmdlKDEgPDwgMTAsIDEgPDwgMTYpCisgICAgLT5Db21wbGV4aXR5KGJlbmNobWFyazo6b04pOworQkVOQ0hNQVJLKEJNX0NvbXBsZXhpdHlfT19OKQorICAgIC0+UmFuZ2VNdWx0aXBsaWVyKDIpCisgICAgLT5SYW5nZSgxIDw8IDEwLCAxIDw8IDE2KQorICAgIC0+Q29tcGxleGl0eShbXShiZW5jaG1hcms6Okl0ZXJhdGlvbkNvdW50IG4pIC0+IGRvdWJsZSB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihuKTsKKyAgICB9KTsKK0JFTkNITUFSSyhCTV9Db21wbGV4aXR5X09fTikKKyAgICAtPlJhbmdlTXVsdGlwbGllcigyKQorICAgIC0+UmFuZ2UoMSA8PCAxMCwgMSA8PCAxNikKKyAgICAtPkNvbXBsZXhpdHkoKTsKKworY29uc3QgY2hhciAqbl90ZXN0X25hbWUgPSAiQk1fQ29tcGxleGl0eV9PX04iOworY29uc3QgY2hhciAqYmlnX29fbl90ZXN0X25hbWUgPSAiQk1fQ29tcGxleGl0eV9PX05fQmlnTyI7Citjb25zdCBjaGFyICpybXNfb19uX3Rlc3RfbmFtZSA9ICJCTV9Db21wbGV4aXR5X09fTl9STVMiOworY29uc3QgY2hhciAqZW51bV9hdXRvX2JpZ19vX24gPSAiTiI7Citjb25zdCBjaGFyICpsYW1iZGFfYmlnX29fbiA9ICJmXFwoTlxcKSI7CisKKy8vIEFkZCBlbnVtIHRlc3RzCitBRERfQ09NUExFWElUWV9DQVNFUyhuX3Rlc3RfbmFtZSwgYmlnX29fbl90ZXN0X25hbWUsIHJtc19vX25fdGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgZW51bV9hdXRvX2JpZ19vX24pOworCisvLyBBZGQgbGFtYmRhIHRlc3RzCitBRERfQ09NUExFWElUWV9DQVNFUyhuX3Rlc3RfbmFtZSwgYmlnX29fbl90ZXN0X25hbWUsIHJtc19vX25fdGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2JpZ19vX24pOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3RpbmcgQmlnTyBPKE4qbGdOKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK3N0YXRpYyB2b2lkIEJNX0NvbXBsZXhpdHlfT19OX2xvZ19OKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGF1dG8gdiA9IENvbnN0cnVjdFJhbmRvbVZlY3RvcihzdGF0ZS5yYW5nZSgwKSk7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBzdGQ6OnNvcnQodi5iZWdpbigpLCB2LmVuZCgpKTsKKyAgfQorICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7Cit9CitzdGF0aWMgY29uc3QgZG91YmxlIGtMb2cyRSA9IDEuNDQyNjk1MDQwODg4OTYzNDA3MzY7CitCRU5DSE1BUksoQk1fQ29tcGxleGl0eV9PX05fbG9nX04pCisgICAgLT5SYW5nZU11bHRpcGxpZXIoMikKKyAgICAtPlJhbmdlKDEgPDwgMTAsIDEgPDwgMTYpCisgICAgLT5Db21wbGV4aXR5KGJlbmNobWFyazo6b05Mb2dOKTsKK0JFTkNITUFSSyhCTV9Db21wbGV4aXR5X09fTl9sb2dfTikKKyAgICAtPlJhbmdlTXVsdGlwbGllcigyKQorICAgIC0+UmFuZ2UoMSA8PCAxMCwgMSA8PCAxNikKKyAgICAtPkNvbXBsZXhpdHkoW10oYmVuY2htYXJrOjpJdGVyYXRpb25Db3VudCBuKSB7CisgICAgICByZXR1cm4ga0xvZzJFICogbiAqIGxvZyhzdGF0aWNfY2FzdDxkb3VibGU+KG4pKTsKKyAgICB9KTsKK0JFTkNITUFSSyhCTV9Db21wbGV4aXR5X09fTl9sb2dfTikKKyAgICAtPlJhbmdlTXVsdGlwbGllcigyKQorICAgIC0+UmFuZ2UoMSA8PCAxMCwgMSA8PCAxNikKKyAgICAtPkNvbXBsZXhpdHkoKTsKKworY29uc3QgY2hhciAqbl9sZ19uX3Rlc3RfbmFtZSA9ICJCTV9Db21wbGV4aXR5X09fTl9sb2dfTiI7Citjb25zdCBjaGFyICpiaWdfb19uX2xnX25fdGVzdF9uYW1lID0gIkJNX0NvbXBsZXhpdHlfT19OX2xvZ19OX0JpZ08iOworY29uc3QgY2hhciAqcm1zX29fbl9sZ19uX3Rlc3RfbmFtZSA9ICJCTV9Db21wbGV4aXR5X09fTl9sb2dfTl9STVMiOworY29uc3QgY2hhciAqZW51bV9hdXRvX2JpZ19vX25fbGdfbiA9ICJObGdOIjsKK2NvbnN0IGNoYXIgKmxhbWJkYV9iaWdfb19uX2xnX24gPSAiZlxcKE5cXCkiOworCisvLyBBZGQgZW51bSB0ZXN0cworQUREX0NPTVBMRVhJVFlfQ0FTRVMobl9sZ19uX3Rlc3RfbmFtZSwgYmlnX29fbl9sZ19uX3Rlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHJtc19vX25fbGdfbl90ZXN0X25hbWUsIGVudW1fYXV0b19iaWdfb19uX2xnX24pOworCisvLyBBZGQgbGFtYmRhIHRlc3RzCitBRERfQ09NUExFWElUWV9DQVNFUyhuX2xnX25fdGVzdF9uYW1lLCBiaWdfb19uX2xnX25fdGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgcm1zX29fbl9sZ19uX3Rlc3RfbmFtZSwgbGFtYmRhX2JpZ19vX25fbGdfbik7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tIFRlc3RpbmcgZm9ybWF0dGluZyBvZiBDb21wbGV4aXR5IHdpdGggY2FwdHVyZWQgYXJncyAtLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9Db21wbGV4aXR5Q2FwdHVyZUFyZ3MoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUsIGludCBuKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAvLyBUaGlzIHRlc3QgcmVxdWlyZXMgYSBub24temVybyBDUFUgdGltZSB0byBhdm9pZCBkaXZpZGUtYnktemVybworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9CisgIHN0YXRlLlNldENvbXBsZXhpdHlOKG4pOworfQorCitCRU5DSE1BUktfQ0FQVFVSRShCTV9Db21wbGV4aXR5Q2FwdHVyZUFyZ3MsIGNhcHR1cmVfdGVzdCwgMTAwKQorICAgIC0+Q29tcGxleGl0eShiZW5jaG1hcms6Om9OKQorICAgIC0+UmFuZ2VzKHt7MSwgMn0sIHszLCA0fX0pOworCitjb25zdCBzdGQ6OnN0cmluZyBjb21wbGV4aXR5X2NhcHR1cmVfbmFtZSA9CisgICAgIkJNX0NvbXBsZXhpdHlDYXB0dXJlQXJncy9jYXB0dXJlX3Rlc3QiOworCitBRERfQ09NUExFWElUWV9DQVNFUyhjb21wbGV4aXR5X2NhcHR1cmVfbmFtZSwgY29tcGxleGl0eV9jYXB0dXJlX25hbWUgKyAiX0JpZ08iLAorICAgICAgICAgICAgICAgICAgICAgY29tcGxleGl0eV9jYXB0dXJlX25hbWUgKyAiX1JNUyIsICJOIik7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBURVNUIENBU0VTIEVORCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeyBSdW5PdXRwdXRUZXN0cyhhcmdjLCBhcmd2KTsgfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9jeHgwM190ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9jeHgwM190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzlhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2N4eDAzX3Rlc3QuY2MKQEAgLTAsMCArMSw2MyBAQAorI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNlcnJvciBDKysxMSBvciBncmVhdGVyIGRldGVjdGVkLiBTaG91bGQgYmUgQysrMDMuCisjZW5kaWYKKworI2lmZGVmIEJFTkNITUFSS19IQVNfQ1hYMTEKKyNlcnJvciBDKysxMSBvciBncmVhdGVyIGRldGVjdGVkIGJ5IHRoZSBsaWJyYXJ5LiBCRU5DSE1BUktfSEFTX0NYWDExIGlzIGRlZmluZWQuCisjZW5kaWYKKwordm9pZCBCTV9lbXB0eShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICB3aGlsZSAoc3RhdGUuS2VlcFJ1bm5pbmcoKSkgeworICAgIHZvbGF0aWxlIGJlbmNobWFyazo6SXRlcmF0aW9uQ291bnQgeCA9IHN0YXRlLml0ZXJhdGlvbnMoKTsKKyAgICAoKHZvaWQpeCk7CisgIH0KK30KK0JFTkNITUFSSyhCTV9lbXB0eSk7CisKKy8vIFRoZSBuZXcgQysrMTEgaW50ZXJmYWNlIGZvciBhcmdzL3JhbmdlcyByZXF1aXJlcyBpbml0aWFsaXplciBsaXN0IHN1cHBvcnQuCisvLyBUaGVyZWZvcmUgd2UgcHJvdmlkZSB0aGUgb2xkIGludGVyZmFjZSB0byBzdXBwb3J0IEMrKzAzLgordm9pZCBCTV9vbGRfYXJnX3JhbmdlX2ludGVyZmFjZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBhc3NlcnQoKHN0YXRlLnJhbmdlKDApID09IDEgJiYgc3RhdGUucmFuZ2UoMSkgPT0gMikgfHwKKyAgICAgICAgIChzdGF0ZS5yYW5nZSgwKSA9PSA1ICYmIHN0YXRlLnJhbmdlKDEpID09IDYpKTsKKyAgd2hpbGUgKHN0YXRlLktlZXBSdW5uaW5nKCkpIHsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX29sZF9hcmdfcmFuZ2VfaW50ZXJmYWNlKS0+QXJnUGFpcigxLCAyKS0+UmFuZ2VQYWlyKDUsIDUsIDYsIDYpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK3ZvaWQgQk1fdGVtcGxhdGUyKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIEJNX2VtcHR5KHN0YXRlKTsKK30KK0JFTkNITUFSS19URU1QTEFURTIoQk1fdGVtcGxhdGUyLCBpbnQsIGxvbmcpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgQk1fdGVtcGxhdGUxKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIEJNX2VtcHR5KHN0YXRlKTsKK30KK0JFTkNITUFSS19URU1QTEFURShCTV90ZW1wbGF0ZTEsIGxvbmcpOworQkVOQ0hNQVJLX1RFTVBMQVRFMShCTV90ZW1wbGF0ZTEsIGludCk7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IEJNX0ZpeHR1cmUgOiBwdWJsaWMgOjpiZW5jaG1hcms6OkZpeHR1cmUgeworfTsKKworQkVOQ0hNQVJLX1RFTVBMQVRFX0YoQk1fRml4dHVyZSwgQk1fdGVtcGxhdGUxLCBsb25nKShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBCTV9lbXB0eShzdGF0ZSk7Cit9CitCRU5DSE1BUktfVEVNUExBVEUxX0YoQk1fRml4dHVyZSwgQk1fdGVtcGxhdGUyLCBpbnQpKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIEJNX2VtcHR5KHN0YXRlKTsKK30KKwordm9pZCBCTV9jb3VudGVycyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIEJNX2VtcHR5KHN0YXRlKTsKKyAgICBzdGF0ZS5jb3VudGVyc1siRm9vIl0gPSAyOworfQorQkVOQ0hNQVJLKEJNX2NvdW50ZXJzKTsKKworQkVOQ0hNQVJLX01BSU4oKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvZGlhZ25vc3RpY3NfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvZGlhZ25vc3RpY3NfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDY0YTMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9kaWFnbm9zdGljc190ZXN0LmNjCkBAIC0wLDAgKzEsODAgQEAKKy8vIFRlc3Rpbmc6CisvLyAgIFN0YXRlOjpQYXVzZVRpbWluZygpCisvLyAgIFN0YXRlOjpSZXN1bWVUaW1pbmcoKQorLy8gVGVzdCB0aGF0IENIRUNLJ3Mgd2l0aGluIHRoZXNlIGZ1bmN0aW9uIGRpYWdub3NlIHdoZW4gdGhleSBhcmUgY2FsbGVkCisvLyBvdXRzaWRlIG9mIHRoZSBLZWVwUnVubmluZygpIGxvb3AuCisvLworLy8gTk9URTogVXNlcnMgc2hvdWxkIE5PVCBpbmNsdWRlIG9yIHVzZSBzcmMvY2hlY2suaC4gVGhpcyBpcyBvbmx5IGRvbmUgaW4KKy8vIG9yZGVyIHRvIHRlc3QgbGlicmFyeSBpbnRlcm5hbHMuCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgIi4uL3NyYy9jaGVjay5oIgorI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRVhDRVBUSU9OUykKKyNkZWZpbmUgVEVTVF9IQVNfTk9fRVhDRVBUSU9OUworI2VuZGlmCisKK3ZvaWQgVGVzdEhhbmRsZXIoKSB7CisjaWZuZGVmIFRFU1RfSEFTX05PX0VYQ0VQVElPTlMKKyAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiIik7CisjZWxzZQorICBzdGQ6OmFib3J0KCk7CisjZW5kaWYKK30KKwordm9pZCB0cnlfaW52YWxpZF9wYXVzZV9yZXN1bWUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyNpZiAhZGVmaW5lZChURVNUX0JFTkNITUFSS19MSUJSQVJZX0hBU19OT19BU1NFUlRJT05TKSAmJiAhZGVmaW5lZChURVNUX0hBU19OT19FWENFUFRJT05TKQorICB0cnkgeworICAgIHN0YXRlLlBhdXNlVGltaW5nKCk7CisgICAgc3RkOjphYm9ydCgpOworICB9IGNhdGNoIChzdGQ6OmxvZ2ljX2Vycm9yIGNvbnN0JikgeworICB9CisgIHRyeSB7CisgICAgc3RhdGUuUmVzdW1lVGltaW5nKCk7CisgICAgc3RkOjphYm9ydCgpOworICB9IGNhdGNoIChzdGQ6OmxvZ2ljX2Vycm9yIGNvbnN0JikgeworICB9CisjZWxzZQorICAodm9pZClzdGF0ZTsgIC8vIGF2b2lkIHVudXNlZCB3YXJuaW5nCisjZW5kaWYKK30KKwordm9pZCBCTV9kaWFnbm9zdGljX3Rlc3QoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RhdGljIGJvb2wgY2FsbGVkX29uY2UgPSBmYWxzZTsKKworICBpZiAoY2FsbGVkX29uY2UgPT0gZmFsc2UpIHRyeV9pbnZhbGlkX3BhdXNlX3Jlc3VtZShzdGF0ZSk7CisKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9CisKKyAgaWYgKGNhbGxlZF9vbmNlID09IGZhbHNlKSB0cnlfaW52YWxpZF9wYXVzZV9yZXN1bWUoc3RhdGUpOworCisgIGNhbGxlZF9vbmNlID0gdHJ1ZTsKK30KK0JFTkNITUFSSyhCTV9kaWFnbm9zdGljX3Rlc3QpOworCisKK3ZvaWQgQk1fZGlhZ25vc3RpY190ZXN0X2tlZXBfcnVubmluZyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBzdGF0aWMgYm9vbCBjYWxsZWRfb25jZSA9IGZhbHNlOworCisgIGlmIChjYWxsZWRfb25jZSA9PSBmYWxzZSkgdHJ5X2ludmFsaWRfcGF1c2VfcmVzdW1lKHN0YXRlKTsKKworICB3aGlsZShzdGF0ZS5LZWVwUnVubmluZygpKSB7CisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHN0YXRlLml0ZXJhdGlvbnMoKSk7CisgIH0KKworICBpZiAoY2FsbGVkX29uY2UgPT0gZmFsc2UpIHRyeV9pbnZhbGlkX3BhdXNlX3Jlc3VtZShzdGF0ZSk7CisKKyAgY2FsbGVkX29uY2UgPSB0cnVlOworfQorQkVOQ0hNQVJLKEJNX2RpYWdub3N0aWNfdGVzdF9rZWVwX3J1bm5pbmcpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGJlbmNobWFyazo6aW50ZXJuYWw6OkdldEFib3J0SGFuZGxlcigpID0gJlRlc3RIYW5kbGVyOworICBiZW5jaG1hcms6OkluaXRpYWxpemUoJmFyZ2MsIGFyZ3YpOworICBiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvZGlzcGxheV9hZ2dyZWdhdGVzX29ubHlfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvZGlzcGxheV9hZ2dyZWdhdGVzX29ubHlfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM2ZDNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9kaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seV90ZXN0LmNjCkBAIC0wLDAgKzEsNDMgQEAKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAib3V0cHV0X3Rlc3QuaCIKKworLy8gT2sgdGhpcyB0ZXN0IGlzIHN1cGVyIHVnbHkuIFdlIHdhbnQgdG8gY2hlY2sgd2hhdCBoYXBwZW5zIHdpdGggdGhlIGZpbGUKKy8vIHJlcG9ydGVyIGluIHRoZSBwcmVzZW5jZSBvZiBEaXNwbGF5QWdncmVnYXRlc09ubHkoKS4KKy8vIFdlIGRvIG5vdCBjYXJlIGFib3V0IGNvbnNvbGUgb3V0cHV0LCB0aGUgbm9ybWFsIHRlc3RzIGNoZWNrIHRoYXQgYWxyZWFkeS4KKwordm9pZCBCTV9TdW1tYXJ5UmVwZWF0KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX1N1bW1hcnlSZXBlYXQpLT5SZXBldGl0aW9ucygzKS0+RGlzcGxheUFnZ3JlZ2F0ZXNPbmx5KCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0ID0gR2V0RmlsZVJlcG9ydGVyT3V0cHV0KGFyZ2MsIGFyZ3YpOworCisgIGlmIChTdWJzdHJDbnQob3V0cHV0LCAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjMiKSAhPSA2IHx8CisgICAgICBTdWJzdHJDbnQob3V0cHV0LCAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNcIiIpICE9IDMgfHwKKyAgICAgIFN1YnN0ckNudChvdXRwdXQsICJcIm5hbWVcIjogXCJCTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6M19tZWFuXCIiKSAhPSAxIHx8CisgICAgICBTdWJzdHJDbnQob3V0cHV0LCAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNfbWVkaWFuXCIiKSAhPQorICAgICAgICAgIDEgfHwKKyAgICAgIFN1YnN0ckNudChvdXRwdXQsICJcIm5hbWVcIjogXCJCTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6M19zdGRkZXZcIiIpICE9CisgICAgICAgICAgMSkgeworICAgIHN0ZDo6Y291dCA8PCAiUHJlY29uZGl0aW9uIG1pc21hdGNoLiBFeHBlY3RlZCB0byBvbmx5IGZpbmQgNiAiCisgICAgICAgICAgICAgICAgICJvY2N1cnJlbmNlcyBvZiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozXCIgc3Vic3RyaW5nOlxuIgorICAgICAgICAgICAgICAgICAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNcIiwgIgorICAgICAgICAgICAgICAgICAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNcIiwgIgorICAgICAgICAgICAgICAgICAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNcIiwgIgorICAgICAgICAgICAgICAgICAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNfbWVhblwiLCAiCisgICAgICAgICAgICAgICAgICJcIm5hbWVcIjogXCJCTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6M19tZWRpYW5cIiwgIgorICAgICAgICAgICAgICAgICAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNfc3RkZGV2XCJcblRoZSBlbnRpcmUgIgorICAgICAgICAgICAgICAgICAib3V0cHV0OlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgb3V0cHV0OworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2Rvbm90b3B0aW1pemVfYXNzZW1ibHlfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvZG9ub3RvcHRpbWl6ZV9hc3NlbWJseV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjBiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2Rvbm90b3B0aW1pemVfYXNzZW1ibHlfdGVzdC5jYwpAQCAtMCwwICsxLDE2MyBAQAorI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcmV0dXJuLXR5cGUiCisjZW5kaWYKKworZXh0ZXJuICJDIiB7CisKK2V4dGVybiBpbnQgRXh0ZXJuSW50OworZXh0ZXJuIGludCBFeHRlcm5JbnQyOworZXh0ZXJuIGludCBFeHRlcm5JbnQzOworCitpbmxpbmUgaW50IEFkZDQyKGludCB4KSB7IHJldHVybiB4ICsgNDI7IH0KKworc3RydWN0IE5vdFRyaXZpYWxseUNvcHlhYmxlIHsKKyAgTm90VHJpdmlhbGx5Q29weWFibGUoKTsKKyAgZXhwbGljaXQgTm90VHJpdmlhbGx5Q29weWFibGUoaW50IHgpIDogdmFsdWUoeCkge30KKyAgTm90VHJpdmlhbGx5Q29weWFibGUoTm90VHJpdmlhbGx5Q29weWFibGUgY29uc3QmKTsKKyAgaW50IHZhbHVlOworfTsKKworc3RydWN0IExhcmdlIHsKKyAgaW50IHZhbHVlOworICBpbnQgZGF0YVsyXTsKK307CisKK30KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3dpdGhfcnZhbHVlOgorZXh0ZXJuICJDIiB2b2lkIHRlc3Rfd2l0aF9ydmFsdWUoKSB7CisgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShBZGQ0MigwKSk7CisgIC8vIENIRUNLOiBtb3ZsICQ0MiwgJWVheAorICAvLyBDSEVDSzogcmV0Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3dpdGhfbGFyZ2VfcnZhbHVlOgorZXh0ZXJuICJDIiB2b2lkIHRlc3Rfd2l0aF9sYXJnZV9ydmFsdWUoKSB7CisgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShMYXJnZXtFeHRlcm5JbnQsIHtFeHRlcm5JbnQsIEV4dGVybkludH19KTsKKyAgLy8gQ0hFQ0s6IEV4dGVybkludCglcmlwKQorICAvLyBDSEVDSzogbW92bCAlZWF4LCAte3tbMC05XSt9fSglW1tSRUc6W2Etel0rXV0KKyAgLy8gQ0hFQ0s6IG1vdmwgJWVheCwgLXt7WzAtOV0rfX0oJVtbUkVHXV0pCisgIC8vIENIRUNLOiBtb3ZsICVlYXgsIC17e1swLTldK319KCVbW1JFR11dKQorICAvLyBDSEVDSzogcmV0Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3dpdGhfbm9uX3RyaXZpYWxfcnZhbHVlOgorZXh0ZXJuICJDIiB2b2lkIHRlc3Rfd2l0aF9ub25fdHJpdmlhbF9ydmFsdWUoKSB7CisgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShOb3RUcml2aWFsbHlDb3B5YWJsZShFeHRlcm5JbnQpKTsKKyAgLy8gQ0hFQ0s6IG1vdnt7bHxxfX0gRXh0ZXJuSW50KCVyaXApCisgIC8vIENIRUNLOiByZXQKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfd2l0aF9sdmFsdWU6CitleHRlcm4gIkMiIHZvaWQgdGVzdF93aXRoX2x2YWx1ZSgpIHsKKyAgaW50IHggPSAxMDE7CisgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh4KTsKKyAgLy8gQ0hFQ0stR05VOiBtb3ZsICQxMDEsICVlYXgKKyAgLy8gQ0hFQ0stQ0xBTkc6IG1vdmwgJDEwMSwgLXt7WzAtOV0rfX0oJVtbUkVHOlthLXpdK11dKQorICAvLyBDSEVDSzogcmV0Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3dpdGhfbGFyZ2VfbHZhbHVlOgorZXh0ZXJuICJDIiB2b2lkIHRlc3Rfd2l0aF9sYXJnZV9sdmFsdWUoKSB7CisgIExhcmdlIEx7RXh0ZXJuSW50LCB7RXh0ZXJuSW50LCBFeHRlcm5JbnR9fTsKKyAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKEwpOworICAvLyBDSEVDSzogRXh0ZXJuSW50KCVyaXApCisgIC8vIENIRUNLOiBtb3ZsICVlYXgsIC17e1swLTldK319KCVbW1JFRzpbYS16XStdXSkKKyAgLy8gQ0hFQ0s6IG1vdmwgJWVheCwgLXt7WzAtOV0rfX0oJVtbUkVHXV0pCisgIC8vIENIRUNLOiBtb3ZsICVlYXgsIC17e1swLTldK319KCVbW1JFR11dKQorICAvLyBDSEVDSzogcmV0Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3dpdGhfbm9uX3RyaXZpYWxfbHZhbHVlOgorZXh0ZXJuICJDIiB2b2lkIHRlc3Rfd2l0aF9ub25fdHJpdmlhbF9sdmFsdWUoKSB7CisgIE5vdFRyaXZpYWxseUNvcHlhYmxlIE5UQyhFeHRlcm5JbnQpOworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoTlRDKTsKKyAgLy8gQ0hFQ0s6IEV4dGVybkludCglcmlwKQorICAvLyBDSEVDSzogbW92bCAlZWF4LCAte3tbMC05XSt9fSglW1tSRUc6W2Etel0rXV0pCisgIC8vIENIRUNLOiByZXQKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfd2l0aF9jb25zdF9sdmFsdWU6CitleHRlcm4gIkMiIHZvaWQgdGVzdF93aXRoX2NvbnN0X2x2YWx1ZSgpIHsKKyAgY29uc3QgaW50IHggPSAxMjM7CisgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh4KTsKKyAgLy8gQ0hFQ0s6IG1vdmwgJDEyMywgJWVheAorICAvLyBDSEVDSzogcmV0Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3dpdGhfbGFyZ2VfY29uc3RfbHZhbHVlOgorZXh0ZXJuICJDIiB2b2lkIHRlc3Rfd2l0aF9sYXJnZV9jb25zdF9sdmFsdWUoKSB7CisgIGNvbnN0IExhcmdlIEx7RXh0ZXJuSW50LCB7RXh0ZXJuSW50LCBFeHRlcm5JbnR9fTsKKyAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKEwpOworICAvLyBDSEVDSzogRXh0ZXJuSW50KCVyaXApCisgIC8vIENIRUNLOiBtb3ZsICVlYXgsIC17e1swLTldK319KCVbW1JFRzpbYS16XStdXSkKKyAgLy8gQ0hFQ0s6IG1vdmwgJWVheCwgLXt7WzAtOV0rfX0oJVtbUkVHXV0pCisgIC8vIENIRUNLOiBtb3ZsICVlYXgsIC17e1swLTldK319KCVbW1JFR11dKQorICAvLyBDSEVDSzogcmV0Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3dpdGhfbm9uX3RyaXZpYWxfY29uc3RfbHZhbHVlOgorZXh0ZXJuICJDIiB2b2lkIHRlc3Rfd2l0aF9ub25fdHJpdmlhbF9jb25zdF9sdmFsdWUoKSB7CisgIGNvbnN0IE5vdFRyaXZpYWxseUNvcHlhYmxlIE9iaihFeHRlcm5JbnQpOworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoT2JqKTsKKyAgLy8gQ0hFQ0s6IG1vdnt7cXxsfX0gRXh0ZXJuSW50KCVyaXApCisgIC8vIENIRUNLOiByZXQKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfZGl2X2J5X3R3bzoKK2V4dGVybiAiQyIgaW50IHRlc3RfZGl2X2J5X3R3byhpbnQgaW5wdXQpIHsKKyAgaW50IGRpdmlzb3IgPSAyOworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoZGl2aXNvcik7CisgIHJldHVybiBpbnB1dCAvIGRpdmlzb3I7CisgIC8vIENIRUNLOiBtb3ZsICQyLCBbW0RFU1Q6LipdXQorICAvLyBDSEVDSzogaWRpdmwgW1tERVNUXV0KKyAgLy8gQ0hFQ0s6IHJldAorfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF9pbmNfaW50ZWdlcjoKK2V4dGVybiAiQyIgaW50IHRlc3RfaW5jX2ludGVnZXIoKSB7CisgIGludCB4ID0gMDsKKyAgZm9yIChpbnQgaT0wOyBpIDwgNTsgKytpKQorICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSgrK3gpOworICAvLyBDSEVDSzogbW92bCAkMSwgW1tERVNUOi4qXV0KKyAgLy8gQ0hFQ0s6IHt7KGFkZGwgXCQxLHxpbmNsKX19IFtbREVTVF1dCisgIC8vIENIRUNLOiB7eyhhZGRsIFwkMSx8aW5jbCl9fSBbW0RFU1RdXQorICAvLyBDSEVDSzoge3soYWRkbCBcJDEsfGluY2wpfX0gW1tERVNUXV0KKyAgLy8gQ0hFQ0s6IHt7KGFkZGwgXCQxLHxpbmNsKX19IFtbREVTVF1dCisgIC8vIENIRUNLLUNMQU5HOiBtb3ZsIFtbREVTVF1dLCAlZWF4CisgIC8vIENIRUNLOiByZXQKKyAgcmV0dXJuIHg7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3BvaW50ZXJfcnZhbHVlCitleHRlcm4gIkMiIHZvaWQgdGVzdF9wb2ludGVyX3J2YWx1ZSgpIHsKKyAgLy8gQ0hFQ0s6IG1vdmwgJDQyLCBbW0RFU1Q6LipdXQorICAvLyBDSEVDSzogbGVhcSBbW0RFU1RdXSwgJXJheAorICAvLyBDSEVDSy1DTEFORzogbW92cSAlcmF4LCAte3tbMC05XSt9fSglW1tSRUc6W2Etel0rXV0pCisgIC8vIENIRUNLOiByZXQKKyAgaW50IHggPSA0MjsKKyAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKCZ4KTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfcG9pbnRlcl9jb25zdF9sdmFsdWU6CitleHRlcm4gIkMiIHZvaWQgdGVzdF9wb2ludGVyX2NvbnN0X2x2YWx1ZSgpIHsKKyAgLy8gQ0hFQ0s6IG1vdmwgJDQyLCBbW0RFU1Q6LipdXQorICAvLyBDSEVDSzogbGVhcSBbW0RFU1RdXSwgJXJheAorICAvLyBDSEVDSy1DTEFORzogbW92cSAlcmF4LCAte3tbMC05XSt9fSglW1tSRUc6W2Etel0rXV0pCisgIC8vIENIRUNLOiByZXQKKyAgaW50IHggPSA0MjsKKyAgaW50ICogY29uc3QgeHAgPSAmeDsKKyAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHhwKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfcG9pbnRlcl9sdmFsdWU6CitleHRlcm4gIkMiIHZvaWQgdGVzdF9wb2ludGVyX2x2YWx1ZSgpIHsKKyAgLy8gQ0hFQ0s6IG1vdmwgJDQyLCBbW0RFU1Q6LipdXQorICAvLyBDSEVDSzogbGVhcSBbW0RFU1RdXSwgJXJheAorICAvLyBDSEVDSy1DTEFORzogbW92cSAlcmF4LCAte3tbMC05XSt9fSglW1tSRUc6W2EteitdK11dKQorICAvLyBDSEVDSzogcmV0CisgIGludCB4ID0gNDI7CisgIGludCAqeHAgPSAmeDsKKyAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHhwKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvZG9ub3RvcHRpbWl6ZV90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9kb25vdG9wdGltaXplX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlOTJkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvZG9ub3RvcHRpbWl6ZV90ZXN0LmNjCkBAIC0wLDAgKzEsNTIgQEAKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgeworI2lmIGRlZmluZWQoX19HTlVDX18pCitzdGQ6OnVpbnQ2NF90IGRvdWJsZV91cChjb25zdCBzdGQ6OnVpbnQ2NF90IHgpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7CisjZW5kaWYKK3N0ZDo6dWludDY0X3QgZG91YmxlX3VwKGNvbnN0IHN0ZDo6dWludDY0X3QgeCkgeyByZXR1cm4geCAqIDI7IH0KK30KKworLy8gVXNpbmcgRG9Ob3RPcHRpbWl6ZSBvbiB0eXBlcyBsaWtlIEJpdFJlZiBzZWVtIHRvIGNhdXNlIGEgbG90IG9mIHByb2JsZW1zCisvLyB3aXRoIHRoZSBpbmxpbmUgYXNzZW1ibHkgb24gYm90aCBHQ0MgYW5kIENsYW5nLgorc3RydWN0IEJpdFJlZiB7CisgIGludCBpbmRleDsKKyAgdW5zaWduZWQgY2hhciAmYnl0ZTsKKworcHVibGljOgorICBzdGF0aWMgQml0UmVmIE1ha2UoKSB7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYXJyWzJdID0ge307CisgICAgQml0UmVmIGIoMSwgYXJyWzBdKTsKKyAgICByZXR1cm4gYjsKKyAgfQorcHJpdmF0ZToKKyAgQml0UmVmKGludCBpLCB1bnNpZ25lZCBjaGFyJiBiKSA6IGluZGV4KGkpLCBieXRlKGIpIHt9Cit9OworCitpbnQgbWFpbihpbnQsIGNoYXIqW10pIHsKKyAgLy8gdGhpcyB0ZXN0IHZlcmlmaWVzIGNvbXBpbGF0aW9uIG9mIERvTm90T3B0aW1pemUoKSBmb3Igc29tZSB0eXBlcworCisgIGNoYXIgYnVmZmVyOFs4XSA9ICIiOworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoYnVmZmVyOCk7CisKKyAgY2hhciBidWZmZXIyMFsyMF0gPSAiIjsKKyAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGJ1ZmZlcjIwKTsKKworICBjaGFyIGJ1ZmZlcjEwMjRbMTAyNF0gPSAiIjsKKyAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGJ1ZmZlcjEwMjQpOworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoJmJ1ZmZlcjEwMjRbMF0pOworCisgIGludCB4ID0gMTIzOworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoeCk7CisgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSgmeCk7CisgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh4ICs9IDQyKTsKKworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoZG91YmxlX3VwKHgpKTsKKworICAvLyBUaGVzZSB0ZXN0cyBhcmUgdG8gZQorICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoQml0UmVmOjpNYWtlKCkpOworICBCaXRSZWYgbHZhbCA9IEJpdFJlZjo6TWFrZSgpOworICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUobHZhbCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2ZpbHRlcl90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9maWx0ZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI3MDY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9maWx0ZXJfdGVzdC5jYwpAQCAtMCwwICsxLDEwNCBAQAorI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgeworCitjbGFzcyBUZXN0UmVwb3J0ZXIgOiBwdWJsaWMgYmVuY2htYXJrOjpDb25zb2xlUmVwb3J0ZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIFJlcG9ydENvbnRleHQoY29uc3QgQ29udGV4dCYgY29udGV4dCkgeworICAgIHJldHVybiBDb25zb2xlUmVwb3J0ZXI6OlJlcG9ydENvbnRleHQoY29udGV4dCk7CisgIH07CisKKyAgdmlydHVhbCB2b2lkIFJlcG9ydFJ1bnMoY29uc3Qgc3RkOjp2ZWN0b3I8UnVuPiYgcmVwb3J0KSB7CisgICAgKytjb3VudF87CisgICAgQ29uc29sZVJlcG9ydGVyOjpSZXBvcnRSdW5zKHJlcG9ydCk7CisgIH07CisKKyAgVGVzdFJlcG9ydGVyKCkgOiBjb3VudF8oMCkge30KKworICB2aXJ0dWFsIH5UZXN0UmVwb3J0ZXIoKSB7fQorCisgIHNpemVfdCBHZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGNvdW50XzsgfQorCisgcHJpdmF0ZToKKyAgbXV0YWJsZSBzaXplX3QgY291bnRfOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZQorCitzdGF0aWMgdm9pZCBOb1ByZWZpeChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhOb1ByZWZpeCk7CisKK3N0YXRpYyB2b2lkIEJNX0ZvbyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9Gb28pOworCitzdGF0aWMgdm9pZCBCTV9CYXIoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9Cit9CitCRU5DSE1BUksoQk1fQmFyKTsKKworc3RhdGljIHZvaWQgQk1fRm9vQmFyKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX0Zvb0Jhcik7CisKK3N0YXRpYyB2b2lkIEJNX0Zvb0JhKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX0Zvb0JhKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGJvb2wgbGlzdF9vbmx5ID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpKQorICAgIGxpc3Rfb25seSB8PSBzdGQ6OnN0cmluZyhhcmd2W2ldKS5maW5kKCItLWJlbmNobWFya19saXN0X3Rlc3RzIikgIT0KKyAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmc6Om5wb3M7CisKKyAgYmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsKKworICBUZXN0UmVwb3J0ZXIgdGVzdF9yZXBvcnRlcjsKKyAgY29uc3Qgc2l6ZV90IHJldHVybmVkX2NvdW50ID0KKyAgICAgIGJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygmdGVzdF9yZXBvcnRlcik7CisKKyAgaWYgKGFyZ2MgPT0gMikgeworICAgIC8vIE1ha2Ugc3VyZSB3ZSByYW4gYWxsIG9mIHRoZSB0ZXN0cworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKGFyZ3ZbMV0pOworICAgIHNpemVfdCBleHBlY3RlZF9yZXR1cm47CisgICAgc3MgPj4gZXhwZWN0ZWRfcmV0dXJuOworCisgICAgaWYgKHJldHVybmVkX2NvdW50ICE9IGV4cGVjdGVkX3JldHVybikgeworICAgICAgc3RkOjpjZXJyIDw8ICJFUlJPUjogRXhwZWN0ZWQgIiA8PCBleHBlY3RlZF9yZXR1cm4KKyAgICAgICAgICAgICAgICA8PCAiIHRlc3RzIHRvIG1hdGNoIHRoZSBmaWx0ZXIgYnV0IHJldHVybmVkX2NvdW50ID0gIgorICAgICAgICAgICAgICAgIDw8IHJldHVybmVkX2NvdW50IDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgZXhwZWN0ZWRfcmVwb3J0cyA9IGxpc3Rfb25seSA/IDAgOiBleHBlY3RlZF9yZXR1cm47CisgICAgY29uc3Qgc2l6ZV90IHJlcG9ydHNfY291bnQgPSB0ZXN0X3JlcG9ydGVyLkdldENvdW50KCk7CisgICAgaWYgKHJlcG9ydHNfY291bnQgIT0gZXhwZWN0ZWRfcmVwb3J0cykgeworICAgICAgc3RkOjpjZXJyIDw8ICJFUlJPUjogRXhwZWN0ZWQgIiA8PCBleHBlY3RlZF9yZXBvcnRzCisgICAgICAgICAgICAgICAgPDwgIiB0ZXN0cyB0byBiZSBydW4gYnV0IHJlcG9ydGVkX2NvdW50ID0gIiA8PCByZXBvcnRzX2NvdW50CisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9maXh0dXJlX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2ZpeHR1cmVfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYyYjEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9maXh0dXJlX3Rlc3QuY2MKQEAgLTAsMCArMSw0OSBAQAorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK2NsYXNzIE15Rml4dHVyZSA6IHB1YmxpYyA6OmJlbmNobWFyazo6Rml4dHVyZSB7CisgcHVibGljOgorICB2b2lkIFNldFVwKGNvbnN0IDo6YmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUudGhyZWFkX2luZGV4ID09IDApIHsKKyAgICAgIGFzc2VydChkYXRhLmdldCgpID09IG51bGxwdHIpOworICAgICAgZGF0YS5yZXNldChuZXcgaW50KDQyKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBUZWFyRG93bihjb25zdCA6OmJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgaWYgKHN0YXRlLnRocmVhZF9pbmRleCA9PSAwKSB7CisgICAgICBhc3NlcnQoZGF0YS5nZXQoKSAhPSBudWxscHRyKTsKKyAgICAgIGRhdGEucmVzZXQoKTsKKyAgICB9CisgIH0KKworICB+TXlGaXh0dXJlKCkgeyBhc3NlcnQoZGF0YSA9PSBudWxscHRyKTsgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxpbnQ+IGRhdGE7Cit9OworCitCRU5DSE1BUktfRihNeUZpeHR1cmUsIEZvbykoYmVuY2htYXJrOjpTdGF0ZSAmc3QpIHsKKyAgYXNzZXJ0KGRhdGEuZ2V0KCkgIT0gbnVsbHB0cik7CisgIGFzc2VydCgqZGF0YSA9PSA0Mik7CisgIGZvciAoYXV0byBfIDogc3QpIHsKKyAgfQorfQorCitCRU5DSE1BUktfREVGSU5FX0YoTXlGaXh0dXJlLCBCYXIpKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgIGlmIChzdC50aHJlYWRfaW5kZXggPT0gMCkgeworICAgIGFzc2VydChkYXRhLmdldCgpICE9IG51bGxwdHIpOworICAgIGFzc2VydCgqZGF0YSA9PSA0Mik7CisgIH0KKyAgZm9yIChhdXRvIF8gOiBzdCkgeworICAgIGFzc2VydChkYXRhLmdldCgpICE9IG51bGxwdHIpOworICAgIGFzc2VydCgqZGF0YSA9PSA0Mik7CisgIH0KKyAgc3QuU2V0SXRlbXNQcm9jZXNzZWQoc3QucmFuZ2UoMCkpOworfQorQkVOQ0hNQVJLX1JFR0lTVEVSX0YoTXlGaXh0dXJlLCBCYXIpLT5BcmcoNDIpOworQkVOQ0hNQVJLX1JFR0lTVEVSX0YoTXlGaXh0dXJlLCBCYXIpLT5BcmcoNDIpLT5UaHJlYWRQZXJDcHUoKTsKKworQkVOQ0hNQVJLX01BSU4oKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvaW50ZXJuYWxfdGhyZWFkaW5nX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2ludGVybmFsX3RocmVhZGluZ190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWQ3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L2ludGVybmFsX3RocmVhZGluZ190ZXN0LmNjCkBAIC0wLDAgKzEsMTg0IEBACisKKyN1bmRlZiBOREVCVUcKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSAiLi4vc3JjL3RpbWVycy5oIgorI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKyNpbmNsdWRlICJvdXRwdXRfdGVzdC5oIgorCitzdGF0aWMgY29uc3Qgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4gdGltZV9mcmFtZSg1MCk7CitzdGF0aWMgY29uc3QgZG91YmxlIHRpbWVfZnJhbWVfaW5fc2VjKAorICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6cmF0aW88MSwgMT4+PigKKyAgICAgICAgdGltZV9mcmFtZSkKKyAgICAgICAgLmNvdW50KCkpOworCit2b2lkIE15QnVzeVNwaW53YWl0KCkgeworICBjb25zdCBhdXRvIHN0YXJ0ID0gYmVuY2htYXJrOjpDaHJvbm9DbG9ja05vdygpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgY29uc3QgYXV0byBub3cgPSBiZW5jaG1hcms6OkNocm9ub0Nsb2NrTm93KCk7CisgICAgY29uc3QgYXV0byBlbGFwc2VkID0gbm93IC0gc3RhcnQ7CisKKyAgICBpZiAoc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjpjaHJvbm86OnNlY29uZHM6OnBlcmlvZD4oZWxhcHNlZCkgPj0KKyAgICAgICAgdGltZV9mcmFtZSkKKyAgICAgIHJldHVybjsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVEVTVCBDQVNFUyBCRUdJTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIEJNX01haW5UaHJlYWQKKwordm9pZCBCTV9NYWluVGhyZWFkKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBNeUJ1c3lTcGlud2FpdCgpOworICAgIHN0YXRlLlNldEl0ZXJhdGlvblRpbWUodGltZV9mcmFtZV9pbl9zZWMpOworICB9CisgIHN0YXRlLmNvdW50ZXJzWyJpbnZ0aW1lIl0gPQorICAgICAgYmVuY2htYXJrOjpDb3VudGVyezEsIGJlbmNobWFyazo6Q291bnRlcjo6a0lzUmF0ZX07Cit9CisKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygxKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygxKS0+VXNlUmVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygxKS0+VXNlTWFudWFsVGltZSgpOworQkVOQ0hNQVJLKEJNX01haW5UaHJlYWQpLT5JdGVyYXRpb25zKDEpLT5UaHJlYWRzKDEpLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkKQorICAgIC0+SXRlcmF0aW9ucygxKQorICAgIC0+VGhyZWFkcygxKQorICAgIC0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCkKKyAgICAtPlVzZVJlYWxUaW1lKCk7CitCRU5DSE1BUksoQk1fTWFpblRocmVhZCkKKyAgICAtPkl0ZXJhdGlvbnMoMSkKKyAgICAtPlRocmVhZHMoMSkKKyAgICAtPk1lYXN1cmVQcm9jZXNzQ1BVVGltZSgpCisgICAgLT5Vc2VNYW51YWxUaW1lKCk7CisKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygyKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygyKS0+VXNlUmVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygyKS0+VXNlTWFudWFsVGltZSgpOworQkVOQ0hNQVJLKEJNX01haW5UaHJlYWQpLT5JdGVyYXRpb25zKDEpLT5UaHJlYWRzKDIpLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkKQorICAgIC0+SXRlcmF0aW9ucygxKQorICAgIC0+VGhyZWFkcygyKQorICAgIC0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCkKKyAgICAtPlVzZVJlYWxUaW1lKCk7CitCRU5DSE1BUksoQk1fTWFpblRocmVhZCkKKyAgICAtPkl0ZXJhdGlvbnMoMSkKKyAgICAtPlRocmVhZHMoMikKKyAgICAtPk1lYXN1cmVQcm9jZXNzQ1BVVGltZSgpCisgICAgLT5Vc2VNYW51YWxUaW1lKCk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIEJNX1dvcmtlclRocmVhZAorCit2b2lkIEJNX1dvcmtlclRocmVhZChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgc3RkOjp0aHJlYWQgV29ya2VyKCZNeUJ1c3lTcGlud2FpdCk7CisgICAgV29ya2VyLmpvaW4oKTsKKyAgICBzdGF0ZS5TZXRJdGVyYXRpb25UaW1lKHRpbWVfZnJhbWVfaW5fc2VjKTsKKyAgfQorICBzdGF0ZS5jb3VudGVyc1siaW52dGltZSJdID0KKyAgICAgIGJlbmNobWFyazo6Q291bnRlcnsxLCBiZW5jaG1hcms6OkNvdW50ZXI6OmtJc1JhdGV9OworfQorCitCRU5DSE1BUksoQk1fV29ya2VyVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygxKTsKK0JFTkNITUFSSyhCTV9Xb3JrZXJUaHJlYWQpLT5JdGVyYXRpb25zKDEpLT5UaHJlYWRzKDEpLT5Vc2VSZWFsVGltZSgpOworQkVOQ0hNQVJLKEJNX1dvcmtlclRocmVhZCktPkl0ZXJhdGlvbnMoMSktPlRocmVhZHMoMSktPlVzZU1hbnVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9Xb3JrZXJUaHJlYWQpLT5JdGVyYXRpb25zKDEpLT5UaHJlYWRzKDEpLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKTsKK0JFTkNITUFSSyhCTV9Xb3JrZXJUaHJlYWQpCisgICAgLT5JdGVyYXRpb25zKDEpCisgICAgLT5UaHJlYWRzKDEpCisgICAgLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKQorICAgIC0+VXNlUmVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9Xb3JrZXJUaHJlYWQpCisgICAgLT5JdGVyYXRpb25zKDEpCisgICAgLT5UaHJlYWRzKDEpCisgICAgLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKQorICAgIC0+VXNlTWFudWFsVGltZSgpOworCitCRU5DSE1BUksoQk1fV29ya2VyVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygyKTsKK0JFTkNITUFSSyhCTV9Xb3JrZXJUaHJlYWQpLT5JdGVyYXRpb25zKDEpLT5UaHJlYWRzKDIpLT5Vc2VSZWFsVGltZSgpOworQkVOQ0hNQVJLKEJNX1dvcmtlclRocmVhZCktPkl0ZXJhdGlvbnMoMSktPlRocmVhZHMoMiktPlVzZU1hbnVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9Xb3JrZXJUaHJlYWQpLT5JdGVyYXRpb25zKDEpLT5UaHJlYWRzKDIpLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKTsKK0JFTkNITUFSSyhCTV9Xb3JrZXJUaHJlYWQpCisgICAgLT5JdGVyYXRpb25zKDEpCisgICAgLT5UaHJlYWRzKDIpCisgICAgLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKQorICAgIC0+VXNlUmVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9Xb3JrZXJUaHJlYWQpCisgICAgLT5JdGVyYXRpb25zKDEpCisgICAgLT5UaHJlYWRzKDIpCisgICAgLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKQorICAgIC0+VXNlTWFudWFsVGltZSgpOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyBCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkCisKK3ZvaWQgQk1fTWFpblRocmVhZEFuZFdvcmtlclRocmVhZChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgc3RkOjp0aHJlYWQgV29ya2VyKCZNeUJ1c3lTcGlud2FpdCk7CisgICAgTXlCdXN5U3BpbndhaXQoKTsKKyAgICBXb3JrZXIuam9pbigpOworICAgIHN0YXRlLlNldEl0ZXJhdGlvblRpbWUodGltZV9mcmFtZV9pbl9zZWMpOworICB9CisgIHN0YXRlLmNvdW50ZXJzWyJpbnZ0aW1lIl0gPQorICAgICAgYmVuY2htYXJrOjpDb3VudGVyezEsIGJlbmNobWFyazo6Q291bnRlcjo6a0lzUmF0ZX07Cit9CisKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygxKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkKQorICAgIC0+SXRlcmF0aW9ucygxKQorICAgIC0+VGhyZWFkcygxKQorICAgIC0+VXNlUmVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkKQorICAgIC0+SXRlcmF0aW9ucygxKQorICAgIC0+VGhyZWFkcygxKQorICAgIC0+VXNlTWFudWFsVGltZSgpOworQkVOQ0hNQVJLKEJNX01haW5UaHJlYWRBbmRXb3JrZXJUaHJlYWQpCisgICAgLT5JdGVyYXRpb25zKDEpCisgICAgLT5UaHJlYWRzKDEpCisgICAgLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkKQorICAgIC0+SXRlcmF0aW9ucygxKQorICAgIC0+VGhyZWFkcygxKQorICAgIC0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCkKKyAgICAtPlVzZVJlYWxUaW1lKCk7CitCRU5DSE1BUksoQk1fTWFpblRocmVhZEFuZFdvcmtlclRocmVhZCkKKyAgICAtPkl0ZXJhdGlvbnMoMSkKKyAgICAtPlRocmVhZHMoMSkKKyAgICAtPk1lYXN1cmVQcm9jZXNzQ1BVVGltZSgpCisgICAgLT5Vc2VNYW51YWxUaW1lKCk7CisKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkKS0+SXRlcmF0aW9ucygxKS0+VGhyZWFkcygyKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkKQorICAgIC0+SXRlcmF0aW9ucygxKQorICAgIC0+VGhyZWFkcygyKQorICAgIC0+VXNlUmVhbFRpbWUoKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkKQorICAgIC0+SXRlcmF0aW9ucygxKQorICAgIC0+VGhyZWFkcygyKQorICAgIC0+VXNlTWFudWFsVGltZSgpOworQkVOQ0hNQVJLKEJNX01haW5UaHJlYWRBbmRXb3JrZXJUaHJlYWQpCisgICAgLT5JdGVyYXRpb25zKDEpCisgICAgLT5UaHJlYWRzKDIpCisgICAgLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKTsKK0JFTkNITUFSSyhCTV9NYWluVGhyZWFkQW5kV29ya2VyVGhyZWFkKQorICAgIC0+SXRlcmF0aW9ucygxKQorICAgIC0+VGhyZWFkcygyKQorICAgIC0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCkKKyAgICAtPlVzZVJlYWxUaW1lKCk7CitCRU5DSE1BUksoQk1fTWFpblRocmVhZEFuZFdvcmtlclRocmVhZCkKKyAgICAtPkl0ZXJhdGlvbnMoMSkKKyAgICAtPlRocmVhZHMoMikKKyAgICAtPk1lYXN1cmVQcm9jZXNzQ1BVVGltZSgpCisgICAgLT5Vc2VNYW51YWxUaW1lKCk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVEVTVCBDQVNFUyBFTkQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeyBSdW5PdXRwdXRUZXN0cyhhcmdjLCBhcmd2KTsgfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9saW5rX21haW5fdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvbGlua19tYWluX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxYWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvbGlua19tYWluX3Rlc3QuY2MKQEAgLTAsMCArMSw4IEBACisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCit2b2lkIEJNX2VtcHR5KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoc3RhdGUuaXRlcmF0aW9ucygpKTsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX2VtcHR5KTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvbWFwX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L21hcF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjc5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L21hcF90ZXN0LmNjCkBAIC0wLDAgKzEsNTcgQEAKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIHsKKworc3RkOjptYXA8aW50LCBpbnQ+IENvbnN0cnVjdFJhbmRvbU1hcChpbnQgc2l6ZSkgeworICBzdGQ6Om1hcDxpbnQsIGludD4gbTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBtLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdGQ6OnJhbmQoKSAlIHNpemUsIHN0ZDo6cmFuZCgpICUgc2l6ZSkpOworICB9CisgIHJldHVybiBtOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQmFzaWMgdmVyc2lvbi4KK3N0YXRpYyB2b2lkIEJNX01hcExvb2t1cChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBjb25zdCBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PGludD4oc3RhdGUucmFuZ2UoMCkpOworICBzdGQ6Om1hcDxpbnQsIGludD4gbTsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIHN0YXRlLlBhdXNlVGltaW5nKCk7CisgICAgbSA9IENvbnN0cnVjdFJhbmRvbU1hcChzaXplKTsKKyAgICBzdGF0ZS5SZXN1bWVUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKG0uZmluZChzdGQ6OnJhbmQoKSAlIHNpemUpKTsKKyAgICB9CisgIH0KKyAgc3RhdGUuU2V0SXRlbXNQcm9jZXNzZWQoc3RhdGUuaXRlcmF0aW9ucygpICogc2l6ZSk7Cit9CitCRU5DSE1BUksoQk1fTWFwTG9va3VwKS0+UmFuZ2UoMSA8PCAzLCAxIDw8IDEyKTsKKworLy8gVXNpbmcgZml4dHVyZXMuCitjbGFzcyBNYXBGaXh0dXJlIDogcHVibGljIDo6YmVuY2htYXJrOjpGaXh0dXJlIHsKKyBwdWJsaWM6CisgIHZvaWQgU2V0VXAoY29uc3QgOjpiZW5jaG1hcms6OlN0YXRlJiBzdCkgeworICAgIG0gPSBDb25zdHJ1Y3RSYW5kb21NYXAoc3RhdGljX2Nhc3Q8aW50PihzdC5yYW5nZSgwKSkpOworICB9CisKKyAgdm9pZCBUZWFyRG93bihjb25zdCA6OmJlbmNobWFyazo6U3RhdGUmKSB7IG0uY2xlYXIoKTsgfQorCisgIHN0ZDo6bWFwPGludCwgaW50PiBtOworfTsKKworQkVOQ0hNQVJLX0RFRklORV9GKE1hcEZpeHR1cmUsIExvb2t1cCkoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgY29uc3QgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRlLnJhbmdlKDApKTsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUobS5maW5kKHN0ZDo6cmFuZCgpICUgc2l6ZSkpOworICAgIH0KKyAgfQorICBzdGF0ZS5TZXRJdGVtc1Byb2Nlc3NlZChzdGF0ZS5pdGVyYXRpb25zKCkgKiBzaXplKTsKK30KK0JFTkNITUFSS19SRUdJU1RFUl9GKE1hcEZpeHR1cmUsIExvb2t1cCktPlJhbmdlKDEgPDwgMywgMSA8PCAxMik7CisKK0JFTkNITUFSS19NQUlOKCk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L21lbW9yeV9tYW5hZ2VyX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L21lbW9yeV9tYW5hZ2VyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiZWQxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvbWVtb3J5X21hbmFnZXJfdGVzdC5jYwpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiLi4vc3JjL2NoZWNrLmgiCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgIm91dHB1dF90ZXN0LmgiCisKK2NsYXNzIFRlc3RNZW1vcnlNYW5hZ2VyIDogcHVibGljIGJlbmNobWFyazo6TWVtb3J5TWFuYWdlciB7CisgIHZvaWQgU3RhcnQoKSB7fQorICB2b2lkIFN0b3AoUmVzdWx0KiByZXN1bHQpIHsKKyAgICByZXN1bHQtPm51bV9hbGxvY3MgPSA0MjsKKyAgICByZXN1bHQtPm1heF9ieXRlc191c2VkID0gNDIwMDA7CisgIH0KK307CisKK3ZvaWQgQk1fZW1wdHkoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9Cit9CitCRU5DSE1BUksoQk1fZW1wdHkpOworCitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX2VtcHR5ICVjb25zb2xlX3JlcG9ydCQifX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsIHt7IlwibmFtZVwiOiBcIkJNX2VtcHR5XCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9lbXB0eVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImFsbG9jc19wZXJfaXRlclwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwibWF4X2J5dGVzX3VzZWRcIjogNDIwMDAkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9lbXB0eVwiLCVjc3ZfcmVwb3J0JCJ9fSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgc3RkOjp1bmlxdWVfcHRyPGJlbmNobWFyazo6TWVtb3J5TWFuYWdlcj4gbW0obmV3IFRlc3RNZW1vcnlNYW5hZ2VyKCkpOworCisgIGJlbmNobWFyazo6UmVnaXN0ZXJNZW1vcnlNYW5hZ2VyKG1tLmdldCgpKTsKKyAgUnVuT3V0cHV0VGVzdHMoYXJnYywgYXJndik7CisgIGJlbmNobWFyazo6UmVnaXN0ZXJNZW1vcnlNYW5hZ2VyKG51bGxwdHIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9tdWx0aXBsZV9yYW5nZXNfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvbXVsdGlwbGVfcmFuZ2VzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1ZjQwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvbXVsdGlwbGVfcmFuZ2VzX3Rlc3QuY2MKQEAgLTAsMCArMSw5NiBAQAorI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgTXVsdGlwbGVSYW5nZXNGaXh0dXJlIDogcHVibGljIDo6YmVuY2htYXJrOjpGaXh0dXJlIHsKKyBwdWJsaWM6CisgIE11bHRpcGxlUmFuZ2VzRml4dHVyZSgpCisgICAgICA6IGV4cGVjdGVkVmFsdWVzKHt7MSwgMywgNX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MSwgMywgOH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MSwgMywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgezIsIDMsIDV9LAorICAgICAgICAgICAgICAgICAgICAgICAgezIsIDMsIDh9LAorICAgICAgICAgICAgICAgICAgICAgICAgezIsIDMsIDE1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsxLCA0LCA1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsxLCA0LCA4fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsxLCA0LCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MiwgNCwgNX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MiwgNCwgOH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MiwgNCwgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgezEsIDcsIDV9LAorICAgICAgICAgICAgICAgICAgICAgICAgezEsIDcsIDh9LAorICAgICAgICAgICAgICAgICAgICAgICAgezEsIDcsIDE1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsyLCA3LCA1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsyLCA3LCA4fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsyLCA3LCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7NywgNiwgM319KSB7fQorCisgIHZvaWQgU2V0VXAoY29uc3QgOjpiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHJhbmdlcyA9IHtzdGF0ZS5yYW5nZSgwKSwgc3RhdGUucmFuZ2UoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJhbmdlKDIpfTsKKworICAgIGFzc2VydChleHBlY3RlZFZhbHVlcy5maW5kKHJhbmdlcykgIT0gZXhwZWN0ZWRWYWx1ZXMuZW5kKCkpOworCisgICAgYWN0dWFsVmFsdWVzLmluc2VydChyYW5nZXMpOworICB9CisKKyAgLy8gTk9URTogVGhpcyBpcyBub3QgVGVhckRvd24gYXMgd2Ugd2FudCB0byBjaGVjayBhZnRlciBfYWxsXyBydW5zIGFyZQorICAvLyBjb21wbGV0ZS4KKyAgdmlydHVhbCB+TXVsdGlwbGVSYW5nZXNGaXh0dXJlKCkgeworICAgIGlmIChhY3R1YWxWYWx1ZXMgIT0gZXhwZWN0ZWRWYWx1ZXMpIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRVhQRUNURURcbiI7CisgICAgICBmb3IgKGF1dG8gdiA6IGV4cGVjdGVkVmFsdWVzKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAieyI7CisgICAgICAgIGZvciAoaW50NjRfdCBpdiA6IHYpIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgaXYgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OmNvdXQgPDwgIn1cbiI7CisgICAgICB9CisgICAgICBzdGQ6OmNvdXQgPDwgIkFDVFVBTFxuIjsKKyAgICAgIGZvciAoYXV0byB2IDogYWN0dWFsVmFsdWVzKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAieyI7CisgICAgICAgIGZvciAoaW50NjRfdCBpdiA6IHYpIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgaXYgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OmNvdXQgPDwgIn1cbiI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RkOjpzZXQ8c3RkOjp2ZWN0b3I8aW50NjRfdD4+IGV4cGVjdGVkVmFsdWVzOworICBzdGQ6OnNldDxzdGQ6OnZlY3RvcjxpbnQ2NF90Pj4gYWN0dWFsVmFsdWVzOworfTsKKworQkVOQ0hNQVJLX0RFRklORV9GKE11bHRpcGxlUmFuZ2VzRml4dHVyZSwgRW1wdHkpKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBpbnQ2NF90IHByb2R1Y3QgPSBzdGF0ZS5yYW5nZSgwKSAqIHN0YXRlLnJhbmdlKDEpICogc3RhdGUucmFuZ2UoMik7CisgICAgZm9yIChpbnQ2NF90IHggPSAwOyB4IDwgcHJvZHVjdDsgeCsrKSB7CisgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoeCk7CisgICAgfQorICB9Cit9CisKK0JFTkNITUFSS19SRUdJU1RFUl9GKE11bHRpcGxlUmFuZ2VzRml4dHVyZSwgRW1wdHkpCisgICAgLT5SYW5nZU11bHRpcGxpZXIoMikKKyAgICAtPlJhbmdlcyh7ezEsIDJ9LCB7MywgN30sIHs1LCAxNX19KQorICAgIC0+QXJncyh7NywgNiwgM30pOworCit2b2lkIEJNX0NoZWNrRGVmYXVsdEFyZ3VtZW50KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgJ3JhbmdlKCknIHdpdGhvdXQgYW4gYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMgJ3JhbmdlKDApJy4KKyAgYXNzZXJ0KHN0YXRlLnJhbmdlKCkgPT0gc3RhdGUucmFuZ2UoMCkpOworICBhc3NlcnQoc3RhdGUucmFuZ2UoKSAhPSBzdGF0ZS5yYW5nZSgxKSk7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX0NoZWNrRGVmYXVsdEFyZ3VtZW50KS0+UmFuZ2VzKHt7MSwgNX0sIHs2LCAxMH19KTsKKworc3RhdGljIHZvaWQgQk1fTXVsdGlwbGVSYW5nZXMoYmVuY2htYXJrOjpTdGF0ZSYgc3QpIHsKKyAgZm9yIChhdXRvIF8gOiBzdCkgeworICB9Cit9CitCRU5DSE1BUksoQk1fTXVsdGlwbGVSYW5nZXMpLT5SYW5nZXMoe3s1LCA1fSwgezYsIDZ9fSk7CisKK0JFTkNITUFSS19NQUlOKCk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L29wdGlvbnNfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3Qvb3B0aW9uc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZmMyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L29wdGlvbnNfdGVzdC5jYwpAQCAtMCwwICsxLDc1IEBACisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpZiBkZWZpbmVkKE5ERUJVRykKKyN1bmRlZiBOREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK3ZvaWQgQk1fYmFzaWMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9Cit9CisKK3ZvaWQgQk1fYmFzaWNfc2xvdyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHNsZWVwX2R1cmF0aW9uKHN0YXRlLnJhbmdlKDApKTsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigKKyAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPihzbGVlcF9kdXJhdGlvbikpOworICB9Cit9CisKK0JFTkNITUFSSyhCTV9iYXNpYyk7CitCRU5DSE1BUksoQk1fYmFzaWMpLT5BcmcoNDIpOworQkVOQ0hNQVJLKEJNX2Jhc2ljX3Nsb3cpLT5BcmcoMTApLT5Vbml0KGJlbmNobWFyazo6a05hbm9zZWNvbmQpOworQkVOQ0hNQVJLKEJNX2Jhc2ljX3Nsb3cpLT5BcmcoMTAwKS0+VW5pdChiZW5jaG1hcms6OmtNaWNyb3NlY29uZCk7CitCRU5DSE1BUksoQk1fYmFzaWNfc2xvdyktPkFyZygxMDAwKS0+VW5pdChiZW5jaG1hcms6OmtNaWxsaXNlY29uZCk7CitCRU5DSE1BUksoQk1fYmFzaWMpLT5SYW5nZSgxLCA4KTsKK0JFTkNITUFSSyhCTV9iYXNpYyktPlJhbmdlTXVsdGlwbGllcigyKS0+UmFuZ2UoMSwgOCk7CitCRU5DSE1BUksoQk1fYmFzaWMpLT5EZW5zZVJhbmdlKDEwLCAxNSk7CitCRU5DSE1BUksoQk1fYmFzaWMpLT5BcmdzKHs0MiwgNDJ9KTsKK0JFTkNITUFSSyhCTV9iYXNpYyktPlJhbmdlcyh7ezY0LCA1MTJ9LCB7NjQsIDUxMn19KTsKK0JFTkNITUFSSyhCTV9iYXNpYyktPk1pblRpbWUoMC43KTsKK0JFTkNITUFSSyhCTV9iYXNpYyktPlVzZVJlYWxUaW1lKCk7CitCRU5DSE1BUksoQk1fYmFzaWMpLT5UaHJlYWRSYW5nZSgyLCA0KTsKK0JFTkNITUFSSyhCTV9iYXNpYyktPlRocmVhZFBlckNwdSgpOworQkVOQ0hNQVJLKEJNX2Jhc2ljKS0+UmVwZXRpdGlvbnMoMyk7CitCRU5DSE1BUksoQk1fYmFzaWMpCisgICAgLT5SYW5nZU11bHRpcGxpZXIoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkKKyAgICAtPlJhbmdlKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpLAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCkpOworCisvLyBOZWdhdGl2ZSByYW5nZXMKK0JFTkNITUFSSyhCTV9iYXNpYyktPlJhbmdlKC02NCwgLTEpOworQkVOQ0hNQVJLKEJNX2Jhc2ljKS0+UmFuZ2VNdWx0aXBsaWVyKDQpLT5SYW5nZSgtOCwgOCk7CitCRU5DSE1BUksoQk1fYmFzaWMpLT5EZW5zZVJhbmdlKC0yLCAyLCAxKTsKK0JFTkNITUFSSyhCTV9iYXNpYyktPlJhbmdlcyh7ey02NCwgMX0sIHstOCwgLTF9fSk7CisKK3ZvaWQgQ3VzdG9tQXJncyhiZW5jaG1hcms6OmludGVybmFsOjpCZW5jaG1hcmsqIGIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgYi0+QXJnKGkpOworICB9Cit9CisKK0JFTkNITUFSSyhCTV9iYXNpYyktPkFwcGx5KEN1c3RvbUFyZ3MpOworCit2b2lkIEJNX2V4cGxpY2l0X2l0ZXJhdGlvbl9jb3VudChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAvLyBUZXN0IHRoYXQgYmVuY2htYXJrcyBzcGVjaWZpZWQgd2l0aCBhbiBleHBsaWNpdCBpdGVyYXRpb24gY291bnQgYXJlCisgIC8vIG9ubHkgcnVuIG9uY2UuCisgIHN0YXRpYyBib29sIGludm9rZWRfYmVmb3JlID0gZmFsc2U7CisgIGFzc2VydCghaW52b2tlZF9iZWZvcmUpOworICBpbnZva2VkX2JlZm9yZSA9IHRydWU7CisKKyAgLy8gVGVzdCB0aGF0IHRoZSByZXF1ZXN0ZWQgaXRlcmF0aW9uIGNvdW50IGlzIHJlc3BlY3RlZC4KKyAgYXNzZXJ0KHN0YXRlLm1heF9pdGVyYXRpb25zID09IDQyKTsKKyAgc2l6ZV90IGFjdHVhbF9pdGVyYXRpb25zID0gMDsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkKKyAgICArK2FjdHVhbF9pdGVyYXRpb25zOworICBhc3NlcnQoc3RhdGUuaXRlcmF0aW9ucygpID09IHN0YXRlLm1heF9pdGVyYXRpb25zKTsKKyAgYXNzZXJ0KHN0YXRlLml0ZXJhdGlvbnMoKSA9PSA0Mik7CisKK30KK0JFTkNITUFSSyhCTV9leHBsaWNpdF9pdGVyYXRpb25fY291bnQpLT5JdGVyYXRpb25zKDQyKTsKKworQkVOQ0hNQVJLX01BSU4oKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3Qvb3V0cHV0X3Rlc3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3Qvb3V0cHV0X3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzg1NzYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9vdXRwdXRfdGVzdC5oCkBAIC0wLDAgKzEsMjEzIEBACisjaWZuZGVmIFRFU1RfT1VUUFVUX1RFU1RfSAorI2RlZmluZSBURVNUX09VVFBVVF9URVNUX0gKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICIuLi9zcmMvcmUuaCIKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKKyNkZWZpbmUgQ09OQ0FUMih4LCB5KSB4IyN5CisjZGVmaW5lIENPTkNBVCh4LCB5KSBDT05DQVQyKHgsIHkpCisKKyNkZWZpbmUgQUREX0NBU0VTKC4uLikgaW50IENPTkNBVChkdW1teSwgX19MSU5FX18pID0gOjpBZGRDYXNlcyhfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTRVRfU1VCU1RJVFVUSU9OUyguLi4pIFwKKyAgaW50IENPTkNBVChkdW1teSwgX19MSU5FX18pID0gOjpTZXRTdWJzdGl0dXRpb25zKF9fVkFfQVJHU19fKQorCitlbnVtIE1hdGNoUnVsZXMgeworICBNUl9EZWZhdWx0LCAgLy8gU2tpcCBub24tbWF0Y2hpbmcgbGluZXMgdW50aWwgYSBtYXRjaCBpcyBmb3VuZC4KKyAgTVJfTmV4dCwgICAgIC8vIE1hdGNoIG11c3Qgb2NjdXIgb24gdGhlIG5leHQgbGluZS4KKyAgTVJfTm90ICAvLyBObyBsaW5lIGJldHdlZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBuZXh0IG1hdGNoIG1hdGNoZXMKKyAgICAgICAgICAvLyB0aGUgcmVnZXgKK307CisKK3N0cnVjdCBUZXN0Q2FzZSB7CisgIFRlc3RDYXNlKHN0ZDo6c3RyaW5nIHJlLCBpbnQgcnVsZSA9IE1SX0RlZmF1bHQpOworCisgIHN0ZDo6c3RyaW5nIHJlZ2V4X3N0cjsKKyAgaW50IG1hdGNoX3J1bGU7CisgIHN0ZDo6c3RyaW5nIHN1YnN0aXR1dGVkX3JlZ2V4OworICBzdGQ6OnNoYXJlZF9wdHI8YmVuY2htYXJrOjpSZWdleD4gcmVnZXg7Cit9OworCitlbnVtIFRlc3RDYXNlSUQgeworICBUQ19Db25zb2xlT3V0LAorICBUQ19Db25zb2xlRXJyLAorICBUQ19KU09OT3V0LAorICBUQ19KU09ORXJyLAorICBUQ19DU1ZPdXQsCisgIFRDX0NTVkVyciwKKworICBUQ19OdW1JRCAgLy8gUFJJVkFURQorfTsKKworLy8gQWRkIGEgbGlzdCBvZiB0ZXN0IGNhc2VzIHRvIGJlIHJ1biBhZ2FpbnN0IHRoZSBvdXRwdXQgc3BlY2lmaWVkIGJ5CisvLyAnSUQnCitpbnQgQWRkQ2FzZXMoVGVzdENhc2VJRCBJRCwgc3RkOjppbml0aWFsaXplcl9saXN0PFRlc3RDYXNlPiBpbCk7CisKKy8vIEFkZCBvciBzZXQgYSBsaXN0IG9mIHN1YnN0aXR1dGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIGNvbnN0cnVjdGVkIHJlZ2V4J3MKKy8vIFNlZSAnb3V0cHV0X3Rlc3RfaGVscGVyLmNjJyBmb3IgYSBsaXN0IG9mIGRlZmF1bHQgc3Vic3RpdHV0aW9ucy4KK2ludCBTZXRTdWJzdGl0dXRpb25zKAorICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gaWwpOworCisvLyBSdW4gYWxsIG91dHB1dCB0ZXN0cy4KK3ZvaWQgUnVuT3V0cHV0VGVzdHMoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7CisKKy8vIENvdW50IHRoZSBudW1iZXIgb2YgJ3BhdCcgc3Vic3RyaW5ncyBpbiB0aGUgJ2hheXN0YWNrJyBzdHJpbmcuCitpbnQgU3Vic3RyQ250KGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXlzdGFjaywgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdCk7CisKKy8vIFJ1biByZWdpc3RlcmVkIGJlbmNobWFya3Mgd2l0aCBmaWxlIHJlcG9ydGVyIGVuYWJsZWQsIGFuZCByZXR1cm4gdGhlIGNvbnRlbnQKKy8vIG91dHB1dHRlZCBieSB0aGUgZmlsZSByZXBvcnRlci4KK3N0ZDo6c3RyaW5nIEdldEZpbGVSZXBvcnRlck91dHB1dChpbnQgYXJnYywgY2hhciogYXJndltdKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXN1bHRzIGNoZWNraW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCisvLyBDYWxsIHRoaXMgbWFjcm8gdG8gcmVnaXN0ZXIgYSBiZW5jaG1hcmsgZm9yIGNoZWNraW5nIGl0cyByZXN1bHRzLiBUaGlzCisvLyBzaG91bGQgYmUgYWxsIHRoYXQncyBuZWVkZWQuIEl0IHN1YnNjcmliZXMgYSBmdW5jdGlvbiB0byBjaGVjayB0aGUgKENTVikKKy8vIHJlc3VsdHMgb2YgYSBiZW5jaG1hcmsuIFRoaXMgaXMgZG9uZSBvbmx5IGFmdGVyIHZlcmlmeWluZyB0aGF0IHRoZSBvdXRwdXQKKy8vIHN0cmluZ3MgYXJlIHJlYWxseSBhcyBleHBlY3RlZC4KKy8vIGJtX25hbWVfcGF0dGVybjogYSBuYW1lIG9yIGEgcmVnZXggcGF0dGVybiB3aGljaCB3aWxsIGJlIG1hdGNoZWQgYWdhaW5zdAorLy8gICAgICAgICAgICAgICAgICBhbGwgdGhlIGJlbmNobWFyayBuYW1lcy4gTWF0Y2hpbmcgYmVuY2htYXJrcworLy8gICAgICAgICAgICAgICAgICB3aWxsIGJlIHRoZSBzdWJqZWN0IG9mIGEgY2FsbCB0byBjaGVja2VyX2Z1bmN0aW9uCisvLyBjaGVja2VyX2Z1bmN0aW9uOiBzaG91bGQgYmUgb2YgdHlwZSBSZXN1bHRzQ2hlY2tGbiAoc2VlIGJlbG93KQorI2RlZmluZSBDSEVDS19CRU5DSE1BUktfUkVTVUxUUyhibV9uYW1lX3BhdHRlcm4sIGNoZWNrZXJfZnVuY3Rpb24pIFwKKyAgc2l6ZV90IENPTkNBVChkdW1teSwgX19MSU5FX18pID0gQWRkQ2hlY2tlcihibV9uYW1lX3BhdHRlcm4sIGNoZWNrZXJfZnVuY3Rpb24pCisKK3N0cnVjdCBSZXN1bHRzOwordHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoUmVzdWx0cyBjb25zdCYpPiBSZXN1bHRzQ2hlY2tGbjsKKworc2l6ZV90IEFkZENoZWNrZXIoY29uc3QgY2hhciogYm1fbmFtZV9wYXR0ZXJuLCBSZXN1bHRzQ2hlY2tGbiBmbik7CisKKy8vIENsYXNzIGhvbGRpbmcgdGhlIHJlc3VsdHMgb2YgYSBiZW5jaG1hcmsuCisvLyBJdCBpcyBwYXNzZWQgaW4gY2FsbHMgdG8gY2hlY2tlciBmdW5jdGlvbnMuCitzdHJ1Y3QgUmVzdWx0cyB7CisgIC8vIHRoZSBiZW5jaG1hcmsgbmFtZQorICBzdGQ6OnN0cmluZyBuYW1lOworICAvLyB0aGUgYmVuY2htYXJrIGZpZWxkcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhbHVlczsKKworICBSZXN1bHRzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuKSA6IG5hbWUobikge30KKworICBpbnQgTnVtVGhyZWFkcygpIGNvbnN0OworCisgIGRvdWJsZSBOdW1JdGVyYXRpb25zKCkgY29uc3Q7CisKKyAgdHlwZWRlZiBlbnVtIHsga0NwdVRpbWUsIGtSZWFsVGltZSB9IEJlbmNobWFya1RpbWU7CisKKyAgLy8gZ2V0IGNwdV90aW1lIG9yIHJlYWxfdGltZSBpbiBzZWNvbmRzCisgIGRvdWJsZSBHZXRUaW1lKEJlbmNobWFya1RpbWUgd2hpY2gpIGNvbnN0OworCisgIC8vIGdldCB0aGUgcmVhbF90aW1lIGR1cmF0aW9uIG9mIHRoZSBiZW5jaG1hcmsgaW4gc2Vjb25kcy4KKyAgLy8gaXQgaXMgYmV0dGVyIHRvIHVzZSBmdXp6eSBmbG9hdCBjaGVja3MgZm9yIHRoaXMsIGFzIHRoZSBmbG9hdAorICAvLyBBU0NJSSBmb3JtYXR0aW5nIGlzIGxvc3N5LgorICBkb3VibGUgRHVyYXRpb25SZWFsVGltZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtSXRlcmF0aW9ucygpICogR2V0VGltZShrUmVhbFRpbWUpOworICB9CisgIC8vIGdldCB0aGUgY3B1X3RpbWUgZHVyYXRpb24gb2YgdGhlIGJlbmNobWFyayBpbiBzZWNvbmRzCisgIGRvdWJsZSBEdXJhdGlvbkNQVVRpbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bUl0ZXJhdGlvbnMoKSAqIEdldFRpbWUoa0NwdVRpbWUpOworICB9CisKKyAgLy8gZ2V0IHRoZSBzdHJpbmcgZm9yIGEgcmVzdWx0IGJ5IG5hbWUsIG9yIG51bGxwdHIgaWYgdGhlIG5hbWUKKyAgLy8gaXMgbm90IGZvdW5kCisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBHZXQoY29uc3QgY2hhciogZW50cnlfbmFtZSkgY29uc3QgeworICAgIGF1dG8gaXQgPSB2YWx1ZXMuZmluZChlbnRyeV9uYW1lKTsKKyAgICBpZiAoaXQgPT0gdmFsdWVzLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gJml0LT5zZWNvbmQ7CisgIH0KKworICAvLyBnZXQgYSByZXN1bHQgYnkgbmFtZSwgcGFyc2VkIGFzIGEgc3BlY2lmaWMgdHlwZS4KKyAgLy8gTk9URTogZm9yIGNvdW50ZXJzLCB1c2UgR2V0Q291bnRlckFzIGluc3RlYWQuCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBUIEdldEFzKGNvbnN0IGNoYXIqIGVudHJ5X25hbWUpIGNvbnN0OworCisgIC8vIGNvdW50ZXJzIGFyZSB3cml0dGVuIGFzIGRvdWJsZXMsIHNvIHRoZXkgaGF2ZSB0byBiZSByZWFkIGZpcnN0CisgIC8vIGFzIGEgZG91YmxlLCBhbmQgb25seSB0aGVuIGNvbnZlcnRlZCB0byB0aGUgYXNrZWQgdHlwZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIFQgR2V0Q291bnRlckFzKGNvbnN0IGNoYXIqIGVudHJ5X25hbWUpIGNvbnN0IHsKKyAgICBkb3VibGUgZHZhbCA9IEdldEFzPGRvdWJsZT4oZW50cnlfbmFtZSk7CisgICAgVCB0dmFsID0gc3RhdGljX2Nhc3Q8VD4oZHZhbCk7CisgICAgcmV0dXJuIHR2YWw7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBSZXN1bHRzOjpHZXRBcyhjb25zdCBjaGFyKiBlbnRyeV9uYW1lKSBjb25zdCB7CisgIGF1dG8qIHN2ID0gR2V0KGVudHJ5X25hbWUpOworICBDSEVDSyhzdiAhPSBudWxscHRyICYmICFzdi0+ZW1wdHkoKSk7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAqc3Y7CisgIFQgb3V0OworICBzcyA+PiBvdXQ7CisgIENIRUNLKCFzcy5mYWlsKCkpOworICByZXR1cm4gb3V0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY3JvcyB0byBoZWxwIGluIHJlc3VsdCBjaGVja2luZy4gRG8gbm90IHVzZSB0aGVtIHdpdGggYXJndW1lbnRzIGNhdXNpbmcKKy8vIHNpZGUtZWZmZWN0cy4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisjZGVmaW5lIF9DSEVDS19SRVNVTFRfVkFMVUUoZW50cnksIGdldGZuLCB2YXJfdHlwZSwgdmFyX25hbWUsIHJlbGF0aW9uc2hpcCwgdmFsdWUpIFwKKyAgICBDT05DQVQoQ0hFQ0tfLCByZWxhdGlvbnNoaXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZW50cnkuZ2V0Zm48IHZhcl90eXBlID4odmFyX25hbWUpLCAodmFsdWUpKSA8PCAiXG4iICAgICAgICAgICAgICAgIFwKKyAgICA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgX19MSU5FX18gPDwgIjogIiA8PCAoZW50cnkpLm5hbWUgPDwgIjpcbiIgICAgIFwKKyAgICA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgX19MSU5FX18gPDwgIjogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA8PCAiZXhwZWN0ZWQgKCIgPDwgI3Zhcl90eXBlIDw8ICIpIiA8PCAodmFyX25hbWUpICAgICAgICAgICAgICAgICAgIFwKKyAgICA8PCAiPSIgPDwgKGVudHJ5KS5nZXRmbjwgdmFyX3R5cGUgPih2YXJfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA8PCAiIHRvIGJlICIgI3JlbGF0aW9uc2hpcCAiIHRvICIgPDwgKHZhbHVlKSA8PCAiXG4iCisKKy8vIGNoZWNrIHdpdGggdG9sZXJhbmNlLiBlcHNfZmFjdG9yIGlzIHRoZSB0b2xlcmFuY2Ugd2luZG93LCB3aGljaCBpcworLy8gaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdmFsdWUgKGVnLCAwLjEgbWVhbnMgMTAlIG9mIHZhbHVlKS4KKyNkZWZpbmUgX0NIRUNLX0ZMT0FUX1JFU1VMVF9WQUxVRShlbnRyeSwgZ2V0Zm4sIHZhcl90eXBlLCB2YXJfbmFtZSwgcmVsYXRpb25zaGlwLCB2YWx1ZSwgZXBzX2ZhY3RvcikgXAorICAgIENPTkNBVChDSEVDS19GTE9BVF8sIHJlbGF0aW9uc2hpcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChlbnRyeS5nZXRmbjwgdmFyX3R5cGUgPih2YXJfbmFtZSksICh2YWx1ZSksIChlcHNfZmFjdG9yKSAqICh2YWx1ZSkpIDw8ICJcbiIgXAorICAgIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXyA8PCAiOiAiIDw8IChlbnRyeSkubmFtZSA8PCAiOlxuIiAgICAgXAorICAgIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXyA8PCAiOiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDw8ICJleHBlY3RlZCAoIiA8PCAjdmFyX3R5cGUgPDwgIikiIDw8ICh2YXJfbmFtZSkgICAgICAgICAgICAgICAgICAgXAorICAgIDw8ICI9IiA8PCAoZW50cnkpLmdldGZuPCB2YXJfdHlwZSA+KHZhcl9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDw8ICIgdG8gYmUgIiAjcmVsYXRpb25zaGlwICIgdG8gIiA8PCAodmFsdWUpIDw8ICJcbiIgICAgICAgICAgICAgICAgXAorICAgIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXyA8PCAiOiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDw8ICJ3aXRoIHRvbGVyYW5jZSBvZiAiIDw8IChlcHNfZmFjdG9yKSAqICh2YWx1ZSkgICAgICAgICAgICAgICAgICAgXAorICAgIDw8ICIgKCIgPDwgKGVwc19mYWN0b3IpKjEwMC4gPDwgIiUpLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDw8ICJidXQgZGVsdGEgd2FzICIgPDwgKChlbnRyeSkuZ2V0Zm48IHZhcl90eXBlID4odmFyX25hbWUpIC0gKHZhbHVlKSkgXAorICAgIDw8ICIgKCIgPDwgKCgoZW50cnkpLmdldGZuPCB2YXJfdHlwZSA+KHZhcl9uYW1lKSAtICh2YWx1ZSkpICAgICAgICAgXAorICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKCh2YWx1ZSkgPiAxLmUtNSB8fCB2YWx1ZSA8IC0xLmUtNSA/IHZhbHVlIDogMS5lLTUpKjEwMC4pIFwKKyAgICA8PCAiJSkiCisKKyNkZWZpbmUgQ0hFQ0tfUkVTVUxUX1ZBTFVFKGVudHJ5LCB2YXJfdHlwZSwgdmFyX25hbWUsIHJlbGF0aW9uc2hpcCwgdmFsdWUpIFwKKyAgICBfQ0hFQ0tfUkVTVUxUX1ZBTFVFKGVudHJ5LCBHZXRBcywgdmFyX3R5cGUsIHZhcl9uYW1lLCByZWxhdGlvbnNoaXAsIHZhbHVlKQorCisjZGVmaW5lIENIRUNLX0NPVU5URVJfVkFMVUUoZW50cnksIHZhcl90eXBlLCB2YXJfbmFtZSwgcmVsYXRpb25zaGlwLCB2YWx1ZSkgXAorICAgIF9DSEVDS19SRVNVTFRfVkFMVUUoZW50cnksIEdldENvdW50ZXJBcywgdmFyX3R5cGUsIHZhcl9uYW1lLCByZWxhdGlvbnNoaXAsIHZhbHVlKQorCisjZGVmaW5lIENIRUNLX0ZMT0FUX1JFU1VMVF9WQUxVRShlbnRyeSwgdmFyX25hbWUsIHJlbGF0aW9uc2hpcCwgdmFsdWUsIGVwc19mYWN0b3IpIFwKKyAgICBfQ0hFQ0tfRkxPQVRfUkVTVUxUX1ZBTFVFKGVudHJ5LCBHZXRBcywgZG91YmxlLCB2YXJfbmFtZSwgcmVsYXRpb25zaGlwLCB2YWx1ZSwgZXBzX2ZhY3RvcikKKworI2RlZmluZSBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGVudHJ5LCB2YXJfbmFtZSwgcmVsYXRpb25zaGlwLCB2YWx1ZSwgZXBzX2ZhY3RvcikgXAorICAgIF9DSEVDS19GTE9BVF9SRVNVTFRfVkFMVUUoZW50cnksIEdldENvdW50ZXJBcywgZG91YmxlLCB2YXJfbmFtZSwgcmVsYXRpb25zaGlwLCB2YWx1ZSwgZXBzX2ZhY3RvcikKKworLy8gY2xhbmctZm9ybWF0IG9uCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNaXNjIFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKworbmFtZXNwYWNlIHsKKworY29uc3QgY2hhciogY29uc3QgZGVjX3JlID0gIlswLTldKlsuXT9bMC05XSsoW2VFXVstK11bMC05XSspPyI7CisKK30gIC8vICBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAgLy8gVEVTVF9PVVRQVVRfVEVTVF9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L291dHB1dF90ZXN0X2hlbHBlci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3Qvb3V0cHV0X3Rlc3RfaGVscGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjM0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L291dHB1dF90ZXN0X2hlbHBlci5jYwpAQCAtMCwwICsxLDUxNSBAQAorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxyYW5kb20+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJlYW1idWY+CisKKyNpbmNsdWRlICIuLi9zcmMvYmVuY2htYXJrX2FwaV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgIi4uL3NyYy9jaGVjay5oIiAgLy8gTk9URTogY2hlY2suaCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkhCisjaW5jbHVkZSAiLi4vc3JjL3JlLmgiICAgICAvLyBOT1RFOiByZS5oIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seQorI2luY2x1ZGUgIm91dHB1dF90ZXN0LmgiCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCit1c2luZyBUZXN0Q2FzZUxpc3QgPSBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT47CisKKy8vIFVzZSBhIHZlY3RvciBiZWNhdXNlIHRoZSBvcmRlciBlbGVtZW50cyBhcmUgYWRkZWQgbWF0dGVycyBkdXJpbmcgaXRlcmF0aW9uLgorLy8gc3RkOjptYXAvdW5vcmRlcmVkX21hcCBkb24ndCBndWFyYW50ZWUgdGhhdC4KKy8vIEZvciBleGFtcGxlOgorLy8gIFNldFN1YnN0aXR1dGlvbnMoe3siJUhlbGxvV29ybGQiLCAiSGVsbG8ifSwgeyIlSGVsbG8iLCAiSGkifX0pOworLy8gICAgIFN1YnN0aXR1dGUoIiVIZWxsb1dvcmxkIikgLy8gQWx3YXlzIGV4cGFuZHMgdG8gSGVsbG8uCit1c2luZyBTdWJNYXAgPSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj47CisKK1Rlc3RDYXNlTGlzdCYgR2V0VGVzdENhc2VMaXN0KFRlc3RDYXNlSUQgSUQpIHsKKyAgLy8gVXNlcyBmdW5jdGlvbi1sb2NhbCBzdGF0aWNzIHRvIGVuc3VyZSBpbml0aWFsaXphdGlvbiBvY2N1cnMKKyAgLy8gYmVmb3JlIGZpcnN0IHVzZS4KKyAgc3RhdGljIFRlc3RDYXNlTGlzdCBsaXN0c1tUQ19OdW1JRF07CisgIHJldHVybiBsaXN0c1tJRF07Cit9CisKK1N1Yk1hcCYgR2V0U3Vic3RpdHV0aW9ucygpIHsKKyAgLy8gRG9uJ3QgdXNlICdkZWNfcmUnIGZyb20gaGVhZGVyIGJlY2F1c2UgaXQgbWF5IG5vdCB5ZXQgYmUgaW5pdGlhbGl6ZWQuCisgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHNhZmVfZGVjX3JlID0gIlswLTldKlsuXT9bMC05XSsoW2VFXVstK11bMC05XSspPyI7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyB0aW1lX3JlID0gIihbMC05XStbLl0pP1swLTldKyI7CisgIHN0YXRpYyBTdWJNYXAgbWFwID0geworICAgICAgeyIlZmxvYXQiLCAiWzAtOV0qWy5dP1swLTldKyhbZUVdWy0rXVswLTldKyk/In0sCisgICAgICAvLyBodW1hbi1yZWFkYWJsZSBmbG9hdAorICAgICAgeyIlaHJmbG9hdCIsICJbMC05XSpbLl0/WzAtOV0rKFtlRV1bLStdWzAtOV0rKT9ba01HVFBFWlltdW5wZmF6eV0/In0sCisgICAgICB7IiVpbnQiLCAiWyBdKlswLTldKyJ9LAorICAgICAgeyIgJXMgIiwgIlsgXSsifSwKKyAgICAgIHsiJXRpbWUiLCAiWyBdKiIgKyB0aW1lX3JlICsgIlsgXStucyJ9LAorICAgICAgeyIlY29uc29sZV9yZXBvcnQiLCAiWyBdKiIgKyB0aW1lX3JlICsgIlsgXStucyBbIF0qIiArIHRpbWVfcmUgKyAiWyBdK25zIFsgXSpbMC05XSsifSwKKyAgICAgIHsiJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCIsICJbIF0qIiArIHRpbWVfcmUgKyAiWyBdK25zIFsgXSoiICsgdGltZV9yZSArICJbIF0rbnMifSwKKyAgICAgIHsiJWNvbnNvbGVfdXNfcmVwb3J0IiwgIlsgXSoiICsgdGltZV9yZSArICJbIF0rdXMgWyBdKiIgKyB0aW1lX3JlICsgIlsgXSt1cyBbIF0qWzAtOV0rIn0sCisgICAgICB7IiVjb25zb2xlX3VzX3RpbWVfb25seV9yZXBvcnQiLCAiWyBdKiIgKyB0aW1lX3JlICsgIlsgXSt1cyBbIF0qIiArIHRpbWVfcmUgKyAiWyBdK3VzIn0sCisgICAgICB7IiVjc3ZfaGVhZGVyIiwKKyAgICAgICAibmFtZSxpdGVyYXRpb25zLHJlYWxfdGltZSxjcHVfdGltZSx0aW1lX3VuaXQsYnl0ZXNfcGVyX3NlY29uZCwiCisgICAgICAgIml0ZW1zX3Blcl9zZWNvbmQsbGFiZWwsZXJyb3Jfb2NjdXJyZWQsZXJyb3JfbWVzc2FnZSJ9LAorICAgICAgeyIlY3N2X3JlcG9ydCIsICJbMC05XSssIiArIHNhZmVfZGVjX3JlICsgIiwiICsgc2FmZV9kZWNfcmUgKyAiLG5zLCwsLCwifSwKKyAgICAgIHsiJWNzdl91c19yZXBvcnQiLCAiWzAtOV0rLCIgKyBzYWZlX2RlY19yZSArICIsIiArIHNhZmVfZGVjX3JlICsgIix1cywsLCwsIn0sCisgICAgICB7IiVjc3ZfYnl0ZXNfcmVwb3J0IiwKKyAgICAgICAiWzAtOV0rLCIgKyBzYWZlX2RlY19yZSArICIsIiArIHNhZmVfZGVjX3JlICsgIixucywiICsgc2FmZV9kZWNfcmUgKyAiLCwsLCJ9LAorICAgICAgeyIlY3N2X2l0ZW1zX3JlcG9ydCIsCisgICAgICAgIlswLTldKywiICsgc2FmZV9kZWNfcmUgKyAiLCIgKyBzYWZlX2RlY19yZSArICIsbnMsLCIgKyBzYWZlX2RlY19yZSArICIsLCwifSwKKyAgICAgIHsiJWNzdl9ieXRlc19pdGVtc19yZXBvcnQiLAorICAgICAgICJbMC05XSssIiArIHNhZmVfZGVjX3JlICsgIiwiICsgc2FmZV9kZWNfcmUgKyAiLG5zLCIgKyBzYWZlX2RlY19yZSArCisgICAgICAgIiwiICsgc2FmZV9kZWNfcmUgKyAiLCwsIn0sCisgICAgICB7IiVjc3ZfbGFiZWxfcmVwb3J0X2JlZ2luIiwgIlswLTldKywiICsgc2FmZV9kZWNfcmUgKyAiLCIgKyBzYWZlX2RlY19yZSArICIsbnMsLCwifSwKKyAgICAgIHsiJWNzdl9sYWJlbF9yZXBvcnRfZW5kIiwgIiwsIn19OworICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgcmV0dXJuIG1hcDsKK30KKworc3RkOjpzdHJpbmcgUGVyZm9ybVN1YnN0aXR1dGlvbnMoc3RkOjpzdHJpbmcgc291cmNlKSB7CisgIFN1Yk1hcCBjb25zdCYgc3VicyA9IEdldFN1YnN0aXR1dGlvbnMoKTsKKyAgdXNpbmcgU2l6ZVQgPSBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlOworICBmb3IgKGF1dG8gY29uc3QmIEtWIDogc3VicykgeworICAgIFNpemVUIHBvczsKKyAgICBTaXplVCBuZXh0X3N0YXJ0ID0gMDsKKyAgICB3aGlsZSAoKHBvcyA9IHNvdXJjZS5maW5kKEtWLmZpcnN0LCBuZXh0X3N0YXJ0KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIG5leHRfc3RhcnQgPSBwb3MgKyBLVi5zZWNvbmQuc2l6ZSgpOworICAgICAgc291cmNlLnJlcGxhY2UocG9zLCBLVi5maXJzdC5zaXplKCksIEtWLnNlY29uZCk7CisgICAgfQorICB9CisgIHJldHVybiBzb3VyY2U7Cit9CisKK3ZvaWQgQ2hlY2tDYXNlKHN0ZDo6c3RyaW5nc3RyZWFtJiByZW1haW5pbmdfb3V0cHV0LCBUZXN0Q2FzZSBjb25zdCYgVEMsCisgICAgICAgICAgICAgICBUZXN0Q2FzZUxpc3QgY29uc3QmIG5vdF9jaGVja3MpIHsKKyAgc3RkOjpzdHJpbmcgZmlyc3RfbGluZTsKKyAgYm9vbCBvbl9maXJzdCA9IHRydWU7CisgIHN0ZDo6c3RyaW5nIGxpbmU7CisgIHdoaWxlIChyZW1haW5pbmdfb3V0cHV0LmVvZigpID09IGZhbHNlKSB7CisgICAgQ0hFQ0socmVtYWluaW5nX291dHB1dC5nb29kKCkpOworICAgIHN0ZDo6Z2V0bGluZShyZW1haW5pbmdfb3V0cHV0LCBsaW5lKTsKKyAgICBpZiAob25fZmlyc3QpIHsKKyAgICAgIGZpcnN0X2xpbmUgPSBsaW5lOworICAgICAgb25fZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBOQyA6IG5vdF9jaGVja3MpIHsKKyAgICAgIENIRUNLKCFOQy5yZWdleC0+TWF0Y2gobGluZSkpCisgICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgbWF0Y2ggZm9yIGxpbmUgXCIiIDw8IGxpbmUgPDwgIlwiIGZvciBNUl9Ob3QgcmVnZXggXCIiCisgICAgICAgICAgPDwgTkMucmVnZXhfc3RyIDw8ICJcIiIKKyAgICAgICAgICA8PCAiXG4gICAgYWN0dWFsIHJlZ2V4IHN0cmluZyBcIiIgPDwgVEMuc3Vic3RpdHV0ZWRfcmVnZXggPDwgIlwiIgorICAgICAgICAgIDw8ICJcbiAgICBzdGFydGVkIG1hdGNoaW5nIG5lYXI6ICIgPDwgZmlyc3RfbGluZTsKKyAgICB9CisgICAgaWYgKFRDLnJlZ2V4LT5NYXRjaChsaW5lKSkgcmV0dXJuOworICAgIENIRUNLKFRDLm1hdGNoX3J1bGUgIT0gTVJfTmV4dCkKKyAgICAgICAgPDwgIkV4cGVjdGVkIGxpbmUgXCIiIDw8IGxpbmUgPDwgIlwiIHRvIG1hdGNoIHJlZ2V4IFwiIiA8PCBUQy5yZWdleF9zdHIKKyAgICAgICAgPDwgIlwiIgorICAgICAgICA8PCAiXG4gICAgYWN0dWFsIHJlZ2V4IHN0cmluZyBcIiIgPDwgVEMuc3Vic3RpdHV0ZWRfcmVnZXggPDwgIlwiIgorICAgICAgICA8PCAiXG4gICAgc3RhcnRlZCBtYXRjaGluZyBuZWFyOiAiIDw8IGZpcnN0X2xpbmU7CisgIH0KKyAgQ0hFQ0socmVtYWluaW5nX291dHB1dC5lb2YoKSA9PSBmYWxzZSkKKyAgICAgIDw8ICJFbmQgb2Ygb3V0cHV0IHJlYWNoZWQgYmVmb3JlIG1hdGNoIGZvciByZWdleCBcIiIgPDwgVEMucmVnZXhfc3RyCisgICAgICA8PCAiXCIgd2FzIGZvdW5kIgorICAgICAgPDwgIlxuICAgIGFjdHVhbCByZWdleCBzdHJpbmcgXCIiIDw8IFRDLnN1YnN0aXR1dGVkX3JlZ2V4IDw8ICJcIiIKKyAgICAgIDw8ICJcbiAgICBzdGFydGVkIG1hdGNoaW5nIG5lYXI6ICIgPDwgZmlyc3RfbGluZTsKK30KKwordm9pZCBDaGVja0Nhc2VzKFRlc3RDYXNlTGlzdCBjb25zdCYgY2hlY2tzLCBzdGQ6OnN0cmluZ3N0cmVhbSYgb3V0cHV0KSB7CisgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBub3RfY2hlY2tzOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoZWNrcy5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IGF1dG8mIFRDID0gY2hlY2tzW2ldOworICAgIGlmIChUQy5tYXRjaF9ydWxlID09IE1SX05vdCkgeworICAgICAgbm90X2NoZWNrcy5wdXNoX2JhY2soVEMpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIENoZWNrQ2FzZShvdXRwdXQsIFRDLCBub3RfY2hlY2tzKTsKKyAgICBub3RfY2hlY2tzLmNsZWFyKCk7CisgIH0KK30KKworY2xhc3MgVGVzdFJlcG9ydGVyIDogcHVibGljIGJlbmNobWFyazo6QmVuY2htYXJrUmVwb3J0ZXIgeworIHB1YmxpYzoKKyAgVGVzdFJlcG9ydGVyKHN0ZDo6dmVjdG9yPGJlbmNobWFyazo6QmVuY2htYXJrUmVwb3J0ZXIqPiByZXBzKQorICAgICAgOiByZXBvcnRlcnNfKHJlcHMpIHt9CisKKyAgdmlydHVhbCBib29sIFJlcG9ydENvbnRleHQoY29uc3QgQ29udGV4dCYgY29udGV4dCkgeworICAgIGJvb2wgbGFzdF9yZXQgPSBmYWxzZTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGF1dG8gcmVwIDogcmVwb3J0ZXJzXykgeworICAgICAgYm9vbCBuZXdfcmV0ID0gcmVwLT5SZXBvcnRDb250ZXh0KGNvbnRleHQpOworICAgICAgQ0hFQ0soZmlyc3QgfHwgbmV3X3JldCA9PSBsYXN0X3JldCkKKyAgICAgICAgICA8PCAiUmVwb3J0cyByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBmb3IgUmVwb3J0Q29udGV4dCI7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgbGFzdF9yZXQgPSBuZXdfcmV0OworICAgIH0KKyAgICAodm9pZClmaXJzdDsKKyAgICByZXR1cm4gbGFzdF9yZXQ7CisgIH0KKworICB2b2lkIFJlcG9ydFJ1bnMoY29uc3Qgc3RkOjp2ZWN0b3I8UnVuPiYgcmVwb3J0KSB7CisgICAgZm9yIChhdXRvIHJlcCA6IHJlcG9ydGVyc18pIHJlcC0+UmVwb3J0UnVucyhyZXBvcnQpOworICB9CisgIHZvaWQgRmluYWxpemUoKSB7CisgICAgZm9yIChhdXRvIHJlcCA6IHJlcG9ydGVyc18pIHJlcC0+RmluYWxpemUoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8YmVuY2htYXJrOjpCZW5jaG1hcmtSZXBvcnRlcio+IHJlcG9ydGVyc187Cit9OworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzdWx0cyBjaGVja2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVdGlsaXR5IGNsYXNzIHRvIG1hbmFnZSBzdWJzY3JpYmVycyBmb3IgY2hlY2tpbmcgYmVuY2htYXJrIHJlc3VsdHMuCisvLyBJdCB3b3JrcyBieSBwYXJzaW5nIHRoZSBDU1Ygb3V0cHV0IHRvIHJlYWQgdGhlIHJlc3VsdHMuCitjbGFzcyBSZXN1bHRzQ2hlY2tlciB7CisgcHVibGljOgorICBzdHJ1Y3QgUGF0dGVybkFuZEZuIDogcHVibGljIFRlc3RDYXNlIHsgIC8vIHJldXNpbmcgVGVzdENhc2UgZm9yIGl0cyByZWdleGVzCisgICAgUGF0dGVybkFuZEZuKGNvbnN0IHN0ZDo6c3RyaW5nJiByeCwgUmVzdWx0c0NoZWNrRm4gZm5fKQorICAgICAgICA6IFRlc3RDYXNlKHJ4KSwgZm4oZm5fKSB7fQorICAgIFJlc3VsdHNDaGVja0ZuIGZuOworICB9OworCisgIHN0ZDo6dmVjdG9yPFBhdHRlcm5BbmRGbj4gY2hlY2tfcGF0dGVybnM7CisgIHN0ZDo6dmVjdG9yPFJlc3VsdHM+IHJlc3VsdHM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWVsZF9uYW1lczsKKworICB2b2lkIEFkZChjb25zdCBzdGQ6OnN0cmluZyYgZW50cnlfcGF0dGVybiwgUmVzdWx0c0NoZWNrRm4gZm4pOworCisgIHZvaWQgQ2hlY2tSZXN1bHRzKHN0ZDo6c3RyaW5nc3RyZWFtJiBvdXRwdXQpOworCisgcHJpdmF0ZToKKyAgdm9pZCBTZXRIZWFkZXJfKGNvbnN0IHN0ZDo6c3RyaW5nJiBjc3ZfaGVhZGVyKTsKKyAgdm9pZCBTZXRWYWx1ZXNfKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbnRyeV9jc3ZfbGluZSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFNwbGl0Q3N2Xyhjb25zdCBzdGQ6OnN0cmluZyYgbGluZSk7Cit9OworCisvLyBzdG9yZSB0aGUgc3RhdGljIFJlc3VsdHNDaGVja2VyIGluIGEgZnVuY3Rpb24gdG8gcHJldmVudCBpbml0aWFsaXphdGlvbgorLy8gb3JkZXIgcHJvYmxlbXMKK1Jlc3VsdHNDaGVja2VyJiBHZXRSZXN1bHRzQ2hlY2tlcigpIHsKKyAgc3RhdGljIFJlc3VsdHNDaGVja2VyIHJjOworICByZXR1cm4gcmM7Cit9CisKKy8vIGFkZCBhIHJlc3VsdHMgY2hlY2tlciBmb3IgYSBiZW5jaG1hcmsKK3ZvaWQgUmVzdWx0c0NoZWNrZXI6OkFkZChjb25zdCBzdGQ6OnN0cmluZyYgZW50cnlfcGF0dGVybiwgUmVzdWx0c0NoZWNrRm4gZm4pIHsKKyAgY2hlY2tfcGF0dGVybnMuZW1wbGFjZV9iYWNrKGVudHJ5X3BhdHRlcm4sIGZuKTsKK30KKworLy8gY2hlY2sgdGhlIHJlc3VsdHMgb2YgYWxsIHN1YnNjcmliZWQgYmVuY2htYXJrcwordm9pZCBSZXN1bHRzQ2hlY2tlcjo6Q2hlY2tSZXN1bHRzKHN0ZDo6c3RyaW5nc3RyZWFtJiBvdXRwdXQpIHsKKyAgLy8gZmlyc3QgcmVzZXQgdGhlIHN0cmVhbSB0byB0aGUgc3RhcnQKKyAgeworICAgIGF1dG8gc3RhcnQgPSBzdGQ6OnN0cmluZ3N0cmVhbTo6cG9zX3R5cGUoMCk7CisgICAgLy8gY2xlYXIgYmVmb3JlIGNhbGxpbmcgdGVsbGcoKQorICAgIG91dHB1dC5jbGVhcigpOworICAgIC8vIHNlZWsgdG8gemVybyBvbmx5IHdoZW4gbmVlZGVkCisgICAgaWYgKG91dHB1dC50ZWxsZygpID4gc3RhcnQpIG91dHB1dC5zZWVrZyhzdGFydCk7CisgICAgLy8gYW5kIGp1c3QgaW4gY2FzZQorICAgIG91dHB1dC5jbGVhcigpOworICB9CisgIC8vIG5vdyBnbyBvdmVyIGV2ZXJ5IGxpbmUgYW5kIHB1Ymxpc2ggaXQgdG8gdGhlIFJlc3VsdHNDaGVja2VyCisgIHN0ZDo6c3RyaW5nIGxpbmU7CisgIGJvb2wgb25fZmlyc3QgPSB0cnVlOworICB3aGlsZSAob3V0cHV0LmVvZigpID09IGZhbHNlKSB7CisgICAgQ0hFQ0sob3V0cHV0Lmdvb2QoKSk7CisgICAgc3RkOjpnZXRsaW5lKG91dHB1dCwgbGluZSk7CisgICAgaWYgKG9uX2ZpcnN0KSB7CisgICAgICBTZXRIZWFkZXJfKGxpbmUpOyAgLy8gdGhpcyBpcyBpbXBvcnRhbnQKKyAgICAgIG9uX2ZpcnN0ID0gZmFsc2U7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgU2V0VmFsdWVzXyhsaW5lKTsKKyAgfQorICAvLyBmaW5hbGx5IHdlIGNhbiBjYWxsIHRoZSBzdWJzY3JpYmVkIGNoZWNrIGZ1bmN0aW9ucworICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBjaGVja19wYXR0ZXJucykgeworICAgIFZMT0coMikgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgIFZMT0coMikgPDwgImNoZWNraW5nIGZvciBiZW5jaG1hcmtzIG1hdGNoaW5nICIgPDwgcC5yZWdleF9zdHIgPDwgIi4uLlxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHIgOiByZXN1bHRzKSB7CisgICAgICBpZiAoIXAucmVnZXgtPk1hdGNoKHIubmFtZSkpIHsKKyAgICAgICAgVkxPRygyKSA8PCBwLnJlZ2V4X3N0ciA8PCAiIGlzIG5vdCBtYXRjaGVkIGJ5ICIgPDwgci5uYW1lIDw8ICJcbiI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVkxPRygyKSA8PCBwLnJlZ2V4X3N0ciA8PCAiIGlzIG1hdGNoZWQgYnkgIiA8PCByLm5hbWUgPDwgIlxuIjsKKyAgICAgIH0KKyAgICAgIFZMT0coMSkgPDwgIkNoZWNraW5nIHJlc3VsdHMgb2YgIiA8PCByLm5hbWUgPDwgIjogLi4uIFxuIjsKKyAgICAgIHAuZm4ocik7CisgICAgICBWTE9HKDEpIDw8ICJDaGVja2luZyByZXN1bHRzIG9mICIgPDwgci5uYW1lIDw8ICI6IE9LLlxuIjsKKyAgICB9CisgIH0KK30KKworLy8gcHJlcGFyZSBmb3IgdGhlIG5hbWVzIGluIHRoaXMgaGVhZGVyCit2b2lkIFJlc3VsdHNDaGVja2VyOjpTZXRIZWFkZXJfKGNvbnN0IHN0ZDo6c3RyaW5nJiBjc3ZfaGVhZGVyKSB7CisgIGZpZWxkX25hbWVzID0gU3BsaXRDc3ZfKGNzdl9oZWFkZXIpOworfQorCisvLyBzZXQgdGhlIHZhbHVlcyBmb3IgYSBiZW5jaG1hcmsKK3ZvaWQgUmVzdWx0c0NoZWNrZXI6OlNldFZhbHVlc18oY29uc3Qgc3RkOjpzdHJpbmcmIGVudHJ5X2Nzdl9saW5lKSB7CisgIGlmIChlbnRyeV9jc3ZfbGluZS5lbXB0eSgpKSByZXR1cm47ICAvLyBzb21lIGxpbmVzIGFyZSBlbXB0eQorICBDSEVDSyghZmllbGRfbmFtZXMuZW1wdHkoKSk7CisgIGF1dG8gdmFscyA9IFNwbGl0Q3N2XyhlbnRyeV9jc3ZfbGluZSk7CisgIENIRUNLX0VRKHZhbHMuc2l6ZSgpLCBmaWVsZF9uYW1lcy5zaXplKCkpOworICByZXN1bHRzLmVtcGxhY2VfYmFjayh2YWxzWzBdKTsgIC8vIHZhbHNbMF0gaXMgdGhlIGJlbmNobWFyayBuYW1lCisgIGF1dG8mIGVudHJ5ID0gcmVzdWx0cy5iYWNrKCk7CisgIGZvciAoc2l6ZV90IGkgPSAxLCBlID0gdmFscy5zaXplKCk7IGkgPCBlOyArK2kpIHsKKyAgICBlbnRyeS52YWx1ZXNbZmllbGRfbmFtZXNbaV1dID0gdmFsc1tpXTsKKyAgfQorfQorCisvLyBhIHF1aWNrJ24nZGlydHkgY3N2IHNwbGl0dGVyIChlbGltaW5hdGluZyBxdW90ZXMpCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gUmVzdWx0c0NoZWNrZXI6OlNwbGl0Q3N2Xyhjb25zdCBzdGQ6OnN0cmluZyYgbGluZSkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3V0OworICBpZiAobGluZS5lbXB0eSgpKSByZXR1cm4gb3V0OworICBpZiAoIWZpZWxkX25hbWVzLmVtcHR5KCkpIG91dC5yZXNlcnZlKGZpZWxkX25hbWVzLnNpemUoKSk7CisgIHNpemVfdCBwcmV2ID0gMCwgcG9zID0gbGluZS5maW5kX2ZpcnN0X29mKCcsJyksIGN1cnIgPSBwb3M7CisgIHdoaWxlIChwb3MgIT0gbGluZS5ucG9zKSB7CisgICAgQ0hFQ0soY3VyciA+IDApOworICAgIGlmIChsaW5lW3ByZXZdID09ICciJykgKytwcmV2OworICAgIGlmIChsaW5lW2N1cnIgLSAxXSA9PSAnIicpIC0tY3VycjsKKyAgICBvdXQucHVzaF9iYWNrKGxpbmUuc3Vic3RyKHByZXYsIGN1cnIgLSBwcmV2KSk7CisgICAgcHJldiA9IHBvcyArIDE7CisgICAgcG9zID0gbGluZS5maW5kX2ZpcnN0X29mKCcsJywgcG9zICsgMSk7CisgICAgY3VyciA9IHBvczsKKyAgfQorICBjdXJyID0gbGluZS5zaXplKCk7CisgIGlmIChsaW5lW3ByZXZdID09ICciJykgKytwcmV2OworICBpZiAobGluZVtjdXJyIC0gMV0gPT0gJyInKSAtLWN1cnI7CisgIG91dC5wdXNoX2JhY2sobGluZS5zdWJzdHIocHJldiwgY3VyciAtIHByZXYpKTsKKyAgcmV0dXJuIG91dDsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCitzaXplX3QgQWRkQ2hlY2tlcihjb25zdCBjaGFyKiBibV9uYW1lLCBSZXN1bHRzQ2hlY2tGbiBmbikgeworICBhdXRvJiByYyA9IGludGVybmFsOjpHZXRSZXN1bHRzQ2hlY2tlcigpOworICByYy5BZGQoYm1fbmFtZSwgZm4pOworICByZXR1cm4gcmMucmVzdWx0cy5zaXplKCk7Cit9CisKK2ludCBSZXN1bHRzOjpOdW1UaHJlYWRzKCkgY29uc3QgeworICBhdXRvIHBvcyA9IG5hbWUuZmluZCgiL3RocmVhZHM6Iik7CisgIGlmIChwb3MgPT0gbmFtZS5ucG9zKSByZXR1cm4gMTsKKyAgYXV0byBlbmQgPSBuYW1lLmZpbmQoJy8nLCBwb3MgKyA5KTsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IG5hbWUuc3Vic3RyKHBvcyArIDksIGVuZCk7CisgIGludCBudW0gPSAxOworICBzcyA+PiBudW07CisgIENIRUNLKCFzcy5mYWlsKCkpOworICByZXR1cm4gbnVtOworfQorCitkb3VibGUgUmVzdWx0czo6TnVtSXRlcmF0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEFzPGRvdWJsZT4oIml0ZXJhdGlvbnMiKTsKK30KKworZG91YmxlIFJlc3VsdHM6OkdldFRpbWUoQmVuY2htYXJrVGltZSB3aGljaCkgY29uc3QgeworICBDSEVDSyh3aGljaCA9PSBrQ3B1VGltZSB8fCB3aGljaCA9PSBrUmVhbFRpbWUpOworICBjb25zdCBjaGFyKiB3aGljaF9zdHIgPSB3aGljaCA9PSBrQ3B1VGltZSA/ICJjcHVfdGltZSIgOiAicmVhbF90aW1lIjsKKyAgZG91YmxlIHZhbCA9IEdldEFzPGRvdWJsZT4od2hpY2hfc3RyKTsKKyAgYXV0byB1bml0ID0gR2V0KCJ0aW1lX3VuaXQiKTsKKyAgQ0hFQ0sodW5pdCk7CisgIGlmICgqdW5pdCA9PSAibnMiKSB7CisgICAgcmV0dXJuIHZhbCAqIDEuZS05OworICB9IGVsc2UgaWYgKCp1bml0ID09ICJ1cyIpIHsKKyAgICByZXR1cm4gdmFsICogMS5lLTY7CisgIH0gZWxzZSBpZiAoKnVuaXQgPT0gIm1zIikgeworICAgIHJldHVybiB2YWwgKiAxLmUtMzsKKyAgfSBlbHNlIGlmICgqdW5pdCA9PSAicyIpIHsKKyAgICByZXR1cm4gdmFsOworICB9IGVsc2UgeworICAgIENIRUNLKDEgPT0gMCkgPDwgInVua25vd24gdGltZSB1bml0OiAiIDw8ICp1bml0OworICAgIHJldHVybiAwOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBBUEkgRGVmaW5pdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKworVGVzdENhc2U6OlRlc3RDYXNlKHN0ZDo6c3RyaW5nIHJlLCBpbnQgcnVsZSkKKyAgICA6IHJlZ2V4X3N0cihzdGQ6Om1vdmUocmUpKSwKKyAgICAgIG1hdGNoX3J1bGUocnVsZSksCisgICAgICBzdWJzdGl0dXRlZF9yZWdleChpbnRlcm5hbDo6UGVyZm9ybVN1YnN0aXR1dGlvbnMocmVnZXhfc3RyKSksCisgICAgICByZWdleChzdGQ6Om1ha2Vfc2hhcmVkPGJlbmNobWFyazo6UmVnZXg+KCkpIHsKKyAgc3RkOjpzdHJpbmcgZXJyX3N0cjsKKyAgcmVnZXgtPkluaXQoc3Vic3RpdHV0ZWRfcmVnZXgsICZlcnJfc3RyKTsKKyAgQ0hFQ0soZXJyX3N0ci5lbXB0eSgpKSA8PCAiQ291bGQgbm90IGNvbnN0cnVjdCByZWdleCBcIiIgPDwgc3Vic3RpdHV0ZWRfcmVnZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuICAgIG9yaWdpbmFsbHkgXCIiIDw8IHJlZ2V4X3N0ciA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuICAgIGdvdCBlcnJvcjogIiA8PCBlcnJfc3RyOworfQorCitpbnQgQWRkQ2FzZXMoVGVzdENhc2VJRCBJRCwgc3RkOjppbml0aWFsaXplcl9saXN0PFRlc3RDYXNlPiBpbCkgeworICBhdXRvJiBMID0gaW50ZXJuYWw6OkdldFRlc3RDYXNlTGlzdChJRCk7CisgIEwuaW5zZXJ0KEwuZW5kKCksIGlsKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBTZXRTdWJzdGl0dXRpb25zKAorICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gaWwpIHsKKyAgYXV0byYgc3VicyA9IGludGVybmFsOjpHZXRTdWJzdGl0dXRpb25zKCk7CisgIGZvciAoYXV0byBLViA6IGlsKSB7CisgICAgYm9vbCBleGlzdHMgPSBmYWxzZTsKKyAgICBLVi5zZWNvbmQgPSBpbnRlcm5hbDo6UGVyZm9ybVN1YnN0aXR1dGlvbnMoS1Yuc2Vjb25kKTsKKyAgICBmb3IgKGF1dG8mIEVLViA6IHN1YnMpIHsKKyAgICAgIGlmIChFS1YuZmlyc3QgPT0gS1YuZmlyc3QpIHsKKyAgICAgICAgRUtWLnNlY29uZCA9IHN0ZDo6bW92ZShLVi5zZWNvbmQpOworICAgICAgICBleGlzdHMgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFleGlzdHMpIHN1YnMucHVzaF9iYWNrKHN0ZDo6bW92ZShLVikpOworICB9CisgIHJldHVybiAwOworfQorCisvLyBEaXNhYmxlIGRlcHJlY2F0ZWQgd2FybmluZ3MgdGVtcG9yYXJpbHkgYmVjYXVzZSB3ZSBuZWVkIHRvIHJlZmVyZW5jZQorLy8gQ1NWUmVwb3J0ZXIgYnV0IGRvbid0IHdhbnQgdG8gdHJpZ2dlciAtV2Vycm9yPS1XZGVwcmVjYXRlZAorI2lmZGVmIF9fR05VQ19fCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkIgorI2VuZGlmCit2b2lkIFJ1bk91dHB1dFRlc3RzKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgdXNpbmcgaW50ZXJuYWw6OkdldFRlc3RDYXNlTGlzdDsKKyAgYmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsKKyAgYXV0byBvcHRpb25zID0gYmVuY2htYXJrOjppbnRlcm5hbDo6R2V0T3V0cHV0T3B0aW9ucygvKmZvcmNlX25vX2NvbG9yKi8gdHJ1ZSk7CisgIGJlbmNobWFyazo6Q29uc29sZVJlcG9ydGVyIENSKG9wdGlvbnMpOworICBiZW5jaG1hcms6OkpTT05SZXBvcnRlciBKUjsKKyAgYmVuY2htYXJrOjpDU1ZSZXBvcnRlciBDU1ZSOworICBzdHJ1Y3QgUmVwb3J0ZXJUZXN0IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiYgb3V0cHV0X2Nhc2VzOworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiYgZXJyb3JfY2FzZXM7CisgICAgYmVuY2htYXJrOjpCZW5jaG1hcmtSZXBvcnRlciYgcmVwb3J0ZXI7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gb3V0X3N0cmVhbTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJfc3RyZWFtOworCisgICAgUmVwb3J0ZXJUZXN0KGNvbnN0IGNoYXIqIG4sIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiYgb3V0X3RjLAorICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4mIGVycl90YywKKyAgICAgICAgICAgICAgICAgYmVuY2htYXJrOjpCZW5jaG1hcmtSZXBvcnRlciYgYnIpCisgICAgICAgIDogbmFtZShuKSwgb3V0cHV0X2Nhc2VzKG91dF90YyksIGVycm9yX2Nhc2VzKGVycl90YyksIHJlcG9ydGVyKGJyKSB7CisgICAgICByZXBvcnRlci5TZXRPdXRwdXRTdHJlYW0oJm91dF9zdHJlYW0pOworICAgICAgcmVwb3J0ZXIuU2V0RXJyb3JTdHJlYW0oJmVycl9zdHJlYW0pOworICAgIH0KKyAgfSBUZXN0Q2FzZXNbXSA9IHsKKyAgICAgIHsiQ29uc29sZVJlcG9ydGVyIiwgR2V0VGVzdENhc2VMaXN0KFRDX0NvbnNvbGVPdXQpLAorICAgICAgIEdldFRlc3RDYXNlTGlzdChUQ19Db25zb2xlRXJyKSwgQ1J9LAorICAgICAgeyJKU09OUmVwb3J0ZXIiLCBHZXRUZXN0Q2FzZUxpc3QoVENfSlNPTk91dCksIEdldFRlc3RDYXNlTGlzdChUQ19KU09ORXJyKSwKKyAgICAgICBKUn0sCisgICAgICB7IkNTVlJlcG9ydGVyIiwgR2V0VGVzdENhc2VMaXN0KFRDX0NTVk91dCksIEdldFRlc3RDYXNlTGlzdChUQ19DU1ZFcnIpLAorICAgICAgIENTVlJ9LAorICB9OworCisgIC8vIENyZWF0ZSB0aGUgdGVzdCByZXBvcnRlciBhbmQgcnVuIHRoZSBiZW5jaG1hcmtzLgorICBzdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgYmVuY2htYXJrcy4uLlxuIjsKKyAgaW50ZXJuYWw6OlRlc3RSZXBvcnRlciB0ZXN0X3JlcCh7JkNSLCAmSlIsICZDU1ZSfSk7CisgIGJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygmdGVzdF9yZXApOworCisgIGZvciAoYXV0byYgcmVwX3Rlc3QgOiBUZXN0Q2FzZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBtc2cgPSBzdGQ6OnN0cmluZygiXG5UZXN0aW5nICIpICsgcmVwX3Rlc3QubmFtZSArICIgT3V0cHV0XG4iOworICAgIHN0ZDo6c3RyaW5nIGJhbm5lcihtc2cuc2l6ZSgpIC0gMSwgJy0nKTsKKyAgICBzdGQ6OmNvdXQgPDwgYmFubmVyIDw8IG1zZyA8PCBiYW5uZXIgPDwgIlxuIjsKKworICAgIHN0ZDo6Y2VyciA8PCByZXBfdGVzdC5lcnJfc3RyZWFtLnN0cigpOworICAgIHN0ZDo6Y291dCA8PCByZXBfdGVzdC5vdXRfc3RyZWFtLnN0cigpOworCisgICAgaW50ZXJuYWw6OkNoZWNrQ2FzZXMocmVwX3Rlc3QuZXJyb3JfY2FzZXMsIHJlcF90ZXN0LmVycl9zdHJlYW0pOworICAgIGludGVybmFsOjpDaGVja0Nhc2VzKHJlcF90ZXN0Lm91dHB1dF9jYXNlcywgcmVwX3Rlc3Qub3V0X3N0cmVhbSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgfQorCisgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIG91dHB1dCBpcyBhcyBleHBlY3RlZCwgd2UgY2FuIGRpc3BhdGNoCisgIC8vIHRoZSBjaGVja3MgdG8gc3Vic2NyaWJlZXMuCisgIGF1dG8mIGNzdiA9IFRlc3RDYXNlc1syXTsKKyAgLy8gd291bGQgdXNlID09IGJ1dCBnY2Mgc3BpdHMgYSB3YXJuaW5nCisgIENIRUNLKHN0ZDo6c3RyY21wKGNzdi5uYW1lLCAiQ1NWUmVwb3J0ZXIiKSA9PSAwKTsKKyAgaW50ZXJuYWw6OkdldFJlc3VsdHNDaGVja2VyKCkuQ2hlY2tSZXN1bHRzKGNzdi5vdXRfc3RyZWFtKTsKK30KKworI2lmZGVmIF9fR05VQ19fCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKK2ludCBTdWJzdHJDbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGhheXN0YWNrLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0KSB7CisgIGlmIChwYXQubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIDA7CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoc2l6ZV90IG9mZnNldCA9IGhheXN0YWNrLmZpbmQocGF0KTsgb2Zmc2V0ICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgIG9mZnNldCA9IGhheXN0YWNrLmZpbmQocGF0LCBvZmZzZXQgKyBwYXQubGVuZ3RoKCkpKQorICAgICsrY291bnQ7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNoYXIgVG9IZXgoaW50IGNoKSB7CisgIHJldHVybiBjaCA8IDEwID8gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgY2gpCisgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8Y2hhcj4oJ2EnICsgKGNoIC0gMTApKTsKK30KKworc3RhdGljIGNoYXIgUmFuZG9tSGV4Q2hhcigpIHsKKyAgc3RhdGljIHN0ZDo6bXQxOTkzNyByZHtzdGQ6OnJhbmRvbV9kZXZpY2V7fSgpfTsKKyAgc3RhdGljIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gbXJhbmR7MCwgMTV9OworICByZXR1cm4gVG9IZXgobXJhbmQocmQpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIEdldFJhbmRvbUZpbGVOYW1lKCkgeworICBzdGQ6OnN0cmluZyBtb2RlbCA9ICJ0ZXN0LiUlJSUlJSI7CisgIGZvciAoYXV0byAmIGNoIDogIG1vZGVsKSB7CisgICAgaWYgKGNoID09ICclJykKKyAgICAgIGNoID0gUmFuZG9tSGV4Q2hhcigpOworICB9CisgIHJldHVybiBtb2RlbDsKK30KKworc3RhdGljIGJvb2wgRmlsZUV4aXN0cyhzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSkgeworICBzdGQ6Omlmc3RyZWFtIGluKG5hbWUuY19zdHIoKSk7CisgIHJldHVybiBpbi5nb29kKCk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXRUZW1wRmlsZU5hbWUoKSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoZXJlIHR3byB0ZXN0cworICAvLyBjcmVhdGUgdGhlIHNhbWUgZmlsZSBhdCB0aGUgc2FtZSB0aW1lLiBIb3dldmVyLCBpdCBzdGlsbCBpbnRyb2R1Y2VzIHJhY2VzCisgIC8vIHNpbWlsYXIgdG8gdG1wbmFtLgorICBpbnQgcmV0cmllcyA9IDM7CisgIHdoaWxlICgtLXJldHJpZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gR2V0UmFuZG9tRmlsZU5hbWUoKTsKKyAgICBpZiAoIUZpbGVFeGlzdHMobmFtZSkpCisgICAgICByZXR1cm4gbmFtZTsKKyAgfQorICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byBjcmVhdGUgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjphYm9ydCgpOworfQorCitzdGQ6OnN0cmluZyBHZXRGaWxlUmVwb3J0ZXJPdXRwdXQoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBzdGQ6OnZlY3RvcjxjaGFyKj4gbmV3X2FyZ3YoYXJndiwgYXJndiArIGFyZ2MpOworICBhc3NlcnQoc3RhdGljX2Nhc3Q8ZGVjbHR5cGUobmV3X2FyZ3YpOjpzaXplX3R5cGU+KGFyZ2MpID09IG5ld19hcmd2LnNpemUoKSk7CisKKyAgc3RkOjpzdHJpbmcgdG1wX2ZpbGVfbmFtZSA9IEdldFRlbXBGaWxlTmFtZSgpOworICBzdGQ6OmNvdXQgPDwgIldpbGwgYmUgdXNpbmcgdGhpcyBhcyB0aGUgdG1wIGZpbGU6ICIgPDwgdG1wX2ZpbGVfbmFtZSA8PCAnXG4nOworCisgIHN0ZDo6c3RyaW5nIHRtcCA9ICItLWJlbmNobWFya19vdXQ9IjsKKyAgdG1wICs9IHRtcF9maWxlX25hbWU7CisgIG5ld19hcmd2LmVtcGxhY2VfYmFjayhjb25zdF9jYXN0PGNoYXIqPih0bXAuY19zdHIoKSkpOworCisgIGFyZ2MgPSBpbnQobmV3X2FyZ3Yuc2l6ZSgpKTsKKworICBiZW5jaG1hcms6OkluaXRpYWxpemUoJmFyZ2MsIG5ld19hcmd2LmRhdGEoKSk7CisgIGJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygpOworCisgIC8vIFJlYWQgdGhlIG91dHB1dCBiYWNrIGZyb20gdGhlIGZpbGUsIGFuZCBkZWxldGUgdGhlIGZpbGUuCisgIHN0ZDo6aWZzdHJlYW0gdG1wX3N0cmVhbSh0bXBfZmlsZV9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0ID0gc3RkOjpzdHJpbmcoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPih0bXBfc3RyZWFtKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKTsKKyAgc3RkOjpyZW1vdmUodG1wX2ZpbGVfbmFtZS5jX3N0cigpKTsKKworICByZXR1cm4gb3V0cHV0OworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9yZWdpc3Rlcl9iZW5jaG1hcmtfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvcmVnaXN0ZXJfYmVuY2htYXJrX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNWIyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvcmVnaXN0ZXJfYmVuY2htYXJrX3Rlc3QuY2MKQEAgLTAsMCArMSwxODQgQEAKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiLi4vc3JjL2NoZWNrLmgiICAvLyBOT1RFOiBjaGVjay5oIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seSEKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIFRlc3RSZXBvcnRlciA6IHB1YmxpYyBiZW5jaG1hcms6OkNvbnNvbGVSZXBvcnRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0UnVucyhjb25zdCBzdGQ6OnZlY3RvcjxSdW4+JiByZXBvcnQpIHsKKyAgICBhbGxfcnVuc18uaW5zZXJ0KGFsbF9ydW5zXy5lbmQoKSwgYmVnaW4ocmVwb3J0KSwgZW5kKHJlcG9ydCkpOworICAgIENvbnNvbGVSZXBvcnRlcjo6UmVwb3J0UnVucyhyZXBvcnQpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8UnVuPiBhbGxfcnVuc187Cit9OworCitzdHJ1Y3QgVGVzdENhc2UgeworICBzdGQ6OnN0cmluZyBuYW1lOworICBjb25zdCBjaGFyKiBsYWJlbDsKKyAgLy8gTm90ZTogbm90IGV4cGxpY2l0IGFzIHdlIHJlbHkgb24gaXQgYmVpbmcgY29udmVydGVkIHRocm91Z2ggQUREX0NBU0VTLgorICBUZXN0Q2FzZShjb25zdCBjaGFyKiB4bmFtZSkgOiBUZXN0Q2FzZSh4bmFtZSwgbnVsbHB0cikge30KKyAgVGVzdENhc2UoY29uc3QgY2hhciogeG5hbWUsIGNvbnN0IGNoYXIqIHhsYWJlbCkKKyAgICAgIDogbmFtZSh4bmFtZSksIGxhYmVsKHhsYWJlbCkge30KKworICB0eXBlZGVmIGJlbmNobWFyazo6QmVuY2htYXJrUmVwb3J0ZXI6OlJ1biBSdW47CisKKyAgdm9pZCBDaGVja1J1bihSdW4gY29uc3QmIHJ1bikgY29uc3QgeworICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICBDSEVDSyhuYW1lID09IHJ1bi5iZW5jaG1hcmtfbmFtZSgpKSA8PCAiZXhwZWN0ZWQgIiA8PCBuYW1lIDw8ICIgZ290ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcnVuLmJlbmNobWFya19uYW1lKCk7CisgICAgaWYgKGxhYmVsKSB7CisgICAgICBDSEVDSyhydW4ucmVwb3J0X2xhYmVsID09IGxhYmVsKSA8PCAiZXhwZWN0ZWQgIiA8PCBsYWJlbCA8PCAiIGdvdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBydW4ucmVwb3J0X2xhYmVsOworICAgIH0gZWxzZSB7CisgICAgICBDSEVDSyhydW4ucmVwb3J0X2xhYmVsID09ICIiKTsKKyAgICB9CisgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgIH0KK307CisKK3N0ZDo6dmVjdG9yPFRlc3RDYXNlPiBFeHBlY3RlZFJlc3VsdHM7CisKK2ludCBBZGRDYXNlcyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VGVzdENhc2U+IGNvbnN0JiB2KSB7CisgIGZvciAoYXV0byBOIDogdikgeworICAgIEV4cGVjdGVkUmVzdWx0cy5wdXNoX2JhY2soTik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ09OQ0FUKHgsIHkpIENPTkNBVDIoeCwgeSkKKyNkZWZpbmUgQ09OQ0FUMih4LCB5KSB4IyN5CisjZGVmaW5lIEFERF9DQVNFUyguLi4pIGludCBDT05DQVQoZHVtbXksIF9fTElORV9fKSA9IEFkZENhc2VzKHtfX1ZBX0FSR1NfX30pCisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKwordHlwZWRlZiBiZW5jaG1hcms6OmludGVybmFsOjpCZW5jaG1hcmsqIFJldHVyblZhbDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIFRlc3QgUmVnaXN0ZXJCZW5jaG1hcmsgd2l0aCBubyBhZGRpdGlvbmFsIGFyZ3VtZW50cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK3ZvaWQgQk1fZnVuY3Rpb24oYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9Cit9CitCRU5DSE1BUksoQk1fZnVuY3Rpb24pOworUmV0dXJuVmFsIGR1bW15ID0gYmVuY2htYXJrOjpSZWdpc3RlckJlbmNobWFyaygKKyAgICAiQk1fZnVuY3Rpb25fbWFudWFsX3JlZ2lzdHJhdGlvbiIsIEJNX2Z1bmN0aW9uKTsKK0FERF9DQVNFUyh7IkJNX2Z1bmN0aW9uIn0sIHsiQk1fZnVuY3Rpb25fbWFudWFsX3JlZ2lzdHJhdGlvbiJ9KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIFRlc3QgUmVnaXN0ZXJCZW5jaG1hcmsgd2l0aCBhZGRpdGlvbmFsIGFyZ3VtZW50cworLy8gTm90ZTogR0NDIDw9IDQuOCBkbyBub3Qgc3VwcG9ydCB0aGlzIGZvcm0gb2YgUmVnaXN0ZXJCZW5jaG1hcmsgYmVjYXVzZSB0aGV5CisvLyAgICAgICByZWplY3QgdGhlIHZhcmlhZGljIHBhY2sgZXhwYW5zaW9uIG9mIGxhbWJkYSBjYXB0dXJlcy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisjaWZuZGVmIEJFTkNITUFSS19IQVNfTk9fVkFSSUFESUNfUkVHSVNURVJfQkVOQ0hNQVJLCisKK3ZvaWQgQk1fZXh0cmFfYXJncyhiZW5jaG1hcms6OlN0YXRlJiBzdCwgY29uc3QgY2hhciogbGFiZWwpIHsKKyAgZm9yIChhdXRvIF8gOiBzdCkgeworICB9CisgIHN0LlNldExhYmVsKGxhYmVsKTsKK30KK2ludCBSZWdpc3RlckZyb21GdW5jdGlvbigpIHsKKyAgc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKj4gY2FzZXNbXSA9IHsKKyAgICAgIHsidGVzdDEiLCAiT25lIn0sIHsidGVzdDIiLCAiVHdvIn0sIHsidGVzdDMiLCAiVGhyZWUifX07CisgIGZvciAoYXV0byBjb25zdCYgYyA6IGNhc2VzKQorICAgIGJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsoYy5maXJzdCwgJkJNX2V4dHJhX2FyZ3MsIGMuc2Vjb25kKTsKKyAgcmV0dXJuIDA7Cit9CitpbnQgZHVtbXkyID0gUmVnaXN0ZXJGcm9tRnVuY3Rpb24oKTsKK0FERF9DQVNFUyh7InRlc3QxIiwgIk9uZSJ9LCB7InRlc3QyIiwgIlR3byJ9LCB7InRlc3QzIiwgIlRocmVlIn0pOworCisjZW5kaWYgIC8vIEJFTkNITUFSS19IQVNfTk9fVkFSSUFESUNfUkVHSVNURVJfQkVOQ0hNQVJLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyBUZXN0IFJlZ2lzdGVyQmVuY2htYXJrIHdpdGggZGlmZmVyZW50IGNhbGxhYmxlIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCitzdHJ1Y3QgQ3VzdG9tRml4dHVyZSB7CisgIHZvaWQgb3BlcmF0b3IoKShiZW5jaG1hcms6OlN0YXRlJiBzdCkgeworICAgIGZvciAoYXV0byBfIDogc3QpIHsKKyAgICB9CisgIH0KK307CisKK3ZvaWQgVGVzdFJlZ2lzdHJhdGlvbkF0UnVudGltZSgpIHsKKyNpZmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCisgIHsKKyAgICBDdXN0b21GaXh0dXJlIGZ4OworICAgIGJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsoImN1c3RvbV9maXh0dXJlIiwgZngpOworICAgIEFkZENhc2VzKHsiY3VzdG9tX2ZpeHR1cmUifSk7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBCRU5DSE1BUktfSEFTX05PX1ZBUklBRElDX1JFR0lTVEVSX0JFTkNITUFSSworICB7CisgICAgY29uc3QgY2hhciogeCA9ICI0MiI7CisgICAgYXV0byBjYXB0dXJpbmdfbGFtID0gWz1dKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgICAgICBmb3IgKGF1dG8gXyA6IHN0KSB7CisgICAgICB9CisgICAgICBzdC5TZXRMYWJlbCh4KTsKKyAgICB9OworICAgIGJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsoImxhbWJkYV9iZW5jaG1hcmsiLCBjYXB0dXJpbmdfbGFtKTsKKyAgICBBZGRDYXNlcyh7eyJsYW1iZGFfYmVuY2htYXJrIiwgeH19KTsKKyAgfQorI2VuZGlmCit9CisKKy8vIFRlc3QgdGhhdCBhbGwgYmVuY2htYXJrcywgcmVnaXN0ZXJlZCBhdCBlaXRoZXIgZHVyaW5nIHN0YXRpYyBpbml0IG9yIHJ1bnRpbWUsCisvLyBhcmUgcnVuIGFuZCB0aGUgcmVzdWx0cyBhcmUgcGFzc2VkIHRvIHRoZSByZXBvcnRlZC4KK3ZvaWQgUnVuVGVzdE9uZSgpIHsKKyAgVGVzdFJlZ2lzdHJhdGlvbkF0UnVudGltZSgpOworCisgIFRlc3RSZXBvcnRlciB0ZXN0X3JlcG9ydGVyOworICBiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoJnRlc3RfcmVwb3J0ZXIpOworCisgIHR5cGVkZWYgYmVuY2htYXJrOjpCZW5jaG1hcmtSZXBvcnRlcjo6UnVuIFJ1bjsKKyAgYXV0byBFQiA9IEV4cGVjdGVkUmVzdWx0cy5iZWdpbigpOworCisgIGZvciAoUnVuIGNvbnN0JiBydW4gOiB0ZXN0X3JlcG9ydGVyLmFsbF9ydW5zXykgeworICAgIGFzc2VydChFQiAhPSBFeHBlY3RlZFJlc3VsdHMuZW5kKCkpOworICAgIEVCLT5DaGVja1J1bihydW4pOworICAgICsrRUI7CisgIH0KKyAgYXNzZXJ0KEVCID09IEV4cGVjdGVkUmVzdWx0cy5lbmQoKSk7Cit9CisKKy8vIFRlc3QgdGhhdCBDbGVhclJlZ2lzdGVyZWRCZW5jaG1hcmtzKCkgY2xlYXJzIGFsbCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKKy8vIGJlbmNobWFya3MuCisvLyBBbHNvIHRlc3QgdGhhdCBuZXcgYmVuY2htYXJrcyBjYW4gYmUgcmVnaXN0ZXJlZCBhbmQgcmFuIGFmdGVyd2FyZHMuCit2b2lkIFJ1blRlc3RUd28oKSB7CisgIGFzc2VydChFeHBlY3RlZFJlc3VsdHMuc2l6ZSgpICE9IDAgJiYKKyAgICAgICAgICJtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHJlZ2lzdGVyZWQgYmVuY2htYXJrIik7CisgIEV4cGVjdGVkUmVzdWx0cy5jbGVhcigpOworICBiZW5jaG1hcms6OkNsZWFyUmVnaXN0ZXJlZEJlbmNobWFya3MoKTsKKworICBUZXN0UmVwb3J0ZXIgdGVzdF9yZXBvcnRlcjsKKyAgc2l6ZV90IG51bV9yYW4gPSBiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoJnRlc3RfcmVwb3J0ZXIpOworICBhc3NlcnQobnVtX3JhbiA9PSAwKTsKKyAgYXNzZXJ0KHRlc3RfcmVwb3J0ZXIuYWxsX3J1bnNfLmJlZ2luKCkgPT0gdGVzdF9yZXBvcnRlci5hbGxfcnVuc18uZW5kKCkpOworCisgIFRlc3RSZWdpc3RyYXRpb25BdFJ1bnRpbWUoKTsKKyAgbnVtX3JhbiA9IGJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygmdGVzdF9yZXBvcnRlcik7CisgIGFzc2VydChudW1fcmFuID09IEV4cGVjdGVkUmVzdWx0cy5zaXplKCkpOworCisgIHR5cGVkZWYgYmVuY2htYXJrOjpCZW5jaG1hcmtSZXBvcnRlcjo6UnVuIFJ1bjsKKyAgYXV0byBFQiA9IEV4cGVjdGVkUmVzdWx0cy5iZWdpbigpOworCisgIGZvciAoUnVuIGNvbnN0JiBydW4gOiB0ZXN0X3JlcG9ydGVyLmFsbF9ydW5zXykgeworICAgIGFzc2VydChFQiAhPSBFeHBlY3RlZFJlc3VsdHMuZW5kKCkpOworICAgIEVCLT5DaGVja1J1bihydW4pOworICAgICsrRUI7CisgIH0KKyAgYXNzZXJ0KEVCID09IEV4cGVjdGVkUmVzdWx0cy5lbmQoKSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgYmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsKKworICBSdW5UZXN0T25lKCk7CisgIFJ1blRlc3RUd28oKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seV90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9yZXBvcnRfYWdncmVnYXRlc19vbmx5X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0NmI5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seV90ZXN0LmNjCkBAIC0wLDAgKzEsMzkgQEAKKworI3VuZGVmIE5ERUJVRworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAib3V0cHV0X3Rlc3QuaCIKKworLy8gT2sgdGhpcyB0ZXN0IGlzIHN1cGVyIHVnbHkuIFdlIHdhbnQgdG8gY2hlY2sgd2hhdCBoYXBwZW5zIHdpdGggdGhlIGZpbGUKKy8vIHJlcG9ydGVyIGluIHRoZSBwcmVzZW5jZSBvZiBSZXBvcnRBZ2dyZWdhdGVzT25seSgpLgorLy8gV2UgZG8gbm90IGNhcmUgYWJvdXQgY29uc29sZSBvdXRwdXQsIHRoZSBub3JtYWwgdGVzdHMgY2hlY2sgdGhhdCBhbHJlYWR5LgorCit2b2lkIEJNX1N1bW1hcnlSZXBlYXQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9Cit9CitCRU5DSE1BUksoQk1fU3VtbWFyeVJlcGVhdCktPlJlcGV0aXRpb25zKDMpLT5SZXBvcnRBZ2dyZWdhdGVzT25seSgpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dCA9IEdldEZpbGVSZXBvcnRlck91dHB1dChhcmdjLCBhcmd2KTsKKworICBpZiAoU3Vic3RyQ250KG91dHB1dCwgIlwibmFtZVwiOiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozIikgIT0gMyB8fAorICAgICAgU3Vic3RyQ250KG91dHB1dCwgIlwibmFtZVwiOiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozX21lYW5cIiIpICE9IDEgfHwKKyAgICAgIFN1YnN0ckNudChvdXRwdXQsICJcIm5hbWVcIjogXCJCTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6M19tZWRpYW5cIiIpICE9CisgICAgICAgICAgMSB8fAorICAgICAgU3Vic3RyQ250KG91dHB1dCwgIlwibmFtZVwiOiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozX3N0ZGRldlwiIikgIT0KKyAgICAgICAgICAxKSB7CisgICAgc3RkOjpjb3V0IDw8ICJQcmVjb25kaXRpb24gbWlzbWF0Y2guIEV4cGVjdGVkIHRvIG9ubHkgZmluZCB0aHJlZSAiCisgICAgICAgICAgICAgICAgICJvY2N1cnJlbmNlcyBvZiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozXCIgc3Vic3RyaW5nOlxuIgorICAgICAgICAgICAgICAgICAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNfbWVhblwiLCAiCisgICAgICAgICAgICAgICAgICJcIm5hbWVcIjogXCJCTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6M19tZWRpYW5cIiwgIgorICAgICAgICAgICAgICAgICAiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNfc3RkZGV2XCJcblRoZSBlbnRpcmUgIgorICAgICAgICAgICAgICAgICAib3V0cHV0OlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgb3V0cHV0OworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3JlcG9ydGVyX291dHB1dF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9yZXBvcnRlcl9vdXRwdXRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTk2YjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9yZXBvcnRlcl9vdXRwdXRfdGVzdC5jYwpAQCAtMCwwICsxLDc0OCBAQAorCisjdW5kZWYgTkRFQlVHCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKyNpbmNsdWRlICJvdXRwdXRfdGVzdC5oIgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3RpbmcgUHJvbG9ndWUgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LCB7eyJeWy1dKyQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyJeQmVuY2htYXJrICVzIFRpbWUgJXMgQ1BVICVzIEl0ZXJhdGlvbnMkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiXlstXSskIiwgTVJfTmV4dH19KTsKK3N0YXRpYyBpbnQgQWRkQ29udGV4dENhc2VzKCkgeworICBBZGRDYXNlcyhUQ19Db25zb2xlRXJyLAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICB7IiVpbnRbLS9dJWludFstL10laW50ICVpbnQ6JWludDolaW50JCIsIE1SX0RlZmF1bHR9LAorICAgICAgICAgICAgICAgeyJSdW5uaW5nIC4qL3JlcG9ydGVyX291dHB1dF90ZXN0KFxcLmV4ZSk/JCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgeyJSdW4gb24gXFwoJWludCBYICVmbG9hdCBNSHogQ1BVIHM/XFwpIiwgTVJfTmV4dH0sCisgICAgICAgICAgIH0pOworICBBZGRDYXNlcyhUQ19KU09OT3V0LAorICAgICAgICAgICB7eyJeXFx7IiwgTVJfRGVmYXVsdH0sCisgICAgICAgICAgICB7IlwiY29udGV4dFwiOiIsIE1SX05leHR9LAorICAgICAgICAgICAgeyJcImRhdGVcIjogXCIiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgIHsiXCJob3N0X25hbWVcIjoiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgIHsiXCJleGVjdXRhYmxlXCI6IFwiLiooL3xcXFxcKXJlcG9ydGVyX291dHB1dF90ZXN0KFxcLmV4ZSk/XCIsIiwKKyAgICAgICAgICAgICBNUl9OZXh0fSwKKyAgICAgICAgICAgIHsiXCJudW1fY3B1c1wiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgIHsiXCJtaHpfcGVyX2NwdVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgeyJcImNwdV9zY2FsaW5nX2VuYWJsZWRcIjogIiwgTVJfTmV4dH0sCisgICAgICAgICAgICB7IlwiY2FjaGVzXCI6IFxcWyQiLCBNUl9OZXh0fX0pOworICBhdXRvIGNvbnN0JiBJbmZvID0gYmVuY2htYXJrOjpDUFVJbmZvOjpHZXQoKTsKKyAgYXV0byBjb25zdCYgQ2FjaGVzID0gSW5mby5jYWNoZXM7CisgIGlmICghQ2FjaGVzLmVtcHR5KCkpIHsKKyAgICBBZGRDYXNlcyhUQ19Db25zb2xlRXJyLCB7eyJDUFUgQ2FjaGVzOiQiLCBNUl9OZXh0fX0pOworICB9CisgIGZvciAoc2l6ZV90IEkgPSAwOyBJIDwgQ2FjaGVzLnNpemUoKTsgKytJKSB7CisgICAgc3RkOjpzdHJpbmcgbnVtX2NhY2hlc19zdHIgPQorICAgICAgICBDYWNoZXNbSV0ubnVtX3NoYXJpbmcgIT0gMCA/ICIgXFwoeCVpbnRcXCkkIiA6ICIkIjsKKyAgICBBZGRDYXNlcyhUQ19Db25zb2xlRXJyLAorICAgICAgICAgICAgIHt7IkwlaW50IChEYXRhfEluc3RydWN0aW9ufFVuaWZpZWQpICVpbnQgS2lCIiArIG51bV9jYWNoZXNfc3RyLAorICAgICAgICAgICAgICAgTVJfTmV4dH19KTsKKyAgICBBZGRDYXNlcyhUQ19KU09OT3V0LCB7eyJcXHskIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0eXBlXCI6IFwiIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJsZXZlbFwiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyJcInNpemVcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiXCJudW1fc2hhcmluZ1wiOiAlaW50JCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7In1bLF17MCwxfSQiLCBNUl9OZXh0fX0pOworICB9CisgIEFkZENhc2VzKFRDX0pTT05PdXQsIHt7Il0sJCJ9fSk7CisgIGF1dG8gY29uc3QmIExvYWRBdmcgPSBJbmZvLmxvYWRfYXZnOworICBpZiAoIUxvYWRBdmcuZW1wdHkoKSkgeworICAgIEFkZENhc2VzKFRDX0NvbnNvbGVFcnIsCisgICAgICAgICAgICAge3siTG9hZCBBdmVyYWdlOiAoJWZsb2F0LCApezAsMn0lZmxvYXQkIiwgTVJfTmV4dH19KTsKKyAgfQorICBBZGRDYXNlcyhUQ19KU09OT3V0LCB7eyJcImxvYWRfYXZnXCI6IFxcWyglZmxvYXQsPyl7MCwzfV0sJCIsIE1SX05leHR9fSk7CisgIHJldHVybiAwOworfQoraW50IGR1bW15X3JlZ2lzdGVyID0gQWRkQ29udGV4dENhc2VzKCk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyIlY3N2X2hlYWRlciJ9fSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0aW5nIEJhc2ljIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9iYXNpYyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9iYXNpYyk7CisKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LCB7eyJeQk1fYmFzaWMgJWNvbnNvbGVfcmVwb3J0JCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwge3siXCJuYW1lXCI6IFwiQk1fYmFzaWNcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX2Jhc2ljXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlYWxfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiY3B1X3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRpbWVfdW5pdFwiOiBcIm5zXCIkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9iYXNpY1wiLCVjc3ZfcmVwb3J0JCJ9fSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0aW5nIEJ5dGVzIHBlciBTZWNvbmQgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9ieXRlc19wZXJfc2Vjb25kKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAvLyBUaGlzIHRlc3QgcmVxdWlyZXMgYSBub24temVybyBDUFUgdGltZSB0byBhdm9pZCBkaXZpZGUtYnktemVybworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9CisgIHN0YXRlLlNldEJ5dGVzUHJvY2Vzc2VkKDEpOworfQorQkVOQ0hNQVJLKEJNX2J5dGVzX3Blcl9zZWNvbmQpOworCitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX2J5dGVzX3Blcl9zZWNvbmQgJWNvbnNvbGVfcmVwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc19wZXJfc2Vjb25kPSVmbG9hdFtrTV17MCwxfS9zJCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwge3siXCJuYW1lXCI6IFwiQk1fYnl0ZXNfcGVyX3NlY29uZFwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fYnl0ZXNfcGVyX3NlY29uZFwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImJ5dGVzX3Blcl9zZWNvbmRcIjogJWZsb2F0JCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7In0iLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0NTVk91dCwge3siXlwiQk1fYnl0ZXNfcGVyX3NlY29uZFwiLCVjc3ZfYnl0ZXNfcmVwb3J0JCJ9fSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0aW5nIEl0ZW1zIHBlciBTZWNvbmQgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9pdGVtc19wZXJfc2Vjb25kKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAvLyBUaGlzIHRlc3QgcmVxdWlyZXMgYSBub24temVybyBDUFUgdGltZSB0byBhdm9pZCBkaXZpZGUtYnktemVybworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9CisgIHN0YXRlLlNldEl0ZW1zUHJvY2Vzc2VkKDEpOworfQorQkVOQ0hNQVJLKEJNX2l0ZW1zX3Blcl9zZWNvbmQpOworCitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX2l0ZW1zX3Blcl9zZWNvbmQgJWNvbnNvbGVfcmVwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtc19wZXJfc2Vjb25kPSVmbG9hdFtrTV17MCwxfS9zJCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwge3siXCJuYW1lXCI6IFwiQk1faXRlbXNfcGVyX3NlY29uZFwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1faXRlbXNfcGVyX3NlY29uZFwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIml0ZW1zX3Blcl9zZWNvbmRcIjogJWZsb2F0JCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7In0iLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0NTVk91dCwge3siXlwiQk1faXRlbXNfcGVyX3NlY29uZFwiLCVjc3ZfaXRlbXNfcmVwb3J0JCJ9fSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0aW5nIExhYmVsIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9sYWJlbChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KKyAgc3RhdGUuU2V0TGFiZWwoInNvbWUgbGFiZWwiKTsKK30KK0JFTkNITUFSSyhCTV9sYWJlbCk7CisKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LCB7eyJeQk1fbGFiZWwgJWNvbnNvbGVfcmVwb3J0IHNvbWUgbGFiZWwkIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LCB7eyJcIm5hbWVcIjogXCJCTV9sYWJlbFwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fbGFiZWxcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJsYWJlbFwiOiBcInNvbWUgbGFiZWxcIiQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJ9IiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Il5cIkJNX2xhYmVsXCIsJWNzdl9sYWJlbF9yZXBvcnRfYmVnaW5cInNvbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAibGFiZWxcIiVjc3ZfbGFiZWxfcmVwb3J0X2VuZCQifX0pOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdGluZyBFcnJvciBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK3ZvaWQgQk1fZXJyb3IoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RhdGUuU2tpcFdpdGhFcnJvcigibWVzc2FnZSIpOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9lcnJvcik7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX2Vycm9yWyBdK0VSUk9SIE9DQ1VSUkVEOiAnbWVzc2FnZSckIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LCB7eyJcIm5hbWVcIjogXCJCTV9lcnJvclwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fZXJyb3JcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJlcnJvcl9vY2N1cnJlZFwiOiB0cnVlLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImVycm9yX21lc3NhZ2VcIjogXCJtZXNzYWdlXCIsJCIsIE1SX05leHR9fSk7CisKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Il5cIkJNX2Vycm9yXCIsLCwsLCwsLHRydWUsXCJtZXNzYWdlXCIkIn19KTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3RpbmcgTm8gQXJnIE5hbWUgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX25vX2FyZ19uYW1lKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX25vX2FyZ19uYW1lKS0+QXJnKDMpOworQUREX0NBU0VTKFRDX0NvbnNvbGVPdXQsIHt7Il5CTV9ub19hcmdfbmFtZS8zICVjb25zb2xlX3JlcG9ydCQifX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsIHt7IlwibmFtZVwiOiBcIkJNX25vX2FyZ19uYW1lLzNcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX25vX2FyZ19uYW1lLzNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Il5cIkJNX25vX2FyZ19uYW1lLzNcIiwlY3N2X3JlcG9ydCQifX0pOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdGluZyBBcmcgTmFtZSBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9hcmdfbmFtZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9hcmdfbmFtZSktPkFyZ05hbWUoImZpcnN0IiktPkFyZygzKTsKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LCB7eyJeQk1fYXJnX25hbWUvZmlyc3Q6MyAlY29uc29sZV9yZXBvcnQkIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LCB7eyJcIm5hbWVcIjogXCJCTV9hcmdfbmFtZS9maXJzdDozXCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9hcmdfbmFtZS9maXJzdDozXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9hcmdfbmFtZS9maXJzdDozXCIsJWNzdl9yZXBvcnQkIn19KTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3RpbmcgQXJnIE5hbWVzIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX2FyZ19uYW1lcyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9hcmdfbmFtZXMpLT5BcmdzKHsyLCA1LCA0fSktPkFyZ05hbWVzKHsiZmlyc3QiLCAiIiwgInRoaXJkIn0pOworQUREX0NBU0VTKFRDX0NvbnNvbGVPdXQsCisgICAgICAgICAge3siXkJNX2FyZ19uYW1lcy9maXJzdDoyLzUvdGhpcmQ6NCAlY29uc29sZV9yZXBvcnQkIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LAorICAgICAgICAgIHt7IlwibmFtZVwiOiBcIkJNX2FyZ19uYW1lcy9maXJzdDoyLzUvdGhpcmQ6NFwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fYXJnX25hbWVzL2ZpcnN0OjIvNS90aGlyZDo0XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9hcmdfbmFtZXMvZmlyc3Q6Mi81L3RoaXJkOjRcIiwlY3N2X3JlcG9ydCQifX0pOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdGluZyBCaWcgQXJncyBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK3ZvaWQgQk1fQmlnQXJncyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9CaWdBcmdzKS0+UmFuZ2VNdWx0aXBsaWVyKDIpLT5SYW5nZSgxVSA8PCAzMFUsIDFVIDw8IDMxVSk7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX0JpZ0FyZ3MvMTA3Mzc0MTgyNCAlY29uc29sZV9yZXBvcnQkIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiXkJNX0JpZ0FyZ3MvMjE0NzQ4MzY0OCAlY29uc29sZV9yZXBvcnQkIn19KTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdGluZyBDb21wbGV4aXR5IE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX0NvbXBsZXhpdHlfTzEoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIC8vIFRoaXMgdGVzdCByZXF1aXJlcyBhIG5vbi16ZXJvIENQVSB0aW1lIHRvIGF2b2lkIGRpdmlkZS1ieS16ZXJvCisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHN0YXRlLml0ZXJhdGlvbnMoKSk7CisgIH0KKyAgc3RhdGUuU2V0Q29tcGxleGl0eU4oc3RhdGUucmFuZ2UoMCkpOworfQorQkVOQ0hNQVJLKEJNX0NvbXBsZXhpdHlfTzEpLT5SYW5nZSgxLCAxIDw8IDE4KS0+Q29tcGxleGl0eShiZW5jaG1hcms6Om8xKTsKK1NFVF9TVUJTVElUVVRJT05TKHt7IiViaWdPU3RyIiwgIlsgXSogJWZsb2F0IFxcKFswLTldK1xcKSJ9LAorICAgICAgICAgICAgICAgICAgIHsiJVJNUyIsICJbIF0qWzAtOV0rICUifX0pOworQUREX0NBU0VTKFRDX0NvbnNvbGVPdXQsIHt7Il5CTV9Db21wbGV4aXR5X08xX0JpZ08gJWJpZ09TdHIgJWJpZ09TdHJbIF0qJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7Il5CTV9Db21wbGV4aXR5X08xX1JNUyAlUk1TICVSTVNbIF0qJCJ9fSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3RpbmcgQWdncmVnYXRlIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKworLy8gVGVzdCB0aGF0IG5vbi1hZ2dyZWdhdGUgZGF0YSBpcyBwcmludGVkIGJ5IGRlZmF1bHQKK3ZvaWQgQk1fUmVwZWF0KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorLy8gbmVlZCB0d28gcmVwZXRpdGlvbnMgbWluIHRvIGJlIGFibGUgdG8gb3V0cHV0IGFueSBhZ2dyZWdhdGUgb3V0cHV0CitCRU5DSE1BUksoQk1fUmVwZWF0KS0+UmVwZXRpdGlvbnMoMik7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwKKyAgICAgICAgICB7eyJeQk1fUmVwZWF0L3JlcGVhdHM6MiAlY29uc29sZV9yZXBvcnQkIn0sCisgICAgICAgICAgIHsiXkJNX1JlcGVhdC9yZXBlYXRzOjIgJWNvbnNvbGVfcmVwb3J0JCJ9LAorICAgICAgICAgICB7Il5CTV9SZXBlYXQvcmVwZWF0czoyX21lYW4gJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCBbIF0qMiQifSwKKyAgICAgICAgICAgeyJeQk1fUmVwZWF0L3JlcGVhdHM6Ml9tZWRpYW4gJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCBbIF0qMiQifSwKKyAgICAgICAgICAgeyJeQk1fUmVwZWF0L3JlcGVhdHM6Ml9zdGRkZXYgJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCBbIF0qMiQifX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsIHt7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjJcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjJcIiIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAyLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjJcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjJcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJuYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6Ml9tZWFuXCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czoyXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAyLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcIm1lYW5cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjJfbWVkaWFuXCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czoyXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAyLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcIm1lZGlhblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJuYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6Ml9zdGRkZXZcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjJcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcImFnZ3JlZ2F0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImFnZ3JlZ2F0ZV9uYW1lXCI6IFwic3RkZGV2XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAyLCQiLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0NTVk91dCwge3siXlwiQk1fUmVwZWF0L3JlcGVhdHM6MlwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICAgICAgICAgICAgICAgICAgIHsiXlwiQk1fUmVwZWF0L3JlcGVhdHM6MlwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICAgICAgICAgICAgICAgICAgIHsiXlwiQk1fUmVwZWF0L3JlcGVhdHM6Ml9tZWFuXCIsJWNzdl9yZXBvcnQkIn0sCisgICAgICAgICAgICAgICAgICAgICAgeyJeXCJCTV9SZXBlYXQvcmVwZWF0czoyX21lZGlhblwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICAgICAgICAgICAgICAgICAgIHsiXlwiQk1fUmVwZWF0L3JlcGVhdHM6Ml9zdGRkZXZcIiwlY3N2X3JlcG9ydCQifX0pOworLy8gYnV0IGZvciB0d28gcmVwZXRpdGlvbnMsIG1lYW4gYW5kIG1lZGlhbiBpcyB0aGUgc2FtZSwgc28gbGV0J3MgcmVwZWF0Li4KK0JFTkNITUFSSyhCTV9SZXBlYXQpLT5SZXBldGl0aW9ucygzKTsKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LAorICAgICAgICAgIHt7Il5CTV9SZXBlYXQvcmVwZWF0czozICVjb25zb2xlX3JlcG9ydCQifSwKKyAgICAgICAgICAgeyJeQk1fUmVwZWF0L3JlcGVhdHM6MyAlY29uc29sZV9yZXBvcnQkIn0sCisgICAgICAgICAgIHsiXkJNX1JlcGVhdC9yZXBlYXRzOjMgJWNvbnNvbGVfcmVwb3J0JCJ9LAorICAgICAgICAgICB7Il5CTV9SZXBlYXQvcmVwZWF0czozX21lYW4gJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCBbIF0qMyQifSwKKyAgICAgICAgICAgeyJeQk1fUmVwZWF0L3JlcGVhdHM6M19tZWRpYW4gJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCBbIF0qMyQifSwKKyAgICAgICAgICAgeyJeQk1fUmVwZWF0L3JlcGVhdHM6M19zdGRkZXYgJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCBbIF0qMyQifX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsIHt7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjNcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDMsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJuYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6M1wiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6M1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIm5hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czozXCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czozXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjNfbWVhblwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6M1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiYWdncmVnYXRlXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiYWdncmVnYXRlX25hbWVcIjogXCJtZWFuXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIm5hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czozX21lZGlhblwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6M1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiYWdncmVnYXRlXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiYWdncmVnYXRlX25hbWVcIjogXCJtZWRpYW5cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6IDMsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjNfc3RkZGV2XCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czozXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcInN0ZGRldlwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMywkIiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjNcIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjNcIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjNcIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjNfbWVhblwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICAgICAgICAgICAgICAgICAgIHsiXlwiQk1fUmVwZWF0L3JlcGVhdHM6M19tZWRpYW5cIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjNfc3RkZGV2XCIsJWNzdl9yZXBvcnQkIn19KTsKKy8vIG1lZGlhbiBkaWZmZXJzIGJldHdlZW4gZXZlbi9vZGQgbnVtYmVyIG9mIHJlcGV0aXRpb25zLCBzbyBqdXN0IHRvIGJlIHN1cmUKK0JFTkNITUFSSyhCTV9SZXBlYXQpLT5SZXBldGl0aW9ucyg0KTsKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LAorICAgICAgICAgIHt7Il5CTV9SZXBlYXQvcmVwZWF0czo0ICVjb25zb2xlX3JlcG9ydCQifSwKKyAgICAgICAgICAgeyJeQk1fUmVwZWF0L3JlcGVhdHM6NCAlY29uc29sZV9yZXBvcnQkIn0sCisgICAgICAgICAgIHsiXkJNX1JlcGVhdC9yZXBlYXRzOjQgJWNvbnNvbGVfcmVwb3J0JCJ9LAorICAgICAgICAgICB7Il5CTV9SZXBlYXQvcmVwZWF0czo0ICVjb25zb2xlX3JlcG9ydCQifSwKKyAgICAgICAgICAgeyJeQk1fUmVwZWF0L3JlcGVhdHM6NF9tZWFuICVjb25zb2xlX3RpbWVfb25seV9yZXBvcnQgWyBdKjQkIn0sCisgICAgICAgICAgIHsiXkJNX1JlcGVhdC9yZXBlYXRzOjRfbWVkaWFuICVjb25zb2xlX3RpbWVfb25seV9yZXBvcnQgWyBdKjQkIn0sCisgICAgICAgICAgIHsiXkJNX1JlcGVhdC9yZXBlYXRzOjRfc3RkZGV2ICVjb25zb2xlX3RpbWVfb25seV9yZXBvcnQgWyBdKjQkIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LCB7eyJcIm5hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czo0XCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czo0XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiA0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjRcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjRcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJuYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6NFwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6NFwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogNCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIm5hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czo0XCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czo0XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiA0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMywkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjRfbWVhblwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6NFwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiYWdncmVnYXRlXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogNCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiYWdncmVnYXRlX25hbWVcIjogXCJtZWFuXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiA0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIm5hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czo0X21lZGlhblwiLCQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fUmVwZWF0L3JlcGVhdHM6NFwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiYWdncmVnYXRlXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogNCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiYWdncmVnYXRlX25hbWVcIjogXCJtZWRpYW5cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6IDQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1JlcGVhdC9yZXBlYXRzOjRfc3RkZGV2XCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9SZXBlYXQvcmVwZWF0czo0XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiA0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcInN0ZGRldlwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogNCwkIiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjRcIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjRcIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjRcIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjRcIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjRfbWVhblwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICAgICAgICAgICAgICAgICAgIHsiXlwiQk1fUmVwZWF0L3JlcGVhdHM6NF9tZWRpYW5cIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1JlcGVhdC9yZXBlYXRzOjRfc3RkZGV2XCIsJWNzdl9yZXBvcnQkIn19KTsKKworLy8gVGVzdCB0aGF0IGEgbm9uLXJlcGVhdGVkIHRlc3Qgc3RpbGwgcHJpbnRzIG5vbi1hZ2dyZWdhdGUgcmVzdWx0cyBldmVuIHdoZW4KKy8vIG9ubHktYWdncmVnYXRlIHJlcG9ydHMgaGF2ZSBiZWVuIHJlcXVlc3RlZAordm9pZCBCTV9SZXBlYXRPbmNlKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX1JlcGVhdE9uY2UpLT5SZXBldGl0aW9ucygxKS0+UmVwb3J0QWdncmVnYXRlc09ubHkoKTsKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LCB7eyJeQk1fUmVwZWF0T25jZS9yZXBlYXRzOjEgJWNvbnNvbGVfcmVwb3J0JCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwge3siXCJuYW1lXCI6IFwiQk1fUmVwZWF0T25jZS9yZXBlYXRzOjFcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1JlcGVhdE9uY2UvcmVwZWF0czoxXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9SZXBlYXRPbmNlL3JlcGVhdHM6MVwiLCVjc3ZfcmVwb3J0JCJ9fSk7CisKKy8vIFRlc3QgdGhhdCBub24tYWdncmVnYXRlIGRhdGEgaXMgbm90IHJlcG9ydGVkCit2b2lkIEJNX1N1bW1hcnlSZXBlYXQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9Cit9CitCRU5DSE1BUksoQk1fU3VtbWFyeVJlcGVhdCktPlJlcGV0aXRpb25zKDMpLT5SZXBvcnRBZ2dyZWdhdGVzT25seSgpOworQUREX0NBU0VTKAorICAgIFRDX0NvbnNvbGVPdXQsCisgICAge3siLipCTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6MyAiLCBNUl9Ob3R9LAorICAgICB7Il5CTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6M19tZWFuICVjb25zb2xlX3RpbWVfb25seV9yZXBvcnQgWyBdKjMkIn0sCisgICAgIHsiXkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozX21lZGlhbiAlY29uc29sZV90aW1lX29ubHlfcmVwb3J0IFsgXSozJCJ9LAorICAgICB7Il5CTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6M19zdGRkZXYgJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCBbIF0qMyQifX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsCisgICAgICAgICAge3siLipCTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6MyAiLCBNUl9Ob3R9LAorICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozX21lYW5cIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcIm1lYW5cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6IDMsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozX21lZGlhblwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcImFnZ3JlZ2F0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDMsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImFnZ3JlZ2F0ZV9uYW1lXCI6IFwibWVkaWFuXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIm5hbWVcIjogXCJCTV9TdW1tYXJ5UmVwZWF0L3JlcGVhdHM6M19zdGRkZXZcIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcInN0ZGRldlwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMywkIiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Ii4qQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjMgIiwgTVJfTm90fSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozX21lYW5cIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgICAgICAgICAgICB7Il5cIkJNX1N1bW1hcnlSZXBlYXQvcmVwZWF0czozX21lZGlhblwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICAgICAgICAgICAgICAgICAgIHsiXlwiQk1fU3VtbWFyeVJlcGVhdC9yZXBlYXRzOjNfc3RkZGV2XCIsJWNzdl9yZXBvcnQkIn19KTsKKworLy8gVGVzdCB0aGF0IG5vbi1hZ2dyZWdhdGUgZGF0YSBpcyBub3QgZGlzcGxheWVkLgorLy8gTk9URTogdGhpcyB0ZXN0IGlzIGtpbmRhIGJhZC4gd2UgYXJlIG9ubHkgdGVzdGluZyB0aGUgZGlzcGxheSBvdXRwdXQuCisvLyAgICAgICBCdXQgd2UgZG9uJ3QgY2hlY2sgdGhhdCB0aGUgZmlsZSBvdXRwdXQgc3RpbGwgY29udGFpbnMgZXZlcnl0aGluZy4uLgordm9pZCBCTV9TdW1tYXJ5RGlzcGxheShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9TdW1tYXJ5RGlzcGxheSktPlJlcGV0aXRpb25zKDIpLT5EaXNwbGF5QWdncmVnYXRlc09ubHkoKTsKK0FERF9DQVNFUygKKyAgICBUQ19Db25zb2xlT3V0LAorICAgIHt7Ii4qQk1fU3VtbWFyeURpc3BsYXkvcmVwZWF0czoyICIsIE1SX05vdH0sCisgICAgIHsiXkJNX1N1bW1hcnlEaXNwbGF5L3JlcGVhdHM6Ml9tZWFuICVjb25zb2xlX3RpbWVfb25seV9yZXBvcnQgWyBdKjIkIn0sCisgICAgIHsiXkJNX1N1bW1hcnlEaXNwbGF5L3JlcGVhdHM6Ml9tZWRpYW4gJWNvbnNvbGVfdGltZV9vbmx5X3JlcG9ydCBbIF0qMiQifSwKKyAgICAgeyJeQk1fU3VtbWFyeURpc3BsYXkvcmVwZWF0czoyX3N0ZGRldiAlY29uc29sZV90aW1lX29ubHlfcmVwb3J0IFsgXSoyJCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwKKyAgICAgICAgICB7eyIuKkJNX1N1bW1hcnlEaXNwbGF5L3JlcGVhdHM6MiAiLCBNUl9Ob3R9LAorICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1N1bW1hcnlEaXNwbGF5L3JlcGVhdHM6Ml9tZWFuXCIsJCJ9LAorICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9TdW1tYXJ5RGlzcGxheS9yZXBlYXRzOjJcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcImFnZ3JlZ2F0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImFnZ3JlZ2F0ZV9uYW1lXCI6IFwibWVhblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeURpc3BsYXkvcmVwZWF0czoyX21lZGlhblwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fU3VtbWFyeURpc3BsYXkvcmVwZWF0czoyXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAyLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcIm1lZGlhblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJuYW1lXCI6IFwiQk1fU3VtbWFyeURpc3BsYXkvcmVwZWF0czoyX3N0ZGRldlwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fU3VtbWFyeURpc3BsYXkvcmVwZWF0czoyXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAyLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcInN0ZGRldlwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMiwkIiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsCisgICAgICAgICAge3siLipCTV9TdW1tYXJ5RGlzcGxheS9yZXBlYXRzOjIgIiwgTVJfTm90fSwKKyAgICAgICAgICAgeyJeXCJCTV9TdW1tYXJ5RGlzcGxheS9yZXBlYXRzOjJfbWVhblwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICAgICAgICB7Il5cIkJNX1N1bW1hcnlEaXNwbGF5L3JlcGVhdHM6Ml9tZWRpYW5cIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgICAgICAgeyJeXCJCTV9TdW1tYXJ5RGlzcGxheS9yZXBlYXRzOjJfc3RkZGV2XCIsJWNzdl9yZXBvcnQkIn19KTsKKworLy8gVGVzdCByZXBlYXRzIHdpdGggY3VzdG9tIHRpbWUgdW5pdC4KK3ZvaWQgQk1fUmVwZWF0VGltZVVuaXQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9Cit9CitCRU5DSE1BUksoQk1fUmVwZWF0VGltZVVuaXQpCisgICAgLT5SZXBldGl0aW9ucygzKQorICAgIC0+UmVwb3J0QWdncmVnYXRlc09ubHkoKQorICAgIC0+VW5pdChiZW5jaG1hcms6OmtNaWNyb3NlY29uZCk7CitBRERfQ0FTRVMoCisgICAgVENfQ29uc29sZU91dCwKKyAgICB7eyIuKkJNX1JlcGVhdFRpbWVVbml0L3JlcGVhdHM6MyAiLCBNUl9Ob3R9LAorICAgICB7Il5CTV9SZXBlYXRUaW1lVW5pdC9yZXBlYXRzOjNfbWVhbiAlY29uc29sZV91c190aW1lX29ubHlfcmVwb3J0IFsgXSozJCJ9LAorICAgICB7Il5CTV9SZXBlYXRUaW1lVW5pdC9yZXBlYXRzOjNfbWVkaWFuICVjb25zb2xlX3VzX3RpbWVfb25seV9yZXBvcnQgWyAiCisgICAgICAiXSozJCJ9LAorICAgICB7Il5CTV9SZXBlYXRUaW1lVW5pdC9yZXBlYXRzOjNfc3RkZGV2ICVjb25zb2xlX3VzX3RpbWVfb25seV9yZXBvcnQgWyAiCisgICAgICAiXSozJCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwKKyAgICAgICAgICB7eyIuKkJNX1JlcGVhdFRpbWVVbml0L3JlcGVhdHM6MyAiLCBNUl9Ob3R9LAorICAgICAgICAgICB7IlwibmFtZVwiOiBcIkJNX1JlcGVhdFRpbWVVbml0L3JlcGVhdHM6M19tZWFuXCIsJCJ9LAorICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9SZXBlYXRUaW1lVW5pdC9yZXBlYXRzOjNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcImFnZ3JlZ2F0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDMsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImFnZ3JlZ2F0ZV9uYW1lXCI6IFwibWVhblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJ1c1wiLD8kIn0sCisgICAgICAgICAgIHsiXCJuYW1lXCI6IFwiQk1fUmVwZWF0VGltZVVuaXQvcmVwZWF0czozX21lZGlhblwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fUmVwZWF0VGltZVVuaXQvcmVwZWF0czozXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcIm1lZGlhblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJ1c1wiLD8kIn0sCisgICAgICAgICAgIHsiXCJuYW1lXCI6IFwiQk1fUmVwZWF0VGltZVVuaXQvcmVwZWF0czozX3N0ZGRldlwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fUmVwZWF0VGltZVVuaXQvcmVwZWF0czozXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcInN0ZGRldlwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJ1c1wiLD8kIn19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsCisgICAgICAgICAge3siLipCTV9SZXBlYXRUaW1lVW5pdC9yZXBlYXRzOjMgIiwgTVJfTm90fSwKKyAgICAgICAgICAgeyJeXCJCTV9SZXBlYXRUaW1lVW5pdC9yZXBlYXRzOjNfbWVhblwiLCVjc3ZfdXNfcmVwb3J0JCJ9LAorICAgICAgICAgICB7Il5cIkJNX1JlcGVhdFRpbWVVbml0L3JlcGVhdHM6M19tZWRpYW5cIiwlY3N2X3VzX3JlcG9ydCQifSwKKyAgICAgICAgICAgeyJeXCJCTV9SZXBlYXRUaW1lVW5pdC9yZXBlYXRzOjNfc3RkZGV2XCIsJWNzdl91c19yZXBvcnQkIn19KTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdGluZyB1c2VyLXByb3ZpZGVkIHN0YXRpc3RpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCitjb25zdCBhdXRvIFVzZXJTdGF0aXN0aWNzID0gW10oY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdikgeworICByZXR1cm4gdi5iYWNrKCk7Cit9Owordm9pZCBCTV9Vc2VyU3RhdHMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIHN0YXRlLlNldEl0ZXJhdGlvblRpbWUoMTUwIC8gMTBlOCk7CisgIH0KK30KKy8vIGNsYW5nLWZvcm1hdCBvZmYKK0JFTkNITUFSSyhCTV9Vc2VyU3RhdHMpCisgIC0+UmVwZXRpdGlvbnMoMykKKyAgLT5JdGVyYXRpb25zKDUpCisgIC0+VXNlTWFudWFsVGltZSgpCisgIC0+Q29tcHV0ZVN0YXRpc3RpY3MoIiIsIFVzZXJTdGF0aXN0aWNzKTsKKy8vIGNsYW5nLWZvcm1hdCBvbgorCisvLyBjaGVjayB0aGF0IHVzZXItcHJvdmlkZWQgc3RhdHMgaXMgY2FsY3VsYXRlZCwgYW5kIGlzIGFmdGVyIHRoZSBkZWZhdWx0LW9uZXMKKy8vIGVtcHR5IHN0cmluZyBhcyBuYW1lIGlzIGludGVudGlvbmFsLCBpdCB3b3VsZCBzb3J0IGJlZm9yZSBhbnl0aGluZyBlbHNlCitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lIFsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0qIDE1MCBucyAldGltZSBbIF0qNSQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyJeQk1fVXNlclN0YXRzL2l0ZXJhdGlvbnM6NS9yZXBlYXRzOjMvbWFudWFsX3RpbWUgWyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSogMTUwIG5zICV0aW1lIFsgXSo1JCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7Il5CTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My9tYW51YWxfdGltZSBbICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJdKiAxNTAgbnMgJXRpbWUgWyBdKjUkIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiXkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYW51YWxfdGltZV9tZWFuIFsgXSogMTUwIG5zICV0aW1lIFsgXSozJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7Il5CTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFudWFsX3RpbWVfbWVkaWFuIFsgXSogMTUwIG5zICV0aW1lIFsgXSozJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7Il5CTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFudWFsX3RpbWVfc3RkZGV2IFsgXSogMC4wMDAgbnMgJXRpbWUgWyBdKjMkIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiXkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lXyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyBdKiAxNTAgbnMgJXRpbWUgWyBdKjMkIn19KTsKK0FERF9DQVNFUygKKyAgICBUQ19KU09OT3V0LAorICAgIHt7IlwibmFtZVwiOiBcIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lXCIsJCJ9LAorICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My9tYW51YWxfdGltZVwiLCQiLAorICAgICAgTVJfTmV4dH0sCisgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcInJlcGV0aXRpb25zXCI6IDMsJCIsIE1SX05leHR9LAorICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJpdGVyYXRpb25zXCI6IDUsJCIsIE1SX05leHR9LAorICAgICB7IlwicmVhbF90aW1lXCI6IDFcXC41KDApKmVcXCsoMCkqMiwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJuYW1lXCI6IFwiQk1fVXNlclN0YXRzL2l0ZXJhdGlvbnM6NS9yZXBlYXRzOjMvbWFudWFsX3RpbWVcIiwkIn0sCisgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lXCIsJCIsCisgICAgICBNUl9OZXh0fSwKKyAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICB7IlwicmVwZXRpdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDEsJCIsIE1SX05leHR9LAorICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcIml0ZXJhdGlvbnNcIjogNSwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJyZWFsX3RpbWVcIjogMVxcLjUoMCkqZVxcKygwKSoyLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcIm5hbWVcIjogXCJCTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My9tYW51YWxfdGltZVwiLCQifSwKKyAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fVXNlclN0YXRzL2l0ZXJhdGlvbnM6NS9yZXBlYXRzOjMvbWFudWFsX3RpbWVcIiwkIiwKKyAgICAgIE1SX05leHR9LAorICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMiwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICB7IlwiaXRlcmF0aW9uc1wiOiA1LCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcInJlYWxfdGltZVwiOiAxXFwuNSgwKSplXFwrKDApKjIsJCIsIE1SX05leHR9LAorICAgICB7IlwibmFtZVwiOiBcIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lX21lYW5cIiwkIn0sCisgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lXCIsJCIsCisgICAgICBNUl9OZXh0fSwKKyAgICAgeyJcInJ1bl90eXBlXCI6IFwiYWdncmVnYXRlXCIsJCIsIE1SX05leHR9LAorICAgICB7IlwicmVwZXRpdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICB7IlwiYWdncmVnYXRlX25hbWVcIjogXCJtZWFuXCIsJCIsIE1SX05leHR9LAorICAgICB7IlwiaXRlcmF0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcInJlYWxfdGltZVwiOiAxXFwuNSgwKSplXFwrKDApKjIsJCIsIE1SX05leHR9LAorICAgICB7IlwibmFtZVwiOiBcIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lX21lZGlhblwiLCQifSwKKyAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fVXNlclN0YXRzL2l0ZXJhdGlvbnM6NS9yZXBlYXRzOjMvbWFudWFsX3RpbWVcIiwkIiwKKyAgICAgIE1SX05leHR9LAorICAgICB7IlwicnVuX3R5cGVcIjogXCJhZ2dyZWdhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJhZ2dyZWdhdGVfbmFtZVwiOiBcIm1lZGlhblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcIml0ZXJhdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJyZWFsX3RpbWVcIjogMVxcLjUoMCkqZVxcKygwKSoyLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcIm5hbWVcIjogXCJCTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My9tYW51YWxfdGltZV9zdGRkZXZcIiwkIn0sCisgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lXCIsJCIsCisgICAgICBNUl9OZXh0fSwKKyAgICAgeyJcInJ1bl90eXBlXCI6IFwiYWdncmVnYXRlXCIsJCIsIE1SX05leHR9LAorICAgICB7IlwicmVwZXRpdGlvbnNcIjogMywkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICB7IlwiYWdncmVnYXRlX25hbWVcIjogXCJzdGRkZXZcIiwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJpdGVyYXRpb25zXCI6IDMsJCIsIE1SX05leHR9LAorICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgIHsiXCJuYW1lXCI6IFwiQk1fVXNlclN0YXRzL2l0ZXJhdGlvbnM6NS9yZXBlYXRzOjMvbWFudWFsX3RpbWVfXCIsJCJ9LAorICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My9tYW51YWxfdGltZVwiLCQiLAorICAgICAgTVJfTmV4dH0sCisgICAgIHsiXCJydW5fdHlwZVwiOiBcImFnZ3JlZ2F0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcInJlcGV0aXRpb25zXCI6IDMsJCIsIE1SX05leHR9LAorICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcImFnZ3JlZ2F0ZV9uYW1lXCI6IFwiXCIsJCIsIE1SX05leHR9LAorICAgICB7IlwiaXRlcmF0aW9uc1wiOiAzLCQiLCBNUl9OZXh0fSwKKyAgICAgeyJcInJlYWxfdGltZVwiOiAxXFwuNSgwKSplXFwrKDApKjIsJCIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoCisgICAgVENfQ1NWT3V0LAorICAgIHt7Il5cIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lXCIsJWNzdl9yZXBvcnQkIn0sCisgICAgIHsiXlwiQk1fVXNlclN0YXRzL2l0ZXJhdGlvbnM6NS9yZXBlYXRzOjMvbWFudWFsX3RpbWVcIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgeyJeXCJCTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My9tYW51YWxfdGltZVwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICB7Il5cIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lX21lYW5cIiwlY3N2X3JlcG9ydCQifSwKKyAgICAgeyJeXCJCTV9Vc2VyU3RhdHMvaXRlcmF0aW9uczo1L3JlcGVhdHM6My8iCisgICAgICAibWFudWFsX3RpbWVfbWVkaWFuXCIsJWNzdl9yZXBvcnQkIn0sCisgICAgIHsiXlwiQk1fVXNlclN0YXRzL2l0ZXJhdGlvbnM6NS9yZXBlYXRzOjMvIgorICAgICAgIm1hbnVhbF90aW1lX3N0ZGRldlwiLCVjc3ZfcmVwb3J0JCJ9LAorICAgICB7Il5cIkJNX1VzZXJTdGF0cy9pdGVyYXRpb25zOjUvcmVwZWF0czozL21hbnVhbF90aW1lX1wiLCVjc3ZfcmVwb3J0JCJ9fSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdGluZyBTdHJFc2NhcGUgSlNPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKyNpZiAwIC8vIGVuYWJsZSB3aGVuIGNzdiB0ZXN0aW5nIGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgbXVsdGktbGluZSBmaWVsZHMKK3ZvaWQgQk1fSlNPTl9Gb3JtYXQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RhdGUuU2tpcFdpdGhFcnJvcigidmFsXGJcZlxuXHJcdFxcXCJ3aXRoXCJlcyxjYXBlcyIpOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KK30KK0JFTkNITUFSSyhCTV9KU09OX0Zvcm1hdCk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwge3siXCJuYW1lXCI6IFwiQk1fSlNPTl9Gb3JtYXRcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0pTT05fRm9ybWF0XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiZXJyb3Jfb2NjdXJyZWRcIjogdHJ1ZSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHtSIigiZXJyb3JfbWVzc2FnZSI6ICJ2YWxcXGJcXGZcXG5cXHJcXHRcXFxcXFwid2l0aFxcImVzLGNhcGVzIiwkKSIsIE1SX05leHR9fSk7CisjZW5kaWYKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3RpbmcgQ3N2RXNjYXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9DU1ZfRm9ybWF0KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlwiZnJlZWRvbVwiIik7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX0NTVl9Gb3JtYXQpOworQUREX0NBU0VTKFRDX0NTVk91dCwge3siXlwiQk1fQ1NWX0Zvcm1hdFwiLCwsLCwsLCx0cnVlLFwiXCJcImZyZWVkb21cIlwiXCIkIn19KTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRFU1QgQ0FTRVMgRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7IFJ1bk91dHB1dFRlc3RzKGFyZ2MsIGFyZ3YpOyB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3NraXBfd2l0aF9lcnJvcl90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9za2lwX3dpdGhfZXJyb3JfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjU3OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9za2lwX3dpdGhfZXJyb3JfdGVzdC5jYwpAQCAtMCwwICsxLDE4OSBAQAorCisjdW5kZWYgTkRFQlVHCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICIuLi9zcmMvY2hlY2suaCIgIC8vIE5PVEU6IGNoZWNrLmggaXMgZm9yIGludGVybmFsIHVzZSBvbmx5IQorI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgVGVzdFJlcG9ydGVyIDogcHVibGljIGJlbmNobWFyazo6Q29uc29sZVJlcG9ydGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBSZXBvcnRDb250ZXh0KGNvbnN0IENvbnRleHQmIGNvbnRleHQpIHsKKyAgICByZXR1cm4gQ29uc29sZVJlcG9ydGVyOjpSZXBvcnRDb250ZXh0KGNvbnRleHQpOworICB9OworCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRSdW5zKGNvbnN0IHN0ZDo6dmVjdG9yPFJ1bj4mIHJlcG9ydCkgeworICAgIGFsbF9ydW5zXy5pbnNlcnQoYWxsX3J1bnNfLmVuZCgpLCBiZWdpbihyZXBvcnQpLCBlbmQocmVwb3J0KSk7CisgICAgQ29uc29sZVJlcG9ydGVyOjpSZXBvcnRSdW5zKHJlcG9ydCk7CisgIH0KKworICBUZXN0UmVwb3J0ZXIoKSB7fQorICB2aXJ0dWFsIH5UZXN0UmVwb3J0ZXIoKSB7fQorCisgIG11dGFibGUgc3RkOjp2ZWN0b3I8UnVuPiBhbGxfcnVuc187Cit9OworCitzdHJ1Y3QgVGVzdENhc2UgeworICBzdGQ6OnN0cmluZyBuYW1lOworICBib29sIGVycm9yX29jY3VycmVkOworICBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlOworCisgIHR5cGVkZWYgYmVuY2htYXJrOjpCZW5jaG1hcmtSZXBvcnRlcjo6UnVuIFJ1bjsKKworICB2b2lkIENoZWNrUnVuKFJ1biBjb25zdCYgcnVuKSBjb25zdCB7CisgICAgQ0hFQ0sobmFtZSA9PSBydW4uYmVuY2htYXJrX25hbWUoKSkKKyAgICAgICAgPDwgImV4cGVjdGVkICIgPDwgbmFtZSA8PCAiIGdvdCAiIDw8IHJ1bi5iZW5jaG1hcmtfbmFtZSgpOworICAgIENIRUNLKGVycm9yX29jY3VycmVkID09IHJ1bi5lcnJvcl9vY2N1cnJlZCk7CisgICAgQ0hFQ0soZXJyb3JfbWVzc2FnZSA9PSBydW4uZXJyb3JfbWVzc2FnZSk7CisgICAgaWYgKGVycm9yX29jY3VycmVkKSB7CisgICAgICAvLyBDSEVDSyhydW4uaXRlcmF0aW9ucyA9PSAwKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0hFQ0socnVuLml0ZXJhdGlvbnMgIT0gMCk7CisgICAgfQorICB9Cit9OworCitzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gRXhwZWN0ZWRSZXN1bHRzOworCitpbnQgQWRkQ2FzZXMoY29uc3QgY2hhciogYmFzZV9uYW1lLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VGVzdENhc2U+IGNvbnN0JiB2KSB7CisgIGZvciAoYXV0byBUQyA6IHYpIHsKKyAgICBUQy5uYW1lID0gYmFzZV9uYW1lICsgVEMubmFtZTsKKyAgICBFeHBlY3RlZFJlc3VsdHMucHVzaF9iYWNrKHN0ZDo6bW92ZShUQykpOworICB9CisgIHJldHVybiAwOworfQorCisjZGVmaW5lIENPTkNBVCh4LCB5KSBDT05DQVQyKHgsIHkpCisjZGVmaW5lIENPTkNBVDIoeCwgeSkgeCMjeQorI2RlZmluZSBBRERfQ0FTRVMoLi4uKSBpbnQgQ09OQ0FUKGR1bW15LCBfX0xJTkVfXykgPSBBZGRDYXNlcyhfX1ZBX0FSR1NfXykKKworfSAgLy8gZW5kIG5hbWVzcGFjZQorCit2b2lkIEJNX2Vycm9yX2JlZm9yZV9ydW5uaW5nKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIHN0YXRlLlNraXBXaXRoRXJyb3IoImVycm9yIG1lc3NhZ2UiKTsKKyAgd2hpbGUgKHN0YXRlLktlZXBSdW5uaW5nKCkpIHsKKyAgICBhc3NlcnQoZmFsc2UpOworICB9Cit9CitCRU5DSE1BUksoQk1fZXJyb3JfYmVmb3JlX3J1bm5pbmcpOworQUREX0NBU0VTKCJCTV9lcnJvcl9iZWZvcmVfcnVubmluZyIsIHt7IiIsIHRydWUsICJlcnJvciBtZXNzYWdlIn19KTsKKwordm9pZCBCTV9lcnJvcl9iZWZvcmVfcnVubmluZ19iYXRjaChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJlcnJvciBtZXNzYWdlIik7CisgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZ0JhdGNoKDE3KSkgeworICAgIGFzc2VydChmYWxzZSk7CisgIH0KK30KK0JFTkNITUFSSyhCTV9lcnJvcl9iZWZvcmVfcnVubmluZ19iYXRjaCk7CitBRERfQ0FTRVMoIkJNX2Vycm9yX2JlZm9yZV9ydW5uaW5nX2JhdGNoIiwge3siIiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifX0pOworCit2b2lkIEJNX2Vycm9yX2JlZm9yZV9ydW5uaW5nX3JhbmdlX2ZvcihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJlcnJvciBtZXNzYWdlIik7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBhc3NlcnQoZmFsc2UpOworICB9Cit9CitCRU5DSE1BUksoQk1fZXJyb3JfYmVmb3JlX3J1bm5pbmdfcmFuZ2VfZm9yKTsKK0FERF9DQVNFUygiQk1fZXJyb3JfYmVmb3JlX3J1bm5pbmdfcmFuZ2VfZm9yIiwge3siIiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifX0pOworCit2b2lkIEJNX2Vycm9yX2R1cmluZ19ydW5uaW5nKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGludCBmaXJzdF9pdGVyID0gdHJ1ZTsKKyAgd2hpbGUgKHN0YXRlLktlZXBSdW5uaW5nKCkpIHsKKyAgICBpZiAoc3RhdGUucmFuZ2UoMCkgPT0gMSAmJiBzdGF0ZS50aHJlYWRfaW5kZXggPD0gKHN0YXRlLnRocmVhZHMgLyAyKSkgeworICAgICAgYXNzZXJ0KGZpcnN0X2l0ZXIpOworICAgICAgZmlyc3RfaXRlciA9IGZhbHNlOworICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiZXJyb3IgbWVzc2FnZSIpOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0ZS5QYXVzZVRpbWluZygpOworICAgICAgc3RhdGUuUmVzdW1lVGltaW5nKCk7CisgICAgfQorICB9Cit9CitCRU5DSE1BUksoQk1fZXJyb3JfZHVyaW5nX3J1bm5pbmcpLT5BcmcoMSktPkFyZygyKS0+VGhyZWFkUmFuZ2UoMSwgOCk7CitBRERfQ0FTRVMoIkJNX2Vycm9yX2R1cmluZ19ydW5uaW5nIiwge3siLzEvdGhyZWFkczoxIiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyIvMS90aHJlYWRzOjIiLCB0cnVlLCAiZXJyb3IgbWVzc2FnZSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ii8xL3RocmVhZHM6NCIsIHRydWUsICJlcnJvciBtZXNzYWdlIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzEvdGhyZWFkczo4IiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyIvMi90aHJlYWRzOjEiLCBmYWxzZSwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ii8yL3RocmVhZHM6MiIsIGZhbHNlLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzIvdGhyZWFkczo0IiwgZmFsc2UsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyIvMi90aHJlYWRzOjgiLCBmYWxzZSwgIiJ9fSk7CisKK3ZvaWQgQk1fZXJyb3JfZHVyaW5nX3J1bm5pbmdfcmFuZ2VkX2ZvcihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBhc3NlcnQoc3RhdGUubWF4X2l0ZXJhdGlvbnMgPiAzICYmICJ0ZXN0IHJlcXVpcmVzIGF0IGxlYXN0IGEgZmV3IGl0ZXJhdGlvbnMiKTsKKyAgaW50IGZpcnN0X2l0ZXIgPSB0cnVlOworICAvLyBOT1RFOiBVc2VycyBzaG91bGQgbm90IHdyaXRlIHRoZSBmb3IgbG9vcCBleHBsaWNpdGx5LgorICBmb3IgKGF1dG8gSXQgPSBzdGF0ZS5iZWdpbigpLCBFbmQgPSBzdGF0ZS5lbmQoKTsgSXQgIT0gRW5kOyArK0l0KSB7CisgICAgaWYgKHN0YXRlLnJhbmdlKDApID09IDEpIHsKKyAgICAgIGFzc2VydChmaXJzdF9pdGVyKTsKKyAgICAgIGZpcnN0X2l0ZXIgPSBmYWxzZTsKKyAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoImVycm9yIG1lc3NhZ2UiKTsKKyAgICAgIC8vIFRlc3QgdGhlIHVuZm9ydHVuYXRlIGJ1dCBkb2N1bWVudGVkIGJlaGF2aW9yIHRoYXQgdGhlIHJhbmdlZC1mb3IgbG9vcAorICAgICAgLy8gZG9lc24ndCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB3aGVuIFNraXBXaXRoRXJyb3IgaXMgc2V0LgorICAgICAgYXNzZXJ0KCsrSXQgIT0gRW5kKTsKKyAgICAgIGJyZWFrOyAgLy8gUmVxdWlyZWQgYmVoYXZpb3IKKyAgICB9CisgIH0KK30KK0JFTkNITUFSSyhCTV9lcnJvcl9kdXJpbmdfcnVubmluZ19yYW5nZWRfZm9yKS0+QXJnKDEpLT5BcmcoMiktPkl0ZXJhdGlvbnMoNSk7CitBRERfQ0FTRVMoIkJNX2Vycm9yX2R1cmluZ19ydW5uaW5nX3JhbmdlZF9mb3IiLAorICAgICAgICAgIHt7Ii8xL2l0ZXJhdGlvbnM6NSIsIHRydWUsICJlcnJvciBtZXNzYWdlIn0sCisgICAgICAgICAgIHsiLzIvaXRlcmF0aW9uczo1IiwgZmFsc2UsICIifX0pOworCit2b2lkIEJNX2Vycm9yX2FmdGVyX3J1bm5pbmcoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9CisgIGlmIChzdGF0ZS50aHJlYWRfaW5kZXggPD0gKHN0YXRlLnRocmVhZHMgLyAyKSkKKyAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJlcnJvciBtZXNzYWdlIik7Cit9CitCRU5DSE1BUksoQk1fZXJyb3JfYWZ0ZXJfcnVubmluZyktPlRocmVhZFJhbmdlKDEsIDgpOworQUREX0NBU0VTKCJCTV9lcnJvcl9hZnRlcl9ydW5uaW5nIiwge3siL3RocmVhZHM6MSIsIHRydWUsICJlcnJvciBtZXNzYWdlIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyIvdGhyZWFkczoyIiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ii90aHJlYWRzOjQiLCB0cnVlLCAiZXJyb3IgbWVzc2FnZSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiL3RocmVhZHM6OCIsIHRydWUsICJlcnJvciBtZXNzYWdlIn19KTsKKwordm9pZCBCTV9lcnJvcl93aGlsZV9wYXVzZWQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgYm9vbCBmaXJzdF9pdGVyID0gdHJ1ZTsKKyAgd2hpbGUgKHN0YXRlLktlZXBSdW5uaW5nKCkpIHsKKyAgICBpZiAoc3RhdGUucmFuZ2UoMCkgPT0gMSAmJiBzdGF0ZS50aHJlYWRfaW5kZXggPD0gKHN0YXRlLnRocmVhZHMgLyAyKSkgeworICAgICAgYXNzZXJ0KGZpcnN0X2l0ZXIpOworICAgICAgZmlyc3RfaXRlciA9IGZhbHNlOworICAgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsKKyAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoImVycm9yIG1lc3NhZ2UiKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsKKyAgICAgIHN0YXRlLlJlc3VtZVRpbWluZygpOworICAgIH0KKyAgfQorfQorQkVOQ0hNQVJLKEJNX2Vycm9yX3doaWxlX3BhdXNlZCktPkFyZygxKS0+QXJnKDIpLT5UaHJlYWRSYW5nZSgxLCA4KTsKK0FERF9DQVNFUygiQk1fZXJyb3Jfd2hpbGVfcGF1c2VkIiwge3siLzEvdGhyZWFkczoxIiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzEvdGhyZWFkczoyIiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzEvdGhyZWFkczo0IiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzEvdGhyZWFkczo4IiwgdHJ1ZSwgImVycm9yIG1lc3NhZ2UifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzIvdGhyZWFkczoxIiwgZmFsc2UsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzIvdGhyZWFkczoyIiwgZmFsc2UsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzIvdGhyZWFkczo0IiwgZmFsc2UsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLzIvdGhyZWFkczo4IiwgZmFsc2UsICIifX0pOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGJlbmNobWFyazo6SW5pdGlhbGl6ZSgmYXJnYywgYXJndik7CisKKyAgVGVzdFJlcG9ydGVyIHRlc3RfcmVwb3J0ZXI7CisgIGJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygmdGVzdF9yZXBvcnRlcik7CisKKyAgdHlwZWRlZiBiZW5jaG1hcms6OkJlbmNobWFya1JlcG9ydGVyOjpSdW4gUnVuOworICBhdXRvIEVCID0gRXhwZWN0ZWRSZXN1bHRzLmJlZ2luKCk7CisKKyAgZm9yIChSdW4gY29uc3QmIHJ1biA6IHRlc3RfcmVwb3J0ZXIuYWxsX3J1bnNfKSB7CisgICAgYXNzZXJ0KEVCICE9IEV4cGVjdGVkUmVzdWx0cy5lbmQoKSk7CisgICAgRUItPkNoZWNrUnVuKHJ1bik7CisgICAgKytFQjsKKyAgfQorICBhc3NlcnQoRUIgPT0gRXhwZWN0ZWRSZXN1bHRzLmVuZCgpKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3Qvc3RhdGVfYXNzZW1ibHlfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3Qvc3RhdGVfYXNzZW1ibHlfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGRiYjNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9zdGF0ZV9hc3NlbWJseV90ZXN0LmNjCkBAIC0wLDAgKzEsNjggQEAKKyNpbmNsdWRlIDxiZW5jaG1hcmsvYmVuY2htYXJrLmg+CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3JldHVybi10eXBlIgorI2VuZGlmCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKK2V4dGVybiAiQyIgeworICBleHRlcm4gaW50IEV4dGVybkludDsKKyAgYmVuY2htYXJrOjpTdGF0ZSYgR2V0U3RhdGUoKTsKKyAgdm9pZCBGbigpOworfQorLy8gY2xhbmctZm9ybWF0IG9uCisKK3VzaW5nIGJlbmNobWFyazo6U3RhdGU7CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X2Zvcl9hdXRvX2xvb3A6CitleHRlcm4gIkMiIGludCB0ZXN0X2Zvcl9hdXRvX2xvb3AoKSB7CisgIFN0YXRlJiBTID0gR2V0U3RhdGUoKTsKKyAgaW50IHggPSA0MjsKKyAgLy8gQ0hFQ0s6IAlbW0NBTEw6Y2FsbChxKSpdXQlfWk45YmVuY2htYXJrNVN0YXRlMTZTdGFydEtlZXBSdW5uaW5nRXYKKyAgLy8gQ0hFQ0stTkVYVDogdGVzdHEgJXJieCwgJXJieAorICAvLyBDSEVDSy1ORVhUOiBqZSBbW0xPT1BfRU5EOi4qXV0KKworICBmb3IgKGF1dG8gXyA6IFMpIHsKKyAgICAvLyBDSEVDSzogLkxbW0xPT1BfSEVBRDpbYS16QS1aMC05X10rXV06CisgICAgLy8gQ0hFQ0stR05VLU5FWFQ6IHN1YnEgJDEsICVyYngKKyAgICAvLyBDSEVDSy1DTEFORy1ORVhUOiB7eyhhZGRxIFwkMSwgJXJheHxpbmNxICVyYXh8YWRkcSBcJC0xLCAlcmJ4KX19CisgICAgLy8gQ0hFQ0stTkVYVDogam5lIC5MW1tMT09QX0hFQURdXQorICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh4KTsKKyAgfQorICAvLyBDSEVDSzogW1tMT09QX0VORF1dOgorICAvLyBDSEVDSzogW1tDQUxMXV0JX1pOOWJlbmNobWFyazVTdGF0ZTE3RmluaXNoS2VlcFJ1bm5pbmdFdgorCisgIC8vIENIRUNLOiBtb3ZsICQxMDEsICVlYXgKKyAgLy8gQ0hFQ0s6IHJldAorICByZXR1cm4gMTAxOworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF93aGlsZV9sb29wOgorZXh0ZXJuICJDIiBpbnQgdGVzdF93aGlsZV9sb29wKCkgeworICBTdGF0ZSYgUyA9IEdldFN0YXRlKCk7CisgIGludCB4ID0gNDI7CisKKyAgLy8gQ0hFQ0s6IGp7eyhlfG1wKX19IC5MW1tMT09QX0hFQURFUjpbYS16QS1aMC05X10rXV0KKyAgLy8gQ0hFQ0stTkVYVDogLkxbW0xPT1BfQk9EWTpbYS16QS1aMC05X10rXV06CisgIHdoaWxlIChTLktlZXBSdW5uaW5nKCkpIHsKKyAgICAvLyBDSEVDSy1HTlUtTkVYVDogc3VicSAkMSwgJVtbSVJFRzpbYS16XStdXQorICAgIC8vIENIRUNLLUNMQU5HLU5FWFQ6IHt7KGFkZHEgXCQtMSx8ZGVjcSl9fSAlW1tJUkVHOlthLXpdK11dCisgICAgLy8gQ0hFQ0s6IG1vdnEgJVtbSVJFR11dLCBbW0RFU1Q6LipdXQorICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh4KTsKKyAgfQorICAvLyBDSEVDSy1EQUc6IG1vdnEgW1tERVNUXV0sICVbW0lSRUddXQorICAvLyBDSEVDSy1EQUc6IHRlc3RxICVbW0lSRUddXSwgJVtbSVJFR11dCisgIC8vIENIRUNLLURBRzogam5lIC5MW1tMT09QX0JPRFldXQorICAvLyBDSEVDSy1EQUc6IC5MW1tMT09QX0hFQURFUl1dOgorCisgIC8vIENIRUNLOiBjbXBiICQwCisgIC8vIENIRUNLLU5FWFQ6IGpuZSAuTFtbTE9PUF9FTkQ6W2EtekEtWjAtOV9dK11dCisgIC8vIENIRUNLOiBbW0NBTEw6Y2FsbChxKSpdXSBfWk45YmVuY2htYXJrNVN0YXRlMTZTdGFydEtlZXBSdW5uaW5nRXYKKworICAvLyBDSEVDSzogLkxbW0xPT1BfRU5EXV06CisgIC8vIENIRUNLOiBbW0NBTExdXSBfWk45YmVuY2htYXJrNVN0YXRlMTdGaW5pc2hLZWVwUnVubmluZ0V2CisKKyAgLy8gQ0hFQ0s6IG1vdmwgJDEwMSwgJWVheAorICAvLyBDSEVDSzogcmV0CisgIHJldHVybiAxMDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3N0YXRpc3RpY3NfZ3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3N0YXRpc3RpY3NfZ3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllMzE0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3Qvc3RhdGlzdGljc19ndGVzdC5jYwpAQCAtMCwwICsxLDI4IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBzdGF0aXN0aWNzX3Rlc3QgLSBVbml0IHRlc3RzIGZvciBzcmMvc3RhdGlzdGljcy5jYworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiLi4vc3JjL3N0YXRpc3RpY3MuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworVEVTVChTdGF0aXN0aWNzVGVzdCwgTWVhbikgeworICBFWFBFQ1RfRE9VQkxFX0VRKGJlbmNobWFyazo6U3RhdGlzdGljc01lYW4oezQyLCA0MiwgNDIsIDQyfSksIDQyLjApOworICBFWFBFQ1RfRE9VQkxFX0VRKGJlbmNobWFyazo6U3RhdGlzdGljc01lYW4oezEsIDIsIDMsIDR9KSwgMi41KTsKKyAgRVhQRUNUX0RPVUJMRV9FUShiZW5jaG1hcms6OlN0YXRpc3RpY3NNZWFuKHsxLCAyLCA1LCAxMCwgMTAsIDE0fSksIDcuMCk7Cit9CisKK1RFU1QoU3RhdGlzdGljc1Rlc3QsIE1lZGlhbikgeworICBFWFBFQ1RfRE9VQkxFX0VRKGJlbmNobWFyazo6U3RhdGlzdGljc01lZGlhbih7NDIsIDQyLCA0MiwgNDJ9KSwgNDIuMCk7CisgIEVYUEVDVF9ET1VCTEVfRVEoYmVuY2htYXJrOjpTdGF0aXN0aWNzTWVkaWFuKHsxLCAyLCAzLCA0fSksIDIuNSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoYmVuY2htYXJrOjpTdGF0aXN0aWNzTWVkaWFuKHsxLCAyLCA1LCAxMCwgMTB9KSwgNS4wKTsKK30KKworVEVTVChTdGF0aXN0aWNzVGVzdCwgU3RkRGV2KSB7CisgIEVYUEVDVF9ET1VCTEVfRVEoYmVuY2htYXJrOjpTdGF0aXN0aWNzU3RkRGV2KHsxMDEsIDEwMSwgMTAxLCAxMDF9KSwgMC4wKTsKKyAgRVhQRUNUX0RPVUJMRV9FUShiZW5jaG1hcms6OlN0YXRpc3RpY3NTdGREZXYoezEsIDIsIDN9KSwgMS4wKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKGJlbmNobWFyazo6U3RhdGlzdGljc1N0ZERldih7MS41LCAyLjQsIDMuMywgNC4yLCA1LjF9KSwKKyAgICAgICAgICAgICAgICAgIDEuNDIzMDI0OTUpOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3N0cmluZ191dGlsX2d0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9zdHJpbmdfdXRpbF9ndGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWJmMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC9zdHJpbmdfdXRpbF9ndGVzdC5jYwpAQCAtMCwwICsxLDE1MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gc3RhdGlzdGljc190ZXN0IC0gVW5pdCB0ZXN0cyBmb3Igc3JjL3N0YXRpc3RpY3MuY2MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIi4uL3NyYy9zdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgIi4uL3NyYy9pbnRlcm5hbF9tYWNyb3MuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworVEVTVChTdHJpbmdVdGlsVGVzdCwgc3RvdWwpIHsKKyAgeworICAgIHNpemVfdCBwb3MgPSAwOworICAgIEVYUEVDVF9FUSgwdWwsIGJlbmNobWFyazo6c3RvdWwoIjAiLCAmcG9zKSk7CisgICAgRVhQRUNUX0VRKDF1bCwgcG9zKTsKKyAgfQorICB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgRVhQRUNUX0VRKDd1bCwgYmVuY2htYXJrOjpzdG91bCgiNyIsICZwb3MpKTsKKyAgICBFWFBFQ1RfRVEoMXVsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoMTM1dWwsIGJlbmNobWFyazo6c3RvdWwoIjEzNSIsICZwb3MpKTsKKyAgICBFWFBFQ1RfRVEoM3VsLCBwb3MpOworICB9CisjaWYgVUxPTkdfTUFYID09IDB4RkZGRkZGRkZ1bAorICB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgRVhQRUNUX0VRKDB4RkZGRkZGRkZ1bCwgYmVuY2htYXJrOjpzdG91bCgiNDI5NDk2NzI5NSIsICZwb3MpKTsKKyAgICBFWFBFQ1RfRVEoMTB1bCwgcG9zKTsKKyAgfQorI2VsaWYgVUxPTkdfTUFYID09IDB4RkZGRkZGRkZGRkZGRkZGRnVsCisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoMHhGRkZGRkZGRkZGRkZGRkZGdWwsIGJlbmNobWFyazo6c3RvdWwoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IiwgJnBvcykpOworICAgIEVYUEVDVF9FUSgyMHVsLCBwb3MpOworICB9CisjZW5kaWYKKyAgeworICAgIHNpemVfdCBwb3MgPSAwOworICAgIEVYUEVDVF9FUSgxMHVsLCBiZW5jaG1hcms6OnN0b3VsKCIxMDEwIiwgJnBvcywgMikpOworICAgIEVYUEVDVF9FUSg0dWwsIHBvcyk7CisgIH0KKyAgeworICAgIHNpemVfdCBwb3MgPSAwOworICAgIEVYUEVDVF9FUSg1MjB1bCwgYmVuY2htYXJrOjpzdG91bCgiMTAxMCIsICZwb3MsIDgpKTsKKyAgICBFWFBFQ1RfRVEoNHVsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoMTAxMHVsLCBiZW5jaG1hcms6OnN0b3VsKCIxMDEwIiwgJnBvcywgMTApKTsKKyAgICBFWFBFQ1RfRVEoNHVsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoNDExMnVsLCBiZW5jaG1hcms6OnN0b3VsKCIxMDEwIiwgJnBvcywgMTYpKTsKKyAgICBFWFBFQ1RfRVEoNHVsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoMHhCRUVGdWwsIGJlbmNobWFyazo6c3RvdWwoIkJFRUYiLCAmcG9zLCAxNikpOworICAgIEVYUEVDVF9FUSg0dWwsIHBvcyk7CisgIH0KKyNpZm5kZWYgQkVOQ0hNQVJLX0hBU19OT19FWENFUFRJT05TCisgIHsKKyAgICBBU1NFUlRfVEhST1coYmVuY2htYXJrOjpzdG91bCgidGhpcyBpcyBhIHRlc3QiKSwgc3RkOjppbnZhbGlkX2FyZ3VtZW50KTsKKyAgfQorI2VuZGlmCit9CisKK1RFU1QoU3RyaW5nVXRpbFRlc3QsIHN0b2kpIHsKKyAgeworICAgIHNpemVfdCBwb3MgPSAwOworICAgIEVYUEVDVF9FUSgwLCBiZW5jaG1hcms6OnN0b2koIjAiLCAmcG9zKSk7CisgICAgRVhQRUNUX0VRKDF1bCwgcG9zKTsKKyAgfQorICB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgRVhQRUNUX0VRKC0xNywgYmVuY2htYXJrOjpzdG9pKCItMTciLCAmcG9zKSk7CisgICAgRVhQRUNUX0VRKDN1bCwgcG9zKTsKKyAgfQorICB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgRVhQRUNUX0VRKDEzNTcsIGJlbmNobWFyazo6c3RvaSgiMTM1NyIsICZwb3MpKTsKKyAgICBFWFBFQ1RfRVEoNHVsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoMTAsIGJlbmNobWFyazo6c3RvaSgiMTAxMCIsICZwb3MsIDIpKTsKKyAgICBFWFBFQ1RfRVEoNHVsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoNTIwLCBiZW5jaG1hcms6OnN0b2koIjEwMTAiLCAmcG9zLCA4KSk7CisgICAgRVhQRUNUX0VRKDR1bCwgcG9zKTsKKyAgfQorICB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgRVhQRUNUX0VRKDEwMTAsIGJlbmNobWFyazo6c3RvaSgiMTAxMCIsICZwb3MsIDEwKSk7CisgICAgRVhQRUNUX0VRKDR1bCwgcG9zKTsKKyAgfQorICB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgRVhQRUNUX0VRKDQxMTIsIGJlbmNobWFyazo6c3RvaSgiMTAxMCIsICZwb3MsIDE2KSk7CisgICAgRVhQRUNUX0VRKDR1bCwgcG9zKTsKKyAgfQorICB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgRVhQRUNUX0VRKDB4QkVFRiwgYmVuY2htYXJrOjpzdG9pKCJCRUVGIiwgJnBvcywgMTYpKTsKKyAgICBFWFBFQ1RfRVEoNHVsLCBwb3MpOworICB9CisjaWZuZGVmIEJFTkNITUFSS19IQVNfTk9fRVhDRVBUSU9OUworICB7CisgICAgQVNTRVJUX1RIUk9XKGJlbmNobWFyazo6c3RvaSgidGhpcyBpcyBhIHRlc3QiKSwgc3RkOjppbnZhbGlkX2FyZ3VtZW50KTsKKyAgfQorI2VuZGlmCit9CisKK1RFU1QoU3RyaW5nVXRpbFRlc3QsIHN0b2QpIHsKKyAgeworICAgIHNpemVfdCBwb3MgPSAwOworICAgIEVYUEVDVF9FUSgwLjAsIGJlbmNobWFyazo6c3RvZCgiMCIsICZwb3MpKTsKKyAgICBFWFBFQ1RfRVEoMXVsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoLTg0LjAsIGJlbmNobWFyazo6c3RvZCgiLTg0IiwgJnBvcykpOworICAgIEVYUEVDVF9FUSgzdWwsIHBvcyk7CisgIH0KKyAgeworICAgIHNpemVfdCBwb3MgPSAwOworICAgIEVYUEVDVF9FUSgxMjM0LjAsIGJlbmNobWFyazo6c3RvZCgiMTIzNCIsICZwb3MpKTsKKyAgICBFWFBFQ1RfRVEoNHVsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBFWFBFQ1RfRVEoMS41LCBiZW5jaG1hcms6OnN0b2QoIjEuNSIsICZwb3MpKTsKKyAgICBFWFBFQ1RfRVEoM3VsLCBwb3MpOworICB9CisgIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICAvKiBOb3RlOiBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgZG91YmxlICovCisgICAgRVhQRUNUX0VRKC0xLjI1ZSs5LCBiZW5jaG1hcms6OnN0b2QoIi0xLjI1ZSs5IiwgJnBvcykpOworICAgIEVYUEVDVF9FUSg4dWwsIHBvcyk7CisgIH0KKyNpZm5kZWYgQkVOQ0hNQVJLX0hBU19OT19FWENFUFRJT05TCisgIHsKKyAgICBBU1NFUlRfVEhST1coYmVuY2htYXJrOjpzdG9kKCJ0aGlzIGlzIGEgdGVzdCIpLCBzdGQ6OmludmFsaWRfYXJndW1lbnQpOworICB9CisjZW5kaWYKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC90ZW1wbGF0ZWRfZml4dHVyZV90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC90ZW1wbGF0ZWRfZml4dHVyZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTg2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3RlbXBsYXRlZF9maXh0dXJlX3Rlc3QuY2MKQEAgLTAsMCArMSwyOCBAQAorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTXlGaXh0dXJlIDogcHVibGljIDo6YmVuY2htYXJrOjpGaXh0dXJlIHsKKyBwdWJsaWM6CisgIE15Rml4dHVyZSgpIDogZGF0YSgwKSB7fQorCisgIFQgZGF0YTsKK307CisKK0JFTkNITUFSS19URU1QTEFURV9GKE15Rml4dHVyZSwgRm9vLCBpbnQpKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgIGZvciAoYXV0byBfIDogc3QpIHsKKyAgICBkYXRhICs9IDE7CisgIH0KK30KKworQkVOQ0hNQVJLX1RFTVBMQVRFX0RFRklORV9GKE15Rml4dHVyZSwgQmFyLCBkb3VibGUpKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgIGZvciAoYXV0byBfIDogc3QpIHsKKyAgICBkYXRhICs9IDEuMDsKKyAgfQorfQorQkVOQ0hNQVJLX1JFR0lTVEVSX0YoTXlGaXh0dXJlLCBCYXIpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdGVzdC91c2VyX2NvdW50ZXJzX3RhYnVsYXJfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvdXNlcl9jb3VudGVyc190YWJ1bGFyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgzNzNjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvdXNlcl9jb3VudGVyc190YWJ1bGFyX3Rlc3QuY2MKQEAgLTAsMCArMSwyODUgQEAKKworI3VuZGVmIE5ERUJVRworCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgIm91dHB1dF90ZXN0LmgiCisKKy8vIEB0b2RvOiA8anBtYWc+IHRoaXMgY2hlY2tzIHRoZSBmdWxsIG91dHB1dCBhdCBvbmNlOyB0aGUgcnVsZSBmb3IKKy8vIENvdW50ZXJTZXQxIHdhcyBmYWlsaW5nIGJlY2F1c2UgaXQgd2FzIG5vdCBtYXRjaGluZyAiXlstXSskIi4KKy8vIEB0b2RvOiA8anBtYWc+IGNoZWNrIHRoYXQgdGhlIGNvdW50ZXJzIGFyZSB2ZXJ0aWNhbGx5IGFsaWduZWQuCitBRERfQ0FTRVMoCisgICAgVENfQ29uc29sZU91dCwKKyAgICB7CisgICAgICAgIC8vIGtlZXBpbmcgdGhlc2UgbGluZXMgbG9uZyBpbXByb3ZlcyByZWFkYWJpbGl0eSwgc286CisgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICB7Il5bLV0rJCIsIE1SX05leHR9LAorICAgIHsiXkJlbmNobWFyayAlcyBUaW1lICVzIENQVSAlcyBJdGVyYXRpb25zICVzIEJhciAlcyBCYXQgJXMgQmF6ICVzIEZvbyAlcyBGcm9iICVzIExvYiQiLCBNUl9OZXh0fSwKKyAgICB7Il5bLV0rJCIsIE1SX05leHR9LAorICAgIHsiXkJNX0NvdW50ZXJzX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyc19UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgeyJeQk1fQ291bnRlcnNfVGFidWxhci90aHJlYWRzOiVpbnQgJWNvbnNvbGVfcmVwb3J0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0JCIsIE1SX05leHR9LAorICAgIHsiXkJNX0NvdW50ZXJzX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyc19UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgeyJeQk1fQ291bnRlclJhdGVzX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyUmF0ZXNfVGFidWxhci90aHJlYWRzOiVpbnQgJWNvbnNvbGVfcmVwb3J0IFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zJCIsIE1SX05leHR9LAorICAgIHsiXkJNX0NvdW50ZXJSYXRlc19UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0L3MgWyBdKiVocmZsb2F0L3MgWyBdKiVocmZsb2F0L3MgWyBdKiVocmZsb2F0L3MgWyBdKiVocmZsb2F0L3MgWyBdKiVocmZsb2F0L3MkIiwgTVJfTmV4dH0sCisgICAgeyJeQk1fQ291bnRlclJhdGVzX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyBbIF0qJWhyZmxvYXQvcyQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyUmF0ZXNfVGFidWxhci90aHJlYWRzOiVpbnQgJWNvbnNvbGVfcmVwb3J0IFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zIFsgXSolaHJmbG9hdC9zJCIsIE1SX05leHR9LAorICAgIHsiXlstXSskIiwgTVJfTmV4dH0sCisgICAgeyJeQmVuY2htYXJrICVzIFRpbWUgJXMgQ1BVICVzIEl0ZXJhdGlvbnMgJXMgQmFyICVzIEJheiAlcyBGb28kIiwgTVJfTmV4dH0sCisgICAgeyJeWy1dKyQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyU2V0MF9UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgeyJeQk1fQ291bnRlclNldDBfVGFidWxhci90aHJlYWRzOiVpbnQgJWNvbnNvbGVfcmVwb3J0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0JCIsIE1SX05leHR9LAorICAgIHsiXkJNX0NvdW50ZXJTZXQwX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyU2V0MF9UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgeyJeQk1fQ291bnRlclNldDBfVGFidWxhci90aHJlYWRzOiVpbnQgJWNvbnNvbGVfcmVwb3J0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0JCIsIE1SX05leHR9LAorICAgIHsiXkJNX0NvdW50ZXJTZXQxX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyU2V0MV9UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgeyJeQk1fQ291bnRlclNldDFfVGFidWxhci90aHJlYWRzOiVpbnQgJWNvbnNvbGVfcmVwb3J0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0JCIsIE1SX05leHR9LAorICAgIHsiXkJNX0NvdW50ZXJTZXQxX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyU2V0MV9UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgeyJeWy1dKyQiLCBNUl9OZXh0fSwKKyAgICB7Il5CZW5jaG1hcmsgJXMgVGltZSAlcyBDUFUgJXMgSXRlcmF0aW9ucyAlcyBCYXQgJXMgQmF6ICVzIEZvbyQiLCBNUl9OZXh0fSwKKyAgICB7Il5bLV0rJCIsIE1SX05leHR9LAorICAgIHsiXkJNX0NvdW50ZXJTZXQyX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyU2V0Ml9UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgeyJeQk1fQ291bnRlclNldDJfVGFidWxhci90aHJlYWRzOiVpbnQgJWNvbnNvbGVfcmVwb3J0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0JCIsIE1SX05leHR9LAorICAgIHsiXkJNX0NvdW50ZXJTZXQyX1RhYnVsYXIvdGhyZWFkczolaW50ICVjb25zb2xlX3JlcG9ydCBbIF0qJWhyZmxvYXQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICB7Il5CTV9Db3VudGVyU2V0Ml9UYWJ1bGFyL3RocmVhZHM6JWludCAlY29uc29sZV9yZXBvcnQgWyBdKiVocmZsb2F0IFsgXSolaHJmbG9hdCBbIF0qJWhyZmxvYXQkIn0sCisgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgIH0pOworQUREX0NBU0VTKFRDX0NTVk91dCwge3siJWNzdl9oZWFkZXIsIgorICAgICAgICAgICAgICAgICAgICAgICAiXCJCYXJcIixcIkJhdFwiLFwiQmF6XCIsXCJGb29cIixcIkZyb2JcIixcIkxvYlwiIn19KTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUYWJ1bGFyIENvdW50ZXJzIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX0NvdW50ZXJzX1RhYnVsYXIoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9CisgIG5hbWVzcGFjZSBibSA9IGJlbmNobWFyazsKKyAgc3RhdGUuY291bnRlcnMuaW5zZXJ0KHsKKyAgICAgIHsiRm9vIiwgezEsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc319LAorICAgICAgeyJCYXIiLCB7MiwgYm06OkNvdW50ZXI6OmtBdmdUaHJlYWRzfX0sCisgICAgICB7IkJheiIsIHs0LCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHN9fSwKKyAgICAgIHsiQmF0IiwgezgsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc319LAorICAgICAgeyJGcm9iIiwgezE2LCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHN9fSwKKyAgICAgIHsiTG9iIiwgezMyLCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHN9fSwKKyAgfSk7Cit9CitCRU5DSE1BUksoQk1fQ291bnRlcnNfVGFidWxhciktPlRocmVhZFJhbmdlKDEsIDE2KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LAorICAgICAgICAgIHt7IlwibmFtZVwiOiBcIkJNX0NvdW50ZXJzX1RhYnVsYXIvdGhyZWFkczolaW50XCIsJCJ9LAorICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9Db3VudGVyc19UYWJ1bGFyL3RocmVhZHM6JWludFwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIkJhclwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiQmF0XCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJCYXpcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIkZvb1wiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiRnJvYlwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiTG9iXCI6ICVmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJ9IiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Il5cIkJNX0NvdW50ZXJzX1RhYnVsYXIvdGhyZWFkczolaW50XCIsJWNzdl9yZXBvcnQsIgorICAgICAgICAgICAgICAgICAgICAgICAiJWZsb2F0LCVmbG9hdCwlZmxvYXQsJWZsb2F0LCVmbG9hdCwlZmxvYXQkIn19KTsKKy8vIFZTMjAxMyBkb2VzIG5vdCBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIGxhbWJkYSBhcmd1bWVudAorLy8gdG8gQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoKQordm9pZCBDaGVja1RhYnVsYXIoUmVzdWx0cyBjb25zdCYgZSkgeworICBDSEVDS19DT1VOVEVSX1ZBTFVFKGUsIGludCwgIkZvbyIsIEVRLCAxKTsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJCYXIiLCBFUSwgMik7CisgIENIRUNLX0NPVU5URVJfVkFMVUUoZSwgaW50LCAiQmF6IiwgRVEsIDQpOworICBDSEVDS19DT1VOVEVSX1ZBTFVFKGUsIGludCwgIkJhdCIsIEVRLCA4KTsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJGcm9iIiwgRVEsIDE2KTsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJMb2IiLCBFUSwgMzIpOworfQorQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoIkJNX0NvdW50ZXJzX1RhYnVsYXIvdGhyZWFkczolaW50IiwgJkNoZWNrVGFidWxhcik7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIFRhYnVsYXIrUmF0ZSBDb3VudGVycyBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9Db3VudGVyUmF0ZXNfVGFidWxhcihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgLy8gVGhpcyB0ZXN0IHJlcXVpcmVzIGEgbm9uLXplcm8gQ1BVIHRpbWUgdG8gYXZvaWQgZGl2aWRlLWJ5LXplcm8KKyAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoc3RhdGUuaXRlcmF0aW9ucygpKTsKKyAgfQorICBuYW1lc3BhY2UgYm0gPSBiZW5jaG1hcms7CisgIHN0YXRlLmNvdW50ZXJzLmluc2VydCh7CisgICAgICB7IkZvbyIsIHsxLCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHNSYXRlfX0sCisgICAgICB7IkJhciIsIHsyLCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHNSYXRlfX0sCisgICAgICB7IkJheiIsIHs0LCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHNSYXRlfX0sCisgICAgICB7IkJhdCIsIHs4LCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHNSYXRlfX0sCisgICAgICB7IkZyb2IiLCB7MTYsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc1JhdGV9fSwKKyAgICAgIHsiTG9iIiwgezMyLCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHNSYXRlfX0sCisgIH0pOworfQorQkVOQ0hNQVJLKEJNX0NvdW50ZXJSYXRlc19UYWJ1bGFyKS0+VGhyZWFkUmFuZ2UoMSwgMTYpOworQUREX0NBU0VTKFRDX0pTT05PdXQsCisgICAgICAgICAge3siXCJuYW1lXCI6IFwiQk1fQ291bnRlclJhdGVzX1RhYnVsYXIvdGhyZWFkczolaW50XCIsJCJ9LAorICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9Db3VudGVyUmF0ZXNfVGFidWxhci90aHJlYWRzOiVpbnRcIiwkIiwKKyAgICAgICAgICAgIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlYWxfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiY3B1X3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRpbWVfdW5pdFwiOiBcIm5zXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiQmFyXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJCYXRcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIkJhelwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiRm9vXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJGcm9iXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJMb2JcIjogJWZsb2F0JCIsIE1SX05leHR9LAorICAgICAgICAgICB7In0iLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0NTVk91dCwge3siXlwiQk1fQ291bnRlclJhdGVzX1RhYnVsYXIvdGhyZWFkczolaW50XCIsJWNzdl9yZXBvcnQsIgorICAgICAgICAgICAgICAgICAgICAgICAiJWZsb2F0LCVmbG9hdCwlZmxvYXQsJWZsb2F0LCVmbG9hdCwlZmxvYXQkIn19KTsKKy8vIFZTMjAxMyBkb2VzIG5vdCBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIGxhbWJkYSBhcmd1bWVudAorLy8gdG8gQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoKQordm9pZCBDaGVja1RhYnVsYXJSYXRlKFJlc3VsdHMgY29uc3QmIGUpIHsKKyAgZG91YmxlIHQgPSBlLkR1cmF0aW9uQ1BVVGltZSgpOworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJGb28iLCBFUSwgMS4gLyB0LCAwLjAwMSk7CisgIENIRUNLX0ZMT0FUX0NPVU5URVJfVkFMVUUoZSwgIkJhciIsIEVRLCAyLiAvIHQsIDAuMDAxKTsKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAiQmF6IiwgRVEsIDQuIC8gdCwgMC4wMDEpOworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJCYXQiLCBFUSwgOC4gLyB0LCAwLjAwMSk7CisgIENIRUNLX0ZMT0FUX0NPVU5URVJfVkFMVUUoZSwgIkZyb2IiLCBFUSwgMTYuIC8gdCwgMC4wMDEpOworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJMb2IiLCBFUSwgMzIuIC8gdCwgMC4wMDEpOworfQorQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoIkJNX0NvdW50ZXJSYXRlc19UYWJ1bGFyL3RocmVhZHM6JWludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmQ2hlY2tUYWJ1bGFyUmF0ZSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGFidWxhciBDb3VudGVycyBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKworLy8gc2V0IG9ubHkgc29tZSBvZiB0aGUgY291bnRlcnMKK3ZvaWQgQk1fQ291bnRlclNldDBfVGFidWxhcihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KKyAgbmFtZXNwYWNlIGJtID0gYmVuY2htYXJrOworICBzdGF0ZS5jb3VudGVycy5pbnNlcnQoeworICAgICAgeyJGb28iLCB7MTAsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc319LAorICAgICAgeyJCYXIiLCB7MjAsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc319LAorICAgICAgeyJCYXoiLCB7NDAsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc319LAorICB9KTsKK30KK0JFTkNITUFSSyhCTV9Db3VudGVyU2V0MF9UYWJ1bGFyKS0+VGhyZWFkUmFuZ2UoMSwgMTYpOworQUREX0NBU0VTKFRDX0pTT05PdXQsCisgICAgICAgICAge3siXCJuYW1lXCI6IFwiQk1fQ291bnRlclNldDBfVGFidWxhci90aHJlYWRzOiVpbnRcIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJTZXQwX1RhYnVsYXIvdGhyZWFkczolaW50XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlYWxfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiY3B1X3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRpbWVfdW5pdFwiOiBcIm5zXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiQmFyXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJCYXpcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIkZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9Db3VudGVyU2V0MF9UYWJ1bGFyL3RocmVhZHM6JWludFwiLCVjc3ZfcmVwb3J0LCIKKyAgICAgICAgICAgICAgICAgICAgICAgIiVmbG9hdCwsJWZsb2F0LCVmbG9hdCwsIn19KTsKKy8vIFZTMjAxMyBkb2VzIG5vdCBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIGxhbWJkYSBhcmd1bWVudAorLy8gdG8gQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoKQordm9pZCBDaGVja1NldDAoUmVzdWx0cyBjb25zdCYgZSkgeworICBDSEVDS19DT1VOVEVSX1ZBTFVFKGUsIGludCwgIkZvbyIsIEVRLCAxMCk7CisgIENIRUNLX0NPVU5URVJfVkFMVUUoZSwgaW50LCAiQmFyIiwgRVEsIDIwKTsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJCYXoiLCBFUSwgNDApOworfQorQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoIkJNX0NvdW50ZXJTZXQwX1RhYnVsYXIiLCAmQ2hlY2tTZXQwKTsKKworLy8gYWdhaW4uCit2b2lkIEJNX0NvdW50ZXJTZXQxX1RhYnVsYXIoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9CisgIG5hbWVzcGFjZSBibSA9IGJlbmNobWFyazsKKyAgc3RhdGUuY291bnRlcnMuaW5zZXJ0KHsKKyAgICAgIHsiRm9vIiwgezE1LCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHN9fSwKKyAgICAgIHsiQmFyIiwgezI1LCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHN9fSwKKyAgICAgIHsiQmF6IiwgezQ1LCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHN9fSwKKyAgfSk7Cit9CitCRU5DSE1BUksoQk1fQ291bnRlclNldDFfVGFidWxhciktPlRocmVhZFJhbmdlKDEsIDE2KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LAorICAgICAgICAgIHt7IlwibmFtZVwiOiBcIkJNX0NvdW50ZXJTZXQxX1RhYnVsYXIvdGhyZWFkczolaW50XCIsJCJ9LAorICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9Db3VudGVyU2V0MV9UYWJ1bGFyL3RocmVhZHM6JWludFwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIkJhclwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiQmF6XCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJGb29cIjogJWZsb2F0JCIsIE1SX05leHR9LAorICAgICAgICAgICB7In0iLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0NTVk91dCwge3siXlwiQk1fQ291bnRlclNldDFfVGFidWxhci90aHJlYWRzOiVpbnRcIiwlY3N2X3JlcG9ydCwiCisgICAgICAgICAgICAgICAgICAgICAgICIlZmxvYXQsLCVmbG9hdCwlZmxvYXQsLCJ9fSk7CisvLyBWUzIwMTMgZG9lcyBub3QgYWxsb3cgdGhpcyBmdW5jdGlvbiB0byBiZSBwYXNzZWQgYXMgYSBsYW1iZGEgYXJndW1lbnQKKy8vIHRvIENIRUNLX0JFTkNITUFSS19SRVNVTFRTKCkKK3ZvaWQgQ2hlY2tTZXQxKFJlc3VsdHMgY29uc3QmIGUpIHsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJGb28iLCBFUSwgMTUpOworICBDSEVDS19DT1VOVEVSX1ZBTFVFKGUsIGludCwgIkJhciIsIEVRLCAyNSk7CisgIENIRUNLX0NPVU5URVJfVkFMVUUoZSwgaW50LCAiQmF6IiwgRVEsIDQ1KTsKK30KK0NIRUNLX0JFTkNITUFSS19SRVNVTFRTKCJCTV9Db3VudGVyU2V0MV9UYWJ1bGFyL3RocmVhZHM6JWludCIsICZDaGVja1NldDEpOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRhYnVsYXIgQ291bnRlcnMgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKKy8vIHNldCBvbmx5IHNvbWUgb2YgdGhlIGNvdW50ZXJzLCBkaWZmZXJlbnQgc2V0IG5vdy4KK3ZvaWQgQk1fQ291bnRlclNldDJfVGFidWxhcihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KKyAgbmFtZXNwYWNlIGJtID0gYmVuY2htYXJrOworICBzdGF0ZS5jb3VudGVycy5pbnNlcnQoeworICAgICAgeyJGb28iLCB7MTAsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc319LAorICAgICAgeyJCYXQiLCB7MzAsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc319LAorICAgICAgeyJCYXoiLCB7NDAsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc319LAorICB9KTsKK30KK0JFTkNITUFSSyhCTV9Db3VudGVyU2V0Ml9UYWJ1bGFyKS0+VGhyZWFkUmFuZ2UoMSwgMTYpOworQUREX0NBU0VTKFRDX0pTT05PdXQsCisgICAgICAgICAge3siXCJuYW1lXCI6IFwiQk1fQ291bnRlclNldDJfVGFidWxhci90aHJlYWRzOiVpbnRcIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJTZXQyX1RhYnVsYXIvdGhyZWFkczolaW50XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlYWxfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiY3B1X3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRpbWVfdW5pdFwiOiBcIm5zXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiQmF0XCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJCYXpcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIkZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9Db3VudGVyU2V0Ml9UYWJ1bGFyL3RocmVhZHM6JWludFwiLCVjc3ZfcmVwb3J0LCIKKyAgICAgICAgICAgICAgICAgICAgICAgIiwlZmxvYXQsJWZsb2F0LCVmbG9hdCwsIn19KTsKKy8vIFZTMjAxMyBkb2VzIG5vdCBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIGxhbWJkYSBhcmd1bWVudAorLy8gdG8gQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoKQordm9pZCBDaGVja1NldDIoUmVzdWx0cyBjb25zdCYgZSkgeworICBDSEVDS19DT1VOVEVSX1ZBTFVFKGUsIGludCwgIkZvbyIsIEVRLCAxMCk7CisgIENIRUNLX0NPVU5URVJfVkFMVUUoZSwgaW50LCAiQmF0IiwgRVEsIDMwKTsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJCYXoiLCBFUSwgNDApOworfQorQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoIkJNX0NvdW50ZXJTZXQyX1RhYnVsYXIiLCAmQ2hlY2tTZXQyKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRFU1QgQ0FTRVMgRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7IFJ1bk91dHB1dFRlc3RzKGFyZ2MsIGFyZ3YpOyB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3VzZXJfY291bnRlcnNfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvdXNlcl9jb3VudGVyc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTlmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3VzZXJfY291bnRlcnNfdGVzdC5jYwpAQCAtMCwwICsxLDUzMSBAQAorCisjdW5kZWYgTkRFQlVHCisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAib3V0cHV0X3Rlc3QuaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0aW5nIFByb2xvZ3VlIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LAorICAgICAgICAgIHt7Il5bLV0rJCIsIE1SX05leHR9LAorICAgICAgICAgICB7Il5CZW5jaG1hcmsgJXMgVGltZSAlcyBDUFUgJXMgSXRlcmF0aW9ucyBVc2VyQ291bnRlcnMuLi4kIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXlstXSskIiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7IiVjc3ZfaGVhZGVyLFwiYmFyXCIsXCJmb29cIiJ9fSk7CisKKy8vIGNsYW5nLWZvcm1hdCBvbgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNpbXBsZSBDb3VudGVycyBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK3ZvaWQgQk1fQ291bnRlcnNfU2ltcGxlKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorICBzdGF0ZS5jb3VudGVyc1siZm9vIl0gPSAxOworICBzdGF0ZS5jb3VudGVyc1siYmFyIl0gPSAyICogKGRvdWJsZSlzdGF0ZS5pdGVyYXRpb25zKCk7Cit9CitCRU5DSE1BUksoQk1fQ291bnRlcnNfU2ltcGxlKTsKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LAorICAgICAgICAgIHt7Il5CTV9Db3VudGVyc19TaW1wbGUgJWNvbnNvbGVfcmVwb3J0IGJhcj0laHJmbG9hdCBmb289JWhyZmxvYXQkIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LCB7eyJcIm5hbWVcIjogXCJCTV9Db3VudGVyc19TaW1wbGVcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJzX1NpbXBsZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImJhclwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwiZm9vXCI6ICVmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJ9IiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Il5cIkJNX0NvdW50ZXJzX1NpbXBsZVwiLCVjc3ZfcmVwb3J0LCVmbG9hdCwlZmxvYXQkIn19KTsKKy8vIFZTMjAxMyBkb2VzIG5vdCBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIGxhbWJkYSBhcmd1bWVudAorLy8gdG8gQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoKQordm9pZCBDaGVja1NpbXBsZShSZXN1bHRzIGNvbnN0JiBlKSB7CisgIGRvdWJsZSBpdHMgPSBlLk51bUl0ZXJhdGlvbnMoKTsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJmb28iLCBFUSwgMSk7CisgIC8vIGNoZWNrIHRoYXQgdGhlIHZhbHVlIG9mIGJhciBpcyB3aXRoaW4gMC4xJSBvZiB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAiYmFyIiwgRVEsIDIuICogaXRzLCAwLjAwMSk7Cit9CitDSEVDS19CRU5DSE1BUktfUkVTVUxUUygiQk1fQ291bnRlcnNfU2ltcGxlIiwgJkNoZWNrU2ltcGxlKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvdW50ZXJzK0l0ZW1zK0J5dGVzL3MgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCituYW1lc3BhY2UgeworaW50IG51bV9jYWxsczEgPSAwOworfQordm9pZCBCTV9Db3VudGVyc19XaXRoQnl0ZXNBbmRJdGVtc1BTZWMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIC8vIFRoaXMgdGVzdCByZXF1aXJlcyBhIG5vbi16ZXJvIENQVSB0aW1lIHRvIGF2b2lkIGRpdmlkZS1ieS16ZXJvCisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHN0YXRlLml0ZXJhdGlvbnMoKSk7CisgIH0KKyAgc3RhdGUuY291bnRlcnNbImZvbyJdID0gMTsKKyAgc3RhdGUuY291bnRlcnNbImJhciJdID0gKytudW1fY2FsbHMxOworICBzdGF0ZS5TZXRCeXRlc1Byb2Nlc3NlZCgzNjQpOworICBzdGF0ZS5TZXRJdGVtc1Byb2Nlc3NlZCgxNTApOworfQorQkVOQ0hNQVJLKEJNX0NvdW50ZXJzX1dpdGhCeXRlc0FuZEl0ZW1zUFNlYyk7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX0NvdW50ZXJzX1dpdGhCeXRlc0FuZEl0ZW1zUFNlYyAlY29uc29sZV9yZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhcj0laHJmbG9hdCBieXRlc19wZXJfc2Vjb25kPSVocmZsb2F0L3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbz0laHJmbG9hdCBpdGVtc19wZXJfc2Vjb25kPSVocmZsb2F0L3MkIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LAorICAgICAgICAgIHt7IlwibmFtZVwiOiBcIkJNX0NvdW50ZXJzX1dpdGhCeXRlc0FuZEl0ZW1zUFNlY1wiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fQ291bnRlcnNfV2l0aEJ5dGVzQW5kSXRlbXNQU2VjXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlYWxfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiY3B1X3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRpbWVfdW5pdFwiOiBcIm5zXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiYmFyXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJieXRlc19wZXJfc2Vjb25kXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJmb29cIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZW1zX3Blcl9zZWNvbmRcIjogJWZsb2F0JCIsIE1SX05leHR9LAorICAgICAgICAgICB7In0iLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0NTVk91dCwge3siXlwiQk1fQ291bnRlcnNfV2l0aEJ5dGVzQW5kSXRlbXNQU2VjXCIsIgorICAgICAgICAgICAgICAgICAgICAgICAiJWNzdl9ieXRlc19pdGVtc19yZXBvcnQsJWZsb2F0LCVmbG9hdCQifX0pOworLy8gVlMyMDEzIGRvZXMgbm90IGFsbG93IHRoaXMgZnVuY3Rpb24gdG8gYmUgcGFzc2VkIGFzIGEgbGFtYmRhIGFyZ3VtZW50CisvLyB0byBDSEVDS19CRU5DSE1BUktfUkVTVUxUUygpCit2b2lkIENoZWNrQnl0ZXNBbmRJdGVtc1BTZWMoUmVzdWx0cyBjb25zdCYgZSkgeworICBkb3VibGUgdCA9IGUuRHVyYXRpb25DUFVUaW1lKCk7ICAvLyB0aGlzIChhbmQgbm90IHJlYWwgdGltZSkgaXMgdGhlIHRpbWUgdXNlZAorICBDSEVDS19DT1VOVEVSX1ZBTFVFKGUsIGludCwgImZvbyIsIEVRLCAxKTsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJiYXIiLCBFUSwgbnVtX2NhbGxzMSk7CisgIC8vIGNoZWNrIHRoYXQgdGhlIHZhbHVlcyBhcmUgd2l0aGluIDAuMSUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlcworICBDSEVDS19GTE9BVF9SRVNVTFRfVkFMVUUoZSwgImJ5dGVzX3Blcl9zZWNvbmQiLCBFUSwgMzY0LiAvIHQsIDAuMDAxKTsKKyAgQ0hFQ0tfRkxPQVRfUkVTVUxUX1ZBTFVFKGUsICJpdGVtc19wZXJfc2Vjb25kIiwgRVEsIDE1MC4gLyB0LCAwLjAwMSk7Cit9CitDSEVDS19CRU5DSE1BUktfUkVTVUxUUygiQk1fQ291bnRlcnNfV2l0aEJ5dGVzQW5kSXRlbXNQU2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZDaGVja0J5dGVzQW5kSXRlbXNQU2VjKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSYXRlIENvdW50ZXJzIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX0NvdW50ZXJzX1JhdGUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIC8vIFRoaXMgdGVzdCByZXF1aXJlcyBhIG5vbi16ZXJvIENQVSB0aW1lIHRvIGF2b2lkIGRpdmlkZS1ieS16ZXJvCisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHN0YXRlLml0ZXJhdGlvbnMoKSk7CisgIH0KKyAgbmFtZXNwYWNlIGJtID0gYmVuY2htYXJrOworICBzdGF0ZS5jb3VudGVyc1siZm9vIl0gPSBibTo6Q291bnRlcnsxLCBibTo6Q291bnRlcjo6a0lzUmF0ZX07CisgIHN0YXRlLmNvdW50ZXJzWyJiYXIiXSA9IGJtOjpDb3VudGVyezIsIGJtOjpDb3VudGVyOjprSXNSYXRlfTsKK30KK0JFTkNITUFSSyhCTV9Db3VudGVyc19SYXRlKTsKK0FERF9DQVNFUygKKyAgICBUQ19Db25zb2xlT3V0LAorICAgIHt7Il5CTV9Db3VudGVyc19SYXRlICVjb25zb2xlX3JlcG9ydCBiYXI9JWhyZmxvYXQvcyBmb289JWhyZmxvYXQvcyQifX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsIHt7IlwibmFtZVwiOiBcIkJNX0NvdW50ZXJzX1JhdGVcIiwkIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJzX1JhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJiYXJcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9Db3VudGVyc19SYXRlXCIsJWNzdl9yZXBvcnQsJWZsb2F0LCVmbG9hdCQifX0pOworLy8gVlMyMDEzIGRvZXMgbm90IGFsbG93IHRoaXMgZnVuY3Rpb24gdG8gYmUgcGFzc2VkIGFzIGEgbGFtYmRhIGFyZ3VtZW50CisvLyB0byBDSEVDS19CRU5DSE1BUktfUkVTVUxUUygpCit2b2lkIENoZWNrUmF0ZShSZXN1bHRzIGNvbnN0JiBlKSB7CisgIGRvdWJsZSB0ID0gZS5EdXJhdGlvbkNQVVRpbWUoKTsgIC8vIHRoaXMgKGFuZCBub3QgcmVhbCB0aW1lKSBpcyB0aGUgdGltZSB1c2VkCisgIC8vIGNoZWNrIHRoYXQgdGhlIHZhbHVlcyBhcmUgd2l0aGluIDAuMSUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlcworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJmb28iLCBFUSwgMS4gLyB0LCAwLjAwMSk7CisgIENIRUNLX0ZMT0FUX0NPVU5URVJfVkFMVUUoZSwgImJhciIsIEVRLCAyLiAvIHQsIDAuMDAxKTsKK30KK0NIRUNLX0JFTkNITUFSS19SRVNVTFRTKCJCTV9Db3VudGVyc19SYXRlIiwgJkNoZWNrUmF0ZSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludmVydGVkIENvdW50ZXJzIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9JbnZlcnQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIC8vIFRoaXMgdGVzdCByZXF1aXJlcyBhIG5vbi16ZXJvIENQVSB0aW1lIHRvIGF2b2lkIGRpdmlkZS1ieS16ZXJvCisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHN0YXRlLml0ZXJhdGlvbnMoKSk7CisgIH0KKyAgbmFtZXNwYWNlIGJtID0gYmVuY2htYXJrOworICBzdGF0ZS5jb3VudGVyc1siZm9vIl0gPSBibTo6Q291bnRlcnswLjAwMDEsIGJtOjpDb3VudGVyOjprSW52ZXJ0fTsKKyAgc3RhdGUuY291bnRlcnNbImJhciJdID0gYm06OkNvdW50ZXJ7MTAwMDAsIGJtOjpDb3VudGVyOjprSW52ZXJ0fTsKK30KK0JFTkNITUFSSyhCTV9JbnZlcnQpOworQUREX0NBU0VTKFRDX0NvbnNvbGVPdXQsCisgICAgICAgICAge3siXkJNX0ludmVydCAlY29uc29sZV9yZXBvcnQgYmFyPSVocmZsb2F0dSBmb289JWhyZmxvYXRrJCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwge3siXCJuYW1lXCI6IFwiQk1fSW52ZXJ0XCIsJCJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9JbnZlcnRcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiXCJiYXJcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJcImZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9JbnZlcnRcIiwlY3N2X3JlcG9ydCwlZmxvYXQsJWZsb2F0JCJ9fSk7CisvLyBWUzIwMTMgZG9lcyBub3QgYWxsb3cgdGhpcyBmdW5jdGlvbiB0byBiZSBwYXNzZWQgYXMgYSBsYW1iZGEgYXJndW1lbnQKKy8vIHRvIENIRUNLX0JFTkNITUFSS19SRVNVTFRTKCkKK3ZvaWQgQ2hlY2tJbnZlcnQoUmVzdWx0cyBjb25zdCYgZSkgeworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJmb28iLCBFUSwgMTAwMDAsIDAuMDAwMSk7CisgIENIRUNLX0ZMT0FUX0NPVU5URVJfVkFMVUUoZSwgImJhciIsIEVRLCAwLjAwMDEsIDAuMDAwMSk7Cit9CitDSEVDS19CRU5DSE1BUktfUkVTVUxUUygiQk1fSW52ZXJ0IiwgJkNoZWNrSW52ZXJ0KTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnZlcnRlZFJhdGUgQ291bnRlcnMgT3V0cHV0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX0NvdW50ZXJzX0ludmVydGVkUmF0ZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgLy8gVGhpcyB0ZXN0IHJlcXVpcmVzIGEgbm9uLXplcm8gQ1BVIHRpbWUgdG8gYXZvaWQgZGl2aWRlLWJ5LXplcm8KKyAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoc3RhdGUuaXRlcmF0aW9ucygpKTsKKyAgfQorICBuYW1lc3BhY2UgYm0gPSBiZW5jaG1hcms7CisgIHN0YXRlLmNvdW50ZXJzWyJmb28iXSA9CisgICAgICBibTo6Q291bnRlcnsxLCBibTo6Q291bnRlcjo6a0lzUmF0ZSB8IGJtOjpDb3VudGVyOjprSW52ZXJ0fTsKKyAgc3RhdGUuY291bnRlcnNbImJhciJdID0KKyAgICAgIGJtOjpDb3VudGVyezgxOTIsIGJtOjpDb3VudGVyOjprSXNSYXRlIHwgYm06OkNvdW50ZXI6OmtJbnZlcnR9OworfQorQkVOQ0hNQVJLKEJNX0NvdW50ZXJzX0ludmVydGVkUmF0ZSk7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX0NvdW50ZXJzX0ludmVydGVkUmF0ZSAlY29uc29sZV9yZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhcj0laHJmbG9hdHMgZm9vPSVocmZsb2F0cyQifX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsCisgICAgICAgICAge3siXCJuYW1lXCI6IFwiQk1fQ291bnRlcnNfSW52ZXJ0ZWRSYXRlXCIsJCJ9LAorICAgICAgICAgICB7IlwicnVuX25hbWVcIjogXCJCTV9Db3VudGVyc19JbnZlcnRlZFJhdGVcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJiYXJcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LAorICAgICAgICAgIHt7Il5cIkJNX0NvdW50ZXJzX0ludmVydGVkUmF0ZVwiLCVjc3ZfcmVwb3J0LCVmbG9hdCwlZmxvYXQkIn19KTsKKy8vIFZTMjAxMyBkb2VzIG5vdCBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIGxhbWJkYSBhcmd1bWVudAorLy8gdG8gQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoKQordm9pZCBDaGVja0ludmVydGVkUmF0ZShSZXN1bHRzIGNvbnN0JiBlKSB7CisgIGRvdWJsZSB0ID0gZS5EdXJhdGlvbkNQVVRpbWUoKTsgIC8vIHRoaXMgKGFuZCBub3QgcmVhbCB0aW1lKSBpcyB0aGUgdGltZSB1c2VkCisgIC8vIGNoZWNrIHRoYXQgdGhlIHZhbHVlcyBhcmUgd2l0aGluIDAuMSUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlcworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJmb28iLCBFUSwgdCwgMC4wMDEpOworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJiYXIiLCBFUSwgdCAvIDgxOTIuMCwgMC4wMDEpOworfQorQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoIkJNX0NvdW50ZXJzX0ludmVydGVkUmF0ZSIsICZDaGVja0ludmVydGVkUmF0ZSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhyZWFkIENvdW50ZXJzIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9Db3VudGVyc19UaHJlYWRzKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgfQorICBzdGF0ZS5jb3VudGVyc1siZm9vIl0gPSAxOworICBzdGF0ZS5jb3VudGVyc1siYmFyIl0gPSAyOworfQorQkVOQ0hNQVJLKEJNX0NvdW50ZXJzX1RocmVhZHMpLT5UaHJlYWRSYW5nZSgxLCA4KTsKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LCB7eyJeQk1fQ291bnRlcnNfVGhyZWFkcy90aHJlYWRzOiVpbnQgJWNvbnNvbGVfcmVwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXI9JWhyZmxvYXQgZm9vPSVocmZsb2F0JCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwKKyAgICAgICAgICB7eyJcIm5hbWVcIjogXCJCTV9Db3VudGVyc19UaHJlYWRzL3RocmVhZHM6JWludFwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fQ291bnRlcnNfVGhyZWFkcy90aHJlYWRzOiVpbnRcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJiYXJcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoCisgICAgVENfQ1NWT3V0LAorICAgIHt7Il5cIkJNX0NvdW50ZXJzX1RocmVhZHMvdGhyZWFkczolaW50XCIsJWNzdl9yZXBvcnQsJWZsb2F0LCVmbG9hdCQifX0pOworLy8gVlMyMDEzIGRvZXMgbm90IGFsbG93IHRoaXMgZnVuY3Rpb24gdG8gYmUgcGFzc2VkIGFzIGEgbGFtYmRhIGFyZ3VtZW50CisvLyB0byBDSEVDS19CRU5DSE1BUktfUkVTVUxUUygpCit2b2lkIENoZWNrVGhyZWFkcyhSZXN1bHRzIGNvbnN0JiBlKSB7CisgIENIRUNLX0NPVU5URVJfVkFMVUUoZSwgaW50LCAiZm9vIiwgRVEsIGUuTnVtVGhyZWFkcygpKTsKKyAgQ0hFQ0tfQ09VTlRFUl9WQUxVRShlLCBpbnQsICJiYXIiLCBFUSwgMiAqIGUuTnVtVGhyZWFkcygpKTsKK30KK0NIRUNLX0JFTkNITUFSS19SRVNVTFRTKCJCTV9Db3VudGVyc19UaHJlYWRzL3RocmVhZHM6JWludCIsICZDaGVja1RocmVhZHMpOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRocmVhZEF2ZyBDb3VudGVycyBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK3ZvaWQgQk1fQ291bnRlcnNfQXZnVGhyZWFkcyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KKyAgbmFtZXNwYWNlIGJtID0gYmVuY2htYXJrOworICBzdGF0ZS5jb3VudGVyc1siZm9vIl0gPSBibTo6Q291bnRlcnsxLCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHN9OworICBzdGF0ZS5jb3VudGVyc1siYmFyIl0gPSBibTo6Q291bnRlcnsyLCBibTo6Q291bnRlcjo6a0F2Z1RocmVhZHN9OworfQorQkVOQ0hNQVJLKEJNX0NvdW50ZXJzX0F2Z1RocmVhZHMpLT5UaHJlYWRSYW5nZSgxLCA4KTsKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LCB7eyJeQk1fQ291bnRlcnNfQXZnVGhyZWFkcy90aHJlYWRzOiVpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVjb25zb2xlX3JlcG9ydCBiYXI9JWhyZmxvYXQgZm9vPSVocmZsb2F0JCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwKKyAgICAgICAgICB7eyJcIm5hbWVcIjogXCJCTV9Db3VudGVyc19BdmdUaHJlYWRzL3RocmVhZHM6JWludFwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fQ291bnRlcnNfQXZnVGhyZWFkcy90aHJlYWRzOiVpbnRcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJiYXJcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoCisgICAgVENfQ1NWT3V0LAorICAgIHt7Il5cIkJNX0NvdW50ZXJzX0F2Z1RocmVhZHMvdGhyZWFkczolaW50XCIsJWNzdl9yZXBvcnQsJWZsb2F0LCVmbG9hdCQifX0pOworLy8gVlMyMDEzIGRvZXMgbm90IGFsbG93IHRoaXMgZnVuY3Rpb24gdG8gYmUgcGFzc2VkIGFzIGEgbGFtYmRhIGFyZ3VtZW50CisvLyB0byBDSEVDS19CRU5DSE1BUktfUkVTVUxUUygpCit2b2lkIENoZWNrQXZnVGhyZWFkcyhSZXN1bHRzIGNvbnN0JiBlKSB7CisgIENIRUNLX0NPVU5URVJfVkFMVUUoZSwgaW50LCAiZm9vIiwgRVEsIDEpOworICBDSEVDS19DT1VOVEVSX1ZBTFVFKGUsIGludCwgImJhciIsIEVRLCAyKTsKK30KK0NIRUNLX0JFTkNITUFSS19SRVNVTFRTKCJCTV9Db3VudGVyc19BdmdUaHJlYWRzL3RocmVhZHM6JWludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmQ2hlY2tBdmdUaHJlYWRzKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaHJlYWRBdmcgQ291bnRlcnMgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX0NvdW50ZXJzX0F2Z1RocmVhZHNSYXRlKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAvLyBUaGlzIHRlc3QgcmVxdWlyZXMgYSBub24temVybyBDUFUgdGltZSB0byBhdm9pZCBkaXZpZGUtYnktemVybworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9CisgIG5hbWVzcGFjZSBibSA9IGJlbmNobWFyazsKKyAgc3RhdGUuY291bnRlcnNbImZvbyJdID0gYm06OkNvdW50ZXJ7MSwgYm06OkNvdW50ZXI6OmtBdmdUaHJlYWRzUmF0ZX07CisgIHN0YXRlLmNvdW50ZXJzWyJiYXIiXSA9IGJtOjpDb3VudGVyezIsIGJtOjpDb3VudGVyOjprQXZnVGhyZWFkc1JhdGV9OworfQorQkVOQ0hNQVJLKEJNX0NvdW50ZXJzX0F2Z1RocmVhZHNSYXRlKS0+VGhyZWFkUmFuZ2UoMSwgOCk7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX0NvdW50ZXJzX0F2Z1RocmVhZHNSYXRlL3RocmVhZHM6JWludCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWNvbnNvbGVfcmVwb3J0IGJhcj0laHJmbG9hdC9zIGZvbz0laHJmbG9hdC9zJCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwKKyAgICAgICAgICB7eyJcIm5hbWVcIjogXCJCTV9Db3VudGVyc19BdmdUaHJlYWRzUmF0ZS90aHJlYWRzOiVpbnRcIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJzX0F2Z1RocmVhZHNSYXRlL3RocmVhZHM6JWludFwiLCQiLAorICAgICAgICAgICAgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJiYXJcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9Db3VudGVyc19BdmdUaHJlYWRzUmF0ZS8iCisgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzOiVpbnRcIiwlY3N2X3JlcG9ydCwlZmxvYXQsJWZsb2F0JCJ9fSk7CisvLyBWUzIwMTMgZG9lcyBub3QgYWxsb3cgdGhpcyBmdW5jdGlvbiB0byBiZSBwYXNzZWQgYXMgYSBsYW1iZGEgYXJndW1lbnQKKy8vIHRvIENIRUNLX0JFTkNITUFSS19SRVNVTFRTKCkKK3ZvaWQgQ2hlY2tBdmdUaHJlYWRzUmF0ZShSZXN1bHRzIGNvbnN0JiBlKSB7CisgIENIRUNLX0ZMT0FUX0NPVU5URVJfVkFMVUUoZSwgImZvbyIsIEVRLCAxLiAvIGUuRHVyYXRpb25DUFVUaW1lKCksIDAuMDAxKTsKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAiYmFyIiwgRVEsIDIuIC8gZS5EdXJhdGlvbkNQVVRpbWUoKSwgMC4wMDEpOworfQorQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoIkJNX0NvdW50ZXJzX0F2Z1RocmVhZHNSYXRlL3RocmVhZHM6JWludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmQ2hlY2tBdmdUaHJlYWRzUmF0ZSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0gSXRlcmF0aW9uSW52YXJpYW50IENvdW50ZXJzIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9Db3VudGVyc19JdGVyYXRpb25JbnZhcmlhbnQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9CisgIG5hbWVzcGFjZSBibSA9IGJlbmNobWFyazsKKyAgc3RhdGUuY291bnRlcnNbImZvbyJdID0gYm06OkNvdW50ZXJ7MSwgYm06OkNvdW50ZXI6OmtJc0l0ZXJhdGlvbkludmFyaWFudH07CisgIHN0YXRlLmNvdW50ZXJzWyJiYXIiXSA9IGJtOjpDb3VudGVyezIsIGJtOjpDb3VudGVyOjprSXNJdGVyYXRpb25JbnZhcmlhbnR9OworfQorQkVOQ0hNQVJLKEJNX0NvdW50ZXJzX0l0ZXJhdGlvbkludmFyaWFudCk7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX0NvdW50ZXJzX0l0ZXJhdGlvbkludmFyaWFudCAlY29uc29sZV9yZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhcj0laHJmbG9hdCBmb289JWhyZmxvYXQkIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LAorICAgICAgICAgIHt7IlwibmFtZVwiOiBcIkJNX0NvdW50ZXJzX0l0ZXJhdGlvbkludmFyaWFudFwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fQ291bnRlcnNfSXRlcmF0aW9uSW52YXJpYW50XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicnVuX3R5cGVcIjogXCJpdGVyYXRpb25cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uc1wiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25faW5kZXhcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAlaW50LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlYWxfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiY3B1X3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRpbWVfdW5pdFwiOiBcIm5zXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiYmFyXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJmb29cIjogJWZsb2F0JCIsIE1SX05leHR9LAorICAgICAgICAgICB7In0iLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0NTVk91dCwKKyAgICAgICAgICB7eyJeXCJCTV9Db3VudGVyc19JdGVyYXRpb25JbnZhcmlhbnRcIiwlY3N2X3JlcG9ydCwlZmxvYXQsJWZsb2F0JCJ9fSk7CisvLyBWUzIwMTMgZG9lcyBub3QgYWxsb3cgdGhpcyBmdW5jdGlvbiB0byBiZSBwYXNzZWQgYXMgYSBsYW1iZGEgYXJndW1lbnQKKy8vIHRvIENIRUNLX0JFTkNITUFSS19SRVNVTFRTKCkKK3ZvaWQgQ2hlY2tJdGVyYXRpb25JbnZhcmlhbnQoUmVzdWx0cyBjb25zdCYgZSkgeworICBkb3VibGUgaXRzID0gZS5OdW1JdGVyYXRpb25zKCk7CisgIC8vIGNoZWNrIHRoYXQgdGhlIHZhbHVlcyBhcmUgd2l0aGluIDAuMSUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlCisgIENIRUNLX0ZMT0FUX0NPVU5URVJfVkFMVUUoZSwgImZvbyIsIEVRLCBpdHMsIDAuMDAxKTsKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAiYmFyIiwgRVEsIDIuICogaXRzLCAwLjAwMSk7Cit9CitDSEVDS19CRU5DSE1BUktfUkVTVUxUUygiQk1fQ291bnRlcnNfSXRlcmF0aW9uSW52YXJpYW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZDaGVja0l0ZXJhdGlvbkludmFyaWFudCk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tIEl0ZXJhdGlvbkludmFyaWFudFJhdGUgQ291bnRlcnMgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0gLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKwordm9pZCBCTV9Db3VudGVyc19rSXNJdGVyYXRpb25JbnZhcmlhbnRSYXRlKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAvLyBUaGlzIHRlc3QgcmVxdWlyZXMgYSBub24temVybyBDUFUgdGltZSB0byBhdm9pZCBkaXZpZGUtYnktemVybworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShzdGF0ZS5pdGVyYXRpb25zKCkpOworICB9CisgIG5hbWVzcGFjZSBibSA9IGJlbmNobWFyazsKKyAgc3RhdGUuY291bnRlcnNbImZvbyJdID0KKyAgICAgIGJtOjpDb3VudGVyezEsIGJtOjpDb3VudGVyOjprSXNJdGVyYXRpb25JbnZhcmlhbnRSYXRlfTsKKyAgc3RhdGUuY291bnRlcnNbImJhciJdID0KKyAgICAgIGJtOjpDb3VudGVyezIsIGJtOjpDb3VudGVyOjprSXNSYXRlIHwgYm06OkNvdW50ZXI6OmtJc0l0ZXJhdGlvbkludmFyaWFudH07Cit9CitCRU5DSE1BUksoQk1fQ291bnRlcnNfa0lzSXRlcmF0aW9uSW52YXJpYW50UmF0ZSk7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX0NvdW50ZXJzX2tJc0l0ZXJhdGlvbkludmFyaWFudFJhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVjb25zb2xlX3JlcG9ydCBiYXI9JWhyZmxvYXQvcyBmb289JWhyZmxvYXQvcyQifX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsCisgICAgICAgICAge3siXCJuYW1lXCI6IFwiQk1fQ291bnRlcnNfa0lzSXRlcmF0aW9uSW52YXJpYW50UmF0ZVwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fQ291bnRlcnNfa0lzSXRlcmF0aW9uSW52YXJpYW50UmF0ZVwiLCQiLAorICAgICAgICAgICAgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJiYXJcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LCB7eyJeXCJCTV9Db3VudGVyc19rSXNJdGVyYXRpb25JbnZhcmlhbnRSYXRlXCIsJWNzdl9yZXBvcnQsIgorICAgICAgICAgICAgICAgICAgICAgICAiJWZsb2F0LCVmbG9hdCQifX0pOworLy8gVlMyMDEzIGRvZXMgbm90IGFsbG93IHRoaXMgZnVuY3Rpb24gdG8gYmUgcGFzc2VkIGFzIGEgbGFtYmRhIGFyZ3VtZW50CisvLyB0byBDSEVDS19CRU5DSE1BUktfUkVTVUxUUygpCit2b2lkIENoZWNrSXNJdGVyYXRpb25JbnZhcmlhbnRSYXRlKFJlc3VsdHMgY29uc3QmIGUpIHsKKyAgZG91YmxlIGl0cyA9IGUuTnVtSXRlcmF0aW9ucygpOworICBkb3VibGUgdCA9IGUuRHVyYXRpb25DUFVUaW1lKCk7ICAvLyB0aGlzIChhbmQgbm90IHJlYWwgdGltZSkgaXMgdGhlIHRpbWUgdXNlZAorICAvLyBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgYXJlIHdpdGhpbiAwLjElIG9mIHRoZSBleHBlY3RlZCB2YWx1ZXMKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAiZm9vIiwgRVEsIGl0cyAqIDEuIC8gdCwgMC4wMDEpOworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJiYXIiLCBFUSwgaXRzICogMi4gLyB0LCAwLjAwMSk7Cit9CitDSEVDS19CRU5DSE1BUktfUkVTVUxUUygiQk1fQ291bnRlcnNfa0lzSXRlcmF0aW9uSW52YXJpYW50UmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAmQ2hlY2tJc0l0ZXJhdGlvbkludmFyaWFudFJhdGUpOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tIEF2Z0l0ZXJhdGlvbnMgQ291bnRlcnMgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX0NvdW50ZXJzX0F2Z0l0ZXJhdGlvbnMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICB9CisgIG5hbWVzcGFjZSBibSA9IGJlbmNobWFyazsKKyAgc3RhdGUuY291bnRlcnNbImZvbyJdID0gYm06OkNvdW50ZXJ7MSwgYm06OkNvdW50ZXI6OmtBdmdJdGVyYXRpb25zfTsKKyAgc3RhdGUuY291bnRlcnNbImJhciJdID0gYm06OkNvdW50ZXJ7MiwgYm06OkNvdW50ZXI6OmtBdmdJdGVyYXRpb25zfTsKK30KK0JFTkNITUFSSyhCTV9Db3VudGVyc19BdmdJdGVyYXRpb25zKTsKK0FERF9DQVNFUyhUQ19Db25zb2xlT3V0LCB7eyJeQk1fQ291bnRlcnNfQXZnSXRlcmF0aW9ucyAlY29uc29sZV9yZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhcj0laHJmbG9hdCBmb289JWhyZmxvYXQkIn19KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LAorICAgICAgICAgIHt7IlwibmFtZVwiOiBcIkJNX0NvdW50ZXJzX0F2Z0l0ZXJhdGlvbnNcIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJzX0F2Z0l0ZXJhdGlvbnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJiYXJcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImZvb1wiOiAlZmxvYXQkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfQ1NWT3V0LAorICAgICAgICAgIHt7Il5cIkJNX0NvdW50ZXJzX0F2Z0l0ZXJhdGlvbnNcIiwlY3N2X3JlcG9ydCwlZmxvYXQsJWZsb2F0JCJ9fSk7CisvLyBWUzIwMTMgZG9lcyBub3QgYWxsb3cgdGhpcyBmdW5jdGlvbiB0byBiZSBwYXNzZWQgYXMgYSBsYW1iZGEgYXJndW1lbnQKKy8vIHRvIENIRUNLX0JFTkNITUFSS19SRVNVTFRTKCkKK3ZvaWQgQ2hlY2tBdmdJdGVyYXRpb25zKFJlc3VsdHMgY29uc3QmIGUpIHsKKyAgZG91YmxlIGl0cyA9IGUuTnVtSXRlcmF0aW9ucygpOworICAvLyBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgYXJlIHdpdGhpbiAwLjElIG9mIHRoZSBleHBlY3RlZCB2YWx1ZQorICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJmb28iLCBFUSwgMS4gLyBpdHMsIDAuMDAxKTsKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAiYmFyIiwgRVEsIDIuIC8gaXRzLCAwLjAwMSk7Cit9CitDSEVDS19CRU5DSE1BUktfUkVTVUxUUygiQk1fQ291bnRlcnNfQXZnSXRlcmF0aW9ucyIsICZDaGVja0F2Z0l0ZXJhdGlvbnMpOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLSBBdmdJdGVyYXRpb25zUmF0ZSBDb3VudGVycyBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX0NvdW50ZXJzX2tBdmdJdGVyYXRpb25zUmF0ZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgLy8gVGhpcyB0ZXN0IHJlcXVpcmVzIGEgbm9uLXplcm8gQ1BVIHRpbWUgdG8gYXZvaWQgZGl2aWRlLWJ5LXplcm8KKyAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoc3RhdGUuaXRlcmF0aW9ucygpKTsKKyAgfQorICBuYW1lc3BhY2UgYm0gPSBiZW5jaG1hcms7CisgIHN0YXRlLmNvdW50ZXJzWyJmb28iXSA9IGJtOjpDb3VudGVyezEsIGJtOjpDb3VudGVyOjprQXZnSXRlcmF0aW9uc1JhdGV9OworICBzdGF0ZS5jb3VudGVyc1siYmFyIl0gPQorICAgICAgYm06OkNvdW50ZXJ7MiwgYm06OkNvdW50ZXI6OmtJc1JhdGUgfCBibTo6Q291bnRlcjo6a0F2Z0l0ZXJhdGlvbnN9OworfQorQkVOQ0hNQVJLKEJNX0NvdW50ZXJzX2tBdmdJdGVyYXRpb25zUmF0ZSk7CitBRERfQ0FTRVMoVENfQ29uc29sZU91dCwge3siXkJNX0NvdW50ZXJzX2tBdmdJdGVyYXRpb25zUmF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWNvbnNvbGVfcmVwb3J0IGJhcj0laHJmbG9hdC9zIGZvbz0laHJmbG9hdC9zJCJ9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwKKyAgICAgICAgICB7eyJcIm5hbWVcIjogXCJCTV9Db3VudGVyc19rQXZnSXRlcmF0aW9uc1JhdGVcIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJzX2tBdmdJdGVyYXRpb25zUmF0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDAsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImJhclwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiZm9vXCI6ICVmbG9hdCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJ9IiwgTVJfTmV4dH19KTsKK0FERF9DQVNFUyhUQ19DU1ZPdXQsIHt7Il5cIkJNX0NvdW50ZXJzX2tBdmdJdGVyYXRpb25zUmF0ZVwiLCVjc3ZfcmVwb3J0LCIKKyAgICAgICAgICAgICAgICAgICAgICAgIiVmbG9hdCwlZmxvYXQkIn19KTsKKy8vIFZTMjAxMyBkb2VzIG5vdCBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIGxhbWJkYSBhcmd1bWVudAorLy8gdG8gQ0hFQ0tfQkVOQ0hNQVJLX1JFU1VMVFMoKQordm9pZCBDaGVja0F2Z0l0ZXJhdGlvbnNSYXRlKFJlc3VsdHMgY29uc3QmIGUpIHsKKyAgZG91YmxlIGl0cyA9IGUuTnVtSXRlcmF0aW9ucygpOworICBkb3VibGUgdCA9IGUuRHVyYXRpb25DUFVUaW1lKCk7ICAvLyB0aGlzIChhbmQgbm90IHJlYWwgdGltZSkgaXMgdGhlIHRpbWUgdXNlZAorICAvLyBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgYXJlIHdpdGhpbiAwLjElIG9mIHRoZSBleHBlY3RlZCB2YWx1ZXMKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAiZm9vIiwgRVEsIDEuIC8gaXRzIC8gdCwgMC4wMDEpOworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJiYXIiLCBFUSwgMi4gLyBpdHMgLyB0LCAwLjAwMSk7Cit9CitDSEVDS19CRU5DSE1BUktfUkVTVUxUUygiQk1fQ291bnRlcnNfa0F2Z0l0ZXJhdGlvbnNSYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZDaGVja0F2Z0l0ZXJhdGlvbnNSYXRlKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRFU1QgQ0FTRVMgRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7IFJ1bk91dHB1dFRlc3RzKGFyZ2MsIGFyZ3YpOyB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3VzZXJfY291bnRlcnNfdGhvdXNhbmRzX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90ZXN0L3VzZXJfY291bnRlcnNfdGhvdXNhbmRzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkODI4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rlc3QvdXNlcl9jb3VudGVyc190aG91c2FuZHNfdGVzdC5jYwpAQCAtMCwwICsxLDE3MyBAQAorCisjdW5kZWYgTkRFQlVHCisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAib3V0cHV0X3Rlc3QuaCIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRob3VzYW5kcyBDdXN0b21pc2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCit2b2lkIEJNX0NvdW50ZXJzX1Rob3VzYW5kcyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgIH0KKyAgbmFtZXNwYWNlIGJtID0gYmVuY2htYXJrOworICBzdGF0ZS5jb3VudGVycy5pbnNlcnQoeworICAgICAgeyJ0MF8xMDAwMDAwRGVmYXVsdEJhc2UiLAorICAgICAgIGJtOjpDb3VudGVyKDEwMDAgKiAxMDAwLCBibTo6Q291bnRlcjo6a0RlZmF1bHRzKX0sCisgICAgICB7InQxXzEwMDAwMDBCYXNlMTAwMCIsIGJtOjpDb3VudGVyKDEwMDAgKiAxMDAwLCBibTo6Q291bnRlcjo6a0RlZmF1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcms6OkNvdW50ZXI6Ok9uZUs6OmtJczEwMDApfSwKKyAgICAgIHsidDJfMTAwMDAwMEJhc2UxMDI0IiwgYm06OkNvdW50ZXIoMTAwMCAqIDEwMDAsIGJtOjpDb3VudGVyOjprRGVmYXVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmNobWFyazo6Q291bnRlcjo6T25lSzo6a0lzMTAyNCl9LAorICAgICAgeyJ0M18xMDQ4NTc2QmFzZTEwMDAiLCBibTo6Q291bnRlcigxMDI0ICogMTAyNCwgYm06OkNvdW50ZXI6OmtEZWZhdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVuY2htYXJrOjpDb3VudGVyOjpPbmVLOjprSXMxMDAwKX0sCisgICAgICB7InQ0XzEwNDg1NzZCYXNlMTAyNCIsIGJtOjpDb3VudGVyKDEwMjQgKiAxMDI0LCBibTo6Q291bnRlcjo6a0RlZmF1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcms6OkNvdW50ZXI6Ok9uZUs6OmtJczEwMjQpfSwKKyAgfSk7Cit9CitCRU5DSE1BUksoQk1fQ291bnRlcnNfVGhvdXNhbmRzKS0+UmVwZXRpdGlvbnMoMik7CitBRERfQ0FTRVMoCisgICAgVENfQ29uc29sZU91dCwKKyAgICB7CisgICAgICAgIHsiXkJNX0NvdW50ZXJzX1Rob3VzYW5kcy9yZXBlYXRzOjIgJWNvbnNvbGVfcmVwb3J0ICIKKyAgICAgICAgICJ0MF8xMDAwMDAwRGVmYXVsdEJhc2U9MTAwMGsgIgorICAgICAgICAgInQxXzEwMDAwMDBCYXNlMTAwMD0xMDAwayB0Ml8xMDAwMDAwQmFzZTEwMjQ9OTc2LjU2WzIzXWsgIgorICAgICAgICAgInQzXzEwNDg1NzZCYXNlMTAwMD0xMDQ4LjU4ayB0NF8xMDQ4NTc2QmFzZTEwMjQ9MTAyNGskIn0sCisgICAgICAgIHsiXkJNX0NvdW50ZXJzX1Rob3VzYW5kcy9yZXBlYXRzOjIgJWNvbnNvbGVfcmVwb3J0ICIKKyAgICAgICAgICJ0MF8xMDAwMDAwRGVmYXVsdEJhc2U9MTAwMGsgIgorICAgICAgICAgInQxXzEwMDAwMDBCYXNlMTAwMD0xMDAwayB0Ml8xMDAwMDAwQmFzZTEwMjQ9OTc2LjU2WzIzXWsgIgorICAgICAgICAgInQzXzEwNDg1NzZCYXNlMTAwMD0xMDQ4LjU4ayB0NF8xMDQ4NTc2QmFzZTEwMjQ9MTAyNGskIn0sCisgICAgICAgIHsiXkJNX0NvdW50ZXJzX1Rob3VzYW5kcy9yZXBlYXRzOjJfbWVhbiAlY29uc29sZV9yZXBvcnQgIgorICAgICAgICAgInQwXzEwMDAwMDBEZWZhdWx0QmFzZT0xMDAwayB0MV8xMDAwMDAwQmFzZTEwMDA9MTAwMGsgIgorICAgICAgICAgInQyXzEwMDAwMDBCYXNlMTAyND05NzYuNTZbMjNdayB0M18xMDQ4NTc2QmFzZTEwMDA9MTA0OC41OGsgIgorICAgICAgICAgInQ0XzEwNDg1NzZCYXNlMTAyND0xMDI0ayQifSwKKyAgICAgICAgeyJeQk1fQ291bnRlcnNfVGhvdXNhbmRzL3JlcGVhdHM6Ml9tZWRpYW4gJWNvbnNvbGVfcmVwb3J0ICIKKyAgICAgICAgICJ0MF8xMDAwMDAwRGVmYXVsdEJhc2U9MTAwMGsgdDFfMTAwMDAwMEJhc2UxMDAwPTEwMDBrICIKKyAgICAgICAgICJ0Ml8xMDAwMDAwQmFzZTEwMjQ9OTc2LjU2WzIzXWsgdDNfMTA0ODU3NkJhc2UxMDAwPTEwNDguNThrICIKKyAgICAgICAgICJ0NF8xMDQ4NTc2QmFzZTEwMjQ9MTAyNGskIn0sCisgICAgICAgIHsiXkJNX0NvdW50ZXJzX1Rob3VzYW5kcy9yZXBlYXRzOjJfc3RkZGV2ICVjb25zb2xlX3RpbWVfb25seV9yZXBvcnQgWyAiCisgICAgICAgICAiXSoyIHQwXzEwMDAwMDBEZWZhdWx0QmFzZT0wIHQxXzEwMDAwMDBCYXNlMTAwMD0wICIKKyAgICAgICAgICJ0Ml8xMDAwMDAwQmFzZTEwMjQ9MCB0M18xMDQ4NTc2QmFzZTEwMDA9MCB0NF8xMDQ4NTc2QmFzZTEwMjQ9MCQifSwKKyAgICB9KTsKK0FERF9DQVNFUyhUQ19KU09OT3V0LAorICAgICAgICAgIHt7IlwibmFtZVwiOiBcIkJNX0NvdW50ZXJzX1Rob3VzYW5kcy9yZXBlYXRzOjJcIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJzX1Rob3VzYW5kcy9yZXBlYXRzOjJcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcIml0ZXJhdGlvblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbl9pbmRleFwiOiAwLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRocmVhZHNcIjogMSwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6ICVpbnQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0MF8xMDAwMDAwRGVmYXVsdEJhc2VcIjogMVxcLigwKSplXFwrKDApKjYsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDFfMTAwMDAwMEJhc2UxMDAwXCI6IDFcXC4oMCkqZVxcKygwKSo2LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInQyXzEwMDAwMDBCYXNlMTAyNFwiOiAxXFwuKDApKmVcXCsoMCkqNiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0M18xMDQ4NTc2QmFzZTEwMDBcIjogMVxcLjA0ODU3NigwKSplXFwrKDApKjYsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDRfMTA0ODU3NkJhc2UxMDI0XCI6IDFcXC4wNDg1NzYoMCkqZVxcKygwKSo2JCIsIE1SX05leHR9LAorICAgICAgICAgICB7In0iLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsCisgICAgICAgICAge3siXCJuYW1lXCI6IFwiQk1fQ291bnRlcnNfVGhvdXNhbmRzL3JlcGVhdHM6MlwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fQ291bnRlcnNfVGhvdXNhbmRzL3JlcGVhdHM6MlwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiaXRlcmF0aW9uXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZXBldGl0aW9uX2luZGV4XCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogJWludCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInQwXzEwMDAwMDBEZWZhdWx0QmFzZVwiOiAxXFwuKDApKmVcXCsoMCkqNiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0MV8xMDAwMDAwQmFzZTEwMDBcIjogMVxcLigwKSplXFwrKDApKjYsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDJfMTAwMDAwMEJhc2UxMDI0XCI6IDFcXC4oMCkqZVxcKygwKSo2LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInQzXzEwNDg1NzZCYXNlMTAwMFwiOiAxXFwuMDQ4NTc2KDApKmVcXCsoMCkqNiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0NF8xMDQ4NTc2QmFzZTEwMjRcIjogMVxcLjA0ODU3NigwKSplXFwrKDApKjYkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwKKyAgICAgICAgICB7eyJcIm5hbWVcIjogXCJCTV9Db3VudGVyc19UaG91c2FuZHMvcmVwZWF0czoyX21lYW5cIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJzX1Rob3VzYW5kcy9yZXBlYXRzOjJcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcImFnZ3JlZ2F0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImFnZ3JlZ2F0ZV9uYW1lXCI6IFwibWVhblwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcIml0ZXJhdGlvbnNcIjogMiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJyZWFsX3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImNwdV90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aW1lX3VuaXRcIjogXCJuc1wiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInQwXzEwMDAwMDBEZWZhdWx0QmFzZVwiOiAxXFwuKDApKmVcXCsoMCkqNiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0MV8xMDAwMDAwQmFzZTEwMDBcIjogMVxcLigwKSplXFwrKDApKjYsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDJfMTAwMDAwMEJhc2UxMDI0XCI6IDFcXC4oMCkqZVxcKygwKSo2LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInQzXzEwNDg1NzZCYXNlMTAwMFwiOiAxXFwuMDQ4NTc2KDApKmVcXCsoMCkqNiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0NF8xMDQ4NTc2QmFzZTEwMjRcIjogMVxcLjA0ODU3NigwKSplXFwrKDApKjYkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CitBRERfQ0FTRVMoVENfSlNPTk91dCwKKyAgICAgICAgICB7eyJcIm5hbWVcIjogXCJCTV9Db3VudGVyc19UaG91c2FuZHMvcmVwZWF0czoyX21lZGlhblwiLCQifSwKKyAgICAgICAgICAgeyJcInJ1bl9uYW1lXCI6IFwiQk1fQ291bnRlcnNfVGhvdXNhbmRzL3JlcGVhdHM6MlwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJ1bl90eXBlXCI6IFwiYWdncmVnYXRlXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVwZXRpdGlvbnNcIjogMiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0aHJlYWRzXCI6IDEsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiYWdncmVnYXRlX25hbWVcIjogXCJtZWRpYW5cIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJpdGVyYXRpb25zXCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwicmVhbF90aW1lXCI6ICVmbG9hdCwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJjcHVfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGltZV91bml0XCI6IFwibnNcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0MF8xMDAwMDAwRGVmYXVsdEJhc2VcIjogMVxcLigwKSplXFwrKDApKjYsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDFfMTAwMDAwMEJhc2UxMDAwXCI6IDFcXC4oMCkqZVxcKygwKSo2LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInQyXzEwMDAwMDBCYXNlMTAyNFwiOiAxXFwuKDApKmVcXCsoMCkqNiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJ0M18xMDQ4NTc2QmFzZTEwMDBcIjogMVxcLjA0ODU3NigwKSplXFwrKDApKjYsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDRfMTA0ODU3NkJhc2UxMDI0XCI6IDFcXC4wNDg1NzYoMCkqZVxcKygwKSo2JCIsIE1SX05leHR9LAorICAgICAgICAgICB7In0iLCBNUl9OZXh0fX0pOworQUREX0NBU0VTKFRDX0pTT05PdXQsCisgICAgICAgICAge3siXCJuYW1lXCI6IFwiQk1fQ291bnRlcnNfVGhvdXNhbmRzL3JlcGVhdHM6Ml9zdGRkZXZcIiwkIn0sCisgICAgICAgICAgIHsiXCJydW5fbmFtZVwiOiBcIkJNX0NvdW50ZXJzX1Rob3VzYW5kcy9yZXBlYXRzOjJcIiwkIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsiXCJydW5fdHlwZVwiOiBcImFnZ3JlZ2F0ZVwiLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlcGV0aXRpb25zXCI6IDIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidGhyZWFkc1wiOiAxLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcImFnZ3JlZ2F0ZV9uYW1lXCI6IFwic3RkZGV2XCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiaXRlcmF0aW9uc1wiOiAyLCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInJlYWxfdGltZVwiOiAlZmxvYXQsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwiY3B1X3RpbWVcIjogJWZsb2F0LCQiLCBNUl9OZXh0fSwKKyAgICAgICAgICAgeyJcInRpbWVfdW5pdFwiOiBcIm5zXCIsJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDBfMTAwMDAwMERlZmF1bHRCYXNlXCI6IDBcXC4oMCkqZVxcKygwKSosJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDFfMTAwMDAwMEJhc2UxMDAwXCI6IDBcXC4oMCkqZVxcKygwKSosJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDJfMTAwMDAwMEJhc2UxMDI0XCI6IDBcXC4oMCkqZVxcKygwKSosJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDNfMTA0ODU3NkJhc2UxMDAwXCI6IDBcXC4oMCkqZVxcKygwKSosJCIsIE1SX05leHR9LAorICAgICAgICAgICB7IlwidDRfMTA0ODU3NkJhc2UxMDI0XCI6IDBcXC4oMCkqZVxcKygwKSokIiwgTVJfTmV4dH0sCisgICAgICAgICAgIHsifSIsIE1SX05leHR9fSk7CisKK0FERF9DQVNFUygKKyAgICBUQ19DU1ZPdXQsCisgICAge3siXlwiQk1fQ291bnRlcnNfVGhvdXNhbmRzLyIKKyAgICAgICJyZXBlYXRzOjJcIiwlY3N2X3JlcG9ydCwxZVxcKygwKSo2LDFlXFwrKDApKjYsMWVcXCsoMCkqNiwxXFwuMDQ4NThlXFwrKCIKKyAgICAgICIwKSo2LDFcXC4wNDg1OGVcXCsoMCkqNiQifSwKKyAgICAgeyJeXCJCTV9Db3VudGVyc19UaG91c2FuZHMvIgorICAgICAgInJlcGVhdHM6MlwiLCVjc3ZfcmVwb3J0LDFlXFwrKDApKjYsMWVcXCsoMCkqNiwxZVxcKygwKSo2LDFcXC4wNDg1OGVcXCsoIgorICAgICAgIjApKjYsMVxcLjA0ODU4ZVxcKygwKSo2JCJ9LAorICAgICB7Il5cIkJNX0NvdW50ZXJzX1Rob3VzYW5kcy8iCisgICAgICAicmVwZWF0czoyX21lYW5cIiwlY3N2X3JlcG9ydCwxZVxcKygwKSo2LDFlXFwrKDApKjYsMWVcXCsoMCkqNiwxXFwuIgorICAgICAgIjA0ODU4ZVxcKygwKSo2LDFcXC4wNDg1OGVcXCsoMCkqNiQifSwKKyAgICAgeyJeXCJCTV9Db3VudGVyc19UaG91c2FuZHMvIgorICAgICAgInJlcGVhdHM6Ml9tZWRpYW5cIiwlY3N2X3JlcG9ydCwxZVxcKygwKSo2LDFlXFwrKDApKjYsMWVcXCsoMCkqNiwxXFwuIgorICAgICAgIjA0ODU4ZVxcKygwKSo2LDFcXC4wNDg1OGVcXCsoMCkqNiQifSwKKyAgICAgeyJeXCJCTV9Db3VudGVyc19UaG91c2FuZHMvcmVwZWF0czoyX3N0ZGRldlwiLCVjc3ZfcmVwb3J0LDAsMCwwLDAsMCQifX0pOworLy8gVlMyMDEzIGRvZXMgbm90IGFsbG93IHRoaXMgZnVuY3Rpb24gdG8gYmUgcGFzc2VkIGFzIGEgbGFtYmRhIGFyZ3VtZW50CisvLyB0byBDSEVDS19CRU5DSE1BUktfUkVTVUxUUygpCit2b2lkIENoZWNrVGhvdXNhbmRzKFJlc3VsdHMgY29uc3QmIGUpIHsKKyAgaWYgKGUubmFtZSAhPSAiQk1fQ291bnRlcnNfVGhvdXNhbmRzL3JlcGVhdHM6MiIpCisgICAgcmV0dXJuOyAgLy8gRG8gbm90IGNoZWNrIHRoZSBhZ2dyZWdhdGVzIQorCisgIC8vIGNoZWNrIHRoYXQgdGhlIHZhbHVlcyBhcmUgd2l0aGluIDAuMDElIG9mIHRoZSBleHBlY3RlZCB2YWx1ZXMKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAidDBfMTAwMDAwMERlZmF1bHRCYXNlIiwgRVEsIDEwMDAgKiAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMSk7CisgIENIRUNLX0ZMT0FUX0NPVU5URVJfVkFMVUUoZSwgInQxXzEwMDAwMDBCYXNlMTAwMCIsIEVRLCAxMDAwICogMTAwMCwgMC4wMDAxKTsKKyAgQ0hFQ0tfRkxPQVRfQ09VTlRFUl9WQUxVRShlLCAidDJfMTAwMDAwMEJhc2UxMDI0IiwgRVEsIDEwMDAgKiAxMDAwLCAwLjAwMDEpOworICBDSEVDS19GTE9BVF9DT1VOVEVSX1ZBTFVFKGUsICJ0M18xMDQ4NTc2QmFzZTEwMDAiLCBFUSwgMTAyNCAqIDEwMjQsIDAuMDAwMSk7CisgIENIRUNLX0ZMT0FUX0NPVU5URVJfVkFMVUUoZSwgInQ0XzEwNDg1NzZCYXNlMTAyNCIsIEVRLCAxMDI0ICogMTAyNCwgMC4wMDAxKTsKK30KK0NIRUNLX0JFTkNITUFSS19SRVNVTFRTKCJCTV9Db3VudGVyc19UaG91c2FuZHMiLCAmQ2hlY2tUaG91c2FuZHMpOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVEVTVCBDQVNFUyBFTkQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsgUnVuT3V0cHV0VGVzdHMoYXJnYywgYXJndik7IH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2NvbXBhcmUucHkgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9jb21wYXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzOWFjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9jb21wYXJlLnB5CkBAIC0wLDAgKzEsNDA4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IHVuaXR0ZXN0CisiIiIKK2NvbXBhcmUucHkgLSB2ZXJzYXRpbGUgYmVuY2htYXJrIG91dHB1dCBjb21wYXJlIHRvb2wKKyIiIgorCitpbXBvcnQgYXJncGFyc2UKK2Zyb20gYXJncGFyc2UgaW1wb3J0IEFyZ3VtZW50UGFyc2VyCitpbXBvcnQgc3lzCitpbXBvcnQgZ2JlbmNoCitmcm9tIGdiZW5jaCBpbXBvcnQgdXRpbCwgcmVwb3J0Citmcm9tIGdiZW5jaC51dGlsIGltcG9ydCAqCisKKworZGVmIGNoZWNrX2lucHV0cyhpbjEsIGluMiwgZmxhZ3MpOgorICAgICIiIgorICAgIFBlcmZvcm0gY2hlY2tpbmcgb24gdGhlIHVzZXIgcHJvdmlkZWQgaW5wdXRzIGFuZCBkaWFnbm9zZSBhbnkgYWJub3JtYWxpdGllcworICAgICIiIgorICAgIGluMV9raW5kLCBpbjFfZXJyID0gY2xhc3NpZnlfaW5wdXRfZmlsZShpbjEpCisgICAgaW4yX2tpbmQsIGluMl9lcnIgPSBjbGFzc2lmeV9pbnB1dF9maWxlKGluMikKKyAgICBvdXRwdXRfZmlsZSA9IGZpbmRfYmVuY2htYXJrX2ZsYWcoJy0tYmVuY2htYXJrX291dD0nLCBmbGFncykKKyAgICBvdXRwdXRfdHlwZSA9IGZpbmRfYmVuY2htYXJrX2ZsYWcoJy0tYmVuY2htYXJrX291dF9mb3JtYXQ9JywgZmxhZ3MpCisgICAgaWYgaW4xX2tpbmQgPT0gSVRfRXhlY3V0YWJsZSBhbmQgaW4yX2tpbmQgPT0gSVRfRXhlY3V0YWJsZSBhbmQgb3V0cHV0X2ZpbGU6CisgICAgICAgIHByaW50KCgiV0FSTklORzogJy0tYmVuY2htYXJrX291dD0lcycgd2lsbCBiZSBwYXNzZWQgdG8gYm90aCAiCisgICAgICAgICAgICAgICAiYmVuY2htYXJrcyBjYXVzaW5nIGl0IHRvIGJlIG92ZXJ3cml0dGVuIikgJSBvdXRwdXRfZmlsZSkKKyAgICBpZiBpbjFfa2luZCA9PSBJVF9KU09OIGFuZCBpbjJfa2luZCA9PSBJVF9KU09OIGFuZCBsZW4oZmxhZ3MpID4gMDoKKyAgICAgICAgcHJpbnQoIldBUk5JTkc6IHBhc3Npbmcgb3B0aW9uYWwgZmxhZ3MgaGFzIG5vIGVmZmVjdCBzaW5jZSBib3RoICIKKyAgICAgICAgICAgICAgImlucHV0cyBhcmUgSlNPTiIpCisgICAgaWYgb3V0cHV0X3R5cGUgaXMgbm90IE5vbmUgYW5kIG91dHB1dF90eXBlICE9ICdqc29uJzoKKyAgICAgICAgcHJpbnQoKCJFUlJPUjogcGFzc2luZyAnLS1iZW5jaG1hcmtfb3V0X2Zvcm1hdD0lcycgdG8gJ2NvbXBhcmUucHlgIgorICAgICAgICAgICAgICAgIiBpcyBub3Qgc3VwcG9ydGVkLiIpICUgb3V0cHV0X3R5cGUpCisgICAgICAgIHN5cy5leGl0KDEpCisKKworZGVmIGNyZWF0ZV9wYXJzZXIoKToKKyAgICBwYXJzZXIgPSBBcmd1bWVudFBhcnNlcigKKyAgICAgICAgZGVzY3JpcHRpb249J3ZlcnNhdGlsZSBiZW5jaG1hcmsgb3V0cHV0IGNvbXBhcmUgdG9vbCcpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLWEnLAorICAgICAgICAnLS1kaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seScsCisgICAgICAgIGRlc3Q9J2Rpc3BsYXlfYWdncmVnYXRlc19vbmx5JywKKyAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgaGVscD0iSWYgdGhlcmUgYXJlIHJlcGV0aXRpb25zLCBieSBkZWZhdWx0LCB3ZSBkaXNwbGF5IGV2ZXJ5dGhpbmcgLSB0aGUiCisgICAgICAgICAgICAgIiBhY3R1YWwgcnVucywgYW5kIHRoZSBhZ2dyZWdhdGVzIGNvbXB1dGVkLiBTb21ldGltZXMsIGl0IGlzICIKKyAgICAgICAgICAgICAiZGVzaXJhYmxlIHRvIG9ubHkgdmlldyB0aGUgYWdncmVnYXRlcy4gRS5nLiB3aGVuIHRoZXJlIGFyZSBhIGxvdCAiCisgICAgICAgICAgICAgIm9mIHJlcGV0aXRpb25zLiBEbyBub3RlIHRoYXQgb25seSB0aGUgZGlzcGxheSBpcyBhZmZlY3RlZC4gIgorICAgICAgICAgICAgICJJbnRlcm5hbGx5LCBhbGwgdGhlIGFjdHVhbCBydW5zIGFyZSBzdGlsbCB1c2VkLCBlLmcuIGZvciBVIHRlc3QuIikKKworICAgIHV0ZXN0ID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgpCisgICAgdXRlc3QuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1uby11dGVzdCcsCisgICAgICAgIGRlc3Q9J3V0ZXN0JywKKyAgICAgICAgZGVmYXVsdD1UcnVlLAorICAgICAgICBhY3Rpb249InN0b3JlX2ZhbHNlIiwKKyAgICAgICAgaGVscD0iVGhlIHRvb2wgY2FuIGRvIGEgdHdvLXRhaWxlZCBNYW5uLVdoaXRuZXkgVSB0ZXN0IHdpdGggdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IGl0IGlzIGVxdWFsbHkgbGlrZWx5IHRoYXQgYSByYW5kb21seSBzZWxlY3RlZCB2YWx1ZSBmcm9tIG9uZSBzYW1wbGUgd2lsbCBiZSBsZXNzIHRoYW4gb3IgZ3JlYXRlciB0aGFuIGEgcmFuZG9tbHkgc2VsZWN0ZWQgdmFsdWUgZnJvbSBhIHNlY29uZCBzYW1wbGUuXG5XQVJOSU5HOiByZXF1aXJlcyAqKkxBUkdFKiogKG5vIGxlc3MgdGhhbiB7fSkgbnVtYmVyIG9mIHJlcGV0aXRpb25zIHRvIGJlIG1lYW5pbmdmdWwhXG5UaGUgdGVzdCBpcyBiZWluZyBkb25lIGJ5IGRlZmF1bHQsIGlmIGF0IGxlYXN0IHt9IHJlcGV0aXRpb25zIHdlcmUgZG9uZS5cblRoaXMgb3B0aW9uIGNhbiBkaXNhYmxlIHRoZSBVIFRlc3QuIi5mb3JtYXQocmVwb3J0LlVURVNUX09QVElNQUxfUkVQRVRJVElPTlMsIHJlcG9ydC5VVEVTVF9NSU5fUkVQRVRJVElPTlMpKQorICAgIGFscGhhX2RlZmF1bHQgPSAwLjA1CisgICAgdXRlc3QuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1hbHBoYSIsCisgICAgICAgIGRlc3Q9J3V0ZXN0X2FscGhhJywKKyAgICAgICAgZGVmYXVsdD1hbHBoYV9kZWZhdWx0LAorICAgICAgICB0eXBlPWZsb2F0LAorICAgICAgICBoZWxwPSgic2lnbmlmaWNhbmNlIGxldmVsIGFscGhhLiBpZiB0aGUgY2FsY3VsYXRlZCBwLXZhbHVlIGlzIGJlbG93IHRoaXMgdmFsdWUsIHRoZW4gdGhlIHJlc3VsdCBpcyBzYWlkIHRvIGJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYW5kIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgcmVqZWN0ZWQuXG4oZGVmYXVsdDogJTAuNGYpIikgJQorICAgICAgICBhbHBoYV9kZWZhdWx0KQorCisgICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2VycygKKyAgICAgICAgaGVscD0nVGhpcyB0b29sIGhhcyBtdWx0aXBsZSBtb2RlcyBvZiBvcGVyYXRpb246JywKKyAgICAgICAgZGVzdD0nbW9kZScpCisKKyAgICBwYXJzZXJfYSA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigKKyAgICAgICAgJ2JlbmNobWFya3MnLAorICAgICAgICBoZWxwPSdUaGUgbW9zdCBzaW1wbGUgdXNlLWNhc2UsIGNvbXBhcmUgYWxsIHRoZSBvdXRwdXQgb2YgdGhlc2UgdHdvIGJlbmNobWFya3MnKQorICAgIGJhc2VsaW5lID0gcGFyc2VyX2EuYWRkX2FyZ3VtZW50X2dyb3VwKAorICAgICAgICAnYmFzZWxpbmUnLCAnVGhlIGJlbmNobWFyayBiYXNlbGluZScpCisgICAgYmFzZWxpbmUuYWRkX2FyZ3VtZW50KAorICAgICAgICAndGVzdF9iYXNlbGluZScsCisgICAgICAgIG1ldGF2YXI9J3Rlc3RfYmFzZWxpbmUnLAorICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgIG5hcmdzPTEsCisgICAgICAgIGhlbHA9J0EgYmVuY2htYXJrIGV4ZWN1dGFibGUgb3IgSlNPTiBvdXRwdXQgZmlsZScpCisgICAgY29udGVuZGVyID0gcGFyc2VyX2EuYWRkX2FyZ3VtZW50X2dyb3VwKAorICAgICAgICAnY29udGVuZGVyJywgJ1RoZSBiZW5jaG1hcmsgdGhhdCB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlIGJhc2VsaW5lJykKKyAgICBjb250ZW5kZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAndGVzdF9jb250ZW5kZXInLAorICAgICAgICBtZXRhdmFyPSd0ZXN0X2NvbnRlbmRlcicsCisgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgbmFyZ3M9MSwKKyAgICAgICAgaGVscD0nQSBiZW5jaG1hcmsgZXhlY3V0YWJsZSBvciBKU09OIG91dHB1dCBmaWxlJykKKyAgICBwYXJzZXJfYS5hZGRfYXJndW1lbnQoCisgICAgICAgICdiZW5jaG1hcmtfb3B0aW9ucycsCisgICAgICAgIG1ldGF2YXI9J2JlbmNobWFya19vcHRpb25zJywKKyAgICAgICAgbmFyZ3M9YXJncGFyc2UuUkVNQUlOREVSLAorICAgICAgICBoZWxwPSdBcmd1bWVudHMgdG8gcGFzcyB3aGVuIHJ1bm5pbmcgYmVuY2htYXJrIGV4ZWN1dGFibGVzJykKKworICAgIHBhcnNlcl9iID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKAorICAgICAgICAnZmlsdGVycycsIGhlbHA9J0NvbXBhcmUgZmlsdGVyIG9uZSB3aXRoIHRoZSBmaWx0ZXIgdHdvIG9mIGJlbmNobWFyaycpCisgICAgYmFzZWxpbmUgPSBwYXJzZXJfYi5hZGRfYXJndW1lbnRfZ3JvdXAoCisgICAgICAgICdiYXNlbGluZScsICdUaGUgYmVuY2htYXJrIGJhc2VsaW5lJykKKyAgICBiYXNlbGluZS5hZGRfYXJndW1lbnQoCisgICAgICAgICd0ZXN0JywKKyAgICAgICAgbWV0YXZhcj0ndGVzdCcsCisgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgbmFyZ3M9MSwKKyAgICAgICAgaGVscD0nQSBiZW5jaG1hcmsgZXhlY3V0YWJsZSBvciBKU09OIG91dHB1dCBmaWxlJykKKyAgICBiYXNlbGluZS5hZGRfYXJndW1lbnQoCisgICAgICAgICdmaWx0ZXJfYmFzZWxpbmUnLAorICAgICAgICBtZXRhdmFyPSdmaWx0ZXJfYmFzZWxpbmUnLAorICAgICAgICB0eXBlPXN0ciwKKyAgICAgICAgbmFyZ3M9MSwKKyAgICAgICAgaGVscD0nVGhlIGZpcnN0IGZpbHRlciwgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYmFzZWxpbmUnKQorICAgIGNvbnRlbmRlciA9IHBhcnNlcl9iLmFkZF9hcmd1bWVudF9ncm91cCgKKyAgICAgICAgJ2NvbnRlbmRlcicsICdUaGUgYmVuY2htYXJrIHRoYXQgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBiYXNlbGluZScpCisgICAgY29udGVuZGVyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJ2ZpbHRlcl9jb250ZW5kZXInLAorICAgICAgICBtZXRhdmFyPSdmaWx0ZXJfY29udGVuZGVyJywKKyAgICAgICAgdHlwZT1zdHIsCisgICAgICAgIG5hcmdzPTEsCisgICAgICAgIGhlbHA9J1RoZSBzZWNvbmQgZmlsdGVyLCB0aGF0IHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgYmFzZWxpbmUnKQorICAgIHBhcnNlcl9iLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJ2JlbmNobWFya19vcHRpb25zJywKKyAgICAgICAgbWV0YXZhcj0nYmVuY2htYXJrX29wdGlvbnMnLAorICAgICAgICBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgIGhlbHA9J0FyZ3VtZW50cyB0byBwYXNzIHdoZW4gcnVubmluZyBiZW5jaG1hcmsgZXhlY3V0YWJsZXMnKQorCisgICAgcGFyc2VyX2MgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoCisgICAgICAgICdiZW5jaG1hcmtzZmlsdGVyZWQnLAorICAgICAgICBoZWxwPSdDb21wYXJlIGZpbHRlciBvbmUgb2YgZmlyc3QgYmVuY2htYXJrIHdpdGggZmlsdGVyIHR3byBvZiB0aGUgc2Vjb25kIGJlbmNobWFyaycpCisgICAgYmFzZWxpbmUgPSBwYXJzZXJfYy5hZGRfYXJndW1lbnRfZ3JvdXAoCisgICAgICAgICdiYXNlbGluZScsICdUaGUgYmVuY2htYXJrIGJhc2VsaW5lJykKKyAgICBiYXNlbGluZS5hZGRfYXJndW1lbnQoCisgICAgICAgICd0ZXN0X2Jhc2VsaW5lJywKKyAgICAgICAgbWV0YXZhcj0ndGVzdF9iYXNlbGluZScsCisgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgbmFyZ3M9MSwKKyAgICAgICAgaGVscD0nQSBiZW5jaG1hcmsgZXhlY3V0YWJsZSBvciBKU09OIG91dHB1dCBmaWxlJykKKyAgICBiYXNlbGluZS5hZGRfYXJndW1lbnQoCisgICAgICAgICdmaWx0ZXJfYmFzZWxpbmUnLAorICAgICAgICBtZXRhdmFyPSdmaWx0ZXJfYmFzZWxpbmUnLAorICAgICAgICB0eXBlPXN0ciwKKyAgICAgICAgbmFyZ3M9MSwKKyAgICAgICAgaGVscD0nVGhlIGZpcnN0IGZpbHRlciwgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYmFzZWxpbmUnKQorICAgIGNvbnRlbmRlciA9IHBhcnNlcl9jLmFkZF9hcmd1bWVudF9ncm91cCgKKyAgICAgICAgJ2NvbnRlbmRlcicsICdUaGUgYmVuY2htYXJrIHRoYXQgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBiYXNlbGluZScpCisgICAgY29udGVuZGVyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJ3Rlc3RfY29udGVuZGVyJywKKyAgICAgICAgbWV0YXZhcj0ndGVzdF9jb250ZW5kZXInLAorICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgIG5hcmdzPTEsCisgICAgICAgIGhlbHA9J1RoZSBzZWNvbmQgYmVuY2htYXJrIGV4ZWN1dGFibGUgb3IgSlNPTiBvdXRwdXQgZmlsZSwgdGhhdCB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlIGJhc2VsaW5lJykKKyAgICBjb250ZW5kZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnZmlsdGVyX2NvbnRlbmRlcicsCisgICAgICAgIG1ldGF2YXI9J2ZpbHRlcl9jb250ZW5kZXInLAorICAgICAgICB0eXBlPXN0ciwKKyAgICAgICAgbmFyZ3M9MSwKKyAgICAgICAgaGVscD0nVGhlIHNlY29uZCBmaWx0ZXIsIHRoYXQgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBiYXNlbGluZScpCisgICAgcGFyc2VyX2MuYWRkX2FyZ3VtZW50KAorICAgICAgICAnYmVuY2htYXJrX29wdGlvbnMnLAorICAgICAgICBtZXRhdmFyPSdiZW5jaG1hcmtfb3B0aW9ucycsCisgICAgICAgIG5hcmdzPWFyZ3BhcnNlLlJFTUFJTkRFUiwKKyAgICAgICAgaGVscD0nQXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBydW5uaW5nIGJlbmNobWFyayBleGVjdXRhYmxlcycpCisKKyAgICByZXR1cm4gcGFyc2VyCisKKworZGVmIG1haW4oKToKKyAgICAjIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZmxhZ3MKKyAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICBhcmdzLCB1bmtub3duX2FyZ3MgPSBwYXJzZXIucGFyc2Vfa25vd25fYXJncygpCisgICAgaWYgYXJncy5tb2RlIGlzIE5vbmU6CisgICAgICAgIHBhcnNlci5wcmludF9oZWxwKCkKKyAgICAgICAgZXhpdCgxKQorICAgIGFzc2VydCBub3QgdW5rbm93bl9hcmdzCisgICAgYmVuY2htYXJrX29wdGlvbnMgPSBhcmdzLmJlbmNobWFya19vcHRpb25zCisKKyAgICBpZiBhcmdzLm1vZGUgPT0gJ2JlbmNobWFya3MnOgorICAgICAgICB0ZXN0X2Jhc2VsaW5lID0gYXJncy50ZXN0X2Jhc2VsaW5lWzBdLm5hbWUKKyAgICAgICAgdGVzdF9jb250ZW5kZXIgPSBhcmdzLnRlc3RfY29udGVuZGVyWzBdLm5hbWUKKyAgICAgICAgZmlsdGVyX2Jhc2VsaW5lID0gJycKKyAgICAgICAgZmlsdGVyX2NvbnRlbmRlciA9ICcnCisKKyAgICAgICAgIyBOT1RFOiBpZiB0ZXN0X2Jhc2VsaW5lID09IHRlc3RfY29udGVuZGVyLCB5b3UgYXJlIGFuYWx5emluZyB0aGUgc3RkZXYKKworICAgICAgICBkZXNjcmlwdGlvbiA9ICdDb21wYXJpbmcgJXMgdG8gJXMnICUgKHRlc3RfYmFzZWxpbmUsIHRlc3RfY29udGVuZGVyKQorICAgIGVsaWYgYXJncy5tb2RlID09ICdmaWx0ZXJzJzoKKyAgICAgICAgdGVzdF9iYXNlbGluZSA9IGFyZ3MudGVzdFswXS5uYW1lCisgICAgICAgIHRlc3RfY29udGVuZGVyID0gYXJncy50ZXN0WzBdLm5hbWUKKyAgICAgICAgZmlsdGVyX2Jhc2VsaW5lID0gYXJncy5maWx0ZXJfYmFzZWxpbmVbMF0KKyAgICAgICAgZmlsdGVyX2NvbnRlbmRlciA9IGFyZ3MuZmlsdGVyX2NvbnRlbmRlclswXQorCisgICAgICAgICMgTk9URTogaWYgZmlsdGVyX2Jhc2VsaW5lID09IGZpbHRlcl9jb250ZW5kZXIsIHlvdSBhcmUgYW5hbHl6aW5nIHRoZQorICAgICAgICAjIHN0ZGV2CisKKyAgICAgICAgZGVzY3JpcHRpb24gPSAnQ29tcGFyaW5nICVzIHRvICVzIChmcm9tICVzKScgJSAoCisgICAgICAgICAgICBmaWx0ZXJfYmFzZWxpbmUsIGZpbHRlcl9jb250ZW5kZXIsIGFyZ3MudGVzdFswXS5uYW1lKQorICAgIGVsaWYgYXJncy5tb2RlID09ICdiZW5jaG1hcmtzZmlsdGVyZWQnOgorICAgICAgICB0ZXN0X2Jhc2VsaW5lID0gYXJncy50ZXN0X2Jhc2VsaW5lWzBdLm5hbWUKKyAgICAgICAgdGVzdF9jb250ZW5kZXIgPSBhcmdzLnRlc3RfY29udGVuZGVyWzBdLm5hbWUKKyAgICAgICAgZmlsdGVyX2Jhc2VsaW5lID0gYXJncy5maWx0ZXJfYmFzZWxpbmVbMF0KKyAgICAgICAgZmlsdGVyX2NvbnRlbmRlciA9IGFyZ3MuZmlsdGVyX2NvbnRlbmRlclswXQorCisgICAgICAgICMgTk9URTogaWYgdGVzdF9iYXNlbGluZSA9PSB0ZXN0X2NvbnRlbmRlciBhbmQKKyAgICAgICAgIyBmaWx0ZXJfYmFzZWxpbmUgPT0gZmlsdGVyX2NvbnRlbmRlciwgeW91IGFyZSBhbmFseXppbmcgdGhlIHN0ZGV2CisKKyAgICAgICAgZGVzY3JpcHRpb24gPSAnQ29tcGFyaW5nICVzIChmcm9tICVzKSB0byAlcyAoZnJvbSAlcyknICUgKAorICAgICAgICAgICAgZmlsdGVyX2Jhc2VsaW5lLCB0ZXN0X2Jhc2VsaW5lLCBmaWx0ZXJfY29udGVuZGVyLCB0ZXN0X2NvbnRlbmRlcikKKyAgICBlbHNlOgorICAgICAgICAjIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgcHJpbnQoIlVucmVjb2duaXplZCBtb2RlIG9mIG9wZXJhdGlvbjogJyVzJyIgJSBhcmdzLm1vZGUpCisgICAgICAgIHBhcnNlci5wcmludF9oZWxwKCkKKyAgICAgICAgZXhpdCgxKQorCisgICAgY2hlY2tfaW5wdXRzKHRlc3RfYmFzZWxpbmUsIHRlc3RfY29udGVuZGVyLCBiZW5jaG1hcmtfb3B0aW9ucykKKworICAgIGlmIGFyZ3MuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHk6CisgICAgICAgIGJlbmNobWFya19vcHRpb25zICs9IFsnLS1iZW5jaG1hcmtfZGlzcGxheV9hZ2dyZWdhdGVzX29ubHk9dHJ1ZSddCisKKyAgICBvcHRpb25zX2Jhc2VsaW5lID0gW10KKyAgICBvcHRpb25zX2NvbnRlbmRlciA9IFtdCisKKyAgICBpZiBmaWx0ZXJfYmFzZWxpbmUgYW5kIGZpbHRlcl9jb250ZW5kZXI6CisgICAgICAgIG9wdGlvbnNfYmFzZWxpbmUgPSBbJy0tYmVuY2htYXJrX2ZpbHRlcj0lcycgJSBmaWx0ZXJfYmFzZWxpbmVdCisgICAgICAgIG9wdGlvbnNfY29udGVuZGVyID0gWyctLWJlbmNobWFya19maWx0ZXI9JXMnICUgZmlsdGVyX2NvbnRlbmRlcl0KKworICAgICMgUnVuIHRoZSBiZW5jaG1hcmtzIGFuZCByZXBvcnQgdGhlIHJlc3VsdHMKKyAgICBqc29uMSA9IGpzb24xX29yaWcgPSBnYmVuY2gudXRpbC5ydW5fb3JfbG9hZF9iZW5jaG1hcmsoCisgICAgICAgIHRlc3RfYmFzZWxpbmUsIGJlbmNobWFya19vcHRpb25zICsgb3B0aW9uc19iYXNlbGluZSkKKyAgICBqc29uMiA9IGpzb24yX29yaWcgPSBnYmVuY2gudXRpbC5ydW5fb3JfbG9hZF9iZW5jaG1hcmsoCisgICAgICAgIHRlc3RfY29udGVuZGVyLCBiZW5jaG1hcmtfb3B0aW9ucyArIG9wdGlvbnNfY29udGVuZGVyKQorCisgICAgIyBOb3csIGZpbHRlciB0aGUgYmVuY2htYXJrcyBzbyB0aGF0IHRoZSBkaWZmZXJlbmNlIHJlcG9ydCBjYW4gd29yaworICAgIGlmIGZpbHRlcl9iYXNlbGluZSBhbmQgZmlsdGVyX2NvbnRlbmRlcjoKKyAgICAgICAgcmVwbGFjZW1lbnQgPSAnWyVzIHZzLiAlc10nICUgKGZpbHRlcl9iYXNlbGluZSwgZmlsdGVyX2NvbnRlbmRlcikKKyAgICAgICAganNvbjEgPSBnYmVuY2gucmVwb3J0LmZpbHRlcl9iZW5jaG1hcmsoCisgICAgICAgICAgICBqc29uMV9vcmlnLCBmaWx0ZXJfYmFzZWxpbmUsIHJlcGxhY2VtZW50KQorICAgICAgICBqc29uMiA9IGdiZW5jaC5yZXBvcnQuZmlsdGVyX2JlbmNobWFyaygKKyAgICAgICAgICAgIGpzb24yX29yaWcsIGZpbHRlcl9jb250ZW5kZXIsIHJlcGxhY2VtZW50KQorCisgICAgIyBEaWZmIGFuZCBvdXRwdXQKKyAgICBvdXRwdXRfbGluZXMgPSBnYmVuY2gucmVwb3J0LmdlbmVyYXRlX2RpZmZlcmVuY2VfcmVwb3J0KAorICAgICAgICBqc29uMSwganNvbjIsIGFyZ3MuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHksCisgICAgICAgIGFyZ3MudXRlc3QsIGFyZ3MudXRlc3RfYWxwaGEpCisgICAgcHJpbnQoZGVzY3JpcHRpb24pCisgICAgZm9yIGxuIGluIG91dHB1dF9saW5lczoKKyAgICAgICAgcHJpbnQobG4pCisKKworY2xhc3MgVGVzdFBhcnNlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICB0ZXN0SW5wdXRzID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKAorICAgICAgICAgICAgICAgIG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSwKKyAgICAgICAgICAgICdnYmVuY2gnLAorICAgICAgICAgICAgJ0lucHV0cycpCisgICAgICAgIHNlbGYudGVzdElucHV0MCA9IG9zLnBhdGguam9pbih0ZXN0SW5wdXRzLCAndGVzdDFfcnVuMS5qc29uJykKKyAgICAgICAgc2VsZi50ZXN0SW5wdXQxID0gb3MucGF0aC5qb2luKHRlc3RJbnB1dHMsICd0ZXN0MV9ydW4yLmpzb24nKQorCisgICAgZGVmIHRlc3RfYmVuY2htYXJrc19iYXNpYyhzZWxmKToKKyAgICAgICAgcGFyc2VkID0gc2VsZi5wYXJzZXIucGFyc2VfYXJncygKKyAgICAgICAgICAgIFsnYmVuY2htYXJrcycsIHNlbGYudGVzdElucHV0MCwgc2VsZi50ZXN0SW5wdXQxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZWQudXRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLm1vZGUsICdiZW5jaG1hcmtzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9iYXNlbGluZVswXS5uYW1lLCBzZWxmLnRlc3RJbnB1dDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLnRlc3RfY29udGVuZGVyWzBdLm5hbWUsIHNlbGYudGVzdElucHV0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuYmVuY2htYXJrX29wdGlvbnMpCisKKyAgICBkZWYgdGVzdF9iZW5jaG1hcmtzX2Jhc2ljX3dpdGhvdXRfdXRlc3Qoc2VsZik6CisgICAgICAgIHBhcnNlZCA9IHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoCisgICAgICAgICAgICBbJy0tbm8tdXRlc3QnLCAnYmVuY2htYXJrcycsIHNlbGYudGVzdElucHV0MCwgc2VsZi50ZXN0SW5wdXQxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFyc2VkLnV0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC51dGVzdF9hbHBoYSwgMC4wNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQubW9kZSwgJ2JlbmNobWFya3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC50ZXN0X2Jhc2VsaW5lWzBdLm5hbWUsIHNlbGYudGVzdElucHV0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9jb250ZW5kZXJbMF0ubmFtZSwgc2VsZi50ZXN0SW5wdXQxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhcnNlZC5iZW5jaG1hcmtfb3B0aW9ucykKKworICAgIGRlZiB0ZXN0X2JlbmNobWFya3NfYmFzaWNfZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkoc2VsZik6CisgICAgICAgIHBhcnNlZCA9IHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoCisgICAgICAgICAgICBbJy1hJywgJ2JlbmNobWFya3MnLCBzZWxmLnRlc3RJbnB1dDAsIHNlbGYudGVzdElucHV0MV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZWQuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZWQudXRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLm1vZGUsICdiZW5jaG1hcmtzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9iYXNlbGluZVswXS5uYW1lLCBzZWxmLnRlc3RJbnB1dDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLnRlc3RfY29udGVuZGVyWzBdLm5hbWUsIHNlbGYudGVzdElucHV0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuYmVuY2htYXJrX29wdGlvbnMpCisKKyAgICBkZWYgdGVzdF9iZW5jaG1hcmtzX2Jhc2ljX3dpdGhfdXRlc3RfYWxwaGEoc2VsZik6CisgICAgICAgIHBhcnNlZCA9IHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoCisgICAgICAgICAgICBbJy0tYWxwaGE9MC4zMTQnLCAnYmVuY2htYXJrcycsIHNlbGYudGVzdElucHV0MCwgc2VsZi50ZXN0SW5wdXQxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZWQudXRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLnV0ZXN0X2FscGhhLCAwLjMxNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQubW9kZSwgJ2JlbmNobWFya3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC50ZXN0X2Jhc2VsaW5lWzBdLm5hbWUsIHNlbGYudGVzdElucHV0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9jb250ZW5kZXJbMF0ubmFtZSwgc2VsZi50ZXN0SW5wdXQxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhcnNlZC5iZW5jaG1hcmtfb3B0aW9ucykKKworICAgIGRlZiB0ZXN0X2JlbmNobWFya3NfYmFzaWNfd2l0aG91dF91dGVzdF93aXRoX3V0ZXN0X2FscGhhKHNlbGYpOgorICAgICAgICBwYXJzZWQgPSBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKAorICAgICAgICAgICAgWyctLW5vLXV0ZXN0JywgJy0tYWxwaGE9MC4zMTQnLCAnYmVuY2htYXJrcycsIHNlbGYudGVzdElucHV0MCwgc2VsZi50ZXN0SW5wdXQxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFyc2VkLnV0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC51dGVzdF9hbHBoYSwgMC4zMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLm1vZGUsICdiZW5jaG1hcmtzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9iYXNlbGluZVswXS5uYW1lLCBzZWxmLnRlc3RJbnB1dDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLnRlc3RfY29udGVuZGVyWzBdLm5hbWUsIHNlbGYudGVzdElucHV0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuYmVuY2htYXJrX29wdGlvbnMpCisKKyAgICBkZWYgdGVzdF9iZW5jaG1hcmtzX3dpdGhfcmVtYWluZGVyKHNlbGYpOgorICAgICAgICBwYXJzZWQgPSBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKAorICAgICAgICAgICAgWydiZW5jaG1hcmtzJywgc2VsZi50ZXN0SW5wdXQwLCBzZWxmLnRlc3RJbnB1dDEsICdkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFyc2VkLmRpc3BsYXlfYWdncmVnYXRlc19vbmx5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGFyc2VkLnV0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC5tb2RlLCAnYmVuY2htYXJrcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLnRlc3RfYmFzZWxpbmVbMF0ubmFtZSwgc2VsZi50ZXN0SW5wdXQwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC50ZXN0X2NvbnRlbmRlclswXS5uYW1lLCBzZWxmLnRlc3RJbnB1dDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLmJlbmNobWFya19vcHRpb25zLCBbJ2QnXSkKKworICAgIGRlZiB0ZXN0X2JlbmNobWFya3Nfd2l0aF9yZW1haW5kZXJfYWZ0ZXJfZG91YmxlbWludXMoc2VsZik6CisgICAgICAgIHBhcnNlZCA9IHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoCisgICAgICAgICAgICBbJ2JlbmNobWFya3MnLCBzZWxmLnRlc3RJbnB1dDAsIHNlbGYudGVzdElucHV0MSwgJy0tJywgJ2UnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZWQudXRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLm1vZGUsICdiZW5jaG1hcmtzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9iYXNlbGluZVswXS5uYW1lLCBzZWxmLnRlc3RJbnB1dDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLnRlc3RfY29udGVuZGVyWzBdLm5hbWUsIHNlbGYudGVzdElucHV0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQuYmVuY2htYXJrX29wdGlvbnMsIFsnZSddKQorCisgICAgZGVmIHRlc3RfZmlsdGVyc19iYXNpYyhzZWxmKToKKyAgICAgICAgcGFyc2VkID0gc2VsZi5wYXJzZXIucGFyc2VfYXJncygKKyAgICAgICAgICAgIFsnZmlsdGVycycsIHNlbGYudGVzdElucHV0MCwgJ2MnLCAnZCddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhcnNlZC5kaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnNlZC51dGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQubW9kZSwgJ2ZpbHRlcnMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC50ZXN0WzBdLm5hbWUsIHNlbGYudGVzdElucHV0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQuZmlsdGVyX2Jhc2VsaW5lWzBdLCAnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLmZpbHRlcl9jb250ZW5kZXJbMF0sICdkJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuYmVuY2htYXJrX29wdGlvbnMpCisKKyAgICBkZWYgdGVzdF9maWx0ZXJzX3dpdGhfcmVtYWluZGVyKHNlbGYpOgorICAgICAgICBwYXJzZWQgPSBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKAorICAgICAgICAgICAgWydmaWx0ZXJzJywgc2VsZi50ZXN0SW5wdXQwLCAnYycsICdkJywgJ2UnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZWQuZGlzcGxheV9hZ2dyZWdhdGVzX29ubHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZWQudXRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLm1vZGUsICdmaWx0ZXJzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdFswXS5uYW1lLCBzZWxmLnRlc3RJbnB1dDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLmZpbHRlcl9iYXNlbGluZVswXSwgJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC5maWx0ZXJfY29udGVuZGVyWzBdLCAnZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLmJlbmNobWFya19vcHRpb25zLCBbJ2UnXSkKKworICAgIGRlZiB0ZXN0X2ZpbHRlcnNfd2l0aF9yZW1haW5kZXJfYWZ0ZXJfZG91YmxlbWludXMoc2VsZik6CisgICAgICAgIHBhcnNlZCA9IHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoCisgICAgICAgICAgICBbJ2ZpbHRlcnMnLCBzZWxmLnRlc3RJbnB1dDAsICdjJywgJ2QnLCAnLS0nLCAnZiddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhcnNlZC5kaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnNlZC51dGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQubW9kZSwgJ2ZpbHRlcnMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC50ZXN0WzBdLm5hbWUsIHNlbGYudGVzdElucHV0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQuZmlsdGVyX2Jhc2VsaW5lWzBdLCAnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLmZpbHRlcl9jb250ZW5kZXJbMF0sICdkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQuYmVuY2htYXJrX29wdGlvbnMsIFsnZiddKQorCisgICAgZGVmIHRlc3RfYmVuY2htYXJrc2ZpbHRlcmVkX2Jhc2ljKHNlbGYpOgorICAgICAgICBwYXJzZWQgPSBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKAorICAgICAgICAgICAgWydiZW5jaG1hcmtzZmlsdGVyZWQnLCBzZWxmLnRlc3RJbnB1dDAsICdjJywgc2VsZi50ZXN0SW5wdXQxLCAnZSddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhcnNlZC5kaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnNlZC51dGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQubW9kZSwgJ2JlbmNobWFya3NmaWx0ZXJlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLnRlc3RfYmFzZWxpbmVbMF0ubmFtZSwgc2VsZi50ZXN0SW5wdXQwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC5maWx0ZXJfYmFzZWxpbmVbMF0sICdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9jb250ZW5kZXJbMF0ubmFtZSwgc2VsZi50ZXN0SW5wdXQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC5maWx0ZXJfY29udGVuZGVyWzBdLCAnZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFyc2VkLmJlbmNobWFya19vcHRpb25zKQorCisgICAgZGVmIHRlc3RfYmVuY2htYXJrc2ZpbHRlcmVkX3dpdGhfcmVtYWluZGVyKHNlbGYpOgorICAgICAgICBwYXJzZWQgPSBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKAorICAgICAgICAgICAgWydiZW5jaG1hcmtzZmlsdGVyZWQnLCBzZWxmLnRlc3RJbnB1dDAsICdjJywgc2VsZi50ZXN0SW5wdXQxLCAnZScsICdmJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFyc2VkLmRpc3BsYXlfYWdncmVnYXRlc19vbmx5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGFyc2VkLnV0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC5tb2RlLCAnYmVuY2htYXJrc2ZpbHRlcmVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9iYXNlbGluZVswXS5uYW1lLCBzZWxmLnRlc3RJbnB1dDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLmZpbHRlcl9iYXNlbGluZVswXSwgJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC50ZXN0X2NvbnRlbmRlclswXS5uYW1lLCBzZWxmLnRlc3RJbnB1dDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLmZpbHRlcl9jb250ZW5kZXJbMF0sICdlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQuYmVuY2htYXJrX29wdGlvbnNbMF0sICdmJykKKworICAgIGRlZiB0ZXN0X2JlbmNobWFya3NmaWx0ZXJlZF93aXRoX3JlbWFpbmRlcl9hZnRlcl9kb3VibGVtaW51cyhzZWxmKToKKyAgICAgICAgcGFyc2VkID0gc2VsZi5wYXJzZXIucGFyc2VfYXJncygKKyAgICAgICAgICAgIFsnYmVuY2htYXJrc2ZpbHRlcmVkJywgc2VsZi50ZXN0SW5wdXQwLCAnYycsIHNlbGYudGVzdElucHV0MSwgJ2UnLCAnLS0nLCAnZyddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhcnNlZC5kaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnNlZC51dGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQubW9kZSwgJ2JlbmNobWFya3NmaWx0ZXJlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLnRlc3RfYmFzZWxpbmVbMF0ubmFtZSwgc2VsZi50ZXN0SW5wdXQwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC5maWx0ZXJfYmFzZWxpbmVbMF0sICdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWQudGVzdF9jb250ZW5kZXJbMF0ubmFtZSwgc2VsZi50ZXN0SW5wdXQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZC5maWx0ZXJfY29udGVuZGVyWzBdLCAnZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkLmJlbmNobWFya19vcHRpb25zWzBdLCAnZycpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjIHVuaXR0ZXN0Lm1haW4oKQorICAgIG1haW4oKQorCisjIHZpbTogdGFic3RvcD00IGV4cGFuZHRhYiBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NAorIyBrYXRlOiB0YWItd2lkdGg6IDQ7IHJlcGxhY2UtdGFicyBvbjsgaW5kZW50LXdpZHRoIDQ7IHRhYi1pbmRlbnRzOiBvZmY7CisjIGthdGU6IGluZGVudC1tb2RlIHB5dGhvbjsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlcyBtb2RpZmllZDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9JbnB1dHMvdGVzdDFfcnVuMS5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvZ2JlbmNoL0lucHV0cy90ZXN0MV9ydW4xLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxZTMyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9JbnB1dHMvdGVzdDFfcnVuMS5qc29uCkBAIC0wLDAgKzEsMTE5IEBACit7CisgICJjb250ZXh0IjogeworICAgICJkYXRlIjogIjIwMTYtMDgtMDIgMTc6NDQ6NDYiLAorICAgICJudW1fY3B1cyI6IDQsCisgICAgIm1oel9wZXJfY3B1IjogNDIyOCwKKyAgICAiY3B1X3NjYWxpbmdfZW5hYmxlZCI6IGZhbHNlLAorICAgICJsaWJyYXJ5X2J1aWxkX3R5cGUiOiAicmVsZWFzZSIKKyAgfSwKKyAgImJlbmNobWFya3MiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fU2FtZVRpbWVzIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAxMCwKKyAgICAgICJjcHVfdGltZSI6IDEwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNXzJ4RmFzdGVyIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA1MCwKKyAgICAgICJjcHVfdGltZSI6IDUwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNXzJ4U2xvd2VyIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA1MCwKKyAgICAgICJjcHVfdGltZSI6IDUwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNXzFQZXJjZW50RmFzdGVyIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAxMDAsCisgICAgICAiY3B1X3RpbWUiOiAxMDAsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fMVBlcmNlbnRTbG93ZXIiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDEwMCwKKyAgICAgICJjcHVfdGltZSI6IDEwMCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV8xMFBlcmNlbnRGYXN0ZXIiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDEwMCwKKyAgICAgICJjcHVfdGltZSI6IDEwMCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV8xMFBlcmNlbnRTbG93ZXIiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDEwMCwKKyAgICAgICJjcHVfdGltZSI6IDEwMCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV8xMDB4U2xvd2VyIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAxMDAsCisgICAgICAiY3B1X3RpbWUiOiAxMDAsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fMTAweEZhc3RlciIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMTAwMDAsCisgICAgICAiY3B1X3RpbWUiOiAxMDAwMCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV8xMFBlcmNlbnRDUFVUb1RpbWUiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDEwMCwKKyAgICAgICJjcHVfdGltZSI6IDEwMCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV9UaGlyZEZhc3RlciIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMTAwLAorICAgICAgImNwdV90aW1lIjogMTAwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIk15Q29tcGxleGl0eVRlc3RfQmlnTyIsCisgICAgICAicnVuX25hbWUiOiAiTXlDb21wbGV4aXR5VGVzdCIsCisgICAgICAicnVuX3R5cGUiOiAiYWdncmVnYXRlIiwKKyAgICAgICJhZ2dyZWdhdGVfbmFtZSI6ICJCaWdPIiwKKyAgICAgICJjcHVfY29lZmZpY2llbnQiOiA0LjI3NDk4NTYyOTQ1OTI4ODZlKzAwLAorICAgICAgInJlYWxfY29lZmZpY2llbnQiOiA2LjQ3ODkyNzUyODk3ODk3ODBlKzAwLAorICAgICAgImJpZ19vIjogIk4iLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIk15Q29tcGxleGl0eVRlc3RfUk1TIiwKKyAgICAgICJydW5fbmFtZSI6ICJNeUNvbXBsZXhpdHlUZXN0IiwKKyAgICAgICJydW5fdHlwZSI6ICJhZ2dyZWdhdGUiLAorICAgICAgImFnZ3JlZ2F0ZV9uYW1lIjogIlJNUyIsCisgICAgICAicm1zIjogNC41MDk3ODAyNTEyNDcyODc0ZS0wMworICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fTm90QmFkVGltZVVuaXQiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDAuNCwKKyAgICAgICJjcHVfdGltZSI6IDAuNSwKKyAgICAgICJ0aW1lX3VuaXQiOiAicyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNX0RpZmZlcmVudFRpbWVVbml0IiwKKyAgICAgICJpdGVyYXRpb25zIjogMSwKKyAgICAgICJyZWFsX3RpbWUiOiAxLAorICAgICAgImNwdV90aW1lIjogMSwKKyAgICAgICJ0aW1lX3VuaXQiOiAicyIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9JbnB1dHMvdGVzdDFfcnVuMi5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvZ2JlbmNoL0lucHV0cy90ZXN0MV9ydW4yLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiY2YzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9JbnB1dHMvdGVzdDFfcnVuMi5qc29uCkBAIC0wLDAgKzEsMTE5IEBACit7CisgICJjb250ZXh0IjogeworICAgICJkYXRlIjogIjIwMTYtMDgtMDIgMTc6NDQ6NDYiLAorICAgICJudW1fY3B1cyI6IDQsCisgICAgIm1oel9wZXJfY3B1IjogNDIyOCwKKyAgICAiY3B1X3NjYWxpbmdfZW5hYmxlZCI6IGZhbHNlLAorICAgICJsaWJyYXJ5X2J1aWxkX3R5cGUiOiAicmVsZWFzZSIKKyAgfSwKKyAgImJlbmNobWFya3MiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fU2FtZVRpbWVzIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAxMCwKKyAgICAgICJjcHVfdGltZSI6IDEwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNXzJ4RmFzdGVyIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAyNSwKKyAgICAgICJjcHVfdGltZSI6IDI1LAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNXzJ4U2xvd2VyIiwKKyAgICAgICJpdGVyYXRpb25zIjogMjA4MzMzMzMsCisgICAgICAicmVhbF90aW1lIjogMTAwLAorICAgICAgImNwdV90aW1lIjogMTAwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNXzFQZXJjZW50RmFzdGVyIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA5OC45OTk5OTk5LAorICAgICAgImNwdV90aW1lIjogOTguOTk5OTk5OSwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV8xUGVyY2VudFNsb3dlciIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMTAwLjk5OTk5OTksCisgICAgICAiY3B1X3RpbWUiOiAxMDAuOTk5OTk5OSwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV8xMFBlcmNlbnRGYXN0ZXIiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDkwLAorICAgICAgImNwdV90aW1lIjogOTAsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fMTBQZXJjZW50U2xvd2VyIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAxMTAsCisgICAgICAiY3B1X3RpbWUiOiAxMTAsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fMTAweFNsb3dlciIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMS4wMDAwZSswNCwKKyAgICAgICJjcHVfdGltZSI6IDEuMDAwMGUrMDQsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fMTAweEZhc3RlciIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMTAwLAorICAgICAgImNwdV90aW1lIjogMTAwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNXzEwUGVyY2VudENQVVRvVGltZSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMTEwLAorICAgICAgImNwdV90aW1lIjogOTAsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fVGhpcmRGYXN0ZXIiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDY2LjY2NSwKKyAgICAgICJjcHVfdGltZSI6IDY2LjY2NCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJNeUNvbXBsZXhpdHlUZXN0X0JpZ08iLAorICAgICAgInJ1bl9uYW1lIjogIk15Q29tcGxleGl0eVRlc3QiLAorICAgICAgInJ1bl90eXBlIjogImFnZ3JlZ2F0ZSIsCisgICAgICAiYWdncmVnYXRlX25hbWUiOiAiQmlnTyIsCisgICAgICAiY3B1X2NvZWZmaWNpZW50IjogNS42MjE1Nzc5NTk0MzYxNDg2ZSswMCwKKyAgICAgICJyZWFsX2NvZWZmaWNpZW50IjogNS42Mjg4MzE0NzkzNTU0NjEwZSswMCwKKyAgICAgICJiaWdfbyI6ICJOIiwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJNeUNvbXBsZXhpdHlUZXN0X1JNUyIsCisgICAgICAicnVuX25hbWUiOiAiTXlDb21wbGV4aXR5VGVzdCIsCisgICAgICAicnVuX3R5cGUiOiAiYWdncmVnYXRlIiwKKyAgICAgICJhZ2dyZWdhdGVfbmFtZSI6ICJSTVMiLAorICAgICAgInJtcyI6IDMuMzEyODkwMTg1MjM0MjE3NGUtMDMKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNX05vdEJhZFRpbWVVbml0IiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAwLjA0LAorICAgICAgImNwdV90aW1lIjogMC42LAorICAgICAgInRpbWVfdW5pdCI6ICJzIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fRGlmZmVyZW50VGltZVVuaXQiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxLAorICAgICAgInJlYWxfdGltZSI6IDEsCisgICAgICAiY3B1X3RpbWUiOiAxLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9JbnB1dHMvdGVzdDJfcnVuLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9nYmVuY2gvSW5wdXRzL3Rlc3QyX3J1bi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmM2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9nYmVuY2gvSW5wdXRzL3Rlc3QyX3J1bi5qc29uCkBAIC0wLDAgKzEsODEgQEAKK3sKKyAgImNvbnRleHQiOiB7CisgICAgImRhdGUiOiAiMjAxNi0wOC0wMiAxNzo0NDo0NiIsCisgICAgIm51bV9jcHVzIjogNCwKKyAgICAibWh6X3Blcl9jcHUiOiA0MjI4LAorICAgICJjcHVfc2NhbGluZ19lbmFibGVkIjogZmFsc2UsCisgICAgImxpYnJhcnlfYnVpbGRfdHlwZSI6ICJyZWxlYXNlIgorICB9LAorICAiYmVuY2htYXJrcyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV9IaSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEyMzQsCisgICAgICAicmVhbF90aW1lIjogNDIsCisgICAgICAiY3B1X3RpbWUiOiAyNCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibXMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV9aZXJvIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAxMCwKKyAgICAgICJjcHVfdGltZSI6IDEwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNX1plcm8vNCIsCisgICAgICAiaXRlcmF0aW9ucyI6IDQwMDAsCisgICAgICAicmVhbF90aW1lIjogNDAsCisgICAgICAiY3B1X3RpbWUiOiA0MCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJQcmVmaXgvQk1fWmVybyIsCisgICAgICAiaXRlcmF0aW9ucyI6IDIwMDAsCisgICAgICAicmVhbF90aW1lIjogMjAsCisgICAgICAiY3B1X3RpbWUiOiAyMCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJQcmVmaXgvQk1fWmVyby8zIiwKKyAgICAgICJpdGVyYXRpb25zIjogMzAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiAzMCwKKyAgICAgICJjcHVfdGltZSI6IDMwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNX09uZSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDUwMDAsCisgICAgICAicmVhbF90aW1lIjogNSwKKyAgICAgICJjcHVfdGltZSI6IDUsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fT25lLzQiLAorICAgICAgIml0ZXJhdGlvbnMiOiAyMDAwLAorICAgICAgInJlYWxfdGltZSI6IDIwLAorICAgICAgImNwdV90aW1lIjogMjAsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiUHJlZml4L0JNX09uZSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMTAsCisgICAgICAiY3B1X3RpbWUiOiAxMCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJQcmVmaXgvQk1fT25lLzMiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxNTAwLAorICAgICAgInJlYWxfdGltZSI6IDE1LAorICAgICAgImNwdV90aW1lIjogMTUsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fQnllIiwKKyAgICAgICJpdGVyYXRpb25zIjogNTMyMSwKKyAgICAgICJyZWFsX3RpbWUiOiAxMSwKKyAgICAgICJjcHVfdGltZSI6IDYzLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9JbnB1dHMvdGVzdDNfcnVuMC5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvZ2JlbmNoL0lucHV0cy90ZXN0M19ydW4wLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmOGIwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9JbnB1dHMvdGVzdDNfcnVuMC5qc29uCkBAIC0wLDAgKzEsNjUgQEAKK3sKKyAgImNvbnRleHQiOiB7CisgICAgImRhdGUiOiAiMjAxNi0wOC0wMiAxNzo0NDo0NiIsCisgICAgIm51bV9jcHVzIjogNCwKKyAgICAibWh6X3Blcl9jcHUiOiA0MjI4LAorICAgICJjcHVfc2NhbGluZ19lbmFibGVkIjogZmFsc2UsCisgICAgImxpYnJhcnlfYnVpbGRfdHlwZSI6ICJyZWxlYXNlIgorICB9LAorICAiYmVuY2htYXJrcyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV9PbmUiLAorICAgICAgInJ1bl90eXBlIjogImFnZ3JlZ2F0ZSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMTAsCisgICAgICAiY3B1X3RpbWUiOiAxMDAsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fVHdvIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA5LAorICAgICAgImNwdV90aW1lIjogOTAsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fVHdvIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA4LAorICAgICAgImNwdV90aW1lIjogODYsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAic2hvcnQiLAorICAgICAgInJ1bl90eXBlIjogImFnZ3JlZ2F0ZSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogOCwKKyAgICAgICJjcHVfdGltZSI6IDgwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogInNob3J0IiwKKyAgICAgICJydW5fdHlwZSI6ICJhZ2dyZWdhdGUiLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDgsCisgICAgICAiY3B1X3RpbWUiOiA3NywKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJtZWRpdW0iLAorICAgICAgInJ1bl90eXBlIjogIml0ZXJhdGlvbiIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogOCwKKyAgICAgICJjcHVfdGltZSI6IDgwLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIm1lZGl1bSIsCisgICAgICAicnVuX3R5cGUiOiAiaXRlcmF0aW9uIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA5LAorICAgICAgImNwdV90aW1lIjogODIsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvZ2JlbmNoL0lucHV0cy90ZXN0M19ydW4xLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9nYmVuY2gvSW5wdXRzL3Rlc3QzX3J1bjEuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M1YmExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvZ2JlbmNoL0lucHV0cy90ZXN0M19ydW4xLmpzb24KQEAgLTAsMCArMSw2NSBAQAoreworICAiY29udGV4dCI6IHsKKyAgICAiZGF0ZSI6ICIyMDE2LTA4LTAyIDE3OjQ0OjQ2IiwKKyAgICAibnVtX2NwdXMiOiA0LAorICAgICJtaHpfcGVyX2NwdSI6IDQyMjgsCisgICAgImNwdV9zY2FsaW5nX2VuYWJsZWQiOiBmYWxzZSwKKyAgICAibGlicmFyeV9idWlsZF90eXBlIjogInJlbGVhc2UiCisgIH0sCisgICJiZW5jaG1hcmtzIjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkJNX09uZSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogOSwKKyAgICAgICJjcHVfdGltZSI6IDExMCwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV9Ud28iLAorICAgICAgInJ1bl90eXBlIjogImFnZ3JlZ2F0ZSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDEwMDAsCisgICAgICAicmVhbF90aW1lIjogMTAsCisgICAgICAiY3B1X3RpbWUiOiA4OSwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJCTV9Ud28iLAorICAgICAgIml0ZXJhdGlvbnMiOiAxMDAwLAorICAgICAgInJlYWxfdGltZSI6IDcsCisgICAgICAiY3B1X3RpbWUiOiA3MiwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJzaG9ydCIsCisgICAgICAicnVuX3R5cGUiOiAiYWdncmVnYXRlIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA3LAorICAgICAgImNwdV90aW1lIjogNzUsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAic2hvcnQiLAorICAgICAgInJ1bl90eXBlIjogImFnZ3JlZ2F0ZSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDc2MiwKKyAgICAgICJyZWFsX3RpbWUiOiA0LjU0LAorICAgICAgImNwdV90aW1lIjogNjYuNiwKKyAgICAgICJ0aW1lX3VuaXQiOiAibnMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJzaG9ydCIsCisgICAgICAicnVuX3R5cGUiOiAiaXRlcmF0aW9uIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTAwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA4MDAsCisgICAgICAiY3B1X3RpbWUiOiAxLAorICAgICAgInRpbWVfdW5pdCI6ICJucyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIm1lZGl1bSIsCisgICAgICAicnVuX3R5cGUiOiAiaXRlcmF0aW9uIiwKKyAgICAgICJpdGVyYXRpb25zIjogMTIwMCwKKyAgICAgICJyZWFsX3RpbWUiOiA1LAorICAgICAgImNwdV90aW1lIjogNTMsCisgICAgICAidGltZV91bml0IjogIm5zIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvZ2JlbmNoL19faW5pdF9fLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvZ2JlbmNoL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTFhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9nYmVuY2gvX19pbml0X18ucHkKQEAgLTAsMCArMSw4IEBACisiIiJHb29nbGUgQmVuY2htYXJrIHRvb2xpbmciIiIKKworX19hdXRob3JfXyA9ICdFcmljIEZpc2VsaWVyJworX19lbWFpbF9fID0gJ2VyaWNAZWZjcy5jYScKK19fdmVyc2lvbmluZm9fXyA9ICgwLCA1LCAwKQorX192ZXJzaW9uX18gPSAnLicuam9pbihzdHIodikgZm9yIHYgaW4gX192ZXJzaW9uaW5mb19fKSArICdkZXYnCisKK19fYWxsX18gPSBbXQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvZ2JlbmNoL3JlcG9ydC5weSBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9yZXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkM2E4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC9yZXBvcnQucHkKQEAgLTAsMCArMSw1NDEgQEAKK2ltcG9ydCB1bml0dGVzdAorIiIicmVwb3J0LnB5IC0gVXRpbGl0aWVzIGZvciByZXBvcnRpbmcgc3RhdGlzdGljcyBhYm91dCBiZW5jaG1hcmsgcmVzdWx0cworIiIiCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IGNvcHkKKworZnJvbSBzY2lweS5zdGF0cyBpbXBvcnQgbWFubndoaXRuZXl1CisKKworY2xhc3MgQmVuY2htYXJrQ29sb3Iob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgY29kZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5jb2RlID0gY29kZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzJXInICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLm5hbWUsIHNlbGYuY29kZSkpCisKKyAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXQpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2RlCisKKworIyBCZW5jaG1hcmsgQ29sb3JzIEVudW1lcmF0aW9uCitCQ19OT05FID0gQmVuY2htYXJrQ29sb3IoJ05PTkUnLCAnJykKK0JDX01BR0VOVEEgPSBCZW5jaG1hcmtDb2xvcignTUFHRU5UQScsICdcMDMzWzk1bScpCitCQ19DWUFOID0gQmVuY2htYXJrQ29sb3IoJ0NZQU4nLCAnXDAzM1s5Nm0nKQorQkNfT0tCTFVFID0gQmVuY2htYXJrQ29sb3IoJ09LQkxVRScsICdcMDMzWzk0bScpCitCQ19PS0dSRUVOID0gQmVuY2htYXJrQ29sb3IoJ09LR1JFRU4nLCAnXDAzM1szMm0nKQorQkNfSEVBREVSID0gQmVuY2htYXJrQ29sb3IoJ0hFQURFUicsICdcMDMzWzkybScpCitCQ19XQVJOSU5HID0gQmVuY2htYXJrQ29sb3IoJ1dBUk5JTkcnLCAnXDAzM1s5M20nKQorQkNfV0hJVEUgPSBCZW5jaG1hcmtDb2xvcignV0hJVEUnLCAnXDAzM1s5N20nKQorQkNfRkFJTCA9IEJlbmNobWFya0NvbG9yKCdGQUlMJywgJ1wwMzNbOTFtJykKK0JDX0VOREMgPSBCZW5jaG1hcmtDb2xvcignRU5EQycsICdcMDMzWzBtJykKK0JDX0JPTEQgPSBCZW5jaG1hcmtDb2xvcignQk9MRCcsICdcMDMzWzFtJykKK0JDX1VOREVSTElORSA9IEJlbmNobWFya0NvbG9yKCdVTkRFUkxJTkUnLCAnXDAzM1s0bScpCisKK1VURVNUX01JTl9SRVBFVElUSU9OUyA9IDIKK1VURVNUX09QVElNQUxfUkVQRVRJVElPTlMgPSA5ICAjIExvd2VzdCByZWFzb25hYmxlIG51bWJlciwgTW9yZSBpcyBiZXR0ZXIuCitVVEVTVF9DT0xfTkFNRSA9ICJfcHZhbHVlIgorCisKK2RlZiBjb2xvcl9mb3JtYXQodXNlX2NvbG9yLCBmbXRfc3RyLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgcmVzdWx0IG9mICdmbXRfc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpJyBhZnRlciB0cmFuc2Zvcm1pbmcKKyAgICAnYXJncycgYW5kICdrd2FyZ3MnIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgJ3VzZV9jb2xvcicuIElmICd1c2VfY29sb3InCisgICAgaXMgRmFsc2UgdGhlbiBhbGwgY29sb3IgY29kZXMgaW4gJ2FyZ3MnIGFuZCAna3dhcmdzJyBhcmUgcmVwbGFjZWQgd2l0aAorICAgIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgIiIiCisgICAgYXNzZXJ0IHVzZV9jb2xvciBpcyBUcnVlIG9yIHVzZV9jb2xvciBpcyBGYWxzZQorICAgIGlmIG5vdCB1c2VfY29sb3I6CisgICAgICAgIGFyZ3MgPSBbYXJnIGlmIG5vdCBpc2luc3RhbmNlKGFyZywgQmVuY2htYXJrQ29sb3IpIGVsc2UgQkNfTk9ORQorICAgICAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnc10KKyAgICAgICAga3dhcmdzID0ge2tleTogYXJnIGlmIG5vdCBpc2luc3RhbmNlKGFyZywgQmVuY2htYXJrQ29sb3IpIGVsc2UgQkNfTk9ORQorICAgICAgICAgICAgICAgICAgZm9yIGtleSwgYXJnIGluIGt3YXJncy5pdGVtcygpfQorICAgIHJldHVybiBmbXRfc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpCisKKworZGVmIGZpbmRfbG9uZ2VzdF9uYW1lKGJlbmNobWFya19saXN0KToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBiZW5jaG1hcmsgbmFtZSBpbiBhIGdpdmVuIGxpc3Qgb2YKKyAgICBiZW5jaG1hcmsgSlNPTiBvYmplY3RzCisgICAgIiIiCisgICAgbG9uZ2VzdF9uYW1lID0gMQorICAgIGZvciBiYyBpbiBiZW5jaG1hcmtfbGlzdDoKKyAgICAgICAgaWYgbGVuKGJjWyduYW1lJ10pID4gbG9uZ2VzdF9uYW1lOgorICAgICAgICAgICAgbG9uZ2VzdF9uYW1lID0gbGVuKGJjWyduYW1lJ10pCisgICAgcmV0dXJuIGxvbmdlc3RfbmFtZQorCisKK2RlZiBjYWxjdWxhdGVfY2hhbmdlKG9sZF92YWwsIG5ld192YWwpOgorICAgICIiIgorICAgIFJldHVybiBhIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgZGVjaW1hbCBjaGFuZ2UgYmV0d2VlbiBvbGRfdmFsIGFuZCBuZXdfdmFsLgorICAgICIiIgorICAgIGlmIG9sZF92YWwgPT0gMCBhbmQgbmV3X3ZhbCA9PSAwOgorICAgICAgICByZXR1cm4gMC4wCisgICAgaWYgb2xkX3ZhbCA9PSAwOgorICAgICAgICByZXR1cm4gZmxvYXQobmV3X3ZhbCAtIG9sZF92YWwpIC8gKGZsb2F0KG9sZF92YWwgKyBuZXdfdmFsKSAvIDIpCisgICAgcmV0dXJuIGZsb2F0KG5ld192YWwgLSBvbGRfdmFsKSAvIGFicyhvbGRfdmFsKQorCisKK2RlZiBmaWx0ZXJfYmVuY2htYXJrKGpzb25fb3JpZywgZmFtaWx5LCByZXBsYWNlbWVudD0iIik6CisgICAgIiIiCisgICAgQXBwbHkgYSBmaWx0ZXIgdG8gdGhlIGpzb24sIGFuZCBvbmx5IGxlYXZlIHRoZSAnZmFtaWx5JyBvZiBiZW5jaG1hcmtzLgorICAgICIiIgorICAgIHJlZ2V4ID0gcmUuY29tcGlsZShmYW1pbHkpCisgICAgZmlsdGVyZWQgPSB7fQorICAgIGZpbHRlcmVkWydiZW5jaG1hcmtzJ10gPSBbXQorICAgIGZvciBiZSBpbiBqc29uX29yaWdbJ2JlbmNobWFya3MnXToKKyAgICAgICAgaWYgbm90IHJlZ2V4LnNlYXJjaChiZVsnbmFtZSddKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpbHRlcmVkYmVuY2ggPSBjb3B5LmRlZXBjb3B5KGJlKSAgIyBEbyBOT1QgbW9kaWZ5IHRoZSBvbGQgbmFtZSEKKyAgICAgICAgZmlsdGVyZWRiZW5jaFsnbmFtZSddID0gcmVnZXguc3ViKHJlcGxhY2VtZW50LCBmaWx0ZXJlZGJlbmNoWyduYW1lJ10pCisgICAgICAgIGZpbHRlcmVkWydiZW5jaG1hcmtzJ10uYXBwZW5kKGZpbHRlcmVkYmVuY2gpCisgICAgcmV0dXJuIGZpbHRlcmVkCisKKworZGVmIGdldF91bmlxdWVfYmVuY2htYXJrX25hbWVzKGpzb24pOgorICAgICIiIgorICAgIFdoaWxlICprZWVwaW5nKiB0aGUgb3JkZXIsIGdpdmUgYWxsIHRoZSB1bmlxdWUgJ25hbWVzJyB1c2VkIGZvciBiZW5jaG1hcmtzLgorICAgICIiIgorICAgIHNlZW4gPSBzZXQoKQorICAgIHVuaXF1ZWQgPSBbeFsnbmFtZSddIGZvciB4IGluIGpzb25bJ2JlbmNobWFya3MnXQorICAgICAgICAgICAgICAgaWYgeFsnbmFtZSddIG5vdCBpbiBzZWVuIGFuZAorICAgICAgICAgICAgICAgKHNlZW4uYWRkKHhbJ25hbWUnXSkgb3IgVHJ1ZSldCisgICAgcmV0dXJuIHVuaXF1ZWQKKworCitkZWYgaW50ZXJzZWN0KGxpc3QxLCBsaXN0Mik6CisgICAgIiIiCisgICAgR2l2ZW4gdHdvIGxpc3RzLCBnZXQgYSBuZXcgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBlbGVtZW50cyBvbmx5IGNvbnRhaW5lZAorICAgIGluICpib3RoIG9mIHRoZSBpbnB1dCBsaXN0cyosIHdoaWxlIHByZXNlcnZpbmcgdGhlIG9yZGVyaW5nLgorICAgICIiIgorICAgIHJldHVybiBbeCBmb3IgeCBpbiBsaXN0MSBpZiB4IGluIGxpc3QyXQorCisKK2RlZiBpc19wb3RlbnRpYWxseV9jb21wYXJhYmxlX2JlbmNobWFyayh4KToKKyAgICByZXR1cm4gKCd0aW1lX3VuaXQnIGluIHggYW5kICdyZWFsX3RpbWUnIGluIHggYW5kICdjcHVfdGltZScgaW4geCkKKworCitkZWYgcGFydGl0aW9uX2JlbmNobWFya3MoanNvbjEsIGpzb24yKToKKyAgICAiIiIKKyAgICBXaGlsZSBwcmVzZXJ2aW5nIHRoZSBvcmRlcmluZywgZmluZCBiZW5jaG1hcmtzIHdpdGggdGhlIHNhbWUgbmFtZXMgaW4KKyAgICBib3RoIG9mIHRoZSBpbnB1dHMsIGFuZCBncm91cCB0aGVtLgorICAgIChpLmUuIHBhcnRpdGlvbi9maWx0ZXIgaW50byBncm91cHMgd2l0aCBjb21tb24gbmFtZSkKKyAgICAiIiIKKyAgICBqc29uMV91bmlxdWVfbmFtZXMgPSBnZXRfdW5pcXVlX2JlbmNobWFya19uYW1lcyhqc29uMSkKKyAgICBqc29uMl91bmlxdWVfbmFtZXMgPSBnZXRfdW5pcXVlX2JlbmNobWFya19uYW1lcyhqc29uMikKKyAgICBuYW1lcyA9IGludGVyc2VjdChqc29uMV91bmlxdWVfbmFtZXMsIGpzb24yX3VuaXF1ZV9uYW1lcykKKyAgICBwYXJ0aXRpb25zID0gW10KKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgdGltZV91bml0ID0gTm9uZQorICAgICAgICAjIFBpY2sgdGhlIHRpbWUgdW5pdCBmcm9tIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgbGhzIGJlbmNobWFyay4KKyAgICAgICAgIyBXZSBzaG91bGQgYmUgY2FyZWZ1bCBub3QgdG8gY3Jhc2ggd2l0aCB1bmV4cGVjdGVkIGlucHV0LgorICAgICAgICBmb3IgeCBpbiBqc29uMVsnYmVuY2htYXJrcyddOgorICAgICAgICAgICAgaWYgKHhbJ25hbWUnXSA9PSBuYW1lIGFuZCBpc19wb3RlbnRpYWxseV9jb21wYXJhYmxlX2JlbmNobWFyayh4KSk6CisgICAgICAgICAgICAgICAgdGltZV91bml0ID0geFsndGltZV91bml0J10KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiB0aW1lX3VuaXQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgRmlsdGVyIGJ5IG5hbWUgYW5kIHRpbWUgdW5pdC4KKyAgICAgICAgIyBBbGwgdGhlIHJlcGV0aXRpb25zIGFyZSBhc3N1bWVkIHRvIGJlIGNvbXBhcmFibGUuCisgICAgICAgIGxocyA9IFt4IGZvciB4IGluIGpzb24xWydiZW5jaG1hcmtzJ10gaWYgeFsnbmFtZSddID09IG5hbWUgYW5kCisgICAgICAgICAgICAgICB4Wyd0aW1lX3VuaXQnXSA9PSB0aW1lX3VuaXRdCisgICAgICAgIHJocyA9IFt4IGZvciB4IGluIGpzb24yWydiZW5jaG1hcmtzJ10gaWYgeFsnbmFtZSddID09IG5hbWUgYW5kCisgICAgICAgICAgICAgICB4Wyd0aW1lX3VuaXQnXSA9PSB0aW1lX3VuaXRdCisgICAgICAgIHBhcnRpdGlvbnMuYXBwZW5kKFtsaHMsIHJoc10pCisgICAgcmV0dXJuIHBhcnRpdGlvbnMKKworCitkZWYgZXh0cmFjdF9maWVsZChwYXJ0aXRpb24sIGZpZWxkX25hbWUpOgorICAgICMgVGhlIGNvdW50IG9mIGVsZW1lbnRzIG1heSBiZSBkaWZmZXJlbnQuIFdlIHdhbnQgKmFsbCogb2YgdGhlbS4KKyAgICBsaHMgPSBbeFtmaWVsZF9uYW1lXSBmb3IgeCBpbiBwYXJ0aXRpb25bMF1dCisgICAgcmhzID0gW3hbZmllbGRfbmFtZV0gZm9yIHggaW4gcGFydGl0aW9uWzFdXQorICAgIHJldHVybiBbbGhzLCByaHNdCisKK2RlZiBjYWxjX3V0ZXN0KHRpbWluZ3NfY3B1LCB0aW1pbmdzX3RpbWUpOgorICAgIG1pbl9yZXBfY250ID0gbWluKGxlbih0aW1pbmdzX3RpbWVbMF0pLAorICAgICAgICAgICAgICAgICAgICAgIGxlbih0aW1pbmdzX3RpbWVbMV0pLAorICAgICAgICAgICAgICAgICAgICAgIGxlbih0aW1pbmdzX2NwdVswXSksCisgICAgICAgICAgICAgICAgICAgICAgbGVuKHRpbWluZ3NfY3B1WzFdKSkKKworICAgICMgRG9lcyAqZXZlcnl0aGluZyogaGFzIGF0IGxlYXN0IFVURVNUX01JTl9SRVBFVElUSU9OUyByZXBldGl0aW9ucz8KKyAgICBpZiBtaW5fcmVwX2NudCA8IFVURVNUX01JTl9SRVBFVElUSU9OUzoKKyAgICAgICAgcmV0dXJuIEZhbHNlLCBOb25lLCBOb25lCisKKyAgICB0aW1lX3B2YWx1ZSA9IG1hbm53aGl0bmV5dSgKKyAgICAgICAgdGltaW5nc190aW1lWzBdLCB0aW1pbmdzX3RpbWVbMV0sIGFsdGVybmF0aXZlPSd0d28tc2lkZWQnKS5wdmFsdWUKKyAgICBjcHVfcHZhbHVlID0gbWFubndoaXRuZXl1KAorICAgICAgICB0aW1pbmdzX2NwdVswXSwgdGltaW5nc19jcHVbMV0sIGFsdGVybmF0aXZlPSd0d28tc2lkZWQnKS5wdmFsdWUKKworICAgIHJldHVybiAobWluX3JlcF9jbnQgPj0gVVRFU1RfT1BUSU1BTF9SRVBFVElUSU9OUyksIGNwdV9wdmFsdWUsIHRpbWVfcHZhbHVlCisKK2RlZiBwcmludF91dGVzdChwYXJ0aXRpb24sIHV0ZXN0X2FscGhhLCBmaXJzdF9jb2xfd2lkdGgsIHVzZV9jb2xvcj1UcnVlKToKKyAgICBkZWYgZ2V0X3V0ZXN0X2NvbG9yKHB2YWwpOgorICAgICAgICByZXR1cm4gQkNfRkFJTCBpZiBwdmFsID49IHV0ZXN0X2FscGhhIGVsc2UgQkNfT0tHUkVFTgorCisgICAgdGltaW5nc190aW1lID0gZXh0cmFjdF9maWVsZChwYXJ0aXRpb24sICdyZWFsX3RpbWUnKQorICAgIHRpbWluZ3NfY3B1ID0gZXh0cmFjdF9maWVsZChwYXJ0aXRpb24sICdjcHVfdGltZScpCisgICAgaGF2ZV9vcHRpbWFsX3JlcGV0aXRpb25zLCBjcHVfcHZhbHVlLCB0aW1lX3B2YWx1ZSA9IGNhbGNfdXRlc3QodGltaW5nc19jcHUsIHRpbWluZ3NfdGltZSkKKworICAgICMgQ2hlY2sgaWYgd2UgZmFpbGVkIG1pc2VyYWJseSB3aXRoIG1pbmltdW0gcmVxdWlyZWQgcmVwZXRpdGlvbnMgZm9yIHV0ZXN0CisgICAgaWYgbm90IGhhdmVfb3B0aW1hbF9yZXBldGl0aW9ucyBhbmQgY3B1X3B2YWx1ZSBpcyBOb25lIGFuZCB0aW1lX3B2YWx1ZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gW10KKworICAgIGRzYyA9ICJVIFRlc3QsIFJlcGV0aXRpb25zOiB7fSB2cyB7fSIuZm9ybWF0KAorICAgICAgICBsZW4odGltaW5nc19jcHVbMF0pLCBsZW4odGltaW5nc19jcHVbMV0pKQorICAgIGRzY19jb2xvciA9IEJDX09LR1JFRU4KKworICAgICMgV2Ugc3RpbGwgZ290IHNvbWUgcmVzdWx0cyB0byBzaG93IGJ1dCBpc3N1ZSBhIHdhcm5pbmcgYWJvdXQgaXQuCisgICAgaWYgbm90IGhhdmVfb3B0aW1hbF9yZXBldGl0aW9uczoKKyAgICAgICAgZHNjX2NvbG9yID0gQkNfV0FSTklORworICAgICAgICBkc2MgKz0gIi4gV0FSTklORzogUmVzdWx0cyB1bnJlbGlhYmxlISB7fSsgcmVwZXRpdGlvbnMgcmVjb21tZW5kZWQuIi5mb3JtYXQoCisgICAgICAgICAgICBVVEVTVF9PUFRJTUFMX1JFUEVUSVRJT05TKQorCisgICAgc3BlY2lhbF9zdHIgPSAie317Ojx7fXN9e2VuZGN9e317OjE2LjRmfXtlbmRjfXt9ezoxNi40Zn17ZW5kY317fSAgICAgIHt9IgorCisgICAgbGFzdF9uYW1lID0gcGFydGl0aW9uWzBdWzBdWyduYW1lJ10KKyAgICByZXR1cm4gW2NvbG9yX2Zvcm1hdCh1c2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQkNfSEVBREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ7fXt9Ii5mb3JtYXQobGFzdF9uYW1lLCBVVEVTVF9DT0xfTkFNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldF91dGVzdF9jb2xvcih0aW1lX3B2YWx1ZSksIHRpbWVfcHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldF91dGVzdF9jb2xvcihjcHVfcHZhbHVlKSwgY3B1X3B2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc2NfY29sb3IsIGRzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmRjPUJDX0VOREMpXQorCisKK2RlZiBnZW5lcmF0ZV9kaWZmZXJlbmNlX3JlcG9ydCgKKyAgICAgICAganNvbjEsCisgICAgICAgIGpzb24yLAorICAgICAgICBkaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seT1GYWxzZSwKKyAgICAgICAgdXRlc3Q9RmFsc2UsCisgICAgICAgIHV0ZXN0X2FscGhhPTAuMDUsCisgICAgICAgIHVzZV9jb2xvcj1UcnVlKToKKyAgICAiIiIKKyAgICBDYWxjdWxhdGUgYW5kIHJlcG9ydCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGVhY2ggdGVzdCBvZiB0d28gYmVuY2htYXJrcworICAgIHJ1bnMgc3BlY2lmaWVkIGFzICdqc29uMScgYW5kICdqc29uMicuCisgICAgIiIiCisgICAgYXNzZXJ0IHV0ZXN0IGlzIFRydWUgb3IgdXRlc3QgaXMgRmFsc2UKKyAgICBmaXJzdF9jb2xfd2lkdGggPSBmaW5kX2xvbmdlc3RfbmFtZShqc29uMVsnYmVuY2htYXJrcyddKQorCisgICAgZGVmIGZpbmRfdGVzdChuYW1lKToKKyAgICAgICAgZm9yIGIgaW4ganNvbjJbJ2JlbmNobWFya3MnXToKKyAgICAgICAgICAgIGlmIGJbJ25hbWUnXSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBmaXJzdF9jb2xfd2lkdGggPSBtYXgoCisgICAgICAgIGZpcnN0X2NvbF93aWR0aCwKKyAgICAgICAgbGVuKCdCZW5jaG1hcmsnKSkKKyAgICBmaXJzdF9jb2xfd2lkdGggKz0gbGVuKFVURVNUX0NPTF9OQU1FKQorICAgIGZpcnN0X2xpbmUgPSAiezo8e31zfVRpbWUgICAgICAgICAgICAgQ1BVICAgICAgVGltZSBPbGQgICAgICBUaW1lIE5ldyAgICAgICBDUFUgT2xkICAgICAgIENQVSBOZXciLmZvcm1hdCgKKyAgICAgICAgJ0JlbmNobWFyaycsIDEyICsgZmlyc3RfY29sX3dpZHRoKQorICAgIG91dHB1dF9zdHJzID0gW2ZpcnN0X2xpbmUsICctJyAqIGxlbihmaXJzdF9saW5lKV0KKworICAgIHBhcnRpdGlvbnMgPSBwYXJ0aXRpb25fYmVuY2htYXJrcyhqc29uMSwganNvbjIpCisgICAgZm9yIHBhcnRpdGlvbiBpbiBwYXJ0aXRpb25zOgorICAgICAgICAjIENhcmVmdWwsIHdlIG1heSBoYXZlIGRpZmZlcmVudCByZXBldGl0aW9uIGNvdW50LgorICAgICAgICBmb3IgaSBpbiByYW5nZShtaW4obGVuKHBhcnRpdGlvblswXSksIGxlbihwYXJ0aXRpb25bMV0pKSk6CisgICAgICAgICAgICBibiA9IHBhcnRpdGlvblswXVtpXQorICAgICAgICAgICAgb3RoZXJfYmVuY2ggPSBwYXJ0aXRpb25bMV1baV0KKworICAgICAgICAgICAgIyAqSWYqIHdlIHdlcmUgYXNrZWQgdG8gb25seSBkaXNwbGF5IGFnZ3JlZ2F0ZXMsCisgICAgICAgICAgICAjIGFuZCBpZiBpdCBpcyBub24tYWdncmVnYXRlLCB0aGVuIHNraXAgaXQuCisgICAgICAgICAgICBpZiBkaXNwbGF5X2FnZ3JlZ2F0ZXNfb25seSBhbmQgJ3J1bl90eXBlJyBpbiBibiBhbmQgJ3J1bl90eXBlJyBpbiBvdGhlcl9iZW5jaDoKKyAgICAgICAgICAgICAgICBhc3NlcnQgYm5bJ3J1bl90eXBlJ10gPT0gb3RoZXJfYmVuY2hbJ3J1bl90eXBlJ10KKyAgICAgICAgICAgICAgICBpZiBiblsncnVuX3R5cGUnXSAhPSAnYWdncmVnYXRlJzoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZm10X3N0ciA9ICJ7fXs6PHt9c317ZW5kY317fXs6KzE2LjRmfXtlbmRjfXt9ezorMTYuNGZ9e2VuZGN9ezoxNC4wZn17OjE0LjBmfXtlbmRjfXs6MTQuMGZ9ezoxNC4wZn0iCisKKyAgICAgICAgICAgIGRlZiBnZXRfY29sb3IocmVzKToKKyAgICAgICAgICAgICAgICBpZiByZXMgPiAwLjA1OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNfRkFJTAorICAgICAgICAgICAgICAgIGVsaWYgcmVzID4gLTAuMDc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ19XSElURQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ19DWUFOCisKKyAgICAgICAgICAgIHRyZXMgPSBjYWxjdWxhdGVfY2hhbmdlKGJuWydyZWFsX3RpbWUnXSwgb3RoZXJfYmVuY2hbJ3JlYWxfdGltZSddKQorICAgICAgICAgICAgY3B1cmVzID0gY2FsY3VsYXRlX2NoYW5nZShiblsnY3B1X3RpbWUnXSwgb3RoZXJfYmVuY2hbJ2NwdV90aW1lJ10pCisgICAgICAgICAgICBvdXRwdXRfc3RycyArPSBbY29sb3JfZm9ybWF0KHVzZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNfSEVBREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiblsnbmFtZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9jb2xfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb2xvcih0cmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NvbG9yKGNwdXJlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm5bJ3JlYWxfdGltZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9iZW5jaFsncmVhbF90aW1lJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJuWydjcHVfdGltZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9iZW5jaFsnY3B1X3RpbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kYz1CQ19FTkRDKV0KKworICAgICAgICAjIEFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIHBhcnRpdGlvbiwgaWYgcmVxdWVzdGVkLCBkbyB0aGUgVSB0ZXN0LgorICAgICAgICBpZiB1dGVzdDoKKyAgICAgICAgICAgIG91dHB1dF9zdHJzICs9IHByaW50X3V0ZXN0KHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZXN0X2FscGhhPXV0ZXN0X2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sX3dpZHRoPWZpcnN0X2NvbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9jb2xvcj11c2VfY29sb3IpCisKKyAgICByZXR1cm4gb3V0cHV0X3N0cnMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFVuaXQgdGVzdHMKKworCitjbGFzcyBUZXN0R2V0VW5pcXVlQmVuY2htYXJrTmFtZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBsb2FkX3Jlc3VsdHMoc2VsZik6CisgICAgICAgIGltcG9ydCBqc29uCisgICAgICAgIHRlc3RJbnB1dHMgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoCisgICAgICAgICAgICAgICAgb3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpLAorICAgICAgICAgICAgJ0lucHV0cycpCisgICAgICAgIHRlc3RPdXRwdXQgPSBvcy5wYXRoLmpvaW4odGVzdElucHV0cywgJ3Rlc3QzX3J1bjAuanNvbicpCisgICAgICAgIHdpdGggb3Blbih0ZXN0T3V0cHV0LCAncicpIGFzIGY6CisgICAgICAgICAgICBqc29uID0ganNvbi5sb2FkKGYpCisgICAgICAgIHJldHVybiBqc29uCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgZXhwZWN0X2xpbmVzID0gWworICAgICAgICAgICAgJ0JNX09uZScsCisgICAgICAgICAgICAnQk1fVHdvJywKKyAgICAgICAgICAgICdzaG9ydCcsICAjIFRoZXNlIHR3byBhcmUgbm90IHNvcnRlZAorICAgICAgICAgICAgJ21lZGl1bScsICAjIFRoZXNlIHR3byBhcmUgbm90IHNvcnRlZAorICAgICAgICBdCisgICAgICAgIGpzb24gPSBzZWxmLmxvYWRfcmVzdWx0cygpCisgICAgICAgIG91dHB1dF9saW5lcyA9IGdldF91bmlxdWVfYmVuY2htYXJrX25hbWVzKGpzb24pCisgICAgICAgIHByaW50KCJcbiIpCisgICAgICAgIHByaW50KCJcbiIuam9pbihvdXRwdXRfbGluZXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvdXRwdXRfbGluZXMpLCBsZW4oZXhwZWN0X2xpbmVzKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKG91dHB1dF9saW5lcykpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RfbGluZXNbaV0sIG91dHB1dF9saW5lc1tpXSkKKworCitjbGFzcyBUZXN0UmVwb3J0RGlmZmVyZW5jZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGxvYWRfcmVzdWx0cyhzZWxmKToKKyAgICAgICAgaW1wb3J0IGpzb24KKyAgICAgICAgdGVzdElucHV0cyA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZSgKKyAgICAgICAgICAgICAgICBvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSksCisgICAgICAgICAgICAnSW5wdXRzJykKKyAgICAgICAgdGVzdE91dHB1dDEgPSBvcy5wYXRoLmpvaW4odGVzdElucHV0cywgJ3Rlc3QxX3J1bjEuanNvbicpCisgICAgICAgIHRlc3RPdXRwdXQyID0gb3MucGF0aC5qb2luKHRlc3RJbnB1dHMsICd0ZXN0MV9ydW4yLmpzb24nKQorICAgICAgICB3aXRoIG9wZW4odGVzdE91dHB1dDEsICdyJykgYXMgZjoKKyAgICAgICAgICAgIGpzb24xID0ganNvbi5sb2FkKGYpCisgICAgICAgIHdpdGggb3Blbih0ZXN0T3V0cHV0MiwgJ3InKSBhcyBmOgorICAgICAgICAgICAganNvbjIgPSBqc29uLmxvYWQoZikKKyAgICAgICAgcmV0dXJuIGpzb24xLCBqc29uMgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGV4cGVjdF9saW5lcyA9IFsKKyAgICAgICAgICAgIFsnQk1fU2FtZVRpbWVzJywgJyswLjAwMDAnLCAnKzAuMDAwMCcsICcxMCcsICcxMCcsICcxMCcsICcxMCddLAorICAgICAgICAgICAgWydCTV8yeEZhc3RlcicsICctMC41MDAwJywgJy0wLjUwMDAnLCAnNTAnLCAnMjUnLCAnNTAnLCAnMjUnXSwKKyAgICAgICAgICAgIFsnQk1fMnhTbG93ZXInLCAnKzEuMDAwMCcsICcrMS4wMDAwJywgJzUwJywgJzEwMCcsICc1MCcsICcxMDAnXSwKKyAgICAgICAgICAgIFsnQk1fMVBlcmNlbnRGYXN0ZXInLCAnLTAuMDEwMCcsICctMC4wMTAwJywgJzEwMCcsICc5OScsICcxMDAnLCAnOTknXSwKKyAgICAgICAgICAgIFsnQk1fMVBlcmNlbnRTbG93ZXInLCAnKzAuMDEwMCcsICcrMC4wMTAwJywgJzEwMCcsICcxMDEnLCAnMTAwJywgJzEwMSddLAorICAgICAgICAgICAgWydCTV8xMFBlcmNlbnRGYXN0ZXInLCAnLTAuMTAwMCcsICctMC4xMDAwJywgJzEwMCcsICc5MCcsICcxMDAnLCAnOTAnXSwKKyAgICAgICAgICAgIFsnQk1fMTBQZXJjZW50U2xvd2VyJywgJyswLjEwMDAnLCAnKzAuMTAwMCcsICcxMDAnLCAnMTEwJywgJzEwMCcsICcxMTAnXSwKKyAgICAgICAgICAgIFsnQk1fMTAweFNsb3dlcicsICcrOTkuMDAwMCcsICcrOTkuMDAwMCcsCisgICAgICAgICAgICAgICAgJzEwMCcsICcxMDAwMCcsICcxMDAnLCAnMTAwMDAnXSwKKyAgICAgICAgICAgIFsnQk1fMTAweEZhc3RlcicsICctMC45OTAwJywgJy0wLjk5MDAnLAorICAgICAgICAgICAgICAgICcxMDAwMCcsICcxMDAnLCAnMTAwMDAnLCAnMTAwJ10sCisgICAgICAgICAgICBbJ0JNXzEwUGVyY2VudENQVVRvVGltZScsICcrMC4xMDAwJywKKyAgICAgICAgICAgICAgICAnLTAuMTAwMCcsICcxMDAnLCAnMTEwJywgJzEwMCcsICc5MCddLAorICAgICAgICAgICAgWydCTV9UaGlyZEZhc3RlcicsICctMC4zMzMzJywgJy0wLjMzMzQnLCAnMTAwJywgJzY3JywgJzEwMCcsICc2NyddLAorICAgICAgICAgICAgWydCTV9Ob3RCYWRUaW1lVW5pdCcsICctMC45MDAwJywgJyswLjIwMDAnLCAnMCcsICcwJywgJzAnLCAnMSddLAorICAgICAgICBdCisgICAgICAgIGpzb24xLCBqc29uMiA9IHNlbGYubG9hZF9yZXN1bHRzKCkKKyAgICAgICAgb3V0cHV0X2xpbmVzX3dpdGhfaGVhZGVyID0gZ2VuZXJhdGVfZGlmZmVyZW5jZV9yZXBvcnQoCisgICAgICAgICAgICBqc29uMSwganNvbjIsIHVzZV9jb2xvcj1GYWxzZSkKKyAgICAgICAgb3V0cHV0X2xpbmVzID0gb3V0cHV0X2xpbmVzX3dpdGhfaGVhZGVyWzI6XQorICAgICAgICBwcmludCgiXG4iKQorICAgICAgICBwcmludCgiXG4iLmpvaW4ob3V0cHV0X2xpbmVzX3dpdGhfaGVhZGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3V0cHV0X2xpbmVzKSwgbGVuKGV4cGVjdF9saW5lcykpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihvdXRwdXRfbGluZXMpKToKKyAgICAgICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gb3V0cHV0X2xpbmVzW2ldLnNwbGl0KCcgJykgaWYgeF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBhcnRzKSwgNykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0X2xpbmVzW2ldLCBwYXJ0cykKKworCitjbGFzcyBUZXN0UmVwb3J0RGlmZmVyZW5jZUJldHdlZW5GYW1pbGllcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGxvYWRfcmVzdWx0KHNlbGYpOgorICAgICAgICBpbXBvcnQganNvbgorICAgICAgICB0ZXN0SW5wdXRzID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKAorICAgICAgICAgICAgICAgIG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSwKKyAgICAgICAgICAgICdJbnB1dHMnKQorICAgICAgICB0ZXN0T3V0cHV0ID0gb3MucGF0aC5qb2luKHRlc3RJbnB1dHMsICd0ZXN0Ml9ydW4uanNvbicpCisgICAgICAgIHdpdGggb3Blbih0ZXN0T3V0cHV0LCAncicpIGFzIGY6CisgICAgICAgICAgICBqc29uID0ganNvbi5sb2FkKGYpCisgICAgICAgIHJldHVybiBqc29uCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgZXhwZWN0X2xpbmVzID0gWworICAgICAgICAgICAgWycuJywgJy0wLjUwMDAnLCAnLTAuNTAwMCcsICcxMCcsICc1JywgJzEwJywgJzUnXSwKKyAgICAgICAgICAgIFsnLi80JywgJy0wLjUwMDAnLCAnLTAuNTAwMCcsICc0MCcsICcyMCcsICc0MCcsICcyMCddLAorICAgICAgICAgICAgWydQcmVmaXgvLicsICctMC41MDAwJywgJy0wLjUwMDAnLCAnMjAnLCAnMTAnLCAnMjAnLCAnMTAnXSwKKyAgICAgICAgICAgIFsnUHJlZml4Ly4vMycsICctMC41MDAwJywgJy0wLjUwMDAnLCAnMzAnLCAnMTUnLCAnMzAnLCAnMTUnXSwKKyAgICAgICAgXQorICAgICAgICBqc29uID0gc2VsZi5sb2FkX3Jlc3VsdCgpCisgICAgICAgIGpzb24xID0gZmlsdGVyX2JlbmNobWFyayhqc29uLCAiQk1fWi5ybyIsICIuIikKKyAgICAgICAganNvbjIgPSBmaWx0ZXJfYmVuY2htYXJrKGpzb24sICJCTV9PLmUiLCAiLiIpCisgICAgICAgIG91dHB1dF9saW5lc193aXRoX2hlYWRlciA9IGdlbmVyYXRlX2RpZmZlcmVuY2VfcmVwb3J0KAorICAgICAgICAgICAganNvbjEsIGpzb24yLCB1c2VfY29sb3I9RmFsc2UpCisgICAgICAgIG91dHB1dF9saW5lcyA9IG91dHB1dF9saW5lc193aXRoX2hlYWRlclsyOl0KKyAgICAgICAgcHJpbnQoIlxuIikKKyAgICAgICAgcHJpbnQoIlxuIi5qb2luKG91dHB1dF9saW5lc193aXRoX2hlYWRlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91dHB1dF9saW5lcyksIGxlbihleHBlY3RfbGluZXMpKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4ob3V0cHV0X2xpbmVzKSk6CisgICAgICAgICAgICBwYXJ0cyA9IFt4IGZvciB4IGluIG91dHB1dF9saW5lc1tpXS5zcGxpdCgnICcpIGlmIHhdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwYXJ0cyksIDcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdF9saW5lc1tpXSwgcGFydHMpCisKKworY2xhc3MgVGVzdFJlcG9ydERpZmZlcmVuY2VXaXRoVVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBsb2FkX3Jlc3VsdHMoc2VsZik6CisgICAgICAgIGltcG9ydCBqc29uCisgICAgICAgIHRlc3RJbnB1dHMgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoCisgICAgICAgICAgICAgICAgb3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpLAorICAgICAgICAgICAgJ0lucHV0cycpCisgICAgICAgIHRlc3RPdXRwdXQxID0gb3MucGF0aC5qb2luKHRlc3RJbnB1dHMsICd0ZXN0M19ydW4wLmpzb24nKQorICAgICAgICB0ZXN0T3V0cHV0MiA9IG9zLnBhdGguam9pbih0ZXN0SW5wdXRzLCAndGVzdDNfcnVuMS5qc29uJykKKyAgICAgICAgd2l0aCBvcGVuKHRlc3RPdXRwdXQxLCAncicpIGFzIGY6CisgICAgICAgICAgICBqc29uMSA9IGpzb24ubG9hZChmKQorICAgICAgICB3aXRoIG9wZW4odGVzdE91dHB1dDIsICdyJykgYXMgZjoKKyAgICAgICAgICAgIGpzb24yID0ganNvbi5sb2FkKGYpCisgICAgICAgIHJldHVybiBqc29uMSwganNvbjIKKworICAgIGRlZiB0ZXN0X3V0ZXN0KHNlbGYpOgorICAgICAgICBleHBlY3RfbGluZXMgPSBbXQorICAgICAgICBleHBlY3RfbGluZXMgPSBbCisgICAgICAgICAgICBbJ0JNX09uZScsICctMC4xMDAwJywgJyswLjEwMDAnLCAnMTAnLCAnOScsICcxMDAnLCAnMTEwJ10sCisgICAgICAgICAgICBbJ0JNX1R3bycsICcrMC4xMTExJywgJy0wLjAxMTEnLCAnOScsICcxMCcsICc5MCcsICc4OSddLAorICAgICAgICAgICAgWydCTV9Ud28nLCAnLTAuMTI1MCcsICctMC4xNjI4JywgJzgnLCAnNycsICc4NicsICc3MiddLAorICAgICAgICAgICAgWydCTV9Ud29fcHZhbHVlJywKKyAgICAgICAgICAgICAnMC42OTg1JywKKyAgICAgICAgICAgICAnMC42OTg1JywKKyAgICAgICAgICAgICAnVScsCisgICAgICAgICAgICAgJ1Rlc3QsJywKKyAgICAgICAgICAgICAnUmVwZXRpdGlvbnM6JywKKyAgICAgICAgICAgICAnMicsCisgICAgICAgICAgICAgJ3ZzJywKKyAgICAgICAgICAgICAnMi4nLAorICAgICAgICAgICAgICdXQVJOSU5HOicsCisgICAgICAgICAgICAgJ1Jlc3VsdHMnLAorICAgICAgICAgICAgICd1bnJlbGlhYmxlIScsCisgICAgICAgICAgICAgJzkrJywKKyAgICAgICAgICAgICAncmVwZXRpdGlvbnMnLAorICAgICAgICAgICAgICdyZWNvbW1lbmRlZC4nXSwKKyAgICAgICAgICAgIFsnc2hvcnQnLCAnLTAuMTI1MCcsICctMC4wNjI1JywgJzgnLCAnNycsICc4MCcsICc3NSddLAorICAgICAgICAgICAgWydzaG9ydCcsICctMC40MzI1JywgJy0wLjEzNTEnLCAnOCcsICc1JywgJzc3JywgJzY3J10sCisgICAgICAgICAgICBbJ3Nob3J0X3B2YWx1ZScsCisgICAgICAgICAgICAgJzAuNzY3MScsCisgICAgICAgICAgICAgJzAuMTQ4OScsCisgICAgICAgICAgICAgJ1UnLAorICAgICAgICAgICAgICdUZXN0LCcsCisgICAgICAgICAgICAgJ1JlcGV0aXRpb25zOicsCisgICAgICAgICAgICAgJzInLAorICAgICAgICAgICAgICd2cycsCisgICAgICAgICAgICAgJzMuJywKKyAgICAgICAgICAgICAnV0FSTklORzonLAorICAgICAgICAgICAgICdSZXN1bHRzJywKKyAgICAgICAgICAgICAndW5yZWxpYWJsZSEnLAorICAgICAgICAgICAgICc5KycsCisgICAgICAgICAgICAgJ3JlcGV0aXRpb25zJywKKyAgICAgICAgICAgICAncmVjb21tZW5kZWQuJ10sCisgICAgICAgICAgICBbJ21lZGl1bScsICctMC4zNzUwJywgJy0wLjMzNzUnLCAnOCcsICc1JywgJzgwJywgJzUzJ10sCisgICAgICAgIF0KKyAgICAgICAganNvbjEsIGpzb24yID0gc2VsZi5sb2FkX3Jlc3VsdHMoKQorICAgICAgICBvdXRwdXRfbGluZXNfd2l0aF9oZWFkZXIgPSBnZW5lcmF0ZV9kaWZmZXJlbmNlX3JlcG9ydCgKKyAgICAgICAgICAgIGpzb24xLCBqc29uMiwgdXRlc3Q9VHJ1ZSwgdXRlc3RfYWxwaGE9MC4wNSwgdXNlX2NvbG9yPUZhbHNlKQorICAgICAgICBvdXRwdXRfbGluZXMgPSBvdXRwdXRfbGluZXNfd2l0aF9oZWFkZXJbMjpdCisgICAgICAgIHByaW50KCJcbiIpCisgICAgICAgIHByaW50KCJcbiIuam9pbihvdXRwdXRfbGluZXNfd2l0aF9oZWFkZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvdXRwdXRfbGluZXMpLCBsZW4oZXhwZWN0X2xpbmVzKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKG91dHB1dF9saW5lcykpOgorICAgICAgICAgICAgcGFydHMgPSBbeCBmb3IgeCBpbiBvdXRwdXRfbGluZXNbaV0uc3BsaXQoJyAnKSBpZiB4XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RfbGluZXNbaV0sIHBhcnRzKQorCisKK2NsYXNzIFRlc3RSZXBvcnREaWZmZXJlbmNlV2l0aFVUZXN0V2hpbGVEaXNwbGF5aW5nQWdncmVnYXRlc09ubHkoCisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbG9hZF9yZXN1bHRzKHNlbGYpOgorICAgICAgICBpbXBvcnQganNvbgorICAgICAgICB0ZXN0SW5wdXRzID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKAorICAgICAgICAgICAgICAgIG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSwKKyAgICAgICAgICAgICdJbnB1dHMnKQorICAgICAgICB0ZXN0T3V0cHV0MSA9IG9zLnBhdGguam9pbih0ZXN0SW5wdXRzLCAndGVzdDNfcnVuMC5qc29uJykKKyAgICAgICAgdGVzdE91dHB1dDIgPSBvcy5wYXRoLmpvaW4odGVzdElucHV0cywgJ3Rlc3QzX3J1bjEuanNvbicpCisgICAgICAgIHdpdGggb3Blbih0ZXN0T3V0cHV0MSwgJ3InKSBhcyBmOgorICAgICAgICAgICAganNvbjEgPSBqc29uLmxvYWQoZikKKyAgICAgICAgd2l0aCBvcGVuKHRlc3RPdXRwdXQyLCAncicpIGFzIGY6CisgICAgICAgICAgICBqc29uMiA9IGpzb24ubG9hZChmKQorICAgICAgICByZXR1cm4ganNvbjEsIGpzb24yCisKKyAgICBkZWYgdGVzdF91dGVzdChzZWxmKToKKyAgICAgICAgZXhwZWN0X2xpbmVzID0gW10KKyAgICAgICAgZXhwZWN0X2xpbmVzID0gWworICAgICAgICAgICAgWydCTV9PbmUnLCAnLTAuMTAwMCcsICcrMC4xMDAwJywgJzEwJywgJzknLCAnMTAwJywgJzExMCddLAorICAgICAgICAgICAgWydCTV9Ud28nLCAnKzAuMTExMScsICctMC4wMTExJywgJzknLCAnMTAnLCAnOTAnLCAnODknXSwKKyAgICAgICAgICAgIFsnQk1fVHdvJywgJy0wLjEyNTAnLCAnLTAuMTYyOCcsICc4JywgJzcnLCAnODYnLCAnNzInXSwKKyAgICAgICAgICAgIFsnQk1fVHdvX3B2YWx1ZScsCisgICAgICAgICAgICAgJzAuNjk4NScsCisgICAgICAgICAgICAgJzAuNjk4NScsCisgICAgICAgICAgICAgJ1UnLAorICAgICAgICAgICAgICdUZXN0LCcsCisgICAgICAgICAgICAgJ1JlcGV0aXRpb25zOicsCisgICAgICAgICAgICAgJzInLAorICAgICAgICAgICAgICd2cycsCisgICAgICAgICAgICAgJzIuJywKKyAgICAgICAgICAgICAnV0FSTklORzonLAorICAgICAgICAgICAgICdSZXN1bHRzJywKKyAgICAgICAgICAgICAndW5yZWxpYWJsZSEnLAorICAgICAgICAgICAgICc5KycsCisgICAgICAgICAgICAgJ3JlcGV0aXRpb25zJywKKyAgICAgICAgICAgICAncmVjb21tZW5kZWQuJ10sCisgICAgICAgICAgICBbJ3Nob3J0JywgJy0wLjEyNTAnLCAnLTAuMDYyNScsICc4JywgJzcnLCAnODAnLCAnNzUnXSwKKyAgICAgICAgICAgIFsnc2hvcnQnLCAnLTAuNDMyNScsICctMC4xMzUxJywgJzgnLCAnNScsICc3NycsICc2NyddLAorICAgICAgICAgICAgWydzaG9ydF9wdmFsdWUnLAorICAgICAgICAgICAgICcwLjc2NzEnLAorICAgICAgICAgICAgICcwLjE0ODknLAorICAgICAgICAgICAgICdVJywKKyAgICAgICAgICAgICAnVGVzdCwnLAorICAgICAgICAgICAgICdSZXBldGl0aW9uczonLAorICAgICAgICAgICAgICcyJywKKyAgICAgICAgICAgICAndnMnLAorICAgICAgICAgICAgICczLicsCisgICAgICAgICAgICAgJ1dBUk5JTkc6JywKKyAgICAgICAgICAgICAnUmVzdWx0cycsCisgICAgICAgICAgICAgJ3VucmVsaWFibGUhJywKKyAgICAgICAgICAgICAnOSsnLAorICAgICAgICAgICAgICdyZXBldGl0aW9ucycsCisgICAgICAgICAgICAgJ3JlY29tbWVuZGVkLiddLAorICAgICAgICBdCisgICAgICAgIGpzb24xLCBqc29uMiA9IHNlbGYubG9hZF9yZXN1bHRzKCkKKyAgICAgICAgb3V0cHV0X2xpbmVzX3dpdGhfaGVhZGVyID0gZ2VuZXJhdGVfZGlmZmVyZW5jZV9yZXBvcnQoCisgICAgICAgICAgICBqc29uMSwganNvbjIsIGRpc3BsYXlfYWdncmVnYXRlc19vbmx5PVRydWUsCisgICAgICAgICAgICB1dGVzdD1UcnVlLCB1dGVzdF9hbHBoYT0wLjA1LCB1c2VfY29sb3I9RmFsc2UpCisgICAgICAgIG91dHB1dF9saW5lcyA9IG91dHB1dF9saW5lc193aXRoX2hlYWRlclsyOl0KKyAgICAgICAgcHJpbnQoIlxuIikKKyAgICAgICAgcHJpbnQoIlxuIi5qb2luKG91dHB1dF9saW5lc193aXRoX2hlYWRlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91dHB1dF9saW5lcyksIGxlbihleHBlY3RfbGluZXMpKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4ob3V0cHV0X2xpbmVzKSk6CisgICAgICAgICAgICBwYXJ0cyA9IFt4IGZvciB4IGluIG91dHB1dF9saW5lc1tpXS5zcGxpdCgnICcpIGlmIHhdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdF9saW5lc1tpXSwgcGFydHMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKworIyB2aW06IHRhYnN0b3A9NCBleHBhbmR0YWIgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQKKyMga2F0ZTogdGFiLXdpZHRoOiA0OyByZXBsYWNlLXRhYnMgb247IGluZGVudC13aWR0aCA0OyB0YWItaW5kZW50czogb2ZmOworIyBrYXRlOiBpbmRlbnQtbW9kZSBweXRob247IHJlbW92ZS10cmFpbGluZy1zcGFjZXMgbW9kaWZpZWQ7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9nYmVuY2gvdXRpbC5weSBiL3NyYy90aGlyZF9wYXJ0eS9nb29nbGVfYmVuY2htYXJrL3Rvb2xzL2diZW5jaC91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOGU4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9nYmVuY2gvdXRpbC5weQpAQCAtMCwwICsxLDE2NCBAQAorIiIidXRpbC5weSAtIEdlbmVyYWwgdXRpbGl0aWVzIGZvciBydW5uaW5nLCBsb2FkaW5nLCBhbmQgcHJvY2Vzc2luZyBiZW5jaG1hcmtzCisiIiIKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworIyBJbnB1dCBmaWxlIHR5cGUgZW51bWVyYXRpb24KK0lUX0ludmFsaWQgPSAwCitJVF9KU09OID0gMQorSVRfRXhlY3V0YWJsZSA9IDIKKworX251bV9tYWdpY19ieXRlcyA9IDIgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpIGVsc2UgNAorCisKK2RlZiBpc19leGVjdXRhYmxlX2ZpbGUoZmlsZW5hbWUpOgorICAgICIiIgorICAgIFJldHVybiAnVHJ1ZScgaWYgJ2ZpbGVuYW1lJyBuYW1lcyBhIHZhbGlkIGZpbGUgd2hpY2ggaXMgbGlrZWx5CisgICAgYW4gZXhlY3V0YWJsZS4gQSBmaWxlIGlzIGNvbnNpZGVyZWQgYW4gZXhlY3V0YWJsZSBpZiBpdCBzdGFydHMgd2l0aCB0aGUKKyAgICBtYWdpYyBieXRlcyBmb3IgYSBFWEUsIE1hY2ggTywgb3IgRUxGIGZpbGUuCisgICAgIiIiCisgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCBtb2RlPSdyYicpIGFzIGY6CisgICAgICAgIG1hZ2ljX2J5dGVzID0gZi5yZWFkKF9udW1fbWFnaWNfYnl0ZXMpCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICByZXR1cm4gbWFnaWNfYnl0ZXMgaW4gWworICAgICAgICAgICAgYidceGZlXHhlZFx4ZmFceGNlJywgICMgTUhfTUFHSUMKKyAgICAgICAgICAgIGInXHhjZVx4ZmFceGVkXHhmZScsICAjIE1IX0NJR0FNCisgICAgICAgICAgICBiJ1x4ZmVceGVkXHhmYVx4Y2YnLCAgIyBNSF9NQUdJQ182NAorICAgICAgICAgICAgYidceGNmXHhmYVx4ZWRceGZlJywgICMgTUhfQ0lHQU1fNjQKKyAgICAgICAgICAgIGInXHhjYVx4ZmVceGJhXHhiZScsICAjIEZBVF9NQUdJQworICAgICAgICAgICAgYidceGJlXHhiYVx4ZmVceGNhJyAgICMgRkFUX0NJR0FNCisgICAgICAgIF0KKyAgICBlbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKKyAgICAgICAgcmV0dXJuIG1hZ2ljX2J5dGVzID09IGInTVonCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIG1hZ2ljX2J5dGVzID09IGInXHg3RkVMRicKKworCitkZWYgaXNfanNvbl9maWxlKGZpbGVuYW1lKToKKyAgICAiIiIKKyAgICBSZXR1cm5zICdUcnVlJyBpZiAnZmlsZW5hbWUnIG5hbWVzIGEgdmFsaWQgSlNPTiBvdXRwdXQgZmlsZS4KKyAgICAnRmFsc2UnIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3InKSBhcyBmOgorICAgICAgICAgICAganNvbi5sb2FkKGYpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgY2xhc3NpZnlfaW5wdXRfZmlsZShmaWxlbmFtZSk6CisgICAgIiIiCisgICAgUmV0dXJuIGEgdHVwbGUgKHR5cGUsIG1zZykgd2hlcmUgJ3R5cGUnIHNwZWNpZmllcyB0aGUgY2xhc3NpZmllZCB0eXBlCisgICAgb2YgJ2ZpbGVuYW1lJy4gSWYgJ3R5cGUnIGlzICdJVF9JbnZhbGlkJyB0aGVuICdtc2cnIGlzIGEgaHVtYW4gcmVhZGFibGUKKyAgICBzdHJpbmcgcmVwcmVzZXRpbmcgdGhlIGVycm9yLgorICAgICIiIgorICAgIGZ0eXBlID0gSVRfSW52YWxpZAorICAgIGVycl9tc2cgPSBOb25lCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKKyAgICAgICAgZXJyX21zZyA9ICInJXMnIGRvZXMgbm90IGV4aXN0IiAlIGZpbGVuYW1lCisgICAgZWxpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgorICAgICAgICBlcnJfbXNnID0gIiclcycgZG9lcyBub3QgbmFtZSBhIGZpbGUiICUgZmlsZW5hbWUKKyAgICBlbGlmIGlzX2V4ZWN1dGFibGVfZmlsZShmaWxlbmFtZSk6CisgICAgICAgIGZ0eXBlID0gSVRfRXhlY3V0YWJsZQorICAgIGVsaWYgaXNfanNvbl9maWxlKGZpbGVuYW1lKToKKyAgICAgICAgZnR5cGUgPSBJVF9KU09OCisgICAgZWxzZToKKyAgICAgICAgZXJyX21zZyA9ICInJXMnIGRvZXMgbm90IG5hbWUgYSB2YWxpZCBiZW5jaG1hcmsgZXhlY3V0YWJsZSBvciBKU09OIGZpbGUiICUgZmlsZW5hbWUKKyAgICByZXR1cm4gZnR5cGUsIGVycl9tc2cKKworCitkZWYgY2hlY2tfaW5wdXRfZmlsZShmaWxlbmFtZSk6CisgICAgIiIiCisgICAgQ2xhc3NpZnkgdGhlIGZpbGUgbmFtZWQgYnkgJ2ZpbGVuYW1lJyBhbmQgcmV0dXJuIHRoZSBjbGFzc2lmaWNhdGlvbi4KKyAgICBJZiB0aGUgZmlsZSBpcyBjbGFzc2lmaWVkIGFzICdJVF9JbnZhbGlkJyBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0CisgICAgdGhlIHByb2dyYW0uCisgICAgIiIiCisgICAgZnR5cGUsIG1zZyA9IGNsYXNzaWZ5X2lucHV0X2ZpbGUoZmlsZW5hbWUpCisgICAgaWYgZnR5cGUgPT0gSVRfSW52YWxpZDoKKyAgICAgICAgcHJpbnQoIkludmFsaWQgaW5wdXQgZmlsZTogJXMiICUgbXNnKQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIHJldHVybiBmdHlwZQorCisKK2RlZiBmaW5kX2JlbmNobWFya19mbGFnKHByZWZpeCwgYmVuY2htYXJrX2ZsYWdzKToKKyAgICAiIiIKKyAgICBTZWFyY2ggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGZsYWdzIGZvciBhIGZsYWcgbWF0Y2hpbmcgYDxwcmVmaXg+PGFyZz5gIGFuZAorICAgIGlmIGl0IGlzIGZvdW5kIHJldHVybiB0aGUgYXJnIGl0IHNwZWNpZmllcy4gSWYgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIHRoZQorICAgIGxhc3QgdmFsdWUgaXMgcmV0dXJuZWQuIElmIHRoZSBmbGFnIGlzIG5vdCBmb3VuZCBOb25lIGlzIHJldHVybmVkLgorICAgICIiIgorICAgIGFzc2VydCBwcmVmaXguc3RhcnRzd2l0aCgnLS0nKSBhbmQgcHJlZml4LmVuZHN3aXRoKCc9JykKKyAgICByZXN1bHQgPSBOb25lCisgICAgZm9yIGYgaW4gYmVuY2htYXJrX2ZsYWdzOgorICAgICAgICBpZiBmLnN0YXJ0c3dpdGgocHJlZml4KToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZbbGVuKHByZWZpeCk6XQorICAgIHJldHVybiByZXN1bHQKKworCitkZWYgcmVtb3ZlX2JlbmNobWFya19mbGFncyhwcmVmaXgsIGJlbmNobWFya19mbGFncyk6CisgICAgIiIiCisgICAgUmV0dXJuIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGJlbmNobWFya19mbGFncyBleGNlcHQgdGhvc2UKKyAgICB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LgorICAgICIiIgorICAgIGFzc2VydCBwcmVmaXguc3RhcnRzd2l0aCgnLS0nKSBhbmQgcHJlZml4LmVuZHN3aXRoKCc9JykKKyAgICByZXR1cm4gW2YgZm9yIGYgaW4gYmVuY2htYXJrX2ZsYWdzIGlmIG5vdCBmLnN0YXJ0c3dpdGgocHJlZml4KV0KKworCitkZWYgbG9hZF9iZW5jaG1hcmtfcmVzdWx0cyhmbmFtZSk6CisgICAgIiIiCisgICAgUmVhZCBiZW5jaG1hcmsgb3V0cHV0IGZyb20gYSBmaWxlIGFuZCByZXR1cm4gdGhlIEpTT04gb2JqZWN0LgorICAgIFJFUVVJUkVTOiAnZm5hbWUnIG5hbWVzIGEgZmlsZSBjb250YWluaW5nIEpTT04gYmVuY2htYXJrIG91dHB1dC4KKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oZm5hbWUsICdyJykgYXMgZjoKKyAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmKQorCisKK2RlZiBydW5fYmVuY2htYXJrKGV4ZV9uYW1lLCBiZW5jaG1hcmtfZmxhZ3MpOgorICAgICIiIgorICAgIFJ1biBhIGJlbmNobWFyayBzcGVjaWZpZWQgYnkgJ2V4ZV9uYW1lJyB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAnYmVuY2htYXJrX2ZsYWdzJy4gVGhlIGJlbmNobWFyayBpcyBydW4gZGlyZWN0bHkgYXMgYSBzdWJwcm9jZXNzIHRvIHByZXNlcnZlCisgICAgcmVhbCB0aW1lIGNvbnNvbGUgb3V0cHV0LgorICAgIFJFVFVSTlM6IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBiZW5jaG1hcmsgb3V0cHV0CisgICAgIiIiCisgICAgb3V0cHV0X25hbWUgPSBmaW5kX2JlbmNobWFya19mbGFnKCctLWJlbmNobWFya19vdXQ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVuY2htYXJrX2ZsYWdzKQorICAgIGlzX3RlbXBfb3V0cHV0ID0gRmFsc2UKKyAgICBpZiBvdXRwdXRfbmFtZSBpcyBOb25lOgorICAgICAgICBpc190ZW1wX291dHB1dCA9IFRydWUKKyAgICAgICAgdGhhbmRsZSwgb3V0cHV0X25hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuY2xvc2UodGhhbmRsZSkKKyAgICAgICAgYmVuY2htYXJrX2ZsYWdzID0gbGlzdChiZW5jaG1hcmtfZmxhZ3MpICsgXAorICAgICAgICAgICAgWyctLWJlbmNobWFya19vdXQ9JXMnICUgb3V0cHV0X25hbWVdCisKKyAgICBjbWQgPSBbZXhlX25hbWVdICsgYmVuY2htYXJrX2ZsYWdzCisgICAgcHJpbnQoIlJVTk5JTkc6ICVzIiAlICcgJy5qb2luKGNtZCkpCisgICAgZXhpdENvZGUgPSBzdWJwcm9jZXNzLmNhbGwoY21kKQorICAgIGlmIGV4aXRDb2RlICE9IDA6CisgICAgICAgIHByaW50KCdURVNUIEZBSUxFRC4uLicpCisgICAgICAgIHN5cy5leGl0KGV4aXRDb2RlKQorICAgIGpzb25fcmVzID0gbG9hZF9iZW5jaG1hcmtfcmVzdWx0cyhvdXRwdXRfbmFtZSkKKyAgICBpZiBpc190ZW1wX291dHB1dDoKKyAgICAgICAgb3MudW5saW5rKG91dHB1dF9uYW1lKQorICAgIHJldHVybiBqc29uX3JlcworCisKK2RlZiBydW5fb3JfbG9hZF9iZW5jaG1hcmsoZmlsZW5hbWUsIGJlbmNobWFya19mbGFncyk6CisgICAgIiIiCisgICAgR2V0IHRoZSByZXN1bHRzIGZvciBhIHNwZWNpZmllZCBiZW5jaG1hcmsuIElmICdmaWxlbmFtZScgc3BlY2lmaWVzCisgICAgYW4gZXhlY3V0YWJsZSBiZW5jaG1hcmsgdGhlbiB0aGUgcmVzdWx0cyBhcmUgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgdGhlCisgICAgYmVuY2htYXJrLiBPdGhlcndpc2UgJ2ZpbGVuYW1lJyBtdXN0IG5hbWUgYSB2YWxpZCBKU09OIG91dHB1dCBmaWxlLAorICAgIHdoaWNoIGlzIGxvYWRlZCBhbmQgdGhlIHJlc3VsdCByZXR1cm5lZC4KKyAgICAiIiIKKyAgICBmdHlwZSA9IGNoZWNrX2lucHV0X2ZpbGUoZmlsZW5hbWUpCisgICAgaWYgZnR5cGUgPT0gSVRfSlNPTjoKKyAgICAgICAgcmV0dXJuIGxvYWRfYmVuY2htYXJrX3Jlc3VsdHMoZmlsZW5hbWUpCisgICAgZWxpZiBmdHlwZSA9PSBJVF9FeGVjdXRhYmxlOgorICAgICAgICByZXR1cm4gcnVuX2JlbmNobWFyayhmaWxlbmFtZSwgYmVuY2htYXJrX2ZsYWdzKQorICAgIGVsc2U6CisgICAgICAgIGFzc2VydCBGYWxzZSAgIyBUaGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvc3RyaXBfYXNtLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2dvb2dsZV9iZW5jaG1hcmsvdG9vbHMvc3RyaXBfYXNtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwMzA1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ29vZ2xlX2JlbmNobWFyay90b29scy9zdHJpcF9hc20ucHkKQEAgLTAsMCArMSwxNTEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiIKK3N0cmlwX2FzbS5weSAtIENsZWFudXAgQVNNIG91dHB1dCBmb3IgdGhlIHNwZWNpZmllZCBmaWxlCisiIiIKKworZnJvbSBhcmdwYXJzZSBpbXBvcnQgQXJndW1lbnRQYXJzZXIKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHJlCisKK2RlZiBmaW5kX3VzZWRfbGFiZWxzKGFzbSk6CisgICAgZm91bmQgPSBzZXQoKQorICAgIGxhYmVsX3JlID0gcmUuY29tcGlsZSgiXHMqalthLXpdK1xzK1wuTChbYS16QS1aMC05XVthLXpBLVowLTlfXSopIikKKyAgICBmb3IgbCBpbiBhc20uc3BsaXRsaW5lcygpOgorICAgICAgICBtID0gbGFiZWxfcmUubWF0Y2gobCkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGZvdW5kLmFkZCgnLkwlcycgJSBtLmdyb3VwKDEpKQorICAgIHJldHVybiBmb3VuZAorCisKK2RlZiBub3JtYWxpemVfbGFiZWxzKGFzbSk6CisgICAgZGVjbHMgPSBzZXQoKQorICAgIGxhYmVsX2RlY2wgPSByZS5jb21waWxlKCJeWy5dezAsMX1MKFthLXpBLVowLTldW2EtekEtWjAtOV9dKikoPz06KSIpCisgICAgZm9yIGwgaW4gYXNtLnNwbGl0bGluZXMoKToKKyAgICAgICAgbSA9IGxhYmVsX2RlY2wubWF0Y2gobCkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGRlY2xzLmFkZChtLmdyb3VwKDApKQorICAgIGlmIGxlbihkZWNscykgPT0gMDoKKyAgICAgICAgcmV0dXJuIGFzbQorICAgIG5lZWRzX2RvdCA9IG5leHQoaXRlcihkZWNscykpWzBdICE9ICcuJworICAgIGlmIG5vdCBuZWVkc19kb3Q6CisgICAgICAgIHJldHVybiBhc20KKyAgICBmb3IgbGQgaW4gZGVjbHM6CisgICAgICAgIGFzbSA9IHJlLnN1YigiKF58XHMrKSIgKyBsZCArICIoPz06fFxzKSIsICdcXDEuJyArIGxkLCBhc20pCisgICAgcmV0dXJuIGFzbQorCisKK2RlZiB0cmFuc2Zvcm1fbGFiZWxzKGFzbSk6CisgICAgYXNtID0gbm9ybWFsaXplX2xhYmVscyhhc20pCisgICAgdXNlZF9kZWNscyA9IGZpbmRfdXNlZF9sYWJlbHMoYXNtKQorICAgIG5ld19hc20gPSAnJworICAgIGxhYmVsX2RlY2wgPSByZS5jb21waWxlKCJeXC5MKFthLXpBLVowLTldW2EtekEtWjAtOV9dKikoPz06KSIpCisgICAgZm9yIGwgaW4gYXNtLnNwbGl0bGluZXMoKToKKyAgICAgICAgbSA9IGxhYmVsX2RlY2wubWF0Y2gobCkKKyAgICAgICAgaWYgbm90IG0gb3IgbS5ncm91cCgwKSBpbiB1c2VkX2RlY2xzOgorICAgICAgICAgICAgbmV3X2FzbSArPSBsCisgICAgICAgICAgICBuZXdfYXNtICs9ICdcbicKKyAgICByZXR1cm4gbmV3X2FzbQorCisKK2RlZiBpc19pZGVudGlmaWVyKHRrKToKKyAgICBpZiBsZW4odGspID09IDA6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZpcnN0ID0gdGtbMF0KKyAgICBpZiBub3QgZmlyc3QuaXNhbHBoYSgpIGFuZCBmaXJzdCAhPSAnXyc6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbih0aykpOgorICAgICAgICBjID0gdGtbaV0KKyAgICAgICAgaWYgbm90IGMuaXNhbG51bSgpIGFuZCBjICE9ICdfJzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKK2RlZiBwcm9jZXNzX2lkZW50aWZpZXJzKGwpOgorICAgICIiIgorICAgIHByb2Nlc3NfaWRlbnRpZmllcnMgLSBwcm9jZXNzIGFsbCBpZGVudGlmaWVycyBhbmQgbW9kaWZ5IHRoZW0gdG8gaGF2ZQorICAgIGNvbnNpc3RlbnQgbmFtZXMgYWNyb3NzIGFsbCBwbGF0Zm9ybXM7IHNwZWNpZmljYWxseSBhY3Jvc3MgRUxGIGFuZCBNYWNoTy4KKyAgICBGb3IgZXhhbXBsZSwgTWFjaE8gaW5zZXJ0cyBhbiBhZGRpdGlvbmFsIHVuZGVyc3RvcmUgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgIG5hbWVzLiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhhdC4KKyAgICAiIiIKKyAgICBwYXJ0cyA9IHJlLnNwbGl0KHInKFthLXpBLVowLTlfXSspJywgbCkKKyAgICBuZXdfbGluZSA9ICcnCisgICAgZm9yIHRrIGluIHBhcnRzOgorICAgICAgICBpZiBpc19pZGVudGlmaWVyKHRrKToKKyAgICAgICAgICAgIGlmIHRrLnN0YXJ0c3dpdGgoJ19fWicpOgorICAgICAgICAgICAgICAgIHRrID0gdGtbMTpdCisgICAgICAgICAgICBlbGlmIHRrLnN0YXJ0c3dpdGgoJ18nKSBhbmQgbGVuKHRrKSA+IDEgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgdGtbMV0uaXNhbHBoYSgpIGFuZCB0a1sxXSAhPSAnWic6CisgICAgICAgICAgICAgICAgdGsgPSB0a1sxOl0KKyAgICAgICAgbmV3X2xpbmUgKz0gdGsKKyAgICByZXR1cm4gbmV3X2xpbmUKKworCitkZWYgcHJvY2Vzc19hc20oYXNtKToKKyAgICAiIiIKKyAgICBTdHJpcCB0aGUgQVNNIG9mIHVud2FudGVkIGRpcmVjdGl2ZXMgYW5kIGxpbmVzCisgICAgIiIiCisgICAgbmV3X2NvbnRlbnRzID0gJycKKyAgICBhc20gPSB0cmFuc2Zvcm1fbGFiZWxzKGFzbSkKKworICAgICMgVE9ETzogQWRkIG1vcmUgdGhpbmdzIHdlIHdhbnQgdG8gcmVtb3ZlCisgICAgZGlzY2FyZF9yZWdleGVzID0gWworICAgICAgICByZS5jb21waWxlKCJccytcLi4qJCIpLCAjIGRpcmVjdGl2ZQorICAgICAgICByZS5jb21waWxlKCJccyojKE5PX0FQUHxBUFApJCIpLCAjaW5saW5lIEFTTQorICAgICAgICByZS5jb21waWxlKCJccyojLiokIiksICMgY29tbWVudCBsaW5lCisgICAgICAgIHJlLmNvbXBpbGUoIlxzKlwuZ2xvYmE/bFxzKihbLmEtekEtWl9dW2EtekEtWjAtOSRfLl0qKSIpLCAjZ2xvYmFsIGRpcmVjdGl2ZQorICAgICAgICByZS5jb21waWxlKCJccypcLihzdHJpbmd8YXNjaXp8YXNjaWl8WzEyNDhdP2J5dGV8c2hvcnR8d29yZHxsb25nfHF1YWR8dmFsdWV8emVybykiKSwKKyAgICBdCisgICAga2VlcF9yZWdleGVzID0gWworCisgICAgXQorICAgIGZuX2xhYmVsX2RlZiA9IHJlLmNvbXBpbGUoIl5bYS16QS1aX11bYS16QS1aMC05Xy5dKjoiKQorICAgIGZvciBsIGluIGFzbS5zcGxpdGxpbmVzKCk6CisgICAgICAgICMgUmVtb3ZlIE1hY2gtTyBhdHRyaWJ1dGUKKyAgICAgICAgbCA9IGwucmVwbGFjZSgnQEdPVFBDUkVMJywgJycpCisgICAgICAgIGFkZF9saW5lID0gVHJ1ZQorICAgICAgICBmb3IgcmVnIGluIGRpc2NhcmRfcmVnZXhlczoKKyAgICAgICAgICAgIGlmIHJlZy5tYXRjaChsKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBhZGRfbGluZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZm9yIHJlZyBpbiBrZWVwX3JlZ2V4ZXM6CisgICAgICAgICAgICBpZiByZWcubWF0Y2gobCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYWRkX2xpbmUgPSBUcnVlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgYWRkX2xpbmU6CisgICAgICAgICAgICBpZiBmbl9sYWJlbF9kZWYubWF0Y2gobCkgYW5kIGxlbihuZXdfY29udGVudHMpICE9IDA6CisgICAgICAgICAgICAgICAgbmV3X2NvbnRlbnRzICs9ICdcbicKKyAgICAgICAgICAgIGwgPSBwcm9jZXNzX2lkZW50aWZpZXJzKGwpCisgICAgICAgICAgICBuZXdfY29udGVudHMgKz0gbAorICAgICAgICAgICAgbmV3X2NvbnRlbnRzICs9ICdcbicKKyAgICByZXR1cm4gbmV3X2NvbnRlbnRzCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gQXJndW1lbnRQYXJzZXIoCisgICAgICAgIGRlc2NyaXB0aW9uPSdnZW5lcmF0ZSBhIHN0cmlwcGVkIGFzc2VtYmx5IGZpbGUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICdpbnB1dCcsIG1ldGF2YXI9J2lucHV0JywgdHlwZT1zdHIsIG5hcmdzPTEsCisgICAgICAgIGhlbHA9J0FuIGlucHV0IGFzc2VtYmx5IGZpbGUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICdvdXQnLCBtZXRhdmFyPSdvdXRwdXQnLCB0eXBlPXN0ciwgbmFyZ3M9MSwKKyAgICAgICAgaGVscD0nVGhlIG91dHB1dCBmaWxlJykKKyAgICBhcmdzLCB1bmtub3duX2FyZ3MgPSBwYXJzZXIucGFyc2Vfa25vd25fYXJncygpCisgICAgaW5wdXQgPSBhcmdzLmlucHV0WzBdCisgICAgb3V0cHV0ID0gYXJncy5vdXRbMF0KKyAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoaW5wdXQpOgorICAgICAgICBwcmludCgoIkVSUk9SOiBpbnB1dCBmaWxlICclcycgZG9lcyBub3QgZXhpc3QiKSAlIGlucHV0KQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGNvbnRlbnRzID0gTm9uZQorICAgIHdpdGggb3BlbihpbnB1dCwgJ3InKSBhcyBmOgorICAgICAgICBjb250ZW50cyA9IGYucmVhZCgpCisgICAgbmV3X2NvbnRlbnRzID0gcHJvY2Vzc19hc20oY29udGVudHMpCisgICAgd2l0aCBvcGVuKG91dHB1dCwgJ3cnKSBhcyBmOgorICAgICAgICBmLndyaXRlKG5ld19jb250ZW50cykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQorCisjIHZpbTogdGFic3RvcD00IGV4cGFuZHRhYiBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NAorIyBrYXRlOiB0YWItd2lkdGg6IDQ7IHJlcGxhY2UtdGFicyBvbjsgaW5kZW50LXdpZHRoIDQ7IHRhYi1pbmRlbnRzOiBvZmY7CisjIGthdGU6IGluZGVudC1tb2RlIHB5dGhvbjsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlcyBtb2RpZmllZDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL2NvbW1vbi9wdXRpbC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS9jb21tb24vcHV0aWwuY3BwCmluZGV4IDFhNGJlYjUuLmIwN2U1NWIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL2NvbW1vbi9wdXRpbC5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvY29tbW9uL3B1dGlsLmNwcApAQCAtMTIwNywxNCArMTIwNywxMiBAQAogICAgICAgICB9CiAgICAgICAgIHVwcnZfc3RyY3B5KG5ld0RhdGFEaXIsIGRpcmVjdG9yeSk7CiAKLSNpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgKnA7Ci0gICAgICAgICAgICB3aGlsZShwID0gdXBydl9zdHJjaHIobmV3RGF0YURpciwgVV9GSUxFX0FMVF9TRVBfQ0hBUikpIHsKLSAgICAgICAgICAgICAgICAqcCA9IFVfRklMRV9TRVBfQ0hBUjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKFVfRklMRV9TRVBfQ0hBUiAhPSBVX0ZJTEVfQUxUX1NFUF9DSEFSKSB7CisgICAgICAgICAgY2hhciogcDsKKyAgICAgICAgICB3aGlsZSAoKHAgPSB1cHJ2X3N0cmNocihuZXdEYXRhRGlyLCBVX0ZJTEVfQUxUX1NFUF9DSEFSKSkpIHsKKyAgICAgICAgICAgICpwID0gVV9GSUxFX1NFUF9DSEFSOworICAgICAgICAgIH0KICAgICAgICAgfQotI2VuZGlmCiAgICAgfQogCiAgICAgaWYgKGdEYXRhRGlyZWN0b3J5ICYmICpnRGF0YURpcmVjdG9yeSkgewpAQCAtMTIzNSwxMSArMTIzMywxMSBAQAogICAgIHJldHVybiBUUlVFOwogICB9CiAKLSNpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIpCi0gIGlmKCpwYXRoID09IFVfRklMRV9BTFRfU0VQX0NIQVIpIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgaWYgKFVfRklMRV9TRVBfQ0hBUiAhPSBVX0ZJTEVfQUxUX1NFUF9DSEFSKSB7CisgICAgaWYgKCpwYXRoID09IFVfRklMRV9BTFRfU0VQX0NIQVIpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KICAgfQotI2VuZGlmCiAKICNpZiBVX1BMQVRGT1JNX1VTRVNfT05MWV9XSU4zMl9BUEkKICAgaWYoICgoKHBhdGhbMF0gPj0gJ0EnKSAmJiAocGF0aFswXSA8PSAnWicpKSB8fApAQCAtMTMzOCwxMiArMTMzNiwxMiBAQAogICAgIH0KICAgICBnVGltZVpvbmVGaWxlc0RpcmVjdG9yeS0+Y2xlYXIoKTsKICAgICBnVGltZVpvbmVGaWxlc0RpcmVjdG9yeS0+YXBwZW5kKHBhdGgsIHN0YXR1cyk7Ci0jaWYgKFVfRklMRV9TRVBfQ0hBUiAhPSBVX0ZJTEVfQUxUX1NFUF9DSEFSKQotICAgIGNoYXIgKnAgPSBnVGltZVpvbmVGaWxlc0RpcmVjdG9yeS0+ZGF0YSgpOwotICAgIHdoaWxlIChwID0gdXBydl9zdHJjaHIocCwgVV9GSUxFX0FMVF9TRVBfQ0hBUikpIHsKKyAgICBpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIpIHsKKyAgICAgIGNoYXIqIHAgPSBnVGltZVpvbmVGaWxlc0RpcmVjdG9yeS0+ZGF0YSgpOworICAgICAgd2hpbGUgKChwID0gdXBydl9zdHJjaHIocCwgVV9GSUxFX0FMVF9TRVBfQ0hBUikpKSB7CiAgICAgICAgICpwID0gVV9GSUxFX1NFUF9DSEFSOworICAgICAgfQogICAgIH0KLSNlbmRpZgogfQogCiAjZGVmaW5lIFRPX1NUUklORyh4KSBUT19TVFJJTkdfMih4KSAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL2NvbW1vbi91ZGF0YS5jcHAgYi9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS9jb21tb24vdWRhdGEuY3BwCmluZGV4IDMzOTI5MmEuLjAwNmUzYjIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL2NvbW1vbi91ZGF0YS5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvY29tbW9uL3VkYXRhLmNwcApAQCAtMTE1MiwyMyArMTE1MiwyNSBAQAogICAgICAgaXNJQ1VEYXRhID0gVFJVRTsKICAgICB9CiAKLSNpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIpICAvKiBXaW5kb3dzOiAgdHJ5ICJmb29cYmFyIiBhbmQgImZvby9iYXIiICovCisgICAgLyogV2luZG93czogIHRyeSAiZm9vXGJhciIgYW5kICJmb28vYmFyIiAqLwogICAgIC8qIHJlbWFwIGZyb20gYWx0ZXJuYXRlIHBhdGggY2hhciB0byB0aGUgbWFpbiBvbmUgKi8KLSAgICBDaGFyU3RyaW5nIGFsdFNlcFBhdGg7Ci0gICAgaWYocGF0aCkgewotICAgICAgICBpZih1cHJ2X3N0cmNocihwYXRoLFVfRklMRV9BTFRfU0VQX0NIQVIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFsdFNlcFBhdGguYXBwZW5kKHBhdGgsICpwRXJyb3JDb2RlKTsKLSAgICAgICAgICAgIGNoYXIgKnA7Ci0gICAgICAgICAgICB3aGlsZSgocD11cHJ2X3N0cmNocihhbHRTZXBQYXRoLmRhdGEoKSwgVV9GSUxFX0FMVF9TRVBfQ0hBUikpKSB7Ci0gICAgICAgICAgICAgICAgKnAgPSBVX0ZJTEVfU0VQX0NIQVI7Ci0gICAgICAgICAgICB9Ci0jaWYgZGVmaW5lZCAoVURBVEFfREVCVUcpCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNoYW5nZWQgcGF0aCBmcm9tIFslc10gdG8gWyVzXVxuIiwgcGF0aCwgYWx0U2VwUGF0aC5zKTsKKyAgICBpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIpIHsKKyAgICAgIENoYXJTdHJpbmcgYWx0U2VwUGF0aDsKKyAgICAgIGlmIChwYXRoKSB7CisgICAgICAgIGlmICh1cHJ2X3N0cmNocihwYXRoLCBVX0ZJTEVfQUxUX1NFUF9DSEFSKSAhPSBOVUxMKSB7CisgICAgICAgICAgYWx0U2VwUGF0aC5hcHBlbmQocGF0aCwgKnBFcnJvckNvZGUpOworICAgICAgICAgIGNoYXIqIHA7CisgICAgICAgICAgd2hpbGUgKChwID0gdXBydl9zdHJjaHIoYWx0U2VwUGF0aC5kYXRhKCksIFVfRklMRV9BTFRfU0VQX0NIQVIpKSkgeworICAgICAgICAgICAgKnAgPSBVX0ZJTEVfU0VQX0NIQVI7CisgICAgICAgICAgfQorI2lmIGRlZmluZWQoVURBVEFfREVCVUcpCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDaGFuZ2VkIHBhdGggZnJvbSBbJXNdIHRvIFslc11cbiIsIHBhdGgsCisgICAgICAgICAgICAgICAgICBhbHRTZXBQYXRoLnMpOwogI2VuZGlmCi0gICAgICAgICAgICBwYXRoID0gYWx0U2VwUGF0aC5kYXRhKCk7CisgICAgICAgICAgcGF0aCA9IGFsdFNlcFBhdGguZGF0YSgpOwogICAgICAgICB9CisgICAgICB9CiAgICAgfQotI2VuZGlmCiAKICAgICBDaGFyU3RyaW5nIHRvY0VudHJ5TmFtZTsgLyogZW50cnkgbmFtZSBpbiB0cmVlIGZvcm1hdC4gZXg6ICAnaWN1ZHQyOGIvY29sbC9hci5yZXMnICovCiAgICAgQ2hhclN0cmluZyB0b2NFbnRyeVBhdGg7IC8qIGVudHJ5IG5hbWUgaW4gcGF0aCBmb3JtYXQuIGV4OiAgJ2ljdWR0MjhiXFxjb2xsXFxhci5yZXMnICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS90ZXN0L2NpbnRsdHN0L2NyZXN0c3RuLmMgYi9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS90ZXN0L2NpbnRsdHN0L2NyZXN0c3RuLmMKaW5kZXggYTE3MjcwYS4uMjZkMGJhZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdGVzdC9jaW50bHRzdC9jcmVzdHN0bi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL3Rlc3QvY2ludGx0c3QvY3Jlc3RzdG4uYwpAQCAtMTAwMCw4ICsxMDAwLDcgQEAKICAgICB1dGVzdGRhdGFwYXRoID0gKFVDaGFyKikgbWFsbG9jKChsZW4rMTApKnNpemVvZihVQ2hhcikpOwogCiAgICAgdV9jaGFyc1RvVUNoYXJzKHRlc3RkYXRhcGF0aCwgdXRlc3RkYXRhcGF0aCwgKGludDMyX3Qpc3RybGVuKHRlc3RkYXRhcGF0aCkrMSk7Ci0jaWYgKFVfRklMRV9TRVBfQ0hBUiAhPSBVX0ZJTEVfQUxUX1NFUF9DSEFSKSAmJiBVX0ZJTEVfU0VQX0NIQVIgPT0gJ1xcJwotICAgIHsKKyAgICBpZiAoKFVfRklMRV9TRVBfQ0hBUiAhPSBVX0ZJTEVfQUxUX1NFUF9DSEFSKSAmJiBVX0ZJTEVfU0VQX0NIQVIgPT0gJ1xcJykgewogICAgICAgICAvKiBDb252ZXJ0IGFsbCBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMgc28gdGhhdCB3ZSBjYW4gbWFrZSBzdXJlIHRoYXQgdXJlc19vcGVuVQogICAgICAgICAgICBjYW4gaGFuZGxlIGludmFyaWFudCBjaGFyYWN0ZXJzLiAqLwogICAgICAgICBVQ2hhciAqYmFja3NsYXNoOwpAQCAtMTAwOSw3ICsxMDA4LDYgQEAKICAgICAgICAgICAgICpiYWNrc2xhc2ggPSAweDAwMkY7CiAgICAgICAgIH0KICAgICB9Ci0jZW5kaWYKIAogICAgIHVfbWVtc2V0KGxhcmdlQnVmZmVyLCAweDAwMzAsIHNpemVvZihsYXJnZUJ1ZmZlcikvc2l6ZW9mKGxhcmdlQnVmZmVyWzBdKSk7CiAgICAgbGFyZ2VCdWZmZXJbc2l6ZW9mKGxhcmdlQnVmZmVyKS9zaXplb2YobGFyZ2VCdWZmZXJbMF0pLTFdID0gMDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL3Rvb2xzL2dlbnJiL2RlcmIuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvZ2VucmIvZGVyYi5jcHAKaW5kZXggMWY2YTJkZS4uOWEzNjRmOSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvZ2VucmIvZGVyYi5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvZ2VucmIvZGVyYi5jcHAKQEAgLTg1LDExICs4NSwxMSBAQAogCiAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRvb2wuICovCiAgICAgcG5hbWUgPSB1cHJ2X3N0cnJjaHIoKmFyZ3YsIFVfRklMRV9TRVBfQ0hBUik7Ci0jaWYgVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIKLSAgICBpZiAoIXBuYW1lKSB7CisgICAgaWYgKFVfRklMRV9TRVBfQ0hBUiAhPSBVX0ZJTEVfQUxUX1NFUF9DSEFSKSB7CisgICAgICBpZiAoIXBuYW1lKSB7CiAgICAgICAgIHBuYW1lID0gdXBydl9zdHJyY2hyKCphcmd2LCBVX0ZJTEVfQUxUX1NFUF9DSEFSKTsKKyAgICAgIH0KICAgICB9Ci0jZW5kaWYKICAgICBpZiAoIXBuYW1lKSB7CiAgICAgICAgIHBuYW1lID0gKmFyZ3Y7CiAgICAgfSBlbHNlIHsKQEAgLTIxNCwxMSArMjE0LDExIEBACiAgICAgICAgICAgICAgICAgdGhlbmFtZSA9IGFyZzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcSA9IHVwcnZfc3RycmNocihhcmcsIFVfRklMRV9TRVBfQ0hBUik7Ci0jaWYgVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIKLSAgICAgICAgICAgICAgICBpZiAocSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFVfRklMRV9TRVBfQ0hBUiAhPSBVX0ZJTEVfQUxUX1NFUF9DSEFSKSB7CisgICAgICAgICAgICAgICAgICBpZiAocSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHEgPSB1cHJ2X3N0cnJjaHIoYXJnLCBVX0ZJTEVfQUxUX1NFUF9DSEFSKTsKKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgICAgICAgICBpbmZpbGUuYXBwZW5kKGlucHV0RGlyLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIGlmKHEgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpbmZpbGUuYXBwZW5kUGF0aFBhcnQoaWN1OjpTdHJpbmdQaWVjZShhcmcsIChpbnQzMl90KShxIC0gYXJnKSksIHN0YXR1cyk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS90b29scy9wa2dkYXRhL3BrZ3R5cGVzLmMgYi9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS90b29scy9wa2dkYXRhL3BrZ3R5cGVzLmMKaW5kZXggMjc2OWU0NS4uNmQzNGM0YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvcGtnZGF0YS9wa2d0eXBlcy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL3Rvb2xzL3BrZ2RhdGEvcGtndHlwZXMuYwpAQCAtMjEwLDggKzIxMCw3IEBACiAgICAgY2hhciBhQnVmWzEwMjRdOwogICAgIGNoYXIgKnJQdHI7CiAgICAgclB0ciA9IHVwcnZfc3RycmNocihzdHJBbGlhcywgVV9GSUxFX1NFUF9DSEFSKTsKLSNpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIpCi0gICAgeworICAgIGlmIChVX0ZJTEVfU0VQX0NIQVIgIT0gVV9GSUxFX0FMVF9TRVBfQ0hBUikgewogICAgICAgICBjaGFyICphUHRyID0gdXBydl9zdHJyY2hyKHN0ckFsaWFzLCBVX0ZJTEVfQUxUX1NFUF9DSEFSKTsKICAgICAgICAgaWYoIXJQdHIgfHwgLyogcmVndWxhciBjaGFyIHdhc24ndCBmb3VuZCBvci4uICovCiAgICAgICAgICAgICAoYVB0ciAmJiAoYVB0ciA+IHJQdHIpKSkKQEAgLTIxOSw3ICsyMTgsNiBAQAogICAgICAgICAgICAgclB0ciA9IGFQdHI7IC8qIG1heSBjb3B5IE5VTEwgd2hpY2ggaXMgT0sgKi8KICAgICAgICAgfQogICAgIH0KLSNlbmRpZgogICAgIGlmKCFyUHRyKSB7CiAgICAgICAgIHJldHVybiBsOyAvKiBubyBkaXIgcGF0aCAqLwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL3Rvb2xzL3Rvb2x1dGlsL3BhY2thZ2UuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvdG9vbHV0aWwvcGFja2FnZS5jcHAKaW5kZXggNzM2OTA2OC4uNWUzMmJkNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvdG9vbHV0aWwvcGFja2FnZS5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvdG9vbHV0aWwvcGFja2FnZS5jcHAKQEAgLTIwOSw5ICsyMDksNiBAQAogLyoKICAqIFR1cm4gdHJlZSBzZXBhcmF0b3JzIGFuZCBhbHRlcm5hdGUgZmlsZSBzZXBhcmF0b3JzIGludG8gbm9ybWFsIGZpbGUgc2VwYXJhdG9ycy4KICAqLwotI2lmIFVfVFJFRV9FTlRSWV9TRVBfQ0hBUj09VV9GSUxFX1NFUF9DSEFSICYmIFVfRklMRV9BTFRfU0VQX0NIQVI9PVVfRklMRV9TRVBfQ0hBUgotI2RlZmluZSB0cmVlVG9QYXRoKHMpCi0jZWxzZQogc3RhdGljIHZvaWQKIHRyZWVUb1BhdGgoY2hhciAqcykgewogICAgIGNoYXIgKnQ7CkBAIC0yMjIsMTQgKzIxOSwxMCBAQAogICAgICAgICB9CiAgICAgfQogfQotI2VuZGlmCiAKIC8qCiAgKiBUdXJuIGZpbGUgc2VwYXJhdG9ycyBpbnRvIHRyZWUgc2VwYXJhdG9ycy4KICAqLwotI2lmIFVfVFJFRV9FTlRSWV9TRVBfQ0hBUj09VV9GSUxFX1NFUF9DSEFSICYmIFVfRklMRV9BTFRfU0VQX0NIQVI9PVVfRklMRV9TRVBfQ0hBUgotI2RlZmluZSBwYXRoVG9UcmVlKHMpCi0jZWxzZQogc3RhdGljIHZvaWQKIHBhdGhUb1RyZWUoY2hhciAqcykgewogICAgIGNoYXIgKnQ7CkBAIC0yNDAsNyArMjMzLDYgQEAKICAgICAgICAgfQogICAgIH0KIH0KLSNlbmRpZgogCiAvKgogICogUHJlcGVuZCB0aGUgcGF0aCAoaWYgYW55KSB0byB0aGUgbmFtZSBhbmQgcnVuIHRoZSBuYW1lIHRocm91Z2ggdHJlZVRvTmFtZSgpLgpAQCAtMjczLDcgKzI2NSwxMCBAQAogICAgICAgICBleGl0KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsKICAgICB9CiAgICAgc3RyY3B5KHMsIG5hbWUpOwotICAgIHRyZWVUb1BhdGgocyk7CisgICAgaWYgKFVfVFJFRV9FTlRSWV9TRVBfQ0hBUiAhPSBVX0ZJTEVfU0VQX0NIQVIgfHwKKyAgICAgICAgVV9GSUxFX0FMVF9TRVBfQ0hBUiAhPSBVX0ZJTEVfU0VQX0NIQVIpIHsKKyAgICAgIHRyZWVUb1BhdGgocyk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZApAQCAtMTA0Myw3ICsxMDM4LDEwIEBACiAgICAgICAgIC8vIGNvcHkgdGhlIGl0ZW0ncyBuYW1lCiAgICAgICAgIGl0ZW1zW2lkeF0ubmFtZT1hbGxvY1N0cmluZyhUUlVFLCBzdHJsZW4obmFtZSkpOwogICAgICAgICBzdHJjcHkoaXRlbXNbaWR4XS5uYW1lLCBuYW1lKTsKLSAgICAgICAgcGF0aFRvVHJlZShpdGVtc1tpZHhdLm5hbWUpOworICAgICAgICBpZiAoVV9UUkVFX0VOVFJZX1NFUF9DSEFSICE9IFVfRklMRV9TRVBfQ0hBUiB8fAorICAgICAgICAgICAgVV9GSUxFX0FMVF9TRVBfQ0hBUiAhPSBVX0ZJTEVfU0VQX0NIQVIpIHsKKyAgICAgICAgICBwYXRoVG9UcmVlKGl0ZW1zW2lkeF0ubmFtZSk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBzYW1lLW5hbWUgaXRlbSBmb3VuZCwgcmVwbGFjZSBpdAogICAgICAgICBpZihpdGVtc1tpZHhdLmlzRGF0YU93bmVkKSB7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS90b29scy90b29sdXRpbC9wa2dfZ2VuY21uLmMgYi9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS90b29scy90b29sdXRpbC9wa2dfZ2VuY21uLmMKaW5kZXggMjVmMzYwOC4uODM5ZDk2YiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvdG9vbHV0aWwvcGtnX2dlbmNtbi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL3Rvb2xzL3Rvb2x1dGlsL3BrZ19nZW5jbW4uYwpAQCAtMTkyLDE0ICsxOTIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIGFkZCB0aGUgZmlsZSAqLwotI2lmIChVX0ZJTEVfU0VQX0NIQVIgIT0gVV9GSUxFX0FMVF9TRVBfQ0hBUikKLSAgICAgICAgeworICAgICAgICBpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfRklMRV9BTFRfU0VQX0NIQVIpIHsKICAgICAgICAgICBjaGFyICp0OwogICAgICAgICAgIHdoaWxlKCh0ID0gdXBydl9zdHJjaHIobGluZSxVX0ZJTEVfQUxUX1NFUF9DSEFSKSkpIHsKICAgICAgICAgICAgICp0ID0gVV9GSUxFX1NFUF9DSEFSOwogICAgICAgICAgIH0KICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgIGFkZEZpbGUoZ2V0TG9uZ1BhdGhuYW1lKGxpbmUpLCBuYW1lLCBzb3VyY2UsIHNvdXJjZVRPQywgdmVyYm9zZSk7CiAgICAgfQogCkBAIC01MjUsMjQgKzUyMywyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdoZW4gY29uZGl0aW9uYWwgY29kZSBiZWxvdyBpcyBub3QgY29tcGlsZWQuICAgICAgKi8KICAgICB1cHJ2X3N0cmNhdChmdWxsUGF0aCwgcGF0aCk7CiAKLSNpZiAoVV9GSUxFX0FMVF9TRVBfQ0hBUiAhPSBVX1RSRUVfRU5UUllfU0VQX0NIQVIpCi0jaWYgKFVfRklMRV9BTFRfU0VQX0NIQVIgIT0gVV9GSUxFX1NFUF9DSEFSKQotICAgIC8qIHJlcGxhY2UgdHJlZSBzZXBhcmF0b3IgKHN1Y2ggYXMgJy8nKSB3aXRoIGZpbGUgc2VwIGNoYXIgKHN1Y2ggYXMgJzonIG9yICdcXCcpICovCi0gICAgZm9yKDtmdWxsUGF0aFtuXTtuKyspIHsKLSAgICAgICAgaWYoZnVsbFBhdGhbbl0gPT0gVV9GSUxFX0FMVF9TRVBfQ0hBUikgewotICAgICAgICAgICAgZnVsbFBhdGhbbl0gPSBVX0ZJTEVfU0VQX0NIQVI7CisgICAgaWYgKFVfRklMRV9BTFRfU0VQX0NIQVIgIT0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSCisgICAgICAgICYmIFVfRklMRV9BTFRfU0VQX0NIQVIgIT0gVV9GSUxFX1NFUF9DSEFSKSB7CisgICAgICAgIC8qIHJlcGxhY2UgdHJlZSBzZXBhcmF0b3IgKHN1Y2ggYXMgJy8nKSB3aXRoIGZpbGUgc2VwIGNoYXIgKHN1Y2ggYXMgJzonIG9yICdcXCcpICovCisgICAgICAgIGZvcig7ZnVsbFBhdGhbbl07bisrKSB7CisgICAgICAgICAgICBpZihmdWxsUGF0aFtuXSA9PSBVX0ZJTEVfQUxUX1NFUF9DSEFSKSB7CisgICAgICAgICAgICAgICAgZnVsbFBhdGhbbl0gPSBVX0ZJTEVfU0VQX0NIQVI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0jZW5kaWYKLSNlbmRpZgotI2lmIChVX0ZJTEVfU0VQX0NIQVIgIT0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSKQotICAgIC8qIHJlcGxhY2UgdHJlZSBzZXBhcmF0b3IgKHN1Y2ggYXMgJy8nKSB3aXRoIGZpbGUgc2VwIGNoYXIgKHN1Y2ggYXMgJzonIG9yICdcXCcpICovCi0gICAgZm9yKDtmdWxsUGF0aFtuXTtuKyspIHsKLSAgICAgICAgaWYoZnVsbFBhdGhbbl0gPT0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSKSB7Ci0gICAgICAgICAgICBmdWxsUGF0aFtuXSA9IFVfRklMRV9TRVBfQ0hBUjsKKyAgICBpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfVFJFRV9FTlRSWV9TRVBfQ0hBUikgeworICAgICAgICAvKiByZXBsYWNlIHRyZWUgc2VwYXJhdG9yIChzdWNoIGFzICcvJykgd2l0aCBmaWxlIHNlcCBjaGFyIChzdWNoIGFzICc6JyBvciAnXFwnKSAqLworICAgICAgICBmb3IoO2Z1bGxQYXRoW25dO24rKykgeworICAgICAgICAgICAgaWYoZnVsbFBhdGhbbl0gPT0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSKSB7CisgICAgICAgICAgICAgICAgZnVsbFBhdGhbbl0gPSBVX0ZJTEVfU0VQX0NIQVI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0jZW5kaWYKICAgICByZXR1cm4gZnVsbFBhdGg7CiB9CiAKQEAgLTU1NSwxNyArNTUyLDIwIEBACiBzdGF0aWMgdm9pZAogZml4RGlyVG9UcmVlUGF0aChjaGFyICpzKQogewotI2lmIChVX0ZJTEVfU0VQX0NIQVIgIT0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSKSB8fCAoKFVfRklMRV9BTFRfU0VQX0NIQVIgIT0gVV9GSUxFX1NFUF9DSEFSKSAmJiAoVV9GSUxFX0FMVF9TRVBfQ0hBUiAhPSBVX1RSRUVfRU5UUllfU0VQX0NIQVIpKQotICAgIGNoYXIgKnQ7Ci0jZW5kaWYKLSNpZiAoVV9GSUxFX1NFUF9DSEFSICE9IFVfVFJFRV9FTlRSWV9TRVBfQ0hBUikKLSAgICBmb3IodD1zO3Q9dXBydl9zdHJjaHIodCxVX0ZJTEVfU0VQX0NIQVIpOykgewotICAgICAgICAqdCA9IFVfVFJFRV9FTlRSWV9TRVBfQ0hBUjsKKyAgICBpZiAoKFVfRklMRV9TRVBfQ0hBUiAhPSBVX1RSRUVfRU5UUllfU0VQX0NIQVIpCisgICAgICAgIHx8ICgoVV9GSUxFX0FMVF9TRVBfQ0hBUiAhPSBVX0ZJTEVfU0VQX0NIQVIpCisgICAgICAgICYmIChVX0ZJTEVfQUxUX1NFUF9DSEFSICE9IFVfVFJFRV9FTlRSWV9TRVBfQ0hBUikpKSB7CisgICAgICAgIGNoYXIgKnQ7CisgICAgICAgIGlmIChVX0ZJTEVfU0VQX0NIQVIgIT0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSKSB7CisgICAgICAgICAgICBmb3IodD1zO3Q9dXBydl9zdHJjaHIodCxVX0ZJTEVfU0VQX0NIQVIpOykgeworICAgICAgICAgICAgICAgICp0ID0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChVX0ZJTEVfQUxUX1NFUF9DSEFSICE9IFVfRklMRV9TRVBfQ0hBUgorICAgICAgICAgICAgJiYgVV9GSUxFX0FMVF9TRVBfQ0hBUiAhPSBVX1RSRUVfRU5UUllfU0VQX0NIQVIpIHsKKyAgICAgICAgICAgIGZvcih0PXM7dD11cHJ2X3N0cmNocih0LFVfRklMRV9BTFRfU0VQX0NIQVIpOykgeworICAgICAgICAgICAgICAgICp0ID0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotI2VuZGlmCi0jaWYgKFVfRklMRV9BTFRfU0VQX0NIQVIgIT0gVV9GSUxFX1NFUF9DSEFSKSAmJiAoVV9GSUxFX0FMVF9TRVBfQ0hBUiAhPSBVX1RSRUVfRU5UUllfU0VQX0NIQVIpCi0gICAgZm9yKHQ9czt0PXVwcnZfc3RyY2hyKHQsVV9GSUxFX0FMVF9TRVBfQ0hBUik7KSB7Ci0gICAgICAgICp0ID0gVV9UUkVFX0VOVFJZX1NFUF9DSEFSOwotICAgIH0KLSNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvdG9vbHV0aWwvdG9vbHV0aWwuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L2ljdS9zb3VyY2UvdG9vbHMvdG9vbHV0aWwvdG9vbHV0aWwuY3BwCmluZGV4IDQ4YmI3NzcuLjhhYzFiMDYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9pY3Uvc291cmNlL3Rvb2xzL3Rvb2x1dGlsL3Rvb2x1dGlsLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvaWN1L3NvdXJjZS90b29scy90b29sdXRpbC90b29sdXRpbC5jcHAKQEAgLTEyOCwxMiArMTI4LDEyIEBACiAgIGludDMyX3QgcmVzdWx0TGVuID0gMDsKIAogICBjb25zdCBjaGFyICpiYXNlbmFtZT11cHJ2X3N0cnJjaHIocGF0aCwgVV9GSUxFX1NFUF9DSEFSKTsKLSNpZiBVX0ZJTEVfQUxUX1NFUF9DSEFSIT1VX0ZJTEVfU0VQX0NIQVIKLSAgY29uc3QgY2hhciAqYmFzZW5hbWVBbHQ9dXBydl9zdHJyY2hyKHBhdGgsIFVfRklMRV9BTFRfU0VQX0NIQVIpOwotICBpZihiYXNlbmFtZUFsdCAmJiAoIWJhc2VuYW1lIHx8IGJhc2VuYW1lPGJhc2VuYW1lQWx0KSkgewotICAgIGJhc2VuYW1lID0gYmFzZW5hbWVBbHQ7CisgIGlmIChVX0ZJTEVfQUxUX1NFUF9DSEFSICE9IFVfRklMRV9TRVBfQ0hBUikgeworICAgIGNvbnN0IGNoYXIqIGJhc2VuYW1lQWx0ID0gdXBydl9zdHJyY2hyKHBhdGgsIFVfRklMRV9BTFRfU0VQX0NIQVIpOworICAgIGlmIChiYXNlbmFtZUFsdCAmJiAoIWJhc2VuYW1lIHx8IGJhc2VuYW1lIDwgYmFzZW5hbWVBbHQpKSB7CisgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lQWx0OworICAgIH0KICAgfQotI2VuZGlmCiAgIGlmKCFiYXNlbmFtZSkgewogICAgIC8qIG5vIGJhc2VuYW1lIC0gcmV0dXJuICcnLiAqLwogICAgIHJlc3VsdFB0ciA9ICIiOwpAQCAtMTYwLDE3ICsxNjAsMTcgQEAKIGZpbmRCYXNlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSkgewogICAgIGNvbnN0IGNoYXIgKmJhc2VuYW1lPXVwcnZfc3RycmNocihmaWxlbmFtZSwgVV9GSUxFX1NFUF9DSEFSKTsKIAotI2lmIFVfRklMRV9BTFRfU0VQX0NIQVIhPVVfRklMRV9TRVBfQ0hBUgorICAgIGlmIChVX0ZJTEVfQUxUX1NFUF9DSEFSICE9IFVfRklMRV9TRVBfQ0hBUikgewogI2lmICEoVV9QTEFURk9STSA9PSBVX1BGX0NZR1dJTiAmJiBVX1BMQVRGT1JNX1VTRVNfT05MWV9XSU4zMl9BUEkpCi0gICAgaWYoYmFzZW5hbWU9PU5VTEwpCisgICAgICBpZiAoYmFzZW5hbWUgPT0gTlVMTCkKICNlbmRpZgotICAgIHsKKyAgICAgIHsKICAgICAgICAgLyogVXNlIGxlbmllbnQgbWF0Y2hpbmcgb24gV2luZG93cywgd2hpY2ggY2FuIGFjY2VwdCBlaXRoZXIgXCBvciAvCi0gICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGZvciBlbnZpcm9ubWVudHMgbGlrZSBXaW4zMitDeWdXaW4gd2hpY2ggaGF2ZSBib3RoLgorICAgICAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgZW52aXJvbm1lbnRzIGxpa2UgV2luMzIrQ3lnV2luIHdoaWNoIGhhdmUgYm90aC4KICAgICAgICAgKi8KLSAgICAgICAgYmFzZW5hbWU9dXBydl9zdHJyY2hyKGZpbGVuYW1lLCBVX0ZJTEVfQUxUX1NFUF9DSEFSKTsKKyAgICAgICAgYmFzZW5hbWUgPSB1cHJ2X3N0cnJjaHIoZmlsZW5hbWUsIFVfRklMRV9BTFRfU0VQX0NIQVIpOworICAgICAgfQogICAgIH0KLSNlbmRpZgogCiAgICAgaWYoYmFzZW5hbWUhPU5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJhc2VuYW1lKzE7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjLy5jbWFrZS1mb3JtYXQucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjLy5jbWFrZS1mb3JtYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkMmY5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvLmNtYWtlLWZvcm1hdC5weQpAQCAtMCwwICsxLDM0IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIGNtYWtlLWZvcm1hdCAodjAuNC4xLCBjaXJjYSBKdWwgMjAxOCkKKyMgaHR0cHM6Ly9naXRodWIuY29tL2NoZXNoaXJla293L2NtYWtlX2Zvcm1hdAorCisjIEhvdyB3aWRlIHRvIGFsbG93IGZvcm1hdHRlZCBjbWFrZSBmaWxlcworbGluZV93aWR0aCA9IDEzMgorCisjIEhvdyBtYW55IHNwYWNlcyB0byB0YWIgZm9yIGluZGVudAordGFiX3NpemUgPSA0CisKKyMgSWYgYXJnbGlzdHMgYXJlIGxvbmdlciB0aGFuIHRoaXMsIGJyZWFrIHRoZW0gYWx3YXlzCittYXhfc3ViYXJnc19wZXJfbGluZSA9IDMKKworIyBJZiB0cnVlLCBzZXBhcmF0ZSBmbG93IGNvbnRyb2wgbmFtZXMgZnJvbSB0aGVpciBwYXJlbnRoZXNlcyB3aXRoIGEgc3BhY2UKK3NlcGFyYXRlX2N0cmxfbmFtZV93aXRoX3NwYWNlID0gRmFsc2UKKworIyBJZiB0cnVlLCBzZXBhcmF0ZSBmdW5jdGlvbiBuYW1lcyBmcm9tIHBhcmVudGhlc2VzIHdpdGggYSBzcGFjZQorc2VwYXJhdGVfZm5fbmFtZV93aXRoX3NwYWNlID0gRmFsc2UKKworIyBJZiBhIHN0YXRlbWVudCBpcyB3cmFwcGVkIHRvIG1vcmUgdGhhbiBvbmUgbGluZSwgdGhhbiBkYW5nbGUgdGhlIGNsb3NpbmcKKyMgcGFyZW50aGVzaXMgb24gaXQncyBvd24gbGluZQorZGFuZ2xlX3BhcmVucyA9IEZhbHNlCisKKyMgV2hhdCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBidWxsZXRlZCBsaXN0cworYnVsbGV0X2NoYXIgPSB1JyonCisKKyMgV2hhdCBjaGFyYWN0ZXIgdG8gdXNlIGFzIHB1bmN0dWF0aW9uIGFmdGVyIG51bWVyYWxzIGluIGFuIGVudW1lcmF0ZWQgbGlzdAorZW51bV9jaGFyID0gdScuJworCisjIFdoYXQgc3R5bGUgbGluZSBlbmRpbmdzIHRvIHVzZSBpbiB0aGUgb3V0cHV0LgorbGluZV9lbmRpbmcgPSB1J3VuaXgnCisKKyMgRm9ybWF0IGNvbW1hbmQgbmFtZXMgY29uc2lzdGVudGx5IGFzICdsb3dlcicgb3IgJ3VwcGVyJyBjYXNlCitjb21tYW5kX2Nhc2UgPSB1J2xvd2VyJworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL0JVSUxELmduIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9CVUlMRC5nbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQxODZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9CVUlMRC5nbgpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAoQykgMjAxOC0yMDE5IFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuCisjIENvcHlyaWdodCAoQykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NvbmZpZygidnVsa2FuX2hlYWRlcnNfY29uZmlnIikgeworICBpbmNsdWRlX2RpcnMgPSBbICJpbmNsdWRlIiBdCisKKyAgaWYgKGlzX3dpbikgeworICAgIGRlZmluZXMgPSBbICJWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSIiBdCisgIH0KKyAgaWYgKGlzX2xpbnV4KSB7CisgICAgZGVmaW5lcyA9IFsgIlZLX1VTRV9QTEFURk9STV9YQ0JfS0hSIiBdCisgIH0KKyAgaWYgKGlzX2FuZHJvaWQpIHsKKyAgICBkZWZpbmVzID0gWyAiVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSIiBdCisgIH0KKyAgaWYgKGlzX2Z1Y2hzaWEpIHsKKyAgICBkZWZpbmVzID0gWyAiVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEiIF0KKyAgfQorICBpZiAoaXNfbWFjKSB7CisgICAgZGVmaW5lcyA9IFsgIlZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQiIF0KKyAgfQorICBpZiAoZGVmaW5lZChpc19nZ3ApICYmIGlzX2dncCkgeworICAgIGRlZmluZXMgPSBbICJWS19VU0VfUExBVEZPUk1fR0dQIiBdCisgIH0KK30KKworIyBWdWxrYW4gaGVhZGVycyBvbmx5LCBubyBjb21waWxlZCBzb3VyY2VzLgorc291cmNlX3NldCgidnVsa2FuX2hlYWRlcnMiKSB7CisgIHNvdXJjZXMgPSBbCisgICAgImluY2x1ZGUvdnVsa2FuL3ZrX2ljZC5oIiwKKyAgICAiaW5jbHVkZS92dWxrYW4vdmtfbGF5ZXIuaCIsCisgICAgImluY2x1ZGUvdnVsa2FuL3ZrX3BsYXRmb3JtLmgiLAorICAgICJpbmNsdWRlL3Z1bGthbi92a19zZGtfcGxhdGZvcm0uaCIsCisgICAgImluY2x1ZGUvdnVsa2FuL3Z1bGthbi5oIiwKKyAgICAiaW5jbHVkZS92dWxrYW4vdnVsa2FuLmhwcCIsCisgICAgImluY2x1ZGUvdnVsa2FuL3Z1bGthbl9jb3JlLmgiLAorICBdCisgIHB1YmxpY19jb25maWdzID0gWyAiOnZ1bGthbl9oZWFkZXJzX2NvbmZpZyIgXQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL0JVSUxELm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9CVUlMRC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg4MTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9CVUlMRC5tZApAQCAtMCwwICsxLDI3NCBAQAorIyBCdWlsZCBJbnN0cnVjdGlvbnMKKworSW5zdHJ1Y3Rpb25zIGZvciBidWlsZGluZyB0aGlzIHJlcG9zaXRvcnkgb24gV2luZG93cywgTGludXgsIGFuZCBNYWNPUy4KKworIyMgSW5kZXgKKworMS4gW0NvbnRyaWJ1dGluZ10oI2NvbnRyaWJ1dGluZy10by10aGUtcmVwb3NpdG9yeSkKKzEuIFtSZXBvc2l0b3J5IENvbnRlbnRdKCNyZXBvc2l0b3J5LWNvbnRlbnQpCisxLiBbUmVwb3NpdG9yeSBTZXQtdXBdKCNyZXBvc2l0b3J5LXNldC11cCkKKzEuIFtXaW5kb3dzIEJ1aWxkXSgjYnVpbGRpbmctb24td2luZG93cykKKzEuIFtMaW51eCBCdWlsZF0oI2J1aWxkaW5nLW9uLWxpbnV4KQorMS4gW01hY09TIEJ1aWxkXSgjYnVpbGRpbmctb24tbWFjb3MpCisKKyMjIENvbnRyaWJ1dGluZyB0byB0aGUgUmVwb3NpdG9yeQorCitUaGUgY29udGVudHMgb2YgdGhpcyByZXBvc2l0b3J5IGFyZSBzb3VyY2VkIHByaW1hcmlseSBmcm9tIHRoZSBLaHJvbm9zIFZ1bGthbgorQVBJIHNwZWNpZmljYXRpb24gW3JlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLURvY3MpLgorUGxlYXNlIHZpc2l0IHRoYXQgcmVwb3NpdG9yeSBmb3IgaW5mb3JtYXRpb24gb24gY29udHJpYnV0aW5nLgorCisjIyBSZXBvc2l0b3J5IENvbnRlbnQKKworVGhpcyByZXBvc2l0b3J5IGNvbnRhaW5zIHRoZSBWdWxrYW4gaGVhZGVyIGZpbGVzIGFuZCB0aGUgVnVsa2FuIEFQSSBkZWZpbml0aW9uCisocmVnaXN0cnkpIHdpdGggaXRzIHJlbGF0ZWQgZmlsZXMuIFRoaXMgcmVwb3NpdG9yeSBkb2VzIG5vdCBjcmVhdGUgbGlicmFyaWVzCitvciBleGVjdXRhYmxlcy4KKworSG93ZXZlciwgdGhpcyByZXBvc2l0b3J5IGNvbnRhaW5zIENNYWtlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZmlsZXMgdG8gImluc3RhbGwiCit0aGUgZmlsZXMgZnJvbSB0aGlzIHJlcG9zaXRvcnkgdG8gYSBzcGVjaWZpYyBpbnN0YWxsIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUsCit5b3UgY2FuIGluc3RhbGwgdGhlIGZpbGVzIHRvIGEgc3lzdGVtIGRpcmVjdG9yeSBzdWNoIGFzIGAvdXNyL2xvY2FsYCBvbiBMaW51eC4KKworSWYgeW91IGFyZSBidWlsZGluZyBvdGhlciBWdWxrYW4tcmVsYXRlZCByZXBvc2l0b3JpZXMgc3VjaCBhcworW1Z1bGthbi1Mb2FkZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLUxvYWRlciksCit5b3UgbmVlZCB0byBidWlsZCB0aGUgaW5zdGFsbCB0YXJnZXQgb2YgdGhpcyByZXBvc2l0b3J5IGFuZCBwcm92aWRlIHRoZQorcmVzdWx0aW5nIGluc3RhbGwgZGlyZWN0b3J5IHRvIHRob3NlIHJlcG9zaXRvcmllcy4KKworIyMjIEluc3RhbGxlZCBGaWxlcworCitUaGUgYGluc3RhbGxgIHRhcmdldCBpbnN0YWxscyB0aGUgZm9sbG93aW5nIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcnkKK2luZGljYXRlZCBieSAqaW5zdGFsbF9kaXIqOgorCistICppbnN0YWxsX2RpcipgL2luY2x1ZGUvdnVsa2FuYCA6IFRoZSBoZWFkZXIgZmlsZXMgZm91bmQgaW4gdGhlCisgYGluY2x1ZGUvdnVsa2FuYCBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5CistICppbnN0YWxsX2RpcipgL3NoYXJlL3Z1bGthbi9yZWdpc3RyeWAgOiBUaGUgcmVnaXN0cnkgZmlsZXMgZm91bmQgaW4gdGhlCisgIGByZWdpc3RyeWAgZGlyZWN0b3J5IG9mIHRoaXMgcmVwb3NpdG9yeQorCitUaGUgYHVuaW5zdGFsbGAgdGFyZ2V0IGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgYWJvdmUgZmlsZXMgZnJvbSB0aGUgaW5zdGFsbAorZGlyZWN0b3J5LgorCisjIyBSZXBvc2l0b3J5IFNldC1VcAorCisjIyMgRG93bmxvYWQgdGhlIFJlcG9zaXRvcnkKKworVG8gY3JlYXRlIHlvdXIgbG9jYWwgZ2l0IHJlcG9zaXRvcnk6CisKKyAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tSGVhZGVycy5naXQKKworIyMjIFJlcG9zaXRvcnkgRGVwZW5kZW5jaWVzCisKK1RoaXMgcmVwb3NpdG9yeSBkb2VzIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIHJlcG9zaXRvcmllcy4KKworIyMjIEJ1aWxkIGFuZCBJbnN0YWxsIERpcmVjdG9yaWVzCisKK0EgY29tbW9uIGNvbnZlbnRpb24gaXMgdG8gcGxhY2UgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpbiB0aGUgdG9wIGRpcmVjdG9yeSBvZgordGhlIHJlcG9zaXRvcnkgd2l0aCBhIG5hbWUgb2YgYGJ1aWxkYCBhbmQgcGxhY2UgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGFzIGEKK2NoaWxkIG9mIHRoZSBidWlsZCBkaXJlY3Rvcnkgd2l0aCB0aGUgbmFtZSBgaW5zdGFsbGAuIFRoZSByZW1haW5kZXIgb2YgdGhlc2UKK2luc3RydWN0aW9ucyBmb2xsb3cgdGhpcyBjb252ZW50aW9uLCBhbHRob3VnaCB5b3UgY2FuIHVzZSBhbnkgbmFtZSBmb3IgdGhlc2UKK2RpcmVjdG9yaWVzIGFuZCBwbGFjZSB0aGVtIGluIGFueSBsb2NhdGlvbi4KKworIyMgQnVpbGRpbmcgT24gV2luZG93cworCisjIyMgV2luZG93cyBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCBSZXF1aXJlbWVudHMKKworLSBXaW5kb3dzCisgIC0gQW55IFBlcnNvbmFsIENvbXB1dGVyIHZlcnNpb24gc3VwcG9ydGVkIGJ5IE1pY3Jvc29mdAorLSBNaWNyb3NvZnQgW1Zpc3VhbCBTdHVkaW9dKGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vKQorICAtIFZlcnNpb25zCisgICAgLSBbMjAxNV0oaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy9vbGRlci1kb3dubG9hZHMvKQorICAgIC0gWzIwMTddKGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvb2xkZXItZG93bmxvYWRzLykKKyAgICAtIFsyMDE5XShodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL2Rvd25sb2Fkcy8pCisgIC0gVGhlIENvbW11bml0eSBFZGl0aW9uIG9mIGVhY2ggb2YgdGhlIGFib3ZlIHZlcnNpb25zIGlzIHN1ZmZpY2llbnQsIGFzCisgICAgd2VsbCBhcyBhbnkgbW9yZSBjYXBhYmxlIGVkaXRpb24uCistIFtDTWFrZSAzLjEwLjJdKGh0dHBzOi8vY21ha2Uub3JnL2ZpbGVzL3YzLjEwL2NtYWtlLTMuMTAuMi13aW42NC14NjQuemlwKSBpcyByZWNvbW1lbmRlZC4KKyAgLSBVc2UgdGhlIGluc3RhbGxlciBvcHRpb24gdG8gYWRkIENNYWtlIHRvIHRoZSBzeXN0ZW0gUEFUSAorLSBHaXQgQ2xpZW50IFN1cHBvcnQKKyAgLSBbR2l0IGZvciBXaW5kb3dzXShodHRwOi8vZ2l0LXNjbS5jb20vZG93bmxvYWQvd2luKSBpcyBhIHBvcHVsYXIgc29sdXRpb24KKyAgICBmb3IgV2luZG93cworICAtIFNvbWUgSURFcyAoZS5nLiwgW1Zpc3VhbCBTdHVkaW9dKGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vKSwKKyAgICBbR2l0SHViIERlc2t0b3BdKGh0dHBzOi8vZGVza3RvcC5naXRodWIuY29tLykpIGhhdmUgaW50ZWdyYXRlZAorICAgIEdpdCBjbGllbnQgc3VwcG9ydAorCisjIyMgV2luZG93cyBCdWlsZCAtIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvCisKK1RoZSBnZW5lcmFsIGFwcHJvYWNoIGlzIHRvIHJ1biBDTWFrZSB0byBnZW5lcmF0ZSB0aGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0CitmaWxlcy4gVGhlbiBlaXRoZXIgcnVuIENNYWtlIHdpdGggdGhlIGAtLWJ1aWxkYCBvcHRpb24gdG8gYnVpbGQgZnJvbSB0aGUKK2NvbW1hbmQgbGluZSBvciB1c2UgdGhlIFZpc3VhbCBTdHVkaW8gSURFIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBzb2x1dGlvbiBhbmQKK3dvcmsgd2l0aCB0aGUgc29sdXRpb24gaW50ZXJhY3RpdmVseS4KKworIyMjIyBXaW5kb3dzIFF1aWNrIFN0YXJ0CisKK0Zyb20gYSAiRGV2ZWxvcGVyIENvbW1hbmQgUHJvbXB0IGZvciBWUyAyMDF4IiBjb25zb2xlOgorCisgICAgY2QgVnVsa2FuLUhlYWRlcnMKKyAgICBta2RpciBidWlsZAorICAgIGNkIGJ1aWxkCisgICAgY21ha2UgLi4KKyAgICBjbWFrZSAtLWJ1aWxkIC4gLS10YXJnZXQgaW5zdGFsbAorCitTZWUgYmVsb3cgZm9yIHRoZSBkZXRhaWxzLgorCisjIyMjIFVzZSBgQ01ha2VgIHRvIENyZWF0ZSB0aGUgVmlzdWFsIFN0dWRpbyBQcm9qZWN0IEZpbGVzCisKK0Zyb20gd2l0aGluIGEgIkRldmVsb3BlciBDb21tYW5kIFByb21wdCBmb3IgVlMgMjAxeCIgY29uc29sZSwgY2hhbmdlIHlvdXIKK2N1cnJlbnQgZGlyZWN0b3J5IHRvIHRoZSB0b3Agb2YgdGhlIGNsb25lZCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgY3JlYXRlIGEKK2J1aWxkIGRpcmVjdG9yeSBhbmQgZ2VuZXJhdGUgdGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlczoKKworICAgIGNkIFZ1bGthbi1IZWFkZXJzCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorICAgIGNtYWtlIC4uCisKKz4gTm90ZTogVGhlIGAuLmAgcGFyYW1ldGVyIHRlbGxzIGBjbWFrZWAgdGhlIGxvY2F0aW9uIG9mIHRoZSB0b3Agb2YgdGhlCis+IHJlcG9zaXRvcnkuIElmIHlvdSBwbGFjZSB5b3VyIGJ1aWxkIGRpcmVjdG9yeSBzb21lcGxhY2UgZWxzZSwgeW91J2xsIG5lZWQgdG8KKz4gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdG9wIGRpZmZlcmVudGx5LgorCitUaGUgQ01ha2UgY29uZmlndXJhdGlvbiBmaWxlcyBzZXQgdGhlIGRlZmF1bHQgaW5zdGFsbCBkaXJlY3RvcnkgbG9jYXRpb24gdG8KK2AkQ01BS0VfQklOQVJZX0RJUlxpbnN0YWxsYCwgd2hpY2ggaXMgYSBjaGlsZCBvZiB5b3VyIGJ1aWxkIGRpcmVjdG9yeS4gSW4gdGhpcworZXhhbXBsZSwgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGJlY29tZXMgdGhlIGBWdWxrYW4tSGVhZGVyc1xidWlsZFxpbnN0YWxsYAorZGlyZWN0b3J5LgorCitUaGUgcHJvamVjdCBpbnN0YWxscyB0aGUgaGVhZGVyIGZpbGVzIHRvCisKKyAgICBWdWxrYW4tSGVhZGVyc1xidWlsZFxpbnN0YWxsXGluY2x1ZGVcdnVsa2FuCisKK2FuZCBpbnN0YWxscyB0aGUgcmVnaXN0cnkgZmlsZXMgdG8KKworICAgIFZ1bGthbi1IZWFkZXJzXGJ1aWxkXGluc3RhbGxcc2hhcmVcdnVsa2FuXHJlZ2lzdHJ5CisKK1lvdSBjYW4gY2hhbmdlIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSB3aXRoIHRoZSBgQ01BS0VfSU5TVEFMTF9QUkVGSVhgIENNYWtlCit2YXJpYWJsZS4KKworRm9yIGV4YW1wbGU6CisKKyAgICBjZCBWdWxrYW4tSGVhZGVycworICAgIG1rZGlyIGJ1aWxkCisgICAgY2QgYnVpbGQKKyAgICBjbWFrZSAtRENNQUtFX0lOU1RBTExfUFJFRklYPS9jL1VzZXJzL2Rldi9pbnN0YWxsIC4uICAjIE1JTkdXNjQgc2hlbGwKKworQXMgaXQgc3RhcnRzIGdlbmVyYXRpbmcgdGhlIHByb2plY3QgZmlsZXMsIGBjbWFrZWAgcmVzcG9uZHMgd2l0aCBzb21ldGhpbmcKK2xpa2U6CisKKyAgICAtLSBCdWlsZGluZyBmb3I6IFZpc3VhbCBTdHVkaW8gMTQgMjAxNQorCit3aGljaCBpcyBhIDMyLWJpdCBnZW5lcmF0b3IuCisKK1NpbmNlIHRoaXMgcmVwb3NpdG9yeSBkb2VzIG5vdCBjb21waWxlIGFueXRoaW5nLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNwZWNpZnkgYQorc3BlY2lmaWMgZ2VuZXJhdG9yIHN1Y2ggYXMgIlZpc3VhbCBTdHVkaW8gMTQgMjAxNSBXaW42NCIsIHNvIHRoZSBkZWZhdWx0CitnZW5lcmF0b3Igc2hvdWxkIHN1ZmZpY2UuCisKK1RoZSBhYm92ZSBzdGVwcyBjcmVhdGUgYSBXaW5kb3dzIHNvbHV0aW9uIGZpbGUgbmFtZWQgYFZ1bGthbi1IZWFkZXJzLnNsbmAgaW4KK3RoZSBidWlsZCBkaXJlY3RvcnkuCisKK0F0IHRoaXMgcG9pbnQsIHlvdSBjYW4gYnVpbGQgdGhlIHNvbHV0aW9uIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciBvcGVuIHRoZQorZ2VuZXJhdGVkIHNvbHV0aW9uIHdpdGggVmlzdWFsIFN0dWRpby4KKworIyMjIyBCdWlsZCB0aGUgU29sdXRpb24gRnJvbSB0aGUgQ29tbWFuZCBMaW5lCisKK1doaWxlIHN0aWxsIGluIHRoZSBidWlsZCBkaXJlY3Rvcnk6CisKKyAgICBjbWFrZSAtLWJ1aWxkIC4gLS10YXJnZXQgaW5zdGFsbAorCit0byBidWlsZCB0aGUgaW5zdGFsbCB0YXJnZXQuCisKK0J1aWxkIHRoZSBgdW5pbnN0YWxsYCB0YXJnZXQgdG8gcmVtb3ZlIHRoZSBmaWxlcyBmcm9tIHRoZSBpbnN0YWxsIGRpcmVjdG9yeS4KKworICAgIGNtYWtlIC0tYnVpbGQgLiAtLXRhcmdldCB1bmluc3RhbGwKKworIyMjIyBCdWlsZCB0aGUgU29sdXRpb24gV2l0aCBWaXN1YWwgU3R1ZGlvCisKK0xhdW5jaCBWaXN1YWwgU3R1ZGlvIGFuZCBvcGVuIHRoZSAiVnVsa2FuLUhlYWRlcnMuc2xuIiBzb2x1dGlvbiBmaWxlIGluIHRoZQorYnVpbGQgZGlyZWN0b3J5LiBCdWlsZCB0aGUgYElOU1RBTExgIHRhcmdldCBmcm9tIHRoZSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uCitleHBsb3Jlci4KKworQnVpbGQgdGhlIGB1bmluc3RhbGxgIHRhcmdldCB0byByZW1vdmUgdGhlIGZpbGVzIGZyb20gdGhlIGluc3RhbGwgZGlyZWN0b3J5LgorCis+IE5vdGU6IFNpbmNlIHRoZXJlIGFyZSBvbmx5IHRoZSBgSU5TVEFMTGAgYW5kIGB1bmluc3RhbGxgIHByb2plY3RzIGluIHRoZQorPiBzb2x1dGlvbiwgYnVpbGRpbmcgdGhlIHNvbHV0aW9uIGZyb20gdGhlIGNvbW1hbmQgbGluZSBtYXkgYmUgbW9yZSBlZmZpY2llbnQKKz4gdGhhbiBzdGFydGluZyBWaXN1YWwgU3R1ZGlvIGZvciB0aGVzZSBzaW1wbGUgb3BlcmF0aW9ucy4KKworIyMgQnVpbGRpbmcgT24gTGludXgKKworIyMjIExpbnV4IERldmVsb3BtZW50IEVudmlyb25tZW50IFJlcXVpcmVtZW50cworCitUaGVyZSBhcmUgbm8gc3BlY2lmaWMgTGludXggZGlzdHJpYnV0aW9uIG9yIGNvbXBpbGVyIHZlcnNpb24gcmVxdWlyZW1lbnRzIGZvcgorYnVpbGRpbmcgdGhpcyByZXBvc2l0b3J5LiBUaGUgcmVxdWlyZWQgdG9vbHMgYXJlCisKKy0gW0NNYWtlIDMuMTAuMl0oaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLUxpbnV4LXg4Nl82NC50YXIuZ3opIGlzIHJlY29tbWVuZGVkLgorLSBnaXQKKworIyMjIExpbnV4IEJ1aWxkCisKK1RoZSBnZW5lcmFsIGFwcHJvYWNoIGlzIHRvIHJ1biBDTWFrZSB0byBnZW5lcmF0ZSBtYWtlIGZpbGVzLiBUaGVuIGVpdGhlciBydW4KK0NNYWtlIHdpdGggdGhlIGAtLWJ1aWxkYCBvcHRpb24gb3IgYG1ha2VgIHRvIGJ1aWxkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKworIyMjIyBMaW51eCBRdWljayBTdGFydAorCisgICAgY2QgVnVsa2FuLUhlYWRlcnMKKyAgICBta2RpciBidWlsZAorICAgIGNkIGJ1aWxkCisgICAgY21ha2UgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD1pbnN0YWxsIC4uCisgICAgbWFrZSBpbnN0YWxsCisKK1NlZSBiZWxvdyBmb3IgdGhlIGRldGFpbHMuCisKKyMjIyMgVXNlIENNYWtlIHRvIENyZWF0ZSB0aGUgTWFrZSBGaWxlcworCitDaGFuZ2UgeW91ciBjdXJyZW50IGRpcmVjdG9yeSB0byB0aGUgdG9wIG9mIHRoZSBjbG9uZWQgcmVwb3NpdG9yeSBkaXJlY3RvcnksCitjcmVhdGUgYSBidWlsZCBkaXJlY3RvcnkgYW5kIGdlbmVyYXRlIHRoZSBtYWtlIGZpbGVzOgorCisgICAgY2QgVnVsa2FuLUhlYWRlcnMKKyAgICBta2RpciBidWlsZAorICAgIGNkIGJ1aWxkCisgICAgY21ha2UgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD1pbnN0YWxsIC4uCisKKz4gTm90ZTogVGhlIGAuLmAgcGFyYW1ldGVyIHRlbGxzIGBjbWFrZWAgdGhlIGxvY2F0aW9uIG9mIHRoZSB0b3Agb2YgdGhlCis+IHJlcG9zaXRvcnkuIElmIHlvdSBwbGFjZSB5b3VyIGBidWlsZGAgZGlyZWN0b3J5IHNvbWVwbGFjZSBlbHNlLCB5b3UnbGwgbmVlZAorPiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0b3AgZGlmZmVyZW50bHkuCisKK1NldCB0aGUgYENNQUtFX0lOU1RBTExfUFJFRklYYCB2YXJpYWJsZSB0byB0aGUgZGlyZWN0b3J5IHRvIHNlcnZlIGFzIHRoZQorZGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciB0aGUgYGluc3RhbGxgIHRhcmdldC4KKworVGhlIGFib3ZlIGBjbWFrZWAgY29tbWFuZCBzZXRzIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSB0bworYCRDTUFLRV9CSU5BUllfRElSL2luc3RhbGxgLCB3aGljaCBpcyBhIGNoaWxkIG9mIHlvdXIgYGJ1aWxkYCBkaXJlY3RvcnkuIEluCit0aGlzIGV4YW1wbGUsIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBiZWNvbWVzIHRoZSBgVnVsa2FuLUhlYWRlcnMvYnVpbGQvaW5zdGFsbGAKK2RpcmVjdG9yeS4KKworVGhlIG1ha2UgZmlsZSBpbnN0YWxsIHRhcmdldCBpbnN0YWxscyB0aGUgaGVhZGVyIGZpbGVzIHRvCisKKyAgICBWdWxrYW4tSGVhZGVycy9idWlsZC9pbnN0YWxsL2luY2x1ZGUvdnVsa2FuCisKK2FuZCBpbnN0YWxscyB0aGUgcmVnaXN0cnkgZmlsZXMgdG8KKworICAgIFZ1bGthbi1IZWFkZXJzL2J1aWxkL2luc3RhbGwvc2hhcmUvdnVsa2FuL3JlZ2lzdHJ5CisKKz4gTm90ZTogRm9yIExpbnV4LCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYENNQUtFX0lOU1RBTExfUFJFRklYYCBpcworPiBgL3Vzci9sb2NhbGAsIHdoaWNoIHdvdWxkIGJlIHVzZWQgaWYgeW91IGRvIG5vdCBzcGVjaWZ5Cis+IGBDTUFLRV9JTlNUQUxMX1BSRUZJWGAuIEluIHRoaXMgY2FzZSwgeW91IG1heSBuZWVkIHRvIHVzZSBgc3Vkb2AgdG8gaW5zdGFsbAorPiB0byBzeXN0ZW0gZGlyZWN0b3JpZXMgbGF0ZXIgd2hlbiB5b3UgcnVuIGBtYWtlIGluc3RhbGxgLgorCitOb3RlIHRoYXQgYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgbWFrZSBmaWxlcywgcnVubmluZyBgbWFrZWA6CisKKyAgICBtYWtlCisKK2RvZXMgbm90aGluZywgc2luY2UgdGhlcmUgYXJlIG5vIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcyB0byBidWlsZC4KKworVG8gaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzOgorCisgICAgbWFrZSBpbnN0YWxsCisKK29yCisKKyAgICBjbWFrZSAtLWJ1aWxkIC4gLS10YXJnZXQgaW5zdGFsbAorCitUbyB1bmluc3RhbGwgdGhlIGZpbGVzIGZyb20gdGhlIGluc3RhbGwgZGlyZWN0b3JpZXMsIHlvdSBjYW4gZXhlY3V0ZToKKworICAgIG1ha2UgdW5pbnN0YWxsCisKK29yCisKKyAgICBjbWFrZSAtLWJ1aWxkIC4gLS10YXJnZXQgdW5pbnN0YWxsCisKKyMjIEJ1aWxkaW5nIG9uIE1hY09TCisKK1RoZSBpbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIHRoaXMgcmVwb3NpdG9yeSBvbiBNYWNPUyBhcmUgc2ltaWxhciB0byB0aG9zZSBmb3IgTGludXguCisKK1tDTWFrZSAzLjEwLjJdKGh0dHBzOi8vY21ha2Uub3JnL2ZpbGVzL3YzLjEwL2NtYWtlLTMuMTAuMi1EYXJ3aW4teDg2XzY0LnRhci5neikgaXMgcmVjb21tZW5kZWQuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzk2YzVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDU4IEBACisjIH5+fgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyB+fn4KKworIyBDTWFrZSBwcm9qZWN0IGluaXRpYWxpemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIHNlY3Rpb24gY29udGFpbnMgcHJlLXByb2plY3QoKSBpbml0aWFsaXphdGlvbiwgYW5kIGVuZHMgd2l0aCB0aGUgcHJvamVjdCgpIGNvbW1hbmQuCisKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAzLjEwLjIpCisKKyMgTk9ORSA9IHRoaXMgcHJvamVjdCBoYXMgbm8gbGFuZ3VhZ2UgdG9vbGNoYWluIHJlcXVpcmVtZW50LgorcHJvamVjdChWdWxrYW4tSGVhZGVycyBOT05FKQorCisjIFVzZXItaW50ZXJmYWNlIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpYWJsZXMgdGhhdCBhZmZlY3QgZGV2ZWxvcG1lbnQgR1VJcyAoZS5nLiBDTWFrZSBHVUkgYW5kIElERXMpLCBzdWNoIGFzIG9wdGlvbigpLCBmb2xkZXJzLCBhbmQgdmFyaWFibGVzCisjIHdpdGggdGhlIENBQ0hFIHByb3BlcnR5LgorCitpbmNsdWRlKEdOVUluc3RhbGxEaXJzKQorCitpZihXSU4zMiBBTkQgQ01BS0VfSU5TVEFMTF9QUkVGSVhfSU5JVElBTElaRURfVE9fREVGQVVMVCkKKyAgICAjIFdpbmRvd3M6IGlmIGluc3RhbGwgbG9jYXRpb25zIG5vdCBzZXQgYnkgdXNlciwgc2V0IGluc3RhbGwgcHJlZml4IHRvICI8YnVpbGRfZGlyPlxpbnN0YWxsIi4KKyAgICBzZXQoQ01BS0VfSU5TVEFMTF9QUkVGSVggIiR7Q01BS0VfQklOQVJZX0RJUn0vaW5zdGFsbCIgQ0FDSEUgUEFUSCAiZGVmYXVsdCBpbnN0YWxsIHBhdGgiIEZPUkNFKQorZW5kaWYoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgZGVmaW5lIGV4cG9ydGVkIHRhcmdldHMgZm9yIG5lc3RlZCBwcm9qZWN0IGJ1aWxkcyB0byBjb25zdW1lCithZGRfbGlicmFyeShWdWxrYW4tSGVhZGVycyBJTlRFUkZBQ0UpCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWdWxrYW4tSGVhZGVycyBJTlRFUkZBQ0UgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlIikKK2FkZF9saWJyYXJ5KFZ1bGthbjo6SGVhZGVycyBBTElBUyBWdWxrYW4tSGVhZGVycykKKworYWRkX2xpYnJhcnkoVnVsa2FuLVJlZ2lzdHJ5IElOVEVSRkFDRSkKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKFZ1bGthbi1SZWdpc3RyeSBJTlRFUkZBQ0UgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9yZWdpc3RyeSIpCithZGRfbGlicmFyeShWdWxrYW46OlJlZ2lzdHJ5IEFMSUFTIFZ1bGthbi1SZWdpc3RyeSkKKworaW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlL3Z1bGthbiIgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9KQoraW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9yZWdpc3RyeSIgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0RBVEFESVJ9L3Z1bGthbikKKworIyB1bmluc3RhbGwgdGFyZ2V0CitpZihOT1QgVEFSR0VUIHVuaW5zdGFsbCkKKyAgICBjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbiIKKyAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NtYWtlX3VuaW5zdGFsbC5jbWFrZSIKKyAgICAgICAgICAgICAgICAgICBJTU1FRElBVEUKKyAgICAgICAgICAgICAgICAgICBAT05MWSkKKyAgICBhZGRfY3VzdG9tX3RhcmdldCh1bmluc3RhbGwgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1QICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9jbWFrZV91bmluc3RhbGwuY21ha2UpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL0NPREVfT0ZfQ09ORFVDVC5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvQ09ERV9PRl9DT05EVUNULm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTYxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL0NPREVfT0ZfQ09ORFVDVC5tZApAQCAtMCwwICsxIEBACitBIHJlbWluZGVyIHRoYXQgdGhpcyBpc3N1ZSB0cmFja2VyIGlzIG1hbmFnZWQgYnkgdGhlIEtocm9ub3MgR3JvdXAuIEludGVyYWN0aW9ucyBoZXJlIHNob3VsZCBmb2xsb3cgdGhlIEtocm9ub3MgQ29kZSBvZiBDb25kdWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9kZXZlbG9wZXJzL2NvZGUtb2YtY29uZHVjdCksIHdoaWNoIHByb2hpYml0cyBhZ2dyZXNzaXZlIG9yIGRlcm9nYXRvcnkgbGFuZ3VhZ2UuIFBsZWFzZSBrZWVwIHRoZSBkaXNjdXNzaW9uIGZyaWVuZGx5IGFuZCBjaXZpbC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvTElDRU5TRS50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg3Mjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9SRUFETUUubWQKQEAgLTAsMCArMSwzNSBAQAorIyBWdWxrYW4tSGVhZGVycworCitWdWxrYW4gaGVhZGVyIGZpbGVzIGFuZCBBUEkgcmVnaXN0cnkKKworIyMgUmVwb3NpdG9yeSBDb250ZW50CisKK1RoZSBjb250ZW50cyBvZiB0aGlzIHJlcG9zaXRvcnkgYXJlIGxhcmdlbHkgb2J0YWluZWQgZnJvbSBvdGhlciByZXBvc2l0b3JpZXMgYW5kIGFyZQorY29sbGVjdGVkLCBjb29yZGluYXRlZCwgYW5kIGN1cmF0ZWQgaGVyZS4KKworRG8gbm90IHByb3Bvc2UgcHVsbCByZXF1ZXN0cyB0byB0aGlzIHJlcG9zaXRvcnkgd2hpY2ggbW9kaWZ5IGFueSBmaWxlcyB1bmRlcgoraW5jbHVkZS92dWxrYW4vIG9yIHJlZ2lzdHJ5Ly4gQWxsIHN1Y2ggZmlsZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZQorVnVsa2FuLURvY3MgcmVwb3NpdG9yeSBhbmQsIGluIHRoZSBjYXNlIG9mIGluY2x1ZGUvdnVsa2FuL3Z1bGthbi5ocHAsIHRoZQorVnVsa2FuLUhwcCByZXBvc2l0b3J5LiBBbnkgY2hhbmdlcyBtdXN0IGJlIG1hZGUgaW4gdGhvc2UgcmVwb3NpdG9yaWVzLgorCitUaGUgcHJvamVjdHMgZm9yIHRoZXNlIHJlcG9zaXRvcmllcyBhcmU6CisKKy0gW0tocm9ub3NHcm91cC9WdWxrYW4tRG9jc10oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tRG9jcykKKyAgLSBDb3JlIFZ1bGthbiBoZWFkZXJzIGFuZCBSZWdpc3RyeQorLSBbS2hyb25vc0dyb3VwL1Z1bGthbi1IcHBdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLUhwcCkKKyAgLSBDKysgQmluZGluZ3MgZm9yIFZ1bGthbgorCitQbGVhc2UgdmlzaXQgdGhlIGFwcHJvcHJpYXRlIHByb2plY3QgaW4gdGhlIGFib3ZlIGxpc3QgZm9yIG9idGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLAorYXNraW5nIHF1ZXN0aW9ucywgb3Igb3BlbmluZyBpc3N1ZXMuCisKKyMjIFZlcnNpb24gVGFnZ2luZyBTY2hlbWUKKworVXBkYXRlcyB0byB0aGUgYFZ1bGthbi1IZWFkZXJzYCByZXBvc2l0b3J5IHdoaWNoIGNvcnJlc3BvbmQgdG8gYSBuZXcgVnVsa2FuCitzcGVjaWZpY2F0aW9uIHJlbGVhc2UgYXJlIHRhZ2dlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKK2B2PGBfYHZlcnNpb25gX2A+YCAoZS5nLiwgYHYxLjEuOTZgKS4KKworKipOb3RlKio6IE1hcmtlZCB2ZXJzaW9uIHJlbGVhc2VzIGhhdmUgdW5kZXJnb25lIHRob3JvdWdoIHRlc3RpbmcgYnV0IGRvIG5vdAoraW1wbHkgdGhlIHNhbWUgcXVhbGl0eSBsZXZlbCBhcyBTREsgdGFncy4gU0RLIHRhZ3MgZm9sbG93IHRoZQorYHNkay08YF9gdmVyc2lvbmBfYD4uPGBfYHBhdGNoYF9gPmAgZm9ybWF0IChlLmcuLCBgc2RrLTEuMS45Mi4wYCkuCisKK1RoaXMgc2NoZW1lIHdhcyBhZG9wdGVkIGZvbGxvd2luZyB0aGUgMS4xLjk2IFZ1bGthbiBzcGVjaWZpY2F0aW9uIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2NtYWtlL0NvcHlyaWdodF9jbWFrZS50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2NtYWtlL0NvcHlyaWdodF9jbWFrZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzYzYzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvY21ha2UvQ29weXJpZ2h0X2NtYWtlLnR4dApAQCAtMCwwICsxLDEyNiBAQAorQ01ha2UgLSBDcm9zcyBQbGF0Zm9ybSBNYWtlZmlsZSBHZW5lcmF0b3IKK0NvcHlyaWdodCAyMDAwLTIwMTggS2l0d2FyZSwgSW5jLiBhbmQgQ29udHJpYnV0b3JzCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisqIE5laXRoZXIgdGhlIG5hbWUgb2YgS2l0d2FyZSwgSW5jLiBub3IgdGhlIG5hbWVzIG9mIENvbnRyaWJ1dG9ycworICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhbmQgaW5zdGl0dXRpb25zIGFyZSBhbW9uZyB0aGUgQ29udHJpYnV0b3JzOgorCisqIEFhcm9uIEMuIE1lYWRvd3MgPGNtYWtlQHNoYWRvd2d1YXJkZGV2LmNvbT4KKyogQWRyaWFhbiBkZSBHcm9vdCA8Z3Jvb3RAa2RlLm9yZz4KKyogQWxla3NleSBBdmRlZXYgPHNvbG9AYWx0bGludXgucnU+CisqIEFsZXhhbmRlciBOZXVuZG9yZiA8bmV1bmRvcmZAa2RlLm9yZz4KKyogQWxleGFuZGVyIFNtb3JrYWxvdiA8YWxleGFuZGVyLnNtb3JrYWxvdkBpdHNlZXouY29tPgorKiBBbGV4ZXkgU29rb2xvdiA8c29rb2xvdkBnb29nbGUuY29tPgorKiBBbGV4IFR1cmJvdiA8aS56YXVmaUBnbWFpbC5jb20+CisqIEFuZHJlYXMgUGFrdWxhdCA8YXBha3VAZ214LmRlPgorKiBBbmRyZWFzIFNjaG5laWRlciA8YXNuQGNyeXB0b21pbGsub3JnPgorKiBBbmRyw6kgUmlnbGFuZCBCcm9kdGtvcmIgPEFuZHJlLkJyb2R0a29yYkBpZmkudWlvLm5vPgorKiBBeGVsIEh1ZWJsLCBIZWxtaG9sdHotWmVudHJ1bSBEcmVzZGVuIC0gUm9zc2VuZG9yZgorKiBCZW5qYW1pbiBFaWtlbAorKiBCam9lcm4gUmlja3MgPGJqb2Vybi5yaWNrc0BnbWFpbC5jb20+CisqIEJyYWQgSGFyZHMgPGJyYWRoQGtkZS5vcmc+CisqIENocmlzdG9waGVyIEhhcnZleQorKiBDaHJpc3RvcGggR3LDvG5pbmdlciA8Zm9zc0BncnVlbmluZ2VyLmRlPgorKiBDbGVtZW50IENyZXVzb3QgPGNyZXVzb3RAY3MueW9yay5hYy51az4KKyogRGFuaWVsIEJsZXplayA8YmxlemVrQGdtYWlsLmNvbT4KKyogRGFuaWVsIFBmZWlmZXIgPGRhbmllbEBwZmVpZmVyLW1haWwuZGU+CisqIEVucmljbyBTY2hvbHogPGVucmljby5zY2hvbHpAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KKyogRXJhbiBJZnJhaCA8ZXJhbi5pZnJhaEBnbWFpbC5jb20+CisqIEVzYmVuIE1vc2UgSGFuc2VuLCBBbmdlIE9wdGltaXphdGlvbiBBcFMKKyogR2VvZmZyZXkgVmlvbGEgPGdlb2ZmcmV5LnZpb2xhQGFzaXJvYm90cy5jb20+CisqIEdvb2dsZSBJbmMKKyogR3JlZ29yIEphc255CisqIEhlbGlvIENoaXNzaW5pIGRlIENhc3RybyA8aGVsaW9Aa2RlLm9yZz4KKyogSWx5YSBMYXZyZW5vdiA8aWx5YS5sYXZyZW5vdkBpdHNlZXouY29tPgorKiBJbnNpZ2h0IFNvZnR3YXJlIENvbnNvcnRpdW0gPGluc2lnaHRzb2Z0d2FyZWNvbnNvcnRpdW0ub3JnPgorKiBKYW4gV29ldHplbAorKiBLZWxseSBUaG9tcHNvbiA8a2d0QGxhbmwuZ292PgorKiBLb25zdGFudGluIFBvZHN2aXJvdiA8a29uc3RhbnRpbkBwb2Rzdmlyb3YucHJvPgorKiBNYXJpbyBCZW5zaSA8bWJlbnNpQGlwc3F1YWQubmV0PgorKiBNYXRoaWV1IE1hbGF0ZXJyZSA8bWF0aGlldS5tYWxhdGVycmVAZ21haWwuY29tPgorKiBNYXR0aGFldXMgRy4gQ2hhamRhcworKiBNYXR0aGlhcyBLcmV0eiA8a3JldHpAa2RlLm9yZz4KKyogTWF0dGhpYXMgTWFlbm5pY2ggPG1hdHRoaWFzQG1hZW5uaWNoLm5ldD4KKyogTWljaGFlbCBTdMO8cm1lcgorKiBNaWd1ZWwgQS4gRmlndWVyb2EtVmlsbGFudWV2YQorKiBNaWtlIEphY2tzb24KKyogTWlrZSBNY1F1YWlkIDxtaWtlQG1pa2VtY3F1YWlkLmNvbT4KKyogTmljb2xhcyBCb2NrIDxuaWNvbGFzYm9ja0BnbWFpbC5jb20+CisqIE5pY29sYXMgRGVzcHJlcyA8bmljb2xhcy5kZXNwcmVzQGdtYWlsLmNvbT4KKyogTmlraXRhIEtydXBlbidrbyA8a3JuZWtpdEBnbWFpbC5jb20+CisqIE5WSURJQSBDb3Jwb3JhdGlvbiA8d3d3Lm52aWRpYS5jb20+CisqIE9wZW5HYW1tYSBMdGQuIDxvcGVuZ2FtbWEuY29tPgorKiBQYXRyaWNrIFN0b3RrbyA8c3RvdGtvQGNzLnVuaS1ib25uLmRlPgorKiBQZXIgw5h5dmluZCBLYXJsc2VuIDxwZXJveXZpbmRAbWFuZHJpdmEub3JnPgorKiBQZXRlciBDb2xsaW5nYm91cm5lIDxwZXRlckBwY2MubWUudWs+CisqIFBldHIgR290dGhhcmQgPGdvdHRoYXJkQGhvbmV5d2VsbC5jb20+CisqIFBoaWxpcCBMb3dtYW4gPHBoaWxpcEB5aGJ0LmNvbT4KKyogUGhpbGlwcGUgUHJvdWx4IDxwcHJvdWx4QGVmZmljaW9zLmNvbT4KKyogUmFmZmkgRW5maWNpYXVkLCBNYXggUGxhbmNrIFNvY2lldHkKKyogUmF1bWZlbGQgPHJhdW1mZWxkLmNvbT4KKyogUm9nZXIgTGVpZ2ggPHJsZWlnaEBjb2RlbGlicmUubmV0PgorKiBSb2xmIEVpa2UgQmVlciA8ZWlrZUBzZi1tYWlsLmRlPgorKiBSb21hbiBEb25jaGVua28gPHJvbWFuLmRvbmNoZW5rb0BpdHNlZXouY29tPgorKiBSb21hbiBLaGFyaXRvbm92IDxyb21hbi5raGFyaXRvbm92QGl0c2Vlei5jb20+CisqIFJ1c2xhbiBCYXJhdG92CisqIFNlYmFzdGlhbiBIb2x0ZXJtYW5uIDxzZWJob2x0QHh3bXcub3JnPgorKiBTdGVwaGVuIEtlbGx5IDxzdGV2ZWlyZUBnbWFpbC5jb20+CisqIFN5bHZhaW4gSm91YmVydCA8am91YmVydC5zeUBnbWFpbC5jb20+CisqIFRob21hcyBTb25kZXJnYWFyZCA8dHNAbWVkaWNhbC1pbnNpZ2h0LmNvbT4KKyogVG9iaWFzIEh1bmdlciA8dG9iaWFzLmh1bmdlckBxdC5pbz4KKyogVG9kZCBHYW1ibGluIDx0Z2FtYmxpbkBsbG5sLmdvdj4KKyogVHJpc3RhbiBDYXJlbAorKiBVbml2ZXJzaXR5IG9mIER1bmRlZQorKiBWYWRpbSBaaHVrb3YKKyogV2lsbCBEaWNoYXJyeSA8d2RpY2hhcnJ5QHN0ZWxsYXJzY2llbmNlLmNvbT4KKworU2VlIHZlcnNpb24gY29udHJvbCBoaXN0b3J5IGZvciBkZXRhaWxzIG9mIGluZGl2aWR1YWwgY29udHJpYnV0aW9ucy4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UgYXBwbGllcyB0byBkaXN0cmlidXRpb25zIG9mCitDTWFrZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtLiAgVGhpcmQtcGFydHkgc29mdHdhcmUgcGFja2FnZXMgc3VwcGxpZWQKK3dpdGggQ01ha2UgdW5kZXIgY29tcGF0aWJsZSBsaWNlbnNlcyBwcm92aWRlIHRoZWlyIG93biBjb3B5cmlnaHQgbm90aWNlcworZG9jdW1lbnRlZCBpbiBjb3JyZXNwb25kaW5nIHN1YmRpcmVjdG9yaWVzIG9yIHNvdXJjZSBmaWxlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NNYWtlIHdhcyBpbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IEtpdHdhcmUgd2l0aCB0aGUgZm9sbG93aW5nIHNwb25zb3JzaGlwOgorCisgKiBOYXRpb25hbCBMaWJyYXJ5IG9mIE1lZGljaW5lIGF0IHRoZSBOYXRpb25hbCBJbnN0aXR1dGVzIG9mIEhlYWx0aAorICAgYXMgcGFydCBvZiB0aGUgSW5zaWdodCBTZWdtZW50YXRpb24gYW5kIFJlZ2lzdHJhdGlvbiBUb29sa2l0IChJVEspLgorCisgKiBVUyBOYXRpb25hbCBMYWJzIChMb3MgQWxhbW9zLCBMaXZlcm1vcmUsIFNhbmRpYSkgQVNDIFBhcmFsbGVsCisgICBWaXN1YWxpemF0aW9uIEluaXRpYXRpdmUuCisKKyAqIE5hdGlvbmFsIEFsbGlhbmNlIGZvciBNZWRpY2FsIEltYWdlIENvbXB1dGluZyAoTkFNSUMpIGlzIGZ1bmRlZCBieSB0aGUKKyAgIE5hdGlvbmFsIEluc3RpdHV0ZXMgb2YgSGVhbHRoIHRocm91Z2ggdGhlIE5JSCBSb2FkbWFwIGZvciBNZWRpY2FsIFJlc2VhcmNoLAorICAgR3JhbnQgVTU0IEVCMDA1MTQ5LgorCisgKiBLaXR3YXJlLCBJbmMuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2NtYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvY21ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzdlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2NtYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbgpAQCAtMCwwICsxLDIxIEBACitpZihOT1QgRVhJU1RTICJAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQC9pbnN0YWxsX21hbmlmZXN0LnR4dCIpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNhbm5vdCBmaW5kIGluc3RhbGwgbWFuaWZlc3Q6IEBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAL2luc3RhbGxfbWFuaWZlc3QudHh0IikKK2VuZGlmKE5PVCBFWElTVFMgIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAL2luc3RhbGxfbWFuaWZlc3QudHh0IikKKworZmlsZShSRUFEICJAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQC9pbnN0YWxsX21hbmlmZXN0LnR4dCIgZmlsZXMpCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiXG4iICI7IiBmaWxlcyAiJHtmaWxlc30iKQorZm9yZWFjaChmaWxlICR7ZmlsZXN9KQorICBtZXNzYWdlKFNUQVRVUyAiVW5pbnN0YWxsaW5nICRFTlZ7REVTVERJUn0ke2ZpbGV9IikKKyAgaWYoSVNfU1lNTElOSyAiJEVOVntERVNURElSfSR7ZmlsZX0iIE9SIEVYSVNUUyAiJEVOVntERVNURElSfSR7ZmlsZX0iKQorICAgIGV4ZWNfcHJvZ3JhbSgKKyAgICAgICJAQ01BS0VfQ09NTUFOREAiIEFSR1MgIi1FIHJlbW92ZSBcIiRFTlZ7REVTVERJUn0ke2ZpbGV9XCIiCisgICAgICBPVVRQVVRfVkFSSUFCTEUgcm1fb3V0CisgICAgICBSRVRVUk5fVkFMVUUgcm1fcmV0dmFsCisgICAgICApCisgICAgaWYoTk9UICIke3JtX3JldHZhbH0iIFNUUkVRVUFMIDApCisgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJQcm9ibGVtIHdoZW4gcmVtb3ZpbmcgJEVOVntERVNURElSfSR7ZmlsZX0iKQorICAgIGVuZGlmKE5PVCAiJHtybV9yZXR2YWx9IiBTVFJFUVVBTCAwKQorICBlbHNlKElTX1NZTUxJTksgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IiBPUiBFWElTVFMgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRmlsZSAkRU5We0RFU1RESVJ9JHtmaWxlfSBkb2VzIG5vdCBleGlzdC4iKQorICBlbmRpZihJU19TWU1MSU5LICIkRU5We0RFU1RESVJ9JHtmaWxlfSIgT1IgRVhJU1RTICIkRU5We0RFU1RESVJ9JHtmaWxlfSIpCitlbmRmb3JlYWNoKGZpbGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3ZrX2ljZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92a19pY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGZmNTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92a19pY2QuaApAQCAtMCwwICsxLDE4MyBAQAorLy8KKy8vIEZpbGU6IHZrX2ljZC5oCisvLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2lmbmRlZiBWS0lDRF9ICisjZGVmaW5lIFZLSUNEX0gKKworI2luY2x1ZGUgInZ1bGthbi5oIgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworLy8gTG9hZGVyLUlDRCB2ZXJzaW9uIG5lZ290aWF0aW9uIEFQSS4gIFZlcnNpb25zIGFkZCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgorLy8gICBWZXJzaW9uIDAgLSBJbml0aWFsLiAgRG9lc24ndCBzdXBwb3J0IHZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHIKKy8vICAgICAgICAgICAgICAgb3IgdmtfaWNkTmVnb3RpYXRlTG9hZGVySUNESW50ZXJmYWNlVmVyc2lvbi4KKy8vICAgVmVyc2lvbiAxIC0gQWRkIHN1cHBvcnQgZm9yIHZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHIuCisvLyAgIFZlcnNpb24gMiAtIEFkZCBMb2FkZXIvSUNEIEludGVyZmFjZSB2ZXJzaW9uIG5lZ290aWF0aW9uCisvLyAgICAgICAgICAgICAgIHZpYSB2a19pY2ROZWdvdGlhdGVMb2FkZXJJQ0RJbnRlcmZhY2VWZXJzaW9uLgorLy8gICBWZXJzaW9uIDMgLSBBZGQgSUNEIGNyZWF0aW9uL2Rlc3RydWN0aW9uIG9mIEtIUl9zdXJmYWNlIG9iamVjdHMuCisvLyAgIFZlcnNpb24gNCAtIEFkZCB1bmtub3duIHBoeXNpY2FsIGRldmljZSBleHRlbnNpb24gcXllcmluZyB2aWEKKy8vICAgICAgICAgICAgICAgdmtfaWNkR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkci4KKy8vICAgVmVyc2lvbiA1IC0gVGVsbHMgSUNEcyB0aGF0IHRoZSBsb2FkZXIgaXMgbm93IHBheWluZyBhdHRlbnRpb24gdG8gdGhlCisvLyAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHZlcnNpb24gb2YgVnVsa2FuIHBhc3NlZCBpbnRvIHRoZSBBcHBsaWNhdGlvbkluZm8KKy8vICAgICAgICAgICAgICAgc3RydWN0dXJlIGR1cmluZyB2a0NyZWF0ZUluc3RhbmNlLiAgVGhpcyB3aWxsIHRlbGwgdGhlIElDRAorLy8gICAgICAgICAgICAgICB0aGF0IGlmIHRoZSBsb2FkZXIgaXMgb2xkZXIsIGl0IHNob3VsZCBhdXRvbWF0aWNhbGx5IGZhaWwgYQorLy8gICAgICAgICAgICAgICBjYWxsIGZvciBhbnkgQVBJIHZlcnNpb24gPiAxLjAuICBPdGhlcndpc2UsIHRoZSBsb2FkZXIgd2lsbAorLy8gICAgICAgICAgICAgICBtYW51YWxseSBkZXRlcm1pbmUgaWYgaXQgY2FuIHN1cHBvcnQgdGhlIGV4cGVjdGVkIHZlcnNpb24uCisjZGVmaW5lIENVUlJFTlRfTE9BREVSX0lDRF9JTlRFUkZBQ0VfVkVSU0lPTiA1CisjZGVmaW5lIE1JTl9TVVBQT1JURURfTE9BREVSX0lDRF9JTlRFUkZBQ0VfVkVSU0lPTiAwCisjZGVmaW5lIE1JTl9QSFlTX0RFVl9FWFRFTlNJT05fSUNEX0lOVEVSRkFDRV9WRVJTSU9OIDQKK3R5cGVkZWYgVmtSZXN1bHQoVktBUElfUFRSICpQRk5fdmtOZWdvdGlhdGVMb2FkZXJJQ0RJbnRlcmZhY2VWZXJzaW9uKSh1aW50MzJfdCAqcFZlcnNpb24pOworCisvLyBUaGlzIGlzIGRlZmluZWQgaW4gdmtfbGF5ZXIuaCB3aGljaCB3aWxsIGJlIGZvdW5kIGJ5IHRoZSBsb2FkZXIsIGJ1dCBpZiBhbiBJQ0QgaXMgYnVpbGRpbmcgYWdhaW5zdCB0aGlzCisvLyBmaWxlIGRpcmVjdGx5LCBpdCB3b24ndCBiZSBmb3VuZC4KKyNpZm5kZWYgUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIKK3R5cGVkZWYgUEZOX3ZrVm9pZEZ1bmN0aW9uKFZLQVBJX1BUUiAqUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIgKnBOYW1lKTsKKyNlbmRpZgorCisvKgorICogVGhlIElDRCBtdXN0IHJlc2VydmUgc3BhY2UgZm9yIGEgcG9pbnRlciBmb3IgdGhlIGxvYWRlcidzIGRpc3BhdGNoCisgKiB0YWJsZSwgYXQgdGhlIHN0YXJ0IG9mIDxlYWNoIG9iamVjdD4uCisgKiBUaGUgSUNEIG11c3QgaW5pdGlhbGl6ZSB0aGlzIHZhcmlhYmxlIHVzaW5nIHRoZSBTRVRfTE9BREVSX01BR0lDX1ZBTFVFIG1hY3JvLgorICovCisKKyNkZWZpbmUgSUNEX0xPQURFUl9NQUdJQyAweDAxQ0RDMERFCisKK3R5cGVkZWYgdW5pb24geworICAgIHVpbnRwdHJfdCBsb2FkZXJNYWdpYzsKKyAgICB2b2lkICpsb2FkZXJEYXRhOworfSBWS19MT0FERVJfREFUQTsKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9sb2FkZXJfbWFnaWNfdmFsdWUodm9pZCAqcE5ld09iamVjdCkgeworICAgIFZLX0xPQURFUl9EQVRBICpsb2FkZXJfaW5mbyA9IChWS19MT0FERVJfREFUQSAqKXBOZXdPYmplY3Q7CisgICAgbG9hZGVyX2luZm8tPmxvYWRlck1hZ2ljID0gSUNEX0xPQURFUl9NQUdJQzsKK30KKworc3RhdGljIGlubGluZSBib29sIHZhbGlkX2xvYWRlcl9tYWdpY192YWx1ZSh2b2lkICpwTmV3T2JqZWN0KSB7CisgICAgY29uc3QgVktfTE9BREVSX0RBVEEgKmxvYWRlcl9pbmZvID0gKFZLX0xPQURFUl9EQVRBICopcE5ld09iamVjdDsKKyAgICByZXR1cm4gKGxvYWRlcl9pbmZvLT5sb2FkZXJNYWdpYyAmIDB4ZmZmZmZmZmYpID09IElDRF9MT0FERVJfTUFHSUM7Cit9CisKKy8qCisgKiBXaW5kb3dzIGFuZCBMaW51eCBJQ0RzIHdpbGwgdHJlYXQgVmtTdXJmYWNlS0hSIGFzIGEgcG9pbnRlciB0byBhIHN0cnVjdCB0aGF0CisgKiBjb250YWlucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29ubmVjdGlvbiBhbmQgc3VyZmFjZSBpbmZvcm1hdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBWS19JQ0RfV1NJX1BMQVRGT1JNX01JUiwKKyAgICBWS19JQ0RfV1NJX1BMQVRGT1JNX1dBWUxBTkQsCisgICAgVktfSUNEX1dTSV9QTEFURk9STV9XSU4zMiwKKyAgICBWS19JQ0RfV1NJX1BMQVRGT1JNX1hDQiwKKyAgICBWS19JQ0RfV1NJX1BMQVRGT1JNX1hMSUIsCisgICAgVktfSUNEX1dTSV9QTEFURk9STV9BTkRST0lELAorICAgIFZLX0lDRF9XU0lfUExBVEZPUk1fTUFDT1MsCisgICAgVktfSUNEX1dTSV9QTEFURk9STV9JT1MsCisgICAgVktfSUNEX1dTSV9QTEFURk9STV9ESVNQTEFZLAorICAgIFZLX0lDRF9XU0lfUExBVEZPUk1fSEVBRExFU1MsCisgICAgVktfSUNEX1dTSV9QTEFURk9STV9NRVRBTCwKK30gVmtJY2RXc2lQbGF0Zm9ybTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrSWNkV3NpUGxhdGZvcm0gcGxhdGZvcm07Cit9IFZrSWNkU3VyZmFjZUJhc2U7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUlSX0tIUgordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrSWNkU3VyZmFjZUJhc2UgYmFzZTsKKyAgICBNaXJDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgIE1pclN1cmZhY2UgKm1pclN1cmZhY2U7Cit9IFZrSWNkU3VyZmFjZU1pcjsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX01JUl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrSWNkU3VyZmFjZUJhc2UgYmFzZTsKKyAgICBzdHJ1Y3Qgd2xfZGlzcGxheSAqZGlzcGxheTsKKyAgICBzdHJ1Y3Qgd2xfc3VyZmFjZSAqc3VyZmFjZTsKK30gVmtJY2RTdXJmYWNlV2F5bGFuZDsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmtJY2RTdXJmYWNlQmFzZSBiYXNlOworICAgIEhJTlNUQU5DRSBoaW5zdGFuY2U7CisgICAgSFdORCBod25kOworfSBWa0ljZFN1cmZhY2VXaW4zMjsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWa0ljZFN1cmZhY2VCYXNlIGJhc2U7CisgICAgeGNiX2Nvbm5lY3Rpb25fdCAqY29ubmVjdGlvbjsKKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OworfSBWa0ljZFN1cmZhY2VYY2I7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWa0ljZFN1cmZhY2VCYXNlIGJhc2U7CisgICAgRGlzcGxheSAqZHB5OworICAgIFdpbmRvdyB3aW5kb3c7Cit9IFZrSWNkU3VyZmFjZVhsaWI7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmtJY2RTdXJmYWNlQmFzZSBiYXNlOworICAgIHN0cnVjdCBBTmF0aXZlV2luZG93ICp3aW5kb3c7Cit9IFZrSWNkU3VyZmFjZUFuZHJvaWQ7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrSWNkU3VyZmFjZUJhc2UgYmFzZTsKKyAgICBjb25zdCB2b2lkICpwVmlldzsKK30gVmtJY2RTdXJmYWNlTWFjT1M7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmtJY2RTdXJmYWNlQmFzZSBiYXNlOworICAgIGNvbnN0IHZvaWQgKnBWaWV3OworfSBWa0ljZFN1cmZhY2VJT1M7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWa0ljZFN1cmZhY2VCYXNlIGJhc2U7CisgICAgVmtEaXNwbGF5TW9kZUtIUiBkaXNwbGF5TW9kZTsKKyAgICB1aW50MzJfdCBwbGFuZUluZGV4OworICAgIHVpbnQzMl90IHBsYW5lU3RhY2tJbmRleDsKKyAgICBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiB0cmFuc2Zvcm07CisgICAgZmxvYXQgZ2xvYmFsQWxwaGE7CisgICAgVmtEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSIGFscGhhTW9kZTsKKyAgICBWa0V4dGVudDJEIGltYWdlRXh0ZW50OworfSBWa0ljZFN1cmZhY2VEaXNwbGF5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmtJY2RTdXJmYWNlQmFzZSBiYXNlOworfSBWa0ljZFN1cmZhY2VIZWFkbGVzczsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWa0ljZFN1cmZhY2VCYXNlIGJhc2U7CisgICAgY29uc3QgQ0FNZXRhbExheWVyICpwTGF5ZXI7Cit9IFZrSWNkU3VyZmFjZU1ldGFsOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworI2VuZGlmICAvLyBWS0lDRF9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3ZrX2xheWVyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3ZrX2xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3NjUyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdmtfbGF5ZXIuaApAQCAtMCwwICsxLDIwMiBAQAorLy8KKy8vIEZpbGU6IHZrX2xheWVyLmgKKy8vCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKiBOZWVkIHRvIGRlZmluZSBkaXNwYXRjaCB0YWJsZQorICogQ29yZSBzdHJ1Y3QgY2FuIHRoZW4gaGF2ZSBwdHIgdG8gZGlzcGF0Y2ggdGFibGUgYXQgdGhlIHRvcAorICogQWxvbmcgd2l0aCBvYmplY3QgcHRycyBmb3IgY3VycmVudCBhbmQgbmV4dCBPQkoKKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJ2dWxrYW4uaCIKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIFZLX0xBWUVSX0VYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgVktfTEFZRVJfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxzZQorI2RlZmluZSBWS19MQVlFUl9FWFBPUlQKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9OVU1fVU5LTk9XTl9FWFRTIDI1MAorCisgLy8gTG9hZGVyLUxheWVyIHZlcnNpb24gbmVnb3RpYXRpb24gQVBJLiAgVmVyc2lvbnMgYWRkIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6CisgLy8gICBWZXJzaW9ucyAwLzEgLSBJbml0aWFsLiAgRG9lc24ndCBzdXBwb3J0IHZrX2xheWVyR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcgorIC8vICAgICAgICAgICAgICAgICAgb3IgdmtfaWNkTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uLgorIC8vICAgVmVyc2lvbiAyICAgIC0gQWRkIHN1cHBvcnQgZm9yIHZrX2xheWVyR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciBhbmQKKyAvLyAgICAgICAgICAgICAgICAgIHZrX2ljZE5lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbi4KKyNkZWZpbmUgQ1VSUkVOVF9MT0FERVJfTEFZRVJfSU5URVJGQUNFX1ZFUlNJT04gMgorI2RlZmluZSBNSU5fU1VQUE9SVEVEX0xPQURFUl9MQVlFUl9JTlRFUkZBQ0VfVkVSU0lPTiAxCisKKyNkZWZpbmUgVktfQ1VSUkVOVF9DSEFJTl9WRVJTSU9OIDEKKworLy8gVHlwZWRlZiBmb3IgdXNlIGluIHRoZSBpbnRlcmZhY2VzIGJlbG93Cit0eXBlZGVmIFBGTl92a1ZvaWRGdW5jdGlvbiAoVktBUElfUFRSICpQRk5fR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcikoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciogcE5hbWUpOworCisvLyBWZXJzaW9uIG5lZ290aWF0aW9uIHZhbHVlcwordHlwZWRlZiBlbnVtIFZrTmVnb3RpYXRlTGF5ZXJTdHJ1Y3RUeXBlIHsKKyAgICBMQVlFUl9ORUdPVElBVEVfVU5JTlRJQUxJWkVEID0gMCwKKyAgICBMQVlFUl9ORUdPVElBVEVfSU5URVJGQUNFX1NUUlVDVCA9IDEsCit9IFZrTmVnb3RpYXRlTGF5ZXJTdHJ1Y3RUeXBlOworCisvLyBWZXJzaW9uIG5lZ290aWF0aW9uIHN0cnVjdHVyZXMKK3R5cGVkZWYgc3RydWN0IFZrTmVnb3RpYXRlTGF5ZXJJbnRlcmZhY2UgeworICAgIFZrTmVnb3RpYXRlTGF5ZXJTdHJ1Y3RUeXBlIHNUeXBlOworICAgIHZvaWQgKnBOZXh0OworICAgIHVpbnQzMl90IGxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbjsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIHBmbkdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgcGZuR2V0RGV2aWNlUHJvY0FkZHI7CisgICAgUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgcGZuR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcjsKK30gVmtOZWdvdGlhdGVMYXllckludGVyZmFjZTsKKworLy8gVmVyc2lvbiBuZWdvdGlhdGlvbiBmdW5jdGlvbnMKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uKShWa05lZ290aWF0ZUxheWVySW50ZXJmYWNlICpwVmVyc2lvblN0cnVjdCk7CisKKy8vIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdW5rbm93biBwaHlzaWNhbCBkZXZpY2UgZXh0ZW5zaW9uIGNvbW1hbmQKK3R5cGVkZWYgVmtSZXN1bHQoVktBUElfUFRSICpQRk5fUGh5c0RldkV4dCkoVmtQaHlzaWNhbERldmljZSBwaHlzX2RldmljZSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ3JlYXRlSW5zdGFuY2UgYW5kIENyZWF0ZURldmljZSBzdXBwb3J0IHN0cnVjdHVyZXMKKworLyogU3ViIHR5cGUgb2Ygc3RydWN0dXJlIGZvciBpbnN0YW5jZSBhbmQgZGV2aWNlIGxvYWRlciBleHQgb2YgQ3JlYXRlSW5mby4KKyAqIFdoZW4gc1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPCisgKiBvciBzVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfREVWSUNFX0NSRUFURV9JTkZPCisgKiB0aGVuIFZrTGF5ZXJGdW5jdGlvbiBpbmRpY2F0ZXMgc3RydWN0IHR5cGUgcG9pbnRlZCB0byBieSBwTmV4dAorICovCit0eXBlZGVmIGVudW0gVmtMYXllckZ1bmN0aW9uXyB7CisgICAgVktfTEFZRVJfTElOS19JTkZPID0gMCwKKyAgICBWS19MT0FERVJfREFUQV9DQUxMQkFDSyA9IDEsCisgICAgVktfTE9BREVSX0xBWUVSX0NSRUFURV9ERVZJQ0VfQ0FMTEJBQ0sgPSAyCit9IFZrTGF5ZXJGdW5jdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtMYXllckluc3RhbmNlTGlua18geworICAgIHN0cnVjdCBWa0xheWVySW5zdGFuY2VMaW5rXyAqcE5leHQ7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBwZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBQRk5fR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciBwZm5OZXh0R2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcjsKK30gVmtMYXllckluc3RhbmNlTGluazsKKworLyoKKyAqIFdoZW4gY3JlYXRpbmcgdGhlIGRldmljZSBjaGFpbiB0aGUgbG9hZGVyIG5lZWRzIHRvIHBhc3MKKyAqIGRvd24gaW5mb3JtYXRpb24gYWJvdXQgaXQncyBkZXZpY2Ugc3RydWN0dXJlIG5lZWRlZCBhdAorICogdGhlIGVuZCBvZiB0aGUgY2hhaW4uIFBhc3NpbmcgdGhlIGRhdGEgdmlhIHRoZQorICogVmtMYXllckRldmljZUluZm8gYXZvaWRzIGlzc3VlcyB3aXRoIGZpbmRpbmcgdGhlCisgKiBleGFjdCBpbnN0YW5jZSBiZWluZyB1c2VkLgorICovCit0eXBlZGVmIHN0cnVjdCBWa0xheWVyRGV2aWNlSW5mb18geworICAgIHZvaWQgKmRldmljZV9pbmZvOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgcGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7Cit9IFZrTGF5ZXJEZXZpY2VJbmZvOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1NldEluc3RhbmNlTG9hZGVyRGF0YSkoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgdm9pZCAqb2JqZWN0KTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrU2V0RGV2aWNlTG9hZGVyRGF0YSkoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICB2b2lkICpvYmplY3QpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtMYXllckNyZWF0ZURldmljZSkoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKwkJCQkJCSAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UsIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgbGF5ZXJHSVBBLCBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciAqbmV4dEdEUEEpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0xheWVyRGVzdHJveURldmljZSkoVmtEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgUEZOX3ZrRGVzdHJveURldmljZSBkZXN0cm95RnVuY3Rpb24pOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsgLy8gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPCisgICAgY29uc3Qgdm9pZCAqcE5leHQ7CisgICAgVmtMYXllckZ1bmN0aW9uIGZ1bmN0aW9uOworICAgIHVuaW9uIHsKKyAgICAgICAgVmtMYXllckluc3RhbmNlTGluayAqcExheWVySW5mbzsKKyAgICAgICAgUEZOX3ZrU2V0SW5zdGFuY2VMb2FkZXJEYXRhIHBmblNldEluc3RhbmNlTG9hZGVyRGF0YTsKKyAgICAgICAgc3RydWN0IHsKKwkgIFBGTl92a0xheWVyQ3JlYXRlRGV2aWNlIHBmbkxheWVyQ3JlYXRlRGV2aWNlOworCSAgUEZOX3ZrTGF5ZXJEZXN0cm95RGV2aWNlIHBmbkxheWVyRGVzdHJveURldmljZTsKKwl9IGxheWVyRGV2aWNlOworICAgIH0gdTsKK30gVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtMYXllckRldmljZUxpbmtfIHsKKyAgICBzdHJ1Y3QgVmtMYXllckRldmljZUxpbmtfICpwTmV4dDsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIHBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIHBmbk5leHRHZXREZXZpY2VQcm9jQWRkcjsKK30gVmtMYXllckRldmljZUxpbms7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7IC8vIFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9ERVZJQ0VfQ1JFQVRFX0lORk8KKyAgICBjb25zdCB2b2lkICpwTmV4dDsKKyAgICBWa0xheWVyRnVuY3Rpb24gZnVuY3Rpb247CisgICAgdW5pb24geworICAgICAgICBWa0xheWVyRGV2aWNlTGluayAqcExheWVySW5mbzsKKyAgICAgICAgUEZOX3ZrU2V0RGV2aWNlTG9hZGVyRGF0YSBwZm5TZXREZXZpY2VMb2FkZXJEYXRhOworICAgIH0gdTsKK30gVmtMYXllckRldmljZUNyZWF0ZUluZm87CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uKFZrTmVnb3RpYXRlTGF5ZXJJbnRlcmZhY2UgKnBWZXJzaW9uU3RydWN0KTsKKwordHlwZWRlZiBlbnVtIFZrQ2hhaW5UeXBlIHsKKyAgICBWS19DSEFJTl9UWVBFX1VOS05PV04gPSAwLAorICAgIFZLX0NIQUlOX1RZUEVfRU5VTUVSQVRFX0lOU1RBTkNFX0VYVEVOU0lPTl9QUk9QRVJUSUVTID0gMSwKKyAgICBWS19DSEFJTl9UWVBFX0VOVU1FUkFURV9JTlNUQU5DRV9MQVlFUl9QUk9QRVJUSUVTID0gMiwKKyAgICBWS19DSEFJTl9UWVBFX0VOVU1FUkFURV9JTlNUQU5DRV9WRVJTSU9OID0gMywKK30gVmtDaGFpblR5cGU7CisKK3R5cGVkZWYgc3RydWN0IFZrQ2hhaW5IZWFkZXIgeworICAgIFZrQ2hhaW5UeXBlIHR5cGU7CisgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICB1aW50MzJfdCBzaXplOworfSBWa0NoYWluSGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCBWa0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc0NoYWluIHsKKyAgICBWa0NoYWluSGVhZGVyIGhlYWRlcjsKKyAgICBWa1Jlc3VsdChWS0FQSV9QVFIgKnBmbk5leHRMYXllcikoY29uc3Qgc3RydWN0IFZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzQ2hhaW4gKiwgY29uc3QgY2hhciAqLCB1aW50MzJfdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKik7CisgICAgY29uc3Qgc3RydWN0IFZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzQ2hhaW4gKnBOZXh0TGluazsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgICAgaW5saW5lIFZrUmVzdWx0IENhbGxEb3duKGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgY29uc3QgeworICAgICAgICByZXR1cm4gcGZuTmV4dExheWVyKHBOZXh0TGluaywgcExheWVyTmFtZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisjZW5kaWYKK30gVmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNDaGFpbjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllc0NoYWluIHsKKyAgICBWa0NoYWluSGVhZGVyIGhlYWRlcjsKKyAgICBWa1Jlc3VsdChWS0FQSV9QVFIgKnBmbk5leHRMYXllcikoY29uc3Qgc3RydWN0IFZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNDaGFpbiAqLCB1aW50MzJfdCAqLCBWa0xheWVyUHJvcGVydGllcyAqKTsKKyAgICBjb25zdCBzdHJ1Y3QgVmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllc0NoYWluICpwTmV4dExpbms7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICAgIGlubGluZSBWa1Jlc3VsdCBDYWxsRG93bih1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgY29uc3QgeworICAgICAgICByZXR1cm4gcGZuTmV4dExheWVyKHBOZXh0TGluaywgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisjZW5kaWYKK30gVmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllc0NoYWluOworCit0eXBlZGVmIHN0cnVjdCBWa0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbkNoYWluIHsKKyAgICBWa0NoYWluSGVhZGVyIGhlYWRlcjsKKyAgICBWa1Jlc3VsdChWS0FQSV9QVFIgKnBmbk5leHRMYXllcikoY29uc3Qgc3RydWN0IFZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uQ2hhaW4gKiwgdWludDMyX3QgKik7CisgICAgY29uc3Qgc3RydWN0IFZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uQ2hhaW4gKnBOZXh0TGluazsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgICAgaW5saW5lIFZrUmVzdWx0IENhbGxEb3duKHVpbnQzMl90ICpwQXBpVmVyc2lvbikgY29uc3QgeworICAgICAgICByZXR1cm4gcGZuTmV4dExheWVyKHBOZXh0TGluaywgcEFwaVZlcnNpb24pOworICAgIH0KKyNlbmRpZgorfSBWa0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbkNoYWluOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92a19wbGF0Zm9ybS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92a19wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODkyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3ZrX3BsYXRmb3JtLmgKQEAgLTAsMCArMSw5MiBAQAorLy8KKy8vIEZpbGU6IHZrX3BsYXRmb3JtLmgKKy8vCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisjaWZuZGVmIFZLX1BMQVRGT1JNX0hfCisjZGVmaW5lIFZLX1BMQVRGT1JNX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBQbGF0Zm9ybS1zcGVjaWZpYyBkaXJlY3RpdmVzIGFuZCB0eXBlIGRlY2xhcmF0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKiBQbGF0Zm9ybS1zcGVjaWZpYyBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm9zLgorICoKKyAqIFBsYXRmb3JtcyBzaG91bGQgZGVmaW5lIHRoZXNlIHNvIHRoYXQgVnVsa2FuIGNsaWVudHMgY2FsbCBWdWxrYW4gY29tbWFuZHMKKyAqIHdpdGggdGhlIHNhbWUgY2FsbGluZyBjb252ZW50aW9ucyB0aGF0IHRoZSBWdWxrYW4gaW1wbGVtZW50YXRpb24gZXhwZWN0cy4KKyAqCisgKiBWS0FQSV9BVFRSIC0gUGxhY2VkIGJlZm9yZSB0aGUgcmV0dXJuIHR5cGUgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICogICAgICAgICAgICAgIFVzZWZ1bCBmb3IgQysrMTEgYW5kIEdDQy9DbGFuZy1zdHlsZSBmdW5jdGlvbiBhdHRyaWJ1dGUgc3ludGF4LgorICogVktBUElfQ0FMTCAtIFBsYWNlZCBhZnRlciB0aGUgcmV0dXJuIHR5cGUgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICogICAgICAgICAgICAgIFVzZWZ1bCBmb3IgTVNWQy1zdHlsZSBjYWxsaW5nIGNvbnZlbnRpb24gc3ludGF4LgorICogVktBUElfUFRSICAtIFBsYWNlZCBiZXR3ZWVuIHRoZSAnKCcgYW5kICcqJyBpbiBmdW5jdGlvbiBwb2ludGVyIHR5cGVzLgorICoKKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9uOiAgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDb21tYW5kKHZvaWQpOworICogRnVuY3Rpb24gcG9pbnRlciB0eXBlOiB0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ29tbWFuZCkodm9pZCk7CisgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICAvLyBPbiBXaW5kb3dzLCBWdWxrYW4gY29tbWFuZHMgdXNlIHRoZSBzdGRjYWxsIGNvbnZlbnRpb24KKyAgICAjZGVmaW5lIFZLQVBJX0FUVFIKKyAgICAjZGVmaW5lIFZLQVBJX0NBTEwgX19zdGRjYWxsCisgICAgI2RlZmluZSBWS0FQSV9QVFIgIFZLQVBJX0NBTEwKKyNlbGlmIGRlZmluZWQoX19BTkRST0lEX18pICYmIGRlZmluZWQoX19BUk1fQVJDSCkgJiYgX19BUk1fQVJDSCA8IDcKKyAgICAjZXJyb3IgIlZ1bGthbiBpc24ndCBzdXBwb3J0ZWQgZm9yIHRoZSAnYXJtZWFiaScgTkRLIEFCSSIKKyNlbGlmIGRlZmluZWQoX19BTkRST0lEX18pICYmIGRlZmluZWQoX19BUk1fQVJDSCkgJiYgX19BUk1fQVJDSCA+PSA3ICYmIGRlZmluZWQoX19BUk1fMzJCSVRfU1RBVEUpCisgICAgLy8gT24gQW5kcm9pZCAzMi1iaXQgQVJNIHRhcmdldHMsIFZ1bGthbiBmdW5jdGlvbnMgdXNlIHRoZSAiaGFyZGZsb2F0IgorICAgIC8vIGNhbGxpbmcgY29udmVudGlvbiwgaS5lLiBmbG9hdCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXJzLiBUaGlzCisgICAgLy8gaXMgdHJ1ZSBldmVuIGlmIHRoZSByZXN0IG9mIHRoZSBhcHBsaWNhdGlvbiBwYXNzZXMgZmxvYXRzIG9uIHRoZSBzdGFjaywKKyAgICAvLyBhcyBpdCBkb2VzIGJ5IGRlZmF1bHQgd2hlbiBjb21waWxpbmcgZm9yIHRoZSBhcm1lYWJpLXY3YSBOREsgQUJJLgorICAgICNkZWZpbmUgVktBUElfQVRUUiBfX2F0dHJpYnV0ZV9fKChwY3MoImFhcGNzLXZmcCIpKSkKKyAgICAjZGVmaW5lIFZLQVBJX0NBTEwKKyAgICAjZGVmaW5lIFZLQVBJX1BUUiAgVktBUElfQVRUUgorI2Vsc2UKKyAgICAvLyBPbiBvdGhlciBwbGF0Zm9ybXMsIHVzZSB0aGUgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24KKyAgICAjZGVmaW5lIFZLQVBJX0FUVFIKKyAgICAjZGVmaW5lIFZLQVBJX0NBTEwKKyAgICAjZGVmaW5lIFZLQVBJX1BUUgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmICFkZWZpbmVkKFZLX05PX1NURElOVF9IKQorICAgICNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPCAxNjAwKQorICAgICAgICB0eXBlZGVmIHNpZ25lZCAgIF9faW50OCAgaW50OF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50OCAgdWludDhfdDsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgICBfX2ludDE2IGludDE2X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQxNiB1aW50MTZfdDsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgICBfX2ludDMyIGludDMyX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiB1aW50MzJfdDsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgICBfX2ludDY0IGludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKKyAgICAjZWxzZQorICAgICAgICAjaW5jbHVkZSA8c3RkaW50Lmg+CisgICAgI2VuZGlmCisjZW5kaWYgLy8gIWRlZmluZWQoVktfTk9fU1RESU5UX0gpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3ZrX3Nka19wbGF0Zm9ybS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92a19zZGtfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQ4Njc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92a19zZGtfcGxhdGZvcm0uaApAQCAtMCwwICsxLDY5IEBACisvLworLy8gRmlsZTogdmtfc2RrX3BsYXRmb3JtLmgKKy8vCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVktfU0RLX1BMQVRGT1JNX0gKKyNkZWZpbmUgVktfU0RLX1BMQVRGT1JNX0gKKworI2lmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBOT01JTk1BWAorI2lmbmRlZiBfX2NwbHVzcGx1cworI3VuZGVmIGlubGluZQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMCAvKnZzMjAxNSovKQorLy8gQzk5OgorLy8gTWljcm9zb2Z0IGRpZG4ndCBpbXBsZW1lbnQgQzk5IGluIFZpc3VhbCBTdHVkaW87IGJ1dCBzdGFydGVkIGFkZGluZyBpdCB3aXRoCisvLyBWUzIwMTMuICBIb3dldmVyLCBWUzIwMTMgc3RpbGwgZGlkbid0IGhhdmUgc25wcmludGYoKS4gIFRoZSBmb2xsb3dpbmcgaXMgYQorLy8gd29yay1hcm91bmQgKE5vdGU6IFRoZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyBtYWNybyBtdXN0IGJlIHNldCBpbiB0aGUKKy8vICJDTWFrZUxpc3RzLnR4dCIgZmlsZSkuCisvLyBOT1RFOiBUaGlzIGlzIGZpeGVkIGluIFZpc3VhbCBTdHVkaW8gMjAxNS4KKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworI2RlZmluZSBzdHJkdXAgX3N0cmR1cAorCisjZW5kaWYgLy8gX1dJTjMyCisKKy8vIENoZWNrIGZvciBub2V4Y2VwdCBzdXBwb3J0IHVzaW5nIGNsYW5nLCB3aXRoIGZhbGxiYWNrIHRvIFdpbmRvd3Mgb3IgR0NDIHZlcnNpb24gbnVtYmVycworI2lmbmRlZiBOT0VYQ0VQVAorI2lmIGRlZmluZWQoX19jbGFuZ19fKQorI2lmIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorI2RlZmluZSBIQVNfTk9FWENFUFQKKyNlbmRpZgorI2Vsc2UKKyNpZiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSAmJiBfX0dOVUNfXyAqIDEwICsgX19HTlVDX01JTk9SX18gPj0gNDYKKyNkZWZpbmUgSEFTX05PRVhDRVBUCisjZWxzZQorI2lmIGRlZmluZWQoX01TQ19GVUxMX1ZFUikgJiYgX01TQ19GVUxMX1ZFUiA+PSAxOTAwMjMwMjYgJiYgZGVmaW5lZChfSEFTX0VYQ0VQVElPTlMpICYmIF9IQVNfRVhDRVBUSU9OUworI2RlZmluZSBIQVNfTk9FWENFUFQKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBU19OT0VYQ0VQVAorI2RlZmluZSBOT0VYQ0VQVCBub2V4Y2VwdAorI2Vsc2UKKyNkZWZpbmUgTk9FWENFUFQKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAgLy8gVktfU0RLX1BMQVRGT1JNX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmODUzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbi5oCkBAIC0wLDAgKzEsODYgQEAKKyNpZm5kZWYgVlVMS0FOX0hfCisjZGVmaW5lIFZVTEtBTl9IXyAxCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSAidmtfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2dWxrYW5fY29yZS5oIgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaW5jbHVkZSAidnVsa2FuX2FuZHJvaWQuaCIKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyNpbmNsdWRlIDx6aXJjb24vdHlwZXMuaD4KKyNpbmNsdWRlICJ2dWxrYW5fZnVjaHNpYS5oIgorI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworI2luY2x1ZGUgInZ1bGthbl9pb3MuaCIKKyNlbmRpZgorCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisjaW5jbHVkZSAidnVsa2FuX21hY29zLmgiCisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyNpbmNsdWRlICJ2dWxrYW5fbWV0YWwuaCIKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisjaW5jbHVkZSAidnVsa2FuX3ZpLmgiCisjZW5kaWYKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaW5jbHVkZSA8d2F5bGFuZC1jbGllbnQuaD4KKyNpbmNsdWRlICJ2dWxrYW5fd2F5bGFuZC5oIgorI2VuZGlmCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAidnVsa2FuX3dpbjMyLmgiCisjZW5kaWYKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpbmNsdWRlIDx4Y2IveGNiLmg+CisjaW5jbHVkZSAidnVsa2FuX3hjYi5oIgorI2VuZGlmCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSAidnVsa2FuX3hsaWIuaCIKKyNlbmRpZgorCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YcmFuZHIuaD4KKyNpbmNsdWRlICJ2dWxrYW5feGxpYl94cmFuZHIuaCIKKyNlbmRpZgorCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisjaW5jbHVkZSA8Z2dwX2MvdnVsa2FuX3R5cGVzLmg+CisjaW5jbHVkZSAidnVsa2FuX2dncC5oIgorI2VuZGlmCisKKyNlbmRpZiAvLyBWVUxLQU5fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuLmhwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGRiYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW4uaHBwCkBAIC0wLDAgKzEsNjkyNTcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKy8vIAorLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorLy8gLS0tLSBFeGNlcHRpb25zIHRvIHRoZSBBcGFjaGUgMi4wIExpY2Vuc2U6IC0tLS0KKy8vIAorLy8gQXMgYW4gZXhjZXB0aW9uLCBpZiB5b3UgdXNlIHRoaXMgU29mdHdhcmUgdG8gZ2VuZXJhdGUgY29kZSBhbmQgcG9ydGlvbnMgb2YKKy8vIHRoaXMgU29mdHdhcmUgYXJlIGVtYmVkZGVkIGludG8gdGhlIGdlbmVyYXRlZCBjb2RlIGFzIGEgcmVzdWx0LCB5b3UgbWF5CisvLyByZWRpc3RyaWJ1dGUgc3VjaCBwcm9kdWN0IHdpdGhvdXQgcHJvdmlkaW5nIGF0dHJpYnV0aW9uIGFzIHdvdWxkIG90aGVyd2lzZQorLy8gYmUgcmVxdWlyZWQgYnkgU2VjdGlvbnMgNChhKSwgNChiKSBhbmQgNChkKSBvZiB0aGUgTGljZW5zZS4KKy8vIAorLy8gSW4gYWRkaXRpb24sIGlmIHlvdSBjb21iaW5lIG9yIGxpbmsgY29kZSBnZW5lcmF0ZWQgYnkgdGhpcyBTb2Z0d2FyZSB3aXRoCisvLyBzb2Z0d2FyZSB0aGF0IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MiBvciB0aGUgTEdQTCB2Mi4wIG9yIDIuMQorLy8gKCJgQ29tYmluZWQgU29mdHdhcmVgIikgYW5kIGlmIGEgY291cnQgb2YgY29tcGV0ZW50IGp1cmlzZGljdGlvbiBkZXRlcm1pbmVzCisvLyB0aGF0IHRoZSBwYXRlbnQgcHJvdmlzaW9uIChTZWN0aW9uIDMpLCB0aGUgaW5kZW1uaXR5IHByb3Zpc2lvbiAoU2VjdGlvbiA5KQorLy8gb3Igb3RoZXIgU2VjdGlvbiBvZiB0aGUgTGljZW5zZSBjb25mbGljdHMgd2l0aCB0aGUgY29uZGl0aW9ucyBvZiB0aGUKKy8vIGFwcGxpY2FibGUgR1BMIG9yIExHUEwgbGljZW5zZSwgeW91IG1heSByZXRyb2FjdGl2ZWx5IGFuZCBwcm9zcGVjdGl2ZWx5CisvLyBjaG9vc2UgdG8gZGVlbSB3YWl2ZWQgb3Igb3RoZXJ3aXNlIGV4Y2x1ZGUgc3VjaCBTZWN0aW9uKHMpIG9mIHRoZSBMaWNlbnNlLAorLy8gYnV0IG9ubHkgaW4gdGhlaXIgZW50aXJldHkgYW5kIG9ubHkgd2l0aCByZXNwZWN0IHRvIHRoZSBDb21iaW5lZCBTb2Z0d2FyZS4KKy8vICAgICAKKworLy8gVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisKKyNpZm5kZWYgVlVMS0FOX0hQUAorI2RlZmluZSBWVUxLQU5fSFBQCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKworI2lmICFkZWZpbmVkKFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKQorIyBpbmNsdWRlIDxtZW1vcnk+CisjIGluY2x1ZGUgPHZlY3Rvcj4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVlVMS0FOX0hQUF9BU1NFUlQpCisjIGluY2x1ZGUgPGNhc3NlcnQ+CisjIGRlZmluZSBWVUxLQU5fSFBQX0FTU0VSVCAgIGFzc2VydAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChWVUxLQU5fSFBQX0VOQUJMRV9EWU5BTUlDX0xPQURFUl9UT09MKQorIyBkZWZpbmUgVlVMS0FOX0hQUF9FTkFCTEVfRFlOQU1JQ19MT0FERVJfVE9PTCAxCisjZW5kaWYKKworI2lmIFZVTEtBTl9IUFBfRU5BQkxFX0RZTkFNSUNfTE9BREVSX1RPT0wgPT0gMQorIyAgaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorIyAgIGluY2x1ZGUgPGRsZmNuLmg+CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjICBlbmRpZgorI2VuZGlmCisKK3N0YXRpY19hc3NlcnQoIFZLX0hFQURFUl9WRVJTSU9OID09ICAxMzAgLCAiV3JvbmcgVktfSEVBREVSX1ZFUlNJT04hIiApOworCisvLyAzMi1iaXQgdnVsa2FuIGlzIG5vdCB0eXBlc2FmZSBmb3IgaGFuZGxlcywgc28gZG9uJ3QgYWxsb3cgY29weSBjb25zdHJ1Y3RvcnMgb24gdGhpcyBwbGF0Zm9ybSBieSBkZWZhdWx0LgorLy8gVG8gZW5hYmxlIHRoaXMgZmVhdHVyZSBvbiAzMi1iaXQgcGxhdGZvcm1zIHBsZWFzZSBkZWZpbmUgVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OCisjaWYgZGVmaW5lZChfX0xQNjRfXykgfHwgZGVmaW5lZChfV0lONjQpIHx8IChkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKF9fSUxQMzJfXykgKSB8fCBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX2lhNjQpIHx8IGRlZmluZWQgKF9NX0lBNjQpIHx8IGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoX19wb3dlcnBjNjRfXykKKyMgaWYgIWRlZmluZWQoIFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTiApCisjICBkZWZpbmUgVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OCisjIGVuZGlmCisjZW5kaWYKKworLy8gPHR1cGxlPiBpbmNsdWRlcyA8c3lzL3N5c21hY3Jvcy5oPiB0aHJvdWdoIHNvbWUgb3RoZXIgaGVhZGVyCisvLyB0aGlzIHJlc3VsdHMgaW4gbWFqb3IoeCkgYmVpbmcgcmVzb2x2ZWQgdG8gZ251X2Rldl9tYWpvcih4KQorLy8gd2hpY2ggaXMgYW4gZXhwcmVzc2lvbiBpbiBhIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyIGxpc3QuCisjaWYgZGVmaW5lZChtYWpvcikKKyAgI3VuZGVmIG1ham9yCisjZW5kaWYKKyNpZiBkZWZpbmVkKG1pbm9yKQorICAjdW5kZWYgbWlub3IKKyNlbmRpZgorCisvLyBXaW5kb3dzIGRlZmluZXMgTWVtb3J5QmFycmllciB3aGljaCBpcyBkZXByZWNhdGVkIGFuZCBjb2xsaWRlcworLy8gd2l0aCB0aGUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUJhcnJpZXIgc3RydWN0LgorI2lmIGRlZmluZWQoTWVtb3J5QmFycmllcikKKyAgI3VuZGVmIE1lbW9yeUJhcnJpZXIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVlVMS0FOX0hQUF9IQVNfVU5SRVNUUklDVEVEX1VOSU9OUykKKyMgaWYgZGVmaW5lZChfX2NsYW5nX18pCisjICBpZiBfX2hhc19mZWF0dXJlKGN4eF91bnJlc3RyaWN0ZWRfdW5pb25zKQorIyAgIGRlZmluZSBWVUxLQU5fSFBQX0hBU19VTlJFU1RSSUNURURfVU5JT05TCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgR0NDX1ZFUlNJT04gKF9fR05VQ19fICogMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyAqIDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisjICBpZiA0MDYwMCA8PSBHQ0NfVkVSU0lPTgorIyAgIGRlZmluZSBWVUxLQU5fSFBQX0hBU19VTlJFU1RSSUNURURfVU5JT05TCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjICBpZiAxOTAwIDw9IF9NU0NfVkVSCisjICAgZGVmaW5lIFZVTEtBTl9IUFBfSEFTX1VOUkVTVFJJQ1RFRF9VTklPTlMKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFZVTEtBTl9IUFBfSU5MSU5FKQorIyBpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyMgIGlmIF9faGFzX2F0dHJpYnV0ZShhbHdheXNfaW5saW5lKQorIyAgIGRlZmluZSBWVUxLQU5fSFBQX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkgX19pbmxpbmVfXworIyAgZWxzZQorIyAgIGRlZmluZSBWVUxLQU5fSFBQX0lOTElORSBpbmxpbmUKKyMgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgIGRlZmluZSBWVUxLQU5fSFBQX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkgX19pbmxpbmVfXworIyBlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjICBkZWZpbmUgVlVMS0FOX0hQUF9JTkxJTkUgaW5saW5lCisjIGVsc2UKKyMgIGRlZmluZSBWVUxLQU5fSFBQX0lOTElORSBpbmxpbmUKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisjIGRlZmluZSBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUCisjZWxzZQorIyBkZWZpbmUgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBleHBsaWNpdAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BwX2NvbnN0ZXhwcikKKyMgZGVmaW5lIFZVTEtBTl9IUFBfQ09OU1RFWFBSIGNvbnN0ZXhwcgorIyBpZiBfX2NwcF9jb25zdGV4cHIgPj0gMjAxMzA0CisjICBkZWZpbmUgVlVMS0FOX0hQUF9DT05TVEVYUFJfMTQgIGNvbnN0ZXhwcgorIyBlbHNlCisjICBkZWZpbmUgVlVMS0FOX0hQUF9DT05TVEVYUFJfMTQKKyMgZW5kaWYKKyMgZGVmaW5lIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSICBjb25zdGV4cHIKKyNlbHNlCisjIGRlZmluZSBWVUxLQU5fSFBQX0NPTlNURVhQUgorIyBkZWZpbmUgVlVMS0FOX0hQUF9DT05TVEVYUFJfMTQKKyMgZGVmaW5lIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSICBjb25zdAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChWVUxLQU5fSFBQX05PRVhDRVBUKQorIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPD0gMTgwMCkKKyMgIGRlZmluZSBWVUxLQU5fSFBQX05PRVhDRVBUCisjIGVsc2UKKyMgIGRlZmluZSBWVUxLQU5fSFBQX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgVlVMS0FOX0hQUF9IQVNfTk9FWENFUFQgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChWVUxLQU5fSFBQX05BTUVTUEFDRSkKKyNkZWZpbmUgVlVMS0FOX0hQUF9OQU1FU1BBQ0UgdmsKKyNlbmRpZgorCisjZGVmaW5lIFZVTEtBTl9IUFBfU1RSSU5HSUZZMih0ZXh0KSAjdGV4dAorI2RlZmluZSBWVUxLQU5fSFBQX1NUUklOR0lGWSh0ZXh0KSBWVUxLQU5fSFBQX1NUUklOR0lGWTIodGV4dCkKKyNkZWZpbmUgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIFZVTEtBTl9IUFBfU1RSSU5HSUZZKFZVTEtBTl9IUFBfTkFNRVNQQUNFKQorCituYW1lc3BhY2UgVlVMS0FOX0hQUF9OQU1FU1BBQ0UKK3sKKyNpZiAhZGVmaW5lZChWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSkKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNsYXNzIEFycmF5UHJveHkKKyAgeworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQXJyYXlQcm94eShzdGQ6Om51bGxwdHJfdCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2NvdW50KDApCisgICAgICAsIG1fcHRyKG51bGxwdHIpCisgICAge30KKworICAgIEFycmF5UHJveHkodHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlICYgcHRyKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fY291bnQoMSkKKyAgICAgICwgbV9wdHIoJnB0cikKKyAgICB7fQorCisgICAgQXJyYXlQcm94eSh1aW50MzJfdCBjb3VudCwgVCAqIHB0cikgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2NvdW50KGNvdW50KQorICAgICAgLCBtX3B0cihwdHIpCisgICAge30KKworICAgIHRlbXBsYXRlIDxzaXplX3QgTj4KKyAgICBBcnJheVByb3h5KHN0ZDo6YXJyYXk8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8VD46OnR5cGUsIE4+ICYgZGF0YSkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2NvdW50KE4pCisgICAgICAsIG1fcHRyKGRhdGEuZGF0YSgpKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IE4+CisgICAgQXJyYXlQcm94eShzdGQ6OmFycmF5PHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PFQ+Ojp0eXBlLCBOPiBjb25zdCYgZGF0YSkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2NvdW50KE4pCisgICAgICAsIG1fcHRyKGRhdGEuZGF0YSgpKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8VD46OnR5cGU+PgorICAgIEFycmF5UHJveHkoc3RkOjp2ZWN0b3I8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8VD46OnR5cGUsIEFsbG9jYXRvcj4gJiBkYXRhKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fY291bnQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRhdGEuc2l6ZSgpKSkKKyAgICAgICwgbV9wdHIoZGF0YS5kYXRhKCkpCisgICAge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxUPjo6dHlwZT4+CisgICAgQXJyYXlQcm94eShzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxUPjo6dHlwZSwgQWxsb2NhdG9yPiBjb25zdCYgZGF0YSkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2NvdW50KHN0YXRpY19jYXN0PHVpbnQzMl90PihkYXRhLnNpemUoKSkpCisgICAgICAsIG1fcHRyKGRhdGEuZGF0YSgpKQorICAgIHt9CisKKyAgICBBcnJheVByb3h5KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+IGNvbnN0JiBkYXRhKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fY291bnQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRhdGEuZW5kKCkgLSBkYXRhLmJlZ2luKCkpKQorICAgICAgLCBtX3B0cihkYXRhLmJlZ2luKCkpCisgICAge30KKworICAgIGNvbnN0IFQgKiBiZWdpbigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9wdHI7CisgICAgfQorCisgICAgY29uc3QgVCAqIGVuZCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9wdHIgKyBtX2NvdW50OworICAgIH0KKworICAgIGNvbnN0IFQgJiBmcm9udCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVChtX2NvdW50ICYmIG1fcHRyKTsKKyAgICAgIHJldHVybiAqbV9wdHI7CisgICAgfQorCisgICAgY29uc3QgVCAmIGJhY2soKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQobV9jb3VudCAmJiBtX3B0cik7CisgICAgICByZXR1cm4gKihtX3B0ciArIG1fY291bnQgLSAxKTsKKyAgICB9CisKKyAgICBib29sIGVtcHR5KCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAobV9jb3VudCA9PSAwKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzaXplKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2NvdW50OworICAgIH0KKworICAgIFQgKiBkYXRhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3B0cjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1aW50MzJfdCAgbV9jb3VudDsKKyAgICBUICogICAgICAgbV9wdHI7CisgIH07CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRmxhZ0JpdHNUeXBlPiBzdHJ1Y3QgRmxhZ1RyYWl0cworICB7CisgICAgZW51bSB7IGFsbEZsYWdzID0gMCB9OworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBCaXRUeXBlLCB0eXBlbmFtZSBNYXNrVHlwZSA9IFZrRmxhZ3M+CisgIGNsYXNzIEZsYWdzCisgIHsKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZsYWdzKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX21hc2soMCkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRmxhZ3MoQml0VHlwZSBiaXQpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9tYXNrKHN0YXRpY19jYXN0PE1hc2tUeXBlPihiaXQpKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBGbGFncyhGbGFnczxCaXRUeXBlPiBjb25zdCYgcmhzKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fbWFzayhyaHMubV9tYXNrKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBleHBsaWNpdCBGbGFncyhNYXNrVHlwZSBmbGFncykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX21hc2soZmxhZ3MpCisgICAge30KKworICAgIEZsYWdzPEJpdFR5cGU+ICYgb3BlcmF0b3I9KEZsYWdzPEJpdFR5cGU+IGNvbnN0JiByaHMpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX21hc2sgPSByaHMubV9tYXNrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZsYWdzPEJpdFR5cGU+ICYgb3BlcmF0b3J8PShGbGFnczxCaXRUeXBlPiBjb25zdCYgcmhzKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9tYXNrIHw9IHJocy5tX21hc2s7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmxhZ3M8Qml0VHlwZT4gJiBvcGVyYXRvciY9KEZsYWdzPEJpdFR5cGU+IGNvbnN0JiByaHMpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX21hc2sgJj0gcmhzLm1fbWFzazsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGbGFnczxCaXRUeXBlPiAmIG9wZXJhdG9yXj0oRmxhZ3M8Qml0VHlwZT4gY29uc3QmIHJocykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fbWFzayBePSByaHMubV9tYXNrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZsYWdzPEJpdFR5cGU+IG9wZXJhdG9yfChGbGFnczxCaXRUeXBlPiBjb25zdCYgcmhzKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIEZsYWdzPEJpdFR5cGU+KG1fbWFzayB8IHJocy5tX21hc2spOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZsYWdzPEJpdFR5cGU+IG9wZXJhdG9yJihGbGFnczxCaXRUeXBlPiBjb25zdCYgcmhzKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIEZsYWdzPEJpdFR5cGU+KG1fbWFzayAmIHJocy5tX21hc2spOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZsYWdzPEJpdFR5cGU+IG9wZXJhdG9yXihGbGFnczxCaXRUeXBlPiBjb25zdCYgcmhzKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIEZsYWdzPEJpdFR5cGU+KG1fbWFzayBeIHJocy5tX21hc2spOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhbV9tYXNrOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZsYWdzPEJpdFR5cGU+IG9wZXJhdG9yfigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gRmxhZ3M8Qml0VHlwZT4obV9tYXNrIF4gRmxhZ1RyYWl0czxCaXRUeXBlPjo6YWxsRmxhZ3MpOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I9PShGbGFnczxCaXRUeXBlPiBjb25zdCYgcmhzKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fbWFzayA9PSByaHMubV9tYXNrOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3IhPShGbGFnczxCaXRUeXBlPiBjb25zdCYgcmhzKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fbWFzayAhPSByaHMubV9tYXNrOworICAgIH0KKworICAgIGV4cGxpY2l0IFZVTEtBTl9IUFBfQ09OU1RFWFBSIG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICEhbV9tYXNrOworICAgIH0KKworICAgIGV4cGxpY2l0IFZVTEtBTl9IUFBfQ09OU1RFWFBSIG9wZXJhdG9yIE1hc2tUeXBlKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbWFzazsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBNYXNrVHlwZSAgbV9tYXNrOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBCaXRUeXBlPgorICBWVUxLQU5fSFBQX0NPTlNURVhQUiBGbGFnczxCaXRUeXBlPiBvcGVyYXRvcnwoQml0VHlwZSBiaXQsIEZsYWdzPEJpdFR5cGU+IGNvbnN0JiBmbGFncykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGZsYWdzIHwgYml0OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEJpdFR5cGU+CisgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZsYWdzPEJpdFR5cGU+IG9wZXJhdG9yJihCaXRUeXBlIGJpdCwgRmxhZ3M8Qml0VHlwZT4gY29uc3QmIGZsYWdzKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gZmxhZ3MgJiBiaXQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQml0VHlwZT4KKyAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRmxhZ3M8Qml0VHlwZT4gb3BlcmF0b3JeKEJpdFR5cGUgYml0LCBGbGFnczxCaXRUeXBlPiBjb25zdCYgZmxhZ3MpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBmbGFncyBeIGJpdDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBCaXRUeXBlPgorICBWVUxLQU5fSFBQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPT0oQml0VHlwZSBiaXQsIEZsYWdzPEJpdFR5cGU+IGNvbnN0JiBmbGFncykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGZsYWdzID09IGJpdDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBCaXRUeXBlPgorICBWVUxLQU5fSFBQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yIT0oQml0VHlwZSBiaXQsIEZsYWdzPEJpdFR5cGU+IGNvbnN0JiBmbGFncykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGZsYWdzICE9IGJpdDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWZUeXBlPgorICBjbGFzcyBPcHRpb25hbAorICB7CisgIHB1YmxpYzoKKyAgICBPcHRpb25hbChSZWZUeXBlICYgcmVmZXJlbmNlKSBWVUxLQU5fSFBQX05PRVhDRVBUIHsgbV9wdHIgPSAmcmVmZXJlbmNlOyB9CisgICAgT3B0aW9uYWwoUmVmVHlwZSAqIHB0cikgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IG1fcHRyID0gcHRyOyB9CisgICAgT3B0aW9uYWwoc3RkOjpudWxscHRyX3QpIFZVTEtBTl9IUFBfTk9FWENFUFQgeyBtX3B0ciA9IG51bGxwdHI7IH0KKworICAgIG9wZXJhdG9yIFJlZlR5cGUqKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IHJldHVybiBtX3B0cjsgfQorICAgIFJlZlR5cGUgY29uc3QqIG9wZXJhdG9yLT4oKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUIHsgcmV0dXJuIG1fcHRyOyB9CisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQgeyByZXR1cm4gISFtX3B0cjsgfQorCisgIHByaXZhdGU6CisgICAgUmVmVHlwZSAqbV9wdHI7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFk+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQgeyBlbnVtIHsgdmFsdWUgPSBmYWxzZSB9OyB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQLCB0eXBlbmFtZSBUPgorICBzdHJ1Y3QgVHlwZUxpc3QKKyAgeworICAgIHVzaW5nIGxpc3QgPSBQOworICAgIHVzaW5nIGxhc3QgPSBUOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMaXN0LCB0eXBlbmFtZSBYPgorICBzdHJ1Y3QgZXh0ZW5kQ2hlY2sKKyAgeworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbGlkID0gaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPHR5cGVuYW1lIExpc3Q6Omxhc3QsIFg+Ojp2YWx1ZSB8fCBleHRlbmRDaGVjazx0eXBlbmFtZSBMaXN0OjpsaXN0LFg+Ojp2YWxpZDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgWD4KKyAgc3RydWN0IGV4dGVuZENoZWNrPFR5cGVMaXN0PHZvaWQsVD4sWD4KKyAgeworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbGlkID0gaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFQsIFg+Ojp2YWx1ZTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgWD4KKyAgc3RydWN0IGV4dGVuZENoZWNrPHZvaWQsWD4KKyAgeworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbGlkID0gdHJ1ZTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlLCBjbGFzcy4uLj4KKyAgc3RydWN0IGlzUGFydE9mU3RydWN0dXJlQ2hhaW4KKyAgeworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbGlkID0gZmFsc2U7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZSwgdHlwZW5hbWUgSGVhZCwgdHlwZW5hbWUuLi4gVGFpbD4KKyAgc3RydWN0IGlzUGFydE9mU3RydWN0dXJlQ2hhaW48VHlwZSwgSGVhZCwgVGFpbC4uLj4KKyAgeworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbGlkID0gc3RkOjppc19zYW1lPFR5cGUsIEhlYWQ+Ojp2YWx1ZSB8fCBpc1BhcnRPZlN0cnVjdHVyZUNoYWluPFR5cGUsIFRhaWwuLi4+Ojp2YWxpZDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgRWxlbWVudD4KKyAgY2xhc3MgU3RydWN0dXJlQ2hhaW5FbGVtZW50CisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IG9wZXJhdG9yIEVsZW1lbnQmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IHJldHVybiB2YWx1ZTsgfQorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGNvbnN0IEVsZW1lbnQmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IHJldHVybiB2YWx1ZTsgfQorICBwcml2YXRlOgorICAgIEVsZW1lbnQgdmFsdWU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uU3RydWN0dXJlRWxlbWVudHM+CisgIGNsYXNzIFN0cnVjdHVyZUNoYWluIDogcHJpdmF0ZSBTdHJ1Y3R1cmVDaGFpbkVsZW1lbnQ8U3RydWN0dXJlRWxlbWVudHM+Li4uCisgIHsKKyAgcHVibGljOgorICAgIFN0cnVjdHVyZUNoYWluKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxpbms8dm9pZCwgU3RydWN0dXJlRWxlbWVudHMuLi4+KCk7CisgICAgfQorCisgICAgU3RydWN0dXJlQ2hhaW4oU3RydWN0dXJlQ2hhaW4gY29uc3QgJnJocykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxpbmtBbmRDb3B5PHZvaWQsIFN0cnVjdHVyZUVsZW1lbnRzLi4uPihyaHMpOworICAgIH0KKworICAgIFN0cnVjdHVyZUNoYWluKFN0cnVjdHVyZUVsZW1lbnRzIGNvbnN0ICYuLi4gZWxlbXMpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBsaW5rQW5kQ29weUVsZW1lbnRzPHZvaWQsIFN0cnVjdHVyZUVsZW1lbnRzLi4uPihlbGVtcy4uLik7CisgICAgfQorCisgICAgU3RydWN0dXJlQ2hhaW4mIG9wZXJhdG9yPShTdHJ1Y3R1cmVDaGFpbiBjb25zdCAmcmhzKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbGlua0FuZENvcHk8dm9pZCwgU3RydWN0dXJlRWxlbWVudHMuLi4+KHJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ2xhc3NUeXBlPiBDbGFzc1R5cGUmIGdldCgpIFZVTEtBTl9IUFBfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Q2xhc3NUeXBlJj4oKnRoaXMpO30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENsYXNzVHlwZUEsIHR5cGVuYW1lIENsYXNzVHlwZUIsIHR5cGVuYW1lIC4uLkNsYXNzVHlwZXM+CisgICAgc3RkOjp0dXBsZTxDbGFzc1R5cGVBLCBDbGFzc1R5cGVCLCBDbGFzc1R5cGVzLi4uPiBnZXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dHVwbGVfY2F0KAorICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKGdldDxDbGFzc1R5cGVBPigpLGdldDxDbGFzc1R5cGVCPigpKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShnZXQ8Q2xhc3NUeXBlcz4oKS4uLikKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbGFzc1R5cGU+CisgICAgdm9pZCB1bmxpbmsoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChpc1BhcnRPZlN0cnVjdHVyZUNoYWluPENsYXNzVHlwZSwgU3RydWN0dXJlRWxlbWVudHMuLi4+Ojp2YWxpZCwgIkNhbid0IHVubGluayBTdHJ1Y3R1cmUgdGhhdCdzIG5vdCBwYXJ0IG9mIHRoaXMgU3RydWN0dXJlQ2hhaW4hIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8Q2xhc3NUeXBlLCB0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8MCwgc3RkOjp0dXBsZTxTdHJ1Y3R1cmVFbGVtZW50cy4uLj4+Ojp0eXBlPjo6dmFsdWUsICJJdCdzIG5vdCBhbGxvd2VkIHRvIHVubGluayB0aGUgZmlyc3QgZWxlbWVudCEiKTsKKyAgICAgIFZrQmFzZU91dFN0cnVjdHVyZSAqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtCYXNlT3V0U3RydWN0dXJlKj4oJmdldDxDbGFzc1R5cGU+KCkpOworICAgICAgYXNzZXJ0KHB0ciAhPSBudWxscHRyKTsKKyAgICAgIFZrQmFzZU91dFN0cnVjdHVyZSAqKiBwcE5leHQgPSAmKHJlaW50ZXJwcmV0X2Nhc3Q8VmtCYXNlT3V0U3RydWN0dXJlKj4odGhpcyktPnBOZXh0KTsKKyAgICAgIGFzc2VydCgqcHBOZXh0ICE9IG51bGxwdHIpOworICAgICAgd2hpbGUgKCpwcE5leHQgIT0gcHRyKQorICAgICAgeworICAgICAgICBwcE5leHQgPSAmKCpwcE5leHQpLT5wTmV4dDsKKyAgICAgICAgYXNzZXJ0KCpwcE5leHQgIT0gbnVsbHB0cik7ICAgLy8gZmlyZXMsIGlmIHRoZSBDbGFzc1R5cGUgbWVtYmVyIGhhcyBhbHJlYWR5IGJlZW4gdW5saW5rZWQgIQorICAgICAgfQorICAgICAgYXNzZXJ0KCpwcE5leHQgPT0gcHRyKTsKKyAgICAgICpwcE5leHQgPSAoKnBwTmV4dCktPnBOZXh0OworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzc1R5cGU+CisgICAgdm9pZCByZWxpbmsoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChpc1BhcnRPZlN0cnVjdHVyZUNoYWluPENsYXNzVHlwZSwgU3RydWN0dXJlRWxlbWVudHMuLi4+Ojp2YWxpZCwgIkNhbid0IHJlbGluayBTdHJ1Y3R1cmUgdGhhdCdzIG5vdCBwYXJ0IG9mIHRoaXMgU3RydWN0dXJlQ2hhaW4hIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8Q2xhc3NUeXBlLCB0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8MCwgc3RkOjp0dXBsZTxTdHJ1Y3R1cmVFbGVtZW50cy4uLj4+Ojp0eXBlPjo6dmFsdWUsICJJdCdzIG5vdCBhbGxvd2VkIHRvIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQgdW5saW5rZWQhIik7CisgICAgICBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKiBwdHIgPSByZWludGVycHJldF9jYXN0PFZrQmFzZU91dFN0cnVjdHVyZSo+KCZnZXQ8Q2xhc3NUeXBlPigpKTsKKyAgICAgIGFzc2VydChwdHIgIT0gbnVsbHB0cik7CisgICAgICBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKiogcHBOZXh0ID0gJihyZWludGVycHJldF9jYXN0PFZrQmFzZU91dFN0cnVjdHVyZSo+KHRoaXMpLT5wTmV4dCk7CisgICAgICBhc3NlcnQoKnBwTmV4dCAhPSBudWxscHRyKTsKKyNpZiAhZGVmaW5lZChOREVCVUcpCisgICAgICB3aGlsZSAoKnBwTmV4dCkKKyAgICAgIHsKKyAgICAgICAgYXNzZXJ0KCpwcE5leHQgIT0gcHRyKTsgICAvLyBmaXJlcywgaWYgdGhlIENsYXNzVHlwZSBtZW1iZXIgaGFzIG5vdCBiZWVuIHVubGlua2VkIGJlZm9yZQorICAgICAgICBwcE5leHQgPSAmKCpwcE5leHQpLT5wTmV4dDsKKyAgICAgIH0KKyAgICAgIHBwTmV4dCA9ICYocmVpbnRlcnByZXRfY2FzdDxWa0Jhc2VPdXRTdHJ1Y3R1cmUqPih0aGlzKS0+cE5leHQpOworI2VuZGlmCisgICAgICBwdHItPnBOZXh0ID0gKnBwTmV4dDsKKyAgICAgICpwcE5leHQgPSBwdHI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTGlzdCwgdHlwZW5hbWUgWD4KKyAgICB2b2lkIGxpbmsoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChleHRlbmRDaGVjazxMaXN0LCBYPjo6dmFsaWQsICJUaGUgc3RydWN0dXJlIGNoYWluIGlzIG5vdCB2YWxpZCEiKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaXN0LCB0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aPgorICAgIHZvaWQgbGluaygpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KGV4dGVuZENoZWNrPExpc3QsWD46OnZhbGlkLCAiVGhlIHN0cnVjdHVyZSBjaGFpbiBpcyBub3QgdmFsaWQhIik7CisgICAgICBYJiB4ID0gc3RhdGljX2Nhc3Q8WCY+KCp0aGlzKTsKKyAgICAgIFkmIHkgPSBzdGF0aWNfY2FzdDxZJj4oKnRoaXMpOworICAgICAgeC5wTmV4dCA9ICZ5OworICAgICAgbGluazxUeXBlTGlzdDxMaXN0LCBYPiwgWSwgWi4uLj4oKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaXN0LCB0eXBlbmFtZSBYPgorICAgIHZvaWQgbGlua0FuZENvcHkoU3RydWN0dXJlQ2hhaW4gY29uc3QgJnJocykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoZXh0ZW5kQ2hlY2s8TGlzdCwgWD46OnZhbGlkLCAiVGhlIHN0cnVjdHVyZSBjaGFpbiBpcyBub3QgdmFsaWQhIik7CisgICAgICBzdGF0aWNfY2FzdDxYJj4oKnRoaXMpID0gc3RhdGljX2Nhc3Q8WCBjb25zdCAmPihyaHMpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExpc3QsIHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlo+CisgICAgdm9pZCBsaW5rQW5kQ29weShTdHJ1Y3R1cmVDaGFpbiBjb25zdCAmcmhzKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChleHRlbmRDaGVjazxMaXN0LCBYPjo6dmFsaWQsICJUaGUgc3RydWN0dXJlIGNoYWluIGlzIG5vdCB2YWxpZCEiKTsKKyAgICAgIFgmIHggPSBzdGF0aWNfY2FzdDxYJj4oKnRoaXMpOworICAgICAgWSYgeSA9IHN0YXRpY19jYXN0PFkmPigqdGhpcyk7CisgICAgICB4ID0gc3RhdGljX2Nhc3Q8WCBjb25zdCAmPihyaHMpOworICAgICAgeC5wTmV4dCA9ICZ5OworICAgICAgbGlua0FuZENvcHk8VHlwZUxpc3Q8TGlzdCwgWD4sIFksIFouLi4+KHJocyk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTGlzdCwgdHlwZW5hbWUgWD4KKyAgICB2b2lkIGxpbmtBbmRDb3B5RWxlbWVudHMoWCBjb25zdCAmeGVsZW0pIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KGV4dGVuZENoZWNrPExpc3QsIFg+Ojp2YWxpZCwgIlRoZSBzdHJ1Y3R1cmUgY2hhaW4gaXMgbm90IHZhbGlkISIpOworICAgICAgc3RhdGljX2Nhc3Q8WCY+KCp0aGlzKSA9IHhlbGVtOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExpc3QsIHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlo+CisgICAgdm9pZCBsaW5rQW5kQ29weUVsZW1lbnRzKFggY29uc3QgJnhlbGVtLCBZIGNvbnN0ICZ5ZWxlbSwgWiBjb25zdCAmLi4uIHplbGVtKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChleHRlbmRDaGVjazxMaXN0LCBYPjo6dmFsaWQsICJUaGUgc3RydWN0dXJlIGNoYWluIGlzIG5vdCB2YWxpZCEiKTsKKyAgICAgIFgmIHggPSBzdGF0aWNfY2FzdDxYJj4oKnRoaXMpOworICAgICAgWSYgeSA9IHN0YXRpY19jYXN0PFkmPigqdGhpcyk7CisgICAgICB4ID0geGVsZW07CisgICAgICB4LnBOZXh0ID0gJnk7CisgICAgICBsaW5rQW5kQ29weUVsZW1lbnRzPFR5cGVMaXN0PExpc3QsIFg+LCBZLCBaLi4uPih5ZWxlbSwgemVsZW0uLi4pOworICAgIH0KKyAgfTsKKworI2lmICFkZWZpbmVkKFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZSwgdHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZSwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIGNsYXNzIFVuaXF1ZUhhbmRsZSA6IHB1YmxpYyBVbmlxdWVIYW5kbGVUcmFpdHM8VHlwZSxEaXNwYXRjaD46OmRlbGV0ZXIKKyAgeworICBwcml2YXRlOgorICAgIHVzaW5nIERlbGV0ZXIgPSB0eXBlbmFtZSBVbmlxdWVIYW5kbGVUcmFpdHM8VHlwZSxEaXNwYXRjaD46OmRlbGV0ZXI7CisKKyAgcHVibGljOgorICAgIHVzaW5nIGVsZW1lbnRfdHlwZSA9IFR5cGU7CisKKyAgICBVbmlxdWVIYW5kbGUoKQorICAgICAgOiBEZWxldGVyKCkKKyAgICAgICwgbV92YWx1ZSgpCisgICAge30KKworICAgIGV4cGxpY2l0IFVuaXF1ZUhhbmRsZSggVHlwZSBjb25zdCYgdmFsdWUsIERlbGV0ZXIgY29uc3QmIGRlbGV0ZXIgPSBEZWxldGVyKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IERlbGV0ZXIoIGRlbGV0ZXIpCisgICAgICAsIG1fdmFsdWUoIHZhbHVlICkKKyAgICB7fQorCisgICAgVW5pcXVlSGFuZGxlKCBVbmlxdWVIYW5kbGUgY29uc3QmICkgPSBkZWxldGU7CisKKyAgICBVbmlxdWVIYW5kbGUoIFVuaXF1ZUhhbmRsZSAmJiBvdGhlciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogRGVsZXRlciggc3RkOjptb3ZlKCBzdGF0aWNfY2FzdDxEZWxldGVyJj4oIG90aGVyICkgKSApCisgICAgICAsIG1fdmFsdWUoIG90aGVyLnJlbGVhc2UoKSApCisgICAge30KKworICAgIH5VbmlxdWVIYW5kbGUoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaWYgKCBtX3ZhbHVlICkgdGhpcy0+ZGVzdHJveSggbV92YWx1ZSApOworICAgIH0KKworICAgIFVuaXF1ZUhhbmRsZSAmIG9wZXJhdG9yPSggVW5pcXVlSGFuZGxlIGNvbnN0JiApID0gZGVsZXRlOworCisgICAgVW5pcXVlSGFuZGxlICYgb3BlcmF0b3I9KCBVbmlxdWVIYW5kbGUgJiYgb3RoZXIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVzZXQoIG90aGVyLnJlbGVhc2UoKSApOworICAgICAgKnN0YXRpY19jYXN0PERlbGV0ZXIqPih0aGlzKSA9IHN0ZDo6bW92ZSggc3RhdGljX2Nhc3Q8RGVsZXRlciY+KG90aGVyKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fdmFsdWUub3BlcmF0b3IgYm9vbCgpOworICAgIH0KKworICAgIFR5cGUgY29uc3QqIG9wZXJhdG9yLT4oKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICZtX3ZhbHVlOworICAgIH0KKworICAgIFR5cGUgKiBvcGVyYXRvci0+KCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAmbV92YWx1ZTsKKyAgICB9CisKKyAgICBUeXBlIGNvbnN0JiBvcGVyYXRvciooKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fdmFsdWU7CisgICAgfQorCisgICAgVHlwZSAmIG9wZXJhdG9yKigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV92YWx1ZTsKKyAgICB9CisKKyAgICBjb25zdCBUeXBlICYgZ2V0KCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3ZhbHVlOworICAgIH0KKworICAgIFR5cGUgJiBnZXQoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fdmFsdWU7CisgICAgfQorCisgICAgdm9pZCByZXNldCggVHlwZSBjb25zdCYgdmFsdWUgPSBUeXBlKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaWYgKCBtX3ZhbHVlICE9IHZhbHVlICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBtX3ZhbHVlICkgdGhpcy0+ZGVzdHJveSggbV92YWx1ZSApOworICAgICAgICBtX3ZhbHVlID0gdmFsdWU7CisgICAgICB9CisgICAgfQorCisgICAgVHlwZSByZWxlYXNlKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIFR5cGUgdmFsdWUgPSBtX3ZhbHVlOworICAgICAgbV92YWx1ZSA9IG51bGxwdHI7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgdm9pZCBzd2FwKCBVbmlxdWVIYW5kbGU8VHlwZSxEaXNwYXRjaD4gJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RkOjpzd2FwKG1fdmFsdWUsIHJocy5tX3ZhbHVlKTsKKyAgICAgIHN0ZDo6c3dhcChzdGF0aWNfY2FzdDxEZWxldGVyJj4oKnRoaXMpLCBzdGF0aWNfY2FzdDxEZWxldGVyJj4ocmhzKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVHlwZSAgICBtX3ZhbHVlOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVbmlxdWVUeXBlPgorICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBVbmlxdWVUeXBlOjplbGVtZW50X3R5cGU+IHVuaXF1ZVRvUmF3KHN0ZDo6dmVjdG9yPFVuaXF1ZVR5cGU+IGNvbnN0JiBoYW5kbGVzKQorICB7CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVW5pcXVlVHlwZTo6ZWxlbWVudF90eXBlPiBuZXdCdWZmZXIoaGFuZGxlcy5zaXplKCkpOworICAgIHN0ZDo6dHJhbnNmb3JtKGhhbmRsZXMuYmVnaW4oKSwgaGFuZGxlcy5lbmQoKSwgbmV3QnVmZmVyLmJlZ2luKCksIFtdKFVuaXF1ZVR5cGUgY29uc3QmIGhhbmRsZSkgeyByZXR1cm4gaGFuZGxlLmdldCgpOyB9KTsKKyAgICByZXR1cm4gbmV3QnVmZmVyOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIHN3YXAoIFVuaXF1ZUhhbmRsZTxUeXBlLERpc3BhdGNoPiAmIGxocywgVW5pcXVlSGFuZGxlPFR5cGUsRGlzcGF0Y2g+ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgbGhzLnN3YXAoIHJocyApOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFZLX05PX1BST1RPVFlQRVMpCisgIGNsYXNzIERpc3BhdGNoTG9hZGVyU3RhdGljCisgIHsKKyAgcHVibGljOgorICAgIFZrUmVzdWx0IHZrQ3JlYXRlSW5zdGFuY2UoIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0luc3RhbmNlKiBwSW5zdGFuY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVJbnN0YW5jZSggcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKCBjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoIHBMYXllck5hbWUsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtMYXllclByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uKCB1aW50MzJfdCogcEFwaVZlcnNpb24gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24oIHBBcGlWZXJzaW9uICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtCZWdpbkNvbW1hbmRCdWZmZXIoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qIHBCZWdpbkluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtCZWdpbkNvbW1hbmRCdWZmZXIoIGNvbW1hbmRCdWZmZXIsIHBCZWdpbkluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQqIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCggY29tbWFuZEJ1ZmZlciwgcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCBjb21tYW5kQnVmZmVyLCBwTGFiZWxJbmZvICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEJlZ2luUXVlcnkoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kQmVnaW5RdWVyeSggY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgZmxhZ3MgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCB1aW50MzJfdCBpbmRleCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUKCBjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5LCBmbGFncywgaW5kZXggKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQmVnaW5SZW5kZXJQYXNzKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiBwUmVuZGVyUGFzc0JlZ2luLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZEJlZ2luUmVuZGVyUGFzcyggY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgY29udGVudHMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiBwU3VicGFzc0JlZ2luSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIoIGNvbW1hbmRCdWZmZXIsIHBSZW5kZXJQYXNzQmVnaW4sIHBTdWJwYXNzQmVnaW5JbmZvICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKCBjb21tYW5kQnVmZmVyLCBmaXJzdENvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJDb3VudCwgcENvdW50ZXJCdWZmZXJzLCBwQ291bnRlckJ1ZmZlck9mZnNldHMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IGZpcnN0U2V0LCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsIGNvbnN0IFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCB1aW50MzJfdCBkeW5hbWljT2Zmc2V0Q291bnQsIGNvbnN0IHVpbnQzMl90KiBwRHluYW1pY09mZnNldHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRCaW5kRGVzY3JpcHRvclNldHMoIGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIGZpcnN0U2V0LCBkZXNjcmlwdG9yU2V0Q291bnQsIHBEZXNjcmlwdG9yU2V0cywgZHluYW1pY09mZnNldENvdW50LCBwRHluYW1pY09mZnNldHMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQmluZEluZGV4QnVmZmVyKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0luZGV4VHlwZSBpbmRleFR5cGUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRCaW5kSW5kZXhCdWZmZXIoIGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBpbmRleFR5cGUgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQmluZFBpcGVsaW5lKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZSBwaXBlbGluZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZEJpbmRQaXBlbGluZSggY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIHBpcGVsaW5lICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKCBjb21tYW5kQnVmZmVyLCBpbWFnZVZpZXcsIGltYWdlTGF5b3V0ICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdEJpbmRpbmcsIHVpbnQzMl90IGJpbmRpbmdDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBPZmZzZXRzLCBjb25zdCBWa0RldmljZVNpemUqIHBTaXplcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoIGNvbW1hbmRCdWZmZXIsIGZpcnN0QmluZGluZywgYmluZGluZ0NvdW50LCBwQnVmZmVycywgcE9mZnNldHMsIHBTaXplcyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRCaW5kVmVydGV4QnVmZmVycyggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0QmluZGluZywgdWludDMyX3QgYmluZGluZ0NvdW50LCBjb25zdCBWa0J1ZmZlciogcEJ1ZmZlcnMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcE9mZnNldHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRCaW5kVmVydGV4QnVmZmVycyggY29tbWFuZEJ1ZmZlciwgZmlyc3RCaW5kaW5nLCBiaW5kaW5nQ291bnQsIHBCdWZmZXJzLCBwT2Zmc2V0cyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRCbGl0SW1hZ2UoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZUJsaXQqIHBSZWdpb25zLCBWa0ZpbHRlciBmaWx0ZXIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRCbGl0SW1hZ2UoIGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMsIGZpbHRlciApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqIHBJbmZvLCBWa0J1ZmZlciBpbnN0YW5jZURhdGEsIFZrRGV2aWNlU2l6ZSBpbnN0YW5jZU9mZnNldCwgVmtCb29sMzIgdXBkYXRlLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsIFZrQnVmZmVyIHNjcmF0Y2gsIFZrRGV2aWNlU2l6ZSBzY3JhdGNoT2Zmc2V0ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggY29tbWFuZEJ1ZmZlciwgcEluZm8sIGluc3RhbmNlRGF0YSwgaW5zdGFuY2VPZmZzZXQsIHVwZGF0ZSwgZHN0LCBzcmMsIHNjcmF0Y2gsIHNjcmF0Y2hPZmZzZXQgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQ2xlYXJBdHRhY2htZW50cyggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudCwgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqIHBBdHRhY2htZW50cywgdWludDMyX3QgcmVjdENvdW50LCBjb25zdCBWa0NsZWFyUmVjdCogcFJlY3RzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kQ2xlYXJBdHRhY2htZW50cyggY29tbWFuZEJ1ZmZlciwgYXR0YWNobWVudENvdW50LCBwQXR0YWNobWVudHMsIHJlY3RDb3VudCwgcFJlY3RzICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZENsZWFyQ29sb3JJbWFnZSggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiBwQ29sb3IsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kQ2xlYXJDb2xvckltYWdlKCBjb21tYW5kQnVmZmVyLCBpbWFnZSwgaW1hZ2VMYXlvdXQsIHBDb2xvciwgcmFuZ2VDb3VudCwgcFJhbmdlcyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiBwRGVwdGhTdGVuY2lsLCB1aW50MzJfdCByYW5nZUNvdW50LCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogcFJhbmdlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoIGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcERlcHRoU3RlbmNpbCwgcmFuZ2VDb3VudCwgcFJhbmdlcyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsIFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViBtb2RlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBjb21tYW5kQnVmZmVyLCBkc3QsIHNyYywgbW9kZSApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRDb3B5QnVmZmVyKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckNvcHkqIHBSZWdpb25zICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kQ29weUJ1ZmZlciggY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RCdWZmZXIsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZSggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZENvcHlCdWZmZXJUb0ltYWdlKCBjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZENvcHlJbWFnZSggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSogcFJlZ2lvbnMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRDb3B5SW1hZ2UoIGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kQ29weUltYWdlVG9CdWZmZXIoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0J1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogcFJlZ2lvbnMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciggY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RCdWZmZXIsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc3RyaWRlLCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyggY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc3RyaWRlLCBmbGFncyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqIHBNYXJrZXJJbmZvICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCggY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRGVidWdNYXJrZXJFbmRFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRGVidWdNYXJrZXJFbmRFWFQoIGNvbW1hbmRCdWZmZXIgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCggY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRGlzcGF0Y2goIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRGlzcGF0Y2goIGNvbW1hbmRCdWZmZXIsIGdyb3VwQ291bnRYLCBncm91cENvdW50WSwgZ3JvdXBDb3VudFogKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRGlzcGF0Y2hCYXNlKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYmFzZUdyb3VwWCwgdWludDMyX3QgYmFzZUdyb3VwWSwgdWludDMyX3QgYmFzZUdyb3VwWiwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLCB1aW50MzJfdCBncm91cENvdW50WiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZERpc3BhdGNoQmFzZSggY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50WiApOworICAgIH0KKworICAgIHZvaWQgdmtDbWREaXNwYXRjaEJhc2VLSFIoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBiYXNlR3JvdXBYLCB1aW50MzJfdCBiYXNlR3JvdXBZLCB1aW50MzJfdCBiYXNlR3JvdXBaLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRGlzcGF0Y2hCYXNlS0hSKCBjb21tYW5kQnVmZmVyLCBiYXNlR3JvdXBYLCBiYXNlR3JvdXBZLCBiYXNlR3JvdXBaLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZERpc3BhdGNoSW5kaXJlY3QoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWREaXNwYXRjaEluZGlyZWN0KCBjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCApOworICAgIH0KKworICAgIHZvaWQgdmtDbWREcmF3KCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdmVydGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRHJhdyggY29tbWFuZEJ1ZmZlciwgdmVydGV4Q291bnQsIGluc3RhbmNlQ291bnQsIGZpcnN0VmVydGV4LCBmaXJzdEluc3RhbmNlICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZERyYXdJbmRleGVkKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgaW5kZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWREcmF3SW5kZXhlZCggY29tbWFuZEJ1ZmZlciwgaW5kZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RJbmRleCwgdmVydGV4T2Zmc2V0LCBmaXJzdEluc3RhbmNlICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCggY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoIGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoIGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZERyYXdJbmRpcmVjdCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgZHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWREcmF3SW5kaXJlY3QoIGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSApOworICAgIH0KKworICAgIHZvaWQgdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlLCBWa0J1ZmZlciBjb3VudGVyQnVmZmVyLCBWa0RldmljZVNpemUgY291bnRlckJ1ZmZlck9mZnNldCwgdWludDMyX3QgY291bnRlck9mZnNldCwgdWludDMyX3QgdmVydGV4U3RyaWRlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKCBjb21tYW5kQnVmZmVyLCBpbnN0YW5jZUNvdW50LCBmaXJzdEluc3RhbmNlLCBjb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyT2Zmc2V0LCBjb3VudGVyT2Zmc2V0LCB2ZXJ0ZXhTdHJpZGUgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoIGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKCBjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSApOworICAgIH0KKworICAgIHZvaWQgdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoIGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKCBjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRHJhd01lc2hUYXNrc05WKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdGFza0NvdW50LCB1aW50MzJfdCBmaXJzdFRhc2sgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWREcmF3TWVzaFRhc2tzTlYoIGNvbW1hbmRCdWZmZXIsIHRhc2tDb3VudCwgZmlyc3RUYXNrICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKCBjb21tYW5kQnVmZmVyICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoIGNvbW1hbmRCdWZmZXIgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRW5kUXVlcnkoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRW5kUXVlcnkoIGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnkgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgdWludDMyX3QgaW5kZXggKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQoIGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnksIGluZGV4ICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEVuZFJlbmRlclBhc3MoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRW5kUmVuZGVyUGFzcyggY29tbWFuZEJ1ZmZlciApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRFbmRSZW5kZXJQYXNzMktIUiggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqIHBTdWJwYXNzRW5kSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZEVuZFJlbmRlclBhc3MyS0hSKCBjb21tYW5kQnVmZmVyLCBwU3VicGFzc0VuZEluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCggY29tbWFuZEJ1ZmZlciwgZmlyc3RDb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyQ291bnQsIHBDb3VudGVyQnVmZmVycywgcENvdW50ZXJCdWZmZXJPZmZzZXRzICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEV4ZWN1dGVDb21tYW5kcyggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwgY29uc3QgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRFeGVjdXRlQ29tbWFuZHMoIGNvbW1hbmRCdWZmZXIsIGNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZEZpbGxCdWZmZXIoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBkYXRhICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kRmlsbEJ1ZmZlciggY29tbWFuZEJ1ZmZlciwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIHNpemUsIGRhdGEgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoIGNvbW1hbmRCdWZmZXIsIHBMYWJlbEluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kTmV4dFN1YnBhc3MoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZE5leHRTdWJwYXNzKCBjb21tYW5kQnVmZmVyLCBjb250ZW50cyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWROZXh0U3VicGFzczJLSFIoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqIHBTdWJwYXNzQmVnaW5JbmZvLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiBwU3VicGFzc0VuZEluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWROZXh0U3VicGFzczJLSFIoIGNvbW1hbmRCdWZmZXIsIHBTdWJwYXNzQmVnaW5JbmZvLCBwU3VicGFzc0VuZEluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kUGlwZWxpbmVCYXJyaWVyKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZrRGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFncywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFBpcGVsaW5lQmFycmllciggY29tbWFuZEJ1ZmZlciwgc3JjU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIGRlcGVuZGVuY3lGbGFncywgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiBwUHJvY2Vzc0NvbW1hbmRzSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFByb2Nlc3NDb21tYW5kc05WWCggY29tbWFuZEJ1ZmZlciwgcFByb2Nlc3NDb21tYW5kc0luZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kUHVzaENvbnN0YW50cyggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCBWa1NoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFncywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLCBjb25zdCB2b2lkKiBwVmFsdWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kUHVzaENvbnN0YW50cyggY29tbWFuZEJ1ZmZlciwgbGF5b3V0LCBzdGFnZUZsYWdzLCBvZmZzZXQsIHNpemUsIHBWYWx1ZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yV3JpdGVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoIGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIHNldCwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCBjb25zdCB2b2lkKiBwRGF0YSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKCBjb21tYW5kQnVmZmVyLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGxheW91dCwgc2V0LCBwRGF0YSApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiBwUmVzZXJ2ZVNwYWNlSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKCBjb21tYW5kQnVmZmVyLCBwUmVzZXJ2ZVNwYWNlSW5mbyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRSZXNldEV2ZW50KCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kUmVzZXRFdmVudCggY29tbWFuZEJ1ZmZlciwgZXZlbnQsIHN0YWdlTWFzayApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRSZXNldFF1ZXJ5UG9vbCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFJlc2V0UXVlcnlQb29sKCBjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kUmVzb2x2ZUltYWdlKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiBwUmVnaW9ucyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFJlc29sdmVJbWFnZSggY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXRCbGVuZENvbnN0YW50cyggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IGZsb2F0IGJsZW5kQ29uc3RhbnRzWzRdICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0QmxlbmRDb25zdGFudHMoIGNvbW1hbmRCdWZmZXIsIGJsZW5kQ29uc3RhbnRzICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFNldENoZWNrcG9pbnROViggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IHZvaWQqIHBDaGVja3BvaW50TWFya2VyICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0Q2hlY2twb2ludE5WKCBjb21tYW5kQnVmZmVyLCBwQ2hlY2twb2ludE1hcmtlciApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViBzYW1wbGVPcmRlclR5cGUsIHVpbnQzMl90IGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsIGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogcEN1c3RvbVNhbXBsZU9yZGVycyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoIGNvbW1hbmRCdWZmZXIsIHNhbXBsZU9yZGVyVHlwZSwgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgcEN1c3RvbVNhbXBsZU9yZGVycyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXREZXB0aEJpYXMoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZmxvYXQgZGVwdGhCaWFzQ2xhbXAsIGZsb2F0IGRlcHRoQmlhc1Nsb3BlRmFjdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0RGVwdGhCaWFzKCBjb21tYW5kQnVmZmVyLCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZGVwdGhCaWFzQ2xhbXAsIGRlcHRoQmlhc1Nsb3BlRmFjdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFNldERlcHRoQm91bmRzKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbWluRGVwdGhCb3VuZHMsIGZsb2F0IG1heERlcHRoQm91bmRzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0RGVwdGhCb3VuZHMoIGNvbW1hbmRCdWZmZXIsIG1pbkRlcHRoQm91bmRzLCBtYXhEZXB0aEJvdW5kcyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXREZXZpY2VNYXNrKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzayApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFNldERldmljZU1hc2soIGNvbW1hbmRCdWZmZXIsIGRldmljZU1hc2sgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kU2V0RGV2aWNlTWFza0tIUiggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGRldmljZU1hc2sgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRTZXREZXZpY2VNYXNrS0hSKCBjb21tYW5kQnVmZmVyLCBkZXZpY2VNYXNrICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsIHVpbnQzMl90IGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBEaXNjYXJkUmVjdGFuZ2xlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoIGNvbW1hbmRCdWZmZXIsIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgZGlzY2FyZFJlY3RhbmdsZUNvdW50LCBwRGlzY2FyZFJlY3RhbmdsZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kU2V0RXZlbnQoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2sgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRTZXRFdmVudCggY29tbWFuZEJ1ZmZlciwgZXZlbnQsIHN0YWdlTWFzayApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsIHVpbnQzMl90IGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBFeGNsdXNpdmVTY2lzc29ycyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViggY29tbWFuZEJ1ZmZlciwgZmlyc3RFeGNsdXNpdmVTY2lzc29yLCBleGNsdXNpdmVTY2lzc29yQ291bnQsIHBFeGNsdXNpdmVTY2lzc29ycyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXRMaW5lU3RpcHBsZUVYVCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGxpbmVTdGlwcGxlRmFjdG9yLCB1aW50MTZfdCBsaW5lU3RpcHBsZVBhdHRlcm4gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRTZXRMaW5lU3RpcHBsZUVYVCggY29tbWFuZEJ1ZmZlciwgbGluZVN0aXBwbGVGYWN0b3IsIGxpbmVTdGlwcGxlUGF0dGVybiApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXRMaW5lV2lkdGgoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBsaW5lV2lkdGggKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRTZXRMaW5lV2lkdGgoIGNvbW1hbmRCdWZmZXIsIGxpbmVXaWR0aCApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqIHBNYXJrZXJJbmZvICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCggY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8gKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogcE92ZXJyaWRlSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCggY29tbWFuZEJ1ZmZlciwgcE92ZXJyaWRlSW5mbyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwqIHBNYXJrZXJJbmZvICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCggY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiBwU2FtcGxlTG9jYXRpb25zSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCggY29tbWFuZEJ1ZmZlciwgcFNhbXBsZUxvY2F0aW9uc0luZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kU2V0U2Npc3NvciggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0U2Npc3NvciwgdWludDMyX3Qgc2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcFNjaXNzb3JzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0U2Npc3NvciggY29tbWFuZEJ1ZmZlciwgZmlyc3RTY2lzc29yLCBzY2lzc29yQ291bnQsIHBTY2lzc29ycyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IGNvbXBhcmVNYXNrICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKCBjb21tYW5kQnVmZmVyLCBmYWNlTWFzaywgY29tcGFyZU1hc2sgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3QgcmVmZXJlbmNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSggY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIHJlZmVyZW5jZSApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCB3cml0ZU1hc2sgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKCBjb21tYW5kQnVmZmVyLCBmYWNlTWFzaywgd3JpdGVNYXNrICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFNldFZpZXdwb3J0KCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydCogcFZpZXdwb3J0cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFNldFZpZXdwb3J0KCBjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRzICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKiBwU2hhZGluZ1JhdGVQYWxldHRlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoIGNvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBTaGFkaW5nUmF0ZVBhbGV0dGVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiBwVmlld3BvcnRXU2NhbGluZ3MgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoIGNvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBWaWV3cG9ydFdTY2FsaW5ncyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRUcmFjZVJheXNOViggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVmtEZXZpY2VTaXplIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIFZrQnVmZmVyIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLCBWa0J1ZmZlciBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGRlcHRoICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kVHJhY2VSYXlzTlYoIGNvbW1hbmRCdWZmZXIsIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLCBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTsKKyAgICB9CisKKyAgICB2b2lkIHZrQ21kVXBkYXRlQnVmZmVyKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgZGF0YVNpemUsIGNvbnN0IHZvaWQqIHBEYXRhICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kVXBkYXRlQnVmZmVyKCBjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgZGF0YVNpemUsIHBEYXRhICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFdhaXRFdmVudHMoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NtZFdhaXRFdmVudHMoIGNvbW1hbmRCdWZmZXIsIGV2ZW50Q291bnQsIHBFdmVudHMsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsIFZrUXVlcnlUeXBlIHF1ZXJ5VHlwZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKCBjb21tYW5kQnVmZmVyLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsIHF1ZXJ5VHlwZSwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5ICk7CisgICAgfQorCisgICAgdm9pZCB2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCB1aW50MzJfdCBtYXJrZXIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCggY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVTdGFnZSwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIG1hcmtlciApOworICAgIH0KKworICAgIHZvaWQgdmtDbWRXcml0ZVRpbWVzdGFtcCggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDbWRXcml0ZVRpbWVzdGFtcCggY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVTdGFnZSwgcXVlcnlQb29sLCBxdWVyeSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrRW5kQ29tbWFuZEJ1ZmZlciggVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtFbmRDb21tYW5kQnVmZmVyKCBjb21tYW5kQnVmZmVyICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtSZXNldENvbW1hbmRCdWZmZXIoIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrUmVzZXRDb21tYW5kQnVmZmVyKCBjb21tYW5kQnVmZmVyLCBmbGFncyApOworICAgIH0KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWa1Jlc3VsdCB2a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCggVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoIGRldmljZSwgc3dhcGNoYWluICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICBWa1Jlc3VsdCB2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqIHBBY3F1aXJlSW5mbywgdWludDMyX3QqIHBJbWFnZUluZGV4ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQWNxdWlyZU5leHRJbWFnZTJLSFIoIGRldmljZSwgcEFjcXVpcmVJbmZvLCBwSW1hZ2VJbmRleCApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQWNxdWlyZU5leHRJbWFnZUtIUiggVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQ2NF90IHRpbWVvdXQsIFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgVmtGZW5jZSBmZW5jZSwgdWludDMyX3QqIHBJbWFnZUluZGV4ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQWNxdWlyZU5leHRJbWFnZUtIUiggZGV2aWNlLCBzd2FwY2hhaW4sIHRpbWVvdXQsIHNlbWFwaG9yZSwgZmVuY2UsIHBJbWFnZUluZGV4ICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwqIHBDb25maWd1cmF0aW9uICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBkZXZpY2UsIHBBY3F1aXJlSW5mbywgcENvbmZpZ3VyYXRpb24gKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiBwSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKCBkZXZpY2UsIHBJbmZvICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCBkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBDb21tYW5kQnVmZmVycyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sIFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyggZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0FsbG9jYXRlTWVtb3J5KCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlTWVtb3J5KiBwTWVtb3J5ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQWxsb2NhdGVNZW1vcnkoIGRldmljZSwgcEFsbG9jYXRlSW5mbywgcEFsbG9jYXRvciwgcE1lbW9yeSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKCBWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViggZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtCaW5kQnVmZmVyTWVtb3J5KCBWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQmluZEJ1ZmZlck1lbW9yeSggZGV2aWNlLCBidWZmZXIsIG1lbW9yeSwgbWVtb3J5T2Zmc2V0ICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtCaW5kQnVmZmVyTWVtb3J5MiggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBwQmluZEluZm9zICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQmluZEJ1ZmZlck1lbW9yeTIoIGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQmluZEJ1ZmZlck1lbW9yeTJLSFIoIFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0JpbmRCdWZmZXJNZW1vcnkyS0hSKCBkZXZpY2UsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0JpbmRJbWFnZU1lbW9yeSggVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtCaW5kSW1hZ2VNZW1vcnkoIGRldmljZSwgaW1hZ2UsIG1lbW9yeSwgbWVtb3J5T2Zmc2V0ICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtCaW5kSW1hZ2VNZW1vcnkyKCBWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogcEJpbmRJbmZvcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0JpbmRJbWFnZU1lbW9yeTIoIGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQmluZEltYWdlTWVtb3J5MktIUiggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtCaW5kSW1hZ2VNZW1vcnkyS0hSKCBkZXZpY2UsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NvbXBpbGVEZWZlcnJlZE5WKCBWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IHNoYWRlciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NvbXBpbGVEZWZlcnJlZE5WKCBkZXZpY2UsIHBpcGVsaW5lLCBzaGFkZXIgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBwQWNjZWxlcmF0aW9uU3RydWN0dXJlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUJ1ZmZlciggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQnVmZmVyKiBwQnVmZmVyICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlQnVmZmVyKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQnVmZmVyICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVCdWZmZXJWaWV3KCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQnVmZmVyVmlldyogcFZpZXcgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVCdWZmZXJWaWV3KCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmlldyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlQ29tbWFuZFBvb2woIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQ29tbWFuZFBvb2wqIHBDb21tYW5kUG9vbCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZUNvbW1hbmRQb29sKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ29tbWFuZFBvb2wgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMoIFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMoIGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZURlc2NyaXB0b3JQb29sKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JQb29sKiBwRGVzY3JpcHRvclBvb2wgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVEZXNjcmlwdG9yUG9vbCggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JQb29sICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoIGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTZXRMYXlvdXQgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlRXZlbnQoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRXZlbnQqIHBFdmVudCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZUV2ZW50KCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRXZlbnQgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUZlbmNlKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ZlbmNlKiBwRmVuY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVGZW5jZSggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEZlbmNlICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVGcmFtZWJ1ZmZlciggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtGcmFtZWJ1ZmZlciogcEZyYW1lYnVmZmVyICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlRnJhbWVidWZmZXIoIGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBGcmFtZWJ1ZmZlciApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoIFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyggZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlSW1hZ2UoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrSW1hZ2UqIHBJbWFnZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZUltYWdlKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW1hZ2UgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUltYWdlVmlldyggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrSW1hZ2VWaWV3KiBwVmlldyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZUltYWdlVmlldyggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFZpZXcgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKiBwSW5kaXJlY3RDb21tYW5kc0xheW91dCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0ICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVPYmplY3RUYWJsZU5WWCggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtPYmplY3RUYWJsZU5WWCogcE9iamVjdFRhYmxlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlT2JqZWN0VGFibGVOVlgoIGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBPYmplY3RUYWJsZSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlUGlwZWxpbmVDYWNoZSggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lQ2FjaGUqIHBQaXBlbGluZUNhY2hlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlUGlwZWxpbmVDYWNoZSggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFBpcGVsaW5lQ2FjaGUgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lTGF5b3V0KiBwUGlwZWxpbmVMYXlvdXQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVQaXBlbGluZUxheW91dCggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFBpcGVsaW5lTGF5b3V0ICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVRdWVyeVBvb2woIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1F1ZXJ5UG9vbCogcFF1ZXJ5UG9vbCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZVF1ZXJ5UG9vbCggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFF1ZXJ5UG9vbCApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKCBWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViggZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlUmVuZGVyUGFzcyggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlUmVuZGVyUGFzcyggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFJlbmRlclBhc3MgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoIGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVTYW1wbGVyKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2FtcGxlciogcFNhbXBsZXIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVTYW1wbGVyKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2FtcGxlciApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qIHBZY2JjckNvbnZlcnNpb24gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwWWNiY3JDb252ZXJzaW9uICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogcFljYmNyQ29udmVyc2lvbiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBZY2JjckNvbnZlcnNpb24gKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZVNlbWFwaG9yZSggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2VtYXBob3JlKiBwU2VtYXBob3JlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlU2VtYXBob3JlKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2VtYXBob3JlICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVTaGFkZXJNb2R1bGUoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZVNoYWRlck1vZHVsZSggZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNoYWRlck1vZHVsZSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiggZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWlucyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlU3dhcGNoYWluS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW4gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVTd2FwY2hhaW5LSFIoIGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTd2FwY2hhaW4gKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiBwVmFsaWRhdGlvbkNhY2hlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmFsaWRhdGlvbkNhY2hlICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiBwTmFtZUluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoIGRldmljZSwgcE5hbWVJbmZvICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogcFRhZ0luZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCggZGV2aWNlLCBwVGFnSW5mbyApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggZGV2aWNlLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveUJ1ZmZlciggVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0Rlc3Ryb3lCdWZmZXIoIGRldmljZSwgYnVmZmVyLCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lCdWZmZXJWaWV3KCBWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyVmlldyBidWZmZXJWaWV3LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95QnVmZmVyVmlldyggZGV2aWNlLCBidWZmZXJWaWV3LCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lDb21tYW5kUG9vbCggVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95Q29tbWFuZFBvb2woIGRldmljZSwgY29tbWFuZFBvb2wsIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveURlc2NyaXB0b3JQb29sKCBWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCggZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCggVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY3JpcHRvclNldExheW91dCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoIGRldmljZSwgZGVzY3JpcHRvclNldExheW91dCwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCBWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoIGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lEZXZpY2UoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveURldmljZSggZGV2aWNlLCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lFdmVudCggVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95RXZlbnQoIGRldmljZSwgZXZlbnQsIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveUZlbmNlKCBWa0RldmljZSBkZXZpY2UsIFZrRmVuY2UgZmVuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0Rlc3Ryb3lGZW5jZSggZGV2aWNlLCBmZW5jZSwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95RnJhbWVidWZmZXIoIFZrRGV2aWNlIGRldmljZSwgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveUZyYW1lYnVmZmVyKCBkZXZpY2UsIGZyYW1lYnVmZmVyLCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lJbWFnZSggVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95SW1hZ2UoIGRldmljZSwgaW1hZ2UsIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveUltYWdlVmlldyggVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0Rlc3Ryb3lJbWFnZVZpZXcoIGRldmljZSwgaW1hZ2VWaWV3LCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKCBWa0RldmljZSBkZXZpY2UsIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCggZGV2aWNlLCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCggVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95T2JqZWN0VGFibGVOVlgoIGRldmljZSwgb2JqZWN0VGFibGUsIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveVBpcGVsaW5lKCBWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0Rlc3Ryb3lQaXBlbGluZSggZGV2aWNlLCBwaXBlbGluZSwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95UGlwZWxpbmVDYWNoZSggVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveVBpcGVsaW5lQ2FjaGUoIGRldmljZSwgcGlwZWxpbmVDYWNoZSwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQoIFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KCBkZXZpY2UsIHBpcGVsaW5lTGF5b3V0LCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lRdWVyeVBvb2woIFZrRGV2aWNlIGRldmljZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95UXVlcnlQb29sKCBkZXZpY2UsIHF1ZXJ5UG9vbCwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95UmVuZGVyUGFzcyggVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveVJlbmRlclBhc3MoIGRldmljZSwgcmVuZGVyUGFzcywgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95U2FtcGxlciggVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXIgc2FtcGxlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveVNhbXBsZXIoIGRldmljZSwgc2FtcGxlciwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiggVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiggZGV2aWNlLCB5Y2JjckNvbnZlcnNpb24sIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIFZrRGV2aWNlIGRldmljZSwgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyQ29udmVyc2lvbiwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIGRldmljZSwgeWNiY3JDb252ZXJzaW9uLCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lTZW1hcGhvcmUoIFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95U2VtYXBob3JlKCBkZXZpY2UsIHNlbWFwaG9yZSwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95U2hhZGVyTW9kdWxlKCBWa0RldmljZSBkZXZpY2UsIFZrU2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveVNoYWRlck1vZHVsZSggZGV2aWNlLCBzaGFkZXJNb2R1bGUsIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveVN3YXBjaGFpbktIUiggVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIoIGRldmljZSwgc3dhcGNoYWluLCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoIFZrRGV2aWNlIGRldmljZSwgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKCBkZXZpY2UsIHZhbGlkYXRpb25DYWNoZSwgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrRGV2aWNlV2FpdElkbGUoIFZrRGV2aWNlIGRldmljZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0RldmljZVdhaXRJZGxlKCBkZXZpY2UgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQoIFZrRGV2aWNlIGRldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogcERpc3BsYXlQb3dlckluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEaXNwbGF5UG93ZXJDb250cm9sRVhUKCBkZXZpY2UsIGRpc3BsYXksIHBEaXNwbGF5UG93ZXJJbmZvICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoIGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcyApOworICAgIH0KKworICAgIHZvaWQgdmtGcmVlQ29tbWFuZEJ1ZmZlcnMoIFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0ZyZWVDb21tYW5kQnVmZmVycyggZGV2aWNlLCBjb21tYW5kUG9vbCwgY29tbWFuZEJ1ZmZlckNvdW50LCBwQ29tbWFuZEJ1ZmZlcnMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0ZyZWVEZXNjcmlwdG9yU2V0cyggVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsIGNvbnN0IFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRnJlZURlc2NyaXB0b3JTZXRzKCBkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBkZXNjcmlwdG9yU2V0Q291bnQsIHBEZXNjcmlwdG9yU2V0cyApOworICAgIH0KKworICAgIHZvaWQgdmtGcmVlTWVtb3J5KCBWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRnJlZU1lbW9yeSggZGV2aWNlLCBtZW1vcnksIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKCBWa0RldmljZSBkZXZpY2UsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoIGRldmljZSwgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBkYXRhU2l6ZSwgcERhdGEgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqIHBNZW1vcnlSZXF1aXJlbWVudHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViggZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyApOworICAgIH0KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIFZrUmVzdWx0IHZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoIFZrRGV2aWNlIGRldmljZSwgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyLCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKCBkZXZpY2UsIGJ1ZmZlciwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworCisgICAgVmtEZXZpY2VBZGRyZXNzIHZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoIGRldmljZSwgcEluZm8gKTsKKyAgICB9CisKKyAgICBWa0RldmljZUFkZHJlc3MgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIHBJbmZvICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUiggZGV2aWNlLCBwSW5mbyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoIFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBWa01lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyggZGV2aWNlLCBidWZmZXIsIHBNZW1vcnlSZXF1aXJlbWVudHMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBwTWVtb3J5UmVxdWlyZW1lbnRzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiggZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzICk7CisgICAgfQorCisgICAgdWludDY0X3QgdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKCBkZXZpY2UsIHBJbmZvICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCB0aW1lc3RhbXBDb3VudCwgY29uc3QgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCogcFRpbWVzdGFtcEluZm9zLCB1aW50NjRfdCogcFRpbWVzdGFtcHMsIHVpbnQ2NF90KiBwTWF4RGV2aWF0aW9uICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoIGRldmljZSwgdGltZXN0YW1wQ291bnQsIHBUaW1lc3RhbXBJbmZvcywgcFRpbWVzdGFtcHMsIHBNYXhEZXZpYXRpb24gKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHBTdXBwb3J0ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIGRldmljZSwgcENyZWF0ZUluZm8sIHBTdXBwb3J0ICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiBwU3VwcG9ydCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKCBkZXZpY2UsIHBDcmVhdGVJbmZvLCBwU3VwcG9ydCApOworICAgIH0KKworICAgIHZvaWQgdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqIHBQZWVyTWVtb3J5RmVhdHVyZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyggZGV2aWNlLCBoZWFwSW5kZXgsIGxvY2FsRGV2aWNlSW5kZXgsIHJlbW90ZURldmljZUluZGV4LCBwUGVlck1lbW9yeUZlYXR1cmVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKCBWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGhlYXBJbmRleCwgdWludDMyX3QgbG9jYWxEZXZpY2VJbmRleCwgdWludDMyX3QgcmVtb3RlRGV2aWNlSW5kZXgsIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogcFBlZXJNZW1vcnlGZWF0dXJlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKCBkZXZpY2UsIGhlYXBJbmRleCwgbG9jYWxEZXZpY2VJbmRleCwgcmVtb3RlRGV2aWNlSW5kZXgsIHBQZWVyTWVtb3J5RmVhdHVyZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiggVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiggZGV2aWNlLCBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzICk7CisgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFZrUmVzdWx0IHZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiBwTW9kZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCBkZXZpY2UsIHBTdXJmYWNlSW5mbywgcE1vZGVzICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICBWa1Jlc3VsdCB2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVmtEZXZpY2UgZGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggZGV2aWNlLCBzdXJmYWNlLCBwTW9kZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCggVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRGV2aWNlU2l6ZSogcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KCBkZXZpY2UsIG1lbW9yeSwgcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMgKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCB2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKCBkZXZpY2UsIHBJbmZvICk7CisgICAgfQorCisgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIHZrR2V0RGV2aWNlUHJvY0FkZHIoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgY2hhciogcE5hbWUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCBwTmFtZSApOworICAgIH0KKworICAgIHZvaWQgdmtHZXREZXZpY2VRdWV1ZSggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCBxdWV1ZUluZGV4LCBWa1F1ZXVlKiBwUXVldWUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXREZXZpY2VRdWV1ZSggZGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBxdWV1ZUluZGV4LCBwUXVldWUgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0RGV2aWNlUXVldWUyKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogcFF1ZXVlSW5mbywgVmtRdWV1ZSogcFF1ZXVlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0RGV2aWNlUXVldWUyKCBkZXZpY2UsIHBRdWV1ZUluZm8sIHBRdWV1ZSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0RXZlbnRTdGF0dXMoIFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldEV2ZW50U3RhdHVzKCBkZXZpY2UsIGV2ZW50ICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRGZW5jZUZkS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0RmVuY2VGZEtIUiggZGV2aWNlLCBwR2V0RmRJbmZvLCBwRmQgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldEZlbmNlU3RhdHVzKCBWa0RldmljZSBkZXZpY2UsIFZrRmVuY2UgZmVuY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRGZW5jZVN0YXR1cyggZGV2aWNlLCBmZW5jZSApOworICAgIH0KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWa1Jlc3VsdCB2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiggZGV2aWNlLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICBWa1Jlc3VsdCB2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKCBWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqIHBQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoIGRldmljZSwgaW1hZ2UsIHBQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKCBWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiBwTWVtb3J5UmVxdWlyZW1lbnRzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoIGRldmljZSwgaW1hZ2UsIHBNZW1vcnlSZXF1aXJlbWVudHMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiggZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBwTWVtb3J5UmVxdWlyZW1lbnRzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBkZXZpY2UsIGltYWdlLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiggZGV2aWNlLCBwSW5mbywgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGRldmljZSwgcEluZm8sIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoIFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiBwU3VicmVzb3VyY2UsIFZrU3VicmVzb3VyY2VMYXlvdXQqIHBMYXlvdXQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KCBkZXZpY2UsIGltYWdlLCBwU3VicmVzb3VyY2UsIHBMYXlvdXQgKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCB2a0dldEltYWdlVmlld0hhbmRsZU5WWCggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqIHBJbmZvICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKCBkZXZpY2UsIHBJbmZvICk7CisgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgVmtSZXN1bHQgdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHBJbmZvLCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogcEJ1ZmZlciApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoIGRldmljZSwgcEluZm8sIHBCdWZmZXIgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworCisgICAgVmtSZXN1bHQgdmtHZXRNZW1vcnlGZEtIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRNZW1vcnlGZEtIUiggZGV2aWNlLCBwR2V0RmRJbmZvLCBwRmQgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUiggVmtEZXZpY2UgZGV2aWNlLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIGludCBmZCwgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqIHBNZW1vcnlGZFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoIGRldmljZSwgaGFuZGxlVHlwZSwgZmQsIHBNZW1vcnlGZFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCggVmtEZXZpY2UgZGV2aWNlLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIGNvbnN0IHZvaWQqIHBIb3N0UG9pbnRlciwgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoIGRldmljZSwgaGFuZGxlVHlwZSwgcEhvc3RQb2ludGVyLCBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzICk7CisgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFZrUmVzdWx0IHZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHBHZXRXaW4zMkhhbmRsZUluZm8sIEhBTkRMRSogcEhhbmRsZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSKCBkZXZpY2UsIHBHZXRXaW4zMkhhbmRsZUluZm8sIHBIYW5kbGUgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWa1Jlc3VsdCB2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYoIFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgaGFuZGxlVHlwZSwgSEFORExFKiBwSGFuZGxlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViggZGV2aWNlLCBtZW1vcnksIGhhbmRsZVR5cGUsIHBIYW5kbGUgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWa1Jlc3VsdCB2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiggVmtEZXZpY2UgZGV2aWNlLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIEhBTkRMRSBoYW5kbGUsIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKCBkZXZpY2UsIGhhbmRsZVR5cGUsIGhhbmRsZSwgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcyApOworICAgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgICAgVmtSZXN1bHQgdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKCBWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCwgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiBwUHJlc2VudGF0aW9uVGltaW5ncyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoIGRldmljZSwgc3dhcGNoYWluLCBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsIHBQcmVzZW50YXRpb25UaW1pbmdzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKCBWa0RldmljZSBkZXZpY2UsIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgcGFyYW1ldGVyLCBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCogcFZhbHVlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCggZGV2aWNlLCBwYXJhbWV0ZXIsIHBWYWx1ZSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGlwZWxpbmVDYWNoZURhdGEoIFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHNpemVfdCogcERhdGFTaXplLCB2b2lkKiBwRGF0YSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBpcGVsaW5lQ2FjaGVEYXRhKCBkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIHBEYXRhU2l6ZSwgcERhdGEgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogcEV4ZWN1dGFibGVJbmZvLCB1aW50MzJfdCogcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggZGV2aWNlLCBwRXhlY3V0YWJsZUluZm8sIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiogcFBpcGVsaW5lSW5mbywgdWludDMyX3QqIHBFeGVjdXRhYmxlQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogcFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKCBkZXZpY2UsIHBQaXBlbGluZUluZm8sIHBFeGVjdXRhYmxlQ291bnQsIHBQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogcEV4ZWN1dGFibGVJbmZvLCB1aW50MzJfdCogcFN0YXRpc3RpY0NvdW50LCBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogcFN0YXRpc3RpY3MgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKCBkZXZpY2UsIHBFeGVjdXRhYmxlSW5mbywgcFN0YXRpc3RpY0NvdW50LCBwU3RhdGlzdGljcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UXVlcnlQb29sUmVzdWx0cyggVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCogcERhdGEsIFZrRGV2aWNlU2l6ZSBzdHJpZGUsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFF1ZXJ5UG9vbFJlc3VsdHMoIGRldmljZSwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBkYXRhU2l6ZSwgcERhdGEsIHN0cmlkZSwgZmxhZ3MgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViggVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCB1aW50MzJfdCBmaXJzdEdyb3VwLCB1aW50MzJfdCBncm91cENvdW50LCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKCBkZXZpY2UsIHBpcGVsaW5lLCBmaXJzdEdyb3VwLCBncm91cENvdW50LCBkYXRhU2l6ZSwgcERhdGEgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKCBWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoIGRldmljZSwgc3dhcGNoYWluLCBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5KCBWa0RldmljZSBkZXZpY2UsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzLCBWa0V4dGVudDJEKiBwR3JhbnVsYXJpdHkgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoIGRldmljZSwgcmVuZGVyUGFzcywgcEdyYW51bGFyaXR5ICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoIFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCB1aW50NjRfdCogcFZhbHVlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKCBkZXZpY2UsIHNlbWFwaG9yZSwgcFZhbHVlICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRTZW1hcGhvcmVGZEtIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRTZW1hcGhvcmVGZEtIUiggZGV2aWNlLCBwR2V0RmRJbmZvLCBwRmQgKTsKKyAgICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgVmtSZXN1bHQgdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoIGRldmljZSwgcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSApOworICAgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgICAgVmtSZXN1bHQgdmtHZXRTaGFkZXJJbmZvQU1EKCBWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzaGFkZXJTdGFnZSwgVmtTaGFkZXJJbmZvVHlwZUFNRCBpbmZvVHlwZSwgc2l6ZV90KiBwSW5mb1NpemUsIHZvaWQqIHBJbmZvICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0U2hhZGVySW5mb0FNRCggZGV2aWNlLCBwaXBlbGluZSwgc2hhZGVyU3RhZ2UsIGluZm9UeXBlLCBwSW5mb1NpemUsIHBJbmZvICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUKCBWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUIGNvdW50ZXIsIHVpbnQ2NF90KiBwQ291bnRlclZhbHVlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0U3dhcGNoYWluQ291bnRlckVYVCggZGV2aWNlLCBzd2FwY2hhaW4sIGNvdW50ZXIsIHBDb3VudGVyVmFsdWUgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFN3YXBjaGFpbkltYWdlc0tIUiggVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90KiBwU3dhcGNoYWluSW1hZ2VDb3VudCwgVmtJbWFnZSogcFN3YXBjaGFpbkltYWdlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFN3YXBjaGFpbkltYWdlc0tIUiggZGV2aWNlLCBzd2FwY2hhaW4sIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBwU3dhcGNoYWluSW1hZ2VzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIoIFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0U3dhcGNoYWluU3RhdHVzS0hSKCBkZXZpY2UsIHN3YXBjaGFpbiApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCggVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGUsIHNpemVfdCogcERhdGFTaXplLCB2b2lkKiBwRGF0YSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoIGRldmljZSwgdmFsaWRhdGlvbkNhY2hlLCBwRGF0YVNpemUsIHBEYXRhICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtJbXBvcnRGZW5jZUZkS0hSKCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqIHBJbXBvcnRGZW5jZUZkSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0ltcG9ydEZlbmNlRmRLSFIoIGRldmljZSwgcEltcG9ydEZlbmNlRmRJbmZvICk7CisgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFZrUmVzdWx0IHZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKCBkZXZpY2UsIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbyApOworICAgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgICAgVmtSZXN1bHQgdmtJbXBvcnRTZW1hcGhvcmVGZEtIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiogcEltcG9ydFNlbWFwaG9yZUZkSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0ltcG9ydFNlbWFwaG9yZUZkS0hSKCBkZXZpY2UsIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8gKTsKKyAgICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgVmtSZXN1bHQgdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKCBkZXZpY2UsIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8gKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICAgIFZrUmVzdWx0IHZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqIHBJbml0aWFsaXplSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKCBkZXZpY2UsIHBJbml0aWFsaXplSW5mbyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyggZGV2aWNlLCBtZW1vcnlSYW5nZUNvdW50LCBwTWVtb3J5UmFuZ2VzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtNYXBNZW1vcnkoIFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgVmtNZW1vcnlNYXBGbGFncyBmbGFncywgdm9pZCoqIHBwRGF0YSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a01hcE1lbW9yeSggZGV2aWNlLCBtZW1vcnksIG9mZnNldCwgc2l6ZSwgZmxhZ3MsIHBwRGF0YSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrTWVyZ2VQaXBlbGluZUNhY2hlcyggVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgZHN0Q2FjaGUsIHVpbnQzMl90IHNyY0NhY2hlQ291bnQsIGNvbnN0IFZrUGlwZWxpbmVDYWNoZSogcFNyY0NhY2hlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a01lcmdlUGlwZWxpbmVDYWNoZXMoIGRldmljZSwgZHN0Q2FjaGUsIHNyY0NhY2hlQ291bnQsIHBTcmNDYWNoZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCggVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCBkc3RDYWNoZSwgdWludDMyX3Qgc3JjQ2FjaGVDb3VudCwgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqIHBTcmNDYWNoZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoIGRldmljZSwgZHN0Q2FjaGUsIHNyY0NhY2hlQ291bnQsIHBTcmNDYWNoZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqIHBEZXZpY2VFdmVudEluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtGZW5jZSogcEZlbmNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCggZGV2aWNlLCBwRGV2aWNlRXZlbnRJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKCBWa0RldmljZSBkZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqIHBEaXNwbGF5RXZlbnRJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKCBkZXZpY2UsIGRpc3BsYXksIHBEaXNwbGF5RXZlbnRJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1JlZ2lzdGVyT2JqZWN0c05WWCggVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogcHBPYmplY3RUYWJsZUVudHJpZXMsIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0SW5kaWNlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1JlZ2lzdGVyT2JqZWN0c05WWCggZGV2aWNlLCBvYmplY3RUYWJsZSwgb2JqZWN0Q291bnQsIHBwT2JqZWN0VGFibGVFbnRyaWVzLCBwT2JqZWN0SW5kaWNlcyApOworICAgIH0KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWa1Jlc3VsdCB2a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCggVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoIGRldmljZSwgc3dhcGNoYWluICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICBWa1Jlc3VsdCB2a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCggVmtEZXZpY2UgZGV2aWNlLCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbmZpZ3VyYXRpb24gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIGRldmljZSwgY29uZmlndXJhdGlvbiApOworICAgIH0KKworICAgIHZvaWQgdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiggVmtEZXZpY2UgZGV2aWNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoIGRldmljZSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrUmVzZXRDb21tYW5kUG9vbCggVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyBmbGFncyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1Jlc2V0Q29tbWFuZFBvb2woIGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtSZXNldERlc2NyaXB0b3JQb29sKCBWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrUmVzZXREZXNjcmlwdG9yUG9vbCggZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgZmxhZ3MgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1Jlc2V0RXZlbnQoIFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1Jlc2V0RXZlbnQoIGRldmljZSwgZXZlbnQgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1Jlc2V0RmVuY2VzKCBWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGZlbmNlQ291bnQsIGNvbnN0IFZrRmVuY2UqIHBGZW5jZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtSZXNldEZlbmNlcyggZGV2aWNlLCBmZW5jZUNvdW50LCBwRmVuY2VzICk7CisgICAgfQorCisgICAgdm9pZCB2a1Jlc2V0UXVlcnlQb29sRVhUKCBWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1Jlc2V0UXVlcnlQb29sRVhUKCBkZXZpY2UsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQqIHBOYW1lSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKCBkZXZpY2UsIHBOYW1lSW5mbyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiBwVGFnSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoIGRldmljZSwgcFRhZ0luZm8gKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1NldEV2ZW50KCBWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtTZXRFdmVudCggZGV2aWNlLCBldmVudCApOworICAgIH0KKworICAgIHZvaWQgdmtTZXRIZHJNZXRhZGF0YUVYVCggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwgY29uc3QgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zLCBjb25zdCBWa0hkck1ldGFkYXRhRVhUKiBwTWV0YWRhdGEgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtTZXRIZHJNZXRhZGF0YUVYVCggZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgcFN3YXBjaGFpbnMsIHBNZXRhZGF0YSApOworICAgIH0KKworICAgIHZvaWQgdmtTZXRMb2NhbERpbW1pbmdBTUQoIFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcENoYWluLCBWa0Jvb2wzMiBsb2NhbERpbW1pbmdFbmFibGUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtTZXRMb2NhbERpbW1pbmdBTUQoIGRldmljZSwgc3dhcENoYWluLCBsb2NhbERpbW1pbmdFbmFibGUgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1NpZ25hbFNlbWFwaG9yZUtIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqIHBTaWduYWxJbmZvICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrU2lnbmFsU2VtYXBob3JlS0hSKCBkZXZpY2UsIHBTaWduYWxJbmZvICk7CisgICAgfQorCisgICAgdm9pZCB2a1RyaW1Db21tYW5kUG9vbCggVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWa0NvbW1hbmRQb29sVHJpbUZsYWdzIGZsYWdzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrVHJpbUNvbW1hbmRQb29sKCBkZXZpY2UsIGNvbW1hbmRQb29sLCBmbGFncyApOworICAgIH0KKworICAgIHZvaWQgdmtUcmltQ29tbWFuZFBvb2xLSFIoIFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVmtDb21tYW5kUG9vbFRyaW1GbGFncyBmbGFncyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1RyaW1Db21tYW5kUG9vbEtIUiggZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCggVmtEZXZpY2UgZGV2aWNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCggZGV2aWNlICk7CisgICAgfQorCisgICAgdm9pZCB2a1VubWFwTWVtb3J5KCBWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1VubWFwTWVtb3J5KCBkZXZpY2UsIG1lbW9yeSApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrVW5yZWdpc3Rlck9iamVjdHNOVlgoIFZrRGV2aWNlIGRldmljZSwgVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgdWludDMyX3Qgb2JqZWN0Q291bnQsIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiBwT2JqZWN0RW50cnlUeXBlcywgY29uc3QgdWludDMyX3QqIHBPYmplY3RJbmRpY2VzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrVW5yZWdpc3Rlck9iamVjdHNOVlgoIGRldmljZSwgb2JqZWN0VGFibGUsIG9iamVjdENvdW50LCBwT2JqZWN0RW50cnlUeXBlcywgcE9iamVjdEluZGljZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSggVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoIGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwRGF0YSApOworICAgIH0KKworICAgIHZvaWQgdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKCBWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IHZvaWQqIHBEYXRhICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiggZGV2aWNlLCBkZXNjcmlwdG9yU2V0LCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBEYXRhICk7CisgICAgfQorCisgICAgdm9pZCB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCBWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMsIHVpbnQzMl90IGRlc2NyaXB0b3JDb3B5Q291bnQsIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yQ29waWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrVXBkYXRlRGVzY3JpcHRvclNldHMoIGRldmljZSwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzLCBkZXNjcmlwdG9yQ29weUNvdW50LCBwRGVzY3JpcHRvckNvcGllcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrV2FpdEZvckZlbmNlcyggVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlKiBwRmVuY2VzLCBWa0Jvb2wzMiB3YWl0QWxsLCB1aW50NjRfdCB0aW1lb3V0ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrV2FpdEZvckZlbmNlcyggZGV2aWNlLCBmZW5jZUNvdW50LCBwRmVuY2VzLCB3YWl0QWxsLCB0aW1lb3V0ICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtXYWl0U2VtYXBob3Jlc0tIUiggVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiBwV2FpdEluZm8sIHVpbnQ2NF90IHRpbWVvdXQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtXYWl0U2VtYXBob3Jlc0tIUiggZGV2aWNlLCBwV2FpdEluZm8sIHRpbWVvdXQgKTsKKyAgICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKCBWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiBwQ2FsbGJhY2sgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBDYWxsYmFjayApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKiBwTWVzc2VuZ2VyICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCggaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTWVzc2VuZ2VyICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKCBWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoIGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlICk7CisgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUlPU1N1cmZhY2VNVksoIFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVJT1NTdXJmYWNlTVZLKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0lPU19NVksqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKCBWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIFZrUmVzdWx0IHZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKCBWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVNYWNPU1N1cmZhY2VNVksoIGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgVmtSZXN1bHQgdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCggaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSApOworICAgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9HR1AqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisgICAgVmtSZXN1bHQgdmtDcmVhdGVWaVN1cmZhY2VOTiggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtDcmVhdGVWaVN1cmZhY2VOTiggaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSApOworICAgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9WSV9OTiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKCBWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIFZrUmVzdWx0IHZrQ3JlYXRlWGNiU3VyZmFjZUtIUiggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZVhjYlN1cmZhY2VLSFIoIGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWENCX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKCBWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKCBpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKi8KKworICAgIHZvaWQgdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoIFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdSZXBvcnRGbGFnc0VYVCBmbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZSwgdWludDY0X3Qgb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbWVzc2FnZUNvZGUsIGNvbnN0IGNoYXIqIHBMYXllclByZWZpeCwgY29uc3QgY2hhciogcE1lc3NhZ2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoIGluc3RhbmNlLCBmbGFncywgb2JqZWN0VHlwZSwgb2JqZWN0LCBsb2NhdGlvbiwgbWVzc2FnZUNvZGUsIHBMYXllclByZWZpeCwgcE1lc3NhZ2UgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoIFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBjYWxsYmFjaywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoIGluc3RhbmNlLCBjYWxsYmFjaywgcEFsbG9jYXRvciApOworICAgIH0KKworICAgIHZvaWQgdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCggVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIGluc3RhbmNlLCBtZXNzZW5nZXIsIHBBbGxvY2F0b3IgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrRGVzdHJveUluc3RhbmNlKCBWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtEZXN0cm95SW5zdGFuY2UoIGluc3RhbmNlLCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgdm9pZCB2a0Rlc3Ryb3lTdXJmYWNlS0hSKCBWa0luc3RhbmNlIGluc3RhbmNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrRGVzdHJveVN1cmZhY2VLSFIoIGluc3RhbmNlLCBzdXJmYWNlLCBwQWxsb2NhdG9yICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyggVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKCBpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiggVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKCBpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoIFZrSW5zdGFuY2UgaW5zdGFuY2UsIHVpbnQzMl90KiBwUGh5c2ljYWxEZXZpY2VDb3VudCwgVmtQaHlzaWNhbERldmljZSogcFBoeXNpY2FsRGV2aWNlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyggaW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUNvdW50LCBwUGh5c2ljYWxEZXZpY2VzICk7CisgICAgfQorCisgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciogcE5hbWUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgcE5hbWUgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoIFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIG1lc3NhZ2VTZXZlcml0eSwgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlVHlwZXMsIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogcENhbGxiYWNrRGF0YSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKCBpbnN0YW5jZSwgbWVzc2FnZVNldmVyaXR5LCBtZXNzYWdlVHlwZXMsIHBDYWxsYmFja0RhdGEgKTsKKyAgICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgVmtSZXN1bHQgdmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIERpc3BsYXkqIGRweSwgVmtEaXNwbGF5S0hSIGRpc3BsYXkgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQoIHBoeXNpY2FsRGV2aWNlLCBkcHksIGRpc3BsYXkgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUKi8KKworICAgIFZrUmVzdWx0IHZrQ3JlYXRlRGV2aWNlKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlKiBwRGV2aWNlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlRGV2aWNlKCBwaHlzaWNhbERldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXZpY2UgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0NyZWF0ZURpc3BsYXlNb2RlS0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGlzcGxheU1vZGVLSFIqIHBNb2RlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrQ3JlYXRlRGlzcGxheU1vZGVLSFIoIHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1vZGUgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IGNoYXIqIHBMYXllck5hbWUsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoIHBoeXNpY2FsRGV2aWNlLCBwTGF5ZXJOYW1lLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0xheWVyUHJvcGVydGllcyogcFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoIHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90KiBwQ291bnRlckNvdW50LCBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogcENvdW50ZXJzLCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiBwQ291bnRlckRlc2NyaXB0aW9ucyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoIHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBwQ291bnRlckNvdW50LCBwQ291bnRlcnMsIHBDb3VudGVyRGVzY3JpcHRpb25zICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqIHBQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiggcGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiogcFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoIHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIqIHBEaXNwbGF5UGxhbmVJbmZvLCBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIqIHBDYXBhYmlsaXRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKCBwaHlzaWNhbERldmljZSwgcERpc3BsYXlQbGFuZUluZm8sIHBDYXBhYmlsaXRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5TW9kZUtIUiBtb2RlLCB1aW50MzJfdCBwbGFuZUluZGV4LCBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogcENhcGFiaWxpdGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiggcGh5c2ljYWxEZXZpY2UsIG1vZGUsIHBsYW5lSW5kZXgsIHBDYXBhYmlsaXRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBwbGFuZUluZGV4LCB1aW50MzJfdCogcERpc3BsYXlDb3VudCwgVmtEaXNwbGF5S0hSKiBwRGlzcGxheXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiggcGh5c2ljYWxEZXZpY2UsIHBsYW5lSW5kZXgsIHBEaXNwbGF5Q291bnQsIHBEaXNwbGF5cyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwVGltZURvbWFpbkNvdW50LCBWa1RpbWVEb21haW5FWFQqIHBUaW1lRG9tYWlucyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKCBwaHlzaWNhbERldmljZSwgcFRpbWVEb21haW5Db3VudCwgcFRpbWVEb21haW5zICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqIHBQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViggcGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoIHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKCBwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiogcFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiggcGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoIHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qIHBFeHRlcm5hbEJ1ZmZlckluZm8sIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoIHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKCBwaHlzaWNhbERldmljZSwgcEV4dGVybmFsQnVmZmVySW5mbywgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qIHBFeHRlcm5hbEZlbmNlSW5mbywgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyggcGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEZlbmNlSW5mbywgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogcEV4dGVybmFsRmVuY2VJbmZvLCBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKCBwaHlzaWNhbERldmljZSwgcEV4dGVybmFsRmVuY2VJbmZvLCBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa0ltYWdlVGlsaW5nIHRpbGluZywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VDcmVhdGVGbGFncyBmbGFncywgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGV4dGVybmFsSGFuZGxlVHlwZSwgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKiBwRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYoIHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHR5cGUsIHRpbGluZywgdXNhZ2UsIGZsYWdzLCBleHRlcm5hbEhhbmRsZVR5cGUsIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyggcGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoIHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyogcEZlYXR1cmVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyggcGh5c2ljYWxEZXZpY2UsIHBGZWF0dXJlcyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogcEZlYXR1cmVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoIHBoeXNpY2FsRGV2aWNlLCBwRmVhdHVyZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqIHBGZWF0dXJlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKCBwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0Zvcm1hdFByb3BlcnRpZXMqIHBGb3JtYXRQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKCBwaHlzaWNhbERldmljZSwgZm9ybWF0LCBwRm9ybWF0UHJvcGVydGllcyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrRm9ybWF0UHJvcGVydGllczIqIHBGb3JtYXRQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiggcGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0Zvcm1hdFByb3BlcnRpZXMyKiBwRm9ybWF0UHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIoIHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHBGb3JtYXRQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqIHBGZWF0dXJlcywgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogcExpbWl0cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKCBwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzLCBwTGltaXRzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa0ltYWdlVGlsaW5nIHRpbGluZywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VDcmVhdGVGbGFncyBmbGFncywgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyggcGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgdHlwZSwgdGlsaW5nLCB1c2FnZSwgZmxhZ3MsIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqIHBJbWFnZUZvcm1hdEluZm8sIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggcGh5c2ljYWxEZXZpY2UsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqIHBJbWFnZUZvcm1hdEluZm8sIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggcGh5c2ljYWxEZXZpY2UsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogcE1lbW9yeVByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoIHBoeXNpY2FsRGV2aWNlLCBwTWVtb3J5UHJvcGVydGllcyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIHBNZW1vcnlQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiggcGh5c2ljYWxEZXZpY2UsIHBNZW1vcnlQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogcE1lbW9yeVByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKCBwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLCBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogcE11bHRpc2FtcGxlUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKCBwaHlzaWNhbERldmljZSwgc2FtcGxlcywgcE11bHRpc2FtcGxlUHJvcGVydGllcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwUmVjdENvdW50LCBWa1JlY3QyRCogcFJlY3RzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiggcGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBSZWN0Q291bnQsIHBSZWN0cyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyggcGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogcFByb3BlcnRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKCBwaHlzaWNhbERldmljZSwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoIHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydGllcyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqIHBQZXJmb3JtYW5jZVF1ZXJ5Q3JlYXRlSW5mbywgdWludDMyX3QqIHBOdW1QYXNzZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiggcGh5c2ljYWxEZXZpY2UsIHBQZXJmb3JtYW5jZVF1ZXJ5Q3JlYXRlSW5mbywgcE51bVBhc3NlcyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoIHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogcFF1ZXVlRmFtaWx5UHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiggcGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKCBwaHlzaWNhbERldmljZSwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyApOworICAgIH0KKworICAgIHZvaWQgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBwaHlzaWNhbERldmljZSwgZm9ybWF0LCB0eXBlLCBzYW1wbGVzLCB1c2FnZSwgdGlsaW5nLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggcGh5c2ljYWxEZXZpY2UsIHBGb3JtYXRJbmZvLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwUHJvcGVydGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggcGh5c2ljYWxEZXZpY2UsIHBGb3JtYXRJbmZvLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBDb21iaW5hdGlvbkNvdW50LCBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogcENvbWJpbmF0aW9ucyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViggcGh5c2ljYWxEZXZpY2UsIHBDb21iaW5hdGlvbkNvdW50LCBwQ29tYmluYXRpb25zICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogcFN1cmZhY2VDYXBhYmlsaXRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKCBwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFN1cmZhY2VDYXBhYmlsaXRpZXMgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiogcFN1cmZhY2VDYXBhYmlsaXRpZXMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKCBwaHlzaWNhbERldmljZSwgcFN1cmZhY2VJbmZvLCBwU3VyZmFjZUNhcGFiaWxpdGllcyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiggcGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLCB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVmtTdXJmYWNlRm9ybWF0MktIUiogcFN1cmZhY2VGb3JtYXRzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIoIHBoeXNpY2FsRGV2aWNlLCBwU3VyZmFjZUluZm8sIHBTdXJmYWNlRm9ybWF0Q291bnQsIHBTdXJmYWNlRm9ybWF0cyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwU3VyZmFjZUZvcm1hdENvdW50LCBWa1N1cmZhY2VGb3JtYXRLSFIqIHBTdXJmYWNlRm9ybWF0cyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoIHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMgKTsKKyAgICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgVmtSZXN1bHQgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIHVpbnQzMl90KiBwUHJlc2VudE1vZGVDb3VudCwgVmtQcmVzZW50TW9kZUtIUiogcFByZXNlbnRNb2RlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoIHBoeXNpY2FsRGV2aWNlLCBwU3VyZmFjZUluZm8sIHBQcmVzZW50TW9kZUNvdW50LCBwUHJlc2VudE1vZGVzICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICBWa1Jlc3VsdCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwUHJlc2VudE1vZGVDb3VudCwgVmtQcmVzZW50TW9kZUtIUiogcFByZXNlbnRNb2RlcyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggcGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBQcmVzZW50TW9kZUNvdW50LCBwUHJlc2VudE1vZGVzICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtCb29sMzIqIHBTdXBwb3J0ZWQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKCBwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgc3VyZmFjZSwgcFN1cHBvcnRlZCApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBUb29sQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogcFRvb2xQcm9wZXJ0aWVzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCggcGh5c2ljYWxEZXZpY2UsIHBUb29sQ291bnQsIHBUb29sUHJvcGVydGllcyApOworICAgIH0KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIFZrQm9vbDMyIHZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgc3RydWN0IHdsX2Rpc3BsYXkqIGRpc3BsYXkgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKCBwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgZGlzcGxheSApOworICAgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgVmtCb29sMzIgdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKCBwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCApOworICAgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICBWa0Jvb2wzMiB2a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgeGNiX2Nvbm5lY3Rpb25fdCogY29ubmVjdGlvbiwgeGNiX3Zpc3VhbGlkX3QgdmlzdWFsX2lkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKCBwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgY29ubmVjdGlvbiwgdmlzdWFsX2lkICk7CisgICAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgVmtCb29sMzIgdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBEaXNwbGF5KiBkcHksIFZpc3VhbElEIHZpc3VhbElEICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggcGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGRweSwgdmlzdWFsSUQgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWExJQl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgIFZrUmVzdWx0IHZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5KiBkcHksIFJST3V0cHV0IHJyT3V0cHV0LCBWa0Rpc3BsYXlLSFIqIHBEaXNwbGF5ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKCBwaHlzaWNhbERldmljZSwgZHB5LCByck91dHB1dCwgcERpc3BsYXkgKTsKKyAgICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUKi8KKworICAgIFZrUmVzdWx0IHZrUmVsZWFzZURpc3BsYXlFWFQoIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5ICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrUmVsZWFzZURpc3BsYXlFWFQoIHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5ICk7CisgICAgfQorCisgICAgdm9pZCB2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViggVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3QqIHBDaGVja3BvaW50RGF0YUNvdW50LCBWa0NoZWNrcG9pbnREYXRhTlYqIHBDaGVja3BvaW50RGF0YSApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViggcXVldWUsIHBDaGVja3BvaW50RGF0YUNvdW50LCBwQ2hlY2twb2ludERhdGEgKTsKKyAgICB9CisKKyAgICB2b2lkIHZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCBxdWV1ZSwgcExhYmVsSW5mbyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrUXVldWVCaW5kU3BhcnNlKCBWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiBwQmluZEluZm8sIFZrRmVuY2UgZmVuY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtRdWV1ZUJpbmRTcGFyc2UoIHF1ZXVlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm8sIGZlbmNlICk7CisgICAgfQorCisgICAgdm9pZCB2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKCBWa1F1ZXVlIHF1ZXVlICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiA6OnZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoIHF1ZXVlICk7CisgICAgfQorCisgICAgdm9pZCB2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCBWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCBxdWV1ZSwgcExhYmVsSW5mbyApOworICAgIH0KKworICAgIFZrUmVzdWx0IHZrUXVldWVQcmVzZW50S0hSKCBWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiBwUHJlc2VudEluZm8gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtRdWV1ZVByZXNlbnRLSFIoIHF1ZXVlLCBwUHJlc2VudEluZm8gKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIFZrUXVldWUgcXVldWUsIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uZmlndXJhdGlvbiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gOjp2a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIHF1ZXVlLCBjb25maWd1cmF0aW9uICk7CisgICAgfQorCisgICAgVmtSZXN1bHQgdmtRdWV1ZVN1Ym1pdCggVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyogcFN1Ym1pdHMsIFZrRmVuY2UgZmVuY2UgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtRdWV1ZVN1Ym1pdCggcXVldWUsIHN1Ym1pdENvdW50LCBwU3VibWl0cywgZmVuY2UgKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCB2a1F1ZXVlV2FpdElkbGUoIFZrUXVldWUgcXVldWUgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIDo6dmtRdWV1ZVdhaXRJZGxlKCBxdWV1ZSApOworICAgIH0KKyAgfTsKKyNlbmRpZgorCisgIGNsYXNzIERpc3BhdGNoTG9hZGVyRHluYW1pYzsKKyNpZiAhZGVmaW5lZChWVUxLQU5fSFBQX0RJU1BBVENIX0xPQURFUl9EWU5BTUlDKQorIyBpZiBkZWZpbmVkKFZLX05PX1BST1RPVFlQRVMpCisjICBkZWZpbmUgVlVMS0FOX0hQUF9ESVNQQVRDSF9MT0FERVJfRFlOQU1JQyAxCisjIGVsc2UKKyMgIGRlZmluZSBWVUxLQU5fSFBQX0RJU1BBVENIX0xPQURFUl9EWU5BTUlDIDAKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIpCisjIGlmIFZVTEtBTl9IUFBfRElTUEFUQ0hfTE9BREVSX0RZTkFNSUMgPT0gMQorIyAgZGVmaW5lIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSIDo6VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OmRlZmF1bHREaXNwYXRjaExvYWRlckR5bmFtaWMKKyMgIGRlZmluZSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hfTE9BREVSX0RZTkFNSUNfU1RPUkFHRSBuYW1lc3BhY2UgVlVMS0FOX0hQUF9OQU1FU1BBQ0UgeyBEaXNwYXRjaExvYWRlckR5bmFtaWMgZGVmYXVsdERpc3BhdGNoTG9hZGVyRHluYW1pYzsgfQorICBleHRlcm4gRGlzcGF0Y2hMb2FkZXJEeW5hbWljIGRlZmF1bHREaXNwYXRjaExvYWRlckR5bmFtaWM7CisjIGVsc2UKKyMgIGRlZmluZSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiA6OlZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwYXRjaExvYWRlclN0YXRpYygpCisjICBkZWZpbmUgVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIX0xPQURFUl9EWU5BTUlDX1NUT1JBR0UKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRSkKKyMgaWYgVlVMS0FOX0hQUF9ESVNQQVRDSF9MT0FERVJfRFlOQU1JQyA9PSAxCisgICNkZWZpbmUgVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRSA6OlZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwYXRjaExvYWRlckR5bmFtaWMKKyMgZWxzZQorIyAgZGVmaW5lIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEUgOjpWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGF0Y2hMb2FkZXJTdGF0aWMKKyMgZW5kaWYKKyNlbmRpZgorCisgIHN0cnVjdCBBbGxvY2F0aW9uQ2FsbGJhY2tzOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPd25lclR5cGUsIHR5cGVuYW1lIERpc3BhdGNoPgorICBjbGFzcyBPYmplY3REZXN0cm95CisgIHsKKyAgICBwdWJsaWM6CisgICAgICBPYmplY3REZXN0cm95KCkKKyAgICAgICAgOiBtX293bmVyKCkKKyAgICAgICAgLCBtX2FsbG9jYXRpb25DYWxsYmFja3MoIG51bGxwdHIgKQorICAgICAgICAsIG1fZGlzcGF0Y2goIG51bGxwdHIgKQorICAgICAge30KKworICAgICAgT2JqZWN0RGVzdHJveSggT3duZXJUeXBlIG93bmVyLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0aW9uQ2FsbGJhY2tzLCBEaXNwYXRjaCBjb25zdCAmZGlzcGF0Y2ggKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICAgIDogbV9vd25lciggb3duZXIgKQorICAgICAgICAsIG1fYWxsb2NhdGlvbkNhbGxiYWNrcyggYWxsb2NhdGlvbkNhbGxiYWNrcyApCisgICAgICAgICwgbV9kaXNwYXRjaCggJmRpc3BhdGNoICkKKyAgICAgIHt9CisKKyAgICAgIE93bmVyVHlwZSBnZXRPd25lcigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQgeyByZXR1cm4gbV9vd25lcjsgfQorICAgICAgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gZ2V0QWxsb2NhdG9yKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IHJldHVybiBtX2FsbG9jYXRpb25DYWxsYmFja3M7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgdm9pZCBkZXN0cm95KFQgdCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgeworICAgICAgICBhc3NlcnQoIG1fb3duZXIgJiYgbV9kaXNwYXRjaCApOworICAgICAgICBtX293bmVyLmRlc3Ryb3koIHQsIG1fYWxsb2NhdGlvbkNhbGxiYWNrcywgKm1fZGlzcGF0Y2ggKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBPd25lclR5cGUgbV9vd25lcjsKKyAgICAgIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IG1fYWxsb2NhdGlvbkNhbGxiYWNrczsKKyAgICAgIERpc3BhdGNoIGNvbnN0KiBtX2Rpc3BhdGNoOworICB9OworCisgIGNsYXNzIE5vUGFyZW50OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgY2xhc3MgT2JqZWN0RGVzdHJveTxOb1BhcmVudCxEaXNwYXRjaD4KKyAgeworICAgIHB1YmxpYzoKKyAgICAgIE9iamVjdERlc3Ryb3koKQorICAgICAgICA6IG1fYWxsb2NhdGlvbkNhbGxiYWNrcyggbnVsbHB0ciApCisgICAgICAgICwgbV9kaXNwYXRjaCggbnVsbHB0ciApCisgICAgICB7fQorCisgICAgICBPYmplY3REZXN0cm95KCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0aW9uQ2FsbGJhY2tzLCBEaXNwYXRjaCBjb25zdCAmZGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgICAgOiBtX2FsbG9jYXRpb25DYWxsYmFja3MoIGFsbG9jYXRpb25DYWxsYmFja3MgKQorICAgICAgICAsIG1fZGlzcGF0Y2goICZkaXNwYXRjaCApCisgICAgICB7fQorCisgICAgICBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBnZXRBbGxvY2F0b3IoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUIHsgcmV0dXJuIG1fYWxsb2NhdGlvbkNhbGxiYWNrczsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICB2b2lkIGRlc3Ryb3koVCB0KSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIGFzc2VydCggbV9kaXNwYXRjaCApOworICAgICAgICB0LmRlc3Ryb3koIG1fYWxsb2NhdGlvbkNhbGxiYWNrcywgKm1fZGlzcGF0Y2ggKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBtX2FsbG9jYXRpb25DYWxsYmFja3M7CisgICAgICBEaXNwYXRjaCBjb25zdCogbV9kaXNwYXRjaDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3duZXJUeXBlLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgY2xhc3MgT2JqZWN0RnJlZQorICB7CisgICAgcHVibGljOgorICAgICAgT2JqZWN0RnJlZSgpCisgICAgICAgIDogbV9vd25lcigpCisgICAgICAgICwgbV9hbGxvY2F0aW9uQ2FsbGJhY2tzKCBudWxscHRyICkKKyAgICAgICAgLCBtX2Rpc3BhdGNoKCBudWxscHRyICkKKyAgICAgIHt9CisKKyAgICAgIE9iamVjdEZyZWUoIE93bmVyVHlwZSBvd25lciwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdGlvbkNhbGxiYWNrcywgRGlzcGF0Y2ggY29uc3QgJmRpc3BhdGNoICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgICA6IG1fb3duZXIoIG93bmVyICkKKyAgICAgICAgLCBtX2FsbG9jYXRpb25DYWxsYmFja3MoIGFsbG9jYXRpb25DYWxsYmFja3MgKQorICAgICAgICAsIG1fZGlzcGF0Y2goICZkaXNwYXRjaCApCisgICAgICB7fQorCisgICAgICBPd25lclR5cGUgZ2V0T3duZXIoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUIHsgcmV0dXJuIG1fb3duZXI7IH0KKyAgICAgIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGdldEFsbG9jYXRvcigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQgeyByZXR1cm4gbV9hbGxvY2F0aW9uQ2FsbGJhY2tzOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgIHZvaWQgZGVzdHJveShUIHQpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgYXNzZXJ0KCBtX293bmVyICYmIG1fZGlzcGF0Y2ggKTsKKyAgICAgICAgbV9vd25lci5mcmVlKCB0LCBtX2FsbG9jYXRpb25DYWxsYmFja3MsICptX2Rpc3BhdGNoICk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgT3duZXJUeXBlIG1fb3duZXI7CisgICAgICBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBtX2FsbG9jYXRpb25DYWxsYmFja3M7CisgICAgICBEaXNwYXRjaCBjb25zdCogbV9kaXNwYXRjaDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3duZXJUeXBlLCB0eXBlbmFtZSBQb29sVHlwZSwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIGNsYXNzIFBvb2xGcmVlCisgIHsKKyAgICBwdWJsaWM6CisgICAgICBQb29sRnJlZSggT3duZXJUeXBlIG93bmVyID0gT3duZXJUeXBlKCksIFBvb2xUeXBlIHBvb2wgPSBQb29sVHlwZSgpLCBEaXNwYXRjaCBjb25zdCAmZGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgICAgOiBtX293bmVyKCBvd25lciApCisgICAgICAgICwgbV9wb29sKCBwb29sICkKKyAgICAgICAgLCBtX2Rpc3BhdGNoKCAmZGlzcGF0Y2ggKQorICAgICAge30KKworICAgICAgT3duZXJUeXBlIGdldE93bmVyKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IHJldHVybiBtX293bmVyOyB9CisgICAgICBQb29sVHlwZSBnZXRQb29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IHJldHVybiBtX3Bvb2w7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgdm9pZCBkZXN0cm95KFQgdCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgeworICAgICAgICBtX293bmVyLmZyZWUoIG1fcG9vbCwgdCwgKm1fZGlzcGF0Y2ggKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBPd25lclR5cGUgbV9vd25lcjsKKyAgICAgIFBvb2xUeXBlIG1fcG9vbDsKKyAgICAgIERpc3BhdGNoIGNvbnN0KiBtX2Rpc3BhdGNoOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTiwgc2l6ZV90IEk+CisgIGNsYXNzIENvbnN0RXhwcmVzc2lvbkFycmF5Q29weQorICB7CisgICAgcHVibGljOgorICAgICAgVlVMS0FOX0hQUF9DT05TVEVYUFJfMTQgc3RhdGljIHZvaWQgY29weShUIGRzdFtOXSwgc3RkOjphcnJheTxULE4+IGNvbnN0JiBzcmMpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgZHN0W0ktMV0gPSBzcmNbSS0xXTsKKyAgICAgICAgQ29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PFQsIE4sIEkgLSAxPjo6Y29weShkc3QsIHNyYyk7CisgICAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorICBjbGFzcyBDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8VCwgTiwgMD4KKyAgeworICAgIHB1YmxpYzoKKyAgICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSXzE0IHN0YXRpYyB2b2lkIGNvcHkoVCAvKmRzdCovW05dLCBzdGQ6OmFycmF5PFQsTj4gY29uc3QmIC8qc3JjKi8pIFZVTEtBTl9IUFBfTk9FWENFUFQge30KKyAgfTsKKworICB1c2luZyBCb29sMzIgPSB1aW50MzJfdDsKKyAgdXNpbmcgRGV2aWNlQWRkcmVzcyA9IHVpbnQ2NF90OworICB1c2luZyBEZXZpY2VTaXplID0gdWludDY0X3Q7CisgIHVzaW5nIFNhbXBsZU1hc2sgPSB1aW50MzJfdDsKKworICBlbnVtIGNsYXNzIEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOVgorICB7CisgICAgZU9iamVjdCA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX09CSkVDVF9OViwKKyAgICBlQnVpbGRTY3JhdGNoID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfQlVJTERfU0NSQVRDSF9OViwKKyAgICBlVXBkYXRlU2NyYXRjaCA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX1VQREFURV9TQ1JBVENIX05WCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlYgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzVHlwZU5WOjplT2JqZWN0IDogcmV0dXJuICJPYmplY3QiOworICAgICAgY2FzZSBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlY6OmVCdWlsZFNjcmF0Y2ggOiByZXR1cm4gIkJ1aWxkU2NyYXRjaCI7CisgICAgICBjYXNlIEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOVjo6ZVVwZGF0ZVNjcmF0Y2ggOiByZXR1cm4gIlVwZGF0ZVNjcmF0Y2giOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEFjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOVgorICB7CisgICAgZVRvcExldmVsID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX1RPUF9MRVZFTF9OViwKKyAgICBlQm90dG9tTGV2ZWwgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlYgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WOjplVG9wTGV2ZWwgOiByZXR1cm4gIlRvcExldmVsIjsKKyAgICAgIGNhc2UgQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WOjplQm90dG9tTGV2ZWwgOiByZXR1cm4gIkJvdHRvbUxldmVsIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBBdHRhY2htZW50TG9hZE9wCisgIHsKKyAgICBlTG9hZCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FELAorICAgIGVDbGVhciA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwKKyAgICBlRG9udENhcmUgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBBdHRhY2htZW50TG9hZE9wIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEF0dGFjaG1lbnRMb2FkT3A6OmVMb2FkIDogcmV0dXJuICJMb2FkIjsKKyAgICAgIGNhc2UgQXR0YWNobWVudExvYWRPcDo6ZUNsZWFyIDogcmV0dXJuICJDbGVhciI7CisgICAgICBjYXNlIEF0dGFjaG1lbnRMb2FkT3A6OmVEb250Q2FyZSA6IHJldHVybiAiRG9udENhcmUiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEF0dGFjaG1lbnRTdG9yZU9wCisgIHsKKyAgICBlU3RvcmUgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFLAorICAgIGVEb250Q2FyZSA9IFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBBdHRhY2htZW50U3RvcmVPcCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBBdHRhY2htZW50U3RvcmVPcDo6ZVN0b3JlIDogcmV0dXJuICJTdG9yZSI7CisgICAgICBjYXNlIEF0dGFjaG1lbnRTdG9yZU9wOjplRG9udENhcmUgOiByZXR1cm4gIkRvbnRDYXJlIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBCbGVuZEZhY3RvcgorICB7CisgICAgZVplcm8gPSBWS19CTEVORF9GQUNUT1JfWkVSTywKKyAgICBlT25lID0gVktfQkxFTkRfRkFDVE9SX09ORSwKKyAgICBlU3JjQ29sb3IgPSBWS19CTEVORF9GQUNUT1JfU1JDX0NPTE9SLAorICAgIGVPbmVNaW51c1NyY0NvbG9yID0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkNfQ09MT1IsCisgICAgZURzdENvbG9yID0gVktfQkxFTkRfRkFDVE9SX0RTVF9DT0xPUiwKKyAgICBlT25lTWludXNEc3RDb2xvciA9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfRFNUX0NPTE9SLAorICAgIGVTcmNBbHBoYSA9IFZLX0JMRU5EX0ZBQ1RPUl9TUkNfQUxQSEEsCisgICAgZU9uZU1pbnVzU3JjQWxwaGEgPSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQ19BTFBIQSwKKyAgICBlRHN0QWxwaGEgPSBWS19CTEVORF9GQUNUT1JfRFNUX0FMUEhBLAorICAgIGVPbmVNaW51c0RzdEFscGhhID0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19EU1RfQUxQSEEsCisgICAgZUNvbnN0YW50Q29sb3IgPSBWS19CTEVORF9GQUNUT1JfQ09OU1RBTlRfQ09MT1IsCisgICAgZU9uZU1pbnVzQ29uc3RhbnRDb2xvciA9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IsCisgICAgZUNvbnN0YW50QWxwaGEgPSBWS19CTEVORF9GQUNUT1JfQ09OU1RBTlRfQUxQSEEsCisgICAgZU9uZU1pbnVzQ29uc3RhbnRBbHBoYSA9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEsCisgICAgZVNyY0FscGhhU2F0dXJhdGUgPSBWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBX1NBVFVSQVRFLAorICAgIGVTcmMxQ29sb3IgPSBWS19CTEVORF9GQUNUT1JfU1JDMV9DT0xPUiwKKyAgICBlT25lTWludXNTcmMxQ29sb3IgPSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQ09MT1IsCisgICAgZVNyYzFBbHBoYSA9IFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0FMUEhBLAorICAgIGVPbmVNaW51c1NyYzFBbHBoYSA9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9BTFBIQQorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQmxlbmRGYWN0b3IgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVaZXJvIDogcmV0dXJuICJaZXJvIjsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVPbmUgOiByZXR1cm4gIk9uZSI7CisgICAgICBjYXNlIEJsZW5kRmFjdG9yOjplU3JjQ29sb3IgOiByZXR1cm4gIlNyY0NvbG9yIjsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVPbmVNaW51c1NyY0NvbG9yIDogcmV0dXJuICJPbmVNaW51c1NyY0NvbG9yIjsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVEc3RDb2xvciA6IHJldHVybiAiRHN0Q29sb3IiOworICAgICAgY2FzZSBCbGVuZEZhY3Rvcjo6ZU9uZU1pbnVzRHN0Q29sb3IgOiByZXR1cm4gIk9uZU1pbnVzRHN0Q29sb3IiOworICAgICAgY2FzZSBCbGVuZEZhY3Rvcjo6ZVNyY0FscGhhIDogcmV0dXJuICJTcmNBbHBoYSI7CisgICAgICBjYXNlIEJsZW5kRmFjdG9yOjplT25lTWludXNTcmNBbHBoYSA6IHJldHVybiAiT25lTWludXNTcmNBbHBoYSI7CisgICAgICBjYXNlIEJsZW5kRmFjdG9yOjplRHN0QWxwaGEgOiByZXR1cm4gIkRzdEFscGhhIjsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVPbmVNaW51c0RzdEFscGhhIDogcmV0dXJuICJPbmVNaW51c0RzdEFscGhhIjsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVDb25zdGFudENvbG9yIDogcmV0dXJuICJDb25zdGFudENvbG9yIjsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVPbmVNaW51c0NvbnN0YW50Q29sb3IgOiByZXR1cm4gIk9uZU1pbnVzQ29uc3RhbnRDb2xvciI7CisgICAgICBjYXNlIEJsZW5kRmFjdG9yOjplQ29uc3RhbnRBbHBoYSA6IHJldHVybiAiQ29uc3RhbnRBbHBoYSI7CisgICAgICBjYXNlIEJsZW5kRmFjdG9yOjplT25lTWludXNDb25zdGFudEFscGhhIDogcmV0dXJuICJPbmVNaW51c0NvbnN0YW50QWxwaGEiOworICAgICAgY2FzZSBCbGVuZEZhY3Rvcjo6ZVNyY0FscGhhU2F0dXJhdGUgOiByZXR1cm4gIlNyY0FscGhhU2F0dXJhdGUiOworICAgICAgY2FzZSBCbGVuZEZhY3Rvcjo6ZVNyYzFDb2xvciA6IHJldHVybiAiU3JjMUNvbG9yIjsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVPbmVNaW51c1NyYzFDb2xvciA6IHJldHVybiAiT25lTWludXNTcmMxQ29sb3IiOworICAgICAgY2FzZSBCbGVuZEZhY3Rvcjo6ZVNyYzFBbHBoYSA6IHJldHVybiAiU3JjMUFscGhhIjsKKyAgICAgIGNhc2UgQmxlbmRGYWN0b3I6OmVPbmVNaW51c1NyYzFBbHBoYSA6IHJldHVybiAiT25lTWludXNTcmMxQWxwaGEiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEJsZW5kT3AKKyAgeworICAgIGVBZGQgPSBWS19CTEVORF9PUF9BREQsCisgICAgZVN1YnRyYWN0ID0gVktfQkxFTkRfT1BfU1VCVFJBQ1QsCisgICAgZVJldmVyc2VTdWJ0cmFjdCA9IFZLX0JMRU5EX09QX1JFVkVSU0VfU1VCVFJBQ1QsCisgICAgZU1pbiA9IFZLX0JMRU5EX09QX01JTiwKKyAgICBlTWF4ID0gVktfQkxFTkRfT1BfTUFYLAorICAgIGVaZXJvRVhUID0gVktfQkxFTkRfT1BfWkVST19FWFQsCisgICAgZVNyY0VYVCA9IFZLX0JMRU5EX09QX1NSQ19FWFQsCisgICAgZURzdEVYVCA9IFZLX0JMRU5EX09QX0RTVF9FWFQsCisgICAgZVNyY092ZXJFWFQgPSBWS19CTEVORF9PUF9TUkNfT1ZFUl9FWFQsCisgICAgZURzdE92ZXJFWFQgPSBWS19CTEVORF9PUF9EU1RfT1ZFUl9FWFQsCisgICAgZVNyY0luRVhUID0gVktfQkxFTkRfT1BfU1JDX0lOX0VYVCwKKyAgICBlRHN0SW5FWFQgPSBWS19CTEVORF9PUF9EU1RfSU5fRVhULAorICAgIGVTcmNPdXRFWFQgPSBWS19CTEVORF9PUF9TUkNfT1VUX0VYVCwKKyAgICBlRHN0T3V0RVhUID0gVktfQkxFTkRfT1BfRFNUX09VVF9FWFQsCisgICAgZVNyY0F0b3BFWFQgPSBWS19CTEVORF9PUF9TUkNfQVRPUF9FWFQsCisgICAgZURzdEF0b3BFWFQgPSBWS19CTEVORF9PUF9EU1RfQVRPUF9FWFQsCisgICAgZVhvckVYVCA9IFZLX0JMRU5EX09QX1hPUl9FWFQsCisgICAgZU11bHRpcGx5RVhUID0gVktfQkxFTkRfT1BfTVVMVElQTFlfRVhULAorICAgIGVTY3JlZW5FWFQgPSBWS19CTEVORF9PUF9TQ1JFRU5fRVhULAorICAgIGVPdmVybGF5RVhUID0gVktfQkxFTkRfT1BfT1ZFUkxBWV9FWFQsCisgICAgZURhcmtlbkVYVCA9IFZLX0JMRU5EX09QX0RBUktFTl9FWFQsCisgICAgZUxpZ2h0ZW5FWFQgPSBWS19CTEVORF9PUF9MSUdIVEVOX0VYVCwKKyAgICBlQ29sb3Jkb2RnZUVYVCA9IFZLX0JMRU5EX09QX0NPTE9SRE9ER0VfRVhULAorICAgIGVDb2xvcmJ1cm5FWFQgPSBWS19CTEVORF9PUF9DT0xPUkJVUk5fRVhULAorICAgIGVIYXJkbGlnaHRFWFQgPSBWS19CTEVORF9PUF9IQVJETElHSFRfRVhULAorICAgIGVTb2Z0bGlnaHRFWFQgPSBWS19CTEVORF9PUF9TT0ZUTElHSFRfRVhULAorICAgIGVEaWZmZXJlbmNlRVhUID0gVktfQkxFTkRfT1BfRElGRkVSRU5DRV9FWFQsCisgICAgZUV4Y2x1c2lvbkVYVCA9IFZLX0JMRU5EX09QX0VYQ0xVU0lPTl9FWFQsCisgICAgZUludmVydEVYVCA9IFZLX0JMRU5EX09QX0lOVkVSVF9FWFQsCisgICAgZUludmVydFJnYkVYVCA9IFZLX0JMRU5EX09QX0lOVkVSVF9SR0JfRVhULAorICAgIGVMaW5lYXJkb2RnZUVYVCA9IFZLX0JMRU5EX09QX0xJTkVBUkRPREdFX0VYVCwKKyAgICBlTGluZWFyYnVybkVYVCA9IFZLX0JMRU5EX09QX0xJTkVBUkJVUk5fRVhULAorICAgIGVWaXZpZGxpZ2h0RVhUID0gVktfQkxFTkRfT1BfVklWSURMSUdIVF9FWFQsCisgICAgZUxpbmVhcmxpZ2h0RVhUID0gVktfQkxFTkRfT1BfTElORUFSTElHSFRfRVhULAorICAgIGVQaW5saWdodEVYVCA9IFZLX0JMRU5EX09QX1BJTkxJR0hUX0VYVCwKKyAgICBlSGFyZG1peEVYVCA9IFZLX0JMRU5EX09QX0hBUkRNSVhfRVhULAorICAgIGVIc2xIdWVFWFQgPSBWS19CTEVORF9PUF9IU0xfSFVFX0VYVCwKKyAgICBlSHNsU2F0dXJhdGlvbkVYVCA9IFZLX0JMRU5EX09QX0hTTF9TQVRVUkFUSU9OX0VYVCwKKyAgICBlSHNsQ29sb3JFWFQgPSBWS19CTEVORF9PUF9IU0xfQ09MT1JfRVhULAorICAgIGVIc2xMdW1pbm9zaXR5RVhUID0gVktfQkxFTkRfT1BfSFNMX0xVTUlOT1NJVFlfRVhULAorICAgIGVQbHVzRVhUID0gVktfQkxFTkRfT1BfUExVU19FWFQsCisgICAgZVBsdXNDbGFtcGVkRVhUID0gVktfQkxFTkRfT1BfUExVU19DTEFNUEVEX0VYVCwKKyAgICBlUGx1c0NsYW1wZWRBbHBoYUVYVCA9IFZLX0JMRU5EX09QX1BMVVNfQ0xBTVBFRF9BTFBIQV9FWFQsCisgICAgZVBsdXNEYXJrZXJFWFQgPSBWS19CTEVORF9PUF9QTFVTX0RBUktFUl9FWFQsCisgICAgZU1pbnVzRVhUID0gVktfQkxFTkRfT1BfTUlOVVNfRVhULAorICAgIGVNaW51c0NsYW1wZWRFWFQgPSBWS19CTEVORF9PUF9NSU5VU19DTEFNUEVEX0VYVCwKKyAgICBlQ29udHJhc3RFWFQgPSBWS19CTEVORF9PUF9DT05UUkFTVF9FWFQsCisgICAgZUludmVydE92Z0VYVCA9IFZLX0JMRU5EX09QX0lOVkVSVF9PVkdfRVhULAorICAgIGVSZWRFWFQgPSBWS19CTEVORF9PUF9SRURfRVhULAorICAgIGVHcmVlbkVYVCA9IFZLX0JMRU5EX09QX0dSRUVOX0VYVCwKKyAgICBlQmx1ZUVYVCA9IFZLX0JMRU5EX09QX0JMVUVfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBCbGVuZE9wIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEJsZW5kT3A6OmVBZGQgOiByZXR1cm4gIkFkZCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVTdWJ0cmFjdCA6IHJldHVybiAiU3VidHJhY3QiOworICAgICAgY2FzZSBCbGVuZE9wOjplUmV2ZXJzZVN1YnRyYWN0IDogcmV0dXJuICJSZXZlcnNlU3VidHJhY3QiOworICAgICAgY2FzZSBCbGVuZE9wOjplTWluIDogcmV0dXJuICJNaW4iOworICAgICAgY2FzZSBCbGVuZE9wOjplTWF4IDogcmV0dXJuICJNYXgiOworICAgICAgY2FzZSBCbGVuZE9wOjplWmVyb0VYVCA6IHJldHVybiAiWmVyb0VYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVTcmNFWFQgOiByZXR1cm4gIlNyY0VYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVEc3RFWFQgOiByZXR1cm4gIkRzdEVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVTcmNPdmVyRVhUIDogcmV0dXJuICJTcmNPdmVyRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZURzdE92ZXJFWFQgOiByZXR1cm4gIkRzdE92ZXJFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplU3JjSW5FWFQgOiByZXR1cm4gIlNyY0luRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZURzdEluRVhUIDogcmV0dXJuICJEc3RJbkVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVTcmNPdXRFWFQgOiByZXR1cm4gIlNyY091dEVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVEc3RPdXRFWFQgOiByZXR1cm4gIkRzdE91dEVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVTcmNBdG9wRVhUIDogcmV0dXJuICJTcmNBdG9wRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZURzdEF0b3BFWFQgOiByZXR1cm4gIkRzdEF0b3BFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplWG9yRVhUIDogcmV0dXJuICJYb3JFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplTXVsdGlwbHlFWFQgOiByZXR1cm4gIk11bHRpcGx5RVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZVNjcmVlbkVYVCA6IHJldHVybiAiU2NyZWVuRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZU92ZXJsYXlFWFQgOiByZXR1cm4gIk92ZXJsYXlFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplRGFya2VuRVhUIDogcmV0dXJuICJEYXJrZW5FWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplTGlnaHRlbkVYVCA6IHJldHVybiAiTGlnaHRlbkVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVDb2xvcmRvZGdlRVhUIDogcmV0dXJuICJDb2xvcmRvZGdlRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZUNvbG9yYnVybkVYVCA6IHJldHVybiAiQ29sb3JidXJuRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZUhhcmRsaWdodEVYVCA6IHJldHVybiAiSGFyZGxpZ2h0RVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZVNvZnRsaWdodEVYVCA6IHJldHVybiAiU29mdGxpZ2h0RVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZURpZmZlcmVuY2VFWFQgOiByZXR1cm4gIkRpZmZlcmVuY2VFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplRXhjbHVzaW9uRVhUIDogcmV0dXJuICJFeGNsdXNpb25FWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplSW52ZXJ0RVhUIDogcmV0dXJuICJJbnZlcnRFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplSW52ZXJ0UmdiRVhUIDogcmV0dXJuICJJbnZlcnRSZ2JFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplTGluZWFyZG9kZ2VFWFQgOiByZXR1cm4gIkxpbmVhcmRvZGdlRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZUxpbmVhcmJ1cm5FWFQgOiByZXR1cm4gIkxpbmVhcmJ1cm5FWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplVml2aWRsaWdodEVYVCA6IHJldHVybiAiVml2aWRsaWdodEVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVMaW5lYXJsaWdodEVYVCA6IHJldHVybiAiTGluZWFybGlnaHRFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplUGlubGlnaHRFWFQgOiByZXR1cm4gIlBpbmxpZ2h0RVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZUhhcmRtaXhFWFQgOiByZXR1cm4gIkhhcmRtaXhFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplSHNsSHVlRVhUIDogcmV0dXJuICJIc2xIdWVFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplSHNsU2F0dXJhdGlvbkVYVCA6IHJldHVybiAiSHNsU2F0dXJhdGlvbkVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVIc2xDb2xvckVYVCA6IHJldHVybiAiSHNsQ29sb3JFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplSHNsTHVtaW5vc2l0eUVYVCA6IHJldHVybiAiSHNsTHVtaW5vc2l0eUVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVQbHVzRVhUIDogcmV0dXJuICJQbHVzRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZVBsdXNDbGFtcGVkRVhUIDogcmV0dXJuICJQbHVzQ2xhbXBlZEVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVQbHVzQ2xhbXBlZEFscGhhRVhUIDogcmV0dXJuICJQbHVzQ2xhbXBlZEFscGhhRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZVBsdXNEYXJrZXJFWFQgOiByZXR1cm4gIlBsdXNEYXJrZXJFWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplTWludXNFWFQgOiByZXR1cm4gIk1pbnVzRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZU1pbnVzQ2xhbXBlZEVYVCA6IHJldHVybiAiTWludXNDbGFtcGVkRVhUIjsKKyAgICAgIGNhc2UgQmxlbmRPcDo6ZUNvbnRyYXN0RVhUIDogcmV0dXJuICJDb250cmFzdEVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVJbnZlcnRPdmdFWFQgOiByZXR1cm4gIkludmVydE92Z0VYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVSZWRFWFQgOiByZXR1cm4gIlJlZEVYVCI7CisgICAgICBjYXNlIEJsZW5kT3A6OmVHcmVlbkVYVCA6IHJldHVybiAiR3JlZW5FWFQiOworICAgICAgY2FzZSBCbGVuZE9wOjplQmx1ZUVYVCA6IHJldHVybiAiQmx1ZUVYVCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgQmxlbmRPdmVybGFwRVhUCisgIHsKKyAgICBlVW5jb3JyZWxhdGVkID0gVktfQkxFTkRfT1ZFUkxBUF9VTkNPUlJFTEFURURfRVhULAorICAgIGVEaXNqb2ludCA9IFZLX0JMRU5EX09WRVJMQVBfRElTSk9JTlRfRVhULAorICAgIGVDb25qb2ludCA9IFZLX0JMRU5EX09WRVJMQVBfQ09OSk9JTlRfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBCbGVuZE92ZXJsYXBFWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQmxlbmRPdmVybGFwRVhUOjplVW5jb3JyZWxhdGVkIDogcmV0dXJuICJVbmNvcnJlbGF0ZWQiOworICAgICAgY2FzZSBCbGVuZE92ZXJsYXBFWFQ6OmVEaXNqb2ludCA6IHJldHVybiAiRGlzam9pbnQiOworICAgICAgY2FzZSBCbGVuZE92ZXJsYXBFWFQ6OmVDb25qb2ludCA6IHJldHVybiAiQ29uam9pbnQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEJvcmRlckNvbG9yCisgIHsKKyAgICBlRmxvYXRUcmFuc3BhcmVudEJsYWNrID0gVktfQk9SREVSX0NPTE9SX0ZMT0FUX1RSQU5TUEFSRU5UX0JMQUNLLAorICAgIGVJbnRUcmFuc3BhcmVudEJsYWNrID0gVktfQk9SREVSX0NPTE9SX0lOVF9UUkFOU1BBUkVOVF9CTEFDSywKKyAgICBlRmxvYXRPcGFxdWVCbGFjayA9IFZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfQkxBQ0ssCisgICAgZUludE9wYXF1ZUJsYWNrID0gVktfQk9SREVSX0NPTE9SX0lOVF9PUEFRVUVfQkxBQ0ssCisgICAgZUZsb2F0T3BhcXVlV2hpdGUgPSBWS19CT1JERVJfQ09MT1JfRkxPQVRfT1BBUVVFX1dISVRFLAorICAgIGVJbnRPcGFxdWVXaGl0ZSA9IFZLX0JPUkRFUl9DT0xPUl9JTlRfT1BBUVVFX1dISVRFCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBCb3JkZXJDb2xvciB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBCb3JkZXJDb2xvcjo6ZUZsb2F0VHJhbnNwYXJlbnRCbGFjayA6IHJldHVybiAiRmxvYXRUcmFuc3BhcmVudEJsYWNrIjsKKyAgICAgIGNhc2UgQm9yZGVyQ29sb3I6OmVJbnRUcmFuc3BhcmVudEJsYWNrIDogcmV0dXJuICJJbnRUcmFuc3BhcmVudEJsYWNrIjsKKyAgICAgIGNhc2UgQm9yZGVyQ29sb3I6OmVGbG9hdE9wYXF1ZUJsYWNrIDogcmV0dXJuICJGbG9hdE9wYXF1ZUJsYWNrIjsKKyAgICAgIGNhc2UgQm9yZGVyQ29sb3I6OmVJbnRPcGFxdWVCbGFjayA6IHJldHVybiAiSW50T3BhcXVlQmxhY2siOworICAgICAgY2FzZSBCb3JkZXJDb2xvcjo6ZUZsb2F0T3BhcXVlV2hpdGUgOiByZXR1cm4gIkZsb2F0T3BhcXVlV2hpdGUiOworICAgICAgY2FzZSBCb3JkZXJDb2xvcjo6ZUludE9wYXF1ZVdoaXRlIDogcmV0dXJuICJJbnRPcGFxdWVXaGl0ZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgQ2hyb21hTG9jYXRpb24KKyAgeworICAgIGVDb3NpdGVkRXZlbiA9IFZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU4sCisgICAgZU1pZHBvaW50ID0gVktfQ0hST01BX0xPQ0FUSU9OX01JRFBPSU5ULAorICAgIGVDb3NpdGVkRXZlbktIUiA9IFZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU5fS0hSLAorICAgIGVNaWRwb2ludEtIUiA9IFZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENocm9tYUxvY2F0aW9uIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIENocm9tYUxvY2F0aW9uOjplQ29zaXRlZEV2ZW4gOiByZXR1cm4gIkNvc2l0ZWRFdmVuIjsKKyAgICAgIGNhc2UgQ2hyb21hTG9jYXRpb246OmVNaWRwb2ludCA6IHJldHVybiAiTWlkcG9pbnQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIENvYXJzZVNhbXBsZU9yZGVyVHlwZU5WCisgIHsKKyAgICBlRGVmYXVsdCA9IFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9ERUZBVUxUX05WLAorICAgIGVDdXN0b20gPSBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfQ1VTVE9NX05WLAorICAgIGVQaXhlbE1ham9yID0gVktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX1BJWEVMX01BSk9SX05WLAorICAgIGVTYW1wbGVNYWpvciA9IFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9TQU1QTEVfTUFKT1JfTlYKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIENvYXJzZVNhbXBsZU9yZGVyVHlwZU5WOjplRGVmYXVsdCA6IHJldHVybiAiRGVmYXVsdCI7CisgICAgICBjYXNlIENvYXJzZVNhbXBsZU9yZGVyVHlwZU5WOjplQ3VzdG9tIDogcmV0dXJuICJDdXN0b20iOworICAgICAgY2FzZSBDb2Fyc2VTYW1wbGVPcmRlclR5cGVOVjo6ZVBpeGVsTWFqb3IgOiByZXR1cm4gIlBpeGVsTWFqb3IiOworICAgICAgY2FzZSBDb2Fyc2VTYW1wbGVPcmRlclR5cGVOVjo6ZVNhbXBsZU1ham9yIDogcmV0dXJuICJTYW1wbGVNYWpvciI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgQ29sb3JTcGFjZUtIUgorICB7CisgICAgZVNyZ2JOb25saW5lYXIgPSBWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFIsCisgICAgZURpc3BsYXlQM05vbmxpbmVhckVYVCA9IFZLX0NPTE9SX1NQQUNFX0RJU1BMQVlfUDNfTk9OTElORUFSX0VYVCwKKyAgICBlRXh0ZW5kZWRTcmdiTGluZWFyRVhUID0gVktfQ09MT1JfU1BBQ0VfRVhURU5ERURfU1JHQl9MSU5FQVJfRVhULAorICAgIGVEaXNwbGF5UDNMaW5lYXJFWFQgPSBWS19DT0xPUl9TUEFDRV9ESVNQTEFZX1AzX0xJTkVBUl9FWFQsCisgICAgZURjaVAzTm9ubGluZWFyRVhUID0gVktfQ09MT1JfU1BBQ0VfRENJX1AzX05PTkxJTkVBUl9FWFQsCisgICAgZUJ0NzA5TGluZWFyRVhUID0gVktfQ09MT1JfU1BBQ0VfQlQ3MDlfTElORUFSX0VYVCwKKyAgICBlQnQ3MDlOb25saW5lYXJFWFQgPSBWS19DT0xPUl9TUEFDRV9CVDcwOV9OT05MSU5FQVJfRVhULAorICAgIGVCdDIwMjBMaW5lYXJFWFQgPSBWS19DT0xPUl9TUEFDRV9CVDIwMjBfTElORUFSX0VYVCwKKyAgICBlSGRyMTBTdDIwODRFWFQgPSBWS19DT0xPUl9TUEFDRV9IRFIxMF9TVDIwODRfRVhULAorICAgIGVEb2xieXZpc2lvbkVYVCA9IFZLX0NPTE9SX1NQQUNFX0RPTEJZVklTSU9OX0VYVCwKKyAgICBlSGRyMTBIbGdFWFQgPSBWS19DT0xPUl9TUEFDRV9IRFIxMF9ITEdfRVhULAorICAgIGVBZG9iZXJnYkxpbmVhckVYVCA9IFZLX0NPTE9SX1NQQUNFX0FET0JFUkdCX0xJTkVBUl9FWFQsCisgICAgZUFkb2JlcmdiTm9ubGluZWFyRVhUID0gVktfQ09MT1JfU1BBQ0VfQURPQkVSR0JfTk9OTElORUFSX0VYVCwKKyAgICBlUGFzc1Rocm91Z2hFWFQgPSBWS19DT0xPUl9TUEFDRV9QQVNTX1RIUk9VR0hfRVhULAorICAgIGVFeHRlbmRlZFNyZ2JOb25saW5lYXJFWFQgPSBWS19DT0xPUl9TUEFDRV9FWFRFTkRFRF9TUkdCX05PTkxJTkVBUl9FWFQsCisgICAgZURpc3BsYXlOYXRpdmVBTUQgPSBWS19DT0xPUl9TUEFDRV9ESVNQTEFZX05BVElWRV9BTUQsCisgICAgZVZrQ29sb3JzcGFjZVNyZ2JOb25saW5lYXIgPSBWS19DT0xPUlNQQUNFX1NSR0JfTk9OTElORUFSX0tIUiwKKyAgICBlRGNpUDNMaW5lYXJFWFQgPSBWS19DT0xPUl9TUEFDRV9EQ0lfUDNfTElORUFSX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ29sb3JTcGFjZUtIUiB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBDb2xvclNwYWNlS0hSOjplU3JnYk5vbmxpbmVhciA6IHJldHVybiAiU3JnYk5vbmxpbmVhciI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVEaXNwbGF5UDNOb25saW5lYXJFWFQgOiByZXR1cm4gIkRpc3BsYXlQM05vbmxpbmVhckVYVCI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVFeHRlbmRlZFNyZ2JMaW5lYXJFWFQgOiByZXR1cm4gIkV4dGVuZGVkU3JnYkxpbmVhckVYVCI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVEaXNwbGF5UDNMaW5lYXJFWFQgOiByZXR1cm4gIkRpc3BsYXlQM0xpbmVhckVYVCI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVEY2lQM05vbmxpbmVhckVYVCA6IHJldHVybiAiRGNpUDNOb25saW5lYXJFWFQiOworICAgICAgY2FzZSBDb2xvclNwYWNlS0hSOjplQnQ3MDlMaW5lYXJFWFQgOiByZXR1cm4gIkJ0NzA5TGluZWFyRVhUIjsKKyAgICAgIGNhc2UgQ29sb3JTcGFjZUtIUjo6ZUJ0NzA5Tm9ubGluZWFyRVhUIDogcmV0dXJuICJCdDcwOU5vbmxpbmVhckVYVCI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVCdDIwMjBMaW5lYXJFWFQgOiByZXR1cm4gIkJ0MjAyMExpbmVhckVYVCI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVIZHIxMFN0MjA4NEVYVCA6IHJldHVybiAiSGRyMTBTdDIwODRFWFQiOworICAgICAgY2FzZSBDb2xvclNwYWNlS0hSOjplRG9sYnl2aXNpb25FWFQgOiByZXR1cm4gIkRvbGJ5dmlzaW9uRVhUIjsKKyAgICAgIGNhc2UgQ29sb3JTcGFjZUtIUjo6ZUhkcjEwSGxnRVhUIDogcmV0dXJuICJIZHIxMEhsZ0VYVCI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVBZG9iZXJnYkxpbmVhckVYVCA6IHJldHVybiAiQWRvYmVyZ2JMaW5lYXJFWFQiOworICAgICAgY2FzZSBDb2xvclNwYWNlS0hSOjplQWRvYmVyZ2JOb25saW5lYXJFWFQgOiByZXR1cm4gIkFkb2JlcmdiTm9ubGluZWFyRVhUIjsKKyAgICAgIGNhc2UgQ29sb3JTcGFjZUtIUjo6ZVBhc3NUaHJvdWdoRVhUIDogcmV0dXJuICJQYXNzVGhyb3VnaEVYVCI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVFeHRlbmRlZFNyZ2JOb25saW5lYXJFWFQgOiByZXR1cm4gIkV4dGVuZGVkU3JnYk5vbmxpbmVhckVYVCI7CisgICAgICBjYXNlIENvbG9yU3BhY2VLSFI6OmVEaXNwbGF5TmF0aXZlQU1EIDogcmV0dXJuICJEaXNwbGF5TmF0aXZlQU1EIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBDb21tYW5kQnVmZmVyTGV2ZWwKKyAgeworICAgIGVQcmltYXJ5ID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSwKKyAgICBlU2Vjb25kYXJ5ID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBDb21tYW5kQnVmZmVyTGV2ZWwgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQ29tbWFuZEJ1ZmZlckxldmVsOjplUHJpbWFyeSA6IHJldHVybiAiUHJpbWFyeSI7CisgICAgICBjYXNlIENvbW1hbmRCdWZmZXJMZXZlbDo6ZVNlY29uZGFyeSA6IHJldHVybiAiU2Vjb25kYXJ5IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBDb21wYXJlT3AKKyAgeworICAgIGVOZXZlciA9IFZLX0NPTVBBUkVfT1BfTkVWRVIsCisgICAgZUxlc3MgPSBWS19DT01QQVJFX09QX0xFU1MsCisgICAgZUVxdWFsID0gVktfQ09NUEFSRV9PUF9FUVVBTCwKKyAgICBlTGVzc09yRXF1YWwgPSBWS19DT01QQVJFX09QX0xFU1NfT1JfRVFVQUwsCisgICAgZUdyZWF0ZXIgPSBWS19DT01QQVJFX09QX0dSRUFURVIsCisgICAgZU5vdEVxdWFsID0gVktfQ09NUEFSRV9PUF9OT1RfRVFVQUwsCisgICAgZUdyZWF0ZXJPckVxdWFsID0gVktfQ09NUEFSRV9PUF9HUkVBVEVSX09SX0VRVUFMLAorICAgIGVBbHdheXMgPSBWS19DT01QQVJFX09QX0FMV0FZUworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ29tcGFyZU9wIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIENvbXBhcmVPcDo6ZU5ldmVyIDogcmV0dXJuICJOZXZlciI7CisgICAgICBjYXNlIENvbXBhcmVPcDo6ZUxlc3MgOiByZXR1cm4gIkxlc3MiOworICAgICAgY2FzZSBDb21wYXJlT3A6OmVFcXVhbCA6IHJldHVybiAiRXF1YWwiOworICAgICAgY2FzZSBDb21wYXJlT3A6OmVMZXNzT3JFcXVhbCA6IHJldHVybiAiTGVzc09yRXF1YWwiOworICAgICAgY2FzZSBDb21wYXJlT3A6OmVHcmVhdGVyIDogcmV0dXJuICJHcmVhdGVyIjsKKyAgICAgIGNhc2UgQ29tcGFyZU9wOjplTm90RXF1YWwgOiByZXR1cm4gIk5vdEVxdWFsIjsKKyAgICAgIGNhc2UgQ29tcGFyZU9wOjplR3JlYXRlck9yRXF1YWwgOiByZXR1cm4gIkdyZWF0ZXJPckVxdWFsIjsKKyAgICAgIGNhc2UgQ29tcGFyZU9wOjplQWx3YXlzIDogcmV0dXJuICJBbHdheXMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIENvbXBvbmVudFN3aXp6bGUKKyAgeworICAgIGVJZGVudGl0eSA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgIGVaZXJvID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfWkVSTywKKyAgICBlT25lID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfT05FLAorICAgIGVSID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfUiwKKyAgICBlRyA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0csCisgICAgZUIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9CLAorICAgIGVBID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQQorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ29tcG9uZW50U3dpenpsZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBDb21wb25lbnRTd2l6emxlOjplSWRlbnRpdHkgOiByZXR1cm4gIklkZW50aXR5IjsKKyAgICAgIGNhc2UgQ29tcG9uZW50U3dpenpsZTo6ZVplcm8gOiByZXR1cm4gIlplcm8iOworICAgICAgY2FzZSBDb21wb25lbnRTd2l6emxlOjplT25lIDogcmV0dXJuICJPbmUiOworICAgICAgY2FzZSBDb21wb25lbnRTd2l6emxlOjplUiA6IHJldHVybiAiUiI7CisgICAgICBjYXNlIENvbXBvbmVudFN3aXp6bGU6OmVHIDogcmV0dXJuICJHIjsKKyAgICAgIGNhc2UgQ29tcG9uZW50U3dpenpsZTo6ZUIgOiByZXR1cm4gIkIiOworICAgICAgY2FzZSBDb21wb25lbnRTd2l6emxlOjplQSA6IHJldHVybiAiQSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgQ29tcG9uZW50VHlwZU5WCisgIHsKKyAgICBlRmxvYXQxNiA9IFZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUMTZfTlYsCisgICAgZUZsb2F0MzIgPSBWS19DT01QT05FTlRfVFlQRV9GTE9BVDMyX05WLAorICAgIGVGbG9hdDY0ID0gVktfQ09NUE9ORU5UX1RZUEVfRkxPQVQ2NF9OViwKKyAgICBlU2ludDggPSBWS19DT01QT05FTlRfVFlQRV9TSU5UOF9OViwKKyAgICBlU2ludDE2ID0gVktfQ09NUE9ORU5UX1RZUEVfU0lOVDE2X05WLAorICAgIGVTaW50MzIgPSBWS19DT01QT05FTlRfVFlQRV9TSU5UMzJfTlYsCisgICAgZVNpbnQ2NCA9IFZLX0NPTVBPTkVOVF9UWVBFX1NJTlQ2NF9OViwKKyAgICBlVWludDggPSBWS19DT01QT05FTlRfVFlQRV9VSU5UOF9OViwKKyAgICBlVWludDE2ID0gVktfQ09NUE9ORU5UX1RZUEVfVUlOVDE2X05WLAorICAgIGVVaW50MzIgPSBWS19DT01QT05FTlRfVFlQRV9VSU5UMzJfTlYsCisgICAgZVVpbnQ2NCA9IFZLX0NPTVBPTkVOVF9UWVBFX1VJTlQ2NF9OVgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ29tcG9uZW50VHlwZU5WIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIENvbXBvbmVudFR5cGVOVjo6ZUZsb2F0MTYgOiByZXR1cm4gIkZsb2F0MTYiOworICAgICAgY2FzZSBDb21wb25lbnRUeXBlTlY6OmVGbG9hdDMyIDogcmV0dXJuICJGbG9hdDMyIjsKKyAgICAgIGNhc2UgQ29tcG9uZW50VHlwZU5WOjplRmxvYXQ2NCA6IHJldHVybiAiRmxvYXQ2NCI7CisgICAgICBjYXNlIENvbXBvbmVudFR5cGVOVjo6ZVNpbnQ4IDogcmV0dXJuICJTaW50OCI7CisgICAgICBjYXNlIENvbXBvbmVudFR5cGVOVjo6ZVNpbnQxNiA6IHJldHVybiAiU2ludDE2IjsKKyAgICAgIGNhc2UgQ29tcG9uZW50VHlwZU5WOjplU2ludDMyIDogcmV0dXJuICJTaW50MzIiOworICAgICAgY2FzZSBDb21wb25lbnRUeXBlTlY6OmVTaW50NjQgOiByZXR1cm4gIlNpbnQ2NCI7CisgICAgICBjYXNlIENvbXBvbmVudFR5cGVOVjo6ZVVpbnQ4IDogcmV0dXJuICJVaW50OCI7CisgICAgICBjYXNlIENvbXBvbmVudFR5cGVOVjo6ZVVpbnQxNiA6IHJldHVybiAiVWludDE2IjsKKyAgICAgIGNhc2UgQ29tcG9uZW50VHlwZU5WOjplVWludDMyIDogcmV0dXJuICJVaW50MzIiOworICAgICAgY2FzZSBDb21wb25lbnRUeXBlTlY6OmVVaW50NjQgOiByZXR1cm4gIlVpbnQ2NCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVFWFQKKyAgeworICAgIGVEaXNhYmxlZCA9IFZLX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX01PREVfRElTQUJMRURfRVhULAorICAgIGVPdmVyZXN0aW1hdGUgPSBWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX09WRVJFU1RJTUFURV9FWFQsCisgICAgZVVuZGVyZXN0aW1hdGUgPSBWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX1VOREVSRVNUSU1BVEVfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVDo6ZURpc2FibGVkIDogcmV0dXJuICJEaXNhYmxlZCI7CisgICAgICBjYXNlIENvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlRVhUOjplT3ZlcmVzdGltYXRlIDogcmV0dXJuICJPdmVyZXN0aW1hdGUiOworICAgICAgY2FzZSBDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVDo6ZVVuZGVyZXN0aW1hdGUgOiByZXR1cm4gIlVuZGVyZXN0aW1hdGUiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYKKyAgeworICAgIGVDbG9uZSA9IFZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NMT05FX05WLAorICAgIGVDb21wYWN0ID0gVktfQ09QWV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01PREVfQ09NUEFDVF9OVgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WOjplQ2xvbmUgOiByZXR1cm4gIkNsb25lIjsKKyAgICAgIGNhc2UgQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOVjo6ZUNvbXBhY3QgOiByZXR1cm4gIkNvbXBhY3QiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIENvdmVyYWdlTW9kdWxhdGlvbk1vZGVOVgorICB7CisgICAgZU5vbmUgPSBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfTk9ORV9OViwKKyAgICBlUmdiID0gVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX1JHQl9OViwKKyAgICBlQWxwaGEgPSBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfQUxQSEFfTlYsCisgICAgZVJnYmEgPSBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfUkdCQV9OVgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ292ZXJhZ2VNb2R1bGF0aW9uTW9kZU5WIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIENvdmVyYWdlTW9kdWxhdGlvbk1vZGVOVjo6ZU5vbmUgOiByZXR1cm4gIk5vbmUiOworICAgICAgY2FzZSBDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlY6OmVSZ2IgOiByZXR1cm4gIlJnYiI7CisgICAgICBjYXNlIENvdmVyYWdlTW9kdWxhdGlvbk1vZGVOVjo6ZUFscGhhIDogcmV0dXJuICJBbHBoYSI7CisgICAgICBjYXNlIENvdmVyYWdlTW9kdWxhdGlvbk1vZGVOVjo6ZVJnYmEgOiByZXR1cm4gIlJnYmEiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIENvdmVyYWdlUmVkdWN0aW9uTW9kZU5WCisgIHsKKyAgICBlTWVyZ2UgPSBWS19DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9NRVJHRV9OViwKKyAgICBlVHJ1bmNhdGUgPSBWS19DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9UUlVOQ0FURV9OVgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlYgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlY6OmVNZXJnZSA6IHJldHVybiAiTWVyZ2UiOworICAgICAgY2FzZSBDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOVjo6ZVRydW5jYXRlIDogcmV0dXJuICJUcnVuY2F0ZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUCisgIHsKKyAgICBlVW5rbm93biA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwKKyAgICBlSW5zdGFuY2UgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhULAorICAgIGVQaHlzaWNhbERldmljZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULAorICAgIGVEZXZpY2UgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICBlUXVldWUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFVUVfRVhULAorICAgIGVTZW1hcGhvcmUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwKKyAgICBlQ29tbWFuZEJ1ZmZlciA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgZUZlbmNlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVCwKKyAgICBlRGV2aWNlTWVtb3J5ID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgIGVCdWZmZXIgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICBlSW1hZ2UgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgIGVFdmVudCA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQsCisgICAgZVF1ZXJ5UG9vbCA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVSWV9QT09MX0VYVCwKKyAgICBlQnVmZmVyVmlldyA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfVklFV19FWFQsCisgICAgZUltYWdlVmlldyA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVCwKKyAgICBlU2hhZGVyTW9kdWxlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULAorICAgIGVQaXBlbGluZUNhY2hlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFX0VYVCwKKyAgICBlUGlwZWxpbmVMYXlvdXQgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUX0VYVCwKKyAgICBlUmVuZGVyUGFzcyA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgZVBpcGVsaW5lID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICBlRGVzY3JpcHRvclNldExheW91dCA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhULAorICAgIGVTYW1wbGVyID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfRVhULAorICAgIGVEZXNjcmlwdG9yUG9vbCA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhULAorICAgIGVEZXNjcmlwdG9yU2V0ID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCwKKyAgICBlRnJhbWVidWZmZXIgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVJfRVhULAorICAgIGVDb21tYW5kUG9vbCA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0xfRVhULAorICAgIGVTdXJmYWNlS0hSID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSX0VYVCwKKyAgICBlU3dhcGNoYWluS0hSID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULAorICAgIGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhULAorICAgIGVEaXNwbGF5S0hSID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSX0VYVCwKKyAgICBlRGlzcGxheU1vZGVLSFIgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUl9FWFQsCisgICAgZU9iamVjdFRhYmxlTlZYID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlhfRVhULAorICAgIGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlhfRVhULAorICAgIGVWYWxpZGF0aW9uQ2FjaGVFWFQgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFRfRVhULAorICAgIGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFQsCisgICAgZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9FWFQsCisgICAgZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlZfRVhULAorICAgIGVEZWJ1Z1JlcG9ydCA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfRVhULAorICAgIGVWYWxpZGF0aW9uQ2FjaGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFQsCisgICAgZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9LSFJfRVhULAorICAgIGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9LSFJfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplVW5rbm93biA6IHJldHVybiAiVW5rbm93biI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZUluc3RhbmNlIDogcmV0dXJuICJJbnN0YW5jZSI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZVBoeXNpY2FsRGV2aWNlIDogcmV0dXJuICJQaHlzaWNhbERldmljZSI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZURldmljZSA6IHJldHVybiAiRGV2aWNlIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplUXVldWUgOiByZXR1cm4gIlF1ZXVlIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplU2VtYXBob3JlIDogcmV0dXJuICJTZW1hcGhvcmUiOworICAgICAgY2FzZSBEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ6OmVDb21tYW5kQnVmZmVyIDogcmV0dXJuICJDb21tYW5kQnVmZmVyIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplRmVuY2UgOiByZXR1cm4gIkZlbmNlIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplRGV2aWNlTWVtb3J5IDogcmV0dXJuICJEZXZpY2VNZW1vcnkiOworICAgICAgY2FzZSBEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ6OmVCdWZmZXIgOiByZXR1cm4gIkJ1ZmZlciI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZUltYWdlIDogcmV0dXJuICJJbWFnZSI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZUV2ZW50IDogcmV0dXJuICJFdmVudCI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZVF1ZXJ5UG9vbCA6IHJldHVybiAiUXVlcnlQb29sIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplQnVmZmVyVmlldyA6IHJldHVybiAiQnVmZmVyVmlldyI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZUltYWdlVmlldyA6IHJldHVybiAiSW1hZ2VWaWV3IjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplU2hhZGVyTW9kdWxlIDogcmV0dXJuICJTaGFkZXJNb2R1bGUiOworICAgICAgY2FzZSBEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ6OmVQaXBlbGluZUNhY2hlIDogcmV0dXJuICJQaXBlbGluZUNhY2hlIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplUGlwZWxpbmVMYXlvdXQgOiByZXR1cm4gIlBpcGVsaW5lTGF5b3V0IjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplUmVuZGVyUGFzcyA6IHJldHVybiAiUmVuZGVyUGFzcyI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZVBpcGVsaW5lIDogcmV0dXJuICJQaXBlbGluZSI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZURlc2NyaXB0b3JTZXRMYXlvdXQgOiByZXR1cm4gIkRlc2NyaXB0b3JTZXRMYXlvdXQiOworICAgICAgY2FzZSBEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ6OmVTYW1wbGVyIDogcmV0dXJuICJTYW1wbGVyIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplRGVzY3JpcHRvclBvb2wgOiByZXR1cm4gIkRlc2NyaXB0b3JQb29sIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplRGVzY3JpcHRvclNldCA6IHJldHVybiAiRGVzY3JpcHRvclNldCI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZUZyYW1lYnVmZmVyIDogcmV0dXJuICJGcmFtZWJ1ZmZlciI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZUNvbW1hbmRQb29sIDogcmV0dXJuICJDb21tYW5kUG9vbCI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZVN1cmZhY2VLSFIgOiByZXR1cm4gIlN1cmZhY2VLSFIiOworICAgICAgY2FzZSBEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ6OmVTd2FwY2hhaW5LSFIgOiByZXR1cm4gIlN3YXBjaGFpbktIUiI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgOiByZXR1cm4gIkRlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiOworICAgICAgY2FzZSBEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ6OmVEaXNwbGF5S0hSIDogcmV0dXJuICJEaXNwbGF5S0hSIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplRGlzcGxheU1vZGVLSFIgOiByZXR1cm4gIkRpc3BsYXlNb2RlS0hSIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplT2JqZWN0VGFibGVOVlggOiByZXR1cm4gIk9iamVjdFRhYmxlTlZYIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA6IHJldHVybiAiSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZVZhbGlkYXRpb25DYWNoZUVYVCA6IHJldHVybiAiVmFsaWRhdGlvbkNhY2hlRVhUIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplU2FtcGxlclljYmNyQ29udmVyc2lvbiA6IHJldHVybiAiU2FtcGxlclljYmNyQ29udmVyc2lvbiI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDo6ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA6IHJldHVybiAiRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIjsKKyAgICAgIGNhc2UgRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUOjplQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgOiByZXR1cm4gIkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBEZXNjcmlwdG9yVHlwZQorICB7CisgICAgZVNhbXBsZXIgPSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiwKKyAgICBlQ29tYmluZWRJbWFnZVNhbXBsZXIgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwKKyAgICBlU2FtcGxlZEltYWdlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UsCisgICAgZVN0b3JhZ2VJbWFnZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFLAorICAgIGVVbmlmb3JtVGV4ZWxCdWZmZXIgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIsCisgICAgZVN0b3JhZ2VUZXhlbEJ1ZmZlciA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiwKKyAgICBlVW5pZm9ybUJ1ZmZlciA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwKKyAgICBlU3RvcmFnZUJ1ZmZlciA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwKKyAgICBlVW5pZm9ybUJ1ZmZlckR5bmFtaWMgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQywKKyAgICBlU3RvcmFnZUJ1ZmZlckR5bmFtaWMgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQywKKyAgICBlSW5wdXRBdHRhY2htZW50ID0gVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQsCisgICAgZUlubGluZVVuaWZvcm1CbG9ja0VYVCA9IFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQsCisgICAgZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gVktfREVTQ1JJUFRPUl9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERlc2NyaXB0b3JUeXBlIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIERlc2NyaXB0b3JUeXBlOjplU2FtcGxlciA6IHJldHVybiAiU2FtcGxlciI7CisgICAgICBjYXNlIERlc2NyaXB0b3JUeXBlOjplQ29tYmluZWRJbWFnZVNhbXBsZXIgOiByZXR1cm4gIkNvbWJpbmVkSW1hZ2VTYW1wbGVyIjsKKyAgICAgIGNhc2UgRGVzY3JpcHRvclR5cGU6OmVTYW1wbGVkSW1hZ2UgOiByZXR1cm4gIlNhbXBsZWRJbWFnZSI7CisgICAgICBjYXNlIERlc2NyaXB0b3JUeXBlOjplU3RvcmFnZUltYWdlIDogcmV0dXJuICJTdG9yYWdlSW1hZ2UiOworICAgICAgY2FzZSBEZXNjcmlwdG9yVHlwZTo6ZVVuaWZvcm1UZXhlbEJ1ZmZlciA6IHJldHVybiAiVW5pZm9ybVRleGVsQnVmZmVyIjsKKyAgICAgIGNhc2UgRGVzY3JpcHRvclR5cGU6OmVTdG9yYWdlVGV4ZWxCdWZmZXIgOiByZXR1cm4gIlN0b3JhZ2VUZXhlbEJ1ZmZlciI7CisgICAgICBjYXNlIERlc2NyaXB0b3JUeXBlOjplVW5pZm9ybUJ1ZmZlciA6IHJldHVybiAiVW5pZm9ybUJ1ZmZlciI7CisgICAgICBjYXNlIERlc2NyaXB0b3JUeXBlOjplU3RvcmFnZUJ1ZmZlciA6IHJldHVybiAiU3RvcmFnZUJ1ZmZlciI7CisgICAgICBjYXNlIERlc2NyaXB0b3JUeXBlOjplVW5pZm9ybUJ1ZmZlckR5bmFtaWMgOiByZXR1cm4gIlVuaWZvcm1CdWZmZXJEeW5hbWljIjsKKyAgICAgIGNhc2UgRGVzY3JpcHRvclR5cGU6OmVTdG9yYWdlQnVmZmVyRHluYW1pYyA6IHJldHVybiAiU3RvcmFnZUJ1ZmZlckR5bmFtaWMiOworICAgICAgY2FzZSBEZXNjcmlwdG9yVHlwZTo6ZUlucHV0QXR0YWNobWVudCA6IHJldHVybiAiSW5wdXRBdHRhY2htZW50IjsKKyAgICAgIGNhc2UgRGVzY3JpcHRvclR5cGU6OmVJbmxpbmVVbmlmb3JtQmxvY2tFWFQgOiByZXR1cm4gIklubGluZVVuaWZvcm1CbG9ja0VYVCI7CisgICAgICBjYXNlIERlc2NyaXB0b3JUeXBlOjplQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgOiByZXR1cm4gIkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlCisgIHsKKyAgICBlRGVzY3JpcHRvclNldCA9IFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQsCisgICAgZVB1c2hEZXNjcmlwdG9yc0tIUiA9IFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfUFVTSF9ERVNDUklQVE9SU19LSFIsCisgICAgZURlc2NyaXB0b3JTZXRLSFIgPSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVHlwZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlOjplRGVzY3JpcHRvclNldCA6IHJldHVybiAiRGVzY3JpcHRvclNldCI7CisgICAgICBjYXNlIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGU6OmVQdXNoRGVzY3JpcHRvcnNLSFIgOiByZXR1cm4gIlB1c2hEZXNjcmlwdG9yc0tIUiI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgRGV2aWNlRXZlbnRUeXBlRVhUCisgIHsKKyAgICBlRGlzcGxheUhvdHBsdWcgPSBWS19ERVZJQ0VfRVZFTlRfVFlQRV9ESVNQTEFZX0hPVFBMVUdfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZXZpY2VFdmVudFR5cGVFWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRGV2aWNlRXZlbnRUeXBlRVhUOjplRGlzcGxheUhvdHBsdWcgOiByZXR1cm4gIkRpc3BsYXlIb3RwbHVnIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVAorICB7CisgICAgZUluY2x1c2l2ZSA9IFZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfSU5DTFVTSVZFX0VYVCwKKyAgICBlRXhjbHVzaXZlID0gVktfRElTQ0FSRF9SRUNUQU5HTEVfTU9ERV9FWENMVVNJVkVfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVDo6ZUluY2x1c2l2ZSA6IHJldHVybiAiSW5jbHVzaXZlIjsKKyAgICAgIGNhc2UgRGlzY2FyZFJlY3RhbmdsZU1vZGVFWFQ6OmVFeGNsdXNpdmUgOiByZXR1cm4gIkV4Y2x1c2l2ZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgRGlzcGxheUV2ZW50VHlwZUVYVAorICB7CisgICAgZUZpcnN0UGl4ZWxPdXQgPSBWS19ESVNQTEFZX0VWRU5UX1RZUEVfRklSU1RfUElYRUxfT1VUX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGlzcGxheUV2ZW50VHlwZUVYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBEaXNwbGF5RXZlbnRUeXBlRVhUOjplRmlyc3RQaXhlbE91dCA6IHJldHVybiAiRmlyc3RQaXhlbE91dCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgRGlzcGxheVBvd2VyU3RhdGVFWFQKKyAgeworICAgIGVPZmYgPSBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX09GRl9FWFQsCisgICAgZVN1c3BlbmQgPSBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX1NVU1BFTkRfRVhULAorICAgIGVPbiA9IFZLX0RJU1BMQVlfUE9XRVJfU1RBVEVfT05fRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEaXNwbGF5UG93ZXJTdGF0ZUVYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBEaXNwbGF5UG93ZXJTdGF0ZUVYVDo6ZU9mZiA6IHJldHVybiAiT2ZmIjsKKyAgICAgIGNhc2UgRGlzcGxheVBvd2VyU3RhdGVFWFQ6OmVTdXNwZW5kIDogcmV0dXJuICJTdXNwZW5kIjsKKyAgICAgIGNhc2UgRGlzcGxheVBvd2VyU3RhdGVFWFQ6OmVPbiA6IHJldHVybiAiT24iOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIERyaXZlcklkS0hSCisgIHsKKyAgICBlQW1kUHJvcHJpZXRhcnkgPSBWS19EUklWRVJfSURfQU1EX1BST1BSSUVUQVJZX0tIUiwKKyAgICBlQW1kT3BlblNvdXJjZSA9IFZLX0RSSVZFUl9JRF9BTURfT1BFTl9TT1VSQ0VfS0hSLAorICAgIGVNZXNhUmFkdiA9IFZLX0RSSVZFUl9JRF9NRVNBX1JBRFZfS0hSLAorICAgIGVOdmlkaWFQcm9wcmlldGFyeSA9IFZLX0RSSVZFUl9JRF9OVklESUFfUFJPUFJJRVRBUllfS0hSLAorICAgIGVJbnRlbFByb3ByaWV0YXJ5V2luZG93cyA9IFZLX0RSSVZFUl9JRF9JTlRFTF9QUk9QUklFVEFSWV9XSU5ET1dTX0tIUiwKKyAgICBlSW50ZWxPcGVuU291cmNlTUVTQSA9IFZLX0RSSVZFUl9JRF9JTlRFTF9PUEVOX1NPVVJDRV9NRVNBX0tIUiwKKyAgICBlSW1hZ2luYXRpb25Qcm9wcmlldGFyeSA9IFZLX0RSSVZFUl9JRF9JTUFHSU5BVElPTl9QUk9QUklFVEFSWV9LSFIsCisgICAgZVF1YWxjb21tUHJvcHJpZXRhcnkgPSBWS19EUklWRVJfSURfUVVBTENPTU1fUFJPUFJJRVRBUllfS0hSLAorICAgIGVBcm1Qcm9wcmlldGFyeSA9IFZLX0RSSVZFUl9JRF9BUk1fUFJPUFJJRVRBUllfS0hSLAorICAgIGVHb29nbGVTd2lmdHNoYWRlciA9IFZLX0RSSVZFUl9JRF9HT09HTEVfU1dJRlRTSEFERVJfS0hSLAorICAgIGVHZ3BQcm9wcmlldGFyeSA9IFZLX0RSSVZFUl9JRF9HR1BfUFJPUFJJRVRBUllfS0hSLAorICAgIGVCcm9hZGNvbVByb3ByaWV0YXJ5ID0gVktfRFJJVkVSX0lEX0JST0FEQ09NX1BST1BSSUVUQVJZX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRHJpdmVySWRLSFIgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRHJpdmVySWRLSFI6OmVBbWRQcm9wcmlldGFyeSA6IHJldHVybiAiQW1kUHJvcHJpZXRhcnkiOworICAgICAgY2FzZSBEcml2ZXJJZEtIUjo6ZUFtZE9wZW5Tb3VyY2UgOiByZXR1cm4gIkFtZE9wZW5Tb3VyY2UiOworICAgICAgY2FzZSBEcml2ZXJJZEtIUjo6ZU1lc2FSYWR2IDogcmV0dXJuICJNZXNhUmFkdiI7CisgICAgICBjYXNlIERyaXZlcklkS0hSOjplTnZpZGlhUHJvcHJpZXRhcnkgOiByZXR1cm4gIk52aWRpYVByb3ByaWV0YXJ5IjsKKyAgICAgIGNhc2UgRHJpdmVySWRLSFI6OmVJbnRlbFByb3ByaWV0YXJ5V2luZG93cyA6IHJldHVybiAiSW50ZWxQcm9wcmlldGFyeVdpbmRvd3MiOworICAgICAgY2FzZSBEcml2ZXJJZEtIUjo6ZUludGVsT3BlblNvdXJjZU1FU0EgOiByZXR1cm4gIkludGVsT3BlblNvdXJjZU1FU0EiOworICAgICAgY2FzZSBEcml2ZXJJZEtIUjo6ZUltYWdpbmF0aW9uUHJvcHJpZXRhcnkgOiByZXR1cm4gIkltYWdpbmF0aW9uUHJvcHJpZXRhcnkiOworICAgICAgY2FzZSBEcml2ZXJJZEtIUjo6ZVF1YWxjb21tUHJvcHJpZXRhcnkgOiByZXR1cm4gIlF1YWxjb21tUHJvcHJpZXRhcnkiOworICAgICAgY2FzZSBEcml2ZXJJZEtIUjo6ZUFybVByb3ByaWV0YXJ5IDogcmV0dXJuICJBcm1Qcm9wcmlldGFyeSI7CisgICAgICBjYXNlIERyaXZlcklkS0hSOjplR29vZ2xlU3dpZnRzaGFkZXIgOiByZXR1cm4gIkdvb2dsZVN3aWZ0c2hhZGVyIjsKKyAgICAgIGNhc2UgRHJpdmVySWRLSFI6OmVHZ3BQcm9wcmlldGFyeSA6IHJldHVybiAiR2dwUHJvcHJpZXRhcnkiOworICAgICAgY2FzZSBEcml2ZXJJZEtIUjo6ZUJyb2FkY29tUHJvcHJpZXRhcnkgOiByZXR1cm4gIkJyb2FkY29tUHJvcHJpZXRhcnkiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIER5bmFtaWNTdGF0ZQorICB7CisgICAgZVZpZXdwb3J0ID0gVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCwKKyAgICBlU2Npc3NvciA9IFZLX0RZTkFNSUNfU1RBVEVfU0NJU1NPUiwKKyAgICBlTGluZVdpZHRoID0gVktfRFlOQU1JQ19TVEFURV9MSU5FX1dJRFRILAorICAgIGVEZXB0aEJpYXMgPSBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JJQVMsCisgICAgZUJsZW5kQ29uc3RhbnRzID0gVktfRFlOQU1JQ19TVEFURV9CTEVORF9DT05TVEFOVFMsCisgICAgZURlcHRoQm91bmRzID0gVktfRFlOQU1JQ19TVEFURV9ERVBUSF9CT1VORFMsCisgICAgZVN0ZW5jaWxDb21wYXJlTWFzayA9IFZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9DT01QQVJFX01BU0ssCisgICAgZVN0ZW5jaWxXcml0ZU1hc2sgPSBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfV1JJVEVfTUFTSywKKyAgICBlU3RlbmNpbFJlZmVyZW5jZSA9IFZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9SRUZFUkVOQ0UsCisgICAgZVZpZXdwb3J0V1NjYWxpbmdOViA9IFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfV19TQ0FMSU5HX05WLAorICAgIGVEaXNjYXJkUmVjdGFuZ2xlRVhUID0gVktfRFlOQU1JQ19TVEFURV9ESVNDQVJEX1JFQ1RBTkdMRV9FWFQsCisgICAgZVNhbXBsZUxvY2F0aW9uc0VYVCA9IFZLX0RZTkFNSUNfU1RBVEVfU0FNUExFX0xPQ0FUSU9OU19FWFQsCisgICAgZVZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYgPSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9QQUxFVFRFX05WLAorICAgIGVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyTlYgPSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfTlYsCisgICAgZUV4Y2x1c2l2ZVNjaXNzb3JOViA9IFZLX0RZTkFNSUNfU1RBVEVfRVhDTFVTSVZFX1NDSVNTT1JfTlYsCisgICAgZUxpbmVTdGlwcGxlRVhUID0gVktfRFlOQU1JQ19TVEFURV9MSU5FX1NUSVBQTEVfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEeW5hbWljU3RhdGUgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRHluYW1pY1N0YXRlOjplVmlld3BvcnQgOiByZXR1cm4gIlZpZXdwb3J0IjsKKyAgICAgIGNhc2UgRHluYW1pY1N0YXRlOjplU2Npc3NvciA6IHJldHVybiAiU2Npc3NvciI7CisgICAgICBjYXNlIER5bmFtaWNTdGF0ZTo6ZUxpbmVXaWR0aCA6IHJldHVybiAiTGluZVdpZHRoIjsKKyAgICAgIGNhc2UgRHluYW1pY1N0YXRlOjplRGVwdGhCaWFzIDogcmV0dXJuICJEZXB0aEJpYXMiOworICAgICAgY2FzZSBEeW5hbWljU3RhdGU6OmVCbGVuZENvbnN0YW50cyA6IHJldHVybiAiQmxlbmRDb25zdGFudHMiOworICAgICAgY2FzZSBEeW5hbWljU3RhdGU6OmVEZXB0aEJvdW5kcyA6IHJldHVybiAiRGVwdGhCb3VuZHMiOworICAgICAgY2FzZSBEeW5hbWljU3RhdGU6OmVTdGVuY2lsQ29tcGFyZU1hc2sgOiByZXR1cm4gIlN0ZW5jaWxDb21wYXJlTWFzayI7CisgICAgICBjYXNlIER5bmFtaWNTdGF0ZTo6ZVN0ZW5jaWxXcml0ZU1hc2sgOiByZXR1cm4gIlN0ZW5jaWxXcml0ZU1hc2siOworICAgICAgY2FzZSBEeW5hbWljU3RhdGU6OmVTdGVuY2lsUmVmZXJlbmNlIDogcmV0dXJuICJTdGVuY2lsUmVmZXJlbmNlIjsKKyAgICAgIGNhc2UgRHluYW1pY1N0YXRlOjplVmlld3BvcnRXU2NhbGluZ05WIDogcmV0dXJuICJWaWV3cG9ydFdTY2FsaW5nTlYiOworICAgICAgY2FzZSBEeW5hbWljU3RhdGU6OmVEaXNjYXJkUmVjdGFuZ2xlRVhUIDogcmV0dXJuICJEaXNjYXJkUmVjdGFuZ2xlRVhUIjsKKyAgICAgIGNhc2UgRHluYW1pY1N0YXRlOjplU2FtcGxlTG9jYXRpb25zRVhUIDogcmV0dXJuICJTYW1wbGVMb2NhdGlvbnNFWFQiOworICAgICAgY2FzZSBEeW5hbWljU3RhdGU6OmVWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WIDogcmV0dXJuICJWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WIjsKKyAgICAgIGNhc2UgRHluYW1pY1N0YXRlOjplVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlck5WIDogcmV0dXJuICJWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyTlYiOworICAgICAgY2FzZSBEeW5hbWljU3RhdGU6OmVFeGNsdXNpdmVTY2lzc29yTlYgOiByZXR1cm4gIkV4Y2x1c2l2ZVNjaXNzb3JOViI7CisgICAgICBjYXNlIER5bmFtaWNTdGF0ZTo6ZUxpbmVTdGlwcGxlRVhUIDogcmV0dXJuICJMaW5lU3RpcHBsZUVYVCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgRmlsdGVyCisgIHsKKyAgICBlTmVhcmVzdCA9IFZLX0ZJTFRFUl9ORUFSRVNULAorICAgIGVMaW5lYXIgPSBWS19GSUxURVJfTElORUFSLAorICAgIGVDdWJpY0lNRyA9IFZLX0ZJTFRFUl9DVUJJQ19JTUcsCisgICAgZUN1YmljRVhUID0gVktfRklMVEVSX0NVQklDX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRmlsdGVyIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEZpbHRlcjo6ZU5lYXJlc3QgOiByZXR1cm4gIk5lYXJlc3QiOworICAgICAgY2FzZSBGaWx0ZXI6OmVMaW5lYXIgOiByZXR1cm4gIkxpbmVhciI7CisgICAgICBjYXNlIEZpbHRlcjo6ZUN1YmljSU1HIDogcmV0dXJuICJDdWJpY0lNRyI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgRm9ybWF0CisgIHsKKyAgICBlVW5kZWZpbmVkID0gVktfRk9STUFUX1VOREVGSU5FRCwKKyAgICBlUjRHNFVub3JtUGFjazggPSBWS19GT1JNQVRfUjRHNF9VTk9STV9QQUNLOCwKKyAgICBlUjRHNEI0QTRVbm9ybVBhY2sxNiA9IFZLX0ZPUk1BVF9SNEc0QjRBNF9VTk9STV9QQUNLMTYsCisgICAgZUI0RzRSNEE0VW5vcm1QYWNrMTYgPSBWS19GT1JNQVRfQjRHNFI0QTRfVU5PUk1fUEFDSzE2LAorICAgIGVSNUc2QjVVbm9ybVBhY2sxNiA9IFZLX0ZPUk1BVF9SNUc2QjVfVU5PUk1fUEFDSzE2LAorICAgIGVCNUc2UjVVbm9ybVBhY2sxNiA9IFZLX0ZPUk1BVF9CNUc2UjVfVU5PUk1fUEFDSzE2LAorICAgIGVSNUc1QjVBMVVub3JtUGFjazE2ID0gVktfRk9STUFUX1I1RzVCNUExX1VOT1JNX1BBQ0sxNiwKKyAgICBlQjVHNVI1QTFVbm9ybVBhY2sxNiA9IFZLX0ZPUk1BVF9CNUc1UjVBMV9VTk9STV9QQUNLMTYsCisgICAgZUExUjVHNUI1VW5vcm1QYWNrMTYgPSBWS19GT1JNQVRfQTFSNUc1QjVfVU5PUk1fUEFDSzE2LAorICAgIGVSOFVub3JtID0gVktfRk9STUFUX1I4X1VOT1JNLAorICAgIGVSOFNub3JtID0gVktfRk9STUFUX1I4X1NOT1JNLAorICAgIGVSOFVzY2FsZWQgPSBWS19GT1JNQVRfUjhfVVNDQUxFRCwKKyAgICBlUjhTc2NhbGVkID0gVktfRk9STUFUX1I4X1NTQ0FMRUQsCisgICAgZVI4VWludCA9IFZLX0ZPUk1BVF9SOF9VSU5ULAorICAgIGVSOFNpbnQgPSBWS19GT1JNQVRfUjhfU0lOVCwKKyAgICBlUjhTcmdiID0gVktfRk9STUFUX1I4X1NSR0IsCisgICAgZVI4RzhVbm9ybSA9IFZLX0ZPUk1BVF9SOEc4X1VOT1JNLAorICAgIGVSOEc4U25vcm0gPSBWS19GT1JNQVRfUjhHOF9TTk9STSwKKyAgICBlUjhHOFVzY2FsZWQgPSBWS19GT1JNQVRfUjhHOF9VU0NBTEVELAorICAgIGVSOEc4U3NjYWxlZCA9IFZLX0ZPUk1BVF9SOEc4X1NTQ0FMRUQsCisgICAgZVI4RzhVaW50ID0gVktfRk9STUFUX1I4RzhfVUlOVCwKKyAgICBlUjhHOFNpbnQgPSBWS19GT1JNQVRfUjhHOF9TSU5ULAorICAgIGVSOEc4U3JnYiA9IFZLX0ZPUk1BVF9SOEc4X1NSR0IsCisgICAgZVI4RzhCOFVub3JtID0gVktfRk9STUFUX1I4RzhCOF9VTk9STSwKKyAgICBlUjhHOEI4U25vcm0gPSBWS19GT1JNQVRfUjhHOEI4X1NOT1JNLAorICAgIGVSOEc4QjhVc2NhbGVkID0gVktfRk9STUFUX1I4RzhCOF9VU0NBTEVELAorICAgIGVSOEc4QjhTc2NhbGVkID0gVktfRk9STUFUX1I4RzhCOF9TU0NBTEVELAorICAgIGVSOEc4QjhVaW50ID0gVktfRk9STUFUX1I4RzhCOF9VSU5ULAorICAgIGVSOEc4QjhTaW50ID0gVktfRk9STUFUX1I4RzhCOF9TSU5ULAorICAgIGVSOEc4QjhTcmdiID0gVktfRk9STUFUX1I4RzhCOF9TUkdCLAorICAgIGVCOEc4UjhVbm9ybSA9IFZLX0ZPUk1BVF9COEc4UjhfVU5PUk0sCisgICAgZUI4RzhSOFNub3JtID0gVktfRk9STUFUX0I4RzhSOF9TTk9STSwKKyAgICBlQjhHOFI4VXNjYWxlZCA9IFZLX0ZPUk1BVF9COEc4UjhfVVNDQUxFRCwKKyAgICBlQjhHOFI4U3NjYWxlZCA9IFZLX0ZPUk1BVF9COEc4UjhfU1NDQUxFRCwKKyAgICBlQjhHOFI4VWludCA9IFZLX0ZPUk1BVF9COEc4UjhfVUlOVCwKKyAgICBlQjhHOFI4U2ludCA9IFZLX0ZPUk1BVF9COEc4UjhfU0lOVCwKKyAgICBlQjhHOFI4U3JnYiA9IFZLX0ZPUk1BVF9COEc4UjhfU1JHQiwKKyAgICBlUjhHOEI4QThVbm9ybSA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwKKyAgICBlUjhHOEI4QThTbm9ybSA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9TTk9STSwKKyAgICBlUjhHOEI4QThVc2NhbGVkID0gVktfRk9STUFUX1I4RzhCOEE4X1VTQ0FMRUQsCisgICAgZVI4RzhCOEE4U3NjYWxlZCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9TU0NBTEVELAorICAgIGVSOEc4QjhBOFVpbnQgPSBWS19GT1JNQVRfUjhHOEI4QThfVUlOVCwKKyAgICBlUjhHOEI4QThTaW50ID0gVktfRk9STUFUX1I4RzhCOEE4X1NJTlQsCisgICAgZVI4RzhCOEE4U3JnYiA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9TUkdCLAorICAgIGVCOEc4UjhBOFVub3JtID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLAorICAgIGVCOEc4UjhBOFNub3JtID0gVktfRk9STUFUX0I4RzhSOEE4X1NOT1JNLAorICAgIGVCOEc4UjhBOFVzY2FsZWQgPSBWS19GT1JNQVRfQjhHOFI4QThfVVNDQUxFRCwKKyAgICBlQjhHOFI4QThTc2NhbGVkID0gVktfRk9STUFUX0I4RzhSOEE4X1NTQ0FMRUQsCisgICAgZUI4RzhSOEE4VWludCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VSU5ULAorICAgIGVCOEc4UjhBOFNpbnQgPSBWS19GT1JNQVRfQjhHOFI4QThfU0lOVCwKKyAgICBlQjhHOFI4QThTcmdiID0gVktfRk9STUFUX0I4RzhSOEE4X1NSR0IsCisgICAgZUE4QjhHOFI4VW5vcm1QYWNrMzIgPSBWS19GT1JNQVRfQThCOEc4UjhfVU5PUk1fUEFDSzMyLAorICAgIGVBOEI4RzhSOFNub3JtUGFjazMyID0gVktfRk9STUFUX0E4QjhHOFI4X1NOT1JNX1BBQ0szMiwKKyAgICBlQThCOEc4UjhVc2NhbGVkUGFjazMyID0gVktfRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyLAorICAgIGVBOEI4RzhSOFNzY2FsZWRQYWNrMzIgPSBWS19GT1JNQVRfQThCOEc4UjhfU1NDQUxFRF9QQUNLMzIsCisgICAgZUE4QjhHOFI4VWludFBhY2szMiA9IFZLX0ZPUk1BVF9BOEI4RzhSOF9VSU5UX1BBQ0szMiwKKyAgICBlQThCOEc4UjhTaW50UGFjazMyID0gVktfRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyLAorICAgIGVBOEI4RzhSOFNyZ2JQYWNrMzIgPSBWS19GT1JNQVRfQThCOEc4UjhfU1JHQl9QQUNLMzIsCisgICAgZUEyUjEwRzEwQjEwVW5vcm1QYWNrMzIgPSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyLAorICAgIGVBMlIxMEcxMEIxMFNub3JtUGFjazMyID0gVktfRk9STUFUX0EyUjEwRzEwQjEwX1NOT1JNX1BBQ0szMiwKKyAgICBlQTJSMTBHMTBCMTBVc2NhbGVkUGFjazMyID0gVktfRk9STUFUX0EyUjEwRzEwQjEwX1VTQ0FMRURfUEFDSzMyLAorICAgIGVBMlIxMEcxMEIxMFNzY2FsZWRQYWNrMzIgPSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfU1NDQUxFRF9QQUNLMzIsCisgICAgZUEyUjEwRzEwQjEwVWludFBhY2szMiA9IFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VSU5UX1BBQ0szMiwKKyAgICBlQTJSMTBHMTBCMTBTaW50UGFjazMyID0gVktfRk9STUFUX0EyUjEwRzEwQjEwX1NJTlRfUEFDSzMyLAorICAgIGVBMkIxMEcxMFIxMFVub3JtUGFjazMyID0gVktfRk9STUFUX0EyQjEwRzEwUjEwX1VOT1JNX1BBQ0szMiwKKyAgICBlQTJCMTBHMTBSMTBTbm9ybVBhY2szMiA9IFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TTk9STV9QQUNLMzIsCisgICAgZUEyQjEwRzEwUjEwVXNjYWxlZFBhY2szMiA9IFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMiwKKyAgICBlQTJCMTBHMTBSMTBTc2NhbGVkUGFjazMyID0gVktfRk9STUFUX0EyQjEwRzEwUjEwX1NTQ0FMRURfUEFDSzMyLAorICAgIGVBMkIxMEcxMFIxMFVpbnRQYWNrMzIgPSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfVUlOVF9QQUNLMzIsCisgICAgZUEyQjEwRzEwUjEwU2ludFBhY2szMiA9IFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TSU5UX1BBQ0szMiwKKyAgICBlUjE2VW5vcm0gPSBWS19GT1JNQVRfUjE2X1VOT1JNLAorICAgIGVSMTZTbm9ybSA9IFZLX0ZPUk1BVF9SMTZfU05PUk0sCisgICAgZVIxNlVzY2FsZWQgPSBWS19GT1JNQVRfUjE2X1VTQ0FMRUQsCisgICAgZVIxNlNzY2FsZWQgPSBWS19GT1JNQVRfUjE2X1NTQ0FMRUQsCisgICAgZVIxNlVpbnQgPSBWS19GT1JNQVRfUjE2X1VJTlQsCisgICAgZVIxNlNpbnQgPSBWS19GT1JNQVRfUjE2X1NJTlQsCisgICAgZVIxNlNmbG9hdCA9IFZLX0ZPUk1BVF9SMTZfU0ZMT0FULAorICAgIGVSMTZHMTZVbm9ybSA9IFZLX0ZPUk1BVF9SMTZHMTZfVU5PUk0sCisgICAgZVIxNkcxNlNub3JtID0gVktfRk9STUFUX1IxNkcxNl9TTk9STSwKKyAgICBlUjE2RzE2VXNjYWxlZCA9IFZLX0ZPUk1BVF9SMTZHMTZfVVNDQUxFRCwKKyAgICBlUjE2RzE2U3NjYWxlZCA9IFZLX0ZPUk1BVF9SMTZHMTZfU1NDQUxFRCwKKyAgICBlUjE2RzE2VWludCA9IFZLX0ZPUk1BVF9SMTZHMTZfVUlOVCwKKyAgICBlUjE2RzE2U2ludCA9IFZLX0ZPUk1BVF9SMTZHMTZfU0lOVCwKKyAgICBlUjE2RzE2U2Zsb2F0ID0gVktfRk9STUFUX1IxNkcxNl9TRkxPQVQsCisgICAgZVIxNkcxNkIxNlVub3JtID0gVktfRk9STUFUX1IxNkcxNkIxNl9VTk9STSwKKyAgICBlUjE2RzE2QjE2U25vcm0gPSBWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNLAorICAgIGVSMTZHMTZCMTZVc2NhbGVkID0gVktfRk9STUFUX1IxNkcxNkIxNl9VU0NBTEVELAorICAgIGVSMTZHMTZCMTZTc2NhbGVkID0gVktfRk9STUFUX1IxNkcxNkIxNl9TU0NBTEVELAorICAgIGVSMTZHMTZCMTZVaW50ID0gVktfRk9STUFUX1IxNkcxNkIxNl9VSU5ULAorICAgIGVSMTZHMTZCMTZTaW50ID0gVktfRk9STUFUX1IxNkcxNkIxNl9TSU5ULAorICAgIGVSMTZHMTZCMTZTZmxvYXQgPSBWS19GT1JNQVRfUjE2RzE2QjE2X1NGTE9BVCwKKyAgICBlUjE2RzE2QjE2QTE2VW5vcm0gPSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNLAorICAgIGVSMTZHMTZCMTZBMTZTbm9ybSA9IFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU05PUk0sCisgICAgZVIxNkcxNkIxNkExNlVzY2FsZWQgPSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRUQsCisgICAgZVIxNkcxNkIxNkExNlNzY2FsZWQgPSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NTQ0FMRUQsCisgICAgZVIxNkcxNkIxNkExNlVpbnQgPSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VJTlQsCisgICAgZVIxNkcxNkIxNkExNlNpbnQgPSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NJTlQsCisgICAgZVIxNkcxNkIxNkExNlNmbG9hdCA9IFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FULAorICAgIGVSMzJVaW50ID0gVktfRk9STUFUX1IzMl9VSU5ULAorICAgIGVSMzJTaW50ID0gVktfRk9STUFUX1IzMl9TSU5ULAorICAgIGVSMzJTZmxvYXQgPSBWS19GT1JNQVRfUjMyX1NGTE9BVCwKKyAgICBlUjMyRzMyVWludCA9IFZLX0ZPUk1BVF9SMzJHMzJfVUlOVCwKKyAgICBlUjMyRzMyU2ludCA9IFZLX0ZPUk1BVF9SMzJHMzJfU0lOVCwKKyAgICBlUjMyRzMyU2Zsb2F0ID0gVktfRk9STUFUX1IzMkczMl9TRkxPQVQsCisgICAgZVIzMkczMkIzMlVpbnQgPSBWS19GT1JNQVRfUjMyRzMyQjMyX1VJTlQsCisgICAgZVIzMkczMkIzMlNpbnQgPSBWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlQsCisgICAgZVIzMkczMkIzMlNmbG9hdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FULAorICAgIGVSMzJHMzJCMzJBMzJVaW50ID0gVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5ULAorICAgIGVSMzJHMzJCMzJBMzJTaW50ID0gVktfRk9STUFUX1IzMkczMkIzMkEzMl9TSU5ULAorICAgIGVSMzJHMzJCMzJBMzJTZmxvYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVCwKKyAgICBlUjY0VWludCA9IFZLX0ZPUk1BVF9SNjRfVUlOVCwKKyAgICBlUjY0U2ludCA9IFZLX0ZPUk1BVF9SNjRfU0lOVCwKKyAgICBlUjY0U2Zsb2F0ID0gVktfRk9STUFUX1I2NF9TRkxPQVQsCisgICAgZVI2NEc2NFVpbnQgPSBWS19GT1JNQVRfUjY0RzY0X1VJTlQsCisgICAgZVI2NEc2NFNpbnQgPSBWS19GT1JNQVRfUjY0RzY0X1NJTlQsCisgICAgZVI2NEc2NFNmbG9hdCA9IFZLX0ZPUk1BVF9SNjRHNjRfU0ZMT0FULAorICAgIGVSNjRHNjRCNjRVaW50ID0gVktfRk9STUFUX1I2NEc2NEI2NF9VSU5ULAorICAgIGVSNjRHNjRCNjRTaW50ID0gVktfRk9STUFUX1I2NEc2NEI2NF9TSU5ULAorICAgIGVSNjRHNjRCNjRTZmxvYXQgPSBWS19GT1JNQVRfUjY0RzY0QjY0X1NGTE9BVCwKKyAgICBlUjY0RzY0QjY0QTY0VWludCA9IFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfVUlOVCwKKyAgICBlUjY0RzY0QjY0QTY0U2ludCA9IFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0lOVCwKKyAgICBlUjY0RzY0QjY0QTY0U2Zsb2F0ID0gVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TRkxPQVQsCisgICAgZUIxMEcxMVIxMVVmbG9hdFBhY2szMiA9IFZLX0ZPUk1BVF9CMTBHMTFSMTFfVUZMT0FUX1BBQ0szMiwKKyAgICBlRTVCOUc5UjlVZmxvYXRQYWNrMzIgPSBWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMiwKKyAgICBlRDE2VW5vcm0gPSBWS19GT1JNQVRfRDE2X1VOT1JNLAorICAgIGVYOEQyNFVub3JtUGFjazMyID0gVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzIsCisgICAgZUQzMlNmbG9hdCA9IFZLX0ZPUk1BVF9EMzJfU0ZMT0FULAorICAgIGVTOFVpbnQgPSBWS19GT1JNQVRfUzhfVUlOVCwKKyAgICBlRDE2VW5vcm1TOFVpbnQgPSBWS19GT1JNQVRfRDE2X1VOT1JNX1M4X1VJTlQsCisgICAgZUQyNFVub3JtUzhVaW50ID0gVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5ULAorICAgIGVEMzJTZmxvYXRTOFVpbnQgPSBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5ULAorICAgIGVCYzFSZ2JVbm9ybUJsb2NrID0gVktfRk9STUFUX0JDMV9SR0JfVU5PUk1fQkxPQ0ssCisgICAgZUJjMVJnYlNyZ2JCbG9jayA9IFZLX0ZPUk1BVF9CQzFfUkdCX1NSR0JfQkxPQ0ssCisgICAgZUJjMVJnYmFVbm9ybUJsb2NrID0gVktfRk9STUFUX0JDMV9SR0JBX1VOT1JNX0JMT0NLLAorICAgIGVCYzFSZ2JhU3JnYkJsb2NrID0gVktfRk9STUFUX0JDMV9SR0JBX1NSR0JfQkxPQ0ssCisgICAgZUJjMlVub3JtQmxvY2sgPSBWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLLAorICAgIGVCYzJTcmdiQmxvY2sgPSBWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0ssCisgICAgZUJjM1Vub3JtQmxvY2sgPSBWS19GT1JNQVRfQkMzX1VOT1JNX0JMT0NLLAorICAgIGVCYzNTcmdiQmxvY2sgPSBWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0ssCisgICAgZUJjNFVub3JtQmxvY2sgPSBWS19GT1JNQVRfQkM0X1VOT1JNX0JMT0NLLAorICAgIGVCYzRTbm9ybUJsb2NrID0gVktfRk9STUFUX0JDNF9TTk9STV9CTE9DSywKKyAgICBlQmM1VW5vcm1CbG9jayA9IFZLX0ZPUk1BVF9CQzVfVU5PUk1fQkxPQ0ssCisgICAgZUJjNVNub3JtQmxvY2sgPSBWS19GT1JNQVRfQkM1X1NOT1JNX0JMT0NLLAorICAgIGVCYzZIVWZsb2F0QmxvY2sgPSBWS19GT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0ssCisgICAgZUJjNkhTZmxvYXRCbG9jayA9IFZLX0ZPUk1BVF9CQzZIX1NGTE9BVF9CTE9DSywKKyAgICBlQmM3VW5vcm1CbG9jayA9IFZLX0ZPUk1BVF9CQzdfVU5PUk1fQkxPQ0ssCisgICAgZUJjN1NyZ2JCbG9jayA9IFZLX0ZPUk1BVF9CQzdfU1JHQl9CTE9DSywKKyAgICBlRXRjMlI4RzhCOFVub3JtQmxvY2sgPSBWS19GT1JNQVRfRVRDMl9SOEc4QjhfVU5PUk1fQkxPQ0ssCisgICAgZUV0YzJSOEc4QjhTcmdiQmxvY2sgPSBWS19GT1JNQVRfRVRDMl9SOEc4QjhfU1JHQl9CTE9DSywKKyAgICBlRXRjMlI4RzhCOEExVW5vcm1CbG9jayA9IFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1VOT1JNX0JMT0NLLAorICAgIGVFdGMyUjhHOEI4QTFTcmdiQmxvY2sgPSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBMV9TUkdCX0JMT0NLLAorICAgIGVFdGMyUjhHOEI4QThVbm9ybUJsb2NrID0gVktfRk9STUFUX0VUQzJfUjhHOEI4QThfVU5PUk1fQkxPQ0ssCisgICAgZUV0YzJSOEc4QjhBOFNyZ2JCbG9jayA9IFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1NSR0JfQkxPQ0ssCisgICAgZUVhY1IxMVVub3JtQmxvY2sgPSBWS19GT1JNQVRfRUFDX1IxMV9VTk9STV9CTE9DSywKKyAgICBlRWFjUjExU25vcm1CbG9jayA9IFZLX0ZPUk1BVF9FQUNfUjExX1NOT1JNX0JMT0NLLAorICAgIGVFYWNSMTFHMTFVbm9ybUJsb2NrID0gVktfRk9STUFUX0VBQ19SMTFHMTFfVU5PUk1fQkxPQ0ssCisgICAgZUVhY1IxMUcxMVNub3JtQmxvY2sgPSBWS19GT1JNQVRfRUFDX1IxMUcxMV9TTk9STV9CTE9DSywKKyAgICBlQXN0YzR4NFVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ180eDRfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGM0eDRTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSywKKyAgICBlQXN0YzV4NFVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ181eDRfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGM1eDRTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DSywKKyAgICBlQXN0YzV4NVVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ181eDVfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGM1eDVTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ181eDVfU1JHQl9CTE9DSywKKyAgICBlQXN0YzZ4NVVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ182eDVfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGM2eDVTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSywKKyAgICBlQXN0YzZ4NlVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ182eDZfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGM2eDZTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DSywKKyAgICBlQXN0Yzh4NVVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ184eDVfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGM4eDVTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ184eDVfU1JHQl9CTE9DSywKKyAgICBlQXN0Yzh4NlVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ184eDZfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGM4eDZTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSywKKyAgICBlQXN0Yzh4OFVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ184eDhfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGM4eDhTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DSywKKyAgICBlQXN0YzEweDVVbm9ybUJsb2NrID0gVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSywKKyAgICBlQXN0YzEweDVTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ18xMHg1X1NSR0JfQkxPQ0ssCisgICAgZUFzdGMxMHg2VW5vcm1CbG9jayA9IFZLX0ZPUk1BVF9BU1RDXzEweDZfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGMxMHg2U3JnYkJsb2NrID0gVktfRk9STUFUX0FTVENfMTB4Nl9TUkdCX0JMT0NLLAorICAgIGVBc3RjMTB4OFVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ18xMHg4X1VOT1JNX0JMT0NLLAorICAgIGVBc3RjMTB4OFNyZ2JCbG9jayA9IFZLX0ZPUk1BVF9BU1RDXzEweDhfU1JHQl9CTE9DSywKKyAgICBlQXN0YzEweDEwVW5vcm1CbG9jayA9IFZLX0ZPUk1BVF9BU1RDXzEweDEwX1VOT1JNX0JMT0NLLAorICAgIGVBc3RjMTB4MTBTcmdiQmxvY2sgPSBWS19GT1JNQVRfQVNUQ18xMHgxMF9TUkdCX0JMT0NLLAorICAgIGVBc3RjMTJ4MTBVbm9ybUJsb2NrID0gVktfRk9STUFUX0FTVENfMTJ4MTBfVU5PUk1fQkxPQ0ssCisgICAgZUFzdGMxMngxMFNyZ2JCbG9jayA9IFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0ssCisgICAgZUFzdGMxMngxMlVub3JtQmxvY2sgPSBWS19GT1JNQVRfQVNUQ18xMngxMl9VTk9STV9CTE9DSywKKyAgICBlQXN0YzEyeDEyU3JnYkJsb2NrID0gVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSywKKyAgICBlRzhCOEc4Ujg0MjJVbm9ybSA9IFZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk0sCisgICAgZUI4RzhSOEc4NDIyVW5vcm0gPSBWS19GT1JNQVRfQjhHOFI4RzhfNDIyX1VOT1JNLAorICAgIGVHOEI4UjgzUGxhbmU0MjBVbm9ybSA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNLAorICAgIGVHOEI4UjgyUGxhbmU0MjBVbm9ybSA9IFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk0sCisgICAgZUc4QjhSODNQbGFuZTQyMlVub3JtID0gVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjJfVU5PUk0sCisgICAgZUc4QjhSODJQbGFuZTQyMlVub3JtID0gVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STSwKKyAgICBlRzhCOFI4M1BsYW5lNDQ0VW5vcm0gPSBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STSwKKyAgICBlUjEwWDZVbm9ybVBhY2sxNiA9IFZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTYsCisgICAgZVIxMFg2RzEwWDZVbm9ybTJQYWNrMTYgPSBWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2LAorICAgIGVSMTBYNkcxMFg2QjEwWDZBMTBYNlVub3JtNFBhY2sxNiA9IFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2LAorICAgIGVHMTBYNkIxMFg2RzEwWDZSMTBYNjQyMlVub3JtNFBhY2sxNiA9IFZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNiwKKyAgICBlQjEwWDZHMTBYNlIxMFg2RzEwWDY0MjJVbm9ybTRQYWNrMTYgPSBWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTYsCisgICAgZUcxMFg2QjEwWDZSMTBYNjNQbGFuZTQyMFVub3JtM1BhY2sxNiA9IFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYsCisgICAgZUcxMFg2QjEwWDZSMTBYNjJQbGFuZTQyMFVub3JtM1BhY2sxNiA9IFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiwKKyAgICBlRzEwWDZCMTBYNlIxMFg2M1BsYW5lNDIyVW5vcm0zUGFjazE2ID0gVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiwKKyAgICBlRzEwWDZCMTBYNlIxMFg2MlBsYW5lNDIyVW5vcm0zUGFjazE2ID0gVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2LAorICAgIGVHMTBYNkIxMFg2UjEwWDYzUGxhbmU0NDRVbm9ybTNQYWNrMTYgPSBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2LAorICAgIGVSMTJYNFVub3JtUGFjazE2ID0gVktfRk9STUFUX1IxMlg0X1VOT1JNX1BBQ0sxNiwKKyAgICBlUjEyWDRHMTJYNFVub3JtMlBhY2sxNiA9IFZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTYsCisgICAgZVIxMlg0RzEyWDRCMTJYNEExMlg0VW5vcm00UGFjazE2ID0gVktfRk9STUFUX1IxMlg0RzEyWDRCMTJYNEExMlg0X1VOT1JNXzRQQUNLMTYsCisgICAgZUcxMlg0QjEyWDRHMTJYNFIxMlg0NDIyVW5vcm00UGFjazE2ID0gVktfRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2LAorICAgIGVCMTJYNEcxMlg0UjEyWDRHMTJYNDQyMlVub3JtNFBhY2sxNiA9IFZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNiwKKyAgICBlRzEyWDRCMTJYNFIxMlg0M1BsYW5lNDIwVW5vcm0zUGFjazE2ID0gVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiwKKyAgICBlRzEyWDRCMTJYNFIxMlg0MlBsYW5lNDIwVW5vcm0zUGFjazE2ID0gVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2LAorICAgIGVHMTJYNEIxMlg0UjEyWDQzUGxhbmU0MjJVbm9ybTNQYWNrMTYgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2LAorICAgIGVHMTJYNEIxMlg0UjEyWDQyUGxhbmU0MjJVbm9ybTNQYWNrMTYgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsCisgICAgZUcxMlg0QjEyWDRSMTJYNDNQbGFuZTQ0NFVub3JtM1BhY2sxNiA9IFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYsCisgICAgZUcxNkIxNkcxNlIxNjQyMlVub3JtID0gVktfRk9STUFUX0cxNkIxNkcxNlIxNl80MjJfVU5PUk0sCisgICAgZUIxNkcxNlIxNkcxNjQyMlVub3JtID0gVktfRk9STUFUX0IxNkcxNlIxNkcxNl80MjJfVU5PUk0sCisgICAgZUcxNkIxNlIxNjNQbGFuZTQyMFVub3JtID0gVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk0sCisgICAgZUcxNkIxNlIxNjJQbGFuZTQyMFVub3JtID0gVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STSwKKyAgICBlRzE2QjE2UjE2M1BsYW5lNDIyVW5vcm0gPSBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STSwKKyAgICBlRzE2QjE2UjE2MlBsYW5lNDIyVW5vcm0gPSBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNLAorICAgIGVHMTZCMTZSMTYzUGxhbmU0NDRVbm9ybSA9IFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNLAorICAgIGVQdnJ0YzEyQnBwVW5vcm1CbG9ja0lNRyA9IFZLX0ZPUk1BVF9QVlJUQzFfMkJQUF9VTk9STV9CTE9DS19JTUcsCisgICAgZVB2cnRjMTRCcHBVbm9ybUJsb2NrSU1HID0gVktfRk9STUFUX1BWUlRDMV80QlBQX1VOT1JNX0JMT0NLX0lNRywKKyAgICBlUHZydGMyMkJwcFVub3JtQmxvY2tJTUcgPSBWS19GT1JNQVRfUFZSVEMyXzJCUFBfVU5PUk1fQkxPQ0tfSU1HLAorICAgIGVQdnJ0YzI0QnBwVW5vcm1CbG9ja0lNRyA9IFZLX0ZPUk1BVF9QVlJUQzJfNEJQUF9VTk9STV9CTE9DS19JTUcsCisgICAgZVB2cnRjMTJCcHBTcmdiQmxvY2tJTUcgPSBWS19GT1JNQVRfUFZSVEMxXzJCUFBfU1JHQl9CTE9DS19JTUcsCisgICAgZVB2cnRjMTRCcHBTcmdiQmxvY2tJTUcgPSBWS19GT1JNQVRfUFZSVEMxXzRCUFBfU1JHQl9CTE9DS19JTUcsCisgICAgZVB2cnRjMjJCcHBTcmdiQmxvY2tJTUcgPSBWS19GT1JNQVRfUFZSVEMyXzJCUFBfU1JHQl9CTE9DS19JTUcsCisgICAgZVB2cnRjMjRCcHBTcmdiQmxvY2tJTUcgPSBWS19GT1JNQVRfUFZSVEMyXzRCUFBfU1JHQl9CTE9DS19JTUcsCisgICAgZUFzdGM0eDRTZmxvYXRCbG9ja0VYVCA9IFZLX0ZPUk1BVF9BU1RDXzR4NF9TRkxPQVRfQkxPQ0tfRVhULAorICAgIGVBc3RjNXg0U2Zsb2F0QmxvY2tFWFQgPSBWS19GT1JNQVRfQVNUQ181eDRfU0ZMT0FUX0JMT0NLX0VYVCwKKyAgICBlQXN0YzV4NVNmbG9hdEJsb2NrRVhUID0gVktfRk9STUFUX0FTVENfNXg1X1NGTE9BVF9CTE9DS19FWFQsCisgICAgZUFzdGM2eDVTZmxvYXRCbG9ja0VYVCA9IFZLX0ZPUk1BVF9BU1RDXzZ4NV9TRkxPQVRfQkxPQ0tfRVhULAorICAgIGVBc3RjNng2U2Zsb2F0QmxvY2tFWFQgPSBWS19GT1JNQVRfQVNUQ182eDZfU0ZMT0FUX0JMT0NLX0VYVCwKKyAgICBlQXN0Yzh4NVNmbG9hdEJsb2NrRVhUID0gVktfRk9STUFUX0FTVENfOHg1X1NGTE9BVF9CTE9DS19FWFQsCisgICAgZUFzdGM4eDZTZmxvYXRCbG9ja0VYVCA9IFZLX0ZPUk1BVF9BU1RDXzh4Nl9TRkxPQVRfQkxPQ0tfRVhULAorICAgIGVBc3RjOHg4U2Zsb2F0QmxvY2tFWFQgPSBWS19GT1JNQVRfQVNUQ184eDhfU0ZMT0FUX0JMT0NLX0VYVCwKKyAgICBlQXN0YzEweDVTZmxvYXRCbG9ja0VYVCA9IFZLX0ZPUk1BVF9BU1RDXzEweDVfU0ZMT0FUX0JMT0NLX0VYVCwKKyAgICBlQXN0YzEweDZTZmxvYXRCbG9ja0VYVCA9IFZLX0ZPUk1BVF9BU1RDXzEweDZfU0ZMT0FUX0JMT0NLX0VYVCwKKyAgICBlQXN0YzEweDhTZmxvYXRCbG9ja0VYVCA9IFZLX0ZPUk1BVF9BU1RDXzEweDhfU0ZMT0FUX0JMT0NLX0VYVCwKKyAgICBlQXN0YzEweDEwU2Zsb2F0QmxvY2tFWFQgPSBWS19GT1JNQVRfQVNUQ18xMHgxMF9TRkxPQVRfQkxPQ0tfRVhULAorICAgIGVBc3RjMTJ4MTBTZmxvYXRCbG9ja0VYVCA9IFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NGTE9BVF9CTE9DS19FWFQsCisgICAgZUFzdGMxMngxMlNmbG9hdEJsb2NrRVhUID0gVktfRk9STUFUX0FTVENfMTJ4MTJfU0ZMT0FUX0JMT0NLX0VYVCwKKyAgICBlRzhCOEc4Ujg0MjJVbm9ybUtIUiA9IFZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk1fS0hSLAorICAgIGVCOEc4UjhHODQyMlVub3JtS0hSID0gVktfRk9STUFUX0I4RzhSOEc4XzQyMl9VTk9STV9LSFIsCisgICAgZUc4QjhSODNQbGFuZTQyMFVub3JtS0hSID0gVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk1fS0hSLAorICAgIGVHOEI4UjgyUGxhbmU0MjBVbm9ybUtIUiA9IFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk1fS0hSLAorICAgIGVHOEI4UjgzUGxhbmU0MjJVbm9ybUtIUiA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNX0tIUiwKKyAgICBlRzhCOFI4MlBsYW5lNDIyVW5vcm1LSFIgPSBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIyX1VOT1JNX0tIUiwKKyAgICBlRzhCOFI4M1BsYW5lNDQ0VW5vcm1LSFIgPSBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STV9LSFIsCisgICAgZVIxMFg2VW5vcm1QYWNrMTZLSFIgPSBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2X0tIUiwKKyAgICBlUjEwWDZHMTBYNlVub3JtMlBhY2sxNktIUiA9IFZLX0ZPUk1BVF9SMTBYNkcxMFg2X1VOT1JNXzJQQUNLMTZfS0hSLAorICAgIGVSMTBYNkcxMFg2QjEwWDZBMTBYNlVub3JtNFBhY2sxNktIUiA9IFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2X0tIUiwKKyAgICBlRzEwWDZCMTBYNkcxMFg2UjEwWDY0MjJVbm9ybTRQYWNrMTZLSFIgPSBWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTZfS0hSLAorICAgIGVCMTBYNkcxMFg2UjEwWDZHMTBYNjQyMlVub3JtNFBhY2sxNktIUiA9IFZLX0ZPUk1BVF9CMTBYNkcxMFg2UjEwWDZHMTBYNl80MjJfVU5PUk1fNFBBQ0sxNl9LSFIsCisgICAgZUcxMFg2QjEwWDZSMTBYNjNQbGFuZTQyMFVub3JtM1BhY2sxNktIUiA9IFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTZfS0hSLAorICAgIGVHMTBYNkIxMFg2UjEwWDYyUGxhbmU0MjBVbm9ybTNQYWNrMTZLSFIgPSBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTZfS0hSLAorICAgIGVHMTBYNkIxMFg2UjEwWDYzUGxhbmU0MjJVbm9ybTNQYWNrMTZLSFIgPSBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUiwKKyAgICBlRzEwWDZCMTBYNlIxMFg2MlBsYW5lNDIyVW5vcm0zUGFjazE2S0hSID0gVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUiwKKyAgICBlRzEwWDZCMTBYNlIxMFg2M1BsYW5lNDQ0VW5vcm0zUGFjazE2S0hSID0gVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNl9LSFIsCisgICAgZVIxMlg0VW5vcm1QYWNrMTZLSFIgPSBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2X0tIUiwKKyAgICBlUjEyWDRHMTJYNFVub3JtMlBhY2sxNktIUiA9IFZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTZfS0hSLAorICAgIGVSMTJYNEcxMlg0QjEyWDRBMTJYNFVub3JtNFBhY2sxNktIUiA9IFZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2X0tIUiwKKyAgICBlRzEyWDRCMTJYNEcxMlg0UjEyWDQ0MjJVbm9ybTRQYWNrMTZLSFIgPSBWS19GT1JNQVRfRzEyWDRCMTJYNEcxMlg0UjEyWDRfNDIyX1VOT1JNXzRQQUNLMTZfS0hSLAorICAgIGVCMTJYNEcxMlg0UjEyWDRHMTJYNDQyMlVub3JtNFBhY2sxNktIUiA9IFZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNl9LSFIsCisgICAgZUcxMlg0QjEyWDRSMTJYNDNQbGFuZTQyMFVub3JtM1BhY2sxNktIUiA9IFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTZfS0hSLAorICAgIGVHMTJYNEIxMlg0UjEyWDQyUGxhbmU0MjBVbm9ybTNQYWNrMTZLSFIgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTZfS0hSLAorICAgIGVHMTJYNEIxMlg0UjEyWDQzUGxhbmU0MjJVbm9ybTNQYWNrMTZLSFIgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUiwKKyAgICBlRzEyWDRCMTJYNFIxMlg0MlBsYW5lNDIyVW5vcm0zUGFjazE2S0hSID0gVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUiwKKyAgICBlRzEyWDRCMTJYNFIxMlg0M1BsYW5lNDQ0VW5vcm0zUGFjazE2S0hSID0gVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNl9LSFIsCisgICAgZUcxNkIxNkcxNlIxNjQyMlVub3JtS0hSID0gVktfRk9STUFUX0cxNkIxNkcxNlIxNl80MjJfVU5PUk1fS0hSLAorICAgIGVCMTZHMTZSMTZHMTY0MjJVbm9ybUtIUiA9IFZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNX0tIUiwKKyAgICBlRzE2QjE2UjE2M1BsYW5lNDIwVW5vcm1LSFIgPSBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMF9VTk9STV9LSFIsCisgICAgZUcxNkIxNlIxNjJQbGFuZTQyMFVub3JtS0hSID0gVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STV9LSFIsCisgICAgZUcxNkIxNlIxNjNQbGFuZTQyMlVub3JtS0hSID0gVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjJfVU5PUk1fS0hSLAorICAgIGVHMTZCMTZSMTYyUGxhbmU0MjJVbm9ybUtIUiA9IFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjJfVU5PUk1fS0hSLAorICAgIGVHMTZCMTZSMTYzUGxhbmU0NDRVbm9ybUtIUiA9IFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRm9ybWF0IHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEZvcm1hdDo6ZVVuZGVmaW5lZCA6IHJldHVybiAiVW5kZWZpbmVkIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjRHNFVub3JtUGFjazggOiByZXR1cm4gIlI0RzRVbm9ybVBhY2s4IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjRHNEI0QTRVbm9ybVBhY2sxNiA6IHJldHVybiAiUjRHNEI0QTRVbm9ybVBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUI0RzRSNEE0VW5vcm1QYWNrMTYgOiByZXR1cm4gIkI0RzRSNEE0VW5vcm1QYWNrMTYiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSNUc2QjVVbm9ybVBhY2sxNiA6IHJldHVybiAiUjVHNkI1VW5vcm1QYWNrMTYiOworICAgICAgY2FzZSBGb3JtYXQ6OmVCNUc2UjVVbm9ybVBhY2sxNiA6IHJldHVybiAiQjVHNlI1VW5vcm1QYWNrMTYiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSNUc1QjVBMVVub3JtUGFjazE2IDogcmV0dXJuICJSNUc1QjVBMVVub3JtUGFjazE2IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQjVHNVI1QTFVbm9ybVBhY2sxNiA6IHJldHVybiAiQjVHNVI1QTFVbm9ybVBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUExUjVHNUI1VW5vcm1QYWNrMTYgOiByZXR1cm4gIkExUjVHNUI1VW5vcm1QYWNrMTYiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSOFVub3JtIDogcmV0dXJuICJSOFVub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhTbm9ybSA6IHJldHVybiAiUjhTbm9ybSI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI4VXNjYWxlZCA6IHJldHVybiAiUjhVc2NhbGVkIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhTc2NhbGVkIDogcmV0dXJuICJSOFNzY2FsZWQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSOFVpbnQgOiByZXR1cm4gIlI4VWludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI4U2ludCA6IHJldHVybiAiUjhTaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhTcmdiIDogcmV0dXJuICJSOFNyZ2IiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSOEc4VW5vcm0gOiByZXR1cm4gIlI4RzhVbm9ybSI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI4RzhTbm9ybSA6IHJldHVybiAiUjhHOFNub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOFVzY2FsZWQgOiByZXR1cm4gIlI4RzhVc2NhbGVkIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOFNzY2FsZWQgOiByZXR1cm4gIlI4RzhTc2NhbGVkIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOFVpbnQgOiByZXR1cm4gIlI4RzhVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOFNpbnQgOiByZXR1cm4gIlI4RzhTaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOFNyZ2IgOiByZXR1cm4gIlI4RzhTcmdiIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOEI4VW5vcm0gOiByZXR1cm4gIlI4RzhCOFVub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOEI4U25vcm0gOiByZXR1cm4gIlI4RzhCOFNub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOEI4VXNjYWxlZCA6IHJldHVybiAiUjhHOEI4VXNjYWxlZCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI4RzhCOFNzY2FsZWQgOiByZXR1cm4gIlI4RzhCOFNzY2FsZWQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSOEc4QjhVaW50IDogcmV0dXJuICJSOEc4QjhVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOEI4U2ludCA6IHJldHVybiAiUjhHOEI4U2ludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI4RzhCOFNyZ2IgOiByZXR1cm4gIlI4RzhCOFNyZ2IiOworICAgICAgY2FzZSBGb3JtYXQ6OmVCOEc4UjhVbm9ybSA6IHJldHVybiAiQjhHOFI4VW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVCOEc4UjhTbm9ybSA6IHJldHVybiAiQjhHOFI4U25vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVCOEc4UjhVc2NhbGVkIDogcmV0dXJuICJCOEc4UjhVc2NhbGVkIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQjhHOFI4U3NjYWxlZCA6IHJldHVybiAiQjhHOFI4U3NjYWxlZCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUI4RzhSOFVpbnQgOiByZXR1cm4gIkI4RzhSOFVpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVCOEc4UjhTaW50IDogcmV0dXJuICJCOEc4UjhTaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQjhHOFI4U3JnYiA6IHJldHVybiAiQjhHOFI4U3JnYiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI4RzhCOEE4VW5vcm0gOiByZXR1cm4gIlI4RzhCOEE4VW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVSOEc4QjhBOFNub3JtIDogcmV0dXJuICJSOEc4QjhBOFNub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOEI4QThVc2NhbGVkIDogcmV0dXJuICJSOEc4QjhBOFVzY2FsZWQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSOEc4QjhBOFNzY2FsZWQgOiByZXR1cm4gIlI4RzhCOEE4U3NjYWxlZCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI4RzhCOEE4VWludCA6IHJldHVybiAiUjhHOEI4QThVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjhHOEI4QThTaW50IDogcmV0dXJuICJSOEc4QjhBOFNpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSOEc4QjhBOFNyZ2IgOiByZXR1cm4gIlI4RzhCOEE4U3JnYiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUI4RzhSOEE4VW5vcm0gOiByZXR1cm4gIkI4RzhSOEE4VW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVCOEc4UjhBOFNub3JtIDogcmV0dXJuICJCOEc4UjhBOFNub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQjhHOFI4QThVc2NhbGVkIDogcmV0dXJuICJCOEc4UjhBOFVzY2FsZWQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVCOEc4UjhBOFNzY2FsZWQgOiByZXR1cm4gIkI4RzhSOEE4U3NjYWxlZCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUI4RzhSOEE4VWludCA6IHJldHVybiAiQjhHOFI4QThVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQjhHOFI4QThTaW50IDogcmV0dXJuICJCOEc4UjhBOFNpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVCOEc4UjhBOFNyZ2IgOiByZXR1cm4gIkI4RzhSOEE4U3JnYiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUE4QjhHOFI4VW5vcm1QYWNrMzIgOiByZXR1cm4gIkE4QjhHOFI4VW5vcm1QYWNrMzIiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBOEI4RzhSOFNub3JtUGFjazMyIDogcmV0dXJuICJBOEI4RzhSOFNub3JtUGFjazMyIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQThCOEc4UjhVc2NhbGVkUGFjazMyIDogcmV0dXJuICJBOEI4RzhSOFVzY2FsZWRQYWNrMzIiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBOEI4RzhSOFNzY2FsZWRQYWNrMzIgOiByZXR1cm4gIkE4QjhHOFI4U3NjYWxlZFBhY2szMiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUE4QjhHOFI4VWludFBhY2szMiA6IHJldHVybiAiQThCOEc4UjhVaW50UGFjazMyIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQThCOEc4UjhTaW50UGFjazMyIDogcmV0dXJuICJBOEI4RzhSOFNpbnRQYWNrMzIiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBOEI4RzhSOFNyZ2JQYWNrMzIgOiByZXR1cm4gIkE4QjhHOFI4U3JnYlBhY2szMiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUEyUjEwRzEwQjEwVW5vcm1QYWNrMzIgOiByZXR1cm4gIkEyUjEwRzEwQjEwVW5vcm1QYWNrMzIiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBMlIxMEcxMEIxMFNub3JtUGFjazMyIDogcmV0dXJuICJBMlIxMEcxMEIxMFNub3JtUGFjazMyIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQTJSMTBHMTBCMTBVc2NhbGVkUGFjazMyIDogcmV0dXJuICJBMlIxMEcxMEIxMFVzY2FsZWRQYWNrMzIiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBMlIxMEcxMEIxMFNzY2FsZWRQYWNrMzIgOiByZXR1cm4gIkEyUjEwRzEwQjEwU3NjYWxlZFBhY2szMiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUEyUjEwRzEwQjEwVWludFBhY2szMiA6IHJldHVybiAiQTJSMTBHMTBCMTBVaW50UGFjazMyIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQTJSMTBHMTBCMTBTaW50UGFjazMyIDogcmV0dXJuICJBMlIxMEcxMEIxMFNpbnRQYWNrMzIiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBMkIxMEcxMFIxMFVub3JtUGFjazMyIDogcmV0dXJuICJBMkIxMEcxMFIxMFVub3JtUGFjazMyIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQTJCMTBHMTBSMTBTbm9ybVBhY2szMiA6IHJldHVybiAiQTJCMTBHMTBSMTBTbm9ybVBhY2szMiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUEyQjEwRzEwUjEwVXNjYWxlZFBhY2szMiA6IHJldHVybiAiQTJCMTBHMTBSMTBVc2NhbGVkUGFjazMyIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQTJCMTBHMTBSMTBTc2NhbGVkUGFjazMyIDogcmV0dXJuICJBMkIxMEcxMFIxMFNzY2FsZWRQYWNrMzIiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBMkIxMEcxMFIxMFVpbnRQYWNrMzIgOiByZXR1cm4gIkEyQjEwRzEwUjEwVWludFBhY2szMiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUEyQjEwRzEwUjEwU2ludFBhY2szMiA6IHJldHVybiAiQTJCMTBHMTBSMTBTaW50UGFjazMyIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2VW5vcm0gOiByZXR1cm4gIlIxNlVub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2U25vcm0gOiByZXR1cm4gIlIxNlNub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2VXNjYWxlZCA6IHJldHVybiAiUjE2VXNjYWxlZCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxNlNzY2FsZWQgOiByZXR1cm4gIlIxNlNzY2FsZWQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMTZVaW50IDogcmV0dXJuICJSMTZVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2U2ludCA6IHJldHVybiAiUjE2U2ludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxNlNmbG9hdCA6IHJldHVybiAiUjE2U2Zsb2F0IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2VW5vcm0gOiByZXR1cm4gIlIxNkcxNlVub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2U25vcm0gOiByZXR1cm4gIlIxNkcxNlNub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2VXNjYWxlZCA6IHJldHVybiAiUjE2RzE2VXNjYWxlZCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxNkcxNlNzY2FsZWQgOiByZXR1cm4gIlIxNkcxNlNzY2FsZWQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMTZHMTZVaW50IDogcmV0dXJuICJSMTZHMTZVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2U2ludCA6IHJldHVybiAiUjE2RzE2U2ludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxNkcxNlNmbG9hdCA6IHJldHVybiAiUjE2RzE2U2Zsb2F0IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2QjE2VW5vcm0gOiByZXR1cm4gIlIxNkcxNkIxNlVub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2QjE2U25vcm0gOiByZXR1cm4gIlIxNkcxNkIxNlNub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2QjE2VXNjYWxlZCA6IHJldHVybiAiUjE2RzE2QjE2VXNjYWxlZCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxNkcxNkIxNlNzY2FsZWQgOiByZXR1cm4gIlIxNkcxNkIxNlNzY2FsZWQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMTZHMTZCMTZVaW50IDogcmV0dXJuICJSMTZHMTZCMTZVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2QjE2U2ludCA6IHJldHVybiAiUjE2RzE2QjE2U2ludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxNkcxNkIxNlNmbG9hdCA6IHJldHVybiAiUjE2RzE2QjE2U2Zsb2F0IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2QjE2QTE2VW5vcm0gOiByZXR1cm4gIlIxNkcxNkIxNkExNlVub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2QjE2QTE2U25vcm0gOiByZXR1cm4gIlIxNkcxNkIxNkExNlNub3JtIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2QjE2QTE2VXNjYWxlZCA6IHJldHVybiAiUjE2RzE2QjE2QTE2VXNjYWxlZCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxNkcxNkIxNkExNlNzY2FsZWQgOiByZXR1cm4gIlIxNkcxNkIxNkExNlNzY2FsZWQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMTZHMTZCMTZBMTZVaW50IDogcmV0dXJuICJSMTZHMTZCMTZBMTZVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjE2RzE2QjE2QTE2U2ludCA6IHJldHVybiAiUjE2RzE2QjE2QTE2U2ludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxNkcxNkIxNkExNlNmbG9hdCA6IHJldHVybiAiUjE2RzE2QjE2QTE2U2Zsb2F0IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjMyVWludCA6IHJldHVybiAiUjMyVWludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIzMlNpbnQgOiByZXR1cm4gIlIzMlNpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMzJTZmxvYXQgOiByZXR1cm4gIlIzMlNmbG9hdCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIzMkczMlVpbnQgOiByZXR1cm4gIlIzMkczMlVpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMzJHMzJTaW50IDogcmV0dXJuICJSMzJHMzJTaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjMyRzMyU2Zsb2F0IDogcmV0dXJuICJSMzJHMzJTZmxvYXQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMzJHMzJCMzJVaW50IDogcmV0dXJuICJSMzJHMzJCMzJVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjMyRzMyQjMyU2ludCA6IHJldHVybiAiUjMyRzMyQjMyU2ludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIzMkczMkIzMlNmbG9hdCA6IHJldHVybiAiUjMyRzMyQjMyU2Zsb2F0IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjMyRzMyQjMyQTMyVWludCA6IHJldHVybiAiUjMyRzMyQjMyQTMyVWludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIzMkczMkIzMkEzMlNpbnQgOiByZXR1cm4gIlIzMkczMkIzMkEzMlNpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMzJHMzJCMzJBMzJTZmxvYXQgOiByZXR1cm4gIlIzMkczMkIzMkEzMlNmbG9hdCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI2NFVpbnQgOiByZXR1cm4gIlI2NFVpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSNjRTaW50IDogcmV0dXJuICJSNjRTaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjY0U2Zsb2F0IDogcmV0dXJuICJSNjRTZmxvYXQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSNjRHNjRVaW50IDogcmV0dXJuICJSNjRHNjRVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjY0RzY0U2ludCA6IHJldHVybiAiUjY0RzY0U2ludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI2NEc2NFNmbG9hdCA6IHJldHVybiAiUjY0RzY0U2Zsb2F0IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjY0RzY0QjY0VWludCA6IHJldHVybiAiUjY0RzY0QjY0VWludCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI2NEc2NEI2NFNpbnQgOiByZXR1cm4gIlI2NEc2NEI2NFNpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSNjRHNjRCNjRTZmxvYXQgOiByZXR1cm4gIlI2NEc2NEI2NFNmbG9hdCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVI2NEc2NEI2NEE2NFVpbnQgOiByZXR1cm4gIlI2NEc2NEI2NEE2NFVpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSNjRHNjRCNjRBNjRTaW50IDogcmV0dXJuICJSNjRHNjRCNjRBNjRTaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjY0RzY0QjY0QTY0U2Zsb2F0IDogcmV0dXJuICJSNjRHNjRCNjRBNjRTZmxvYXQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVCMTBHMTFSMTFVZmxvYXRQYWNrMzIgOiByZXR1cm4gIkIxMEcxMVIxMVVmbG9hdFBhY2szMiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUU1QjlHOVI5VWZsb2F0UGFjazMyIDogcmV0dXJuICJFNUI5RzlSOVVmbG9hdFBhY2szMiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUQxNlVub3JtIDogcmV0dXJuICJEMTZVbm9ybSI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVg4RDI0VW5vcm1QYWNrMzIgOiByZXR1cm4gIlg4RDI0VW5vcm1QYWNrMzIiOworICAgICAgY2FzZSBGb3JtYXQ6OmVEMzJTZmxvYXQgOiByZXR1cm4gIkQzMlNmbG9hdCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVM4VWludCA6IHJldHVybiAiUzhVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRDE2VW5vcm1TOFVpbnQgOiByZXR1cm4gIkQxNlVub3JtUzhVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRDI0VW5vcm1TOFVpbnQgOiByZXR1cm4gIkQyNFVub3JtUzhVaW50IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRDMyU2Zsb2F0UzhVaW50IDogcmV0dXJuICJEMzJTZmxvYXRTOFVpbnQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVCYzFSZ2JVbm9ybUJsb2NrIDogcmV0dXJuICJCYzFSZ2JVbm9ybUJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQmMxUmdiU3JnYkJsb2NrIDogcmV0dXJuICJCYzFSZ2JTcmdiQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVCYzFSZ2JhVW5vcm1CbG9jayA6IHJldHVybiAiQmMxUmdiYVVub3JtQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVCYzFSZ2JhU3JnYkJsb2NrIDogcmV0dXJuICJCYzFSZ2JhU3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQmMyVW5vcm1CbG9jayA6IHJldHVybiAiQmMyVW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUJjMlNyZ2JCbG9jayA6IHJldHVybiAiQmMyU3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQmMzVW5vcm1CbG9jayA6IHJldHVybiAiQmMzVW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUJjM1NyZ2JCbG9jayA6IHJldHVybiAiQmMzU3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQmM0VW5vcm1CbG9jayA6IHJldHVybiAiQmM0VW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUJjNFNub3JtQmxvY2sgOiByZXR1cm4gIkJjNFNub3JtQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVCYzVVbm9ybUJsb2NrIDogcmV0dXJuICJCYzVVbm9ybUJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQmM1U25vcm1CbG9jayA6IHJldHVybiAiQmM1U25vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUJjNkhVZmxvYXRCbG9jayA6IHJldHVybiAiQmM2SFVmbG9hdEJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQmM2SFNmbG9hdEJsb2NrIDogcmV0dXJuICJCYzZIU2Zsb2F0QmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVCYzdVbm9ybUJsb2NrIDogcmV0dXJuICJCYzdVbm9ybUJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQmM3U3JnYkJsb2NrIDogcmV0dXJuICJCYzdTcmdiQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVFdGMyUjhHOEI4VW5vcm1CbG9jayA6IHJldHVybiAiRXRjMlI4RzhCOFVub3JtQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVFdGMyUjhHOEI4U3JnYkJsb2NrIDogcmV0dXJuICJFdGMyUjhHOEI4U3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRXRjMlI4RzhCOEExVW5vcm1CbG9jayA6IHJldHVybiAiRXRjMlI4RzhCOEExVW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUV0YzJSOEc4QjhBMVNyZ2JCbG9jayA6IHJldHVybiAiRXRjMlI4RzhCOEExU3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRXRjMlI4RzhCOEE4VW5vcm1CbG9jayA6IHJldHVybiAiRXRjMlI4RzhCOEE4VW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUV0YzJSOEc4QjhBOFNyZ2JCbG9jayA6IHJldHVybiAiRXRjMlI4RzhCOEE4U3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRWFjUjExVW5vcm1CbG9jayA6IHJldHVybiAiRWFjUjExVW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUVhY1IxMVNub3JtQmxvY2sgOiByZXR1cm4gIkVhY1IxMVNub3JtQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVFYWNSMTFHMTFVbm9ybUJsb2NrIDogcmV0dXJuICJFYWNSMTFHMTFVbm9ybUJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRWFjUjExRzExU25vcm1CbG9jayA6IHJldHVybiAiRWFjUjExRzExU25vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGM0eDRVbm9ybUJsb2NrIDogcmV0dXJuICJBc3RjNHg0VW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGM0eDRTcmdiQmxvY2sgOiByZXR1cm4gIkFzdGM0eDRTcmdiQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjNXg0VW5vcm1CbG9jayA6IHJldHVybiAiQXN0YzV4NFVub3JtQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjNXg0U3JnYkJsb2NrIDogcmV0dXJuICJBc3RjNXg0U3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzV4NVVub3JtQmxvY2sgOiByZXR1cm4gIkFzdGM1eDVVbm9ybUJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzV4NVNyZ2JCbG9jayA6IHJldHVybiAiQXN0YzV4NVNyZ2JCbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGM2eDVVbm9ybUJsb2NrIDogcmV0dXJuICJBc3RjNng1VW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGM2eDVTcmdiQmxvY2sgOiByZXR1cm4gIkFzdGM2eDVTcmdiQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjNng2VW5vcm1CbG9jayA6IHJldHVybiAiQXN0YzZ4NlVub3JtQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjNng2U3JnYkJsb2NrIDogcmV0dXJuICJBc3RjNng2U3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0Yzh4NVVub3JtQmxvY2sgOiByZXR1cm4gIkFzdGM4eDVVbm9ybUJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0Yzh4NVNyZ2JCbG9jayA6IHJldHVybiAiQXN0Yzh4NVNyZ2JCbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGM4eDZVbm9ybUJsb2NrIDogcmV0dXJuICJBc3RjOHg2VW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGM4eDZTcmdiQmxvY2sgOiByZXR1cm4gIkFzdGM4eDZTcmdiQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjOHg4VW5vcm1CbG9jayA6IHJldHVybiAiQXN0Yzh4OFVub3JtQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjOHg4U3JnYkJsb2NrIDogcmV0dXJuICJBc3RjOHg4U3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzEweDVVbm9ybUJsb2NrIDogcmV0dXJuICJBc3RjMTB4NVVub3JtQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjMTB4NVNyZ2JCbG9jayA6IHJldHVybiAiQXN0YzEweDVTcmdiQmxvY2siOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjMTB4NlVub3JtQmxvY2sgOiByZXR1cm4gIkFzdGMxMHg2VW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMHg2U3JnYkJsb2NrIDogcmV0dXJuICJBc3RjMTB4NlNyZ2JCbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMHg4VW5vcm1CbG9jayA6IHJldHVybiAiQXN0YzEweDhVbm9ybUJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzEweDhTcmdiQmxvY2sgOiByZXR1cm4gIkFzdGMxMHg4U3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzEweDEwVW5vcm1CbG9jayA6IHJldHVybiAiQXN0YzEweDEwVW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMHgxMFNyZ2JCbG9jayA6IHJldHVybiAiQXN0YzEweDEwU3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzEyeDEwVW5vcm1CbG9jayA6IHJldHVybiAiQXN0YzEyeDEwVW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMngxMFNyZ2JCbG9jayA6IHJldHVybiAiQXN0YzEyeDEwU3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzEyeDEyVW5vcm1CbG9jayA6IHJldHVybiAiQXN0YzEyeDEyVW5vcm1CbG9jayI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMngxMlNyZ2JCbG9jayA6IHJldHVybiAiQXN0YzEyeDEyU3JnYkJsb2NrIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRzhCOEc4Ujg0MjJVbm9ybSA6IHJldHVybiAiRzhCOEc4Ujg0MjJVbm9ybSI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUI4RzhSOEc4NDIyVW5vcm0gOiByZXR1cm4gIkI4RzhSOEc4NDIyVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHOEI4UjgzUGxhbmU0MjBVbm9ybSA6IHJldHVybiAiRzhCOFI4M1BsYW5lNDIwVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHOEI4UjgyUGxhbmU0MjBVbm9ybSA6IHJldHVybiAiRzhCOFI4MlBsYW5lNDIwVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHOEI4UjgzUGxhbmU0MjJVbm9ybSA6IHJldHVybiAiRzhCOFI4M1BsYW5lNDIyVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHOEI4UjgyUGxhbmU0MjJVbm9ybSA6IHJldHVybiAiRzhCOFI4MlBsYW5lNDIyVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHOEI4UjgzUGxhbmU0NDRVbm9ybSA6IHJldHVybiAiRzhCOFI4M1BsYW5lNDQ0VW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMTBYNlVub3JtUGFjazE2IDogcmV0dXJuICJSMTBYNlVub3JtUGFjazE2IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjEwWDZHMTBYNlVub3JtMlBhY2sxNiA6IHJldHVybiAiUjEwWDZHMTBYNlVub3JtMlBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxMFg2RzEwWDZCMTBYNkExMFg2VW5vcm00UGFjazE2IDogcmV0dXJuICJSMTBYNkcxMFg2QjEwWDZBMTBYNlVub3JtNFBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUcxMFg2QjEwWDZHMTBYNlIxMFg2NDIyVW5vcm00UGFjazE2IDogcmV0dXJuICJHMTBYNkIxMFg2RzEwWDZSMTBYNjQyMlVub3JtNFBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUIxMFg2RzEwWDZSMTBYNkcxMFg2NDIyVW5vcm00UGFjazE2IDogcmV0dXJuICJCMTBYNkcxMFg2UjEwWDZHMTBYNjQyMlVub3JtNFBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUcxMFg2QjEwWDZSMTBYNjNQbGFuZTQyMFVub3JtM1BhY2sxNiA6IHJldHVybiAiRzEwWDZCMTBYNlIxMFg2M1BsYW5lNDIwVW5vcm0zUGFjazE2IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRzEwWDZCMTBYNlIxMFg2MlBsYW5lNDIwVW5vcm0zUGFjazE2IDogcmV0dXJuICJHMTBYNkIxMFg2UjEwWDYyUGxhbmU0MjBVbm9ybTNQYWNrMTYiOworICAgICAgY2FzZSBGb3JtYXQ6OmVHMTBYNkIxMFg2UjEwWDYzUGxhbmU0MjJVbm9ybTNQYWNrMTYgOiByZXR1cm4gIkcxMFg2QjEwWDZSMTBYNjNQbGFuZTQyMlVub3JtM1BhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUcxMFg2QjEwWDZSMTBYNjJQbGFuZTQyMlVub3JtM1BhY2sxNiA6IHJldHVybiAiRzEwWDZCMTBYNlIxMFg2MlBsYW5lNDIyVW5vcm0zUGFjazE2IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRzEwWDZCMTBYNlIxMFg2M1BsYW5lNDQ0VW5vcm0zUGFjazE2IDogcmV0dXJuICJHMTBYNkIxMFg2UjEwWDYzUGxhbmU0NDRVbm9ybTNQYWNrMTYiOworICAgICAgY2FzZSBGb3JtYXQ6OmVSMTJYNFVub3JtUGFjazE2IDogcmV0dXJuICJSMTJYNFVub3JtUGFjazE2IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUjEyWDRHMTJYNFVub3JtMlBhY2sxNiA6IHJldHVybiAiUjEyWDRHMTJYNFVub3JtMlBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVIxMlg0RzEyWDRCMTJYNEExMlg0VW5vcm00UGFjazE2IDogcmV0dXJuICJSMTJYNEcxMlg0QjEyWDRBMTJYNFVub3JtNFBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUcxMlg0QjEyWDRHMTJYNFIxMlg0NDIyVW5vcm00UGFjazE2IDogcmV0dXJuICJHMTJYNEIxMlg0RzEyWDRSMTJYNDQyMlVub3JtNFBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUIxMlg0RzEyWDRSMTJYNEcxMlg0NDIyVW5vcm00UGFjazE2IDogcmV0dXJuICJCMTJYNEcxMlg0UjEyWDRHMTJYNDQyMlVub3JtNFBhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUcxMlg0QjEyWDRSMTJYNDNQbGFuZTQyMFVub3JtM1BhY2sxNiA6IHJldHVybiAiRzEyWDRCMTJYNFIxMlg0M1BsYW5lNDIwVW5vcm0zUGFjazE2IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRzEyWDRCMTJYNFIxMlg0MlBsYW5lNDIwVW5vcm0zUGFjazE2IDogcmV0dXJuICJHMTJYNEIxMlg0UjEyWDQyUGxhbmU0MjBVbm9ybTNQYWNrMTYiOworICAgICAgY2FzZSBGb3JtYXQ6OmVHMTJYNEIxMlg0UjEyWDQzUGxhbmU0MjJVbm9ybTNQYWNrMTYgOiByZXR1cm4gIkcxMlg0QjEyWDRSMTJYNDNQbGFuZTQyMlVub3JtM1BhY2sxNiI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUcxMlg0QjEyWDRSMTJYNDJQbGFuZTQyMlVub3JtM1BhY2sxNiA6IHJldHVybiAiRzEyWDRCMTJYNFIxMlg0MlBsYW5lNDIyVW5vcm0zUGFjazE2IjsKKyAgICAgIGNhc2UgRm9ybWF0OjplRzEyWDRCMTJYNFIxMlg0M1BsYW5lNDQ0VW5vcm0zUGFjazE2IDogcmV0dXJuICJHMTJYNEIxMlg0UjEyWDQzUGxhbmU0NDRVbm9ybTNQYWNrMTYiOworICAgICAgY2FzZSBGb3JtYXQ6OmVHMTZCMTZHMTZSMTY0MjJVbm9ybSA6IHJldHVybiAiRzE2QjE2RzE2UjE2NDIyVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVCMTZHMTZSMTZHMTY0MjJVbm9ybSA6IHJldHVybiAiQjE2RzE2UjE2RzE2NDIyVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHMTZCMTZSMTYzUGxhbmU0MjBVbm9ybSA6IHJldHVybiAiRzE2QjE2UjE2M1BsYW5lNDIwVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHMTZCMTZSMTYyUGxhbmU0MjBVbm9ybSA6IHJldHVybiAiRzE2QjE2UjE2MlBsYW5lNDIwVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHMTZCMTZSMTYzUGxhbmU0MjJVbm9ybSA6IHJldHVybiAiRzE2QjE2UjE2M1BsYW5lNDIyVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHMTZCMTZSMTYyUGxhbmU0MjJVbm9ybSA6IHJldHVybiAiRzE2QjE2UjE2MlBsYW5lNDIyVW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVHMTZCMTZSMTYzUGxhbmU0NDRVbm9ybSA6IHJldHVybiAiRzE2QjE2UjE2M1BsYW5lNDQ0VW5vcm0iOworICAgICAgY2FzZSBGb3JtYXQ6OmVQdnJ0YzEyQnBwVW5vcm1CbG9ja0lNRyA6IHJldHVybiAiUHZydGMxMkJwcFVub3JtQmxvY2tJTUciOworICAgICAgY2FzZSBGb3JtYXQ6OmVQdnJ0YzE0QnBwVW5vcm1CbG9ja0lNRyA6IHJldHVybiAiUHZydGMxNEJwcFVub3JtQmxvY2tJTUciOworICAgICAgY2FzZSBGb3JtYXQ6OmVQdnJ0YzIyQnBwVW5vcm1CbG9ja0lNRyA6IHJldHVybiAiUHZydGMyMkJwcFVub3JtQmxvY2tJTUciOworICAgICAgY2FzZSBGb3JtYXQ6OmVQdnJ0YzI0QnBwVW5vcm1CbG9ja0lNRyA6IHJldHVybiAiUHZydGMyNEJwcFVub3JtQmxvY2tJTUciOworICAgICAgY2FzZSBGb3JtYXQ6OmVQdnJ0YzEyQnBwU3JnYkJsb2NrSU1HIDogcmV0dXJuICJQdnJ0YzEyQnBwU3JnYkJsb2NrSU1HIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplUHZydGMxNEJwcFNyZ2JCbG9ja0lNRyA6IHJldHVybiAiUHZydGMxNEJwcFNyZ2JCbG9ja0lNRyI7CisgICAgICBjYXNlIEZvcm1hdDo6ZVB2cnRjMjJCcHBTcmdiQmxvY2tJTUcgOiByZXR1cm4gIlB2cnRjMjJCcHBTcmdiQmxvY2tJTUciOworICAgICAgY2FzZSBGb3JtYXQ6OmVQdnJ0YzI0QnBwU3JnYkJsb2NrSU1HIDogcmV0dXJuICJQdnJ0YzI0QnBwU3JnYkJsb2NrSU1HIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzR4NFNmbG9hdEJsb2NrRVhUIDogcmV0dXJuICJBc3RjNHg0U2Zsb2F0QmxvY2tFWFQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjNXg0U2Zsb2F0QmxvY2tFWFQgOiByZXR1cm4gIkFzdGM1eDRTZmxvYXRCbG9ja0VYVCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGM1eDVTZmxvYXRCbG9ja0VYVCA6IHJldHVybiAiQXN0YzV4NVNmbG9hdEJsb2NrRVhUIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzZ4NVNmbG9hdEJsb2NrRVhUIDogcmV0dXJuICJBc3RjNng1U2Zsb2F0QmxvY2tFWFQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjNng2U2Zsb2F0QmxvY2tFWFQgOiByZXR1cm4gIkFzdGM2eDZTZmxvYXRCbG9ja0VYVCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGM4eDVTZmxvYXRCbG9ja0VYVCA6IHJldHVybiAiQXN0Yzh4NVNmbG9hdEJsb2NrRVhUIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0Yzh4NlNmbG9hdEJsb2NrRVhUIDogcmV0dXJuICJBc3RjOHg2U2Zsb2F0QmxvY2tFWFQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjOHg4U2Zsb2F0QmxvY2tFWFQgOiByZXR1cm4gIkFzdGM4eDhTZmxvYXRCbG9ja0VYVCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMHg1U2Zsb2F0QmxvY2tFWFQgOiByZXR1cm4gIkFzdGMxMHg1U2Zsb2F0QmxvY2tFWFQiOworICAgICAgY2FzZSBGb3JtYXQ6OmVBc3RjMTB4NlNmbG9hdEJsb2NrRVhUIDogcmV0dXJuICJBc3RjMTB4NlNmbG9hdEJsb2NrRVhUIjsKKyAgICAgIGNhc2UgRm9ybWF0OjplQXN0YzEweDhTZmxvYXRCbG9ja0VYVCA6IHJldHVybiAiQXN0YzEweDhTZmxvYXRCbG9ja0VYVCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMHgxMFNmbG9hdEJsb2NrRVhUIDogcmV0dXJuICJBc3RjMTB4MTBTZmxvYXRCbG9ja0VYVCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMngxMFNmbG9hdEJsb2NrRVhUIDogcmV0dXJuICJBc3RjMTJ4MTBTZmxvYXRCbG9ja0VYVCI7CisgICAgICBjYXNlIEZvcm1hdDo6ZUFzdGMxMngxMlNmbG9hdEJsb2NrRVhUIDogcmV0dXJuICJBc3RjMTJ4MTJTZmxvYXRCbG9ja0VYVCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgRnJvbnRGYWNlCisgIHsKKyAgICBlQ291bnRlckNsb2Nrd2lzZSA9IFZLX0ZST05UX0ZBQ0VfQ09VTlRFUl9DTE9DS1dJU0UsCisgICAgZUNsb2Nrd2lzZSA9IFZLX0ZST05UX0ZBQ0VfQ0xPQ0tXSVNFCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBGcm9udEZhY2UgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRnJvbnRGYWNlOjplQ291bnRlckNsb2Nrd2lzZSA6IHJldHVybiAiQ291bnRlckNsb2Nrd2lzZSI7CisgICAgICBjYXNlIEZyb250RmFjZTo6ZUNsb2Nrd2lzZSA6IHJldHVybiAiQ2xvY2t3aXNlIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIGVudW0gY2xhc3MgRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVAorICB7CisgICAgZURlZmF1bHQgPSBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfREVGQVVMVF9FWFQsCisgICAgZUFsbG93ZWQgPSBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQUxMT1dFRF9FWFQsCisgICAgZURpc2FsbG93ZWQgPSBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRElTQUxMT1dFRF9FWFQsCisgICAgZUFwcGxpY2F0aW9uQ29udHJvbGxlZCA9IFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BUFBMSUNBVElPTl9DT05UUk9MTEVEX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBGdWxsU2NyZWVuRXhjbHVzaXZlRVhUOjplRGVmYXVsdCA6IHJldHVybiAiRGVmYXVsdCI7CisgICAgICBjYXNlIEZ1bGxTY3JlZW5FeGNsdXNpdmVFWFQ6OmVBbGxvd2VkIDogcmV0dXJuICJBbGxvd2VkIjsKKyAgICAgIGNhc2UgRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDo6ZURpc2FsbG93ZWQgOiByZXR1cm4gIkRpc2FsbG93ZWQiOworICAgICAgY2FzZSBGdWxsU2NyZWVuRXhjbHVzaXZlRVhUOjplQXBwbGljYXRpb25Db250cm9sbGVkIDogcmV0dXJuICJBcHBsaWNhdGlvbkNvbnRyb2xsZWQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgIGVudW0gY2xhc3MgR2VvbWV0cnlUeXBlTlYKKyAgeworICAgIGVUcmlhbmdsZXMgPSBWS19HRU9NRVRSWV9UWVBFX1RSSUFOR0xFU19OViwKKyAgICBlQWFiYnMgPSBWS19HRU9NRVRSWV9UWVBFX0FBQkJTX05WCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBHZW9tZXRyeVR5cGVOViB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBHZW9tZXRyeVR5cGVOVjo6ZVRyaWFuZ2xlcyA6IHJldHVybiAiVHJpYW5nbGVzIjsKKyAgICAgIGNhc2UgR2VvbWV0cnlUeXBlTlY6OmVBYWJicyA6IHJldHVybiAiQWFiYnMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEltYWdlTGF5b3V0CisgIHsKKyAgICBlVW5kZWZpbmVkID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICBlR2VuZXJhbCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgIGVDb2xvckF0dGFjaG1lbnRPcHRpbWFsID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICBlRGVwdGhTdGVuY2lsQXR0YWNobWVudE9wdGltYWwgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgZURlcHRoU3RlbmNpbFJlYWRPbmx5T3B0aW1hbCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLAorICAgIGVTaGFkZXJSZWFkT25seU9wdGltYWwgPSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMLAorICAgIGVUcmFuc2ZlclNyY09wdGltYWwgPSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsCisgICAgZVRyYW5zZmVyRHN0T3B0aW1hbCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwKKyAgICBlUHJlaW5pdGlhbGl6ZWQgPSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQsCisgICAgZURlcHRoUmVhZE9ubHlTdGVuY2lsQXR0YWNobWVudE9wdGltYWwgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgIGVEZXB0aEF0dGFjaG1lbnRTdGVuY2lsUmVhZE9ubHlPcHRpbWFsID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwKKyAgICBlUHJlc2VudFNyY0tIUiA9IFZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFIsCisgICAgZVNoYXJlZFByZXNlbnRLSFIgPSBWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSLAorICAgIGVTaGFkaW5nUmF0ZU9wdGltYWxOViA9IFZLX0lNQUdFX0xBWU9VVF9TSEFESU5HX1JBVEVfT1BUSU1BTF9OViwKKyAgICBlRnJhZ21lbnREZW5zaXR5TWFwT3B0aW1hbEVYVCA9IFZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVCwKKyAgICBlRGVwdGhBdHRhY2htZW50T3B0aW1hbEtIUiA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLAorICAgIGVEZXB0aFJlYWRPbmx5T3B0aW1hbEtIUiA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsCisgICAgZVN0ZW5jaWxBdHRhY2htZW50T3B0aW1hbEtIUiA9IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsCisgICAgZVN0ZW5jaWxSZWFkT25seU9wdGltYWxLSFIgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsCisgICAgZURlcHRoUmVhZE9ubHlTdGVuY2lsQXR0YWNobWVudE9wdGltYWxLSFIgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwKKyAgICBlRGVwdGhBdHRhY2htZW50U3RlbmNpbFJlYWRPbmx5T3B0aW1hbEtIUiA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBJbWFnZUxheW91dCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBJbWFnZUxheW91dDo6ZVVuZGVmaW5lZCA6IHJldHVybiAiVW5kZWZpbmVkIjsKKyAgICAgIGNhc2UgSW1hZ2VMYXlvdXQ6OmVHZW5lcmFsIDogcmV0dXJuICJHZW5lcmFsIjsKKyAgICAgIGNhc2UgSW1hZ2VMYXlvdXQ6OmVDb2xvckF0dGFjaG1lbnRPcHRpbWFsIDogcmV0dXJuICJDb2xvckF0dGFjaG1lbnRPcHRpbWFsIjsKKyAgICAgIGNhc2UgSW1hZ2VMYXlvdXQ6OmVEZXB0aFN0ZW5jaWxBdHRhY2htZW50T3B0aW1hbCA6IHJldHVybiAiRGVwdGhTdGVuY2lsQXR0YWNobWVudE9wdGltYWwiOworICAgICAgY2FzZSBJbWFnZUxheW91dDo6ZURlcHRoU3RlbmNpbFJlYWRPbmx5T3B0aW1hbCA6IHJldHVybiAiRGVwdGhTdGVuY2lsUmVhZE9ubHlPcHRpbWFsIjsKKyAgICAgIGNhc2UgSW1hZ2VMYXlvdXQ6OmVTaGFkZXJSZWFkT25seU9wdGltYWwgOiByZXR1cm4gIlNoYWRlclJlYWRPbmx5T3B0aW1hbCI7CisgICAgICBjYXNlIEltYWdlTGF5b3V0OjplVHJhbnNmZXJTcmNPcHRpbWFsIDogcmV0dXJuICJUcmFuc2ZlclNyY09wdGltYWwiOworICAgICAgY2FzZSBJbWFnZUxheW91dDo6ZVRyYW5zZmVyRHN0T3B0aW1hbCA6IHJldHVybiAiVHJhbnNmZXJEc3RPcHRpbWFsIjsKKyAgICAgIGNhc2UgSW1hZ2VMYXlvdXQ6OmVQcmVpbml0aWFsaXplZCA6IHJldHVybiAiUHJlaW5pdGlhbGl6ZWQiOworICAgICAgY2FzZSBJbWFnZUxheW91dDo6ZURlcHRoUmVhZE9ubHlTdGVuY2lsQXR0YWNobWVudE9wdGltYWwgOiByZXR1cm4gIkRlcHRoUmVhZE9ubHlTdGVuY2lsQXR0YWNobWVudE9wdGltYWwiOworICAgICAgY2FzZSBJbWFnZUxheW91dDo6ZURlcHRoQXR0YWNobWVudFN0ZW5jaWxSZWFkT25seU9wdGltYWwgOiByZXR1cm4gIkRlcHRoQXR0YWNobWVudFN0ZW5jaWxSZWFkT25seU9wdGltYWwiOworICAgICAgY2FzZSBJbWFnZUxheW91dDo6ZVByZXNlbnRTcmNLSFIgOiByZXR1cm4gIlByZXNlbnRTcmNLSFIiOworICAgICAgY2FzZSBJbWFnZUxheW91dDo6ZVNoYXJlZFByZXNlbnRLSFIgOiByZXR1cm4gIlNoYXJlZFByZXNlbnRLSFIiOworICAgICAgY2FzZSBJbWFnZUxheW91dDo6ZVNoYWRpbmdSYXRlT3B0aW1hbE5WIDogcmV0dXJuICJTaGFkaW5nUmF0ZU9wdGltYWxOViI7CisgICAgICBjYXNlIEltYWdlTGF5b3V0OjplRnJhZ21lbnREZW5zaXR5TWFwT3B0aW1hbEVYVCA6IHJldHVybiAiRnJhZ21lbnREZW5zaXR5TWFwT3B0aW1hbEVYVCI7CisgICAgICBjYXNlIEltYWdlTGF5b3V0OjplRGVwdGhBdHRhY2htZW50T3B0aW1hbEtIUiA6IHJldHVybiAiRGVwdGhBdHRhY2htZW50T3B0aW1hbEtIUiI7CisgICAgICBjYXNlIEltYWdlTGF5b3V0OjplRGVwdGhSZWFkT25seU9wdGltYWxLSFIgOiByZXR1cm4gIkRlcHRoUmVhZE9ubHlPcHRpbWFsS0hSIjsKKyAgICAgIGNhc2UgSW1hZ2VMYXlvdXQ6OmVTdGVuY2lsQXR0YWNobWVudE9wdGltYWxLSFIgOiByZXR1cm4gIlN0ZW5jaWxBdHRhY2htZW50T3B0aW1hbEtIUiI7CisgICAgICBjYXNlIEltYWdlTGF5b3V0OjplU3RlbmNpbFJlYWRPbmx5T3B0aW1hbEtIUiA6IHJldHVybiAiU3RlbmNpbFJlYWRPbmx5T3B0aW1hbEtIUiI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgSW1hZ2VUaWxpbmcKKyAgeworICAgIGVPcHRpbWFsID0gVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgZUxpbmVhciA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVIsCisgICAgZURybUZvcm1hdE1vZGlmaWVyRVhUID0gVktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBJbWFnZVRpbGluZyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBJbWFnZVRpbGluZzo6ZU9wdGltYWwgOiByZXR1cm4gIk9wdGltYWwiOworICAgICAgY2FzZSBJbWFnZVRpbGluZzo6ZUxpbmVhciA6IHJldHVybiAiTGluZWFyIjsKKyAgICAgIGNhc2UgSW1hZ2VUaWxpbmc6OmVEcm1Gb3JtYXRNb2RpZmllckVYVCA6IHJldHVybiAiRHJtRm9ybWF0TW9kaWZpZXJFWFQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEltYWdlVHlwZQorICB7CisgICAgZTFEID0gVktfSU1BR0VfVFlQRV8xRCwKKyAgICBlMkQgPSBWS19JTUFHRV9UWVBFXzJELAorICAgIGUzRCA9IFZLX0lNQUdFX1RZUEVfM0QKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEltYWdlVHlwZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBJbWFnZVR5cGU6OmUxRCA6IHJldHVybiAiMUQiOworICAgICAgY2FzZSBJbWFnZVR5cGU6OmUyRCA6IHJldHVybiAiMkQiOworICAgICAgY2FzZSBJbWFnZVR5cGU6OmUzRCA6IHJldHVybiAiM0QiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEltYWdlVmlld1R5cGUKKyAgeworICAgIGUxRCA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8xRCwKKyAgICBlMkQgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQsCisgICAgZTNEID0gVktfSU1BR0VfVklFV19UWVBFXzNELAorICAgIGVDdWJlID0gVktfSU1BR0VfVklFV19UWVBFX0NVQkUsCisgICAgZTFEQXJyYXkgPSBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksCisgICAgZTJEQXJyYXkgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVksCisgICAgZUN1YmVBcnJheSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBJbWFnZVZpZXdUeXBlIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEltYWdlVmlld1R5cGU6OmUxRCA6IHJldHVybiAiMUQiOworICAgICAgY2FzZSBJbWFnZVZpZXdUeXBlOjplMkQgOiByZXR1cm4gIjJEIjsKKyAgICAgIGNhc2UgSW1hZ2VWaWV3VHlwZTo6ZTNEIDogcmV0dXJuICIzRCI7CisgICAgICBjYXNlIEltYWdlVmlld1R5cGU6OmVDdWJlIDogcmV0dXJuICJDdWJlIjsKKyAgICAgIGNhc2UgSW1hZ2VWaWV3VHlwZTo6ZTFEQXJyYXkgOiByZXR1cm4gIjFEQXJyYXkiOworICAgICAgY2FzZSBJbWFnZVZpZXdUeXBlOjplMkRBcnJheSA6IHJldHVybiAiMkRBcnJheSI7CisgICAgICBjYXNlIEltYWdlVmlld1R5cGU6OmVDdWJlQXJyYXkgOiByZXR1cm4gIkN1YmVBcnJheSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgSW5kZXhUeXBlCisgIHsKKyAgICBlVWludDE2ID0gVktfSU5ERVhfVFlQRV9VSU5UMTYsCisgICAgZVVpbnQzMiA9IFZLX0lOREVYX1RZUEVfVUlOVDMyLAorICAgIGVOb25lTlYgPSBWS19JTkRFWF9UWVBFX05PTkVfTlYsCisgICAgZVVpbnQ4RVhUID0gVktfSU5ERVhfVFlQRV9VSU5UOF9FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEluZGV4VHlwZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBJbmRleFR5cGU6OmVVaW50MTYgOiByZXR1cm4gIlVpbnQxNiI7CisgICAgICBjYXNlIEluZGV4VHlwZTo6ZVVpbnQzMiA6IHJldHVybiAiVWludDMyIjsKKyAgICAgIGNhc2UgSW5kZXhUeXBlOjplTm9uZU5WIDogcmV0dXJuICJOb25lTlYiOworICAgICAgY2FzZSBJbmRleFR5cGU6OmVVaW50OEVYVCA6IHJldHVybiAiVWludDhFWFQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEluZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlgKKyAgeworICAgIGVQaXBlbGluZSA9IFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfUElQRUxJTkVfTlZYLAorICAgIGVEZXNjcmlwdG9yU2V0ID0gVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ERVNDUklQVE9SX1NFVF9OVlgsCisgICAgZUluZGV4QnVmZmVyID0gVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9JTkRFWF9CVUZGRVJfTlZYLAorICAgIGVWZXJ0ZXhCdWZmZXIgPSBWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX1ZFUlRFWF9CVUZGRVJfTlZYLAorICAgIGVQdXNoQ29uc3RhbnQgPSBWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX1BVU0hfQ09OU1RBTlRfTlZYLAorICAgIGVEcmF3SW5kZXhlZCA9IFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19JTkRFWEVEX05WWCwKKyAgICBlRHJhdyA9IFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19OVlgsCisgICAgZURpc3BhdGNoID0gVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ESVNQQVRDSF9OVlgKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEluZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlggdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWDo6ZVBpcGVsaW5lIDogcmV0dXJuICJQaXBlbGluZSI7CisgICAgICBjYXNlIEluZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlg6OmVEZXNjcmlwdG9yU2V0IDogcmV0dXJuICJEZXNjcmlwdG9yU2V0IjsKKyAgICAgIGNhc2UgSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWDo6ZUluZGV4QnVmZmVyIDogcmV0dXJuICJJbmRleEJ1ZmZlciI7CisgICAgICBjYXNlIEluZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlg6OmVWZXJ0ZXhCdWZmZXIgOiByZXR1cm4gIlZlcnRleEJ1ZmZlciI7CisgICAgICBjYXNlIEluZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlg6OmVQdXNoQ29uc3RhbnQgOiByZXR1cm4gIlB1c2hDb25zdGFudCI7CisgICAgICBjYXNlIEluZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlg6OmVEcmF3SW5kZXhlZCA6IHJldHVybiAiRHJhd0luZGV4ZWQiOworICAgICAgY2FzZSBJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYOjplRHJhdyA6IHJldHVybiAiRHJhdyI7CisgICAgICBjYXNlIEluZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlg6OmVEaXNwYXRjaCA6IHJldHVybiAiRGlzcGF0Y2giOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIEludGVybmFsQWxsb2NhdGlvblR5cGUKKyAgeworICAgIGVFeGVjdXRhYmxlID0gVktfSU5URVJOQUxfQUxMT0NBVElPTl9UWVBFX0VYRUNVVEFCTEUKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEludGVybmFsQWxsb2NhdGlvblR5cGUgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgSW50ZXJuYWxBbGxvY2F0aW9uVHlwZTo6ZUV4ZWN1dGFibGUgOiByZXR1cm4gIkV4ZWN1dGFibGUiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIExpbmVSYXN0ZXJpemF0aW9uTW9kZUVYVAorICB7CisgICAgZURlZmF1bHQgPSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVCwKKyAgICBlUmVjdGFuZ3VsYXIgPSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9FWFQsCisgICAgZUJyZXNlbmhhbSA9IFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX0JSRVNFTkhBTV9FWFQsCisgICAgZVJlY3Rhbmd1bGFyU21vb3RoID0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfU01PT1RIX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIExpbmVSYXN0ZXJpemF0aW9uTW9kZUVYVDo6ZURlZmF1bHQgOiByZXR1cm4gIkRlZmF1bHQiOworICAgICAgY2FzZSBMaW5lUmFzdGVyaXphdGlvbk1vZGVFWFQ6OmVSZWN0YW5ndWxhciA6IHJldHVybiAiUmVjdGFuZ3VsYXIiOworICAgICAgY2FzZSBMaW5lUmFzdGVyaXphdGlvbk1vZGVFWFQ6OmVCcmVzZW5oYW0gOiByZXR1cm4gIkJyZXNlbmhhbSI7CisgICAgICBjYXNlIExpbmVSYXN0ZXJpemF0aW9uTW9kZUVYVDo6ZVJlY3Rhbmd1bGFyU21vb3RoIDogcmV0dXJuICJSZWN0YW5ndWxhclNtb290aCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgTG9naWNPcAorICB7CisgICAgZUNsZWFyID0gVktfTE9HSUNfT1BfQ0xFQVIsCisgICAgZUFuZCA9IFZLX0xPR0lDX09QX0FORCwKKyAgICBlQW5kUmV2ZXJzZSA9IFZLX0xPR0lDX09QX0FORF9SRVZFUlNFLAorICAgIGVDb3B5ID0gVktfTE9HSUNfT1BfQ09QWSwKKyAgICBlQW5kSW52ZXJ0ZWQgPSBWS19MT0dJQ19PUF9BTkRfSU5WRVJURUQsCisgICAgZU5vT3AgPSBWS19MT0dJQ19PUF9OT19PUCwKKyAgICBlWG9yID0gVktfTE9HSUNfT1BfWE9SLAorICAgIGVPciA9IFZLX0xPR0lDX09QX09SLAorICAgIGVOb3IgPSBWS19MT0dJQ19PUF9OT1IsCisgICAgZUVxdWl2YWxlbnQgPSBWS19MT0dJQ19PUF9FUVVJVkFMRU5ULAorICAgIGVJbnZlcnQgPSBWS19MT0dJQ19PUF9JTlZFUlQsCisgICAgZU9yUmV2ZXJzZSA9IFZLX0xPR0lDX09QX09SX1JFVkVSU0UsCisgICAgZUNvcHlJbnZlcnRlZCA9IFZLX0xPR0lDX09QX0NPUFlfSU5WRVJURUQsCisgICAgZU9ySW52ZXJ0ZWQgPSBWS19MT0dJQ19PUF9PUl9JTlZFUlRFRCwKKyAgICBlTmFuZCA9IFZLX0xPR0lDX09QX05BTkQsCisgICAgZVNldCA9IFZLX0xPR0lDX09QX1NFVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggTG9naWNPcCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBMb2dpY09wOjplQ2xlYXIgOiByZXR1cm4gIkNsZWFyIjsKKyAgICAgIGNhc2UgTG9naWNPcDo6ZUFuZCA6IHJldHVybiAiQW5kIjsKKyAgICAgIGNhc2UgTG9naWNPcDo6ZUFuZFJldmVyc2UgOiByZXR1cm4gIkFuZFJldmVyc2UiOworICAgICAgY2FzZSBMb2dpY09wOjplQ29weSA6IHJldHVybiAiQ29weSI7CisgICAgICBjYXNlIExvZ2ljT3A6OmVBbmRJbnZlcnRlZCA6IHJldHVybiAiQW5kSW52ZXJ0ZWQiOworICAgICAgY2FzZSBMb2dpY09wOjplTm9PcCA6IHJldHVybiAiTm9PcCI7CisgICAgICBjYXNlIExvZ2ljT3A6OmVYb3IgOiByZXR1cm4gIlhvciI7CisgICAgICBjYXNlIExvZ2ljT3A6OmVPciA6IHJldHVybiAiT3IiOworICAgICAgY2FzZSBMb2dpY09wOjplTm9yIDogcmV0dXJuICJOb3IiOworICAgICAgY2FzZSBMb2dpY09wOjplRXF1aXZhbGVudCA6IHJldHVybiAiRXF1aXZhbGVudCI7CisgICAgICBjYXNlIExvZ2ljT3A6OmVJbnZlcnQgOiByZXR1cm4gIkludmVydCI7CisgICAgICBjYXNlIExvZ2ljT3A6OmVPclJldmVyc2UgOiByZXR1cm4gIk9yUmV2ZXJzZSI7CisgICAgICBjYXNlIExvZ2ljT3A6OmVDb3B5SW52ZXJ0ZWQgOiByZXR1cm4gIkNvcHlJbnZlcnRlZCI7CisgICAgICBjYXNlIExvZ2ljT3A6OmVPckludmVydGVkIDogcmV0dXJuICJPckludmVydGVkIjsKKyAgICAgIGNhc2UgTG9naWNPcDo6ZU5hbmQgOiByZXR1cm4gIk5hbmQiOworICAgICAgY2FzZSBMb2dpY09wOjplU2V0IDogcmV0dXJuICJTZXQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIE1lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTUQKKyAgeworICAgIGVEZWZhdWx0ID0gVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RFRkFVTFRfQU1ELAorICAgIGVBbGxvd2VkID0gVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0FMTE9XRURfQU1ELAorICAgIGVEaXNhbGxvd2VkID0gVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RJU0FMTE9XRURfQU1ECisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIE1lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTUQ6OmVEZWZhdWx0IDogcmV0dXJuICJEZWZhdWx0IjsKKyAgICAgIGNhc2UgTWVtb3J5T3ZlcmFsbG9jYXRpb25CZWhhdmlvckFNRDo6ZUFsbG93ZWQgOiByZXR1cm4gIkFsbG93ZWQiOworICAgICAgY2FzZSBNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EOjplRGlzYWxsb3dlZCA6IHJldHVybiAiRGlzYWxsb3dlZCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgT2JqZWN0RW50cnlUeXBlTlZYCisgIHsKKyAgICBlRGVzY3JpcHRvclNldCA9IFZLX09CSkVDVF9FTlRSWV9UWVBFX0RFU0NSSVBUT1JfU0VUX05WWCwKKyAgICBlUGlwZWxpbmUgPSBWS19PQkpFQ1RfRU5UUllfVFlQRV9QSVBFTElORV9OVlgsCisgICAgZUluZGV4QnVmZmVyID0gVktfT0JKRUNUX0VOVFJZX1RZUEVfSU5ERVhfQlVGRkVSX05WWCwKKyAgICBlVmVydGV4QnVmZmVyID0gVktfT0JKRUNUX0VOVFJZX1RZUEVfVkVSVEVYX0JVRkZFUl9OVlgsCisgICAgZVB1c2hDb25zdGFudCA9IFZLX09CSkVDVF9FTlRSWV9UWVBFX1BVU0hfQ09OU1RBTlRfTlZYCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBPYmplY3RFbnRyeVR5cGVOVlggdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgT2JqZWN0RW50cnlUeXBlTlZYOjplRGVzY3JpcHRvclNldCA6IHJldHVybiAiRGVzY3JpcHRvclNldCI7CisgICAgICBjYXNlIE9iamVjdEVudHJ5VHlwZU5WWDo6ZVBpcGVsaW5lIDogcmV0dXJuICJQaXBlbGluZSI7CisgICAgICBjYXNlIE9iamVjdEVudHJ5VHlwZU5WWDo6ZUluZGV4QnVmZmVyIDogcmV0dXJuICJJbmRleEJ1ZmZlciI7CisgICAgICBjYXNlIE9iamVjdEVudHJ5VHlwZU5WWDo6ZVZlcnRleEJ1ZmZlciA6IHJldHVybiAiVmVydGV4QnVmZmVyIjsKKyAgICAgIGNhc2UgT2JqZWN0RW50cnlUeXBlTlZYOjplUHVzaENvbnN0YW50IDogcmV0dXJuICJQdXNoQ29uc3RhbnQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIE9iamVjdFR5cGUKKyAgeworICAgIGVVbmtub3duID0gVktfT0JKRUNUX1RZUEVfVU5LTk9XTiwKKyAgICBlSW5zdGFuY2UgPSBWS19PQkpFQ1RfVFlQRV9JTlNUQU5DRSwKKyAgICBlUGh5c2ljYWxEZXZpY2UgPSBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0UsCisgICAgZURldmljZSA9IFZLX09CSkVDVF9UWVBFX0RFVklDRSwKKyAgICBlUXVldWUgPSBWS19PQkpFQ1RfVFlQRV9RVUVVRSwKKyAgICBlU2VtYXBob3JlID0gVktfT0JKRUNUX1RZUEVfU0VNQVBIT1JFLAorICAgIGVDb21tYW5kQnVmZmVyID0gVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVIsCisgICAgZUZlbmNlID0gVktfT0JKRUNUX1RZUEVfRkVOQ0UsCisgICAgZURldmljZU1lbW9yeSA9IFZLX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUlksCisgICAgZUJ1ZmZlciA9IFZLX09CSkVDVF9UWVBFX0JVRkZFUiwKKyAgICBlSW1hZ2UgPSBWS19PQkpFQ1RfVFlQRV9JTUFHRSwKKyAgICBlRXZlbnQgPSBWS19PQkpFQ1RfVFlQRV9FVkVOVCwKKyAgICBlUXVlcnlQb29sID0gVktfT0JKRUNUX1RZUEVfUVVFUllfUE9PTCwKKyAgICBlQnVmZmVyVmlldyA9IFZLX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXLAorICAgIGVJbWFnZVZpZXcgPSBWS19PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXLAorICAgIGVTaGFkZXJNb2R1bGUgPSBWS19PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFLAorICAgIGVQaXBlbGluZUNhY2hlID0gVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEUsCisgICAgZVBpcGVsaW5lTGF5b3V0ID0gVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VULAorICAgIGVSZW5kZXJQYXNzID0gVktfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1MsCisgICAgZVBpcGVsaW5lID0gVktfT0JKRUNUX1RZUEVfUElQRUxJTkUsCisgICAgZURlc2NyaXB0b3JTZXRMYXlvdXQgPSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVQsCisgICAgZVNhbXBsZXIgPSBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSLAorICAgIGVEZXNjcmlwdG9yUG9vbCA9IFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTCwKKyAgICBlRGVzY3JpcHRvclNldCA9IFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VULAorICAgIGVGcmFtZWJ1ZmZlciA9IFZLX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSLAorICAgIGVDb21tYW5kUG9vbCA9IFZLX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTCwKKyAgICBlU2FtcGxlclljYmNyQ29udmVyc2lvbiA9IFZLX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTiwKKyAgICBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEUsCisgICAgZVN1cmZhY2VLSFIgPSBWS19PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUiwKKyAgICBlU3dhcGNoYWluS0hSID0gVktfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUiwKKyAgICBlRGlzcGxheUtIUiA9IFZLX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSLAorICAgIGVEaXNwbGF5TW9kZUtIUiA9IFZLX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFIsCisgICAgZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPSBWS19PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfRVhULAorICAgIGVPYmplY3RUYWJsZU5WWCA9IFZLX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlgsCisgICAgZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggPSBWS19PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYLAorICAgIGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0gVktfT0JKRUNUX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0VYVCwKKyAgICBlVmFsaWRhdGlvbkNhY2hlRVhUID0gVktfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFQsCisgICAgZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gVktfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViwKKyAgICBlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSBWS19PQkpFQ1RfVFlQRV9QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX0lOVEVMLAorICAgIGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9LSFIsCisgICAgZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPSBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBPYmplY3RUeXBlIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVVbmtub3duIDogcmV0dXJuICJVbmtub3duIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZUluc3RhbmNlIDogcmV0dXJuICJJbnN0YW5jZSI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVQaHlzaWNhbERldmljZSA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2UiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplRGV2aWNlIDogcmV0dXJuICJEZXZpY2UiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplUXVldWUgOiByZXR1cm4gIlF1ZXVlIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZVNlbWFwaG9yZSA6IHJldHVybiAiU2VtYXBob3JlIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZUNvbW1hbmRCdWZmZXIgOiByZXR1cm4gIkNvbW1hbmRCdWZmZXIiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplRmVuY2UgOiByZXR1cm4gIkZlbmNlIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZURldmljZU1lbW9yeSA6IHJldHVybiAiRGV2aWNlTWVtb3J5IjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZUJ1ZmZlciA6IHJldHVybiAiQnVmZmVyIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZUltYWdlIDogcmV0dXJuICJJbWFnZSI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVFdmVudCA6IHJldHVybiAiRXZlbnQiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplUXVlcnlQb29sIDogcmV0dXJuICJRdWVyeVBvb2wiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplQnVmZmVyVmlldyA6IHJldHVybiAiQnVmZmVyVmlldyI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVJbWFnZVZpZXcgOiByZXR1cm4gIkltYWdlVmlldyI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVTaGFkZXJNb2R1bGUgOiByZXR1cm4gIlNoYWRlck1vZHVsZSI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVQaXBlbGluZUNhY2hlIDogcmV0dXJuICJQaXBlbGluZUNhY2hlIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZVBpcGVsaW5lTGF5b3V0IDogcmV0dXJuICJQaXBlbGluZUxheW91dCI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVSZW5kZXJQYXNzIDogcmV0dXJuICJSZW5kZXJQYXNzIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZVBpcGVsaW5lIDogcmV0dXJuICJQaXBlbGluZSI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVEZXNjcmlwdG9yU2V0TGF5b3V0IDogcmV0dXJuICJEZXNjcmlwdG9yU2V0TGF5b3V0IjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZVNhbXBsZXIgOiByZXR1cm4gIlNhbXBsZXIiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplRGVzY3JpcHRvclBvb2wgOiByZXR1cm4gIkRlc2NyaXB0b3JQb29sIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZURlc2NyaXB0b3JTZXQgOiByZXR1cm4gIkRlc2NyaXB0b3JTZXQiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplRnJhbWVidWZmZXIgOiByZXR1cm4gIkZyYW1lYnVmZmVyIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZUNvbW1hbmRQb29sIDogcmV0dXJuICJDb21tYW5kUG9vbCI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIDogcmV0dXJuICJTYW1wbGVyWWNiY3JDb252ZXJzaW9uIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA6IHJldHVybiAiRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZVN1cmZhY2VLSFIgOiByZXR1cm4gIlN1cmZhY2VLSFIiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplU3dhcGNoYWluS0hSIDogcmV0dXJuICJTd2FwY2hhaW5LSFIiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplRGlzcGxheUtIUiA6IHJldHVybiAiRGlzcGxheUtIUiI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVEaXNwbGF5TW9kZUtIUiA6IHJldHVybiAiRGlzcGxheU1vZGVLSFIiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplRGVidWdSZXBvcnRDYWxsYmFja0VYVCA6IHJldHVybiAiRGVidWdSZXBvcnRDYWxsYmFja0VYVCI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVPYmplY3RUYWJsZU5WWCA6IHJldHVybiAiT2JqZWN0VGFibGVOVlgiOworICAgICAgY2FzZSBPYmplY3RUeXBlOjplSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA6IHJldHVybiAiSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIDogcmV0dXJuICJEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZVZhbGlkYXRpb25DYWNoZUVYVCA6IHJldHVybiAiVmFsaWRhdGlvbkNhY2hlRVhUIjsKKyAgICAgIGNhc2UgT2JqZWN0VHlwZTo6ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIDogcmV0dXJuICJBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViI7CisgICAgICBjYXNlIE9iamVjdFR5cGU6OmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA6IHJldHVybiAiUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTAorICB7CisgICAgZUNvbW1hbmRRdWV1ZU1ldHJpY3NEaXNjb3ZlcnlBY3RpdmF0ZWQgPSBWS19QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX1RZUEVfQ09NTUFORF9RVUVVRV9NRVRSSUNTX0RJU0NPVkVSWV9BQ1RJVkFURURfSU5URUwKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUw6OmVDb21tYW5kUXVldWVNZXRyaWNzRGlzY292ZXJ5QWN0aXZhdGVkIDogcmV0dXJuICJDb21tYW5kUXVldWVNZXRyaWNzRGlzY292ZXJ5QWN0aXZhdGVkIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBQZXJmb3JtYW5jZUNvdW50ZXJTY29wZUtIUgorICB7CisgICAgZVZrUXVlcnlTY29wZUNvbW1hbmRCdWZmZXIgPSBWS19RVUVSWV9TQ09QRV9DT01NQU5EX0JVRkZFUl9LSFIsCisgICAgZVZrUXVlcnlTY29wZVJlbmRlclBhc3MgPSBWS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFIsCisgICAgZVZrUXVlcnlTY29wZUNvbW1hbmQgPSBWS19RVUVSWV9TQ09QRV9DT01NQU5EX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFIgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFI6OmVWa1F1ZXJ5U2NvcGVDb21tYW5kQnVmZmVyIDogcmV0dXJuICJWa1F1ZXJ5U2NvcGVDb21tYW5kQnVmZmVyIjsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFI6OmVWa1F1ZXJ5U2NvcGVSZW5kZXJQYXNzIDogcmV0dXJuICJWa1F1ZXJ5U2NvcGVSZW5kZXJQYXNzIjsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFI6OmVWa1F1ZXJ5U2NvcGVDb21tYW5kIDogcmV0dXJuICJWa1F1ZXJ5U2NvcGVDb21tYW5kIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSCisgIHsKKyAgICBlSW50MzIgPSBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfSU5UMzJfS0hSLAorICAgIGVJbnQ2NCA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9JTlQ2NF9LSFIsCisgICAgZVVpbnQzMiA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9VSU5UMzJfS0hSLAorICAgIGVVaW50NjQgPSBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfVUlOVDY0X0tIUiwKKyAgICBlRmxvYXQzMiA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9GTE9BVDMyX0tIUiwKKyAgICBlRmxvYXQ2NCA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9GTE9BVDY0X0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGVyZm9ybWFuY2VDb3VudGVyU3RvcmFnZUtIUiB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSOjplSW50MzIgOiByZXR1cm4gIkludDMyIjsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyU3RvcmFnZUtIUjo6ZUludDY0IDogcmV0dXJuICJJbnQ2NCI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFI6OmVVaW50MzIgOiByZXR1cm4gIlVpbnQzMiI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFI6OmVVaW50NjQgOiByZXR1cm4gIlVpbnQ2NCI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFI6OmVGbG9hdDMyIDogcmV0dXJuICJGbG9hdDMyIjsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyU3RvcmFnZUtIUjo6ZUZsb2F0NjQgOiByZXR1cm4gIkZsb2F0NjQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFBlcmZvcm1hbmNlQ291bnRlclVuaXRLSFIKKyAgeworICAgIGVHZW5lcmljID0gVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0dFTkVSSUNfS0hSLAorICAgIGVQZXJjZW50YWdlID0gVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX1BFUkNFTlRBR0VfS0hSLAorICAgIGVOYW5vc2Vjb25kcyA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9OQU5PU0VDT05EU19LSFIsCisgICAgZUJ5dGVzID0gVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0JZVEVTX0tIUiwKKyAgICBlQnl0ZXNQZXJTZWNvbmQgPSBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQllURVNfUEVSX1NFQ09ORF9LSFIsCisgICAgZUtlbHZpbiA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9LRUxWSU5fS0hSLAorICAgIGVXYXR0cyA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9XQVRUU19LSFIsCisgICAgZVZvbHRzID0gVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX1ZPTFRTX0tIUiwKKyAgICBlQW1wcyA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9BTVBTX0tIUiwKKyAgICBlSGVydHogPSBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfSEVSVFpfS0hSLAorICAgIGVDeWNsZXMgPSBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQ1lDTEVTX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUiB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSOjplR2VuZXJpYyA6IHJldHVybiAiR2VuZXJpYyI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlQ291bnRlclVuaXRLSFI6OmVQZXJjZW50YWdlIDogcmV0dXJuICJQZXJjZW50YWdlIjsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUjo6ZU5hbm9zZWNvbmRzIDogcmV0dXJuICJOYW5vc2Vjb25kcyI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlQ291bnRlclVuaXRLSFI6OmVCeXRlcyA6IHJldHVybiAiQnl0ZXMiOworICAgICAgY2FzZSBQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSOjplQnl0ZXNQZXJTZWNvbmQgOiByZXR1cm4gIkJ5dGVzUGVyU2Vjb25kIjsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUjo6ZUtlbHZpbiA6IHJldHVybiAiS2VsdmluIjsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUjo6ZVdhdHRzIDogcmV0dXJuICJXYXR0cyI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlQ291bnRlclVuaXRLSFI6OmVWb2x0cyA6IHJldHVybiAiVm9sdHMiOworICAgICAgY2FzZSBQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSOjplQW1wcyA6IHJldHVybiAiQW1wcyI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlQ291bnRlclVuaXRLSFI6OmVIZXJ0eiA6IHJldHVybiAiSGVydHoiOworICAgICAgY2FzZSBQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSOjplQ3ljbGVzIDogcmV0dXJuICJDeWNsZXMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFBlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUwKKyAgeworICAgIGVOdWxsSGFyZHdhcmUgPSBWS19QRVJGT1JNQU5DRV9PVkVSUklERV9UWVBFX05VTExfSEFSRFdBUkVfSU5URUwsCisgICAgZUZsdXNoR3B1Q2FjaGVzID0gVktfUEVSRk9STUFOQ0VfT1ZFUlJJREVfVFlQRV9GTFVTSF9HUFVfQ0FDSEVTX0lOVEVMCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUw6OmVOdWxsSGFyZHdhcmUgOiByZXR1cm4gIk51bGxIYXJkd2FyZSI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUw6OmVGbHVzaEdwdUNhY2hlcyA6IHJldHVybiAiRmx1c2hHcHVDYWNoZXMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFBlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMCisgIHsKKyAgICBlSHdDb3VudGVyc1N1cHBvcnRlZCA9IFZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX0hXX0NPVU5URVJTX1NVUFBPUlRFRF9JTlRFTCwKKyAgICBlU3RyZWFtTWFya2VyVmFsaWRCaXRzID0gVktfUEVSRk9STUFOQ0VfUEFSQU1FVEVSX1RZUEVfU1RSRUFNX01BUktFUl9WQUxJRF9CSVRTX0lOVEVMCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTDo6ZUh3Q291bnRlcnNTdXBwb3J0ZWQgOiByZXR1cm4gIkh3Q291bnRlcnNTdXBwb3J0ZWQiOworICAgICAgY2FzZSBQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTDo6ZVN0cmVhbU1hcmtlclZhbGlkQml0cyA6IHJldHVybiAiU3RyZWFtTWFya2VyVmFsaWRCaXRzIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMCisgIHsKKyAgICBlVWludDMyID0gVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9VSU5UMzJfSU5URUwsCisgICAgZVVpbnQ2NCA9IFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfVUlOVDY0X0lOVEVMLAorICAgIGVGbG9hdCA9IFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfRkxPQVRfSU5URUwsCisgICAgZUJvb2wgPSBWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX0JPT0xfSU5URUwsCisgICAgZVN0cmluZyA9IFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfU1RSSU5HX0lOVEVMCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUw6OmVVaW50MzIgOiByZXR1cm4gIlVpbnQzMiI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUw6OmVVaW50NjQgOiByZXR1cm4gIlVpbnQ2NCI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUw6OmVGbG9hdCA6IHJldHVybiAiRmxvYXQiOworICAgICAgY2FzZSBQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMOjplQm9vbCA6IHJldHVybiAiQm9vbCI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUw6OmVTdHJpbmcgOiByZXR1cm4gIlN0cmluZyI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUGh5c2ljYWxEZXZpY2VUeXBlCisgIHsKKyAgICBlT3RoZXIgPSBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9PVEhFUiwKKyAgICBlSW50ZWdyYXRlZEdwdSA9IFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0lOVEVHUkFURURfR1BVLAorICAgIGVEaXNjcmV0ZUdwdSA9IFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0RJU0NSRVRFX0dQVSwKKyAgICBlVmlydHVhbEdwdSA9IFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX1ZJUlRVQUxfR1BVLAorICAgIGVDcHUgPSBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9DUFUKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBoeXNpY2FsRGV2aWNlVHlwZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBQaHlzaWNhbERldmljZVR5cGU6OmVPdGhlciA6IHJldHVybiAiT3RoZXIiOworICAgICAgY2FzZSBQaHlzaWNhbERldmljZVR5cGU6OmVJbnRlZ3JhdGVkR3B1IDogcmV0dXJuICJJbnRlZ3JhdGVkR3B1IjsKKyAgICAgIGNhc2UgUGh5c2ljYWxEZXZpY2VUeXBlOjplRGlzY3JldGVHcHUgOiByZXR1cm4gIkRpc2NyZXRlR3B1IjsKKyAgICAgIGNhc2UgUGh5c2ljYWxEZXZpY2VUeXBlOjplVmlydHVhbEdwdSA6IHJldHVybiAiVmlydHVhbEdwdSI7CisgICAgICBjYXNlIFBoeXNpY2FsRGV2aWNlVHlwZTo6ZUNwdSA6IHJldHVybiAiQ3B1IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBQaXBlbGluZUJpbmRQb2ludAorICB7CisgICAgZUdyYXBoaWNzID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywKKyAgICBlQ29tcHV0ZSA9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwKKyAgICBlUmF5VHJhY2luZ05WID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVCaW5kUG9pbnQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUGlwZWxpbmVCaW5kUG9pbnQ6OmVHcmFwaGljcyA6IHJldHVybiAiR3JhcGhpY3MiOworICAgICAgY2FzZSBQaXBlbGluZUJpbmRQb2ludDo6ZUNvbXB1dGUgOiByZXR1cm4gIkNvbXB1dGUiOworICAgICAgY2FzZSBQaXBlbGluZUJpbmRQb2ludDo6ZVJheVRyYWNpbmdOViA6IHJldHVybiAiUmF5VHJhY2luZ05WIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBQaXBlbGluZUNhY2hlSGVhZGVyVmVyc2lvbgorICB7CisgICAgZU9uZSA9IFZLX1BJUEVMSU5FX0NBQ0hFX0hFQURFUl9WRVJTSU9OX09ORQorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVDYWNoZUhlYWRlclZlcnNpb24gdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUGlwZWxpbmVDYWNoZUhlYWRlclZlcnNpb246OmVPbmUgOiByZXR1cm4gIk9uZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljRm9ybWF0S0hSCisgIHsKKyAgICBlQm9vbDMyID0gVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX0JPT0wzMl9LSFIsCisgICAgZUludDY0ID0gVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX0lOVDY0X0tIUiwKKyAgICBlVWludDY0ID0gVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX1VJTlQ2NF9LSFIsCisgICAgZUZsb2F0NjQgPSBWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfRkxPQVQ2NF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0Zvcm1hdEtIUiB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNGb3JtYXRLSFI6OmVCb29sMzIgOiByZXR1cm4gIkJvb2wzMiI7CisgICAgICBjYXNlIFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0Zvcm1hdEtIUjo6ZUludDY0IDogcmV0dXJuICJJbnQ2NCI7CisgICAgICBjYXNlIFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0Zvcm1hdEtIUjo6ZVVpbnQ2NCA6IHJldHVybiAiVWludDY0IjsKKyAgICAgIGNhc2UgUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljRm9ybWF0S0hSOjplRmxvYXQ2NCA6IHJldHVybiAiRmxvYXQ2NCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUG9pbnRDbGlwcGluZ0JlaGF2aW9yCisgIHsKKyAgICBlQWxsQ2xpcFBsYW5lcyA9IFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX0FMTF9DTElQX1BMQU5FUywKKyAgICBlVXNlckNsaXBQbGFuZXNPbmx5ID0gVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfVVNFUl9DTElQX1BMQU5FU19PTkxZLAorICAgIGVBbGxDbGlwUGxhbmVzS0hSID0gVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfQUxMX0NMSVBfUExBTkVTX0tIUiwKKyAgICBlVXNlckNsaXBQbGFuZXNPbmx5S0hSID0gVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfVVNFUl9DTElQX1BMQU5FU19PTkxZX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUG9pbnRDbGlwcGluZ0JlaGF2aW9yIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFBvaW50Q2xpcHBpbmdCZWhhdmlvcjo6ZUFsbENsaXBQbGFuZXMgOiByZXR1cm4gIkFsbENsaXBQbGFuZXMiOworICAgICAgY2FzZSBQb2ludENsaXBwaW5nQmVoYXZpb3I6OmVVc2VyQ2xpcFBsYW5lc09ubHkgOiByZXR1cm4gIlVzZXJDbGlwUGxhbmVzT25seSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUG9seWdvbk1vZGUKKyAgeworICAgIGVGaWxsID0gVktfUE9MWUdPTl9NT0RFX0ZJTEwsCisgICAgZUxpbmUgPSBWS19QT0xZR09OX01PREVfTElORSwKKyAgICBlUG9pbnQgPSBWS19QT0xZR09OX01PREVfUE9JTlQsCisgICAgZUZpbGxSZWN0YW5nbGVOViA9IFZLX1BPTFlHT05fTU9ERV9GSUxMX1JFQ1RBTkdMRV9OVgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUG9seWdvbk1vZGUgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUG9seWdvbk1vZGU6OmVGaWxsIDogcmV0dXJuICJGaWxsIjsKKyAgICAgIGNhc2UgUG9seWdvbk1vZGU6OmVMaW5lIDogcmV0dXJuICJMaW5lIjsKKyAgICAgIGNhc2UgUG9seWdvbk1vZGU6OmVQb2ludCA6IHJldHVybiAiUG9pbnQiOworICAgICAgY2FzZSBQb2x5Z29uTW9kZTo6ZUZpbGxSZWN0YW5nbGVOViA6IHJldHVybiAiRmlsbFJlY3RhbmdsZU5WIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBQcmVzZW50TW9kZUtIUgorICB7CisgICAgZUltbWVkaWF0ZSA9IFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSLAorICAgIGVNYWlsYm94ID0gVktfUFJFU0VOVF9NT0RFX01BSUxCT1hfS0hSLAorICAgIGVGaWZvID0gVktfUFJFU0VOVF9NT0RFX0ZJRk9fS0hSLAorICAgIGVGaWZvUmVsYXhlZCA9IFZLX1BSRVNFTlRfTU9ERV9GSUZPX1JFTEFYRURfS0hSLAorICAgIGVTaGFyZWREZW1hbmRSZWZyZXNoID0gVktfUFJFU0VOVF9NT0RFX1NIQVJFRF9ERU1BTkRfUkVGUkVTSF9LSFIsCisgICAgZVNoYXJlZENvbnRpbnVvdXNSZWZyZXNoID0gVktfUFJFU0VOVF9NT0RFX1NIQVJFRF9DT05USU5VT1VTX1JFRlJFU0hfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQcmVzZW50TW9kZUtIUiB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBQcmVzZW50TW9kZUtIUjo6ZUltbWVkaWF0ZSA6IHJldHVybiAiSW1tZWRpYXRlIjsKKyAgICAgIGNhc2UgUHJlc2VudE1vZGVLSFI6OmVNYWlsYm94IDogcmV0dXJuICJNYWlsYm94IjsKKyAgICAgIGNhc2UgUHJlc2VudE1vZGVLSFI6OmVGaWZvIDogcmV0dXJuICJGaWZvIjsKKyAgICAgIGNhc2UgUHJlc2VudE1vZGVLSFI6OmVGaWZvUmVsYXhlZCA6IHJldHVybiAiRmlmb1JlbGF4ZWQiOworICAgICAgY2FzZSBQcmVzZW50TW9kZUtIUjo6ZVNoYXJlZERlbWFuZFJlZnJlc2ggOiByZXR1cm4gIlNoYXJlZERlbWFuZFJlZnJlc2giOworICAgICAgY2FzZSBQcmVzZW50TW9kZUtIUjo6ZVNoYXJlZENvbnRpbnVvdXNSZWZyZXNoIDogcmV0dXJuICJTaGFyZWRDb250aW51b3VzUmVmcmVzaCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUHJpbWl0aXZlVG9wb2xvZ3kKKyAgeworICAgIGVQb2ludExpc3QgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfUE9JTlRfTElTVCwKKyAgICBlTGluZUxpc3QgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9MSVNULAorICAgIGVMaW5lU3RyaXAgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUCwKKyAgICBlVHJpYW5nbGVMaXN0ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1QsCisgICAgZVRyaWFuZ2xlU3RyaXAgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfU1RSSVAsCisgICAgZVRyaWFuZ2xlRmFuID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0ZBTiwKKyAgICBlTGluZUxpc3RXaXRoQWRqYWNlbmN5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVF9XSVRIX0FESkFDRU5DWSwKKyAgICBlTGluZVN0cmlwV2l0aEFkamFjZW5jeSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX1NUUklQX1dJVEhfQURKQUNFTkNZLAorICAgIGVUcmlhbmdsZUxpc3RXaXRoQWRqYWNlbmN5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1RfV0lUSF9BREpBQ0VOQ1ksCisgICAgZVRyaWFuZ2xlU3RyaXBXaXRoQWRqYWNlbmN5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQX1dJVEhfQURKQUNFTkNZLAorICAgIGVQYXRjaExpc3QgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUHJpbWl0aXZlVG9wb2xvZ3kgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUHJpbWl0aXZlVG9wb2xvZ3k6OmVQb2ludExpc3QgOiByZXR1cm4gIlBvaW50TGlzdCI7CisgICAgICBjYXNlIFByaW1pdGl2ZVRvcG9sb2d5OjplTGluZUxpc3QgOiByZXR1cm4gIkxpbmVMaXN0IjsKKyAgICAgIGNhc2UgUHJpbWl0aXZlVG9wb2xvZ3k6OmVMaW5lU3RyaXAgOiByZXR1cm4gIkxpbmVTdHJpcCI7CisgICAgICBjYXNlIFByaW1pdGl2ZVRvcG9sb2d5OjplVHJpYW5nbGVMaXN0IDogcmV0dXJuICJUcmlhbmdsZUxpc3QiOworICAgICAgY2FzZSBQcmltaXRpdmVUb3BvbG9neTo6ZVRyaWFuZ2xlU3RyaXAgOiByZXR1cm4gIlRyaWFuZ2xlU3RyaXAiOworICAgICAgY2FzZSBQcmltaXRpdmVUb3BvbG9neTo6ZVRyaWFuZ2xlRmFuIDogcmV0dXJuICJUcmlhbmdsZUZhbiI7CisgICAgICBjYXNlIFByaW1pdGl2ZVRvcG9sb2d5OjplTGluZUxpc3RXaXRoQWRqYWNlbmN5IDogcmV0dXJuICJMaW5lTGlzdFdpdGhBZGphY2VuY3kiOworICAgICAgY2FzZSBQcmltaXRpdmVUb3BvbG9neTo6ZUxpbmVTdHJpcFdpdGhBZGphY2VuY3kgOiByZXR1cm4gIkxpbmVTdHJpcFdpdGhBZGphY2VuY3kiOworICAgICAgY2FzZSBQcmltaXRpdmVUb3BvbG9neTo6ZVRyaWFuZ2xlTGlzdFdpdGhBZGphY2VuY3kgOiByZXR1cm4gIlRyaWFuZ2xlTGlzdFdpdGhBZGphY2VuY3kiOworICAgICAgY2FzZSBQcmltaXRpdmVUb3BvbG9neTo6ZVRyaWFuZ2xlU3RyaXBXaXRoQWRqYWNlbmN5IDogcmV0dXJuICJUcmlhbmdsZVN0cmlwV2l0aEFkamFjZW5jeSI7CisgICAgICBjYXNlIFByaW1pdGl2ZVRvcG9sb2d5OjplUGF0Y2hMaXN0IDogcmV0dXJuICJQYXRjaExpc3QiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFF1ZXJ5UG9vbFNhbXBsaW5nTW9kZUlOVEVMCisgIHsKKyAgICBlTWFudWFsID0gVktfUVVFUllfUE9PTF9TQU1QTElOR19NT0RFX01BTlVBTF9JTlRFTAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUXVlcnlQb29sU2FtcGxpbmdNb2RlSU5URUwgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUXVlcnlQb29sU2FtcGxpbmdNb2RlSU5URUw6OmVNYW51YWwgOiByZXR1cm4gIk1hbnVhbCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUXVlcnlUeXBlCisgIHsKKyAgICBlT2NjbHVzaW9uID0gVktfUVVFUllfVFlQRV9PQ0NMVVNJT04sCisgICAgZVBpcGVsaW5lU3RhdGlzdGljcyA9IFZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUywKKyAgICBlVGltZXN0YW1wID0gVktfUVVFUllfVFlQRV9USU1FU1RBTVAsCisgICAgZVRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRVhUID0gVktfUVVFUllfVFlQRV9UUkFOU0ZPUk1fRkVFREJBQ0tfU1RSRUFNX0VYVCwKKyAgICBlUGVyZm9ybWFuY2VRdWVyeUtIUiA9IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSLAorICAgIGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb21wYWN0ZWRTaXplTlYgPSBWS19RVUVSWV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ09NUEFDVEVEX1NJWkVfTlYsCisgICAgZVBlcmZvcm1hbmNlUXVlcnlJTlRFTCA9IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfSU5URUwKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFF1ZXJ5VHlwZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBRdWVyeVR5cGU6OmVPY2NsdXNpb24gOiByZXR1cm4gIk9jY2x1c2lvbiI7CisgICAgICBjYXNlIFF1ZXJ5VHlwZTo6ZVBpcGVsaW5lU3RhdGlzdGljcyA6IHJldHVybiAiUGlwZWxpbmVTdGF0aXN0aWNzIjsKKyAgICAgIGNhc2UgUXVlcnlUeXBlOjplVGltZXN0YW1wIDogcmV0dXJuICJUaW1lc3RhbXAiOworICAgICAgY2FzZSBRdWVyeVR5cGU6OmVUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbUVYVCA6IHJldHVybiAiVHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1FWFQiOworICAgICAgY2FzZSBRdWVyeVR5cGU6OmVQZXJmb3JtYW5jZVF1ZXJ5S0hSIDogcmV0dXJuICJQZXJmb3JtYW5jZVF1ZXJ5S0hSIjsKKyAgICAgIGNhc2UgUXVlcnlUeXBlOjplQWNjZWxlcmF0aW9uU3RydWN0dXJlQ29tcGFjdGVkU2l6ZU5WIDogcmV0dXJuICJBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb21wYWN0ZWRTaXplTlYiOworICAgICAgY2FzZSBRdWVyeVR5cGU6OmVQZXJmb3JtYW5jZVF1ZXJ5SU5URUwgOiByZXR1cm4gIlBlcmZvcm1hbmNlUXVlcnlJTlRFTCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUXVldWVHbG9iYWxQcmlvcml0eUVYVAorICB7CisgICAgZUxvdyA9IFZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9MT1dfRVhULAorICAgIGVNZWRpdW0gPSBWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfTUVESVVNX0VYVCwKKyAgICBlSGlnaCA9IFZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9ISUdIX0VYVCwKKyAgICBlUmVhbHRpbWUgPSBWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfUkVBTFRJTUVfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBRdWV1ZUdsb2JhbFByaW9yaXR5RVhUIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFF1ZXVlR2xvYmFsUHJpb3JpdHlFWFQ6OmVMb3cgOiByZXR1cm4gIkxvdyI7CisgICAgICBjYXNlIFF1ZXVlR2xvYmFsUHJpb3JpdHlFWFQ6OmVNZWRpdW0gOiByZXR1cm4gIk1lZGl1bSI7CisgICAgICBjYXNlIFF1ZXVlR2xvYmFsUHJpb3JpdHlFWFQ6OmVIaWdoIDogcmV0dXJuICJIaWdoIjsKKyAgICAgIGNhc2UgUXVldWVHbG9iYWxQcmlvcml0eUVYVDo6ZVJlYWx0aW1lIDogcmV0dXJuICJSZWFsdGltZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUmFzdGVyaXphdGlvbk9yZGVyQU1ECisgIHsKKyAgICBlU3RyaWN0ID0gVktfUkFTVEVSSVpBVElPTl9PUkRFUl9TVFJJQ1RfQU1ELAorICAgIGVSZWxheGVkID0gVktfUkFTVEVSSVpBVElPTl9PUkRFUl9SRUxBWEVEX0FNRAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUmFzdGVyaXphdGlvbk9yZGVyQU1EIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFJhc3Rlcml6YXRpb25PcmRlckFNRDo6ZVN0cmljdCA6IHJldHVybiAiU3RyaWN0IjsKKyAgICAgIGNhc2UgUmFzdGVyaXphdGlvbk9yZGVyQU1EOjplUmVsYXhlZCA6IHJldHVybiAiUmVsYXhlZCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgUmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WCisgIHsKKyAgICBlR2VuZXJhbCA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlYsCisgICAgZVRyaWFuZ2xlc0hpdEdyb3VwID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OViwKKyAgICBlUHJvY2VkdXJhbEhpdEdyb3VwID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfUFJPQ0VEVVJBTF9ISVRfR1JPVVBfTlYKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFJheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOViB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBSYXlUcmFjaW5nU2hhZGVyR3JvdXBUeXBlTlY6OmVHZW5lcmFsIDogcmV0dXJuICJHZW5lcmFsIjsKKyAgICAgIGNhc2UgUmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WOjplVHJpYW5nbGVzSGl0R3JvdXAgOiByZXR1cm4gIlRyaWFuZ2xlc0hpdEdyb3VwIjsKKyAgICAgIGNhc2UgUmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WOjplUHJvY2VkdXJhbEhpdEdyb3VwIDogcmV0dXJuICJQcm9jZWR1cmFsSGl0R3JvdXAiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFJlc3VsdAorICB7CisgICAgZVN1Y2Nlc3MgPSBWS19TVUNDRVNTLAorICAgIGVOb3RSZWFkeSA9IFZLX05PVF9SRUFEWSwKKyAgICBlVGltZW91dCA9IFZLX1RJTUVPVVQsCisgICAgZUV2ZW50U2V0ID0gVktfRVZFTlRfU0VULAorICAgIGVFdmVudFJlc2V0ID0gVktfRVZFTlRfUkVTRVQsCisgICAgZUluY29tcGxldGUgPSBWS19JTkNPTVBMRVRFLAorICAgIGVFcnJvck91dE9mSG9zdE1lbW9yeSA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSwKKyAgICBlRXJyb3JPdXRPZkRldmljZU1lbW9yeSA9IFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLAorICAgIGVFcnJvckluaXRpYWxpemF0aW9uRmFpbGVkID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVELAorICAgIGVFcnJvckRldmljZUxvc3QgPSBWS19FUlJPUl9ERVZJQ0VfTE9TVCwKKyAgICBlRXJyb3JNZW1vcnlNYXBGYWlsZWQgPSBWS19FUlJPUl9NRU1PUllfTUFQX0ZBSUxFRCwKKyAgICBlRXJyb3JMYXllck5vdFByZXNlbnQgPSBWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVCwKKyAgICBlRXJyb3JFeHRlbnNpb25Ob3RQcmVzZW50ID0gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5ULAorICAgIGVFcnJvckZlYXR1cmVOb3RQcmVzZW50ID0gVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVCwKKyAgICBlRXJyb3JJbmNvbXBhdGlibGVEcml2ZXIgPSBWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSLAorICAgIGVFcnJvclRvb01hbnlPYmplY3RzID0gVktfRVJST1JfVE9PX01BTllfT0JKRUNUUywKKyAgICBlRXJyb3JGb3JtYXROb3RTdXBwb3J0ZWQgPSBWS19FUlJPUl9GT1JNQVRfTk9UX1NVUFBPUlRFRCwKKyAgICBlRXJyb3JGcmFnbWVudGVkUG9vbCA9IFZLX0VSUk9SX0ZSQUdNRU5URURfUE9PTCwKKyAgICBlRXJyb3JPdXRPZlBvb2xNZW1vcnkgPSBWS19FUlJPUl9PVVRfT0ZfUE9PTF9NRU1PUlksCisgICAgZUVycm9ySW52YWxpZEV4dGVybmFsSGFuZGxlID0gVktfRVJST1JfSU5WQUxJRF9FWFRFUk5BTF9IQU5ETEUsCisgICAgZUVycm9yU3VyZmFjZUxvc3RLSFIgPSBWS19FUlJPUl9TVVJGQUNFX0xPU1RfS0hSLAorICAgIGVFcnJvck5hdGl2ZVdpbmRvd0luVXNlS0hSID0gVktfRVJST1JfTkFUSVZFX1dJTkRPV19JTl9VU0VfS0hSLAorICAgIGVTdWJvcHRpbWFsS0hSID0gVktfU1VCT1BUSU1BTF9LSFIsCisgICAgZUVycm9yT3V0T2ZEYXRlS0hSID0gVktfRVJST1JfT1VUX09GX0RBVEVfS0hSLAorICAgIGVFcnJvckluY29tcGF0aWJsZURpc3BsYXlLSFIgPSBWS19FUlJPUl9JTkNPTVBBVElCTEVfRElTUExBWV9LSFIsCisgICAgZUVycm9yVmFsaWRhdGlvbkZhaWxlZEVYVCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVCwKKyAgICBlRXJyb3JJbnZhbGlkU2hhZGVyTlYgPSBWS19FUlJPUl9JTlZBTElEX1NIQURFUl9OViwKKyAgICBlRXJyb3JJbnZhbGlkRHJtRm9ybWF0TW9kaWZpZXJQbGFuZUxheW91dEVYVCA9IFZLX0VSUk9SX0lOVkFMSURfRFJNX0ZPUk1BVF9NT0RJRklFUl9QTEFORV9MQVlPVVRfRVhULAorICAgIGVFcnJvckZyYWdtZW50YXRpb25FWFQgPSBWS19FUlJPUl9GUkFHTUVOVEFUSU9OX0VYVCwKKyAgICBlRXJyb3JOb3RQZXJtaXR0ZWRFWFQgPSBWS19FUlJPUl9OT1RfUEVSTUlUVEVEX0VYVCwKKyAgICBlRXJyb3JGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUxvc3RFWFQgPSBWS19FUlJPUl9GVUxMX1NDUkVFTl9FWENMVVNJVkVfTU9ERV9MT1NUX0VYVCwKKyAgICBlRXJyb3JJbnZhbGlkT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgPSBWS19FUlJPUl9JTlZBTElEX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfS0hSLAorICAgIGVFcnJvck91dE9mUG9vbE1lbW9yeUtIUiA9IFZLX0VSUk9SX09VVF9PRl9QT09MX01FTU9SWV9LSFIsCisgICAgZUVycm9ySW52YWxpZEV4dGVybmFsSGFuZGxlS0hSID0gVktfRVJST1JfSU5WQUxJRF9FWFRFUk5BTF9IQU5ETEVfS0hSLAorICAgIGVFcnJvckludmFsaWREZXZpY2VBZGRyZXNzRVhUID0gVktfRVJST1JfSU5WQUxJRF9ERVZJQ0VfQUREUkVTU19FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFJlc3VsdCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBSZXN1bHQ6OmVTdWNjZXNzIDogcmV0dXJuICJTdWNjZXNzIjsKKyAgICAgIGNhc2UgUmVzdWx0OjplTm90UmVhZHkgOiByZXR1cm4gIk5vdFJlYWR5IjsKKyAgICAgIGNhc2UgUmVzdWx0OjplVGltZW91dCA6IHJldHVybiAiVGltZW91dCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUV2ZW50U2V0IDogcmV0dXJuICJFdmVudFNldCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUV2ZW50UmVzZXQgOiByZXR1cm4gIkV2ZW50UmVzZXQiOworICAgICAgY2FzZSBSZXN1bHQ6OmVJbmNvbXBsZXRlIDogcmV0dXJuICJJbmNvbXBsZXRlIjsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JPdXRPZkhvc3RNZW1vcnkgOiByZXR1cm4gIkVycm9yT3V0T2ZIb3N0TWVtb3J5IjsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JPdXRPZkRldmljZU1lbW9yeSA6IHJldHVybiAiRXJyb3JPdXRPZkRldmljZU1lbW9yeSI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9ySW5pdGlhbGl6YXRpb25GYWlsZWQgOiByZXR1cm4gIkVycm9ySW5pdGlhbGl6YXRpb25GYWlsZWQiOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckRldmljZUxvc3QgOiByZXR1cm4gIkVycm9yRGV2aWNlTG9zdCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yTWVtb3J5TWFwRmFpbGVkIDogcmV0dXJuICJFcnJvck1lbW9yeU1hcEZhaWxlZCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yTGF5ZXJOb3RQcmVzZW50IDogcmV0dXJuICJFcnJvckxheWVyTm90UHJlc2VudCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yRXh0ZW5zaW9uTm90UHJlc2VudCA6IHJldHVybiAiRXJyb3JFeHRlbnNpb25Ob3RQcmVzZW50IjsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JGZWF0dXJlTm90UHJlc2VudCA6IHJldHVybiAiRXJyb3JGZWF0dXJlTm90UHJlc2VudCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9ySW5jb21wYXRpYmxlRHJpdmVyIDogcmV0dXJuICJFcnJvckluY29tcGF0aWJsZURyaXZlciI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yVG9vTWFueU9iamVjdHMgOiByZXR1cm4gIkVycm9yVG9vTWFueU9iamVjdHMiOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckZvcm1hdE5vdFN1cHBvcnRlZCA6IHJldHVybiAiRXJyb3JGb3JtYXROb3RTdXBwb3J0ZWQiOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckZyYWdtZW50ZWRQb29sIDogcmV0dXJuICJFcnJvckZyYWdtZW50ZWRQb29sIjsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JPdXRPZlBvb2xNZW1vcnkgOiByZXR1cm4gIkVycm9yT3V0T2ZQb29sTWVtb3J5IjsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JJbnZhbGlkRXh0ZXJuYWxIYW5kbGUgOiByZXR1cm4gIkVycm9ySW52YWxpZEV4dGVybmFsSGFuZGxlIjsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JTdXJmYWNlTG9zdEtIUiA6IHJldHVybiAiRXJyb3JTdXJmYWNlTG9zdEtIUiI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yTmF0aXZlV2luZG93SW5Vc2VLSFIgOiByZXR1cm4gIkVycm9yTmF0aXZlV2luZG93SW5Vc2VLSFIiOworICAgICAgY2FzZSBSZXN1bHQ6OmVTdWJvcHRpbWFsS0hSIDogcmV0dXJuICJTdWJvcHRpbWFsS0hSIjsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JPdXRPZkRhdGVLSFIgOiByZXR1cm4gIkVycm9yT3V0T2ZEYXRlS0hSIjsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JJbmNvbXBhdGlibGVEaXNwbGF5S0hSIDogcmV0dXJuICJFcnJvckluY29tcGF0aWJsZURpc3BsYXlLSFIiOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvclZhbGlkYXRpb25GYWlsZWRFWFQgOiByZXR1cm4gIkVycm9yVmFsaWRhdGlvbkZhaWxlZEVYVCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9ySW52YWxpZFNoYWRlck5WIDogcmV0dXJuICJFcnJvckludmFsaWRTaGFkZXJOViI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9ySW52YWxpZERybUZvcm1hdE1vZGlmaWVyUGxhbmVMYXlvdXRFWFQgOiByZXR1cm4gIkVycm9ySW52YWxpZERybUZvcm1hdE1vZGlmaWVyUGxhbmVMYXlvdXRFWFQiOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckZyYWdtZW50YXRpb25FWFQgOiByZXR1cm4gIkVycm9yRnJhZ21lbnRhdGlvbkVYVCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yTm90UGVybWl0dGVkRVhUIDogcmV0dXJuICJFcnJvck5vdFBlcm1pdHRlZEVYVCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVMb3N0RVhUIDogcmV0dXJuICJFcnJvckZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlTG9zdEVYVCI7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9ySW52YWxpZE9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIDogcmV0dXJuICJFcnJvckludmFsaWRPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgU2FtcGxlckFkZHJlc3NNb2RlCisgIHsKKyAgICBlUmVwZWF0ID0gVktfU0FNUExFUl9BRERSRVNTX01PREVfUkVQRUFULAorICAgIGVNaXJyb3JlZFJlcGVhdCA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUkVEX1JFUEVBVCwKKyAgICBlQ2xhbXBUb0VkZ2UgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFLAorICAgIGVDbGFtcFRvQm9yZGVyID0gVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSLAorICAgIGVNaXJyb3JDbGFtcFRvRWRnZSA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFLAorICAgIGVNaXJyb3JDbGFtcFRvRWRnZUtIUiA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2FtcGxlckFkZHJlc3NNb2RlIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFNhbXBsZXJBZGRyZXNzTW9kZTo6ZVJlcGVhdCA6IHJldHVybiAiUmVwZWF0IjsKKyAgICAgIGNhc2UgU2FtcGxlckFkZHJlc3NNb2RlOjplTWlycm9yZWRSZXBlYXQgOiByZXR1cm4gIk1pcnJvcmVkUmVwZWF0IjsKKyAgICAgIGNhc2UgU2FtcGxlckFkZHJlc3NNb2RlOjplQ2xhbXBUb0VkZ2UgOiByZXR1cm4gIkNsYW1wVG9FZGdlIjsKKyAgICAgIGNhc2UgU2FtcGxlckFkZHJlc3NNb2RlOjplQ2xhbXBUb0JvcmRlciA6IHJldHVybiAiQ2xhbXBUb0JvcmRlciI7CisgICAgICBjYXNlIFNhbXBsZXJBZGRyZXNzTW9kZTo6ZU1pcnJvckNsYW1wVG9FZGdlIDogcmV0dXJuICJNaXJyb3JDbGFtcFRvRWRnZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgU2FtcGxlck1pcG1hcE1vZGUKKyAgeworICAgIGVOZWFyZXN0ID0gVktfU0FNUExFUl9NSVBNQVBfTU9ERV9ORUFSRVNULAorICAgIGVMaW5lYXIgPSBWS19TQU1QTEVSX01JUE1BUF9NT0RFX0xJTkVBUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2FtcGxlck1pcG1hcE1vZGUgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgU2FtcGxlck1pcG1hcE1vZGU6OmVOZWFyZXN0IDogcmV0dXJuICJOZWFyZXN0IjsKKyAgICAgIGNhc2UgU2FtcGxlck1pcG1hcE1vZGU6OmVMaW5lYXIgOiByZXR1cm4gIkxpbmVhciI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgU2FtcGxlclJlZHVjdGlvbk1vZGVFWFQKKyAgeworICAgIGVXZWlnaHRlZEF2ZXJhZ2UgPSBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX1dFSUdIVEVEX0FWRVJBR0VfRVhULAorICAgIGVNaW4gPSBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQsCisgICAgZU1heCA9IFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2FtcGxlclJlZHVjdGlvbk1vZGVFWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgU2FtcGxlclJlZHVjdGlvbk1vZGVFWFQ6OmVXZWlnaHRlZEF2ZXJhZ2UgOiByZXR1cm4gIldlaWdodGVkQXZlcmFnZSI7CisgICAgICBjYXNlIFNhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUOjplTWluIDogcmV0dXJuICJNaW4iOworICAgICAgY2FzZSBTYW1wbGVyUmVkdWN0aW9uTW9kZUVYVDo6ZU1heCA6IHJldHVybiAiTWF4IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24KKyAgeworICAgIGVSZ2JJZGVudGl0eSA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SR0JfSURFTlRJVFksCisgICAgZVljYmNySWRlbnRpdHkgPSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfSURFTlRJVFksCisgICAgZVljYmNyNzA5ID0gVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzcwOSwKKyAgICBlWWNiY3I2MDEgPSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfNjAxLAorICAgIGVZY2JjcjIwMjAgPSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfMjAyMCwKKyAgICBlUmdiSWRlbnRpdHlLSFIgPSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZX0tIUiwKKyAgICBlWWNiY3JJZGVudGl0eUtIUiA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl9JREVOVElUWV9LSFIsCisgICAgZVljYmNyNzA5S0hSID0gVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzcwOV9LSFIsCisgICAgZVljYmNyNjAxS0hSID0gVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzYwMV9LSFIsCisgICAgZVljYmNyMjAyMEtIUiA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFNhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbjo6ZVJnYklkZW50aXR5IDogcmV0dXJuICJSZ2JJZGVudGl0eSI7CisgICAgICBjYXNlIFNhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbjo6ZVljYmNySWRlbnRpdHkgOiByZXR1cm4gIlljYmNySWRlbnRpdHkiOworICAgICAgY2FzZSBTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb246OmVZY2JjcjcwOSA6IHJldHVybiAiWWNiY3I3MDkiOworICAgICAgY2FzZSBTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb246OmVZY2JjcjYwMSA6IHJldHVybiAiWWNiY3I2MDEiOworICAgICAgY2FzZSBTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb246OmVZY2JjcjIwMjAgOiByZXR1cm4gIlljYmNyMjAyMCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgU2FtcGxlclljYmNyUmFuZ2UKKyAgeworICAgIGVJdHVGdWxsID0gVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfRlVMTCwKKyAgICBlSXR1TmFycm93ID0gVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XLAorICAgIGVJdHVGdWxsS0hSID0gVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfRlVMTF9LSFIsCisgICAgZUl0dU5hcnJvd0tIUiA9IFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX05BUlJPV19LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFNhbXBsZXJZY2JjclJhbmdlIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFNhbXBsZXJZY2JjclJhbmdlOjplSXR1RnVsbCA6IHJldHVybiAiSXR1RnVsbCI7CisgICAgICBjYXNlIFNhbXBsZXJZY2JjclJhbmdlOjplSXR1TmFycm93IDogcmV0dXJuICJJdHVOYXJyb3ciOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFNjb3BlTlYKKyAgeworICAgIGVEZXZpY2UgPSBWS19TQ09QRV9ERVZJQ0VfTlYsCisgICAgZVdvcmtncm91cCA9IFZLX1NDT1BFX1dPUktHUk9VUF9OViwKKyAgICBlU3ViZ3JvdXAgPSBWS19TQ09QRV9TVUJHUk9VUF9OViwKKyAgICBlUXVldWVGYW1pbHkgPSBWS19TQ09QRV9RVUVVRV9GQU1JTFlfTlYKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFNjb3BlTlYgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgU2NvcGVOVjo6ZURldmljZSA6IHJldHVybiAiRGV2aWNlIjsKKyAgICAgIGNhc2UgU2NvcGVOVjo6ZVdvcmtncm91cCA6IHJldHVybiAiV29ya2dyb3VwIjsKKyAgICAgIGNhc2UgU2NvcGVOVjo6ZVN1Ymdyb3VwIDogcmV0dXJuICJTdWJncm91cCI7CisgICAgICBjYXNlIFNjb3BlTlY6OmVRdWV1ZUZhbWlseSA6IHJldHVybiAiUXVldWVGYW1pbHkiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFNlbWFwaG9yZVR5cGVLSFIKKyAgeworICAgIGVCaW5hcnkgPSBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSLAorICAgIGVUaW1lbGluZSA9IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2VtYXBob3JlVHlwZUtIUiB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTZW1hcGhvcmVUeXBlS0hSOjplQmluYXJ5IDogcmV0dXJuICJCaW5hcnkiOworICAgICAgY2FzZSBTZW1hcGhvcmVUeXBlS0hSOjplVGltZWxpbmUgOiByZXR1cm4gIlRpbWVsaW5lIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSCisgIHsKKyAgICBlMzJCaXRPbmx5ID0gVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV8zMl9CSVRfT05MWV9LSFIsCisgICAgZUFsbCA9IFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfQUxMX0tIUiwKKyAgICBlTm9uZSA9IFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfTk9ORV9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFNoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFIgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUjo6ZTMyQml0T25seSA6IHJldHVybiAiMzJCaXRPbmx5IjsKKyAgICAgIGNhc2UgU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUjo6ZUFsbCA6IHJldHVybiAiQWxsIjsKKyAgICAgIGNhc2UgU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUjo6ZU5vbmUgOiByZXR1cm4gIk5vbmUiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFNoYWRlckluZm9UeXBlQU1ECisgIHsKKyAgICBlU3RhdGlzdGljcyA9IFZLX1NIQURFUl9JTkZPX1RZUEVfU1RBVElTVElDU19BTUQsCisgICAgZUJpbmFyeSA9IFZLX1NIQURFUl9JTkZPX1RZUEVfQklOQVJZX0FNRCwKKyAgICBlRGlzYXNzZW1ibHkgPSBWS19TSEFERVJfSU5GT19UWVBFX0RJU0FTU0VNQkxZX0FNRAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2hhZGVySW5mb1R5cGVBTUQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgU2hhZGVySW5mb1R5cGVBTUQ6OmVTdGF0aXN0aWNzIDogcmV0dXJuICJTdGF0aXN0aWNzIjsKKyAgICAgIGNhc2UgU2hhZGVySW5mb1R5cGVBTUQ6OmVCaW5hcnkgOiByZXR1cm4gIkJpbmFyeSI7CisgICAgICBjYXNlIFNoYWRlckluZm9UeXBlQU1EOjplRGlzYXNzZW1ibHkgOiByZXR1cm4gIkRpc2Fzc2VtYmx5IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WCisgIHsKKyAgICBlTm9JbnZvY2F0aW9ucyA9IFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZX05PX0lOVk9DQVRJT05TX05WLAorICAgIGUxNkludm9jYXRpb25zUGVyUGl4ZWwgPSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xNl9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYsCisgICAgZThJbnZvY2F0aW9uc1BlclBpeGVsID0gVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfOF9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYsCisgICAgZTRJbnZvY2F0aW9uc1BlclBpeGVsID0gVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfNF9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYsCisgICAgZTJJbnZvY2F0aW9uc1BlclBpeGVsID0gVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMl9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYsCisgICAgZTFJbnZvY2F0aW9uUGVyUGl4ZWwgPSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSX1BJWEVMX05WLAorICAgIGUxSW52b2NhdGlvblBlcjJYMVBpeGVscyA9IFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfMlgxX1BJWEVMU19OViwKKyAgICBlMUludm9jYXRpb25QZXIxWDJQaXhlbHMgPSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzFYMl9QSVhFTFNfTlYsCisgICAgZTFJbnZvY2F0aW9uUGVyMlgyUGl4ZWxzID0gVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8yWDJfUElYRUxTX05WLAorICAgIGUxSW52b2NhdGlvblBlcjRYMlBpeGVscyA9IFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfNFgyX1BJWEVMU19OViwKKyAgICBlMUludm9jYXRpb25QZXIyWDRQaXhlbHMgPSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYNF9QSVhFTFNfTlYsCisgICAgZTFJbnZvY2F0aW9uUGVyNFg0UGl4ZWxzID0gVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl80WDRfUElYRUxTX05WCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlY6OmVOb0ludm9jYXRpb25zIDogcmV0dXJuICJOb0ludm9jYXRpb25zIjsKKyAgICAgIGNhc2UgU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjo6ZTE2SW52b2NhdGlvbnNQZXJQaXhlbCA6IHJldHVybiAiMTZJbnZvY2F0aW9uc1BlclBpeGVsIjsKKyAgICAgIGNhc2UgU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjo6ZThJbnZvY2F0aW9uc1BlclBpeGVsIDogcmV0dXJuICI4SW52b2NhdGlvbnNQZXJQaXhlbCI7CisgICAgICBjYXNlIFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlY6OmU0SW52b2NhdGlvbnNQZXJQaXhlbCA6IHJldHVybiAiNEludm9jYXRpb25zUGVyUGl4ZWwiOworICAgICAgY2FzZSBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WOjplMkludm9jYXRpb25zUGVyUGl4ZWwgOiByZXR1cm4gIjJJbnZvY2F0aW9uc1BlclBpeGVsIjsKKyAgICAgIGNhc2UgU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjo6ZTFJbnZvY2F0aW9uUGVyUGl4ZWwgOiByZXR1cm4gIjFJbnZvY2F0aW9uUGVyUGl4ZWwiOworICAgICAgY2FzZSBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WOjplMUludm9jYXRpb25QZXIyWDFQaXhlbHMgOiByZXR1cm4gIjFJbnZvY2F0aW9uUGVyMlgxUGl4ZWxzIjsKKyAgICAgIGNhc2UgU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjo6ZTFJbnZvY2F0aW9uUGVyMVgyUGl4ZWxzIDogcmV0dXJuICIxSW52b2NhdGlvblBlcjFYMlBpeGVscyI7CisgICAgICBjYXNlIFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlY6OmUxSW52b2NhdGlvblBlcjJYMlBpeGVscyA6IHJldHVybiAiMUludm9jYXRpb25QZXIyWDJQaXhlbHMiOworICAgICAgY2FzZSBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WOjplMUludm9jYXRpb25QZXI0WDJQaXhlbHMgOiByZXR1cm4gIjFJbnZvY2F0aW9uUGVyNFgyUGl4ZWxzIjsKKyAgICAgIGNhc2UgU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjo6ZTFJbnZvY2F0aW9uUGVyMlg0UGl4ZWxzIDogcmV0dXJuICIxSW52b2NhdGlvblBlcjJYNFBpeGVscyI7CisgICAgICBjYXNlIFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlY6OmUxSW52b2NhdGlvblBlcjRYNFBpeGVscyA6IHJldHVybiAiMUludm9jYXRpb25QZXI0WDRQaXhlbHMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFNoYXJpbmdNb2RlCisgIHsKKyAgICBlRXhjbHVzaXZlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICBlQ29uY3VycmVudCA9IFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTaGFyaW5nTW9kZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTaGFyaW5nTW9kZTo6ZUV4Y2x1c2l2ZSA6IHJldHVybiAiRXhjbHVzaXZlIjsKKyAgICAgIGNhc2UgU2hhcmluZ01vZGU6OmVDb25jdXJyZW50IDogcmV0dXJuICJDb25jdXJyZW50IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBTdGVuY2lsT3AKKyAgeworICAgIGVLZWVwID0gVktfU1RFTkNJTF9PUF9LRUVQLAorICAgIGVaZXJvID0gVktfU1RFTkNJTF9PUF9aRVJPLAorICAgIGVSZXBsYWNlID0gVktfU1RFTkNJTF9PUF9SRVBMQUNFLAorICAgIGVJbmNyZW1lbnRBbmRDbGFtcCA9IFZLX1NURU5DSUxfT1BfSU5DUkVNRU5UX0FORF9DTEFNUCwKKyAgICBlRGVjcmVtZW50QW5kQ2xhbXAgPSBWS19TVEVOQ0lMX09QX0RFQ1JFTUVOVF9BTkRfQ0xBTVAsCisgICAgZUludmVydCA9IFZLX1NURU5DSUxfT1BfSU5WRVJULAorICAgIGVJbmNyZW1lbnRBbmRXcmFwID0gVktfU1RFTkNJTF9PUF9JTkNSRU1FTlRfQU5EX1dSQVAsCisgICAgZURlY3JlbWVudEFuZFdyYXAgPSBWS19TVEVOQ0lMX09QX0RFQ1JFTUVOVF9BTkRfV1JBUAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3RlbmNpbE9wIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFN0ZW5jaWxPcDo6ZUtlZXAgOiByZXR1cm4gIktlZXAiOworICAgICAgY2FzZSBTdGVuY2lsT3A6OmVaZXJvIDogcmV0dXJuICJaZXJvIjsKKyAgICAgIGNhc2UgU3RlbmNpbE9wOjplUmVwbGFjZSA6IHJldHVybiAiUmVwbGFjZSI7CisgICAgICBjYXNlIFN0ZW5jaWxPcDo6ZUluY3JlbWVudEFuZENsYW1wIDogcmV0dXJuICJJbmNyZW1lbnRBbmRDbGFtcCI7CisgICAgICBjYXNlIFN0ZW5jaWxPcDo6ZURlY3JlbWVudEFuZENsYW1wIDogcmV0dXJuICJEZWNyZW1lbnRBbmRDbGFtcCI7CisgICAgICBjYXNlIFN0ZW5jaWxPcDo6ZUludmVydCA6IHJldHVybiAiSW52ZXJ0IjsKKyAgICAgIGNhc2UgU3RlbmNpbE9wOjplSW5jcmVtZW50QW5kV3JhcCA6IHJldHVybiAiSW5jcmVtZW50QW5kV3JhcCI7CisgICAgICBjYXNlIFN0ZW5jaWxPcDo6ZURlY3JlbWVudEFuZFdyYXAgOiByZXR1cm4gIkRlY3JlbWVudEFuZFdyYXAiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFN0cnVjdHVyZVR5cGUKKyAgeworICAgIGVBcHBsaWNhdGlvbkluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPLAorICAgIGVJbnN0YW5jZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTywKKyAgICBlRGV2aWNlUXVldWVDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPLAorICAgIGVEZXZpY2VDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0NSRUFURV9JTkZPLAorICAgIGVTdWJtaXRJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8sCisgICAgZU1lbW9yeUFsbG9jYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPLAorICAgIGVNYXBwZWRNZW1vcnlSYW5nZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0UsCisgICAgZUJpbmRTcGFyc2VJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9TUEFSU0VfSU5GTywKKyAgICBlRmVuY2VDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8sCisgICAgZVNlbWFwaG9yZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8sCisgICAgZUV2ZW50Q3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPLAorICAgIGVRdWVyeVBvb2xDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTywKKyAgICBlQnVmZmVyQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTywKKyAgICBlQnVmZmVyVmlld0NyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTywKKyAgICBlSW1hZ2VDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgZUltYWdlVmlld0NyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPLAorICAgIGVTaGFkZXJNb2R1bGVDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTywKKyAgICBlUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTywKKyAgICBlUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk8sCisgICAgZVBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgZVBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPLAorICAgIGVQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9TVEFURV9DUkVBVEVfSU5GTywKKyAgICBlUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPLAorICAgIGVQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX0NSRUFURV9JTkZPLAorICAgIGVQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTVVMVElTQU1QTEVfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgZVBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfREVQVEhfU1RFTkNJTF9TVEFURV9DUkVBVEVfSU5GTywKKyAgICBlUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgZVBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgZUdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk8sCisgICAgZUNvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01QVVRFX1BJUEVMSU5FX0NSRUFURV9JTkZPLAorICAgIGVQaXBlbGluZUxheW91dENyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk8sCisgICAgZVNhbXBsZXJDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTywKKyAgICBlRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8sCisgICAgZURlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTywKKyAgICBlRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk8sCisgICAgZVdyaXRlRGVzY3JpcHRvclNldCA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VULAorICAgIGVDb3B5RGVzY3JpcHRvclNldCA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPUFlfREVTQ1JJUFRPUl9TRVQsCisgICAgZUZyYW1lYnVmZmVyQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPLAorICAgIGVSZW5kZXJQYXNzQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLAorICAgIGVDb21tYW5kUG9vbENyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8sCisgICAgZUNvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPLAorICAgIGVDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTywKKyAgICBlQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sCisgICAgZVJlbmRlclBhc3NCZWdpbkluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLAorICAgIGVCdWZmZXJNZW1vcnlCYXJyaWVyID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9CQVJSSUVSLAorICAgIGVJbWFnZU1lbW9yeUJhcnJpZXIgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUiwKKyAgICBlTWVtb3J5QmFycmllciA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9CQVJSSUVSLAorICAgIGVMb2FkZXJJbnN0YW5jZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfSU5TVEFOQ0VfQ1JFQVRFX0lORk8sCisgICAgZUxvYWRlckRldmljZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfREVWSUNFX0NSRUFURV9JTkZPLAorICAgIGVQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9QUk9QRVJUSUVTLAorICAgIGVCaW5kQnVmZmVyTWVtb3J5SW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPLAorICAgIGVCaW5kSW1hZ2VNZW1vcnlJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTywKKyAgICBlUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTLAorICAgIGVNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX1JFUVVJUkVNRU5UUywKKyAgICBlTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPLAorICAgIGVNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9GTEFHU19JTkZPLAorICAgIGVEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUkVOREVSX1BBU1NfQkVHSU5fSU5GTywKKyAgICBlRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sCisgICAgZURldmljZUdyb3VwU3VibWl0SW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TVUJNSVRfSU5GTywKKyAgICBlRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9CSU5EX1NQQVJTRV9JTkZPLAorICAgIGVCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPLAorICAgIGVCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTywKKyAgICBlUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfR1JPVVBfUFJPUEVSVElFUywKKyAgICBlRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTywKKyAgICBlQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIsCisgICAgZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiwKKyAgICBlSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiwKKyAgICBlTWVtb3J5UmVxdWlyZW1lbnRzMiA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiwKKyAgICBlU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyID0gVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiwKKyAgICBlUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMiwKKyAgICBlUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzIsCisgICAgZUZvcm1hdFByb3BlcnRpZXMyID0gVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMiwKKyAgICBlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzIsCisgICAgZVBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9GT1JNQVRfSU5GT18yLAorICAgIGVRdWV1ZUZhbWlseVByb3BlcnRpZXMyID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFVUVfRkFNSUxZX1BST1BFUlRJRVNfMiwKKyAgICBlUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJPUEVSVElFU18yLAorICAgIGVTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzIsCisgICAgZVBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMiwKKyAgICBlUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QT0lOVF9DTElQUElOR19QUk9QRVJUSUVTLAorICAgIGVSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0lOUFVUX0FUVEFDSE1FTlRfQVNQRUNUX0NSRUFURV9JTkZPLAorICAgIGVJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPLAorICAgIGVQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPLAorICAgIGVSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GTywKKyAgICBlUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVMsCisgICAgZVBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUFJPUEVSVElFUywKKyAgICBlUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMsCisgICAgZVByb3RlY3RlZFN1Ym1pdEluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9QUk9URUNURURfU1VCTUlUX0lORk8sCisgICAgZVBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUywKKyAgICBlUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfUFJPUEVSVElFUywKKyAgICBlRGV2aWNlUXVldWVJbmZvMiA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9JTkZPXzIsCisgICAgZVNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPLAorICAgIGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPLAorICAgIGVCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPLAorICAgIGVJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTywKKyAgICBlUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTLAorICAgIGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTLAorICAgIGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk8sCisgICAgZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfSU1BR0VfRk9STUFUX0lORk8sCisgICAgZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfSU1BR0VfRk9STUFUX1BST1BFUlRJRVMsCisgICAgZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0JVRkZFUl9JTkZPLAorICAgIGVFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUywKKyAgICBlUGh5c2ljYWxEZXZpY2VJZFByb3BlcnRpZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSURfUFJPUEVSVElFUywKKyAgICBlRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GTywKKyAgICBlRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgZUV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTywKKyAgICBlUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9GRU5DRV9JTkZPLAorICAgIGVFeHRlcm5hbEZlbmNlUHJvcGVydGllcyA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZFTkNFX1BST1BFUlRJRVMsCisgICAgZUV4cG9ydEZlbmNlQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTywKKyAgICBlRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk8sCisgICAgZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX1NFTUFQSE9SRV9JTkZPLAorICAgIGVFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9TRU1BUEhPUkVfUFJPUEVSVElFUywKKyAgICBlUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUywKKyAgICBlRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVMsCisgICAgZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSLAorICAgIGVQcmVzZW50SW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfSU5GT19LSFIsCisgICAgZURldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0NBUEFCSUxJVElFU19LSFIsCisgICAgZUltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIsCisgICAgZUJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9TV0FQQ0hBSU5fSU5GT19LSFIsCisgICAgZUFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9ORVhUX0lNQUdFX0lORk9fS0hSLAorICAgIGVEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFIsCisgICAgZURldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSLAorICAgIGVEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVEaXNwbGF5UHJlc2VudEluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BSRVNFTlRfSU5GT19LSFIsCisgICAgZVhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIsCisgICAgZVhjYlN1cmZhY2VDcmVhdGVJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9XQVlMQU5EX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIsCisgICAgZURlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1JBU1RFUklaQVRJT05fT1JERVJfQU1ELAorICAgIGVEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9OQU1FX0lORk9fRVhULAorICAgIGVEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX1RBR19JTkZPX0VYVCwKKyAgICBlRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX01BUktFUl9JTkZPX0VYVCwKKyAgICBlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQ1JFQVRFX0lORk9fTlYsCisgICAgZURlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9CVUZGRVJfQ1JFQVRFX0lORk9fTlYsCisgICAgZURlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX01FTU9SWV9BTExPQ0FURV9JTkZPX05WLAorICAgIGVQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX0ZFQVRVUkVTX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX1BST1BFUlRJRVNfRVhULAorICAgIGVQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1NUUkVBTV9DUkVBVEVfSU5GT19FWFQsCisgICAgZUltYWdlVmlld0hhbmRsZUluZm9OVlggPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0hBTkRMRV9JTkZPX05WWCwKKyAgICBlVGV4dHVyZUxvZEdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQgPSBWS19TVFJVQ1RVUkVfVFlQRV9URVhUVVJFX0xPRF9HQVRIRVJfRk9STUFUX1BST1BFUlRJRVNfQU1ELAorICAgIGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVFJFQU1fREVTQ1JJUFRPUl9TVVJGQUNFX0NSRUFURV9JTkZPX0dHUCwKKyAgICBlUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPUk5FUl9TQU1QTEVEX0lNQUdFX0ZFQVRVUkVTX05WLAorICAgIGVFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WLAorICAgIGVFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GT19OViwKKyAgICBlSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX05WLAorICAgIGVFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYsCisgICAgZVdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fTlYsCisgICAgZVZhbGlkYXRpb25GbGFnc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkxBR1NfRVhULAorICAgIGVWaVN1cmZhY2VDcmVhdGVJbmZvTk4gPSBWS19TVFJVQ1RVUkVfVFlQRV9WSV9TVVJGQUNFX0NSRUFURV9JTkZPX05OLAorICAgIGVQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFzdGNIZHJGZWF0dXJlc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX0ZFQVRVUkVTX0VYVCwKKyAgICBlSW1hZ2VWaWV3QXN0Y0RlY29kZU1vZGVFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0FTVENfREVDT0RFX01PREVfRVhULAorICAgIGVQaHlzaWNhbERldmljZUFzdGNEZWNvZGVGZWF0dXJlc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQsCisgICAgZUltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSLAorICAgIGVFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwKKyAgICBlTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1dJTjMyX0hBTkRMRV9QUk9QRVJUSUVTX0tIUiwKKyAgICBlTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIsCisgICAgZUltcG9ydE1lbW9yeUZkSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFIsCisgICAgZU1lbW9yeUZkUHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9GRF9QUk9QRVJUSUVTX0tIUiwKKyAgICBlTWVtb3J5R2V0RmRJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9GRF9JTkZPX0tIUiwKKyAgICBlV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fS0hSLAorICAgIGVJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwKKyAgICBlRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIsCisgICAgZUQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfRDNEMTJfRkVOQ0VfU1VCTUlUX0lORk9fS0hSLAorICAgIGVTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfR0VUX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwKKyAgICBlSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUiwKKyAgICBlU2VtYXBob3JlR2V0RmRJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9GRF9JTkZPX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFVTSF9ERVNDUklQVE9SX1BST1BFUlRJRVNfS0hSLAorICAgIGVDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5GT19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhULAorICAgIGVDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CRUdJTl9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSLAorICAgIGVQcmVzZW50UmVnaW9uc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfUkVHSU9OU19LSFIsCisgICAgZU9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCA9IFZLX1NUUlVDVFVSRV9UWVBFX09CSkVDVF9UQUJMRV9DUkVBVEVfSU5GT19OVlgsCisgICAgZUluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYID0gVktfU1RSVUNUVVJFX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX0NSRUFURV9JTkZPX05WWCwKKyAgICBlQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCA9IFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYLAorICAgIGVDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggPSBWS19TVFJVQ1RVUkVfVFlQRV9DTURfUkVTRVJWRV9TUEFDRV9GT1JfQ09NTUFORFNfSU5GT19OVlgsCisgICAgZURldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYLAorICAgIGVEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19GRUFUVVJFU19OVlgsCisgICAgZVBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfV19TQ0FMSU5HX1NUQVRFX0NSRUFURV9JTkZPX05WLAorICAgIGVTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhULAorICAgIGVEaXNwbGF5UG93ZXJJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QT1dFUl9JTkZPX0VYVCwKKyAgICBlRGV2aWNlRXZlbnRJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhULAorICAgIGVEaXNwbGF5RXZlbnRJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9FVkVOVF9JTkZPX0VYVCwKKyAgICBlU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ09VTlRFUl9DUkVBVEVfSU5GT19FWFQsCisgICAgZVByZXNlbnRUaW1lc0luZm9HT09HTEUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1RJTUVTX0lORk9fR09PR0xFLAorICAgIGVQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19QUk9QRVJUSUVTX05WWCwKKyAgICBlUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NXSVpaTEVfU1RBVEVfQ1JFQVRFX0lORk9fTlYsCisgICAgZVBoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRElTQ0FSRF9SRUNUQU5HTEVfUFJPUEVSVElFU19FWFQsCisgICAgZVBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RJU0NBUkRfUkVDVEFOR0xFX1NUQVRFX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVCwKKyAgICBlUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhULAorICAgIGVQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX0NMSVBfRU5BQkxFX0ZFQVRVUkVTX0VYVCwKKyAgICBlUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9ERVBUSF9DTElQX1NUQVRFX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlSGRyTWV0YWRhdGFFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9IRFJfTUVUQURBVEFfRVhULAorICAgIGVQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUiwKKyAgICBlRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFIsCisgICAgZUZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfSU1BR0VfSU5GT19LSFIsCisgICAgZVJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQVRUQUNITUVOVF9CRUdJTl9JTkZPX0tIUiwKKyAgICBlQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fMl9LSFIsCisgICAgZUF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFIsCisgICAgZVN1YnBhc3NEZXNjcmlwdGlvbjJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OXzJfS0hSLAorICAgIGVTdWJwYXNzRGVwZW5kZW5jeTJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFUEVOREVOQ1lfMl9LSFIsCisgICAgZVJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPXzJfS0hSLAorICAgIGVTdWJwYXNzQmVnaW5JbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19CRUdJTl9JTkZPX0tIUiwKKyAgICBlU3VicGFzc0VuZEluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0VORF9JTkZPX0tIUiwKKyAgICBlU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFSRURfUFJFU0VOVF9TVVJGQUNFX0NBUEFCSUxJVElFU19LSFIsCisgICAgZUltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwKKyAgICBlRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSLAorICAgIGVGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIsCisgICAgZUltcG9ydEZlbmNlRmRJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSLAorICAgIGVGZW5jZUdldEZkSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9GRF9JTkZPX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfRkVBVFVSRVNfS0hSLAorICAgIGVQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX1BST1BFUlRJRVNfS0hSLAorICAgIGVRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUiwKKyAgICBlUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9TVUJNSVRfSU5GT19LSFIsCisgICAgZUFjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfUFJPRklMSU5HX0xPQ0tfSU5GT19LSFIsCisgICAgZVBlcmZvcm1hbmNlQ291bnRlcktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfS0hSLAorICAgIGVQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSLAorICAgIGVQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIsCisgICAgZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9LSFIsCisgICAgZVN1cmZhY2VGb3JtYXQyS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GT1JNQVRfMl9LSFIsCisgICAgZURpc3BsYXlQcm9wZXJ0aWVzMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJPUEVSVElFU18yX0tIUiwKKyAgICBlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFIsCisgICAgZURpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUiwKKyAgICBlRGlzcGxheVBsYW5lSW5mbzJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX0lORk9fMl9LSFIsCisgICAgZURpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX0NBUEFCSUxJVElFU18yX0tIUiwKKyAgICBlSW9zU3VyZmFjZUNyZWF0ZUluZm9NVksgPSBWS19TVFJVQ1RVUkVfVFlQRV9JT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVkssCisgICAgZU1hY29zU3VyZmFjZUNyZWF0ZUluZm9NVksgPSBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSywKKyAgICBlRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX05BTUVfSU5GT19FWFQsCisgICAgZURlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVCwKKyAgICBlRGVidWdVdGlsc0xhYmVsRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTEFCRUxfRVhULAorICAgIGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NBTExCQUNLX0RBVEFfRVhULAorICAgIGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DUkVBVEVfSU5GT19FWFQsCisgICAgZUFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1VTQUdFX0FORFJPSUQsCisgICAgZUFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfUFJPUEVSVElFU19BTkRST0lELAorICAgIGVBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQsCisgICAgZUltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRCwKKyAgICBlTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRCwKKyAgICBlRXh0ZXJuYWxGb3JtYXRBTkRST0lEID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQsCisgICAgZVBoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9GSUxURVJfTUlOTUFYX1BST1BFUlRJRVNfRVhULAorICAgIGVTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1JFRFVDVElPTl9NT0RFX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19QUk9QRVJUSUVTX0VYVCwKKyAgICBlV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhULAorICAgIGVEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfQ1JFQVRFX0lORk9fRVhULAorICAgIGVTYW1wbGVMb2NhdGlvbnNJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVCwKKyAgICBlUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX1NBTVBMRV9MT0NBVElPTlNfQkVHSU5fSU5GT19FWFQsCisgICAgZVBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0FNUExFX0xPQ0FUSU9OU19TVEFURV9DUkVBVEVfSU5GT19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVfTE9DQVRJT05TX1BST1BFUlRJRVNfRVhULAorICAgIGVNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVCwKKyAgICBlSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX0ZFQVRVUkVTX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfUFJPUEVSVElFU19FWFQsCisgICAgZVBpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfQURWQU5DRURfU1RBVEVfQ1JFQVRFX0lORk9fRVhULAorICAgIGVQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfVE9fQ09MT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlYsCisgICAgZVBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9NT0RVTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WLAorICAgIGVQaHlzaWNhbERldmljZVNoYWRlclNtQnVpbHRpbnNGZWF0dXJlc05WID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19GRUFUVVJFU19OViwKKyAgICBlUGh5c2ljYWxEZXZpY2VTaGFkZXJTbUJ1aWx0aW5zUHJvcGVydGllc05WID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19QUk9QRVJUSUVTX05WLAorICAgIGVEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUID0gVktfU1RSVUNUVVJFX1RZUEVfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0xJU1RfRVhULAorICAgIGVEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhULAorICAgIGVQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfSU5GT19FWFQsCisgICAgZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQsCisgICAgZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0VYUExJQ0lUX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhULAorICAgIGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9DQUNIRV9DUkVBVEVfSU5GT19FWFQsCisgICAgZVNoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX1ZBTElEQVRJT05fQ0FDSEVfQ1JFQVRFX0lORk9fRVhULAorICAgIGVEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9CSU5ESU5HX0ZMQUdTX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX0ZFQVRVUkVTX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfUFJPUEVSVElFU19FWFQsCisgICAgZURlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQUxMT0NBVEVfSU5GT19FWFQsCisgICAgZURlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVCwKKyAgICBlUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9JTUFHRV9TVEFURV9DUkVBVEVfSU5GT19OViwKKyAgICBlUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfRkVBVFVSRVNfTlYsCisgICAgZVBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfUFJPUEVSVElFU19OViwKKyAgICBlUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9DT0FSU0VfU0FNUExFX09SREVSX1NUQVRFX0NSRUFURV9JTkZPX05WLAorICAgIGVSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19QSVBFTElORV9DUkVBVEVfSU5GT19OViwKKyAgICBlQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OViwKKyAgICBlR2VvbWV0cnlOViA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WLAorICAgIGVHZW9tZXRyeVRyaWFuZ2xlc05WID0gVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WLAorICAgIGVHZW9tZXRyeUFhYmJOViA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX0FBQkJfTlYsCisgICAgZUJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX0lORk9fTlYsCisgICAgZVdyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViwKKyAgICBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlYsCisgICAgZVBoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SQVlfVFJBQ0lOR19QUk9QRVJUSUVTX05WLAorICAgIGVSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlYsCisgICAgZUFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OViwKKyAgICBlUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9GRUFUVVJFU19OViwKKyAgICBlUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9TVEFURV9DUkVBVEVfSU5GT19OViwKKyAgICBlUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfVklFV19JTUFHRV9GT1JNQVRfSU5GT19FWFQsCisgICAgZUZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfRklMVEVSX0NVQklDX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfRVhULAorICAgIGVEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9HTE9CQUxfUFJJT1JJVFlfQ1JFQVRFX0lORk9fRVhULAorICAgIGVQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV84QklUX1NUT1JBR0VfRkVBVFVSRVNfS0hSLAorICAgIGVJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0hPU1RfUE9JTlRFUl9JTkZPX0VYVCwKKyAgICBlTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0hPU1RfUE9JTlRFUl9QUk9QRVJUSUVTX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX01FTU9SWV9IT1NUX1BST1BFUlRJRVNfRVhULAorICAgIGVQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0FUT01JQ19JTlQ2NF9GRUFUVVJFU19LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSLAorICAgIGVQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT01QSUxFUl9DT05UUk9MX0NSRUFURV9JTkZPX0FNRCwKKyAgICBlQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9DQUxJQlJBVEVEX1RJTUVTVEFNUF9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0FNRCwKKyAgICBlRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQsCisgICAgZVBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX1BST1BFUlRJRVNfRVhULAorICAgIGVQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9ESVZJU09SX1NUQVRFX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0ZFQVRVUkVTX0VYVCwKKyAgICBlUHJlc2VudEZyYW1lVG9rZW5HR1AgPSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0ZSQU1FX1RPS0VOX0dHUCwKKyAgICBlUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GTE9BVF9DT05UUk9MU19QUk9QRVJUSUVTX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfUFJPUEVSVElFU19LSFIsCisgICAgZVN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19GRUFUVVJFU19OViwKKyAgICBlUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9GRUFUVVJFU19OViwKKyAgICBlUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX1BST1BFUlRJRVNfTlYsCisgICAgZVBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WLAorICAgIGVQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0ZFQVRVUkVTX05WLAorICAgIGVQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlYsCisgICAgZVBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhDTFVTSVZFX1NDSVNTT1JfRkVBVFVSRVNfTlYsCisgICAgZUNoZWNrcG9pbnREYXRhTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9DSEVDS1BPSU5UX0RBVEFfTlYsCisgICAgZVF1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9DSEVDS1BPSU5UX1BST1BFUlRJRVNfTlYsCisgICAgZVBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfRkVBVFVSRVNfS0hSLAorICAgIGVQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFIsCisgICAgZVNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1RZUEVfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9USU1FTElORV9TRU1BUEhPUkVfU1VCTUlUX0lORk9fS0hSLAorICAgIGVTZW1hcGhvcmVXYWl0SW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9XQUlUX0lORk9fS0hSLAorICAgIGVTZW1hcGhvcmVTaWduYWxJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1NJR05BTF9JTkZPX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRkVBVFVSRVNfSU5URUwsCisgICAgZVF1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk9fSU5URUwsCisgICAgZUluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCA9IFZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUwsCisgICAgZVBlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMID0gVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfTUFSS0VSX0lORk9fSU5URUwsCisgICAgZVBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMID0gVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfU1RSRUFNX01BUktFUl9JTkZPX0lOVEVMLAorICAgIGVQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMID0gVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfT1ZFUlJJREVfSU5GT19JTlRFTCwKKyAgICBlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMLAorICAgIGVQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlUGNpQnVzSW5mb1Byb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUENJX0JVU19JTkZPX1BST1BFUlRJRVNfRVhULAorICAgIGVEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTkFUSVZFX0hEUl9TVVJGQUNFX0NBUEFCSUxJVElFU19BTUQsCisgICAgZVN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EID0gVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQsCisgICAgZUltYWdlcGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFUElQRV9TVVJGQUNFX0NSRUFURV9JTkZPX0ZVQ0hTSUEsCisgICAgZU1ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVCwKKyAgICBlUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19GUkFHTUVOVF9ERU5TSVRZX01BUF9DUkVBVEVfSU5GT19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0ZFQVRVUkVTX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfUFJPUEVSVElFU19FWFQsCisgICAgZVBpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfUkVRVUlSRURfU1VCR1JPVVBfU0laRV9DUkVBVEVfSU5GT19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfMl9BTUQsCisgICAgZVBoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1ELAorICAgIGVQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQsCisgICAgZU1lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1BSSU9SSVRZX0FMTE9DQVRFX0lORk9fRVhULAorICAgIGVTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlYsCisgICAgZVBoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0VQQVJBVEVfREVQVEhfU1RFTkNJTF9MQVlPVVRTX0ZFQVRVUkVTX0tIUiwKKyAgICBlQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV9TVEVOQ0lMX0xBWU9VVF9LSFIsCisgICAgZUF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX1NURU5DSUxfTEFZT1VUX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0RFVklDRV9BRERSRVNTX0ZFQVRVUkVTX0VYVCwKKyAgICBlQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfQ1JFQVRFX0lORk9fRVhULAorICAgIGVQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RPT0xfUFJPUEVSVElFU19FWFQsCisgICAgZUltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NURU5DSUxfVVNBR0VfQ1JFQVRFX0lORk9fRVhULAorICAgIGVWYWxpZGF0aW9uRmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX0ZFQVRVUkVTX05WLAorICAgIGVDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPT1BFUkFUSVZFX01BVFJJWF9QUk9QRVJUSUVTX05WLAorICAgIGVQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9QUk9QRVJUSUVTX05WLAorICAgIGVQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfRkVBVFVSRVNfTlYsCisgICAgZVBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1JFRFVDVElPTl9TVEFURV9DUkVBVEVfSU5GT19OViwKKyAgICBlRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfTUlYRURfU0FNUExFU19DT01CSU5BVElPTl9OViwKKyAgICBlUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhULAorICAgIGVQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhULAorICAgIGVQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1VOSUZPUk1fQlVGRkVSX1NUQU5EQVJEX0xBWU9VVF9GRUFUVVJFU19LSFIsCisgICAgZVN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0lORk9fRVhULAorICAgIGVTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9FWFQsCisgICAgZVN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQsCisgICAgZUhlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9IRUFETEVTU19TVVJGQUNFX0NSRUFURV9JTkZPX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0RFVklDRV9BRERSRVNTX0ZFQVRVUkVTX0tIUiwKKyAgICBlQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19LSFIsCisgICAgZUJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0NSRUFURV9JTkZPX0tIUiwKKyAgICBlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19BTExPQ0FURV9JTkZPX0tIUiwKKyAgICBlRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0lORk9fS0hSLAorICAgIGVQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVCwKKyAgICBlUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fTElORV9TVEFURV9DUkVBVEVfSU5GT19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVCwKKyAgICBlUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhULAorICAgIGVQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5ERVhfVFlQRV9VSU5UOF9GRUFUVVJFU19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19GRUFUVVJFU19LSFIsCisgICAgZVBpcGVsaW5lSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lORk9fS0hSLAorICAgIGVQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0tIUiwKKyAgICBlUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfSU5GT19LSFIsCisgICAgZVBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUiwKKyAgICBlUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfSU5URVJOQUxfUkVQUkVTRU5UQVRJT05fS0hSLAorICAgIGVQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRkVBVFVSRVNfRVhULAorICAgIGVQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9GRUFUVVJFU19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfUFJPUEVSVElFU19FWFQsCisgICAgZVBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyRmVhdHVyZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUl9GRUFUVVJFUywKKyAgICBlUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyRmVhdHVyZXMgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RSQVdfUEFSQU1FVEVSX0ZFQVRVUkVTLAorICAgIGVEZWJ1Z1JlcG9ydENyZWF0ZUluZm9FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ1JFQVRFX0lORk9fRVhULAorICAgIGVSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GT19LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX0ZFQVRVUkVTX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QUk9QRVJUSUVTX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMl9LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0tIUiwKKyAgICBlRm9ybWF0UHJvcGVydGllczJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yX0tIUiwKKyAgICBlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzJfS0hSLAorICAgIGVQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMl9LSFIsCisgICAgZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJPUEVSVElFU18yX0tIUiwKKyAgICBlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NQQVJTRV9JTUFHRV9GT1JNQVRfSU5GT18yX0tIUiwKKyAgICBlTWVtb3J5QWxsb2NhdGVGbGFnc0luZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfRkxBR1NfSU5GT19LSFIsCisgICAgZURldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9SRU5ERVJfUEFTU19CRUdJTl9JTkZPX0tIUiwKKyAgICBlRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk9fS0hSLAorICAgIGVEZXZpY2VHcm91cFN1Ym1pdEluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1VCTUlUX0lORk9fS0hSLAorICAgIGVEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0JJTkRfU1BBUlNFX0lORk9fS0hSLAorICAgIGVCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPX0tIUiwKKyAgICBlQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfREVWSUNFX0dST1VQX0lORk9fS0hSLAorICAgIGVQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTX0tIUiwKKyAgICBlRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GT19LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfSU1BR0VfRk9STUFUX0lORk9fS0hSLAorICAgIGVFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk9fS0hSLAorICAgIGVFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFU19LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlSWRQcm9wZXJ0aWVzS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVNfS0hSLAorICAgIGVFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfQlVGRkVSX0NSRUFURV9JTkZPX0tIUiwKKyAgICBlRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fS0hSLAorICAgIGVQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9TRU1BUEhPUkVfSU5GT19LSFIsCisgICAgZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTX0tIUiwKKyAgICBlRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVQaHlzaWNhbERldmljZUZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUiwKKyAgICBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0NSRUFURV9JTkZPX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9GRU5DRV9JTkZPX0tIUiwKKyAgICBlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTX0tIUiwKKyAgICBlRXhwb3J0RmVuY2VDcmVhdGVJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX0ZFTkNFX0NSRUFURV9JTkZPX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QT0lOVF9DTElQUElOR19QUk9QRVJUSUVTX0tIUiwKKyAgICBlUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19JTlBVVF9BVFRBQ0hNRU5UX0FTUEVDVF9DUkVBVEVfSU5GT19LSFIsCisgICAgZUltYWdlVmlld1VzYWdlQ3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfVVNBR0VfQ1JFQVRFX0lORk9fS0hSLAorICAgIGVQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJGZWF0dXJlc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSX0ZFQVRVUkVTX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVNfS0hSLAorICAgIGVNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX1JFUVVJUkVNRU5UU19LSFIsCisgICAgZU1lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfQUxMT0NBVEVfSU5GT19LSFIsCisgICAgZUJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yX0tIUiwKKyAgICBlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yX0tIUiwKKyAgICBlSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMl9LSFIsCisgICAgZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzJfS0hSLAorICAgIGVTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0tIUiwKKyAgICBlU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fQ1JFQVRFX0lORk9fS0hSLAorICAgIGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mb0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPX0tIUiwKKyAgICBlQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9QTEFORV9NRU1PUllfSU5GT19LSFIsCisgICAgZUltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfUExBTkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXNLSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTX0tIUiwKKyAgICBlU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU19LSFIsCisgICAgZUJpbmRCdWZmZXJNZW1vcnlJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0lORk9fS0hSLAorICAgIGVCaW5kSW1hZ2VNZW1vcnlJbmZvS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GT19LSFIsCisgICAgZVBoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllc0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVNfS0hSLAorICAgIGVEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9TVVBQT1JUX0tIUiwKKyAgICBlUGh5c2ljYWxEZXZpY2VCdWZmZXJBZGRyZXNzRmVhdHVyZXNFWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0FERFJFU1NfRkVBVFVSRVNfRVhULAorICAgIGVCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3RydWN0dXJlVHlwZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQXBwbGljYXRpb25JbmZvIDogcmV0dXJuICJBcHBsaWNhdGlvbkluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW5zdGFuY2VDcmVhdGVJbmZvIDogcmV0dXJuICJJbnN0YW5jZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlUXVldWVDcmVhdGVJbmZvIDogcmV0dXJuICJEZXZpY2VRdWV1ZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlQ3JlYXRlSW5mbyA6IHJldHVybiAiRGV2aWNlQ3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTdWJtaXRJbmZvIDogcmV0dXJuICJTdWJtaXRJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZU1lbW9yeUFsbG9jYXRlSW5mbyA6IHJldHVybiAiTWVtb3J5QWxsb2NhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZU1hcHBlZE1lbW9yeVJhbmdlIDogcmV0dXJuICJNYXBwZWRNZW1vcnlSYW5nZSI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVCaW5kU3BhcnNlSW5mbyA6IHJldHVybiAiQmluZFNwYXJzZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRmVuY2VDcmVhdGVJbmZvIDogcmV0dXJuICJGZW5jZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2VtYXBob3JlQ3JlYXRlSW5mbyA6IHJldHVybiAiU2VtYXBob3JlQ3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVFdmVudENyZWF0ZUluZm8gOiByZXR1cm4gIkV2ZW50Q3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVRdWVyeVBvb2xDcmVhdGVJbmZvIDogcmV0dXJuICJRdWVyeVBvb2xDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUJ1ZmZlckNyZWF0ZUluZm8gOiByZXR1cm4gIkJ1ZmZlckNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQnVmZmVyVmlld0NyZWF0ZUluZm8gOiByZXR1cm4gIkJ1ZmZlclZpZXdDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUltYWdlQ3JlYXRlSW5mbyA6IHJldHVybiAiSW1hZ2VDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUltYWdlVmlld0NyZWF0ZUluZm8gOiByZXR1cm4gIkltYWdlVmlld0NyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyA6IHJldHVybiAiU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyA6IHJldHVybiAiUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gOiByZXR1cm4gIlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gOiByZXR1cm4gIlBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIDogcmV0dXJuICJQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gOiByZXR1cm4gIlBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gOiByZXR1cm4gIlBpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIDogcmV0dXJuICJQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyA6IHJldHVybiAiUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyA6IHJldHVybiAiUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIDogcmV0dXJuICJQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIDogcmV0dXJuICJQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gOiByZXR1cm4gIkdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUNvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gOiByZXR1cm4gIkNvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIDogcmV0dXJuICJQaXBlbGluZUxheW91dENyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2FtcGxlckNyZWF0ZUluZm8gOiByZXR1cm4gIlNhbXBsZXJDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIDogcmV0dXJuICJEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gOiByZXR1cm4gIkRlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIDogcmV0dXJuICJEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVdyaXRlRGVzY3JpcHRvclNldCA6IHJldHVybiAiV3JpdGVEZXNjcmlwdG9yU2V0IjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUNvcHlEZXNjcmlwdG9yU2V0IDogcmV0dXJuICJDb3B5RGVzY3JpcHRvclNldCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gOiByZXR1cm4gIkZyYW1lYnVmZmVyQ3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVSZW5kZXJQYXNzQ3JlYXRlSW5mbyA6IHJldHVybiAiUmVuZGVyUGFzc0NyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQ29tbWFuZFBvb2xDcmVhdGVJbmZvIDogcmV0dXJuICJDb21tYW5kUG9vbENyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyA6IHJldHVybiAiQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIDogcmV0dXJuICJDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUNvbW1hbmRCdWZmZXJCZWdpbkluZm8gOiByZXR1cm4gIkNvbW1hbmRCdWZmZXJCZWdpbkluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUmVuZGVyUGFzc0JlZ2luSW5mbyA6IHJldHVybiAiUmVuZGVyUGFzc0JlZ2luSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVCdWZmZXJNZW1vcnlCYXJyaWVyIDogcmV0dXJuICJCdWZmZXJNZW1vcnlCYXJyaWVyIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUltYWdlTWVtb3J5QmFycmllciA6IHJldHVybiAiSW1hZ2VNZW1vcnlCYXJyaWVyIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZU1lbW9yeUJhcnJpZXIgOiByZXR1cm4gIk1lbW9yeUJhcnJpZXIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplTG9hZGVySW5zdGFuY2VDcmVhdGVJbmZvIDogcmV0dXJuICJMb2FkZXJJbnN0YW5jZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplTG9hZGVyRGV2aWNlQ3JlYXRlSW5mbyA6IHJldHVybiAiTG9hZGVyRGV2aWNlQ3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQmluZEJ1ZmZlck1lbW9yeUluZm8gOiByZXR1cm4gIkJpbmRCdWZmZXJNZW1vcnlJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUJpbmRJbWFnZU1lbW9yeUluZm8gOiByZXR1cm4gIkJpbmRJbWFnZU1lbW9yeUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgOiByZXR1cm4gIk1lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gOiByZXR1cm4gIk1lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyA6IHJldHVybiAiTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIDogcmV0dXJuICJEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvIDogcmV0dXJuICJEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlR3JvdXBTdWJtaXRJbmZvIDogcmV0dXJuICJEZXZpY2VHcm91cFN1Ym1pdEluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyA6IHJldHVybiAiRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvIDogcmV0dXJuICJCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUJpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyA6IHJldHVybiAiQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIDogcmV0dXJuICJQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gOiByZXR1cm4gIkRldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiA6IHJldHVybiAiQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiA6IHJldHVybiAiSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIDogcmV0dXJuICJJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZU1lbW9yeVJlcXVpcmVtZW50czIgOiByZXR1cm4gIk1lbW9yeVJlcXVpcmVtZW50czIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIDogcmV0dXJuICJTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRm9ybWF0UHJvcGVydGllczIgOiByZXR1cm4gIkZvcm1hdFByb3BlcnRpZXMyIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUltYWdlRm9ybWF0UHJvcGVydGllczIgOiByZXR1cm4gIkltYWdlRm9ybWF0UHJvcGVydGllczIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIDogcmV0dXJuICJQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiA6IHJldHVybiAiUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIDogcmV0dXJuICJQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgOiByZXR1cm4gIlNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIDogcmV0dXJuICJQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyA6IHJldHVybiAiUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIDogcmV0dXJuICJJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8gOiByZXR1cm4gIlBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVJlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIDogcmV0dXJuICJSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzIDogcmV0dXJuICJQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIDogcmV0dXJuICJQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQcm90ZWN0ZWRTdWJtaXRJbmZvIDogcmV0dXJuICJQcm90ZWN0ZWRTdWJtaXRJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzIDogcmV0dXJuICJQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlUXVldWVJbmZvMiA6IHJldHVybiAiRGV2aWNlUXVldWVJbmZvMiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyA6IHJldHVybiAiU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gOiByZXR1cm4gIlNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUJpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyA6IHJldHVybiAiQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvIDogcmV0dXJuICJJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyA6IHJldHVybiAiU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIDogcmV0dXJuICJEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgOiByZXR1cm4gIkV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIDogcmV0dXJuICJQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgOiByZXR1cm4gIkV4dGVybmFsQnVmZmVyUHJvcGVydGllcyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUlkUHJvcGVydGllcyA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VJZFByb3BlcnRpZXMiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvIDogcmV0dXJuICJFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gOiByZXR1cm4gIkV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyA6IHJldHVybiAiRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgOiByZXR1cm4gIkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUV4cG9ydEZlbmNlQ3JlYXRlSW5mbyA6IHJldHVybiAiRXhwb3J0RmVuY2VDcmVhdGVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gOiByZXR1cm4gIkV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8iOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyA6IHJldHVybiAiRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IDogcmV0dXJuICJEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIDogcmV0dXJuICJTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVByZXNlbnRJbmZvS0hSIDogcmV0dXJuICJQcmVzZW50SW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgOiByZXR1cm4gIkRldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgOiByZXR1cm4gIkltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIDogcmV0dXJuICJCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSIDogcmV0dXJuICJBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSIDogcmV0dXJuICJEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiA6IHJldHVybiAiRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiA6IHJldHVybiAiRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiA6IHJldHVybiAiRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlQcmVzZW50SW5mb0tIUiA6IHJldHVybiAiRGlzcGxheVByZXNlbnRJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiA6IHJldHVybiAiWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVhjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIDogcmV0dXJuICJYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgOiByZXR1cm4gIldheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgOiByZXR1cm4gIkFuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIDogcmV0dXJuICJXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIDogcmV0dXJuICJEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCA6IHJldHVybiAiUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCA6IHJldHVybiAiRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgOiByZXR1cm4gIkRlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgOiByZXR1cm4gIkRlYnVnTWFya2VyTWFya2VySW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgOiByZXR1cm4gIkRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIDogcmV0dXJuICJEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViA6IHJldHVybiAiRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgOiByZXR1cm4gIlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIDogcmV0dXJuICJJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVRleHR1cmVMb2RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EIDogcmV0dXJuICJUZXh0dXJlTG9kR2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgOiByZXR1cm4gIlN0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIDogcmV0dXJuICJFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WIDogcmV0dXJuICJFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViA6IHJldHVybiAiSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgOiByZXR1cm4gIkV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIDogcmV0dXJuICJXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVWYWxpZGF0aW9uRmxhZ3NFWFQgOiByZXR1cm4gIlZhbGlkYXRpb25GbGFnc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVWaVN1cmZhY2VDcmVhdGVJbmZvTk4gOiByZXR1cm4gIlZpU3VyZmFjZUNyZWF0ZUluZm9OTiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFzdGNIZHJGZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25Bc3RjSGRyRmVhdHVyZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VWaWV3QXN0Y0RlY29kZU1vZGVFWFQgOiByZXR1cm4gIkltYWdlVmlld0FzdGNEZWNvZGVNb2RlRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQXN0Y0RlY29kZUZlYXR1cmVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZUFzdGNEZWNvZGVGZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgOiByZXR1cm4gIkltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgOiByZXR1cm4gIkV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgOiByZXR1cm4gIk1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgOiByZXR1cm4gIk1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRNZW1vcnlGZEluZm9LSFIgOiByZXR1cm4gIkltcG9ydE1lbW9yeUZkSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlGZFByb3BlcnRpZXNLSFIgOiByZXR1cm4gIk1lbW9yeUZkUHJvcGVydGllc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlHZXRGZEluZm9LSFIgOiByZXR1cm4gIk1lbW9yeUdldEZkSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgOiByZXR1cm4gIldpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgOiByZXR1cm4gIkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgOiByZXR1cm4gIkV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiA6IHJldHVybiAiRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIDogcmV0dXJuICJTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSIDogcmV0dXJuICJJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2VtYXBob3JlR2V0RmRJbmZvS0hSIDogcmV0dXJuICJTZW1hcGhvcmVHZXRGZEluZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUNvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCA6IHJldHVybiAiQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUNvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUIDogcmV0dXJuICJDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQcmVzZW50UmVnaW9uc0tIUiA6IHJldHVybiAiUHJlc2VudFJlZ2lvbnNLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYIDogcmV0dXJuICJPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggOiByZXR1cm4gIkluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUNtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggOiByZXR1cm4gIkNtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIDogcmV0dXJuICJDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggOiByZXR1cm4gIkRldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggOiByZXR1cm4gIkRldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgOiByZXR1cm4gIlBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIDogcmV0dXJuICJTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5UG93ZXJJbmZvRVhUIDogcmV0dXJuICJEaXNwbGF5UG93ZXJJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURldmljZUV2ZW50SW5mb0VYVCA6IHJldHVybiAiRGV2aWNlRXZlbnRJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlFdmVudEluZm9FWFQgOiByZXR1cm4gIkRpc3BsYXlFdmVudEluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgOiByZXR1cm4gIlN3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVByZXNlbnRUaW1lc0luZm9HT09HTEUgOiByZXR1cm4gIlByZXNlbnRUaW1lc0luZm9HT09HTEUiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgOiByZXR1cm4gIlBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgOiByZXR1cm4gIlBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCA6IHJldHVybiAiUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUIDogcmV0dXJuICJQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSGRyTWV0YWRhdGFFWFQgOiByZXR1cm4gIkhkck1ldGFkYXRhRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIDogcmV0dXJuICJGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgOiByZXR1cm4gIkZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiA6IHJldHVybiAiUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiA6IHJldHVybiAiQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVBdHRhY2htZW50UmVmZXJlbmNlMktIUiA6IHJldHVybiAiQXR0YWNobWVudFJlZmVyZW5jZTJLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU3VicGFzc0Rlc2NyaXB0aW9uMktIUiA6IHJldHVybiAiU3VicGFzc0Rlc2NyaXB0aW9uMktIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTdWJwYXNzRGVwZW5kZW5jeTJLSFIgOiByZXR1cm4gIlN1YnBhc3NEZXBlbmRlbmN5MktIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgOiByZXR1cm4gIlJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTdWJwYXNzQmVnaW5JbmZvS0hSIDogcmV0dXJuICJTdWJwYXNzQmVnaW5JbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVN1YnBhc3NFbmRJbmZvS0hSIDogcmV0dXJuICJTdWJwYXNzRW5kSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiA6IHJldHVybiAiU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgOiByZXR1cm4gIkltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUV4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIDogcmV0dXJuICJFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiA6IHJldHVybiAiRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1wb3J0RmVuY2VGZEluZm9LSFIgOiByZXR1cm4gIkltcG9ydEZlbmNlRmRJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUZlbmNlR2V0RmRJbmZvS0hSIDogcmV0dXJuICJGZW5jZUdldEZkSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgOiByZXR1cm4gIlF1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiA6IHJldHVybiAiUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSIDogcmV0dXJuICJBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGVyZm9ybWFuY2VDb3VudGVyS0hSIDogcmV0dXJuICJQZXJmb3JtYW5jZUNvdW50ZXJLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIgOiByZXR1cm4gIlBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIDogcmV0dXJuICJQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiA6IHJldHVybiAiU3VyZmFjZUNhcGFiaWxpdGllczJLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU3VyZmFjZUZvcm1hdDJLSFIgOiByZXR1cm4gIlN1cmZhY2VGb3JtYXQyS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlQcm9wZXJ0aWVzMktIUiA6IHJldHVybiAiRGlzcGxheVByb3BlcnRpZXMyS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIDogcmV0dXJuICJEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIDogcmV0dXJuICJEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlQbGFuZUluZm8yS0hSIDogcmV0dXJuICJEaXNwbGF5UGxhbmVJbmZvMktIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIDogcmV0dXJuICJEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUlvc1N1cmZhY2VDcmVhdGVJbmZvTVZLIDogcmV0dXJuICJJb3NTdXJmYWNlQ3JlYXRlSW5mb01WSyI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNYWNvc1N1cmZhY2VDcmVhdGVJbmZvTVZLIDogcmV0dXJuICJNYWNvc1N1cmZhY2VDcmVhdGVJbmZvTVZLIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCA6IHJldHVybiAiRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIDogcmV0dXJuICJEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z1V0aWxzTGFiZWxFWFQgOiByZXR1cm4gIkRlYnVnVXRpbHNMYWJlbEVYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIDogcmV0dXJuICJEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIDogcmV0dXJuICJEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQgOiByZXR1cm4gIkFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCA6IHJldHVybiAiQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgOiByZXR1cm4gIkFuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIDogcmV0dXJuICJJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCA6IHJldHVybiAiTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxGb3JtYXRBTkRST0lEIDogcmV0dXJuICJFeHRlcm5hbEZvcm1hdEFORFJPSUQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgOiByZXR1cm4gIlNhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVdyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCA6IHJldHVybiAiV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCA6IHJldHVybiAiRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVNhbXBsZUxvY2F0aW9uc0luZm9FWFQgOiByZXR1cm4gIlNhbXBsZUxvY2F0aW9uc0luZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCA6IHJldHVybiAiUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCA6IHJldHVybiAiUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiA6IHJldHVybiAiSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCA6IHJldHVybiAiUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViA6IHJldHVybiAiUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIDogcmV0dXJuICJQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU2hhZGVyU21CdWlsdGluc0ZlYXR1cmVzTlYgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlU2hhZGVyU21CdWlsdGluc0ZlYXR1cmVzTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTaGFkZXJTbUJ1aWx0aW5zUHJvcGVydGllc05WIDogcmV0dXJuICJQaHlzaWNhbERldmljZVNoYWRlclNtQnVpbHRpbnNQcm9wZXJ0aWVzTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCA6IHJldHVybiAiRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgOiByZXR1cm4gIkRybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCA6IHJldHVybiAiSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgOiByZXR1cm4gIkltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgOiByZXR1cm4gIkltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgOiByZXR1cm4gIlZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCA6IHJldHVybiAiU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCA6IHJldHVybiAiRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgOiByZXR1cm4gIkRlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIDogcmV0dXJuICJEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgOiByZXR1cm4gIlBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViA6IHJldHVybiAiUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIDogcmV0dXJuICJSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIDogcmV0dXJuICJBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplR2VvbWV0cnlOViA6IHJldHVybiAiR2VvbWV0cnlOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVHZW9tZXRyeVRyaWFuZ2xlc05WIDogcmV0dXJuICJHZW9tZXRyeVRyaWFuZ2xlc05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUdlb21ldHJ5QWFiYk5WIDogcmV0dXJuICJHZW9tZXRyeUFhYmJOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIDogcmV0dXJuICJCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVdyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIDogcmV0dXJuICJXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgOiByZXR1cm4gIkFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgOiByZXR1cm4gIlJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgOiByZXR1cm4gIkFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WIDogcmV0dXJuICJQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCA6IHJldHVybiAiRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgOiByZXR1cm4gIkltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgOiByZXR1cm4gIk1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgOiByZXR1cm4gIlBpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCA6IHJldHVybiAiQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQgOiByZXR1cm4gIkRldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUIDogcmV0dXJuICJQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUHJlc2VudEZyYW1lVG9rZW5HR1AgOiByZXR1cm4gIlByZXNlbnRGcmFtZVRva2VuR0dQIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgOiByZXR1cm4gIlBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSIDogcmV0dXJuICJQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIDogcmV0dXJuICJQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgOiByZXR1cm4gIlN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WIDogcmV0dXJuICJQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIDogcmV0dXJuICJQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIDogcmV0dXJuICJQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIDogcmV0dXJuICJQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQ2hlY2twb2ludERhdGFOViA6IHJldHVybiAiQ2hlY2twb2ludERhdGFOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYgOiByZXR1cm4gIlF1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgOiByZXR1cm4gIlNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVRpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiA6IHJldHVybiAiVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVNlbWFwaG9yZVdhaXRJbmZvS0hSIDogcmV0dXJuICJTZW1hcGhvcmVXYWl0SW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTZW1hcGhvcmVTaWduYWxJbmZvS0hSIDogcmV0dXJuICJTZW1hcGhvcmVTaWduYWxJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMIDogcmV0dXJuICJQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwgOiByZXR1cm4gIlF1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgOiByZXR1cm4gIkluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCA6IHJldHVybiAiUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwgOiByZXR1cm4gIlBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgOiByZXR1cm4gIlBlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCA6IHJldHVybiAiUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVBjaUJ1c0luZm9Qcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZVBjaUJ1c0luZm9Qcm9wZXJ0aWVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EIDogcmV0dXJuICJEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCA6IHJldHVybiAiU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VwaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBIDogcmV0dXJuICJJbWFnZXBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCA6IHJldHVybiAiTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIDogcmV0dXJuICJSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgOiByZXR1cm4gIlBpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIDogcmV0dXJuICJQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCA6IHJldHVybiAiTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiA6IHJldHVybiAiU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiA6IHJldHVybiAiQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiA6IHJldHVybiAiQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgOiByZXR1cm4gIkJ1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIDogcmV0dXJuICJJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplVmFsaWRhdGlvbkZlYXR1cmVzRVhUIDogcmV0dXJuICJWYWxpZGF0aW9uRmVhdHVyZXNFWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIDogcmV0dXJuICJDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIDogcmV0dXJuICJQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViA6IHJldHVybiAiUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViA6IHJldHVybiAiRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSIDogcmV0dXJuICJQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCA6IHJldHVybiAiU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVN1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIDogcmV0dXJuICJTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCA6IHJldHVybiAiU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCA6IHJldHVybiAiSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgOiByZXR1cm4gIkJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZUJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiA6IHJldHVybiAiQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSIDogcmV0dXJuICJNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgOiByZXR1cm4gIkRldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIDogcmV0dXJuICJQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIDogcmV0dXJuICJQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVJbmZvS0hSIDogcmV0dXJuICJQaXBlbGluZUluZm9LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiA6IHJldHVybiAiUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIDogcmV0dXJuICJQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiA6IHJldHVybiAiUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIjsKKyAgICAgIGNhc2UgU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIgOiByZXR1cm4gIlBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIiOworICAgICAgY2FzZSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgOiByZXR1cm4gIlBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCI7CisgICAgICBjYXNlIFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCA6IHJldHVybiAiUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFN1YnBhc3NDb250ZW50cworICB7CisgICAgZUlubGluZSA9IFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FLAorICAgIGVTZWNvbmRhcnlDb21tYW5kQnVmZmVycyA9IFZLX1NVQlBBU1NfQ09OVEVOVFNfU0VDT05EQVJZX0NPTU1BTkRfQlVGRkVSUworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3VicGFzc0NvbnRlbnRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFN1YnBhc3NDb250ZW50czo6ZUlubGluZSA6IHJldHVybiAiSW5saW5lIjsKKyAgICAgIGNhc2UgU3VicGFzc0NvbnRlbnRzOjplU2Vjb25kYXJ5Q29tbWFuZEJ1ZmZlcnMgOiByZXR1cm4gIlNlY29uZGFyeUNvbW1hbmRCdWZmZXJzIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBTeXN0ZW1BbGxvY2F0aW9uU2NvcGUKKyAgeworICAgIGVDb21tYW5kID0gVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCwKKyAgICBlT2JqZWN0ID0gVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNULAorICAgIGVDYWNoZSA9IFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0NBQ0hFLAorICAgIGVEZXZpY2UgPSBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9ERVZJQ0UsCisgICAgZUluc3RhbmNlID0gVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFN5c3RlbUFsbG9jYXRpb25TY29wZSB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTeXN0ZW1BbGxvY2F0aW9uU2NvcGU6OmVDb21tYW5kIDogcmV0dXJuICJDb21tYW5kIjsKKyAgICAgIGNhc2UgU3lzdGVtQWxsb2NhdGlvblNjb3BlOjplT2JqZWN0IDogcmV0dXJuICJPYmplY3QiOworICAgICAgY2FzZSBTeXN0ZW1BbGxvY2F0aW9uU2NvcGU6OmVDYWNoZSA6IHJldHVybiAiQ2FjaGUiOworICAgICAgY2FzZSBTeXN0ZW1BbGxvY2F0aW9uU2NvcGU6OmVEZXZpY2UgOiByZXR1cm4gIkRldmljZSI7CisgICAgICBjYXNlIFN5c3RlbUFsbG9jYXRpb25TY29wZTo6ZUluc3RhbmNlIDogcmV0dXJuICJJbnN0YW5jZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luCisgIHsKKyAgICBlVXBwZXJMZWZ0ID0gVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fVVBQRVJfTEVGVCwKKyAgICBlTG93ZXJMZWZ0ID0gVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fTE9XRVJfTEVGVCwKKyAgICBlVXBwZXJMZWZ0S0hSID0gVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fVVBQRVJfTEVGVF9LSFIsCisgICAgZUxvd2VyTGVmdEtIUiA9IFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX0xPV0VSX0xFRlRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4gdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luOjplVXBwZXJMZWZ0IDogcmV0dXJuICJVcHBlckxlZnQiOworICAgICAgY2FzZSBUZXNzZWxsYXRpb25Eb21haW5PcmlnaW46OmVMb3dlckxlZnQgOiByZXR1cm4gIkxvd2VyTGVmdCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIGVudW0gY2xhc3MgVGltZURvbWFpbkVYVAorICB7CisgICAgZURldmljZSA9IFZLX1RJTUVfRE9NQUlOX0RFVklDRV9FWFQsCisgICAgZUNsb2NrTW9ub3RvbmljID0gVktfVElNRV9ET01BSU5fQ0xPQ0tfTU9OT1RPTklDX0VYVCwKKyAgICBlQ2xvY2tNb25vdG9uaWNSYXcgPSBWS19USU1FX0RPTUFJTl9DTE9DS19NT05PVE9OSUNfUkFXX0VYVCwKKyAgICBlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIgPSBWS19USU1FX0RPTUFJTl9RVUVSWV9QRVJGT1JNQU5DRV9DT1VOVEVSX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggVGltZURvbWFpbkVYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBUaW1lRG9tYWluRVhUOjplRGV2aWNlIDogcmV0dXJuICJEZXZpY2UiOworICAgICAgY2FzZSBUaW1lRG9tYWluRVhUOjplQ2xvY2tNb25vdG9uaWMgOiByZXR1cm4gIkNsb2NrTW9ub3RvbmljIjsKKyAgICAgIGNhc2UgVGltZURvbWFpbkVYVDo6ZUNsb2NrTW9ub3RvbmljUmF3IDogcmV0dXJuICJDbG9ja01vbm90b25pY1JhdyI7CisgICAgICBjYXNlIFRpbWVEb21haW5FWFQ6OmVRdWVyeVBlcmZvcm1hbmNlQ291bnRlciA6IHJldHVybiAiUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFZhbGlkYXRpb25DYWNoZUhlYWRlclZlcnNpb25FWFQKKyAgeworICAgIGVPbmUgPSBWS19WQUxJREFUSU9OX0NBQ0hFX0hFQURFUl9WRVJTSU9OX09ORV9FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFZhbGlkYXRpb25DYWNoZUhlYWRlclZlcnNpb25FWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgVmFsaWRhdGlvbkNhY2hlSGVhZGVyVmVyc2lvbkVYVDo6ZU9uZSA6IHJldHVybiAiT25lIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBWYWxpZGF0aW9uQ2hlY2tFWFQKKyAgeworICAgIGVBbGwgPSBWS19WQUxJREFUSU9OX0NIRUNLX0FMTF9FWFQsCisgICAgZVNoYWRlcnMgPSBWS19WQUxJREFUSU9OX0NIRUNLX1NIQURFUlNfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBWYWxpZGF0aW9uQ2hlY2tFWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgVmFsaWRhdGlvbkNoZWNrRVhUOjplQWxsIDogcmV0dXJuICJBbGwiOworICAgICAgY2FzZSBWYWxpZGF0aW9uQ2hlY2tFWFQ6OmVTaGFkZXJzIDogcmV0dXJuICJTaGFkZXJzIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQKKyAgeworICAgIGVBbGwgPSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BTExfRVhULAorICAgIGVTaGFkZXJzID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfU0hBREVSU19FWFQsCisgICAgZVRocmVhZFNhZmV0eSA9IFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1RIUkVBRF9TQUZFVFlfRVhULAorICAgIGVBcGlQYXJhbWV0ZXJzID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQVBJX1BBUkFNRVRFUlNfRVhULAorICAgIGVPYmplY3RMaWZldGltZXMgPSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9PQkpFQ1RfTElGRVRJTUVTX0VYVCwKKyAgICBlQ29yZUNoZWNrcyA9IFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0NPUkVfQ0hFQ0tTX0VYVCwKKyAgICBlVW5pcXVlSGFuZGxlcyA9IFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1VOSVFVRV9IQU5ETEVTX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVDo6ZUFsbCA6IHJldHVybiAiQWxsIjsKKyAgICAgIGNhc2UgVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUOjplU2hhZGVycyA6IHJldHVybiAiU2hhZGVycyI7CisgICAgICBjYXNlIFZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVDo6ZVRocmVhZFNhZmV0eSA6IHJldHVybiAiVGhyZWFkU2FmZXR5IjsKKyAgICAgIGNhc2UgVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUOjplQXBpUGFyYW1ldGVycyA6IHJldHVybiAiQXBpUGFyYW1ldGVycyI7CisgICAgICBjYXNlIFZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVDo6ZU9iamVjdExpZmV0aW1lcyA6IHJldHVybiAiT2JqZWN0TGlmZXRpbWVzIjsKKyAgICAgIGNhc2UgVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUOjplQ29yZUNoZWNrcyA6IHJldHVybiAiQ29yZUNoZWNrcyI7CisgICAgICBjYXNlIFZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVDo6ZVVuaXF1ZUhhbmRsZXMgOiByZXR1cm4gIlVuaXF1ZUhhbmRsZXMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUCisgIHsKKyAgICBlR3B1QXNzaXN0ZWQgPSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9FWFQsCisgICAgZUdwdUFzc2lzdGVkUmVzZXJ2ZUJpbmRpbmdTbG90ID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfUkVTRVJWRV9CSU5ESU5HX1NMT1RfRVhULAorICAgIGVCZXN0UHJhY3RpY2VzID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9CRVNUX1BSQUNUSUNFU19FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUOjplR3B1QXNzaXN0ZWQgOiByZXR1cm4gIkdwdUFzc2lzdGVkIjsKKyAgICAgIGNhc2UgVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQ6OmVHcHVBc3Npc3RlZFJlc2VydmVCaW5kaW5nU2xvdCA6IHJldHVybiAiR3B1QXNzaXN0ZWRSZXNlcnZlQmluZGluZ1Nsb3QiOworICAgICAgY2FzZSBWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVDo6ZUJlc3RQcmFjdGljZXMgOiByZXR1cm4gIkJlc3RQcmFjdGljZXMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFZlbmRvcklkCisgIHsKKyAgICBlVklWID0gVktfVkVORE9SX0lEX1ZJViwKKyAgICBlVlNJID0gVktfVkVORE9SX0lEX1ZTSSwKKyAgICBlS2F6YW4gPSBWS19WRU5ET1JfSURfS0FaQU4KKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFZlbmRvcklkIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFZlbmRvcklkOjplVklWIDogcmV0dXJuICJWSVYiOworICAgICAgY2FzZSBWZW5kb3JJZDo6ZVZTSSA6IHJldHVybiAiVlNJIjsKKyAgICAgIGNhc2UgVmVuZG9ySWQ6OmVLYXphbiA6IHJldHVybiAiS2F6YW4iOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICBlbnVtIGNsYXNzIFZlcnRleElucHV0UmF0ZQorICB7CisgICAgZVZlcnRleCA9IFZLX1ZFUlRFWF9JTlBVVF9SQVRFX1ZFUlRFWCwKKyAgICBlSW5zdGFuY2UgPSBWS19WRVJURVhfSU5QVVRfUkFURV9JTlNUQU5DRQorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggVmVydGV4SW5wdXRSYXRlIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFZlcnRleElucHV0UmF0ZTo6ZVZlcnRleCA6IHJldHVybiAiVmVydGV4IjsKKyAgICAgIGNhc2UgVmVydGV4SW5wdXRSYXRlOjplSW5zdGFuY2UgOiByZXR1cm4gIkluc3RhbmNlIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgZW51bSBjbGFzcyBWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYKKyAgeworICAgIGVQb3NpdGl2ZVggPSBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfWF9OViwKKyAgICBlTmVnYXRpdmVYID0gVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX05FR0FUSVZFX1hfTlYsCisgICAgZVBvc2l0aXZlWSA9IFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9ZX05WLAorICAgIGVOZWdhdGl2ZVkgPSBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfWV9OViwKKyAgICBlUG9zaXRpdmVaID0gVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1pfTlYsCisgICAgZU5lZ2F0aXZlWiA9IFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9ORUdBVElWRV9aX05WLAorICAgIGVQb3NpdGl2ZVcgPSBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfV19OViwKKyAgICBlTmVnYXRpdmVXID0gVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX05FR0FUSVZFX1dfTlYKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY6OmVQb3NpdGl2ZVggOiByZXR1cm4gIlBvc2l0aXZlWCI7CisgICAgICBjYXNlIFZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVjo6ZU5lZ2F0aXZlWCA6IHJldHVybiAiTmVnYXRpdmVYIjsKKyAgICAgIGNhc2UgVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WOjplUG9zaXRpdmVZIDogcmV0dXJuICJQb3NpdGl2ZVkiOworICAgICAgY2FzZSBWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY6OmVOZWdhdGl2ZVkgOiByZXR1cm4gIk5lZ2F0aXZlWSI7CisgICAgICBjYXNlIFZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVjo6ZVBvc2l0aXZlWiA6IHJldHVybiAiUG9zaXRpdmVaIjsKKyAgICAgIGNhc2UgVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WOjplTmVnYXRpdmVaIDogcmV0dXJuICJOZWdhdGl2ZVoiOworICAgICAgY2FzZSBWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY6OmVQb3NpdGl2ZVcgOiByZXR1cm4gIlBvc2l0aXZlVyI7CisgICAgICBjYXNlIFZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVjo6ZU5lZ2F0aXZlVyA6IHJldHVybiAiTmVnYXRpdmVXIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8T2JqZWN0VHlwZSB2YWx1ZT4KKyAgc3RydWN0IGNwcF90eXBlCisgIHsKKyAgfTsKKworICBlbnVtIGNsYXNzIEFjY2Vzc0ZsYWdCaXRzCisgIHsKKyAgICBlSW5kaXJlY3RDb21tYW5kUmVhZCA9IFZLX0FDQ0VTU19JTkRJUkVDVF9DT01NQU5EX1JFQURfQklULAorICAgIGVJbmRleFJlYWQgPSBWS19BQ0NFU1NfSU5ERVhfUkVBRF9CSVQsCisgICAgZVZlcnRleEF0dHJpYnV0ZVJlYWQgPSBWS19BQ0NFU1NfVkVSVEVYX0FUVFJJQlVURV9SRUFEX0JJVCwKKyAgICBlVW5pZm9ybVJlYWQgPSBWS19BQ0NFU1NfVU5JRk9STV9SRUFEX0JJVCwKKyAgICBlSW5wdXRBdHRhY2htZW50UmVhZCA9IFZLX0FDQ0VTU19JTlBVVF9BVFRBQ0hNRU5UX1JFQURfQklULAorICAgIGVTaGFkZXJSZWFkID0gVktfQUNDRVNTX1NIQURFUl9SRUFEX0JJVCwKKyAgICBlU2hhZGVyV3JpdGUgPSBWS19BQ0NFU1NfU0hBREVSX1dSSVRFX0JJVCwKKyAgICBlQ29sb3JBdHRhY2htZW50UmVhZCA9IFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfQklULAorICAgIGVDb2xvckF0dGFjaG1lbnRXcml0ZSA9IFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVCwKKyAgICBlRGVwdGhTdGVuY2lsQXR0YWNobWVudFJlYWQgPSBWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1JFQURfQklULAorICAgIGVEZXB0aFN0ZW5jaWxBdHRhY2htZW50V3JpdGUgPSBWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1dSSVRFX0JJVCwKKyAgICBlVHJhbnNmZXJSZWFkID0gVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklULAorICAgIGVUcmFuc2ZlcldyaXRlID0gVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCwKKyAgICBlSG9zdFJlYWQgPSBWS19BQ0NFU1NfSE9TVF9SRUFEX0JJVCwKKyAgICBlSG9zdFdyaXRlID0gVktfQUNDRVNTX0hPU1RfV1JJVEVfQklULAorICAgIGVNZW1vcnlSZWFkID0gVktfQUNDRVNTX01FTU9SWV9SRUFEX0JJVCwKKyAgICBlTWVtb3J5V3JpdGUgPSBWS19BQ0NFU1NfTUVNT1JZX1dSSVRFX0JJVCwKKyAgICBlVHJhbnNmb3JtRmVlZGJhY2tXcml0ZUVYVCA9IFZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfV1JJVEVfQklUX0VYVCwKKyAgICBlVHJhbnNmb3JtRmVlZGJhY2tDb3VudGVyUmVhZEVYVCA9IFZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9SRUFEX0JJVF9FWFQsCisgICAgZVRyYW5zZm9ybUZlZWRiYWNrQ291bnRlcldyaXRlRVhUID0gVktfQUNDRVNTX1RSQU5TRk9STV9GRUVEQkFDS19DT1VOVEVSX1dSSVRFX0JJVF9FWFQsCisgICAgZUNvbmRpdGlvbmFsUmVuZGVyaW5nUmVhZEVYVCA9IFZLX0FDQ0VTU19DT05ESVRJT05BTF9SRU5ERVJJTkdfUkVBRF9CSVRfRVhULAorICAgIGVDb21tYW5kUHJvY2Vzc1JlYWROVlggPSBWS19BQ0NFU1NfQ09NTUFORF9QUk9DRVNTX1JFQURfQklUX05WWCwKKyAgICBlQ29tbWFuZFByb2Nlc3NXcml0ZU5WWCA9IFZLX0FDQ0VTU19DT01NQU5EX1BST0NFU1NfV1JJVEVfQklUX05WWCwKKyAgICBlQ29sb3JBdHRhY2htZW50UmVhZE5vbmNvaGVyZW50RVhUID0gVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfUkVBRF9OT05DT0hFUkVOVF9CSVRfRVhULAorICAgIGVTaGFkaW5nUmF0ZUltYWdlUmVhZE5WID0gVktfQUNDRVNTX1NIQURJTkdfUkFURV9JTUFHRV9SRUFEX0JJVF9OViwKKyAgICBlQWNjZWxlcmF0aW9uU3RydWN0dXJlUmVhZE5WID0gVktfQUNDRVNTX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUkVBRF9CSVRfTlYsCisgICAgZUFjY2VsZXJhdGlvblN0cnVjdHVyZVdyaXRlTlYgPSBWS19BQ0NFU1NfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9XUklURV9CSVRfTlYsCisgICAgZUZyYWdtZW50RGVuc2l0eU1hcFJlYWRFWFQgPSBWS19BQ0NFU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfUkVBRF9CSVRfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBBY2Nlc3NGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZUluZGlyZWN0Q29tbWFuZFJlYWQgOiByZXR1cm4gIkluZGlyZWN0Q29tbWFuZFJlYWQiOworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZUluZGV4UmVhZCA6IHJldHVybiAiSW5kZXhSZWFkIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVWZXJ0ZXhBdHRyaWJ1dGVSZWFkIDogcmV0dXJuICJWZXJ0ZXhBdHRyaWJ1dGVSZWFkIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVVbmlmb3JtUmVhZCA6IHJldHVybiAiVW5pZm9ybVJlYWQiOworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZUlucHV0QXR0YWNobWVudFJlYWQgOiByZXR1cm4gIklucHV0QXR0YWNobWVudFJlYWQiOworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZVNoYWRlclJlYWQgOiByZXR1cm4gIlNoYWRlclJlYWQiOworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZVNoYWRlcldyaXRlIDogcmV0dXJuICJTaGFkZXJXcml0ZSI7CisgICAgICBjYXNlIEFjY2Vzc0ZsYWdCaXRzOjplQ29sb3JBdHRhY2htZW50UmVhZCA6IHJldHVybiAiQ29sb3JBdHRhY2htZW50UmVhZCI7CisgICAgICBjYXNlIEFjY2Vzc0ZsYWdCaXRzOjplQ29sb3JBdHRhY2htZW50V3JpdGUgOiByZXR1cm4gIkNvbG9yQXR0YWNobWVudFdyaXRlIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVEZXB0aFN0ZW5jaWxBdHRhY2htZW50UmVhZCA6IHJldHVybiAiRGVwdGhTdGVuY2lsQXR0YWNobWVudFJlYWQiOworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnRXcml0ZSA6IHJldHVybiAiRGVwdGhTdGVuY2lsQXR0YWNobWVudFdyaXRlIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2ZlclJlYWQgOiByZXR1cm4gIlRyYW5zZmVyUmVhZCI7CisgICAgICBjYXNlIEFjY2Vzc0ZsYWdCaXRzOjplVHJhbnNmZXJXcml0ZSA6IHJldHVybiAiVHJhbnNmZXJXcml0ZSI7CisgICAgICBjYXNlIEFjY2Vzc0ZsYWdCaXRzOjplSG9zdFJlYWQgOiByZXR1cm4gIkhvc3RSZWFkIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVIb3N0V3JpdGUgOiByZXR1cm4gIkhvc3RXcml0ZSI7CisgICAgICBjYXNlIEFjY2Vzc0ZsYWdCaXRzOjplTWVtb3J5UmVhZCA6IHJldHVybiAiTWVtb3J5UmVhZCI7CisgICAgICBjYXNlIEFjY2Vzc0ZsYWdCaXRzOjplTWVtb3J5V3JpdGUgOiByZXR1cm4gIk1lbW9yeVdyaXRlIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2Zvcm1GZWVkYmFja1dyaXRlRVhUIDogcmV0dXJuICJUcmFuc2Zvcm1GZWVkYmFja1dyaXRlRVhUIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2Zvcm1GZWVkYmFja0NvdW50ZXJSZWFkRVhUIDogcmV0dXJuICJUcmFuc2Zvcm1GZWVkYmFja0NvdW50ZXJSZWFkRVhUIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2Zvcm1GZWVkYmFja0NvdW50ZXJXcml0ZUVYVCA6IHJldHVybiAiVHJhbnNmb3JtRmVlZGJhY2tDb3VudGVyV3JpdGVFWFQiOworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZUNvbmRpdGlvbmFsUmVuZGVyaW5nUmVhZEVYVCA6IHJldHVybiAiQ29uZGl0aW9uYWxSZW5kZXJpbmdSZWFkRVhUIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVDb21tYW5kUHJvY2Vzc1JlYWROVlggOiByZXR1cm4gIkNvbW1hbmRQcm9jZXNzUmVhZE5WWCI7CisgICAgICBjYXNlIEFjY2Vzc0ZsYWdCaXRzOjplQ29tbWFuZFByb2Nlc3NXcml0ZU5WWCA6IHJldHVybiAiQ29tbWFuZFByb2Nlc3NXcml0ZU5WWCI7CisgICAgICBjYXNlIEFjY2Vzc0ZsYWdCaXRzOjplQ29sb3JBdHRhY2htZW50UmVhZE5vbmNvaGVyZW50RVhUIDogcmV0dXJuICJDb2xvckF0dGFjaG1lbnRSZWFkTm9uY29oZXJlbnRFWFQiOworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZVNoYWRpbmdSYXRlSW1hZ2VSZWFkTlYgOiByZXR1cm4gIlNoYWRpbmdSYXRlSW1hZ2VSZWFkTlYiOworICAgICAgY2FzZSBBY2Nlc3NGbGFnQml0czo6ZUFjY2VsZXJhdGlvblN0cnVjdHVyZVJlYWROViA6IHJldHVybiAiQWNjZWxlcmF0aW9uU3RydWN0dXJlUmVhZE5WIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVXcml0ZU5WIDogcmV0dXJuICJBY2NlbGVyYXRpb25TdHJ1Y3R1cmVXcml0ZU5WIjsKKyAgICAgIGNhc2UgQWNjZXNzRmxhZ0JpdHM6OmVGcmFnbWVudERlbnNpdHlNYXBSZWFkRVhUIDogcmV0dXJuICJGcmFnbWVudERlbnNpdHlNYXBSZWFkRVhUIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgQWNjZXNzRmxhZ3MgPSBGbGFnczxBY2Nlc3NGbGFnQml0cywgVmtBY2Nlc3NGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8QWNjZXNzRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplSW5kaXJlY3RDb21tYW5kUmVhZCkgfCBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplSW5kZXhSZWFkKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVWZXJ0ZXhBdHRyaWJ1dGVSZWFkKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVVbmlmb3JtUmVhZCkgfCBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplSW5wdXRBdHRhY2htZW50UmVhZCkgfCBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplU2hhZGVyUmVhZCkgfCBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplU2hhZGVyV3JpdGUpIHwgVmtGbGFncyhBY2Nlc3NGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudFJlYWQpIHwgVmtGbGFncyhBY2Nlc3NGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudFdyaXRlKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVEZXB0aFN0ZW5jaWxBdHRhY2htZW50UmVhZCkgfCBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplRGVwdGhTdGVuY2lsQXR0YWNobWVudFdyaXRlKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2ZlclJlYWQpIHwgVmtGbGFncyhBY2Nlc3NGbGFnQml0czo6ZVRyYW5zZmVyV3JpdGUpIHwgVmtGbGFncyhBY2Nlc3NGbGFnQml0czo6ZUhvc3RSZWFkKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVIb3N0V3JpdGUpIHwgVmtGbGFncyhBY2Nlc3NGbGFnQml0czo6ZU1lbW9yeVJlYWQpIHwgVmtGbGFncyhBY2Nlc3NGbGFnQml0czo6ZU1lbW9yeVdyaXRlKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2Zvcm1GZWVkYmFja1dyaXRlRVhUKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2Zvcm1GZWVkYmFja0NvdW50ZXJSZWFkRVhUKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2Zvcm1GZWVkYmFja0NvdW50ZXJXcml0ZUVYVCkgfCBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplQ29uZGl0aW9uYWxSZW5kZXJpbmdSZWFkRVhUKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVDb21tYW5kUHJvY2Vzc1JlYWROVlgpIHwgVmtGbGFncyhBY2Nlc3NGbGFnQml0czo6ZUNvbW1hbmRQcm9jZXNzV3JpdGVOVlgpIHwgVmtGbGFncyhBY2Nlc3NGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudFJlYWROb25jb2hlcmVudEVYVCkgfCBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplU2hhZGluZ1JhdGVJbWFnZVJlYWROVikgfCBWa0ZsYWdzKEFjY2Vzc0ZsYWdCaXRzOjplQWNjZWxlcmF0aW9uU3RydWN0dXJlUmVhZE5WKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVXcml0ZU5WKSB8IFZrRmxhZ3MoQWNjZXNzRmxhZ0JpdHM6OmVGcmFnbWVudERlbnNpdHlNYXBSZWFkRVhUKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQWNjZXNzRmxhZ3Mgb3BlcmF0b3J8KCBBY2Nlc3NGbGFnQml0cyBiaXQwLCBBY2Nlc3NGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEFjY2Vzc0ZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQWNjZXNzRmxhZ3Mgb3BlcmF0b3ImKCBBY2Nlc3NGbGFnQml0cyBiaXQwLCBBY2Nlc3NGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEFjY2Vzc0ZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQWNjZXNzRmxhZ3Mgb3BlcmF0b3JeKCBBY2Nlc3NGbGFnQml0cyBiaXQwLCBBY2Nlc3NGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEFjY2Vzc0ZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQWNjZXNzRmxhZ3Mgb3BlcmF0b3J+KCBBY2Nlc3NGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIEFjY2Vzc0ZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQWNjZXNzRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplSW5kaXJlY3RDb21tYW5kUmVhZCApIHJlc3VsdCArPSAiSW5kaXJlY3RDb21tYW5kUmVhZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplSW5kZXhSZWFkICkgcmVzdWx0ICs9ICJJbmRleFJlYWQgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZVZlcnRleEF0dHJpYnV0ZVJlYWQgKSByZXN1bHQgKz0gIlZlcnRleEF0dHJpYnV0ZVJlYWQgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZVVuaWZvcm1SZWFkICkgcmVzdWx0ICs9ICJVbmlmb3JtUmVhZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplSW5wdXRBdHRhY2htZW50UmVhZCApIHJlc3VsdCArPSAiSW5wdXRBdHRhY2htZW50UmVhZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplU2hhZGVyUmVhZCApIHJlc3VsdCArPSAiU2hhZGVyUmVhZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplU2hhZGVyV3JpdGUgKSByZXN1bHQgKz0gIlNoYWRlcldyaXRlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQWNjZXNzRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnRSZWFkICkgcmVzdWx0ICs9ICJDb2xvckF0dGFjaG1lbnRSZWFkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQWNjZXNzRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnRXcml0ZSApIHJlc3VsdCArPSAiQ29sb3JBdHRhY2htZW50V3JpdGUgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnRSZWFkICkgcmVzdWx0ICs9ICJEZXB0aFN0ZW5jaWxBdHRhY2htZW50UmVhZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplRGVwdGhTdGVuY2lsQXR0YWNobWVudFdyaXRlICkgcmVzdWx0ICs9ICJEZXB0aFN0ZW5jaWxBdHRhY2htZW50V3JpdGUgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZVRyYW5zZmVyUmVhZCApIHJlc3VsdCArPSAiVHJhbnNmZXJSZWFkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQWNjZXNzRmxhZ0JpdHM6OmVUcmFuc2ZlcldyaXRlICkgcmVzdWx0ICs9ICJUcmFuc2ZlcldyaXRlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQWNjZXNzRmxhZ0JpdHM6OmVIb3N0UmVhZCApIHJlc3VsdCArPSAiSG9zdFJlYWQgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZUhvc3RXcml0ZSApIHJlc3VsdCArPSAiSG9zdFdyaXRlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQWNjZXNzRmxhZ0JpdHM6OmVNZW1vcnlSZWFkICkgcmVzdWx0ICs9ICJNZW1vcnlSZWFkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQWNjZXNzRmxhZ0JpdHM6OmVNZW1vcnlXcml0ZSApIHJlc3VsdCArPSAiTWVtb3J5V3JpdGUgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZVRyYW5zZm9ybUZlZWRiYWNrV3JpdGVFWFQgKSByZXN1bHQgKz0gIlRyYW5zZm9ybUZlZWRiYWNrV3JpdGVFWFQgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZVRyYW5zZm9ybUZlZWRiYWNrQ291bnRlclJlYWRFWFQgKSByZXN1bHQgKz0gIlRyYW5zZm9ybUZlZWRiYWNrQ291bnRlclJlYWRFWFQgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZVRyYW5zZm9ybUZlZWRiYWNrQ291bnRlcldyaXRlRVhUICkgcmVzdWx0ICs9ICJUcmFuc2Zvcm1GZWVkYmFja0NvdW50ZXJXcml0ZUVYVCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplQ29uZGl0aW9uYWxSZW5kZXJpbmdSZWFkRVhUICkgcmVzdWx0ICs9ICJDb25kaXRpb25hbFJlbmRlcmluZ1JlYWRFWFQgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZUNvbW1hbmRQcm9jZXNzUmVhZE5WWCApIHJlc3VsdCArPSAiQ29tbWFuZFByb2Nlc3NSZWFkTlZYIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQWNjZXNzRmxhZ0JpdHM6OmVDb21tYW5kUHJvY2Vzc1dyaXRlTlZYICkgcmVzdWx0ICs9ICJDb21tYW5kUHJvY2Vzc1dyaXRlTlZYIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQWNjZXNzRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnRSZWFkTm9uY29oZXJlbnRFWFQgKSByZXN1bHQgKz0gIkNvbG9yQXR0YWNobWVudFJlYWROb25jb2hlcmVudEVYVCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplU2hhZGluZ1JhdGVJbWFnZVJlYWROViApIHJlc3VsdCArPSAiU2hhZGluZ1JhdGVJbWFnZVJlYWROViB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEFjY2Vzc0ZsYWdCaXRzOjplQWNjZWxlcmF0aW9uU3RydWN0dXJlUmVhZE5WICkgcmVzdWx0ICs9ICJBY2NlbGVyYXRpb25TdHJ1Y3R1cmVSZWFkTlYgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZUFjY2VsZXJhdGlvblN0cnVjdHVyZVdyaXRlTlYgKSByZXN1bHQgKz0gIkFjY2VsZXJhdGlvblN0cnVjdHVyZVdyaXRlTlYgfCAiOworICAgIGlmICggdmFsdWUgJiBBY2Nlc3NGbGFnQml0czo6ZUZyYWdtZW50RGVuc2l0eU1hcFJlYWRFWFQgKSByZXN1bHQgKz0gIkZyYWdtZW50RGVuc2l0eU1hcFJlYWRFWFQgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBBY3F1aXJlUHJvZmlsaW5nTG9ja0ZsYWdCaXRzS0hSCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnQml0c0tIUiApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBBY3F1aXJlUHJvZmlsaW5nTG9ja0ZsYWdzS0hSID0gRmxhZ3M8QWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnQml0c0tIUiwgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0ZsYWdzS0hSPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEFjcXVpcmVQcm9maWxpbmdMb2NrRmxhZ3NLSFIgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgZW51bSBjbGFzcyBBbmRyb2lkU3VyZmFjZUNyZWF0ZUZsYWdCaXRzS0hSCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQW5kcm9pZFN1cmZhY2VDcmVhdGVGbGFnQml0c0tIUiApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBBbmRyb2lkU3VyZmFjZUNyZWF0ZUZsYWdzS0hSID0gRmxhZ3M8QW5kcm9pZFN1cmZhY2VDcmVhdGVGbGFnQml0c0tIUiwgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUZsYWdzS0hSPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEFuZHJvaWRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworCisgIGVudW0gY2xhc3MgQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMKKyAgeworICAgIGVNYXlBbGlhcyA9IFZLX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fTUFZX0FMSUFTX0JJVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHM6OmVNYXlBbGlhcyA6IHJldHVybiAiTWF5QWxpYXMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyA9IEZsYWdzPEF0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzLCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHM6OmVNYXlBbGlhcykKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEF0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzIG9wZXJhdG9yfCggQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgYml0MCwgQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEF0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzIG9wZXJhdG9yJiggQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgYml0MCwgQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEF0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzIG9wZXJhdG9yXiggQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgYml0MCwgQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEF0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzIG9wZXJhdG9yfiggQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEF0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0czo6ZU1heUFsaWFzICkgcmVzdWx0ICs9ICJNYXlBbGlhcyB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIEJ1ZmZlckNyZWF0ZUZsYWdCaXRzCisgIHsKKyAgICBlU3BhcnNlQmluZGluZyA9IFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULAorICAgIGVTcGFyc2VSZXNpZGVuY3kgPSBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklULAorICAgIGVTcGFyc2VBbGlhc2VkID0gVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQsCisgICAgZVByb3RlY3RlZCA9IFZLX0JVRkZFUl9DUkVBVEVfUFJPVEVDVEVEX0JJVCwKKyAgICBlRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXlLSFIgPSBWS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIsCisgICAgZURldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5RVhUID0gVktfQlVGRkVSX0NSRUFURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBCdWZmZXJDcmVhdGVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBCdWZmZXJDcmVhdGVGbGFnQml0czo6ZVNwYXJzZUJpbmRpbmcgOiByZXR1cm4gIlNwYXJzZUJpbmRpbmciOworICAgICAgY2FzZSBCdWZmZXJDcmVhdGVGbGFnQml0czo6ZVNwYXJzZVJlc2lkZW5jeSA6IHJldHVybiAiU3BhcnNlUmVzaWRlbmN5IjsKKyAgICAgIGNhc2UgQnVmZmVyQ3JlYXRlRmxhZ0JpdHM6OmVTcGFyc2VBbGlhc2VkIDogcmV0dXJuICJTcGFyc2VBbGlhc2VkIjsKKyAgICAgIGNhc2UgQnVmZmVyQ3JlYXRlRmxhZ0JpdHM6OmVQcm90ZWN0ZWQgOiByZXR1cm4gIlByb3RlY3RlZCI7CisgICAgICBjYXNlIEJ1ZmZlckNyZWF0ZUZsYWdCaXRzOjplRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXlLSFIgOiByZXR1cm4gIkRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5S0hSIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgQnVmZmVyQ3JlYXRlRmxhZ3MgPSBGbGFnczxCdWZmZXJDcmVhdGVGbGFnQml0cywgVmtCdWZmZXJDcmVhdGVGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8QnVmZmVyQ3JlYXRlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEJ1ZmZlckNyZWF0ZUZsYWdCaXRzOjplU3BhcnNlQmluZGluZykgfCBWa0ZsYWdzKEJ1ZmZlckNyZWF0ZUZsYWdCaXRzOjplU3BhcnNlUmVzaWRlbmN5KSB8IFZrRmxhZ3MoQnVmZmVyQ3JlYXRlRmxhZ0JpdHM6OmVTcGFyc2VBbGlhc2VkKSB8IFZrRmxhZ3MoQnVmZmVyQ3JlYXRlRmxhZ0JpdHM6OmVQcm90ZWN0ZWQpIHwgVmtGbGFncyhCdWZmZXJDcmVhdGVGbGFnQml0czo6ZURldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5S0hSKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVmZmVyQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J8KCBCdWZmZXJDcmVhdGVGbGFnQml0cyBiaXQwLCBCdWZmZXJDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEJ1ZmZlckNyZWF0ZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVmZmVyQ3JlYXRlRmxhZ3Mgb3BlcmF0b3ImKCBCdWZmZXJDcmVhdGVGbGFnQml0cyBiaXQwLCBCdWZmZXJDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEJ1ZmZlckNyZWF0ZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVmZmVyQ3JlYXRlRmxhZ3Mgb3BlcmF0b3JeKCBCdWZmZXJDcmVhdGVGbGFnQml0cyBiaXQwLCBCdWZmZXJDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEJ1ZmZlckNyZWF0ZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVmZmVyQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J+KCBCdWZmZXJDcmVhdGVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIEJ1ZmZlckNyZWF0ZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQnVmZmVyQ3JlYXRlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEJ1ZmZlckNyZWF0ZUZsYWdCaXRzOjplU3BhcnNlQmluZGluZyApIHJlc3VsdCArPSAiU3BhcnNlQmluZGluZyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEJ1ZmZlckNyZWF0ZUZsYWdCaXRzOjplU3BhcnNlUmVzaWRlbmN5ICkgcmVzdWx0ICs9ICJTcGFyc2VSZXNpZGVuY3kgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWZmZXJDcmVhdGVGbGFnQml0czo6ZVNwYXJzZUFsaWFzZWQgKSByZXN1bHQgKz0gIlNwYXJzZUFsaWFzZWQgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWZmZXJDcmVhdGVGbGFnQml0czo6ZVByb3RlY3RlZCApIHJlc3VsdCArPSAiUHJvdGVjdGVkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQnVmZmVyQ3JlYXRlRmxhZ0JpdHM6OmVEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheUtIUiApIHJlc3VsdCArPSAiRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXlLSFIgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBCdWZmZXJVc2FnZUZsYWdCaXRzCisgIHsKKyAgICBlVHJhbnNmZXJTcmMgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwKKyAgICBlVHJhbnNmZXJEc3QgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwKKyAgICBlVW5pZm9ybVRleGVsQnVmZmVyID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCwKKyAgICBlU3RvcmFnZVRleGVsQnVmZmVyID0gVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCwKKyAgICBlVW5pZm9ybUJ1ZmZlciA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQsCisgICAgZVN0b3JhZ2VCdWZmZXIgPSBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklULAorICAgIGVJbmRleEJ1ZmZlciA9IFZLX0JVRkZFUl9VU0FHRV9JTkRFWF9CVUZGRVJfQklULAorICAgIGVWZXJ0ZXhCdWZmZXIgPSBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQsCisgICAgZUluZGlyZWN0QnVmZmVyID0gVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQsCisgICAgZVRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRVhUID0gVktfQlVGRkVSX1VTQUdFX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklUX0VYVCwKKyAgICBlVHJhbnNmb3JtRmVlZGJhY2tDb3VudGVyQnVmZmVyRVhUID0gVktfQlVGRkVSX1VTQUdFX1RSQU5TRk9STV9GRUVEQkFDS19DT1VOVEVSX0JVRkZFUl9CSVRfRVhULAorICAgIGVDb25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IFZLX0JVRkZFUl9VU0FHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCwKKyAgICBlUmF5VHJhY2luZ05WID0gVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OViwKKyAgICBlU2hhZGVyRGV2aWNlQWRkcmVzc0tIUiA9IFZLX0JVRkZFUl9VU0FHRV9TSEFERVJfREVWSUNFX0FERFJFU1NfQklUX0tIUiwKKyAgICBlU2hhZGVyRGV2aWNlQWRkcmVzc0VYVCA9IFZLX0JVRkZFUl9VU0FHRV9TSEFERVJfREVWSUNFX0FERFJFU1NfQklUX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQnVmZmVyVXNhZ2VGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBCdWZmZXJVc2FnZUZsYWdCaXRzOjplVHJhbnNmZXJTcmMgOiByZXR1cm4gIlRyYW5zZmVyU3JjIjsKKyAgICAgIGNhc2UgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVRyYW5zZmVyRHN0IDogcmV0dXJuICJUcmFuc2ZlckRzdCI7CisgICAgICBjYXNlIEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVVbmlmb3JtVGV4ZWxCdWZmZXIgOiByZXR1cm4gIlVuaWZvcm1UZXhlbEJ1ZmZlciI7CisgICAgICBjYXNlIEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVTdG9yYWdlVGV4ZWxCdWZmZXIgOiByZXR1cm4gIlN0b3JhZ2VUZXhlbEJ1ZmZlciI7CisgICAgICBjYXNlIEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVVbmlmb3JtQnVmZmVyIDogcmV0dXJuICJVbmlmb3JtQnVmZmVyIjsKKyAgICAgIGNhc2UgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVN0b3JhZ2VCdWZmZXIgOiByZXR1cm4gIlN0b3JhZ2VCdWZmZXIiOworICAgICAgY2FzZSBCdWZmZXJVc2FnZUZsYWdCaXRzOjplSW5kZXhCdWZmZXIgOiByZXR1cm4gIkluZGV4QnVmZmVyIjsKKyAgICAgIGNhc2UgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVZlcnRleEJ1ZmZlciA6IHJldHVybiAiVmVydGV4QnVmZmVyIjsKKyAgICAgIGNhc2UgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZUluZGlyZWN0QnVmZmVyIDogcmV0dXJuICJJbmRpcmVjdEJ1ZmZlciI7CisgICAgICBjYXNlIEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckVYVCA6IHJldHVybiAiVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJFWFQiOworICAgICAgY2FzZSBCdWZmZXJVc2FnZUZsYWdCaXRzOjplVHJhbnNmb3JtRmVlZGJhY2tDb3VudGVyQnVmZmVyRVhUIDogcmV0dXJuICJUcmFuc2Zvcm1GZWVkYmFja0NvdW50ZXJCdWZmZXJFWFQiOworICAgICAgY2FzZSBCdWZmZXJVc2FnZUZsYWdCaXRzOjplQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgOiByZXR1cm4gIkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIjsKKyAgICAgIGNhc2UgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVJheVRyYWNpbmdOViA6IHJldHVybiAiUmF5VHJhY2luZ05WIjsKKyAgICAgIGNhc2UgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVNoYWRlckRldmljZUFkZHJlc3NLSFIgOiByZXR1cm4gIlNoYWRlckRldmljZUFkZHJlc3NLSFIiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBCdWZmZXJVc2FnZUZsYWdzID0gRmxhZ3M8QnVmZmVyVXNhZ2VGbGFnQml0cywgVmtCdWZmZXJVc2FnZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxCdWZmZXJVc2FnZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhCdWZmZXJVc2FnZUZsYWdCaXRzOjplVHJhbnNmZXJTcmMpIHwgVmtGbGFncyhCdWZmZXJVc2FnZUZsYWdCaXRzOjplVHJhbnNmZXJEc3QpIHwgVmtGbGFncyhCdWZmZXJVc2FnZUZsYWdCaXRzOjplVW5pZm9ybVRleGVsQnVmZmVyKSB8IFZrRmxhZ3MoQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVN0b3JhZ2VUZXhlbEJ1ZmZlcikgfCBWa0ZsYWdzKEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVVbmlmb3JtQnVmZmVyKSB8IFZrRmxhZ3MoQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVN0b3JhZ2VCdWZmZXIpIHwgVmtGbGFncyhCdWZmZXJVc2FnZUZsYWdCaXRzOjplSW5kZXhCdWZmZXIpIHwgVmtGbGFncyhCdWZmZXJVc2FnZUZsYWdCaXRzOjplVmVydGV4QnVmZmVyKSB8IFZrRmxhZ3MoQnVmZmVyVXNhZ2VGbGFnQml0czo6ZUluZGlyZWN0QnVmZmVyKSB8IFZrRmxhZ3MoQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRVhUKSB8IFZrRmxhZ3MoQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVRyYW5zZm9ybUZlZWRiYWNrQ291bnRlckJ1ZmZlckVYVCkgfCBWa0ZsYWdzKEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVDb25kaXRpb25hbFJlbmRlcmluZ0VYVCkgfCBWa0ZsYWdzKEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVSYXlUcmFjaW5nTlYpIHwgVmtGbGFncyhCdWZmZXJVc2FnZUZsYWdCaXRzOjplU2hhZGVyRGV2aWNlQWRkcmVzc0tIUikKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJ1ZmZlclVzYWdlRmxhZ3Mgb3BlcmF0b3J8KCBCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdDAsIEJ1ZmZlclVzYWdlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBCdWZmZXJVc2FnZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVmZmVyVXNhZ2VGbGFncyBvcGVyYXRvciYoIEJ1ZmZlclVzYWdlRmxhZ0JpdHMgYml0MCwgQnVmZmVyVXNhZ2VGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEJ1ZmZlclVzYWdlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBCdWZmZXJVc2FnZUZsYWdzIG9wZXJhdG9yXiggQnVmZmVyVXNhZ2VGbGFnQml0cyBiaXQwLCBCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQnVmZmVyVXNhZ2VGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJ1ZmZlclVzYWdlRmxhZ3Mgb3BlcmF0b3J+KCBCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggQnVmZmVyVXNhZ2VGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEJ1ZmZlclVzYWdlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVUcmFuc2ZlclNyYyApIHJlc3VsdCArPSAiVHJhbnNmZXJTcmMgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWZmZXJVc2FnZUZsYWdCaXRzOjplVHJhbnNmZXJEc3QgKSByZXN1bHQgKz0gIlRyYW5zZmVyRHN0IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVVuaWZvcm1UZXhlbEJ1ZmZlciApIHJlc3VsdCArPSAiVW5pZm9ybVRleGVsQnVmZmVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVN0b3JhZ2VUZXhlbEJ1ZmZlciApIHJlc3VsdCArPSAiU3RvcmFnZVRleGVsQnVmZmVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVVuaWZvcm1CdWZmZXIgKSByZXN1bHQgKz0gIlVuaWZvcm1CdWZmZXIgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWZmZXJVc2FnZUZsYWdCaXRzOjplU3RvcmFnZUJ1ZmZlciApIHJlc3VsdCArPSAiU3RvcmFnZUJ1ZmZlciB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVJbmRleEJ1ZmZlciApIHJlc3VsdCArPSAiSW5kZXhCdWZmZXIgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWZmZXJVc2FnZUZsYWdCaXRzOjplVmVydGV4QnVmZmVyICkgcmVzdWx0ICs9ICJWZXJ0ZXhCdWZmZXIgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWZmZXJVc2FnZUZsYWdCaXRzOjplSW5kaXJlY3RCdWZmZXIgKSByZXN1bHQgKz0gIkluZGlyZWN0QnVmZmVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRVhUICkgcmVzdWx0ICs9ICJUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckVYVCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVUcmFuc2Zvcm1GZWVkYmFja0NvdW50ZXJCdWZmZXJFWFQgKSByZXN1bHQgKz0gIlRyYW5zZm9ybUZlZWRiYWNrQ291bnRlckJ1ZmZlckVYVCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVDb25kaXRpb25hbFJlbmRlcmluZ0VYVCApIHJlc3VsdCArPSAiQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWZmZXJVc2FnZUZsYWdCaXRzOjplUmF5VHJhY2luZ05WICkgcmVzdWx0ICs9ICJSYXlUcmFjaW5nTlYgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWZmZXJVc2FnZUZsYWdCaXRzOjplU2hhZGVyRGV2aWNlQWRkcmVzc0tIUiApIHJlc3VsdCArPSAiU2hhZGVyRGV2aWNlQWRkcmVzc0tIUiB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIEJ1ZmZlclZpZXdDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEJ1ZmZlclZpZXdDcmVhdGVGbGFnQml0cyApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBCdWZmZXJWaWV3Q3JlYXRlRmxhZ3MgPSBGbGFnczxCdWZmZXJWaWV3Q3JlYXRlRmxhZ0JpdHMsIFZrQnVmZmVyVmlld0NyZWF0ZUZsYWdzPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEJ1ZmZlclZpZXdDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVgorICB7CisgICAgZUFsbG93VXBkYXRlID0gVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9BTExPV19VUERBVEVfQklUX05WLAorICAgIGVBbGxvd0NvbXBhY3Rpb24gPSBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX0NPTVBBQ1RJT05fQklUX05WLAorICAgIGVQcmVmZXJGYXN0VHJhY2UgPSBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1BSRUZFUl9GQVNUX1RSQUNFX0JJVF9OViwKKyAgICBlUHJlZmVyRmFzdEJ1aWxkID0gVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9CVUlMRF9CSVRfTlYsCisgICAgZUxvd01lbW9yeSA9IFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTE9XX01FTU9SWV9CSVRfTlYKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlY6OmVBbGxvd1VwZGF0ZSA6IHJldHVybiAiQWxsb3dVcGRhdGUiOworICAgICAgY2FzZSBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlY6OmVBbGxvd0NvbXBhY3Rpb24gOiByZXR1cm4gIkFsbG93Q29tcGFjdGlvbiI7CisgICAgICBjYXNlIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVjo6ZVByZWZlckZhc3RUcmFjZSA6IHJldHVybiAiUHJlZmVyRmFzdFRyYWNlIjsKKyAgICAgIGNhc2UgQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WOjplUHJlZmVyRmFzdEJ1aWxkIDogcmV0dXJuICJQcmVmZXJGYXN0QnVpbGQiOworICAgICAgY2FzZSBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlY6OmVMb3dNZW1vcnkgOiByZXR1cm4gIkxvd01lbW9yeSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOViA9IEZsYWdzPEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViwgVmtCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlY+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVj4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WOjplQWxsb3dVcGRhdGUpIHwgVmtGbGFncyhCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlY6OmVBbGxvd0NvbXBhY3Rpb24pIHwgVmtGbGFncyhCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlY6OmVQcmVmZXJGYXN0VHJhY2UpIHwgVmtGbGFncyhCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlY6OmVQcmVmZXJGYXN0QnVpbGQpIHwgVmtGbGFncyhCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlY6OmVMb3dNZW1vcnkpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlYgb3BlcmF0b3J8KCBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlYgYml0MCwgQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnc05WKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnc05WIG9wZXJhdG9yJiggQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WIGJpdDAsIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOViggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOViBvcGVyYXRvcl4oIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViBiaXQwLCBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlYgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlYoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlYgb3BlcmF0b3J+KCBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlYgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlYoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlYgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVjo6ZUFsbG93VXBkYXRlICkgcmVzdWx0ICs9ICJBbGxvd1VwZGF0ZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVjo6ZUFsbG93Q29tcGFjdGlvbiApIHJlc3VsdCArPSAiQWxsb3dDb21wYWN0aW9uIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WOjplUHJlZmVyRmFzdFRyYWNlICkgcmVzdWx0ICs9ICJQcmVmZXJGYXN0VHJhY2UgfCAiOworICAgIGlmICggdmFsdWUgJiBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlY6OmVQcmVmZXJGYXN0QnVpbGQgKSByZXN1bHQgKz0gIlByZWZlckZhc3RCdWlsZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVjo6ZUxvd01lbW9yeSApIHJlc3VsdCArPSAiTG93TWVtb3J5IHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgQ29sb3JDb21wb25lbnRGbGFnQml0cworICB7CisgICAgZVIgPSBWS19DT0xPUl9DT01QT05FTlRfUl9CSVQsCisgICAgZUcgPSBWS19DT0xPUl9DT01QT05FTlRfR19CSVQsCisgICAgZUIgPSBWS19DT0xPUl9DT01QT05FTlRfQl9CSVQsCisgICAgZUEgPSBWS19DT0xPUl9DT01QT05FTlRfQV9CSVQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbG9yQ29tcG9uZW50RmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQ29sb3JDb21wb25lbnRGbGFnQml0czo6ZVIgOiByZXR1cm4gIlIiOworICAgICAgY2FzZSBDb2xvckNvbXBvbmVudEZsYWdCaXRzOjplRyA6IHJldHVybiAiRyI7CisgICAgICBjYXNlIENvbG9yQ29tcG9uZW50RmxhZ0JpdHM6OmVCIDogcmV0dXJuICJCIjsKKyAgICAgIGNhc2UgQ29sb3JDb21wb25lbnRGbGFnQml0czo6ZUEgOiByZXR1cm4gIkEiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBDb2xvckNvbXBvbmVudEZsYWdzID0gRmxhZ3M8Q29sb3JDb21wb25lbnRGbGFnQml0cywgVmtDb2xvckNvbXBvbmVudEZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxDb2xvckNvbXBvbmVudEZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhDb2xvckNvbXBvbmVudEZsYWdCaXRzOjplUikgfCBWa0ZsYWdzKENvbG9yQ29tcG9uZW50RmxhZ0JpdHM6OmVHKSB8IFZrRmxhZ3MoQ29sb3JDb21wb25lbnRGbGFnQml0czo6ZUIpIHwgVmtGbGFncyhDb2xvckNvbXBvbmVudEZsYWdCaXRzOjplQSkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbG9yQ29tcG9uZW50RmxhZ3Mgb3BlcmF0b3J8KCBDb2xvckNvbXBvbmVudEZsYWdCaXRzIGJpdDAsIENvbG9yQ29tcG9uZW50RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBDb2xvckNvbXBvbmVudEZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29sb3JDb21wb25lbnRGbGFncyBvcGVyYXRvciYoIENvbG9yQ29tcG9uZW50RmxhZ0JpdHMgYml0MCwgQ29sb3JDb21wb25lbnRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIENvbG9yQ29tcG9uZW50RmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb2xvckNvbXBvbmVudEZsYWdzIG9wZXJhdG9yXiggQ29sb3JDb21wb25lbnRGbGFnQml0cyBiaXQwLCBDb2xvckNvbXBvbmVudEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ29sb3JDb21wb25lbnRGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbG9yQ29tcG9uZW50RmxhZ3Mgb3BlcmF0b3J+KCBDb2xvckNvbXBvbmVudEZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggQ29sb3JDb21wb25lbnRGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbG9yQ29tcG9uZW50RmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIENvbG9yQ29tcG9uZW50RmxhZ0JpdHM6OmVSICkgcmVzdWx0ICs9ICJSIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQ29sb3JDb21wb25lbnRGbGFnQml0czo6ZUcgKSByZXN1bHQgKz0gIkcgfCAiOworICAgIGlmICggdmFsdWUgJiBDb2xvckNvbXBvbmVudEZsYWdCaXRzOjplQiApIHJlc3VsdCArPSAiQiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIENvbG9yQ29tcG9uZW50RmxhZ0JpdHM6OmVBICkgcmVzdWx0ICs9ICJBIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHMKKyAgeworICAgIGVSZWxlYXNlUmVzb3VyY2VzID0gVktfQ09NTUFORF9CVUZGRVJfUkVTRVRfUkVMRUFTRV9SRVNPVVJDRVNfQklUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0czo6ZVJlbGVhc2VSZXNvdXJjZXMgOiByZXR1cm4gIlJlbGVhc2VSZXNvdXJjZXMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBDb21tYW5kQnVmZmVyUmVzZXRGbGFncyA9IEZsYWdzPENvbW1hbmRCdWZmZXJSZXNldEZsYWdCaXRzLCBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHM6OmVSZWxlYXNlUmVzb3VyY2VzKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3Mgb3BlcmF0b3J8KCBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyBiaXQwLCBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIENvbW1hbmRCdWZmZXJSZXNldEZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3Mgb3BlcmF0b3ImKCBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyBiaXQwLCBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIENvbW1hbmRCdWZmZXJSZXNldEZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3Mgb3BlcmF0b3JeKCBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyBiaXQwLCBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIENvbW1hbmRCdWZmZXJSZXNldEZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3Mgb3BlcmF0b3J+KCBDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIENvbW1hbmRCdWZmZXJSZXNldEZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIENvbW1hbmRCdWZmZXJSZXNldEZsYWdCaXRzOjplUmVsZWFzZVJlc291cmNlcyApIHJlc3VsdCArPSAiUmVsZWFzZVJlc291cmNlcyB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzCisgIHsKKyAgICBlT25lVGltZVN1Ym1pdCA9IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQsCisgICAgZVJlbmRlclBhc3NDb250aW51ZSA9IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCwKKyAgICBlU2ltdWx0YW5lb3VzVXNlID0gVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzOjplT25lVGltZVN1Ym1pdCA6IHJldHVybiAiT25lVGltZVN1Ym1pdCI7CisgICAgICBjYXNlIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzOjplUmVuZGVyUGFzc0NvbnRpbnVlIDogcmV0dXJuICJSZW5kZXJQYXNzQ29udGludWUiOworICAgICAgY2FzZSBDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0czo6ZVNpbXVsdGFuZW91c1VzZSA6IHJldHVybiAiU2ltdWx0YW5lb3VzVXNlIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ3MgPSBGbGFnczxDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0cywgVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8Q29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzOjplT25lVGltZVN1Ym1pdCkgfCBWa0ZsYWdzKENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzOjplUmVuZGVyUGFzc0NvbnRpbnVlKSB8IFZrRmxhZ3MoQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVTaW11bHRhbmVvdXNVc2UpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kQnVmZmVyVXNhZ2VGbGFncyBvcGVyYXRvcnwoIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdDAsIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kQnVmZmVyVXNhZ2VGbGFncyBvcGVyYXRvciYoIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdDAsIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kQnVmZmVyVXNhZ2VGbGFncyBvcGVyYXRvcl4oIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdDAsIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kQnVmZmVyVXNhZ2VGbGFncyBvcGVyYXRvcn4oIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBDb21tYW5kQnVmZmVyVXNhZ2VGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVPbmVUaW1lU3VibWl0ICkgcmVzdWx0ICs9ICJPbmVUaW1lU3VibWl0IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVSZW5kZXJQYXNzQ29udGludWUgKSByZXN1bHQgKz0gIlJlbmRlclBhc3NDb250aW51ZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIENvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzOjplU2ltdWx0YW5lb3VzVXNlICkgcmVzdWx0ICs9ICJTaW11bHRhbmVvdXNVc2UgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzCisgIHsKKyAgICBlVHJhbnNpZW50ID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9UUkFOU0lFTlRfQklULAorICAgIGVSZXNldENvbW1hbmRCdWZmZXIgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCwKKyAgICBlUHJvdGVjdGVkID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9QUk9URUNURURfQklUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM6OmVUcmFuc2llbnQgOiByZXR1cm4gIlRyYW5zaWVudCI7CisgICAgICBjYXNlIENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM6OmVSZXNldENvbW1hbmRCdWZmZXIgOiByZXR1cm4gIlJlc2V0Q29tbWFuZEJ1ZmZlciI7CisgICAgICBjYXNlIENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM6OmVQcm90ZWN0ZWQgOiByZXR1cm4gIlByb3RlY3RlZCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIENvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgPSBGbGFnczxDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzLCBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM6OmVUcmFuc2llbnQpIHwgVmtGbGFncyhDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzOjplUmVzZXRDb21tYW5kQnVmZmVyKSB8IFZrRmxhZ3MoQ29tbWFuZFBvb2xDcmVhdGVGbGFnQml0czo6ZVByb3RlY3RlZCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRQb29sQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J8KCBDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzIGJpdDAsIENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBDb21tYW5kUG9vbENyZWF0ZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29tbWFuZFBvb2xDcmVhdGVGbGFncyBvcGVyYXRvciYoIENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMgYml0MCwgQ29tbWFuZFBvb2xDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIENvbW1hbmRQb29sQ3JlYXRlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kUG9vbENyZWF0ZUZsYWdzIG9wZXJhdG9yXiggQ29tbWFuZFBvb2xDcmVhdGVGbGFnQml0cyBiaXQwLCBDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ29tbWFuZFBvb2xDcmVhdGVGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRQb29sQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J+KCBDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggQ29tbWFuZFBvb2xDcmVhdGVGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM6OmVUcmFuc2llbnQgKSByZXN1bHQgKz0gIlRyYW5zaWVudCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM6OmVSZXNldENvbW1hbmRCdWZmZXIgKSByZXN1bHQgKz0gIlJlc2V0Q29tbWFuZEJ1ZmZlciB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIENvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM6OmVQcm90ZWN0ZWQgKSByZXN1bHQgKz0gIlByb3RlY3RlZCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIENvbW1hbmRQb29sUmVzZXRGbGFnQml0cworICB7CisgICAgZVJlbGVhc2VSZXNvdXJjZXMgPSBWS19DT01NQU5EX1BPT0xfUkVTRVRfUkVMRUFTRV9SRVNPVVJDRVNfQklUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzOjplUmVsZWFzZVJlc291cmNlcyA6IHJldHVybiAiUmVsZWFzZVJlc291cmNlcyI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIENvbW1hbmRQb29sUmVzZXRGbGFncyA9IEZsYWdzPENvbW1hbmRQb29sUmVzZXRGbGFnQml0cywgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPENvbW1hbmRQb29sUmVzZXRGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzOjplUmVsZWFzZVJlc291cmNlcykKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRQb29sUmVzZXRGbGFncyBvcGVyYXRvcnwoIENvbW1hbmRQb29sUmVzZXRGbGFnQml0cyBiaXQwLCBDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBDb21tYW5kUG9vbFJlc2V0RmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kUG9vbFJlc2V0RmxhZ3Mgb3BlcmF0b3ImKCBDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMgYml0MCwgQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ29tbWFuZFBvb2xSZXNldEZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29tbWFuZFBvb2xSZXNldEZsYWdzIG9wZXJhdG9yXiggQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzIGJpdDAsIENvbW1hbmRQb29sUmVzZXRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIENvbW1hbmRQb29sUmVzZXRGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRQb29sUmVzZXRGbGFncyBvcGVyYXRvcn4oIENvbW1hbmRQb29sUmVzZXRGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIENvbW1hbmRQb29sUmVzZXRGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbW1hbmRQb29sUmVzZXRGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzOjplUmVsZWFzZVJlc291cmNlcyApIHJlc3VsdCArPSAiUmVsZWFzZVJlc291cmNlcyB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIENvbW1hbmRQb29sVHJpbUZsYWdCaXRzCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ29tbWFuZFBvb2xUcmltRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgQ29tbWFuZFBvb2xUcmltRmxhZ3MgPSBGbGFnczxDb21tYW5kUG9vbFRyaW1GbGFnQml0cywgVmtDb21tYW5kUG9vbFRyaW1GbGFncz47CisKKyAgdXNpbmcgQ29tbWFuZFBvb2xUcmltRmxhZ3NLSFIgPSBDb21tYW5kUG9vbFRyaW1GbGFnczsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbW1hbmRQb29sVHJpbUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUgorICB7CisgICAgZU9wYXF1ZSA9IFZLX0NPTVBPU0lURV9BTFBIQV9PUEFRVUVfQklUX0tIUiwKKyAgICBlUHJlTXVsdGlwbGllZCA9IFZLX0NPTVBPU0lURV9BTFBIQV9QUkVfTVVMVElQTElFRF9CSVRfS0hSLAorICAgIGVQb3N0TXVsdGlwbGllZCA9IFZLX0NPTVBPU0lURV9BTFBIQV9QT1NUX01VTFRJUExJRURfQklUX0tIUiwKKyAgICBlSW5oZXJpdCA9IFZLX0NPTVBPU0lURV9BTFBIQV9JTkhFUklUX0JJVF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZU9wYXF1ZSA6IHJldHVybiAiT3BhcXVlIjsKKyAgICAgIGNhc2UgQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZVByZU11bHRpcGxpZWQgOiByZXR1cm4gIlByZU11bHRpcGxpZWQiOworICAgICAgY2FzZSBDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSOjplUG9zdE11bHRpcGxpZWQgOiByZXR1cm4gIlBvc3RNdWx0aXBsaWVkIjsKKyAgICAgIGNhc2UgQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZUluaGVyaXQgOiByZXR1cm4gIkluaGVyaXQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBDb21wb3NpdGVBbHBoYUZsYWdzS0hSID0gRmxhZ3M8Q29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiwgVmtDb21wb3NpdGVBbHBoYUZsYWdzS0hSPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSOjplT3BhcXVlKSB8IFZrRmxhZ3MoQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZVByZU11bHRpcGxpZWQpIHwgVmtGbGFncyhDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSOjplUG9zdE11bHRpcGxpZWQpIHwgVmtGbGFncyhDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSOjplSW5oZXJpdCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbXBvc2l0ZUFscGhhRmxhZ3NLSFIgb3BlcmF0b3J8KCBDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIGJpdDAsIENvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBDb21wb3NpdGVBbHBoYUZsYWdzS0hSKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29tcG9zaXRlQWxwaGFGbGFnc0tIUiBvcGVyYXRvciYoIENvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgYml0MCwgQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIENvbXBvc2l0ZUFscGhhRmxhZ3NLSFIoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21wb3NpdGVBbHBoYUZsYWdzS0hSIG9wZXJhdG9yXiggQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiBiaXQwLCBDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ29tcG9zaXRlQWxwaGFGbGFnc0tIUiggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbXBvc2l0ZUFscGhhRmxhZ3NLSFIgb3BlcmF0b3J+KCBDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggQ29tcG9zaXRlQWxwaGFGbGFnc0tIUiggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbXBvc2l0ZUFscGhhRmxhZ3NLSFIgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIENvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFI6OmVPcGFxdWUgKSByZXN1bHQgKz0gIk9wYXF1ZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIENvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFI6OmVQcmVNdWx0aXBsaWVkICkgcmVzdWx0ICs9ICJQcmVNdWx0aXBsaWVkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZVBvc3RNdWx0aXBsaWVkICkgcmVzdWx0ICs9ICJQb3N0TXVsdGlwbGllZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIENvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFI6OmVJbmhlcml0ICkgcmVzdWx0ICs9ICJJbmhlcml0IHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVAorICB7CisgICAgZUludmVydGVkID0gVktfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lOVkVSVEVEX0JJVF9FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVDo6ZUludmVydGVkIDogcmV0dXJuICJJbnZlcnRlZCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQgPSBGbGFnczxDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhULCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQ+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQ+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQ6OmVJbnZlcnRlZCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQgb3BlcmF0b3J8KCBDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUIGJpdDAsIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdzRVhUKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnc0VYVCBvcGVyYXRvciYoIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQgYml0MCwgQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdzRVhUIG9wZXJhdG9yXiggQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVCBiaXQwLCBDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnc0VYVCggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQgb3BlcmF0b3J+KCBDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnc0VYVCggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIENvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQ6OmVJbnZlcnRlZCApIHJlc3VsdCArPSAiSW52ZXJ0ZWQgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBDdWxsTW9kZUZsYWdCaXRzCisgIHsKKyAgICBlTm9uZSA9IFZLX0NVTExfTU9ERV9OT05FLAorICAgIGVGcm9udCA9IFZLX0NVTExfTU9ERV9GUk9OVF9CSVQsCisgICAgZUJhY2sgPSBWS19DVUxMX01PREVfQkFDS19CSVQsCisgICAgZUZyb250QW5kQmFjayA9IFZLX0NVTExfTU9ERV9GUk9OVF9BTkRfQkFDSworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ3VsbE1vZGVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBDdWxsTW9kZUZsYWdCaXRzOjplTm9uZSA6IHJldHVybiAiTm9uZSI7CisgICAgICBjYXNlIEN1bGxNb2RlRmxhZ0JpdHM6OmVGcm9udCA6IHJldHVybiAiRnJvbnQiOworICAgICAgY2FzZSBDdWxsTW9kZUZsYWdCaXRzOjplQmFjayA6IHJldHVybiAiQmFjayI7CisgICAgICBjYXNlIEN1bGxNb2RlRmxhZ0JpdHM6OmVGcm9udEFuZEJhY2sgOiByZXR1cm4gIkZyb250QW5kQmFjayI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEN1bGxNb2RlRmxhZ3MgPSBGbGFnczxDdWxsTW9kZUZsYWdCaXRzLCBWa0N1bGxNb2RlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEN1bGxNb2RlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEN1bGxNb2RlRmxhZ0JpdHM6OmVOb25lKSB8IFZrRmxhZ3MoQ3VsbE1vZGVGbGFnQml0czo6ZUZyb250KSB8IFZrRmxhZ3MoQ3VsbE1vZGVGbGFnQml0czo6ZUJhY2spIHwgVmtGbGFncyhDdWxsTW9kZUZsYWdCaXRzOjplRnJvbnRBbmRCYWNrKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ3VsbE1vZGVGbGFncyBvcGVyYXRvcnwoIEN1bGxNb2RlRmxhZ0JpdHMgYml0MCwgQ3VsbE1vZGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEN1bGxNb2RlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBDdWxsTW9kZUZsYWdzIG9wZXJhdG9yJiggQ3VsbE1vZGVGbGFnQml0cyBiaXQwLCBDdWxsTW9kZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gQ3VsbE1vZGVGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEN1bGxNb2RlRmxhZ3Mgb3BlcmF0b3JeKCBDdWxsTW9kZUZsYWdCaXRzIGJpdDAsIEN1bGxNb2RlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBDdWxsTW9kZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ3VsbE1vZGVGbGFncyBvcGVyYXRvcn4oIEN1bGxNb2RlRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBDdWxsTW9kZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggQ3VsbE1vZGVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgQ3VsbE1vZGVGbGFnQml0czo6ZUZyb250ICkgcmVzdWx0ICs9ICJGcm9udCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEN1bGxNb2RlRmxhZ0JpdHM6OmVCYWNrICkgcmVzdWx0ICs9ICJCYWNrIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRGVidWdSZXBvcnRGbGFnQml0c0VYVAorICB7CisgICAgZUluZm9ybWF0aW9uID0gVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsCisgICAgZVdhcm5pbmcgPSBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULAorICAgIGVQZXJmb3JtYW5jZVdhcm5pbmcgPSBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULAorICAgIGVFcnJvciA9IFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgIGVEZWJ1ZyA9IFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQ6OmVJbmZvcm1hdGlvbiA6IHJldHVybiAiSW5mb3JtYXRpb24iOworICAgICAgY2FzZSBEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUOjplV2FybmluZyA6IHJldHVybiAiV2FybmluZyI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQ6OmVQZXJmb3JtYW5jZVdhcm5pbmcgOiByZXR1cm4gIlBlcmZvcm1hbmNlV2FybmluZyI7CisgICAgICBjYXNlIERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQ6OmVFcnJvciA6IHJldHVybiAiRXJyb3IiOworICAgICAgY2FzZSBEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUOjplRGVidWcgOiByZXR1cm4gIkRlYnVnIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgRGVidWdSZXBvcnRGbGFnc0VYVCA9IEZsYWdzPERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQsIFZrRGVidWdSZXBvcnRGbGFnc0VYVD47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8RGVidWdSZXBvcnRGbGFnQml0c0VYVD4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRGVidWdSZXBvcnRGbGFnQml0c0VYVDo6ZUluZm9ybWF0aW9uKSB8IFZrRmxhZ3MoRGVidWdSZXBvcnRGbGFnQml0c0VYVDo6ZVdhcm5pbmcpIHwgVmtGbGFncyhEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUOjplUGVyZm9ybWFuY2VXYXJuaW5nKSB8IFZrRmxhZ3MoRGVidWdSZXBvcnRGbGFnQml0c0VYVDo6ZUVycm9yKSB8IFZrRmxhZ3MoRGVidWdSZXBvcnRGbGFnQml0c0VYVDo6ZURlYnVnKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdSZXBvcnRGbGFnc0VYVCBvcGVyYXRvcnwoIERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQgYml0MCwgRGVidWdSZXBvcnRGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlYnVnUmVwb3J0RmxhZ3NFWFQoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZWJ1Z1JlcG9ydEZsYWdzRVhUIG9wZXJhdG9yJiggRGVidWdSZXBvcnRGbGFnQml0c0VYVCBiaXQwLCBEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGVidWdSZXBvcnRGbGFnc0VYVCggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlYnVnUmVwb3J0RmxhZ3NFWFQgb3BlcmF0b3JeKCBEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUIGJpdDAsIERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEZWJ1Z1JlcG9ydEZsYWdzRVhUKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdSZXBvcnRGbGFnc0VYVCBvcGVyYXRvcn4oIERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBEZWJ1Z1JlcG9ydEZsYWdzRVhUKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVidWdSZXBvcnRGbGFnc0VYVCB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRGVidWdSZXBvcnRGbGFnQml0c0VYVDo6ZUluZm9ybWF0aW9uICkgcmVzdWx0ICs9ICJJbmZvcm1hdGlvbiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQ6OmVXYXJuaW5nICkgcmVzdWx0ICs9ICJXYXJuaW5nIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRGVidWdSZXBvcnRGbGFnQml0c0VYVDo6ZVBlcmZvcm1hbmNlV2FybmluZyApIHJlc3VsdCArPSAiUGVyZm9ybWFuY2VXYXJuaW5nIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRGVidWdSZXBvcnRGbGFnQml0c0VYVDo6ZUVycm9yICkgcmVzdWx0ICs9ICJFcnJvciB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlYnVnUmVwb3J0RmxhZ0JpdHNFWFQ6OmVEZWJ1ZyApIHJlc3VsdCArPSAiRGVidWcgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQKKyAgeworICAgIGVWZXJib3NlID0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9WRVJCT1NFX0JJVF9FWFQsCisgICAgZUluZm8gPSBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0lORk9fQklUX0VYVCwKKyAgICBlV2FybmluZyA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhULAorICAgIGVFcnJvciA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVDo6ZVZlcmJvc2UgOiByZXR1cm4gIlZlcmJvc2UiOworICAgICAgY2FzZSBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQ6OmVJbmZvIDogcmV0dXJuICJJbmZvIjsKKyAgICAgIGNhc2UgRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUOjplV2FybmluZyA6IHJldHVybiAiV2FybmluZyI7CisgICAgICBjYXNlIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVDo6ZUVycm9yIDogcmV0dXJuICJFcnJvciI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCA9IEZsYWdzPERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCwgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQ+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVD4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUOjplVmVyYm9zZSkgfCBWa0ZsYWdzKERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVDo6ZUluZm8pIHwgVmtGbGFncyhEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQ6OmVXYXJuaW5nKSB8IFZrRmxhZ3MoRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUOjplRXJyb3IpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQgb3BlcmF0b3J8KCBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgYml0MCwgRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdzRVhUKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdzRVhUIG9wZXJhdG9yJiggRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIGJpdDAsIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCBvcGVyYXRvcl4oIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBiaXQwLCBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQgb3BlcmF0b3J+KCBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVDo6ZVZlcmJvc2UgKSByZXN1bHQgKz0gIlZlcmJvc2UgfCAiOworICAgIGlmICggdmFsdWUgJiBEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQ6OmVJbmZvICkgcmVzdWx0ICs9ICJJbmZvIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUOjplV2FybmluZyApIHJlc3VsdCArPSAiV2FybmluZyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVDo6ZUVycm9yICkgcmVzdWx0ICs9ICJFcnJvciB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUCisgIHsKKyAgICBlR2VuZXJhbCA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9HRU5FUkFMX0JJVF9FWFQsCisgICAgZVZhbGlkYXRpb24gPSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfVkFMSURBVElPTl9CSVRfRVhULAorICAgIGVQZXJmb3JtYW5jZSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9QRVJGT1JNQU5DRV9CSVRfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVDo6ZUdlbmVyYWwgOiByZXR1cm4gIkdlbmVyYWwiOworICAgICAgY2FzZSBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVDo6ZVZhbGlkYXRpb24gOiByZXR1cm4gIlZhbGlkYXRpb24iOworICAgICAgY2FzZSBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVDo6ZVBlcmZvcm1hbmNlIDogcmV0dXJuICJQZXJmb3JtYW5jZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUID0gRmxhZ3M8RGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQsIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQ+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVDo6ZUdlbmVyYWwpIHwgVmtGbGFncyhEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVDo6ZVZhbGlkYXRpb24pIHwgVmtGbGFncyhEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVDo6ZVBlcmZvcm1hbmNlKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgb3BlcmF0b3J8KCBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCBiaXQwLCBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgb3BlcmF0b3ImKCBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCBiaXQwLCBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgb3BlcmF0b3JeKCBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCBiaXQwLCBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgb3BlcmF0b3J+KCBEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUOjplR2VuZXJhbCApIHJlc3VsdCArPSAiR2VuZXJhbCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUOjplVmFsaWRhdGlvbiApIHJlc3VsdCArPSAiVmFsaWRhdGlvbiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUOjplUGVyZm9ybWFuY2UgKSByZXN1bHQgKz0gIlBlcmZvcm1hbmNlIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUZsYWdCaXRzRVhUCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUZsYWdCaXRzRVhUICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFGbGFnc0VYVCA9IEZsYWdzPERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFGbGFnQml0c0VYVCwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRmxhZ3NFWFQ+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUZsYWdzRVhUICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUZsYWdCaXRzRVhUCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUZsYWdCaXRzRVhUICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVGbGFnc0VYVCA9IEZsYWdzPERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVGbGFnQml0c0VYVCwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlRmxhZ3NFWFQ+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUZsYWdzRVhUICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRGVwZW5kZW5jeUZsYWdCaXRzCisgIHsKKyAgICBlQnlSZWdpb24gPSBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQsCisgICAgZURldmljZUdyb3VwID0gVktfREVQRU5ERU5DWV9ERVZJQ0VfR1JPVVBfQklULAorICAgIGVWaWV3TG9jYWwgPSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklULAorICAgIGVWaWV3TG9jYWxLSFIgPSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUX0tIUiwKKyAgICBlRGV2aWNlR3JvdXBLSFIgPSBWS19ERVBFTkRFTkNZX0RFVklDRV9HUk9VUF9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZXBlbmRlbmN5RmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRGVwZW5kZW5jeUZsYWdCaXRzOjplQnlSZWdpb24gOiByZXR1cm4gIkJ5UmVnaW9uIjsKKyAgICAgIGNhc2UgRGVwZW5kZW5jeUZsYWdCaXRzOjplRGV2aWNlR3JvdXAgOiByZXR1cm4gIkRldmljZUdyb3VwIjsKKyAgICAgIGNhc2UgRGVwZW5kZW5jeUZsYWdCaXRzOjplVmlld0xvY2FsIDogcmV0dXJuICJWaWV3TG9jYWwiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBEZXBlbmRlbmN5RmxhZ3MgPSBGbGFnczxEZXBlbmRlbmN5RmxhZ0JpdHMsIFZrRGVwZW5kZW5jeUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxEZXBlbmRlbmN5RmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKERlcGVuZGVuY3lGbGFnQml0czo6ZUJ5UmVnaW9uKSB8IFZrRmxhZ3MoRGVwZW5kZW5jeUZsYWdCaXRzOjplRGV2aWNlR3JvdXApIHwgVmtGbGFncyhEZXBlbmRlbmN5RmxhZ0JpdHM6OmVWaWV3TG9jYWwpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXBlbmRlbmN5RmxhZ3Mgb3BlcmF0b3J8KCBEZXBlbmRlbmN5RmxhZ0JpdHMgYml0MCwgRGVwZW5kZW5jeUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGVwZW5kZW5jeUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVwZW5kZW5jeUZsYWdzIG9wZXJhdG9yJiggRGVwZW5kZW5jeUZsYWdCaXRzIGJpdDAsIERlcGVuZGVuY3lGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlcGVuZGVuY3lGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlcGVuZGVuY3lGbGFncyBvcGVyYXRvcl4oIERlcGVuZGVuY3lGbGFnQml0cyBiaXQwLCBEZXBlbmRlbmN5RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEZXBlbmRlbmN5RmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXBlbmRlbmN5RmxhZ3Mgb3BlcmF0b3J+KCBEZXBlbmRlbmN5RmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBEZXBlbmRlbmN5RmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZXBlbmRlbmN5RmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIERlcGVuZGVuY3lGbGFnQml0czo6ZUJ5UmVnaW9uICkgcmVzdWx0ICs9ICJCeVJlZ2lvbiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlcGVuZGVuY3lGbGFnQml0czo6ZURldmljZUdyb3VwICkgcmVzdWx0ICs9ICJEZXZpY2VHcm91cCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlcGVuZGVuY3lGbGFnQml0czo6ZVZpZXdMb2NhbCApIHJlc3VsdCArPSAiVmlld0xvY2FsIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVAorICB7CisgICAgZVVwZGF0ZUFmdGVyQmluZCA9IFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhULAorICAgIGVVcGRhdGVVbnVzZWRXaGlsZVBlbmRpbmcgPSBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX1VOVVNFRF9XSElMRV9QRU5ESU5HX0JJVF9FWFQsCisgICAgZVBhcnRpYWxseUJvdW5kID0gVktfREVTQ1JJUFRPUl9CSU5ESU5HX1BBUlRJQUxMWV9CT1VORF9CSVRfRVhULAorICAgIGVWYXJpYWJsZURlc2NyaXB0b3JDb3VudCA9IFZLX0RFU0NSSVBUT1JfQklORElOR19WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0JJVF9FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVDo6ZVVwZGF0ZUFmdGVyQmluZCA6IHJldHVybiAiVXBkYXRlQWZ0ZXJCaW5kIjsKKyAgICAgIGNhc2UgRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVDo6ZVVwZGF0ZVVudXNlZFdoaWxlUGVuZGluZyA6IHJldHVybiAiVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nIjsKKyAgICAgIGNhc2UgRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVDo6ZVBhcnRpYWxseUJvdW5kIDogcmV0dXJuICJQYXJ0aWFsbHlCb3VuZCI7CisgICAgICBjYXNlIERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQ6OmVWYXJpYWJsZURlc2NyaXB0b3JDb3VudCA6IHJldHVybiAiVmFyaWFibGVEZXNjcmlwdG9yQ291bnQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUID0gRmxhZ3M8RGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVCwgVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUOjplVXBkYXRlQWZ0ZXJCaW5kKSB8IFZrRmxhZ3MoRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVDo6ZVVwZGF0ZVVudXNlZFdoaWxlUGVuZGluZykgfCBWa0ZsYWdzKERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQ6OmVQYXJ0aWFsbHlCb3VuZCkgfCBWa0ZsYWdzKERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQ6OmVWYXJpYWJsZURlc2NyaXB0b3JDb3VudCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQgb3BlcmF0b3J8KCBEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUIGJpdDAsIERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCBvcGVyYXRvciYoIERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQgYml0MCwgRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUIG9wZXJhdG9yXiggRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVCBiaXQwLCBEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQgb3BlcmF0b3J+KCBEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQ6OmVVcGRhdGVBZnRlckJpbmQgKSByZXN1bHQgKz0gIlVwZGF0ZUFmdGVyQmluZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQ6OmVVcGRhdGVVbnVzZWRXaGlsZVBlbmRpbmcgKSByZXN1bHQgKz0gIlVwZGF0ZVVudXNlZFdoaWxlUGVuZGluZyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQ6OmVQYXJ0aWFsbHlCb3VuZCApIHJlc3VsdCArPSAiUGFydGlhbGx5Qm91bmQgfCAiOworICAgIGlmICggdmFsdWUgJiBEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUOjplVmFyaWFibGVEZXNjcmlwdG9yQ291bnQgKSByZXN1bHQgKz0gIlZhcmlhYmxlRGVzY3JpcHRvckNvdW50IHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0cworICB7CisgICAgZUZyZWVEZXNjcmlwdG9yU2V0ID0gVktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9GUkVFX0RFU0NSSVBUT1JfU0VUX0JJVCwKKyAgICBlVXBkYXRlQWZ0ZXJCaW5kRVhUID0gVktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9CSVRfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIERlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHM6OmVGcmVlRGVzY3JpcHRvclNldCA6IHJldHVybiAiRnJlZURlc2NyaXB0b3JTZXQiOworICAgICAgY2FzZSBEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzOjplVXBkYXRlQWZ0ZXJCaW5kRVhUIDogcmV0dXJuICJVcGRhdGVBZnRlckJpbmRFWFQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzID0gRmxhZ3M8RGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0cywgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzOjplRnJlZURlc2NyaXB0b3JTZXQpIHwgVmtGbGFncyhEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzOjplVXBkYXRlQWZ0ZXJCaW5kRVhUKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncyBvcGVyYXRvcnwoIERlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMgYml0MCwgRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzIG9wZXJhdG9yJiggRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0cyBiaXQwLCBEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ3Mgb3BlcmF0b3JeKCBEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzIGJpdDAsIERlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncyBvcGVyYXRvcn4oIERlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0czo6ZUZyZWVEZXNjcmlwdG9yU2V0ICkgcmVzdWx0ICs9ICJGcmVlRGVzY3JpcHRvclNldCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHM6OmVVcGRhdGVBZnRlckJpbmRFWFQgKSByZXN1bHQgKz0gIlVwZGF0ZUFmdGVyQmluZEVYVCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIERlc2NyaXB0b3JQb29sUmVzZXRGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERlc2NyaXB0b3JQb29sUmVzZXRGbGFnQml0cyApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgPSBGbGFnczxEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ0JpdHMsIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERlc2NyaXB0b3JQb29sUmVzZXRGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cworICB7CisgICAgZVB1c2hEZXNjcmlwdG9yS0hSID0gVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUiwKKyAgICBlVXBkYXRlQWZ0ZXJCaW5kUG9vbEVYVCA9IFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzOjplUHVzaERlc2NyaXB0b3JLSFIgOiByZXR1cm4gIlB1c2hEZXNjcmlwdG9yS0hSIjsKKyAgICAgIGNhc2UgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzOjplVXBkYXRlQWZ0ZXJCaW5kUG9vbEVYVCA6IHJldHVybiAiVXBkYXRlQWZ0ZXJCaW5kUG9vbEVYVCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFncyA9IEZsYWdzPERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cywgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzOjplUHVzaERlc2NyaXB0b3JLSFIpIHwgVmtGbGFncyhEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHM6OmVVcGRhdGVBZnRlckJpbmRQb29sRVhUKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzIG9wZXJhdG9yfCggRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIGJpdDAsIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFncyBvcGVyYXRvciYoIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cyBiaXQwLCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3Mgb3BlcmF0b3JeKCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMgYml0MCwgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzIG9wZXJhdG9yfiggRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHM6OmVQdXNoRGVzY3JpcHRvcktIUiApIHJlc3VsdCArPSAiUHVzaERlc2NyaXB0b3JLSFIgfCAiOworICAgIGlmICggdmFsdWUgJiBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHM6OmVVcGRhdGVBZnRlckJpbmRQb29sRVhUICkgcmVzdWx0ICs9ICJVcGRhdGVBZnRlckJpbmRQb29sRVhUIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlRmxhZ0JpdHMKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFnQml0cyApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFncyA9IEZsYWdzPERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUZsYWdCaXRzLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUZsYWdzPjsKKworICB1c2luZyBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFnc0tIUiA9IERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUZsYWdzOworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlRmxhZ3MgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisKKyAgZW51bSBjbGFzcyBEZXZpY2VDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERldmljZUNyZWF0ZUZsYWdCaXRzICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIERldmljZUNyZWF0ZUZsYWdzID0gRmxhZ3M8RGV2aWNlQ3JlYXRlRmxhZ0JpdHMsIFZrRGV2aWNlQ3JlYXRlRmxhZ3M+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGV2aWNlQ3JlYXRlRmxhZ3MgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisKKyAgZW51bSBjbGFzcyBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIKKyAgeworICAgIGVMb2NhbCA9IFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfTE9DQUxfQklUX0tIUiwKKyAgICBlUmVtb3RlID0gVktfREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9SRU1PVEVfQklUX0tIUiwKKyAgICBlU3VtID0gVktfREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9TVU1fQklUX0tIUiwKKyAgICBlTG9jYWxNdWx0aURldmljZSA9IFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfTE9DQUxfTVVMVElfREVWSUNFX0JJVF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI6OmVMb2NhbCA6IHJldHVybiAiTG9jYWwiOworICAgICAgY2FzZSBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI6OmVSZW1vdGUgOiByZXR1cm4gIlJlbW90ZSI7CisgICAgICBjYXNlIERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUjo6ZVN1bSA6IHJldHVybiAiU3VtIjsKKyAgICAgIGNhc2UgRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSOjplTG9jYWxNdWx0aURldmljZSA6IHJldHVybiAiTG9jYWxNdWx0aURldmljZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiA9IEZsYWdzPERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiwgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFI+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUj4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSOjplTG9jYWwpIHwgVmtGbGFncyhEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI6OmVSZW1vdGUpIHwgVmtGbGFncyhEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI6OmVTdW0pIHwgVmtGbGFncyhEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI6OmVMb2NhbE11bHRpRGV2aWNlKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSIG9wZXJhdG9yfCggRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIGJpdDAsIERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiBvcGVyYXRvciYoIERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiBiaXQwLCBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIgb3BlcmF0b3JeKCBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIgYml0MCwgRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSIG9wZXJhdG9yfiggRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI6OmVMb2NhbCApIHJlc3VsdCArPSAiTG9jYWwgfCAiOworICAgIGlmICggdmFsdWUgJiBEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI6OmVSZW1vdGUgKSByZXN1bHQgKz0gIlJlbW90ZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUjo6ZVN1bSApIHJlc3VsdCArPSAiU3VtIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSOjplTG9jYWxNdWx0aURldmljZSApIHJlc3VsdCArPSAiTG9jYWxNdWx0aURldmljZSB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIERldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMKKyAgeworICAgIGVQcm90ZWN0ZWQgPSBWS19ERVZJQ0VfUVVFVUVfQ1JFQVRFX1BST1RFQ1RFRF9CSVQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0czo6ZVByb3RlY3RlZCA6IHJldHVybiAiUHJvdGVjdGVkIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgRGV2aWNlUXVldWVDcmVhdGVGbGFncyA9IEZsYWdzPERldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMsIFZrRGV2aWNlUXVldWVDcmVhdGVGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8RGV2aWNlUXVldWVDcmVhdGVGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0czo6ZVByb3RlY3RlZCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZVF1ZXVlQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J8KCBEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIGJpdDAsIERldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlUXVldWVDcmVhdGVGbGFncyBvcGVyYXRvciYoIERldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMgYml0MCwgRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERldmljZVF1ZXVlQ3JlYXRlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzIG9wZXJhdG9yXiggRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0cyBiaXQwLCBEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGV2aWNlUXVldWVDcmVhdGVGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZVF1ZXVlQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J+KCBEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRGV2aWNlUXVldWVDcmVhdGVGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIERldmljZVF1ZXVlQ3JlYXRlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIERldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHM6OmVQcm90ZWN0ZWQgKSByZXN1bHQgKz0gIlByb3RlY3RlZCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIERpc3BsYXlNb2RlQ3JlYXRlRmxhZ0JpdHNLSFIKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEaXNwbGF5TW9kZUNyZWF0ZUZsYWdCaXRzS0hSICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIERpc3BsYXlNb2RlQ3JlYXRlRmxhZ3NLSFIgPSBGbGFnczxEaXNwbGF5TW9kZUNyZWF0ZUZsYWdCaXRzS0hSLCBWa0Rpc3BsYXlNb2RlQ3JlYXRlRmxhZ3NLSFI+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGlzcGxheU1vZGVDcmVhdGVGbGFnc0tIUiAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIERpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIKKyAgeworICAgIGVPcGFxdWUgPSBWS19ESVNQTEFZX1BMQU5FX0FMUEhBX09QQVFVRV9CSVRfS0hSLAorICAgIGVHbG9iYWwgPSBWS19ESVNQTEFZX1BMQU5FX0FMUEhBX0dMT0JBTF9CSVRfS0hSLAorICAgIGVQZXJQaXhlbCA9IFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfUEVSX1BJWEVMX0JJVF9LSFIsCisgICAgZVBlclBpeGVsUHJlbXVsdGlwbGllZCA9IFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfUEVSX1BJWEVMX1BSRU1VTFRJUExJRURfQklUX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUiB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSOjplT3BhcXVlIDogcmV0dXJuICJPcGFxdWUiOworICAgICAgY2FzZSBEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSOjplR2xvYmFsIDogcmV0dXJuICJHbG9iYWwiOworICAgICAgY2FzZSBEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSOjplUGVyUGl4ZWwgOiByZXR1cm4gIlBlclBpeGVsIjsKKyAgICAgIGNhc2UgRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjo6ZVBlclBpeGVsUHJlbXVsdGlwbGllZCA6IHJldHVybiAiUGVyUGl4ZWxQcmVtdWx0aXBsaWVkIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgRGlzcGxheVBsYW5lQWxwaGFGbGFnc0tIUiA9IEZsYWdzPERpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIsIFZrRGlzcGxheVBsYW5lQWxwaGFGbGFnc0tIUj47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8RGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUj4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjo6ZU9wYXF1ZSkgfCBWa0ZsYWdzKERpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFI6OmVHbG9iYWwpIHwgVmtGbGFncyhEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSOjplUGVyUGl4ZWwpIHwgVmtGbGFncyhEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSOjplUGVyUGl4ZWxQcmVtdWx0aXBsaWVkKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGlzcGxheVBsYW5lQWxwaGFGbGFnc0tIUiBvcGVyYXRvcnwoIERpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgYml0MCwgRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUiBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIERpc3BsYXlQbGFuZUFscGhhRmxhZ3NLSFIoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSIG9wZXJhdG9yJiggRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUiBiaXQwLCBEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRGlzcGxheVBsYW5lQWxwaGFGbGFnc0tIUiggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERpc3BsYXlQbGFuZUFscGhhRmxhZ3NLSFIgb3BlcmF0b3JeKCBEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSIGJpdDAsIERpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGlzcGxheVBsYW5lQWxwaGFGbGFnc0tIUiBvcGVyYXRvcn4oIERpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGlzcGxheVBsYW5lQWxwaGFGbGFnc0tIUiB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjo6ZU9wYXF1ZSApIHJlc3VsdCArPSAiT3BhcXVlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjo6ZUdsb2JhbCApIHJlc3VsdCArPSAiR2xvYmFsIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjo6ZVBlclBpeGVsICkgcmVzdWx0ICs9ICJQZXJQaXhlbCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIERpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFI6OmVQZXJQaXhlbFByZW11bHRpcGxpZWQgKSByZXN1bHQgKz0gIlBlclBpeGVsUHJlbXVsdGlwbGllZCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIERpc3BsYXlTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNLSFIKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBEaXNwbGF5U3VyZmFjZUNyZWF0ZUZsYWdCaXRzS0hSICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIERpc3BsYXlTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgPSBGbGFnczxEaXNwbGF5U3VyZmFjZUNyZWF0ZUZsYWdCaXRzS0hSLCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRGlzcGxheVN1cmZhY2VDcmVhdGVGbGFnc0tIUiAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIEV2ZW50Q3JlYXRlRmxhZ0JpdHMKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFdmVudENyZWF0ZUZsYWdCaXRzICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIEV2ZW50Q3JlYXRlRmxhZ3MgPSBGbGFnczxFdmVudENyZWF0ZUZsYWdCaXRzLCBWa0V2ZW50Q3JlYXRlRmxhZ3M+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRXZlbnRDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMKKyAgeworICAgIGVFeHBvcnRhYmxlID0gVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVCwKKyAgICBlSW1wb3J0YWJsZSA9IFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQsCisgICAgZUV4cG9ydGFibGVLSFIgPSBWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX0tIUiwKKyAgICBlSW1wb3J0YWJsZUtIUiA9IFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHM6OmVFeHBvcnRhYmxlIDogcmV0dXJuICJFeHBvcnRhYmxlIjsKKyAgICAgIGNhc2UgRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0czo6ZUltcG9ydGFibGUgOiByZXR1cm4gIkltcG9ydGFibGUiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzID0gRmxhZ3M8RXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0cywgVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzOjplRXhwb3J0YWJsZSkgfCBWa0ZsYWdzKEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHM6OmVJbXBvcnRhYmxlKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncyBvcGVyYXRvcnwoIEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMgYml0MCwgRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzIG9wZXJhdG9yJiggRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ3Mgb3BlcmF0b3JeKCBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIGJpdDAsIEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncyBvcGVyYXRvcn4oIEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIHVzaW5nIEV4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ3NLSFIgPSBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzOworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0czo6ZUV4cG9ydGFibGUgKSByZXN1bHQgKz0gIkV4cG9ydGFibGUgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzOjplSW1wb3J0YWJsZSApIHJlc3VsdCArPSAiSW1wb3J0YWJsZSB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMKKyAgeworICAgIGVPcGFxdWVGZCA9IFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQsCisgICAgZU9wYXF1ZVdpbjMyID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCwKKyAgICBlT3BhcXVlV2luMzJLbXQgPSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCwKKyAgICBlU3luY0ZkID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQsCisgICAgZU9wYXF1ZUZkS0hSID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVF9LSFIsCisgICAgZU9wYXF1ZVdpbjMyS0hSID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFIsCisgICAgZU9wYXF1ZVdpbjMyS210S0hSID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfS0hSLAorICAgIGVTeW5jRmRLSFIgPSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkIDogcmV0dXJuICJPcGFxdWVGZCI7CisgICAgICBjYXNlIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVXaW4zMiA6IHJldHVybiAiT3BhcXVlV2luMzIiOworICAgICAgY2FzZSBFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlV2luMzJLbXQgOiByZXR1cm4gIk9wYXF1ZVdpbjMyS210IjsKKyAgICAgIGNhc2UgRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czo6ZVN5bmNGZCA6IHJldHVybiAiU3luY0ZkIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncyA9IEZsYWdzPEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMsIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkKSB8IFZrRmxhZ3MoRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZVdpbjMyKSB8IFZrRmxhZ3MoRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZVdpbjMyS210KSB8IFZrRmxhZ3MoRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czo6ZVN5bmNGZCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3J8KCBFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGJpdDAsIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncyBvcGVyYXRvciYoIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgYml0MCwgRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzIG9wZXJhdG9yXiggRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3J+KCBFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncyggYml0cyApICk7CisgIH0KKworICB1c2luZyBFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzS0hSID0gRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnczsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCApIHJlc3VsdCArPSAiT3BhcXVlRmQgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlV2luMzIgKSByZXN1bHQgKz0gIk9wYXF1ZVdpbjMyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZVdpbjMyS210ICkgcmVzdWx0ICs9ICJPcGFxdWVXaW4zMkttdCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM6OmVTeW5jRmQgKSByZXN1bHQgKz0gIlN5bmNGZCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzCisgIHsKKyAgICBlRGVkaWNhdGVkT25seSA9IFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0RFRElDQVRFRF9PTkxZX0JJVCwKKyAgICBlRXhwb3J0YWJsZSA9IFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0VYUE9SVEFCTEVfQklULAorICAgIGVJbXBvcnRhYmxlID0gVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQsCisgICAgZURlZGljYXRlZE9ubHlLSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVRfS0hSLAorICAgIGVFeHBvcnRhYmxlS0hSID0gVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVRfS0hSLAorICAgIGVJbXBvcnRhYmxlS0hSID0gVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0czo6ZURlZGljYXRlZE9ubHkgOiByZXR1cm4gIkRlZGljYXRlZE9ubHkiOworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0czo6ZUV4cG9ydGFibGUgOiByZXR1cm4gIkV4cG9ydGFibGUiOworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0czo6ZUltcG9ydGFibGUgOiByZXR1cm4gIkltcG9ydGFibGUiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFncyA9IEZsYWdzPEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzLCBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVEZWRpY2F0ZWRPbmx5KSB8IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVFeHBvcnRhYmxlKSB8IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVJbXBvcnRhYmxlKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3Mgb3BlcmF0b3J8KCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3Mgb3BlcmF0b3ImKCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3Mgb3BlcmF0b3JeKCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3Mgb3BlcmF0b3J+KCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIHVzaW5nIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzS0hSID0gRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3M7CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVEZWRpY2F0ZWRPbmx5ICkgcmVzdWx0ICs9ICJEZWRpY2F0ZWRPbmx5IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVFeHBvcnRhYmxlICkgcmVzdWx0ICs9ICJFeHBvcnRhYmxlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVJbXBvcnRhYmxlICkgcmVzdWx0ICs9ICJJbXBvcnRhYmxlIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOVgorICB7CisgICAgZURlZGljYXRlZE9ubHkgPSBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVRfTlYsCisgICAgZUV4cG9ydGFibGUgPSBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9OViwKKyAgICBlSW1wb3J0YWJsZSA9IFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX05WCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlY6OmVEZWRpY2F0ZWRPbmx5IDogcmV0dXJuICJEZWRpY2F0ZWRPbmx5IjsKKyAgICAgIGNhc2UgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOVjo6ZUV4cG9ydGFibGUgOiByZXR1cm4gIkV4cG9ydGFibGUiOworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WOjplSW1wb3J0YWJsZSA6IHJldHVybiAiSW1wb3J0YWJsZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzTlYgPSBGbGFnczxFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WLCBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzTlY+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlY+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlY6OmVEZWRpY2F0ZWRPbmx5KSB8IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOVjo6ZUV4cG9ydGFibGUpIHwgVmtGbGFncyhFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WOjplSW1wb3J0YWJsZSkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzTlYgb3BlcmF0b3J8KCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WIGJpdDAsIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlYgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnc05WKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NOViBvcGVyYXRvciYoIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlYgYml0MCwgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOViBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzTlYoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnc05WIG9wZXJhdG9yXiggRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOViBiaXQwLCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NOViggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzTlYgb3BlcmF0b3J+KCBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NOViggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzTlYgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlY6OmVEZWRpY2F0ZWRPbmx5ICkgcmVzdWx0ICs9ICJEZWRpY2F0ZWRPbmx5IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOVjo6ZUV4cG9ydGFibGUgKSByZXN1bHQgKz0gIkV4cG9ydGFibGUgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WOjplSW1wb3J0YWJsZSApIHJlc3VsdCArPSAiSW1wb3J0YWJsZSB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzCisgIHsKKyAgICBlT3BhcXVlRmQgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCwKKyAgICBlT3BhcXVlV2luMzIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCwKKyAgICBlT3BhcXVlV2luMzJLbXQgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQsCisgICAgZUQzRDExVGV4dHVyZSA9IFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0JJVCwKKyAgICBlRDNEMTFUZXh0dXJlS210ID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfS01UX0JJVCwKKyAgICBlRDNEMTJIZWFwID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX0hFQVBfQklULAorICAgIGVEM0QxMlJlc291cmNlID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVCwKKyAgICBlRG1hQnVmRVhUID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0RNQV9CVUZfQklUX0VYVCwKKyAgICBlQW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCA9IFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCwKKyAgICBlSG9zdEFsbG9jYXRpb25FWFQgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQsCisgICAgZUhvc3RNYXBwZWRGb3JlaWduTWVtb3J5RVhUID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfTUFQUEVEX0ZPUkVJR05fTUVNT1JZX0JJVF9FWFQsCisgICAgZU9wYXF1ZUZkS0hSID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVRfS0hSLAorICAgIGVPcGFxdWVXaW4zMktIUiA9IFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUX0tIUiwKKyAgICBlT3BhcXVlV2luMzJLbXRLSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfS0hSLAorICAgIGVEM0QxMVRleHR1cmVLSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVRfS0hSLAorICAgIGVEM0QxMVRleHR1cmVLbXRLSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9LTVRfQklUX0tIUiwKKyAgICBlRDNEMTJIZWFwS0hSID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX0hFQVBfQklUX0tIUiwKKyAgICBlRDNEMTJSZXNvdXJjZUtIUiA9IFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9SRVNPVVJDRV9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkIDogcmV0dXJuICJPcGFxdWVGZCI7CisgICAgICBjYXNlIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlV2luMzIgOiByZXR1cm4gIk9wYXF1ZVdpbjMyIjsKKyAgICAgIGNhc2UgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVXaW4zMkttdCA6IHJldHVybiAiT3BhcXVlV2luMzJLbXQiOworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZUQzRDExVGV4dHVyZSA6IHJldHVybiAiRDNEMTFUZXh0dXJlIjsKKyAgICAgIGNhc2UgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVEM0QxMVRleHR1cmVLbXQgOiByZXR1cm4gIkQzRDExVGV4dHVyZUttdCI7CisgICAgICBjYXNlIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplRDNEMTJIZWFwIDogcmV0dXJuICJEM0QxMkhlYXAiOworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZUQzRDEyUmVzb3VyY2UgOiByZXR1cm4gIkQzRDEyUmVzb3VyY2UiOworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZURtYUJ1ZkVYVCA6IHJldHVybiAiRG1hQnVmRVhUIjsKKyAgICAgIGNhc2UgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIDogcmV0dXJuICJBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIjsKKyAgICAgIGNhc2UgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVIb3N0QWxsb2NhdGlvbkVYVCA6IHJldHVybiAiSG9zdEFsbG9jYXRpb25FWFQiOworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZUhvc3RNYXBwZWRGb3JlaWduTWVtb3J5RVhUIDogcmV0dXJuICJIb3N0TWFwcGVkRm9yZWlnbk1lbW9yeUVYVCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzID0gRmxhZ3M8RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkKSB8IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVXaW4zMikgfCBWa0ZsYWdzKEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlV2luMzJLbXQpIHwgVmtGbGFncyhFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZUQzRDExVGV4dHVyZSkgfCBWa0ZsYWdzKEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplRDNEMTFUZXh0dXJlS210KSB8IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVEM0QxMkhlYXApIHwgVmtGbGFncyhFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZUQzRDEyUmVzb3VyY2UpIHwgVmtGbGFncyhFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZURtYUJ1ZkVYVCkgfCBWa0ZsYWdzKEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplQW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCkgfCBWa0ZsYWdzKEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplSG9zdEFsbG9jYXRpb25FWFQpIHwgVmtGbGFncyhFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZUhvc3RNYXBwZWRGb3JlaWduTWVtb3J5RVhUKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3J8KCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3ImKCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3JeKCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3J+KCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIHVzaW5nIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzS0hSID0gRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3M7CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCApIHJlc3VsdCArPSAiT3BhcXVlRmQgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZVdpbjMyICkgcmVzdWx0ICs9ICJPcGFxdWVXaW4zMiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlV2luMzJLbXQgKSByZXN1bHQgKz0gIk9wYXF1ZVdpbjMyS210IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVEM0QxMVRleHR1cmUgKSByZXN1bHQgKz0gIkQzRDExVGV4dHVyZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplRDNEMTFUZXh0dXJlS210ICkgcmVzdWx0ICs9ICJEM0QxMVRleHR1cmVLbXQgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZUQzRDEySGVhcCApIHJlc3VsdCArPSAiRDNEMTJIZWFwIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVEM0QxMlJlc291cmNlICkgcmVzdWx0ICs9ICJEM0QxMlJlc291cmNlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVEbWFCdWZFWFQgKSByZXN1bHQgKz0gIkRtYUJ1ZkVYVCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplQW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCApIHJlc3VsdCArPSAiQW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplSG9zdEFsbG9jYXRpb25FWFQgKSByZXN1bHQgKz0gIkhvc3RBbGxvY2F0aW9uRVhUIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVIb3N0TWFwcGVkRm9yZWlnbk1lbW9yeUVYVCApIHJlc3VsdCArPSAiSG9zdE1hcHBlZEZvcmVpZ25NZW1vcnlFWFQgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WCisgIHsKKyAgICBlT3BhcXVlV2luMzIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9OViwKKyAgICBlT3BhcXVlV2luMzJLbXQgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfTlYsCisgICAgZUQzRDExSW1hZ2UgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfSU1BR0VfQklUX05WLAorICAgIGVEM0QxMUltYWdlS210ID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX0lNQUdFX0tNVF9CSVRfTlYKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVjo6ZU9wYXF1ZVdpbjMyIDogcmV0dXJuICJPcGFxdWVXaW4zMiI7CisgICAgICBjYXNlIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlY6OmVPcGFxdWVXaW4zMkttdCA6IHJldHVybiAiT3BhcXVlV2luMzJLbXQiOworICAgICAgY2FzZSBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WOjplRDNEMTFJbWFnZSA6IHJldHVybiAiRDNEMTFJbWFnZSI7CisgICAgICBjYXNlIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlY6OmVEM0QxMUltYWdlS210IDogcmV0dXJuICJEM0QxMUltYWdlS210IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViA9IEZsYWdzPEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOVj47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVj4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVjo6ZU9wYXF1ZVdpbjMyKSB8IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVjo6ZU9wYXF1ZVdpbjMyS210KSB8IFZrRmxhZ3MoRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVjo6ZUQzRDExSW1hZ2UpIHwgVmtGbGFncyhFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WOjplRDNEMTFJbWFnZUttdCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgb3BlcmF0b3J8KCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WIGJpdDAsIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBvcGVyYXRvciYoIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYgYml0MCwgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIG9wZXJhdG9yXiggRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViBiaXQwLCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgb3BlcmF0b3J+KCBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlY6OmVPcGFxdWVXaW4zMiApIHJlc3VsdCArPSAiT3BhcXVlV2luMzIgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WOjplT3BhcXVlV2luMzJLbXQgKSByZXN1bHQgKz0gIk9wYXF1ZVdpbjMyS210IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVjo6ZUQzRDExSW1hZ2UgKSByZXN1bHQgKz0gIkQzRDExSW1hZ2UgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WOjplRDNEMTFJbWFnZUttdCApIHJlc3VsdCArPSAiRDNEMTFJbWFnZUttdCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzCisgIHsKKyAgICBlRXhwb3J0YWJsZSA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklULAorICAgIGVJbXBvcnRhYmxlID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQsCisgICAgZUV4cG9ydGFibGVLSFIgPSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9LSFIsCisgICAgZUltcG9ydGFibGVLSFIgPSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzOjplRXhwb3J0YWJsZSA6IHJldHVybiAiRXhwb3J0YWJsZSI7CisgICAgICBjYXNlIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzOjplSW1wb3J0YWJsZSA6IHJldHVybiAiSW1wb3J0YWJsZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzID0gRmxhZ3M8RXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHMsIFZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0czo6ZUV4cG9ydGFibGUpIHwgVmtGbGFncyhFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0czo6ZUltcG9ydGFibGUpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFncyBvcGVyYXRvcnwoIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIGJpdDAsIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFncyBvcGVyYXRvciYoIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIGJpdDAsIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFncyBvcGVyYXRvcl4oIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIGJpdDAsIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFncyBvcGVyYXRvcn4oIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgdXNpbmcgRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3NLSFIgPSBFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnczsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0czo6ZUV4cG9ydGFibGUgKSByZXN1bHQgKz0gIkV4cG9ydGFibGUgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0czo6ZUltcG9ydGFibGUgKSByZXN1bHQgKz0gIkltcG9ydGFibGUgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cworICB7CisgICAgZU9wYXF1ZUZkID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQsCisgICAgZU9wYXF1ZVdpbjMyID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQsCisgICAgZU9wYXF1ZVdpbjMyS210ID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklULAorICAgIGVEM0QxMkZlbmNlID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX0QzRDEyX0ZFTkNFX0JJVCwKKyAgICBlU3luY0ZkID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklULAorICAgIGVPcGFxdWVGZEtIUiA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUiwKKyAgICBlT3BhcXVlV2luMzJLSFIgPSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFIsCisgICAgZU9wYXF1ZVdpbjMyS210S0hSID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUiwKKyAgICBlRDNEMTJGZW5jZUtIUiA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVRfS0hSLAorICAgIGVTeW5jRmRLSFIgPSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfU1lOQ19GRF9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkIDogcmV0dXJuICJPcGFxdWVGZCI7CisgICAgICBjYXNlIEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlV2luMzIgOiByZXR1cm4gIk9wYXF1ZVdpbjMyIjsKKyAgICAgIGNhc2UgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVXaW4zMkttdCA6IHJldHVybiAiT3BhcXVlV2luMzJLbXQiOworICAgICAgY2FzZSBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czo6ZUQzRDEyRmVuY2UgOiByZXR1cm4gIkQzRDEyRmVuY2UiOworICAgICAgY2FzZSBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czo6ZVN5bmNGZCA6IHJldHVybiAiU3luY0ZkIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MgPSBGbGFnczxFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cywgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlRmQpIHwgVmtGbGFncyhFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZVdpbjMyKSB8IFZrRmxhZ3MoRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVXaW4zMkttdCkgfCBWa0ZsYWdzKEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzOjplRDNEMTJGZW5jZSkgfCBWa0ZsYWdzKEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzOjplU3luY0ZkKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3J8KCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3ImKCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3JeKCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBiaXQwLCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3Mgb3BlcmF0b3J+KCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIHVzaW5nIEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzS0hSID0gRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3M7CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCApIHJlc3VsdCArPSAiT3BhcXVlRmQgfCAiOworICAgIGlmICggdmFsdWUgJiBFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZVdpbjMyICkgcmVzdWx0ICs9ICJPcGFxdWVXaW4zMiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlV2luMzJLbXQgKSByZXN1bHQgKz0gIk9wYXF1ZVdpbjMyS210IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM6OmVEM0QxMkZlbmNlICkgcmVzdWx0ICs9ICJEM0QxMkZlbmNlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM6OmVTeW5jRmQgKSByZXN1bHQgKz0gIlN5bmNGZCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIEZlbmNlQ3JlYXRlRmxhZ0JpdHMKKyAgeworICAgIGVTaWduYWxlZCA9IFZLX0ZFTkNFX0NSRUFURV9TSUdOQUxFRF9CSVQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEZlbmNlQ3JlYXRlRmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgRmVuY2VDcmVhdGVGbGFnQml0czo6ZVNpZ25hbGVkIDogcmV0dXJuICJTaWduYWxlZCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEZlbmNlQ3JlYXRlRmxhZ3MgPSBGbGFnczxGZW5jZUNyZWF0ZUZsYWdCaXRzLCBWa0ZlbmNlQ3JlYXRlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEZlbmNlQ3JlYXRlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEZlbmNlQ3JlYXRlRmxhZ0JpdHM6OmVTaWduYWxlZCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZlbmNlQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J8KCBGZW5jZUNyZWF0ZUZsYWdCaXRzIGJpdDAsIEZlbmNlQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBGZW5jZUNyZWF0ZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRmVuY2VDcmVhdGVGbGFncyBvcGVyYXRvciYoIEZlbmNlQ3JlYXRlRmxhZ0JpdHMgYml0MCwgRmVuY2VDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEZlbmNlQ3JlYXRlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBGZW5jZUNyZWF0ZUZsYWdzIG9wZXJhdG9yXiggRmVuY2VDcmVhdGVGbGFnQml0cyBiaXQwLCBGZW5jZUNyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRmVuY2VDcmVhdGVGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZlbmNlQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J+KCBGZW5jZUNyZWF0ZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggRmVuY2VDcmVhdGVGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEZlbmNlQ3JlYXRlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEZlbmNlQ3JlYXRlRmxhZ0JpdHM6OmVTaWduYWxlZCApIHJlc3VsdCArPSAiU2lnbmFsZWQgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBGZW5jZUltcG9ydEZsYWdCaXRzCisgIHsKKyAgICBlVGVtcG9yYXJ5ID0gVktfRkVOQ0VfSU1QT1JUX1RFTVBPUkFSWV9CSVQsCisgICAgZVRlbXBvcmFyeUtIUiA9IFZLX0ZFTkNFX0lNUE9SVF9URU1QT1JBUllfQklUX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRmVuY2VJbXBvcnRGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBGZW5jZUltcG9ydEZsYWdCaXRzOjplVGVtcG9yYXJ5IDogcmV0dXJuICJUZW1wb3JhcnkiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBGZW5jZUltcG9ydEZsYWdzID0gRmxhZ3M8RmVuY2VJbXBvcnRGbGFnQml0cywgVmtGZW5jZUltcG9ydEZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxGZW5jZUltcG9ydEZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhGZW5jZUltcG9ydEZsYWdCaXRzOjplVGVtcG9yYXJ5KQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRmVuY2VJbXBvcnRGbGFncyBvcGVyYXRvcnwoIEZlbmNlSW1wb3J0RmxhZ0JpdHMgYml0MCwgRmVuY2VJbXBvcnRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEZlbmNlSW1wb3J0RmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBGZW5jZUltcG9ydEZsYWdzIG9wZXJhdG9yJiggRmVuY2VJbXBvcnRGbGFnQml0cyBiaXQwLCBGZW5jZUltcG9ydEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRmVuY2VJbXBvcnRGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZlbmNlSW1wb3J0RmxhZ3Mgb3BlcmF0b3JeKCBGZW5jZUltcG9ydEZsYWdCaXRzIGJpdDAsIEZlbmNlSW1wb3J0RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBGZW5jZUltcG9ydEZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRmVuY2VJbXBvcnRGbGFncyBvcGVyYXRvcn4oIEZlbmNlSW1wb3J0RmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBGZW5jZUltcG9ydEZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIHVzaW5nIEZlbmNlSW1wb3J0RmxhZ3NLSFIgPSBGZW5jZUltcG9ydEZsYWdzOworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRmVuY2VJbXBvcnRGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRmVuY2VJbXBvcnRGbGFnQml0czo6ZVRlbXBvcmFyeSApIHJlc3VsdCArPSAiVGVtcG9yYXJ5IHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRm9ybWF0RmVhdHVyZUZsYWdCaXRzCisgIHsKKyAgICBlU2FtcGxlZEltYWdlID0gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQsCisgICAgZVN0b3JhZ2VJbWFnZSA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklULAorICAgIGVTdG9yYWdlSW1hZ2VBdG9taWMgPSBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQsCisgICAgZVVuaWZvcm1UZXhlbEJ1ZmZlciA9IFZLX0ZPUk1BVF9GRUFUVVJFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCwKKyAgICBlU3RvcmFnZVRleGVsQnVmZmVyID0gVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklULAorICAgIGVTdG9yYWdlVGV4ZWxCdWZmZXJBdG9taWMgPSBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9BVE9NSUNfQklULAorICAgIGVWZXJ0ZXhCdWZmZXIgPSBWS19GT1JNQVRfRkVBVFVSRV9WRVJURVhfQlVGRkVSX0JJVCwKKyAgICBlQ29sb3JBdHRhY2htZW50ID0gVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQsCisgICAgZUNvbG9yQXR0YWNobWVudEJsZW5kID0gVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CTEVORF9CSVQsCisgICAgZURlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULAorICAgIGVCbGl0U3JjID0gVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9TUkNfQklULAorICAgIGVCbGl0RHN0ID0gVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklULAorICAgIGVTYW1wbGVkSW1hZ2VGaWx0ZXJMaW5lYXIgPSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklULAorICAgIGVUcmFuc2ZlclNyYyA9IFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVQsCisgICAgZVRyYW5zZmVyRHN0ID0gVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVCwKKyAgICBlTWlkcG9pbnRDaHJvbWFTYW1wbGVzID0gVktfRk9STUFUX0ZFQVRVUkVfTUlEUE9JTlRfQ0hST01BX1NBTVBMRVNfQklULAorICAgIGVTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25MaW5lYXJGaWx0ZXIgPSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fTElORUFSX0ZJTFRFUl9CSVQsCisgICAgZVNhbXBsZWRJbWFnZVljYmNyQ29udmVyc2lvblNlcGFyYXRlUmVjb25zdHJ1Y3Rpb25GaWx0ZXIgPSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVCwKKyAgICBlU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uQ2hyb21hUmVjb25zdHJ1Y3Rpb25FeHBsaWNpdCA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfQklULAorICAgIGVTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25DaHJvbWFSZWNvbnN0cnVjdGlvbkV4cGxpY2l0Rm9yY2VhYmxlID0gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9GT1JDRUFCTEVfQklULAorICAgIGVEaXNqb2ludCA9IFZLX0ZPUk1BVF9GRUFUVVJFX0RJU0pPSU5UX0JJVCwKKyAgICBlQ29zaXRlZENocm9tYVNhbXBsZXMgPSBWS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVCwKKyAgICBlU2FtcGxlZEltYWdlRmlsdGVyQ3ViaWNJTUcgPSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfSU1HLAorICAgIGVTYW1wbGVkSW1hZ2VGaWx0ZXJNaW5tYXhFWFQgPSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9NSU5NQVhfQklUX0VYVCwKKyAgICBlRnJhZ21lbnREZW5zaXR5TWFwRVhUID0gVktfRk9STUFUX0ZFQVRVUkVfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCwKKyAgICBlVHJhbnNmZXJTcmNLSFIgPSBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUX0tIUiwKKyAgICBlVHJhbnNmZXJEc3RLSFIgPSBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUX0tIUiwKKyAgICBlTWlkcG9pbnRDaHJvbWFTYW1wbGVzS0hSID0gVktfRk9STUFUX0ZFQVRVUkVfTUlEUE9JTlRfQ0hST01BX1NBTVBMRVNfQklUX0tIUiwKKyAgICBlU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uTGluZWFyRmlsdGVyS0hSID0gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0xJTkVBUl9GSUxURVJfQklUX0tIUiwKKyAgICBlU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uU2VwYXJhdGVSZWNvbnN0cnVjdGlvbkZpbHRlcktIUiA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9TRVBBUkFURV9SRUNPTlNUUlVDVElPTl9GSUxURVJfQklUX0tIUiwKKyAgICBlU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uQ2hyb21hUmVjb25zdHJ1Y3Rpb25FeHBsaWNpdEtIUiA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfQklUX0tIUiwKKyAgICBlU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uQ2hyb21hUmVjb25zdHJ1Y3Rpb25FeHBsaWNpdEZvcmNlYWJsZUtIUiA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfRk9SQ0VBQkxFX0JJVF9LSFIsCisgICAgZURpc2pvaW50S0hSID0gVktfRk9STUFUX0ZFQVRVUkVfRElTSk9JTlRfQklUX0tIUiwKKyAgICBlQ29zaXRlZENocm9tYVNhbXBsZXNLSFIgPSBWS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVF9LSFIsCisgICAgZVNhbXBsZWRJbWFnZUZpbHRlckN1YmljRVhUID0gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRm9ybWF0RmVhdHVyZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVNhbXBsZWRJbWFnZSA6IHJldHVybiAiU2FtcGxlZEltYWdlIjsKKyAgICAgIGNhc2UgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU3RvcmFnZUltYWdlIDogcmV0dXJuICJTdG9yYWdlSW1hZ2UiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTdG9yYWdlSW1hZ2VBdG9taWMgOiByZXR1cm4gIlN0b3JhZ2VJbWFnZUF0b21pYyI7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVVuaWZvcm1UZXhlbEJ1ZmZlciA6IHJldHVybiAiVW5pZm9ybVRleGVsQnVmZmVyIjsKKyAgICAgIGNhc2UgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU3RvcmFnZVRleGVsQnVmZmVyIDogcmV0dXJuICJTdG9yYWdlVGV4ZWxCdWZmZXIiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTdG9yYWdlVGV4ZWxCdWZmZXJBdG9taWMgOiByZXR1cm4gIlN0b3JhZ2VUZXhlbEJ1ZmZlckF0b21pYyI7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVZlcnRleEJ1ZmZlciA6IHJldHVybiAiVmVydGV4QnVmZmVyIjsKKyAgICAgIGNhc2UgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplQ29sb3JBdHRhY2htZW50IDogcmV0dXJuICJDb2xvckF0dGFjaG1lbnQiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnRCbGVuZCA6IHJldHVybiAiQ29sb3JBdHRhY2htZW50QmxlbmQiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVEZXB0aFN0ZW5jaWxBdHRhY2htZW50IDogcmV0dXJuICJEZXB0aFN0ZW5jaWxBdHRhY2htZW50IjsKKyAgICAgIGNhc2UgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplQmxpdFNyYyA6IHJldHVybiAiQmxpdFNyYyI7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZUJsaXREc3QgOiByZXR1cm4gIkJsaXREc3QiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VGaWx0ZXJMaW5lYXIgOiByZXR1cm4gIlNhbXBsZWRJbWFnZUZpbHRlckxpbmVhciI7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVRyYW5zZmVyU3JjIDogcmV0dXJuICJUcmFuc2ZlclNyYyI7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVRyYW5zZmVyRHN0IDogcmV0dXJuICJUcmFuc2ZlckRzdCI7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZU1pZHBvaW50Q2hyb21hU2FtcGxlcyA6IHJldHVybiAiTWlkcG9pbnRDaHJvbWFTYW1wbGVzIjsKKyAgICAgIGNhc2UgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uTGluZWFyRmlsdGVyIDogcmV0dXJuICJTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25MaW5lYXJGaWx0ZXIiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25TZXBhcmF0ZVJlY29uc3RydWN0aW9uRmlsdGVyIDogcmV0dXJuICJTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25TZXBhcmF0ZVJlY29uc3RydWN0aW9uRmlsdGVyIjsKKyAgICAgIGNhc2UgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uQ2hyb21hUmVjb25zdHJ1Y3Rpb25FeHBsaWNpdCA6IHJldHVybiAiU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uQ2hyb21hUmVjb25zdHJ1Y3Rpb25FeHBsaWNpdCI7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVNhbXBsZWRJbWFnZVljYmNyQ29udmVyc2lvbkNocm9tYVJlY29uc3RydWN0aW9uRXhwbGljaXRGb3JjZWFibGUgOiByZXR1cm4gIlNhbXBsZWRJbWFnZVljYmNyQ29udmVyc2lvbkNocm9tYVJlY29uc3RydWN0aW9uRXhwbGljaXRGb3JjZWFibGUiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVEaXNqb2ludCA6IHJldHVybiAiRGlzam9pbnQiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVDb3NpdGVkQ2hyb21hU2FtcGxlcyA6IHJldHVybiAiQ29zaXRlZENocm9tYVNhbXBsZXMiOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VGaWx0ZXJDdWJpY0lNRyA6IHJldHVybiAiU2FtcGxlZEltYWdlRmlsdGVyQ3ViaWNJTUciOworICAgICAgY2FzZSBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VGaWx0ZXJNaW5tYXhFWFQgOiByZXR1cm4gIlNhbXBsZWRJbWFnZUZpbHRlck1pbm1heEVYVCI7CisgICAgICBjYXNlIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZUZyYWdtZW50RGVuc2l0eU1hcEVYVCA6IHJldHVybiAiRnJhZ21lbnREZW5zaXR5TWFwRVhUIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgRm9ybWF0RmVhdHVyZUZsYWdzID0gRmxhZ3M8Rm9ybWF0RmVhdHVyZUZsYWdCaXRzLCBWa0Zvcm1hdEZlYXR1cmVGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8Rm9ybWF0RmVhdHVyZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2UpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTdG9yYWdlSW1hZ2UpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTdG9yYWdlSW1hZ2VBdG9taWMpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVVbmlmb3JtVGV4ZWxCdWZmZXIpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTdG9yYWdlVGV4ZWxCdWZmZXIpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTdG9yYWdlVGV4ZWxCdWZmZXJBdG9taWMpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVWZXJ0ZXhCdWZmZXIpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnQpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnRCbGVuZCkgfCBWa0ZsYWdzKEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVCbGl0U3JjKSB8IFZrRmxhZ3MoRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplQmxpdERzdCkgfCBWa0ZsYWdzKEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVNhbXBsZWRJbWFnZUZpbHRlckxpbmVhcikgfCBWa0ZsYWdzKEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVRyYW5zZmVyU3JjKSB8IFZrRmxhZ3MoRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplVHJhbnNmZXJEc3QpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVNaWRwb2ludENocm9tYVNhbXBsZXMpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25MaW5lYXJGaWx0ZXIpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25TZXBhcmF0ZVJlY29uc3RydWN0aW9uRmlsdGVyKSB8IFZrRmxhZ3MoRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uQ2hyb21hUmVjb25zdHJ1Y3Rpb25FeHBsaWNpdCkgfCBWa0ZsYWdzKEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVNhbXBsZWRJbWFnZVljYmNyQ29udmVyc2lvbkNocm9tYVJlY29uc3RydWN0aW9uRXhwbGljaXRGb3JjZWFibGUpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVEaXNqb2ludCkgfCBWa0ZsYWdzKEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZUNvc2l0ZWRDaHJvbWFTYW1wbGVzKSB8IFZrRmxhZ3MoRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU2FtcGxlZEltYWdlRmlsdGVyQ3ViaWNJTUcpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VGaWx0ZXJNaW5tYXhFWFQpIHwgVmtGbGFncyhGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVGcmFnbWVudERlbnNpdHlNYXBFWFQpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBGb3JtYXRGZWF0dXJlRmxhZ3Mgb3BlcmF0b3J8KCBGb3JtYXRGZWF0dXJlRmxhZ0JpdHMgYml0MCwgRm9ybWF0RmVhdHVyZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRm9ybWF0RmVhdHVyZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRm9ybWF0RmVhdHVyZUZsYWdzIG9wZXJhdG9yJiggRm9ybWF0RmVhdHVyZUZsYWdCaXRzIGJpdDAsIEZvcm1hdEZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEZvcm1hdEZlYXR1cmVGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZvcm1hdEZlYXR1cmVGbGFncyBvcGVyYXRvcl4oIEZvcm1hdEZlYXR1cmVGbGFnQml0cyBiaXQwLCBGb3JtYXRGZWF0dXJlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBGb3JtYXRGZWF0dXJlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBGb3JtYXRGZWF0dXJlRmxhZ3Mgb3BlcmF0b3J+KCBGb3JtYXRGZWF0dXJlRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBGb3JtYXRGZWF0dXJlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBGb3JtYXRGZWF0dXJlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVNhbXBsZWRJbWFnZSApIHJlc3VsdCArPSAiU2FtcGxlZEltYWdlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU3RvcmFnZUltYWdlICkgcmVzdWx0ICs9ICJTdG9yYWdlSW1hZ2UgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTdG9yYWdlSW1hZ2VBdG9taWMgKSByZXN1bHQgKz0gIlN0b3JhZ2VJbWFnZUF0b21pYyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVVuaWZvcm1UZXhlbEJ1ZmZlciApIHJlc3VsdCArPSAiVW5pZm9ybVRleGVsQnVmZmVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU3RvcmFnZVRleGVsQnVmZmVyICkgcmVzdWx0ICs9ICJTdG9yYWdlVGV4ZWxCdWZmZXIgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTdG9yYWdlVGV4ZWxCdWZmZXJBdG9taWMgKSByZXN1bHQgKz0gIlN0b3JhZ2VUZXhlbEJ1ZmZlckF0b21pYyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVZlcnRleEJ1ZmZlciApIHJlc3VsdCArPSAiVmVydGV4QnVmZmVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplQ29sb3JBdHRhY2htZW50ICkgcmVzdWx0ICs9ICJDb2xvckF0dGFjaG1lbnQgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnRCbGVuZCApIHJlc3VsdCArPSAiQ29sb3JBdHRhY2htZW50QmxlbmQgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVEZXB0aFN0ZW5jaWxBdHRhY2htZW50ICkgcmVzdWx0ICs9ICJEZXB0aFN0ZW5jaWxBdHRhY2htZW50IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplQmxpdFNyYyApIHJlc3VsdCArPSAiQmxpdFNyYyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZUJsaXREc3QgKSByZXN1bHQgKz0gIkJsaXREc3QgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VGaWx0ZXJMaW5lYXIgKSByZXN1bHQgKz0gIlNhbXBsZWRJbWFnZUZpbHRlckxpbmVhciB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVRyYW5zZmVyU3JjICkgcmVzdWx0ICs9ICJUcmFuc2ZlclNyYyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVRyYW5zZmVyRHN0ICkgcmVzdWx0ICs9ICJUcmFuc2ZlckRzdCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZU1pZHBvaW50Q2hyb21hU2FtcGxlcyApIHJlc3VsdCArPSAiTWlkcG9pbnRDaHJvbWFTYW1wbGVzIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uTGluZWFyRmlsdGVyICkgcmVzdWx0ICs9ICJTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25MaW5lYXJGaWx0ZXIgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25TZXBhcmF0ZVJlY29uc3RydWN0aW9uRmlsdGVyICkgcmVzdWx0ICs9ICJTYW1wbGVkSW1hZ2VZY2JjckNvbnZlcnNpb25TZXBhcmF0ZVJlY29uc3RydWN0aW9uRmlsdGVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgRm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uQ2hyb21hUmVjb25zdHJ1Y3Rpb25FeHBsaWNpdCApIHJlc3VsdCArPSAiU2FtcGxlZEltYWdlWWNiY3JDb252ZXJzaW9uQ2hyb21hUmVjb25zdHJ1Y3Rpb25FeHBsaWNpdCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVNhbXBsZWRJbWFnZVljYmNyQ29udmVyc2lvbkNocm9tYVJlY29uc3RydWN0aW9uRXhwbGljaXRGb3JjZWFibGUgKSByZXN1bHQgKz0gIlNhbXBsZWRJbWFnZVljYmNyQ29udmVyc2lvbkNocm9tYVJlY29uc3RydWN0aW9uRXhwbGljaXRGb3JjZWFibGUgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVEaXNqb2ludCApIHJlc3VsdCArPSAiRGlzam9pbnQgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVDb3NpdGVkQ2hyb21hU2FtcGxlcyApIHJlc3VsdCArPSAiQ29zaXRlZENocm9tYVNhbXBsZXMgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VGaWx0ZXJDdWJpY0lNRyApIHJlc3VsdCArPSAiU2FtcGxlZEltYWdlRmlsdGVyQ3ViaWNJTUcgfCAiOworICAgIGlmICggdmFsdWUgJiBGb3JtYXRGZWF0dXJlRmxhZ0JpdHM6OmVTYW1wbGVkSW1hZ2VGaWx0ZXJNaW5tYXhFWFQgKSByZXN1bHQgKz0gIlNhbXBsZWRJbWFnZUZpbHRlck1pbm1heEVYVCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZUZyYWdtZW50RGVuc2l0eU1hcEVYVCApIHJlc3VsdCArPSAiRnJhZ21lbnREZW5zaXR5TWFwRVhUIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cworICB7CisgICAgZUltYWdlbGVzc0tIUiA9IFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzOjplSW1hZ2VsZXNzS0hSIDogcmV0dXJuICJJbWFnZWxlc3NLSFIiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzID0gRmxhZ3M8RnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cywgVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzOjplSW1hZ2VsZXNzS0hSKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRnJhbWVidWZmZXJDcmVhdGVGbGFncyBvcGVyYXRvcnwoIEZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHMgYml0MCwgRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEZyYW1lYnVmZmVyQ3JlYXRlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzIG9wZXJhdG9yJiggRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cyBiaXQwLCBGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gRnJhbWVidWZmZXJDcmVhdGVGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZyYW1lYnVmZmVyQ3JlYXRlRmxhZ3Mgb3BlcmF0b3JeKCBGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzIGJpdDAsIEZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgRnJhbWVidWZmZXJDcmVhdGVGbGFncyBvcGVyYXRvcn4oIEZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggRnJhbWVidWZmZXJDcmVhdGVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0czo6ZUltYWdlbGVzc0tIUiApIHJlc3VsdCArPSAiSW1hZ2VsZXNzS0hSIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgR2VvbWV0cnlGbGFnQml0c05WCisgIHsKKyAgICBlT3BhcXVlID0gVktfR0VPTUVUUllfT1BBUVVFX0JJVF9OViwKKyAgICBlTm9EdXBsaWNhdGVBbnlIaXRJbnZvY2F0aW9uID0gVktfR0VPTUVUUllfTk9fRFVQTElDQVRFX0FOWV9ISVRfSU5WT0NBVElPTl9CSVRfTlYKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEdlb21ldHJ5RmxhZ0JpdHNOViB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBHZW9tZXRyeUZsYWdCaXRzTlY6OmVPcGFxdWUgOiByZXR1cm4gIk9wYXF1ZSI7CisgICAgICBjYXNlIEdlb21ldHJ5RmxhZ0JpdHNOVjo6ZU5vRHVwbGljYXRlQW55SGl0SW52b2NhdGlvbiA6IHJldHVybiAiTm9EdXBsaWNhdGVBbnlIaXRJbnZvY2F0aW9uIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgR2VvbWV0cnlGbGFnc05WID0gRmxhZ3M8R2VvbWV0cnlGbGFnQml0c05WLCBWa0dlb21ldHJ5RmxhZ3NOVj47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8R2VvbWV0cnlGbGFnQml0c05WPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhHZW9tZXRyeUZsYWdCaXRzTlY6OmVPcGFxdWUpIHwgVmtGbGFncyhHZW9tZXRyeUZsYWdCaXRzTlY6OmVOb0R1cGxpY2F0ZUFueUhpdEludm9jYXRpb24pCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBHZW9tZXRyeUZsYWdzTlYgb3BlcmF0b3J8KCBHZW9tZXRyeUZsYWdCaXRzTlYgYml0MCwgR2VvbWV0cnlGbGFnQml0c05WIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gR2VvbWV0cnlGbGFnc05WKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgR2VvbWV0cnlGbGFnc05WIG9wZXJhdG9yJiggR2VvbWV0cnlGbGFnQml0c05WIGJpdDAsIEdlb21ldHJ5RmxhZ0JpdHNOViBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEdlb21ldHJ5RmxhZ3NOViggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEdlb21ldHJ5RmxhZ3NOViBvcGVyYXRvcl4oIEdlb21ldHJ5RmxhZ0JpdHNOViBiaXQwLCBHZW9tZXRyeUZsYWdCaXRzTlYgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBHZW9tZXRyeUZsYWdzTlYoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBHZW9tZXRyeUZsYWdzTlYgb3BlcmF0b3J+KCBHZW9tZXRyeUZsYWdCaXRzTlYgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBHZW9tZXRyeUZsYWdzTlYoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBHZW9tZXRyeUZsYWdzTlYgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEdlb21ldHJ5RmxhZ0JpdHNOVjo6ZU9wYXF1ZSApIHJlc3VsdCArPSAiT3BhcXVlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgR2VvbWV0cnlGbGFnQml0c05WOjplTm9EdXBsaWNhdGVBbnlIaXRJbnZvY2F0aW9uICkgcmVzdWx0ICs9ICJOb0R1cGxpY2F0ZUFueUhpdEludm9jYXRpb24gfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOVgorICB7CisgICAgZVRyaWFuZ2xlQ3VsbERpc2FibGUgPSBWS19HRU9NRVRSWV9JTlNUQU5DRV9UUklBTkdMRV9DVUxMX0RJU0FCTEVfQklUX05WLAorICAgIGVUcmlhbmdsZUZyb250Q291bnRlcmNsb2Nrd2lzZSA9IFZLX0dFT01FVFJZX0lOU1RBTkNFX1RSSUFOR0xFX0ZST05UX0NPVU5URVJDTE9DS1dJU0VfQklUX05WLAorICAgIGVGb3JjZU9wYXF1ZSA9IFZLX0dFT01FVFJZX0lOU1RBTkNFX0ZPUkNFX09QQVFVRV9CSVRfTlYsCisgICAgZUZvcmNlTm9PcGFxdWUgPSBWS19HRU9NRVRSWV9JTlNUQU5DRV9GT1JDRV9OT19PUEFRVUVfQklUX05WCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOVjo6ZVRyaWFuZ2xlQ3VsbERpc2FibGUgOiByZXR1cm4gIlRyaWFuZ2xlQ3VsbERpc2FibGUiOworICAgICAgY2FzZSBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOVjo6ZVRyaWFuZ2xlRnJvbnRDb3VudGVyY2xvY2t3aXNlIDogcmV0dXJuICJUcmlhbmdsZUZyb250Q291bnRlcmNsb2Nrd2lzZSI7CisgICAgICBjYXNlIEdlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WOjplRm9yY2VPcGFxdWUgOiByZXR1cm4gIkZvcmNlT3BhcXVlIjsKKyAgICAgIGNhc2UgR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlY6OmVGb3JjZU5vT3BhcXVlIDogcmV0dXJuICJGb3JjZU5vT3BhcXVlIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgR2VvbWV0cnlJbnN0YW5jZUZsYWdzTlYgPSBGbGFnczxHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViwgVmtHZW9tZXRyeUluc3RhbmNlRmxhZ3NOVj47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8R2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlY+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEdlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WOjplVHJpYW5nbGVDdWxsRGlzYWJsZSkgfCBWa0ZsYWdzKEdlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WOjplVHJpYW5nbGVGcm9udENvdW50ZXJjbG9ja3dpc2UpIHwgVmtGbGFncyhHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOVjo6ZUZvcmNlT3BhcXVlKSB8IFZrRmxhZ3MoR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlY6OmVGb3JjZU5vT3BhcXVlKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgR2VvbWV0cnlJbnN0YW5jZUZsYWdzTlYgb3BlcmF0b3J8KCBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViBiaXQwLCBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEdlb21ldHJ5SW5zdGFuY2VGbGFnc05WKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgR2VvbWV0cnlJbnN0YW5jZUZsYWdzTlYgb3BlcmF0b3ImKCBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViBiaXQwLCBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEdlb21ldHJ5SW5zdGFuY2VGbGFnc05WKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgR2VvbWV0cnlJbnN0YW5jZUZsYWdzTlYgb3BlcmF0b3JeKCBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViBiaXQwLCBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEdlb21ldHJ5SW5zdGFuY2VGbGFnc05WKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgR2VvbWV0cnlJbnN0YW5jZUZsYWdzTlYgb3BlcmF0b3J+KCBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIEdlb21ldHJ5SW5zdGFuY2VGbGFnc05WKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggR2VvbWV0cnlJbnN0YW5jZUZsYWdzTlYgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEdlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WOjplVHJpYW5nbGVDdWxsRGlzYWJsZSApIHJlc3VsdCArPSAiVHJpYW5nbGVDdWxsRGlzYWJsZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEdlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WOjplVHJpYW5nbGVGcm9udENvdW50ZXJjbG9ja3dpc2UgKSByZXN1bHQgKz0gIlRyaWFuZ2xlRnJvbnRDb3VudGVyY2xvY2t3aXNlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlY6OmVGb3JjZU9wYXF1ZSApIHJlc3VsdCArPSAiRm9yY2VPcGFxdWUgfCAiOworICAgIGlmICggdmFsdWUgJiBHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOVjo6ZUZvcmNlTm9PcGFxdWUgKSByZXN1bHQgKz0gIkZvcmNlTm9PcGFxdWUgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBIZWFkbGVzc1N1cmZhY2VDcmVhdGVGbGFnQml0c0VYVAorICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUZsYWdCaXRzRVhUICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUZsYWdzRVhUID0gRmxhZ3M8SGVhZGxlc3NTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNFWFQsIFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQ+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggSGVhZGxlc3NTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICBlbnVtIGNsYXNzIElPU1N1cmZhY2VDcmVhdGVGbGFnQml0c01WSworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIElPU1N1cmZhY2VDcmVhdGVGbGFnQml0c01WSyApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBJT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVksgPSBGbGFnczxJT1NTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNNVkssIFZrSU9TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIElPU1N1cmZhY2VDcmVhdGVGbGFnc01WSyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9JT1NfTVZLKi8KKworICBlbnVtIGNsYXNzIEltYWdlQXNwZWN0RmxhZ0JpdHMKKyAgeworICAgIGVDb2xvciA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsCisgICAgZURlcHRoID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCwKKyAgICBlU3RlbmNpbCA9IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCwKKyAgICBlTWV0YWRhdGEgPSBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklULAorICAgIGVQbGFuZTAgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsCisgICAgZVBsYW5lMSA9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCwKKyAgICBlUGxhbmUyID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklULAorICAgIGVNZW1vcnlQbGFuZTBFWFQgPSBWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzBfQklUX0VYVCwKKyAgICBlTWVtb3J5UGxhbmUxRVhUID0gVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8xX0JJVF9FWFQsCisgICAgZU1lbW9yeVBsYW5lMkVYVCA9IFZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfMl9CSVRfRVhULAorICAgIGVNZW1vcnlQbGFuZTNFWFQgPSBWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzNfQklUX0VYVCwKKyAgICBlUGxhbmUwS0hSID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUiwKKyAgICBlUGxhbmUxS0hSID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUX0tIUiwKKyAgICBlUGxhbmUyS0hSID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggSW1hZ2VBc3BlY3RGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBJbWFnZUFzcGVjdEZsYWdCaXRzOjplQ29sb3IgOiByZXR1cm4gIkNvbG9yIjsKKyAgICAgIGNhc2UgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZURlcHRoIDogcmV0dXJuICJEZXB0aCI7CisgICAgICBjYXNlIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVTdGVuY2lsIDogcmV0dXJuICJTdGVuY2lsIjsKKyAgICAgIGNhc2UgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZU1ldGFkYXRhIDogcmV0dXJuICJNZXRhZGF0YSI7CisgICAgICBjYXNlIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVQbGFuZTAgOiByZXR1cm4gIlBsYW5lMCI7CisgICAgICBjYXNlIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVQbGFuZTEgOiByZXR1cm4gIlBsYW5lMSI7CisgICAgICBjYXNlIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVQbGFuZTIgOiByZXR1cm4gIlBsYW5lMiI7CisgICAgICBjYXNlIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVNZW1vcnlQbGFuZTBFWFQgOiByZXR1cm4gIk1lbW9yeVBsYW5lMEVYVCI7CisgICAgICBjYXNlIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVNZW1vcnlQbGFuZTFFWFQgOiByZXR1cm4gIk1lbW9yeVBsYW5lMUVYVCI7CisgICAgICBjYXNlIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVNZW1vcnlQbGFuZTJFWFQgOiByZXR1cm4gIk1lbW9yeVBsYW5lMkVYVCI7CisgICAgICBjYXNlIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVNZW1vcnlQbGFuZTNFWFQgOiByZXR1cm4gIk1lbW9yeVBsYW5lM0VYVCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEltYWdlQXNwZWN0RmxhZ3MgPSBGbGFnczxJbWFnZUFzcGVjdEZsYWdCaXRzLCBWa0ltYWdlQXNwZWN0RmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEltYWdlQXNwZWN0RmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVDb2xvcikgfCBWa0ZsYWdzKEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVEZXB0aCkgfCBWa0ZsYWdzKEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVTdGVuY2lsKSB8IFZrRmxhZ3MoSW1hZ2VBc3BlY3RGbGFnQml0czo6ZU1ldGFkYXRhKSB8IFZrRmxhZ3MoSW1hZ2VBc3BlY3RGbGFnQml0czo6ZVBsYW5lMCkgfCBWa0ZsYWdzKEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVQbGFuZTEpIHwgVmtGbGFncyhJbWFnZUFzcGVjdEZsYWdCaXRzOjplUGxhbmUyKSB8IFZrRmxhZ3MoSW1hZ2VBc3BlY3RGbGFnQml0czo6ZU1lbW9yeVBsYW5lMEVYVCkgfCBWa0ZsYWdzKEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVNZW1vcnlQbGFuZTFFWFQpIHwgVmtGbGFncyhJbWFnZUFzcGVjdEZsYWdCaXRzOjplTWVtb3J5UGxhbmUyRVhUKSB8IFZrRmxhZ3MoSW1hZ2VBc3BlY3RGbGFnQml0czo6ZU1lbW9yeVBsYW5lM0VYVCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlQXNwZWN0RmxhZ3Mgb3BlcmF0b3J8KCBJbWFnZUFzcGVjdEZsYWdCaXRzIGJpdDAsIEltYWdlQXNwZWN0RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBJbWFnZUFzcGVjdEZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VBc3BlY3RGbGFncyBvcGVyYXRvciYoIEltYWdlQXNwZWN0RmxhZ0JpdHMgYml0MCwgSW1hZ2VBc3BlY3RGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEltYWdlQXNwZWN0RmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZUFzcGVjdEZsYWdzIG9wZXJhdG9yXiggSW1hZ2VBc3BlY3RGbGFnQml0cyBiaXQwLCBJbWFnZUFzcGVjdEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW1hZ2VBc3BlY3RGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlQXNwZWN0RmxhZ3Mgb3BlcmF0b3J+KCBJbWFnZUFzcGVjdEZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggSW1hZ2VBc3BlY3RGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEltYWdlQXNwZWN0RmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEltYWdlQXNwZWN0RmxhZ0JpdHM6OmVDb2xvciApIHJlc3VsdCArPSAiQ29sb3IgfCAiOworICAgIGlmICggdmFsdWUgJiBJbWFnZUFzcGVjdEZsYWdCaXRzOjplRGVwdGggKSByZXN1bHQgKz0gIkRlcHRoIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZVN0ZW5jaWwgKSByZXN1bHQgKz0gIlN0ZW5jaWwgfCAiOworICAgIGlmICggdmFsdWUgJiBJbWFnZUFzcGVjdEZsYWdCaXRzOjplTWV0YWRhdGEgKSByZXN1bHQgKz0gIk1ldGFkYXRhIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZVBsYW5lMCApIHJlc3VsdCArPSAiUGxhbmUwIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZVBsYW5lMSApIHJlc3VsdCArPSAiUGxhbmUxIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZVBsYW5lMiApIHJlc3VsdCArPSAiUGxhbmUyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZU1lbW9yeVBsYW5lMEVYVCApIHJlc3VsdCArPSAiTWVtb3J5UGxhbmUwRVhUIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZU1lbW9yeVBsYW5lMUVYVCApIHJlc3VsdCArPSAiTWVtb3J5UGxhbmUxRVhUIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZU1lbW9yeVBsYW5lMkVYVCApIHJlc3VsdCArPSAiTWVtb3J5UGxhbmUyRVhUIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VBc3BlY3RGbGFnQml0czo6ZU1lbW9yeVBsYW5lM0VYVCApIHJlc3VsdCArPSAiTWVtb3J5UGxhbmUzRVhUIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgSW1hZ2VDcmVhdGVGbGFnQml0cworICB7CisgICAgZVNwYXJzZUJpbmRpbmcgPSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULAorICAgIGVTcGFyc2VSZXNpZGVuY3kgPSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQsCisgICAgZVNwYXJzZUFsaWFzZWQgPSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklULAorICAgIGVNdXRhYmxlRm9ybWF0ID0gVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCwKKyAgICBlQ3ViZUNvbXBhdGlibGUgPSBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVCwKKyAgICBlQWxpYXMgPSBWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklULAorICAgIGVTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMgPSBWS19JTUFHRV9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVCwKKyAgICBlMkRBcnJheUNvbXBhdGlibGUgPSBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVQsCisgICAgZUJsb2NrVGV4ZWxWaWV3Q29tcGF0aWJsZSA9IFZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklULAorICAgIGVFeHRlbmRlZFVzYWdlID0gVktfSU1BR0VfQ1JFQVRFX0VYVEVOREVEX1VTQUdFX0JJVCwKKyAgICBlUHJvdGVjdGVkID0gVktfSU1BR0VfQ1JFQVRFX1BST1RFQ1RFRF9CSVQsCisgICAgZURpc2pvaW50ID0gVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVCwKKyAgICBlQ29ybmVyU2FtcGxlZE5WID0gVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViwKKyAgICBlU2FtcGxlTG9jYXRpb25zQ29tcGF0aWJsZURlcHRoRVhUID0gVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhULAorICAgIGVTdWJzYW1wbGVkRVhUID0gVktfSU1BR0VfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVCwKKyAgICBlU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zS0hSID0gVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVRfS0hSLAorICAgIGUyREFycmF5Q29tcGF0aWJsZUtIUiA9IFZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVF9LSFIsCisgICAgZUJsb2NrVGV4ZWxWaWV3Q29tcGF0aWJsZUtIUiA9IFZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklUX0tIUiwKKyAgICBlRXh0ZW5kZWRVc2FnZUtIUiA9IFZLX0lNQUdFX0NSRUFURV9FWFRFTkRFRF9VU0FHRV9CSVRfS0hSLAorICAgIGVEaXNqb2ludEtIUiA9IFZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVRfS0hSLAorICAgIGVBbGlhc0tIUiA9IFZLX0lNQUdFX0NSRUFURV9BTElBU19CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBJbWFnZUNyZWF0ZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVTcGFyc2VCaW5kaW5nIDogcmV0dXJuICJTcGFyc2VCaW5kaW5nIjsKKyAgICAgIGNhc2UgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVNwYXJzZVJlc2lkZW5jeSA6IHJldHVybiAiU3BhcnNlUmVzaWRlbmN5IjsKKyAgICAgIGNhc2UgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVNwYXJzZUFsaWFzZWQgOiByZXR1cm4gIlNwYXJzZUFsaWFzZWQiOworICAgICAgY2FzZSBJbWFnZUNyZWF0ZUZsYWdCaXRzOjplTXV0YWJsZUZvcm1hdCA6IHJldHVybiAiTXV0YWJsZUZvcm1hdCI7CisgICAgICBjYXNlIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVDdWJlQ29tcGF0aWJsZSA6IHJldHVybiAiQ3ViZUNvbXBhdGlibGUiOworICAgICAgY2FzZSBJbWFnZUNyZWF0ZUZsYWdCaXRzOjplQWxpYXMgOiByZXR1cm4gIkFsaWFzIjsKKyAgICAgIGNhc2UgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyA6IHJldHVybiAiU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zIjsKKyAgICAgIGNhc2UgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZTJEQXJyYXlDb21wYXRpYmxlIDogcmV0dXJuICIyREFycmF5Q29tcGF0aWJsZSI7CisgICAgICBjYXNlIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVCbG9ja1RleGVsVmlld0NvbXBhdGlibGUgOiByZXR1cm4gIkJsb2NrVGV4ZWxWaWV3Q29tcGF0aWJsZSI7CisgICAgICBjYXNlIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVFeHRlbmRlZFVzYWdlIDogcmV0dXJuICJFeHRlbmRlZFVzYWdlIjsKKyAgICAgIGNhc2UgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVByb3RlY3RlZCA6IHJldHVybiAiUHJvdGVjdGVkIjsKKyAgICAgIGNhc2UgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZURpc2pvaW50IDogcmV0dXJuICJEaXNqb2ludCI7CisgICAgICBjYXNlIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVDb3JuZXJTYW1wbGVkTlYgOiByZXR1cm4gIkNvcm5lclNhbXBsZWROViI7CisgICAgICBjYXNlIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVTYW1wbGVMb2NhdGlvbnNDb21wYXRpYmxlRGVwdGhFWFQgOiByZXR1cm4gIlNhbXBsZUxvY2F0aW9uc0NvbXBhdGlibGVEZXB0aEVYVCI7CisgICAgICBjYXNlIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVTdWJzYW1wbGVkRVhUIDogcmV0dXJuICJTdWJzYW1wbGVkRVhUIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgSW1hZ2VDcmVhdGVGbGFncyA9IEZsYWdzPEltYWdlQ3JlYXRlRmxhZ0JpdHMsIFZrSW1hZ2VDcmVhdGVGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8SW1hZ2VDcmVhdGVGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVNwYXJzZUJpbmRpbmcpIHwgVmtGbGFncyhJbWFnZUNyZWF0ZUZsYWdCaXRzOjplU3BhcnNlUmVzaWRlbmN5KSB8IFZrRmxhZ3MoSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVNwYXJzZUFsaWFzZWQpIHwgVmtGbGFncyhJbWFnZUNyZWF0ZUZsYWdCaXRzOjplTXV0YWJsZUZvcm1hdCkgfCBWa0ZsYWdzKEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVDdWJlQ29tcGF0aWJsZSkgfCBWa0ZsYWdzKEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVBbGlhcykgfCBWa0ZsYWdzKEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMpIHwgVmtGbGFncyhJbWFnZUNyZWF0ZUZsYWdCaXRzOjplMkRBcnJheUNvbXBhdGlibGUpIHwgVmtGbGFncyhJbWFnZUNyZWF0ZUZsYWdCaXRzOjplQmxvY2tUZXhlbFZpZXdDb21wYXRpYmxlKSB8IFZrRmxhZ3MoSW1hZ2VDcmVhdGVGbGFnQml0czo6ZUV4dGVuZGVkVXNhZ2UpIHwgVmtGbGFncyhJbWFnZUNyZWF0ZUZsYWdCaXRzOjplUHJvdGVjdGVkKSB8IFZrRmxhZ3MoSW1hZ2VDcmVhdGVGbGFnQml0czo6ZURpc2pvaW50KSB8IFZrRmxhZ3MoSW1hZ2VDcmVhdGVGbGFnQml0czo6ZUNvcm5lclNhbXBsZWROVikgfCBWa0ZsYWdzKEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVTYW1wbGVMb2NhdGlvbnNDb21wYXRpYmxlRGVwdGhFWFQpIHwgVmtGbGFncyhJbWFnZUNyZWF0ZUZsYWdCaXRzOjplU3Vic2FtcGxlZEVYVCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J8KCBJbWFnZUNyZWF0ZUZsYWdCaXRzIGJpdDAsIEltYWdlQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBJbWFnZUNyZWF0ZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VDcmVhdGVGbGFncyBvcGVyYXRvciYoIEltYWdlQ3JlYXRlRmxhZ0JpdHMgYml0MCwgSW1hZ2VDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEltYWdlQ3JlYXRlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZUNyZWF0ZUZsYWdzIG9wZXJhdG9yXiggSW1hZ2VDcmVhdGVGbGFnQml0cyBiaXQwLCBJbWFnZUNyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW1hZ2VDcmVhdGVGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J+KCBJbWFnZUNyZWF0ZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggSW1hZ2VDcmVhdGVGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEltYWdlQ3JlYXRlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVTcGFyc2VCaW5kaW5nICkgcmVzdWx0ICs9ICJTcGFyc2VCaW5kaW5nIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVNwYXJzZVJlc2lkZW5jeSApIHJlc3VsdCArPSAiU3BhcnNlUmVzaWRlbmN5IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVNwYXJzZUFsaWFzZWQgKSByZXN1bHQgKz0gIlNwYXJzZUFsaWFzZWQgfCAiOworICAgIGlmICggdmFsdWUgJiBJbWFnZUNyZWF0ZUZsYWdCaXRzOjplTXV0YWJsZUZvcm1hdCApIHJlc3VsdCArPSAiTXV0YWJsZUZvcm1hdCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVDdWJlQ29tcGF0aWJsZSApIHJlc3VsdCArPSAiQ3ViZUNvbXBhdGlibGUgfCAiOworICAgIGlmICggdmFsdWUgJiBJbWFnZUNyZWF0ZUZsYWdCaXRzOjplQWxpYXMgKSByZXN1bHQgKz0gIkFsaWFzIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyApIHJlc3VsdCArPSAiU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZTJEQXJyYXlDb21wYXRpYmxlICkgcmVzdWx0ICs9ICIyREFycmF5Q29tcGF0aWJsZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVCbG9ja1RleGVsVmlld0NvbXBhdGlibGUgKSByZXN1bHQgKz0gIkJsb2NrVGV4ZWxWaWV3Q29tcGF0aWJsZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVFeHRlbmRlZFVzYWdlICkgcmVzdWx0ICs9ICJFeHRlbmRlZFVzYWdlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZVByb3RlY3RlZCApIHJlc3VsdCArPSAiUHJvdGVjdGVkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VDcmVhdGVGbGFnQml0czo6ZURpc2pvaW50ICkgcmVzdWx0ICs9ICJEaXNqb2ludCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVDb3JuZXJTYW1wbGVkTlYgKSByZXN1bHQgKz0gIkNvcm5lclNhbXBsZWROViB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVTYW1wbGVMb2NhdGlvbnNDb21wYXRpYmxlRGVwdGhFWFQgKSByZXN1bHQgKz0gIlNhbXBsZUxvY2F0aW9uc0NvbXBhdGlibGVEZXB0aEVYVCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlQ3JlYXRlRmxhZ0JpdHM6OmVTdWJzYW1wbGVkRVhUICkgcmVzdWx0ICs9ICJTdWJzYW1wbGVkRVhUIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgZW51bSBjbGFzcyBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNGVUNIU0lBCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUZsYWdCaXRzRlVDSFNJQSApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlRmxhZ3NGVUNIU0lBID0gRmxhZ3M8SW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUZsYWdCaXRzRlVDSFNJQSwgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlRmxhZ3NGVUNIU0lBPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEltYWdlUGlwZVN1cmZhY2VDcmVhdGVGbGFnc0ZVQ0hTSUEgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fRlVDSFNJQSovCisKKyAgZW51bSBjbGFzcyBJbWFnZVVzYWdlRmxhZ0JpdHMKKyAgeworICAgIGVUcmFuc2ZlclNyYyA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQsCisgICAgZVRyYW5zZmVyRHN0ID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwKKyAgICBlU2FtcGxlZCA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULAorICAgIGVTdG9yYWdlID0gVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQsCisgICAgZUNvbG9yQXR0YWNobWVudCA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULAorICAgIGVEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCwKKyAgICBlVHJhbnNpZW50QXR0YWNobWVudCA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCwKKyAgICBlSW5wdXRBdHRhY2htZW50ID0gVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQsCisgICAgZVNoYWRpbmdSYXRlSW1hZ2VOViA9IFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYsCisgICAgZUZyYWdtZW50RGVuc2l0eU1hcEVYVCA9IFZLX0lNQUdFX1VTQUdFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEltYWdlVXNhZ2VGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBJbWFnZVVzYWdlRmxhZ0JpdHM6OmVUcmFuc2ZlclNyYyA6IHJldHVybiAiVHJhbnNmZXJTcmMiOworICAgICAgY2FzZSBJbWFnZVVzYWdlRmxhZ0JpdHM6OmVUcmFuc2ZlckRzdCA6IHJldHVybiAiVHJhbnNmZXJEc3QiOworICAgICAgY2FzZSBJbWFnZVVzYWdlRmxhZ0JpdHM6OmVTYW1wbGVkIDogcmV0dXJuICJTYW1wbGVkIjsKKyAgICAgIGNhc2UgSW1hZ2VVc2FnZUZsYWdCaXRzOjplU3RvcmFnZSA6IHJldHVybiAiU3RvcmFnZSI7CisgICAgICBjYXNlIEltYWdlVXNhZ2VGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudCA6IHJldHVybiAiQ29sb3JBdHRhY2htZW50IjsKKyAgICAgIGNhc2UgSW1hZ2VVc2FnZUZsYWdCaXRzOjplRGVwdGhTdGVuY2lsQXR0YWNobWVudCA6IHJldHVybiAiRGVwdGhTdGVuY2lsQXR0YWNobWVudCI7CisgICAgICBjYXNlIEltYWdlVXNhZ2VGbGFnQml0czo6ZVRyYW5zaWVudEF0dGFjaG1lbnQgOiByZXR1cm4gIlRyYW5zaWVudEF0dGFjaG1lbnQiOworICAgICAgY2FzZSBJbWFnZVVzYWdlRmxhZ0JpdHM6OmVJbnB1dEF0dGFjaG1lbnQgOiByZXR1cm4gIklucHV0QXR0YWNobWVudCI7CisgICAgICBjYXNlIEltYWdlVXNhZ2VGbGFnQml0czo6ZVNoYWRpbmdSYXRlSW1hZ2VOViA6IHJldHVybiAiU2hhZGluZ1JhdGVJbWFnZU5WIjsKKyAgICAgIGNhc2UgSW1hZ2VVc2FnZUZsYWdCaXRzOjplRnJhZ21lbnREZW5zaXR5TWFwRVhUIDogcmV0dXJuICJGcmFnbWVudERlbnNpdHlNYXBFWFQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBJbWFnZVVzYWdlRmxhZ3MgPSBGbGFnczxJbWFnZVVzYWdlRmxhZ0JpdHMsIFZrSW1hZ2VVc2FnZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxJbWFnZVVzYWdlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKEltYWdlVXNhZ2VGbGFnQml0czo6ZVRyYW5zZmVyU3JjKSB8IFZrRmxhZ3MoSW1hZ2VVc2FnZUZsYWdCaXRzOjplVHJhbnNmZXJEc3QpIHwgVmtGbGFncyhJbWFnZVVzYWdlRmxhZ0JpdHM6OmVTYW1wbGVkKSB8IFZrRmxhZ3MoSW1hZ2VVc2FnZUZsYWdCaXRzOjplU3RvcmFnZSkgfCBWa0ZsYWdzKEltYWdlVXNhZ2VGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudCkgfCBWa0ZsYWdzKEltYWdlVXNhZ2VGbGFnQml0czo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHwgVmtGbGFncyhJbWFnZVVzYWdlRmxhZ0JpdHM6OmVUcmFuc2llbnRBdHRhY2htZW50KSB8IFZrRmxhZ3MoSW1hZ2VVc2FnZUZsYWdCaXRzOjplSW5wdXRBdHRhY2htZW50KSB8IFZrRmxhZ3MoSW1hZ2VVc2FnZUZsYWdCaXRzOjplU2hhZGluZ1JhdGVJbWFnZU5WKSB8IFZrRmxhZ3MoSW1hZ2VVc2FnZUZsYWdCaXRzOjplRnJhZ21lbnREZW5zaXR5TWFwRVhUKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VVc2FnZUZsYWdzIG9wZXJhdG9yfCggSW1hZ2VVc2FnZUZsYWdCaXRzIGJpdDAsIEltYWdlVXNhZ2VGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIEltYWdlVXNhZ2VGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlVXNhZ2VGbGFncyBvcGVyYXRvciYoIEltYWdlVXNhZ2VGbGFnQml0cyBiaXQwLCBJbWFnZVVzYWdlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBJbWFnZVVzYWdlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVVzYWdlRmxhZ3Mgb3BlcmF0b3JeKCBJbWFnZVVzYWdlRmxhZ0JpdHMgYml0MCwgSW1hZ2VVc2FnZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW1hZ2VVc2FnZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VVc2FnZUZsYWdzIG9wZXJhdG9yfiggSW1hZ2VVc2FnZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggSW1hZ2VVc2FnZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggSW1hZ2VVc2FnZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBJbWFnZVVzYWdlRmxhZ0JpdHM6OmVUcmFuc2ZlclNyYyApIHJlc3VsdCArPSAiVHJhbnNmZXJTcmMgfCAiOworICAgIGlmICggdmFsdWUgJiBJbWFnZVVzYWdlRmxhZ0JpdHM6OmVUcmFuc2ZlckRzdCApIHJlc3VsdCArPSAiVHJhbnNmZXJEc3QgfCAiOworICAgIGlmICggdmFsdWUgJiBJbWFnZVVzYWdlRmxhZ0JpdHM6OmVTYW1wbGVkICkgcmVzdWx0ICs9ICJTYW1wbGVkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VVc2FnZUZsYWdCaXRzOjplU3RvcmFnZSApIHJlc3VsdCArPSAiU3RvcmFnZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlVXNhZ2VGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudCApIHJlc3VsdCArPSAiQ29sb3JBdHRhY2htZW50IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VVc2FnZUZsYWdCaXRzOjplRGVwdGhTdGVuY2lsQXR0YWNobWVudCApIHJlc3VsdCArPSAiRGVwdGhTdGVuY2lsQXR0YWNobWVudCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlVXNhZ2VGbGFnQml0czo6ZVRyYW5zaWVudEF0dGFjaG1lbnQgKSByZXN1bHQgKz0gIlRyYW5zaWVudEF0dGFjaG1lbnQgfCAiOworICAgIGlmICggdmFsdWUgJiBJbWFnZVVzYWdlRmxhZ0JpdHM6OmVJbnB1dEF0dGFjaG1lbnQgKSByZXN1bHQgKz0gIklucHV0QXR0YWNobWVudCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEltYWdlVXNhZ2VGbGFnQml0czo6ZVNoYWRpbmdSYXRlSW1hZ2VOViApIHJlc3VsdCArPSAiU2hhZGluZ1JhdGVJbWFnZU5WIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VVc2FnZUZsYWdCaXRzOjplRnJhZ21lbnREZW5zaXR5TWFwRVhUICkgcmVzdWx0ICs9ICJGcmFnbWVudERlbnNpdHlNYXBFWFQgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBJbWFnZVZpZXdDcmVhdGVGbGFnQml0cworICB7CisgICAgZUZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWNFWFQgPSBWS19JTUFHRV9WSUVXX0NSRUFURV9GUkFHTUVOVF9ERU5TSVRZX01BUF9EWU5BTUlDX0JJVF9FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzOjplRnJhZ21lbnREZW5zaXR5TWFwRHluYW1pY0VYVCA6IHJldHVybiAiRnJhZ21lbnREZW5zaXR5TWFwRHluYW1pY0VYVCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEltYWdlVmlld0NyZWF0ZUZsYWdzID0gRmxhZ3M8SW1hZ2VWaWV3Q3JlYXRlRmxhZ0JpdHMsIFZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhJbWFnZVZpZXdDcmVhdGVGbGFnQml0czo6ZUZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWNFWFQpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVZpZXdDcmVhdGVGbGFncyBvcGVyYXRvcnwoIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIGJpdDAsIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW1hZ2VWaWV3Q3JlYXRlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVZpZXdDcmVhdGVGbGFncyBvcGVyYXRvciYoIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIGJpdDAsIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW1hZ2VWaWV3Q3JlYXRlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVZpZXdDcmVhdGVGbGFncyBvcGVyYXRvcl4oIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIGJpdDAsIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW1hZ2VWaWV3Q3JlYXRlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVZpZXdDcmVhdGVGbGFncyBvcGVyYXRvcn4oIEltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggSW1hZ2VWaWV3Q3JlYXRlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBJbWFnZVZpZXdDcmVhdGVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgSW1hZ2VWaWV3Q3JlYXRlRmxhZ0JpdHM6OmVGcmFnbWVudERlbnNpdHlNYXBEeW5hbWljRVhUICkgcmVzdWx0ICs9ICJGcmFnbWVudERlbnNpdHlNYXBEeW5hbWljRVhUIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlgKKyAgeworICAgIGVVbm9yZGVyZWRTZXF1ZW5jZXMgPSBWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfVU5PUkRFUkVEX1NFUVVFTkNFU19CSVRfTlZYLAorICAgIGVTcGFyc2VTZXF1ZW5jZXMgPSBWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfU1BBUlNFX1NFUVVFTkNFU19CSVRfTlZYLAorICAgIGVFbXB0eUV4ZWN1dGlvbnMgPSBWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfRU1QVFlfRVhFQ1VUSU9OU19CSVRfTlZYLAorICAgIGVJbmRleGVkU2VxdWVuY2VzID0gVktfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX1VTQUdFX0lOREVYRURfU0VRVUVOQ0VTX0JJVF9OVlgKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYOjplVW5vcmRlcmVkU2VxdWVuY2VzIDogcmV0dXJuICJVbm9yZGVyZWRTZXF1ZW5jZXMiOworICAgICAgY2FzZSBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWDo6ZVNwYXJzZVNlcXVlbmNlcyA6IHJldHVybiAiU3BhcnNlU2VxdWVuY2VzIjsKKyAgICAgIGNhc2UgSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlg6OmVFbXB0eUV4ZWN1dGlvbnMgOiByZXR1cm4gIkVtcHR5RXhlY3V0aW9ucyI7CisgICAgICBjYXNlIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYOjplSW5kZXhlZFNlcXVlbmNlcyA6IHJldHVybiAiSW5kZXhlZFNlcXVlbmNlcyI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdzTlZYID0gRmxhZ3M8SW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlgsIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlg+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWDo6ZVVub3JkZXJlZFNlcXVlbmNlcykgfCBWa0ZsYWdzKEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYOjplU3BhcnNlU2VxdWVuY2VzKSB8IFZrRmxhZ3MoSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlg6OmVFbXB0eUV4ZWN1dGlvbnMpIHwgVmtGbGFncyhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWDo6ZUluZGV4ZWRTZXF1ZW5jZXMpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnc05WWCBvcGVyYXRvcnwoIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIGJpdDAsIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlgoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnc05WWCBvcGVyYXRvciYoIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIGJpdDAsIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlgoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnc05WWCBvcGVyYXRvcl4oIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIGJpdDAsIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlgoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnc05WWCBvcGVyYXRvcn4oIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlgoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnc05WWCB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlg6OmVVbm9yZGVyZWRTZXF1ZW5jZXMgKSByZXN1bHQgKz0gIlVub3JkZXJlZFNlcXVlbmNlcyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYOjplU3BhcnNlU2VxdWVuY2VzICkgcmVzdWx0ICs9ICJTcGFyc2VTZXF1ZW5jZXMgfCAiOworICAgIGlmICggdmFsdWUgJiBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWDo6ZUVtcHR5RXhlY3V0aW9ucyApIHJlc3VsdCArPSAiRW1wdHlFeGVjdXRpb25zIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlg6OmVJbmRleGVkU2VxdWVuY2VzICkgcmVzdWx0ICs9ICJJbmRleGVkU2VxdWVuY2VzIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgSW5zdGFuY2VDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIEluc3RhbmNlQ3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgSW5zdGFuY2VDcmVhdGVGbGFncyA9IEZsYWdzPEluc3RhbmNlQ3JlYXRlRmxhZ0JpdHMsIFZrSW5zdGFuY2VDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBJbnN0YW5jZUNyZWF0ZUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICBlbnVtIGNsYXNzIE1hY09TU3VyZmFjZUNyZWF0ZUZsYWdCaXRzTVZLCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggTWFjT1NTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNNVksgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgTWFjT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVksgPSBGbGFnczxNYWNPU1N1cmZhY2VDcmVhdGVGbGFnQml0c01WSywgVmtNYWNPU1N1cmZhY2VDcmVhdGVGbGFnc01WSz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBNYWNPU1N1cmZhY2VDcmVhdGVGbGFnc01WSyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9NQUNPU19NVksqLworCisgIGVudW0gY2xhc3MgTWVtb3J5QWxsb2NhdGVGbGFnQml0cworICB7CisgICAgZURldmljZU1hc2sgPSBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklULAorICAgIGVEZXZpY2VBZGRyZXNzS0hSID0gVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0JJVF9LSFIsCisgICAgZURldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5S0hSID0gVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIsCisgICAgZURldmljZU1hc2tLSFIgPSBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUX0tIUgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggTWVtb3J5QWxsb2NhdGVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzOjplRGV2aWNlTWFzayA6IHJldHVybiAiRGV2aWNlTWFzayI7CisgICAgICBjYXNlIE1lbW9yeUFsbG9jYXRlRmxhZ0JpdHM6OmVEZXZpY2VBZGRyZXNzS0hSIDogcmV0dXJuICJEZXZpY2VBZGRyZXNzS0hSIjsKKyAgICAgIGNhc2UgTWVtb3J5QWxsb2NhdGVGbGFnQml0czo6ZURldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5S0hSIDogcmV0dXJuICJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheUtIUiI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIE1lbW9yeUFsbG9jYXRlRmxhZ3MgPSBGbGFnczxNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzLCBWa01lbW9yeUFsbG9jYXRlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPE1lbW9yeUFsbG9jYXRlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKE1lbW9yeUFsbG9jYXRlRmxhZ0JpdHM6OmVEZXZpY2VNYXNrKSB8IFZrRmxhZ3MoTWVtb3J5QWxsb2NhdGVGbGFnQml0czo6ZURldmljZUFkZHJlc3NLSFIpIHwgVmtGbGFncyhNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzOjplRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXlLSFIpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBNZW1vcnlBbGxvY2F0ZUZsYWdzIG9wZXJhdG9yfCggTWVtb3J5QWxsb2NhdGVGbGFnQml0cyBiaXQwLCBNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gTWVtb3J5QWxsb2NhdGVGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE1lbW9yeUFsbG9jYXRlRmxhZ3Mgb3BlcmF0b3ImKCBNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIGJpdDAsIE1lbW9yeUFsbG9jYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBNZW1vcnlBbGxvY2F0ZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWVtb3J5QWxsb2NhdGVGbGFncyBvcGVyYXRvcl4oIE1lbW9yeUFsbG9jYXRlRmxhZ0JpdHMgYml0MCwgTWVtb3J5QWxsb2NhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIE1lbW9yeUFsbG9jYXRlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBNZW1vcnlBbGxvY2F0ZUZsYWdzIG9wZXJhdG9yfiggTWVtb3J5QWxsb2NhdGVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIE1lbW9yeUFsbG9jYXRlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgdXNpbmcgTWVtb3J5QWxsb2NhdGVGbGFnc0tIUiA9IE1lbW9yeUFsbG9jYXRlRmxhZ3M7CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBNZW1vcnlBbGxvY2F0ZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzOjplRGV2aWNlTWFzayApIHJlc3VsdCArPSAiRGV2aWNlTWFzayB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIE1lbW9yeUFsbG9jYXRlRmxhZ0JpdHM6OmVEZXZpY2VBZGRyZXNzS0hSICkgcmVzdWx0ICs9ICJEZXZpY2VBZGRyZXNzS0hSIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgTWVtb3J5QWxsb2NhdGVGbGFnQml0czo6ZURldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5S0hSICkgcmVzdWx0ICs9ICJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheUtIUiB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIE1lbW9yeUhlYXBGbGFnQml0cworICB7CisgICAgZURldmljZUxvY2FsID0gVktfTUVNT1JZX0hFQVBfREVWSUNFX0xPQ0FMX0JJVCwKKyAgICBlTXVsdGlJbnN0YW5jZSA9IFZLX01FTU9SWV9IRUFQX01VTFRJX0lOU1RBTkNFX0JJVCwKKyAgICBlTXVsdGlJbnN0YW5jZUtIUiA9IFZLX01FTU9SWV9IRUFQX01VTFRJX0lOU1RBTkNFX0JJVF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIE1lbW9yeUhlYXBGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBNZW1vcnlIZWFwRmxhZ0JpdHM6OmVEZXZpY2VMb2NhbCA6IHJldHVybiAiRGV2aWNlTG9jYWwiOworICAgICAgY2FzZSBNZW1vcnlIZWFwRmxhZ0JpdHM6OmVNdWx0aUluc3RhbmNlIDogcmV0dXJuICJNdWx0aUluc3RhbmNlIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgTWVtb3J5SGVhcEZsYWdzID0gRmxhZ3M8TWVtb3J5SGVhcEZsYWdCaXRzLCBWa01lbW9yeUhlYXBGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8TWVtb3J5SGVhcEZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhNZW1vcnlIZWFwRmxhZ0JpdHM6OmVEZXZpY2VMb2NhbCkgfCBWa0ZsYWdzKE1lbW9yeUhlYXBGbGFnQml0czo6ZU11bHRpSW5zdGFuY2UpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBNZW1vcnlIZWFwRmxhZ3Mgb3BlcmF0b3J8KCBNZW1vcnlIZWFwRmxhZ0JpdHMgYml0MCwgTWVtb3J5SGVhcEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gTWVtb3J5SGVhcEZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWVtb3J5SGVhcEZsYWdzIG9wZXJhdG9yJiggTWVtb3J5SGVhcEZsYWdCaXRzIGJpdDAsIE1lbW9yeUhlYXBGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIE1lbW9yeUhlYXBGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE1lbW9yeUhlYXBGbGFncyBvcGVyYXRvcl4oIE1lbW9yeUhlYXBGbGFnQml0cyBiaXQwLCBNZW1vcnlIZWFwRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBNZW1vcnlIZWFwRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBNZW1vcnlIZWFwRmxhZ3Mgb3BlcmF0b3J+KCBNZW1vcnlIZWFwRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBNZW1vcnlIZWFwRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBNZW1vcnlIZWFwRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIE1lbW9yeUhlYXBGbGFnQml0czo6ZURldmljZUxvY2FsICkgcmVzdWx0ICs9ICJEZXZpY2VMb2NhbCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIE1lbW9yeUhlYXBGbGFnQml0czo6ZU11bHRpSW5zdGFuY2UgKSByZXN1bHQgKz0gIk11bHRpSW5zdGFuY2UgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBNZW1vcnlNYXBGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIE1lbW9yeU1hcEZsYWdCaXRzICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIE1lbW9yeU1hcEZsYWdzID0gRmxhZ3M8TWVtb3J5TWFwRmxhZ0JpdHMsIFZrTWVtb3J5TWFwRmxhZ3M+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggTWVtb3J5TWFwRmxhZ3MgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisKKyAgZW51bSBjbGFzcyBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzCisgIHsKKyAgICBlRGV2aWNlTG9jYWwgPSBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCwKKyAgICBlSG9zdFZpc2libGUgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCwKKyAgICBlSG9zdENvaGVyZW50ID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklULAorICAgIGVIb3N0Q2FjaGVkID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ0FDSEVEX0JJVCwKKyAgICBlTGF6aWx5QWxsb2NhdGVkID0gVktfTUVNT1JZX1BST1BFUlRZX0xBWklMWV9BTExPQ0FURURfQklULAorICAgIGVQcm90ZWN0ZWQgPSBWS19NRU1PUllfUFJPUEVSVFlfUFJPVEVDVEVEX0JJVCwKKyAgICBlRGV2aWNlQ29oZXJlbnRBTUQgPSBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0NPSEVSRU5UX0JJVF9BTUQsCisgICAgZURldmljZVVuY2FjaGVkQU1EID0gVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9VTkNBQ0hFRF9CSVRfQU1ECisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVEZXZpY2VMb2NhbCA6IHJldHVybiAiRGV2aWNlTG9jYWwiOworICAgICAgY2FzZSBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplSG9zdFZpc2libGUgOiByZXR1cm4gIkhvc3RWaXNpYmxlIjsKKyAgICAgIGNhc2UgTWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZUhvc3RDb2hlcmVudCA6IHJldHVybiAiSG9zdENvaGVyZW50IjsKKyAgICAgIGNhc2UgTWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZUhvc3RDYWNoZWQgOiByZXR1cm4gIkhvc3RDYWNoZWQiOworICAgICAgY2FzZSBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplTGF6aWx5QWxsb2NhdGVkIDogcmV0dXJuICJMYXppbHlBbGxvY2F0ZWQiOworICAgICAgY2FzZSBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplUHJvdGVjdGVkIDogcmV0dXJuICJQcm90ZWN0ZWQiOworICAgICAgY2FzZSBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplRGV2aWNlQ29oZXJlbnRBTUQgOiByZXR1cm4gIkRldmljZUNvaGVyZW50QU1EIjsKKyAgICAgIGNhc2UgTWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZURldmljZVVuY2FjaGVkQU1EIDogcmV0dXJuICJEZXZpY2VVbmNhY2hlZEFNRCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIE1lbW9yeVByb3BlcnR5RmxhZ3MgPSBGbGFnczxNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzLCBWa01lbW9yeVByb3BlcnR5RmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVEZXZpY2VMb2NhbCkgfCBWa0ZsYWdzKE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVIb3N0VmlzaWJsZSkgfCBWa0ZsYWdzKE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVIb3N0Q29oZXJlbnQpIHwgVmtGbGFncyhNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplSG9zdENhY2hlZCkgfCBWa0ZsYWdzKE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVMYXppbHlBbGxvY2F0ZWQpIHwgVmtGbGFncyhNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplUHJvdGVjdGVkKSB8IFZrRmxhZ3MoTWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZURldmljZUNvaGVyZW50QU1EKSB8IFZrRmxhZ3MoTWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZURldmljZVVuY2FjaGVkQU1EKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWVtb3J5UHJvcGVydHlGbGFncyBvcGVyYXRvcnwoIE1lbW9yeVByb3BlcnR5RmxhZ0JpdHMgYml0MCwgTWVtb3J5UHJvcGVydHlGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIE1lbW9yeVByb3BlcnR5RmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBNZW1vcnlQcm9wZXJ0eUZsYWdzIG9wZXJhdG9yJiggTWVtb3J5UHJvcGVydHlGbGFnQml0cyBiaXQwLCBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gTWVtb3J5UHJvcGVydHlGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE1lbW9yeVByb3BlcnR5RmxhZ3Mgb3BlcmF0b3JeKCBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIGJpdDAsIE1lbW9yeVByb3BlcnR5RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBNZW1vcnlQcm9wZXJ0eUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWVtb3J5UHJvcGVydHlGbGFncyBvcGVyYXRvcn4oIE1lbW9yeVByb3BlcnR5RmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBNZW1vcnlQcm9wZXJ0eUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggTWVtb3J5UHJvcGVydHlGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgTWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZURldmljZUxvY2FsICkgcmVzdWx0ICs9ICJEZXZpY2VMb2NhbCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVIb3N0VmlzaWJsZSApIHJlc3VsdCArPSAiSG9zdFZpc2libGUgfCAiOworICAgIGlmICggdmFsdWUgJiBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplSG9zdENvaGVyZW50ICkgcmVzdWx0ICs9ICJIb3N0Q29oZXJlbnQgfCAiOworICAgIGlmICggdmFsdWUgJiBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplSG9zdENhY2hlZCApIHJlc3VsdCArPSAiSG9zdENhY2hlZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVMYXppbHlBbGxvY2F0ZWQgKSByZXN1bHQgKz0gIkxhemlseUFsbG9jYXRlZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVQcm90ZWN0ZWQgKSByZXN1bHQgKz0gIlByb3RlY3RlZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIE1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVEZXZpY2VDb2hlcmVudEFNRCApIHJlc3VsdCArPSAiRGV2aWNlQ29oZXJlbnRBTUQgfCAiOworICAgIGlmICggdmFsdWUgJiBNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplRGV2aWNlVW5jYWNoZWRBTUQgKSByZXN1bHQgKz0gIkRldmljZVVuY2FjaGVkQU1EIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICBlbnVtIGNsYXNzIE1ldGFsU3VyZmFjZUNyZWF0ZUZsYWdCaXRzRVhUCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggTWV0YWxTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNFWFQgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgTWV0YWxTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQgPSBGbGFnczxNZXRhbFN1cmZhY2VDcmVhdGVGbGFnQml0c0VYVCwgVmtNZXRhbFN1cmZhY2VDcmVhdGVGbGFnc0VYVD47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBNZXRhbFN1cmZhY2VDcmVhdGVGbGFnc0VYVCAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQqLworCisgIGVudW0gY2xhc3MgT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYCisgIHsKKyAgICBlR3JhcGhpY3MgPSBWS19PQkpFQ1RfRU5UUllfVVNBR0VfR1JBUEhJQ1NfQklUX05WWCwKKyAgICBlQ29tcHV0ZSA9IFZLX09CSkVDVF9FTlRSWV9VU0FHRV9DT01QVVRFX0JJVF9OVlgKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIE9iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlg6OmVHcmFwaGljcyA6IHJldHVybiAiR3JhcGhpY3MiOworICAgICAgY2FzZSBPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlg6OmVDb21wdXRlIDogcmV0dXJuICJDb21wdXRlIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYID0gRmxhZ3M8T2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYLCBWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWD47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8T2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlg6OmVHcmFwaGljcykgfCBWa0ZsYWdzKE9iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWDo6ZUNvbXB1dGUpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggb3BlcmF0b3J8KCBPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlggYml0MCwgT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIG9wZXJhdG9yJiggT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIGJpdDAsIE9iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIE9iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE9iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCBvcGVyYXRvcl4oIE9iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWCBiaXQwLCBPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlggYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggb3BlcmF0b3J+KCBPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlggYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIE9iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWDo6ZUdyYXBoaWNzICkgcmVzdWx0ICs9ICJHcmFwaGljcyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIE9iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWDo6ZUNvbXB1dGUgKSByZXN1bHQgKz0gIkNvbXB1dGUgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzCisgIHsKKyAgICBlQ29weVNyYyA9IFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9TUkNfQklULAorICAgIGVDb3B5RHN0ID0gVktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX0RTVF9CSVQsCisgICAgZUdlbmVyaWNTcmMgPSBWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfU1JDX0JJVCwKKyAgICBlR2VuZXJpY0RzdCA9IFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19EU1RfQklULAorICAgIGVDb3B5U3JjS0hSID0gVktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX1NSQ19CSVRfS0hSLAorICAgIGVDb3B5RHN0S0hSID0gVktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX0RTVF9CSVRfS0hSLAorICAgIGVHZW5lcmljU3JjS0hSID0gVktfUEVFUl9NRU1PUllfRkVBVFVSRV9HRU5FUklDX1NSQ19CSVRfS0hSLAorICAgIGVHZW5lcmljRHN0S0hSID0gVktfUEVFUl9NRU1PUllfRkVBVFVSRV9HRU5FUklDX0RTVF9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFBlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVDb3B5U3JjIDogcmV0dXJuICJDb3B5U3JjIjsKKyAgICAgIGNhc2UgUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0czo6ZUNvcHlEc3QgOiByZXR1cm4gIkNvcHlEc3QiOworICAgICAgY2FzZSBQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzOjplR2VuZXJpY1NyYyA6IHJldHVybiAiR2VuZXJpY1NyYyI7CisgICAgICBjYXNlIFBlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVHZW5lcmljRHN0IDogcmV0dXJuICJHZW5lcmljRHN0IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgUGVlck1lbW9yeUZlYXR1cmVGbGFncyA9IEZsYWdzPFBlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHMsIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8UGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0czo6ZUNvcHlTcmMpIHwgVmtGbGFncyhQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzOjplQ29weURzdCkgfCBWa0ZsYWdzKFBlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVHZW5lcmljU3JjKSB8IFZrRmxhZ3MoUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0czo6ZUdlbmVyaWNEc3QpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBQZWVyTWVtb3J5RmVhdHVyZUZsYWdzIG9wZXJhdG9yfCggUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXQwLCBQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUGVlck1lbW9yeUZlYXR1cmVGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBlZXJNZW1vcnlGZWF0dXJlRmxhZ3Mgb3BlcmF0b3ImKCBQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzIGJpdDAsIFBlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGVlck1lbW9yeUZlYXR1cmVGbGFncyBvcGVyYXRvcl4oIFBlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHMgYml0MCwgUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFBlZXJNZW1vcnlGZWF0dXJlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBQZWVyTWVtb3J5RmVhdHVyZUZsYWdzIG9wZXJhdG9yfiggUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFBlZXJNZW1vcnlGZWF0dXJlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgdXNpbmcgUGVlck1lbW9yeUZlYXR1cmVGbGFnc0tIUiA9IFBlZXJNZW1vcnlGZWF0dXJlRmxhZ3M7CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQZWVyTWVtb3J5RmVhdHVyZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzOjplQ29weVNyYyApIHJlc3VsdCArPSAiQ29weVNyYyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHM6OmVDb3B5RHN0ICkgcmVzdWx0ICs9ICJDb3B5RHN0IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0czo6ZUdlbmVyaWNTcmMgKSByZXN1bHQgKz0gIkdlbmVyaWNTcmMgfCAiOworICAgIGlmICggdmFsdWUgJiBQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzOjplR2VuZXJpY0RzdCApIHJlc3VsdCArPSAiR2VuZXJpY0RzdCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ0JpdHNLSFIKKyAgeworICAgIGVQZXJmb3JtYW5jZUltcGFjdGluZyA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fUEVSRk9STUFOQ0VfSU1QQUNUSU5HX0tIUiwKKyAgICBlQ29uY3VycmVudGx5SW1wYWN0ZWQgPSBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX0RFU0NSSVBUSU9OX0NPTkNVUlJFTlRMWV9JTVBBQ1RFRF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ0JpdHNLSFIgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUjo6ZVBlcmZvcm1hbmNlSW1wYWN0aW5nIDogcmV0dXJuICJQZXJmb3JtYW5jZUltcGFjdGluZyI7CisgICAgICBjYXNlIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ0JpdHNLSFI6OmVDb25jdXJyZW50bHlJbXBhY3RlZCA6IHJldHVybiAiQ29uY3VycmVudGx5SW1wYWN0ZWQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSID0gRmxhZ3M8UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUiwgVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSOjplUGVyZm9ybWFuY2VJbXBhY3RpbmcpIHwgVmtGbGFncyhQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSOjplQ29uY3VycmVudGx5SW1wYWN0ZWQpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSIG9wZXJhdG9yfCggUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUiBiaXQwLCBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnc0tIUiggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ3NLSFIgb3BlcmF0b3ImKCBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSIGJpdDAsIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ0JpdHNLSFIgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnc0tIUiBvcGVyYXRvcl4oIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ0JpdHNLSFIgYml0MCwgUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUiBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ3NLSFIoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSIG9wZXJhdG9yfiggUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUiBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ3NLSFIoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSOjplUGVyZm9ybWFuY2VJbXBhY3RpbmcgKSByZXN1bHQgKz0gIlBlcmZvcm1hbmNlSW1wYWN0aW5nIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUjo6ZUNvbmN1cnJlbnRseUltcGFjdGVkICkgcmVzdWx0ICs9ICJDb25jdXJyZW50bHlJbXBhY3RlZCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lQ2FjaGVDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lQ2FjaGVDcmVhdGVGbGFnQml0cyApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBQaXBlbGluZUNhY2hlQ3JlYXRlRmxhZ3MgPSBGbGFnczxQaXBlbGluZUNhY2hlQ3JlYXRlRmxhZ0JpdHMsIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUZsYWdzPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lQ2FjaGVDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlRmxhZ0JpdHMKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUZsYWdCaXRzICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIFBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlRmxhZ3MgPSBGbGFnczxQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUZsYWdCaXRzLCBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlRmxhZ3M+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lQ29tcGlsZXJDb250cm9sRmxhZ0JpdHNBTUQKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdCaXRzQU1EICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIFBpcGVsaW5lQ29tcGlsZXJDb250cm9sRmxhZ3NBTUQgPSBGbGFnczxQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdCaXRzQU1ELCBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sRmxhZ3NBTUQ+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVDb21waWxlckNvbnRyb2xGbGFnc0FNRCAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVGbGFnQml0c05WCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUZsYWdCaXRzTlYgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUZsYWdzTlYgPSBGbGFnczxQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlRmxhZ0JpdHNOViwgVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlRmxhZ3NOVj47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlRmxhZ3NOViAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUZsYWdCaXRzTlYKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVGbGFnQml0c05WICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUZsYWdzTlYgPSBGbGFnczxQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVGbGFnQml0c05WLCBWa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUZsYWdzTlY+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlRmxhZ3NOViAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVGbGFnQml0c05WCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUZsYWdCaXRzTlYgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUZsYWdzTlYgPSBGbGFnczxQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlRmxhZ0JpdHNOViwgVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlRmxhZ3NOVj47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlRmxhZ3NOViAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMKKyAgeworICAgIGVEaXNhYmxlT3B0aW1pemF0aW9uID0gVktfUElQRUxJTkVfQ1JFQVRFX0RJU0FCTEVfT1BUSU1JWkFUSU9OX0JJVCwKKyAgICBlQWxsb3dEZXJpdmF0aXZlcyA9IFZLX1BJUEVMSU5FX0NSRUFURV9BTExPV19ERVJJVkFUSVZFU19CSVQsCisgICAgZURlcml2YXRpdmUgPSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQsCisgICAgZVZpZXdJbmRleEZyb21EZXZpY2VJbmRleCA9IFZLX1BJUEVMSU5FX0NSRUFURV9WSUVXX0lOREVYX0ZST01fREVWSUNFX0lOREVYX0JJVCwKKyAgICBlRGlzcGF0Y2hCYXNlID0gVktfUElQRUxJTkVfQ1JFQVRFX0RJU1BBVENIX0JBU0VfQklULAorICAgIGVEZWZlckNvbXBpbGVOViA9IFZLX1BJUEVMSU5FX0NSRUFURV9ERUZFUl9DT01QSUxFX0JJVF9OViwKKyAgICBlQ2FwdHVyZVN0YXRpc3RpY3NLSFIgPSBWS19QSVBFTElORV9DUkVBVEVfQ0FQVFVSRV9TVEFUSVNUSUNTX0JJVF9LSFIsCisgICAgZUNhcHR1cmVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiA9IFZLX1BJUEVMSU5FX0NSRUFURV9DQVBUVVJFX0lOVEVSTkFMX1JFUFJFU0VOVEFUSU9OU19CSVRfS0hSLAorICAgIGVWaWV3SW5kZXhGcm9tRGV2aWNlSW5kZXhLSFIgPSBWS19QSVBFTElORV9DUkVBVEVfVklFV19JTkRFWF9GUk9NX0RFVklDRV9JTkRFWF9CSVRfS0hSLAorICAgIGVEaXNwYXRjaEJhc2VLSFIgPSBWS19QSVBFTElORV9DUkVBVEVfRElTUEFUQ0hfQkFTRV9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUGlwZWxpbmVDcmVhdGVGbGFnQml0czo6ZURpc2FibGVPcHRpbWl6YXRpb24gOiByZXR1cm4gIkRpc2FibGVPcHRpbWl6YXRpb24iOworICAgICAgY2FzZSBQaXBlbGluZUNyZWF0ZUZsYWdCaXRzOjplQWxsb3dEZXJpdmF0aXZlcyA6IHJldHVybiAiQWxsb3dEZXJpdmF0aXZlcyI7CisgICAgICBjYXNlIFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM6OmVEZXJpdmF0aXZlIDogcmV0dXJuICJEZXJpdmF0aXZlIjsKKyAgICAgIGNhc2UgUGlwZWxpbmVDcmVhdGVGbGFnQml0czo6ZVZpZXdJbmRleEZyb21EZXZpY2VJbmRleCA6IHJldHVybiAiVmlld0luZGV4RnJvbURldmljZUluZGV4IjsKKyAgICAgIGNhc2UgUGlwZWxpbmVDcmVhdGVGbGFnQml0czo6ZURpc3BhdGNoQmFzZSA6IHJldHVybiAiRGlzcGF0Y2hCYXNlIjsKKyAgICAgIGNhc2UgUGlwZWxpbmVDcmVhdGVGbGFnQml0czo6ZURlZmVyQ29tcGlsZU5WIDogcmV0dXJuICJEZWZlckNvbXBpbGVOViI7CisgICAgICBjYXNlIFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM6OmVDYXB0dXJlU3RhdGlzdGljc0tIUiA6IHJldHVybiAiQ2FwdHVyZVN0YXRpc3RpY3NLSFIiOworICAgICAgY2FzZSBQaXBlbGluZUNyZWF0ZUZsYWdCaXRzOjplQ2FwdHVyZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSIDogcmV0dXJuICJDYXB0dXJlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBQaXBlbGluZUNyZWF0ZUZsYWdzID0gRmxhZ3M8UGlwZWxpbmVDcmVhdGVGbGFnQml0cywgVmtQaXBlbGluZUNyZWF0ZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxQaXBlbGluZUNyZWF0ZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhQaXBlbGluZUNyZWF0ZUZsYWdCaXRzOjplRGlzYWJsZU9wdGltaXphdGlvbikgfCBWa0ZsYWdzKFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM6OmVBbGxvd0Rlcml2YXRpdmVzKSB8IFZrRmxhZ3MoUGlwZWxpbmVDcmVhdGVGbGFnQml0czo6ZURlcml2YXRpdmUpIHwgVmtGbGFncyhQaXBlbGluZUNyZWF0ZUZsYWdCaXRzOjplVmlld0luZGV4RnJvbURldmljZUluZGV4KSB8IFZrRmxhZ3MoUGlwZWxpbmVDcmVhdGVGbGFnQml0czo6ZURpc3BhdGNoQmFzZSkgfCBWa0ZsYWdzKFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM6OmVEZWZlckNvbXBpbGVOVikgfCBWa0ZsYWdzKFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM6OmVDYXB0dXJlU3RhdGlzdGljc0tIUikgfCBWa0ZsYWdzKFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM6OmVDYXB0dXJlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZUNyZWF0ZUZsYWdzIG9wZXJhdG9yfCggUGlwZWxpbmVDcmVhdGVGbGFnQml0cyBiaXQwLCBQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUGlwZWxpbmVDcmVhdGVGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lQ3JlYXRlRmxhZ3Mgb3BlcmF0b3ImKCBQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIGJpdDAsIFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBQaXBlbGluZUNyZWF0ZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVDcmVhdGVGbGFncyBvcGVyYXRvcl4oIFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMgYml0MCwgUGlwZWxpbmVDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFBpcGVsaW5lQ3JlYXRlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZUNyZWF0ZUZsYWdzIG9wZXJhdG9yfiggUGlwZWxpbmVDcmVhdGVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFBpcGVsaW5lQ3JlYXRlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUNyZWF0ZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZUNyZWF0ZUZsYWdCaXRzOjplRGlzYWJsZU9wdGltaXphdGlvbiApIHJlc3VsdCArPSAiRGlzYWJsZU9wdGltaXphdGlvbiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM6OmVBbGxvd0Rlcml2YXRpdmVzICkgcmVzdWx0ICs9ICJBbGxvd0Rlcml2YXRpdmVzIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVDcmVhdGVGbGFnQml0czo6ZURlcml2YXRpdmUgKSByZXN1bHQgKz0gIkRlcml2YXRpdmUgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZUNyZWF0ZUZsYWdCaXRzOjplVmlld0luZGV4RnJvbURldmljZUluZGV4ICkgcmVzdWx0ICs9ICJWaWV3SW5kZXhGcm9tRGV2aWNlSW5kZXggfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZUNyZWF0ZUZsYWdCaXRzOjplRGlzcGF0Y2hCYXNlICkgcmVzdWx0ICs9ICJEaXNwYXRjaEJhc2UgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZUNyZWF0ZUZsYWdCaXRzOjplRGVmZXJDb21waWxlTlYgKSByZXN1bHQgKz0gIkRlZmVyQ29tcGlsZU5WIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVDcmVhdGVGbGFnQml0czo6ZUNhcHR1cmVTdGF0aXN0aWNzS0hSICkgcmVzdWx0ICs9ICJDYXB0dXJlU3RhdGlzdGljc0tIUiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM6OmVDYXB0dXJlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgKSByZXN1bHQgKz0gIkNhcHR1cmVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdCaXRzRVhUCisgIHsKKyAgICBlVmFsaWQgPSBWS19QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19WQUxJRF9CSVRfRVhULAorICAgIGVBcHBsaWNhdGlvblBpcGVsaW5lQ2FjaGVIaXQgPSBWS19QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19BUFBMSUNBVElPTl9QSVBFTElORV9DQUNIRV9ISVRfQklUX0VYVCwKKyAgICBlQmFzZVBpcGVsaW5lQWNjZWxlcmF0aW9uID0gVktfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQkFTRV9QSVBFTElORV9BQ0NFTEVSQVRJT05fQklUX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQ6OmVWYWxpZCA6IHJldHVybiAiVmFsaWQiOworICAgICAgY2FzZSBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVDo6ZUFwcGxpY2F0aW9uUGlwZWxpbmVDYWNoZUhpdCA6IHJldHVybiAiQXBwbGljYXRpb25QaXBlbGluZUNhY2hlSGl0IjsKKyAgICAgIGNhc2UgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQ6OmVCYXNlUGlwZWxpbmVBY2NlbGVyYXRpb24gOiByZXR1cm4gIkJhc2VQaXBlbGluZUFjY2VsZXJhdGlvbiI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUID0gRmxhZ3M8UGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQsIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ3NFWFQ+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdCaXRzRVhUPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVDo6ZVZhbGlkKSB8IFZrRmxhZ3MoUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQ6OmVBcHBsaWNhdGlvblBpcGVsaW5lQ2FjaGVIaXQpIHwgVmtGbGFncyhQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVDo6ZUJhc2VQaXBlbGluZUFjY2VsZXJhdGlvbikKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUIG9wZXJhdG9yfCggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgYml0MCwgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnc0VYVCggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUIG9wZXJhdG9yJiggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgYml0MCwgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnc0VYVCggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUIG9wZXJhdG9yXiggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgYml0MCwgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnc0VYVCggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUIG9wZXJhdG9yfiggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnc0VYVCggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVDo6ZVZhbGlkICkgcmVzdWx0ICs9ICJWYWxpZCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdCaXRzRVhUOjplQXBwbGljYXRpb25QaXBlbGluZUNhY2hlSGl0ICkgcmVzdWx0ICs9ICJBcHBsaWNhdGlvblBpcGVsaW5lQ2FjaGVIaXQgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVDo6ZUJhc2VQaXBlbGluZUFjY2VsZXJhdGlvbiApIHJlc3VsdCArPSAiQmFzZVBpcGVsaW5lQWNjZWxlcmF0aW9uIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUZsYWdCaXRzCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUZsYWdCaXRzICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVGbGFncyA9IEZsYWdzPFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVGbGFnQml0cywgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlRmxhZ3M+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVGbGFnQml0c0VYVAorICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlRmxhZ0JpdHNFWFQgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVGbGFnc0VYVCA9IEZsYWdzPFBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlRmxhZ0JpdHNFWFQsIFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVGbGFnc0VYVD47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUZsYWdzRVhUICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVGbGFncyA9IEZsYWdzPFBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlRmxhZ0JpdHMsIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVGbGFncyA9IEZsYWdzPFBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlRmxhZ0JpdHMsIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVMYXlvdXRDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lTGF5b3V0Q3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVMYXlvdXRDcmVhdGVGbGFncyA9IEZsYWdzPFBpcGVsaW5lTGF5b3V0Q3JlYXRlRmxhZ0JpdHMsIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZUxheW91dENyZWF0ZUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlRmxhZ0JpdHMKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVGbGFnQml0cyApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVGbGFncyA9IEZsYWdzPFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUZsYWdCaXRzLCBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUZsYWdzPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVGbGFnQml0c0VYVAorICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlRmxhZ0JpdHNFWFQgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVGbGFnc0VYVCA9IEZsYWdzPFBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlRmxhZ0JpdHNFWFQsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVGbGFnc0VYVD47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUZsYWdzRVhUICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVGbGFnQml0c0VYVAorICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlRmxhZ0JpdHNFWFQgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVGbGFnc0VYVCA9IEZsYWdzPFBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlRmxhZ0JpdHNFWFQsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVGbGFnc0VYVD47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUZsYWdzRVhUICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVGbGFncyA9IEZsYWdzPFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlRmxhZ0JpdHMsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVGbGFnQml0c0VYVAorICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlRmxhZ0JpdHNFWFQgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVGbGFnc0VYVCA9IEZsYWdzPFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlRmxhZ0JpdHNFWFQsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVGbGFnc0VYVD47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUZsYWdzRVhUICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzCisgIHsKKyAgICBlQWxsb3dWYXJ5aW5nU3ViZ3JvdXBTaXplRVhUID0gVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9BTExPV19WQVJZSU5HX1NVQkdST1VQX1NJWkVfQklUX0VYVCwKKyAgICBlUmVxdWlyZUZ1bGxTdWJncm91cHNFWFQgPSBWS19QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX1JFUVVJUkVfRlVMTF9TVUJHUk9VUFNfQklUX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0czo6ZUFsbG93VmFyeWluZ1N1Ymdyb3VwU2l6ZUVYVCA6IHJldHVybiAiQWxsb3dWYXJ5aW5nU3ViZ3JvdXBTaXplRVhUIjsKKyAgICAgIGNhc2UgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzOjplUmVxdWlyZUZ1bGxTdWJncm91cHNFWFQgOiByZXR1cm4gIlJlcXVpcmVGdWxsU3ViZ3JvdXBzRVhUIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdzID0gRmxhZ3M8UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzLCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHM6OmVBbGxvd1ZhcnlpbmdTdWJncm91cFNpemVFWFQpIHwgVmtGbGFncyhQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHM6OmVSZXF1aXJlRnVsbFN1Ymdyb3Vwc0VYVCkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyBvcGVyYXRvcnwoIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyBiaXQwLCBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ3Mgb3BlcmF0b3ImKCBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMgYml0MCwgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdzIG9wZXJhdG9yXiggUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzIGJpdDAsIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyBvcGVyYXRvcn4oIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzOjplQWxsb3dWYXJ5aW5nU3ViZ3JvdXBTaXplRVhUICkgcmVzdWx0ICs9ICJBbGxvd1ZhcnlpbmdTdWJncm91cFNpemVFWFQgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHM6OmVSZXF1aXJlRnVsbFN1Ymdyb3Vwc0VYVCApIHJlc3VsdCArPSAiUmVxdWlyZUZ1bGxTdWJncm91cHNFWFQgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBQaXBlbGluZVN0YWdlRmxhZ0JpdHMKKyAgeworICAgIGVUb3BPZlBpcGUgPSBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsCisgICAgZURyYXdJbmRpcmVjdCA9IFZLX1BJUEVMSU5FX1NUQUdFX0RSQVdfSU5ESVJFQ1RfQklULAorICAgIGVWZXJ0ZXhJbnB1dCA9IFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9JTlBVVF9CSVQsCisgICAgZVZlcnRleFNoYWRlciA9IFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9TSEFERVJfQklULAorICAgIGVUZXNzZWxsYXRpb25Db250cm9sU2hhZGVyID0gVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCwKKyAgICBlVGVzc2VsbGF0aW9uRXZhbHVhdGlvblNoYWRlciA9IFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQsCisgICAgZUdlb21ldHJ5U2hhZGVyID0gVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCwKKyAgICBlRnJhZ21lbnRTaGFkZXIgPSBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklULAorICAgIGVFYXJseUZyYWdtZW50VGVzdHMgPSBWS19QSVBFTElORV9TVEFHRV9FQVJMWV9GUkFHTUVOVF9URVNUU19CSVQsCisgICAgZUxhdGVGcmFnbWVudFRlc3RzID0gVktfUElQRUxJTkVfU1RBR0VfTEFURV9GUkFHTUVOVF9URVNUU19CSVQsCisgICAgZUNvbG9yQXR0YWNobWVudE91dHB1dCA9IFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICBlQ29tcHV0ZVNoYWRlciA9IFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCwKKyAgICBlVHJhbnNmZXIgPSBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZFUl9CSVQsCisgICAgZUJvdHRvbU9mUGlwZSA9IFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCwKKyAgICBlSG9zdCA9IFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULAorICAgIGVBbGxHcmFwaGljcyA9IFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9HUkFQSElDU19CSVQsCisgICAgZUFsbENvbW1hbmRzID0gVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwKKyAgICBlVHJhbnNmb3JtRmVlZGJhY2tFWFQgPSBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQklUX0VYVCwKKyAgICBlQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgPSBWS19QSVBFTElORV9TVEFHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCwKKyAgICBlQ29tbWFuZFByb2Nlc3NOVlggPSBWS19QSVBFTElORV9TVEFHRV9DT01NQU5EX1BST0NFU1NfQklUX05WWCwKKyAgICBlU2hhZGluZ1JhdGVJbWFnZU5WID0gVktfUElQRUxJTkVfU1RBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OViwKKyAgICBlUmF5VHJhY2luZ1NoYWRlck5WID0gVktfUElQRUxJTkVfU1RBR0VfUkFZX1RSQUNJTkdfU0hBREVSX0JJVF9OViwKKyAgICBlQWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGROViA9IFZLX1BJUEVMSU5FX1NUQUdFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQlVJTERfQklUX05WLAorICAgIGVUYXNrU2hhZGVyTlYgPSBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYsCisgICAgZU1lc2hTaGFkZXJOViA9IFZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OViwKKyAgICBlRnJhZ21lbnREZW5zaXR5UHJvY2Vzc0VYVCA9IFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX0RFTlNJVFlfUFJPQ0VTU19CSVRfRVhUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZVN0YWdlRmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVG9wT2ZQaXBlIDogcmV0dXJuICJUb3BPZlBpcGUiOworICAgICAgY2FzZSBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVEcmF3SW5kaXJlY3QgOiByZXR1cm4gIkRyYXdJbmRpcmVjdCI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVZlcnRleElucHV0IDogcmV0dXJuICJWZXJ0ZXhJbnB1dCI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVZlcnRleFNoYWRlciA6IHJldHVybiAiVmVydGV4U2hhZGVyIjsKKyAgICAgIGNhc2UgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVGVzc2VsbGF0aW9uQ29udHJvbFNoYWRlciA6IHJldHVybiAiVGVzc2VsbGF0aW9uQ29udHJvbFNoYWRlciI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVRlc3NlbGxhdGlvbkV2YWx1YXRpb25TaGFkZXIgOiByZXR1cm4gIlRlc3NlbGxhdGlvbkV2YWx1YXRpb25TaGFkZXIiOworICAgICAgY2FzZSBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVHZW9tZXRyeVNoYWRlciA6IHJldHVybiAiR2VvbWV0cnlTaGFkZXIiOworICAgICAgY2FzZSBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVGcmFnbWVudFNoYWRlciA6IHJldHVybiAiRnJhZ21lbnRTaGFkZXIiOworICAgICAgY2FzZSBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVFYXJseUZyYWdtZW50VGVzdHMgOiByZXR1cm4gIkVhcmx5RnJhZ21lbnRUZXN0cyI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUxhdGVGcmFnbWVudFRlc3RzIDogcmV0dXJuICJMYXRlRnJhZ21lbnRUZXN0cyI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudE91dHB1dCA6IHJldHVybiAiQ29sb3JBdHRhY2htZW50T3V0cHV0IjsKKyAgICAgIGNhc2UgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQ29tcHV0ZVNoYWRlciA6IHJldHVybiAiQ29tcHV0ZVNoYWRlciI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVRyYW5zZmVyIDogcmV0dXJuICJUcmFuc2ZlciI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUJvdHRvbU9mUGlwZSA6IHJldHVybiAiQm90dG9tT2ZQaXBlIjsKKyAgICAgIGNhc2UgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplSG9zdCA6IHJldHVybiAiSG9zdCI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUFsbEdyYXBoaWNzIDogcmV0dXJuICJBbGxHcmFwaGljcyI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUFsbENvbW1hbmRzIDogcmV0dXJuICJBbGxDb21tYW5kcyI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVRyYW5zZm9ybUZlZWRiYWNrRVhUIDogcmV0dXJuICJUcmFuc2Zvcm1GZWVkYmFja0VYVCI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIDogcmV0dXJuICJDb25kaXRpb25hbFJlbmRlcmluZ0VYVCI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUNvbW1hbmRQcm9jZXNzTlZYIDogcmV0dXJuICJDb21tYW5kUHJvY2Vzc05WWCI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVNoYWRpbmdSYXRlSW1hZ2VOViA6IHJldHVybiAiU2hhZGluZ1JhdGVJbWFnZU5WIjsKKyAgICAgIGNhc2UgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplUmF5VHJhY2luZ1NoYWRlck5WIDogcmV0dXJuICJSYXlUcmFjaW5nU2hhZGVyTlYiOworICAgICAgY2FzZSBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVCdWlsZE5WIDogcmV0dXJuICJBY2NlbGVyYXRpb25TdHJ1Y3R1cmVCdWlsZE5WIjsKKyAgICAgIGNhc2UgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVGFza1NoYWRlck5WIDogcmV0dXJuICJUYXNrU2hhZGVyTlYiOworICAgICAgY2FzZSBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVNZXNoU2hhZGVyTlYgOiByZXR1cm4gIk1lc2hTaGFkZXJOViI7CisgICAgICBjYXNlIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUZyYWdtZW50RGVuc2l0eVByb2Nlc3NFWFQgOiByZXR1cm4gIkZyYWdtZW50RGVuc2l0eVByb2Nlc3NFWFQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBQaXBlbGluZVN0YWdlRmxhZ3MgPSBGbGFnczxQaXBlbGluZVN0YWdlRmxhZ0JpdHMsIFZrUGlwZWxpbmVTdGFnZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxQaXBlbGluZVN0YWdlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVRvcE9mUGlwZSkgfCBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZURyYXdJbmRpcmVjdCkgfCBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVZlcnRleElucHV0KSB8IFZrRmxhZ3MoUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVmVydGV4U2hhZGVyKSB8IFZrRmxhZ3MoUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVGVzc2VsbGF0aW9uQ29udHJvbFNoYWRlcikgfCBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVRlc3NlbGxhdGlvbkV2YWx1YXRpb25TaGFkZXIpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVHZW9tZXRyeVNoYWRlcikgfCBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUZyYWdtZW50U2hhZGVyKSB8IFZrRmxhZ3MoUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplRWFybHlGcmFnbWVudFRlc3RzKSB8IFZrRmxhZ3MoUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplTGF0ZUZyYWdtZW50VGVzdHMpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnRPdXRwdXQpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVDb21wdXRlU2hhZGVyKSB8IFZrRmxhZ3MoUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVHJhbnNmZXIpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVCb3R0b21PZlBpcGUpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVIb3N0KSB8IFZrRmxhZ3MoUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQWxsR3JhcGhpY3MpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVBbGxDb21tYW5kcykgfCBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVRyYW5zZm9ybUZlZWRiYWNrRVhUKSB8IFZrRmxhZ3MoUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVDb21tYW5kUHJvY2Vzc05WWCkgfCBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVNoYWRpbmdSYXRlSW1hZ2VOVikgfCBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVJheVRyYWNpbmdTaGFkZXJOVikgfCBWa0ZsYWdzKFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUFjY2VsZXJhdGlvblN0cnVjdHVyZUJ1aWxkTlYpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVUYXNrU2hhZGVyTlYpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVNZXNoU2hhZGVyTlYpIHwgVmtGbGFncyhQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVGcmFnbWVudERlbnNpdHlQcm9jZXNzRVhUKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVTdGFnZUZsYWdzIG9wZXJhdG9yfCggUGlwZWxpbmVTdGFnZUZsYWdCaXRzIGJpdDAsIFBpcGVsaW5lU3RhZ2VGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFBpcGVsaW5lU3RhZ2VGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lU3RhZ2VGbGFncyBvcGVyYXRvciYoIFBpcGVsaW5lU3RhZ2VGbGFnQml0cyBiaXQwLCBQaXBlbGluZVN0YWdlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBQaXBlbGluZVN0YWdlRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVN0YWdlRmxhZ3Mgb3BlcmF0b3JeKCBQaXBlbGluZVN0YWdlRmxhZ0JpdHMgYml0MCwgUGlwZWxpbmVTdGFnZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUGlwZWxpbmVTdGFnZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVTdGFnZUZsYWdzIG9wZXJhdG9yfiggUGlwZWxpbmVTdGFnZUZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggUGlwZWxpbmVTdGFnZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVTdGFnZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVUb3BPZlBpcGUgKSByZXN1bHQgKz0gIlRvcE9mUGlwZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZURyYXdJbmRpcmVjdCApIHJlc3VsdCArPSAiRHJhd0luZGlyZWN0IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVmVydGV4SW5wdXQgKSByZXN1bHQgKz0gIlZlcnRleElucHV0IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVmVydGV4U2hhZGVyICkgcmVzdWx0ICs9ICJWZXJ0ZXhTaGFkZXIgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVUZXNzZWxsYXRpb25Db250cm9sU2hhZGVyICkgcmVzdWx0ICs9ICJUZXNzZWxsYXRpb25Db250cm9sU2hhZGVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVGVzc2VsbGF0aW9uRXZhbHVhdGlvblNoYWRlciApIHJlc3VsdCArPSAiVGVzc2VsbGF0aW9uRXZhbHVhdGlvblNoYWRlciB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUdlb21ldHJ5U2hhZGVyICkgcmVzdWx0ICs9ICJHZW9tZXRyeVNoYWRlciB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUZyYWdtZW50U2hhZGVyICkgcmVzdWx0ICs9ICJGcmFnbWVudFNoYWRlciB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUVhcmx5RnJhZ21lbnRUZXN0cyApIHJlc3VsdCArPSAiRWFybHlGcmFnbWVudFRlc3RzIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplTGF0ZUZyYWdtZW50VGVzdHMgKSByZXN1bHQgKz0gIkxhdGVGcmFnbWVudFRlc3RzIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQ29sb3JBdHRhY2htZW50T3V0cHV0ICkgcmVzdWx0ICs9ICJDb2xvckF0dGFjaG1lbnRPdXRwdXQgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVDb21wdXRlU2hhZGVyICkgcmVzdWx0ICs9ICJDb21wdXRlU2hhZGVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVHJhbnNmZXIgKSByZXN1bHQgKz0gIlRyYW5zZmVyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQm90dG9tT2ZQaXBlICkgcmVzdWx0ICs9ICJCb3R0b21PZlBpcGUgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVIb3N0ICkgcmVzdWx0ICs9ICJIb3N0IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQWxsR3JhcGhpY3MgKSByZXN1bHQgKz0gIkFsbEdyYXBoaWNzIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQWxsQ29tbWFuZHMgKSByZXN1bHQgKz0gIkFsbENvbW1hbmRzIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVHJhbnNmb3JtRmVlZGJhY2tFWFQgKSByZXN1bHQgKz0gIlRyYW5zZm9ybUZlZWRiYWNrRVhUIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgKSByZXN1bHQgKz0gIkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQ29tbWFuZFByb2Nlc3NOVlggKSByZXN1bHQgKz0gIkNvbW1hbmRQcm9jZXNzTlZYIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplU2hhZGluZ1JhdGVJbWFnZU5WICkgcmVzdWx0ICs9ICJTaGFkaW5nUmF0ZUltYWdlTlYgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVSYXlUcmFjaW5nU2hhZGVyTlYgKSByZXN1bHQgKz0gIlJheVRyYWNpbmdTaGFkZXJOViB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUFjY2VsZXJhdGlvblN0cnVjdHVyZUJ1aWxkTlYgKSByZXN1bHQgKz0gIkFjY2VsZXJhdGlvblN0cnVjdHVyZUJ1aWxkTlYgfCAiOworICAgIGlmICggdmFsdWUgJiBQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVUYXNrU2hhZGVyTlYgKSByZXN1bHQgKz0gIlRhc2tTaGFkZXJOViB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZU1lc2hTaGFkZXJOViApIHJlc3VsdCArPSAiTWVzaFNoYWRlck5WIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplRnJhZ21lbnREZW5zaXR5UHJvY2Vzc0VYVCApIHJlc3VsdCArPSAiRnJhZ21lbnREZW5zaXR5UHJvY2Vzc0VYVCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVGbGFnQml0cyApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlRmxhZ3MgPSBGbGFnczxQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlRmxhZ0JpdHMsIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUZsYWdzPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUZsYWdCaXRzCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlRmxhZ3MgPSBGbGFnczxQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVGbGFnQml0cywgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUZsYWdCaXRzCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlRmxhZ3MgPSBGbGFnczxQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVGbGFnQml0cywgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVGbGFnQml0c05WCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUZsYWdCaXRzTlYgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUZsYWdzTlYgPSBGbGFnczxQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlRmxhZ0JpdHNOViwgVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlRmxhZ3NOVj47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlRmxhZ3NOViAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFF1ZXJ5Q29udHJvbEZsYWdCaXRzCisgIHsKKyAgICBlUHJlY2lzZSA9IFZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFF1ZXJ5Q29udHJvbEZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFF1ZXJ5Q29udHJvbEZsYWdCaXRzOjplUHJlY2lzZSA6IHJldHVybiAiUHJlY2lzZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIFF1ZXJ5Q29udHJvbEZsYWdzID0gRmxhZ3M8UXVlcnlDb250cm9sRmxhZ0JpdHMsIFZrUXVlcnlDb250cm9sRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPFF1ZXJ5Q29udHJvbEZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhRdWVyeUNvbnRyb2xGbGFnQml0czo6ZVByZWNpc2UpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeUNvbnRyb2xGbGFncyBvcGVyYXRvcnwoIFF1ZXJ5Q29udHJvbEZsYWdCaXRzIGJpdDAsIFF1ZXJ5Q29udHJvbEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUXVlcnlDb250cm9sRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeUNvbnRyb2xGbGFncyBvcGVyYXRvciYoIFF1ZXJ5Q29udHJvbEZsYWdCaXRzIGJpdDAsIFF1ZXJ5Q29udHJvbEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUXVlcnlDb250cm9sRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeUNvbnRyb2xGbGFncyBvcGVyYXRvcl4oIFF1ZXJ5Q29udHJvbEZsYWdCaXRzIGJpdDAsIFF1ZXJ5Q29udHJvbEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUXVlcnlDb250cm9sRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeUNvbnRyb2xGbGFncyBvcGVyYXRvcn4oIFF1ZXJ5Q29udHJvbEZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggUXVlcnlDb250cm9sRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBRdWVyeUNvbnRyb2xGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgUXVlcnlDb250cm9sRmxhZ0JpdHM6OmVQcmVjaXNlICkgcmVzdWx0ICs9ICJQcmVjaXNlIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzCisgIHsKKyAgICBlSW5wdXRBc3NlbWJseVZlcnRpY2VzID0gVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0lOUFVUX0FTU0VNQkxZX1ZFUlRJQ0VTX0JJVCwKKyAgICBlSW5wdXRBc3NlbWJseVByaW1pdGl2ZXMgPSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfSU5QVVRfQVNTRU1CTFlfUFJJTUlUSVZFU19CSVQsCisgICAgZVZlcnRleFNoYWRlckludm9jYXRpb25zID0gVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1ZFUlRFWF9TSEFERVJfSU5WT0NBVElPTlNfQklULAorICAgIGVHZW9tZXRyeVNoYWRlckludm9jYXRpb25zID0gVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQsCisgICAgZUdlb21ldHJ5U2hhZGVyUHJpbWl0aXZlcyA9IFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19HRU9NRVRSWV9TSEFERVJfUFJJTUlUSVZFU19CSVQsCisgICAgZUNsaXBwaW5nSW52b2NhdGlvbnMgPSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfQ0xJUFBJTkdfSU5WT0NBVElPTlNfQklULAorICAgIGVDbGlwcGluZ1ByaW1pdGl2ZXMgPSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfQ0xJUFBJTkdfUFJJTUlUSVZFU19CSVQsCisgICAgZUZyYWdtZW50U2hhZGVySW52b2NhdGlvbnMgPSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfRlJBR01FTlRfU0hBREVSX0lOVk9DQVRJT05TX0JJVCwKKyAgICBlVGVzc2VsbGF0aW9uQ29udHJvbFNoYWRlclBhdGNoZXMgPSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX1BBVENIRVNfQklULAorICAgIGVUZXNzZWxsYXRpb25FdmFsdWF0aW9uU2hhZGVySW52b2NhdGlvbnMgPSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0lOVk9DQVRJT05TX0JJVCwKKyAgICBlQ29tcHV0ZVNoYWRlckludm9jYXRpb25zID0gVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NPTVBVVEVfU0hBREVSX0lOVk9DQVRJT05TX0JJVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZUlucHV0QXNzZW1ibHlWZXJ0aWNlcyA6IHJldHVybiAiSW5wdXRBc3NlbWJseVZlcnRpY2VzIjsKKyAgICAgIGNhc2UgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplSW5wdXRBc3NlbWJseVByaW1pdGl2ZXMgOiByZXR1cm4gIklucHV0QXNzZW1ibHlQcmltaXRpdmVzIjsKKyAgICAgIGNhc2UgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplVmVydGV4U2hhZGVySW52b2NhdGlvbnMgOiByZXR1cm4gIlZlcnRleFNoYWRlckludm9jYXRpb25zIjsKKyAgICAgIGNhc2UgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplR2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucyA6IHJldHVybiAiR2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucyI7CisgICAgICBjYXNlIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZUdlb21ldHJ5U2hhZGVyUHJpbWl0aXZlcyA6IHJldHVybiAiR2VvbWV0cnlTaGFkZXJQcmltaXRpdmVzIjsKKyAgICAgIGNhc2UgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplQ2xpcHBpbmdJbnZvY2F0aW9ucyA6IHJldHVybiAiQ2xpcHBpbmdJbnZvY2F0aW9ucyI7CisgICAgICBjYXNlIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZUNsaXBwaW5nUHJpbWl0aXZlcyA6IHJldHVybiAiQ2xpcHBpbmdQcmltaXRpdmVzIjsKKyAgICAgIGNhc2UgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplRnJhZ21lbnRTaGFkZXJJbnZvY2F0aW9ucyA6IHJldHVybiAiRnJhZ21lbnRTaGFkZXJJbnZvY2F0aW9ucyI7CisgICAgICBjYXNlIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZVRlc3NlbGxhdGlvbkNvbnRyb2xTaGFkZXJQYXRjaGVzIDogcmV0dXJuICJUZXNzZWxsYXRpb25Db250cm9sU2hhZGVyUGF0Y2hlcyI7CisgICAgICBjYXNlIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZVRlc3NlbGxhdGlvbkV2YWx1YXRpb25TaGFkZXJJbnZvY2F0aW9ucyA6IHJldHVybiAiVGVzc2VsbGF0aW9uRXZhbHVhdGlvblNoYWRlckludm9jYXRpb25zIjsKKyAgICAgIGNhc2UgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplQ29tcHV0ZVNoYWRlckludm9jYXRpb25zIDogcmV0dXJuICJDb21wdXRlU2hhZGVySW52b2NhdGlvbnMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3MgPSBGbGFnczxRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHMsIFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZUlucHV0QXNzZW1ibHlWZXJ0aWNlcykgfCBWa0ZsYWdzKFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZUlucHV0QXNzZW1ibHlQcmltaXRpdmVzKSB8IFZrRmxhZ3MoUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplVmVydGV4U2hhZGVySW52b2NhdGlvbnMpIHwgVmtGbGFncyhRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM6OmVHZW9tZXRyeVNoYWRlckludm9jYXRpb25zKSB8IFZrRmxhZ3MoUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplR2VvbWV0cnlTaGFkZXJQcmltaXRpdmVzKSB8IFZrRmxhZ3MoUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplQ2xpcHBpbmdJbnZvY2F0aW9ucykgfCBWa0ZsYWdzKFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZUNsaXBwaW5nUHJpbWl0aXZlcykgfCBWa0ZsYWdzKFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZUZyYWdtZW50U2hhZGVySW52b2NhdGlvbnMpIHwgVmtGbGFncyhRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM6OmVUZXNzZWxsYXRpb25Db250cm9sU2hhZGVyUGF0Y2hlcykgfCBWa0ZsYWdzKFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZVRlc3NlbGxhdGlvbkV2YWx1YXRpb25TaGFkZXJJbnZvY2F0aW9ucykgfCBWa0ZsYWdzKFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czo6ZUNvbXB1dGVTaGFkZXJJbnZvY2F0aW9ucykKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyBvcGVyYXRvcnwoIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cyBiaXQwLCBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3Mgb3BlcmF0b3ImKCBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHMgYml0MCwgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzIG9wZXJhdG9yXiggUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzIGJpdDAsIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyBvcGVyYXRvcn4oIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplSW5wdXRBc3NlbWJseVZlcnRpY2VzICkgcmVzdWx0ICs9ICJJbnB1dEFzc2VtYmx5VmVydGljZXMgfCAiOworICAgIGlmICggdmFsdWUgJiBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM6OmVJbnB1dEFzc2VtYmx5UHJpbWl0aXZlcyApIHJlc3VsdCArPSAiSW5wdXRBc3NlbWJseVByaW1pdGl2ZXMgfCAiOworICAgIGlmICggdmFsdWUgJiBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM6OmVWZXJ0ZXhTaGFkZXJJbnZvY2F0aW9ucyApIHJlc3VsdCArPSAiVmVydGV4U2hhZGVySW52b2NhdGlvbnMgfCAiOworICAgIGlmICggdmFsdWUgJiBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM6OmVHZW9tZXRyeVNoYWRlckludm9jYXRpb25zICkgcmVzdWx0ICs9ICJHZW9tZXRyeVNoYWRlckludm9jYXRpb25zIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplR2VvbWV0cnlTaGFkZXJQcmltaXRpdmVzICkgcmVzdWx0ICs9ICJHZW9tZXRyeVNoYWRlclByaW1pdGl2ZXMgfCAiOworICAgIGlmICggdmFsdWUgJiBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM6OmVDbGlwcGluZ0ludm9jYXRpb25zICkgcmVzdWx0ICs9ICJDbGlwcGluZ0ludm9jYXRpb25zIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplQ2xpcHBpbmdQcmltaXRpdmVzICkgcmVzdWx0ICs9ICJDbGlwcGluZ1ByaW1pdGl2ZXMgfCAiOworICAgIGlmICggdmFsdWUgJiBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM6OmVGcmFnbWVudFNoYWRlckludm9jYXRpb25zICkgcmVzdWx0ICs9ICJGcmFnbWVudFNoYWRlckludm9jYXRpb25zIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplVGVzc2VsbGF0aW9uQ29udHJvbFNoYWRlclBhdGNoZXMgKSByZXN1bHQgKz0gIlRlc3NlbGxhdGlvbkNvbnRyb2xTaGFkZXJQYXRjaGVzIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOjplVGVzc2VsbGF0aW9uRXZhbHVhdGlvblNoYWRlckludm9jYXRpb25zICkgcmVzdWx0ICs9ICJUZXNzZWxsYXRpb25FdmFsdWF0aW9uU2hhZGVySW52b2NhdGlvbnMgfCAiOworICAgIGlmICggdmFsdWUgJiBRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM6OmVDb21wdXRlU2hhZGVySW52b2NhdGlvbnMgKSByZXN1bHQgKz0gIkNvbXB1dGVTaGFkZXJJbnZvY2F0aW9ucyB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFF1ZXJ5UG9vbENyZWF0ZUZsYWdCaXRzCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUXVlcnlQb29sQ3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgUXVlcnlQb29sQ3JlYXRlRmxhZ3MgPSBGbGFnczxRdWVyeVBvb2xDcmVhdGVGbGFnQml0cywgVmtRdWVyeVBvb2xDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBRdWVyeVBvb2xDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFF1ZXJ5UmVzdWx0RmxhZ0JpdHMKKyAgeworICAgIGU2NCA9IFZLX1FVRVJZX1JFU1VMVF82NF9CSVQsCisgICAgZVdhaXQgPSBWS19RVUVSWV9SRVNVTFRfV0FJVF9CSVQsCisgICAgZVdpdGhBdmFpbGFiaWxpdHkgPSBWS19RVUVSWV9SRVNVTFRfV0lUSF9BVkFJTEFCSUxJVFlfQklULAorICAgIGVQYXJ0aWFsID0gVktfUVVFUllfUkVTVUxUX1BBUlRJQUxfQklUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBRdWVyeVJlc3VsdEZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFF1ZXJ5UmVzdWx0RmxhZ0JpdHM6OmU2NCA6IHJldHVybiAiNjQiOworICAgICAgY2FzZSBRdWVyeVJlc3VsdEZsYWdCaXRzOjplV2FpdCA6IHJldHVybiAiV2FpdCI7CisgICAgICBjYXNlIFF1ZXJ5UmVzdWx0RmxhZ0JpdHM6OmVXaXRoQXZhaWxhYmlsaXR5IDogcmV0dXJuICJXaXRoQXZhaWxhYmlsaXR5IjsKKyAgICAgIGNhc2UgUXVlcnlSZXN1bHRGbGFnQml0czo6ZVBhcnRpYWwgOiByZXR1cm4gIlBhcnRpYWwiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBRdWVyeVJlc3VsdEZsYWdzID0gRmxhZ3M8UXVlcnlSZXN1bHRGbGFnQml0cywgVmtRdWVyeVJlc3VsdEZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxRdWVyeVJlc3VsdEZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhRdWVyeVJlc3VsdEZsYWdCaXRzOjplNjQpIHwgVmtGbGFncyhRdWVyeVJlc3VsdEZsYWdCaXRzOjplV2FpdCkgfCBWa0ZsYWdzKFF1ZXJ5UmVzdWx0RmxhZ0JpdHM6OmVXaXRoQXZhaWxhYmlsaXR5KSB8IFZrRmxhZ3MoUXVlcnlSZXN1bHRGbGFnQml0czo6ZVBhcnRpYWwpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeVJlc3VsdEZsYWdzIG9wZXJhdG9yfCggUXVlcnlSZXN1bHRGbGFnQml0cyBiaXQwLCBRdWVyeVJlc3VsdEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUXVlcnlSZXN1bHRGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFF1ZXJ5UmVzdWx0RmxhZ3Mgb3BlcmF0b3ImKCBRdWVyeVJlc3VsdEZsYWdCaXRzIGJpdDAsIFF1ZXJ5UmVzdWx0RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBRdWVyeVJlc3VsdEZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUXVlcnlSZXN1bHRGbGFncyBvcGVyYXRvcl4oIFF1ZXJ5UmVzdWx0RmxhZ0JpdHMgYml0MCwgUXVlcnlSZXN1bHRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFF1ZXJ5UmVzdWx0RmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeVJlc3VsdEZsYWdzIG9wZXJhdG9yfiggUXVlcnlSZXN1bHRGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFF1ZXJ5UmVzdWx0RmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBRdWVyeVJlc3VsdEZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBRdWVyeVJlc3VsdEZsYWdCaXRzOjplNjQgKSByZXN1bHQgKz0gIjY0IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUXVlcnlSZXN1bHRGbGFnQml0czo6ZVdhaXQgKSByZXN1bHQgKz0gIldhaXQgfCAiOworICAgIGlmICggdmFsdWUgJiBRdWVyeVJlc3VsdEZsYWdCaXRzOjplV2l0aEF2YWlsYWJpbGl0eSApIHJlc3VsdCArPSAiV2l0aEF2YWlsYWJpbGl0eSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFF1ZXJ5UmVzdWx0RmxhZ0JpdHM6OmVQYXJ0aWFsICkgcmVzdWx0ICs9ICJQYXJ0aWFsIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUXVldWVGbGFnQml0cworICB7CisgICAgZUdyYXBoaWNzID0gVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgIGVDb21wdXRlID0gVktfUVVFVUVfQ09NUFVURV9CSVQsCisgICAgZVRyYW5zZmVyID0gVktfUVVFVUVfVFJBTlNGRVJfQklULAorICAgIGVTcGFyc2VCaW5kaW5nID0gVktfUVVFVUVfU1BBUlNFX0JJTkRJTkdfQklULAorICAgIGVQcm90ZWN0ZWQgPSBWS19RVUVVRV9QUk9URUNURURfQklUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBRdWV1ZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFF1ZXVlRmxhZ0JpdHM6OmVHcmFwaGljcyA6IHJldHVybiAiR3JhcGhpY3MiOworICAgICAgY2FzZSBRdWV1ZUZsYWdCaXRzOjplQ29tcHV0ZSA6IHJldHVybiAiQ29tcHV0ZSI7CisgICAgICBjYXNlIFF1ZXVlRmxhZ0JpdHM6OmVUcmFuc2ZlciA6IHJldHVybiAiVHJhbnNmZXIiOworICAgICAgY2FzZSBRdWV1ZUZsYWdCaXRzOjplU3BhcnNlQmluZGluZyA6IHJldHVybiAiU3BhcnNlQmluZGluZyI7CisgICAgICBjYXNlIFF1ZXVlRmxhZ0JpdHM6OmVQcm90ZWN0ZWQgOiByZXR1cm4gIlByb3RlY3RlZCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIFF1ZXVlRmxhZ3MgPSBGbGFnczxRdWV1ZUZsYWdCaXRzLCBWa1F1ZXVlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPFF1ZXVlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFF1ZXVlRmxhZ0JpdHM6OmVHcmFwaGljcykgfCBWa0ZsYWdzKFF1ZXVlRmxhZ0JpdHM6OmVDb21wdXRlKSB8IFZrRmxhZ3MoUXVldWVGbGFnQml0czo6ZVRyYW5zZmVyKSB8IFZrRmxhZ3MoUXVldWVGbGFnQml0czo6ZVNwYXJzZUJpbmRpbmcpIHwgVmtGbGFncyhRdWV1ZUZsYWdCaXRzOjplUHJvdGVjdGVkKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUXVldWVGbGFncyBvcGVyYXRvcnwoIFF1ZXVlRmxhZ0JpdHMgYml0MCwgUXVldWVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFF1ZXVlRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWV1ZUZsYWdzIG9wZXJhdG9yJiggUXVldWVGbGFnQml0cyBiaXQwLCBRdWV1ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUXVldWVGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFF1ZXVlRmxhZ3Mgb3BlcmF0b3JeKCBRdWV1ZUZsYWdCaXRzIGJpdDAsIFF1ZXVlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBRdWV1ZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUXVldWVGbGFncyBvcGVyYXRvcn4oIFF1ZXVlRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBRdWV1ZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUXVldWVGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgUXVldWVGbGFnQml0czo6ZUdyYXBoaWNzICkgcmVzdWx0ICs9ICJHcmFwaGljcyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFF1ZXVlRmxhZ0JpdHM6OmVDb21wdXRlICkgcmVzdWx0ICs9ICJDb21wdXRlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUXVldWVGbGFnQml0czo6ZVRyYW5zZmVyICkgcmVzdWx0ICs9ICJUcmFuc2ZlciB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFF1ZXVlRmxhZ0JpdHM6OmVTcGFyc2VCaW5kaW5nICkgcmVzdWx0ICs9ICJTcGFyc2VCaW5kaW5nIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgUXVldWVGbGFnQml0czo6ZVByb3RlY3RlZCApIHJlc3VsdCArPSAiUHJvdGVjdGVkIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUmVuZGVyUGFzc0NyZWF0ZUZsYWdCaXRzCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUmVuZGVyUGFzc0NyZWF0ZUZsYWdCaXRzICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIFJlbmRlclBhc3NDcmVhdGVGbGFncyA9IEZsYWdzPFJlbmRlclBhc3NDcmVhdGVGbGFnQml0cywgVmtSZW5kZXJQYXNzQ3JlYXRlRmxhZ3M+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUmVuZGVyUGFzc0NyZWF0ZUZsYWdzICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgUmVzb2x2ZU1vZGVGbGFnQml0c0tIUgorICB7CisgICAgZU5vbmUgPSBWS19SRVNPTFZFX01PREVfTk9ORV9LSFIsCisgICAgZVNhbXBsZVplcm8gPSBWS19SRVNPTFZFX01PREVfU0FNUExFX1pFUk9fQklUX0tIUiwKKyAgICBlQXZlcmFnZSA9IFZLX1JFU09MVkVfTU9ERV9BVkVSQUdFX0JJVF9LSFIsCisgICAgZU1pbiA9IFZLX1JFU09MVkVfTU9ERV9NSU5fQklUX0tIUiwKKyAgICBlTWF4ID0gVktfUkVTT0xWRV9NT0RFX01BWF9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFJlc29sdmVNb2RlRmxhZ0JpdHNLSFI6OmVOb25lIDogcmV0dXJuICJOb25lIjsKKyAgICAgIGNhc2UgUmVzb2x2ZU1vZGVGbGFnQml0c0tIUjo6ZVNhbXBsZVplcm8gOiByZXR1cm4gIlNhbXBsZVplcm8iOworICAgICAgY2FzZSBSZXNvbHZlTW9kZUZsYWdCaXRzS0hSOjplQXZlcmFnZSA6IHJldHVybiAiQXZlcmFnZSI7CisgICAgICBjYXNlIFJlc29sdmVNb2RlRmxhZ0JpdHNLSFI6OmVNaW4gOiByZXR1cm4gIk1pbiI7CisgICAgICBjYXNlIFJlc29sdmVNb2RlRmxhZ0JpdHNLSFI6OmVNYXggOiByZXR1cm4gIk1heCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIFJlc29sdmVNb2RlRmxhZ3NLSFIgPSBGbGFnczxSZXNvbHZlTW9kZUZsYWdCaXRzS0hSLCBWa1Jlc29sdmVNb2RlRmxhZ3NLSFI+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPFJlc29sdmVNb2RlRmxhZ0JpdHNLSFI+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFJlc29sdmVNb2RlRmxhZ0JpdHNLSFI6OmVOb25lKSB8IFZrRmxhZ3MoUmVzb2x2ZU1vZGVGbGFnQml0c0tIUjo6ZVNhbXBsZVplcm8pIHwgVmtGbGFncyhSZXNvbHZlTW9kZUZsYWdCaXRzS0hSOjplQXZlcmFnZSkgfCBWa0ZsYWdzKFJlc29sdmVNb2RlRmxhZ0JpdHNLSFI6OmVNaW4pIHwgVmtGbGFncyhSZXNvbHZlTW9kZUZsYWdCaXRzS0hSOjplTWF4KQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUmVzb2x2ZU1vZGVGbGFnc0tIUiBvcGVyYXRvcnwoIFJlc29sdmVNb2RlRmxhZ0JpdHNLSFIgYml0MCwgUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFJlc29sdmVNb2RlRmxhZ3NLSFIoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBSZXNvbHZlTW9kZUZsYWdzS0hSIG9wZXJhdG9yJiggUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiBiaXQwLCBSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gUmVzb2x2ZU1vZGVGbGFnc0tIUiggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFJlc29sdmVNb2RlRmxhZ3NLSFIgb3BlcmF0b3JeKCBSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIGJpdDAsIFJlc29sdmVNb2RlRmxhZ0JpdHNLSFIgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBSZXNvbHZlTW9kZUZsYWdzS0hSKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgUmVzb2x2ZU1vZGVGbGFnc0tIUiBvcGVyYXRvcn4oIFJlc29sdmVNb2RlRmxhZ0JpdHNLSFIgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBSZXNvbHZlTW9kZUZsYWdzS0hSKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggUmVzb2x2ZU1vZGVGbGFnc0tIUiB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgUmVzb2x2ZU1vZGVGbGFnQml0c0tIUjo6ZVNhbXBsZVplcm8gKSByZXN1bHQgKz0gIlNhbXBsZVplcm8gfCAiOworICAgIGlmICggdmFsdWUgJiBSZXNvbHZlTW9kZUZsYWdCaXRzS0hSOjplQXZlcmFnZSApIHJlc3VsdCArPSAiQXZlcmFnZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFJlc29sdmVNb2RlRmxhZ0JpdHNLSFI6OmVNaW4gKSByZXN1bHQgKz0gIk1pbiB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFJlc29sdmVNb2RlRmxhZ0JpdHNLSFI6OmVNYXggKSByZXN1bHQgKz0gIk1heCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFNhbXBsZUNvdW50RmxhZ0JpdHMKKyAgeworICAgIGUxID0gVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgIGUyID0gVktfU0FNUExFX0NPVU5UXzJfQklULAorICAgIGU0ID0gVktfU0FNUExFX0NPVU5UXzRfQklULAorICAgIGU4ID0gVktfU0FNUExFX0NPVU5UXzhfQklULAorICAgIGUxNiA9IFZLX1NBTVBMRV9DT1VOVF8xNl9CSVQsCisgICAgZTMyID0gVktfU0FNUExFX0NPVU5UXzMyX0JJVCwKKyAgICBlNjQgPSBWS19TQU1QTEVfQ09VTlRfNjRfQklUCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTYW1wbGVDb3VudEZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFNhbXBsZUNvdW50RmxhZ0JpdHM6OmUxIDogcmV0dXJuICIxIjsKKyAgICAgIGNhc2UgU2FtcGxlQ291bnRGbGFnQml0czo6ZTIgOiByZXR1cm4gIjIiOworICAgICAgY2FzZSBTYW1wbGVDb3VudEZsYWdCaXRzOjplNCA6IHJldHVybiAiNCI7CisgICAgICBjYXNlIFNhbXBsZUNvdW50RmxhZ0JpdHM6OmU4IDogcmV0dXJuICI4IjsKKyAgICAgIGNhc2UgU2FtcGxlQ291bnRGbGFnQml0czo6ZTE2IDogcmV0dXJuICIxNiI7CisgICAgICBjYXNlIFNhbXBsZUNvdW50RmxhZ0JpdHM6OmUzMiA6IHJldHVybiAiMzIiOworICAgICAgY2FzZSBTYW1wbGVDb3VudEZsYWdCaXRzOjplNjQgOiByZXR1cm4gIjY0IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgU2FtcGxlQ291bnRGbGFncyA9IEZsYWdzPFNhbXBsZUNvdW50RmxhZ0JpdHMsIFZrU2FtcGxlQ291bnRGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8U2FtcGxlQ291bnRGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoU2FtcGxlQ291bnRGbGFnQml0czo6ZTEpIHwgVmtGbGFncyhTYW1wbGVDb3VudEZsYWdCaXRzOjplMikgfCBWa0ZsYWdzKFNhbXBsZUNvdW50RmxhZ0JpdHM6OmU0KSB8IFZrRmxhZ3MoU2FtcGxlQ291bnRGbGFnQml0czo6ZTgpIHwgVmtGbGFncyhTYW1wbGVDb3VudEZsYWdCaXRzOjplMTYpIHwgVmtGbGFncyhTYW1wbGVDb3VudEZsYWdCaXRzOjplMzIpIHwgVmtGbGFncyhTYW1wbGVDb3VudEZsYWdCaXRzOjplNjQpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTYW1wbGVDb3VudEZsYWdzIG9wZXJhdG9yfCggU2FtcGxlQ291bnRGbGFnQml0cyBiaXQwLCBTYW1wbGVDb3VudEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU2FtcGxlQ291bnRGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNhbXBsZUNvdW50RmxhZ3Mgb3BlcmF0b3ImKCBTYW1wbGVDb3VudEZsYWdCaXRzIGJpdDAsIFNhbXBsZUNvdW50RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTYW1wbGVDb3VudEZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2FtcGxlQ291bnRGbGFncyBvcGVyYXRvcl4oIFNhbXBsZUNvdW50RmxhZ0JpdHMgYml0MCwgU2FtcGxlQ291bnRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNhbXBsZUNvdW50RmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTYW1wbGVDb3VudEZsYWdzIG9wZXJhdG9yfiggU2FtcGxlQ291bnRGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFNhbXBsZUNvdW50RmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTYW1wbGVDb3VudEZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBTYW1wbGVDb3VudEZsYWdCaXRzOjplMSApIHJlc3VsdCArPSAiMSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFNhbXBsZUNvdW50RmxhZ0JpdHM6OmUyICkgcmVzdWx0ICs9ICIyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU2FtcGxlQ291bnRGbGFnQml0czo6ZTQgKSByZXN1bHQgKz0gIjQgfCAiOworICAgIGlmICggdmFsdWUgJiBTYW1wbGVDb3VudEZsYWdCaXRzOjplOCApIHJlc3VsdCArPSAiOCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFNhbXBsZUNvdW50RmxhZ0JpdHM6OmUxNiApIHJlc3VsdCArPSAiMTYgfCAiOworICAgIGlmICggdmFsdWUgJiBTYW1wbGVDb3VudEZsYWdCaXRzOjplMzIgKSByZXN1bHQgKz0gIjMyIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU2FtcGxlQ291bnRGbGFnQml0czo6ZTY0ICkgcmVzdWx0ICs9ICI2NCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFNhbXBsZXJDcmVhdGVGbGFnQml0cworICB7CisgICAgZVN1YnNhbXBsZWRFWFQgPSBWS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQsCisgICAgZVN1YnNhbXBsZWRDb2Fyc2VSZWNvbnN0cnVjdGlvbkVYVCA9IFZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQ09BUlNFX1JFQ09OU1RSVUNUSU9OX0JJVF9FWFQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFNhbXBsZXJDcmVhdGVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTYW1wbGVyQ3JlYXRlRmxhZ0JpdHM6OmVTdWJzYW1wbGVkRVhUIDogcmV0dXJuICJTdWJzYW1wbGVkRVhUIjsKKyAgICAgIGNhc2UgU2FtcGxlckNyZWF0ZUZsYWdCaXRzOjplU3Vic2FtcGxlZENvYXJzZVJlY29uc3RydWN0aW9uRVhUIDogcmV0dXJuICJTdWJzYW1wbGVkQ29hcnNlUmVjb25zdHJ1Y3Rpb25FWFQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBTYW1wbGVyQ3JlYXRlRmxhZ3MgPSBGbGFnczxTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMsIFZrU2FtcGxlckNyZWF0ZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxTYW1wbGVyQ3JlYXRlRmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFNhbXBsZXJDcmVhdGVGbGFnQml0czo6ZVN1YnNhbXBsZWRFWFQpIHwgVmtGbGFncyhTYW1wbGVyQ3JlYXRlRmxhZ0JpdHM6OmVTdWJzYW1wbGVkQ29hcnNlUmVjb25zdHJ1Y3Rpb25FWFQpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTYW1wbGVyQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J8KCBTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMgYml0MCwgU2FtcGxlckNyZWF0ZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU2FtcGxlckNyZWF0ZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2FtcGxlckNyZWF0ZUZsYWdzIG9wZXJhdG9yJiggU2FtcGxlckNyZWF0ZUZsYWdCaXRzIGJpdDAsIFNhbXBsZXJDcmVhdGVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNhbXBsZXJDcmVhdGVGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNhbXBsZXJDcmVhdGVGbGFncyBvcGVyYXRvcl4oIFNhbXBsZXJDcmVhdGVGbGFnQml0cyBiaXQwLCBTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTYW1wbGVyQ3JlYXRlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTYW1wbGVyQ3JlYXRlRmxhZ3Mgb3BlcmF0b3J+KCBTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBTYW1wbGVyQ3JlYXRlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTYW1wbGVyQ3JlYXRlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIFNhbXBsZXJDcmVhdGVGbGFnQml0czo6ZVN1YnNhbXBsZWRFWFQgKSByZXN1bHQgKz0gIlN1YnNhbXBsZWRFWFQgfCAiOworICAgIGlmICggdmFsdWUgJiBTYW1wbGVyQ3JlYXRlRmxhZ0JpdHM6OmVTdWJzYW1wbGVkQ29hcnNlUmVjb25zdHJ1Y3Rpb25FWFQgKSByZXN1bHQgKz0gIlN1YnNhbXBsZWRDb2Fyc2VSZWNvbnN0cnVjdGlvbkVYVCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFNlbWFwaG9yZUNyZWF0ZUZsYWdCaXRzCisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2VtYXBob3JlQ3JlYXRlRmxhZ0JpdHMgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgU2VtYXBob3JlQ3JlYXRlRmxhZ3MgPSBGbGFnczxTZW1hcGhvcmVDcmVhdGVGbGFnQml0cywgVmtTZW1hcGhvcmVDcmVhdGVGbGFncz47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTZW1hcGhvcmVDcmVhdGVGbGFncyAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKworICBlbnVtIGNsYXNzIFNlbWFwaG9yZUltcG9ydEZsYWdCaXRzCisgIHsKKyAgICBlVGVtcG9yYXJ5ID0gVktfU0VNQVBIT1JFX0lNUE9SVF9URU1QT1JBUllfQklULAorICAgIGVUZW1wb3JhcnlLSFIgPSBWS19TRU1BUEhPUkVfSU1QT1JUX1RFTVBPUkFSWV9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTZW1hcGhvcmVJbXBvcnRGbGFnQml0czo6ZVRlbXBvcmFyeSA6IHJldHVybiAiVGVtcG9yYXJ5IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgU2VtYXBob3JlSW1wb3J0RmxhZ3MgPSBGbGFnczxTZW1hcGhvcmVJbXBvcnRGbGFnQml0cywgVmtTZW1hcGhvcmVJbXBvcnRGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8U2VtYXBob3JlSW1wb3J0RmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFNlbWFwaG9yZUltcG9ydEZsYWdCaXRzOjplVGVtcG9yYXJ5KQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlSW1wb3J0RmxhZ3Mgb3BlcmF0b3J8KCBTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyBiaXQwLCBTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNlbWFwaG9yZUltcG9ydEZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlSW1wb3J0RmxhZ3Mgb3BlcmF0b3ImKCBTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyBiaXQwLCBTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNlbWFwaG9yZUltcG9ydEZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlSW1wb3J0RmxhZ3Mgb3BlcmF0b3JeKCBTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyBiaXQwLCBTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNlbWFwaG9yZUltcG9ydEZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlSW1wb3J0RmxhZ3Mgb3BlcmF0b3J+KCBTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFNlbWFwaG9yZUltcG9ydEZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIHVzaW5nIFNlbWFwaG9yZUltcG9ydEZsYWdzS0hSID0gU2VtYXBob3JlSW1wb3J0RmxhZ3M7CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTZW1hcGhvcmVJbXBvcnRGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHM6OmVUZW1wb3JhcnkgKSByZXN1bHQgKz0gIlRlbXBvcmFyeSB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFNlbWFwaG9yZVdhaXRGbGFnQml0c0tIUgorICB7CisgICAgZUFueSA9IFZLX1NFTUFQSE9SRV9XQUlUX0FOWV9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSOjplQW55IDogcmV0dXJuICJBbnkiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBTZW1hcGhvcmVXYWl0RmxhZ3NLSFIgPSBGbGFnczxTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIsIFZrU2VtYXBob3JlV2FpdEZsYWdzS0hSPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFI+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFNlbWFwaG9yZVdhaXRGbGFnQml0c0tIUjo6ZUFueSkKKyAgICB9OworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNlbWFwaG9yZVdhaXRGbGFnc0tIUiBvcGVyYXRvcnwoIFNlbWFwaG9yZVdhaXRGbGFnQml0c0tIUiBiaXQwLCBTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTZW1hcGhvcmVXYWl0RmxhZ3NLSFIoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTZW1hcGhvcmVXYWl0RmxhZ3NLSFIgb3BlcmF0b3ImKCBTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIgYml0MCwgU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU2VtYXBob3JlV2FpdEZsYWdzS0hSKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlV2FpdEZsYWdzS0hSIG9wZXJhdG9yXiggU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSIGJpdDAsIFNlbWFwaG9yZVdhaXRGbGFnQml0c0tIUiBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNlbWFwaG9yZVdhaXRGbGFnc0tIUiggYml0MCApIF4gYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNlbWFwaG9yZVdhaXRGbGFnc0tIUiBvcGVyYXRvcn4oIFNlbWFwaG9yZVdhaXRGbGFnQml0c0tIUiBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFNlbWFwaG9yZVdhaXRGbGFnc0tIUiggYml0cyApICk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFNlbWFwaG9yZVdhaXRGbGFnc0tIUiB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSOjplQW55ICkgcmVzdWx0ICs9ICJBbnkgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBTaGFkZXJDb3JlUHJvcGVydGllc0ZsYWdCaXRzQU1ECisgIHt9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2hhZGVyQ29yZVByb3BlcnRpZXNGbGFnQml0c0FNRCApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBTaGFkZXJDb3JlUHJvcGVydGllc0ZsYWdzQU1EID0gRmxhZ3M8U2hhZGVyQ29yZVByb3BlcnRpZXNGbGFnQml0c0FNRCwgVmtTaGFkZXJDb3JlUHJvcGVydGllc0ZsYWdzQU1EPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFNoYWRlckNvcmVQcm9wZXJ0aWVzRmxhZ3NBTUQgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisKKyAgZW51bSBjbGFzcyBTaGFkZXJNb2R1bGVDcmVhdGVGbGFnQml0cworICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFNoYWRlck1vZHVsZUNyZWF0ZUZsYWdCaXRzICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIFNoYWRlck1vZHVsZUNyZWF0ZUZsYWdzID0gRmxhZ3M8U2hhZGVyTW9kdWxlQ3JlYXRlRmxhZ0JpdHMsIFZrU2hhZGVyTW9kdWxlQ3JlYXRlRmxhZ3M+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU2hhZGVyTW9kdWxlQ3JlYXRlRmxhZ3MgICkKKyAgeworICAgIHJldHVybiAie30iOworICB9CisKKyAgZW51bSBjbGFzcyBTaGFkZXJTdGFnZUZsYWdCaXRzCisgIHsKKyAgICBlVmVydGV4ID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsCisgICAgZVRlc3NlbGxhdGlvbkNvbnRyb2wgPSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklULAorICAgIGVUZXNzZWxsYXRpb25FdmFsdWF0aW9uID0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCwKKyAgICBlR2VvbWV0cnkgPSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklULAorICAgIGVGcmFnbWVudCA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsCisgICAgZUNvbXB1dGUgPSBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsCisgICAgZUFsbEdyYXBoaWNzID0gVktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDUywKKyAgICBlQWxsID0gVktfU0hBREVSX1NUQUdFX0FMTCwKKyAgICBlUmF5Z2VuTlYgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OViwKKyAgICBlQW55SGl0TlYgPSBWS19TSEFERVJfU1RBR0VfQU5ZX0hJVF9CSVRfTlYsCisgICAgZUNsb3Nlc3RIaXROViA9IFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlYsCisgICAgZU1pc3NOViA9IFZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OViwKKyAgICBlSW50ZXJzZWN0aW9uTlYgPSBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OViwKKyAgICBlQ2FsbGFibGVOViA9IFZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlYsCisgICAgZVRhc2tOViA9IFZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OViwKKyAgICBlTWVzaE5WID0gVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTaGFkZXJTdGFnZUZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVWZXJ0ZXggOiByZXR1cm4gIlZlcnRleCI7CisgICAgICBjYXNlIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVUZXNzZWxsYXRpb25Db250cm9sIDogcmV0dXJuICJUZXNzZWxsYXRpb25Db250cm9sIjsKKyAgICAgIGNhc2UgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZVRlc3NlbGxhdGlvbkV2YWx1YXRpb24gOiByZXR1cm4gIlRlc3NlbGxhdGlvbkV2YWx1YXRpb24iOworICAgICAgY2FzZSBTaGFkZXJTdGFnZUZsYWdCaXRzOjplR2VvbWV0cnkgOiByZXR1cm4gIkdlb21ldHJ5IjsKKyAgICAgIGNhc2UgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZUZyYWdtZW50IDogcmV0dXJuICJGcmFnbWVudCI7CisgICAgICBjYXNlIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVDb21wdXRlIDogcmV0dXJuICJDb21wdXRlIjsKKyAgICAgIGNhc2UgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZUFsbEdyYXBoaWNzIDogcmV0dXJuICJBbGxHcmFwaGljcyI7CisgICAgICBjYXNlIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVBbGwgOiByZXR1cm4gIkFsbCI7CisgICAgICBjYXNlIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVSYXlnZW5OViA6IHJldHVybiAiUmF5Z2VuTlYiOworICAgICAgY2FzZSBTaGFkZXJTdGFnZUZsYWdCaXRzOjplQW55SGl0TlYgOiByZXR1cm4gIkFueUhpdE5WIjsKKyAgICAgIGNhc2UgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZUNsb3Nlc3RIaXROViA6IHJldHVybiAiQ2xvc2VzdEhpdE5WIjsKKyAgICAgIGNhc2UgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZU1pc3NOViA6IHJldHVybiAiTWlzc05WIjsKKyAgICAgIGNhc2UgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZUludGVyc2VjdGlvbk5WIDogcmV0dXJuICJJbnRlcnNlY3Rpb25OViI7CisgICAgICBjYXNlIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVDYWxsYWJsZU5WIDogcmV0dXJuICJDYWxsYWJsZU5WIjsKKyAgICAgIGNhc2UgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZVRhc2tOViA6IHJldHVybiAiVGFza05WIjsKKyAgICAgIGNhc2UgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZU1lc2hOViA6IHJldHVybiAiTWVzaE5WIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgU2hhZGVyU3RhZ2VGbGFncyA9IEZsYWdzPFNoYWRlclN0YWdlRmxhZ0JpdHMsIFZrU2hhZGVyU3RhZ2VGbGFncz47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8U2hhZGVyU3RhZ2VGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoU2hhZGVyU3RhZ2VGbGFnQml0czo6ZVZlcnRleCkgfCBWa0ZsYWdzKFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVUZXNzZWxsYXRpb25Db250cm9sKSB8IFZrRmxhZ3MoU2hhZGVyU3RhZ2VGbGFnQml0czo6ZVRlc3NlbGxhdGlvbkV2YWx1YXRpb24pIHwgVmtGbGFncyhTaGFkZXJTdGFnZUZsYWdCaXRzOjplR2VvbWV0cnkpIHwgVmtGbGFncyhTaGFkZXJTdGFnZUZsYWdCaXRzOjplRnJhZ21lbnQpIHwgVmtGbGFncyhTaGFkZXJTdGFnZUZsYWdCaXRzOjplQ29tcHV0ZSkgfCBWa0ZsYWdzKFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVBbGxHcmFwaGljcykgfCBWa0ZsYWdzKFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVBbGwpIHwgVmtGbGFncyhTaGFkZXJTdGFnZUZsYWdCaXRzOjplUmF5Z2VuTlYpIHwgVmtGbGFncyhTaGFkZXJTdGFnZUZsYWdCaXRzOjplQW55SGl0TlYpIHwgVmtGbGFncyhTaGFkZXJTdGFnZUZsYWdCaXRzOjplQ2xvc2VzdEhpdE5WKSB8IFZrRmxhZ3MoU2hhZGVyU3RhZ2VGbGFnQml0czo6ZU1pc3NOVikgfCBWa0ZsYWdzKFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVJbnRlcnNlY3Rpb25OVikgfCBWa0ZsYWdzKFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVDYWxsYWJsZU5WKSB8IFZrRmxhZ3MoU2hhZGVyU3RhZ2VGbGFnQml0czo6ZVRhc2tOVikgfCBWa0ZsYWdzKFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVNZXNoTlYpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTaGFkZXJTdGFnZUZsYWdzIG9wZXJhdG9yfCggU2hhZGVyU3RhZ2VGbGFnQml0cyBiaXQwLCBTaGFkZXJTdGFnZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU2hhZGVyU3RhZ2VGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNoYWRlclN0YWdlRmxhZ3Mgb3BlcmF0b3ImKCBTaGFkZXJTdGFnZUZsYWdCaXRzIGJpdDAsIFNoYWRlclN0YWdlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTaGFkZXJTdGFnZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2hhZGVyU3RhZ2VGbGFncyBvcGVyYXRvcl4oIFNoYWRlclN0YWdlRmxhZ0JpdHMgYml0MCwgU2hhZGVyU3RhZ2VGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNoYWRlclN0YWdlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTaGFkZXJTdGFnZUZsYWdzIG9wZXJhdG9yfiggU2hhZGVyU3RhZ2VGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFNoYWRlclN0YWdlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTaGFkZXJTdGFnZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBTaGFkZXJTdGFnZUZsYWdCaXRzOjplVmVydGV4ICkgcmVzdWx0ICs9ICJWZXJ0ZXggfCAiOworICAgIGlmICggdmFsdWUgJiBTaGFkZXJTdGFnZUZsYWdCaXRzOjplVGVzc2VsbGF0aW9uQ29udHJvbCApIHJlc3VsdCArPSAiVGVzc2VsbGF0aW9uQ29udHJvbCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVUZXNzZWxsYXRpb25FdmFsdWF0aW9uICkgcmVzdWx0ICs9ICJUZXNzZWxsYXRpb25FdmFsdWF0aW9uIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZUdlb21ldHJ5ICkgcmVzdWx0ICs9ICJHZW9tZXRyeSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVGcmFnbWVudCApIHJlc3VsdCArPSAiRnJhZ21lbnQgfCAiOworICAgIGlmICggdmFsdWUgJiBTaGFkZXJTdGFnZUZsYWdCaXRzOjplQ29tcHV0ZSApIHJlc3VsdCArPSAiQ29tcHV0ZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVSYXlnZW5OViApIHJlc3VsdCArPSAiUmF5Z2VuTlYgfCAiOworICAgIGlmICggdmFsdWUgJiBTaGFkZXJTdGFnZUZsYWdCaXRzOjplQW55SGl0TlYgKSByZXN1bHQgKz0gIkFueUhpdE5WIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZUNsb3Nlc3RIaXROViApIHJlc3VsdCArPSAiQ2xvc2VzdEhpdE5WIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZU1pc3NOViApIHJlc3VsdCArPSAiTWlzc05WIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZUludGVyc2VjdGlvbk5WICkgcmVzdWx0ICs9ICJJbnRlcnNlY3Rpb25OViB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFNoYWRlclN0YWdlRmxhZ0JpdHM6OmVDYWxsYWJsZU5WICkgcmVzdWx0ICs9ICJDYWxsYWJsZU5WIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZVRhc2tOViApIHJlc3VsdCArPSAiVGFza05WIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU2hhZGVyU3RhZ2VGbGFnQml0czo6ZU1lc2hOViApIHJlc3VsdCArPSAiTWVzaE5WIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0cworICB7CisgICAgZVNpbmdsZU1pcHRhaWwgPSBWS19TUEFSU0VfSU1BR0VfRk9STUFUX1NJTkdMRV9NSVBUQUlMX0JJVCwKKyAgICBlQWxpZ25lZE1pcFNpemUgPSBWS19TUEFSU0VfSU1BR0VfRk9STUFUX0FMSUdORURfTUlQX1NJWkVfQklULAorICAgIGVOb25zdGFuZGFyZEJsb2NrU2l6ZSA9IFZLX1NQQVJTRV9JTUFHRV9GT1JNQVRfTk9OU1RBTkRBUkRfQkxPQ0tfU0laRV9CSVQKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFNwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHMgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0czo6ZVNpbmdsZU1pcHRhaWwgOiByZXR1cm4gIlNpbmdsZU1pcHRhaWwiOworICAgICAgY2FzZSBTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzOjplQWxpZ25lZE1pcFNpemUgOiByZXR1cm4gIkFsaWduZWRNaXBTaXplIjsKKyAgICAgIGNhc2UgU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0czo6ZU5vbnN0YW5kYXJkQmxvY2tTaXplIDogcmV0dXJuICJOb25zdGFuZGFyZEJsb2NrU2l6ZSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIFNwYXJzZUltYWdlRm9ybWF0RmxhZ3MgPSBGbGFnczxTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzLCBWa1NwYXJzZUltYWdlRm9ybWF0RmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPFNwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHM+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFNwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHM6OmVTaW5nbGVNaXB0YWlsKSB8IFZrRmxhZ3MoU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0czo6ZUFsaWduZWRNaXBTaXplKSB8IFZrRmxhZ3MoU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0czo6ZU5vbnN0YW5kYXJkQmxvY2tTaXplKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3BhcnNlSW1hZ2VGb3JtYXRGbGFncyBvcGVyYXRvcnwoIFNwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHMgYml0MCwgU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNwYXJzZUltYWdlRm9ybWF0RmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTcGFyc2VJbWFnZUZvcm1hdEZsYWdzIG9wZXJhdG9yJiggU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0cyBiaXQwLCBTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3BhcnNlSW1hZ2VGb3JtYXRGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNwYXJzZUltYWdlRm9ybWF0RmxhZ3Mgb3BlcmF0b3JeKCBTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzIGJpdDAsIFNwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTcGFyc2VJbWFnZUZvcm1hdEZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3BhcnNlSW1hZ2VGb3JtYXRGbGFncyBvcGVyYXRvcn4oIFNwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBTcGFyc2VJbWFnZUZvcm1hdEZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3BhcnNlSW1hZ2VGb3JtYXRGbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0czo6ZVNpbmdsZU1pcHRhaWwgKSByZXN1bHQgKz0gIlNpbmdsZU1pcHRhaWwgfCAiOworICAgIGlmICggdmFsdWUgJiBTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzOjplQWxpZ25lZE1pcFNpemUgKSByZXN1bHQgKz0gIkFsaWduZWRNaXBTaXplIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0czo6ZU5vbnN0YW5kYXJkQmxvY2tTaXplICkgcmVzdWx0ICs9ICJOb25zdGFuZGFyZEJsb2NrU2l6ZSB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFNwYXJzZU1lbW9yeUJpbmRGbGFnQml0cworICB7CisgICAgZU1ldGFkYXRhID0gVktfU1BBUlNFX01FTU9SWV9CSU5EX01FVEFEQVRBX0JJVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFNwYXJzZU1lbW9yeUJpbmRGbGFnQml0czo6ZU1ldGFkYXRhIDogcmV0dXJuICJNZXRhZGF0YSI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIFNwYXJzZU1lbW9yeUJpbmRGbGFncyA9IEZsYWdzPFNwYXJzZU1lbW9yeUJpbmRGbGFnQml0cywgVmtTcGFyc2VNZW1vcnlCaW5kRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPFNwYXJzZU1lbW9yeUJpbmRGbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzOjplTWV0YWRhdGEpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTcGFyc2VNZW1vcnlCaW5kRmxhZ3Mgb3BlcmF0b3J8KCBTcGFyc2VNZW1vcnlCaW5kRmxhZ0JpdHMgYml0MCwgU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3BhcnNlTWVtb3J5QmluZEZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3BhcnNlTWVtb3J5QmluZEZsYWdzIG9wZXJhdG9yJiggU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzIGJpdDAsIFNwYXJzZU1lbW9yeUJpbmRGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFNwYXJzZU1lbW9yeUJpbmRGbGFncyggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNwYXJzZU1lbW9yeUJpbmRGbGFncyBvcGVyYXRvcl4oIFNwYXJzZU1lbW9yeUJpbmRGbGFnQml0cyBiaXQwLCBTcGFyc2VNZW1vcnlCaW5kRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTcGFyc2VNZW1vcnlCaW5kRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTcGFyc2VNZW1vcnlCaW5kRmxhZ3Mgb3BlcmF0b3J+KCBTcGFyc2VNZW1vcnlCaW5kRmxhZ0JpdHMgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBTcGFyc2VNZW1vcnlCaW5kRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTcGFyc2VNZW1vcnlCaW5kRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIFNwYXJzZU1lbW9yeUJpbmRGbGFnQml0czo6ZU1ldGFkYXRhICkgcmVzdWx0ICs9ICJNZXRhZGF0YSB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFN0ZW5jaWxGYWNlRmxhZ0JpdHMKKyAgeworICAgIGVGcm9udCA9IFZLX1NURU5DSUxfRkFDRV9GUk9OVF9CSVQsCisgICAgZUJhY2sgPSBWS19TVEVOQ0lMX0ZBQ0VfQkFDS19CSVQsCisgICAgZUZyb250QW5kQmFjayA9IFZLX1NURU5DSUxfRkFDRV9GUk9OVF9BTkRfQkFDSywKKyAgICBlVmtTdGVuY2lsRnJvbnRBbmRCYWNrID0gVktfU1RFTkNJTF9GUk9OVF9BTkRfQkFDSworICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3RlbmNpbEZhY2VGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTdGVuY2lsRmFjZUZsYWdCaXRzOjplRnJvbnQgOiByZXR1cm4gIkZyb250IjsKKyAgICAgIGNhc2UgU3RlbmNpbEZhY2VGbGFnQml0czo6ZUJhY2sgOiByZXR1cm4gIkJhY2siOworICAgICAgY2FzZSBTdGVuY2lsRmFjZUZsYWdCaXRzOjplRnJvbnRBbmRCYWNrIDogcmV0dXJuICJGcm9udEFuZEJhY2siOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBTdGVuY2lsRmFjZUZsYWdzID0gRmxhZ3M8U3RlbmNpbEZhY2VGbGFnQml0cywgVmtTdGVuY2lsRmFjZUZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxTdGVuY2lsRmFjZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhTdGVuY2lsRmFjZUZsYWdCaXRzOjplRnJvbnQpIHwgVmtGbGFncyhTdGVuY2lsRmFjZUZsYWdCaXRzOjplQmFjaykgfCBWa0ZsYWdzKFN0ZW5jaWxGYWNlRmxhZ0JpdHM6OmVGcm9udEFuZEJhY2spCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdGVuY2lsRmFjZUZsYWdzIG9wZXJhdG9yfCggU3RlbmNpbEZhY2VGbGFnQml0cyBiaXQwLCBTdGVuY2lsRmFjZUZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3RlbmNpbEZhY2VGbGFncyggYml0MCApIHwgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFN0ZW5jaWxGYWNlRmxhZ3Mgb3BlcmF0b3ImKCBTdGVuY2lsRmFjZUZsYWdCaXRzIGJpdDAsIFN0ZW5jaWxGYWNlRmxhZ0JpdHMgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTdGVuY2lsRmFjZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3RlbmNpbEZhY2VGbGFncyBvcGVyYXRvcl4oIFN0ZW5jaWxGYWNlRmxhZ0JpdHMgYml0MCwgU3RlbmNpbEZhY2VGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFN0ZW5jaWxGYWNlRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdGVuY2lsRmFjZUZsYWdzIG9wZXJhdG9yfiggU3RlbmNpbEZhY2VGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFN0ZW5jaWxGYWNlRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTdGVuY2lsRmFjZUZsYWdzIHZhbHVlICApCisgIHsKKyAgICBpZiAoICF2YWx1ZSApIHJldHVybiAie30iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGlmICggdmFsdWUgJiBTdGVuY2lsRmFjZUZsYWdCaXRzOjplRnJvbnQgKSByZXN1bHQgKz0gIkZyb250IHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3RlbmNpbEZhY2VGbGFnQml0czo6ZUJhY2sgKSByZXN1bHQgKz0gIkJhY2sgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgIGVudW0gY2xhc3MgU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVGbGFnQml0c0dHUAorICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFN0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNHR1AgKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVGbGFnc0dHUCA9IEZsYWdzPFN0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNHR1AsIFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVGbGFnc0dHUD47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUZsYWdzR0dQICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0dHUCovCisKKyAgZW51bSBjbGFzcyBTdWJncm91cEZlYXR1cmVGbGFnQml0cworICB7CisgICAgZUJhc2ljID0gVktfU1VCR1JPVVBfRkVBVFVSRV9CQVNJQ19CSVQsCisgICAgZVZvdGUgPSBWS19TVUJHUk9VUF9GRUFUVVJFX1ZPVEVfQklULAorICAgIGVBcml0aG1ldGljID0gVktfU1VCR1JPVVBfRkVBVFVSRV9BUklUSE1FVElDX0JJVCwKKyAgICBlQmFsbG90ID0gVktfU1VCR1JPVVBfRkVBVFVSRV9CQUxMT1RfQklULAorICAgIGVTaHVmZmxlID0gVktfU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX0JJVCwKKyAgICBlU2h1ZmZsZVJlbGF0aXZlID0gVktfU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX1JFTEFUSVZFX0JJVCwKKyAgICBlQ2x1c3RlcmVkID0gVktfU1VCR1JPVVBfRkVBVFVSRV9DTFVTVEVSRURfQklULAorICAgIGVRdWFkID0gVktfU1VCR1JPVVBfRkVBVFVSRV9RVUFEX0JJVCwKKyAgICBlUGFydGl0aW9uZWROViA9IFZLX1NVQkdST1VQX0ZFQVRVUkVfUEFSVElUSU9ORURfQklUX05WCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTdWJncm91cEZlYXR1cmVGbGFnQml0cyB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTdWJncm91cEZlYXR1cmVGbGFnQml0czo6ZUJhc2ljIDogcmV0dXJuICJCYXNpYyI7CisgICAgICBjYXNlIFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplVm90ZSA6IHJldHVybiAiVm90ZSI7CisgICAgICBjYXNlIFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplQXJpdGhtZXRpYyA6IHJldHVybiAiQXJpdGhtZXRpYyI7CisgICAgICBjYXNlIFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplQmFsbG90IDogcmV0dXJuICJCYWxsb3QiOworICAgICAgY2FzZSBTdWJncm91cEZlYXR1cmVGbGFnQml0czo6ZVNodWZmbGUgOiByZXR1cm4gIlNodWZmbGUiOworICAgICAgY2FzZSBTdWJncm91cEZlYXR1cmVGbGFnQml0czo6ZVNodWZmbGVSZWxhdGl2ZSA6IHJldHVybiAiU2h1ZmZsZVJlbGF0aXZlIjsKKyAgICAgIGNhc2UgU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVDbHVzdGVyZWQgOiByZXR1cm4gIkNsdXN0ZXJlZCI7CisgICAgICBjYXNlIFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplUXVhZCA6IHJldHVybiAiUXVhZCI7CisgICAgICBjYXNlIFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplUGFydGl0aW9uZWROViA6IHJldHVybiAiUGFydGl0aW9uZWROViI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIFN1Ymdyb3VwRmVhdHVyZUZsYWdzID0gRmxhZ3M8U3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHMsIFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ3M+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhTdWJncm91cEZlYXR1cmVGbGFnQml0czo6ZUJhc2ljKSB8IFZrRmxhZ3MoU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVWb3RlKSB8IFZrRmxhZ3MoU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVBcml0aG1ldGljKSB8IFZrRmxhZ3MoU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVCYWxsb3QpIHwgVmtGbGFncyhTdWJncm91cEZlYXR1cmVGbGFnQml0czo6ZVNodWZmbGUpIHwgVmtGbGFncyhTdWJncm91cEZlYXR1cmVGbGFnQml0czo6ZVNodWZmbGVSZWxhdGl2ZSkgfCBWa0ZsYWdzKFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplQ2x1c3RlcmVkKSB8IFZrRmxhZ3MoU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVRdWFkKSB8IFZrRmxhZ3MoU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVQYXJ0aXRpb25lZE5WKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3ViZ3JvdXBGZWF0dXJlRmxhZ3Mgb3BlcmF0b3J8KCBTdWJncm91cEZlYXR1cmVGbGFnQml0cyBiaXQwLCBTdWJncm91cEZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFN1Ymdyb3VwRmVhdHVyZUZsYWdzKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3ViZ3JvdXBGZWF0dXJlRmxhZ3Mgb3BlcmF0b3ImKCBTdWJncm91cEZlYXR1cmVGbGFnQml0cyBiaXQwLCBTdWJncm91cEZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFN1Ymdyb3VwRmVhdHVyZUZsYWdzKCBiaXQwICkgJiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3ViZ3JvdXBGZWF0dXJlRmxhZ3Mgb3BlcmF0b3JeKCBTdWJncm91cEZlYXR1cmVGbGFnQml0cyBiaXQwLCBTdWJncm91cEZlYXR1cmVGbGFnQml0cyBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFN1Ymdyb3VwRmVhdHVyZUZsYWdzKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3ViZ3JvdXBGZWF0dXJlRmxhZ3Mgb3BlcmF0b3J+KCBTdWJncm91cEZlYXR1cmVGbGFnQml0cyBiaXRzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIH4oIFN1Ymdyb3VwRmVhdHVyZUZsYWdzKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3ViZ3JvdXBGZWF0dXJlRmxhZ3MgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplQmFzaWMgKSByZXN1bHQgKz0gIkJhc2ljIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVWb3RlICkgcmVzdWx0ICs9ICJWb3RlIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVBcml0aG1ldGljICkgcmVzdWx0ICs9ICJBcml0aG1ldGljIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVCYWxsb3QgKSByZXN1bHQgKz0gIkJhbGxvdCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplU2h1ZmZsZSApIHJlc3VsdCArPSAiU2h1ZmZsZSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFN1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzOjplU2h1ZmZsZVJlbGF0aXZlICkgcmVzdWx0ICs9ICJTaHVmZmxlUmVsYXRpdmUgfCAiOworICAgIGlmICggdmFsdWUgJiBTdWJncm91cEZlYXR1cmVGbGFnQml0czo6ZUNsdXN0ZXJlZCApIHJlc3VsdCArPSAiQ2x1c3RlcmVkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVRdWFkICkgcmVzdWx0ICs9ICJRdWFkIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM6OmVQYXJ0aXRpb25lZE5WICkgcmVzdWx0ICs9ICJQYXJ0aXRpb25lZE5WIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMKKyAgeworICAgIGVQZXJWaWV3QXR0cmlidXRlc05WWCA9IFZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfQVRUUklCVVRFU19CSVRfTlZYLAorICAgIGVQZXJWaWV3UG9zaXRpb25YT25seU5WWCA9IFZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfUE9TSVRJT05fWF9PTkxZX0JJVF9OVlgKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzOjplUGVyVmlld0F0dHJpYnV0ZXNOVlggOiByZXR1cm4gIlBlclZpZXdBdHRyaWJ1dGVzTlZYIjsKKyAgICAgIGNhc2UgU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHM6OmVQZXJWaWV3UG9zaXRpb25YT25seU5WWCA6IHJldHVybiAiUGVyVmlld1Bvc2l0aW9uWE9ubHlOVlgiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBTdWJwYXNzRGVzY3JpcHRpb25GbGFncyA9IEZsYWdzPFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzLCBWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdzPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0cz4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHM6OmVQZXJWaWV3QXR0cmlidXRlc05WWCkgfCBWa0ZsYWdzKFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzOjplUGVyVmlld1Bvc2l0aW9uWE9ubHlOVlgpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdWJwYXNzRGVzY3JpcHRpb25GbGFncyBvcGVyYXRvcnwoIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIGJpdDAsIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdWJwYXNzRGVzY3JpcHRpb25GbGFncyBvcGVyYXRvciYoIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIGJpdDAsIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdWJwYXNzRGVzY3JpcHRpb25GbGFncyBvcGVyYXRvcl4oIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIGJpdDAsIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdWJwYXNzRGVzY3JpcHRpb25GbGFncyBvcGVyYXRvcn4oIFN1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTdWJwYXNzRGVzY3JpcHRpb25GbGFncyB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHM6OmVQZXJWaWV3QXR0cmlidXRlc05WWCApIHJlc3VsdCArPSAiUGVyVmlld0F0dHJpYnV0ZXNOVlggfCAiOworICAgIGlmICggdmFsdWUgJiBTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0czo6ZVBlclZpZXdQb3NpdGlvblhPbmx5TlZYICkgcmVzdWx0ICs9ICJQZXJWaWV3UG9zaXRpb25YT25seU5WWCB8ICI7CisgICAgcmV0dXJuICJ7ICIgKyByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5zaXplKCkgLSAzKSArICIgfSI7CisgIH0KKworICBlbnVtIGNsYXNzIFN1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQKKyAgeworICAgIGVWYmxhbmsgPSBWS19TVVJGQUNFX0NPVU5URVJfVkJMQU5LX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUOjplVmJsYW5rIDogcmV0dXJuICJWYmxhbmsiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBTdXJmYWNlQ291bnRlckZsYWdzRVhUID0gRmxhZ3M8U3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCwgVmtTdXJmYWNlQ291bnRlckZsYWdzRVhUPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUOjplVmJsYW5rKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VyZmFjZUNvdW50ZXJGbGFnc0VYVCBvcGVyYXRvcnwoIFN1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgYml0MCwgU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFN1cmZhY2VDb3VudGVyRmxhZ3NFWFQoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdXJmYWNlQ291bnRlckZsYWdzRVhUIG9wZXJhdG9yJiggU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCBiaXQwLCBTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3VyZmFjZUNvdW50ZXJGbGFnc0VYVCggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFN1cmZhY2VDb3VudGVyRmxhZ3NFWFQgb3BlcmF0b3JeKCBTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUIGJpdDAsIFN1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTdXJmYWNlQ291bnRlckZsYWdzRVhUKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VyZmFjZUNvdW50ZXJGbGFnc0VYVCBvcGVyYXRvcn4oIFN1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBTdXJmYWNlQ291bnRlckZsYWdzRVhUKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggU3VyZmFjZUNvdW50ZXJGbGFnc0VYVCB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVDo6ZVZibGFuayApIHJlc3VsdCArPSAiVmJsYW5rIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSCisgIHsKKyAgICBlSWRlbnRpdHkgPSBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSLAorICAgIGVSb3RhdGU5MCA9IFZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV85MF9CSVRfS0hSLAorICAgIGVSb3RhdGUxODAgPSBWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfMTgwX0JJVF9LSFIsCisgICAgZVJvdGF0ZTI3MCA9IFZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV8yNzBfQklUX0tIUiwKKyAgICBlSG9yaXpvbnRhbE1pcnJvciA9IFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX0JJVF9LSFIsCisgICAgZUhvcml6b250YWxNaXJyb3JSb3RhdGU5MCA9IFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV85MF9CSVRfS0hSLAorICAgIGVIb3Jpem9udGFsTWlycm9yUm90YXRlMTgwID0gVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzE4MF9CSVRfS0hSLAorICAgIGVIb3Jpem9udGFsTWlycm9yUm90YXRlMjcwID0gVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzI3MF9CSVRfS0hSLAorICAgIGVJbmhlcml0ID0gVktfU1VSRkFDRV9UUkFOU0ZPUk1fSU5IRVJJVF9CSVRfS0hSCisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgdmFsdWUgKQorICB7CisgICAgc3dpdGNoICggdmFsdWUgKQorICAgIHsKKyAgICAgIGNhc2UgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSWRlbnRpdHkgOiByZXR1cm4gIklkZW50aXR5IjsKKyAgICAgIGNhc2UgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplUm90YXRlOTAgOiByZXR1cm4gIlJvdGF0ZTkwIjsKKyAgICAgIGNhc2UgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplUm90YXRlMTgwIDogcmV0dXJuICJSb3RhdGUxODAiOworICAgICAgY2FzZSBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI6OmVSb3RhdGUyNzAgOiByZXR1cm4gIlJvdGF0ZTI3MCI7CisgICAgICBjYXNlIFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUhvcml6b250YWxNaXJyb3IgOiByZXR1cm4gIkhvcml6b250YWxNaXJyb3IiOworICAgICAgY2FzZSBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI6OmVIb3Jpem9udGFsTWlycm9yUm90YXRlOTAgOiByZXR1cm4gIkhvcml6b250YWxNaXJyb3JSb3RhdGU5MCI7CisgICAgICBjYXNlIFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUhvcml6b250YWxNaXJyb3JSb3RhdGUxODAgOiByZXR1cm4gIkhvcml6b250YWxNaXJyb3JSb3RhdGUxODAiOworICAgICAgY2FzZSBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI6OmVIb3Jpem9udGFsTWlycm9yUm90YXRlMjcwIDogcmV0dXJuICJIb3Jpem9udGFsTWlycm9yUm90YXRlMjcwIjsKKyAgICAgIGNhc2UgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSW5oZXJpdCA6IHJldHVybiAiSW5oZXJpdCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gImludmFsaWQiOworICAgIH0KKyAgfQorCisgIHVzaW5nIFN1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUiA9IEZsYWdzPFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiwgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFI+OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBGbGFnVHJhaXRzPFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUj4KKyAgeworICAgIGVudW0KKyAgICB7CisgICAgICBhbGxGbGFncyA9IFZrRmxhZ3MoU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSWRlbnRpdHkpIHwgVmtGbGFncyhTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI6OmVSb3RhdGU5MCkgfCBWa0ZsYWdzKFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZVJvdGF0ZTE4MCkgfCBWa0ZsYWdzKFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZVJvdGF0ZTI3MCkgfCBWa0ZsYWdzKFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUhvcml6b250YWxNaXJyb3IpIHwgVmtGbGFncyhTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI6OmVIb3Jpem9udGFsTWlycm9yUm90YXRlOTApIHwgVmtGbGFncyhTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI6OmVIb3Jpem9udGFsTWlycm9yUm90YXRlMTgwKSB8IFZrRmxhZ3MoU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSG9yaXpvbnRhbE1pcnJvclJvdGF0ZTI3MCkgfCBWa0ZsYWdzKFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUluaGVyaXQpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIgb3BlcmF0b3J8KCBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgYml0MCwgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSKCBiaXQwICkgfCBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSIG9wZXJhdG9yJiggU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIGJpdDAsIFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFN1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUiggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFN1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUiBvcGVyYXRvcl4oIFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBiaXQwLCBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIgb3BlcmF0b3J+KCBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIgdmFsdWUgICkKKyAgeworICAgIGlmICggIXZhbHVlICkgcmV0dXJuICJ7fSI7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgaWYgKCB2YWx1ZSAmIFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUlkZW50aXR5ICkgcmVzdWx0ICs9ICJJZGVudGl0eSB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZVJvdGF0ZTkwICkgcmVzdWx0ICs9ICJSb3RhdGU5MCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZVJvdGF0ZTE4MCApIHJlc3VsdCArPSAiUm90YXRlMTgwIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplUm90YXRlMjcwICkgcmVzdWx0ICs9ICJSb3RhdGUyNzAgfCAiOworICAgIGlmICggdmFsdWUgJiBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI6OmVIb3Jpem9udGFsTWlycm9yICkgcmVzdWx0ICs9ICJIb3Jpem9udGFsTWlycm9yIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSG9yaXpvbnRhbE1pcnJvclJvdGF0ZTkwICkgcmVzdWx0ICs9ICJIb3Jpem9udGFsTWlycm9yUm90YXRlOTAgfCAiOworICAgIGlmICggdmFsdWUgJiBTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI6OmVIb3Jpem9udGFsTWlycm9yUm90YXRlMTgwICkgcmVzdWx0ICs9ICJIb3Jpem9udGFsTWlycm9yUm90YXRlMTgwIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSG9yaXpvbnRhbE1pcnJvclJvdGF0ZTI3MCApIHJlc3VsdCArPSAiSG9yaXpvbnRhbE1pcnJvclJvdGF0ZTI3MCB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUluaGVyaXQgKSByZXN1bHQgKz0gIkluaGVyaXQgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUgorICB7CisgICAgZVNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyA9IFZLX1NXQVBDSEFJTl9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVF9LSFIsCisgICAgZVByb3RlY3RlZCA9IFZLX1NXQVBDSEFJTl9DUkVBVEVfUFJPVEVDVEVEX0JJVF9LSFIsCisgICAgZU11dGFibGVGb3JtYXQgPSBWS19TV0FQQ0hBSU5fQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVF9LSFIKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIHZhbHVlICkKKyAgeworICAgIHN3aXRjaCAoIHZhbHVlICkKKyAgICB7CisgICAgICBjYXNlIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSOjplU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zIDogcmV0dXJuICJTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMiOworICAgICAgY2FzZSBTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUjo6ZVByb3RlY3RlZCA6IHJldHVybiAiUHJvdGVjdGVkIjsKKyAgICAgIGNhc2UgU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFI6OmVNdXRhYmxlRm9ybWF0IDogcmV0dXJuICJNdXRhYmxlRm9ybWF0IjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisgICAgfQorICB9CisKKyAgdXNpbmcgU3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIgPSBGbGFnczxTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUiwgVmtTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUj47CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEZsYWdUcmFpdHM8U3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFI+CisgIHsKKyAgICBlbnVtCisgICAgeworICAgICAgYWxsRmxhZ3MgPSBWa0ZsYWdzKFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSOjplU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zKSB8IFZrRmxhZ3MoU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFI6OmVQcm90ZWN0ZWQpIHwgVmtGbGFncyhTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUjo6ZU11dGFibGVGb3JtYXQpCisgICAgfTsKKyAgfTsKKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUiBvcGVyYXRvcnwoIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIGJpdDAsIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUiBvcGVyYXRvciYoIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIGJpdDAsIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIoIGJpdDAgKSAmIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUiBvcGVyYXRvcl4oIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIGJpdDAsIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gU3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIoIGJpdDAgKSBeIGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUiBvcGVyYXRvcn4oIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIGJpdHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gfiggU3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIoIGJpdHMgKSApOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUiB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFI6OmVTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMgKSByZXN1bHQgKz0gIlNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFN3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSOjplUHJvdGVjdGVkICkgcmVzdWx0ICs9ICJQcm90ZWN0ZWQgfCAiOworICAgIGlmICggdmFsdWUgJiBTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUjo6ZU11dGFibGVGb3JtYXQgKSByZXN1bHQgKz0gIk11dGFibGVGb3JtYXQgfCAiOworICAgIHJldHVybiAieyAiICsgcmVzdWx0LnN1YnN0cigwLCByZXN1bHQuc2l6ZSgpIC0gMykgKyAiIH0iOworICB9CisKKyAgZW51bSBjbGFzcyBUb29sUHVycG9zZUZsYWdCaXRzRVhUCisgIHsKKyAgICBlVmFsaWRhdGlvbiA9IFZLX1RPT0xfUFVSUE9TRV9WQUxJREFUSU9OX0JJVF9FWFQsCisgICAgZVByb2ZpbGluZyA9IFZLX1RPT0xfUFVSUE9TRV9QUk9GSUxJTkdfQklUX0VYVCwKKyAgICBlVHJhY2luZyA9IFZLX1RPT0xfUFVSUE9TRV9UUkFDSU5HX0JJVF9FWFQsCisgICAgZUFkZGl0aW9uYWxGZWF0dXJlcyA9IFZLX1RPT0xfUFVSUE9TRV9BRERJVElPTkFMX0ZFQVRVUkVTX0JJVF9FWFQsCisgICAgZU1vZGlmeWluZ0ZlYXR1cmVzID0gVktfVE9PTF9QVVJQT1NFX01PRElGWUlOR19GRUFUVVJFU19CSVRfRVhULAorICAgIGVEZWJ1Z1JlcG9ydGluZyA9IFZLX1RPT0xfUFVSUE9TRV9ERUJVR19SRVBPUlRJTkdfQklUX0VYVCwKKyAgICBlRGVidWdNYXJrZXJzID0gVktfVE9PTF9QVVJQT1NFX0RFQlVHX01BUktFUlNfQklUX0VYVAorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggVG9vbFB1cnBvc2VGbGFnQml0c0VYVCB2YWx1ZSApCisgIHsKKyAgICBzd2l0Y2ggKCB2YWx1ZSApCisgICAgeworICAgICAgY2FzZSBUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplVmFsaWRhdGlvbiA6IHJldHVybiAiVmFsaWRhdGlvbiI7CisgICAgICBjYXNlIFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQ6OmVQcm9maWxpbmcgOiByZXR1cm4gIlByb2ZpbGluZyI7CisgICAgICBjYXNlIFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQ6OmVUcmFjaW5nIDogcmV0dXJuICJUcmFjaW5nIjsKKyAgICAgIGNhc2UgVG9vbFB1cnBvc2VGbGFnQml0c0VYVDo6ZUFkZGl0aW9uYWxGZWF0dXJlcyA6IHJldHVybiAiQWRkaXRpb25hbEZlYXR1cmVzIjsKKyAgICAgIGNhc2UgVG9vbFB1cnBvc2VGbGFnQml0c0VYVDo6ZU1vZGlmeWluZ0ZlYXR1cmVzIDogcmV0dXJuICJNb2RpZnlpbmdGZWF0dXJlcyI7CisgICAgICBjYXNlIFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQ6OmVEZWJ1Z1JlcG9ydGluZyA6IHJldHVybiAiRGVidWdSZXBvcnRpbmciOworICAgICAgY2FzZSBUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplRGVidWdNYXJrZXJzIDogcmV0dXJuICJEZWJ1Z01hcmtlcnMiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9CisgIH0KKworICB1c2luZyBUb29sUHVycG9zZUZsYWdzRVhUID0gRmxhZ3M8VG9vbFB1cnBvc2VGbGFnQml0c0VYVCwgVmtUb29sUHVycG9zZUZsYWdzRVhUPjsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRmxhZ1RyYWl0czxUb29sUHVycG9zZUZsYWdCaXRzRVhUPgorICB7CisgICAgZW51bQorICAgIHsKKyAgICAgIGFsbEZsYWdzID0gVmtGbGFncyhUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplVmFsaWRhdGlvbikgfCBWa0ZsYWdzKFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQ6OmVQcm9maWxpbmcpIHwgVmtGbGFncyhUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplVHJhY2luZykgfCBWa0ZsYWdzKFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQ6OmVBZGRpdGlvbmFsRmVhdHVyZXMpIHwgVmtGbGFncyhUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplTW9kaWZ5aW5nRmVhdHVyZXMpIHwgVmtGbGFncyhUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplRGVidWdSZXBvcnRpbmcpIHwgVmtGbGFncyhUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplRGVidWdNYXJrZXJzKQorICAgIH07CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgVG9vbFB1cnBvc2VGbGFnc0VYVCBvcGVyYXRvcnwoIFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQgYml0MCwgVG9vbFB1cnBvc2VGbGFnQml0c0VYVCBiaXQxICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIFRvb2xQdXJwb3NlRmxhZ3NFWFQoIGJpdDAgKSB8IGJpdDE7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX0NPTlNURVhQUiBUb29sUHVycG9zZUZsYWdzRVhUIG9wZXJhdG9yJiggVG9vbFB1cnBvc2VGbGFnQml0c0VYVCBiaXQwLCBUb29sUHVycG9zZUZsYWdCaXRzRVhUIGJpdDEgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gVG9vbFB1cnBvc2VGbGFnc0VYVCggYml0MCApICYgYml0MTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFRvb2xQdXJwb3NlRmxhZ3NFWFQgb3BlcmF0b3JeKCBUb29sUHVycG9zZUZsYWdCaXRzRVhUIGJpdDAsIFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQgYml0MSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBUb29sUHVycG9zZUZsYWdzRVhUKCBiaXQwICkgXiBiaXQxOworICB9CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9DT05TVEVYUFIgVG9vbFB1cnBvc2VGbGFnc0VYVCBvcGVyYXRvcn4oIFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQgYml0cyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiB+KCBUb29sUHVycG9zZUZsYWdzRVhUKCBiaXRzICkgKTsKKyAgfQorCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggVG9vbFB1cnBvc2VGbGFnc0VYVCB2YWx1ZSAgKQorICB7CisgICAgaWYgKCAhdmFsdWUgKSByZXR1cm4gInt9IjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoIHZhbHVlICYgVG9vbFB1cnBvc2VGbGFnQml0c0VYVDo6ZVZhbGlkYXRpb24gKSByZXN1bHQgKz0gIlZhbGlkYXRpb24gfCAiOworICAgIGlmICggdmFsdWUgJiBUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplUHJvZmlsaW5nICkgcmVzdWx0ICs9ICJQcm9maWxpbmcgfCAiOworICAgIGlmICggdmFsdWUgJiBUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplVHJhY2luZyApIHJlc3VsdCArPSAiVHJhY2luZyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQ6OmVBZGRpdGlvbmFsRmVhdHVyZXMgKSByZXN1bHQgKz0gIkFkZGl0aW9uYWxGZWF0dXJlcyB8ICI7CisgICAgaWYgKCB2YWx1ZSAmIFRvb2xQdXJwb3NlRmxhZ0JpdHNFWFQ6OmVNb2RpZnlpbmdGZWF0dXJlcyApIHJlc3VsdCArPSAiTW9kaWZ5aW5nRmVhdHVyZXMgfCAiOworICAgIGlmICggdmFsdWUgJiBUb29sUHVycG9zZUZsYWdCaXRzRVhUOjplRGVidWdSZXBvcnRpbmcgKSByZXN1bHQgKz0gIkRlYnVnUmVwb3J0aW5nIHwgIjsKKyAgICBpZiAoIHZhbHVlICYgVG9vbFB1cnBvc2VGbGFnQml0c0VYVDo6ZURlYnVnTWFya2VycyApIHJlc3VsdCArPSAiRGVidWdNYXJrZXJzIHwgIjsKKyAgICByZXR1cm4gInsgIiArIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0LnNpemUoKSAtIDMpICsgIiB9IjsKKyAgfQorCisgIGVudW0gY2xhc3MgVmFsaWRhdGlvbkNhY2hlQ3JlYXRlRmxhZ0JpdHNFWFQKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBWYWxpZGF0aW9uQ2FjaGVDcmVhdGVGbGFnQml0c0VYVCApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBWYWxpZGF0aW9uQ2FjaGVDcmVhdGVGbGFnc0VYVCA9IEZsYWdzPFZhbGlkYXRpb25DYWNoZUNyZWF0ZUZsYWdCaXRzRVhULCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUZsYWdzRVhUPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFZhbGlkYXRpb25DYWNoZUNyZWF0ZUZsYWdzRVhUICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisgIGVudW0gY2xhc3MgVmlTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNOTgorICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFZpU3VyZmFjZUNyZWF0ZUZsYWdCaXRzTk4gKQorICB7CisgICAgcmV0dXJuICIodm9pZCkiOworICB9CisKKyAgdXNpbmcgVmlTdXJmYWNlQ3JlYXRlRmxhZ3NOTiA9IEZsYWdzPFZpU3VyZmFjZUNyZWF0ZUZsYWdCaXRzTk4sIFZrVmlTdXJmYWNlQ3JlYXRlRmxhZ3NOTj47CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBWaVN1cmZhY2VDcmVhdGVGbGFnc05OICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1ZJX05OKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICBlbnVtIGNsYXNzIFdheWxhbmRTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNLSFIKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBXYXlsYW5kU3VyZmFjZUNyZWF0ZUZsYWdCaXRzS0hSICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIFdheWxhbmRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgPSBGbGFnczxXYXlsYW5kU3VyZmFjZUNyZWF0ZUZsYWdCaXRzS0hSLCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggV2F5bGFuZFN1cmZhY2VDcmVhdGVGbGFnc0tIUiAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIGVudW0gY2xhc3MgV2luMzJTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNLSFIKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBXaW4zMlN1cmZhY2VDcmVhdGVGbGFnQml0c0tIUiApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBXaW4zMlN1cmZhY2VDcmVhdGVGbGFnc0tIUiA9IEZsYWdzPFdpbjMyU3VyZmFjZUNyZWF0ZUZsYWdCaXRzS0hSLCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUZsYWdzS0hSPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFdpbjMyU3VyZmFjZUNyZWF0ZUZsYWdzS0hSICApCisgIHsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICBlbnVtIGNsYXNzIFhjYlN1cmZhY2VDcmVhdGVGbGFnQml0c0tIUgorICB7fTsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFhjYlN1cmZhY2VDcmVhdGVGbGFnQml0c0tIUiApCisgIHsKKyAgICByZXR1cm4gIih2b2lkKSI7CisgIH0KKworICB1c2luZyBYY2JTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgPSBGbGFnczxYY2JTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNLSFIsIFZrWGNiU3VyZmFjZUNyZWF0ZUZsYWdzS0hSPjsKKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoIFhjYlN1cmZhY2VDcmVhdGVGbGFnc0tIUiAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICBlbnVtIGNsYXNzIFhsaWJTdXJmYWNlQ3JlYXRlRmxhZ0JpdHNLSFIKKyAge307CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCBYbGliU3VyZmFjZUNyZWF0ZUZsYWdCaXRzS0hSICkKKyAgeworICAgIHJldHVybiAiKHZvaWQpIjsKKyAgfQorCisgIHVzaW5nIFhsaWJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgPSBGbGFnczxYbGliU3VyZmFjZUNyZWF0ZUZsYWdCaXRzS0hSLCBWa1hsaWJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI+OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyggWGxpYlN1cmZhY2VDcmVhdGVGbGFnc0tIUiAgKQorICB7CisgICAgcmV0dXJuICJ7fSI7CisgIH0KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YTElCX0tIUiovCit9IC8vIG5hbWVzcGFjZSBWVUxLQU5fSFBQX05BTUVTUEFDRQorCituYW1lc3BhY2Ugc3RkCit7CisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc3VsdD4gOiBwdWJsaWMgdHJ1ZV90eXBlCisgIHt9OworfQorCituYW1lc3BhY2UgVlVMS0FOX0hQUF9OQU1FU1BBQ0UKK3sKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgIGNsYXNzIEVycm9yQ2F0ZWdvcnlJbXBsIDogcHVibGljIHN0ZDo6ZXJyb3JfY2F0ZWdvcnkKKyAgeworICAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUIG92ZXJyaWRlIHsgcmV0dXJuIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlJlc3VsdCI7IH0KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIG1lc3NhZ2UoaW50IGV2KSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0b19zdHJpbmcoc3RhdGljX2Nhc3Q8UmVzdWx0PihldikpOyB9CisgIH07CisKKyAgY2xhc3MgRXJyb3IKKyAgeworICAgIHB1YmxpYzoKKyAgICBFcnJvcigpIFZVTEtBTl9IUFBfTk9FWENFUFQgPSBkZWZhdWx0OworICAgIEVycm9yKGNvbnN0IEVycm9yJikgVlVMS0FOX0hQUF9OT0VYQ0VQVCA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+RXJyb3IoKSBWVUxLQU5fSFBQX05PRVhDRVBUID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQgPSAwOworICB9OworCisgIGNsYXNzIExvZ2ljRXJyb3IgOiBwdWJsaWMgRXJyb3IsIHB1YmxpYyBzdGQ6OmxvZ2ljX2Vycm9yCisgIHsKKyAgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTG9naWNFcnJvciggY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQgKQorICAgICAgOiBFcnJvcigpLCBzdGQ6OmxvZ2ljX2Vycm9yKHdoYXQpIHt9CisgICAgZXhwbGljaXQgTG9naWNFcnJvciggY2hhciBjb25zdCAqIHdoYXQgKQorICAgICAgOiBFcnJvcigpLCBzdGQ6OmxvZ2ljX2Vycm9yKHdoYXQpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUIHsgcmV0dXJuIHN0ZDo6bG9naWNfZXJyb3I6OndoYXQoKTsgfQorICB9OworCisgIGNsYXNzIFN5c3RlbUVycm9yIDogcHVibGljIEVycm9yLCBwdWJsaWMgc3RkOjpzeXN0ZW1fZXJyb3IKKyAgeworICAgIHB1YmxpYzoKKyAgICBTeXN0ZW1FcnJvciggc3RkOjplcnJvcl9jb2RlIGVjICkKKyAgICAgIDogRXJyb3IoKSwgc3RkOjpzeXN0ZW1fZXJyb3IoZWMpIHt9CisgICAgU3lzdGVtRXJyb3IoIHN0ZDo6ZXJyb3JfY29kZSBlYywgc3RkOjpzdHJpbmcgY29uc3QmIHdoYXQgKQorICAgICAgOiBFcnJvcigpLCBzdGQ6OnN5c3RlbV9lcnJvcihlYywgd2hhdCkge30KKyAgICBTeXN0ZW1FcnJvciggc3RkOjplcnJvcl9jb2RlIGVjLCBjaGFyIGNvbnN0ICogd2hhdCApCisgICAgICA6IEVycm9yKCksIHN0ZDo6c3lzdGVtX2Vycm9yKGVjLCB3aGF0KSB7fQorICAgIFN5c3RlbUVycm9yKCBpbnQgZXYsIHN0ZDo6ZXJyb3JfY2F0ZWdvcnkgY29uc3QmIGVjYXQgKQorICAgICAgOiBFcnJvcigpLCBzdGQ6OnN5c3RlbV9lcnJvcihldiwgZWNhdCkge30KKyAgICBTeXN0ZW1FcnJvciggaW50IGV2LCBzdGQ6OmVycm9yX2NhdGVnb3J5IGNvbnN0JiBlY2F0LCBzdGQ6OnN0cmluZyBjb25zdCYgd2hhdCkKKyAgICAgIDogRXJyb3IoKSwgc3RkOjpzeXN0ZW1fZXJyb3IoZXYsIGVjYXQsIHdoYXQpIHt9CisgICAgU3lzdGVtRXJyb3IoIGludCBldiwgc3RkOjplcnJvcl9jYXRlZ29yeSBjb25zdCYgZWNhdCwgY2hhciBjb25zdCAqIHdoYXQpCisgICAgICA6IEVycm9yKCksIHN0ZDo6c3lzdGVtX2Vycm9yKGV2LCBlY2F0LCB3aGF0KSB7fQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IHJldHVybiBzdGQ6OnN5c3RlbV9lcnJvcjo6d2hhdCgpOyB9CisgIH07CisKKyAgVlVMS0FOX0hQUF9JTkxJTkUgY29uc3Qgc3RkOjplcnJvcl9jYXRlZ29yeSYgZXJyb3JDYXRlZ29yeSgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHN0YXRpYyBFcnJvckNhdGVnb3J5SW1wbCBpbnN0YW5jZTsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OmVycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKFJlc3VsdCBlKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4oZSksIGVycm9yQ2F0ZWdvcnkoKSk7CisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OmVycm9yX2NvbmRpdGlvbiBtYWtlX2Vycm9yX2NvbmRpdGlvbihSZXN1bHQgZSkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29uZGl0aW9uKHN0YXRpY19jYXN0PGludD4oZSksIGVycm9yQ2F0ZWdvcnkoKSk7CisgIH0KKworICBjbGFzcyBPdXRPZkhvc3RNZW1vcnlFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBPdXRPZkhvc3RNZW1vcnlFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvck91dE9mSG9zdE1lbW9yeSApLCBtZXNzYWdlICkge30KKyAgICBPdXRPZkhvc3RNZW1vcnlFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvck91dE9mSG9zdE1lbW9yeSApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBPdXRPZkRldmljZU1lbW9yeUVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIE91dE9mRGV2aWNlTWVtb3J5RXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JPdXRPZkRldmljZU1lbW9yeSApLCBtZXNzYWdlICkge30KKyAgICBPdXRPZkRldmljZU1lbW9yeUVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yT3V0T2ZEZXZpY2VNZW1vcnkgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgSW5pdGlhbGl6YXRpb25GYWlsZWRFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBJbml0aWFsaXphdGlvbkZhaWxlZEVycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9ySW5pdGlhbGl6YXRpb25GYWlsZWQgKSwgbWVzc2FnZSApIHt9CisgICAgSW5pdGlhbGl6YXRpb25GYWlsZWRFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckluaXRpYWxpemF0aW9uRmFpbGVkICksIG1lc3NhZ2UgKSB7fQorICB9OworCisgIGNsYXNzIERldmljZUxvc3RFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBEZXZpY2VMb3N0RXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JEZXZpY2VMb3N0ICksIG1lc3NhZ2UgKSB7fQorICAgIERldmljZUxvc3RFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckRldmljZUxvc3QgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgTWVtb3J5TWFwRmFpbGVkRXJyb3IgOiBwdWJsaWMgU3lzdGVtRXJyb3IKKyAgeworICBwdWJsaWM6CisgICAgTWVtb3J5TWFwRmFpbGVkRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JNZW1vcnlNYXBGYWlsZWQgKSwgbWVzc2FnZSApIHt9CisgICAgTWVtb3J5TWFwRmFpbGVkRXJyb3IoIGNoYXIgY29uc3QgKiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JNZW1vcnlNYXBGYWlsZWQgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgTGF5ZXJOb3RQcmVzZW50RXJyb3IgOiBwdWJsaWMgU3lzdGVtRXJyb3IKKyAgeworICBwdWJsaWM6CisgICAgTGF5ZXJOb3RQcmVzZW50RXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JMYXllck5vdFByZXNlbnQgKSwgbWVzc2FnZSApIHt9CisgICAgTGF5ZXJOb3RQcmVzZW50RXJyb3IoIGNoYXIgY29uc3QgKiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JMYXllck5vdFByZXNlbnQgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgRXh0ZW5zaW9uTm90UHJlc2VudEVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIEV4dGVuc2lvbk5vdFByZXNlbnRFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckV4dGVuc2lvbk5vdFByZXNlbnQgKSwgbWVzc2FnZSApIHt9CisgICAgRXh0ZW5zaW9uTm90UHJlc2VudEVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yRXh0ZW5zaW9uTm90UHJlc2VudCApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBGZWF0dXJlTm90UHJlc2VudEVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIEZlYXR1cmVOb3RQcmVzZW50RXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JGZWF0dXJlTm90UHJlc2VudCApLCBtZXNzYWdlICkge30KKyAgICBGZWF0dXJlTm90UHJlc2VudEVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yRmVhdHVyZU5vdFByZXNlbnQgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgSW5jb21wYXRpYmxlRHJpdmVyRXJyb3IgOiBwdWJsaWMgU3lzdGVtRXJyb3IKKyAgeworICBwdWJsaWM6CisgICAgSW5jb21wYXRpYmxlRHJpdmVyRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JJbmNvbXBhdGlibGVEcml2ZXIgKSwgbWVzc2FnZSApIHt9CisgICAgSW5jb21wYXRpYmxlRHJpdmVyRXJyb3IoIGNoYXIgY29uc3QgKiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JJbmNvbXBhdGlibGVEcml2ZXIgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgVG9vTWFueU9iamVjdHNFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBUb29NYW55T2JqZWN0c0Vycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yVG9vTWFueU9iamVjdHMgKSwgbWVzc2FnZSApIHt9CisgICAgVG9vTWFueU9iamVjdHNFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvclRvb01hbnlPYmplY3RzICksIG1lc3NhZ2UgKSB7fQorICB9OworCisgIGNsYXNzIEZvcm1hdE5vdFN1cHBvcnRlZEVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIEZvcm1hdE5vdFN1cHBvcnRlZEVycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yRm9ybWF0Tm90U3VwcG9ydGVkICksIG1lc3NhZ2UgKSB7fQorICAgIEZvcm1hdE5vdFN1cHBvcnRlZEVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yRm9ybWF0Tm90U3VwcG9ydGVkICksIG1lc3NhZ2UgKSB7fQorICB9OworCisgIGNsYXNzIEZyYWdtZW50ZWRQb29sRXJyb3IgOiBwdWJsaWMgU3lzdGVtRXJyb3IKKyAgeworICBwdWJsaWM6CisgICAgRnJhZ21lbnRlZFBvb2xFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckZyYWdtZW50ZWRQb29sICksIG1lc3NhZ2UgKSB7fQorICAgIEZyYWdtZW50ZWRQb29sRXJyb3IoIGNoYXIgY29uc3QgKiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JGcmFnbWVudGVkUG9vbCApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBPdXRPZlBvb2xNZW1vcnlFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBPdXRPZlBvb2xNZW1vcnlFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvck91dE9mUG9vbE1lbW9yeSApLCBtZXNzYWdlICkge30KKyAgICBPdXRPZlBvb2xNZW1vcnlFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvck91dE9mUG9vbE1lbW9yeSApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBJbnZhbGlkRXh0ZXJuYWxIYW5kbGVFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBJbnZhbGlkRXh0ZXJuYWxIYW5kbGVFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckludmFsaWRFeHRlcm5hbEhhbmRsZSApLCBtZXNzYWdlICkge30KKyAgICBJbnZhbGlkRXh0ZXJuYWxIYW5kbGVFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckludmFsaWRFeHRlcm5hbEhhbmRsZSApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBTdXJmYWNlTG9zdEtIUkVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIFN1cmZhY2VMb3N0S0hSRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JTdXJmYWNlTG9zdEtIUiApLCBtZXNzYWdlICkge30KKyAgICBTdXJmYWNlTG9zdEtIUkVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yU3VyZmFjZUxvc3RLSFIgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgTmF0aXZlV2luZG93SW5Vc2VLSFJFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBOYXRpdmVXaW5kb3dJblVzZUtIUkVycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yTmF0aXZlV2luZG93SW5Vc2VLSFIgKSwgbWVzc2FnZSApIHt9CisgICAgTmF0aXZlV2luZG93SW5Vc2VLSFJFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvck5hdGl2ZVdpbmRvd0luVXNlS0hSICksIG1lc3NhZ2UgKSB7fQorICB9OworCisgIGNsYXNzIE91dE9mRGF0ZUtIUkVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIE91dE9mRGF0ZUtIUkVycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yT3V0T2ZEYXRlS0hSICksIG1lc3NhZ2UgKSB7fQorICAgIE91dE9mRGF0ZUtIUkVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yT3V0T2ZEYXRlS0hSICksIG1lc3NhZ2UgKSB7fQorICB9OworCisgIGNsYXNzIEluY29tcGF0aWJsZURpc3BsYXlLSFJFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBJbmNvbXBhdGlibGVEaXNwbGF5S0hSRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JJbmNvbXBhdGlibGVEaXNwbGF5S0hSICksIG1lc3NhZ2UgKSB7fQorICAgIEluY29tcGF0aWJsZURpc3BsYXlLSFJFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckluY29tcGF0aWJsZURpc3BsYXlLSFIgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgVmFsaWRhdGlvbkZhaWxlZEVYVEVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIFZhbGlkYXRpb25GYWlsZWRFWFRFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvclZhbGlkYXRpb25GYWlsZWRFWFQgKSwgbWVzc2FnZSApIHt9CisgICAgVmFsaWRhdGlvbkZhaWxlZEVYVEVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yVmFsaWRhdGlvbkZhaWxlZEVYVCApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBJbnZhbGlkU2hhZGVyTlZFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBJbnZhbGlkU2hhZGVyTlZFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckludmFsaWRTaGFkZXJOViApLCBtZXNzYWdlICkge30KKyAgICBJbnZhbGlkU2hhZGVyTlZFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckludmFsaWRTaGFkZXJOViApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBJbnZhbGlkRHJtRm9ybWF0TW9kaWZpZXJQbGFuZUxheW91dEVYVEVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIEludmFsaWREcm1Gb3JtYXRNb2RpZmllclBsYW5lTGF5b3V0RVhURXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkKKyAgICAgIDogU3lzdGVtRXJyb3IoIG1ha2VfZXJyb3JfY29kZSggUmVzdWx0OjplRXJyb3JJbnZhbGlkRHJtRm9ybWF0TW9kaWZpZXJQbGFuZUxheW91dEVYVCApLCBtZXNzYWdlICkge30KKyAgICBJbnZhbGlkRHJtRm9ybWF0TW9kaWZpZXJQbGFuZUxheW91dEVYVEVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9ySW52YWxpZERybUZvcm1hdE1vZGlmaWVyUGxhbmVMYXlvdXRFWFQgKSwgbWVzc2FnZSApIHt9CisgIH07CisKKyAgY2xhc3MgRnJhZ21lbnRhdGlvbkVYVEVycm9yIDogcHVibGljIFN5c3RlbUVycm9yCisgIHsKKyAgcHVibGljOgorICAgIEZyYWdtZW50YXRpb25FWFRFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckZyYWdtZW50YXRpb25FWFQgKSwgbWVzc2FnZSApIHt9CisgICAgRnJhZ21lbnRhdGlvbkVYVEVycm9yKCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgICAgICA6IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIFJlc3VsdDo6ZUVycm9yRnJhZ21lbnRhdGlvbkVYVCApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBOb3RQZXJtaXR0ZWRFWFRFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBOb3RQZXJtaXR0ZWRFWFRFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvck5vdFBlcm1pdHRlZEVYVCApLCBtZXNzYWdlICkge30KKyAgICBOb3RQZXJtaXR0ZWRFWFRFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvck5vdFBlcm1pdHRlZEVYVCApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUxvc3RFWFRFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUxvc3RFWFRFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlTG9zdEVYVCApLCBtZXNzYWdlICkge30KKyAgICBGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUxvc3RFWFRFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlTG9zdEVYVCApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBjbGFzcyBJbnZhbGlkT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFJFcnJvciA6IHB1YmxpYyBTeXN0ZW1FcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBJbnZhbGlkT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFJFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckludmFsaWRPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiApLCBtZXNzYWdlICkge30KKyAgICBJbnZhbGlkT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFJFcnJvciggY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICAgICAgOiBTeXN0ZW1FcnJvciggbWFrZV9lcnJvcl9jb2RlKCBSZXN1bHQ6OmVFcnJvckludmFsaWRPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiApLCBtZXNzYWdlICkge30KKyAgfTsKKworICBbW25vcmV0dXJuXV0gc3RhdGljIHZvaWQgdGhyb3dSZXN1bHRFeGNlcHRpb24oIFJlc3VsdCByZXN1bHQsIGNoYXIgY29uc3QgKiBtZXNzYWdlICkKKyAgeworICAgIHN3aXRjaCAoIHJlc3VsdCApCisgICAgeworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvck91dE9mSG9zdE1lbW9yeTogdGhyb3cgT3V0T2ZIb3N0TWVtb3J5RXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JPdXRPZkRldmljZU1lbW9yeTogdGhyb3cgT3V0T2ZEZXZpY2VNZW1vcnlFcnJvciggbWVzc2FnZSApOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckluaXRpYWxpemF0aW9uRmFpbGVkOiB0aHJvdyBJbml0aWFsaXphdGlvbkZhaWxlZEVycm9yKCBtZXNzYWdlICk7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yRGV2aWNlTG9zdDogdGhyb3cgRGV2aWNlTG9zdEVycm9yKCBtZXNzYWdlICk7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yTWVtb3J5TWFwRmFpbGVkOiB0aHJvdyBNZW1vcnlNYXBGYWlsZWRFcnJvciggbWVzc2FnZSApOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckxheWVyTm90UHJlc2VudDogdGhyb3cgTGF5ZXJOb3RQcmVzZW50RXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JFeHRlbnNpb25Ob3RQcmVzZW50OiB0aHJvdyBFeHRlbnNpb25Ob3RQcmVzZW50RXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JGZWF0dXJlTm90UHJlc2VudDogdGhyb3cgRmVhdHVyZU5vdFByZXNlbnRFcnJvciggbWVzc2FnZSApOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckluY29tcGF0aWJsZURyaXZlcjogdGhyb3cgSW5jb21wYXRpYmxlRHJpdmVyRXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JUb29NYW55T2JqZWN0czogdGhyb3cgVG9vTWFueU9iamVjdHNFcnJvciggbWVzc2FnZSApOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckZvcm1hdE5vdFN1cHBvcnRlZDogdGhyb3cgRm9ybWF0Tm90U3VwcG9ydGVkRXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JGcmFnbWVudGVkUG9vbDogdGhyb3cgRnJhZ21lbnRlZFBvb2xFcnJvciggbWVzc2FnZSApOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvck91dE9mUG9vbE1lbW9yeTogdGhyb3cgT3V0T2ZQb29sTWVtb3J5RXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JJbnZhbGlkRXh0ZXJuYWxIYW5kbGU6IHRocm93IEludmFsaWRFeHRlcm5hbEhhbmRsZUVycm9yKCBtZXNzYWdlICk7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yU3VyZmFjZUxvc3RLSFI6IHRocm93IFN1cmZhY2VMb3N0S0hSRXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JOYXRpdmVXaW5kb3dJblVzZUtIUjogdGhyb3cgTmF0aXZlV2luZG93SW5Vc2VLSFJFcnJvciggbWVzc2FnZSApOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvck91dE9mRGF0ZUtIUjogdGhyb3cgT3V0T2ZEYXRlS0hSRXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JJbmNvbXBhdGlibGVEaXNwbGF5S0hSOiB0aHJvdyBJbmNvbXBhdGlibGVEaXNwbGF5S0hSRXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JWYWxpZGF0aW9uRmFpbGVkRVhUOiB0aHJvdyBWYWxpZGF0aW9uRmFpbGVkRVhURXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JJbnZhbGlkU2hhZGVyTlY6IHRocm93IEludmFsaWRTaGFkZXJOVkVycm9yKCBtZXNzYWdlICk7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9ySW52YWxpZERybUZvcm1hdE1vZGlmaWVyUGxhbmVMYXlvdXRFWFQ6IHRocm93IEludmFsaWREcm1Gb3JtYXRNb2RpZmllclBsYW5lTGF5b3V0RVhURXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JGcmFnbWVudGF0aW9uRVhUOiB0aHJvdyBGcmFnbWVudGF0aW9uRVhURXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGNhc2UgUmVzdWx0OjplRXJyb3JOb3RQZXJtaXR0ZWRFWFQ6IHRocm93IE5vdFBlcm1pdHRlZEVYVEVycm9yKCBtZXNzYWdlICk7CisgICAgICBjYXNlIFJlc3VsdDo6ZUVycm9yRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVMb3N0RVhUOiB0aHJvdyBGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUxvc3RFWFRFcnJvciggbWVzc2FnZSApOworICAgICAgY2FzZSBSZXN1bHQ6OmVFcnJvckludmFsaWRPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUjogdGhyb3cgSW52YWxpZE9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSRXJyb3IoIG1lc3NhZ2UgKTsKKyAgICAgIGRlZmF1bHQ6IHRocm93IFN5c3RlbUVycm9yKCBtYWtlX2Vycm9yX2NvZGUoIHJlc3VsdCApICk7CisgICAgfQorICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBpZ25vcmUoVCBjb25zdCYpIFZVTEtBTl9IUFBfTk9FWENFUFQge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RydWN0IFJlc3VsdFZhbHVlCisgIHsKKyNpZmRlZiBWVUxLQU5fSFBQX0hBU19OT0VYQ0VQVAorICAgIFJlc3VsdFZhbHVlKCBSZXN1bHQgciwgVCAmIHYgKSBWVUxLQU5fSFBQX05PRVhDRVBUKFZVTEtBTl9IUFBfTk9FWENFUFQoVCh2KSkpCisjZWxzZQorICAgIFJlc3VsdFZhbHVlKCBSZXN1bHQgciwgVCAmIHYgKQorI2VuZGlmCisgICAgICA6IHJlc3VsdCggciApCisgICAgICAsIHZhbHVlKCB2ICkKKyAgICB7fQorCisjaWZkZWYgVlVMS0FOX0hQUF9IQVNfTk9FWENFUFQKKyAgICBSZXN1bHRWYWx1ZSggUmVzdWx0IHIsIFQgJiYgdiApIFZVTEtBTl9IUFBfTk9FWENFUFQoVlVMS0FOX0hQUF9OT0VYQ0VQVChUKHN0ZDo6bW92ZSh2KSkpKQorI2Vsc2UKKyAgICBSZXN1bHRWYWx1ZSggUmVzdWx0IHIsIFQgJiYgdiApCisjZW5kaWYKKyAgICAgIDogcmVzdWx0KCByICkKKyAgICAgICwgdmFsdWUoIHN0ZDo6bW92ZSggdiApICkKKyAgICB7fQorCisgICAgUmVzdWx0ICByZXN1bHQ7CisgICAgVCAgICAgICB2YWx1ZTsKKworICAgIG9wZXJhdG9yIHN0ZDo6dHVwbGU8UmVzdWx0JiwgVCY+KCkgVlVMS0FOX0hQUF9OT0VYQ0VQVCB7IHJldHVybiBzdGQ6OnR1cGxlPFJlc3VsdCYsIFQmPihyZXN1bHQsIHZhbHVlKTsgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgUmVzdWx0VmFsdWVUeXBlCisgIHsKKyNpZmRlZiBWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMKKyAgICB0eXBlZGVmIFJlc3VsdFZhbHVlPFQ+ICB0eXBlOworI2Vsc2UKKyAgICB0eXBlZGVmIFQgICAgICAgICAgICAgICB0eXBlOworI2VuZGlmCisgIH07CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IFJlc3VsdFZhbHVlVHlwZTx2b2lkPgorICB7CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgdHlwZWRlZiBSZXN1bHQgdHlwZTsKKyNlbHNlCisgICAgdHlwZWRlZiB2b2lkICAgdHlwZTsKKyNlbmRpZgorICB9OworCisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBjcmVhdGVSZXN1bHRWYWx1ZSggUmVzdWx0IHJlc3VsdCwgY2hhciBjb25zdCAqIG1lc3NhZ2UgKQorICB7CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgaWdub3JlKG1lc3NhZ2UpOworICAgIFZVTEtBTl9IUFBfQVNTRVJUKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApOworICAgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICAgIGlmICggcmVzdWx0ICE9IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIHRocm93UmVzdWx0RXhjZXB0aW9uKCByZXN1bHQsIG1lc3NhZ2UgKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VD46OnR5cGUgY3JlYXRlUmVzdWx0VmFsdWUoIFJlc3VsdCByZXN1bHQsIFQgJiBkYXRhLCBjaGFyIGNvbnN0ICogbWVzc2FnZSApCisgIHsKKyNpZmRlZiBWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMKKyAgICBpZ25vcmUobWVzc2FnZSk7CisgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICk7CisgICAgcmV0dXJuIFJlc3VsdFZhbHVlPFQ+KCByZXN1bHQsIHN0ZDo6bW92ZSggZGF0YSApICk7CisjZWxzZQorICAgIGlmICggcmVzdWx0ICE9IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIHRocm93UmVzdWx0RXhjZXB0aW9uKCByZXN1bHQsIG1lc3NhZ2UgKTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bW92ZSggZGF0YSApOworI2VuZGlmCisgIH0KKworICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgY3JlYXRlUmVzdWx0VmFsdWUoIFJlc3VsdCByZXN1bHQsIGNoYXIgY29uc3QgKiBtZXNzYWdlLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8UmVzdWx0PiBzdWNjZXNzQ29kZXMgKQorICB7CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgaWdub3JlKG1lc3NhZ2UpOworICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBzdGQ6OmZpbmQoIHN1Y2Nlc3NDb2Rlcy5iZWdpbigpLCBzdWNjZXNzQ29kZXMuZW5kKCksIHJlc3VsdCApICE9IHN1Y2Nlc3NDb2Rlcy5lbmQoKSApOworI2Vsc2UKKyAgICBpZiAoIHN0ZDo6ZmluZCggc3VjY2Vzc0NvZGVzLmJlZ2luKCksIHN1Y2Nlc3NDb2Rlcy5lbmQoKSwgcmVzdWx0ICkgPT0gc3VjY2Vzc0NvZGVzLmVuZCgpICkKKyAgICB7CisgICAgICB0aHJvd1Jlc3VsdEV4Y2VwdGlvbiggcmVzdWx0LCBtZXNzYWdlICk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZTxUPiBjcmVhdGVSZXN1bHRWYWx1ZSggUmVzdWx0IHJlc3VsdCwgVCAmIGRhdGEsIGNoYXIgY29uc3QgKiBtZXNzYWdlLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8UmVzdWx0PiBzdWNjZXNzQ29kZXMgKQorICB7CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgaWdub3JlKG1lc3NhZ2UpOworICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBzdGQ6OmZpbmQoIHN1Y2Nlc3NDb2Rlcy5iZWdpbigpLCBzdWNjZXNzQ29kZXMuZW5kKCksIHJlc3VsdCApICE9IHN1Y2Nlc3NDb2Rlcy5lbmQoKSApOworI2Vsc2UKKyAgICBpZiAoIHN0ZDo6ZmluZCggc3VjY2Vzc0NvZGVzLmJlZ2luKCksIHN1Y2Nlc3NDb2Rlcy5lbmQoKSwgcmVzdWx0ICkgPT0gc3VjY2Vzc0NvZGVzLmVuZCgpICkKKyAgICB7CisgICAgICB0aHJvd1Jlc3VsdEV4Y2VwdGlvbiggcmVzdWx0LCBtZXNzYWdlICk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIFJlc3VsdFZhbHVlPFQ+KCByZXN1bHQsIGRhdGEgKTsKKyAgfQorCisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBEPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFQsRD4+Ojp0eXBlIGNyZWF0ZVJlc3VsdFZhbHVlKCBSZXN1bHQgcmVzdWx0LCBUICYgZGF0YSwgY2hhciBjb25zdCAqIG1lc3NhZ2UsIHR5cGVuYW1lIFVuaXF1ZUhhbmRsZVRyYWl0czxULEQ+OjpkZWxldGVyIGNvbnN0JiBkZWxldGVyICkKKyAgeworI2lmZGVmIFZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUworICAgIGlnbm9yZShtZXNzYWdlKTsKKyAgICBWVUxLQU5fSFBQX0FTU0VSVCggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKTsKKyAgICByZXR1cm4gUmVzdWx0VmFsdWU8VW5pcXVlSGFuZGxlPFQsRD4+KCByZXN1bHQsIFVuaXF1ZUhhbmRsZTxULEQ+KGRhdGEsIGRlbGV0ZXIpICk7CisjZWxzZQorICAgIGlmICggcmVzdWx0ICE9IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIHRocm93UmVzdWx0RXhjZXB0aW9uKCByZXN1bHQsIG1lc3NhZ2UgKTsKKyAgICB9CisgICAgcmV0dXJuIFVuaXF1ZUhhbmRsZTxULEQ+KGRhdGEsIGRlbGV0ZXIpOworI2VuZGlmCisgIH0KKyNlbmRpZgorCisgIHN0cnVjdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlY7CisgIHN0cnVjdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY7CisgIHN0cnVjdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlY7CisgIHN0cnVjdCBBY3F1aXJlTmV4dEltYWdlSW5mb0tIUjsKKyAgc3RydWN0IEFjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUjsKKyAgc3RydWN0IEFsbG9jYXRpb25DYWxsYmFja3M7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgIHN0cnVjdCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgIHN0cnVjdCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgIHN0cnVjdCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQ7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICBzdHJ1Y3QgQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKyAgc3RydWN0IEFwcGxpY2F0aW9uSW5mbzsKKyAgc3RydWN0IEF0dGFjaG1lbnREZXNjcmlwdGlvbjsKKyAgc3RydWN0IEF0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFI7CisgIHN0cnVjdCBBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSOworICBzdHJ1Y3QgQXR0YWNobWVudFJlZmVyZW5jZTsKKyAgc3RydWN0IEF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSOworICBzdHJ1Y3QgQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFI7CisgIHN0cnVjdCBBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUOworICBzdHJ1Y3QgQmFzZUluU3RydWN0dXJlOworICBzdHJ1Y3QgQmFzZU91dFN0cnVjdHVyZTsKKyAgc3RydWN0IEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlY7CisgIHN0cnVjdCBCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvOworICB1c2luZyBCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvS0hSID0gQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbzsKKyAgc3RydWN0IEJpbmRCdWZmZXJNZW1vcnlJbmZvOworICB1c2luZyBCaW5kQnVmZmVyTWVtb3J5SW5mb0tIUiA9IEJpbmRCdWZmZXJNZW1vcnlJbmZvOworICBzdHJ1Y3QgQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvOworICB1c2luZyBCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm9LSFIgPSBCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm87CisgIHN0cnVjdCBCaW5kSW1hZ2VNZW1vcnlJbmZvOworICB1c2luZyBCaW5kSW1hZ2VNZW1vcnlJbmZvS0hSID0gQmluZEltYWdlTWVtb3J5SW5mbzsKKyAgc3RydWN0IEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFI7CisgIHN0cnVjdCBCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm87CisgIHVzaW5nIEJpbmRJbWFnZVBsYW5lTWVtb3J5SW5mb0tIUiA9IEJpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbzsKKyAgc3RydWN0IEJpbmRTcGFyc2VJbmZvOworICBzdHJ1Y3QgQnVmZmVyQ29weTsKKyAgc3RydWN0IEJ1ZmZlckNyZWF0ZUluZm87CisgIHN0cnVjdCBCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSOworICB1c2luZyBCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0VYVCA9IEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSOworICBzdHJ1Y3QgQnVmZmVySW1hZ2VDb3B5OworICBzdHJ1Y3QgQnVmZmVyTWVtb3J5QmFycmllcjsKKyAgc3RydWN0IEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yOworICB1c2luZyBCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiA9IEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yOworICBzdHJ1Y3QgQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSOworICBzdHJ1Y3QgQnVmZmVyVmlld0NyZWF0ZUluZm87CisgIHN0cnVjdCBDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVDsKKyAgc3RydWN0IENoZWNrcG9pbnREYXRhTlY7CisgIHN0cnVjdCBDbGVhckF0dGFjaG1lbnQ7CisgIHVuaW9uIENsZWFyQ29sb3JWYWx1ZTsKKyAgc3RydWN0IENsZWFyRGVwdGhTdGVuY2lsVmFsdWU7CisgIHN0cnVjdCBDbGVhclJlY3Q7CisgIHVuaW9uIENsZWFyVmFsdWU7CisgIHN0cnVjdCBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYOworICBzdHJ1Y3QgQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYOworICBzdHJ1Y3QgQ29hcnNlU2FtcGxlTG9jYXRpb25OVjsKKyAgc3RydWN0IENvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlY7CisgIHN0cnVjdCBDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvOworICBzdHJ1Y3QgQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzsKKyAgc3RydWN0IENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVDsKKyAgc3RydWN0IENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm87CisgIHN0cnVjdCBDb21tYW5kUG9vbENyZWF0ZUluZm87CisgIHN0cnVjdCBDb21wb25lbnRNYXBwaW5nOworICBzdHJ1Y3QgQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbzsKKyAgc3RydWN0IENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUOworICBzdHJ1Y3QgQ29uZm9ybWFuY2VWZXJzaW9uS0hSOworICBzdHJ1Y3QgQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY7CisgIHN0cnVjdCBDb3B5RGVzY3JpcHRvclNldDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHN0cnVjdCBEM0QxMkZlbmNlU3VibWl0SW5mb0tIUjsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICBzdHJ1Y3QgRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUOworICBzdHJ1Y3QgRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVDsKKyAgc3RydWN0IERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVDsKKyAgc3RydWN0IERlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgRGVidWdVdGlsc0xhYmVsRVhUOworICBzdHJ1Y3QgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVDsKKyAgc3RydWN0IERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUOworICBzdHJ1Y3QgRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQ7CisgIHN0cnVjdCBEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WOworICBzdHJ1Y3QgRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WOworICBzdHJ1Y3QgRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WOworICBzdHJ1Y3QgRGVzY3JpcHRvckJ1ZmZlckluZm87CisgIHN0cnVjdCBEZXNjcmlwdG9ySW1hZ2VJbmZvOworICBzdHJ1Y3QgRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvOworICBzdHJ1Y3QgRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgRGVzY3JpcHRvclBvb2xTaXplOworICBzdHJ1Y3QgRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbzsKKyAgc3RydWN0IERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nOworICBzdHJ1Y3QgRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQ7CisgIHN0cnVjdCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbzsKKyAgc3RydWN0IERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0OworICB1c2luZyBEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiA9IERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0OworICBzdHJ1Y3QgRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUOworICBzdHJ1Y3QgRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVDsKKyAgc3RydWN0IERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm87CisgIHVzaW5nIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm9LSFIgPSBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvOworICBzdHJ1Y3QgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnk7CisgIHVzaW5nIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5S0hSID0gRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnk7CisgIHN0cnVjdCBEZXZpY2VDcmVhdGVJbmZvOworICBzdHJ1Y3QgRGV2aWNlRXZlbnRJbmZvRVhUOworICBzdHJ1Y3QgRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWDsKKyAgc3RydWN0IERldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYOworICBzdHJ1Y3QgRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbzsKKyAgdXNpbmcgRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mb0tIUiA9IERldmljZUdyb3VwQmluZFNwYXJzZUluZm87CisgIHN0cnVjdCBEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm87CisgIHVzaW5nIERldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mb0tIUiA9IERldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzsKKyAgc3RydWN0IERldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbzsKKyAgdXNpbmcgRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvS0hSID0gRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvOworICBzdHJ1Y3QgRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSOworICBzdHJ1Y3QgRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUjsKKyAgc3RydWN0IERldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbzsKKyAgdXNpbmcgRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvS0hSID0gRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvOworICBzdHJ1Y3QgRGV2aWNlR3JvdXBTdWJtaXRJbmZvOworICB1c2luZyBEZXZpY2VHcm91cFN1Ym1pdEluZm9LSFIgPSBEZXZpY2VHcm91cFN1Ym1pdEluZm87CisgIHN0cnVjdCBEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFI7CisgIHN0cnVjdCBEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFI7CisgIHN0cnVjdCBEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQ7CisgIHN0cnVjdCBEZXZpY2VRdWV1ZUNyZWF0ZUluZm87CisgIHN0cnVjdCBEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IERldmljZVF1ZXVlSW5mbzI7CisgIHN0cnVjdCBEaXNwYXRjaEluZGlyZWN0Q29tbWFuZDsKKyAgc3RydWN0IERpc3BsYXlFdmVudEluZm9FWFQ7CisgIHN0cnVjdCBEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFI7CisgIHN0cnVjdCBEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFI7CisgIHN0cnVjdCBEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSOworICBzdHJ1Y3QgRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSOworICBzdHJ1Y3QgRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ7CisgIHN0cnVjdCBEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSOworICBzdHJ1Y3QgRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSOworICBzdHJ1Y3QgRGlzcGxheVBsYW5lSW5mbzJLSFI7CisgIHN0cnVjdCBEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUjsKKyAgc3RydWN0IERpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFI7CisgIHN0cnVjdCBEaXNwbGF5UG93ZXJJbmZvRVhUOworICBzdHJ1Y3QgRGlzcGxheVByZXNlbnRJbmZvS0hSOworICBzdHJ1Y3QgRGlzcGxheVByb3BlcnRpZXMyS0hSOworICBzdHJ1Y3QgRGlzcGxheVByb3BlcnRpZXNLSFI7CisgIHN0cnVjdCBEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFI7CisgIHN0cnVjdCBEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZDsKKyAgc3RydWN0IERyYXdJbmRpcmVjdENvbW1hbmQ7CisgIHN0cnVjdCBEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlY7CisgIHN0cnVjdCBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ7CisgIHN0cnVjdCBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUOworICBzdHJ1Y3QgRXZlbnRDcmVhdGVJbmZvOworICBzdHJ1Y3QgRXhwb3J0RmVuY2VDcmVhdGVJbmZvOworICB1c2luZyBFeHBvcnRGZW5jZUNyZWF0ZUluZm9LSFIgPSBFeHBvcnRGZW5jZUNyZWF0ZUluZm87CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICBzdHJ1Y3QgRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgc3RydWN0IEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzsKKyAgdXNpbmcgRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvS0hSID0gRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOworICBzdHJ1Y3QgRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlY7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICBzdHJ1Y3QgRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICBzdHJ1Y3QgRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgc3RydWN0IEV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm87CisgIHVzaW5nIEV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm9LSFIgPSBFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgc3RydWN0IEV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICBzdHJ1Y3QgRXh0ZW5zaW9uUHJvcGVydGllczsKKyAgc3RydWN0IEV4dGVudDJEOworICBzdHJ1Y3QgRXh0ZW50M0Q7CisgIHN0cnVjdCBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CisgIHVzaW5nIEV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiA9IEV4dGVybmFsQnVmZmVyUHJvcGVydGllczsKKyAgc3RydWN0IEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworICB1c2luZyBFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiA9IEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICBzdHJ1Y3QgRXh0ZXJuYWxGb3JtYXRBTkRST0lEOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKyAgc3RydWN0IEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICB1c2luZyBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc0tIUiA9IEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICBzdHJ1Y3QgRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVjsKKyAgc3RydWN0IEV4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzsKKyAgdXNpbmcgRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvS0hSID0gRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvOworICBzdHJ1Y3QgRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm87CisgIHVzaW5nIEV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvS0hSID0gRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm87CisgIHN0cnVjdCBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WOworICBzdHJ1Y3QgRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzOworICB1c2luZyBFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXNLSFIgPSBFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXM7CisgIHN0cnVjdCBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CisgIHVzaW5nIEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiA9IEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczsKKyAgc3RydWN0IEZlbmNlQ3JlYXRlSW5mbzsKKyAgc3RydWN0IEZlbmNlR2V0RmRJbmZvS0hSOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgc3RydWN0IEZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgIHN0cnVjdCBGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDsKKyAgc3RydWN0IEZvcm1hdFByb3BlcnRpZXM7CisgIHN0cnVjdCBGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgdXNpbmcgRm9ybWF0UHJvcGVydGllczJLSFIgPSBGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgc3RydWN0IEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUjsKKyAgc3RydWN0IEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSOworICBzdHJ1Y3QgRnJhbWVidWZmZXJDcmVhdGVJbmZvOworICBzdHJ1Y3QgRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WOworICBzdHJ1Y3QgR2VvbWV0cnlBQUJCTlY7CisgIHN0cnVjdCBHZW9tZXRyeURhdGFOVjsKKyAgc3RydWN0IEdlb21ldHJ5TlY7CisgIHN0cnVjdCBHZW9tZXRyeVRyaWFuZ2xlc05WOworICBzdHJ1Y3QgR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm87CisgIHN0cnVjdCBIZHJNZXRhZGF0YUVYVDsKKyAgc3RydWN0IEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQ7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyAgc3RydWN0IElPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0lPU19NVksqLworICBzdHJ1Y3QgSW1hZ2VCbGl0OworICBzdHJ1Y3QgSW1hZ2VDb3B5OworICBzdHJ1Y3QgSW1hZ2VDcmVhdGVJbmZvOworICBzdHJ1Y3QgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IEltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjsKKyAgc3RydWN0IEltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgc3RydWN0IEltYWdlRm9ybWF0UHJvcGVydGllczI7CisgIHVzaW5nIEltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgPSBJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworICBzdHJ1Y3QgSW1hZ2VNZW1vcnlCYXJyaWVyOworICBzdHJ1Y3QgSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjsKKyAgdXNpbmcgSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiA9IEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgc3RydWN0IEltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9GVUNIU0lBKi8KKyAgc3RydWN0IEltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvOworICB1c2luZyBJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mb0tIUiA9IEltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvOworICBzdHJ1Y3QgSW1hZ2VSZXNvbHZlOworICBzdHJ1Y3QgSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjsKKyAgdXNpbmcgSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiA9IEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI7CisgIHN0cnVjdCBJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ7CisgIHN0cnVjdCBJbWFnZVN1YnJlc291cmNlOworICBzdHJ1Y3QgSW1hZ2VTdWJyZXNvdXJjZUxheWVyczsKKyAgc3RydWN0IEltYWdlU3VicmVzb3VyY2VSYW5nZTsKKyAgc3RydWN0IEltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjsKKyAgc3RydWN0IEltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUOworICBzdHJ1Y3QgSW1hZ2VWaWV3Q3JlYXRlSW5mbzsKKyAgc3RydWN0IEltYWdlVmlld0hhbmRsZUluZm9OVlg7CisgIHN0cnVjdCBJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm87CisgIHVzaW5nIEltYWdlVmlld1VzYWdlQ3JlYXRlSW5mb0tIUiA9IEltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbzsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgc3RydWN0IEltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKyAgc3RydWN0IEltcG9ydEZlbmNlRmRJbmZvS0hSOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgc3RydWN0IEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgIHN0cnVjdCBJbXBvcnRNZW1vcnlGZEluZm9LSFI7CisgIHN0cnVjdCBJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICBzdHJ1Y3QgSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICBzdHJ1Y3QgSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgc3RydWN0IEltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUjsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHN0cnVjdCBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgc3RydWN0IEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYOworICBzdHJ1Y3QgSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYOworICBzdHJ1Y3QgSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYOworICBzdHJ1Y3QgSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMOworICBzdHJ1Y3QgSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlOworICB1c2luZyBJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2VLSFIgPSBJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2U7CisgIHN0cnVjdCBJbnN0YW5jZUNyZWF0ZUluZm87CisgIHN0cnVjdCBMYXllclByb3BlcnRpZXM7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICBzdHJ1Y3QgTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSzsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9NQUNPU19NVksqLworICBzdHJ1Y3QgTWFwcGVkTWVtb3J5UmFuZ2U7CisgIHN0cnVjdCBNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzsKKyAgdXNpbmcgTWVtb3J5QWxsb2NhdGVGbGFnc0luZm9LSFIgPSBNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzsKKyAgc3RydWN0IE1lbW9yeUFsbG9jYXRlSW5mbzsKKyAgc3RydWN0IE1lbW9yeUJhcnJpZXI7CisgIHN0cnVjdCBNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm87CisgIHVzaW5nIE1lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb0tIUiA9IE1lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzsKKyAgc3RydWN0IE1lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50czsKKyAgdXNpbmcgTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzS0hSID0gTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzOworICBzdHJ1Y3QgTWVtb3J5RmRQcm9wZXJ0aWVzS0hSOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICBzdHJ1Y3QgTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworICBzdHJ1Y3QgTWVtb3J5R2V0RmRJbmZvS0hSOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgc3RydWN0IE1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUjsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICBzdHJ1Y3QgTWVtb3J5SGVhcDsKKyAgc3RydWN0IE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDsKKyAgc3RydWN0IE1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSOworICBzdHJ1Y3QgTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQ7CisgIHN0cnVjdCBNZW1vcnlSZXF1aXJlbWVudHM7CisgIHN0cnVjdCBNZW1vcnlSZXF1aXJlbWVudHMyOworICB1c2luZyBNZW1vcnlSZXF1aXJlbWVudHMyS0hSID0gTWVtb3J5UmVxdWlyZW1lbnRzMjsKKyAgc3RydWN0IE1lbW9yeVR5cGU7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICBzdHJ1Y3QgTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICBzdHJ1Y3QgTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQqLworICBzdHJ1Y3QgTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYOworICBzdHJ1Y3QgT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlg7CisgIHN0cnVjdCBPYmplY3RUYWJsZUVudHJ5TlZYOworICBzdHJ1Y3QgT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYOworICBzdHJ1Y3QgT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYOworICBzdHJ1Y3QgT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWDsKKyAgc3RydWN0IE9iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlg7CisgIHN0cnVjdCBPZmZzZXQyRDsKKyAgc3RydWN0IE9mZnNldDNEOworICBzdHJ1Y3QgUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRTsKKyAgc3RydWN0IFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUw7CisgIHN0cnVjdCBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUjsKKyAgc3RydWN0IFBlcmZvcm1hbmNlQ291bnRlcktIUjsKKyAgdW5pb24gUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSOworICBzdHJ1Y3QgUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUw7CisgIHN0cnVjdCBQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMOworICBzdHJ1Y3QgUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFI7CisgIHN0cnVjdCBQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTDsKKyAgdW5pb24gUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTDsKKyAgc3RydWN0IFBlcmZvcm1hbmNlVmFsdWVJTlRFTDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM7CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXNLSFIgPSBQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVDsKKyAgdXNpbmcgUGh5c2ljYWxEZXZpY2VCdWZmZXJBZGRyZXNzRmVhdHVyZXNFWFQgPSBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFI7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlY7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbzsKKyAgdXNpbmcgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm9LSFIgPSBQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbzsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm87CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm9LSFIgPSBQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbzsKKyAgdXNpbmcgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mb0tIUiA9IFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm87CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbzsKKyAgdXNpbmcgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm9LSFIgPSBQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbzsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRmVhdHVyZXM7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUZlYXR1cmVzMjsKKyAgdXNpbmcgUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPSBQaHlzaWNhbERldmljZUZlYXR1cmVzMjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOworICB1c2luZyBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUiA9IFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM7CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzS0hSID0gUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yOworICB1c2luZyBQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzJLSFIgPSBQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzI7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZUxpbWl0czsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzOworICB1c2luZyBQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXNLSFIgPSBQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXM7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyOworICB1c2luZyBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSID0gUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlY7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzOworICB1c2luZyBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzS0hSID0gUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlczsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzOworICB1c2luZyBQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXNLSFIgPSBQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFI7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFI7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzOworICB1c2luZyBQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzS0hSID0gUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllczsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgPSBQaHlzaWNhbERldmljZVByb3BlcnRpZXMyOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlczsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllczsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlY7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXM7CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzS0hSID0gUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXM7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlczsKKyAgdXNpbmcgUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyRmVhdHVyZXMgPSBQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXM7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI7CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlRmxvYXQxNkludDhGZWF0dXJlc0tIUiA9IFBoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUw7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlY7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlY7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzI7CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMktIUiA9IFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMjsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllczsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDsKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFI7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXM7CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzS0hSID0gUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXM7CisgIHVzaW5nIFBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyRmVhdHVyZXNLSFIgPSBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlczsKKyAgdXNpbmcgUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJGZWF0dXJlcyA9IFBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQ7CisgIHN0cnVjdCBQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSOworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQ7CisgIHN0cnVjdCBQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbzsKKyAgc3RydWN0IFBpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlOworICBzdHJ1Y3QgUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvOworICBzdHJ1Y3QgUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EOworICBzdHJ1Y3QgUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVjsKKyAgc3RydWN0IFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OVjsKKyAgc3RydWN0IFBpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlY7CisgIHN0cnVjdCBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUOworICBzdHJ1Y3QgUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm87CisgIHN0cnVjdCBQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ7CisgIHN0cnVjdCBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm87CisgIHN0cnVjdCBQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSOworICBzdHJ1Y3QgUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUjsKKyAgc3RydWN0IFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFI7CisgIHN0cnVjdCBQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFI7CisgIHVuaW9uIFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSOworICBzdHJ1Y3QgUGlwZWxpbmVJbmZvS0hSOworICBzdHJ1Y3QgUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvOworICBzdHJ1Y3QgUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvOworICBzdHJ1Y3QgUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbzsKKyAgc3RydWN0IFBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IFBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IFBpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQ7CisgIHN0cnVjdCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm87CisgIHN0cnVjdCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRDsKKyAgc3RydWN0IFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IFBpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVjsKKyAgc3RydWN0IFBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm87CisgIHN0cnVjdCBQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm87CisgIHVzaW5nIFBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvS0hSID0gUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm87CisgIHN0cnVjdCBQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbzsKKyAgc3RydWN0IFBpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbzsKKyAgc3RydWN0IFBpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WOworICBzdHJ1Y3QgUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVjsKKyAgc3RydWN0IFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlY7CisgIHN0cnVjdCBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvOworICBzdHJ1Y3QgUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVjsKKyAgc3RydWN0IFBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKyAgc3RydWN0IFByZXNlbnRGcmFtZVRva2VuR0dQOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0dHUCovCisgIHN0cnVjdCBQcmVzZW50SW5mb0tIUjsKKyAgc3RydWN0IFByZXNlbnRSZWdpb25LSFI7CisgIHN0cnVjdCBQcmVzZW50UmVnaW9uc0tIUjsKKyAgc3RydWN0IFByZXNlbnRUaW1lR09PR0xFOworICBzdHJ1Y3QgUHJlc2VudFRpbWVzSW5mb0dPT0dMRTsKKyAgc3RydWN0IFByb3RlY3RlZFN1Ym1pdEluZm87CisgIHN0cnVjdCBQdXNoQ29uc3RhbnRSYW5nZTsKKyAgc3RydWN0IFF1ZXJ5UG9vbENyZWF0ZUluZm87CisgIHN0cnVjdCBRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUw7CisgIHN0cnVjdCBRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI7CisgIHN0cnVjdCBRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlY7CisgIHN0cnVjdCBRdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgIHN0cnVjdCBRdWV1ZUZhbWlseVByb3BlcnRpZXMyOworICB1c2luZyBRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSID0gUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKKyAgc3RydWN0IFJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVjsKKyAgc3RydWN0IFJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVjsKKyAgc3RydWN0IFJlY3QyRDsKKyAgc3RydWN0IFJlY3RMYXllcktIUjsKKyAgc3RydWN0IFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFOworICBzdHJ1Y3QgUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI7CisgIHN0cnVjdCBSZW5kZXJQYXNzQmVnaW5JbmZvOworICBzdHJ1Y3QgUmVuZGVyUGFzc0NyZWF0ZUluZm87CisgIHN0cnVjdCBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFI7CisgIHN0cnVjdCBSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IFJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvOworICB1c2luZyBSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mb0tIUiA9IFJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvOworICBzdHJ1Y3QgUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm87CisgIHVzaW5nIFJlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvS0hSID0gUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm87CisgIHN0cnVjdCBSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUOworICBzdHJ1Y3QgU2FtcGxlTG9jYXRpb25FWFQ7CisgIHN0cnVjdCBTYW1wbGVMb2NhdGlvbnNJbmZvRVhUOworICBzdHJ1Y3QgU2FtcGxlckNyZWF0ZUluZm87CisgIHN0cnVjdCBTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQ7CisgIHN0cnVjdCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbzsKKyAgdXNpbmcgU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm9LSFIgPSBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbzsKKyAgc3RydWN0IFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgIHVzaW5nIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXNLSFIgPSBTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICBzdHJ1Y3QgU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm87CisgIHVzaW5nIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvS0hSID0gU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm87CisgIHN0cnVjdCBTZW1hcGhvcmVDcmVhdGVJbmZvOworICBzdHJ1Y3QgU2VtYXBob3JlR2V0RmRJbmZvS0hSOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgc3RydWN0IFNlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUjsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICBzdHJ1Y3QgU2VtYXBob3JlU2lnbmFsSW5mb0tIUjsKKyAgc3RydWN0IFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSOworICBzdHJ1Y3QgU2VtYXBob3JlV2FpdEluZm9LSFI7CisgIHN0cnVjdCBTaGFkZXJNb2R1bGVDcmVhdGVJbmZvOworICBzdHJ1Y3QgU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDsKKyAgc3RydWN0IFNoYWRlclJlc291cmNlVXNhZ2VBTUQ7CisgIHN0cnVjdCBTaGFkZXJTdGF0aXN0aWNzSW5mb0FNRDsKKyAgc3RydWN0IFNoYWRpbmdSYXRlUGFsZXR0ZU5WOworICBzdHJ1Y3QgU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFI7CisgIHN0cnVjdCBTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbzsKKyAgc3RydWN0IFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgc3RydWN0IFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI7CisgIHVzaW5nIFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgPSBTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworICBzdHJ1Y3QgU3BhcnNlSW1hZ2VNZW1vcnlCaW5kOworICBzdHJ1Y3QgU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbzsKKyAgc3RydWN0IFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzOworICBzdHJ1Y3QgU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyOworICB1c2luZyBTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSBTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI7CisgIHN0cnVjdCBTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvOworICBzdHJ1Y3QgU3BhcnNlTWVtb3J5QmluZDsKKyAgc3RydWN0IFNwZWNpYWxpemF0aW9uSW5mbzsKKyAgc3RydWN0IFNwZWNpYWxpemF0aW9uTWFwRW50cnk7CisgIHN0cnVjdCBTdGVuY2lsT3BTdGF0ZTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgIHN0cnVjdCBTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1A7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fR0dQKi8KKyAgc3RydWN0IFN1Ym1pdEluZm87CisgIHN0cnVjdCBTdWJwYXNzQmVnaW5JbmZvS0hSOworICBzdHJ1Y3QgU3VicGFzc0RlcGVuZGVuY3k7CisgIHN0cnVjdCBTdWJwYXNzRGVwZW5kZW5jeTJLSFI7CisgIHN0cnVjdCBTdWJwYXNzRGVzY3JpcHRpb247CisgIHN0cnVjdCBTdWJwYXNzRGVzY3JpcHRpb24yS0hSOworICBzdHJ1Y3QgU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUjsKKyAgc3RydWN0IFN1YnBhc3NFbmRJbmZvS0hSOworICBzdHJ1Y3QgU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVDsKKyAgc3RydWN0IFN1YnJlc291cmNlTGF5b3V0OworICBzdHJ1Y3QgU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ7CisgIHN0cnVjdCBTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUjsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHN0cnVjdCBTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICBzdHJ1Y3QgU3VyZmFjZUNhcGFiaWxpdGllc0tIUjsKKyAgc3RydWN0IFN1cmZhY2VGb3JtYXQyS0hSOworICBzdHJ1Y3QgU3VyZmFjZUZvcm1hdEtIUjsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHN0cnVjdCBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHN0cnVjdCBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICBzdHJ1Y3QgU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUjsKKyAgc3RydWN0IFN3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjsKKyAgc3RydWN0IFN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EOworICBzdHJ1Y3QgVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQ7CisgIHN0cnVjdCBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI7CisgIHN0cnVjdCBWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUOworICBzdHJ1Y3QgVmFsaWRhdGlvbkZlYXR1cmVzRVhUOworICBzdHJ1Y3QgVmFsaWRhdGlvbkZsYWdzRVhUOworICBzdHJ1Y3QgVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbjsKKyAgc3RydWN0IFZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uOworICBzdHJ1Y3QgVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICBzdHJ1Y3QgVmlTdXJmYWNlQ3JlYXRlSW5mb05OOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1ZJX05OKi8KKyAgc3RydWN0IFZpZXdwb3J0OworICBzdHJ1Y3QgVmlld3BvcnRTd2l6emxlTlY7CisgIHN0cnVjdCBWaWV3cG9ydFdTY2FsaW5nTlY7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgIHN0cnVjdCBXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFI7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgc3RydWN0IFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUjsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgc3RydWN0IFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICBzdHJ1Y3QgV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICBzdHJ1Y3QgV3JpdGVEZXNjcmlwdG9yU2V0OworICBzdHJ1Y3QgV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7CisgIHN0cnVjdCBXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ7CisgIHN0cnVjdCBYWUNvbG9yRVhUOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgIHN0cnVjdCBYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgc3RydWN0IFhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YTElCX0tIUiovCisKKyAgY2xhc3MgU3VyZmFjZUtIUgorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrU3VyZmFjZUtIUjsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplU3VyZmFjZUtIUjsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VyZmFjZUtIUigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9zdXJmYWNlS0hSKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdXJmYWNlS0hSKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9zdXJmYWNlS0hSKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIFN1cmZhY2VLSFIoIFZrU3VyZmFjZUtIUiBzdXJmYWNlS0hSICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3N1cmZhY2VLSFIoIHN1cmZhY2VLSFIgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBTdXJmYWNlS0hSICYgb3BlcmF0b3I9KFZrU3VyZmFjZUtIUiBzdXJmYWNlS0hSKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9zdXJmYWNlS0hSID0gc3VyZmFjZUtIUjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIFN1cmZhY2VLSFIgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fc3VyZmFjZUtIUiA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3VyZmFjZUtIUiBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zdXJmYWNlS0hSID09IHJocy5tX3N1cmZhY2VLSFI7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KFN1cmZhY2VLSFIgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc3VyZmFjZUtIUiAhPSByaHMubV9zdXJmYWNlS0hSOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KFN1cmZhY2VLSFIgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc3VyZmFjZUtIUiA8IHJocy5tX3N1cmZhY2VLSFI7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa1N1cmZhY2VLSFIoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc3VyZmFjZUtIUjsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3N1cmZhY2VLSFIgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc3VyZmFjZUtIUiA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa1N1cmZhY2VLSFIgbV9zdXJmYWNlS0hSOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN1cmZhY2VLSFIgKSA9PSBzaXplb2YoIFZrU3VyZmFjZUtIUiApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplU3VyZmFjZUtIUj4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBTdXJmYWNlS0hSOworICB9OworCisgIGNsYXNzIERlYnVnUmVwb3J0Q2FsbGJhY2tFWFQKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZGVidWdSZXBvcnRDYWxsYmFja0VYVChWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdSZXBvcnRDYWxsYmFja0VYVCggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZGVidWdSZXBvcnRDYWxsYmFja0VYVChWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgZGVidWdSZXBvcnRDYWxsYmFja0VYVCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCBkZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgRGVidWdSZXBvcnRDYWxsYmFja0VYVCAmIG9wZXJhdG9yPShWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgZGVidWdSZXBvcnRDYWxsYmFja0VYVCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fZGVidWdSZXBvcnRDYWxsYmFja0VYVCA9IGRlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVidWdSZXBvcnRDYWxsYmFja0VYVCA9PSByaHMubV9kZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgIT0gcmhzLm1fZGVidWdSZXBvcnRDYWxsYmFja0VYVDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPCByaHMubV9kZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIG1fZGVidWdSZXBvcnRDYWxsYmFja0VYVDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICkgPT0gc2l6ZW9mKCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ+CisgIHsKKyAgICB1c2luZyB0eXBlID0gRGVidWdSZXBvcnRDYWxsYmFja0VYVDsKKyAgfTsKKworICBjbGFzcyBEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2RlYnVnVXRpbHNNZXNzZW5nZXJFWFQoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2RlYnVnVXRpbHNNZXNzZW5nZXJFWFQoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgRGVidWdVdGlsc01lc3NlbmdlckVYVCggVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIGRlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZGVidWdVdGlsc01lc3NlbmdlckVYVCggZGVidWdVdGlsc01lc3NlbmdlckVYVCApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIERlYnVnVXRpbHNNZXNzZW5nZXJFWFQgJiBvcGVyYXRvcj0oVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIGRlYnVnVXRpbHNNZXNzZW5nZXJFWFQpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgPSBkZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckVYVCAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9kZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgPT0gcmhzLm1fZGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oRGVidWdVdGlsc01lc3NlbmdlckVYVCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICE9IHJocy5tX2RlYnVnVXRpbHNNZXNzZW5nZXJFWFQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoRGVidWdVdGlsc01lc3NlbmdlckVYVCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIDwgcmhzLm1fZGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVidWdVdGlsc01lc3NlbmdlckVYVCAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCBtX2RlYnVnVXRpbHNNZXNzZW5nZXJFWFQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVidWdVdGlsc01lc3NlbmdlckVYVCApID09IHNpemVvZiggVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUPgorICB7CisgICAgdXNpbmcgdHlwZSA9IERlYnVnVXRpbHNNZXNzZW5nZXJFWFQ7CisgIH07CisKKyAgY2xhc3MgRGlzcGxheUtIUgorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrRGlzcGxheUtIUjsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplRGlzcGxheUtIUjsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGlzcGxheUtIUigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kaXNwbGF5S0hSKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEaXNwbGF5S0hSKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kaXNwbGF5S0hSKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIERpc3BsYXlLSFIoIFZrRGlzcGxheUtIUiBkaXNwbGF5S0hSICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rpc3BsYXlLSFIoIGRpc3BsYXlLSFIgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBEaXNwbGF5S0hSICYgb3BlcmF0b3I9KFZrRGlzcGxheUtIUiBkaXNwbGF5S0hSKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9kaXNwbGF5S0hSID0gZGlzcGxheUtIUjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIERpc3BsYXlLSFIgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fZGlzcGxheUtIUiA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGlzcGxheUtIUiBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kaXNwbGF5S0hSID09IHJocy5tX2Rpc3BsYXlLSFI7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KERpc3BsYXlLSFIgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGlzcGxheUtIUiAhPSByaHMubV9kaXNwbGF5S0hSOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KERpc3BsYXlLSFIgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGlzcGxheUtIUiA8IHJocy5tX2Rpc3BsYXlLSFI7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0Rpc3BsYXlLSFIoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGlzcGxheUtIUjsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rpc3BsYXlLSFIgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGlzcGxheUtIUiA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa0Rpc3BsYXlLSFIgbV9kaXNwbGF5S0hSOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERpc3BsYXlLSFIgKSA9PSBzaXplb2YoIFZrRGlzcGxheUtIUiApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplRGlzcGxheUtIUj4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBEaXNwbGF5S0hSOworICB9OworCisgIGNsYXNzIFN3YXBjaGFpbktIUgorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrU3dhcGNoYWluS0hSOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVTd2FwY2hhaW5LSFI7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFN3YXBjaGFpbktIUigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9zd2FwY2hhaW5LSFIoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFN3YXBjaGFpbktIUiggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fc3dhcGNoYWluS0hSKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIFN3YXBjaGFpbktIUiggVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluS0hSICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3N3YXBjaGFpbktIUiggc3dhcGNoYWluS0hSICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgU3dhcGNoYWluS0hSICYgb3BlcmF0b3I9KFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbktIUikgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fc3dhcGNoYWluS0hSID0gc3dhcGNoYWluS0hSOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgU3dhcGNoYWluS0hSICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3N3YXBjaGFpbktIUiA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3dhcGNoYWluS0hSIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3N3YXBjaGFpbktIUiA9PSByaHMubV9zd2FwY2hhaW5LSFI7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KFN3YXBjaGFpbktIUiBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zd2FwY2hhaW5LSFIgIT0gcmhzLm1fc3dhcGNoYWluS0hSOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KFN3YXBjaGFpbktIUiBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zd2FwY2hhaW5LSFIgPCByaHMubV9zd2FwY2hhaW5LSFI7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa1N3YXBjaGFpbktIUigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zd2FwY2hhaW5LSFI7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zd2FwY2hhaW5LSFIgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc3dhcGNoYWluS0hSID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrU3dhcGNoYWluS0hSIG1fc3dhcGNoYWluS0hSOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN3YXBjaGFpbktIUiApID09IHNpemVvZiggVmtTd2FwY2hhaW5LSFIgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZVN3YXBjaGFpbktIUj4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBTd2FwY2hhaW5LSFI7CisgIH07CisKKyAgY2xhc3MgU2VtYXBob3JlCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtTZW1hcGhvcmU7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZVNlbWFwaG9yZTsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3NlbWFwaG9yZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9zZW1hcGhvcmUoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgU2VtYXBob3JlKCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fc2VtYXBob3JlKCBzZW1hcGhvcmUgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBTZW1hcGhvcmUgJiBvcGVyYXRvcj0oVmtTZW1hcGhvcmUgc2VtYXBob3JlKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9zZW1hcGhvcmUgPSBzZW1hcGhvcmU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBTZW1hcGhvcmUgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fc2VtYXBob3JlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTZW1hcGhvcmUgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2VtYXBob3JlID09IHJocy5tX3NlbWFwaG9yZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oU2VtYXBob3JlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3NlbWFwaG9yZSAhPSByaHMubV9zZW1hcGhvcmU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoU2VtYXBob3JlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3NlbWFwaG9yZSA8IHJocy5tX3NlbWFwaG9yZTsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrU2VtYXBob3JlKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3NlbWFwaG9yZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3NlbWFwaG9yZSAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zZW1hcGhvcmUgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtTZW1hcGhvcmUgbV9zZW1hcGhvcmU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU2VtYXBob3JlICkgPT0gc2l6ZW9mKCBWa1NlbWFwaG9yZSApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplU2VtYXBob3JlPgorICB7CisgICAgdXNpbmcgdHlwZSA9IFNlbWFwaG9yZTsKKyAgfTsKKworICBjbGFzcyBGZW5jZQorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrRmVuY2U7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZUZlbmNlOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBGZW5jZSgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9mZW5jZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRmVuY2UoIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2ZlbmNlKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIEZlbmNlKCBWa0ZlbmNlIGZlbmNlICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2ZlbmNlKCBmZW5jZSApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIEZlbmNlICYgb3BlcmF0b3I9KFZrRmVuY2UgZmVuY2UpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2ZlbmNlID0gZmVuY2U7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBGZW5jZSAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9mZW5jZSA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRmVuY2UgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZmVuY2UgPT0gcmhzLm1fZmVuY2U7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KEZlbmNlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ZlbmNlICE9IHJocy5tX2ZlbmNlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KEZlbmNlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ZlbmNlIDwgcmhzLm1fZmVuY2U7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0ZlbmNlKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ZlbmNlOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZmVuY2UgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZmVuY2UgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtGZW5jZSBtX2ZlbmNlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEZlbmNlICkgPT0gc2l6ZW9mKCBWa0ZlbmNlICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVGZW5jZT4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBGZW5jZTsKKyAgfTsKKworICBjbGFzcyBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTAorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9wZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIHBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBwZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICYgb3BlcmF0b3I9KFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgcGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID0gcGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9wZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPT0gcmhzLm1fcGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICE9IHJocy5tX3BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIDwgcmhzLm1fcGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBtX3BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICkgPT0gc2l6ZW9mKCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTD4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsKKyAgfTsKKworICBjbGFzcyBRdWVyeVBvb2wKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa1F1ZXJ5UG9vbDsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplUXVlcnlQb29sOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeVBvb2woKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcXVlcnlQb29sKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBRdWVyeVBvb2woIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3F1ZXJ5UG9vbChWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBRdWVyeVBvb2woIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9xdWVyeVBvb2woIHF1ZXJ5UG9vbCApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIFF1ZXJ5UG9vbCAmIG9wZXJhdG9yPShWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3F1ZXJ5UG9vbCA9IHF1ZXJ5UG9vbDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIFF1ZXJ5UG9vbCAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9xdWVyeVBvb2wgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFF1ZXJ5UG9vbCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9xdWVyeVBvb2wgPT0gcmhzLm1fcXVlcnlQb29sOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShRdWVyeVBvb2wgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcXVlcnlQb29sICE9IHJocy5tX3F1ZXJ5UG9vbDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChRdWVyeVBvb2wgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcXVlcnlQb29sIDwgcmhzLm1fcXVlcnlQb29sOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtRdWVyeVBvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcXVlcnlQb29sOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcXVlcnlQb29sICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3F1ZXJ5UG9vbCA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa1F1ZXJ5UG9vbCBtX3F1ZXJ5UG9vbDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBRdWVyeVBvb2wgKSA9PSBzaXplb2YoIFZrUXVlcnlQb29sICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVRdWVyeVBvb2w+CisgIHsKKyAgICB1c2luZyB0eXBlID0gUXVlcnlQb29sOworICB9OworCisgIGNsYXNzIEJ1ZmZlcgorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrQnVmZmVyOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVCdWZmZXI7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJ1ZmZlcigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9idWZmZXIoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJ1ZmZlciggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fYnVmZmVyKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIEJ1ZmZlciggVmtCdWZmZXIgYnVmZmVyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2J1ZmZlciggYnVmZmVyICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgQnVmZmVyICYgb3BlcmF0b3I9KFZrQnVmZmVyIGJ1ZmZlcikgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fYnVmZmVyID0gYnVmZmVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgQnVmZmVyICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2J1ZmZlciA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQnVmZmVyIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2J1ZmZlciA9PSByaHMubV9idWZmZXI7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KEJ1ZmZlciBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9idWZmZXIgIT0gcmhzLm1fYnVmZmVyOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KEJ1ZmZlciBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9idWZmZXIgPCByaHMubV9idWZmZXI7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0J1ZmZlcigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9idWZmZXI7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9idWZmZXIgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fYnVmZmVyID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrQnVmZmVyIG1fYnVmZmVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEJ1ZmZlciApID09IHNpemVvZiggVmtCdWZmZXIgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZUJ1ZmZlcj4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBCdWZmZXI7CisgIH07CisKKyAgY2xhc3MgUGlwZWxpbmVMYXlvdXQKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa1BpcGVsaW5lTGF5b3V0OworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVQaXBlbGluZUxheW91dDsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVMYXlvdXQoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcGlwZWxpbmVMYXlvdXQoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lTGF5b3V0KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9waXBlbGluZUxheW91dChWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBQaXBlbGluZUxheW91dCggVmtQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9waXBlbGluZUxheW91dCggcGlwZWxpbmVMYXlvdXQgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBQaXBlbGluZUxheW91dCAmIG9wZXJhdG9yPShWa1BpcGVsaW5lTGF5b3V0IHBpcGVsaW5lTGF5b3V0KSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9waXBlbGluZUxheW91dCA9IHBpcGVsaW5lTGF5b3V0OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgUGlwZWxpbmVMYXlvdXQgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fcGlwZWxpbmVMYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lTGF5b3V0IGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BpcGVsaW5lTGF5b3V0ID09IHJocy5tX3BpcGVsaW5lTGF5b3V0OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShQaXBlbGluZUxheW91dCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waXBlbGluZUxheW91dCAhPSByaHMubV9waXBlbGluZUxheW91dDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChQaXBlbGluZUxheW91dCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waXBlbGluZUxheW91dCA8IHJocy5tX3BpcGVsaW5lTGF5b3V0OworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtQaXBlbGluZUxheW91dCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waXBlbGluZUxheW91dDsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BpcGVsaW5lTGF5b3V0ICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BpcGVsaW5lTGF5b3V0ID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrUGlwZWxpbmVMYXlvdXQgbV9waXBlbGluZUxheW91dDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZUxheW91dCApID09IHNpemVvZiggVmtQaXBlbGluZUxheW91dCApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplUGlwZWxpbmVMYXlvdXQ+CisgIHsKKyAgICB1c2luZyB0eXBlID0gUGlwZWxpbmVMYXlvdXQ7CisgIH07CisKKyAgY2xhc3MgRGVzY3JpcHRvclNldAorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrRGVzY3JpcHRvclNldDsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplRGVzY3JpcHRvclNldDsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclNldCgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kZXNjcmlwdG9yU2V0KFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yU2V0KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kZXNjcmlwdG9yU2V0KFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIERlc2NyaXB0b3JTZXQoIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rlc2NyaXB0b3JTZXQoIGRlc2NyaXB0b3JTZXQgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBEZXNjcmlwdG9yU2V0ICYgb3BlcmF0b3I9KFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0KSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9kZXNjcmlwdG9yU2V0ID0gZGVzY3JpcHRvclNldDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIERlc2NyaXB0b3JTZXQgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fZGVzY3JpcHRvclNldCA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGVzY3JpcHRvclNldCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXNjcmlwdG9yU2V0ID09IHJocy5tX2Rlc2NyaXB0b3JTZXQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KERlc2NyaXB0b3JTZXQgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclNldCAhPSByaHMubV9kZXNjcmlwdG9yU2V0OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KERlc2NyaXB0b3JTZXQgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclNldCA8IHJocy5tX2Rlc2NyaXB0b3JTZXQ7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0Rlc2NyaXB0b3JTZXQoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclNldDsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JTZXQgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclNldCA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa0Rlc2NyaXB0b3JTZXQgbV9kZXNjcmlwdG9yU2V0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JTZXQgKSA9PSBzaXplb2YoIFZrRGVzY3JpcHRvclNldCApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplRGVzY3JpcHRvclNldD4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBEZXNjcmlwdG9yU2V0OworICB9OworCisgIGNsYXNzIFBpcGVsaW5lCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtQaXBlbGluZTsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplUGlwZWxpbmU7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3BpcGVsaW5lKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcGlwZWxpbmUoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgUGlwZWxpbmUoIFZrUGlwZWxpbmUgcGlwZWxpbmUgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcGlwZWxpbmUoIHBpcGVsaW5lICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgUGlwZWxpbmUgJiBvcGVyYXRvcj0oVmtQaXBlbGluZSBwaXBlbGluZSkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fcGlwZWxpbmUgPSBwaXBlbGluZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIFBpcGVsaW5lICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3BpcGVsaW5lID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waXBlbGluZSA9PSByaHMubV9waXBlbGluZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oUGlwZWxpbmUgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGlwZWxpbmUgIT0gcmhzLm1fcGlwZWxpbmU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoUGlwZWxpbmUgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGlwZWxpbmUgPCByaHMubV9waXBlbGluZTsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrUGlwZWxpbmUoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGlwZWxpbmU7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waXBlbGluZSAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waXBlbGluZSA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa1BpcGVsaW5lIG1fcGlwZWxpbmU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmUgKSA9PSBzaXplb2YoIFZrUGlwZWxpbmUgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZVBpcGVsaW5lPgorICB7CisgICAgdXNpbmcgdHlwZSA9IFBpcGVsaW5lOworICB9OworCisgIGNsYXNzIEltYWdlVmlldworICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrSW1hZ2VWaWV3OworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVJbWFnZVZpZXc7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlVmlldygpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9pbWFnZVZpZXcoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlVmlldyggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1faW1hZ2VWaWV3KFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIEltYWdlVmlldyggVmtJbWFnZVZpZXcgaW1hZ2VWaWV3ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2ltYWdlVmlldyggaW1hZ2VWaWV3ICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgSW1hZ2VWaWV3ICYgb3BlcmF0b3I9KFZrSW1hZ2VWaWV3IGltYWdlVmlldykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1faW1hZ2VWaWV3ID0gaW1hZ2VWaWV3OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgSW1hZ2VWaWV3ICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2ltYWdlVmlldyA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VWaWV3IGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ltYWdlVmlldyA9PSByaHMubV9pbWFnZVZpZXc7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KEltYWdlVmlldyBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbWFnZVZpZXcgIT0gcmhzLm1faW1hZ2VWaWV3OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KEltYWdlVmlldyBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbWFnZVZpZXcgPCByaHMubV9pbWFnZVZpZXc7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0ltYWdlVmlldygpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbWFnZVZpZXc7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbWFnZVZpZXcgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1faW1hZ2VWaWV3ID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrSW1hZ2VWaWV3IG1faW1hZ2VWaWV3OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltYWdlVmlldyApID09IHNpemVvZiggVmtJbWFnZVZpZXcgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZUltYWdlVmlldz4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBJbWFnZVZpZXc7CisgIH07CisKKyAgY2xhc3MgSW1hZ2UKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa0ltYWdlOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVJbWFnZTsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2UoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1faW1hZ2UoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9pbWFnZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBJbWFnZSggVmtJbWFnZSBpbWFnZSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9pbWFnZSggaW1hZ2UgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBJbWFnZSAmIG9wZXJhdG9yPShWa0ltYWdlIGltYWdlKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9pbWFnZSA9IGltYWdlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgSW1hZ2UgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1faW1hZ2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltYWdlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ltYWdlID09IHJocy5tX2ltYWdlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShJbWFnZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbWFnZSAhPSByaHMubV9pbWFnZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChJbWFnZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbWFnZSA8IHJocy5tX2ltYWdlOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtJbWFnZSgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbWFnZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ltYWdlICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ltYWdlID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrSW1hZ2UgbV9pbWFnZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBJbWFnZSApID09IHNpemVvZiggVmtJbWFnZSApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplSW1hZ2U+CisgIHsKKyAgICB1c2luZyB0eXBlID0gSW1hZ2U7CisgIH07CisKKyAgY2xhc3MgQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fYWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9hY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9hY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggYWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAmIG9wZXJhdG9yPShWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9hY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IGFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fYWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2FjY2VsZXJhdGlvblN0cnVjdHVyZU5WID09IHJocy5tX2FjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9hY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAhPSByaHMubV9hY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9hY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA8IHJocy5tX2FjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9hY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2FjY2VsZXJhdGlvblN0cnVjdHVyZU5WID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgbV9hY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViApID09IHNpemVvZiggVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+CisgIHsKKyAgICB1c2luZyB0eXBlID0gQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7CisgIH07CisKKyAgY2xhc3MgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgJiBvcGVyYXRvcj0oVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID09IHJocy5tX2Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAhPSByaHMubV9kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA8IHJocy5tX2Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgbV9kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPgorICB7CisgICAgdXNpbmcgdHlwZSA9IERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgfTsKKyAgdXNpbmcgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSID0gRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlOworCisgIGNsYXNzIEV2ZW50CisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtFdmVudDsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplRXZlbnQ7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV2ZW50KCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2V2ZW50KFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBFdmVudCggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZXZlbnQoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgRXZlbnQoIFZrRXZlbnQgZXZlbnQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZXZlbnQoIGV2ZW50ICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgRXZlbnQgJiBvcGVyYXRvcj0oVmtFdmVudCBldmVudCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fZXZlbnQgPSBldmVudDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIEV2ZW50ICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2V2ZW50ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFdmVudCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9ldmVudCA9PSByaHMubV9ldmVudDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oRXZlbnQgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZXZlbnQgIT0gcmhzLm1fZXZlbnQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoRXZlbnQgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZXZlbnQgPCByaHMubV9ldmVudDsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrRXZlbnQoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZXZlbnQ7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9ldmVudCAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9ldmVudCA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa0V2ZW50IG1fZXZlbnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRXZlbnQgKSA9PSBzaXplb2YoIFZrRXZlbnQgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZUV2ZW50PgorICB7CisgICAgdXNpbmcgdHlwZSA9IEV2ZW50OworICB9OworCisgIGNsYXNzIENvbW1hbmRCdWZmZXIKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa0NvbW1hbmRCdWZmZXI7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZUNvbW1hbmRCdWZmZXI7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRCdWZmZXIoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fY29tbWFuZEJ1ZmZlcihWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQ29tbWFuZEJ1ZmZlciggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fY29tbWFuZEJ1ZmZlcihWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBDb21tYW5kQnVmZmVyKCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9jb21tYW5kQnVmZmVyKCBjb21tYW5kQnVmZmVyICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgQ29tbWFuZEJ1ZmZlciAmIG9wZXJhdG9yPShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fY29tbWFuZEJ1ZmZlciA9IGNvbW1hbmRCdWZmZXI7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBDb21tYW5kQnVmZmVyICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2NvbW1hbmRCdWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIENvbW1hbmRCdWZmZXIgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fY29tbWFuZEJ1ZmZlciA9PSByaHMubV9jb21tYW5kQnVmZmVyOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShDb21tYW5kQnVmZmVyIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2NvbW1hbmRCdWZmZXIgIT0gcmhzLm1fY29tbWFuZEJ1ZmZlcjsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChDb21tYW5kQnVmZmVyIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2NvbW1hbmRCdWZmZXIgPCByaHMubV9jb21tYW5kQnVmZmVyOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgYmVnaW4oIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiBwQmVnaW5JbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBiZWdpbiggY29uc3QgQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAmIGJlZ2luSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCggY29uc3QgQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgJiBjb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBiZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggY29uc3QgRGVidWdVdGlsc0xhYmVsRVhUICYgbGFiZWxJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJlZ2luUXVlcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJlZ2luUXVlcnlJbmRleGVkRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeUNvbnRyb2xGbGFncyBmbGFncywgdWludDMyX3QgaW5kZXgsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYmVnaW5SZW5kZXJQYXNzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NDb250ZW50cyBjb250ZW50cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYmVnaW5SZW5kZXJQYXNzKCBjb25zdCBSZW5kZXJQYXNzQmVnaW5JbmZvICYgcmVuZGVyUGFzc0JlZ2luLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJlZ2luUmVuZGVyUGFzczJLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQmVnaW5JbmZvKiBwUmVuZGVyUGFzc0JlZ2luLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0JlZ2luSW5mb0tIUiogcFN1YnBhc3NCZWdpbkluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJlZ2luUmVuZGVyUGFzczJLSFIoIGNvbnN0IFJlbmRlclBhc3NCZWdpbkluZm8gJiByZW5kZXJQYXNzQmVnaW4sIGNvbnN0IFN1YnBhc3NCZWdpbkluZm9LSFIgJiBzdWJwYXNzQmVnaW5JbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgdWludDMyX3QgY291bnRlckJ1ZmZlckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKiBwQ291bnRlckJ1ZmZlcnMsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyPiBjb3VudGVyQnVmZmVycywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZT4gY291bnRlckJ1ZmZlck9mZnNldHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJpbmREZXNjcmlwdG9yU2V0cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCB1aW50MzJfdCBkeW5hbWljT2Zmc2V0Q291bnQsIGNvbnN0IHVpbnQzMl90KiBwRHluYW1pY09mZnNldHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJpbmREZXNjcmlwdG9yU2V0cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBmaXJzdFNldCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldD4gZGVzY3JpcHRvclNldHMsIEFycmF5UHJveHk8Y29uc3QgdWludDMyX3Q+IGR5bmFtaWNPZmZzZXRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJpbmRJbmRleEJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZSBpbmRleFR5cGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYmluZFBpcGVsaW5lKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSBwaXBlbGluZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBiaW5kU2hhZGluZ1JhdGVJbWFnZU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3IGltYWdlVmlldywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoIHVpbnQzMl90IGZpcnN0QmluZGluZywgdWludDMyX3QgYmluZGluZ0NvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKiBwQnVmZmVycywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUqIHBPZmZzZXRzLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSogcFNpemVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBiaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKCB1aW50MzJfdCBmaXJzdEJpbmRpbmcsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcj4gYnVmZmVycywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZT4gb2Zmc2V0cywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZT4gc2l6ZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJpbmRWZXJ0ZXhCdWZmZXJzKCB1aW50MzJfdCBmaXJzdEJpbmRpbmcsIHVpbnQzMl90IGJpbmRpbmdDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciogcEJ1ZmZlcnMsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplKiBwT2Zmc2V0cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYmluZFZlcnRleEJ1ZmZlcnMoIHVpbnQzMl90IGZpcnN0QmluZGluZywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyPiBidWZmZXJzLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplPiBvZmZzZXRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBibGl0SW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBzcmNJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgZHN0SW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUJsaXQqIHBSZWdpb25zLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyIGZpbHRlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYmxpdEltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2Ugc3JjSW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGRzdEltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQmxpdD4gcmVnaW9ucywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZpbHRlciBmaWx0ZXIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogcEluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgaW5zdGFuY2VEYXRhLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBpbnN0YW5jZU9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB1cGRhdGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgc2NyYXRjaCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2NyYXRjaE9mZnNldCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgYnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggY29uc3QgQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICYgaW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBpbnN0YW5jZURhdGEsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGluc3RhbmNlT2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHVwZGF0ZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBzY3JhdGNoLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzY3JhdGNoT2Zmc2V0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGNsZWFyQXR0YWNobWVudHMoIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyQXR0YWNobWVudCogcEF0dGFjaG1lbnRzLCB1aW50MzJfdCByZWN0Q291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbGVhclJlY3QqIHBSZWN0cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgY2xlYXJBdHRhY2htZW50cyggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJBdHRhY2htZW50PiBhdHRhY2htZW50cywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJSZWN0PiByZWN0cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBjbGVhckNvbG9ySW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJDb2xvclZhbHVlKiBwQ29sb3IsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2UqIHBSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGNsZWFyQ29sb3JJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IENsZWFyQ29sb3JWYWx1ZSAmIGNvbG9yLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2U+IHJhbmdlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBjbGVhckRlcHRoU3RlbmNpbEltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbWFnZUxheW91dCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2UqIHBSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGNsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBDbGVhckRlcHRoU3RlbmNpbFZhbHVlICYgZGVwdGhTdGVuY2lsLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2U+IHJhbmdlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBjb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIG1vZGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgY29weUJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBzcmNCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNvcHkqIHBSZWdpb25zLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBjb3B5QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHNyY0J1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBkc3RCdWZmZXIsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNvcHk+IHJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgY29weUJ1ZmZlclRvSW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgc3JjQnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgZHN0SW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBjb3B5QnVmZmVyVG9JbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBzcmNCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBkc3RJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJJbWFnZUNvcHk+IHJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgY29weUltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2Ugc3JjSW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGRzdEltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VDb3B5KiBwUmVnaW9ucywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgY29weUltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2Ugc3JjSW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGRzdEltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ29weT4gcmVnaW9ucywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBjb3B5SW1hZ2VUb0J1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIHNyY0ltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckltYWdlQ29weSogcFJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGNvcHlJbWFnZVRvQnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2Ugc3JjSW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBkc3RCdWZmZXIsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckltYWdlQ29weT4gcmVnaW9ucywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBjb3B5UXVlcnlQb29sUmVzdWx0cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHN0cmlkZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVidWdNYXJrZXJCZWdpbkVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlYnVnTWFya2VyQmVnaW5FWFQoIGNvbnN0IERlYnVnTWFya2VyTWFya2VySW5mb0VYVCAmIG1hcmtlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVidWdNYXJrZXJFbmRFWFQoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZWJ1Z01hcmtlckluc2VydEVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlYnVnTWFya2VySW5zZXJ0RVhUKCBjb25zdCBEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgJiBtYXJrZXJJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRpc3BhdGNoKCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRpc3BhdGNoQmFzZSggdWludDMyX3QgYmFzZUdyb3VwWCwgdWludDMyX3QgYmFzZUdyb3VwWSwgdWludDMyX3QgYmFzZUdyb3VwWiwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLCB1aW50MzJfdCBncm91cENvdW50WiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkaXNwYXRjaEJhc2VLSFIoIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFosIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGlzcGF0Y2hJbmRpcmVjdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkcmF3KCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RWZXJ0ZXgsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZHJhd0luZGV4ZWQoIHVpbnQzMl90IGluZGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0SW5kZXgsIGludDMyX3QgdmVydGV4T2Zmc2V0LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRyYXdJbmRleGVkSW5kaXJlY3QoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBjb3VudEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBjb3VudEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRyYXdJbmRpcmVjdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgZHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGNvdW50ZXJCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNvdW50ZXJCdWZmZXJPZmZzZXQsIHVpbnQzMl90IGNvdW50ZXJPZmZzZXQsIHVpbnQzMl90IHZlcnRleFN0cmlkZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkcmF3SW5kaXJlY3RDb3VudEFNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBjb3VudEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRyYXdJbmRpcmVjdENvdW50S0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGNvdW50QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBjb3VudEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRyYXdNZXNoVGFza3NJbmRpcmVjdE5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkcmF3TWVzaFRhc2tzTlYoIHVpbnQzMl90IHRhc2tDb3VudCwgdWludDMyX3QgZmlyc3RUYXNrLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZW5kRGVidWdVdGlsc0xhYmVsRVhUKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZW5kUXVlcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBlbmRRdWVyeUluZGV4ZWRFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgdWludDMyX3QgaW5kZXgsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZW5kUmVuZGVyUGFzcyhEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGVuZFJlbmRlclBhc3MyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0VuZEluZm9LSFIqIHBTdWJwYXNzRW5kSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZW5kUmVuZGVyUGFzczJLSFIoIGNvbnN0IFN1YnBhc3NFbmRJbmZvS0hSICYgc3VicGFzc0VuZEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgdWludDMyX3QgY291bnRlckJ1ZmZlckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKiBwQ291bnRlckJ1ZmZlcnMsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcj4gY291bnRlckJ1ZmZlcnMsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemU+IGNvdW50ZXJCdWZmZXJPZmZzZXRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBleGVjdXRlQ29tbWFuZHMoIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZXhlY3V0ZUNvbW1hbmRzKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyPiBjb21tYW5kQnVmZmVycywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBmaWxsQnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGRzdEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgZHN0T2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBkYXRhLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGluc2VydERlYnVnVXRpbHNMYWJlbEVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgaW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCBjb25zdCBEZWJ1Z1V0aWxzTGFiZWxFWFQgJiBsYWJlbEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgbmV4dFN1YnBhc3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzQ29udGVudHMgY29udGVudHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgbmV4dFN1YnBhc3MyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0JlZ2luSW5mb0tIUiogcFN1YnBhc3NCZWdpbkluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRW5kSW5mb0tIUiogcFN1YnBhc3NFbmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBuZXh0U3VicGFzczJLSFIoIGNvbnN0IFN1YnBhc3NCZWdpbkluZm9LSFIgJiBzdWJwYXNzQmVnaW5JbmZvLCBjb25zdCBTdWJwYXNzRW5kSW5mb0tIUiAmIHN1YnBhc3NFbmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHBpcGVsaW5lQmFycmllciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFncywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5QmFycmllciogcE1lbW9yeUJhcnJpZXJzLCB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgcGlwZWxpbmVCYXJyaWVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlCYXJyaWVyPiBtZW1vcnlCYXJyaWVycywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyTWVtb3J5QmFycmllcj4gYnVmZmVyTWVtb3J5QmFycmllcnMsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5QmFycmllcj4gaW1hZ2VNZW1vcnlCYXJyaWVycywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBwcm9jZXNzQ29tbWFuZHNOVlgoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiBwUHJvY2Vzc0NvbW1hbmRzSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgcHJvY2Vzc0NvbW1hbmRzTlZYKCBjb25zdCBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICYgcHJvY2Vzc0NvbW1hbmRzSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBwdXNoQ29uc3RhbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgbGF5b3V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUsIGNvbnN0IHZvaWQqIHBWYWx1ZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHB1c2hDb25zdGFudHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBsYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzIHN0YWdlRmxhZ3MsIHVpbnQzMl90IG9mZnNldCwgQXJyYXlQcm94eTxjb25zdCBUPiB2YWx1ZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgcHVzaERlc2NyaXB0b3JTZXRLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHB1c2hEZXNjcmlwdG9yU2V0S0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V3JpdGVEZXNjcmlwdG9yU2V0PiBkZXNjcmlwdG9yV3JpdGVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCBjb25zdCB2b2lkKiBwRGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCByZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogcFJlc2VydmVTcGFjZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKCBjb25zdCBDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggJiByZXNlcnZlU3BhY2VJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHJlc2V0RXZlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgcmVzZXRRdWVyeVBvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHJlc29sdmVJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIHNyY0ltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBkc3RJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlUmVzb2x2ZSogcFJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHJlc29sdmVJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIHNyY0ltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBkc3RJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVJlc29sdmU+IHJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0QmxlbmRDb25zdGFudHMoIGNvbnN0IGZsb2F0IGJsZW5kQ29uc3RhbnRzWzRdLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldENoZWNrcG9pbnROViggY29uc3Qgdm9pZCogcENoZWNrcG9pbnRNYXJrZXIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0Q29hcnNlU2FtcGxlT3JkZXJOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZSwgdWludDMyX3QgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqIHBDdXN0b21TYW1wbGVPcmRlcnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldENvYXJzZVNhbXBsZU9yZGVyTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViBzYW1wbGVPcmRlclR5cGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlY+IGN1c3RvbVNhbXBsZU9yZGVycywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBzZXREZXB0aEJpYXMoIGZsb2F0IGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBmbG9hdCBkZXB0aEJpYXNDbGFtcCwgZmxvYXQgZGVwdGhCaWFzU2xvcGVGYWN0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0RGVwdGhCb3VuZHMoIGZsb2F0IG1pbkRlcHRoQm91bmRzLCBmbG9hdCBtYXhEZXB0aEJvdW5kcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBzZXREZXZpY2VNYXNrKCB1aW50MzJfdCBkZXZpY2VNYXNrLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldERldmljZU1hc2tLSFIoIHVpbnQzMl90IGRldmljZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0RGlzY2FyZFJlY3RhbmdsZUVYVCggdWludDMyX3QgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLCB1aW50MzJfdCBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBEaXNjYXJkUmVjdGFuZ2xlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0RGlzY2FyZFJlY3RhbmdsZUVYVCggdWludDMyX3QgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQ+IGRpc2NhcmRSZWN0YW5nbGVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldEV2ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldEV4Y2x1c2l2ZVNjaXNzb3JOViggdWludDMyX3QgZmlyc3RFeGNsdXNpdmVTY2lzc29yLCB1aW50MzJfdCBleGNsdXNpdmVTY2lzc29yQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBFeGNsdXNpdmVTY2lzc29ycywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0RXhjbHVzaXZlU2Npc3Nvck5WKCB1aW50MzJfdCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRD4gZXhjbHVzaXZlU2Npc3NvcnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0TGluZVN0aXBwbGVFWFQoIHVpbnQzMl90IGxpbmVTdGlwcGxlRmFjdG9yLCB1aW50MTZfdCBsaW5lU3RpcHBsZVBhdHRlcm4sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0TGluZVdpZHRoKCBmbG9hdCBsaW5lV2lkdGgsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBzZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqIHBNYXJrZXJJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBzZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKCBjb25zdCBQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCAmIG1hcmtlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgc2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogcE92ZXJyaWRlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgc2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKCBjb25zdCBQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMICYgb3ZlcnJpZGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IHNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIHNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoIGNvbnN0IFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMICYgbWFya2VySW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0U2FtcGxlTG9jYXRpb25zRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlTG9jYXRpb25zSW5mb0VYVCogcFNhbXBsZUxvY2F0aW9uc0luZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldFNhbXBsZUxvY2F0aW9uc0VYVCggY29uc3QgU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAmIHNhbXBsZUxvY2F0aW9uc0luZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0U2Npc3NvciggdWludDMyX3QgZmlyc3RTY2lzc29yLCB1aW50MzJfdCBzY2lzc29yQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBTY2lzc29ycywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0U2Npc3NvciggdWludDMyX3QgZmlyc3RTY2lzc29yLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQ+IHNjaXNzb3JzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldFN0ZW5jaWxDb21wYXJlTWFzayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IGNvbXBhcmVNYXNrLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldFN0ZW5jaWxSZWZlcmVuY2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCByZWZlcmVuY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0U3RlbmNpbFdyaXRlTWFzayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHdyaXRlTWFzaywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBzZXRWaWV3cG9ydCggdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0KiBwVmlld3BvcnRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBzZXRWaWV3cG9ydCggdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnQ+IHZpZXdwb3J0cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBzZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGluZ1JhdGVQYWxldHRlTlYqIHBTaGFkaW5nUmF0ZVBhbGV0dGVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBzZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkaW5nUmF0ZVBhbGV0dGVOVj4gc2hhZGluZ1JhdGVQYWxldHRlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBzZXRWaWV3cG9ydFdTY2FsaW5nTlYoIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydFdTY2FsaW5nTlYqIHBWaWV3cG9ydFdTY2FsaW5ncywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgc2V0Vmlld3BvcnRXU2NhbGluZ05WKCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydFdTY2FsaW5nTlY+IHZpZXdwb3J0V1NjYWxpbmdzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHRyYWNlUmF5c05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nU3RyaWRlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZGVwdGgsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgdXBkYXRlQnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGRzdEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgZHN0T2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkYXRhU2l6ZSwgY29uc3Qgdm9pZCogcERhdGEsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHVwZGF0ZUJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBkc3RCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGRzdE9mZnNldCwgQXJyYXlQcm94eTxjb25zdCBUPiBkYXRhLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHdhaXRFdmVudHMoIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCogcEV2ZW50cywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbW9yeUJhcnJpZXJzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCB3YWl0RXZlbnRzKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudD4gZXZlbnRzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUJhcnJpZXI+IG1lbW9yeUJhcnJpZXJzLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJNZW1vcnlCYXJyaWVyPiBidWZmZXJNZW1vcnlCYXJyaWVycywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VNZW1vcnlCYXJyaWVyPiBpbWFnZU1lbW9yeUJhcnJpZXJzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViggdWludDMyX3QgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVR5cGUgcXVlcnlUeXBlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgd3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4gYWNjZWxlcmF0aW9uU3RydWN0dXJlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5VHlwZSBxdWVyeVR5cGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHdyaXRlQnVmZmVyTWFya2VyQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkc3RPZmZzZXQsIHVpbnQzMl90IG1hcmtlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCB3cml0ZVRpbWVzdGFtcCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFnQml0cyBwaXBlbGluZVN0YWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGVuZChEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgZW5kKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCByZXNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgcmVzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyUmVzZXRGbGFncyBmbGFncywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0NvbW1hbmRCdWZmZXIoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fY29tbWFuZEJ1ZmZlcjsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2NvbW1hbmRCdWZmZXIgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fY29tbWFuZEJ1ZmZlciA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa0NvbW1hbmRCdWZmZXIgbV9jb21tYW5kQnVmZmVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIENvbW1hbmRCdWZmZXIgKSA9PSBzaXplb2YoIFZrQ29tbWFuZEJ1ZmZlciApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplQ29tbWFuZEJ1ZmZlcj4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBDb21tYW5kQnVmZmVyOworICB9OworCisgIGNsYXNzIERldmljZU1lbW9yeQorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrRGV2aWNlTWVtb3J5OworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVEZXZpY2VNZW1vcnk7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZU1lbW9yeSgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kZXZpY2VNZW1vcnkoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZU1lbW9yeSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZGV2aWNlTWVtb3J5KFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIERldmljZU1lbW9yeSggVmtEZXZpY2VNZW1vcnkgZGV2aWNlTWVtb3J5ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2RldmljZU1lbW9yeSggZGV2aWNlTWVtb3J5ICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgRGV2aWNlTWVtb3J5ICYgb3BlcmF0b3I9KFZrRGV2aWNlTWVtb3J5IGRldmljZU1lbW9yeSkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fZGV2aWNlTWVtb3J5ID0gZGV2aWNlTWVtb3J5OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgRGV2aWNlTWVtb3J5ICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2RldmljZU1lbW9yeSA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlTWVtb3J5IGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RldmljZU1lbW9yeSA9PSByaHMubV9kZXZpY2VNZW1vcnk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KERldmljZU1lbW9yeSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXZpY2VNZW1vcnkgIT0gcmhzLm1fZGV2aWNlTWVtb3J5OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KERldmljZU1lbW9yeSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXZpY2VNZW1vcnkgPCByaHMubV9kZXZpY2VNZW1vcnk7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0RldmljZU1lbW9yeSgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXZpY2VNZW1vcnk7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXZpY2VNZW1vcnkgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGV2aWNlTWVtb3J5ID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrRGV2aWNlTWVtb3J5IG1fZGV2aWNlTWVtb3J5OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERldmljZU1lbW9yeSApID09IHNpemVvZiggVmtEZXZpY2VNZW1vcnkgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZURldmljZU1lbW9yeT4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBEZXZpY2VNZW1vcnk7CisgIH07CisKKyAgY2xhc3MgQnVmZmVyVmlldworICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrQnVmZmVyVmlldzsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplQnVmZmVyVmlldzsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVmZmVyVmlldygpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9idWZmZXJWaWV3KFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBCdWZmZXJWaWV3KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9idWZmZXJWaWV3KFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIEJ1ZmZlclZpZXcoIFZrQnVmZmVyVmlldyBidWZmZXJWaWV3ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2J1ZmZlclZpZXcoIGJ1ZmZlclZpZXcgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBCdWZmZXJWaWV3ICYgb3BlcmF0b3I9KFZrQnVmZmVyVmlldyBidWZmZXJWaWV3KSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9idWZmZXJWaWV3ID0gYnVmZmVyVmlldzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIEJ1ZmZlclZpZXcgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fYnVmZmVyVmlldyA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQnVmZmVyVmlldyBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9idWZmZXJWaWV3ID09IHJocy5tX2J1ZmZlclZpZXc7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KEJ1ZmZlclZpZXcgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fYnVmZmVyVmlldyAhPSByaHMubV9idWZmZXJWaWV3OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KEJ1ZmZlclZpZXcgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fYnVmZmVyVmlldyA8IHJocy5tX2J1ZmZlclZpZXc7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0J1ZmZlclZpZXcoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fYnVmZmVyVmlldzsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2J1ZmZlclZpZXcgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fYnVmZmVyVmlldyA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa0J1ZmZlclZpZXcgbV9idWZmZXJWaWV3OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEJ1ZmZlclZpZXcgKSA9PSBzaXplb2YoIFZrQnVmZmVyVmlldyApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplQnVmZmVyVmlldz4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBCdWZmZXJWaWV3OworICB9OworCisgIGNsYXNzIENvbW1hbmRQb29sCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtDb21tYW5kUG9vbDsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplQ29tbWFuZFBvb2w7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRQb29sKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2NvbW1hbmRQb29sKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kUG9vbCggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fY29tbWFuZFBvb2woVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgQ29tbWFuZFBvb2woIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fY29tbWFuZFBvb2woIGNvbW1hbmRQb29sICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgQ29tbWFuZFBvb2wgJiBvcGVyYXRvcj0oVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fY29tbWFuZFBvb2wgPSBjb21tYW5kUG9vbDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIENvbW1hbmRQb29sICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2NvbW1hbmRQb29sID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBDb21tYW5kUG9vbCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9jb21tYW5kUG9vbCA9PSByaHMubV9jb21tYW5kUG9vbDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oQ29tbWFuZFBvb2wgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fY29tbWFuZFBvb2wgIT0gcmhzLm1fY29tbWFuZFBvb2w7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoQ29tbWFuZFBvb2wgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fY29tbWFuZFBvb2wgPCByaHMubV9jb21tYW5kUG9vbDsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrQ29tbWFuZFBvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fY29tbWFuZFBvb2w7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9jb21tYW5kUG9vbCAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9jb21tYW5kUG9vbCA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa0NvbW1hbmRQb29sIG1fY29tbWFuZFBvb2w7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ29tbWFuZFBvb2wgKSA9PSBzaXplb2YoIFZrQ29tbWFuZFBvb2wgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZUNvbW1hbmRQb29sPgorICB7CisgICAgdXNpbmcgdHlwZSA9IENvbW1hbmRQb29sOworICB9OworCisgIGNsYXNzIFBpcGVsaW5lQ2FjaGUKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa1BpcGVsaW5lQ2FjaGU7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZVBpcGVsaW5lQ2FjaGU7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lQ2FjaGUoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcGlwZWxpbmVDYWNoZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVDYWNoZSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcGlwZWxpbmVDYWNoZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBQaXBlbGluZUNhY2hlKCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9waXBlbGluZUNhY2hlKCBwaXBlbGluZUNhY2hlICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgUGlwZWxpbmVDYWNoZSAmIG9wZXJhdG9yPShWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fcGlwZWxpbmVDYWNoZSA9IHBpcGVsaW5lQ2FjaGU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBQaXBlbGluZUNhY2hlICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3BpcGVsaW5lQ2FjaGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lQ2FjaGUgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGlwZWxpbmVDYWNoZSA9PSByaHMubV9waXBlbGluZUNhY2hlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShQaXBlbGluZUNhY2hlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BpcGVsaW5lQ2FjaGUgIT0gcmhzLm1fcGlwZWxpbmVDYWNoZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChQaXBlbGluZUNhY2hlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BpcGVsaW5lQ2FjaGUgPCByaHMubV9waXBlbGluZUNhY2hlOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtQaXBlbGluZUNhY2hlKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BpcGVsaW5lQ2FjaGU7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waXBlbGluZUNhY2hlICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BpcGVsaW5lQ2FjaGUgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtQaXBlbGluZUNhY2hlIG1fcGlwZWxpbmVDYWNoZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZUNhY2hlICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lQ2FjaGUgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZVBpcGVsaW5lQ2FjaGU+CisgIHsKKyAgICB1c2luZyB0eXBlID0gUGlwZWxpbmVDYWNoZTsKKyAgfTsKKworICBjbGFzcyBEZXNjcmlwdG9yUG9vbAorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrRGVzY3JpcHRvclBvb2w7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZURlc2NyaXB0b3JQb29sOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yUG9vbCgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kZXNjcmlwdG9yUG9vbChWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclBvb2woIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rlc2NyaXB0b3JQb29sKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIERlc2NyaXB0b3JQb29sKCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rlc2NyaXB0b3JQb29sKCBkZXNjcmlwdG9yUG9vbCApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIERlc2NyaXB0b3JQb29sICYgb3BlcmF0b3I9KFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2Rlc2NyaXB0b3JQb29sID0gZGVzY3JpcHRvclBvb2w7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBEZXNjcmlwdG9yUG9vbCAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9kZXNjcmlwdG9yUG9vbCA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGVzY3JpcHRvclBvb2wgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclBvb2wgPT0gcmhzLm1fZGVzY3JpcHRvclBvb2w7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KERlc2NyaXB0b3JQb29sIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JQb29sICE9IHJocy5tX2Rlc2NyaXB0b3JQb29sOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KERlc2NyaXB0b3JQb29sIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JQb29sIDwgcmhzLm1fZGVzY3JpcHRvclBvb2w7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0Rlc2NyaXB0b3JQb29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JQb29sOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclBvb2wgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclBvb2wgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtEZXNjcmlwdG9yUG9vbCBtX2Rlc2NyaXB0b3JQb29sOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JQb29sICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JQb29sICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVEZXNjcmlwdG9yUG9vbD4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBEZXNjcmlwdG9yUG9vbDsKKyAgfTsKKworICBjbGFzcyBEZXNjcmlwdG9yU2V0TGF5b3V0CisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtEZXNjcmlwdG9yU2V0TGF5b3V0OworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVEZXNjcmlwdG9yU2V0TGF5b3V0OworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yU2V0TGF5b3V0KCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rlc2NyaXB0b3JTZXRMYXlvdXQoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JTZXRMYXlvdXQoIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rlc2NyaXB0b3JTZXRMYXlvdXQoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgRGVzY3JpcHRvclNldExheW91dCggVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRlc2NyaXB0b3JTZXRMYXlvdXQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZGVzY3JpcHRvclNldExheW91dCggZGVzY3JpcHRvclNldExheW91dCApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIERlc2NyaXB0b3JTZXRMYXlvdXQgJiBvcGVyYXRvcj0oVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRlc2NyaXB0b3JTZXRMYXlvdXQpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2Rlc2NyaXB0b3JTZXRMYXlvdXQgPSBkZXNjcmlwdG9yU2V0TGF5b3V0OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgRGVzY3JpcHRvclNldExheW91dCAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9kZXNjcmlwdG9yU2V0TGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3JTZXRMYXlvdXQgPT0gcmhzLm1fZGVzY3JpcHRvclNldExheW91dDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oRGVzY3JpcHRvclNldExheW91dCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXNjcmlwdG9yU2V0TGF5b3V0ICE9IHJocy5tX2Rlc2NyaXB0b3JTZXRMYXlvdXQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoRGVzY3JpcHRvclNldExheW91dCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXNjcmlwdG9yU2V0TGF5b3V0IDwgcmhzLm1fZGVzY3JpcHRvclNldExheW91dDsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrRGVzY3JpcHRvclNldExheW91dCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXNjcmlwdG9yU2V0TGF5b3V0OworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGVzY3JpcHRvclNldExheW91dCAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXNjcmlwdG9yU2V0TGF5b3V0ID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrRGVzY3JpcHRvclNldExheW91dCBtX2Rlc2NyaXB0b3JTZXRMYXlvdXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVzY3JpcHRvclNldExheW91dCApID09IHNpemVvZiggVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVEZXNjcmlwdG9yU2V0TGF5b3V0PgorICB7CisgICAgdXNpbmcgdHlwZSA9IERlc2NyaXB0b3JTZXRMYXlvdXQ7CisgIH07CisKKyAgY2xhc3MgRnJhbWVidWZmZXIKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa0ZyYW1lYnVmZmVyOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVGcmFtZWJ1ZmZlcjsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRnJhbWVidWZmZXIoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZnJhbWVidWZmZXIoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZyYW1lYnVmZmVyKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9mcmFtZWJ1ZmZlcihWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBGcmFtZWJ1ZmZlciggVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9mcmFtZWJ1ZmZlciggZnJhbWVidWZmZXIgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBGcmFtZWJ1ZmZlciAmIG9wZXJhdG9yPShWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgRnJhbWVidWZmZXIgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fZnJhbWVidWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEZyYW1lYnVmZmVyIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ZyYW1lYnVmZmVyID09IHJocy5tX2ZyYW1lYnVmZmVyOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShGcmFtZWJ1ZmZlciBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9mcmFtZWJ1ZmZlciAhPSByaHMubV9mcmFtZWJ1ZmZlcjsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChGcmFtZWJ1ZmZlciBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9mcmFtZWJ1ZmZlciA8IHJocy5tX2ZyYW1lYnVmZmVyOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtGcmFtZWJ1ZmZlcigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9mcmFtZWJ1ZmZlcjsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ZyYW1lYnVmZmVyICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2ZyYW1lYnVmZmVyID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrRnJhbWVidWZmZXIgbV9mcmFtZWJ1ZmZlcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBGcmFtZWJ1ZmZlciApID09IHNpemVvZiggVmtGcmFtZWJ1ZmZlciApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplRnJhbWVidWZmZXI+CisgIHsKKyAgICB1c2luZyB0eXBlID0gRnJhbWVidWZmZXI7CisgIH07CisKKyAgY2xhc3MgSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWAorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9pbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9pbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIEluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIGluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYICYgb3BlcmF0b3I9KFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9pbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID0gaW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIEluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1faW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID09IHJocy5tX2luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KEluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1faW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAhPSByaHMubV9pbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KEluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1faW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA8IHJocy5tX2luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1faW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1faW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggbV9pbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggKSA9PSBzaXplb2YoIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWD4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYOworICB9OworCisgIGNsYXNzIE9iamVjdFRhYmxlTlZYCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtPYmplY3RUYWJsZU5WWDsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplT2JqZWN0VGFibGVOVlg7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE9iamVjdFRhYmxlTlZYKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX29iamVjdFRhYmxlTlZYKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBPYmplY3RUYWJsZU5WWCggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fb2JqZWN0VGFibGVOVlgoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgT2JqZWN0VGFibGVOVlgoIFZrT2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGVOVlggKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fb2JqZWN0VGFibGVOVlgoIG9iamVjdFRhYmxlTlZYICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgT2JqZWN0VGFibGVOVlggJiBvcGVyYXRvcj0oVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZU5WWCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fb2JqZWN0VGFibGVOVlggPSBvYmplY3RUYWJsZU5WWDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIE9iamVjdFRhYmxlTlZYICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX29iamVjdFRhYmxlTlZYID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBPYmplY3RUYWJsZU5WWCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9vYmplY3RUYWJsZU5WWCA9PSByaHMubV9vYmplY3RUYWJsZU5WWDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oT2JqZWN0VGFibGVOVlggY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fb2JqZWN0VGFibGVOVlggIT0gcmhzLm1fb2JqZWN0VGFibGVOVlg7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoT2JqZWN0VGFibGVOVlggY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fb2JqZWN0VGFibGVOVlggPCByaHMubV9vYmplY3RUYWJsZU5WWDsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrT2JqZWN0VGFibGVOVlgoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fb2JqZWN0VGFibGVOVlg7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9vYmplY3RUYWJsZU5WWCAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9vYmplY3RUYWJsZU5WWCA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa09iamVjdFRhYmxlTlZYIG1fb2JqZWN0VGFibGVOVlg7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggT2JqZWN0VGFibGVOVlggKSA9PSBzaXplb2YoIFZrT2JqZWN0VGFibGVOVlggKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZU9iamVjdFRhYmxlTlZYPgorICB7CisgICAgdXNpbmcgdHlwZSA9IE9iamVjdFRhYmxlTlZYOworICB9OworCisgIGNsYXNzIFJlbmRlclBhc3MKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa1JlbmRlclBhc3M7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZVJlbmRlclBhc3M7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFJlbmRlclBhc3MoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcmVuZGVyUGFzcyhWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUmVuZGVyUGFzcyggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcmVuZGVyUGFzcyhWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBSZW5kZXJQYXNzKCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9yZW5kZXJQYXNzKCByZW5kZXJQYXNzICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgUmVuZGVyUGFzcyAmIG9wZXJhdG9yPShWa1JlbmRlclBhc3MgcmVuZGVyUGFzcykgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fcmVuZGVyUGFzcyA9IHJlbmRlclBhc3M7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBSZW5kZXJQYXNzICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3JlbmRlclBhc3MgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFJlbmRlclBhc3MgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcmVuZGVyUGFzcyA9PSByaHMubV9yZW5kZXJQYXNzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShSZW5kZXJQYXNzIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3JlbmRlclBhc3MgIT0gcmhzLm1fcmVuZGVyUGFzczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChSZW5kZXJQYXNzIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3JlbmRlclBhc3MgPCByaHMubV9yZW5kZXJQYXNzOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtSZW5kZXJQYXNzKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3JlbmRlclBhc3M7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9yZW5kZXJQYXNzICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3JlbmRlclBhc3MgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtSZW5kZXJQYXNzIG1fcmVuZGVyUGFzczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBSZW5kZXJQYXNzICkgPT0gc2l6ZW9mKCBWa1JlbmRlclBhc3MgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZVJlbmRlclBhc3M+CisgIHsKKyAgICB1c2luZyB0eXBlID0gUmVuZGVyUGFzczsKKyAgfTsKKworICBjbGFzcyBTYW1wbGVyCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIENUeXBlID0gVmtTYW1wbGVyOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVTYW1wbGVyOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTYW1wbGVyKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3NhbXBsZXIoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNhbXBsZXIoIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3NhbXBsZXIoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgU2FtcGxlciggVmtTYW1wbGVyIHNhbXBsZXIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fc2FtcGxlciggc2FtcGxlciApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIFNhbXBsZXIgJiBvcGVyYXRvcj0oVmtTYW1wbGVyIHNhbXBsZXIpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3NhbXBsZXIgPSBzYW1wbGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgU2FtcGxlciAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9zYW1wbGVyID0gVktfTlVMTF9IQU5ETEU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTYW1wbGVyIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3NhbXBsZXIgPT0gcmhzLm1fc2FtcGxlcjsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oU2FtcGxlciBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zYW1wbGVyICE9IHJocy5tX3NhbXBsZXI7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoU2FtcGxlciBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zYW1wbGVyIDwgcmhzLm1fc2FtcGxlcjsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrU2FtcGxlcigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zYW1wbGVyOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2FtcGxlciAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zYW1wbGVyID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrU2FtcGxlciBtX3NhbXBsZXI7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU2FtcGxlciApID09IHNpemVvZiggVmtTYW1wbGVyICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVTYW1wbGVyPgorICB7CisgICAgdXNpbmcgdHlwZSA9IFNhbXBsZXI7CisgIH07CisKKyAgY2xhc3MgU2FtcGxlclljYmNyQ29udmVyc2lvbgorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2FtcGxlclljYmNyQ29udmVyc2lvbigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9zYW1wbGVyWWNiY3JDb252ZXJzaW9uKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9zYW1wbGVyWWNiY3JDb252ZXJzaW9uKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIFNhbXBsZXJZY2JjckNvbnZlcnNpb24oIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiBzYW1wbGVyWWNiY3JDb252ZXJzaW9uICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3NhbXBsZXJZY2JjckNvbnZlcnNpb24oIHNhbXBsZXJZY2JjckNvbnZlcnNpb24gKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBTYW1wbGVyWWNiY3JDb252ZXJzaW9uICYgb3BlcmF0b3I9KFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiBzYW1wbGVyWWNiY3JDb252ZXJzaW9uKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9zYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gc2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb24gJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fc2FtcGxlclljYmNyQ29udmVyc2lvbiA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU2FtcGxlclljYmNyQ29udmVyc2lvbiBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zYW1wbGVyWWNiY3JDb252ZXJzaW9uID09IHJocy5tX3NhbXBsZXJZY2JjckNvbnZlcnNpb247CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KFNhbXBsZXJZY2JjckNvbnZlcnNpb24gY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2FtcGxlclljYmNyQ29udmVyc2lvbiAhPSByaHMubV9zYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KFNhbXBsZXJZY2JjckNvbnZlcnNpb24gY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2FtcGxlclljYmNyQ29udmVyc2lvbiA8IHJocy5tX3NhbXBsZXJZY2JjckNvbnZlcnNpb247CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24oKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3NhbXBsZXJZY2JjckNvbnZlcnNpb24gIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2FtcGxlclljYmNyQ29udmVyc2lvbiA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gbV9zYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNhbXBsZXJZY2JjckNvbnZlcnNpb24gKSA9PSBzaXplb2YoIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplU2FtcGxlclljYmNyQ29udmVyc2lvbj4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBTYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICB9OworICB1c2luZyBTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKworICBjbGFzcyBTaGFkZXJNb2R1bGUKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa1NoYWRlck1vZHVsZTsKKworICAgIHN0YXRpYyBWVUxLQU5fSFBQX0NPTlNUX09SX0NPTlNURVhQUiBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBPYmplY3RUeXBlOjplU2hhZGVyTW9kdWxlOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTaGFkZXJNb2R1bGUoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fc2hhZGVyTW9kdWxlKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTaGFkZXJNb2R1bGUoIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3NoYWRlck1vZHVsZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBTaGFkZXJNb2R1bGUoIFZrU2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9zaGFkZXJNb2R1bGUoIHNoYWRlck1vZHVsZSApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIFNoYWRlck1vZHVsZSAmIG9wZXJhdG9yPShWa1NoYWRlck1vZHVsZSBzaGFkZXJNb2R1bGUpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3NoYWRlck1vZHVsZSA9IHNoYWRlck1vZHVsZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIFNoYWRlck1vZHVsZSAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9zaGFkZXJNb2R1bGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNoYWRlck1vZHVsZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9zaGFkZXJNb2R1bGUgPT0gcmhzLm1fc2hhZGVyTW9kdWxlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShTaGFkZXJNb2R1bGUgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2hhZGVyTW9kdWxlICE9IHJocy5tX3NoYWRlck1vZHVsZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChTaGFkZXJNb2R1bGUgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2hhZGVyTW9kdWxlIDwgcmhzLm1fc2hhZGVyTW9kdWxlOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfVFlQRVNBRkVfRVhQTElDSVQgb3BlcmF0b3IgVmtTaGFkZXJNb2R1bGUoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2hhZGVyTW9kdWxlOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fc2hhZGVyTW9kdWxlICE9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3NoYWRlck1vZHVsZSA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa1NoYWRlck1vZHVsZSBtX3NoYWRlck1vZHVsZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTaGFkZXJNb2R1bGUgKSA9PSBzaXplb2YoIFZrU2hhZGVyTW9kdWxlICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVTaGFkZXJNb2R1bGU+CisgIHsKKyAgICB1c2luZyB0eXBlID0gU2hhZGVyTW9kdWxlOworICB9OworCisgIGNsYXNzIFZhbGlkYXRpb25DYWNoZUVYVAorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrVmFsaWRhdGlvbkNhY2hlRVhUOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVWYWxpZGF0aW9uQ2FjaGVFWFQ7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFZhbGlkYXRpb25DYWNoZUVYVCgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV92YWxpZGF0aW9uQ2FjaGVFWFQoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFZhbGlkYXRpb25DYWNoZUVYVCggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fdmFsaWRhdGlvbkNhY2hlRVhUKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIFZhbGlkYXRpb25DYWNoZUVYVCggVmtWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlRVhUICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX3ZhbGlkYXRpb25DYWNoZUVYVCggdmFsaWRhdGlvbkNhY2hlRVhUICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgVmFsaWRhdGlvbkNhY2hlRVhUICYgb3BlcmF0b3I9KFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZUVYVCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fdmFsaWRhdGlvbkNhY2hlRVhUID0gdmFsaWRhdGlvbkNhY2hlRVhUOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgVmFsaWRhdGlvbkNhY2hlRVhUICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX3ZhbGlkYXRpb25DYWNoZUVYVCA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggVmFsaWRhdGlvbkNhY2hlRVhUIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3ZhbGlkYXRpb25DYWNoZUVYVCA9PSByaHMubV92YWxpZGF0aW9uQ2FjaGVFWFQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KFZhbGlkYXRpb25DYWNoZUVYVCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV92YWxpZGF0aW9uQ2FjaGVFWFQgIT0gcmhzLm1fdmFsaWRhdGlvbkNhY2hlRVhUOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KFZhbGlkYXRpb25DYWNoZUVYVCBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV92YWxpZGF0aW9uQ2FjaGVFWFQgPCByaHMubV92YWxpZGF0aW9uQ2FjaGVFWFQ7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa1ZhbGlkYXRpb25DYWNoZUVYVCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV92YWxpZGF0aW9uQ2FjaGVFWFQ7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV92YWxpZGF0aW9uQ2FjaGVFWFQgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fdmFsaWRhdGlvbkNhY2hlRVhUID09IFZLX05VTExfSEFORExFOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUIG1fdmFsaWRhdGlvbkNhY2hlRVhUOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFZhbGlkYXRpb25DYWNoZUVYVCApID09IHNpemVvZiggVmtWYWxpZGF0aW9uQ2FjaGVFWFQgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZVZhbGlkYXRpb25DYWNoZUVYVD4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBWYWxpZGF0aW9uQ2FjaGVFWFQ7CisgIH07CisKKyAgY2xhc3MgUXVldWUKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa1F1ZXVlOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVRdWV1ZTsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUXVldWUoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcXVldWUoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFF1ZXVlKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9xdWV1ZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBRdWV1ZSggVmtRdWV1ZSBxdWV1ZSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9xdWV1ZSggcXVldWUgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBRdWV1ZSAmIG9wZXJhdG9yPShWa1F1ZXVlIHF1ZXVlKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9xdWV1ZSA9IHF1ZXVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgUXVldWUgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fcXVldWUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFF1ZXVlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3F1ZXVlID09IHJocy5tX3F1ZXVlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShRdWV1ZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9xdWV1ZSAhPSByaHMubV9xdWV1ZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChRdWV1ZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9xdWV1ZSA8IHJocy5tX3F1ZXVlOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldENoZWNrcG9pbnREYXRhTlYoIHVpbnQzMl90KiBwQ2hlY2twb2ludERhdGFDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNoZWNrcG9pbnREYXRhTlYqIHBDaGVja3BvaW50RGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8Q2hlY2twb2ludERhdGFOVj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxDaGVja3BvaW50RGF0YU5WLEFsbG9jYXRvcj4gZ2V0Q2hlY2twb2ludERhdGFOVihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8Q2hlY2twb2ludERhdGFOVj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxDaGVja3BvaW50RGF0YU5WLEFsbG9jYXRvcj4gZ2V0Q2hlY2twb2ludERhdGFOVihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBiZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggY29uc3QgRGVidWdVdGlsc0xhYmVsRVhUICYgbGFiZWxJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgYmluZFNwYXJzZSggdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRTcGFyc2VJbmZvKiBwQmluZEluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgYmluZFNwYXJzZSggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZFNwYXJzZUluZm8+IGJpbmRJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGVuZERlYnVnVXRpbHNMYWJlbEVYVChEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGluc2VydERlYnVnVXRpbHNMYWJlbEVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgaW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCBjb25zdCBEZWJ1Z1V0aWxzTGFiZWxFWFQgJiBsYWJlbEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBwcmVzZW50S0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJlc2VudEluZm9LSFIqIHBQcmVzZW50SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgcHJlc2VudEtIUiggY29uc3QgUHJlc2VudEluZm9LSFIgJiBwcmVzZW50SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IHNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uZmlndXJhdGlvbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIHNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uZmlndXJhdGlvbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBzdWJtaXQoIHVpbnQzMl90IHN1Ym1pdENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VibWl0SW5mbyogcFN1Ym1pdHMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgc3VibWl0KCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJtaXRJbmZvPiBzdWJtaXRzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCB3YWl0SWRsZShEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgd2FpdElkbGUoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa1F1ZXVlKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3F1ZXVlOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcXVldWUgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcXVldWUgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtRdWV1ZSBtX3F1ZXVlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFF1ZXVlICkgPT0gc2l6ZW9mKCBWa1F1ZXVlICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVRdWV1ZT4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBRdWV1ZTsKKyAgfTsKKworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICBjbGFzcyBEZXZpY2U7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaD4gY2xhc3MgVW5pcXVlSGFuZGxlVHJhaXRzPEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PERldmljZSwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IFVuaXF1ZUhhbmRsZTxBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT47CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaD4gY2xhc3MgVW5pcXVlSGFuZGxlVHJhaXRzPEJ1ZmZlciwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxEZXZpY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlQnVmZmVyID0gVW5pcXVlSGFuZGxlPEJ1ZmZlciwgVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT47CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaD4gY2xhc3MgVW5pcXVlSGFuZGxlVHJhaXRzPEJ1ZmZlclZpZXcsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZUJ1ZmZlclZpZXcgPSBVbmlxdWVIYW5kbGU8QnVmZmVyVmlldywgVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT47CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaD4gY2xhc3MgVW5pcXVlSGFuZGxlVHJhaXRzPENvbW1hbmRCdWZmZXIsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IFBvb2xGcmVlPERldmljZSwgQ29tbWFuZFBvb2wsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlQ29tbWFuZEJ1ZmZlciA9IFVuaXF1ZUhhbmRsZTxDb21tYW5kQnVmZmVyLCBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPjsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERpc3BhdGNoPiBjbGFzcyBVbmlxdWVIYW5kbGVUcmFpdHM8Q29tbWFuZFBvb2wsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZUNvbW1hbmRQb29sID0gVW5pcXVlSGFuZGxlPENvbW1hbmRQb29sLCBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPjsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERpc3BhdGNoPiBjbGFzcyBVbmlxdWVIYW5kbGVUcmFpdHM8RGVzY3JpcHRvclBvb2wsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZURlc2NyaXB0b3JQb29sID0gVW5pcXVlSGFuZGxlPERlc2NyaXB0b3JQb29sLCBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPjsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERpc3BhdGNoPiBjbGFzcyBVbmlxdWVIYW5kbGVUcmFpdHM8RGVzY3JpcHRvclNldCwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gUG9vbEZyZWU8RGV2aWNlLCBEZXNjcmlwdG9yUG9vbCwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVEZXNjcmlwdG9yU2V0ID0gVW5pcXVlSGFuZGxlPERlc2NyaXB0b3JTZXQsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxEZXNjcmlwdG9yU2V0TGF5b3V0LCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PERldmljZSwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVEZXNjcmlwdG9yU2V0TGF5b3V0ID0gVW5pcXVlSGFuZGxlPERlc2NyaXB0b3JTZXRMYXlvdXQsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxEZXZpY2VNZW1vcnksIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdEZyZWU8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZURldmljZU1lbW9yeSA9IFVuaXF1ZUhhbmRsZTxEZXZpY2VNZW1vcnksIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxFdmVudCwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxEZXZpY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlRXZlbnQgPSBVbmlxdWVIYW5kbGU8RXZlbnQsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxGZW5jZSwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxEZXZpY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlRmVuY2UgPSBVbmlxdWVIYW5kbGU8RmVuY2UsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxGcmFtZWJ1ZmZlciwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxEZXZpY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlRnJhbWVidWZmZXIgPSBVbmlxdWVIYW5kbGU8RnJhbWVidWZmZXIsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxJbWFnZSwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxEZXZpY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlSW1hZ2UgPSBVbmlxdWVIYW5kbGU8SW1hZ2UsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxJbWFnZVZpZXcsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZUltYWdlVmlldyA9IFVuaXF1ZUhhbmRsZTxJbWFnZVZpZXcsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PERldmljZSwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID0gVW5pcXVlSGFuZGxlPEluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxPYmplY3RUYWJsZU5WWCwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxEZXZpY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlT2JqZWN0VGFibGVOVlggPSBVbmlxdWVIYW5kbGU8T2JqZWN0VGFibGVOVlgsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxQaXBlbGluZSwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxEZXZpY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlUGlwZWxpbmUgPSBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxQaXBlbGluZUNhY2hlLCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PERldmljZSwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVQaXBlbGluZUNhY2hlID0gVW5pcXVlSGFuZGxlPFBpcGVsaW5lQ2FjaGUsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxQaXBlbGluZUxheW91dCwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxEZXZpY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlUGlwZWxpbmVMYXlvdXQgPSBVbmlxdWVIYW5kbGU8UGlwZWxpbmVMYXlvdXQsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxRdWVyeVBvb2wsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZVF1ZXJ5UG9vbCA9IFVuaXF1ZUhhbmRsZTxRdWVyeVBvb2wsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxSZW5kZXJQYXNzLCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PERldmljZSwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVSZW5kZXJQYXNzID0gVW5pcXVlSGFuZGxlPFJlbmRlclBhc3MsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxTYW1wbGVyLCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PERldmljZSwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVTYW1wbGVyID0gVW5pcXVlSGFuZGxlPFNhbXBsZXIsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxTYW1wbGVyWWNiY3JDb252ZXJzaW9uLCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PERldmljZSwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gVW5pcXVlSGFuZGxlPFNhbXBsZXJZY2JjckNvbnZlcnNpb24sIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxTZW1hcGhvcmUsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZVNlbWFwaG9yZSA9IFVuaXF1ZUhhbmRsZTxTZW1hcGhvcmUsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxTaGFkZXJNb2R1bGUsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZVNoYWRlck1vZHVsZSA9IFVuaXF1ZUhhbmRsZTxTaGFkZXJNb2R1bGUsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxTd2FwY2hhaW5LSFIsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZVN3YXBjaGFpbktIUiA9IFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxWYWxpZGF0aW9uQ2FjaGVFWFQsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8RGV2aWNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZVZhbGlkYXRpb25DYWNoZUVYVCA9IFVuaXF1ZUhhbmRsZTxWYWxpZGF0aW9uQ2FjaGVFWFQsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworCisgIGNsYXNzIERldmljZQorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrRGV2aWNlOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVEZXZpY2U7CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZSgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kZXZpY2UoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fZGV2aWNlKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIERldmljZSggVmtEZXZpY2UgZGV2aWNlICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2RldmljZSggZGV2aWNlICkKKyAgICB7fQorCisjaWYgZGVmaW5lZChWVUxLQU5fSFBQX1RZUEVTQUZFX0NPTlZFUlNJT04pCisgICAgRGV2aWNlICYgb3BlcmF0b3I9KFZrRGV2aWNlIGRldmljZSkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fZGV2aWNlID0gZGV2aWNlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgRGV2aWNlICYgb3BlcmF0b3I9KCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2RldmljZSA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RldmljZSA9PSByaHMubV9kZXZpY2U7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KERldmljZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXZpY2UgIT0gcmhzLm1fZGV2aWNlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KERldmljZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXZpY2UgPCByaHMubV9kZXZpY2U7CisgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBhY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgYWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGFjcXVpcmVOZXh0SW1hZ2UyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNxdWlyZU5leHRJbWFnZUluZm9LSFIqIHBBY3F1aXJlSW5mbywgdWludDMyX3QqIHBJbWFnZUluZGV4LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlPHVpbnQzMl90PiBhY3F1aXJlTmV4dEltYWdlMktIUiggY29uc3QgQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgJiBhY3F1aXJlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBhY3F1aXJlTmV4dEltYWdlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDY0X3QgdGltZW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZSwgdWludDMyX3QqIHBJbWFnZUluZGV4LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlPHVpbnQzMl90PiBhY3F1aXJlTmV4dEltYWdlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDY0X3QgdGltZW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBhY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogcENvbmZpZ3VyYXRpb24sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTD46OnR5cGUgYWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBjb25zdCBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMICYgYWNxdWlyZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgYWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqIHBJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBhY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiggY29uc3QgQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBhbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPENvbW1hbmRCdWZmZXI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPENvbW1hbmRCdWZmZXIsQWxsb2NhdG9yPj46OnR5cGUgYWxsb2NhdGVDb21tYW5kQnVmZmVycyggY29uc3QgQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPENvbW1hbmRCdWZmZXI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPENvbW1hbmRCdWZmZXIsQWxsb2NhdG9yPj46OnR5cGUgYWxsb2NhdGVDb21tYW5kQnVmZmVycyggY29uc3QgQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8VW5pcXVlQ29tbWFuZEJ1ZmZlcj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPENvbW1hbmRCdWZmZXIsRGlzcGF0Y2g+LEFsbG9jYXRvcj4+Ojp0eXBlIGFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnNVbmlxdWUoIGNvbnN0IENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gJiBhbGxvY2F0ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxVbmlxdWVDb21tYW5kQnVmZmVyPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8Q29tbWFuZEJ1ZmZlcixEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgYWxsb2NhdGVDb21tYW5kQnVmZmVyc1VuaXF1ZSggY29uc3QgQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGFsbG9jYXRlRGVzY3JpcHRvclNldHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8RGVzY3JpcHRvclNldD4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGVzY3JpcHRvclNldCxBbGxvY2F0b3I+Pjo6dHlwZSBhbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCBjb25zdCBEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICYgYWxsb2NhdGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8RGVzY3JpcHRvclNldD4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGVzY3JpcHRvclNldCxBbGxvY2F0b3I+Pjo6dHlwZSBhbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCBjb25zdCBEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICYgYWxsb2NhdGVJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxVbmlxdWVEZXNjcmlwdG9yU2V0PiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8RGVzY3JpcHRvclNldCxEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgYWxsb2NhdGVEZXNjcmlwdG9yU2V0c1VuaXF1ZSggY29uc3QgRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFVuaXF1ZURlc2NyaXB0b3JTZXQ+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yU2V0LERpc3BhdGNoPixBbGxvY2F0b3I+Pjo6dHlwZSBhbGxvY2F0ZURlc2NyaXB0b3JTZXRzVW5pcXVlKCBjb25zdCBEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICYgYWxsb2NhdGVJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgYWxsb2NhdGVNZW1vcnkoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KiBwTWVtb3J5LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5Pjo6dHlwZSBhbGxvY2F0ZU1lbW9yeSggY29uc3QgTWVtb3J5QWxsb2NhdGVJbmZvICYgYWxsb2NhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8RGV2aWNlTWVtb3J5LERpc3BhdGNoPj46OnR5cGUgYWxsb2NhdGVNZW1vcnlVbmlxdWUoIGNvbnN0IE1lbW9yeUFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBiaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBwQmluZEluZm9zLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBiaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlY+IGJpbmRJbmZvcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGJpbmRCdWZmZXJNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgYmluZEJ1ZmZlck1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgYmluZEJ1ZmZlck1lbW9yeTIoIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgYmluZEJ1ZmZlck1lbW9yeTIoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRCdWZmZXJNZW1vcnlJbmZvPiBiaW5kSW5mb3MsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgYmluZEJ1ZmZlck1lbW9yeTJLSFIoIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgYmluZEJ1ZmZlck1lbW9yeTJLSFIoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRCdWZmZXJNZW1vcnlJbmZvPiBiaW5kSW5mb3MsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBiaW5kSW1hZ2VNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1lbW9yeU9mZnNldCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGJpbmRJbWFnZU1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGJpbmRJbWFnZU1lbW9yeTIoIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VNZW1vcnlJbmZvKiBwQmluZEluZm9zLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBiaW5kSW1hZ2VNZW1vcnkyKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VNZW1vcnlJbmZvPiBiaW5kSW5mb3MsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgYmluZEltYWdlTWVtb3J5MktIUiggdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGJpbmRJbWFnZU1lbW9yeTJLSFIoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeUluZm8+IGJpbmRJbmZvcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNvbXBpbGVEZWZlcnJlZE5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IHNoYWRlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGNvbXBpbGVEZWZlcnJlZE5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IHNoYWRlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj46OnR5cGUgY3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIGNvbnN0IEFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WVW5pcXVlKCBjb25zdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZUJ1ZmZlciggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciogcEJ1ZmZlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcj46OnR5cGUgY3JlYXRlQnVmZmVyKCBjb25zdCBCdWZmZXJDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEJ1ZmZlcixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUJ1ZmZlclVuaXF1ZSggY29uc3QgQnVmZmVyQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlQnVmZmVyVmlldyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXdDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJWaWV3KiBwVmlldywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXc+Ojp0eXBlIGNyZWF0ZUJ1ZmZlclZpZXcoIGNvbnN0IEJ1ZmZlclZpZXdDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEJ1ZmZlclZpZXcsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVCdWZmZXJWaWV3VW5pcXVlKCBjb25zdCBCdWZmZXJWaWV3Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlQ29tbWFuZFBvb2woIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sKiBwQ29tbWFuZFBvb2wsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbD46OnR5cGUgY3JlYXRlQ29tbWFuZFBvb2woIGNvbnN0IENvbW1hbmRQb29sQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxDb21tYW5kUG9vbCxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUNvbW1hbmRQb29sVW5pcXVlKCBjb25zdCBDb21tYW5kUG9vbENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSogcFBpcGVsaW5lcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBpcGVsaW5lPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaXBlbGluZSxBbGxvY2F0b3I+Pjo6dHlwZSBjcmVhdGVDb21wdXRlUGlwZWxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBpcGVsaW5lPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaXBlbGluZSxBbGxvY2F0b3I+Pjo6dHlwZSBjcmVhdGVDb21wdXRlUGlwZWxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFBpcGVsaW5lPjo6dHlwZSBjcmVhdGVDb21wdXRlUGlwZWxpbmUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IENvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8VW5pcXVlUGlwZWxpbmU+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgY3JlYXRlQ29tcHV0ZVBpcGVsaW5lc1VuaXF1ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbz4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxVbmlxdWVQaXBlbGluZT4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPFBpcGVsaW5lLERpc3BhdGNoPixBbGxvY2F0b3I+Pjo6dHlwZSBjcmVhdGVDb21wdXRlUGlwZWxpbmVzVW5pcXVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUNvbXB1dGVQaXBlbGluZVVuaXF1ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgY29uc3QgQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlRGVzY3JpcHRvclBvb2woIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sKiBwRGVzY3JpcHRvclBvb2wsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbD46OnR5cGUgY3JlYXRlRGVzY3JpcHRvclBvb2woIGNvbnN0IERlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yUG9vbCxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZURlc2NyaXB0b3JQb29sVW5pcXVlKCBjb25zdCBEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXQ+Ojp0eXBlIGNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoIGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPERlc2NyaXB0b3JTZXRMYXlvdXQsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0VW5pcXVlKCBjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPjo6dHlwZSBjcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoIGNvbnN0IERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLERpc3BhdGNoPj46OnR5cGUgY3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVW5pcXVlKCBjb25zdCBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU+Ojp0eXBlIGNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggY29uc3QgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFJVbmlxdWUoIGNvbnN0IERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZUV2ZW50KCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCogcEV2ZW50LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQ+Ojp0eXBlIGNyZWF0ZUV2ZW50KCBjb25zdCBFdmVudENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8RXZlbnQsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVFdmVudFVuaXF1ZSggY29uc3QgRXZlbnRDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVGZW5jZSggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UqIHBGZW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlPjo6dHlwZSBjcmVhdGVGZW5jZSggY29uc3QgRmVuY2VDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEZlbmNlLERpc3BhdGNoPj46OnR5cGUgY3JlYXRlRmVuY2VVbmlxdWUoIGNvbnN0IEZlbmNlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlRnJhbWVidWZmZXIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyKiBwRnJhbWVidWZmZXIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlcj46OnR5cGUgY3JlYXRlRnJhbWVidWZmZXIoIGNvbnN0IEZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxGcmFtZWJ1ZmZlcixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUZyYW1lYnVmZmVyVW5pcXVlKCBjb25zdCBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lKiBwUGlwZWxpbmVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGlwZWxpbmU+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBpcGVsaW5lLEFsbG9jYXRvcj4+Ojp0eXBlIGNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbz4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxQaXBlbGluZT4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmUsQWxsb2NhdG9yPj46OnR5cGUgY3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFBpcGVsaW5lPjo6dHlwZSBjcmVhdGVHcmFwaGljc1BpcGVsaW5lKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBjb25zdCBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxVbmlxdWVQaXBlbGluZT4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPFBpcGVsaW5lLERpc3BhdGNoPixBbGxvY2F0b3I+Pjo6dHlwZSBjcmVhdGVHcmFwaGljc1BpcGVsaW5lc1VuaXF1ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8+IGNyZWF0ZUluZm9zLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8VW5pcXVlUGlwZWxpbmU+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgY3JlYXRlR3JhcGhpY3NQaXBlbGluZXNVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVJbWFnZSggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UqIHBJbWFnZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlPjo6dHlwZSBjcmVhdGVJbWFnZSggY29uc3QgSW1hZ2VDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEltYWdlLERpc3BhdGNoPj46OnR5cGUgY3JlYXRlSW1hZ2VVbmlxdWUoIGNvbnN0IEltYWdlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlSW1hZ2VWaWV3KCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3KiBwVmlldywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlldz46OnR5cGUgY3JlYXRlSW1hZ2VWaWV3KCBjb25zdCBJbWFnZVZpZXdDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEltYWdlVmlldyxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUltYWdlVmlld1VuaXF1ZSggY29uc3QgSW1hZ2VWaWV3Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKiBwSW5kaXJlY3RDb21tYW5kc0xheW91dCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg+Ojp0eXBlIGNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIGNvbnN0IEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYVW5pcXVlKCBjb25zdCBJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlT2JqZWN0VGFibGVOVlgoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYKiBwT2JqZWN0VGFibGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZU5WWD46OnR5cGUgY3JlYXRlT2JqZWN0VGFibGVOVlgoIGNvbnN0IE9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxPYmplY3RUYWJsZU5WWCxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZU9iamVjdFRhYmxlTlZYVW5pcXVlKCBjb25zdCBPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVBpcGVsaW5lQ2FjaGUoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSogcFBpcGVsaW5lQ2FjaGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlPjo6dHlwZSBjcmVhdGVQaXBlbGluZUNhY2hlKCBjb25zdCBQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxQaXBlbGluZUNhY2hlLERpc3BhdGNoPj46OnR5cGUgY3JlYXRlUGlwZWxpbmVDYWNoZVVuaXF1ZSggY29uc3QgUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVBpcGVsaW5lTGF5b3V0KCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCogcFBpcGVsaW5lTGF5b3V0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQ+Ojp0eXBlIGNyZWF0ZVBpcGVsaW5lTGF5b3V0KCBjb25zdCBQaXBlbGluZUxheW91dENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8UGlwZWxpbmVMYXlvdXQsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVQaXBlbGluZUxheW91dFVuaXF1ZSggY29uc3QgUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVRdWVyeVBvb2woIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wqIHBRdWVyeVBvb2wsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2w+Ojp0eXBlIGNyZWF0ZVF1ZXJ5UG9vbCggY29uc3QgUXVlcnlQb29sQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxRdWVyeVBvb2wsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVRdWVyeVBvb2xVbmlxdWUoIGNvbnN0IFF1ZXJ5UG9vbENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUqIHBQaXBlbGluZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxQaXBlbGluZT4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmUsQWxsb2NhdG9yPj46OnR5cGUgY3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY+IGNyZWF0ZUluZm9zLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGlwZWxpbmU+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBpcGVsaW5lLEFsbG9jYXRvcj4+Ojp0eXBlIGNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFBpcGVsaW5lPjo6dHlwZSBjcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgY29uc3QgUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFVuaXF1ZVBpcGVsaW5lPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8UGlwZWxpbmUsRGlzcGF0Y2g+LEFsbG9jYXRvcj4+Ojp0eXBlIGNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVlVuaXF1ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFVuaXF1ZVBpcGVsaW5lPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8UGlwZWxpbmUsRGlzcGF0Y2g+LEFsbG9jYXRvcj4+Ojp0eXBlIGNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVlVuaXF1ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZU5WVW5pcXVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBjb25zdCBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVJlbmRlclBhc3MoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyogcFJlbmRlclBhc3MsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzPjo6dHlwZSBjcmVhdGVSZW5kZXJQYXNzKCBjb25zdCBSZW5kZXJQYXNzQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxSZW5kZXJQYXNzLERpc3BhdGNoPj46OnR5cGUgY3JlYXRlUmVuZGVyUGFzc1VuaXF1ZSggY29uc3QgUmVuZGVyUGFzc0NyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVJlbmRlclBhc3MyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzKiBwUmVuZGVyUGFzcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3M+Ojp0eXBlIGNyZWF0ZVJlbmRlclBhc3MyS0hSKCBjb25zdCBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8UmVuZGVyUGFzcyxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZVJlbmRlclBhc3MyS0hSVW5pcXVlKCBjb25zdCBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVNhbXBsZXIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciogcFNhbXBsZXIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyPjo6dHlwZSBjcmVhdGVTYW1wbGVyKCBjb25zdCBTYW1wbGVyQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTYW1wbGVyLERpc3BhdGNoPj46OnR5cGUgY3JlYXRlU2FtcGxlclVuaXF1ZSggY29uc3QgU2FtcGxlckNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiogcFljYmNyQ29udmVyc2lvbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24+Ojp0eXBlIGNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIGNvbnN0IFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFNhbXBsZXJZY2JjckNvbnZlcnNpb24sRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uVW5pcXVlKCBjb25zdCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiBwWWNiY3JDb252ZXJzaW9uLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbj46OnR5cGUgY3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiggY29uc3QgU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U2FtcGxlclljYmNyQ29udmVyc2lvbixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFJVbmlxdWUoIGNvbnN0IFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVTZW1hcGhvcmUoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBTZW1hcGhvcmUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmU+Ojp0eXBlIGNyZWF0ZVNlbWFwaG9yZSggY29uc3QgU2VtYXBob3JlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTZW1hcGhvcmUsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVTZW1hcGhvcmVVbmlxdWUoIGNvbnN0IFNlbWFwaG9yZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVNoYWRlck1vZHVsZSggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZT46OnR5cGUgY3JlYXRlU2hhZGVyTW9kdWxlKCBjb25zdCBTaGFkZXJNb2R1bGVDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFNoYWRlck1vZHVsZSxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZVNoYWRlck1vZHVsZVVuaXF1ZSggY29uc3QgU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiggdWludDMyX3Qgc3dhcGNoYWluQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSKiBwU3dhcGNoYWlucywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFN3YXBjaGFpbktIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8U3dhcGNoYWluS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbkNyZWF0ZUluZm9LSFI+IGNyZWF0ZUluZm9zLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8U3dhcGNoYWluS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxTd2FwY2hhaW5LSFIsQWxsb2NhdG9yPj46OnR5cGUgY3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ3JlYXRlSW5mb0tIUj4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxTd2FwY2hhaW5LSFI+Ojp0eXBlIGNyZWF0ZVNoYXJlZFN3YXBjaGFpbktIUiggY29uc3QgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxVbmlxdWVTd2FwY2hhaW5LSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsRGlzcGF0Y2g+LEFsbG9jYXRvcj4+Ojp0eXBlIGNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFJVbmlxdWUoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbkNyZWF0ZUluZm9LSFI+IGNyZWF0ZUluZm9zLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8VW5pcXVlU3dhcGNoYWluS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8U3dhcGNoYWluS0hSLERpc3BhdGNoPixBbGxvY2F0b3I+Pjo6dHlwZSBjcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSVW5pcXVlKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVTaGFyZWRTd2FwY2hhaW5LSFJVbmlxdWUoIGNvbnN0IFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVN3YXBjaGFpbktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiogcFN3YXBjaGFpbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUj46OnR5cGUgY3JlYXRlU3dhcGNoYWluS0hSKCBjb25zdCBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN3YXBjaGFpbktIUixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZVN3YXBjaGFpbktIUlVuaXF1ZSggY29uc3QgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUKiBwVmFsaWRhdGlvbkNhY2hlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUPjo6dHlwZSBjcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoIGNvbnN0IFZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8VmFsaWRhdGlvbkNhY2hlRVhULERpc3BhdGNoPj46OnR5cGUgY3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUVW5pcXVlKCBjb25zdCBWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBkZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiBwTmFtZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCggY29uc3QgRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCAmIG5hbWVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiBwVGFnSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgZGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoIGNvbnN0IERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCAmIHRhZ0luZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveUJ1ZmZlclZpZXcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJWaWV3IGJ1ZmZlclZpZXcsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95QnVmZmVyVmlldyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXcgYnVmZmVyVmlldywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlldyBidWZmZXJWaWV3LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXcgYnVmZmVyVmlldywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95Q29tbWFuZFBvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lDb21tYW5kUG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95RGVzY3JpcHRvclBvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lEZXNjcmlwdG9yUG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95RGVzY3JpcHRvclNldExheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY3JpcHRvclNldExheW91dCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCBkZXNjcmlwdG9yU2V0TGF5b3V0LCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0IGRlc2NyaXB0b3JTZXRMYXlvdXQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCBkZXNjcmlwdG9yU2V0TGF5b3V0LCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lFdmVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50IGV2ZW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveUV2ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50IGV2ZW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50IGV2ZW50LCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lGZW5jZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveUZlbmNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2UsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lGcmFtZWJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveUZyYW1lYnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXIgZnJhbWVidWZmZXIsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveUltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lJbWFnZVZpZXcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcgaW1hZ2VWaWV3LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveUltYWdlVmlldyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlldyBpbWFnZVZpZXcsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlldyBpbWFnZVZpZXcsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3IGltYWdlVmlldywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaW5kaXJlY3RDb21tYW5kc0xheW91dCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lPYmplY3RUYWJsZU5WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveU9iamVjdFRhYmxlTlZYKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lQaXBlbGluZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVBpcGVsaW5lKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lQaXBlbGluZUNhY2hlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVBpcGVsaW5lQ2FjaGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVBpcGVsaW5lTGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95UGlwZWxpbmVMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVF1ZXJ5UG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95UXVlcnlQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lSZW5kZXJQYXNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVJlbmRlclBhc3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MgcmVuZGVyUGFzcywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVNhbXBsZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyIHNhbXBsZXIsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95U2FtcGxlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXIgc2FtcGxlciwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciBzYW1wbGVyLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXIgc2FtcGxlciwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyQ29udmVyc2lvbiwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyQ29udmVyc2lvbiwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVNlbWFwaG9yZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmUsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95U2VtYXBob3JlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lTaGFkZXJNb2R1bGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGUgc2hhZGVyTW9kdWxlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVNoYWRlck1vZHVsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZSBzaGFkZXJNb2R1bGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZSBzaGFkZXJNb2R1bGUsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95U3dhcGNoYWluS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lTd2FwY2hhaW5LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW4sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGUsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCB3YWl0SWRsZShEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgd2FpdElkbGUoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBkaXNwbGF5UG93ZXJDb250cm9sRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBvd2VySW5mb0VYVCogcERpc3BsYXlQb3dlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGRpc3BsYXlQb3dlckNvbnRyb2xFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IERpc3BsYXlQb3dlckluZm9FWFQgJiBkaXNwbGF5UG93ZXJJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNYXBwZWRNZW1vcnlSYW5nZT4gbWVtb3J5UmFuZ2VzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBmcmVlQ29tbWFuZEJ1ZmZlcnMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBmcmVlQ29tbWFuZEJ1ZmZlcnMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlcj4gY29tbWFuZEJ1ZmZlcnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZnJlZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGZyZWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlcj4gY29tbWFuZEJ1ZmZlcnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBmcmVlRGVzY3JpcHRvclNldHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBmcmVlRGVzY3JpcHRvclNldHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldD4gZGVzY3JpcHRvclNldHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZnJlZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGZyZWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldD4gZGVzY3JpcHRvclNldHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGZyZWVNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZnJlZU1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZnJlZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBmcmVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBnZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgQXJyYXlQcm94eTxUPiBkYXRhLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiBwTWVtb3J5UmVxdWlyZW1lbnRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czJLSFIgZ2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoIGNvbnN0IEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBnZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViggY29uc3QgQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKCBjb25zdCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRD46OnR5cGUgZ2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIgJiBidWZmZXIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+Pjo6dHlwZSBnZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCggY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciAmIGJ1ZmZlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBEZXZpY2VBZGRyZXNzIGdldEJ1ZmZlckFkZHJlc3NFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBEZXZpY2VBZGRyZXNzIGdldEJ1ZmZlckFkZHJlc3NFWFQoIGNvbnN0IEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgRGV2aWNlQWRkcmVzcyBnZXRCdWZmZXJBZGRyZXNzS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIHBJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgRGV2aWNlQWRkcmVzcyBnZXRCdWZmZXJBZGRyZXNzS0hSKCBjb25zdCBCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMgZ2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyIGdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoIGNvbnN0IEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IGdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoIGNvbnN0IEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyIGdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGNvbnN0IEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IGdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGNvbnN0IEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdWludDY0X3QgZ2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB1aW50NjRfdCBnZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiggY29uc3QgQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoIHVpbnQzMl90IHRpbWVzdGFtcENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqIHBUaW1lc3RhbXBJbmZvcywgdWludDY0X3QqIHBUaW1lc3RhbXBzLCB1aW50NjRfdCogcE1heERldmlhdGlvbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dWludDY0X3Q+Ojp0eXBlIGdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVD4gdGltZXN0YW1wSW5mb3MsIEFycmF5UHJveHk8dWludDY0X3Q+IHRpbWVzdGFtcHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHBTdXBwb3J0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IGdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KCBjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBnZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCggY29uc3QgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHBTdXBwb3J0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IGdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKCBjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBnZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiggY29uc3QgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldEdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVlck1lbW9yeUZlYXR1cmVGbGFncyogcFBlZXJNZW1vcnlGZWF0dXJlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZWVyTWVtb3J5RmVhdHVyZUZsYWdzIGdldEdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldEdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVlck1lbW9yeUZlYXR1cmVGbGFncyogcFBlZXJNZW1vcnlGZWF0dXJlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZWVyTWVtb3J5RmVhdHVyZUZsYWdzIGdldEdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0R3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPjo6dHlwZSBnZXRHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0R3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUj46OnR5cGUgZ2V0R3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCggY29uc3QgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgJiBzdXJmYWNlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldEdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogcE1vZGVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSPjo6dHlwZSBnZXRHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldE1lbW9yeUNvbW1pdG1lbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSogcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBnZXRNZW1vcnlDb21taXRtZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdWludDY0X3QgZ2V0TWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdWludDY0X3QgZ2V0TWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoIGNvbnN0IERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBnZXRQcm9jQWRkciggY29uc3QgY2hhciogcE5hbWUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gZ2V0UHJvY0FkZHIoIGNvbnN0IHN0ZDo6c3RyaW5nICYgbmFtZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRRdWV1ZSggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgdWludDMyX3QgcXVldWVJbmRleCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlKiBwUXVldWUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWUgZ2V0UXVldWUoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90IHF1ZXVlSW5kZXgsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0UXVldWUyKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlUXVldWVJbmZvMiogcFF1ZXVlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlKiBwUXVldWUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWUgZ2V0UXVldWUyKCBjb25zdCBEZXZpY2VRdWV1ZUluZm8yICYgcXVldWVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0RXZlbnRTdGF0dXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRGZW5jZUZkS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxpbnQ+Ojp0eXBlIGdldEZlbmNlRmRLSFIoIGNvbnN0IEZlbmNlR2V0RmRJbmZvS0hSICYgZ2V0RmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldEZlbmNlU3RhdHVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldEZlbmNlV2luMzJIYW5kbGVLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxIQU5ETEU+Ojp0eXBlIGdldEZlbmNlV2luMzJIYW5kbGVLSFIoIGNvbnN0IEZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSICYgZ2V0V2luMzJIYW5kbGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUPjo6dHlwZSBnZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzKiBwTWVtb3J5UmVxdWlyZW1lbnRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50cyBnZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyIGdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBnZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoIGNvbnN0IEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyIGdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggY29uc3QgSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBnZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGNvbnN0IEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cz4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyxBbGxvY2F0b3I+IGdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cz4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyxBbGxvY2F0b3I+IGdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMixBbGxvY2F0b3I+IGdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLEFsbG9jYXRvcj4gZ2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKCBjb25zdCBJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLEFsbG9jYXRvcj4gZ2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBjb25zdCBJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIsQWxsb2NhdG9yPiBnZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGNvbnN0IEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJiBpbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2UqIHBTdWJyZXNvdXJjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnJlc291cmNlTGF5b3V0KiBwTGF5b3V0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnJlc291cmNlTGF5b3V0IGdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZSwgY29uc3QgSW1hZ2VTdWJyZXNvdXJjZSAmIHN1YnJlc291cmNlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB1aW50MzJfdCBnZXRJbWFnZVZpZXdIYW5kbGVOVlgoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBwSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHVpbnQzMl90IGdldEltYWdlVmlld0hhbmRsZU5WWCggY29uc3QgSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHBJbmZvLCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogcEJ1ZmZlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8c3RydWN0IEFIYXJkd2FyZUJ1ZmZlcio+Ojp0eXBlIGdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoIGNvbnN0IE1lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0TWVtb3J5RmRLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxpbnQ+Ojp0eXBlIGdldE1lbW9yeUZkS0hSKCBjb25zdCBNZW1vcnlHZXRGZEluZm9LSFIgJiBnZXRGZEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgaW50IGZkLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5RmRQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5RmRQcm9wZXJ0aWVzS0hSPjo6dHlwZSBnZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBpbnQgZmQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgY29uc3Qgdm9pZCogcEhvc3RQb2ludGVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUPjo6dHlwZSBnZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBjb25zdCB2b2lkKiBwSG9zdFBvaW50ZXIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldE1lbW9yeVdpbjMySGFuZGxlS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiBwR2V0V2luMzJIYW5kbGVJbmZvLCBIQU5ETEUqIHBIYW5kbGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPEhBTkRMRT46OnR5cGUgZ2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoIGNvbnN0IE1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiAmIGdldFdpbjMySGFuZGxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRNZW1vcnlXaW4zMkhhbmRsZU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgaGFuZGxlVHlwZSwgSEFORExFKiBwSGFuZGxlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxIQU5ETEU+Ojp0eXBlIGdldE1lbW9yeVdpbjMySGFuZGxlTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBoYW5kbGVUeXBlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIEhBTkRMRSBoYW5kbGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqIHBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI+Ojp0eXBlIGdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIEhBTkRMRSBoYW5kbGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUqIHBQcmVzZW50YXRpb25UaW1pbmdzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRT4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSxBbGxvY2F0b3I+Pjo6dHlwZSBnZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEU+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUsQWxsb2NhdG9yPj46OnR5cGUgZ2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW4sIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgcGFyYW1ldGVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiBwVmFsdWUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVZhbHVlSU5URUw+Ojp0eXBlIGdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCBwYXJhbWV0ZXIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0UGlwZWxpbmVDYWNoZURhdGEoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHNpemVfdCogcERhdGFTaXplLCB2b2lkKiBwRGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHVpbnQ4X3Q+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPHVpbnQ4X3QsQWxsb2NhdG9yPj46OnR5cGUgZ2V0UGlwZWxpbmVDYWNoZURhdGEoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjx1aW50OF90PiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3Rvcjx1aW50OF90LEFsbG9jYXRvcj4+Ojp0eXBlIGdldFBpcGVsaW5lQ2FjaGVEYXRhKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiBwRXhlY3V0YWJsZUluZm8sIHVpbnQzMl90KiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggY29uc3QgUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmIGV4ZWN1dGFibGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggY29uc3QgUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmIGV4ZWN1dGFibGVJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lSW5mb0tIUiogcFBpcGVsaW5lSW5mbywgdWludDMyX3QqIHBFeGVjdXRhYmxlQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIsQWxsb2NhdG9yPj46OnR5cGUgZ2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiggY29uc3QgUGlwZWxpbmVJbmZvS0hSICYgcGlwZWxpbmVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKCBjb25zdCBQaXBlbGluZUluZm9LSFIgJiBwaXBlbGluZUluZm8sIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogcEV4ZWN1dGFibGVJbmZvLCB1aW50MzJfdCogcFN0YXRpc3RpY0NvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiBwU3RhdGlzdGljcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoIGNvbnN0IFBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgJiBleGVjdXRhYmxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoIGNvbnN0IFBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgJiBleGVjdXRhYmxlSW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFF1ZXJ5UG9vbFJlc3VsdHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzdHJpZGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVJlc3VsdEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRRdWVyeVBvb2xSZXN1bHRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgQXJyYXlQcm94eTxUPiBkYXRhLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzdHJpZGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVJlc3VsdEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCB1aW50MzJfdCBmaXJzdEdyb3VwLCB1aW50MzJfdCBncm91cENvdW50LCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBnZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSBwaXBlbGluZSwgdWludDMyX3QgZmlyc3RHcm91cCwgdWludDMyX3QgZ3JvdXBDb3VudCwgQXJyYXlQcm94eTxUPiBkYXRhLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRT46OnR5cGUgZ2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCogcEdyYW51bGFyaXR5LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIGdldFJlbmRlckFyZWFHcmFudWxhcml0eSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MgcmVuZGVyUGFzcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmUsIHVpbnQ2NF90KiBwVmFsdWUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHVpbnQ2NF90Pjo6dHlwZSBnZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFNlbWFwaG9yZUZkS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlR2V0RmRJbmZvS0hSKiBwR2V0RmRJbmZvLCBpbnQqIHBGZCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8aW50Pjo6dHlwZSBnZXRTZW1hcGhvcmVGZEtIUiggY29uc3QgU2VtYXBob3JlR2V0RmRJbmZvS0hSICYgZ2V0RmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxIQU5ETEU+Ojp0eXBlIGdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKCBjb25zdCBTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgJiBnZXRXaW4zMkhhbmRsZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTaGFkZXJJbmZvQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdCaXRzIHNoYWRlclN0YWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVySW5mb1R5cGVBTUQgaW5mb1R5cGUsIHNpemVfdCogcEluZm9TaXplLCB2b2lkKiBwSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHVpbnQ4X3Q+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPHVpbnQ4X3QsQWxsb2NhdG9yPj46OnR5cGUgZ2V0U2hhZGVySW5mb0FNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFnQml0cyBzaGFkZXJTdGFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlckluZm9UeXBlQU1EIGluZm9UeXBlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8dWludDhfdD4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTaGFkZXJJbmZvQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdCaXRzIHNoYWRlclN0YWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVySW5mb1R5cGVBTUQgaW5mb1R5cGUsIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTd2FwY2hhaW5Db3VudGVyRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgY291bnRlciwgdWludDY0X3QqIHBDb3VudGVyVmFsdWUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHVpbnQ2NF90Pjo6dHlwZSBnZXRTd2FwY2hhaW5Db3VudGVyRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgY291bnRlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTd2FwY2hhaW5JbWFnZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50MzJfdCogcFN3YXBjaGFpbkltYWdlQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSogcFN3YXBjaGFpbkltYWdlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPEltYWdlPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxJbWFnZSxBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTd2FwY2hhaW5JbWFnZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8SW1hZ2U+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPEltYWdlLEFsbG9jYXRvcj4+Ojp0eXBlIGdldFN3YXBjaGFpbkltYWdlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW4sIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTd2FwY2hhaW5TdGF0dXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjx1aW50OF90PiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3Rvcjx1aW50OF90LEFsbG9jYXRvcj4+Ojp0eXBlIGdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8dWludDhfdD4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+Pjo6dHlwZSBnZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGltcG9ydEZlbmNlRmRLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRGZW5jZUZkSW5mb0tIUiogcEltcG9ydEZlbmNlRmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBpbXBvcnRGZW5jZUZkS0hSKCBjb25zdCBJbXBvcnRGZW5jZUZkSW5mb0tIUiAmIGltcG9ydEZlbmNlRmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBpbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgaW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiggY29uc3QgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgJiBpbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGltcG9ydFNlbWFwaG9yZUZkS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlRmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBpbXBvcnRTZW1hcGhvcmVGZEtIUiggY29uc3QgSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSICYgaW1wb3J0U2VtYXBob3JlRmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBpbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgaW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoIGNvbnN0IEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAmIGltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiBwSW5pdGlhbGl6ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKCBjb25zdCBJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgJiBpbml0aWFsaXplSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBpbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIGludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hcHBlZE1lbW9yeVJhbmdlPiBtZW1vcnlSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgbWFwTWVtb3J5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5TWFwRmxhZ3MgZmxhZ3MsIHZvaWQqKiBwcERhdGEsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQqPjo6dHlwZSBtYXBNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlNYXBGbGFncyBmbGFncyA9IE1lbW9yeU1hcEZsYWdzKCksIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgbWVyZ2VQaXBlbGluZUNhY2hlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgZHN0Q2FjaGUsIHVpbnQzMl90IHNyY0NhY2hlQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlKiBwU3JjQ2FjaGVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBtZXJnZVBpcGVsaW5lQ2FjaGVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBkc3RDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZT4gc3JjQ2FjaGVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IG1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCBkc3RDYWNoZSwgdWludDMyX3Qgc3JjQ2FjaGVDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCogcFNyY0NhY2hlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgbWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUIGRzdENhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQ+IHNyY0NhY2hlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCByZWdpc3RlckV2ZW50RVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlRXZlbnRJbmZvRVhUKiBwRGV2aWNlRXZlbnRJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlKiBwRmVuY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZT46OnR5cGUgcmVnaXN0ZXJFdmVudEVYVCggY29uc3QgRGV2aWNlRXZlbnRJbmZvRVhUICYgZGV2aWNlRXZlbnRJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8RmVuY2UsRGlzcGF0Y2g+Pjo6dHlwZSByZWdpc3RlckV2ZW50RVhUVW5pcXVlKCBjb25zdCBEZXZpY2VFdmVudEluZm9FWFQgJiBkZXZpY2VFdmVudEluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgcmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5RXZlbnRJbmZvRVhUKiBwRGlzcGxheUV2ZW50SW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSogcEZlbmNlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2U+Ojp0eXBlIHJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBEaXNwbGF5RXZlbnRJbmZvRVhUICYgZGlzcGxheUV2ZW50SW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEZlbmNlLERpc3BhdGNoPj46OnR5cGUgcmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFRVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IERpc3BsYXlFdmVudEluZm9FWFQgJiBkaXNwbGF5RXZlbnRJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IHJlZ2lzdGVyT2JqZWN0c05WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlRW50cnlOVlgqIGNvbnN0KiBwcE9iamVjdFRhYmxlRW50cmllcywgY29uc3QgdWludDMyX3QqIHBPYmplY3RJbmRpY2VzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSByZWdpc3Rlck9iamVjdHNOVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVFbnRyeU5WWCogY29uc3Q+IHBPYmplY3RUYWJsZUVudHJpZXMsIEFycmF5UHJveHk8Y29uc3QgdWludDMyX3Q+IG9iamVjdEluZGljZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgcmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIHJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW4sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IHJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbmZpZ3VyYXRpb24sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSByZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCByZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCByZXNldENvbW1hbmRQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbFJlc2V0RmxhZ3MgZmxhZ3MsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSByZXNldENvbW1hbmRQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbFJlc2V0RmxhZ3MgZmxhZ3MsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCByZXNldERlc2NyaXB0b3JQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgZmxhZ3MgPSBEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MoKSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIHJlc2V0RGVzY3JpcHRvclBvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sUmVzZXRGbGFncyBmbGFncyA9IERlc2NyaXB0b3JQb29sUmVzZXRGbGFncygpLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgcmVzZXRFdmVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50IGV2ZW50LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgcmVzZXRFdmVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50IGV2ZW50LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IHJlc2V0RmVuY2VzKCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UqIHBGZW5jZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIHJlc2V0RmVuY2VzKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZT4gZmVuY2VzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCByZXNldFF1ZXJ5UG9vbEVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBzZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogcE5hbWVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBzZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCggY29uc3QgRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUICYgbmFtZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgc2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiBwVGFnSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgc2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCggY29uc3QgRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgJiB0YWdJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgc2V0RXZlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIHNldEV2ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldEhkck1ldGFkYXRhRVhUKCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiogcFN3YXBjaGFpbnMsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZHJNZXRhZGF0YUVYVCogcE1ldGFkYXRhLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBzZXRIZHJNZXRhZGF0YUVYVCggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSPiBzd2FwY2hhaW5zLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZHJNZXRhZGF0YUVYVD4gbWV0YWRhdGEsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHNldExvY2FsRGltbWluZ0FNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwQ2hhaW4sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbG9jYWxEaW1taW5nRW5hYmxlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgc2lnbmFsU2VtYXBob3JlS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlU2lnbmFsSW5mb0tIUiogcFNpZ25hbEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIHNpZ25hbFNlbWFwaG9yZUtIUiggY29uc3QgU2VtYXBob3JlU2lnbmFsSW5mb0tIUiAmIHNpZ25hbEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHRyaW1Db21tYW5kUG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MgPSBDb21tYW5kUG9vbFRyaW1GbGFncygpLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHRyaW1Db21tYW5kUG9vbEtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MgPSBDb21tYW5kUG9vbFRyaW1GbGFncygpLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCB1bm1hcE1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCB1bnJlZ2lzdGVyT2JqZWN0c05WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWCogcE9iamVjdEVudHJ5VHlwZXMsIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0SW5kaWNlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgdW5yZWdpc3Rlck9iamVjdHNOVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYPiBvYmplY3RFbnRyeVR5cGVzLCBBcnJheVByb3h5PGNvbnN0IHVpbnQzMl90PiBvYmplY3RJbmRpY2VzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCB1cGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3Qgdm9pZCogcERhdGEsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgdXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IHZvaWQqIHBEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHVwZGF0ZURlc2NyaXB0b3JTZXRzKCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMsIHVpbnQzMl90IGRlc2NyaXB0b3JDb3B5Q291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb3B5RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JDb3BpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHVwZGF0ZURlc2NyaXB0b3JTZXRzKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXcml0ZURlc2NyaXB0b3JTZXQ+IGRlc2NyaXB0b3JXcml0ZXMsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvcHlEZXNjcmlwdG9yU2V0PiBkZXNjcmlwdG9yQ29waWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgd2FpdEZvckZlbmNlcyggdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlKiBwRmVuY2VzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHdhaXRBbGwsIHVpbnQ2NF90IHRpbWVvdXQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IHdhaXRGb3JGZW5jZXMoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlPiBmZW5jZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgd2FpdEFsbCwgdWludDY0X3QgdGltZW91dCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCB3YWl0U2VtYXBob3Jlc0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVdhaXRJbmZvS0hSKiBwV2FpdEluZm8sIHVpbnQ2NF90IHRpbWVvdXQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IHdhaXRTZW1hcGhvcmVzS0hSKCBjb25zdCBTZW1hcGhvcmVXYWl0SW5mb0tIUiAmIHdhaXRJbmZvLCB1aW50NjRfdCB0aW1lb3V0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrRGV2aWNlKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RldmljZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2RldmljZSAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9kZXZpY2UgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtEZXZpY2UgbV9kZXZpY2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGV2aWNlICkgPT0gc2l6ZW9mKCBWa0RldmljZSApLCAiaGFuZGxlIGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBjcHBfdHlwZTxPYmplY3RUeXBlOjplRGV2aWNlPgorICB7CisgICAgdXNpbmcgdHlwZSA9IERldmljZTsKKyAgfTsKKworICBjbGFzcyBEaXNwbGF5TW9kZUtIUgorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrRGlzcGxheU1vZGVLSFI7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZURpc3BsYXlNb2RlS0hSOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEaXNwbGF5TW9kZUtIUigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9kaXNwbGF5TW9kZUtIUihWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGlzcGxheU1vZGVLSFIoIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rpc3BsYXlNb2RlS0hSKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIERpc3BsYXlNb2RlS0hSKCBWa0Rpc3BsYXlNb2RlS0hSIGRpc3BsYXlNb2RlS0hSICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2Rpc3BsYXlNb2RlS0hSKCBkaXNwbGF5TW9kZUtIUiApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIERpc3BsYXlNb2RlS0hSICYgb3BlcmF0b3I9KFZrRGlzcGxheU1vZGVLSFIgZGlzcGxheU1vZGVLSFIpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2Rpc3BsYXlNb2RlS0hSID0gZGlzcGxheU1vZGVLSFI7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBEaXNwbGF5TW9kZUtIUiAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9kaXNwbGF5TW9kZUtIUiA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGlzcGxheU1vZGVLSFIgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGlzcGxheU1vZGVLSFIgPT0gcmhzLm1fZGlzcGxheU1vZGVLSFI7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KERpc3BsYXlNb2RlS0hSIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rpc3BsYXlNb2RlS0hSICE9IHJocy5tX2Rpc3BsYXlNb2RlS0hSOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KERpc3BsYXlNb2RlS0hSIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rpc3BsYXlNb2RlS0hSIDwgcmhzLm1fZGlzcGxheU1vZGVLSFI7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa0Rpc3BsYXlNb2RlS0hSKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2Rpc3BsYXlNb2RlS0hSOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGlzcGxheU1vZGVLSFIgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fZGlzcGxheU1vZGVLSFIgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtEaXNwbGF5TW9kZUtIUiBtX2Rpc3BsYXlNb2RlS0hSOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERpc3BsYXlNb2RlS0hSICkgPT0gc2l6ZW9mKCBWa0Rpc3BsYXlNb2RlS0hSICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVEaXNwbGF5TW9kZUtIUj4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBEaXNwbGF5TW9kZUtIUjsKKyAgfTsKKworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxEZXZpY2UsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8Tm9QYXJlbnQsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlRGV2aWNlID0gVW5pcXVlSGFuZGxlPERldmljZSwgVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT47CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisKKyAgY2xhc3MgUGh5c2ljYWxEZXZpY2UKKyAgeworICBwdWJsaWM6CisgICAgdXNpbmcgQ1R5cGUgPSBWa1BoeXNpY2FsRGV2aWNlOworCisgICAgc3RhdGljIFZVTEtBTl9IUFBfQ09OU1RfT1JfQ09OU1RFWFBSIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IE9iamVjdFR5cGU6OmVQaHlzaWNhbERldmljZTsKKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2UoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1fcGh5c2ljYWxEZXZpY2UoVktfTlVMTF9IQU5ETEUpCisgICAge30KKworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlKCBzdGQ6Om51bGxwdHJfdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9waHlzaWNhbERldmljZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBQaHlzaWNhbERldmljZSggVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9waHlzaWNhbERldmljZSggcGh5c2ljYWxEZXZpY2UgKQorICAgIHt9CisKKyNpZiBkZWZpbmVkKFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTikKKyAgICBQaHlzaWNhbERldmljZSAmIG9wZXJhdG9yPShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9waHlzaWNhbERldmljZSA9IHBoeXNpY2FsRGV2aWNlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgUGh5c2ljYWxEZXZpY2UgJiBvcGVyYXRvcj0oIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1fcGh5c2ljYWxEZXZpY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BoeXNpY2FsRGV2aWNlID09IHJocy5tX3BoeXNpY2FsRGV2aWNlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShQaHlzaWNhbERldmljZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waHlzaWNhbERldmljZSAhPSByaHMubV9waHlzaWNhbERldmljZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChQaHlzaWNhbERldmljZSBjb25zdCAmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9waHlzaWNhbERldmljZSA8IHJocy5tX3BoeXNpY2FsRGV2aWNlOworICAgIH0KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGFjcXVpcmVYbGliRGlzcGxheUVYVCggRGlzcGxheSogZHB5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxEaXNwbGF5Pjo6dHlwZSBhY3F1aXJlWGxpYkRpc3BsYXlFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVEZXZpY2UoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2UqIHBEZXZpY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2U+Ojp0eXBlIGNyZWF0ZURldmljZSggY29uc3QgRGV2aWNlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxEZXZpY2UsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVEZXZpY2VVbmlxdWUoIGNvbnN0IERldmljZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZURpc3BsYXlNb2RlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiogcE1vZGUsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUj46OnR5cGUgY3JlYXRlRGlzcGxheU1vZGVLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IERpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyggY29uc3QgY2hhciogcExheWVyTmFtZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxFeHRlbnNpb25Qcm9wZXJ0aWVzPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxFeHRlbnNpb25Qcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoIE9wdGlvbmFsPGNvbnN0IHN0ZDo6c3RyaW5nPiBsYXllck5hbWUgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8RXh0ZW5zaW9uUHJvcGVydGllcz4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RXh0ZW5zaW9uUHJvcGVydGllcyxBbGxvY2F0b3I+Pjo6dHlwZSBlbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKCBPcHRpb25hbDxjb25zdCBzdGQ6OnN0cmluZz4gbGF5ZXJOYW1lLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpMYXllclByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8TGF5ZXJQcm9wZXJ0aWVzPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxMYXllclByb3BlcnRpZXMsQWxsb2NhdG9yPj46OnR5cGUgZW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxMYXllclByb3BlcnRpZXM+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPExheWVyUHJvcGVydGllcyxBbGxvY2F0b3I+Pjo6dHlwZSBlbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGVudW1lcmF0ZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCogcENvdW50ZXJDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlcktIUiogcENvdW50ZXJzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqIHBDb3VudGVyRGVzY3JpcHRpb25zLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBBcnJheVByb3h5PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvdW50ZXJLSFI+IGNvdW50ZXJzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBBcnJheVByb3h5PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvdW50ZXJLSFI+IGNvdW50ZXJzLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlUHJvcGVydGllc0tIUiogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlNb2RlUHJvcGVydGllc0tIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlNb2RlUHJvcGVydGllc0tIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lSW5mbzJLSFIqIHBEaXNwbGF5UGxhbmVJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiogcENhcGFiaWxpdGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFI+Ojp0eXBlIGdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoIGNvbnN0IERpc3BsYXlQbGFuZUluZm8yS0hSICYgZGlzcGxheVBsYW5lSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiBtb2RlLCB1aW50MzJfdCBwbGFuZUluZGV4LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKiBwQ2FwYWJpbGl0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSPjo6dHlwZSBnZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiBtb2RlLCB1aW50MzJfdCBwbGFuZUluZGV4LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKCB1aW50MzJfdCBwbGFuZUluZGV4LCB1aW50MzJfdCogcERpc3BsYXlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIqIHBEaXNwbGF5cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPERpc3BsYXlLSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlLSFIsQWxsb2NhdG9yPj46OnR5cGUgZ2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoIHVpbnQzMl90IHBsYW5lSW5kZXgsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxEaXNwbGF5S0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEaXNwbGF5S0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKCB1aW50MzJfdCBwbGFuZUluZGV4LCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0Q2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKCB1aW50MzJfdCogcFRpbWVEb21haW5Db3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlRpbWVEb21haW5FWFQqIHBUaW1lRG9tYWlucywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFRpbWVEb21haW5FWFQ+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFRpbWVEb21haW5FWFQsQWxsb2NhdG9yPj46OnR5cGUgZ2V0Q2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxUaW1lRG9tYWluRVhUPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxUaW1lRG9tYWluRVhULEFsbG9jYXRvcj4+Ojp0eXBlIGdldENhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVChBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLEFsbG9jYXRvcj4+Ojp0eXBlIGdldENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXREaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiggdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8RGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldERpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIsQWxsb2NhdG9yPj46OnR5cGUgZ2V0RGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldERpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXREaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldERpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldERpc3BsYXlQcm9wZXJ0aWVzMktIUiggdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPERpc3BsYXlQcm9wZXJ0aWVzMktIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldERpc3BsYXlQcm9wZXJ0aWVzMktIUihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8RGlzcGxheVByb3BlcnRpZXMyS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEaXNwbGF5UHJvcGVydGllczJLSFIsQWxsb2NhdG9yPj46OnR5cGUgZ2V0RGlzcGxheVByb3BlcnRpZXMyS0hSKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXREaXNwbGF5UHJvcGVydGllc0tIUiggdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8RGlzcGxheVByb3BlcnRpZXNLSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlQcm9wZXJ0aWVzS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIGdldERpc3BsYXlQcm9wZXJ0aWVzS0hSKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxEaXNwbGF5UHJvcGVydGllc0tIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVByb3BlcnRpZXNLSFIsQWxsb2NhdG9yPj46OnR5cGUgZ2V0RGlzcGxheVByb3BlcnRpZXNLSFIoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogcEV4dGVybmFsQnVmZmVySW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsQnVmZmVyUHJvcGVydGllcyogcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgZ2V0RXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKCBjb25zdCBQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyAmIGV4dGVybmFsQnVmZmVySW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogcEV4dGVybmFsQnVmZmVySW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsQnVmZmVyUHJvcGVydGllcyogcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgZ2V0RXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKCBjb25zdCBQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyAmIGV4dGVybmFsQnVmZmVySW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRFeHRlcm5hbEZlbmNlUHJvcGVydGllcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qIHBFeHRlcm5hbEZlbmNlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgZ2V0RXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoIGNvbnN0IFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gJiBleHRlcm5hbEZlbmNlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qIHBFeHRlcm5hbEZlbmNlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgZ2V0RXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gJiBleHRlcm5hbEZlbmNlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUeXBlIHR5cGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVRpbGluZyB0aWxpbmcsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNyZWF0ZUZsYWdzIGZsYWdzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBleHRlcm5hbEhhbmRsZVR5cGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKiBwRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WPjo6dHlwZSBnZXRFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VDcmVhdGVGbGFncyBmbGFncywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgZXh0ZXJuYWxIYW5kbGVUeXBlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgZ2V0RXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKCBjb25zdCBQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyAmIGV4dGVybmFsU2VtYXBob3JlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgZ2V0RXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKCBjb25zdCBQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyAmIGV4dGVybmFsU2VtYXBob3JlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRGZWF0dXJlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMqIHBGZWF0dXJlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzIGdldEZlYXR1cmVzKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0RmVhdHVyZXMyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqIHBGZWF0dXJlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzMiBnZXRGZWF0dXJlczIoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IGdldEZlYXR1cmVzMihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldEZlYXR1cmVzMktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiBwRmVhdHVyZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgZ2V0RmVhdHVyZXMyS0hSKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBnZXRGZWF0dXJlczJLSFIoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRGb3JtYXRQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMqIHBGb3JtYXRQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMgZ2V0Rm9ybWF0UHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0Rm9ybWF0UHJvcGVydGllczIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllczIqIHBGb3JtYXRQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMyIGdldEZvcm1hdFByb3BlcnRpZXMyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IGdldEZvcm1hdFByb3BlcnRpZXMyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRGb3JtYXRQcm9wZXJ0aWVzMktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRQcm9wZXJ0aWVzMiogcEZvcm1hdFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllczIgZ2V0Rm9ybWF0UHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gZ2V0Rm9ybWF0UHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldEdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqIHBGZWF0dXJlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiBwTGltaXRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYIGdldEdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCggRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCAmIGZlYXR1cmVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VDcmVhdGVGbGFncyBmbGFncywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllcyogcEltYWdlRm9ybWF0UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllcz46OnR5cGUgZ2V0SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VDcmVhdGVGbGFncyBmbGFncywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiBwSW1hZ2VGb3JtYXRJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllczI+Ojp0eXBlIGdldEltYWdlRm9ybWF0UHJvcGVydGllczIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAmIGltYWdlRm9ybWF0SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8U3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4+Ojp0eXBlIGdldEltYWdlRm9ybWF0UHJvcGVydGllczIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAmIGltYWdlRm9ybWF0SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiBwSW1hZ2VGb3JtYXRJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllczI+Ojp0eXBlIGdldEltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAmIGltYWdlRm9ybWF0SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8U3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4+Ojp0eXBlIGdldEltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAmIGltYWdlRm9ybWF0SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0TWVtb3J5UHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogcE1lbW9yeVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIGdldE1lbW9yeVByb3BlcnRpZXMoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRNZW1vcnlQcm9wZXJ0aWVzMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIHBNZW1vcnlQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgZ2V0TWVtb3J5UHJvcGVydGllczIoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IGdldE1lbW9yeVByb3BlcnRpZXMyKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0TWVtb3J5UHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiBwTWVtb3J5UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIGdldE1lbW9yeVByb3BlcnRpZXMyS0hSKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBnZXRNZW1vcnlQcm9wZXJ0aWVzMktIUihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldE11bHRpc2FtcGxlUHJvcGVydGllc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok11bHRpc2FtcGxlUHJvcGVydGllc0VYVCogcE11bHRpc2FtcGxlUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgZ2V0TXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0UHJlc2VudFJlY3RhbmdsZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwUmVjdENvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKiBwUmVjdHMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxSZWN0MkQ+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFJlY3QyRCxBbGxvY2F0b3I+Pjo6dHlwZSBnZXRQcmVzZW50UmVjdGFuZ2xlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFJlY3QyRD4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UmVjdDJELEFsbG9jYXRvcj4+Ojp0eXBlIGdldFByZXNlbnRSZWN0YW5nbGVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldFByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0UHJvcGVydGllczIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIGdldFByb3BlcnRpZXMyKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBnZXRQcm9wZXJ0aWVzMihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldFByb3BlcnRpZXMyS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiBnZXRQcm9wZXJ0aWVzMktIUihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gZ2V0UHJvcGVydGllczJLSFIoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqIHBQZXJmb3JtYW5jZVF1ZXJ5Q3JlYXRlSW5mbywgdWludDMyX3QqIHBOdW1QYXNzZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB1aW50MzJfdCBnZXRRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIoIGNvbnN0IFF1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiAmIHBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldFF1ZXVlRmFtaWx5UHJvcGVydGllcyggdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFF1ZXVlRmFtaWx5UHJvcGVydGllcz4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMsQWxsb2NhdG9yPiBnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFF1ZXVlRmFtaWx5UHJvcGVydGllcz4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMsQWxsb2NhdG9yPiBnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMyKCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmFtaWx5UHJvcGVydGllczIqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFF1ZXVlRmFtaWx5UHJvcGVydGllczI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8UXVldWVGYW1pbHlQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IGdldFF1ZXVlRmFtaWx5UHJvcGVydGllczIoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFF1ZXVlRmFtaWx5UHJvcGVydGllczI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8UXVldWVGYW1pbHlQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IGdldFF1ZXVlRmFtaWx5UHJvcGVydGllczIoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RydWN0dXJlQ2hhaW4sIHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFN0cnVjdHVyZUNoYWluPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHN0ZDo6dmVjdG9yPFN0cnVjdHVyZUNoYWluLEFsbG9jYXRvcj4gZ2V0UXVldWVGYW1pbHlQcm9wZXJ0aWVzMihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RydWN0dXJlQ2hhaW4sIHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFN0cnVjdHVyZUNoYWluPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHN0ZDo6dmVjdG9yPFN0cnVjdHVyZUNoYWluLEFsbG9jYXRvcj4gZ2V0UXVldWVGYW1pbHlQcm9wZXJ0aWVzMihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldFF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogcFF1ZXVlRmFtaWx5UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UXVldWVGYW1pbHlQcm9wZXJ0aWVzMj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMyLEFsbG9jYXRvcj4gZ2V0UXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUihEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UXVldWVGYW1pbHlQcm9wZXJ0aWVzMj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMyLEFsbG9jYXRvcj4gZ2V0UXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJ1Y3R1cmVDaGFpbiwgdHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8U3RydWN0dXJlQ2hhaW4+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8U3RydWN0dXJlQ2hhaW4sQWxsb2NhdG9yPiBnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJ1Y3R1cmVDaGFpbiwgdHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8U3RydWN0dXJlQ2hhaW4+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8U3RydWN0dXJlQ2hhaW4sQWxsb2NhdG9yPiBnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZ2V0U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLEFsbG9jYXRvcj4gZ2V0U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyxBbGxvY2F0b3I+IGdldFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVR5cGUgdHlwZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyB1c2FnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVGlsaW5nIHRpbGluZywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBnZXRTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IGdldFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiAmIGZvcm1hdEluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIsQWxsb2NhdG9yPiBnZXRTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBjb25zdCBQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgJiBmb3JtYXRJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGdldFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLEFsbG9jYXRvcj4gZ2V0U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggY29uc3QgUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICYgZm9ybWF0SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IGdldFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiAmIGZvcm1hdEluZm8sIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKCB1aW50MzJfdCogcENvbWJpbmF0aW9uQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqIHBDb21iaW5hdGlvbnMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlY+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlY+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBwU3VyZmFjZUNhcGFiaWxpdGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUPjo6dHlwZSBnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiogcFN1cmZhY2VDYXBhYmlsaXRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUj46OnR5cGUgZ2V0U3VyZmFjZUNhcGFiaWxpdGllczJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICYgc3VyZmFjZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+Pjo6dHlwZSBnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiggY29uc3QgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgJiBzdXJmYWNlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNhcGFiaWxpdGllc0tIUiogcFN1cmZhY2VDYXBhYmlsaXRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPjo6dHlwZSBnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFN1cmZhY2VGb3JtYXRzMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIHVpbnQzMl90KiBwU3VyZmFjZUZvcm1hdENvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUZvcm1hdDJLSFIqIHBTdXJmYWNlRm9ybWF0cywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFN1cmZhY2VGb3JtYXQyS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxTdXJmYWNlRm9ybWF0MktIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTdXJmYWNlRm9ybWF0czJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICYgc3VyZmFjZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxTdXJmYWNlRm9ybWF0MktIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8U3VyZmFjZUZvcm1hdDJLSFIsQWxsb2NhdG9yPj46OnR5cGUgZ2V0U3VyZmFjZUZvcm1hdHMyS0hSKCBjb25zdCBQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAmIHN1cmZhY2VJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0U3VyZmFjZUZvcm1hdHNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwU3VyZmFjZUZvcm1hdENvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUZvcm1hdEtIUiogcFN1cmZhY2VGb3JtYXRzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8U3VyZmFjZUZvcm1hdEtIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8U3VyZmFjZUZvcm1hdEtIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTdXJmYWNlRm9ybWF0c0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFN1cmZhY2VGb3JtYXRLSFI+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFN1cmZhY2VGb3JtYXRLSFIsQWxsb2NhdG9yPj46OnR5cGUgZ2V0U3VyZmFjZUZvcm1hdHNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0U3VyZmFjZVByZXNlbnRNb2RlczJFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLCB1aW50MzJfdCogcFByZXNlbnRNb2RlQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50TW9kZUtIUiogcFByZXNlbnRNb2RlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFByZXNlbnRNb2RlS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQcmVzZW50TW9kZUtIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCggY29uc3QgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgJiBzdXJmYWNlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFByZXNlbnRNb2RlS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQcmVzZW50TW9kZUtIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCggY29uc3QgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgJiBzdXJmYWNlSW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0U3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgdWludDMyX3QqIHBQcmVzZW50TW9kZUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJlc2VudE1vZGVLSFIqIHBQcmVzZW50TW9kZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxQcmVzZW50TW9kZUtIUj4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UHJlc2VudE1vZGVLSFIsQWxsb2NhdG9yPj46OnR5cGUgZ2V0U3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFByZXNlbnRNb2RlS0hSPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQcmVzZW50TW9kZUtIUixBbGxvY2F0b3I+Pjo6dHlwZSBnZXRTdXJmYWNlUHJlc2VudE1vZGVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZ2V0U3VyZmFjZVN1cHBvcnRLSFIoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIqIHBTdXBwb3J0ZWQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzI+Ojp0eXBlIGdldFN1cmZhY2VTdXBwb3J0S0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFRvb2xQcm9wZXJ0aWVzRVhUKCB1aW50MzJfdCogcFRvb2xDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQqIHBUb29sUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQsQWxsb2NhdG9yPj46OnR5cGUgZ2V0VG9vbFByb3BlcnRpZXNFWFQoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQsQWxsb2NhdG9yPj46OnR5cGUgZ2V0VG9vbFByb3BlcnRpZXNFWFQoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgQm9vbDMyIGdldFdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBzdHJ1Y3Qgd2xfZGlzcGxheSogZGlzcGxheSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIEJvb2wzMiBnZXRXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgc3RydWN0IHdsX2Rpc3BsYXkgJiBkaXNwbGF5LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIEJvb2wzMiBnZXRXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBCb29sMzIgZ2V0WGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgeGNiX2Nvbm5lY3Rpb25fdCogY29ubmVjdGlvbiwgeGNiX3Zpc3VhbGlkX3QgdmlzdWFsX2lkLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgQm9vbDMyIGdldFhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHhjYl9jb25uZWN0aW9uX3QgJiBjb25uZWN0aW9uLCB4Y2JfdmlzdWFsaWRfdCB2aXN1YWxfaWQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIEJvb2wzMiBnZXRYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGxheSogZHB5LCBWaXN1YWxJRCB2aXN1YWxJRCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIEJvb2wzMiBnZXRYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGxheSAmIGRweSwgVmlzdWFsSUQgdmlzdWFsSUQsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGdldFJhbmRST3V0cHV0RGlzcGxheUVYVCggRGlzcGxheSogZHB5LCBSUk91dHB1dCByck91dHB1dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIqIHBEaXNwbGF5LCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUj46OnR5cGUgZ2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKCBEaXNwbGF5ICYgZHB5LCBSUk91dHB1dCByck91dHB1dCwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVCovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgcmVsZWFzZURpc3BsYXlFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSByZWxlYXNlRGlzcGxheUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgVlVMS0FOX0hQUF9UWVBFU0FGRV9FWFBMSUNJVCBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX3BoeXNpY2FsRGV2aWNlOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGh5c2ljYWxEZXZpY2UgIT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1fcGh5c2ljYWxEZXZpY2UgPT0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtQaHlzaWNhbERldmljZSBtX3BoeXNpY2FsRGV2aWNlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlICksICJoYW5kbGUgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGNwcF90eXBlPE9iamVjdFR5cGU6OmVQaHlzaWNhbERldmljZT4KKyAgeworICAgIHVzaW5nIHR5cGUgPSBQaHlzaWNhbERldmljZTsKKyAgfTsKKworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICBjbGFzcyBJbnN0YW5jZTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERpc3BhdGNoPiBjbGFzcyBVbmlxdWVIYW5kbGVUcmFpdHM8RGVidWdSZXBvcnRDYWxsYmFja0VYVCwgRGlzcGF0Y2g+IHsgcHVibGljOiB1c2luZyBkZWxldGVyID0gT2JqZWN0RGVzdHJveTxJbnN0YW5jZSwgRGlzcGF0Y2g+OyB9OworICB1c2luZyBVbmlxdWVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUID0gVW5pcXVlSGFuZGxlPERlYnVnUmVwb3J0Q2FsbGJhY2tFWFQsIFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzcGF0Y2g+IGNsYXNzIFVuaXF1ZUhhbmRsZVRyYWl0czxEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PEluc3RhbmNlLCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgPSBVbmlxdWVIYW5kbGU8RGVidWdVdGlsc01lc3NlbmdlckVYVCwgVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT47CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaD4gY2xhc3MgVW5pcXVlSGFuZGxlVHJhaXRzPFN1cmZhY2VLSFIsIERpc3BhdGNoPiB7IHB1YmxpYzogdXNpbmcgZGVsZXRlciA9IE9iamVjdERlc3Ryb3k8SW5zdGFuY2UsIERpc3BhdGNoPjsgfTsKKyAgdXNpbmcgVW5pcXVlU3VyZmFjZUtIUiA9IFVuaXF1ZUhhbmRsZTxTdXJmYWNlS0hSLCBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPjsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKworICBjbGFzcyBJbnN0YW5jZQorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBDVHlwZSA9IFZrSW5zdGFuY2U7CisKKyAgICBzdGF0aWMgVlVMS0FOX0hQUF9DT05TVF9PUl9DT05TVEVYUFIgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gT2JqZWN0VHlwZTo6ZUluc3RhbmNlOworCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbnN0YW5jZSgpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbV9pbnN0YW5jZShWS19OVUxMX0hBTkRMRSkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW5zdGFuY2UoIHN0ZDo6bnVsbHB0cl90ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2luc3RhbmNlKFZLX05VTExfSEFORExFKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIEluc3RhbmNlKCBWa0luc3RhbmNlIGluc3RhbmNlICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtX2luc3RhbmNlKCBpbnN0YW5jZSApCisgICAge30KKworI2lmIGRlZmluZWQoVlVMS0FOX0hQUF9UWVBFU0FGRV9DT05WRVJTSU9OKQorICAgIEluc3RhbmNlICYgb3BlcmF0b3I9KFZrSW5zdGFuY2UgaW5zdGFuY2UpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtX2luc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICBJbnN0YW5jZSAmIG9wZXJhdG9yPSggc3RkOjpudWxscHRyX3QgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbV9pbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW5zdGFuY2UgY29uc3QgJiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1faW5zdGFuY2UgPT0gcmhzLm1faW5zdGFuY2U7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KEluc3RhbmNlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2luc3RhbmNlICE9IHJocy5tX2luc3RhbmNlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KEluc3RhbmNlIGNvbnN0ICYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiBtX2luc3RhbmNlIDwgcmhzLm1faW5zdGFuY2U7CisgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiogcFN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBjcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiggY29uc3QgQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVBbmRyb2lkU3VyZmFjZUtIUlVuaXF1ZSggY29uc3QgQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiBwQ2FsbGJhY2ssIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPjo6dHlwZSBjcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCBjb25zdCBEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULERpc3BhdGNoPj46OnR5cGUgY3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVFVuaXF1ZSggY29uc3QgRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckVYVCogcE1lc3NlbmdlciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJFWFQ+Ojp0eXBlIGNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIGNvbnN0IERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPERlYnVnVXRpbHNNZXNzZW5nZXJFWFQsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUVW5pcXVlKCBjb25zdCBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiogcFN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBjcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKCBjb25zdCBEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFJVbmlxdWUoIGNvbnN0IERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgY3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiogcFN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBjcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoIGNvbnN0IEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVFVuaXF1ZSggY29uc3QgSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVJT1NTdXJmYWNlTVZLKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIqIHBTdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUj46OnR5cGUgY3JlYXRlSU9TU3VyZmFjZU1WSyggY29uc3QgSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUlPU1N1cmZhY2VNVktVbmlxdWUoIGNvbnN0IElPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0lPU19NVksqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFI+Ojp0eXBlIGNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKCBjb25zdCBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBVW5pcXVlKCBjb25zdCBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fRlVDSFNJQSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVNYWNPU1N1cmZhY2VNVksoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFI+Ojp0eXBlIGNyZWF0ZU1hY09TU3VyZmFjZU1WSyggY29uc3QgTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTdXJmYWNlS0hSLERpc3BhdGNoPj46OnR5cGUgY3JlYXRlTWFjT1NTdXJmYWNlTVZLVW5pcXVlKCBjb25zdCBNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSyovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVNZXRhbFN1cmZhY2VFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFI+Ojp0eXBlIGNyZWF0ZU1ldGFsU3VyZmFjZUVYVCggY29uc3QgTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTdXJmYWNlS0hSLERpc3BhdGNoPj46OnR5cGUgY3JlYXRlTWV0YWxTdXJmYWNlRVhUVW5pcXVlKCBjb25zdCBNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiogcFN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBjcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCggY29uc3QgU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUFVuaXF1ZSggY29uc3QgU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0dHUCovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVZpU3VyZmFjZU5OKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmlTdXJmYWNlQ3JlYXRlSW5mb05OKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFI+Ojp0eXBlIGNyZWF0ZVZpU3VyZmFjZU5OKCBjb25zdCBWaVN1cmZhY2VDcmVhdGVJbmZvTk4gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZVZpU3VyZmFjZU5OVW5pcXVlKCBjb25zdCBWaVN1cmZhY2VDcmVhdGVJbmZvTk4gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fVklfTk4qLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiogcFN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBjcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiggY29uc3QgV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVXYXlsYW5kU3VyZmFjZUtIUlVuaXF1ZSggY29uc3QgV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGNyZWF0ZVdpbjMyU3VyZmFjZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIqIHBTdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUj46OnR5cGUgY3JlYXRlV2luMzJTdXJmYWNlS0hSKCBjb25zdCBXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVXaW4zMlN1cmZhY2VLSFJVbmlxdWUoIGNvbnN0IFdpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVYY2JTdXJmYWNlS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIqIHBTdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUj46OnR5cGUgY3JlYXRlWGNiU3VyZmFjZUtIUiggY29uc3QgWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZVhjYlN1cmZhY2VLSFJVbmlxdWUoIGNvbnN0IFhjYlN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBjcmVhdGVYbGliU3VyZmFjZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiogcFN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBjcmVhdGVYbGliU3VyZmFjZUtIUiggY29uc3QgWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBjcmVhdGVYbGliU3VyZmFjZUtIUlVuaXF1ZSggY29uc3QgWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yID0gbnVsbHB0ciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlYnVnUmVwb3J0TWVzc2FnZUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZSwgdWludDY0X3Qgb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbWVzc2FnZUNvZGUsIGNvbnN0IGNoYXIqIHBMYXllclByZWZpeCwgY29uc3QgY2hhciogcE1lc3NhZ2UsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlYnVnUmVwb3J0TWVzc2FnZUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZSwgdWludDY0X3Qgb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbWVzc2FnZUNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGF5ZXJQcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbWVzc2FnZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlciwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJFWFQgbWVzc2VuZ2VyLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJFWFQgbWVzc2VuZ2VyLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdm9pZCBkZXN0cm95KCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3lTdXJmYWNlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveVN1cmZhY2VLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHZvaWQgZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIGRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciA9IG51bGxwdHIsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFJlc3VsdCBlbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyggdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3Q7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8UGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcz4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsQWxsb2NhdG9yPj46OnR5cGUgZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUmVzdWx0IGVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKCB1aW50MzJfdCogcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdDsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcz4sIHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsQWxsb2NhdG9yPj46OnR5cGUgZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyxBbGxvY2F0b3I+Pjo6dHlwZSBlbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICBSZXN1bHQgZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCB1aW50MzJfdCogcFBoeXNpY2FsRGV2aWNlQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZSogcFBoeXNpY2FsRGV2aWNlcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBoeXNpY2FsRGV2aWNlPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZSxBbGxvY2F0b3I+Pjo6dHlwZSBlbnVtZXJhdGVQaHlzaWNhbERldmljZXMoRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFBoeXNpY2FsRGV2aWNlPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZSxBbGxvY2F0b3I+Pjo6dHlwZSBlbnVtZXJhdGVQaHlzaWNhbERldmljZXMoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3Q7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIGdldFByb2NBZGRyKCBjb25zdCBjaGFyKiBwTmFtZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBnZXRQcm9jQWRkciggY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVDsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHN1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIG1lc3NhZ2VTZXZlcml0eSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlcywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgICB2b2lkIHN1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIG1lc3NhZ2VTZXZlcml0eSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlcywgY29uc3QgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAmIGNhbGxiYWNrRGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQ7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgICBWVUxLQU5fSFBQX1RZUEVTQUZFX0VYUExJQ0lUIG9wZXJhdG9yIFZrSW5zdGFuY2UoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuIG1faW5zdGFuY2U7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbnN0YW5jZSAhPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gbV9pbnN0YW5jZSA9PSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWa0luc3RhbmNlIG1faW5zdGFuY2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW5zdGFuY2UgKSA9PSBzaXplb2YoIFZrSW5zdGFuY2UgKSwgImhhbmRsZSBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgY3BwX3R5cGU8T2JqZWN0VHlwZTo6ZUluc3RhbmNlPgorICB7CisgICAgdXNpbmcgdHlwZSA9IEluc3RhbmNlOworICB9OworCisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaD4gY2xhc3MgVW5pcXVlSGFuZGxlVHJhaXRzPEluc3RhbmNlLCBEaXNwYXRjaD4geyBwdWJsaWM6IHVzaW5nIGRlbGV0ZXIgPSBPYmplY3REZXN0cm95PE5vUGFyZW50LCBEaXNwYXRjaD47IH07CisgIHVzaW5nIFVuaXF1ZUluc3RhbmNlID0gVW5pcXVlSGFuZGxlPEluc3RhbmNlLCBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPjsKKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgIFJlc3VsdCBjcmVhdGVJbnN0YW5jZSggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5zdGFuY2UqIHBJbnN0YW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5zdGFuY2U+Ojp0eXBlIGNyZWF0ZUluc3RhbmNlKCBjb25zdCBJbnN0YW5jZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICk7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxJbnN0YW5jZSxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUluc3RhbmNlVW5pcXVlKCBjb25zdCBJbnN0YW5jZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICk7CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICBSZXN1bHQgZW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKCBjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnNpb25Qcm9wZXJ0aWVzKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApOworI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxFeHRlbnNpb25Qcm9wZXJ0aWVzPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RXh0ZW5zaW9uUHJvcGVydGllcyxBbGxvY2F0b3I+Pjo6dHlwZSBlbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoIE9wdGlvbmFsPGNvbnN0IHN0ZDo6c3RyaW5nPiBsYXllck5hbWUgPSBudWxscHRyLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPEV4dGVuc2lvblByb3BlcnRpZXM+LCB0eXBlbmFtZSBEaXNwYXRjaCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSX1RZUEU+CisgIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxFeHRlbnNpb25Qcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyggT3B0aW9uYWw8Y29uc3Qgc3RkOjpzdHJpbmc+IGxheWVyTmFtZSwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICk7CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICBSZXN1bHQgZW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkxheWVyUHJvcGVydGllcyogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKTsKKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8TGF5ZXJQcm9wZXJ0aWVzPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8TGF5ZXJQcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKERpc3BhdGNoIGNvbnN0ICZkID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVIgKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8TGF5ZXJQcm9wZXJ0aWVzPiwgdHlwZW5hbWUgRGlzcGF0Y2ggPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUl9UWVBFPgorICB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8TGF5ZXJQcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgUmVzdWx0IGVudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiggdWludDMyX3QqIHBBcGlWZXJzaW9uLCBEaXNwYXRjaCBjb25zdCAmZCA9IFZVTEtBTl9IUFBfREVGQVVMVF9ESVNQQVRDSEVSICk7CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoID0gVlVMS0FOX0hQUF9ERUZBVUxUX0RJU1BBVENIRVJfVFlQRT4KKyAgUmVzdWx0VmFsdWVUeXBlPHVpbnQzMl90Pjo6dHlwZSBlbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24oRGlzcGF0Y2ggY29uc3QgJmQgPSBWVUxLQU5fSFBQX0RFRkFVTFRfRElTUEFUQ0hFUiApOworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHN0cnVjdCBHZW9tZXRyeVRyaWFuZ2xlc05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBHZW9tZXRyeVRyaWFuZ2xlc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHZlcnRleERhdGFfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHZlcnRleE9mZnNldF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZlcnRleENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgdmVydGV4U3RyaWRlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCB2ZXJ0ZXhGb3JtYXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdDo6ZVVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGluZGV4RGF0YV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgaW5kZXhPZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZSBpbmRleFR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZTo6ZVVpbnQxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHRyYW5zZm9ybURhdGFfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHRyYW5zZm9ybU9mZnNldF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB2ZXJ0ZXhEYXRhKCB2ZXJ0ZXhEYXRhXyApCisgICAgICAsIHZlcnRleE9mZnNldCggdmVydGV4T2Zmc2V0XyApCisgICAgICAsIHZlcnRleENvdW50KCB2ZXJ0ZXhDb3VudF8gKQorICAgICAgLCB2ZXJ0ZXhTdHJpZGUoIHZlcnRleFN0cmlkZV8gKQorICAgICAgLCB2ZXJ0ZXhGb3JtYXQoIHZlcnRleEZvcm1hdF8gKQorICAgICAgLCBpbmRleERhdGEoIGluZGV4RGF0YV8gKQorICAgICAgLCBpbmRleE9mZnNldCggaW5kZXhPZmZzZXRfICkKKyAgICAgICwgaW5kZXhDb3VudCggaW5kZXhDb3VudF8gKQorICAgICAgLCBpbmRleFR5cGUoIGluZGV4VHlwZV8gKQorICAgICAgLCB0cmFuc2Zvcm1EYXRhKCB0cmFuc2Zvcm1EYXRhXyApCisgICAgICAsIHRyYW5zZm9ybU9mZnNldCggdHJhbnNmb3JtT2Zmc2V0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeVRyaWFuZ2xlc05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlUcmlhbmdsZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlUcmlhbmdsZXNOViApIC0gb2Zmc2V0b2YoIEdlb21ldHJ5VHJpYW5nbGVzTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeVRyaWFuZ2xlc05WKCBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgR2VvbWV0cnlUcmlhbmdsZXNOViYgb3BlcmF0b3I9KCBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlUcmlhbmdsZXNOViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeVRyaWFuZ2xlc05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeVRyaWFuZ2xlc05WICYgc2V0VmVydGV4RGF0YSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciB2ZXJ0ZXhEYXRhXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2ZXJ0ZXhEYXRhID0gdmVydGV4RGF0YV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR2VvbWV0cnlUcmlhbmdsZXNOViAmIHNldFZlcnRleE9mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgdmVydGV4T2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2ZXJ0ZXhPZmZzZXQgPSB2ZXJ0ZXhPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEdlb21ldHJ5VHJpYW5nbGVzTlYgJiBzZXRWZXJ0ZXhDb3VudCggdWludDMyX3QgdmVydGV4Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZlcnRleENvdW50ID0gdmVydGV4Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEdlb21ldHJ5VHJpYW5nbGVzTlYgJiBzZXRWZXJ0ZXhTdHJpZGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHZlcnRleFN0cmlkZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmVydGV4U3RyaWRlID0gdmVydGV4U3RyaWRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeVRyaWFuZ2xlc05WICYgc2V0VmVydGV4Rm9ybWF0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IHZlcnRleEZvcm1hdF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmVydGV4Rm9ybWF0ID0gdmVydGV4Rm9ybWF0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeVRyaWFuZ2xlc05WICYgc2V0SW5kZXhEYXRhKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGluZGV4RGF0YV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5kZXhEYXRhID0gaW5kZXhEYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeVRyaWFuZ2xlc05WICYgc2V0SW5kZXhPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGluZGV4T2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbmRleE9mZnNldCA9IGluZGV4T2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeVRyaWFuZ2xlc05WICYgc2V0SW5kZXhDb3VudCggdWludDMyX3QgaW5kZXhDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5kZXhDb3VudCA9IGluZGV4Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEdlb21ldHJ5VHJpYW5nbGVzTlYgJiBzZXRJbmRleFR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRleFR5cGUgaW5kZXhUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbmRleFR5cGUgPSBpbmRleFR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEdlb21ldHJ5VHJpYW5nbGVzTlYgJiBzZXRUcmFuc2Zvcm1EYXRhKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHRyYW5zZm9ybURhdGFfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRyYW5zZm9ybURhdGEgPSB0cmFuc2Zvcm1EYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeVRyaWFuZ2xlc05WICYgc2V0VHJhbnNmb3JtT2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSB0cmFuc2Zvcm1PZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRyYW5zZm9ybU9mZnNldCA9IHRyYW5zZm9ybU9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtHZW9tZXRyeVRyaWFuZ2xlc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtHZW9tZXRyeVRyaWFuZ2xlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtHZW9tZXRyeVRyaWFuZ2xlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEdlb21ldHJ5VHJpYW5nbGVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHZlcnRleERhdGEgPT0gcmhzLnZlcnRleERhdGEgKQorICAgICAgICAgICYmICggdmVydGV4T2Zmc2V0ID09IHJocy52ZXJ0ZXhPZmZzZXQgKQorICAgICAgICAgICYmICggdmVydGV4Q291bnQgPT0gcmhzLnZlcnRleENvdW50ICkKKyAgICAgICAgICAmJiAoIHZlcnRleFN0cmlkZSA9PSByaHMudmVydGV4U3RyaWRlICkKKyAgICAgICAgICAmJiAoIHZlcnRleEZvcm1hdCA9PSByaHMudmVydGV4Rm9ybWF0ICkKKyAgICAgICAgICAmJiAoIGluZGV4RGF0YSA9PSByaHMuaW5kZXhEYXRhICkKKyAgICAgICAgICAmJiAoIGluZGV4T2Zmc2V0ID09IHJocy5pbmRleE9mZnNldCApCisgICAgICAgICAgJiYgKCBpbmRleENvdW50ID09IHJocy5pbmRleENvdW50ICkKKyAgICAgICAgICAmJiAoIGluZGV4VHlwZSA9PSByaHMuaW5kZXhUeXBlICkKKyAgICAgICAgICAmJiAoIHRyYW5zZm9ybURhdGEgPT0gcmhzLnRyYW5zZm9ybURhdGEgKQorICAgICAgICAgICYmICggdHJhbnNmb3JtT2Zmc2V0ID09IHJocy50cmFuc2Zvcm1PZmZzZXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEdlb21ldHJ5VHJpYW5nbGVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplR2VvbWV0cnlUcmlhbmdsZXNOVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciB2ZXJ0ZXhEYXRhOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHZlcnRleE9mZnNldDsKKyAgICB1aW50MzJfdCB2ZXJ0ZXhDb3VudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSB2ZXJ0ZXhTdHJpZGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCB2ZXJ0ZXhGb3JtYXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBpbmRleERhdGE7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgaW5kZXhPZmZzZXQ7CisgICAgdWludDMyX3QgaW5kZXhDb3VudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kZXhUeXBlIGluZGV4VHlwZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHRyYW5zZm9ybURhdGE7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgdHJhbnNmb3JtT2Zmc2V0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEdlb21ldHJ5VHJpYW5nbGVzTlYgKSA9PSBzaXplb2YoIFZrR2VvbWV0cnlUcmlhbmdsZXNOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxHZW9tZXRyeVRyaWFuZ2xlc05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBHZW9tZXRyeUFBQkJOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgR2VvbWV0cnlBQUJCTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYWFiYkRhdGFfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1BQUJCc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGFhYmJEYXRhKCBhYWJiRGF0YV8gKQorICAgICAgLCBudW1BQUJCcyggbnVtQUFCQnNfICkKKyAgICAgICwgc3RyaWRlKCBzdHJpZGVfICkKKyAgICAgICwgb2Zmc2V0KCBvZmZzZXRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5QUFCQk5WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlBQUJCTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5QUFCQk5WICkgLSBvZmZzZXRvZiggR2VvbWV0cnlBQUJCTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeUFBQkJOViggVmtHZW9tZXRyeUFBQkJOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBHZW9tZXRyeUFBQkJOViYgb3BlcmF0b3I9KCBWa0dlb21ldHJ5QUFCQk5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5QUFCQk5WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEdlb21ldHJ5QUFCQk5WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeUFBQkJOViAmIHNldEFhYmJEYXRhKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGFhYmJEYXRhXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhYWJiRGF0YSA9IGFhYmJEYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeUFBQkJOViAmIHNldE51bUFBQkJzKCB1aW50MzJfdCBudW1BQUJCc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbnVtQUFCQnMgPSBudW1BQUJCc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR2VvbWV0cnlBQUJCTlYgJiBzZXRTdHJpZGUoIHVpbnQzMl90IHN0cmlkZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RyaWRlID0gc3RyaWRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeUFBQkJOViAmIHNldE9mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBvZmZzZXQgPSBvZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrR2VvbWV0cnlBQUJCTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0dlb21ldHJ5QUFCQk5WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0dlb21ldHJ5QUFCQk5WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrR2VvbWV0cnlBQUJCTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggR2VvbWV0cnlBQUJCTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGFhYmJEYXRhID09IHJocy5hYWJiRGF0YSApCisgICAgICAgICAgJiYgKCBudW1BQUJCcyA9PSByaHMubnVtQUFCQnMgKQorICAgICAgICAgICYmICggc3RyaWRlID09IHJocy5zdHJpZGUgKQorICAgICAgICAgICYmICggb2Zmc2V0ID09IHJocy5vZmZzZXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEdlb21ldHJ5QUFCQk5WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUdlb21ldHJ5QWFiYk5WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGFhYmJEYXRhOworICAgIHVpbnQzMl90IG51bUFBQkJzOworICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggR2VvbWV0cnlBQUJCTlYgKSA9PSBzaXplb2YoIFZrR2VvbWV0cnlBQUJCTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8R2VvbWV0cnlBQUJCTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEdlb21ldHJ5RGF0YU5WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBHZW9tZXRyeURhdGFOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5VHJpYW5nbGVzTlYgdHJpYW5nbGVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeVRyaWFuZ2xlc05WKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeUFBQkJOViBhYWJic18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlBQUJCTlYoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdHJpYW5nbGVzKCB0cmlhbmdsZXNfICkKKyAgICAgICwgYWFiYnMoIGFhYmJzXyApCisgICAge30KKworICAgIEdlb21ldHJ5RGF0YU5WKCBWa0dlb21ldHJ5RGF0YU5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEdlb21ldHJ5RGF0YU5WJiBvcGVyYXRvcj0oIFZrR2VvbWV0cnlEYXRhTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlEYXRhTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR2VvbWV0cnlEYXRhTlYgJiBzZXRUcmlhbmdsZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeVRyaWFuZ2xlc05WIHRyaWFuZ2xlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHJpYW5nbGVzID0gdHJpYW5nbGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeURhdGFOViAmIHNldEFhYmJzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlBQUJCTlYgYWFiYnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFhYmJzID0gYWFiYnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrR2VvbWV0cnlEYXRhTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0dlb21ldHJ5RGF0YU5WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0dlb21ldHJ5RGF0YU5WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrR2VvbWV0cnlEYXRhTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggR2VvbWV0cnlEYXRhTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCB0cmlhbmdsZXMgPT0gcmhzLnRyaWFuZ2xlcyApCisgICAgICAgICAgJiYgKCBhYWJicyA9PSByaHMuYWFiYnMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEdlb21ldHJ5RGF0YU5WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeVRyaWFuZ2xlc05WIHRyaWFuZ2xlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlBQUJCTlYgYWFiYnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggR2VvbWV0cnlEYXRhTlYgKSA9PSBzaXplb2YoIFZrR2VvbWV0cnlEYXRhTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8R2VvbWV0cnlEYXRhTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEdlb21ldHJ5TlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEdlb21ldHJ5TlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeVR5cGVOViBnZW9tZXRyeVR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5VHlwZU5WOjplVHJpYW5nbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeURhdGFOViBnZW9tZXRyeV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlEYXRhTlYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlGbGFnc05WIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeUZsYWdzTlYoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZ2VvbWV0cnlUeXBlKCBnZW9tZXRyeVR5cGVfICkKKyAgICAgICwgZ2VvbWV0cnkoIGdlb21ldHJ5XyApCisgICAgICAsIGZsYWdzKCBmbGFnc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5TlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5TlYgKSAtIG9mZnNldG9mKCBHZW9tZXRyeU5WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR2VvbWV0cnlOViggVmtHZW9tZXRyeU5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEdlb21ldHJ5TlYmIG9wZXJhdG9yPSggVmtHZW9tZXRyeU5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5TlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR2VvbWV0cnlOViAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR2VvbWV0cnlOViAmIHNldEdlb21ldHJ5VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5VHlwZU5WIGdlb21ldHJ5VHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZ2VvbWV0cnlUeXBlID0gZ2VvbWV0cnlUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHZW9tZXRyeU5WICYgc2V0R2VvbWV0cnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeURhdGFOViBnZW9tZXRyeV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR2VvbWV0cnlOViAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlGbGFnc05WIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0dlb21ldHJ5TlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0dlb21ldHJ5TlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrR2VvbWV0cnlOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0dlb21ldHJ5TlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggR2VvbWV0cnlOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZ2VvbWV0cnlUeXBlID09IHJocy5nZW9tZXRyeVR5cGUgKQorICAgICAgICAgICYmICggZ2VvbWV0cnkgPT0gcmhzLmdlb21ldHJ5ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggR2VvbWV0cnlOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVHZW9tZXRyeU5WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlUeXBlTlYgZ2VvbWV0cnlUeXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeURhdGFOViBnZW9tZXRyeTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R2VvbWV0cnlGbGFnc05WIGZsYWdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEdlb21ldHJ5TlYgKSA9PSBzaXplb2YoIFZrR2VvbWV0cnlOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxHZW9tZXRyeU5WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOViB0eXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlY6OmVUb3BMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlYgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOVigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5zdGFuY2VDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VvbWV0cnlDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5TlYqIHBHZW9tZXRyaWVzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHR5cGUoIHR5cGVfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGluc3RhbmNlQ291bnQoIGluc3RhbmNlQ291bnRfICkKKyAgICAgICwgZ2VvbWV0cnlDb3VudCggZ2VvbWV0cnlDb3VudF8gKQorICAgICAgLCBwR2VvbWV0cmllcyggcEdlb21ldHJpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICkgLSBvZmZzZXRvZiggQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYmIG9wZXJhdG9yPSggVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICYgc2V0VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOViB0eXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0eXBlID0gdHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlYgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViAmIHNldEluc3RhbmNlQ291bnQoIHVpbnQzMl90IGluc3RhbmNlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGluc3RhbmNlQ291bnQgPSBpbnN0YW5jZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgJiBzZXRHZW9tZXRyeUNvdW50KCB1aW50MzJfdCBnZW9tZXRyeUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBnZW9tZXRyeUNvdW50ID0gZ2VvbWV0cnlDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICYgc2V0UEdlb21ldHJpZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHZW9tZXRyeU5WKiBwR2VvbWV0cmllc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEdlb21ldHJpZXMgPSBwR2VvbWV0cmllc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCB0eXBlID09IHJocy50eXBlICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBpbnN0YW5jZUNvdW50ID09IHJocy5pbnN0YW5jZUNvdW50ICkKKyAgICAgICAgICAmJiAoIGdlb21ldHJ5Q291bnQgPT0gcmhzLmdlb21ldHJ5Q291bnQgKQorICAgICAgICAgICYmICggcEdlb21ldHJpZXMgPT0gcmhzLnBHZW9tZXRyaWVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WIHR5cGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOViBmbGFnczsKKyAgICB1aW50MzJfdCBpbnN0YW5jZUNvdW50OworICAgIHVpbnQzMl90IGdlb21ldHJ5Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okdlb21ldHJ5TlYqIHBHZW9tZXRyaWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViApID09IHNpemVvZiggVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY29tcGFjdGVkU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViBpbmZvXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogY29tcGFjdGVkU2l6ZSggY29tcGFjdGVkU2l6ZV8gKQorICAgICAgLCBpbmZvKCBpbmZvXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViApIC0gb2Zmc2V0b2YoIEFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViggVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAmIHNldENvbXBhY3RlZFNpemUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNvbXBhY3RlZFNpemVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbXBhY3RlZFNpemUgPSBjb21wYWN0ZWRTaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgJiBzZXRJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIGluZm9fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGluZm8gPSBpbmZvXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGNvbXBhY3RlZFNpemUgPT0gcmhzLmNvbXBhY3RlZFNpemUgKQorICAgICAgICAgICYmICggaW5mbyA9PSByaHMuaW5mbyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY29tcGFjdGVkU2l6ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIGluZm87CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WICkgPT0gc2l6ZW9mKCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzVHlwZU5WIHR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOVjo6ZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHR5cGUoIHR5cGVfICkKKyAgICAgICwgYWNjZWxlcmF0aW9uU3RydWN0dXJlKCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICkgLSBvZmZzZXRvZiggQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYmIG9wZXJhdG9yPSggVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICYgc2V0VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOViB0eXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0eXBlID0gdHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICYgc2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdHlwZSA9PSByaHMudHlwZSApCisgICAgICAgICAgJiYgKCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPT0gcmhzLmFjY2VsZXJhdGlvblN0cnVjdHVyZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOViB0eXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICkgPT0gc2l6ZW9mKCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW5fID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lb3V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VNYXNrXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN3YXBjaGFpbiggc3dhcGNoYWluXyApCisgICAgICAsIHRpbWVvdXQoIHRpbWVvdXRfICkKKyAgICAgICwgc2VtYXBob3JlKCBzZW1hcGhvcmVfICkKKyAgICAgICwgZmVuY2UoIGZlbmNlXyApCisgICAgICAsIGRldmljZU1hc2soIGRldmljZU1hc2tfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNxdWlyZU5leHRJbWFnZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSICkgLSBvZmZzZXRvZiggQWNxdWlyZU5leHRJbWFnZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiggVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiAmIHNldFN3YXBjaGFpbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW5fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN3YXBjaGFpbiA9IHN3YXBjaGFpbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgJiBzZXRUaW1lb3V0KCB1aW50NjRfdCB0aW1lb3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0aW1lb3V0ID0gdGltZW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgJiBzZXRTZW1hcGhvcmUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzZW1hcGhvcmUgPSBzZW1hcGhvcmVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSICYgc2V0RmVuY2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmVuY2UgPSBmZW5jZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgJiBzZXREZXZpY2VNYXNrKCB1aW50MzJfdCBkZXZpY2VNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXZpY2VNYXNrID0gZGV2aWNlTWFza187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3dhcGNoYWluID09IHJocy5zd2FwY2hhaW4gKQorICAgICAgICAgICYmICggdGltZW91dCA9PSByaHMudGltZW91dCApCisgICAgICAgICAgJiYgKCBzZW1hcGhvcmUgPT0gcmhzLnNlbWFwaG9yZSApCisgICAgICAgICAgJiYgKCBmZW5jZSA9PSByaHMuZmVuY2UgKQorICAgICAgICAgICYmICggZGV2aWNlTWFzayA9PSByaHMuZGV2aWNlTWFzayApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQWNxdWlyZU5leHRJbWFnZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluOworICAgIHVpbnQ2NF90IHRpbWVvdXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlOworICAgIHVpbnQzMl90IGRldmljZU1hc2s7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgKSA9PSBzaXplb2YoIFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QWNxdWlyZU5leHRJbWFnZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEFjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnc0tIUiBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnc0tIUigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZW91dF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgdGltZW91dCggdGltZW91dF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgKSAtIG9mZnNldG9mKCBBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIoIFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEFjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjcXVpcmVQcm9maWxpbmdMb2NrRmxhZ3NLSFIgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiAmIHNldFRpbWVvdXQoIHVpbnQ2NF90IHRpbWVvdXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRpbWVvdXQgPSB0aW1lb3V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCB0aW1lb3V0ID09IHJocy50aW1lb3V0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnc0tIUiBmbGFnczsKKyAgICB1aW50NjRfdCB0aW1lb3V0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEFjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiApID09IHNpemVvZiggVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBBbGxvY2F0aW9uQ2FsbGJhY2tzCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBBbGxvY2F0aW9uQ2FsbGJhY2tzKCB2b2lkKiBwVXNlckRhdGFfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk5fdmtBbGxvY2F0aW9uRnVuY3Rpb24gcGZuQWxsb2NhdGlvbl8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a1JlYWxsb2NhdGlvbkZ1bmN0aW9uIHBmblJlYWxsb2NhdGlvbl8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0ZyZWVGdW5jdGlvbiBwZm5GcmVlXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZOX3ZrSW50ZXJuYWxBbGxvY2F0aW9uTm90aWZpY2F0aW9uIHBmbkludGVybmFsQWxsb2NhdGlvbl8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0ludGVybmFsRnJlZU5vdGlmaWNhdGlvbiBwZm5JbnRlcm5hbEZyZWVfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcFVzZXJEYXRhKCBwVXNlckRhdGFfICkKKyAgICAgICwgcGZuQWxsb2NhdGlvbiggcGZuQWxsb2NhdGlvbl8gKQorICAgICAgLCBwZm5SZWFsbG9jYXRpb24oIHBmblJlYWxsb2NhdGlvbl8gKQorICAgICAgLCBwZm5GcmVlKCBwZm5GcmVlXyApCisgICAgICAsIHBmbkludGVybmFsQWxsb2NhdGlvbiggcGZuSW50ZXJuYWxBbGxvY2F0aW9uXyApCisgICAgICAsIHBmbkludGVybmFsRnJlZSggcGZuSW50ZXJuYWxGcmVlXyApCisgICAge30KKworICAgIEFsbG9jYXRpb25DYWxsYmFja3MoIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBBbGxvY2F0aW9uQ2FsbGJhY2tzJiBvcGVyYXRvcj0oIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFsbG9jYXRpb25DYWxsYmFja3MgJiBzZXRQVXNlckRhdGEoIHZvaWQqIHBVc2VyRGF0YV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFVzZXJEYXRhID0gcFVzZXJEYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBbGxvY2F0aW9uQ2FsbGJhY2tzICYgc2V0UGZuQWxsb2NhdGlvbiggUEZOX3ZrQWxsb2NhdGlvbkZ1bmN0aW9uIHBmbkFsbG9jYXRpb25fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBmbkFsbG9jYXRpb24gPSBwZm5BbGxvY2F0aW9uXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBbGxvY2F0aW9uQ2FsbGJhY2tzICYgc2V0UGZuUmVhbGxvY2F0aW9uKCBQRk5fdmtSZWFsbG9jYXRpb25GdW5jdGlvbiBwZm5SZWFsbG9jYXRpb25fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBmblJlYWxsb2NhdGlvbiA9IHBmblJlYWxsb2NhdGlvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWxsb2NhdGlvbkNhbGxiYWNrcyAmIHNldFBmbkZyZWUoIFBGTl92a0ZyZWVGdW5jdGlvbiBwZm5GcmVlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwZm5GcmVlID0gcGZuRnJlZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQWxsb2NhdGlvbkNhbGxiYWNrcyAmIHNldFBmbkludGVybmFsQWxsb2NhdGlvbiggUEZOX3ZrSW50ZXJuYWxBbGxvY2F0aW9uTm90aWZpY2F0aW9uIHBmbkludGVybmFsQWxsb2NhdGlvbl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGZuSW50ZXJuYWxBbGxvY2F0aW9uID0gcGZuSW50ZXJuYWxBbGxvY2F0aW9uXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBbGxvY2F0aW9uQ2FsbGJhY2tzICYgc2V0UGZuSW50ZXJuYWxGcmVlKCBQRk5fdmtJbnRlcm5hbEZyZWVOb3RpZmljYXRpb24gcGZuSW50ZXJuYWxGcmVlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwZm5JbnRlcm5hbEZyZWUgPSBwZm5JbnRlcm5hbEZyZWVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBBbGxvY2F0aW9uQ2FsbGJhY2tzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggcFVzZXJEYXRhID09IHJocy5wVXNlckRhdGEgKQorICAgICAgICAgICYmICggcGZuQWxsb2NhdGlvbiA9PSByaHMucGZuQWxsb2NhdGlvbiApCisgICAgICAgICAgJiYgKCBwZm5SZWFsbG9jYXRpb24gPT0gcmhzLnBmblJlYWxsb2NhdGlvbiApCisgICAgICAgICAgJiYgKCBwZm5GcmVlID09IHJocy5wZm5GcmVlICkKKyAgICAgICAgICAmJiAoIHBmbkludGVybmFsQWxsb2NhdGlvbiA9PSByaHMucGZuSW50ZXJuYWxBbGxvY2F0aW9uICkKKyAgICAgICAgICAmJiAoIHBmbkludGVybmFsRnJlZSA9PSByaHMucGZuSW50ZXJuYWxGcmVlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBBbGxvY2F0aW9uQ2FsbGJhY2tzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHZvaWQqIHBVc2VyRGF0YTsKKyAgICBQRk5fdmtBbGxvY2F0aW9uRnVuY3Rpb24gcGZuQWxsb2NhdGlvbjsKKyAgICBQRk5fdmtSZWFsbG9jYXRpb25GdW5jdGlvbiBwZm5SZWFsbG9jYXRpb247CisgICAgUEZOX3ZrRnJlZUZ1bmN0aW9uIHBmbkZyZWU7CisgICAgUEZOX3ZrSW50ZXJuYWxBbGxvY2F0aW9uTm90aWZpY2F0aW9uIHBmbkludGVybmFsQWxsb2NhdGlvbjsKKyAgICBQRk5fdmtJbnRlcm5hbEZyZWVOb3RpZmljYXRpb24gcGZuSW50ZXJuYWxGcmVlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEFsbG9jYXRpb25DYWxsYmFja3MgKSA9PSBzaXplb2YoIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxBbGxvY2F0aW9uQ2FsbGJhY2tzPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBDb21wb25lbnRNYXBwaW5nCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21wb25lbnRNYXBwaW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50U3dpenpsZSByXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRTd2l6emxlOjplSWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudFN3aXp6bGUgZ18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50U3dpenpsZTo6ZUlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRTd2l6emxlIGJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudFN3aXp6bGU6OmVJZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50U3dpenpsZSBhXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRTd2l6emxlOjplSWRlbnRpdHkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHIoIHJfICkKKyAgICAgICwgZyggZ18gKQorICAgICAgLCBiKCBiXyApCisgICAgICAsIGEoIGFfICkKKyAgICB7fQorCisgICAgQ29tcG9uZW50TWFwcGluZyggVmtDb21wb25lbnRNYXBwaW5nIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIENvbXBvbmVudE1hcHBpbmcmIG9wZXJhdG9yPSggVmtDb21wb25lbnRNYXBwaW5nIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudE1hcHBpbmcgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcG9uZW50TWFwcGluZyAmIHNldFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRTd2l6emxlIHJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHIgPSByXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21wb25lbnRNYXBwaW5nICYgc2V0RyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudFN3aXp6bGUgZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZyA9IGdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbXBvbmVudE1hcHBpbmcgJiBzZXRCKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50U3dpenpsZSBiXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiID0gYl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcG9uZW50TWFwcGluZyAmIHNldEEoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRTd2l6emxlIGFfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGEgPSBhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NvbXBvbmVudE1hcHBpbmcgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbXBvbmVudE1hcHBpbmcqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29tcG9uZW50TWFwcGluZyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0NvbXBvbmVudE1hcHBpbmcqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ29tcG9uZW50TWFwcGluZyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHIgPT0gcmhzLnIgKQorICAgICAgICAgICYmICggZyA9PSByaHMuZyApCisgICAgICAgICAgJiYgKCBiID09IHJocy5iICkKKyAgICAgICAgICAmJiAoIGEgPT0gcmhzLmEgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIENvbXBvbmVudE1hcHBpbmcgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudFN3aXp6bGUgcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50U3dpenpsZSBnOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRTd2l6emxlIGI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudFN3aXp6bGUgYTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBDb21wb25lbnRNYXBwaW5nICkgPT0gc2l6ZW9mKCBWa0NvbXBvbmVudE1hcHBpbmcgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8Q29tcG9uZW50TWFwcGluZz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisgIHN0cnVjdCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRAorICB7CisgICAgQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQ6OmVVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVybmFsRm9ybWF0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRGZWF0dXJlRmxhZ3MgZm9ybWF0RmVhdHVyZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdEZlYXR1cmVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50TWFwcGluZyBzYW1wbGVyWWNiY3JDb252ZXJzaW9uQ29tcG9uZW50c18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50TWFwcGluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIHN1Z2dlc3RlZFljYmNyTW9kZWxfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbjo6ZVJnYklkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyUmFuZ2Ugc3VnZ2VzdGVkWWNiY3JSYW5nZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyUmFuZ2U6OmVJdHVGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hyb21hTG9jYXRpb24gc3VnZ2VzdGVkWENocm9tYU9mZnNldF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hyb21hTG9jYXRpb246OmVDb3NpdGVkRXZlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNocm9tYUxvY2F0aW9uIHN1Z2dlc3RlZFlDaHJvbWFPZmZzZXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNocm9tYUxvY2F0aW9uOjplQ29zaXRlZEV2ZW4gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZvcm1hdCggZm9ybWF0XyApCisgICAgICAsIGV4dGVybmFsRm9ybWF0KCBleHRlcm5hbEZvcm1hdF8gKQorICAgICAgLCBmb3JtYXRGZWF0dXJlcyggZm9ybWF0RmVhdHVyZXNfICkKKyAgICAgICwgc2FtcGxlclljYmNyQ29udmVyc2lvbkNvbXBvbmVudHMoIHNhbXBsZXJZY2JjckNvbnZlcnNpb25Db21wb25lbnRzXyApCisgICAgICAsIHN1Z2dlc3RlZFljYmNyTW9kZWwoIHN1Z2dlc3RlZFljYmNyTW9kZWxfICkKKyAgICAgICwgc3VnZ2VzdGVkWWNiY3JSYW5nZSggc3VnZ2VzdGVkWWNiY3JSYW5nZV8gKQorICAgICAgLCBzdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0KCBzdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0XyApCisgICAgICAsIHN1Z2dlc3RlZFlDaHJvbWFPZmZzZXQoIHN1Z2dlc3RlZFlDaHJvbWFPZmZzZXRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEICkgLSBvZmZzZXRvZiggQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCggVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCYgb3BlcmF0b3I9KCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZvcm1hdCA9PSByaHMuZm9ybWF0ICkKKyAgICAgICAgICAmJiAoIGV4dGVybmFsRm9ybWF0ID09IHJocy5leHRlcm5hbEZvcm1hdCApCisgICAgICAgICAgJiYgKCBmb3JtYXRGZWF0dXJlcyA9PSByaHMuZm9ybWF0RmVhdHVyZXMgKQorICAgICAgICAgICYmICggc2FtcGxlclljYmNyQ29udmVyc2lvbkNvbXBvbmVudHMgPT0gcmhzLnNhbXBsZXJZY2JjckNvbnZlcnNpb25Db21wb25lbnRzICkKKyAgICAgICAgICAmJiAoIHN1Z2dlc3RlZFljYmNyTW9kZWwgPT0gcmhzLnN1Z2dlc3RlZFljYmNyTW9kZWwgKQorICAgICAgICAgICYmICggc3VnZ2VzdGVkWWNiY3JSYW5nZSA9PSByaHMuc3VnZ2VzdGVkWWNiY3JSYW5nZSApCisgICAgICAgICAgJiYgKCBzdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0ID09IHJocy5zdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIHN1Z2dlc3RlZFlDaHJvbWFPZmZzZXQgPT0gcmhzLnN1Z2dlc3RlZFlDaHJvbWFPZmZzZXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdDsKKyAgICB1aW50NjRfdCBleHRlcm5hbEZvcm1hdDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0RmVhdHVyZUZsYWdzIGZvcm1hdEZlYXR1cmVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRNYXBwaW5nIHNhbXBsZXJZY2JjckNvbnZlcnNpb25Db21wb25lbnRzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24gc3VnZ2VzdGVkWWNiY3JNb2RlbDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyUmFuZ2Ugc3VnZ2VzdGVkWWNiY3JSYW5nZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hyb21hTG9jYXRpb24gc3VnZ2VzdGVkWENocm9tYU9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hyb21hTG9jYXRpb24gc3VnZ2VzdGVkWUNocm9tYU9mZnNldDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCApID09IHNpemVvZiggVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICBzdHJ1Y3QgQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQKKyAgeworICAgIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBhbGxvY2F0aW9uU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZW1vcnlUeXBlQml0c18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhbGxvY2F0aW9uU2l6ZSggYWxsb2NhdGlvblNpemVfICkKKyAgICAgICwgbWVtb3J5VHlwZUJpdHMoIG1lbW9yeVR5cGVCaXRzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCApIC0gb2Zmc2V0b2YoIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQmIG9wZXJhdG9yPSggVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBhbGxvY2F0aW9uU2l6ZSA9PSByaHMuYWxsb2NhdGlvblNpemUgKQorICAgICAgICAgICYmICggbWVtb3J5VHlwZUJpdHMgPT0gcmhzLm1lbW9yeVR5cGVCaXRzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgYWxsb2NhdGlvblNpemU7CisgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgKSA9PSBzaXplb2YoIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyAgc3RydWN0IEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRAorICB7CisgICAgQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEKCB1aW50NjRfdCBhbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZSggYW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEICkgLSBvZmZzZXRvZiggQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lELCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEKCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQmIG9wZXJhdG9yPSggVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggYW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2UgPT0gcmhzLmFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50NjRfdCBhbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQgKSA9PSBzaXplb2YoIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICBzdHJ1Y3QgQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkU3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkU3VyZmFjZUNyZWF0ZUZsYWdzS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyogd2luZG93XyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCB3aW5kb3coIHdpbmRvd18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgKSAtIG9mZnNldG9mKCBBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIoIFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEFuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldFdpbmRvdyggc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvd18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgd2luZG93ID0gd2luZG93XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCB3aW5kb3cgPT0gcmhzLndpbmRvdyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUFuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3M7CisgICAgc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdzsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgKSA9PSBzaXplb2YoIFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEFuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisKKyAgc3RydWN0IEFwcGxpY2F0aW9uSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQXBwbGljYXRpb25JbmZvKCBjb25zdCBjaGFyKiBwQXBwbGljYXRpb25OYW1lXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcHBsaWNhdGlvblZlcnNpb25fID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBFbmdpbmVOYW1lXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlbmdpbmVWZXJzaW9uXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcGlWZXJzaW9uXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBBcHBsaWNhdGlvbk5hbWUoIHBBcHBsaWNhdGlvbk5hbWVfICkKKyAgICAgICwgYXBwbGljYXRpb25WZXJzaW9uKCBhcHBsaWNhdGlvblZlcnNpb25fICkKKyAgICAgICwgcEVuZ2luZU5hbWUoIHBFbmdpbmVOYW1lXyApCisgICAgICAsIGVuZ2luZVZlcnNpb24oIGVuZ2luZVZlcnNpb25fICkKKyAgICAgICwgYXBpVmVyc2lvbiggYXBpVmVyc2lvbl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXBwbGljYXRpb25JbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXBwbGljYXRpb25JbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBcHBsaWNhdGlvbkluZm8gKSAtIG9mZnNldG9mKCBBcHBsaWNhdGlvbkluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBcHBsaWNhdGlvbkluZm8oIFZrQXBwbGljYXRpb25JbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEFwcGxpY2F0aW9uSW5mbyYgb3BlcmF0b3I9KCBWa0FwcGxpY2F0aW9uSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBcHBsaWNhdGlvbkluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXBwbGljYXRpb25JbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBcHBsaWNhdGlvbkluZm8gJiBzZXRQQXBwbGljYXRpb25OYW1lKCBjb25zdCBjaGFyKiBwQXBwbGljYXRpb25OYW1lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQXBwbGljYXRpb25OYW1lID0gcEFwcGxpY2F0aW9uTmFtZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXBwbGljYXRpb25JbmZvICYgc2V0QXBwbGljYXRpb25WZXJzaW9uKCB1aW50MzJfdCBhcHBsaWNhdGlvblZlcnNpb25fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFwcGxpY2F0aW9uVmVyc2lvbiA9IGFwcGxpY2F0aW9uVmVyc2lvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXBwbGljYXRpb25JbmZvICYgc2V0UEVuZ2luZU5hbWUoIGNvbnN0IGNoYXIqIHBFbmdpbmVOYW1lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRW5naW5lTmFtZSA9IHBFbmdpbmVOYW1lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBcHBsaWNhdGlvbkluZm8gJiBzZXRFbmdpbmVWZXJzaW9uKCB1aW50MzJfdCBlbmdpbmVWZXJzaW9uXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBlbmdpbmVWZXJzaW9uID0gZW5naW5lVmVyc2lvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXBwbGljYXRpb25JbmZvICYgc2V0QXBpVmVyc2lvbiggdWludDMyX3QgYXBpVmVyc2lvbl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYXBpVmVyc2lvbiA9IGFwaVZlcnNpb25fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQXBwbGljYXRpb25JbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBcHBsaWNhdGlvbkluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQXBwbGljYXRpb25JbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQXBwbGljYXRpb25JbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEFwcGxpY2F0aW9uSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcEFwcGxpY2F0aW9uTmFtZSA9PSByaHMucEFwcGxpY2F0aW9uTmFtZSApCisgICAgICAgICAgJiYgKCBhcHBsaWNhdGlvblZlcnNpb24gPT0gcmhzLmFwcGxpY2F0aW9uVmVyc2lvbiApCisgICAgICAgICAgJiYgKCBwRW5naW5lTmFtZSA9PSByaHMucEVuZ2luZU5hbWUgKQorICAgICAgICAgICYmICggZW5naW5lVmVyc2lvbiA9PSByaHMuZW5naW5lVmVyc2lvbiApCisgICAgICAgICAgJiYgKCBhcGlWZXJzaW9uID09IHJocy5hcGlWZXJzaW9uICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBBcHBsaWNhdGlvbkluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQXBwbGljYXRpb25JbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBwQXBwbGljYXRpb25OYW1lOworICAgIHVpbnQzMl90IGFwcGxpY2F0aW9uVmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBwRW5naW5lTmFtZTsKKyAgICB1aW50MzJfdCBlbmdpbmVWZXJzaW9uOworICAgIHVpbnQzMl90IGFwaVZlcnNpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQXBwbGljYXRpb25JbmZvICkgPT0gc2l6ZW9mKCBWa0FwcGxpY2F0aW9uSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxBcHBsaWNhdGlvbkluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEF0dGFjaG1lbnREZXNjcmlwdGlvbgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQXR0YWNobWVudERlc2NyaXB0aW9uKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0OjplVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0czo6ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudExvYWRPcCBsb2FkT3BfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRMb2FkT3A6OmVMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRTdG9yZU9wIHN0b3JlT3BfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRTdG9yZU9wOjplU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudExvYWRPcCBzdGVuY2lsTG9hZE9wXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50TG9hZE9wOjplTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U3RvcmVPcCBzdGVuY2lsU3RvcmVPcF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFN0b3JlT3A6OmVTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbml0aWFsTGF5b3V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dDo6ZVVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBmaW5hbExheW91dF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQ6OmVVbmRlZmluZWQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBmb3JtYXQoIGZvcm1hdF8gKQorICAgICAgLCBzYW1wbGVzKCBzYW1wbGVzXyApCisgICAgICAsIGxvYWRPcCggbG9hZE9wXyApCisgICAgICAsIHN0b3JlT3AoIHN0b3JlT3BfICkKKyAgICAgICwgc3RlbmNpbExvYWRPcCggc3RlbmNpbExvYWRPcF8gKQorICAgICAgLCBzdGVuY2lsU3RvcmVPcCggc3RlbmNpbFN0b3JlT3BfICkKKyAgICAgICwgaW5pdGlhbExheW91dCggaW5pdGlhbExheW91dF8gKQorICAgICAgLCBmaW5hbExheW91dCggZmluYWxMYXlvdXRfICkKKyAgICB7fQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uKCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50RGVzY3JpcHRpb24mIG9wZXJhdG9yPSggVmtBdHRhY2htZW50RGVzY3JpcHRpb24gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiAmIHNldEZvcm1hdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZvcm1hdCA9IGZvcm1hdF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uICYgc2V0U2FtcGxlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlcyA9IHNhbXBsZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiAmIHNldExvYWRPcCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRMb2FkT3AgbG9hZE9wXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBsb2FkT3AgPSBsb2FkT3BfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiAmIHNldFN0b3JlT3AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U3RvcmVPcCBzdG9yZU9wXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdG9yZU9wID0gc3RvcmVPcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uICYgc2V0U3RlbmNpbExvYWRPcCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRMb2FkT3Agc3RlbmNpbExvYWRPcF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RlbmNpbExvYWRPcCA9IHN0ZW5jaWxMb2FkT3BfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiAmIHNldFN0ZW5jaWxTdG9yZU9wKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFN0b3JlT3Agc3RlbmNpbFN0b3JlT3BfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0ZW5jaWxTdG9yZU9wID0gc3RlbmNpbFN0b3JlT3BfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiAmIHNldEluaXRpYWxMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbml0aWFsTGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbml0aWFsTGF5b3V0ID0gaW5pdGlhbExheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uICYgc2V0RmluYWxMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBmaW5hbExheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmluYWxMYXlvdXQgPSBmaW5hbExheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtBdHRhY2htZW50RGVzY3JpcHRpb24qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQXR0YWNobWVudERlc2NyaXB0aW9uIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGZvcm1hdCA9PSByaHMuZm9ybWF0ICkKKyAgICAgICAgICAmJiAoIHNhbXBsZXMgPT0gcmhzLnNhbXBsZXMgKQorICAgICAgICAgICYmICggbG9hZE9wID09IHJocy5sb2FkT3AgKQorICAgICAgICAgICYmICggc3RvcmVPcCA9PSByaHMuc3RvcmVPcCApCisgICAgICAgICAgJiYgKCBzdGVuY2lsTG9hZE9wID09IHJocy5zdGVuY2lsTG9hZE9wICkKKyAgICAgICAgICAmJiAoIHN0ZW5jaWxTdG9yZU9wID09IHJocy5zdGVuY2lsU3RvcmVPcCApCisgICAgICAgICAgJiYgKCBpbml0aWFsTGF5b3V0ID09IHJocy5pbml0aWFsTGF5b3V0ICkKKyAgICAgICAgICAmJiAoIGZpbmFsTGF5b3V0ID09IHJocy5maW5hbExheW91dCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQXR0YWNobWVudERlc2NyaXB0aW9uIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50TG9hZE9wIGxvYWRPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFN0b3JlT3Agc3RvcmVPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudExvYWRPcCBzdGVuY2lsTG9hZE9wOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U3RvcmVPcCBzdGVuY2lsU3RvcmVPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgaW5pdGlhbExheW91dDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgZmluYWxMYXlvdXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQXR0YWNobWVudERlc2NyaXB0aW9uICkgPT0gc2l6ZW9mKCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxBdHRhY2htZW50RGVzY3JpcHRpb24+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEF0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEF0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0OjplVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHM6OmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50TG9hZE9wIGxvYWRPcF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudExvYWRPcDo6ZUxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRTdG9yZU9wIHN0b3JlT3BfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRTdG9yZU9wOjplU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRMb2FkT3Agc3RlbmNpbExvYWRPcF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudExvYWRPcDo6ZUxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRTdG9yZU9wIHN0ZW5jaWxTdG9yZU9wXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U3RvcmVPcDo6ZVN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbml0aWFsTGF5b3V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dDo6ZVVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgZmluYWxMYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0OjplVW5kZWZpbmVkICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgZm9ybWF0KCBmb3JtYXRfICkKKyAgICAgICwgc2FtcGxlcyggc2FtcGxlc18gKQorICAgICAgLCBsb2FkT3AoIGxvYWRPcF8gKQorICAgICAgLCBzdG9yZU9wKCBzdG9yZU9wXyApCisgICAgICAsIHN0ZW5jaWxMb2FkT3AoIHN0ZW5jaWxMb2FkT3BfICkKKyAgICAgICwgc3RlbmNpbFN0b3JlT3AoIHN0ZW5jaWxTdG9yZU9wXyApCisgICAgICAsIGluaXRpYWxMYXlvdXQoIGluaXRpYWxMYXlvdXRfICkKKyAgICAgICwgZmluYWxMYXlvdXQoIGZpbmFsTGF5b3V0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uMktIUiApIC0gb2Zmc2V0b2YoIEF0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSKCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiYgb3BlcmF0b3I9KCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uMktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiAmIHNldEZvcm1hdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZvcm1hdCA9IGZvcm1hdF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiAmIHNldFNhbXBsZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNhbXBsZXMgPSBzYW1wbGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSICYgc2V0TG9hZE9wKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudExvYWRPcCBsb2FkT3BfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxvYWRPcCA9IGxvYWRPcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiAmIHNldFN0b3JlT3AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U3RvcmVPcCBzdG9yZU9wXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdG9yZU9wID0gc3RvcmVPcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiAmIHNldFN0ZW5jaWxMb2FkT3AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50TG9hZE9wIHN0ZW5jaWxMb2FkT3BfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0ZW5jaWxMb2FkT3AgPSBzdGVuY2lsTG9hZE9wXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSICYgc2V0U3RlbmNpbFN0b3JlT3AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U3RvcmVPcCBzdGVuY2lsU3RvcmVPcF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RlbmNpbFN0b3JlT3AgPSBzdGVuY2lsU3RvcmVPcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiAmIHNldEluaXRpYWxMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbml0aWFsTGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbml0aWFsTGF5b3V0ID0gaW5pdGlhbExheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiAmIHNldEZpbmFsTGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgZmluYWxMYXlvdXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZpbmFsTGF5b3V0ID0gZmluYWxMYXlvdXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggZm9ybWF0ID09IHJocy5mb3JtYXQgKQorICAgICAgICAgICYmICggc2FtcGxlcyA9PSByaHMuc2FtcGxlcyApCisgICAgICAgICAgJiYgKCBsb2FkT3AgPT0gcmhzLmxvYWRPcCApCisgICAgICAgICAgJiYgKCBzdG9yZU9wID09IHJocy5zdG9yZU9wICkKKyAgICAgICAgICAmJiAoIHN0ZW5jaWxMb2FkT3AgPT0gcmhzLnN0ZW5jaWxMb2FkT3AgKQorICAgICAgICAgICYmICggc3RlbmNpbFN0b3JlT3AgPT0gcmhzLnN0ZW5jaWxTdG9yZU9wICkKKyAgICAgICAgICAmJiAoIGluaXRpYWxMYXlvdXQgPT0gcmhzLmluaXRpYWxMYXlvdXQgKQorICAgICAgICAgICYmICggZmluYWxMYXlvdXQgPT0gcmhzLmZpbmFsTGF5b3V0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUF0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50TG9hZE9wIGxvYWRPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFN0b3JlT3Agc3RvcmVPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudExvYWRPcCBzdGVuY2lsTG9hZE9wOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U3RvcmVPcCBzdGVuY2lsU3RvcmVPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgaW5pdGlhbExheW91dDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgZmluYWxMYXlvdXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiApID09IHNpemVvZiggVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEF0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBzdGVuY2lsSW5pdGlhbExheW91dF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQ6OmVVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IHN0ZW5jaWxGaW5hbExheW91dF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQ6OmVVbmRlZmluZWQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN0ZW5jaWxJbml0aWFsTGF5b3V0KCBzdGVuY2lsSW5pdGlhbExheW91dF8gKQorICAgICAgLCBzdGVuY2lsRmluYWxMYXlvdXQoIHN0ZW5jaWxGaW5hbExheW91dF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgKSAtIG9mZnNldG9mKCBBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiggVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFImIG9wZXJhdG9yPSggVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiAmIHNldFN0ZW5jaWxJbml0aWFsTGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3RlbmNpbEluaXRpYWxMYXlvdXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0ZW5jaWxJbml0aWFsTGF5b3V0ID0gc3RlbmNpbEluaXRpYWxMYXlvdXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgJiBzZXRTdGVuY2lsRmluYWxMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBzdGVuY2lsRmluYWxMYXlvdXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0ZW5jaWxGaW5hbExheW91dCA9IHN0ZW5jaWxGaW5hbExheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEF0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN0ZW5jaWxJbml0aWFsTGF5b3V0ID09IHJocy5zdGVuY2lsSW5pdGlhbExheW91dCApCisgICAgICAgICAgJiYgKCBzdGVuY2lsRmluYWxMYXlvdXQgPT0gcmhzLnN0ZW5jaWxGaW5hbExheW91dCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3RlbmNpbEluaXRpYWxMYXlvdXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IHN0ZW5jaWxGaW5hbExheW91dDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSICkgPT0gc2l6ZW9mKCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQXR0YWNobWVudFJlZmVyZW5jZQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQXR0YWNobWVudFJlZmVyZW5jZSggdWludDMyX3QgYXR0YWNobWVudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBsYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0OjplVW5kZWZpbmVkICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhdHRhY2htZW50KCBhdHRhY2htZW50XyApCisgICAgICAsIGxheW91dCggbGF5b3V0XyApCisgICAge30KKworICAgIEF0dGFjaG1lbnRSZWZlcmVuY2UoIFZrQXR0YWNobWVudFJlZmVyZW5jZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50UmVmZXJlbmNlJiBvcGVyYXRvcj0oIFZrQXR0YWNobWVudFJlZmVyZW5jZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEF0dGFjaG1lbnRSZWZlcmVuY2UgJiBzZXRBdHRhY2htZW50KCB1aW50MzJfdCBhdHRhY2htZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhdHRhY2htZW50ID0gYXR0YWNobWVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZSAmIHNldExheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGxheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbGF5b3V0ID0gbGF5b3V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQXR0YWNobWVudFJlZmVyZW5jZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0F0dGFjaG1lbnRSZWZlcmVuY2UqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQXR0YWNobWVudFJlZmVyZW5jZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGF0dGFjaG1lbnQgPT0gcmhzLmF0dGFjaG1lbnQgKQorICAgICAgICAgICYmICggbGF5b3V0ID09IHJocy5sYXlvdXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEF0dGFjaG1lbnRSZWZlcmVuY2UgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3QgYXR0YWNobWVudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgbGF5b3V0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEF0dGFjaG1lbnRSZWZlcmVuY2UgKSA9PSBzaXplb2YoIFZrQXR0YWNobWVudFJlZmVyZW5jZSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxBdHRhY2htZW50UmVmZXJlbmNlPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBBdHRhY2htZW50UmVmZXJlbmNlMktIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoIHVpbnQzMl90IGF0dGFjaG1lbnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGxheW91dF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQ6OmVVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2tfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYXR0YWNobWVudCggYXR0YWNobWVudF8gKQorICAgICAgLCBsYXlvdXQoIGxheW91dF8gKQorICAgICAgLCBhc3BlY3RNYXNrKCBhc3BlY3RNYXNrXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiApIC0gb2Zmc2V0b2YoIEF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoIFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZTJLSFImIG9wZXJhdG9yPSggVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50UmVmZXJlbmNlMktIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgJiBzZXRBdHRhY2htZW50KCB1aW50MzJfdCBhdHRhY2htZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhdHRhY2htZW50ID0gYXR0YWNobWVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgJiBzZXRMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBsYXlvdXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxheW91dCA9IGxheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgJiBzZXRBc3BlY3RNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhc3BlY3RNYXNrID0gYXNwZWN0TWFza187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtBdHRhY2htZW50UmVmZXJlbmNlMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBBdHRhY2htZW50UmVmZXJlbmNlMktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggYXR0YWNobWVudCA9PSByaHMuYXR0YWNobWVudCApCisgICAgICAgICAgJiYgKCBsYXlvdXQgPT0gcmhzLmxheW91dCApCisgICAgICAgICAgJiYgKCBhc3BlY3RNYXNrID09IHJocy5hc3BlY3RNYXNrICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBBdHRhY2htZW50UmVmZXJlbmNlMktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVBdHRhY2htZW50UmVmZXJlbmNlMktIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgYXR0YWNobWVudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgbGF5b3V0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2s7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgKSA9PSBzaXplb2YoIFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QXR0YWNobWVudFJlZmVyZW5jZTJLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEF0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IHN0ZW5jaWxMYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0OjplVW5kZWZpbmVkICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdGVuY2lsTGF5b3V0KCBzdGVuY2lsTGF5b3V0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiApIC0gb2Zmc2V0b2YoIEF0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIoIFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFImIG9wZXJhdG9yPSggVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgJiBzZXRTdGVuY2lsTGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3RlbmNpbExheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RlbmNpbExheW91dCA9IHN0ZW5jaWxMYXlvdXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN0ZW5jaWxMYXlvdXQgPT0gcmhzLnN0ZW5jaWxMYXlvdXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEF0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUF0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3RlbmNpbExheW91dDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiApID09IHNpemVvZiggVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRXh0ZW50MkQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVudDJEKCB1aW50MzJfdCB3aWR0aF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogd2lkdGgoIHdpZHRoXyApCisgICAgICAsIGhlaWdodCggaGVpZ2h0XyApCisgICAge30KKworICAgIEV4dGVudDJEKCBWa0V4dGVudDJEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4dGVudDJEJiBvcGVyYXRvcj0oIFZrRXh0ZW50MkQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXh0ZW50MkQgJiBzZXRXaWR0aCggdWludDMyX3Qgd2lkdGhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHdpZHRoID0gd2lkdGhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4dGVudDJEICYgc2V0SGVpZ2h0KCB1aW50MzJfdCBoZWlnaHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhlaWdodCA9IGhlaWdodF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlbnQyRCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXh0ZW50MkQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZW50MkQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlbnQyRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHRlbnQyRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHdpZHRoID09IHJocy53aWR0aCApCisgICAgICAgICAgJiYgKCBoZWlnaHQgPT0gcmhzLmhlaWdodCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXh0ZW50MkQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV4dGVudDJEICkgPT0gc2l6ZW9mKCBWa0V4dGVudDJEICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEV4dGVudDJEPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTYW1wbGVMb2NhdGlvbkVYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2FtcGxlTG9jYXRpb25FWFQoIGZsb2F0IHhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB4KCB4XyApCisgICAgICAsIHkoIHlfICkKKyAgICB7fQorCisgICAgU2FtcGxlTG9jYXRpb25FWFQoIFZrU2FtcGxlTG9jYXRpb25FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU2FtcGxlTG9jYXRpb25FWFQmIG9wZXJhdG9yPSggVmtTYW1wbGVMb2NhdGlvbkVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVMb2NhdGlvbkVYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVMb2NhdGlvbkVYVCAmIHNldFgoIGZsb2F0IHhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHggPSB4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVMb2NhdGlvbkVYVCAmIHNldFkoIGZsb2F0IHlfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHkgPSB5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NhbXBsZUxvY2F0aW9uRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTYW1wbGVMb2NhdGlvbkVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTYW1wbGVMb2NhdGlvbkVYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZUxvY2F0aW9uRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNhbXBsZUxvY2F0aW9uRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggeCA9PSByaHMueCApCisgICAgICAgICAgJiYgKCB5ID09IHJocy55ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTYW1wbGVMb2NhdGlvbkVYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBmbG9hdCB4OworICAgIGZsb2F0IHk7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU2FtcGxlTG9jYXRpb25FWFQgKSA9PSBzaXplb2YoIFZrU2FtcGxlTG9jYXRpb25FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2FtcGxlTG9jYXRpb25FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFNhbXBsZUxvY2F0aW9uc0luZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNhbXBsZUxvY2F0aW9uc0luZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZUxvY2F0aW9uc1BlclBpeGVsXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzOjplMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgc2FtcGxlTG9jYXRpb25HcmlkU2l6ZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVMb2NhdGlvbnNDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVMb2NhdGlvbkVYVCogcFNhbXBsZUxvY2F0aW9uc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbCggc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWxfICkKKyAgICAgICwgc2FtcGxlTG9jYXRpb25HcmlkU2l6ZSggc2FtcGxlTG9jYXRpb25HcmlkU2l6ZV8gKQorICAgICAgLCBzYW1wbGVMb2NhdGlvbnNDb3VudCggc2FtcGxlTG9jYXRpb25zQ291bnRfICkKKyAgICAgICwgcFNhbXBsZUxvY2F0aW9ucyggcFNhbXBsZUxvY2F0aW9uc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlTG9jYXRpb25zSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQgKSAtIG9mZnNldG9mKCBTYW1wbGVMb2NhdGlvbnNJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlTG9jYXRpb25zSW5mb0VYVCggVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNhbXBsZUxvY2F0aW9uc0luZm9FWFQmIG9wZXJhdG9yPSggVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAmIHNldFNhbXBsZUxvY2F0aW9uc1BlclBpeGVsKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwgPSBzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAmIHNldFNhbXBsZUxvY2F0aW9uR3JpZFNpemUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBzYW1wbGVMb2NhdGlvbkdyaWRTaXplXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzYW1wbGVMb2NhdGlvbkdyaWRTaXplID0gc2FtcGxlTG9jYXRpb25HcmlkU2l6ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAmIHNldFNhbXBsZUxvY2F0aW9uc0NvdW50KCB1aW50MzJfdCBzYW1wbGVMb2NhdGlvbnNDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlTG9jYXRpb25zQ291bnQgPSBzYW1wbGVMb2NhdGlvbnNDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAmIHNldFBTYW1wbGVMb2NhdGlvbnMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVMb2NhdGlvbkVYVCogcFNhbXBsZUxvY2F0aW9uc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFNhbXBsZUxvY2F0aW9ucyA9IHBTYW1wbGVMb2NhdGlvbnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbCA9PSByaHMuc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwgKQorICAgICAgICAgICYmICggc2FtcGxlTG9jYXRpb25HcmlkU2l6ZSA9PSByaHMuc2FtcGxlTG9jYXRpb25HcmlkU2l6ZSApCisgICAgICAgICAgJiYgKCBzYW1wbGVMb2NhdGlvbnNDb3VudCA9PSByaHMuc2FtcGxlTG9jYXRpb25zQ291bnQgKQorICAgICAgICAgICYmICggcFNhbXBsZUxvY2F0aW9ucyA9PSByaHMucFNhbXBsZUxvY2F0aW9ucyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTYW1wbGVMb2NhdGlvbnNJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgc2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICB1aW50MzJfdCBzYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlTG9jYXRpb25FWFQqIHBTYW1wbGVMb2NhdGlvbnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU2FtcGxlTG9jYXRpb25zSW5mb0VYVCApID09IHNpemVvZiggVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFNhbXBsZUxvY2F0aW9uc0luZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEF0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEF0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQoIHVpbnQzMl90IGF0dGFjaG1lbnRJbmRleF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIHNhbXBsZUxvY2F0aW9uc0luZm9fID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYXR0YWNobWVudEluZGV4KCBhdHRhY2htZW50SW5kZXhfICkKKyAgICAgICwgc2FtcGxlTG9jYXRpb25zSW5mbyggc2FtcGxlTG9jYXRpb25zSW5mb18gKQorICAgIHt9CisKKyAgICBBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUKCBWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCYgb3BlcmF0b3I9KCBWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUICYgc2V0QXR0YWNobWVudEluZGV4KCB1aW50MzJfdCBhdHRhY2htZW50SW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGF0dGFjaG1lbnRJbmRleCA9IGF0dGFjaG1lbnRJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCAmIHNldFNhbXBsZUxvY2F0aW9uc0luZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIHNhbXBsZUxvY2F0aW9uc0luZm9fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNhbXBsZUxvY2F0aW9uc0luZm8gPSBzYW1wbGVMb2NhdGlvbnNJbmZvXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGF0dGFjaG1lbnRJbmRleCA9PSByaHMuYXR0YWNobWVudEluZGV4ICkKKyAgICAgICAgICAmJiAoIHNhbXBsZUxvY2F0aW9uc0luZm8gPT0gcmhzLnNhbXBsZUxvY2F0aW9uc0luZm8gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEF0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3QgYXR0YWNobWVudEluZGV4OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIHNhbXBsZUxvY2F0aW9uc0luZm87CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCApID09IHNpemVvZiggVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEF0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJhc2VJblN0cnVjdHVyZQorICB7CisgICAgQmFzZUluU3RydWN0dXJlKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHt9CisKKyAgICBCYXNlSW5TdHJ1Y3R1cmUoIFZrQmFzZUluU3RydWN0dXJlIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEJhc2VJblN0cnVjdHVyZSYgb3BlcmF0b3I9KCBWa0Jhc2VJblN0cnVjdHVyZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCYXNlSW5TdHJ1Y3R1cmUgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmFzZUluU3RydWN0dXJlICYgc2V0UE5leHQoIGNvbnN0IHN0cnVjdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmFzZUluU3RydWN0dXJlKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCYXNlSW5TdHJ1Y3R1cmUgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Jhc2VJblN0cnVjdHVyZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCYXNlSW5TdHJ1Y3R1cmUgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtCYXNlSW5TdHJ1Y3R1cmUqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQmFzZUluU3RydWN0dXJlIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQmFzZUluU3RydWN0dXJlIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHN0cnVjdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmFzZUluU3RydWN0dXJlKiBwTmV4dCA9IG51bGxwdHI7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQmFzZUluU3RydWN0dXJlICkgPT0gc2l6ZW9mKCBWa0Jhc2VJblN0cnVjdHVyZSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxCYXNlSW5TdHJ1Y3R1cmU+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJhc2VPdXRTdHJ1Y3R1cmUKKyAgeworICAgIEJhc2VPdXRTdHJ1Y3R1cmUoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAge30KKworICAgIEJhc2VPdXRTdHJ1Y3R1cmUoIFZrQmFzZU91dFN0cnVjdHVyZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBCYXNlT3V0U3RydWN0dXJlJiBvcGVyYXRvcj0oIFZrQmFzZU91dFN0cnVjdHVyZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCYXNlT3V0U3RydWN0dXJlIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJhc2VPdXRTdHJ1Y3R1cmUgJiBzZXRQTmV4dCggc3RydWN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCYXNlT3V0U3RydWN0dXJlKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCYXNlT3V0U3RydWN0dXJlIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCYXNlT3V0U3RydWN0dXJlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Jhc2VPdXRTdHJ1Y3R1cmUgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtCYXNlT3V0U3RydWN0dXJlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEJhc2VPdXRTdHJ1Y3R1cmUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBCYXNlT3V0U3RydWN0dXJlIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHN0cnVjdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmFzZU91dFN0cnVjdHVyZSogcE5leHQgPSBudWxscHRyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEJhc2VPdXRTdHJ1Y3R1cmUgKSA9PSBzaXplb2YoIFZrQmFzZU91dFN0cnVjdHVyZSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxCYXNlT3V0U3RydWN0dXJlPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VJbmRleENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBEZXZpY2VJbmRpY2VzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGFjY2VsZXJhdGlvblN0cnVjdHVyZSggYWNjZWxlcmF0aW9uU3RydWN0dXJlXyApCisgICAgICAsIG1lbW9yeSggbWVtb3J5XyApCisgICAgICAsIG1lbW9yeU9mZnNldCggbWVtb3J5T2Zmc2V0XyApCisgICAgICAsIGRldmljZUluZGV4Q291bnQoIGRldmljZUluZGV4Q291bnRfICkKKyAgICAgICwgcERldmljZUluZGljZXMoIHBEZXZpY2VJbmRpY2VzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViApIC0gb2Zmc2V0b2YoIEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViYgb3BlcmF0b3I9KCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WICYgc2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgJiBzZXRNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnkgPSBtZW1vcnlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgJiBzZXRNZW1vcnlPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1lbW9yeU9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtb3J5T2Zmc2V0ID0gbWVtb3J5T2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WICYgc2V0RGV2aWNlSW5kZXhDb3VudCggdWludDMyX3QgZGV2aWNlSW5kZXhDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGV2aWNlSW5kZXhDb3VudCA9IGRldmljZUluZGV4Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgJiBzZXRQRGV2aWNlSW5kaWNlcyggY29uc3QgdWludDMyX3QqIHBEZXZpY2VJbmRpY2VzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRGV2aWNlSW5kaWNlcyA9IHBEZXZpY2VJbmRpY2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggYWNjZWxlcmF0aW9uU3RydWN0dXJlID09IHJocy5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUgKQorICAgICAgICAgICYmICggbWVtb3J5ID09IHJocy5tZW1vcnkgKQorICAgICAgICAgICYmICggbWVtb3J5T2Zmc2V0ID09IHJocy5tZW1vcnlPZmZzZXQgKQorICAgICAgICAgICYmICggZGV2aWNlSW5kZXhDb3VudCA9PSByaHMuZGV2aWNlSW5kZXhDb3VudCApCisgICAgICAgICAgJiYgKCBwRGV2aWNlSW5kaWNlcyA9PSByaHMucERldmljZUluZGljZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQ7CisgICAgdWludDMyX3QgZGV2aWNlSW5kZXhDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcERldmljZUluZGljZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViApID09IHNpemVvZiggVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8oIHVpbnQzMl90IGRldmljZUluZGV4Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcERldmljZUluZGljZXNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGV2aWNlSW5kZXhDb3VudCggZGV2aWNlSW5kZXhDb3VudF8gKQorICAgICAgLCBwRGV2aWNlSW5kaWNlcyggcERldmljZUluZGljZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvICkgLSBvZmZzZXRvZiggQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8oIFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvJiBvcGVyYXRvcj0oIFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gJiBzZXREZXZpY2VJbmRleENvdW50KCB1aW50MzJfdCBkZXZpY2VJbmRleENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXZpY2VJbmRleENvdW50ID0gZGV2aWNlSW5kZXhDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyAmIHNldFBEZXZpY2VJbmRpY2VzKCBjb25zdCB1aW50MzJfdCogcERldmljZUluZGljZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBEZXZpY2VJbmRpY2VzID0gcERldmljZUluZGljZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkZXZpY2VJbmRleENvdW50ID09IHJocy5kZXZpY2VJbmRleENvdW50ICkKKyAgICAgICAgICAmJiAoIHBEZXZpY2VJbmRpY2VzID09IHJocy5wRGV2aWNlSW5kaWNlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBkZXZpY2VJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwRGV2aWNlSW5kaWNlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvICkgPT0gc2l6ZW9mKCBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQmluZEJ1ZmZlck1lbW9yeUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJpbmRCdWZmZXJNZW1vcnlJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGJ1ZmZlciggYnVmZmVyXyApCisgICAgICAsIG1lbW9yeSggbWVtb3J5XyApCisgICAgICAsIG1lbW9yeU9mZnNldCggbWVtb3J5T2Zmc2V0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5SW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRCdWZmZXJNZW1vcnlJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5SW5mbyApIC0gb2Zmc2V0b2YoIEJpbmRCdWZmZXJNZW1vcnlJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZEJ1ZmZlck1lbW9yeUluZm8oIFZrQmluZEJ1ZmZlck1lbW9yeUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQmluZEJ1ZmZlck1lbW9yeUluZm8mIG9wZXJhdG9yPSggVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5SW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kQnVmZmVyTWVtb3J5SW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZEJ1ZmZlck1lbW9yeUluZm8gJiBzZXRCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXIgPSBidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRCdWZmZXJNZW1vcnlJbmZvICYgc2V0TWVtb3J5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtb3J5ID0gbWVtb3J5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kQnVmZmVyTWVtb3J5SW5mbyAmIHNldE1lbW9yeU9mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnlPZmZzZXQgPSBtZW1vcnlPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZEJ1ZmZlck1lbW9yeUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQmluZEJ1ZmZlck1lbW9yeUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlciA9PSByaHMuYnVmZmVyICkKKyAgICAgICAgICAmJiAoIG1lbW9yeSA9PSByaHMubWVtb3J5ICkKKyAgICAgICAgICAmJiAoIG1lbW9yeU9mZnNldCA9PSByaHMubWVtb3J5T2Zmc2V0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBCaW5kQnVmZmVyTWVtb3J5SW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVCaW5kQnVmZmVyTWVtb3J5SW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnk7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEJpbmRCdWZmZXJNZW1vcnlJbmZvICkgPT0gc2l6ZW9mKCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJpbmRCdWZmZXJNZW1vcnlJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBPZmZzZXQyRAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgT2Zmc2V0MkQoIGludDMyX3QgeF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogeCggeF8gKQorICAgICAgLCB5KCB5XyApCisgICAge30KKworICAgIE9mZnNldDJEKCBWa09mZnNldDJEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE9mZnNldDJEJiBvcGVyYXRvcj0oIFZrT2Zmc2V0MkQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0MkQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgT2Zmc2V0MkQgJiBzZXRYKCBpbnQzMl90IHhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHggPSB4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPZmZzZXQyRCAmIHNldFkoIGludDMyX3QgeV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgeSA9IHlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrT2Zmc2V0MkQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa09mZnNldDJEKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa09mZnNldDJEICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrT2Zmc2V0MkQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggT2Zmc2V0MkQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCB4ID09IHJocy54ICkKKyAgICAgICAgICAmJiAoIHkgPT0gcmhzLnkgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE9mZnNldDJEIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGludDMyX3QgeDsKKyAgICBpbnQzMl90IHk7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggT2Zmc2V0MkQgKSA9PSBzaXplb2YoIFZrT2Zmc2V0MkQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8T2Zmc2V0MkQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFJlY3QyRAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUmVjdDJEKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0MkQgb2Zmc2V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQyRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIGV4dGVudF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogb2Zmc2V0KCBvZmZzZXRfICkKKyAgICAgICwgZXh0ZW50KCBleHRlbnRfICkKKyAgICB7fQorCisgICAgUmVjdDJEKCBWa1JlY3QyRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBSZWN0MkQmIG9wZXJhdG9yPSggVmtSZWN0MkQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlY3QyRCAmIHNldE9mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDJEIG9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2Zmc2V0ID0gb2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZWN0MkQgJiBzZXRFeHRlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBleHRlbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGV4dGVudCA9IGV4dGVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSZWN0MkQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlY3QyRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSZWN0MkQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtSZWN0MkQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUmVjdDJEIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggb2Zmc2V0ID09IHJocy5vZmZzZXQgKQorICAgICAgICAgICYmICggZXh0ZW50ID09IHJocy5leHRlbnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFJlY3QyRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0MkQgb2Zmc2V0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBleHRlbnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUmVjdDJEICkgPT0gc2l6ZW9mKCBWa1JlY3QyRCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxSZWN0MkQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvKCB1aW50MzJfdCBkZXZpY2VJbmRleENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcERldmljZUluZGljZXNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGV2aWNlSW5kZXhDb3VudCggZGV2aWNlSW5kZXhDb3VudF8gKQorICAgICAgLCBwRGV2aWNlSW5kaWNlcyggcERldmljZUluZGljZXNfICkKKyAgICAgICwgc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCggc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudF8gKQorICAgICAgLCBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zKCBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyApIC0gb2Zmc2V0b2YoIEJpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyggVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvJiBvcGVyYXRvcj0oIFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyAmIHNldERldmljZUluZGV4Q291bnQoIHVpbnQzMl90IGRldmljZUluZGV4Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRldmljZUluZGV4Q291bnQgPSBkZXZpY2VJbmRleENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gJiBzZXRQRGV2aWNlSW5kaWNlcyggY29uc3QgdWludDMyX3QqIHBEZXZpY2VJbmRpY2VzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRGV2aWNlSW5kaWNlcyA9IHBEZXZpY2VJbmRpY2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gJiBzZXRTcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50KCB1aW50MzJfdCBzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50ID0gc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvICYgc2V0UFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCogcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyA9IHBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEJpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZGV2aWNlSW5kZXhDb3VudCA9PSByaHMuZGV2aWNlSW5kZXhDb3VudCApCisgICAgICAgICAgJiYgKCBwRGV2aWNlSW5kaWNlcyA9PSByaHMucERldmljZUluZGljZXMgKQorICAgICAgICAgICYmICggc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCA9PSByaHMuc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCApCisgICAgICAgICAgJiYgKCBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zID09IHJocy5wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBkZXZpY2VJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwRGV2aWNlSW5kaWNlczsKKyAgICB1aW50MzJfdCBzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvICkgPT0gc2l6ZW9mKCBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJpbmRJbWFnZU1lbW9yeUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJpbmRJbWFnZU1lbW9yeUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGltYWdlKCBpbWFnZV8gKQorICAgICAgLCBtZW1vcnkoIG1lbW9yeV8gKQorICAgICAgLCBtZW1vcnlPZmZzZXQoIG1lbW9yeU9mZnNldF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEltYWdlTWVtb3J5SW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeUluZm8gKSAtIG9mZnNldG9mKCBCaW5kSW1hZ2VNZW1vcnlJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZEltYWdlTWVtb3J5SW5mbyggVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeUluZm8mIG9wZXJhdG9yPSggVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZEltYWdlTWVtb3J5SW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZEltYWdlTWVtb3J5SW5mbyAmIHNldEltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlID0gaW1hZ2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeUluZm8gJiBzZXRNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnkgPSBtZW1vcnlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeUluZm8gJiBzZXRNZW1vcnlPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1lbW9yeU9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtb3J5T2Zmc2V0ID0gbWVtb3J5T2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0JpbmRJbWFnZU1lbW9yeUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZEltYWdlTWVtb3J5SW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0JpbmRJbWFnZU1lbW9yeUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQmluZEltYWdlTWVtb3J5SW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaW1hZ2UgPT0gcmhzLmltYWdlICkKKyAgICAgICAgICAmJiAoIG1lbW9yeSA9PSByaHMubWVtb3J5ICkKKyAgICAgICAgICAmJiAoIG1lbW9yeU9mZnNldCA9PSByaHMubWVtb3J5T2Zmc2V0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBCaW5kSW1hZ2VNZW1vcnlJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUJpbmRJbWFnZU1lbW9yeUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQmluZEltYWdlTWVtb3J5SW5mbyApID09IHNpemVvZiggVmtCaW5kSW1hZ2VNZW1vcnlJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJpbmRJbWFnZU1lbW9yeUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZUluZGV4XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN3YXBjaGFpbiggc3dhcGNoYWluXyApCisgICAgICAsIGltYWdlSW5kZXgoIGltYWdlSW5kZXhfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSICkgLSBvZmZzZXRvZiggQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIoIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSJiBvcGVyYXRvcj0oIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgJiBzZXRTd2FwY2hhaW4oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzd2FwY2hhaW4gPSBzd2FwY2hhaW5fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgJiBzZXRJbWFnZUluZGV4KCB1aW50MzJfdCBpbWFnZUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZUluZGV4ID0gaW1hZ2VJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN3YXBjaGFpbiA9PSByaHMuc3dhcGNoYWluICkKKyAgICAgICAgICAmJiAoIGltYWdlSW5kZXggPT0gcmhzLmltYWdlSW5kZXggKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEJpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW47CisgICAgdWludDMyX3QgaW1hZ2VJbmRleDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdCaXRzIHBsYW5lQXNwZWN0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdCaXRzOjplQ29sb3IgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBsYW5lQXNwZWN0KCBwbGFuZUFzcGVjdF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEltYWdlUGxhbmVNZW1vcnlJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gKSAtIG9mZnNldG9mKCBCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8oIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEJpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyYgb3BlcmF0b3I9KCBWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gJiBzZXRQbGFuZUFzcGVjdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ0JpdHMgcGxhbmVBc3BlY3RfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBsYW5lQXNwZWN0ID0gcGxhbmVBc3BlY3RfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEJpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcGxhbmVBc3BlY3QgPT0gcmhzLnBsYW5lQXNwZWN0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFnQml0cyBwbGFuZUFzcGVjdDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gKSA9PSBzaXplb2YoIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3BhcnNlTWVtb3J5QmluZAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3BhcnNlTWVtb3J5QmluZCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgcmVzb3VyY2VPZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnlfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1lbW9yeU9mZnNldF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VNZW1vcnlCaW5kRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZU1lbW9yeUJpbmRGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiByZXNvdXJjZU9mZnNldCggcmVzb3VyY2VPZmZzZXRfICkKKyAgICAgICwgc2l6ZSggc2l6ZV8gKQorICAgICAgLCBtZW1vcnkoIG1lbW9yeV8gKQorICAgICAgLCBtZW1vcnlPZmZzZXQoIG1lbW9yeU9mZnNldF8gKQorICAgICAgLCBmbGFncyggZmxhZ3NfICkKKyAgICB7fQorCisgICAgU3BhcnNlTWVtb3J5QmluZCggVmtTcGFyc2VNZW1vcnlCaW5kIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNwYXJzZU1lbW9yeUJpbmQmIG9wZXJhdG9yPSggVmtTcGFyc2VNZW1vcnlCaW5kIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZU1lbW9yeUJpbmQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlTWVtb3J5QmluZCAmIHNldFJlc291cmNlT2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSByZXNvdXJjZU9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVzb3VyY2VPZmZzZXQgPSByZXNvdXJjZU9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlTWVtb3J5QmluZCAmIHNldFNpemUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNpemUgPSBzaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGFyc2VNZW1vcnlCaW5kICYgc2V0TWVtb3J5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtb3J5ID0gbWVtb3J5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGFyc2VNZW1vcnlCaW5kICYgc2V0TWVtb3J5T2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbW9yeU9mZnNldCA9IG1lbW9yeU9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlTWVtb3J5QmluZCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlTWVtb3J5QmluZEZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwYXJzZU1lbW9yeUJpbmQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NwYXJzZU1lbW9yeUJpbmQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3BhcnNlTWVtb3J5QmluZCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZU1lbW9yeUJpbmQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3BhcnNlTWVtb3J5QmluZCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHJlc291cmNlT2Zmc2V0ID09IHJocy5yZXNvdXJjZU9mZnNldCApCisgICAgICAgICAgJiYgKCBzaXplID09IHJocy5zaXplICkKKyAgICAgICAgICAmJiAoIG1lbW9yeSA9PSByaHMubWVtb3J5ICkKKyAgICAgICAgICAmJiAoIG1lbW9yeU9mZnNldCA9PSByaHMubWVtb3J5T2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3BhcnNlTWVtb3J5QmluZCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSByZXNvdXJjZU9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1lbW9yeU9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlTWVtb3J5QmluZEZsYWdzIGZsYWdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNwYXJzZU1lbW9yeUJpbmQgKSA9PSBzaXplb2YoIFZrU3BhcnNlTWVtb3J5QmluZCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTcGFyc2VNZW1vcnlCaW5kPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmluZENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VNZW1vcnlCaW5kKiBwQmluZHNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYnVmZmVyKCBidWZmZXJfICkKKyAgICAgICwgYmluZENvdW50KCBiaW5kQ291bnRfICkKKyAgICAgICwgcEJpbmRzKCBwQmluZHNfICkKKyAgICB7fQorCisgICAgU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8oIFZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8mIG9wZXJhdG9yPSggVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyAmIHNldEJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJ1ZmZlciA9IGJ1ZmZlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8gJiBzZXRCaW5kQ291bnQoIHVpbnQzMl90IGJpbmRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYmluZENvdW50ID0gYmluZENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyAmIHNldFBCaW5kcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZU1lbW9yeUJpbmQqIHBCaW5kc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEJpbmRzID0gcEJpbmRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggYnVmZmVyID09IHJocy5idWZmZXIgKQorICAgICAgICAgICYmICggYmluZENvdW50ID09IHJocy5iaW5kQ291bnQgKQorICAgICAgICAgICYmICggcEJpbmRzID09IHJocy5wQmluZHMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFNwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyOworICAgIHVpbnQzMl90IGJpbmRDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlTWVtb3J5QmluZCogcEJpbmRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvICkgPT0gc2l6ZW9mKCBWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFNwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmluZENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZU1lbW9yeUJpbmQqIHBCaW5kc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBpbWFnZSggaW1hZ2VfICkKKyAgICAgICwgYmluZENvdW50KCBiaW5kQ291bnRfICkKKyAgICAgICwgcEJpbmRzKCBwQmluZHNfICkKKyAgICB7fQorCisgICAgU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyggVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8mIG9wZXJhdG9yPSggVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyAmIHNldEltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlID0gaW1hZ2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8gJiBzZXRCaW5kQ291bnQoIHVpbnQzMl90IGJpbmRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYmluZENvdW50ID0gYmluZENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvICYgc2V0UEJpbmRzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlTWVtb3J5QmluZCogcEJpbmRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQmluZHMgPSBwQmluZHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggaW1hZ2UgPT0gcmhzLmltYWdlICkKKyAgICAgICAgICAmJiAoIGJpbmRDb3VudCA9PSByaHMuYmluZENvdW50ICkKKyAgICAgICAgICAmJiAoIHBCaW5kcyA9PSByaHMucEJpbmRzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZTsKKyAgICB1aW50MzJfdCBiaW5kQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZU1lbW9yeUJpbmQqIHBCaW5kczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvICkgPT0gc2l6ZW9mKCBWa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSW1hZ2VTdWJyZXNvdXJjZQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VTdWJyZXNvdXJjZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFza18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pcExldmVsXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJyYXlMYXllcl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhc3BlY3RNYXNrKCBhc3BlY3RNYXNrXyApCisgICAgICAsIG1pcExldmVsKCBtaXBMZXZlbF8gKQorICAgICAgLCBhcnJheUxheWVyKCBhcnJheUxheWVyXyApCisgICAge30KKworICAgIEltYWdlU3VicmVzb3VyY2UoIFZrSW1hZ2VTdWJyZXNvdXJjZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZVN1YnJlc291cmNlJiBvcGVyYXRvcj0oIFZrSW1hZ2VTdWJyZXNvdXJjZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlU3VicmVzb3VyY2UgJiBzZXRBc3BlY3RNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhc3BlY3RNYXNrID0gYXNwZWN0TWFza187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VTdWJyZXNvdXJjZSAmIHNldE1pcExldmVsKCB1aW50MzJfdCBtaXBMZXZlbF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWlwTGV2ZWwgPSBtaXBMZXZlbF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VTdWJyZXNvdXJjZSAmIHNldEFycmF5TGF5ZXIoIHVpbnQzMl90IGFycmF5TGF5ZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFycmF5TGF5ZXIgPSBhcnJheUxheWVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlU3VicmVzb3VyY2UgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VTdWJyZXNvdXJjZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlU3VicmVzb3VyY2UqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VTdWJyZXNvdXJjZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGFzcGVjdE1hc2sgPT0gcmhzLmFzcGVjdE1hc2sgKQorICAgICAgICAgICYmICggbWlwTGV2ZWwgPT0gcmhzLm1pcExldmVsICkKKyAgICAgICAgICAmJiAoIGFycmF5TGF5ZXIgPT0gcmhzLmFycmF5TGF5ZXIgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlU3VicmVzb3VyY2UgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFzazsKKyAgICB1aW50MzJfdCBtaXBMZXZlbDsKKyAgICB1aW50MzJfdCBhcnJheUxheWVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltYWdlU3VicmVzb3VyY2UgKSA9PSBzaXplb2YoIFZrSW1hZ2VTdWJyZXNvdXJjZSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVN1YnJlc291cmNlPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBPZmZzZXQzRAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgT2Zmc2V0M0QoIGludDMyX3QgeF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB6XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHgoIHhfICkKKyAgICAgICwgeSggeV8gKQorICAgICAgLCB6KCB6XyApCisgICAge30KKworICAgIGV4cGxpY2l0IE9mZnNldDNEKCBPZmZzZXQyRCBjb25zdCYgb2Zmc2V0MkQsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgel8gPSAwICkKKyAgICAgIDogeCggb2Zmc2V0MkQueCApCisgICAgICAsIHkoIG9mZnNldDJELnkgKQorICAgICAgLCB6KCB6XyApCisgICAge30KKworICAgIE9mZnNldDNEKCBWa09mZnNldDNEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE9mZnNldDNEJiBvcGVyYXRvcj0oIFZrT2Zmc2V0M0QgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgT2Zmc2V0M0QgJiBzZXRYKCBpbnQzMl90IHhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHggPSB4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPZmZzZXQzRCAmIHNldFkoIGludDMyX3QgeV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgeSA9IHlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9mZnNldDNEICYgc2V0WiggaW50MzJfdCB6XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB6ID0gel87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtPZmZzZXQzRCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrT2Zmc2V0M0QqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrT2Zmc2V0M0QgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtPZmZzZXQzRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBPZmZzZXQzRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHggPT0gcmhzLnggKQorICAgICAgICAgICYmICggeSA9PSByaHMueSApCisgICAgICAgICAgJiYgKCB6ID09IHJocy56ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBPZmZzZXQzRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBpbnQzMl90IHg7CisgICAgaW50MzJfdCB5OworICAgIGludDMyX3QgejsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBPZmZzZXQzRCApID09IHNpemVvZiggVmtPZmZzZXQzRCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxPZmZzZXQzRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRXh0ZW50M0QKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4dGVudDNEKCB1aW50MzJfdCB3aWR0aF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVwdGhfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogd2lkdGgoIHdpZHRoXyApCisgICAgICAsIGhlaWdodCggaGVpZ2h0XyApCisgICAgICAsIGRlcHRoKCBkZXB0aF8gKQorICAgIHt9CisKKyAgICBleHBsaWNpdCBFeHRlbnQzRCggRXh0ZW50MkQgY29uc3QmIGV4dGVudDJELAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXB0aF8gPSAwICkKKyAgICAgIDogd2lkdGgoIGV4dGVudDJELndpZHRoICkKKyAgICAgICwgaGVpZ2h0KCBleHRlbnQyRC5oZWlnaHQgKQorICAgICAgLCBkZXB0aCggZGVwdGhfICkKKyAgICB7fQorCisgICAgRXh0ZW50M0QoIFZrRXh0ZW50M0QgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRXh0ZW50M0QmIG9wZXJhdG9yPSggVmtFeHRlbnQzRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlbnQzRCAmIHNldFdpZHRoKCB1aW50MzJfdCB3aWR0aF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgd2lkdGggPSB3aWR0aF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXh0ZW50M0QgJiBzZXRIZWlnaHQoIHVpbnQzMl90IGhlaWdodF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaGVpZ2h0ID0gaGVpZ2h0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlbnQzRCAmIHNldERlcHRoKCB1aW50MzJfdCBkZXB0aF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGggPSBkZXB0aF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlbnQzRCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXh0ZW50M0QqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZW50M0QgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlbnQzRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHRlbnQzRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHdpZHRoID09IHJocy53aWR0aCApCisgICAgICAgICAgJiYgKCBoZWlnaHQgPT0gcmhzLmhlaWdodCApCisgICAgICAgICAgJiYgKCBkZXB0aCA9PSByaHMuZGVwdGggKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEV4dGVudDNEIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICB1aW50MzJfdCBkZXB0aDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBFeHRlbnQzRCApID09IHNpemVvZiggVmtFeHRlbnQzRCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHRlbnQzRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3BhcnNlSW1hZ2VNZW1vcnlCaW5kCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTcGFyc2VJbWFnZU1lbW9yeUJpbmQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlIHN1YnJlc291cmNlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0Qgb2Zmc2V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQzRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEIGV4dGVudF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1lbW9yeU9mZnNldF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZU1lbW9yeUJpbmRGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlTWVtb3J5QmluZEZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN1YnJlc291cmNlKCBzdWJyZXNvdXJjZV8gKQorICAgICAgLCBvZmZzZXQoIG9mZnNldF8gKQorICAgICAgLCBleHRlbnQoIGV4dGVudF8gKQorICAgICAgLCBtZW1vcnkoIG1lbW9yeV8gKQorICAgICAgLCBtZW1vcnlPZmZzZXQoIG1lbW9yeU9mZnNldF8gKQorICAgICAgLCBmbGFncyggZmxhZ3NfICkKKyAgICB7fQorCisgICAgU3BhcnNlSW1hZ2VNZW1vcnlCaW5kKCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTcGFyc2VJbWFnZU1lbW9yeUJpbmQmIG9wZXJhdG9yPSggVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlCaW5kIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlTWVtb3J5QmluZCAmIHNldFN1YnJlc291cmNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZSBzdWJyZXNvdXJjZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3VicmVzb3VyY2UgPSBzdWJyZXNvdXJjZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlSW1hZ2VNZW1vcnlCaW5kICYgc2V0T2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0Qgb2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBvZmZzZXQgPSBvZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlTWVtb3J5QmluZCAmIHNldEV4dGVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEIGV4dGVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZXh0ZW50ID0gZXh0ZW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGFyc2VJbWFnZU1lbW9yeUJpbmQgJiBzZXRNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnkgPSBtZW1vcnlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlTWVtb3J5QmluZCAmIHNldE1lbW9yeU9mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnlPZmZzZXQgPSBtZW1vcnlPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlTWVtb3J5QmluZCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlTWVtb3J5QmluZEZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwYXJzZUltYWdlTWVtb3J5QmluZCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwYXJzZUltYWdlTWVtb3J5QmluZCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlTWVtb3J5QmluZCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTcGFyc2VJbWFnZU1lbW9yeUJpbmQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzdWJyZXNvdXJjZSA9PSByaHMuc3VicmVzb3VyY2UgKQorICAgICAgICAgICYmICggb2Zmc2V0ID09IHJocy5vZmZzZXQgKQorICAgICAgICAgICYmICggZXh0ZW50ID09IHJocy5leHRlbnQgKQorICAgICAgICAgICYmICggbWVtb3J5ID09IHJocy5tZW1vcnkgKQorICAgICAgICAgICYmICggbWVtb3J5T2Zmc2V0ID09IHJocy5tZW1vcnlPZmZzZXQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTcGFyc2VJbWFnZU1lbW9yeUJpbmQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2Ugc3VicmVzb3VyY2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEIG9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QgZXh0ZW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1lbW9yeU9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlTWVtb3J5QmluZEZsYWdzIGZsYWdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNwYXJzZUltYWdlTWVtb3J5QmluZCApID09IHNpemVvZiggVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3BhcnNlSW1hZ2VNZW1vcnlCaW5kPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmluZENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlTWVtb3J5QmluZCogcEJpbmRzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGltYWdlKCBpbWFnZV8gKQorICAgICAgLCBiaW5kQ291bnQoIGJpbmRDb3VudF8gKQorICAgICAgLCBwQmluZHMoIHBCaW5kc18gKQorICAgIHt9CisKKyAgICBTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvKCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyYgb3BlcmF0b3I9KCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvICYgc2V0SW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW1hZ2UgPSBpbWFnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyAmIHNldEJpbmRDb3VudCggdWludDMyX3QgYmluZENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiaW5kQ291bnQgPSBiaW5kQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlTWVtb3J5QmluZEluZm8gJiBzZXRQQmluZHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZU1lbW9yeUJpbmQqIHBCaW5kc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEJpbmRzID0gcEJpbmRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGltYWdlID09IHJocy5pbWFnZSApCisgICAgICAgICAgJiYgKCBiaW5kQ291bnQgPT0gcmhzLmJpbmRDb3VudCApCisgICAgICAgICAgJiYgKCBwQmluZHMgPT0gcmhzLnBCaW5kcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2U7CisgICAgdWludDMyX3QgYmluZENvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZU1lbW9yeUJpbmQqIHBCaW5kczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvICkgPT0gc2l6ZW9mKCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQmluZFNwYXJzZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJpbmRTcGFyc2VJbmZvKCB1aW50MzJfdCB3YWl0U2VtYXBob3JlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSogcFdhaXRTZW1hcGhvcmVzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckJpbmRDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8qIHBCdWZmZXJCaW5kc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU9wYXF1ZUJpbmRDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyogcEltYWdlT3BhcXVlQmluZHNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW1hZ2VCaW5kQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qIHBJbWFnZUJpbmRzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBTaWduYWxTZW1hcGhvcmVzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHdhaXRTZW1hcGhvcmVDb3VudCggd2FpdFNlbWFwaG9yZUNvdW50XyApCisgICAgICAsIHBXYWl0U2VtYXBob3JlcyggcFdhaXRTZW1hcGhvcmVzXyApCisgICAgICAsIGJ1ZmZlckJpbmRDb3VudCggYnVmZmVyQmluZENvdW50XyApCisgICAgICAsIHBCdWZmZXJCaW5kcyggcEJ1ZmZlckJpbmRzXyApCisgICAgICAsIGltYWdlT3BhcXVlQmluZENvdW50KCBpbWFnZU9wYXF1ZUJpbmRDb3VudF8gKQorICAgICAgLCBwSW1hZ2VPcGFxdWVCaW5kcyggcEltYWdlT3BhcXVlQmluZHNfICkKKyAgICAgICwgaW1hZ2VCaW5kQ291bnQoIGltYWdlQmluZENvdW50XyApCisgICAgICAsIHBJbWFnZUJpbmRzKCBwSW1hZ2VCaW5kc18gKQorICAgICAgLCBzaWduYWxTZW1hcGhvcmVDb3VudCggc2lnbmFsU2VtYXBob3JlQ291bnRfICkKKyAgICAgICwgcFNpZ25hbFNlbWFwaG9yZXMoIHBTaWduYWxTZW1hcGhvcmVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kU3BhcnNlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRTcGFyc2VJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kU3BhcnNlSW5mbyApIC0gb2Zmc2V0b2YoIEJpbmRTcGFyc2VJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZFNwYXJzZUluZm8oIFZrQmluZFNwYXJzZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQmluZFNwYXJzZUluZm8mIG9wZXJhdG9yPSggVmtCaW5kU3BhcnNlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kU3BhcnNlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kU3BhcnNlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZFNwYXJzZUluZm8gJiBzZXRXYWl0U2VtYXBob3JlQ291bnQoIHVpbnQzMl90IHdhaXRTZW1hcGhvcmVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgd2FpdFNlbWFwaG9yZUNvdW50ID0gd2FpdFNlbWFwaG9yZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kU3BhcnNlSW5mbyAmIHNldFBXYWl0U2VtYXBob3JlcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSogcFdhaXRTZW1hcGhvcmVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBwV2FpdFNlbWFwaG9yZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRTcGFyc2VJbmZvICYgc2V0QnVmZmVyQmluZENvdW50KCB1aW50MzJfdCBidWZmZXJCaW5kQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJ1ZmZlckJpbmRDb3VudCA9IGJ1ZmZlckJpbmRDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQmluZFNwYXJzZUluZm8gJiBzZXRQQnVmZmVyQmluZHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyogcEJ1ZmZlckJpbmRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQnVmZmVyQmluZHMgPSBwQnVmZmVyQmluZHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRTcGFyc2VJbmZvICYgc2V0SW1hZ2VPcGFxdWVCaW5kQ291bnQoIHVpbnQzMl90IGltYWdlT3BhcXVlQmluZENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZU9wYXF1ZUJpbmRDb3VudCA9IGltYWdlT3BhcXVlQmluZENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kU3BhcnNlSW5mbyAmIHNldFBJbWFnZU9wYXF1ZUJpbmRzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyogcEltYWdlT3BhcXVlQmluZHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBJbWFnZU9wYXF1ZUJpbmRzID0gcEltYWdlT3BhcXVlQmluZHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRTcGFyc2VJbmZvICYgc2V0SW1hZ2VCaW5kQ291bnQoIHVpbnQzMl90IGltYWdlQmluZENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZUJpbmRDb3VudCA9IGltYWdlQmluZENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kU3BhcnNlSW5mbyAmIHNldFBJbWFnZUJpbmRzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyogcEltYWdlQmluZHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBJbWFnZUJpbmRzID0gcEltYWdlQmluZHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpbmRTcGFyc2VJbmZvICYgc2V0U2lnbmFsU2VtYXBob3JlQ291bnQoIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaWduYWxTZW1hcGhvcmVDb3VudCA9IHNpZ25hbFNlbWFwaG9yZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaW5kU3BhcnNlSW5mbyAmIHNldFBTaWduYWxTZW1hcGhvcmVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlKiBwU2lnbmFsU2VtYXBob3Jlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFNpZ25hbFNlbWFwaG9yZXMgPSBwU2lnbmFsU2VtYXBob3Jlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCaW5kU3BhcnNlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQmluZFNwYXJzZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQmluZFNwYXJzZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kU3BhcnNlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBCaW5kU3BhcnNlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggd2FpdFNlbWFwaG9yZUNvdW50ID09IHJocy53YWl0U2VtYXBob3JlQ291bnQgKQorICAgICAgICAgICYmICggcFdhaXRTZW1hcGhvcmVzID09IHJocy5wV2FpdFNlbWFwaG9yZXMgKQorICAgICAgICAgICYmICggYnVmZmVyQmluZENvdW50ID09IHJocy5idWZmZXJCaW5kQ291bnQgKQorICAgICAgICAgICYmICggcEJ1ZmZlckJpbmRzID09IHJocy5wQnVmZmVyQmluZHMgKQorICAgICAgICAgICYmICggaW1hZ2VPcGFxdWVCaW5kQ291bnQgPT0gcmhzLmltYWdlT3BhcXVlQmluZENvdW50ICkKKyAgICAgICAgICAmJiAoIHBJbWFnZU9wYXF1ZUJpbmRzID09IHJocy5wSW1hZ2VPcGFxdWVCaW5kcyApCisgICAgICAgICAgJiYgKCBpbWFnZUJpbmRDb3VudCA9PSByaHMuaW1hZ2VCaW5kQ291bnQgKQorICAgICAgICAgICYmICggcEltYWdlQmluZHMgPT0gcmhzLnBJbWFnZUJpbmRzICkKKyAgICAgICAgICAmJiAoIHNpZ25hbFNlbWFwaG9yZUNvdW50ID09IHJocy5zaWduYWxTZW1hcGhvcmVDb3VudCApCisgICAgICAgICAgJiYgKCBwU2lnbmFsU2VtYXBob3JlcyA9PSByaHMucFNpZ25hbFNlbWFwaG9yZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEJpbmRTcGFyc2VJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUJpbmRTcGFyc2VJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCB3YWl0U2VtYXBob3JlQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSogcFdhaXRTZW1hcGhvcmVzOworICAgIHVpbnQzMl90IGJ1ZmZlckJpbmRDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8qIHBCdWZmZXJCaW5kczsKKyAgICB1aW50MzJfdCBpbWFnZU9wYXF1ZUJpbmRDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyogcEltYWdlT3BhcXVlQmluZHM7CisgICAgdWludDMyX3QgaW1hZ2VCaW5kQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qIHBJbWFnZUJpbmRzOworICAgIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBTaWduYWxTZW1hcGhvcmVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEJpbmRTcGFyc2VJbmZvICkgPT0gc2l6ZW9mKCBWa0JpbmRTcGFyc2VJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJpbmRTcGFyc2VJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBCdWZmZXJDb3B5CisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBCdWZmZXJDb3B5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzcmNPZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkc3RPZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNyY09mZnNldCggc3JjT2Zmc2V0XyApCisgICAgICAsIGRzdE9mZnNldCggZHN0T2Zmc2V0XyApCisgICAgICAsIHNpemUoIHNpemVfICkKKyAgICB7fQorCisgICAgQnVmZmVyQ29weSggVmtCdWZmZXJDb3B5IGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEJ1ZmZlckNvcHkmIG9wZXJhdG9yPSggVmtCdWZmZXJDb3B5IGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNvcHkgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyQ29weSAmIHNldFNyY09mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc3JjT2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcmNPZmZzZXQgPSBzcmNPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckNvcHkgJiBzZXREc3RPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGRzdE9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0T2Zmc2V0ID0gZHN0T2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJDb3B5ICYgc2V0U2l6ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2l6ZSA9IHNpemVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQnVmZmVyQ29weSBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyQ29weSo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCdWZmZXJDb3B5ICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQnVmZmVyQ29weSo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBCdWZmZXJDb3B5IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc3JjT2Zmc2V0ID09IHJocy5zcmNPZmZzZXQgKQorICAgICAgICAgICYmICggZHN0T2Zmc2V0ID09IHJocy5kc3RPZmZzZXQgKQorICAgICAgICAgICYmICggc2l6ZSA9PSByaHMuc2l6ZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQnVmZmVyQ29weSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzcmNPZmZzZXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgZHN0T2Zmc2V0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQnVmZmVyQ29weSApID09IHNpemVvZiggVmtCdWZmZXJDb3B5ICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJ1ZmZlckNvcHk+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJ1ZmZlckNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJ1ZmZlckNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclVzYWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhcmluZ01vZGUgc2hhcmluZ01vZGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYXJpbmdNb2RlOjplRXhjbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXhDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwUXVldWVGYW1pbHlJbmRpY2VzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBzaXplKCBzaXplXyApCisgICAgICAsIHVzYWdlKCB1c2FnZV8gKQorICAgICAgLCBzaGFyaW5nTW9kZSggc2hhcmluZ01vZGVfICkKKyAgICAgICwgcXVldWVGYW1pbHlJbmRleENvdW50KCBxdWV1ZUZhbWlseUluZGV4Q291bnRfICkKKyAgICAgICwgcFF1ZXVlRmFtaWx5SW5kaWNlcyggcFF1ZXVlRmFtaWx5SW5kaWNlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBCdWZmZXJDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyQ3JlYXRlSW5mbyggVmtCdWZmZXJDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtCdWZmZXJDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyQ3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZUluZm8gJiBzZXRTaXplKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaXplID0gc2l6ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyQ3JlYXRlSW5mbyAmIHNldFVzYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdXNhZ2UgPSB1c2FnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyQ3JlYXRlSW5mbyAmIHNldFNoYXJpbmdNb2RlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhcmluZ01vZGUgc2hhcmluZ01vZGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYXJpbmdNb2RlID0gc2hhcmluZ01vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZUluZm8gJiBzZXRRdWV1ZUZhbWlseUluZGV4Q291bnQoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXhDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gcXVldWVGYW1pbHlJbmRleENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJDcmVhdGVJbmZvICYgc2V0UFF1ZXVlRmFtaWx5SW5kaWNlcyggY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBwUXVldWVGYW1pbHlJbmRpY2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0J1ZmZlckNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQnVmZmVyQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlckNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQnVmZmVyQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHNpemUgPT0gcmhzLnNpemUgKQorICAgICAgICAgICYmICggdXNhZ2UgPT0gcmhzLnVzYWdlICkKKyAgICAgICAgICAmJiAoIHNoYXJpbmdNb2RlID09IHJocy5zaGFyaW5nTW9kZSApCisgICAgICAgICAgJiYgKCBxdWV1ZUZhbWlseUluZGV4Q291bnQgPT0gcmhzLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCApCisgICAgICAgICAgJiYgKCBwUXVldWVGYW1pbHlJbmRpY2VzID09IHJocy5wUXVldWVGYW1pbHlJbmRpY2VzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBCdWZmZXJDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUJ1ZmZlckNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFyaW5nTW9kZSBzaGFyaW5nTW9kZTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQnVmZmVyQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtCdWZmZXJDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJ1ZmZlckNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJ1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUFkZHJlc3MgZGV2aWNlQWRkcmVzc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkZXZpY2VBZGRyZXNzKCBkZXZpY2VBZGRyZXNzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIEJ1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQoIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgJiBzZXREZXZpY2VBZGRyZXNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlQWRkcmVzcyBkZXZpY2VBZGRyZXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXZpY2VBZGRyZXNzID0gZGV2aWNlQWRkcmVzc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZGV2aWNlQWRkcmVzcyA9PSByaHMuZGV2aWNlQWRkcmVzcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VBZGRyZXNzIGRldmljZUFkZHJlc3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgKSA9PSBzaXplb2YoIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBidWZmZXIoIGJ1ZmZlcl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgKSAtIG9mZnNldG9mKCBCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSJiBvcGVyYXRvcj0oIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSICYgc2V0QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYnVmZmVyID0gYnVmZmVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBidWZmZXIgPT0gcmhzLmJ1ZmZlciApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBJbWFnZVN1YnJlc291cmNlTGF5ZXJzCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVN1YnJlc291cmNlTGF5ZXJzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWlwTGV2ZWxfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXNlQXJyYXlMYXllcl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxheWVyQ291bnRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYXNwZWN0TWFzayggYXNwZWN0TWFza18gKQorICAgICAgLCBtaXBMZXZlbCggbWlwTGV2ZWxfICkKKyAgICAgICwgYmFzZUFycmF5TGF5ZXIoIGJhc2VBcnJheUxheWVyXyApCisgICAgICAsIGxheWVyQ291bnQoIGxheWVyQ291bnRfICkKKyAgICB7fQorCisgICAgSW1hZ2VTdWJyZXNvdXJjZUxheWVycyggVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltYWdlU3VicmVzb3VyY2VMYXllcnMmIG9wZXJhdG9yPSggVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VTdWJyZXNvdXJjZUxheWVycyAmIHNldEFzcGVjdE1hc2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFzcGVjdE1hc2sgPSBhc3BlY3RNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVN1YnJlc291cmNlTGF5ZXJzICYgc2V0TWlwTGV2ZWwoIHVpbnQzMl90IG1pcExldmVsXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtaXBMZXZlbCA9IG1pcExldmVsXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVN1YnJlc291cmNlTGF5ZXJzICYgc2V0QmFzZUFycmF5TGF5ZXIoIHVpbnQzMl90IGJhc2VBcnJheUxheWVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiYXNlQXJyYXlMYXllciA9IGJhc2VBcnJheUxheWVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVN1YnJlc291cmNlTGF5ZXJzICYgc2V0TGF5ZXJDb3VudCggdWludDMyX3QgbGF5ZXJDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbGF5ZXJDb3VudCA9IGxheWVyQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbWFnZVN1YnJlc291cmNlTGF5ZXJzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggYXNwZWN0TWFzayA9PSByaHMuYXNwZWN0TWFzayApCisgICAgICAgICAgJiYgKCBtaXBMZXZlbCA9PSByaHMubWlwTGV2ZWwgKQorICAgICAgICAgICYmICggYmFzZUFycmF5TGF5ZXIgPT0gcmhzLmJhc2VBcnJheUxheWVyICkKKyAgICAgICAgICAmJiAoIGxheWVyQ291bnQgPT0gcmhzLmxheWVyQ291bnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlU3VicmVzb3VyY2VMYXllcnMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFzazsKKyAgICB1aW50MzJfdCBtaXBMZXZlbDsKKyAgICB1aW50MzJfdCBiYXNlQXJyYXlMYXllcjsKKyAgICB1aW50MzJfdCBsYXllckNvdW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltYWdlU3VicmVzb3VyY2VMYXllcnMgKSA9PSBzaXplb2YoIFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVN1YnJlc291cmNlTGF5ZXJzPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBCdWZmZXJJbWFnZUNvcHkKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJ1ZmZlckltYWdlQ29weSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgYnVmZmVyT2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJSb3dMZW5ndGhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckltYWdlSGVpZ2h0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBpbWFnZVN1YnJlc291cmNlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlTGF5ZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QgaW1hZ2VPZmZzZXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QgaW1hZ2VFeHRlbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGJ1ZmZlck9mZnNldCggYnVmZmVyT2Zmc2V0XyApCisgICAgICAsIGJ1ZmZlclJvd0xlbmd0aCggYnVmZmVyUm93TGVuZ3RoXyApCisgICAgICAsIGJ1ZmZlckltYWdlSGVpZ2h0KCBidWZmZXJJbWFnZUhlaWdodF8gKQorICAgICAgLCBpbWFnZVN1YnJlc291cmNlKCBpbWFnZVN1YnJlc291cmNlXyApCisgICAgICAsIGltYWdlT2Zmc2V0KCBpbWFnZU9mZnNldF8gKQorICAgICAgLCBpbWFnZUV4dGVudCggaW1hZ2VFeHRlbnRfICkKKyAgICB7fQorCisgICAgQnVmZmVySW1hZ2VDb3B5KCBWa0J1ZmZlckltYWdlQ29weSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBCdWZmZXJJbWFnZUNvcHkmIG9wZXJhdG9yPSggVmtCdWZmZXJJbWFnZUNvcHkgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVySW1hZ2VDb3B5IGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckltYWdlQ29weSAmIHNldEJ1ZmZlck9mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgYnVmZmVyT2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXJPZmZzZXQgPSBidWZmZXJPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckltYWdlQ29weSAmIHNldEJ1ZmZlclJvd0xlbmd0aCggdWludDMyX3QgYnVmZmVyUm93TGVuZ3RoXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXJSb3dMZW5ndGggPSBidWZmZXJSb3dMZW5ndGhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckltYWdlQ29weSAmIHNldEJ1ZmZlckltYWdlSGVpZ2h0KCB1aW50MzJfdCBidWZmZXJJbWFnZUhlaWdodF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYnVmZmVySW1hZ2VIZWlnaHQgPSBidWZmZXJJbWFnZUhlaWdodF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVySW1hZ2VDb3B5ICYgc2V0SW1hZ2VTdWJyZXNvdXJjZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgaW1hZ2VTdWJyZXNvdXJjZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW1hZ2VTdWJyZXNvdXJjZSA9IGltYWdlU3VicmVzb3VyY2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckltYWdlQ29weSAmIHNldEltYWdlT2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QgaW1hZ2VPZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlT2Zmc2V0ID0gaW1hZ2VPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlckltYWdlQ29weSAmIHNldEltYWdlRXh0ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QgaW1hZ2VFeHRlbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlRXh0ZW50ID0gaW1hZ2VFeHRlbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQnVmZmVySW1hZ2VDb3B5IGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQnVmZmVySW1hZ2VDb3B5ICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQnVmZmVySW1hZ2VDb3B5Kj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEJ1ZmZlckltYWdlQ29weSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGJ1ZmZlck9mZnNldCA9PSByaHMuYnVmZmVyT2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlclJvd0xlbmd0aCA9PSByaHMuYnVmZmVyUm93TGVuZ3RoICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlckltYWdlSGVpZ2h0ID09IHJocy5idWZmZXJJbWFnZUhlaWdodCApCisgICAgICAgICAgJiYgKCBpbWFnZVN1YnJlc291cmNlID09IHJocy5pbWFnZVN1YnJlc291cmNlICkKKyAgICAgICAgICAmJiAoIGltYWdlT2Zmc2V0ID09IHJocy5pbWFnZU9mZnNldCApCisgICAgICAgICAgJiYgKCBpbWFnZUV4dGVudCA9PSByaHMuaW1hZ2VFeHRlbnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEJ1ZmZlckltYWdlQ29weSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBidWZmZXJPZmZzZXQ7CisgICAgdWludDMyX3QgYnVmZmVyUm93TGVuZ3RoOworICAgIHVpbnQzMl90IGJ1ZmZlckltYWdlSGVpZ2h0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlTGF5ZXJzIGltYWdlU3VicmVzb3VyY2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEIGltYWdlT2Zmc2V0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBpbWFnZUV4dGVudDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBCdWZmZXJJbWFnZUNvcHkgKSA9PSBzaXplb2YoIFZrQnVmZmVySW1hZ2VDb3B5ICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEJ1ZmZlckltYWdlQ29weT46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQnVmZmVyTWVtb3J5QmFycmllcgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVmZmVyTWVtb3J5QmFycmllciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIHNyY0FjY2Vzc01hc2tfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIGRzdEFjY2Vzc01hc2tfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjUXVldWVGYW1pbHlJbmRleF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFF1ZXVlRmFtaWx5SW5kZXhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2l6ZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzcmNBY2Nlc3NNYXNrKCBzcmNBY2Nlc3NNYXNrXyApCisgICAgICAsIGRzdEFjY2Vzc01hc2soIGRzdEFjY2Vzc01hc2tfICkKKyAgICAgICwgc3JjUXVldWVGYW1pbHlJbmRleCggc3JjUXVldWVGYW1pbHlJbmRleF8gKQorICAgICAgLCBkc3RRdWV1ZUZhbWlseUluZGV4KCBkc3RRdWV1ZUZhbWlseUluZGV4XyApCisgICAgICAsIGJ1ZmZlciggYnVmZmVyXyApCisgICAgICAsIG9mZnNldCggb2Zmc2V0XyApCisgICAgICAsIHNpemUoIHNpemVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlck1lbW9yeUJhcnJpZXIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJNZW1vcnlCYXJyaWVyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJNZW1vcnlCYXJyaWVyICkgLSBvZmZzZXRvZiggQnVmZmVyTWVtb3J5QmFycmllciwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlck1lbW9yeUJhcnJpZXIoIFZrQnVmZmVyTWVtb3J5QmFycmllciBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBCdWZmZXJNZW1vcnlCYXJyaWVyJiBvcGVyYXRvcj0oIFZrQnVmZmVyTWVtb3J5QmFycmllciBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJNZW1vcnlCYXJyaWVyIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlck1lbW9yeUJhcnJpZXIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlck1lbW9yeUJhcnJpZXIgJiBzZXRTcmNBY2Nlc3NNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3Mgc3JjQWNjZXNzTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjQWNjZXNzTWFzayA9IHNyY0FjY2Vzc01hc2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlck1lbW9yeUJhcnJpZXIgJiBzZXREc3RBY2Nlc3NNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3MgZHN0QWNjZXNzTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0QWNjZXNzTWFzayA9IGRzdEFjY2Vzc01hc2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlck1lbW9yeUJhcnJpZXIgJiBzZXRTcmNRdWV1ZUZhbWlseUluZGV4KCB1aW50MzJfdCBzcmNRdWV1ZUZhbWlseUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcmNRdWV1ZUZhbWlseUluZGV4ID0gc3JjUXVldWVGYW1pbHlJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyTWVtb3J5QmFycmllciAmIHNldERzdFF1ZXVlRmFtaWx5SW5kZXgoIHVpbnQzMl90IGRzdFF1ZXVlRmFtaWx5SW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdFF1ZXVlRmFtaWx5SW5kZXggPSBkc3RRdWV1ZUZhbWlseUluZGV4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJNZW1vcnlCYXJyaWVyICYgc2V0QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYnVmZmVyID0gYnVmZmVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJNZW1vcnlCYXJyaWVyICYgc2V0T2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9mZnNldCA9IG9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyTWVtb3J5QmFycmllciAmIHNldFNpemUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNpemUgPSBzaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQnVmZmVyTWVtb3J5QmFycmllciAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlck1lbW9yeUJhcnJpZXIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQnVmZmVyTWVtb3J5QmFycmllciBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3JjQWNjZXNzTWFzayA9PSByaHMuc3JjQWNjZXNzTWFzayApCisgICAgICAgICAgJiYgKCBkc3RBY2Nlc3NNYXNrID09IHJocy5kc3RBY2Nlc3NNYXNrICkKKyAgICAgICAgICAmJiAoIHNyY1F1ZXVlRmFtaWx5SW5kZXggPT0gcmhzLnNyY1F1ZXVlRmFtaWx5SW5kZXggKQorICAgICAgICAgICYmICggZHN0UXVldWVGYW1pbHlJbmRleCA9PSByaHMuZHN0UXVldWVGYW1pbHlJbmRleCApCisgICAgICAgICAgJiYgKCBidWZmZXIgPT0gcmhzLmJ1ZmZlciApCisgICAgICAgICAgJiYgKCBvZmZzZXQgPT0gcmhzLm9mZnNldCApCisgICAgICAgICAgJiYgKCBzaXplID09IHJocy5zaXplICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBCdWZmZXJNZW1vcnlCYXJyaWVyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUJ1ZmZlck1lbW9yeUJhcnJpZXI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBzcmNBY2Nlc3NNYXNrOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrOworICAgIHVpbnQzMl90IHNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgdWludDMyX3QgZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2l6ZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBCdWZmZXJNZW1vcnlCYXJyaWVyICkgPT0gc2l6ZW9mKCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QnVmZmVyTWVtb3J5QmFycmllcj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGJ1ZmZlciggYnVmZmVyXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiApIC0gb2Zmc2V0b2YoIEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoIFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzImIG9wZXJhdG9yPSggVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJiBzZXRCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXIgPSBidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlciA9PSByaHMuYnVmZmVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXI7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKSA9PSBzaXplb2YoIFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSKCB1aW50NjRfdCBvcGFxdWVDYXB0dXJlQWRkcmVzc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBvcGFxdWVDYXB0dXJlQWRkcmVzcyggb3BhcXVlQ2FwdHVyZUFkZHJlc3NfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSICkgLSBvZmZzZXRvZiggQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSKCBWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSICYgc2V0T3BhcXVlQ2FwdHVyZUFkZHJlc3MoIHVpbnQ2NF90IG9wYXF1ZUNhcHR1cmVBZGRyZXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBvcGFxdWVDYXB0dXJlQWRkcmVzcyA9IG9wYXF1ZUNhcHR1cmVBZGRyZXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG9wYXF1ZUNhcHR1cmVBZGRyZXNzID09IHJocy5vcGFxdWVDYXB0dXJlQWRkcmVzcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDY0X3Qgb3BhcXVlQ2FwdHVyZUFkZHJlc3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEJ1ZmZlclZpZXdDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBCdWZmZXJWaWV3Q3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXdDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlld0NyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdDo6ZVVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHJhbmdlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBidWZmZXIoIGJ1ZmZlcl8gKQorICAgICAgLCBmb3JtYXQoIGZvcm1hdF8gKQorICAgICAgLCBvZmZzZXQoIG9mZnNldF8gKQorICAgICAgLCByYW5nZSggcmFuZ2VfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXdDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlld0NyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXdDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggQnVmZmVyVmlld0NyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJWaWV3Q3JlYXRlSW5mbyggVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBCdWZmZXJWaWV3Q3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXdDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlclZpZXdDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJWaWV3Q3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlld0NyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCdWZmZXJWaWV3Q3JlYXRlSW5mbyAmIHNldEJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJ1ZmZlciA9IGJ1ZmZlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyVmlld0NyZWF0ZUluZm8gJiBzZXRGb3JtYXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmb3JtYXQgPSBmb3JtYXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1ZmZlclZpZXdDcmVhdGVJbmZvICYgc2V0T2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9mZnNldCA9IG9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQnVmZmVyVmlld0NyZWF0ZUluZm8gJiBzZXRSYW5nZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgcmFuZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJhbmdlID0gcmFuZ2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQnVmZmVyVmlld0NyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBidWZmZXIgPT0gcmhzLmJ1ZmZlciApCisgICAgICAgICAgJiYgKCBmb3JtYXQgPT0gcmhzLmZvcm1hdCApCisgICAgICAgICAgJiYgKCBvZmZzZXQgPT0gcmhzLm9mZnNldCApCisgICAgICAgICAgJiYgKCByYW5nZSA9PSByaHMucmFuZ2UgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEJ1ZmZlclZpZXdDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUJ1ZmZlclZpZXdDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlld0NyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSByYW5nZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBCdWZmZXJWaWV3Q3JlYXRlSW5mbyApID09IHNpemVvZiggVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxCdWZmZXJWaWV3Q3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VGltZURvbWFpbkVYVCB0aW1lRG9tYWluXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpUaW1lRG9tYWluRVhUOjplRGV2aWNlICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0aW1lRG9tYWluKCB0aW1lRG9tYWluXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCApIC0gb2Zmc2V0b2YoIENhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQoIFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQmIG9wZXJhdG9yPSggVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQgJiBzZXRUaW1lRG9tYWluKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VGltZURvbWFpbkVYVCB0aW1lRG9tYWluXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0aW1lRG9tYWluID0gdGltZURvbWFpbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdGltZURvbWFpbiA9PSByaHMudGltZURvbWFpbiApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpUaW1lRG9tYWluRVhUIHRpbWVEb21haW47CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQgKSA9PSBzaXplb2YoIFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8Q2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IENoZWNrcG9pbnREYXRhTlYKKyAgeworICAgIENoZWNrcG9pbnREYXRhTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ0JpdHMgc3RhZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVRvcE9mUGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQ2hlY2twb2ludE1hcmtlcl8gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdGFnZSggc3RhZ2VfICkKKyAgICAgICwgcENoZWNrcG9pbnRNYXJrZXIoIHBDaGVja3BvaW50TWFya2VyXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDaGVja3BvaW50RGF0YU5WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hlY2twb2ludERhdGFOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hlY2twb2ludERhdGFOViApIC0gb2Zmc2V0b2YoIENoZWNrcG9pbnREYXRhTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDaGVja3BvaW50RGF0YU5WKCBWa0NoZWNrcG9pbnREYXRhTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQ2hlY2twb2ludERhdGFOViYgb3BlcmF0b3I9KCBWa0NoZWNrcG9pbnREYXRhTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hlY2twb2ludERhdGFOViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NoZWNrcG9pbnREYXRhTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NoZWNrcG9pbnREYXRhTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ2hlY2twb2ludERhdGFOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0NoZWNrcG9pbnREYXRhTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ2hlY2twb2ludERhdGFOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3RhZ2UgPT0gcmhzLnN0YWdlICkKKyAgICAgICAgICAmJiAoIHBDaGVja3BvaW50TWFya2VyID09IHJocy5wQ2hlY2twb2ludE1hcmtlciApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQ2hlY2twb2ludERhdGFOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVDaGVja3BvaW50RGF0YU5WOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzIHN0YWdlOworICAgIHZvaWQqIHBDaGVja3BvaW50TWFya2VyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIENoZWNrcG9pbnREYXRhTlYgKSA9PSBzaXplb2YoIFZrQ2hlY2twb2ludERhdGFOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDaGVja3BvaW50RGF0YU5WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHVuaW9uIENsZWFyQ29sb3JWYWx1ZQorICB7CisgICAgQ2xlYXJDb2xvclZhbHVlKCBjb25zdCBzdGQ6OmFycmF5PGZsb2F0LDQ+JiBmbG9hdDMyXyA9IHsgeyAwIH0gfSApCisgICAgeworICAgICAgbWVtY3B5KCBmbG9hdDMyLCBmbG9hdDMyXy5kYXRhKCksIDQgKiBzaXplb2YoIGZsb2F0ICkgKTsKKyAgICB9CisKKyAgICBDbGVhckNvbG9yVmFsdWUoIGNvbnN0IHN0ZDo6YXJyYXk8aW50MzJfdCw0PiYgaW50MzJfICkKKyAgICB7CisgICAgICBtZW1jcHkoIGludDMyLCBpbnQzMl8uZGF0YSgpLCA0ICogc2l6ZW9mKCBpbnQzMl90ICkgKTsKKyAgICB9CisKKyAgICBDbGVhckNvbG9yVmFsdWUoIGNvbnN0IHN0ZDo6YXJyYXk8dWludDMyX3QsND4mIHVpbnQzMl8gKQorICAgIHsKKyAgICAgIG1lbWNweSggdWludDMyLCB1aW50MzJfLmRhdGEoKSwgNCAqIHNpemVvZiggdWludDMyX3QgKSApOworICAgIH0KKworICAgIENsZWFyQ29sb3JWYWx1ZSAmIHNldEZsb2F0MzIoIHN0ZDo6YXJyYXk8ZmxvYXQsND4gZmxvYXQzMl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCBmbG9hdDMyLCBmbG9hdDMyXy5kYXRhKCksIDQgKiBzaXplb2YoIGZsb2F0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbGVhckNvbG9yVmFsdWUgJiBzZXRJbnQzMiggc3RkOjphcnJheTxpbnQzMl90LDQ+IGludDMyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoIGludDMyLCBpbnQzMl8uZGF0YSgpLCA0ICogc2l6ZW9mKCBpbnQzMl90ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbGVhckNvbG9yVmFsdWUgJiBzZXRVaW50MzIoIHN0ZDo6YXJyYXk8dWludDMyX3QsND4gdWludDMyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoIHVpbnQzMiwgdWludDMyXy5kYXRhKCksIDQgKiBzaXplb2YoIHVpbnQzMl90ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgb3BlcmF0b3IgVmtDbGVhckNvbG9yVmFsdWUgY29uc3QmKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDbGVhckNvbG9yVmFsdWUqPih0aGlzKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NsZWFyQ29sb3JWYWx1ZSAmKCkKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtDbGVhckNvbG9yVmFsdWUqPih0aGlzKTsKKyAgICB9CisKKyAgICBmbG9hdCBmbG9hdDMyWzRdOworICAgIGludDMyX3QgaW50MzJbNF07CisgICAgdWludDMyX3QgdWludDMyWzRdOworICB9OworCisgIHN0cnVjdCBDbGVhckRlcHRoU3RlbmNpbFZhbHVlCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDbGVhckRlcHRoU3RlbmNpbFZhbHVlKCBmbG9hdCBkZXB0aF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0ZW5jaWxfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGVwdGgoIGRlcHRoXyApCisgICAgICAsIHN0ZW5jaWwoIHN0ZW5jaWxfICkKKyAgICB7fQorCisgICAgQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSggVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIENsZWFyRGVwdGhTdGVuY2lsVmFsdWUmIG9wZXJhdG9yPSggVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyRGVwdGhTdGVuY2lsVmFsdWUgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSAmIHNldERlcHRoKCBmbG9hdCBkZXB0aF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGggPSBkZXB0aF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSAmIHNldFN0ZW5jaWwoIHVpbnQzMl90IHN0ZW5jaWxfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0ZW5jaWwgPSBzdGVuY2lsXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGRlcHRoID09IHJocy5kZXB0aCApCisgICAgICAgICAgJiYgKCBzdGVuY2lsID09IHJocy5zdGVuY2lsICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGZsb2F0IGRlcHRoOworICAgIHVpbnQzMl90IHN0ZW5jaWw7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSApID09IHNpemVvZiggVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PENsZWFyRGVwdGhTdGVuY2lsVmFsdWU+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgdW5pb24gQ2xlYXJWYWx1ZQorICB7CisgICAgQ2xlYXJWYWx1ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyQ29sb3JWYWx1ZSBjb2xvcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJDb2xvclZhbHVlKCkgKQorICAgIHsKKyAgICAgIGNvbG9yID0gY29sb3JfOworICAgIH0KKworICAgIENsZWFyVmFsdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGRlcHRoU3RlbmNpbF8gKQorICAgIHsKKyAgICAgIGRlcHRoU3RlbmNpbCA9IGRlcHRoU3RlbmNpbF87CisgICAgfQorCisgICAgQ2xlYXJWYWx1ZSAmIHNldENvbG9yKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJDb2xvclZhbHVlIGNvbG9yXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb2xvciA9IGNvbG9yXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbGVhclZhbHVlICYgc2V0RGVwdGhTdGVuY2lsKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSBkZXB0aFN0ZW5jaWxfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlcHRoU3RlbmNpbCA9IGRlcHRoU3RlbmNpbF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIG9wZXJhdG9yIFZrQ2xlYXJWYWx1ZSBjb25zdCYoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NsZWFyVmFsdWUqPih0aGlzKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NsZWFyVmFsdWUgJigpCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQ2xlYXJWYWx1ZSo+KHRoaXMpOworICAgIH0KKworI2lmZGVmIFZVTEtBTl9IUFBfSEFTX1VOUkVTVFJJQ1RFRF9VTklPTlMKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJDb2xvclZhbHVlIGNvbG9yOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGRlcHRoU3RlbmNpbDsKKyNlbHNlCisgICAgVmtDbGVhckNvbG9yVmFsdWUgY29sb3I7CisgICAgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGRlcHRoU3RlbmNpbDsKKyNlbmRpZiAgLypWVUxLQU5fSFBQX0hBU19VTlJFU1RSSUNURURfVU5JT05TKi8KKyAgfTsKKworICBzdHJ1Y3QgQ2xlYXJBdHRhY2htZW50CisgIHsKKyAgICBDbGVhckF0dGFjaG1lbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2tfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yQXR0YWNobWVudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyVmFsdWUgY2xlYXJWYWx1ZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJWYWx1ZSgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhc3BlY3RNYXNrKCBhc3BlY3RNYXNrXyApCisgICAgICAsIGNvbG9yQXR0YWNobWVudCggY29sb3JBdHRhY2htZW50XyApCisgICAgICAsIGNsZWFyVmFsdWUoIGNsZWFyVmFsdWVfICkKKyAgICB7fQorCisgICAgQ2xlYXJBdHRhY2htZW50KCBWa0NsZWFyQXR0YWNobWVudCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBDbGVhckF0dGFjaG1lbnQmIG9wZXJhdG9yPSggVmtDbGVhckF0dGFjaG1lbnQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJBdHRhY2htZW50IGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENsZWFyQXR0YWNobWVudCAmIHNldEFzcGVjdE1hc2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFzcGVjdE1hc2sgPSBhc3BlY3RNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbGVhckF0dGFjaG1lbnQgJiBzZXRDb2xvckF0dGFjaG1lbnQoIHVpbnQzMl90IGNvbG9yQXR0YWNobWVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29sb3JBdHRhY2htZW50ID0gY29sb3JBdHRhY2htZW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbGVhckF0dGFjaG1lbnQgJiBzZXRDbGVhclZhbHVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJWYWx1ZSBjbGVhclZhbHVlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjbGVhclZhbHVlID0gY2xlYXJWYWx1ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDbGVhckF0dGFjaG1lbnQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NsZWFyQXR0YWNobWVudCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDbGVhckF0dGFjaG1lbnQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtDbGVhckF0dGFjaG1lbnQqPiggdGhpcyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFzazsKKyAgICB1aW50MzJfdCBjb2xvckF0dGFjaG1lbnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyVmFsdWUgY2xlYXJWYWx1ZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBDbGVhckF0dGFjaG1lbnQgKSA9PSBzaXplb2YoIFZrQ2xlYXJBdHRhY2htZW50ICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PENsZWFyQXR0YWNobWVudD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQ2xlYXJSZWN0CisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDbGVhclJlY3QoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQgcmVjdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXNlQXJyYXlMYXllcl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJDb3VudF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiByZWN0KCByZWN0XyApCisgICAgICAsIGJhc2VBcnJheUxheWVyKCBiYXNlQXJyYXlMYXllcl8gKQorICAgICAgLCBsYXllckNvdW50KCBsYXllckNvdW50XyApCisgICAge30KKworICAgIENsZWFyUmVjdCggVmtDbGVhclJlY3QgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQ2xlYXJSZWN0JiBvcGVyYXRvcj0oIFZrQ2xlYXJSZWN0IGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyUmVjdCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbGVhclJlY3QgJiBzZXRSZWN0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEIHJlY3RfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJlY3QgPSByZWN0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbGVhclJlY3QgJiBzZXRCYXNlQXJyYXlMYXllciggdWludDMyX3QgYmFzZUFycmF5TGF5ZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJhc2VBcnJheUxheWVyID0gYmFzZUFycmF5TGF5ZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENsZWFyUmVjdCAmIHNldExheWVyQ291bnQoIHVpbnQzMl90IGxheWVyQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxheWVyQ291bnQgPSBsYXllckNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NsZWFyUmVjdCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ2xlYXJSZWN0Kj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NsZWFyUmVjdCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0NsZWFyUmVjdCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBDbGVhclJlY3QgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCByZWN0ID09IHJocy5yZWN0ICkKKyAgICAgICAgICAmJiAoIGJhc2VBcnJheUxheWVyID09IHJocy5iYXNlQXJyYXlMYXllciApCisgICAgICAgICAgJiYgKCBsYXllckNvdW50ID09IHJocy5sYXllckNvdW50ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBDbGVhclJlY3QgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCByZWN0OworICAgIHVpbnQzMl90IGJhc2VBcnJheUxheWVyOworICAgIHVpbnQzMl90IGxheWVyQ291bnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ2xlYXJSZWN0ICkgPT0gc2l6ZW9mKCBWa0NsZWFyUmVjdCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDbGVhclJlY3Q+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEluZGlyZWN0Q29tbWFuZHNUb2tlbk5WWAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCB0b2tlblR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlg6OmVQaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0b2tlblR5cGUoIHRva2VuVHlwZV8gKQorICAgICAgLCBidWZmZXIoIGJ1ZmZlcl8gKQorICAgICAgLCBvZmZzZXQoIG9mZnNldF8gKQorICAgIHt9CisKKyAgICBJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlgoIFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEluZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCYgb3BlcmF0b3I9KCBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlggY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYICYgc2V0VG9rZW5UeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCB0b2tlblR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRva2VuVHlwZSA9IHRva2VuVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYICYgc2V0QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYnVmZmVyID0gYnVmZmVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlggJiBzZXRPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2Zmc2V0ID0gb2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCB0b2tlblR5cGUgPT0gcmhzLnRva2VuVHlwZSApCisgICAgICAgICAgJiYgKCBidWZmZXIgPT0gcmhzLmJ1ZmZlciApCisgICAgICAgICAgJiYgKCBvZmZzZXQgPT0gcmhzLm9mZnNldCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYIHRva2VuVHlwZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYICkgPT0gc2l6ZW9mKCBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlg+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVOVlgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYKiBwSW5kaXJlY3RDb21tYW5kc1Rva2Vuc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFNlcXVlbmNlc0NvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXIgdGFyZ2V0Q29tbWFuZEJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgc2VxdWVuY2VzQ291bnRCdWZmZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNlcXVlbmNlc0NvdW50T2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBzZXF1ZW5jZXNJbmRleEJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2VxdWVuY2VzSW5kZXhPZmZzZXRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogb2JqZWN0VGFibGUoIG9iamVjdFRhYmxlXyApCisgICAgICAsIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQoIGluZGlyZWN0Q29tbWFuZHNMYXlvdXRfICkKKyAgICAgICwgaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQoIGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50XyApCisgICAgICAsIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zKCBwSW5kaXJlY3RDb21tYW5kc1Rva2Vuc18gKQorICAgICAgLCBtYXhTZXF1ZW5jZXNDb3VudCggbWF4U2VxdWVuY2VzQ291bnRfICkKKyAgICAgICwgdGFyZ2V0Q29tbWFuZEJ1ZmZlciggdGFyZ2V0Q29tbWFuZEJ1ZmZlcl8gKQorICAgICAgLCBzZXF1ZW5jZXNDb3VudEJ1ZmZlciggc2VxdWVuY2VzQ291bnRCdWZmZXJfICkKKyAgICAgICwgc2VxdWVuY2VzQ291bnRPZmZzZXQoIHNlcXVlbmNlc0NvdW50T2Zmc2V0XyApCisgICAgICAsIHNlcXVlbmNlc0luZGV4QnVmZmVyKCBzZXF1ZW5jZXNJbmRleEJ1ZmZlcl8gKQorICAgICAgLCBzZXF1ZW5jZXNJbmRleE9mZnNldCggc2VxdWVuY2VzSW5kZXhPZmZzZXRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICkgLSBvZmZzZXRvZiggQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgoIFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYJiBvcGVyYXRvcj0oIFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggJiBzZXRPYmplY3RUYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBvYmplY3RUYWJsZSA9IG9iamVjdFRhYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICYgc2V0SW5kaXJlY3RDb21tYW5kc0xheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaW5kaXJlY3RDb21tYW5kc0xheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCA9IGluZGlyZWN0Q29tbWFuZHNMYXlvdXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggJiBzZXRJbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudCggdWludDMyX3QgaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50ID0gaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggJiBzZXRQSW5kaXJlY3RDb21tYW5kc1Rva2VucyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCogcEluZGlyZWN0Q29tbWFuZHNUb2tlbnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zID0gcEluZGlyZWN0Q29tbWFuZHNUb2tlbnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggJiBzZXRNYXhTZXF1ZW5jZXNDb3VudCggdWludDMyX3QgbWF4U2VxdWVuY2VzQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1heFNlcXVlbmNlc0NvdW50ID0gbWF4U2VxdWVuY2VzQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggJiBzZXRUYXJnZXRDb21tYW5kQnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlciB0YXJnZXRDb21tYW5kQnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0YXJnZXRDb21tYW5kQnVmZmVyID0gdGFyZ2V0Q29tbWFuZEJ1ZmZlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCAmIHNldFNlcXVlbmNlc0NvdW50QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHNlcXVlbmNlc0NvdW50QnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzZXF1ZW5jZXNDb3VudEJ1ZmZlciA9IHNlcXVlbmNlc0NvdW50QnVmZmVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICYgc2V0U2VxdWVuY2VzQ291bnRPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNlcXVlbmNlc0NvdW50T2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzZXF1ZW5jZXNDb3VudE9mZnNldCA9IHNlcXVlbmNlc0NvdW50T2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICYgc2V0U2VxdWVuY2VzSW5kZXhCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgc2VxdWVuY2VzSW5kZXhCdWZmZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNlcXVlbmNlc0luZGV4QnVmZmVyID0gc2VxdWVuY2VzSW5kZXhCdWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggJiBzZXRTZXF1ZW5jZXNJbmRleE9mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2VxdWVuY2VzSW5kZXhPZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNlcXVlbmNlc0luZGV4T2Zmc2V0ID0gc2VxdWVuY2VzSW5kZXhPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBvYmplY3RUYWJsZSA9PSByaHMub2JqZWN0VGFibGUgKQorICAgICAgICAgICYmICggaW5kaXJlY3RDb21tYW5kc0xheW91dCA9PSByaHMuaW5kaXJlY3RDb21tYW5kc0xheW91dCApCisgICAgICAgICAgJiYgKCBpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudCA9PSByaHMuaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQgKQorICAgICAgICAgICYmICggcEluZGlyZWN0Q29tbWFuZHNUb2tlbnMgPT0gcmhzLnBJbmRpcmVjdENvbW1hbmRzVG9rZW5zICkKKyAgICAgICAgICAmJiAoIG1heFNlcXVlbmNlc0NvdW50ID09IHJocy5tYXhTZXF1ZW5jZXNDb3VudCApCisgICAgICAgICAgJiYgKCB0YXJnZXRDb21tYW5kQnVmZmVyID09IHJocy50YXJnZXRDb21tYW5kQnVmZmVyICkKKyAgICAgICAgICAmJiAoIHNlcXVlbmNlc0NvdW50QnVmZmVyID09IHJocy5zZXF1ZW5jZXNDb3VudEJ1ZmZlciApCisgICAgICAgICAgJiYgKCBzZXF1ZW5jZXNDb3VudE9mZnNldCA9PSByaHMuc2VxdWVuY2VzQ291bnRPZmZzZXQgKQorICAgICAgICAgICYmICggc2VxdWVuY2VzSW5kZXhCdWZmZXIgPT0gcmhzLnNlcXVlbmNlc0luZGV4QnVmZmVyICkKKyAgICAgICAgICAmJiAoIHNlcXVlbmNlc0luZGV4T2Zmc2V0ID09IHJocy5zZXF1ZW5jZXNJbmRleE9mZnNldCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaW5kaXJlY3RDb21tYW5kc0xheW91dDsKKyAgICB1aW50MzJfdCBpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYKiBwSW5kaXJlY3RDb21tYW5kc1Rva2VuczsKKyAgICB1aW50MzJfdCBtYXhTZXF1ZW5jZXNDb3VudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlciB0YXJnZXRDb21tYW5kQnVmZmVyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgc2VxdWVuY2VzQ291bnRCdWZmZXI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2VxdWVuY2VzQ291bnRPZmZzZXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBzZXF1ZW5jZXNJbmRleEJ1ZmZlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzZXF1ZW5jZXNJbmRleE9mZnNldDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICkgPT0gc2l6ZW9mKCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8Q21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVOVlgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGluZGlyZWN0Q29tbWFuZHNMYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFNlcXVlbmNlc0NvdW50XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG9iamVjdFRhYmxlKCBvYmplY3RUYWJsZV8gKQorICAgICAgLCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0KCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0XyApCisgICAgICAsIG1heFNlcXVlbmNlc0NvdW50KCBtYXhTZXF1ZW5jZXNDb3VudF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggKSAtIG9mZnNldG9mKCBDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgoIFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIENtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCYgb3BlcmF0b3I9KCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggJiBzZXRPYmplY3RUYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBvYmplY3RUYWJsZSA9IG9iamVjdFRhYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggJiBzZXRJbmRpcmVjdENvbW1hbmRzTGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbmRpcmVjdENvbW1hbmRzTGF5b3V0ID0gaW5kaXJlY3RDb21tYW5kc0xheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYICYgc2V0TWF4U2VxdWVuY2VzQ291bnQoIHVpbnQzMl90IG1heFNlcXVlbmNlc0NvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXhTZXF1ZW5jZXNDb3VudCA9IG1heFNlcXVlbmNlc0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG9iamVjdFRhYmxlID09IHJocy5vYmplY3RUYWJsZSApCisgICAgICAgICAgJiYgKCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0ID09IHJocy5pbmRpcmVjdENvbW1hbmRzTGF5b3V0ICkKKyAgICAgICAgICAmJiAoIG1heFNlcXVlbmNlc0NvdW50ID09IHJocy5tYXhTZXF1ZW5jZXNDb3VudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUNtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQ7CisgICAgdWludDMyX3QgbWF4U2VxdWVuY2VzQ291bnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYICkgPT0gc2l6ZW9mKCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlg+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IENvYXJzZVNhbXBsZUxvY2F0aW9uTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvYXJzZVNhbXBsZUxvY2F0aW9uTlYoIHVpbnQzMl90IHBpeGVsWF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpeGVsWV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwaXhlbFgoIHBpeGVsWF8gKQorICAgICAgLCBwaXhlbFkoIHBpeGVsWV8gKQorICAgICAgLCBzYW1wbGUoIHNhbXBsZV8gKQorICAgIHt9CisKKyAgICBDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WKCBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQ29hcnNlU2FtcGxlTG9jYXRpb25OViYgb3BlcmF0b3I9KCBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29hcnNlU2FtcGxlTG9jYXRpb25OViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WICYgc2V0UGl4ZWxYKCB1aW50MzJfdCBwaXhlbFhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBpeGVsWCA9IHBpeGVsWF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29hcnNlU2FtcGxlTG9jYXRpb25OViAmIHNldFBpeGVsWSggdWludDMyX3QgcGl4ZWxZXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwaXhlbFkgPSBwaXhlbFlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvYXJzZVNhbXBsZUxvY2F0aW9uTlYgJiBzZXRTYW1wbGUoIHVpbnQzMl90IHNhbXBsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlID0gc2FtcGxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29hcnNlU2FtcGxlTG9jYXRpb25OViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ29hcnNlU2FtcGxlTG9jYXRpb25OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHBpeGVsWCA9PSByaHMucGl4ZWxYICkKKyAgICAgICAgICAmJiAoIHBpeGVsWSA9PSByaHMucGl4ZWxZICkKKyAgICAgICAgICAmJiAoIHNhbXBsZSA9PSByaHMuc2FtcGxlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IHBpeGVsWDsKKyAgICB1aW50MzJfdCBwaXhlbFk7CisgICAgdWludDMyX3Qgc2FtcGxlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIENvYXJzZVNhbXBsZUxvY2F0aW9uTlYgKSA9PSBzaXplb2YoIFZrQ29hcnNlU2FtcGxlTG9jYXRpb25OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViBzaGFkaW5nUmF0ZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjo6ZU5vSW52b2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVMb2NhdGlvbkNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZUxvY2F0aW9uTlYqIHBTYW1wbGVMb2NhdGlvbnNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhZGluZ1JhdGUoIHNoYWRpbmdSYXRlXyApCisgICAgICAsIHNhbXBsZUNvdW50KCBzYW1wbGVDb3VudF8gKQorICAgICAgLCBzYW1wbGVMb2NhdGlvbkNvdW50KCBzYW1wbGVMb2NhdGlvbkNvdW50XyApCisgICAgICAsIHBTYW1wbGVMb2NhdGlvbnMoIHBTYW1wbGVMb2NhdGlvbnNfICkKKyAgICB7fQorCisgICAgQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViggVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIENvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYmIG9wZXJhdG9yPSggVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViAmIHNldFNoYWRpbmdSYXRlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViBzaGFkaW5nUmF0ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGluZ1JhdGUgPSBzaGFkaW5nUmF0ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViAmIHNldFNhbXBsZUNvdW50KCB1aW50MzJfdCBzYW1wbGVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViAmIHNldFNhbXBsZUxvY2F0aW9uQ291bnQoIHVpbnQzMl90IHNhbXBsZUxvY2F0aW9uQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNhbXBsZUxvY2F0aW9uQ291bnQgPSBzYW1wbGVMb2NhdGlvbkNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WICYgc2V0UFNhbXBsZUxvY2F0aW9ucyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZUxvY2F0aW9uTlYqIHBTYW1wbGVMb2NhdGlvbnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBTYW1wbGVMb2NhdGlvbnMgPSBwU2FtcGxlTG9jYXRpb25zXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNoYWRpbmdSYXRlID09IHJocy5zaGFkaW5nUmF0ZSApCisgICAgICAgICAgJiYgKCBzYW1wbGVDb3VudCA9PSByaHMuc2FtcGxlQ291bnQgKQorICAgICAgICAgICYmICggc2FtcGxlTG9jYXRpb25Db3VudCA9PSByaHMuc2FtcGxlTG9jYXRpb25Db3VudCApCisgICAgICAgICAgJiYgKCBwU2FtcGxlTG9jYXRpb25zID09IHJocy5wU2FtcGxlTG9jYXRpb25zICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WIHNoYWRpbmdSYXRlOworICAgIHVpbnQzMl90IHNhbXBsZUNvdW50OworICAgIHVpbnQzMl90IHNhbXBsZUxvY2F0aW9uQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZUxvY2F0aW9uTlYqIHBTYW1wbGVMb2NhdGlvbnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViApID09IHNpemVvZiggVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PENvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckxldmVsIGxldmVsXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyTGV2ZWw6OmVQcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBjb21tYW5kUG9vbCggY29tbWFuZFBvb2xfICkKKyAgICAgICwgbGV2ZWwoIGxldmVsXyApCisgICAgICAsIGNvbW1hbmRCdWZmZXJDb3VudCggY29tbWFuZEJ1ZmZlckNvdW50XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyApIC0gb2Zmc2V0b2YoIENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICYgc2V0Q29tbWFuZFBvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29tbWFuZFBvb2wgPSBjb21tYW5kUG9vbF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAmIHNldExldmVsKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckxldmVsIGxldmVsXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBsZXZlbCA9IGxldmVsXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICYgc2V0Q29tbWFuZEJ1ZmZlckNvdW50KCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCA9IGNvbW1hbmRCdWZmZXJDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGNvbW1hbmRQb29sID09IHJocy5jb21tYW5kUG9vbCApCisgICAgICAgICAgJiYgKCBsZXZlbCA9PSByaHMubGV2ZWwgKQorICAgICAgICAgICYmICggY29tbWFuZEJ1ZmZlckNvdW50ID09IHJocy5jb21tYW5kQnVmZmVyQ291bnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyTGV2ZWwgbGV2ZWw7CisgICAgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gKSA9PSBzaXplb2YoIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VicGFzc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG9jY2x1c2lvblF1ZXJ5RW5hYmxlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5Q29udHJvbEZsYWdzIHF1ZXJ5RmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5Q29udHJvbEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyBwaXBlbGluZVN0YXRpc3RpY3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiByZW5kZXJQYXNzKCByZW5kZXJQYXNzXyApCisgICAgICAsIHN1YnBhc3MoIHN1YnBhc3NfICkKKyAgICAgICwgZnJhbWVidWZmZXIoIGZyYW1lYnVmZmVyXyApCisgICAgICAsIG9jY2x1c2lvblF1ZXJ5RW5hYmxlKCBvY2NsdXNpb25RdWVyeUVuYWJsZV8gKQorICAgICAgLCBxdWVyeUZsYWdzKCBxdWVyeUZsYWdzXyApCisgICAgICAsIHBpcGVsaW5lU3RhdGlzdGljcyggcGlwZWxpbmVTdGF0aXN0aWNzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyApIC0gb2Zmc2V0b2YoIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKCBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyYgb3BlcmF0b3I9KCBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvICYgc2V0UmVuZGVyUGFzcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MgcmVuZGVyUGFzc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVuZGVyUGFzcyA9IHJlbmRlclBhc3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gJiBzZXRTdWJwYXNzKCB1aW50MzJfdCBzdWJwYXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdWJwYXNzID0gc3VicGFzc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyAmIHNldEZyYW1lYnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXIgZnJhbWVidWZmZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gJiBzZXRPY2NsdXNpb25RdWVyeUVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBvY2NsdXNpb25RdWVyeUVuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2NjbHVzaW9uUXVlcnlFbmFibGUgPSBvY2NsdXNpb25RdWVyeUVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyAmIHNldFF1ZXJ5RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeUNvbnRyb2xGbGFncyBxdWVyeUZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBxdWVyeUZsYWdzID0gcXVlcnlGbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyAmIHNldFBpcGVsaW5lU3RhdGlzdGljcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyBwaXBlbGluZVN0YXRpc3RpY3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBpcGVsaW5lU3RhdGlzdGljcyA9IHBpcGVsaW5lU3RhdGlzdGljc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHJlbmRlclBhc3MgPT0gcmhzLnJlbmRlclBhc3MgKQorICAgICAgICAgICYmICggc3VicGFzcyA9PSByaHMuc3VicGFzcyApCisgICAgICAgICAgJiYgKCBmcmFtZWJ1ZmZlciA9PSByaHMuZnJhbWVidWZmZXIgKQorICAgICAgICAgICYmICggb2NjbHVzaW9uUXVlcnlFbmFibGUgPT0gcmhzLm9jY2x1c2lvblF1ZXJ5RW5hYmxlICkKKyAgICAgICAgICAmJiAoIHF1ZXJ5RmxhZ3MgPT0gcmhzLnF1ZXJ5RmxhZ3MgKQorICAgICAgICAgICYmICggcGlwZWxpbmVTdGF0aXN0aWNzID09IHJocy5waXBlbGluZVN0YXRpc3RpY3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICB1aW50MzJfdCBzdWJwYXNzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG9jY2x1c2lvblF1ZXJ5RW5hYmxlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeUNvbnRyb2xGbGFncyBxdWVyeUZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3MgcGlwZWxpbmVTdGF0aXN0aWNzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gKSA9PSBzaXplb2YoIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBDb21tYW5kQnVmZmVyQmVnaW5JbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21tYW5kQnVmZmVyQmVnaW5JbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlclVzYWdlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJVc2FnZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8qIHBJbmhlcml0YW5jZUluZm9fID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHBJbmhlcml0YW5jZUluZm8oIHBJbmhlcml0YW5jZUluZm9fICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJCZWdpbkluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyQmVnaW5JbmZvICkgLSBvZmZzZXRvZiggQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbW1hbmRCdWZmZXJCZWdpbkluZm8oIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBvcGVyYXRvcj0oIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbW1hbmRCdWZmZXJCZWdpbkluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbW1hbmRCdWZmZXJCZWdpbkluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJVc2FnZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVyQmVnaW5JbmZvICYgc2V0UEluaGVyaXRhbmNlSW5mbyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8qIHBJbmhlcml0YW5jZUluZm9fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBJbmhlcml0YW5jZUluZm8gPSBwSW5oZXJpdGFuY2VJbmZvXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHBJbmhlcml0YW5jZUluZm8gPT0gcmhzLnBJbmhlcml0YW5jZUluZm8gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIENvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJVc2FnZUZsYWdzIGZsYWdzOworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKiBwSW5oZXJpdGFuY2VJbmZvOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIENvbW1hbmRCdWZmZXJCZWdpbkluZm8gKSA9PSBzaXplb2YoIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDb21tYW5kQnVmZmVyQmVnaW5JbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBjb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZSggY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUICkgLSBvZmZzZXRvZiggQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUKCBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQmIG9wZXJhdG9yPSggVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUICYgc2V0Q29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlID0gY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGUgPT0gcmhzLmNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCApID09IHNpemVvZiggVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8Q29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBDb21tYW5kUG9vbENyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvbW1hbmRQb29sQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXhfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHF1ZXVlRmFtaWx5SW5kZXgoIHF1ZXVlRmFtaWx5SW5kZXhfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2xDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggQ29tbWFuZFBvb2xDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tbWFuZFBvb2xDcmVhdGVJbmZvKCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBDb21tYW5kUG9vbENyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2xDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbW1hbmRQb29sQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tbWFuZFBvb2xDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbENyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21tYW5kUG9vbENyZWF0ZUluZm8gJiBzZXRRdWV1ZUZhbWlseUluZGV4KCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBxdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kUG9vbENyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ29tbWFuZFBvb2xDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggcXVldWVGYW1pbHlJbmRleCA9PSByaHMucXVldWVGYW1pbHlJbmRleCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQ29tbWFuZFBvb2xDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUNvbW1hbmRQb29sQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBDb21tYW5kUG9vbENyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PENvbW1hbmRQb29sQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3BlY2lhbGl6YXRpb25NYXBFbnRyeQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3BlY2lhbGl6YXRpb25NYXBFbnRyeSggdWludDMyX3QgY29uc3RhbnRJRF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGNvbnN0YW50SUQoIGNvbnN0YW50SURfICkKKyAgICAgICwgb2Zmc2V0KCBvZmZzZXRfICkKKyAgICAgICwgc2l6ZSggc2l6ZV8gKQorICAgIHt9CisKKyAgICBTcGVjaWFsaXphdGlvbk1hcEVudHJ5KCBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3BlY2lhbGl6YXRpb25NYXBFbnRyeSYgb3BlcmF0b3I9KCBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BlY2lhbGl6YXRpb25NYXBFbnRyeSBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGVjaWFsaXphdGlvbk1hcEVudHJ5ICYgc2V0Q29uc3RhbnRJRCggdWludDMyX3QgY29uc3RhbnRJRF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29uc3RhbnRJRCA9IGNvbnN0YW50SURfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNwZWNpYWxpemF0aW9uTWFwRW50cnkgJiBzZXRPZmZzZXQoIHVpbnQzMl90IG9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2Zmc2V0ID0gb2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGVjaWFsaXphdGlvbk1hcEVudHJ5ICYgc2V0U2l6ZSggc2l6ZV90IHNpemVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNpemUgPSBzaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3BlY2lhbGl6YXRpb25NYXBFbnRyeSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGNvbnN0YW50SUQgPT0gcmhzLmNvbnN0YW50SUQgKQorICAgICAgICAgICYmICggb2Zmc2V0ID09IHJocy5vZmZzZXQgKQorICAgICAgICAgICYmICggc2l6ZSA9PSByaHMuc2l6ZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3BlY2lhbGl6YXRpb25NYXBFbnRyeSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50MzJfdCBjb25zdGFudElEOworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTcGVjaWFsaXphdGlvbk1hcEVudHJ5ICkgPT0gc2l6ZW9mKCBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3BlY2lhbGl6YXRpb25NYXBFbnRyeT46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3BlY2lhbGl6YXRpb25JbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTcGVjaWFsaXphdGlvbkluZm8oIHVpbnQzMl90IG1hcEVudHJ5Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGVjaWFsaXphdGlvbk1hcEVudHJ5KiBwTWFwRW50cmllc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFTaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwRGF0YV8gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXBFbnRyeUNvdW50KCBtYXBFbnRyeUNvdW50XyApCisgICAgICAsIHBNYXBFbnRyaWVzKCBwTWFwRW50cmllc18gKQorICAgICAgLCBkYXRhU2l6ZSggZGF0YVNpemVfICkKKyAgICAgICwgcERhdGEoIHBEYXRhXyApCisgICAge30KKworICAgIFNwZWNpYWxpemF0aW9uSW5mbyggVmtTcGVjaWFsaXphdGlvbkluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3BlY2lhbGl6YXRpb25JbmZvJiBvcGVyYXRvcj0oIFZrU3BlY2lhbGl6YXRpb25JbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwZWNpYWxpemF0aW9uSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGVjaWFsaXphdGlvbkluZm8gJiBzZXRNYXBFbnRyeUNvdW50KCB1aW50MzJfdCBtYXBFbnRyeUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXBFbnRyeUNvdW50ID0gbWFwRW50cnlDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BlY2lhbGl6YXRpb25JbmZvICYgc2V0UE1hcEVudHJpZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGVjaWFsaXphdGlvbk1hcEVudHJ5KiBwTWFwRW50cmllc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE1hcEVudHJpZXMgPSBwTWFwRW50cmllc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BlY2lhbGl6YXRpb25JbmZvICYgc2V0RGF0YVNpemUoIHNpemVfdCBkYXRhU2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGF0YVNpemUgPSBkYXRhU2l6ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BlY2lhbGl6YXRpb25JbmZvICYgc2V0UERhdGEoIGNvbnN0IHZvaWQqIHBEYXRhXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRGF0YSA9IHBEYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwZWNpYWxpemF0aW9uSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3BlY2lhbGl6YXRpb25JbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwZWNpYWxpemF0aW9uSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NwZWNpYWxpemF0aW9uSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTcGVjaWFsaXphdGlvbkluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBtYXBFbnRyeUNvdW50ID09IHJocy5tYXBFbnRyeUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBNYXBFbnRyaWVzID09IHJocy5wTWFwRW50cmllcyApCisgICAgICAgICAgJiYgKCBkYXRhU2l6ZSA9PSByaHMuZGF0YVNpemUgKQorICAgICAgICAgICYmICggcERhdGEgPT0gcmhzLnBEYXRhICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTcGVjaWFsaXphdGlvbkluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3QgbWFwRW50cnlDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BlY2lhbGl6YXRpb25NYXBFbnRyeSogcE1hcEVudHJpZXM7CisgICAgc2l6ZV90IGRhdGFTaXplOworICAgIGNvbnN0IHZvaWQqIHBEYXRhOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNwZWNpYWxpemF0aW9uSW5mbyApID09IHNpemVvZiggVmtTcGVjaWFsaXphdGlvbkluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3BlY2lhbGl6YXRpb25JbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFnQml0czo6ZVZlcnRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZSBtb2R1bGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwTmFtZV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BlY2lhbGl6YXRpb25JbmZvKiBwU3BlY2lhbGl6YXRpb25JbmZvXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBzdGFnZSggc3RhZ2VfICkKKyAgICAgICwgbW9kdWxlKCBtb2R1bGVfICkKKyAgICAgICwgcE5hbWUoIHBOYW1lXyApCisgICAgICAsIHBTcGVjaWFsaXphdGlvbkluZm8oIHBTcGVjaWFsaXphdGlvbkluZm9fICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyggVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAmIHNldFN0YWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhZ2UgPSBzdGFnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gJiBzZXRNb2R1bGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGUgbW9kdWxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtb2R1bGUgPSBtb2R1bGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICYgc2V0UE5hbWUoIGNvbnN0IGNoYXIqIHBOYW1lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmFtZSA9IHBOYW1lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAmIHNldFBTcGVjaWFsaXphdGlvbkluZm8oIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGVjaWFsaXphdGlvbkluZm8qIHBTcGVjaWFsaXphdGlvbkluZm9fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBTcGVjaWFsaXphdGlvbkluZm8gPSBwU3BlY2lhbGl6YXRpb25JbmZvXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggc3RhZ2UgPT0gcmhzLnN0YWdlICkKKyAgICAgICAgICAmJiAoIG1vZHVsZSA9PSByaHMubW9kdWxlICkKKyAgICAgICAgICAmJiAoIHBOYW1lID09IHJocy5wTmFtZSApCisgICAgICAgICAgJiYgKCBwU3BlY2lhbGl6YXRpb25JbmZvID09IHJocy5wU3BlY2lhbGl6YXRpb25JbmZvICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlIG1vZHVsZTsKKyAgICBjb25zdCBjaGFyKiBwTmFtZTsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BlY2lhbGl6YXRpb25JbmZvKiBwU3BlY2lhbGl6YXRpb25JbmZvOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdGFnZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgbGF5b3V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSBiYXNlUGlwZWxpbmVIYW5kbGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXNlUGlwZWxpbmVJbmRleF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgc3RhZ2UoIHN0YWdlXyApCisgICAgICAsIGxheW91dCggbGF5b3V0XyApCisgICAgICAsIGJhc2VQaXBlbGluZUhhbmRsZSggYmFzZVBpcGVsaW5lSGFuZGxlXyApCisgICAgICAsIGJhc2VQaXBlbGluZUluZGV4KCBiYXNlUGlwZWxpbmVJbmRleF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyggVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIENvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFN0YWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc3RhZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0YWdlID0gc3RhZ2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gJiBzZXRMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBsYXlvdXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxheW91dCA9IGxheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldEJhc2VQaXBlbGluZUhhbmRsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIGJhc2VQaXBlbGluZUhhbmRsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYmFzZVBpcGVsaW5lSGFuZGxlID0gYmFzZVBpcGVsaW5lSGFuZGxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICYgc2V0QmFzZVBpcGVsaW5lSW5kZXgoIGludDMyX3QgYmFzZVBpcGVsaW5lSW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJhc2VQaXBlbGluZUluZGV4ID0gYmFzZVBpcGVsaW5lSW5kZXhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggc3RhZ2UgPT0gcmhzLnN0YWdlICkKKyAgICAgICAgICAmJiAoIGxheW91dCA9PSByaHMubGF5b3V0ICkKKyAgICAgICAgICAmJiAoIGJhc2VQaXBlbGluZUhhbmRsZSA9PSByaHMuYmFzZVBpcGVsaW5lSGFuZGxlICkKKyAgICAgICAgICAmJiAoIGJhc2VQaXBlbGluZUluZGV4ID09IHJocy5iYXNlUGlwZWxpbmVJbmRleCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc3RhZ2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgYmFzZVBpcGVsaW5lSGFuZGxlOworICAgIGludDMyX3QgYmFzZVBpcGVsaW5lSW5kZXg7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PENvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYnVmZmVyKCBidWZmZXJfICkKKyAgICAgICwgb2Zmc2V0KCBvZmZzZXRfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCApIC0gb2Zmc2V0b2YoIENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQoIFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQmIG9wZXJhdG9yPSggVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgJiBzZXRCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXIgPSBidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUICYgc2V0T2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9mZnNldCA9IG9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlciA9PSByaHMuYnVmZmVyICkKKyAgICAgICAgICAmJiAoIG9mZnNldCA9PSByaHMub2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnc0VYVCBmbGFnczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCApID09IHNpemVvZiggVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQ29uZm9ybWFuY2VWZXJzaW9uS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBDb25mb3JtYW5jZVZlcnNpb25LSFIoIHVpbnQ4X3QgbWFqb3JfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWlub3JfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3VibWlub3JfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGF0Y2hfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWFqb3IoIG1ham9yXyApCisgICAgICAsIG1pbm9yKCBtaW5vcl8gKQorICAgICAgLCBzdWJtaW5vciggc3VibWlub3JfICkKKyAgICAgICwgcGF0Y2goIHBhdGNoXyApCisgICAge30KKworICAgIENvbmZvcm1hbmNlVmVyc2lvbktIUiggVmtDb25mb3JtYW5jZVZlcnNpb25LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgQ29uZm9ybWFuY2VWZXJzaW9uS0hSJiBvcGVyYXRvcj0oIFZrQ29uZm9ybWFuY2VWZXJzaW9uS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbmZvcm1hbmNlVmVyc2lvbktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb25mb3JtYW5jZVZlcnNpb25LSFIgJiBzZXRNYWpvciggdWludDhfdCBtYWpvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWFqb3IgPSBtYWpvcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29uZm9ybWFuY2VWZXJzaW9uS0hSICYgc2V0TWlub3IoIHVpbnQ4X3QgbWlub3JfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1pbm9yID0gbWlub3JfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbmZvcm1hbmNlVmVyc2lvbktIUiAmIHNldFN1Ym1pbm9yKCB1aW50OF90IHN1Ym1pbm9yXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdWJtaW5vciA9IHN1Ym1pbm9yXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb25mb3JtYW5jZVZlcnNpb25LSFIgJiBzZXRQYXRjaCggdWludDhfdCBwYXRjaF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGF0Y2ggPSBwYXRjaF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb25mb3JtYW5jZVZlcnNpb25LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbmZvcm1hbmNlVmVyc2lvbktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb25mb3JtYW5jZVZlcnNpb25LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtDb25mb3JtYW5jZVZlcnNpb25LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggQ29uZm9ybWFuY2VWZXJzaW9uS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggbWFqb3IgPT0gcmhzLm1ham9yICkKKyAgICAgICAgICAmJiAoIG1pbm9yID09IHJocy5taW5vciApCisgICAgICAgICAgJiYgKCBzdWJtaW5vciA9PSByaHMuc3VibWlub3IgKQorICAgICAgICAgICYmICggcGF0Y2ggPT0gcmhzLnBhdGNoICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBDb25mb3JtYW5jZVZlcnNpb25LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDhfdCBtYWpvcjsKKyAgICB1aW50OF90IG1pbm9yOworICAgIHVpbnQ4X3Qgc3VibWlub3I7CisgICAgdWludDhfdCBwYXRjaDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBDb25mb3JtYW5jZVZlcnNpb25LSFIgKSA9PSBzaXplb2YoIFZrQ29uZm9ybWFuY2VWZXJzaW9uS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PENvbmZvcm1hbmNlVmVyc2lvbktIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCB1aW50MzJfdCBNU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBLU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50VHlwZU5WIEFUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlY6OmVGbG9hdDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50VHlwZU5WIEJUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlY6OmVGbG9hdDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50VHlwZU5WIENUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlY6OmVGbG9hdDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50VHlwZU5WIERUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlY6OmVGbG9hdDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2NvcGVOViBzY29wZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2NvcGVOVjo6ZURldmljZSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogTVNpemUoIE1TaXplXyApCisgICAgICAsIE5TaXplKCBOU2l6ZV8gKQorICAgICAgLCBLU2l6ZSggS1NpemVfICkKKyAgICAgICwgQVR5cGUoIEFUeXBlXyApCisgICAgICAsIEJUeXBlKCBCVHlwZV8gKQorICAgICAgLCBDVHlwZSggQ1R5cGVfICkKKyAgICAgICwgRFR5cGUoIERUeXBlXyApCisgICAgICAsIHNjb3BlKCBzY29wZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgKSAtIG9mZnNldG9mKCBDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCBWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBvcGVyYXRvcj0oIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WICYgc2V0TVNpemUoIHVpbnQzMl90IE1TaXplXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBNU2l6ZSA9IE1TaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViAmIHNldE5TaXplKCB1aW50MzJfdCBOU2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgTlNpemUgPSBOU2l6ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgJiBzZXRLU2l6ZSggdWludDMyX3QgS1NpemVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIEtTaXplID0gS1NpemVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WICYgc2V0QVR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlYgQVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIEFUeXBlID0gQVR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WICYgc2V0QlR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlYgQlR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIEJUeXBlID0gQlR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WICYgc2V0Q1R5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlYgQ1R5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIENUeXBlID0gQ1R5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WICYgc2V0RFR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlYgRFR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIERUeXBlID0gRFR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WICYgc2V0U2NvcGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTY29wZU5WIHNjb3BlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzY29wZSA9IHNjb3BlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBNU2l6ZSA9PSByaHMuTVNpemUgKQorICAgICAgICAgICYmICggTlNpemUgPT0gcmhzLk5TaXplICkKKyAgICAgICAgICAmJiAoIEtTaXplID09IHJocy5LU2l6ZSApCisgICAgICAgICAgJiYgKCBBVHlwZSA9PSByaHMuQVR5cGUgKQorICAgICAgICAgICYmICggQlR5cGUgPT0gcmhzLkJUeXBlICkKKyAgICAgICAgICAmJiAoIENUeXBlID09IHJocy5DVHlwZSApCisgICAgICAgICAgJiYgKCBEVHlwZSA9PSByaHMuRFR5cGUgKQorICAgICAgICAgICYmICggc2NvcGUgPT0gcmhzLnNjb3BlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgTVNpemU7CisgICAgdWludDMyX3QgTlNpemU7CisgICAgdWludDMyX3QgS1NpemU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudFR5cGVOViBBVHlwZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50VHlwZU5WIEJUeXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRUeXBlTlYgQ1R5cGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudFR5cGVOViBEVHlwZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2NvcGVOViBzY29wZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViApID09IHNpemVvZiggVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgQ29weURlc2NyaXB0b3JTZXQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIENvcHlEZXNjcmlwdG9yU2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCBzcmNTZXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjQmluZGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNBcnJheUVsZW1lbnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQgZHN0U2V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdEJpbmRpbmdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0QXJyYXlFbGVtZW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlc2NyaXB0b3JDb3VudF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzcmNTZXQoIHNyY1NldF8gKQorICAgICAgLCBzcmNCaW5kaW5nKCBzcmNCaW5kaW5nXyApCisgICAgICAsIHNyY0FycmF5RWxlbWVudCggc3JjQXJyYXlFbGVtZW50XyApCisgICAgICAsIGRzdFNldCggZHN0U2V0XyApCisgICAgICAsIGRzdEJpbmRpbmcoIGRzdEJpbmRpbmdfICkKKyAgICAgICwgZHN0QXJyYXlFbGVtZW50KCBkc3RBcnJheUVsZW1lbnRfICkKKyAgICAgICwgZGVzY3JpcHRvckNvdW50KCBkZXNjcmlwdG9yQ291bnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvcHlEZXNjcmlwdG9yU2V0ICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29weURlc2NyaXB0b3JTZXQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvcHlEZXNjcmlwdG9yU2V0ICkgLSBvZmZzZXRvZiggQ29weURlc2NyaXB0b3JTZXQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb3B5RGVzY3JpcHRvclNldCggVmtDb3B5RGVzY3JpcHRvclNldCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBDb3B5RGVzY3JpcHRvclNldCYgb3BlcmF0b3I9KCBWa0NvcHlEZXNjcmlwdG9yU2V0IGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvcHlEZXNjcmlwdG9yU2V0IGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvcHlEZXNjcmlwdG9yU2V0ICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb3B5RGVzY3JpcHRvclNldCAmIHNldFNyY1NldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQgc3JjU2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcmNTZXQgPSBzcmNTZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvcHlEZXNjcmlwdG9yU2V0ICYgc2V0U3JjQmluZGluZyggdWludDMyX3Qgc3JjQmluZGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjQmluZGluZyA9IHNyY0JpbmRpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvcHlEZXNjcmlwdG9yU2V0ICYgc2V0U3JjQXJyYXlFbGVtZW50KCB1aW50MzJfdCBzcmNBcnJheUVsZW1lbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNyY0FycmF5RWxlbWVudCA9IHNyY0FycmF5RWxlbWVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29weURlc2NyaXB0b3JTZXQgJiBzZXREc3RTZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0IGRzdFNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0U2V0ID0gZHN0U2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb3B5RGVzY3JpcHRvclNldCAmIHNldERzdEJpbmRpbmcoIHVpbnQzMl90IGRzdEJpbmRpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdEJpbmRpbmcgPSBkc3RCaW5kaW5nXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb3B5RGVzY3JpcHRvclNldCAmIHNldERzdEFycmF5RWxlbWVudCggdWludDMyX3QgZHN0QXJyYXlFbGVtZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RBcnJheUVsZW1lbnQgPSBkc3RBcnJheUVsZW1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvcHlEZXNjcmlwdG9yU2V0ICYgc2V0RGVzY3JpcHRvckNvdW50KCB1aW50MzJfdCBkZXNjcmlwdG9yQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JDb3VudCA9IGRlc2NyaXB0b3JDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtDb3B5RGVzY3JpcHRvclNldCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrQ29weURlc2NyaXB0b3JTZXQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtDb3B5RGVzY3JpcHRvclNldCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBDb3B5RGVzY3JpcHRvclNldCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3JjU2V0ID09IHJocy5zcmNTZXQgKQorICAgICAgICAgICYmICggc3JjQmluZGluZyA9PSByaHMuc3JjQmluZGluZyApCisgICAgICAgICAgJiYgKCBzcmNBcnJheUVsZW1lbnQgPT0gcmhzLnNyY0FycmF5RWxlbWVudCApCisgICAgICAgICAgJiYgKCBkc3RTZXQgPT0gcmhzLmRzdFNldCApCisgICAgICAgICAgJiYgKCBkc3RCaW5kaW5nID09IHJocy5kc3RCaW5kaW5nICkKKyAgICAgICAgICAmJiAoIGRzdEFycmF5RWxlbWVudCA9PSByaHMuZHN0QXJyYXlFbGVtZW50ICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JDb3VudCA9PSByaHMuZGVzY3JpcHRvckNvdW50ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBDb3B5RGVzY3JpcHRvclNldCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVDb3B5RGVzY3JpcHRvclNldDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQgc3JjU2V0OworICAgIHVpbnQzMl90IHNyY0JpbmRpbmc7CisgICAgdWludDMyX3Qgc3JjQXJyYXlFbGVtZW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0IGRzdFNldDsKKyAgICB1aW50MzJfdCBkc3RCaW5kaW5nOworICAgIHVpbnQzMl90IGRzdEFycmF5RWxlbWVudDsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yQ291bnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ29weURlc2NyaXB0b3JTZXQgKSA9PSBzaXplb2YoIFZrQ29weURlc2NyaXB0b3JTZXQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8Q29weURlc2NyaXB0b3JTZXQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgc3RydWN0IEQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiggdWludDMyX3Qgd2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KiBwV2FpdFNlbWFwaG9yZVZhbHVlc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogcFNpZ25hbFNlbWFwaG9yZVZhbHVlc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB3YWl0U2VtYXBob3JlVmFsdWVzQ291bnQoIHdhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudF8gKQorICAgICAgLCBwV2FpdFNlbWFwaG9yZVZhbHVlcyggcFdhaXRTZW1hcGhvcmVWYWx1ZXNfICkKKyAgICAgICwgc2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQoIHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50XyApCisgICAgICAsIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMoIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSICkgLSBvZmZzZXRvZiggRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiggVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiYgb3BlcmF0b3I9KCBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiAmIHNldFdhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudCggdWludDMyX3Qgd2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB3YWl0U2VtYXBob3JlVmFsdWVzQ291bnQgPSB3YWl0U2VtYXBob3JlVmFsdWVzQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSICYgc2V0UFdhaXRTZW1hcGhvcmVWYWx1ZXMoIGNvbnN0IHVpbnQ2NF90KiBwV2FpdFNlbWFwaG9yZVZhbHVlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSBwV2FpdFNlbWFwaG9yZVZhbHVlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgJiBzZXRTaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudCggdWludDMyX3Qgc2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50ID0gc2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSICYgc2V0UFNpZ25hbFNlbWFwaG9yZVZhbHVlcyggY29uc3QgdWludDY0X3QqIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPSBwU2lnbmFsU2VtYXBob3JlVmFsdWVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCB3YWl0U2VtYXBob3JlVmFsdWVzQ291bnQgPT0gcmhzLndhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudCApCisgICAgICAgICAgJiYgKCBwV2FpdFNlbWFwaG9yZVZhbHVlcyA9PSByaHMucFdhaXRTZW1hcGhvcmVWYWx1ZXMgKQorICAgICAgICAgICYmICggc2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQgPT0gcmhzLnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50ICkKKyAgICAgICAgICAmJiAoIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPT0gcmhzLnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCB3YWl0U2VtYXBob3JlVmFsdWVzQ291bnQ7CisgICAgY29uc3QgdWludDY0X3QqIHBXYWl0U2VtYXBob3JlVmFsdWVzOworICAgIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50OworICAgIGNvbnN0IHVpbnQ2NF90KiBwU2lnbmFsU2VtYXBob3JlVmFsdWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEQzRDEyRmVuY2VTdWJtaXRJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgc3RydWN0IERlYnVnTWFya2VyTWFya2VySW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFJfMTQgRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKCBjb25zdCBjaGFyKiBwTWFya2VyTmFtZV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxmbG9hdCw0PiBjb25zdCYgY29sb3JfID0geyB7IDAgfSB9ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwTWFya2VyTmFtZSggcE1hcmtlck5hbWVfICkKKyAgICAgICwgY29sb3J7fQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8ZmxvYXQsNCw0Pjo6Y29weSggY29sb3IsIGNvbG9yXyApOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnTWFya2VyTWFya2VySW5mb0VYVCApIC0gb2Zmc2V0b2YoIERlYnVnTWFya2VyTWFya2VySW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnTWFya2VyTWFya2VySW5mb0VYVCggVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUJiBvcGVyYXRvcj0oIFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnTWFya2VyTWFya2VySW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnTWFya2VyTWFya2VySW5mb0VYVCAmIHNldFBNYXJrZXJOYW1lKCBjb25zdCBjaGFyKiBwTWFya2VyTmFtZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE1hcmtlck5hbWUgPSBwTWFya2VyTmFtZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUICYgc2V0Q29sb3IoIHN0ZDo6YXJyYXk8ZmxvYXQsND4gY29sb3JfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggY29sb3IsIGNvbG9yXy5kYXRhKCksIDQgKiBzaXplb2YoIGZsb2F0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHBNYXJrZXJOYW1lID09IHJocy5wTWFya2VyTmFtZSApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGNvbG9yLCByaHMuY29sb3IsIDQgKiBzaXplb2YoIGZsb2F0ICkgKSA9PSAwICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBwTWFya2VyTmFtZTsKKyAgICBmbG9hdCBjb2xvcls0XTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgKSA9PSBzaXplb2YoIFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERlYnVnTWFya2VyTWFya2VySW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ6OmVVbmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9iamVjdF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBPYmplY3ROYW1lXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG9iamVjdFR5cGUoIG9iamVjdFR5cGVfICkKKyAgICAgICwgb2JqZWN0KCBvYmplY3RfICkKKyAgICAgICwgcE9iamVjdE5hbWUoIHBPYmplY3ROYW1lXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCApIC0gb2Zmc2V0b2YoIERlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCYgb3BlcmF0b3I9KCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUICYgc2V0T2JqZWN0VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBvYmplY3RUeXBlID0gb2JqZWN0VHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCAmIHNldE9iamVjdCggdWludDY0X3Qgb2JqZWN0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBvYmplY3QgPSBvYmplY3RfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgJiBzZXRQT2JqZWN0TmFtZSggY29uc3QgY2hhciogcE9iamVjdE5hbWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBPYmplY3ROYW1lID0gcE9iamVjdE5hbWVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBvYmplY3RUeXBlID09IHJocy5vYmplY3RUeXBlICkKKyAgICAgICAgICAmJiAoIG9iamVjdCA9PSByaHMub2JqZWN0ICkKKyAgICAgICAgICAmJiAoIHBPYmplY3ROYW1lID09IHJocy5wT2JqZWN0TmFtZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdFR5cGU7CisgICAgdWludDY0X3Qgb2JqZWN0OworICAgIGNvbnN0IGNoYXIqIHBPYmplY3ROYW1lOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgKSA9PSBzaXplb2YoIFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ6OmVVbmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2JqZWN0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0YWdOYW1lXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGFnU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcFRhZ18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBvYmplY3RUeXBlKCBvYmplY3RUeXBlXyApCisgICAgICAsIG9iamVjdCggb2JqZWN0XyApCisgICAgICAsIHRhZ05hbWUoIHRhZ05hbWVfICkKKyAgICAgICwgdGFnU2l6ZSggdGFnU2l6ZV8gKQorICAgICAgLCBwVGFnKCBwVGFnXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCApIC0gb2Zmc2V0b2YoIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCggVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUJiBvcGVyYXRvcj0oIFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCAmIHNldE9iamVjdFR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2JqZWN0VHlwZSA9IG9iamVjdFR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCAmIHNldE9iamVjdCggdWludDY0X3Qgb2JqZWN0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBvYmplY3QgPSBvYmplY3RfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCAmIHNldFRhZ05hbWUoIHVpbnQ2NF90IHRhZ05hbWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRhZ05hbWUgPSB0YWdOYW1lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgJiBzZXRUYWdTaXplKCBzaXplX3QgdGFnU2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdGFnU2l6ZSA9IHRhZ1NpemVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCAmIHNldFBUYWcoIGNvbnN0IHZvaWQqIHBUYWdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBUYWcgPSBwVGFnXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG9iamVjdFR5cGUgPT0gcmhzLm9iamVjdFR5cGUgKQorICAgICAgICAgICYmICggb2JqZWN0ID09IHJocy5vYmplY3QgKQorICAgICAgICAgICYmICggdGFnTmFtZSA9PSByaHMudGFnTmFtZSApCisgICAgICAgICAgJiYgKCB0YWdTaXplID09IHJocy50YWdTaXplICkKKyAgICAgICAgICAmJiAoIHBUYWcgPT0gcmhzLnBUYWcgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZTsKKyAgICB1aW50NjRfdCBvYmplY3Q7CisgICAgdWludDY0X3QgdGFnTmFtZTsKKyAgICBzaXplX3QgdGFnU2l6ZTsKKyAgICBjb25zdCB2b2lkKiBwVGFnOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCApID09IHNpemVvZiggVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydEZsYWdzRVhUIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydEZsYWdzRVhUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgcGZuQ2FsbGJhY2tfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBwZm5DYWxsYmFjayggcGZuQ2FsbGJhY2tfICkKKyAgICAgICwgcFVzZXJEYXRhKCBwVXNlckRhdGFfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICkgLSBvZmZzZXRvZiggRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCggVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdSZXBvcnRGbGFnc0VYVCBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgJiBzZXRQZm5DYWxsYmFjayggUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBwZm5DYWxsYmFja18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGZuQ2FsbGJhY2sgPSBwZm5DYWxsYmFja187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgJiBzZXRQVXNlckRhdGEoIHZvaWQqIHBVc2VyRGF0YV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFVzZXJEYXRhID0gcFVzZXJEYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggcGZuQ2FsbGJhY2sgPT0gcmhzLnBmbkNhbGxiYWNrICkKKyAgICAgICAgICAmJiAoIHBVc2VyRGF0YSA9PSByaHMucFVzZXJEYXRhICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3M7CisgICAgUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBwZm5DYWxsYmFjazsKKyAgICB2b2lkKiBwVXNlckRhdGE7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKSA9PSBzaXplb2YoIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlYnVnVXRpbHNMYWJlbEVYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFJfMTQgRGVidWdVdGlsc0xhYmVsRVhUKCBjb25zdCBjaGFyKiBwTGFiZWxOYW1lXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGZsb2F0LDQ+IGNvbnN0JiBjb2xvcl8gPSB7IHsgMCB9IH0gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBMYWJlbE5hbWUoIHBMYWJlbE5hbWVfICkKKyAgICAgICwgY29sb3J7fQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8ZmxvYXQsNCw0Pjo6Y29weSggY29sb3IsIGNvbG9yXyApOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTGFiZWxFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTGFiZWxFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNMYWJlbEVYVCApIC0gb2Zmc2V0b2YoIERlYnVnVXRpbHNMYWJlbEVYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNMYWJlbEVYVCggVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVidWdVdGlsc0xhYmVsRVhUJiBvcGVyYXRvcj0oIFZrRGVidWdVdGlsc0xhYmVsRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNMYWJlbEVYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1V0aWxzTGFiZWxFWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNMYWJlbEVYVCAmIHNldFBMYWJlbE5hbWUoIGNvbnN0IGNoYXIqIHBMYWJlbE5hbWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBMYWJlbE5hbWUgPSBwTGFiZWxOYW1lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1V0aWxzTGFiZWxFWFQgJiBzZXRDb2xvciggc3RkOjphcnJheTxmbG9hdCw0PiBjb2xvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCBjb2xvciwgY29sb3JfLmRhdGEoKSwgNCAqIHNpemVvZiggZmxvYXQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVidWdVdGlsc0xhYmVsRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVidWdVdGlsc0xhYmVsRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc0xhYmVsRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlYnVnVXRpbHNMYWJlbEVYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcExhYmVsTmFtZSA9PSByaHMucExhYmVsTmFtZSApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGNvbG9yLCByaHMuY29sb3IsIDQgKiBzaXplb2YoIGZsb2F0ICkgKSA9PSAwICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZWJ1Z1V0aWxzTGFiZWxFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVidWdVdGlsc0xhYmVsRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBwTGFiZWxOYW1lOworICAgIGZsb2F0IGNvbG9yWzRdOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlYnVnVXRpbHNMYWJlbEVYVCApID09IHNpemVvZiggVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGVidWdVdGlsc0xhYmVsRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFR5cGUgb2JqZWN0VHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VHlwZTo6ZVVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvYmplY3RIYW5kbGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBPYmplY3ROYW1lXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG9iamVjdFR5cGUoIG9iamVjdFR5cGVfICkKKyAgICAgICwgb2JqZWN0SGFuZGxlKCBvYmplY3RIYW5kbGVfICkKKyAgICAgICwgcE9iamVjdE5hbWUoIHBPYmplY3ROYW1lXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCApIC0gb2Zmc2V0b2YoIERlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCggVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCAmIHNldE9iamVjdFR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUeXBlIG9iamVjdFR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9iamVjdFR5cGUgPSBvYmplY3RUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgJiBzZXRPYmplY3RIYW5kbGUoIHVpbnQ2NF90IG9iamVjdEhhbmRsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2JqZWN0SGFuZGxlID0gb2JqZWN0SGFuZGxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgJiBzZXRQT2JqZWN0TmFtZSggY29uc3QgY2hhciogcE9iamVjdE5hbWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBPYmplY3ROYW1lID0gcE9iamVjdE5hbWVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggb2JqZWN0VHlwZSA9PSByaHMub2JqZWN0VHlwZSApCisgICAgICAgICAgJiYgKCBvYmplY3RIYW5kbGUgPT0gcmhzLm9iamVjdEhhbmRsZSApCisgICAgICAgICAgJiYgKCBwT2JqZWN0TmFtZSA9PSByaHMucE9iamVjdE5hbWUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUeXBlIG9iamVjdFR5cGU7CisgICAgdWludDY0X3Qgb2JqZWN0SGFuZGxlOworICAgIGNvbnN0IGNoYXIqIHBPYmplY3ROYW1lOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCApID09IHNpemVvZiggVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUZsYWdzRVhUIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRmxhZ3NFWFQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwTWVzc2FnZUlkTmFtZV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWVzc2FnZUlkTnVtYmVyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcE1lc3NhZ2VfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUxhYmVsQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc0xhYmVsRVhUKiBwUXVldWVMYWJlbHNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRCdWZMYWJlbENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNMYWJlbEVYVCogcENtZEJ1ZkxhYmVsc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9iamVjdENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogcE9iamVjdHNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHBNZXNzYWdlSWROYW1lKCBwTWVzc2FnZUlkTmFtZV8gKQorICAgICAgLCBtZXNzYWdlSWROdW1iZXIoIG1lc3NhZ2VJZE51bWJlcl8gKQorICAgICAgLCBwTWVzc2FnZSggcE1lc3NhZ2VfICkKKyAgICAgICwgcXVldWVMYWJlbENvdW50KCBxdWV1ZUxhYmVsQ291bnRfICkKKyAgICAgICwgcFF1ZXVlTGFiZWxzKCBwUXVldWVMYWJlbHNfICkKKyAgICAgICwgY21kQnVmTGFiZWxDb3VudCggY21kQnVmTGFiZWxDb3VudF8gKQorICAgICAgLCBwQ21kQnVmTGFiZWxzKCBwQ21kQnVmTGFiZWxzXyApCisgICAgICAsIG9iamVjdENvdW50KCBvYmplY3RDb3VudF8gKQorICAgICAgLCBwT2JqZWN0cyggcE9iamVjdHNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICkgLSBvZmZzZXRvZiggRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQoIFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUJiBvcGVyYXRvcj0oIFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFGbGFnc0VYVCBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAmIHNldFBNZXNzYWdlSWROYW1lKCBjb25zdCBjaGFyKiBwTWVzc2FnZUlkTmFtZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE1lc3NhZ2VJZE5hbWUgPSBwTWVzc2FnZUlkTmFtZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAmIHNldE1lc3NhZ2VJZE51bWJlciggaW50MzJfdCBtZXNzYWdlSWROdW1iZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lc3NhZ2VJZE51bWJlciA9IG1lc3NhZ2VJZE51bWJlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAmIHNldFBNZXNzYWdlKCBjb25zdCBjaGFyKiBwTWVzc2FnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE1lc3NhZ2UgPSBwTWVzc2FnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAmIHNldFF1ZXVlTGFiZWxDb3VudCggdWludDMyX3QgcXVldWVMYWJlbENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBxdWV1ZUxhYmVsQ291bnQgPSBxdWV1ZUxhYmVsQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgJiBzZXRQUXVldWVMYWJlbHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBRdWV1ZUxhYmVsc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFF1ZXVlTGFiZWxzID0gcFF1ZXVlTGFiZWxzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICYgc2V0Q21kQnVmTGFiZWxDb3VudCggdWludDMyX3QgY21kQnVmTGFiZWxDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY21kQnVmTGFiZWxDb3VudCA9IGNtZEJ1ZkxhYmVsQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgJiBzZXRQQ21kQnVmTGFiZWxzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc0xhYmVsRVhUKiBwQ21kQnVmTGFiZWxzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQ21kQnVmTGFiZWxzID0gcENtZEJ1ZkxhYmVsc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAmIHNldE9iamVjdENvdW50KCB1aW50MzJfdCBvYmplY3RDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2JqZWN0Q291bnQgPSBvYmplY3RDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAmIHNldFBPYmplY3RzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKiBwT2JqZWN0c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE9iamVjdHMgPSBwT2JqZWN0c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBwTWVzc2FnZUlkTmFtZSA9PSByaHMucE1lc3NhZ2VJZE5hbWUgKQorICAgICAgICAgICYmICggbWVzc2FnZUlkTnVtYmVyID09IHJocy5tZXNzYWdlSWROdW1iZXIgKQorICAgICAgICAgICYmICggcE1lc3NhZ2UgPT0gcmhzLnBNZXNzYWdlICkKKyAgICAgICAgICAmJiAoIHF1ZXVlTGFiZWxDb3VudCA9PSByaHMucXVldWVMYWJlbENvdW50ICkKKyAgICAgICAgICAmJiAoIHBRdWV1ZUxhYmVscyA9PSByaHMucFF1ZXVlTGFiZWxzICkKKyAgICAgICAgICAmJiAoIGNtZEJ1ZkxhYmVsQ291bnQgPT0gcmhzLmNtZEJ1ZkxhYmVsQ291bnQgKQorICAgICAgICAgICYmICggcENtZEJ1ZkxhYmVscyA9PSByaHMucENtZEJ1ZkxhYmVscyApCisgICAgICAgICAgJiYgKCBvYmplY3RDb3VudCA9PSByaHMub2JqZWN0Q291bnQgKQorICAgICAgICAgICYmICggcE9iamVjdHMgPT0gcmhzLnBPYmplY3RzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRmxhZ3NFWFQgZmxhZ3M7CisgICAgY29uc3QgY2hhciogcE1lc3NhZ2VJZE5hbWU7CisgICAgaW50MzJfdCBtZXNzYWdlSWROdW1iZXI7CisgICAgY29uc3QgY2hhciogcE1lc3NhZ2U7CisgICAgdWludDMyX3QgcXVldWVMYWJlbENvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBRdWV1ZUxhYmVsczsKKyAgICB1aW50MzJfdCBjbWRCdWZMYWJlbENvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBDbWRCdWZMYWJlbHM7CisgICAgdWludDMyX3Qgb2JqZWN0Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogcE9iamVjdHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCApID09IHNpemVvZiggVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVGbGFnc0VYVCBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUZsYWdzRVhUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQgbWVzc2FnZVNldmVyaXR5XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFQgcGZuVXNlckNhbGxiYWNrXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YV8gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgbWVzc2FnZVNldmVyaXR5KCBtZXNzYWdlU2V2ZXJpdHlfICkKKyAgICAgICwgbWVzc2FnZVR5cGUoIG1lc3NhZ2VUeXBlXyApCisgICAgICAsIHBmblVzZXJDYWxsYmFjayggcGZuVXNlckNhbGxiYWNrXyApCisgICAgICAsIHBVc2VyRGF0YSggcFVzZXJEYXRhXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQoIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVGbGFnc0VYVCBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgJiBzZXRNZXNzYWdlU2V2ZXJpdHkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQgbWVzc2FnZVNldmVyaXR5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZXNzYWdlU2V2ZXJpdHkgPSBtZXNzYWdlU2V2ZXJpdHlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICYgc2V0TWVzc2FnZVR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlVHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVzc2FnZVR5cGUgPSBtZXNzYWdlVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgJiBzZXRQZm5Vc2VyQ2FsbGJhY2soIFBGTl92a0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0VYVCBwZm5Vc2VyQ2FsbGJhY2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBmblVzZXJDYWxsYmFjayA9IHBmblVzZXJDYWxsYmFja187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgJiBzZXRQVXNlckRhdGEoIHZvaWQqIHBVc2VyRGF0YV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFVzZXJEYXRhID0gcFVzZXJEYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggbWVzc2FnZVNldmVyaXR5ID09IHJocy5tZXNzYWdlU2V2ZXJpdHkgKQorICAgICAgICAgICYmICggbWVzc2FnZVR5cGUgPT0gcmhzLm1lc3NhZ2VUeXBlICkKKyAgICAgICAgICAmJiAoIHBmblVzZXJDYWxsYmFjayA9PSByaHMucGZuVXNlckNhbGxiYWNrICkKKyAgICAgICAgICAmJiAoIHBVc2VyRGF0YSA9PSByaHMucFVzZXJEYXRhICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVGbGFnc0VYVCBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdzRVhUIG1lc3NhZ2VTZXZlcml0eTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgbWVzc2FnZVR5cGU7CisgICAgUEZOX3ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRVhUIHBmblVzZXJDYWxsYmFjazsKKyAgICB2b2lkKiBwVXNlckRhdGE7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgKSA9PSBzaXplb2YoIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFR5cGUgb2JqZWN0VHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VHlwZTo6ZVVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9iamVjdEhhbmRsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0YWdOYW1lXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0YWdTaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBUYWdfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogb2JqZWN0VHlwZSggb2JqZWN0VHlwZV8gKQorICAgICAgLCBvYmplY3RIYW5kbGUoIG9iamVjdEhhbmRsZV8gKQorICAgICAgLCB0YWdOYW1lKCB0YWdOYW1lXyApCisgICAgICAsIHRhZ1NpemUoIHRhZ1NpemVfICkKKyAgICAgICwgcFRhZyggcFRhZ18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgKSAtIG9mZnNldG9mKCBEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUJiBvcGVyYXRvcj0oIFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUICYgc2V0T2JqZWN0VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFR5cGUgb2JqZWN0VHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2JqZWN0VHlwZSA9IG9iamVjdFR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUICYgc2V0T2JqZWN0SGFuZGxlKCB1aW50NjRfdCBvYmplY3RIYW5kbGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9iamVjdEhhbmRsZSA9IG9iamVjdEhhbmRsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgJiBzZXRUYWdOYW1lKCB1aW50NjRfdCB0YWdOYW1lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0YWdOYW1lID0gdGFnTmFtZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgJiBzZXRUYWdTaXplKCBzaXplX3QgdGFnU2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdGFnU2l6ZSA9IHRhZ1NpemVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUICYgc2V0UFRhZyggY29uc3Qgdm9pZCogcFRhZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFRhZyA9IHBUYWdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG9iamVjdFR5cGUgPT0gcmhzLm9iamVjdFR5cGUgKQorICAgICAgICAgICYmICggb2JqZWN0SGFuZGxlID09IHJocy5vYmplY3RIYW5kbGUgKQorICAgICAgICAgICYmICggdGFnTmFtZSA9PSByaHMudGFnTmFtZSApCisgICAgICAgICAgJiYgKCB0YWdTaXplID09IHJocy50YWdTaXplICkKKyAgICAgICAgICAmJiAoIHBUYWcgPT0gcmhzLnBUYWcgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VHlwZSBvYmplY3RUeXBlOworICAgIHVpbnQ2NF90IG9iamVjdEhhbmRsZTsKKyAgICB1aW50NjRfdCB0YWdOYW1lOworICAgIHNpemVfdCB0YWdTaXplOworICAgIGNvbnN0IHZvaWQqIHBUYWc7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgKSA9PSBzaXplb2YoIFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVkaWNhdGVkQWxsb2NhdGlvbl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkZWRpY2F0ZWRBbGxvY2F0aW9uKCBkZWRpY2F0ZWRBbGxvY2F0aW9uXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViApIC0gb2Zmc2V0b2YoIERlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WKCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WICYgc2V0RGVkaWNhdGVkQWxsb2NhdGlvbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZWRpY2F0ZWRBbGxvY2F0aW9uXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uID0gZGVkaWNhdGVkQWxsb2NhdGlvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRlZGljYXRlZEFsbG9jYXRpb24gPT0gcmhzLmRlZGljYXRlZEFsbG9jYXRpb24gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZWRpY2F0ZWRBbGxvY2F0aW9uOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgKSA9PSBzaXplb2YoIFZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZWRpY2F0ZWRBbGxvY2F0aW9uXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRlZGljYXRlZEFsbG9jYXRpb24oIGRlZGljYXRlZEFsbG9jYXRpb25fICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WICkgLSBvZmZzZXRvZiggRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WKCBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYmIG9wZXJhdG9yPSggVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WICYgc2V0RGVkaWNhdGVkQWxsb2NhdGlvbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZWRpY2F0ZWRBbGxvY2F0aW9uXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uID0gZGVkaWNhdGVkQWxsb2NhdGlvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkZWRpY2F0ZWRBbGxvY2F0aW9uID09IHJocy5kZWRpY2F0ZWRBbGxvY2F0aW9uICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlZGljYXRlZEFsbG9jYXRpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WICkgPT0gc2l6ZW9mKCBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGltYWdlKCBpbWFnZV8gKQorICAgICAgLCBidWZmZXIoIGJ1ZmZlcl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgKSAtIG9mZnNldG9mKCBEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYoIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViYgb3BlcmF0b3I9KCBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgJiBzZXRJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZSA9IGltYWdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgJiBzZXRCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXIgPSBidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaW1hZ2UgPT0gcmhzLmltYWdlICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlciA9PSByaHMuYnVmZmVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXI7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WICkgPT0gc2l6ZW9mKCBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlc2NyaXB0b3JCdWZmZXJJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yQnVmZmVySW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgcmFuZ2VfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYnVmZmVyKCBidWZmZXJfICkKKyAgICAgICwgb2Zmc2V0KCBvZmZzZXRfICkKKyAgICAgICwgcmFuZ2UoIHJhbmdlXyApCisgICAge30KKworICAgIERlc2NyaXB0b3JCdWZmZXJJbmZvKCBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERlc2NyaXB0b3JCdWZmZXJJbmZvJiBvcGVyYXRvcj0oIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvckJ1ZmZlckluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvckJ1ZmZlckluZm8gJiBzZXRCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXIgPSBidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JCdWZmZXJJbmZvICYgc2V0T2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9mZnNldCA9IG9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvckJ1ZmZlckluZm8gJiBzZXRSYW5nZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgcmFuZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJhbmdlID0gcmFuZ2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvckJ1ZmZlckluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGVzY3JpcHRvckJ1ZmZlckluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBidWZmZXIgPT0gcmhzLmJ1ZmZlciApCisgICAgICAgICAgJiYgKCBvZmZzZXQgPT0gcmhzLm9mZnNldCApCisgICAgICAgICAgJiYgKCByYW5nZSA9PSByaHMucmFuZ2UgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlc2NyaXB0b3JCdWZmZXJJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSByYW5nZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXNjcmlwdG9yQnVmZmVySW5mbyApID09IHNpemVvZiggVmtEZXNjcmlwdG9yQnVmZmVySW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXNjcmlwdG9yQnVmZmVySW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGVzY3JpcHRvckltYWdlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvckltYWdlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXIgc2FtcGxlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcgaW1hZ2VWaWV3XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0OjplVW5kZWZpbmVkICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzYW1wbGVyKCBzYW1wbGVyXyApCisgICAgICAsIGltYWdlVmlldyggaW1hZ2VWaWV3XyApCisgICAgICAsIGltYWdlTGF5b3V0KCBpbWFnZUxheW91dF8gKQorICAgIHt9CisKKyAgICBEZXNjcmlwdG9ySW1hZ2VJbmZvKCBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVzY3JpcHRvckltYWdlSW5mbyYgb3BlcmF0b3I9KCBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvckltYWdlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9ySW1hZ2VJbmZvICYgc2V0U2FtcGxlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXIgc2FtcGxlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlciA9IHNhbXBsZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JJbWFnZUluZm8gJiBzZXRJbWFnZVZpZXcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcgaW1hZ2VWaWV3XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZVZpZXcgPSBpbWFnZVZpZXdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JJbWFnZUluZm8gJiBzZXRJbWFnZUxheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGltYWdlTGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZUxheW91dCA9IGltYWdlTGF5b3V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JJbWFnZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvckltYWdlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JJbWFnZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGVzY3JpcHRvckltYWdlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNhbXBsZXIgPT0gcmhzLnNhbXBsZXIgKQorICAgICAgICAgICYmICggaW1hZ2VWaWV3ID09IHJocy5pbWFnZVZpZXcgKQorICAgICAgICAgICYmICggaW1hZ2VMYXlvdXQgPT0gcmhzLmltYWdlTGF5b3V0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZXNjcmlwdG9ySW1hZ2VJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyIHNhbXBsZXI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlldyBpbWFnZVZpZXc7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGltYWdlTGF5b3V0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JJbWFnZUluZm8gKSA9PSBzaXplb2YoIFZrRGVzY3JpcHRvckltYWdlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXNjcmlwdG9ySW1hZ2VJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXNjcmlwdG9yUG9vbFNpemUKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JQb29sU2l6ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JUeXBlIHR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JUeXBlOjplU2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlc2NyaXB0b3JDb3VudF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0eXBlKCB0eXBlXyApCisgICAgICAsIGRlc2NyaXB0b3JDb3VudCggZGVzY3JpcHRvckNvdW50XyApCisgICAge30KKworICAgIERlc2NyaXB0b3JQb29sU2l6ZSggVmtEZXNjcmlwdG9yUG9vbFNpemUgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclBvb2xTaXplJiBvcGVyYXRvcj0oIFZrRGVzY3JpcHRvclBvb2xTaXplIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sU2l6ZSBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yUG9vbFNpemUgJiBzZXRUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclR5cGUgdHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHlwZSA9IHR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JQb29sU2l6ZSAmIHNldERlc2NyaXB0b3JDb3VudCggdWludDMyX3QgZGVzY3JpcHRvckNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yQ291bnQgPSBkZXNjcmlwdG9yQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvclBvb2xTaXplIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yUG9vbFNpemUqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvclBvb2xTaXplICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclBvb2xTaXplKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlc2NyaXB0b3JQb29sU2l6ZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHR5cGUgPT0gcmhzLnR5cGUgKQorICAgICAgICAgICYmICggZGVzY3JpcHRvckNvdW50ID09IHJocy5kZXNjcmlwdG9yQ291bnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlc2NyaXB0b3JQb29sU2l6ZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclR5cGUgdHlwZTsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yQ291bnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVzY3JpcHRvclBvb2xTaXplICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JQb29sU2l6ZSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXNjcmlwdG9yUG9vbFNpemU+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4U2V0c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9vbFNpemVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sU2l6ZSogcFBvb2xTaXplc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgbWF4U2V0cyggbWF4U2V0c18gKQorICAgICAgLCBwb29sU2l6ZUNvdW50KCBwb29sU2l6ZUNvdW50XyApCisgICAgICAsIHBQb29sU2l6ZXMoIHBQb29sU2l6ZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gJiBzZXRNYXhTZXRzKCB1aW50MzJfdCBtYXhTZXRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXhTZXRzID0gbWF4U2V0c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICYgc2V0UG9vbFNpemVDb3VudCggdWludDMyX3QgcG9vbFNpemVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcG9vbFNpemVDb3VudCA9IHBvb2xTaXplQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAmIHNldFBQb29sU2l6ZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbFNpemUqIHBQb29sU2l6ZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBQb29sU2l6ZXMgPSBwUG9vbFNpemVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBtYXhTZXRzID09IHJocy5tYXhTZXRzICkKKyAgICAgICAgICAmJiAoIHBvb2xTaXplQ291bnQgPT0gcmhzLnBvb2xTaXplQ291bnQgKQorICAgICAgICAgICYmICggcFBvb2xTaXplcyA9PSByaHMucFBvb2xTaXplcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3QgbWF4U2V0czsKKyAgICB1aW50MzJfdCBwb29sU2l6ZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbFNpemUqIHBQb29sU2l6ZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKCB1aW50MzJfdCBtYXhJbmxpbmVVbmlmb3JtQmxvY2tCaW5kaW5nc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXhJbmxpbmVVbmlmb3JtQmxvY2tCaW5kaW5ncyggbWF4SW5saW5lVW5pZm9ybUJsb2NrQmluZGluZ3NfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUICkgLSBvZmZzZXRvZiggRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKCBWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUICYgc2V0TWF4SW5saW5lVW5pZm9ybUJsb2NrQmluZGluZ3MoIHVpbnQzMl90IG1heElubGluZVVuaWZvcm1CbG9ja0JpbmRpbmdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXhJbmxpbmVVbmlmb3JtQmxvY2tCaW5kaW5ncyA9IG1heElubGluZVVuaWZvcm1CbG9ja0JpbmRpbmdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heElubGluZVVuaWZvcm1CbG9ja0JpbmRpbmdzID09IHJocy5tYXhJbmxpbmVVbmlmb3JtQmxvY2tCaW5kaW5ncyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWF4SW5saW5lVW5pZm9ybUJsb2NrQmluZGluZ3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dHNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGVzY3JpcHRvclBvb2woIGRlc2NyaXB0b3JQb29sXyApCisgICAgICAsIGRlc2NyaXB0b3JTZXRDb3VudCggZGVzY3JpcHRvclNldENvdW50XyApCisgICAgICAsIHBTZXRMYXlvdXRzKCBwU2V0TGF5b3V0c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gKSAtIG9mZnNldG9mKCBEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyggVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8mIG9wZXJhdG9yPSggVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAmIHNldERlc2NyaXB0b3JQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2xfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JQb29sID0gZGVzY3JpcHRvclBvb2xfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gJiBzZXREZXNjcmlwdG9yU2V0Q291bnQoIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVzY3JpcHRvclNldENvdW50ID0gZGVzY3JpcHRvclNldENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICYgc2V0UFNldExheW91dHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0KiBwU2V0TGF5b3V0c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFNldExheW91dHMgPSBwU2V0TGF5b3V0c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JQb29sID09IHJocy5kZXNjcmlwdG9yUG9vbCApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yU2V0Q291bnQgPT0gcmhzLmRlc2NyaXB0b3JTZXRDb3VudCApCisgICAgICAgICAgJiYgKCBwU2V0TGF5b3V0cyA9PSByaHMucFNldExheW91dHMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sOworICAgIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyApID09IHNpemVvZiggVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyggdWludDMyX3QgYmluZGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JUeXBlOjplU2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVzY3JpcHRvckNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzIHN0YWdlRmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXIqIHBJbW11dGFibGVTYW1wbGVyc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBiaW5kaW5nKCBiaW5kaW5nXyApCisgICAgICAsIGRlc2NyaXB0b3JUeXBlKCBkZXNjcmlwdG9yVHlwZV8gKQorICAgICAgLCBkZXNjcmlwdG9yQ291bnQoIGRlc2NyaXB0b3JDb3VudF8gKQorICAgICAgLCBzdGFnZUZsYWdzKCBzdGFnZUZsYWdzXyApCisgICAgICAsIHBJbW11dGFibGVTYW1wbGVycyggcEltbXV0YWJsZVNhbXBsZXJzXyApCisgICAge30KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nJiBvcGVyYXRvcj0oIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgJiBzZXRCaW5kaW5nKCB1aW50MzJfdCBiaW5kaW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiaW5kaW5nID0gYmluZGluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgJiBzZXREZXNjcmlwdG9yVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3JUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yVHlwZSA9IGRlc2NyaXB0b3JUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyAmIHNldERlc2NyaXB0b3JDb3VudCggdWludDMyX3QgZGVzY3JpcHRvckNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yQ291bnQgPSBkZXNjcmlwdG9yQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nICYgc2V0U3RhZ2VGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhZ2VGbGFncyA9IHN0YWdlRmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nICYgc2V0UEltbXV0YWJsZVNhbXBsZXJzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciogcEltbXV0YWJsZVNhbXBsZXJzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwSW1tdXRhYmxlU2FtcGxlcnMgPSBwSW1tdXRhYmxlU2FtcGxlcnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBiaW5kaW5nID09IHJocy5iaW5kaW5nICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JUeXBlID09IHJocy5kZXNjcmlwdG9yVHlwZSApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yQ291bnQgPT0gcmhzLmRlc2NyaXB0b3JDb3VudCApCisgICAgICAgICAgJiYgKCBzdGFnZUZsYWdzID09IHJocy5zdGFnZUZsYWdzICkKKyAgICAgICAgICAmJiAoIHBJbW11dGFibGVTYW1wbGVycyA9PSByaHMucEltbXV0YWJsZVNhbXBsZXJzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50MzJfdCBiaW5kaW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yVHlwZTsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yQ291bnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFnczsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciogcEltbXV0YWJsZVNhbXBsZXJzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQoIHVpbnQzMl90IGJpbmRpbmdDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCogcEJpbmRpbmdGbGFnc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBiaW5kaW5nQ291bnQoIGJpbmRpbmdDb3VudF8gKQorICAgICAgLCBwQmluZGluZ0ZsYWdzKCBwQmluZGluZ0ZsYWdzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQoIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgJiBzZXRCaW5kaW5nQ291bnQoIHVpbnQzMl90IGJpbmRpbmdDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYmluZGluZ0NvdW50ID0gYmluZGluZ0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCAmIHNldFBCaW5kaW5nRmxhZ3MoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUKiBwQmluZGluZ0ZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQmluZGluZ0ZsYWdzID0gcEJpbmRpbmdGbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggYmluZGluZ0NvdW50ID09IHJocy5iaW5kaW5nQ291bnQgKQorICAgICAgICAgICYmICggcEJpbmRpbmdGbGFncyA9PSByaHMucEJpbmRpbmdGbGFncyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGJpbmRpbmdDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCogcEJpbmRpbmdGbGFnczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmluZGluZ0NvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyogcEJpbmRpbmdzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBiaW5kaW5nQ291bnQoIGJpbmRpbmdDb3VudF8gKQorICAgICAgLCBwQmluZGluZ3MoIHBCaW5kaW5nc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICYgc2V0QmluZGluZ0NvdW50KCB1aW50MzJfdCBiaW5kaW5nQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJpbmRpbmdDb3VudCA9IGJpbmRpbmdDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJiBzZXRQQmluZGluZ3MoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyogcEJpbmRpbmdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQmluZGluZ3MgPSBwQmluZGluZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBiaW5kaW5nQ291bnQgPT0gcmhzLmJpbmRpbmdDb3VudCApCisgICAgICAgICAgJiYgKCBwQmluZGluZ3MgPT0gcmhzLnBCaW5kaW5ncyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3QgYmluZGluZ0NvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyogcEJpbmRpbmdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydAorICB7CisgICAgRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3VwcG9ydGVkXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN1cHBvcnRlZCggc3VwcG9ydGVkXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCApIC0gb2Zmc2V0b2YoIERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQmIG9wZXJhdG9yPSggVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Kj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzdXBwb3J0ZWQgPT0gcmhzLnN1cHBvcnRlZCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3VwcG9ydGVkOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0ICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0ICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Pjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCggdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcERlc2NyaXB0b3JDb3VudHNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGVzY3JpcHRvclNldENvdW50KCBkZXNjcmlwdG9yU2V0Q291bnRfICkKKyAgICAgICwgcERlc2NyaXB0b3JDb3VudHMoIHBEZXNjcmlwdG9yQ291bnRzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCggVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCAmIHNldERlc2NyaXB0b3JTZXRDb3VudCggdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yU2V0Q291bnQgPSBkZXNjcmlwdG9yU2V0Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCAmIHNldFBEZXNjcmlwdG9yQ291bnRzKCBjb25zdCB1aW50MzJfdCogcERlc2NyaXB0b3JDb3VudHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBEZXNjcmlwdG9yQ291bnRzID0gcERlc2NyaXB0b3JDb3VudHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZGVzY3JpcHRvclNldENvdW50ID09IHJocy5kZXNjcmlwdG9yU2V0Q291bnQgKQorICAgICAgICAgICYmICggcERlc2NyaXB0b3JDb3VudHMgPT0gcmhzLnBEZXNjcmlwdG9yQ291bnRzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBEZXNjcmlwdG9yQ291bnRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUCisgIHsKKyAgICBEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUKCB1aW50MzJfdCBtYXhWYXJpYWJsZURlc2NyaXB0b3JDb3VudF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXhWYXJpYWJsZURlc2NyaXB0b3JDb3VudCggbWF4VmFyaWFibGVEZXNjcmlwdG9yQ291bnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUICkgLSBvZmZzZXRvZiggRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQoIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUJiBvcGVyYXRvcj0oIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtYXhWYXJpYWJsZURlc2NyaXB0b3JDb3VudCA9PSByaHMubWF4VmFyaWFibGVEZXNjcmlwdG9yQ291bnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWF4VmFyaWFibGVEZXNjcmlwdG9yQ291bnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCApID09IHNpemVvZiggVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5CisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSggdWludDMyX3QgZHN0QmluZGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RBcnJheUVsZW1lbnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVzY3JpcHRvckNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclR5cGU6OmVTYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdHJpZGVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZHN0QmluZGluZyggZHN0QmluZGluZ18gKQorICAgICAgLCBkc3RBcnJheUVsZW1lbnQoIGRzdEFycmF5RWxlbWVudF8gKQorICAgICAgLCBkZXNjcmlwdG9yQ291bnQoIGRlc2NyaXB0b3JDb3VudF8gKQorICAgICAgLCBkZXNjcmlwdG9yVHlwZSggZGVzY3JpcHRvclR5cGVfICkKKyAgICAgICwgb2Zmc2V0KCBvZmZzZXRfICkKKyAgICAgICwgc3RyaWRlKCBzdHJpZGVfICkKKyAgICB7fQorCisgICAgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkoIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkmIG9wZXJhdG9yPSggVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSAmIHNldERzdEJpbmRpbmcoIHVpbnQzMl90IGRzdEJpbmRpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdEJpbmRpbmcgPSBkc3RCaW5kaW5nXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSAmIHNldERzdEFycmF5RWxlbWVudCggdWludDMyX3QgZHN0QXJyYXlFbGVtZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RBcnJheUVsZW1lbnQgPSBkc3RBcnJheUVsZW1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5ICYgc2V0RGVzY3JpcHRvckNvdW50KCB1aW50MzJfdCBkZXNjcmlwdG9yQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JDb3VudCA9IGRlc2NyaXB0b3JDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkgJiBzZXREZXNjcmlwdG9yVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3JUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yVHlwZSA9IGRlc2NyaXB0b3JUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSAmIHNldE9mZnNldCggc2l6ZV90IG9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2Zmc2V0ID0gb2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSAmIHNldFN0cmlkZSggc2l6ZV90IHN0cmlkZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RyaWRlID0gc3RyaWRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5IGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5Kj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggZHN0QmluZGluZyA9PSByaHMuZHN0QmluZGluZyApCisgICAgICAgICAgJiYgKCBkc3RBcnJheUVsZW1lbnQgPT0gcmhzLmRzdEFycmF5RWxlbWVudCApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yQ291bnQgPT0gcmhzLmRlc2NyaXB0b3JDb3VudCApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yVHlwZSA9PSByaHMuZGVzY3JpcHRvclR5cGUgKQorICAgICAgICAgICYmICggb2Zmc2V0ID09IHJocy5vZmZzZXQgKQorICAgICAgICAgICYmICggc3RyaWRlID09IHJocy5zdHJpZGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IGRzdEJpbmRpbmc7CisgICAgdWludDMyX3QgZHN0QXJyYXlFbGVtZW50OworICAgIHVpbnQzMl90IGRlc2NyaXB0b3JDb3VudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGU7CisgICAgc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc3RyaWRlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5ICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5ICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5Pjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkqIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIHRlbXBsYXRlVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVHlwZTo6ZURlc2NyaXB0b3JTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY3JpcHRvclNldExheW91dF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQ6OmVHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2V0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBkZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudCggZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnRfICkKKyAgICAgICwgcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzKCBwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNfICkKKyAgICAgICwgdGVtcGxhdGVUeXBlKCB0ZW1wbGF0ZVR5cGVfICkKKyAgICAgICwgZGVzY3JpcHRvclNldExheW91dCggZGVzY3JpcHRvclNldExheW91dF8gKQorICAgICAgLCBwaXBlbGluZUJpbmRQb2ludCggcGlwZWxpbmVCaW5kUG9pbnRfICkKKyAgICAgICwgcGlwZWxpbmVMYXlvdXQoIHBpcGVsaW5lTGF5b3V0XyApCisgICAgICAsIHNldCggc2V0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyAmIHNldERlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50KCB1aW50MzJfdCBkZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQgPSBkZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyAmIHNldFBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5KiBwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyA9IHBEZXNjcmlwdG9yVXBkYXRlRW50cmllc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyAmIHNldFRlbXBsYXRlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGUgdGVtcGxhdGVUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0ZW1wbGF0ZVR5cGUgPSB0ZW1wbGF0ZVR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gJiBzZXREZXNjcmlwdG9yU2V0TGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCBkZXNjcmlwdG9yU2V0TGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0ID0gZGVzY3JpcHRvclNldExheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyAmIHNldFBpcGVsaW5lQmluZFBvaW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBpcGVsaW5lQmluZFBvaW50ID0gcGlwZWxpbmVCaW5kUG9pbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gJiBzZXRQaXBlbGluZUxheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IHBpcGVsaW5lTGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwaXBlbGluZUxheW91dCA9IHBpcGVsaW5lTGF5b3V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICYgc2V0U2V0KCB1aW50MzJfdCBzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNldCA9IHNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudCA9PSByaHMuZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQgKQorICAgICAgICAgICYmICggcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzID09IHJocy5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMgKQorICAgICAgICAgICYmICggdGVtcGxhdGVUeXBlID09IHJocy50ZW1wbGF0ZVR5cGUgKQorICAgICAgICAgICYmICggZGVzY3JpcHRvclNldExheW91dCA9PSByaHMuZGVzY3JpcHRvclNldExheW91dCApCisgICAgICAgICAgJiYgKCBwaXBlbGluZUJpbmRQb2ludCA9PSByaHMucGlwZWxpbmVCaW5kUG9pbnQgKQorICAgICAgICAgICYmICggcGlwZWxpbmVMYXlvdXQgPT0gcmhzLnBpcGVsaW5lTGF5b3V0ICkKKyAgICAgICAgICAmJiAoIHNldCA9PSByaHMuc2V0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkqIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVHlwZSB0ZW1wbGF0ZVR5cGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY3JpcHRvclNldExheW91dDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IHBpcGVsaW5lTGF5b3V0OworICAgIHVpbnQzMl90IHNldDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGV2aWNlUXVldWVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXZpY2VRdWV1ZUNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogcFF1ZXVlUHJpb3JpdGllc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgcXVldWVGYW1pbHlJbmRleCggcXVldWVGYW1pbHlJbmRleF8gKQorICAgICAgLCBxdWV1ZUNvdW50KCBxdWV1ZUNvdW50XyApCisgICAgICAsIHBRdWV1ZVByaW9yaXRpZXMoIHBRdWV1ZVByaW9yaXRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVF1ZXVlQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlUXVldWVDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggRGV2aWNlUXVldWVDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVDcmVhdGVJbmZvKCBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXZpY2VRdWV1ZUNyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlUXVldWVDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZVF1ZXVlQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gJiBzZXRRdWV1ZUZhbWlseUluZGV4KCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBxdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVDcmVhdGVJbmZvICYgc2V0UXVldWVDb3VudCggdWludDMyX3QgcXVldWVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcXVldWVDb3VudCA9IHF1ZXVlQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZVF1ZXVlQ3JlYXRlSW5mbyAmIHNldFBRdWV1ZVByaW9yaXRpZXMoIGNvbnN0IGZsb2F0KiBwUXVldWVQcmlvcml0aWVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwUXVldWVQcmlvcml0aWVzID0gcFF1ZXVlUHJpb3JpdGllc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlUXVldWVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggcXVldWVGYW1pbHlJbmRleCA9PSByaHMucXVldWVGYW1pbHlJbmRleCApCisgICAgICAgICAgJiYgKCBxdWV1ZUNvdW50ID09IHJocy5xdWV1ZUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBRdWV1ZVByaW9yaXRpZXMgPT0gcmhzLnBRdWV1ZVByaW9yaXRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VRdWV1ZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXg7CisgICAgdWludDMyX3QgcXVldWVDb3VudDsKKyAgICBjb25zdCBmbG9hdCogcFF1ZXVlUHJpb3JpdGllczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZVF1ZXVlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByb2J1c3RCdWZmZXJBY2Nlc3NfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZ1bGxEcmF3SW5kZXhVaW50MzJfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGltYWdlQ3ViZUFycmF5XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbmRlcGVuZGVudEJsZW5kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBnZW9tZXRyeVNoYWRlcl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGVzc2VsbGF0aW9uU2hhZGVyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzYW1wbGVSYXRlU2hhZGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZHVhbFNyY0JsZW5kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBsb2dpY09wXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBtdWx0aURyYXdJbmRpcmVjdF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhDbGFtcF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhCaWFzQ2xhbXBfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZpbGxNb2RlTm9uU29saWRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlcHRoQm91bmRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB3aWRlTGluZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGxhcmdlUG9pbnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhbHBoYVRvT25lXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBtdWx0aVZpZXdwb3J0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzYW1wbGVyQW5pc290cm9weV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGV4dHVyZUNvbXByZXNzaW9uRVRDMl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFJfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRleHR1cmVDb21wcmVzc2lvbkJDXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBvY2NsdXNpb25RdWVyeVByZWNpc2VfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3NfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZyYWdtZW50U3RvcmVzQW5kQXRvbWljc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckNsaXBEaXN0YW5jZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyQ3VsbERpc3RhbmNlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJGbG9hdDY0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJJbnQ2NF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW50MTZfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclJlc291cmNlUmVzaWRlbmN5XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSZXNvdXJjZU1pbkxvZF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlQmluZGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlUmVzaWRlbmN5QnVmZmVyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3lJbWFnZTJEXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3lJbWFnZTNEXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3kyU2FtcGxlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlUmVzaWRlbmN5NFNhbXBsZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNwYXJzZVJlc2lkZW5jeThTYW1wbGVzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNwYXJzZVJlc2lkZW5jeUFsaWFzZWRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbmhlcml0ZWRRdWVyaWVzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHJvYnVzdEJ1ZmZlckFjY2Vzcyggcm9idXN0QnVmZmVyQWNjZXNzXyApCisgICAgICAsIGZ1bGxEcmF3SW5kZXhVaW50MzIoIGZ1bGxEcmF3SW5kZXhVaW50MzJfICkKKyAgICAgICwgaW1hZ2VDdWJlQXJyYXkoIGltYWdlQ3ViZUFycmF5XyApCisgICAgICAsIGluZGVwZW5kZW50QmxlbmQoIGluZGVwZW5kZW50QmxlbmRfICkKKyAgICAgICwgZ2VvbWV0cnlTaGFkZXIoIGdlb21ldHJ5U2hhZGVyXyApCisgICAgICAsIHRlc3NlbGxhdGlvblNoYWRlciggdGVzc2VsbGF0aW9uU2hhZGVyXyApCisgICAgICAsIHNhbXBsZVJhdGVTaGFkaW5nKCBzYW1wbGVSYXRlU2hhZGluZ18gKQorICAgICAgLCBkdWFsU3JjQmxlbmQoIGR1YWxTcmNCbGVuZF8gKQorICAgICAgLCBsb2dpY09wKCBsb2dpY09wXyApCisgICAgICAsIG11bHRpRHJhd0luZGlyZWN0KCBtdWx0aURyYXdJbmRpcmVjdF8gKQorICAgICAgLCBkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlKCBkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlXyApCisgICAgICAsIGRlcHRoQ2xhbXAoIGRlcHRoQ2xhbXBfICkKKyAgICAgICwgZGVwdGhCaWFzQ2xhbXAoIGRlcHRoQmlhc0NsYW1wXyApCisgICAgICAsIGZpbGxNb2RlTm9uU29saWQoIGZpbGxNb2RlTm9uU29saWRfICkKKyAgICAgICwgZGVwdGhCb3VuZHMoIGRlcHRoQm91bmRzXyApCisgICAgICAsIHdpZGVMaW5lcyggd2lkZUxpbmVzXyApCisgICAgICAsIGxhcmdlUG9pbnRzKCBsYXJnZVBvaW50c18gKQorICAgICAgLCBhbHBoYVRvT25lKCBhbHBoYVRvT25lXyApCisgICAgICAsIG11bHRpVmlld3BvcnQoIG11bHRpVmlld3BvcnRfICkKKyAgICAgICwgc2FtcGxlckFuaXNvdHJvcHkoIHNhbXBsZXJBbmlzb3Ryb3B5XyApCisgICAgICAsIHRleHR1cmVDb21wcmVzc2lvbkVUQzIoIHRleHR1cmVDb21wcmVzc2lvbkVUQzJfICkKKyAgICAgICwgdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIoIHRleHR1cmVDb21wcmVzc2lvbkFTVENfTERSXyApCisgICAgICAsIHRleHR1cmVDb21wcmVzc2lvbkJDKCB0ZXh0dXJlQ29tcHJlc3Npb25CQ18gKQorICAgICAgLCBvY2NsdXNpb25RdWVyeVByZWNpc2UoIG9jY2x1c2lvblF1ZXJ5UHJlY2lzZV8gKQorICAgICAgLCBwaXBlbGluZVN0YXRpc3RpY3NRdWVyeSggcGlwZWxpbmVTdGF0aXN0aWNzUXVlcnlfICkKKyAgICAgICwgdmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzKCB2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3NfICkKKyAgICAgICwgZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzKCBmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3NfICkKKyAgICAgICwgc2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUoIHNoYWRlclRlc3NlbGxhdGlvbkFuZEdlb21ldHJ5UG9pbnRTaXplXyApCisgICAgICAsIHNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQoIHNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWRfICkKKyAgICAgICwgc2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzKCBzaGFkZXJTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHNfICkKKyAgICAgICwgc2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUoIHNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlXyApCisgICAgICAsIHNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0KCBzaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdF8gKQorICAgICAgLCBzaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXQoIHNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdF8gKQorICAgICAgLCBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcoIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ18gKQorICAgICAgLCBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyggc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmdfICkKKyAgICAgICwgc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nKCBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmdfICkKKyAgICAgICwgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmcoIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nXyApCisgICAgICAsIHNoYWRlckNsaXBEaXN0YW5jZSggc2hhZGVyQ2xpcERpc3RhbmNlXyApCisgICAgICAsIHNoYWRlckN1bGxEaXN0YW5jZSggc2hhZGVyQ3VsbERpc3RhbmNlXyApCisgICAgICAsIHNoYWRlckZsb2F0NjQoIHNoYWRlckZsb2F0NjRfICkKKyAgICAgICwgc2hhZGVySW50NjQoIHNoYWRlckludDY0XyApCisgICAgICAsIHNoYWRlckludDE2KCBzaGFkZXJJbnQxNl8gKQorICAgICAgLCBzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSggc2hhZGVyUmVzb3VyY2VSZXNpZGVuY3lfICkKKyAgICAgICwgc2hhZGVyUmVzb3VyY2VNaW5Mb2QoIHNoYWRlclJlc291cmNlTWluTG9kXyApCisgICAgICAsIHNwYXJzZUJpbmRpbmcoIHNwYXJzZUJpbmRpbmdfICkKKyAgICAgICwgc3BhcnNlUmVzaWRlbmN5QnVmZmVyKCBzcGFyc2VSZXNpZGVuY3lCdWZmZXJfICkKKyAgICAgICwgc3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCggc3BhcnNlUmVzaWRlbmN5SW1hZ2UyRF8gKQorICAgICAgLCBzcGFyc2VSZXNpZGVuY3lJbWFnZTNEKCBzcGFyc2VSZXNpZGVuY3lJbWFnZTNEXyApCisgICAgICAsIHNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzKCBzcGFyc2VSZXNpZGVuY3kyU2FtcGxlc18gKQorICAgICAgLCBzcGFyc2VSZXNpZGVuY3k0U2FtcGxlcyggc3BhcnNlUmVzaWRlbmN5NFNhbXBsZXNfICkKKyAgICAgICwgc3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMoIHNwYXJzZVJlc2lkZW5jeThTYW1wbGVzXyApCisgICAgICAsIHNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlcyggc3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzXyApCisgICAgICAsIHNwYXJzZVJlc2lkZW5jeUFsaWFzZWQoIHNwYXJzZVJlc2lkZW5jeUFsaWFzZWRfICkKKyAgICAgICwgdmFyaWFibGVNdWx0aXNhbXBsZVJhdGUoIHZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlXyApCisgICAgICAsIGluaGVyaXRlZFF1ZXJpZXMoIGluaGVyaXRlZFF1ZXJpZXNfICkKKyAgICB7fQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyggVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFJvYnVzdEJ1ZmZlckFjY2VzcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByb2J1c3RCdWZmZXJBY2Nlc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJvYnVzdEJ1ZmZlckFjY2VzcyA9IHJvYnVzdEJ1ZmZlckFjY2Vzc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldEZ1bGxEcmF3SW5kZXhVaW50MzIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnVsbERyYXdJbmRleFVpbnQzMl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZnVsbERyYXdJbmRleFVpbnQzMiA9IGZ1bGxEcmF3SW5kZXhVaW50MzJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRJbWFnZUN1YmVBcnJheSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbWFnZUN1YmVBcnJheV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW1hZ2VDdWJlQXJyYXkgPSBpbWFnZUN1YmVBcnJheV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldEluZGVwZW5kZW50QmxlbmQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgaW5kZXBlbmRlbnRCbGVuZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5kZXBlbmRlbnRCbGVuZCA9IGluZGVwZW5kZW50QmxlbmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRHZW9tZXRyeVNoYWRlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBnZW9tZXRyeVNoYWRlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZ2VvbWV0cnlTaGFkZXIgPSBnZW9tZXRyeVNoYWRlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFRlc3NlbGxhdGlvblNoYWRlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0ZXNzZWxsYXRpb25TaGFkZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRlc3NlbGxhdGlvblNoYWRlciA9IHRlc3NlbGxhdGlvblNoYWRlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNhbXBsZVJhdGVTaGFkaW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNhbXBsZVJhdGVTaGFkaW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzYW1wbGVSYXRlU2hhZGluZyA9IHNhbXBsZVJhdGVTaGFkaW5nXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0RHVhbFNyY0JsZW5kKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGR1YWxTcmNCbGVuZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHVhbFNyY0JsZW5kID0gZHVhbFNyY0JsZW5kXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0TG9naWNPcCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBsb2dpY09wXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBsb2dpY09wID0gbG9naWNPcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldE11bHRpRHJhd0luZGlyZWN0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG11bHRpRHJhd0luZGlyZWN0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtdWx0aURyYXdJbmRpcmVjdCA9IG11bHRpRHJhd0luZGlyZWN0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0RHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlID0gZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldERlcHRoQ2xhbXAoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhDbGFtcF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGhDbGFtcCA9IGRlcHRoQ2xhbXBfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXREZXB0aEJpYXNDbGFtcCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aEJpYXNDbGFtcF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGhCaWFzQ2xhbXAgPSBkZXB0aEJpYXNDbGFtcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldEZpbGxNb2RlTm9uU29saWQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZmlsbE1vZGVOb25Tb2xpZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmlsbE1vZGVOb25Tb2xpZCA9IGZpbGxNb2RlTm9uU29saWRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXREZXB0aEJvdW5kcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aEJvdW5kc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGhCb3VuZHMgPSBkZXB0aEJvdW5kc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFdpZGVMaW5lcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB3aWRlTGluZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHdpZGVMaW5lcyA9IHdpZGVMaW5lc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldExhcmdlUG9pbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGxhcmdlUG9pbnRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBsYXJnZVBvaW50cyA9IGxhcmdlUG9pbnRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0QWxwaGFUb09uZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhbHBoYVRvT25lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhbHBoYVRvT25lID0gYWxwaGFUb09uZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldE11bHRpVmlld3BvcnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbXVsdGlWaWV3cG9ydF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbXVsdGlWaWV3cG9ydCA9IG11bHRpVmlld3BvcnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTYW1wbGVyQW5pc290cm9weSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzYW1wbGVyQW5pc290cm9weV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlckFuaXNvdHJvcHkgPSBzYW1wbGVyQW5pc290cm9weV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFRleHR1cmVDb21wcmVzc2lvbkVUQzIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGV4dHVyZUNvbXByZXNzaW9uRVRDMl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdGV4dHVyZUNvbXByZXNzaW9uRVRDMiA9IHRleHR1cmVDb21wcmVzc2lvbkVUQzJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRUZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIgPSB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFRleHR1cmVDb21wcmVzc2lvbkJDKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRleHR1cmVDb21wcmVzc2lvbkJDXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0ZXh0dXJlQ29tcHJlc3Npb25CQyA9IHRleHR1cmVDb21wcmVzc2lvbkJDXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0T2NjbHVzaW9uUXVlcnlQcmVjaXNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG9jY2x1c2lvblF1ZXJ5UHJlY2lzZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2NjbHVzaW9uUXVlcnlQcmVjaXNlID0gb2NjbHVzaW9uUXVlcnlQcmVjaXNlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0UGlwZWxpbmVTdGF0aXN0aWNzUXVlcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGlwZWxpbmVTdGF0aXN0aWNzUXVlcnlfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5ID0gcGlwZWxpbmVTdGF0aXN0aWNzUXVlcnlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRWZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3MgPSB2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRGcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MgPSBmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUgPSBzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCA9IHNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTaGFkZXJTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHMgPSBzaGFkZXJTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUgPSBzaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdCA9IHNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0U2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0ID0gc2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0U2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nID0gc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0U2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nID0gc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcgPSBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTaGFkZXJTdG9yYWdlSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmcgPSBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNoYWRlckNsaXBEaXN0YW5jZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJDbGlwRGlzdGFuY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRlckNsaXBEaXN0YW5jZSA9IHNoYWRlckNsaXBEaXN0YW5jZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNoYWRlckN1bGxEaXN0YW5jZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJDdWxsRGlzdGFuY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRlckN1bGxEaXN0YW5jZSA9IHNoYWRlckN1bGxEaXN0YW5jZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNoYWRlckZsb2F0NjQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyRmxvYXQ2NF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyRmxvYXQ2NCA9IHNoYWRlckZsb2F0NjRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTaGFkZXJJbnQ2NCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJJbnQ2NF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVySW50NjQgPSBzaGFkZXJJbnQ2NF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNoYWRlckludDE2KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckludDE2XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJJbnQxNiA9IHNoYWRlckludDE2XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0U2hhZGVyUmVzb3VyY2VSZXNpZGVuY3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyUmVzb3VyY2VSZXNpZGVuY3lfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRlclJlc291cmNlUmVzaWRlbmN5ID0gc2hhZGVyUmVzb3VyY2VSZXNpZGVuY3lfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTaGFkZXJSZXNvdXJjZU1pbkxvZCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSZXNvdXJjZU1pbkxvZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyUmVzb3VyY2VNaW5Mb2QgPSBzaGFkZXJSZXNvdXJjZU1pbkxvZF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNwYXJzZUJpbmRpbmcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlQmluZGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3BhcnNlQmluZGluZyA9IHNwYXJzZUJpbmRpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTcGFyc2VSZXNpZGVuY3lCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlUmVzaWRlbmN5QnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcGFyc2VSZXNpZGVuY3lCdWZmZXIgPSBzcGFyc2VSZXNpZGVuY3lCdWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTcGFyc2VSZXNpZGVuY3lJbWFnZTJEKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNwYXJzZVJlc2lkZW5jeUltYWdlMkRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNwYXJzZVJlc2lkZW5jeUltYWdlMkQgPSBzcGFyc2VSZXNpZGVuY3lJbWFnZTJEXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0U3BhcnNlUmVzaWRlbmN5SW1hZ2UzRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3lJbWFnZTNEXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcGFyc2VSZXNpZGVuY3lJbWFnZTNEID0gc3BhcnNlUmVzaWRlbmN5SW1hZ2UzRF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcGFyc2VSZXNpZGVuY3kyU2FtcGxlcyA9IHNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzICYgc2V0U3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlUmVzaWRlbmN5NFNhbXBsZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNwYXJzZVJlc2lkZW5jeTRTYW1wbGVzID0gc3BhcnNlUmVzaWRlbmN5NFNhbXBsZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRTcGFyc2VSZXNpZGVuY3k4U2FtcGxlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3k4U2FtcGxlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMgPSBzcGFyc2VSZXNpZGVuY3k4U2FtcGxlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlcyA9IHNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldFNwYXJzZVJlc2lkZW5jeUFsaWFzZWQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlUmVzaWRlbmN5QWxpYXNlZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3BhcnNlUmVzaWRlbmN5QWxpYXNlZCA9IHNwYXJzZVJlc2lkZW5jeUFsaWFzZWRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJiBzZXRWYXJpYWJsZU11bHRpc2FtcGxlUmF0ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2YXJpYWJsZU11bHRpc2FtcGxlUmF0ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmFyaWFibGVNdWx0aXNhbXBsZVJhdGUgPSB2YXJpYWJsZU11bHRpc2FtcGxlUmF0ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAmIHNldEluaGVyaXRlZFF1ZXJpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgaW5oZXJpdGVkUXVlcmllc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5oZXJpdGVkUXVlcmllcyA9IGluaGVyaXRlZFF1ZXJpZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZUZlYXR1cmVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggcm9idXN0QnVmZmVyQWNjZXNzID09IHJocy5yb2J1c3RCdWZmZXJBY2Nlc3MgKQorICAgICAgICAgICYmICggZnVsbERyYXdJbmRleFVpbnQzMiA9PSByaHMuZnVsbERyYXdJbmRleFVpbnQzMiApCisgICAgICAgICAgJiYgKCBpbWFnZUN1YmVBcnJheSA9PSByaHMuaW1hZ2VDdWJlQXJyYXkgKQorICAgICAgICAgICYmICggaW5kZXBlbmRlbnRCbGVuZCA9PSByaHMuaW5kZXBlbmRlbnRCbGVuZCApCisgICAgICAgICAgJiYgKCBnZW9tZXRyeVNoYWRlciA9PSByaHMuZ2VvbWV0cnlTaGFkZXIgKQorICAgICAgICAgICYmICggdGVzc2VsbGF0aW9uU2hhZGVyID09IHJocy50ZXNzZWxsYXRpb25TaGFkZXIgKQorICAgICAgICAgICYmICggc2FtcGxlUmF0ZVNoYWRpbmcgPT0gcmhzLnNhbXBsZVJhdGVTaGFkaW5nICkKKyAgICAgICAgICAmJiAoIGR1YWxTcmNCbGVuZCA9PSByaHMuZHVhbFNyY0JsZW5kICkKKyAgICAgICAgICAmJiAoIGxvZ2ljT3AgPT0gcmhzLmxvZ2ljT3AgKQorICAgICAgICAgICYmICggbXVsdGlEcmF3SW5kaXJlY3QgPT0gcmhzLm11bHRpRHJhd0luZGlyZWN0ICkKKyAgICAgICAgICAmJiAoIGRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2UgPT0gcmhzLmRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2UgKQorICAgICAgICAgICYmICggZGVwdGhDbGFtcCA9PSByaHMuZGVwdGhDbGFtcCApCisgICAgICAgICAgJiYgKCBkZXB0aEJpYXNDbGFtcCA9PSByaHMuZGVwdGhCaWFzQ2xhbXAgKQorICAgICAgICAgICYmICggZmlsbE1vZGVOb25Tb2xpZCA9PSByaHMuZmlsbE1vZGVOb25Tb2xpZCApCisgICAgICAgICAgJiYgKCBkZXB0aEJvdW5kcyA9PSByaHMuZGVwdGhCb3VuZHMgKQorICAgICAgICAgICYmICggd2lkZUxpbmVzID09IHJocy53aWRlTGluZXMgKQorICAgICAgICAgICYmICggbGFyZ2VQb2ludHMgPT0gcmhzLmxhcmdlUG9pbnRzICkKKyAgICAgICAgICAmJiAoIGFscGhhVG9PbmUgPT0gcmhzLmFscGhhVG9PbmUgKQorICAgICAgICAgICYmICggbXVsdGlWaWV3cG9ydCA9PSByaHMubXVsdGlWaWV3cG9ydCApCisgICAgICAgICAgJiYgKCBzYW1wbGVyQW5pc290cm9weSA9PSByaHMuc2FtcGxlckFuaXNvdHJvcHkgKQorICAgICAgICAgICYmICggdGV4dHVyZUNvbXByZXNzaW9uRVRDMiA9PSByaHMudGV4dHVyZUNvbXByZXNzaW9uRVRDMiApCisgICAgICAgICAgJiYgKCB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUiA9PSByaHMudGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIgKQorICAgICAgICAgICYmICggdGV4dHVyZUNvbXByZXNzaW9uQkMgPT0gcmhzLnRleHR1cmVDb21wcmVzc2lvbkJDICkKKyAgICAgICAgICAmJiAoIG9jY2x1c2lvblF1ZXJ5UHJlY2lzZSA9PSByaHMub2NjbHVzaW9uUXVlcnlQcmVjaXNlICkKKyAgICAgICAgICAmJiAoIHBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5ID09IHJocy5waXBlbGluZVN0YXRpc3RpY3NRdWVyeSApCisgICAgICAgICAgJiYgKCB2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3MgPT0gcmhzLnZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyApCisgICAgICAgICAgJiYgKCBmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MgPT0gcmhzLmZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyApCisgICAgICAgICAgJiYgKCBzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSA9PSByaHMuc2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUgKQorICAgICAgICAgICYmICggc2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCA9PSByaHMuc2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCApCisgICAgICAgICAgJiYgKCBzaGFkZXJTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHMgPT0gcmhzLnNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0cyApCisgICAgICAgICAgJiYgKCBzaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZSA9PSByaHMuc2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUgKQorICAgICAgICAgICYmICggc2hhZGVyU3RvcmFnZUltYWdlUmVhZFdpdGhvdXRGb3JtYXQgPT0gcmhzLnNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0ICkKKyAgICAgICAgICAmJiAoIHNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdCA9PSByaHMuc2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0ICkKKyAgICAgICAgICAmJiAoIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyA9PSByaHMuc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nICkKKyAgICAgICAgICAmJiAoIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nID09IHJocy5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyApCisgICAgICAgICAgJiYgKCBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcgPT0gcmhzLnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyApCisgICAgICAgICAgJiYgKCBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyA9PSByaHMuc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmcgKQorICAgICAgICAgICYmICggc2hhZGVyQ2xpcERpc3RhbmNlID09IHJocy5zaGFkZXJDbGlwRGlzdGFuY2UgKQorICAgICAgICAgICYmICggc2hhZGVyQ3VsbERpc3RhbmNlID09IHJocy5zaGFkZXJDdWxsRGlzdGFuY2UgKQorICAgICAgICAgICYmICggc2hhZGVyRmxvYXQ2NCA9PSByaHMuc2hhZGVyRmxvYXQ2NCApCisgICAgICAgICAgJiYgKCBzaGFkZXJJbnQ2NCA9PSByaHMuc2hhZGVySW50NjQgKQorICAgICAgICAgICYmICggc2hhZGVySW50MTYgPT0gcmhzLnNoYWRlckludDE2ICkKKyAgICAgICAgICAmJiAoIHNoYWRlclJlc291cmNlUmVzaWRlbmN5ID09IHJocy5zaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSApCisgICAgICAgICAgJiYgKCBzaGFkZXJSZXNvdXJjZU1pbkxvZCA9PSByaHMuc2hhZGVyUmVzb3VyY2VNaW5Mb2QgKQorICAgICAgICAgICYmICggc3BhcnNlQmluZGluZyA9PSByaHMuc3BhcnNlQmluZGluZyApCisgICAgICAgICAgJiYgKCBzcGFyc2VSZXNpZGVuY3lCdWZmZXIgPT0gcmhzLnNwYXJzZVJlc2lkZW5jeUJ1ZmZlciApCisgICAgICAgICAgJiYgKCBzcGFyc2VSZXNpZGVuY3lJbWFnZTJEID09IHJocy5zcGFyc2VSZXNpZGVuY3lJbWFnZTJEICkKKyAgICAgICAgICAmJiAoIHNwYXJzZVJlc2lkZW5jeUltYWdlM0QgPT0gcmhzLnNwYXJzZVJlc2lkZW5jeUltYWdlM0QgKQorICAgICAgICAgICYmICggc3BhcnNlUmVzaWRlbmN5MlNhbXBsZXMgPT0gcmhzLnNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzICkKKyAgICAgICAgICAmJiAoIHNwYXJzZVJlc2lkZW5jeTRTYW1wbGVzID09IHJocy5zcGFyc2VSZXNpZGVuY3k0U2FtcGxlcyApCisgICAgICAgICAgJiYgKCBzcGFyc2VSZXNpZGVuY3k4U2FtcGxlcyA9PSByaHMuc3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMgKQorICAgICAgICAgICYmICggc3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzID09IHJocy5zcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMgKQorICAgICAgICAgICYmICggc3BhcnNlUmVzaWRlbmN5QWxpYXNlZCA9PSByaHMuc3BhcnNlUmVzaWRlbmN5QWxpYXNlZCApCisgICAgICAgICAgJiYgKCB2YXJpYWJsZU11bHRpc2FtcGxlUmF0ZSA9PSByaHMudmFyaWFibGVNdWx0aXNhbXBsZVJhdGUgKQorICAgICAgICAgICYmICggaW5oZXJpdGVkUXVlcmllcyA9PSByaHMuaW5oZXJpdGVkUXVlcmllcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJvYnVzdEJ1ZmZlckFjY2VzczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZ1bGxEcmF3SW5kZXhVaW50MzI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbWFnZUN1YmVBcnJheTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGluZGVwZW5kZW50QmxlbmQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBnZW9tZXRyeVNoYWRlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRlc3NlbGxhdGlvblNoYWRlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNhbXBsZVJhdGVTaGFkaW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZHVhbFNyY0JsZW5kOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbG9naWNPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG11bHRpRHJhd0luZGlyZWN0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlcHRoQ2xhbXA7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aEJpYXNDbGFtcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZpbGxNb2RlTm9uU29saWQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aEJvdW5kczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHdpZGVMaW5lczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGxhcmdlUG9pbnRzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYWxwaGFUb09uZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG11bHRpVmlld3BvcnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzYW1wbGVyQW5pc290cm9weTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRleHR1cmVDb21wcmVzc2lvbkVUQzI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRleHR1cmVDb21wcmVzc2lvbkJDOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgb2NjbHVzaW9uUXVlcnlQcmVjaXNlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGlwZWxpbmVTdGF0aXN0aWNzUXVlcnk7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckNsaXBEaXN0YW5jZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckN1bGxEaXN0YW5jZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckZsb2F0NjQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJJbnQ2NDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckludDE2OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyUmVzb3VyY2VSZXNpZGVuY3k7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSZXNvdXJjZU1pbkxvZDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNwYXJzZUJpbmRpbmc7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3lCdWZmZXI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3lJbWFnZTJEOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlUmVzaWRlbmN5SW1hZ2UzRDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3BhcnNlUmVzaWRlbmN5NFNhbXBsZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcGFyc2VSZXNpZGVuY3k4U2FtcGxlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNwYXJzZVJlc2lkZW5jeUFsaWFzZWQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2YXJpYWJsZU11bHRpc2FtcGxlUmF0ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGluaGVyaXRlZFF1ZXJpZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlRmVhdHVyZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERldmljZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZUNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUNyZWF0ZUluZm9Db3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUNyZWF0ZUluZm8qIHBRdWV1ZUNyZWF0ZUluZm9zXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZW5hYmxlZExheWVyQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogcHBFbmFibGVkTGF5ZXJOYW1lc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVuYWJsZWRFeHRlbnNpb25Db3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBwcEVuYWJsZWRFeHRlbnNpb25OYW1lc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzKiBwRW5hYmxlZEZlYXR1cmVzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBxdWV1ZUNyZWF0ZUluZm9Db3VudCggcXVldWVDcmVhdGVJbmZvQ291bnRfICkKKyAgICAgICwgcFF1ZXVlQ3JlYXRlSW5mb3MoIHBRdWV1ZUNyZWF0ZUluZm9zXyApCisgICAgICAsIGVuYWJsZWRMYXllckNvdW50KCBlbmFibGVkTGF5ZXJDb3VudF8gKQorICAgICAgLCBwcEVuYWJsZWRMYXllck5hbWVzKCBwcEVuYWJsZWRMYXllck5hbWVzXyApCisgICAgICAsIGVuYWJsZWRFeHRlbnNpb25Db3VudCggZW5hYmxlZEV4dGVuc2lvbkNvdW50XyApCisgICAgICAsIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKCBwcEVuYWJsZWRFeHRlbnNpb25OYW1lc18gKQorICAgICAgLCBwRW5hYmxlZEZlYXR1cmVzKCBwRW5hYmxlZEZlYXR1cmVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIERldmljZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VDcmVhdGVJbmZvKCBWa0RldmljZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0RldmljZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmIHNldFF1ZXVlQ3JlYXRlSW5mb0NvdW50KCB1aW50MzJfdCBxdWV1ZUNyZWF0ZUluZm9Db3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcXVldWVDcmVhdGVJbmZvQ291bnQgPSBxdWV1ZUNyZWF0ZUluZm9Db3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmIHNldFBRdWV1ZUNyZWF0ZUluZm9zKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlUXVldWVDcmVhdGVJbmZvKiBwUXVldWVDcmVhdGVJbmZvc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFF1ZXVlQ3JlYXRlSW5mb3MgPSBwUXVldWVDcmVhdGVJbmZvc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmIHNldEVuYWJsZWRMYXllckNvdW50KCB1aW50MzJfdCBlbmFibGVkTGF5ZXJDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZW5hYmxlZExheWVyQ291bnQgPSBlbmFibGVkTGF5ZXJDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmIHNldFBwRW5hYmxlZExheWVyTmFtZXMoIGNvbnN0IGNoYXIqIGNvbnN0KiBwcEVuYWJsZWRMYXllck5hbWVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwcEVuYWJsZWRMYXllck5hbWVzID0gcHBFbmFibGVkTGF5ZXJOYW1lc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmIHNldEVuYWJsZWRFeHRlbnNpb25Db3VudCggdWludDMyX3QgZW5hYmxlZEV4dGVuc2lvbkNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBlbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBlbmFibGVkRXh0ZW5zaW9uQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUNyZWF0ZUluZm8gJiBzZXRQcEVuYWJsZWRFeHRlbnNpb25OYW1lcyggY29uc3QgY2hhciogY29uc3QqIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VDcmVhdGVJbmZvICYgc2V0UEVuYWJsZWRGZWF0dXJlcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMqIHBFbmFibGVkRmVhdHVyZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBFbmFibGVkRmVhdHVyZXMgPSBwRW5hYmxlZEZlYXR1cmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHF1ZXVlQ3JlYXRlSW5mb0NvdW50ID09IHJocy5xdWV1ZUNyZWF0ZUluZm9Db3VudCApCisgICAgICAgICAgJiYgKCBwUXVldWVDcmVhdGVJbmZvcyA9PSByaHMucFF1ZXVlQ3JlYXRlSW5mb3MgKQorICAgICAgICAgICYmICggZW5hYmxlZExheWVyQ291bnQgPT0gcmhzLmVuYWJsZWRMYXllckNvdW50ICkKKyAgICAgICAgICAmJiAoIHBwRW5hYmxlZExheWVyTmFtZXMgPT0gcmhzLnBwRW5hYmxlZExheWVyTmFtZXMgKQorICAgICAgICAgICYmICggZW5hYmxlZEV4dGVuc2lvbkNvdW50ID09IHJocy5lbmFibGVkRXh0ZW5zaW9uQ291bnQgKQorICAgICAgICAgICYmICggcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPT0gcmhzLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzICkKKyAgICAgICAgICAmJiAoIHBFbmFibGVkRmVhdHVyZXMgPT0gcmhzLnBFbmFibGVkRmVhdHVyZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERldmljZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IHF1ZXVlQ3JlYXRlSW5mb0NvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUNyZWF0ZUluZm8qIHBRdWV1ZUNyZWF0ZUluZm9zOworICAgIHVpbnQzMl90IGVuYWJsZWRMYXllckNvdW50OworICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBwcEVuYWJsZWRMYXllck5hbWVzOworICAgIHVpbnQzMl90IGVuYWJsZWRFeHRlbnNpb25Db3VudDsKKyAgICBjb25zdCBjaGFyKiBjb25zdCogcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXM7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMqIHBFbmFibGVkRmVhdHVyZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGV2aWNlQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtEZXZpY2VDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZUNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERldmljZUV2ZW50SW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlRXZlbnRJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlRXZlbnRUeXBlRVhUIGRldmljZUV2ZW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VFdmVudFR5cGVFWFQ6OmVEaXNwbGF5SG90cGx1ZyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGV2aWNlRXZlbnQoIGRldmljZUV2ZW50XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VFdmVudEluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VFdmVudEluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUV2ZW50SW5mb0VYVCApIC0gb2Zmc2V0b2YoIERldmljZUV2ZW50SW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUV2ZW50SW5mb0VYVCggVmtEZXZpY2VFdmVudEluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGV2aWNlRXZlbnRJbmZvRVhUJiBvcGVyYXRvcj0oIFZrRGV2aWNlRXZlbnRJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUV2ZW50SW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VFdmVudEluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUV2ZW50SW5mb0VYVCAmIHNldERldmljZUV2ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlRXZlbnRUeXBlRVhUIGRldmljZUV2ZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXZpY2VFdmVudCA9IGRldmljZUV2ZW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUV2ZW50SW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUV2ZW50SW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUV2ZW50SW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXZpY2VFdmVudEluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRldmljZUV2ZW50ID09IHJocy5kZXZpY2VFdmVudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGV2aWNlRXZlbnRJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURldmljZUV2ZW50SW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUV2ZW50VHlwZUVYVCBkZXZpY2VFdmVudDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXZpY2VFdmVudEluZm9FWFQgKSA9PSBzaXplb2YoIFZrRGV2aWNlRXZlbnRJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZUV2ZW50SW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBjb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydCggY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYICkgLSBvZmZzZXRvZiggRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgoIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYJiBvcGVyYXRvcj0oIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggJiBzZXRDb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQgPSBjb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0ID09IHJocy5jb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggKSA9PSBzaXplb2YoIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgoIHVpbnQzMl90IG1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heE9iamVjdEVudHJ5Q291bnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pblNlcXVlbmNlQ291bnRCdWZmZXJPZmZzZXRBbGlnbm1lbnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWluU2VxdWVuY2VJbmRleEJ1ZmZlck9mZnNldEFsaWdubWVudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtaW5Db21tYW5kc1Rva2VuQnVmZmVyT2Zmc2V0QWxpZ25tZW50XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50KCBtYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudF8gKQorICAgICAgLCBtYXhPYmplY3RFbnRyeUNvdW50cyggbWF4T2JqZWN0RW50cnlDb3VudHNfICkKKyAgICAgICwgbWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudCggbWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudF8gKQorICAgICAgLCBtaW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50KCBtaW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50XyApCisgICAgICAsIG1pbkNvbW1hbmRzVG9rZW5CdWZmZXJPZmZzZXRBbGlnbm1lbnQoIG1pbkNvbW1hbmRzVG9rZW5CdWZmZXJPZmZzZXRBbGlnbm1lbnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYICkgLSBvZmZzZXRvZiggRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCggVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCYgb3BlcmF0b3I9KCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCAmIHNldE1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50KCB1aW50MzJfdCBtYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWF4SW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuQ291bnQgPSBtYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggJiBzZXRNYXhPYmplY3RFbnRyeUNvdW50cyggdWludDMyX3QgbWF4T2JqZWN0RW50cnlDb3VudHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1heE9iamVjdEVudHJ5Q291bnRzID0gbWF4T2JqZWN0RW50cnlDb3VudHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYICYgc2V0TWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudCggdWludDMyX3QgbWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudCA9IG1pblNlcXVlbmNlQ291bnRCdWZmZXJPZmZzZXRBbGlnbm1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYICYgc2V0TWluU2VxdWVuY2VJbmRleEJ1ZmZlck9mZnNldEFsaWdubWVudCggdWludDMyX3QgbWluU2VxdWVuY2VJbmRleEJ1ZmZlck9mZnNldEFsaWdubWVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWluU2VxdWVuY2VJbmRleEJ1ZmZlck9mZnNldEFsaWdubWVudCA9IG1pblNlcXVlbmNlSW5kZXhCdWZmZXJPZmZzZXRBbGlnbm1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYICYgc2V0TWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudCggdWludDMyX3QgbWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudCA9IG1pbkNvbW1hbmRzVG9rZW5CdWZmZXJPZmZzZXRBbGlnbm1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50ID09IHJocy5tYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudCApCisgICAgICAgICAgJiYgKCBtYXhPYmplY3RFbnRyeUNvdW50cyA9PSByaHMubWF4T2JqZWN0RW50cnlDb3VudHMgKQorICAgICAgICAgICYmICggbWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudCA9PSByaHMubWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudCApCisgICAgICAgICAgJiYgKCBtaW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50ID09IHJocy5taW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50ICkKKyAgICAgICAgICAmJiAoIG1pbkNvbW1hbmRzVG9rZW5CdWZmZXJPZmZzZXRBbGlnbm1lbnQgPT0gcmhzLm1pbkNvbW1hbmRzVG9rZW5CdWZmZXJPZmZzZXRBbGlnbm1lbnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBtYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudDsKKyAgICB1aW50MzJfdCBtYXhPYmplY3RFbnRyeUNvdW50czsKKyAgICB1aW50MzJfdCBtaW5TZXF1ZW5jZUNvdW50QnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIHVpbnQzMl90IG1pblNlcXVlbmNlSW5kZXhCdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgdWludDMyX3QgbWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCApID09IHNpemVvZiggVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyggdWludDMyX3QgcmVzb3VyY2VEZXZpY2VJbmRleF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeURldmljZUluZGV4XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHJlc291cmNlRGV2aWNlSW5kZXgoIHJlc291cmNlRGV2aWNlSW5kZXhfICkKKyAgICAgICwgbWVtb3J5RGV2aWNlSW5kZXgoIG1lbW9yeURldmljZUluZGV4XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyApIC0gb2Zmc2V0b2YoIERldmljZUdyb3VwQmluZFNwYXJzZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvKCBWa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyYgb3BlcmF0b3I9KCBWa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvICYgc2V0UmVzb3VyY2VEZXZpY2VJbmRleCggdWludDMyX3QgcmVzb3VyY2VEZXZpY2VJbmRleF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVzb3VyY2VEZXZpY2VJbmRleCA9IHJlc291cmNlRGV2aWNlSW5kZXhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwQmluZFNwYXJzZUluZm8gJiBzZXRNZW1vcnlEZXZpY2VJbmRleCggdWludDMyX3QgbWVtb3J5RGV2aWNlSW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbW9yeURldmljZUluZGV4ID0gbWVtb3J5RGV2aWNlSW5kZXhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCByZXNvdXJjZURldmljZUluZGV4ID09IHJocy5yZXNvdXJjZURldmljZUluZGV4ICkKKyAgICAgICAgICAmJiAoIG1lbW9yeURldmljZUluZGV4ID09IHJocy5tZW1vcnlEZXZpY2VJbmRleCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCByZXNvdXJjZURldmljZUluZGV4OworICAgIHVpbnQzMl90IG1lbW9yeURldmljZUluZGV4OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERldmljZUdyb3VwQmluZFNwYXJzZUluZm8gKSA9PSBzaXplb2YoIFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyggdWludDMyX3QgZGV2aWNlTWFza18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkZXZpY2VNYXNrKCBkZXZpY2VNYXNrXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyApIC0gb2Zmc2V0b2YoIERldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyggVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBvcGVyYXRvcj0oIFZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAmIHNldERldmljZU1hc2soIHVpbnQzMl90IGRldmljZU1hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRldmljZU1hc2sgPSBkZXZpY2VNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRldmljZU1hc2sgPT0gcmhzLmRldmljZU1hc2sgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGRldmljZU1hc2s7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvICkgPT0gc2l6ZW9mKCBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKCB1aW50MzJfdCBwaHlzaWNhbERldmljZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UqIHBQaHlzaWNhbERldmljZXNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcGh5c2ljYWxEZXZpY2VDb3VudCggcGh5c2ljYWxEZXZpY2VDb3VudF8gKQorICAgICAgLCBwUGh5c2ljYWxEZXZpY2VzKCBwUGh5c2ljYWxEZXZpY2VzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIERldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyggVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyAmIHNldFBoeXNpY2FsRGV2aWNlQ291bnQoIHVpbnQzMl90IHBoeXNpY2FsRGV2aWNlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBoeXNpY2FsRGV2aWNlQ291bnQgPSBwaHlzaWNhbERldmljZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gJiBzZXRQUGh5c2ljYWxEZXZpY2VzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UqIHBQaHlzaWNhbERldmljZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBQaHlzaWNhbERldmljZXMgPSBwUGh5c2ljYWxEZXZpY2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHBoeXNpY2FsRGV2aWNlQ291bnQgPT0gcmhzLnBoeXNpY2FsRGV2aWNlQ291bnQgKQorICAgICAgICAgICYmICggcFBoeXNpY2FsRGV2aWNlcyA9PSByaHMucFBoeXNpY2FsRGV2aWNlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgcGh5c2ljYWxEZXZpY2VDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UqIHBQaHlzaWNhbERldmljZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUgorICB7CisgICAgRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKCBzdGQ6OmFycmF5PHVpbnQzMl90LFZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRT4gY29uc3QmIHByZXNlbnRNYXNrXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIgbW9kZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUigpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwcmVzZW50TWFza3t9CisgICAgICAsIG1vZGVzKCBtb2Rlc18gKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8dWludDMyX3QsVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFLFZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRT46OmNvcHkoIHByZXNlbnRNYXNrLCBwcmVzZW50TWFza18gKTsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgKSAtIG9mZnNldG9mKCBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiYgb3BlcmF0b3I9KCBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIHByZXNlbnRNYXNrLCByaHMucHJlc2VudE1hc2ssIFZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRSAqIHNpemVvZiggdWludDMyX3QgKSApID09IDAgKQorICAgICAgICAgICYmICggbW9kZXMgPT0gcmhzLm1vZGVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBwcmVzZW50TWFza1tWS19NQVhfREVWSUNFX0dST1VQX1NJWkVdOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIgbW9kZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERldmljZUdyb3VwUHJlc2VudEluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZUdyb3VwUHJlc2VudEluZm9LSFIoIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBEZXZpY2VNYXNrc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIgbW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSOjplTG9jYWwgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN3YXBjaGFpbkNvdW50KCBzd2FwY2hhaW5Db3VudF8gKQorICAgICAgLCBwRGV2aWNlTWFza3MoIHBEZXZpY2VNYXNrc18gKQorICAgICAgLCBtb2RlKCBtb2RlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiApIC0gb2Zmc2V0b2YoIERldmljZUdyb3VwUHJlc2VudEluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSKCBWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiYgb3BlcmF0b3I9KCBWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSICYgc2V0U3dhcGNoYWluQ291bnQoIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzd2FwY2hhaW5Db3VudCA9IHN3YXBjaGFpbkNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSICYgc2V0UERldmljZU1hc2tzKCBjb25zdCB1aW50MzJfdCogcERldmljZU1hc2tzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRGV2aWNlTWFza3MgPSBwRGV2aWNlTWFza3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwUHJlc2VudEluZm9LSFIgJiBzZXRNb2RlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIG1vZGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1vZGUgPSBtb2RlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3dhcGNoYWluQ291bnQgPT0gcmhzLnN3YXBjaGFpbkNvdW50ICkKKyAgICAgICAgICAmJiAoIHBEZXZpY2VNYXNrcyA9PSByaHMucERldmljZU1hc2tzICkKKyAgICAgICAgICAmJiAoIG1vZGUgPT0gcmhzLm1vZGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERldmljZUdyb3VwUHJlc2VudEluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3Qgc3dhcGNoYWluQ291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBEZXZpY2VNYXNrczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIG1vZGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiApID09IHNpemVvZiggVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZUdyb3VwUHJlc2VudEluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvKCB1aW50MzJfdCBkZXZpY2VNYXNrXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VSZW5kZXJBcmVhQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBEZXZpY2VSZW5kZXJBcmVhc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkZXZpY2VNYXNrKCBkZXZpY2VNYXNrXyApCisgICAgICAsIGRldmljZVJlbmRlckFyZWFDb3VudCggZGV2aWNlUmVuZGVyQXJlYUNvdW50XyApCisgICAgICAsIHBEZXZpY2VSZW5kZXJBcmVhcyggcERldmljZVJlbmRlckFyZWFzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyApIC0gb2Zmc2V0b2YoIERldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyggVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvJiBvcGVyYXRvcj0oIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyAmIHNldERldmljZU1hc2soIHVpbnQzMl90IGRldmljZU1hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRldmljZU1hc2sgPSBkZXZpY2VNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gJiBzZXREZXZpY2VSZW5kZXJBcmVhQ291bnQoIHVpbnQzMl90IGRldmljZVJlbmRlckFyZWFDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGV2aWNlUmVuZGVyQXJlYUNvdW50ID0gZGV2aWNlUmVuZGVyQXJlYUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gJiBzZXRQRGV2aWNlUmVuZGVyQXJlYXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBEZXZpY2VSZW5kZXJBcmVhc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcERldmljZVJlbmRlckFyZWFzID0gcERldmljZVJlbmRlckFyZWFzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRldmljZU1hc2sgPT0gcmhzLmRldmljZU1hc2sgKQorICAgICAgICAgICYmICggZGV2aWNlUmVuZGVyQXJlYUNvdW50ID09IHJocy5kZXZpY2VSZW5kZXJBcmVhQ291bnQgKQorICAgICAgICAgICYmICggcERldmljZVJlbmRlckFyZWFzID09IHJocy5wRGV2aWNlUmVuZGVyQXJlYXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGRldmljZU1hc2s7CisgICAgdWludDMyX3QgZGV2aWNlUmVuZGVyQXJlYUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBEZXZpY2VSZW5kZXJBcmVhczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gKSA9PSBzaXplb2YoIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGV2aWNlR3JvdXBTdWJtaXRJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXZpY2VHcm91cFN1Ym1pdEluZm8oIHVpbnQzMl90IHdhaXRTZW1hcGhvcmVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2lnbmFsU2VtYXBob3JlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB3YWl0U2VtYXBob3JlQ291bnQoIHdhaXRTZW1hcGhvcmVDb3VudF8gKQorICAgICAgLCBwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMoIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlc18gKQorICAgICAgLCBjb21tYW5kQnVmZmVyQ291bnQoIGNvbW1hbmRCdWZmZXJDb3VudF8gKQorICAgICAgLCBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzKCBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzXyApCisgICAgICAsIHNpZ25hbFNlbWFwaG9yZUNvdW50KCBzaWduYWxTZW1hcGhvcmVDb3VudF8gKQorICAgICAgLCBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyggcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwU3VibWl0SW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwU3VibWl0SW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBTdWJtaXRJbmZvICkgLSBvZmZzZXRvZiggRGV2aWNlR3JvdXBTdWJtaXRJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBTdWJtaXRJbmZvKCBWa0RldmljZUdyb3VwU3VibWl0SW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFN1Ym1pdEluZm8mIG9wZXJhdG9yPSggVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBTdWJtaXRJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwU3VibWl0SW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBTdWJtaXRJbmZvICYgc2V0V2FpdFNlbWFwaG9yZUNvdW50KCB1aW50MzJfdCB3YWl0U2VtYXBob3JlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHdhaXRTZW1hcGhvcmVDb3VudCA9IHdhaXRTZW1hcGhvcmVDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBTdWJtaXRJbmZvICYgc2V0UFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzKCBjb25zdCB1aW50MzJfdCogcFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMgPSBwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwU3VibWl0SW5mbyAmIHNldENvbW1hbmRCdWZmZXJDb3VudCggdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb21tYW5kQnVmZmVyQ291bnQgPSBjb21tYW5kQnVmZmVyQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwU3VibWl0SW5mbyAmIHNldFBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MoIGNvbnN0IHVpbnQzMl90KiBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzID0gcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBTdWJtaXRJbmZvICYgc2V0U2lnbmFsU2VtYXBob3JlQ291bnQoIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaWduYWxTZW1hcGhvcmVDb3VudCA9IHNpZ25hbFNlbWFwaG9yZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFN1Ym1pdEluZm8gJiBzZXRQU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyggY29uc3QgdWludDMyX3QqIHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwU3VibWl0SW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZUdyb3VwU3VibWl0SW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwU3VibWl0SW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEZXZpY2VHcm91cFN1Ym1pdEluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHdhaXRTZW1hcGhvcmVDb3VudCA9PSByaHMud2FpdFNlbWFwaG9yZUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9PSByaHMucFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzICkKKyAgICAgICAgICAmJiAoIGNvbW1hbmRCdWZmZXJDb3VudCA9PSByaHMuY29tbWFuZEJ1ZmZlckNvdW50ICkKKyAgICAgICAgICAmJiAoIHBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MgPT0gcmhzLnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MgKQorICAgICAgICAgICYmICggc2lnbmFsU2VtYXBob3JlQ291bnQgPT0gcmhzLnNpZ25hbFNlbWFwaG9yZUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzID09IHJocy5wU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGV2aWNlR3JvdXBTdWJtaXRJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURldmljZUdyb3VwU3VibWl0SW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3Qgd2FpdFNlbWFwaG9yZUNvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXM7CisgICAgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzOworICAgIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZUNvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXZpY2VHcm91cFN1Ym1pdEluZm8gKSA9PSBzaXplb2YoIFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZUdyb3VwU3VibWl0SW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIgbW9kZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUigpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtb2RlcyggbW9kZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICkgLSBvZmZzZXRvZiggRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKCBWa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICYgc2V0TW9kZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIgbW9kZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1vZGVzID0gbW9kZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbW9kZXMgPT0gcmhzLm1vZGVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSIG1vZGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiApID09IHNpemVvZiggVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnlfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtZW1vcnkoIG1lbW9yeV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgKSAtIG9mZnNldG9mKCBEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIoIFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgJiBzZXRNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnkgPSBtZW1vcnlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbWVtb3J5ID09IHJocy5tZW1vcnkgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiApID09IHNpemVvZiggVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTUQgb3ZlcmFsbG9jYXRpb25CZWhhdmlvcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5T3ZlcmFsbG9jYXRpb25CZWhhdmlvckFNRDo6ZURlZmF1bHQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG92ZXJhbGxvY2F0aW9uQmVoYXZpb3IoIG92ZXJhbGxvY2F0aW9uQmVoYXZpb3JfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EICkgLSBvZmZzZXRvZiggRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1ELCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EKCBWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQmIG9wZXJhdG9yPSggVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EICYgc2V0T3ZlcmFsbG9jYXRpb25CZWhhdmlvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTUQgb3ZlcmFsbG9jYXRpb25CZWhhdmlvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb3ZlcmFsbG9jYXRpb25CZWhhdmlvciA9IG92ZXJhbGxvY2F0aW9uQmVoYXZpb3JfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggb3ZlcmFsbG9jYXRpb25CZWhhdmlvciA9PSByaHMub3ZlcmFsbG9jYXRpb25CZWhhdmlvciApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTUQgb3ZlcmFsbG9jYXRpb25CZWhhdmlvcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQgKSA9PSBzaXplb2YoIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVHbG9iYWxQcmlvcml0eUVYVCBnbG9iYWxQcmlvcml0eV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVHbG9iYWxQcmlvcml0eUVYVDo6ZUxvdyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZ2xvYmFsUHJpb3JpdHkoIGdsb2JhbFByaW9yaXR5XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIERldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQoIFZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQgJiBzZXRHbG9iYWxQcmlvcml0eSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlR2xvYmFsUHJpb3JpdHlFWFQgZ2xvYmFsUHJpb3JpdHlfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGdsb2JhbFByaW9yaXR5ID0gZ2xvYmFsUHJpb3JpdHlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGdsb2JhbFByaW9yaXR5ID09IHJocy5nbG9iYWxQcmlvcml0eSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUdsb2JhbFByaW9yaXR5RVhUIGdsb2JhbFByaW9yaXR5OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEZXZpY2VRdWV1ZUluZm8yCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEZXZpY2VRdWV1ZUluZm8yKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlUXVldWVDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlUXVldWVDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUluZGV4XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBxdWV1ZUZhbWlseUluZGV4KCBxdWV1ZUZhbWlseUluZGV4XyApCisgICAgICAsIHF1ZXVlSW5kZXgoIHF1ZXVlSW5kZXhfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVF1ZXVlSW5mbzIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUluZm8yIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUluZm8yICkgLSBvZmZzZXRvZiggRGV2aWNlUXVldWVJbmZvMiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZVF1ZXVlSW5mbzIoIFZrRGV2aWNlUXVldWVJbmZvMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEZXZpY2VRdWV1ZUluZm8yJiBvcGVyYXRvcj0oIFZrRGV2aWNlUXVldWVJbmZvMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VRdWV1ZUluZm8yIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZVF1ZXVlSW5mbzIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZVF1ZXVlSW5mbzIgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVF1ZXVlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZVF1ZXVlSW5mbzIgJiBzZXRRdWV1ZUZhbWlseUluZGV4KCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBxdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVJbmZvMiAmIHNldFF1ZXVlSW5kZXgoIHVpbnQzMl90IHF1ZXVlSW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHF1ZXVlSW5kZXggPSBxdWV1ZUluZGV4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RldmljZVF1ZXVlSW5mbzIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlUXVldWVJbmZvMiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZVF1ZXVlSW5mbzIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGV2aWNlUXVldWVJbmZvMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHF1ZXVlRmFtaWx5SW5kZXggPT0gcmhzLnF1ZXVlRmFtaWx5SW5kZXggKQorICAgICAgICAgICYmICggcXVldWVJbmRleCA9PSByaHMucXVldWVJbmRleCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGV2aWNlUXVldWVJbmZvMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEZXZpY2VRdWV1ZUluZm8yOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlUXVldWVDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4OworICAgIHVpbnQzMl90IHF1ZXVlSW5kZXg7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGV2aWNlUXVldWVJbmZvMiApID09IHNpemVvZiggVmtEZXZpY2VRdWV1ZUluZm8yICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERldmljZVF1ZXVlSW5mbzI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERpc3BhdGNoSW5kaXJlY3RDb21tYW5kCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCggdWludDMyX3QgeF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB5XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHpfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogeCggeF8gKQorICAgICAgLCB5KCB5XyApCisgICAgICAsIHooIHpfICkKKyAgICB7fQorCisgICAgRGlzcGF0Y2hJbmRpcmVjdENvbW1hbmQoIFZrRGlzcGF0Y2hJbmRpcmVjdENvbW1hbmQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGlzcGF0Y2hJbmRpcmVjdENvbW1hbmQmIG9wZXJhdG9yPSggVmtEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCAmIHNldFgoIHVpbnQzMl90IHhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHggPSB4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCAmIHNldFkoIHVpbnQzMl90IHlfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHkgPSB5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCAmIHNldFooIHVpbnQzMl90IHpfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHogPSB6XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERpc3BhdGNoSW5kaXJlY3RDb21tYW5kIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggeCA9PSByaHMueCApCisgICAgICAgICAgJiYgKCB5ID09IHJocy55ICkKKyAgICAgICAgICAmJiAoIHogPT0gcmhzLnogKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERpc3BhdGNoSW5kaXJlY3RDb21tYW5kIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IHg7CisgICAgdWludDMyX3QgeTsKKyAgICB1aW50MzJfdCB6OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERpc3BhdGNoSW5kaXJlY3RDb21tYW5kICkgPT0gc2l6ZW9mKCBWa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERpc3BhdGNoSW5kaXJlY3RDb21tYW5kPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEaXNwbGF5RXZlbnRJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEaXNwbGF5RXZlbnRJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUV2ZW50VHlwZUVYVCBkaXNwbGF5RXZlbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlFdmVudFR5cGVFWFQ6OmVGaXJzdFBpeGVsT3V0ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkaXNwbGF5RXZlbnQoIGRpc3BsYXlFdmVudF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUV2ZW50SW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlFdmVudEluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlFdmVudEluZm9FWFQgKSAtIG9mZnNldG9mKCBEaXNwbGF5RXZlbnRJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheUV2ZW50SW5mb0VYVCggVmtEaXNwbGF5RXZlbnRJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERpc3BsYXlFdmVudEluZm9FWFQmIG9wZXJhdG9yPSggVmtEaXNwbGF5RXZlbnRJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlFdmVudEluZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheUV2ZW50SW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheUV2ZW50SW5mb0VYVCAmIHNldERpc3BsYXlFdmVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlFdmVudFR5cGVFWFQgZGlzcGxheUV2ZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkaXNwbGF5RXZlbnQgPSBkaXNwbGF5RXZlbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheUV2ZW50SW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheUV2ZW50SW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5RXZlbnRJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGlzcGxheUV2ZW50SW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5RXZlbnRJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkaXNwbGF5RXZlbnQgPT0gcmhzLmRpc3BsYXlFdmVudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheUV2ZW50SW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5RXZlbnRJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUV2ZW50VHlwZUVYVCBkaXNwbGF5RXZlbnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGlzcGxheUV2ZW50SW5mb0VYVCApID09IHNpemVvZiggVmtEaXNwbGF5RXZlbnRJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERpc3BsYXlFdmVudEluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgdmlzaWJsZVJlZ2lvbl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZnJlc2hSYXRlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHZpc2libGVSZWdpb24oIHZpc2libGVSZWdpb25fICkKKyAgICAgICwgcmVmcmVzaFJhdGUoIHJlZnJlc2hSYXRlXyApCisgICAge30KKworICAgIERpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUiggVmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSJiBvcGVyYXRvcj0oIFZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgJiBzZXRWaXNpYmxlUmVnaW9uKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgdmlzaWJsZVJlZ2lvbl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmlzaWJsZVJlZ2lvbiA9IHZpc2libGVSZWdpb25fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUiAmIHNldFJlZnJlc2hSYXRlKCB1aW50MzJfdCByZWZyZXNoUmF0ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVmcmVzaFJhdGUgPSByZWZyZXNoUmF0ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggdmlzaWJsZVJlZ2lvbiA9PSByaHMudmlzaWJsZVJlZ2lvbiApCisgICAgICAgICAgJiYgKCByZWZyZXNoUmF0ZSA9PSByaHMucmVmcmVzaFJhdGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgdmlzaWJsZVJlZ2lvbjsKKyAgICB1aW50MzJfdCByZWZyZXNoUmF0ZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgKSA9PSBzaXplb2YoIFZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUNyZWF0ZUZsYWdzS0hSIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUNyZWF0ZUZsYWdzS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSIHBhcmFtZXRlcnNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUigpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgcGFyYW1ldGVycyggcGFyYW1ldGVyc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIgKSAtIG9mZnNldG9mKCBEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIoIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiAmIHNldFBhcmFtZXRlcnMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgcGFyYW1ldGVyc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGFyYW1ldGVycyA9IHBhcmFtZXRlcnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHBhcmFtZXRlcnMgPT0gcmhzLnBhcmFtZXRlcnMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUNyZWF0ZUZsYWdzS0hSIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgcGFyYW1ldGVyczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIgKSA9PSBzaXplb2YoIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSCisgIHsKKyAgICBEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiBkaXNwbGF5TW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgcGFyYW1ldGVyc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRpc3BsYXlNb2RlKCBkaXNwbGF5TW9kZV8gKQorICAgICAgLCBwYXJhbWV0ZXJzKCBwYXJhbWV0ZXJzXyApCisgICAge30KKworICAgIERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiggVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlUHJvcGVydGllc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBkaXNwbGF5TW9kZSA9PSByaHMuZGlzcGxheU1vZGUgKQorICAgICAgICAgICYmICggcGFyYW1ldGVycyA9PSByaHMucGFyYW1ldGVycyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiBkaXNwbGF5TW9kZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSIHBhcmFtZXRlcnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIKKyAgeworICAgIERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgZGlzcGxheU1vZGVQcm9wZXJ0aWVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGlzcGxheU1vZGVQcm9wZXJ0aWVzKCBkaXNwbGF5TW9kZVByb3BlcnRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSICkgLSBvZmZzZXRvZiggRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSJiBvcGVyYXRvcj0oIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkaXNwbGF5TW9kZVByb3BlcnRpZXMgPT0gcmhzLmRpc3BsYXlNb2RlUHJvcGVydGllcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIGRpc3BsYXlNb2RlUHJvcGVydGllczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSICkgPT0gc2l6ZW9mKCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQKKyAgeworICAgIERpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGxvY2FsRGltbWluZ1N1cHBvcnRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbG9jYWxEaW1taW5nU3VwcG9ydCggbG9jYWxEaW1taW5nU3VwcG9ydF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgKSAtIG9mZnNldG9mKCBEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EKCBWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EJiBvcGVyYXRvcj0oIFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbG9jYWxEaW1taW5nU3VwcG9ydCA9PSByaHMubG9jYWxEaW1taW5nU3VwcG9ydCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbG9jYWxEaW1taW5nU3VwcG9ydDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCApID09IHNpemVvZiggVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSCisgIHsKKyAgICBEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSIHN1cHBvcnRlZEFscGhhXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0MkQgbWluU3JjUG9zaXRpb25fID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0MkQgbWF4U3JjUG9zaXRpb25fID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgbWluU3JjRXh0ZW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIG1heFNyY0V4dGVudF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQyRCBtaW5Ec3RQb3NpdGlvbl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQyRCBtYXhEc3RQb3NpdGlvbl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtaW5Ec3RFeHRlbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgbWF4RHN0RXh0ZW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdXBwb3J0ZWRBbHBoYSggc3VwcG9ydGVkQWxwaGFfICkKKyAgICAgICwgbWluU3JjUG9zaXRpb24oIG1pblNyY1Bvc2l0aW9uXyApCisgICAgICAsIG1heFNyY1Bvc2l0aW9uKCBtYXhTcmNQb3NpdGlvbl8gKQorICAgICAgLCBtaW5TcmNFeHRlbnQoIG1pblNyY0V4dGVudF8gKQorICAgICAgLCBtYXhTcmNFeHRlbnQoIG1heFNyY0V4dGVudF8gKQorICAgICAgLCBtaW5Ec3RQb3NpdGlvbiggbWluRHN0UG9zaXRpb25fICkKKyAgICAgICwgbWF4RHN0UG9zaXRpb24oIG1heERzdFBvc2l0aW9uXyApCisgICAgICAsIG1pbkRzdEV4dGVudCggbWluRHN0RXh0ZW50XyApCisgICAgICAsIG1heERzdEV4dGVudCggbWF4RHN0RXh0ZW50XyApCisgICAge30KKworICAgIERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiggVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSJiBvcGVyYXRvcj0oIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzdXBwb3J0ZWRBbHBoYSA9PSByaHMuc3VwcG9ydGVkQWxwaGEgKQorICAgICAgICAgICYmICggbWluU3JjUG9zaXRpb24gPT0gcmhzLm1pblNyY1Bvc2l0aW9uICkKKyAgICAgICAgICAmJiAoIG1heFNyY1Bvc2l0aW9uID09IHJocy5tYXhTcmNQb3NpdGlvbiApCisgICAgICAgICAgJiYgKCBtaW5TcmNFeHRlbnQgPT0gcmhzLm1pblNyY0V4dGVudCApCisgICAgICAgICAgJiYgKCBtYXhTcmNFeHRlbnQgPT0gcmhzLm1heFNyY0V4dGVudCApCisgICAgICAgICAgJiYgKCBtaW5Ec3RQb3NpdGlvbiA9PSByaHMubWluRHN0UG9zaXRpb24gKQorICAgICAgICAgICYmICggbWF4RHN0UG9zaXRpb24gPT0gcmhzLm1heERzdFBvc2l0aW9uICkKKyAgICAgICAgICAmJiAoIG1pbkRzdEV4dGVudCA9PSByaHMubWluRHN0RXh0ZW50ICkKKyAgICAgICAgICAmJiAoIG1heERzdEV4dGVudCA9PSByaHMubWF4RHN0RXh0ZW50ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUFscGhhRmxhZ3NLSFIgc3VwcG9ydGVkQWxwaGE7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDJEIG1pblNyY1Bvc2l0aW9uOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQyRCBtYXhTcmNQb3NpdGlvbjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgbWluU3JjRXh0ZW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtYXhTcmNFeHRlbnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDJEIG1pbkRzdFBvc2l0aW9uOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQyRCBtYXhEc3RQb3NpdGlvbjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgbWluRHN0RXh0ZW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtYXhEc3RFeHRlbnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIKKyAgeworICAgIERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgY2FwYWJpbGl0aWVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogY2FwYWJpbGl0aWVzKCBjYXBhYmlsaXRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSICkgLSBvZmZzZXRvZiggRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSJiBvcGVyYXRvcj0oIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBjYXBhYmlsaXRpZXMgPT0gcmhzLmNhcGFiaWxpdGllcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIGNhcGFiaWxpdGllczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSICkgPT0gc2l6ZW9mKCBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGlzcGxheVBsYW5lSW5mbzJLSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERpc3BsYXlQbGFuZUluZm8yS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVLSFIgbW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxhbmVJbmRleF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtb2RlKCBtb2RlXyApCisgICAgICAsIHBsYW5lSW5kZXgoIHBsYW5lSW5kZXhfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUluZm8yS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lSW5mbzJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUluZm8yS0hSICkgLSBvZmZzZXRvZiggRGlzcGxheVBsYW5lSW5mbzJLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5UGxhbmVJbmZvMktIUiggVmtEaXNwbGF5UGxhbmVJbmZvMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEaXNwbGF5UGxhbmVJbmZvMktIUiYgb3BlcmF0b3I9KCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUluZm8yS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlQbGFuZUluZm8yS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5UGxhbmVJbmZvMktIUiAmIHNldE1vZGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiBtb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtb2RlID0gbW9kZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVBsYW5lSW5mbzJLSFIgJiBzZXRQbGFuZUluZGV4KCB1aW50MzJfdCBwbGFuZUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwbGFuZUluZGV4ID0gcGxhbmVJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheVBsYW5lSW5mbzJLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UGxhbmVJbmZvMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5UGxhbmVJbmZvMktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbW9kZSA9PSByaHMubW9kZSApCisgICAgICAgICAgJiYgKCBwbGFuZUluZGV4ID09IHJocy5wbGFuZUluZGV4ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEaXNwbGF5UGxhbmVJbmZvMktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5UGxhbmVJbmZvMktIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlS0hSIG1vZGU7CisgICAgdWludDMyX3QgcGxhbmVJbmRleDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEaXNwbGF5UGxhbmVJbmZvMktIUiApID09IHNpemVvZiggVmtEaXNwbGF5UGxhbmVJbmZvMktIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEaXNwbGF5UGxhbmVJbmZvMktIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUgorICB7CisgICAgRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgY3VycmVudERpc3BsYXlfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50U3RhY2tJbmRleF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBjdXJyZW50RGlzcGxheSggY3VycmVudERpc3BsYXlfICkKKyAgICAgICwgY3VycmVudFN0YWNrSW5kZXgoIGN1cnJlbnRTdGFja0luZGV4XyApCisgICAge30KKworICAgIERpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggY3VycmVudERpc3BsYXkgPT0gcmhzLmN1cnJlbnREaXNwbGF5ICkKKyAgICAgICAgICAmJiAoIGN1cnJlbnRTdGFja0luZGV4ID09IHJocy5jdXJyZW50U3RhY2tJbmRleCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBjdXJyZW50RGlzcGxheTsKKyAgICB1aW50MzJfdCBjdXJyZW50U3RhY2tJbmRleDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIKKyAgeworICAgIERpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBkaXNwbGF5UGxhbmVQcm9wZXJ0aWVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRpc3BsYXlQbGFuZVByb3BlcnRpZXMoIGRpc3BsYXlQbGFuZVByb3BlcnRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSICkgLSBvZmZzZXRvZiggRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiggVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiYgb3BlcmF0b3I9KCBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRpc3BsYXlQbGFuZVByb3BlcnRpZXMgPT0gcmhzLmRpc3BsYXlQbGFuZVByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBkaXNwbGF5UGxhbmVQcm9wZXJ0aWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSICkgPT0gc2l6ZW9mKCBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PERpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEaXNwbGF5UG93ZXJJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEaXNwbGF5UG93ZXJJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBvd2VyU3RhdGVFWFQgcG93ZXJTdGF0ZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBvd2VyU3RhdGVFWFQ6OmVPZmYgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBvd2VyU3RhdGUoIHBvd2VyU3RhdGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQb3dlckluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UG93ZXJJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UG93ZXJJbmZvRVhUICkgLSBvZmZzZXRvZiggRGlzcGxheVBvd2VySW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlQb3dlckluZm9FWFQoIFZrRGlzcGxheVBvd2VySW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEaXNwbGF5UG93ZXJJbmZvRVhUJiBvcGVyYXRvcj0oIFZrRGlzcGxheVBvd2VySW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UG93ZXJJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlQb3dlckluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlQb3dlckluZm9FWFQgJiBzZXRQb3dlclN0YXRlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBvd2VyU3RhdGVFWFQgcG93ZXJTdGF0ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcG93ZXJTdGF0ZSA9IHBvd2VyU3RhdGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheVBvd2VySW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5UG93ZXJJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBvd2VySW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5UG93ZXJJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwb3dlclN0YXRlID09IHJocy5wb3dlclN0YXRlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEaXNwbGF5UG93ZXJJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlQb3dlckluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UG93ZXJTdGF0ZUVYVCBwb3dlclN0YXRlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERpc3BsYXlQb3dlckluZm9FWFQgKSA9PSBzaXplb2YoIFZrRGlzcGxheVBvd2VySW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEaXNwbGF5UG93ZXJJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEaXNwbGF5UHJlc2VudEluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERpc3BsYXlQcmVzZW50SW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCBzcmNSZWN0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQgZHN0UmVjdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHBlcnNpc3RlbnRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc3JjUmVjdCggc3JjUmVjdF8gKQorICAgICAgLCBkc3RSZWN0KCBkc3RSZWN0XyApCisgICAgICAsIHBlcnNpc3RlbnQoIHBlcnNpc3RlbnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQcmVzZW50SW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQcmVzZW50SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVByZXNlbnRJbmZvS0hSICkgLSBvZmZzZXRvZiggRGlzcGxheVByZXNlbnRJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVByZXNlbnRJbmZvS0hSKCBWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEaXNwbGF5UHJlc2VudEluZm9LSFImIG9wZXJhdG9yPSggVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVByZXNlbnRJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlQcmVzZW50SW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVByZXNlbnRJbmZvS0hSICYgc2V0U3JjUmVjdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCBzcmNSZWN0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcmNSZWN0ID0gc3JjUmVjdF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVByZXNlbnRJbmZvS0hSICYgc2V0RHN0UmVjdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCBkc3RSZWN0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RSZWN0ID0gZHN0UmVjdF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVByZXNlbnRJbmZvS0hSICYgc2V0UGVyc2lzdGVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBwZXJzaXN0ZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwZXJzaXN0ZW50ID0gcGVyc2lzdGVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UHJlc2VudEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRGlzcGxheVByZXNlbnRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzcmNSZWN0ID09IHJocy5zcmNSZWN0ICkKKyAgICAgICAgICAmJiAoIGRzdFJlY3QgPT0gcmhzLmRzdFJlY3QgKQorICAgICAgICAgICYmICggcGVyc2lzdGVudCA9PSByaHMucGVyc2lzdGVudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheVByZXNlbnRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlQcmVzZW50SW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCBzcmNSZWN0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQgZHN0UmVjdDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHBlcnNpc3RlbnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRGlzcGxheVByZXNlbnRJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEaXNwbGF5UHJlc2VudEluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERpc3BsYXlQcm9wZXJ0aWVzS0hSCisgIHsKKyAgICBEaXNwbGF5UHJvcGVydGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkaXNwbGF5TmFtZV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgcGh5c2ljYWxEaW1lbnNpb25zXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgcGh5c2ljYWxSZXNvbHV0aW9uXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSIHN1cHBvcnRlZFRyYW5zZm9ybXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHBsYW5lUmVvcmRlclBvc3NpYmxlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGVyc2lzdGVudENvbnRlbnRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGlzcGxheSggZGlzcGxheV8gKQorICAgICAgLCBkaXNwbGF5TmFtZSggZGlzcGxheU5hbWVfICkKKyAgICAgICwgcGh5c2ljYWxEaW1lbnNpb25zKCBwaHlzaWNhbERpbWVuc2lvbnNfICkKKyAgICAgICwgcGh5c2ljYWxSZXNvbHV0aW9uKCBwaHlzaWNhbFJlc29sdXRpb25fICkKKyAgICAgICwgc3VwcG9ydGVkVHJhbnNmb3Jtcyggc3VwcG9ydGVkVHJhbnNmb3Jtc18gKQorICAgICAgLCBwbGFuZVJlb3JkZXJQb3NzaWJsZSggcGxhbmVSZW9yZGVyUG9zc2libGVfICkKKyAgICAgICwgcGVyc2lzdGVudENvbnRlbnQoIHBlcnNpc3RlbnRDb250ZW50XyApCisgICAge30KKworICAgIERpc3BsYXlQcm9wZXJ0aWVzS0hSKCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERpc3BsYXlQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVByb3BlcnRpZXNLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEaXNwbGF5UHJvcGVydGllc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheVByb3BlcnRpZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UHJvcGVydGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5UHJvcGVydGllc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGRpc3BsYXkgPT0gcmhzLmRpc3BsYXkgKQorICAgICAgICAgICYmICggZGlzcGxheU5hbWUgPT0gcmhzLmRpc3BsYXlOYW1lICkKKyAgICAgICAgICAmJiAoIHBoeXNpY2FsRGltZW5zaW9ucyA9PSByaHMucGh5c2ljYWxEaW1lbnNpb25zICkKKyAgICAgICAgICAmJiAoIHBoeXNpY2FsUmVzb2x1dGlvbiA9PSByaHMucGh5c2ljYWxSZXNvbHV0aW9uICkKKyAgICAgICAgICAmJiAoIHN1cHBvcnRlZFRyYW5zZm9ybXMgPT0gcmhzLnN1cHBvcnRlZFRyYW5zZm9ybXMgKQorICAgICAgICAgICYmICggcGxhbmVSZW9yZGVyUG9zc2libGUgPT0gcmhzLnBsYW5lUmVvcmRlclBvc3NpYmxlICkKKyAgICAgICAgICAmJiAoIHBlcnNpc3RlbnRDb250ZW50ID09IHJocy5wZXJzaXN0ZW50Q29udGVudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheTsKKyAgICBjb25zdCBjaGFyKiBkaXNwbGF5TmFtZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgcGh5c2ljYWxEaW1lbnNpb25zOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBwaHlzaWNhbFJlc29sdXRpb247CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUiBzdXBwb3J0ZWRUcmFuc2Zvcm1zOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGxhbmVSZW9yZGVyUG9zc2libGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBwZXJzaXN0ZW50Q29udGVudDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEaXNwbGF5UHJvcGVydGllc0tIUiApID09IHNpemVvZiggVmtEaXNwbGF5UHJvcGVydGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEaXNwbGF5UHJvcGVydGllc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRGlzcGxheVByb3BlcnRpZXMyS0hSCisgIHsKKyAgICBEaXNwbGF5UHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UHJvcGVydGllc0tIUiBkaXNwbGF5UHJvcGVydGllc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVByb3BlcnRpZXNLSFIoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGlzcGxheVByb3BlcnRpZXMoIGRpc3BsYXlQcm9wZXJ0aWVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UHJvcGVydGllczJLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UHJvcGVydGllczJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQcm9wZXJ0aWVzMktIUiApIC0gb2Zmc2V0b2YoIERpc3BsYXlQcm9wZXJ0aWVzMktIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlQcm9wZXJ0aWVzMktIUiggVmtEaXNwbGF5UHJvcGVydGllczJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRGlzcGxheVByb3BlcnRpZXMyS0hSJiBvcGVyYXRvcj0oIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQcm9wZXJ0aWVzMktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheVByb3BlcnRpZXMyS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEaXNwbGF5UHJvcGVydGllczJLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRpc3BsYXlQcm9wZXJ0aWVzID09IHJocy5kaXNwbGF5UHJvcGVydGllcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRGlzcGxheVByb3BlcnRpZXMyS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZURpc3BsYXlQcm9wZXJ0aWVzMktIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQcm9wZXJ0aWVzS0hSIGRpc3BsYXlQcm9wZXJ0aWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERpc3BsYXlQcm9wZXJ0aWVzMktIUiApID09IHNpemVvZiggVmtEaXNwbGF5UHJvcGVydGllczJLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGlzcGxheVByb3BlcnRpZXMyS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiBkaXNwbGF5TW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lSW5kZXhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lU3RhY2tJbmRleF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiB0cmFuc2Zvcm1fID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ2xvYmFsQWxwaGFfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSIGFscGhhTW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjo6ZU9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBpbWFnZUV4dGVudF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGRpc3BsYXlNb2RlKCBkaXNwbGF5TW9kZV8gKQorICAgICAgLCBwbGFuZUluZGV4KCBwbGFuZUluZGV4XyApCisgICAgICAsIHBsYW5lU3RhY2tJbmRleCggcGxhbmVTdGFja0luZGV4XyApCisgICAgICAsIHRyYW5zZm9ybSggdHJhbnNmb3JtXyApCisgICAgICAsIGdsb2JhbEFscGhhKCBnbG9iYWxBbHBoYV8gKQorICAgICAgLCBhbHBoYU1vZGUoIGFscGhhTW9kZV8gKQorICAgICAgLCBpbWFnZUV4dGVudCggaW1hZ2VFeHRlbnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICkgLSBvZmZzZXRvZiggRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5U3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXREaXNwbGF5TW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlS0hSIGRpc3BsYXlNb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkaXNwbGF5TW9kZSA9IGRpc3BsYXlNb2RlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRQbGFuZUluZGV4KCB1aW50MzJfdCBwbGFuZUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwbGFuZUluZGV4ID0gcGxhbmVJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICYgc2V0UGxhbmVTdGFja0luZGV4KCB1aW50MzJfdCBwbGFuZVN0YWNrSW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBsYW5lU3RhY2tJbmRleCA9IHBsYW5lU3RhY2tJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICYgc2V0VHJhbnNmb3JtKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHRyYW5zZm9ybV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHJhbnNmb3JtID0gdHJhbnNmb3JtXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRHbG9iYWxBbHBoYSggZmxvYXQgZ2xvYmFsQWxwaGFfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGdsb2JhbEFscGhhID0gZ2xvYmFsQWxwaGFfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldEFscGhhTW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgYWxwaGFNb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhbHBoYU1vZGUgPSBhbHBoYU1vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldEltYWdlRXh0ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgaW1hZ2VFeHRlbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlRXh0ZW50ID0gaW1hZ2VFeHRlbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGRpc3BsYXlNb2RlID09IHJocy5kaXNwbGF5TW9kZSApCisgICAgICAgICAgJiYgKCBwbGFuZUluZGV4ID09IHJocy5wbGFuZUluZGV4ICkKKyAgICAgICAgICAmJiAoIHBsYW5lU3RhY2tJbmRleCA9PSByaHMucGxhbmVTdGFja0luZGV4ICkKKyAgICAgICAgICAmJiAoIHRyYW5zZm9ybSA9PSByaHMudHJhbnNmb3JtICkKKyAgICAgICAgICAmJiAoIGdsb2JhbEFscGhhID09IHJocy5nbG9iYWxBbHBoYSApCisgICAgICAgICAgJiYgKCBhbHBoYU1vZGUgPT0gcmhzLmFscGhhTW9kZSApCisgICAgICAgICAgJiYgKCBpbWFnZUV4dGVudCA9PSByaHMuaW1hZ2VFeHRlbnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5U3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiBkaXNwbGF5TW9kZTsKKyAgICB1aW50MzJfdCBwbGFuZUluZGV4OworICAgIHVpbnQzMl90IHBsYW5lU3RhY2tJbmRleDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHRyYW5zZm9ybTsKKyAgICBmbG9hdCBnbG9iYWxBbHBoYTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUiBhbHBoYU1vZGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIGltYWdlRXh0ZW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiApID09IHNpemVvZiggVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQoIHVpbnQzMl90IGluZGV4Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5zdGFuY2VDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluZGV4XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVydGV4T2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0SW5zdGFuY2VfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaW5kZXhDb3VudCggaW5kZXhDb3VudF8gKQorICAgICAgLCBpbnN0YW5jZUNvdW50KCBpbnN0YW5jZUNvdW50XyApCisgICAgICAsIGZpcnN0SW5kZXgoIGZpcnN0SW5kZXhfICkKKyAgICAgICwgdmVydGV4T2Zmc2V0KCB2ZXJ0ZXhPZmZzZXRfICkKKyAgICAgICwgZmlyc3RJbnN0YW5jZSggZmlyc3RJbnN0YW5jZV8gKQorICAgIHt9CisKKyAgICBEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCggVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCYgb3BlcmF0b3I9KCBWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kICYgc2V0SW5kZXhDb3VudCggdWludDMyX3QgaW5kZXhDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5kZXhDb3VudCA9IGluZGV4Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kICYgc2V0SW5zdGFuY2VDb3VudCggdWludDMyX3QgaW5zdGFuY2VDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5zdGFuY2VDb3VudCA9IGluc3RhbmNlQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kICYgc2V0Rmlyc3RJbmRleCggdWludDMyX3QgZmlyc3RJbmRleF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmlyc3RJbmRleCA9IGZpcnN0SW5kZXhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kICYgc2V0VmVydGV4T2Zmc2V0KCBpbnQzMl90IHZlcnRleE9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmVydGV4T2Zmc2V0ID0gdmVydGV4T2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCAmIHNldEZpcnN0SW5zdGFuY2UoIHVpbnQzMl90IGZpcnN0SW5zdGFuY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZpcnN0SW5zdGFuY2UgPSBmaXJzdEluc3RhbmNlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIERyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggaW5kZXhDb3VudCA9PSByaHMuaW5kZXhDb3VudCApCisgICAgICAgICAgJiYgKCBpbnN0YW5jZUNvdW50ID09IHJocy5pbnN0YW5jZUNvdW50ICkKKyAgICAgICAgICAmJiAoIGZpcnN0SW5kZXggPT0gcmhzLmZpcnN0SW5kZXggKQorICAgICAgICAgICYmICggdmVydGV4T2Zmc2V0ID09IHJocy52ZXJ0ZXhPZmZzZXQgKQorICAgICAgICAgICYmICggZmlyc3RJbnN0YW5jZSA9PSByaHMuZmlyc3RJbnN0YW5jZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3QgaW5kZXhDb3VudDsKKyAgICB1aW50MzJfdCBpbnN0YW5jZUNvdW50OworICAgIHVpbnQzMl90IGZpcnN0SW5kZXg7CisgICAgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQ7CisgICAgdWludDMyX3QgZmlyc3RJbnN0YW5jZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCApID09IHNpemVvZiggVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRHJhd0luZGlyZWN0Q29tbWFuZAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRHJhd0luZGlyZWN0Q29tbWFuZCggdWludDMyX3QgdmVydGV4Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnN0YW5jZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RWZXJ0ZXhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluc3RhbmNlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHZlcnRleENvdW50KCB2ZXJ0ZXhDb3VudF8gKQorICAgICAgLCBpbnN0YW5jZUNvdW50KCBpbnN0YW5jZUNvdW50XyApCisgICAgICAsIGZpcnN0VmVydGV4KCBmaXJzdFZlcnRleF8gKQorICAgICAgLCBmaXJzdEluc3RhbmNlKCBmaXJzdEluc3RhbmNlXyApCisgICAge30KKworICAgIERyYXdJbmRpcmVjdENvbW1hbmQoIFZrRHJhd0luZGlyZWN0Q29tbWFuZCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEcmF3SW5kaXJlY3RDb21tYW5kJiBvcGVyYXRvcj0oIFZrRHJhd0luZGlyZWN0Q29tbWFuZCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEcmF3SW5kaXJlY3RDb21tYW5kIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERyYXdJbmRpcmVjdENvbW1hbmQgJiBzZXRWZXJ0ZXhDb3VudCggdWludDMyX3QgdmVydGV4Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZlcnRleENvdW50ID0gdmVydGV4Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERyYXdJbmRpcmVjdENvbW1hbmQgJiBzZXRJbnN0YW5jZUNvdW50KCB1aW50MzJfdCBpbnN0YW5jZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbnN0YW5jZUNvdW50ID0gaW5zdGFuY2VDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRHJhd0luZGlyZWN0Q29tbWFuZCAmIHNldEZpcnN0VmVydGV4KCB1aW50MzJfdCBmaXJzdFZlcnRleF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmlyc3RWZXJ0ZXggPSBmaXJzdFZlcnRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRHJhd0luZGlyZWN0Q29tbWFuZCAmIHNldEZpcnN0SW5zdGFuY2UoIHVpbnQzMl90IGZpcnN0SW5zdGFuY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZpcnN0SW5zdGFuY2UgPSBmaXJzdEluc3RhbmNlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RyYXdJbmRpcmVjdENvbW1hbmQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RyYXdJbmRpcmVjdENvbW1hbmQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRHJhd0luZGlyZWN0Q29tbWFuZCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RyYXdJbmRpcmVjdENvbW1hbmQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRHJhd0luZGlyZWN0Q29tbWFuZCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHZlcnRleENvdW50ID09IHJocy52ZXJ0ZXhDb3VudCApCisgICAgICAgICAgJiYgKCBpbnN0YW5jZUNvdW50ID09IHJocy5pbnN0YW5jZUNvdW50ICkKKyAgICAgICAgICAmJiAoIGZpcnN0VmVydGV4ID09IHJocy5maXJzdFZlcnRleCApCisgICAgICAgICAgJiYgKCBmaXJzdEluc3RhbmNlID09IHJocy5maXJzdEluc3RhbmNlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBEcmF3SW5kaXJlY3RDb21tYW5kIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IHZlcnRleENvdW50OworICAgIHVpbnQzMl90IGluc3RhbmNlQ291bnQ7CisgICAgdWludDMyX3QgZmlyc3RWZXJ0ZXg7CisgICAgdWludDMyX3QgZmlyc3RJbnN0YW5jZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEcmF3SW5kaXJlY3RDb21tYW5kICkgPT0gc2l6ZW9mKCBWa0RyYXdJbmRpcmVjdENvbW1hbmQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RHJhd0luZGlyZWN0Q29tbWFuZD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYoIHVpbnQzMl90IHRhc2tDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RUYXNrXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHRhc2tDb3VudCggdGFza0NvdW50XyApCisgICAgICAsIGZpcnN0VGFzayggZmlyc3RUYXNrXyApCisgICAge30KKworICAgIERyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViggVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WJiBvcGVyYXRvcj0oIFZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYgJiBzZXRUYXNrQ291bnQoIHVpbnQzMl90IHRhc2tDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdGFza0NvdW50ID0gdGFza0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYgJiBzZXRGaXJzdFRhc2soIHVpbnQzMl90IGZpcnN0VGFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmlyc3RUYXNrID0gZmlyc3RUYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCB0YXNrQ291bnQgPT0gcmhzLnRhc2tDb3VudCApCisgICAgICAgICAgJiYgKCBmaXJzdFRhc2sgPT0gcmhzLmZpcnN0VGFzayApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IHRhc2tDb3VudDsKKyAgICB1aW50MzJfdCBmaXJzdFRhc2s7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WICkgPT0gc2l6ZW9mKCBWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVAorICB7CisgICAgRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKCB1aW50NjRfdCBkcm1Gb3JtYXRNb2RpZmllcl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0RmVhdHVyZUZsYWdzIGRybUZvcm1hdE1vZGlmaWVyVGlsaW5nRmVhdHVyZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdEZlYXR1cmVGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkcm1Gb3JtYXRNb2RpZmllciggZHJtRm9ybWF0TW9kaWZpZXJfICkKKyAgICAgICwgZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50KCBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnRfICkKKyAgICAgICwgZHJtRm9ybWF0TW9kaWZpZXJUaWxpbmdGZWF0dXJlcyggZHJtRm9ybWF0TW9kaWZpZXJUaWxpbmdGZWF0dXJlc18gKQorICAgIHt9CisKKyAgICBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoIFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KCBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggZHJtRm9ybWF0TW9kaWZpZXIgPT0gcmhzLmRybUZvcm1hdE1vZGlmaWVyICkKKyAgICAgICAgICAmJiAoIGRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCA9PSByaHMuZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50ICkKKyAgICAgICAgICAmJiAoIGRybUZvcm1hdE1vZGlmaWVyVGlsaW5nRmVhdHVyZXMgPT0gcmhzLmRybUZvcm1hdE1vZGlmaWVyVGlsaW5nRmVhdHVyZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50NjRfdCBkcm1Gb3JtYXRNb2RpZmllcjsKKyAgICB1aW50MzJfdCBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdEZlYXR1cmVGbGFncyBkcm1Gb3JtYXRNb2RpZmllclRpbGluZ0ZlYXR1cmVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUCisgIHsKKyAgICBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUKCB1aW50MzJfdCBkcm1Gb3JtYXRNb2RpZmllckNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkcm1Gb3JtYXRNb2RpZmllckNvdW50KCBkcm1Gb3JtYXRNb2RpZmllckNvdW50XyApCisgICAgICAsIHBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMoIHBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUICkgLSBvZmZzZXRvZiggRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQoIFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUJiBvcGVyYXRvcj0oIFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkcm1Gb3JtYXRNb2RpZmllckNvdW50ID09IHJocy5kcm1Gb3JtYXRNb2RpZmllckNvdW50ICkKKyAgICAgICAgICAmJiAoIHBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMgPT0gcmhzLnBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgZHJtRm9ybWF0TW9kaWZpZXJDb3VudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiBwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQgKSA9PSBzaXplb2YoIFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBFdmVudENyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV2ZW50Q3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50Q3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50Q3JlYXRlRmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudENyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50Q3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIEV2ZW50Q3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV2ZW50Q3JlYXRlSW5mbyggVmtFdmVudENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRXZlbnRDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrRXZlbnRDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50Q3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFdmVudENyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV2ZW50Q3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnRDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFdmVudENyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFdmVudENyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFdmVudENyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXZlbnRDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEV2ZW50Q3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVFdmVudENyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudENyZWF0ZUZsYWdzIGZsYWdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV2ZW50Q3JlYXRlSW5mbyApID09IHNpemVvZiggVmtFdmVudENyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RXZlbnRDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBFeHBvcnRGZW5jZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4cG9ydEZlbmNlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaGFuZGxlVHlwZXMoIGhhbmRsZVR5cGVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRGZW5jZUNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRGZW5jZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydEZlbmNlQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIEV4cG9ydEZlbmNlQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydEZlbmNlQ3JlYXRlSW5mbyggVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRXhwb3J0RmVuY2VDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydEZlbmNlQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRGZW5jZUNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydEZlbmNlQ3JlYXRlSW5mbyAmIHNldEhhbmRsZVR5cGVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncyBoYW5kbGVUeXBlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaGFuZGxlVHlwZXMgPSBoYW5kbGVUeXBlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXhwb3J0RmVuY2VDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBoYW5kbGVUeXBlcyA9PSByaHMuaGFuZGxlVHlwZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEV4cG9ydEZlbmNlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVFeHBvcnRGZW5jZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzIGhhbmRsZVR5cGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV4cG9ydEZlbmNlQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RXhwb3J0RmVuY2VDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIoIGNvbnN0IFNFQ1VSSVRZX0FUVFJJQlVURVMqIHBBdHRyaWJ1dGVzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3QWNjZXNzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbmFtZV8gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwQXR0cmlidXRlcyggcEF0dHJpYnV0ZXNfICkKKyAgICAgICwgZHdBY2Nlc3MoIGR3QWNjZXNzXyApCisgICAgICAsIG5hbWUoIG5hbWVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICkgLSBvZmZzZXRvZiggRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiggVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAmIHNldFBBdHRyaWJ1dGVzKCBjb25zdCBTRUNVUklUWV9BVFRSSUJVVEVTKiBwQXR0cmlidXRlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEF0dHJpYnV0ZXMgPSBwQXR0cmlidXRlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXREd0FjY2VzcyggRFdPUkQgZHdBY2Nlc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGR3QWNjZXNzID0gZHdBY2Nlc3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICYgc2V0TmFtZSggTFBDV1NUUiBuYW1lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBuYW1lID0gbmFtZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcEF0dHJpYnV0ZXMgPT0gcmhzLnBBdHRyaWJ1dGVzICkKKyAgICAgICAgICAmJiAoIGR3QWNjZXNzID09IHJocy5kd0FjY2VzcyApCisgICAgICAgICAgJiYgKCBuYW1lID09IHJocy5uYW1lICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogcEF0dHJpYnV0ZXM7CisgICAgRFdPUkQgZHdBY2Nlc3M7CisgICAgTFBDV1NUUiBuYW1lOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEV4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgc3RydWN0IEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGhhbmRsZVR5cGVzKCBoYW5kbGVUeXBlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gKSAtIG9mZnNldG9mKCBFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8oIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gJiBzZXRIYW5kbGVUeXBlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzIGhhbmRsZVR5cGVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGVUeXBlcyA9IGhhbmRsZVR5cGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGVzID09IHJocy5oYW5kbGVUeXBlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzIGhhbmRsZVR5cGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyApID09IHNpemVvZiggVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGhhbmRsZVR5cGVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGhhbmRsZVR5cGVzKCBoYW5kbGVUeXBlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgKSAtIG9mZnNldG9mKCBFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WKCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WJiBvcGVyYXRvcj0oIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WICYgc2V0SGFuZGxlVHlwZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGhhbmRsZVR5cGVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGVUeXBlcyA9IGhhbmRsZVR5cGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBoYW5kbGVUeXBlcyA9PSByaHMuaGFuZGxlVHlwZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBoYW5kbGVUeXBlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViApID09IHNpemVvZiggVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICBzdHJ1Y3QgRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoIGNvbnN0IFNFQ1VSSVRZX0FUVFJJQlVURVMqIHBBdHRyaWJ1dGVzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0FjY2Vzc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBuYW1lXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBBdHRyaWJ1dGVzKCBwQXR0cmlidXRlc18gKQorICAgICAgLCBkd0FjY2VzcyggZHdBY2Nlc3NfICkKKyAgICAgICwgbmFtZSggbmFtZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgKSAtIG9mZnNldG9mKCBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRQQXR0cmlidXRlcyggY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogcEF0dHJpYnV0ZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBBdHRyaWJ1dGVzID0gcEF0dHJpYnV0ZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiAmIHNldER3QWNjZXNzKCBEV09SRCBkd0FjY2Vzc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHdBY2Nlc3MgPSBkd0FjY2Vzc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSICYgc2V0TmFtZSggTFBDV1NUUiBuYW1lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBuYW1lID0gbmFtZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwQXR0cmlidXRlcyA9PSByaHMucEF0dHJpYnV0ZXMgKQorICAgICAgICAgICYmICggZHdBY2Nlc3MgPT0gcmhzLmR3QWNjZXNzICkKKyAgICAgICAgICAmJiAoIG5hbWUgPT0gcmhzLm5hbWUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIGNvbnN0IFNFQ1VSSVRZX0FUVFJJQlVURVMqIHBBdHRyaWJ1dGVzOworICAgIERXT1JEIGR3QWNjZXNzOworICAgIExQQ1dTVFIgbmFtZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgKSA9PSBzaXplb2YoIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYoIGNvbnN0IFNFQ1VSSVRZX0FUVFJJQlVURVMqIHBBdHRyaWJ1dGVzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3QWNjZXNzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBBdHRyaWJ1dGVzKCBwQXR0cmlidXRlc18gKQorICAgICAgLCBkd0FjY2VzcyggZHdBY2Nlc3NfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WICkgLSBvZmZzZXRvZiggRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViggVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViYgb3BlcmF0b3I9KCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViAmIHNldFBBdHRyaWJ1dGVzKCBjb25zdCBTRUNVUklUWV9BVFRSSUJVVEVTKiBwQXR0cmlidXRlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEF0dHJpYnV0ZXMgPSBwQXR0cmlidXRlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgJiBzZXREd0FjY2VzcyggRFdPUkQgZHdBY2Nlc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGR3QWNjZXNzID0gZHdBY2Nlc3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHBBdHRyaWJ1dGVzID09IHJocy5wQXR0cmlidXRlcyApCisgICAgICAgICAgJiYgKCBkd0FjY2VzcyA9PSByaHMuZHdBY2Nlc3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBjb25zdCBTRUNVUklUWV9BVFRSSUJVVEVTKiBwQXR0cmlidXRlczsKKyAgICBEV09SRCBkd0FjY2VzczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViApID09IHNpemVvZiggVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgIHN0cnVjdCBFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGhhbmRsZVR5cGVzKCBoYW5kbGVUeXBlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyggVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyAmIHNldEhhbmRsZVR5cGVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGVzID0gaGFuZGxlVHlwZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBoYW5kbGVUeXBlcyA9PSByaHMuaGFuZGxlVHlwZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzIGhhbmRsZVR5cGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiggY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogcEF0dHJpYnV0ZXNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3QWNjZXNzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIG5hbWVfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcEF0dHJpYnV0ZXMoIHBBdHRyaWJ1dGVzXyApCisgICAgICAsIGR3QWNjZXNzKCBkd0FjY2Vzc18gKQorICAgICAgLCBuYW1lKCBuYW1lXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIEV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiggVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSJiBvcGVyYXRvcj0oIFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAmIHNldFBBdHRyaWJ1dGVzKCBjb25zdCBTRUNVUklUWV9BVFRSSUJVVEVTKiBwQXR0cmlidXRlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEF0dHJpYnV0ZXMgPSBwQXR0cmlidXRlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSICYgc2V0RHdBY2Nlc3MoIERXT1JEIGR3QWNjZXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkd0FjY2VzcyA9IGR3QWNjZXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXROYW1lKCBMUENXU1RSIG5hbWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG5hbWUgPSBuYW1lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHBBdHRyaWJ1dGVzID09IHJocy5wQXR0cmlidXRlcyApCisgICAgICAgICAgJiYgKCBkd0FjY2VzcyA9PSByaHMuZHdBY2Nlc3MgKQorICAgICAgICAgICYmICggbmFtZSA9PSByaHMubmFtZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogcEF0dHJpYnV0ZXM7CisgICAgRFdPUkQgZHdBY2Nlc3M7CisgICAgTFBDV1NUUiBuYW1lOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiApID09IHNpemVvZiggVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgc3RydWN0IEV4dGVuc2lvblByb3BlcnRpZXMKKyAgeworICAgIEV4dGVuc2lvblByb3BlcnRpZXMoIHN0ZDo6YXJyYXk8Y2hhcixWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRT4gY29uc3QmIGV4dGVuc2lvbk5hbWVfID0geyB7IDAgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNwZWNWZXJzaW9uXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGV4dGVuc2lvbk5hbWV7fQorICAgICAgLCBzcGVjVmVyc2lvbiggc3BlY1ZlcnNpb25fICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGNoYXIsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkUsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU+Ojpjb3B5KCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25OYW1lXyApOworICAgIH0KKworICAgIEV4dGVuc2lvblByb3BlcnRpZXMoIFZrRXh0ZW5zaW9uUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBFeHRlbnNpb25Qcm9wZXJ0aWVzJiBvcGVyYXRvcj0oIFZrRXh0ZW5zaW9uUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnNpb25Qcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZW5zaW9uUHJvcGVydGllcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRXh0ZW5zaW9uUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHRlbnNpb25Qcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggbWVtY21wKCBleHRlbnNpb25OYW1lLCByaHMuZXh0ZW5zaW9uTmFtZSwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkUgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKQorICAgICAgICAgICYmICggc3BlY1ZlcnNpb24gPT0gcmhzLnNwZWNWZXJzaW9uICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBFeHRlbnNpb25Qcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNoYXIgZXh0ZW5zaW9uTmFtZVtWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRV07CisgICAgdWludDMyX3Qgc3BlY1ZlcnNpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRXh0ZW5zaW9uUHJvcGVydGllcyApID09IHNpemVvZiggVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEV4dGVuc2lvblByb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEV4dGVybmFsTWVtb3J5UHJvcGVydGllcworICB7CisgICAgRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3MgZXh0ZXJuYWxNZW1vcnlGZWF0dXJlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyBjb21wYXRpYmxlSGFuZGxlVHlwZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGV4dGVybmFsTWVtb3J5RmVhdHVyZXMoIGV4dGVybmFsTWVtb3J5RmVhdHVyZXNfICkKKyAgICAgICwgZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMoIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzXyApCisgICAgICAsIGNvbXBhdGlibGVIYW5kbGVUeXBlcyggY29tcGF0aWJsZUhhbmRsZVR5cGVzXyApCisgICAge30KKworICAgIEV4dGVybmFsTWVtb3J5UHJvcGVydGllcyggVmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oIFZrRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5UHJvcGVydGllcyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4dGVybmFsTWVtb3J5UHJvcGVydGllcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4dGVybmFsTWVtb3J5UHJvcGVydGllcyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsTWVtb3J5UHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBleHRlcm5hbE1lbW9yeUZlYXR1cmVzID09IHJocy5leHRlcm5hbE1lbW9yeUZlYXR1cmVzICkKKyAgICAgICAgICAmJiAoIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzID09IHJocy5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyApCisgICAgICAgICAgJiYgKCBjb21wYXRpYmxlSGFuZGxlVHlwZXMgPT0gcmhzLmNvbXBhdGlibGVIYW5kbGVUeXBlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFncyBleHRlcm5hbE1lbW9yeUZlYXR1cmVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgY29tcGF0aWJsZUhhbmRsZVR5cGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV4dGVybmFsTWVtb3J5UHJvcGVydGllcyApID09IHNpemVvZiggVmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMKKyAgeworICAgIEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5UHJvcGVydGllcyBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5UHJvcGVydGllcygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMoIGV4dGVybmFsTWVtb3J5UHJvcGVydGllc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgKSAtIG9mZnNldG9mKCBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyYgb3BlcmF0b3I9KCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgPT0gcmhzLmV4dGVybmFsTWVtb3J5UHJvcGVydGllcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUV4dGVybmFsQnVmZmVyUHJvcGVydGllczsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5UHJvcGVydGllcyBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzCisgIHsKKyAgICBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgY29tcGF0aWJsZUhhbmRsZVR5cGVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzIGV4dGVybmFsRmVuY2VGZWF0dXJlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyggZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXNfICkKKyAgICAgICwgY29tcGF0aWJsZUhhbmRsZVR5cGVzKCBjb21wYXRpYmxlSGFuZGxlVHlwZXNfICkKKyAgICAgICwgZXh0ZXJuYWxGZW5jZUZlYXR1cmVzKCBleHRlcm5hbEZlbmNlRmVhdHVyZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzICkgLSBvZmZzZXRvZiggRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyggVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyYgb3BlcmF0b3I9KCBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzID09IHJocy5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyApCisgICAgICAgICAgJiYgKCBjb21wYXRpYmxlSGFuZGxlVHlwZXMgPT0gcmhzLmNvbXBhdGlibGVIYW5kbGVUeXBlcyApCisgICAgICAgICAgJiYgKCBleHRlcm5hbEZlbmNlRmVhdHVyZXMgPT0gcmhzLmV4dGVybmFsRmVuY2VGZWF0dXJlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzIGNvbXBhdGlibGVIYW5kbGVUeXBlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncyBleHRlcm5hbEZlbmNlRmVhdHVyZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgKSA9PSBzaXplb2YoIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICBzdHJ1Y3QgRXh0ZXJuYWxGb3JtYXRBTkRST0lECisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbEZvcm1hdEFORFJPSUQoIHVpbnQ2NF90IGV4dGVybmFsRm9ybWF0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGV4dGVybmFsRm9ybWF0KCBleHRlcm5hbEZvcm1hdF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGb3JtYXRBTkRST0lEICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGb3JtYXRBTkRST0lEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZvcm1hdEFORFJPSUQgKSAtIG9mZnNldG9mKCBFeHRlcm5hbEZvcm1hdEFORFJPSUQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbEZvcm1hdEFORFJPSUQoIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4dGVybmFsRm9ybWF0QU5EUk9JRCYgb3BlcmF0b3I9KCBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZvcm1hdEFORFJPSUQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRXh0ZXJuYWxGb3JtYXRBTkRST0lEICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbEZvcm1hdEFORFJPSUQgJiBzZXRFeHRlcm5hbEZvcm1hdCggdWludDY0X3QgZXh0ZXJuYWxGb3JtYXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGV4dGVybmFsRm9ybWF0ID0gZXh0ZXJuYWxGb3JtYXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEV4dGVybmFsRm9ybWF0QU5EUk9JRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZXh0ZXJuYWxGb3JtYXQgPT0gcmhzLmV4dGVybmFsRm9ybWF0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBFeHRlcm5hbEZvcm1hdEFORFJPSUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxGb3JtYXRBTkRST0lEOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50NjRfdCBleHRlcm5hbEZvcm1hdDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBFeHRlcm5hbEZvcm1hdEFORFJPSUQgKSA9PSBzaXplb2YoIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEV4dGVybmFsRm9ybWF0QU5EUk9JRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisKKyAgc3RydWN0IEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzCisgIHsKKyAgICBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5UHJvcGVydGllcyBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5UHJvcGVydGllcygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMoIGV4dGVybmFsTWVtb3J5UHJvcGVydGllc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgKSAtIG9mZnNldG9mKCBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzID09IHJocy5leHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzIGV4dGVybmFsTWVtb3J5UHJvcGVydGllczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyApID09IHNpemVvZiggVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzCisgIHsKKyAgICBJbWFnZUZvcm1hdFByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBtYXhFeHRlbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhNaXBMZXZlbHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heEFycmF5TGF5ZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBzYW1wbGVDb3VudHNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1heFJlc291cmNlU2l6ZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXhFeHRlbnQoIG1heEV4dGVudF8gKQorICAgICAgLCBtYXhNaXBMZXZlbHMoIG1heE1pcExldmVsc18gKQorICAgICAgLCBtYXhBcnJheUxheWVycyggbWF4QXJyYXlMYXllcnNfICkKKyAgICAgICwgc2FtcGxlQ291bnRzKCBzYW1wbGVDb3VudHNfICkKKyAgICAgICwgbWF4UmVzb3VyY2VTaXplKCBtYXhSZXNvdXJjZVNpemVfICkKKyAgICB7fQorCisgICAgSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZUZvcm1hdFByb3BlcnRpZXMmIG9wZXJhdG9yPSggVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIG1heEV4dGVudCA9PSByaHMubWF4RXh0ZW50ICkKKyAgICAgICAgICAmJiAoIG1heE1pcExldmVscyA9PSByaHMubWF4TWlwTGV2ZWxzICkKKyAgICAgICAgICAmJiAoIG1heEFycmF5TGF5ZXJzID09IHJocy5tYXhBcnJheUxheWVycyApCisgICAgICAgICAgJiYgKCBzYW1wbGVDb3VudHMgPT0gcmhzLnNhbXBsZUNvdW50cyApCisgICAgICAgICAgJiYgKCBtYXhSZXNvdXJjZVNpemUgPT0gcmhzLm1heFJlc291cmNlU2l6ZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBtYXhFeHRlbnQ7CisgICAgdWludDMyX3QgbWF4TWlwTGV2ZWxzOworICAgIHVpbnQzMl90IG1heEFycmF5TGF5ZXJzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzIHNhbXBsZUNvdW50czsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtYXhSZXNvdXJjZVNpemU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZUZvcm1hdFByb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYKKyAgeworICAgIEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUZvcm1hdFByb3BlcnRpZXMgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUZvcm1hdFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NOViBleHRlcm5hbE1lbW9yeUZlYXR1cmVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnc05WKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBjb21wYXRpYmxlSGFuZGxlVHlwZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBpbWFnZUZvcm1hdFByb3BlcnRpZXNfICkKKyAgICAgICwgZXh0ZXJuYWxNZW1vcnlGZWF0dXJlcyggZXh0ZXJuYWxNZW1vcnlGZWF0dXJlc18gKQorICAgICAgLCBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyggZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXNfICkKKyAgICAgICwgY29tcGF0aWJsZUhhbmRsZVR5cGVzKCBjb21wYXRpYmxlSGFuZGxlVHlwZXNfICkKKyAgICB7fQorCisgICAgRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViggVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYmIG9wZXJhdG9yPSggVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBpbWFnZUZvcm1hdFByb3BlcnRpZXMgPT0gcmhzLmltYWdlRm9ybWF0UHJvcGVydGllcyApCisgICAgICAgICAgJiYgKCBleHRlcm5hbE1lbW9yeUZlYXR1cmVzID09IHJocy5leHRlcm5hbE1lbW9yeUZlYXR1cmVzICkKKyAgICAgICAgICAmJiAoIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzID09IHJocy5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyApCisgICAgICAgICAgJiYgKCBjb21wYXRpYmxlSGFuZGxlVHlwZXMgPT0gcmhzLmNvbXBhdGlibGVIYW5kbGVUeXBlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NOViBleHRlcm5hbE1lbW9yeUZlYXR1cmVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGNvbXBhdGlibGVIYW5kbGVUeXBlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WICkgPT0gc2l6ZW9mKCBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8RXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyBoYW5kbGVUeXBlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaGFuZGxlVHlwZXMoIGhhbmRsZVR5cGVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIEV4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyggVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyAmIHNldEhhbmRsZVR5cGVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGVzID0gaGFuZGxlVHlwZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEV4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZXMgPT0gcmhzLmhhbmRsZVR5cGVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzIGhhbmRsZVR5cGVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBoYW5kbGVUeXBlcyggaGFuZGxlVHlwZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyggVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyAmIHNldEhhbmRsZVR5cGVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGVzID0gaGFuZGxlVHlwZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGVzID09IHJocy5oYW5kbGVUeXBlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyBoYW5kbGVUeXBlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgaGFuZGxlVHlwZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaGFuZGxlVHlwZXMoIGhhbmRsZVR5cGVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViApIC0gb2Zmc2V0b2YoIEV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WKCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WICYgc2V0SGFuZGxlVHlwZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGhhbmRsZVR5cGVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGVUeXBlcyA9IGhhbmRsZVR5cGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZXMgPT0gcmhzLmhhbmRsZVR5cGVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlY7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGhhbmRsZVR5cGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEV4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgKSA9PSBzaXplb2YoIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMKKyAgeworICAgIEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzIGNvbXBhdGlibGVIYW5kbGVUeXBlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFncyBleHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyggZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXNfICkKKyAgICAgICwgY29tcGF0aWJsZUhhbmRsZVR5cGVzKCBjb21wYXRpYmxlSGFuZGxlVHlwZXNfICkKKyAgICAgICwgZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlcyggZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgKSAtIG9mZnNldG9mKCBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyYgb3BlcmF0b3I9KCBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyA9PSByaHMuZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgKQorICAgICAgICAgICYmICggY29tcGF0aWJsZUhhbmRsZVR5cGVzID09IHJocy5jb21wYXRpYmxlSGFuZGxlVHlwZXMgKQorICAgICAgICAgICYmICggZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlcyA9PSByaHMuZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFncyBjb21wYXRpYmxlSGFuZGxlVHlwZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzIGV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEZlbmNlQ3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRmVuY2VDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VDcmVhdGVGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggRmVuY2VDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmVuY2VDcmVhdGVJbmZvKCBWa0ZlbmNlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBGZW5jZUNyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtGZW5jZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZlbmNlQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmVuY2VDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUNyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ZlbmNlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ZlbmNlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ZlbmNlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBGZW5jZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRmVuY2VDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUZlbmNlQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRmVuY2VDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0ZlbmNlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxGZW5jZUNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEZlbmNlR2V0RmRJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBGZW5jZUdldEZkSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlRmQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZlbmNlKCBmZW5jZV8gKQorICAgICAgLCBoYW5kbGVUeXBlKCBoYW5kbGVUeXBlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUdldEZkSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlR2V0RmRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUdldEZkSW5mb0tIUiApIC0gb2Zmc2V0b2YoIEZlbmNlR2V0RmRJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmVuY2VHZXRGZEluZm9LSFIoIFZrRmVuY2VHZXRGZEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRmVuY2VHZXRGZEluZm9LSFImIG9wZXJhdG9yPSggVmtGZW5jZUdldEZkSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUdldEZkSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGZW5jZUdldEZkSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmVuY2VHZXRGZEluZm9LSFIgJiBzZXRGZW5jZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmZW5jZSA9IGZlbmNlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGZW5jZUdldEZkSW5mb0tIUiAmIHNldEhhbmRsZVR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGUgPSBoYW5kbGVUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ZlbmNlR2V0RmRJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtGZW5jZUdldEZkSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ZlbmNlR2V0RmRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEZlbmNlR2V0RmRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmZW5jZSA9PSByaHMuZmVuY2UgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZSA9PSByaHMuaGFuZGxlVHlwZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggRmVuY2VHZXRGZEluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRmVuY2VHZXRGZEluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEZlbmNlR2V0RmRJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0ZlbmNlR2V0RmRJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEZlbmNlR2V0RmRJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmZW5jZSggZmVuY2VfICkKKyAgICAgICwgaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgKSAtIG9mZnNldG9mKCBGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSJiBvcGVyYXRvcj0oIFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSICYgc2V0RmVuY2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmVuY2UgPSBmZW5jZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRIYW5kbGVUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGVUeXBlID0gaGFuZGxlVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmVuY2UgPT0gcmhzLmZlbmNlICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGUgPT0gcmhzLmhhbmRsZVR5cGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiApID09IHNpemVvZiggVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgIHN0cnVjdCBGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVAorICB7CisgICAgRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZmlsdGVyQ3ViaWNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmaWx0ZXJDdWJpY01pbm1heF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmaWx0ZXJDdWJpYyggZmlsdGVyQ3ViaWNfICkKKyAgICAgICwgZmlsdGVyQ3ViaWNNaW5tYXgoIGZpbHRlckN1YmljTWlubWF4XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCApIC0gb2Zmc2V0b2YoIEZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQoIFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPSggVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmaWx0ZXJDdWJpYyA9PSByaHMuZmlsdGVyQ3ViaWMgKQorICAgICAgICAgICYmICggZmlsdGVyQ3ViaWNNaW5tYXggPT0gcmhzLmZpbHRlckN1YmljTWlubWF4ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmaWx0ZXJDdWJpYzsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZpbHRlckN1YmljTWlubWF4OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUICkgPT0gc2l6ZW9mKCBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBGb3JtYXRQcm9wZXJ0aWVzCisgIHsKKyAgICBGb3JtYXRQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0RmVhdHVyZUZsYWdzIGxpbmVhclRpbGluZ0ZlYXR1cmVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRGZWF0dXJlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0RmVhdHVyZUZsYWdzIG9wdGltYWxUaWxpbmdGZWF0dXJlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0RmVhdHVyZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdEZlYXR1cmVGbGFncyBidWZmZXJGZWF0dXJlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0RmVhdHVyZUZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGxpbmVhclRpbGluZ0ZlYXR1cmVzKCBsaW5lYXJUaWxpbmdGZWF0dXJlc18gKQorICAgICAgLCBvcHRpbWFsVGlsaW5nRmVhdHVyZXMoIG9wdGltYWxUaWxpbmdGZWF0dXJlc18gKQorICAgICAgLCBidWZmZXJGZWF0dXJlcyggYnVmZmVyRmVhdHVyZXNfICkKKyAgICB7fQorCisgICAgRm9ybWF0UHJvcGVydGllcyggVmtGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEZvcm1hdFByb3BlcnRpZXMmIG9wZXJhdG9yPSggVmtGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGb3JtYXRQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Zvcm1hdFByb3BlcnRpZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtGb3JtYXRQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEZvcm1hdFByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBsaW5lYXJUaWxpbmdGZWF0dXJlcyA9PSByaHMubGluZWFyVGlsaW5nRmVhdHVyZXMgKQorICAgICAgICAgICYmICggb3B0aW1hbFRpbGluZ0ZlYXR1cmVzID09IHJocy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgKQorICAgICAgICAgICYmICggYnVmZmVyRmVhdHVyZXMgPT0gcmhzLmJ1ZmZlckZlYXR1cmVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRGZWF0dXJlRmxhZ3MgbGluZWFyVGlsaW5nRmVhdHVyZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdEZlYXR1cmVGbGFncyBvcHRpbWFsVGlsaW5nRmVhdHVyZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdEZlYXR1cmVGbGFncyBidWZmZXJGZWF0dXJlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBGb3JtYXRQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa0Zvcm1hdFByb3BlcnRpZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8Rm9ybWF0UHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRm9ybWF0UHJvcGVydGllczIKKyAgeworICAgIEZvcm1hdFByb3BlcnRpZXMyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllcyBmb3JtYXRQcm9wZXJ0aWVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRQcm9wZXJ0aWVzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZvcm1hdFByb3BlcnRpZXMoIGZvcm1hdFByb3BlcnRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMyICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllczIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMyICkgLSBvZmZzZXRvZiggRm9ybWF0UHJvcGVydGllczIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGb3JtYXRQcm9wZXJ0aWVzMiggVmtGb3JtYXRQcm9wZXJ0aWVzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBGb3JtYXRQcm9wZXJ0aWVzMiYgb3BlcmF0b3I9KCBWa0Zvcm1hdFByb3BlcnRpZXMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMyIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRm9ybWF0UHJvcGVydGllczIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Zvcm1hdFByb3BlcnRpZXMyKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0Zvcm1hdFByb3BlcnRpZXMyICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRm9ybWF0UHJvcGVydGllczIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRm9ybWF0UHJvcGVydGllczIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZvcm1hdFByb3BlcnRpZXMgPT0gcmhzLmZvcm1hdFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEZvcm1hdFByb3BlcnRpZXMyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUZvcm1hdFByb3BlcnRpZXMyOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllcyBmb3JtYXRQcm9wZXJ0aWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEZvcm1hdFByb3BlcnRpZXMyICkgPT0gc2l6ZW9mKCBWa0Zvcm1hdFByb3BlcnRpZXMyICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEZvcm1hdFByb3BlcnRpZXMyPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgdXNhZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgdmlld0Zvcm1hdENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0KiBwVmlld0Zvcm1hdHNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHVzYWdlKCB1c2FnZV8gKQorICAgICAgLCB3aWR0aCggd2lkdGhfICkKKyAgICAgICwgaGVpZ2h0KCBoZWlnaHRfICkKKyAgICAgICwgbGF5ZXJDb3VudCggbGF5ZXJDb3VudF8gKQorICAgICAgLCB2aWV3Rm9ybWF0Q291bnQoIHZpZXdGb3JtYXRDb3VudF8gKQorICAgICAgLCBwVmlld0Zvcm1hdHMoIHBWaWV3Rm9ybWF0c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgKSAtIG9mZnNldG9mKCBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIoIFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiAmIHNldFVzYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB1c2FnZSA9IHVzYWdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgJiBzZXRXaWR0aCggdWludDMyX3Qgd2lkdGhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHdpZHRoID0gd2lkdGhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiAmIHNldEhlaWdodCggdWludDMyX3QgaGVpZ2h0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoZWlnaHQgPSBoZWlnaHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiAmIHNldExheWVyQ291bnQoIHVpbnQzMl90IGxheWVyQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxheWVyQ291bnQgPSBsYXllckNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgJiBzZXRWaWV3Rm9ybWF0Q291bnQoIHVpbnQzMl90IHZpZXdGb3JtYXRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmlld0Zvcm1hdENvdW50ID0gdmlld0Zvcm1hdENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgJiBzZXRQVmlld0Zvcm1hdHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQqIHBWaWV3Rm9ybWF0c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFZpZXdGb3JtYXRzID0gcFZpZXdGb3JtYXRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCB1c2FnZSA9PSByaHMudXNhZ2UgKQorICAgICAgICAgICYmICggd2lkdGggPT0gcmhzLndpZHRoICkKKyAgICAgICAgICAmJiAoIGhlaWdodCA9PSByaHMuaGVpZ2h0ICkKKyAgICAgICAgICAmJiAoIGxheWVyQ291bnQgPT0gcmhzLmxheWVyQ291bnQgKQorICAgICAgICAgICYmICggdmlld0Zvcm1hdENvdW50ID09IHJocy52aWV3Rm9ybWF0Q291bnQgKQorICAgICAgICAgICYmICggcFZpZXdGb3JtYXRzID09IHJocy5wVmlld0Zvcm1hdHMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgdXNhZ2U7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGxheWVyQ291bnQ7CisgICAgdWludDMyX3Qgdmlld0Zvcm1hdENvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQqIHBWaWV3Rm9ybWF0czsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgKSA9PSBzaXplb2YoIFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSKCB1aW50MzJfdCBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiogcEF0dGFjaG1lbnRJbWFnZUluZm9zXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCggYXR0YWNobWVudEltYWdlSW5mb0NvdW50XyApCisgICAgICAsIHBBdHRhY2htZW50SW1hZ2VJbmZvcyggcEF0dGFjaG1lbnRJbWFnZUluZm9zXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIoIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgJiBzZXRBdHRhY2htZW50SW1hZ2VJbmZvQ291bnQoIHVpbnQzMl90IGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYXR0YWNobWVudEltYWdlSW5mb0NvdW50ID0gYXR0YWNobWVudEltYWdlSW5mb0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAmIHNldFBBdHRhY2htZW50SW1hZ2VJbmZvcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiogcEF0dGFjaG1lbnRJbWFnZUluZm9zXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQXR0YWNobWVudEltYWdlSW5mb3MgPSBwQXR0YWNobWVudEltYWdlSW5mb3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCA9PSByaHMuYXR0YWNobWVudEltYWdlSW5mb0NvdW50ICkKKyAgICAgICAgICAmJiAoIHBBdHRhY2htZW50SW1hZ2VJbmZvcyA9PSByaHMucEF0dGFjaG1lbnRJbWFnZUluZm9zICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgYXR0YWNobWVudEltYWdlSW5mb0NvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIqIHBBdHRhY2htZW50SW1hZ2VJbmZvczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiApID09IHNpemVvZiggVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRnJhbWVidWZmZXJDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdHRhY2htZW50Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcqIHBBdHRhY2htZW50c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCByZW5kZXJQYXNzKCByZW5kZXJQYXNzXyApCisgICAgICAsIGF0dGFjaG1lbnRDb3VudCggYXR0YWNobWVudENvdW50XyApCisgICAgICAsIHBBdHRhY2htZW50cyggcEF0dGFjaG1lbnRzXyApCisgICAgICAsIHdpZHRoKCB3aWR0aF8gKQorICAgICAgLCBoZWlnaHQoIGhlaWdodF8gKQorICAgICAgLCBsYXllcnMoIGxheWVyc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXJDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXJDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8oIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRnJhbWVidWZmZXJDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAmIHNldFJlbmRlclBhc3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJlbmRlclBhc3MgPSByZW5kZXJQYXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gJiBzZXRBdHRhY2htZW50Q291bnQoIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYXR0YWNobWVudENvdW50ID0gYXR0YWNobWVudENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gJiBzZXRQQXR0YWNobWVudHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcqIHBBdHRhY2htZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEF0dGFjaG1lbnRzID0gcEF0dGFjaG1lbnRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gJiBzZXRXaWR0aCggdWludDMyX3Qgd2lkdGhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHdpZHRoID0gd2lkdGhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAmIHNldEhlaWdodCggdWludDMyX3QgaGVpZ2h0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoZWlnaHQgPSBoZWlnaHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAmIHNldExheWVycyggdWludDMyX3QgbGF5ZXJzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBsYXllcnMgPSBsYXllcnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHJlbmRlclBhc3MgPT0gcmhzLnJlbmRlclBhc3MgKQorICAgICAgICAgICYmICggYXR0YWNobWVudENvdW50ID09IHJocy5hdHRhY2htZW50Q291bnQgKQorICAgICAgICAgICYmICggcEF0dGFjaG1lbnRzID09IHJocy5wQXR0YWNobWVudHMgKQorICAgICAgICAgICYmICggd2lkdGggPT0gcmhzLndpZHRoICkKKyAgICAgICAgICAmJiAoIGhlaWdodCA9PSByaHMuaGVpZ2h0ICkKKyAgICAgICAgICAmJiAoIGxheWVycyA9PSByaHMubGF5ZXJzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplRnJhbWVidWZmZXJDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXJDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzOworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3KiBwQXR0YWNobWVudHM7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGxheWVyczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEZyYW1lYnVmZmVyQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WCisgIHsKKyAgICBGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOViBjb3ZlcmFnZVJlZHVjdGlvbk1vZGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvdmVyYWdlUmVkdWN0aW9uTW9kZU5WOjplTWVyZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyByYXN0ZXJpemF0aW9uU2FtcGxlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0czo6ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBkZXB0aFN0ZW5jaWxTYW1wbGVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBjb2xvclNhbXBsZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlKCBjb3ZlcmFnZVJlZHVjdGlvbk1vZGVfICkKKyAgICAgICwgcmFzdGVyaXphdGlvblNhbXBsZXMoIHJhc3Rlcml6YXRpb25TYW1wbGVzXyApCisgICAgICAsIGRlcHRoU3RlbmNpbFNhbXBsZXMoIGRlcHRoU3RlbmNpbFNhbXBsZXNfICkKKyAgICAgICwgY29sb3JTYW1wbGVzKCBjb2xvclNhbXBsZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WICkgLSBvZmZzZXRvZiggRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKCBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYmIG9wZXJhdG9yPSggVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlID09IHJocy5jb3ZlcmFnZVJlZHVjdGlvbk1vZGUgKQorICAgICAgICAgICYmICggcmFzdGVyaXphdGlvblNhbXBsZXMgPT0gcmhzLnJhc3Rlcml6YXRpb25TYW1wbGVzICkKKyAgICAgICAgICAmJiAoIGRlcHRoU3RlbmNpbFNhbXBsZXMgPT0gcmhzLmRlcHRoU3RlbmNpbFNhbXBsZXMgKQorICAgICAgICAgICYmICggY29sb3JTYW1wbGVzID09IHJocy5jb2xvclNhbXBsZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOViBjb3ZlcmFnZVJlZHVjdGlvbk1vZGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgcmFzdGVyaXphdGlvblNhbXBsZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MgZGVwdGhTdGVuY2lsU2FtcGxlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBjb2xvclNhbXBsZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WICkgPT0gc2l6ZW9mKCBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiggdWludDMyX3QgYmluZGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZlcnRleElucHV0UmF0ZSBpbnB1dFJhdGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZlcnRleElucHV0UmF0ZTo6ZVZlcnRleCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYmluZGluZyggYmluZGluZ18gKQorICAgICAgLCBzdHJpZGUoIHN0cmlkZV8gKQorICAgICAgLCBpbnB1dFJhdGUoIGlucHV0UmF0ZV8gKQorICAgIHt9CisKKyAgICBWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiggVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiYgb3BlcmF0b3I9KCBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uICYgc2V0QmluZGluZyggdWludDMyX3QgYmluZGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYmluZGluZyA9IGJpbmRpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uICYgc2V0U3RyaWRlKCB1aW50MzJfdCBzdHJpZGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0cmlkZSA9IHN0cmlkZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gJiBzZXRJbnB1dFJhdGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWZXJ0ZXhJbnB1dFJhdGUgaW5wdXRSYXRlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbnB1dFJhdGUgPSBpbnB1dFJhdGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBiaW5kaW5nID09IHJocy5iaW5kaW5nICkKKyAgICAgICAgICAmJiAoIHN0cmlkZSA9PSByaHMuc3RyaWRlICkKKyAgICAgICAgICAmJiAoIGlucHV0UmF0ZSA9PSByaHMuaW5wdXRSYXRlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50MzJfdCBiaW5kaW5nOworICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmVydGV4SW5wdXRSYXRlIGlucHV0UmF0ZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiApID09IHNpemVvZiggVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiggdWludDMyX3QgbG9jYXRpb25fID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaW5kaW5nXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdDo6ZVVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbG9jYXRpb24oIGxvY2F0aW9uXyApCisgICAgICAsIGJpbmRpbmcoIGJpbmRpbmdfICkKKyAgICAgICwgZm9ybWF0KCBmb3JtYXRfICkKKyAgICAgICwgb2Zmc2V0KCBvZmZzZXRfICkKKyAgICB7fQorCisgICAgVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiggVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24mIG9wZXJhdG9yPSggVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiAmIHNldExvY2F0aW9uKCB1aW50MzJfdCBsb2NhdGlvbl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiAmIHNldEJpbmRpbmcoIHVpbnQzMl90IGJpbmRpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJpbmRpbmcgPSBiaW5kaW5nXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uICYgc2V0Rm9ybWF0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZm9ybWF0ID0gZm9ybWF0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uICYgc2V0T2Zmc2V0KCB1aW50MzJfdCBvZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9mZnNldCA9IG9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBsb2NhdGlvbiA9PSByaHMubG9jYXRpb24gKQorICAgICAgICAgICYmICggYmluZGluZyA9PSByaHMuYmluZGluZyApCisgICAgICAgICAgJiYgKCBmb3JtYXQgPT0gcmhzLmZvcm1hdCApCisgICAgICAgICAgJiYgKCBvZmZzZXQgPT0gcmhzLm9mZnNldCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50MzJfdCBsb2NhdGlvbjsKKyAgICB1aW50MzJfdCBiaW5kaW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0OworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uICkgPT0gc2l6ZW9mKCBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8VmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uKiBwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiogcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgdmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQoIHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50XyApCisgICAgICAsIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zKCBwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uc18gKQorICAgICAgLCB2ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50KCB2ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50XyApCisgICAgICAsIHBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMoIHBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8oIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvICYgc2V0VmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQoIHVpbnQzMl90IHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvICYgc2V0UFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiogcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gJiBzZXRWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50KCB1aW50MzJfdCB2ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gdmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyAmIHNldFBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uKiBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCB2ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9PSByaHMudmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgKQorICAgICAgICAgICYmICggcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgPT0gcmhzLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zICkKKyAgICAgICAgICAmJiAoIHZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPT0gcmhzLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgKQorICAgICAgICAgICYmICggcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9PSByaHMucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3QgdmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uKiBwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uczsKKyAgICB1aW50MzJfdCB2ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uKiBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmltaXRpdmVUb3BvbG9neSB0b3BvbG9neV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJpbWl0aXZlVG9wb2xvZ3k6OmVQb2ludExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHByaW1pdGl2ZVJlc3RhcnRFbmFibGVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHRvcG9sb2d5KCB0b3BvbG9neV8gKQorICAgICAgLCBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlKCBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyggVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvICYgc2V0VG9wb2xvZ3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmltaXRpdmVUb3BvbG9neSB0b3BvbG9neV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdG9wb2xvZ3kgPSB0b3BvbG9neV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvICYgc2V0UHJpbWl0aXZlUmVzdGFydEVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlID0gcHJpbWl0aXZlUmVzdGFydEVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggdG9wb2xvZ3kgPT0gcmhzLnRvcG9sb2d5ICkKKyAgICAgICAgICAmJiAoIHByaW1pdGl2ZVJlc3RhcnRFbmFibGUgPT0gcmhzLnByaW1pdGl2ZVJlc3RhcnRFbmFibGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmltaXRpdmVUb3BvbG9neSB0b3BvbG9neTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHByaW1pdGl2ZVJlc3RhcnRFbmFibGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhdGNoQ29udHJvbFBvaW50c18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgcGF0Y2hDb250cm9sUG9pbnRzKCBwYXRjaENvbnRyb2xQb2ludHNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyggVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyAmIHNldFBhdGNoQ29udHJvbFBvaW50cyggdWludDMyX3QgcGF0Y2hDb250cm9sUG9pbnRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwYXRjaENvbnRyb2xQb2ludHMgPSBwYXRjaENvbnRyb2xQb2ludHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBwYXRjaENvbnRyb2xQb2ludHMgPT0gcmhzLnBhdGNoQ29udHJvbFBvaW50cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3QgcGF0Y2hDb250cm9sUG9pbnRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBWaWV3cG9ydAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgVmlld3BvcnQoIGZsb2F0IHhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoZWlnaHRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWluRGVwdGhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4RGVwdGhfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogeCggeF8gKQorICAgICAgLCB5KCB5XyApCisgICAgICAsIHdpZHRoKCB3aWR0aF8gKQorICAgICAgLCBoZWlnaHQoIGhlaWdodF8gKQorICAgICAgLCBtaW5EZXB0aCggbWluRGVwdGhfICkKKyAgICAgICwgbWF4RGVwdGgoIG1heERlcHRoXyApCisgICAge30KKworICAgIFZpZXdwb3J0KCBWa1ZpZXdwb3J0IGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFZpZXdwb3J0JiBvcGVyYXRvcj0oIFZrVmlld3BvcnQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlld3BvcnQgJiBzZXRYKCBmbG9hdCB4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB4ID0geF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlld3BvcnQgJiBzZXRZKCBmbG9hdCB5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB5ID0geV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlld3BvcnQgJiBzZXRXaWR0aCggZmxvYXQgd2lkdGhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHdpZHRoID0gd2lkdGhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZpZXdwb3J0ICYgc2V0SGVpZ2h0KCBmbG9hdCBoZWlnaHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhlaWdodCA9IGhlaWdodF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlld3BvcnQgJiBzZXRNaW5EZXB0aCggZmxvYXQgbWluRGVwdGhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1pbkRlcHRoID0gbWluRGVwdGhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZpZXdwb3J0ICYgc2V0TWF4RGVwdGgoIGZsb2F0IG1heERlcHRoXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXhEZXB0aCA9IG1heERlcHRoXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ZpZXdwb3J0IGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWaWV3cG9ydCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtWaWV3cG9ydCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1ZpZXdwb3J0Kj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFZpZXdwb3J0IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggeCA9PSByaHMueCApCisgICAgICAgICAgJiYgKCB5ID09IHJocy55ICkKKyAgICAgICAgICAmJiAoIHdpZHRoID09IHJocy53aWR0aCApCisgICAgICAgICAgJiYgKCBoZWlnaHQgPT0gcmhzLmhlaWdodCApCisgICAgICAgICAgJiYgKCBtaW5EZXB0aCA9PSByaHMubWluRGVwdGggKQorICAgICAgICAgICYmICggbWF4RGVwdGggPT0gcmhzLm1heERlcHRoICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBWaWV3cG9ydCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBmbG9hdCB4OworICAgIGZsb2F0IHk7CisgICAgZmxvYXQgd2lkdGg7CisgICAgZmxvYXQgaGVpZ2h0OworICAgIGZsb2F0IG1pbkRlcHRoOworICAgIGZsb2F0IG1heERlcHRoOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFZpZXdwb3J0ICkgPT0gc2l6ZW9mKCBWa1ZpZXdwb3J0ICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFZpZXdwb3J0Pjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgdmlld3BvcnRDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydCogcFZpZXdwb3J0c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjaXNzb3JDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBTY2lzc29yc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgdmlld3BvcnRDb3VudCggdmlld3BvcnRDb3VudF8gKQorICAgICAgLCBwVmlld3BvcnRzKCBwVmlld3BvcnRzXyApCisgICAgICAsIHNjaXNzb3JDb3VudCggc2Npc3NvckNvdW50XyApCisgICAgICAsIHBTY2lzc29ycyggcFNjaXNzb3JzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKCBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyAmIHNldFZpZXdwb3J0Q291bnQoIHVpbnQzMl90IHZpZXdwb3J0Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZpZXdwb3J0Q291bnQgPSB2aWV3cG9ydENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvICYgc2V0UFZpZXdwb3J0cyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0KiBwVmlld3BvcnRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmlld3BvcnRzID0gcFZpZXdwb3J0c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyAmIHNldFNjaXNzb3JDb3VudCggdWludDMyX3Qgc2Npc3NvckNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzY2lzc29yQ291bnQgPSBzY2lzc29yQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gJiBzZXRQU2Npc3NvcnMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBTY2lzc29yc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFNjaXNzb3JzID0gcFNjaXNzb3JzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHZpZXdwb3J0Q291bnQgPT0gcmhzLnZpZXdwb3J0Q291bnQgKQorICAgICAgICAgICYmICggcFZpZXdwb3J0cyA9PSByaHMucFZpZXdwb3J0cyApCisgICAgICAgICAgJiYgKCBzY2lzc29yQ291bnQgPT0gcmhzLnNjaXNzb3JDb3VudCApCisgICAgICAgICAgJiYgKCBwU2Npc3NvcnMgPT0gcmhzLnBTY2lzc29ycyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3Qgdmlld3BvcnRDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnQqIHBWaWV3cG9ydHM7CisgICAgdWludDMyX3Qgc2Npc3NvckNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBTY2lzc29yczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlcHRoQ2xhbXBFbmFibGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmFzdGVyaXplckRpc2NhcmRFbmFibGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQb2x5Z29uTW9kZSBwb2x5Z29uTW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UG9seWdvbk1vZGU6OmVGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkN1bGxNb2RlRmxhZ3MgY3VsbE1vZGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkN1bGxNb2RlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcm9udEZhY2UgZnJvbnRGYWNlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcm9udEZhY2U6OmVDb3VudGVyQ2xvY2t3aXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aEJpYXNFbmFibGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZXB0aEJpYXNDbGFtcF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVwdGhCaWFzU2xvcGVGYWN0b3JfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxpbmVXaWR0aF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgZGVwdGhDbGFtcEVuYWJsZSggZGVwdGhDbGFtcEVuYWJsZV8gKQorICAgICAgLCByYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSggcmFzdGVyaXplckRpc2NhcmRFbmFibGVfICkKKyAgICAgICwgcG9seWdvbk1vZGUoIHBvbHlnb25Nb2RlXyApCisgICAgICAsIGN1bGxNb2RlKCBjdWxsTW9kZV8gKQorICAgICAgLCBmcm9udEZhY2UoIGZyb250RmFjZV8gKQorICAgICAgLCBkZXB0aEJpYXNFbmFibGUoIGRlcHRoQmlhc0VuYWJsZV8gKQorICAgICAgLCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciggZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3JfICkKKyAgICAgICwgZGVwdGhCaWFzQ2xhbXAoIGRlcHRoQmlhc0NsYW1wXyApCisgICAgICAsIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKCBkZXB0aEJpYXNTbG9wZUZhY3Rvcl8gKQorICAgICAgLCBsaW5lV2lkdGgoIGxpbmVXaWR0aF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8oIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyAmIHNldERlcHRoQ2xhbXBFbmFibGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhDbGFtcEVuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGhDbGFtcEVuYWJsZSA9IGRlcHRoQ2xhbXBFbmFibGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyAmIHNldFJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA9IHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gJiBzZXRQb2x5Z29uTW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBvbHlnb25Nb2RlIHBvbHlnb25Nb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwb2x5Z29uTW9kZSA9IHBvbHlnb25Nb2RlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gJiBzZXRDdWxsTW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkN1bGxNb2RlRmxhZ3MgY3VsbE1vZGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGN1bGxNb2RlID0gY3VsbE1vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyAmIHNldEZyb250RmFjZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyb250RmFjZSBmcm9udEZhY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZyb250RmFjZSA9IGZyb250RmFjZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvICYgc2V0RGVwdGhCaWFzRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlcHRoQmlhc0VuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGhCaWFzRW5hYmxlID0gZGVwdGhCaWFzRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gJiBzZXREZXB0aEJpYXNDb25zdGFudEZhY3RvciggZmxvYXQgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3JfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yID0gZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3JfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyAmIHNldERlcHRoQmlhc0NsYW1wKCBmbG9hdCBkZXB0aEJpYXNDbGFtcF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGhCaWFzQ2xhbXAgPSBkZXB0aEJpYXNDbGFtcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvICYgc2V0RGVwdGhCaWFzU2xvcGVGYWN0b3IoIGZsb2F0IGRlcHRoQmlhc1Nsb3BlRmFjdG9yXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXB0aEJpYXNTbG9wZUZhY3RvciA9IGRlcHRoQmlhc1Nsb3BlRmFjdG9yXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gJiBzZXRMaW5lV2lkdGgoIGZsb2F0IGxpbmVXaWR0aF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbGluZVdpZHRoID0gbGluZVdpZHRoXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBkZXB0aENsYW1wRW5hYmxlID09IHJocy5kZXB0aENsYW1wRW5hYmxlICkKKyAgICAgICAgICAmJiAoIHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID09IHJocy5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSApCisgICAgICAgICAgJiYgKCBwb2x5Z29uTW9kZSA9PSByaHMucG9seWdvbk1vZGUgKQorICAgICAgICAgICYmICggY3VsbE1vZGUgPT0gcmhzLmN1bGxNb2RlICkKKyAgICAgICAgICAmJiAoIGZyb250RmFjZSA9PSByaHMuZnJvbnRGYWNlICkKKyAgICAgICAgICAmJiAoIGRlcHRoQmlhc0VuYWJsZSA9PSByaHMuZGVwdGhCaWFzRW5hYmxlICkKKyAgICAgICAgICAmJiAoIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yID09IHJocy5kZXB0aEJpYXNDb25zdGFudEZhY3RvciApCisgICAgICAgICAgJiYgKCBkZXB0aEJpYXNDbGFtcCA9PSByaHMuZGVwdGhCaWFzQ2xhbXAgKQorICAgICAgICAgICYmICggZGVwdGhCaWFzU2xvcGVGYWN0b3IgPT0gcmhzLmRlcHRoQmlhc1Nsb3BlRmFjdG9yICkKKyAgICAgICAgICAmJiAoIGxpbmVXaWR0aCA9PSByaHMubGluZVdpZHRoICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlcHRoQ2xhbXBFbmFibGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByYXN0ZXJpemVyRGlzY2FyZEVuYWJsZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UG9seWdvbk1vZGUgcG9seWdvbk1vZGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkN1bGxNb2RlRmxhZ3MgY3VsbE1vZGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyb250RmFjZSBmcm9udEZhY2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aEJpYXNFbmFibGU7CisgICAgZmxvYXQgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3I7CisgICAgZmxvYXQgZGVwdGhCaWFzQ2xhbXA7CisgICAgZmxvYXQgZGVwdGhCaWFzU2xvcGVGYWN0b3I7CisgICAgZmxvYXQgbGluZVdpZHRoOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgcmFzdGVyaXphdGlvblNhbXBsZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHM6OmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2FtcGxlU2hhZGluZ0VuYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1pblNhbXBsZVNoYWRpbmdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlTWFzayogcFNhbXBsZU1hc2tfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFscGhhVG9Db3ZlcmFnZUVuYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYWxwaGFUb09uZUVuYWJsZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgcmFzdGVyaXphdGlvblNhbXBsZXMoIHJhc3Rlcml6YXRpb25TYW1wbGVzXyApCisgICAgICAsIHNhbXBsZVNoYWRpbmdFbmFibGUoIHNhbXBsZVNoYWRpbmdFbmFibGVfICkKKyAgICAgICwgbWluU2FtcGxlU2hhZGluZyggbWluU2FtcGxlU2hhZGluZ18gKQorICAgICAgLCBwU2FtcGxlTWFzayggcFNhbXBsZU1hc2tfICkKKyAgICAgICwgYWxwaGFUb0NvdmVyYWdlRW5hYmxlKCBhbHBoYVRvQ292ZXJhZ2VFbmFibGVfICkKKyAgICAgICwgYWxwaGFUb09uZUVuYWJsZSggYWxwaGFUb09uZUVuYWJsZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyggVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gJiBzZXRSYXN0ZXJpemF0aW9uU2FtcGxlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgcmFzdGVyaXphdGlvblNhbXBsZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJhc3Rlcml6YXRpb25TYW1wbGVzID0gcmFzdGVyaXphdGlvblNhbXBsZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gJiBzZXRTYW1wbGVTaGFkaW5nRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNhbXBsZVNoYWRpbmdFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNhbXBsZVNoYWRpbmdFbmFibGUgPSBzYW1wbGVTaGFkaW5nRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvICYgc2V0TWluU2FtcGxlU2hhZGluZyggZmxvYXQgbWluU2FtcGxlU2hhZGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWluU2FtcGxlU2hhZGluZyA9IG1pblNhbXBsZVNoYWRpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gJiBzZXRQU2FtcGxlTWFzayggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZU1hc2sqIHBTYW1wbGVNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwU2FtcGxlTWFzayA9IHBTYW1wbGVNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvICYgc2V0QWxwaGFUb0NvdmVyYWdlRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFscGhhVG9Db3ZlcmFnZUVuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYWxwaGFUb0NvdmVyYWdlRW5hYmxlID0gYWxwaGFUb0NvdmVyYWdlRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvICYgc2V0QWxwaGFUb09uZUVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhbHBoYVRvT25lRW5hYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhbHBoYVRvT25lRW5hYmxlID0gYWxwaGFUb09uZUVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCByYXN0ZXJpemF0aW9uU2FtcGxlcyA9PSByaHMucmFzdGVyaXphdGlvblNhbXBsZXMgKQorICAgICAgICAgICYmICggc2FtcGxlU2hhZGluZ0VuYWJsZSA9PSByaHMuc2FtcGxlU2hhZGluZ0VuYWJsZSApCisgICAgICAgICAgJiYgKCBtaW5TYW1wbGVTaGFkaW5nID09IHJocy5taW5TYW1wbGVTaGFkaW5nICkKKyAgICAgICAgICAmJiAoIHBTYW1wbGVNYXNrID09IHJocy5wU2FtcGxlTWFzayApCisgICAgICAgICAgJiYgKCBhbHBoYVRvQ292ZXJhZ2VFbmFibGUgPT0gcmhzLmFscGhhVG9Db3ZlcmFnZUVuYWJsZSApCisgICAgICAgICAgJiYgKCBhbHBoYVRvT25lRW5hYmxlID09IHJocy5hbHBoYVRvT25lRW5hYmxlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyByYXN0ZXJpemF0aW9uU2FtcGxlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNhbXBsZVNoYWRpbmdFbmFibGU7CisgICAgZmxvYXQgbWluU2FtcGxlU2hhZGluZzsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlTWFzayogcFNhbXBsZU1hc2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhbHBoYVRvQ292ZXJhZ2VFbmFibGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhbHBoYVRvT25lRW5hYmxlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTdGVuY2lsT3BTdGF0ZQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3RlbmNpbE9wU3RhdGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3AgZmFpbE9wXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3A6OmVLZWVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbE9wIHBhc3NPcF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbE9wOjplS2VlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxPcCBkZXB0aEZhaWxPcF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbE9wOjplS2VlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBhcmVPcCBjb21wYXJlT3BfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBhcmVPcDo6ZU5ldmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb21wYXJlTWFza18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZU1hc2tfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVmZXJlbmNlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZhaWxPcCggZmFpbE9wXyApCisgICAgICAsIHBhc3NPcCggcGFzc09wXyApCisgICAgICAsIGRlcHRoRmFpbE9wKCBkZXB0aEZhaWxPcF8gKQorICAgICAgLCBjb21wYXJlT3AoIGNvbXBhcmVPcF8gKQorICAgICAgLCBjb21wYXJlTWFzayggY29tcGFyZU1hc2tfICkKKyAgICAgICwgd3JpdGVNYXNrKCB3cml0ZU1hc2tfICkKKyAgICAgICwgcmVmZXJlbmNlKCByZWZlcmVuY2VfICkKKyAgICB7fQorCisgICAgU3RlbmNpbE9wU3RhdGUoIFZrU3RlbmNpbE9wU3RhdGUgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3RlbmNpbE9wU3RhdGUmIG9wZXJhdG9yPSggVmtTdGVuY2lsT3BTdGF0ZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3BTdGF0ZSBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdGVuY2lsT3BTdGF0ZSAmIHNldEZhaWxPcCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxPcCBmYWlsT3BfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZhaWxPcCA9IGZhaWxPcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3RlbmNpbE9wU3RhdGUgJiBzZXRQYXNzT3AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3AgcGFzc09wXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwYXNzT3AgPSBwYXNzT3BfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN0ZW5jaWxPcFN0YXRlICYgc2V0RGVwdGhGYWlsT3AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3AgZGVwdGhGYWlsT3BfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlcHRoRmFpbE9wID0gZGVwdGhGYWlsT3BfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN0ZW5jaWxPcFN0YXRlICYgc2V0Q29tcGFyZU9wKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcGFyZU9wIGNvbXBhcmVPcF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29tcGFyZU9wID0gY29tcGFyZU9wXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdGVuY2lsT3BTdGF0ZSAmIHNldENvbXBhcmVNYXNrKCB1aW50MzJfdCBjb21wYXJlTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29tcGFyZU1hc2sgPSBjb21wYXJlTWFza187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3RlbmNpbE9wU3RhdGUgJiBzZXRXcml0ZU1hc2soIHVpbnQzMl90IHdyaXRlTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgd3JpdGVNYXNrID0gd3JpdGVNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdGVuY2lsT3BTdGF0ZSAmIHNldFJlZmVyZW5jZSggdWludDMyX3QgcmVmZXJlbmNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3RlbmNpbE9wU3RhdGUgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N0ZW5jaWxPcFN0YXRlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N0ZW5jaWxPcFN0YXRlICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU3RlbmNpbE9wU3RhdGUqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3RlbmNpbE9wU3RhdGUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBmYWlsT3AgPT0gcmhzLmZhaWxPcCApCisgICAgICAgICAgJiYgKCBwYXNzT3AgPT0gcmhzLnBhc3NPcCApCisgICAgICAgICAgJiYgKCBkZXB0aEZhaWxPcCA9PSByaHMuZGVwdGhGYWlsT3AgKQorICAgICAgICAgICYmICggY29tcGFyZU9wID09IHJocy5jb21wYXJlT3AgKQorICAgICAgICAgICYmICggY29tcGFyZU1hc2sgPT0gcmhzLmNvbXBhcmVNYXNrICkKKyAgICAgICAgICAmJiAoIHdyaXRlTWFzayA9PSByaHMud3JpdGVNYXNrICkKKyAgICAgICAgICAmJiAoIHJlZmVyZW5jZSA9PSByaHMucmVmZXJlbmNlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdGVuY2lsT3BTdGF0ZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbE9wIGZhaWxPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbE9wIHBhc3NPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbE9wIGRlcHRoRmFpbE9wOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wYXJlT3AgY29tcGFyZU9wOworICAgIHVpbnQzMl90IGNvbXBhcmVNYXNrOworICAgIHVpbnQzMl90IHdyaXRlTWFzazsKKyAgICB1aW50MzJfdCByZWZlcmVuY2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3RlbmNpbE9wU3RhdGUgKSA9PSBzaXplb2YoIFZrU3RlbmNpbE9wU3RhdGUgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3RlbmNpbE9wU3RhdGU+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhUZXN0RW5hYmxlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhXcml0ZUVuYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcGFyZU9wIGRlcHRoQ29tcGFyZU9wXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wYXJlT3A6OmVOZXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aEJvdW5kc1Rlc3RFbmFibGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdGVuY2lsVGVzdEVuYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbE9wU3RhdGUgZnJvbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxPcFN0YXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3BTdGF0ZSBiYWNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3BTdGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW5EZXB0aEJvdW5kc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhEZXB0aEJvdW5kc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgZGVwdGhUZXN0RW5hYmxlKCBkZXB0aFRlc3RFbmFibGVfICkKKyAgICAgICwgZGVwdGhXcml0ZUVuYWJsZSggZGVwdGhXcml0ZUVuYWJsZV8gKQorICAgICAgLCBkZXB0aENvbXBhcmVPcCggZGVwdGhDb21wYXJlT3BfICkKKyAgICAgICwgZGVwdGhCb3VuZHNUZXN0RW5hYmxlKCBkZXB0aEJvdW5kc1Rlc3RFbmFibGVfICkKKyAgICAgICwgc3RlbmNpbFRlc3RFbmFibGUoIHN0ZW5jaWxUZXN0RW5hYmxlXyApCisgICAgICAsIGZyb250KCBmcm9udF8gKQorICAgICAgLCBiYWNrKCBiYWNrXyApCisgICAgICAsIG1pbkRlcHRoQm91bmRzKCBtaW5EZXB0aEJvdW5kc18gKQorICAgICAgLCBtYXhEZXB0aEJvdW5kcyggbWF4RGVwdGhCb3VuZHNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyggVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyAmIHNldERlcHRoVGVzdEVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aFRlc3RFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlcHRoVGVzdEVuYWJsZSA9IGRlcHRoVGVzdEVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gJiBzZXREZXB0aFdyaXRlRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlcHRoV3JpdGVFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlcHRoV3JpdGVFbmFibGUgPSBkZXB0aFdyaXRlRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyAmIHNldERlcHRoQ29tcGFyZU9wKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcGFyZU9wIGRlcHRoQ29tcGFyZU9wXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXB0aENvbXBhcmVPcCA9IGRlcHRoQ29tcGFyZU9wXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyAmIHNldERlcHRoQm91bmRzVGVzdEVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aEJvdW5kc1Rlc3RFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlcHRoQm91bmRzVGVzdEVuYWJsZSA9IGRlcHRoQm91bmRzVGVzdEVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gJiBzZXRTdGVuY2lsVGVzdEVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdGVuY2lsVGVzdEVuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RlbmNpbFRlc3RFbmFibGUgPSBzdGVuY2lsVGVzdEVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gJiBzZXRGcm9udCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxPcFN0YXRlIGZyb250XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmcm9udCA9IGZyb250XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyAmIHNldEJhY2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3BTdGF0ZSBiYWNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiYWNrID0gYmFja187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gJiBzZXRNaW5EZXB0aEJvdW5kcyggZmxvYXQgbWluRGVwdGhCb3VuZHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1pbkRlcHRoQm91bmRzID0gbWluRGVwdGhCb3VuZHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICYgc2V0TWF4RGVwdGhCb3VuZHMoIGZsb2F0IG1heERlcHRoQm91bmRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXhEZXB0aEJvdW5kcyA9IG1heERlcHRoQm91bmRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggZGVwdGhUZXN0RW5hYmxlID09IHJocy5kZXB0aFRlc3RFbmFibGUgKQorICAgICAgICAgICYmICggZGVwdGhXcml0ZUVuYWJsZSA9PSByaHMuZGVwdGhXcml0ZUVuYWJsZSApCisgICAgICAgICAgJiYgKCBkZXB0aENvbXBhcmVPcCA9PSByaHMuZGVwdGhDb21wYXJlT3AgKQorICAgICAgICAgICYmICggZGVwdGhCb3VuZHNUZXN0RW5hYmxlID09IHJocy5kZXB0aEJvdW5kc1Rlc3RFbmFibGUgKQorICAgICAgICAgICYmICggc3RlbmNpbFRlc3RFbmFibGUgPT0gcmhzLnN0ZW5jaWxUZXN0RW5hYmxlICkKKyAgICAgICAgICAmJiAoIGZyb250ID09IHJocy5mcm9udCApCisgICAgICAgICAgJiYgKCBiYWNrID09IHJocy5iYWNrICkKKyAgICAgICAgICAmJiAoIG1pbkRlcHRoQm91bmRzID09IHJocy5taW5EZXB0aEJvdW5kcyApCisgICAgICAgICAgJiYgKCBtYXhEZXB0aEJvdW5kcyA9PSByaHMubWF4RGVwdGhCb3VuZHMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhUZXN0RW5hYmxlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhXcml0ZUVuYWJsZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcGFyZU9wIGRlcHRoQ29tcGFyZU9wOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhCb3VuZHNUZXN0RW5hYmxlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RlbmNpbFRlc3RFbmFibGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxPcFN0YXRlIGZyb250OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsT3BTdGF0ZSBiYWNrOworICAgIGZsb2F0IG1pbkRlcHRoQm91bmRzOworICAgIGZsb2F0IG1heERlcHRoQm91bmRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBibGVuZEVuYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJsZW5kRmFjdG9yIHNyY0NvbG9yQmxlbmRGYWN0b3JfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJsZW5kRmFjdG9yOjplWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZEZhY3RvciBkc3RDb2xvckJsZW5kRmFjdG9yXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZEZhY3Rvcjo6ZVplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRPcCBjb2xvckJsZW5kT3BfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJsZW5kT3A6OmVBZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRGYWN0b3Igc3JjQWxwaGFCbGVuZEZhY3Rvcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRGYWN0b3I6OmVaZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJsZW5kRmFjdG9yIGRzdEFscGhhQmxlbmRGYWN0b3JfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJsZW5kRmFjdG9yOjplWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZE9wIGFscGhhQmxlbmRPcF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRPcDo6ZUFkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2xvckNvbXBvbmVudEZsYWdzIGNvbG9yV3JpdGVNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2xvckNvbXBvbmVudEZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGJsZW5kRW5hYmxlKCBibGVuZEVuYWJsZV8gKQorICAgICAgLCBzcmNDb2xvckJsZW5kRmFjdG9yKCBzcmNDb2xvckJsZW5kRmFjdG9yXyApCisgICAgICAsIGRzdENvbG9yQmxlbmRGYWN0b3IoIGRzdENvbG9yQmxlbmRGYWN0b3JfICkKKyAgICAgICwgY29sb3JCbGVuZE9wKCBjb2xvckJsZW5kT3BfICkKKyAgICAgICwgc3JjQWxwaGFCbGVuZEZhY3Rvciggc3JjQWxwaGFCbGVuZEZhY3Rvcl8gKQorICAgICAgLCBkc3RBbHBoYUJsZW5kRmFjdG9yKCBkc3RBbHBoYUJsZW5kRmFjdG9yXyApCisgICAgICAsIGFscGhhQmxlbmRPcCggYWxwaGFCbGVuZE9wXyApCisgICAgICAsIGNvbG9yV3JpdGVNYXNrKCBjb2xvcldyaXRlTWFza18gKQorICAgIHt9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUoIFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlICYgc2V0QmxlbmRFbmFibGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYmxlbmRFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJsZW5kRW5hYmxlID0gYmxlbmRFbmFibGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSAmIHNldFNyY0NvbG9yQmxlbmRGYWN0b3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZEZhY3RvciBzcmNDb2xvckJsZW5kRmFjdG9yXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcmNDb2xvckJsZW5kRmFjdG9yID0gc3JjQ29sb3JCbGVuZEZhY3Rvcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlICYgc2V0RHN0Q29sb3JCbGVuZEZhY3RvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJsZW5kRmFjdG9yIGRzdENvbG9yQmxlbmRGYWN0b3JfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdENvbG9yQmxlbmRGYWN0b3IgPSBkc3RDb2xvckJsZW5kRmFjdG9yXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUgJiBzZXRDb2xvckJsZW5kT3AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZE9wIGNvbG9yQmxlbmRPcF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29sb3JCbGVuZE9wID0gY29sb3JCbGVuZE9wXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUgJiBzZXRTcmNBbHBoYUJsZW5kRmFjdG9yKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRGYWN0b3Igc3JjQWxwaGFCbGVuZEZhY3Rvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjQWxwaGFCbGVuZEZhY3RvciA9IHNyY0FscGhhQmxlbmRGYWN0b3JfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSAmIHNldERzdEFscGhhQmxlbmRGYWN0b3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZEZhY3RvciBkc3RBbHBoYUJsZW5kRmFjdG9yXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RBbHBoYUJsZW5kRmFjdG9yID0gZHN0QWxwaGFCbGVuZEZhY3Rvcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlICYgc2V0QWxwaGFCbGVuZE9wKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRPcCBhbHBoYUJsZW5kT3BfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFscGhhQmxlbmRPcCA9IGFscGhhQmxlbmRPcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlICYgc2V0Q29sb3JXcml0ZU1hc2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2xvckNvbXBvbmVudEZsYWdzIGNvbG9yV3JpdGVNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb2xvcldyaXRlTWFzayA9IGNvbG9yV3JpdGVNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBibGVuZEVuYWJsZSA9PSByaHMuYmxlbmRFbmFibGUgKQorICAgICAgICAgICYmICggc3JjQ29sb3JCbGVuZEZhY3RvciA9PSByaHMuc3JjQ29sb3JCbGVuZEZhY3RvciApCisgICAgICAgICAgJiYgKCBkc3RDb2xvckJsZW5kRmFjdG9yID09IHJocy5kc3RDb2xvckJsZW5kRmFjdG9yICkKKyAgICAgICAgICAmJiAoIGNvbG9yQmxlbmRPcCA9PSByaHMuY29sb3JCbGVuZE9wICkKKyAgICAgICAgICAmJiAoIHNyY0FscGhhQmxlbmRGYWN0b3IgPT0gcmhzLnNyY0FscGhhQmxlbmRGYWN0b3IgKQorICAgICAgICAgICYmICggZHN0QWxwaGFCbGVuZEZhY3RvciA9PSByaHMuZHN0QWxwaGFCbGVuZEZhY3RvciApCisgICAgICAgICAgJiYgKCBhbHBoYUJsZW5kT3AgPT0gcmhzLmFscGhhQmxlbmRPcCApCisgICAgICAgICAgJiYgKCBjb2xvcldyaXRlTWFzayA9PSByaHMuY29sb3JXcml0ZU1hc2sgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJsZW5kRW5hYmxlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZEZhY3RvciBzcmNDb2xvckJsZW5kRmFjdG9yOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZEZhY3RvciBkc3RDb2xvckJsZW5kRmFjdG9yOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZE9wIGNvbG9yQmxlbmRPcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRGYWN0b3Igc3JjQWxwaGFCbGVuZEZhY3RvcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRGYWN0b3IgZHN0QWxwaGFCbGVuZEZhY3RvcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRPcCBhbHBoYUJsZW5kT3A7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbG9yQ29tcG9uZW50RmxhZ3MgY29sb3JXcml0ZU1hc2s7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGU+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFJfMTQgUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBsb2dpY09wRW5hYmxlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TG9naWNPcCBsb2dpY09wXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpMb2dpY09wOjplQ2xlYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdHRhY2htZW50Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUqIHBBdHRhY2htZW50c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxmbG9hdCw0PiBjb25zdCYgYmxlbmRDb25zdGFudHNfID0geyB7IDAgfSB9ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgbG9naWNPcEVuYWJsZSggbG9naWNPcEVuYWJsZV8gKQorICAgICAgLCBsb2dpY09wKCBsb2dpY09wXyApCisgICAgICAsIGF0dGFjaG1lbnRDb3VudCggYXR0YWNobWVudENvdW50XyApCisgICAgICAsIHBBdHRhY2htZW50cyggcEF0dGFjaG1lbnRzXyApCisgICAgICAsIGJsZW5kQ29uc3RhbnRze30KKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGZsb2F0LDQsND46OmNvcHkoIGJsZW5kQ29uc3RhbnRzLCBibGVuZENvbnN0YW50c18gKTsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8oIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyAmIHNldExvZ2ljT3BFbmFibGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbG9naWNPcEVuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbG9naWNPcEVuYWJsZSA9IGxvZ2ljT3BFbmFibGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyAmIHNldExvZ2ljT3AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpMb2dpY09wIGxvZ2ljT3BfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxvZ2ljT3AgPSBsb2dpY09wXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gJiBzZXRBdHRhY2htZW50Q291bnQoIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYXR0YWNobWVudENvdW50ID0gYXR0YWNobWVudENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gJiBzZXRQQXR0YWNobWVudHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUqIHBBdHRhY2htZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEF0dGFjaG1lbnRzID0gcEF0dGFjaG1lbnRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gJiBzZXRCbGVuZENvbnN0YW50cyggc3RkOjphcnJheTxmbG9hdCw0PiBibGVuZENvbnN0YW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCBibGVuZENvbnN0YW50cywgYmxlbmRDb25zdGFudHNfLmRhdGEoKSwgNCAqIHNpemVvZiggZmxvYXQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGxvZ2ljT3BFbmFibGUgPT0gcmhzLmxvZ2ljT3BFbmFibGUgKQorICAgICAgICAgICYmICggbG9naWNPcCA9PSByaHMubG9naWNPcCApCisgICAgICAgICAgJiYgKCBhdHRhY2htZW50Q291bnQgPT0gcmhzLmF0dGFjaG1lbnRDb3VudCApCisgICAgICAgICAgJiYgKCBwQXR0YWNobWVudHMgPT0gcmhzLnBBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGJsZW5kQ29uc3RhbnRzLCByaHMuYmxlbmRDb25zdGFudHMsIDQgKiBzaXplb2YoIGZsb2F0ICkgKSA9PSAwICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGxvZ2ljT3BFbmFibGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkxvZ2ljT3AgbG9naWNPcDsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSogcEF0dGFjaG1lbnRzOworICAgIGZsb2F0IGJsZW5kQ29uc3RhbnRzWzRdOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR5bmFtaWNTdGF0ZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RHluYW1pY1N0YXRlKiBwRHluYW1pY1N0YXRlc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgZHluYW1pY1N0YXRlQ291bnQoIGR5bmFtaWNTdGF0ZUNvdW50XyApCisgICAgICAsIHBEeW5hbWljU3RhdGVzKCBwRHluYW1pY1N0YXRlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8oIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyAmIHNldER5bmFtaWNTdGF0ZUNvdW50KCB1aW50MzJfdCBkeW5hbWljU3RhdGVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHluYW1pY1N0YXRlQ291bnQgPSBkeW5hbWljU3RhdGVDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvICYgc2V0UER5bmFtaWNTdGF0ZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEeW5hbWljU3RhdGUqIHBEeW5hbWljU3RhdGVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRHluYW1pY1N0YXRlcyA9IHBEeW5hbWljU3RhdGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBkeW5hbWljU3RhdGVDb3VudCA9PSByaHMuZHluYW1pY1N0YXRlQ291bnQgKQorICAgICAgICAgICYmICggcER5bmFtaWNTdGF0ZXMgPT0gcmhzLnBEeW5hbWljU3RhdGVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBkeW5hbWljU3RhdGVDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RHluYW1pY1N0YXRlKiBwRHluYW1pY1N0YXRlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFnZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogcFN0YWdlc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyogcFZlcnRleElucHV0U3RhdGVfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyogcElucHV0QXNzZW1ibHlTdGF0ZV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8qIHBUZXNzZWxsYXRpb25TdGF0ZV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyogcFZpZXdwb3J0U3RhdGVfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyogcFJhc3Rlcml6YXRpb25TdGF0ZV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyogcE11bHRpc2FtcGxlU3RhdGVfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKiBwRGVwdGhTdGVuY2lsU3RhdGVfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyogcENvbG9yQmxlbmRTdGF0ZV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKiBwRHluYW1pY1N0YXRlXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBsYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VicGFzc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgYmFzZVBpcGVsaW5lSGFuZGxlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhc2VQaXBlbGluZUluZGV4XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBzdGFnZUNvdW50KCBzdGFnZUNvdW50XyApCisgICAgICAsIHBTdGFnZXMoIHBTdGFnZXNfICkKKyAgICAgICwgcFZlcnRleElucHV0U3RhdGUoIHBWZXJ0ZXhJbnB1dFN0YXRlXyApCisgICAgICAsIHBJbnB1dEFzc2VtYmx5U3RhdGUoIHBJbnB1dEFzc2VtYmx5U3RhdGVfICkKKyAgICAgICwgcFRlc3NlbGxhdGlvblN0YXRlKCBwVGVzc2VsbGF0aW9uU3RhdGVfICkKKyAgICAgICwgcFZpZXdwb3J0U3RhdGUoIHBWaWV3cG9ydFN0YXRlXyApCisgICAgICAsIHBSYXN0ZXJpemF0aW9uU3RhdGUoIHBSYXN0ZXJpemF0aW9uU3RhdGVfICkKKyAgICAgICwgcE11bHRpc2FtcGxlU3RhdGUoIHBNdWx0aXNhbXBsZVN0YXRlXyApCisgICAgICAsIHBEZXB0aFN0ZW5jaWxTdGF0ZSggcERlcHRoU3RlbmNpbFN0YXRlXyApCisgICAgICAsIHBDb2xvckJsZW5kU3RhdGUoIHBDb2xvckJsZW5kU3RhdGVfICkKKyAgICAgICwgcER5bmFtaWNTdGF0ZSggcER5bmFtaWNTdGF0ZV8gKQorICAgICAgLCBsYXlvdXQoIGxheW91dF8gKQorICAgICAgLCByZW5kZXJQYXNzKCByZW5kZXJQYXNzXyApCisgICAgICAsIHN1YnBhc3MoIHN1YnBhc3NfICkKKyAgICAgICwgYmFzZVBpcGVsaW5lSGFuZGxlKCBiYXNlUGlwZWxpbmVIYW5kbGVfICkKKyAgICAgICwgYmFzZVBpcGVsaW5lSW5kZXgoIGJhc2VQaXBlbGluZUluZGV4XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8oIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICYgc2V0U3RhZ2VDb3VudCggdWludDMyX3Qgc3RhZ2VDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhZ2VDb3VudCA9IHN0YWdlQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICYgc2V0UFN0YWdlcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKiBwU3RhZ2VzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwU3RhZ2VzID0gcFN0YWdlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gJiBzZXRQVmVydGV4SW5wdXRTdGF0ZSggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8qIHBWZXJ0ZXhJbnB1dFN0YXRlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IHBWZXJ0ZXhJbnB1dFN0YXRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFBJbnB1dEFzc2VtYmx5U3RhdGUoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8qIHBJbnB1dEFzc2VtYmx5U3RhdGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUgPSBwSW5wdXRBc3NlbWJseVN0YXRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFBUZXNzZWxsYXRpb25TdGF0ZSggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKiBwVGVzc2VsbGF0aW9uU3RhdGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBUZXNzZWxsYXRpb25TdGF0ZSA9IHBUZXNzZWxsYXRpb25TdGF0ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gJiBzZXRQVmlld3BvcnRTdGF0ZSggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8qIHBWaWV3cG9ydFN0YXRlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmlld3BvcnRTdGF0ZSA9IHBWaWV3cG9ydFN0YXRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFBSYXN0ZXJpemF0aW9uU3RhdGUoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8qIHBSYXN0ZXJpemF0aW9uU3RhdGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBwUmFzdGVyaXphdGlvblN0YXRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFBNdWx0aXNhbXBsZVN0YXRlKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyogcE11bHRpc2FtcGxlU3RhdGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBNdWx0aXNhbXBsZVN0YXRlID0gcE11bHRpc2FtcGxlU3RhdGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICYgc2V0UERlcHRoU3RlbmNpbFN0YXRlKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8qIHBEZXB0aFN0ZW5jaWxTdGF0ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gcERlcHRoU3RlbmNpbFN0YXRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFBDb2xvckJsZW5kU3RhdGUoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8qIHBDb2xvckJsZW5kU3RhdGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBwQ29sb3JCbGVuZFN0YXRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFBEeW5hbWljU3RhdGUoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8qIHBEeW5hbWljU3RhdGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBEeW5hbWljU3RhdGUgPSBwRHluYW1pY1N0YXRlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldExheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbGF5b3V0ID0gbGF5b3V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFJlbmRlclBhc3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJlbmRlclBhc3MgPSByZW5kZXJQYXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldFN1YnBhc3MoIHVpbnQzMl90IHN1YnBhc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN1YnBhc3MgPSBzdWJwYXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldEJhc2VQaXBlbGluZUhhbmRsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIGJhc2VQaXBlbGluZUhhbmRsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYmFzZVBpcGVsaW5lSGFuZGxlID0gYmFzZVBpcGVsaW5lSGFuZGxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIHNldEJhc2VQaXBlbGluZUluZGV4KCBpbnQzMl90IGJhc2VQaXBlbGluZUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiYXNlUGlwZWxpbmVJbmRleCA9IGJhc2VQaXBlbGluZUluZGV4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggc3RhZ2VDb3VudCA9PSByaHMuc3RhZ2VDb3VudCApCisgICAgICAgICAgJiYgKCBwU3RhZ2VzID09IHJocy5wU3RhZ2VzICkKKyAgICAgICAgICAmJiAoIHBWZXJ0ZXhJbnB1dFN0YXRlID09IHJocy5wVmVydGV4SW5wdXRTdGF0ZSApCisgICAgICAgICAgJiYgKCBwSW5wdXRBc3NlbWJseVN0YXRlID09IHJocy5wSW5wdXRBc3NlbWJseVN0YXRlICkKKyAgICAgICAgICAmJiAoIHBUZXNzZWxsYXRpb25TdGF0ZSA9PSByaHMucFRlc3NlbGxhdGlvblN0YXRlICkKKyAgICAgICAgICAmJiAoIHBWaWV3cG9ydFN0YXRlID09IHJocy5wVmlld3BvcnRTdGF0ZSApCisgICAgICAgICAgJiYgKCBwUmFzdGVyaXphdGlvblN0YXRlID09IHJocy5wUmFzdGVyaXphdGlvblN0YXRlICkKKyAgICAgICAgICAmJiAoIHBNdWx0aXNhbXBsZVN0YXRlID09IHJocy5wTXVsdGlzYW1wbGVTdGF0ZSApCisgICAgICAgICAgJiYgKCBwRGVwdGhTdGVuY2lsU3RhdGUgPT0gcmhzLnBEZXB0aFN0ZW5jaWxTdGF0ZSApCisgICAgICAgICAgJiYgKCBwQ29sb3JCbGVuZFN0YXRlID09IHJocy5wQ29sb3JCbGVuZFN0YXRlICkKKyAgICAgICAgICAmJiAoIHBEeW5hbWljU3RhdGUgPT0gcmhzLnBEeW5hbWljU3RhdGUgKQorICAgICAgICAgICYmICggbGF5b3V0ID09IHJocy5sYXlvdXQgKQorICAgICAgICAgICYmICggcmVuZGVyUGFzcyA9PSByaHMucmVuZGVyUGFzcyApCisgICAgICAgICAgJiYgKCBzdWJwYXNzID09IHJocy5zdWJwYXNzICkKKyAgICAgICAgICAmJiAoIGJhc2VQaXBlbGluZUhhbmRsZSA9PSByaHMuYmFzZVBpcGVsaW5lSGFuZGxlICkKKyAgICAgICAgICAmJiAoIGJhc2VQaXBlbGluZUluZGV4ID09IHJocy5iYXNlUGlwZWxpbmVJbmRleCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IHN0YWdlQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKiBwU3RhZ2VzOworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKiBwVmVydGV4SW5wdXRTdGF0ZTsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKiBwSW5wdXRBc3NlbWJseVN0YXRlOworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyogcFRlc3NlbGxhdGlvblN0YXRlOworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKiBwVmlld3BvcnRTdGF0ZTsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKiBwUmFzdGVyaXphdGlvblN0YXRlOworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKiBwTXVsdGlzYW1wbGVTdGF0ZTsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8qIHBEZXB0aFN0ZW5jaWxTdGF0ZTsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKiBwQ29sb3JCbGVuZFN0YXRlOworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8qIHBEeW5hbWljU3RhdGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzOworICAgIHVpbnQzMl90IHN1YnBhc3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIGJhc2VQaXBlbGluZUhhbmRsZTsKKyAgICBpbnQzMl90IGJhc2VQaXBlbGluZUluZGV4OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBYWUNvbG9yRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBYWUNvbG9yRVhUKCBmbG9hdCB4XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB4KCB4XyApCisgICAgICAsIHkoIHlfICkKKyAgICB7fQorCisgICAgWFlDb2xvckVYVCggVmtYWUNvbG9yRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFhZQ29sb3JFWFQmIG9wZXJhdG9yPSggVmtYWUNvbG9yRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhZQ29sb3JFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWFlDb2xvckVYVCAmIHNldFgoIGZsb2F0IHhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHggPSB4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBYWUNvbG9yRVhUICYgc2V0WSggZmxvYXQgeV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgeSA9IHlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrWFlDb2xvckVYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrWFlDb2xvckVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtYWUNvbG9yRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrWFlDb2xvckVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBYWUNvbG9yRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggeCA9PSByaHMueCApCisgICAgICAgICAgJiYgKCB5ID09IHJocy55ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBYWUNvbG9yRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBYWUNvbG9yRVhUICkgPT0gc2l6ZW9mKCBWa1hZQ29sb3JFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8WFlDb2xvckVYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSGRyTWV0YWRhdGFFWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEhkck1ldGFkYXRhRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WFlDb2xvckVYVCBkaXNwbGF5UHJpbWFyeVJlZF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WFlDb2xvckVYVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WFlDb2xvckVYVCBkaXNwbGF5UHJpbWFyeUdyZWVuXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYWUNvbG9yRVhUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYWUNvbG9yRVhUIGRpc3BsYXlQcmltYXJ5Qmx1ZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WFlDb2xvckVYVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WFlDb2xvckVYVCB3aGl0ZVBvaW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYWUNvbG9yRVhUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heEx1bWluYW5jZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW5MdW1pbmFuY2VfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4Q29udGVudExpZ2h0TGV2ZWxfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkaXNwbGF5UHJpbWFyeVJlZCggZGlzcGxheVByaW1hcnlSZWRfICkKKyAgICAgICwgZGlzcGxheVByaW1hcnlHcmVlbiggZGlzcGxheVByaW1hcnlHcmVlbl8gKQorICAgICAgLCBkaXNwbGF5UHJpbWFyeUJsdWUoIGRpc3BsYXlQcmltYXJ5Qmx1ZV8gKQorICAgICAgLCB3aGl0ZVBvaW50KCB3aGl0ZVBvaW50XyApCisgICAgICAsIG1heEx1bWluYW5jZSggbWF4THVtaW5hbmNlXyApCisgICAgICAsIG1pbkx1bWluYW5jZSggbWluTHVtaW5hbmNlXyApCisgICAgICAsIG1heENvbnRlbnRMaWdodExldmVsKCBtYXhDb250ZW50TGlnaHRMZXZlbF8gKQorICAgICAgLCBtYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsKCBtYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZHJNZXRhZGF0YUVYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okhkck1ldGFkYXRhRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZHJNZXRhZGF0YUVYVCApIC0gb2Zmc2V0b2YoIEhkck1ldGFkYXRhRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSGRyTWV0YWRhdGFFWFQoIFZrSGRyTWV0YWRhdGFFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSGRyTWV0YWRhdGFFWFQmIG9wZXJhdG9yPSggVmtIZHJNZXRhZGF0YUVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZHJNZXRhZGF0YUVYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBIZHJNZXRhZGF0YUVYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSGRyTWV0YWRhdGFFWFQgJiBzZXREaXNwbGF5UHJpbWFyeVJlZCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhZQ29sb3JFWFQgZGlzcGxheVByaW1hcnlSZWRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRpc3BsYXlQcmltYXJ5UmVkID0gZGlzcGxheVByaW1hcnlSZWRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEhkck1ldGFkYXRhRVhUICYgc2V0RGlzcGxheVByaW1hcnlHcmVlbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhZQ29sb3JFWFQgZGlzcGxheVByaW1hcnlHcmVlbl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGlzcGxheVByaW1hcnlHcmVlbiA9IGRpc3BsYXlQcmltYXJ5R3JlZW5fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEhkck1ldGFkYXRhRVhUICYgc2V0RGlzcGxheVByaW1hcnlCbHVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WFlDb2xvckVYVCBkaXNwbGF5UHJpbWFyeUJsdWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRpc3BsYXlQcmltYXJ5Qmx1ZSA9IGRpc3BsYXlQcmltYXJ5Qmx1ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSGRyTWV0YWRhdGFFWFQgJiBzZXRXaGl0ZVBvaW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WFlDb2xvckVYVCB3aGl0ZVBvaW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB3aGl0ZVBvaW50ID0gd2hpdGVQb2ludF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSGRyTWV0YWRhdGFFWFQgJiBzZXRNYXhMdW1pbmFuY2UoIGZsb2F0IG1heEx1bWluYW5jZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWF4THVtaW5hbmNlID0gbWF4THVtaW5hbmNlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBIZHJNZXRhZGF0YUVYVCAmIHNldE1pbkx1bWluYW5jZSggZmxvYXQgbWluTHVtaW5hbmNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtaW5MdW1pbmFuY2UgPSBtaW5MdW1pbmFuY2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEhkck1ldGFkYXRhRVhUICYgc2V0TWF4Q29udGVudExpZ2h0TGV2ZWwoIGZsb2F0IG1heENvbnRlbnRMaWdodExldmVsXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXhDb250ZW50TGlnaHRMZXZlbCA9IG1heENvbnRlbnRMaWdodExldmVsXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBIZHJNZXRhZGF0YUVYVCAmIHNldE1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwoIGZsb2F0IG1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWxfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBtYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0hkck1ldGFkYXRhRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtIZHJNZXRhZGF0YUVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtIZHJNZXRhZGF0YUVYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0hkck1ldGFkYXRhRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEhkck1ldGFkYXRhRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkaXNwbGF5UHJpbWFyeVJlZCA9PSByaHMuZGlzcGxheVByaW1hcnlSZWQgKQorICAgICAgICAgICYmICggZGlzcGxheVByaW1hcnlHcmVlbiA9PSByaHMuZGlzcGxheVByaW1hcnlHcmVlbiApCisgICAgICAgICAgJiYgKCBkaXNwbGF5UHJpbWFyeUJsdWUgPT0gcmhzLmRpc3BsYXlQcmltYXJ5Qmx1ZSApCisgICAgICAgICAgJiYgKCB3aGl0ZVBvaW50ID09IHJocy53aGl0ZVBvaW50ICkKKyAgICAgICAgICAmJiAoIG1heEx1bWluYW5jZSA9PSByaHMubWF4THVtaW5hbmNlICkKKyAgICAgICAgICAmJiAoIG1pbkx1bWluYW5jZSA9PSByaHMubWluTHVtaW5hbmNlICkKKyAgICAgICAgICAmJiAoIG1heENvbnRlbnRMaWdodExldmVsID09IHJocy5tYXhDb250ZW50TGlnaHRMZXZlbCApCisgICAgICAgICAgJiYgKCBtYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID09IHJocy5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBIZHJNZXRhZGF0YUVYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVIZHJNZXRhZGF0YUVYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhZQ29sb3JFWFQgZGlzcGxheVByaW1hcnlSZWQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhZQ29sb3JFWFQgZGlzcGxheVByaW1hcnlHcmVlbjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WFlDb2xvckVYVCBkaXNwbGF5UHJpbWFyeUJsdWU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhZQ29sb3JFWFQgd2hpdGVQb2ludDsKKyAgICBmbG9hdCBtYXhMdW1pbmFuY2U7CisgICAgZmxvYXQgbWluTHVtaW5hbmNlOworICAgIGZsb2F0IG1heENvbnRlbnRMaWdodExldmVsOworICAgIGZsb2F0IG1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWw7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSGRyTWV0YWRhdGFFWFQgKSA9PSBzaXplb2YoIFZrSGRyTWV0YWRhdGFFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8SGRyTWV0YWRhdGFFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZWFkbGVzc1N1cmZhY2VDcmVhdGVGbGFnc0VYVCBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SGVhZGxlc3NTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZWFkbGVzc1N1cmZhY2VDcmVhdGVGbGFnc0VYVCBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SGVhZGxlc3NTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQgZmxhZ3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEhlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisgIHN0cnVjdCBJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVksgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OklPU1N1cmZhY2VDcmVhdGVGbGFnc01WSygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwVmlld18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgcFZpZXcoIHBWaWV3XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OklPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyApIC0gb2Zmc2V0b2YoIElPU1N1cmZhY2VDcmVhdGVJbmZvTVZLLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksoIFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksmIG9wZXJhdG9yPSggVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OklPU1N1cmZhY2VDcmVhdGVGbGFnc01WSyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBzZXRQVmlldyggY29uc3Qgdm9pZCogcFZpZXdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBWaWV3ID0gcFZpZXdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBwVmlldyA9PSByaHMucFZpZXcgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIElPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUlvc1N1cmZhY2VDcmVhdGVJbmZvTVZLOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SU9TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLIGZsYWdzOworICAgIGNvbnN0IHZvaWQqIHBWaWV3OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIElPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICkgPT0gc2l6ZW9mKCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PElPU1N1cmZhY2VDcmVhdGVJbmZvTVZLPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0lPU19NVksqLworCisgIHN0cnVjdCBJbWFnZUJsaXQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSXzE0IEltYWdlQmxpdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgc3JjU3VicmVzb3VyY2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNELDI+IGNvbnN0JiBzcmNPZmZzZXRzXyA9IHsgeyBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QoKSB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBkc3RTdWJyZXNvdXJjZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QsMj4gY29uc3QmIGRzdE9mZnNldHNfID0geyB7IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQzRCgpIH0gfSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc3JjU3VicmVzb3VyY2UoIHNyY1N1YnJlc291cmNlXyApCisgICAgICAsIHNyY09mZnNldHN7fQorICAgICAgLCBkc3RTdWJyZXNvdXJjZSggZHN0U3VicmVzb3VyY2VfICkKKyAgICAgICwgZHN0T2Zmc2V0c3t9CisgICAgeworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QsMiwyPjo6Y29weSggc3JjT2Zmc2V0cywgc3JjT2Zmc2V0c18gKTsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNELDIsMj46OmNvcHkoIGRzdE9mZnNldHMsIGRzdE9mZnNldHNfICk7CisgICAgfQorCisgICAgSW1hZ2VCbGl0KCBWa0ltYWdlQmxpdCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZUJsaXQmIG9wZXJhdG9yPSggVmtJbWFnZUJsaXQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VCbGl0IGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlQmxpdCAmIHNldFNyY1N1YnJlc291cmNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBzcmNTdWJyZXNvdXJjZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjU3VicmVzb3VyY2UgPSBzcmNTdWJyZXNvdXJjZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VCbGl0ICYgc2V0U3JjT2Zmc2V0cyggc3RkOjphcnJheTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QsMj4gc3JjT2Zmc2V0c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCBzcmNPZmZzZXRzLCBzcmNPZmZzZXRzXy5kYXRhKCksIDIgKiBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQzRCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VCbGl0ICYgc2V0RHN0U3VicmVzb3VyY2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlTGF5ZXJzIGRzdFN1YnJlc291cmNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RTdWJyZXNvdXJjZSA9IGRzdFN1YnJlc291cmNlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUJsaXQgJiBzZXREc3RPZmZzZXRzKCBzdGQ6OmFycmF5PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQzRCwyPiBkc3RPZmZzZXRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoIGRzdE9mZnNldHMsIGRzdE9mZnNldHNfLmRhdGEoKSwgMiAqIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlQmxpdCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VCbGl0Kj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlQmxpdCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlQmxpdCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbWFnZUJsaXQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzcmNTdWJyZXNvdXJjZSA9PSByaHMuc3JjU3VicmVzb3VyY2UgKQorICAgICAgICAgICYmICggbWVtY21wKCBzcmNPZmZzZXRzLCByaHMuc3JjT2Zmc2V0cywgMiAqIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIGRzdFN1YnJlc291cmNlID09IHJocy5kc3RTdWJyZXNvdXJjZSApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGRzdE9mZnNldHMsIHJocy5kc3RPZmZzZXRzLCAyICogc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QgKSApID09IDAgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlQmxpdCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBzcmNTdWJyZXNvdXJjZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0Qgc3JjT2Zmc2V0c1syXTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBkc3RTdWJyZXNvdXJjZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QgZHN0T2Zmc2V0c1syXTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBJbWFnZUJsaXQgKSA9PSBzaXplb2YoIFZrSW1hZ2VCbGl0ICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltYWdlQmxpdD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSW1hZ2VDb3B5CisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZUNvcHkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlTGF5ZXJzIHNyY1N1YnJlc291cmNlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlTGF5ZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0Qgc3JjT2Zmc2V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQzRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgZHN0U3VicmVzb3VyY2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQzRCBkc3RPZmZzZXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QgZXh0ZW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzcmNTdWJyZXNvdXJjZSggc3JjU3VicmVzb3VyY2VfICkKKyAgICAgICwgc3JjT2Zmc2V0KCBzcmNPZmZzZXRfICkKKyAgICAgICwgZHN0U3VicmVzb3VyY2UoIGRzdFN1YnJlc291cmNlXyApCisgICAgICAsIGRzdE9mZnNldCggZHN0T2Zmc2V0XyApCisgICAgICAsIGV4dGVudCggZXh0ZW50XyApCisgICAge30KKworICAgIEltYWdlQ29weSggVmtJbWFnZUNvcHkgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1hZ2VDb3B5JiBvcGVyYXRvcj0oIFZrSW1hZ2VDb3B5IGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ29weSBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNvcHkgJiBzZXRTcmNTdWJyZXNvdXJjZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgc3JjU3VicmVzb3VyY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNyY1N1YnJlc291cmNlID0gc3JjU3VicmVzb3VyY2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlQ29weSAmIHNldFNyY09mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEIHNyY09mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjT2Zmc2V0ID0gc3JjT2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNvcHkgJiBzZXREc3RTdWJyZXNvdXJjZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgZHN0U3VicmVzb3VyY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdFN1YnJlc291cmNlID0gZHN0U3VicmVzb3VyY2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlQ29weSAmIHNldERzdE9mZnNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEIGRzdE9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0T2Zmc2V0ID0gZHN0T2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNvcHkgJiBzZXRFeHRlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBleHRlbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGV4dGVudCA9IGV4dGVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZUNvcHkgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlQ29weSo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZUNvcHkgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZUNvcHkqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VDb3B5IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc3JjU3VicmVzb3VyY2UgPT0gcmhzLnNyY1N1YnJlc291cmNlICkKKyAgICAgICAgICAmJiAoIHNyY09mZnNldCA9PSByaHMuc3JjT2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIGRzdFN1YnJlc291cmNlID09IHJocy5kc3RTdWJyZXNvdXJjZSApCisgICAgICAgICAgJiYgKCBkc3RPZmZzZXQgPT0gcmhzLmRzdE9mZnNldCApCisgICAgICAgICAgJiYgKCBleHRlbnQgPT0gcmhzLmV4dGVudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1hZ2VDb3B5IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlTGF5ZXJzIHNyY1N1YnJlc291cmNlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQzRCBzcmNPZmZzZXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgZHN0U3VicmVzb3VyY2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEIGRzdE9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QgZXh0ZW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltYWdlQ29weSApID09IHNpemVvZiggVmtJbWFnZUNvcHkgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8SW1hZ2VDb3B5Pjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBJbWFnZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVR5cGUgaW1hZ2VUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVR5cGU6OmUxRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQ6OmVVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QgZXh0ZW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWlwTGV2ZWxzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcnJheUxheWVyc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0czo6ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVRpbGluZzo6ZU9wdGltYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFyaW5nTW9kZSBzaGFyaW5nTW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhcmluZ01vZGU6OmVFeGNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwUXVldWVGYW1pbHlJbmRpY2VzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgaW5pdGlhbExheW91dF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQ6OmVVbmRlZmluZWQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBpbWFnZVR5cGUoIGltYWdlVHlwZV8gKQorICAgICAgLCBmb3JtYXQoIGZvcm1hdF8gKQorICAgICAgLCBleHRlbnQoIGV4dGVudF8gKQorICAgICAgLCBtaXBMZXZlbHMoIG1pcExldmVsc18gKQorICAgICAgLCBhcnJheUxheWVycyggYXJyYXlMYXllcnNfICkKKyAgICAgICwgc2FtcGxlcyggc2FtcGxlc18gKQorICAgICAgLCB0aWxpbmcoIHRpbGluZ18gKQorICAgICAgLCB1c2FnZSggdXNhZ2VfICkKKyAgICAgICwgc2hhcmluZ01vZGUoIHNoYXJpbmdNb2RlXyApCisgICAgICAsIHF1ZXVlRmFtaWx5SW5kZXhDb3VudCggcXVldWVGYW1pbHlJbmRleENvdW50XyApCisgICAgICAsIHBRdWV1ZUZhbWlseUluZGljZXMoIHBRdWV1ZUZhbWlseUluZGljZXNfICkKKyAgICAgICwgaW5pdGlhbExheW91dCggaW5pdGlhbExheW91dF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBJbWFnZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNyZWF0ZUluZm8oIFZrSW1hZ2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltYWdlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0ltYWdlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlQ3JlYXRlSW5mbyAmIHNldEltYWdlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSBpbWFnZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlVHlwZSA9IGltYWdlVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VDcmVhdGVJbmZvICYgc2V0Rm9ybWF0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZm9ybWF0ID0gZm9ybWF0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNyZWF0ZUluZm8gJiBzZXRFeHRlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBleHRlbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGV4dGVudCA9IGV4dGVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VDcmVhdGVJbmZvICYgc2V0TWlwTGV2ZWxzKCB1aW50MzJfdCBtaXBMZXZlbHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1pcExldmVscyA9IG1pcExldmVsc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VDcmVhdGVJbmZvICYgc2V0QXJyYXlMYXllcnMoIHVpbnQzMl90IGFycmF5TGF5ZXJzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhcnJheUxheWVycyA9IGFycmF5TGF5ZXJzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNyZWF0ZUluZm8gJiBzZXRTYW1wbGVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzYW1wbGVzID0gc2FtcGxlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VDcmVhdGVJbmZvICYgc2V0VGlsaW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0aWxpbmcgPSB0aWxpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlQ3JlYXRlSW5mbyAmIHNldFVzYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB1c2FnZSA9IHVzYWdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNyZWF0ZUluZm8gJiBzZXRTaGFyaW5nTW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYXJpbmdNb2RlIHNoYXJpbmdNb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFyaW5nTW9kZSA9IHNoYXJpbmdNb2RlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNyZWF0ZUluZm8gJiBzZXRRdWV1ZUZhbWlseUluZGV4Q291bnQoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXhDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gcXVldWVGYW1pbHlJbmRleENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUNyZWF0ZUluZm8gJiBzZXRQUXVldWVGYW1pbHlJbmRpY2VzKCBjb25zdCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5SW5kaWNlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IHBRdWV1ZUZhbWlseUluZGljZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlQ3JlYXRlSW5mbyAmIHNldEluaXRpYWxMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbml0aWFsTGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbml0aWFsTGF5b3V0ID0gaW5pdGlhbExheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggaW1hZ2VUeXBlID09IHJocy5pbWFnZVR5cGUgKQorICAgICAgICAgICYmICggZm9ybWF0ID09IHJocy5mb3JtYXQgKQorICAgICAgICAgICYmICggZXh0ZW50ID09IHJocy5leHRlbnQgKQorICAgICAgICAgICYmICggbWlwTGV2ZWxzID09IHJocy5taXBMZXZlbHMgKQorICAgICAgICAgICYmICggYXJyYXlMYXllcnMgPT0gcmhzLmFycmF5TGF5ZXJzICkKKyAgICAgICAgICAmJiAoIHNhbXBsZXMgPT0gcmhzLnNhbXBsZXMgKQorICAgICAgICAgICYmICggdGlsaW5nID09IHJocy50aWxpbmcgKQorICAgICAgICAgICYmICggdXNhZ2UgPT0gcmhzLnVzYWdlICkKKyAgICAgICAgICAmJiAoIHNoYXJpbmdNb2RlID09IHJocy5zaGFyaW5nTW9kZSApCisgICAgICAgICAgJiYgKCBxdWV1ZUZhbWlseUluZGV4Q291bnQgPT0gcmhzLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCApCisgICAgICAgICAgJiYgKCBwUXVldWVGYW1pbHlJbmRpY2VzID09IHJocy5wUXVldWVGYW1pbHlJbmRpY2VzICkKKyAgICAgICAgICAmJiAoIGluaXRpYWxMYXlvdXQgPT0gcmhzLmluaXRpYWxMYXlvdXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbWFnZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVR5cGUgaW1hZ2VUeXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBleHRlbnQ7CisgICAgdWludDMyX3QgbWlwTGV2ZWxzOworICAgIHVpbnQzMl90IGFycmF5TGF5ZXJzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVGlsaW5nIHRpbGluZzsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFyaW5nTW9kZSBzaGFyaW5nTW9kZTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGluaXRpYWxMYXlvdXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0ltYWdlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZUNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFN1YnJlc291cmNlTGF5b3V0CisgIHsKKyAgICBTdWJyZXNvdXJjZUxheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgcm93UGl0Y2hfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgYXJyYXlQaXRjaF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkZXB0aFBpdGNoXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG9mZnNldCggb2Zmc2V0XyApCisgICAgICAsIHNpemUoIHNpemVfICkKKyAgICAgICwgcm93UGl0Y2goIHJvd1BpdGNoXyApCisgICAgICAsIGFycmF5UGl0Y2goIGFycmF5UGl0Y2hfICkKKyAgICAgICwgZGVwdGhQaXRjaCggZGVwdGhQaXRjaF8gKQorICAgIHt9CisKKyAgICBTdWJyZXNvdXJjZUxheW91dCggVmtTdWJyZXNvdXJjZUxheW91dCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdWJyZXNvdXJjZUxheW91dCYgb3BlcmF0b3I9KCBWa1N1YnJlc291cmNlTGF5b3V0IGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnJlc291cmNlTGF5b3V0IGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VicmVzb3VyY2VMYXlvdXQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1YnJlc291cmNlTGF5b3V0Kj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1YnJlc291cmNlTGF5b3V0ICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU3VicmVzb3VyY2VMYXlvdXQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3VicmVzb3VyY2VMYXlvdXQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBvZmZzZXQgPT0gcmhzLm9mZnNldCApCisgICAgICAgICAgJiYgKCBzaXplID09IHJocy5zaXplICkKKyAgICAgICAgICAmJiAoIHJvd1BpdGNoID09IHJocy5yb3dQaXRjaCApCisgICAgICAgICAgJiYgKCBhcnJheVBpdGNoID09IHJocy5hcnJheVBpdGNoICkKKyAgICAgICAgICAmJiAoIGRlcHRoUGl0Y2ggPT0gcmhzLmRlcHRoUGl0Y2ggKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFN1YnJlc291cmNlTGF5b3V0IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHJvd1BpdGNoOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGFycmF5UGl0Y2g7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgZGVwdGhQaXRjaDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTdWJyZXNvdXJjZUxheW91dCApID09IHNpemVvZiggVmtTdWJyZXNvdXJjZUxheW91dCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTdWJyZXNvdXJjZUxheW91dD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCggdWludDY0X3QgZHJtRm9ybWF0TW9kaWZpZXJfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicmVzb3VyY2VMYXlvdXQqIHBQbGFuZUxheW91dHNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZHJtRm9ybWF0TW9kaWZpZXIoIGRybUZvcm1hdE1vZGlmaWVyXyApCisgICAgICAsIGRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCggZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50XyApCisgICAgICAsIHBQbGFuZUxheW91dHMoIHBQbGFuZUxheW91dHNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUICkgLSBvZmZzZXRvZiggSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQoIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgJiBzZXREcm1Gb3JtYXRNb2RpZmllciggdWludDY0X3QgZHJtRm9ybWF0TW9kaWZpZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRybUZvcm1hdE1vZGlmaWVyID0gZHJtRm9ybWF0TW9kaWZpZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgJiBzZXREcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQoIHVpbnQzMl90IGRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50ID0gZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUICYgc2V0UFBsYW5lTGF5b3V0cyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnJlc291cmNlTGF5b3V0KiBwUGxhbmVMYXlvdXRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwUGxhbmVMYXlvdXRzID0gcFBsYW5lTGF5b3V0c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRybUZvcm1hdE1vZGlmaWVyID09IHJocy5kcm1Gb3JtYXRNb2RpZmllciApCisgICAgICAgICAgJiYgKCBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQgPT0gcmhzLmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCApCisgICAgICAgICAgJiYgKCBwUGxhbmVMYXlvdXRzID09IHJocy5wUGxhbmVMYXlvdXRzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQ2NF90IGRybUZvcm1hdE1vZGlmaWVyOworICAgIHVpbnQzMl90IGRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicmVzb3VyY2VMYXlvdXQqIHBQbGFuZUxheW91dHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUKCB1aW50MzJfdCBkcm1Gb3JtYXRNb2RpZmllckNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogcERybUZvcm1hdE1vZGlmaWVyc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkcm1Gb3JtYXRNb2RpZmllckNvdW50KCBkcm1Gb3JtYXRNb2RpZmllckNvdW50XyApCisgICAgICAsIHBEcm1Gb3JtYXRNb2RpZmllcnMoIHBEcm1Gb3JtYXRNb2RpZmllcnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUICkgLSBvZmZzZXRvZiggSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUKCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUICYgc2V0RHJtRm9ybWF0TW9kaWZpZXJDb3VudCggdWludDMyX3QgZHJtRm9ybWF0TW9kaWZpZXJDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHJtRm9ybWF0TW9kaWZpZXJDb3VudCA9IGRybUZvcm1hdE1vZGlmaWVyQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCAmIHNldFBEcm1Gb3JtYXRNb2RpZmllcnMoIGNvbnN0IHVpbnQ2NF90KiBwRHJtRm9ybWF0TW9kaWZpZXJzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRHJtRm9ybWF0TW9kaWZpZXJzID0gcERybUZvcm1hdE1vZGlmaWVyc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkcm1Gb3JtYXRNb2RpZmllckNvdW50ID09IHJocy5kcm1Gb3JtYXRNb2RpZmllckNvdW50ICkKKyAgICAgICAgICAmJiAoIHBEcm1Gb3JtYXRNb2RpZmllcnMgPT0gcmhzLnBEcm1Gb3JtYXRNb2RpZmllcnMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGRybUZvcm1hdE1vZGlmaWVyQ291bnQ7CisgICAgY29uc3QgdWludDY0X3QqIHBEcm1Gb3JtYXRNb2RpZmllcnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCggdWludDY0X3QgZHJtRm9ybWF0TW9kaWZpZXJfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZHJtRm9ybWF0TW9kaWZpZXIoIGRybUZvcm1hdE1vZGlmaWVyXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCApIC0gb2Zmc2V0b2YoIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPSggVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkcm1Gb3JtYXRNb2RpZmllciA9PSByaHMuZHJtRm9ybWF0TW9kaWZpZXIgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50NjRfdCBkcm1Gb3JtYXRNb2RpZmllcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiggdWludDMyX3Qgdmlld0Zvcm1hdENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCogcFZpZXdGb3JtYXRzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHZpZXdGb3JtYXRDb3VudCggdmlld0Zvcm1hdENvdW50XyApCisgICAgICAsIHBWaWV3Rm9ybWF0cyggcFZpZXdGb3JtYXRzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIEltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKCBWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSICYgc2V0Vmlld0Zvcm1hdENvdW50KCB1aW50MzJfdCB2aWV3Rm9ybWF0Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZpZXdGb3JtYXRDb3VudCA9IHZpZXdGb3JtYXRDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiAmIHNldFBWaWV3Rm9ybWF0cyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCogcFZpZXdGb3JtYXRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmlld0Zvcm1hdHMgPSBwVmlld0Zvcm1hdHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCB2aWV3Rm9ybWF0Q291bnQgPT0gcmhzLnZpZXdGb3JtYXRDb3VudCApCisgICAgICAgICAgJiYgKCBwVmlld0Zvcm1hdHMgPT0gcmhzLnBWaWV3Rm9ybWF0cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCB2aWV3Rm9ybWF0Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCogcFZpZXdGb3JtYXRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIgKSA9PSBzaXplb2YoIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBJbWFnZUZvcm1hdFByb3BlcnRpZXMyCisgIHsKKyAgICBJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGltYWdlRm9ybWF0UHJvcGVydGllc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGltYWdlRm9ybWF0UHJvcGVydGllcyggaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUZvcm1hdFByb3BlcnRpZXMyICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiApIC0gb2Zmc2V0b2YoIEltYWdlRm9ybWF0UHJvcGVydGllczIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiYgb3BlcmF0b3I9KCBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID09IHJocy5pbWFnZUZvcm1hdFByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllcyBpbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiApID09IHNpemVvZiggVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltYWdlRm9ybWF0UHJvcGVydGllczI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlU3VicmVzb3VyY2VSYW5nZQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXNlTWlwTGV2ZWxfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxldmVsQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhc2VBcnJheUxheWVyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXllckNvdW50XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGFzcGVjdE1hc2soIGFzcGVjdE1hc2tfICkKKyAgICAgICwgYmFzZU1pcExldmVsKCBiYXNlTWlwTGV2ZWxfICkKKyAgICAgICwgbGV2ZWxDb3VudCggbGV2ZWxDb3VudF8gKQorICAgICAgLCBiYXNlQXJyYXlMYXllciggYmFzZUFycmF5TGF5ZXJfICkKKyAgICAgICwgbGF5ZXJDb3VudCggbGF5ZXJDb3VudF8gKQorICAgIHt9CisKKyAgICBJbWFnZVN1YnJlc291cmNlUmFuZ2UoIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltYWdlU3VicmVzb3VyY2VSYW5nZSYgb3BlcmF0b3I9KCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2UgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICYgc2V0QXNwZWN0TWFzayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYXNwZWN0TWFzayA9IGFzcGVjdE1hc2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlU3VicmVzb3VyY2VSYW5nZSAmIHNldEJhc2VNaXBMZXZlbCggdWludDMyX3QgYmFzZU1pcExldmVsXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiYXNlTWlwTGV2ZWwgPSBiYXNlTWlwTGV2ZWxfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlU3VicmVzb3VyY2VSYW5nZSAmIHNldExldmVsQ291bnQoIHVpbnQzMl90IGxldmVsQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxldmVsQ291bnQgPSBsZXZlbENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVN1YnJlc291cmNlUmFuZ2UgJiBzZXRCYXNlQXJyYXlMYXllciggdWludDMyX3QgYmFzZUFycmF5TGF5ZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJhc2VBcnJheUxheWVyID0gYmFzZUFycmF5TGF5ZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlU3VicmVzb3VyY2VSYW5nZSAmIHNldExheWVyQ291bnQoIHVpbnQzMl90IGxheWVyQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxheWVyQ291bnQgPSBsYXllckNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbWFnZVN1YnJlc291cmNlUmFuZ2UgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBhc3BlY3RNYXNrID09IHJocy5hc3BlY3RNYXNrICkKKyAgICAgICAgICAmJiAoIGJhc2VNaXBMZXZlbCA9PSByaHMuYmFzZU1pcExldmVsICkKKyAgICAgICAgICAmJiAoIGxldmVsQ291bnQgPT0gcmhzLmxldmVsQ291bnQgKQorICAgICAgICAgICYmICggYmFzZUFycmF5TGF5ZXIgPT0gcmhzLmJhc2VBcnJheUxheWVyICkKKyAgICAgICAgICAmJiAoIGxheWVyQ291bnQgPT0gcmhzLmxheWVyQ291bnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlU3VicmVzb3VyY2VSYW5nZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrOworICAgIHVpbnQzMl90IGJhc2VNaXBMZXZlbDsKKyAgICB1aW50MzJfdCBsZXZlbENvdW50OworICAgIHVpbnQzMl90IGJhc2VBcnJheUxheWVyOworICAgIHVpbnQzMl90IGxheWVyQ291bnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICkgPT0gc2l6ZW9mKCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVN1YnJlc291cmNlUmFuZ2U+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlTWVtb3J5QmFycmllcgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VNZW1vcnlCYXJyaWVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3Mgc3JjQWNjZXNzTWFza18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IG9sZExheW91dF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQ6OmVVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgbmV3TGF5b3V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dDo6ZVVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1F1ZXVlRmFtaWx5SW5kZXhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFF1ZXVlRmFtaWx5SW5kZXhfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3VicmVzb3VyY2VSYW5nZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZVJhbmdlKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNyY0FjY2Vzc01hc2soIHNyY0FjY2Vzc01hc2tfICkKKyAgICAgICwgZHN0QWNjZXNzTWFzayggZHN0QWNjZXNzTWFza18gKQorICAgICAgLCBvbGRMYXlvdXQoIG9sZExheW91dF8gKQorICAgICAgLCBuZXdMYXlvdXQoIG5ld0xheW91dF8gKQorICAgICAgLCBzcmNRdWV1ZUZhbWlseUluZGV4KCBzcmNRdWV1ZUZhbWlseUluZGV4XyApCisgICAgICAsIGRzdFF1ZXVlRmFtaWx5SW5kZXgoIGRzdFF1ZXVlRmFtaWx5SW5kZXhfICkKKyAgICAgICwgaW1hZ2UoIGltYWdlXyApCisgICAgICAsIHN1YnJlc291cmNlUmFuZ2UoIHN1YnJlc291cmNlUmFuZ2VfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5QmFycmllciAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5QmFycmllciBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VNZW1vcnlCYXJyaWVyICkgLSBvZmZzZXRvZiggSW1hZ2VNZW1vcnlCYXJyaWVyLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VNZW1vcnlCYXJyaWVyKCBWa0ltYWdlTWVtb3J5QmFycmllciBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZU1lbW9yeUJhcnJpZXImIG9wZXJhdG9yPSggVmtJbWFnZU1lbW9yeUJhcnJpZXIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VNZW1vcnlCYXJyaWVyIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlTWVtb3J5QmFycmllciAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VNZW1vcnlCYXJyaWVyICYgc2V0U3JjQWNjZXNzTWFzayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIHNyY0FjY2Vzc01hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNyY0FjY2Vzc01hc2sgPSBzcmNBY2Nlc3NNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZU1lbW9yeUJhcnJpZXIgJiBzZXREc3RBY2Nlc3NNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3MgZHN0QWNjZXNzTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0QWNjZXNzTWFzayA9IGRzdEFjY2Vzc01hc2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlTWVtb3J5QmFycmllciAmIHNldE9sZExheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IG9sZExheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2xkTGF5b3V0ID0gb2xkTGF5b3V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZU1lbW9yeUJhcnJpZXIgJiBzZXROZXdMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBuZXdMYXlvdXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG5ld0xheW91dCA9IG5ld0xheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VNZW1vcnlCYXJyaWVyICYgc2V0U3JjUXVldWVGYW1pbHlJbmRleCggdWludDMyX3Qgc3JjUXVldWVGYW1pbHlJbmRleF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjUXVldWVGYW1pbHlJbmRleCA9IHNyY1F1ZXVlRmFtaWx5SW5kZXhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlTWVtb3J5QmFycmllciAmIHNldERzdFF1ZXVlRmFtaWx5SW5kZXgoIHVpbnQzMl90IGRzdFF1ZXVlRmFtaWx5SW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdFF1ZXVlRmFtaWx5SW5kZXggPSBkc3RRdWV1ZUZhbWlseUluZGV4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZU1lbW9yeUJhcnJpZXIgJiBzZXRJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZSA9IGltYWdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZU1lbW9yeUJhcnJpZXIgJiBzZXRTdWJyZXNvdXJjZVJhbmdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN1YnJlc291cmNlUmFuZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN1YnJlc291cmNlUmFuZ2UgPSBzdWJyZXNvdXJjZVJhbmdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlTWVtb3J5QmFycmllciBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlTWVtb3J5QmFycmllciAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlTWVtb3J5QmFycmllcio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbWFnZU1lbW9yeUJhcnJpZXIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNyY0FjY2Vzc01hc2sgPT0gcmhzLnNyY0FjY2Vzc01hc2sgKQorICAgICAgICAgICYmICggZHN0QWNjZXNzTWFzayA9PSByaHMuZHN0QWNjZXNzTWFzayApCisgICAgICAgICAgJiYgKCBvbGRMYXlvdXQgPT0gcmhzLm9sZExheW91dCApCisgICAgICAgICAgJiYgKCBuZXdMYXlvdXQgPT0gcmhzLm5ld0xheW91dCApCisgICAgICAgICAgJiYgKCBzcmNRdWV1ZUZhbWlseUluZGV4ID09IHJocy5zcmNRdWV1ZUZhbWlseUluZGV4ICkKKyAgICAgICAgICAmJiAoIGRzdFF1ZXVlRmFtaWx5SW5kZXggPT0gcmhzLmRzdFF1ZXVlRmFtaWx5SW5kZXggKQorICAgICAgICAgICYmICggaW1hZ2UgPT0gcmhzLmltYWdlICkKKyAgICAgICAgICAmJiAoIHN1YnJlc291cmNlUmFuZ2UgPT0gcmhzLnN1YnJlc291cmNlUmFuZ2UgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlTWVtb3J5QmFycmllciBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbWFnZU1lbW9yeUJhcnJpZXI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBzcmNBY2Nlc3NNYXNrOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBvbGRMYXlvdXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IG5ld0xheW91dDsKKyAgICB1aW50MzJfdCBzcmNRdWV1ZUZhbWlseUluZGV4OworICAgIHVpbnQzMl90IGRzdFF1ZXVlRmFtaWx5SW5kZXg7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3VicmVzb3VyY2VSYW5nZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBJbWFnZU1lbW9yeUJhcnJpZXIgKSA9PSBzaXplb2YoIFZrSW1hZ2VNZW1vcnlCYXJyaWVyICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltYWdlTWVtb3J5QmFycmllcj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBpbWFnZSggaW1hZ2VfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICkgLSBvZmZzZXRvZiggSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBvcGVyYXRvcj0oIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJiBzZXRJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZSA9IGltYWdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaW1hZ2UgPT0gcmhzLmltYWdlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICkgPT0gc2l6ZW9mKCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKKyAgc3RydWN0IEltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUZsYWdzRlVDSFNJQSBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUZsYWdzRlVDSFNJQSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenhfaGFuZGxlX3QgaW1hZ2VQaXBlSGFuZGxlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBpbWFnZVBpcGVIYW5kbGUoIGltYWdlUGlwZUhhbmRsZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgKSAtIG9mZnNldG9mKCBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEoIFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSYgb3BlcmF0b3I9KCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlUGlwZVN1cmZhY2VDcmVhdGVGbGFnc0ZVQ0hTSUEgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSAmIHNldEltYWdlUGlwZUhhbmRsZSggenhfaGFuZGxlX3QgaW1hZ2VQaXBlSGFuZGxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZVBpcGVIYW5kbGUgPSBpbWFnZVBpcGVIYW5kbGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGltYWdlUGlwZUhhbmRsZSA9PSByaHMuaW1hZ2VQaXBlSGFuZGxlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VwaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUZsYWdzRlVDSFNJQSBmbGFnczsKKyAgICB6eF9oYW5kbGVfdCBpbWFnZVBpcGVIYW5kbGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBICkgPT0gc2l6ZW9mKCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUE+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fRlVDSFNJQSovCisKKyAgc3RydWN0IEltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ0JpdHMgcGxhbmVBc3BlY3RfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ0JpdHM6OmVDb2xvciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcGxhbmVBc3BlY3QoIHBsYW5lQXNwZWN0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyApIC0gb2Zmc2V0b2YoIEltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8oIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8mIG9wZXJhdG9yPSggVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gJiBzZXRQbGFuZUFzcGVjdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ0JpdHMgcGxhbmVBc3BlY3RfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBsYW5lQXNwZWN0ID0gcGxhbmVBc3BlY3RfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHBsYW5lQXNwZWN0ID09IHJocy5wbGFuZUFzcGVjdCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdCaXRzIHBsYW5lQXNwZWN0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvICkgPT0gc2l6ZW9mKCBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBJbWFnZVJlc29sdmUKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlUmVzb2x2ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgc3JjU3VicmVzb3VyY2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQzRCBzcmNPZmZzZXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBkc3RTdWJyZXNvdXJjZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEIGRzdE9mZnNldF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBleHRlbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNyY1N1YnJlc291cmNlKCBzcmNTdWJyZXNvdXJjZV8gKQorICAgICAgLCBzcmNPZmZzZXQoIHNyY09mZnNldF8gKQorICAgICAgLCBkc3RTdWJyZXNvdXJjZSggZHN0U3VicmVzb3VyY2VfICkKKyAgICAgICwgZHN0T2Zmc2V0KCBkc3RPZmZzZXRfICkKKyAgICAgICwgZXh0ZW50KCBleHRlbnRfICkKKyAgICB7fQorCisgICAgSW1hZ2VSZXNvbHZlKCBWa0ltYWdlUmVzb2x2ZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZVJlc29sdmUmIG9wZXJhdG9yPSggVmtJbWFnZVJlc29sdmUgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VSZXNvbHZlIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlUmVzb2x2ZSAmIHNldFNyY1N1YnJlc291cmNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBzcmNTdWJyZXNvdXJjZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjU3VicmVzb3VyY2UgPSBzcmNTdWJyZXNvdXJjZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VSZXNvbHZlICYgc2V0U3JjT2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0Qgc3JjT2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcmNPZmZzZXQgPSBzcmNPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlUmVzb2x2ZSAmIHNldERzdFN1YnJlc291cmNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBkc3RTdWJyZXNvdXJjZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0U3VicmVzb3VyY2UgPSBkc3RTdWJyZXNvdXJjZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VSZXNvbHZlICYgc2V0RHN0T2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QgZHN0T2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RPZmZzZXQgPSBkc3RPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlUmVzb2x2ZSAmIHNldEV4dGVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEIGV4dGVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZXh0ZW50ID0gZXh0ZW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlUmVzb2x2ZSBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VSZXNvbHZlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlUmVzb2x2ZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlUmVzb2x2ZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbWFnZVJlc29sdmUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzcmNTdWJyZXNvdXJjZSA9PSByaHMuc3JjU3VicmVzb3VyY2UgKQorICAgICAgICAgICYmICggc3JjT2Zmc2V0ID09IHJocy5zcmNPZmZzZXQgKQorICAgICAgICAgICYmICggZHN0U3VicmVzb3VyY2UgPT0gcmhzLmRzdFN1YnJlc291cmNlICkKKyAgICAgICAgICAmJiAoIGRzdE9mZnNldCA9PSByaHMuZHN0T2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIGV4dGVudCA9PSByaHMuZXh0ZW50ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBJbWFnZVJlc29sdmUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VMYXllcnMgc3JjU3VicmVzb3VyY2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDNEIHNyY09mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZUxheWVycyBkc3RTdWJyZXNvdXJjZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2Zmc2V0M0QgZHN0T2Zmc2V0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBleHRlbnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VSZXNvbHZlICkgPT0gc2l6ZW9mKCBWa0ltYWdlUmVzb2x2ZSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVJlc29sdmU+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaW1hZ2UoIGltYWdlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiApIC0gb2Zmc2V0b2YoIEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiYgb3BlcmF0b3I9KCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgc2V0SW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW1hZ2UgPSBpbWFnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGltYWdlID09IHJocy5pbWFnZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiApID09IHNpemVvZiggVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHN0ZW5jaWxVc2FnZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN0ZW5jaWxVc2FnZSggc3RlbmNpbFVzYWdlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIEltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCggVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCAmIHNldFN0ZW5jaWxVc2FnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyBzdGVuY2lsVXNhZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0ZW5jaWxVc2FnZSA9IHN0ZW5jaWxVc2FnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzdGVuY2lsVXNhZ2UgPT0gcmhzLnN0ZW5jaWxVc2FnZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyBzdGVuY2lsVXNhZ2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN3YXBjaGFpbiggc3dhcGNoYWluXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIEltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiggVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSJiBvcGVyYXRvcj0oIFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldFN3YXBjaGFpbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW5fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN3YXBjaGFpbiA9IHN3YXBjaGFpbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzd2FwY2hhaW4gPT0gcmhzLnN3YXBjaGFpbiApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW47CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBkZWNvZGVNb2RlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQ6OmVVbmRlZmluZWQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRlY29kZU1vZGUoIGRlY29kZU1vZGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUICkgLSBvZmZzZXRvZiggSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCggVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCYgb3BlcmF0b3I9KCBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCAmIHNldERlY29kZU1vZGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZGVjb2RlTW9kZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVjb2RlTW9kZSA9IGRlY29kZU1vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRlY29kZU1vZGUgPT0gcmhzLmRlY29kZU1vZGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltYWdlVmlld0FzdGNEZWNvZGVNb2RlRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGRlY29kZU1vZGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgKSA9PSBzaXplb2YoIFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8SW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEltYWdlVmlld0NyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlVmlld0NyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3Q3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld1R5cGUgdmlld1R5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld1R5cGU6OmUxRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0OjplVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRNYXBwaW5nIGNvbXBvbmVudHNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvbmVudE1hcHBpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN1YnJlc291cmNlUmFuZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VSYW5nZSgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgaW1hZ2UoIGltYWdlXyApCisgICAgICAsIHZpZXdUeXBlKCB2aWV3VHlwZV8gKQorICAgICAgLCBmb3JtYXQoIGZvcm1hdF8gKQorICAgICAgLCBjb21wb25lbnRzKCBjb21wb25lbnRzXyApCisgICAgICAsIHN1YnJlc291cmNlUmFuZ2UoIHN1YnJlc291cmNlUmFuZ2VfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld0NyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggSW1hZ2VWaWV3Q3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlVmlld0NyZWF0ZUluZm8oIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbWFnZVZpZXdDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlVmlld0NyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlVmlld0NyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld0NyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVZpZXdDcmVhdGVJbmZvICYgc2V0SW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW1hZ2UgPSBpbWFnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VWaWV3Q3JlYXRlSW5mbyAmIHNldFZpZXdUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3VHlwZSB2aWV3VHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmlld1R5cGUgPSB2aWV3VHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VWaWV3Q3JlYXRlSW5mbyAmIHNldEZvcm1hdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZvcm1hdCA9IGZvcm1hdF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VWaWV3Q3JlYXRlSW5mbyAmIHNldENvbXBvbmVudHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRNYXBwaW5nIGNvbXBvbmVudHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbXBvbmVudHMgPSBjb21wb25lbnRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVZpZXdDcmVhdGVJbmZvICYgc2V0U3VicmVzb3VyY2VSYW5nZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VSYW5nZSBzdWJyZXNvdXJjZVJhbmdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdWJyZXNvdXJjZVJhbmdlID0gc3VicmVzb3VyY2VSYW5nZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlVmlld0NyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVZpZXdDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltYWdlVmlld0NyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBpbWFnZSA9PSByaHMuaW1hZ2UgKQorICAgICAgICAgICYmICggdmlld1R5cGUgPT0gcmhzLnZpZXdUeXBlICkKKyAgICAgICAgICAmJiAoIGZvcm1hdCA9PSByaHMuZm9ybWF0ICkKKyAgICAgICAgICAmJiAoIGNvbXBvbmVudHMgPT0gcmhzLmNvbXBvbmVudHMgKQorICAgICAgICAgICYmICggc3VicmVzb3VyY2VSYW5nZSA9PSByaHMuc3VicmVzb3VyY2VSYW5nZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1hZ2VWaWV3Q3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbWFnZVZpZXdDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3Q3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdUeXBlIHZpZXdUeXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRNYXBwaW5nIGNvbXBvbmVudHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VSYW5nZSBzdWJyZXNvdXJjZVJhbmdlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltYWdlVmlld0NyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVZpZXdDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBJbWFnZVZpZXdIYW5kbGVJbmZvTlZYCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3IGltYWdlVmlld18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3JUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVHlwZTo6ZVNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXIgc2FtcGxlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlcigpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBpbWFnZVZpZXcoIGltYWdlVmlld18gKQorICAgICAgLCBkZXNjcmlwdG9yVHlwZSggZGVzY3JpcHRvclR5cGVfICkKKyAgICAgICwgc2FtcGxlciggc2FtcGxlcl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3SGFuZGxlSW5mb05WWCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld0hhbmRsZUluZm9OVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld0hhbmRsZUluZm9OVlggKSAtIG9mZnNldG9mKCBJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCggVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltYWdlVmlld0hhbmRsZUluZm9OVlgmIG9wZXJhdG9yPSggVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld0hhbmRsZUluZm9OVlggY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCAmIHNldEltYWdlVmlldyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlldyBpbWFnZVZpZXdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlVmlldyA9IGltYWdlVmlld187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCAmIHNldERlc2NyaXB0b3JUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JUeXBlID0gZGVzY3JpcHRvclR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltYWdlVmlld0hhbmRsZUluZm9OVlggJiBzZXRTYW1wbGVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciBzYW1wbGVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzYW1wbGVyID0gc2FtcGxlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlggJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltYWdlVmlld0hhbmRsZUluZm9OVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGltYWdlVmlldyA9PSByaHMuaW1hZ2VWaWV3ICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JUeXBlID09IHJocy5kZXNjcmlwdG9yVHlwZSApCisgICAgICAgICAgJiYgKCBzYW1wbGVyID09IHJocy5zYW1wbGVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltYWdlVmlld0hhbmRsZUluZm9OVlg7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcgaW1hZ2VWaWV3OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yVHlwZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciBzYW1wbGVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltYWdlVmlld0hhbmRsZUluZm9OVlggKSA9PSBzaXplb2YoIFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVZpZXdIYW5kbGVJbmZvTlZYPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyB1c2FnZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHVzYWdlKCB1c2FnZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8oIFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gJiBzZXRVc2FnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyB1c2FnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdXNhZ2UgPSB1c2FnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCB1c2FnZSA9PSByaHMudXNhZ2UgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgdXNhZ2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICBzdHJ1Y3QgSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXJfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYnVmZmVyKCBidWZmZXJfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICkgLSBvZmZzZXRvZiggSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCggVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCYgb3BlcmF0b3I9KCBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCAmIHNldEJ1ZmZlciggc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXIgPSBidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlciA9PSByaHMuYnVmZmVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICkgPT0gc2l6ZW9mKCBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKworICBzdHJ1Y3QgSW1wb3J0RmVuY2VGZEluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltcG9ydEZlbmNlRmRJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUltcG9ydEZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUltcG9ydEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZlbmNlKCBmZW5jZV8gKQorICAgICAgLCBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgICAgLCBmZCggZmRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydEZlbmNlRmRJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0RmVuY2VGZEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydEZlbmNlRmRJbmZvS0hSICkgLSBvZmZzZXRvZiggSW1wb3J0RmVuY2VGZEluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRGZW5jZUZkSW5mb0tIUiggVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbXBvcnRGZW5jZUZkSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydEZlbmNlRmRJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydEZlbmNlRmRJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRGZW5jZUZkSW5mb0tIUiAmIHNldEZlbmNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZlbmNlID0gZmVuY2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydEZlbmNlRmRJbmZvS0hSICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUltcG9ydEZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRGZW5jZUZkSW5mb0tIUiAmIHNldEhhbmRsZVR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGUgPSBoYW5kbGVUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRGZW5jZUZkSW5mb0tIUiAmIHNldEZkKCBpbnQgZmRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZkID0gZmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1wb3J0RmVuY2VGZEluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1wb3J0RmVuY2VGZEluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZlbmNlID09IHJocy5mZW5jZSApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZSA9PSByaHMuaGFuZGxlVHlwZSApCisgICAgICAgICAgJiYgKCBmZCA9PSByaHMuZmQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltcG9ydEZlbmNlRmRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltcG9ydEZlbmNlRmRJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlSW1wb3J0RmxhZ3MgZmxhZ3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICBpbnQgZmQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1wb3J0RmVuY2VGZEluZm9LSFIgKSA9PSBzaXplb2YoIFZrSW1wb3J0RmVuY2VGZEluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8SW1wb3J0RmVuY2VGZEluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgc3RydWN0IEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VJbXBvcnRGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VJbXBvcnRGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlRmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBoYW5kbGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBuYW1lXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZlbmNlKCBmZW5jZV8gKQorICAgICAgLCBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgICAgLCBoYW5kbGUoIGhhbmRsZV8gKQorICAgICAgLCBuYW1lKCBuYW1lXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIoIFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPSggVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRGZW5jZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmZW5jZSA9IGZlbmNlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VJbXBvcnRGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRIYW5kbGVUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGVUeXBlID0gaGFuZGxlVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRIYW5kbGUoIEhBTkRMRSBoYW5kbGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZSA9IGhhbmRsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXROYW1lKCBMUENXU1RSIG5hbWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG5hbWUgPSBuYW1lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmZW5jZSA9PSByaHMuZmVuY2UgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGUgPT0gcmhzLmhhbmRsZVR5cGUgKQorICAgICAgICAgICYmICggaGFuZGxlID09IHJocy5oYW5kbGUgKQorICAgICAgICAgICYmICggbmFtZSA9PSByaHMubmFtZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VJbXBvcnRGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgTFBDV1NUUiBuYW1lOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgc3RydWN0IEltcG9ydE1lbW9yeUZkSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1wb3J0TWVtb3J5RmRJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBoYW5kbGVUeXBlKCBoYW5kbGVUeXBlXyApCisgICAgICAsIGZkKCBmZF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5RmRJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5RmRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRNZW1vcnlGZEluZm9LSFIgKSAtIG9mZnNldG9mKCBJbXBvcnRNZW1vcnlGZEluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRNZW1vcnlGZEluZm9LSFIoIFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeUZkSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRNZW1vcnlGZEluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0TWVtb3J5RmRJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRNZW1vcnlGZEluZm9LSFIgJiBzZXRIYW5kbGVUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaGFuZGxlVHlwZSA9IGhhbmRsZVR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeUZkSW5mb0tIUiAmIHNldEZkKCBpbnQgZmRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZkID0gZmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEltcG9ydE1lbW9yeUZkSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZSA9PSByaHMuaGFuZGxlVHlwZSApCisgICAgICAgICAgJiYgKCBmZCA9PSByaHMuZmQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltcG9ydE1lbW9yeUZkSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRNZW1vcnlGZEluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICAgIGludCBmZDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBJbXBvcnRNZW1vcnlGZEluZm9LSFIgKSA9PSBzaXplb2YoIFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltcG9ydE1lbW9yeUZkSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEhvc3RQb2ludGVyXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGhhbmRsZVR5cGUoIGhhbmRsZVR5cGVfICkKKyAgICAgICwgcEhvc3RQb2ludGVyKCBwSG9zdFBvaW50ZXJfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUICkgLSBvZmZzZXRvZiggSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUKCBWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQmIG9wZXJhdG9yPSggVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUICYgc2V0SGFuZGxlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGUgPSBoYW5kbGVUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgJiBzZXRQSG9zdFBvaW50ZXIoIHZvaWQqIHBIb3N0UG9pbnRlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEhvc3RQb2ludGVyID0gcEhvc3RQb2ludGVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGUgPT0gcmhzLmhhbmRsZVR5cGUgKQorICAgICAgICAgICYmICggcEhvc3RQb2ludGVyID09IHJocy5wSG9zdFBvaW50ZXIgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICAgIHZvaWQqIHBIb3N0UG9pbnRlcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgKSA9PSBzaXplb2YoIFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICBzdHJ1Y3QgSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFIGhhbmRsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBuYW1lXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGhhbmRsZVR5cGUoIGhhbmRsZVR5cGVfICkKKyAgICAgICwgaGFuZGxlKCBoYW5kbGVfICkKKyAgICAgICwgbmFtZSggbmFtZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgKSAtIG9mZnNldG9mKCBJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRIYW5kbGVUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaGFuZGxlVHlwZSA9IGhhbmRsZVR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiAmIHNldEhhbmRsZSggSEFORExFIGhhbmRsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaGFuZGxlID0gaGFuZGxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXROYW1lKCBMUENXU1RSIG5hbWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG5hbWUgPSBuYW1lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGUgPT0gcmhzLmhhbmRsZVR5cGUgKQorICAgICAgICAgICYmICggaGFuZGxlID09IHJocy5oYW5kbGUgKQorICAgICAgICAgICYmICggbmFtZSA9PSByaHMubmFtZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBMUENXU1RSIG5hbWU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICBzdHJ1Y3QgSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBoYW5kbGVUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBoYW5kbGVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgICAgLCBoYW5kbGUoIGhhbmRsZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKSAtIG9mZnNldG9mKCBJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WJiBvcGVyYXRvcj0oIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WICYgc2V0SGFuZGxlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgaGFuZGxlVHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaGFuZGxlVHlwZSA9IGhhbmRsZVR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WICYgc2V0SGFuZGxlKCBIQU5ETEUgaGFuZGxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGUgPSBoYW5kbGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGUgPT0gcmhzLmhhbmRsZVR5cGUgKQorICAgICAgICAgICYmICggaGFuZGxlID09IHJocy5oYW5kbGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBoYW5kbGVUeXBlOworICAgIEhBTkRMRSBoYW5kbGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKSA9PSBzaXplb2YoIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8SW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICBzdHJ1Y3QgSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVJbXBvcnRGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlSW1wb3J0RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNlbWFwaG9yZSggc2VtYXBob3JlXyApCisgICAgICAsIGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBoYW5kbGVUeXBlKCBoYW5kbGVUeXBlXyApCisgICAgICAsIGZkKCBmZF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgKSAtIG9mZnNldG9mKCBJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIoIFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiYgb3BlcmF0b3I9KCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgJiBzZXRTZW1hcGhvcmUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzZW1hcGhvcmUgPSBzZW1hcGhvcmVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlSW1wb3J0RmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiAmIHNldEhhbmRsZVR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGVUeXBlID0gaGFuZGxlVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSICYgc2V0RmQoIGludCBmZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmQgPSBmZF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzZW1hcGhvcmUgPT0gcmhzLnNlbWFwaG9yZSApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZSA9PSByaHMuaGFuZGxlVHlwZSApCisgICAgICAgICAgJiYgKCBmZCA9PSByaHMuZmQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVJbXBvcnRGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICBpbnQgZmQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgc3RydWN0IEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlSW1wb3J0RmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUltcG9ydEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBoYW5kbGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbmFtZV8gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzZW1hcGhvcmUoIHNlbWFwaG9yZV8gKQorICAgICAgLCBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgICAgLCBoYW5kbGUoIGhhbmRsZV8gKQorICAgICAgLCBuYW1lKCBuYW1lXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiggVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSJiBvcGVyYXRvcj0oIFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAmIHNldFNlbWFwaG9yZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNlbWFwaG9yZSA9IHNlbWFwaG9yZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVJbXBvcnRGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSICYgc2V0SGFuZGxlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGUgPSBoYW5kbGVUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRIYW5kbGUoIEhBTkRMRSBoYW5kbGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZSA9IGhhbmRsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSICYgc2V0TmFtZSggTFBDV1NUUiBuYW1lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBuYW1lID0gbmFtZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzZW1hcGhvcmUgPT0gcmhzLnNlbWFwaG9yZSApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZSA9PSByaHMuaGFuZGxlVHlwZSApCisgICAgICAgICAgJiYgKCBoYW5kbGUgPT0gcmhzLmhhbmRsZSApCisgICAgICAgICAgJiYgKCBuYW1lID09IHJocy5uYW1lICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlSW1wb3J0RmxhZ3MgZmxhZ3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBMUENXU1RSIG5hbWU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICBzdHJ1Y3QgSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYIHRva2VuVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWDo6ZVBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmluZGluZ1VuaXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR5bmFtaWNDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGl2aXNvcl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0b2tlblR5cGUoIHRva2VuVHlwZV8gKQorICAgICAgLCBiaW5kaW5nVW5pdCggYmluZGluZ1VuaXRfICkKKyAgICAgICwgZHluYW1pY0NvdW50KCBkeW5hbWljQ291bnRfICkKKyAgICAgICwgZGl2aXNvciggZGl2aXNvcl8gKQorICAgIHt9CisKKyAgICBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgoIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWCYgb3BlcmF0b3I9KCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlggY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYICYgc2V0VG9rZW5UeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCB0b2tlblR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRva2VuVHlwZSA9IHRva2VuVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYICYgc2V0QmluZGluZ1VuaXQoIHVpbnQzMl90IGJpbmRpbmdVbml0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiaW5kaW5nVW5pdCA9IGJpbmRpbmdVbml0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlggJiBzZXREeW5hbWljQ291bnQoIHVpbnQzMl90IGR5bmFtaWNDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHluYW1pY0NvdW50ID0gZHluYW1pY0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlggJiBzZXREaXZpc29yKCB1aW50MzJfdCBkaXZpc29yXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkaXZpc29yID0gZGl2aXNvcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlggY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlggJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggdG9rZW5UeXBlID09IHJocy50b2tlblR5cGUgKQorICAgICAgICAgICYmICggYmluZGluZ1VuaXQgPT0gcmhzLmJpbmRpbmdVbml0ICkKKyAgICAgICAgICAmJiAoIGR5bmFtaWNDb3VudCA9PSByaHMuZHluYW1pY0NvdW50ICkKKyAgICAgICAgICAmJiAoIGRpdmlzb3IgPT0gcmhzLmRpdmlzb3IgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCB0b2tlblR5cGU7CisgICAgdWludDMyX3QgYmluZGluZ1VuaXQ7CisgICAgdWludDMyX3QgZHluYW1pY0NvdW50OworICAgIHVpbnQzMl90IGRpdmlzb3I7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYICkgPT0gc2l6ZW9mKCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlg+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludDo6ZUdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlggZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdzTlZYKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRva2VuQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWCogcFRva2Vuc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwaXBlbGluZUJpbmRQb2ludCggcGlwZWxpbmVCaW5kUG9pbnRfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHRva2VuQ291bnQoIHRva2VuQ291bnRfICkKKyAgICAgICwgcFRva2VucyggcFRva2Vuc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggKSAtIG9mZnNldG9mKCBJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYJiBvcGVyYXRvcj0oIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYICYgc2V0UGlwZWxpbmVCaW5kUG9pbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGlwZWxpbmVCaW5kUG9pbnQgPSBwaXBlbGluZUJpbmRQb2ludF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdzTlZYIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCAmIHNldFRva2VuQ291bnQoIHVpbnQzMl90IHRva2VuQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRva2VuQ291bnQgPSB0b2tlbkNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCAmIHNldFBUb2tlbnMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgqIHBUb2tlbnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBUb2tlbnMgPSBwVG9rZW5zXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwaXBlbGluZUJpbmRQb2ludCA9PSByaHMucGlwZWxpbmVCaW5kUG9pbnQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHRva2VuQ291bnQgPT0gcmhzLnRva2VuQ291bnQgKQorICAgICAgICAgICYmICggcFRva2VucyA9PSByaHMucFRva2VucyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlg7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlggZmxhZ3M7CisgICAgdWludDMyX3QgdG9rZW5Db3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYKiBwVG9rZW5zOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYICkgPT0gc2l6ZW9mKCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCggdm9pZCogcFVzZXJEYXRhXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBVc2VyRGF0YSggcFVzZXJEYXRhXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCApIC0gb2Zmc2V0b2YoIEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCggVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMJiBvcGVyYXRvcj0oIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCAmIHNldFBVc2VyRGF0YSggdm9pZCogcFVzZXJEYXRhXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVXNlckRhdGEgPSBwVXNlckRhdGFfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcFVzZXJEYXRhID09IHJocy5wVXNlckRhdGEgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUw7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHZvaWQqIHBVc2VyRGF0YTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgKSA9PSBzaXplb2YoIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UoIHVpbnQzMl90IHN1YnBhc3NfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGlucHV0QXR0YWNobWVudEluZGV4XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN1YnBhc3MoIHN1YnBhc3NfICkKKyAgICAgICwgaW5wdXRBdHRhY2htZW50SW5kZXgoIGlucHV0QXR0YWNobWVudEluZGV4XyApCisgICAgICAsIGFzcGVjdE1hc2soIGFzcGVjdE1hc2tfICkKKyAgICB7fQorCisgICAgSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlKCBWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UmIG9wZXJhdG9yPSggVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIElucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSAmIHNldFN1YnBhc3MoIHVpbnQzMl90IHN1YnBhc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN1YnBhc3MgPSBzdWJwYXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UgJiBzZXRJbnB1dEF0dGFjaG1lbnRJbmRleCggdWludDMyX3QgaW5wdXRBdHRhY2htZW50SW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGlucHV0QXR0YWNobWVudEluZGV4ID0gaW5wdXRBdHRhY2htZW50SW5kZXhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIElucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSAmIHNldEFzcGVjdE1hc2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFzcGVjdE1hc2sgPSBhc3BlY3RNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzdWJwYXNzID09IHJocy5zdWJwYXNzICkKKyAgICAgICAgICAmJiAoIGlucHV0QXR0YWNobWVudEluZGV4ID09IHJocy5pbnB1dEF0dGFjaG1lbnRJbmRleCApCisgICAgICAgICAgJiYgKCBhc3BlY3RNYXNrID09IHJocy5hc3BlY3RNYXNrICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3Qgc3VicGFzczsKKyAgICB1aW50MzJfdCBpbnB1dEF0dGFjaG1lbnRJbmRleDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIElucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSApID09IHNpemVvZiggVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8SW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBJbnN0YW5jZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIEluc3RhbmNlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBcHBsaWNhdGlvbkluZm8qIHBBcHBsaWNhdGlvbkluZm9fID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVuYWJsZWRMYXllckNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogcHBFbmFibGVkTGF5ZXJOYW1lc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZW5hYmxlZEV4dGVuc2lvbkNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHBBcHBsaWNhdGlvbkluZm8oIHBBcHBsaWNhdGlvbkluZm9fICkKKyAgICAgICwgZW5hYmxlZExheWVyQ291bnQoIGVuYWJsZWRMYXllckNvdW50XyApCisgICAgICAsIHBwRW5hYmxlZExheWVyTmFtZXMoIHBwRW5hYmxlZExheWVyTmFtZXNfICkKKyAgICAgICwgZW5hYmxlZEV4dGVuc2lvbkNvdW50KCBlbmFibGVkRXh0ZW5zaW9uQ291bnRfICkKKyAgICAgICwgcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMoIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbnN0YW5jZUNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbnN0YW5jZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIEluc3RhbmNlQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluc3RhbmNlQ3JlYXRlSW5mbyggVmtJbnN0YW5jZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgSW5zdGFuY2VDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrSW5zdGFuY2VDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbnN0YW5jZUNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluc3RhbmNlQ3JlYXRlSW5mbyAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5zdGFuY2VDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5zdGFuY2VDcmVhdGVJbmZvICYgc2V0UEFwcGxpY2F0aW9uSW5mbyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFwcGxpY2F0aW9uSW5mbyogcEFwcGxpY2F0aW9uSW5mb18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEFwcGxpY2F0aW9uSW5mbyA9IHBBcHBsaWNhdGlvbkluZm9fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluc3RhbmNlQ3JlYXRlSW5mbyAmIHNldEVuYWJsZWRMYXllckNvdW50KCB1aW50MzJfdCBlbmFibGVkTGF5ZXJDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZW5hYmxlZExheWVyQ291bnQgPSBlbmFibGVkTGF5ZXJDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5zdGFuY2VDcmVhdGVJbmZvICYgc2V0UHBFbmFibGVkTGF5ZXJOYW1lcyggY29uc3QgY2hhciogY29uc3QqIHBwRW5hYmxlZExheWVyTmFtZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBwRW5hYmxlZExheWVyTmFtZXMgPSBwcEVuYWJsZWRMYXllck5hbWVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbnN0YW5jZUNyZWF0ZUluZm8gJiBzZXRFbmFibGVkRXh0ZW5zaW9uQ291bnQoIHVpbnQzMl90IGVuYWJsZWRFeHRlbnNpb25Db3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gZW5hYmxlZEV4dGVuc2lvbkNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbnN0YW5jZUNyZWF0ZUluZm8gJiBzZXRQcEVuYWJsZWRFeHRlbnNpb25OYW1lcyggY29uc3QgY2hhciogY29uc3QqIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0luc3RhbmNlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0luc3RhbmNlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa0luc3RhbmNlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBJbnN0YW5jZUNyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBwQXBwbGljYXRpb25JbmZvID09IHJocy5wQXBwbGljYXRpb25JbmZvICkKKyAgICAgICAgICAmJiAoIGVuYWJsZWRMYXllckNvdW50ID09IHJocy5lbmFibGVkTGF5ZXJDb3VudCApCisgICAgICAgICAgJiYgKCBwcEVuYWJsZWRMYXllck5hbWVzID09IHJocy5wcEVuYWJsZWRMYXllck5hbWVzICkKKyAgICAgICAgICAmJiAoIGVuYWJsZWRFeHRlbnNpb25Db3VudCA9PSByaHMuZW5hYmxlZEV4dGVuc2lvbkNvdW50ICkKKyAgICAgICAgICAmJiAoIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID09IHJocy5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggSW5zdGFuY2VDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZUluc3RhbmNlQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFwcGxpY2F0aW9uSW5mbyogcEFwcGxpY2F0aW9uSW5mbzsKKyAgICB1aW50MzJfdCBlbmFibGVkTGF5ZXJDb3VudDsKKyAgICBjb25zdCBjaGFyKiBjb25zdCogcHBFbmFibGVkTGF5ZXJOYW1lczsKKyAgICB1aW50MzJfdCBlbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgY29uc3QgY2hhciogY29uc3QqIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIEluc3RhbmNlQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtJbnN0YW5jZUNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8SW5zdGFuY2VDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBMYXllclByb3BlcnRpZXMKKyAgeworICAgIExheWVyUHJvcGVydGllcyggc3RkOjphcnJheTxjaGFyLFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFPiBjb25zdCYgbGF5ZXJOYW1lXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNwZWNWZXJzaW9uXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbXBsZW1lbnRhdGlvblZlcnNpb25fID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRT4gY29uc3QmIGRlc2NyaXB0aW9uXyA9IHsgeyAwIH0gfSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbGF5ZXJOYW1le30KKyAgICAgICwgc3BlY1ZlcnNpb24oIHNwZWNWZXJzaW9uXyApCisgICAgICAsIGltcGxlbWVudGF0aW9uVmVyc2lvbiggaW1wbGVtZW50YXRpb25WZXJzaW9uXyApCisgICAgICAsIGRlc2NyaXB0aW9ue30KKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGNoYXIsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkUsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU+Ojpjb3B5KCBsYXllck5hbWUsIGxheWVyTmFtZV8gKTsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRSxWS19NQVhfREVTQ1JJUFRJT05fU0laRT46OmNvcHkoIGRlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbl8gKTsKKyAgICB9CisKKyAgICBMYXllclByb3BlcnRpZXMoIFZrTGF5ZXJQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIExheWVyUHJvcGVydGllcyYgb3BlcmF0b3I9KCBWa0xheWVyUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpMYXllclByb3BlcnRpZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtMYXllclByb3BlcnRpZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0xheWVyUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtMYXllclByb3BlcnRpZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtMYXllclByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggTGF5ZXJQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggbWVtY21wKCBsYXllck5hbWUsIHJocy5sYXllck5hbWUsIFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFICogc2l6ZW9mKCBjaGFyICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIHNwZWNWZXJzaW9uID09IHJocy5zcGVjVmVyc2lvbiApCisgICAgICAgICAgJiYgKCBpbXBsZW1lbnRhdGlvblZlcnNpb24gPT0gcmhzLmltcGxlbWVudGF0aW9uVmVyc2lvbiApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGRlc2NyaXB0aW9uLCByaHMuZGVzY3JpcHRpb24sIFZLX01BWF9ERVNDUklQVElPTl9TSVpFICogc2l6ZW9mKCBjaGFyICkgKSA9PSAwICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBMYXllclByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY2hhciBsYXllck5hbWVbVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkVdOworICAgIHVpbnQzMl90IHNwZWNWZXJzaW9uOworICAgIHVpbnQzMl90IGltcGxlbWVudGF0aW9uVmVyc2lvbjsKKyAgICBjaGFyIGRlc2NyaXB0aW9uW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBMYXllclByb3BlcnRpZXMgKSA9PSBzaXplb2YoIFZrTGF5ZXJQcm9wZXJ0aWVzICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PExheWVyUHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworICBzdHJ1Y3QgTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hY09TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNYWNPU1N1cmZhY2VDcmVhdGVGbGFnc01WSygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBWaWV3XyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBwVmlldyggcFZpZXdfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICkgLSBvZmZzZXRvZiggTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksoIFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLJiBvcGVyYXRvcj0oIFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hY09TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICYgc2V0UFZpZXcoIGNvbnN0IHZvaWQqIHBWaWV3XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmlldyA9IHBWaWV3XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHBWaWV3ID09IHJocy5wVmlldyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVNYWNvc1N1cmZhY2VDcmVhdGVJbmZvTVZLOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWFjT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVksgZmxhZ3M7CisgICAgY29uc3Qgdm9pZCogcFZpZXc7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyApID09IHNpemVvZiggVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PE1hY09TU3VyZmFjZUNyZWF0ZUluZm9NVks+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLKi8KKworICBzdHJ1Y3QgTWFwcGVkTWVtb3J5UmFuZ2UKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE1hcHBlZE1lbW9yeVJhbmdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1lbW9yeSggbWVtb3J5XyApCisgICAgICAsIG9mZnNldCggb2Zmc2V0XyApCisgICAgICAsIHNpemUoIHNpemVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hcHBlZE1lbW9yeVJhbmdlICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWFwcGVkTWVtb3J5UmFuZ2UgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hcHBlZE1lbW9yeVJhbmdlICkgLSBvZmZzZXRvZiggTWFwcGVkTWVtb3J5UmFuZ2UsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNYXBwZWRNZW1vcnlSYW5nZSggVmtNYXBwZWRNZW1vcnlSYW5nZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNYXBwZWRNZW1vcnlSYW5nZSYgb3BlcmF0b3I9KCBWa01hcHBlZE1lbW9yeVJhbmdlIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hcHBlZE1lbW9yeVJhbmdlIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1hcHBlZE1lbW9yeVJhbmdlICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNYXBwZWRNZW1vcnlSYW5nZSAmIHNldE1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnlfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbW9yeSA9IG1lbW9yeV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWFwcGVkTWVtb3J5UmFuZ2UgJiBzZXRPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2Zmc2V0ID0gb2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNYXBwZWRNZW1vcnlSYW5nZSAmIHNldFNpemUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNpemUgPSBzaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01hcHBlZE1lbW9yeVJhbmdlIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNYXBwZWRNZW1vcnlSYW5nZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa01hcHBlZE1lbW9yeVJhbmdlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE1hcHBlZE1lbW9yeVJhbmdlIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtZW1vcnkgPT0gcmhzLm1lbW9yeSApCisgICAgICAgICAgJiYgKCBvZmZzZXQgPT0gcmhzLm9mZnNldCApCisgICAgICAgICAgJiYgKCBzaXplID09IHJocy5zaXplICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBNYXBwZWRNZW1vcnlSYW5nZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVNYXBwZWRNZW1vcnlSYW5nZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnk7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWFwcGVkTWVtb3J5UmFuZ2UgKSA9PSBzaXplb2YoIFZrTWFwcGVkTWVtb3J5UmFuZ2UgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TWFwcGVkTWVtb3J5UmFuZ2U+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE1lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUFsbG9jYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUFsbG9jYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlTWFza18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgZGV2aWNlTWFzayggZGV2aWNlTWFza18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gKSAtIG9mZnNldG9mKCBNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvKCBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE1lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvJiBvcGVyYXRvcj0oIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlBbGxvY2F0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyAmIHNldERldmljZU1hc2soIHVpbnQzMl90IGRldmljZU1hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRldmljZU1hc2sgPSBkZXZpY2VNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE1lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggZGV2aWNlTWFzayA9PSByaHMuZGV2aWNlTWFzayApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplTWVtb3J5QWxsb2NhdGVGbGFnc0luZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlBbGxvY2F0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IGRldmljZU1hc2s7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gKSA9PSBzaXplb2YoIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TWVtb3J5QWxsb2NhdGVGbGFnc0luZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE1lbW9yeUFsbG9jYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWVtb3J5QWxsb2NhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBhbGxvY2F0aW9uU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVtb3J5VHlwZUluZGV4XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGFsbG9jYXRpb25TaXplKCBhbGxvY2F0aW9uU2l6ZV8gKQorICAgICAgLCBtZW1vcnlUeXBlSW5kZXgoIG1lbW9yeVR5cGVJbmRleF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5QWxsb2NhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5QWxsb2NhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlBbGxvY2F0ZUluZm8gKSAtIG9mZnNldG9mKCBNZW1vcnlBbGxvY2F0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlBbGxvY2F0ZUluZm8oIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE1lbW9yeUFsbG9jYXRlSW5mbyYgb3BlcmF0b3I9KCBWa01lbW9yeUFsbG9jYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlBbGxvY2F0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5QWxsb2NhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlBbGxvY2F0ZUluZm8gJiBzZXRBbGxvY2F0aW9uU2l6ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgYWxsb2NhdGlvblNpemVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFsbG9jYXRpb25TaXplID0gYWxsb2NhdGlvblNpemVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUFsbG9jYXRlSW5mbyAmIHNldE1lbW9yeVR5cGVJbmRleCggdWludDMyX3QgbWVtb3J5VHlwZUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnlUeXBlSW5kZXggPSBtZW1vcnlUeXBlSW5kZXhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5QWxsb2NhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5QWxsb2NhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE1lbW9yeUFsbG9jYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggYWxsb2NhdGlvblNpemUgPT0gcmhzLmFsbG9jYXRpb25TaXplICkKKyAgICAgICAgICAmJiAoIG1lbW9yeVR5cGVJbmRleCA9PSByaHMubWVtb3J5VHlwZUluZGV4ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBNZW1vcnlBbGxvY2F0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplTWVtb3J5QWxsb2NhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBhbGxvY2F0aW9uU2l6ZTsKKyAgICB1aW50MzJfdCBtZW1vcnlUeXBlSW5kZXg7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5QWxsb2NhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa01lbW9yeUFsbG9jYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNZW1vcnlBbGxvY2F0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE1lbW9yeUJhcnJpZXIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE1lbW9yeUJhcnJpZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBzcmNBY2Nlc3NNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzcmNBY2Nlc3NNYXNrKCBzcmNBY2Nlc3NNYXNrXyApCisgICAgICAsIGRzdEFjY2Vzc01hc2soIGRzdEFjY2Vzc01hc2tfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUJhcnJpZXIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlCYXJyaWVyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlCYXJyaWVyICkgLSBvZmZzZXRvZiggTWVtb3J5QmFycmllciwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUJhcnJpZXIoIFZrTWVtb3J5QmFycmllciBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNZW1vcnlCYXJyaWVyJiBvcGVyYXRvcj0oIFZrTWVtb3J5QmFycmllciBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlCYXJyaWVyIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUJhcnJpZXIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUJhcnJpZXIgJiBzZXRTcmNBY2Nlc3NNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3Mgc3JjQWNjZXNzTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjQWNjZXNzTWFzayA9IHNyY0FjY2Vzc01hc2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUJhcnJpZXIgJiBzZXREc3RBY2Nlc3NNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3MgZHN0QWNjZXNzTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0QWNjZXNzTWFzayA9IGRzdEFjY2Vzc01hc2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5QmFycmllciBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5QmFycmllcio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlCYXJyaWVyICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5QmFycmllcio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBNZW1vcnlCYXJyaWVyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzcmNBY2Nlc3NNYXNrID09IHJocy5zcmNBY2Nlc3NNYXNrICkKKyAgICAgICAgICAmJiAoIGRzdEFjY2Vzc01hc2sgPT0gcmhzLmRzdEFjY2Vzc01hc2sgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE1lbW9yeUJhcnJpZXIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplTWVtb3J5QmFycmllcjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIHNyY0FjY2Vzc01hc2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIGRzdEFjY2Vzc01hc2s7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5QmFycmllciApID09IHNpemVvZiggVmtNZW1vcnlCYXJyaWVyICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PE1lbW9yeUJhcnJpZXI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE1lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGltYWdlKCBpbWFnZV8gKQorICAgICAgLCBidWZmZXIoIGJ1ZmZlcl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gKSAtIG9mZnNldG9mKCBNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8oIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE1lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyYgb3BlcmF0b3I9KCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gJiBzZXRJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZSA9IGltYWdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gJiBzZXRCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXIgPSBidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE1lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaW1hZ2UgPT0gcmhzLmltYWdlICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlciA9PSByaHMuYnVmZmVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXI7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE1lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cworICB7CisgICAgTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiggcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb25fICkKKyAgICAgICwgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uKCByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb25fICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzICkgLSBvZmZzZXRvZiggTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzKCBWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMmIG9wZXJhdG9yPSggVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE1lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24gPT0gcmhzLnByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uICkKKyAgICAgICAgICAmJiAoIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiA9PSByaHMucmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIE1lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyApID09IHNpemVvZiggVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBNZW1vcnlGZFByb3BlcnRpZXNLSFIKKyAgeworICAgIE1lbW9yeUZkUHJvcGVydGllc0tIUiggdWludDMyX3QgbWVtb3J5VHlwZUJpdHNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWVtb3J5VHlwZUJpdHMoIG1lbW9yeVR5cGVCaXRzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlGZFByb3BlcnRpZXNLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlGZFByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUZkUHJvcGVydGllc0tIUiApIC0gb2Zmc2V0b2YoIE1lbW9yeUZkUHJvcGVydGllc0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUZkUHJvcGVydGllc0tIUiggVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgTWVtb3J5RmRQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUZkUHJvcGVydGllc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01lbW9yeUZkUHJvcGVydGllc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01lbW9yeUZkUHJvcGVydGllc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeUZkUHJvcGVydGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBNZW1vcnlGZFByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1lbW9yeVR5cGVCaXRzID09IHJocy5tZW1vcnlUeXBlQml0cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZU1lbW9yeUZkUHJvcGVydGllc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5RmRQcm9wZXJ0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa01lbW9yeUZkUHJvcGVydGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNZW1vcnlGZFByb3BlcnRpZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICBzdHJ1Y3QgTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE1lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1lbW9yeSggbWVtb3J5XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCApIC0gb2Zmc2V0b2YoIE1lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoIFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQmIG9wZXJhdG9yPSggVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgJiBzZXRNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnkgPSBtZW1vcnlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1lbW9yeSA9PSByaHMubWVtb3J5ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnk7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgKSA9PSBzaXplb2YoIFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworCisgIHN0cnVjdCBNZW1vcnlHZXRGZEluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE1lbW9yeUdldEZkSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnlfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlRmQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1lbW9yeSggbWVtb3J5XyApCisgICAgICAsIGhhbmRsZVR5cGUoIGhhbmRsZVR5cGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUdldEZkSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUdldEZkSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5R2V0RmRJbmZvS0hSICkgLSBvZmZzZXRvZiggTWVtb3J5R2V0RmRJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5R2V0RmRJbmZvS0hSKCBWa01lbW9yeUdldEZkSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNZW1vcnlHZXRGZEluZm9LSFImIG9wZXJhdG9yPSggVmtNZW1vcnlHZXRGZEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5R2V0RmRJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUdldEZkSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5R2V0RmRJbmZvS0hSICYgc2V0TWVtb3J5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtb3J5ID0gbWVtb3J5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlHZXRGZEluZm9LSFIgJiBzZXRIYW5kbGVUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaGFuZGxlVHlwZSA9IGhhbmRsZVR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5R2V0RmRJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5R2V0RmRJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5R2V0RmRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE1lbW9yeUdldEZkSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbWVtb3J5ID09IHJocy5tZW1vcnkgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZSA9PSByaHMuaGFuZGxlVHlwZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTWVtb3J5R2V0RmRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZU1lbW9yeUdldEZkSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnk7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5R2V0RmRJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa01lbW9yeUdldEZkSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNZW1vcnlHZXRGZEluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgc3RydWN0IE1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWVtb3J5KCBtZW1vcnlfICkKKyAgICAgICwgaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgKSAtIG9mZnNldG9mKCBNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIoIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnkgPSBtZW1vcnlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiAmIHNldEhhbmRsZVR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGVUeXBlID0gaGFuZGxlVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtZW1vcnkgPT0gcmhzLm1lbW9yeSApCisgICAgICAgICAgJiYgKCBoYW5kbGVUeXBlID09IHJocy5oYW5kbGVUeXBlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgKSA9PSBzaXplb2YoIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PE1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgIHN0cnVjdCBNZW1vcnlIZWFwCisgIHsKKyAgICBNZW1vcnlIZWFwKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzaXplXyA9IDAsCisgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUhlYXBGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5SGVhcEZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNpemUoIHNpemVfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAge30KKworICAgIE1lbW9yeUhlYXAoIFZrTWVtb3J5SGVhcCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNZW1vcnlIZWFwJiBvcGVyYXRvcj0oIFZrTWVtb3J5SGVhcCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlIZWFwIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5SGVhcCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5SGVhcCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlIZWFwICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5SGVhcCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBNZW1vcnlIZWFwIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc2l6ZSA9PSByaHMuc2l6ZSApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE1lbW9yeUhlYXAgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2l6ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5SGVhcEZsYWdzIGZsYWdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIE1lbW9yeUhlYXAgKSA9PSBzaXplb2YoIFZrTWVtb3J5SGVhcCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNZW1vcnlIZWFwPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQKKyAgeworICAgIE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCggdWludDMyX3QgbWVtb3J5VHlwZUJpdHNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWVtb3J5VHlwZUJpdHMoIG1lbW9yeVR5cGVCaXRzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCApIC0gb2Zmc2V0b2YoIE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCggVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1lbW9yeVR5cGVCaXRzID09IHJocy5tZW1vcnlUeXBlQml0cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZU1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUICkgPT0gc2l6ZW9mKCBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiggdWludDY0X3Qgb3BhcXVlQ2FwdHVyZUFkZHJlc3NfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogb3BhcXVlQ2FwdHVyZUFkZHJlc3MoIG9wYXF1ZUNhcHR1cmVBZGRyZXNzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIE1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIoIFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgJiBzZXRPcGFxdWVDYXB0dXJlQWRkcmVzcyggdWludDY0X3Qgb3BhcXVlQ2FwdHVyZUFkZHJlc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9wYXF1ZUNhcHR1cmVBZGRyZXNzID0gb3BhcXVlQ2FwdHVyZUFkZHJlc3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG9wYXF1ZUNhcHR1cmVBZGRyZXNzID09IHJocy5vcGFxdWVDYXB0dXJlQWRkcmVzcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQ2NF90IG9wYXF1ZUNhcHR1cmVBZGRyZXNzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIE1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PE1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQoIGZsb2F0IHByaW9yaXR5XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHByaW9yaXR5KCBwcmlvcml0eV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQgKSAtIG9mZnNldG9mKCBNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUKCBWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE1lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUICYgc2V0UHJpb3JpdHkoIGZsb2F0IHByaW9yaXR5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwcmlvcml0eSA9IHByaW9yaXR5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE1lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwcmlvcml0eSA9PSByaHMucHJpb3JpdHkgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE1lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZU1lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBmbG9hdCBwcmlvcml0eTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgTWVtb3J5UmVxdWlyZW1lbnRzCisgIHsKKyAgICBNZW1vcnlSZXF1aXJlbWVudHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGFsaWdubWVudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2l6ZSggc2l6ZV8gKQorICAgICAgLCBhbGlnbm1lbnQoIGFsaWdubWVudF8gKQorICAgICAgLCBtZW1vcnlUeXBlQml0cyggbWVtb3J5VHlwZUJpdHNfICkKKyAgICB7fQorCisgICAgTWVtb3J5UmVxdWlyZW1lbnRzKCBWa01lbW9yeVJlcXVpcmVtZW50cyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNZW1vcnlSZXF1aXJlbWVudHMmIG9wZXJhdG9yPSggVmtNZW1vcnlSZXF1aXJlbWVudHMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5UmVxdWlyZW1lbnRzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5UmVxdWlyZW1lbnRzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5UmVxdWlyZW1lbnRzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE1lbW9yeVJlcXVpcmVtZW50cyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNpemUgPT0gcmhzLnNpemUgKQorICAgICAgICAgICYmICggYWxpZ25tZW50ID09IHJocy5hbGlnbm1lbnQgKQorICAgICAgICAgICYmICggbWVtb3J5VHlwZUJpdHMgPT0gcmhzLm1lbW9yeVR5cGVCaXRzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBNZW1vcnlSZXF1aXJlbWVudHMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2l6ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBhbGlnbm1lbnQ7CisgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTWVtb3J5UmVxdWlyZW1lbnRzICkgPT0gc2l6ZW9mKCBWa01lbW9yeVJlcXVpcmVtZW50cyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNZW1vcnlSZXF1aXJlbWVudHM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE1lbW9yeVJlcXVpcmVtZW50czIKKyAgeworICAgIE1lbW9yeVJlcXVpcmVtZW50czIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMgbWVtb3J5UmVxdWlyZW1lbnRzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWVtb3J5UmVxdWlyZW1lbnRzKCBtZW1vcnlSZXF1aXJlbWVudHNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyICkgLSBvZmZzZXRvZiggTWVtb3J5UmVxdWlyZW1lbnRzMiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1lbW9yeVJlcXVpcmVtZW50czIoIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNZW1vcnlSZXF1aXJlbWVudHMyJiBvcGVyYXRvcj0oIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzMio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlSZXF1aXJlbWVudHMyICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5UmVxdWlyZW1lbnRzMio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBNZW1vcnlSZXF1aXJlbWVudHMyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtZW1vcnlSZXF1aXJlbWVudHMgPT0gcmhzLm1lbW9yeVJlcXVpcmVtZW50cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTWVtb3J5UmVxdWlyZW1lbnRzMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlSZXF1aXJlbWVudHMyOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzIG1lbW9yeVJlcXVpcmVtZW50czsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBNZW1vcnlSZXF1aXJlbWVudHMyICkgPT0gc2l6ZW9mKCBWa01lbW9yeVJlcXVpcmVtZW50czIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TWVtb3J5UmVxdWlyZW1lbnRzMj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgTWVtb3J5VHlwZQorICB7CisgICAgTWVtb3J5VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVByb3BlcnR5RmxhZ3MgcHJvcGVydHlGbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UHJvcGVydHlGbGFncygpLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGhlYXBJbmRleF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwcm9wZXJ0eUZsYWdzKCBwcm9wZXJ0eUZsYWdzXyApCisgICAgICAsIGhlYXBJbmRleCggaGVhcEluZGV4XyApCisgICAge30KKworICAgIE1lbW9yeVR5cGUoIFZrTWVtb3J5VHlwZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNZW1vcnlUeXBlJiBvcGVyYXRvcj0oIFZrTWVtb3J5VHlwZSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlUeXBlIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWVtb3J5VHlwZSBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5VHlwZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlUeXBlICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTWVtb3J5VHlwZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBNZW1vcnlUeXBlIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggcHJvcGVydHlGbGFncyA9PSByaHMucHJvcGVydHlGbGFncyApCisgICAgICAgICAgJiYgKCBoZWFwSW5kZXggPT0gcmhzLmhlYXBJbmRleCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTWVtb3J5VHlwZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UHJvcGVydHlGbGFncyBwcm9wZXJ0eUZsYWdzOworICAgIHVpbnQzMl90IGhlYXBJbmRleDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBNZW1vcnlUeXBlICkgPT0gc2l6ZW9mKCBWa01lbW9yeVR5cGUgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TWVtb3J5VHlwZT46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICBzdHJ1Y3QgTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSCisgIHsKKyAgICBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoIHVpbnQzMl90IG1lbW9yeVR5cGVCaXRzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1lbW9yeVR5cGVCaXRzKCBtZW1vcnlUeXBlQml0c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgKSAtIG9mZnNldG9mKCBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiYgb3BlcmF0b3I9KCBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtZW1vcnlUeXBlQml0cyA9PSByaHMubWVtb3J5VHlwZUJpdHMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IG1lbW9yeVR5cGVCaXRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiApID09IHNpemVvZiggVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKKyAgc3RydWN0IE1ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE1ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZXRhbFN1cmZhY2VDcmVhdGVGbGFnc0VYVCBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWV0YWxTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDQU1ldGFsTGF5ZXIqIHBMYXllcl8gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgcExheWVyKCBwTGF5ZXJfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUICkgLSBvZmZzZXRvZiggTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQoIFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE1ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1ldGFsU3VyZmFjZUNyZWF0ZUZsYWdzRVhUIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUICYgc2V0UExheWVyKCBjb25zdCBDQU1ldGFsTGF5ZXIqIHBMYXllcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcExheWVyID0gcExheWVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHBMYXllciA9PSByaHMucExheWVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZU1ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZXRhbFN1cmZhY2VDcmVhdGVGbGFnc0VYVCBmbGFnczsKKyAgICBjb25zdCBDQU1ldGFsTGF5ZXIqIHBMYXllcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQqLworCisgIHN0cnVjdCBNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQKKyAgeworICAgIE11bHRpc2FtcGxlUHJvcGVydGllc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUoIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok11bHRpc2FtcGxlUHJvcGVydGllc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok11bHRpc2FtcGxlUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKCBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPSggVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIE11bHRpc2FtcGxlUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZSA9PSByaHMubWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUICkgPT0gc2l6ZW9mKCBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKCB1aW50MzJfdCBvYmplY3RDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWCogcE9iamVjdEVudHJ5VHlwZXNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0RW50cnlDb3VudHNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgqIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3NfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvcl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvcl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlZEltYWdlc1BlckRlc2NyaXB0b3JfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFBpcGVsaW5lTGF5b3V0c18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBvYmplY3RDb3VudCggb2JqZWN0Q291bnRfICkKKyAgICAgICwgcE9iamVjdEVudHJ5VHlwZXMoIHBPYmplY3RFbnRyeVR5cGVzXyApCisgICAgICAsIHBPYmplY3RFbnRyeUNvdW50cyggcE9iamVjdEVudHJ5Q291bnRzXyApCisgICAgICAsIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MoIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3NfICkKKyAgICAgICwgbWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yKCBtYXhVbmlmb3JtQnVmZmVyc1BlckRlc2NyaXB0b3JfICkKKyAgICAgICwgbWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yKCBtYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3JfICkKKyAgICAgICwgbWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3IoIG1heFN0b3JhZ2VJbWFnZXNQZXJEZXNjcmlwdG9yXyApCisgICAgICAsIG1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yKCBtYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvcl8gKQorICAgICAgLCBtYXhQaXBlbGluZUxheW91dHMoIG1heFBpcGVsaW5lTGF5b3V0c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggKSAtIG9mZnNldG9mKCBPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgoIFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCYgb3BlcmF0b3I9KCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggJiBzZXRPYmplY3RDb3VudCggdWludDMyX3Qgb2JqZWN0Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9iamVjdENvdW50ID0gb2JqZWN0Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCAmIHNldFBPYmplY3RFbnRyeVR5cGVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYKiBwT2JqZWN0RW50cnlUeXBlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE9iamVjdEVudHJ5VHlwZXMgPSBwT2JqZWN0RW50cnlUeXBlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYICYgc2V0UE9iamVjdEVudHJ5Q291bnRzKCBjb25zdCB1aW50MzJfdCogcE9iamVjdEVudHJ5Q291bnRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwT2JqZWN0RW50cnlDb3VudHMgPSBwT2JqZWN0RW50cnlDb3VudHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCAmIHNldFBPYmplY3RFbnRyeVVzYWdlRmxhZ3MoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgqIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgPSBwT2JqZWN0RW50cnlVc2FnZUZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggJiBzZXRNYXhVbmlmb3JtQnVmZmVyc1BlckRlc2NyaXB0b3IoIHVpbnQzMl90IG1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yID0gbWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggJiBzZXRNYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3IoIHVpbnQzMl90IG1heFN0b3JhZ2VCdWZmZXJzUGVyRGVzY3JpcHRvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yID0gbWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggJiBzZXRNYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvciggdWludDMyX3QgbWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3JfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1heFN0b3JhZ2VJbWFnZXNQZXJEZXNjcmlwdG9yID0gbWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3JfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCAmIHNldE1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yKCB1aW50MzJfdCBtYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWF4U2FtcGxlZEltYWdlc1BlckRlc2NyaXB0b3IgPSBtYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYICYgc2V0TWF4UGlwZWxpbmVMYXlvdXRzKCB1aW50MzJfdCBtYXhQaXBlbGluZUxheW91dHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1heFBpcGVsaW5lTGF5b3V0cyA9IG1heFBpcGVsaW5lTGF5b3V0c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBvYmplY3RDb3VudCA9PSByaHMub2JqZWN0Q291bnQgKQorICAgICAgICAgICYmICggcE9iamVjdEVudHJ5VHlwZXMgPT0gcmhzLnBPYmplY3RFbnRyeVR5cGVzICkKKyAgICAgICAgICAmJiAoIHBPYmplY3RFbnRyeUNvdW50cyA9PSByaHMucE9iamVjdEVudHJ5Q291bnRzICkKKyAgICAgICAgICAmJiAoIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgPT0gcmhzLnBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgKQorICAgICAgICAgICYmICggbWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yID09IHJocy5tYXhVbmlmb3JtQnVmZmVyc1BlckRlc2NyaXB0b3IgKQorICAgICAgICAgICYmICggbWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yID09IHJocy5tYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3IgKQorICAgICAgICAgICYmICggbWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3IgPT0gcmhzLm1heFN0b3JhZ2VJbWFnZXNQZXJEZXNjcmlwdG9yICkKKyAgICAgICAgICAmJiAoIG1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yID09IHJocy5tYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvciApCisgICAgICAgICAgJiYgKCBtYXhQaXBlbGluZUxheW91dHMgPT0gcmhzLm1heFBpcGVsaW5lTGF5b3V0cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZU9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3Qgb2JqZWN0Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWCogcE9iamVjdEVudHJ5VHlwZXM7CisgICAgY29uc3QgdWludDMyX3QqIHBPYmplY3RFbnRyeUNvdW50czsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYKiBwT2JqZWN0RW50cnlVc2FnZUZsYWdzOworICAgIHVpbnQzMl90IG1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvcjsKKyAgICB1aW50MzJfdCBtYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3I7CisgICAgdWludDMyX3QgbWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3I7CisgICAgdWludDMyX3QgbWF4U2FtcGxlZEltYWdlc1BlckRlc2NyaXB0b3I7CisgICAgdWludDMyX3QgbWF4UGlwZWxpbmVMYXlvdXRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIE9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCApID09IHNpemVvZiggVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8T2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBPYmplY3RUYWJsZUVudHJ5TlZYCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBPYmplY3RUYWJsZUVudHJ5TlZYKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYIHR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWDo6ZURlc2NyaXB0b3JTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHR5cGUoIHR5cGVfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAge30KKworICAgIE9iamVjdFRhYmxlRW50cnlOVlgoIFZrT2JqZWN0VGFibGVFbnRyeU5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUVudHJ5TlZYJiBvcGVyYXRvcj0oIFZrT2JqZWN0VGFibGVFbnRyeU5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZUVudHJ5TlZYIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlRW50cnlOVlggJiBzZXRUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYIHR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHR5cGUgPSB0eXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUVudHJ5TlZYICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrT2JqZWN0VGFibGVFbnRyeU5WWCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrT2JqZWN0VGFibGVFbnRyeU5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtPYmplY3RUYWJsZUVudHJ5TlZYICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrT2JqZWN0VGFibGVFbnRyeU5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBPYmplY3RUYWJsZUVudHJ5TlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggdHlwZSA9PSByaHMudHlwZSApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE9iamVjdFRhYmxlRW50cnlOVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWCB0eXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggZmxhZ3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggT2JqZWN0VGFibGVFbnRyeU5WWCApID09IHNpemVvZiggVmtPYmplY3RUYWJsZUVudHJ5TlZYICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PE9iamVjdFRhYmxlRW50cnlOVlg+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE9iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWCB0eXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlg6OmVEZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IHBpcGVsaW5lTGF5b3V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0KCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHR5cGUoIHR5cGVfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHBpcGVsaW5lTGF5b3V0KCBwaXBlbGluZUxheW91dF8gKQorICAgICAgLCBkZXNjcmlwdG9yU2V0KCBkZXNjcmlwdG9yU2V0XyApCisgICAge30KKworICAgIGV4cGxpY2l0IE9iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYKCBPYmplY3RUYWJsZUVudHJ5TlZYIGNvbnN0JiBvYmplY3RUYWJsZUVudHJ5TlZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQoKSApCisgICAgICA6IHR5cGUoIG9iamVjdFRhYmxlRW50cnlOVlgudHlwZSApCisgICAgICAsIGZsYWdzKCBvYmplY3RUYWJsZUVudHJ5TlZYLmZsYWdzICkKKyAgICAgICwgcGlwZWxpbmVMYXlvdXQoIHBpcGVsaW5lTGF5b3V0XyApCisgICAgICAsIGRlc2NyaXB0b3JTZXQoIGRlc2NyaXB0b3JTZXRfICkKKyAgICB7fQorCisgICAgT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlgoIFZrT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlgmIG9wZXJhdG9yPSggVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCAmIHNldFR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlggdHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHlwZSA9IHR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYICYgc2V0UGlwZWxpbmVMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGlwZWxpbmVMYXlvdXQgPSBwaXBlbGluZUxheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlggJiBzZXREZXNjcmlwdG9yU2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yU2V0ID0gZGVzY3JpcHRvclNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlgqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlggJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHR5cGUgPT0gcmhzLnR5cGUgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHBpcGVsaW5lTGF5b3V0ID09IHJocy5waXBlbGluZUxheW91dCApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yU2V0ID09IHJocy5kZXNjcmlwdG9yU2V0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYIHR5cGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCApID09IHNpemVvZiggVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlggdHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYOjplRGVzY3JpcHRvclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZSBpbmRleFR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZTo6ZVVpbnQxNiApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdHlwZSggdHlwZV8gKQorICAgICAgLCBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgYnVmZmVyKCBidWZmZXJfICkKKyAgICAgICwgaW5kZXhUeXBlKCBpbmRleFR5cGVfICkKKyAgICB7fQorCisgICAgZXhwbGljaXQgT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYKCBPYmplY3RUYWJsZUVudHJ5TlZYIGNvbnN0JiBvYmplY3RUYWJsZUVudHJ5TlZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZSBpbmRleFR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZTo6ZVVpbnQxNiApCisgICAgICA6IHR5cGUoIG9iamVjdFRhYmxlRW50cnlOVlgudHlwZSApCisgICAgICAsIGZsYWdzKCBvYmplY3RUYWJsZUVudHJ5TlZYLmZsYWdzICkKKyAgICAgICwgYnVmZmVyKCBidWZmZXJfICkKKyAgICAgICwgaW5kZXhUeXBlKCBpbmRleFR5cGVfICkKKyAgICB7fQorCisgICAgT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYKCBWa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgmIG9wZXJhdG9yPSggVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWCAmIHNldFR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlggdHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHlwZSA9IHR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlggJiBzZXRCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXIgPSBidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWCAmIHNldEluZGV4VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZSBpbmRleFR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGluZGV4VHlwZSA9IGluZGV4VHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlggY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlggJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggdHlwZSA9PSByaHMudHlwZSApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggYnVmZmVyID09IHJocy5idWZmZXIgKQorICAgICAgICAgICYmICggaW5kZXhUeXBlID09IHJocy5pbmRleFR5cGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE9iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYIHR5cGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kZXhUeXBlIGluZGV4VHlwZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlggKSA9PSBzaXplb2YoIFZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PE9iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlggdHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYOjplRGVzY3JpcHRvclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0eXBlKCB0eXBlXyApCisgICAgICAsIGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBwaXBlbGluZSggcGlwZWxpbmVfICkKKyAgICB7fQorCisgICAgZXhwbGljaXQgT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYKCBPYmplY3RUYWJsZUVudHJ5TlZYIGNvbnN0JiBvYmplY3RUYWJsZUVudHJ5TlZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSgpICkKKyAgICAgIDogdHlwZSggb2JqZWN0VGFibGVFbnRyeU5WWC50eXBlICkKKyAgICAgICwgZmxhZ3MoIG9iamVjdFRhYmxlRW50cnlOVlguZmxhZ3MgKQorICAgICAgLCBwaXBlbGluZSggcGlwZWxpbmVfICkKKyAgICB7fQorCisgICAgT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYKCBWa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlgmIG9wZXJhdG9yPSggVmtPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCAmIHNldFR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlggdHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHlwZSA9IHR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlggJiBzZXRQaXBlbGluZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwaXBlbGluZSA9IHBpcGVsaW5lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCB0eXBlID09IHJocy50eXBlICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBwaXBlbGluZSA9PSByaHMucGlwZWxpbmUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE9iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYIHR5cGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYICkgPT0gc2l6ZW9mKCBWa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlg+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE9iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE9iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlggdHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYOjplRGVzY3JpcHRvclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0eXBlKCB0eXBlXyApCisgICAgICAsIGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBwaXBlbGluZUxheW91dCggcGlwZWxpbmVMYXlvdXRfICkKKyAgICAgICwgc3RhZ2VGbGFncyggc3RhZ2VGbGFnc18gKQorICAgIHt9CisKKyAgICBleHBsaWNpdCBPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYKCBPYmplY3RUYWJsZUVudHJ5TlZYIGNvbnN0JiBvYmplY3RUYWJsZUVudHJ5TlZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzKCkgKQorICAgICAgOiB0eXBlKCBvYmplY3RUYWJsZUVudHJ5TlZYLnR5cGUgKQorICAgICAgLCBmbGFncyggb2JqZWN0VGFibGVFbnRyeU5WWC5mbGFncyApCisgICAgICAsIHBpcGVsaW5lTGF5b3V0KCBwaXBlbGluZUxheW91dF8gKQorICAgICAgLCBzdGFnZUZsYWdzKCBzdGFnZUZsYWdzXyApCisgICAge30KKworICAgIE9iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgoIFZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYJiBvcGVyYXRvcj0oIFZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlggJiBzZXRUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYIHR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHR5cGUgPSB0eXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIE9iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlggJiBzZXRQaXBlbGluZUxheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IHBpcGVsaW5lTGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwaXBlbGluZUxheW91dCA9IHBpcGVsaW5lTGF5b3V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYICYgc2V0U3RhZ2VGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RhZ2VGbGFncyA9IHN0YWdlRmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggdHlwZSA9PSByaHMudHlwZSApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggcGlwZWxpbmVMYXlvdXQgPT0gcmhzLnBpcGVsaW5lTGF5b3V0ICkKKyAgICAgICAgICAmJiAoIHN0YWdlRmxhZ3MgPT0gcmhzLnN0YWdlRmxhZ3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIE9iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWCB0eXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggZmxhZ3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IHBpcGVsaW5lTGF5b3V0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzIHN0YWdlRmxhZ3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWCApID09IHNpemVvZiggVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PE9iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlg+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IE9iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIE9iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlggdHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYOjplRGVzY3JpcHRvclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHR5cGUoIHR5cGVfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGJ1ZmZlciggYnVmZmVyXyApCisgICAge30KKworICAgIGV4cGxpY2l0IE9iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgoIE9iamVjdFRhYmxlRW50cnlOVlggY29uc3QmIG9iamVjdFRhYmxlRW50cnlOVlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlcigpICkKKyAgICAgIDogdHlwZSggb2JqZWN0VGFibGVFbnRyeU5WWC50eXBlICkKKyAgICAgICwgZmxhZ3MoIG9iamVjdFRhYmxlRW50cnlOVlguZmxhZ3MgKQorICAgICAgLCBidWZmZXIoIGJ1ZmZlcl8gKQorICAgIHt9CisKKyAgICBPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYKCBWa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWCYgb3BlcmF0b3I9KCBWa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYICYgc2V0VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWCB0eXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0eXBlID0gdHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYICYgc2V0QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYnVmZmVyID0gYnVmZmVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlggY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHR5cGUgPT0gcmhzLnR5cGUgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlciA9PSByaHMuYnVmZmVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RFbnRyeVR5cGVOVlggdHlwZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIE9iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlggKSA9PSBzaXplb2YoIFZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFCisgIHsKKyAgICBQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKCB1aW50MzJfdCBwcmVzZW50SURfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkZXNpcmVkUHJlc2VudFRpbWVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBhY3R1YWxQcmVzZW50VGltZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVhcmxpZXN0UHJlc2VudFRpbWVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwcmVzZW50TWFyZ2luXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHByZXNlbnRJRCggcHJlc2VudElEXyApCisgICAgICAsIGRlc2lyZWRQcmVzZW50VGltZSggZGVzaXJlZFByZXNlbnRUaW1lXyApCisgICAgICAsIGFjdHVhbFByZXNlbnRUaW1lKCBhY3R1YWxQcmVzZW50VGltZV8gKQorICAgICAgLCBlYXJsaWVzdFByZXNlbnRUaW1lKCBlYXJsaWVzdFByZXNlbnRUaW1lXyApCisgICAgICAsIHByZXNlbnRNYXJnaW4oIHByZXNlbnRNYXJnaW5fICkKKyAgICB7fQorCisgICAgUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSggVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUmIG9wZXJhdG9yPSggVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBwcmVzZW50SUQgPT0gcmhzLnByZXNlbnRJRCApCisgICAgICAgICAgJiYgKCBkZXNpcmVkUHJlc2VudFRpbWUgPT0gcmhzLmRlc2lyZWRQcmVzZW50VGltZSApCisgICAgICAgICAgJiYgKCBhY3R1YWxQcmVzZW50VGltZSA9PSByaHMuYWN0dWFsUHJlc2VudFRpbWUgKQorICAgICAgICAgICYmICggZWFybGllc3RQcmVzZW50VGltZSA9PSByaHMuZWFybGllc3RQcmVzZW50VGltZSApCisgICAgICAgICAgJiYgKCBwcmVzZW50TWFyZ2luID09IHJocy5wcmVzZW50TWFyZ2luICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IHByZXNlbnRJRDsKKyAgICB1aW50NjRfdCBkZXNpcmVkUHJlc2VudFRpbWU7CisgICAgdWludDY0X3QgYWN0dWFsUHJlc2VudFRpbWU7CisgICAgdWludDY0X3QgZWFybGllc3RQcmVzZW50VGltZTsKKyAgICB1aW50NjRfdCBwcmVzZW50TWFyZ2luOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgKSA9PSBzaXplb2YoIFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uVHlwZUlOVEVMIHR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTDo6ZUNvbW1hbmRRdWV1ZU1ldHJpY3NEaXNjb3ZlcnlBY3RpdmF0ZWQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHR5cGUoIHR5cGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMICkgLSBvZmZzZXRvZiggUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwoIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMJiBvcGVyYXRvcj0oIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgJiBzZXRUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uVHlwZUlOVEVMIHR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHR5cGUgPSB0eXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdHlwZSA9PSByaHMudHlwZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uVHlwZUlOVEVMIHR5cGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCApID09IHNpemVvZiggVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUw+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSCisgIHsKKyAgICBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ3NLSFIgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ3NLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxjaGFyLFZLX01BWF9ERVNDUklQVElPTl9TSVpFPiBjb25zdCYgbmFtZV8gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRT4gY29uc3QmIGNhdGVnb3J5XyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxjaGFyLFZLX01BWF9ERVNDUklQVElPTl9TSVpFPiBjb25zdCYgZGVzY3JpcHRpb25fID0geyB7IDAgfSB9ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgbmFtZXt9CisgICAgICAsIGNhdGVnb3J5e30KKyAgICAgICwgZGVzY3JpcHRpb257fQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRSxWS19NQVhfREVTQ1JJUFRJT05fU0laRT46OmNvcHkoIG5hbWUsIG5hbWVfICk7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGNoYXIsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU+Ojpjb3B5KCBjYXRlZ29yeSwgY2F0ZWdvcnlfICk7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGNoYXIsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU+Ojpjb3B5KCBkZXNjcmlwdGlvbiwgZGVzY3JpcHRpb25fICk7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSICkgLSBvZmZzZXRvZiggUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiggVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiYgb3BlcmF0b3I9KCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIG5hbWUsIHJocy5uYW1lLCBWS19NQVhfREVTQ1JJUFRJT05fU0laRSAqIHNpemVvZiggY2hhciApICkgPT0gMCApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGNhdGVnb3J5LCByaHMuY2F0ZWdvcnksIFZLX01BWF9ERVNDUklQVElPTl9TSVpFICogc2l6ZW9mKCBjaGFyICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggZGVzY3JpcHRpb24sIHJocy5kZXNjcmlwdGlvbiwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnc0tIUiBmbGFnczsKKyAgICBjaGFyIG5hbWVbVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIGNoYXIgY2F0ZWdvcnlbVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIGNoYXIgZGVzY3JpcHRpb25bVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSICkgPT0gc2l6ZW9mKCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQZXJmb3JtYW5jZUNvdW50ZXJLSFIKKyAgeworICAgIFBlcmZvcm1hbmNlQ291bnRlcktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlclVuaXRLSFIgdW5pdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUjo6ZUdlbmVyaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFIgc2NvcGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSOjplVmtRdWVyeVNjb3BlQ29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSIHN0b3JhZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFI6OmVJbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCxWS19VVUlEX1NJWkU+IGNvbnN0JiB1dWlkXyA9IHsgeyAwIH0gfSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdW5pdCggdW5pdF8gKQorICAgICAgLCBzY29wZSggc2NvcGVfICkKKyAgICAgICwgc3RvcmFnZSggc3RvcmFnZV8gKQorICAgICAgLCB1dWlke30KKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PHVpbnQ4X3QsVktfVVVJRF9TSVpFLFZLX1VVSURfU0laRT46OmNvcHkoIHV1aWQsIHV1aWRfICk7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlcktIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlcktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyS0hSICkgLSBvZmZzZXRvZiggUGVyZm9ybWFuY2VDb3VudGVyS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VDb3VudGVyS0hSKCBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZUNvdW50ZXJLSFImIG9wZXJhdG9yPSggVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBlcmZvcm1hbmNlQ291bnRlcktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdW5pdCA9PSByaHMudW5pdCApCisgICAgICAgICAgJiYgKCBzY29wZSA9PSByaHMuc2NvcGUgKQorICAgICAgICAgICYmICggc3RvcmFnZSA9PSByaHMuc3RvcmFnZSApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIHV1aWQsIHJocy51dWlkLCBWS19VVUlEX1NJWkUgKiBzaXplb2YoIHVpbnQ4X3QgKSApID09IDAgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBlcmZvcm1hbmNlQ291bnRlcktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQZXJmb3JtYW5jZUNvdW50ZXJLSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSIHVuaXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSIHNjb3BlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSIHN0b3JhZ2U7CisgICAgdWludDhfdCB1dWlkW1ZLX1VVSURfU0laRV07CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGVyZm9ybWFuY2VDb3VudGVyS0hSICkgPT0gc2l6ZW9mKCBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQZXJmb3JtYW5jZUNvdW50ZXJLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgdW5pb24gUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSCisgIHsKKyAgICBQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIoIGludDMyX3QgaW50MzJfID0gMCApCisgICAgeworICAgICAgaW50MzIgPSBpbnQzMl87CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKCBpbnQ2NF90IGludDY0XyApCisgICAgeworICAgICAgaW50NjQgPSBpbnQ2NF87CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKCB1aW50MzJfdCB1aW50MzJfICkKKyAgICB7CisgICAgICB1aW50MzIgPSB1aW50MzJfOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUiggdWludDY0X3QgdWludDY0XyApCisgICAgeworICAgICAgdWludDY0ID0gdWludDY0XzsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIoIGZsb2F0IGZsb2F0MzJfICkKKyAgICB7CisgICAgICBmbG9hdDMyID0gZmxvYXQzMl87CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKCBkb3VibGUgZmxvYXQ2NF8gKQorICAgIHsKKyAgICAgIGZsb2F0NjQgPSBmbG9hdDY0XzsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIgJiBzZXRJbnQzMiggaW50MzJfdCBpbnQzMl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW50MzIgPSBpbnQzMl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSICYgc2V0SW50NjQoIGludDY0X3QgaW50NjRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGludDY0ID0gaW50NjRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUiAmIHNldFVpbnQzMiggdWludDMyX3QgdWludDMyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB1aW50MzIgPSB1aW50MzJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUiAmIHNldFVpbnQ2NCggdWludDY0X3QgdWludDY0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB1aW50NjQgPSB1aW50NjRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUiAmIHNldEZsb2F0MzIoIGZsb2F0IGZsb2F0MzJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsb2F0MzIgPSBmbG9hdDMyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIgJiBzZXRGbG9hdDY0KCBkb3VibGUgZmxvYXQ2NF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxvYXQ2NCA9IGZsb2F0NjRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUiBjb25zdCYoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUio+KHRoaXMpOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSICYoKQorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUio+KHRoaXMpOworICAgIH0KKworICAgIGludDMyX3QgaW50MzI7CisgICAgaW50NjRfdCBpbnQ2NDsKKyAgICB1aW50MzJfdCB1aW50MzI7CisgICAgdWludDY0X3QgdWludDY0OworICAgIGZsb2F0IGZsb2F0MzI7CisgICAgZG91YmxlIGZsb2F0NjQ7CisgIH07CisKKyAgc3RydWN0IFBlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCggdWludDY0X3QgbWFya2VyXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1hcmtlciggbWFya2VyXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCApIC0gb2Zmc2V0b2YoIFBlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwoIFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwmIG9wZXJhdG9yPSggVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwgJiBzZXRNYXJrZXIoIHVpbnQ2NF90IG1hcmtlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWFya2VyID0gbWFya2VyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtYXJrZXIgPT0gcmhzLm1hcmtlciApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUw7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQ2NF90IG1hcmtlcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCApID09IHNpemVvZiggVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUwgdHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTDo6ZU51bGxIYXJkd2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGVuYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBhcmFtZXRlcl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0eXBlKCB0eXBlXyApCisgICAgICAsIGVuYWJsZSggZW5hYmxlXyApCisgICAgICAsIHBhcmFtZXRlciggcGFyYW1ldGVyXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCApIC0gb2Zmc2V0b2YoIFBlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCYgb3BlcmF0b3I9KCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMICYgc2V0VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUwgdHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHlwZSA9IHR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgJiBzZXRFbmFibGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZW5hYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBlbmFibGUgPSBlbmFibGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgJiBzZXRQYXJhbWV0ZXIoIHVpbnQ2NF90IHBhcmFtZXRlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGFyYW1ldGVyID0gcGFyYW1ldGVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdHlwZSA9PSByaHMudHlwZSApCisgICAgICAgICAgJiYgKCBlbmFibGUgPT0gcmhzLmVuYWJsZSApCisgICAgICAgICAgJiYgKCBwYXJhbWV0ZXIgPT0gcmhzLnBhcmFtZXRlciApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTCB0eXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZW5hYmxlOworICAgIHVpbnQ2NF90IHBhcmFtZXRlcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMICkgPT0gc2l6ZW9mKCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSKCB1aW50MzJfdCBjb3VudGVyUGFzc0luZGV4XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGNvdW50ZXJQYXNzSW5kZXgoIGNvdW50ZXJQYXNzSW5kZXhfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSICkgLSBvZmZzZXRvZiggUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiggVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiYgb3BlcmF0b3I9KCBWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiAmIHNldENvdW50ZXJQYXNzSW5kZXgoIHVpbnQzMl90IGNvdW50ZXJQYXNzSW5kZXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvdW50ZXJQYXNzSW5kZXggPSBjb3VudGVyUGFzc0luZGV4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBjb3VudGVyUGFzc0luZGV4ID09IHJocy5jb3VudGVyUGFzc0luZGV4ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgY291bnRlclBhc3NJbmRleDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiApID09IHNpemVvZiggVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKCB1aW50MzJfdCBtYXJrZXJfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWFya2VyKCBtYXJrZXJfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMICkgLSBvZmZzZXRvZiggUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCggVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCYgb3BlcmF0b3I9KCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCAmIHNldE1hcmtlciggdWludDMyX3QgbWFya2VyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXJrZXIgPSBtYXJrZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1hcmtlciA9PSByaHMubWFya2VyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWFya2VyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMICkgPT0gc2l6ZW9mKCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHVuaW9uIFBlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwKKyAgeworICAgIFBlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwoIHVpbnQzMl90IHZhbHVlMzJfID0gMCApCisgICAgeworICAgICAgdmFsdWUzMiA9IHZhbHVlMzJfOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwoIHVpbnQ2NF90IHZhbHVlNjRfICkKKyAgICB7CisgICAgICB2YWx1ZTY0ID0gdmFsdWU2NF87CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCggZmxvYXQgdmFsdWVGbG9hdF8gKQorICAgIHsKKyAgICAgIHZhbHVlRmxvYXQgPSB2YWx1ZUZsb2F0XzsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKCBjb25zdCBjaGFyKiB2YWx1ZVN0cmluZ18gKQorICAgIHsKKyAgICAgIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmdfOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwgJiBzZXRWYWx1ZTMyKCB1aW50MzJfdCB2YWx1ZTMyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2YWx1ZTMyID0gdmFsdWUzMl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCAmIHNldFZhbHVlNjQoIHVpbnQ2NF90IHZhbHVlNjRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZhbHVlNjQgPSB2YWx1ZTY0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMICYgc2V0VmFsdWVGbG9hdCggZmxvYXQgdmFsdWVGbG9hdF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmFsdWVGbG9hdCA9IHZhbHVlRmxvYXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwgJiBzZXRWYWx1ZUJvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmFsdWVCb29sXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2YWx1ZUJvb2wgPSB2YWx1ZUJvb2xfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwgJiBzZXRWYWx1ZVN0cmluZyggY29uc3QgY2hhciogdmFsdWVTdHJpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwgY29uc3QmKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKj4odGhpcyk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMICYoKQorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwqPih0aGlzKTsKKyAgICB9CisKKyNpZmRlZiBWVUxLQU5fSFBQX0hBU19VTlJFU1RSSUNURURfVU5JT05TCisgICAgdWludDMyX3QgdmFsdWUzMjsKKyAgICB1aW50NjRfdCB2YWx1ZTY0OworICAgIGZsb2F0IHZhbHVlRmxvYXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2YWx1ZUJvb2w7CisgICAgY29uc3QgY2hhciogdmFsdWVTdHJpbmc7CisjZWxzZQorICAgIHVpbnQzMl90IHZhbHVlMzI7CisgICAgdWludDY0X3QgdmFsdWU2NDsKKyAgICBmbG9hdCB2YWx1ZUZsb2F0OworICAgIFZrQm9vbDMyIHZhbHVlQm9vbDsKKyAgICBjb25zdCBjaGFyKiB2YWx1ZVN0cmluZzsKKyNlbmRpZiAgLypWVUxLQU5fSFBQX0hBU19VTlJFU1RSSUNURURfVU5JT05TKi8KKyAgfTsKKworICBzdHJ1Y3QgUGVyZm9ybWFuY2VWYWx1ZUlOVEVMCisgIHsKKyAgICBQZXJmb3JtYW5jZVZhbHVlSU5URUwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMIHR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUw6OmVVaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCBkYXRhXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHR5cGUoIHR5cGVfICkKKyAgICAgICwgZGF0YSggZGF0YV8gKQorICAgIHt9CisKKyAgICBQZXJmb3JtYW5jZVZhbHVlSU5URUwoIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlVmFsdWVJTlRFTCYgb3BlcmF0b3I9KCBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVZhbHVlSU5URUwgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGVyZm9ybWFuY2VWYWx1ZUlOVEVMICYgc2V0VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUwgdHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHlwZSA9IHR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBlcmZvcm1hbmNlVmFsdWVJTlRFTCAmIHNldERhdGEoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMIGRhdGFfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRhdGEgPSBkYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCo+KCB0aGlzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VWYWx1ZVR5cGVJTlRFTCB0eXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMIGRhdGE7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGVyZm9ybWFuY2VWYWx1ZUlOVEVMICkgPT0gc2l6ZW9mKCBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQZXJmb3JtYW5jZVZhbHVlSU5URUw+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdG9yYWdlUHVzaENvbnN0YW50MTZfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0b3JhZ2VJbnB1dE91dHB1dDE2XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN0b3JhZ2VCdWZmZXIxNkJpdEFjY2Vzcyggc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzXyApCisgICAgICAsIHVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MoIHVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3NfICkKKyAgICAgICwgc3RvcmFnZVB1c2hDb25zdGFudDE2KCBzdG9yYWdlUHVzaENvbnN0YW50MTZfICkKKyAgICAgICwgc3RvcmFnZUlucHV0T3V0cHV0MTYoIHN0b3JhZ2VJbnB1dE91dHB1dDE2XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKCBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzICYgc2V0U3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0b3JhZ2VCdWZmZXIxNkJpdEFjY2Vzc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzID0gc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzICYgc2V0VW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzID0gdW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2Vzc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyAmIHNldFN0b3JhZ2VQdXNoQ29uc3RhbnQxNiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdG9yYWdlUHVzaENvbnN0YW50MTZfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0b3JhZ2VQdXNoQ29uc3RhbnQxNiA9IHN0b3JhZ2VQdXNoQ29uc3RhbnQxNl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyAmIHNldFN0b3JhZ2VJbnB1dE91dHB1dDE2KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0b3JhZ2VJbnB1dE91dHB1dDE2XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdG9yYWdlSW5wdXRPdXRwdXQxNiA9IHN0b3JhZ2VJbnB1dE91dHB1dDE2XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzID09IHJocy5zdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MgKQorICAgICAgICAgICYmICggdW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyA9PSByaHMudW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyApCisgICAgICAgICAgJiYgKCBzdG9yYWdlUHVzaENvbnN0YW50MTYgPT0gcmhzLnN0b3JhZ2VQdXNoQ29uc3RhbnQxNiApCisgICAgICAgICAgJiYgKCBzdG9yYWdlSW5wdXRPdXRwdXQxNiA9PSByaHMuc3RvcmFnZUlucHV0T3V0cHV0MTYgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlczsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RvcmFnZVB1c2hDb25zdGFudDE2OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RvcmFnZUlucHV0T3V0cHV0MTY7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2Vzc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdG9yYWdlUHVzaENvbnN0YW50OF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdG9yYWdlQnVmZmVyOEJpdEFjY2Vzcyggc3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3NfICkKKyAgICAgICwgdW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzKCB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3NfICkKKyAgICAgICwgc3RvcmFnZVB1c2hDb25zdGFudDgoIHN0b3JhZ2VQdXNoQ29uc3RhbnQ4XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiggVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiAmIHNldFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyA9IHN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgJiBzZXRVbmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MgPSB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiAmIHNldFN0b3JhZ2VQdXNoQ29uc3RhbnQ4KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0b3JhZ2VQdXNoQ29uc3RhbnQ4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdG9yYWdlUHVzaENvbnN0YW50OCA9IHN0b3JhZ2VQdXNoQ29uc3RhbnQ4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzID09IHJocy5zdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyApCisgICAgICAgICAgJiYgKCB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MgPT0gcmhzLnVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyApCisgICAgICAgICAgJiYgKCBzdG9yYWdlUHVzaENvbnN0YW50OCA9PSByaHMuc3RvcmFnZVB1c2hDb25zdGFudDggKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdG9yYWdlUHVzaENvbnN0YW50ODsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlY29kZU1vZGVTaGFyZWRFeHBvbmVudF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkZWNvZGVNb2RlU2hhcmVkRXhwb25lbnQoIGRlY29kZU1vZGVTaGFyZWRFeHBvbmVudF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUICYgc2V0RGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlY29kZU1vZGVTaGFyZWRFeHBvbmVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50ID0gZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkZWNvZGVNb2RlU2hhcmVkRXhwb25lbnQgPT0gcmhzLmRlY29kZU1vZGVTaGFyZWRFeHBvbmVudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VBc3RjRGVjb2RlRmVhdHVyZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYWR2YW5jZWRCbGVuZENvaGVyZW50T3BlcmF0aW9uc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zKCBhZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgJiBzZXRBZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMgPSBhZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBhZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zID09IHJocy5hZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKCB1aW50MzJfdCBhZHZhbmNlZEJsZW5kTWF4Q29sb3JBdHRhY2htZW50c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkU3JjQ29sb3JfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3JfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHMoIGFkdmFuY2VkQmxlbmRNYXhDb2xvckF0dGFjaG1lbnRzXyApCisgICAgICAsIGFkdmFuY2VkQmxlbmRJbmRlcGVuZGVudEJsZW5kKCBhZHZhbmNlZEJsZW5kSW5kZXBlbmRlbnRCbGVuZF8gKQorICAgICAgLCBhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yKCBhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yXyApCisgICAgICAsIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3IoIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3JfICkKKyAgICAgICwgYWR2YW5jZWRCbGVuZENvcnJlbGF0ZWRPdmVybGFwKCBhZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXBfICkKKyAgICAgICwgYWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnMoIGFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggYWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHMgPT0gcmhzLmFkdmFuY2VkQmxlbmRNYXhDb2xvckF0dGFjaG1lbnRzICkKKyAgICAgICAgICAmJiAoIGFkdmFuY2VkQmxlbmRJbmRlcGVuZGVudEJsZW5kID09IHJocy5hZHZhbmNlZEJsZW5kSW5kZXBlbmRlbnRCbGVuZCApCisgICAgICAgICAgJiYgKCBhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yID09IHJocy5hZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yICkKKyAgICAgICAgICAmJiAoIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3IgPT0gcmhzLmFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3IgKQorICAgICAgICAgICYmICggYWR2YW5jZWRCbGVuZENvcnJlbGF0ZWRPdmVybGFwID09IHJocy5hZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXAgKQorICAgICAgICAgICYmICggYWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnMgPT0gcmhzLmFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGFkdmFuY2VkQmxlbmRNYXhDb2xvckF0dGFjaG1lbnRzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWREc3RDb2xvcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYnVmZmVyRGV2aWNlQWRkcmVzc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGJ1ZmZlckRldmljZUFkZHJlc3MoIGJ1ZmZlckRldmljZUFkZHJlc3NfICkKKyAgICAgICwgYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkoIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5XyApCisgICAgICAsIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSggYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgJiBzZXRCdWZmZXJEZXZpY2VBZGRyZXNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJ1ZmZlckRldmljZUFkZHJlc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJ1ZmZlckRldmljZUFkZHJlc3MgPSBidWZmZXJEZXZpY2VBZGRyZXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCAmIHNldEJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSA9IGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCAmIHNldEJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSA9IGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggYnVmZmVyRGV2aWNlQWRkcmVzcyA9PSByaHMuYnVmZmVyRGV2aWNlQWRkcmVzcyApCisgICAgICAgICAgJiYgKCBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSA9PSByaHMuYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkgKQorICAgICAgICAgICYmICggYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlID09IHJocy5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJ1ZmZlckRldmljZUFkZHJlc3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJ1ZmZlckRldmljZUFkZHJlc3NfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBidWZmZXJEZXZpY2VBZGRyZXNzKCBidWZmZXJEZXZpY2VBZGRyZXNzXyApCisgICAgICAsIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5KCBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheV8gKQorICAgICAgLCBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UoIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSICYgc2V0QnVmZmVyRGV2aWNlQWRkcmVzcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXJEZXZpY2VBZGRyZXNzID0gYnVmZmVyRGV2aWNlQWRkcmVzc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgJiBzZXRCdWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkgPSBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgJiBzZXRCdWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UgPSBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlckRldmljZUFkZHJlc3MgPT0gcmhzLmJ1ZmZlckRldmljZUFkZHJlc3MgKQorICAgICAgICAgICYmICggYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkgPT0gcmhzLmJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5ICkKKyAgICAgICAgICAmJiAoIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSA9PSByaHMuYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXk7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRldmljZUNvaGVyZW50TWVtb3J5XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRldmljZUNvaGVyZW50TWVtb3J5KCBkZXZpY2VDb2hlcmVudE1lbW9yeV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQoIFZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgJiBzZXREZXZpY2VDb2hlcmVudE1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXZpY2VDb2hlcmVudE1lbW9yeV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGV2aWNlQ29oZXJlbnRNZW1vcnkgPSBkZXZpY2VDb2hlcmVudE1lbW9yeV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkZXZpY2VDb2hlcmVudE1lbW9yeSA9PSByaHMuZGV2aWNlQ29oZXJlbnRNZW1vcnkgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGV2aWNlQ29oZXJlbnRNZW1vcnk7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkcyggY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzXyApCisgICAgICAsIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXIoIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXJfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKCBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WICYgc2V0Q29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzID0gY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgJiBzZXRDb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXIgPSBjb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkcyA9PSByaHMuY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzICkKKyAgICAgICAgICAmJiAoIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXIgPT0gcmhzLmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXIgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29tcHV0ZURlcml2YXRpdmVHcm91cExpbmVhcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29uZGl0aW9uYWxSZW5kZXJpbmdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgaW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmdfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogY29uZGl0aW9uYWxSZW5kZXJpbmcoIGNvbmRpdGlvbmFsUmVuZGVyaW5nXyApCisgICAgICAsIGluaGVyaXRlZENvbmRpdGlvbmFsUmVuZGVyaW5nKCBpbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZ18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgJiBzZXRDb25kaXRpb25hbFJlbmRlcmluZyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb25kaXRpb25hbFJlbmRlcmluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29uZGl0aW9uYWxSZW5kZXJpbmcgPSBjb25kaXRpb25hbFJlbmRlcmluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUICYgc2V0SW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgaW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGluaGVyaXRlZENvbmRpdGlvbmFsUmVuZGVyaW5nID0gaW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggY29uZGl0aW9uYWxSZW5kZXJpbmcgPT0gcmhzLmNvbmRpdGlvbmFsUmVuZGVyaW5nICkKKyAgICAgICAgICAmJiAoIGluaGVyaXRlZENvbmRpdGlvbmFsUmVuZGVyaW5nID09IHJocy5pbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb25kaXRpb25hbFJlbmRlcmluZzsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGluaGVyaXRlZENvbmRpdGlvbmFsUmVuZGVyaW5nOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKCBmbG9hdCBwcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplR3JhbnVsYXJpdHlfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHByaW1pdGl2ZVVuZGVyZXN0aW1hdGlvbl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29uc2VydmF0aXZlUG9pbnRBbmRMaW5lUmFzdGVyaXphdGlvbl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSggcHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplXyApCisgICAgICAsIG1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplKCBtYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZV8gKQorICAgICAgLCBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5KCBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5XyApCisgICAgICAsIHByaW1pdGl2ZVVuZGVyZXN0aW1hdGlvbiggcHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uXyApCisgICAgICAsIGNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb24oIGNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb25fICkKKyAgICAgICwgZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQoIGRlZ2VuZXJhdGVUcmlhbmdsZXNSYXN0ZXJpemVkXyApCisgICAgICAsIGRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQoIGRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWRfICkKKyAgICAgICwgZnVsbHlDb3ZlcmVkRnJhZ21lbnRTaGFkZXJJbnB1dFZhcmlhYmxlKCBmdWxseUNvdmVyZWRGcmFnbWVudFNoYWRlcklucHV0VmFyaWFibGVfICkKKyAgICAgICwgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlKCBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUG9zdERlcHRoQ292ZXJhZ2VfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemUgPT0gcmhzLnByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSApCisgICAgICAgICAgJiYgKCBtYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSA9PSByaHMubWF4RXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemUgKQorICAgICAgICAgICYmICggZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemVHcmFudWxhcml0eSA9PSByaHMuZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemVHcmFudWxhcml0eSApCisgICAgICAgICAgJiYgKCBwcmltaXRpdmVVbmRlcmVzdGltYXRpb24gPT0gcmhzLnByaW1pdGl2ZVVuZGVyZXN0aW1hdGlvbiApCisgICAgICAgICAgJiYgKCBjb25zZXJ2YXRpdmVQb2ludEFuZExpbmVSYXN0ZXJpemF0aW9uID09IHJocy5jb25zZXJ2YXRpdmVQb2ludEFuZExpbmVSYXN0ZXJpemF0aW9uICkKKyAgICAgICAgICAmJiAoIGRlZ2VuZXJhdGVUcmlhbmdsZXNSYXN0ZXJpemVkID09IHJocy5kZWdlbmVyYXRlVHJpYW5nbGVzUmFzdGVyaXplZCApCisgICAgICAgICAgJiYgKCBkZWdlbmVyYXRlTGluZXNSYXN0ZXJpemVkID09IHJocy5kZWdlbmVyYXRlTGluZXNSYXN0ZXJpemVkICkKKyAgICAgICAgICAmJiAoIGZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZSA9PSByaHMuZnVsbHlDb3ZlcmVkRnJhZ21lbnRTaGFkZXJJbnB1dFZhcmlhYmxlICkKKyAgICAgICAgICAmJiAoIGNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qb3N0RGVwdGhDb3ZlcmFnZSA9PSByaHMuY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIGZsb2F0IHByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKKyAgICBmbG9hdCBtYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKKyAgICBmbG9hdCBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29uc2VydmF0aXZlUG9pbnRBbmRMaW5lUmFzdGVyaXphdGlvbjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlZ2VuZXJhdGVUcmlhbmdsZXNSYXN0ZXJpemVkOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVnZW5lcmF0ZUxpbmVzUmFzdGVyaXplZDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qb3N0RGVwdGhDb3ZlcmFnZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvb3BlcmF0aXZlTWF0cml4XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3NfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogY29vcGVyYXRpdmVNYXRyaXgoIGNvb3BlcmF0aXZlTWF0cml4XyApCisgICAgICAsIGNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzKCBjb29wZXJhdGl2ZU1hdHJpeFJvYnVzdEJ1ZmZlckFjY2Vzc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WKCBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WICYgc2V0Q29vcGVyYXRpdmVNYXRyaXgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29vcGVyYXRpdmVNYXRyaXhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvb3BlcmF0aXZlTWF0cml4ID0gY29vcGVyYXRpdmVNYXRyaXhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WICYgc2V0Q29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzID0gY29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGNvb3BlcmF0aXZlTWF0cml4ID09IHJocy5jb29wZXJhdGl2ZU1hdHJpeCApCisgICAgICAgICAgJiYgKCBjb29wZXJhdGl2ZU1hdHJpeFJvYnVzdEJ1ZmZlckFjY2VzcyA9PSByaHMuY29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvb3BlcmF0aXZlTWF0cml4OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzIGNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzKCBjb29wZXJhdGl2ZU1hdHJpeFN1cHBvcnRlZFN0YWdlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViggVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzID09IHJocy5jb29wZXJhdGl2ZU1hdHJpeFN1cHBvcnRlZFN0YWdlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBjb29wZXJhdGl2ZU1hdHJpeFN1cHBvcnRlZFN0YWdlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29ybmVyU2FtcGxlZEltYWdlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGNvcm5lclNhbXBsZWRJbWFnZSggY29ybmVyU2FtcGxlZEltYWdlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViggVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViAmIHNldENvcm5lclNhbXBsZWRJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb3JuZXJTYW1wbGVkSW1hZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvcm5lclNhbXBsZWRJbWFnZSA9IGNvcm5lclNhbXBsZWRJbWFnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBjb3JuZXJTYW1wbGVkSW1hZ2UgPT0gcmhzLmNvcm5lclNhbXBsZWRJbWFnZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb3JuZXJTYW1wbGVkSW1hZ2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvdmVyYWdlUmVkdWN0aW9uTW9kZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBjb3ZlcmFnZVJlZHVjdGlvbk1vZGUoIGNvdmVyYWdlUmVkdWN0aW9uTW9kZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYoIFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgJiBzZXRDb3ZlcmFnZVJlZHVjdGlvbk1vZGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb3ZlcmFnZVJlZHVjdGlvbk1vZGUgPSBjb3ZlcmFnZVJlZHVjdGlvbk1vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlID09IHJocy5jb3ZlcmFnZVJlZHVjdGlvbk1vZGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmcoIGRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYoIFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgJiBzZXREZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmcgPSBkZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmcgPT0gcmhzLmRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZzsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aENsaXBFbmFibGVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGVwdGhDbGlwRW5hYmxlKCBkZXB0aENsaXBFbmFibGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgJiBzZXREZXB0aENsaXBFbmFibGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVwdGhDbGlwRW5hYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXB0aENsaXBFbmFibGUgPSBkZXB0aENsaXBFbmFibGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkZXB0aENsaXBFbmFibGUgPT0gcmhzLmRlcHRoQ2xpcEVuYWJsZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlcHRoQ2xpcEVuYWJsZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUgorICB7CisgICAgUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc29sdmVNb2RlRmxhZ3NLSFIgc3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc29sdmVNb2RlRmxhZ3NLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzb2x2ZU1vZGVGbGFnc0tIUiBzdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZXNvbHZlTW9kZUZsYWdzS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbmRlcGVuZGVudFJlc29sdmVOb25lXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbmRlcGVuZGVudFJlc29sdmVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXMoIHN1cHBvcnRlZERlcHRoUmVzb2x2ZU1vZGVzXyApCisgICAgICAsIHN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXMoIHN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXNfICkKKyAgICAgICwgaW5kZXBlbmRlbnRSZXNvbHZlTm9uZSggaW5kZXBlbmRlbnRSZXNvbHZlTm9uZV8gKQorICAgICAgLCBpbmRlcGVuZGVudFJlc29sdmUoIGluZGVwZW5kZW50UmVzb2x2ZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiggVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN1cHBvcnRlZERlcHRoUmVzb2x2ZU1vZGVzID09IHJocy5zdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlcyApCisgICAgICAgICAgJiYgKCBzdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzID09IHJocy5zdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzICkKKyAgICAgICAgICAmJiAoIGluZGVwZW5kZW50UmVzb2x2ZU5vbmUgPT0gcmhzLmluZGVwZW5kZW50UmVzb2x2ZU5vbmUgKQorICAgICAgICAgICYmICggaW5kZXBlbmRlbnRSZXNvbHZlID09IHJocy5pbmRlcGVuZGVudFJlc29sdmUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc29sdmVNb2RlRmxhZ3NLSFIgc3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc29sdmVNb2RlRmxhZ3NLSFIgc3VwcG9ydGVkU3RlbmNpbFJlc29sdmVNb2RlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGluZGVwZW5kZW50UmVzb2x2ZU5vbmU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbmRlcGVuZGVudFJlc29sdmU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcnVudGltZURlc2NyaXB0b3JBcnJheV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyggc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmdfICkKKyAgICAgICwgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcoIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nXyApCisgICAgICAsIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nKCBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ18gKQorICAgICAgLCBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcoIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ18gKQorICAgICAgLCBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyggc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdfICkKKyAgICAgICwgc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKCBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdfICkKKyAgICAgICwgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcoIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXyApCisgICAgICAsIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKCBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZ18gKQorICAgICAgLCBzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyggc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdfICkKKyAgICAgICwgc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcoIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXyApCisgICAgICAsIGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCggZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kXyApCisgICAgICAsIGRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kKCBkZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZF8gKQorICAgICAgLCBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZCggZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmRfICkKKyAgICAgICwgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKCBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmRfICkKKyAgICAgICwgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQoIGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kXyApCisgICAgICAsIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKCBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZF8gKQorICAgICAgLCBkZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZyggZGVzY3JpcHRvckJpbmRpbmdVcGRhdGVVbnVzZWRXaGlsZVBlbmRpbmdfICkKKyAgICAgICwgZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZCggZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZF8gKQorICAgICAgLCBkZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50KCBkZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50XyApCisgICAgICAsIHJ1bnRpbWVEZXNjcmlwdG9yQXJyYXkoIHJ1bnRpbWVEZXNjcmlwdG9yQXJyYXlfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBzZXRTaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmcgPSBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAmIHNldFNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyA9IHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUICYgc2V0U2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nID0gc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBzZXRTaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBzZXRTaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAmIHNldFNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAmIHNldFNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUICYgc2V0U2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBzZXRTaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAmIHNldFNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUICYgc2V0RGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUICYgc2V0RGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kID0gZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBzZXREZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmQgPSBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAmIHNldERlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAmIHNldERlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUICYgc2V0RGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBzZXREZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVzY3JpcHRvckJpbmRpbmdVcGRhdGVVbnVzZWRXaGlsZVBlbmRpbmcgPSBkZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAmIHNldERlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZCA9IGRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJiBzZXREZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQgPSBkZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUICYgc2V0UnVudGltZURlc2NyaXB0b3JBcnJheSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBydW50aW1lRGVzY3JpcHRvckFycmF5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBydW50aW1lRGVzY3JpcHRvckFycmF5ID0gcnVudGltZURlc2NyaXB0b3JBcnJheV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nID09IHJocy5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyApCisgICAgICAgICAgJiYgKCBzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyA9PSByaHMuc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcgKQorICAgICAgICAgICYmICggc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcgPT0gcmhzLnNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nICkKKyAgICAgICAgICAmJiAoIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyA9PSByaHMuc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nICkKKyAgICAgICAgICAmJiAoIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID09IHJocy5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyApCisgICAgICAgICAgJiYgKCBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPT0gcmhzLnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyApCisgICAgICAgICAgJiYgKCBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyA9PSByaHMuc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgKQorICAgICAgICAgICYmICggc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPT0gcmhzLnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nICkKKyAgICAgICAgICAmJiAoIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID09IHJocy5zaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyApCisgICAgICAgICAgJiYgKCBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyA9PSByaHMuc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgKQorICAgICAgICAgICYmICggZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID09IHJocy5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQgKQorICAgICAgICAgICYmICggZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQgPT0gcmhzLmRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kID09IHJocy5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZCApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQgPT0gcmhzLmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9PSByaHMuZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQgKQorICAgICAgICAgICYmICggZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQgPT0gcmhzLmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nID09IHJocy5kZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZyApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kID09IHJocy5kZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQgPT0gcmhzLmRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQgKQorICAgICAgICAgICYmICggcnVudGltZURlc2NyaXB0b3JBcnJheSA9PSByaHMucnVudGltZURlc2NyaXB0b3JBcnJheSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBydW50aW1lRGVzY3JpcHRvckFycmF5OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCggdWludDMyX3QgbWF4VXBkYXRlQWZ0ZXJCaW5kRGVzY3JpcHRvcnNJbkFsbFBvb2xzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcm9idXN0QnVmZmVyQWNjZXNzVXBkYXRlQWZ0ZXJCaW5kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHF1YWREaXZlcmdlbnRJbXBsaWNpdExvZF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VVcGRhdGVBZnRlckJpbmRSZXNvdXJjZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVyc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWF4VXBkYXRlQWZ0ZXJCaW5kRGVzY3JpcHRvcnNJbkFsbFBvb2xzKCBtYXhVcGRhdGVBZnRlckJpbmREZXNjcmlwdG9yc0luQWxsUG9vbHNfICkKKyAgICAgICwgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlKCBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmVfICkKKyAgICAgICwgc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUoIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlXyApCisgICAgICAsIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSggc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlXyApCisgICAgICAsIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlKCBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZV8gKQorICAgICAgLCBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSggc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmVfICkKKyAgICAgICwgcm9idXN0QnVmZmVyQWNjZXNzVXBkYXRlQWZ0ZXJCaW5kKCByb2J1c3RCdWZmZXJBY2Nlc3NVcGRhdGVBZnRlckJpbmRfICkKKyAgICAgICwgcXVhZERpdmVyZ2VudEltcGxpY2l0TG9kKCBxdWFkRGl2ZXJnZW50SW1wbGljaXRMb2RfICkKKyAgICAgICwgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMoIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzXyApCisgICAgICAsIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyc18gKQorICAgICAgLCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNfICkKKyAgICAgICwgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlcyggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlc18gKQorICAgICAgLCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzXyApCisgICAgICAsIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMoIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHNfICkKKyAgICAgICwgbWF4UGVyU3RhZ2VVcGRhdGVBZnRlckJpbmRSZXNvdXJjZXMoIG1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzXyApCisgICAgICAsIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVycyggbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzXyApCisgICAgICAsIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycyggbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzXyApCisgICAgICAsIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyc0R5bmFtaWMoIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyc0R5bmFtaWNfICkKKyAgICAgICwgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzKCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNfICkKKyAgICAgICwgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzRHluYW1pYyggbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzRHluYW1pY18gKQorICAgICAgLCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlcyggbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXNfICkKKyAgICAgICwgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMoIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzXyApCisgICAgICAsIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzKCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtYXhVcGRhdGVBZnRlckJpbmREZXNjcmlwdG9yc0luQWxsUG9vbHMgPT0gcmhzLm1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29scyApCisgICAgICAgICAgJiYgKCBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPT0gcmhzLnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSApCisgICAgICAgICAgJiYgKCBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9PSByaHMuc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgKQorICAgICAgICAgICYmICggc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID09IHJocy5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgKQorICAgICAgICAgICYmICggc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPT0gcmhzLnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlICkKKyAgICAgICAgICAmJiAoIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID09IHJocy5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSApCisgICAgICAgICAgJiYgKCByb2J1c3RCdWZmZXJBY2Nlc3NVcGRhdGVBZnRlckJpbmQgPT0gcmhzLnJvYnVzdEJ1ZmZlckFjY2Vzc1VwZGF0ZUFmdGVyQmluZCApCisgICAgICAgICAgJiYgKCBxdWFkRGl2ZXJnZW50SW1wbGljaXRMb2QgPT0gcmhzLnF1YWREaXZlcmdlbnRJbXBsaWNpdExvZCApCisgICAgICAgICAgJiYgKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVycyA9PSByaHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMgKQorICAgICAgICAgICYmICggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMgPT0gcmhzLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzICkKKyAgICAgICAgICAmJiAoIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzID09IHJocy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyApCisgICAgICAgICAgJiYgKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzID09IHJocy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzICkKKyAgICAgICAgICAmJiAoIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMgPT0gcmhzLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMgKQorICAgICAgICAgICYmICggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyA9PSByaHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBtYXhQZXJTdGFnZVVwZGF0ZUFmdGVyQmluZFJlc291cmNlcyA9PSByaHMubWF4UGVyU3RhZ2VVcGRhdGVBZnRlckJpbmRSZXNvdXJjZXMgKQorICAgICAgICAgICYmICggbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzID09IHJocy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMgKQorICAgICAgICAgICYmICggbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzID09IHJocy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMgKQorICAgICAgICAgICYmICggbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzRHluYW1pYyA9PSByaHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzRHluYW1pYyApCisgICAgICAgICAgJiYgKCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMgPT0gcmhzLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyApCisgICAgICAgICAgJiYgKCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljID09IHJocy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljICkKKyAgICAgICAgICAmJiAoIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzID09IHJocy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlcyApCisgICAgICAgICAgJiYgKCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyA9PSByaHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMgKQorICAgICAgICAgICYmICggbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMgPT0gcmhzLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBtYXhVcGRhdGVBZnRlckJpbmREZXNjcmlwdG9yc0luQWxsUG9vbHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByb2J1c3RCdWZmZXJBY2Nlc3NVcGRhdGVBZnRlckJpbmQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBxdWFkRGl2ZXJnZW50SW1wbGljaXRMb2Q7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlczsKKyAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzOworICAgIHVpbnQzMl90IG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VVcGRhdGVBZnRlckJpbmRSZXNvdXJjZXM7CisgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyczsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUKCB1aW50MzJfdCBtYXhEaXNjYXJkUmVjdGFuZ2xlc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXhEaXNjYXJkUmVjdGFuZ2xlcyggbWF4RGlzY2FyZFJlY3RhbmdsZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtYXhEaXNjYXJkUmVjdGFuZ2xlcyA9PSByaHMubWF4RGlzY2FyZFJlY3RhbmdsZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWF4RGlzY2FyZFJlY3RhbmdsZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUgorICB7CisgICAgUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RHJpdmVySWRLSFIgZHJpdmVySURfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRyaXZlcklkS0hSOjplQW1kUHJvcHJpZXRhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGNoYXIsVktfTUFYX0RSSVZFUl9OQU1FX1NJWkVfS0hSPiBjb25zdCYgZHJpdmVyTmFtZV8gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGNoYXIsVktfTUFYX0RSSVZFUl9JTkZPX1NJWkVfS0hSPiBjb25zdCYgZHJpdmVySW5mb18gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uZm9ybWFuY2VWZXJzaW9uS0hSIGNvbmZvcm1hbmNlVmVyc2lvbl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uZm9ybWFuY2VWZXJzaW9uS0hSKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRyaXZlcklEKCBkcml2ZXJJRF8gKQorICAgICAgLCBkcml2ZXJOYW1le30KKyAgICAgICwgZHJpdmVySW5mb3t9CisgICAgICAsIGNvbmZvcm1hbmNlVmVyc2lvbiggY29uZm9ybWFuY2VWZXJzaW9uXyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxjaGFyLFZLX01BWF9EUklWRVJfTkFNRV9TSVpFX0tIUixWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFI+Ojpjb3B5KCBkcml2ZXJOYW1lLCBkcml2ZXJOYW1lXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxjaGFyLFZLX01BWF9EUklWRVJfSU5GT19TSVpFX0tIUixWS19NQVhfRFJJVkVSX0lORk9fU0laRV9LSFI+Ojpjb3B5KCBkcml2ZXJJbmZvLCBkcml2ZXJJbmZvXyApOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiggVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRyaXZlcklEID09IHJocy5kcml2ZXJJRCApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGRyaXZlck5hbWUsIHJocy5kcml2ZXJOYW1lLCBWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFIgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtY21wKCBkcml2ZXJJbmZvLCByaHMuZHJpdmVySW5mbywgVktfTUFYX0RSSVZFUl9JTkZPX1NJWkVfS0hSICogc2l6ZW9mKCBjaGFyICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIGNvbmZvcm1hbmNlVmVyc2lvbiA9PSByaHMuY29uZm9ybWFuY2VWZXJzaW9uICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RHJpdmVySWRLSFIgZHJpdmVySUQ7CisgICAgY2hhciBkcml2ZXJOYW1lW1ZLX01BWF9EUklWRVJfTkFNRV9TSVpFX0tIUl07CisgICAgY2hhciBkcml2ZXJJbmZvW1ZLX01BWF9EUklWRVJfSU5GT19TSVpFX0tIUl07CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbmZvcm1hbmNlVmVyc2lvbktIUiBjb25mb3JtYW5jZVZlcnNpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZXhjbHVzaXZlU2Npc3Nvcl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBleGNsdXNpdmVTY2lzc29yKCBleGNsdXNpdmVTY2lzc29yXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKCBWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WICYgc2V0RXhjbHVzaXZlU2Npc3NvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBleGNsdXNpdmVTY2lzc29yXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBleGNsdXNpdmVTY2lzc29yID0gZXhjbHVzaXZlU2Npc3Nvcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGV4Y2x1c2l2ZVNjaXNzb3IgPT0gcmhzLmV4Y2x1c2l2ZVNjaXNzb3IgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBleGNsdXNpdmVTY2lzc29yOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclVzYWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlRmQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCB1c2FnZSggdXNhZ2VfICkKKyAgICAgICwgaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gJiBzZXRVc2FnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHVzYWdlID0gdXNhZ2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvICYgc2V0SGFuZGxlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGUgPSBoYW5kbGVUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggdXNhZ2UgPT0gcmhzLnVzYWdlICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGUgPT0gcmhzLmhhbmRsZVR5cGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyggVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8mIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyAmIHNldEhhbmRsZVR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGUgPSBoYW5kbGVUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZSA9PSByaHMuaGFuZGxlVHlwZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyggVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8mIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyAmIHNldEhhbmRsZVR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBoYW5kbGVUeXBlID0gaGFuZGxlVHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGUgPT0gcmhzLmhhbmRsZVR5cGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVAorICB7CisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtaW5JbXBvcnRlZEhvc3RQb2ludGVyQWxpZ25tZW50XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQoIG1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudCA9PSByaHMubWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM6OmVPcGFxdWVGZCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaGFuZGxlVHlwZSggaGFuZGxlVHlwZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvICYgc2V0SGFuZGxlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGUgPSBoYW5kbGVUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBoYW5kbGVUeXBlID09IHJocy5oYW5kbGVUeXBlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZUZlYXR1cmVzMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdHVyZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmVhdHVyZXMoIGZlYXR1cmVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzMiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzMiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlczImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzMiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZlYXR1cmVzMiAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgJiBzZXRGZWF0dXJlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdHVyZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZlYXR1cmVzID0gZmVhdHVyZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZlYXR1cmVzID09IHJocy5mZWF0dXJlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzIGZlYXR1cmVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSCisgIHsKKyAgICBQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUiBkZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUjo6ZTMyQml0T25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUiByb3VuZGluZ01vZGVJbmRlcGVuZGVuY2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFI6OmUzMkJpdE9ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDMyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDY0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTZfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDY0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTZfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDY0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDMyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDY0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDMyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDY0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRlbm9ybUJlaGF2aW9ySW5kZXBlbmRlbmNlKCBkZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZV8gKQorICAgICAgLCByb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UoIHJvdW5kaW5nTW9kZUluZGVwZW5kZW5jZV8gKQorICAgICAgLCBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2KCBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2XyApCisgICAgICAsIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzIoIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzJfICkKKyAgICAgICwgc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NCggc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NF8gKQorICAgICAgLCBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTYoIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQxNl8gKQorICAgICAgLCBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MzIoIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMl8gKQorICAgICAgLCBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0NjQoIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQ2NF8gKQorICAgICAgLCBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTYoIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQxNl8gKQorICAgICAgLCBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MzIoIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMl8gKQorICAgICAgLCBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0NjQoIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQ2NF8gKQorICAgICAgLCBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2KCBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2XyApCisgICAgICAsIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzIoIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzJfICkKKyAgICAgICwgc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NCggc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NF8gKQorICAgICAgLCBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2KCBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2XyApCisgICAgICAsIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzIoIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzJfICkKKyAgICAgICwgc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NCggc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiggVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRlbm9ybUJlaGF2aW9ySW5kZXBlbmRlbmNlID09IHJocy5kZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZSApCisgICAgICAgICAgJiYgKCByb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UgPT0gcmhzLnJvdW5kaW5nTW9kZUluZGVwZW5kZW5jZSApCisgICAgICAgICAgJiYgKCBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2ID09IHJocy5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2ICkKKyAgICAgICAgICAmJiAoIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzIgPT0gcmhzLnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzIgKQorICAgICAgICAgICYmICggc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NCA9PSByaHMuc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NCApCisgICAgICAgICAgJiYgKCBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTYgPT0gcmhzLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQxNiApCisgICAgICAgICAgJiYgKCBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MzIgPT0gcmhzLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMiApCisgICAgICAgICAgJiYgKCBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0NjQgPT0gcmhzLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQ2NCApCisgICAgICAgICAgJiYgKCBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTYgPT0gcmhzLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQxNiApCisgICAgICAgICAgJiYgKCBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MzIgPT0gcmhzLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMiApCisgICAgICAgICAgJiYgKCBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0NjQgPT0gcmhzLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQ2NCApCisgICAgICAgICAgJiYgKCBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2ID09IHJocy5zaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2ICkKKyAgICAgICAgICAmJiAoIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzIgPT0gcmhzLnNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzIgKQorICAgICAgICAgICYmICggc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NCA9PSByaHMuc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NCApCisgICAgICAgICAgJiYgKCBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2ID09IHJocy5zaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2ICkKKyAgICAgICAgICAmJiAoIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzIgPT0gcmhzLnNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzIgKQorICAgICAgICAgICYmICggc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NCA9PSByaHMuc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUiBkZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUiByb3VuZGluZ01vZGVJbmRlcGVuZGVuY2U7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQzMjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0NjQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTY7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MzI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0NjQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTY7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MzI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0NjQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQzMjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0NjQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQzMjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0NjQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnREZW5zaXR5TWFwXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmcmFnbWVudERlbnNpdHlNYXBEeW5hbWljXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmcmFnbWVudERlbnNpdHlNYXBOb25TdWJzYW1wbGVkSW1hZ2VzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZyYWdtZW50RGVuc2l0eU1hcCggZnJhZ21lbnREZW5zaXR5TWFwXyApCisgICAgICAsIGZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWMoIGZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWNfICkKKyAgICAgICwgZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlcyggZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCggVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZyYWdtZW50RGVuc2l0eU1hcCA9PSByaHMuZnJhZ21lbnREZW5zaXR5TWFwICkKKyAgICAgICAgICAmJiAoIGZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWMgPT0gcmhzLmZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWMgKQorICAgICAgICAgICYmICggZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlcyA9PSByaHMuZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZyYWdtZW50RGVuc2l0eU1hcDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmcmFnbWVudERlbnNpdHlNYXBOb25TdWJzYW1wbGVkSW1hZ2VzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIG1pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSggbWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplXyApCisgICAgICAsIG1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSggbWF4RnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplXyApCisgICAgICAsIGZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zKCBmcmFnbWVudERlbnNpdHlJbnZvY2F0aW9uc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtaW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemUgPT0gcmhzLm1pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSApCisgICAgICAgICAgJiYgKCBtYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemUgPT0gcmhzLm1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSApCisgICAgICAgICAgJiYgKCBmcmFnbWVudERlbnNpdHlJbnZvY2F0aW9ucyA9PSByaHMuZnJhZ21lbnREZW5zaXR5SW52b2NhdGlvbnMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtaW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIG1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyggZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViggVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViAmIHNldEZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyA9IGZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmcmFnbWVudFNoYWRlckJhcnljZW50cmljID09IHJocy5mcmFnbWVudFNoYWRlckJhcnljZW50cmljICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYzsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2tfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9ja18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrKCBmcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9ja18gKQorICAgICAgLCBmcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrKCBmcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrXyApCisgICAgICAsIGZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2soIGZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2tfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUICYgc2V0RnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrID0gZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCAmIHNldEZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9ja18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9jayA9IGZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCAmIHNldEZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9ja18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jayA9IGZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2sgPT0gcmhzLmZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrICkKKyAgICAgICAgICAmJiAoIGZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2sgPT0gcmhzLmZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2sgKQorICAgICAgICAgICYmICggZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jayA9PSByaHMuZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jayApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jazsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcworICB7CisgICAgUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMoIHVpbnQzMl90IHBoeXNpY2FsRGV2aWNlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UsVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFPiBjb25zdCYgcGh5c2ljYWxEZXZpY2VzXyA9IHsgeyBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UoKSB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3Vic2V0QWxsb2NhdGlvbl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwaHlzaWNhbERldmljZUNvdW50KCBwaHlzaWNhbERldmljZUNvdW50XyApCisgICAgICAsIHBoeXNpY2FsRGV2aWNlc3t9CisgICAgICAsIHN1YnNldEFsbG9jYXRpb24oIHN1YnNldEFsbG9jYXRpb25fICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZSxWS19NQVhfREVWSUNFX0dST1VQX1NJWkUsVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFPjo6Y29weSggcGh5c2ljYWxEZXZpY2VzLCBwaHlzaWNhbERldmljZXNfICk7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHBoeXNpY2FsRGV2aWNlQ291bnQgPT0gcmhzLnBoeXNpY2FsRGV2aWNlQ291bnQgKQorICAgICAgICAgICYmICggbWVtY21wKCBwaHlzaWNhbERldmljZXMsIHJocy5waHlzaWNhbERldmljZXMsIFZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRSAqIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIHN1YnNldEFsbG9jYXRpb24gPT0gcmhzLnN1YnNldEFsbG9jYXRpb24gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBwaHlzaWNhbERldmljZUNvdW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZXNbVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFXTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN1YnNldEFsbG9jYXRpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGhvc3RRdWVyeVJlc2V0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGhvc3RRdWVyeVJlc2V0KCBob3N0UXVlcnlSZXNldF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgJiBzZXRIb3N0UXVlcnlSZXNldCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBob3N0UXVlcnlSZXNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaG9zdFF1ZXJ5UmVzZXQgPSBob3N0UXVlcnlSZXNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBob3N0UXVlcnlSZXNldCA9PSByaHMuaG9zdFF1ZXJ5UmVzZXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgaG9zdFF1ZXJ5UmVzZXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzCisgIHsKKyAgICBQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyggc3RkOjphcnJheTx1aW50OF90LFZLX1VVSURfU0laRT4gY29uc3QmIGRldmljZVVVSURfID0geyB7IDAgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsVktfVVVJRF9TSVpFPiBjb25zdCYgZHJpdmVyVVVJRF8gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCxWS19MVUlEX1NJWkU+IGNvbnN0JiBkZXZpY2VMVUlEXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlTm9kZU1hc2tfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXZpY2VMVUlEVmFsaWRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGV2aWNlVVVJRHt9CisgICAgICAsIGRyaXZlclVVSUR7fQorICAgICAgLCBkZXZpY2VMVUlEe30KKyAgICAgICwgZGV2aWNlTm9kZU1hc2soIGRldmljZU5vZGVNYXNrXyApCisgICAgICAsIGRldmljZUxVSURWYWxpZCggZGV2aWNlTFVJRFZhbGlkXyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTx1aW50OF90LFZLX1VVSURfU0laRSxWS19VVUlEX1NJWkU+Ojpjb3B5KCBkZXZpY2VVVUlELCBkZXZpY2VVVUlEXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTx1aW50OF90LFZLX1VVSURfU0laRSxWS19VVUlEX1NJWkU+Ojpjb3B5KCBkcml2ZXJVVUlELCBkcml2ZXJVVUlEXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTx1aW50OF90LFZLX0xVSURfU0laRSxWS19MVUlEX1NJWkU+Ojpjb3B5KCBkZXZpY2VMVUlELCBkZXZpY2VMVUlEXyApOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMoIFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGRldmljZVVVSUQsIHJocy5kZXZpY2VVVUlELCBWS19VVUlEX1NJWkUgKiBzaXplb2YoIHVpbnQ4X3QgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtY21wKCBkcml2ZXJVVUlELCByaHMuZHJpdmVyVVVJRCwgVktfVVVJRF9TSVpFICogc2l6ZW9mKCB1aW50OF90ICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggZGV2aWNlTFVJRCwgcmhzLmRldmljZUxVSUQsIFZLX0xVSURfU0laRSAqIHNpemVvZiggdWludDhfdCApICkgPT0gMCApCisgICAgICAgICAgJiYgKCBkZXZpY2VOb2RlTWFzayA9PSByaHMuZGV2aWNlTm9kZU1hc2sgKQorICAgICAgICAgICYmICggZGV2aWNlTFVJRFZhbGlkID09IHJocy5kZXZpY2VMVUlEVmFsaWQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlSWRQcm9wZXJ0aWVzOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50OF90IGRldmljZVVVSURbVktfVVVJRF9TSVpFXTsKKyAgICB1aW50OF90IGRyaXZlclVVSURbVktfVVVJRF9TSVpFXTsKKyAgICB1aW50OF90IGRldmljZUxVSURbVktfTFVJRF9TSVpFXTsKKyAgICB1aW50MzJfdCBkZXZpY2VOb2RlTWFzazsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRldmljZUxVSURWYWxpZDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZUlEUHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCggdWludDY0X3QgZHJtRm9ybWF0TW9kaWZpZXJfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhcmluZ01vZGUgc2hhcmluZ01vZGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYXJpbmdNb2RlOjplRXhjbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXhDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwUXVldWVGYW1pbHlJbmRpY2VzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRybUZvcm1hdE1vZGlmaWVyKCBkcm1Gb3JtYXRNb2RpZmllcl8gKQorICAgICAgLCBzaGFyaW5nTW9kZSggc2hhcmluZ01vZGVfICkKKyAgICAgICwgcXVldWVGYW1pbHlJbmRleENvdW50KCBxdWV1ZUZhbWlseUluZGV4Q291bnRfICkKKyAgICAgICwgcFF1ZXVlRmFtaWx5SW5kaWNlcyggcFF1ZXVlRmFtaWx5SW5kaWNlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCggVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCAmIHNldERybUZvcm1hdE1vZGlmaWVyKCB1aW50NjRfdCBkcm1Gb3JtYXRNb2RpZmllcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHJtRm9ybWF0TW9kaWZpZXIgPSBkcm1Gb3JtYXRNb2RpZmllcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCAmIHNldFNoYXJpbmdNb2RlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhcmluZ01vZGUgc2hhcmluZ01vZGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYXJpbmdNb2RlID0gc2hhcmluZ01vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgJiBzZXRRdWV1ZUZhbWlseUluZGV4Q291bnQoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXhDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gcXVldWVGYW1pbHlJbmRleENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUICYgc2V0UFF1ZXVlRmFtaWx5SW5kaWNlcyggY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBwUXVldWVGYW1pbHlJbmRpY2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZHJtRm9ybWF0TW9kaWZpZXIgPT0gcmhzLmRybUZvcm1hdE1vZGlmaWVyICkKKyAgICAgICAgICAmJiAoIHNoYXJpbmdNb2RlID09IHJocy5zaGFyaW5nTW9kZSApCisgICAgICAgICAgJiYgKCBxdWV1ZUZhbWlseUluZGV4Q291bnQgPT0gcmhzLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCApCisgICAgICAgICAgJiYgKCBwUXVldWVGYW1pbHlJbmRpY2VzID09IHJocy5wUXVldWVGYW1pbHlJbmRpY2VzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQ2NF90IGRybUZvcm1hdE1vZGlmaWVyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFyaW5nTW9kZSBzaGFyaW5nTW9kZTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0OjplVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVR5cGU6OmUxRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVRpbGluZyB0aWxpbmdfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVGlsaW5nOjplT3B0aW1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgdXNhZ2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZm9ybWF0KCBmb3JtYXRfICkKKyAgICAgICwgdHlwZSggdHlwZV8gKQorICAgICAgLCB0aWxpbmcoIHRpbGluZ18gKQorICAgICAgLCB1c2FnZSggdXNhZ2VfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiggVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAmIHNldEZvcm1hdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZvcm1hdCA9IGZvcm1hdF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yICYgc2V0VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0eXBlID0gdHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yICYgc2V0VGlsaW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0aWxpbmcgPSB0aWxpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAmIHNldFVzYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB1c2FnZSA9IHVzYWdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZm9ybWF0ID09IHJocy5mb3JtYXQgKQorICAgICAgICAgICYmICggdHlwZSA9PSByaHMudHlwZSApCisgICAgICAgICAgJiYgKCB0aWxpbmcgPT0gcmhzLnRpbGluZyApCisgICAgICAgICAgJiYgKCB1c2FnZSA9PSByaHMudXNhZ2UgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUeXBlIHR5cGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVGlsaW5nIHRpbGluZzsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNyZWF0ZUZsYWdzIGZsYWdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdUeXBlIGltYWdlVmlld1R5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld1R5cGU6OmUxRCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaW1hZ2VWaWV3VHlwZSggaW1hZ2VWaWV3VHlwZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUKCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUICYgc2V0SW1hZ2VWaWV3VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlld1R5cGUgaW1hZ2VWaWV3VHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW1hZ2VWaWV3VHlwZSA9IGltYWdlVmlld1R5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGltYWdlVmlld1R5cGUgPT0gcmhzLmltYWdlVmlld1R5cGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3VHlwZSBpbWFnZVZpZXdUeXBlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbWFnZWxlc3NGcmFtZWJ1ZmZlcl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBpbWFnZWxlc3NGcmFtZWJ1ZmZlciggaW1hZ2VsZXNzRnJhbWVidWZmZXJfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSICYgc2V0SW1hZ2VsZXNzRnJhbWVidWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgaW1hZ2VsZXNzRnJhbWVidWZmZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlbGVzc0ZyYW1lYnVmZmVyID0gaW1hZ2VsZXNzRnJhbWVidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaW1hZ2VsZXNzRnJhbWVidWZmZXIgPT0gcmhzLmltYWdlbGVzc0ZyYW1lYnVmZmVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGltYWdlbGVzc0ZyYW1lYnVmZmVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbmRleFR5cGVVaW50OF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBpbmRleFR5cGVVaW50OCggaW5kZXhUeXBlVWludDhfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUICYgc2V0SW5kZXhUeXBlVWludDgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgaW5kZXhUeXBlVWludDhfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGluZGV4VHlwZVVpbnQ4ID0gaW5kZXhUeXBlVWludDhfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaW5kZXhUeXBlVWludDggPT0gcmhzLmluZGV4VHlwZVVpbnQ4ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGluZGV4VHlwZVVpbnQ4OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGlubGluZVVuaWZvcm1CbG9ja18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmRfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogaW5saW5lVW5pZm9ybUJsb2NrKCBpbmxpbmVVbmlmb3JtQmxvY2tfICkKKyAgICAgICwgZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQoIGRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICYgc2V0SW5saW5lVW5pZm9ybUJsb2NrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGlubGluZVVuaWZvcm1CbG9ja18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5saW5lVW5pZm9ybUJsb2NrID0gaW5saW5lVW5pZm9ybUJsb2NrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICYgc2V0RGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kID0gZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBpbmxpbmVVbmlmb3JtQmxvY2sgPT0gcmhzLmlubGluZVVuaWZvcm1CbG9jayApCisgICAgICAgICAgJiYgKCBkZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZCA9PSByaHMuZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbmxpbmVVbmlmb3JtQmxvY2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQoIHVpbnQzMl90IG1heElubGluZVVuaWZvcm1CbG9ja1NpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3NfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3NfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2Nrc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplKCBtYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplXyApCisgICAgICAsIG1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3MoIG1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3NfICkKKyAgICAgICwgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcyggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2Nrc18gKQorICAgICAgLCBtYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrcyggbWF4RGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja3NfICkKKyAgICAgICwgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MoIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCggVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heElubGluZVVuaWZvcm1CbG9ja1NpemUgPT0gcmhzLm1heElubGluZVVuaWZvcm1CbG9ja1NpemUgKQorICAgICAgICAgICYmICggbWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrcyA9PSByaHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrcyApCisgICAgICAgICAgJiYgKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzID09IHJocy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzICkKKyAgICAgICAgICAmJiAoIG1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzID09IHJocy5tYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrcyApCisgICAgICAgICAgJiYgKCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcyA9PSByaHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IG1heElubGluZVVuaWZvcm1CbG9ja1NpemU7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrczsKKyAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZUxpbWl0cworICB7CisgICAgUGh5c2ljYWxEZXZpY2VMaW1pdHMoIHVpbnQzMl90IG1heEltYWdlRGltZW5zaW9uMURfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4SW1hZ2VEaW1lbnNpb24yRF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhJbWFnZURpbWVuc2lvbjNEXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heEltYWdlRGltZW5zaW9uQ3ViZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhJbWFnZUFycmF5TGF5ZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRleGVsQnVmZmVyRWxlbWVudHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VW5pZm9ybUJ1ZmZlclJhbmdlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFN0b3JhZ2VCdWZmZXJSYW5nZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhQdXNoQ29uc3RhbnRzU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhNZW1vcnlBbGxvY2F0aW9uQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlckFsbG9jYXRpb25Db3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBidWZmZXJJbWFnZUdyYW51bGFyaXR5XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNwYXJzZUFkZHJlc3NTcGFjZVNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4Qm91bmREZXNjcmlwdG9yU2V0c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVyc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVyc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVyc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVkSW1hZ2VzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5wdXRBdHRhY2htZW50c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhQZXJTdGFnZVJlc291cmNlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VJbWFnZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFZlcnRleElucHV0QmluZGluZ3NfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VmVydGV4SW5wdXRCaW5kaW5nU3RyaWRlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFZlcnRleE91dHB1dENvbXBvbmVudHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRlc3NlbGxhdGlvblBhdGNoU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJQYXRjaE91dHB1dENvbXBvbmVudHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heEdlb21ldHJ5U2hhZGVySW52b2NhdGlvbnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heEdlb21ldHJ5T3V0cHV0VmVydGljZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhGcmFnbWVudER1YWxTcmNBdHRhY2htZW50c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhGcmFnbWVudENvbWJpbmVkT3V0cHV0UmVzb3VyY2VzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heENvbXB1dGVTaGFyZWRNZW1vcnlTaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDMyX3QsMz4gY29uc3QmIG1heENvbXB1dGVXb3JrR3JvdXBDb3VudF8gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9uc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQzMl90LDM+IGNvbnN0JiBtYXhDb21wdXRlV29ya0dyb3VwU2l6ZV8gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YlBpeGVsUHJlY2lzaW9uQml0c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJUZXhlbFByZWNpc2lvbkJpdHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWlwbWFwUHJlY2lzaW9uQml0c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhEcmF3SW5kZXhlZEluZGV4VmFsdWVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RHJhd0luZGlyZWN0Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4U2FtcGxlckxvZEJpYXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4U2FtcGxlckFuaXNvdHJvcHlfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4Vmlld3BvcnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDMyX3QsMj4gY29uc3QmIG1heFZpZXdwb3J0RGltZW5zaW9uc18gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8ZmxvYXQsMj4gY29uc3QmIHZpZXdwb3J0Qm91bmRzUmFuZ2VfID0geyB7IDAgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2aWV3cG9ydFN1YlBpeGVsQml0c18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWluTWVtb3J5TWFwQWxpZ25tZW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pblRleGVsT2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRleGVsT2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluVGV4ZWxHYXRoZXJPZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VGV4ZWxHYXRoZXJPZmZzZXRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWluSW50ZXJwb2xhdGlvbk9mZnNldF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhJbnRlcnBvbGF0aW9uT2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YlBpeGVsSW50ZXJwb2xhdGlvbk9mZnNldEJpdHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RnJhbWVidWZmZXJXaWR0aF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhGcmFtZWJ1ZmZlckhlaWdodF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhGcmFtZWJ1ZmZlckxheWVyc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBmcmFtZWJ1ZmZlckNvbG9yU2FtcGxlQ291bnRzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzIGZyYW1lYnVmZmVyRGVwdGhTYW1wbGVDb3VudHNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MgZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzIGZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50c18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhDb2xvckF0dGFjaG1lbnRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzIHNhbXBsZWRJbWFnZUNvbG9yU2FtcGxlQ291bnRzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzIHNhbXBsZWRJbWFnZUludGVnZXJTYW1wbGVDb3VudHNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3Mgc2FtcGxlZEltYWdlRGVwdGhTYW1wbGVDb3VudHNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3Mgc2FtcGxlZEltYWdlU3RlbmNpbFNhbXBsZUNvdW50c18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBzdG9yYWdlSW1hZ2VTYW1wbGVDb3VudHNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlTWFza1dvcmRzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRpbWVzdGFtcFBlcmlvZF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhDbGlwRGlzdGFuY2VzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heEN1bGxEaXN0YW5jZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaXNjcmV0ZVF1ZXVlUHJpb3JpdGllc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGZsb2F0LDI+IGNvbnN0JiBwb2ludFNpemVSYW5nZV8gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8ZmxvYXQsMj4gY29uc3QmIGxpbmVXaWR0aFJhbmdlXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcG9pbnRTaXplR3JhbnVsYXJpdHlfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGluZVdpZHRoR3JhbnVsYXJpdHlfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdHJpY3RMaW5lc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0YW5kYXJkU2FtcGxlTG9jYXRpb25zXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9wdGltYWxCdWZmZXJDb3B5T2Zmc2V0QWxpZ25tZW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9wdGltYWxCdWZmZXJDb3B5Um93UGl0Y2hBbGlnbm1lbnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbm9uQ29oZXJlbnRBdG9tU2l6ZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXhJbWFnZURpbWVuc2lvbjFEKCBtYXhJbWFnZURpbWVuc2lvbjFEXyApCisgICAgICAsIG1heEltYWdlRGltZW5zaW9uMkQoIG1heEltYWdlRGltZW5zaW9uMkRfICkKKyAgICAgICwgbWF4SW1hZ2VEaW1lbnNpb24zRCggbWF4SW1hZ2VEaW1lbnNpb24zRF8gKQorICAgICAgLCBtYXhJbWFnZURpbWVuc2lvbkN1YmUoIG1heEltYWdlRGltZW5zaW9uQ3ViZV8gKQorICAgICAgLCBtYXhJbWFnZUFycmF5TGF5ZXJzKCBtYXhJbWFnZUFycmF5TGF5ZXJzXyApCisgICAgICAsIG1heFRleGVsQnVmZmVyRWxlbWVudHMoIG1heFRleGVsQnVmZmVyRWxlbWVudHNfICkKKyAgICAgICwgbWF4VW5pZm9ybUJ1ZmZlclJhbmdlKCBtYXhVbmlmb3JtQnVmZmVyUmFuZ2VfICkKKyAgICAgICwgbWF4U3RvcmFnZUJ1ZmZlclJhbmdlKCBtYXhTdG9yYWdlQnVmZmVyUmFuZ2VfICkKKyAgICAgICwgbWF4UHVzaENvbnN0YW50c1NpemUoIG1heFB1c2hDb25zdGFudHNTaXplXyApCisgICAgICAsIG1heE1lbW9yeUFsbG9jYXRpb25Db3VudCggbWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50XyApCisgICAgICAsIG1heFNhbXBsZXJBbGxvY2F0aW9uQ291bnQoIG1heFNhbXBsZXJBbGxvY2F0aW9uQ291bnRfICkKKyAgICAgICwgYnVmZmVySW1hZ2VHcmFudWxhcml0eSggYnVmZmVySW1hZ2VHcmFudWxhcml0eV8gKQorICAgICAgLCBzcGFyc2VBZGRyZXNzU3BhY2VTaXplKCBzcGFyc2VBZGRyZXNzU3BhY2VTaXplXyApCisgICAgICAsIG1heEJvdW5kRGVzY3JpcHRvclNldHMoIG1heEJvdW5kRGVzY3JpcHRvclNldHNfICkKKyAgICAgICwgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnMoIG1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzXyApCisgICAgICAsIG1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVyc18gKQorICAgICAgLCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVycyggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnNfICkKKyAgICAgICwgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlc18gKQorICAgICAgLCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzXyApCisgICAgICAsIG1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMoIG1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHNfICkKKyAgICAgICwgbWF4UGVyU3RhZ2VSZXNvdXJjZXMoIG1heFBlclN0YWdlUmVzb3VyY2VzXyApCisgICAgICAsIG1heERlc2NyaXB0b3JTZXRTYW1wbGVycyggbWF4RGVzY3JpcHRvclNldFNhbXBsZXJzXyApCisgICAgICAsIG1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVycyggbWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzXyApCisgICAgICAsIG1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMoIG1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWNfICkKKyAgICAgICwgbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzKCBtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNfICkKKyAgICAgICwgbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYyggbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pY18gKQorICAgICAgLCBtYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlcyggbWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXNfICkKKyAgICAgICwgbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VJbWFnZXMoIG1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzXyApCisgICAgICAsIG1heERlc2NyaXB0b3JTZXRJbnB1dEF0dGFjaG1lbnRzKCBtYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50c18gKQorICAgICAgLCBtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMoIG1heFZlcnRleElucHV0QXR0cmlidXRlc18gKQorICAgICAgLCBtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzKCBtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzXyApCisgICAgICAsIG1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0KCBtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldF8gKQorICAgICAgLCBtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUoIG1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZV8gKQorICAgICAgLCBtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzKCBtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzXyApCisgICAgICAsIG1heFRlc3NlbGxhdGlvbkdlbmVyYXRpb25MZXZlbCggbWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsXyApCisgICAgICAsIG1heFRlc3NlbGxhdGlvblBhdGNoU2l6ZSggbWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplXyApCisgICAgICAsIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMoIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHNfICkKKyAgICAgICwgbWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMoIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzXyApCisgICAgICAsIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJQYXRjaE91dHB1dENvbXBvbmVudHMoIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJQYXRjaE91dHB1dENvbXBvbmVudHNfICkKKyAgICAgICwgbWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyggbWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50c18gKQorICAgICAgLCBtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzKCBtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzXyApCisgICAgICAsIG1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzKCBtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50c18gKQorICAgICAgLCBtYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zKCBtYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zXyApCisgICAgICAsIG1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzKCBtYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50c18gKQorICAgICAgLCBtYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMoIG1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50c18gKQorICAgICAgLCBtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzKCBtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzXyApCisgICAgICAsIG1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzKCBtYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50c18gKQorICAgICAgLCBtYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyggbWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHNfICkKKyAgICAgICwgbWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50cyggbWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50c18gKQorICAgICAgLCBtYXhGcmFnbWVudER1YWxTcmNBdHRhY2htZW50cyggbWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHNfICkKKyAgICAgICwgbWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlcyggbWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlc18gKQorICAgICAgLCBtYXhDb21wdXRlU2hhcmVkTWVtb3J5U2l6ZSggbWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemVfICkKKyAgICAgICwgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50e30KKyAgICAgICwgbWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zKCBtYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnNfICkKKyAgICAgICwgbWF4Q29tcHV0ZVdvcmtHcm91cFNpemV7fQorICAgICAgLCBzdWJQaXhlbFByZWNpc2lvbkJpdHMoIHN1YlBpeGVsUHJlY2lzaW9uQml0c18gKQorICAgICAgLCBzdWJUZXhlbFByZWNpc2lvbkJpdHMoIHN1YlRleGVsUHJlY2lzaW9uQml0c18gKQorICAgICAgLCBtaXBtYXBQcmVjaXNpb25CaXRzKCBtaXBtYXBQcmVjaXNpb25CaXRzXyApCisgICAgICAsIG1heERyYXdJbmRleGVkSW5kZXhWYWx1ZSggbWF4RHJhd0luZGV4ZWRJbmRleFZhbHVlXyApCisgICAgICAsIG1heERyYXdJbmRpcmVjdENvdW50KCBtYXhEcmF3SW5kaXJlY3RDb3VudF8gKQorICAgICAgLCBtYXhTYW1wbGVyTG9kQmlhcyggbWF4U2FtcGxlckxvZEJpYXNfICkKKyAgICAgICwgbWF4U2FtcGxlckFuaXNvdHJvcHkoIG1heFNhbXBsZXJBbmlzb3Ryb3B5XyApCisgICAgICAsIG1heFZpZXdwb3J0cyggbWF4Vmlld3BvcnRzXyApCisgICAgICAsIG1heFZpZXdwb3J0RGltZW5zaW9uc3t9CisgICAgICAsIHZpZXdwb3J0Qm91bmRzUmFuZ2V7fQorICAgICAgLCB2aWV3cG9ydFN1YlBpeGVsQml0cyggdmlld3BvcnRTdWJQaXhlbEJpdHNfICkKKyAgICAgICwgbWluTWVtb3J5TWFwQWxpZ25tZW50KCBtaW5NZW1vcnlNYXBBbGlnbm1lbnRfICkKKyAgICAgICwgbWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQoIG1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50XyApCisgICAgICAsIG1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQoIG1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnRfICkKKyAgICAgICwgbWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCggbWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudF8gKQorICAgICAgLCBtaW5UZXhlbE9mZnNldCggbWluVGV4ZWxPZmZzZXRfICkKKyAgICAgICwgbWF4VGV4ZWxPZmZzZXQoIG1heFRleGVsT2Zmc2V0XyApCisgICAgICAsIG1pblRleGVsR2F0aGVyT2Zmc2V0KCBtaW5UZXhlbEdhdGhlck9mZnNldF8gKQorICAgICAgLCBtYXhUZXhlbEdhdGhlck9mZnNldCggbWF4VGV4ZWxHYXRoZXJPZmZzZXRfICkKKyAgICAgICwgbWluSW50ZXJwb2xhdGlvbk9mZnNldCggbWluSW50ZXJwb2xhdGlvbk9mZnNldF8gKQorICAgICAgLCBtYXhJbnRlcnBvbGF0aW9uT2Zmc2V0KCBtYXhJbnRlcnBvbGF0aW9uT2Zmc2V0XyApCisgICAgICAsIHN1YlBpeGVsSW50ZXJwb2xhdGlvbk9mZnNldEJpdHMoIHN1YlBpeGVsSW50ZXJwb2xhdGlvbk9mZnNldEJpdHNfICkKKyAgICAgICwgbWF4RnJhbWVidWZmZXJXaWR0aCggbWF4RnJhbWVidWZmZXJXaWR0aF8gKQorICAgICAgLCBtYXhGcmFtZWJ1ZmZlckhlaWdodCggbWF4RnJhbWVidWZmZXJIZWlnaHRfICkKKyAgICAgICwgbWF4RnJhbWVidWZmZXJMYXllcnMoIG1heEZyYW1lYnVmZmVyTGF5ZXJzXyApCisgICAgICAsIGZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHMoIGZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHNfICkKKyAgICAgICwgZnJhbWVidWZmZXJEZXB0aFNhbXBsZUNvdW50cyggZnJhbWVidWZmZXJEZXB0aFNhbXBsZUNvdW50c18gKQorICAgICAgLCBmcmFtZWJ1ZmZlclN0ZW5jaWxTYW1wbGVDb3VudHMoIGZyYW1lYnVmZmVyU3RlbmNpbFNhbXBsZUNvdW50c18gKQorICAgICAgLCBmcmFtZWJ1ZmZlck5vQXR0YWNobWVudHNTYW1wbGVDb3VudHMoIGZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50c18gKQorICAgICAgLCBtYXhDb2xvckF0dGFjaG1lbnRzKCBtYXhDb2xvckF0dGFjaG1lbnRzXyApCisgICAgICAsIHNhbXBsZWRJbWFnZUNvbG9yU2FtcGxlQ291bnRzKCBzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50c18gKQorICAgICAgLCBzYW1wbGVkSW1hZ2VJbnRlZ2VyU2FtcGxlQ291bnRzKCBzYW1wbGVkSW1hZ2VJbnRlZ2VyU2FtcGxlQ291bnRzXyApCisgICAgICAsIHNhbXBsZWRJbWFnZURlcHRoU2FtcGxlQ291bnRzKCBzYW1wbGVkSW1hZ2VEZXB0aFNhbXBsZUNvdW50c18gKQorICAgICAgLCBzYW1wbGVkSW1hZ2VTdGVuY2lsU2FtcGxlQ291bnRzKCBzYW1wbGVkSW1hZ2VTdGVuY2lsU2FtcGxlQ291bnRzXyApCisgICAgICAsIHN0b3JhZ2VJbWFnZVNhbXBsZUNvdW50cyggc3RvcmFnZUltYWdlU2FtcGxlQ291bnRzXyApCisgICAgICAsIG1heFNhbXBsZU1hc2tXb3JkcyggbWF4U2FtcGxlTWFza1dvcmRzXyApCisgICAgICAsIHRpbWVzdGFtcENvbXB1dGVBbmRHcmFwaGljcyggdGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzXyApCisgICAgICAsIHRpbWVzdGFtcFBlcmlvZCggdGltZXN0YW1wUGVyaW9kXyApCisgICAgICAsIG1heENsaXBEaXN0YW5jZXMoIG1heENsaXBEaXN0YW5jZXNfICkKKyAgICAgICwgbWF4Q3VsbERpc3RhbmNlcyggbWF4Q3VsbERpc3RhbmNlc18gKQorICAgICAgLCBtYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzKCBtYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzXyApCisgICAgICAsIGRpc2NyZXRlUXVldWVQcmlvcml0aWVzKCBkaXNjcmV0ZVF1ZXVlUHJpb3JpdGllc18gKQorICAgICAgLCBwb2ludFNpemVSYW5nZXt9CisgICAgICAsIGxpbmVXaWR0aFJhbmdle30KKyAgICAgICwgcG9pbnRTaXplR3JhbnVsYXJpdHkoIHBvaW50U2l6ZUdyYW51bGFyaXR5XyApCisgICAgICAsIGxpbmVXaWR0aEdyYW51bGFyaXR5KCBsaW5lV2lkdGhHcmFudWxhcml0eV8gKQorICAgICAgLCBzdHJpY3RMaW5lcyggc3RyaWN0TGluZXNfICkKKyAgICAgICwgc3RhbmRhcmRTYW1wbGVMb2NhdGlvbnMoIHN0YW5kYXJkU2FtcGxlTG9jYXRpb25zXyApCisgICAgICAsIG9wdGltYWxCdWZmZXJDb3B5T2Zmc2V0QWxpZ25tZW50KCBvcHRpbWFsQnVmZmVyQ29weU9mZnNldEFsaWdubWVudF8gKQorICAgICAgLCBvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50KCBvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50XyApCisgICAgICAsIG5vbkNvaGVyZW50QXRvbVNpemUoIG5vbkNvaGVyZW50QXRvbVNpemVfICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PHVpbnQzMl90LDMsMz46OmNvcHkoIG1heENvbXB1dGVXb3JrR3JvdXBDb3VudCwgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50XyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTx1aW50MzJfdCwzLDM+Ojpjb3B5KCBtYXhDb21wdXRlV29ya0dyb3VwU2l6ZSwgbWF4Q29tcHV0ZVdvcmtHcm91cFNpemVfICk7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PHVpbnQzMl90LDIsMj46OmNvcHkoIG1heFZpZXdwb3J0RGltZW5zaW9ucywgbWF4Vmlld3BvcnREaW1lbnNpb25zXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxmbG9hdCwyLDI+Ojpjb3B5KCB2aWV3cG9ydEJvdW5kc1JhbmdlLCB2aWV3cG9ydEJvdW5kc1JhbmdlXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxmbG9hdCwyLDI+Ojpjb3B5KCBwb2ludFNpemVSYW5nZSwgcG9pbnRTaXplUmFuZ2VfICk7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGZsb2F0LDIsMj46OmNvcHkoIGxpbmVXaWR0aFJhbmdlLCBsaW5lV2lkdGhSYW5nZV8gKTsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUxpbWl0cyggVmtQaHlzaWNhbERldmljZUxpbWl0cyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUxpbWl0cyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTGltaXRzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VMaW1pdHMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBtYXhJbWFnZURpbWVuc2lvbjFEID09IHJocy5tYXhJbWFnZURpbWVuc2lvbjFEICkKKyAgICAgICAgICAmJiAoIG1heEltYWdlRGltZW5zaW9uMkQgPT0gcmhzLm1heEltYWdlRGltZW5zaW9uMkQgKQorICAgICAgICAgICYmICggbWF4SW1hZ2VEaW1lbnNpb24zRCA9PSByaHMubWF4SW1hZ2VEaW1lbnNpb24zRCApCisgICAgICAgICAgJiYgKCBtYXhJbWFnZURpbWVuc2lvbkN1YmUgPT0gcmhzLm1heEltYWdlRGltZW5zaW9uQ3ViZSApCisgICAgICAgICAgJiYgKCBtYXhJbWFnZUFycmF5TGF5ZXJzID09IHJocy5tYXhJbWFnZUFycmF5TGF5ZXJzICkKKyAgICAgICAgICAmJiAoIG1heFRleGVsQnVmZmVyRWxlbWVudHMgPT0gcmhzLm1heFRleGVsQnVmZmVyRWxlbWVudHMgKQorICAgICAgICAgICYmICggbWF4VW5pZm9ybUJ1ZmZlclJhbmdlID09IHJocy5tYXhVbmlmb3JtQnVmZmVyUmFuZ2UgKQorICAgICAgICAgICYmICggbWF4U3RvcmFnZUJ1ZmZlclJhbmdlID09IHJocy5tYXhTdG9yYWdlQnVmZmVyUmFuZ2UgKQorICAgICAgICAgICYmICggbWF4UHVzaENvbnN0YW50c1NpemUgPT0gcmhzLm1heFB1c2hDb25zdGFudHNTaXplICkKKyAgICAgICAgICAmJiAoIG1heE1lbW9yeUFsbG9jYXRpb25Db3VudCA9PSByaHMubWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50ICkKKyAgICAgICAgICAmJiAoIG1heFNhbXBsZXJBbGxvY2F0aW9uQ291bnQgPT0gcmhzLm1heFNhbXBsZXJBbGxvY2F0aW9uQ291bnQgKQorICAgICAgICAgICYmICggYnVmZmVySW1hZ2VHcmFudWxhcml0eSA9PSByaHMuYnVmZmVySW1hZ2VHcmFudWxhcml0eSApCisgICAgICAgICAgJiYgKCBzcGFyc2VBZGRyZXNzU3BhY2VTaXplID09IHJocy5zcGFyc2VBZGRyZXNzU3BhY2VTaXplICkKKyAgICAgICAgICAmJiAoIG1heEJvdW5kRGVzY3JpcHRvclNldHMgPT0gcmhzLm1heEJvdW5kRGVzY3JpcHRvclNldHMgKQorICAgICAgICAgICYmICggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnMgPT0gcmhzLm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzICkKKyAgICAgICAgICAmJiAoIG1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzID09IHJocy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyApCisgICAgICAgICAgJiYgKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVycyA9PSByaHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMgKQorICAgICAgICAgICYmICggbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyA9PSByaHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyApCisgICAgICAgICAgJiYgKCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzID09IHJocy5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzICkKKyAgICAgICAgICAmJiAoIG1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMgPT0gcmhzLm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMgKQorICAgICAgICAgICYmICggbWF4UGVyU3RhZ2VSZXNvdXJjZXMgPT0gcmhzLm1heFBlclN0YWdlUmVzb3VyY2VzICkKKyAgICAgICAgICAmJiAoIG1heERlc2NyaXB0b3JTZXRTYW1wbGVycyA9PSByaHMubWF4RGVzY3JpcHRvclNldFNhbXBsZXJzICkKKyAgICAgICAgICAmJiAoIG1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVycyA9PSByaHMubWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzICkKKyAgICAgICAgICAmJiAoIG1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMgPT0gcmhzLm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMgKQorICAgICAgICAgICYmICggbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzID09IHJocy5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnMgKQorICAgICAgICAgICYmICggbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYyA9PSByaHMubWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYyApCisgICAgICAgICAgJiYgKCBtYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlcyA9PSByaHMubWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMgKQorICAgICAgICAgICYmICggbWF4RGVzY3JpcHRvclNldFN0b3JhZ2VJbWFnZXMgPT0gcmhzLm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzICkKKyAgICAgICAgICAmJiAoIG1heERlc2NyaXB0b3JTZXRJbnB1dEF0dGFjaG1lbnRzID09IHJocy5tYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMgPT0gcmhzLm1heFZlcnRleElucHV0QXR0cmlidXRlcyApCisgICAgICAgICAgJiYgKCBtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzID09IHJocy5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzICkKKyAgICAgICAgICAmJiAoIG1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0ID09IHJocy5tYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldCApCisgICAgICAgICAgJiYgKCBtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUgPT0gcmhzLm1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSApCisgICAgICAgICAgJiYgKCBtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzID09IHJocy5tYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzICkKKyAgICAgICAgICAmJiAoIG1heFRlc3NlbGxhdGlvbkdlbmVyYXRpb25MZXZlbCA9PSByaHMubWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsICkKKyAgICAgICAgICAmJiAoIG1heFRlc3NlbGxhdGlvblBhdGNoU2l6ZSA9PSByaHMubWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplICkKKyAgICAgICAgICAmJiAoIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMgPT0gcmhzLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMgKQorICAgICAgICAgICYmICggbWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMgPT0gcmhzLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzICkKKyAgICAgICAgICAmJiAoIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJQYXRjaE91dHB1dENvbXBvbmVudHMgPT0gcmhzLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJQYXRjaE91dHB1dENvbXBvbmVudHMgKQorICAgICAgICAgICYmICggbWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyA9PSByaHMubWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyApCisgICAgICAgICAgJiYgKCBtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzID09IHJocy5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzICkKKyAgICAgICAgICAmJiAoIG1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzID09IHJocy5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyApCisgICAgICAgICAgJiYgKCBtYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zID09IHJocy5tYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zICkKKyAgICAgICAgICAmJiAoIG1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzID09IHJocy5tYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyApCisgICAgICAgICAgJiYgKCBtYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMgPT0gcmhzLm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyApCisgICAgICAgICAgJiYgKCBtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzID09IHJocy5tYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzICkKKyAgICAgICAgICAmJiAoIG1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzID09IHJocy5tYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cyApCisgICAgICAgICAgJiYgKCBtYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyA9PSByaHMubWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMgKQorICAgICAgICAgICYmICggbWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50cyA9PSByaHMubWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBtYXhGcmFnbWVudER1YWxTcmNBdHRhY2htZW50cyA9PSByaHMubWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHMgKQorICAgICAgICAgICYmICggbWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlcyA9PSByaHMubWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlcyApCisgICAgICAgICAgJiYgKCBtYXhDb21wdXRlU2hhcmVkTWVtb3J5U2l6ZSA9PSByaHMubWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemUgKQorICAgICAgICAgICYmICggbWVtY21wKCBtYXhDb21wdXRlV29ya0dyb3VwQ291bnQsIHJocy5tYXhDb21wdXRlV29ya0dyb3VwQ291bnQsIDMgKiBzaXplb2YoIHVpbnQzMl90ICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIG1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyA9PSByaHMubWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggbWF4Q29tcHV0ZVdvcmtHcm91cFNpemUsIHJocy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZSwgMyAqIHNpemVvZiggdWludDMyX3QgKSApID09IDAgKQorICAgICAgICAgICYmICggc3ViUGl4ZWxQcmVjaXNpb25CaXRzID09IHJocy5zdWJQaXhlbFByZWNpc2lvbkJpdHMgKQorICAgICAgICAgICYmICggc3ViVGV4ZWxQcmVjaXNpb25CaXRzID09IHJocy5zdWJUZXhlbFByZWNpc2lvbkJpdHMgKQorICAgICAgICAgICYmICggbWlwbWFwUHJlY2lzaW9uQml0cyA9PSByaHMubWlwbWFwUHJlY2lzaW9uQml0cyApCisgICAgICAgICAgJiYgKCBtYXhEcmF3SW5kZXhlZEluZGV4VmFsdWUgPT0gcmhzLm1heERyYXdJbmRleGVkSW5kZXhWYWx1ZSApCisgICAgICAgICAgJiYgKCBtYXhEcmF3SW5kaXJlY3RDb3VudCA9PSByaHMubWF4RHJhd0luZGlyZWN0Q291bnQgKQorICAgICAgICAgICYmICggbWF4U2FtcGxlckxvZEJpYXMgPT0gcmhzLm1heFNhbXBsZXJMb2RCaWFzICkKKyAgICAgICAgICAmJiAoIG1heFNhbXBsZXJBbmlzb3Ryb3B5ID09IHJocy5tYXhTYW1wbGVyQW5pc290cm9weSApCisgICAgICAgICAgJiYgKCBtYXhWaWV3cG9ydHMgPT0gcmhzLm1heFZpZXdwb3J0cyApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIG1heFZpZXdwb3J0RGltZW5zaW9ucywgcmhzLm1heFZpZXdwb3J0RGltZW5zaW9ucywgMiAqIHNpemVvZiggdWludDMyX3QgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtY21wKCB2aWV3cG9ydEJvdW5kc1JhbmdlLCByaHMudmlld3BvcnRCb3VuZHNSYW5nZSwgMiAqIHNpemVvZiggZmxvYXQgKSApID09IDAgKQorICAgICAgICAgICYmICggdmlld3BvcnRTdWJQaXhlbEJpdHMgPT0gcmhzLnZpZXdwb3J0U3ViUGl4ZWxCaXRzICkKKyAgICAgICAgICAmJiAoIG1pbk1lbW9yeU1hcEFsaWdubWVudCA9PSByaHMubWluTWVtb3J5TWFwQWxpZ25tZW50ICkKKyAgICAgICAgICAmJiAoIG1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50ID09IHJocy5taW5UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudCApCisgICAgICAgICAgJiYgKCBtaW5Vbmlmb3JtQnVmZmVyT2Zmc2V0QWxpZ25tZW50ID09IHJocy5taW5Vbmlmb3JtQnVmZmVyT2Zmc2V0QWxpZ25tZW50ICkKKyAgICAgICAgICAmJiAoIG1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQgPT0gcmhzLm1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQgKQorICAgICAgICAgICYmICggbWluVGV4ZWxPZmZzZXQgPT0gcmhzLm1pblRleGVsT2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIG1heFRleGVsT2Zmc2V0ID09IHJocy5tYXhUZXhlbE9mZnNldCApCisgICAgICAgICAgJiYgKCBtaW5UZXhlbEdhdGhlck9mZnNldCA9PSByaHMubWluVGV4ZWxHYXRoZXJPZmZzZXQgKQorICAgICAgICAgICYmICggbWF4VGV4ZWxHYXRoZXJPZmZzZXQgPT0gcmhzLm1heFRleGVsR2F0aGVyT2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIG1pbkludGVycG9sYXRpb25PZmZzZXQgPT0gcmhzLm1pbkludGVycG9sYXRpb25PZmZzZXQgKQorICAgICAgICAgICYmICggbWF4SW50ZXJwb2xhdGlvbk9mZnNldCA9PSByaHMubWF4SW50ZXJwb2xhdGlvbk9mZnNldCApCisgICAgICAgICAgJiYgKCBzdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzID09IHJocy5zdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzICkKKyAgICAgICAgICAmJiAoIG1heEZyYW1lYnVmZmVyV2lkdGggPT0gcmhzLm1heEZyYW1lYnVmZmVyV2lkdGggKQorICAgICAgICAgICYmICggbWF4RnJhbWVidWZmZXJIZWlnaHQgPT0gcmhzLm1heEZyYW1lYnVmZmVySGVpZ2h0ICkKKyAgICAgICAgICAmJiAoIG1heEZyYW1lYnVmZmVyTGF5ZXJzID09IHJocy5tYXhGcmFtZWJ1ZmZlckxheWVycyApCisgICAgICAgICAgJiYgKCBmcmFtZWJ1ZmZlckNvbG9yU2FtcGxlQ291bnRzID09IHJocy5mcmFtZWJ1ZmZlckNvbG9yU2FtcGxlQ291bnRzICkKKyAgICAgICAgICAmJiAoIGZyYW1lYnVmZmVyRGVwdGhTYW1wbGVDb3VudHMgPT0gcmhzLmZyYW1lYnVmZmVyRGVwdGhTYW1wbGVDb3VudHMgKQorICAgICAgICAgICYmICggZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzID09IHJocy5mcmFtZWJ1ZmZlclN0ZW5jaWxTYW1wbGVDb3VudHMgKQorICAgICAgICAgICYmICggZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzID09IHJocy5mcmFtZWJ1ZmZlck5vQXR0YWNobWVudHNTYW1wbGVDb3VudHMgKQorICAgICAgICAgICYmICggbWF4Q29sb3JBdHRhY2htZW50cyA9PSByaHMubWF4Q29sb3JBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyA9PSByaHMuc2FtcGxlZEltYWdlQ29sb3JTYW1wbGVDb3VudHMgKQorICAgICAgICAgICYmICggc2FtcGxlZEltYWdlSW50ZWdlclNhbXBsZUNvdW50cyA9PSByaHMuc2FtcGxlZEltYWdlSW50ZWdlclNhbXBsZUNvdW50cyApCisgICAgICAgICAgJiYgKCBzYW1wbGVkSW1hZ2VEZXB0aFNhbXBsZUNvdW50cyA9PSByaHMuc2FtcGxlZEltYWdlRGVwdGhTYW1wbGVDb3VudHMgKQorICAgICAgICAgICYmICggc2FtcGxlZEltYWdlU3RlbmNpbFNhbXBsZUNvdW50cyA9PSByaHMuc2FtcGxlZEltYWdlU3RlbmNpbFNhbXBsZUNvdW50cyApCisgICAgICAgICAgJiYgKCBzdG9yYWdlSW1hZ2VTYW1wbGVDb3VudHMgPT0gcmhzLnN0b3JhZ2VJbWFnZVNhbXBsZUNvdW50cyApCisgICAgICAgICAgJiYgKCBtYXhTYW1wbGVNYXNrV29yZHMgPT0gcmhzLm1heFNhbXBsZU1hc2tXb3JkcyApCisgICAgICAgICAgJiYgKCB0aW1lc3RhbXBDb21wdXRlQW5kR3JhcGhpY3MgPT0gcmhzLnRpbWVzdGFtcENvbXB1dGVBbmRHcmFwaGljcyApCisgICAgICAgICAgJiYgKCB0aW1lc3RhbXBQZXJpb2QgPT0gcmhzLnRpbWVzdGFtcFBlcmlvZCApCisgICAgICAgICAgJiYgKCBtYXhDbGlwRGlzdGFuY2VzID09IHJocy5tYXhDbGlwRGlzdGFuY2VzICkKKyAgICAgICAgICAmJiAoIG1heEN1bGxEaXN0YW5jZXMgPT0gcmhzLm1heEN1bGxEaXN0YW5jZXMgKQorICAgICAgICAgICYmICggbWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlcyA9PSByaHMubWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlcyApCisgICAgICAgICAgJiYgKCBkaXNjcmV0ZVF1ZXVlUHJpb3JpdGllcyA9PSByaHMuZGlzY3JldGVRdWV1ZVByaW9yaXRpZXMgKQorICAgICAgICAgICYmICggbWVtY21wKCBwb2ludFNpemVSYW5nZSwgcmhzLnBvaW50U2l6ZVJhbmdlLCAyICogc2l6ZW9mKCBmbG9hdCApICkgPT0gMCApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIGxpbmVXaWR0aFJhbmdlLCByaHMubGluZVdpZHRoUmFuZ2UsIDIgKiBzaXplb2YoIGZsb2F0ICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIHBvaW50U2l6ZUdyYW51bGFyaXR5ID09IHJocy5wb2ludFNpemVHcmFudWxhcml0eSApCisgICAgICAgICAgJiYgKCBsaW5lV2lkdGhHcmFudWxhcml0eSA9PSByaHMubGluZVdpZHRoR3JhbnVsYXJpdHkgKQorICAgICAgICAgICYmICggc3RyaWN0TGluZXMgPT0gcmhzLnN0cmljdExpbmVzICkKKyAgICAgICAgICAmJiAoIHN0YW5kYXJkU2FtcGxlTG9jYXRpb25zID09IHJocy5zdGFuZGFyZFNhbXBsZUxvY2F0aW9ucyApCisgICAgICAgICAgJiYgKCBvcHRpbWFsQnVmZmVyQ29weU9mZnNldEFsaWdubWVudCA9PSByaHMub3B0aW1hbEJ1ZmZlckNvcHlPZmZzZXRBbGlnbm1lbnQgKQorICAgICAgICAgICYmICggb3B0aW1hbEJ1ZmZlckNvcHlSb3dQaXRjaEFsaWdubWVudCA9PSByaHMub3B0aW1hbEJ1ZmZlckNvcHlSb3dQaXRjaEFsaWdubWVudCApCisgICAgICAgICAgJiYgKCBub25Db2hlcmVudEF0b21TaXplID09IHJocy5ub25Db2hlcmVudEF0b21TaXplICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZUxpbWl0cyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50MzJfdCBtYXhJbWFnZURpbWVuc2lvbjFEOworICAgIHVpbnQzMl90IG1heEltYWdlRGltZW5zaW9uMkQ7CisgICAgdWludDMyX3QgbWF4SW1hZ2VEaW1lbnNpb24zRDsKKyAgICB1aW50MzJfdCBtYXhJbWFnZURpbWVuc2lvbkN1YmU7CisgICAgdWludDMyX3QgbWF4SW1hZ2VBcnJheUxheWVyczsKKyAgICB1aW50MzJfdCBtYXhUZXhlbEJ1ZmZlckVsZW1lbnRzOworICAgIHVpbnQzMl90IG1heFVuaWZvcm1CdWZmZXJSYW5nZTsKKyAgICB1aW50MzJfdCBtYXhTdG9yYWdlQnVmZmVyUmFuZ2U7CisgICAgdWludDMyX3QgbWF4UHVzaENvbnN0YW50c1NpemU7CisgICAgdWludDMyX3QgbWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50OworICAgIHVpbnQzMl90IG1heFNhbXBsZXJBbGxvY2F0aW9uQ291bnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzcGFyc2VBZGRyZXNzU3BhY2VTaXplOworICAgIHVpbnQzMl90IG1heEJvdW5kRGVzY3JpcHRvclNldHM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVW5pZm9ybUJ1ZmZlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlczsKKyAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzOworICAgIHVpbnQzMl90IG1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VSZXNvdXJjZXM7CisgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFNhbXBsZXJzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyczsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyczsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRJbnB1dEF0dGFjaG1lbnRzOworICAgIHVpbnQzMl90IG1heFZlcnRleElucHV0QXR0cmlidXRlczsKKyAgICB1aW50MzJfdCBtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzOworICAgIHVpbnQzMl90IG1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0OworICAgIHVpbnQzMl90IG1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZTsKKyAgICB1aW50MzJfdCBtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90IG1heFRlc3NlbGxhdGlvbkdlbmVyYXRpb25MZXZlbDsKKyAgICB1aW50MzJfdCBtYXhUZXNzZWxsYXRpb25QYXRjaFNpemU7CisgICAgdWludDMyX3QgbWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleElucHV0Q29tcG9uZW50czsKKyAgICB1aW50MzJfdCBtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4T3V0cHV0Q29tcG9uZW50czsKKyAgICB1aW50MzJfdCBtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90IG1heFRlc3NlbGxhdGlvbkNvbnRyb2xUb3RhbE91dHB1dENvbXBvbmVudHM7CisgICAgdWludDMyX3QgbWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50czsKKyAgICB1aW50MzJfdCBtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50czsKKyAgICB1aW50MzJfdCBtYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zOworICAgIHVpbnQzMl90IG1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90IG1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50czsKKyAgICB1aW50MzJfdCBtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzOworICAgIHVpbnQzMl90IG1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90IG1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90IG1heEZyYWdtZW50T3V0cHV0QXR0YWNobWVudHM7CisgICAgdWludDMyX3QgbWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHM7CisgICAgdWludDMyX3QgbWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlczsKKyAgICB1aW50MzJfdCBtYXhDb21wdXRlU2hhcmVkTWVtb3J5U2l6ZTsKKyAgICB1aW50MzJfdCBtYXhDb21wdXRlV29ya0dyb3VwQ291bnRbM107CisgICAgdWludDMyX3QgbWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zOworICAgIHVpbnQzMl90IG1heENvbXB1dGVXb3JrR3JvdXBTaXplWzNdOworICAgIHVpbnQzMl90IHN1YlBpeGVsUHJlY2lzaW9uQml0czsKKyAgICB1aW50MzJfdCBzdWJUZXhlbFByZWNpc2lvbkJpdHM7CisgICAgdWludDMyX3QgbWlwbWFwUHJlY2lzaW9uQml0czsKKyAgICB1aW50MzJfdCBtYXhEcmF3SW5kZXhlZEluZGV4VmFsdWU7CisgICAgdWludDMyX3QgbWF4RHJhd0luZGlyZWN0Q291bnQ7CisgICAgZmxvYXQgbWF4U2FtcGxlckxvZEJpYXM7CisgICAgZmxvYXQgbWF4U2FtcGxlckFuaXNvdHJvcHk7CisgICAgdWludDMyX3QgbWF4Vmlld3BvcnRzOworICAgIHVpbnQzMl90IG1heFZpZXdwb3J0RGltZW5zaW9uc1syXTsKKyAgICBmbG9hdCB2aWV3cG9ydEJvdW5kc1JhbmdlWzJdOworICAgIHVpbnQzMl90IHZpZXdwb3J0U3ViUGl4ZWxCaXRzOworICAgIHNpemVfdCBtaW5NZW1vcnlNYXBBbGlnbm1lbnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWluVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtaW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIGludDMyX3QgbWluVGV4ZWxPZmZzZXQ7CisgICAgdWludDMyX3QgbWF4VGV4ZWxPZmZzZXQ7CisgICAgaW50MzJfdCBtaW5UZXhlbEdhdGhlck9mZnNldDsKKyAgICB1aW50MzJfdCBtYXhUZXhlbEdhdGhlck9mZnNldDsKKyAgICBmbG9hdCBtaW5JbnRlcnBvbGF0aW9uT2Zmc2V0OworICAgIGZsb2F0IG1heEludGVycG9sYXRpb25PZmZzZXQ7CisgICAgdWludDMyX3Qgc3ViUGl4ZWxJbnRlcnBvbGF0aW9uT2Zmc2V0Qml0czsKKyAgICB1aW50MzJfdCBtYXhGcmFtZWJ1ZmZlcldpZHRoOworICAgIHVpbnQzMl90IG1heEZyYW1lYnVmZmVySGVpZ2h0OworICAgIHVpbnQzMl90IG1heEZyYW1lYnVmZmVyTGF5ZXJzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzIGZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MgZnJhbWVidWZmZXJEZXB0aFNhbXBsZUNvdW50czsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBmcmFtZWJ1ZmZlclN0ZW5jaWxTYW1wbGVDb3VudHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MgZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzOworICAgIHVpbnQzMl90IG1heENvbG9yQXR0YWNobWVudHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3Mgc2FtcGxlZEltYWdlQ29sb3JTYW1wbGVDb3VudHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3Mgc2FtcGxlZEltYWdlSW50ZWdlclNhbXBsZUNvdW50czsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBzYW1wbGVkSW1hZ2VEZXB0aFNhbXBsZUNvdW50czsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBzYW1wbGVkSW1hZ2VTdGVuY2lsU2FtcGxlQ291bnRzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdzIHN0b3JhZ2VJbWFnZVNhbXBsZUNvdW50czsKKyAgICB1aW50MzJfdCBtYXhTYW1wbGVNYXNrV29yZHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0aW1lc3RhbXBDb21wdXRlQW5kR3JhcGhpY3M7CisgICAgZmxvYXQgdGltZXN0YW1wUGVyaW9kOworICAgIHVpbnQzMl90IG1heENsaXBEaXN0YW5jZXM7CisgICAgdWludDMyX3QgbWF4Q3VsbERpc3RhbmNlczsKKyAgICB1aW50MzJfdCBtYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzOworICAgIHVpbnQzMl90IGRpc2NyZXRlUXVldWVQcmlvcml0aWVzOworICAgIGZsb2F0IHBvaW50U2l6ZVJhbmdlWzJdOworICAgIGZsb2F0IGxpbmVXaWR0aFJhbmdlWzJdOworICAgIGZsb2F0IHBvaW50U2l6ZUdyYW51bGFyaXR5OworICAgIGZsb2F0IGxpbmVXaWR0aEdyYW51bGFyaXR5OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RyaWN0TGluZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdGFuZGFyZFNhbXBsZUxvY2F0aW9uczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvcHRpbWFsQnVmZmVyQ29weU9mZnNldEFsaWdubWVudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG5vbkNvaGVyZW50QXRvbVNpemU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VMaW1pdHMgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VMaW1pdHM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJlY3Rhbmd1bGFyTGluZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYnJlc2VuaGFtTGluZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc21vb3RoTGluZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0aXBwbGVkQnJlc2VuaGFtTGluZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RpcHBsZWRTbW9vdGhMaW5lc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiByZWN0YW5ndWxhckxpbmVzKCByZWN0YW5ndWxhckxpbmVzXyApCisgICAgICAsIGJyZXNlbmhhbUxpbmVzKCBicmVzZW5oYW1MaW5lc18gKQorICAgICAgLCBzbW9vdGhMaW5lcyggc21vb3RoTGluZXNfICkKKyAgICAgICwgc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzKCBzdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXNfICkKKyAgICAgICwgc3RpcHBsZWRCcmVzZW5oYW1MaW5lcyggc3RpcHBsZWRCcmVzZW5oYW1MaW5lc18gKQorICAgICAgLCBzdGlwcGxlZFNtb290aExpbmVzKCBzdGlwcGxlZFNtb290aExpbmVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCggVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCAmIHNldFJlY3Rhbmd1bGFyTGluZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmVjdGFuZ3VsYXJMaW5lc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVjdGFuZ3VsYXJMaW5lcyA9IHJlY3Rhbmd1bGFyTGluZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCAmIHNldEJyZXNlbmhhbUxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJyZXNlbmhhbUxpbmVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBicmVzZW5oYW1MaW5lcyA9IGJyZXNlbmhhbUxpbmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgJiBzZXRTbW9vdGhMaW5lcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzbW9vdGhMaW5lc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc21vb3RoTGluZXMgPSBzbW9vdGhMaW5lc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUICYgc2V0U3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzID0gc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgJiBzZXRTdGlwcGxlZEJyZXNlbmhhbUxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0aXBwbGVkQnJlc2VuaGFtTGluZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0aXBwbGVkQnJlc2VuaGFtTGluZXMgPSBzdGlwcGxlZEJyZXNlbmhhbUxpbmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgJiBzZXRTdGlwcGxlZFNtb290aExpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0aXBwbGVkU21vb3RoTGluZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0aXBwbGVkU21vb3RoTGluZXMgPSBzdGlwcGxlZFNtb290aExpbmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHJlY3Rhbmd1bGFyTGluZXMgPT0gcmhzLnJlY3Rhbmd1bGFyTGluZXMgKQorICAgICAgICAgICYmICggYnJlc2VuaGFtTGluZXMgPT0gcmhzLmJyZXNlbmhhbUxpbmVzICkKKyAgICAgICAgICAmJiAoIHNtb290aExpbmVzID09IHJocy5zbW9vdGhMaW5lcyApCisgICAgICAgICAgJiYgKCBzdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXMgPT0gcmhzLnN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lcyApCisgICAgICAgICAgJiYgKCBzdGlwcGxlZEJyZXNlbmhhbUxpbmVzID09IHJocy5zdGlwcGxlZEJyZXNlbmhhbUxpbmVzICkKKyAgICAgICAgICAmJiAoIHN0aXBwbGVkU21vb3RoTGluZXMgPT0gcmhzLnN0aXBwbGVkU21vb3RoTGluZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmVjdGFuZ3VsYXJMaW5lczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGJyZXNlbmhhbUxpbmVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc21vb3RoTGluZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdGlwcGxlZEJyZXNlbmhhbUxpbmVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RpcHBsZWRTbW9vdGhMaW5lczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKCB1aW50MzJfdCBsaW5lU3ViUGl4ZWxQcmVjaXNpb25CaXRzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHMoIGxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCggVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHMgPT0gcmhzLmxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBsaW5lU3ViUGl4ZWxQcmVjaXNpb25CaXRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyggdWludDMyX3QgbWF4UGVyU2V0RGVzY3JpcHRvcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1heE1lbW9yeUFsbG9jYXRpb25TaXplXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1heFBlclNldERlc2NyaXB0b3JzKCBtYXhQZXJTZXREZXNjcmlwdG9yc18gKQorICAgICAgLCBtYXhNZW1vcnlBbGxvY2F0aW9uU2l6ZSggbWF4TWVtb3J5QWxsb2NhdGlvblNpemVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKCBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbWF4UGVyU2V0RGVzY3JpcHRvcnMgPT0gcmhzLm1heFBlclNldERlc2NyaXB0b3JzICkKKyAgICAgICAgICAmJiAoIG1heE1lbW9yeUFsbG9jYXRpb25TaXplID09IHJocy5tYXhNZW1vcnlBbGxvY2F0aW9uU2l6ZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllczsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWF4UGVyU2V0RGVzY3JpcHRvcnM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWF4TWVtb3J5QWxsb2NhdGlvblNpemU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVAorICB7CisgICAgUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUKCBzdGQ6OmFycmF5PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplLFZLX01BWF9NRU1PUllfSEVBUFM+IGNvbnN0JiBoZWFwQnVkZ2V0XyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUsVktfTUFYX01FTU9SWV9IRUFQUz4gY29uc3QmIGhlYXBVc2FnZV8gPSB7IHsgMCB9IH0gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGhlYXBCdWRnZXR7fQorICAgICAgLCBoZWFwVXNhZ2V7fQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUsVktfTUFYX01FTU9SWV9IRUFQUyxWS19NQVhfTUVNT1JZX0hFQVBTPjo6Y29weSggaGVhcEJ1ZGdldCwgaGVhcEJ1ZGdldF8gKTsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUsVktfTUFYX01FTU9SWV9IRUFQUyxWS19NQVhfTUVNT1JZX0hFQVBTPjo6Y29weSggaGVhcFVzYWdlLCBoZWFwVXNhZ2VfICk7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbWVtY21wKCBoZWFwQnVkZ2V0LCByaHMuaGVhcEJ1ZGdldCwgVktfTUFYX01FTU9SWV9IRUFQUyAqIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtY21wKCBoZWFwVXNhZ2UsIHJocy5oZWFwVXNhZ2UsIFZLX01BWF9NRU1PUllfSEVBUFMgKiBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplICkgKSA9PSAwICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBoZWFwQnVkZ2V0W1ZLX01BWF9NRU1PUllfSEVBUFNdOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGhlYXBVc2FnZVtWS19NQVhfTUVNT1JZX0hFQVBTXTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbWVtb3J5UHJpb3JpdHlfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWVtb3J5UHJpb3JpdHkoIG1lbW9yeVByaW9yaXR5XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCggVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCAmIHNldE1lbW9yeVByaW9yaXR5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG1lbW9yeVByaW9yaXR5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1vcnlQcmlvcml0eSA9IG1lbW9yeVByaW9yaXR5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1lbW9yeVByaW9yaXR5ID09IHJocy5tZW1vcnlQcmlvcml0eSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBtZW1vcnlQcmlvcml0eTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzCisgIHsKKyAgICBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoIHVpbnQzMl90IG1lbW9yeVR5cGVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5VHlwZSxWS19NQVhfTUVNT1JZX1RZUEVTPiBjb25zdCYgbWVtb3J5VHlwZXNfID0geyB7IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlUeXBlKCkgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVtb3J5SGVhcENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlIZWFwLFZLX01BWF9NRU1PUllfSEVBUFM+IGNvbnN0JiBtZW1vcnlIZWFwc18gPSB7IHsgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUhlYXAoKSB9IH0gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1lbW9yeVR5cGVDb3VudCggbWVtb3J5VHlwZUNvdW50XyApCisgICAgICAsIG1lbW9yeVR5cGVze30KKyAgICAgICwgbWVtb3J5SGVhcENvdW50KCBtZW1vcnlIZWFwQ291bnRfICkKKyAgICAgICwgbWVtb3J5SGVhcHN7fQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVR5cGUsVktfTUFYX01FTU9SWV9UWVBFUyxWS19NQVhfTUVNT1JZX1RZUEVTPjo6Y29weSggbWVtb3J5VHlwZXMsIG1lbW9yeVR5cGVzXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5SGVhcCxWS19NQVhfTUVNT1JZX0hFQVBTLFZLX01BWF9NRU1PUllfSEVBUFM+Ojpjb3B5KCBtZW1vcnlIZWFwcywgbWVtb3J5SGVhcHNfICk7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIG1lbW9yeVR5cGVDb3VudCA9PSByaHMubWVtb3J5VHlwZUNvdW50ICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggbWVtb3J5VHlwZXMsIHJocy5tZW1vcnlUeXBlcywgVktfTUFYX01FTU9SWV9UWVBFUyAqIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVR5cGUgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtb3J5SGVhcENvdW50ID09IHJocy5tZW1vcnlIZWFwQ291bnQgKQorICAgICAgICAgICYmICggbWVtY21wKCBtZW1vcnlIZWFwcywgcmhzLm1lbW9yeUhlYXBzLCBWS19NQVhfTUVNT1JZX0hFQVBTICogc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5SGVhcCApICkgPT0gMCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IG1lbW9yeVR5cGVDb3VudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5VHlwZSBtZW1vcnlUeXBlc1tWS19NQVhfTUVNT1JZX1RZUEVTXTsKKyAgICB1aW50MzJfdCBtZW1vcnlIZWFwQ291bnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUhlYXAgbWVtb3J5SGVhcHNbVktfTUFYX01FTU9SWV9IRUFQU107CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgbWVtb3J5UHJvcGVydGllc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1lbW9yeVByb3BlcnRpZXMoIG1lbW9yeVByb3BlcnRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtZW1vcnlQcm9wZXJ0aWVzID09IHJocy5tZW1vcnlQcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgbWVtb3J5UHJvcGVydGllczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0YXNrU2hhZGVyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBtZXNoU2hhZGVyXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHRhc2tTaGFkZXIoIHRhc2tTaGFkZXJfICkKKyAgICAgICwgbWVzaFNoYWRlciggbWVzaFNoYWRlcl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViggVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViAmIHNldFRhc2tTaGFkZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGFza1NoYWRlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdGFza1NoYWRlciA9IHRhc2tTaGFkZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYgJiBzZXRNZXNoU2hhZGVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG1lc2hTaGFkZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lc2hTaGFkZXIgPSBtZXNoU2hhZGVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdGFza1NoYWRlciA9PSByaHMudGFza1NoYWRlciApCisgICAgICAgICAgJiYgKCBtZXNoU2hhZGVyID09IHJocy5tZXNoU2hhZGVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGFza1NoYWRlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG1lc2hTaGFkZXI7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVgorICB7CisgICAgUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WKCB1aW50MzJfdCBtYXhEcmF3TWVzaFRhc2tzQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRhc2tXb3JrR3JvdXBJbnZvY2F0aW9uc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTx1aW50MzJfdCwzPiBjb25zdCYgbWF4VGFza1dvcmtHcm91cFNpemVfID0geyB7IDAgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VGFza1RvdGFsTWVtb3J5U2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VGFza091dHB1dENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDMyX3QsMz4gY29uc3QmIG1heE1lc2hXb3JrR3JvdXBTaXplXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heE1lc2hUb3RhbE1lbW9yeVNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heE1lc2hPdXRwdXRWZXJ0aWNlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4TWVzaE91dHB1dFByaW1pdGl2ZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lc2hPdXRwdXRQZXJWZXJ0ZXhHcmFudWxhcml0eV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVzaE91dHB1dFBlclByaW1pdGl2ZUdyYW51bGFyaXR5XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1heERyYXdNZXNoVGFza3NDb3VudCggbWF4RHJhd01lc2hUYXNrc0NvdW50XyApCisgICAgICAsIG1heFRhc2tXb3JrR3JvdXBJbnZvY2F0aW9ucyggbWF4VGFza1dvcmtHcm91cEludm9jYXRpb25zXyApCisgICAgICAsIG1heFRhc2tXb3JrR3JvdXBTaXple30KKyAgICAgICwgbWF4VGFza1RvdGFsTWVtb3J5U2l6ZSggbWF4VGFza1RvdGFsTWVtb3J5U2l6ZV8gKQorICAgICAgLCBtYXhUYXNrT3V0cHV0Q291bnQoIG1heFRhc2tPdXRwdXRDb3VudF8gKQorICAgICAgLCBtYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnMoIG1heE1lc2hXb3JrR3JvdXBJbnZvY2F0aW9uc18gKQorICAgICAgLCBtYXhNZXNoV29ya0dyb3VwU2l6ZXt9CisgICAgICAsIG1heE1lc2hUb3RhbE1lbW9yeVNpemUoIG1heE1lc2hUb3RhbE1lbW9yeVNpemVfICkKKyAgICAgICwgbWF4TWVzaE91dHB1dFZlcnRpY2VzKCBtYXhNZXNoT3V0cHV0VmVydGljZXNfICkKKyAgICAgICwgbWF4TWVzaE91dHB1dFByaW1pdGl2ZXMoIG1heE1lc2hPdXRwdXRQcmltaXRpdmVzXyApCisgICAgICAsIG1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnQoIG1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnRfICkKKyAgICAgICwgbWVzaE91dHB1dFBlclZlcnRleEdyYW51bGFyaXR5KCBtZXNoT3V0cHV0UGVyVmVydGV4R3JhbnVsYXJpdHlfICkKKyAgICAgICwgbWVzaE91dHB1dFBlclByaW1pdGl2ZUdyYW51bGFyaXR5KCBtZXNoT3V0cHV0UGVyUHJpbWl0aXZlR3JhbnVsYXJpdHlfICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PHVpbnQzMl90LDMsMz46OmNvcHkoIG1heFRhc2tXb3JrR3JvdXBTaXplLCBtYXhUYXNrV29ya0dyb3VwU2l6ZV8gKTsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8dWludDMyX3QsMywzPjo6Y29weSggbWF4TWVzaFdvcmtHcm91cFNpemUsIG1heE1lc2hXb3JrR3JvdXBTaXplXyApOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViggVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heERyYXdNZXNoVGFza3NDb3VudCA9PSByaHMubWF4RHJhd01lc2hUYXNrc0NvdW50ICkKKyAgICAgICAgICAmJiAoIG1heFRhc2tXb3JrR3JvdXBJbnZvY2F0aW9ucyA9PSByaHMubWF4VGFza1dvcmtHcm91cEludm9jYXRpb25zICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggbWF4VGFza1dvcmtHcm91cFNpemUsIHJocy5tYXhUYXNrV29ya0dyb3VwU2l6ZSwgMyAqIHNpemVvZiggdWludDMyX3QgKSApID09IDAgKQorICAgICAgICAgICYmICggbWF4VGFza1RvdGFsTWVtb3J5U2l6ZSA9PSByaHMubWF4VGFza1RvdGFsTWVtb3J5U2l6ZSApCisgICAgICAgICAgJiYgKCBtYXhUYXNrT3V0cHV0Q291bnQgPT0gcmhzLm1heFRhc2tPdXRwdXRDb3VudCApCisgICAgICAgICAgJiYgKCBtYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnMgPT0gcmhzLm1heE1lc2hXb3JrR3JvdXBJbnZvY2F0aW9ucyApCisgICAgICAgICAgJiYgKCBtZW1jbXAoIG1heE1lc2hXb3JrR3JvdXBTaXplLCByaHMubWF4TWVzaFdvcmtHcm91cFNpemUsIDMgKiBzaXplb2YoIHVpbnQzMl90ICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIG1heE1lc2hUb3RhbE1lbW9yeVNpemUgPT0gcmhzLm1heE1lc2hUb3RhbE1lbW9yeVNpemUgKQorICAgICAgICAgICYmICggbWF4TWVzaE91dHB1dFZlcnRpY2VzID09IHJocy5tYXhNZXNoT3V0cHV0VmVydGljZXMgKQorICAgICAgICAgICYmICggbWF4TWVzaE91dHB1dFByaW1pdGl2ZXMgPT0gcmhzLm1heE1lc2hPdXRwdXRQcmltaXRpdmVzICkKKyAgICAgICAgICAmJiAoIG1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnQgPT0gcmhzLm1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnQgKQorICAgICAgICAgICYmICggbWVzaE91dHB1dFBlclZlcnRleEdyYW51bGFyaXR5ID09IHJocy5tZXNoT3V0cHV0UGVyVmVydGV4R3JhbnVsYXJpdHkgKQorICAgICAgICAgICYmICggbWVzaE91dHB1dFBlclByaW1pdGl2ZUdyYW51bGFyaXR5ID09IHJocy5tZXNoT3V0cHV0UGVyUHJpbWl0aXZlR3JhbnVsYXJpdHkgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IG1heERyYXdNZXNoVGFza3NDb3VudDsKKyAgICB1aW50MzJfdCBtYXhUYXNrV29ya0dyb3VwSW52b2NhdGlvbnM7CisgICAgdWludDMyX3QgbWF4VGFza1dvcmtHcm91cFNpemVbM107CisgICAgdWludDMyX3QgbWF4VGFza1RvdGFsTWVtb3J5U2l6ZTsKKyAgICB1aW50MzJfdCBtYXhUYXNrT3V0cHV0Q291bnQ7CisgICAgdWludDMyX3QgbWF4TWVzaFdvcmtHcm91cEludm9jYXRpb25zOworICAgIHVpbnQzMl90IG1heE1lc2hXb3JrR3JvdXBTaXplWzNdOworICAgIHVpbnQzMl90IG1heE1lc2hUb3RhbE1lbW9yeVNpemU7CisgICAgdWludDMyX3QgbWF4TWVzaE91dHB1dFZlcnRpY2VzOworICAgIHVpbnQzMl90IG1heE1lc2hPdXRwdXRQcmltaXRpdmVzOworICAgIHVpbnQzMl90IG1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnQ7CisgICAgdWludDMyX3QgbWVzaE91dHB1dFBlclZlcnRleEdyYW51bGFyaXR5OworICAgIHVpbnQzMl90IG1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBtdWx0aXZpZXdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG11bHRpdmlld0dlb21ldHJ5U2hhZGVyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBtdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXJfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbXVsdGl2aWV3KCBtdWx0aXZpZXdfICkKKyAgICAgICwgbXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIoIG11bHRpdmlld0dlb21ldHJ5U2hhZGVyXyApCisgICAgICAsIG11bHRpdmlld1Rlc3NlbGxhdGlvblNoYWRlciggbXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICYgc2V0TXVsdGl2aWV3KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG11bHRpdmlld18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbXVsdGl2aWV3ID0gbXVsdGl2aWV3XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICYgc2V0TXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbXVsdGl2aWV3R2VvbWV0cnlTaGFkZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG11bHRpdmlld0dlb21ldHJ5U2hhZGVyID0gbXVsdGl2aWV3R2VvbWV0cnlTaGFkZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgJiBzZXRNdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIgPSBtdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtdWx0aXZpZXcgPT0gcmhzLm11bHRpdmlldyApCisgICAgICAgICAgJiYgKCBtdWx0aXZpZXdHZW9tZXRyeVNoYWRlciA9PSByaHMubXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIgKQorICAgICAgICAgICYmICggbXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyID09IHJocy5tdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlczsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBtdWx0aXZpZXc7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBtdWx0aXZpZXdHZW9tZXRyeVNoYWRlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIG11bHRpdmlld1Rlc3NlbGxhdGlvblNoYWRlcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHBlclZpZXdQb3NpdGlvbkFsbENvbXBvbmVudHNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50cyggcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYKCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50cyA9PSByaHMucGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlg7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50czsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzCisgIHsKKyAgICBQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMoIHVpbnQzMl90IG1heE11bHRpdmlld1ZpZXdDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXhNdWx0aXZpZXdWaWV3Q291bnQoIG1heE11bHRpdmlld1ZpZXdDb3VudF8gKQorICAgICAgLCBtYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4KCBtYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heE11bHRpdmlld1ZpZXdDb3VudCA9PSByaHMubWF4TXVsdGl2aWV3Vmlld0NvdW50ICkKKyAgICAgICAgICAmJiAoIG1heE11bHRpdmlld0luc3RhbmNlSW5kZXggPT0gcmhzLm1heE11bHRpdmlld0luc3RhbmNlSW5kZXggKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IG1heE11bHRpdmlld1ZpZXdDb3VudDsKKyAgICB1aW50MzJfdCBtYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUKCB1aW50MzJfdCBwY2lEb21haW5fID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwY2lCdXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwY2lEZXZpY2VfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwY2lGdW5jdGlvbl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwY2lEb21haW4oIHBjaURvbWFpbl8gKQorICAgICAgLCBwY2lCdXMoIHBjaUJ1c18gKQorICAgICAgLCBwY2lEZXZpY2UoIHBjaURldmljZV8gKQorICAgICAgLCBwY2lGdW5jdGlvbiggcGNpRnVuY3Rpb25fICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwY2lEb21haW4gPT0gcmhzLnBjaURvbWFpbiApCisgICAgICAgICAgJiYgKCBwY2lCdXMgPT0gcmhzLnBjaUJ1cyApCisgICAgICAgICAgJiYgKCBwY2lEZXZpY2UgPT0gcmhzLnBjaURldmljZSApCisgICAgICAgICAgJiYgKCBwY2lGdW5jdGlvbiA9PSByaHMucGNpRnVuY3Rpb24gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VQY2lCdXNJbmZvUHJvcGVydGllc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgcGNpRG9tYWluOworICAgIHVpbnQzMl90IHBjaUJ1czsKKyAgICB1aW50MzJfdCBwY2lEZXZpY2U7CisgICAgdWludDMyX3QgcGNpRnVuY3Rpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBwZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMoIHBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHNfICkKKyAgICAgICwgcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzKCBwZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiggVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiAmIHNldFBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGVyZm9ybWFuY2VDb3VudGVyUXVlcnlQb29sc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGVyZm9ybWFuY2VDb3VudGVyUXVlcnlQb29scyA9IHBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICYgc2V0UGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHBlcmZvcm1hbmNlQ291bnRlck11bHRpcGxlUXVlcnlQb29sc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzID0gcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzID09IHJocy5wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzICkKKyAgICAgICAgICAmJiAoIHBlcmZvcm1hbmNlQ291bnRlck11bHRpcGxlUXVlcnlQb29scyA9PSByaHMucGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBwZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSCisgIHsKKyAgICBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzKCBhbGxvd0NvbW1hbmRCdWZmZXJRdWVyeUNvcGllc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiggVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzID09IHJocy5hbGxvd0NvbW1hbmRCdWZmZXJRdWVyeUNvcGllcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcGlwZWxpbmVFeGVjdXRhYmxlSW5mb18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwaXBlbGluZUV4ZWN1dGFibGVJbmZvKCBwaXBlbGluZUV4ZWN1dGFibGVJbmZvXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIoIFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgJiBzZXRQaXBlbGluZUV4ZWN1dGFibGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHBpcGVsaW5lRXhlY3V0YWJsZUluZm9fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBpcGVsaW5lRXhlY3V0YWJsZUluZm8gPSBwaXBlbGluZUV4ZWN1dGFibGVJbmZvXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwaXBlbGluZUV4ZWN1dGFibGVJbmZvID09IHJocy5waXBlbGluZUV4ZWN1dGFibGVJbmZvICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBwaXBlbGluZUV4ZWN1dGFibGVJbmZvOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzCisgIHsKKyAgICBQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UG9pbnRDbGlwcGluZ0JlaGF2aW9yIHBvaW50Q2xpcHBpbmdCZWhhdmlvcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UG9pbnRDbGlwcGluZ0JlaGF2aW9yOjplQWxsQ2xpcFBsYW5lcyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcG9pbnRDbGlwcGluZ0JlaGF2aW9yKCBwb2ludENsaXBwaW5nQmVoYXZpb3JfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMoIFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwb2ludENsaXBwaW5nQmVoYXZpb3IgPT0gcmhzLnBvaW50Q2xpcHBpbmdCZWhhdmlvciApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UG9pbnRDbGlwcGluZ0JlaGF2aW9yIHBvaW50Q2xpcHBpbmdCZWhhdmlvcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzCisgIHsKKyAgICBQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmVzaWRlbmN5U3RhbmRhcmQyRE11bHRpc2FtcGxlQmxvY2tTaGFwZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByZXNpZGVuY3lTdGFuZGFyZDNEQmxvY2tTaGFwZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByZXNpZGVuY3lBbGlnbmVkTWlwU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiByZXNpZGVuY3lTdGFuZGFyZDJEQmxvY2tTaGFwZSggcmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGVfICkKKyAgICAgICwgcmVzaWRlbmN5U3RhbmRhcmQyRE11bHRpc2FtcGxlQmxvY2tTaGFwZSggcmVzaWRlbmN5U3RhbmRhcmQyRE11bHRpc2FtcGxlQmxvY2tTaGFwZV8gKQorICAgICAgLCByZXNpZGVuY3lTdGFuZGFyZDNEQmxvY2tTaGFwZSggcmVzaWRlbmN5U3RhbmRhcmQzREJsb2NrU2hhcGVfICkKKyAgICAgICwgcmVzaWRlbmN5QWxpZ25lZE1pcFNpemUoIHJlc2lkZW5jeUFsaWduZWRNaXBTaXplXyApCisgICAgICAsIHJlc2lkZW5jeU5vblJlc2lkZW50U3RyaWN0KCByZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdF8gKQorICAgIHt9CisKKyAgICBQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMoIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggcmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGUgPT0gcmhzLnJlc2lkZW5jeVN0YW5kYXJkMkRCbG9ja1NoYXBlICkKKyAgICAgICAgICAmJiAoIHJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGUgPT0gcmhzLnJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGUgKQorICAgICAgICAgICYmICggcmVzaWRlbmN5U3RhbmRhcmQzREJsb2NrU2hhcGUgPT0gcmhzLnJlc2lkZW5jeVN0YW5kYXJkM0RCbG9ja1NoYXBlICkKKyAgICAgICAgICAmJiAoIHJlc2lkZW5jeUFsaWduZWRNaXBTaXplID09IHJocy5yZXNpZGVuY3lBbGlnbmVkTWlwU2l6ZSApCisgICAgICAgICAgJiYgKCByZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdCA9PSByaHMucmVzaWRlbmN5Tm9uUmVzaWRlbnRTdHJpY3QgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJlc2lkZW5jeVN0YW5kYXJkMkRCbG9ja1NoYXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmVzaWRlbmN5U3RhbmRhcmQyRE11bHRpc2FtcGxlQmxvY2tTaGFwZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJlc2lkZW5jeVN0YW5kYXJkM0RCbG9ja1NoYXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmVzaWRlbmN5QWxpZ25lZE1pcFNpemU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzCisgIHsKKyAgICBQaHlzaWNhbERldmljZVByb3BlcnRpZXMoIHVpbnQzMl90IGFwaVZlcnNpb25fID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRyaXZlclZlcnNpb25fID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZlbmRvcklEXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VJRF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVHlwZSBkZXZpY2VUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVR5cGU6OmVPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8Y2hhcixWS19NQVhfUEhZU0lDQUxfREVWSUNFX05BTUVfU0laRT4gY29uc3QmIGRldmljZU5hbWVfID0geyB7IDAgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LFZLX1VVSURfU0laRT4gY29uc3QmIHBpcGVsaW5lQ2FjaGVVVUlEXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUxpbWl0cyBsaW1pdHNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTGltaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzIHNwYXJzZVByb3BlcnRpZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhcGlWZXJzaW9uKCBhcGlWZXJzaW9uXyApCisgICAgICAsIGRyaXZlclZlcnNpb24oIGRyaXZlclZlcnNpb25fICkKKyAgICAgICwgdmVuZG9ySUQoIHZlbmRvcklEXyApCisgICAgICAsIGRldmljZUlEKCBkZXZpY2VJRF8gKQorICAgICAgLCBkZXZpY2VUeXBlKCBkZXZpY2VUeXBlXyApCisgICAgICAsIGRldmljZU5hbWV7fQorICAgICAgLCBwaXBlbGluZUNhY2hlVVVJRHt9CisgICAgICAsIGxpbWl0cyggbGltaXRzXyApCisgICAgICAsIHNwYXJzZVByb3BlcnRpZXMoIHNwYXJzZVByb3BlcnRpZXNfICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGNoYXIsVktfTUFYX1BIWVNJQ0FMX0RFVklDRV9OQU1FX1NJWkUsVktfTUFYX1BIWVNJQ0FMX0RFVklDRV9OQU1FX1NJWkU+Ojpjb3B5KCBkZXZpY2VOYW1lLCBkZXZpY2VOYW1lXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTx1aW50OF90LFZLX1VVSURfU0laRSxWS19VVUlEX1NJWkU+Ojpjb3B5KCBwaXBlbGluZUNhY2hlVVVJRCwgcGlwZWxpbmVDYWNoZVVVSURfICk7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKCBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVByb3BlcnRpZXMmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGFwaVZlcnNpb24gPT0gcmhzLmFwaVZlcnNpb24gKQorICAgICAgICAgICYmICggZHJpdmVyVmVyc2lvbiA9PSByaHMuZHJpdmVyVmVyc2lvbiApCisgICAgICAgICAgJiYgKCB2ZW5kb3JJRCA9PSByaHMudmVuZG9ySUQgKQorICAgICAgICAgICYmICggZGV2aWNlSUQgPT0gcmhzLmRldmljZUlEICkKKyAgICAgICAgICAmJiAoIGRldmljZVR5cGUgPT0gcmhzLmRldmljZVR5cGUgKQorICAgICAgICAgICYmICggbWVtY21wKCBkZXZpY2VOYW1lLCByaHMuZGV2aWNlTmFtZSwgVktfTUFYX1BIWVNJQ0FMX0RFVklDRV9OQU1FX1NJWkUgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtY21wKCBwaXBlbGluZUNhY2hlVVVJRCwgcmhzLnBpcGVsaW5lQ2FjaGVVVUlELCBWS19VVUlEX1NJWkUgKiBzaXplb2YoIHVpbnQ4X3QgKSApID09IDAgKQorICAgICAgICAgICYmICggbGltaXRzID09IHJocy5saW1pdHMgKQorICAgICAgICAgICYmICggc3BhcnNlUHJvcGVydGllcyA9PSByaHMuc3BhcnNlUHJvcGVydGllcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IGFwaVZlcnNpb247CisgICAgdWludDMyX3QgZHJpdmVyVmVyc2lvbjsKKyAgICB1aW50MzJfdCB2ZW5kb3JJRDsKKyAgICB1aW50MzJfdCBkZXZpY2VJRDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUeXBlIGRldmljZVR5cGU7CisgICAgY2hhciBkZXZpY2VOYW1lW1ZLX01BWF9QSFlTSUNBTF9ERVZJQ0VfTkFNRV9TSVpFXTsKKyAgICB1aW50OF90IHBpcGVsaW5lQ2FjaGVVVUlEW1ZLX1VVSURfU0laRV07CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTGltaXRzIGxpbWl0czsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzIHNwYXJzZVByb3BlcnRpZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVByb3BlcnRpZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMgcHJvcGVydGllc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHByb3BlcnRpZXMoIHByb3BlcnRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVByb3BlcnRpZXMyJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwcm9wZXJ0aWVzID09IHJocy5wcm9wZXJ0aWVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMgcHJvcGVydGllczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVByb3BlcnRpZXMyICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBwcm90ZWN0ZWRNZW1vcnlfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcHJvdGVjdGVkTWVtb3J5KCBwcm90ZWN0ZWRNZW1vcnlfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMoIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgJiBzZXRQcm90ZWN0ZWRNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcHJvdGVjdGVkTWVtb3J5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwcm90ZWN0ZWRNZW1vcnkgPSBwcm90ZWN0ZWRNZW1vcnlfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBwcm90ZWN0ZWRNZW1vcnkgPT0gcmhzLnByb3RlY3RlZE1lbW9yeSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHByb3RlY3RlZE1lbW9yeTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzCisgIHsKKyAgICBQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcHJvdGVjdGVkTm9GYXVsdF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBwcm90ZWN0ZWROb0ZhdWx0KCBwcm90ZWN0ZWROb0ZhdWx0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHByb3RlY3RlZE5vRmF1bHQgPT0gcmhzLnByb3RlY3RlZE5vRmF1bHQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXM7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcHJvdGVjdGVkTm9GYXVsdDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKCB1aW50MzJfdCBtYXhQdXNoRGVzY3JpcHRvcnNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWF4UHVzaERlc2NyaXB0b3JzKCBtYXhQdXNoRGVzY3JpcHRvcnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiggVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heFB1c2hEZXNjcmlwdG9ycyA9PSByaHMubWF4UHVzaERlc2NyaXB0b3JzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWF4UHVzaERlc2NyaXB0b3JzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViggdWludDMyX3Qgc2hhZGVyR3JvdXBIYW5kbGVTaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhSZWN1cnNpb25EZXB0aF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4U2hhZGVyR3JvdXBTdHJpZGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNoYWRlckdyb3VwQmFzZUFsaWdubWVudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbWF4R2VvbWV0cnlDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbWF4SW5zdGFuY2VDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbWF4VHJpYW5nbGVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZXNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhZGVyR3JvdXBIYW5kbGVTaXplKCBzaGFkZXJHcm91cEhhbmRsZVNpemVfICkKKyAgICAgICwgbWF4UmVjdXJzaW9uRGVwdGgoIG1heFJlY3Vyc2lvbkRlcHRoXyApCisgICAgICAsIG1heFNoYWRlckdyb3VwU3RyaWRlKCBtYXhTaGFkZXJHcm91cFN0cmlkZV8gKQorICAgICAgLCBzaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQoIHNoYWRlckdyb3VwQmFzZUFsaWdubWVudF8gKQorICAgICAgLCBtYXhHZW9tZXRyeUNvdW50KCBtYXhHZW9tZXRyeUNvdW50XyApCisgICAgICAsIG1heEluc3RhbmNlQ291bnQoIG1heEluc3RhbmNlQ291bnRfICkKKyAgICAgICwgbWF4VHJpYW5nbGVDb3VudCggbWF4VHJpYW5nbGVDb3VudF8gKQorICAgICAgLCBtYXhEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlcyggbWF4RGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WKCBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2hhZGVyR3JvdXBIYW5kbGVTaXplID09IHJocy5zaGFkZXJHcm91cEhhbmRsZVNpemUgKQorICAgICAgICAgICYmICggbWF4UmVjdXJzaW9uRGVwdGggPT0gcmhzLm1heFJlY3Vyc2lvbkRlcHRoICkKKyAgICAgICAgICAmJiAoIG1heFNoYWRlckdyb3VwU3RyaWRlID09IHJocy5tYXhTaGFkZXJHcm91cFN0cmlkZSApCisgICAgICAgICAgJiYgKCBzaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQgPT0gcmhzLnNoYWRlckdyb3VwQmFzZUFsaWdubWVudCApCisgICAgICAgICAgJiYgKCBtYXhHZW9tZXRyeUNvdW50ID09IHJocy5tYXhHZW9tZXRyeUNvdW50ICkKKyAgICAgICAgICAmJiAoIG1heEluc3RhbmNlQ291bnQgPT0gcmhzLm1heEluc3RhbmNlQ291bnQgKQorICAgICAgICAgICYmICggbWF4VHJpYW5nbGVDb3VudCA9PSByaHMubWF4VHJpYW5nbGVDb3VudCApCisgICAgICAgICAgJiYgKCBtYXhEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlcyA9PSByaHMubWF4RGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IHNoYWRlckdyb3VwSGFuZGxlU2l6ZTsKKyAgICB1aW50MzJfdCBtYXhSZWN1cnNpb25EZXB0aDsKKyAgICB1aW50MzJfdCBtYXhTaGFkZXJHcm91cFN0cmlkZTsKKyAgICB1aW50MzJfdCBzaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQ7CisgICAgdWludDY0X3QgbWF4R2VvbWV0cnlDb3VudDsKKyAgICB1aW50NjRfdCBtYXhJbnN0YW5jZUNvdW50OworICAgIHVpbnQ2NF90IG1heFRyaWFuZ2xlQ291bnQ7CisgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdCggcmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViggVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViAmIHNldFJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdCA9IHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdCA9PSByaHMucmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3QgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3Mgc2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxmbG9hdCwyPiBjb25zdCYgc2FtcGxlTG9jYXRpb25Db29yZGluYXRlUmFuZ2VfID0geyB7IDAgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlTG9jYXRpb25TdWJQaXhlbEJpdHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmFyaWFibGVTYW1wbGVMb2NhdGlvbnNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHMoIHNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzXyApCisgICAgICAsIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUoIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemVfICkKKyAgICAgICwgc2FtcGxlTG9jYXRpb25Db29yZGluYXRlUmFuZ2V7fQorICAgICAgLCBzYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0cyggc2FtcGxlTG9jYXRpb25TdWJQaXhlbEJpdHNfICkKKyAgICAgICwgdmFyaWFibGVTYW1wbGVMb2NhdGlvbnMoIHZhcmlhYmxlU2FtcGxlTG9jYXRpb25zXyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxmbG9hdCwyLDI+Ojpjb3B5KCBzYW1wbGVMb2NhdGlvbkNvb3JkaW5hdGVSYW5nZSwgc2FtcGxlTG9jYXRpb25Db29yZGluYXRlUmFuZ2VfICk7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHMgPT0gcmhzLnNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzICkKKyAgICAgICAgICAmJiAoIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUgPT0gcmhzLm1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUgKQorICAgICAgICAgICYmICggbWVtY21wKCBzYW1wbGVMb2NhdGlvbkNvb3JkaW5hdGVSYW5nZSwgcmhzLnNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlLCAyICogc2l6ZW9mKCBmbG9hdCApICkgPT0gMCApCisgICAgICAgICAgJiYgKCBzYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0cyA9PSByaHMuc2FtcGxlTG9jYXRpb25TdWJQaXhlbEJpdHMgKQorICAgICAgICAgICYmICggdmFyaWFibGVTYW1wbGVMb2NhdGlvbnMgPT0gcmhzLnZhcmlhYmxlU2FtcGxlTG9jYXRpb25zICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFncyBzYW1wbGVMb2NhdGlvblNhbXBsZUNvdW50czsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgbWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICBmbG9hdCBzYW1wbGVMb2NhdGlvbkNvb3JkaW5hdGVSYW5nZVsyXTsKKyAgICB1aW50MzJfdCBzYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0czsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHZhcmlhYmxlU2FtcGxlTG9jYXRpb25zOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZpbHRlck1pbm1heFNpbmdsZUNvbXBvbmVudEZvcm1hdHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZ18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmaWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzKCBmaWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzXyApCisgICAgICAsIGZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZyggZmlsdGVyTWlubWF4SW1hZ2VDb21wb25lbnRNYXBwaW5nXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmlsdGVyTWlubWF4U2luZ2xlQ29tcG9uZW50Rm9ybWF0cyA9PSByaHMuZmlsdGVyTWlubWF4U2luZ2xlQ29tcG9uZW50Rm9ybWF0cyApCisgICAgICAgICAgJiYgKCBmaWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmcgPT0gcmhzLmZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZpbHRlck1pbm1heFNpbmdsZUNvbXBvbmVudEZvcm1hdHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmaWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmc7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzYW1wbGVyWWNiY3JDb252ZXJzaW9uXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNhbXBsZXJZY2JjckNvbnZlcnNpb24oIHNhbXBsZXJZY2JjckNvbnZlcnNpb25fICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyggVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyAmIHNldFNhbXBsZXJZY2JjckNvbnZlcnNpb24oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2FtcGxlclljYmNyQ29udmVyc2lvbl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlclljYmNyQ29udmVyc2lvbiA9IHNhbXBsZXJZY2JjckNvbnZlcnNpb25fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNhbXBsZXJZY2JjckNvbnZlcnNpb24gPT0gcmhzLnNhbXBsZXJZY2JjckNvbnZlcnNpb24gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNhbXBsZXJZY2JjckNvbnZlcnNpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNjYWxhckJsb2NrTGF5b3V0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNjYWxhckJsb2NrTGF5b3V0KCBzY2FsYXJCbG9ja0xheW91dF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgJiBzZXRTY2FsYXJCbG9ja0xheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzY2FsYXJCbG9ja0xheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2NhbGFyQmxvY2tMYXlvdXQgPSBzY2FsYXJCbG9ja0xheW91dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzY2FsYXJCbG9ja0xheW91dCA9PSByaHMuc2NhbGFyQmxvY2tMYXlvdXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2NhbGFyQmxvY2tMYXlvdXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cyggc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSICYgc2V0U2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzID0gc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzID09IHJocy5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckJ1ZmZlckludDY0QXRvbWljc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3NfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhZGVyQnVmZmVySW50NjRBdG9taWNzKCBzaGFkZXJCdWZmZXJJbnQ2NEF0b21pY3NfICkKKyAgICAgICwgc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzKCBzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3NfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSICYgc2V0U2hhZGVyQnVmZmVySW50NjRBdG9taWNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckJ1ZmZlckludDY0QXRvbWljc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyQnVmZmVySW50NjRBdG9taWNzID0gc2hhZGVyQnVmZmVySW50NjRBdG9taWNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgJiBzZXRTaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3MgPSBzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2hhZGVyQnVmZmVySW50NjRBdG9taWNzID09IHJocy5zaGFkZXJCdWZmZXJJbnQ2NEF0b21pY3MgKQorICAgICAgICAgICYmICggc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzID09IHJocy5zaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyQnVmZmVySW50NjRBdG9taWNzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdWJncm91cENsb2NrXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckRldmljZUNsb2NrXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNoYWRlclN1Ymdyb3VwQ2xvY2soIHNoYWRlclN1Ymdyb3VwQ2xvY2tfICkKKyAgICAgICwgc2hhZGVyRGV2aWNlQ2xvY2soIHNoYWRlckRldmljZUNsb2NrXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiggVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiAmIHNldFNoYWRlclN1Ymdyb3VwQ2xvY2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3ViZ3JvdXBDbG9ja18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyU3ViZ3JvdXBDbG9jayA9IHNoYWRlclN1Ymdyb3VwQ2xvY2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiAmIHNldFNoYWRlckRldmljZUNsb2NrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckRldmljZUNsb2NrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJEZXZpY2VDbG9jayA9IHNoYWRlckRldmljZUNsb2NrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNoYWRlclN1Ymdyb3VwQ2xvY2sgPT0gcmhzLnNoYWRlclN1Ymdyb3VwQ2xvY2sgKQorICAgICAgICAgICYmICggc2hhZGVyRGV2aWNlQ2xvY2sgPT0gcmhzLnNoYWRlckRldmljZUNsb2NrICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN1Ymdyb3VwQ2xvY2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZXZpY2VDbG9jazsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyQ29yZVByb3BlcnRpZXNGbGFnc0FNRCBzaGFkZXJDb3JlRmVhdHVyZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlckNvcmVQcm9wZXJ0aWVzRmxhZ3NBTUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQ29tcHV0ZVVuaXRDb3VudF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzaGFkZXJDb3JlRmVhdHVyZXMoIHNoYWRlckNvcmVGZWF0dXJlc18gKQorICAgICAgLCBhY3RpdmVDb21wdXRlVW5pdENvdW50KCBhY3RpdmVDb21wdXRlVW5pdENvdW50XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1ELCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzaGFkZXJDb3JlRmVhdHVyZXMgPT0gcmhzLnNoYWRlckNvcmVGZWF0dXJlcyApCisgICAgICAgICAgJiYgKCBhY3RpdmVDb21wdXRlVW5pdENvdW50ID09IHJocy5hY3RpdmVDb21wdXRlVW5pdENvdW50ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlckNvcmVQcm9wZXJ0aWVzRmxhZ3NBTUQgc2hhZGVyQ29yZUZlYXR1cmVzOworICAgIHVpbnQzMl90IGFjdGl2ZUNvbXB1dGVVbml0Q291bnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQoIHVpbnQzMl90IHNoYWRlckVuZ2luZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2hhZGVyQXJyYXlzUGVyRW5naW5lQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpbWRQZXJDb21wdXRlVW5pdF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdhdmVmcm9udHNQZXJTaW1kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2F2ZWZyb250U2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNncHJzUGVyU2ltZF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pblNncHJBbGxvY2F0aW9uXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4U2dwckFsbG9jYXRpb25fID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmdwcnNQZXJTaW1kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWluVmdwckFsbG9jYXRpb25fID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhWZ3ByQWxsb2NhdGlvbl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHlfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhZGVyRW5naW5lQ291bnQoIHNoYWRlckVuZ2luZUNvdW50XyApCisgICAgICAsIHNoYWRlckFycmF5c1BlckVuZ2luZUNvdW50KCBzaGFkZXJBcnJheXNQZXJFbmdpbmVDb3VudF8gKQorICAgICAgLCBjb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheSggY29tcHV0ZVVuaXRzUGVyU2hhZGVyQXJyYXlfICkKKyAgICAgICwgc2ltZFBlckNvbXB1dGVVbml0KCBzaW1kUGVyQ29tcHV0ZVVuaXRfICkKKyAgICAgICwgd2F2ZWZyb250c1BlclNpbWQoIHdhdmVmcm9udHNQZXJTaW1kXyApCisgICAgICAsIHdhdmVmcm9udFNpemUoIHdhdmVmcm9udFNpemVfICkKKyAgICAgICwgc2dwcnNQZXJTaW1kKCBzZ3Byc1BlclNpbWRfICkKKyAgICAgICwgbWluU2dwckFsbG9jYXRpb24oIG1pblNncHJBbGxvY2F0aW9uXyApCisgICAgICAsIG1heFNncHJBbGxvY2F0aW9uKCBtYXhTZ3ByQWxsb2NhdGlvbl8gKQorICAgICAgLCBzZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5KCBzZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5XyApCisgICAgICAsIHZncHJzUGVyU2ltZCggdmdwcnNQZXJTaW1kXyApCisgICAgICAsIG1pblZncHJBbGxvY2F0aW9uKCBtaW5WZ3ByQWxsb2NhdGlvbl8gKQorICAgICAgLCBtYXhWZ3ByQWxsb2NhdGlvbiggbWF4VmdwckFsbG9jYXRpb25fICkKKyAgICAgICwgdmdwckFsbG9jYXRpb25HcmFudWxhcml0eSggdmdwckFsbG9jYXRpb25HcmFudWxhcml0eV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1ELCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCggVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNoYWRlckVuZ2luZUNvdW50ID09IHJocy5zaGFkZXJFbmdpbmVDb3VudCApCisgICAgICAgICAgJiYgKCBzaGFkZXJBcnJheXNQZXJFbmdpbmVDb3VudCA9PSByaHMuc2hhZGVyQXJyYXlzUGVyRW5naW5lQ291bnQgKQorICAgICAgICAgICYmICggY29tcHV0ZVVuaXRzUGVyU2hhZGVyQXJyYXkgPT0gcmhzLmNvbXB1dGVVbml0c1BlclNoYWRlckFycmF5ICkKKyAgICAgICAgICAmJiAoIHNpbWRQZXJDb21wdXRlVW5pdCA9PSByaHMuc2ltZFBlckNvbXB1dGVVbml0ICkKKyAgICAgICAgICAmJiAoIHdhdmVmcm9udHNQZXJTaW1kID09IHJocy53YXZlZnJvbnRzUGVyU2ltZCApCisgICAgICAgICAgJiYgKCB3YXZlZnJvbnRTaXplID09IHJocy53YXZlZnJvbnRTaXplICkKKyAgICAgICAgICAmJiAoIHNncHJzUGVyU2ltZCA9PSByaHMuc2dwcnNQZXJTaW1kICkKKyAgICAgICAgICAmJiAoIG1pblNncHJBbGxvY2F0aW9uID09IHJocy5taW5TZ3ByQWxsb2NhdGlvbiApCisgICAgICAgICAgJiYgKCBtYXhTZ3ByQWxsb2NhdGlvbiA9PSByaHMubWF4U2dwckFsbG9jYXRpb24gKQorICAgICAgICAgICYmICggc2dwckFsbG9jYXRpb25HcmFudWxhcml0eSA9PSByaHMuc2dwckFsbG9jYXRpb25HcmFudWxhcml0eSApCisgICAgICAgICAgJiYgKCB2Z3Byc1BlclNpbWQgPT0gcmhzLnZncHJzUGVyU2ltZCApCisgICAgICAgICAgJiYgKCBtaW5WZ3ByQWxsb2NhdGlvbiA9PSByaHMubWluVmdwckFsbG9jYXRpb24gKQorICAgICAgICAgICYmICggbWF4VmdwckFsbG9jYXRpb24gPT0gcmhzLm1heFZncHJBbGxvY2F0aW9uICkKKyAgICAgICAgICAmJiAoIHZncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHkgPT0gcmhzLnZncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHkgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3Qgc2hhZGVyRW5naW5lQ291bnQ7CisgICAgdWludDMyX3Qgc2hhZGVyQXJyYXlzUGVyRW5naW5lQ291bnQ7CisgICAgdWludDMyX3QgY29tcHV0ZVVuaXRzUGVyU2hhZGVyQXJyYXk7CisgICAgdWludDMyX3Qgc2ltZFBlckNvbXB1dGVVbml0OworICAgIHVpbnQzMl90IHdhdmVmcm9udHNQZXJTaW1kOworICAgIHVpbnQzMl90IHdhdmVmcm9udFNpemU7CisgICAgdWludDMyX3Qgc2dwcnNQZXJTaW1kOworICAgIHVpbnQzMl90IG1pblNncHJBbGxvY2F0aW9uOworICAgIHVpbnQzMl90IG1heFNncHJBbGxvY2F0aW9uOworICAgIHVpbnQzMl90IHNncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHk7CisgICAgdWludDMyX3QgdmdwcnNQZXJTaW1kOworICAgIHVpbnQzMl90IG1pblZncHJBbGxvY2F0aW9uOworICAgIHVpbnQzMl90IG1heFZncHJBbGxvY2F0aW9uOworICAgIHVpbnQzMl90IHZncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHk7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbiggc2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUICYgc2V0U2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uID0gc2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uID09IHJocy5zaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb24gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckRyYXdQYXJhbWV0ZXJzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNoYWRlckRyYXdQYXJhbWV0ZXJzKCBzaGFkZXJEcmF3UGFyYW1ldGVyc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgJiBzZXRTaGFkZXJEcmF3UGFyYW1ldGVycyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJEcmF3UGFyYW1ldGVyc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVyRHJhd1BhcmFtZXRlcnMgPSBzaGFkZXJEcmF3UGFyYW1ldGVyc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzaGFkZXJEcmF3UGFyYW1ldGVycyA9PSByaHMuc2hhZGVyRHJhd1BhcmFtZXRlcnMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXM7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyRHJhd1BhcmFtZXRlcnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckZsb2F0MTZfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW50OF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzaGFkZXJGbG9hdDE2KCBzaGFkZXJGbG9hdDE2XyApCisgICAgICAsIHNoYWRlckludDgoIHNoYWRlckludDhfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSICYgc2V0U2hhZGVyRmxvYXQxNiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJGbG9hdDE2XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJGbG9hdDE2ID0gc2hhZGVyRmxvYXQxNl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSICYgc2V0U2hhZGVySW50OCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJJbnQ4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJJbnQ4ID0gc2hhZGVySW50OF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzaGFkZXJGbG9hdDE2ID09IHJocy5zaGFkZXJGbG9hdDE2ICkKKyAgICAgICAgICAmJiAoIHNoYWRlckludDggPT0gcmhzLnNoYWRlckludDggKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyRmxvYXQxNjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlckludDg7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpbWFnZUZvb3RwcmludF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBpbWFnZUZvb3RwcmludCggaW1hZ2VGb290cHJpbnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViggVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViAmIHNldEltYWdlRm9vdHByaW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGltYWdlRm9vdHByaW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZUZvb3RwcmludCA9IGltYWdlRm9vdHByaW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBpbWFnZUZvb3RwcmludCA9PSByaHMuaW1hZ2VGb290cHJpbnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGltYWdlRm9vdHByaW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVySW50ZWdlckZ1bmN0aW9uczJfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhZGVySW50ZWdlckZ1bmN0aW9uczIoIHNoYWRlckludGVnZXJGdW5jdGlvbnMyXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgJiBzZXRTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGVySW50ZWdlckZ1bmN0aW9uczIgPSBzaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2hhZGVySW50ZWdlckZ1bmN0aW9uczIgPT0gcmhzLnNoYWRlckludGVnZXJGdW5jdGlvbnMyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTTUJ1aWx0aW5zXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNoYWRlclNNQnVpbHRpbnMoIHNoYWRlclNNQnVpbHRpbnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgJiBzZXRTaGFkZXJTTUJ1aWx0aW5zKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclNNQnVpbHRpbnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRlclNNQnVpbHRpbnMgPSBzaGFkZXJTTUJ1aWx0aW5zXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2hhZGVyU01CdWlsdGlucyA9PSByaHMuc2hhZGVyU01CdWlsdGlucyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlclNtQnVpbHRpbnNGZWF0dXJlc05WOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclNNQnVpbHRpbnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVgorICB7CisgICAgUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WKCB1aW50MzJfdCBzaGFkZXJTTUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaGFkZXJXYXJwc1BlclNNXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNoYWRlclNNQ291bnQoIHNoYWRlclNNQ291bnRfICkKKyAgICAgICwgc2hhZGVyV2FycHNQZXJTTSggc2hhZGVyV2FycHNQZXJTTV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzaGFkZXJTTUNvdW50ID09IHJocy5zaGFkZXJTTUNvdW50ICkKKyAgICAgICAgICAmJiAoIHNoYWRlcldhcnBzUGVyU00gPT0gcmhzLnNoYWRlcldhcnBzUGVyU00gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlclNtQnVpbHRpbnNQcm9wZXJ0aWVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IHNoYWRlclNNQ291bnQ7CisgICAgdWludDMyX3Qgc2hhZGVyV2FycHNQZXJTTTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzKCBzaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIoIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgJiBzZXRTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXMgPSBzaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXMgPT0gcmhzLnNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkaW5nUmF0ZUltYWdlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkaW5nUmF0ZUNvYXJzZVNhbXBsZU9yZGVyXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNoYWRpbmdSYXRlSW1hZ2UoIHNoYWRpbmdSYXRlSW1hZ2VfICkKKyAgICAgICwgc2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlciggc2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlcl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViggVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViAmIHNldFNoYWRpbmdSYXRlSW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGluZ1JhdGVJbWFnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2hhZGluZ1JhdGVJbWFnZSA9IHNoYWRpbmdSYXRlSW1hZ2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgJiBzZXRTaGFkaW5nUmF0ZUNvYXJzZVNhbXBsZU9yZGVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXIgPSBzaGFkaW5nUmF0ZUNvYXJzZVNhbXBsZU9yZGVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2hhZGluZ1JhdGVJbWFnZSA9PSByaHMuc2hhZGluZ1JhdGVJbWFnZSApCisgICAgICAgICAgJiYgKCBzaGFkaW5nUmF0ZUNvYXJzZVNhbXBsZU9yZGVyID09IHJocy5zaGFkaW5nUmF0ZUNvYXJzZVNhbXBsZU9yZGVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGluZ1JhdGVJbWFnZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXI7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVgorICB7CisgICAgUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgc2hhZGluZ1JhdGVUZXhlbFNpemVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaGFkaW5nUmF0ZVBhbGV0dGVTaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhZGluZ1JhdGVUZXhlbFNpemUoIHNoYWRpbmdSYXRlVGV4ZWxTaXplXyApCisgICAgICAsIHNoYWRpbmdSYXRlUGFsZXR0ZVNpemUoIHNoYWRpbmdSYXRlUGFsZXR0ZVNpemVfICkKKyAgICAgICwgc2hhZGluZ1JhdGVNYXhDb2Fyc2VTYW1wbGVzKCBzaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2hhZGluZ1JhdGVUZXhlbFNpemUgPT0gcmhzLnNoYWRpbmdSYXRlVGV4ZWxTaXplICkKKyAgICAgICAgICAmJiAoIHNoYWRpbmdSYXRlUGFsZXR0ZVNpemUgPT0gcmhzLnNoYWRpbmdSYXRlUGFsZXR0ZVNpemUgKQorICAgICAgICAgICYmICggc2hhZGluZ1JhdGVNYXhDb2Fyc2VTYW1wbGVzID09IHJocy5zaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlY7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBzaGFkaW5nUmF0ZVRleGVsU2l6ZTsKKyAgICB1aW50MzJfdCBzaGFkaW5nUmF0ZVBhbGV0dGVTaXplOworICAgIHVpbnQzMl90IHNoYWRpbmdSYXRlTWF4Q29hcnNlU2FtcGxlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQ6OmVVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUeXBlIHR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZTo6ZTFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0czo6ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVRpbGluZyB0aWxpbmdfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVGlsaW5nOjplT3B0aW1hbCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZm9ybWF0KCBmb3JtYXRfICkKKyAgICAgICwgdHlwZSggdHlwZV8gKQorICAgICAgLCBzYW1wbGVzKCBzYW1wbGVzXyApCisgICAgICAsIHVzYWdlKCB1c2FnZV8gKQorICAgICAgLCB0aWxpbmcoIHRpbGluZ18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIoIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgJiBzZXRGb3JtYXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmb3JtYXQgPSBmb3JtYXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiAmIHNldFR5cGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVR5cGUgdHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdHlwZSA9IHR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiAmIHNldFNhbXBsZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNhbXBsZXMgPSBzYW1wbGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgJiBzZXRVc2FnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyB1c2FnZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdXNhZ2UgPSB1c2FnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICYgc2V0VGlsaW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0aWxpbmcgPSB0aWxpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZm9ybWF0ID09IHJocy5mb3JtYXQgKQorICAgICAgICAgICYmICggdHlwZSA9PSByaHMudHlwZSApCisgICAgICAgICAgJiYgKCBzYW1wbGVzID09IHJocy5zYW1wbGVzICkKKyAgICAgICAgICAmJiAoIHVzYWdlID09IHJocy51c2FnZSApCisgICAgICAgICAgJiYgKCB0aWxpbmcgPT0gcmhzLnRpbGluZyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyB1c2FnZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcworICB7CisgICAgUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMoIHVpbnQzMl90IHN1Ymdyb3VwU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzdXBwb3J0ZWRTdGFnZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1Ymdyb3VwRmVhdHVyZUZsYWdzIHN1cHBvcnRlZE9wZXJhdGlvbnNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1Ymdyb3VwRmVhdHVyZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcXVhZE9wZXJhdGlvbnNJbkFsbFN0YWdlc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdWJncm91cFNpemUoIHN1Ymdyb3VwU2l6ZV8gKQorICAgICAgLCBzdXBwb3J0ZWRTdGFnZXMoIHN1cHBvcnRlZFN0YWdlc18gKQorICAgICAgLCBzdXBwb3J0ZWRPcGVyYXRpb25zKCBzdXBwb3J0ZWRPcGVyYXRpb25zXyApCisgICAgICAsIHF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXMoIHF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyggVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN1Ymdyb3VwU2l6ZSA9PSByaHMuc3ViZ3JvdXBTaXplICkKKyAgICAgICAgICAmJiAoIHN1cHBvcnRlZFN0YWdlcyA9PSByaHMuc3VwcG9ydGVkU3RhZ2VzICkKKyAgICAgICAgICAmJiAoIHN1cHBvcnRlZE9wZXJhdGlvbnMgPT0gcmhzLnN1cHBvcnRlZE9wZXJhdGlvbnMgKQorICAgICAgICAgICYmICggcXVhZE9wZXJhdGlvbnNJbkFsbFN0YWdlcyA9PSByaHMucXVhZE9wZXJhdGlvbnNJbkFsbFN0YWdlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IHN1Ymdyb3VwU2l6ZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzdXBwb3J0ZWRTdGFnZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1Ymdyb3VwRmVhdHVyZUZsYWdzIHN1cHBvcnRlZE9wZXJhdGlvbnM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBxdWFkT3BlcmF0aW9uc0luQWxsU3RhZ2VzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3ViZ3JvdXBTaXplQ29udHJvbF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbXB1dGVGdWxsU3ViZ3JvdXBzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN1Ymdyb3VwU2l6ZUNvbnRyb2woIHN1Ymdyb3VwU2l6ZUNvbnRyb2xfICkKKyAgICAgICwgY29tcHV0ZUZ1bGxTdWJncm91cHMoIGNvbXB1dGVGdWxsU3ViZ3JvdXBzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgJiBzZXRTdWJncm91cFNpemVDb250cm9sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN1Ymdyb3VwU2l6ZUNvbnRyb2xfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN1Ymdyb3VwU2l6ZUNvbnRyb2wgPSBzdWJncm91cFNpemVDb250cm9sXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCAmIHNldENvbXB1dGVGdWxsU3ViZ3JvdXBzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbXB1dGVGdWxsU3ViZ3JvdXBzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb21wdXRlRnVsbFN1Ymdyb3VwcyA9IGNvbXB1dGVGdWxsU3ViZ3JvdXBzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzdWJncm91cFNpemVDb250cm9sID09IHJocy5zdWJncm91cFNpemVDb250cm9sICkKKyAgICAgICAgICAmJiAoIGNvbXB1dGVGdWxsU3ViZ3JvdXBzID09IHJocy5jb21wdXRlRnVsbFN1Ymdyb3VwcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3ViZ3JvdXBTaXplQ29udHJvbDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbXB1dGVGdWxsU3ViZ3JvdXBzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUKCB1aW50MzJfdCBtaW5TdWJncm91cFNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhTdWJncm91cFNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3MgcmVxdWlyZWRTdWJncm91cFNpemVTdGFnZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWluU3ViZ3JvdXBTaXplKCBtaW5TdWJncm91cFNpemVfICkKKyAgICAgICwgbWF4U3ViZ3JvdXBTaXplKCBtYXhTdWJncm91cFNpemVfICkKKyAgICAgICwgbWF4Q29tcHV0ZVdvcmtncm91cFN1Ymdyb3VwcyggbWF4Q29tcHV0ZVdvcmtncm91cFN1Ymdyb3Vwc18gKQorICAgICAgLCByZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlcyggcmVxdWlyZWRTdWJncm91cFNpemVTdGFnZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtaW5TdWJncm91cFNpemUgPT0gcmhzLm1pblN1Ymdyb3VwU2l6ZSApCisgICAgICAgICAgJiYgKCBtYXhTdWJncm91cFNpemUgPT0gcmhzLm1heFN1Ymdyb3VwU2l6ZSApCisgICAgICAgICAgJiYgKCBtYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzID09IHJocy5tYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzICkKKyAgICAgICAgICAmJiAoIHJlcXVpcmVkU3ViZ3JvdXBTaXplU3RhZ2VzID09IHJocy5yZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBtaW5TdWJncm91cFNpemU7CisgICAgdWludDMyX3QgbWF4U3ViZ3JvdXBTaXplOworICAgIHVpbnQzMl90IG1heENvbXB1dGVXb3JrZ3JvdXBTdWJncm91cHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3MgcmVxdWlyZWRTdWJncm91cFNpemVTdGFnZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUigpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdXJmYWNlKCBzdXJmYWNlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIoIFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgJiBzZXRTdXJmYWNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdXJmYWNlID0gc3VyZmFjZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3VyZmFjZSA9PSByaHMuc3VyZmFjZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRleGVsQnVmZmVyQWxpZ25tZW50XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHRleGVsQnVmZmVyQWxpZ25tZW50KCB0ZXhlbEJ1ZmZlckFsaWdubWVudF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgJiBzZXRUZXhlbEJ1ZmZlckFsaWdubWVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0ZXhlbEJ1ZmZlckFsaWdubWVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdGV4ZWxCdWZmZXJBbGlnbm1lbnQgPSB0ZXhlbEJ1ZmZlckFsaWdubWVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCB0ZXhlbEJ1ZmZlckFsaWdubWVudCA9PSByaHMudGV4ZWxCdWZmZXJBbGlnbm1lbnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGV4ZWxCdWZmZXJBbGlnbm1lbnQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzKCBzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlc18gKQorICAgICAgLCBzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCggc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnRfICkKKyAgICAgICwgdW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMoIHVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzXyApCisgICAgICAsIHVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50KCB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgPT0gcmhzLnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzICkKKyAgICAgICAgICAmJiAoIHN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50ID09IHJocy5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCApCisgICAgICAgICAgJiYgKCB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcyA9PSByaHMudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgKQorICAgICAgICAgICYmICggdW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQgPT0gcmhzLnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19IRFJfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19IRFIoIHRleHR1cmVDb21wcmVzc2lvbkFTVENfSERSXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQoIFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQgJiBzZXRUZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19IRFIgPSB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19IRFIgPT0gcmhzLnRleHR1cmVDb21wcmVzc2lvbkFTVENfSERSICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFzdGNIZHJGZWF0dXJlc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdGltZWxpbmVTZW1hcGhvcmVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdGltZWxpbmVTZW1hcGhvcmUoIHRpbWVsaW5lU2VtYXBob3JlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiggVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiAmIHNldFRpbWVsaW5lU2VtYXBob3JlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRpbWVsaW5lU2VtYXBob3JlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB0aW1lbGluZVNlbWFwaG9yZSA9IHRpbWVsaW5lU2VtYXBob3JlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHRpbWVsaW5lU2VtYXBob3JlID09IHJocy50aW1lbGluZVNlbWFwaG9yZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0aW1lbGluZVNlbWFwaG9yZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKCB1aW50NjRfdCBtYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZSggbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2VfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiggVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlID09IHJocy5tYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQ2NF90IG1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKCBzdGQ6OmFycmF5PGNoYXIsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU+IGNvbnN0JiBuYW1lXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGNoYXIsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU+IGNvbnN0JiB2ZXJzaW9uXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VG9vbFB1cnBvc2VGbGFnc0VYVCBwdXJwb3Nlc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VG9vbFB1cnBvc2VGbGFnc0VYVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRT4gY29uc3QmIGRlc2NyaXB0aW9uXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGNoYXIsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU+IGNvbnN0JiBsYXllcl8gPSB7IHsgMCB9IH0gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG5hbWV7fQorICAgICAgLCB2ZXJzaW9ue30KKyAgICAgICwgcHVycG9zZXMoIHB1cnBvc2VzXyApCisgICAgICAsIGRlc2NyaXB0aW9ue30KKyAgICAgICwgbGF5ZXJ7fQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8Y2hhcixWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRSxWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRT46OmNvcHkoIG5hbWUsIG5hbWVfICk7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGNoYXIsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkUsVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU+Ojpjb3B5KCB2ZXJzaW9uLCB2ZXJzaW9uXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxjaGFyLFZLX01BWF9ERVNDUklQVElPTl9TSVpFLFZLX01BWF9ERVNDUklQVElPTl9TSVpFPjo6Y29weSggZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxjaGFyLFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFLFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFPjo6Y29weSggbGF5ZXIsIGxheWVyXyApOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbWVtY21wKCBuYW1lLCByaHMubmFtZSwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkUgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtY21wKCB2ZXJzaW9uLCByaHMudmVyc2lvbiwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkUgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKQorICAgICAgICAgICYmICggcHVycG9zZXMgPT0gcmhzLnB1cnBvc2VzICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggZGVzY3JpcHRpb24sIHJocy5kZXNjcmlwdGlvbiwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtY21wKCBsYXllciwgcmhzLmxheWVyLCBWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRSAqIHNpemVvZiggY2hhciApICkgPT0gMCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBjaGFyIG5hbWVbVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkVdOworICAgIGNoYXIgdmVyc2lvbltWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRV07CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlRvb2xQdXJwb3NlRmxhZ3NFWFQgcHVycG9zZXM7CisgICAgY2hhciBkZXNjcmlwdGlvbltWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgY2hhciBsYXllcltWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRV07CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRyYW5zZm9ybUZlZWRiYWNrXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGdlb21ldHJ5U3RyZWFtc18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0cmFuc2Zvcm1GZWVkYmFjayggdHJhbnNmb3JtRmVlZGJhY2tfICkKKyAgICAgICwgZ2VvbWV0cnlTdHJlYW1zKCBnZW9tZXRyeVN0cmVhbXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUICYgc2V0VHJhbnNmb3JtRmVlZGJhY2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdHJhbnNmb3JtRmVlZGJhY2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHRyYW5zZm9ybUZlZWRiYWNrID0gdHJhbnNmb3JtRmVlZGJhY2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCAmIHNldEdlb21ldHJ5U3RyZWFtcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBnZW9tZXRyeVN0cmVhbXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGdlb21ldHJ5U3RyZWFtcyA9IGdlb21ldHJ5U3RyZWFtc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCB0cmFuc2Zvcm1GZWVkYmFjayA9PSByaHMudHJhbnNmb3JtRmVlZGJhY2sgKQorICAgICAgICAgICYmICggZ2VvbWV0cnlTdHJlYW1zID09IHJocy5nZW9tZXRyeVN0cmVhbXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdHJhbnNmb3JtRmVlZGJhY2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBnZW9tZXRyeVN0cmVhbXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUCisgIHsKKyAgICBQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCggdWludDMyX3QgbWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlclNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1EYXRhU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRyYW5zZm9ybUZlZWRiYWNrUXVlcmllc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtc0xpbmVzVHJpYW5nbGVzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdHJhbnNmb3JtRmVlZGJhY2tEcmF3XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtcyggbWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zXyApCisgICAgICAsIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyggbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzXyApCisgICAgICAsIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyU2l6ZSggbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplXyApCisgICAgICAsIG1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRGF0YVNpemUoIG1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRGF0YVNpemVfICkKKyAgICAgICwgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU2l6ZSggbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU2l6ZV8gKQorICAgICAgLCBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTdHJpZGUoIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZV8gKQorICAgICAgLCB0cmFuc2Zvcm1GZWVkYmFja1F1ZXJpZXMoIHRyYW5zZm9ybUZlZWRiYWNrUXVlcmllc18gKQorICAgICAgLCB0cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlcyggdHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zTGluZXNUcmlhbmdsZXNfICkKKyAgICAgICwgdHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0KCB0cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3RfICkKKyAgICAgICwgdHJhbnNmb3JtRmVlZGJhY2tEcmF3KCB0cmFuc2Zvcm1GZWVkYmFja0RyYXdfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCggVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtcyA9PSByaHMubWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zICkKKyAgICAgICAgICAmJiAoIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyA9PSByaHMubWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzICkKKyAgICAgICAgICAmJiAoIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyU2l6ZSA9PSByaHMubWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplICkKKyAgICAgICAgICAmJiAoIG1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRGF0YVNpemUgPT0gcmhzLm1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRGF0YVNpemUgKQorICAgICAgICAgICYmICggbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU2l6ZSA9PSByaHMubWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU2l6ZSApCisgICAgICAgICAgJiYgKCBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTdHJpZGUgPT0gcmhzLm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZSApCisgICAgICAgICAgJiYgKCB0cmFuc2Zvcm1GZWVkYmFja1F1ZXJpZXMgPT0gcmhzLnRyYW5zZm9ybUZlZWRiYWNrUXVlcmllcyApCisgICAgICAgICAgJiYgKCB0cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlcyA9PSByaHMudHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zTGluZXNUcmlhbmdsZXMgKQorICAgICAgICAgICYmICggdHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0ID09IHJocy50cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3QgKQorICAgICAgICAgICYmICggdHJhbnNmb3JtRmVlZGJhY2tEcmF3ID09IHJocy50cmFuc2Zvcm1GZWVkYmFja0RyYXcgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXM7CisgICAgdWludDMyX3QgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbURhdGFTaXplOworICAgIHVpbnQzMl90IG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVNpemU7CisgICAgdWludDMyX3QgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU3RyaWRlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zTGluZXNUcmlhbmdsZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3Q7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB0cmFuc2Zvcm1GZWVkYmFja0RyYXc7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dCggdW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiApIC0gb2Zmc2V0b2YoIFBoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSICYgc2V0VW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0ID0gdW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0ID09IHJocy51bmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB1bmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiApID09IHNpemVvZiggVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlcl8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHZhcmlhYmxlUG9pbnRlcnNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXIoIHZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyXyApCisgICAgICAsIHZhcmlhYmxlUG9pbnRlcnMoIHZhcmlhYmxlUG9pbnRlcnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyggVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyAmIHNldFZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlciA9IHZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyAmIHNldFZhcmlhYmxlUG9pbnRlcnMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmFyaWFibGVQb2ludGVyc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmFyaWFibGVQb2ludGVycyA9IHZhcmlhYmxlUG9pbnRlcnNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyID09IHJocy52YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlciApCisgICAgICAgICAgJiYgKCB2YXJpYWJsZVBvaW50ZXJzID09IHJocy52YXJpYWJsZVBvaW50ZXJzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlczsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHZhcmlhYmxlUG9pbnRlcnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3JfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvciggdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvcl8gKQorICAgICAgLCB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvciggdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3JfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCggVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCAmIHNldFZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvciA9IHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3JfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICYgc2V0VmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3JfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yID0gdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3JfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IgPT0gcmhzLnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IgKQorICAgICAgICAgICYmICggdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3IgPT0gcmhzLnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3I7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQKKyAgeworICAgIFBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQoIHVpbnQzMl90IG1heFZlcnRleEF0dHJpYkRpdmlzb3JfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWF4VmVydGV4QXR0cmliRGl2aXNvciggbWF4VmVydGV4QXR0cmliRGl2aXNvcl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgKSAtIG9mZnNldG9mKCBQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCggVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIG1heFZlcnRleEF0dHJpYkRpdmlzb3IgPT0gcmhzLm1heFZlcnRleEF0dHJpYkRpdmlzb3IgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWF4VmVydGV4QXR0cmliRGl2aXNvcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdnVsa2FuTWVtb3J5TW9kZWxfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnNfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdnVsa2FuTWVtb3J5TW9kZWwoIHZ1bGthbk1lbW9yeU1vZGVsXyApCisgICAgICAsIHZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGUoIHZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGVfICkKKyAgICAgICwgdnVsa2FuTWVtb3J5TW9kZWxBdmFpbGFiaWxpdHlWaXNpYmlsaXR5Q2hhaW5zKCB2dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKCBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFImIG9wZXJhdG9yPSggVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSICYgc2V0VnVsa2FuTWVtb3J5TW9kZWwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdnVsa2FuTWVtb3J5TW9kZWxfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZ1bGthbk1lbW9yeU1vZGVsID0gdnVsa2FuTWVtb3J5TW9kZWxfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiAmIHNldFZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZSA9IHZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiAmIHNldFZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWlucyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWlucyA9IHZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWluc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCB2dWxrYW5NZW1vcnlNb2RlbCA9PSByaHMudnVsa2FuTWVtb3J5TW9kZWwgKQorICAgICAgICAgICYmICggdnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZSA9PSByaHMudnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZSApCisgICAgICAgICAgJiYgKCB2dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnMgPT0gcmhzLnZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWlucyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2dWxrYW5NZW1vcnlNb2RlbDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSICkgPT0gc2l6ZW9mKCBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB5Y2JjckltYWdlQXJyYXlzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHljYmNySW1hZ2VBcnJheXMoIHljYmNySW1hZ2VBcnJheXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUICkgLSBvZmZzZXRvZiggUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCggVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUICYgc2V0UE5leHQoIHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCAmIHNldFljYmNySW1hZ2VBcnJheXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgeWNiY3JJbWFnZUFycmF5c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgeWNiY3JJbWFnZUFycmF5cyA9IHljYmNySW1hZ2VBcnJheXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHljYmNySW1hZ2VBcnJheXMgPT0gcmhzLnljYmNySW1hZ2VBcnJheXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHljYmNySW1hZ2VBcnJheXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgKSA9PSBzaXplb2YoIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGVDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0aWFsRGF0YVNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcEluaXRpYWxEYXRhXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBpbml0aWFsRGF0YVNpemUoIGluaXRpYWxEYXRhU2l6ZV8gKQorICAgICAgLCBwSW5pdGlhbERhdGEoIHBJbml0aWFsRGF0YV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvICYgc2V0SW5pdGlhbERhdGFTaXplKCBzaXplX3QgaW5pdGlhbERhdGFTaXplXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbml0aWFsRGF0YVNpemUgPSBpbml0aWFsRGF0YVNpemVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvICYgc2V0UEluaXRpYWxEYXRhKCBjb25zdCB2b2lkKiBwSW5pdGlhbERhdGFfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBJbml0aWFsRGF0YSA9IHBJbml0aWFsRGF0YV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGluaXRpYWxEYXRhU2l6ZSA9PSByaHMuaW5pdGlhbERhdGFTaXplICkKKyAgICAgICAgICAmJiAoIHBJbml0aWFsRGF0YSA9PSByaHMucEluaXRpYWxEYXRhICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICBzaXplX3QgaW5pdGlhbERhdGFTaXplOworICAgIGNvbnN0IHZvaWQqIHBJbml0aWFsRGF0YTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNyY1ByZW11bHRpcGxpZWRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkc3RQcmVtdWx0aXBsaWVkXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZE92ZXJsYXBFWFQgYmxlbmRPdmVybGFwXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCbGVuZE92ZXJsYXBFWFQ6OmVVbmNvcnJlbGF0ZWQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNyY1ByZW11bHRpcGxpZWQoIHNyY1ByZW11bHRpcGxpZWRfICkKKyAgICAgICwgZHN0UHJlbXVsdGlwbGllZCggZHN0UHJlbXVsdGlwbGllZF8gKQorICAgICAgLCBibGVuZE92ZXJsYXAoIGJsZW5kT3ZlcmxhcF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgKSAtIG9mZnNldG9mKCBQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKCBWa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0U3JjUHJlbXVsdGlwbGllZCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcmNQcmVtdWx0aXBsaWVkXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcmNQcmVtdWx0aXBsaWVkID0gc3JjUHJlbXVsdGlwbGllZF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXREc3RQcmVtdWx0aXBsaWVkKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRzdFByZW11bHRpcGxpZWRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdFByZW11bHRpcGxpZWQgPSBkc3RQcmVtdWx0aXBsaWVkXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCAmIHNldEJsZW5kT3ZlcmxhcCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJsZW5kT3ZlcmxhcEVYVCBibGVuZE92ZXJsYXBfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJsZW5kT3ZlcmxhcCA9IGJsZW5kT3ZlcmxhcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3JjUHJlbXVsdGlwbGllZCA9PSByaHMuc3JjUHJlbXVsdGlwbGllZCApCisgICAgICAgICAgJiYgKCBkc3RQcmVtdWx0aXBsaWVkID09IHJocy5kc3RQcmVtdWx0aXBsaWVkICkKKyAgICAgICAgICAmJiAoIGJsZW5kT3ZlcmxhcCA9PSByaHMuYmxlbmRPdmVybGFwICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzcmNQcmVtdWx0aXBsaWVkOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZHN0UHJlbXVsdGlwbGllZDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmxlbmRPdmVybGFwRVhUIGJsZW5kT3ZlcmxhcDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1ECisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdzQU1EIGNvbXBpbGVyQ29udHJvbEZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdzQU1EKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGNvbXBpbGVyQ29udHJvbEZsYWdzKCBjb21waWxlckNvbnRyb2xGbGFnc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgKSAtIG9mZnNldG9mKCBQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQoIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgJiBzZXRDb21waWxlckNvbnRyb2xGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ29tcGlsZXJDb250cm9sRmxhZ3NBTUQgY29tcGlsZXJDb250cm9sRmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbXBpbGVyQ29udHJvbEZsYWdzID0gY29tcGlsZXJDb250cm9sRmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggY29tcGlsZXJDb250cm9sRmxhZ3MgPT0gcmhzLmNvbXBpbGVyQ29udHJvbEZsYWdzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb21waWxlckNvbnRyb2xGbGFnc0FNRCBjb21waWxlckNvbnRyb2xGbGFnczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgKSA9PSBzaXplb2YoIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVGbGFnc05WIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlRmxhZ3NOVigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYgY292ZXJhZ2VNb2R1bGF0aW9uTW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q292ZXJhZ2VNb2R1bGF0aW9uTW9kZU5WOjplTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGVfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGNvdmVyYWdlTW9kdWxhdGlvbk1vZGUoIGNvdmVyYWdlTW9kdWxhdGlvbk1vZGVfICkKKyAgICAgICwgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGUoIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlXyApCisgICAgICAsIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnQoIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnRfICkKKyAgICAgICwgcENvdmVyYWdlTW9kdWxhdGlvblRhYmxlKCBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WICkgLSBvZmZzZXRvZiggUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYoIFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVGbGFnc05WIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WICYgc2V0Q292ZXJhZ2VNb2R1bGF0aW9uTW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvdmVyYWdlTW9kdWxhdGlvbk1vZGVOViBjb3ZlcmFnZU1vZHVsYXRpb25Nb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb3ZlcmFnZU1vZHVsYXRpb25Nb2RlID0gY292ZXJhZ2VNb2R1bGF0aW9uTW9kZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViAmIHNldENvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZSA9IGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WICYgc2V0Q292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCggdWludDMyX3QgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCA9IGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRQQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUoIGNvbnN0IGZsb2F0KiBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSA9IHBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBjb3ZlcmFnZU1vZHVsYXRpb25Nb2RlID09IHJocy5jb3ZlcmFnZU1vZHVsYXRpb25Nb2RlICkKKyAgICAgICAgICAmJiAoIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlID09IHJocy5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZSApCisgICAgICAgICAgJiYgKCBjb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50ID09IHJocy5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSA9PSByaHMucENvdmVyYWdlTW9kdWxhdGlvblRhYmxlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlY7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlRmxhZ3NOViBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q292ZXJhZ2VNb2R1bGF0aW9uTW9kZU5WIGNvdmVyYWdlTW9kdWxhdGlvbk1vZGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZTsKKyAgICB1aW50MzJfdCBjb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50OworICAgIGNvbnN0IGZsb2F0KiBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViApID09IHNpemVvZiggVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlRmxhZ3NOViBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlRmxhZ3NOVigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvdmVyYWdlUmVkdWN0aW9uTW9kZU5WIGNvdmVyYWdlUmVkdWN0aW9uTW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlY6OmVNZXJnZSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGNvdmVyYWdlUmVkdWN0aW9uTW9kZSggY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViggVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlRmxhZ3NOViBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WICYgc2V0Q292ZXJhZ2VSZWR1Y3Rpb25Nb2RlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlYgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb3ZlcmFnZVJlZHVjdGlvbk1vZGUgPSBjb3ZlcmFnZVJlZHVjdGlvbk1vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGNvdmVyYWdlUmVkdWN0aW9uTW9kZSA9PSByaHMuY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlRmxhZ3NOViBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlYgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViApID09IHNpemVvZiggVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUZsYWdzTlYgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVGbGFnc05WKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb3ZlcmFnZVRvQ29sb3JFbmFibGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgY292ZXJhZ2VUb0NvbG9yRW5hYmxlKCBjb3ZlcmFnZVRvQ29sb3JFbmFibGVfICkKKyAgICAgICwgY292ZXJhZ2VUb0NvbG9yTG9jYXRpb24oIGNvdmVyYWdlVG9Db2xvckxvY2F0aW9uXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WKCBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlRmxhZ3NOViBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViAmIHNldENvdmVyYWdlVG9Db2xvckVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb3ZlcmFnZVRvQ29sb3JFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvdmVyYWdlVG9Db2xvckVuYWJsZSA9IGNvdmVyYWdlVG9Db2xvckVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViAmIHNldENvdmVyYWdlVG9Db2xvckxvY2F0aW9uKCB1aW50MzJfdCBjb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY292ZXJhZ2VUb0NvbG9yTG9jYXRpb24gPSBjb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBjb3ZlcmFnZVRvQ29sb3JFbmFibGUgPT0gcmhzLmNvdmVyYWdlVG9Db2xvckVuYWJsZSApCisgICAgICAgICAgJiYgKCBjb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbiA9PSByaHMuY292ZXJhZ2VUb0NvbG9yTG9jYXRpb24gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVGbGFnc05WIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY292ZXJhZ2VUb0NvbG9yRW5hYmxlOworICAgIHVpbnQzMl90IGNvdmVyYWdlVG9Db2xvckxvY2F0aW9uOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgKSA9PSBzaXplb2YoIFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQKKyAgeworICAgIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnc0VYVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb25fID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGR1cmF0aW9uKCBkdXJhdGlvbl8gKQorICAgIHt9CisKKyAgICBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQoIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGR1cmF0aW9uID09IHJocy5kdXJhdGlvbiApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnc0VYVCBmbGFnczsKKyAgICB1aW50NjRfdCBkdXJhdGlvbjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQgKSA9PSBzaXplb2YoIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCogcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUKiBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2soIHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tfICkKKyAgICAgICwgcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCggcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudF8gKQorICAgICAgLCBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzKCBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUICYgc2V0UFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCogcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9IHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgJiBzZXRQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50KCB1aW50MzJfdCBwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ID0gcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCAmIHNldFBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQqIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgPSBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9PSByaHMucFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayApCisgICAgICAgICAgJiYgKCBwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ID09IHJocy5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ICkKKyAgICAgICAgICAmJiAoIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgPT0gcmhzLnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCogcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjazsKKyAgICB1aW50MzJfdCBwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQqIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVGbGFnc0VYVCBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVGbGFnc0VYVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc2NhcmRSZWN0YW5nbGVNb2RlRVhUIGRpc2NhcmRSZWN0YW5nbGVNb2RlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVDo6ZUluY2x1c2l2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpc2NhcmRSZWN0YW5nbGVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCogcERpc2NhcmRSZWN0YW5nbGVzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBkaXNjYXJkUmVjdGFuZ2xlTW9kZSggZGlzY2FyZFJlY3RhbmdsZU1vZGVfICkKKyAgICAgICwgZGlzY2FyZFJlY3RhbmdsZUNvdW50KCBkaXNjYXJkUmVjdGFuZ2xlQ291bnRfICkKKyAgICAgICwgcERpc2NhcmRSZWN0YW5nbGVzKCBwRGlzY2FyZFJlY3RhbmdsZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUICkgLSBvZmZzZXRvZiggUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKCBWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUZsYWdzRVhUIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXREaXNjYXJkUmVjdGFuZ2xlTW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc2NhcmRSZWN0YW5nbGVNb2RlRVhUIGRpc2NhcmRSZWN0YW5nbGVNb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkaXNjYXJkUmVjdGFuZ2xlTW9kZSA9IGRpc2NhcmRSZWN0YW5nbGVNb2RlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXREaXNjYXJkUmVjdGFuZ2xlQ291bnQoIHVpbnQzMl90IGRpc2NhcmRSZWN0YW5nbGVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50ID0gZGlzY2FyZFJlY3RhbmdsZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXRQRGlzY2FyZFJlY3RhbmdsZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQqIHBEaXNjYXJkUmVjdGFuZ2xlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcERpc2NhcmRSZWN0YW5nbGVzID0gcERpc2NhcmRSZWN0YW5nbGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBkaXNjYXJkUmVjdGFuZ2xlTW9kZSA9PSByaHMuZGlzY2FyZFJlY3RhbmdsZU1vZGUgKQorICAgICAgICAgICYmICggZGlzY2FyZFJlY3RhbmdsZUNvdW50ID09IHJocy5kaXNjYXJkUmVjdGFuZ2xlQ291bnQgKQorICAgICAgICAgICYmICggcERpc2NhcmRSZWN0YW5nbGVzID09IHJocy5wRGlzY2FyZFJlY3RhbmdsZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUZsYWdzRVhUIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVCBkaXNjYXJkUmVjdGFuZ2xlTW9kZTsKKyAgICB1aW50MzJfdCBkaXNjYXJkUmVjdGFuZ2xlQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCogcERpc2NhcmRSZWN0YW5nbGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhlY3V0YWJsZUluZGV4XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBpcGVsaW5lKCBwaXBlbGluZV8gKQorICAgICAgLCBleGVjdXRhYmxlSW5kZXgoIGV4ZWN1dGFibGVJbmRleF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgKSAtIG9mZnNldG9mKCBQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiggVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFImIG9wZXJhdG9yPSggVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmIHNldFBpcGVsaW5lKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBpcGVsaW5lID0gcGlwZWxpbmVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgJiBzZXRFeGVjdXRhYmxlSW5kZXgoIHVpbnQzMl90IGV4ZWN1dGFibGVJbmRleF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZXhlY3V0YWJsZUluZGV4ID0gZXhlY3V0YWJsZUluZGV4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcGlwZWxpbmUgPT0gcmhzLnBpcGVsaW5lICkKKyAgICAgICAgICAmJiAoIGV4ZWN1dGFibGVJbmRleCA9PSByaHMuZXhlY3V0YWJsZUluZGV4ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSBwaXBlbGluZTsKKyAgICB1aW50MzJfdCBleGVjdXRhYmxlSW5kZXg7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiApID09IHNpemVvZiggVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIKKyAgeworICAgIFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIoIHN0ZDo6YXJyYXk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRT4gY29uc3QmIG5hbWVfID0geyB7IDAgfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRT4gY29uc3QmIGRlc2NyaXB0aW9uXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGlzVGV4dF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhU2l6ZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG5hbWV7fQorICAgICAgLCBkZXNjcmlwdGlvbnt9CisgICAgICAsIGlzVGV4dCggaXNUZXh0XyApCisgICAgICAsIGRhdGFTaXplKCBkYXRhU2l6ZV8gKQorICAgICAgLCBwRGF0YSggcERhdGFfICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGNoYXIsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU+Ojpjb3B5KCBuYW1lLCBuYW1lXyApOworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxjaGFyLFZLX01BWF9ERVNDUklQVElPTl9TSVpFLFZLX01BWF9ERVNDUklQVElPTl9TSVpFPjo6Y29weSggZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uXyApOworICAgIH0KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKCBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggbWVtY21wKCBuYW1lLCByaHMubmFtZSwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKQorICAgICAgICAgICYmICggbWVtY21wKCBkZXNjcmlwdGlvbiwgcmhzLmRlc2NyaXB0aW9uLCBWS19NQVhfREVTQ1JJUFRJT05fU0laRSAqIHNpemVvZiggY2hhciApICkgPT0gMCApCisgICAgICAgICAgJiYgKCBpc1RleHQgPT0gcmhzLmlzVGV4dCApCisgICAgICAgICAgJiYgKCBkYXRhU2l6ZSA9PSByaHMuZGF0YVNpemUgKQorICAgICAgICAgICYmICggcERhdGEgPT0gcmhzLnBEYXRhICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFI7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIGNoYXIgbmFtZVtWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgY2hhciBkZXNjcmlwdGlvbltWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBpc1RleHQ7CisgICAgc2l6ZV90IGRhdGFTaXplOworICAgIHZvaWQqIHBEYXRhOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIgKSA9PSBzaXplb2YoIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSCisgIHsKKyAgICBQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzdGFnZXNfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGNoYXIsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU+IGNvbnN0JiBuYW1lXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGNoYXIsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU+IGNvbnN0JiBkZXNjcmlwdGlvbl8gPSB7IHsgMCB9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3ViZ3JvdXBTaXplXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN0YWdlcyggc3RhZ2VzXyApCisgICAgICAsIG5hbWV7fQorICAgICAgLCBkZXNjcmlwdGlvbnt9CisgICAgICAsIHN1Ymdyb3VwU2l6ZSggc3ViZ3JvdXBTaXplXyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbnN0RXhwcmVzc2lvbkFycmF5Q29weTxjaGFyLFZLX01BWF9ERVNDUklQVElPTl9TSVpFLFZLX01BWF9ERVNDUklQVElPTl9TSVpFPjo6Y29weSggbmFtZSwgbmFtZV8gKTsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRSxWS19NQVhfREVTQ1JJUFRJT05fU0laRT46OmNvcHkoIGRlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbl8gKTsKKyAgICB9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgKSAtIG9mZnNldG9mKCBQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiggVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFImIG9wZXJhdG9yPSggVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN0YWdlcyA9PSByaHMuc3RhZ2VzICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggbmFtZSwgcmhzLm5hbWUsIFZLX01BWF9ERVNDUklQVElPTl9TSVpFICogc2l6ZW9mKCBjaGFyICkgKSA9PSAwICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggZGVzY3JpcHRpb24sIHJocy5kZXNjcmlwdGlvbiwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUgKiBzaXplb2YoIGNoYXIgKSApID09IDAgKQorICAgICAgICAgICYmICggc3ViZ3JvdXBTaXplID09IHJocy5zdWJncm91cFNpemUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VzOworICAgIGNoYXIgbmFtZVtWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgY2hhciBkZXNjcmlwdGlvbltWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgdWludDMyX3Qgc3ViZ3JvdXBTaXplOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgKSA9PSBzaXplb2YoIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHVuaW9uIFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSCisgIHsKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSIGNvbnN0JigpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljVmFsdWVLSFIqPih0aGlzKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSICYoKQorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSKj4odGhpcyk7CisgICAgfQorCisjaWZkZWYgVlVMS0FOX0hQUF9IQVNfVU5SRVNUUklDVEVEX1VOSU9OUworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYjMyOworICAgIGludDY0X3QgaTY0OworICAgIHVpbnQ2NF90IHU2NDsKKyAgICBkb3VibGUgZjY0OworI2Vsc2UKKyAgICBWa0Jvb2wzMiBiMzI7CisgICAgaW50NjRfdCBpNjQ7CisgICAgdWludDY0X3QgdTY0OworICAgIGRvdWJsZSBmNjQ7CisjZW5kaWYgIC8qVlVMS0FOX0hQUF9IQVNfVU5SRVNUUklDVEVEX1VOSU9OUyovCisgIH07CisKKyAgc3RydWN0IFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUgorICB7CisgICAgUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKCBzdGQ6OmFycmF5PGNoYXIsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU+IGNvbnN0JiBuYW1lXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRT4gY29uc3QmIGRlc2NyaXB0aW9uXyA9IHsgeyAwIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNGb3JtYXRLSFIgZm9ybWF0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNGb3JtYXRLSFI6OmVCb29sMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljVmFsdWVLSFIgdmFsdWVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG5hbWV7fQorICAgICAgLCBkZXNjcmlwdGlvbnt9CisgICAgICAsIGZvcm1hdCggZm9ybWF0XyApCisgICAgICAsIHZhbHVlKCB2YWx1ZV8gKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zdEV4cHJlc3Npb25BcnJheUNvcHk8Y2hhcixWS19NQVhfREVTQ1JJUFRJT05fU0laRSxWS19NQVhfREVTQ1JJUFRJT05fU0laRT46OmNvcHkoIG5hbWUsIG5hbWVfICk7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PGNoYXIsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUsVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU+Ojpjb3B5KCBkZXNjcmlwdGlvbiwgZGVzY3JpcHRpb25fICk7CisgICAgfQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSICkgLSBvZmZzZXRvZiggUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKCBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFImIG9wZXJhdG9yPSggVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgY2hhciBuYW1lW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBjaGFyIGRlc2NyaXB0aW9uW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljRm9ybWF0S0hSIGZvcm1hdDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljVmFsdWVLSFIgdmFsdWU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHBpcGVsaW5lKCBwaXBlbGluZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUluZm9LSFIgKSAtIG9mZnNldG9mKCBQaXBlbGluZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUluZm9LSFIoIFZrUGlwZWxpbmVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lSW5mb0tIUiYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUluZm9LSFIgJiBzZXRQaXBlbGluZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwaXBlbGluZSA9IHBpcGVsaW5lXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHBpcGVsaW5lID09IHJocy5waXBlbGluZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGlwZWxpbmVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lSW5mb0tIUiApID09IHNpemVvZiggVmtQaXBlbGluZUluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGlwZWxpbmVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQdXNoQ29uc3RhbnRSYW5nZQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUHVzaENvbnN0YW50UmFuZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzIHN0YWdlRmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc3RhZ2VGbGFncyggc3RhZ2VGbGFnc18gKQorICAgICAgLCBvZmZzZXQoIG9mZnNldF8gKQorICAgICAgLCBzaXplKCBzaXplXyApCisgICAge30KKworICAgIFB1c2hDb25zdGFudFJhbmdlKCBWa1B1c2hDb25zdGFudFJhbmdlIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFB1c2hDb25zdGFudFJhbmdlJiBvcGVyYXRvcj0oIFZrUHVzaENvbnN0YW50UmFuZ2UgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHVzaENvbnN0YW50UmFuZ2UgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHVzaENvbnN0YW50UmFuZ2UgJiBzZXRTdGFnZUZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdGFnZUZsYWdzID0gc3RhZ2VGbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHVzaENvbnN0YW50UmFuZ2UgJiBzZXRPZmZzZXQoIHVpbnQzMl90IG9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgb2Zmc2V0ID0gb2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQdXNoQ29uc3RhbnRSYW5nZSAmIHNldFNpemUoIHVpbnQzMl90IHNpemVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNpemUgPSBzaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1B1c2hDb25zdGFudFJhbmdlIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQdXNoQ29uc3RhbnRSYW5nZSo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQdXNoQ29uc3RhbnRSYW5nZSAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1B1c2hDb25zdGFudFJhbmdlKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFB1c2hDb25zdGFudFJhbmdlIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc3RhZ2VGbGFncyA9PSByaHMuc3RhZ2VGbGFncyApCisgICAgICAgICAgJiYgKCBvZmZzZXQgPT0gcmhzLm9mZnNldCApCisgICAgICAgICAgJiYgKCBzaXplID09IHJocy5zaXplICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQdXNoQ29uc3RhbnRSYW5nZSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzOworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICB1aW50MzJfdCBzaXplOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFB1c2hDb25zdGFudFJhbmdlICkgPT0gc2l6ZW9mKCBWa1B1c2hDb25zdGFudFJhbmdlICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFB1c2hDb25zdGFudFJhbmdlPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZUxheW91dENyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0Q3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0Q3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNldExheW91dENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dHNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHB1c2hDb25zdGFudFJhbmdlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQdXNoQ29uc3RhbnRSYW5nZSogcFB1c2hDb25zdGFudFJhbmdlc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgc2V0TGF5b3V0Q291bnQoIHNldExheW91dENvdW50XyApCisgICAgICAsIHBTZXRMYXlvdXRzKCBwU2V0TGF5b3V0c18gKQorICAgICAgLCBwdXNoQ29uc3RhbnRSYW5nZUNvdW50KCBwdXNoQ29uc3RhbnRSYW5nZUNvdW50XyApCisgICAgICAsIHBQdXNoQ29uc3RhbnRSYW5nZXMoIHBQdXNoQ29uc3RhbnRSYW5nZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZUxheW91dENyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dENyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUxheW91dENyZWF0ZUluZm8gJiBzZXRTZXRMYXlvdXRDb3VudCggdWludDMyX3Qgc2V0TGF5b3V0Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNldExheW91dENvdW50ID0gc2V0TGF5b3V0Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyAmIHNldFBTZXRMYXlvdXRzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBTZXRMYXlvdXRzID0gcFNldExheW91dHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyAmIHNldFB1c2hDb25zdGFudFJhbmdlQ291bnQoIHVpbnQzMl90IHB1c2hDb25zdGFudFJhbmdlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHB1c2hDb25zdGFudFJhbmdlQ291bnQgPSBwdXNoQ29uc3RhbnRSYW5nZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZUxheW91dENyZWF0ZUluZm8gJiBzZXRQUHVzaENvbnN0YW50UmFuZ2VzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHVzaENvbnN0YW50UmFuZ2UqIHBQdXNoQ29uc3RhbnRSYW5nZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBQdXNoQ29uc3RhbnRSYW5nZXMgPSBwUHVzaENvbnN0YW50UmFuZ2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZUxheW91dENyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBzZXRMYXlvdXRDb3VudCA9PSByaHMuc2V0TGF5b3V0Q291bnQgKQorICAgICAgICAgICYmICggcFNldExheW91dHMgPT0gcmhzLnBTZXRMYXlvdXRzICkKKyAgICAgICAgICAmJiAoIHB1c2hDb25zdGFudFJhbmdlQ291bnQgPT0gcmhzLnB1c2hDb25zdGFudFJhbmdlQ291bnQgKQorICAgICAgICAgICYmICggcFB1c2hDb25zdGFudFJhbmdlcyA9PSByaHMucFB1c2hDb25zdGFudFJhbmdlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0Q3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3Qgc2V0TGF5b3V0Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXQqIHBTZXRMYXlvdXRzOworICAgIHVpbnQzMl90IHB1c2hDb25zdGFudFJhbmdlQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlB1c2hDb25zdGFudFJhbmdlKiBwUHVzaENvbnN0YW50UmFuZ2VzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyApID09IHNpemVvZiggVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlRmxhZ3NFWFQgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlRmxhZ3NFWFQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVCBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVFWFQ6OmVEaXNhYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZSggY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVfICkKKyAgICAgICwgZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemUoIGV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCggVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVGbGFnc0VYVCBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0Q29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVCBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGUgPSBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0RXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemUoIGZsb2F0IGV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSA9IGV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZSA9PSByaHMuY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGUgKQorICAgICAgICAgICYmICggZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemUgPT0gcmhzLmV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVGbGFnc0VYVCBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVFWFQgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGU7CisgICAgZmxvYXQgZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVGbGFnc0VYVCBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVGbGFnc0VYVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aENsaXBFbmFibGVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGRlcHRoQ2xpcEVuYWJsZSggZGVwdGhDbGlwRW5hYmxlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCggVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVGbGFnc0VYVCBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0RGVwdGhDbGlwRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGRlcHRoQ2xpcEVuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwdGhDbGlwRW5hYmxlID0gZGVwdGhDbGlwRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBkZXB0aENsaXBFbmFibGUgPT0gcmhzLmRlcHRoQ2xpcEVuYWJsZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlRmxhZ3NFWFQgZmxhZ3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBkZXB0aENsaXBFbmFibGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpMaW5lUmFzdGVyaXphdGlvbk1vZGVFWFQgbGluZVJhc3Rlcml6YXRpb25Nb2RlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpMaW5lUmFzdGVyaXphdGlvbk1vZGVFWFQ6OmVEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3RpcHBsZWRMaW5lRW5hYmxlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZVN0aXBwbGVGYWN0b3JfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsaW5lU3RpcHBsZVBhdHRlcm5fID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbGluZVJhc3Rlcml6YXRpb25Nb2RlKCBsaW5lUmFzdGVyaXphdGlvbk1vZGVfICkKKyAgICAgICwgc3RpcHBsZWRMaW5lRW5hYmxlKCBzdGlwcGxlZExpbmVFbmFibGVfICkKKyAgICAgICwgbGluZVN0aXBwbGVGYWN0b3IoIGxpbmVTdGlwcGxlRmFjdG9yXyApCisgICAgICAsIGxpbmVTdGlwcGxlUGF0dGVybiggbGluZVN0aXBwbGVQYXR0ZXJuXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUKCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0TGluZVJhc3Rlcml6YXRpb25Nb2RlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIGxpbmVSYXN0ZXJpemF0aW9uTW9kZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbGluZVJhc3Rlcml6YXRpb25Nb2RlID0gbGluZVJhc3Rlcml6YXRpb25Nb2RlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0U3RpcHBsZWRMaW5lRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0aXBwbGVkTGluZUVuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3RpcHBsZWRMaW5lRW5hYmxlID0gc3RpcHBsZWRMaW5lRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0TGluZVN0aXBwbGVGYWN0b3IoIHVpbnQzMl90IGxpbmVTdGlwcGxlRmFjdG9yXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBsaW5lU3RpcHBsZUZhY3RvciA9IGxpbmVTdGlwcGxlRmFjdG9yXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0TGluZVN0aXBwbGVQYXR0ZXJuKCB1aW50MTZfdCBsaW5lU3RpcHBsZVBhdHRlcm5fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGxpbmVTdGlwcGxlUGF0dGVybiA9IGxpbmVTdGlwcGxlUGF0dGVybl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGxpbmVSYXN0ZXJpemF0aW9uTW9kZSA9PSByaHMubGluZVJhc3Rlcml6YXRpb25Nb2RlICkKKyAgICAgICAgICAmJiAoIHN0aXBwbGVkTGluZUVuYWJsZSA9PSByaHMuc3RpcHBsZWRMaW5lRW5hYmxlICkKKyAgICAgICAgICAmJiAoIGxpbmVTdGlwcGxlRmFjdG9yID09IHJocy5saW5lU3RpcHBsZUZhY3RvciApCisgICAgICAgICAgJiYgKCBsaW5lU3RpcHBsZVBhdHRlcm4gPT0gcmhzLmxpbmVTdGlwcGxlUGF0dGVybiApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIGxpbmVSYXN0ZXJpemF0aW9uTW9kZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN0aXBwbGVkTGluZUVuYWJsZTsKKyAgICB1aW50MzJfdCBsaW5lU3RpcHBsZUZhY3RvcjsKKyAgICB1aW50MTZfdCBsaW5lU3RpcHBsZVBhdHRlcm47CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1ECisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJhc3Rlcml6YXRpb25PcmRlckFNRCByYXN0ZXJpemF0aW9uT3JkZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJhc3Rlcml6YXRpb25PcmRlckFNRDo6ZVN0cmljdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcmFzdGVyaXphdGlvbk9yZGVyKCByYXN0ZXJpemF0aW9uT3JkZXJfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EICkgLSBvZmZzZXRvZiggUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCggVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCAmIHNldFJhc3Rlcml6YXRpb25PcmRlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJhc3Rlcml6YXRpb25PcmRlckFNRCByYXN0ZXJpemF0aW9uT3JkZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJhc3Rlcml6YXRpb25PcmRlciA9IHJhc3Rlcml6YXRpb25PcmRlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcmFzdGVyaXphdGlvbk9yZGVyID09IHJocy5yYXN0ZXJpemF0aW9uT3JkZXIgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmFzdGVyaXphdGlvbk9yZGVyQU1EIHJhc3Rlcml6YXRpb25PcmRlcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCApID09IHNpemVvZiggVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUZsYWdzRVhUIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUZsYWdzRVhUKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYXN0ZXJpemF0aW9uU3RyZWFtXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCByYXN0ZXJpemF0aW9uU3RyZWFtKCByYXN0ZXJpemF0aW9uU3RyZWFtXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCggVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVGbGFnc0VYVCBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUICYgc2V0UmFzdGVyaXphdGlvblN0cmVhbSggdWludDMyX3QgcmFzdGVyaXphdGlvblN0cmVhbV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmFzdGVyaXphdGlvblN0cmVhbSA9IHJhc3Rlcml6YXRpb25TdHJlYW1fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHJhc3Rlcml6YXRpb25TdHJlYW0gPT0gcmhzLnJhc3Rlcml6YXRpb25TdHJlYW0gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUZsYWdzRVhUIGZsYWdzOworICAgIHVpbnQzMl90IHJhc3Rlcml6YXRpb25TdHJlYW07CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RW5hYmxlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RW5hYmxlKCByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgKSAtIG9mZnNldG9mKCBQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYoIFZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGUgPSByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZSA9PSByaHMucmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlY7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzYW1wbGVMb2NhdGlvbnNFbmFibGVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQgc2FtcGxlTG9jYXRpb25zSW5mb18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlTG9jYXRpb25zSW5mb0VYVCgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzYW1wbGVMb2NhdGlvbnNFbmFibGUoIHNhbXBsZUxvY2F0aW9uc0VuYWJsZV8gKQorICAgICAgLCBzYW1wbGVMb2NhdGlvbnNJbmZvKCBzYW1wbGVMb2NhdGlvbnNJbmZvXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQoIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXRTYW1wbGVMb2NhdGlvbnNFbmFibGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2FtcGxlTG9jYXRpb25zRW5hYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzYW1wbGVMb2NhdGlvbnNFbmFibGUgPSBzYW1wbGVMb2NhdGlvbnNFbmFibGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUICYgc2V0U2FtcGxlTG9jYXRpb25zSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQgc2FtcGxlTG9jYXRpb25zSW5mb18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlTG9jYXRpb25zSW5mbyA9IHNhbXBsZUxvY2F0aW9uc0luZm9fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNhbXBsZUxvY2F0aW9uc0VuYWJsZSA9PSByaHMuc2FtcGxlTG9jYXRpb25zRW5hYmxlICkKKyAgICAgICAgICAmJiAoIHNhbXBsZUxvY2F0aW9uc0luZm8gPT0gcmhzLnNhbXBsZUxvY2F0aW9uc0luZm8gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNhbXBsZUxvY2F0aW9uc0VuYWJsZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlTG9jYXRpb25zSW5mb0VYVCBzYW1wbGVMb2NhdGlvbnNJbmZvOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUCisgIHsKKyAgICBQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUKCB1aW50MzJfdCByZXF1aXJlZFN1Ymdyb3VwU2l6ZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiByZXF1aXJlZFN1Ymdyb3VwU2l6ZSggcmVxdWlyZWRTdWJncm91cFNpemVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUICkgLSBvZmZzZXRvZiggUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQoIFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCByZXF1aXJlZFN1Ymdyb3VwU2l6ZSA9PSByaHMucmVxdWlyZWRTdWJncm91cFNpemUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgcmVxdWlyZWRTdWJncm91cFNpemU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbiBkb21haW5PcmlnaW5fID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbjo6ZVVwcGVyTGVmdCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZG9tYWluT3JpZ2luKCBkb21haW5PcmlnaW5fICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyggVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyAmIHNldERvbWFpbk9yaWdpbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbiBkb21haW5PcmlnaW5fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRvbWFpbk9yaWdpbiA9IGRvbWFpbk9yaWdpbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZG9tYWluT3JpZ2luID09IHJocy5kb21haW5PcmlnaW4gKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luIGRvbWFpbk9yaWdpbjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQoIHVpbnQzMl90IGJpbmRpbmdfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpdmlzb3JfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYmluZGluZyggYmluZGluZ18gKQorICAgICAgLCBkaXZpc29yKCBkaXZpc29yXyApCisgICAge30KKworICAgIFZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVCggVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUJiBvcGVyYXRvcj0oIFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQgJiBzZXRCaW5kaW5nKCB1aW50MzJfdCBiaW5kaW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBiaW5kaW5nID0gYmluZGluZ187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUICYgc2V0RGl2aXNvciggdWludDMyX3QgZGl2aXNvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGl2aXNvciA9IGRpdmlzb3JfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGJpbmRpbmcgPT0gcmhzLmJpbmRpbmcgKQorICAgICAgICAgICYmICggZGl2aXNvciA9PSByaHMuZGl2aXNvciApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IGJpbmRpbmc7CisgICAgdWludDMyX3QgZGl2aXNvcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQgKSA9PSBzaXplb2YoIFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUKCB1aW50MzJfdCB2ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQqIHBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudCggdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudF8gKQorICAgICAgLCBwVmVydGV4QmluZGluZ0Rpdmlzb3JzKCBwVmVydGV4QmluZGluZ0Rpdmlzb3JzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFBpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQoIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXRWZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50KCB1aW50MzJfdCB2ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50ID0gdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgJiBzZXRQVmVydGV4QmluZGluZ0Rpdmlzb3JzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUKiBwVmVydGV4QmluZGluZ0Rpdmlzb3JzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmVydGV4QmluZGluZ0Rpdmlzb3JzID0gcFZlcnRleEJpbmRpbmdEaXZpc29yc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudCA9PSByaHMudmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudCApCisgICAgICAgICAgJiYgKCBwVmVydGV4QmluZGluZ0Rpdmlzb3JzID09IHJocy5wVmVydGV4QmluZGluZ0Rpdmlzb3JzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUKiBwVmVydGV4QmluZGluZ0Rpdmlzb3JzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViBzYW1wbGVPcmRlclR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyVHlwZU5WOjplRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY3VzdG9tU2FtcGxlT3JkZXJDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogcEN1c3RvbVNhbXBsZU9yZGVyc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzYW1wbGVPcmRlclR5cGUoIHNhbXBsZU9yZGVyVHlwZV8gKQorICAgICAgLCBjdXN0b21TYW1wbGVPcmRlckNvdW50KCBjdXN0b21TYW1wbGVPcmRlckNvdW50XyApCisgICAgICAsIHBDdXN0b21TYW1wbGVPcmRlcnMoIHBDdXN0b21TYW1wbGVPcmRlcnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WICkgLSBvZmZzZXRvZiggUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViggVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViAmIHNldFNhbXBsZU9yZGVyVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlT3JkZXJUeXBlID0gc2FtcGxlT3JkZXJUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViAmIHNldEN1c3RvbVNhbXBsZU9yZGVyQ291bnQoIHVpbnQzMl90IGN1c3RvbVNhbXBsZU9yZGVyQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQgPSBjdXN0b21TYW1wbGVPcmRlckNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViAmIHNldFBDdXN0b21TYW1wbGVPcmRlcnMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiBwQ3VzdG9tU2FtcGxlT3JkZXJzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzID0gcEN1c3RvbVNhbXBsZU9yZGVyc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2FtcGxlT3JkZXJUeXBlID09IHJocy5zYW1wbGVPcmRlclR5cGUgKQorICAgICAgICAgICYmICggY3VzdG9tU2FtcGxlT3JkZXJDb3VudCA9PSByaHMuY3VzdG9tU2FtcGxlT3JkZXJDb3VudCApCisgICAgICAgICAgJiYgKCBwQ3VzdG9tU2FtcGxlT3JkZXJzID09IHJocy5wQ3VzdG9tU2FtcGxlT3JkZXJzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZTsKKyAgICB1aW50MzJfdCBjdXN0b21TYW1wbGVPcmRlckNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiBwQ3VzdG9tU2FtcGxlT3JkZXJzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKCB1aW50MzJfdCBleGNsdXNpdmVTY2lzc29yQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKiBwRXhjbHVzaXZlU2Npc3NvcnNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZXhjbHVzaXZlU2Npc3NvckNvdW50KCBleGNsdXNpdmVTY2lzc29yQ291bnRfICkKKyAgICAgICwgcEV4Y2x1c2l2ZVNjaXNzb3JzKCBwRXhjbHVzaXZlU2Npc3NvcnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WICkgLSBvZmZzZXRvZiggUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYoIFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRFeGNsdXNpdmVTY2lzc29yQ291bnQoIHVpbnQzMl90IGV4Y2x1c2l2ZVNjaXNzb3JDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50ID0gZXhjbHVzaXZlU2Npc3NvckNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WICYgc2V0UEV4Y2x1c2l2ZVNjaXNzb3JzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKiBwRXhjbHVzaXZlU2Npc3NvcnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBFeGNsdXNpdmVTY2lzc29ycyA9IHBFeGNsdXNpdmVTY2lzc29yc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCA9PSByaHMuZXhjbHVzaXZlU2Npc3NvckNvdW50ICkKKyAgICAgICAgICAmJiAoIHBFeGNsdXNpdmVTY2lzc29ycyA9PSByaHMucEV4Y2x1c2l2ZVNjaXNzb3JzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlY7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGV4Y2x1c2l2ZVNjaXNzb3JDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKiBwRXhjbHVzaXZlU2Npc3NvcnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViApID09IHNpemVvZiggVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFNoYWRpbmdSYXRlUGFsZXR0ZU5WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTaGFkaW5nUmF0ZVBhbGV0dGVOViggdWludDMyX3Qgc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViogcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudCggc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudF8gKQorICAgICAgLCBwU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcyggcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXNfICkKKyAgICB7fQorCisgICAgU2hhZGluZ1JhdGVQYWxldHRlTlYoIFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU2hhZGluZ1JhdGVQYWxldHRlTlYmIG9wZXJhdG9yPSggVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkaW5nUmF0ZVBhbGV0dGVOViBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTaGFkaW5nUmF0ZVBhbGV0dGVOViAmIHNldFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQoIHVpbnQzMl90IHNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQgPSBzaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTaGFkaW5nUmF0ZVBhbGV0dGVOViAmIHNldFBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViogcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzID0gcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU2hhZGluZ1JhdGVQYWxldHRlTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50ID09IHJocy5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzID09IHJocy5wU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2hhZGluZ1JhdGVQYWxldHRlTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3Qgc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViogcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU2hhZGluZ1JhdGVQYWxldHRlTlYgKSA9PSBzaXplb2YoIFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2hhZGluZ1JhdGVQYWxldHRlTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc2hhZGluZ1JhdGVJbWFnZUVuYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGluZ1JhdGVQYWxldHRlTlYqIHBTaGFkaW5nUmF0ZVBhbGV0dGVzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNoYWRpbmdSYXRlSW1hZ2VFbmFibGUoIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGVfICkKKyAgICAgICwgdmlld3BvcnRDb3VudCggdmlld3BvcnRDb3VudF8gKQorICAgICAgLCBwU2hhZGluZ1JhdGVQYWxldHRlcyggcFNoYWRpbmdSYXRlUGFsZXR0ZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WICkgLSBvZmZzZXRvZiggUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYoIFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oIFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRTaGFkaW5nUmF0ZUltYWdlRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGUgPSBzaGFkaW5nUmF0ZUltYWdlRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WICYgc2V0Vmlld3BvcnRDb3VudCggdWludDMyX3Qgdmlld3BvcnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmlld3BvcnRDb3VudCA9IHZpZXdwb3J0Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRQU2hhZGluZ1JhdGVQYWxldHRlcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRpbmdSYXRlUGFsZXR0ZU5WKiBwU2hhZGluZ1JhdGVQYWxldHRlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMgPSBwU2hhZGluZ1JhdGVQYWxldHRlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGUgPT0gcmhzLnNoYWRpbmdSYXRlSW1hZ2VFbmFibGUgKQorICAgICAgICAgICYmICggdmlld3BvcnRDb3VudCA9PSByaHMudmlld3BvcnRDb3VudCApCisgICAgICAgICAgJiYgKCBwU2hhZGluZ1JhdGVQYWxldHRlcyA9PSByaHMucFNoYWRpbmdSYXRlUGFsZXR0ZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFBpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzaGFkaW5nUmF0ZUltYWdlRW5hYmxlOworICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRpbmdSYXRlUGFsZXR0ZU5WKiBwU2hhZGluZ1JhdGVQYWxldHRlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgVmlld3BvcnRTd2l6emxlTlYKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFZpZXdwb3J0U3dpenpsZU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WIHhfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVjo6ZVBvc2l0aXZlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViB5XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY6OmVQb3NpdGl2ZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgel8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WOjplUG9zaXRpdmVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WIHdfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVjo6ZVBvc2l0aXZlWCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogeCggeF8gKQorICAgICAgLCB5KCB5XyApCisgICAgICAsIHooIHpfICkKKyAgICAgICwgdyggd18gKQorICAgIHt9CisKKyAgICBWaWV3cG9ydFN3aXp6bGVOViggVmtWaWV3cG9ydFN3aXp6bGVOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBWaWV3cG9ydFN3aXp6bGVOViYgb3BlcmF0b3I9KCBWa1ZpZXdwb3J0U3dpenpsZU5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0U3dpenpsZU5WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZpZXdwb3J0U3dpenpsZU5WICYgc2V0WCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViB4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB4ID0geF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlld3BvcnRTd2l6emxlTlYgJiBzZXRZKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WIHlfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHkgPSB5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWaWV3cG9ydFN3aXp6bGVOViAmIHNldFooIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgel8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgeiA9IHpfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZpZXdwb3J0U3dpenpsZU5WICYgc2V0VyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViB3XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB3ID0gd187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtWaWV3cG9ydFN3aXp6bGVOViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrVmlld3BvcnRTd2l6emxlTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrVmlld3BvcnRTd2l6emxlTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtWaWV3cG9ydFN3aXp6bGVOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBWaWV3cG9ydFN3aXp6bGVOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHggPT0gcmhzLnggKQorICAgICAgICAgICYmICggeSA9PSByaHMueSApCisgICAgICAgICAgJiYgKCB6ID09IHJocy56ICkKKyAgICAgICAgICAmJiAoIHcgPT0gcmhzLncgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFZpZXdwb3J0U3dpenpsZU5WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgeDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WIHk7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViB6OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgdzsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBWaWV3cG9ydFN3aXp6bGVOViApID09IHNpemVvZiggVmtWaWV3cG9ydFN3aXp6bGVOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxWaWV3cG9ydFN3aXp6bGVOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVGbGFnc05WIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlRmxhZ3NOVigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnRTd2l6emxlTlYqIHBWaWV3cG9ydFN3aXp6bGVzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCB2aWV3cG9ydENvdW50KCB2aWV3cG9ydENvdW50XyApCisgICAgICAsIHBWaWV3cG9ydFN3aXp6bGVzKCBwVmlld3BvcnRTd2l6emxlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgKSAtIG9mZnNldG9mKCBQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViggVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYmIG9wZXJhdG9yPSggVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUZsYWdzTlYgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgJiBzZXRWaWV3cG9ydENvdW50KCB1aW50MzJfdCB2aWV3cG9ydENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2aWV3cG9ydENvdW50ID0gdmlld3BvcnRDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViAmIHNldFBWaWV3cG9ydFN3aXp6bGVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnRTd2l6emxlTlYqIHBWaWV3cG9ydFN3aXp6bGVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmlld3BvcnRTd2l6emxlcyA9IHBWaWV3cG9ydFN3aXp6bGVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHZpZXdwb3J0Q291bnQgPT0gcmhzLnZpZXdwb3J0Q291bnQgKQorICAgICAgICAgICYmICggcFZpZXdwb3J0U3dpenpsZXMgPT0gcmhzLnBWaWV3cG9ydFN3aXp6bGVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlY7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlRmxhZ3NOViBmbGFnczsKKyAgICB1aW50MzJfdCB2aWV3cG9ydENvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydFN3aXp6bGVOViogcFZpZXdwb3J0U3dpenpsZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViApID09IHNpemVvZiggVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFZpZXdwb3J0V1NjYWxpbmdOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgVmlld3BvcnRXU2NhbGluZ05WKCBmbG9hdCB4Y29lZmZfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHljb2VmZl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB4Y29lZmYoIHhjb2VmZl8gKQorICAgICAgLCB5Y29lZmYoIHljb2VmZl8gKQorICAgIHt9CisKKyAgICBWaWV3cG9ydFdTY2FsaW5nTlYoIFZrVmlld3BvcnRXU2NhbGluZ05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFZpZXdwb3J0V1NjYWxpbmdOViYgb3BlcmF0b3I9KCBWa1ZpZXdwb3J0V1NjYWxpbmdOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydFdTY2FsaW5nTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlld3BvcnRXU2NhbGluZ05WICYgc2V0WGNvZWZmKCBmbG9hdCB4Y29lZmZfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHhjb2VmZiA9IHhjb2VmZl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlld3BvcnRXU2NhbGluZ05WICYgc2V0WWNvZWZmKCBmbG9hdCB5Y29lZmZfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHljb2VmZiA9IHljb2VmZl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtWaWV3cG9ydFdTY2FsaW5nTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtWaWV3cG9ydFdTY2FsaW5nTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtWaWV3cG9ydFdTY2FsaW5nTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggVmlld3BvcnRXU2NhbGluZ05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggeGNvZWZmID09IHJocy54Y29lZmYgKQorICAgICAgICAgICYmICggeWNvZWZmID09IHJocy55Y29lZmYgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFZpZXdwb3J0V1NjYWxpbmdOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBmbG9hdCB4Y29lZmY7CisgICAgZmxvYXQgeWNvZWZmOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFZpZXdwb3J0V1NjYWxpbmdOViApID09IHNpemVvZiggVmtWaWV3cG9ydFdTY2FsaW5nTlYgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8Vmlld3BvcnRXU2NhbGluZ05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmlld3BvcnRXU2NhbGluZ0VuYWJsZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2aWV3cG9ydENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydFdTY2FsaW5nTlYqIHBWaWV3cG9ydFdTY2FsaW5nc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB2aWV3cG9ydFdTY2FsaW5nRW5hYmxlKCB2aWV3cG9ydFdTY2FsaW5nRW5hYmxlXyApCisgICAgICAsIHZpZXdwb3J0Q291bnQoIHZpZXdwb3J0Q291bnRfICkKKyAgICAgICwgcFZpZXdwb3J0V1NjYWxpbmdzKCBwVmlld3BvcnRXU2NhbGluZ3NfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICkgLSBvZmZzZXRvZiggUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViggVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KCBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViAmIHNldFZpZXdwb3J0V1NjYWxpbmdFbmFibGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdmlld3BvcnRXU2NhbGluZ0VuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmlld3BvcnRXU2NhbGluZ0VuYWJsZSA9IHZpZXdwb3J0V1NjYWxpbmdFbmFibGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICYgc2V0Vmlld3BvcnRDb3VudCggdWludDMyX3Qgdmlld3BvcnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmlld3BvcnRDb3VudCA9IHZpZXdwb3J0Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICYgc2V0UFZpZXdwb3J0V1NjYWxpbmdzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnRXU2NhbGluZ05WKiBwVmlld3BvcnRXU2NhbGluZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncyA9IHBWaWV3cG9ydFdTY2FsaW5nc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdmlld3BvcnRXU2NhbGluZ0VuYWJsZSA9PSByaHMudmlld3BvcnRXU2NhbGluZ0VuYWJsZSApCisgICAgICAgICAgJiYgKCB2aWV3cG9ydENvdW50ID09IHJocy52aWV3cG9ydENvdW50ICkKKyAgICAgICAgICAmJiAoIHBWaWV3cG9ydFdTY2FsaW5ncyA9PSByaHMucFZpZXdwb3J0V1NjYWxpbmdzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB2aWV3cG9ydFdTY2FsaW5nRW5hYmxlOworICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0V1NjYWxpbmdOViogcFZpZXdwb3J0V1NjYWxpbmdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICkgPT0gc2l6ZW9mKCBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFBpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorCisgIHN0cnVjdCBQcmVzZW50RnJhbWVUb2tlbkdHUAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUHJlc2VudEZyYW1lVG9rZW5HR1AoIEdncEZyYW1lVG9rZW4gZnJhbWVUb2tlbl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmcmFtZVRva2VuKCBmcmFtZVRva2VuXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50RnJhbWVUb2tlbkdHUCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRGcmFtZVRva2VuR0dQIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50RnJhbWVUb2tlbkdHUCApIC0gb2Zmc2V0b2YoIFByZXNlbnRGcmFtZVRva2VuR0dQLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudEZyYW1lVG9rZW5HR1AoIFZrUHJlc2VudEZyYW1lVG9rZW5HR1AgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUHJlc2VudEZyYW1lVG9rZW5HR1AmIG9wZXJhdG9yPSggVmtQcmVzZW50RnJhbWVUb2tlbkdHUCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50RnJhbWVUb2tlbkdHUCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcmVzZW50RnJhbWVUb2tlbkdHUCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudEZyYW1lVG9rZW5HR1AgJiBzZXRGcmFtZVRva2VuKCBHZ3BGcmFtZVRva2VuIGZyYW1lVG9rZW5fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZyYW1lVG9rZW4gPSBmcmFtZVRva2VuXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ByZXNlbnRGcmFtZVRva2VuR0dQIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQcmVzZW50RnJhbWVUb2tlbkdHUCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQcmVzZW50RnJhbWVUb2tlbkdHUCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1ByZXNlbnRGcmFtZVRva2VuR0dQKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFByZXNlbnRGcmFtZVRva2VuR0dQIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmcmFtZVRva2VuID09IHJocy5mcmFtZVRva2VuICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQcmVzZW50RnJhbWVUb2tlbkdHUCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQcmVzZW50RnJhbWVUb2tlbkdHUDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgR2dwRnJhbWVUb2tlbiBmcmFtZVRva2VuOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFByZXNlbnRGcmFtZVRva2VuR0dQICkgPT0gc2l6ZW9mKCBWa1ByZXNlbnRGcmFtZVRva2VuR0dQICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFByZXNlbnRGcmFtZVRva2VuR0dQPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0dHUCovCisKKyAgc3RydWN0IFByZXNlbnRJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQcmVzZW50SW5mb0tIUiggdWludDMyX3Qgd2FpdFNlbWFwaG9yZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBXYWl0U2VtYXBob3Jlc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzd2FwY2hhaW5Db3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSKiBwU3dhcGNoYWluc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcEltYWdlSW5kaWNlc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzdWx0KiBwUmVzdWx0c18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB3YWl0U2VtYXBob3JlQ291bnQoIHdhaXRTZW1hcGhvcmVDb3VudF8gKQorICAgICAgLCBwV2FpdFNlbWFwaG9yZXMoIHBXYWl0U2VtYXBob3Jlc18gKQorICAgICAgLCBzd2FwY2hhaW5Db3VudCggc3dhcGNoYWluQ291bnRfICkKKyAgICAgICwgcFN3YXBjaGFpbnMoIHBTd2FwY2hhaW5zXyApCisgICAgICAsIHBJbWFnZUluZGljZXMoIHBJbWFnZUluZGljZXNfICkKKyAgICAgICwgcFJlc3VsdHMoIHBSZXN1bHRzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50SW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50SW5mb0tIUiApIC0gb2Zmc2V0b2YoIFByZXNlbnRJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudEluZm9LSFIoIFZrUHJlc2VudEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUHJlc2VudEluZm9LSFImIG9wZXJhdG9yPSggVmtQcmVzZW50SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50SW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcmVzZW50SW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudEluZm9LSFIgJiBzZXRXYWl0U2VtYXBob3JlQ291bnQoIHVpbnQzMl90IHdhaXRTZW1hcGhvcmVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgd2FpdFNlbWFwaG9yZUNvdW50ID0gd2FpdFNlbWFwaG9yZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcmVzZW50SW5mb0tIUiAmIHNldFBXYWl0U2VtYXBob3JlcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSogcFdhaXRTZW1hcGhvcmVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBwV2FpdFNlbWFwaG9yZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFByZXNlbnRJbmZvS0hSICYgc2V0U3dhcGNoYWluQ291bnQoIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzd2FwY2hhaW5Db3VudCA9IHN3YXBjaGFpbkNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcmVzZW50SW5mb0tIUiAmIHNldFBTd2FwY2hhaW5zKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSKiBwU3dhcGNoYWluc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFN3YXBjaGFpbnMgPSBwU3dhcGNoYWluc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudEluZm9LSFIgJiBzZXRQSW1hZ2VJbmRpY2VzKCBjb25zdCB1aW50MzJfdCogcEltYWdlSW5kaWNlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEltYWdlSW5kaWNlcyA9IHBJbWFnZUluZGljZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFByZXNlbnRJbmZvS0hSICYgc2V0UFJlc3VsdHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZXN1bHQqIHBSZXN1bHRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwUmVzdWx0cyA9IHBSZXN1bHRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ByZXNlbnRJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQcmVzZW50SW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQcmVzZW50SW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1ByZXNlbnRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFByZXNlbnRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCB3YWl0U2VtYXBob3JlQ291bnQgPT0gcmhzLndhaXRTZW1hcGhvcmVDb3VudCApCisgICAgICAgICAgJiYgKCBwV2FpdFNlbWFwaG9yZXMgPT0gcmhzLnBXYWl0U2VtYXBob3JlcyApCisgICAgICAgICAgJiYgKCBzd2FwY2hhaW5Db3VudCA9PSByaHMuc3dhcGNoYWluQ291bnQgKQorICAgICAgICAgICYmICggcFN3YXBjaGFpbnMgPT0gcmhzLnBTd2FwY2hhaW5zICkKKyAgICAgICAgICAmJiAoIHBJbWFnZUluZGljZXMgPT0gcmhzLnBJbWFnZUluZGljZXMgKQorICAgICAgICAgICYmICggcFJlc3VsdHMgPT0gcmhzLnBSZXN1bHRzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQcmVzZW50SW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVQcmVzZW50SW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3Qgd2FpdFNlbWFwaG9yZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBXYWl0U2VtYXBob3JlczsKKyAgICB1aW50MzJfdCBzd2FwY2hhaW5Db3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSKiBwU3dhcGNoYWluczsKKyAgICBjb25zdCB1aW50MzJfdCogcEltYWdlSW5kaWNlczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzdWx0KiBwUmVzdWx0czsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQcmVzZW50SW5mb0tIUiApID09IHNpemVvZiggVmtQcmVzZW50SW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQcmVzZW50SW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUmVjdExheWVyS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBSZWN0TGF5ZXJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQyRCBvZmZzZXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgZXh0ZW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogb2Zmc2V0KCBvZmZzZXRfICkKKyAgICAgICwgZXh0ZW50KCBleHRlbnRfICkKKyAgICAgICwgbGF5ZXIoIGxheWVyXyApCisgICAge30KKworICAgIGV4cGxpY2l0IFJlY3RMYXllcktIUiggUmVjdDJEIGNvbnN0JiByZWN0MkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXllcl8gPSAwICkKKyAgICAgIDogb2Zmc2V0KCByZWN0MkQub2Zmc2V0ICkKKyAgICAgICwgZXh0ZW50KCByZWN0MkQuZXh0ZW50ICkKKyAgICAgICwgbGF5ZXIoIGxheWVyXyApCisgICAge30KKworICAgIFJlY3RMYXllcktIUiggVmtSZWN0TGF5ZXJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUmVjdExheWVyS0hSJiBvcGVyYXRvcj0oIFZrUmVjdExheWVyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3RMYXllcktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZWN0TGF5ZXJLSFIgJiBzZXRPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPZmZzZXQyRCBvZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9mZnNldCA9IG9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVjdExheWVyS0hSICYgc2V0RXh0ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgZXh0ZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBleHRlbnQgPSBleHRlbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlY3RMYXllcktIUiAmIHNldExheWVyKCB1aW50MzJfdCBsYXllcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbGF5ZXIgPSBsYXllcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSZWN0TGF5ZXJLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlY3RMYXllcktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSZWN0TGF5ZXJLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtSZWN0TGF5ZXJLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUmVjdExheWVyS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggb2Zmc2V0ID09IHJocy5vZmZzZXQgKQorICAgICAgICAgICYmICggZXh0ZW50ID09IHJocy5leHRlbnQgKQorICAgICAgICAgICYmICggbGF5ZXIgPT0gcmhzLmxheWVyICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBSZWN0TGF5ZXJLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9mZnNldDJEIG9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgZXh0ZW50OworICAgIHVpbnQzMl90IGxheWVyOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFJlY3RMYXllcktIUiApID09IHNpemVvZiggVmtSZWN0TGF5ZXJLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UmVjdExheWVyS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQcmVzZW50UmVnaW9uS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBQcmVzZW50UmVnaW9uS0hSKCB1aW50MzJfdCByZWN0YW5nbGVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0TGF5ZXJLSFIqIHBSZWN0YW5nbGVzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHJlY3RhbmdsZUNvdW50KCByZWN0YW5nbGVDb3VudF8gKQorICAgICAgLCBwUmVjdGFuZ2xlcyggcFJlY3RhbmdsZXNfICkKKyAgICB7fQorCisgICAgUHJlc2VudFJlZ2lvbktIUiggVmtQcmVzZW50UmVnaW9uS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFByZXNlbnRSZWdpb25LSFImIG9wZXJhdG9yPSggVmtQcmVzZW50UmVnaW9uS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRSZWdpb25LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudFJlZ2lvbktIUiAmIHNldFJlY3RhbmdsZUNvdW50KCB1aW50MzJfdCByZWN0YW5nbGVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVjdGFuZ2xlQ291bnQgPSByZWN0YW5nbGVDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudFJlZ2lvbktIUiAmIHNldFBSZWN0YW5nbGVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdExheWVyS0hSKiBwUmVjdGFuZ2xlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFJlY3RhbmdsZXMgPSBwUmVjdGFuZ2xlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQcmVzZW50UmVnaW9uS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQcmVzZW50UmVnaW9uS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ByZXNlbnRSZWdpb25LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50UmVnaW9uS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFByZXNlbnRSZWdpb25LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCByZWN0YW5nbGVDb3VudCA9PSByaHMucmVjdGFuZ2xlQ291bnQgKQorICAgICAgICAgICYmICggcFJlY3RhbmdsZXMgPT0gcmhzLnBSZWN0YW5nbGVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBQcmVzZW50UmVnaW9uS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVpbnQzMl90IHJlY3RhbmdsZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0TGF5ZXJLSFIqIHBSZWN0YW5nbGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFByZXNlbnRSZWdpb25LSFIgKSA9PSBzaXplb2YoIFZrUHJlc2VudFJlZ2lvbktIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQcmVzZW50UmVnaW9uS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBQcmVzZW50UmVnaW9uc0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUHJlc2VudFJlZ2lvbnNLSFIoIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50UmVnaW9uS0hSKiBwUmVnaW9uc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzd2FwY2hhaW5Db3VudCggc3dhcGNoYWluQ291bnRfICkKKyAgICAgICwgcFJlZ2lvbnMoIHBSZWdpb25zXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50UmVnaW9uc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRSZWdpb25zS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50UmVnaW9uc0tIUiApIC0gb2Zmc2V0b2YoIFByZXNlbnRSZWdpb25zS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudFJlZ2lvbnNLSFIoIFZrUHJlc2VudFJlZ2lvbnNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUHJlc2VudFJlZ2lvbnNLSFImIG9wZXJhdG9yPSggVmtQcmVzZW50UmVnaW9uc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50UmVnaW9uc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcmVzZW50UmVnaW9uc0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudFJlZ2lvbnNLSFIgJiBzZXRTd2FwY2hhaW5Db3VudCggdWludDMyX3Qgc3dhcGNoYWluQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN3YXBjaGFpbkNvdW50ID0gc3dhcGNoYWluQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFByZXNlbnRSZWdpb25zS0hSICYgc2V0UFJlZ2lvbnMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50UmVnaW9uS0hSKiBwUmVnaW9uc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFJlZ2lvbnMgPSBwUmVnaW9uc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQcmVzZW50UmVnaW9uc0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUHJlc2VudFJlZ2lvbnNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUHJlc2VudFJlZ2lvbnNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50UmVnaW9uc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQcmVzZW50UmVnaW9uc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3dhcGNoYWluQ291bnQgPT0gcmhzLnN3YXBjaGFpbkNvdW50ICkKKyAgICAgICAgICAmJiAoIHBSZWdpb25zID09IHJocy5wUmVnaW9ucyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUHJlc2VudFJlZ2lvbnNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUHJlc2VudFJlZ2lvbnNLSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50UmVnaW9uS0hSKiBwUmVnaW9uczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQcmVzZW50UmVnaW9uc0tIUiApID09IHNpemVvZiggVmtQcmVzZW50UmVnaW9uc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQcmVzZW50UmVnaW9uc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUHJlc2VudFRpbWVHT09HTEUKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFByZXNlbnRUaW1lR09PR0xFKCB1aW50MzJfdCBwcmVzZW50SURfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZGVzaXJlZFByZXNlbnRUaW1lXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHByZXNlbnRJRCggcHJlc2VudElEXyApCisgICAgICAsIGRlc2lyZWRQcmVzZW50VGltZSggZGVzaXJlZFByZXNlbnRUaW1lXyApCisgICAge30KKworICAgIFByZXNlbnRUaW1lR09PR0xFKCBWa1ByZXNlbnRUaW1lR09PR0xFIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFByZXNlbnRUaW1lR09PR0xFJiBvcGVyYXRvcj0oIFZrUHJlc2VudFRpbWVHT09HTEUgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJlc2VudFRpbWVHT09HTEUgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJlc2VudFRpbWVHT09HTEUgJiBzZXRQcmVzZW50SUQoIHVpbnQzMl90IHByZXNlbnRJRF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcHJlc2VudElEID0gcHJlc2VudElEXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcmVzZW50VGltZUdPT0dMRSAmIHNldERlc2lyZWRQcmVzZW50VGltZSggdWludDY0X3QgZGVzaXJlZFByZXNlbnRUaW1lXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNpcmVkUHJlc2VudFRpbWUgPSBkZXNpcmVkUHJlc2VudFRpbWVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUHJlc2VudFRpbWVHT09HTEUgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ByZXNlbnRUaW1lR09PR0xFKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ByZXNlbnRUaW1lR09PR0xFICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUHJlc2VudFRpbWVHT09HTEUqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUHJlc2VudFRpbWVHT09HTEUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBwcmVzZW50SUQgPT0gcmhzLnByZXNlbnRJRCApCisgICAgICAgICAgJiYgKCBkZXNpcmVkUHJlc2VudFRpbWUgPT0gcmhzLmRlc2lyZWRQcmVzZW50VGltZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUHJlc2VudFRpbWVHT09HTEUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3QgcHJlc2VudElEOworICAgIHVpbnQ2NF90IGRlc2lyZWRQcmVzZW50VGltZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQcmVzZW50VGltZUdPT0dMRSApID09IHNpemVvZiggVmtQcmVzZW50VGltZUdPT0dMRSApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxQcmVzZW50VGltZUdPT0dMRT46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUHJlc2VudFRpbWVzSW5mb0dPT0dMRQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUHJlc2VudFRpbWVzSW5mb0dPT0dMRSggdWludDMyX3Qgc3dhcGNoYWluQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJlc2VudFRpbWVHT09HTEUqIHBUaW1lc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzd2FwY2hhaW5Db3VudCggc3dhcGNoYWluQ291bnRfICkKKyAgICAgICwgcFRpbWVzKCBwVGltZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRUaW1lc0luZm9HT09HTEUgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50VGltZXNJbmZvR09PR0xFIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50VGltZXNJbmZvR09PR0xFICkgLSBvZmZzZXRvZiggUHJlc2VudFRpbWVzSW5mb0dPT0dMRSwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFByZXNlbnRUaW1lc0luZm9HT09HTEUoIFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBQcmVzZW50VGltZXNJbmZvR09PR0xFJiBvcGVyYXRvcj0oIFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50VGltZXNJbmZvR09PR0xFIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFByZXNlbnRUaW1lc0luZm9HT09HTEUgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFByZXNlbnRUaW1lc0luZm9HT09HTEUgJiBzZXRTd2FwY2hhaW5Db3VudCggdWludDMyX3Qgc3dhcGNoYWluQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN3YXBjaGFpbkNvdW50ID0gc3dhcGNoYWluQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFByZXNlbnRUaW1lc0luZm9HT09HTEUgJiBzZXRQVGltZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50VGltZUdPT0dMRSogcFRpbWVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVGltZXMgPSBwVGltZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBQcmVzZW50VGltZXNJbmZvR09PR0xFIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzd2FwY2hhaW5Db3VudCA9PSByaHMuc3dhcGNoYWluQ291bnQgKQorICAgICAgICAgICYmICggcFRpbWVzID09IHJocy5wVGltZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFByZXNlbnRUaW1lc0luZm9HT09HTEUgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUHJlc2VudFRpbWVzSW5mb0dPT0dMRTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3Qgc3dhcGNoYWluQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRUaW1lR09PR0xFKiBwVGltZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUHJlc2VudFRpbWVzSW5mb0dPT0dMRSApID09IHNpemVvZiggVmtQcmVzZW50VGltZXNJbmZvR09PR0xFICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFByZXNlbnRUaW1lc0luZm9HT09HTEU+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFByb3RlY3RlZFN1Ym1pdEluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFByb3RlY3RlZFN1Ym1pdEluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgcHJvdGVjdGVkU3VibWl0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHByb3RlY3RlZFN1Ym1pdCggcHJvdGVjdGVkU3VibWl0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcm90ZWN0ZWRTdWJtaXRJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJvdGVjdGVkU3VibWl0SW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJvdGVjdGVkU3VibWl0SW5mbyApIC0gb2Zmc2V0b2YoIFByb3RlY3RlZFN1Ym1pdEluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcm90ZWN0ZWRTdWJtaXRJbmZvKCBWa1Byb3RlY3RlZFN1Ym1pdEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUHJvdGVjdGVkU3VibWl0SW5mbyYgb3BlcmF0b3I9KCBWa1Byb3RlY3RlZFN1Ym1pdEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJvdGVjdGVkU3VibWl0SW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcm90ZWN0ZWRTdWJtaXRJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBQcm90ZWN0ZWRTdWJtaXRJbmZvICYgc2V0UHJvdGVjdGVkU3VibWl0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHByb3RlY3RlZFN1Ym1pdF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcHJvdGVjdGVkU3VibWl0ID0gcHJvdGVjdGVkU3VibWl0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1Byb3RlY3RlZFN1Ym1pdEluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1Byb3RlY3RlZFN1Ym1pdEluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUHJvdGVjdGVkU3VibWl0SW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1Byb3RlY3RlZFN1Ym1pdEluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUHJvdGVjdGVkU3VibWl0SW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcHJvdGVjdGVkU3VibWl0ID09IHJocy5wcm90ZWN0ZWRTdWJtaXQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFByb3RlY3RlZFN1Ym1pdEluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUHJvdGVjdGVkU3VibWl0SW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBwcm90ZWN0ZWRTdWJtaXQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUHJvdGVjdGVkU3VibWl0SW5mbyApID09IHNpemVvZiggVmtQcm90ZWN0ZWRTdWJtaXRJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFByb3RlY3RlZFN1Ym1pdEluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFF1ZXJ5UG9vbENyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFF1ZXJ5UG9vbENyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlUeXBlIHF1ZXJ5VHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlUeXBlOjplT2NjbHVzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXJ5Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzIHBpcGVsaW5lU3RhdGlzdGljc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBxdWVyeVR5cGUoIHF1ZXJ5VHlwZV8gKQorICAgICAgLCBxdWVyeUNvdW50KCBxdWVyeUNvdW50XyApCisgICAgICAsIHBpcGVsaW5lU3RhdGlzdGljcyggcGlwZWxpbmVTdGF0aXN0aWNzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIFF1ZXJ5UG9vbENyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWVyeVBvb2xDcmVhdGVJbmZvKCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUXVlcnlQb29sQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWVyeVBvb2xDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWVyeVBvb2xDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUXVlcnlQb29sQ3JlYXRlSW5mbyAmIHNldFF1ZXJ5VHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5VHlwZSBxdWVyeVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHF1ZXJ5VHlwZSA9IHF1ZXJ5VHlwZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUXVlcnlQb29sQ3JlYXRlSW5mbyAmIHNldFF1ZXJ5Q291bnQoIHVpbnQzMl90IHF1ZXJ5Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHF1ZXJ5Q291bnQgPSBxdWVyeUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWVyeVBvb2xDcmVhdGVJbmZvICYgc2V0UGlwZWxpbmVTdGF0aXN0aWNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzIHBpcGVsaW5lU3RhdGlzdGljc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcGlwZWxpbmVTdGF0aXN0aWNzID0gcGlwZWxpbmVTdGF0aXN0aWNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUXVlcnlQb29sQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUXVlcnlQb29sQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHF1ZXJ5VHlwZSA9PSByaHMucXVlcnlUeXBlICkKKyAgICAgICAgICAmJiAoIHF1ZXJ5Q291bnQgPT0gcmhzLnF1ZXJ5Q291bnQgKQorICAgICAgICAgICYmICggcGlwZWxpbmVTdGF0aXN0aWNzID09IHJocy5waXBlbGluZVN0YXRpc3RpY3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFF1ZXJ5UG9vbENyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUXVlcnlQb29sQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbENyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVR5cGUgcXVlcnlUeXBlOworICAgIHVpbnQzMl90IHF1ZXJ5Q291bnQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyBwaXBlbGluZVN0YXRpc3RpY3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUXVlcnlQb29sQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtRdWVyeVBvb2xDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFF1ZXJ5UG9vbENyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFF1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sU2FtcGxpbmdNb2RlSU5URUwgcGVyZm9ybWFuY2VDb3VudGVyc1NhbXBsaW5nXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTDo6ZU1hbnVhbCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcGVyZm9ybWFuY2VDb3VudGVyc1NhbXBsaW5nKCBwZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmdfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMICkgLSBvZmZzZXRvZiggUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMKCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwmIG9wZXJhdG9yPSggVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFF1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMICYgc2V0UGVyZm9ybWFuY2VDb3VudGVyc1NhbXBsaW5nKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sU2FtcGxpbmdNb2RlSU5URUwgcGVyZm9ybWFuY2VDb3VudGVyc1NhbXBsaW5nXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmcgPSBwZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFF1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcGVyZm9ybWFuY2VDb3VudGVyc1NhbXBsaW5nID09IHJocy5wZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmcgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFF1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUw7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTCBwZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmc7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMICkgPT0gc2l6ZW9mKCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUw+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFF1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudGVySW5kZXhDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBDb3VudGVySW5kaWNlc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBxdWV1ZUZhbWlseUluZGV4KCBxdWV1ZUZhbWlseUluZGV4XyApCisgICAgICAsIGNvdW50ZXJJbmRleENvdW50KCBjb3VudGVySW5kZXhDb3VudF8gKQorICAgICAgLCBwQ291bnRlckluZGljZXMoIHBDb3VudGVySW5kaWNlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgKSAtIG9mZnNldG9mKCBRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIoIFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFF1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiYgb3BlcmF0b3I9KCBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgJiBzZXRRdWV1ZUZhbWlseUluZGV4KCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBxdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSICYgc2V0Q291bnRlckluZGV4Q291bnQoIHVpbnQzMl90IGNvdW50ZXJJbmRleENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb3VudGVySW5kZXhDb3VudCA9IGNvdW50ZXJJbmRleENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgJiBzZXRQQ291bnRlckluZGljZXMoIGNvbnN0IHVpbnQzMl90KiBwQ291bnRlckluZGljZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBDb3VudGVySW5kaWNlcyA9IHBDb3VudGVySW5kaWNlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBxdWV1ZUZhbWlseUluZGV4ID09IHJocy5xdWV1ZUZhbWlseUluZGV4ICkKKyAgICAgICAgICAmJiAoIGNvdW50ZXJJbmRleENvdW50ID09IHJocy5jb3VudGVySW5kZXhDb3VudCApCisgICAgICAgICAgJiYgKCBwQ291bnRlckluZGljZXMgPT0gcmhzLnBDb3VudGVySW5kaWNlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVF1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleDsKKyAgICB1aW50MzJfdCBjb3VudGVySW5kZXhDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcENvdW50ZXJJbmRpY2VzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFF1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiApID09IHNpemVvZiggVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYKKyAgeworICAgIFF1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBjaGVja3BvaW50RXhlY3V0aW9uU3RhZ2VNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogY2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFzayggY2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFza18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYgKSAtIG9mZnNldG9mKCBRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYoIFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFF1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViYgb3BlcmF0b3I9KCBWa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBjaGVja3BvaW50RXhlY3V0aW9uU3RhZ2VNYXNrID09IHJocy5jaGVja3BvaW50RXhlY3V0aW9uU3RhZ2VNYXNrICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIGNoZWNrcG9pbnRFeGVjdXRpb25TdGFnZU1hc2s7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WICkgPT0gc2l6ZW9mKCBWa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFF1ZXVlRmFtaWx5UHJvcGVydGllcworICB7CisgICAgUXVldWVGYW1pbHlQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGbGFncyBxdWV1ZUZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXBWYWxpZEJpdHNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQzRCBtaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHlfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHF1ZXVlRmxhZ3MoIHF1ZXVlRmxhZ3NfICkKKyAgICAgICwgcXVldWVDb3VudCggcXVldWVDb3VudF8gKQorICAgICAgLCB0aW1lc3RhbXBWYWxpZEJpdHMoIHRpbWVzdGFtcFZhbGlkQml0c18gKQorICAgICAgLCBtaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkoIG1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eV8gKQorICAgIHt9CisKKyAgICBRdWV1ZUZhbWlseVByb3BlcnRpZXMoIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFF1ZXVlRmFtaWx5UHJvcGVydGllcyYgb3BlcmF0b3I9KCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseVByb3BlcnRpZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUXVldWVGYW1pbHlQcm9wZXJ0aWVzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggcXVldWVGbGFncyA9PSByaHMucXVldWVGbGFncyApCisgICAgICAgICAgJiYgKCBxdWV1ZUNvdW50ID09IHJocy5xdWV1ZUNvdW50ICkKKyAgICAgICAgICAmJiAoIHRpbWVzdGFtcFZhbGlkQml0cyA9PSByaHMudGltZXN0YW1wVmFsaWRCaXRzICkKKyAgICAgICAgICAmJiAoIG1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSA9PSByaHMubWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBRdWV1ZUZhbWlseVByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmxhZ3MgcXVldWVGbGFnczsKKyAgICB1aW50MzJfdCBxdWV1ZUNvdW50OworICAgIHVpbnQzMl90IHRpbWVzdGFtcFZhbGlkQml0czsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QgbWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFF1ZXVlRmFtaWx5UHJvcGVydGllcyApID09IHNpemVvZiggVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UXVldWVGYW1pbHlQcm9wZXJ0aWVzPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBRdWV1ZUZhbWlseVByb3BlcnRpZXMyCisgIHsKKyAgICBRdWV1ZUZhbWlseVByb3BlcnRpZXMyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzIHF1ZXVlRmFtaWx5UHJvcGVydGllc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHF1ZXVlRmFtaWx5UHJvcGVydGllcyggcXVldWVGYW1pbHlQcm9wZXJ0aWVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseVByb3BlcnRpZXMyICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMiApIC0gb2Zmc2V0b2YoIFF1ZXVlRmFtaWx5UHJvcGVydGllczIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBRdWV1ZUZhbWlseVByb3BlcnRpZXMyKCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiYgb3BlcmF0b3I9KCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcXVldWVGYW1pbHlQcm9wZXJ0aWVzID09IHJocy5xdWV1ZUZhbWlseVByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFF1ZXVlRmFtaWx5UHJvcGVydGllczIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmFtaWx5UHJvcGVydGllcyBxdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiApID09IHNpemVvZiggVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFF1ZXVlRmFtaWx5UHJvcGVydGllczI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WIHR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOVjo6ZUdlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmFsU2hhZGVyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbG9zZXN0SGl0U2hhZGVyXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhbnlIaXRTaGFkZXJfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGludGVyc2VjdGlvblNoYWRlcl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB0eXBlKCB0eXBlXyApCisgICAgICAsIGdlbmVyYWxTaGFkZXIoIGdlbmVyYWxTaGFkZXJfICkKKyAgICAgICwgY2xvc2VzdEhpdFNoYWRlciggY2xvc2VzdEhpdFNoYWRlcl8gKQorICAgICAgLCBhbnlIaXRTaGFkZXIoIGFueUhpdFNoYWRlcl8gKQorICAgICAgLCBpbnRlcnNlY3Rpb25TaGFkZXIoIGludGVyc2VjdGlvblNoYWRlcl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgKSAtIG9mZnNldG9mKCBSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYoIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViYgb3BlcmF0b3I9KCBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgJiBzZXRUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WIHR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHR5cGUgPSB0eXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgJiBzZXRHZW5lcmFsU2hhZGVyKCB1aW50MzJfdCBnZW5lcmFsU2hhZGVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBnZW5lcmFsU2hhZGVyID0gZ2VuZXJhbFNoYWRlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WICYgc2V0Q2xvc2VzdEhpdFNoYWRlciggdWludDMyX3QgY2xvc2VzdEhpdFNoYWRlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY2xvc2VzdEhpdFNoYWRlciA9IGNsb3Nlc3RIaXRTaGFkZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViAmIHNldEFueUhpdFNoYWRlciggdWludDMyX3QgYW55SGl0U2hhZGVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhbnlIaXRTaGFkZXIgPSBhbnlIaXRTaGFkZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViAmIHNldEludGVyc2VjdGlvblNoYWRlciggdWludDMyX3QgaW50ZXJzZWN0aW9uU2hhZGVyXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbnRlcnNlY3Rpb25TaGFkZXIgPSBpbnRlcnNlY3Rpb25TaGFkZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggdHlwZSA9PSByaHMudHlwZSApCisgICAgICAgICAgJiYgKCBnZW5lcmFsU2hhZGVyID09IHJocy5nZW5lcmFsU2hhZGVyICkKKyAgICAgICAgICAmJiAoIGNsb3Nlc3RIaXRTaGFkZXIgPT0gcmhzLmNsb3Nlc3RIaXRTaGFkZXIgKQorICAgICAgICAgICYmICggYW55SGl0U2hhZGVyID09IHJocy5hbnlIaXRTaGFkZXIgKQorICAgICAgICAgICYmICggaW50ZXJzZWN0aW9uU2hhZGVyID09IHJocy5pbnRlcnNlY3Rpb25TaGFkZXIgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlY7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nU2hhZGVyR3JvdXBUeXBlTlYgdHlwZTsKKyAgICB1aW50MzJfdCBnZW5lcmFsU2hhZGVyOworICAgIHVpbnQzMl90IGNsb3Nlc3RIaXRTaGFkZXI7CisgICAgdWludDMyX3QgYW55SGl0U2hhZGVyOworICAgIHVpbnQzMl90IGludGVyc2VjdGlvblNoYWRlcjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgKSA9PSBzaXplb2YoIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0ZUZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFnZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qIHBTdGFnZXNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdyb3VwQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYqIHBHcm91cHNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heFJlY3Vyc2lvbkRlcHRoXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgbGF5b3V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIGJhc2VQaXBlbGluZUhhbmRsZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFzZVBpcGVsaW5lSW5kZXhfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHN0YWdlQ291bnQoIHN0YWdlQ291bnRfICkKKyAgICAgICwgcFN0YWdlcyggcFN0YWdlc18gKQorICAgICAgLCBncm91cENvdW50KCBncm91cENvdW50XyApCisgICAgICAsIHBHcm91cHMoIHBHcm91cHNfICkKKyAgICAgICwgbWF4UmVjdXJzaW9uRGVwdGgoIG1heFJlY3Vyc2lvbkRlcHRoXyApCisgICAgICAsIGxheW91dCggbGF5b3V0XyApCisgICAgICAsIGJhc2VQaXBlbGluZUhhbmRsZSggYmFzZVBpcGVsaW5lSGFuZGxlXyApCisgICAgICAsIGJhc2VQaXBlbGluZUluZGV4KCBiYXNlUGlwZWxpbmVJbmRleF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgKSAtIG9mZnNldG9mKCBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYoIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViAmIHNldFN0YWdlQ291bnQoIHVpbnQzMl90IHN0YWdlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0YWdlQ291bnQgPSBzdGFnZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgJiBzZXRQU3RhZ2VzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qIHBTdGFnZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBTdGFnZXMgPSBwU3RhZ2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgJiBzZXRHcm91cENvdW50KCB1aW50MzJfdCBncm91cENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBncm91cENvdW50ID0gZ3JvdXBDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICYgc2V0UEdyb3VwcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViogcEdyb3Vwc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEdyb3VwcyA9IHBHcm91cHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViAmIHNldE1heFJlY3Vyc2lvbkRlcHRoKCB1aW50MzJfdCBtYXhSZWN1cnNpb25EZXB0aF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWF4UmVjdXJzaW9uRGVwdGggPSBtYXhSZWN1cnNpb25EZXB0aF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICYgc2V0TGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgbGF5b3V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBsYXlvdXQgPSBsYXlvdXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViAmIHNldEJhc2VQaXBlbGluZUhhbmRsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIGJhc2VQaXBlbGluZUhhbmRsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYmFzZVBpcGVsaW5lSGFuZGxlID0gYmFzZVBpcGVsaW5lSGFuZGxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgJiBzZXRCYXNlUGlwZWxpbmVJbmRleCggaW50MzJfdCBiYXNlUGlwZWxpbmVJbmRleF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYmFzZVBpcGVsaW5lSW5kZXggPSBiYXNlUGlwZWxpbmVJbmRleF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggc3RhZ2VDb3VudCA9PSByaHMuc3RhZ2VDb3VudCApCisgICAgICAgICAgJiYgKCBwU3RhZ2VzID09IHJocy5wU3RhZ2VzICkKKyAgICAgICAgICAmJiAoIGdyb3VwQ291bnQgPT0gcmhzLmdyb3VwQ291bnQgKQorICAgICAgICAgICYmICggcEdyb3VwcyA9PSByaHMucEdyb3VwcyApCisgICAgICAgICAgJiYgKCBtYXhSZWN1cnNpb25EZXB0aCA9PSByaHMubWF4UmVjdXJzaW9uRGVwdGggKQorICAgICAgICAgICYmICggbGF5b3V0ID09IHJocy5sYXlvdXQgKQorICAgICAgICAgICYmICggYmFzZVBpcGVsaW5lSGFuZGxlID09IHJocy5iYXNlUGlwZWxpbmVIYW5kbGUgKQorICAgICAgICAgICYmICggYmFzZVBpcGVsaW5lSW5kZXggPT0gcmhzLmJhc2VQaXBlbGluZUluZGV4ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBzdGFnZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogcFN0YWdlczsKKyAgICB1aW50MzJfdCBncm91cENvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYqIHBHcm91cHM7CisgICAgdWludDMyX3QgbWF4UmVjdXJzaW9uRGVwdGg7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgYmFzZVBpcGVsaW5lSGFuZGxlOworICAgIGludDMyX3QgYmFzZVBpcGVsaW5lSW5kZXg7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICkgPT0gc2l6ZW9mKCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFCisgIHsKKyAgICBSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSggdWludDY0X3QgcmVmcmVzaER1cmF0aW9uXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHJlZnJlc2hEdXJhdGlvbiggcmVmcmVzaER1cmF0aW9uXyApCisgICAge30KKworICAgIFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKCBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFJiBvcGVyYXRvcj0oIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHJlZnJlc2hEdXJhdGlvbiA9PSByaHMucmVmcmVzaER1cmF0aW9uICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50NjRfdCByZWZyZXNoRHVyYXRpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUgKSA9PSBzaXplb2YoIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEU+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiggdWludDMyX3QgYXR0YWNobWVudENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcqIHBBdHRhY2htZW50c18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhdHRhY2htZW50Q291bnQoIGF0dGFjaG1lbnRDb3VudF8gKQorICAgICAgLCBwQXR0YWNobWVudHMoIHBBdHRhY2htZW50c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgKSAtIG9mZnNldG9mKCBSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKCBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSJiBvcGVyYXRvcj0oIFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSICYgc2V0QXR0YWNobWVudENvdW50KCB1aW50MzJfdCBhdHRhY2htZW50Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGF0dGFjaG1lbnRDb3VudCA9IGF0dGFjaG1lbnRDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgJiBzZXRQQXR0YWNobWVudHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXcqIHBBdHRhY2htZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEF0dGFjaG1lbnRzID0gcEF0dGFjaG1lbnRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBhdHRhY2htZW50Q291bnQgPT0gcmhzLmF0dGFjaG1lbnRDb3VudCApCisgICAgICAgICAgJiYgKCBwQXR0YWNobWVudHMgPT0gcmhzLnBBdHRhY2htZW50cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3KiBwQXR0YWNobWVudHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgKSA9PSBzaXplb2YoIFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFJlbmRlclBhc3NCZWdpbkluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFJlbmRlclBhc3NCZWdpbkluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXIgZnJhbWVidWZmZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCByZW5kZXJBcmVhXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZWN0MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbGVhclZhbHVlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJWYWx1ZSogcENsZWFyVmFsdWVzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHJlbmRlclBhc3MoIHJlbmRlclBhc3NfICkKKyAgICAgICwgZnJhbWVidWZmZXIoIGZyYW1lYnVmZmVyXyApCisgICAgICAsIHJlbmRlckFyZWEoIHJlbmRlckFyZWFfICkKKyAgICAgICwgY2xlYXJWYWx1ZUNvdW50KCBjbGVhclZhbHVlQ291bnRfICkKKyAgICAgICwgcENsZWFyVmFsdWVzKCBwQ2xlYXJWYWx1ZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NCZWdpbkluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQmVnaW5JbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQmVnaW5JbmZvICkgLSBvZmZzZXRvZiggUmVuZGVyUGFzc0JlZ2luSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NCZWdpbkluZm8oIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQmVnaW5JbmZvJiBvcGVyYXRvcj0oIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQmVnaW5JbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NCZWdpbkluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NCZWdpbkluZm8gJiBzZXRSZW5kZXJQYXNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZW5kZXJQYXNzID0gcmVuZGVyUGFzc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0JlZ2luSW5mbyAmIHNldEZyYW1lYnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXIgZnJhbWVidWZmZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NCZWdpbkluZm8gJiBzZXRSZW5kZXJBcmVhKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEIHJlbmRlckFyZWFfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJlbmRlckFyZWEgPSByZW5kZXJBcmVhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQmVnaW5JbmZvICYgc2V0Q2xlYXJWYWx1ZUNvdW50KCB1aW50MzJfdCBjbGVhclZhbHVlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNsZWFyVmFsdWVDb3VudCA9IGNsZWFyVmFsdWVDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0JlZ2luSW5mbyAmIHNldFBDbGVhclZhbHVlcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyVmFsdWUqIHBDbGVhclZhbHVlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcENsZWFyVmFsdWVzID0gcENsZWFyVmFsdWVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NCZWdpbkluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3NCZWdpbkluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggcmVuZGVyUGFzcyA9PSByaHMucmVuZGVyUGFzcyApCisgICAgICAgICAgJiYgKCBmcmFtZWJ1ZmZlciA9PSByaHMuZnJhbWVidWZmZXIgKQorICAgICAgICAgICYmICggcmVuZGVyQXJlYSA9PSByaHMucmVuZGVyQXJlYSApCisgICAgICAgICAgJiYgKCBjbGVhclZhbHVlQ291bnQgPT0gcmhzLmNsZWFyVmFsdWVDb3VudCApCisgICAgICAgICAgJiYgKCBwQ2xlYXJWYWx1ZXMgPT0gcmhzLnBDbGVhclZhbHVlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVSZW5kZXJQYXNzQmVnaW5JbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEIHJlbmRlckFyZWE7CisgICAgdWludDMyX3QgY2xlYXJWYWx1ZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbGVhclZhbHVlKiBwQ2xlYXJWYWx1ZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUmVuZGVyUGFzc0JlZ2luSW5mbyApID09IHNpemVvZiggVmtSZW5kZXJQYXNzQmVnaW5JbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFJlbmRlclBhc3NCZWdpbkluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFN1YnBhc3NEZXNjcmlwdGlvbgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VicGFzc0Rlc2NyaXB0aW9uKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NEZXNjcmlwdGlvbkZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQmluZFBvaW50OjplR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnB1dEF0dGFjaG1lbnRDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UqIHBJbnB1dEF0dGFjaG1lbnRzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvckF0dGFjaG1lbnRDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UqIHBDb2xvckF0dGFjaG1lbnRzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFJlZmVyZW5jZSogcFJlc29sdmVBdHRhY2htZW50c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UqIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50XyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBwaXBlbGluZUJpbmRQb2ludCggcGlwZWxpbmVCaW5kUG9pbnRfICkKKyAgICAgICwgaW5wdXRBdHRhY2htZW50Q291bnQoIGlucHV0QXR0YWNobWVudENvdW50XyApCisgICAgICAsIHBJbnB1dEF0dGFjaG1lbnRzKCBwSW5wdXRBdHRhY2htZW50c18gKQorICAgICAgLCBjb2xvckF0dGFjaG1lbnRDb3VudCggY29sb3JBdHRhY2htZW50Q291bnRfICkKKyAgICAgICwgcENvbG9yQXR0YWNobWVudHMoIHBDb2xvckF0dGFjaG1lbnRzXyApCisgICAgICAsIHBSZXNvbHZlQXR0YWNobWVudHMoIHBSZXNvbHZlQXR0YWNobWVudHNfICkKKyAgICAgICwgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQoIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50XyApCisgICAgICAsIHByZXNlcnZlQXR0YWNobWVudENvdW50KCBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF8gKQorICAgICAgLCBwUHJlc2VydmVBdHRhY2htZW50cyggcFByZXNlcnZlQXR0YWNobWVudHNfICkKKyAgICB7fQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uKCBWa1N1YnBhc3NEZXNjcmlwdGlvbiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVzY3JpcHRpb24mIG9wZXJhdG9yPSggVmtTdWJwYXNzRGVzY3JpcHRpb24gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0Rlc2NyaXB0aW9uIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbiAmIHNldFBpcGVsaW5lQmluZFBvaW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBpcGVsaW5lQmluZFBvaW50ID0gcGlwZWxpbmVCaW5kUG9pbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbiAmIHNldElucHV0QXR0YWNobWVudENvdW50KCB1aW50MzJfdCBpbnB1dEF0dGFjaG1lbnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5wdXRBdHRhY2htZW50Q291bnQgPSBpbnB1dEF0dGFjaG1lbnRDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uICYgc2V0UElucHV0QXR0YWNobWVudHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlKiBwSW5wdXRBdHRhY2htZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcElucHV0QXR0YWNobWVudHMgPSBwSW5wdXRBdHRhY2htZW50c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uICYgc2V0Q29sb3JBdHRhY2htZW50Q291bnQoIHVpbnQzMl90IGNvbG9yQXR0YWNobWVudENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb2xvckF0dGFjaG1lbnRDb3VudCA9IGNvbG9yQXR0YWNobWVudENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVzY3JpcHRpb24gJiBzZXRQQ29sb3JBdHRhY2htZW50cyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UqIHBDb2xvckF0dGFjaG1lbnRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQ29sb3JBdHRhY2htZW50cyA9IHBDb2xvckF0dGFjaG1lbnRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVzY3JpcHRpb24gJiBzZXRQUmVzb2x2ZUF0dGFjaG1lbnRzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFJlZmVyZW5jZSogcFJlc29sdmVBdHRhY2htZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IHBSZXNvbHZlQXR0YWNobWVudHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbiAmIHNldFBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFJlZmVyZW5jZSogcERlcHRoU3RlbmNpbEF0dGFjaG1lbnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gcERlcHRoU3RlbmNpbEF0dGFjaG1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbiAmIHNldFByZXNlcnZlQXR0YWNobWVudENvdW50KCB1aW50MzJfdCBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcHJlc2VydmVBdHRhY2htZW50Q291bnQgPSBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uICYgc2V0UFByZXNlcnZlQXR0YWNobWVudHMoIGNvbnN0IHVpbnQzMl90KiBwUHJlc2VydmVBdHRhY2htZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFByZXNlcnZlQXR0YWNobWVudHMgPSBwUHJlc2VydmVBdHRhY2htZW50c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdWJwYXNzRGVzY3JpcHRpb24gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdWJwYXNzRGVzY3JpcHRpb24gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTdWJwYXNzRGVzY3JpcHRpb24qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3VicGFzc0Rlc2NyaXB0aW9uIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHBpcGVsaW5lQmluZFBvaW50ID09IHJocy5waXBlbGluZUJpbmRQb2ludCApCisgICAgICAgICAgJiYgKCBpbnB1dEF0dGFjaG1lbnRDb3VudCA9PSByaHMuaW5wdXRBdHRhY2htZW50Q291bnQgKQorICAgICAgICAgICYmICggcElucHV0QXR0YWNobWVudHMgPT0gcmhzLnBJbnB1dEF0dGFjaG1lbnRzICkKKyAgICAgICAgICAmJiAoIGNvbG9yQXR0YWNobWVudENvdW50ID09IHJocy5jb2xvckF0dGFjaG1lbnRDb3VudCApCisgICAgICAgICAgJiYgKCBwQ29sb3JBdHRhY2htZW50cyA9PSByaHMucENvbG9yQXR0YWNobWVudHMgKQorICAgICAgICAgICYmICggcFJlc29sdmVBdHRhY2htZW50cyA9PSByaHMucFJlc29sdmVBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9PSByaHMucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgKQorICAgICAgICAgICYmICggcHJlc2VydmVBdHRhY2htZW50Q291bnQgPT0gcmhzLnByZXNlcnZlQXR0YWNobWVudENvdW50ICkKKyAgICAgICAgICAmJiAoIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID09IHJocy5wUHJlc2VydmVBdHRhY2htZW50cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3VicGFzc0Rlc2NyaXB0aW9uIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVzY3JpcHRpb25GbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgdWludDMyX3QgaW5wdXRBdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UqIHBJbnB1dEF0dGFjaG1lbnRzOworICAgIHVpbnQzMl90IGNvbG9yQXR0YWNobWVudENvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlKiBwQ29sb3JBdHRhY2htZW50czsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFJlZmVyZW5jZSogcFJlc29sdmVBdHRhY2htZW50czsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFJlZmVyZW5jZSogcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ7CisgICAgdWludDMyX3QgcHJlc2VydmVBdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN1YnBhc3NEZXNjcmlwdGlvbiApID09IHNpemVvZiggVmtTdWJwYXNzRGVzY3JpcHRpb24gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3VicGFzc0Rlc2NyaXB0aW9uPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTdWJwYXNzRGVwZW5kZW5jeQorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VicGFzc0RlcGVuZGVuY3koIHVpbnQzMl90IHNyY1N1YnBhc3NfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0U3VicGFzc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFza18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIHNyY0FjY2Vzc01hc2tfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVwZW5kZW5jeUZsYWdzKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNyY1N1YnBhc3MoIHNyY1N1YnBhc3NfICkKKyAgICAgICwgZHN0U3VicGFzcyggZHN0U3VicGFzc18gKQorICAgICAgLCBzcmNTdGFnZU1hc2soIHNyY1N0YWdlTWFza18gKQorICAgICAgLCBkc3RTdGFnZU1hc2soIGRzdFN0YWdlTWFza18gKQorICAgICAgLCBzcmNBY2Nlc3NNYXNrKCBzcmNBY2Nlc3NNYXNrXyApCisgICAgICAsIGRzdEFjY2Vzc01hc2soIGRzdEFjY2Vzc01hc2tfICkKKyAgICAgICwgZGVwZW5kZW5jeUZsYWdzKCBkZXBlbmRlbmN5RmxhZ3NfICkKKyAgICB7fQorCisgICAgU3VicGFzc0RlcGVuZGVuY3koIFZrU3VicGFzc0RlcGVuZGVuY3kgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3VicGFzc0RlcGVuZGVuY3kmIG9wZXJhdG9yPSggVmtTdWJwYXNzRGVwZW5kZW5jeSBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVwZW5kZW5jeSBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVwZW5kZW5jeSAmIHNldFNyY1N1YnBhc3MoIHVpbnQzMl90IHNyY1N1YnBhc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNyY1N1YnBhc3MgPSBzcmNTdWJwYXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVwZW5kZW5jeSAmIHNldERzdFN1YnBhc3MoIHVpbnQzMl90IGRzdFN1YnBhc3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdFN1YnBhc3MgPSBkc3RTdWJwYXNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVwZW5kZW5jeSAmIHNldFNyY1N0YWdlTWFzayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNyY1N0YWdlTWFzayA9IHNyY1N0YWdlTWFza187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0RlcGVuZGVuY3kgJiBzZXREc3RTdGFnZU1hc2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RTdGFnZU1hc2sgPSBkc3RTdGFnZU1hc2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXBlbmRlbmN5ICYgc2V0U3JjQWNjZXNzTWFzayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIHNyY0FjY2Vzc01hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNyY0FjY2Vzc01hc2sgPSBzcmNBY2Nlc3NNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVwZW5kZW5jeSAmIHNldERzdEFjY2Vzc01hc2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RBY2Nlc3NNYXNrID0gZHN0QWNjZXNzTWFza187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0RlcGVuZGVuY3kgJiBzZXREZXBlbmRlbmN5RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXBlbmRlbmN5RmxhZ3MgPSBkZXBlbmRlbmN5RmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VicGFzc0RlcGVuZGVuY3kgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1YnBhc3NEZXBlbmRlbmN5Kj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1YnBhc3NEZXBlbmRlbmN5ICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU3VicGFzc0RlcGVuZGVuY3kqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3VicGFzc0RlcGVuZGVuY3kgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzcmNTdWJwYXNzID09IHJocy5zcmNTdWJwYXNzICkKKyAgICAgICAgICAmJiAoIGRzdFN1YnBhc3MgPT0gcmhzLmRzdFN1YnBhc3MgKQorICAgICAgICAgICYmICggc3JjU3RhZ2VNYXNrID09IHJocy5zcmNTdGFnZU1hc2sgKQorICAgICAgICAgICYmICggZHN0U3RhZ2VNYXNrID09IHJocy5kc3RTdGFnZU1hc2sgKQorICAgICAgICAgICYmICggc3JjQWNjZXNzTWFzayA9PSByaHMuc3JjQWNjZXNzTWFzayApCisgICAgICAgICAgJiYgKCBkc3RBY2Nlc3NNYXNrID09IHJocy5kc3RBY2Nlc3NNYXNrICkKKyAgICAgICAgICAmJiAoIGRlcGVuZGVuY3lGbGFncyA9PSByaHMuZGVwZW5kZW5jeUZsYWdzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdWJwYXNzRGVwZW5kZW5jeSBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50MzJfdCBzcmNTdWJwYXNzOworICAgIHVpbnQzMl90IGRzdFN1YnBhc3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIHNyY0FjY2Vzc01hc2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2Vzc0ZsYWdzIGRzdEFjY2Vzc01hc2s7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlcGVuZGVuY3lGbGFncyBkZXBlbmRlbmN5RmxhZ3M7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3VicGFzc0RlcGVuZGVuY3kgKSA9PSBzaXplb2YoIFZrU3VicGFzc0RlcGVuZGVuY3kgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3VicGFzc0RlcGVuZGVuY3k+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFJlbmRlclBhc3NDcmVhdGVJbmZvCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBSZW5kZXJQYXNzQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0NyZWF0ZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uKiBwQXR0YWNobWVudHNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VicGFzc0NvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVzY3JpcHRpb24qIHBTdWJwYXNzZXNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVwZW5kZW5jeUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVwZW5kZW5jeSogcERlcGVuZGVuY2llc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgYXR0YWNobWVudENvdW50KCBhdHRhY2htZW50Q291bnRfICkKKyAgICAgICwgcEF0dGFjaG1lbnRzKCBwQXR0YWNobWVudHNfICkKKyAgICAgICwgc3VicGFzc0NvdW50KCBzdWJwYXNzQ291bnRfICkKKyAgICAgICwgcFN1YnBhc3NlcyggcFN1YnBhc3Nlc18gKQorICAgICAgLCBkZXBlbmRlbmN5Q291bnQoIGRlcGVuZGVuY3lDb3VudF8gKQorICAgICAgLCBwRGVwZW5kZW5jaWVzKCBwRGVwZW5kZW5jaWVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQ3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQ3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIFJlbmRlclBhc3NDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8oIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQ3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NDcmVhdGVGbGFncyBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8gJiBzZXRBdHRhY2htZW50Q291bnQoIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYXR0YWNobWVudENvdW50ID0gYXR0YWNobWVudENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbyAmIHNldFBBdHRhY2htZW50cyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnREZXNjcmlwdGlvbiogcEF0dGFjaG1lbnRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQXR0YWNobWVudHMgPSBwQXR0YWNobWVudHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NDcmVhdGVJbmZvICYgc2V0U3VicGFzc0NvdW50KCB1aW50MzJfdCBzdWJwYXNzQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN1YnBhc3NDb3VudCA9IHN1YnBhc3NDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8gJiBzZXRQU3VicGFzc2VzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0Rlc2NyaXB0aW9uKiBwU3VicGFzc2VzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwU3VicGFzc2VzID0gcFN1YnBhc3Nlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8gJiBzZXREZXBlbmRlbmN5Q291bnQoIHVpbnQzMl90IGRlcGVuZGVuY3lDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwZW5kZW5jeUNvdW50ID0gZGVwZW5kZW5jeUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbyAmIHNldFBEZXBlbmRlbmNpZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVwZW5kZW5jeSogcERlcGVuZGVuY2llc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcERlcGVuZGVuY2llcyA9IHBEZXBlbmRlbmNpZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUmVuZGVyUGFzc0NyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBhdHRhY2htZW50Q291bnQgPT0gcmhzLmF0dGFjaG1lbnRDb3VudCApCisgICAgICAgICAgJiYgKCBwQXR0YWNobWVudHMgPT0gcmhzLnBBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBzdWJwYXNzQ291bnQgPT0gcmhzLnN1YnBhc3NDb3VudCApCisgICAgICAgICAgJiYgKCBwU3VicGFzc2VzID09IHJocy5wU3VicGFzc2VzICkKKyAgICAgICAgICAmJiAoIGRlcGVuZGVuY3lDb3VudCA9PSByaHMuZGVwZW5kZW5jeUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBEZXBlbmRlbmNpZXMgPT0gcmhzLnBEZXBlbmRlbmNpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFJlbmRlclBhc3NDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVJlbmRlclBhc3NDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0NyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uKiBwQXR0YWNobWVudHM7CisgICAgdWludDMyX3Qgc3VicGFzc0NvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVzY3JpcHRpb24qIHBTdWJwYXNzZXM7CisgICAgdWludDMyX3QgZGVwZW5kZW5jeUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVwZW5kZW5jeSogcERlcGVuZGVuY2llczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBSZW5kZXJQYXNzQ3JlYXRlSW5mbyApID09IHNpemVvZiggVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxSZW5kZXJQYXNzQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3VicGFzc0Rlc2NyaXB0aW9uMktIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VicGFzc0Rlc2NyaXB0aW9uMktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NEZXNjcmlwdGlvbkZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVzY3JpcHRpb25GbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQ6OmVHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2aWV3TWFza18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGlucHV0QXR0YWNobWVudENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBwSW5wdXRBdHRhY2htZW50c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yQXR0YWNobWVudENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBwQ29sb3JBdHRhY2htZW50c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcFJlc29sdmVBdHRhY2htZW50c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcERlcHRoU3RlbmNpbEF0dGFjaG1lbnRfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwUHJlc2VydmVBdHRhY2htZW50c18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgcGlwZWxpbmVCaW5kUG9pbnQoIHBpcGVsaW5lQmluZFBvaW50XyApCisgICAgICAsIHZpZXdNYXNrKCB2aWV3TWFza18gKQorICAgICAgLCBpbnB1dEF0dGFjaG1lbnRDb3VudCggaW5wdXRBdHRhY2htZW50Q291bnRfICkKKyAgICAgICwgcElucHV0QXR0YWNobWVudHMoIHBJbnB1dEF0dGFjaG1lbnRzXyApCisgICAgICAsIGNvbG9yQXR0YWNobWVudENvdW50KCBjb2xvckF0dGFjaG1lbnRDb3VudF8gKQorICAgICAgLCBwQ29sb3JBdHRhY2htZW50cyggcENvbG9yQXR0YWNobWVudHNfICkKKyAgICAgICwgcFJlc29sdmVBdHRhY2htZW50cyggcFJlc29sdmVBdHRhY2htZW50c18gKQorICAgICAgLCBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCggcERlcHRoU3RlbmNpbEF0dGFjaG1lbnRfICkKKyAgICAgICwgcHJlc2VydmVBdHRhY2htZW50Q291bnQoIHByZXNlcnZlQXR0YWNobWVudENvdW50XyApCisgICAgICAsIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzKCBwUHJlc2VydmVBdHRhY2htZW50c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0Rlc2NyaXB0aW9uMktIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NEZXNjcmlwdGlvbjJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NEZXNjcmlwdGlvbjJLSFIgKSAtIG9mZnNldG9mKCBTdWJwYXNzRGVzY3JpcHRpb24yS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uMktIUiggVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbjJLSFImIG9wZXJhdG9yPSggVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NEZXNjcmlwdGlvbjJLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uMktIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uMktIUiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbjJLSFIgJiBzZXRQaXBlbGluZUJpbmRQb2ludCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwaXBlbGluZUJpbmRQb2ludCA9IHBpcGVsaW5lQmluZFBvaW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVzY3JpcHRpb24yS0hSICYgc2V0Vmlld01hc2soIHVpbnQzMl90IHZpZXdNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB2aWV3TWFzayA9IHZpZXdNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVzY3JpcHRpb24yS0hSICYgc2V0SW5wdXRBdHRhY2htZW50Q291bnQoIHVpbnQzMl90IGlucHV0QXR0YWNobWVudENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbnB1dEF0dGFjaG1lbnRDb3VudCA9IGlucHV0QXR0YWNobWVudENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVzY3JpcHRpb24yS0hSICYgc2V0UElucHV0QXR0YWNobWVudHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcElucHV0QXR0YWNobWVudHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gcElucHV0QXR0YWNobWVudHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbjJLSFIgJiBzZXRDb2xvckF0dGFjaG1lbnRDb3VudCggdWludDMyX3QgY29sb3JBdHRhY2htZW50Q291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbG9yQXR0YWNobWVudENvdW50ID0gY29sb3JBdHRhY2htZW50Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbjJLSFIgJiBzZXRQQ29sb3JBdHRhY2htZW50cyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBwQ29sb3JBdHRhY2htZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcENvbG9yQXR0YWNobWVudHMgPSBwQ29sb3JBdHRhY2htZW50c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uMktIUiAmIHNldFBSZXNvbHZlQXR0YWNobWVudHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcFJlc29sdmVBdHRhY2htZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IHBSZXNvbHZlQXR0YWNobWVudHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbjJLSFIgJiBzZXRQRGVwdGhTdGVuY2lsQXR0YWNobWVudCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBwRGVwdGhTdGVuY2lsQXR0YWNobWVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBwRGVwdGhTdGVuY2lsQXR0YWNobWVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uMktIUiAmIHNldFByZXNlcnZlQXR0YWNobWVudENvdW50KCB1aW50MzJfdCBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcHJlc2VydmVBdHRhY2htZW50Q291bnQgPSBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uMktIUiAmIHNldFBQcmVzZXJ2ZUF0dGFjaG1lbnRzKCBjb25zdCB1aW50MzJfdCogcFByZXNlcnZlQXR0YWNobWVudHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID0gcFByZXNlcnZlQXR0YWNobWVudHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTdWJwYXNzRGVzY3JpcHRpb24yS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggcGlwZWxpbmVCaW5kUG9pbnQgPT0gcmhzLnBpcGVsaW5lQmluZFBvaW50ICkKKyAgICAgICAgICAmJiAoIHZpZXdNYXNrID09IHJocy52aWV3TWFzayApCisgICAgICAgICAgJiYgKCBpbnB1dEF0dGFjaG1lbnRDb3VudCA9PSByaHMuaW5wdXRBdHRhY2htZW50Q291bnQgKQorICAgICAgICAgICYmICggcElucHV0QXR0YWNobWVudHMgPT0gcmhzLnBJbnB1dEF0dGFjaG1lbnRzICkKKyAgICAgICAgICAmJiAoIGNvbG9yQXR0YWNobWVudENvdW50ID09IHJocy5jb2xvckF0dGFjaG1lbnRDb3VudCApCisgICAgICAgICAgJiYgKCBwQ29sb3JBdHRhY2htZW50cyA9PSByaHMucENvbG9yQXR0YWNobWVudHMgKQorICAgICAgICAgICYmICggcFJlc29sdmVBdHRhY2htZW50cyA9PSByaHMucFJlc29sdmVBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9PSByaHMucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgKQorICAgICAgICAgICYmICggcHJlc2VydmVBdHRhY2htZW50Q291bnQgPT0gcmhzLnByZXNlcnZlQXR0YWNobWVudENvdW50ICkKKyAgICAgICAgICAmJiAoIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID09IHJocy5wUHJlc2VydmVBdHRhY2htZW50cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3VicGFzc0Rlc2NyaXB0aW9uMktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTdWJwYXNzRGVzY3JpcHRpb24yS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MgZmxhZ3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50OworICAgIHVpbnQzMl90IHZpZXdNYXNrOworICAgIHVpbnQzMl90IGlucHV0QXR0YWNobWVudENvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcElucHV0QXR0YWNobWVudHM7CisgICAgdWludDMyX3QgY29sb3JBdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBwQ29sb3JBdHRhY2htZW50czsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFJlZmVyZW5jZTJLSFIqIHBSZXNvbHZlQXR0YWNobWVudHM7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBwRGVwdGhTdGVuY2lsQXR0YWNobWVudDsKKyAgICB1aW50MzJfdCBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcFByZXNlcnZlQXR0YWNobWVudHM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3VicGFzc0Rlc2NyaXB0aW9uMktIUiApID09IHNpemVvZiggVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFN1YnBhc3NEZXNjcmlwdGlvbjJLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFN1YnBhc3NEZXBlbmRlbmN5MktIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VicGFzc0RlcGVuZGVuY3kyS0hSKCB1aW50MzJfdCBzcmNTdWJwYXNzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RTdWJwYXNzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFza18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFza18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3Mgc3JjQWNjZXNzTWFza18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlcGVuZGVuY3lGbGFncyBkZXBlbmRlbmN5RmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlcGVuZGVuY3lGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2aWV3T2Zmc2V0XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNyY1N1YnBhc3MoIHNyY1N1YnBhc3NfICkKKyAgICAgICwgZHN0U3VicGFzcyggZHN0U3VicGFzc18gKQorICAgICAgLCBzcmNTdGFnZU1hc2soIHNyY1N0YWdlTWFza18gKQorICAgICAgLCBkc3RTdGFnZU1hc2soIGRzdFN0YWdlTWFza18gKQorICAgICAgLCBzcmNBY2Nlc3NNYXNrKCBzcmNBY2Nlc3NNYXNrXyApCisgICAgICAsIGRzdEFjY2Vzc01hc2soIGRzdEFjY2Vzc01hc2tfICkKKyAgICAgICwgZGVwZW5kZW5jeUZsYWdzKCBkZXBlbmRlbmN5RmxhZ3NfICkKKyAgICAgICwgdmlld09mZnNldCggdmlld09mZnNldF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0RlcGVuZGVuY3kyS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0RlcGVuZGVuY3kyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVwZW5kZW5jeTJLSFIgKSAtIG9mZnNldG9mKCBTdWJwYXNzRGVwZW5kZW5jeTJLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVwZW5kZW5jeTJLSFIoIFZrU3VicGFzc0RlcGVuZGVuY3kyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFN1YnBhc3NEZXBlbmRlbmN5MktIUiYgb3BlcmF0b3I9KCBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVwZW5kZW5jeTJLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0RlcGVuZGVuY3kyS0hSICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVwZW5kZW5jeTJLSFIgJiBzZXRTcmNTdWJwYXNzKCB1aW50MzJfdCBzcmNTdWJwYXNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzcmNTdWJwYXNzID0gc3JjU3VicGFzc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0RlcGVuZGVuY3kyS0hSICYgc2V0RHN0U3VicGFzcyggdWludDMyX3QgZHN0U3VicGFzc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0U3VicGFzcyA9IGRzdFN1YnBhc3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXBlbmRlbmN5MktIUiAmIHNldFNyY1N0YWdlTWFzayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2tfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNyY1N0YWdlTWFzayA9IHNyY1N0YWdlTWFza187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0RlcGVuZGVuY3kyS0hSICYgc2V0RHN0U3RhZ2VNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0U3RhZ2VNYXNrID0gZHN0U3RhZ2VNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVwZW5kZW5jeTJLSFIgJiBzZXRTcmNBY2Nlc3NNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZXNzRmxhZ3Mgc3JjQWNjZXNzTWFza18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3JjQWNjZXNzTWFzayA9IHNyY0FjY2Vzc01hc2tfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXBlbmRlbmN5MktIUiAmIHNldERzdEFjY2Vzc01hc2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RBY2Nlc3NNYXNrID0gZHN0QWNjZXNzTWFza187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0RlcGVuZGVuY3kyS0hSICYgc2V0RGVwZW5kZW5jeUZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwZW5kZW5jeUZsYWdzID0gZGVwZW5kZW5jeUZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVwZW5kZW5jeTJLSFIgJiBzZXRWaWV3T2Zmc2V0KCBpbnQzMl90IHZpZXdPZmZzZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZpZXdPZmZzZXQgPSB2aWV3T2Zmc2V0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VicGFzc0RlcGVuZGVuY3kyS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N1YnBhc3NEZXBlbmRlbmN5MktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTdWJwYXNzRGVwZW5kZW5jeTJLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNyY1N1YnBhc3MgPT0gcmhzLnNyY1N1YnBhc3MgKQorICAgICAgICAgICYmICggZHN0U3VicGFzcyA9PSByaHMuZHN0U3VicGFzcyApCisgICAgICAgICAgJiYgKCBzcmNTdGFnZU1hc2sgPT0gcmhzLnNyY1N0YWdlTWFzayApCisgICAgICAgICAgJiYgKCBkc3RTdGFnZU1hc2sgPT0gcmhzLmRzdFN0YWdlTWFzayApCisgICAgICAgICAgJiYgKCBzcmNBY2Nlc3NNYXNrID09IHJocy5zcmNBY2Nlc3NNYXNrICkKKyAgICAgICAgICAmJiAoIGRzdEFjY2Vzc01hc2sgPT0gcmhzLmRzdEFjY2Vzc01hc2sgKQorICAgICAgICAgICYmICggZGVwZW5kZW5jeUZsYWdzID09IHJocy5kZXBlbmRlbmN5RmxhZ3MgKQorICAgICAgICAgICYmICggdmlld09mZnNldCA9PSByaHMudmlld09mZnNldCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3VicGFzc0RlcGVuZGVuY3kyS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVN1YnBhc3NEZXBlbmRlbmN5MktIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3Qgc3JjU3VicGFzczsKKyAgICB1aW50MzJfdCBkc3RTdWJwYXNzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBzcmNBY2Nlc3NNYXNrOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzOworICAgIGludDMyX3Qgdmlld09mZnNldDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTdWJwYXNzRGVwZW5kZW5jeTJLSFIgKSA9PSBzaXplb2YoIFZrU3VicGFzc0RlcGVuZGVuY3kyS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFN1YnBhc3NEZXBlbmRlbmN5MktIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXR0YWNobWVudENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudERlc2NyaXB0aW9uMktIUiogcEF0dGFjaG1lbnRzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJwYXNzQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVzY3JpcHRpb24yS0hSKiBwU3VicGFzc2VzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXBlbmRlbmN5Q291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVwZW5kZW5jeTJLSFIqIHBEZXBlbmRlbmNpZXNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvcnJlbGF0ZWRWaWV3TWFza0NvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcENvcnJlbGF0ZWRWaWV3TWFza3NfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGF0dGFjaG1lbnRDb3VudCggYXR0YWNobWVudENvdW50XyApCisgICAgICAsIHBBdHRhY2htZW50cyggcEF0dGFjaG1lbnRzXyApCisgICAgICAsIHN1YnBhc3NDb3VudCggc3VicGFzc0NvdW50XyApCisgICAgICAsIHBTdWJwYXNzZXMoIHBTdWJwYXNzZXNfICkKKyAgICAgICwgZGVwZW5kZW5jeUNvdW50KCBkZXBlbmRlbmN5Q291bnRfICkKKyAgICAgICwgcERlcGVuZGVuY2llcyggcERlcGVuZGVuY2llc18gKQorICAgICAgLCBjb3JyZWxhdGVkVmlld01hc2tDb3VudCggY29ycmVsYXRlZFZpZXdNYXNrQ291bnRfICkKKyAgICAgICwgcENvcnJlbGF0ZWRWaWV3TWFza3MoIHBDb3JyZWxhdGVkVmlld01hc2tzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiApIC0gb2Zmc2V0b2YoIFJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiggVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSJiBvcGVyYXRvcj0oIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0NyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBzZXRBdHRhY2htZW50Q291bnQoIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYXR0YWNobWVudENvdW50ID0gYXR0YWNobWVudENvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBzZXRQQXR0YWNobWVudHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSKiBwQXR0YWNobWVudHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBBdHRhY2htZW50cyA9IHBBdHRhY2htZW50c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICYgc2V0U3VicGFzc0NvdW50KCB1aW50MzJfdCBzdWJwYXNzQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN1YnBhc3NDb3VudCA9IHN1YnBhc3NDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICYgc2V0UFN1YnBhc3NlcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NEZXNjcmlwdGlvbjJLSFIqIHBTdWJwYXNzZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBTdWJwYXNzZXMgPSBwU3VicGFzc2VzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBzZXREZXBlbmRlbmN5Q291bnQoIHVpbnQzMl90IGRlcGVuZGVuY3lDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwZW5kZW5jeUNvdW50ID0gZGVwZW5kZW5jeUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBzZXRQRGVwZW5kZW5jaWVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0RlcGVuZGVuY3kyS0hSKiBwRGVwZW5kZW5jaWVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRGVwZW5kZW5jaWVzID0gcERlcGVuZGVuY2llc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICYgc2V0Q29ycmVsYXRlZFZpZXdNYXNrQ291bnQoIHVpbnQzMl90IGNvcnJlbGF0ZWRWaWV3TWFza0NvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb3JyZWxhdGVkVmlld01hc2tDb3VudCA9IGNvcnJlbGF0ZWRWaWV3TWFza0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBzZXRQQ29ycmVsYXRlZFZpZXdNYXNrcyggY29uc3QgdWludDMyX3QqIHBDb3JyZWxhdGVkVmlld01hc2tzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQ29ycmVsYXRlZFZpZXdNYXNrcyA9IHBDb3JyZWxhdGVkVmlld01hc2tzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBhdHRhY2htZW50Q291bnQgPT0gcmhzLmF0dGFjaG1lbnRDb3VudCApCisgICAgICAgICAgJiYgKCBwQXR0YWNobWVudHMgPT0gcmhzLnBBdHRhY2htZW50cyApCisgICAgICAgICAgJiYgKCBzdWJwYXNzQ291bnQgPT0gcmhzLnN1YnBhc3NDb3VudCApCisgICAgICAgICAgJiYgKCBwU3VicGFzc2VzID09IHJocy5wU3VicGFzc2VzICkKKyAgICAgICAgICAmJiAoIGRlcGVuZGVuY3lDb3VudCA9PSByaHMuZGVwZW5kZW5jeUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBEZXBlbmRlbmNpZXMgPT0gcmhzLnBEZXBlbmRlbmNpZXMgKQorICAgICAgICAgICYmICggY29ycmVsYXRlZFZpZXdNYXNrQ291bnQgPT0gcmhzLmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50ICkKKyAgICAgICAgICAmJiAoIHBDb3JyZWxhdGVkVmlld01hc2tzID09IHJocy5wQ29ycmVsYXRlZFZpZXdNYXNrcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVJlbmRlclBhc3NDcmVhdGVJbmZvMktIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIqIHBBdHRhY2htZW50czsKKyAgICB1aW50MzJfdCBzdWJwYXNzQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NEZXNjcmlwdGlvbjJLSFIqIHBTdWJwYXNzZXM7CisgICAgdWludDMyX3QgZGVwZW5kZW5jeUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVwZW5kZW5jeTJLSFIqIHBEZXBlbmRlbmNpZXM7CisgICAgdWludDMyX3QgY29ycmVsYXRlZFZpZXdNYXNrQ291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBDb3JyZWxhdGVkVmlld01hc2tzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiApID09IHNpemVvZiggVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCggZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgKSAtIG9mZnNldG9mKCBSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUKCBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUICYgc2V0RnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRSZWZlcmVuY2UgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCA9IGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgPT0gcmhzLmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QXR0YWNobWVudFJlZmVyZW5jZSBmcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8oIHVpbnQzMl90IGFzcGVjdFJlZmVyZW5jZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UqIHBBc3BlY3RSZWZlcmVuY2VzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGFzcGVjdFJlZmVyZW5jZUNvdW50KCBhc3BlY3RSZWZlcmVuY2VDb3VudF8gKQorICAgICAgLCBwQXNwZWN0UmVmZXJlbmNlcyggcEFzcGVjdFJlZmVyZW5jZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyggVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyYgb3BlcmF0b3I9KCBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyAmIHNldEFzcGVjdFJlZmVyZW5jZUNvdW50KCB1aW50MzJfdCBhc3BlY3RSZWZlcmVuY2VDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYXNwZWN0UmVmZXJlbmNlQ291bnQgPSBhc3BlY3RSZWZlcmVuY2VDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gJiBzZXRQQXNwZWN0UmVmZXJlbmNlcyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OklucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSogcEFzcGVjdFJlZmVyZW5jZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBBc3BlY3RSZWZlcmVuY2VzID0gcEFzcGVjdFJlZmVyZW5jZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGFzcGVjdFJlZmVyZW5jZUNvdW50ID09IHJocy5hc3BlY3RSZWZlcmVuY2VDb3VudCApCisgICAgICAgICAgJiYgKCBwQXNwZWN0UmVmZXJlbmNlcyA9PSByaHMucEFzcGVjdFJlZmVyZW5jZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBhc3BlY3RSZWZlcmVuY2VDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlKiBwQXNwZWN0UmVmZXJlbmNlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyApID09IHNpemVvZiggVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFJlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvKCB1aW50MzJfdCBzdWJwYXNzQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBWaWV3TWFza3NfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVwZW5kZW5jeUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHBWaWV3T2Zmc2V0c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3JyZWxhdGlvbk1hc2tDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcENvcnJlbGF0aW9uTWFza3NfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc3VicGFzc0NvdW50KCBzdWJwYXNzQ291bnRfICkKKyAgICAgICwgcFZpZXdNYXNrcyggcFZpZXdNYXNrc18gKQorICAgICAgLCBkZXBlbmRlbmN5Q291bnQoIGRlcGVuZGVuY3lDb3VudF8gKQorICAgICAgLCBwVmlld09mZnNldHMoIHBWaWV3T2Zmc2V0c18gKQorICAgICAgLCBjb3JyZWxhdGlvbk1hc2tDb3VudCggY29ycmVsYXRpb25NYXNrQ291bnRfICkKKyAgICAgICwgcENvcnJlbGF0aW9uTWFza3MoIHBDb3JyZWxhdGlvbk1hc2tzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyApIC0gb2Zmc2V0b2YoIFJlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8oIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8mIG9wZXJhdG9yPSggVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gJiBzZXRTdWJwYXNzQ291bnQoIHVpbnQzMl90IHN1YnBhc3NDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3VicGFzc0NvdW50ID0gc3VicGFzc0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyAmIHNldFBWaWV3TWFza3MoIGNvbnN0IHVpbnQzMl90KiBwVmlld01hc2tzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmlld01hc2tzID0gcFZpZXdNYXNrc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gJiBzZXREZXBlbmRlbmN5Q291bnQoIHVpbnQzMl90IGRlcGVuZGVuY3lDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGVwZW5kZW5jeUNvdW50ID0gZGVwZW5kZW5jeUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyAmIHNldFBWaWV3T2Zmc2V0cyggY29uc3QgaW50MzJfdCogcFZpZXdPZmZzZXRzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmlld09mZnNldHMgPSBwVmlld09mZnNldHNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvICYgc2V0Q29ycmVsYXRpb25NYXNrQ291bnQoIHVpbnQzMl90IGNvcnJlbGF0aW9uTWFza0NvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb3JyZWxhdGlvbk1hc2tDb3VudCA9IGNvcnJlbGF0aW9uTWFza0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyAmIHNldFBDb3JyZWxhdGlvbk1hc2tzKCBjb25zdCB1aW50MzJfdCogcENvcnJlbGF0aW9uTWFza3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBDb3JyZWxhdGlvbk1hc2tzID0gcENvcnJlbGF0aW9uTWFza3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN1YnBhc3NDb3VudCA9PSByaHMuc3VicGFzc0NvdW50ICkKKyAgICAgICAgICAmJiAoIHBWaWV3TWFza3MgPT0gcmhzLnBWaWV3TWFza3MgKQorICAgICAgICAgICYmICggZGVwZW5kZW5jeUNvdW50ID09IHJocy5kZXBlbmRlbmN5Q291bnQgKQorICAgICAgICAgICYmICggcFZpZXdPZmZzZXRzID09IHJocy5wVmlld09mZnNldHMgKQorICAgICAgICAgICYmICggY29ycmVsYXRpb25NYXNrQ291bnQgPT0gcmhzLmNvcnJlbGF0aW9uTWFza0NvdW50ICkKKyAgICAgICAgICAmJiAoIHBDb3JyZWxhdGlvbk1hc2tzID09IHJocy5wQ29ycmVsYXRpb25NYXNrcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IHN1YnBhc3NDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcFZpZXdNYXNrczsKKyAgICB1aW50MzJfdCBkZXBlbmRlbmN5Q291bnQ7CisgICAgY29uc3QgaW50MzJfdCogcFZpZXdPZmZzZXRzOworICAgIHVpbnQzMl90IGNvcnJlbGF0aW9uTWFza0NvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwQ29ycmVsYXRpb25NYXNrczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyApID09IHNpemVvZiggVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCggdWludDMyX3Qgc3VicGFzc0luZGV4XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQgc2FtcGxlTG9jYXRpb25zSW5mb18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlTG9jYXRpb25zSW5mb0VYVCgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdWJwYXNzSW5kZXgoIHN1YnBhc3NJbmRleF8gKQorICAgICAgLCBzYW1wbGVMb2NhdGlvbnNJbmZvKCBzYW1wbGVMb2NhdGlvbnNJbmZvXyApCisgICAge30KKworICAgIFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQoIFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUJiBvcGVyYXRvcj0oIFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQgJiBzZXRTdWJwYXNzSW5kZXgoIHVpbnQzMl90IHN1YnBhc3NJbmRleF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3VicGFzc0luZGV4ID0gc3VicGFzc0luZGV4XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUICYgc2V0U2FtcGxlTG9jYXRpb25zSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQgc2FtcGxlTG9jYXRpb25zSW5mb18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2FtcGxlTG9jYXRpb25zSW5mbyA9IHNhbXBsZUxvY2F0aW9uc0luZm9fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc3VicGFzc0luZGV4ID09IHJocy5zdWJwYXNzSW5kZXggKQorICAgICAgICAgICYmICggc2FtcGxlTG9jYXRpb25zSW5mbyA9PSByaHMuc2FtcGxlTG9jYXRpb25zSW5mbyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50MzJfdCBzdWJwYXNzSW5kZXg7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQgc2FtcGxlTG9jYXRpb25zSW5mbzsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUICkgPT0gc2l6ZW9mKCBWa1N1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCggdWludDMyX3QgYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUKiBwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0NvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQqIHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50KCBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50XyApCisgICAgICAsIHBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyggcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zXyApCisgICAgICAsIHBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQoIHBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnRfICkKKyAgICAgICwgcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zKCBwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUICkgLSBvZmZzZXRvZiggUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQoIFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUJiBvcGVyYXRvcj0oIFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgJiBzZXRBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50KCB1aW50MzJfdCBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50ID0gYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCAmIHNldFBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkF0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQqIHBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zID0gcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUICYgc2V0UG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudCggdWludDMyX3QgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudCA9IHBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgJiBzZXRQUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUKiBwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucyA9IHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFJlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQgPT0gcmhzLmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQgKQorICAgICAgICAgICYmICggcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zID09IHJocy5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMgKQorICAgICAgICAgICYmICggcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudCA9PSByaHMucG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudCApCisgICAgICAgICAgJiYgKCBwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMgPT0gcmhzLnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUKiBwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnM7CisgICAgdWludDMyX3QgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCogcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFJlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgKSA9PSBzaXplb2YoIFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTYW1wbGVyQ3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2FtcGxlckNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQ3JlYXRlRmxhZ3MgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJDcmVhdGVGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyIG1hZ0ZpbHRlcl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyOjplTmVhcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZpbHRlciBtaW5GaWx0ZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZpbHRlcjo6ZU5lYXJlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyTWlwbWFwTW9kZSBtaXBtYXBNb2RlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyTWlwbWFwTW9kZTo6ZU5lYXJlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQWRkcmVzc01vZGUgYWRkcmVzc01vZGVVXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQWRkcmVzc01vZGU6OmVSZXBlYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQWRkcmVzc01vZGUgYWRkcmVzc01vZGVWXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQWRkcmVzc01vZGU6OmVSZXBlYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQWRkcmVzc01vZGUgYWRkcmVzc01vZGVXXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQWRkcmVzc01vZGU6OmVSZXBlYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1pcExvZEJpYXNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhbmlzb3Ryb3B5RW5hYmxlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heEFuaXNvdHJvcHlfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjb21wYXJlRW5hYmxlXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wYXJlT3AgY29tcGFyZU9wXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wYXJlT3A6OmVOZXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWluTG9kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heExvZF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9yZGVyQ29sb3IgYm9yZGVyQ29sb3JfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvcmRlckNvbG9yOjplRmxvYXRUcmFuc3BhcmVudEJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHVubm9ybWFsaXplZENvb3JkaW5hdGVzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBtYWdGaWx0ZXIoIG1hZ0ZpbHRlcl8gKQorICAgICAgLCBtaW5GaWx0ZXIoIG1pbkZpbHRlcl8gKQorICAgICAgLCBtaXBtYXBNb2RlKCBtaXBtYXBNb2RlXyApCisgICAgICAsIGFkZHJlc3NNb2RlVSggYWRkcmVzc01vZGVVXyApCisgICAgICAsIGFkZHJlc3NNb2RlViggYWRkcmVzc01vZGVWXyApCisgICAgICAsIGFkZHJlc3NNb2RlVyggYWRkcmVzc01vZGVXXyApCisgICAgICAsIG1pcExvZEJpYXMoIG1pcExvZEJpYXNfICkKKyAgICAgICwgYW5pc290cm9weUVuYWJsZSggYW5pc290cm9weUVuYWJsZV8gKQorICAgICAgLCBtYXhBbmlzb3Ryb3B5KCBtYXhBbmlzb3Ryb3B5XyApCisgICAgICAsIGNvbXBhcmVFbmFibGUoIGNvbXBhcmVFbmFibGVfICkKKyAgICAgICwgY29tcGFyZU9wKCBjb21wYXJlT3BfICkKKyAgICAgICwgbWluTG9kKCBtaW5Mb2RfICkKKyAgICAgICwgbWF4TG9kKCBtYXhMb2RfICkKKyAgICAgICwgYm9yZGVyQ29sb3IoIGJvcmRlckNvbG9yXyApCisgICAgICAsIHVubm9ybWFsaXplZENvb3JkaW5hdGVzKCB1bm5vcm1hbGl6ZWRDb29yZGluYXRlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlckNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlckNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBTYW1wbGVyQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJDcmVhdGVJbmZvKCBWa1NhbXBsZXJDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNhbXBsZXJDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrU2FtcGxlckNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlckNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlckNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJDcmVhdGVJbmZvICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQ3JlYXRlRmxhZ3MgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJDcmVhdGVJbmZvICYgc2V0TWFnRmlsdGVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyIG1hZ0ZpbHRlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWFnRmlsdGVyID0gbWFnRmlsdGVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyQ3JlYXRlSW5mbyAmIHNldE1pbkZpbHRlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZpbHRlciBtaW5GaWx0ZXJfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1pbkZpbHRlciA9IG1pbkZpbHRlcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlckNyZWF0ZUluZm8gJiBzZXRNaXBtYXBNb2RlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlck1pcG1hcE1vZGUgbWlwbWFwTW9kZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWlwbWFwTW9kZSA9IG1pcG1hcE1vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJDcmVhdGVJbmZvICYgc2V0QWRkcmVzc01vZGVVKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlckFkZHJlc3NNb2RlIGFkZHJlc3NNb2RlVV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYWRkcmVzc01vZGVVID0gYWRkcmVzc01vZGVVXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyQ3JlYXRlSW5mbyAmIHNldEFkZHJlc3NNb2RlViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJBZGRyZXNzTW9kZSBhZGRyZXNzTW9kZVZfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFkZHJlc3NNb2RlViA9IGFkZHJlc3NNb2RlVl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlckNyZWF0ZUluZm8gJiBzZXRBZGRyZXNzTW9kZVcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQWRkcmVzc01vZGUgYWRkcmVzc01vZGVXXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhZGRyZXNzTW9kZVcgPSBhZGRyZXNzTW9kZVdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJDcmVhdGVJbmZvICYgc2V0TWlwTG9kQmlhcyggZmxvYXQgbWlwTG9kQmlhc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWlwTG9kQmlhcyA9IG1pcExvZEJpYXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJDcmVhdGVJbmZvICYgc2V0QW5pc290cm9weUVuYWJsZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBhbmlzb3Ryb3B5RW5hYmxlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhbmlzb3Ryb3B5RW5hYmxlID0gYW5pc290cm9weUVuYWJsZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlckNyZWF0ZUluZm8gJiBzZXRNYXhBbmlzb3Ryb3B5KCBmbG9hdCBtYXhBbmlzb3Ryb3B5XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXhBbmlzb3Ryb3B5ID0gbWF4QW5pc290cm9weV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlckNyZWF0ZUluZm8gJiBzZXRDb21wYXJlRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNvbXBhcmVFbmFibGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbXBhcmVFbmFibGUgPSBjb21wYXJlRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyQ3JlYXRlSW5mbyAmIHNldENvbXBhcmVPcCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBhcmVPcCBjb21wYXJlT3BfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbXBhcmVPcCA9IGNvbXBhcmVPcF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlckNyZWF0ZUluZm8gJiBzZXRNaW5Mb2QoIGZsb2F0IG1pbkxvZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWluTG9kID0gbWluTG9kXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyQ3JlYXRlSW5mbyAmIHNldE1heExvZCggZmxvYXQgbWF4TG9kXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtYXhMb2QgPSBtYXhMb2RfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJDcmVhdGVJbmZvICYgc2V0Qm9yZGVyQ29sb3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb3JkZXJDb2xvciBib3JkZXJDb2xvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgYm9yZGVyQ29sb3IgPSBib3JkZXJDb2xvcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlckNyZWF0ZUluZm8gJiBzZXRVbm5vcm1hbGl6ZWRDb29yZGluYXRlcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB1bm5vcm1hbGl6ZWRDb29yZGluYXRlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgPSB1bm5vcm1hbGl6ZWRDb29yZGluYXRlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTYW1wbGVyQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2FtcGxlckNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTYW1wbGVyQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTYW1wbGVyQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIG1hZ0ZpbHRlciA9PSByaHMubWFnRmlsdGVyICkKKyAgICAgICAgICAmJiAoIG1pbkZpbHRlciA9PSByaHMubWluRmlsdGVyICkKKyAgICAgICAgICAmJiAoIG1pcG1hcE1vZGUgPT0gcmhzLm1pcG1hcE1vZGUgKQorICAgICAgICAgICYmICggYWRkcmVzc01vZGVVID09IHJocy5hZGRyZXNzTW9kZVUgKQorICAgICAgICAgICYmICggYWRkcmVzc01vZGVWID09IHJocy5hZGRyZXNzTW9kZVYgKQorICAgICAgICAgICYmICggYWRkcmVzc01vZGVXID09IHJocy5hZGRyZXNzTW9kZVcgKQorICAgICAgICAgICYmICggbWlwTG9kQmlhcyA9PSByaHMubWlwTG9kQmlhcyApCisgICAgICAgICAgJiYgKCBhbmlzb3Ryb3B5RW5hYmxlID09IHJocy5hbmlzb3Ryb3B5RW5hYmxlICkKKyAgICAgICAgICAmJiAoIG1heEFuaXNvdHJvcHkgPT0gcmhzLm1heEFuaXNvdHJvcHkgKQorICAgICAgICAgICYmICggY29tcGFyZUVuYWJsZSA9PSByaHMuY29tcGFyZUVuYWJsZSApCisgICAgICAgICAgJiYgKCBjb21wYXJlT3AgPT0gcmhzLmNvbXBhcmVPcCApCisgICAgICAgICAgJiYgKCBtaW5Mb2QgPT0gcmhzLm1pbkxvZCApCisgICAgICAgICAgJiYgKCBtYXhMb2QgPT0gcmhzLm1heExvZCApCisgICAgICAgICAgJiYgKCBib3JkZXJDb2xvciA9PSByaHMuYm9yZGVyQ29sb3IgKQorICAgICAgICAgICYmICggdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgPT0gcmhzLnVubm9ybWFsaXplZENvb3JkaW5hdGVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTYW1wbGVyQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTYW1wbGVyQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyIG1hZ0ZpbHRlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyIG1pbkZpbHRlcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlck1pcG1hcE1vZGUgbWlwbWFwTW9kZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlckFkZHJlc3NNb2RlIGFkZHJlc3NNb2RlVTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlckFkZHJlc3NNb2RlIGFkZHJlc3NNb2RlVjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlckFkZHJlc3NNb2RlIGFkZHJlc3NNb2RlVzsKKyAgICBmbG9hdCBtaXBMb2RCaWFzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgYW5pc290cm9weUVuYWJsZTsKKyAgICBmbG9hdCBtYXhBbmlzb3Ryb3B5OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY29tcGFyZUVuYWJsZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcGFyZU9wIGNvbXBhcmVPcDsKKyAgICBmbG9hdCBtaW5Mb2Q7CisgICAgZmxvYXQgbWF4TG9kOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb3JkZXJDb2xvciBib3JkZXJDb2xvcjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHVubm9ybWFsaXplZENvb3JkaW5hdGVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNhbXBsZXJDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa1NhbXBsZXJDcmVhdGVJbmZvICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFNhbXBsZXJDcmVhdGVJbmZvPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUIHJlZHVjdGlvbk1vZGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUOjplV2VpZ2h0ZWRBdmVyYWdlICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiByZWR1Y3Rpb25Nb2RlKCByZWR1Y3Rpb25Nb2RlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFNhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCggVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCAmIHNldFJlZHVjdGlvbk1vZGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyUmVkdWN0aW9uTW9kZUVYVCByZWR1Y3Rpb25Nb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZWR1Y3Rpb25Nb2RlID0gcmVkdWN0aW9uTW9kZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCByZWR1Y3Rpb25Nb2RlID09IHJocy5yZWR1Y3Rpb25Nb2RlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclJlZHVjdGlvbk1vZGVFWFQgcmVkdWN0aW9uTW9kZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgKSA9PSBzaXplb2YoIFZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFNhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0OjplVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIHljYmNyTW9kZWxfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbjo6ZVJnYklkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyUmFuZ2UgeWNiY3JSYW5nZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyUmFuZ2U6OmVJdHVGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcG9uZW50TWFwcGluZyBjb21wb25lbnRzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRNYXBwaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDaHJvbWFMb2NhdGlvbiB4Q2hyb21hT2Zmc2V0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDaHJvbWFMb2NhdGlvbjo6ZUNvc2l0ZWRFdmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hyb21hTG9jYXRpb24geUNocm9tYU9mZnNldF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hyb21hTG9jYXRpb246OmVDb3NpdGVkRXZlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZpbHRlciBjaHJvbWFGaWx0ZXJfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZpbHRlcjo6ZU5lYXJlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZvcm1hdCggZm9ybWF0XyApCisgICAgICAsIHljYmNyTW9kZWwoIHljYmNyTW9kZWxfICkKKyAgICAgICwgeWNiY3JSYW5nZSggeWNiY3JSYW5nZV8gKQorICAgICAgLCBjb21wb25lbnRzKCBjb21wb25lbnRzXyApCisgICAgICAsIHhDaHJvbWFPZmZzZXQoIHhDaHJvbWFPZmZzZXRfICkKKyAgICAgICwgeUNocm9tYU9mZnNldCggeUNocm9tYU9mZnNldF8gKQorICAgICAgLCBjaHJvbWFGaWx0ZXIoIGNocm9tYUZpbHRlcl8gKQorICAgICAgLCBmb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb24oIGZvcmNlRXhwbGljaXRSZWNvbnN0cnVjdGlvbl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gKSAtIG9mZnNldG9mKCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICYgc2V0Rm9ybWF0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZm9ybWF0ID0gZm9ybWF0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAmIHNldFljYmNyTW9kZWwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24geWNiY3JNb2RlbF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgeWNiY3JNb2RlbCA9IHljYmNyTW9kZWxfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICYgc2V0WWNiY3JSYW5nZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjclJhbmdlIHljYmNyUmFuZ2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHljYmNyUmFuZ2UgPSB5Y2JjclJhbmdlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAmIHNldENvbXBvbmVudHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRNYXBwaW5nIGNvbXBvbmVudHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbXBvbmVudHMgPSBjb21wb25lbnRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAmIHNldFhDaHJvbWFPZmZzZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDaHJvbWFMb2NhdGlvbiB4Q2hyb21hT2Zmc2V0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB4Q2hyb21hT2Zmc2V0ID0geENocm9tYU9mZnNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gJiBzZXRZQ2hyb21hT2Zmc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2hyb21hTG9jYXRpb24geUNocm9tYU9mZnNldF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgeUNocm9tYU9mZnNldCA9IHlDaHJvbWFPZmZzZXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICYgc2V0Q2hyb21hRmlsdGVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyIGNocm9tYUZpbHRlcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY2hyb21hRmlsdGVyID0gY2hyb21hRmlsdGVyXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAmIHNldEZvcmNlRXhwbGljaXRSZWNvbnN0cnVjdGlvbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb25fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZvcmNlRXhwbGljaXRSZWNvbnN0cnVjdGlvbiA9IGZvcmNlRXhwbGljaXRSZWNvbnN0cnVjdGlvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZm9ybWF0ID09IHJocy5mb3JtYXQgKQorICAgICAgICAgICYmICggeWNiY3JNb2RlbCA9PSByaHMueWNiY3JNb2RlbCApCisgICAgICAgICAgJiYgKCB5Y2JjclJhbmdlID09IHJocy55Y2JjclJhbmdlICkKKyAgICAgICAgICAmJiAoIGNvbXBvbmVudHMgPT0gcmhzLmNvbXBvbmVudHMgKQorICAgICAgICAgICYmICggeENocm9tYU9mZnNldCA9PSByaHMueENocm9tYU9mZnNldCApCisgICAgICAgICAgJiYgKCB5Q2hyb21hT2Zmc2V0ID09IHJocy55Q2hyb21hT2Zmc2V0ICkKKyAgICAgICAgICAmJiAoIGNocm9tYUZpbHRlciA9PSByaHMuY2hyb21hRmlsdGVyICkKKyAgICAgICAgICAmJiAoIGZvcmNlRXhwbGljaXRSZWNvbnN0cnVjdGlvbiA9PSByaHMuZm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbiB5Y2Jjck1vZGVsOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JSYW5nZSB5Y2JjclJhbmdlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb25lbnRNYXBwaW5nIGNvbXBvbmVudHM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNocm9tYUxvY2F0aW9uIHhDaHJvbWFPZmZzZXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNocm9tYUxvY2F0aW9uIHlDaHJvbWFPZmZzZXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZpbHRlciBjaHJvbWFGaWx0ZXI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gKSA9PSBzaXplb2YoIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMKKyAgeworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMoIHVpbnQzMl90IGNvbWJpbmVkSW1hZ2VTYW1wbGVyRGVzY3JpcHRvckNvdW50XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGNvbWJpbmVkSW1hZ2VTYW1wbGVyRGVzY3JpcHRvckNvdW50KCBjb21iaW5lZEltYWdlU2FtcGxlckRlc2NyaXB0b3JDb3VudF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMgKSAtIG9mZnNldG9mKCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyggVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMmIG9wZXJhdG9yPSggVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGNvbWJpbmVkSW1hZ2VTYW1wbGVyRGVzY3JpcHRvckNvdW50ID09IHJocy5jb21iaW5lZEltYWdlU2FtcGxlckRlc2NyaXB0b3JDb3VudCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBjb21iaW5lZEltYWdlU2FtcGxlckRlc2NyaXB0b3JDb3VudDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICkgPT0gc2l6ZW9mKCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiBjb252ZXJzaW9uXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGNvbnZlcnNpb24oIGNvbnZlcnNpb25fICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvICkgLSBvZmZzZXRvZiggU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8sIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyggVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyYgb3BlcmF0b3I9KCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyAmIHNldENvbnZlcnNpb24oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uIGNvbnZlcnNpb25fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbnZlcnNpb24gPSBjb252ZXJzaW9uXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBjb252ZXJzaW9uID09IHJocy5jb252ZXJzaW9uICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24gY29udmVyc2lvbjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyApID09IHNpemVvZiggVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU2VtYXBob3JlQ3JlYXRlSW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlQ3JlYXRlSW5mbyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUNyZWF0ZUZsYWdzIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVDcmVhdGVGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggU2VtYXBob3JlQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZUNyZWF0ZUluZm8oIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTZW1hcGhvcmVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZUNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZUNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUNyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NlbWFwaG9yZUNyZWF0ZUluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU2VtYXBob3JlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTZW1hcGhvcmVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVNlbWFwaG9yZUNyZWF0ZUluZm87CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVDcmVhdGVGbGFncyBmbGFnczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTZW1hcGhvcmVDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2VtYXBob3JlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU2VtYXBob3JlR2V0RmRJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTZW1hcGhvcmVHZXRGZEluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czo6ZU9wYXF1ZUZkICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzZW1hcGhvcmUoIHNlbWFwaG9yZV8gKQorICAgICAgLCBoYW5kbGVUeXBlKCBoYW5kbGVUeXBlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVHZXRGZEluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVHZXRGZEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUdldEZkSW5mb0tIUiApIC0gb2Zmc2V0b2YoIFNlbWFwaG9yZUdldEZkSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZUdldEZkSW5mb0tIUiggVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU2VtYXBob3JlR2V0RmRJbmZvS0hSJiBvcGVyYXRvcj0oIFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUdldEZkSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTZW1hcGhvcmVHZXRGZEluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZUdldEZkSW5mb0tIUiAmIHNldFNlbWFwaG9yZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNlbWFwaG9yZSA9IHNlbWFwaG9yZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlR2V0RmRJbmZvS0hSICYgc2V0SGFuZGxlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhhbmRsZVR5cGUgPSBoYW5kbGVUeXBlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NlbWFwaG9yZUdldEZkSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTZW1hcGhvcmVHZXRGZEluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNlbWFwaG9yZSA9PSByaHMuc2VtYXBob3JlICkKKyAgICAgICAgICAmJiAoIGhhbmRsZVR5cGUgPT0gcmhzLmhhbmRsZVR5cGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFNlbWFwaG9yZUdldEZkSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTZW1hcGhvcmVHZXRGZEluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNlbWFwaG9yZUdldEZkSW5mb0tIUiApID09IHNpemVvZiggVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2VtYXBob3JlR2V0RmRJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzOjplT3BhcXVlRmQgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNlbWFwaG9yZSggc2VtYXBob3JlXyApCisgICAgICAsIGhhbmRsZVR5cGUoIGhhbmRsZVR5cGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSICkgLSBvZmZzZXRvZiggU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPSggVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSICYgc2V0U2VtYXBob3JlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2VtYXBob3JlID0gc2VtYXBob3JlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgJiBzZXRIYW5kbGVUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaGFuZGxlVHlwZSA9IGhhbmRsZVR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2VtYXBob3JlID09IHJocy5zZW1hcGhvcmUgKQorICAgICAgICAgICYmICggaGFuZGxlVHlwZSA9PSByaHMuaGFuZGxlVHlwZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVNlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICBzdHJ1Y3QgU2VtYXBob3JlU2lnbmFsSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlU2lnbmFsSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHNlbWFwaG9yZSggc2VtYXBob3JlXyApCisgICAgICAsIHZhbHVlKCB2YWx1ZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlU2lnbmFsSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVNpZ25hbEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVNpZ25hbEluZm9LSFIgKSAtIG9mZnNldG9mKCBTZW1hcGhvcmVTaWduYWxJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlU2lnbmFsSW5mb0tIUiggVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNlbWFwaG9yZVNpZ25hbEluZm9LSFImIG9wZXJhdG9yPSggVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVNpZ25hbEluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlU2lnbmFsSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlU2lnbmFsSW5mb0tIUiAmIHNldFNlbWFwaG9yZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNlbWFwaG9yZSA9IHNlbWFwaG9yZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlU2lnbmFsSW5mb0tIUiAmIHNldFZhbHVlKCB1aW50NjRfdCB2YWx1ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgdmFsdWUgPSB2YWx1ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNlbWFwaG9yZVNpZ25hbEluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHNlbWFwaG9yZSA9PSByaHMuc2VtYXBob3JlICkKKyAgICAgICAgICAmJiAoIHZhbHVlID09IHJocy52YWx1ZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2VtYXBob3JlU2lnbmFsSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTZW1hcGhvcmVTaWduYWxJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICB1aW50NjRfdCB2YWx1ZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTZW1hcGhvcmVTaWduYWxJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2VtYXBob3JlU2lnbmFsSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlVHlwZUtIUiBzZW1hcGhvcmVUeXBlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVUeXBlS0hSOjplQmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBpbml0aWFsVmFsdWVfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2VtYXBob3JlVHlwZSggc2VtYXBob3JlVHlwZV8gKQorICAgICAgLCBpbml0aWFsVmFsdWUoIGluaXRpYWxWYWx1ZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgKSAtIG9mZnNldG9mKCBTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSKCBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSJiBvcGVyYXRvcj0oIFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSICYgc2V0U2VtYXBob3JlVHlwZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVR5cGVLSFIgc2VtYXBob3JlVHlwZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc2VtYXBob3JlVHlwZSA9IHNlbWFwaG9yZVR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSICYgc2V0SW5pdGlhbFZhbHVlKCB1aW50NjRfdCBpbml0aWFsVmFsdWVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc2VtYXBob3JlVHlwZSA9PSByaHMuc2VtYXBob3JlVHlwZSApCisgICAgICAgICAgJiYgKCBpbml0aWFsVmFsdWUgPT0gcmhzLmluaXRpYWxWYWx1ZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVUeXBlS0hSIHNlbWFwaG9yZVR5cGU7CisgICAgdWludDY0X3QgaW5pdGlhbFZhbHVlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTZW1hcGhvcmVXYWl0SW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2VtYXBob3JlV2FpdEluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVXYWl0RmxhZ3NLSFIgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVdhaXRGbGFnc0tIUigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZW1hcGhvcmVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlKiBwU2VtYXBob3Jlc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogcFZhbHVlc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgc2VtYXBob3JlQ291bnQoIHNlbWFwaG9yZUNvdW50XyApCisgICAgICAsIHBTZW1hcGhvcmVzKCBwU2VtYXBob3Jlc18gKQorICAgICAgLCBwVmFsdWVzKCBwVmFsdWVzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVXYWl0SW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVdhaXRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVXYWl0SW5mb0tIUiApIC0gb2Zmc2V0b2YoIFNlbWFwaG9yZVdhaXRJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlV2FpdEluZm9LSFIoIFZrU2VtYXBob3JlV2FpdEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU2VtYXBob3JlV2FpdEluZm9LSFImIG9wZXJhdG9yPSggVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVXYWl0SW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTZW1hcGhvcmVXYWl0SW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlV2FpdEluZm9LSFIgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVdhaXRGbGFnc0tIUiBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2VtYXBob3JlV2FpdEluZm9LSFIgJiBzZXRTZW1hcGhvcmVDb3VudCggdWludDMyX3Qgc2VtYXBob3JlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNlbWFwaG9yZUNvdW50ID0gc2VtYXBob3JlQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNlbWFwaG9yZVdhaXRJbmZvS0hSICYgc2V0UFNlbWFwaG9yZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBTZW1hcGhvcmVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwU2VtYXBob3JlcyA9IHBTZW1hcGhvcmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTZW1hcGhvcmVXYWl0SW5mb0tIUiAmIHNldFBWYWx1ZXMoIGNvbnN0IHVpbnQ2NF90KiBwVmFsdWVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVmFsdWVzID0gcFZhbHVlc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2VtYXBob3JlV2FpdEluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmVXYWl0SW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTZW1hcGhvcmVXYWl0SW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIHNlbWFwaG9yZUNvdW50ID09IHJocy5zZW1hcGhvcmVDb3VudCApCisgICAgICAgICAgJiYgKCBwU2VtYXBob3JlcyA9PSByaHMucFNlbWFwaG9yZXMgKQorICAgICAgICAgICYmICggcFZhbHVlcyA9PSByaHMucFZhbHVlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2VtYXBob3JlV2FpdEluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplU2VtYXBob3JlV2FpdEluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVXYWl0RmxhZ3NLSFIgZmxhZ3M7CisgICAgdWludDMyX3Qgc2VtYXBob3JlQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSogcFNlbWFwaG9yZXM7CisgICAgY29uc3QgdWludDY0X3QqIHBWYWx1ZXM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU2VtYXBob3JlV2FpdEluZm9LSFIgKSA9PSBzaXplb2YoIFZrU2VtYXBob3JlV2FpdEluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2VtYXBob3JlV2FpdEluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFNoYWRlck1vZHVsZUNyZWF0ZUluZm8KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFNoYWRlck1vZHVsZUNyZWF0ZUluZm8oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGVDcmVhdGVGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlQ3JlYXRlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY29kZVNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcENvZGVfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGNvZGVTaXplKCBjb2RlU2l6ZV8gKQorICAgICAgLCBwQ29kZSggcENvZGVfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZUNyZWF0ZUluZm8gJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGVDcmVhdGVJbmZvICkgLSBvZmZzZXRvZiggU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbywgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNoYWRlck1vZHVsZUNyZWF0ZUluZm8oIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTaGFkZXJNb2R1bGVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNoYWRlck1vZHVsZUNyZWF0ZUluZm8gJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNoYWRlck1vZHVsZUNyZWF0ZUluZm8gJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZUNyZWF0ZUZsYWdzIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTaGFkZXJNb2R1bGVDcmVhdGVJbmZvICYgc2V0Q29kZVNpemUoIHNpemVfdCBjb2RlU2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29kZVNpemUgPSBjb2RlU2l6ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyAmIHNldFBDb2RlKCBjb25zdCB1aW50MzJfdCogcENvZGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBDb2RlID0gcENvZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggY29kZVNpemUgPT0gcmhzLmNvZGVTaXplICkKKyAgICAgICAgICAmJiAoIHBDb2RlID09IHJocy5wQ29kZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTaGFkZXJNb2R1bGVDcmVhdGVJbmZvOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgc2l6ZV90IGNvZGVTaXplOworICAgIGNvbnN0IHVpbnQzMl90KiBwQ29kZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTaGFkZXJNb2R1bGVDcmVhdGVJbmZvICkgPT0gc2l6ZW9mKCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2hhZGVyTW9kdWxlQ3JlYXRlSW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB2YWxpZGF0aW9uQ2FjaGUoIHZhbGlkYXRpb25DYWNoZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgKSAtIG9mZnNldG9mKCBTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCggVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPSggVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAmIHNldFZhbGlkYXRpb25DYWNoZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHZhbGlkYXRpb25DYWNoZSA9IHZhbGlkYXRpb25DYWNoZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHZhbGlkYXRpb25DYWNoZSA9PSByaHMudmFsaWRhdGlvbkNhY2hlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVNoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgKSA9PSBzaXplb2YoIFZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTaGFkZXJSZXNvdXJjZVVzYWdlQU1ECisgIHsKKyAgICBTaGFkZXJSZXNvdXJjZVVzYWdlQU1EKCB1aW50MzJfdCBudW1Vc2VkVmdwcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1Vc2VkU2dwcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZHNTaXplUGVyTG9jYWxXb3JrR3JvdXBfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGRzVXNhZ2VTaXplSW5CeXRlc18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzY3JhdGNoTWVtVXNhZ2VJbkJ5dGVzXyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IG51bVVzZWRWZ3BycyggbnVtVXNlZFZncHJzXyApCisgICAgICAsIG51bVVzZWRTZ3BycyggbnVtVXNlZFNncHJzXyApCisgICAgICAsIGxkc1NpemVQZXJMb2NhbFdvcmtHcm91cCggbGRzU2l6ZVBlckxvY2FsV29ya0dyb3VwXyApCisgICAgICAsIGxkc1VzYWdlU2l6ZUluQnl0ZXMoIGxkc1VzYWdlU2l6ZUluQnl0ZXNfICkKKyAgICAgICwgc2NyYXRjaE1lbVVzYWdlSW5CeXRlcyggc2NyYXRjaE1lbVVzYWdlSW5CeXRlc18gKQorICAgIHt9CisKKyAgICBTaGFkZXJSZXNvdXJjZVVzYWdlQU1EKCBWa1NoYWRlclJlc291cmNlVXNhZ2VBTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU2hhZGVyUmVzb3VyY2VVc2FnZUFNRCYgb3BlcmF0b3I9KCBWa1NoYWRlclJlc291cmNlVXNhZ2VBTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyUmVzb3VyY2VVc2FnZUFNRCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NoYWRlclJlc291cmNlVXNhZ2VBTUQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NoYWRlclJlc291cmNlVXNhZ2VBTUQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2hhZGVyUmVzb3VyY2VVc2FnZUFNRCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NoYWRlclJlc291cmNlVXNhZ2VBTUQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU2hhZGVyUmVzb3VyY2VVc2FnZUFNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIG51bVVzZWRWZ3BycyA9PSByaHMubnVtVXNlZFZncHJzICkKKyAgICAgICAgICAmJiAoIG51bVVzZWRTZ3BycyA9PSByaHMubnVtVXNlZFNncHJzICkKKyAgICAgICAgICAmJiAoIGxkc1NpemVQZXJMb2NhbFdvcmtHcm91cCA9PSByaHMubGRzU2l6ZVBlckxvY2FsV29ya0dyb3VwICkKKyAgICAgICAgICAmJiAoIGxkc1VzYWdlU2l6ZUluQnl0ZXMgPT0gcmhzLmxkc1VzYWdlU2l6ZUluQnl0ZXMgKQorICAgICAgICAgICYmICggc2NyYXRjaE1lbVVzYWdlSW5CeXRlcyA9PSByaHMuc2NyYXRjaE1lbVVzYWdlSW5CeXRlcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU2hhZGVyUmVzb3VyY2VVc2FnZUFNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1aW50MzJfdCBudW1Vc2VkVmdwcnM7CisgICAgdWludDMyX3QgbnVtVXNlZFNncHJzOworICAgIHVpbnQzMl90IGxkc1NpemVQZXJMb2NhbFdvcmtHcm91cDsKKyAgICBzaXplX3QgbGRzVXNhZ2VTaXplSW5CeXRlczsKKyAgICBzaXplX3Qgc2NyYXRjaE1lbVVzYWdlSW5CeXRlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTaGFkZXJSZXNvdXJjZVVzYWdlQU1EICkgPT0gc2l6ZW9mKCBWa1NoYWRlclJlc291cmNlVXNhZ2VBTUQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U2hhZGVyUmVzb3VyY2VVc2FnZUFNRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU2hhZGVyU3RhdGlzdGljc0luZm9BTUQKKyAgeworICAgIFNoYWRlclN0YXRpc3RpY3NJbmZvQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzaGFkZXJTdGFnZU1hc2tfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclJlc291cmNlVXNhZ2VBTUQgcmVzb3VyY2VVc2FnZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyUmVzb3VyY2VVc2FnZUFNRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1QaHlzaWNhbFZncHJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bVBoeXNpY2FsU2dwcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQXZhaWxhYmxlVmdwcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQXZhaWxhYmxlU2dwcnNfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTx1aW50MzJfdCwzPiBjb25zdCYgY29tcHV0ZVdvcmtHcm91cFNpemVfID0geyB7IDAgfSB9ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzaGFkZXJTdGFnZU1hc2soIHNoYWRlclN0YWdlTWFza18gKQorICAgICAgLCByZXNvdXJjZVVzYWdlKCByZXNvdXJjZVVzYWdlXyApCisgICAgICAsIG51bVBoeXNpY2FsVmdwcnMoIG51bVBoeXNpY2FsVmdwcnNfICkKKyAgICAgICwgbnVtUGh5c2ljYWxTZ3BycyggbnVtUGh5c2ljYWxTZ3Byc18gKQorICAgICAgLCBudW1BdmFpbGFibGVWZ3BycyggbnVtQXZhaWxhYmxlVmdwcnNfICkKKyAgICAgICwgbnVtQXZhaWxhYmxlU2dwcnMoIG51bUF2YWlsYWJsZVNncHJzXyApCisgICAgICAsIGNvbXB1dGVXb3JrR3JvdXBTaXple30KKyAgICB7CisgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29uc3RFeHByZXNzaW9uQXJyYXlDb3B5PHVpbnQzMl90LDMsMz46OmNvcHkoIGNvbXB1dGVXb3JrR3JvdXBTaXplLCBjb21wdXRlV29ya0dyb3VwU2l6ZV8gKTsKKyAgICB9CisKKyAgICBTaGFkZXJTdGF0aXN0aWNzSW5mb0FNRCggVmtTaGFkZXJTdGF0aXN0aWNzSW5mb0FNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTaGFkZXJTdGF0aXN0aWNzSW5mb0FNRCYgb3BlcmF0b3I9KCBWa1NoYWRlclN0YXRpc3RpY3NJbmZvQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YXRpc3RpY3NJbmZvQU1EIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU2hhZGVyU3RhdGlzdGljc0luZm9BTUQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NoYWRlclN0YXRpc3RpY3NJbmZvQU1EKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NoYWRlclN0YXRpc3RpY3NJbmZvQU1EICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU2hhZGVyU3RhdGlzdGljc0luZm9BTUQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU2hhZGVyU3RhdGlzdGljc0luZm9BTUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzaGFkZXJTdGFnZU1hc2sgPT0gcmhzLnNoYWRlclN0YWdlTWFzayApCisgICAgICAgICAgJiYgKCByZXNvdXJjZVVzYWdlID09IHJocy5yZXNvdXJjZVVzYWdlICkKKyAgICAgICAgICAmJiAoIG51bVBoeXNpY2FsVmdwcnMgPT0gcmhzLm51bVBoeXNpY2FsVmdwcnMgKQorICAgICAgICAgICYmICggbnVtUGh5c2ljYWxTZ3BycyA9PSByaHMubnVtUGh5c2ljYWxTZ3BycyApCisgICAgICAgICAgJiYgKCBudW1BdmFpbGFibGVWZ3BycyA9PSByaHMubnVtQXZhaWxhYmxlVmdwcnMgKQorICAgICAgICAgICYmICggbnVtQXZhaWxhYmxlU2dwcnMgPT0gcmhzLm51bUF2YWlsYWJsZVNncHJzICkKKyAgICAgICAgICAmJiAoIG1lbWNtcCggY29tcHV0ZVdvcmtHcm91cFNpemUsIHJocy5jb21wdXRlV29ya0dyb3VwU2l6ZSwgMyAqIHNpemVvZiggdWludDMyX3QgKSApID09IDAgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFNoYWRlclN0YXRpc3RpY3NJbmZvQU1EIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzIHNoYWRlclN0YWdlTWFzazsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyUmVzb3VyY2VVc2FnZUFNRCByZXNvdXJjZVVzYWdlOworICAgIHVpbnQzMl90IG51bVBoeXNpY2FsVmdwcnM7CisgICAgdWludDMyX3QgbnVtUGh5c2ljYWxTZ3ByczsKKyAgICB1aW50MzJfdCBudW1BdmFpbGFibGVWZ3ByczsKKyAgICB1aW50MzJfdCBudW1BdmFpbGFibGVTZ3ByczsKKyAgICB1aW50MzJfdCBjb21wdXRlV29ya0dyb3VwU2l6ZVszXTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTaGFkZXJTdGF0aXN0aWNzSW5mb0FNRCApID09IHNpemVvZiggVmtTaGFkZXJTdGF0aXN0aWNzSW5mb0FNRCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTaGFkZXJTdGF0aXN0aWNzSW5mb0FNRD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIKKyAgeworICAgIFNoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogc2hhcmVkUHJlc2VudFN1cHBvcnRlZFVzYWdlRmxhZ3MoIHNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiApIC0gb2Zmc2V0b2YoIFNoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoIFZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFImIG9wZXJhdG9yPSggVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzaGFyZWRQcmVzZW50U3VwcG9ydGVkVXNhZ2VGbGFncyA9PSByaHMuc2hhcmVkUHJlc2VudFN1cHBvcnRlZFVzYWdlRmxhZ3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFNoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVNoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFNoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMKKyAgeworICAgIFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFza18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VBc3BlY3RGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEIGltYWdlR3JhbnVsYXJpdHlfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDNEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VGb3JtYXRGbGFncyBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VGb3JtYXRGbGFncygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBhc3BlY3RNYXNrKCBhc3BlY3RNYXNrXyApCisgICAgICAsIGltYWdlR3JhbnVsYXJpdHkoIGltYWdlR3JhbnVsYXJpdHlfICkKKyAgICAgICwgZmxhZ3MoIGZsYWdzXyApCisgICAge30KKworICAgIFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyggVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBhc3BlY3RNYXNrID09IHJocy5hc3BlY3RNYXNrICkKKyAgICAgICAgICAmJiAoIGltYWdlR3JhbnVsYXJpdHkgPT0gcmhzLmltYWdlR3JhbnVsYXJpdHkgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFzazsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50M0QgaW1hZ2VHcmFudWxhcml0eTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VGb3JtYXRGbGFncyBmbGFnczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgKSA9PSBzaXplb2YoIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMgorICB7CisgICAgU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyBwcm9wZXJ0aWVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogcHJvcGVydGllcyggcHJvcGVydGllc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgKSAtIG9mZnNldG9mKCBTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczImIG9wZXJhdG9yPSggVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHByb3BlcnRpZXMgPT0gcmhzLnByb3BlcnRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyBwcm9wZXJ0aWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgKSA9PSBzaXplb2YoIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cworICB7CisgICAgU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgZm9ybWF0UHJvcGVydGllc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWlwVGFpbEZpcnN0TG9kXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGltYWdlTWlwVGFpbFNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgaW1hZ2VNaXBUYWlsT2Zmc2V0XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGltYWdlTWlwVGFpbFN0cmlkZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmb3JtYXRQcm9wZXJ0aWVzKCBmb3JtYXRQcm9wZXJ0aWVzXyApCisgICAgICAsIGltYWdlTWlwVGFpbEZpcnN0TG9kKCBpbWFnZU1pcFRhaWxGaXJzdExvZF8gKQorICAgICAgLCBpbWFnZU1pcFRhaWxTaXplKCBpbWFnZU1pcFRhaWxTaXplXyApCisgICAgICAsIGltYWdlTWlwVGFpbE9mZnNldCggaW1hZ2VNaXBUYWlsT2Zmc2V0XyApCisgICAgICAsIGltYWdlTWlwVGFpbFN0cmlkZSggaW1hZ2VNaXBUYWlsU3RyaWRlXyApCisgICAge30KKworICAgIFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzJiBvcGVyYXRvcj0oIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIGZvcm1hdFByb3BlcnRpZXMgPT0gcmhzLmZvcm1hdFByb3BlcnRpZXMgKQorICAgICAgICAgICYmICggaW1hZ2VNaXBUYWlsRmlyc3RMb2QgPT0gcmhzLmltYWdlTWlwVGFpbEZpcnN0TG9kICkKKyAgICAgICAgICAmJiAoIGltYWdlTWlwVGFpbFNpemUgPT0gcmhzLmltYWdlTWlwVGFpbFNpemUgKQorICAgICAgICAgICYmICggaW1hZ2VNaXBUYWlsT2Zmc2V0ID09IHJocy5pbWFnZU1pcFRhaWxPZmZzZXQgKQorICAgICAgICAgICYmICggaW1hZ2VNaXBUYWlsU3RyaWRlID09IHJocy5pbWFnZU1pcFRhaWxTdHJpZGUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgZm9ybWF0UHJvcGVydGllczsKKyAgICB1aW50MzJfdCBpbWFnZU1pcFRhaWxGaXJzdExvZDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBpbWFnZU1pcFRhaWxTaXplOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGltYWdlTWlwVGFpbE9mZnNldDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBpbWFnZU1pcFRhaWxTdHJpZGU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgKSA9PSBzaXplb2YoIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMgorICB7CisgICAgU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgbWVtb3J5UmVxdWlyZW1lbnRzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cygpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtZW1vcnlSZXF1aXJlbWVudHMoIG1lbW9yeVJlcXVpcmVtZW50c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgKSAtIG9mZnNldG9mKCBTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiYgb3BlcmF0b3I9KCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtZW1vcnlSZXF1aXJlbWVudHMgPT0gcmhzLm1lbW9yeVJlcXVpcmVtZW50cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIG1lbW9yeVJlcXVpcmVtZW50czsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgKSA9PSBzaXplb2YoIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKworICBzdHJ1Y3QgU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUZsYWdzR0dQIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUZsYWdzR0dQKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZ3BTdHJlYW1EZXNjcmlwdG9yIHN0cmVhbURlc2NyaXB0b3JfID0gMCApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIHN0cmVhbURlc2NyaXB0b3IoIHN0cmVhbURlc2NyaXB0b3JfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQICkgLSBvZmZzZXRvZiggU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AmIG9wZXJhdG9yPSggVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUZsYWdzR0dQIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgJiBzZXRTdHJlYW1EZXNjcmlwdG9yKCBHZ3BTdHJlYW1EZXNjcmlwdG9yIHN0cmVhbURlc2NyaXB0b3JfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0cmVhbURlc2NyaXB0b3IgPSBzdHJlYW1EZXNjcmlwdG9yXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBzdHJlYW1EZXNjcmlwdG9yID09IHJocy5zdHJlYW1EZXNjcmlwdG9yICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVGbGFnc0dHUCBmbGFnczsKKyAgICBHZ3BTdHJlYW1EZXNjcmlwdG9yIHN0cmVhbURlc2NyaXB0b3I7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQICkgPT0gc2l6ZW9mKCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1A+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fR0dQKi8KKworICBzdHJ1Y3QgU3VibWl0SW5mbworICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VibWl0SW5mbyggdWludDMyX3Qgd2FpdFNlbWFwaG9yZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSogcFdhaXRTZW1hcGhvcmVzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyogcFdhaXREc3RTdGFnZU1hc2tfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2lnbmFsU2VtYXBob3JlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlKiBwU2lnbmFsU2VtYXBob3Jlc18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiB3YWl0U2VtYXBob3JlQ291bnQoIHdhaXRTZW1hcGhvcmVDb3VudF8gKQorICAgICAgLCBwV2FpdFNlbWFwaG9yZXMoIHBXYWl0U2VtYXBob3Jlc18gKQorICAgICAgLCBwV2FpdERzdFN0YWdlTWFzayggcFdhaXREc3RTdGFnZU1hc2tfICkKKyAgICAgICwgY29tbWFuZEJ1ZmZlckNvdW50KCBjb21tYW5kQnVmZmVyQ291bnRfICkKKyAgICAgICwgcENvbW1hbmRCdWZmZXJzKCBwQ29tbWFuZEJ1ZmZlcnNfICkKKyAgICAgICwgc2lnbmFsU2VtYXBob3JlQ291bnQoIHNpZ25hbFNlbWFwaG9yZUNvdW50XyApCisgICAgICAsIHBTaWduYWxTZW1hcGhvcmVzKCBwU2lnbmFsU2VtYXBob3Jlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VibWl0SW5mbyAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1Ym1pdEluZm8gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1Ym1pdEluZm8gKSAtIG9mZnNldG9mKCBTdWJtaXRJbmZvLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VibWl0SW5mbyggVmtTdWJtaXRJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFN1Ym1pdEluZm8mIG9wZXJhdG9yPSggVmtTdWJtaXRJbmZvIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1Ym1pdEluZm8gY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VibWl0SW5mbyAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VibWl0SW5mbyAmIHNldFdhaXRTZW1hcGhvcmVDb3VudCggdWludDMyX3Qgd2FpdFNlbWFwaG9yZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB3YWl0U2VtYXBob3JlQ291bnQgPSB3YWl0U2VtYXBob3JlQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1Ym1pdEluZm8gJiBzZXRQV2FpdFNlbWFwaG9yZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBXYWl0U2VtYXBob3Jlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFdhaXRTZW1hcGhvcmVzID0gcFdhaXRTZW1hcGhvcmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJtaXRJbmZvICYgc2V0UFdhaXREc3RTdGFnZU1hc2soIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MqIHBXYWl0RHN0U3RhZ2VNYXNrXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwV2FpdERzdFN0YWdlTWFzayA9IHBXYWl0RHN0U3RhZ2VNYXNrXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJtaXRJbmZvICYgc2V0Q29tbWFuZEJ1ZmZlckNvdW50KCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCA9IGNvbW1hbmRCdWZmZXJDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VibWl0SW5mbyAmIHNldFBDb21tYW5kQnVmZmVycyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVyc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcENvbW1hbmRCdWZmZXJzID0gcENvbW1hbmRCdWZmZXJzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJtaXRJbmZvICYgc2V0U2lnbmFsU2VtYXBob3JlQ291bnQoIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaWduYWxTZW1hcGhvcmVDb3VudCA9IHNpZ25hbFNlbWFwaG9yZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJtaXRJbmZvICYgc2V0UFNpZ25hbFNlbWFwaG9yZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBTaWduYWxTZW1hcGhvcmVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwU2lnbmFsU2VtYXBob3JlcyA9IHBTaWduYWxTZW1hcGhvcmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1Ym1pdEluZm8gY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1Ym1pdEluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VibWl0SW5mbyAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N1Ym1pdEluZm8qPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3VibWl0SW5mbyBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggd2FpdFNlbWFwaG9yZUNvdW50ID09IHJocy53YWl0U2VtYXBob3JlQ291bnQgKQorICAgICAgICAgICYmICggcFdhaXRTZW1hcGhvcmVzID09IHJocy5wV2FpdFNlbWFwaG9yZXMgKQorICAgICAgICAgICYmICggcFdhaXREc3RTdGFnZU1hc2sgPT0gcmhzLnBXYWl0RHN0U3RhZ2VNYXNrICkKKyAgICAgICAgICAmJiAoIGNvbW1hbmRCdWZmZXJDb3VudCA9PSByaHMuY29tbWFuZEJ1ZmZlckNvdW50ICkKKyAgICAgICAgICAmJiAoIHBDb21tYW5kQnVmZmVycyA9PSByaHMucENvbW1hbmRCdWZmZXJzICkKKyAgICAgICAgICAmJiAoIHNpZ25hbFNlbWFwaG9yZUNvdW50ID09IHJocy5zaWduYWxTZW1hcGhvcmVDb3VudCApCisgICAgICAgICAgJiYgKCBwU2lnbmFsU2VtYXBob3JlcyA9PSByaHMucFNpZ25hbFNlbWFwaG9yZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFN1Ym1pdEluZm8gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplU3VibWl0SW5mbzsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3Qgd2FpdFNlbWFwaG9yZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUqIHBXYWl0U2VtYXBob3JlczsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzKiBwV2FpdERzdFN0YWdlTWFzazsKKyAgICB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVyczsKKyAgICB1aW50MzJfdCBzaWduYWxTZW1hcGhvcmVDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlKiBwU2lnbmFsU2VtYXBob3JlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTdWJtaXRJbmZvICkgPT0gc2l6ZW9mKCBWa1N1Ym1pdEluZm8gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3VibWl0SW5mbz46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3VicGFzc0JlZ2luSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VicGFzc0JlZ2luSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NDb250ZW50cyBjb250ZW50c18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0NvbnRlbnRzOjplSW5saW5lICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBjb250ZW50cyggY29udGVudHNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NCZWdpbkluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzQmVnaW5JbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzQmVnaW5JbmZvS0hSICkgLSBvZmZzZXRvZiggU3VicGFzc0JlZ2luSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NCZWdpbkluZm9LSFIoIFZrU3VicGFzc0JlZ2luSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdWJwYXNzQmVnaW5JbmZvS0hSJiBvcGVyYXRvcj0oIFZrU3VicGFzc0JlZ2luSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzQmVnaW5JbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NCZWdpbkluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NCZWdpbkluZm9LSFIgJiBzZXRDb250ZW50cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NDb250ZW50cyBjb250ZW50c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgY29udGVudHMgPSBjb250ZW50c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdWJwYXNzQmVnaW5JbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1YnBhc3NCZWdpbkluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTdWJwYXNzQmVnaW5JbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFN1YnBhc3NCZWdpbkluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGNvbnRlbnRzID09IHJocy5jb250ZW50cyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3VicGFzc0JlZ2luSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTdWJwYXNzQmVnaW5JbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN1YnBhc3NCZWdpbkluZm9LSFIgKSA9PSBzaXplb2YoIFZrU3VicGFzc0JlZ2luSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTdWJwYXNzQmVnaW5JbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzb2x2ZU1vZGVGbGFnQml0c0tIUiBkZXB0aFJlc29sdmVNb2RlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZXNvbHZlTW9kZUZsYWdCaXRzS0hSOjplTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzb2x2ZU1vZGVGbGFnQml0c0tIUiBzdGVuY2lsUmVzb2x2ZU1vZGVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc29sdmVNb2RlRmxhZ0JpdHNLSFI6OmVOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50XyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRlcHRoUmVzb2x2ZU1vZGUoIGRlcHRoUmVzb2x2ZU1vZGVfICkKKyAgICAgICwgc3RlbmNpbFJlc29sdmVNb2RlKCBzdGVuY2lsUmVzb2x2ZU1vZGVfICkKKyAgICAgICwgcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50KCBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSICkgLSBvZmZzZXRvZiggU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIoIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSJiBvcGVyYXRvcj0oIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgJiBzZXREZXB0aFJlc29sdmVNb2RlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzb2x2ZU1vZGVGbGFnQml0c0tIUiBkZXB0aFJlc29sdmVNb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXB0aFJlc29sdmVNb2RlID0gZGVwdGhSZXNvbHZlTW9kZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAmIHNldFN0ZW5jaWxSZXNvbHZlTW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc29sdmVNb2RlRmxhZ0JpdHNLSFIgc3RlbmNpbFJlc29sdmVNb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdGVuY2lsUmVzb2x2ZU1vZGUgPSBzdGVuY2lsUmVzb2x2ZU1vZGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgJiBzZXRQRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgPSBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkZXB0aFJlc29sdmVNb2RlID09IHJocy5kZXB0aFJlc29sdmVNb2RlICkKKyAgICAgICAgICAmJiAoIHN0ZW5jaWxSZXNvbHZlTW9kZSA9PSByaHMuc3RlbmNpbFJlc29sdmVNb2RlICkKKyAgICAgICAgICAmJiAoIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCA9PSByaHMucERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIGRlcHRoUmVzb2x2ZU1vZGU7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc29sdmVNb2RlRmxhZ0JpdHNLSFIgc3RlbmNpbFJlc29sdmVNb2RlOworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgKSA9PSBzaXplb2YoIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTdWJwYXNzRW5kSW5mb0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VicGFzc0VuZEluZm9LSFIoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRW5kSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NFbmRJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRW5kSW5mb0tIUiApIC0gb2Zmc2V0b2YoIFN1YnBhc3NFbmRJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VicGFzc0VuZEluZm9LSFIoIFZrU3VicGFzc0VuZEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3VicGFzc0VuZEluZm9LSFImIG9wZXJhdG9yPSggVmtTdWJwYXNzRW5kSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzRW5kSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdWJwYXNzRW5kSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdWJwYXNzRW5kSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VicGFzc0VuZEluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTdWJwYXNzRW5kSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTdWJwYXNzRW5kSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFN1YnBhc3NFbmRJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVN1YnBhc3NFbmRJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTdWJwYXNzRW5kSW5mb0tIUiApID09IHNpemVvZiggVmtTdWJwYXNzRW5kSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTdWJwYXNzRW5kSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3VyZmFjZUNhcGFiaWxpdGllczJFWFQKKyAgeworICAgIFN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKCB1aW50MzJfdCBtaW5JbWFnZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heEltYWdlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIGN1cnJlbnRFeHRlbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtaW5JbWFnZUV4dGVudF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIG1heEltYWdlRXh0ZW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhJbWFnZUFycmF5TGF5ZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIgc3VwcG9ydGVkVHJhbnNmb3Jtc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgY3VycmVudFRyYW5zZm9ybV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb3NpdGVBbHBoYUZsYWdzS0hSIHN1cHBvcnRlZENvbXBvc2l0ZUFscGhhXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb3NpdGVBbHBoYUZsYWdzS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3Mgc3VwcG9ydGVkVXNhZ2VGbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ291bnRlckZsYWdzRVhUIHN1cHBvcnRlZFN1cmZhY2VDb3VudGVyc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNvdW50ZXJGbGFnc0VYVCgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBtaW5JbWFnZUNvdW50KCBtaW5JbWFnZUNvdW50XyApCisgICAgICAsIG1heEltYWdlQ291bnQoIG1heEltYWdlQ291bnRfICkKKyAgICAgICwgY3VycmVudEV4dGVudCggY3VycmVudEV4dGVudF8gKQorICAgICAgLCBtaW5JbWFnZUV4dGVudCggbWluSW1hZ2VFeHRlbnRfICkKKyAgICAgICwgbWF4SW1hZ2VFeHRlbnQoIG1heEltYWdlRXh0ZW50XyApCisgICAgICAsIG1heEltYWdlQXJyYXlMYXllcnMoIG1heEltYWdlQXJyYXlMYXllcnNfICkKKyAgICAgICwgc3VwcG9ydGVkVHJhbnNmb3Jtcyggc3VwcG9ydGVkVHJhbnNmb3Jtc18gKQorICAgICAgLCBjdXJyZW50VHJhbnNmb3JtKCBjdXJyZW50VHJhbnNmb3JtXyApCisgICAgICAsIHN1cHBvcnRlZENvbXBvc2l0ZUFscGhhKCBzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYV8gKQorICAgICAgLCBzdXBwb3J0ZWRVc2FnZUZsYWdzKCBzdXBwb3J0ZWRVc2FnZUZsYWdzXyApCisgICAgICAsIHN1cHBvcnRlZFN1cmZhY2VDb3VudGVycyggc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCApIC0gb2Zmc2V0b2YoIFN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3VyZmFjZUNhcGFiaWxpdGllczJFWFQmIG9wZXJhdG9yPSggVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBtaW5JbWFnZUNvdW50ID09IHJocy5taW5JbWFnZUNvdW50ICkKKyAgICAgICAgICAmJiAoIG1heEltYWdlQ291bnQgPT0gcmhzLm1heEltYWdlQ291bnQgKQorICAgICAgICAgICYmICggY3VycmVudEV4dGVudCA9PSByaHMuY3VycmVudEV4dGVudCApCisgICAgICAgICAgJiYgKCBtaW5JbWFnZUV4dGVudCA9PSByaHMubWluSW1hZ2VFeHRlbnQgKQorICAgICAgICAgICYmICggbWF4SW1hZ2VFeHRlbnQgPT0gcmhzLm1heEltYWdlRXh0ZW50ICkKKyAgICAgICAgICAmJiAoIG1heEltYWdlQXJyYXlMYXllcnMgPT0gcmhzLm1heEltYWdlQXJyYXlMYXllcnMgKQorICAgICAgICAgICYmICggc3VwcG9ydGVkVHJhbnNmb3JtcyA9PSByaHMuc3VwcG9ydGVkVHJhbnNmb3JtcyApCisgICAgICAgICAgJiYgKCBjdXJyZW50VHJhbnNmb3JtID09IHJocy5jdXJyZW50VHJhbnNmb3JtICkKKyAgICAgICAgICAmJiAoIHN1cHBvcnRlZENvbXBvc2l0ZUFscGhhID09IHJocy5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSApCisgICAgICAgICAgJiYgKCBzdXBwb3J0ZWRVc2FnZUZsYWdzID09IHJocy5zdXBwb3J0ZWRVc2FnZUZsYWdzICkKKyAgICAgICAgICAmJiAoIHN1cHBvcnRlZFN1cmZhY2VDb3VudGVycyA9PSByaHMuc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbWluSW1hZ2VDb3VudDsKKyAgICB1aW50MzJfdCBtYXhJbWFnZUNvdW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBjdXJyZW50RXh0ZW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtaW5JbWFnZUV4dGVudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgbWF4SW1hZ2VFeHRlbnQ7CisgICAgdWludDMyX3QgbWF4SW1hZ2VBcnJheUxheWVyczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSIHN1cHBvcnRlZFRyYW5zZm9ybXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBjdXJyZW50VHJhbnNmb3JtOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb3NpdGVBbHBoYUZsYWdzS0hSIHN1cHBvcnRlZENvbXBvc2l0ZUFscGhhOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3Mgc3VwcG9ydGVkVXNhZ2VGbGFnczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNvdW50ZXJGbGFnc0VYVCBzdXBwb3J0ZWRTdXJmYWNlQ291bnRlcnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgKSA9PSBzaXplb2YoIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3VyZmFjZUNhcGFiaWxpdGllczJFWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIKKyAgeworICAgIFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoIHVpbnQzMl90IG1pbkltYWdlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhJbWFnZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIGN1cnJlbnRFeHRlbnRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVudDJEIG1pbkltYWdlRXh0ZW50XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtYXhJbWFnZUV4dGVudF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhJbWFnZUFycmF5TGF5ZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUiBzdXBwb3J0ZWRUcmFuc2Zvcm1zXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIGN1cnJlbnRUcmFuc2Zvcm1fID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb3NpdGVBbHBoYUZsYWdzS0hSIHN1cHBvcnRlZENvbXBvc2l0ZUFscGhhXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb3NpdGVBbHBoYUZsYWdzS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyBzdXBwb3J0ZWRVc2FnZUZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MoKSApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogbWluSW1hZ2VDb3VudCggbWluSW1hZ2VDb3VudF8gKQorICAgICAgLCBtYXhJbWFnZUNvdW50KCBtYXhJbWFnZUNvdW50XyApCisgICAgICAsIGN1cnJlbnRFeHRlbnQoIGN1cnJlbnRFeHRlbnRfICkKKyAgICAgICwgbWluSW1hZ2VFeHRlbnQoIG1pbkltYWdlRXh0ZW50XyApCisgICAgICAsIG1heEltYWdlRXh0ZW50KCBtYXhJbWFnZUV4dGVudF8gKQorICAgICAgLCBtYXhJbWFnZUFycmF5TGF5ZXJzKCBtYXhJbWFnZUFycmF5TGF5ZXJzXyApCisgICAgICAsIHN1cHBvcnRlZFRyYW5zZm9ybXMoIHN1cHBvcnRlZFRyYW5zZm9ybXNfICkKKyAgICAgICwgY3VycmVudFRyYW5zZm9ybSggY3VycmVudFRyYW5zZm9ybV8gKQorICAgICAgLCBzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSggc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGFfICkKKyAgICAgICwgc3VwcG9ydGVkVXNhZ2VGbGFncyggc3VwcG9ydGVkVXNhZ2VGbGFnc18gKQorICAgIHt9CisKKyAgICBTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3VyZmFjZUNhcGFiaWxpdGllc0tIUiYgb3BlcmF0b3I9KCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNhcGFiaWxpdGllc0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIG1pbkltYWdlQ291bnQgPT0gcmhzLm1pbkltYWdlQ291bnQgKQorICAgICAgICAgICYmICggbWF4SW1hZ2VDb3VudCA9PSByaHMubWF4SW1hZ2VDb3VudCApCisgICAgICAgICAgJiYgKCBjdXJyZW50RXh0ZW50ID09IHJocy5jdXJyZW50RXh0ZW50ICkKKyAgICAgICAgICAmJiAoIG1pbkltYWdlRXh0ZW50ID09IHJocy5taW5JbWFnZUV4dGVudCApCisgICAgICAgICAgJiYgKCBtYXhJbWFnZUV4dGVudCA9PSByaHMubWF4SW1hZ2VFeHRlbnQgKQorICAgICAgICAgICYmICggbWF4SW1hZ2VBcnJheUxheWVycyA9PSByaHMubWF4SW1hZ2VBcnJheUxheWVycyApCisgICAgICAgICAgJiYgKCBzdXBwb3J0ZWRUcmFuc2Zvcm1zID09IHJocy5zdXBwb3J0ZWRUcmFuc2Zvcm1zICkKKyAgICAgICAgICAmJiAoIGN1cnJlbnRUcmFuc2Zvcm0gPT0gcmhzLmN1cnJlbnRUcmFuc2Zvcm0gKQorICAgICAgICAgICYmICggc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEgPT0gcmhzLnN1cHBvcnRlZENvbXBvc2l0ZUFscGhhICkKKyAgICAgICAgICAmJiAoIHN1cHBvcnRlZFVzYWdlRmxhZ3MgPT0gcmhzLnN1cHBvcnRlZFVzYWdlRmxhZ3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgdWludDMyX3QgbWluSW1hZ2VDb3VudDsKKyAgICB1aW50MzJfdCBtYXhJbWFnZUNvdW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBjdXJyZW50RXh0ZW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBtaW5JbWFnZUV4dGVudDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgbWF4SW1hZ2VFeHRlbnQ7CisgICAgdWludDMyX3QgbWF4SW1hZ2VBcnJheUxheWVyczsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSIHN1cHBvcnRlZFRyYW5zZm9ybXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBjdXJyZW50VHJhbnNmb3JtOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wb3NpdGVBbHBoYUZsYWdzS0hSIHN1cHBvcnRlZENvbXBvc2l0ZUFscGhhOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3Mgc3VwcG9ydGVkVXNhZ2VGbGFnczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICkgPT0gc2l6ZW9mKCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3VyZmFjZUNhcGFiaWxpdGllc0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3VyZmFjZUNhcGFiaWxpdGllczJLSFIKKyAgeworICAgIFN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdXJmYWNlQ2FwYWJpbGl0aWVzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IHN1cmZhY2VDYXBhYmlsaXRpZXMoIHN1cmZhY2VDYXBhYmlsaXRpZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNhcGFiaWxpdGllczJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSICkgLSBvZmZzZXRvZiggU3VyZmFjZUNhcGFiaWxpdGllczJLSFIsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiggVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiYgb3BlcmF0b3I9KCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN1cmZhY2VDYXBhYmlsaXRpZXMgPT0gcmhzLnN1cmZhY2VDYXBhYmlsaXRpZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSOworICAgIHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdXJmYWNlQ2FwYWJpbGl0aWVzOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSICkgPT0gc2l6ZW9mKCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgZnVsbFNjcmVlbkV4Y2x1c2l2ZVN1cHBvcnRlZF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkKCBmdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCApIC0gb2Zmc2V0b2YoIFN1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhULCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQoIFZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQmIG9wZXJhdG9yPSggVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCAmIHNldFBOZXh0KCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQgJiBzZXRGdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGZ1bGxTY3JlZW5FeGNsdXNpdmVTdXBwb3J0ZWRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZ1bGxTY3JlZW5FeGNsdXNpdmVTdXBwb3J0ZWQgPSBmdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFN1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkID09IHJocy5mdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBmdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUICkgPT0gc2l6ZW9mKCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFN1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgc3RydWN0IFN1cmZhY2VGb3JtYXRLSFIKKyAgeworICAgIFN1cmZhY2VGb3JtYXRLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0XyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQ6OmVVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbG9yU3BhY2VLSFIgY29sb3JTcGFjZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29sb3JTcGFjZUtIUjo6ZVNyZ2JOb25saW5lYXIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZvcm1hdCggZm9ybWF0XyApCisgICAgICAsIGNvbG9yU3BhY2UoIGNvbG9yU3BhY2VfICkKKyAgICB7fQorCisgICAgU3VyZmFjZUZvcm1hdEtIUiggVmtTdXJmYWNlRm9ybWF0S0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFN1cmZhY2VGb3JtYXRLSFImIG9wZXJhdG9yPSggVmtTdXJmYWNlRm9ybWF0S0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGb3JtYXRLSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdXJmYWNlRm9ybWF0S0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdXJmYWNlRm9ybWF0S0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VGb3JtYXRLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlRm9ybWF0S0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFN1cmZhY2VGb3JtYXRLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBmb3JtYXQgPT0gcmhzLmZvcm1hdCApCisgICAgICAgICAgJiYgKCBjb2xvclNwYWNlID09IHJocy5jb2xvclNwYWNlICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdXJmYWNlRm9ybWF0S0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2xvclNwYWNlS0hSIGNvbG9yU3BhY2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3VyZmFjZUZvcm1hdEtIUiApID09IHNpemVvZiggVmtTdXJmYWNlRm9ybWF0S0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFN1cmZhY2VGb3JtYXRLSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFN1cmZhY2VGb3JtYXQyS0hSCisgIHsKKyAgICBTdXJmYWNlRm9ybWF0MktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGb3JtYXRLSFIgc3VyZmFjZUZvcm1hdF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUZvcm1hdEtIUigpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdXJmYWNlRm9ybWF0KCBzdXJmYWNlRm9ybWF0XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlRm9ybWF0MktIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGb3JtYXQyS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlRm9ybWF0MktIUiApIC0gb2Zmc2V0b2YoIFN1cmZhY2VGb3JtYXQyS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3VyZmFjZUZvcm1hdDJLSFIoIFZrU3VyZmFjZUZvcm1hdDJLSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3VyZmFjZUZvcm1hdDJLSFImIG9wZXJhdG9yPSggVmtTdXJmYWNlRm9ybWF0MktIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlRm9ybWF0MktIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VGb3JtYXQyS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdXJmYWNlRm9ybWF0MktIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdXJmYWNlRm9ybWF0MktIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VGb3JtYXQyS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFN1cmZhY2VGb3JtYXQyS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzdXJmYWNlRm9ybWF0ID09IHJocy5zdXJmYWNlRm9ybWF0ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdXJmYWNlRm9ybWF0MktIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTdXJmYWNlRm9ybWF0MktIUjsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGb3JtYXRLSFIgc3VyZmFjZUZvcm1hdDsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTdXJmYWNlRm9ybWF0MktIUiApID09IHNpemVvZiggVmtTdXJmYWNlRm9ybWF0MktIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTdXJmYWNlRm9ybWF0MktIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICBzdHJ1Y3QgU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIGZ1bGxTY3JlZW5FeGNsdXNpdmVfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZ1bGxTY3JlZW5FeGNsdXNpdmVFWFQ6OmVEZWZhdWx0ICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmdWxsU2NyZWVuRXhjbHVzaXZlKCBmdWxsU2NyZWVuRXhjbHVzaXZlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCggVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgJiBzZXRQTmV4dCggdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCAmIHNldEZ1bGxTY3JlZW5FeGNsdXNpdmUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIGZ1bGxTY3JlZW5FeGNsdXNpdmVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZ1bGxTY3JlZW5FeGNsdXNpdmUgPSBmdWxsU2NyZWVuRXhjbHVzaXZlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZ1bGxTY3JlZW5FeGNsdXNpdmUgPT0gcmhzLmZ1bGxTY3JlZW5FeGNsdXNpdmUgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ7CisgICAgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIGZ1bGxTY3JlZW5FeGNsdXNpdmU7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUICkgPT0gc2l6ZW9mKCBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICBzdHJ1Y3QgU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUKCBITU9OSVRPUiBobW9uaXRvcl8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBobW9uaXRvciggaG1vbml0b3JfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUICkgLSBvZmZzZXRvZiggU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCggVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCYgb3BlcmF0b3I9KCBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCAmIHNldEhtb25pdG9yKCBITU9OSVRPUiBobW9uaXRvcl8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaG1vbml0b3IgPSBobW9uaXRvcl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggaG1vbml0b3IgPT0gcmhzLmhtb25pdG9yICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVDsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgSE1PTklUT1IgaG1vbml0b3I7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgKSA9PSBzaXplb2YoIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICBzdHJ1Y3QgU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdXBwb3J0c1Byb3RlY3RlZF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdXBwb3J0c1Byb3RlY3RlZCggc3VwcG9ydHNQcm90ZWN0ZWRfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSICkgLSBvZmZzZXRvZiggU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIoIFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSJiBvcGVyYXRvcj0oIFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgJiBzZXRTdXBwb3J0c1Byb3RlY3RlZCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdXBwb3J0c1Byb3RlY3RlZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3VwcG9ydHNQcm90ZWN0ZWQgPSBzdXBwb3J0c1Byb3RlY3RlZF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFN1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHN1cHBvcnRzUHJvdGVjdGVkID09IHJocy5zdXBwb3J0c1Byb3RlY3RlZCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN1cHBvcnRzUHJvdGVjdGVkOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgKSA9PSBzaXplb2YoIFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ291bnRlckZsYWdzRVhUIHN1cmZhY2VDb3VudGVyc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNvdW50ZXJGbGFnc0VYVCgpICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdXJmYWNlQ291bnRlcnMoIHN1cmZhY2VDb3VudGVyc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgKSAtIG9mZnNldG9mKCBTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKCBWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oIFZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUICYgc2V0U3VyZmFjZUNvdW50ZXJzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNvdW50ZXJGbGFnc0VYVCBzdXJmYWNlQ291bnRlcnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN1cmZhY2VDb3VudGVycyA9IHN1cmZhY2VDb3VudGVyc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggc3VyZmFjZUNvdW50ZXJzID09IHJocy5zdXJmYWNlQ291bnRlcnMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFN3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVN3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNvdW50ZXJGbGFnc0VYVCBzdXJmYWNlQ291bnRlcnM7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgKSA9PSBzaXplb2YoIFZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUiBmbGFnc18gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWluSW1hZ2VDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgaW1hZ2VGb3JtYXRfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdDo6ZVVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29sb3JTcGFjZUtIUiBpbWFnZUNvbG9yU3BhY2VfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbG9yU3BhY2VLSFI6OmVTcmdiTm9ubGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBpbWFnZUV4dGVudF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZUFycmF5TGF5ZXJzXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyBpbWFnZVVzYWdlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhcmluZ01vZGUgaW1hZ2VTaGFyaW5nTW9kZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhcmluZ01vZGU6OmVFeGNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleENvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHByZVRyYW5zZm9ybV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgY29tcG9zaXRlQWxwaGFfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFI6OmVPcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRNb2RlS0hSIHByZXNlbnRNb2RlXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50TW9kZUtIUjo6ZUltbWVkaWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGNsaXBwZWRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIG9sZFN3YXBjaGFpbl8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSKCkgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBzdXJmYWNlKCBzdXJmYWNlXyApCisgICAgICAsIG1pbkltYWdlQ291bnQoIG1pbkltYWdlQ291bnRfICkKKyAgICAgICwgaW1hZ2VGb3JtYXQoIGltYWdlRm9ybWF0XyApCisgICAgICAsIGltYWdlQ29sb3JTcGFjZSggaW1hZ2VDb2xvclNwYWNlXyApCisgICAgICAsIGltYWdlRXh0ZW50KCBpbWFnZUV4dGVudF8gKQorICAgICAgLCBpbWFnZUFycmF5TGF5ZXJzKCBpbWFnZUFycmF5TGF5ZXJzXyApCisgICAgICAsIGltYWdlVXNhZ2UoIGltYWdlVXNhZ2VfICkKKyAgICAgICwgaW1hZ2VTaGFyaW5nTW9kZSggaW1hZ2VTaGFyaW5nTW9kZV8gKQorICAgICAgLCBxdWV1ZUZhbWlseUluZGV4Q291bnQoIHF1ZXVlRmFtaWx5SW5kZXhDb3VudF8gKQorICAgICAgLCBwUXVldWVGYW1pbHlJbmRpY2VzKCBwUXVldWVGYW1pbHlJbmRpY2VzXyApCisgICAgICAsIHByZVRyYW5zZm9ybSggcHJlVHJhbnNmb3JtXyApCisgICAgICAsIGNvbXBvc2l0ZUFscGhhKCBjb21wb3NpdGVBbHBoYV8gKQorICAgICAgLCBwcmVzZW50TW9kZSggcHJlc2VudE1vZGVfICkKKyAgICAgICwgY2xpcHBlZCggY2xpcHBlZF8gKQorICAgICAgLCBvbGRTd2FwY2hhaW4oIG9sZFN3YXBjaGFpbl8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKSAtIG9mZnNldG9mKCBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiggVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBzZXRTdXJmYWNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzdXJmYWNlID0gc3VyZmFjZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldE1pbkltYWdlQ291bnQoIHVpbnQzMl90IG1pbkltYWdlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1pbkltYWdlQ291bnQgPSBtaW5JbWFnZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICYgc2V0SW1hZ2VGb3JtYXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgaW1hZ2VGb3JtYXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlRm9ybWF0ID0gaW1hZ2VGb3JtYXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBzZXRJbWFnZUNvbG9yU3BhY2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2xvclNwYWNlS0hSIGltYWdlQ29sb3JTcGFjZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW1hZ2VDb2xvclNwYWNlID0gaW1hZ2VDb2xvclNwYWNlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICYgc2V0SW1hZ2VFeHRlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBpbWFnZUV4dGVudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW1hZ2VFeHRlbnQgPSBpbWFnZUV4dGVudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldEltYWdlQXJyYXlMYXllcnMoIHVpbnQzMl90IGltYWdlQXJyYXlMYXllcnNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGltYWdlQXJyYXlMYXllcnMgPSBpbWFnZUFycmF5TGF5ZXJzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICYgc2V0SW1hZ2VVc2FnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyBpbWFnZVVzYWdlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZVVzYWdlID0gaW1hZ2VVc2FnZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldEltYWdlU2hhcmluZ01vZGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFyaW5nTW9kZSBpbWFnZVNoYXJpbmdNb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbWFnZVNoYXJpbmdNb2RlID0gaW1hZ2VTaGFyaW5nTW9kZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldFF1ZXVlRmFtaWx5SW5kZXhDb3VudCggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleENvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBxdWV1ZUZhbWlseUluZGV4Q291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBzZXRQUXVldWVGYW1pbHlJbmRpY2VzKCBjb25zdCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5SW5kaWNlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IHBRdWV1ZUZhbWlseUluZGljZXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBzZXRQcmVUcmFuc2Zvcm0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgcHJlVHJhbnNmb3JtXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwcmVUcmFuc2Zvcm0gPSBwcmVUcmFuc2Zvcm1fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBzZXRDb21wb3NpdGVBbHBoYSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgY29tcG9zaXRlQWxwaGFfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbXBvc2l0ZUFscGhhID0gY29tcG9zaXRlQWxwaGFfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBzZXRQcmVzZW50TW9kZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRNb2RlS0hSIHByZXNlbnRNb2RlXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwcmVzZW50TW9kZSA9IHByZXNlbnRNb2RlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICYgc2V0Q2xpcHBlZCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBjbGlwcGVkXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjbGlwcGVkID0gY2xpcHBlZF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIHNldE9sZFN3YXBjaGFpbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBvbGRTd2FwY2hhaW5fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG9sZFN3YXBjaGFpbiA9IG9sZFN3YXBjaGFpbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBzdXJmYWNlID09IHJocy5zdXJmYWNlICkKKyAgICAgICAgICAmJiAoIG1pbkltYWdlQ291bnQgPT0gcmhzLm1pbkltYWdlQ291bnQgKQorICAgICAgICAgICYmICggaW1hZ2VGb3JtYXQgPT0gcmhzLmltYWdlRm9ybWF0ICkKKyAgICAgICAgICAmJiAoIGltYWdlQ29sb3JTcGFjZSA9PSByaHMuaW1hZ2VDb2xvclNwYWNlICkKKyAgICAgICAgICAmJiAoIGltYWdlRXh0ZW50ID09IHJocy5pbWFnZUV4dGVudCApCisgICAgICAgICAgJiYgKCBpbWFnZUFycmF5TGF5ZXJzID09IHJocy5pbWFnZUFycmF5TGF5ZXJzICkKKyAgICAgICAgICAmJiAoIGltYWdlVXNhZ2UgPT0gcmhzLmltYWdlVXNhZ2UgKQorICAgICAgICAgICYmICggaW1hZ2VTaGFyaW5nTW9kZSA9PSByaHMuaW1hZ2VTaGFyaW5nTW9kZSApCisgICAgICAgICAgJiYgKCBxdWV1ZUZhbWlseUluZGV4Q291bnQgPT0gcmhzLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCApCisgICAgICAgICAgJiYgKCBwUXVldWVGYW1pbHlJbmRpY2VzID09IHJocy5wUXVldWVGYW1pbHlJbmRpY2VzICkKKyAgICAgICAgICAmJiAoIHByZVRyYW5zZm9ybSA9PSByaHMucHJlVHJhbnNmb3JtICkKKyAgICAgICAgICAmJiAoIGNvbXBvc2l0ZUFscGhhID09IHJocy5jb21wb3NpdGVBbHBoYSApCisgICAgICAgICAgJiYgKCBwcmVzZW50TW9kZSA9PSByaHMucHJlc2VudE1vZGUgKQorICAgICAgICAgICYmICggY2xpcHBlZCA9PSByaHMuY2xpcHBlZCApCisgICAgICAgICAgJiYgKCBvbGRTd2FwY2hhaW4gPT0gcmhzLm9sZFN3YXBjaGFpbiApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIgZmxhZ3M7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICB1aW50MzJfdCBtaW5JbWFnZUNvdW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgaW1hZ2VGb3JtYXQ7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbG9yU3BhY2VLSFIgaW1hZ2VDb2xvclNwYWNlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBpbWFnZUV4dGVudDsKKyAgICB1aW50MzJfdCBpbWFnZUFycmF5TGF5ZXJzOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgaW1hZ2VVc2FnZTsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhcmluZ01vZGUgaW1hZ2VTaGFyaW5nTW9kZTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBwcmVUcmFuc2Zvcm07CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgY29tcG9zaXRlQWxwaGE7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlByZXNlbnRNb2RlS0hSIHByZXNlbnRNb2RlOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgY2xpcHBlZDsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIG9sZFN3YXBjaGFpbjsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8U3dhcGNoYWluQ3JlYXRlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGxvY2FsRGltbWluZ0VuYWJsZV8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBsb2NhbERpbW1pbmdFbmFibGUoIGxvY2FsRGltbWluZ0VuYWJsZV8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgKSAtIG9mZnNldG9mKCBTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EKCBWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EJiBvcGVyYXRvcj0oIFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EICYgc2V0TG9jYWxEaW1taW5nRW5hYmxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIGxvY2FsRGltbWluZ0VuYWJsZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbG9jYWxEaW1taW5nRW5hYmxlID0gbG9jYWxEaW1taW5nRW5hYmxlXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBsb2NhbERpbW1pbmdFbmFibGUgPT0gcmhzLmxvY2FsRGltbWluZ0VuYWJsZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbG9jYWxEaW1taW5nRW5hYmxlOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EICkgPT0gc2l6ZW9mKCBWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFN3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRAorICB7CisgICAgVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgc3VwcG9ydHNUZXh0dXJlR2F0aGVyTE9EQmlhc0FNRF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBzdXBwb3J0c1RleHR1cmVHYXRoZXJMT0RCaWFzQU1EKCBzdXBwb3J0c1RleHR1cmVHYXRoZXJMT0RCaWFzQU1EXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlRleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCApIC0gb2Zmc2V0b2YoIFRleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1ELCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQoIFZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQmIG9wZXJhdG9yPSggVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFRleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBzdXBwb3J0c1RleHR1cmVHYXRoZXJMT0RCaWFzQU1EID09IHJocy5zdXBwb3J0c1RleHR1cmVHYXRoZXJMT0RCaWFzQU1EICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVUZXh0dXJlTG9kR2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRDsKKyAgICB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBzdXBwb3J0c1RleHR1cmVHYXRoZXJMT0RCaWFzQU1EOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFRleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EICkgPT0gc2l6ZW9mKCBWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFRleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFRpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiggdWludDMyX3Qgd2FpdFNlbWFwaG9yZVZhbHVlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KiBwV2FpdFNlbWFwaG9yZVZhbHVlc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogd2FpdFNlbWFwaG9yZVZhbHVlQ291bnQoIHdhaXRTZW1hcGhvcmVWYWx1ZUNvdW50XyApCisgICAgICAsIHBXYWl0U2VtYXBob3JlVmFsdWVzKCBwV2FpdFNlbWFwaG9yZVZhbHVlc18gKQorICAgICAgLCBzaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50KCBzaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50XyApCisgICAgICAsIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMoIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXNfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlRpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlRpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSICkgLSBvZmZzZXRvZiggVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSKCBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFImIG9wZXJhdG9yPSggVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6VGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFRpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSICYgc2V0V2FpdFNlbWFwaG9yZVZhbHVlQ291bnQoIHVpbnQzMl90IHdhaXRTZW1hcGhvcmVWYWx1ZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICB3YWl0U2VtYXBob3JlVmFsdWVDb3VudCA9IHdhaXRTZW1hcGhvcmVWYWx1ZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgJiBzZXRQV2FpdFNlbWFwaG9yZVZhbHVlcyggY29uc3QgdWludDY0X3QqIHBXYWl0U2VtYXBob3JlVmFsdWVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwV2FpdFNlbWFwaG9yZVZhbHVlcyA9IHBXYWl0U2VtYXBob3JlVmFsdWVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgJiBzZXRTaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50KCB1aW50MzJfdCBzaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBzaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50ID0gc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSICYgc2V0UFNpZ25hbFNlbWFwaG9yZVZhbHVlcyggY29uc3QgdWludDY0X3QqIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPSBwU2lnbmFsU2VtYXBob3JlVmFsdWVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIHdhaXRTZW1hcGhvcmVWYWx1ZUNvdW50ID09IHJocy53YWl0U2VtYXBob3JlVmFsdWVDb3VudCApCisgICAgICAgICAgJiYgKCBwV2FpdFNlbWFwaG9yZVZhbHVlcyA9PSByaHMucFdhaXRTZW1hcGhvcmVWYWx1ZXMgKQorICAgICAgICAgICYmICggc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudCA9PSByaHMuc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudCApCisgICAgICAgICAgJiYgKCBwU2lnbmFsU2VtYXBob3JlVmFsdWVzID09IHJocy5wU2lnbmFsU2VtYXBob3JlVmFsdWVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCB3YWl0U2VtYXBob3JlVmFsdWVDb3VudDsKKyAgICBjb25zdCB1aW50NjRfdCogcFdhaXRTZW1hcGhvcmVWYWx1ZXM7CisgICAgdWludDMyX3Qgc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudDsKKyAgICBjb25zdCB1aW50NjRfdCogcFNpZ25hbFNlbWFwaG9yZVZhbHVlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgKSA9PSBzaXplb2YoIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFRpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUNyZWF0ZUZsYWdzRVhUIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVDcmVhdGVGbGFnc0VYVCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0aWFsRGF0YVNpemVfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwSW5pdGlhbERhdGFfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZmxhZ3MoIGZsYWdzXyApCisgICAgICAsIGluaXRpYWxEYXRhU2l6ZSggaW5pdGlhbERhdGFTaXplXyApCisgICAgICAsIHBJbml0aWFsRGF0YSggcEluaXRpYWxEYXRhXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCApIC0gb2Zmc2V0b2YoIFZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVDcmVhdGVGbGFnc0VYVCBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAmIHNldEluaXRpYWxEYXRhU2l6ZSggc2l6ZV90IGluaXRpYWxEYXRhU2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5pdGlhbERhdGFTaXplID0gaW5pdGlhbERhdGFTaXplXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUICYgc2V0UEluaXRpYWxEYXRhKCBjb25zdCB2b2lkKiBwSW5pdGlhbERhdGFfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBJbml0aWFsRGF0YSA9IHBJbml0aWFsRGF0YV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCBpbml0aWFsRGF0YVNpemUgPT0gcmhzLmluaXRpYWxEYXRhU2l6ZSApCisgICAgICAgICAgJiYgKCBwSW5pdGlhbERhdGEgPT0gcmhzLnBJbml0aWFsRGF0YSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlQ3JlYXRlRmxhZ3NFWFQgZmxhZ3M7CisgICAgc2l6ZV90IGluaXRpYWxEYXRhU2l6ZTsKKyAgICBjb25zdCB2b2lkKiBwSW5pdGlhbERhdGE7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCApID09IHNpemVvZiggVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQ+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisKKyAgc3RydWN0IFZhbGlkYXRpb25GZWF0dXJlc0VYVAorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgVmFsaWRhdGlvbkZlYXR1cmVzRVhUKCB1aW50MzJfdCBlbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUKiBwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUKiBwRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQoIGVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50XyApCisgICAgICAsIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzKCBwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlc18gKQorICAgICAgLCBkaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQoIGRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudF8gKQorICAgICAgLCBwRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMoIHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkZlYXR1cmVzRVhUICYgb3BlcmF0b3I9KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uRmVhdHVyZXNFWFQgKSAtIG9mZnNldG9mKCBWYWxpZGF0aW9uRmVhdHVyZXNFWFQsIHBOZXh0ICkgKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uRmVhdHVyZXNFWFQoIFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFZhbGlkYXRpb25GZWF0dXJlc0VYVCYgb3BlcmF0b3I9KCBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uRmVhdHVyZXNFWFQgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmFsaWRhdGlvbkZlYXR1cmVzRVhUICYgc2V0UE5leHQoIGNvbnN0IHZvaWQqIHBOZXh0XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwTmV4dCA9IHBOZXh0XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uRmVhdHVyZXNFWFQgJiBzZXRFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCggdWludDMyX3QgZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID0gZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZhbGlkYXRpb25GZWF0dXJlc0VYVCAmIHNldFBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQqIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcyA9IHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uRmVhdHVyZXNFWFQgJiBzZXREaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQoIHVpbnQzMl90IGRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID0gZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uRmVhdHVyZXNFWFQgJiBzZXRQRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQqIHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBWYWxpZGF0aW9uRmVhdHVyZXNFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID09IHJocy5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCApCisgICAgICAgICAgJiYgKCBwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcyA9PSByaHMucEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgKQorICAgICAgICAgICYmICggZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID09IHJocy5kaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgKQorICAgICAgICAgICYmICggcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzID09IHJocy5wRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFZhbGlkYXRpb25GZWF0dXJlc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVWYWxpZGF0aW9uRmVhdHVyZXNFWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCogcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXM7CisgICAgdWludDMyX3QgZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQqIHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBWYWxpZGF0aW9uRmVhdHVyZXNFWFQgKSA9PSBzaXplb2YoIFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFZhbGlkYXRpb25GZWF0dXJlc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgVmFsaWRhdGlvbkZsYWdzRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBWYWxpZGF0aW9uRmxhZ3NFWFQoIHVpbnQzMl90IGRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2hlY2tFWFQqIHBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3NfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudCggZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudF8gKQorICAgICAgLCBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzKCBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uRmxhZ3NFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uRmxhZ3NFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25GbGFnc0VYVCApIC0gb2Zmc2V0b2YoIFZhbGlkYXRpb25GbGFnc0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZhbGlkYXRpb25GbGFnc0VYVCggVmtWYWxpZGF0aW9uRmxhZ3NFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgVmFsaWRhdGlvbkZsYWdzRVhUJiBvcGVyYXRvcj0oIFZrVmFsaWRhdGlvbkZsYWdzRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25GbGFnc0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uRmxhZ3NFWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZhbGlkYXRpb25GbGFnc0VYVCAmIHNldERpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQoIHVpbnQzMl90IGRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQgPSBkaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWYWxpZGF0aW9uRmxhZ3NFWFQgJiBzZXRQRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNoZWNrRVhUKiBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzID0gcERpc2FibGVkVmFsaWRhdGlvbkNoZWNrc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtWYWxpZGF0aW9uRmxhZ3NFWFQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ZhbGlkYXRpb25GbGFnc0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtWYWxpZGF0aW9uRmxhZ3NFWFQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtWYWxpZGF0aW9uRmxhZ3NFWFQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggVmFsaWRhdGlvbkZsYWdzRVhUIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50ID09IHJocy5kaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50ICkKKyAgICAgICAgICAmJiAoIHBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MgPT0gcmhzLnBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFZhbGlkYXRpb25GbGFnc0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVWYWxpZGF0aW9uRmxhZ3NFWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DaGVja0VYVCogcERpc2FibGVkVmFsaWRhdGlvbkNoZWNrczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBWYWxpZGF0aW9uRmxhZ3NFWFQgKSA9PSBzaXplb2YoIFZrVmFsaWRhdGlvbkZsYWdzRVhUICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFZhbGlkYXRpb25GbGFnc0VYVD46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCisgIHN0cnVjdCBWaVN1cmZhY2VDcmVhdGVJbmZvTk4KKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFZpU3VyZmFjZUNyZWF0ZUluZm9OTiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpU3VyZmFjZUNyZWF0ZUZsYWdzTk4gZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpU3VyZmFjZUNyZWF0ZUZsYWdzTk4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHdpbmRvd18gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgd2luZG93KCB3aW5kb3dfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpU3VyZmFjZUNyZWF0ZUluZm9OTiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpU3VyZmFjZUNyZWF0ZUluZm9OTiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmlTdXJmYWNlQ3JlYXRlSW5mb05OICkgLSBvZmZzZXRvZiggVmlTdXJmYWNlQ3JlYXRlSW5mb05OLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlTdXJmYWNlQ3JlYXRlSW5mb05OKCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBWaVN1cmZhY2VDcmVhdGVJbmZvTk4mIG9wZXJhdG9yPSggVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4gY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmlTdXJmYWNlQ3JlYXRlSW5mb05OIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFZpU3VyZmFjZUNyZWF0ZUluZm9OTiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVmlTdXJmYWNlQ3JlYXRlSW5mb05OICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaVN1cmZhY2VDcmVhdGVGbGFnc05OIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBWaVN1cmZhY2VDcmVhdGVJbmZvTk4gJiBzZXRXaW5kb3coIHZvaWQqIHdpbmRvd18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgd2luZG93ID0gd2luZG93XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBWaVN1cmZhY2VDcmVhdGVJbmZvTk4gY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGZsYWdzID09IHJocy5mbGFncyApCisgICAgICAgICAgJiYgKCB3aW5kb3cgPT0gcmhzLndpbmRvdyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggVmlTdXJmYWNlQ3JlYXRlSW5mb05OIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVZpU3VyZmFjZUNyZWF0ZUluZm9OTjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpU3VyZmFjZUNyZWF0ZUZsYWdzTk4gZmxhZ3M7CisgICAgdm9pZCogd2luZG93OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFZpU3VyZmFjZUNyZWF0ZUluZm9OTiApID09IHNpemVvZiggVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4gKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8VmlTdXJmYWNlQ3JlYXRlSW5mb05OPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1ZJX05OKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCisgIHN0cnVjdCBXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFdheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldheWxhbmRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldheWxhbmRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3bF9kaXNwbGF5KiBkaXNwbGF5XyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xfc3VyZmFjZSogc3VyZmFjZV8gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgZGlzcGxheSggZGlzcGxheV8gKQorICAgICAgLCBzdXJmYWNlKCBzdXJmYWNlXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIFdheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiggVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSJiBvcGVyYXRvcj0oIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2F5bGFuZFN1cmZhY2VDcmVhdGVGbGFnc0tIUiBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgc2V0RGlzcGxheSggc3RydWN0IHdsX2Rpc3BsYXkqIGRpc3BsYXlfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRpc3BsYXkgPSBkaXNwbGF5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRTdXJmYWNlKCBzdHJ1Y3Qgd2xfc3VyZmFjZSogc3VyZmFjZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgc3VyZmFjZSA9IHN1cmZhY2VfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFdheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGRpc3BsYXkgPT0gcmhzLmRpc3BsYXkgKQorICAgICAgICAgICYmICggc3VyZmFjZSA9PSByaHMuc3VyZmFjZSApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVdheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldheWxhbmRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3M7CisgICAgc3RydWN0IHdsX2Rpc3BsYXkqIGRpc3BsYXk7CisgICAgc3RydWN0IHdsX3N1cmZhY2UqIHN1cmZhY2U7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSICkgPT0gc2l6ZW9mKCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiggdWludDMyX3QgYWNxdWlyZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KiBwQWNxdWlyZVN5bmNzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogcEFjcXVpcmVLZXlzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcEFjcXVpcmVUaW1lb3V0c18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVsZWFzZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KiBwUmVsZWFzZVN5bmNzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogcFJlbGVhc2VLZXlzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGFjcXVpcmVDb3VudCggYWNxdWlyZUNvdW50XyApCisgICAgICAsIHBBY3F1aXJlU3luY3MoIHBBY3F1aXJlU3luY3NfICkKKyAgICAgICwgcEFjcXVpcmVLZXlzKCBwQWNxdWlyZUtleXNfICkKKyAgICAgICwgcEFjcXVpcmVUaW1lb3V0cyggcEFjcXVpcmVUaW1lb3V0c18gKQorICAgICAgLCByZWxlYXNlQ291bnQoIHJlbGVhc2VDb3VudF8gKQorICAgICAgLCBwUmVsZWFzZVN5bmNzKCBwUmVsZWFzZVN5bmNzXyApCisgICAgICAsIHBSZWxlYXNlS2V5cyggcFJlbGVhc2VLZXlzXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiggVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSJiBvcGVyYXRvcj0oIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiAmIHNldEFjcXVpcmVDb3VudCggdWludDMyX3QgYWNxdWlyZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhY3F1aXJlQ291bnQgPSBhY3F1aXJlQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiAmIHNldFBBY3F1aXJlU3luY3MoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkqIHBBY3F1aXJlU3luY3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBBY3F1aXJlU3luY3MgPSBwQWNxdWlyZVN5bmNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgJiBzZXRQQWNxdWlyZUtleXMoIGNvbnN0IHVpbnQ2NF90KiBwQWNxdWlyZUtleXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBBY3F1aXJlS2V5cyA9IHBBY3F1aXJlS2V5c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSICYgc2V0UEFjcXVpcmVUaW1lb3V0cyggY29uc3QgdWludDMyX3QqIHBBY3F1aXJlVGltZW91dHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBBY3F1aXJlVGltZW91dHMgPSBwQWNxdWlyZVRpbWVvdXRzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgJiBzZXRSZWxlYXNlQ291bnQoIHVpbnQzMl90IHJlbGVhc2VDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVsZWFzZUNvdW50ID0gcmVsZWFzZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgJiBzZXRQUmVsZWFzZVN5bmNzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KiBwUmVsZWFzZVN5bmNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwUmVsZWFzZVN5bmNzID0gcFJlbGVhc2VTeW5jc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSICYgc2V0UFJlbGVhc2VLZXlzKCBjb25zdCB1aW50NjRfdCogcFJlbGVhc2VLZXlzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwUmVsZWFzZUtleXMgPSBwUmVsZWFzZUtleXNfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggYWNxdWlyZUNvdW50ID09IHJocy5hY3F1aXJlQ291bnQgKQorICAgICAgICAgICYmICggcEFjcXVpcmVTeW5jcyA9PSByaHMucEFjcXVpcmVTeW5jcyApCisgICAgICAgICAgJiYgKCBwQWNxdWlyZUtleXMgPT0gcmhzLnBBY3F1aXJlS2V5cyApCisgICAgICAgICAgJiYgKCBwQWNxdWlyZVRpbWVvdXRzID09IHJocy5wQWNxdWlyZVRpbWVvdXRzICkKKyAgICAgICAgICAmJiAoIHJlbGVhc2VDb3VudCA9PSByaHMucmVsZWFzZUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBSZWxlYXNlU3luY3MgPT0gcmhzLnBSZWxlYXNlU3luY3MgKQorICAgICAgICAgICYmICggcFJlbGVhc2VLZXlzID09IHJocy5wUmVsZWFzZUtleXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGFjcXVpcmVDb3VudDsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KiBwQWNxdWlyZVN5bmNzOworICAgIGNvbnN0IHVpbnQ2NF90KiBwQWNxdWlyZUtleXM7CisgICAgY29uc3QgdWludDMyX3QqIHBBY3F1aXJlVGltZW91dHM7CisgICAgdWludDMyX3QgcmVsZWFzZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkqIHBSZWxlYXNlU3luY3M7CisgICAgY29uc3QgdWludDY0X3QqIHBSZWxlYXNlS2V5czsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgKSA9PSBzaXplb2YoIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYoIHVpbnQzMl90IGFjcXVpcmVDb3VudF8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KiBwQWNxdWlyZVN5bmNzXyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KiBwQWNxdWlyZUtleXNfID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWxlYXNlQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSogcFJlbGVhc2VTeW5jc18gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogcFJlbGVhc2VLZXlzXyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGFjcXVpcmVDb3VudCggYWNxdWlyZUNvdW50XyApCisgICAgICAsIHBBY3F1aXJlU3luY3MoIHBBY3F1aXJlU3luY3NfICkKKyAgICAgICwgcEFjcXVpcmVLZXlzKCBwQWNxdWlyZUtleXNfICkKKyAgICAgICwgcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzKCBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHNfICkKKyAgICAgICwgcmVsZWFzZUNvdW50KCByZWxlYXNlQ291bnRfICkKKyAgICAgICwgcFJlbGVhc2VTeW5jcyggcFJlbGVhc2VTeW5jc18gKQorICAgICAgLCBwUmVsZWFzZUtleXMoIHBSZWxlYXNlS2V5c18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgKSAtIG9mZnNldG9mKCBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WKCBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WJiBvcGVyYXRvcj0oIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WICYgc2V0QWNxdWlyZUNvdW50KCB1aW50MzJfdCBhY3F1aXJlQ291bnRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGFjcXVpcmVDb3VudCA9IGFjcXVpcmVDb3VudF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgJiBzZXRQQWNxdWlyZVN5bmNzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KiBwQWNxdWlyZVN5bmNzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQWNxdWlyZVN5bmNzID0gcEFjcXVpcmVTeW5jc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgJiBzZXRQQWNxdWlyZUtleXMoIGNvbnN0IHVpbnQ2NF90KiBwQWNxdWlyZUtleXNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBBY3F1aXJlS2V5cyA9IHBBY3F1aXJlS2V5c187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgJiBzZXRQQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMoIGNvbnN0IHVpbnQzMl90KiBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHNfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcyA9IHBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgJiBzZXRSZWxlYXNlQ291bnQoIHVpbnQzMl90IHJlbGVhc2VDb3VudF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmVsZWFzZUNvdW50ID0gcmVsZWFzZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViAmIHNldFBSZWxlYXNlU3luY3MoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkqIHBSZWxlYXNlU3luY3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBSZWxlYXNlU3luY3MgPSBwUmVsZWFzZVN5bmNzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViAmIHNldFBSZWxlYXNlS2V5cyggY29uc3QgdWludDY0X3QqIHBSZWxlYXNlS2V5c18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcFJlbGVhc2VLZXlzID0gcFJlbGVhc2VLZXlzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBhY3F1aXJlQ291bnQgPT0gcmhzLmFjcXVpcmVDb3VudCApCisgICAgICAgICAgJiYgKCBwQWNxdWlyZVN5bmNzID09IHJocy5wQWNxdWlyZVN5bmNzICkKKyAgICAgICAgICAmJiAoIHBBY3F1aXJlS2V5cyA9PSByaHMucEFjcXVpcmVLZXlzICkKKyAgICAgICAgICAmJiAoIHBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcyA9PSByaHMucEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzICkKKyAgICAgICAgICAmJiAoIHJlbGVhc2VDb3VudCA9PSByaHMucmVsZWFzZUNvdW50ICkKKyAgICAgICAgICAmJiAoIHBSZWxlYXNlU3luY3MgPT0gcmhzLnBSZWxlYXNlU3luY3MgKQorICAgICAgICAgICYmICggcFJlbGVhc2VLZXlzID09IHJocy5wUmVsZWFzZUtleXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBhY3F1aXJlQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSogcEFjcXVpcmVTeW5jczsKKyAgICBjb25zdCB1aW50NjRfdCogcEFjcXVpcmVLZXlzOworICAgIGNvbnN0IHVpbnQzMl90KiBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHM7CisgICAgdWludDMyX3QgcmVsZWFzZUNvdW50OworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkqIHBSZWxlYXNlU3luY3M7CisgICAgY29uc3QgdWludDY0X3QqIHBSZWxlYXNlS2V5czsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViApID09IHNpemVvZiggVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgIHN0cnVjdCBXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2luMzJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldpbjMyU3VyZmFjZUNyZWF0ZUZsYWdzS0hSKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFIGhpbnN0YW5jZV8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQgaHduZF8gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgaGluc3RhbmNlKCBoaW5zdGFuY2VfICkKKyAgICAgICwgaHduZCggaHduZF8gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgKSAtIG9mZnNldG9mKCBXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiggVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFdpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldEZsYWdzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2luMzJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3NfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZsYWdzID0gZmxhZ3NfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRIaW5zdGFuY2UoIEhJTlNUQU5DRSBoaW5zdGFuY2VfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGhpbnN0YW5jZSA9IGhpbnN0YW5jZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldEh3bmQoIEhXTkQgaHduZF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaHduZCA9IGh3bmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSICYoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggaGluc3RhbmNlID09IHJocy5oaW5zdGFuY2UgKQorICAgICAgICAgICYmICggaHduZCA9PSByaHMuaHduZCApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSggV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2luMzJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3M7CisgICAgSElOU1RBTkNFIGhpbnN0YW5jZTsKKyAgICBIV05EIGh3bmQ7CisgIH07CisgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiApID09IHNpemVvZiggVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSICksICJzdHJ1Y3QgYW5kIHdyYXBwZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZSEiICk7CisgIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFdpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFI+Ojp2YWx1ZSwgInN0cnVjdCB3cmFwcGVyIGlzIG5vdCBhIHN0YW5kYXJkIGxheW91dCEiICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICBzdHJ1Y3QgV3JpdGVEZXNjcmlwdG9yU2V0CisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBXcml0ZURlc2NyaXB0b3JTZXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0IGRzdFNldF8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0QmluZGluZ18gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0QXJyYXlFbGVtZW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXNjcmlwdG9yQ291bnRfID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yVHlwZV8gPSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclR5cGU6OmVTYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JJbWFnZUluZm8qIHBJbWFnZUluZm9fID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yQnVmZmVySW5mbyogcEJ1ZmZlckluZm9fID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJWaWV3KiBwVGV4ZWxCdWZmZXJWaWV3XyA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGRzdFNldCggZHN0U2V0XyApCisgICAgICAsIGRzdEJpbmRpbmcoIGRzdEJpbmRpbmdfICkKKyAgICAgICwgZHN0QXJyYXlFbGVtZW50KCBkc3RBcnJheUVsZW1lbnRfICkKKyAgICAgICwgZGVzY3JpcHRvckNvdW50KCBkZXNjcmlwdG9yQ291bnRfICkKKyAgICAgICwgZGVzY3JpcHRvclR5cGUoIGRlc2NyaXB0b3JUeXBlXyApCisgICAgICAsIHBJbWFnZUluZm8oIHBJbWFnZUluZm9fICkKKyAgICAgICwgcEJ1ZmZlckluZm8oIHBCdWZmZXJJbmZvXyApCisgICAgICAsIHBUZXhlbEJ1ZmZlclZpZXcoIHBUZXhlbEJ1ZmZlclZpZXdfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldyaXRlRGVzY3JpcHRvclNldCAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldyaXRlRGVzY3JpcHRvclNldCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V3JpdGVEZXNjcmlwdG9yU2V0ICkgLSBvZmZzZXRvZiggV3JpdGVEZXNjcmlwdG9yU2V0LCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV3JpdGVEZXNjcmlwdG9yU2V0KCBWa1dyaXRlRGVzY3JpcHRvclNldCBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBXcml0ZURlc2NyaXB0b3JTZXQmIG9wZXJhdG9yPSggVmtXcml0ZURlc2NyaXB0b3JTZXQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6V3JpdGVEZXNjcmlwdG9yU2V0IGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldCAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV3JpdGVEZXNjcmlwdG9yU2V0ICYgc2V0RHN0U2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCBkc3RTZXRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRzdFNldCA9IGRzdFNldF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV3JpdGVEZXNjcmlwdG9yU2V0ICYgc2V0RHN0QmluZGluZyggdWludDMyX3QgZHN0QmluZGluZ18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHN0QmluZGluZyA9IGRzdEJpbmRpbmdfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldCAmIHNldERzdEFycmF5RWxlbWVudCggdWludDMyX3QgZHN0QXJyYXlFbGVtZW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkc3RBcnJheUVsZW1lbnQgPSBkc3RBcnJheUVsZW1lbnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldCAmIHNldERlc2NyaXB0b3JDb3VudCggdWludDMyX3QgZGVzY3JpcHRvckNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBkZXNjcmlwdG9yQ291bnQgPSBkZXNjcmlwdG9yQ291bnRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldCAmIHNldERlc2NyaXB0b3JUeXBlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGVfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGRlc2NyaXB0b3JUeXBlID0gZGVzY3JpcHRvclR5cGVfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldCAmIHNldFBJbWFnZUluZm8oIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9ySW1hZ2VJbmZvKiBwSW1hZ2VJbmZvXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwSW1hZ2VJbmZvID0gcEltYWdlSW5mb187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV3JpdGVEZXNjcmlwdG9yU2V0ICYgc2V0UEJ1ZmZlckluZm8oIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yQnVmZmVySW5mbyogcEJ1ZmZlckluZm9fICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBCdWZmZXJJbmZvID0gcEJ1ZmZlckluZm9fOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldCAmIHNldFBUZXhlbEJ1ZmZlclZpZXcoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJWaWV3KiBwVGV4ZWxCdWZmZXJWaWV3XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwVGV4ZWxCdWZmZXJWaWV3ID0gcFRleGVsQnVmZmVyVmlld187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtXcml0ZURlc2NyaXB0b3JTZXQgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCo+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtXcml0ZURlc2NyaXB0b3JTZXQgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtXcml0ZURlc2NyaXB0b3JTZXQqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggV3JpdGVEZXNjcmlwdG9yU2V0IGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBkc3RTZXQgPT0gcmhzLmRzdFNldCApCisgICAgICAgICAgJiYgKCBkc3RCaW5kaW5nID09IHJocy5kc3RCaW5kaW5nICkKKyAgICAgICAgICAmJiAoIGRzdEFycmF5RWxlbWVudCA9PSByaHMuZHN0QXJyYXlFbGVtZW50ICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JDb3VudCA9PSByaHMuZGVzY3JpcHRvckNvdW50ICkKKyAgICAgICAgICAmJiAoIGRlc2NyaXB0b3JUeXBlID09IHJocy5kZXNjcmlwdG9yVHlwZSApCisgICAgICAgICAgJiYgKCBwSW1hZ2VJbmZvID09IHJocy5wSW1hZ2VJbmZvICkKKyAgICAgICAgICAmJiAoIHBCdWZmZXJJbmZvID09IHJocy5wQnVmZmVySW5mbyApCisgICAgICAgICAgJiYgKCBwVGV4ZWxCdWZmZXJWaWV3ID09IHJocy5wVGV4ZWxCdWZmZXJWaWV3ICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBXcml0ZURlc2NyaXB0b3JTZXQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocyApOworICAgIH0KKworICBwdWJsaWM6CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0cnVjdHVyZVR5cGUgc1R5cGUgPSBTdHJ1Y3R1cmVUeXBlOjplV3JpdGVEZXNjcmlwdG9yU2V0OworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCBkc3RTZXQ7CisgICAgdWludDMyX3QgZHN0QmluZGluZzsKKyAgICB1aW50MzJfdCBkc3RBcnJheUVsZW1lbnQ7CisgICAgdWludDMyX3QgZGVzY3JpcHRvckNvdW50OworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yVHlwZTsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvckltYWdlSW5mbyogcEltYWdlSW5mbzsKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvckJ1ZmZlckluZm8qIHBCdWZmZXJJbmZvOworICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJWaWV3KiBwVGV4ZWxCdWZmZXJWaWV3OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFdyaXRlRGVzY3JpcHRvclNldCApID09IHNpemVvZiggVmtXcml0ZURlc2NyaXB0b3JTZXQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8V3JpdGVEZXNjcmlwdG9yU2V0Pjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisgIHN0cnVjdCBXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVgorICB7CisgICAgVlVMS0FOX0hQUF9DT05TVEVYUFIgV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIHVpbnQzMl90IGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50XyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogcEFjY2VsZXJhdGlvblN0cnVjdHVyZXNfID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICAgIDogYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQoIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50XyApCisgICAgICAsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzKCBwQWNjZWxlcmF0aW9uU3RydWN0dXJlc18gKQorICAgIHt9CisKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgKSAtIG9mZnNldG9mKCBXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WJiBvcGVyYXRvcj0oIFZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6V3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgY29uc3QgKj4oJnJocyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WICYgc2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQoIHVpbnQzMl90IGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50XyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCA9IGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAmIHNldFBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcyA9IHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGNvbnN0JigpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oIFdyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCA9PSByaHMuYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQgKQorICAgICAgICAgICYmICggcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPT0gcmhzLnBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KCBXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICBjb25zdCB2b2lkKiBwTmV4dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ7CisgICAgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBwQWNjZWxlcmF0aW9uU3RydWN0dXJlczsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViApID09IHNpemVvZiggVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKworICBzdHJ1Y3QgV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUCisgIHsKKyAgICBWVUxLQU5fSFBQX0NPTlNURVhQUiBXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQoIHVpbnQzMl90IGRhdGFTaXplXyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwRGF0YV8gPSBudWxscHRyICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBkYXRhU2l6ZSggZGF0YVNpemVfICkKKyAgICAgICwgcERhdGEoIHBEYXRhXyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgJiBvcGVyYXRvcj0oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgbWVtY3B5KCAmcE5leHQsICZyaHMucE5leHQsIHNpemVvZiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCApIC0gb2Zmc2V0b2YoIFdyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCwgcE5leHQgKSApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCggVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUJiBvcGVyYXRvcj0oIFZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICp0aGlzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgJiBzZXRQTmV4dCggY29uc3Qgdm9pZCogcE5leHRfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHBOZXh0ID0gcE5leHRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFdyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCAmIHNldERhdGFTaXplKCB1aW50MzJfdCBkYXRhU2l6ZV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZGF0YVNpemUgPSBkYXRhU2l6ZV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUICYgc2V0UERhdGEoIGNvbnN0IHZvaWQqIHBEYXRhXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBwRGF0YSA9IHBEYXRhXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUKj4oIHRoaXMgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCAmKCkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCo+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgY29uc3QmIHJocyApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKCBzVHlwZSA9PSByaHMuc1R5cGUgKQorICAgICAgICAgICYmICggcE5leHQgPT0gcmhzLnBOZXh0ICkKKyAgICAgICAgICAmJiAoIGRhdGFTaXplID09IHJocy5kYXRhU2l6ZSApCisgICAgICAgICAgJiYgKCBwRGF0YSA9PSByaHMucERhdGEgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFdyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIHVpbnQzMl90IGRhdGFTaXplOworICAgIGNvbnN0IHZvaWQqIHBEYXRhOworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFdyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCApID09IHNpemVvZiggVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8V3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworICBzdHJ1Y3QgWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFhjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WGNiU3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzXyA9IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYY2JTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCogY29ubmVjdGlvbl8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3Qgd2luZG93XyA9IDAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgICA6IGZsYWdzKCBmbGFnc18gKQorICAgICAgLCBjb25uZWN0aW9uKCBjb25uZWN0aW9uXyApCisgICAgICAsIHdpbmRvdyggd2luZG93XyApCisgICAge30KKworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICYgcmhzICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIG1lbWNweSggJnBOZXh0LCAmcmhzLnBOZXh0LCBzaXplb2YoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiApIC0gb2Zmc2V0b2YoIFhjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIoIFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorCisgICAgWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9ICpyZWludGVycHJldF9jYXN0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAqPigmcmhzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRGbGFncyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhjYlN1cmZhY2VDcmVhdGVGbGFnc0tIUiBmbGFnc18gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZmxhZ3MgPSBmbGFnc187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRDb25uZWN0aW9uKCB4Y2JfY29ubmVjdGlvbl90KiBjb25uZWN0aW9uXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbl87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRXaW5kb3coIHhjYl93aW5kb3dfdCB3aW5kb3dfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHdpbmRvdyA9IHdpbmRvd187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYoKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KCBYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoIHNUeXBlID09IHJocy5zVHlwZSApCisgICAgICAgICAgJiYgKCBwTmV4dCA9PSByaHMucE5leHQgKQorICAgICAgICAgICYmICggZmxhZ3MgPT0gcmhzLmZsYWdzICkKKyAgICAgICAgICAmJiAoIGNvbm5lY3Rpb24gPT0gcmhzLmNvbm5lY3Rpb24gKQorICAgICAgICAgICYmICggd2luZG93ID09IHJocy53aW5kb3cgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFhjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMgKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gU3RydWN0dXJlVHlwZTo6ZVhjYlN1cmZhY2VDcmVhdGVJbmZvS0hSOworICAgIGNvbnN0IHZvaWQqIHBOZXh0ID0gbnVsbHB0cjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WGNiU3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzOworICAgIHhjYl9jb25uZWN0aW9uX3QqIGNvbm5lY3Rpb247CisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiApID09IHNpemVvZiggVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiApLCAic3RydWN0IGFuZCB3cmFwcGVyIGhhdmUgZGlmZmVyZW50IHNpemUhIiApOworICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUj46OnZhbHVlLCAic3RydWN0IHdyYXBwZXIgaXMgbm90IGEgc3RhbmRhcmQgbGF5b3V0ISIgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisgIHN0cnVjdCBYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIKKyAgeworICAgIFZVTEtBTl9IUFBfQ09OU1RFWFBSIFhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhsaWJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgZmxhZ3NfID0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhsaWJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkqIGRweV8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93IHdpbmRvd18gPSAwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgICAgOiBmbGFncyggZmxhZ3NfICkKKyAgICAgICwgZHB5KCBkcHlfICkKKyAgICAgICwgd2luZG93KCB3aW5kb3dfICkKKyAgICB7fQorCisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIG9wZXJhdG9yPSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBtZW1jcHkoICZwTmV4dCwgJnJocy5wTmV4dCwgc2l6ZW9mKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSICkgLSBvZmZzZXRvZiggWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSLCBwTmV4dCApICk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAmIHJocyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisKKyAgICBYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPSggVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgJiByaHMgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgKnRoaXMgPSAqcmVpbnRlcnByZXRfY2FzdDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6WGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KCZyaHMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIHNldFBOZXh0KCBjb25zdCB2b2lkKiBwTmV4dF8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcE5leHQgPSBwTmV4dF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSICYgc2V0RmxhZ3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYbGliU3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzXyApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBmbGFncyA9IGZsYWdzXzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXREcHkoIERpc3BsYXkqIGRweV8gKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgZHB5ID0gZHB5XzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBzZXRXaW5kb3coIFdpbmRvdyB3aW5kb3dfICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHdpbmRvdyA9IHdpbmRvd187CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QmKCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCB0aGlzICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgJigpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggdGhpcyApOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PSggWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0JiByaHMgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgcmV0dXJuICggc1R5cGUgPT0gcmhzLnNUeXBlICkKKyAgICAgICAgICAmJiAoIHBOZXh0ID09IHJocy5wTmV4dCApCisgICAgICAgICAgJiYgKCBmbGFncyA9PSByaHMuZmxhZ3MgKQorICAgICAgICAgICYmICggZHB5ID09IHJocy5kcHkgKQorICAgICAgICAgICYmICggd2luZG93ID09IHJocy53aW5kb3cgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oIFhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCYgcmhzICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzICk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RydWN0dXJlVHlwZSBzVHlwZSA9IFN0cnVjdHVyZVR5cGU6OmVYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFI7CisgICAgY29uc3Qgdm9pZCogcE5leHQgPSBudWxscHRyOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYbGliU3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzOworICAgIERpc3BsYXkqIGRweTsKKyAgICBXaW5kb3cgd2luZG93OworICB9OworICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIFhsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiApID09IHNpemVvZiggVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgKSwgInN0cnVjdCBhbmQgd3JhcHBlciBoYXZlIGRpZmZlcmVudCBzaXplISIgKTsKKyAgc3RhdGljX2Fzc2VydCggc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8WGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSPjo6dmFsdWUsICJzdHJ1Y3Qgd3JhcHBlciBpcyBub3QgYSBzdGFuZGFyZCBsYXlvdXQhIiApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IGNyZWF0ZUluc3RhbmNlKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5zdGFuY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbnN0YW5jZSogcEluc3RhbmNlLCBEaXNwYXRjaCBjb25zdCAmZCkKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlSW5zdGFuY2UoIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrSW5zdGFuY2UqPiggcEluc3RhbmNlICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlPjo6dHlwZSBjcmVhdGVJbnN0YW5jZSggY29uc3QgSW5zdGFuY2VDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5zdGFuY2UgaW5zdGFuY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVJbnN0YW5jZSggcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbnN0YW5jZSo+KCAmaW5zdGFuY2UgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGluc3RhbmNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpjcmVhdGVJbnN0YW5jZSIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxJbnN0YW5jZSxEaXNwYXRjaD4+Ojp0eXBlIGNyZWF0ZUluc3RhbmNlVW5pcXVlKCBjb25zdCBJbnN0YW5jZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbnN0YW5jZSBpbnN0YW5jZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUluc3RhbmNlKCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0luc3RhbmNlKj4oICZpbnN0YW5jZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8Tm9QYXJlbnQsRGlzcGF0Y2g+IGRlbGV0ZXIoIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxJbnN0YW5jZSxEaXNwYXRjaD4oIHJlc3VsdCwgaW5zdGFuY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OmNyZWF0ZUluc3RhbmNlVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBlbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoIGNvbnN0IGNoYXIqIHBMYXllck5hbWUsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVuc2lvblByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKCBwTGF5ZXJOYW1lLCBwUHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVuc2lvblByb3BlcnRpZXMqPiggcFByb3BlcnRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPEV4dGVuc2lvblByb3BlcnRpZXMsQWxsb2NhdG9yPj46OnR5cGUgZW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKCBPcHRpb25hbDxjb25zdCBzdGQ6OnN0cmluZz4gbGF5ZXJOYW1lLCBEaXNwYXRjaCBjb25zdCAmZCApCisgIHsKKyAgICBzdGQ6OnZlY3RvcjxFeHRlbnNpb25Qcm9wZXJ0aWVzLEFsbG9jYXRvcj4gcHJvcGVydGllczsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKCBsYXllck5hbWUgPyBsYXllck5hbWUtPmNfc3RyKCkgOiBudWxscHRyLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcm9wZXJ0eUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyggbGF5ZXJOYW1lID8gbGF5ZXJOYW1lLT5jX3N0cigpIDogbnVsbHB0ciwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6ZW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxFeHRlbnNpb25Qcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyggT3B0aW9uYWw8Y29uc3Qgc3RkOjpzdHJpbmc+IGxheWVyTmFtZSwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkKKyAgeworICAgIHN0ZDo6dmVjdG9yPEV4dGVuc2lvblByb3BlcnRpZXMsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKCBsYXllck5hbWUgPyBsYXllck5hbWUtPmNfc3RyKCkgOiBudWxscHRyLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcm9wZXJ0eUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyggbGF5ZXJOYW1lID8gbGF5ZXJOYW1lLT5jX3N0cigpIDogbnVsbHB0ciwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6ZW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBlbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyggdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TGF5ZXJQcm9wZXJ0aWVzKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpCisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKCBwUHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0xheWVyUHJvcGVydGllcyo+KCBwUHJvcGVydGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8TGF5ZXJQcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIGVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKERpc3BhdGNoIGNvbnN0ICZkICkKKyAgeworICAgIHN0ZDo6dmVjdG9yPExheWVyUHJvcGVydGllcyxBbGxvY2F0b3I+IHByb3BlcnRpZXM7CisgICAgdWludDMyX3QgcHJvcGVydHlDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcm9wZXJ0eUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKCAmcHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0xheWVyUHJvcGVydGllcyo+KCBwcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcHJvcGVydHlDb3VudCA8PSBwcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OmVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxMYXllclByb3BlcnRpZXMsQWxsb2NhdG9yPj46OnR5cGUgZW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkKKyAgeworICAgIHN0ZDo6dmVjdG9yPExheWVyUHJvcGVydGllcyxBbGxvY2F0b3I+IHByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyggJnByb3BlcnR5Q291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcHJvcGVydHlDb3VudCApCisgICAgICB7CisgICAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyggJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtMYXllclByb3BlcnRpZXMqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHByb3BlcnR5Q291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjplbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgZW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uKCB1aW50MzJfdCogcEFwaVZlcnNpb24sIERpc3BhdGNoIGNvbnN0ICZkKQorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24oIHBBcGlWZXJzaW9uICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHVpbnQzMl90Pjo6dHlwZSBlbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24oRGlzcGF0Y2ggY29uc3QgJmQgKQorICB7CisgICAgdWludDMyX3QgYXBpVmVyc2lvbjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiggJmFwaVZlcnNpb24gKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBhcGlWZXJzaW9uLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjplbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24iICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IENvbW1hbmRCdWZmZXI6OmJlZ2luKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogcEJlZ2luSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0JlZ2luQ29tbWFuZEJ1ZmZlciggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyo+KCBwQmVnaW5JbmZvICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgQ29tbWFuZEJ1ZmZlcjo6YmVnaW4oIGNvbnN0IENvbW1hbmRCdWZmZXJCZWdpbkluZm8gJiBiZWdpbkluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQmVnaW5Db21tYW5kQnVmZmVyKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKj4oICZiZWdpbkluZm8gKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkNvbW1hbmRCdWZmZXI6OmJlZ2luIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbiwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCo+KCBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbiApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCggY29uc3QgQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgJiBjb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCo+KCAmY29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbiApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpiZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKj4oIHBMYWJlbEluZm8gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCBjb25zdCBEZWJ1Z1V0aWxzTGFiZWxFWFQgJiBsYWJlbEluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqPiggJmxhYmVsSW5mbyApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJlZ2luUXVlcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJlZ2luUXVlcnkoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcXVlcnksIHN0YXRpY19jYXN0PFZrUXVlcnlDb250cm9sRmxhZ3M+KCBmbGFncyApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJlZ2luUXVlcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCZWdpblF1ZXJ5KCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIHF1ZXJ5LCBzdGF0aWNfY2FzdDxWa1F1ZXJ5Q29udHJvbEZsYWdzPiggZmxhZ3MgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpiZWdpblF1ZXJ5SW5kZXhlZEVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlDb250cm9sRmxhZ3MgZmxhZ3MsIHVpbnQzMl90IGluZGV4LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIHF1ZXJ5LCBzdGF0aWNfY2FzdDxWa1F1ZXJ5Q29udHJvbEZsYWdzPiggZmxhZ3MgKSwgaW5kZXggKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmVnaW5RdWVyeUluZGV4ZWRFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCB1aW50MzJfdCBpbmRleCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcXVlcnksIHN0YXRpY19jYXN0PFZrUXVlcnlDb250cm9sRmxhZ3M+KCBmbGFncyApLCBpbmRleCApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmVnaW5SZW5kZXJQYXNzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NDb250ZW50cyBjb250ZW50cywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCZWdpblJlbmRlclBhc3MoIG1fY29tbWFuZEJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qPiggcFJlbmRlclBhc3NCZWdpbiApLCBzdGF0aWNfY2FzdDxWa1N1YnBhc3NDb250ZW50cz4oIGNvbnRlbnRzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpiZWdpblJlbmRlclBhc3MoIGNvbnN0IFJlbmRlclBhc3NCZWdpbkluZm8gJiByZW5kZXJQYXNzQmVnaW4sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzQ29udGVudHMgY29udGVudHMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJlZ2luUmVuZGVyUGFzcyggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyo+KCAmcmVuZGVyUGFzc0JlZ2luICksIHN0YXRpY19jYXN0PFZrU3VicGFzc0NvbnRlbnRzPiggY29udGVudHMgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmVnaW5SZW5kZXJQYXNzMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NCZWdpbkluZm8qIHBSZW5kZXJQYXNzQmVnaW4sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzQmVnaW5JbmZvS0hSKiBwU3VicGFzc0JlZ2luSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKj4oIHBSZW5kZXJQYXNzQmVnaW4gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqPiggcFN1YnBhc3NCZWdpbkluZm8gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJlZ2luUmVuZGVyUGFzczJLSFIoIGNvbnN0IFJlbmRlclBhc3NCZWdpbkluZm8gJiByZW5kZXJQYXNzQmVnaW4sIGNvbnN0IFN1YnBhc3NCZWdpbkluZm9LSFIgJiBzdWJwYXNzQmVnaW5JbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKj4oICZyZW5kZXJQYXNzQmVnaW4gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqPiggJnN1YnBhc3NCZWdpbkluZm8gKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCggdWludDMyX3QgZmlyc3RDb3VudGVyQnVmZmVyLCB1aW50MzJfdCBjb3VudGVyQnVmZmVyQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUqIHBDb3VudGVyQnVmZmVyT2Zmc2V0cywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKCBtX2NvbW1hbmRCdWZmZXIsIGZpcnN0Q291bnRlckJ1ZmZlciwgY291bnRlckJ1ZmZlckNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyKj4oIHBDb3VudGVyQnVmZmVycyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlU2l6ZSo+KCBwQ291bnRlckJ1ZmZlck9mZnNldHMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyPiBjb3VudGVyQnVmZmVycywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZT4gY291bnRlckJ1ZmZlck9mZnNldHMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworI2lmZGVmIFZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUworICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBjb3VudGVyQnVmZmVycy5zaXplKCkgPT0gY291bnRlckJ1ZmZlck9mZnNldHMuc2l6ZSgpICk7CisjZWxzZQorICAgIGlmICggY291bnRlckJ1ZmZlcnMuc2l6ZSgpICE9IGNvdW50ZXJCdWZmZXJPZmZzZXRzLnNpemUoKSApCisgICAgeworICAgICAgdGhyb3cgTG9naWNFcnJvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HICI6OlZrQ29tbWFuZEJ1ZmZlcjo6YmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVDogY291bnRlckJ1ZmZlcnMuc2l6ZSgpICE9IGNvdW50ZXJCdWZmZXJPZmZzZXRzLnNpemUoKSIgKTsKKyAgICB9CisjZW5kaWYgIC8qVlVMS0FOX0hQUF9OT19FWENFUFRJT05TKi8KKyAgICBkLnZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCggbV9jb21tYW5kQnVmZmVyLCBmaXJzdENvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXIqPiggY291bnRlckJ1ZmZlcnMuZGF0YSgpICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VTaXplKj4oIGNvdW50ZXJCdWZmZXJPZmZzZXRzLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpiaW5kRGVzY3JpcHRvclNldHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3QgZmlyc3RTZXQsIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgdWludDMyX3QgZHluYW1pY09mZnNldENvdW50LCBjb25zdCB1aW50MzJfdCogcER5bmFtaWNPZmZzZXRzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJpbmREZXNjcmlwdG9yU2V0cyggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQmluZFBvaW50PiggcGlwZWxpbmVCaW5kUG9pbnQgKSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUxheW91dD4oIGxheW91dCApLCBmaXJzdFNldCwgZGVzY3JpcHRvclNldENvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldCo+KCBwRGVzY3JpcHRvclNldHMgKSwgZHluYW1pY09mZnNldENvdW50LCBwRHluYW1pY09mZnNldHMgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpiaW5kRGVzY3JpcHRvclNldHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3QgZmlyc3RTZXQsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXQ+IGRlc2NyaXB0b3JTZXRzLCBBcnJheVByb3h5PGNvbnN0IHVpbnQzMl90PiBkeW5hbWljT2Zmc2V0cywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQmluZERlc2NyaXB0b3JTZXRzKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVCaW5kUG9pbnQ+KCBwaXBlbGluZUJpbmRQb2ludCApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lTGF5b3V0PiggbGF5b3V0ICksIGZpcnN0U2V0LCBkZXNjcmlwdG9yU2V0cy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldCo+KCBkZXNjcmlwdG9yU2V0cy5kYXRhKCkgKSwgZHluYW1pY09mZnNldHMuc2l6ZSgpICwgZHluYW1pY09mZnNldHMuZGF0YSgpICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJpbmRJbmRleEJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZSBpbmRleFR5cGUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQmluZEluZGV4QnVmZmVyKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG9mZnNldCApLCBzdGF0aWNfY2FzdDxWa0luZGV4VHlwZT4oIGluZGV4VHlwZSApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJpbmRJbmRleEJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGV4VHlwZSBpbmRleFR5cGUsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJpbmRJbmRleEJ1ZmZlciggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBvZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtJbmRleFR5cGU+KCBpbmRleFR5cGUgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpiaW5kUGlwZWxpbmUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJpbmRQaXBlbGluZSggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQmluZFBvaW50PiggcGlwZWxpbmVCaW5kUG9pbnQgKSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZT4oIHBpcGVsaW5lICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmluZFBpcGVsaW5lKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSBwaXBlbGluZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQmluZFBpcGVsaW5lKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVCaW5kUG9pbnQ+KCBwaXBlbGluZUJpbmRQb2ludCApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lPiggcGlwZWxpbmUgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpiaW5kU2hhZGluZ1JhdGVJbWFnZU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3IGltYWdlVmlldywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtJbWFnZVZpZXc+KCBpbWFnZVZpZXcgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIGltYWdlTGF5b3V0ICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmluZFNoYWRpbmdSYXRlSW1hZ2VOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlldyBpbWFnZVZpZXcsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbWFnZUxheW91dCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0ltYWdlVmlldz4oIGltYWdlVmlldyApLCBzdGF0aWNfY2FzdDxWa0ltYWdlTGF5b3V0PiggaW1hZ2VMYXlvdXQgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCggdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIqIHBCdWZmZXJzLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSogcE9mZnNldHMsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplKiBwU2l6ZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCggbV9jb21tYW5kQnVmZmVyLCBmaXJzdEJpbmRpbmcsIGJpbmRpbmdDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlcio+KCBwQnVmZmVycyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlU2l6ZSo+KCBwT2Zmc2V0cyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlU2l6ZSo+KCBwU2l6ZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoIHVpbnQzMl90IGZpcnN0QmluZGluZywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyPiBidWZmZXJzLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplPiBvZmZzZXRzLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplPiBzaXplcywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgVlVMS0FOX0hQUF9BU1NFUlQoIGJ1ZmZlcnMuc2l6ZSgpID09IG9mZnNldHMuc2l6ZSgpICk7CisjZWxzZQorICAgIGlmICggYnVmZmVycy5zaXplKCkgIT0gb2Zmc2V0cy5zaXplKCkgKQorICAgIHsKKyAgICAgIHRocm93IExvZ2ljRXJyb3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpWa0NvbW1hbmRCdWZmZXI6OmJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQ6IGJ1ZmZlcnMuc2l6ZSgpICE9IG9mZnNldHMuc2l6ZSgpIiApOworICAgIH0KKyNlbmRpZiAgLypWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMqLworI2lmZGVmIFZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUworICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBidWZmZXJzLnNpemUoKSA9PSBzaXplcy5zaXplKCkgKTsKKyNlbHNlCisgICAgaWYgKCBidWZmZXJzLnNpemUoKSAhPSBzaXplcy5zaXplKCkgKQorICAgIHsKKyAgICAgIHRocm93IExvZ2ljRXJyb3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpWa0NvbW1hbmRCdWZmZXI6OmJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQ6IGJ1ZmZlcnMuc2l6ZSgpICE9IHNpemVzLnNpemUoKSIgKTsKKyAgICB9CisjZW5kaWYgIC8qVlVMS0FOX0hQUF9OT19FWENFUFRJT05TKi8KKyNpZmRlZiBWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMKKyAgICBWVUxLQU5fSFBQX0FTU0VSVCggb2Zmc2V0cy5zaXplKCkgPT0gc2l6ZXMuc2l6ZSgpICk7CisjZWxzZQorICAgIGlmICggb2Zmc2V0cy5zaXplKCkgIT0gc2l6ZXMuc2l6ZSgpICkKKyAgICB7CisgICAgICB0aHJvdyBMb2dpY0Vycm9yKCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkcgIjo6VmtDb21tYW5kQnVmZmVyOjpiaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUOiBvZmZzZXRzLnNpemUoKSAhPSBzaXplcy5zaXplKCkiICk7CisgICAgfQorI2VuZGlmICAvKlZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUyovCisgICAgZC52a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoIG1fY29tbWFuZEJ1ZmZlciwgZmlyc3RCaW5kaW5nLCBidWZmZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXIqPiggYnVmZmVycy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZVNpemUqPiggb2Zmc2V0cy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZVNpemUqPiggc2l6ZXMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmJpbmRWZXJ0ZXhCdWZmZXJzKCB1aW50MzJfdCBmaXJzdEJpbmRpbmcsIHVpbnQzMl90IGJpbmRpbmdDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciogcEJ1ZmZlcnMsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplKiBwT2Zmc2V0cywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCaW5kVmVydGV4QnVmZmVycyggbV9jb21tYW5kQnVmZmVyLCBmaXJzdEJpbmRpbmcsIGJpbmRpbmdDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlcio+KCBwQnVmZmVycyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlU2l6ZSo+KCBwT2Zmc2V0cyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YmluZFZlcnRleEJ1ZmZlcnMoIHVpbnQzMl90IGZpcnN0QmluZGluZywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyPiBidWZmZXJzLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplPiBvZmZzZXRzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyNpZmRlZiBWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMKKyAgICBWVUxLQU5fSFBQX0FTU0VSVCggYnVmZmVycy5zaXplKCkgPT0gb2Zmc2V0cy5zaXplKCkgKTsKKyNlbHNlCisgICAgaWYgKCBidWZmZXJzLnNpemUoKSAhPSBvZmZzZXRzLnNpemUoKSApCisgICAgeworICAgICAgdGhyb3cgTG9naWNFcnJvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HICI6OlZrQ29tbWFuZEJ1ZmZlcjo6YmluZFZlcnRleEJ1ZmZlcnM6IGJ1ZmZlcnMuc2l6ZSgpICE9IG9mZnNldHMuc2l6ZSgpIiApOworICAgIH0KKyNlbmRpZiAgLypWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMqLworICAgIGQudmtDbWRCaW5kVmVydGV4QnVmZmVycyggbV9jb21tYW5kQnVmZmVyLCBmaXJzdEJpbmRpbmcsIGJ1ZmZlcnMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlcio+KCBidWZmZXJzLmRhdGEoKSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlU2l6ZSo+KCBvZmZzZXRzLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpibGl0SW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBzcmNJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgZHN0SW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUJsaXQqIHBSZWdpb25zLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyIGZpbHRlciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCbGl0SW1hZ2UoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIHNyY0ltYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VMYXlvdXQ+KCBzcmNJbWFnZUxheW91dCApLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggZHN0SW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIGRzdEltYWdlTGF5b3V0ICksIHJlZ2lvbkNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VCbGl0Kj4oIHBSZWdpb25zICksIHN0YXRpY19jYXN0PFZrRmlsdGVyPiggZmlsdGVyICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpibGl0SW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBzcmNJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgZHN0SW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VCbGl0PiByZWdpb25zLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmlsdGVyIGZpbHRlciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQmxpdEltYWdlKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBzcmNJbWFnZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlTGF5b3V0Piggc3JjSW1hZ2VMYXlvdXQgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGRzdEltYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VMYXlvdXQ+KCBkc3RJbWFnZUxheW91dCApLCByZWdpb25zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZUJsaXQqPiggcmVnaW9ucy5kYXRhKCkgKSwgc3RhdGljX2Nhc3Q8VmtGaWx0ZXI+KCBmaWx0ZXIgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6YnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogcEluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgaW5zdGFuY2VEYXRhLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBpbnN0YW5jZU9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiB1cGRhdGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgc2NyYXRjaCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2NyYXRjaE9mZnNldCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqPiggcEluZm8gKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBpbnN0YW5jZURhdGEgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggaW5zdGFuY2VPZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtCb29sMzI+KCB1cGRhdGUgKSwgc3RhdGljX2Nhc3Q8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4oIGRzdCApLCBzdGF0aWNfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiggc3JjICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggc2NyYXRjaCApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBzY3JhdGNoT2Zmc2V0ICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpidWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBjb25zdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgJiBpbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGluc3RhbmNlRGF0YSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgaW5zdGFuY2VPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgdXBkYXRlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHNjcmF0Y2gsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNjcmF0Y2hPZmZzZXQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIG1fY29tbWFuZEJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVio+KCAmaW5mbyApLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGluc3RhbmNlRGF0YSApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBpbnN0YW5jZU9mZnNldCApLCBzdGF0aWNfY2FzdDxWa0Jvb2wzMj4oIHVwZGF0ZSApLCBzdGF0aWNfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiggZHN0ICksIHN0YXRpY19jYXN0PFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+KCBzcmMgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBzY3JhdGNoICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIHNjcmF0Y2hPZmZzZXQgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6Y2xlYXJBdHRhY2htZW50cyggdWludDMyX3QgYXR0YWNobWVudENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2xlYXJBdHRhY2htZW50KiBwQXR0YWNobWVudHMsIHVpbnQzMl90IHJlY3RDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyUmVjdCogcFJlY3RzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENsZWFyQXR0YWNobWVudHMoIG1fY29tbWFuZEJ1ZmZlciwgYXR0YWNobWVudENvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50Kj4oIHBBdHRhY2htZW50cyApLCByZWN0Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDbGVhclJlY3QqPiggcFJlY3RzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjbGVhckF0dGFjaG1lbnRzKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbGVhckF0dGFjaG1lbnQ+IGF0dGFjaG1lbnRzLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbGVhclJlY3Q+IHJlY3RzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRDbGVhckF0dGFjaG1lbnRzKCBtX2NvbW1hbmRCdWZmZXIsIGF0dGFjaG1lbnRzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDbGVhckF0dGFjaG1lbnQqPiggYXR0YWNobWVudHMuZGF0YSgpICksIHJlY3RzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDbGVhclJlY3QqPiggcmVjdHMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmNsZWFyQ29sb3JJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDbGVhckNvbG9yVmFsdWUqIHBDb2xvciwgdWludDMyX3QgcmFuZ2VDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2VSYW5nZSogcFJhbmdlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRDbGVhckNvbG9ySW1hZ2UoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGltYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VMYXlvdXQ+KCBpbWFnZUxheW91dCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKj4oIHBDb2xvciApLCByYW5nZUNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKj4oIHBSYW5nZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmNsZWFyQ29sb3JJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IENsZWFyQ29sb3JWYWx1ZSAmIGNvbG9yLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2U+IHJhbmdlcywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQ2xlYXJDb2xvckltYWdlKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBpbWFnZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlTGF5b3V0PiggaW1hZ2VMYXlvdXQgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSo+KCAmY29sb3IgKSwgcmFuZ2VzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqPiggcmFuZ2VzLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjbGVhckRlcHRoU3RlbmNpbEltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbWFnZUxheW91dCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVN1YnJlc291cmNlUmFuZ2UqIHBSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggaW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIGltYWdlTGF5b3V0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKj4oIHBEZXB0aFN0ZW5jaWwgKSwgcmFuZ2VDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSo+KCBwUmFuZ2VzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjbGVhckRlcHRoU3RlbmNpbEltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBpbWFnZUxheW91dCwgY29uc3QgQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSAmIGRlcHRoU3RlbmNpbCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTdWJyZXNvdXJjZVJhbmdlPiByYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGltYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VMYXlvdXQ+KCBpbWFnZUxheW91dCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSo+KCAmZGVwdGhTdGVuY2lsICksIHJhbmdlcy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKj4oIHJhbmdlcy5kYXRhKCkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIG1vZGUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+KCBkc3QgKSwgc3RhdGljX2Nhc3Q8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4oIHNyYyApLCBzdGF0aWNfY2FzdDxWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlY+KCBtb2RlICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6Y29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViBtb2RlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4oIGRzdCApLCBzdGF0aWNfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiggc3JjICksIHN0YXRpY19jYXN0PFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOVj4oIG1vZGUgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6Y29weUJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBzcmNCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNvcHkqIHBSZWdpb25zLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENvcHlCdWZmZXIoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBzcmNCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBkc3RCdWZmZXIgKSwgcmVnaW9uQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJDb3B5Kj4oIHBSZWdpb25zICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjb3B5QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIHNyY0J1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBkc3RCdWZmZXIsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckNvcHk+IHJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENvcHlCdWZmZXIoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBzcmNCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBkc3RCdWZmZXIgKSwgcmVnaW9ucy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyQ29weSo+KCByZWdpb25zLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjb3B5QnVmZmVyVG9JbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBzcmNCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBkc3RJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckltYWdlQ29weSogcFJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBzcmNCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGRzdEltYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VMYXlvdXQ+KCBkc3RJbWFnZUxheW91dCApLCByZWdpb25Db3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlckltYWdlQ29weSo+KCBwUmVnaW9ucyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6Y29weUJ1ZmZlclRvSW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgc3JjQnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgZHN0SW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVySW1hZ2VDb3B5PiByZWdpb25zLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRDb3B5QnVmZmVyVG9JbWFnZSggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIHNyY0J1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggZHN0SW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIGRzdEltYWdlTGF5b3V0ICksIHJlZ2lvbnMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlckltYWdlQ29weSo+KCByZWdpb25zLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjb3B5SW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBzcmNJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgZHN0SW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNvcHkqIHBSZWdpb25zLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENvcHlJbWFnZSggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggc3JjSW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIHNyY0ltYWdlTGF5b3V0ICksIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBkc3RJbWFnZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlTGF5b3V0PiggZHN0SW1hZ2VMYXlvdXQgKSwgcmVnaW9uQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZUNvcHkqPiggcFJlZ2lvbnMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmNvcHlJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIHNyY0ltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBkc3RJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNvcHk+IHJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENvcHlJbWFnZSggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggc3JjSW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIHNyY0ltYWdlTGF5b3V0ICksIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBkc3RJbWFnZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlTGF5b3V0PiggZHN0SW1hZ2VMYXlvdXQgKSwgcmVnaW9ucy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VDb3B5Kj4oIHJlZ2lvbnMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmNvcHlJbWFnZVRvQnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2Ugc3JjSW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggc3JjSW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIHNyY0ltYWdlTGF5b3V0ICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggZHN0QnVmZmVyICksIHJlZ2lvbkNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5Kj4oIHBSZWdpb25zICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjb3B5SW1hZ2VUb0J1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIHNyY0ltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJJbWFnZUNvcHk+IHJlZ2lvbnMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENvcHlJbWFnZVRvQnVmZmVyKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBzcmNJbWFnZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlTGF5b3V0Piggc3JjSW1hZ2VMYXlvdXQgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBkc3RCdWZmZXIgKSwgcmVnaW9ucy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5Kj4oIHJlZ2lvbnMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6Y29weVF1ZXJ5UG9vbFJlc3VsdHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGRzdEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgZHN0T2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBzdHJpZGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVJlc3VsdEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggZHN0QnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGRzdE9mZnNldCApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBzdHJpZGUgKSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVJlc3VsdEZsYWdzPiggZmxhZ3MgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpjb3B5UXVlcnlQb29sUmVzdWx0cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHN0cmlkZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggZHN0QnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGRzdE9mZnNldCApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBzdHJpZGUgKSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVJlc3VsdEZsYWdzPiggZmxhZ3MgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZGVidWdNYXJrZXJCZWdpbkVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKj4oIHBNYXJrZXJJbmZvICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkZWJ1Z01hcmtlckJlZ2luRVhUKCBjb25zdCBEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgJiBtYXJrZXJJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqPiggJm1hcmtlckluZm8gKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkZWJ1Z01hcmtlckVuZEVYVChEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERlYnVnTWFya2VyRW5kRVhUKCBtX2NvbW1hbmRCdWZmZXIgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZGVidWdNYXJrZXJFbmRFWFQoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRGVidWdNYXJrZXJFbmRFWFQoIG1fY29tbWFuZEJ1ZmZlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZGVidWdNYXJrZXJJbnNlcnRFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqIHBNYXJrZXJJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqPiggcE1hcmtlckluZm8gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmRlYnVnTWFya2VySW5zZXJ0RVhUKCBjb25zdCBEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgJiBtYXJrZXJJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKj4oICZtYXJrZXJJbmZvICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZGlzcGF0Y2goIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFosIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRGlzcGF0Y2goIG1fY29tbWFuZEJ1ZmZlciwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50WiApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkaXNwYXRjaCggdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLCB1aW50MzJfdCBncm91cENvdW50WiwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRGlzcGF0Y2goIG1fY29tbWFuZEJ1ZmZlciwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50WiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkaXNwYXRjaEJhc2UoIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFosIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRGlzcGF0Y2hCYXNlKCBtX2NvbW1hbmRCdWZmZXIsIGJhc2VHcm91cFgsIGJhc2VHcm91cFksIGJhc2VHcm91cFosIGdyb3VwQ291bnRYLCBncm91cENvdW50WSwgZ3JvdXBDb3VudFogKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZGlzcGF0Y2hCYXNlKCB1aW50MzJfdCBiYXNlR3JvdXBYLCB1aW50MzJfdCBiYXNlR3JvdXBZLCB1aW50MzJfdCBiYXNlR3JvdXBaLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREaXNwYXRjaEJhc2UoIG1fY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50WiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkaXNwYXRjaEJhc2VLSFIoIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFosIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRGlzcGF0Y2hCYXNlS0hSKCBtX2NvbW1hbmRCdWZmZXIsIGJhc2VHcm91cFgsIGJhc2VHcm91cFksIGJhc2VHcm91cFosIGdyb3VwQ291bnRYLCBncm91cENvdW50WSwgZ3JvdXBDb3VudFogKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZGlzcGF0Y2hCYXNlS0hSKCB1aW50MzJfdCBiYXNlR3JvdXBYLCB1aW50MzJfdCBiYXNlR3JvdXBZLCB1aW50MzJfdCBiYXNlR3JvdXBaLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREaXNwYXRjaEJhc2VLSFIoIG1fY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50WiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkaXNwYXRjaEluZGlyZWN0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERpc3BhdGNoSW5kaXJlY3QoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBidWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggb2Zmc2V0ICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZGlzcGF0Y2hJbmRpcmVjdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRGlzcGF0Y2hJbmRpcmVjdCggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBvZmZzZXQgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkcmF3KCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RWZXJ0ZXgsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRHJhdyggbV9jb21tYW5kQnVmZmVyLCB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RWZXJ0ZXgsIGZpcnN0SW5zdGFuY2UgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhdyggdWludDMyX3QgdmVydGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREcmF3KCBtX2NvbW1hbmRCdWZmZXIsIHZlcnRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleCwgZmlyc3RJbnN0YW5jZSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkcmF3SW5kZXhlZCggdWludDMyX3QgaW5kZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRHJhd0luZGV4ZWQoIG1fY29tbWFuZEJ1ZmZlciwgaW5kZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RJbmRleCwgdmVydGV4T2Zmc2V0LCBmaXJzdEluc3RhbmNlICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmRyYXdJbmRleGVkKCB1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRHJhd0luZGV4ZWQoIG1fY29tbWFuZEJ1ZmZlciwgaW5kZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RJbmRleCwgdmVydGV4T2Zmc2V0LCBmaXJzdEluc3RhbmNlICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmRyYXdJbmRleGVkSW5kaXJlY3QoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERyYXdJbmRleGVkSW5kaXJlY3QoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBidWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggb2Zmc2V0ICksIGRyYXdDb3VudCwgc3RyaWRlICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmRyYXdJbmRleGVkSW5kaXJlY3QoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG9mZnNldCApLCBkcmF3Q291bnQsIHN0cmlkZSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgY291bnRCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBidWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggb2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggY291bnRCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggY291bnRCdWZmZXJPZmZzZXQgKSwgbWF4RHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGNvdW50QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBvZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBjb3VudEJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBjb3VudEJ1ZmZlck9mZnNldCApLCBtYXhEcmF3Q291bnQsIHN0cmlkZSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgY291bnRCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBidWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggb2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggY291bnRCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggY291bnRCdWZmZXJPZmZzZXQgKSwgbWF4RHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGNvdW50QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBvZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBjb3VudEJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBjb3VudEJ1ZmZlck9mZnNldCApLCBtYXhEcmF3Q291bnQsIHN0cmlkZSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkcmF3SW5kaXJlY3QoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERyYXdJbmRpcmVjdCggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBvZmZzZXQgKSwgZHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd0luZGlyZWN0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRHJhd0luZGlyZWN0KCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG9mZnNldCApLCBkcmF3Q291bnQsIHN0cmlkZSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgY291bnRlckJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY291bnRlckJ1ZmZlck9mZnNldCwgdWludDMyX3QgY291bnRlck9mZnNldCwgdWludDMyX3QgdmVydGV4U3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCggbV9jb21tYW5kQnVmZmVyLCBpbnN0YW5jZUNvdW50LCBmaXJzdEluc3RhbmNlLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGNvdW50ZXJCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggY291bnRlckJ1ZmZlck9mZnNldCApLCBjb3VudGVyT2Zmc2V0LCB2ZXJ0ZXhTdHJpZGUgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGNvdW50ZXJCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNvdW50ZXJCdWZmZXJPZmZzZXQsIHVpbnQzMl90IGNvdW50ZXJPZmZzZXQsIHVpbnQzMl90IHZlcnRleFN0cmlkZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKCBtX2NvbW1hbmRCdWZmZXIsIGluc3RhbmNlQ291bnQsIGZpcnN0SW5zdGFuY2UsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggY291bnRlckJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBjb3VudGVyQnVmZmVyT2Zmc2V0ICksIGNvdW50ZXJPZmZzZXQsIHZlcnRleFN0cmlkZSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpkcmF3SW5kaXJlY3RDb3VudEFNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBjb3VudEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERyYXdJbmRpcmVjdENvdW50QU1EKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG9mZnNldCApLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGNvdW50QnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGNvdW50QnVmZmVyT2Zmc2V0ICksIG1heERyYXdDb3VudCwgc3RyaWRlICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmRyYXdJbmRpcmVjdENvdW50QU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGNvdW50QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERyYXdJbmRpcmVjdENvdW50QU1EKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG9mZnNldCApLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGNvdW50QnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGNvdW50QnVmZmVyT2Zmc2V0ICksIG1heERyYXdDb3VudCwgc3RyaWRlICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmRyYXdJbmRpcmVjdENvdW50S0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGNvdW50QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBidWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggb2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggY291bnRCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggY291bnRCdWZmZXJPZmZzZXQgKSwgbWF4RHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd0luZGlyZWN0Q291bnRLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgY291bnRCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBidWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggb2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggY291bnRCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggY291bnRCdWZmZXJPZmZzZXQgKSwgbWF4RHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBjb3VudEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBidWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggb2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggY291bnRCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggY291bnRCdWZmZXJPZmZzZXQgKSwgbWF4RHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBjb3VudEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG9mZnNldCApLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGNvdW50QnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGNvdW50QnVmZmVyT2Zmc2V0ICksIG1heERyYXdDb3VudCwgc3RyaWRlICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmRyYXdNZXNoVGFza3NJbmRpcmVjdE5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBvZmZzZXQgKSwgZHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd01lc2hUYXNrc0luZGlyZWN0TlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBvZmZzZXQgKSwgZHJhd0NvdW50LCBzdHJpZGUgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd01lc2hUYXNrc05WKCB1aW50MzJfdCB0YXNrQ291bnQsIHVpbnQzMl90IGZpcnN0VGFzaywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWREcmF3TWVzaFRhc2tzTlYoIG1fY29tbWFuZEJ1ZmZlciwgdGFza0NvdW50LCBmaXJzdFRhc2sgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZHJhd01lc2hUYXNrc05WKCB1aW50MzJfdCB0YXNrQ291bnQsIHVpbnQzMl90IGZpcnN0VGFzaywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRHJhd01lc2hUYXNrc05WKCBtX2NvbW1hbmRCdWZmZXIsIHRhc2tDb3VudCwgZmlyc3RUYXNrICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoIG1fY29tbWFuZEJ1ZmZlciApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjplbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVChEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCggbV9jb21tYW5kQnVmZmVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmVuZERlYnVnVXRpbHNMYWJlbEVYVChEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCggbV9jb21tYW5kQnVmZmVyICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmVuZERlYnVnVXRpbHNMYWJlbEVYVChEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoIG1fY29tbWFuZEJ1ZmZlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjplbmRRdWVyeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEVuZFF1ZXJ5KCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIHF1ZXJ5ICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmVuZFF1ZXJ5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEVuZFF1ZXJ5KCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIHF1ZXJ5ICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmVuZFF1ZXJ5SW5kZXhlZEVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCB1aW50MzJfdCBpbmRleCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcXVlcnksIGluZGV4ICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmVuZFF1ZXJ5SW5kZXhlZEVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCB1aW50MzJfdCBpbmRleCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIHF1ZXJ5LCBpbmRleCApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjplbmRSZW5kZXJQYXNzKERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRW5kUmVuZGVyUGFzcyggbV9jb21tYW5kQnVmZmVyICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmVuZFJlbmRlclBhc3MoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRW5kUmVuZGVyUGFzcyggbV9jb21tYW5kQnVmZmVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjplbmRSZW5kZXJQYXNzMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NFbmRJbmZvS0hSKiBwU3VicGFzc0VuZEluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRW5kUmVuZGVyUGFzczJLSFIoIG1fY29tbWFuZEJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKj4oIHBTdWJwYXNzRW5kSW5mbyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZW5kUmVuZGVyUGFzczJLSFIoIGNvbnN0IFN1YnBhc3NFbmRJbmZvS0hSICYgc3VicGFzc0VuZEluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEVuZFJlbmRlclBhc3MyS0hSKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUio+KCAmc3VicGFzc0VuZEluZm8gKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgdWludDMyX3QgY291bnRlckJ1ZmZlckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyKiBwQ291bnRlckJ1ZmZlcnMsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoIG1fY29tbWFuZEJ1ZmZlciwgZmlyc3RDb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXIqPiggcENvdW50ZXJCdWZmZXJzICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VTaXplKj4oIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyPiBjb3VudGVyQnVmZmVycywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZT4gY291bnRlckJ1ZmZlck9mZnNldHMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworI2lmZGVmIFZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUworICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBjb3VudGVyQnVmZmVycy5zaXplKCkgPT0gY291bnRlckJ1ZmZlck9mZnNldHMuc2l6ZSgpICk7CisjZWxzZQorICAgIGlmICggY291bnRlckJ1ZmZlcnMuc2l6ZSgpICE9IGNvdW50ZXJCdWZmZXJPZmZzZXRzLnNpemUoKSApCisgICAgeworICAgICAgdGhyb3cgTG9naWNFcnJvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HICI6OlZrQ29tbWFuZEJ1ZmZlcjo6ZW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQ6IGNvdW50ZXJCdWZmZXJzLnNpemUoKSAhPSBjb3VudGVyQnVmZmVyT2Zmc2V0cy5zaXplKCkiICk7CisgICAgfQorI2VuZGlmICAvKlZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUyovCisgICAgZC52a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKCBtX2NvbW1hbmRCdWZmZXIsIGZpcnN0Q291bnRlckJ1ZmZlciwgY291bnRlckJ1ZmZlcnMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlcio+KCBjb3VudGVyQnVmZmVycy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZVNpemUqPiggY291bnRlckJ1ZmZlck9mZnNldHMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmV4ZWN1dGVDb21tYW5kcyggdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEV4ZWN1dGVDb21tYW5kcyggbV9jb21tYW5kQnVmZmVyLCBjb21tYW5kQnVmZmVyQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVyKj4oIHBDb21tYW5kQnVmZmVycyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6ZXhlY3V0ZUNvbW1hbmRzKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyPiBjb21tYW5kQnVmZmVycywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRXhlY3V0ZUNvbW1hbmRzKCBtX2NvbW1hbmRCdWZmZXIsIGNvbW1hbmRCdWZmZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVyKj4oIGNvbW1hbmRCdWZmZXJzLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmZpbGxCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemUsIHVpbnQzMl90IGRhdGEsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kRmlsbEJ1ZmZlciggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGRzdEJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBkc3RPZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggc2l6ZSApLCBkYXRhICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OmZpbGxCdWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemUsIHVpbnQzMl90IGRhdGEsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEZpbGxCdWZmZXIoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBkc3RCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggZHN0T2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIHNpemUgKSwgZGF0YSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6aW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKj4oIHBMYWJlbEluZm8gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6Omluc2VydERlYnVnVXRpbHNMYWJlbEVYVCggY29uc3QgRGVidWdVdGlsc0xhYmVsRVhUICYgbGFiZWxJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoIG1fY29tbWFuZEJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCo+KCAmbGFiZWxJbmZvICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6bmV4dFN1YnBhc3MoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdWJwYXNzQ29udGVudHMgY29udGVudHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kTmV4dFN1YnBhc3MoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtTdWJwYXNzQ29udGVudHM+KCBjb250ZW50cyApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6Om5leHRTdWJwYXNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWROZXh0U3VicGFzcyggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1N1YnBhc3NDb250ZW50cz4oIGNvbnRlbnRzICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6Om5leHRTdWJwYXNzMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnBhc3NCZWdpbkluZm9LSFIqIHBTdWJwYXNzQmVnaW5JbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VicGFzc0VuZEluZm9LSFIqIHBTdWJwYXNzRW5kSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWROZXh0U3VicGFzczJLSFIoIG1fY29tbWFuZEJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqPiggcFN1YnBhc3NCZWdpbkluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKj4oIHBTdWJwYXNzRW5kSW5mbyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6bmV4dFN1YnBhc3MyS0hSKCBjb25zdCBTdWJwYXNzQmVnaW5JbmZvS0hSICYgc3VicGFzc0JlZ2luSW5mbywgY29uc3QgU3VicGFzc0VuZEluZm9LSFIgJiBzdWJwYXNzRW5kSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kTmV4dFN1YnBhc3MyS0hSKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKj4oICZzdWJwYXNzQmVnaW5JbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUio+KCAmc3VicGFzc0VuZEluZm8gKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6cGlwZWxpbmVCYXJyaWVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzLCB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbW9yeUJhcnJpZXJzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFBpcGVsaW5lQmFycmllciggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFncz4oIHNyY1N0YWdlTWFzayApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFncz4oIGRzdFN0YWdlTWFzayApLCBzdGF0aWNfY2FzdDxWa0RlcGVuZGVuY3lGbGFncz4oIGRlcGVuZGVuY3lGbGFncyApLCBtZW1vcnlCYXJyaWVyQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlCYXJyaWVyKj4oIHBNZW1vcnlCYXJyaWVycyApLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKj4oIHBCdWZmZXJNZW1vcnlCYXJyaWVycyApLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllcio+KCBwSW1hZ2VNZW1vcnlCYXJyaWVycyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6cGlwZWxpbmVCYXJyaWVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlCYXJyaWVyPiBtZW1vcnlCYXJyaWVycywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyTWVtb3J5QmFycmllcj4gYnVmZmVyTWVtb3J5QmFycmllcnMsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5QmFycmllcj4gaW1hZ2VNZW1vcnlCYXJyaWVycywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kUGlwZWxpbmVCYXJyaWVyKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVTdGFnZUZsYWdzPiggc3JjU3RhZ2VNYXNrICksIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVTdGFnZUZsYWdzPiggZHN0U3RhZ2VNYXNrICksIHN0YXRpY19jYXN0PFZrRGVwZW5kZW5jeUZsYWdzPiggZGVwZW5kZW5jeUZsYWdzICksIG1lbW9yeUJhcnJpZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlCYXJyaWVyKj4oIG1lbW9yeUJhcnJpZXJzLmRhdGEoKSApLCBidWZmZXJNZW1vcnlCYXJyaWVycy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllcio+KCBidWZmZXJNZW1vcnlCYXJyaWVycy5kYXRhKCkgKSwgaW1hZ2VNZW1vcnlCYXJyaWVycy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKj4oIGltYWdlTWVtb3J5QmFycmllcnMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnByb2Nlc3NDb21tYW5kc05WWCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqIHBQcm9jZXNzQ29tbWFuZHNJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFByb2Nlc3NDb21tYW5kc05WWCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCo+KCBwUHJvY2Vzc0NvbW1hbmRzSW5mbyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6cHJvY2Vzc0NvbW1hbmRzTlZYKCBjb25zdCBDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICYgcHJvY2Vzc0NvbW1hbmRzSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKj4oICZwcm9jZXNzQ29tbWFuZHNJbmZvICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnB1c2hDb25zdGFudHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBsYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJTdGFnZUZsYWdzIHN0YWdlRmxhZ3MsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSwgY29uc3Qgdm9pZCogcFZhbHVlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRQdXNoQ29uc3RhbnRzKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVMYXlvdXQ+KCBsYXlvdXQgKSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJTdGFnZUZsYWdzPiggc3RhZ2VGbGFncyApLCBvZmZzZXQsIHNpemUsIHBWYWx1ZXMgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpwdXNoQ29uc3RhbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgbGF5b3V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzLCB1aW50MzJfdCBvZmZzZXQsIEFycmF5UHJveHk8Y29uc3QgVD4gdmFsdWVzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRQdXNoQ29uc3RhbnRzKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVMYXlvdXQ+KCBsYXlvdXQgKSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJTdGFnZUZsYWdzPiggc3RhZ2VGbGFncyApLCBvZmZzZXQsIHZhbHVlcy5zaXplKCkgKiBzaXplb2YoIFQgKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCB2YWx1ZXMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnB1c2hEZXNjcmlwdG9yU2V0S0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXcml0ZURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yV3JpdGVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVCaW5kUG9pbnQ+KCBwaXBlbGluZUJpbmRQb2ludCApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lTGF5b3V0PiggbGF5b3V0ICksIHNldCwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqPiggcERlc2NyaXB0b3JXcml0ZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnB1c2hEZXNjcmlwdG9yU2V0S0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V3JpdGVEZXNjcmlwdG9yU2V0PiBkZXNjcmlwdG9yV3JpdGVzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQmluZFBvaW50PiggcGlwZWxpbmVCaW5kUG9pbnQgKSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUxheW91dD4oIGxheW91dCApLCBzZXQsIGRlc2NyaXB0b3JXcml0ZXMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCo+KCBkZXNjcmlwdG9yV3JpdGVzLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCBjb25zdCB2b2lkKiBwRGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZT4oIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lTGF5b3V0PiggbGF5b3V0ICksIHNldCwgcERhdGEgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6cHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIGNvbnN0IHZvaWQqIHBEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZT4oIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lTGF5b3V0PiggbGF5b3V0ICksIHNldCwgcERhdGEgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiBwUmVzZXJ2ZVNwYWNlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKj4oIHBSZXNlcnZlU3BhY2VJbmZvICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpyZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCggY29uc3QgQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYICYgcmVzZXJ2ZVNwYWNlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoIG1fY29tbWFuZEJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCo+KCAmcmVzZXJ2ZVNwYWNlSW5mbyApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnJlc2V0RXZlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kUmVzZXRFdmVudCggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0V2ZW50PiggZXZlbnQgKSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZVN0YWdlRmxhZ3M+KCBzdGFnZU1hc2sgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpyZXNldEV2ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRSZXNldEV2ZW50KCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrRXZlbnQ+KCBldmVudCApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFncz4oIHN0YWdlTWFzayApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnJlc2V0UXVlcnlQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRSZXNldFF1ZXJ5UG9vbCggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1F1ZXJ5UG9vbD4oIHF1ZXJ5UG9vbCApLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50ICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnJlc2V0UXVlcnlQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kUmVzZXRRdWVyeVBvb2woIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6cmVzb2x2ZUltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2Ugc3JjSW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGRzdEltYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VSZXNvbHZlKiBwUmVnaW9ucywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRSZXNvbHZlSW1hZ2UoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIHNyY0ltYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VMYXlvdXQ+KCBzcmNJbWFnZUxheW91dCApLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggZHN0SW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIGRzdEltYWdlTGF5b3V0ICksIHJlZ2lvbkNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VSZXNvbHZlKj4oIHBSZWdpb25zICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpyZXNvbHZlSW1hZ2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBzcmNJbWFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgZHN0SW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VSZXNvbHZlPiByZWdpb25zLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRSZXNvbHZlSW1hZ2UoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIHNyY0ltYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VMYXlvdXQ+KCBzcmNJbWFnZUxheW91dCApLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggZHN0SW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUxheW91dD4oIGRzdEltYWdlTGF5b3V0ICksIHJlZ2lvbnMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlUmVzb2x2ZSo+KCByZWdpb25zLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldEJsZW5kQ29uc3RhbnRzKCBjb25zdCBmbG9hdCBibGVuZENvbnN0YW50c1s0XSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXRCbGVuZENvbnN0YW50cyggbV9jb21tYW5kQnVmZmVyLCBibGVuZENvbnN0YW50cyApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXRCbGVuZENvbnN0YW50cyggY29uc3QgZmxvYXQgYmxlbmRDb25zdGFudHNbNF0sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldEJsZW5kQ29uc3RhbnRzKCBtX2NvbW1hbmRCdWZmZXIsIGJsZW5kQ29uc3RhbnRzICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldENoZWNrcG9pbnROViggY29uc3Qgdm9pZCogcENoZWNrcG9pbnRNYXJrZXIsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0Q2hlY2twb2ludE5WKCBtX2NvbW1hbmRCdWZmZXIsIHBDaGVja3BvaW50TWFya2VyICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldENoZWNrcG9pbnROViggY29uc3Qgdm9pZCogcENoZWNrcG9pbnRNYXJrZXIsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldENoZWNrcG9pbnROViggbV9jb21tYW5kQnVmZmVyLCBwQ2hlY2twb2ludE1hcmtlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0Q29hcnNlU2FtcGxlT3JkZXJOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZSwgdWludDMyX3QgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqIHBDdXN0b21TYW1wbGVPcmRlcnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WPiggc2FtcGxlT3JkZXJUeXBlICksIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKj4oIHBDdXN0b21TYW1wbGVPcmRlcnMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldENvYXJzZVNhbXBsZU9yZGVyTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViBzYW1wbGVPcmRlclR5cGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlY+IGN1c3RvbVNhbXBsZU9yZGVycywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WPiggc2FtcGxlT3JkZXJUeXBlICksIGN1c3RvbVNhbXBsZU9yZGVycy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVio+KCBjdXN0b21TYW1wbGVPcmRlcnMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0RGVwdGhCaWFzKCBmbG9hdCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZmxvYXQgZGVwdGhCaWFzQ2xhbXAsIGZsb2F0IGRlcHRoQmlhc1Nsb3BlRmFjdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldERlcHRoQmlhcyggbV9jb21tYW5kQnVmZmVyLCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZGVwdGhCaWFzQ2xhbXAsIGRlcHRoQmlhc1Nsb3BlRmFjdG9yICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldERlcHRoQmlhcyggZmxvYXQgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsIGZsb2F0IGRlcHRoQmlhc0NsYW1wLCBmbG9hdCBkZXB0aEJpYXNTbG9wZUZhY3RvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0RGVwdGhCaWFzKCBtX2NvbW1hbmRCdWZmZXIsIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBkZXB0aEJpYXNDbGFtcCwgZGVwdGhCaWFzU2xvcGVGYWN0b3IgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0RGVwdGhCb3VuZHMoIGZsb2F0IG1pbkRlcHRoQm91bmRzLCBmbG9hdCBtYXhEZXB0aEJvdW5kcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXREZXB0aEJvdW5kcyggbV9jb21tYW5kQnVmZmVyLCBtaW5EZXB0aEJvdW5kcywgbWF4RGVwdGhCb3VuZHMgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0RGVwdGhCb3VuZHMoIGZsb2F0IG1pbkRlcHRoQm91bmRzLCBmbG9hdCBtYXhEZXB0aEJvdW5kcywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0RGVwdGhCb3VuZHMoIG1fY29tbWFuZEJ1ZmZlciwgbWluRGVwdGhCb3VuZHMsIG1heERlcHRoQm91bmRzICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldERldmljZU1hc2soIHVpbnQzMl90IGRldmljZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0RGV2aWNlTWFzayggbV9jb21tYW5kQnVmZmVyLCBkZXZpY2VNYXNrICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldERldmljZU1hc2soIHVpbnQzMl90IGRldmljZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldERldmljZU1hc2soIG1fY29tbWFuZEJ1ZmZlciwgZGV2aWNlTWFzayApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXREZXZpY2VNYXNrS0hSKCB1aW50MzJfdCBkZXZpY2VNYXNrLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldERldmljZU1hc2tLSFIoIG1fY29tbWFuZEJ1ZmZlciwgZGV2aWNlTWFzayApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXREZXZpY2VNYXNrS0hSKCB1aW50MzJfdCBkZXZpY2VNYXNrLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXREZXZpY2VNYXNrS0hSKCBtX2NvbW1hbmRCdWZmZXIsIGRldmljZU1hc2sgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldERpc2NhcmRSZWN0YW5nbGVFWFQoIHVpbnQzMl90IGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgdWludDMyX3QgZGlzY2FyZFJlY3RhbmdsZUNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKiBwRGlzY2FyZFJlY3RhbmdsZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCggbV9jb21tYW5kQnVmZmVyLCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlY3QyRCo+KCBwRGlzY2FyZFJlY3RhbmdsZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldERpc2NhcmRSZWN0YW5nbGVFWFQoIHVpbnQzMl90IGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEPiBkaXNjYXJkUmVjdGFuZ2xlcywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCggbV9jb21tYW5kQnVmZmVyLCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsIGRpc2NhcmRSZWN0YW5nbGVzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZWN0MkQqPiggZGlzY2FyZFJlY3RhbmdsZXMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0RXZlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0RXZlbnQoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtFdmVudD4oIGV2ZW50ICksIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVTdGFnZUZsYWdzPiggc3RhZ2VNYXNrICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0RXZlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldEV2ZW50KCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrRXZlbnQ+KCBldmVudCApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFncz4oIHN0YWdlTWFzayApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXRFeGNsdXNpdmVTY2lzc29yTlYoIHVpbnQzMl90IGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgdWludDMyX3QgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKiBwRXhjbHVzaXZlU2Npc3NvcnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKCBtX2NvbW1hbmRCdWZmZXIsIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgZXhjbHVzaXZlU2Npc3NvckNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmVjdDJEKj4oIHBFeGNsdXNpdmVTY2lzc29ycyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0RXhjbHVzaXZlU2Npc3Nvck5WKCB1aW50MzJfdCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRD4gZXhjbHVzaXZlU2Npc3NvcnMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViggbV9jb21tYW5kQnVmZmVyLCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsIGV4Y2x1c2l2ZVNjaXNzb3JzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZWN0MkQqPiggZXhjbHVzaXZlU2Npc3NvcnMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0TGluZVN0aXBwbGVFWFQoIHVpbnQzMl90IGxpbmVTdGlwcGxlRmFjdG9yLCB1aW50MTZfdCBsaW5lU3RpcHBsZVBhdHRlcm4sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0TGluZVN0aXBwbGVFWFQoIG1fY29tbWFuZEJ1ZmZlciwgbGluZVN0aXBwbGVGYWN0b3IsIGxpbmVTdGlwcGxlUGF0dGVybiApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXRMaW5lU3RpcHBsZUVYVCggdWludDMyX3QgbGluZVN0aXBwbGVGYWN0b3IsIHVpbnQxNl90IGxpbmVTdGlwcGxlUGF0dGVybiwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0TGluZVN0aXBwbGVFWFQoIG1fY29tbWFuZEJ1ZmZlciwgbGluZVN0aXBwbGVGYWN0b3IsIGxpbmVTdGlwcGxlUGF0dGVybiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXRMaW5lV2lkdGgoIGZsb2F0IGxpbmVXaWR0aCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXRMaW5lV2lkdGgoIG1fY29tbWFuZEJ1ZmZlciwgbGluZVdpZHRoICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldExpbmVXaWR0aCggZmxvYXQgbGluZVdpZHRoLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXRMaW5lV2lkdGgoIG1fY29tbWFuZEJ1ZmZlciwgbGluZVdpZHRoICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IENvbW1hbmRCdWZmZXI6OnNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCo+KCBwTWFya2VySW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIENvbW1hbmRCdWZmZXI6OnNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoIGNvbnN0IFBlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMICYgbWFya2VySW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCo+KCAmbWFya2VySW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6Q29tbWFuZEJ1ZmZlcjo6c2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgQ29tbWFuZEJ1ZmZlcjo6c2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogcE92ZXJyaWRlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCo+KCBwT3ZlcnJpZGVJbmZvICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgQ29tbWFuZEJ1ZmZlcjo6c2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKCBjb25zdCBQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMICYgb3ZlcnJpZGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCo+KCAmb3ZlcnJpZGVJbmZvICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpDb21tYW5kQnVmZmVyOjpzZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IENvbW1hbmRCdWZmZXI6OnNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCo+KCBwTWFya2VySW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIENvbW1hbmRCdWZmZXI6OnNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoIGNvbnN0IFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMICYgbWFya2VySW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCo+KCAmbWFya2VySW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6Q29tbWFuZEJ1ZmZlcjo6c2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldFNhbXBsZUxvY2F0aW9uc0VYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUxvY2F0aW9uc0luZm9FWFQqIHBTYW1wbGVMb2NhdGlvbnNJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCggbV9jb21tYW5kQnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCo+KCBwU2FtcGxlTG9jYXRpb25zSW5mbyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0U2FtcGxlTG9jYXRpb25zRVhUKCBjb25zdCBTYW1wbGVMb2NhdGlvbnNJbmZvRVhUICYgc2FtcGxlTG9jYXRpb25zSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKCBtX2NvbW1hbmRCdWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKj4oICZzYW1wbGVMb2NhdGlvbnNJbmZvICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldFNjaXNzb3IoIHVpbnQzMl90IGZpcnN0U2Npc3NvciwgdWludDMyX3Qgc2Npc3NvckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEKiBwU2Npc3NvcnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0U2Npc3NvciggbV9jb21tYW5kQnVmZmVyLCBmaXJzdFNjaXNzb3IsIHNjaXNzb3JDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlY3QyRCo+KCBwU2Npc3NvcnMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldFNjaXNzb3IoIHVpbnQzMl90IGZpcnN0U2Npc3NvciwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVjdDJEPiBzY2lzc29ycywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0U2Npc3NvciggbV9jb21tYW5kQnVmZmVyLCBmaXJzdFNjaXNzb3IsIHNjaXNzb3JzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZWN0MkQqPiggc2Npc3NvcnMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0U3RlbmNpbENvbXBhcmVNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3QgY29tcGFyZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrU3RlbmNpbEZhY2VGbGFncz4oIGZhY2VNYXNrICksIGNvbXBhcmVNYXNrICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldFN0ZW5jaWxDb21wYXJlTWFzayggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IGNvbXBhcmVNYXNrLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtTdGVuY2lsRmFjZUZsYWdzPiggZmFjZU1hc2sgKSwgY29tcGFyZU1hc2sgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0U3RlbmNpbFJlZmVyZW5jZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHJlZmVyZW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrU3RlbmNpbEZhY2VGbGFncz4oIGZhY2VNYXNrICksIHJlZmVyZW5jZSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXRTdGVuY2lsUmVmZXJlbmNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3QgcmVmZXJlbmNlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrU3RlbmNpbEZhY2VGbGFncz4oIGZhY2VNYXNrICksIHJlZmVyZW5jZSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXRTdGVuY2lsV3JpdGVNYXNrKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3Qgd3JpdGVNYXNrLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2soIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtTdGVuY2lsRmFjZUZsYWdzPiggZmFjZU1hc2sgKSwgd3JpdGVNYXNrICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldFN0ZW5jaWxXcml0ZU1hc2soIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCB3cml0ZU1hc2ssIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2soIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtTdGVuY2lsRmFjZUZsYWdzPiggZmFjZU1hc2sgKSwgd3JpdGVNYXNrICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXRWaWV3cG9ydCggdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0KiBwVmlld3BvcnRzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldFZpZXdwb3J0KCBtX2NvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWaWV3cG9ydCo+KCBwVmlld3BvcnRzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjpzZXRWaWV3cG9ydCggdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Vmlld3BvcnQ+IHZpZXdwb3J0cywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0Vmlld3BvcnQoIG1fY29tbWFuZEJ1ZmZlciwgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWaWV3cG9ydCo+KCB2aWV3cG9ydHMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkaW5nUmF0ZVBhbGV0dGVOViogcFNoYWRpbmdSYXRlUGFsZXR0ZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViggbV9jb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqPiggcFNoYWRpbmdSYXRlUGFsZXR0ZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRpbmdSYXRlUGFsZXR0ZU5WPiBzaGFkaW5nUmF0ZVBhbGV0dGVzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKCBtX2NvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHNoYWRpbmdSYXRlUGFsZXR0ZXMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKj4oIHNoYWRpbmdSYXRlUGFsZXR0ZXMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnNldFZpZXdwb3J0V1NjYWxpbmdOViggdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZpZXdwb3J0V1NjYWxpbmdOViogcFZpZXdwb3J0V1NjYWxpbmdzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViggbV9jb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKj4oIHBWaWV3cG9ydFdTY2FsaW5ncyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6c2V0Vmlld3BvcnRXU2NhbGluZ05WKCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWaWV3cG9ydFdTY2FsaW5nTlY+IHZpZXdwb3J0V1NjYWxpbmdzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoIG1fY29tbWFuZEJ1ZmZlciwgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRXU2NhbGluZ3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOVio+KCB2aWV3cG9ydFdTY2FsaW5ncy5kYXRhKCkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjp0cmFjZVJheXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ09mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGRlcHRoLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFRyYWNlUmF5c05WKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggaGl0U2hhZGVyQmluZGluZ1N0cmlkZSApLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUgKSwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6dHJhY2VSYXlzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkZXB0aCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kVHJhY2VSYXlzTlYoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCApLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggaGl0U2hhZGVyQmluZGluZ09mZnNldCApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBoaXRTaGFkZXJCaW5kaW5nU3RyaWRlICksIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSApLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6dXBkYXRlQnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGRzdEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgZHN0T2Zmc2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkYXRhU2l6ZSwgY29uc3Qgdm9pZCogcERhdGEsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kVXBkYXRlQnVmZmVyKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggZHN0QnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIGRzdE9mZnNldCApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBkYXRhU2l6ZSApLCBwRGF0YSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OnVwZGF0ZUJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBkc3RCdWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGRzdE9mZnNldCwgQXJyYXlQcm94eTxjb25zdCBUPiBkYXRhLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRVcGRhdGVCdWZmZXIoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBkc3RCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggZHN0T2Zmc2V0ICksIGRhdGEuc2l6ZSgpICogc2l6ZW9mKCBUICkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPiggZGF0YS5kYXRhKCkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6d2FpdEV2ZW50cyggdWludDMyX3QgZXZlbnRDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50KiBwRXZlbnRzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyTWVtb3J5QmFycmllciogcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kV2FpdEV2ZW50cyggbV9jb21tYW5kQnVmZmVyLCBldmVudENvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXZlbnQqPiggcEV2ZW50cyApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFncz4oIHNyY1N0YWdlTWFzayApLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFncz4oIGRzdFN0YWdlTWFzayApLCBtZW1vcnlCYXJyaWVyQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlCYXJyaWVyKj4oIHBNZW1vcnlCYXJyaWVycyApLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKj4oIHBCdWZmZXJNZW1vcnlCYXJyaWVycyApLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllcio+KCBwSW1hZ2VNZW1vcnlCYXJyaWVycyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6d2FpdEV2ZW50cyggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQ+IGV2ZW50cywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlCYXJyaWVyPiBtZW1vcnlCYXJyaWVycywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyTWVtb3J5QmFycmllcj4gYnVmZmVyTWVtb3J5QmFycmllcnMsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlTWVtb3J5QmFycmllcj4gaW1hZ2VNZW1vcnlCYXJyaWVycywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrQ21kV2FpdEV2ZW50cyggbV9jb21tYW5kQnVmZmVyLCBldmVudHMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V2ZW50Kj4oIGV2ZW50cy5kYXRhKCkgKSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZVN0YWdlRmxhZ3M+KCBzcmNTdGFnZU1hc2sgKSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZVN0YWdlRmxhZ3M+KCBkc3RTdGFnZU1hc2sgKSwgbWVtb3J5QmFycmllcnMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeUJhcnJpZXIqPiggbWVtb3J5QmFycmllcnMuZGF0YSgpICksIGJ1ZmZlck1lbW9yeUJhcnJpZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKj4oIGJ1ZmZlck1lbW9yeUJhcnJpZXJzLmRhdGEoKSApLCBpbWFnZU1lbW9yeUJhcnJpZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqPiggaW1hZ2VNZW1vcnlCYXJyaWVycy5kYXRhKCkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6d3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKCB1aW50MzJfdCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5VHlwZSBxdWVyeVR5cGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViggbV9jb21tYW5kQnVmZmVyLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKj4oIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzICksIHN0YXRpY19jYXN0PFZrUXVlcnlUeXBlPiggcXVlcnlUeXBlICksIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIGZpcnN0UXVlcnkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjp3cml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlUeXBlIHF1ZXJ5VHlwZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViggbV9jb21tYW5kQnVmZmVyLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVio+KCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLmRhdGEoKSApLCBzdGF0aWNfY2FzdDxWa1F1ZXJ5VHlwZT4oIHF1ZXJ5VHlwZSApLCBzdGF0aWNfY2FzdDxWa1F1ZXJ5UG9vbD4oIHF1ZXJ5UG9vbCApLCBmaXJzdFF1ZXJ5ICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OndyaXRlQnVmZmVyTWFya2VyQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgZHN0QnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBkc3RPZmZzZXQsIHVpbnQzMl90IG1hcmtlciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cz4oIHBpcGVsaW5lU3RhZ2UgKSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBkc3RCdWZmZXIgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggZHN0T2Zmc2V0ICksIG1hcmtlciApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBDb21tYW5kQnVmZmVyOjp3cml0ZUJ1ZmZlck1hcmtlckFNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lU3RhZ2VGbGFnQml0cyBwaXBlbGluZVN0YWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGRzdEJ1ZmZlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgZHN0T2Zmc2V0LCB1aW50MzJfdCBtYXJrZXIsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzPiggcGlwZWxpbmVTdGFnZSApLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGRzdEJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBkc3RPZmZzZXQgKSwgbWFya2VyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIENvbW1hbmRCdWZmZXI6OndyaXRlVGltZXN0YW1wKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRXcml0ZVRpbWVzdGFtcCggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cz4oIHBpcGVsaW5lU3RhZ2UgKSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcXVlcnkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgQ29tbWFuZEJ1ZmZlcjo6d3JpdGVUaW1lc3RhbXAoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtDbWRXcml0ZVRpbWVzdGFtcCggbV9jb21tYW5kQnVmZmVyLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cz4oIHBpcGVsaW5lU3RhZ2UgKSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcXVlcnkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBDb21tYW5kQnVmZmVyOjplbmQoRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VuZENvbW1hbmRCdWZmZXIoIG1fY29tbWFuZEJ1ZmZlciApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgQ29tbWFuZEJ1ZmZlcjo6ZW5kKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW5kQ29tbWFuZEJ1ZmZlciggbV9jb21tYW5kQnVmZmVyICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6Q29tbWFuZEJ1ZmZlcjo6ZW5kIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IENvbW1hbmRCdWZmZXI6OnJlc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgZmxhZ3MsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtSZXNldENvbW1hbmRCdWZmZXIoIG1fY29tbWFuZEJ1ZmZlciwgc3RhdGljX2Nhc3Q8VmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncz4oIGZsYWdzICkgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIENvbW1hbmRCdWZmZXI6OnJlc2V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgZmxhZ3MsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUmVzZXRDb21tYW5kQnVmZmVyKCBtX2NvbW1hbmRCdWZmZXIsIHN0YXRpY19jYXN0PFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3M+KCBmbGFncyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6Q29tbWFuZEJ1ZmZlcjo6cmVzZXQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6YWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU3dhcGNoYWluS0hSPiggc3dhcGNoYWluICkgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6YWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjphY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjphY3F1aXJlTmV4dEltYWdlMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiBwQWNxdWlyZUluZm8sIHVpbnQzMl90KiBwSW1hZ2VJbmRleCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0FjcXVpcmVOZXh0SW1hZ2UyS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKj4oIHBBY3F1aXJlSW5mbyApLCBwSW1hZ2VJbmRleCApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlPHVpbnQzMl90PiBEZXZpY2U6OmFjcXVpcmVOZXh0SW1hZ2UyS0hSKCBjb25zdCBBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiAmIGFjcXVpcmVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICB1aW50MzJfdCBpbWFnZUluZGV4OworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQWNxdWlyZU5leHRJbWFnZTJLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqPiggJmFjcXVpcmVJbmZvICksICZpbWFnZUluZGV4ICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgaW1hZ2VJbmRleCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjphY3F1aXJlTmV4dEltYWdlMktIUiIsIHsgUmVzdWx0OjplU3VjY2VzcywgUmVzdWx0OjplVGltZW91dCwgUmVzdWx0OjplTm90UmVhZHksIFJlc3VsdDo6ZVN1Ym9wdGltYWxLSFIgfSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmFjcXVpcmVOZXh0SW1hZ2VLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlLCB1aW50MzJfdCogcEltYWdlSW5kZXgsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBY3F1aXJlTmV4dEltYWdlS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgdGltZW91dCwgc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmU+KCBzZW1hcGhvcmUgKSwgc3RhdGljX2Nhc3Q8VmtGZW5jZT4oIGZlbmNlICksIHBJbWFnZUluZGV4ICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWU8dWludDMyX3Q+IERldmljZTo6YWNxdWlyZU5leHRJbWFnZUtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQ2NF90IHRpbWVvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2UsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHVpbnQzMl90IGltYWdlSW5kZXg7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBY3F1aXJlTmV4dEltYWdlS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgdGltZW91dCwgc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmU+KCBzZW1hcGhvcmUgKSwgc3RhdGljX2Nhc3Q8VmtGZW5jZT4oIGZlbmNlICksICZpbWFnZUluZGV4ICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgaW1hZ2VJbmRleCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjphY3F1aXJlTmV4dEltYWdlS0hSIiwgeyBSZXN1bHQ6OmVTdWNjZXNzLCBSZXN1bHQ6OmVUaW1lb3V0LCBSZXN1bHQ6OmVOb3RSZWFkeSwgUmVzdWx0OjplU3Vib3B0aW1hbEtIUiB9ICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6YWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCogcEFjcXVpcmVJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwqIHBDb25maWd1cmF0aW9uLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqPiggcEFjcXVpcmVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCo+KCBwQ29uZmlndXJhdGlvbiApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTD46OnR5cGUgRGV2aWNlOjphY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIGNvbnN0IFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgJiBhY3F1aXJlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbmZpZ3VyYXRpb247CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCo+KCAmYWNxdWlyZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKj4oICZjb25maWd1cmF0aW9uICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBjb25maWd1cmF0aW9uLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjphY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiogcEluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqPiggcEluZm8gKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKCBjb25zdCBBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUio+KCAmaW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjphY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjphbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyo+KCBwQWxsb2NhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kQnVmZmVyKj4oIHBDb21tYW5kQnVmZmVycyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8Q29tbWFuZEJ1ZmZlcixBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoIGNvbnN0IENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gJiBhbGxvY2F0ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPENvbW1hbmRCdWZmZXIsQWxsb2NhdG9yPiBjb21tYW5kQnVmZmVycyggYWxsb2NhdGVJbmZvLmNvbW1hbmRCdWZmZXJDb3VudCApOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKj4oICZhbGxvY2F0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRCdWZmZXIqPiggY29tbWFuZEJ1ZmZlcnMuZGF0YSgpICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBjb21tYW5kQnVmZmVycywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjphbGxvY2F0ZUNvbW1hbmRCdWZmZXJzIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxDb21tYW5kQnVmZmVyLEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6YWxsb2NhdGVDb21tYW5kQnVmZmVycyggY29uc3QgQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPENvbW1hbmRCdWZmZXIsQWxsb2NhdG9yPiBjb21tYW5kQnVmZmVycyggYWxsb2NhdGVJbmZvLmNvbW1hbmRCdWZmZXJDb3VudCwgdmVjdG9yQWxsb2NhdG9yICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qPiggJmFsbG9jYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrQ29tbWFuZEJ1ZmZlcio+KCBjb21tYW5kQnVmZmVycy5kYXRhKCkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGNvbW1hbmRCdWZmZXJzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxDb21tYW5kQnVmZmVyLERpc3BhdGNoPixBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnNVbmlxdWUoIGNvbnN0IENvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gJiBhbGxvY2F0ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggQ29tbWFuZEJ1ZmZlciApIDw9IHNpemVvZiggVW5pcXVlSGFuZGxlPENvbW1hbmRCdWZmZXIsIERpc3BhdGNoPiApLCAiQ29tbWFuZEJ1ZmZlciBpcyBncmVhdGVyIHRoYW4gVW5pcXVlSGFuZGxlPENvbW1hbmRCdWZmZXIsIERpc3BhdGNoPiEiICk7CisgICAgc3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPENvbW1hbmRCdWZmZXIsIERpc3BhdGNoPiwgQWxsb2NhdG9yPiBjb21tYW5kQnVmZmVyczsKKyAgICBjb21tYW5kQnVmZmVycy5yZXNlcnZlKCBhbGxvY2F0ZUluZm8uY29tbWFuZEJ1ZmZlckNvdW50ICk7CisgICAgQ29tbWFuZEJ1ZmZlciogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxDb21tYW5kQnVmZmVyKj4oIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCBjb21tYW5kQnVmZmVycy5kYXRhKCkgKSArIGFsbG9jYXRlSW5mby5jb21tYW5kQnVmZmVyQ291bnQgKiAoIHNpemVvZiggVW5pcXVlSGFuZGxlPENvbW1hbmRCdWZmZXIsIERpc3BhdGNoPiApIC0gc2l6ZW9mKCBDb21tYW5kQnVmZmVyICkgKSApOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KGQudmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qPiggJmFsbG9jYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrQ29tbWFuZEJ1ZmZlcio+KCBidWZmZXIgKSApICk7CisgICAgaWYgKHJlc3VsdCA9PSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzdWx0OjplU3VjY2VzcykKKyAgICB7CisgICAgICBQb29sRnJlZTxEZXZpY2UsQ29tbWFuZFBvb2wsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0ZUluZm8uY29tbWFuZFBvb2wsIGQgKTsKKyAgICAgIGZvciAoIHNpemVfdCBpPTAgOyBpPGFsbG9jYXRlSW5mby5jb21tYW5kQnVmZmVyQ291bnQgOyBpKysgKQorICAgICAgeworICAgICAgICBjb21tYW5kQnVmZmVycy5wdXNoX2JhY2soIFVuaXF1ZUhhbmRsZTxDb21tYW5kQnVmZmVyLCBEaXNwYXRjaD4oIGJ1ZmZlcltpXSwgZGVsZXRlciApICk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGNvbW1hbmRCdWZmZXJzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkcgIjo6RGV2aWNlOjphbGxvY2F0ZUNvbW1hbmRCdWZmZXJzVW5pcXVlIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8Q29tbWFuZEJ1ZmZlcixEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjphbGxvY2F0ZUNvbW1hbmRCdWZmZXJzVW5pcXVlKCBjb25zdCBDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICYgYWxsb2NhdGVJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBDb21tYW5kQnVmZmVyICkgPD0gc2l6ZW9mKCBVbmlxdWVIYW5kbGU8Q29tbWFuZEJ1ZmZlciwgRGlzcGF0Y2g+ICksICJDb21tYW5kQnVmZmVyIGlzIGdyZWF0ZXIgdGhhbiBVbmlxdWVIYW5kbGU8Q29tbWFuZEJ1ZmZlciwgRGlzcGF0Y2g+ISIgKTsKKyAgICBzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8Q29tbWFuZEJ1ZmZlciwgRGlzcGF0Y2g+LCBBbGxvY2F0b3I+IGNvbW1hbmRCdWZmZXJzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICBjb21tYW5kQnVmZmVycy5yZXNlcnZlKCBhbGxvY2F0ZUluZm8uY29tbWFuZEJ1ZmZlckNvdW50ICk7CisgICAgQ29tbWFuZEJ1ZmZlciogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxDb21tYW5kQnVmZmVyKj4oIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCBjb21tYW5kQnVmZmVycy5kYXRhKCkgKSArIGFsbG9jYXRlSW5mby5jb21tYW5kQnVmZmVyQ291bnQgKiAoIHNpemVvZiggVW5pcXVlSGFuZGxlPENvbW1hbmRCdWZmZXIsIERpc3BhdGNoPiApIC0gc2l6ZW9mKCBDb21tYW5kQnVmZmVyICkgKSApOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KGQudmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qPiggJmFsbG9jYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrQ29tbWFuZEJ1ZmZlcio+KCBidWZmZXIgKSApICk7CisgICAgaWYgKHJlc3VsdCA9PSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzdWx0OjplU3VjY2VzcykKKyAgICB7CisgICAgICBQb29sRnJlZTxEZXZpY2UsQ29tbWFuZFBvb2wsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0ZUluZm8uY29tbWFuZFBvb2wsIGQgKTsKKyAgICAgIGZvciAoIHNpemVfdCBpPTAgOyBpPGFsbG9jYXRlSW5mby5jb21tYW5kQnVmZmVyQ291bnQgOyBpKysgKQorICAgICAgeworICAgICAgICBjb21tYW5kQnVmZmVycy5wdXNoX2JhY2soIFVuaXF1ZUhhbmRsZTxDb21tYW5kQnVmZmVyLCBEaXNwYXRjaD4oIGJ1ZmZlcltpXSwgZGVsZXRlciApICk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGNvbW1hbmRCdWZmZXJzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkcgIjo6RGV2aWNlOjphbGxvY2F0ZUNvbW1hbmRCdWZmZXJzVW5pcXVlIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmFsbG9jYXRlRGVzY3JpcHRvclNldHMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKj4oIHBBbGxvY2F0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXQqPiggcERlc2NyaXB0b3JTZXRzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yU2V0LEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6YWxsb2NhdGVEZXNjcmlwdG9yU2V0cyggY29uc3QgRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvclNldCxBbGxvY2F0b3I+IGRlc2NyaXB0b3JTZXRzKCBhbGxvY2F0ZUluZm8uZGVzY3JpcHRvclNldENvdW50ICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qPiggJmFsbG9jYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldCo+KCBkZXNjcmlwdG9yU2V0cy5kYXRhKCkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGRlc2NyaXB0b3JTZXRzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmFsbG9jYXRlRGVzY3JpcHRvclNldHMiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERlc2NyaXB0b3JTZXQsQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjphbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCBjb25zdCBEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICYgYWxsb2NhdGVJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvclNldCxBbGxvY2F0b3I+IGRlc2NyaXB0b3JTZXRzKCBhbGxvY2F0ZUluZm8uZGVzY3JpcHRvclNldENvdW50LCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyo+KCAmYWxsb2NhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0Kj4oIGRlc2NyaXB0b3JTZXRzLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGVzY3JpcHRvclNldHMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6YWxsb2NhdGVEZXNjcmlwdG9yU2V0cyIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPERlc2NyaXB0b3JTZXQsRGlzcGF0Y2g+LEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6YWxsb2NhdGVEZXNjcmlwdG9yU2V0c1VuaXF1ZSggY29uc3QgRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBEZXNjcmlwdG9yU2V0ICkgPD0gc2l6ZW9mKCBVbmlxdWVIYW5kbGU8RGVzY3JpcHRvclNldCwgRGlzcGF0Y2g+ICksICJEZXNjcmlwdG9yU2V0IGlzIGdyZWF0ZXIgdGhhbiBVbmlxdWVIYW5kbGU8RGVzY3JpcHRvclNldCwgRGlzcGF0Y2g+ISIgKTsKKyAgICBzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8RGVzY3JpcHRvclNldCwgRGlzcGF0Y2g+LCBBbGxvY2F0b3I+IGRlc2NyaXB0b3JTZXRzOworICAgIGRlc2NyaXB0b3JTZXRzLnJlc2VydmUoIGFsbG9jYXRlSW5mby5kZXNjcmlwdG9yU2V0Q291bnQgKTsKKyAgICBEZXNjcmlwdG9yU2V0KiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PERlc2NyaXB0b3JTZXQqPiggcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oIGRlc2NyaXB0b3JTZXRzLmRhdGEoKSApICsgYWxsb2NhdGVJbmZvLmRlc2NyaXB0b3JTZXRDb3VudCAqICggc2l6ZW9mKCBVbmlxdWVIYW5kbGU8RGVzY3JpcHRvclNldCwgRGlzcGF0Y2g+ICkgLSBzaXplb2YoIERlc2NyaXB0b3JTZXQgKSApICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oZC52a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyo+KCAmYWxsb2NhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0Kj4oIGJ1ZmZlciApICkgKTsKKyAgICBpZiAocmVzdWx0ID09IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZXN1bHQ6OmVTdWNjZXNzKQorICAgIHsKKyAgICAgIFBvb2xGcmVlPERldmljZSxEZXNjcmlwdG9yUG9vbCxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRlSW5mby5kZXNjcmlwdG9yUG9vbCwgZCApOworICAgICAgZm9yICggc2l6ZV90IGk9MCA7IGk8YWxsb2NhdGVJbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA7IGkrKyApCisgICAgICB7CisgICAgICAgIGRlc2NyaXB0b3JTZXRzLnB1c2hfYmFjayggVW5pcXVlSGFuZGxlPERlc2NyaXB0b3JTZXQsIERpc3BhdGNoPiggYnVmZmVyW2ldLCBkZWxldGVyICkgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGVzY3JpcHRvclNldHMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpEZXZpY2U6OmFsbG9jYXRlRGVzY3JpcHRvclNldHNVbmlxdWUiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yU2V0LERpc3BhdGNoPixBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmFsbG9jYXRlRGVzY3JpcHRvclNldHNVbmlxdWUoIGNvbnN0IERlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gJiBhbGxvY2F0ZUluZm8sIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoIERlc2NyaXB0b3JTZXQgKSA8PSBzaXplb2YoIFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yU2V0LCBEaXNwYXRjaD4gKSwgIkRlc2NyaXB0b3JTZXQgaXMgZ3JlYXRlciB0aGFuIFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yU2V0LCBEaXNwYXRjaD4hIiApOworICAgIHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yU2V0LCBEaXNwYXRjaD4sIEFsbG9jYXRvcj4gZGVzY3JpcHRvclNldHMoIHZlY3RvckFsbG9jYXRvciApOworICAgIGRlc2NyaXB0b3JTZXRzLnJlc2VydmUoIGFsbG9jYXRlSW5mby5kZXNjcmlwdG9yU2V0Q291bnQgKTsKKyAgICBEZXNjcmlwdG9yU2V0KiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PERlc2NyaXB0b3JTZXQqPiggcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oIGRlc2NyaXB0b3JTZXRzLmRhdGEoKSApICsgYWxsb2NhdGVJbmZvLmRlc2NyaXB0b3JTZXRDb3VudCAqICggc2l6ZW9mKCBVbmlxdWVIYW5kbGU8RGVzY3JpcHRvclNldCwgRGlzcGF0Y2g+ICkgLSBzaXplb2YoIERlc2NyaXB0b3JTZXQgKSApICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oZC52a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyo+KCAmYWxsb2NhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0Kj4oIGJ1ZmZlciApICkgKTsKKyAgICBpZiAocmVzdWx0ID09IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZXN1bHQ6OmVTdWNjZXNzKQorICAgIHsKKyAgICAgIFBvb2xGcmVlPERldmljZSxEZXNjcmlwdG9yUG9vbCxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRlSW5mby5kZXNjcmlwdG9yUG9vbCwgZCApOworICAgICAgZm9yICggc2l6ZV90IGk9MCA7IGk8YWxsb2NhdGVJbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA7IGkrKyApCisgICAgICB7CisgICAgICAgIGRlc2NyaXB0b3JTZXRzLnB1c2hfYmFjayggVW5pcXVlSGFuZGxlPERlc2NyaXB0b3JTZXQsIERpc3BhdGNoPiggYnVmZmVyW2ldLCBkZWxldGVyICkgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGVzY3JpcHRvclNldHMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpEZXZpY2U6OmFsbG9jYXRlRGVzY3JpcHRvclNldHNVbmlxdWUiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6YWxsb2NhdGVNZW1vcnkoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5KiBwTWVtb3J5LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQWxsb2NhdGVNZW1vcnkoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKj4oIHBBbGxvY2F0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrRGV2aWNlTWVtb3J5Kj4oIHBNZW1vcnkgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5Pjo6dHlwZSBEZXZpY2U6OmFsbG9jYXRlTWVtb3J5KCBjb25zdCBNZW1vcnlBbGxvY2F0ZUluZm8gJiBhbGxvY2F0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBbGxvY2F0ZU1lbW9yeSggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qPiggJmFsbG9jYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VNZW1vcnkqPiggJm1lbW9yeSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmFsbG9jYXRlTWVtb3J5IiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPERldmljZU1lbW9yeSxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6YWxsb2NhdGVNZW1vcnlVbmlxdWUoIGNvbnN0IE1lbW9yeUFsbG9jYXRlSW5mbyAmIGFsbG9jYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0FsbG9jYXRlTWVtb3J5KCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyo+KCAmYWxsb2NhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZU1lbW9yeSo+KCAmbWVtb3J5ICkgKSApOworCisgICAgT2JqZWN0RnJlZTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8RGV2aWNlTWVtb3J5LERpc3BhdGNoPiggcmVzdWx0LCBtZW1vcnksIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6YWxsb2NhdGVNZW1vcnlVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6YmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViggbV9kZXZpY2UsIGJpbmRJbmZvQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKj4oIHBCaW5kSW5mb3MgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVj4gYmluZEluZm9zLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViggbV9kZXZpY2UsIGJpbmRJbmZvcy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVio+KCBiaW5kSW5mb3MuZGF0YSgpICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmJpbmRCdWZmZXJNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQmluZEJ1ZmZlck1lbW9yeSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHN0YXRpY19jYXN0PFZrRGV2aWNlTWVtb3J5PiggbWVtb3J5ICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG1lbW9yeU9mZnNldCApICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmJpbmRCdWZmZXJNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIgYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgbWVtb3J5T2Zmc2V0LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0JpbmRCdWZmZXJNZW1vcnkoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0J1ZmZlcj4oIGJ1ZmZlciApLCBzdGF0aWNfY2FzdDxWa0RldmljZU1lbW9yeT4oIG1lbW9yeSApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBtZW1vcnlPZmZzZXQgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6YmluZEJ1ZmZlck1lbW9yeSIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpiaW5kQnVmZmVyTWVtb3J5MiggdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRCdWZmZXJNZW1vcnlJbmZvKiBwQmluZEluZm9zLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQmluZEJ1ZmZlck1lbW9yeTIoIG1fZGV2aWNlLCBiaW5kSW5mb0NvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qPiggcEJpbmRJbmZvcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6YmluZEJ1ZmZlck1lbW9yeTIoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRCdWZmZXJNZW1vcnlJbmZvPiBiaW5kSW5mb3MsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQmluZEJ1ZmZlck1lbW9yeTIoIG1fZGV2aWNlLCBiaW5kSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKj4oIGJpbmRJbmZvcy5kYXRhKCkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6YmluZEJ1ZmZlck1lbW9yeTIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6YmluZEJ1ZmZlck1lbW9yeTJLSFIoIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0JpbmRCdWZmZXJNZW1vcnkyS0hSKCBtX2RldmljZSwgYmluZEluZm9Db3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKj4oIHBCaW5kSW5mb3MgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmJpbmRCdWZmZXJNZW1vcnkyS0hSKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kQnVmZmVyTWVtb3J5SW5mbz4gYmluZEluZm9zLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0JpbmRCdWZmZXJNZW1vcnkyS0hSKCBtX2RldmljZSwgYmluZEluZm9zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyo+KCBiaW5kSW5mb3MuZGF0YSgpICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmJpbmRCdWZmZXJNZW1vcnkyS0hSIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6YmluZEltYWdlTWVtb3J5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtCaW5kSW1hZ2VNZW1vcnkoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggaW1hZ2UgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VNZW1vcnk+KCBtZW1vcnkgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggbWVtb3J5T2Zmc2V0ICkgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6YmluZEltYWdlTWVtb3J5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQmluZEltYWdlTWVtb3J5KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGltYWdlICksIHN0YXRpY19jYXN0PFZrRGV2aWNlTWVtb3J5PiggbWVtb3J5ICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIG1lbW9yeU9mZnNldCApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpiaW5kSW1hZ2VNZW1vcnkiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6YmluZEltYWdlTWVtb3J5MiggdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtCaW5kSW1hZ2VNZW1vcnkyKCBtX2RldmljZSwgYmluZEluZm9Db3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qPiggcEJpbmRJbmZvcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6YmluZEltYWdlTWVtb3J5MiggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZEltYWdlTWVtb3J5SW5mbz4gYmluZEluZm9zLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0JpbmRJbWFnZU1lbW9yeTIoIG1fZGV2aWNlLCBiaW5kSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qPiggYmluZEluZm9zLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpiaW5kSW1hZ2VNZW1vcnkyIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmJpbmRJbWFnZU1lbW9yeTJLSFIoIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCaW5kSW1hZ2VNZW1vcnlJbmZvKiBwQmluZEluZm9zLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQmluZEltYWdlTWVtb3J5MktIUiggbV9kZXZpY2UsIGJpbmRJbmZvQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKj4oIHBCaW5kSW5mb3MgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmJpbmRJbWFnZU1lbW9yeTJLSFIoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRJbWFnZU1lbW9yeUluZm8+IGJpbmRJbmZvcywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtCaW5kSW1hZ2VNZW1vcnkyS0hSKCBtX2RldmljZSwgYmluZEluZm9zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKj4oIGJpbmRJbmZvcy5kYXRhKCkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6YmluZEltYWdlTWVtb3J5MktIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNvbXBpbGVEZWZlcnJlZE5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IHNoYWRlciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NvbXBpbGVEZWZlcnJlZE5WKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZT4oIHBpcGVsaW5lICksIHNoYWRlciApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgRGV2aWNlOjpjb21waWxlRGVmZXJyZWROViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCB1aW50MzJfdCBzaGFkZXIsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ29tcGlsZURlZmVycmVkTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lPiggcGlwZWxpbmUgKSwgc2hhZGVyICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjb21waWxlRGVmZXJyZWROViIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqPiggcEFjY2VsZXJhdGlvblN0cnVjdHVyZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj46OnR5cGUgRGV2aWNlOjpjcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggY29uc3QgQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKj4oICZhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVixEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZVbmlxdWUoIGNvbnN0IEFjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVio+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVio+KCAmYWNjZWxlcmF0aW9uU3RydWN0dXJlICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYsRGlzcGF0Y2g+KCByZXN1bHQsIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVlVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVCdWZmZXIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXIqIHBCdWZmZXIsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVCdWZmZXIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXIqPiggcEJ1ZmZlciApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXI+Ojp0eXBlIERldmljZTo6Y3JlYXRlQnVmZmVyKCBjb25zdCBCdWZmZXJDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUJ1ZmZlciggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlcio+KCAmYnVmZmVyICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlQnVmZmVyIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEJ1ZmZlcixEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlQnVmZmVyVW5pcXVlKCBjb25zdCBCdWZmZXJDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlcjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUJ1ZmZlciggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlcio+KCAmYnVmZmVyICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8QnVmZmVyLERpc3BhdGNoPiggcmVzdWx0LCBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlQnVmZmVyVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZUJ1ZmZlclZpZXcoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlldyogcFZpZXcsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVCdWZmZXJWaWV3KCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlclZpZXcqPiggcFZpZXcgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlldz46OnR5cGUgRGV2aWNlOjpjcmVhdGVCdWZmZXJWaWV3KCBjb25zdCBCdWZmZXJWaWV3Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXcgdmlldzsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUJ1ZmZlclZpZXcoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrQnVmZmVyVmlldyo+KCAmdmlldyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgdmlldywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVCdWZmZXJWaWV3IiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEJ1ZmZlclZpZXcsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZUJ1ZmZlclZpZXdVbmlxdWUoIGNvbnN0IEJ1ZmZlclZpZXdDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlldyB2aWV3OworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlQnVmZmVyVmlldyggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXJWaWV3Kj4oICZ2aWV3ICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8QnVmZmVyVmlldyxEaXNwYXRjaD4oIHJlc3VsdCwgdmlldywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVCdWZmZXJWaWV3VW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZUNvbW1hbmRQb29sKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCogcENvbW1hbmRQb29sLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlQ29tbWFuZFBvb2woIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRQb29sKj4oIHBDb21tYW5kUG9vbCApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbD46OnR5cGUgRGV2aWNlOjpjcmVhdGVDb21tYW5kUG9vbCggY29uc3QgQ29tbWFuZFBvb2xDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2wgY29tbWFuZFBvb2w7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVDb21tYW5kUG9vbCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrQ29tbWFuZFBvb2wqPiggJmNvbW1hbmRQb29sICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBjb21tYW5kUG9vbCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVDb21tYW5kUG9vbCIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxDb21tYW5kUG9vbCxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlQ29tbWFuZFBvb2xVbmlxdWUoIGNvbnN0IENvbW1hbmRQb29sQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlQ29tbWFuZFBvb2woIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRQb29sKj4oICZjb21tYW5kUG9vbCApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPENvbW1hbmRQb29sLERpc3BhdGNoPiggcmVzdWx0LCBjb21tYW5kUG9vbCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVDb21tYW5kUG9vbFVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVDb21wdXRlUGlwZWxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUqIHBQaXBlbGluZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCBjcmVhdGVJbmZvQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKj4oIHBDcmVhdGVJbmZvcyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZSo+KCBwUGlwZWxpbmVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaXBlbGluZSxBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8+IGNyZWF0ZUluZm9zLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFBpcGVsaW5lLEFsbG9jYXRvcj4gcGlwZWxpbmVzKCBjcmVhdGVJbmZvcy5zaXplKCkgKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBwaXBlbGluZUNhY2hlICksIGNyZWF0ZUluZm9zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKj4oIGNyZWF0ZUluZm9zLmRhdGEoKSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZSo+KCBwaXBlbGluZXMuZGF0YSgpICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaXBlbGluZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmUsQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVDb21wdXRlUGlwZWxpbmVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGlwZWxpbmUsQWxsb2NhdG9yPiBwaXBlbGluZXMoIGNyZWF0ZUluZm9zLnNpemUoKSwgdmVjdG9yQWxsb2NhdG9yICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCBjcmVhdGVJbmZvcy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyo+KCBjcmVhdGVJbmZvcy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmUqPiggcGlwZWxpbmVzLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGlwZWxpbmVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZUNvbXB1dGVQaXBlbGluZXMiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxQaXBlbGluZT46OnR5cGUgRGV2aWNlOjpjcmVhdGVDb21wdXRlUGlwZWxpbmUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IENvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFBpcGVsaW5lIHBpcGVsaW5lOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgMSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lKj4oICZwaXBlbGluZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGlwZWxpbmUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlQ29tcHV0ZVBpcGVsaW5lIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8UGlwZWxpbmUsRGlzcGF0Y2g+LEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Y3JlYXRlQ29tcHV0ZVBpcGVsaW5lc1VuaXF1ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbz4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZSApIDw9IHNpemVvZiggVW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4gKSwgIlBpcGVsaW5lIGlzIGdyZWF0ZXIgdGhhbiBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiEiICk7CisgICAgc3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4sIEFsbG9jYXRvcj4gcGlwZWxpbmVzOworICAgIHBpcGVsaW5lcy5yZXNlcnZlKCBjcmVhdGVJbmZvcy5zaXplKCkgKTsKKyAgICBQaXBlbGluZSogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQaXBlbGluZSo+KCByZWludGVycHJldF9jYXN0PGNoYXIqPiggcGlwZWxpbmVzLmRhdGEoKSApICsgY3JlYXRlSW5mb3Muc2l6ZSgpICogKCBzaXplb2YoIFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+ICkgLSBzaXplb2YoIFBpcGVsaW5lICkgKSApOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KGQudmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCBjcmVhdGVJbmZvcy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyo+KCBjcmVhdGVJbmZvcy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmUqPiggYnVmZmVyICkgKSApOworICAgIGlmIChyZXN1bHQgPT0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc3VsdDo6ZVN1Y2Nlc3MpCisgICAgeworICAgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICAgIGZvciAoIHNpemVfdCBpPTAgOyBpPGNyZWF0ZUluZm9zLnNpemUoKSA7IGkrKyApCisgICAgICB7CisgICAgICAgIHBpcGVsaW5lcy5wdXNoX2JhY2soIFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+KCBidWZmZXJbaV0sIGRlbGV0ZXIgKSApOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaXBlbGluZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpEZXZpY2U6OmNyZWF0ZUNvbXB1dGVQaXBlbGluZXNVbmlxdWUiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVDb21wdXRlUGlwZWxpbmVzVW5pcXVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZSApIDw9IHNpemVvZiggVW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4gKSwgIlBpcGVsaW5lIGlzIGdyZWF0ZXIgdGhhbiBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiEiICk7CisgICAgc3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4sIEFsbG9jYXRvcj4gcGlwZWxpbmVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICBwaXBlbGluZXMucmVzZXJ2ZSggY3JlYXRlSW5mb3Muc2l6ZSgpICk7CisgICAgUGlwZWxpbmUqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGlwZWxpbmUqPiggcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oIHBpcGVsaW5lcy5kYXRhKCkgKSArIGNyZWF0ZUluZm9zLnNpemUoKSAqICggc2l6ZW9mKCBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiApIC0gc2l6ZW9mKCBQaXBlbGluZSApICkgKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PihkLnZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgY3JlYXRlSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qPiggY3JlYXRlSW5mb3MuZGF0YSgpICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lKj4oIGJ1ZmZlciApICkgKTsKKyAgICBpZiAocmVzdWx0ID09IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZXN1bHQ6OmVTdWNjZXNzKQorICAgIHsKKyAgICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgICBmb3IgKCBzaXplX3QgaT0wIDsgaTxjcmVhdGVJbmZvcy5zaXplKCkgOyBpKysgKQorICAgICAgeworICAgICAgICBwaXBlbGluZXMucHVzaF9iYWNrKCBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiggYnVmZmVyW2ldLCBkZWxldGVyICkgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGlwZWxpbmVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkcgIjo6RGV2aWNlOjpjcmVhdGVDb21wdXRlUGlwZWxpbmVzVW5pcXVlIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFBpcGVsaW5lLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVDb21wdXRlUGlwZWxpbmVVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IENvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFBpcGVsaW5lIHBpcGVsaW5lOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgMSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lKj4oICZwaXBlbGluZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFBpcGVsaW5lLERpc3BhdGNoPiggcmVzdWx0LCBwaXBlbGluZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVDb21wdXRlUGlwZWxpbmVVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Y3JlYXRlRGVzY3JpcHRvclBvb2woIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sKiBwRGVzY3JpcHRvclBvb2wsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVEZXNjcmlwdG9yUG9vbCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclBvb2wqPiggcERlc2NyaXB0b3JQb29sICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sPjo6dHlwZSBEZXZpY2U6OmNyZWF0ZURlc2NyaXB0b3JQb29sKCBjb25zdCBEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbDsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlc2NyaXB0b3JQb29sKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbCo+KCAmZGVzY3JpcHRvclBvb2wgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGRlc2NyaXB0b3JQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZURlc2NyaXB0b3JQb29sIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPERlc2NyaXB0b3JQb29sLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVEZXNjcmlwdG9yUG9vbFVuaXF1ZSggY29uc3QgRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2w7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVEZXNjcmlwdG9yUG9vbCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclBvb2wqPiggJmRlc2NyaXB0b3JQb29sICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8RGVzY3JpcHRvclBvb2wsRGlzcGF0Y2g+KCByZXN1bHQsIGRlc2NyaXB0b3JQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZURlc2NyaXB0b3JQb29sVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dCo+KCBwU2V0TGF5b3V0ICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXQ+Ojp0eXBlIERldmljZTo6Y3JlYXRlRGVzY3JpcHRvclNldExheW91dCggY29uc3QgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0IHNldExheW91dDsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dCo+KCAmc2V0TGF5b3V0ICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzZXRMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlRGVzY3JpcHRvclNldExheW91dCIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxEZXNjcmlwdG9yU2V0TGF5b3V0LERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0VW5pcXVlKCBjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXQgc2V0TGF5b3V0OworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0Kj4oICZzZXRMYXlvdXQgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxEZXNjcmlwdG9yU2V0TGF5b3V0LERpc3BhdGNoPiggcmVzdWx0LCBzZXRMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlRGVzY3JpcHRvclNldExheW91dFVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqPiggcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU+Ojp0eXBlIERldmljZTo6Y3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCBjb25zdCBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSo+KCAmZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVW5pcXVlKCBjb25zdCBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSo+KCAmZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLERpc3BhdGNoPiggcmVzdWx0LCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSo+KCBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZT46OnR5cGUgRGV2aWNlOjpjcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoIGNvbnN0IERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKj4oICZkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFJVbmlxdWUoIGNvbnN0IERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKj4oICZkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsRGlzcGF0Y2g+KCByZXN1bHQsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFJVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Y3JlYXRlRXZlbnQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50KiBwRXZlbnQsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVFdmVudCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtFdmVudENyZWF0ZUluZm8qPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrRXZlbnQqPiggcEV2ZW50ICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZUV2ZW50KCBjb25zdCBFdmVudENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudDsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUV2ZW50KCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFdmVudCo+KCAmZXZlbnQgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGV2ZW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZUV2ZW50IiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEV2ZW50LERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVFdmVudFVuaXF1ZSggY29uc3QgRXZlbnRDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQ7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVFdmVudCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtFdmVudENyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRXZlbnQqPiggJmV2ZW50ICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8RXZlbnQsRGlzcGF0Y2g+KCByZXN1bHQsIGV2ZW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZUV2ZW50VW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZUZlbmNlKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSogcEZlbmNlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRmVuY2UoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ZlbmNlKj4oIHBGZW5jZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZT46OnR5cGUgRGV2aWNlOjpjcmVhdGVGZW5jZSggY29uc3QgRmVuY2VDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVGZW5jZSggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRmVuY2UqPiggJmZlbmNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBmZW5jZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVGZW5jZSIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxGZW5jZSxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlRmVuY2VVbmlxdWUoIGNvbnN0IEZlbmNlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRmVuY2UoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ZlbmNlKj4oICZmZW5jZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPEZlbmNlLERpc3BhdGNoPiggcmVzdWx0LCBmZW5jZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVGZW5jZVVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVGcmFtZWJ1ZmZlciggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXIqIHBGcmFtZWJ1ZmZlciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUZyYW1lYnVmZmVyKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGcmFtZWJ1ZmZlcio+KCBwRnJhbWVidWZmZXIgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RnJhbWVidWZmZXI+Ojp0eXBlIERldmljZTo6Y3JlYXRlRnJhbWVidWZmZXIoIGNvbnN0IEZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRnJhbWVidWZmZXIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ZyYW1lYnVmZmVyKj4oICZmcmFtZWJ1ZmZlciApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZnJhbWVidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlRnJhbWVidWZmZXIiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8RnJhbWVidWZmZXIsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZUZyYW1lYnVmZmVyVW5pcXVlKCBjb25zdCBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUZyYW1lYnVmZmVyKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGcmFtZWJ1ZmZlcio+KCAmZnJhbWVidWZmZXIgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxGcmFtZWJ1ZmZlcixEaXNwYXRjaD4oIHJlc3VsdCwgZnJhbWVidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlRnJhbWVidWZmZXJVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Y3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUqIHBQaXBlbGluZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgY3JlYXRlSW5mb0NvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qPiggcENyZWF0ZUluZm9zICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lKj4oIHBQaXBlbGluZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBpcGVsaW5lLEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Y3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxQaXBlbGluZSxBbGxvY2F0b3I+IHBpcGVsaW5lcyggY3JlYXRlSW5mb3Muc2l6ZSgpICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgY3JlYXRlSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKj4oIGNyZWF0ZUluZm9zLmRhdGEoKSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZSo+KCBwaXBlbGluZXMuZGF0YSgpICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaXBlbGluZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBpcGVsaW5lLEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Y3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGlwZWxpbmUsQWxsb2NhdG9yPiBwaXBlbGluZXMoIGNyZWF0ZUluZm9zLnNpemUoKSwgdmVjdG9yQWxsb2NhdG9yICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgY3JlYXRlSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKj4oIGNyZWF0ZUluZm9zLmRhdGEoKSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZSo+KCBwaXBlbGluZXMuZGF0YSgpICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaXBlbGluZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxQaXBlbGluZT46OnR5cGUgRGV2aWNlOjpjcmVhdGVHcmFwaGljc1BpcGVsaW5lKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBjb25zdCBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUGlwZWxpbmUgcGlwZWxpbmU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgMSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZSo+KCAmcGlwZWxpbmUgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHBpcGVsaW5lLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVHcmFwaGljc1BpcGVsaW5lc1VuaXF1ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6R3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8+IGNyZWF0ZUluZm9zLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmUgKSA8PSBzaXplb2YoIFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+ICksICJQaXBlbGluZSBpcyBncmVhdGVyIHRoYW4gVW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4hIiApOworICAgIHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+LCBBbGxvY2F0b3I+IHBpcGVsaW5lczsKKyAgICBwaXBlbGluZXMucmVzZXJ2ZSggY3JlYXRlSW5mb3Muc2l6ZSgpICk7CisgICAgUGlwZWxpbmUqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGlwZWxpbmUqPiggcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oIHBpcGVsaW5lcy5kYXRhKCkgKSArIGNyZWF0ZUluZm9zLnNpemUoKSAqICggc2l6ZW9mKCBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiApIC0gc2l6ZW9mKCBQaXBlbGluZSApICkgKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PihkLnZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBwaXBlbGluZUNhY2hlICksIGNyZWF0ZUluZm9zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyo+KCBjcmVhdGVJbmZvcy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmUqPiggYnVmZmVyICkgKSApOworICAgIGlmIChyZXN1bHQgPT0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc3VsdDo6ZVN1Y2Nlc3MpCisgICAgeworICAgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICAgIGZvciAoIHNpemVfdCBpPTAgOyBpPGNyZWF0ZUluZm9zLnNpemUoKSA7IGkrKyApCisgICAgICB7CisgICAgICAgIHBpcGVsaW5lcy5wdXNoX2JhY2soIFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+KCBidWZmZXJbaV0sIGRlbGV0ZXIgKSApOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaXBlbGluZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpEZXZpY2U6OmNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzVW5pcXVlIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxVbmlxdWVIYW5kbGU8UGlwZWxpbmUsRGlzcGF0Y2g+LEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Y3JlYXRlR3JhcGhpY3NQaXBlbGluZXNVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZSApIDw9IHNpemVvZiggVW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4gKSwgIlBpcGVsaW5lIGlzIGdyZWF0ZXIgdGhhbiBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiEiICk7CisgICAgc3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4sIEFsbG9jYXRvcj4gcGlwZWxpbmVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICBwaXBlbGluZXMucmVzZXJ2ZSggY3JlYXRlSW5mb3Muc2l6ZSgpICk7CisgICAgUGlwZWxpbmUqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGlwZWxpbmUqPiggcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oIHBpcGVsaW5lcy5kYXRhKCkgKSArIGNyZWF0ZUluZm9zLnNpemUoKSAqICggc2l6ZW9mKCBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiApIC0gc2l6ZW9mKCBQaXBlbGluZSApICkgKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PihkLnZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBwaXBlbGluZUNhY2hlICksIGNyZWF0ZUluZm9zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyo+KCBjcmVhdGVJbmZvcy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmUqPiggYnVmZmVyICkgKSApOworICAgIGlmIChyZXN1bHQgPT0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc3VsdDo6ZVN1Y2Nlc3MpCisgICAgeworICAgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICAgIGZvciAoIHNpemVfdCBpPTAgOyBpPGNyZWF0ZUluZm9zLnNpemUoKSA7IGkrKyApCisgICAgICB7CisgICAgICAgIHBpcGVsaW5lcy5wdXNoX2JhY2soIFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+KCBidWZmZXJbaV0sIGRlbGV0ZXIgKSApOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaXBlbGluZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpEZXZpY2U6OmNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzVW5pcXVlIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFBpcGVsaW5lLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVHcmFwaGljc1BpcGVsaW5lVW5pcXVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBjb25zdCBHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUGlwZWxpbmUgcGlwZWxpbmU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgMSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZSo+KCAmcGlwZWxpbmUgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxQaXBlbGluZSxEaXNwYXRjaD4oIHJlc3VsdCwgcGlwZWxpbmUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlR3JhcGhpY3NQaXBlbGluZVVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVJbWFnZSggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UqIHBJbWFnZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUltYWdlKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZSo+KCBwSW1hZ2UgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2U+Ojp0eXBlIERldmljZTo6Y3JlYXRlSW1hZ2UoIGNvbnN0IEltYWdlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlSW1hZ2UoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlKj4oICZpbWFnZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlSW1hZ2UiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8SW1hZ2UsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZUltYWdlVW5pcXVlKCBjb25zdCBJbWFnZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUltYWdlKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZSo+KCAmaW1hZ2UgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxJbWFnZSxEaXNwYXRjaD4oIHJlc3VsdCwgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlSW1hZ2VVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Y3JlYXRlSW1hZ2VWaWV3KCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3KiBwVmlldywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUltYWdlVmlldyggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlVmlldyo+KCBwVmlldyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXc+Ojp0eXBlIERldmljZTo6Y3JlYXRlSW1hZ2VWaWV3KCBjb25zdCBJbWFnZVZpZXdDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3IHZpZXc7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVJbWFnZVZpZXcoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVZpZXcqPiggJnZpZXcgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHZpZXcsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlSW1hZ2VWaWV3IiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEltYWdlVmlldyxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlSW1hZ2VWaWV3VW5pcXVlKCBjb25zdCBJbWFnZVZpZXdDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3IHZpZXc7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVJbWFnZVZpZXcoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVZpZXcqPiggJnZpZXcgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxJbWFnZVZpZXcsRGlzcGF0Y2g+KCByZXN1bHQsIHZpZXcsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlSW1hZ2VWaWV3VW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqPiggcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWD46OnR5cGUgRGV2aWNlOjpjcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKCBjb25zdCBJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaW5kaXJlY3RDb21tYW5kc0xheW91dDsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCo+KCAmaW5kaXJlY3RDb21tYW5kc0xheW91dCApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgaW5kaXJlY3RDb21tYW5kc0xheW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlhVbmlxdWUoIGNvbnN0IEluZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0OworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKj4oICZpbmRpcmVjdENvbW1hbmRzTGF5b3V0ICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCxEaXNwYXRjaD4oIHJlc3VsdCwgaW5kaXJlY3RDb21tYW5kc0xheW91dCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZU9iamVjdFRhYmxlTlZYKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZU5WWCogcE9iamVjdFRhYmxlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlT2JqZWN0VGFibGVOVlgoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa09iamVjdFRhYmxlTlZYKj4oIHBPYmplY3RUYWJsZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZU5WWD46OnR5cGUgRGV2aWNlOjpjcmVhdGVPYmplY3RUYWJsZU5WWCggY29uc3QgT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVPYmplY3RUYWJsZU5WWCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrT2JqZWN0VGFibGVOVlgqPiggJm9iamVjdFRhYmxlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBvYmplY3RUYWJsZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVPYmplY3RUYWJsZU5WWCIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxPYmplY3RUYWJsZU5WWCxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlT2JqZWN0VGFibGVOVlhVbmlxdWUoIGNvbnN0IE9iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlT2JqZWN0VGFibGVOVlgoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa09iamVjdFRhYmxlTlZYKj4oICZvYmplY3RUYWJsZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPE9iamVjdFRhYmxlTlZYLERpc3BhdGNoPiggcmVzdWx0LCBvYmplY3RUYWJsZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVPYmplY3RUYWJsZU5WWFVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVQaXBlbGluZUNhY2hlKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUqIHBQaXBlbGluZUNhY2hlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlUGlwZWxpbmVDYWNoZSggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUNhY2hlKj4oIHBQaXBlbGluZUNhY2hlICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGU+Ojp0eXBlIERldmljZTo6Y3JlYXRlUGlwZWxpbmVDYWNoZSggY29uc3QgUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVQaXBlbGluZUNhY2hlKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ2FjaGUqPiggJnBpcGVsaW5lQ2FjaGUgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHBpcGVsaW5lQ2FjaGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlUGlwZWxpbmVDYWNoZSIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxQaXBlbGluZUNhY2hlLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVQaXBlbGluZUNhY2hlVW5pcXVlKCBjb25zdCBQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVBpcGVsaW5lQ2FjaGUoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVDYWNoZSo+KCAmcGlwZWxpbmVDYWNoZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFBpcGVsaW5lQ2FjaGUsRGlzcGF0Y2g+KCByZXN1bHQsIHBpcGVsaW5lQ2FjaGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlUGlwZWxpbmVDYWNoZVVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVQaXBlbGluZUxheW91dCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQqIHBQaXBlbGluZUxheW91dCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUxheW91dCo+KCBwUGlwZWxpbmVMYXlvdXQgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQ+Ojp0eXBlIERldmljZTo6Y3JlYXRlUGlwZWxpbmVMYXlvdXQoIGNvbnN0IFBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lTGF5b3V0IHBpcGVsaW5lTGF5b3V0OworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lTGF5b3V0Kj4oICZwaXBlbGluZUxheW91dCApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGlwZWxpbmVMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlUGlwZWxpbmVMYXlvdXQiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8UGlwZWxpbmVMYXlvdXQsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVBpcGVsaW5lTGF5b3V0VW5pcXVlKCBjb25zdCBQaXBlbGluZUxheW91dENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dDsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUxheW91dCo+KCAmcGlwZWxpbmVMYXlvdXQgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxQaXBlbGluZUxheW91dCxEaXNwYXRjaD4oIHJlc3VsdCwgcGlwZWxpbmVMYXlvdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlUGlwZWxpbmVMYXlvdXRVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Y3JlYXRlUXVlcnlQb29sKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sKiBwUXVlcnlQb29sLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlUXVlcnlQb29sKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrUXVlcnlQb29sKj4oIHBRdWVyeVBvb2wgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sPjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVF1ZXJ5UG9vbCggY29uc3QgUXVlcnlQb29sQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2w7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVRdWVyeVBvb2woIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWVyeVBvb2wqPiggJnF1ZXJ5UG9vbCApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcXVlcnlQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVF1ZXJ5UG9vbCIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxRdWVyeVBvb2wsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVF1ZXJ5UG9vbFVuaXF1ZSggY29uc3QgUXVlcnlQb29sQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2w7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVRdWVyeVBvb2woIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWVyeVBvb2wqPiggJnF1ZXJ5UG9vbCApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFF1ZXJ5UG9vbCxEaXNwYXRjaD4oIHJlc3VsdCwgcXVlcnlQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVF1ZXJ5UG9vbFVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm9zLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lKiBwUGlwZWxpbmVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCBjcmVhdGVJbmZvQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqPiggcENyZWF0ZUluZm9zICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lKj4oIHBQaXBlbGluZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBpcGVsaW5lLEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Y3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY+IGNyZWF0ZUluZm9zLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFBpcGVsaW5lLEFsbG9jYXRvcj4gcGlwZWxpbmVzKCBjcmVhdGVJbmZvcy5zaXplKCkgKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgY3JlYXRlSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVio+KCBjcmVhdGVJbmZvcy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmUqPiggcGlwZWxpbmVzLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGlwZWxpbmVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmUsQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVj4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFBpcGVsaW5lLEFsbG9jYXRvcj4gcGlwZWxpbmVzKCBjcmVhdGVJbmZvcy5zaXplKCksIHZlY3RvckFsbG9jYXRvciApOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCBjcmVhdGVJbmZvcy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKj4oIGNyZWF0ZUluZm9zLmRhdGEoKSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZSo+KCBwaXBlbGluZXMuZGF0YSgpICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaXBlbGluZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8UGlwZWxpbmU+Ojp0eXBlIERldmljZTo6Y3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IFJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUGlwZWxpbmUgcGlwZWxpbmU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBwaXBlbGluZUNhY2hlICksIDEgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lKj4oICZwaXBlbGluZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGlwZWxpbmUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lTlYiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlZVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVj4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBQaXBlbGluZSApIDw9IHNpemVvZiggVW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4gKSwgIlBpcGVsaW5lIGlzIGdyZWF0ZXIgdGhhbiBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiEiICk7CisgICAgc3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4sIEFsbG9jYXRvcj4gcGlwZWxpbmVzOworICAgIHBpcGVsaW5lcy5yZXNlcnZlKCBjcmVhdGVJbmZvcy5zaXplKCkgKTsKKyAgICBQaXBlbGluZSogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQaXBlbGluZSo+KCByZWludGVycHJldF9jYXN0PGNoYXIqPiggcGlwZWxpbmVzLmRhdGEoKSApICsgY3JlYXRlSW5mb3Muc2l6ZSgpICogKCBzaXplb2YoIFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+ICkgLSBzaXplb2YoIFBpcGVsaW5lICkgKSApOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KGQudmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBwaXBlbGluZUNhY2hlICksIGNyZWF0ZUluZm9zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqPiggY3JlYXRlSW5mb3MuZGF0YSgpICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lKj4oIGJ1ZmZlciApICkgKTsKKyAgICBpZiAocmVzdWx0ID09IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZXN1bHQ6OmVTdWNjZXNzKQorICAgIHsKKyAgICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgICBmb3IgKCBzaXplX3QgaT0wIDsgaTxjcmVhdGVJbmZvcy5zaXplKCkgOyBpKysgKQorICAgICAgeworICAgICAgICBwaXBlbGluZXMucHVzaF9iYWNrKCBVbmlxdWVIYW5kbGU8UGlwZWxpbmUsIERpc3BhdGNoPiggYnVmZmVyW2ldLCBkZWxldGVyICkgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGlwZWxpbmVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkcgIjo6RGV2aWNlOjpjcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlZVbmlxdWUiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlZVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVj4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0YXRpY19hc3NlcnQoIHNpemVvZiggUGlwZWxpbmUgKSA8PSBzaXplb2YoIFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+ICksICJQaXBlbGluZSBpcyBncmVhdGVyIHRoYW4gVW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4hIiApOworICAgIHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+LCBBbGxvY2F0b3I+IHBpcGVsaW5lcyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgcGlwZWxpbmVzLnJlc2VydmUoIGNyZWF0ZUluZm9zLnNpemUoKSApOworICAgIFBpcGVsaW5lKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PFBpcGVsaW5lKj4oIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCBwaXBlbGluZXMuZGF0YSgpICkgKyBjcmVhdGVJbmZvcy5zaXplKCkgKiAoIHNpemVvZiggVW5pcXVlSGFuZGxlPFBpcGVsaW5lLCBEaXNwYXRjaD4gKSAtIHNpemVvZiggUGlwZWxpbmUgKSApICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oZC52a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgY3JlYXRlSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVio+KCBjcmVhdGVJbmZvcy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmUqPiggYnVmZmVyICkgKSApOworICAgIGlmIChyZXN1bHQgPT0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc3VsdDo6ZVN1Y2Nlc3MpCisgICAgeworICAgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICAgIGZvciAoIHNpemVfdCBpPTAgOyBpPGNyZWF0ZUluZm9zLnNpemUoKSA7IGkrKyApCisgICAgICB7CisgICAgICAgIHBpcGVsaW5lcy5wdXNoX2JhY2soIFVuaXF1ZUhhbmRsZTxQaXBlbGluZSwgRGlzcGF0Y2g+KCBidWZmZXJbaV0sIGRlbGV0ZXIgKSApOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaXBlbGluZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpEZXZpY2U6OmNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVlVuaXF1ZSIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxQaXBlbGluZSxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lTlZVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IFJheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUGlwZWxpbmUgcGlwZWxpbmU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBwaXBlbGluZUNhY2hlICksIDEgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lKj4oICZwaXBlbGluZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFBpcGVsaW5lLERpc3BhdGNoPiggcmVzdWx0LCBwaXBlbGluZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVOVlVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVSZW5kZXJQYXNzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzc0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MqIHBSZW5kZXJQYXNzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlUmVuZGVyUGFzcyggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzKj4oIHBSZW5kZXJQYXNzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3M+Ojp0eXBlIERldmljZTo6Y3JlYXRlUmVuZGVyUGFzcyggY29uc3QgUmVuZGVyUGFzc0NyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3M7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVSZW5kZXJQYXNzKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3MqPiggJnJlbmRlclBhc3MgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHJlbmRlclBhc3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlUmVuZGVyUGFzcyIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxSZW5kZXJQYXNzLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVSZW5kZXJQYXNzVW5pcXVlKCBjb25zdCBSZW5kZXJQYXNzQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVJlbmRlclBhc3MoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzcyo+KCAmcmVuZGVyUGFzcyApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFJlbmRlclBhc3MsRGlzcGF0Y2g+KCByZXN1bHQsIHJlbmRlclBhc3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlUmVuZGVyUGFzc1VuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVSZW5kZXJQYXNzMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyogcFJlbmRlclBhc3MsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVSZW5kZXJQYXNzMktIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzcyo+KCBwUmVuZGVyUGFzcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzPjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVJlbmRlclBhc3MyS0hSKCBjb25zdCBSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3M7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVSZW5kZXJQYXNzMktIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzcyo+KCAmcmVuZGVyUGFzcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcmVuZGVyUGFzcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVSZW5kZXJQYXNzMktIUiIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxSZW5kZXJQYXNzLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVSZW5kZXJQYXNzMktIUlVuaXF1ZSggY29uc3QgUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3MqPiggJnJlbmRlclBhc3MgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxSZW5kZXJQYXNzLERpc3BhdGNoPiggcmVzdWx0LCByZW5kZXJQYXNzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVJlbmRlclBhc3MyS0hSVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZVNhbXBsZXIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciogcFNhbXBsZXIsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTYW1wbGVyKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXIqPiggcFNhbXBsZXIgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlcj46OnR5cGUgRGV2aWNlOjpjcmVhdGVTYW1wbGVyKCBjb25zdCBTYW1wbGVyQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXIgc2FtcGxlcjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVNhbXBsZXIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU2FtcGxlcio+KCAmc2FtcGxlciApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc2FtcGxlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVTYW1wbGVyIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFNhbXBsZXIsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVNhbXBsZXJVbmlxdWUoIGNvbnN0IFNhbXBsZXJDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciBzYW1wbGVyOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlU2FtcGxlciggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTYW1wbGVyKj4oICZzYW1wbGVyICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U2FtcGxlcixEaXNwYXRjaD4oIHJlc3VsdCwgc2FtcGxlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVTYW1wbGVyVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiogcFljYmNyQ29udmVyc2lvbiwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrU2FtcGxlclljYmNyQ29udmVyc2lvbio+KCBwWWNiY3JDb252ZXJzaW9uICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24+Ojp0eXBlIERldmljZTo6Y3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiggY29uc3QgU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyQ29udmVyc2lvbjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU2FtcGxlclljYmNyQ29udmVyc2lvbio+KCAmeWNiY3JDb252ZXJzaW9uICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCB5Y2JjckNvbnZlcnNpb24sIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTYW1wbGVyWWNiY3JDb252ZXJzaW9uLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uVW5pcXVlKCBjb25zdCBTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKj4oICZ5Y2JjckNvbnZlcnNpb24gKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxTYW1wbGVyWWNiY3JDb252ZXJzaW9uLERpc3BhdGNoPiggcmVzdWx0LCB5Y2JjckNvbnZlcnNpb24sIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvblVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24qIHBZY2JjckNvbnZlcnNpb24sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qPiggcFljYmNyQ29udmVyc2lvbiApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uPjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIGNvbnN0IFNhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb247CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qPiggJnljYmNyQ29udmVyc2lvbiApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgeWNiY3JDb252ZXJzaW9uLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U2FtcGxlclljYmNyQ29udmVyc2lvbixEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUlVuaXF1ZSggY29uc3QgU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyQ29udmVyc2lvbjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU2FtcGxlclljYmNyQ29udmVyc2lvbio+KCAmeWNiY3JDb252ZXJzaW9uICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U2FtcGxlclljYmNyQ29udmVyc2lvbixEaXNwYXRjaD4oIHJlc3VsdCwgeWNiY3JDb252ZXJzaW9uLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFJVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Y3JlYXRlU2VtYXBob3JlKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlKiBwU2VtYXBob3JlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlU2VtYXBob3JlKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrU2VtYXBob3JlKj4oIHBTZW1hcGhvcmUgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlPjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVNlbWFwaG9yZSggY29uc3QgU2VtYXBob3JlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTZW1hcGhvcmUoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmUqPiggJnNlbWFwaG9yZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc2VtYXBob3JlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVNlbWFwaG9yZSIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTZW1hcGhvcmUsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVNlbWFwaG9yZVVuaXF1ZSggY29uc3QgU2VtYXBob3JlQ3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTZW1hcGhvcmUoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmUqPiggJnNlbWFwaG9yZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFNlbWFwaG9yZSxEaXNwYXRjaD4oIHJlc3VsdCwgc2VtYXBob3JlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVNlbWFwaG9yZVVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpjcmVhdGVTaGFkZXJNb2R1bGUoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGUqIHBTaGFkZXJNb2R1bGUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTaGFkZXJNb2R1bGUoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTaGFkZXJNb2R1bGUqPiggcFNoYWRlck1vZHVsZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGU+Ojp0eXBlIERldmljZTo6Y3JlYXRlU2hhZGVyTW9kdWxlKCBjb25zdCBTaGFkZXJNb2R1bGVDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVNoYWRlck1vZHVsZSggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1NoYWRlck1vZHVsZSo+KCAmc2hhZGVyTW9kdWxlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzaGFkZXJNb2R1bGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlU2hhZGVyTW9kdWxlIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFNoYWRlck1vZHVsZSxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6Y3JlYXRlU2hhZGVyTW9kdWxlVW5pcXVlKCBjb25zdCBTaGFkZXJNb2R1bGVDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVNoYWRlck1vZHVsZSggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1NoYWRlck1vZHVsZSo+KCAmc2hhZGVyTW9kdWxlICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U2hhZGVyTW9kdWxlLERpc3BhdGNoPiggcmVzdWx0LCBzaGFkZXJNb2R1bGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlU2hhZGVyTW9kdWxlVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm9zLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiogcFN3YXBjaGFpbnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKCBtX2RldmljZSwgc3dhcGNoYWluQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKj4oIHBDcmVhdGVJbmZvcyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTd2FwY2hhaW5LSFIqPiggcFN3YXBjaGFpbnMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFN3YXBjaGFpbktIUixBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbkNyZWF0ZUluZm9LSFI+IGNyZWF0ZUluZm9zLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFN3YXBjaGFpbktIUixBbGxvY2F0b3I+IHN3YXBjaGFpbnMoIGNyZWF0ZUluZm9zLnNpemUoKSApOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiggbV9kZXZpY2UsIGNyZWF0ZUluZm9zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKj4oIGNyZWF0ZUluZm9zLmRhdGEoKSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTd2FwY2hhaW5LSFIqPiggc3dhcGNoYWlucy5kYXRhKCkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN3YXBjaGFpbnMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8U3dhcGNoYWluS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Y3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ3JlYXRlSW5mb0tIUj4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFN3YXBjaGFpbktIUixBbGxvY2F0b3I+IHN3YXBjaGFpbnMoIGNyZWF0ZUluZm9zLnNpemUoKSwgdmVjdG9yQWxsb2NhdG9yICk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKCBtX2RldmljZSwgY3JlYXRlSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqPiggY3JlYXRlSW5mb3MuZGF0YSgpICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N3YXBjaGFpbktIUio+KCBzd2FwY2hhaW5zLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc3dhcGNoYWlucywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8U3dhcGNoYWluS0hSPjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVNoYXJlZFN3YXBjaGFpbktIUiggY29uc3QgU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgU3dhcGNoYWluS0hSIHN3YXBjaGFpbjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoIG1fZGV2aWNlLCAxICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3dhcGNoYWluS0hSKj4oICZzd2FwY2hhaW4gKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN3YXBjaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVTaGFyZWRTd2FwY2hhaW5LSFIiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsRGlzcGF0Y2g+LEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Y3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUlVuaXF1ZSggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluQ3JlYXRlSW5mb0tIUj4gY3JlYXRlSW5mb3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTd2FwY2hhaW5LSFIgKSA8PSBzaXplb2YoIFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsIERpc3BhdGNoPiApLCAiU3dhcGNoYWluS0hSIGlzIGdyZWF0ZXIgdGhhbiBVbmlxdWVIYW5kbGU8U3dhcGNoYWluS0hSLCBEaXNwYXRjaD4hIiApOworICAgIHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsIERpc3BhdGNoPiwgQWxsb2NhdG9yPiBzd2FwY2hhaW5LSFJzOworICAgIHN3YXBjaGFpbktIUnMucmVzZXJ2ZSggY3JlYXRlSW5mb3Muc2l6ZSgpICk7CisgICAgU3dhcGNoYWluS0hSKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PFN3YXBjaGFpbktIUio+KCByZWludGVycHJldF9jYXN0PGNoYXIqPiggc3dhcGNoYWluS0hScy5kYXRhKCkgKSArIGNyZWF0ZUluZm9zLnNpemUoKSAqICggc2l6ZW9mKCBVbmlxdWVIYW5kbGU8U3dhcGNoYWluS0hSLCBEaXNwYXRjaD4gKSAtIHNpemVvZiggU3dhcGNoYWluS0hSICkgKSApOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KGQudmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKCBtX2RldmljZSwgY3JlYXRlSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqPiggY3JlYXRlSW5mb3MuZGF0YSgpICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N3YXBjaGFpbktIUio+KCBidWZmZXIgKSApICk7CisgICAgaWYgKHJlc3VsdCA9PSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVzdWx0OjplU3VjY2VzcykKKyAgICB7CisgICAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgICAgZm9yICggc2l6ZV90IGk9MCA7IGk8Y3JlYXRlSW5mb3Muc2l6ZSgpIDsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgc3dhcGNoYWluS0hScy5wdXNoX2JhY2soIFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsIERpc3BhdGNoPiggYnVmZmVyW2ldLCBkZWxldGVyICkgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc3dhcGNoYWluS0hScywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HICI6OkRldmljZTo6Y3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUlVuaXF1ZSIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8VW5pcXVlSGFuZGxlPFN3YXBjaGFpbktIUixEaXNwYXRjaD4sQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSVW5pcXVlKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPiBjcmVhdGVJbmZvcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKCBTd2FwY2hhaW5LSFIgKSA8PSBzaXplb2YoIFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsIERpc3BhdGNoPiApLCAiU3dhcGNoYWluS0hSIGlzIGdyZWF0ZXIgdGhhbiBVbmlxdWVIYW5kbGU8U3dhcGNoYWluS0hSLCBEaXNwYXRjaD4hIiApOworICAgIHN0ZDo6dmVjdG9yPFVuaXF1ZUhhbmRsZTxTd2FwY2hhaW5LSFIsIERpc3BhdGNoPiwgQWxsb2NhdG9yPiBzd2FwY2hhaW5LSFJzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICBzd2FwY2hhaW5LSFJzLnJlc2VydmUoIGNyZWF0ZUluZm9zLnNpemUoKSApOworICAgIFN3YXBjaGFpbktIUiogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxTd2FwY2hhaW5LSFIqPiggcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oIHN3YXBjaGFpbktIUnMuZGF0YSgpICkgKyBjcmVhdGVJbmZvcy5zaXplKCkgKiAoIHNpemVvZiggVW5pcXVlSGFuZGxlPFN3YXBjaGFpbktIUiwgRGlzcGF0Y2g+ICkgLSBzaXplb2YoIFN3YXBjaGFpbktIUiApICkgKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PihkLnZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiggbV9kZXZpY2UsIGNyZWF0ZUluZm9zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKj4oIGNyZWF0ZUluZm9zLmRhdGEoKSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTd2FwY2hhaW5LSFIqPiggYnVmZmVyICkgKSApOworICAgIGlmIChyZXN1bHQgPT0gVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlc3VsdDo6ZVN1Y2Nlc3MpCisgICAgeworICAgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICAgIGZvciAoIHNpemVfdCBpPTAgOyBpPGNyZWF0ZUluZm9zLnNpemUoKSA7IGkrKyApCisgICAgICB7CisgICAgICAgIHN3YXBjaGFpbktIUnMucHVzaF9iYWNrKCBVbmlxdWVIYW5kbGU8U3dhcGNoYWluS0hSLCBEaXNwYXRjaD4oIGJ1ZmZlcltpXSwgZGVsZXRlciApICk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN3YXBjaGFpbktIUnMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpEZXZpY2U6OmNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFJVbmlxdWUiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3dhcGNoYWluS0hSLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVTaGFyZWRTd2FwY2hhaW5LSFJVbmlxdWUoIGNvbnN0IFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFN3YXBjaGFpbktIUiBzd2FwY2hhaW47CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKCBtX2RldmljZSwgMSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N3YXBjaGFpbktIUio+KCAmc3dhcGNoYWluICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxEZXZpY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U3dhcGNoYWluS0hSLERpc3BhdGNoPiggcmVzdWx0LCBzd2FwY2hhaW4sIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Y3JlYXRlU2hhcmVkU3dhcGNoYWluS0hSVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmNyZWF0ZVN3YXBjaGFpbktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiogcFN3YXBjaGFpbiwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVN3YXBjaGFpbktIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N3YXBjaGFpbktIUio+KCBwU3dhcGNoYWluICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUj46OnR5cGUgRGV2aWNlOjpjcmVhdGVTd2FwY2hhaW5LSFIoIGNvbnN0IFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlU3dhcGNoYWluS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3dhcGNoYWluS0hSKj4oICZzd2FwY2hhaW4gKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN3YXBjaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVTd2FwY2hhaW5LSFIiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3dhcGNoYWluS0hSLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpjcmVhdGVTd2FwY2hhaW5LSFJVbmlxdWUoIGNvbnN0IFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlU3dhcGNoYWluS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3dhcGNoYWluS0hSKj4oICZzd2FwY2hhaW4gKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxTd2FwY2hhaW5LSFIsRGlzcGF0Y2g+KCByZXN1bHQsIHN3YXBjaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpjcmVhdGVTd2FwY2hhaW5LSFJVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Y3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUKiBwVmFsaWRhdGlvbkNhY2hlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrVmFsaWRhdGlvbkNhY2hlRVhUKj4oIHBWYWxpZGF0aW9uQ2FjaGUgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUPjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCggY29uc3QgVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVFWFQqPiggJnZhbGlkYXRpb25DYWNoZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgdmFsaWRhdGlvbkNhY2hlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxWYWxpZGF0aW9uQ2FjaGVFWFQsRGlzcGF0Y2g+Pjo6dHlwZSBEZXZpY2U6OmNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVFVuaXF1ZSggY29uc3QgVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVFWFQqPiggJnZhbGlkYXRpb25DYWNoZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8RGV2aWNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFZhbGlkYXRpb25DYWNoZUVYVCxEaXNwYXRjaD4oIHJlc3VsdCwgdmFsaWRhdGlvbkNhY2hlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVFVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpkZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiBwTmFtZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCo+KCBwTmFtZUluZm8gKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCggY29uc3QgRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCAmIG5hbWVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKj4oICZuYW1lSW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpkZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6ZGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQqIHBUYWdJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKj4oIHBUYWdJbmZvICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgRGV2aWNlOjpkZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCggY29uc3QgRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUICYgdGFnSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQqPiggJnRhZ0luZm8gKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6ZGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4oIGFjY2VsZXJhdGlvblN0cnVjdHVyZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiggYWNjZWxlcmF0aW9uU3RydWN0dXJlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiggYWNjZWxlcmF0aW9uU3RydWN0dXJlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiggYWNjZWxlcmF0aW9uU3RydWN0dXJlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95QnVmZmVyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUJ1ZmZlciggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveUJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUJ1ZmZlciggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyIGJ1ZmZlciwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUJ1ZmZlciggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUJ1ZmZlciggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95QnVmZmVyVmlldyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlclZpZXcgYnVmZmVyVmlldywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUJ1ZmZlclZpZXcoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0J1ZmZlclZpZXc+KCBidWZmZXJWaWV3ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveUJ1ZmZlclZpZXcoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJWaWV3IGJ1ZmZlclZpZXcsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUJ1ZmZlclZpZXcoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0J1ZmZlclZpZXc+KCBidWZmZXJWaWV3ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlldyBidWZmZXJWaWV3LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95QnVmZmVyVmlldyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQnVmZmVyVmlldz4oIGJ1ZmZlclZpZXcgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyVmlldyBidWZmZXJWaWV3LCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lCdWZmZXJWaWV3KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXJWaWV3PiggYnVmZmVyVmlldyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveUNvbW1hbmRQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lDb21tYW5kUG9vbCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQ29tbWFuZFBvb2w+KCBjb21tYW5kUG9vbCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lDb21tYW5kUG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lDb21tYW5kUG9vbCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQ29tbWFuZFBvb2w+KCBjb21tYW5kUG9vbCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95Q29tbWFuZFBvb2woIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sPiggY29tbWFuZFBvb2wgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUNvbW1hbmRQb29sKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbD4oIGNvbW1hbmRQb29sICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95RGVzY3JpcHRvclBvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JQb29sKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbD4oIGRlc2NyaXB0b3JQb29sICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveURlc2NyaXB0b3JQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JQb29sKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbD4oIGRlc2NyaXB0b3JQb29sICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclBvb2w+KCBkZXNjcmlwdG9yUG9vbCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RGVzY3JpcHRvclBvb2woIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JQb29sPiggZGVzY3JpcHRvclBvb2wgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dCBkZXNjcmlwdG9yU2V0TGF5b3V0LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclNldExheW91dD4oIGRlc2NyaXB0b3JTZXRMYXlvdXQgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95RGVzY3JpcHRvclNldExheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY3JpcHRvclNldExheW91dCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclNldExheW91dD4oIGRlc2NyaXB0b3JTZXRMYXlvdXQgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0IGRlc2NyaXB0b3JTZXRMYXlvdXQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0PiggZGVzY3JpcHRvclNldExheW91dCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0IGRlc2NyaXB0b3JTZXRMYXlvdXQsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXQ+KCBkZXNjcmlwdG9yU2V0TGF5b3V0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPiggZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPiggZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPiggZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPiggZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPiggZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPiggZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RGV2aWNlKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lEZXZpY2UoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveUV2ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lFdmVudCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRXZlbnQ+KCBldmVudCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lFdmVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50IGV2ZW50LCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lFdmVudCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRXZlbnQ+KCBldmVudCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50IGV2ZW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RXZlbnQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0V2ZW50PiggZXZlbnQgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUV2ZW50KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtFdmVudD4oIGV2ZW50ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95RmVuY2UoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUZlbmNlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtGZW5jZT4oIGZlbmNlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveUZlbmNlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2UsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUZlbmNlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtGZW5jZT4oIGZlbmNlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2UsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lGZW5jZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRmVuY2U+KCBmZW5jZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RmVuY2UoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ZlbmNlPiggZmVuY2UgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lGcmFtZWJ1ZmZlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RnJhbWVidWZmZXIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ZyYW1lYnVmZmVyPiggZnJhbWVidWZmZXIgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95RnJhbWVidWZmZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlciwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RnJhbWVidWZmZXIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ZyYW1lYnVmZmVyPiggZnJhbWVidWZmZXIgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlciwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUZyYW1lYnVmZmVyKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtGcmFtZWJ1ZmZlcj4oIGZyYW1lYnVmZmVyICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lGcmFtZWJ1ZmZlciggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRnJhbWVidWZmZXI+KCBmcmFtZWJ1ZmZlciApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveUltYWdlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lJbWFnZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBpbWFnZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lJbWFnZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lJbWFnZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBpbWFnZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95SW1hZ2UoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggaW1hZ2UgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUltYWdlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGltYWdlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95SW1hZ2VWaWV3KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3IGltYWdlVmlldywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUltYWdlVmlldyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2VWaWV3PiggaW1hZ2VWaWV3ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveUltYWdlVmlldyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlldyBpbWFnZVZpZXcsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUltYWdlVmlldyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2VWaWV3PiggaW1hZ2VWaWV3ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VWaWV3IGltYWdlVmlldywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUltYWdlVmlldyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2VWaWV3PiggaW1hZ2VWaWV3ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVmlldyBpbWFnZVZpZXcsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUltYWdlVmlldyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2VWaWV3PiggaW1hZ2VWaWV3ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaW5kaXJlY3RDb21tYW5kc0xheW91dCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg+KCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg+KCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWD4oIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPiggaW5kaXJlY3RDb21tYW5kc0xheW91dCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveU9iamVjdFRhYmxlTlZYKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrT2JqZWN0VGFibGVOVlg+KCBvYmplY3RUYWJsZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lPYmplY3RUYWJsZU5WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrT2JqZWN0VGFibGVOVlg+KCBvYmplY3RUYWJsZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95T2JqZWN0VGFibGVOVlgoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa09iamVjdFRhYmxlTlZYPiggb2JqZWN0VGFibGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveU9iamVjdFRhYmxlTlZYKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtPYmplY3RUYWJsZU5WWD4oIG9iamVjdFRhYmxlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95UGlwZWxpbmUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSBwaXBlbGluZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVBpcGVsaW5lKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZT4oIHBpcGVsaW5lICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveVBpcGVsaW5lKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVBpcGVsaW5lKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZT4oIHBpcGVsaW5lICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmUgcGlwZWxpbmUsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lQaXBlbGluZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmU+KCBwaXBlbGluZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSBwaXBlbGluZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UGlwZWxpbmUoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lPiggcGlwZWxpbmUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lQaXBlbGluZUNhY2hlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UGlwZWxpbmVDYWNoZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95UGlwZWxpbmVDYWNoZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UGlwZWxpbmVDYWNoZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDYWNoZT4oIHBpcGVsaW5lQ2FjaGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lQaXBlbGluZUNhY2hlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVBpcGVsaW5lQ2FjaGUoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBwaXBlbGluZUNhY2hlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95UGlwZWxpbmVMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUxheW91dD4oIHBpcGVsaW5lTGF5b3V0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveVBpcGVsaW5lTGF5b3V0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUxheW91dD4oIHBpcGVsaW5lTGF5b3V0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lQaXBlbGluZUxheW91dCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmVMYXlvdXQ+KCBwaXBlbGluZUxheW91dCApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UGlwZWxpbmVMYXlvdXQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lTGF5b3V0PiggcGlwZWxpbmVMYXlvdXQgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lRdWVyeVBvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UXVlcnlQb29sKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95UXVlcnlQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UXVlcnlQb29sKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWVyeVBvb2wgcXVlcnlQb29sLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UXVlcnlQb29sKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UXVlcnlQb29sKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lSZW5kZXJQYXNzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVuZGVyUGFzcyByZW5kZXJQYXNzLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UmVuZGVyUGFzcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUmVuZGVyUGFzcz4oIHJlbmRlclBhc3MgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95UmVuZGVyUGFzcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MgcmVuZGVyUGFzcywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95UmVuZGVyUGFzcyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUmVuZGVyUGFzcz4oIHJlbmRlclBhc3MgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3MsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lSZW5kZXJQYXNzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtSZW5kZXJQYXNzPiggcmVuZGVyUGFzcyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3MsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVJlbmRlclBhc3MoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1JlbmRlclBhc3M+KCByZW5kZXJQYXNzICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95U2FtcGxlciggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXIgc2FtcGxlciwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVNhbXBsZXIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1NhbXBsZXI+KCBzYW1wbGVyICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveVNhbXBsZXIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyIHNhbXBsZXIsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVNhbXBsZXIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1NhbXBsZXI+KCBzYW1wbGVyICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciBzYW1wbGVyLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2FtcGxlciggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU2FtcGxlcj4oIHNhbXBsZXIgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlciBzYW1wbGVyLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lTYW1wbGVyKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTYW1wbGVyPiggc2FtcGxlciApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyQ29udmVyc2lvbiwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24+KCB5Y2JjckNvbnZlcnNpb24gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uPiggeWNiY3JDb252ZXJzaW9uICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uPiggeWNiY3JDb252ZXJzaW9uICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uPiggeWNiY3JDb252ZXJzaW9uICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU2FtcGxlclljYmNyQ29udmVyc2lvbj4oIHljYmNyQ29udmVyc2lvbiApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24+KCB5Y2JjckNvbnZlcnNpb24gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lTZW1hcGhvcmUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2VtYXBob3JlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmU+KCBzZW1hcGhvcmUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95U2VtYXBob3JlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2VtYXBob3JlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmU+KCBzZW1hcGhvcmUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2VtYXBob3JlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmU+KCBzZW1hcGhvcmUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2VtYXBob3JlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmU+KCBzZW1hcGhvcmUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lTaGFkZXJNb2R1bGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGUgc2hhZGVyTW9kdWxlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2hhZGVyTW9kdWxlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJNb2R1bGU+KCBzaGFkZXJNb2R1bGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95U2hhZGVyTW9kdWxlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2hhZGVyTW9kdWxlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJNb2R1bGU+KCBzaGFkZXJNb2R1bGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJNb2R1bGUgc2hhZGVyTW9kdWxlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2hhZGVyTW9kdWxlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJNb2R1bGU+KCBzaGFkZXJNb2R1bGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U2hhZGVyTW9kdWxlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJNb2R1bGU+KCBzaGFkZXJNb2R1bGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lTd2FwY2hhaW5LSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U3dhcGNoYWluS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95U3dhcGNoYWluS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U3dhcGNoYWluS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U3dhcGNoYWluS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95U3dhcGNoYWluS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVFWFQ+KCB2YWxpZGF0aW9uQ2FjaGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVFWFQ+KCB2YWxpZGF0aW9uQ2FjaGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVFWFQ+KCB2YWxpZGF0aW9uQ2FjaGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVFWFQ+KCB2YWxpZGF0aW9uQ2FjaGUgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjp3YWl0SWRsZShEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRGV2aWNlV2FpdElkbGUoIG1fZGV2aWNlICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OndhaXRJZGxlKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRGV2aWNlV2FpdElkbGUoIG1fZGV2aWNlICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjp3YWl0SWRsZSIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpkaXNwbGF5UG93ZXJDb250cm9sRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBvd2VySW5mb0VYVCogcERpc3BsYXlQb3dlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtEaXNwbGF5UG93ZXJDb250cm9sRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEaXNwbGF5S0hSPiggZGlzcGxheSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCo+KCBwRGlzcGxheVBvd2VySW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6ZGlzcGxheVBvd2VyQ29udHJvbEVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgY29uc3QgRGlzcGxheVBvd2VySW5mb0VYVCAmIGRpc3BsYXlQb3dlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGlzcGxheUtIUj4oIGRpc3BsYXkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqPiggJmRpc3BsYXlQb3dlckluZm8gKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6ZGlzcGxheVBvd2VyQ29udHJvbEVYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpmbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyggdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoIG1fZGV2aWNlLCBtZW1vcnlSYW5nZUNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqPiggcE1lbW9yeVJhbmdlcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6Zmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hcHBlZE1lbW9yeVJhbmdlPiBtZW1vcnlSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoIG1fZGV2aWNlLCBtZW1vcnlSYW5nZXMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKj4oIG1lbW9yeVJhbmdlcy5kYXRhKCkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Zmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmZyZWVDb21tYW5kQnVmZmVycyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRnJlZUNvbW1hbmRCdWZmZXJzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbD4oIGNvbW1hbmRQb29sICksIGNvbW1hbmRCdWZmZXJDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbW1hbmRCdWZmZXIqPiggcENvbW1hbmRCdWZmZXJzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmZyZWVDb21tYW5kQnVmZmVycyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kQnVmZmVyPiBjb21tYW5kQnVmZmVycywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRnJlZUNvbW1hbmRCdWZmZXJzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbD4oIGNvbW1hbmRQb29sICksIGNvbW1hbmRCdWZmZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVyKj4oIGNvbW1hbmRCdWZmZXJzLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmZyZWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0ZyZWVDb21tYW5kQnVmZmVycyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQ29tbWFuZFBvb2w+KCBjb21tYW5kUG9vbCApLCBjb21tYW5kQnVmZmVyQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDb21tYW5kQnVmZmVyKj4oIHBDb21tYW5kQnVmZmVycyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpmcmVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRCdWZmZXI+IGNvbW1hbmRCdWZmZXJzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtGcmVlQ29tbWFuZEJ1ZmZlcnMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sPiggY29tbWFuZFBvb2wgKSwgY29tbWFuZEJ1ZmZlcnMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvbW1hbmRCdWZmZXIqPiggY29tbWFuZEJ1ZmZlcnMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpmcmVlRGVzY3JpcHRvclNldHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRnJlZURlc2NyaXB0b3JTZXRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbD4oIGRlc2NyaXB0b3JQb29sICksIGRlc2NyaXB0b3JTZXRDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JTZXQqPiggcERlc2NyaXB0b3JTZXRzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgRGV2aWNlOjpmcmVlRGVzY3JpcHRvclNldHMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldD4gZGVzY3JpcHRvclNldHMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRnJlZURlc2NyaXB0b3JTZXRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbD4oIGRlc2NyaXB0b3JQb29sICksIGRlc2NyaXB0b3JTZXRzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0Kj4oIGRlc2NyaXB0b3JTZXRzLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpmcmVlRGVzY3JpcHRvclNldHMiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6ZnJlZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtGcmVlRGVzY3JpcHRvclNldHMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JQb29sPiggZGVzY3JpcHRvclBvb2wgKSwgZGVzY3JpcHRvclNldENvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldCo+KCBwRGVzY3JpcHRvclNldHMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmZyZWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldD4gZGVzY3JpcHRvclNldHMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRnJlZURlc2NyaXB0b3JTZXRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbD4oIGRlc2NyaXB0b3JQb29sICksIGRlc2NyaXB0b3JTZXRzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0Kj4oIGRlc2NyaXB0b3JTZXRzLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpmcmVlIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpmcmVlTWVtb3J5KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRnJlZU1lbW9yeSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGV2aWNlTWVtb3J5PiggbWVtb3J5ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZnJlZU1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRnJlZU1lbW9yeSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGV2aWNlTWVtb3J5PiggbWVtb3J5ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpmcmVlKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlTWVtb3J5IG1lbW9yeSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRnJlZU1lbW9yeSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGV2aWNlTWVtb3J5PiggbWVtb3J5ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6ZnJlZSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRnJlZU1lbW9yeSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGV2aWNlTWVtb3J5PiggbWVtb3J5ICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiggYWNjZWxlcmF0aW9uU3RydWN0dXJlICksIGRhdGFTaXplLCBwRGF0YSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBBcnJheVByb3h5PFQ+IGRhdGEsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiggYWNjZWxlcmF0aW9uU3RydWN0dXJlICksIGRhdGEuc2l6ZSgpICogc2l6ZW9mKCBUICkgLCByZWludGVycHJldF9jYXN0PHZvaWQqPiggZGF0YS5kYXRhKCkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czJLSFIqIHBNZW1vcnlSZXF1aXJlbWVudHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKj4oIHBJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKj4oIHBNZW1vcnlSZXF1aXJlbWVudHMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMktIUiBEZXZpY2U6OmdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKCBjb25zdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyS0hSIG1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBkLnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKj4oICZpbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKj4oICZtZW1vcnlSZXF1aXJlbWVudHMgKSApOworICAgIHJldHVybiBtZW1vcnlSZXF1aXJlbWVudHM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IERldmljZTo6Z2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoIGNvbnN0IEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gc3RydWN0dXJlQ2hhaW47CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czJLSFImIG1lbW9yeVJlcXVpcmVtZW50cyA9IHN0cnVjdHVyZUNoYWluLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMktIUj4oKTsKKyAgICBkLnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKj4oICZpbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKj4oICZtZW1vcnlSZXF1aXJlbWVudHMgKSApOworICAgIHJldHVybiBzdHJ1Y3R1cmVDaGFpbjsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCggY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoIG1fZGV2aWNlLCBidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCo+KCBwUHJvcGVydGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRD46OnR5cGUgRGV2aWNlOjpnZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCggY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciAmIGJ1ZmZlciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIHByb3BlcnRpZXM7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCggbV9kZXZpY2UsIGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKj4oICZwcm9wZXJ0aWVzICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8U3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4+Ojp0eXBlIERldmljZTo6Z2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIgJiBidWZmZXIsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCYgcHJvcGVydGllcyA9IHN0cnVjdHVyZUNoYWluLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ+KCk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCggbV9kZXZpY2UsIGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKj4oICZwcm9wZXJ0aWVzICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdHJ1Y3R1cmVDaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgRGV2aWNlQWRkcmVzcyBEZXZpY2U6OmdldEJ1ZmZlckFkZHJlc3NFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGV2aWNlQWRkcmVzcz4oIGQudmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKj4oIHBJbmZvICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBEZXZpY2VBZGRyZXNzIERldmljZTo6Z2V0QnVmZmVyQWRkcmVzc0VYVCggY29uc3QgQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBkLnZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUio+KCAmaW5mbyApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgRGV2aWNlQWRkcmVzcyBEZXZpY2U6OmdldEJ1ZmZlckFkZHJlc3NLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGV2aWNlQWRkcmVzcz4oIGQudmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKj4oIHBJbmZvICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBEZXZpY2VBZGRyZXNzIERldmljZTo6Z2V0QnVmZmVyQWRkcmVzc0tIUiggY29uc3QgQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBkLnZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUio+KCAmaW5mbyApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMqIHBNZW1vcnlSZXF1aXJlbWVudHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtCdWZmZXI+KCBidWZmZXIgKSwgcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVJlcXVpcmVtZW50cyo+KCBwTWVtb3J5UmVxdWlyZW1lbnRzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50cyBEZXZpY2U6OmdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlciBidWZmZXIsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50cyBtZW1vcnlSZXF1aXJlbWVudHM7CisgICAgZC52a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQnVmZmVyPiggYnVmZmVyICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMqPiggJm1lbW9yeVJlcXVpcmVtZW50cyApICk7CisgICAgcmV0dXJuIG1lbW9yeVJlcXVpcmVtZW50czsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6Z2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMio+KCBwSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrTWVtb3J5UmVxdWlyZW1lbnRzMio+KCBwTWVtb3J5UmVxdWlyZW1lbnRzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czIgRGV2aWNlOjpnZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKCBjb25zdCBCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czIgbWVtb3J5UmVxdWlyZW1lbnRzOworICAgIGQudmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oICZpbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMyKj4oICZtZW1vcnlSZXF1aXJlbWVudHMgKSApOworICAgIHJldHVybiBtZW1vcnlSZXF1aXJlbWVudHM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IERldmljZTo6Z2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyJiBtZW1vcnlSZXF1aXJlbWVudHMgPSBzdHJ1Y3R1cmVDaGFpbi50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czI+KCk7CisgICAgZC52a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggJmluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVJlcXVpcmVtZW50czIqPiggJm1lbW9yeVJlcXVpcmVtZW50cyApICk7CisgICAgcmV0dXJuIHN0cnVjdHVyZUNoYWluOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpnZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oIHBJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMyKj4oIHBNZW1vcnlSZXF1aXJlbWVudHMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiBEZXZpY2U6OmdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGNvbnN0IEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiBtZW1vcnlSZXF1aXJlbWVudHM7CisgICAgZC52a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggJmluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVJlcXVpcmVtZW50czIqPiggJm1lbW9yeVJlcXVpcmVtZW50cyApICk7CisgICAgcmV0dXJuIG1lbW9yeVJlcXVpcmVtZW50czsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gRGV2aWNlOjpnZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBjb25zdCBCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gc3RydWN0dXJlQ2hhaW47CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czImIG1lbW9yeVJlcXVpcmVtZW50cyA9IHN0cnVjdHVyZUNoYWluLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMj4oKTsKKyAgICBkLnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMio+KCAmaW5mbyApLCByZWludGVycHJldF9jYXN0PFZrTWVtb3J5UmVxdWlyZW1lbnRzMio+KCAmbWVtb3J5UmVxdWlyZW1lbnRzICkgKTsKKyAgICByZXR1cm4gc3RydWN0dXJlQ2hhaW47CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdWludDY0X3QgRGV2aWNlOjpnZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJ1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBkLnZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqPiggcEluZm8gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB1aW50NjRfdCBEZXZpY2U6OmdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKCBjb25zdCBCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGQudmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUio+KCAmaW5mbyApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoIHVpbnQzMl90IHRpbWVzdGFtcENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqIHBUaW1lc3RhbXBJbmZvcywgdWludDY0X3QqIHBUaW1lc3RhbXBzLCB1aW50NjRfdCogcE1heERldmlhdGlvbiwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKCBtX2RldmljZSwgdGltZXN0YW1wQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCo+KCBwVGltZXN0YW1wSW5mb3MgKSwgcFRpbWVzdGFtcHMsIHBNYXhEZXZpYXRpb24gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dWludDY0X3Q+Ojp0eXBlIERldmljZTo6Z2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUPiB0aW1lc3RhbXBJbmZvcywgQXJyYXlQcm94eTx1aW50NjRfdD4gdGltZXN0YW1wcywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHRpbWVzdGFtcEluZm9zLnNpemUoKSA9PSB0aW1lc3RhbXBzLnNpemUoKSApOworI2Vsc2UKKyAgICBpZiAoIHRpbWVzdGFtcEluZm9zLnNpemUoKSAhPSB0aW1lc3RhbXBzLnNpemUoKSApCisgICAgeworICAgICAgdGhyb3cgTG9naWNFcnJvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HICI6OlZrRGV2aWNlOjpnZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVDogdGltZXN0YW1wSW5mb3Muc2l6ZSgpICE9IHRpbWVzdGFtcHMuc2l6ZSgpIiApOworICAgIH0KKyNlbmRpZiAgLypWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMqLworICAgIHVpbnQ2NF90IG1heERldmlhdGlvbjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKCBtX2RldmljZSwgdGltZXN0YW1wSW5mb3Muc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKj4oIHRpbWVzdGFtcEluZm9zLmRhdGEoKSApLCB0aW1lc3RhbXBzLmRhdGEoKSwgJm1heERldmlhdGlvbiApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIG1heERldmlhdGlvbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6Z2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogcFN1cHBvcnQsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Kj4oIHBTdXBwb3J0ICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IERldmljZTo6Z2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICYgY3JlYXRlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgc3VwcG9ydDsKKyAgICBkLnZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Kj4oICZzdXBwb3J0ICkgKTsKKyAgICByZXR1cm4gc3VwcG9ydDsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gRGV2aWNlOjpnZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCggY29uc3QgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCYgc3VwcG9ydCA9IHN0cnVjdHVyZUNoYWluLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQ+KCk7CisgICAgZC52a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCo+KCAmc3VwcG9ydCApICk7CisgICAgcmV0dXJuIHN0cnVjdHVyZUNoYWluOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpnZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiBwU3VwcG9ydCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqPiggcFN1cHBvcnQgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgRGV2aWNlOjpnZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiggY29uc3QgRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCBzdXBwb3J0OworICAgIGQudmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqPiggJnN1cHBvcnQgKSApOworICAgIHJldHVybiBzdXBwb3J0OworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBEZXZpY2U6OmdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKCBjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAmIGNyZWF0ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gc3RydWN0dXJlQ2hhaW47CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0JiBzdXBwb3J0ID0gc3RydWN0dXJlQ2hhaW4udGVtcGxhdGUgZ2V0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydD4oKTsKKyAgICBkLnZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Kj4oICZzdXBwb3J0ICkgKTsKKyAgICByZXR1cm4gc3RydWN0dXJlQ2hhaW47CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmdldEdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVlck1lbW9yeUZlYXR1cmVGbGFncyogcFBlZXJNZW1vcnlGZWF0dXJlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyggbV9kZXZpY2UsIGhlYXBJbmRleCwgbG9jYWxEZXZpY2VJbmRleCwgcmVtb3RlRGV2aWNlSW5kZXgsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKj4oIHBQZWVyTWVtb3J5RmVhdHVyZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVlck1lbW9yeUZlYXR1cmVGbGFncyBEZXZpY2U6OmdldEdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZWVyTWVtb3J5RmVhdHVyZUZsYWdzIHBlZXJNZW1vcnlGZWF0dXJlczsKKyAgICBkLnZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoIG1fZGV2aWNlLCBoZWFwSW5kZXgsIGxvY2FsRGV2aWNlSW5kZXgsIHJlbW90ZURldmljZUluZGV4LCByZWludGVycHJldF9jYXN0PFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyo+KCAmcGVlck1lbW9yeUZlYXR1cmVzICkgKTsKKyAgICByZXR1cm4gcGVlck1lbW9yeUZlYXR1cmVzOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpnZXRHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiggdWludDMyX3QgaGVhcEluZGV4LCB1aW50MzJfdCBsb2NhbERldmljZUluZGV4LCB1aW50MzJfdCByZW1vdGVEZXZpY2VJbmRleCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqIHBQZWVyTWVtb3J5RmVhdHVyZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoIG1fZGV2aWNlLCBoZWFwSW5kZXgsIGxvY2FsRGV2aWNlSW5kZXgsIHJlbW90ZURldmljZUluZGV4LCByZWludGVycHJldF9jYXN0PFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyo+KCBwUGVlck1lbW9yeUZlYXR1cmVzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlZXJNZW1vcnlGZWF0dXJlRmxhZ3MgRGV2aWNlOjpnZXRHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiggdWludDMyX3QgaGVhcEluZGV4LCB1aW50MzJfdCBsb2NhbERldmljZUluZGV4LCB1aW50MzJfdCByZW1vdGVEZXZpY2VJbmRleCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVlck1lbW9yeUZlYXR1cmVGbGFncyBwZWVyTWVtb3J5RmVhdHVyZXM7CisgICAgZC52a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKCBtX2RldmljZSwgaGVhcEluZGV4LCBsb2NhbERldmljZUluZGV4LCByZW1vdGVEZXZpY2VJbmRleCwgcmVpbnRlcnByZXRfY2FzdDxWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqPiggJnBlZXJNZW1vcnlGZWF0dXJlcyApICk7CisgICAgcmV0dXJuIHBlZXJNZW1vcnlGZWF0dXJlczsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKj4oIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPjo6dHlwZSBEZXZpY2U6OmdldEdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIGRldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllczsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqPiggJmRldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldEdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0R3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggcFN1cmZhY2VJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqPiggcE1vZGVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUj46OnR5cGUgRGV2aWNlOjpnZXRHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCBjb25zdCBQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAmIHN1cmZhY2VJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSIG1vZGVzOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUio+KCAmc3VyZmFjZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUio+KCAmbW9kZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIG1vZGVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldEdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUio+KCBwTW9kZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSPjo6dHlwZSBEZXZpY2U6OmdldEdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiBtb2RlczsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUio+KCAmbW9kZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIG1vZGVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldEdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6Z2V0TWVtb3J5Q29tbWl0bWVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplKiBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VNZW1vcnk+KCBtZW1vcnkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZVNpemUqPiggcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBEZXZpY2U6OmdldE1lbW9yeUNvbW1pdG1lbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIGNvbW1pdHRlZE1lbW9yeUluQnl0ZXM7CisgICAgZC52a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0RldmljZU1lbW9yeT4oIG1lbW9yeSApLCByZWludGVycHJldF9jYXN0PFZrRGV2aWNlU2l6ZSo+KCAmY29tbWl0dGVkTWVtb3J5SW5CeXRlcyApICk7CisgICAgcmV0dXJuIGNvbW1pdHRlZE1lbW9yeUluQnl0ZXM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdWludDY0X3QgRGV2aWNlOjpnZXRNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiogcEluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gZC52a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUio+KCBwSW5mbyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHVpbnQ2NF90IERldmljZTo6Z2V0TWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoIGNvbnN0IERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGQudmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqPiggJmluZm8gKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFBGTl92a1ZvaWRGdW5jdGlvbiBEZXZpY2U6OmdldFByb2NBZGRyKCBjb25zdCBjaGFyKiBwTmFtZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBkLnZrR2V0RGV2aWNlUHJvY0FkZHIoIG1fZGV2aWNlLCBwTmFtZSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBQRk5fdmtWb2lkRnVuY3Rpb24gRGV2aWNlOjpnZXRQcm9jQWRkciggY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBkLnZrR2V0RGV2aWNlUHJvY0FkZHIoIG1fZGV2aWNlLCBuYW1lLmNfc3RyKCkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6Z2V0UXVldWUoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90IHF1ZXVlSW5kZXgsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZSogcFF1ZXVlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldERldmljZVF1ZXVlKCBtX2RldmljZSwgcXVldWVGYW1pbHlJbmRleCwgcXVldWVJbmRleCwgcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlKj4oIHBRdWV1ZSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZSBEZXZpY2U6OmdldFF1ZXVlKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCBxdWV1ZUluZGV4LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZSBxdWV1ZTsKKyAgICBkLnZrR2V0RGV2aWNlUXVldWUoIG1fZGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBxdWV1ZUluZGV4LCByZWludGVycHJldF9jYXN0PFZrUXVldWUqPiggJnF1ZXVlICkgKTsKKyAgICByZXR1cm4gcXVldWU7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmdldFF1ZXVlMiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVF1ZXVlSW5mbzIqIHBRdWV1ZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZSogcFF1ZXVlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldERldmljZVF1ZXVlMiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VRdWV1ZUluZm8yKj4oIHBRdWV1ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlKj4oIHBRdWV1ZSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZSBEZXZpY2U6OmdldFF1ZXVlMiggY29uc3QgRGV2aWNlUXVldWVJbmZvMiAmIHF1ZXVlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWUgcXVldWU7CisgICAgZC52a0dldERldmljZVF1ZXVlMiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VRdWV1ZUluZm8yKj4oICZxdWV1ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlKj4oICZxdWV1ZSApICk7CisgICAgcmV0dXJuIHF1ZXVlOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0RXZlbnRTdGF0dXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldEV2ZW50U3RhdHVzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtFdmVudD4oIGV2ZW50ICkgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0RXZlbnRTdGF0dXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRFdmVudFN0YXR1cyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRXZlbnQ+KCBldmVudCApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRFdmVudFN0YXR1cyIsIHsgUmVzdWx0OjplRXZlbnRTZXQsIFJlc3VsdDo6ZUV2ZW50UmVzZXQgfSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldEZlbmNlRmRLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRGZW5jZUZkS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKj4oIHBHZXRGZEluZm8gKSwgcEZkICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPGludD46OnR5cGUgRGV2aWNlOjpnZXRGZW5jZUZkS0hSKCBjb25zdCBGZW5jZUdldEZkSW5mb0tIUiAmIGdldEZkSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgaW50IGZkOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RmVuY2VGZEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUio+KCAmZ2V0RmRJbmZvICksICZmZCApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGZkLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldEZlbmNlRmRLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRGZW5jZVN0YXR1cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RmVuY2VTdGF0dXMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ZlbmNlPiggZmVuY2UgKSApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRGZW5jZVN0YXR1cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldEZlbmNlU3RhdHVzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtGZW5jZT4oIGZlbmNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldEZlbmNlU3RhdHVzIiwgeyBSZXN1bHQ6OmVTdWNjZXNzLCBSZXN1bHQ6OmVOb3RSZWFkeSB9ICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldEZlbmNlV2luMzJIYW5kbGVLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUio+KCBwR2V0V2luMzJIYW5kbGVJbmZvICksIHBIYW5kbGUgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8SEFORExFPjo6dHlwZSBEZXZpY2U6OmdldEZlbmNlV2luMzJIYW5kbGVLSFIoIGNvbnN0IEZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSICYgZ2V0V2luMzJIYW5kbGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUio+KCAmZ2V0V2luMzJIYW5kbGVJbmZvICksICZoYW5kbGUgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBoYW5kbGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBpbWFnZSApLCByZWludGVycHJldF9jYXN0PFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqPiggcFByb3BlcnRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ+Ojp0eXBlIERldmljZTo6Z2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIHByb3BlcnRpZXM7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBpbWFnZSApLCByZWludGVycHJldF9jYXN0PFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqPiggJnByb3BlcnRpZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMqIHBNZW1vcnlSZXF1aXJlbWVudHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggaW1hZ2UgKSwgcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVJlcXVpcmVtZW50cyo+KCBwTWVtb3J5UmVxdWlyZW1lbnRzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50cyBEZXZpY2U6OmdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50cyBtZW1vcnlSZXF1aXJlbWVudHM7CisgICAgZC52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGltYWdlICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMqPiggJm1lbW9yeVJlcXVpcmVtZW50cyApICk7CisgICAgcmV0dXJuIG1lbW9yeVJlcXVpcmVtZW50czsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6Z2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyKiBwTWVtb3J5UmVxdWlyZW1lbnRzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oIHBJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMyKj4oIHBNZW1vcnlSZXF1aXJlbWVudHMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiBEZXZpY2U6OmdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czIgbWVtb3J5UmVxdWlyZW1lbnRzOworICAgIGQudmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMio+KCAmaW5mbyApLCByZWludGVycHJldF9jYXN0PFZrTWVtb3J5UmVxdWlyZW1lbnRzMio+KCAmbWVtb3J5UmVxdWlyZW1lbnRzICkgKTsKKyAgICByZXR1cm4gbWVtb3J5UmVxdWlyZW1lbnRzOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBEZXZpY2U6OmdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gc3RydWN0dXJlQ2hhaW47CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czImIG1lbW9yeVJlcXVpcmVtZW50cyA9IHN0cnVjdHVyZUNoYWluLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMj4oKTsKKyAgICBkLnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggJmluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVJlcXVpcmVtZW50czIqPiggJm1lbW9yeVJlcXVpcmVtZW50cyApICk7CisgICAgcmV0dXJuIHN0cnVjdHVyZUNoYWluOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpnZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggcEluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVJlcXVpcmVtZW50czIqPiggcE1lbW9yeVJlcXVpcmVtZW50cyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyIERldmljZTo6Z2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBjb25zdCBJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiBtZW1vcnlSZXF1aXJlbWVudHM7CisgICAgZC52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oICZpbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMyKj4oICZtZW1vcnlSZXF1aXJlbWVudHMgKSApOworICAgIHJldHVybiBtZW1vcnlSZXF1aXJlbWVudHM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IERldmljZTo6Z2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBjb25zdCBJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBzdHJ1Y3R1cmVDaGFpbjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5UmVxdWlyZW1lbnRzMiYgbWVtb3J5UmVxdWlyZW1lbnRzID0gc3RydWN0dXJlQ2hhaW4udGVtcGxhdGUgZ2V0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlSZXF1aXJlbWVudHMyPigpOworICAgIGQudmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMio+KCAmaW5mbyApLCByZWludGVycHJldF9jYXN0PFZrTWVtb3J5UmVxdWlyZW1lbnRzMio+KCAmbWVtb3J5UmVxdWlyZW1lbnRzICkgKTsKKyAgICByZXR1cm4gc3RydWN0dXJlQ2hhaW47CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGltYWdlICksIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCByZWludGVycHJldF9jYXN0PFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqPiggcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMsQWxsb2NhdG9yPiBEZXZpY2U6OmdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzLEFsbG9jYXRvcj4gc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIHVpbnQzMl90IHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQ7CisgICAgZC52a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGltYWdlICksICZzcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBudWxscHRyICk7CisgICAgc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLnJlc2l6ZSggc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCApOworICAgIGQudmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBpbWFnZSApLCAmc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKj4oIHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy5kYXRhKCkgKSApOworICAgIHJldHVybiBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudHM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMsQWxsb2NhdG9yPiBEZXZpY2U6OmdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UgaW1hZ2UsIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyxBbGxvY2F0b3I+IHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3Qgc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudDsKKyAgICBkLnZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggaW1hZ2UgKSwgJnNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIG51bGxwdHIgKTsKKyAgICBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMucmVzaXplKCBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50ICk7CisgICAgZC52a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtJbWFnZT4oIGltYWdlICksICZzcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCByZWludGVycHJldF9jYXN0PFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqPiggc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLmRhdGEoKSApICk7CisgICAgcmV0dXJuIHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6Z2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMio+KCBwSW5mbyApLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMio+KCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIsQWxsb2NhdG9yPiBEZXZpY2U6OmdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMixBbGxvY2F0b3I+IHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czsKKyAgICB1aW50MzJfdCBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50OworICAgIGQudmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMio+KCAmaW5mbyApLCAmc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgbnVsbHB0ciApOworICAgIHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy5yZXNpemUoIHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQgKTsKKyAgICBkLnZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggJmluZm8gKSwgJnNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqPiggc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLmRhdGEoKSApICk7CisgICAgcmV0dXJuIHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIsQWxsb2NhdG9yPiBEZXZpY2U6OmdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiggY29uc3QgSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAmIGluZm8sIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIsQWxsb2NhdG9yPiBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQ7CisgICAgZC52a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oICZpbmZvICksICZzcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBudWxscHRyICk7CisgICAgc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLnJlc2l6ZSggc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCApOworICAgIGQudmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMio+KCAmaW5mbyApLCAmc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMio+KCBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMuZGF0YSgpICkgKTsKKyAgICByZXR1cm4gc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpnZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oIHBJbmZvICksIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCByZWludGVycHJldF9jYXN0PFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKj4oIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMixBbGxvY2F0b3I+IERldmljZTo6Z2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBjb25zdCBJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLEFsbG9jYXRvcj4gc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIHVpbnQzMl90IHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQ7CisgICAgZC52a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oICZpbmZvICksICZzcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBudWxscHRyICk7CisgICAgc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLnJlc2l6ZSggc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCApOworICAgIGQudmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMio+KCAmaW5mbyApLCAmc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMio+KCBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMuZGF0YSgpICkgKTsKKyAgICByZXR1cm4gc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMixBbGxvY2F0b3I+IERldmljZTo6Z2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBjb25zdCBJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICYgaW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMixBbGxvY2F0b3I+IHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3Qgc3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudDsKKyAgICBkLnZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqPiggJmluZm8gKSwgJnNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIG51bGxwdHIgKTsKKyAgICBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMucmVzaXplKCBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50ICk7CisgICAgZC52a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKj4oICZpbmZvICksICZzcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCByZWludGVycHJldF9jYXN0PFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKj4oIHNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy5kYXRhKCkgKSApOworICAgIHJldHVybiBzcGFyc2VNZW1vcnlSZXF1aXJlbWVudHM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OmdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZSBpbWFnZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlU3VicmVzb3VyY2UqIHBTdWJyZXNvdXJjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnJlc291cmNlTGF5b3V0KiBwTGF5b3V0LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0ltYWdlPiggaW1hZ2UgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UqPiggcFN1YnJlc291cmNlICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdWJyZXNvdXJjZUxheW91dCo+KCBwTGF5b3V0ICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnJlc291cmNlTGF5b3V0IERldmljZTo6Z2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlIGltYWdlLCBjb25zdCBJbWFnZVN1YnJlc291cmNlICYgc3VicmVzb3VyY2UsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1YnJlc291cmNlTGF5b3V0IGxheW91dDsKKyAgICBkLnZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrSW1hZ2U+KCBpbWFnZSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSo+KCAmc3VicmVzb3VyY2UgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1YnJlc291cmNlTGF5b3V0Kj4oICZsYXlvdXQgKSApOworICAgIHJldHVybiBsYXlvdXQ7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdWludDMyX3QgRGV2aWNlOjpnZXRJbWFnZVZpZXdIYW5kbGVOVlgoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBwSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBkLnZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqPiggcEluZm8gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB1aW50MzJfdCBEZXZpY2U6OmdldEltYWdlVmlld0hhbmRsZU5WWCggY29uc3QgSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCAmIGluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGQudmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCo+KCAmaW5mbyApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlcioqIHBCdWZmZXIsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKj4oIHBJbmZvICksIHBCdWZmZXIgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8c3RydWN0IEFIYXJkd2FyZUJ1ZmZlcio+Ojp0eXBlIERldmljZTo6Z2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCggY29uc3QgTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgJiBpbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXI7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKj4oICZpbmZvICksICZidWZmZXIgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBidWZmZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0TWVtb3J5RmRLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0TWVtb3J5RmRLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSKj4oIHBHZXRGZEluZm8gKSwgcEZkICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPGludD46OnR5cGUgRGV2aWNlOjpnZXRNZW1vcnlGZEtIUiggY29uc3QgTWVtb3J5R2V0RmRJbmZvS0hSICYgZ2V0RmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBpbnQgZmQ7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRNZW1vcnlGZEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqPiggJmdldEZkSW5mbyApLCAmZmQgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBmZCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRNZW1vcnlGZEtIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBpbnQgZmQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlGZFByb3BlcnRpZXNLSFIqIHBNZW1vcnlGZFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPiggaGFuZGxlVHlwZSApLCBmZCwgcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeUZkUHJvcGVydGllc0tIUio+KCBwTWVtb3J5RmRQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUZkUHJvcGVydGllc0tIUj46OnR5cGUgRGV2aWNlOjpnZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBpbnQgZmQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlGZFByb3BlcnRpZXNLSFIgbWVtb3J5RmRQcm9wZXJ0aWVzOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cz4oIGhhbmRsZVR5cGUgKSwgZmQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqPiggJm1lbW9yeUZkUHJvcGVydGllcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgbWVtb3J5RmRQcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldE1lbW9yeUZkUHJvcGVydGllc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBjb25zdCB2b2lkKiBwSG9zdFBvaW50ZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPiggaGFuZGxlVHlwZSApLCBwSG9zdFBvaW50ZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqPiggcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQ+Ojp0eXBlIERldmljZTo6Z2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgY29uc3Qgdm9pZCogcEhvc3RQb2ludGVyLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIG1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllczsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM+KCBoYW5kbGVUeXBlICksIHBIb3N0UG9pbnRlciwgcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCo+KCAmbWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBtZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKj4oIHBHZXRXaW4zMkhhbmRsZUluZm8gKSwgcEhhbmRsZSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxIQU5ETEU+Ojp0eXBlIERldmljZTo6Z2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoIGNvbnN0IE1lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiAmIGdldFdpbjMySGFuZGxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUio+KCAmZ2V0V2luMzJIYW5kbGVJbmZvICksICZoYW5kbGUgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBoYW5kbGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0TWVtb3J5V2luMzJIYW5kbGVOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGhhbmRsZVR5cGUsIEhBTkRMRSogcEhhbmRsZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldE1lbW9yeVdpbjMySGFuZGxlTlYoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0RldmljZU1lbW9yeT4oIG1lbW9yeSApLCBzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlY+KCBoYW5kbGVUeXBlICksIHBIYW5kbGUgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8SEFORExFPjo6dHlwZSBEZXZpY2U6OmdldE1lbW9yeVdpbjMySGFuZGxlTlYoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBoYW5kbGVUeXBlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGV2aWNlTWVtb3J5PiggbWVtb3J5ICksIHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOVj4oIGhhbmRsZVR5cGUgKSwgJmhhbmRsZSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGhhbmRsZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRNZW1vcnlXaW4zMkhhbmRsZU5WIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIEhBTkRMRSBoYW5kbGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqIHBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPiggaGFuZGxlVHlwZSApLCBoYW5kbGUsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqPiggcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI+Ojp0eXBlIERldmljZTo6Z2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgSEFORExFIGhhbmRsZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiBtZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXM7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPiggaGFuZGxlVHlwZSApLCBoYW5kbGUsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqPiggJm1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgbWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50MzJfdCogcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSogcFByZXNlbnRhdGlvblRpbWluZ3MsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LCByZWludGVycHJldF9jYXN0PFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSo+KCBwUHJlc2VudGF0aW9uVGltaW5ncyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSxBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFLEFsbG9jYXRvcj4gcHJlc2VudGF0aW9uVGltaW5nczsKKyAgICB1aW50MzJfdCBwcmVzZW50YXRpb25UaW1pbmdDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApLCAmcHJlc2VudGF0aW9uVGltaW5nQ291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcHJlc2VudGF0aW9uVGltaW5nQ291bnQgKQorICAgICAgeworICAgICAgICBwcmVzZW50YXRpb25UaW1pbmdzLnJlc2l6ZSggcHJlc2VudGF0aW9uVGltaW5nQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApLCAmcHJlc2VudGF0aW9uVGltaW5nQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKj4oIHByZXNlbnRhdGlvblRpbWluZ3MuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcmVzZW50YXRpb25UaW1pbmdDb3VudCA8PSBwcmVzZW50YXRpb25UaW1pbmdzLnNpemUoKSApOworICAgICAgcHJlc2VudGF0aW9uVGltaW5ncy5yZXNpemUoIHByZXNlbnRhdGlvblRpbWluZ0NvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcmVzZW50YXRpb25UaW1pbmdzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUsQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpnZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUsQWxsb2NhdG9yPiBwcmVzZW50YXRpb25UaW1pbmdzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBwcmVzZW50YXRpb25UaW1pbmdDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApLCAmcHJlc2VudGF0aW9uVGltaW5nQ291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcHJlc2VudGF0aW9uVGltaW5nQ291bnQgKQorICAgICAgeworICAgICAgICBwcmVzZW50YXRpb25UaW1pbmdzLnJlc2l6ZSggcHJlc2VudGF0aW9uVGltaW5nQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApLCAmcHJlc2VudGF0aW9uVGltaW5nQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKj4oIHByZXNlbnRhdGlvblRpbWluZ3MuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcmVzZW50YXRpb25UaW1pbmdDb3VudCA8PSBwcmVzZW50YXRpb25UaW1pbmdzLnNpemUoKSApOworICAgICAgcHJlc2VudGF0aW9uVGltaW5ncy5yZXNpemUoIHByZXNlbnRhdGlvblRpbWluZ0NvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcmVzZW50YXRpb25UaW1pbmdzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIHBhcmFtZXRlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlVmFsdWVJTlRFTCogcFZhbHVlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUw+KCBwYXJhbWV0ZXIgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCo+KCBwVmFsdWUgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VWYWx1ZUlOVEVMPjo6dHlwZSBEZXZpY2U6OmdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCBwYXJhbWV0ZXIsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZVZhbHVlSU5URUwgdmFsdWU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTD4oIHBhcmFtZXRlciApLCByZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKj4oICZ2YWx1ZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgdmFsdWUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRQaXBlbGluZUNhY2hlRGF0YSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgc2l6ZV90KiBwRGF0YVNpemUsIHZvaWQqIHBEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGlwZWxpbmVDYWNoZURhdGEoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBwaXBlbGluZUNhY2hlICksIHBEYXRhU2l6ZSwgcERhdGEgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3Rvcjx1aW50OF90LEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Z2V0UGlwZWxpbmVDYWNoZURhdGEoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3QsQWxsb2NhdG9yPiBkYXRhOworICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBpcGVsaW5lQ2FjaGVEYXRhKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCAmZGF0YVNpemUsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgZGF0YVNpemUgKQorICAgICAgeworICAgICAgICBkYXRhLnJlc2l6ZSggZGF0YVNpemUgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBpcGVsaW5lQ2FjaGVEYXRhKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCAmZGF0YVNpemUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCBkYXRhLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggZGF0YVNpemUgPD0gZGF0YS5zaXplKCkgKTsKKyAgICAgIGRhdGEucmVzaXplKCBkYXRhU2l6ZSApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGF0YSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRQaXBlbGluZUNhY2hlRGF0YSIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmdldFBpcGVsaW5lQ2FjaGVEYXRhKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+IGRhdGEoIHZlY3RvckFsbG9jYXRvciApOworICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBpcGVsaW5lQ2FjaGVEYXRhKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCAmZGF0YVNpemUsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgZGF0YVNpemUgKQorICAgICAgeworICAgICAgICBkYXRhLnJlc2l6ZSggZGF0YVNpemUgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBpcGVsaW5lQ2FjaGVEYXRhKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNhY2hlPiggcGlwZWxpbmVDYWNoZSApLCAmZGF0YVNpemUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCBkYXRhLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggZGF0YVNpemUgPD0gZGF0YS5zaXplKCkgKTsKKyAgICAgIGRhdGEucmVzaXplKCBkYXRhU2l6ZSApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGF0YSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRQaXBlbGluZUNhY2hlRGF0YSIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqIHBFeGVjdXRhYmxlSW5mbywgdWludDMyX3QqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKj4oIHBFeGVjdXRhYmxlSW5mbyApLCBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUio+KCBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIsQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpnZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggY29uc3QgUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmIGV4ZWN1dGFibGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSLEFsbG9jYXRvcj4gaW50ZXJuYWxSZXByZXNlbnRhdGlvbnM7CisgICAgdWludDMyX3QgaW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUio+KCAmZXhlY3V0YWJsZUluZm8gKSwgJmludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBpbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQgKQorICAgICAgeworICAgICAgICBpbnRlcm5hbFJlcHJlc2VudGF0aW9ucy5yZXNpemUoIGludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUio+KCAmZXhlY3V0YWJsZUluZm8gKSwgJmludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqPiggaW50ZXJuYWxSZXByZXNlbnRhdGlvbnMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBpbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQgPD0gaW50ZXJuYWxSZXByZXNlbnRhdGlvbnMuc2l6ZSgpICk7CisgICAgICBpbnRlcm5hbFJlcHJlc2VudGF0aW9ucy5yZXNpemUoIGludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgaW50ZXJuYWxSZXByZXNlbnRhdGlvbnMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIsQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpnZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggY29uc3QgUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmIGV4ZWN1dGFibGVJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUixBbGxvY2F0b3I+IGludGVybmFsUmVwcmVzZW50YXRpb25zKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBpbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKj4oICZleGVjdXRhYmxlSW5mbyApLCAmaW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIGludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCApCisgICAgICB7CisgICAgICAgIGludGVybmFsUmVwcmVzZW50YXRpb25zLnJlc2l6ZSggaW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKj4oICZleGVjdXRhYmxlSW5mbyApLCAmaW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUio+KCBpbnRlcm5hbFJlcHJlc2VudGF0aW9ucy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIGludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCA8PSBpbnRlcm5hbFJlcHJlc2VudGF0aW9ucy5zaXplKCkgKTsKKyAgICAgIGludGVybmFsUmVwcmVzZW50YXRpb25zLnJlc2l6ZSggaW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBpbnRlcm5hbFJlcHJlc2VudGF0aW9ucywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVJbmZvS0hSKiBwUGlwZWxpbmVJbmZvLCB1aW50MzJfdCogcEV4ZWN1dGFibGVDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUluZm9LSFIqPiggcFBpcGVsaW5lSW5mbyApLCBwRXhlY3V0YWJsZUNvdW50LCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUio+KCBwUHJvcGVydGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUixBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoIGNvbnN0IFBpcGVsaW5lSW5mb0tIUiAmIHBpcGVsaW5lSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUixBbGxvY2F0b3I+IHByb3BlcnRpZXM7CisgICAgdWludDMyX3QgZXhlY3V0YWJsZUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUluZm9LSFIqPiggJnBpcGVsaW5lSW5mbyApLCAmZXhlY3V0YWJsZUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIGV4ZWN1dGFibGVDb3VudCApCisgICAgICB7CisgICAgICAgIHByb3BlcnRpZXMucmVzaXplKCBleGVjdXRhYmxlQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKj4oICZwaXBlbGluZUluZm8gKSwgJmV4ZWN1dGFibGVDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIGV4ZWN1dGFibGVDb3VudCA8PSBwcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgcHJvcGVydGllcy5yZXNpemUoIGV4ZWN1dGFibGVDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Z2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiggY29uc3QgUGlwZWxpbmVJbmZvS0hSICYgcGlwZWxpbmVJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUixBbGxvY2F0b3I+IHByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IGV4ZWN1dGFibGVDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKj4oICZwaXBlbGluZUluZm8gKSwgJmV4ZWN1dGFibGVDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBleGVjdXRhYmxlQ291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggZXhlY3V0YWJsZUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lSW5mb0tIUio+KCAmcGlwZWxpbmVJbmZvICksICZleGVjdXRhYmxlQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBleGVjdXRhYmxlQ291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBleGVjdXRhYmxlQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogcEV4ZWN1dGFibGVJbmZvLCB1aW50MzJfdCogcFN0YXRpc3RpY0NvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiBwU3RhdGlzdGljcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUio+KCBwRXhlY3V0YWJsZUluZm8gKSwgcFN0YXRpc3RpY0NvdW50LCByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKj4oIHBTdGF0aXN0aWNzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIsQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpnZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKCBjb25zdCBQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSICYgZXhlY3V0YWJsZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUixBbGxvY2F0b3I+IHN0YXRpc3RpY3M7CisgICAgdWludDMyX3Qgc3RhdGlzdGljQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqPiggJmV4ZWN1dGFibGVJbmZvICksICZzdGF0aXN0aWNDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBzdGF0aXN0aWNDb3VudCApCisgICAgICB7CisgICAgICAgIHN0YXRpc3RpY3MucmVzaXplKCBzdGF0aXN0aWNDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKj4oICZleGVjdXRhYmxlSW5mbyApLCAmc3RhdGlzdGljQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqPiggc3RhdGlzdGljcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHN0YXRpc3RpY0NvdW50IDw9IHN0YXRpc3RpY3Muc2l6ZSgpICk7CisgICAgICBzdGF0aXN0aWNzLnJlc2l6ZSggc3RhdGlzdGljQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN0YXRpc3RpY3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Z2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiggY29uc3QgUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAmIGV4ZWN1dGFibGVJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSLEFsbG9jYXRvcj4gc3RhdGlzdGljcyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3Qgc3RhdGlzdGljQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqPiggJmV4ZWN1dGFibGVJbmZvICksICZzdGF0aXN0aWNDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBzdGF0aXN0aWNDb3VudCApCisgICAgICB7CisgICAgICAgIHN0YXRpc3RpY3MucmVzaXplKCBzdGF0aXN0aWNDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKj4oICZleGVjdXRhYmxlSW5mbyApLCAmc3RhdGlzdGljQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqPiggc3RhdGlzdGljcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHN0YXRpc3RpY0NvdW50IDw9IHN0YXRpc3RpY3Muc2l6ZSgpICk7CisgICAgICBzdGF0aXN0aWNzLnJlc2l6ZSggc3RhdGlzdGljQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN0YXRpc3RpY3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRRdWVyeVBvb2xSZXN1bHRzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc3RyaWRlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlSZXN1bHRGbGFncyBmbGFncywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFF1ZXJ5UG9vbFJlc3VsdHMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1F1ZXJ5UG9vbD4oIHF1ZXJ5UG9vbCApLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBkYXRhU2l6ZSwgcERhdGEsIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIHN0cmlkZSApLCBzdGF0aWNfY2FzdDxWa1F1ZXJ5UmVzdWx0RmxhZ3M+KCBmbGFncyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0UXVlcnlQb29sUmVzdWx0cyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIEFycmF5UHJveHk8VD4gZGF0YSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc3RyaWRlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlSZXN1bHRGbGFncyBmbGFncywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRRdWVyeVBvb2xSZXN1bHRzKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZGF0YS5zaXplKCkgKiBzaXplb2YoIFQgKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCBkYXRhLmRhdGEoKSApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBzdHJpZGUgKSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVJlc3VsdEZsYWdzPiggZmxhZ3MgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0UXVlcnlQb29sUmVzdWx0cyIsIHsgUmVzdWx0OjplU3VjY2VzcywgUmVzdWx0OjplTm90UmVhZHkgfSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCB1aW50MzJfdCBmaXJzdEdyb3VwLCB1aW50MzJfdCBncm91cENvdW50LCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZT4oIHBpcGVsaW5lICksIGZpcnN0R3JvdXAsIGdyb3VwQ291bnQsIGRhdGFTaXplLCBwRGF0YSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCB1aW50MzJfdCBmaXJzdEdyb3VwLCB1aW50MzJfdCBncm91cENvdW50LCBBcnJheVByb3h5PFQ+IGRhdGEsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZT4oIHBpcGVsaW5lICksIGZpcnN0R3JvdXAsIGdyb3VwQ291bnQsIGRhdGEuc2l6ZSgpICogc2l6ZW9mKCBUICkgLCByZWludGVycHJldF9jYXN0PHZvaWQqPiggZGF0YS5kYXRhKCkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU3dhcGNoYWluS0hSPiggc3dhcGNoYWluICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSo+KCBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEU+Ojp0eXBlIERldmljZTo6Z2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUgZGlzcGxheVRpbWluZ1Byb3BlcnRpZXM7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU3dhcGNoYWluS0hSPiggc3dhcGNoYWluICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSo+KCAmZGlzcGxheVRpbWluZ1Byb3BlcnRpZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGRpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpnZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpSZW5kZXJQYXNzIHJlbmRlclBhc3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCogcEdyYW51bGFyaXR5LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUmVuZGVyUGFzcz4oIHJlbmRlclBhc3MgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVudDJEKj4oIHBHcmFudWxhcml0eSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnQyRCBEZXZpY2U6OmdldFJlbmRlckFyZWFHcmFudWxhcml0eSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlbmRlclBhc3MgcmVuZGVyUGFzcywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZW50MkQgZ3JhbnVsYXJpdHk7CisgICAgZC52a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUmVuZGVyUGFzcz4oIHJlbmRlclBhc3MgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVudDJEKj4oICZncmFudWxhcml0eSApICk7CisgICAgcmV0dXJuIGdyYW51bGFyaXR5OworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZSBzZW1hcGhvcmUsIHVpbnQ2NF90KiBwVmFsdWUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1NlbWFwaG9yZT4oIHNlbWFwaG9yZSApLCBwVmFsdWUgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dWludDY0X3Q+Ojp0eXBlIERldmljZTo6Z2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlIHNlbWFwaG9yZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgdWludDY0X3QgdmFsdWU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1NlbWFwaG9yZT4oIHNlbWFwaG9yZSApLCAmdmFsdWUgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCB2YWx1ZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0U2VtYXBob3JlRmRLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0U2VtYXBob3JlRmRLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKj4oIHBHZXRGZEluZm8gKSwgcEZkICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPGludD46OnR5cGUgRGV2aWNlOjpnZXRTZW1hcGhvcmVGZEtIUiggY29uc3QgU2VtYXBob3JlR2V0RmRJbmZvS0hSICYgZ2V0RmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBpbnQgZmQ7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTZW1hcGhvcmVGZEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqPiggJmdldEZkSW5mbyApLCAmZmQgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBmZCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRTZW1hcGhvcmVGZEtIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHBHZXRXaW4zMkhhbmRsZUluZm8sIEhBTkRMRSogcEhhbmRsZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUio+KCBwR2V0V2luMzJIYW5kbGVJbmZvICksIHBIYW5kbGUgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8SEFORExFPjo6dHlwZSBEZXZpY2U6OmdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKCBjb25zdCBTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgJiBnZXRXaW4zMkhhbmRsZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqPiggJmdldFdpbjMySGFuZGxlSW5mbyApLCAmaGFuZGxlICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgaGFuZGxlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0U2hhZGVySW5mb0FNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFnQml0cyBzaGFkZXJTdGFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlckluZm9UeXBlQU1EIGluZm9UeXBlLCBzaXplX3QqIHBJbmZvU2l6ZSwgdm9pZCogcEluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTaGFkZXJJbmZvQU1EKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZT4oIHBpcGVsaW5lICksIHN0YXRpY19jYXN0PFZrU2hhZGVyU3RhZ2VGbGFnQml0cz4oIHNoYWRlclN0YWdlICksIHN0YXRpY19jYXN0PFZrU2hhZGVySW5mb1R5cGVBTUQ+KCBpbmZvVHlwZSApLCBwSW5mb1NpemUsIHBJbmZvICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmdldFNoYWRlckluZm9BTUQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZSBwaXBlbGluZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlclN0YWdlRmxhZ0JpdHMgc2hhZGVyU3RhZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTaGFkZXJJbmZvVHlwZUFNRCBpbmZvVHlwZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+IGluZm87CisgICAgc2l6ZV90IGluZm9TaXplOworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0U2hhZGVySW5mb0FNRCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmU+KCBwaXBlbGluZSApLCBzdGF0aWNfY2FzdDxWa1NoYWRlclN0YWdlRmxhZ0JpdHM+KCBzaGFkZXJTdGFnZSApLCBzdGF0aWNfY2FzdDxWa1NoYWRlckluZm9UeXBlQU1EPiggaW5mb1R5cGUgKSwgJmluZm9TaXplLCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIGluZm9TaXplICkKKyAgICAgIHsKKyAgICAgICAgaW5mby5yZXNpemUoIGluZm9TaXplICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTaGFkZXJJbmZvQU1EKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQaXBlbGluZT4oIHBpcGVsaW5lICksIHN0YXRpY19jYXN0PFZrU2hhZGVyU3RhZ2VGbGFnQml0cz4oIHNoYWRlclN0YWdlICksIHN0YXRpY19jYXN0PFZrU2hhZGVySW5mb1R5cGVBTUQ+KCBpbmZvVHlwZSApLCAmaW5mb1NpemUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCBpbmZvLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggaW5mb1NpemUgPD0gaW5mby5zaXplKCkgKTsKKyAgICAgIGluZm8ucmVzaXplKCBpbmZvU2l6ZSApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgaW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRTaGFkZXJJbmZvQU1EIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3Rvcjx1aW50OF90LEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Z2V0U2hhZGVySW5mb0FNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBpcGVsaW5lIHBpcGVsaW5lLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2hhZGVyU3RhZ2VGbGFnQml0cyBzaGFkZXJTdGFnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNoYWRlckluZm9UeXBlQU1EIGluZm9UeXBlLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+IGluZm8oIHZlY3RvckFsbG9jYXRvciApOworICAgIHNpemVfdCBpbmZvU2l6ZTsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFNoYWRlckluZm9BTUQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lPiggcGlwZWxpbmUgKSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJTdGFnZUZsYWdCaXRzPiggc2hhZGVyU3RhZ2UgKSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJJbmZvVHlwZUFNRD4oIGluZm9UeXBlICksICZpbmZvU2l6ZSwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBpbmZvU2l6ZSApCisgICAgICB7CisgICAgICAgIGluZm8ucmVzaXplKCBpbmZvU2l6ZSApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0U2hhZGVySW5mb0FNRCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGlwZWxpbmU+KCBwaXBlbGluZSApLCBzdGF0aWNfY2FzdDxWa1NoYWRlclN0YWdlRmxhZ0JpdHM+KCBzaGFkZXJTdGFnZSApLCBzdGF0aWNfY2FzdDxWa1NoYWRlckluZm9UeXBlQU1EPiggaW5mb1R5cGUgKSwgJmluZm9TaXplLCByZWludGVycHJldF9jYXN0PHZvaWQqPiggaW5mby5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIGluZm9TaXplIDw9IGluZm8uc2l6ZSgpICk7CisgICAgICBpbmZvLnJlc2l6ZSggaW5mb1NpemUgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0U2hhZGVySW5mb0FNRCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRTd2FwY2hhaW5Db3VudGVyRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgY291bnRlciwgdWludDY0X3QqIHBDb3VudGVyVmFsdWUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUPiggY291bnRlciApLCBwQ291bnRlclZhbHVlICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHVpbnQ2NF90Pjo6dHlwZSBEZXZpY2U6OmdldFN3YXBjaGFpbkNvdW50ZXJFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCBjb3VudGVyLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICB1aW50NjRfdCBjb3VudGVyVmFsdWU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUPiggY291bnRlciApLCAmY291bnRlclZhbHVlICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgY291bnRlclZhbHVlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldFN3YXBjaGFpbkNvdW50ZXJFWFQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0U3dhcGNoYWluSW1hZ2VzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2UqIHBTd2FwY2hhaW5JbWFnZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApLCBwU3dhcGNoYWluSW1hZ2VDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlKj4oIHBTd2FwY2hhaW5JbWFnZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPEltYWdlLEFsbG9jYXRvcj4+Ojp0eXBlIERldmljZTo6Z2V0U3dhcGNoYWluSW1hZ2VzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8SW1hZ2UsQWxsb2NhdG9yPiBzd2FwY2hhaW5JbWFnZXM7CisgICAgdWludDMyX3Qgc3dhcGNoYWluSW1hZ2VDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFN3YXBjaGFpbkltYWdlc0tIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU3dhcGNoYWluS0hSPiggc3dhcGNoYWluICksICZzd2FwY2hhaW5JbWFnZUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHN3YXBjaGFpbkltYWdlQ291bnQgKQorICAgICAgeworICAgICAgICBzd2FwY2hhaW5JbWFnZXMucmVzaXplKCBzd2FwY2hhaW5JbWFnZUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApLCAmc3dhcGNoYWluSW1hZ2VDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlKj4oIHN3YXBjaGFpbkltYWdlcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHN3YXBjaGFpbkltYWdlQ291bnQgPD0gc3dhcGNoYWluSW1hZ2VzLnNpemUoKSApOworICAgICAgc3dhcGNoYWluSW1hZ2VzLnJlc2l6ZSggc3dhcGNoYWluSW1hZ2VDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc3dhcGNoYWluSW1hZ2VzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldFN3YXBjaGFpbkltYWdlc0tIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8SW1hZ2UsQWxsb2NhdG9yPj46OnR5cGUgRGV2aWNlOjpnZXRTd2FwY2hhaW5JbWFnZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8SW1hZ2UsQWxsb2NhdG9yPiBzd2FwY2hhaW5JbWFnZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHN3YXBjaGFpbkltYWdlQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApLCAmc3dhcGNoYWluSW1hZ2VDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBzd2FwY2hhaW5JbWFnZUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgc3dhcGNoYWluSW1hZ2VzLnJlc2l6ZSggc3dhcGNoYWluSW1hZ2VDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSwgJnN3YXBjaGFpbkltYWdlQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZSo+KCBzd2FwY2hhaW5JbWFnZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBzd2FwY2hhaW5JbWFnZUNvdW50IDw9IHN3YXBjaGFpbkltYWdlcy5zaXplKCkgKTsKKyAgICAgIHN3YXBjaGFpbkltYWdlcy5yZXNpemUoIHN3YXBjaGFpbkltYWdlQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN3YXBjaGFpbkltYWdlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRTd2FwY2hhaW5JbWFnZXNLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRTd2FwY2hhaW5TdGF0dXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0U3dhcGNoYWluU3RhdHVzS0hSKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpnZXRTd2FwY2hhaW5TdGF0dXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFN3YXBjaGFpblN0YXR1c0tIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrU3dhcGNoYWluS0hSPiggc3dhcGNoYWluICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OmdldFN3YXBjaGFpblN0YXR1c0tIUiIsIHsgUmVzdWx0OjplU3VjY2VzcywgUmVzdWx0OjplU3Vib3B0aW1hbEtIUiB9ICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6Z2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGUsIHNpemVfdCogcERhdGFTaXplLCB2b2lkKiBwRGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1ZhbGlkYXRpb25DYWNoZUVYVD4oIHZhbGlkYXRpb25DYWNoZSApLCBwRGF0YVNpemUsIHBEYXRhICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90LEFsbG9jYXRvcj4gZGF0YTsKKyAgICBzaXplX3QgZGF0YVNpemU7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVFWFQ+KCB2YWxpZGF0aW9uQ2FjaGUgKSwgJmRhdGFTaXplLCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIGRhdGFTaXplICkKKyAgICAgIHsKKyAgICAgICAgZGF0YS5yZXNpemUoIGRhdGFTaXplICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtWYWxpZGF0aW9uQ2FjaGVFWFQ+KCB2YWxpZGF0aW9uQ2FjaGUgKSwgJmRhdGFTaXplLCByZWludGVycHJldF9jYXN0PHZvaWQqPiggZGF0YS5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIGRhdGFTaXplIDw9IGRhdGEuc2l6ZSgpICk7CisgICAgICBkYXRhLnJlc2l6ZSggZGF0YVNpemUgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGRhdGEsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6Z2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+Pjo6dHlwZSBEZXZpY2U6OmdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdCxBbGxvY2F0b3I+IGRhdGEoIHZlY3RvckFsbG9jYXRvciApOworICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1ZhbGlkYXRpb25DYWNoZUVYVD4oIHZhbGlkYXRpb25DYWNoZSApLCAmZGF0YVNpemUsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgZGF0YVNpemUgKQorICAgICAgeworICAgICAgICBkYXRhLnJlc2l6ZSggZGF0YVNpemUgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1ZhbGlkYXRpb25DYWNoZUVYVD4oIHZhbGlkYXRpb25DYWNoZSApLCAmZGF0YVNpemUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCBkYXRhLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggZGF0YVNpemUgPD0gZGF0YS5zaXplKCkgKTsKKyAgICAgIGRhdGEucmVzaXplKCBkYXRhU2l6ZSApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGF0YSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpnZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmltcG9ydEZlbmNlRmRLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRGZW5jZUZkSW5mb0tIUiogcEltcG9ydEZlbmNlRmRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrSW1wb3J0RmVuY2VGZEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUio+KCBwSW1wb3J0RmVuY2VGZEluZm8gKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmltcG9ydEZlbmNlRmRLSFIoIGNvbnN0IEltcG9ydEZlbmNlRmRJbmZvS0hSICYgaW1wb3J0RmVuY2VGZEluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrSW1wb3J0RmVuY2VGZEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUio+KCAmaW1wb3J0RmVuY2VGZEluZm8gKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6aW1wb3J0RmVuY2VGZEtIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6aW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKj4oIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6aW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiggY29uc3QgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgJiBpbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKj4oICZpbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjppbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6aW1wb3J0U2VtYXBob3JlRmRLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtJbXBvcnRTZW1hcGhvcmVGZEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqPiggcEltcG9ydFNlbWFwaG9yZUZkSW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6aW1wb3J0U2VtYXBob3JlRmRLSFIoIGNvbnN0IEltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiAmIGltcG9ydFNlbWFwaG9yZUZkSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtJbXBvcnRTZW1hcGhvcmVGZEtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqPiggJmltcG9ydFNlbWFwaG9yZUZkSW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjppbXBvcnRTZW1hcGhvcmVGZEtIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6aW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqPiggcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6aW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoIGNvbnN0IEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAmIGltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqPiggJmltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjppbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiBwSW5pdGlhbGl6ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqPiggcEluaXRpYWxpemVJbmZvICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgRGV2aWNlOjppbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCggY29uc3QgSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMICYgaW5pdGlhbGl6ZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKj4oICZpbml0aWFsaXplSW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjppbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjppbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKCBtX2RldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKj4oIHBNZW1vcnlSYW5nZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OmludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hcHBlZE1lbW9yeVJhbmdlPiBtZW1vcnlSYW5nZXMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyggbV9kZXZpY2UsIG1lbW9yeVJhbmdlcy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqPiggbWVtb3J5UmFuZ2VzLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjppbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6Om1hcE1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIG9mZnNldCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZVNpemUgc2l6ZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1lbW9yeU1hcEZsYWdzIGZsYWdzLCB2b2lkKiogcHBEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrTWFwTWVtb3J5KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VNZW1vcnk+KCBtZW1vcnkgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggb2Zmc2V0ICksIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oIHNpemUgKSwgc3RhdGljX2Nhc3Q8VmtNZW1vcnlNYXBGbGFncz4oIGZsYWdzICksIHBwRGF0YSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkKj46OnR5cGUgRGV2aWNlOjptYXBNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlU2l6ZSBvZmZzZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VTaXplIHNpemUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZW1vcnlNYXBGbGFncyBmbGFncywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgdm9pZCogcERhdGE7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtNYXBNZW1vcnkoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0RldmljZU1lbW9yeT4oIG1lbW9yeSApLCBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KCBvZmZzZXQgKSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPiggc2l6ZSApLCBzdGF0aWNfY2FzdDxWa01lbW9yeU1hcEZsYWdzPiggZmxhZ3MgKSwgJnBEYXRhICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcERhdGEsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6bWFwTWVtb3J5IiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6Om1lcmdlUGlwZWxpbmVDYWNoZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaXBlbGluZUNhY2hlIGRzdENhY2hlLCB1aW50MzJfdCBzcmNDYWNoZUNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSogcFNyY0NhY2hlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a01lcmdlUGlwZWxpbmVDYWNoZXMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBkc3RDYWNoZSApLCBzcmNDYWNoZUNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVDYWNoZSo+KCBwU3JjQ2FjaGVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgRGV2aWNlOjptZXJnZVBpcGVsaW5lQ2FjaGVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZSBkc3RDYWNoZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGlwZWxpbmVDYWNoZT4gc3JjQ2FjaGVzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a01lcmdlUGlwZWxpbmVDYWNoZXMoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ2FjaGU+KCBkc3RDYWNoZSApLCBzcmNDYWNoZXMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ2FjaGUqPiggc3JjQ2FjaGVzLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjptZXJnZVBpcGVsaW5lQ2FjaGVzIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6Om1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCBkc3RDYWNoZSwgdWludDMyX3Qgc3JjQ2FjaGVDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVCogcFNyY0NhY2hlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrVmFsaWRhdGlvbkNhY2hlRVhUPiggZHN0Q2FjaGUgKSwgc3JjQ2FjaGVDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUVYVCo+KCBwU3JjQ2FjaGVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgRGV2aWNlOjptZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpWYWxpZGF0aW9uQ2FjaGVFWFQgZHN0Q2FjaGUsIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlZhbGlkYXRpb25DYWNoZUVYVD4gc3JjQ2FjaGVzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrVmFsaWRhdGlvbkNhY2hlRVhUPiggZHN0Q2FjaGUgKSwgc3JjQ2FjaGVzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqPiggc3JjQ2FjaGVzLmRhdGEoKSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjptZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6cmVnaXN0ZXJFdmVudEVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUV2ZW50SW5mb0VYVCogcERldmljZUV2ZW50SW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSogcEZlbmNlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqPiggcERldmljZUV2ZW50SW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGZW5jZSo+KCBwRmVuY2UgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2U+Ojp0eXBlIERldmljZTo6cmVnaXN0ZXJFdmVudEVYVCggY29uc3QgRGV2aWNlRXZlbnRJbmZvRVhUICYgZGV2aWNlRXZlbnRJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKj4oICZkZXZpY2VFdmVudEluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRmVuY2UqPiggJmZlbmNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBmZW5jZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpyZWdpc3RlckV2ZW50RVhUIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPEZlbmNlLERpc3BhdGNoPj46OnR5cGUgRGV2aWNlOjpyZWdpc3RlckV2ZW50RVhUVW5pcXVlKCBjb25zdCBEZXZpY2VFdmVudEluZm9FWFQgJiBkZXZpY2VFdmVudEluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqPiggJmRldmljZUV2ZW50SW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGZW5jZSo+KCAmZmVuY2UgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxGZW5jZSxEaXNwYXRjaD4oIHJlc3VsdCwgZmVuY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6cmVnaXN0ZXJFdmVudEVYVFVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpyZWdpc3RlckRpc3BsYXlFdmVudEVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlFdmVudEluZm9FWFQqIHBEaXNwbGF5RXZlbnRJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlKiBwRmVuY2UsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGlzcGxheUtIUj4oIGRpc3BsYXkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqPiggcERpc3BsYXlFdmVudEluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrRmVuY2UqPiggcEZlbmNlICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlPjo6dHlwZSBEZXZpY2U6OnJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBEaXNwbGF5RXZlbnRJbmZvRVhUICYgZGlzcGxheUV2ZW50SW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGlzcGxheUtIUj4oIGRpc3BsYXkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqPiggJmRpc3BsYXlFdmVudEluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRmVuY2UqPiggJmZlbmNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBmZW5jZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpyZWdpc3RlckRpc3BsYXlFdmVudEVYVCIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxGZW5jZSxEaXNwYXRjaD4+Ojp0eXBlIERldmljZTo6cmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFRVbmlxdWUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IERpc3BsYXlFdmVudEluZm9FWFQgJiBkaXNwbGF5RXZlbnRJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEaXNwbGF5S0hSPiggZGlzcGxheSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheUV2ZW50SW5mb0VYVCo+KCAmZGlzcGxheUV2ZW50SW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGZW5jZSo+KCAmZmVuY2UgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PERldmljZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxGZW5jZSxEaXNwYXRjaD4oIHJlc3VsdCwgZmVuY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6cmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFRVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6cmVnaXN0ZXJPYmplY3RzTlZYKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIHVpbnQzMl90IG9iamVjdENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0VGFibGVFbnRyeU5WWCogY29uc3QqIHBwT2JqZWN0VGFibGVFbnRyaWVzLCBjb25zdCB1aW50MzJfdCogcE9iamVjdEluZGljZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtSZWdpc3Rlck9iamVjdHNOVlgoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa09iamVjdFRhYmxlTlZYPiggb2JqZWN0VGFibGUgKSwgb2JqZWN0Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCo+KCBwcE9iamVjdFRhYmxlRW50cmllcyApLCBwT2JqZWN0SW5kaWNlcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OnJlZ2lzdGVyT2JqZWN0c05WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdD4gcE9iamVjdFRhYmxlRW50cmllcywgQXJyYXlQcm94eTxjb25zdCB1aW50MzJfdD4gb2JqZWN0SW5kaWNlcywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHBPYmplY3RUYWJsZUVudHJpZXMuc2l6ZSgpID09IG9iamVjdEluZGljZXMuc2l6ZSgpICk7CisjZWxzZQorICAgIGlmICggcE9iamVjdFRhYmxlRW50cmllcy5zaXplKCkgIT0gb2JqZWN0SW5kaWNlcy5zaXplKCkgKQorICAgIHsKKyAgICAgIHRocm93IExvZ2ljRXJyb3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpWa0RldmljZTo6cmVnaXN0ZXJPYmplY3RzTlZYOiBwT2JqZWN0VGFibGVFbnRyaWVzLnNpemUoKSAhPSBvYmplY3RJbmRpY2VzLnNpemUoKSIgKTsKKyAgICB9CisjZW5kaWYgIC8qVlVMS0FOX0hQUF9OT19FWENFUFRJT05TKi8KKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1JlZ2lzdGVyT2JqZWN0c05WWCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrT2JqZWN0VGFibGVOVlg+KCBvYmplY3RUYWJsZSApLCBwT2JqZWN0VGFibGVFbnRyaWVzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCo+KCBwT2JqZWN0VGFibGVFbnRyaWVzLmRhdGEoKSApLCBvYmplY3RJbmRpY2VzLmRhdGEoKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6cmVnaXN0ZXJPYmplY3RzTlZYIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OnJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW4sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBjaGFpbiApICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OnJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwY2hhaW4sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwY2hhaW4gKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6cmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpyZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTD4oIGNvbmZpZ3VyYXRpb24gKSApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgRGV2aWNlOjpyZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw+KCBjb25maWd1cmF0aW9uICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OnJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpyZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKCBtX2RldmljZSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKCBtX2RldmljZSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6cmVzZXRDb21tYW5kUG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2xSZXNldEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUmVzZXRDb21tYW5kUG9vbCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQ29tbWFuZFBvb2w+KCBjb21tYW5kUG9vbCApLCBzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sUmVzZXRGbGFncz4oIGZsYWdzICkgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6cmVzZXRDb21tYW5kUG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2xSZXNldEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1Jlc2V0Q29tbWFuZFBvb2woIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sPiggY29tbWFuZFBvb2wgKSwgc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbFJlc2V0RmxhZ3M+KCBmbGFncyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpyZXNldENvbW1hbmRQb29sIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6cmVzZXREZXNjcmlwdG9yUG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUmVzZXREZXNjcmlwdG9yUG9vbCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclBvb2w+KCBkZXNjcmlwdG9yUG9vbCApLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncz4oIGZsYWdzICkgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6cmVzZXREZXNjcmlwdG9yUG9vbCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1Jlc2V0RGVzY3JpcHRvclBvb2woIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JQb29sPiggZGVzY3JpcHRvclBvb2wgKSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3M+KCBmbGFncyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpyZXNldERlc2NyaXB0b3JQb29sIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6cmVzZXRFdmVudCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV2ZW50IGV2ZW50LCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUmVzZXRFdmVudCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRXZlbnQ+KCBldmVudCApICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OnJlc2V0RXZlbnQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFdmVudCBldmVudCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtSZXNldEV2ZW50KCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtFdmVudD4oIGV2ZW50ICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OnJlc2V0RXZlbnQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6cmVzZXRGZW5jZXMoIHVpbnQzMl90IGZlbmNlQ291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSogcEZlbmNlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1Jlc2V0RmVuY2VzKCBtX2RldmljZSwgZmVuY2VDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ZlbmNlKj4oIHBGZW5jZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OnJlc2V0RmVuY2VzKCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZT4gZmVuY2VzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1Jlc2V0RmVuY2VzKCBtX2RldmljZSwgZmVuY2VzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGZW5jZSo+KCBmZW5jZXMuZGF0YSgpICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OnJlc2V0RmVuY2VzIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnJlc2V0UXVlcnlQb29sRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtSZXNldFF1ZXJ5UG9vbEVYVCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrUXVlcnlQb29sPiggcXVlcnlQb29sICksIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpyZXNldFF1ZXJ5UG9vbEVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1Jlc2V0UXVlcnlQb29sRVhUKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtRdWVyeVBvb2w+KCBxdWVyeVBvb2wgKSwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OnNldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKiBwTmFtZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQqPiggcE5hbWVJbmZvICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgRGV2aWNlOjpzZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCggY29uc3QgRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUICYgbmFtZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKj4oICZuYW1lSW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpzZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjpzZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQqIHBUYWdJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCo+KCBwVGFnSW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6c2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCggY29uc3QgRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgJiB0YWdJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQqPiggJnRhZ0luZm8gKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6c2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OnNldEV2ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtTZXRFdmVudCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRXZlbnQ+KCBldmVudCApICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBEZXZpY2U6OnNldEV2ZW50KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXZlbnQgZXZlbnQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrU2V0RXZlbnQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0V2ZW50PiggZXZlbnQgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OkRldmljZTo6c2V0RXZlbnQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnNldEhkck1ldGFkYXRhRVhUKCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiogcFN3YXBjaGFpbnMsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZHJNZXRhZGF0YUVYVCogcE1ldGFkYXRhLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1NldEhkck1ldGFkYXRhRVhUKCBtX2RldmljZSwgc3dhcGNoYWluQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5LSFIqPiggcFN3YXBjaGFpbnMgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0hkck1ldGFkYXRhRVhUKj4oIHBNZXRhZGF0YSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjpzZXRIZHJNZXRhZGF0YUVYVCggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSPiBzd2FwY2hhaW5zLCBBcnJheVByb3h5PGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZHJNZXRhZGF0YUVYVD4gbWV0YWRhdGEsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworI2lmZGVmIFZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUworICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBzd2FwY2hhaW5zLnNpemUoKSA9PSBtZXRhZGF0YS5zaXplKCkgKTsKKyNlbHNlCisgICAgaWYgKCBzd2FwY2hhaW5zLnNpemUoKSAhPSBtZXRhZGF0YS5zaXplKCkgKQorICAgIHsKKyAgICAgIHRocm93IExvZ2ljRXJyb3IoIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyAiOjpWa0RldmljZTo6c2V0SGRyTWV0YWRhdGFFWFQ6IHN3YXBjaGFpbnMuc2l6ZSgpICE9IG1ldGFkYXRhLnNpemUoKSIgKTsKKyAgICB9CisjZW5kaWYgIC8qVlVMS0FOX0hQUF9OT19FWENFUFRJT05TKi8KKyAgICBkLnZrU2V0SGRyTWV0YWRhdGFFWFQoIG1fZGV2aWNlLCBzd2FwY2hhaW5zLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5LSFIqPiggc3dhcGNoYWlucy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0hkck1ldGFkYXRhRVhUKj4oIG1ldGFkYXRhLmRhdGEoKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6c2V0TG9jYWxEaW1taW5nQU1EKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3dhcGNoYWluS0hSIHN3YXBDaGFpbiwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiBsb2NhbERpbW1pbmdFbmFibGUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrU2V0TG9jYWxEaW1taW5nQU1EKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5LSFI+KCBzd2FwQ2hhaW4gKSwgc3RhdGljX2Nhc3Q8VmtCb29sMzI+KCBsb2NhbERpbW1pbmdFbmFibGUgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnNldExvY2FsRGltbWluZ0FNRCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN3YXBjaGFpbktIUiBzd2FwQ2hhaW4sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgbG9jYWxEaW1taW5nRW5hYmxlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtTZXRMb2NhbERpbW1pbmdBTUQoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N3YXBjaGFpbktIUj4oIHN3YXBDaGFpbiApLCBzdGF0aWNfY2FzdDxWa0Jvb2wzMj4oIGxvY2FsRGltbWluZ0VuYWJsZSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IERldmljZTo6c2lnbmFsU2VtYXBob3JlS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2VtYXBob3JlU2lnbmFsSW5mb0tIUiogcFNpZ25hbEluZm8sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtTaWduYWxTZW1hcGhvcmVLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUio+KCBwU2lnbmFsSW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6c2lnbmFsU2VtYXBob3JlS0hSKCBjb25zdCBTZW1hcGhvcmVTaWduYWxJbmZvS0hSICYgc2lnbmFsSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtTaWduYWxTZW1hcGhvcmVLSFIoIG1fZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUio+KCAmc2lnbmFsSW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjpzaWduYWxTZW1hcGhvcmVLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6dHJpbUNvbW1hbmRQb29sKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbFRyaW1GbGFncyBmbGFncywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtUcmltQ29tbWFuZFBvb2woIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sPiggY29tbWFuZFBvb2wgKSwgc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbFRyaW1GbGFncz4oIGZsYWdzICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjp0cmltQ29tbWFuZFBvb2woIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sVHJpbUZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtUcmltQ29tbWFuZFBvb2woIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sPiggY29tbWFuZFBvb2wgKSwgc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbFRyaW1GbGFncz4oIGZsYWdzICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjp0cmltQ29tbWFuZFBvb2xLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sVHJpbUZsYWdzIGZsYWdzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1RyaW1Db21tYW5kUG9vbEtIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQ29tbWFuZFBvb2w+KCBjb21tYW5kUG9vbCApLCBzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sVHJpbUZsYWdzPiggZmxhZ3MgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnRyaW1Db21tYW5kUG9vbEtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1RyaW1Db21tYW5kUG9vbEtIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrQ29tbWFuZFBvb2w+KCBjb21tYW5kUG9vbCApLCBzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sVHJpbUZsYWdzPiggZmxhZ3MgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKCBtX2RldmljZSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCggbV9kZXZpY2UgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjp1bm1hcE1lbW9yeSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZU1lbW9yeSBtZW1vcnksIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrVW5tYXBNZW1vcnkoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0RldmljZU1lbW9yeT4oIG1lbW9yeSApICk7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6dW5tYXBNZW1vcnkoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VNZW1vcnkgbWVtb3J5LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtVbm1hcE1lbW9yeSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGV2aWNlTWVtb3J5PiggbWVtb3J5ICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjp1bnJlZ2lzdGVyT2JqZWN0c05WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok9iamVjdEVudHJ5VHlwZU5WWCogcE9iamVjdEVudHJ5VHlwZXMsIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0SW5kaWNlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1VucmVnaXN0ZXJPYmplY3RzTlZYKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtPYmplY3RUYWJsZU5WWD4oIG9iamVjdFRhYmxlICksIG9iamVjdENvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKj4oIHBPYmplY3RFbnRyeVR5cGVzICksIHBPYmplY3RJbmRpY2VzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIERldmljZTo6dW5yZWdpc3Rlck9iamVjdHNOVlgoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6T2JqZWN0RW50cnlUeXBlTlZYPiBvYmplY3RFbnRyeVR5cGVzLCBBcnJheVByb3h5PGNvbnN0IHVpbnQzMl90PiBvYmplY3RJbmRpY2VzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyNpZmRlZiBWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMKKyAgICBWVUxLQU5fSFBQX0FTU0VSVCggb2JqZWN0RW50cnlUeXBlcy5zaXplKCkgPT0gb2JqZWN0SW5kaWNlcy5zaXplKCkgKTsKKyNlbHNlCisgICAgaWYgKCBvYmplY3RFbnRyeVR5cGVzLnNpemUoKSAhPSBvYmplY3RJbmRpY2VzLnNpemUoKSApCisgICAgeworICAgICAgdGhyb3cgTG9naWNFcnJvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HICI6OlZrRGV2aWNlOjp1bnJlZ2lzdGVyT2JqZWN0c05WWDogb2JqZWN0RW50cnlUeXBlcy5zaXplKCkgIT0gb2JqZWN0SW5kaWNlcy5zaXplKCkiICk7CisgICAgfQorI2VuZGlmICAvKlZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUyovCisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtVbnJlZ2lzdGVyT2JqZWN0c05WWCggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrT2JqZWN0VGFibGVOVlg+KCBvYmplY3RUYWJsZSApLCBvYmplY3RFbnRyeVR5cGVzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqPiggb2JqZWN0RW50cnlUeXBlcy5kYXRhKCkgKSwgb2JqZWN0SW5kaWNlcy5kYXRhKCkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpEZXZpY2U6OnVucmVnaXN0ZXJPYmplY3RzTlZYIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKCBtX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yU2V0PiggZGVzY3JpcHRvclNldCApLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZT4oIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSApLCBwRGF0YSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclNldD4oIGRlc2NyaXB0b3JTZXQgKSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU+KCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgKSwgcERhdGEgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjp1cGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3Qgdm9pZCogcERhdGEsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiggbV9kZXZpY2UsIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclNldD4oIGRlc2NyaXB0b3JTZXQgKSwgc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU+KCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgKSwgcERhdGEgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgRGV2aWNlOjp1cGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3Qgdm9pZCogcERhdGEsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoIG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JTZXQ+KCBkZXNjcmlwdG9yU2V0ICksIHN0YXRpY19jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPiggZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICksIHBEYXRhICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBEZXZpY2U6OnVwZGF0ZURlc2NyaXB0b3JTZXRzKCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMsIHVpbnQzMl90IGRlc2NyaXB0b3JDb3B5Q291bnQsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb3B5RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JDb3BpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrVXBkYXRlRGVzY3JpcHRvclNldHMoIG1fZGV2aWNlLCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCo+KCBwRGVzY3JpcHRvcldyaXRlcyApLCBkZXNjcmlwdG9yQ29weUNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqPiggcERlc2NyaXB0b3JDb3BpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIERldmljZTo6dXBkYXRlRGVzY3JpcHRvclNldHMoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OldyaXRlRGVzY3JpcHRvclNldD4gZGVzY3JpcHRvcldyaXRlcywgQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Q29weURlc2NyaXB0b3JTZXQ+IGRlc2NyaXB0b3JDb3BpZXMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCBtX2RldmljZSwgZGVzY3JpcHRvcldyaXRlcy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0Kj4oIGRlc2NyaXB0b3JXcml0ZXMuZGF0YSgpICksIGRlc2NyaXB0b3JDb3BpZXMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0Kj4oIGRlc2NyaXB0b3JDb3BpZXMuZGF0YSgpICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjp3YWl0Rm9yRmVuY2VzKCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UqIHBGZW5jZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgd2FpdEFsbCwgdWludDY0X3QgdGltZW91dCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1dhaXRGb3JGZW5jZXMoIG1fZGV2aWNlLCBmZW5jZUNvdW50LCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRmVuY2UqPiggcEZlbmNlcyApLCBzdGF0aWNfY2FzdDxWa0Jvb2wzMj4oIHdhaXRBbGwgKSwgdGltZW91dCApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OndhaXRGb3JGZW5jZXMoIEFycmF5UHJveHk8Y29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlPiBmZW5jZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpCb29sMzIgd2FpdEFsbCwgdWludDY0X3QgdGltZW91dCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtXYWl0Rm9yRmVuY2VzKCBtX2RldmljZSwgZmVuY2VzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGZW5jZSo+KCBmZW5jZXMuZGF0YSgpICksIHN0YXRpY19jYXN0PFZrQm9vbDMyPiggd2FpdEFsbCApLCB0aW1lb3V0ICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjp3YWl0Rm9yRmVuY2VzIiwgeyBSZXN1bHQ6OmVTdWNjZXNzLCBSZXN1bHQ6OmVUaW1lb3V0IH0gKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgRGV2aWNlOjp3YWl0U2VtYXBob3Jlc0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNlbWFwaG9yZVdhaXRJbmZvS0hSKiBwV2FpdEluZm8sIHVpbnQ2NF90IHRpbWVvdXQsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtXYWl0U2VtYXBob3Jlc0tIUiggbV9kZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUio+KCBwV2FpdEluZm8gKSwgdGltZW91dCApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBEZXZpY2U6OndhaXRTZW1hcGhvcmVzS0hSKCBjb25zdCBTZW1hcGhvcmVXYWl0SW5mb0tIUiAmIHdhaXRJbmZvLCB1aW50NjRfdCB0aW1lb3V0LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1dhaXRTZW1hcGhvcmVzS0hSKCBtX2RldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKj4oICZ3YWl0SW5mbyApLCB0aW1lb3V0ICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6RGV2aWNlOjp3YWl0U2VtYXBob3Jlc0tIUiIsIHsgUmVzdWx0OjplU3VjY2VzcywgUmVzdWx0OjplVGltZW91dCB9ICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IEluc3RhbmNlOjpjcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiogcFN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oIHBTdXJmYWNlICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFI+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiggY29uc3QgQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCAmc3VyZmFjZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlQW5kcm9pZFN1cmZhY2VLSFJVbmlxdWUoIGNvbnN0IEFuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggJnN1cmZhY2UgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PEluc3RhbmNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+KCByZXN1bHQsIHN1cmZhY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6Okluc3RhbmNlOjpjcmVhdGVBbmRyb2lkU3VyZmFjZUtIUlVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IEluc3RhbmNlOjpjcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqIHBDYWxsYmFjaywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKj4oIHBDYWxsYmFjayApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCggY29uc3QgRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqPiggJmNhbGxiYWNrICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBjYWxsYmFjaywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8RGVidWdSZXBvcnRDYWxsYmFja0VYVCxEaXNwYXRjaD4+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUVW5pcXVlKCBjb25zdCBEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2s7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCo+KCAmY2FsbGJhY2sgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PEluc3RhbmNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPERlYnVnUmVwb3J0Q2FsbGJhY2tFWFQsRGlzcGF0Y2g+KCByZXN1bHQsIGNhbGxiYWNrLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVFVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgSW5zdGFuY2U6OmNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckVYVCogcE1lc3NlbmdlciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKj4oIHBNZXNzZW5nZXIgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckVYVD46OnR5cGUgSW5zdGFuY2U6OmNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIGNvbnN0IERlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXI7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCo+KCAmbWVzc2VuZ2VyICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBtZXNzZW5nZXIsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6Okluc3RhbmNlOjpjcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPERlYnVnVXRpbHNNZXNzZW5nZXJFWFQsRGlzcGF0Y2g+Pjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVFVuaXF1ZSggY29uc3QgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlcjsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKj4oICZtZXNzZW5nZXIgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PEluc3RhbmNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPERlYnVnVXRpbHNNZXNzZW5nZXJFWFQsRGlzcGF0Y2g+KCByZXN1bHQsIG1lc3NlbmdlciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFRVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IEluc3RhbmNlOjpjcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCBwU3VyZmFjZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiggY29uc3QgRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTdXJmYWNlS0hSLERpc3BhdGNoPj46OnR5cGUgSW5zdGFuY2U6OmNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFJVbmlxdWUoIGNvbnN0IERpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCAmc3VyZmFjZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8SW5zdGFuY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U3VyZmFjZUtIUixEaXNwYXRjaD4oIHJlc3VsdCwgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFJVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IEluc3RhbmNlOjpjcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCBwU3VyZmFjZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKCBjb25zdCBIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUVW5pcXVlKCBjb25zdCBIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxJbnN0YW5jZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxTdXJmYWNlS0hSLERpc3BhdGNoPiggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IEluc3RhbmNlOjpjcmVhdGVJT1NTdXJmYWNlTVZLKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIqIHBTdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlSU9TU3VyZmFjZU1WSyggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggcFN1cmZhY2UgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUj46OnR5cGUgSW5zdGFuY2U6OmNyZWF0ZUlPU1N1cmZhY2VNVksoIGNvbnN0IElPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlSU9TU3VyZmFjZU1WSyggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggJnN1cmZhY2UgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN1cmZhY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6Okluc3RhbmNlOjpjcmVhdGVJT1NTdXJmYWNlTVZLIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlSU9TU3VyZmFjZU1WS1VuaXF1ZSggY29uc3QgSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVJT1NTdXJmYWNlTVZLKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCAmc3VyZmFjZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8SW5zdGFuY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U3VyZmFjZUtIUixEaXNwYXRjaD4oIHJlc3VsdCwgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZUlPU1N1cmZhY2VNVktVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9JT1NfTVZLKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgSW5zdGFuY2U6OmNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggcFN1cmZhY2UgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUj46OnR5cGUgSW5zdGFuY2U6OmNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKCBjb25zdCBJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQVVuaXF1ZSggY29uc3QgSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCAmc3VyZmFjZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8SW5zdGFuY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U3VyZmFjZUtIUixEaXNwYXRjaD4oIHJlc3VsdCwgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fRlVDSFNJQSovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgSW5zdGFuY2U6OmNyZWF0ZU1hY09TU3VyZmFjZU1WSyggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok1hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIqIHBTdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oIHBTdXJmYWNlICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFI+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVNYWNPU1N1cmZhY2VNVksoIGNvbnN0IE1hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVNYWNPU1N1cmZhY2VNVksoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggJnN1cmZhY2UgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN1cmZhY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6Okluc3RhbmNlOjpjcmVhdGVNYWNPU1N1cmZhY2VNVksiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVNYWNPU1N1cmZhY2VNVktVbmlxdWUoIGNvbnN0IE1hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVNYWNPU1N1cmZhY2VNVksoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggJnN1cmZhY2UgKSApICk7CisKKyAgICBPYmplY3REZXN0cm95PEluc3RhbmNlLERpc3BhdGNoPiBkZWxldGVyKCAqdGhpcywgYWxsb2NhdG9yLCBkICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+KCByZXN1bHQsIHN1cmZhY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6Okluc3RhbmNlOjpjcmVhdGVNYWNPU1N1cmZhY2VNVktVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9NQUNPU19NVksqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IEluc3RhbmNlOjpjcmVhdGVNZXRhbFN1cmZhY2VFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCBwU3VyZmFjZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlTWV0YWxTdXJmYWNlRVhUKCBjb25zdCBNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlTWV0YWxTdXJmYWNlRVhUIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlTWV0YWxTdXJmYWNlRVhUVW5pcXVlKCBjb25zdCBNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxJbnN0YW5jZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxTdXJmYWNlS0hSLERpc3BhdGNoPiggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlTWV0YWxTdXJmYWNlRVhUVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBJbnN0YW5jZTo6Y3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIHBDcmVhdGVJbmZvLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIqIHBTdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCBwU3VyZmFjZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoIGNvbnN0IFN0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggJnN1cmZhY2UgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN1cmZhY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6Okluc3RhbmNlOjpjcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCIgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFVuaXF1ZUhhbmRsZTxTdXJmYWNlS0hSLERpc3BhdGNoPj46OnR5cGUgSW5zdGFuY2U6OmNyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQVW5pcXVlKCBjb25zdCBTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxJbnN0YW5jZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxTdXJmYWNlS0hSLERpc3BhdGNoPiggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1BVbmlxdWUiLCBkZWxldGVyICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFKi8KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9HR1AqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgSW5zdGFuY2U6OmNyZWF0ZVZpU3VyZmFjZU5OKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VmlTdXJmYWNlQ3JlYXRlSW5mb05OKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVZpU3VyZmFjZU5OKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggcFN1cmZhY2UgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUj46OnR5cGUgSW5zdGFuY2U6OmNyZWF0ZVZpU3VyZmFjZU5OKCBjb25zdCBWaVN1cmZhY2VDcmVhdGVJbmZvTk4gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVWaVN1cmZhY2VOTiggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTio+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlVmlTdXJmYWNlTk4iICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVWaVN1cmZhY2VOTlVuaXF1ZSggY29uc3QgVmlTdXJmYWNlQ3JlYXRlSW5mb05OICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlVmlTdXJmYWNlTk4oIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4qPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCAmc3VyZmFjZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8SW5zdGFuY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U3VyZmFjZUtIUixEaXNwYXRjaD4oIHJlc3VsdCwgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZVZpU3VyZmFjZU5OVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fVklfTk4qLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgSW5zdGFuY2U6OmNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6V2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggcFN1cmZhY2UgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUj46OnR5cGUgSW5zdGFuY2U6OmNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKCBjb25zdCBXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVXYXlsYW5kU3VyZmFjZUtIUlVuaXF1ZSggY29uc3QgV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCAmc3VyZmFjZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8SW5zdGFuY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U3VyZmFjZUtIUixEaXNwYXRjaD4oIHJlc3VsdCwgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IEluc3RhbmNlOjpjcmVhdGVXaW4zMlN1cmZhY2VLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCBwU3VyZmFjZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlV2luMzJTdXJmYWNlS0hSKCBjb25zdCBXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlV2luMzJTdXJmYWNlS0hSIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPFN1cmZhY2VLSFIsRGlzcGF0Y2g+Pjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlV2luMzJTdXJmYWNlS0hSVW5pcXVlKCBjb25zdCBXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxJbnN0YW5jZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxTdXJmYWNlS0hSLERpc3BhdGNoPiggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlV2luMzJTdXJmYWNlS0hSVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgSW5zdGFuY2U6OmNyZWF0ZVhjYlN1cmZhY2VLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiogcFN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVYY2JTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggcENyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCBwU3VyZmFjZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSPjo6dHlwZSBJbnN0YW5jZTo6Y3JlYXRlWGNiU3VyZmFjZUtIUiggY29uc3QgWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVYY2JTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCAmc3VyZmFjZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZVhjYlN1cmZhY2VLSFIiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVYY2JTdXJmYWNlS0hSVW5pcXVlKCBjb25zdCBYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVhjYlN1cmZhY2VLSFIoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworCisgICAgT2JqZWN0RGVzdHJveTxJbnN0YW5jZSxEaXNwYXRjaD4gZGVsZXRlciggKnRoaXMsIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxTdXJmYWNlS0hSLERpc3BhdGNoPiggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlWGNiU3VyZmFjZUtIUlVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgSW5zdGFuY2U6OmNyZWF0ZVhsaWJTdXJmYWNlS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6WGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSKiBwU3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VLSFIqPiggcFN1cmZhY2UgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUj46OnR5cGUgSW5zdGFuY2U6OmNyZWF0ZVhsaWJTdXJmYWNlS0hSKCBjb25zdCBYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVYbGliU3VyZmFjZUtIUiggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUio+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlS0hSKj4oICZzdXJmYWNlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6Y3JlYXRlWGxpYlN1cmZhY2VLSFIiICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxVbmlxdWVIYW5kbGU8U3VyZmFjZUtIUixEaXNwYXRjaD4+Ojp0eXBlIEluc3RhbmNlOjpjcmVhdGVYbGliU3VyZmFjZUtIUlVuaXF1ZSggY29uc3QgWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSICYgY3JlYXRlSW5mbywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIoIG1faW5zdGFuY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqPiggJmNyZWF0ZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUtIUio+KCAmc3VyZmFjZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8SW5zdGFuY2UsRGlzcGF0Y2g+IGRlbGV0ZXIoICp0aGlzLCBhbGxvY2F0b3IsIGQgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWU8U3VyZmFjZUtIUixEaXNwYXRjaD4oIHJlc3VsdCwgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmNyZWF0ZVhsaWJTdXJmYWNlS0hSVW5pcXVlIiwgZGVsZXRlciApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX05PX1NNQVJUX0hBTkRMRSovCisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWExJQl9LSFIqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIEluc3RhbmNlOjpkZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydEZsYWdzRVhUIGZsYWdzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdFR5cGUsIHVpbnQ2NF90IG9iamVjdCwgc2l6ZV90IGxvY2F0aW9uLCBpbnQzMl90IG1lc3NhZ2VDb2RlLCBjb25zdCBjaGFyKiBwTGF5ZXJQcmVmaXgsIGNvbnN0IGNoYXIqIHBNZXNzYWdlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCggbV9pbnN0YW5jZSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1JlcG9ydEZsYWdzRVhUPiggZmxhZ3MgKSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ+KCBvYmplY3RUeXBlICksIG9iamVjdCwgbG9jYXRpb24sIG1lc3NhZ2VDb2RlLCBwTGF5ZXJQcmVmaXgsIHBNZXNzYWdlICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlYnVnUmVwb3J0TWVzc2FnZUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZSwgdWludDY0X3Qgb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbWVzc2FnZUNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGF5ZXJQcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbWVzc2FnZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgVlVMS0FOX0hQUF9BU1NFUlQoIGxheWVyUHJlZml4LnNpemUoKSA9PSBtZXNzYWdlLnNpemUoKSApOworI2Vsc2UKKyAgICBpZiAoIGxheWVyUHJlZml4LnNpemUoKSAhPSBtZXNzYWdlLnNpemUoKSApCisgICAgeworICAgICAgdGhyb3cgTG9naWNFcnJvciggVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HICI6OlZrSW5zdGFuY2U6OmRlYnVnUmVwb3J0TWVzc2FnZUVYVDogbGF5ZXJQcmVmaXguc2l6ZSgpICE9IG1lc3NhZ2Uuc2l6ZSgpIiApOworICAgIH0KKyNlbmRpZiAgLypWVUxLQU5fSFBQX05PX0VYQ0VQVElPTlMqLworICAgIGQudmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoIG1faW5zdGFuY2UsIHN0YXRpY19jYXN0PFZrRGVidWdSZXBvcnRGbGFnc0VYVD4oIGZsYWdzICksIHN0YXRpY19jYXN0PFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUPiggb2JqZWN0VHlwZSApLCBvYmplY3QsIGxvY2F0aW9uLCBtZXNzYWdlQ29kZSwgbGF5ZXJQcmVmaXguY19zdHIoKSwgbWVzc2FnZS5jX3N0cigpICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBJbnN0YW5jZTo6ZGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCggbV9pbnN0YW5jZSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPiggY2FsbGJhY2sgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdSZXBvcnRDYWxsYmFja0VYVCBjYWxsYmFjaywgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCggbV9pbnN0YW5jZSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPiggY2FsbGJhY2sgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBhbGxvY2F0b3IgKSApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBJbnN0YW5jZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCBtX2luc3RhbmNlLCBzdGF0aWNfY2FzdDxWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ+KCBjYWxsYmFjayApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBJbnN0YW5jZTo6ZGVzdHJveSggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoIG1faW5zdGFuY2UsIHN0YXRpY19jYXN0PFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVD4oIGNhbGxiYWNrICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCBtX2luc3RhbmNlLCBzdGF0aWNfY2FzdDxWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQ+KCBtZXNzZW5nZXIgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIsIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoIG1faW5zdGFuY2UsIHN0YXRpY19jYXN0PFZrRGVidWdVdGlsc01lc3NlbmdlckVYVD4oIG1lc3NlbmdlciApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIEluc3RhbmNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCBtX2luc3RhbmNlLCBzdGF0aWNfY2FzdDxWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQ+KCBtZXNzZW5nZXIgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlciwgT3B0aW9uYWw8Y29uc3QgQWxsb2NhdGlvbkNhbGxiYWNrcz4gYWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCggbV9pbnN0YW5jZSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUPiggbWVzc2VuZ2VyICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlc3Ryb3koIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lJbnN0YW5jZSggbV9pbnN0YW5jZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlc3Ryb3koIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveUluc3RhbmNlKCBtX2luc3RhbmNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIEluc3RhbmNlOjpkZXN0cm95U3VyZmFjZUtIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrRGVzdHJveVN1cmZhY2VLSFIoIG1faW5zdGFuY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqPiggcEFsbG9jYXRvciApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlc3Ryb3lTdXJmYWNlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VLSFI+KCBzdXJmYWNlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgSW5zdGFuY2U6OmRlc3Ryb3koIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VLSFI+KCBzdXJmYWNlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIEluc3RhbmNlOjpkZXN0cm95KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0Rlc3Ryb3lTdXJmYWNlS0hSKCBtX2luc3RhbmNlLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VLSFI+KCBzdXJmYWNlICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBJbnN0YW5jZTo6ZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoIHVpbnQzMl90KiBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKCBtX2luc3RhbmNlLCBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqPiggcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyxBbGxvY2F0b3I+Pjo6dHlwZSBJbnN0YW5jZTo6ZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsQWxsb2NhdG9yPiBwaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllczsKKyAgICB1aW50MzJfdCBwaHlzaWNhbERldmljZUdyb3VwQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyggbV9pbnN0YW5jZSwgJnBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwaHlzaWNhbERldmljZUdyb3VwQ291bnQgKQorICAgICAgeworICAgICAgICBwaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy5yZXNpemUoIHBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoIG1faW5zdGFuY2UsICZwaHlzaWNhbERldmljZUdyb3VwQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyo+KCBwaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCA8PSBwaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLnJlc2l6ZSggcGh5c2ljYWxEZXZpY2VHcm91cENvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyxBbGxvY2F0b3I+Pjo6dHlwZSBJbnN0YW5jZTo6ZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLEFsbG9jYXRvcj4gcGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKCBtX2luc3RhbmNlLCAmcGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCApCisgICAgICB7CisgICAgICAgIHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLnJlc2l6ZSggcGh5c2ljYWxEZXZpY2VHcm91cENvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyggbV9pbnN0YW5jZSwgJnBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKj4oIHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcGh5c2ljYWxEZXZpY2VHcm91cENvdW50IDw9IHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgcGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMucmVzaXplKCBwaHlzaWNhbERldmljZUdyb3VwQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6ZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IEluc3RhbmNlOjplbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiggdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoIG1faW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyo+KCBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIEluc3RhbmNlOjplbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyxBbGxvY2F0b3I+IHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOworICAgIHVpbnQzMl90IHBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKCBtX2luc3RhbmNlLCAmcGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCApCisgICAgICB7CisgICAgICAgIHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLnJlc2l6ZSggcGh5c2ljYWxEZXZpY2VHcm91cENvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiggbV9pbnN0YW5jZSwgJnBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKj4oIHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcGh5c2ljYWxEZXZpY2VHcm91cENvdW50IDw9IHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgcGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMucmVzaXplKCBwaHlzaWNhbERldmljZUdyb3VwQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6ZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLEFsbG9jYXRvcj4+Ojp0eXBlIEluc3RhbmNlOjplbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsQWxsb2NhdG9yPiBwaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3QgcGh5c2ljYWxEZXZpY2VHcm91cENvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoIG1faW5zdGFuY2UsICZwaHlzaWNhbERldmljZUdyb3VwQ291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcGh5c2ljYWxEZXZpY2VHcm91cENvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMucmVzaXplKCBwaHlzaWNhbERldmljZUdyb3VwQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKCBtX2luc3RhbmNlLCAmcGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqPiggcGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwaHlzaWNhbERldmljZUdyb3VwQ291bnQgPD0gcGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy5yZXNpemUoIHBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6Okluc3RhbmNlOjplbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgSW5zdGFuY2U6OmVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyggdWludDMyX3QqIHBQaHlzaWNhbERldmljZUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2UqIHBQaHlzaWNhbERldmljZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoIG1faW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUNvdW50LCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2UqPiggcFBoeXNpY2FsRGV2aWNlcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGh5c2ljYWxEZXZpY2UsQWxsb2NhdG9yPj46OnR5cGUgSW5zdGFuY2U6OmVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZSxBbGxvY2F0b3I+IHBoeXNpY2FsRGV2aWNlczsKKyAgICB1aW50MzJfdCBwaHlzaWNhbERldmljZUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCBtX2luc3RhbmNlLCAmcGh5c2ljYWxEZXZpY2VDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwaHlzaWNhbERldmljZUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcGh5c2ljYWxEZXZpY2VzLnJlc2l6ZSggcGh5c2ljYWxEZXZpY2VDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCBtX2luc3RhbmNlLCAmcGh5c2ljYWxEZXZpY2VDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlKj4oIHBoeXNpY2FsRGV2aWNlcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHBoeXNpY2FsRGV2aWNlQ291bnQgPD0gcGh5c2ljYWxEZXZpY2VzLnNpemUoKSApOworICAgICAgcGh5c2ljYWxEZXZpY2VzLnJlc2l6ZSggcGh5c2ljYWxEZXZpY2VDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcGh5c2ljYWxEZXZpY2VzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpJbnN0YW5jZTo6ZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZSxBbGxvY2F0b3I+Pjo6dHlwZSBJbnN0YW5jZTo6ZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZSxBbGxvY2F0b3I+IHBoeXNpY2FsRGV2aWNlcyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3QgcGh5c2ljYWxEZXZpY2VDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyggbV9pbnN0YW5jZSwgJnBoeXNpY2FsRGV2aWNlQ291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcGh5c2ljYWxEZXZpY2VDb3VudCApCisgICAgICB7CisgICAgICAgIHBoeXNpY2FsRGV2aWNlcy5yZXNpemUoIHBoeXNpY2FsRGV2aWNlQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyggbV9pbnN0YW5jZSwgJnBoeXNpY2FsRGV2aWNlQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZSo+KCBwaHlzaWNhbERldmljZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwaHlzaWNhbERldmljZUNvdW50IDw9IHBoeXNpY2FsRGV2aWNlcy5zaXplKCkgKTsKKyAgICAgIHBoeXNpY2FsRGV2aWNlcy5yZXNpemUoIHBoeXNpY2FsRGV2aWNlQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHBoeXNpY2FsRGV2aWNlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6SW5zdGFuY2U6OmVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBQRk5fdmtWb2lkRnVuY3Rpb24gSW5zdGFuY2U6OmdldFByb2NBZGRyKCBjb25zdCBjaGFyKiBwTmFtZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBkLnZrR2V0SW5zdGFuY2VQcm9jQWRkciggbV9pbnN0YW5jZSwgcE5hbWUgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUEZOX3ZrVm9pZEZ1bmN0aW9uIEluc3RhbmNlOjpnZXRQcm9jQWRkciggY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBkLnZrR2V0SW5zdGFuY2VQcm9jQWRkciggbV9pbnN0YW5jZSwgbmFtZS5jX3N0cigpICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBJbnN0YW5jZTo6c3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZVNldmVyaXR5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgbWVzc2FnZVR5cGVzLCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogcENhbGxiYWNrRGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCggbV9pbnN0YW5jZSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQ+KCBtZXNzYWdlU2V2ZXJpdHkgKSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVD4oIG1lc3NhZ2VUeXBlcyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCo+KCBwQ2FsbGJhY2tEYXRhICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBJbnN0YW5jZTo6c3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZVNldmVyaXR5LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgbWVzc2FnZVR5cGVzLCBjb25zdCBEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICYgY2FsbGJhY2tEYXRhLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCggbV9pbnN0YW5jZSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQ+KCBtZXNzYWdlU2V2ZXJpdHkgKSwgc3RhdGljX2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVD4oIG1lc3NhZ2VUeXBlcyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCo+KCAmY2FsbGJhY2tEYXRhICkgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjphY3F1aXJlWGxpYkRpc3BsYXlFWFQoIERpc3BsYXkqIGRweSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0FjcXVpcmVYbGliRGlzcGxheUVYVCggbV9waHlzaWNhbERldmljZSwgZHB5LCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlLSFI+KCBkaXNwbGF5ICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8RGlzcGxheT46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmFjcXVpcmVYbGliRGlzcGxheUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgRGlzcGxheSBkcHk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQoIG1fcGh5c2ljYWxEZXZpY2UsICZkcHksIHN0YXRpY19jYXN0PFZrRGlzcGxheUtIUj4oIGRpc3BsYXkgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGRweSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmFjcXVpcmVYbGliRGlzcGxheUVYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVCovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Y3JlYXRlRGV2aWNlKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlKiBwRGV2aWNlLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRGV2aWNlKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyo+KCBwQ3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBwQWxsb2NhdG9yICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2UqPiggcERldmljZSApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2U+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpjcmVhdGVEZXZpY2UoIGNvbnN0IERldmljZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2UgZGV2aWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRGV2aWNlKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2UqPiggJmRldmljZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGV2aWNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Y3JlYXRlRGV2aWNlIiApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fU01BUlRfSEFORExFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8VW5pcXVlSGFuZGxlPERldmljZSxEaXNwYXRjaD4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpjcmVhdGVEZXZpY2VVbmlxdWUoIGNvbnN0IERldmljZUNyZWF0ZUluZm8gJiBjcmVhdGVJbmZvLCBPcHRpb25hbDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzPiBhbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2UgZGV2aWNlOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrQ3JlYXRlRGV2aWNlKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyo+KCAmY3JlYXRlSW5mbyApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyo+KCBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIGFsbG9jYXRvciApICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2UqPiggJmRldmljZSApICkgKTsKKworICAgIE9iamVjdERlc3Ryb3k8Tm9QYXJlbnQsRGlzcGF0Y2g+IGRlbGV0ZXIoIGFsbG9jYXRvciwgZCApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZTxEZXZpY2UsRGlzcGF0Y2g+KCByZXN1bHQsIGRldmljZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmNyZWF0ZURldmljZVVuaXF1ZSIsIGRlbGV0ZXIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUqLworI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmNyZWF0ZURpc3BsYXlNb2RlS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkFsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiogcE1vZGUsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVEaXNwbGF5TW9kZUtIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtEaXNwbGF5S0hSPiggZGlzcGxheSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKj4oIHBDcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHBBbGxvY2F0b3IgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlNb2RlS0hSKj4oIHBNb2RlICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlS0hSPjo6dHlwZSBQaHlzaWNhbERldmljZTo6Y3JlYXRlRGlzcGxheU1vZGVLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IERpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiAmIGNyZWF0ZUluZm8sIE9wdGlvbmFsPGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3M+IGFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlNb2RlS0hSIG1vZGU7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtDcmVhdGVEaXNwbGF5TW9kZUtIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtEaXNwbGF5S0hSPiggZGlzcGxheSApLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKj4oICZjcmVhdGVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKj4oIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb25DYWxsYmFja3MqPiggYWxsb2NhdG9yICkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlNb2RlS0hSKj4oICZtb2RlICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBtb2RlLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Y3JlYXRlRGlzcGxheU1vZGVLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjplbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKCBjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlbnNpb25Qcm9wZXJ0aWVzKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHBMYXllck5hbWUsIHBQcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRXh0ZW5zaW9uUHJvcGVydGllcyo+KCBwUHJvcGVydGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RXh0ZW5zaW9uUHJvcGVydGllcyxBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6ZW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyggT3B0aW9uYWw8Y29uc3Qgc3RkOjpzdHJpbmc+IGxheWVyTmFtZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8RXh0ZW5zaW9uUHJvcGVydGllcyxBbGxvY2F0b3I+IHByb3BlcnRpZXM7CisgICAgdWludDMyX3QgcHJvcGVydHlDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIGxheWVyTmFtZSA/IGxheWVyTmFtZS0+Y19zdHIoKSA6IG51bGxwdHIsICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgbGF5ZXJOYW1lID8gbGF5ZXJOYW1lLT5jX3N0cigpIDogbnVsbHB0ciwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPEV4dGVuc2lvblByb3BlcnRpZXMsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoIE9wdGlvbmFsPGNvbnN0IHN0ZDo6c3RyaW5nPiBsYXllck5hbWUsIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxFeHRlbnNpb25Qcm9wZXJ0aWVzLEFsbG9jYXRvcj4gcHJvcGVydGllcyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3QgcHJvcGVydHlDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIGxheWVyTmFtZSA/IGxheWVyTmFtZS0+Y19zdHIoKSA6IG51bGxwdHIsICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgbGF5ZXJOYW1lID8gbGF5ZXJOYW1lLT5jX3N0cigpIDogbnVsbHB0ciwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjplbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkxheWVyUHJvcGVydGllcyogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrTGF5ZXJQcm9wZXJ0aWVzKj4oIHBQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxMYXllclByb3BlcnRpZXMsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyhEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxMYXllclByb3BlcnRpZXMsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKCBtX3BoeXNpY2FsRGV2aWNlLCAmcHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0xheWVyUHJvcGVydGllcyo+KCBwcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcHJvcGVydHlDb3VudCA8PSBwcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjplbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPExheWVyUHJvcGVydGllcyxBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6ZW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxMYXllclByb3BlcnRpZXMsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKCBtX3BoeXNpY2FsRGV2aWNlLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcm9wZXJ0eUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtMYXllclByb3BlcnRpZXMqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHByb3BlcnR5Q291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6ZW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6ZW51bWVyYXRlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90KiBwQ291bnRlckNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyS0hSKiBwQ291bnRlcnMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiogcENvdW50ZXJEZXNjcmlwdGlvbnMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBwQ291bnRlckNvdW50LCByZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKj4oIHBDb3VudGVycyApLCByZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqPiggcENvdW50ZXJEZXNjcmlwdGlvbnMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjplbnVtZXJhdGVRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgQXJyYXlQcm94eTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGVyZm9ybWFuY2VDb3VudGVyS0hSPiBjb3VudGVycywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIsQWxsb2NhdG9yPiBjb3VudGVyRGVzY3JpcHRpb25zOworICAgIHVpbnQzMl90IGNvdW50ZXJDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGNvdW50ZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqPiggY291bnRlcnMuZGF0YSgpICksIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgY291bnRlckNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgY291bnRlckRlc2NyaXB0aW9ucy5yZXNpemUoIGNvdW50ZXJDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiggbV9waHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgY291bnRlcnMuc2l6ZSgpICwgcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlQ291bnRlcktIUio+KCBjb3VudGVycy5kYXRhKCkgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKj4oIGNvdW50ZXJEZXNjcmlwdGlvbnMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBjb3VudGVyQ291bnQgPD0gY291bnRlckRlc2NyaXB0aW9ucy5zaXplKCkgKTsKKyAgICAgIGNvdW50ZXJEZXNjcmlwdGlvbnMucmVzaXplKCBjb3VudGVyQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGNvdW50ZXJEZXNjcmlwdGlvbnMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjplbnVtZXJhdGVRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmVudW1lcmF0ZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBBcnJheVByb3h5PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvdW50ZXJLSFI+IGNvdW50ZXJzLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIsQWxsb2NhdG9yPiBjb3VudGVyRGVzY3JpcHRpb25zKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBjb3VudGVyQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBjb3VudGVycy5zaXplKCkgLCByZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKj4oIGNvdW50ZXJzLmRhdGEoKSApLCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIGNvdW50ZXJDb3VudCApCisgICAgICB7CisgICAgICAgIGNvdW50ZXJEZXNjcmlwdGlvbnMucmVzaXplKCBjb3VudGVyQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGNvdW50ZXJzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqPiggY291bnRlcnMuZGF0YSgpICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUio+KCBjb3VudGVyRGVzY3JpcHRpb25zLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggY291bnRlckNvdW50IDw9IGNvdW50ZXJEZXNjcmlwdGlvbnMuc2l6ZSgpICk7CisgICAgICBjb3VudGVyRGVzY3JpcHRpb25zLnJlc2l6ZSggY291bnRlckNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBjb3VudGVyRGVzY3JpcHRpb25zLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6ZW51bWVyYXRlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRGlzcGxheUtIUj4oIGRpc3BsYXkgKSwgcFByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKj4oIHBQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4gcHJvcGVydGllczsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtEaXNwbGF5S0hSPiggZGlzcGxheSApLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcm9wZXJ0eUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRGlzcGxheUtIUj4oIGRpc3BsYXkgKSwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4gcHJvcGVydGllcyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3QgcHJvcGVydHlDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRGlzcGxheUtIUj4oIGRpc3BsYXkgKSwgJnByb3BlcnR5Q291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcHJvcGVydHlDb3VudCApCisgICAgICB7CisgICAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlLSFI+KCBkaXNwbGF5ICksICZwcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUio+KCBwcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcHJvcGVydHlDb3VudCA8PSBwcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiBkaXNwbGF5LCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlLSFI+KCBkaXNwbGF5ICksIHBQcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKj4oIHBQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLEFsbG9jYXRvcj4gcHJvcGVydGllczsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlLSFI+KCBkaXNwbGF5ICksICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlLSFI+KCBkaXNwbGF5ICksICZwcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXksIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlLSFI+KCBkaXNwbGF5ICksICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlLSFI+KCBkaXNwbGF5ICksICZwcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVJbmZvMktIUiogcERpc3BsYXlQbGFuZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBwQ2FwYWJpbGl0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKj4oIHBEaXNwbGF5UGxhbmVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKj4oIHBDYXBhYmlsaXRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoIGNvbnN0IERpc3BsYXlQbGFuZUluZm8yS0hSICYgZGlzcGxheVBsYW5lSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgY2FwYWJpbGl0aWVzOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKj4oICZkaXNwbGF5UGxhbmVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKj4oICZjYXBhYmlsaXRpZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGNhcGFiaWxpdGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5TW9kZUtIUiBtb2RlLCB1aW50MzJfdCBwbGFuZUluZGV4LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKiBwQ2FwYWJpbGl0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlNb2RlS0hSPiggbW9kZSApLCBwbGFuZUluZGV4LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKj4oIHBDYXBhYmlsaXRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSPjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheU1vZGVLSFIgbW9kZSwgdWludDMyX3QgcGxhbmVJbmRleCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiBjYXBhYmlsaXRpZXM7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRGlzcGxheU1vZGVLSFI+KCBtb2RlICksIHBsYW5lSW5kZXgsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqPiggJmNhcGFiaWxpdGllcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgY2FwYWJpbGl0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoIHVpbnQzMl90IHBsYW5lSW5kZXgsIHVpbnQzMl90KiBwRGlzcGxheUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUiogcERpc3BsYXlzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHBsYW5lSW5kZXgsIHBEaXNwbGF5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5S0hSKj4oIHBEaXNwbGF5cyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheUtIUixBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoIHVpbnQzMl90IHBsYW5lSW5kZXgsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPERpc3BsYXlLSFIsQWxsb2NhdG9yPiBkaXNwbGF5czsKKyAgICB1aW50MzJfdCBkaXNwbGF5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiggbV9waHlzaWNhbERldmljZSwgcGxhbmVJbmRleCwgJmRpc3BsYXlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBkaXNwbGF5Q291bnQgKQorICAgICAgeworICAgICAgICBkaXNwbGF5cy5yZXNpemUoIGRpc3BsYXlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHBsYW5lSW5kZXgsICZkaXNwbGF5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5S0hSKj4oIGRpc3BsYXlzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggZGlzcGxheUNvdW50IDw9IGRpc3BsYXlzLnNpemUoKSApOworICAgICAgZGlzcGxheXMucmVzaXplKCBkaXNwbGF5Q291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGRpc3BsYXlzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlLSFIsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKCB1aW50MzJfdCBwbGFuZUluZGV4LCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8RGlzcGxheUtIUixBbGxvY2F0b3I+IGRpc3BsYXlzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiggbV9waHlzaWNhbERldmljZSwgcGxhbmVJbmRleCwgJmRpc3BsYXlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBkaXNwbGF5Q291bnQgKQorICAgICAgeworICAgICAgICBkaXNwbGF5cy5yZXNpemUoIGRpc3BsYXlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHBsYW5lSW5kZXgsICZkaXNwbGF5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5S0hSKj4oIGRpc3BsYXlzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggZGlzcGxheUNvdW50IDw9IGRpc3BsYXlzLnNpemUoKSApOworICAgICAgZGlzcGxheXMucmVzaXplKCBkaXNwbGF5Q291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGRpc3BsYXlzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXRDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoIHVpbnQzMl90KiBwVGltZURvbWFpbkNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6VGltZURvbWFpbkVYVCogcFRpbWVEb21haW5zLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoIG1fcGh5c2ljYWxEZXZpY2UsIHBUaW1lRG9tYWluQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtUaW1lRG9tYWluRVhUKj4oIHBUaW1lRG9tYWlucyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8VGltZURvbWFpbkVYVCxBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0Q2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFRpbWVEb21haW5FWFQsQWxsb2NhdG9yPiB0aW1lRG9tYWluczsKKyAgICB1aW50MzJfdCB0aW1lRG9tYWluQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCggbV9waHlzaWNhbERldmljZSwgJnRpbWVEb21haW5Db3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiB0aW1lRG9tYWluQ291bnQgKQorICAgICAgeworICAgICAgICB0aW1lRG9tYWlucy5yZXNpemUoIHRpbWVEb21haW5Db3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoIG1fcGh5c2ljYWxEZXZpY2UsICZ0aW1lRG9tYWluQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtUaW1lRG9tYWluRVhUKj4oIHRpbWVEb21haW5zLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggdGltZURvbWFpbkNvdW50IDw9IHRpbWVEb21haW5zLnNpemUoKSApOworICAgICAgdGltZURvbWFpbnMucmVzaXplKCB0aW1lRG9tYWluQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHRpbWVEb21haW5zLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0Q2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxUaW1lRG9tYWluRVhULEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFRpbWVEb21haW5FWFQsQWxsb2NhdG9yPiB0aW1lRG9tYWlucyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3QgdGltZURvbWFpbkNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoIG1fcGh5c2ljYWxEZXZpY2UsICZ0aW1lRG9tYWluQ291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgdGltZURvbWFpbkNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgdGltZURvbWFpbnMucmVzaXplKCB0aW1lRG9tYWluQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKCBtX3BoeXNpY2FsRGV2aWNlLCAmdGltZURvbWFpbkNvdW50LCByZWludGVycHJldF9jYXN0PFZrVGltZURvbWFpbkVYVCo+KCB0aW1lRG9tYWlucy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHRpbWVEb21haW5Db3VudCA8PSB0aW1lRG9tYWlucy5zaXplKCkgKTsKKyAgICAgIHRpbWVEb21haW5zLnJlc2l6ZSggdGltZURvbWFpbkNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCB0aW1lRG9tYWlucywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldENhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogcFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCBtX3BoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKj4oIHBQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVixBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCBtX3BoeXNpY2FsRGV2aWNlLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcm9wZXJ0eUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHByb3BlcnR5Q291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8Q29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViggbV9waHlzaWNhbERldmljZSwgJnByb3BlcnR5Q291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcHJvcGVydHlDb3VudCApCisgICAgICB7CisgICAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCBtX3BoeXNpY2FsRGV2aWNlLCAmcHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldENvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqPiggcFByb3BlcnRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUixBbGxvY2F0b3I+IHByb3BlcnRpZXM7CisgICAgdWludDMyX3QgcHJvcGVydHlDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUio+KCBwcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcHJvcGVydHlDb3VudCA8PSBwcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUixBbGxvY2F0b3I+IHByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcm9wZXJ0eUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHByb3BlcnR5Q291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiggbV9waHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKj4oIHBQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPERpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCAmcHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHByb3BlcnR5Q291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUixBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUixBbGxvY2F0b3I+IHByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCAmcHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHByb3BlcnR5Q291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlQcm9wZXJ0aWVzMktIUiggdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUio+KCBwUHJvcGVydGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UHJvcGVydGllczJLSFIoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8RGlzcGxheVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4gcHJvcGVydGllczsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVByb3BlcnRpZXMyS0hSKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcm9wZXJ0eUNvdW50IDw9IHByb3BlcnRpZXMuc2l6ZSgpICk7CisgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlQcm9wZXJ0aWVzMktIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVByb3BlcnRpZXMyS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UHJvcGVydGllczJLSFIoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPERpc3BsYXlQcm9wZXJ0aWVzMktIUixBbGxvY2F0b3I+IHByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgJnByb3BlcnR5Q291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcHJvcGVydHlDb3VudCApCisgICAgICB7CisgICAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UHJvcGVydGllczJLSFIqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHByb3BlcnR5Q291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVByb3BlcnRpZXMyS0hSIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVByb3BlcnRpZXNLSFIoIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVByb3BlcnRpZXNLSFIqPiggcFByb3BlcnRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPERpc3BsYXlQcm9wZXJ0aWVzS0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UHJvcGVydGllc0tIUihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxEaXNwbGF5UHJvcGVydGllc0tIUixBbGxvY2F0b3I+IHByb3BlcnRpZXM7CisgICAgdWludDMyX3QgcHJvcGVydHlDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByb3BlcnR5Q291bnQgKQorICAgICAgeworICAgICAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiggbV9waHlzaWNhbERldmljZSwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UHJvcGVydGllc0tIUio+KCBwcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcHJvcGVydHlDb3VudCA8PSBwcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXREaXNwbGF5UHJvcGVydGllc0tIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RGlzcGxheVByb3BlcnRpZXNLSFIsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldERpc3BsYXlQcm9wZXJ0aWVzS0hSKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxEaXNwbGF5UHJvcGVydGllc0tIUixBbGxvY2F0b3I+IHByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcm9wZXJ0eUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZwcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVByb3BlcnRpZXNLSFIqPiggcHJvcGVydGllcy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHByb3BlcnR5Q291bnQgPD0gcHJvcGVydGllcy5zaXplKCkgKTsKKyAgICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0RGlzcGxheVByb3BlcnRpZXNLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0RXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qIHBFeHRlcm5hbEJ1ZmZlckluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyo+KCBwRXh0ZXJuYWxCdWZmZXJJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqPiggcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgUGh5c2ljYWxEZXZpY2U6OmdldEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyggY29uc3QgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gJiBleHRlcm5hbEJ1ZmZlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsQnVmZmVyUHJvcGVydGllcyBleHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qPiggJmV4dGVybmFsQnVmZmVySW5mbyApLCByZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKj4oICZleHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgKSApOworICAgIHJldHVybiBleHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0RXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qIHBFeHRlcm5hbEJ1ZmZlckluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyo+KCBwRXh0ZXJuYWxCdWZmZXJJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqPiggcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgUGh5c2ljYWxEZXZpY2U6OmdldEV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiggY29uc3QgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gJiBleHRlcm5hbEJ1ZmZlckluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsQnVmZmVyUHJvcGVydGllcyBleHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qPiggJmV4dGVybmFsQnVmZmVySW5mbyApLCByZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKj4oICZleHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgKSApOworICAgIHJldHVybiBleHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0RXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiBwRXh0ZXJuYWxGZW5jZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKj4oIHBFeHRlcm5hbEZlbmNlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqPiggcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIFBoeXNpY2FsRGV2aWNlOjpnZXRFeHRlcm5hbEZlbmNlUHJvcGVydGllcyggY29uc3QgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyAmIGV4dGVybmFsRmVuY2VJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbEZlbmNlUHJvcGVydGllcyBleHRlcm5hbEZlbmNlUHJvcGVydGllczsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qPiggJmV4dGVybmFsRmVuY2VJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyo+KCAmZXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgKSApOworICAgIHJldHVybiBleHRlcm5hbEZlbmNlUHJvcGVydGllczsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIFBoeXNpY2FsRGV2aWNlOjpnZXRFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qIHBFeHRlcm5hbEZlbmNlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qPiggcEV4dGVybmFsRmVuY2VJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyo+KCBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgUGh5c2ljYWxEZXZpY2U6OmdldEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKCBjb25zdCBQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvICYgZXh0ZXJuYWxGZW5jZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIGV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyo+KCAmZXh0ZXJuYWxGZW5jZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKj4oICZleHRlcm5hbEZlbmNlUHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIGV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Z2V0RXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVR5cGUgdHlwZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVGlsaW5nIHRpbGluZywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyB1c2FnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGV4dGVybmFsSGFuZGxlVHlwZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KCBmb3JtYXQgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZVR5cGU+KCB0eXBlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VUaWxpbmc+KCB0aWxpbmcgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZVVzYWdlRmxhZ3M+KCB1c2FnZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlQ3JlYXRlRmxhZ3M+KCBmbGFncyApLCBzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlY+KCBleHRlcm5hbEhhbmRsZVR5cGUgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqPiggcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlY+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VDcmVhdGVGbGFncyBmbGFncywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgZXh0ZXJuYWxIYW5kbGVUeXBlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViBleHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KCBmb3JtYXQgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZVR5cGU+KCB0eXBlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VUaWxpbmc+KCB0aWxpbmcgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZVVzYWdlRmxhZ3M+KCB1c2FnZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlQ3JlYXRlRmxhZ3M+KCBmbGFncyApLCBzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlY+KCBleHRlcm5hbEhhbmRsZVR5cGUgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqPiggJmV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBleHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0RXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyo+KCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqPiggcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgUGh5c2ljYWxEZXZpY2U6OmdldEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyggY29uc3QgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gJiBleHRlcm5hbFNlbWFwaG9yZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyBleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qPiggJmV4dGVybmFsU2VtYXBob3JlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKj4oICZleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgKSApOworICAgIHJldHVybiBleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0RXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyo+KCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqPiggcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgUGh5c2ljYWxEZXZpY2U6OmdldEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiggY29uc3QgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gJiBleHRlcm5hbFNlbWFwaG9yZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyBleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qPiggJmV4dGVybmFsU2VtYXBob3JlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKj4oICZleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgKSApOworICAgIHJldHVybiBleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0RmVhdHVyZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzKiBwRmVhdHVyZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqPiggcEZlYXR1cmVzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgUGh5c2ljYWxEZXZpY2U6OmdldEZlYXR1cmVzKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdHVyZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzKj4oICZmZWF0dXJlcyApICk7CisgICAgcmV0dXJuIGZlYXR1cmVzOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldEZlYXR1cmVzMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiBwRmVhdHVyZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMio+KCBwRmVhdHVyZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgUGh5c2ljYWxEZXZpY2U6OmdldEZlYXR1cmVzMihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzMiBmZWF0dXJlczsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMio+KCAmZmVhdHVyZXMgKSApOworICAgIHJldHVybiBmZWF0dXJlczsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gUGh5c2ljYWxEZXZpY2U6OmdldEZlYXR1cmVzMihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzMiYgZmVhdHVyZXMgPSBzdHJ1Y3R1cmVDaGFpbi50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyPigpOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKj4oICZmZWF0dXJlcyApICk7CisgICAgcmV0dXJuIHN0cnVjdHVyZUNoYWluOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldEZlYXR1cmVzMktIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiBwRmVhdHVyZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMio+KCBwRmVhdHVyZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgUGh5c2ljYWxEZXZpY2U6OmdldEZlYXR1cmVzMktIUihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzMiBmZWF0dXJlczsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMio+KCAmZmVhdHVyZXMgKSApOworICAgIHJldHVybiBmZWF0dXJlczsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gUGh5c2ljYWxEZXZpY2U6OmdldEZlYXR1cmVzMktIUihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZUZlYXR1cmVzMiYgZmVhdHVyZXMgPSBzdHJ1Y3R1cmVDaGFpbi50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyPigpOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKj4oICZmZWF0dXJlcyApICk7CisgICAgcmV0dXJuIHN0cnVjdHVyZUNoYWluOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldEZvcm1hdFByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllcyogcEZvcm1hdFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Zvcm1hdD4oIGZvcm1hdCApLCByZWludGVycHJldF9jYXN0PFZrRm9ybWF0UHJvcGVydGllcyo+KCBwRm9ybWF0UHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRQcm9wZXJ0aWVzIFBoeXNpY2FsRGV2aWNlOjpnZXRGb3JtYXRQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllcyBmb3JtYXRQcm9wZXJ0aWVzOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRm9ybWF0PiggZm9ybWF0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGb3JtYXRQcm9wZXJ0aWVzKj4oICZmb3JtYXRQcm9wZXJ0aWVzICkgKTsKKyAgICByZXR1cm4gZm9ybWF0UHJvcGVydGllczsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIFBoeXNpY2FsRGV2aWNlOjpnZXRGb3JtYXRQcm9wZXJ0aWVzMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRQcm9wZXJ0aWVzMiogcEZvcm1hdFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KCBmb3JtYXQgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Zvcm1hdFByb3BlcnRpZXMyKj4oIHBGb3JtYXRQcm9wZXJ0aWVzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMyIFBoeXNpY2FsRGV2aWNlOjpnZXRGb3JtYXRQcm9wZXJ0aWVzMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMyIGZvcm1hdFByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRm9ybWF0PiggZm9ybWF0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGb3JtYXRQcm9wZXJ0aWVzMio+KCAmZm9ybWF0UHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIGZvcm1hdFByb3BlcnRpZXM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IFBoeXNpY2FsRGV2aWNlOjpnZXRGb3JtYXRQcm9wZXJ0aWVzMiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gc3RydWN0dXJlQ2hhaW47CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdFByb3BlcnRpZXMyJiBmb3JtYXRQcm9wZXJ0aWVzID0gc3RydWN0dXJlQ2hhaW4udGVtcGxhdGUgZ2V0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRQcm9wZXJ0aWVzMj4oKTsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KCBmb3JtYXQgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Zvcm1hdFByb3BlcnRpZXMyKj4oICZmb3JtYXRQcm9wZXJ0aWVzICkgKTsKKyAgICByZXR1cm4gc3RydWN0dXJlQ2hhaW47CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0Rm9ybWF0UHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllczIqIHBGb3JtYXRQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRm9ybWF0PiggZm9ybWF0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGb3JtYXRQcm9wZXJ0aWVzMio+KCBwRm9ybWF0UHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRQcm9wZXJ0aWVzMiBQaHlzaWNhbERldmljZTo6Z2V0Rm9ybWF0UHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRQcm9wZXJ0aWVzMiBmb3JtYXRQcm9wZXJ0aWVzOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Zvcm1hdD4oIGZvcm1hdCApLCByZWludGVycHJldF9jYXN0PFZrRm9ybWF0UHJvcGVydGllczIqPiggJmZvcm1hdFByb3BlcnRpZXMgKSApOworICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0aWVzOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFksIHR5cGVuYW1lIC4uLlosIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBQaHlzaWNhbERldmljZTo6Z2V0Rm9ybWF0UHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXRQcm9wZXJ0aWVzMiYgZm9ybWF0UHJvcGVydGllcyA9IHN0cnVjdHVyZUNoYWluLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0UHJvcGVydGllczI+KCk7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRm9ybWF0PiggZm9ybWF0ICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGb3JtYXRQcm9wZXJ0aWVzMio+KCAmZm9ybWF0UHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIHN0cnVjdHVyZUNoYWluOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldEdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqIHBGZWF0dXJlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiBwTGltaXRzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCo+KCBwRmVhdHVyZXMgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKj4oIHBMaW1pdHMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggUGh5c2ljYWxEZXZpY2U6OmdldEdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCggRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCAmIGZlYXR1cmVzLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCBsaW1pdHM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCo+KCAmZmVhdHVyZXMgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKj4oICZsaW1pdHMgKSApOworICAgIHJldHVybiBsaW1pdHM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXRJbWFnZUZvcm1hdFByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUeXBlIHR5cGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVRpbGluZyB0aWxpbmcsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUNyZWF0ZUZsYWdzIGZsYWdzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRm9ybWF0PiggZm9ybWF0ICksIHN0YXRpY19jYXN0PFZrSW1hZ2VUeXBlPiggdHlwZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlVGlsaW5nPiggdGlsaW5nICksIHN0YXRpY19jYXN0PFZrSW1hZ2VVc2FnZUZsYWdzPiggdXNhZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUNyZWF0ZUZsYWdzPiggZmxhZ3MgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRm9ybWF0UHJvcGVydGllcyo+KCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllcz46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldEltYWdlRm9ybWF0UHJvcGVydGllcyggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZvcm1hdCBmb3JtYXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVR5cGUgdHlwZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVGlsaW5nIHRpbGluZywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVXNhZ2VGbGFncyB1c2FnZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUZvcm1hdFByb3BlcnRpZXMgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRm9ybWF0PiggZm9ybWF0ICksIHN0YXRpY19jYXN0PFZrSW1hZ2VUeXBlPiggdHlwZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlVGlsaW5nPiggdGlsaW5nICksIHN0YXRpY19jYXN0PFZrSW1hZ2VVc2FnZUZsYWdzPiggdXNhZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZUNyZWF0ZUZsYWdzPiggZmxhZ3MgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRm9ybWF0UHJvcGVydGllcyo+KCAmaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBpbWFnZUZvcm1hdFByb3BlcnRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRJbWFnZUZvcm1hdFByb3BlcnRpZXMiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXRJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiBwSW1hZ2VGb3JtYXRJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMio+KCBwSW1hZ2VGb3JtYXRJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKj4oIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldEltYWdlRm9ybWF0UHJvcGVydGllczIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAmIGltYWdlRm9ybWF0SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllczIgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKj4oICZpbWFnZUZvcm1hdEluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqPiggJmltYWdlRm9ybWF0UHJvcGVydGllcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggY29uc3QgUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yICYgaW1hZ2VGb3JtYXRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPiBzdHJ1Y3R1cmVDaGFpbjsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiYgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gc3RydWN0dXJlQ2hhaW4udGVtcGxhdGUgZ2V0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUZvcm1hdFByb3BlcnRpZXMyPigpOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKj4oICZpbWFnZUZvcm1hdEluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqPiggJmltYWdlRm9ybWF0UHJvcGVydGllcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc3RydWN0dXJlQ2hhaW4sIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRJbWFnZUZvcm1hdFByb3BlcnRpZXMyIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Z2V0SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogcEltYWdlRm9ybWF0SW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllczIqIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqPiggcEltYWdlRm9ybWF0SW5mbyApLCByZWludGVycHJldF9jYXN0PFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMio+KCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllczI+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKCBjb25zdCBQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgJiBpbWFnZUZvcm1hdEluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZUZvcm1hdFByb3BlcnRpZXMyIGltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMio+KCAmaW1hZ2VGb3JtYXRJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKj4oICZpbWFnZUZvcm1hdFByb3BlcnRpZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGltYWdlRm9ybWF0UHJvcGVydGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldEltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxTdHJ1Y3R1cmVDaGFpbjxYLCBZLCBaLi4uPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldEltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAmIGltYWdlRm9ybWF0SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gc3RydWN0dXJlQ2hhaW47CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlRm9ybWF0UHJvcGVydGllczImIGltYWdlRm9ybWF0UHJvcGVydGllcyA9IHN0cnVjdHVyZUNoYWluLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMj4oKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMio+KCAmaW1hZ2VGb3JtYXRJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKj4oICZpbWFnZUZvcm1hdFByb3BlcnRpZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN0cnVjdHVyZUNoYWluLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIFBoeXNpY2FsRGV2aWNlOjpnZXRNZW1vcnlQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKiBwTWVtb3J5UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqPiggcE1lbW9yeVByb3BlcnRpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIFBoeXNpY2FsRGV2aWNlOjpnZXRNZW1vcnlQcm9wZXJ0aWVzKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlQcm9wZXJ0aWVzOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqPiggJm1lbW9yeVByb3BlcnRpZXMgKSApOworICAgIHJldHVybiBtZW1vcnlQcm9wZXJ0aWVzOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldE1lbW9yeVByb3BlcnRpZXMyKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogcE1lbW9yeVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqPiggcE1lbW9yeVByb3BlcnRpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBQaHlzaWNhbERldmljZTo6Z2V0TWVtb3J5UHJvcGVydGllczIoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBtZW1vcnlQcm9wZXJ0aWVzOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMio+KCAmbWVtb3J5UHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIG1lbW9yeVByb3BlcnRpZXM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IFBoeXNpY2FsRGV2aWNlOjpnZXRNZW1vcnlQcm9wZXJ0aWVzMihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyJiBtZW1vcnlQcm9wZXJ0aWVzID0gc3RydWN0dXJlQ2hhaW4udGVtcGxhdGUgZ2V0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyPigpOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMio+KCAmbWVtb3J5UHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIHN0cnVjdHVyZUNoYWluOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldE1lbW9yeVByb3BlcnRpZXMyS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogcE1lbW9yeVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqPiggcE1lbW9yeVByb3BlcnRpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBQaHlzaWNhbERldmljZTo6Z2V0TWVtb3J5UHJvcGVydGllczJLSFIoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBtZW1vcnlQcm9wZXJ0aWVzOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMio+KCAmbWVtb3J5UHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIG1lbW9yeVByb3BlcnRpZXM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgLi4uWiwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IFBoeXNpY2FsRGV2aWNlOjpnZXRNZW1vcnlQcm9wZXJ0aWVzMktIUihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyJiBtZW1vcnlQcm9wZXJ0aWVzID0gc3RydWN0dXJlQ2hhaW4udGVtcGxhdGUgZ2V0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyPigpOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMio+KCAmbWVtb3J5UHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIHN0cnVjdHVyZUNoYWluOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldE11bHRpc2FtcGxlUHJvcGVydGllc0VYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok11bHRpc2FtcGxlUHJvcGVydGllc0VYVCogcE11bHRpc2FtcGxlUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTYW1wbGVDb3VudEZsYWdCaXRzPiggc2FtcGxlcyApLCByZWludGVycHJldF9jYXN0PFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKj4oIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBWVUxLQU5fSFBQX05BTUVTUEFDRTo6TXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIFBoeXNpY2FsRGV2aWNlOjpnZXRNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXMsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Ok11bHRpc2FtcGxlUHJvcGVydGllc0VYVCBtdWx0aXNhbXBsZVByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa1NhbXBsZUNvdW50RmxhZ0JpdHM+KCBzYW1wbGVzICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqPiggJm11bHRpc2FtcGxlUHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIG11bHRpc2FtcGxlUHJvcGVydGllczsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldFByZXNlbnRSZWN0YW5nbGVzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFJlY3RDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlJlY3QyRCogcFJlY3RzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlS0hSPiggc3VyZmFjZSApLCBwUmVjdENvdW50LCByZWludGVycHJldF9jYXN0PFZrUmVjdDJEKj4oIHBSZWN0cyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UmVjdDJELEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRQcmVzZW50UmVjdGFuZ2xlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UmVjdDJELEFsbG9jYXRvcj4gcmVjdHM7CisgICAgdWludDMyX3QgcmVjdENvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlS0hSPiggc3VyZmFjZSApLCAmcmVjdENvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHJlY3RDb3VudCApCisgICAgICB7CisgICAgICAgIHJlY3RzLnJlc2l6ZSggcmVjdENvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VLSFI+KCBzdXJmYWNlICksICZyZWN0Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZWN0MkQqPiggcmVjdHMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCByZWN0Q291bnQgPD0gcmVjdHMuc2l6ZSgpICk7CisgICAgICByZWN0cy5yZXNpemUoIHJlY3RDb3VudCApOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgcmVjdHMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRQcmVzZW50UmVjdGFuZ2xlc0tIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UmVjdDJELEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRQcmVzZW50UmVjdGFuZ2xlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFJlY3QyRCxBbGxvY2F0b3I+IHJlY3RzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCByZWN0Q291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VLSFI+KCBzdXJmYWNlICksICZyZWN0Q291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgcmVjdENvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcmVjdHMucmVzaXplKCByZWN0Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgJnJlY3RDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1JlY3QyRCo+KCByZWN0cy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHJlY3RDb3VudCA8PSByZWN0cy5zaXplKCkgKTsKKyAgICAgIHJlY3RzLnJlc2l6ZSggcmVjdENvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCByZWN0cywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFByZXNlbnRSZWN0YW5nbGVzS0hSIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldFByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyo+KCBwUHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMgUGh5c2ljYWxEZXZpY2U6OmdldFByb3BlcnRpZXMoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyo+KCAmcHJvcGVydGllcyApICk7CisgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0UHJvcGVydGllczIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMio+KCBwUHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIFBoeXNpY2FsRGV2aWNlOjpnZXRQcm9wZXJ0aWVzMihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKj4oICZwcm9wZXJ0aWVzICkgKTsKKyAgICByZXR1cm4gcHJvcGVydGllczsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gUGh5c2ljYWxEZXZpY2U6OmdldFByb3BlcnRpZXMyKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gc3RydWN0dXJlQ2hhaW47CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvcGVydGllczImIHByb3BlcnRpZXMgPSBzdHJ1Y3R1cmVDaGFpbi50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI+KCk7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKj4oICZwcm9wZXJ0aWVzICkgKTsKKyAgICByZXR1cm4gc3RydWN0dXJlQ2hhaW47CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0UHJvcGVydGllczJLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMio+KCBwUHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIFBoeXNpY2FsRGV2aWNlOjpnZXRQcm9wZXJ0aWVzMktIUihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHByb3BlcnRpZXM7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKj4oICZwcm9wZXJ0aWVzICkgKTsKKyAgICByZXR1cm4gcHJvcGVydGllczsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gUGh5c2ljYWxEZXZpY2U6OmdldFByb3BlcnRpZXMyS0hSKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgU3RydWN0dXJlQ2hhaW48WCwgWSwgWi4uLj4gc3RydWN0dXJlQ2hhaW47CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvcGVydGllczImIHByb3BlcnRpZXMgPSBzdHJ1Y3R1cmVDaGFpbi50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI+KCk7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKj4oICZwcm9wZXJ0aWVzICkgKTsKKyAgICByZXR1cm4gc3RydWN0dXJlQ2hhaW47CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0UXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sIHVpbnQzMl90KiBwTnVtUGFzc2VzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKj4oIHBQZXJmb3JtYW5jZVF1ZXJ5Q3JlYXRlSW5mbyApLCBwTnVtUGFzc2VzICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHVpbnQzMl90IFBoeXNpY2FsRGV2aWNlOjpnZXRRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIoIGNvbnN0IFF1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiAmIHBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHVpbnQzMl90IG51bVBhc3NlczsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqPiggJnBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvICksICZudW1QYXNzZXMgKTsKKyAgICByZXR1cm4gbnVtUGFzc2VzOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldFF1ZXVlRmFtaWx5UHJvcGVydGllcyggdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqPiggcFF1ZXVlRmFtaWx5UHJvcGVydGllcyApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjp2ZWN0b3I8UXVldWVGYW1pbHlQcm9wZXJ0aWVzLEFsbG9jYXRvcj4gUGh5c2ljYWxEZXZpY2U6OmdldFF1ZXVlRmFtaWx5UHJvcGVydGllcyhEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMsQWxsb2NhdG9yPiBxdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50OworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgbnVsbHB0ciApOworICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllcy5yZXNpemUoIHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCApOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyo+KCBxdWV1ZUZhbWlseVByb3BlcnRpZXMuZGF0YSgpICkgKTsKKyAgICByZXR1cm4gcXVldWVGYW1pbHlQcm9wZXJ0aWVzOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFF1ZXVlRmFtaWx5UHJvcGVydGllcyxBbGxvY2F0b3I+IFBoeXNpY2FsRGV2aWNlOjpnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFF1ZXVlRmFtaWx5UHJvcGVydGllcyxBbGxvY2F0b3I+IHF1ZXVlRmFtaWx5UHJvcGVydGllcyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50OworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgbnVsbHB0ciApOworICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllcy5yZXNpemUoIHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCApOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyo+KCBxdWV1ZUZhbWlseVByb3BlcnRpZXMuZGF0YSgpICkgKTsKKyAgICByZXR1cm4gcXVldWVGYW1pbHlQcm9wZXJ0aWVzOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldFF1ZXVlRmFtaWx5UHJvcGVydGllczIoIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogcFF1ZXVlRmFtaWx5UHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoIG1fcGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKj4oIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFF1ZXVlRmFtaWx5UHJvcGVydGllczIsQWxsb2NhdG9yPiBQaHlzaWNhbERldmljZTo6Z2V0UXVldWVGYW1pbHlQcm9wZXJ0aWVzMihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMyLEFsbG9jYXRvcj4gcXVldWVGYW1pbHlQcm9wZXJ0aWVzOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCAmcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBudWxscHRyICk7CisgICAgcXVldWVGYW1pbHlQcm9wZXJ0aWVzLnJlc2l6ZSggcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ICk7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqPiggcXVldWVGYW1pbHlQcm9wZXJ0aWVzLmRhdGEoKSApICk7CisgICAgcmV0dXJuIHF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMyLEFsbG9jYXRvcj4gUGh5c2ljYWxEZXZpY2U6OmdldFF1ZXVlRmFtaWx5UHJvcGVydGllczIoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFF1ZXVlRmFtaWx5UHJvcGVydGllczIsQWxsb2NhdG9yPiBxdWV1ZUZhbWlseVByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCAmcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBudWxscHRyICk7CisgICAgcXVldWVGYW1pbHlQcm9wZXJ0aWVzLnJlc2l6ZSggcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ICk7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqPiggcXVldWVGYW1pbHlQcm9wZXJ0aWVzLmRhdGEoKSApICk7CisgICAgcmV0dXJuIHF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJ1Y3R1cmVDaGFpbiwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjp2ZWN0b3I8U3RydWN0dXJlQ2hhaW4sQWxsb2NhdG9yPiBQaHlzaWNhbERldmljZTo6Z2V0UXVldWVGYW1pbHlQcm9wZXJ0aWVzMihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxTdHJ1Y3R1cmVDaGFpbixBbGxvY2F0b3I+IHF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgbnVsbHB0ciApOworICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllcy5yZXNpemUoIHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCApOworICAgIHN0ZDo6dmVjdG9yPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseVByb3BlcnRpZXMyPiBsb2NhbFZlY3RvciggcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ICk7CisgICAgZm9yICggdWludDMyX3QgaSA9IDA7IGkgPCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgOyBpKysgKQorICAgIHsKKyAgICAgIGxvY2FsVmVjdG9yW2ldLnBOZXh0ID0gcXVldWVGYW1pbHlQcm9wZXJ0aWVzW2ldLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMj4oKS5wTmV4dDsKKyAgICB9CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqPiggbG9jYWxWZWN0b3IuZGF0YSgpICkgKTsKKyAgICBmb3IgKCB1aW50MzJfdCBpID0gMDsgaSA8IHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCA7IGkrKyApCisgICAgeworICAgICAgcXVldWVGYW1pbHlQcm9wZXJ0aWVzW2ldLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMj4oKSA9IGxvY2FsVmVjdG9yW2ldOworICAgIH0KKyAgICByZXR1cm4gcXVldWVGYW1pbHlQcm9wZXJ0aWVzOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cnVjdHVyZUNoYWluLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnZlY3RvcjxTdHJ1Y3R1cmVDaGFpbixBbGxvY2F0b3I+IFBoeXNpY2FsRGV2aWNlOjpnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMyKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxTdHJ1Y3R1cmVDaGFpbixBbGxvY2F0b3I+IHF1ZXVlRmFtaWx5UHJvcGVydGllcyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50OworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoIG1fcGh5c2ljYWxEZXZpY2UsICZxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIG51bGxwdHIgKTsKKyAgICBxdWV1ZUZhbWlseVByb3BlcnRpZXMucmVzaXplKCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgKTsKKyAgICBzdGQ6OnZlY3RvcjxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMj4gbG9jYWxWZWN0b3IoIHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCApOworICAgIGZvciAoIHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50IDsgaSsrICkKKyAgICB7CisgICAgICBsb2NhbFZlY3RvcltpXS5wTmV4dCA9IHF1ZXVlRmFtaWx5UHJvcGVydGllc1tpXS50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmFtaWx5UHJvcGVydGllczI+KCkucE5leHQ7CisgICAgfQorICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoIG1fcGh5c2ljYWxEZXZpY2UsICZxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKj4oIGxvY2FsVmVjdG9yLmRhdGEoKSApICk7CisgICAgZm9yICggdWludDMyX3QgaSA9IDA7IGkgPCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgOyBpKysgKQorICAgIHsKKyAgICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllc1tpXS50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmFtaWx5UHJvcGVydGllczI+KCkgPSBsb2NhbFZlY3RvcltpXTsKKyAgICB9CisgICAgcmV0dXJuIHF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIFBoeXNpY2FsRGV2aWNlOjpnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmFtaWx5UHJvcGVydGllczIqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMio+KCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMyLEFsbG9jYXRvcj4gUGh5c2ljYWxEZXZpY2U6OmdldFF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UXVldWVGYW1pbHlQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IHF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgbnVsbHB0ciApOworICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllcy5yZXNpemUoIHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCApOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKj4oIHF1ZXVlRmFtaWx5UHJvcGVydGllcy5kYXRhKCkgKSApOworICAgIHJldHVybiBxdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjp2ZWN0b3I8UXVldWVGYW1pbHlQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IFBoeXNpY2FsRGV2aWNlOjpnZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVByb3BlcnRpZXMyLEFsbG9jYXRvcj4gcXVldWVGYW1pbHlQcm9wZXJ0aWVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgJnF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgbnVsbHB0ciApOworICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllcy5yZXNpemUoIHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCApOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKj4oIHF1ZXVlRmFtaWx5UHJvcGVydGllcy5kYXRhKCkgKSApOworICAgIHJldHVybiBxdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU3RydWN0dXJlQ2hhaW4sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFN0cnVjdHVyZUNoYWluLEFsbG9jYXRvcj4gUGh5c2ljYWxEZXZpY2U6OmdldFF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8U3RydWN0dXJlQ2hhaW4sQWxsb2NhdG9yPiBxdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50OworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIG51bGxwdHIgKTsKKyAgICBxdWV1ZUZhbWlseVByb3BlcnRpZXMucmVzaXplKCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgKTsKKyAgICBzdGQ6OnZlY3RvcjxWVUxLQU5fSFBQX05BTUVTUEFDRTo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzMj4gbG9jYWxWZWN0b3IoIHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCApOworICAgIGZvciAoIHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50IDsgaSsrICkKKyAgICB7CisgICAgICBsb2NhbFZlY3RvcltpXS5wTmV4dCA9IHF1ZXVlRmFtaWx5UHJvcGVydGllc1tpXS50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmFtaWx5UHJvcGVydGllczI+KCkucE5leHQ7CisgICAgfQorICAgIGQudmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsICZxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKj4oIGxvY2FsVmVjdG9yLmRhdGEoKSApICk7CisgICAgZm9yICggdWludDMyX3QgaSA9IDA7IGkgPCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgOyBpKysgKQorICAgIHsKKyAgICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllc1tpXS50ZW1wbGF0ZSBnZXQ8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmFtaWx5UHJvcGVydGllczI+KCkgPSBsb2NhbFZlY3RvcltpXTsKKyAgICB9CisgICAgcmV0dXJuIHF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJ1Y3R1cmVDaGFpbiwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjp2ZWN0b3I8U3RydWN0dXJlQ2hhaW4sQWxsb2NhdG9yPiBQaHlzaWNhbERldmljZTo6Z2V0UXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8U3RydWN0dXJlQ2hhaW4sQWxsb2NhdG9yPiBxdWV1ZUZhbWlseVByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCAmcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBudWxscHRyICk7CisgICAgcXVldWVGYW1pbHlQcm9wZXJ0aWVzLnJlc2l6ZSggcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ICk7CisgICAgc3RkOjp2ZWN0b3I8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlF1ZXVlRmFtaWx5UHJvcGVydGllczI+IGxvY2FsVmVjdG9yKCBxdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgKTsKKyAgICBmb3IgKCB1aW50MzJfdCBpID0gMDsgaSA8IHF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCA7IGkrKyApCisgICAgeworICAgICAgbG9jYWxWZWN0b3JbaV0ucE5leHQgPSBxdWV1ZUZhbWlseVByb3BlcnRpZXNbaV0udGVtcGxhdGUgZ2V0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseVByb3BlcnRpZXMyPigpLnBOZXh0OworICAgIH0KKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCAmcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMio+KCBsb2NhbFZlY3Rvci5kYXRhKCkgKSApOworICAgIGZvciAoIHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50IDsgaSsrICkKKyAgICB7CisgICAgICBxdWV1ZUZhbWlseVByb3BlcnRpZXNbaV0udGVtcGxhdGUgZ2V0PFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpRdWV1ZUZhbWlseVByb3BlcnRpZXMyPigpID0gbG9jYWxWZWN0b3JbaV07CisgICAgfQorICAgIHJldHVybiBxdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Rm9ybWF0IGZvcm1hdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkltYWdlVHlwZSB0eXBlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUaWxpbmcgdGlsaW5nLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Zvcm1hdD4oIGZvcm1hdCApLCBzdGF0aWNfY2FzdDxWa0ltYWdlVHlwZT4oIHR5cGUgKSwgc3RhdGljX2Nhc3Q8VmtTYW1wbGVDb3VudEZsYWdCaXRzPiggc2FtcGxlcyApLCBzdGF0aWNfY2FzdDxWa0ltYWdlVXNhZ2VGbGFncz4oIHVzYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VUaWxpbmc+KCB0aWxpbmcgKSwgcFByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqPiggcFByb3BlcnRpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyxBbGxvY2F0b3I+IFBoeXNpY2FsRGV2aWNlOjpnZXRTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUeXBlIHR5cGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVRpbGluZyB0aWxpbmcsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyxBbGxvY2F0b3I+IHByb3BlcnRpZXM7CisgICAgdWludDMyX3QgcHJvcGVydHlDb3VudDsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRm9ybWF0PiggZm9ybWF0ICksIHN0YXRpY19jYXN0PFZrSW1hZ2VUeXBlPiggdHlwZSApLCBzdGF0aWNfY2FzdDxWa1NhbXBsZUNvdW50RmxhZ0JpdHM+KCBzYW1wbGVzICksIHN0YXRpY19jYXN0PFZrSW1hZ2VVc2FnZUZsYWdzPiggdXNhZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZVRpbGluZz4oIHRpbGluZyApLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApOworICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Zvcm1hdD4oIGZvcm1hdCApLCBzdGF0aWNfY2FzdDxWa0ltYWdlVHlwZT4oIHR5cGUgKSwgc3RhdGljX2Nhc3Q8VmtTYW1wbGVDb3VudEZsYWdCaXRzPiggc2FtcGxlcyApLCBzdGF0aWNfY2FzdDxWa0ltYWdlVXNhZ2VGbGFncz4oIHVzYWdlICksIHN0YXRpY19jYXN0PFZrSW1hZ2VUaWxpbmc+KCB0aWxpbmcgKSwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqPiggcHJvcGVydGllcy5kYXRhKCkgKSApOworICAgIHJldHVybiBwcm9wZXJ0aWVzOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyxBbGxvY2F0b3I+IFBoeXNpY2FsRGV2aWNlOjpnZXRTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGb3JtYXQgZm9ybWF0LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW1hZ2VUeXBlIHR5cGUsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpJbWFnZVRpbGluZyB0aWxpbmcsIEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KCBmb3JtYXQgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZVR5cGU+KCB0eXBlICksIHN0YXRpY19jYXN0PFZrU2FtcGxlQ291bnRGbGFnQml0cz4oIHNhbXBsZXMgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZVVzYWdlRmxhZ3M+KCB1c2FnZSApLCBzdGF0aWNfY2FzdDxWa0ltYWdlVGlsaW5nPiggdGlsaW5nICksICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICk7CisgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrRm9ybWF0PiggZm9ybWF0ICksIHN0YXRpY19jYXN0PFZrSW1hZ2VUeXBlPiggdHlwZSApLCBzdGF0aWNfY2FzdDxWa1NhbXBsZUNvdW50RmxhZ0JpdHM+KCBzYW1wbGVzICksIHN0YXRpY19jYXN0PFZrSW1hZ2VVc2FnZUZsYWdzPiggdXNhZ2UgKSwgc3RhdGljX2Nhc3Q8VmtJbWFnZVRpbGluZz4oIHRpbGluZyApLCAmcHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyo+KCBwcm9wZXJ0aWVzLmRhdGEoKSApICk7CisgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBQaHlzaWNhbERldmljZTo6Z2V0U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqIHBQcm9wZXJ0aWVzLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMio+KCBwRm9ybWF0SW5mbyApLCBwUHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqPiggcFByb3BlcnRpZXMgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIsQWxsb2NhdG9yPiBQaHlzaWNhbERldmljZTo6Z2V0U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggY29uc3QgUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICYgZm9ybWF0SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IHByb3BlcnRpZXM7CisgICAgdWludDMyX3QgcHJvcGVydHlDb3VudDsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKj4oICZmb3JtYXRJbmZvICksICZwcm9wZXJ0eUNvdW50LCBudWxscHRyICk7CisgICAgcHJvcGVydGllcy5yZXNpemUoIHByb3BlcnR5Q291bnQgKTsKKyAgICBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKj4oICZmb3JtYXRJbmZvICksICZwcm9wZXJ0eUNvdW50LCByZWludGVycHJldF9jYXN0PFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMio+KCBwcm9wZXJ0aWVzLmRhdGEoKSApICk7CisgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IFBoeXNpY2FsRGV2aWNlOjpnZXRTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCBjb25zdCBQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgJiBmb3JtYXRJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMixBbGxvY2F0b3I+IHByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMio+KCAmZm9ybWF0SW5mbyApLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApOworICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMio+KCAmZm9ybWF0SW5mbyApLCAmcHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqPiggcHJvcGVydGllcy5kYXRhKCkgKSApOworICAgIHJldHVybiBwcm9wZXJ0aWVzOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUGh5c2ljYWxEZXZpY2U6OmdldFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqPiggcEZvcm1hdEluZm8gKSwgcFByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKj4oIHBQcm9wZXJ0aWVzICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnZlY3RvcjxTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLEFsbG9jYXRvcj4gUGh5c2ljYWxEZXZpY2U6OmdldFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiAmIGZvcm1hdEluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzOworICAgIHVpbnQzMl90IHByb3BlcnR5Q291bnQ7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMio+KCAmZm9ybWF0SW5mbyApLCAmcHJvcGVydHlDb3VudCwgbnVsbHB0ciApOworICAgIHByb3BlcnRpZXMucmVzaXplKCBwcm9wZXJ0eUNvdW50ICk7CisgICAgZC52a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMio+KCAmZm9ybWF0SW5mbyApLCAmcHJvcGVydHlDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqPiggcHJvcGVydGllcy5kYXRhKCkgKSApOworICAgIHJldHVybiBwcm9wZXJ0aWVzOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIsQWxsb2NhdG9yPiBQaHlzaWNhbERldmljZTo6Z2V0U3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggY29uc3QgUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICYgZm9ybWF0SW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIsQWxsb2NhdG9yPiBwcm9wZXJ0aWVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBwcm9wZXJ0eUNvdW50OworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqPiggJmZvcm1hdEluZm8gKSwgJnByb3BlcnR5Q291bnQsIG51bGxwdHIgKTsKKyAgICBwcm9wZXJ0aWVzLnJlc2l6ZSggcHJvcGVydHlDb3VudCApOworICAgIGQudmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqPiggJmZvcm1hdEluZm8gKSwgJnByb3BlcnR5Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKj4oIHByb3BlcnRpZXMuZGF0YSgpICkgKTsKKyAgICByZXR1cm4gcHJvcGVydGllczsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldFN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoIHVpbnQzMl90KiBwQ29tYmluYXRpb25Db3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogcENvbWJpbmF0aW9ucywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViggbV9waHlzaWNhbERldmljZSwgcENvbWJpbmF0aW9uQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqPiggcENvbWJpbmF0aW9ucyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8RnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVixBbGxvY2F0b3I+IGNvbWJpbmF0aW9uczsKKyAgICB1aW50MzJfdCBjb21iaW5hdGlvbkNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKCBtX3BoeXNpY2FsRGV2aWNlLCAmY29tYmluYXRpb25Db3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBjb21iaW5hdGlvbkNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgY29tYmluYXRpb25zLnJlc2l6ZSggY29tYmluYXRpb25Db3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKCBtX3BoeXNpY2FsRGV2aWNlLCAmY29tYmluYXRpb25Db3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVio+KCBjb21iaW5hdGlvbnMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBjb21iaW5hdGlvbkNvdW50IDw9IGNvbWJpbmF0aW9ucy5zaXplKCkgKTsKKyAgICAgIGNvbWJpbmF0aW9ucy5yZXNpemUoIGNvbWJpbmF0aW9uQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGNvbWJpbmF0aW9ucywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVixBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVihBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8RnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WLEFsbG9jYXRvcj4gY29tYmluYXRpb25zKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBjb21iaW5hdGlvbkNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKCBtX3BoeXNpY2FsRGV2aWNlLCAmY29tYmluYXRpb25Db3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBjb21iaW5hdGlvbkNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgY29tYmluYXRpb25zLnJlc2l6ZSggY29tYmluYXRpb25Db3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKCBtX3BoeXNpY2FsRGV2aWNlLCAmY29tYmluYXRpb25Db3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVio+KCBjb21iaW5hdGlvbnMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBjb21iaW5hdGlvbkNvdW50IDw9IGNvbWJpbmF0aW9ucy5zaXplKCkgKTsKKyAgICAgIGNvbWJpbmF0aW9ucy5yZXNpemUoIGNvbWJpbmF0aW9uQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIGNvbWJpbmF0aW9ucywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBwU3VyZmFjZUNhcGFiaWxpdGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKj4oIHBTdXJmYWNlQ2FwYWJpbGl0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUPjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZUNhcGFiaWxpdGllczJFWFQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBzdXJmYWNlQ2FwYWJpbGl0aWVzOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlS0hSPiggc3VyZmFjZSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqPiggJnN1cmZhY2VDYXBhYmlsaXRpZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN1cmZhY2VDYXBhYmlsaXRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUio+KCBwU3VyZmFjZUluZm8gKSwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKj4oIHBTdXJmYWNlQ2FwYWJpbGl0aWVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSPjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZUNhcGFiaWxpdGllczJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICYgc3VyZmFjZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiBzdXJmYWNlQ2FwYWJpbGl0aWVzOworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKj4oICZzdXJmYWNlSW5mbyApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqPiggJnN1cmZhY2VDYXBhYmlsaXRpZXMgKSApICk7CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN1cmZhY2VDYXBhYmlsaXRpZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSAuLi5aLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZUNhcGFiaWxpdGllczJLSFIoIGNvbnN0IFBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICYgc3VyZmFjZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFN0cnVjdHVyZUNoYWluPFgsIFksIFouLi4+IHN0cnVjdHVyZUNoYWluOworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiYgc3VyZmFjZUNhcGFiaWxpdGllcyA9IHN0cnVjdHVyZUNoYWluLnRlbXBsYXRlIGdldDxWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUNhcGFiaWxpdGllczJLSFI+KCk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUio+KCAmc3VyZmFjZUNhcGFiaWxpdGllcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc3RydWN0dXJlQ2hhaW4sIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlS0hSIHN1cmZhY2UsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlS0hSPiggc3VyZmFjZSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUio+KCBwU3VyZmFjZUNhcGFiaWxpdGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZUNhcGFiaWxpdGllc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgc3VyZmFjZUNhcGFiaWxpdGllczsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlS0hSPiggc3VyZmFjZSApLCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUio+KCAmc3VyZmFjZUNhcGFiaWxpdGllcyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgc3VyZmFjZUNhcGFiaWxpdGllcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlRm9ybWF0czJLSFIoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLCB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGb3JtYXQyS0hSKiBwU3VyZmFjZUZvcm1hdHMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiggbV9waHlzaWNhbERldmljZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKj4oIHBTdXJmYWNlSW5mbyApLCBwU3VyZmFjZUZvcm1hdENvdW50LCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUZvcm1hdDJLSFIqPiggcFN1cmZhY2VGb3JtYXRzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxTdXJmYWNlRm9ybWF0MktIUixBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZUZvcm1hdHMyS0hSKCBjb25zdCBQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAmIHN1cmZhY2VJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxTdXJmYWNlRm9ybWF0MktIUixBbGxvY2F0b3I+IHN1cmZhY2VGb3JtYXRzOworICAgIHVpbnQzMl90IHN1cmZhY2VGb3JtYXRDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksICZzdXJmYWNlRm9ybWF0Q291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgc3VyZmFjZUZvcm1hdENvdW50ICkKKyAgICAgIHsKKyAgICAgICAgc3VyZmFjZUZvcm1hdHMucmVzaXplKCBzdXJmYWNlRm9ybWF0Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksICZzdXJmYWNlRm9ybWF0Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlRm9ybWF0MktIUio+KCBzdXJmYWNlRm9ybWF0cy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHN1cmZhY2VGb3JtYXRDb3VudCA8PSBzdXJmYWNlRm9ybWF0cy5zaXplKCkgKTsKKyAgICAgIHN1cmZhY2VGb3JtYXRzLnJlc2l6ZSggc3VyZmFjZUZvcm1hdENvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlRm9ybWF0cywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VGb3JtYXRzMktIUiIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8U3VyZmFjZUZvcm1hdDJLSFIsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VGb3JtYXRzMktIUiggY29uc3QgUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgJiBzdXJmYWNlSW5mbywgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFN1cmZhY2VGb3JtYXQyS0hSLEFsbG9jYXRvcj4gc3VyZmFjZUZvcm1hdHMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHN1cmZhY2VGb3JtYXRDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksICZzdXJmYWNlRm9ybWF0Q291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgc3VyZmFjZUZvcm1hdENvdW50ICkKKyAgICAgIHsKKyAgICAgICAgc3VyZmFjZUZvcm1hdHMucmVzaXplKCBzdXJmYWNlRm9ybWF0Q291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksICZzdXJmYWNlRm9ybWF0Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlRm9ybWF0MktIUio+KCBzdXJmYWNlRm9ybWF0cy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHN1cmZhY2VGb3JtYXRDb3VudCA8PSBzdXJmYWNlRm9ybWF0cy5zaXplKCkgKTsKKyAgICAgIHN1cmZhY2VGb3JtYXRzLnJlc2l6ZSggc3VyZmFjZUZvcm1hdENvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlRm9ybWF0cywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VGb3JtYXRzMktIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VGb3JtYXRzS0hSKCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VGb3JtYXRLSFIqIHBTdXJmYWNlRm9ybWF0cywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgcFN1cmZhY2VGb3JtYXRDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VGb3JtYXRLSFIqPiggcFN1cmZhY2VGb3JtYXRzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxTdXJmYWNlRm9ybWF0S0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlRm9ybWF0c0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8U3VyZmFjZUZvcm1hdEtIUixBbGxvY2F0b3I+IHN1cmZhY2VGb3JtYXRzOworICAgIHVpbnQzMl90IHN1cmZhY2VGb3JtYXRDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgJnN1cmZhY2VGb3JtYXRDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBzdXJmYWNlRm9ybWF0Q291bnQgKQorICAgICAgeworICAgICAgICBzdXJmYWNlRm9ybWF0cy5yZXNpemUoIHN1cmZhY2VGb3JtYXRDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlS0hSPiggc3VyZmFjZSApLCAmc3VyZmFjZUZvcm1hdENvdW50LCByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUZvcm1hdEtIUio+KCBzdXJmYWNlRm9ybWF0cy5kYXRhKCkgKSApICk7CisgICAgICB9CisgICAgfSB3aGlsZSAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVJbmNvbXBsZXRlICk7CisgICAgaWYgKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApCisgICAgeworICAgICAgVlVMS0FOX0hQUF9BU1NFUlQoIHN1cmZhY2VGb3JtYXRDb3VudCA8PSBzdXJmYWNlRm9ybWF0cy5zaXplKCkgKTsKKyAgICAgIHN1cmZhY2VGb3JtYXRzLnJlc2l6ZSggc3VyZmFjZUZvcm1hdENvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXJmYWNlRm9ybWF0cywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VGb3JtYXRzS0hSIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxTdXJmYWNlRm9ybWF0S0hSLEFsbG9jYXRvcj4+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlRm9ybWF0c0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFN1cmZhY2VGb3JtYXRLSFIsQWxsb2NhdG9yPiBzdXJmYWNlRm9ybWF0cyggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3Qgc3VyZmFjZUZvcm1hdENvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlS0hSPiggc3VyZmFjZSApLCAmc3VyZmFjZUZvcm1hdENvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHN1cmZhY2VGb3JtYXRDb3VudCApCisgICAgICB7CisgICAgICAgIHN1cmZhY2VGb3JtYXRzLnJlc2l6ZSggc3VyZmFjZUZvcm1hdENvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VLSFI+KCBzdXJmYWNlICksICZzdXJmYWNlRm9ybWF0Q291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlRm9ybWF0S0hSKj4oIHN1cmZhY2VGb3JtYXRzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggc3VyZmFjZUZvcm1hdENvdW50IDw9IHN1cmZhY2VGb3JtYXRzLnNpemUoKSApOworICAgICAgc3VyZmFjZUZvcm1hdHMucmVzaXplKCBzdXJmYWNlRm9ybWF0Q291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHN1cmZhY2VGb3JtYXRzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZUZvcm1hdHNLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZVByZXNlbnRNb2RlczJFWFQoIGNvbnN0IFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLCB1aW50MzJfdCogcFByZXNlbnRNb2RlQ291bnQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQcmVzZW50TW9kZUtIUiogcFByZXNlbnRNb2RlcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoIG1fcGh5c2ljYWxEZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUio+KCBwU3VyZmFjZUluZm8gKSwgcFByZXNlbnRNb2RlQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50TW9kZUtIUio+KCBwUHJlc2VudE1vZGVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQcmVzZW50TW9kZUtIUixBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZVByZXNlbnRNb2RlczJFWFQoIGNvbnN0IFBoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICYgc3VyZmFjZUluZm8sIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFByZXNlbnRNb2RlS0hSLEFsbG9jYXRvcj4gcHJlc2VudE1vZGVzOworICAgIHVpbnQzMl90IHByZXNlbnRNb2RlQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksICZwcmVzZW50TW9kZUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByZXNlbnRNb2RlQ291bnQgKQorICAgICAgeworICAgICAgICBwcmVzZW50TW9kZXMucmVzaXplKCBwcmVzZW50TW9kZUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksICZwcmVzZW50TW9kZUNvdW50LCByZWludGVycHJldF9jYXN0PFZrUHJlc2VudE1vZGVLSFIqPiggcHJlc2VudE1vZGVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcHJlc2VudE1vZGVDb3VudCA8PSBwcmVzZW50TW9kZXMuc2l6ZSgpICk7CisgICAgICBwcmVzZW50TW9kZXMucmVzaXplKCBwcmVzZW50TW9kZUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcmVzZW50TW9kZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIgKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UHJlc2VudE1vZGVLSFIsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCBjb25zdCBQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAmIHN1cmZhY2VJbmZvLCBBbGxvY2F0b3IgY29uc3QmIHZlY3RvckFsbG9jYXRvciwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UHJlc2VudE1vZGVLSFIsQWxsb2NhdG9yPiBwcmVzZW50TW9kZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHByZXNlbnRNb2RlQ291bnQ7CisgICAgUmVzdWx0IHJlc3VsdDsKKyAgICBkbworICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksICZwcmVzZW50TW9kZUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByZXNlbnRNb2RlQ291bnQgKQorICAgICAgeworICAgICAgICBwcmVzZW50TW9kZXMucmVzaXplKCBwcmVzZW50TW9kZUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCBtX3BoeXNpY2FsRGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqPiggJnN1cmZhY2VJbmZvICksICZwcmVzZW50TW9kZUNvdW50LCByZWludGVycHJldF9jYXN0PFZrUHJlc2VudE1vZGVLSFIqPiggcHJlc2VudE1vZGVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcHJlc2VudE1vZGVDb3VudCA8PSBwcmVzZW50TW9kZXMuc2l6ZSgpICk7CisgICAgICBwcmVzZW50TW9kZXMucmVzaXplKCBwcmVzZW50TW9kZUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcmVzZW50TW9kZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgdWludDMyX3QqIHBQcmVzZW50TW9kZUNvdW50LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJlc2VudE1vZGVLSFIqIHBQcmVzZW50TW9kZXMsIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgcFByZXNlbnRNb2RlQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50TW9kZUtIUio+KCBwUHJlc2VudE1vZGVzICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQcmVzZW50TW9kZUtIUixBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UHJlc2VudE1vZGVLSFIsQWxsb2NhdG9yPiBwcmVzZW50TW9kZXM7CisgICAgdWludDMyX3QgcHJlc2VudE1vZGVDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtTdXJmYWNlS0hSPiggc3VyZmFjZSApLCAmcHJlc2VudE1vZGVDb3VudCwgbnVsbHB0ciApICk7CisgICAgICBpZiAoICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKSAmJiBwcmVzZW50TW9kZUNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgcHJlc2VudE1vZGVzLnJlc2l6ZSggcHJlc2VudE1vZGVDb3VudCApOworICAgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VLSFI+KCBzdXJmYWNlICksICZwcmVzZW50TW9kZUNvdW50LCByZWludGVycHJldF9jYXN0PFZrUHJlc2VudE1vZGVLSFIqPiggcHJlc2VudE1vZGVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggcHJlc2VudE1vZGVDb3VudCA8PSBwcmVzZW50TW9kZXMuc2l6ZSgpICk7CisgICAgICBwcmVzZW50TW9kZXMucmVzaXplKCBwcmVzZW50TW9kZUNvdW50ICk7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBwcmVzZW50TW9kZXMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHR5cGVuYW1lIFJlc3VsdFZhbHVlVHlwZTxzdGQ6OnZlY3RvcjxQcmVzZW50TW9kZUtIUixBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0U3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPFByZXNlbnRNb2RlS0hSLEFsbG9jYXRvcj4gcHJlc2VudE1vZGVzKCB2ZWN0b3JBbGxvY2F0b3IgKTsKKyAgICB1aW50MzJfdCBwcmVzZW50TW9kZUNvdW50OworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgZG8KKyAgICB7CisgICAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VLSFI+KCBzdXJmYWNlICksICZwcmVzZW50TW9kZUNvdW50LCBudWxscHRyICkgKTsKKyAgICAgIGlmICggKCByZXN1bHQgPT0gUmVzdWx0OjplU3VjY2VzcyApICYmIHByZXNlbnRNb2RlQ291bnQgKQorICAgICAgeworICAgICAgICBwcmVzZW50TW9kZXMucmVzaXplKCBwcmVzZW50TW9kZUNvdW50ICk7CisgICAgICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgJnByZXNlbnRNb2RlQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50TW9kZUtIUio+KCBwcmVzZW50TW9kZXMuZGF0YSgpICkgKSApOworICAgICAgfQorICAgIH0gd2hpbGUgKCByZXN1bHQgPT0gUmVzdWx0OjplSW5jb21wbGV0ZSApOworICAgIGlmICggcmVzdWx0ID09IFJlc3VsdDo6ZVN1Y2Nlc3MgKQorICAgIHsKKyAgICAgIFZVTEtBTl9IUFBfQVNTRVJUKCBwcmVzZW50TW9kZUNvdW50IDw9IHByZXNlbnRNb2Rlcy5zaXplKCkgKTsKKyAgICAgIHByZXNlbnRNb2Rlcy5yZXNpemUoIHByZXNlbnRNb2RlQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHByZXNlbnRNb2RlcywgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VQcmVzZW50TW9kZXNLSFIiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlU3VwcG9ydEtIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlN1cmZhY2VLSFIgc3VyZmFjZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMiogcFN1cHBvcnRlZCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Jvb2wzMio+KCBwU3VwcG9ydGVkICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8VlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJvb2wzMj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldFN1cmZhY2VTdXBwb3J0S0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VyZmFjZUtIUiBzdXJmYWNlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBWVUxLQU5fSFBQX05BTUVTUEFDRTo6Qm9vbDMyIHN1cHBvcnRlZDsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHN0YXRpY19jYXN0PFZrU3VyZmFjZUtIUj4oIHN1cmZhY2UgKSwgcmVpbnRlcnByZXRfY2FzdDxWa0Jvb2wzMio+KCAmc3VwcG9ydGVkICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBzdXBwb3J0ZWQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFX1NUUklORyI6OlBoeXNpY2FsRGV2aWNlOjpnZXRTdXJmYWNlU3VwcG9ydEtIUiIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHQgUGh5c2ljYWxEZXZpY2U6OmdldFRvb2xQcm9wZXJ0aWVzRVhUKCB1aW50MzJfdCogcFRvb2xDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQqIHBUb29sUHJvcGVydGllcywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoIG1fcGh5c2ljYWxEZXZpY2UsIHBUb29sQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKj4oIHBUb29sUHJvcGVydGllcyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB0eXBlbmFtZSBSZXN1bHRWYWx1ZVR5cGU8c3RkOjp2ZWN0b3I8UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCxBbGxvY2F0b3I+Pjo6dHlwZSBQaHlzaWNhbERldmljZTo6Z2V0VG9vbFByb3BlcnRpZXNFWFQoRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCxBbGxvY2F0b3I+IHRvb2xQcm9wZXJ0aWVzOworICAgIHVpbnQzMl90IHRvb2xDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoIG1fcGh5c2ljYWxEZXZpY2UsICZ0b29sQ291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgdG9vbENvdW50ICkKKyAgICAgIHsKKyAgICAgICAgdG9vbFByb3BlcnRpZXMucmVzaXplKCB0b29sQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoIG1fcGh5c2ljYWxEZXZpY2UsICZ0b29sQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKj4oIHRvb2xQcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggdG9vbENvdW50IDw9IHRvb2xQcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgdG9vbFByb3BlcnRpZXMucmVzaXplKCB0b29sQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHRvb2xQcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0VG9vbFByb3BlcnRpZXNFWFQiICk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdHlwZW5hbWUgUmVzdWx0VmFsdWVUeXBlPHN0ZDo6dmVjdG9yPFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQsQWxsb2NhdG9yPj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldFRvb2xQcm9wZXJ0aWVzRVhUKEFsbG9jYXRvciBjb25zdCYgdmVjdG9yQWxsb2NhdG9yLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhULEFsbG9jYXRvcj4gdG9vbFByb3BlcnRpZXMoIHZlY3RvckFsbG9jYXRvciApOworICAgIHVpbnQzMl90IHRvb2xDb3VudDsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIGRvCisgICAgeworICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoIG1fcGh5c2ljYWxEZXZpY2UsICZ0b29sQ291bnQsIG51bGxwdHIgKSApOworICAgICAgaWYgKCAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkgJiYgdG9vbENvdW50ICkKKyAgICAgIHsKKyAgICAgICAgdG9vbFByb3BlcnRpZXMucmVzaXplKCB0b29sQ291bnQgKTsKKyAgICAgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoIG1fcGh5c2ljYWxEZXZpY2UsICZ0b29sQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKj4oIHRvb2xQcm9wZXJ0aWVzLmRhdGEoKSApICkgKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggcmVzdWx0ID09IFJlc3VsdDo6ZUluY29tcGxldGUgKTsKKyAgICBpZiAoIHJlc3VsdCA9PSBSZXN1bHQ6OmVTdWNjZXNzICkKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVCggdG9vbENvdW50IDw9IHRvb2xQcm9wZXJ0aWVzLnNpemUoKSApOworICAgICAgdG9vbFByb3BlcnRpZXMucmVzaXplKCB0b29sQ291bnQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdFZhbHVlKCByZXN1bHQsIHRvb2xQcm9wZXJ0aWVzLCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpQaHlzaWNhbERldmljZTo6Z2V0VG9vbFByb3BlcnRpZXNFWFQiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgQm9vbDMyIFBoeXNpY2FsRGV2aWNlOjpnZXRXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgc3RydWN0IHdsX2Rpc3BsYXkqIGRpc3BsYXksIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Qm9vbDMyPiggZC52a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGRpc3BsYXkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBCb29sMzIgUGh5c2ljYWxEZXZpY2U6OmdldFdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBzdHJ1Y3Qgd2xfZGlzcGxheSAmIGRpc3BsYXksIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGQudmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCAmZGlzcGxheSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBCb29sMzIgUGh5c2ljYWxEZXZpY2U6OmdldFdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxCb29sMzI+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXggKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgQm9vbDMyIFBoeXNpY2FsRGV2aWNlOjpnZXRXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGQudmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggbV9waHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBCb29sMzIgUGh5c2ljYWxEZXZpY2U6OmdldFhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHhjYl9jb25uZWN0aW9uX3QqIGNvbm5lY3Rpb24sIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZCwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxCb29sMzI+KCBkLnZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBjb25uZWN0aW9uLCB2aXN1YWxfaWQgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBCb29sMzIgUGh5c2ljYWxEZXZpY2U6OmdldFhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHhjYl9jb25uZWN0aW9uX3QgJiBjb25uZWN0aW9uLCB4Y2JfdmlzdWFsaWRfdCB2aXN1YWxfaWQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGQudmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIG1fcGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsICZjb25uZWN0aW9uLCB2aXN1YWxfaWQgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBCb29sMzIgUGh5c2ljYWxEZXZpY2U6OmdldFhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBEaXNwbGF5KiBkcHksIFZpc3VhbElEIHZpc3VhbElELCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJvb2wzMj4oIGQudmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBkcHksIHZpc3VhbElEICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgQm9vbDMyIFBoeXNpY2FsRGV2aWNlOjpnZXRYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGxheSAmIGRweSwgVmlzdWFsSUQgdmlzdWFsSUQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgcmV0dXJuIGQudmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKCBtX3BoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCAmZHB5LCB2aXN1YWxJRCApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWExJQl9LSFIqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpnZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoIERpc3BsYXkqIGRweSwgUlJPdXRwdXQgcnJPdXRwdXQsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSKiBwRGlzcGxheSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCggbV9waHlzaWNhbERldmljZSwgZHB5LCByck91dHB1dCwgcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlLSFIqPiggcERpc3BsYXkgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTxWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGlzcGxheUtIUj46OnR5cGUgUGh5c2ljYWxEZXZpY2U6OmdldFJhbmRST3V0cHV0RGlzcGxheUVYVCggRGlzcGxheSAmIGRweSwgUlJPdXRwdXQgcnJPdXRwdXQsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEaXNwbGF5S0hSIGRpc3BsYXk7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoIG1fcGh5c2ljYWxEZXZpY2UsICZkcHksIHJyT3V0cHV0LCByZWludGVycHJldF9jYXN0PFZrRGlzcGxheUtIUio+KCAmZGlzcGxheSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgZGlzcGxheSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OmdldFJhbmRST3V0cHV0RGlzcGxheUVYVCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVCovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFBoeXNpY2FsRGV2aWNlOjpyZWxlYXNlRGlzcGxheUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1JlbGVhc2VEaXNwbGF5RVhUKCBtX3BoeXNpY2FsRGV2aWNlLCBzdGF0aWNfY2FzdDxWa0Rpc3BsYXlLSFI+KCBkaXNwbGF5ICkgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIFBoeXNpY2FsRGV2aWNlOjpyZWxlYXNlRGlzcGxheUVYVCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRpc3BsYXlLSFIgZGlzcGxheSwgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdAorICB7CisgICAgUmVzdWx0IHJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtSZWxlYXNlRGlzcGxheUVYVCggbV9waHlzaWNhbERldmljZSwgc3RhdGljX2Nhc3Q8VmtEaXNwbGF5S0hSPiggZGlzcGxheSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UGh5c2ljYWxEZXZpY2U6OnJlbGVhc2VEaXNwbGF5RVhUIiApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHZvaWQgUXVldWU6OmdldENoZWNrcG9pbnREYXRhTlYoIHVpbnQzMl90KiBwQ2hlY2twb2ludERhdGFDb3VudCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkNoZWNrcG9pbnREYXRhTlYqIHBDaGVja3BvaW50RGF0YSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoIG1fcXVldWUsIHBDaGVja3BvaW50RGF0YUNvdW50LCByZWludGVycHJldF9jYXN0PFZrQ2hlY2twb2ludERhdGFOVio+KCBwQ2hlY2twb2ludERhdGEgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIHN0ZDo6dmVjdG9yPENoZWNrcG9pbnREYXRhTlYsQWxsb2NhdG9yPiBRdWV1ZTo6Z2V0Q2hlY2twb2ludERhdGFOVihEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxDaGVja3BvaW50RGF0YU5WLEFsbG9jYXRvcj4gY2hlY2twb2ludERhdGE7CisgICAgdWludDMyX3QgY2hlY2twb2ludERhdGFDb3VudDsKKyAgICBkLnZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKCBtX3F1ZXVlLCAmY2hlY2twb2ludERhdGFDb3VudCwgbnVsbHB0ciApOworICAgIGNoZWNrcG9pbnREYXRhLnJlc2l6ZSggY2hlY2twb2ludERhdGFDb3VudCApOworICAgIGQudmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoIG1fcXVldWUsICZjaGVja3BvaW50RGF0YUNvdW50LCByZWludGVycHJldF9jYXN0PFZrQ2hlY2twb2ludERhdGFOVio+KCBjaGVja3BvaW50RGF0YS5kYXRhKCkgKSApOworICAgIHJldHVybiBjaGVja3BvaW50RGF0YTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBzdGQ6OnZlY3RvcjxDaGVja3BvaW50RGF0YU5WLEFsbG9jYXRvcj4gUXVldWU6OmdldENoZWNrcG9pbnREYXRhTlYoQWxsb2NhdG9yIGNvbnN0JiB2ZWN0b3JBbGxvY2F0b3IsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIHN0ZDo6dmVjdG9yPENoZWNrcG9pbnREYXRhTlYsQWxsb2NhdG9yPiBjaGVja3BvaW50RGF0YSggdmVjdG9yQWxsb2NhdG9yICk7CisgICAgdWludDMyX3QgY2hlY2twb2ludERhdGFDb3VudDsKKyAgICBkLnZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKCBtX3F1ZXVlLCAmY2hlY2twb2ludERhdGFDb3VudCwgbnVsbHB0ciApOworICAgIGNoZWNrcG9pbnREYXRhLnJlc2l6ZSggY2hlY2twb2ludERhdGFDb3VudCApOworICAgIGQudmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoIG1fcXVldWUsICZjaGVja3BvaW50RGF0YUNvdW50LCByZWludGVycHJldF9jYXN0PFZrQ2hlY2twb2ludERhdGFOVio+KCBjaGVja3BvaW50RGF0YS5kYXRhKCkgKSApOworICAgIHJldHVybiBjaGVja3BvaW50RGF0YTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIFF1ZXVlOjpiZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCBtX3F1ZXVlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKj4oIHBMYWJlbEluZm8gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIFF1ZXVlOjpiZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggY29uc3QgRGVidWdVdGlsc0xhYmVsRVhUICYgbGFiZWxJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCBtX3F1ZXVlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKj4oICZsYWJlbEluZm8gKSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBRdWV1ZTo6YmluZFNwYXJzZSggdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkJpbmRTcGFyc2VJbmZvKiBwQmluZEluZm8sIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1F1ZXVlQmluZFNwYXJzZSggbV9xdWV1ZSwgYmluZEluZm9Db3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRTcGFyc2VJbmZvKj4oIHBCaW5kSW5mbyApLCBzdGF0aWNfY2FzdDxWa0ZlbmNlPiggZmVuY2UgKSApICk7CisgIH0KKyNpZm5kZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBRdWV1ZTo6YmluZFNwYXJzZSggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6QmluZFNwYXJzZUluZm8+IGJpbmRJbmZvLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RmVuY2UgZmVuY2UsIERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QKKyAgeworICAgIFJlc3VsdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHQ+KCBkLnZrUXVldWVCaW5kU3BhcnNlKCBtX3F1ZXVlLCBiaW5kSW5mby5zaXplKCkgLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQmluZFNwYXJzZUluZm8qPiggYmluZEluZm8uZGF0YSgpICksIHN0YXRpY19jYXN0PFZrRmVuY2U+KCBmZW5jZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UXVldWU6OmJpbmRTcGFyc2UiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIFF1ZXVlOjplbmREZWJ1Z1V0aWxzTGFiZWxFWFQoRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgeworICAgIGQudmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCggbV9xdWV1ZSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBRdWV1ZTo6ZW5kRGVidWdVdGlsc0xhYmVsRVhUKERpc3BhdGNoIGNvbnN0ICZkICkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKCBtX3F1ZXVlICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgdm9pZCBRdWV1ZTo6aW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCkgY29uc3QgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICB7CisgICAgZC52a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCBtX3F1ZXVlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKj4oIHBMYWJlbEluZm8gKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSB2b2lkIFF1ZXVlOjppbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoIGNvbnN0IERlYnVnVXRpbHNMYWJlbEVYVCAmIGxhYmVsSW5mbywgRGlzcGF0Y2ggY29uc3QgJmQgKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgIHsKKyAgICBkLnZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoIG1fcXVldWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqPiggJmxhYmVsSW5mbyApICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFF1ZXVlOjpwcmVzZW50S0hSKCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6UHJlc2VudEluZm9LSFIqIHBQcmVzZW50SW5mbywgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1F1ZXVlUHJlc2VudEtIUiggbV9xdWV1ZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ByZXNlbnRJbmZvS0hSKj4oIHBQcmVzZW50SW5mbyApICkgKTsKKyAgfQorI2lmbmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFF1ZXVlOjpwcmVzZW50S0hSKCBjb25zdCBQcmVzZW50SW5mb0tIUiAmIHByZXNlbnRJbmZvLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1F1ZXVlUHJlc2VudEtIUiggbV9xdWV1ZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ByZXNlbnRJbmZvS0hSKj4oICZwcmVzZW50SW5mbyApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UXVldWU6OnByZXNlbnRLSFIiLCB7IFJlc3VsdDo6ZVN1Y2Nlc3MsIFJlc3VsdDo6ZVN1Ym9wdGltYWxLSFIgfSApOworICB9CisjZW5kaWYgLypWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERSovCisKKyNpZmRlZiBWVUxLQU5fSFBQX0RJU0FCTEVfRU5IQU5DRURfTU9ERQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFF1ZXVlOjpzZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OlBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbmZpZ3VyYXRpb24sIERpc3BhdGNoIGNvbnN0ICZkKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oIGQudmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCBtX3F1ZXVlLCBzdGF0aWNfY2FzdDxWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMPiggY29uZmlndXJhdGlvbiApICkgKTsKKyAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdFZhbHVlVHlwZTx2b2lkPjo6dHlwZSBRdWV1ZTo6c2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIG1fcXVldWUsIHN0YXRpY19jYXN0PFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw+KCBjb25maWd1cmF0aW9uICkgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpRdWV1ZTo6c2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0IFF1ZXVlOjpzdWJtaXQoIHVpbnQzMl90IHN1Ym1pdENvdW50LCBjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VibWl0SW5mbyogcFN1Ym1pdHMsIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpGZW5jZSBmZW5jZSwgRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1F1ZXVlU3VibWl0KCBtX3F1ZXVlLCBzdWJtaXRDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1Ym1pdEluZm8qPiggcFN1Ym1pdHMgKSwgc3RhdGljX2Nhc3Q8VmtGZW5jZT4oIGZlbmNlICkgKSApOworICB9CisjaWZuZGVmIFZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpc3BhdGNoPgorICBWVUxLQU5fSFBQX0lOTElORSBSZXN1bHRWYWx1ZVR5cGU8dm9pZD46OnR5cGUgUXVldWU6OnN1Ym1pdCggQXJyYXlQcm94eTxjb25zdCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6U3VibWl0SW5mbz4gc3VibWl0cywgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkZlbmNlIGZlbmNlLCBEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1F1ZXVlU3VibWl0KCBtX3F1ZXVlLCBzdWJtaXRzLnNpemUoKSAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdWJtaXRJbmZvKj4oIHN1Ym1pdHMuZGF0YSgpICksIHN0YXRpY19jYXN0PFZrRmVuY2U+KCBmZW5jZSApICkgKTsKKyAgICByZXR1cm4gY3JlYXRlUmVzdWx0VmFsdWUoIHJlc3VsdCwgVlVMS0FOX0hQUF9OQU1FU1BBQ0VfU1RSSU5HIjo6UXVldWU6OnN1Ym1pdCIgKTsKKyAgfQorI2VuZGlmIC8qVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUqLworCisjaWZkZWYgVlVMS0FOX0hQUF9ESVNBQkxFX0VOSEFOQ0VEX01PREUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlzcGF0Y2g+CisgIFZVTEtBTl9IUFBfSU5MSU5FIFJlc3VsdCBRdWV1ZTo6d2FpdElkbGUoRGlzcGF0Y2ggY29uc3QgJmQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1F1ZXVlV2FpdElkbGUoIG1fcXVldWUgKSApOworICB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaXNwYXRjaD4KKyAgVlVMS0FOX0hQUF9JTkxJTkUgUmVzdWx0VmFsdWVUeXBlPHZvaWQ+Ojp0eXBlIFF1ZXVlOjp3YWl0SWRsZShEaXNwYXRjaCBjb25zdCAmZCApIGNvbnN0CisgIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8UmVzdWx0PiggZC52a1F1ZXVlV2FpdElkbGUoIG1fcXVldWUgKSApOworICAgIHJldHVybiBjcmVhdGVSZXN1bHRWYWx1ZSggcmVzdWx0LCBWVUxLQU5fSFBQX05BTUVTUEFDRV9TVFJJTkciOjpRdWV1ZTo6d2FpdElkbGUiICk7CisgIH0KKyNlbmRpZiAvKlZVTEtBTl9IUFBfRElTQUJMRV9FTkhBTkNFRF9NT0RFKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiwgQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLCBBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEF0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLCBBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxCaW5kQnVmZmVyTWVtb3J5SW5mbywgQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxCaW5kSW1hZ2VNZW1vcnlJbmZvLCBCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8QmluZEltYWdlTWVtb3J5SW5mbywgQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxCaW5kSW1hZ2VNZW1vcnlJbmZvLCBCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8QnVmZmVyQ3JlYXRlSW5mbywgQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8QnVmZmVyQ3JlYXRlSW5mbywgQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8sIENvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U3VibWl0SW5mbywgRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxJbnN0YW5jZUNyZWF0ZUluZm8sIERlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEluc3RhbmNlQ3JlYXRlSW5mbywgRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8QnVmZmVyQ3JlYXRlSW5mbywgRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxJbWFnZUNyZWF0ZUluZm8sIERlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxNZW1vcnlBbGxvY2F0ZUluZm8sIERlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8sIERlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbywgRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbywgRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LCBEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEJpbmRTcGFyc2VJbmZvLCBEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPENvbW1hbmRCdWZmZXJCZWdpbkluZm8sIERldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UHJlc2VudEluZm9LSFIsIERldmljZUdyb3VwUHJlc2VudEluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UmVuZGVyUGFzc0JlZ2luSW5mbywgRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFN1Ym1pdEluZm8sIERldmljZUdyb3VwU3VibWl0SW5mbz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLCBEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZVF1ZXVlQ3JlYXRlSW5mbywgRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U3VyZmFjZUNhcGFiaWxpdGllczJLSFIsIERpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFByZXNlbnRJbmZvS0hSLCBEaXNwbGF5UHJlc2VudEluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8Rm9ybWF0UHJvcGVydGllczIsIERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RmVuY2VDcmVhdGVJbmZvLCBFeHBvcnRGZW5jZUNyZWF0ZUluZm8+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEZlbmNlQ3JlYXRlSW5mbywgRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxNZW1vcnlBbGxvY2F0ZUluZm8sIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxNZW1vcnlBbGxvY2F0ZUluZm8sIEV4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxNZW1vcnlBbGxvY2F0ZUluZm8sIEV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxNZW1vcnlBbGxvY2F0ZUluZm8sIEV4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U2VtYXBob3JlQ3JlYXRlSW5mbywgRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U2VtYXBob3JlQ3JlYXRlSW5mbywgRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8SW1hZ2VDcmVhdGVJbmZvLCBFeHRlcm5hbEZvcm1hdEFORFJPSUQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8sIEV4dGVybmFsRm9ybWF0QU5EUk9JRD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiwgRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8QnVmZmVyQ3JlYXRlSW5mbywgRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEltYWdlQ3JlYXRlSW5mbywgRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8SW1hZ2VDcmVhdGVJbmZvLCBFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEltYWdlRm9ybWF0UHJvcGVydGllczIsIEZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8SW1hZ2VDcmVhdGVJbmZvLCBJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEltYWdlQ3JlYXRlSW5mbywgSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEltYWdlQ3JlYXRlSW5mbywgSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLCBJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiwgSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLCBJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxJbWFnZUNyZWF0ZUluZm8sIEltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIsIEltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxJbWFnZUNyZWF0ZUluZm8sIEltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxJbWFnZVZpZXdDcmVhdGVJbmZvLCBJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxJbWFnZVZpZXdDcmVhdGVJbmZvLCBJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8TWVtb3J5QWxsb2NhdGVJbmZvLCBJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8TWVtb3J5QWxsb2NhdGVJbmZvLCBJbXBvcnRNZW1vcnlGZEluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8TWVtb3J5QWxsb2NhdGVJbmZvLCBJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPE1lbW9yeUFsbG9jYXRlSW5mbywgSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPE1lbW9yeUFsbG9jYXRlSW5mbywgSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxNZW1vcnlBbGxvY2F0ZUluZm8sIE1lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPE1lbW9yeUFsbG9jYXRlSW5mbywgTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPE1lbW9yeVJlcXVpcmVtZW50czIsIE1lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxNZW1vcnlBbGxvY2F0ZUluZm8sIE1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPE1lbW9yeUFsbG9jYXRlSW5mbywgTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U3VibWl0SW5mbywgUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIsIFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZUlEUHJvcGVydGllcz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIsIFBoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLCBQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlg+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsIFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsIFBoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLCBQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxEZXZpY2VDcmVhdGVJbmZvLCBQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPERldmljZUNyZWF0ZUluZm8sIFBoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8RGV2aWNlQ3JlYXRlSW5mbywgUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbywgUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPENvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8sIFBpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8sIFBpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLCBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPENvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8sIFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLCBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLCBQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbywgUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8R3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8sIFBpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbywgUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbywgUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbywgUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbywgUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbywgUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLCBQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8sIFBpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbywgUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFByZXNlbnRJbmZvS0hSLCBQcmVzZW50RnJhbWVUb2tlbkdHUD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9HR1AqLworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFByZXNlbnRJbmZvS0hSLCBQcmVzZW50UmVnaW9uc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxQcmVzZW50SW5mb0tIUiwgUHJlc2VudFRpbWVzSW5mb0dPT0dMRT57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTdWJtaXRJbmZvLCBQcm90ZWN0ZWRTdWJtaXRJbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFF1ZXJ5UG9vbENyZWF0ZUluZm8sIFF1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxRdWV1ZUZhbWlseVByb3BlcnRpZXMyLCBRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UmVuZGVyUGFzc0JlZ2luSW5mbywgUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UmVuZGVyUGFzc0NyZWF0ZUluZm8sIFJlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFJlbmRlclBhc3NDcmVhdGVJbmZvMktIUiwgUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UmVuZGVyUGFzc0NyZWF0ZUluZm8sIFJlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFJlbmRlclBhc3NDcmVhdGVJbmZvLCBSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbz57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxSZW5kZXJQYXNzQmVnaW5JbmZvLCBSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEltYWdlTWVtb3J5QmFycmllciwgU2FtcGxlTG9jYXRpb25zSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTYW1wbGVyQ3JlYXRlSW5mbywgU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEltYWdlRm9ybWF0UHJvcGVydGllczIsIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXM+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U2FtcGxlckNyZWF0ZUluZm8sIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEltYWdlVmlld0NyZWF0ZUluZm8sIFNhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFNlbWFwaG9yZUNyZWF0ZUluZm8sIFNlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLCBTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLCBTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTdWJwYXNzRGVzY3JpcHRpb24yS0hSLCBTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiwgU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIsIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVD57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLCBTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8UGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIsIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIsIFN1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U3VyZmFjZUNhcGFiaWxpdGllczJLSFIsIFN1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U3dhcGNoYWluQ3JlYXRlSW5mb0tIUiwgU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U3dhcGNoYWluQ3JlYXRlSW5mb0tIUiwgU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiwgVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8U3VibWl0SW5mbywgVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPEJpbmRTcGFyc2VJbmZvLCBUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8SW5zdGFuY2VDcmVhdGVJbmZvLCBWYWxpZGF0aW9uRmVhdHVyZXNFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8SW5zdGFuY2VDcmVhdGVJbmZvLCBWYWxpZGF0aW9uRmxhZ3NFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFN1Ym1pdEluZm8sIFdpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzU3RydWN0dXJlQ2hhaW5WYWxpZDxTdWJtaXRJbmZvLCBXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVj57IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNTdHJ1Y3R1cmVDaGFpblZhbGlkPFdyaXRlRGVzY3JpcHRvclNldCwgV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1N0cnVjdHVyZUNoYWluVmFsaWQ8V3JpdGVEZXNjcmlwdG9yU2V0LCBXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisKKyNpZiBWVUxLQU5fSFBQX0VOQUJMRV9EWU5BTUlDX0xPQURFUl9UT09MCisgIGNsYXNzIER5bmFtaWNMb2FkZXIKKyAgeworICBwdWJsaWM6CisjaWZkZWYgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisgICAgRHluYW1pY0xvYWRlcigpIFZVTEtBTl9IUFBfTk9FWENFUFQgOiBtX3N1Y2Nlc3MoIGZhbHNlICkKKyNlbHNlCisgICAgRHluYW1pY0xvYWRlcigpIDogbV9zdWNjZXNzKCBmYWxzZSApCisjZW5kaWYKKyAgICB7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgICBtX2xpYnJhcnkgPSBkbG9wZW4oICJsaWJ2dWxrYW4uc28iLCBSVExEX05PVyB8IFJUTERfTE9DQUwgKTsKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorICAgICAgbV9saWJyYXJ5ID0gZGxvcGVuKCAibGlidnVsa2FuLmR5bGliIiwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMICk7CisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyAgICAgIG1fbGlicmFyeSA9IExvYWRMaWJyYXJ5KCBURVhUKCAidnVsa2FuLTEuZGxsIiApICk7CisjZWxzZQorICAgICAgYXNzZXJ0KCBmYWxzZSAmJiAidW5zdXBwb3J0ZWQgcGxhdGZvcm0iICk7CisjZW5kaWYKKworICAgICAgbV9zdWNjZXNzID0gbV9saWJyYXJ5ICE9IDA7CisjaWZuZGVmIFZVTEtBTl9IUFBfTk9fRVhDRVBUSU9OUworICAgICAgaWYgKCAhbV9zdWNjZXNzICkKKyAgICAgIHsKKyAgICAgICAgLy8gTk9URSB0aGVyZSBzaG91bGQgYmUgYW4gSW5pdGlhbGl6YXRpb25GYWlsZWRFcnJvciwgYnV0IG1zdmMgaW5zaXN0cyBvbiB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0IHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiRmFpbGVkIHRvIGxvYWQgdnVsa2FuIGxpYnJhcnkhIiApOworICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgfkR5bmFtaWNMb2FkZXIoKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaWYgKCBtX2xpYnJhcnkgKQorICAgICAgeworI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAgICAgZGxjbG9zZSggbV9saWJyYXJ5ICk7CisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyAgICAgICAgRnJlZUxpYnJhcnkoIG1fbGlicmFyeSApOworI2VuZGlmCisgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgVCBnZXRQcm9jQWRkcmVzcyggY29uc3QgY2hhciogZnVuY3Rpb24gKSBjb25zdCBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAgIHJldHVybiAoVClkbHN5bSggbV9saWJyYXJ5LCBmdW5jdGlvbiApOworI2VsaWYgZGVmaW5lZChfV0lOMzIpCisgICAgICByZXR1cm4gKFQpR2V0UHJvY0FkZHJlc3MoIG1fbGlicmFyeSwgZnVuY3Rpb24gKTsKKyNlbmRpZgorICAgIH0KKworICAgIGJvb2wgc3VjY2VzcygpIGNvbnN0IFZVTEtBTl9IUFBfTk9FWENFUFQgeyByZXR1cm4gbV9zdWNjZXNzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIG1fc3VjY2VzczsKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisgICAgdm9pZCAqbV9saWJyYXJ5OworI2VsaWYgZGVmaW5lZChfV0lOMzIpCisgICAgSE1PRFVMRSBtX2xpYnJhcnk7CisjZWxzZQorI2Vycm9yIHVuc3VwcG9ydGVkIHBsYXRmb3JtCisjZW5kaWYKKyAgfTsKKyNlbmRpZgorCisgIGNsYXNzIERpc3BhdGNoTG9hZGVyRHluYW1pYworICB7CisgIHB1YmxpYzoKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSB2a0NyZWF0ZUluc3RhbmNlID0gMDsKKyAgICBQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgPSAwOworICAgIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMgPSAwOworICAgIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiB2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiA9IDA7CisgICAgUEZOX3ZrQmVnaW5Db21tYW5kQnVmZmVyIHZrQmVnaW5Db21tYW5kQnVmZmVyID0gMDsKKyAgICBQRk5fdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIHZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IDA7CisgICAgUEZOX3ZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCA9IDA7CisgICAgUEZOX3ZrQ21kQmVnaW5RdWVyeSB2a0NtZEJlZ2luUXVlcnkgPSAwOworICAgIFBGTl92a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIHZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQgPSAwOworICAgIFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzcyB2a0NtZEJlZ2luUmVuZGVyUGFzcyA9IDA7CisgICAgUEZOX3ZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiB2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIgPSAwOworICAgIFBGTl92a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQgdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUID0gMDsKKyAgICBQRk5fdmtDbWRCaW5kRGVzY3JpcHRvclNldHMgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMgPSAwOworICAgIFBGTl92a0NtZEJpbmRJbmRleEJ1ZmZlciB2a0NtZEJpbmRJbmRleEJ1ZmZlciA9IDA7CisgICAgUEZOX3ZrQ21kQmluZFBpcGVsaW5lIHZrQ21kQmluZFBpcGVsaW5lID0gMDsKKyAgICBQRk5fdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIHZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViA9IDA7CisgICAgUEZOX3ZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCB2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQgPSAwOworICAgIFBGTl92a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnMgPSAwOworICAgIFBGTl92a0NtZEJsaXRJbWFnZSB2a0NtZEJsaXRJbWFnZSA9IDA7CisgICAgUEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViB2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSAwOworICAgIFBGTl92a0NtZENsZWFyQXR0YWNobWVudHMgdmtDbWRDbGVhckF0dGFjaG1lbnRzID0gMDsKKyAgICBQRk5fdmtDbWRDbGVhckNvbG9ySW1hZ2UgdmtDbWRDbGVhckNvbG9ySW1hZ2UgPSAwOworICAgIFBGTl92a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlID0gMDsKKyAgICBQRk5fdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSAwOworICAgIFBGTl92a0NtZENvcHlCdWZmZXIgdmtDbWRDb3B5QnVmZmVyID0gMDsKKyAgICBQRk5fdmtDbWRDb3B5QnVmZmVyVG9JbWFnZSB2a0NtZENvcHlCdWZmZXJUb0ltYWdlID0gMDsKKyAgICBQRk5fdmtDbWRDb3B5SW1hZ2UgdmtDbWRDb3B5SW1hZ2UgPSAwOworICAgIFBGTl92a0NtZENvcHlJbWFnZVRvQnVmZmVyIHZrQ21kQ29weUltYWdlVG9CdWZmZXIgPSAwOworICAgIFBGTl92a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzIHZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMgPSAwOworICAgIFBGTl92a0NtZERlYnVnTWFya2VyQmVnaW5FWFQgdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUID0gMDsKKyAgICBQRk5fdmtDbWREZWJ1Z01hcmtlckVuZEVYVCB2a0NtZERlYnVnTWFya2VyRW5kRVhUID0gMDsKKyAgICBQRk5fdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCB2a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUID0gMDsKKyAgICBQRk5fdmtDbWREaXNwYXRjaCB2a0NtZERpc3BhdGNoID0gMDsKKyAgICBQRk5fdmtDbWREaXNwYXRjaEJhc2UgdmtDbWREaXNwYXRjaEJhc2UgPSAwOworICAgIFBGTl92a0NtZERpc3BhdGNoQmFzZUtIUiB2a0NtZERpc3BhdGNoQmFzZUtIUiA9IDA7CisgICAgUEZOX3ZrQ21kRGlzcGF0Y2hJbmRpcmVjdCB2a0NtZERpc3BhdGNoSW5kaXJlY3QgPSAwOworICAgIFBGTl92a0NtZERyYXcgdmtDbWREcmF3ID0gMDsKKyAgICBQRk5fdmtDbWREcmF3SW5kZXhlZCB2a0NtZERyYXdJbmRleGVkID0gMDsKKyAgICBQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0IHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCA9IDA7CisgICAgUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EID0gMDsKKyAgICBQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIgPSAwOworICAgIFBGTl92a0NtZERyYXdJbmRpcmVjdCB2a0NtZERyYXdJbmRpcmVjdCA9IDA7CisgICAgUEZOX3ZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUIHZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUID0gMDsKKyAgICBQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCB2a0NtZERyYXdJbmRpcmVjdENvdW50QU1EID0gMDsKKyAgICBQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiB2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSID0gMDsKKyAgICBQRk5fdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIHZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViA9IDA7CisgICAgUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYgdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViA9IDA7CisgICAgUEZOX3ZrQ21kRHJhd01lc2hUYXNrc05WIHZrQ21kRHJhd01lc2hUYXNrc05WID0gMDsKKyAgICBQRk5fdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCB2a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUID0gMDsKKyAgICBQRk5fdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgPSAwOworICAgIFBGTl92a0NtZEVuZFF1ZXJ5IHZrQ21kRW5kUXVlcnkgPSAwOworICAgIFBGTl92a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVCB2a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVCA9IDA7CisgICAgUEZOX3ZrQ21kRW5kUmVuZGVyUGFzcyB2a0NtZEVuZFJlbmRlclBhc3MgPSAwOworICAgIFBGTl92a0NtZEVuZFJlbmRlclBhc3MyS0hSIHZrQ21kRW5kUmVuZGVyUGFzczJLSFIgPSAwOworICAgIFBGTl92a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUIHZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQgPSAwOworICAgIFBGTl92a0NtZEV4ZWN1dGVDb21tYW5kcyB2a0NtZEV4ZWN1dGVDb21tYW5kcyA9IDA7CisgICAgUEZOX3ZrQ21kRmlsbEJ1ZmZlciB2a0NtZEZpbGxCdWZmZXIgPSAwOworICAgIFBGTl92a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCB2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCA9IDA7CisgICAgUEZOX3ZrQ21kTmV4dFN1YnBhc3MgdmtDbWROZXh0U3VicGFzcyA9IDA7CisgICAgUEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSIHZrQ21kTmV4dFN1YnBhc3MyS0hSID0gMDsKKyAgICBQRk5fdmtDbWRQaXBlbGluZUJhcnJpZXIgdmtDbWRQaXBlbGluZUJhcnJpZXIgPSAwOworICAgIFBGTl92a0NtZFByb2Nlc3NDb21tYW5kc05WWCB2a0NtZFByb2Nlc3NDb21tYW5kc05WWCA9IDA7CisgICAgUEZOX3ZrQ21kUHVzaENvbnN0YW50cyB2a0NtZFB1c2hDb25zdGFudHMgPSAwOworICAgIFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgPSAwOworICAgIFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPSAwOworICAgIFBGTl92a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIHZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlggPSAwOworICAgIFBGTl92a0NtZFJlc2V0RXZlbnQgdmtDbWRSZXNldEV2ZW50ID0gMDsKKyAgICBQRk5fdmtDbWRSZXNldFF1ZXJ5UG9vbCB2a0NtZFJlc2V0UXVlcnlQb29sID0gMDsKKyAgICBQRk5fdmtDbWRSZXNvbHZlSW1hZ2UgdmtDbWRSZXNvbHZlSW1hZ2UgPSAwOworICAgIFBGTl92a0NtZFNldEJsZW5kQ29uc3RhbnRzIHZrQ21kU2V0QmxlbmRDb25zdGFudHMgPSAwOworICAgIFBGTl92a0NtZFNldENoZWNrcG9pbnROViB2a0NtZFNldENoZWNrcG9pbnROViA9IDA7CisgICAgUEZOX3ZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViB2a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYgPSAwOworICAgIFBGTl92a0NtZFNldERlcHRoQmlhcyB2a0NtZFNldERlcHRoQmlhcyA9IDA7CisgICAgUEZOX3ZrQ21kU2V0RGVwdGhCb3VuZHMgdmtDbWRTZXREZXB0aEJvdW5kcyA9IDA7CisgICAgUEZOX3ZrQ21kU2V0RGV2aWNlTWFzayB2a0NtZFNldERldmljZU1hc2sgPSAwOworICAgIFBGTl92a0NtZFNldERldmljZU1hc2tLSFIgdmtDbWRTZXREZXZpY2VNYXNrS0hSID0gMDsKKyAgICBQRk5fdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUIHZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCA9IDA7CisgICAgUEZOX3ZrQ21kU2V0RXZlbnQgdmtDbWRTZXRFdmVudCA9IDA7CisgICAgUEZOX3ZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WIHZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WID0gMDsKKyAgICBQRk5fdmtDbWRTZXRMaW5lU3RpcHBsZUVYVCB2a0NtZFNldExpbmVTdGlwcGxlRVhUID0gMDsKKyAgICBQRk5fdmtDbWRTZXRMaW5lV2lkdGggdmtDbWRTZXRMaW5lV2lkdGggPSAwOworICAgIFBGTl92a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwgdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMID0gMDsKKyAgICBQRk5fdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwgdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwgPSAwOworICAgIFBGTl92a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwgdmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMID0gMDsKKyAgICBQRk5fdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQgdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQgPSAwOworICAgIFBGTl92a0NtZFNldFNjaXNzb3IgdmtDbWRTZXRTY2lzc29yID0gMDsKKyAgICBQRk5fdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2sgdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2sgPSAwOworICAgIFBGTl92a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UgdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlID0gMDsKKyAgICBQRk5fdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrIHZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayA9IDA7CisgICAgUEZOX3ZrQ21kU2V0Vmlld3BvcnQgdmtDbWRTZXRWaWV3cG9ydCA9IDA7CisgICAgUEZOX3ZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViB2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYgPSAwOworICAgIFBGTl92a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViB2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViA9IDA7CisgICAgUEZOX3ZrQ21kVHJhY2VSYXlzTlYgdmtDbWRUcmFjZVJheXNOViA9IDA7CisgICAgUEZOX3ZrQ21kVXBkYXRlQnVmZmVyIHZrQ21kVXBkYXRlQnVmZmVyID0gMDsKKyAgICBQRk5fdmtDbWRXYWl0RXZlbnRzIHZrQ21kV2FpdEV2ZW50cyA9IDA7CisgICAgUEZOX3ZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIHZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WID0gMDsKKyAgICBQRk5fdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCB2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EID0gMDsKKyAgICBQRk5fdmtDbWRXcml0ZVRpbWVzdGFtcCB2a0NtZFdyaXRlVGltZXN0YW1wID0gMDsKKyAgICBQRk5fdmtFbmRDb21tYW5kQnVmZmVyIHZrRW5kQ29tbWFuZEJ1ZmZlciA9IDA7CisgICAgUEZOX3ZrUmVzZXRDb21tYW5kQnVmZmVyIHZrUmVzZXRDb21tYW5kQnVmZmVyID0gMDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIHZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgIFBGTl92a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIHZrQWNxdWlyZU5leHRJbWFnZTJLSFIgPSAwOworICAgIFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIgdmtBY3F1aXJlTmV4dEltYWdlS0hSID0gMDsKKyAgICBQRk5fdmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgdmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSAwOworICAgIFBGTl92a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSIHZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgPSAwOworICAgIFBGTl92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzID0gMDsKKyAgICBQRk5fdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzIHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyA9IDA7CisgICAgUEZOX3ZrQWxsb2NhdGVNZW1vcnkgdmtBbGxvY2F0ZU1lbW9yeSA9IDA7CisgICAgUEZOX3ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIHZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WID0gMDsKKyAgICBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5IHZrQmluZEJ1ZmZlck1lbW9yeSA9IDA7CisgICAgUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTIgdmtCaW5kQnVmZmVyTWVtb3J5MiA9IDA7CisgICAgUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTJLSFIgdmtCaW5kQnVmZmVyTWVtb3J5MktIUiA9IDA7CisgICAgUEZOX3ZrQmluZEltYWdlTWVtb3J5IHZrQmluZEltYWdlTWVtb3J5ID0gMDsKKyAgICBQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyIHZrQmluZEltYWdlTWVtb3J5MiA9IDA7CisgICAgUEZOX3ZrQmluZEltYWdlTWVtb3J5MktIUiB2a0JpbmRJbWFnZU1lbW9yeTJLSFIgPSAwOworICAgIFBGTl92a0NvbXBpbGVEZWZlcnJlZE5WIHZrQ29tcGlsZURlZmVycmVkTlYgPSAwOworICAgIFBGTl92a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSAwOworICAgIFBGTl92a0NyZWF0ZUJ1ZmZlciB2a0NyZWF0ZUJ1ZmZlciA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlQnVmZmVyVmlldyB2a0NyZWF0ZUJ1ZmZlclZpZXcgPSAwOworICAgIFBGTl92a0NyZWF0ZUNvbW1hbmRQb29sIHZrQ3JlYXRlQ29tbWFuZFBvb2wgPSAwOworICAgIFBGTl92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMgdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzID0gMDsKKyAgICBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCB2a0NyZWF0ZURlc2NyaXB0b3JQb29sID0gMDsKKyAgICBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIHZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gMDsKKyAgICBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPSAwOworICAgIFBGTl92a0NyZWF0ZUV2ZW50IHZrQ3JlYXRlRXZlbnQgPSAwOworICAgIFBGTl92a0NyZWF0ZUZlbmNlIHZrQ3JlYXRlRmVuY2UgPSAwOworICAgIFBGTl92a0NyZWF0ZUZyYW1lYnVmZmVyIHZrQ3JlYXRlRnJhbWVidWZmZXIgPSAwOworICAgIFBGTl92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgPSAwOworICAgIFBGTl92a0NyZWF0ZUltYWdlIHZrQ3JlYXRlSW1hZ2UgPSAwOworICAgIFBGTl92a0NyZWF0ZUltYWdlVmlldyB2a0NyZWF0ZUltYWdlVmlldyA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCB2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggPSAwOworICAgIFBGTl92a0NyZWF0ZU9iamVjdFRhYmxlTlZYIHZrQ3JlYXRlT2JqZWN0VGFibGVOVlggPSAwOworICAgIFBGTl92a0NyZWF0ZVBpcGVsaW5lQ2FjaGUgdmtDcmVhdGVQaXBlbGluZUNhY2hlID0gMDsKKyAgICBQRk5fdmtDcmVhdGVQaXBlbGluZUxheW91dCB2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0ID0gMDsKKyAgICBQRk5fdmtDcmVhdGVRdWVyeVBvb2wgdmtDcmVhdGVRdWVyeVBvb2wgPSAwOworICAgIFBGTl92a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzcyB2a0NyZWF0ZVJlbmRlclBhc3MgPSAwOworICAgIFBGTl92a0NyZWF0ZVJlbmRlclBhc3MyS0hSIHZrQ3JlYXRlUmVuZGVyUGFzczJLSFIgPSAwOworICAgIFBGTl92a0NyZWF0ZVNhbXBsZXIgdmtDcmVhdGVTYW1wbGVyID0gMDsKKyAgICBQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiB2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPSAwOworICAgIFBGTl92a0NyZWF0ZVNlbWFwaG9yZSB2a0NyZWF0ZVNlbWFwaG9yZSA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlU2hhZGVyTW9kdWxlIHZrQ3JlYXRlU2hhZGVyTW9kdWxlID0gMDsKKyAgICBQRk5fdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIHZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlU3dhcGNoYWluS0hSIHZrQ3JlYXRlU3dhcGNoYWluS0hSID0gMDsKKyAgICBQRk5fdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQgdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQgPSAwOworICAgIFBGTl92a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCB2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCA9IDA7CisgICAgUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQgdmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCA9IDA7CisgICAgUEZOX3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gMDsKKyAgICBQRk5fdmtEZXN0cm95QnVmZmVyIHZrRGVzdHJveUJ1ZmZlciA9IDA7CisgICAgUEZOX3ZrRGVzdHJveUJ1ZmZlclZpZXcgdmtEZXN0cm95QnVmZmVyVmlldyA9IDA7CisgICAgUEZOX3ZrRGVzdHJveUNvbW1hbmRQb29sIHZrRGVzdHJveUNvbW1hbmRQb29sID0gMDsKKyAgICBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclBvb2wgdmtEZXN0cm95RGVzY3JpcHRvclBvb2wgPSAwOworICAgIFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0IHZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQgPSAwOworICAgIFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gMDsKKyAgICBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IDA7CisgICAgUEZOX3ZrRGVzdHJveURldmljZSB2a0Rlc3Ryb3lEZXZpY2UgPSAwOworICAgIFBGTl92a0Rlc3Ryb3lFdmVudCB2a0Rlc3Ryb3lFdmVudCA9IDA7CisgICAgUEZOX3ZrRGVzdHJveUZlbmNlIHZrRGVzdHJveUZlbmNlID0gMDsKKyAgICBQRk5fdmtEZXN0cm95RnJhbWVidWZmZXIgdmtEZXN0cm95RnJhbWVidWZmZXIgPSAwOworICAgIFBGTl92a0Rlc3Ryb3lJbWFnZSB2a0Rlc3Ryb3lJbWFnZSA9IDA7CisgICAgUEZOX3ZrRGVzdHJveUltYWdlVmlldyB2a0Rlc3Ryb3lJbWFnZVZpZXcgPSAwOworICAgIFBGTl92a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIHZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggPSAwOworICAgIFBGTl92a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCB2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCA9IDA7CisgICAgUEZOX3ZrRGVzdHJveVBpcGVsaW5lIHZrRGVzdHJveVBpcGVsaW5lID0gMDsKKyAgICBQRk5fdmtEZXN0cm95UGlwZWxpbmVDYWNoZSB2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlID0gMDsKKyAgICBQRk5fdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQgdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQgPSAwOworICAgIFBGTl92a0Rlc3Ryb3lRdWVyeVBvb2wgdmtEZXN0cm95UXVlcnlQb29sID0gMDsKKyAgICBQRk5fdmtEZXN0cm95UmVuZGVyUGFzcyB2a0Rlc3Ryb3lSZW5kZXJQYXNzID0gMDsKKyAgICBQRk5fdmtEZXN0cm95U2FtcGxlciB2a0Rlc3Ryb3lTYW1wbGVyID0gMDsKKyAgICBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gMDsKKyAgICBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gMDsKKyAgICBQRk5fdmtEZXN0cm95U2VtYXBob3JlIHZrRGVzdHJveVNlbWFwaG9yZSA9IDA7CisgICAgUEZOX3ZrRGVzdHJveVNoYWRlck1vZHVsZSB2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUgPSAwOworICAgIFBGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFIgdmtEZXN0cm95U3dhcGNoYWluS0hSID0gMDsKKyAgICBQRk5fdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUIHZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCA9IDA7CisgICAgUEZOX3ZrRGV2aWNlV2FpdElkbGUgdmtEZXZpY2VXYWl0SWRsZSA9IDA7CisgICAgUEZOX3ZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCB2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQgPSAwOworICAgIFBGTl92a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgPSAwOworICAgIFBGTl92a0ZyZWVDb21tYW5kQnVmZmVycyB2a0ZyZWVDb21tYW5kQnVmZmVycyA9IDA7CisgICAgUEZOX3ZrRnJlZURlc2NyaXB0b3JTZXRzIHZrRnJlZURlc2NyaXB0b3JTZXRzID0gMDsKKyAgICBQRk5fdmtGcmVlTWVtb3J5IHZrRnJlZU1lbW9yeSA9IDA7CisgICAgUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYgdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViA9IDA7CisgICAgUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViA9IDA7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgUEZOX3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworICAgIFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUID0gMDsKKyAgICBQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIHZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUiA9IDA7CisgICAgUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzID0gMDsKKyAgICBQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiA9IDA7CisgICAgUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSAwOworICAgIFBGTl92a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIHZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgPSAwOworICAgIFBGTl92a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUIHZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQgPSAwOworICAgIFBGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IHZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgPSAwOworICAgIFBGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIHZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIgPSAwOworICAgIFBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzIHZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMgPSAwOworICAgIFBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSIHZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIgPSAwOworICAgIFBGTl92a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiB2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9IDA7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgIFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiB2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiA9IDA7CisgICAgUEZOX3ZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCB2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQgPSAwOworICAgIFBGTl92a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIHZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgPSAwOworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIHZrR2V0RGV2aWNlUHJvY0FkZHIgPSAwOworICAgIFBGTl92a0dldERldmljZVF1ZXVlIHZrR2V0RGV2aWNlUXVldWUgPSAwOworICAgIFBGTl92a0dldERldmljZVF1ZXVlMiB2a0dldERldmljZVF1ZXVlMiA9IDA7CisgICAgUEZOX3ZrR2V0RXZlbnRTdGF0dXMgdmtHZXRFdmVudFN0YXR1cyA9IDA7CisgICAgUEZOX3ZrR2V0RmVuY2VGZEtIUiB2a0dldEZlbmNlRmRLSFIgPSAwOworICAgIFBGTl92a0dldEZlbmNlU3RhdHVzIHZrR2V0RmVuY2VTdGF0dXMgPSAwOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSIHZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgICBQRk5fdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCB2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUID0gMDsKKyAgICBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzID0gMDsKKyAgICBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgPSAwOworICAgIFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IDA7CisgICAgUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyA9IDA7CisgICAgUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyID0gMDsKKyAgICBQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSAwOworICAgIFBGTl92a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQgdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0ID0gMDsKKyAgICBQRk5fdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlggdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlggPSAwOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIFBGTl92a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQgdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisgICAgUEZOX3ZrR2V0TWVtb3J5RmRLSFIgdmtHZXRNZW1vcnlGZEtIUiA9IDA7CisgICAgUEZOX3ZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIHZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSID0gMDsKKyAgICBQRk5fdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgPSAwOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiB2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WIHZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIHZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgIFBGTl92a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFID0gMDsKKyAgICBQRk5fdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMIHZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCA9IDA7CisgICAgUEZOX3ZrR2V0UGlwZWxpbmVDYWNoZURhdGEgdmtHZXRQaXBlbGluZUNhY2hlRGF0YSA9IDA7CisgICAgUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiB2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgPSAwOworICAgIFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIgdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSID0gMDsKKyAgICBQRk5fdmtHZXRRdWVyeVBvb2xSZXN1bHRzIHZrR2V0UXVlcnlQb29sUmVzdWx0cyA9IDA7CisgICAgUEZOX3ZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIHZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WID0gMDsKKyAgICBQRk5fdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSB2a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFID0gMDsKKyAgICBQRk5fdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkgdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkgPSAwOworICAgIFBGTl92a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiB2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiA9IDA7CisgICAgUEZOX3ZrR2V0U2VtYXBob3JlRmRLSFIgdmtHZXRTZW1hcGhvcmVGZEtIUiA9IDA7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIHZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSAwOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgICAgUEZOX3ZrR2V0U2hhZGVySW5mb0FNRCB2a0dldFNoYWRlckluZm9BTUQgPSAwOworICAgIFBGTl92a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQgdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUID0gMDsKKyAgICBQRk5fdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIgdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIgPSAwOworICAgIFBGTl92a0dldFN3YXBjaGFpblN0YXR1c0tIUiB2a0dldFN3YXBjaGFpblN0YXR1c0tIUiA9IDA7CisgICAgUEZOX3ZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCB2a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQgPSAwOworICAgIFBGTl92a0ltcG9ydEZlbmNlRmRLSFIgdmtJbXBvcnRGZW5jZUZkS0hSID0gMDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiB2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIgPSAwOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgICAgUEZOX3ZrSW1wb3J0U2VtYXBob3JlRmRLSFIgdmtJbXBvcnRTZW1hcGhvcmVGZEtIUiA9IDA7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIHZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSAwOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgICAgUEZOX3ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwgdmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IDA7CisgICAgUEZOX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyB2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMgPSAwOworICAgIFBGTl92a01hcE1lbW9yeSB2a01hcE1lbW9yeSA9IDA7CisgICAgUEZOX3ZrTWVyZ2VQaXBlbGluZUNhY2hlcyB2a01lcmdlUGlwZWxpbmVDYWNoZXMgPSAwOworICAgIFBGTl92a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCB2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCA9IDA7CisgICAgUEZOX3ZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCB2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQgPSAwOworICAgIFBGTl92a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIHZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQgPSAwOworICAgIFBGTl92a1JlZ2lzdGVyT2JqZWN0c05WWCB2a1JlZ2lzdGVyT2JqZWN0c05WWCA9IDA7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCB2a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgICBQRk5fdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSAwOworICAgIFBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIHZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIgPSAwOworICAgIFBGTl92a1Jlc2V0Q29tbWFuZFBvb2wgdmtSZXNldENvbW1hbmRQb29sID0gMDsKKyAgICBQRk5fdmtSZXNldERlc2NyaXB0b3JQb29sIHZrUmVzZXREZXNjcmlwdG9yUG9vbCA9IDA7CisgICAgUEZOX3ZrUmVzZXRFdmVudCB2a1Jlc2V0RXZlbnQgPSAwOworICAgIFBGTl92a1Jlc2V0RmVuY2VzIHZrUmVzZXRGZW5jZXMgPSAwOworICAgIFBGTl92a1Jlc2V0UXVlcnlQb29sRVhUIHZrUmVzZXRRdWVyeVBvb2xFWFQgPSAwOworICAgIFBGTl92a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIHZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgPSAwOworICAgIFBGTl92a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQgdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUID0gMDsKKyAgICBQRk5fdmtTZXRFdmVudCB2a1NldEV2ZW50ID0gMDsKKyAgICBQRk5fdmtTZXRIZHJNZXRhZGF0YUVYVCB2a1NldEhkck1ldGFkYXRhRVhUID0gMDsKKyAgICBQRk5fdmtTZXRMb2NhbERpbW1pbmdBTUQgdmtTZXRMb2NhbERpbW1pbmdBTUQgPSAwOworICAgIFBGTl92a1NpZ25hbFNlbWFwaG9yZUtIUiB2a1NpZ25hbFNlbWFwaG9yZUtIUiA9IDA7CisgICAgUEZOX3ZrVHJpbUNvbW1hbmRQb29sIHZrVHJpbUNvbW1hbmRQb29sID0gMDsKKyAgICBQRk5fdmtUcmltQ29tbWFuZFBvb2xLSFIgdmtUcmltQ29tbWFuZFBvb2xLSFIgPSAwOworICAgIFBGTl92a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwgdmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMID0gMDsKKyAgICBQRk5fdmtVbm1hcE1lbW9yeSB2a1VubWFwTWVtb3J5ID0gMDsKKyAgICBQRk5fdmtVbnJlZ2lzdGVyT2JqZWN0c05WWCB2a1VucmVnaXN0ZXJPYmplY3RzTlZYID0gMDsKKyAgICBQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlIHZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSA9IDA7CisgICAgUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiB2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPSAwOworICAgIFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRzIHZrVXBkYXRlRGVzY3JpcHRvclNldHMgPSAwOworICAgIFBGTl92a1dhaXRGb3JGZW5jZXMgdmtXYWl0Rm9yRmVuY2VzID0gMDsKKyAgICBQRk5fdmtXYWl0U2VtYXBob3Jlc0tIUiB2a1dhaXRTZW1hcGhvcmVzS0hSID0gMDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBQRk5fdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiB2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisgICAgUEZOX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCB2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPSAwOworICAgIFBGTl92a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0gMDsKKyAgICBQRk5fdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIHZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIHZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUID0gMDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgIFBGTl92a0NyZWF0ZUlPU1N1cmZhY2VNVksgdmtDcmVhdGVJT1NTdXJmYWNlTVZLID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9JT1NfTVZLKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorICAgIFBGTl92a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBIHZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEgPSAwOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyAgICBQRk5fdmtDcmVhdGVNYWNPU1N1cmZhY2VNVksgdmtDcmVhdGVNYWNPU1N1cmZhY2VNVksgPSAwOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSyovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgIFBGTl92a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCB2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgUEZOX3ZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AgdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fR0dQKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKyAgICBQRk5fdmtDcmVhdGVWaVN1cmZhY2VOTiB2a0NyZWF0ZVZpU3VyZmFjZU5OID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9WSV9OTiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgUEZOX3ZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIgdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIgdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIgPSAwOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICBQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSIHZrQ3JlYXRlWGNiU3VyZmFjZUtIUiA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWENCX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgUEZOX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIgdmtDcmVhdGVYbGliU3VyZmFjZUtIUiA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWExJQl9LSFIqLworICAgIFBGTl92a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCB2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCA9IDA7CisgICAgUEZOX3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCA9IDA7CisgICAgUEZOX3ZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCA9IDA7CisgICAgUEZOX3ZrRGVzdHJveUluc3RhbmNlIHZrRGVzdHJveUluc3RhbmNlID0gMDsKKyAgICBQRk5fdmtEZXN0cm95U3VyZmFjZUtIUiB2a0Rlc3Ryb3lTdXJmYWNlS0hSID0gMDsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzID0gMDsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSID0gMDsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgPSAwOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgdmtHZXRJbnN0YW5jZVByb2NBZGRyID0gMDsKKyAgICBQRk5fdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCB2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUID0gMDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgUEZOX3ZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIHZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQqLworICAgIFBGTl92a0NyZWF0ZURldmljZSB2a0NyZWF0ZURldmljZSA9IDA7CisgICAgUEZOX3ZrQ3JlYXRlRGlzcGxheU1vZGVLSFIgdmtDcmVhdGVEaXNwbGF5TW9kZUtIUiA9IDA7CisgICAgUEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMgPSAwOworICAgIFBGTl92a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyA9IDA7CisgICAgUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIgPSAwOworICAgIFBGTl92a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSID0gMDsKKyAgICBQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgPSAwOworICAgIFBGTl92a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSID0gMDsKKyAgICBQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgPSAwOworICAgIFBGTl92a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIHZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUIHZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlggdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCB2a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiA9IDA7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgPSAwOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgPSAwOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSID0gMDsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUIHZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCA9IDA7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiB2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSAwOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIgdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiB2a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IDA7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWENCX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiB2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSAwOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgUEZOX3ZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUIHZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUID0gMDsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQqLworICAgIFBGTl92a1JlbGVhc2VEaXNwbGF5RVhUIHZrUmVsZWFzZURpc3BsYXlFWFQgPSAwOworICAgIFBGTl92a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViB2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViA9IDA7CisgICAgUEZOX3ZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCB2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgPSAwOworICAgIFBGTl92a1F1ZXVlQmluZFNwYXJzZSB2a1F1ZXVlQmluZFNwYXJzZSA9IDA7CisgICAgUEZOX3ZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgdmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCA9IDA7CisgICAgUEZOX3ZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCA9IDA7CisgICAgUEZOX3ZrUXVldWVQcmVzZW50S0hSIHZrUXVldWVQcmVzZW50S0hSID0gMDsKKyAgICBQRk5fdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIHZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IDA7CisgICAgUEZOX3ZrUXVldWVTdWJtaXQgdmtRdWV1ZVN1Ym1pdCA9IDA7CisgICAgUEZOX3ZrUXVldWVXYWl0SWRsZSB2a1F1ZXVlV2FpdElkbGUgPSAwOworCisgIHB1YmxpYzoKKyAgICBEaXNwYXRjaExvYWRlckR5bmFtaWMoKSBWVUxLQU5fSFBQX05PRVhDRVBUID0gZGVmYXVsdDsKKworI2lmICFkZWZpbmVkKFZLX05PX1BST1RPVFlQRVMpCisgICAgLy8gVGhpcyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBmb3IgcGVyLWRldmljZSBmdW5jdGlvbiBwb2ludGVycyBpbiBjb21iaW5hdGlvbiB3aXRoIGEgbGlua2VkIHZ1bGthbiBsaWJyYXJ5LgorICAgIERpc3BhdGNoTG9hZGVyRHluYW1pYyhWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5zdGFuY2UgY29uc3QmIGluc3RhbmNlLCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6RGV2aWNlIGNvbnN0JiBkZXZpY2UpIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBpbml0KGluc3RhbmNlLCBkZXZpY2UpOworICAgIH0KKworICAgIC8vIFRoaXMgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZm9yIHBlci1kZXZpY2UgZnVuY3Rpb24gcG9pbnRlcnMgaW4gY29tYmluYXRpb24gd2l0aCBhIGxpbmtlZCB2dWxrYW4gbGlicmFyeS4KKyAgICB2b2lkIGluaXQoVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlIGNvbnN0JiBpbnN0YW5jZSwgVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZSBjb25zdCYgZGV2aWNlKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5pdChzdGF0aWNfY2FzdDxWa0luc3RhbmNlPihpbnN0YW5jZSksIDo6dmtHZXRJbnN0YW5jZVByb2NBZGRyLCBzdGF0aWNfY2FzdDxWa0RldmljZT4oZGV2aWNlKSwgZGV2aWNlID8gOjp2a0dldERldmljZVByb2NBZGRyIDogbnVsbHB0cik7CisgICAgfQorI2VuZGlmIC8vICFkZWZpbmVkKFZLX05PX1BST1RPVFlQRVMpCisKKyAgICBEaXNwYXRjaExvYWRlckR5bmFtaWMoUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBnZXRJbnN0YW5jZVByb2NBZGRyKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5pdChnZXRJbnN0YW5jZVByb2NBZGRyKTsKKyAgICB9CisKKyAgICB2b2lkIGluaXQoIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ2V0SW5zdGFuY2VQcm9jQWRkciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVChnZXRJbnN0YW5jZVByb2NBZGRyKTsKKworICAgICAgdmtHZXRJbnN0YW5jZVByb2NBZGRyID0gZ2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICAgIHZrQ3JlYXRlSW5zdGFuY2UgPSBQRk5fdmtDcmVhdGVJbnN0YW5jZSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBOVUxMLCAidmtDcmVhdGVJbnN0YW5jZSIgKSApOworICAgICAgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgPSBQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggTlVMTCwgInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIiApICk7CisgICAgICB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzID0gUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggTlVMTCwgInZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMiICkgKTsKKyAgICAgIHZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uID0gUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIE5VTEwsICJ2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiIgKSApOworICAgIH0KKworICAgIC8vIFRoaXMgaW50ZXJmYWNlIGRvZXMgbm90IHJlcXVpcmUgYSBsaW5rZWQgdnVsa2FuIGxpYnJhcnkuCisgICAgRGlzcGF0Y2hMb2FkZXJEeW5hbWljKCBWa0luc3RhbmNlIGluc3RhbmNlLCBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGdldEluc3RhbmNlUHJvY0FkZHIsIFZrRGV2aWNlIGRldmljZSA9IFZLX05VTExfSEFORExFLCBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBnZXREZXZpY2VQcm9jQWRkciA9IG51bGxwdHIgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgaW5pdCggaW5zdGFuY2UsIGdldEluc3RhbmNlUHJvY0FkZHIsIGRldmljZSwgZ2V0RGV2aWNlUHJvY0FkZHIgKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGludGVyZmFjZSBkb2VzIG5vdCByZXF1aXJlIGEgbGlua2VkIHZ1bGthbiBsaWJyYXJ5LgorICAgIHZvaWQgaW5pdCggVmtJbnN0YW5jZSBpbnN0YW5jZSwgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBnZXRJbnN0YW5jZVByb2NBZGRyLCBWa0RldmljZSBkZXZpY2UgPSBWS19OVUxMX0hBTkRMRSwgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgLypnZXREZXZpY2VQcm9jQWRkciovID0gbnVsbHB0ciApIFZVTEtBTl9IUFBfTk9FWENFUFQKKyAgICB7CisgICAgICBWVUxLQU5fSFBQX0FTU0VSVChpbnN0YW5jZSAmJiBnZXRJbnN0YW5jZVByb2NBZGRyKTsKKyAgICAgIHZrR2V0SW5zdGFuY2VQcm9jQWRkciA9IGdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgICBpbml0KCBWVUxLQU5fSFBQX05BTUVTUEFDRTo6SW5zdGFuY2UoaW5zdGFuY2UpICk7CisgICAgICBpZiAoZGV2aWNlKSB7CisgICAgICAgIGluaXQoIFZVTEtBTl9IUFBfTkFNRVNQQUNFOjpEZXZpY2UoZGV2aWNlKSApOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgaW5pdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6Okluc3RhbmNlIGluc3RhbmNlQ3BwICkgVlVMS0FOX0hQUF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxWa0luc3RhbmNlPihpbnN0YW5jZUNwcCk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgICB2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSID0gUEZOX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworICAgICAgdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUID0gUEZOX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCIgKSApOworICAgICAgdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0gUEZOX3ZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIgKSApOworICAgICAgdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSID0gUEZOX3ZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIgKSApOworICAgICAgdmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQgPSBQRk5fdmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisgICAgICB2a0NyZWF0ZUlPU1N1cmZhY2VNVksgPSBQRk5fdmtDcmVhdGVJT1NTdXJmYWNlTVZLKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVJT1NTdXJmYWNlTVZLIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fSU9TX01WSyovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICAgIHZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEgPSBQRk5fdmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9GVUNIU0lBKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgICB2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyA9IFBGTl92a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgICB2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCA9IFBGTl92a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgICB2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQID0gUEZOX3ZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fR0dQKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKyAgICAgIHZrQ3JlYXRlVmlTdXJmYWNlTk4gPSBQRk5fdmtDcmVhdGVWaVN1cmZhY2VOTiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlVmlTdXJmYWNlTk4iICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9WSV9OTiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgICB2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSID0gUEZOX3ZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSID0gUEZOX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgICB2a0NyZWF0ZVhjYlN1cmZhY2VLSFIgPSBQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVYY2JTdXJmYWNlS0hSIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWENCX0tIUiovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgICB2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSID0gUEZOX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWExJQl9LSFIqLworICAgICAgdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQgPSBQRk5fdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCIgKSApOworICAgICAgdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCA9IFBGTl92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCIgKSApOworICAgICAgdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCA9IFBGTl92a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCIgKSApOworICAgICAgdmtEZXN0cm95SW5zdGFuY2UgPSBQRk5fdmtEZXN0cm95SW5zdGFuY2UoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lJbnN0YW5jZSIgKSApOworICAgICAgdmtEZXN0cm95U3VyZmFjZUtIUiA9IFBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95U3VyZmFjZUtIUiIgKSApOworICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyA9IFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyIgKSApOworICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiA9IFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiIgKSApOworICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgPSBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIgKSApOworICAgICAgdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCA9IFBGTl92a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICAgIHZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUID0gUEZOX3ZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQqLworICAgICAgdmtDcmVhdGVEZXZpY2UgPSBQRk5fdmtDcmVhdGVEZXZpY2UoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZURldmljZSIgKSApOworICAgICAgdmtDcmVhdGVEaXNwbGF5TW9kZUtIUiA9IFBGTl92a0NyZWF0ZURpc3BsYXlNb2RlS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVEaXNwbGF5TW9kZUtIUiIgKSApOworICAgICAgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzID0gUEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyIgKSApOworICAgICAgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMgPSBQRk5fdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyIgKSApOworICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSID0gUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIgKSApOworICAgICAgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSID0gUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgPSBQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSID0gUEZOX3ZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiIgKSApOworICAgICAgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgPSBQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiIgKSApOworICAgICAgdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiA9IFBGTl92a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCA9IFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiIgKSApOworICAgICAgdmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgICAgdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIgKSApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgICAgdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSBQRk5fdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIgKSApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgICAgdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIgKSApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgICB2a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCA9IFBGTl92a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUKi8KKyAgICAgIHZrUmVsZWFzZURpc3BsYXlFWFQgPSBQRk5fdmtSZWxlYXNlRGlzcGxheUVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrUmVsZWFzZURpc3BsYXlFWFQiICkgKTsKKyAgICAgIHZrQmVnaW5Db21tYW5kQnVmZmVyID0gUEZOX3ZrQmVnaW5Db21tYW5kQnVmZmVyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtCZWdpbkNvbW1hbmRCdWZmZXIiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IFBGTl92a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgPSBQRk5fdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5RdWVyeSA9IFBGTl92a0NtZEJlZ2luUXVlcnkoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEJlZ2luUXVlcnkiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQgPSBQRk5fdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5SZW5kZXJQYXNzID0gUEZOX3ZrQ21kQmVnaW5SZW5kZXJQYXNzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRCZWdpblJlbmRlclBhc3MiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiA9IFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCA9IFBGTl92a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQiICkgKTsKKyAgICAgIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzID0gUEZOX3ZrQ21kQmluZERlc2NyaXB0b3JTZXRzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRCaW5kRGVzY3JpcHRvclNldHMiICkgKTsKKyAgICAgIHZrQ21kQmluZEluZGV4QnVmZmVyID0gUEZOX3ZrQ21kQmluZEluZGV4QnVmZmVyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRCaW5kSW5kZXhCdWZmZXIiICkgKTsKKyAgICAgIHZrQ21kQmluZFBpcGVsaW5lID0gUEZOX3ZrQ21kQmluZFBpcGVsaW5lKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRCaW5kUGlwZWxpbmUiICkgKTsKKyAgICAgIHZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViA9IFBGTl92a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYiICkgKTsKKyAgICAgIHZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCA9IFBGTl92a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQiICkgKTsKKyAgICAgIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnMgPSBQRk5fdmtDbWRCaW5kVmVydGV4QnVmZmVycyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiICkgKTsKKyAgICAgIHZrQ21kQmxpdEltYWdlID0gUEZOX3ZrQ21kQmxpdEltYWdlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRCbGl0SW1hZ2UiICkgKTsKKyAgICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IFBGTl92a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiICkgKTsKKyAgICAgIHZrQ21kQ2xlYXJBdHRhY2htZW50cyA9IFBGTl92a0NtZENsZWFyQXR0YWNobWVudHMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZENsZWFyQXR0YWNobWVudHMiICkgKTsKKyAgICAgIHZrQ21kQ2xlYXJDb2xvckltYWdlID0gUEZOX3ZrQ21kQ2xlYXJDb2xvckltYWdlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRDbGVhckNvbG9ySW1hZ2UiICkgKTsKKyAgICAgIHZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSA9IFBGTl92a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiICkgKTsKKyAgICAgIHZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gUEZOX3ZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiICkgKTsKKyAgICAgIHZrQ21kQ29weUJ1ZmZlciA9IFBGTl92a0NtZENvcHlCdWZmZXIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZENvcHlCdWZmZXIiICkgKTsKKyAgICAgIHZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UgPSBQRk5fdmtDbWRDb3B5QnVmZmVyVG9JbWFnZSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UiICkgKTsKKyAgICAgIHZrQ21kQ29weUltYWdlID0gUEZOX3ZrQ21kQ29weUltYWdlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRDb3B5SW1hZ2UiICkgKTsKKyAgICAgIHZrQ21kQ29weUltYWdlVG9CdWZmZXIgPSBQRk5fdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIiICkgKTsKKyAgICAgIHZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMgPSBQRk5fdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMiICkgKTsKKyAgICAgIHZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCA9IFBGTl92a0NtZERlYnVnTWFya2VyQmVnaW5FWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiICkgKTsKKyAgICAgIHZrQ21kRGVidWdNYXJrZXJFbmRFWFQgPSBQRk5fdmtDbWREZWJ1Z01hcmtlckVuZEVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRGVidWdNYXJrZXJFbmRFWFQiICkgKTsKKyAgICAgIHZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQgPSBQRk5fdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiICkgKTsKKyAgICAgIHZrQ21kRGlzcGF0Y2ggPSBQRk5fdmtDbWREaXNwYXRjaCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRGlzcGF0Y2giICkgKTsKKyAgICAgIHZrQ21kRGlzcGF0Y2hCYXNlID0gUEZOX3ZrQ21kRGlzcGF0Y2hCYXNlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWREaXNwYXRjaEJhc2UiICkgKTsKKyAgICAgIHZrQ21kRGlzcGF0Y2hCYXNlS0hSID0gUEZOX3ZrQ21kRGlzcGF0Y2hCYXNlS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWREaXNwYXRjaEJhc2VLSFIiICkgKTsKKyAgICAgIHZrQ21kRGlzcGF0Y2hJbmRpcmVjdCA9IFBGTl92a0NtZERpc3BhdGNoSW5kaXJlY3QoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZERpc3BhdGNoSW5kaXJlY3QiICkgKTsKKyAgICAgIHZrQ21kRHJhdyA9IFBGTl92a0NtZERyYXcoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZERyYXciICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGV4ZWQgPSBQRk5fdmtDbWREcmF3SW5kZXhlZCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRHJhd0luZGV4ZWQiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCA9IFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3QoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EID0gUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSID0gUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGlyZWN0ID0gUEZOX3ZrQ21kRHJhd0luZGlyZWN0KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWREcmF3SW5kaXJlY3QiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUID0gUEZOX3ZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQgPSBQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIgPSBQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIiICkgKTsKKyAgICAgIHZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViA9IFBGTl92a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYiICkgKTsKKyAgICAgIHZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYgPSBQRk5fdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYiICkgKTsKKyAgICAgIHZrQ21kRHJhd01lc2hUYXNrc05WID0gUEZOX3ZrQ21kRHJhd01lc2hUYXNrc05WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWREcmF3TWVzaFRhc2tzTlYiICkgKTsKKyAgICAgIHZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgPSBQRk5fdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiICkgKTsKKyAgICAgIHZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUID0gUEZOX3ZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiICkgKTsKKyAgICAgIHZrQ21kRW5kUXVlcnkgPSBQRk5fdmtDbWRFbmRRdWVyeSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRW5kUXVlcnkiICkgKTsKKyAgICAgIHZrQ21kRW5kUXVlcnlJbmRleGVkRVhUID0gUEZOX3ZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQiICkgKTsKKyAgICAgIHZrQ21kRW5kUmVuZGVyUGFzcyA9IFBGTl92a0NtZEVuZFJlbmRlclBhc3MoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEVuZFJlbmRlclBhc3MiICkgKTsKKyAgICAgIHZrQ21kRW5kUmVuZGVyUGFzczJLSFIgPSBQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRW5kUmVuZGVyUGFzczJLSFIiICkgKTsKKyAgICAgIHZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQgPSBQRk5fdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQiICkgKTsKKyAgICAgIHZrQ21kRXhlY3V0ZUNvbW1hbmRzID0gUEZOX3ZrQ21kRXhlY3V0ZUNvbW1hbmRzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRFeGVjdXRlQ29tbWFuZHMiICkgKTsKKyAgICAgIHZrQ21kRmlsbEJ1ZmZlciA9IFBGTl92a0NtZEZpbGxCdWZmZXIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZEZpbGxCdWZmZXIiICkgKTsKKyAgICAgIHZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUID0gUEZOX3ZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiICkgKTsKKyAgICAgIHZrQ21kTmV4dFN1YnBhc3MgPSBQRk5fdmtDbWROZXh0U3VicGFzcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kTmV4dFN1YnBhc3MiICkgKTsKKyAgICAgIHZrQ21kTmV4dFN1YnBhc3MyS0hSID0gUEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWROZXh0U3VicGFzczJLSFIiICkgKTsKKyAgICAgIHZrQ21kUGlwZWxpbmVCYXJyaWVyID0gUEZOX3ZrQ21kUGlwZWxpbmVCYXJyaWVyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRQaXBlbGluZUJhcnJpZXIiICkgKTsKKyAgICAgIHZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYID0gUEZOX3ZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiICkgKTsKKyAgICAgIHZrQ21kUHVzaENvbnN0YW50cyA9IFBGTl92a0NtZFB1c2hDb25zdGFudHMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFB1c2hDb25zdGFudHMiICkgKTsKKyAgICAgIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgPSBQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIiICkgKTsKKyAgICAgIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPSBQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiICkgKTsKKyAgICAgIHZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlggPSBQRk5fdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgiICkgKTsKKyAgICAgIHZrQ21kUmVzZXRFdmVudCA9IFBGTl92a0NtZFJlc2V0RXZlbnQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFJlc2V0RXZlbnQiICkgKTsKKyAgICAgIHZrQ21kUmVzZXRRdWVyeVBvb2wgPSBQRk5fdmtDbWRSZXNldFF1ZXJ5UG9vbCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kUmVzZXRRdWVyeVBvb2wiICkgKTsKKyAgICAgIHZrQ21kUmVzb2x2ZUltYWdlID0gUEZOX3ZrQ21kUmVzb2x2ZUltYWdlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRSZXNvbHZlSW1hZ2UiICkgKTsKKyAgICAgIHZrQ21kU2V0QmxlbmRDb25zdGFudHMgPSBQRk5fdmtDbWRTZXRCbGVuZENvbnN0YW50cyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kU2V0QmxlbmRDb25zdGFudHMiICkgKTsKKyAgICAgIHZrQ21kU2V0Q2hlY2twb2ludE5WID0gUEZOX3ZrQ21kU2V0Q2hlY2twb2ludE5WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRTZXRDaGVja3BvaW50TlYiICkgKTsKKyAgICAgIHZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViA9IFBGTl92a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYiICkgKTsKKyAgICAgIHZrQ21kU2V0RGVwdGhCaWFzID0gUEZOX3ZrQ21kU2V0RGVwdGhCaWFzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRTZXREZXB0aEJpYXMiICkgKTsKKyAgICAgIHZrQ21kU2V0RGVwdGhCb3VuZHMgPSBQRk5fdmtDbWRTZXREZXB0aEJvdW5kcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kU2V0RGVwdGhCb3VuZHMiICkgKTsKKyAgICAgIHZrQ21kU2V0RGV2aWNlTWFzayA9IFBGTl92a0NtZFNldERldmljZU1hc2soIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldERldmljZU1hc2siICkgKTsKKyAgICAgIHZrQ21kU2V0RGV2aWNlTWFza0tIUiA9IFBGTl92a0NtZFNldERldmljZU1hc2tLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldERldmljZU1hc2tLSFIiICkgKTsKKyAgICAgIHZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCA9IFBGTl92a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQiICkgKTsKKyAgICAgIHZrQ21kU2V0RXZlbnQgPSBQRk5fdmtDbWRTZXRFdmVudCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kU2V0RXZlbnQiICkgKTsKKyAgICAgIHZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WID0gUEZOX3ZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYiICkgKTsKKyAgICAgIHZrQ21kU2V0TGluZVN0aXBwbGVFWFQgPSBQRk5fdmtDbWRTZXRMaW5lU3RpcHBsZUVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kU2V0TGluZVN0aXBwbGVFWFQiICkgKTsKKyAgICAgIHZrQ21kU2V0TGluZVdpZHRoID0gUEZOX3ZrQ21kU2V0TGluZVdpZHRoKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRTZXRMaW5lV2lkdGgiICkgKTsKKyAgICAgIHZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCA9IFBGTl92a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwiICkgKTsKKyAgICAgIHZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMID0gUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwiICkgKTsKKyAgICAgIHZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCA9IFBGTl92a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwiICkgKTsKKyAgICAgIHZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUID0gUEZOX3ZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQiICkgKTsKKyAgICAgIHZrQ21kU2V0U2Npc3NvciA9IFBGTl92a0NtZFNldFNjaXNzb3IoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldFNjaXNzb3IiICkgKTsKKyAgICAgIHZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrID0gUEZOX3ZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2siICkgKTsKKyAgICAgIHZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSA9IFBGTl92a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UiICkgKTsKKyAgICAgIHZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayA9IFBGTl92a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2soIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2siICkgKTsKKyAgICAgIHZrQ21kU2V0Vmlld3BvcnQgPSBQRk5fdmtDbWRTZXRWaWV3cG9ydCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kU2V0Vmlld3BvcnQiICkgKTsKKyAgICAgIHZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViA9IFBGTl92a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYiICkgKTsKKyAgICAgIHZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WID0gUEZOX3ZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYiICkgKTsKKyAgICAgIHZrQ21kVHJhY2VSYXlzTlYgPSBQRk5fdmtDbWRUcmFjZVJheXNOViggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kVHJhY2VSYXlzTlYiICkgKTsKKyAgICAgIHZrQ21kVXBkYXRlQnVmZmVyID0gUEZOX3ZrQ21kVXBkYXRlQnVmZmVyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRVcGRhdGVCdWZmZXIiICkgKTsKKyAgICAgIHZrQ21kV2FpdEV2ZW50cyA9IFBGTl92a0NtZFdhaXRFdmVudHMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NtZFdhaXRFdmVudHMiICkgKTsKKyAgICAgIHZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WID0gUEZOX3ZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYiICkgKTsKKyAgICAgIHZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQgPSBQRk5fdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQiICkgKTsKKyAgICAgIHZrQ21kV3JpdGVUaW1lc3RhbXAgPSBQRk5fdmtDbWRXcml0ZVRpbWVzdGFtcCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ21kV3JpdGVUaW1lc3RhbXAiICkgKTsKKyAgICAgIHZrRW5kQ29tbWFuZEJ1ZmZlciA9IFBGTl92a0VuZENvbW1hbmRCdWZmZXIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0VuZENvbW1hbmRCdWZmZXIiICkgKTsKKyAgICAgIHZrUmVzZXRDb21tYW5kQnVmZmVyID0gUEZOX3ZrUmVzZXRDb21tYW5kQnVmZmVyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtSZXNldENvbW1hbmRCdWZmZXIiICkgKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICB2a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCA9IFBGTl92a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgICAgIHZrQWNxdWlyZU5leHRJbWFnZTJLSFIgPSBQRk5fdmtBY3F1aXJlTmV4dEltYWdlMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQWNxdWlyZU5leHRJbWFnZTJLSFIiICkgKTsKKyAgICAgIHZrQWNxdWlyZU5leHRJbWFnZUtIUiA9IFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiICkgKTsKKyAgICAgIHZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID0gUEZOX3ZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiICkgKTsKKyAgICAgIHZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgPSBQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIiICkgKTsKKyAgICAgIHZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyA9IFBGTl92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiICkgKTsKKyAgICAgIHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyA9IFBGTl92a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiICkgKTsKKyAgICAgIHZrQWxsb2NhdGVNZW1vcnkgPSBQRk5fdmtBbGxvY2F0ZU1lbW9yeSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQWxsb2NhdGVNZW1vcnkiICkgKTsKKyAgICAgIHZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WID0gUEZOX3ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYiICkgKTsKKyAgICAgIHZrQmluZEJ1ZmZlck1lbW9yeSA9IFBGTl92a0JpbmRCdWZmZXJNZW1vcnkoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0JpbmRCdWZmZXJNZW1vcnkiICkgKTsKKyAgICAgIHZrQmluZEJ1ZmZlck1lbW9yeTIgPSBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQmluZEJ1ZmZlck1lbW9yeTIiICkgKTsKKyAgICAgIHZrQmluZEJ1ZmZlck1lbW9yeTJLSFIgPSBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQmluZEJ1ZmZlck1lbW9yeTJLSFIiICkgKTsKKyAgICAgIHZrQmluZEltYWdlTWVtb3J5ID0gUEZOX3ZrQmluZEltYWdlTWVtb3J5KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtCaW5kSW1hZ2VNZW1vcnkiICkgKTsKKyAgICAgIHZrQmluZEltYWdlTWVtb3J5MiA9IFBGTl92a0JpbmRJbWFnZU1lbW9yeTIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0JpbmRJbWFnZU1lbW9yeTIiICkgKTsKKyAgICAgIHZrQmluZEltYWdlTWVtb3J5MktIUiA9IFBGTl92a0JpbmRJbWFnZU1lbW9yeTJLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0JpbmRJbWFnZU1lbW9yeTJLSFIiICkgKTsKKyAgICAgIHZrQ29tcGlsZURlZmVycmVkTlYgPSBQRk5fdmtDb21waWxlRGVmZXJyZWROViggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ29tcGlsZURlZmVycmVkTlYiICkgKTsKKyAgICAgIHZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSBQRk5fdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiICkgKTsKKyAgICAgIHZrQ3JlYXRlQnVmZmVyID0gUEZOX3ZrQ3JlYXRlQnVmZmVyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVCdWZmZXIiICkgKTsKKyAgICAgIHZrQ3JlYXRlQnVmZmVyVmlldyA9IFBGTl92a0NyZWF0ZUJ1ZmZlclZpZXcoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZUJ1ZmZlclZpZXciICkgKTsKKyAgICAgIHZrQ3JlYXRlQ29tbWFuZFBvb2wgPSBQRk5fdmtDcmVhdGVDb21tYW5kUG9vbCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlQ29tbWFuZFBvb2wiICkgKTsKKyAgICAgIHZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyA9IFBGTl92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiICkgKTsKKyAgICAgIHZrQ3JlYXRlRGVzY3JpcHRvclBvb2wgPSBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiICkgKTsKKyAgICAgIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCA9IFBGTl92a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiICkgKTsKKyAgICAgIHZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiICkgKTsKKyAgICAgIHZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSID0gUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiICkgKTsKKyAgICAgIHZrQ3JlYXRlRXZlbnQgPSBQRk5fdmtDcmVhdGVFdmVudCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlRXZlbnQiICkgKTsKKyAgICAgIHZrQ3JlYXRlRmVuY2UgPSBQRk5fdmtDcmVhdGVGZW5jZSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlRmVuY2UiICkgKTsKKyAgICAgIHZrQ3JlYXRlRnJhbWVidWZmZXIgPSBQRk5fdmtDcmVhdGVGcmFtZWJ1ZmZlciggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlRnJhbWVidWZmZXIiICkgKTsKKyAgICAgIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgPSBQRk5fdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiICkgKTsKKyAgICAgIHZrQ3JlYXRlSW1hZ2UgPSBQRk5fdmtDcmVhdGVJbWFnZSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlSW1hZ2UiICkgKTsKKyAgICAgIHZrQ3JlYXRlSW1hZ2VWaWV3ID0gUEZOX3ZrQ3JlYXRlSW1hZ2VWaWV3KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVJbWFnZVZpZXciICkgKTsKKyAgICAgIHZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IFBGTl92a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiICkgKTsKKyAgICAgIHZrQ3JlYXRlT2JqZWN0VGFibGVOVlggPSBQRk5fdmtDcmVhdGVPYmplY3RUYWJsZU5WWCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiICkgKTsKKyAgICAgIHZrQ3JlYXRlUGlwZWxpbmVDYWNoZSA9IFBGTl92a0NyZWF0ZVBpcGVsaW5lQ2FjaGUoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiICkgKTsKKyAgICAgIHZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQgPSBQRk5fdmtDcmVhdGVQaXBlbGluZUxheW91dCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiICkgKTsKKyAgICAgIHZrQ3JlYXRlUXVlcnlQb29sID0gUEZOX3ZrQ3JlYXRlUXVlcnlQb29sKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVRdWVyeVBvb2wiICkgKTsKKyAgICAgIHZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WID0gUEZOX3ZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiICkgKTsKKyAgICAgIHZrQ3JlYXRlUmVuZGVyUGFzcyA9IFBGTl92a0NyZWF0ZVJlbmRlclBhc3MoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVJlbmRlclBhc3MiICkgKTsKKyAgICAgIHZrQ3JlYXRlUmVuZGVyUGFzczJLSFIgPSBQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiICkgKTsKKyAgICAgIHZrQ3JlYXRlU2FtcGxlciA9IFBGTl92a0NyZWF0ZVNhbXBsZXIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVNhbXBsZXIiICkgKTsKKyAgICAgIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiA9IFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iICkgKTsKKyAgICAgIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiA9IFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiICkgKTsKKyAgICAgIHZrQ3JlYXRlU2VtYXBob3JlID0gUEZOX3ZrQ3JlYXRlU2VtYXBob3JlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVTZW1hcGhvcmUiICkgKTsKKyAgICAgIHZrQ3JlYXRlU2hhZGVyTW9kdWxlID0gUEZOX3ZrQ3JlYXRlU2hhZGVyTW9kdWxlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVTaGFkZXJNb2R1bGUiICkgKTsKKyAgICAgIHZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiA9IFBGTl92a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiICkgKTsKKyAgICAgIHZrQ3JlYXRlU3dhcGNoYWluS0hSID0gUEZOX3ZrQ3JlYXRlU3dhcGNoYWluS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVTd2FwY2hhaW5LSFIiICkgKTsKKyAgICAgIHZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUID0gUEZOX3ZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQiICkgKTsKKyAgICAgIHZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUID0gUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiICkgKTsKKyAgICAgIHZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQgPSBQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiICkgKTsKKyAgICAgIHZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gUEZOX3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiICkgKTsKKyAgICAgIHZrRGVzdHJveUJ1ZmZlciA9IFBGTl92a0Rlc3Ryb3lCdWZmZXIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lCdWZmZXIiICkgKTsKKyAgICAgIHZrRGVzdHJveUJ1ZmZlclZpZXcgPSBQRk5fdmtEZXN0cm95QnVmZmVyVmlldyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVzdHJveUJ1ZmZlclZpZXciICkgKTsKKyAgICAgIHZrRGVzdHJveUNvbW1hbmRQb29sID0gUEZOX3ZrRGVzdHJveUNvbW1hbmRQb29sKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95Q29tbWFuZFBvb2wiICkgKTsKKyAgICAgIHZrRGVzdHJveURlc2NyaXB0b3JQb29sID0gUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JQb29sKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95RGVzY3JpcHRvclBvb2wiICkgKTsKKyAgICAgIHZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQgPSBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiICkgKTsKKyAgICAgIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiICkgKTsKKyAgICAgIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiICkgKTsKKyAgICAgIHZrRGVzdHJveURldmljZSA9IFBGTl92a0Rlc3Ryb3lEZXZpY2UoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lEZXZpY2UiICkgKTsKKyAgICAgIHZrRGVzdHJveUV2ZW50ID0gUEZOX3ZrRGVzdHJveUV2ZW50KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95RXZlbnQiICkgKTsKKyAgICAgIHZrRGVzdHJveUZlbmNlID0gUEZOX3ZrRGVzdHJveUZlbmNlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95RmVuY2UiICkgKTsKKyAgICAgIHZrRGVzdHJveUZyYW1lYnVmZmVyID0gUEZOX3ZrRGVzdHJveUZyYW1lYnVmZmVyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95RnJhbWVidWZmZXIiICkgKTsKKyAgICAgIHZrRGVzdHJveUltYWdlID0gUEZOX3ZrRGVzdHJveUltYWdlKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95SW1hZ2UiICkgKTsKKyAgICAgIHZrRGVzdHJveUltYWdlVmlldyA9IFBGTl92a0Rlc3Ryb3lJbWFnZVZpZXcoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lJbWFnZVZpZXciICkgKTsKKyAgICAgIHZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggPSBQRk5fdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiICkgKTsKKyAgICAgIHZrRGVzdHJveU9iamVjdFRhYmxlTlZYID0gUEZOX3ZrRGVzdHJveU9iamVjdFRhYmxlTlZYKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95T2JqZWN0VGFibGVOVlgiICkgKTsKKyAgICAgIHZrRGVzdHJveVBpcGVsaW5lID0gUEZOX3ZrRGVzdHJveVBpcGVsaW5lKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95UGlwZWxpbmUiICkgKTsKKyAgICAgIHZrRGVzdHJveVBpcGVsaW5lQ2FjaGUgPSBQRk5fdmtEZXN0cm95UGlwZWxpbmVDYWNoZSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVzdHJveVBpcGVsaW5lQ2FjaGUiICkgKTsKKyAgICAgIHZrRGVzdHJveVBpcGVsaW5lTGF5b3V0ID0gUEZOX3ZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtEZXN0cm95UGlwZWxpbmVMYXlvdXQiICkgKTsKKyAgICAgIHZrRGVzdHJveVF1ZXJ5UG9vbCA9IFBGTl92a0Rlc3Ryb3lRdWVyeVBvb2woIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lRdWVyeVBvb2wiICkgKTsKKyAgICAgIHZrRGVzdHJveVJlbmRlclBhc3MgPSBQRk5fdmtEZXN0cm95UmVuZGVyUGFzcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVzdHJveVJlbmRlclBhc3MiICkgKTsKKyAgICAgIHZrRGVzdHJveVNhbXBsZXIgPSBQRk5fdmtEZXN0cm95U2FtcGxlciggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVzdHJveVNhbXBsZXIiICkgKTsKKyAgICAgIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24gPSBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iICkgKTsKKyAgICAgIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPSBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiICkgKTsKKyAgICAgIHZrRGVzdHJveVNlbWFwaG9yZSA9IFBGTl92a0Rlc3Ryb3lTZW1hcGhvcmUoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lTZW1hcGhvcmUiICkgKTsKKyAgICAgIHZrRGVzdHJveVNoYWRlck1vZHVsZSA9IFBGTl92a0Rlc3Ryb3lTaGFkZXJNb2R1bGUoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUiICkgKTsKKyAgICAgIHZrRGVzdHJveVN3YXBjaGFpbktIUiA9IFBGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIiICkgKTsKKyAgICAgIHZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCA9IFBGTl92a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQiICkgKTsKKyAgICAgIHZrRGV2aWNlV2FpdElkbGUgPSBQRk5fdmtEZXZpY2VXYWl0SWRsZSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRGV2aWNlV2FpdElkbGUiICkgKTsKKyAgICAgIHZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCA9IFBGTl92a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiICkgKTsKKyAgICAgIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgPSBQRk5fdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiICkgKTsKKyAgICAgIHZrRnJlZUNvbW1hbmRCdWZmZXJzID0gUEZOX3ZrRnJlZUNvbW1hbmRCdWZmZXJzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtGcmVlQ29tbWFuZEJ1ZmZlcnMiICkgKTsKKyAgICAgIHZrRnJlZURlc2NyaXB0b3JTZXRzID0gUEZOX3ZrRnJlZURlc2NyaXB0b3JTZXRzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtGcmVlRGVzY3JpcHRvclNldHMiICkgKTsKKyAgICAgIHZrRnJlZU1lbW9yeSA9IFBGTl92a0ZyZWVNZW1vcnkoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0ZyZWVNZW1vcnkiICkgKTsKKyAgICAgIHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYgPSBQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYiICkgKTsKKyAgICAgIHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgPSBQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiICkgKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICAgIHZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgPSBQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisgICAgICB2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQgPSBQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIiApICk7CisgICAgICB2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIgPSBQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIiApICk7CisgICAgICB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyA9IFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIiApICk7CisgICAgICB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIgPSBQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIiApICk7CisgICAgICB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSBQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiApICk7CisgICAgICB2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSID0gUEZOX3ZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIiApICk7CisgICAgICB2a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUID0gUEZOX3ZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUIiApICk7CisgICAgICB2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0ID0gUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IiApICk7CisgICAgICB2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSID0gUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIiApICk7CisgICAgICB2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzID0gUEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzIiApICk7CisgICAgICB2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSID0gUEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSIiApICk7CisgICAgICB2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9IFBGTl92a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUID0gUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIgKSApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgICAgICB2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiA9IFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiApICk7CisgICAgICB2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQgPSBQRk5fdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IiApICk7CisgICAgICB2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSID0gUEZOX3ZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIiApICk7CisgICAgICB2a0dldERldmljZVByb2NBZGRyID0gUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERldmljZVByb2NBZGRyIiApICk7CisgICAgICB2a0dldERldmljZVF1ZXVlID0gUEZOX3ZrR2V0RGV2aWNlUXVldWUoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldERldmljZVF1ZXVlIiApICk7CisgICAgICB2a0dldERldmljZVF1ZXVlMiA9IFBGTl92a0dldERldmljZVF1ZXVlMiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0RGV2aWNlUXVldWUyIiApICk7CisgICAgICB2a0dldEV2ZW50U3RhdHVzID0gUEZOX3ZrR2V0RXZlbnRTdGF0dXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldEV2ZW50U3RhdHVzIiApICk7CisgICAgICB2a0dldEZlbmNlRmRLSFIgPSBQRk5fdmtHZXRGZW5jZUZkS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRGZW5jZUZkS0hSIiApICk7CisgICAgICB2a0dldEZlbmNlU3RhdHVzID0gUEZOX3ZrR2V0RmVuY2VTdGF0dXMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldEZlbmNlU3RhdHVzIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSID0gUEZOX3ZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIgKSApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgICAgICB2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUID0gUEZOX3ZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIiApICk7CisgICAgICB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzID0gUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIiApICk7CisgICAgICB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiA9IFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIiApICk7CisgICAgICB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiApICk7CisgICAgICB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzID0gUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzIiApICk7CisgICAgICB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiA9IFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIiApICk7CisgICAgICB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiApICk7CisgICAgICB2a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQgPSBQRk5fdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0IiApICk7CisgICAgICB2a0dldEltYWdlVmlld0hhbmRsZU5WWCA9IFBGTl92a0dldEltYWdlVmlld0hhbmRsZU5WWCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgICB2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQgPSBQRk5fdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIqLworICAgICAgdmtHZXRNZW1vcnlGZEtIUiA9IFBGTl92a0dldE1lbW9yeUZkS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRNZW1vcnlGZEtIUiIgKSApOworICAgICAgdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIgPSBQRk5fdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgPSBQRk5fdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIgPSBQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViA9IFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSID0gUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgICAgdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFID0gUEZOX3ZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSIgKSApOworICAgICAgdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMID0gUEZOX3ZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIgKSApOworICAgICAgdmtHZXRQaXBlbGluZUNhY2hlRGF0YSA9IFBGTl92a0dldFBpcGVsaW5lQ2FjaGVEYXRhKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaXBlbGluZUNhY2hlRGF0YSIgKSApOworICAgICAgdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiA9IFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIgKSApOworICAgICAgdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSID0gUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSID0gUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiIgKSApOworICAgICAgdmtHZXRRdWVyeVBvb2xSZXN1bHRzID0gUEZOX3ZrR2V0UXVlcnlQb29sUmVzdWx0cyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0UXVlcnlQb29sUmVzdWx0cyIgKSApOworICAgICAgdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYgPSBQRk5fdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViIgKSApOworICAgICAgdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSA9IFBGTl92a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSIgKSApOworICAgICAgdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkgPSBQRk5fdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSIgKSApOworICAgICAgdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIgPSBQRk5fdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiIgKSApOworICAgICAgdmtHZXRTZW1hcGhvcmVGZEtIUiA9IFBGTl92a0dldFNlbWFwaG9yZUZkS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtHZXRTZW1hcGhvcmVGZEtIUiIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSBQRk5fdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgICAgdmtHZXRTaGFkZXJJbmZvQU1EID0gUEZOX3ZrR2V0U2hhZGVySW5mb0FNRCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0U2hhZGVySW5mb0FNRCIgKSApOworICAgICAgdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUID0gUEZOX3ZrR2V0U3dhcGNoYWluQ291bnRlckVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0U3dhcGNoYWluQ291bnRlckVYVCIgKSApOworICAgICAgdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIgPSBQRk5fdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIgKSApOworICAgICAgdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIgPSBQRk5fdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFN3YXBjaGFpblN0YXR1c0tIUiIgKSApOworICAgICAgdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUID0gUEZOX3ZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCIgKSApOworICAgICAgdmtJbXBvcnRGZW5jZUZkS0hSID0gUEZOX3ZrSW1wb3J0RmVuY2VGZEtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrSW1wb3J0RmVuY2VGZEtIUiIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiA9IFBGTl92a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgICAgdmtJbXBvcnRTZW1hcGhvcmVGZEtIUiA9IFBGTl92a0ltcG9ydFNlbWFwaG9yZUZkS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtJbXBvcnRTZW1hcGhvcmVGZEtIUiIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSBQRk5fdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgICAgdmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IFBGTl92a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIgKSApOworICAgICAgdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzID0gUEZOX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIgKSApOworICAgICAgdmtNYXBNZW1vcnkgPSBQRk5fdmtNYXBNZW1vcnkoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a01hcE1lbW9yeSIgKSApOworICAgICAgdmtNZXJnZVBpcGVsaW5lQ2FjaGVzID0gUEZOX3ZrTWVyZ2VQaXBlbGluZUNhY2hlcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrTWVyZ2VQaXBlbGluZUNhY2hlcyIgKSApOworICAgICAgdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQgPSBQRk5fdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCIgKSApOworICAgICAgdmtSZWdpc3RlckRldmljZUV2ZW50RVhUID0gUEZOX3ZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIgKSApOworICAgICAgdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCA9IFBGTl92a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIgKSApOworICAgICAgdmtSZWdpc3Rlck9iamVjdHNOVlggPSBQRk5fdmtSZWdpc3Rlck9iamVjdHNOVlgoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a1JlZ2lzdGVyT2JqZWN0c05WWCIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUID0gUEZOX3ZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgICAgdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSBQRk5fdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIgKSApOworICAgICAgdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiA9IFBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiIgKSApOworICAgICAgdmtSZXNldENvbW1hbmRQb29sID0gUEZOX3ZrUmVzZXRDb21tYW5kUG9vbCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrUmVzZXRDb21tYW5kUG9vbCIgKSApOworICAgICAgdmtSZXNldERlc2NyaXB0b3JQb29sID0gUEZOX3ZrUmVzZXREZXNjcmlwdG9yUG9vbCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrUmVzZXREZXNjcmlwdG9yUG9vbCIgKSApOworICAgICAgdmtSZXNldEV2ZW50ID0gUEZOX3ZrUmVzZXRFdmVudCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrUmVzZXRFdmVudCIgKSApOworICAgICAgdmtSZXNldEZlbmNlcyA9IFBGTl92a1Jlc2V0RmVuY2VzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtSZXNldEZlbmNlcyIgKSApOworICAgICAgdmtSZXNldFF1ZXJ5UG9vbEVYVCA9IFBGTl92a1Jlc2V0UXVlcnlQb29sRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtSZXNldFF1ZXJ5UG9vbEVYVCIgKSApOworICAgICAgdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCA9IFBGTl92a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCIgKSApOworICAgICAgdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUID0gUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCIgKSApOworICAgICAgdmtTZXRFdmVudCA9IFBGTl92a1NldEV2ZW50KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtTZXRFdmVudCIgKSApOworICAgICAgdmtTZXRIZHJNZXRhZGF0YUVYVCA9IFBGTl92a1NldEhkck1ldGFkYXRhRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtTZXRIZHJNZXRhZGF0YUVYVCIgKSApOworICAgICAgdmtTZXRMb2NhbERpbW1pbmdBTUQgPSBQRk5fdmtTZXRMb2NhbERpbW1pbmdBTUQoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a1NldExvY2FsRGltbWluZ0FNRCIgKSApOworICAgICAgdmtTaWduYWxTZW1hcGhvcmVLSFIgPSBQRk5fdmtTaWduYWxTZW1hcGhvcmVLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a1NpZ25hbFNlbWFwaG9yZUtIUiIgKSApOworICAgICAgdmtUcmltQ29tbWFuZFBvb2wgPSBQRk5fdmtUcmltQ29tbWFuZFBvb2woIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a1RyaW1Db21tYW5kUG9vbCIgKSApOworICAgICAgdmtUcmltQ29tbWFuZFBvb2xLSFIgPSBQRk5fdmtUcmltQ29tbWFuZFBvb2xLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a1RyaW1Db21tYW5kUG9vbEtIUiIgKSApOworICAgICAgdmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMID0gUEZOX3ZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIgKSApOworICAgICAgdmtVbm1hcE1lbW9yeSA9IFBGTl92a1VubWFwTWVtb3J5KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtVbm1hcE1lbW9yeSIgKSApOworICAgICAgdmtVbnJlZ2lzdGVyT2JqZWN0c05WWCA9IFBGTl92a1VucmVnaXN0ZXJPYmplY3RzTlZYKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtVbnJlZ2lzdGVyT2JqZWN0c05WWCIgKSApOworICAgICAgdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlID0gUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSIgKSApOworICAgICAgdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0gUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIgKSApOworICAgICAgdmtVcGRhdGVEZXNjcmlwdG9yU2V0cyA9IFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtVcGRhdGVEZXNjcmlwdG9yU2V0cyIgKSApOworICAgICAgdmtXYWl0Rm9yRmVuY2VzID0gUEZOX3ZrV2FpdEZvckZlbmNlcyggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrV2FpdEZvckZlbmNlcyIgKSApOworICAgICAgdmtXYWl0U2VtYXBob3Jlc0tIUiA9IFBGTl92a1dhaXRTZW1hcGhvcmVzS0hSKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtXYWl0U2VtYXBob3Jlc0tIUiIgKSApOworICAgICAgdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYgPSBQRk5fdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViIgKSApOworICAgICAgdmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUID0gUEZOX3ZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIgKSApOworICAgICAgdmtRdWV1ZUJpbmRTcGFyc2UgPSBQRk5fdmtRdWV1ZUJpbmRTcGFyc2UoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a1F1ZXVlQmluZFNwYXJzZSIgKSApOworICAgICAgdmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCA9IFBGTl92a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCIgKSApOworICAgICAgdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCA9IFBGTl92a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIgKSApOworICAgICAgdmtRdWV1ZVByZXNlbnRLSFIgPSBQRk5fdmtRdWV1ZVByZXNlbnRLSFIoIHZrR2V0SW5zdGFuY2VQcm9jQWRkciggaW5zdGFuY2UsICJ2a1F1ZXVlUHJlc2VudEtIUiIgKSApOworICAgICAgdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID0gUEZOX3ZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIgKSApOworICAgICAgdmtRdWV1ZVN1Ym1pdCA9IFBGTl92a1F1ZXVlU3VibWl0KCB2a0dldEluc3RhbmNlUHJvY0FkZHIoIGluc3RhbmNlLCAidmtRdWV1ZVN1Ym1pdCIgKSApOworICAgICAgdmtRdWV1ZVdhaXRJZGxlID0gUEZOX3ZrUXVldWVXYWl0SWRsZSggdmtHZXRJbnN0YW5jZVByb2NBZGRyKCBpbnN0YW5jZSwgInZrUXVldWVXYWl0SWRsZSIgKSApOworICAgIH0KKworICAgIHZvaWQgaW5pdCggVlVMS0FOX0hQUF9OQU1FU1BBQ0U6OkRldmljZSBkZXZpY2VDcHAgKSBWVUxLQU5fSFBQX05PRVhDRVBUCisgICAgeworICAgICAgVmtEZXZpY2UgZGV2aWNlID0gc3RhdGljX2Nhc3Q8VmtEZXZpY2U+KGRldmljZUNwcCk7CisgICAgICB2a0JlZ2luQ29tbWFuZEJ1ZmZlciA9IFBGTl92a0JlZ2luQ29tbWFuZEJ1ZmZlciggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtCZWdpbkNvbW1hbmRCdWZmZXIiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IFBGTl92a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCIgKSApOworICAgICAgdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCA9IFBGTl92a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIiApICk7CisgICAgICB2a0NtZEJlZ2luUXVlcnkgPSBQRk5fdmtDbWRCZWdpblF1ZXJ5KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEJlZ2luUXVlcnkiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQgPSBQRk5fdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCIgKSApOworICAgICAgdmtDbWRCZWdpblJlbmRlclBhc3MgPSBQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQmVnaW5SZW5kZXJQYXNzIiApICk7CisgICAgICB2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIgPSBQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiICkgKTsKKyAgICAgIHZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCA9IFBGTl92a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCIgKSApOworICAgICAgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMgPSBQRk5fdmtDbWRCaW5kRGVzY3JpcHRvclNldHMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQmluZERlc2NyaXB0b3JTZXRzIiApICk7CisgICAgICB2a0NtZEJpbmRJbmRleEJ1ZmZlciA9IFBGTl92a0NtZEJpbmRJbmRleEJ1ZmZlciggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRCaW5kSW5kZXhCdWZmZXIiICkgKTsKKyAgICAgIHZrQ21kQmluZFBpcGVsaW5lID0gUEZOX3ZrQ21kQmluZFBpcGVsaW5lKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEJpbmRQaXBlbGluZSIgKSApOworICAgICAgdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WID0gUEZOX3ZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIiApICk7CisgICAgICB2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQgPSBQRk5fdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQiICkgKTsKKyAgICAgIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnMgPSBQRk5fdmtDbWRCaW5kVmVydGV4QnVmZmVycyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRCaW5kVmVydGV4QnVmZmVycyIgKSApOworICAgICAgdmtDbWRCbGl0SW1hZ2UgPSBQRk5fdmtDbWRCbGl0SW1hZ2UoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQmxpdEltYWdlIiApICk7CisgICAgICB2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSBQRk5fdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiICkgKTsKKyAgICAgIHZrQ21kQ2xlYXJBdHRhY2htZW50cyA9IFBGTl92a0NtZENsZWFyQXR0YWNobWVudHMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQ2xlYXJBdHRhY2htZW50cyIgKSApOworICAgICAgdmtDbWRDbGVhckNvbG9ySW1hZ2UgPSBQRk5fdmtDbWRDbGVhckNvbG9ySW1hZ2UoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQ2xlYXJDb2xvckltYWdlIiApICk7CisgICAgICB2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UgPSBQRk5fdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiICkgKTsKKyAgICAgIHZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gUEZOX3ZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIgKSApOworICAgICAgdmtDbWRDb3B5QnVmZmVyID0gUEZOX3ZrQ21kQ29weUJ1ZmZlciggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRDb3B5QnVmZmVyIiApICk7CisgICAgICB2a0NtZENvcHlCdWZmZXJUb0ltYWdlID0gUEZOX3ZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UiICkgKTsKKyAgICAgIHZrQ21kQ29weUltYWdlID0gUEZOX3ZrQ21kQ29weUltYWdlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZENvcHlJbWFnZSIgKSApOworICAgICAgdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciA9IFBGTl92a0NtZENvcHlJbWFnZVRvQnVmZmVyKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZENvcHlJbWFnZVRvQnVmZmVyIiApICk7CisgICAgICB2a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzID0gUEZOX3ZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMiICkgKTsKKyAgICAgIHZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCA9IFBGTl92a0NtZERlYnVnTWFya2VyQmVnaW5FWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCIgKSApOworICAgICAgdmtDbWREZWJ1Z01hcmtlckVuZEVYVCA9IFBGTl92a0NtZERlYnVnTWFya2VyRW5kRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZERlYnVnTWFya2VyRW5kRVhUIiApICk7CisgICAgICB2a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUID0gUEZOX3ZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiICkgKTsKKyAgICAgIHZrQ21kRGlzcGF0Y2ggPSBQRk5fdmtDbWREaXNwYXRjaCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWREaXNwYXRjaCIgKSApOworICAgICAgdmtDbWREaXNwYXRjaEJhc2UgPSBQRk5fdmtDbWREaXNwYXRjaEJhc2UoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRGlzcGF0Y2hCYXNlIiApICk7CisgICAgICB2a0NtZERpc3BhdGNoQmFzZUtIUiA9IFBGTl92a0NtZERpc3BhdGNoQmFzZUtIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWREaXNwYXRjaEJhc2VLSFIiICkgKTsKKyAgICAgIHZrQ21kRGlzcGF0Y2hJbmRpcmVjdCA9IFBGTl92a0NtZERpc3BhdGNoSW5kaXJlY3QoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRGlzcGF0Y2hJbmRpcmVjdCIgKSApOworICAgICAgdmtDbWREcmF3ID0gUEZOX3ZrQ21kRHJhdyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWREcmF3IiApICk7CisgICAgICB2a0NtZERyYXdJbmRleGVkID0gUEZOX3ZrQ21kRHJhd0luZGV4ZWQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRHJhd0luZGV4ZWQiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCA9IFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3QoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCIgKSApOworICAgICAgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQgPSBQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EIiApICk7CisgICAgICB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiA9IFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGlyZWN0ID0gUEZOX3ZrQ21kRHJhd0luZGlyZWN0KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZERyYXdJbmRpcmVjdCIgKSApOworICAgICAgdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQgPSBQRk5fdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUIiApICk7CisgICAgICB2a0NtZERyYXdJbmRpcmVjdENvdW50QU1EID0gUEZOX3ZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQiICkgKTsKKyAgICAgIHZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIgPSBQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiIgKSApOworICAgICAgdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WID0gUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIiApICk7CisgICAgICB2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WID0gUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYiICkgKTsKKyAgICAgIHZrQ21kRHJhd01lc2hUYXNrc05WID0gUEZOX3ZrQ21kRHJhd01lc2hUYXNrc05WKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZERyYXdNZXNoVGFza3NOViIgKSApOworICAgICAgdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IFBGTl92a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIiApICk7CisgICAgICB2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCA9IFBGTl92a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiICkgKTsKKyAgICAgIHZrQ21kRW5kUXVlcnkgPSBQRk5fdmtDbWRFbmRRdWVyeSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRFbmRRdWVyeSIgKSApOworICAgICAgdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQgPSBQRk5fdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRW5kUXVlcnlJbmRleGVkRVhUIiApICk7CisgICAgICB2a0NtZEVuZFJlbmRlclBhc3MgPSBQRk5fdmtDbWRFbmRSZW5kZXJQYXNzKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEVuZFJlbmRlclBhc3MiICkgKTsKKyAgICAgIHZrQ21kRW5kUmVuZGVyUGFzczJLSFIgPSBQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRFbmRSZW5kZXJQYXNzMktIUiIgKSApOworICAgICAgdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCA9IFBGTl92a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUIiApICk7CisgICAgICB2a0NtZEV4ZWN1dGVDb21tYW5kcyA9IFBGTl92a0NtZEV4ZWN1dGVDb21tYW5kcyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRFeGVjdXRlQ29tbWFuZHMiICkgKTsKKyAgICAgIHZrQ21kRmlsbEJ1ZmZlciA9IFBGTl92a0NtZEZpbGxCdWZmZXIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kRmlsbEJ1ZmZlciIgKSApOworICAgICAgdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgPSBQRk5fdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIiApICk7CisgICAgICB2a0NtZE5leHRTdWJwYXNzID0gUEZOX3ZrQ21kTmV4dFN1YnBhc3MoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kTmV4dFN1YnBhc3MiICkgKTsKKyAgICAgIHZrQ21kTmV4dFN1YnBhc3MyS0hSID0gUEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZE5leHRTdWJwYXNzMktIUiIgKSApOworICAgICAgdmtDbWRQaXBlbGluZUJhcnJpZXIgPSBQRk5fdmtDbWRQaXBlbGluZUJhcnJpZXIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kUGlwZWxpbmVCYXJyaWVyIiApICk7CisgICAgICB2a0NtZFByb2Nlc3NDb21tYW5kc05WWCA9IFBGTl92a0NtZFByb2Nlc3NDb21tYW5kc05WWCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiICkgKTsKKyAgICAgIHZrQ21kUHVzaENvbnN0YW50cyA9IFBGTl92a0NtZFB1c2hDb25zdGFudHMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kUHVzaENvbnN0YW50cyIgKSApOworICAgICAgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiA9IFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIiApICk7CisgICAgICB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0gUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiICkgKTsKKyAgICAgIHZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlggPSBQRk5fdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCIgKSApOworICAgICAgdmtDbWRSZXNldEV2ZW50ID0gUEZOX3ZrQ21kUmVzZXRFdmVudCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRSZXNldEV2ZW50IiApICk7CisgICAgICB2a0NtZFJlc2V0UXVlcnlQb29sID0gUEZOX3ZrQ21kUmVzZXRRdWVyeVBvb2woIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kUmVzZXRRdWVyeVBvb2wiICkgKTsKKyAgICAgIHZrQ21kUmVzb2x2ZUltYWdlID0gUEZOX3ZrQ21kUmVzb2x2ZUltYWdlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFJlc29sdmVJbWFnZSIgKSApOworICAgICAgdmtDbWRTZXRCbGVuZENvbnN0YW50cyA9IFBGTl92a0NtZFNldEJsZW5kQ29uc3RhbnRzKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFNldEJsZW5kQ29uc3RhbnRzIiApICk7CisgICAgICB2a0NtZFNldENoZWNrcG9pbnROViA9IFBGTl92a0NtZFNldENoZWNrcG9pbnROViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXRDaGVja3BvaW50TlYiICkgKTsKKyAgICAgIHZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViA9IFBGTl92a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViIgKSApOworICAgICAgdmtDbWRTZXREZXB0aEJpYXMgPSBQRk5fdmtDbWRTZXREZXB0aEJpYXMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kU2V0RGVwdGhCaWFzIiApICk7CisgICAgICB2a0NtZFNldERlcHRoQm91bmRzID0gUEZOX3ZrQ21kU2V0RGVwdGhCb3VuZHMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kU2V0RGVwdGhCb3VuZHMiICkgKTsKKyAgICAgIHZrQ21kU2V0RGV2aWNlTWFzayA9IFBGTl92a0NtZFNldERldmljZU1hc2soIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kU2V0RGV2aWNlTWFzayIgKSApOworICAgICAgdmtDbWRTZXREZXZpY2VNYXNrS0hSID0gUEZOX3ZrQ21kU2V0RGV2aWNlTWFza0tIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXREZXZpY2VNYXNrS0hSIiApICk7CisgICAgICB2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQgPSBQRk5fdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQiICkgKTsKKyAgICAgIHZrQ21kU2V0RXZlbnQgPSBQRk5fdmtDbWRTZXRFdmVudCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXRFdmVudCIgKSApOworICAgICAgdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYgPSBQRk5fdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WIiApICk7CisgICAgICB2a0NtZFNldExpbmVTdGlwcGxlRVhUID0gUEZOX3ZrQ21kU2V0TGluZVN0aXBwbGVFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kU2V0TGluZVN0aXBwbGVFWFQiICkgKTsKKyAgICAgIHZrQ21kU2V0TGluZVdpZHRoID0gUEZOX3ZrQ21kU2V0TGluZVdpZHRoKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFNldExpbmVXaWR0aCIgKSApOworICAgICAgdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMID0gUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMIiApICk7CisgICAgICB2a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCA9IFBGTl92a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwiICkgKTsKKyAgICAgIHZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCA9IFBGTl92a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCIgKSApOworICAgICAgdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQgPSBQRk5fdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUIiApICk7CisgICAgICB2a0NtZFNldFNjaXNzb3IgPSBQRk5fdmtDbWRTZXRTY2lzc29yKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFNldFNjaXNzb3IiICkgKTsKKyAgICAgIHZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrID0gUEZOX3ZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayIgKSApOworICAgICAgdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlID0gUEZOX3ZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIiApICk7CisgICAgICB2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2sgPSBQRk5fdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2siICkgKTsKKyAgICAgIHZrQ21kU2V0Vmlld3BvcnQgPSBQRk5fdmtDbWRTZXRWaWV3cG9ydCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXRWaWV3cG9ydCIgKSApOworICAgICAgdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WID0gUEZOX3ZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WIiApICk7CisgICAgICB2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViA9IFBGTl92a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYiICkgKTsKKyAgICAgIHZrQ21kVHJhY2VSYXlzTlYgPSBQRk5fdmtDbWRUcmFjZVJheXNOViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDbWRUcmFjZVJheXNOViIgKSApOworICAgICAgdmtDbWRVcGRhdGVCdWZmZXIgPSBQRk5fdmtDbWRVcGRhdGVCdWZmZXIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kVXBkYXRlQnVmZmVyIiApICk7CisgICAgICB2a0NtZFdhaXRFdmVudHMgPSBQRk5fdmtDbWRXYWl0RXZlbnRzKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFdhaXRFdmVudHMiICkgKTsKKyAgICAgIHZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WID0gUEZOX3ZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViIgKSApOworICAgICAgdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCA9IFBGTl92a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EIiApICk7CisgICAgICB2a0NtZFdyaXRlVGltZXN0YW1wID0gUEZOX3ZrQ21kV3JpdGVUaW1lc3RhbXAoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ21kV3JpdGVUaW1lc3RhbXAiICkgKTsKKyAgICAgIHZrRW5kQ29tbWFuZEJ1ZmZlciA9IFBGTl92a0VuZENvbW1hbmRCdWZmZXIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRW5kQ29tbWFuZEJ1ZmZlciIgKSApOworICAgICAgdmtSZXNldENvbW1hbmRCdWZmZXIgPSBQRk5fdmtSZXNldENvbW1hbmRCdWZmZXIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUmVzZXRDb21tYW5kQnVmZmVyIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgPSBQRk5fdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgICAgIHZrQWNxdWlyZU5leHRJbWFnZTJLSFIgPSBQRk5fdmtBY3F1aXJlTmV4dEltYWdlMktIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtBY3F1aXJlTmV4dEltYWdlMktIUiIgKSApOworICAgICAgdmtBY3F1aXJlTmV4dEltYWdlS0hSID0gUEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtBY3F1aXJlTmV4dEltYWdlS0hSIiApICk7CisgICAgICB2a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IFBGTl92a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiICkgKTsKKyAgICAgIHZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgPSBQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIgKSApOworICAgICAgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzID0gUEZOX3ZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzIiApICk7CisgICAgICB2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMgPSBQRk5fdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiICkgKTsKKyAgICAgIHZrQWxsb2NhdGVNZW1vcnkgPSBQRk5fdmtBbGxvY2F0ZU1lbW9yeSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtBbGxvY2F0ZU1lbW9yeSIgKSApOworICAgICAgdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYgPSBQRk5fdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIiApICk7CisgICAgICB2a0JpbmRCdWZmZXJNZW1vcnkgPSBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0JpbmRCdWZmZXJNZW1vcnkiICkgKTsKKyAgICAgIHZrQmluZEJ1ZmZlck1lbW9yeTIgPSBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtCaW5kQnVmZmVyTWVtb3J5MiIgKSApOworICAgICAgdmtCaW5kQnVmZmVyTWVtb3J5MktIUiA9IFBGTl92a0JpbmRCdWZmZXJNZW1vcnkyS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0JpbmRCdWZmZXJNZW1vcnkyS0hSIiApICk7CisgICAgICB2a0JpbmRJbWFnZU1lbW9yeSA9IFBGTl92a0JpbmRJbWFnZU1lbW9yeSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtCaW5kSW1hZ2VNZW1vcnkiICkgKTsKKyAgICAgIHZrQmluZEltYWdlTWVtb3J5MiA9IFBGTl92a0JpbmRJbWFnZU1lbW9yeTIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQmluZEltYWdlTWVtb3J5MiIgKSApOworICAgICAgdmtCaW5kSW1hZ2VNZW1vcnkyS0hSID0gUEZOX3ZrQmluZEltYWdlTWVtb3J5MktIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtCaW5kSW1hZ2VNZW1vcnkyS0hSIiApICk7CisgICAgICB2a0NvbXBpbGVEZWZlcnJlZE5WID0gUEZOX3ZrQ29tcGlsZURlZmVycmVkTlYoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ29tcGlsZURlZmVycmVkTlYiICkgKTsKKyAgICAgIHZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSBQRk5fdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIgKSApOworICAgICAgdmtDcmVhdGVCdWZmZXIgPSBQRk5fdmtDcmVhdGVCdWZmZXIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlQnVmZmVyIiApICk7CisgICAgICB2a0NyZWF0ZUJ1ZmZlclZpZXcgPSBQRk5fdmtDcmVhdGVCdWZmZXJWaWV3KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZUJ1ZmZlclZpZXciICkgKTsKKyAgICAgIHZrQ3JlYXRlQ29tbWFuZFBvb2wgPSBQRk5fdmtDcmVhdGVDb21tYW5kUG9vbCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVDb21tYW5kUG9vbCIgKSApOworICAgICAgdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzID0gUEZOX3ZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIiApICk7CisgICAgICB2a0NyZWF0ZURlc2NyaXB0b3JQb29sID0gUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclBvb2woIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiICkgKTsKKyAgICAgIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCA9IFBGTl92a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCIgKSApOworICAgICAgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiApICk7CisgICAgICB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IFBGTl92a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiICkgKTsKKyAgICAgIHZrQ3JlYXRlRXZlbnQgPSBQRk5fdmtDcmVhdGVFdmVudCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVFdmVudCIgKSApOworICAgICAgdmtDcmVhdGVGZW5jZSA9IFBGTl92a0NyZWF0ZUZlbmNlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZUZlbmNlIiApICk7CisgICAgICB2a0NyZWF0ZUZyYW1lYnVmZmVyID0gUEZOX3ZrQ3JlYXRlRnJhbWVidWZmZXIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlRnJhbWVidWZmZXIiICkgKTsKKyAgICAgIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgPSBQRk5fdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIgKSApOworICAgICAgdmtDcmVhdGVJbWFnZSA9IFBGTl92a0NyZWF0ZUltYWdlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZUltYWdlIiApICk7CisgICAgICB2a0NyZWF0ZUltYWdlVmlldyA9IFBGTl92a0NyZWF0ZUltYWdlVmlldyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVJbWFnZVZpZXciICkgKTsKKyAgICAgIHZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IFBGTl92a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIgKSApOworICAgICAgdmtDcmVhdGVPYmplY3RUYWJsZU5WWCA9IFBGTl92a0NyZWF0ZU9iamVjdFRhYmxlTlZYKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZU9iamVjdFRhYmxlTlZYIiApICk7CisgICAgICB2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUgPSBQRk5fdmtDcmVhdGVQaXBlbGluZUNhY2hlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiICkgKTsKKyAgICAgIHZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQgPSBQRk5fdmtDcmVhdGVQaXBlbGluZUxheW91dCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVQaXBlbGluZUxheW91dCIgKSApOworICAgICAgdmtDcmVhdGVRdWVyeVBvb2wgPSBQRk5fdmtDcmVhdGVRdWVyeVBvb2woIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlUXVlcnlQb29sIiApICk7CisgICAgICB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViA9IFBGTl92a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiICkgKTsKKyAgICAgIHZrQ3JlYXRlUmVuZGVyUGFzcyA9IFBGTl92a0NyZWF0ZVJlbmRlclBhc3MoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlUmVuZGVyUGFzcyIgKSApOworICAgICAgdmtDcmVhdGVSZW5kZXJQYXNzMktIUiA9IFBGTl92a0NyZWF0ZVJlbmRlclBhc3MyS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiApICk7CisgICAgICB2a0NyZWF0ZVNhbXBsZXIgPSBQRk5fdmtDcmVhdGVTYW1wbGVyKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZVNhbXBsZXIiICkgKTsKKyAgICAgIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiA9IFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIgKSApOworICAgICAgdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiApICk7CisgICAgICB2a0NyZWF0ZVNlbWFwaG9yZSA9IFBGTl92a0NyZWF0ZVNlbWFwaG9yZSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVTZW1hcGhvcmUiICkgKTsKKyAgICAgIHZrQ3JlYXRlU2hhZGVyTW9kdWxlID0gUEZOX3ZrQ3JlYXRlU2hhZGVyTW9kdWxlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIgKSApOworICAgICAgdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSID0gUEZOX3ZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiApICk7CisgICAgICB2a0NyZWF0ZVN3YXBjaGFpbktIUiA9IFBGTl92a0NyZWF0ZVN3YXBjaGFpbktIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtDcmVhdGVTd2FwY2hhaW5LSFIiICkgKTsKKyAgICAgIHZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUID0gUEZOX3ZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCIgKSApOworICAgICAgdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQgPSBQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIiApICk7CisgICAgICB2a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUID0gUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiICkgKTsKKyAgICAgIHZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gUEZOX3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIgKSApOworICAgICAgdmtEZXN0cm95QnVmZmVyID0gUEZOX3ZrRGVzdHJveUJ1ZmZlciggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtEZXN0cm95QnVmZmVyIiApICk7CisgICAgICB2a0Rlc3Ryb3lCdWZmZXJWaWV3ID0gUEZOX3ZrRGVzdHJveUJ1ZmZlclZpZXcoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveUJ1ZmZlclZpZXciICkgKTsKKyAgICAgIHZrRGVzdHJveUNvbW1hbmRQb29sID0gUEZOX3ZrRGVzdHJveUNvbW1hbmRQb29sKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lDb21tYW5kUG9vbCIgKSApOworICAgICAgdmtEZXN0cm95RGVzY3JpcHRvclBvb2wgPSBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclBvb2woIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveURlc2NyaXB0b3JQb29sIiApICk7CisgICAgICB2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0ID0gUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiICkgKTsKKyAgICAgIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIgKSApOworICAgICAgdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSID0gUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIiApICk7CisgICAgICB2a0Rlc3Ryb3lEZXZpY2UgPSBQRk5fdmtEZXN0cm95RGV2aWNlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lEZXZpY2UiICkgKTsKKyAgICAgIHZrRGVzdHJveUV2ZW50ID0gUEZOX3ZrRGVzdHJveUV2ZW50KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lFdmVudCIgKSApOworICAgICAgdmtEZXN0cm95RmVuY2UgPSBQRk5fdmtEZXN0cm95RmVuY2UoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveUZlbmNlIiApICk7CisgICAgICB2a0Rlc3Ryb3lGcmFtZWJ1ZmZlciA9IFBGTl92a0Rlc3Ryb3lGcmFtZWJ1ZmZlciggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtEZXN0cm95RnJhbWVidWZmZXIiICkgKTsKKyAgICAgIHZrRGVzdHJveUltYWdlID0gUEZOX3ZrRGVzdHJveUltYWdlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lJbWFnZSIgKSApOworICAgICAgdmtEZXN0cm95SW1hZ2VWaWV3ID0gUEZOX3ZrRGVzdHJveUltYWdlVmlldyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtEZXN0cm95SW1hZ2VWaWV3IiApICk7CisgICAgICB2a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID0gUEZOX3ZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiICkgKTsKKyAgICAgIHZrRGVzdHJveU9iamVjdFRhYmxlTlZYID0gUEZOX3ZrRGVzdHJveU9iamVjdFRhYmxlTlZYKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCIgKSApOworICAgICAgdmtEZXN0cm95UGlwZWxpbmUgPSBQRk5fdmtEZXN0cm95UGlwZWxpbmUoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveVBpcGVsaW5lIiApICk7CisgICAgICB2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlID0gUEZOX3ZrRGVzdHJveVBpcGVsaW5lQ2FjaGUoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveVBpcGVsaW5lQ2FjaGUiICkgKTsKKyAgICAgIHZrRGVzdHJveVBpcGVsaW5lTGF5b3V0ID0gUEZOX3ZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lQaXBlbGluZUxheW91dCIgKSApOworICAgICAgdmtEZXN0cm95UXVlcnlQb29sID0gUEZOX3ZrRGVzdHJveVF1ZXJ5UG9vbCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtEZXN0cm95UXVlcnlQb29sIiApICk7CisgICAgICB2a0Rlc3Ryb3lSZW5kZXJQYXNzID0gUEZOX3ZrRGVzdHJveVJlbmRlclBhc3MoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveVJlbmRlclBhc3MiICkgKTsKKyAgICAgIHZrRGVzdHJveVNhbXBsZXIgPSBQRk5fdmtEZXN0cm95U2FtcGxlciggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtEZXN0cm95U2FtcGxlciIgKSApOworICAgICAgdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiA9IFBGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiApICk7CisgICAgICB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiICkgKTsKKyAgICAgIHZrRGVzdHJveVNlbWFwaG9yZSA9IFBGTl92a0Rlc3Ryb3lTZW1hcGhvcmUoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveVNlbWFwaG9yZSIgKSApOworICAgICAgdmtEZXN0cm95U2hhZGVyTW9kdWxlID0gUEZOX3ZrRGVzdHJveVNoYWRlck1vZHVsZSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtEZXN0cm95U2hhZGVyTW9kdWxlIiApICk7CisgICAgICB2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIgPSBQRk5fdmtEZXN0cm95U3dhcGNoYWluS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIiICkgKTsKKyAgICAgIHZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCA9IFBGTl92a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCIgKSApOworICAgICAgdmtEZXZpY2VXYWl0SWRsZSA9IFBGTl92a0RldmljZVdhaXRJZGxlKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0RldmljZVdhaXRJZGxlIiApICk7CisgICAgICB2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQgPSBQRk5fdmtEaXNwbGF5UG93ZXJDb250cm9sRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiICkgKTsKKyAgICAgIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgPSBQRk5fdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyIgKSApOworICAgICAgdmtGcmVlQ29tbWFuZEJ1ZmZlcnMgPSBQRk5fdmtGcmVlQ29tbWFuZEJ1ZmZlcnMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRnJlZUNvbW1hbmRCdWZmZXJzIiApICk7CisgICAgICB2a0ZyZWVEZXNjcmlwdG9yU2V0cyA9IFBGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtGcmVlRGVzY3JpcHRvclNldHMiICkgKTsKKyAgICAgIHZrRnJlZU1lbW9yeSA9IFBGTl92a0ZyZWVNZW1vcnkoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrRnJlZU1lbW9yeSIgKSApOworICAgICAgdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViA9IFBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIiApICk7CisgICAgICB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WID0gUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiICkgKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICAgIHZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgPSBQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCIgKSApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKi8KKyAgICAgIHZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCA9IFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIgKSApOworICAgICAgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSID0gUEZOX3ZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIiApICk7CisgICAgICB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyA9IFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMiICkgKTsKKyAgICAgIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiA9IFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiIgKSApOworICAgICAgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSID0gUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiApICk7CisgICAgICB2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSID0gUEZOX3ZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiICkgKTsKKyAgICAgIHZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQgPSBQRk5fdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCIgKSApOworICAgICAgdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCA9IFBGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IiApICk7CisgICAgICB2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSID0gUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiICkgKTsKKyAgICAgIHZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMgPSBQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIgKSApOworICAgICAgdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiA9IFBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSIiApICk7CisgICAgICB2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9IFBGTl92a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiICkgKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICB2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgPSBQRk5fdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgICAgdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIgPSBQRk5fdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiApICk7CisgICAgICB2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQgPSBQRk5fdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQiICkgKTsKKyAgICAgIHZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgPSBQRk5fdmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiIgKSApOworICAgICAgdmtHZXREZXZpY2VQcm9jQWRkciA9IFBGTl92a0dldERldmljZVByb2NBZGRyKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldERldmljZVByb2NBZGRyIiApICk7CisgICAgICB2a0dldERldmljZVF1ZXVlID0gUEZOX3ZrR2V0RGV2aWNlUXVldWUoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0RGV2aWNlUXVldWUiICkgKTsKKyAgICAgIHZrR2V0RGV2aWNlUXVldWUyID0gUEZOX3ZrR2V0RGV2aWNlUXVldWUyKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldERldmljZVF1ZXVlMiIgKSApOworICAgICAgdmtHZXRFdmVudFN0YXR1cyA9IFBGTl92a0dldEV2ZW50U3RhdHVzKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldEV2ZW50U3RhdHVzIiApICk7CisgICAgICB2a0dldEZlbmNlRmRLSFIgPSBQRk5fdmtHZXRGZW5jZUZkS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldEZlbmNlRmRLSFIiICkgKTsKKyAgICAgIHZrR2V0RmVuY2VTdGF0dXMgPSBQRk5fdmtHZXRGZW5jZVN0YXR1cyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRGZW5jZVN0YXR1cyIgKSApOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiA9IFBGTl92a0dldEZlbmNlV2luMzJIYW5kbGVLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIgKSApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgICAgICB2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUID0gUEZOX3ZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiICkgKTsKKyAgICAgIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgPSBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyIgKSApOworICAgICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgPSBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIiApICk7CisgICAgICB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiICkgKTsKKyAgICAgIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgPSBQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyIgKSApOworICAgICAgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIgPSBQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIiApICk7CisgICAgICB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiICkgKTsKKyAgICAgIHZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCA9IFBGTl92a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIgKSApOworICAgICAgdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlggPSBQRk5fdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgICB2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQgPSBQRk5fdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiovCisgICAgICB2a0dldE1lbW9yeUZkS0hSID0gUEZOX3ZrR2V0TWVtb3J5RmRLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0TWVtb3J5RmRLSFIiICkgKTsKKyAgICAgIHZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSID0gUEZOX3ZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgPSBQRk5fdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiA9IFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICB2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYgPSBQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgIHZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSID0gUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiIgKSApOworI2VuZGlmIC8qVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiovCisgICAgICB2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgPSBQRk5fdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiICkgKTsKKyAgICAgIHZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCA9IFBGTl92a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIgKSApOworICAgICAgdmtHZXRQaXBlbGluZUNhY2hlRGF0YSA9IFBGTl92a0dldFBpcGVsaW5lQ2FjaGVEYXRhKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFBpcGVsaW5lQ2FjaGVEYXRhIiApICk7CisgICAgICB2a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSID0gUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIiICkgKTsKKyAgICAgIHZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiA9IFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiIgKSApOworICAgICAgdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSID0gUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIiApICk7CisgICAgICB2a0dldFF1ZXJ5UG9vbFJlc3VsdHMgPSBQRk5fdmtHZXRRdWVyeVBvb2xSZXN1bHRzKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFF1ZXJ5UG9vbFJlc3VsdHMiICkgKTsKKyAgICAgIHZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WID0gUEZOX3ZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViIgKSApOworICAgICAgdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSA9IFBGTl92a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIiApICk7CisgICAgICB2a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSA9IFBGTl92a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiICkgKTsKKyAgICAgIHZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSID0gUEZOX3ZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiIgKSApOworICAgICAgdmtHZXRTZW1hcGhvcmVGZEtIUiA9IFBGTl92a0dldFNlbWFwaG9yZUZkS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFNlbWFwaG9yZUZkS0hSIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiA9IFBGTl92a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgICAgIHZrR2V0U2hhZGVySW5mb0FNRCA9IFBGTl92a0dldFNoYWRlckluZm9BTUQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrR2V0U2hhZGVySW5mb0FNRCIgKSApOworICAgICAgdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUID0gUEZOX3ZrR2V0U3dhcGNoYWluQ291bnRlckVYVCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIiApICk7CisgICAgICB2a0dldFN3YXBjaGFpbkltYWdlc0tIUiA9IFBGTl92a0dldFN3YXBjaGFpbkltYWdlc0tIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIiICkgKTsKKyAgICAgIHZrR2V0U3dhcGNoYWluU3RhdHVzS0hSID0gUEZOX3ZrR2V0U3dhcGNoYWluU3RhdHVzS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0dldFN3YXBjaGFpblN0YXR1c0tIUiIgKSApOworICAgICAgdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUID0gUEZOX3ZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIiApICk7CisgICAgICB2a0ltcG9ydEZlbmNlRmRLSFIgPSBQRk5fdmtJbXBvcnRGZW5jZUZkS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0ltcG9ydEZlbmNlRmRLSFIiICkgKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICB2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIgPSBQRk5fdmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIiICkgKTsKKyNlbmRpZiAvKlZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIqLworICAgICAgdmtJbXBvcnRTZW1hcGhvcmVGZEtIUiA9IFBGTl92a0ltcG9ydFNlbWFwaG9yZUZkS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0ltcG9ydFNlbWFwaG9yZUZkS0hSIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiA9IFBGTl92a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgICAgIHZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwgPSBQRk5fdmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIgKSApOworICAgICAgdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzID0gUEZOX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIiApICk7CisgICAgICB2a01hcE1lbW9yeSA9IFBGTl92a01hcE1lbW9yeSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtNYXBNZW1vcnkiICkgKTsKKyAgICAgIHZrTWVyZ2VQaXBlbGluZUNhY2hlcyA9IFBGTl92a01lcmdlUGlwZWxpbmVDYWNoZXMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrTWVyZ2VQaXBlbGluZUNhY2hlcyIgKSApOworICAgICAgdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQgPSBQRk5fdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUIiApICk7CisgICAgICB2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQgPSBQRk5fdmtSZWdpc3RlckRldmljZUV2ZW50RVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQiICkgKTsKKyAgICAgIHZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQgPSBQRk5fdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIgKSApOworICAgICAgdmtSZWdpc3Rlck9iamVjdHNOVlggPSBQRk5fdmtSZWdpc3Rlck9iamVjdHNOVlgoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUmVnaXN0ZXJPYmplY3RzTlZYIiApICk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgPSBQRk5fdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIiApICk7CisjZW5kaWYgLypWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKi8KKyAgICAgIHZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID0gUEZOX3ZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIgKSApOworICAgICAgdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiA9IFBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIiApICk7CisgICAgICB2a1Jlc2V0Q29tbWFuZFBvb2wgPSBQRk5fdmtSZXNldENvbW1hbmRQb29sKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1Jlc2V0Q29tbWFuZFBvb2wiICkgKTsKKyAgICAgIHZrUmVzZXREZXNjcmlwdG9yUG9vbCA9IFBGTl92a1Jlc2V0RGVzY3JpcHRvclBvb2woIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUmVzZXREZXNjcmlwdG9yUG9vbCIgKSApOworICAgICAgdmtSZXNldEV2ZW50ID0gUEZOX3ZrUmVzZXRFdmVudCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtSZXNldEV2ZW50IiApICk7CisgICAgICB2a1Jlc2V0RmVuY2VzID0gUEZOX3ZrUmVzZXRGZW5jZXMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUmVzZXRGZW5jZXMiICkgKTsKKyAgICAgIHZrUmVzZXRRdWVyeVBvb2xFWFQgPSBQRk5fdmtSZXNldFF1ZXJ5UG9vbEVYVCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtSZXNldFF1ZXJ5UG9vbEVYVCIgKSApOworICAgICAgdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCA9IFBGTl92a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIiApICk7CisgICAgICB2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQgPSBQRk5fdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQiICkgKTsKKyAgICAgIHZrU2V0RXZlbnQgPSBQRk5fdmtTZXRFdmVudCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtTZXRFdmVudCIgKSApOworICAgICAgdmtTZXRIZHJNZXRhZGF0YUVYVCA9IFBGTl92a1NldEhkck1ldGFkYXRhRVhUKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1NldEhkck1ldGFkYXRhRVhUIiApICk7CisgICAgICB2a1NldExvY2FsRGltbWluZ0FNRCA9IFBGTl92a1NldExvY2FsRGltbWluZ0FNRCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtTZXRMb2NhbERpbW1pbmdBTUQiICkgKTsKKyAgICAgIHZrU2lnbmFsU2VtYXBob3JlS0hSID0gUEZOX3ZrU2lnbmFsU2VtYXBob3JlS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1NpZ25hbFNlbWFwaG9yZUtIUiIgKSApOworICAgICAgdmtUcmltQ29tbWFuZFBvb2wgPSBQRk5fdmtUcmltQ29tbWFuZFBvb2woIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrVHJpbUNvbW1hbmRQb29sIiApICk7CisgICAgICB2a1RyaW1Db21tYW5kUG9vbEtIUiA9IFBGTl92a1RyaW1Db21tYW5kUG9vbEtIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtUcmltQ29tbWFuZFBvb2xLSFIiICkgKTsKKyAgICAgIHZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IFBGTl92a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIgKSApOworICAgICAgdmtVbm1hcE1lbW9yeSA9IFBGTl92a1VubWFwTWVtb3J5KCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1VubWFwTWVtb3J5IiApICk7CisgICAgICB2a1VucmVnaXN0ZXJPYmplY3RzTlZYID0gUEZOX3ZrVW5yZWdpc3Rlck9iamVjdHNOVlgoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrVW5yZWdpc3Rlck9iamVjdHNOVlgiICkgKTsKKyAgICAgIHZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSA9IFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSIgKSApOworICAgICAgdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0gUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSIiApICk7CisgICAgICB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzID0gUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldHMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrVXBkYXRlRGVzY3JpcHRvclNldHMiICkgKTsKKyAgICAgIHZrV2FpdEZvckZlbmNlcyA9IFBGTl92a1dhaXRGb3JGZW5jZXMoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrV2FpdEZvckZlbmNlcyIgKSApOworICAgICAgdmtXYWl0U2VtYXBob3Jlc0tIUiA9IFBGTl92a1dhaXRTZW1hcGhvcmVzS0hSKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1dhaXRTZW1hcGhvcmVzS0hSIiApICk7CisgICAgICB2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViA9IFBGTl92a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYiICkgKTsKKyAgICAgIHZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCA9IFBGTl92a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIgKSApOworICAgICAgdmtRdWV1ZUJpbmRTcGFyc2UgPSBQRk5fdmtRdWV1ZUJpbmRTcGFyc2UoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUXVldWVCaW5kU3BhcnNlIiApICk7CisgICAgICB2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUID0gUEZOX3ZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiICkgKTsKKyAgICAgIHZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgPSBQRk5fdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIgKSApOworICAgICAgdmtRdWV1ZVByZXNlbnRLSFIgPSBQRk5fdmtRdWV1ZVByZXNlbnRLSFIoIHZrR2V0RGV2aWNlUHJvY0FkZHIoIGRldmljZSwgInZrUXVldWVQcmVzZW50S0hSIiApICk7CisgICAgICB2a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSBQRk5fdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKCB2a0dldERldmljZVByb2NBZGRyKCBkZXZpY2UsICJ2a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiICkgKTsKKyAgICAgIHZrUXVldWVTdWJtaXQgPSBQRk5fdmtRdWV1ZVN1Ym1pdCggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtRdWV1ZVN1Ym1pdCIgKSApOworICAgICAgdmtRdWV1ZVdhaXRJZGxlID0gUEZOX3ZrUXVldWVXYWl0SWRsZSggdmtHZXREZXZpY2VQcm9jQWRkciggZGV2aWNlLCAidmtRdWV1ZVdhaXRJZGxlIiApICk7CisgICAgfQorICB9OworCit9IC8vIG5hbWVzcGFjZSBWVUxLQU5fSFBQX05BTUVTUEFDRQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9hbmRyb2lkLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9hbmRyb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4ZDNlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX2FuZHJvaWQuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBWVUxLQU5fQU5EUk9JRF9IXworI2RlZmluZSBWVUxLQU5fQU5EUk9JRF9IXyAxCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisqKgorKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjZGVmaW5lIFZLX0tIUl9hbmRyb2lkX3N1cmZhY2UgMQorc3RydWN0IEFOYXRpdmVXaW5kb3c7CisjZGVmaW5lIFZLX0tIUl9BTkRST0lEX1NVUkZBQ0VfU1BFQ19WRVJTSU9OIDYKKyNkZWZpbmUgVktfS0hSX0FORFJPSURfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSAiVktfS0hSX2FuZHJvaWRfc3VyZmFjZSIKK3R5cGVkZWYgVmtGbGFncyBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI7Cit0eXBlZGVmIHN0cnVjdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgICAgZmxhZ3M7CisgICAgc3RydWN0IEFOYXRpdmVXaW5kb3cqICAgICAgICAgICAgIHdpbmRvdzsKK30gVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmCisKKworI2RlZmluZSBWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciAxCitzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyOworI2RlZmluZSBWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9TUEVDX1ZFUlNJT04gMworI2RlZmluZSBWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSAiVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIiCit0eXBlZGVmIHN0cnVjdCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgYW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2U7Cit9IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEOworCit0eXBlZGVmIHN0cnVjdCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICBhbGxvY2F0aW9uU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWVtb3J5VHlwZUJpdHM7Cit9IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ7CisKK3R5cGVkZWYgc3RydWN0IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbEZvcm1hdDsKKyAgICBWa0Zvcm1hdEZlYXR1cmVGbGFncyAgICAgICAgICAgICBmb3JtYXRGZWF0dXJlczsKKyAgICBWa0NvbXBvbmVudE1hcHBpbmcgICAgICAgICAgICAgICBzYW1wbGVyWWNiY3JDb252ZXJzaW9uQ29tcG9uZW50czsKKyAgICBWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbiAgICBzdWdnZXN0ZWRZY2Jjck1vZGVsOworICAgIFZrU2FtcGxlclljYmNyUmFuZ2UgICAgICAgICAgICAgIHN1Z2dlc3RlZFljYmNyUmFuZ2U7CisgICAgVmtDaHJvbWFMb2NhdGlvbiAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkWENocm9tYU9mZnNldDsKKyAgICBWa0Nocm9tYUxvY2F0aW9uICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRZQ2hyb21hT2Zmc2V0OworfSBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEOworCit0eXBlZGVmIHN0cnVjdCBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiAgICBidWZmZXI7Cit9IFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ7CisKK3R5cGVkZWYgc3RydWN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtEZXZpY2VNZW1vcnkgICAgIG1lbW9yeTsKK30gVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDY0X3QgICAgICAgICAgIGV4dGVybmFsRm9ybWF0OworfSBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRDsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXIsIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqIHBQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlcioqIHBCdWZmZXIpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqICAgcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHBJbmZvLAorICAgIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcik7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9jb3JlLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmYWNiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX2NvcmUuaApAQCAtMCwwICsxLDEwMjcxIEBACisjaWZuZGVmIFZVTEtBTl9DT1JFX0hfCisjZGVmaW5lIFZVTEtBTl9DT1JFX0hfIDEKKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBWdWxrYW4gWE1MIEFQSSBSZWdpc3RyeS4KKyoqCisqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisKKyNkZWZpbmUgVktfVkVSU0lPTl8xXzAgMQorI2luY2x1ZGUgInZrX3BsYXRmb3JtLmgiCisjZGVmaW5lIFZLX01BS0VfVkVSU0lPTihtYWpvciwgbWlub3IsIHBhdGNoKSBcCisgICAgKCgobWFqb3IpIDw8IDIyKSB8ICgobWlub3IpIDw8IDEyKSB8IChwYXRjaCkpCisKKy8vIERFUFJFQ0FURUQ6IFRoaXMgZGVmaW5lIGhhcyBiZWVuIHJlbW92ZWQuIFNwZWNpZmljIHZlcnNpb24gZGVmaW5lcyAoZS5nLiBWS19BUElfVkVSU0lPTl8xXzApLCBvciB0aGUgVktfTUFLRV9WRVJTSU9OIG1hY3JvLCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorLy8jZGVmaW5lIFZLX0FQSV9WRVJTSU9OIFZLX01BS0VfVkVSU0lPTigxLCAwLCAwKSAvLyBQYXRjaCB2ZXJzaW9uIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIDAKKworLy8gVnVsa2FuIDEuMCB2ZXJzaW9uIG51bWJlcgorI2RlZmluZSBWS19BUElfVkVSU0lPTl8xXzAgVktfTUFLRV9WRVJTSU9OKDEsIDAsIDApLy8gUGF0Y2ggdmVyc2lvbiBzaG91bGQgYWx3YXlzIGJlIHNldCB0byAwCisKKyNkZWZpbmUgVktfVkVSU0lPTl9NQUpPUih2ZXJzaW9uKSAoKHVpbnQzMl90KSh2ZXJzaW9uKSA+PiAyMikKKyNkZWZpbmUgVktfVkVSU0lPTl9NSU5PUih2ZXJzaW9uKSAoKCh1aW50MzJfdCkodmVyc2lvbikgPj4gMTIpICYgMHgzZmYpCisjZGVmaW5lIFZLX1ZFUlNJT05fUEFUQ0godmVyc2lvbikgKCh1aW50MzJfdCkodmVyc2lvbikgJiAweGZmZikKKy8vIFZlcnNpb24gb2YgdGhpcyBmaWxlCisjZGVmaW5lIFZLX0hFQURFUl9WRVJTSU9OIDEzMAorCisKKyNkZWZpbmUgVktfTlVMTF9IQU5ETEUgMAorCisKKyNkZWZpbmUgVktfREVGSU5FX0hBTkRMRShvYmplY3QpIHR5cGVkZWYgc3RydWN0IG9iamVjdCMjX1QqIG9iamVjdDsKKworCisjaWYgIWRlZmluZWQoVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKQorI2lmIGRlZmluZWQoX19MUDY0X18pIHx8IGRlZmluZWQoX1dJTjY0KSB8fCAoZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChfX0lMUDMyX18pICkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX19pYTY0KSB8fCBkZWZpbmVkIChfTV9JQTY0KSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisgICAgICAgICNkZWZpbmUgVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKG9iamVjdCkgdHlwZWRlZiBzdHJ1Y3Qgb2JqZWN0IyNfVCAqb2JqZWN0OworI2Vsc2UKKyAgICAgICAgI2RlZmluZSBWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUob2JqZWN0KSB0eXBlZGVmIHVpbnQ2NF90IG9iamVjdDsKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgdWludDMyX3QgVmtGbGFnczsKK3R5cGVkZWYgdWludDMyX3QgVmtCb29sMzI7Cit0eXBlZGVmIHVpbnQ2NF90IFZrRGV2aWNlU2l6ZTsKK3R5cGVkZWYgdWludDMyX3QgVmtTYW1wbGVNYXNrOworVktfREVGSU5FX0hBTkRMRShWa0luc3RhbmNlKQorVktfREVGSU5FX0hBTkRMRShWa1BoeXNpY2FsRGV2aWNlKQorVktfREVGSU5FX0hBTkRMRShWa0RldmljZSkKK1ZLX0RFRklORV9IQU5ETEUoVmtRdWV1ZSkKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa1NlbWFwaG9yZSkKK1ZLX0RFRklORV9IQU5ETEUoVmtDb21tYW5kQnVmZmVyKQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrRmVuY2UpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtEZXZpY2VNZW1vcnkpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtCdWZmZXIpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtJbWFnZSkKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa0V2ZW50KQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrUXVlcnlQb29sKQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrQnVmZmVyVmlldykKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa0ltYWdlVmlldykKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa1NoYWRlck1vZHVsZSkKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa1BpcGVsaW5lQ2FjaGUpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtQaXBlbGluZUxheW91dCkKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa1JlbmRlclBhc3MpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtQaXBlbGluZSkKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa0Rlc2NyaXB0b3JTZXRMYXlvdXQpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtTYW1wbGVyKQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrRGVzY3JpcHRvclBvb2wpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtEZXNjcmlwdG9yU2V0KQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrRnJhbWVidWZmZXIpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtDb21tYW5kUG9vbCkKKyNkZWZpbmUgVktfTE9EX0NMQU1QX05PTkUgICAgICAgICAgICAgICAgIDEwMDAuMGYKKyNkZWZpbmUgVktfUkVNQUlOSU5HX01JUF9MRVZFTFMgICAgICAgICAgICh+MFUpCisjZGVmaW5lIFZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlMgICAgICAgICAofjBVKQorI2RlZmluZSBWS19XSE9MRV9TSVpFICAgICAgICAgICAgICAgICAgICAgKH4wVUxMKQorI2RlZmluZSBWS19BVFRBQ0hNRU5UX1VOVVNFRCAgICAgICAgICAgICAgKH4wVSkKKyNkZWZpbmUgVktfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVktfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQgICAgICAgICAgICh+MFUpCisjZGVmaW5lIFZLX1NVQlBBU1NfRVhURVJOQUwgICAgICAgICAgICAgICAofjBVKQorI2RlZmluZSBWS19NQVhfUEhZU0lDQUxfREVWSUNFX05BTUVfU0laRSAgMjU2CisjZGVmaW5lIFZLX1VVSURfU0laRSAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBWS19NQVhfTUVNT1JZX1RZUEVTICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgVktfTUFYX01FTU9SWV9IRUFQUyAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFICAgICAgICAyNTYKKyNkZWZpbmUgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkUgICAgICAgICAgIDI1NgorCit0eXBlZGVmIGVudW0gVmtQaXBlbGluZUNhY2hlSGVhZGVyVmVyc2lvbiB7CisgICAgVktfUElQRUxJTkVfQ0FDSEVfSEVBREVSX1ZFUlNJT05fT05FID0gMSwKKyAgICBWS19QSVBFTElORV9DQUNIRV9IRUFERVJfVkVSU0lPTl9CRUdJTl9SQU5HRSA9IFZLX1BJUEVMSU5FX0NBQ0hFX0hFQURFUl9WRVJTSU9OX09ORSwKKyAgICBWS19QSVBFTElORV9DQUNIRV9IRUFERVJfVkVSU0lPTl9FTkRfUkFOR0UgPSBWS19QSVBFTElORV9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkUsCisgICAgVktfUElQRUxJTkVfQ0FDSEVfSEVBREVSX1ZFUlNJT05fUkFOR0VfU0laRSA9IChWS19QSVBFTElORV9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkUgLSBWS19QSVBFTElORV9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkUgKyAxKSwKKyAgICBWS19QSVBFTElORV9DQUNIRV9IRUFERVJfVkVSU0lPTl9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtQaXBlbGluZUNhY2hlSGVhZGVyVmVyc2lvbjsKKwordHlwZWRlZiBlbnVtIFZrUmVzdWx0IHsKKyAgICBWS19TVUNDRVNTID0gMCwKKyAgICBWS19OT1RfUkVBRFkgPSAxLAorICAgIFZLX1RJTUVPVVQgPSAyLAorICAgIFZLX0VWRU5UX1NFVCA9IDMsCisgICAgVktfRVZFTlRfUkVTRVQgPSA0LAorICAgIFZLX0lOQ09NUExFVEUgPSA1LAorICAgIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSA9IC0xLAorICAgIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZID0gLTIsCisgICAgVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEID0gLTMsCisgICAgVktfRVJST1JfREVWSUNFX0xPU1QgPSAtNCwKKyAgICBWS19FUlJPUl9NRU1PUllfTUFQX0ZBSUxFRCA9IC01LAorICAgIFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UID0gLTYsCisgICAgVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UID0gLTcsCisgICAgVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVCA9IC04LAorICAgIFZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVIgPSAtOSwKKyAgICBWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTID0gLTEwLAorICAgIFZLX0VSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEID0gLTExLAorICAgIFZLX0VSUk9SX0ZSQUdNRU5URURfUE9PTCA9IC0xMiwKKyAgICBWS19FUlJPUl9PVVRfT0ZfUE9PTF9NRU1PUlkgPSAtMTAwMDA2OTAwMCwKKyAgICBWS19FUlJPUl9JTlZBTElEX0VYVEVSTkFMX0hBTkRMRSA9IC0xMDAwMDcyMDAzLAorICAgIFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIgPSAtMTAwMDAwMDAwMCwKKyAgICBWS19FUlJPUl9OQVRJVkVfV0lORE9XX0lOX1VTRV9LSFIgPSAtMTAwMDAwMDAwMSwKKyAgICBWS19TVUJPUFRJTUFMX0tIUiA9IDEwMDAwMDEwMDMsCisgICAgVktfRVJST1JfT1VUX09GX0RBVEVfS0hSID0gLTEwMDAwMDEwMDQsCisgICAgVktfRVJST1JfSU5DT01QQVRJQkxFX0RJU1BMQVlfS0hSID0gLTEwMDAwMDMwMDEsCisgICAgVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUID0gLTEwMDAwMTEwMDEsCisgICAgVktfRVJST1JfSU5WQUxJRF9TSEFERVJfTlYgPSAtMTAwMDAxMjAwMCwKKyAgICBWS19FUlJPUl9JTlZBTElEX0RSTV9GT1JNQVRfTU9ESUZJRVJfUExBTkVfTEFZT1VUX0VYVCA9IC0xMDAwMTU4MDAwLAorICAgIFZLX0VSUk9SX0ZSQUdNRU5UQVRJT05fRVhUID0gLTEwMDAxNjEwMDAsCisgICAgVktfRVJST1JfTk9UX1BFUk1JVFRFRF9FWFQgPSAtMTAwMDE3NDAwMSwKKyAgICBWS19FUlJPUl9GVUxMX1NDUkVFTl9FWENMVVNJVkVfTU9ERV9MT1NUX0VYVCA9IC0xMDAwMjU1MDAwLAorICAgIFZLX0VSUk9SX0lOVkFMSURfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19LSFIgPSAtMTAwMDI0NDAwMCwKKyAgICBWS19FUlJPUl9PVVRfT0ZfUE9PTF9NRU1PUllfS0hSID0gVktfRVJST1JfT1VUX09GX1BPT0xfTUVNT1JZLAorICAgIFZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFX0tIUiA9IFZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFLAorICAgIFZLX0VSUk9SX0lOVkFMSURfREVWSUNFX0FERFJFU1NfRVhUID0gVktfRVJST1JfSU5WQUxJRF9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0tIUiwKKyAgICBWS19SRVNVTFRfQkVHSU5fUkFOR0UgPSBWS19FUlJPUl9GUkFHTUVOVEVEX1BPT0wsCisgICAgVktfUkVTVUxUX0VORF9SQU5HRSA9IFZLX0lOQ09NUExFVEUsCisgICAgVktfUkVTVUxUX1JBTkdFX1NJWkUgPSAoVktfSU5DT01QTEVURSAtIFZLX0VSUk9SX0ZSQUdNRU5URURfUE9PTCArIDEpLAorICAgIFZLX1JFU1VMVF9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtSZXN1bHQ7CisKK3R5cGVkZWYgZW51bSBWa1N0cnVjdHVyZVR5cGUgeworICAgIFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8gPSAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPID0gMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfQ1JFQVRFX0lORk8gPSAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTyA9IDMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8gPSA0LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPID0gNSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFID0gNiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX1NQQVJTRV9JTkZPID0gNywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTyA9IDgsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPID0gOSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTyA9IDEwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk8gPSAxMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8gPSAxMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTyA9IDEzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPID0gMTQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTyA9IDE1LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfQ1JFQVRFX0lORk8gPSAxNiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTyA9IDE3LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTyA9IDE4LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9TVEFURV9DUkVBVEVfSU5GTyA9IDE5LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPID0gMjAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPID0gMjEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk8gPSAyMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX0NSRUFURV9JTkZPID0gMjMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTVVMVElTQU1QTEVfU1RBVEVfQ1JFQVRFX0lORk8gPSAyNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9ERVBUSF9TVEVOQ0lMX1NUQVRFX0NSRUFURV9JTkZPID0gMjUsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfU1RBVEVfQ1JFQVRFX0lORk8gPSAyNiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPID0gMjcsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk8gPSAyOCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9DT01QVVRFX1BJUEVMSU5FX0NSRUFURV9JTkZPID0gMjksCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPID0gMzAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTyA9IDMxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTyA9IDMyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTyA9IDMzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk8gPSAzNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVCA9IDM1LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0NPUFlfREVTQ1JJUFRPUl9TRVQgPSAzNiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTyA9IDM3LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPID0gMzgsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPID0gMzksCisgICAgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTyA9IDQwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk8gPSA0MSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPID0gNDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTyA9IDQzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUiA9IDQ0LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSID0gNDUsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVIgPSA0NiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfSU5TVEFOQ0VfQ1JFQVRFX0lORk8gPSA0NywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfREVWSUNFX0NSRUFURV9JTkZPID0gNDgsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1BST1BFUlRJRVMgPSAxMDAwMDk0MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPID0gMTAwMDE1NzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPID0gMTAwMDE1NzAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfMTZCSVRfU1RPUkFHRV9GRUFUVVJFUyA9IDEwMDAwODMwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFMgPSAxMDAwMTI3MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfQUxMT0NBVEVfSU5GTyA9IDEwMDAxMjcwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk8gPSAxMDAwMDYwMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9SRU5ERVJfUEFTU19CRUdJTl9JTkZPID0gMTAwMDA2MDAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTyA9IDEwMDAwNjAwMDQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPID0gMTAwMDA2MDAwNSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTyA9IDEwMDAwNjAwMDYsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPID0gMTAwMDA2MDAxMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTyA9IDEwMDAwNjAwMTQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0dST1VQX1BST1BFUlRJRVMgPSAxMDAwMDcwMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk8gPSAxMDAwMDcwMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiA9IDEwMDAxNDYwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIgPSAxMDAwMTQ2MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiA9IDEwMDAxNDYwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yID0gMTAwMDE0NjAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU18yID0gMTAwMDE0NjAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMiA9IDEwMDAwNTkwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMiA9IDEwMDAwNTkwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMiA9IDEwMDAwNTkwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMiA9IDEwMDAwNTkwMDMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIgPSAxMDAwMDU5MDA0LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9QUk9QRVJUSUVTXzIgPSAxMDAwMDU5MDA1LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJPUEVSVElFU18yID0gMTAwMDA1OTAwNiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMiA9IDEwMDAwNTkwMDcsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NQQVJTRV9JTUFHRV9GT1JNQVRfSU5GT18yID0gMTAwMDA1OTAwOCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUE9JTlRfQ0xJUFBJTkdfUFJPUEVSVElFUyA9IDEwMDAxMTcwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk8gPSAxMDAwMTE3MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfVVNBR0VfQ1JFQVRFX0lORk8gPSAxMDAwMTE3MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPID0gMTAwMDExNzAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk8gPSAxMDAwMDUzMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVMgPSAxMDAwMDUzMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUFJPUEVSVElFUyA9IDEwMDAwNTMwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZBUklBQkxFX1BPSU5URVJTX0ZFQVRVUkVTID0gMTAwMDEyMDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QUk9URUNURURfU1VCTUlUX0lORk8gPSAxMDAwMTQ1MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9URUNURURfTUVNT1JZX0ZFQVRVUkVTID0gMTAwMDE0NTAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9QUk9QRVJUSUVTID0gMTAwMDE0NTAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfSU5GT18yID0gMTAwMDE0NTAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fQ1JFQVRFX0lORk8gPSAxMDAwMTU2MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPID0gMTAwMDE1NjAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPID0gMTAwMDE1NjAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9QTEFORV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk8gPSAxMDAwMTU2MDAzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRkVBVFVSRVMgPSAxMDAwMTU2MDA0LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTUFHRV9GT1JNQVRfUFJPUEVSVElFUyA9IDEwMDAxNTYwMDUsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk8gPSAxMDAwMDg1MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTyA9IDEwMDAwNzEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfSU1BR0VfRk9STUFUX1BST1BFUlRJRVMgPSAxMDAwMDcxMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GTyA9IDEwMDAwNzEwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVMgPSAxMDAwMDcxMDAzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JRF9QUk9QRVJUSUVTID0gMTAwMDA3MTAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfQlVGRkVSX0NSRUFURV9JTkZPID0gMTAwMDA3MjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk8gPSAxMDAwMDcyMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTyA9IDEwMDAwNzIwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8gPSAxMDAwMTEyMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZFTkNFX1BST1BFUlRJRVMgPSAxMDAwMTEyMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTyA9IDEwMDAxMTMwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9DUkVBVEVfSU5GTyA9IDEwMDAwNzcwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX1NFTUFQSE9SRV9JTkZPID0gMTAwMDA3NjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9TRU1BUEhPUkVfUFJPUEVSVElFUyA9IDEwMDAwNzYwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUyA9IDEwMDAxNjgwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlQgPSAxMDAwMTY4MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRFJBV19QQVJBTUVURVJTX0ZFQVRVUkVTID0gMTAwMDA2MzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSID0gMTAwMDAwMTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSID0gMTAwMDAwMTAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSID0gMTAwMDA2MDAwNywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSID0gMTAwMDA2MDAwOCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9TV0FQQ0hBSU5fSU5GT19LSFIgPSAxMDAwMDYwMDA5LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfTkVYVF9JTUFHRV9JTkZPX0tIUiA9IDEwMDAwNjAwMTAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFIgPSAxMDAwMDYwMDExLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSID0gMTAwMDA2MDAxMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfQ1JFQVRFX0lORk9fS0hSID0gMTAwMDAwMjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSID0gMTAwMDAwMjAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BSRVNFTlRfSU5GT19LSFIgPSAxMDAwMDAzMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIgPSAxMDAwMDA0MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1hDQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiA9IDEwMDAwMDUwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfV0FZTEFORF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiA9IDEwMDAwMDYwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiA9IDEwMDAwMDgwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIgPSAxMDAwMDA5MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19DUkVBVEVfSU5GT19FWFQgPSAxMDAwMDExMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfUkFTVEVSSVpBVElPTl9PUkRFUl9BTUQgPSAxMDAwMDE4MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfTkFNRV9JTkZPX0VYVCA9IDEwMDAwMjIwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9UQUdfSU5GT19FWFQgPSAxMDAwMDIyMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9NQVJLRVJfSU5GT19FWFQgPSAxMDAwMDIyMDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0NSRUFURV9JTkZPX05WID0gMTAwMDAyNjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9CVUZGRVJfQ1JFQVRFX0lORk9fTlYgPSAxMDAwMDI2MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX01FTU9SWV9BTExPQ0FURV9JTkZPX05WID0gMTAwMDAyNjAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX0ZFQVRVUkVTX0VYVCA9IDEwMDAwMjgwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19QUk9QRVJUSUVTX0VYVCA9IDEwMDAwMjgwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9TVFJFQU1fQ1JFQVRFX0lORk9fRVhUID0gMTAwMDAyODAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0hBTkRMRV9JTkZPX05WWCA9IDEwMDAwMzAwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfVEVYVFVSRV9MT0RfR0FUSEVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FNRCA9IDEwMDAwNDEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9DUkVBVEVfSU5GT19HR1AgPSAxMDAwMDQ5MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1JORVJfU0FNUExFRF9JTUFHRV9GRUFUVVJFU19OViA9IDEwMDAwNTAwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WID0gMTAwMDA1NjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYgPSAxMDAwMDU2MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYgPSAxMDAwMDU3MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYgPSAxMDAwMDU3MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WID0gMTAwMDA1ODAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZMQUdTX0VYVCA9IDEwMDAwNjEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfVklfU1VSRkFDRV9DUkVBVEVfSU5GT19OTiA9IDEwMDAwNjIwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWFRVUkVfQ09NUFJFU1NJT05fQVNUQ19IRFJfRkVBVFVSRVNfRVhUID0gMTAwMDA2NjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0FTVENfREVDT0RFX01PREVfRVhUID0gMTAwMDA2NzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQVNUQ19ERUNPREVfRkVBVFVSRVNfRVhUID0gMTAwMDA2NzAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiA9IDEwMDAwNzMwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFIgPSAxMDAwMDczMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9XSU4zMl9IQU5ETEVfUFJPUEVSVElFU19LSFIgPSAxMDAwMDczMDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSID0gMTAwMDA3MzAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0ZEX0lORk9fS0hSID0gMTAwMDA3NDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfRkRfUFJPUEVSVElFU19LSFIgPSAxMDAwMDc0MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfRkRfSU5GT19LSFIgPSAxMDAwMDc0MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX0tIUiA9IDEwMDAwNzUwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIgPSAxMDAwMDc4MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfV0lOMzJfSEFORExFX0lORk9fS0hSID0gMTAwMDA3ODAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9EM0QxMl9GRU5DRV9TVUJNSVRfSU5GT19LSFIgPSAxMDAwMDc4MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSID0gMTAwMDA3ODAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX0ZEX0lORk9fS0hSID0gMTAwMDA3OTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfR0VUX0ZEX0lORk9fS0hSID0gMTAwMDA3OTAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFVTSF9ERVNDUklQVE9SX1BST1BFUlRJRVNfS0hSID0gMTAwMDA4MDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5GT19FWFQgPSAxMDAwMDgxMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhUID0gMTAwMDA4MTAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQgPSAxMDAwMDgxMDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUiA9IDEwMDAwODIwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9SRUdJT05TX0tIUiA9IDEwMDAwODQwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfT0JKRUNUX1RBQkxFX0NSRUFURV9JTkZPX05WWCA9IDEwMDAwODYwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX0NSRUFURV9JTkZPX05WWCA9IDEwMDAwODYwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfQ01EX1BST0NFU1NfQ09NTUFORFNfSU5GT19OVlggPSAxMDAwMDg2MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWCA9IDEwMDAwODYwMDMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYID0gMTAwMDA4NjAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0ZFQVRVUkVTX05WWCA9IDEwMDAwODYwMDUsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfV19TQ0FMSU5HX1NUQVRFX0NSRUFURV9JTkZPX05WID0gMTAwMDA4NzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVCA9IDEwMDAwOTAwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QT1dFUl9JTkZPX0VYVCA9IDEwMDAwOTEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhUID0gMTAwMDA5MTAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX0VWRU5UX0lORk9fRVhUID0gMTAwMDA5MTAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ09VTlRFUl9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMDkxMDAzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEUgPSAxMDAwMDkyMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19QUk9QRVJUSUVTX05WWCA9IDEwMDAwOTcwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1dJWlpMRV9TVEFURV9DUkVBVEVfSU5GT19OViA9IDEwMDAwOTgwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RJU0NBUkRfUkVDVEFOR0xFX1BST1BFUlRJRVNfRVhUID0gMTAwMDA5OTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9ESVNDQVJEX1JFQ1RBTkdMRV9TVEFURV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMDk5MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVCA9IDEwMDAxMDEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDEwMTAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfQ0xJUF9FTkFCTEVfRkVBVFVSRVNfRVhUID0gMTAwMDEwMjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0RFUFRIX0NMSVBfU1RBVEVfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDEwMjAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9IRFJfTUVUQURBVEFfRVhUID0gMTAwMDEwNTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUiA9IDEwMDAxMDgwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVFNfQ1JFQVRFX0lORk9fS0hSID0gMTAwMDEwODAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0lNQUdFX0lORk9fS0hSID0gMTAwMDEwODAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19BVFRBQ0hNRU5UX0JFR0lOX0lORk9fS0hSID0gMTAwMDEwODAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OXzJfS0hSID0gMTAwMDEwOTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV8yX0tIUiA9IDEwMDAxMDkwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl8yX0tIUiA9IDEwMDAxMDkwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVBFTkRFTkNZXzJfS0hSID0gMTAwMDEwOTAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GT18yX0tIUiA9IDEwMDAxMDkwMDQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19CRUdJTl9JTkZPX0tIUiA9IDEwMDAxMDkwMDUsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFIgPSAxMDAwMTA5MDA2LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NIQVJFRF9QUkVTRU5UX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0tIUiA9IDEwMDAxMTEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiA9IDEwMDAxMTQwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX0ZFTkNFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiA9IDEwMDAxMTQwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfR0VUX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiA9IDEwMDAxMTQwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSID0gMTAwMDExNTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFIgPSAxMDAwMTE1MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9GRUFUVVJFU19LSFIgPSAxMDAwMTE2MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9QUk9QRVJUSUVTX0tIUiA9IDEwMDAxMTYwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9QRVJGT1JNQU5DRV9DUkVBVEVfSU5GT19LSFIgPSAxMDAwMTE2MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX1NVQk1JVF9JTkZPX0tIUiA9IDEwMDAxMTYwMDMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUiA9IDEwMDAxMTYwMDQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9LSFIgPSAxMDAwMTE2MDA1LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSID0gMTAwMDExNjAwNiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VSRkFDRV9JTkZPXzJfS0hSID0gMTAwMDExOTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0tIUiA9IDEwMDAxMTkwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GT1JNQVRfMl9LSFIgPSAxMDAwMTE5MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJPUEVSVElFU18yX0tIUiA9IDEwMDAxMjEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9QUk9QRVJUSUVTXzJfS0hSID0gMTAwMDEyMTAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUiA9IDEwMDAxMjEwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9JTkZPXzJfS0hSID0gMTAwMDEyMTAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX0NBUEFCSUxJVElFU18yX0tIUiA9IDEwMDAxMjEwMDQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU9TX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTVZLID0gMTAwMDEyMjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSyA9IDEwMDAxMjMwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX05BTUVfSU5GT19FWFQgPSAxMDAwMTI4MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9UQUdfSU5GT19FWFQgPSAxMDAwMTI4MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX0xBQkVMX0VYVCA9IDEwMDAxMjgwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NBTExCQUNLX0RBVEFfRVhUID0gMTAwMDEyODAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDEyODAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9VU0FHRV9BTkRST0lEID0gMTAwMDEyOTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQgPSAxMDAwMTI5MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQgPSAxMDAwMTI5MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQgPSAxMDAwMTI5MDAzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfSU5GT19BTkRST0lEID0gMTAwMDEyOTAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GT1JNQVRfQU5EUk9JRCA9IDEwMDAxMjkwMDUsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfRklMVEVSX01JTk1BWF9QUk9QRVJUSUVTX0VYVCA9IDEwMDAxMzAwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMTMwMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQgPSAxMDAwMTM4MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19QUk9QRVJUSUVTX0VYVCA9IDEwMDAxMzgwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUID0gMTAwMDEzODAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDEzODAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhUID0gMTAwMDE0MzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19TQU1QTEVfTE9DQVRJT05TX0JFR0lOX0lORk9fRVhUID0gMTAwMDE0MzAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TQU1QTEVfTE9DQVRJT05TX1NUQVRFX0NSRUFURV9JTkZPX0VYVCA9IDEwMDAxNDMwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRV9MT0NBVElPTlNfUFJPUEVSVElFU19FWFQgPSAxMDAwMTQzMDAzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX01VTFRJU0FNUExFX1BST1BFUlRJRVNfRVhUID0gMTAwMDE0MzAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfTElTVF9DUkVBVEVfSU5GT19LSFIgPSAxMDAwMTQ3MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhUID0gMTAwMDE0ODAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX1BST1BFUlRJRVNfRVhUID0gMTAwMDE0ODAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMTQ4MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1RPX0NPTE9SX1NUQVRFX0NSRUFURV9JTkZPX05WID0gMTAwMDE0OTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9NT0RVTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WID0gMTAwMDE1MjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WID0gMTAwMDE1NDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX1BST1BFUlRJRVNfTlYgPSAxMDAwMTU0MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19MSVNUX0VYVCA9IDEwMDAxNTgwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0VYVCA9IDEwMDAxNTgwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfSU5GT19FWFQgPSAxMDAwMTU4MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMTU4MDAzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhQTElDSVRfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDE1ODAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhUID0gMTAwMDE1ODAwNSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCA9IDEwMDAxNjAwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCA9IDEwMDAxNjAwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0JJTkRJTkdfRkxBR1NfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDE2MTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQgPSAxMDAwMTYxMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX1BST1BFUlRJRVNfRVhUID0gMTAwMDE2MTAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0FMTE9DQVRFX0lORk9fRVhUID0gMTAwMDE2MTAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVCA9IDEwMDAxNjEwMDQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU0hBRElOR19SQVRFX0lNQUdFX1NUQVRFX0NSRUFURV9JTkZPX05WID0gMTAwMDE2NDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX0ZFQVRVUkVTX05WID0gMTAwMDE2NDAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX1BST1BFUlRJRVNfTlYgPSAxMDAwMTY0MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlYgPSAxMDAwMTY0MDA1LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WID0gMTAwMDE2NTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NSRUFURV9JTkZPX05WID0gMTAwMDE2NTAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OViA9IDEwMDAxNjUwMDMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WID0gMTAwMDE2NTAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WID0gMTAwMDE2NTAwNSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX0lORk9fTlYgPSAxMDAwMTY1MDA2LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYgPSAxMDAwMTY1MDA3LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPX05WID0gMTAwMDE2NTAwOCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkFZX1RSQUNJTkdfUFJPUEVSVElFU19OViA9IDEwMDAxNjUwMDksCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WID0gMTAwMDE2NTAxMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlYgPSAxMDAwMTY1MDEyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX0ZFQVRVUkVTX05WID0gMTAwMDE2NjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX1NUQVRFX0NSRUFURV9JTkZPX05WID0gMTAwMDE2NjAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfVklFV19JTUFHRV9GT1JNQVRfSU5GT19FWFQgPSAxMDAwMTcwMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0ZJTFRFUl9DVUJJQ19JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0VYVCA9IDEwMDAxNzAwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0dMT0JBTF9QUklPUklUWV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMTc0MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRkVBVFVSRVNfS0hSID0gMTAwMDE3NTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUiA9IDEwMDAxNzcwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9IT1NUX1BPSU5URVJfSU5GT19FWFQgPSAxMDAwMTc4MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9IT1NUX1BPSU5URVJfUFJPUEVSVElFU19FWFQgPSAxMDAwMTc4MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9NRU1PUllfSE9TVF9QUk9QRVJUSUVTX0VYVCA9IDEwMDAxNzgwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9BVE9NSUNfSU5UNjRfRkVBVFVSRVNfS0hSID0gMTAwMDE4MDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NMT0NLX0ZFQVRVUkVTX0tIUiA9IDEwMDAxODEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQgPSAxMDAwMTgzMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0NBTElCUkFURURfVElNRVNUQU1QX0lORk9fRVhUID0gMTAwMDE4NDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NPUkVfUFJPUEVSVElFU19BTUQgPSAxMDAwMTg1MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQ1JFQVRFX0lORk9fQU1EID0gMTAwMDE4OTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX1BST1BFUlRJRVNfRVhUID0gMTAwMDE5MDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfRElWSVNPUl9TVEFURV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMTkwMDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUID0gMTAwMDE5MDAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0ZSQU1FX1RPS0VOX0dHUCA9IDEwMDAxOTEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDE5MjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRFJJVkVSX1BST1BFUlRJRVNfS0hSID0gMTAwMDE5NjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkxPQVRfQ09OVFJPTFNfUFJPUEVSVElFU19LSFIgPSAxMDAwMTk3MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfUFJPUEVSVElFU19LSFIgPSAxMDAwMTk5MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fREVQVEhfU1RFTkNJTF9SRVNPTFZFX0tIUiA9IDEwMDAxOTkwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WID0gMTAwMDIwMTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfRkVBVFVSRVNfTlYgPSAxMDAwMjAyMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9QUk9QRVJUSUVTX05WID0gMTAwMDIwMjAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WID0gMTAwMDIwMzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lNQUdFX0ZPT1RQUklOVF9GRUFUVVJFU19OViA9IDEwMDAyMDQwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlYgPSAxMDAwMjA1MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWENMVVNJVkVfU0NJU1NPUl9GRUFUVVJFU19OViA9IDEwMDAyMDUwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfQ0hFQ0tQT0lOVF9EQVRBX05WID0gMTAwMDIwNjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfQ0hFQ0tQT0lOVF9QUk9QRVJUSUVTX05WID0gMTAwMDIwNjAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX0ZFQVRVUkVTX0tIUiA9IDEwMDAyMDcwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9QUk9QRVJUSUVTX0tIUiA9IDEwMDAyMDcwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1RZUEVfQ1JFQVRFX0lORk9fS0hSID0gMTAwMDIwNzAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9USU1FTElORV9TRU1BUEhPUkVfU1VCTUlUX0lORk9fS0hSID0gMTAwMDIwNzAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfV0FJVF9JTkZPX0tIUiA9IDEwMDAyMDcwMDQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1NJR05BTF9JTkZPX0tIUiA9IDEwMDAyMDcwMDUsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTlRFR0VSX0ZVTkNUSU9OU18yX0ZFQVRVUkVTX0lOVEVMID0gMTAwMDIwOTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMID0gMTAwMDIxMDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTklUSUFMSVpFX1BFUkZPUk1BTkNFX0FQSV9JTkZPX0lOVEVMID0gMTAwMDIxMDAwMSwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9NQVJLRVJfSU5GT19JTlRFTCA9IDEwMDAyMTAwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfU1RSRUFNX01BUktFUl9JTkZPX0lOVEVMID0gMTAwMDIxMDAwMywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9PVkVSUklERV9JTkZPX0lOVEVMID0gMTAwMDIxMDAwNCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX0FDUVVJUkVfSU5GT19JTlRFTCA9IDEwMDAyMTAwMDUsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZVTEtBTl9NRU1PUllfTU9ERUxfRkVBVFVSRVNfS0hSID0gMTAwMDIxMTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUENJX0JVU19JTkZPX1BST1BFUlRJRVNfRVhUID0gMTAwMDIxMjAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX05BVElWRV9IRFJfU1VSRkFDRV9DQVBBQklMSVRJRVNfQU1EID0gMTAwMDIxMzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fRElTUExBWV9OQVRJVkVfSERSX0NSRUFURV9JTkZPX0FNRCA9IDEwMDAyMTMwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQSA9IDEwMDAyMTQwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfTUVUQUxfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMjE3MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQgPSAxMDAwMjE4MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVCA9IDEwMDAyMTgwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDIxODAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0NBTEFSX0JMT0NLX0xBWU9VVF9GRUFUVVJFU19FWFQgPSAxMDAwMjIxMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfUFJPUEVSVElFU19FWFQgPSAxMDAwMjI1MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9SRVFVSVJFRF9TVUJHUk9VUF9TSVpFX0NSRUFURV9JTkZPX0VYVCA9IDEwMDAyMjUwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQgPSAxMDAwMjI1MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EID0gMTAwMDIyNzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0ZFQVRVUkVTX0FNRCA9IDEwMDAyMjkwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9CVURHRVRfUFJPUEVSVElFU19FWFQgPSAxMDAwMjM3MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJJT1JJVFlfRkVBVFVSRVNfRVhUID0gMTAwMDIzODAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUFJJT1JJVFlfQUxMT0NBVEVfSU5GT19FWFQgPSAxMDAwMjM4MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19LSFIgPSAxMDAwMjM5MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19GRUFUVVJFU19OViA9IDEwMDAyNDAwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19GRUFUVVJFU19LSFIgPSAxMDAwMjQxMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFX1NURU5DSUxfTEFZT1VUX0tIUiA9IDEwMDAyNDEwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFIgPSAxMDAwMjQxMDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhUID0gMTAwMDI0NDAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfQ1JFQVRFX0lORk9fRVhUID0gMTAwMDI0NDAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVE9PTF9QUk9QRVJUSUVTX0VYVCA9IDEwMDAyNDUwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMjQ2MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUID0gMTAwMDI0NzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX0ZFQVRVUkVTX05WID0gMTAwMDI0OTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OViA9IDEwMDAyNDkwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9QUk9QRVJUSUVTX05WID0gMTAwMDI0OTAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfRkVBVFVSRVNfTlYgPSAxMDAwMjUwMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1JFRFVDVElPTl9TVEFURV9DUkVBVEVfSU5GT19OViA9IDEwMDAyNTAwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfTUlYRURfU0FNUExFU19DT01CSU5BVElPTl9OViA9IDEwMDAyNTAwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUID0gMTAwMDI1MTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfWUNCQ1JfSU1BR0VfQVJSQVlTX0ZFQVRVUkVTX0VYVCA9IDEwMDAyNTIwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1VOSUZPUk1fQlVGRkVSX1NUQU5EQVJEX0xBWU9VVF9GRUFUVVJFU19LSFIgPSAxMDAwMjUzMDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0lORk9fRVhUID0gMTAwMDI1NTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhUID0gMTAwMDI1NTAwMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9XSU4zMl9JTkZPX0VYVCA9IDEwMDAyNTUwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSEVBRExFU1NfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMjU2MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfS0hSID0gMTAwMDI1NzAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19LSFIgPSAxMDAwMjQ0MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0NSRUFURV9JTkZPX0tIUiA9IDEwMDAyNTcwMDIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQUxMT0NBVEVfSU5GT19LSFIgPSAxMDAwMjU3MDAzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19JTkZPX0tIUiA9IDEwMDAyNTcwMDQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9GRUFUVVJFU19FWFQgPSAxMDAwMjU5MDAwLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fTElORV9TVEFURV9DUkVBVEVfSU5GT19FWFQgPSAxMDAwMjU5MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQgPSAxMDAwMjU5MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9IT1NUX1FVRVJZX1JFU0VUX0ZFQVRVUkVTX0VYVCA9IDEwMDAyNjEwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOREVYX1RZUEVfVUlOVDhfRkVBVFVSRVNfRVhUID0gMTAwMDI2NTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0ZFQVRVUkVTX0tIUiA9IDEwMDAyNjkwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFIgPSAxMDAwMjY5MDAxLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19LSFIgPSAxMDAwMjY5MDAyLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfSU5GT19LSFIgPSAxMDAwMjY5MDAzLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUiA9IDEwMDAyNjkwMDQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFIgPSAxMDAwMjY5MDA1LAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0ZFQVRVUkVTX0VYVCA9IDEwMDAyNzYwMDAsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhUID0gMTAwMDI4MTAwMCwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9QUk9QRVJUSUVTX0VYVCA9IDEwMDAyODEwMDEsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZBUklBQkxFX1BPSU5URVJfRkVBVFVSRVMgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUl9GRUFUVVJFUyA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRFJBV19QQVJBTUVURVJTX0ZFQVRVUkVTLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DUkVBVEVfSU5GT19FWFQgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhULAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GT19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFU19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX0ZFQVRVUkVTLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUFJPUEVSVElFU19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BST1BFUlRJRVMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzJfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0ZPUk1BVF9QUk9QRVJUSUVTXzJfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzJfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUVVFVUVfRkFNSUxZX1BST1BFUlRJRVNfMl9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJPUEVSVElFU18yX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJPUEVSVElFU18yLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMl9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1BBUlNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TVUJNSVRfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GT19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfREVWSUNFX0dST1VQX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfSU1BR0VfRk9STUFUX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GT19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVNfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVNfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GT19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfQlVGRkVSX0NSRUFURV9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GT19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX1NFTUFQSE9SRV9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9DUkVBVEVfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfMTZCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfMTZCSVRfU1RPUkFHRV9GRUFUVVJFUywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9DUkVBVEVfSU5GT19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9DUkVBVEVfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFUzJfRVhUID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRkVOQ0VfUFJPUEVSVElFU19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GT19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVNfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19VU0FHRV9DUkVBVEVfSU5GT19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSX0ZFQVRVUkVTX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSX0ZFQVRVUkVTLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFU19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUl9GRUFUVVJFUywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX1JFUVVJUkVNRU5UU19LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX1JFUVVJUkVNRU5UUywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX0FMTE9DQVRFX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMl9LSFIgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzJfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1BBUlNFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzJfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzJfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fQ1JFQVRFX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfUExBTkVfTUVNT1JZX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9QTEFORV9NRU1PUllfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9QTEFORV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfUExBTkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRkVBVFVSRVNfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPLAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0lORk9fS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTX0tIUiA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVMsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlRfS0hSID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlQsCisgICAgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9BRERSRVNTX0ZFQVRVUkVTX0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhULAorICAgIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0VYVCA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUiwKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9CRUdJTl9SQU5HRSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8sCisgICAgVktfU1RSVUNUVVJFX1RZUEVfRU5EX1JBTkdFID0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0RFVklDRV9DUkVBVEVfSU5GTywKKyAgICBWS19TVFJVQ1RVUkVfVFlQRV9SQU5HRV9TSVpFID0gKFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9ERVZJQ0VfQ1JFQVRFX0lORk8gLSBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPICsgMSksCisgICAgVktfU1RSVUNUVVJFX1RZUEVfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrU3RydWN0dXJlVHlwZTsKKwordHlwZWRlZiBlbnVtIFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlIHsKKyAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DT01NQU5EID0gMCwKKyAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QgPSAxLAorICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0NBQ0hFID0gMiwKKyAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9ERVZJQ0UgPSAzLAorICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFID0gNCwKKyAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9CRUdJTl9SQU5HRSA9IFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0NPTU1BTkQsCisgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfRU5EX1JBTkdFID0gVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UsCisgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfUkFOR0VfU0laRSA9IChWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSAtIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0NPTU1BTkQgKyAxKSwKKyAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGU7CisKK3R5cGVkZWYgZW51bSBWa0ludGVybmFsQWxsb2NhdGlvblR5cGUgeworICAgIFZLX0lOVEVSTkFMX0FMTE9DQVRJT05fVFlQRV9FWEVDVVRBQkxFID0gMCwKKyAgICBWS19JTlRFUk5BTF9BTExPQ0FUSU9OX1RZUEVfQkVHSU5fUkFOR0UgPSBWS19JTlRFUk5BTF9BTExPQ0FUSU9OX1RZUEVfRVhFQ1VUQUJMRSwKKyAgICBWS19JTlRFUk5BTF9BTExPQ0FUSU9OX1RZUEVfRU5EX1JBTkdFID0gVktfSU5URVJOQUxfQUxMT0NBVElPTl9UWVBFX0VYRUNVVEFCTEUsCisgICAgVktfSU5URVJOQUxfQUxMT0NBVElPTl9UWVBFX1JBTkdFX1NJWkUgPSAoVktfSU5URVJOQUxfQUxMT0NBVElPTl9UWVBFX0VYRUNVVEFCTEUgLSBWS19JTlRFUk5BTF9BTExPQ0FUSU9OX1RZUEVfRVhFQ1VUQUJMRSArIDEpLAorICAgIFZLX0lOVEVSTkFMX0FMTE9DQVRJT05fVFlQRV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtJbnRlcm5hbEFsbG9jYXRpb25UeXBlOworCit0eXBlZGVmIGVudW0gVmtGb3JtYXQgeworICAgIFZLX0ZPUk1BVF9VTkRFRklORUQgPSAwLAorICAgIFZLX0ZPUk1BVF9SNEc0X1VOT1JNX1BBQ0s4ID0gMSwKKyAgICBWS19GT1JNQVRfUjRHNEI0QTRfVU5PUk1fUEFDSzE2ID0gMiwKKyAgICBWS19GT1JNQVRfQjRHNFI0QTRfVU5PUk1fUEFDSzE2ID0gMywKKyAgICBWS19GT1JNQVRfUjVHNkI1X1VOT1JNX1BBQ0sxNiA9IDQsCisgICAgVktfRk9STUFUX0I1RzZSNV9VTk9STV9QQUNLMTYgPSA1LAorICAgIFZLX0ZPUk1BVF9SNUc1QjVBMV9VTk9STV9QQUNLMTYgPSA2LAorICAgIFZLX0ZPUk1BVF9CNUc1UjVBMV9VTk9STV9QQUNLMTYgPSA3LAorICAgIFZLX0ZPUk1BVF9BMVI1RzVCNV9VTk9STV9QQUNLMTYgPSA4LAorICAgIFZLX0ZPUk1BVF9SOF9VTk9STSA9IDksCisgICAgVktfRk9STUFUX1I4X1NOT1JNID0gMTAsCisgICAgVktfRk9STUFUX1I4X1VTQ0FMRUQgPSAxMSwKKyAgICBWS19GT1JNQVRfUjhfU1NDQUxFRCA9IDEyLAorICAgIFZLX0ZPUk1BVF9SOF9VSU5UID0gMTMsCisgICAgVktfRk9STUFUX1I4X1NJTlQgPSAxNCwKKyAgICBWS19GT1JNQVRfUjhfU1JHQiA9IDE1LAorICAgIFZLX0ZPUk1BVF9SOEc4X1VOT1JNID0gMTYsCisgICAgVktfRk9STUFUX1I4RzhfU05PUk0gPSAxNywKKyAgICBWS19GT1JNQVRfUjhHOF9VU0NBTEVEID0gMTgsCisgICAgVktfRk9STUFUX1I4RzhfU1NDQUxFRCA9IDE5LAorICAgIFZLX0ZPUk1BVF9SOEc4X1VJTlQgPSAyMCwKKyAgICBWS19GT1JNQVRfUjhHOF9TSU5UID0gMjEsCisgICAgVktfRk9STUFUX1I4RzhfU1JHQiA9IDIyLAorICAgIFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk0gPSAyMywKKyAgICBWS19GT1JNQVRfUjhHOEI4X1NOT1JNID0gMjQsCisgICAgVktfRk9STUFUX1I4RzhCOF9VU0NBTEVEID0gMjUsCisgICAgVktfRk9STUFUX1I4RzhCOF9TU0NBTEVEID0gMjYsCisgICAgVktfRk9STUFUX1I4RzhCOF9VSU5UID0gMjcsCisgICAgVktfRk9STUFUX1I4RzhCOF9TSU5UID0gMjgsCisgICAgVktfRk9STUFUX1I4RzhCOF9TUkdCID0gMjksCisgICAgVktfRk9STUFUX0I4RzhSOF9VTk9STSA9IDMwLAorICAgIFZLX0ZPUk1BVF9COEc4UjhfU05PUk0gPSAzMSwKKyAgICBWS19GT1JNQVRfQjhHOFI4X1VTQ0FMRUQgPSAzMiwKKyAgICBWS19GT1JNQVRfQjhHOFI4X1NTQ0FMRUQgPSAzMywKKyAgICBWS19GT1JNQVRfQjhHOFI4X1VJTlQgPSAzNCwKKyAgICBWS19GT1JNQVRfQjhHOFI4X1NJTlQgPSAzNSwKKyAgICBWS19GT1JNQVRfQjhHOFI4X1NSR0IgPSAzNiwKKyAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0gPSAzNywKKyAgICBWS19GT1JNQVRfUjhHOEI4QThfU05PUk0gPSAzOCwKKyAgICBWS19GT1JNQVRfUjhHOEI4QThfVVNDQUxFRCA9IDM5LAorICAgIFZLX0ZPUk1BVF9SOEc4QjhBOF9TU0NBTEVEID0gNDAsCisgICAgVktfRk9STUFUX1I4RzhCOEE4X1VJTlQgPSA0MSwKKyAgICBWS19GT1JNQVRfUjhHOEI4QThfU0lOVCA9IDQyLAorICAgIFZLX0ZPUk1BVF9SOEc4QjhBOF9TUkdCID0gNDMsCisgICAgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNID0gNDQsCisgICAgVktfRk9STUFUX0I4RzhSOEE4X1NOT1JNID0gNDUsCisgICAgVktfRk9STUFUX0I4RzhSOEE4X1VTQ0FMRUQgPSA0NiwKKyAgICBWS19GT1JNQVRfQjhHOFI4QThfU1NDQUxFRCA9IDQ3LAorICAgIFZLX0ZPUk1BVF9COEc4UjhBOF9VSU5UID0gNDgsCisgICAgVktfRk9STUFUX0I4RzhSOEE4X1NJTlQgPSA0OSwKKyAgICBWS19GT1JNQVRfQjhHOFI4QThfU1JHQiA9IDUwLAorICAgIFZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzIgPSA1MSwKKyAgICBWS19GT1JNQVRfQThCOEc4UjhfU05PUk1fUEFDSzMyID0gNTIsCisgICAgVktfRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyID0gNTMsCisgICAgVktfRk9STUFUX0E4QjhHOFI4X1NTQ0FMRURfUEFDSzMyID0gNTQsCisgICAgVktfRk9STUFUX0E4QjhHOFI4X1VJTlRfUEFDSzMyID0gNTUsCisgICAgVktfRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyID0gNTYsCisgICAgVktfRk9STUFUX0E4QjhHOFI4X1NSR0JfUEFDSzMyID0gNTcsCisgICAgVktfRk9STUFUX0EyUjEwRzEwQjEwX1VOT1JNX1BBQ0szMiA9IDU4LAorICAgIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TTk9STV9QQUNLMzIgPSA1OSwKKyAgICBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVVNDQUxFRF9QQUNLMzIgPSA2MCwKKyAgICBWS19GT1JNQVRfQTJSMTBHMTBCMTBfU1NDQUxFRF9QQUNLMzIgPSA2MSwKKyAgICBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVUlOVF9QQUNLMzIgPSA2MiwKKyAgICBWS19GT1JNQVRfQTJSMTBHMTBCMTBfU0lOVF9QQUNLMzIgPSA2MywKKyAgICBWS19GT1JNQVRfQTJCMTBHMTBSMTBfVU5PUk1fUEFDSzMyID0gNjQsCisgICAgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMiA9IDY1LAorICAgIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMiA9IDY2LAorICAgIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TU0NBTEVEX1BBQ0szMiA9IDY3LAorICAgIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VSU5UX1BBQ0szMiA9IDY4LAorICAgIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TSU5UX1BBQ0szMiA9IDY5LAorICAgIFZLX0ZPUk1BVF9SMTZfVU5PUk0gPSA3MCwKKyAgICBWS19GT1JNQVRfUjE2X1NOT1JNID0gNzEsCisgICAgVktfRk9STUFUX1IxNl9VU0NBTEVEID0gNzIsCisgICAgVktfRk9STUFUX1IxNl9TU0NBTEVEID0gNzMsCisgICAgVktfRk9STUFUX1IxNl9VSU5UID0gNzQsCisgICAgVktfRk9STUFUX1IxNl9TSU5UID0gNzUsCisgICAgVktfRk9STUFUX1IxNl9TRkxPQVQgPSA3NiwKKyAgICBWS19GT1JNQVRfUjE2RzE2X1VOT1JNID0gNzcsCisgICAgVktfRk9STUFUX1IxNkcxNl9TTk9STSA9IDc4LAorICAgIFZLX0ZPUk1BVF9SMTZHMTZfVVNDQUxFRCA9IDc5LAorICAgIFZLX0ZPUk1BVF9SMTZHMTZfU1NDQUxFRCA9IDgwLAorICAgIFZLX0ZPUk1BVF9SMTZHMTZfVUlOVCA9IDgxLAorICAgIFZLX0ZPUk1BVF9SMTZHMTZfU0lOVCA9IDgyLAorICAgIFZLX0ZPUk1BVF9SMTZHMTZfU0ZMT0FUID0gODMsCisgICAgVktfRk9STUFUX1IxNkcxNkIxNl9VTk9STSA9IDg0LAorICAgIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU05PUk0gPSA4NSwKKyAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQgPSA4NiwKKyAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1NTQ0FMRUQgPSA4NywKKyAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1VJTlQgPSA4OCwKKyAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlQgPSA4OSwKKyAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1NGTE9BVCA9IDkwLAorICAgIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk0gPSA5MSwKKyAgICBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNID0gOTIsCisgICAgVktfRk9STUFUX1IxNkcxNkIxNkExNl9VU0NBTEVEID0gOTMsCisgICAgVktfRk9STUFUX1IxNkcxNkIxNkExNl9TU0NBTEVEID0gOTQsCisgICAgVktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UID0gOTUsCisgICAgVktfRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UID0gOTYsCisgICAgVktfRk9STUFUX1IxNkcxNkIxNkExNl9TRkxPQVQgPSA5NywKKyAgICBWS19GT1JNQVRfUjMyX1VJTlQgPSA5OCwKKyAgICBWS19GT1JNQVRfUjMyX1NJTlQgPSA5OSwKKyAgICBWS19GT1JNQVRfUjMyX1NGTE9BVCA9IDEwMCwKKyAgICBWS19GT1JNQVRfUjMyRzMyX1VJTlQgPSAxMDEsCisgICAgVktfRk9STUFUX1IzMkczMl9TSU5UID0gMTAyLAorICAgIFZLX0ZPUk1BVF9SMzJHMzJfU0ZMT0FUID0gMTAzLAorICAgIFZLX0ZPUk1BVF9SMzJHMzJCMzJfVUlOVCA9IDEwNCwKKyAgICBWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlQgPSAxMDUsCisgICAgVktfRk9STUFUX1IzMkczMkIzMl9TRkxPQVQgPSAxMDYsCisgICAgVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5UID0gMTA3LAorICAgIFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVCA9IDEwOCwKKyAgICBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVCA9IDEwOSwKKyAgICBWS19GT1JNQVRfUjY0X1VJTlQgPSAxMTAsCisgICAgVktfRk9STUFUX1I2NF9TSU5UID0gMTExLAorICAgIFZLX0ZPUk1BVF9SNjRfU0ZMT0FUID0gMTEyLAorICAgIFZLX0ZPUk1BVF9SNjRHNjRfVUlOVCA9IDExMywKKyAgICBWS19GT1JNQVRfUjY0RzY0X1NJTlQgPSAxMTQsCisgICAgVktfRk9STUFUX1I2NEc2NF9TRkxPQVQgPSAxMTUsCisgICAgVktfRk9STUFUX1I2NEc2NEI2NF9VSU5UID0gMTE2LAorICAgIFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0lOVCA9IDExNywKKyAgICBWS19GT1JNQVRfUjY0RzY0QjY0X1NGTE9BVCA9IDExOCwKKyAgICBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1VJTlQgPSAxMTksCisgICAgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TSU5UID0gMTIwLAorICAgIFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0ZMT0FUID0gMTIxLAorICAgIFZLX0ZPUk1BVF9CMTBHMTFSMTFfVUZMT0FUX1BBQ0szMiA9IDEyMiwKKyAgICBWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMiA9IDEyMywKKyAgICBWS19GT1JNQVRfRDE2X1VOT1JNID0gMTI0LAorICAgIFZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyID0gMTI1LAorICAgIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUID0gMTI2LAorICAgIFZLX0ZPUk1BVF9TOF9VSU5UID0gMTI3LAorICAgIFZLX0ZPUk1BVF9EMTZfVU5PUk1fUzhfVUlOVCA9IDEyOCwKKyAgICBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQgPSAxMjksCisgICAgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVCA9IDEzMCwKKyAgICBWS19GT1JNQVRfQkMxX1JHQl9VTk9STV9CTE9DSyA9IDEzMSwKKyAgICBWS19GT1JNQVRfQkMxX1JHQl9TUkdCX0JMT0NLID0gMTMyLAorICAgIFZLX0ZPUk1BVF9CQzFfUkdCQV9VTk9STV9CTE9DSyA9IDEzMywKKyAgICBWS19GT1JNQVRfQkMxX1JHQkFfU1JHQl9CTE9DSyA9IDEzNCwKKyAgICBWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLID0gMTM1LAorICAgIFZLX0ZPUk1BVF9CQzJfU1JHQl9CTE9DSyA9IDEzNiwKKyAgICBWS19GT1JNQVRfQkMzX1VOT1JNX0JMT0NLID0gMTM3LAorICAgIFZLX0ZPUk1BVF9CQzNfU1JHQl9CTE9DSyA9IDEzOCwKKyAgICBWS19GT1JNQVRfQkM0X1VOT1JNX0JMT0NLID0gMTM5LAorICAgIFZLX0ZPUk1BVF9CQzRfU05PUk1fQkxPQ0sgPSAxNDAsCisgICAgVktfRk9STUFUX0JDNV9VTk9STV9CTE9DSyA9IDE0MSwKKyAgICBWS19GT1JNQVRfQkM1X1NOT1JNX0JMT0NLID0gMTQyLAorICAgIFZLX0ZPUk1BVF9CQzZIX1VGTE9BVF9CTE9DSyA9IDE0MywKKyAgICBWS19GT1JNQVRfQkM2SF9TRkxPQVRfQkxPQ0sgPSAxNDQsCisgICAgVktfRk9STUFUX0JDN19VTk9STV9CTE9DSyA9IDE0NSwKKyAgICBWS19GT1JNQVRfQkM3X1NSR0JfQkxPQ0sgPSAxNDYsCisgICAgVktfRk9STUFUX0VUQzJfUjhHOEI4X1VOT1JNX0JMT0NLID0gMTQ3LAorICAgIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9TUkdCX0JMT0NLID0gMTQ4LAorICAgIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1VOT1JNX0JMT0NLID0gMTQ5LAorICAgIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1NSR0JfQkxPQ0sgPSAxNTAsCisgICAgVktfRk9STUFUX0VUQzJfUjhHOEI4QThfVU5PUk1fQkxPQ0sgPSAxNTEsCisgICAgVktfRk9STUFUX0VUQzJfUjhHOEI4QThfU1JHQl9CTE9DSyA9IDE1MiwKKyAgICBWS19GT1JNQVRfRUFDX1IxMV9VTk9STV9CTE9DSyA9IDE1MywKKyAgICBWS19GT1JNQVRfRUFDX1IxMV9TTk9STV9CTE9DSyA9IDE1NCwKKyAgICBWS19GT1JNQVRfRUFDX1IxMUcxMV9VTk9STV9CTE9DSyA9IDE1NSwKKyAgICBWS19GT1JNQVRfRUFDX1IxMUcxMV9TTk9STV9CTE9DSyA9IDE1NiwKKyAgICBWS19GT1JNQVRfQVNUQ180eDRfVU5PUk1fQkxPQ0sgPSAxNTcsCisgICAgVktfRk9STUFUX0FTVENfNHg0X1NSR0JfQkxPQ0sgPSAxNTgsCisgICAgVktfRk9STUFUX0FTVENfNXg0X1VOT1JNX0JMT0NLID0gMTU5LAorICAgIFZLX0ZPUk1BVF9BU1RDXzV4NF9TUkdCX0JMT0NLID0gMTYwLAorICAgIFZLX0ZPUk1BVF9BU1RDXzV4NV9VTk9STV9CTE9DSyA9IDE2MSwKKyAgICBWS19GT1JNQVRfQVNUQ181eDVfU1JHQl9CTE9DSyA9IDE2MiwKKyAgICBWS19GT1JNQVRfQVNUQ182eDVfVU5PUk1fQkxPQ0sgPSAxNjMsCisgICAgVktfRk9STUFUX0FTVENfNng1X1NSR0JfQkxPQ0sgPSAxNjQsCisgICAgVktfRk9STUFUX0FTVENfNng2X1VOT1JNX0JMT0NLID0gMTY1LAorICAgIFZLX0ZPUk1BVF9BU1RDXzZ4Nl9TUkdCX0JMT0NLID0gMTY2LAorICAgIFZLX0ZPUk1BVF9BU1RDXzh4NV9VTk9STV9CTE9DSyA9IDE2NywKKyAgICBWS19GT1JNQVRfQVNUQ184eDVfU1JHQl9CTE9DSyA9IDE2OCwKKyAgICBWS19GT1JNQVRfQVNUQ184eDZfVU5PUk1fQkxPQ0sgPSAxNjksCisgICAgVktfRk9STUFUX0FTVENfOHg2X1NSR0JfQkxPQ0sgPSAxNzAsCisgICAgVktfRk9STUFUX0FTVENfOHg4X1VOT1JNX0JMT0NLID0gMTcxLAorICAgIFZLX0ZPUk1BVF9BU1RDXzh4OF9TUkdCX0JMT0NLID0gMTcyLAorICAgIFZLX0ZPUk1BVF9BU1RDXzEweDVfVU5PUk1fQkxPQ0sgPSAxNzMsCisgICAgVktfRk9STUFUX0FTVENfMTB4NV9TUkdCX0JMT0NLID0gMTc0LAorICAgIFZLX0ZPUk1BVF9BU1RDXzEweDZfVU5PUk1fQkxPQ0sgPSAxNzUsCisgICAgVktfRk9STUFUX0FTVENfMTB4Nl9TUkdCX0JMT0NLID0gMTc2LAorICAgIFZLX0ZPUk1BVF9BU1RDXzEweDhfVU5PUk1fQkxPQ0sgPSAxNzcsCisgICAgVktfRk9STUFUX0FTVENfMTB4OF9TUkdCX0JMT0NLID0gMTc4LAorICAgIFZLX0ZPUk1BVF9BU1RDXzEweDEwX1VOT1JNX0JMT0NLID0gMTc5LAorICAgIFZLX0ZPUk1BVF9BU1RDXzEweDEwX1NSR0JfQkxPQ0sgPSAxODAsCisgICAgVktfRk9STUFUX0FTVENfMTJ4MTBfVU5PUk1fQkxPQ0sgPSAxODEsCisgICAgVktfRk9STUFUX0FTVENfMTJ4MTBfU1JHQl9CTE9DSyA9IDE4MiwKKyAgICBWS19GT1JNQVRfQVNUQ18xMngxMl9VTk9STV9CTE9DSyA9IDE4MywKKyAgICBWS19GT1JNQVRfQVNUQ18xMngxMl9TUkdCX0JMT0NLID0gMTg0LAorICAgIFZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk0gPSAxMDAwMTU2MDAwLAorICAgIFZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk0gPSAxMDAwMTU2MDAxLAorICAgIFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNID0gMTAwMDE1NjAwMiwKKyAgICBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIwX1VOT1JNID0gMTAwMDE1NjAwMywKKyAgICBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMl9VTk9STSA9IDEwMDAxNTYwMDQsCisgICAgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STSA9IDEwMDAxNTYwMDUsCisgICAgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80NDRfVU5PUk0gPSAxMDAwMTU2MDA2LAorICAgIFZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTYgPSAxMDAwMTU2MDA3LAorICAgIFZLX0ZPUk1BVF9SMTBYNkcxMFg2X1VOT1JNXzJQQUNLMTYgPSAxMDAwMTU2MDA4LAorICAgIFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2ID0gMTAwMDE1NjAwOSwKKyAgICBWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTYgPSAxMDAwMTU2MDEwLAorICAgIFZLX0ZPUk1BVF9CMTBYNkcxMFg2UjEwWDZHMTBYNl80MjJfVU5PUk1fNFBBQ0sxNiA9IDEwMDAxNTYwMTEsCisgICAgVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiA9IDEwMDAxNTYwMTIsCisgICAgVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2ID0gMTAwMDE1NjAxMywKKyAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2ID0gMTAwMDE1NjAxNCwKKyAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYgPSAxMDAwMTU2MDE1LAorICAgIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYgPSAxMDAwMTU2MDE2LAorICAgIFZLX0ZPUk1BVF9SMTJYNF9VTk9STV9QQUNLMTYgPSAxMDAwMTU2MDE3LAorICAgIFZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTYgPSAxMDAwMTU2MDE4LAorICAgIFZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2ID0gMTAwMDE1NjAxOSwKKyAgICBWS19GT1JNQVRfRzEyWDRCMTJYNEcxMlg0UjEyWDRfNDIyX1VOT1JNXzRQQUNLMTYgPSAxMDAwMTU2MDIwLAorICAgIFZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNiA9IDEwMDAxNTYwMjEsCisgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiA9IDEwMDAxNTYwMjIsCisgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2ID0gMTAwMDE1NjAyMywKKyAgICBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2ID0gMTAwMDE1NjAyNCwKKyAgICBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYgPSAxMDAwMTU2MDI1LAorICAgIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYgPSAxMDAwMTU2MDI2LAorICAgIFZLX0ZPUk1BVF9HMTZCMTZHMTZSMTZfNDIyX1VOT1JNID0gMTAwMDE1NjAyNywKKyAgICBWS19GT1JNQVRfQjE2RzE2UjE2RzE2XzQyMl9VTk9STSA9IDEwMDAxNTYwMjgsCisgICAgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk0gPSAxMDAwMTU2MDI5LAorICAgIFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjBfVU5PUk0gPSAxMDAwMTU2MDMwLAorICAgIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIyX1VOT1JNID0gMTAwMDE1NjAzMSwKKyAgICBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNID0gMTAwMDE1NjAzMiwKKyAgICBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STSA9IDEwMDAxNTYwMzMsCisgICAgVktfRk9STUFUX1BWUlRDMV8yQlBQX1VOT1JNX0JMT0NLX0lNRyA9IDEwMDAwNTQwMDAsCisgICAgVktfRk9STUFUX1BWUlRDMV80QlBQX1VOT1JNX0JMT0NLX0lNRyA9IDEwMDAwNTQwMDEsCisgICAgVktfRk9STUFUX1BWUlRDMl8yQlBQX1VOT1JNX0JMT0NLX0lNRyA9IDEwMDAwNTQwMDIsCisgICAgVktfRk9STUFUX1BWUlRDMl80QlBQX1VOT1JNX0JMT0NLX0lNRyA9IDEwMDAwNTQwMDMsCisgICAgVktfRk9STUFUX1BWUlRDMV8yQlBQX1NSR0JfQkxPQ0tfSU1HID0gMTAwMDA1NDAwNCwKKyAgICBWS19GT1JNQVRfUFZSVEMxXzRCUFBfU1JHQl9CTE9DS19JTUcgPSAxMDAwMDU0MDA1LAorICAgIFZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9TUkdCX0JMT0NLX0lNRyA9IDEwMDAwNTQwMDYsCisgICAgVktfRk9STUFUX1BWUlRDMl80QlBQX1NSR0JfQkxPQ0tfSU1HID0gMTAwMDA1NDAwNywKKyAgICBWS19GT1JNQVRfQVNUQ180eDRfU0ZMT0FUX0JMT0NLX0VYVCA9IDEwMDAwNjYwMDAsCisgICAgVktfRk9STUFUX0FTVENfNXg0X1NGTE9BVF9CTE9DS19FWFQgPSAxMDAwMDY2MDAxLAorICAgIFZLX0ZPUk1BVF9BU1RDXzV4NV9TRkxPQVRfQkxPQ0tfRVhUID0gMTAwMDA2NjAwMiwKKyAgICBWS19GT1JNQVRfQVNUQ182eDVfU0ZMT0FUX0JMT0NLX0VYVCA9IDEwMDAwNjYwMDMsCisgICAgVktfRk9STUFUX0FTVENfNng2X1NGTE9BVF9CTE9DS19FWFQgPSAxMDAwMDY2MDA0LAorICAgIFZLX0ZPUk1BVF9BU1RDXzh4NV9TRkxPQVRfQkxPQ0tfRVhUID0gMTAwMDA2NjAwNSwKKyAgICBWS19GT1JNQVRfQVNUQ184eDZfU0ZMT0FUX0JMT0NLX0VYVCA9IDEwMDAwNjYwMDYsCisgICAgVktfRk9STUFUX0FTVENfOHg4X1NGTE9BVF9CTE9DS19FWFQgPSAxMDAwMDY2MDA3LAorICAgIFZLX0ZPUk1BVF9BU1RDXzEweDVfU0ZMT0FUX0JMT0NLX0VYVCA9IDEwMDAwNjYwMDgsCisgICAgVktfRk9STUFUX0FTVENfMTB4Nl9TRkxPQVRfQkxPQ0tfRVhUID0gMTAwMDA2NjAwOSwKKyAgICBWS19GT1JNQVRfQVNUQ18xMHg4X1NGTE9BVF9CTE9DS19FWFQgPSAxMDAwMDY2MDEwLAorICAgIFZLX0ZPUk1BVF9BU1RDXzEweDEwX1NGTE9BVF9CTE9DS19FWFQgPSAxMDAwMDY2MDExLAorICAgIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NGTE9BVF9CTE9DS19FWFQgPSAxMDAwMDY2MDEyLAorICAgIFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1NGTE9BVF9CTE9DS19FWFQgPSAxMDAwMDY2MDEzLAorICAgIFZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk1fS0hSID0gVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STSwKKyAgICBWS19GT1JNQVRfQjhHOFI4RzhfNDIyX1VOT1JNX0tIUiA9IFZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk0sCisgICAgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk1fS0hSID0gVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk0sCisgICAgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMF9VTk9STV9LSFIgPSBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIwX1VOT1JNLAorICAgIFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNX0tIUiA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNLAorICAgIFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjJfVU5PUk1fS0hSID0gVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STSwKKyAgICBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STV9LSFIgPSBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STSwKKyAgICBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2X0tIUiA9IFZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTYsCisgICAgVktfRk9STUFUX1IxMFg2RzEwWDZfVU5PUk1fMlBBQ0sxNl9LSFIgPSBWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2LAorICAgIFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2X0tIUiA9IFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2LAorICAgIFZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNl9LSFIgPSBWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTYsCisgICAgVktfRk9STUFUX0IxMFg2RzEwWDZSMTBYNkcxMFg2XzQyMl9VTk9STV80UEFDSzE2X0tIUiA9IFZLX0ZPUk1BVF9CMTBYNkcxMFg2UjEwWDZHMTBYNl80MjJfVU5PUk1fNFBBQ0sxNiwKKyAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUiA9IFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYsCisgICAgVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUiA9IFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiwKKyAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUiA9IFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsCisgICAgVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUiA9IFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiwKKyAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2X0tIUiA9IFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYsCisgICAgVktfRk9STUFUX1IxMlg0X1VOT1JNX1BBQ0sxNl9LSFIgPSBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2LAorICAgIFZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTZfS0hSID0gVktfRk9STUFUX1IxMlg0RzEyWDRfVU5PUk1fMlBBQ0sxNiwKKyAgICBWS19GT1JNQVRfUjEyWDRHMTJYNEIxMlg0QTEyWDRfVU5PUk1fNFBBQ0sxNl9LSFIgPSBWS19GT1JNQVRfUjEyWDRHMTJYNEIxMlg0QTEyWDRfVU5PUk1fNFBBQ0sxNiwKKyAgICBWS19GT1JNQVRfRzEyWDRCMTJYNEcxMlg0UjEyWDRfNDIyX1VOT1JNXzRQQUNLMTZfS0hSID0gVktfRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2LAorICAgIFZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNl9LSFIgPSBWS19GT1JNQVRfQjEyWDRHMTJYNFIxMlg0RzEyWDRfNDIyX1VOT1JNXzRQQUNLMTYsCisgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFIgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2LAorICAgIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFIgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYsCisgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFIgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2LAorICAgIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFIgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsCisgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNl9LSFIgPSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2LAorICAgIFZLX0ZPUk1BVF9HMTZCMTZHMTZSMTZfNDIyX1VOT1JNX0tIUiA9IFZLX0ZPUk1BVF9HMTZCMTZHMTZSMTZfNDIyX1VOT1JNLAorICAgIFZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNX0tIUiA9IFZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNLAorICAgIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNX0tIUiA9IFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNLAorICAgIFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjBfVU5PUk1fS0hSID0gVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STSwKKyAgICBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STV9LSFIgPSBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STSwKKyAgICBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNX0tIUiA9IFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjJfVU5PUk0sCisgICAgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80NDRfVU5PUk1fS0hSID0gVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80NDRfVU5PUk0sCisgICAgVktfRk9STUFUX0JFR0lOX1JBTkdFID0gVktfRk9STUFUX1VOREVGSU5FRCwKKyAgICBWS19GT1JNQVRfRU5EX1JBTkdFID0gVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSywKKyAgICBWS19GT1JNQVRfUkFOR0VfU0laRSA9IChWS19GT1JNQVRfQVNUQ18xMngxMl9TUkdCX0JMT0NLIC0gVktfRk9STUFUX1VOREVGSU5FRCArIDEpLAorICAgIFZLX0ZPUk1BVF9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtGb3JtYXQ7CisKK3R5cGVkZWYgZW51bSBWa0ltYWdlVHlwZSB7CisgICAgVktfSU1BR0VfVFlQRV8xRCA9IDAsCisgICAgVktfSU1BR0VfVFlQRV8yRCA9IDEsCisgICAgVktfSU1BR0VfVFlQRV8zRCA9IDIsCisgICAgVktfSU1BR0VfVFlQRV9CRUdJTl9SQU5HRSA9IFZLX0lNQUdFX1RZUEVfMUQsCisgICAgVktfSU1BR0VfVFlQRV9FTkRfUkFOR0UgPSBWS19JTUFHRV9UWVBFXzNELAorICAgIFZLX0lNQUdFX1RZUEVfUkFOR0VfU0laRSA9IChWS19JTUFHRV9UWVBFXzNEIC0gVktfSU1BR0VfVFlQRV8xRCArIDEpLAorICAgIFZLX0lNQUdFX1RZUEVfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrSW1hZ2VUeXBlOworCit0eXBlZGVmIGVudW0gVmtJbWFnZVRpbGluZyB7CisgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwgPSAwLAorICAgIFZLX0lNQUdFX1RJTElOR19MSU5FQVIgPSAxLAorICAgIFZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVCA9IDEwMDAxNTgwMDAsCisgICAgVktfSU1BR0VfVElMSU5HX0JFR0lOX1JBTkdFID0gVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgVktfSU1BR0VfVElMSU5HX0VORF9SQU5HRSA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVIsCisgICAgVktfSU1BR0VfVElMSU5HX1JBTkdFX1NJWkUgPSAoVktfSU1BR0VfVElMSU5HX0xJTkVBUiAtIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMICsgMSksCisgICAgVktfSU1BR0VfVElMSU5HX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0ltYWdlVGlsaW5nOworCit0eXBlZGVmIGVudW0gVmtQaHlzaWNhbERldmljZVR5cGUgeworICAgIFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX09USEVSID0gMCwKKyAgICBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9JTlRFR1JBVEVEX0dQVSA9IDEsCisgICAgVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfRElTQ1JFVEVfR1BVID0gMiwKKyAgICBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9WSVJUVUFMX0dQVSA9IDMsCisgICAgVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfQ1BVID0gNCwKKyAgICBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9CRUdJTl9SQU5HRSA9IFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX09USEVSLAorICAgIFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0VORF9SQU5HRSA9IFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0NQVSwKKyAgICBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9SQU5HRV9TSVpFID0gKFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0NQVSAtIFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX09USEVSICsgMSksCisgICAgVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrUGh5c2ljYWxEZXZpY2VUeXBlOworCit0eXBlZGVmIGVudW0gVmtRdWVyeVR5cGUgeworICAgIFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OID0gMCwKKyAgICBWS19RVUVSWV9UWVBFX1BJUEVMSU5FX1NUQVRJU1RJQ1MgPSAxLAorICAgIFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QID0gMiwKKyAgICBWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUID0gMTAwMDAyODAwNCwKKyAgICBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiA9IDEwMDAxMTYwMDAsCisgICAgVktfUVVFUllfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NPTVBBQ1RFRF9TSVpFX05WID0gMTAwMDE2NTAwMCwKKyAgICBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0lOVEVMID0gMTAwMDIxMDAwMCwKKyAgICBWS19RVUVSWV9UWVBFX0JFR0lOX1JBTkdFID0gVktfUVVFUllfVFlQRV9PQ0NMVVNJT04sCisgICAgVktfUVVFUllfVFlQRV9FTkRfUkFOR0UgPSBWS19RVUVSWV9UWVBFX1RJTUVTVEFNUCwKKyAgICBWS19RVUVSWV9UWVBFX1JBTkdFX1NJWkUgPSAoVktfUVVFUllfVFlQRV9USU1FU1RBTVAgLSBWS19RVUVSWV9UWVBFX09DQ0xVU0lPTiArIDEpLAorICAgIFZLX1FVRVJZX1RZUEVfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrUXVlcnlUeXBlOworCit0eXBlZGVmIGVudW0gVmtTaGFyaW5nTW9kZSB7CisgICAgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSA9IDAsCisgICAgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQgPSAxLAorICAgIFZLX1NIQVJJTkdfTU9ERV9CRUdJTl9SQU5HRSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgVktfU0hBUklOR19NT0RFX0VORF9SQU5HRSA9IFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5ULAorICAgIFZLX1NIQVJJTkdfTU9ERV9SQU5HRV9TSVpFID0gKFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UIC0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSArIDEpLAorICAgIFZLX1NIQVJJTkdfTU9ERV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTaGFyaW5nTW9kZTsKKwordHlwZWRlZiBlbnVtIFZrSW1hZ2VMYXlvdXQgeworICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgPSAwLAorICAgIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMID0gMSwKKyAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMID0gMiwKKyAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwgPSAzLAorICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMID0gNCwKKyAgICBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMID0gNSwKKyAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwgPSA2LAorICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCA9IDcsCisgICAgVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEID0gOCwKKyAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMID0gMTAwMDExNzAwMCwKKyAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMID0gMTAwMDExNzAwMSwKKyAgICBWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSID0gMTAwMDAwMTAwMiwKKyAgICBWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSID0gMTAwMDExMTAwMCwKKyAgICBWS19JTUFHRV9MQVlPVVRfU0hBRElOR19SQVRFX09QVElNQUxfTlYgPSAxMDAwMTY0MDAzLAorICAgIFZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVCA9IDEwMDAyMTgwMDAsCisgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgPSAxMDAwMjQxMDAwLAorICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgPSAxMDAwMjQxMDAxLAorICAgIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgPSAxMDAwMjQxMDAyLAorICAgIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiA9IDEwMDAyNDEwMDMsCisgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwKKyAgICBWS19JTUFHRV9MQVlPVVRfQkVHSU5fUkFOR0UgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELAorICAgIFZLX0lNQUdFX0xBWU9VVF9FTkRfUkFOR0UgPSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQsCisgICAgVktfSU1BR0VfTEFZT1VUX1JBTkdFX1NJWkUgPSAoVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEIC0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCArIDEpLAorICAgIFZLX0lNQUdFX0xBWU9VVF9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtJbWFnZUxheW91dDsKKwordHlwZWRlZiBlbnVtIFZrSW1hZ2VWaWV3VHlwZSB7CisgICAgVktfSU1BR0VfVklFV19UWVBFXzFEID0gMCwKKyAgICBWS19JTUFHRV9WSUVXX1RZUEVfMkQgPSAxLAorICAgIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCA9IDIsCisgICAgVktfSU1BR0VfVklFV19UWVBFX0NVQkUgPSAzLAorICAgIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWSA9IDQsCisgICAgVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZID0gNSwKKyAgICBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSA9IDYsCisgICAgVktfSU1BR0VfVklFV19UWVBFX0JFR0lOX1JBTkdFID0gVktfSU1BR0VfVklFV19UWVBFXzFELAorICAgIFZLX0lNQUdFX1ZJRVdfVFlQRV9FTkRfUkFOR0UgPSBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwKKyAgICBWS19JTUFHRV9WSUVXX1RZUEVfUkFOR0VfU0laRSA9IChWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSAtIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRCArIDEpLAorICAgIFZLX0lNQUdFX1ZJRVdfVFlQRV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtJbWFnZVZpZXdUeXBlOworCit0eXBlZGVmIGVudW0gVmtDb21wb25lbnRTd2l6emxlIHsKKyAgICBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSA9IDAsCisgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfWkVSTyA9IDEsCisgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfT05FID0gMiwKKyAgICBWS19DT01QT05FTlRfU1dJWlpMRV9SID0gMywKKyAgICBWS19DT01QT05FTlRfU1dJWlpMRV9HID0gNCwKKyAgICBWS19DT01QT05FTlRfU1dJWlpMRV9CID0gNSwKKyAgICBWS19DT01QT05FTlRfU1dJWlpMRV9BID0gNiwKKyAgICBWS19DT01QT05FTlRfU1dJWlpMRV9CRUdJTl9SQU5HRSA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgIFZLX0NPTVBPTkVOVF9TV0laWkxFX0VORF9SQU5HRSA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0EsCisgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfUkFOR0VfU0laRSA9IChWS19DT01QT05FTlRfU1dJWlpMRV9BIC0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkgKyAxKSwKKyAgICBWS19DT01QT05FTlRfU1dJWlpMRV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtDb21wb25lbnRTd2l6emxlOworCit0eXBlZGVmIGVudW0gVmtWZXJ0ZXhJbnB1dFJhdGUgeworICAgIFZLX1ZFUlRFWF9JTlBVVF9SQVRFX1ZFUlRFWCA9IDAsCisgICAgVktfVkVSVEVYX0lOUFVUX1JBVEVfSU5TVEFOQ0UgPSAxLAorICAgIFZLX1ZFUlRFWF9JTlBVVF9SQVRFX0JFR0lOX1JBTkdFID0gVktfVkVSVEVYX0lOUFVUX1JBVEVfVkVSVEVYLAorICAgIFZLX1ZFUlRFWF9JTlBVVF9SQVRFX0VORF9SQU5HRSA9IFZLX1ZFUlRFWF9JTlBVVF9SQVRFX0lOU1RBTkNFLAorICAgIFZLX1ZFUlRFWF9JTlBVVF9SQVRFX1JBTkdFX1NJWkUgPSAoVktfVkVSVEVYX0lOUFVUX1JBVEVfSU5TVEFOQ0UgLSBWS19WRVJURVhfSU5QVVRfUkFURV9WRVJURVggKyAxKSwKKyAgICBWS19WRVJURVhfSU5QVVRfUkFURV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtWZXJ0ZXhJbnB1dFJhdGU7CisKK3R5cGVkZWYgZW51bSBWa1ByaW1pdGl2ZVRvcG9sb2d5IHsKKyAgICBWS19QUklNSVRJVkVfVE9QT0xPR1lfUE9JTlRfTElTVCA9IDAsCisgICAgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVCA9IDEsCisgICAgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfU1RSSVAgPSAyLAorICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUID0gMywKKyAgICBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfU1RSSVAgPSA0LAorICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9GQU4gPSA1LAorICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX0xJU1RfV0lUSF9BREpBQ0VOQ1kgPSA2LAorICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX1NUUklQX1dJVEhfQURKQUNFTkNZID0gNywKKyAgICBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfTElTVF9XSVRIX0FESkFDRU5DWSA9IDgsCisgICAgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQX1dJVEhfQURKQUNFTkNZID0gOSwKKyAgICBWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVCA9IDEwLAorICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9CRUdJTl9SQU5HRSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNULAorICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9FTkRfUkFOR0UgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVCwKKyAgICBWS19QUklNSVRJVkVfVE9QT0xPR1lfUkFOR0VfU0laRSA9IChWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVCAtIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUICsgMSksCisgICAgVktfUFJJTUlUSVZFX1RPUE9MT0dZX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa1ByaW1pdGl2ZVRvcG9sb2d5OworCit0eXBlZGVmIGVudW0gVmtQb2x5Z29uTW9kZSB7CisgICAgVktfUE9MWUdPTl9NT0RFX0ZJTEwgPSAwLAorICAgIFZLX1BPTFlHT05fTU9ERV9MSU5FID0gMSwKKyAgICBWS19QT0xZR09OX01PREVfUE9JTlQgPSAyLAorICAgIFZLX1BPTFlHT05fTU9ERV9GSUxMX1JFQ1RBTkdMRV9OViA9IDEwMDAxNTMwMDAsCisgICAgVktfUE9MWUdPTl9NT0RFX0JFR0lOX1JBTkdFID0gVktfUE9MWUdPTl9NT0RFX0ZJTEwsCisgICAgVktfUE9MWUdPTl9NT0RFX0VORF9SQU5HRSA9IFZLX1BPTFlHT05fTU9ERV9QT0lOVCwKKyAgICBWS19QT0xZR09OX01PREVfUkFOR0VfU0laRSA9IChWS19QT0xZR09OX01PREVfUE9JTlQgLSBWS19QT0xZR09OX01PREVfRklMTCArIDEpLAorICAgIFZLX1BPTFlHT05fTU9ERV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtQb2x5Z29uTW9kZTsKKwordHlwZWRlZiBlbnVtIFZrRnJvbnRGYWNlIHsKKyAgICBWS19GUk9OVF9GQUNFX0NPVU5URVJfQ0xPQ0tXSVNFID0gMCwKKyAgICBWS19GUk9OVF9GQUNFX0NMT0NLV0lTRSA9IDEsCisgICAgVktfRlJPTlRfRkFDRV9CRUdJTl9SQU5HRSA9IFZLX0ZST05UX0ZBQ0VfQ09VTlRFUl9DTE9DS1dJU0UsCisgICAgVktfRlJPTlRfRkFDRV9FTkRfUkFOR0UgPSBWS19GUk9OVF9GQUNFX0NMT0NLV0lTRSwKKyAgICBWS19GUk9OVF9GQUNFX1JBTkdFX1NJWkUgPSAoVktfRlJPTlRfRkFDRV9DTE9DS1dJU0UgLSBWS19GUk9OVF9GQUNFX0NPVU5URVJfQ0xPQ0tXSVNFICsgMSksCisgICAgVktfRlJPTlRfRkFDRV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtGcm9udEZhY2U7CisKK3R5cGVkZWYgZW51bSBWa0NvbXBhcmVPcCB7CisgICAgVktfQ09NUEFSRV9PUF9ORVZFUiA9IDAsCisgICAgVktfQ09NUEFSRV9PUF9MRVNTID0gMSwKKyAgICBWS19DT01QQVJFX09QX0VRVUFMID0gMiwKKyAgICBWS19DT01QQVJFX09QX0xFU1NfT1JfRVFVQUwgPSAzLAorICAgIFZLX0NPTVBBUkVfT1BfR1JFQVRFUiA9IDQsCisgICAgVktfQ09NUEFSRV9PUF9OT1RfRVFVQUwgPSA1LAorICAgIFZLX0NPTVBBUkVfT1BfR1JFQVRFUl9PUl9FUVVBTCA9IDYsCisgICAgVktfQ09NUEFSRV9PUF9BTFdBWVMgPSA3LAorICAgIFZLX0NPTVBBUkVfT1BfQkVHSU5fUkFOR0UgPSBWS19DT01QQVJFX09QX05FVkVSLAorICAgIFZLX0NPTVBBUkVfT1BfRU5EX1JBTkdFID0gVktfQ09NUEFSRV9PUF9BTFdBWVMsCisgICAgVktfQ09NUEFSRV9PUF9SQU5HRV9TSVpFID0gKFZLX0NPTVBBUkVfT1BfQUxXQVlTIC0gVktfQ09NUEFSRV9PUF9ORVZFUiArIDEpLAorICAgIFZLX0NPTVBBUkVfT1BfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrQ29tcGFyZU9wOworCit0eXBlZGVmIGVudW0gVmtTdGVuY2lsT3AgeworICAgIFZLX1NURU5DSUxfT1BfS0VFUCA9IDAsCisgICAgVktfU1RFTkNJTF9PUF9aRVJPID0gMSwKKyAgICBWS19TVEVOQ0lMX09QX1JFUExBQ0UgPSAyLAorICAgIFZLX1NURU5DSUxfT1BfSU5DUkVNRU5UX0FORF9DTEFNUCA9IDMsCisgICAgVktfU1RFTkNJTF9PUF9ERUNSRU1FTlRfQU5EX0NMQU1QID0gNCwKKyAgICBWS19TVEVOQ0lMX09QX0lOVkVSVCA9IDUsCisgICAgVktfU1RFTkNJTF9PUF9JTkNSRU1FTlRfQU5EX1dSQVAgPSA2LAorICAgIFZLX1NURU5DSUxfT1BfREVDUkVNRU5UX0FORF9XUkFQID0gNywKKyAgICBWS19TVEVOQ0lMX09QX0JFR0lOX1JBTkdFID0gVktfU1RFTkNJTF9PUF9LRUVQLAorICAgIFZLX1NURU5DSUxfT1BfRU5EX1JBTkdFID0gVktfU1RFTkNJTF9PUF9ERUNSRU1FTlRfQU5EX1dSQVAsCisgICAgVktfU1RFTkNJTF9PUF9SQU5HRV9TSVpFID0gKFZLX1NURU5DSUxfT1BfREVDUkVNRU5UX0FORF9XUkFQIC0gVktfU1RFTkNJTF9PUF9LRUVQICsgMSksCisgICAgVktfU1RFTkNJTF9PUF9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTdGVuY2lsT3A7CisKK3R5cGVkZWYgZW51bSBWa0xvZ2ljT3AgeworICAgIFZLX0xPR0lDX09QX0NMRUFSID0gMCwKKyAgICBWS19MT0dJQ19PUF9BTkQgPSAxLAorICAgIFZLX0xPR0lDX09QX0FORF9SRVZFUlNFID0gMiwKKyAgICBWS19MT0dJQ19PUF9DT1BZID0gMywKKyAgICBWS19MT0dJQ19PUF9BTkRfSU5WRVJURUQgPSA0LAorICAgIFZLX0xPR0lDX09QX05PX09QID0gNSwKKyAgICBWS19MT0dJQ19PUF9YT1IgPSA2LAorICAgIFZLX0xPR0lDX09QX09SID0gNywKKyAgICBWS19MT0dJQ19PUF9OT1IgPSA4LAorICAgIFZLX0xPR0lDX09QX0VRVUlWQUxFTlQgPSA5LAorICAgIFZLX0xPR0lDX09QX0lOVkVSVCA9IDEwLAorICAgIFZLX0xPR0lDX09QX09SX1JFVkVSU0UgPSAxMSwKKyAgICBWS19MT0dJQ19PUF9DT1BZX0lOVkVSVEVEID0gMTIsCisgICAgVktfTE9HSUNfT1BfT1JfSU5WRVJURUQgPSAxMywKKyAgICBWS19MT0dJQ19PUF9OQU5EID0gMTQsCisgICAgVktfTE9HSUNfT1BfU0VUID0gMTUsCisgICAgVktfTE9HSUNfT1BfQkVHSU5fUkFOR0UgPSBWS19MT0dJQ19PUF9DTEVBUiwKKyAgICBWS19MT0dJQ19PUF9FTkRfUkFOR0UgPSBWS19MT0dJQ19PUF9TRVQsCisgICAgVktfTE9HSUNfT1BfUkFOR0VfU0laRSA9IChWS19MT0dJQ19PUF9TRVQgLSBWS19MT0dJQ19PUF9DTEVBUiArIDEpLAorICAgIFZLX0xPR0lDX09QX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0xvZ2ljT3A7CisKK3R5cGVkZWYgZW51bSBWa0JsZW5kRmFjdG9yIHsKKyAgICBWS19CTEVORF9GQUNUT1JfWkVSTyA9IDAsCisgICAgVktfQkxFTkRfRkFDVE9SX09ORSA9IDEsCisgICAgVktfQkxFTkRfRkFDVE9SX1NSQ19DT0xPUiA9IDIsCisgICAgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkNfQ09MT1IgPSAzLAorICAgIFZLX0JMRU5EX0ZBQ1RPUl9EU1RfQ09MT1IgPSA0LAorICAgIFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfRFNUX0NPTE9SID0gNSwKKyAgICBWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBID0gNiwKKyAgICBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQ19BTFBIQSA9IDcsCisgICAgVktfQkxFTkRfRkFDVE9SX0RTVF9BTFBIQSA9IDgsCisgICAgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19EU1RfQUxQSEEgPSA5LAorICAgIFZLX0JMRU5EX0ZBQ1RPUl9DT05TVEFOVF9DT0xPUiA9IDEwLAorICAgIFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgPSAxMSwKKyAgICBWS19CTEVORF9GQUNUT1JfQ09OU1RBTlRfQUxQSEEgPSAxMiwKKyAgICBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBID0gMTMsCisgICAgVktfQkxFTkRfRkFDVE9SX1NSQ19BTFBIQV9TQVRVUkFURSA9IDE0LAorICAgIFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0NPTE9SID0gMTUsCisgICAgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0NPTE9SID0gMTYsCisgICAgVktfQkxFTkRfRkFDVE9SX1NSQzFfQUxQSEEgPSAxNywKKyAgICBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQUxQSEEgPSAxOCwKKyAgICBWS19CTEVORF9GQUNUT1JfQkVHSU5fUkFOR0UgPSBWS19CTEVORF9GQUNUT1JfWkVSTywKKyAgICBWS19CTEVORF9GQUNUT1JfRU5EX1JBTkdFID0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0FMUEhBLAorICAgIFZLX0JMRU5EX0ZBQ1RPUl9SQU5HRV9TSVpFID0gKFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9BTFBIQSAtIFZLX0JMRU5EX0ZBQ1RPUl9aRVJPICsgMSksCisgICAgVktfQkxFTkRfRkFDVE9SX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0JsZW5kRmFjdG9yOworCit0eXBlZGVmIGVudW0gVmtCbGVuZE9wIHsKKyAgICBWS19CTEVORF9PUF9BREQgPSAwLAorICAgIFZLX0JMRU5EX09QX1NVQlRSQUNUID0gMSwKKyAgICBWS19CTEVORF9PUF9SRVZFUlNFX1NVQlRSQUNUID0gMiwKKyAgICBWS19CTEVORF9PUF9NSU4gPSAzLAorICAgIFZLX0JMRU5EX09QX01BWCA9IDQsCisgICAgVktfQkxFTkRfT1BfWkVST19FWFQgPSAxMDAwMTQ4MDAwLAorICAgIFZLX0JMRU5EX09QX1NSQ19FWFQgPSAxMDAwMTQ4MDAxLAorICAgIFZLX0JMRU5EX09QX0RTVF9FWFQgPSAxMDAwMTQ4MDAyLAorICAgIFZLX0JMRU5EX09QX1NSQ19PVkVSX0VYVCA9IDEwMDAxNDgwMDMsCisgICAgVktfQkxFTkRfT1BfRFNUX09WRVJfRVhUID0gMTAwMDE0ODAwNCwKKyAgICBWS19CTEVORF9PUF9TUkNfSU5fRVhUID0gMTAwMDE0ODAwNSwKKyAgICBWS19CTEVORF9PUF9EU1RfSU5fRVhUID0gMTAwMDE0ODAwNiwKKyAgICBWS19CTEVORF9PUF9TUkNfT1VUX0VYVCA9IDEwMDAxNDgwMDcsCisgICAgVktfQkxFTkRfT1BfRFNUX09VVF9FWFQgPSAxMDAwMTQ4MDA4LAorICAgIFZLX0JMRU5EX09QX1NSQ19BVE9QX0VYVCA9IDEwMDAxNDgwMDksCisgICAgVktfQkxFTkRfT1BfRFNUX0FUT1BfRVhUID0gMTAwMDE0ODAxMCwKKyAgICBWS19CTEVORF9PUF9YT1JfRVhUID0gMTAwMDE0ODAxMSwKKyAgICBWS19CTEVORF9PUF9NVUxUSVBMWV9FWFQgPSAxMDAwMTQ4MDEyLAorICAgIFZLX0JMRU5EX09QX1NDUkVFTl9FWFQgPSAxMDAwMTQ4MDEzLAorICAgIFZLX0JMRU5EX09QX09WRVJMQVlfRVhUID0gMTAwMDE0ODAxNCwKKyAgICBWS19CTEVORF9PUF9EQVJLRU5fRVhUID0gMTAwMDE0ODAxNSwKKyAgICBWS19CTEVORF9PUF9MSUdIVEVOX0VYVCA9IDEwMDAxNDgwMTYsCisgICAgVktfQkxFTkRfT1BfQ09MT1JET0RHRV9FWFQgPSAxMDAwMTQ4MDE3LAorICAgIFZLX0JMRU5EX09QX0NPTE9SQlVSTl9FWFQgPSAxMDAwMTQ4MDE4LAorICAgIFZLX0JMRU5EX09QX0hBUkRMSUdIVF9FWFQgPSAxMDAwMTQ4MDE5LAorICAgIFZLX0JMRU5EX09QX1NPRlRMSUdIVF9FWFQgPSAxMDAwMTQ4MDIwLAorICAgIFZLX0JMRU5EX09QX0RJRkZFUkVOQ0VfRVhUID0gMTAwMDE0ODAyMSwKKyAgICBWS19CTEVORF9PUF9FWENMVVNJT05fRVhUID0gMTAwMDE0ODAyMiwKKyAgICBWS19CTEVORF9PUF9JTlZFUlRfRVhUID0gMTAwMDE0ODAyMywKKyAgICBWS19CTEVORF9PUF9JTlZFUlRfUkdCX0VYVCA9IDEwMDAxNDgwMjQsCisgICAgVktfQkxFTkRfT1BfTElORUFSRE9ER0VfRVhUID0gMTAwMDE0ODAyNSwKKyAgICBWS19CTEVORF9PUF9MSU5FQVJCVVJOX0VYVCA9IDEwMDAxNDgwMjYsCisgICAgVktfQkxFTkRfT1BfVklWSURMSUdIVF9FWFQgPSAxMDAwMTQ4MDI3LAorICAgIFZLX0JMRU5EX09QX0xJTkVBUkxJR0hUX0VYVCA9IDEwMDAxNDgwMjgsCisgICAgVktfQkxFTkRfT1BfUElOTElHSFRfRVhUID0gMTAwMDE0ODAyOSwKKyAgICBWS19CTEVORF9PUF9IQVJETUlYX0VYVCA9IDEwMDAxNDgwMzAsCisgICAgVktfQkxFTkRfT1BfSFNMX0hVRV9FWFQgPSAxMDAwMTQ4MDMxLAorICAgIFZLX0JMRU5EX09QX0hTTF9TQVRVUkFUSU9OX0VYVCA9IDEwMDAxNDgwMzIsCisgICAgVktfQkxFTkRfT1BfSFNMX0NPTE9SX0VYVCA9IDEwMDAxNDgwMzMsCisgICAgVktfQkxFTkRfT1BfSFNMX0xVTUlOT1NJVFlfRVhUID0gMTAwMDE0ODAzNCwKKyAgICBWS19CTEVORF9PUF9QTFVTX0VYVCA9IDEwMDAxNDgwMzUsCisgICAgVktfQkxFTkRfT1BfUExVU19DTEFNUEVEX0VYVCA9IDEwMDAxNDgwMzYsCisgICAgVktfQkxFTkRfT1BfUExVU19DTEFNUEVEX0FMUEhBX0VYVCA9IDEwMDAxNDgwMzcsCisgICAgVktfQkxFTkRfT1BfUExVU19EQVJLRVJfRVhUID0gMTAwMDE0ODAzOCwKKyAgICBWS19CTEVORF9PUF9NSU5VU19FWFQgPSAxMDAwMTQ4MDM5LAorICAgIFZLX0JMRU5EX09QX01JTlVTX0NMQU1QRURfRVhUID0gMTAwMDE0ODA0MCwKKyAgICBWS19CTEVORF9PUF9DT05UUkFTVF9FWFQgPSAxMDAwMTQ4MDQxLAorICAgIFZLX0JMRU5EX09QX0lOVkVSVF9PVkdfRVhUID0gMTAwMDE0ODA0MiwKKyAgICBWS19CTEVORF9PUF9SRURfRVhUID0gMTAwMDE0ODA0MywKKyAgICBWS19CTEVORF9PUF9HUkVFTl9FWFQgPSAxMDAwMTQ4MDQ0LAorICAgIFZLX0JMRU5EX09QX0JMVUVfRVhUID0gMTAwMDE0ODA0NSwKKyAgICBWS19CTEVORF9PUF9CRUdJTl9SQU5HRSA9IFZLX0JMRU5EX09QX0FERCwKKyAgICBWS19CTEVORF9PUF9FTkRfUkFOR0UgPSBWS19CTEVORF9PUF9NQVgsCisgICAgVktfQkxFTkRfT1BfUkFOR0VfU0laRSA9IChWS19CTEVORF9PUF9NQVggLSBWS19CTEVORF9PUF9BREQgKyAxKSwKKyAgICBWS19CTEVORF9PUF9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtCbGVuZE9wOworCit0eXBlZGVmIGVudW0gVmtEeW5hbWljU3RhdGUgeworICAgIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQgPSAwLAorICAgIFZLX0RZTkFNSUNfU1RBVEVfU0NJU1NPUiA9IDEsCisgICAgVktfRFlOQU1JQ19TVEFURV9MSU5FX1dJRFRIID0gMiwKKyAgICBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JJQVMgPSAzLAorICAgIFZLX0RZTkFNSUNfU1RBVEVfQkxFTkRfQ09OU1RBTlRTID0gNCwKKyAgICBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUyA9IDUsCisgICAgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX0NPTVBBUkVfTUFTSyA9IDYsCisgICAgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1dSSVRFX01BU0sgPSA3LAorICAgIFZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9SRUZFUkVOQ0UgPSA4LAorICAgIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfV19TQ0FMSU5HX05WID0gMTAwMDA4NzAwMCwKKyAgICBWS19EWU5BTUlDX1NUQVRFX0RJU0NBUkRfUkVDVEFOR0xFX0VYVCA9IDEwMDAwOTkwMDAsCisgICAgVktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVCA9IDEwMDAxNDMwMDAsCisgICAgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfUEFMRVRURV9OViA9IDEwMDAxNjQwMDQsCisgICAgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9DT0FSU0VfU0FNUExFX09SREVSX05WID0gMTAwMDE2NDAwNiwKKyAgICBWS19EWU5BTUlDX1NUQVRFX0VYQ0xVU0lWRV9TQ0lTU09SX05WID0gMTAwMDIwNTAwMSwKKyAgICBWS19EWU5BTUlDX1NUQVRFX0xJTkVfU1RJUFBMRV9FWFQgPSAxMDAwMjU5MDAwLAorICAgIFZLX0RZTkFNSUNfU1RBVEVfQkVHSU5fUkFOR0UgPSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULAorICAgIFZLX0RZTkFNSUNfU1RBVEVfRU5EX1JBTkdFID0gVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1JFRkVSRU5DRSwKKyAgICBWS19EWU5BTUlDX1NUQVRFX1JBTkdFX1NJWkUgPSAoVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1JFRkVSRU5DRSAtIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQgKyAxKSwKKyAgICBWS19EWU5BTUlDX1NUQVRFX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0R5bmFtaWNTdGF0ZTsKKwordHlwZWRlZiBlbnVtIFZrRmlsdGVyIHsKKyAgICBWS19GSUxURVJfTkVBUkVTVCA9IDAsCisgICAgVktfRklMVEVSX0xJTkVBUiA9IDEsCisgICAgVktfRklMVEVSX0NVQklDX0lNRyA9IDEwMDAwMTUwMDAsCisgICAgVktfRklMVEVSX0NVQklDX0VYVCA9IFZLX0ZJTFRFUl9DVUJJQ19JTUcsCisgICAgVktfRklMVEVSX0JFR0lOX1JBTkdFID0gVktfRklMVEVSX05FQVJFU1QsCisgICAgVktfRklMVEVSX0VORF9SQU5HRSA9IFZLX0ZJTFRFUl9MSU5FQVIsCisgICAgVktfRklMVEVSX1JBTkdFX1NJWkUgPSAoVktfRklMVEVSX0xJTkVBUiAtIFZLX0ZJTFRFUl9ORUFSRVNUICsgMSksCisgICAgVktfRklMVEVSX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0ZpbHRlcjsKKwordHlwZWRlZiBlbnVtIFZrU2FtcGxlck1pcG1hcE1vZGUgeworICAgIFZLX1NBTVBMRVJfTUlQTUFQX01PREVfTkVBUkVTVCA9IDAsCisgICAgVktfU0FNUExFUl9NSVBNQVBfTU9ERV9MSU5FQVIgPSAxLAorICAgIFZLX1NBTVBMRVJfTUlQTUFQX01PREVfQkVHSU5fUkFOR0UgPSBWS19TQU1QTEVSX01JUE1BUF9NT0RFX05FQVJFU1QsCisgICAgVktfU0FNUExFUl9NSVBNQVBfTU9ERV9FTkRfUkFOR0UgPSBWS19TQU1QTEVSX01JUE1BUF9NT0RFX0xJTkVBUiwKKyAgICBWS19TQU1QTEVSX01JUE1BUF9NT0RFX1JBTkdFX1NJWkUgPSAoVktfU0FNUExFUl9NSVBNQVBfTU9ERV9MSU5FQVIgLSBWS19TQU1QTEVSX01JUE1BUF9NT0RFX05FQVJFU1QgKyAxKSwKKyAgICBWS19TQU1QTEVSX01JUE1BUF9NT0RFX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa1NhbXBsZXJNaXBtYXBNb2RlOworCit0eXBlZGVmIGVudW0gVmtTYW1wbGVyQWRkcmVzc01vZGUgeworICAgIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX1JFUEVBVCA9IDAsCisgICAgVktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SRURfUkVQRUFUID0gMSwKKyAgICBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFID0gMiwKKyAgICBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19CT1JERVIgPSAzLAorICAgIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFID0gNCwKKyAgICBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRV9LSFIgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRSwKKyAgICBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9CRUdJTl9SQU5HRSA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX1JFUEVBVCwKKyAgICBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9FTkRfUkFOR0UgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19CT1JERVIsCisgICAgVktfU0FNUExFUl9BRERSRVNTX01PREVfUkFOR0VfU0laRSA9IChWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19CT1JERVIgLSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9SRVBFQVQgKyAxKSwKKyAgICBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTYW1wbGVyQWRkcmVzc01vZGU7CisKK3R5cGVkZWYgZW51bSBWa0JvcmRlckNvbG9yIHsKKyAgICBWS19CT1JERVJfQ09MT1JfRkxPQVRfVFJBTlNQQVJFTlRfQkxBQ0sgPSAwLAorICAgIFZLX0JPUkRFUl9DT0xPUl9JTlRfVFJBTlNQQVJFTlRfQkxBQ0sgPSAxLAorICAgIFZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfQkxBQ0sgPSAyLAorICAgIFZLX0JPUkRFUl9DT0xPUl9JTlRfT1BBUVVFX0JMQUNLID0gMywKKyAgICBWS19CT1JERVJfQ09MT1JfRkxPQVRfT1BBUVVFX1dISVRFID0gNCwKKyAgICBWS19CT1JERVJfQ09MT1JfSU5UX09QQVFVRV9XSElURSA9IDUsCisgICAgVktfQk9SREVSX0NPTE9SX0JFR0lOX1JBTkdFID0gVktfQk9SREVSX0NPTE9SX0ZMT0FUX1RSQU5TUEFSRU5UX0JMQUNLLAorICAgIFZLX0JPUkRFUl9DT0xPUl9FTkRfUkFOR0UgPSBWS19CT1JERVJfQ09MT1JfSU5UX09QQVFVRV9XSElURSwKKyAgICBWS19CT1JERVJfQ09MT1JfUkFOR0VfU0laRSA9IChWS19CT1JERVJfQ09MT1JfSU5UX09QQVFVRV9XSElURSAtIFZLX0JPUkRFUl9DT0xPUl9GTE9BVF9UUkFOU1BBUkVOVF9CTEFDSyArIDEpLAorICAgIFZLX0JPUkRFUl9DT0xPUl9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtCb3JkZXJDb2xvcjsKKwordHlwZWRlZiBlbnVtIFZrRGVzY3JpcHRvclR5cGUgeworICAgIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSID0gMCwKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiA9IDEsCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UgPSAyLAorICAgIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFID0gMywKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIgPSA0LAorICAgIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiA9IDUsCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSID0gNiwKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIgPSA3LAorICAgIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDID0gOCwKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQyA9IDksCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQgPSAxMCwKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUID0gMTAwMDEzODAwMCwKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViA9IDEwMDAxNjUwMDAsCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX0JFR0lOX1JBTkdFID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIsCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX0VORF9SQU5HRSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5ULAorICAgIFZLX0RFU0NSSVBUT1JfVFlQRV9SQU5HRV9TSVpFID0gKFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UIC0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgKyAxKSwKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrRGVzY3JpcHRvclR5cGU7CisKK3R5cGVkZWYgZW51bSBWa0F0dGFjaG1lbnRMb2FkT3AgeworICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FEID0gMCwKKyAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIgPSAxLAorICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUgPSAyLAorICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9CRUdJTl9SQU5HRSA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FELAorICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9FTkRfUkFOR0UgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLAorICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9SQU5HRV9TSVpFID0gKFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUgLSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCArIDEpLAorICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtBdHRhY2htZW50TG9hZE9wOworCit0eXBlZGVmIGVudW0gVmtBdHRhY2htZW50U3RvcmVPcCB7CisgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSA9IDAsCisgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUgPSAxLAorICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfQkVHSU5fUkFOR0UgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFLAorICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRU5EX1JBTkdFID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9SQU5HRV9TSVpFID0gKFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFIC0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSArIDEpLAorICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrQXR0YWNobWVudFN0b3JlT3A7CisKK3R5cGVkZWYgZW51bSBWa1BpcGVsaW5lQmluZFBvaW50IHsKKyAgICBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTID0gMCwKKyAgICBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUgPSAxLAorICAgIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYgPSAxMDAwMTY1MDAwLAorICAgIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQkVHSU5fUkFOR0UgPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLAorICAgIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfRU5EX1JBTkdFID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLAorICAgIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFOR0VfU0laRSA9IChWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUgLSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTICsgMSksCisgICAgVktfUElQRUxJTkVfQklORF9QT0lOVF9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtQaXBlbGluZUJpbmRQb2ludDsKKwordHlwZWRlZiBlbnVtIFZrQ29tbWFuZEJ1ZmZlckxldmVsIHsKKyAgICBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZID0gMCwKKyAgICBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkgPSAxLAorICAgIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX0JFR0lOX1JBTkdFID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSwKKyAgICBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9FTkRfUkFOR0UgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlksCisgICAgVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUkFOR0VfU0laRSA9IChWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkgLSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZICsgMSksCisgICAgVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrQ29tbWFuZEJ1ZmZlckxldmVsOworCit0eXBlZGVmIGVudW0gVmtJbmRleFR5cGUgeworICAgIFZLX0lOREVYX1RZUEVfVUlOVDE2ID0gMCwKKyAgICBWS19JTkRFWF9UWVBFX1VJTlQzMiA9IDEsCisgICAgVktfSU5ERVhfVFlQRV9OT05FX05WID0gMTAwMDE2NTAwMCwKKyAgICBWS19JTkRFWF9UWVBFX1VJTlQ4X0VYVCA9IDEwMDAyNjUwMDAsCisgICAgVktfSU5ERVhfVFlQRV9CRUdJTl9SQU5HRSA9IFZLX0lOREVYX1RZUEVfVUlOVDE2LAorICAgIFZLX0lOREVYX1RZUEVfRU5EX1JBTkdFID0gVktfSU5ERVhfVFlQRV9VSU5UMzIsCisgICAgVktfSU5ERVhfVFlQRV9SQU5HRV9TSVpFID0gKFZLX0lOREVYX1RZUEVfVUlOVDMyIC0gVktfSU5ERVhfVFlQRV9VSU5UMTYgKyAxKSwKKyAgICBWS19JTkRFWF9UWVBFX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0luZGV4VHlwZTsKKwordHlwZWRlZiBlbnVtIFZrU3VicGFzc0NvbnRlbnRzIHsKKyAgICBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSA9IDAsCisgICAgVktfU1VCUEFTU19DT05URU5UU19TRUNPTkRBUllfQ09NTUFORF9CVUZGRVJTID0gMSwKKyAgICBWS19TVUJQQVNTX0NPTlRFTlRTX0JFR0lOX1JBTkdFID0gVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUsCisgICAgVktfU1VCUEFTU19DT05URU5UU19FTkRfUkFOR0UgPSBWS19TVUJQQVNTX0NPTlRFTlRTX1NFQ09OREFSWV9DT01NQU5EX0JVRkZFUlMsCisgICAgVktfU1VCUEFTU19DT05URU5UU19SQU5HRV9TSVpFID0gKFZLX1NVQlBBU1NfQ09OVEVOVFNfU0VDT05EQVJZX0NPTU1BTkRfQlVGRkVSUyAtIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FICsgMSksCisgICAgVktfU1VCUEFTU19DT05URU5UU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTdWJwYXNzQ29udGVudHM7CisKK3R5cGVkZWYgZW51bSBWa09iamVjdFR5cGUgeworICAgIFZLX09CSkVDVF9UWVBFX1VOS05PV04gPSAwLAorICAgIFZLX09CSkVDVF9UWVBFX0lOU1RBTkNFID0gMSwKKyAgICBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0UgPSAyLAorICAgIFZLX09CSkVDVF9UWVBFX0RFVklDRSA9IDMsCisgICAgVktfT0JKRUNUX1RZUEVfUVVFVUUgPSA0LAorICAgIFZLX09CSkVDVF9UWVBFX1NFTUFQSE9SRSA9IDUsCisgICAgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVIgPSA2LAorICAgIFZLX09CSkVDVF9UWVBFX0ZFTkNFID0gNywKKyAgICBWS19PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZID0gOCwKKyAgICBWS19PQkpFQ1RfVFlQRV9CVUZGRVIgPSA5LAorICAgIFZLX09CSkVDVF9UWVBFX0lNQUdFID0gMTAsCisgICAgVktfT0JKRUNUX1RZUEVfRVZFTlQgPSAxMSwKKyAgICBWS19PQkpFQ1RfVFlQRV9RVUVSWV9QT09MID0gMTIsCisgICAgVktfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVcgPSAxMywKKyAgICBWS19PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXID0gMTQsCisgICAgVktfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRSA9IDE1LAorICAgIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFID0gMTYsCisgICAgVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUID0gMTcsCisgICAgVktfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1MgPSAxOCwKKyAgICBWS19PQkpFQ1RfVFlQRV9QSVBFTElORSA9IDE5LAorICAgIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVCA9IDIwLAorICAgIFZLX09CSkVDVF9UWVBFX1NBTVBMRVIgPSAyMSwKKyAgICBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0wgPSAyMiwKKyAgICBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVCA9IDIzLAorICAgIFZLX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSID0gMjQsCisgICAgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MID0gMjUsCisgICAgVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OID0gMTAwMDE1NjAwMCwKKyAgICBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURSA9IDEwMDAwODUwMDAsCisgICAgVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFIgPSAxMDAwMDAwMDAwLAorICAgIFZLX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFIgPSAxMDAwMDAxMDAwLAorICAgIFZLX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSID0gMTAwMDAwMjAwMCwKKyAgICBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSID0gMTAwMDAwMjAwMSwKKyAgICBWS19PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfRVhUID0gMTAwMDAxMTAwMCwKKyAgICBWS19PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYID0gMTAwMDA4NjAwMCwKKyAgICBWS19PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYID0gMTAwMDA4NjAwMSwKKyAgICBWS19PQkpFQ1RfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfRVhUID0gMTAwMDEyODAwMCwKKyAgICBWS19PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVCA9IDEwMDAxNjAwMDAsCisgICAgVktfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViA9IDEwMDAxNjUwMDAsCisgICAgVktfT0JKRUNUX1RZUEVfUEVSRk9STUFOQ0VfQ09ORklHVVJBVElPTl9JTlRFTCA9IDEwMDAyMTAwMDAsCisgICAgVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfS0hSID0gVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEUsCisgICAgVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0tIUiA9IFZLX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTiwKKyAgICBWS19PQkpFQ1RfVFlQRV9CRUdJTl9SQU5HRSA9IFZLX09CSkVDVF9UWVBFX1VOS05PV04sCisgICAgVktfT0JKRUNUX1RZUEVfRU5EX1JBTkdFID0gVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MLAorICAgIFZLX09CSkVDVF9UWVBFX1JBTkdFX1NJWkUgPSAoVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MIC0gVktfT0JKRUNUX1RZUEVfVU5LTk9XTiArIDEpLAorICAgIFZLX09CSkVDVF9UWVBFX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa09iamVjdFR5cGU7CisKK3R5cGVkZWYgZW51bSBWa1ZlbmRvcklkIHsKKyAgICBWS19WRU5ET1JfSURfVklWID0gMHgxMDAwMSwKKyAgICBWS19WRU5ET1JfSURfVlNJID0gMHgxMDAwMiwKKyAgICBWS19WRU5ET1JfSURfS0FaQU4gPSAweDEwMDAzLAorICAgIFZLX1ZFTkRPUl9JRF9CRUdJTl9SQU5HRSA9IFZLX1ZFTkRPUl9JRF9WSVYsCisgICAgVktfVkVORE9SX0lEX0VORF9SQU5HRSA9IFZLX1ZFTkRPUl9JRF9LQVpBTiwKKyAgICBWS19WRU5ET1JfSURfUkFOR0VfU0laRSA9IChWS19WRU5ET1JfSURfS0FaQU4gLSBWS19WRU5ET1JfSURfVklWICsgMSksCisgICAgVktfVkVORE9SX0lEX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa1ZlbmRvcklkOwordHlwZWRlZiBWa0ZsYWdzIFZrSW5zdGFuY2VDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIHsKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVCA9IDB4MDAwMDAwMDQsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUID0gMHgwMDAwMDAwOCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQgPSAweDAwMDAwMDEwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0FUT01JQ19CSVQgPSAweDAwMDAwMDIwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1ZFUlRFWF9CVUZGRVJfQklUID0gMHgwMDAwMDA0MCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCA9IDB4MDAwMDAwODAsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CTEVORF9CSVQgPSAweDAwMDAwMTAwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQgPSAweDAwMDAwMjAwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX0JMSVRfU1JDX0JJVCA9IDB4MDAwMDA0MDAsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUID0gMHgwMDAwMDgwMCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUID0gMHgwMDAwMTAwMCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUID0gMHgwMDAwNDAwMCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUID0gMHgwMDAwODAwMCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9NSURQT0lOVF9DSFJPTUFfU0FNUExFU19CSVQgPSAweDAwMDIwMDAwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9MSU5FQVJfRklMVEVSX0JJVCA9IDB4MDAwNDAwMDAsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX1NFUEFSQVRFX1JFQ09OU1RSVUNUSU9OX0ZJTFRFUl9CSVQgPSAweDAwMDgwMDAwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfQklUID0gMHgwMDEwMDAwMCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0ZPUkNFQUJMRV9CSVQgPSAweDAwMjAwMDAwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX0RJU0pPSU5UX0JJVCA9IDB4MDA0MDAwMDAsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfQ09TSVRFRF9DSFJPTUFfU0FNUExFU19CSVQgPSAweDAwODAwMDAwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9JTUcgPSAweDAwMDAyMDAwLAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX01JTk1BWF9CSVRfRVhUID0gMHgwMDAxMDAwMCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUID0gMHgwMTAwMDAwMCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUX0tIUiA9IFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVQsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVF9LSFIgPSBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklULAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX01JRFBPSU5UX0NIUk9NQV9TQU1QTEVTX0JJVF9LSFIgPSBWS19GT1JNQVRfRkVBVFVSRV9NSURQT0lOVF9DSFJPTUFfU0FNUExFU19CSVQsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0xJTkVBUl9GSUxURVJfQklUX0tIUiA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9MSU5FQVJfRklMVEVSX0JJVCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVF9LSFIgPSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0JJVF9LSFIgPSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0JJVCwKKyAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0ZPUkNFQUJMRV9CSVRfS0hSID0gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9GT1JDRUFCTEVfQklULAorICAgIFZLX0ZPUk1BVF9GRUFUVVJFX0RJU0pPSU5UX0JJVF9LSFIgPSBWS19GT1JNQVRfRkVBVFVSRV9ESVNKT0lOVF9CSVQsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfQ09TSVRFRF9DSFJPTUFfU0FNUExFU19CSVRfS0hSID0gVktfRk9STUFUX0ZFQVRVUkVfQ09TSVRFRF9DSFJPTUFfU0FNUExFU19CSVQsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVCA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9JTUcsCisgICAgVktfRk9STUFUX0ZFQVRVUkVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0Zvcm1hdEZlYXR1cmVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0Zvcm1hdEZlYXR1cmVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrSW1hZ2VVc2FnZUZsYWdCaXRzIHsKKyAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUID0gMHgwMDAwMDAwMiwKKyAgICBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCA9IDB4MDAwMDAwMDQsCisgICAgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUID0gMHgwMDAwMDAxMCwKKyAgICBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUID0gMHgwMDAwMDAyMCwKKyAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQgPSAweDAwMDAwMDQwLAorICAgIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUID0gMHgwMDAwMDA4MCwKKyAgICBWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WID0gMHgwMDAwMDEwMCwKKyAgICBWS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUID0gMHgwMDAwMDIwMCwKKyAgICBWS19JTUFHRV9VU0FHRV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrSW1hZ2VVc2FnZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrSW1hZ2VVc2FnZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIHsKKyAgICBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklUID0gMHgwMDAwMDAxMCwKKyAgICBWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUID0gMHgwMDAwMDQwMCwKKyAgICBWS19JTUFHRV9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVCA9IDB4MDAwMDAwNDAsCisgICAgVktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUID0gMHgwMDAwMDAyMCwKKyAgICBWS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVCA9IDB4MDAwMDAwODAsCisgICAgVktfSU1BR0VfQ1JFQVRFX0VYVEVOREVEX1VTQUdFX0JJVCA9IDB4MDAwMDAxMDAsCisgICAgVktfSU1BR0VfQ1JFQVRFX1BST1RFQ1RFRF9CSVQgPSAweDAwMDAwODAwLAorICAgIFZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQgPSAweDAwMDAwMjAwLAorICAgIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYgPSAweDAwMDAyMDAwLAorICAgIFZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVCA9IDB4MDAwMDEwMDAsCisgICAgVktfSU1BR0VfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVCA9IDB4MDAwMDQwMDAsCisgICAgVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVRfS0hSID0gVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVQsCisgICAgVktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUX0tIUiA9IFZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVCwKKyAgICBWS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVF9LSFIgPSBWS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVCwKKyAgICBWS19JTUFHRV9DUkVBVEVfRVhURU5ERURfVVNBR0VfQklUX0tIUiA9IFZLX0lNQUdFX0NSRUFURV9FWFRFTkRFRF9VU0FHRV9CSVQsCisgICAgVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVF9LSFIgPSBWS19JTUFHRV9DUkVBVEVfRElTSk9JTlRfQklULAorICAgIFZLX0lNQUdFX0NSRUFURV9BTElBU19CSVRfS0hSID0gVktfSU1BR0VfQ1JFQVRFX0FMSUFTX0JJVCwKKyAgICBWS19JTUFHRV9DUkVBVEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0ltYWdlQ3JlYXRlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtJbWFnZUNyZWF0ZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtTYW1wbGVDb3VudEZsYWdCaXRzIHsKKyAgICBWS19TQU1QTEVfQ09VTlRfMV9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX1NBTVBMRV9DT1VOVF8yX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfU0FNUExFX0NPVU5UXzRfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19TQU1QTEVfQ09VTlRfOF9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX1NBTVBMRV9DT1VOVF8xNl9CSVQgPSAweDAwMDAwMDEwLAorICAgIFZLX1NBTVBMRV9DT1VOVF8zMl9CSVQgPSAweDAwMDAwMDIwLAorICAgIFZLX1NBTVBMRV9DT1VOVF82NF9CSVQgPSAweDAwMDAwMDQwLAorICAgIFZLX1NBTVBMRV9DT1VOVF9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrU2FtcGxlQ291bnRGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1NhbXBsZUNvdW50RmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa1F1ZXVlRmxhZ0JpdHMgeworICAgIFZLX1FVRVVFX0dSQVBISUNTX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfUVVFVUVfQ09NUFVURV9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX1FVRVVFX1RSQU5TRkVSX0JJVCA9IDB4MDAwMDAwMDQsCisgICAgVktfUVVFVUVfU1BBUlNFX0JJTkRJTkdfQklUID0gMHgwMDAwMDAwOCwKKyAgICBWS19RVUVVRV9QUk9URUNURURfQklUID0gMHgwMDAwMDAxMCwKKyAgICBWS19RVUVVRV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrUXVldWVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1F1ZXVlRmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa01lbW9yeVByb3BlcnR5RmxhZ0JpdHMgeworICAgIFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DQUNIRURfQklUID0gMHgwMDAwMDAwOCwKKyAgICBWS19NRU1PUllfUFJPUEVSVFlfTEFaSUxZX0FMTE9DQVRFRF9CSVQgPSAweDAwMDAwMDEwLAorICAgIFZLX01FTU9SWV9QUk9QRVJUWV9QUk9URUNURURfQklUID0gMHgwMDAwMDAyMCwKKyAgICBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0NPSEVSRU5UX0JJVF9BTUQgPSAweDAwMDAwMDQwLAorICAgIFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfVU5DQUNIRURfQklUX0FNRCA9IDB4MDAwMDAwODAsCisgICAgVktfTUVNT1JZX1BST1BFUlRZX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrTWVtb3J5UHJvcGVydHlGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrTWVtb3J5SGVhcEZsYWdCaXRzIHsKKyAgICBWS19NRU1PUllfSEVBUF9ERVZJQ0VfTE9DQUxfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19NRU1PUllfSEVBUF9NVUxUSV9JTlNUQU5DRV9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX01FTU9SWV9IRUFQX01VTFRJX0lOU1RBTkNFX0JJVF9LSFIgPSBWS19NRU1PUllfSEVBUF9NVUxUSV9JTlNUQU5DRV9CSVQsCisgICAgVktfTUVNT1JZX0hFQVBfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa01lbW9yeUhlYXBGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa01lbW9yeUhlYXBGbGFnczsKK3R5cGVkZWYgVmtGbGFncyBWa0RldmljZUNyZWF0ZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIHsKKyAgICBWS19ERVZJQ0VfUVVFVUVfQ1JFQVRFX1BST1RFQ1RFRF9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX0RFVklDRV9RVUVVRV9DUkVBVEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgeworICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfUElQRUxJTkVfU1RBR0VfRFJBV19JTkRJUkVDVF9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9JTlBVVF9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9TSEFERVJfQklUID0gMHgwMDAwMDAwOCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUID0gMHgwMDAwMDAxMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUID0gMHgwMDAwMDAyMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUID0gMHgwMDAwMDA0MCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklUID0gMHgwMDAwMDA4MCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9FQVJMWV9GUkFHTUVOVF9URVNUU19CSVQgPSAweDAwMDAwMTAwLAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0xBVEVfRlJBR01FTlRfVEVTVFNfQklUID0gMHgwMDAwMDIwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQgPSAweDAwMDAwNDAwLAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCA9IDB4MDAwMDA4MDAsCisgICAgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklUID0gMHgwMDAwMTAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQgPSAweDAwMDAyMDAwLAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUID0gMHgwMDAwNDAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklUID0gMHgwMDAwODAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUID0gMHgwMDAxMDAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQklUX0VYVCA9IDB4MDEwMDAwMDAsCisgICAgVktfUElQRUxJTkVfU1RBR0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0JJVF9FWFQgPSAweDAwMDQwMDAwLAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTU1BTkRfUFJPQ0VTU19CSVRfTlZYID0gMHgwMDAyMDAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WID0gMHgwMDQwMDAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9SQVlfVFJBQ0lOR19TSEFERVJfQklUX05WID0gMHgwMDIwMDAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0JVSUxEX0JJVF9OViA9IDB4MDIwMDAwMDAsCisgICAgVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WID0gMHgwMDA4MDAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYgPSAweDAwMTAwMDAwLAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX0RFTlNJVFlfUFJPQ0VTU19CSVRfRVhUID0gMHgwMDgwMDAwMCwKKyAgICBWS19QSVBFTElORV9TVEFHRV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrUGlwZWxpbmVTdGFnZUZsYWdzOwordHlwZWRlZiBWa0ZsYWdzIFZrTWVtb3J5TWFwRmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgeworICAgIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCA9IDB4MDAwMDAwMDQsCisgICAgVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVCA9IDB4MDAwMDAwMDgsCisgICAgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUID0gMHgwMDAwMDAxMCwKKyAgICBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQgPSAweDAwMDAwMDIwLAorICAgIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVCA9IDB4MDAwMDAwNDAsCisgICAgVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8wX0JJVF9FWFQgPSAweDAwMDAwMDgwLAorICAgIFZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfMV9CSVRfRVhUID0gMHgwMDAwMDEwMCwKKyAgICBWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzJfQklUX0VYVCA9IDB4MDAwMDAyMDAsCisgICAgVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8zX0JJVF9FWFQgPSAweDAwMDAwNDAwLAorICAgIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVF9LSFIgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsCisgICAgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUX0tIUiA9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCwKKyAgICBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklULAorICAgIFZLX0lNQUdFX0FTUEVDVF9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrSW1hZ2VBc3BlY3RGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0ltYWdlQXNwZWN0RmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa1NwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHMgeworICAgIFZLX1NQQVJTRV9JTUFHRV9GT1JNQVRfU0lOR0xFX01JUFRBSUxfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19TUEFSU0VfSU1BR0VfRk9STUFUX0FMSUdORURfTUlQX1NJWkVfQklUID0gMHgwMDAwMDAwMiwKKyAgICBWS19TUEFSU0VfSU1BR0VfRk9STUFUX05PTlNUQU5EQVJEX0JMT0NLX1NJWkVfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19TUEFSU0VfSU1BR0VfRk9STUFUX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrU3BhcnNlSW1hZ2VGb3JtYXRGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzIHsKKyAgICBWS19TUEFSU0VfTUVNT1JZX0JJTkRfTUVUQURBVEFfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19TUEFSU0VfTUVNT1JZX0JJTkRfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa1NwYXJzZU1lbW9yeUJpbmRGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1NwYXJzZU1lbW9yeUJpbmRGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrRmVuY2VDcmVhdGVGbGFnQml0cyB7CisgICAgVktfRkVOQ0VfQ1JFQVRFX1NJR05BTEVEX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfRkVOQ0VfQ1JFQVRFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtGZW5jZUNyZWF0ZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrRmVuY2VDcmVhdGVGbGFnczsKK3R5cGVkZWYgVmtGbGFncyBWa1NlbWFwaG9yZUNyZWF0ZUZsYWdzOwordHlwZWRlZiBWa0ZsYWdzIFZrRXZlbnRDcmVhdGVGbGFnczsKK3R5cGVkZWYgVmtGbGFncyBWa1F1ZXJ5UG9vbENyZWF0ZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHMgeworICAgIFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19JTlBVVF9BU1NFTUJMWV9WRVJUSUNFU19CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19JTlBVVF9BU1NFTUJMWV9QUklNSVRJVkVTX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1ZFUlRFWF9TSEFERVJfSU5WT0NBVElPTlNfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfR0VPTUVUUllfU0hBREVSX0lOVk9DQVRJT05TX0JJVCA9IDB4MDAwMDAwMDgsCisgICAgVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0dFT01FVFJZX1NIQURFUl9QUklNSVRJVkVTX0JJVCA9IDB4MDAwMDAwMTAsCisgICAgVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NMSVBQSU5HX0lOVk9DQVRJT05TX0JJVCA9IDB4MDAwMDAwMjAsCisgICAgVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NMSVBQSU5HX1BSSU1JVElWRVNfQklUID0gMHgwMDAwMDA0MCwKKyAgICBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfRlJBR01FTlRfU0hBREVSX0lOVk9DQVRJT05TX0JJVCA9IDB4MDAwMDAwODAsCisgICAgVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9QQVRDSEVTX0JJVCA9IDB4MDAwMDAxMDAsCisgICAgVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQgPSAweDAwMDAwMjAwLAorICAgIFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19DT01QVVRFX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQgPSAweDAwMDAwNDAwLAorICAgIFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzOworCit0eXBlZGVmIGVudW0gVmtRdWVyeVJlc3VsdEZsYWdCaXRzIHsKKyAgICBWS19RVUVSWV9SRVNVTFRfNjRfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19RVUVSWV9SRVNVTFRfV0FJVF9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX1FVRVJZX1JFU1VMVF9XSVRIX0FWQUlMQUJJTElUWV9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVCA9IDB4MDAwMDAwMDgsCisgICAgVktfUVVFUllfUkVTVUxUX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtRdWVyeVJlc3VsdEZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrUXVlcnlSZXN1bHRGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMgeworICAgIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUID0gMHgwMDAwMDAwMiwKKyAgICBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVCA9IDB4MDAwMDAwMDQsCisgICAgVktfQlVGRkVSX0NSRUFURV9QUk9URUNURURfQklUID0gMHgwMDAwMDAwOCwKKyAgICBWS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIgPSAweDAwMDAwMDEwLAorICAgIFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0VYVCA9IFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUiwKKyAgICBWS19CVUZGRVJfQ1JFQVRFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtCdWZmZXJDcmVhdGVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0J1ZmZlckNyZWF0ZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtCdWZmZXJVc2FnZUZsYWdCaXRzIHsKKyAgICBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQgPSAweDAwMDAwMDEwLAorICAgIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQgPSAweDAwMDAwMDIwLAorICAgIFZLX0JVRkZFUl9VU0FHRV9JTkRFWF9CVUZGRVJfQklUID0gMHgwMDAwMDA0MCwKKyAgICBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQgPSAweDAwMDAwMDgwLAorICAgIFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUID0gMHgwMDAwMDEwMCwKKyAgICBWS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSVRfRVhUID0gMHgwMDAwMDgwMCwKKyAgICBWS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfQlVGRkVSX0JJVF9FWFQgPSAweDAwMDAxMDAwLAorICAgIFZLX0JVRkZFUl9VU0FHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCA9IDB4MDAwMDAyMDAsCisgICAgVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OViA9IDB4MDAwMDA0MDAsCisgICAgVktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfS0hSID0gMHgwMDAyMDAwMCwKKyAgICBWS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9FWFQgPSBWS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9LSFIsCisgICAgVktfQlVGRkVSX1VTQUdFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtCdWZmZXJVc2FnZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrQnVmZmVyVXNhZ2VGbGFnczsKK3R5cGVkZWYgVmtGbGFncyBWa0J1ZmZlclZpZXdDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ0JpdHMgeworICAgIFZLX0lNQUdFX1ZJRVdfQ1JFQVRFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0RZTkFNSUNfQklUX0VYVCA9IDB4MDAwMDAwMDEsCisgICAgVktfSU1BR0VfVklFV19DUkVBVEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0ltYWdlVmlld0NyZWF0ZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa1NoYWRlck1vZHVsZUNyZWF0ZUZsYWdCaXRzIHsKKyAgICBWS19TSEFERVJfTU9EVUxFX0NSRUFURV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrU2hhZGVyTW9kdWxlQ3JlYXRlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtTaGFkZXJNb2R1bGVDcmVhdGVGbGFnczsKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyB7CisgICAgVktfUElQRUxJTkVfQ1JFQVRFX0RJU0FCTEVfT1BUSU1JWkFUSU9OX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfUElQRUxJTkVfQ1JFQVRFX0FMTE9XX0RFUklWQVRJVkVTX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19QSVBFTElORV9DUkVBVEVfVklFV19JTkRFWF9GUk9NX0RFVklDRV9JTkRFWF9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX1BJUEVMSU5FX0NSRUFURV9ESVNQQVRDSF9CQVNFX0JJVCA9IDB4MDAwMDAwMTAsCisgICAgVktfUElQRUxJTkVfQ1JFQVRFX0RFRkVSX0NPTVBJTEVfQklUX05WID0gMHgwMDAwMDAyMCwKKyAgICBWS19QSVBFTElORV9DUkVBVEVfQ0FQVFVSRV9TVEFUSVNUSUNTX0JJVF9LSFIgPSAweDAwMDAwMDQwLAorICAgIFZLX1BJUEVMSU5FX0NSRUFURV9DQVBUVVJFX0lOVEVSTkFMX1JFUFJFU0VOVEFUSU9OU19CSVRfS0hSID0gMHgwMDAwMDA4MCwKKyAgICBWS19QSVBFTElORV9DUkVBVEVfRElTUEFUQ0hfQkFTRSA9IFZLX1BJUEVMSU5FX0NSRUFURV9ESVNQQVRDSF9CQVNFX0JJVCwKKyAgICBWS19QSVBFTElORV9DUkVBVEVfVklFV19JTkRFWF9GUk9NX0RFVklDRV9JTkRFWF9CSVRfS0hSID0gVktfUElQRUxJTkVfQ1JFQVRFX1ZJRVdfSU5ERVhfRlJPTV9ERVZJQ0VfSU5ERVhfQklULAorICAgIFZLX1BJUEVMSU5FX0NSRUFURV9ESVNQQVRDSF9CQVNFX0tIUiA9IFZLX1BJUEVMSU5FX0NSRUFURV9ESVNQQVRDSF9CQVNFLAorICAgIFZLX1BJUEVMSU5FX0NSRUFURV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrUGlwZWxpbmVDcmVhdGVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lQ3JlYXRlRmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyB7CisgICAgVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9BTExPV19WQVJZSU5HX1NVQkdST1VQX1NJWkVfQklUX0VYVCA9IDB4MDAwMDAwMDEsCisgICAgVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9SRVFVSVJFX0ZVTExfU1VCR1JPVVBTX0JJVF9FWFQgPSAweDAwMDAwMDAyLAorICAgIFZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyB7CisgICAgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQgPSAweDAwMDAwMDEwLAorICAgIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCA9IDB4MDAwMDAwMjAsCisgICAgVktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDUyA9IDB4MDAwMDAwMUYsCisgICAgVktfU0hBREVSX1NUQUdFX0FMTCA9IDB4N0ZGRkZGRkYsCisgICAgVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlYgPSAweDAwMDAwMTAwLAorICAgIFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OViA9IDB4MDAwMDAyMDAsCisgICAgVktfU0hBREVSX1NUQUdFX0NMT1NFU1RfSElUX0JJVF9OViA9IDB4MDAwMDA0MDAsCisgICAgVktfU0hBREVSX1NUQUdFX01JU1NfQklUX05WID0gMHgwMDAwMDgwMCwKKyAgICBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OViA9IDB4MDAwMDEwMDAsCisgICAgVktfU0hBREVSX1NUQUdFX0NBTExBQkxFX0JJVF9OViA9IDB4MDAwMDIwMDAsCisgICAgVktfU0hBREVSX1NUQUdFX1RBU0tfQklUX05WID0gMHgwMDAwMDA0MCwKKyAgICBWS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlYgPSAweDAwMDAwMDgwLAorICAgIFZLX1NIQURFUl9TVEFHRV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrU2hhZGVyU3RhZ2VGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUZsYWdzOwordHlwZWRlZiBWa0ZsYWdzIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVGbGFnczsKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVGbGFnczsKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUZsYWdzOwordHlwZWRlZiBWa0ZsYWdzIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrQ3VsbE1vZGVGbGFnQml0cyB7CisgICAgVktfQ1VMTF9NT0RFX05PTkUgPSAwLAorICAgIFZLX0NVTExfTU9ERV9GUk9OVF9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX0NVTExfTU9ERV9CQUNLX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfQ1VMTF9NT0RFX0ZST05UX0FORF9CQUNLID0gMHgwMDAwMDAwMywKKyAgICBWS19DVUxMX01PREVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0N1bGxNb2RlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtDdWxsTW9kZUZsYWdzOwordHlwZWRlZiBWa0ZsYWdzIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlRmxhZ3M7Cit0eXBlZGVmIFZrRmxhZ3MgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlRmxhZ3M7Cit0eXBlZGVmIFZrRmxhZ3MgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtDb2xvckNvbXBvbmVudEZsYWdCaXRzIHsKKyAgICBWS19DT0xPUl9DT01QT05FTlRfUl9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX0NPTE9SX0NPTVBPTkVOVF9HX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfQ09MT1JfQ09NUE9ORU5UX0JfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19DT0xPUl9DT01QT05FTlRfQV9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX0NPTE9SX0NPTVBPTkVOVF9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrQ29sb3JDb21wb25lbnRGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0NvbG9yQ29tcG9uZW50RmxhZ3M7Cit0eXBlZGVmIFZrRmxhZ3MgVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUZsYWdzOwordHlwZWRlZiBWa0ZsYWdzIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVGbGFnczsKK3R5cGVkZWYgVmtGbGFncyBWa1NoYWRlclN0YWdlRmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa1NhbXBsZXJDcmVhdGVGbGFnQml0cyB7CisgICAgVktfU0FNUExFUl9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUID0gMHgwMDAwMDAwMSwKKyAgICBWS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0NPQVJTRV9SRUNPTlNUUlVDVElPTl9CSVRfRVhUID0gMHgwMDAwMDAwMiwKKyAgICBWS19TQU1QTEVSX0NSRUFURV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrU2FtcGxlckNyZWF0ZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrU2FtcGxlckNyZWF0ZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMgeworICAgIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIgPSAweDAwMDAwMDAxLAorICAgIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUID0gMHgwMDAwMDAwMiwKKyAgICBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMgeworICAgIFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfRlJFRV9ERVNDUklQVE9SX1NFVF9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCA9IDB4MDAwMDAwMDIsCisgICAgVktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ3M7Cit0eXBlZGVmIFZrRmxhZ3MgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa0ZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHMgeworICAgIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiA9IDB4MDAwMDAwMDEsCisgICAgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrRnJhbWVidWZmZXJDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrUmVuZGVyUGFzc0NyZWF0ZUZsYWdCaXRzIHsKKyAgICBWS19SRU5ERVJfUEFTU19DUkVBVEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa1JlbmRlclBhc3NDcmVhdGVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1JlbmRlclBhc3NDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgeworICAgIFZLX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fTUFZX0FMSUFTX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfQVRUQUNITUVOVF9ERVNDUklQVElPTl9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnczsKKwordHlwZWRlZiBlbnVtIFZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMgeworICAgIFZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfQVRUUklCVVRFU19CSVRfTlZYID0gMHgwMDAwMDAwMSwKKyAgICBWS19TVUJQQVNTX0RFU0NSSVBUSU9OX1BFUl9WSUVXX1BPU0lUSU9OX1hfT05MWV9CSVRfTlZYID0gMHgwMDAwMDAwMiwKKyAgICBWS19TVUJQQVNTX0RFU0NSSVBUSU9OX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdzOworCit0eXBlZGVmIGVudW0gVmtBY2Nlc3NGbGFnQml0cyB7CisgICAgVktfQUNDRVNTX0lORElSRUNUX0NPTU1BTkRfUkVBRF9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX0FDQ0VTU19JTkRFWF9SRUFEX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfQUNDRVNTX1ZFUlRFWF9BVFRSSUJVVEVfUkVBRF9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX0FDQ0VTU19VTklGT1JNX1JFQURfQklUID0gMHgwMDAwMDAwOCwKKyAgICBWS19BQ0NFU1NfSU5QVVRfQVRUQUNITUVOVF9SRUFEX0JJVCA9IDB4MDAwMDAwMTAsCisgICAgVktfQUNDRVNTX1NIQURFUl9SRUFEX0JJVCA9IDB4MDAwMDAwMjAsCisgICAgVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQgPSAweDAwMDAwMDQwLAorICAgIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfQklUID0gMHgwMDAwMDA4MCwKKyAgICBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQgPSAweDAwMDAwMTAwLAorICAgIFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfUkVBRF9CSVQgPSAweDAwMDAwMjAwLAorICAgIFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklUID0gMHgwMDAwMDQwMCwKKyAgICBWS19BQ0NFU1NfVFJBTlNGRVJfUkVBRF9CSVQgPSAweDAwMDAwODAwLAorICAgIFZLX0FDQ0VTU19UUkFOU0ZFUl9XUklURV9CSVQgPSAweDAwMDAxMDAwLAorICAgIFZLX0FDQ0VTU19IT1NUX1JFQURfQklUID0gMHgwMDAwMjAwMCwKKyAgICBWS19BQ0NFU1NfSE9TVF9XUklURV9CSVQgPSAweDAwMDA0MDAwLAorICAgIFZLX0FDQ0VTU19NRU1PUllfUkVBRF9CSVQgPSAweDAwMDA4MDAwLAorICAgIFZLX0FDQ0VTU19NRU1PUllfV1JJVEVfQklUID0gMHgwMDAxMDAwMCwKKyAgICBWS19BQ0NFU1NfVFJBTlNGT1JNX0ZFRURCQUNLX1dSSVRFX0JJVF9FWFQgPSAweDAyMDAwMDAwLAorICAgIFZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9SRUFEX0JJVF9FWFQgPSAweDA0MDAwMDAwLAorICAgIFZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9XUklURV9CSVRfRVhUID0gMHgwODAwMDAwMCwKKyAgICBWS19BQ0NFU1NfQ09ORElUSU9OQUxfUkVOREVSSU5HX1JFQURfQklUX0VYVCA9IDB4MDAxMDAwMDAsCisgICAgVktfQUNDRVNTX0NPTU1BTkRfUFJPQ0VTU19SRUFEX0JJVF9OVlggPSAweDAwMDIwMDAwLAorICAgIFZLX0FDQ0VTU19DT01NQU5EX1BST0NFU1NfV1JJVEVfQklUX05WWCA9IDB4MDAwNDAwMDAsCisgICAgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfUkVBRF9OT05DT0hFUkVOVF9CSVRfRVhUID0gMHgwMDA4MDAwMCwKKyAgICBWS19BQ0NFU1NfU0hBRElOR19SQVRFX0lNQUdFX1JFQURfQklUX05WID0gMHgwMDgwMDAwMCwKKyAgICBWS19BQ0NFU1NfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9SRUFEX0JJVF9OViA9IDB4MDAyMDAwMDAsCisgICAgVktfQUNDRVNTX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfV1JJVEVfQklUX05WID0gMHgwMDQwMDAwMCwKKyAgICBWS19BQ0NFU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfUkVBRF9CSVRfRVhUID0gMHgwMTAwMDAwMCwKKyAgICBWS19BQ0NFU1NfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0FjY2Vzc0ZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrQWNjZXNzRmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa0RlcGVuZGVuY3lGbGFnQml0cyB7CisgICAgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19ERVBFTkRFTkNZX0RFVklDRV9HUk9VUF9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVRfS0hSID0gVktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVCwKKyAgICBWS19ERVBFTkRFTkNZX0RFVklDRV9HUk9VUF9CSVRfS0hSID0gVktfREVQRU5ERU5DWV9ERVZJQ0VfR1JPVVBfQklULAorICAgIFZLX0RFUEVOREVOQ1lfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0RlcGVuZGVuY3lGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0RlcGVuZGVuY3lGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrQ29tbWFuZFBvb2xDcmVhdGVGbGFnQml0cyB7CisgICAgVktfQ09NTUFORF9QT09MX0NSRUFURV9UUkFOU0lFTlRfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfQ09NTUFORF9QT09MX0NSRUFURV9QUk9URUNURURfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrQ29tbWFuZFBvb2xDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzIHsKKyAgICBWS19DT01NQU5EX1BPT0xfUkVTRVRfUkVMRUFTRV9SRVNPVVJDRVNfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19DT01NQU5EX1BPT0xfUkVTRVRfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0NvbW1hbmRQb29sUmVzZXRGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0NvbW1hbmRQb29sUmVzZXRGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHMgeworICAgIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtRdWVyeUNvbnRyb2xGbGFnQml0cyB7CisgICAgVktfUVVFUllfQ09OVFJPTF9QUkVDSVNFX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfUVVFUllfQ09OVFJPTF9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrUXVlcnlDb250cm9sRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtRdWVyeUNvbnRyb2xGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHMgeworICAgIFZLX0NPTU1BTkRfQlVGRkVSX1JFU0VUX1JFTEVBU0VfUkVTT1VSQ0VTX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfQ09NTUFORF9CVUZGRVJfUkVTRVRfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa1N0ZW5jaWxGYWNlRmxhZ0JpdHMgeworICAgIFZLX1NURU5DSUxfRkFDRV9GUk9OVF9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX1NURU5DSUxfRkFDRV9CQUNLX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfU1RFTkNJTF9GQUNFX0ZST05UX0FORF9CQUNLID0gMHgwMDAwMDAwMywKKyAgICBWS19TVEVOQ0lMX0ZST05UX0FORF9CQUNLID0gVktfU1RFTkNJTF9GQUNFX0ZST05UX0FORF9CQUNLLAorICAgIFZLX1NURU5DSUxfRkFDRV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrU3RlbmNpbEZhY2VGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1N0ZW5jaWxGYWNlRmxhZ3M7Cit0eXBlZGVmIHN0cnVjdCBWa0FwcGxpY2F0aW9uSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgcEFwcGxpY2F0aW9uTmFtZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgYXBwbGljYXRpb25WZXJzaW9uOworICAgIGNvbnN0IGNoYXIqICAgICAgICBwRW5naW5lTmFtZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgZW5naW5lVmVyc2lvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgYXBpVmVyc2lvbjsKK30gVmtBcHBsaWNhdGlvbkluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrSW5zdGFuY2VDcmVhdGVGbGFncyAgICAgICBmbGFnczsKKyAgICBjb25zdCBWa0FwcGxpY2F0aW9uSW5mbyogICAgcEFwcGxpY2F0aW9uSW5mbzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgZW5hYmxlZExheWVyQ291bnQ7CisgICAgY29uc3QgY2hhciogY29uc3QqICAgICAgICAgIHBwRW5hYmxlZExheWVyTmFtZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRFeHRlbnNpb25Db3VudDsKKyAgICBjb25zdCBjaGFyKiBjb25zdCogICAgICAgICAgcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXM7Cit9IFZrSW5zdGFuY2VDcmVhdGVJbmZvOworCit0eXBlZGVmIHZvaWQqIChWS0FQSV9QVFIgKlBGTl92a0FsbG9jYXRpb25GdW5jdGlvbikoCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50LAorICAgIFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvblNjb3BlKTsKKwordHlwZWRlZiB2b2lkKiAoVktBUElfUFRSICpQRk5fdmtSZWFsbG9jYXRpb25GdW5jdGlvbikoCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3JpZ2luYWwsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50LAorICAgIFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvblNjb3BlKTsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0ZyZWVGdW5jdGlvbikoCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5KTsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0ludGVybmFsQWxsb2NhdGlvbk5vdGlmaWNhdGlvbikoCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIFZrSW50ZXJuYWxBbGxvY2F0aW9uVHlwZSAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvblR5cGUsCisgICAgVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uU2NvcGUpOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrSW50ZXJuYWxGcmVlTm90aWZpY2F0aW9uKSgKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgVmtJbnRlcm5hbEFsbG9jYXRpb25UeXBlICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uVHlwZSwKKyAgICBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25TY29wZSk7CisKK3R5cGVkZWYgc3RydWN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsKKyAgICBQRk5fdmtBbGxvY2F0aW9uRnVuY3Rpb24gICAgICAgICAgICAgICAgcGZuQWxsb2NhdGlvbjsKKyAgICBQRk5fdmtSZWFsbG9jYXRpb25GdW5jdGlvbiAgICAgICAgICAgICAgcGZuUmVhbGxvY2F0aW9uOworICAgIFBGTl92a0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICBwZm5GcmVlOworICAgIFBGTl92a0ludGVybmFsQWxsb2NhdGlvbk5vdGlmaWNhdGlvbiAgICBwZm5JbnRlcm5hbEFsbG9jYXRpb247CisgICAgUEZOX3ZrSW50ZXJuYWxGcmVlTm90aWZpY2F0aW9uICAgICAgICAgIHBmbkludGVybmFsRnJlZTsKK30gVmtBbGxvY2F0aW9uQ2FsbGJhY2tzOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgeworICAgIFZrQm9vbDMyICAgIHJvYnVzdEJ1ZmZlckFjY2VzczsKKyAgICBWa0Jvb2wzMiAgICBmdWxsRHJhd0luZGV4VWludDMyOworICAgIFZrQm9vbDMyICAgIGltYWdlQ3ViZUFycmF5OworICAgIFZrQm9vbDMyICAgIGluZGVwZW5kZW50QmxlbmQ7CisgICAgVmtCb29sMzIgICAgZ2VvbWV0cnlTaGFkZXI7CisgICAgVmtCb29sMzIgICAgdGVzc2VsbGF0aW9uU2hhZGVyOworICAgIFZrQm9vbDMyICAgIHNhbXBsZVJhdGVTaGFkaW5nOworICAgIFZrQm9vbDMyICAgIGR1YWxTcmNCbGVuZDsKKyAgICBWa0Jvb2wzMiAgICBsb2dpY09wOworICAgIFZrQm9vbDMyICAgIG11bHRpRHJhd0luZGlyZWN0OworICAgIFZrQm9vbDMyICAgIGRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2U7CisgICAgVmtCb29sMzIgICAgZGVwdGhDbGFtcDsKKyAgICBWa0Jvb2wzMiAgICBkZXB0aEJpYXNDbGFtcDsKKyAgICBWa0Jvb2wzMiAgICBmaWxsTW9kZU5vblNvbGlkOworICAgIFZrQm9vbDMyICAgIGRlcHRoQm91bmRzOworICAgIFZrQm9vbDMyICAgIHdpZGVMaW5lczsKKyAgICBWa0Jvb2wzMiAgICBsYXJnZVBvaW50czsKKyAgICBWa0Jvb2wzMiAgICBhbHBoYVRvT25lOworICAgIFZrQm9vbDMyICAgIG11bHRpVmlld3BvcnQ7CisgICAgVmtCb29sMzIgICAgc2FtcGxlckFuaXNvdHJvcHk7CisgICAgVmtCb29sMzIgICAgdGV4dHVyZUNvbXByZXNzaW9uRVRDMjsKKyAgICBWa0Jvb2wzMiAgICB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUjsKKyAgICBWa0Jvb2wzMiAgICB0ZXh0dXJlQ29tcHJlc3Npb25CQzsKKyAgICBWa0Jvb2wzMiAgICBvY2NsdXNpb25RdWVyeVByZWNpc2U7CisgICAgVmtCb29sMzIgICAgcGlwZWxpbmVTdGF0aXN0aWNzUXVlcnk7CisgICAgVmtCb29sMzIgICAgdmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzOworICAgIFZrQm9vbDMyICAgIGZyYWdtZW50U3RvcmVzQW5kQXRvbWljczsKKyAgICBWa0Jvb2wzMiAgICBzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZTsKKyAgICBWa0Jvb2wzMiAgICBzaGFkZXJJbWFnZUdhdGhlckV4dGVuZGVkOworICAgIFZrQm9vbDMyICAgIHNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0czsKKyAgICBWa0Jvb2wzMiAgICBzaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZTsKKyAgICBWa0Jvb2wzMiAgICBzaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdDsKKyAgICBWa0Jvb2wzMiAgICBzaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXQ7CisgICAgVmtCb29sMzIgICAgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nOworICAgIFZrQm9vbDMyICAgIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nOworICAgIFZrQm9vbDMyICAgIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBWa0Jvb2wzMiAgICBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBWa0Jvb2wzMiAgICBzaGFkZXJDbGlwRGlzdGFuY2U7CisgICAgVmtCb29sMzIgICAgc2hhZGVyQ3VsbERpc3RhbmNlOworICAgIFZrQm9vbDMyICAgIHNoYWRlckZsb2F0NjQ7CisgICAgVmtCb29sMzIgICAgc2hhZGVySW50NjQ7CisgICAgVmtCb29sMzIgICAgc2hhZGVySW50MTY7CisgICAgVmtCb29sMzIgICAgc2hhZGVyUmVzb3VyY2VSZXNpZGVuY3k7CisgICAgVmtCb29sMzIgICAgc2hhZGVyUmVzb3VyY2VNaW5Mb2Q7CisgICAgVmtCb29sMzIgICAgc3BhcnNlQmluZGluZzsKKyAgICBWa0Jvb2wzMiAgICBzcGFyc2VSZXNpZGVuY3lCdWZmZXI7CisgICAgVmtCb29sMzIgICAgc3BhcnNlUmVzaWRlbmN5SW1hZ2UyRDsKKyAgICBWa0Jvb2wzMiAgICBzcGFyc2VSZXNpZGVuY3lJbWFnZTNEOworICAgIFZrQm9vbDMyICAgIHNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzOworICAgIFZrQm9vbDMyICAgIHNwYXJzZVJlc2lkZW5jeTRTYW1wbGVzOworICAgIFZrQm9vbDMyICAgIHNwYXJzZVJlc2lkZW5jeThTYW1wbGVzOworICAgIFZrQm9vbDMyICAgIHNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlczsKKyAgICBWa0Jvb2wzMiAgICBzcGFyc2VSZXNpZGVuY3lBbGlhc2VkOworICAgIFZrQm9vbDMyICAgIHZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlOworICAgIFZrQm9vbDMyICAgIGluaGVyaXRlZFF1ZXJpZXM7Cit9IFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczsKKwordHlwZWRlZiBzdHJ1Y3QgVmtGb3JtYXRQcm9wZXJ0aWVzIHsKKyAgICBWa0Zvcm1hdEZlYXR1cmVGbGFncyAgICBsaW5lYXJUaWxpbmdGZWF0dXJlczsKKyAgICBWa0Zvcm1hdEZlYXR1cmVGbGFncyAgICBvcHRpbWFsVGlsaW5nRmVhdHVyZXM7CisgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgICAgYnVmZmVyRmVhdHVyZXM7Cit9IFZrRm9ybWF0UHJvcGVydGllczsKKwordHlwZWRlZiBzdHJ1Y3QgVmtFeHRlbnQzRCB7CisgICAgdWludDMyX3QgICAgd2lkdGg7CisgICAgdWludDMyX3QgICAgaGVpZ2h0OworICAgIHVpbnQzMl90ICAgIGRlcHRoOworfSBWa0V4dGVudDNEOworCit0eXBlZGVmIHN0cnVjdCBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyB7CisgICAgVmtFeHRlbnQzRCAgICAgICAgICAgIG1heEV4dGVudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4TWlwTGV2ZWxzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhBcnJheUxheWVyczsKKyAgICBWa1NhbXBsZUNvdW50RmxhZ3MgICAgc2FtcGxlQ291bnRzOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICBtYXhSZXNvdXJjZVNpemU7Cit9IFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzIHsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4SW1hZ2VEaW1lbnNpb24xRDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4SW1hZ2VEaW1lbnNpb24yRDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4SW1hZ2VEaW1lbnNpb24zRDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4SW1hZ2VEaW1lbnNpb25DdWJlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhJbWFnZUFycmF5TGF5ZXJzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhUZXhlbEJ1ZmZlckVsZW1lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhVbmlmb3JtQnVmZmVyUmFuZ2U7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heFN0b3JhZ2VCdWZmZXJSYW5nZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4UHVzaENvbnN0YW50c1NpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heE1lbW9yeUFsbG9jYXRpb25Db3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4U2FtcGxlckFsbG9jYXRpb25Db3VudDsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgYnVmZmVySW1hZ2VHcmFudWxhcml0eTsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgc3BhcnNlQWRkcmVzc1NwYWNlU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4Qm91bmREZXNjcmlwdG9yU2V0czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVyczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUltYWdlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5wdXRBdHRhY2htZW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4UGVyU3RhZ2VSZXNvdXJjZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heERlc2NyaXB0b3JTZXRTYW1wbGVyczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heFZlcnRleElucHV0QXR0cmlidXRlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4VmVydGV4SW5wdXRCaW5kaW5nczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4VmVydGV4T3V0cHV0Q29tcG9uZW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhUZXNzZWxsYXRpb25QYXRjaFNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhUZXNzZWxsYXRpb25Db250cm9sVG90YWxPdXRwdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9uczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhGcmFnbWVudE91dHB1dEF0dGFjaG1lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhGcmFnbWVudER1YWxTcmNBdHRhY2htZW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heENvbXB1dGVXb3JrR3JvdXBDb3VudFszXTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhDb21wdXRlV29ya0dyb3VwU2l6ZVszXTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgc3ViUGl4ZWxQcmVjaXNpb25CaXRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBzdWJUZXhlbFByZWNpc2lvbkJpdHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1pcG1hcFByZWNpc2lvbkJpdHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heERyYXdJbmRleGVkSW5kZXhWYWx1ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4RHJhd0luZGlyZWN0Q291bnQ7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIG1heFNhbXBsZXJMb2RCaWFzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICBtYXhTYW1wbGVyQW5pc290cm9weTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4Vmlld3BvcnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhWaWV3cG9ydERpbWVuc2lvbnNbMl07CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIHZpZXdwb3J0Qm91bmRzUmFuZ2VbMl07CisgICAgdWludDMyX3QgICAgICAgICAgICAgIHZpZXdwb3J0U3ViUGl4ZWxCaXRzOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtaW5NZW1vcnlNYXBBbGlnbm1lbnQ7CisgICAgVmtEZXZpY2VTaXplICAgICAgICAgIG1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICBtaW5Vbmlmb3JtQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICBtaW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIGludDMyX3QgICAgICAgICAgICAgICBtaW5UZXhlbE9mZnNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4VGV4ZWxPZmZzZXQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIG1pblRleGVsR2F0aGVyT2Zmc2V0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhUZXhlbEdhdGhlck9mZnNldDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgbWluSW50ZXJwb2xhdGlvbk9mZnNldDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgbWF4SW50ZXJwb2xhdGlvbk9mZnNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgc3ViUGl4ZWxJbnRlcnBvbGF0aW9uT2Zmc2V0Qml0czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4RnJhbWVidWZmZXJXaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4RnJhbWVidWZmZXJIZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heEZyYW1lYnVmZmVyTGF5ZXJzOworICAgIFZrU2FtcGxlQ291bnRGbGFncyAgICBmcmFtZWJ1ZmZlckNvbG9yU2FtcGxlQ291bnRzOworICAgIFZrU2FtcGxlQ291bnRGbGFncyAgICBmcmFtZWJ1ZmZlckRlcHRoU2FtcGxlQ291bnRzOworICAgIFZrU2FtcGxlQ291bnRGbGFncyAgICBmcmFtZWJ1ZmZlclN0ZW5jaWxTYW1wbGVDb3VudHM7CisgICAgVmtTYW1wbGVDb3VudEZsYWdzICAgIGZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWF4Q29sb3JBdHRhY2htZW50czsKKyAgICBWa1NhbXBsZUNvdW50RmxhZ3MgICAgc2FtcGxlZEltYWdlQ29sb3JTYW1wbGVDb3VudHM7CisgICAgVmtTYW1wbGVDb3VudEZsYWdzICAgIHNhbXBsZWRJbWFnZUludGVnZXJTYW1wbGVDb3VudHM7CisgICAgVmtTYW1wbGVDb3VudEZsYWdzICAgIHNhbXBsZWRJbWFnZURlcHRoU2FtcGxlQ291bnRzOworICAgIFZrU2FtcGxlQ291bnRGbGFncyAgICBzYW1wbGVkSW1hZ2VTdGVuY2lsU2FtcGxlQ291bnRzOworICAgIFZrU2FtcGxlQ291bnRGbGFncyAgICBzdG9yYWdlSW1hZ2VTYW1wbGVDb3VudHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heFNhbXBsZU1hc2tXb3JkczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgdGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICB0aW1lc3RhbXBQZXJpb2Q7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heENsaXBEaXN0YW5jZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heEN1bGxEaXN0YW5jZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIGRpc2NyZXRlUXVldWVQcmlvcml0aWVzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICBwb2ludFNpemVSYW5nZVsyXTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgbGluZVdpZHRoUmFuZ2VbMl07CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIHBvaW50U2l6ZUdyYW51bGFyaXR5OworICAgIGZsb2F0ICAgICAgICAgICAgICAgICBsaW5lV2lkdGhHcmFudWxhcml0eTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgc3RyaWN0TGluZXM7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgIHN0YW5kYXJkU2FtcGxlTG9jYXRpb25zOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICBvcHRpbWFsQnVmZmVyQ29weU9mZnNldEFsaWdubWVudDsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgb3B0aW1hbEJ1ZmZlckNvcHlSb3dQaXRjaEFsaWdubWVudDsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgbm9uQ29oZXJlbnRBdG9tU2l6ZTsKK30gVmtQaHlzaWNhbERldmljZUxpbWl0czsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMgeworICAgIFZrQm9vbDMyICAgIHJlc2lkZW5jeVN0YW5kYXJkMkRCbG9ja1NoYXBlOworICAgIFZrQm9vbDMyICAgIHJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGU7CisgICAgVmtCb29sMzIgICAgcmVzaWRlbmN5U3RhbmRhcmQzREJsb2NrU2hhcGU7CisgICAgVmtCb29sMzIgICAgcmVzaWRlbmN5QWxpZ25lZE1pcFNpemU7CisgICAgVmtCb29sMzIgICAgcmVzaWRlbmN5Tm9uUmVzaWRlbnRTdHJpY3Q7Cit9IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyB7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpVmVyc2lvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJWZXJzaW9uOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcklEOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlEOworICAgIFZrUGh5c2ljYWxEZXZpY2VUeXBlICAgICAgICAgICAgICAgIGRldmljZVR5cGU7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZVtWS19NQVhfUEhZU0lDQUxfREVWSUNFX05BTUVfU0laRV07CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZVVVSURbVktfVVVJRF9TSVpFXTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICAgICAgICAgICAgICBsaW1pdHM7CisgICAgVmtQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMgICAgc3BhcnNlUHJvcGVydGllczsKK30gVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzIHsKKyAgICBWa1F1ZXVlRmxhZ3MgICAgcXVldWVGbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgcXVldWVDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgdGltZXN0YW1wVmFsaWRCaXRzOworICAgIFZrRXh0ZW50M0QgICAgICBtaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHk7Cit9IFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa01lbW9yeVR5cGUgeworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyAgICBwcm9wZXJ0eUZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBoZWFwSW5kZXg7Cit9IFZrTWVtb3J5VHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtNZW1vcnlIZWFwIHsKKyAgICBWa0RldmljZVNpemUgICAgICAgICBzaXplOworICAgIFZrTWVtb3J5SGVhcEZsYWdzICAgIGZsYWdzOworfSBWa01lbW9yeUhlYXA7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIHsKKyAgICB1aW50MzJfdCAgICAgICAgbWVtb3J5VHlwZUNvdW50OworICAgIFZrTWVtb3J5VHlwZSAgICBtZW1vcnlUeXBlc1tWS19NQVhfTUVNT1JZX1RZUEVTXTsKKyAgICB1aW50MzJfdCAgICAgICAgbWVtb3J5SGVhcENvdW50OworICAgIFZrTWVtb3J5SGVhcCAgICBtZW1vcnlIZWFwc1tWS19NQVhfTUVNT1JZX0hFQVBTXTsKK30gVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM7CisKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtWb2lkRnVuY3Rpb24pKHZvaWQpOwordHlwZWRlZiBzdHJ1Y3QgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBxdWV1ZUNvdW50OworICAgIGNvbnN0IGZsb2F0KiAgICAgICAgICAgICAgICBwUXVldWVQcmlvcml0aWVzOworfSBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXZpY2VDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZXZpY2VDcmVhdGVGbGFncyAgICAgICAgICAgICAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlQ3JlYXRlSW5mb0NvdW50OworICAgIGNvbnN0IFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKiAgICAgcFF1ZXVlQ3JlYXRlSW5mb3M7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkTGF5ZXJDb3VudDsKKyAgICBjb25zdCBjaGFyKiBjb25zdCogICAgICAgICAgICAgICAgIHBwRW5hYmxlZExheWVyTmFtZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgY29uc3QgY2hhciogY29uc3QqICAgICAgICAgICAgICAgICBwcEVuYWJsZWRFeHRlbnNpb25OYW1lczsKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqICAgIHBFbmFibGVkRmVhdHVyZXM7Cit9IFZrRGV2aWNlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIHsKKyAgICBjaGFyICAgICAgICBleHRlbnNpb25OYW1lW1ZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFXTsKKyAgICB1aW50MzJfdCAgICBzcGVjVmVyc2lvbjsKK30gVmtFeHRlbnNpb25Qcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa0xheWVyUHJvcGVydGllcyB7CisgICAgY2hhciAgICAgICAgbGF5ZXJOYW1lW1ZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFXTsKKyAgICB1aW50MzJfdCAgICBzcGVjVmVyc2lvbjsKKyAgICB1aW50MzJfdCAgICBpbXBsZW1lbnRhdGlvblZlcnNpb247CisgICAgY2hhciAgICAgICAgZGVzY3JpcHRpb25bVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworfSBWa0xheWVyUHJvcGVydGllczsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTdWJtaXRJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICB3YWl0U2VtYXBob3JlQ291bnQ7CisgICAgY29uc3QgVmtTZW1hcGhvcmUqICAgICAgICAgICAgIHBXYWl0U2VtYXBob3JlczsKKyAgICBjb25zdCBWa1BpcGVsaW5lU3RhZ2VGbGFncyogICAgcFdhaXREc3RTdGFnZU1hc2s7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudDsKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgcENvbW1hbmRCdWZmZXJzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxTZW1hcGhvcmVDb3VudDsKKyAgICBjb25zdCBWa1NlbWFwaG9yZSogICAgICAgICAgICAgcFNpZ25hbFNlbWFwaG9yZXM7Cit9IFZrU3VibWl0SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtEZXZpY2VTaXplICAgICAgIGFsbG9jYXRpb25TaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICBtZW1vcnlUeXBlSW5kZXg7Cit9IFZrTWVtb3J5QWxsb2NhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa01hcHBlZE1lbW9yeVJhbmdlIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrRGV2aWNlTWVtb3J5ICAgICBtZW1vcnk7CisgICAgVmtEZXZpY2VTaXplICAgICAgIG9mZnNldDsKKyAgICBWa0RldmljZVNpemUgICAgICAgc2l6ZTsKK30gVmtNYXBwZWRNZW1vcnlSYW5nZTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtNZW1vcnlSZXF1aXJlbWVudHMgeworICAgIFZrRGV2aWNlU2l6ZSAgICBzaXplOworICAgIFZrRGV2aWNlU2l6ZSAgICBhbGlnbm1lbnQ7CisgICAgdWludDMyX3QgICAgICAgIG1lbW9yeVR5cGVCaXRzOworfSBWa01lbW9yeVJlcXVpcmVtZW50czsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgeworICAgIFZrSW1hZ2VBc3BlY3RGbGFncyAgICAgICAgICBhc3BlY3RNYXNrOworICAgIFZrRXh0ZW50M0QgICAgICAgICAgICAgICAgICBpbWFnZUdyYW51bGFyaXR5OworICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRGbGFncyAgICBmbGFnczsKK30gVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgeworICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICAgIGZvcm1hdFByb3BlcnRpZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNaXBUYWlsRmlyc3RMb2Q7CisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNaXBUYWlsU2l6ZTsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICBpbWFnZU1pcFRhaWxPZmZzZXQ7CisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNaXBUYWlsU3RyaWRlOworfSBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzOworCit0eXBlZGVmIHN0cnVjdCBWa1NwYXJzZU1lbW9yeUJpbmQgeworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgIHJlc291cmNlT2Zmc2V0OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgIHNpemU7CisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgbWVtb3J5OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldDsKKyAgICBWa1NwYXJzZU1lbW9yeUJpbmRGbGFncyAgICBmbGFnczsKK30gVmtTcGFyc2VNZW1vcnlCaW5kOworCit0eXBlZGVmIHN0cnVjdCBWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvIHsKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGJpbmRDb3VudDsKKyAgICBjb25zdCBWa1NwYXJzZU1lbW9yeUJpbmQqICAgIHBCaW5kczsKK30gVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvIHsKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgIGltYWdlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgYmluZENvdW50OworICAgIGNvbnN0IFZrU3BhcnNlTWVtb3J5QmluZCogICAgcEJpbmRzOworfSBWa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrSW1hZ2VTdWJyZXNvdXJjZSB7CisgICAgVmtJbWFnZUFzcGVjdEZsYWdzICAgIGFzcGVjdE1hc2s7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1pcExldmVsOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBhcnJheUxheWVyOworfSBWa0ltYWdlU3VicmVzb3VyY2U7CisKK3R5cGVkZWYgc3RydWN0IFZrT2Zmc2V0M0QgeworICAgIGludDMyX3QgICAgeDsKKyAgICBpbnQzMl90ICAgIHk7CisgICAgaW50MzJfdCAgICB6OworfSBWa09mZnNldDNEOworCit0eXBlZGVmIHN0cnVjdCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZCB7CisgICAgVmtJbWFnZVN1YnJlc291cmNlICAgICAgICAgc3VicmVzb3VyY2U7CisgICAgVmtPZmZzZXQzRCAgICAgICAgICAgICAgICAgb2Zmc2V0OworICAgIFZrRXh0ZW50M0QgICAgICAgICAgICAgICAgIGV4dGVudDsKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICBtZW1vcnk7CisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0OworICAgIFZrU3BhcnNlTWVtb3J5QmluZEZsYWdzICAgIGZsYWdzOworfSBWa1NwYXJzZUltYWdlTWVtb3J5QmluZDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvIHsKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRDb3VudDsKKyAgICBjb25zdCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZCogICAgcEJpbmRzOworfSBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrQmluZFNwYXJzZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRTZW1hcGhvcmVDb3VudDsKKyAgICBjb25zdCBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgIHBXYWl0U2VtYXBob3JlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckJpbmRDb3VudDsKKyAgICBjb25zdCBWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKiAgICAgICAgIHBCdWZmZXJCaW5kczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlT3BhcXVlQmluZENvdW50OworICAgIGNvbnN0IFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyogICAgcEltYWdlT3BhcXVlQmluZHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUJpbmRDb3VudDsKKyAgICBjb25zdCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qICAgICAgICAgIHBJbWFnZUJpbmRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsU2VtYXBob3JlQ291bnQ7CisgICAgY29uc3QgVmtTZW1hcGhvcmUqICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lnbmFsU2VtYXBob3JlczsKK30gVmtCaW5kU3BhcnNlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtGZW5jZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgcE5leHQ7CisgICAgVmtGZW5jZUNyZWF0ZUZsYWdzICAgIGZsYWdzOworfSBWa0ZlbmNlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTZW1hcGhvcmVDcmVhdGVGbGFncyAgICBmbGFnczsKK30gVmtTZW1hcGhvcmVDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0V2ZW50Q3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V2ZW50Q3JlYXRlRmxhZ3MgICAgZmxhZ3M7Cit9IFZrRXZlbnRDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUXVlcnlQb29sQ3JlYXRlRmxhZ3MgICAgICAgICAgIGZsYWdzOworICAgIFZrUXVlcnlUeXBlICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50OworICAgIFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzICAgIHBpcGVsaW5lU3RhdGlzdGljczsKK30gVmtRdWVyeVBvb2xDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0J1ZmZlckNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICBwTmV4dDsKKyAgICBWa0J1ZmZlckNyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgc2l6ZTsKKyAgICBWa0J1ZmZlclVzYWdlRmxhZ3MgICAgIHVzYWdlOworICAgIFZrU2hhcmluZ01vZGUgICAgICAgICAgc2hhcmluZ01vZGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzOworfSBWa0J1ZmZlckNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQnVmZmVyVmlld0NyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjsKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICBmb3JtYXQ7CisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgb2Zmc2V0OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgIHJhbmdlOworfSBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0ltYWdlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgZmxhZ3M7CisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgIGltYWdlVHlwZTsKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgZm9ybWF0OworICAgIFZrRXh0ZW50M0QgICAgICAgICAgICAgICBleHRlbnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgIG1pcExldmVsczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgYXJyYXlMYXllcnM7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgIHNhbXBsZXM7CisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgIHRpbGluZzsKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgdXNhZ2U7CisgICAgVmtTaGFyaW5nTW9kZSAgICAgICAgICAgIHNoYXJpbmdNb2RlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgIGluaXRpYWxMYXlvdXQ7Cit9IFZrSW1hZ2VDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa1N1YnJlc291cmNlTGF5b3V0IHsKKyAgICBWa0RldmljZVNpemUgICAgb2Zmc2V0OworICAgIFZrRGV2aWNlU2l6ZSAgICBzaXplOworICAgIFZrRGV2aWNlU2l6ZSAgICByb3dQaXRjaDsKKyAgICBWa0RldmljZVNpemUgICAgYXJyYXlQaXRjaDsKKyAgICBWa0RldmljZVNpemUgICAgZGVwdGhQaXRjaDsKK30gVmtTdWJyZXNvdXJjZUxheW91dDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtDb21wb25lbnRNYXBwaW5nIHsKKyAgICBWa0NvbXBvbmVudFN3aXp6bGUgICAgcjsKKyAgICBWa0NvbXBvbmVudFN3aXp6bGUgICAgZzsKKyAgICBWa0NvbXBvbmVudFN3aXp6bGUgICAgYjsKKyAgICBWa0NvbXBvbmVudFN3aXp6bGUgICAgYTsKK30gVmtDb21wb25lbnRNYXBwaW5nOworCit0eXBlZGVmIHN0cnVjdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSB7CisgICAgVmtJbWFnZUFzcGVjdEZsYWdzICAgIGFzcGVjdE1hc2s7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIGJhc2VNaXBMZXZlbDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbGV2ZWxDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgYmFzZUFycmF5TGF5ZXI7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIGxheWVyQ291bnQ7Cit9IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlOworCit0eXBlZGVmIHN0cnVjdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ3MgICAgIGZsYWdzOworICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgIGltYWdlOworICAgIFZrSW1hZ2VWaWV3VHlwZSAgICAgICAgICAgIHZpZXdUeXBlOworICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgIGZvcm1hdDsKKyAgICBWa0NvbXBvbmVudE1hcHBpbmcgICAgICAgICBjb21wb25lbnRzOworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICAgIHN1YnJlc291cmNlUmFuZ2U7Cit9IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTaGFkZXJNb2R1bGVDcmVhdGVGbGFncyAgICBmbGFnczsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgIGNvZGVTaXplOworICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgcENvZGU7Cit9IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQaXBlbGluZUNhY2hlQ3JlYXRlRmxhZ3MgICAgZmxhZ3M7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbERhdGFTaXplOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgIHBJbml0aWFsRGF0YTsKK30gVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5IHsKKyAgICB1aW50MzJfdCAgICBjb25zdGFudElEOworICAgIHVpbnQzMl90ICAgIG9mZnNldDsKKyAgICBzaXplX3QgICAgICBzaXplOworfSBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IFZrU3BlY2lhbGl6YXRpb25JbmZvIHsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEVudHJ5Q291bnQ7CisgICAgY29uc3QgVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5KiAgICBwTWFwRW50cmllczsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcERhdGE7Cit9IFZrU3BlY2lhbGl6YXRpb25JbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyAgICBmbGFnczsKKyAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICBzdGFnZTsKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICBtb2R1bGU7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWU7CisgICAgY29uc3QgVmtTcGVjaWFsaXphdGlvbkluZm8qICAgICAgICAgcFNwZWNpYWxpemF0aW9uSW5mbzsKK30gVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiB7CisgICAgdWludDMyX3QgICAgICAgICAgICAgYmluZGluZzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICBzdHJpZGU7CisgICAgVmtWZXJ0ZXhJbnB1dFJhdGUgICAgaW5wdXRSYXRlOworfSBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uOworCit0eXBlZGVmIHN0cnVjdCBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24geworICAgIHVpbnQzMl90ICAgIGxvY2F0aW9uOworICAgIHVpbnQzMl90ICAgIGJpbmRpbmc7CisgICAgVmtGb3JtYXQgICAgZm9ybWF0OworICAgIHVpbnQzMl90ICAgIG9mZnNldDsKK30gVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUZsYWdzICAgICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ7CisgICAgY29uc3QgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiogICAgICBwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQ7CisgICAgY29uc3QgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uKiAgICBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zOworfSBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVGbGFncyAgICBmbGFnczsKKyAgICBWa1ByaW1pdGl2ZVRvcG9sb2d5ICAgICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ3k7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZVJlc3RhcnRFbmFibGU7Cit9IFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVGbGFncyAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaENvbnRyb2xQb2ludHM7Cit9IFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrVmlld3BvcnQgeworICAgIGZsb2F0ICAgIHg7CisgICAgZmxvYXQgICAgeTsKKyAgICBmbG9hdCAgICB3aWR0aDsKKyAgICBmbG9hdCAgICBoZWlnaHQ7CisgICAgZmxvYXQgICAgbWluRGVwdGg7CisgICAgZmxvYXQgICAgbWF4RGVwdGg7Cit9IFZrVmlld3BvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFZrT2Zmc2V0MkQgeworICAgIGludDMyX3QgICAgeDsKKyAgICBpbnQzMl90ICAgIHk7Cit9IFZrT2Zmc2V0MkQ7CisKK3R5cGVkZWYgc3RydWN0IFZrRXh0ZW50MkQgeworICAgIHVpbnQzMl90ICAgIHdpZHRoOworICAgIHVpbnQzMl90ICAgIGhlaWdodDsKK30gVmtFeHRlbnQyRDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtSZWN0MkQgeworICAgIFZrT2Zmc2V0MkQgICAgb2Zmc2V0OworICAgIFZrRXh0ZW50MkQgICAgZXh0ZW50OworfSBWa1JlY3QyRDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVGbGFncyAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQ7CisgICAgY29uc3QgVmtWaWV3cG9ydCogICAgICAgICAgICAgICAgICAgICBwVmlld3BvcnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3NvckNvdW50OworICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgcFNjaXNzb3JzOworfSBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVGbGFncyAgICBmbGFnczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhDbGFtcEVuYWJsZTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyaXplckRpc2NhcmRFbmFibGU7CisgICAgVmtQb2x5Z29uTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlnb25Nb2RlOworICAgIFZrQ3VsbE1vZGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWxsTW9kZTsKKyAgICBWa0Zyb250RmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRGYWNlOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNFbmFibGU7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDbGFtcDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3I7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aDsKK30gVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlRmxhZ3MgICAgZmxhZ3M7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgICAgICAgICAgICByYXN0ZXJpemF0aW9uU2FtcGxlczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNoYWRpbmdFbmFibGU7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TYW1wbGVTaGFkaW5nOworICAgIGNvbnN0IFZrU2FtcGxlTWFzayogICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZU1hc2s7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVRvQ292ZXJhZ2VFbmFibGU7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVRvT25lRW5hYmxlOworfSBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrU3RlbmNpbE9wU3RhdGUgeworICAgIFZrU3RlbmNpbE9wICAgIGZhaWxPcDsKKyAgICBWa1N0ZW5jaWxPcCAgICBwYXNzT3A7CisgICAgVmtTdGVuY2lsT3AgICAgZGVwdGhGYWlsT3A7CisgICAgVmtDb21wYXJlT3AgICAgY29tcGFyZU9wOworICAgIHVpbnQzMl90ICAgICAgIGNvbXBhcmVNYXNrOworICAgIHVpbnQzMl90ICAgICAgIHdyaXRlTWFzazsKKyAgICB1aW50MzJfdCAgICAgICByZWZlcmVuY2U7Cit9IFZrU3RlbmNpbE9wU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoVGVzdEVuYWJsZTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aFdyaXRlRW5hYmxlOworICAgIFZrQ29tcGFyZU9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQ29tcGFyZU9wOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQm91bmRzVGVzdEVuYWJsZTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVuY2lsVGVzdEVuYWJsZTsKKyAgICBWa1N0ZW5jaWxPcFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udDsKKyAgICBWa1N0ZW5jaWxPcFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRlcHRoQm91bmRzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzOworfSBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSB7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgIGJsZW5kRW5hYmxlOworICAgIFZrQmxlbmRGYWN0b3IgICAgICAgICAgICBzcmNDb2xvckJsZW5kRmFjdG9yOworICAgIFZrQmxlbmRGYWN0b3IgICAgICAgICAgICBkc3RDb2xvckJsZW5kRmFjdG9yOworICAgIFZrQmxlbmRPcCAgICAgICAgICAgICAgICBjb2xvckJsZW5kT3A7CisgICAgVmtCbGVuZEZhY3RvciAgICAgICAgICAgIHNyY0FscGhhQmxlbmRGYWN0b3I7CisgICAgVmtCbGVuZEZhY3RvciAgICAgICAgICAgIGRzdEFscGhhQmxlbmRGYWN0b3I7CisgICAgVmtCbGVuZE9wICAgICAgICAgICAgICAgIGFscGhhQmxlbmRPcDsKKyAgICBWa0NvbG9yQ29tcG9uZW50RmxhZ3MgICAgY29sb3JXcml0ZU1hc2s7Cit9IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlRmxhZ3MgICAgICAgICAgZmxhZ3M7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljT3BFbmFibGU7CisgICAgVmtMb2dpY09wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljT3A7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSogICAgcEF0dGFjaG1lbnRzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZENvbnN0YW50c1s0XTsKK30gVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVGbGFncyAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1N0YXRlQ291bnQ7CisgICAgY29uc3QgVmtEeW5hbWljU3RhdGUqICAgICAgICAgICAgICAgIHBEeW5hbWljU3RhdGVzOworfSBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlQ291bnQ7CisgICAgY29uc3QgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogICAgICAgICAgIHBTdGFnZXM7CisgICAgY29uc3QgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKiAgICAgIHBWZXJ0ZXhJbnB1dFN0YXRlOworICAgIGNvbnN0IFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKiAgICBwSW5wdXRBc3NlbWJseVN0YXRlOworICAgIGNvbnN0IFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8qICAgICBwVGVzc2VsbGF0aW9uU3RhdGU7CisgICAgY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKiAgICAgICAgIHBWaWV3cG9ydFN0YXRlOworICAgIGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKiAgICBwUmFzdGVyaXphdGlvblN0YXRlOworICAgIGNvbnN0IFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyogICAgICBwTXVsdGlzYW1wbGVTdGF0ZTsKKyAgICBjb25zdCBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKiAgICAgcERlcHRoU3RlbmNpbFN0YXRlOworICAgIGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKiAgICAgICBwQ29sb3JCbGVuZFN0YXRlOworICAgIGNvbnN0IFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKiAgICAgICAgICBwRHluYW1pY1N0YXRlOworICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ7CisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3M7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3M7CisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQaXBlbGluZUhhbmRsZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVBpcGVsaW5lSW5kZXg7Cit9IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVDcmVhdGVGbGFncyAgICAgICAgICAgICAgZmxhZ3M7CisgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAgICBzdGFnZTsKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgIGxheW91dDsKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQaXBlbGluZUhhbmRsZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQaXBlbGluZUluZGV4OworfSBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUHVzaENvbnN0YW50UmFuZ2UgeworICAgIFZrU2hhZGVyU3RhZ2VGbGFncyAgICBzdGFnZUZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBvZmZzZXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIHNpemU7Cit9IFZrUHVzaENvbnN0YW50UmFuZ2U7CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUZsYWdzICAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHNldExheW91dENvdW50OworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dCogICAgcFNldExheW91dHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ29uc3RhbnRSYW5nZUNvdW50OworICAgIGNvbnN0IFZrUHVzaENvbnN0YW50UmFuZ2UqICAgICAgcFB1c2hDb25zdGFudFJhbmdlczsKK30gVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrU2FtcGxlckNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgIHBOZXh0OworICAgIFZrU2FtcGxlckNyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgIG1hZ0ZpbHRlcjsKKyAgICBWa0ZpbHRlciAgICAgICAgICAgICAgICBtaW5GaWx0ZXI7CisgICAgVmtTYW1wbGVyTWlwbWFwTW9kZSAgICAgbWlwbWFwTW9kZTsKKyAgICBWa1NhbXBsZXJBZGRyZXNzTW9kZSAgICBhZGRyZXNzTW9kZVU7CisgICAgVmtTYW1wbGVyQWRkcmVzc01vZGUgICAgYWRkcmVzc01vZGVWOworICAgIFZrU2FtcGxlckFkZHJlc3NNb2RlICAgIGFkZHJlc3NNb2RlVzsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtaXBMb2RCaWFzOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgIGFuaXNvdHJvcHlFbmFibGU7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbWF4QW5pc290cm9weTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICBjb21wYXJlRW5hYmxlOworICAgIFZrQ29tcGFyZU9wICAgICAgICAgICAgIGNvbXBhcmVPcDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtaW5Mb2Q7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbWF4TG9kOworICAgIFZrQm9yZGVyQ29sb3IgICAgICAgICAgIGJvcmRlckNvbG9yOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgIHVubm9ybWFsaXplZENvb3JkaW5hdGVzOworfSBWa1NhbXBsZXJDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIHsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgYmluZGluZzsKKyAgICBWa0Rlc2NyaXB0b3JUeXBlICAgICAgZGVzY3JpcHRvclR5cGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIGRlc2NyaXB0b3JDb3VudDsKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgc3RhZ2VGbGFnczsKKyAgICBjb25zdCBWa1NhbXBsZXIqICAgICAgcEltbXV0YWJsZVNhbXBsZXJzOworfSBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nOworCit0eXBlZGVmIHN0cnVjdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFncyAgICAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQ7CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyogICAgcEJpbmRpbmdzOworfSBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0Rlc2NyaXB0b3JQb29sU2l6ZSB7CisgICAgVmtEZXNjcmlwdG9yVHlwZSAgICB0eXBlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgZGVzY3JpcHRvckNvdW50OworfSBWa0Rlc2NyaXB0b3JQb29sU2l6ZTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBtYXhTZXRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBwb29sU2l6ZUNvdW50OworICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xTaXplKiAgICBwUG9vbFNpemVzOworfSBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudDsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqICAgIHBTZXRMYXlvdXRzOworfSBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrRGVzY3JpcHRvckltYWdlSW5mbyB7CisgICAgVmtTYW1wbGVyICAgICAgICBzYW1wbGVyOworICAgIFZrSW1hZ2VWaWV3ICAgICAgaW1hZ2VWaWV3OworICAgIFZrSW1hZ2VMYXlvdXQgICAgaW1hZ2VMYXlvdXQ7Cit9IFZrRGVzY3JpcHRvckltYWdlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyB7CisgICAgVmtCdWZmZXIgICAgICAgIGJ1ZmZlcjsKKyAgICBWa0RldmljZVNpemUgICAgb2Zmc2V0OworICAgIFZrRGV2aWNlU2l6ZSAgICByYW5nZTsKK30gVmtEZXNjcmlwdG9yQnVmZmVySW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGVzY3JpcHRvclNldCAgICAgICAgICAgICAgICAgIGRzdFNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCaW5kaW5nOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEFycmF5RWxlbWVudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ291bnQ7CisgICAgVmtEZXNjcmlwdG9yVHlwZSAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclR5cGU7CisgICAgY29uc3QgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvKiAgICAgcEltYWdlSW5mbzsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvKiAgICBwQnVmZmVySW5mbzsKKyAgICBjb25zdCBWa0J1ZmZlclZpZXcqICAgICAgICAgICAgICBwVGV4ZWxCdWZmZXJWaWV3OworfSBWa1dyaXRlRGVzY3JpcHRvclNldDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtDb3B5RGVzY3JpcHRvclNldCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgc3JjU2V0OworICAgIHVpbnQzMl90ICAgICAgICAgICBzcmNCaW5kaW5nOworICAgIHVpbnQzMl90ICAgICAgICAgICBzcmNBcnJheUVsZW1lbnQ7CisgICAgVmtEZXNjcmlwdG9yU2V0ICAgIGRzdFNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgZHN0QmluZGluZzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgZHN0QXJyYXlFbGVtZW50OworICAgIHVpbnQzMl90ICAgICAgICAgICBkZXNjcmlwdG9yQ291bnQ7Cit9IFZrQ29weURlc2NyaXB0b3JTZXQ7CisKK3R5cGVkZWYgc3RydWN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVGbGFncyAgICBmbGFnczsKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgcmVuZGVyUGFzczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50OworICAgIGNvbnN0IFZrSW1hZ2VWaWV3KiAgICAgICAgICBwQXR0YWNobWVudHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHdpZHRoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBoZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGxheWVyczsKK30gVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHsKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzICAgIGZsYWdzOworICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OworICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgc2FtcGxlczsKKyAgICBWa0F0dGFjaG1lbnRMb2FkT3AgICAgICAgICAgICAgIGxvYWRPcDsKKyAgICBWa0F0dGFjaG1lbnRTdG9yZU9wICAgICAgICAgICAgIHN0b3JlT3A7CisgICAgVmtBdHRhY2htZW50TG9hZE9wICAgICAgICAgICAgICBzdGVuY2lsTG9hZE9wOworICAgIFZrQXR0YWNobWVudFN0b3JlT3AgICAgICAgICAgICAgc3RlbmNpbFN0b3JlT3A7CisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICBpbml0aWFsTGF5b3V0OworICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgZmluYWxMYXlvdXQ7Cit9IFZrQXR0YWNobWVudERlc2NyaXB0aW9uOworCit0eXBlZGVmIHN0cnVjdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgeworICAgIHVpbnQzMl90ICAgICAgICAgYXR0YWNobWVudDsKKyAgICBWa0ltYWdlTGF5b3V0ICAgIGxheW91dDsKK30gVmtBdHRhY2htZW50UmVmZXJlbmNlOworCit0eXBlZGVmIHN0cnVjdCBWa1N1YnBhc3NEZXNjcmlwdGlvbiB7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFncyAgICAgICBmbGFnczsKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRBdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlKiAgICBwSW5wdXRBdHRhY2htZW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQXR0YWNobWVudENvdW50OworICAgIGNvbnN0IFZrQXR0YWNobWVudFJlZmVyZW5jZSogICAgcENvbG9yQXR0YWNobWVudHM7CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlKiAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzOworICAgIGNvbnN0IFZrQXR0YWNobWVudFJlZmVyZW5jZSogICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzOworfSBWa1N1YnBhc3NEZXNjcmlwdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTdWJwYXNzRGVwZW5kZW5jeSB7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgc3JjU3VicGFzczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBkc3RTdWJwYXNzOworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgIHNyY1N0YWdlTWFzazsKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICBkc3RTdGFnZU1hc2s7CisgICAgVmtBY2Nlc3NGbGFncyAgICAgICAgICAgc3JjQWNjZXNzTWFzazsKKyAgICBWa0FjY2Vzc0ZsYWdzICAgICAgICAgICBkc3RBY2Nlc3NNYXNrOworICAgIFZrRGVwZW5kZW5jeUZsYWdzICAgICAgIGRlcGVuZGVuY3lGbGFnczsKK30gVmtTdWJwYXNzRGVwZW5kZW5jeTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVGbGFncyAgICAgICAgICAgZmxhZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiogICAgcEF0dGFjaG1lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXNzQ291bnQ7CisgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24qICAgICAgIHBTdWJwYXNzZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lDb3VudDsKKyAgICBjb25zdCBWa1N1YnBhc3NEZXBlbmRlbmN5KiAgICAgICAgcERlcGVuZGVuY2llczsKK30gVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4OworfSBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICBjb21tYW5kUG9vbDsKKyAgICBWa0NvbW1hbmRCdWZmZXJMZXZlbCAgICBsZXZlbDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQ7Cit9IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3M7CisgICAgVmtGcmFtZWJ1ZmZlciAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXI7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgb2NjbHVzaW9uUXVlcnlFbmFibGU7CisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgcXVlcnlGbGFnczsKKyAgICBWa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyAgICBwaXBlbGluZVN0YXRpc3RpY3M7Cit9IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFncyAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8qICAgIHBJbmhlcml0YW5jZUluZm87Cit9IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtCdWZmZXJDb3B5IHsKKyAgICBWa0RldmljZVNpemUgICAgc3JjT2Zmc2V0OworICAgIFZrRGV2aWNlU2l6ZSAgICBkc3RPZmZzZXQ7CisgICAgVmtEZXZpY2VTaXplICAgIHNpemU7Cit9IFZrQnVmZmVyQ29weTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzIHsKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgICAgYXNwZWN0TWFzazsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWlwTGV2ZWw7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIGJhc2VBcnJheUxheWVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBsYXllckNvdW50OworfSBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnM7CisKK3R5cGVkZWYgc3RydWN0IFZrSW1hZ2VDb3B5IHsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgICAgc3JjU3VicmVzb3VyY2U7CisgICAgVmtPZmZzZXQzRCAgICAgICAgICAgICAgICAgIHNyY09mZnNldDsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgICAgZHN0U3VicmVzb3VyY2U7CisgICAgVmtPZmZzZXQzRCAgICAgICAgICAgICAgICAgIGRzdE9mZnNldDsKKyAgICBWa0V4dGVudDNEICAgICAgICAgICAgICAgICAgZXh0ZW50OworfSBWa0ltYWdlQ29weTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbWFnZUJsaXQgeworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyAgICBzcmNTdWJyZXNvdXJjZTsKKyAgICBWa09mZnNldDNEICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0c1syXTsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgICAgZHN0U3VicmVzb3VyY2U7CisgICAgVmtPZmZzZXQzRCAgICAgICAgICAgICAgICAgIGRzdE9mZnNldHNbMl07Cit9IFZrSW1hZ2VCbGl0OworCit0eXBlZGVmIHN0cnVjdCBWa0J1ZmZlckltYWdlQ29weSB7CisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgIGJ1ZmZlck9mZnNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgYnVmZmVyUm93TGVuZ3RoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBidWZmZXJJbWFnZUhlaWdodDsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgICAgaW1hZ2VTdWJyZXNvdXJjZTsKKyAgICBWa09mZnNldDNEICAgICAgICAgICAgICAgICAgaW1hZ2VPZmZzZXQ7CisgICAgVmtFeHRlbnQzRCAgICAgICAgICAgICAgICAgIGltYWdlRXh0ZW50OworfSBWa0J1ZmZlckltYWdlQ29weTsKKwordHlwZWRlZiB1bmlvbiBWa0NsZWFyQ29sb3JWYWx1ZSB7CisgICAgZmxvYXQgICAgICAgZmxvYXQzMls0XTsKKyAgICBpbnQzMl90ICAgICBpbnQzMls0XTsKKyAgICB1aW50MzJfdCAgICB1aW50MzJbNF07Cit9IFZrQ2xlYXJDb2xvclZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUgeworICAgIGZsb2F0ICAgICAgIGRlcHRoOworICAgIHVpbnQzMl90ICAgIHN0ZW5jaWw7Cit9IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZTsKKwordHlwZWRlZiB1bmlvbiBWa0NsZWFyVmFsdWUgeworICAgIFZrQ2xlYXJDb2xvclZhbHVlICAgICAgICAgICBjb2xvcjsKKyAgICBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUgICAgZGVwdGhTdGVuY2lsOworfSBWa0NsZWFyVmFsdWU7CisKK3R5cGVkZWYgc3RydWN0IFZrQ2xlYXJBdHRhY2htZW50IHsKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgICAgYXNwZWN0TWFzazsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgY29sb3JBdHRhY2htZW50OworICAgIFZrQ2xlYXJWYWx1ZSAgICAgICAgICBjbGVhclZhbHVlOworfSBWa0NsZWFyQXR0YWNobWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtDbGVhclJlY3QgeworICAgIFZrUmVjdDJEICAgIHJlY3Q7CisgICAgdWludDMyX3QgICAgYmFzZUFycmF5TGF5ZXI7CisgICAgdWludDMyX3QgICAgbGF5ZXJDb3VudDsKK30gVmtDbGVhclJlY3Q7CisKK3R5cGVkZWYgc3RydWN0IFZrSW1hZ2VSZXNvbHZlIHsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgICAgc3JjU3VicmVzb3VyY2U7CisgICAgVmtPZmZzZXQzRCAgICAgICAgICAgICAgICAgIHNyY09mZnNldDsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgICAgZHN0U3VicmVzb3VyY2U7CisgICAgVmtPZmZzZXQzRCAgICAgICAgICAgICAgICAgIGRzdE9mZnNldDsKKyAgICBWa0V4dGVudDNEICAgICAgICAgICAgICAgICAgZXh0ZW50OworfSBWa0ltYWdlUmVzb2x2ZTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtNZW1vcnlCYXJyaWVyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrQWNjZXNzRmxhZ3MgICAgICBzcmNBY2Nlc3NNYXNrOworICAgIFZrQWNjZXNzRmxhZ3MgICAgICBkc3RBY2Nlc3NNYXNrOworfSBWa01lbW9yeUJhcnJpZXI7CisKK3R5cGVkZWYgc3RydWN0IFZrQnVmZmVyTWVtb3J5QmFycmllciB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa0FjY2Vzc0ZsYWdzICAgICAgc3JjQWNjZXNzTWFzazsKKyAgICBWa0FjY2Vzc0ZsYWdzICAgICAgZHN0QWNjZXNzTWFzazsKKyAgICB1aW50MzJfdCAgICAgICAgICAgc3JjUXVldWVGYW1pbHlJbmRleDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICBWa0J1ZmZlciAgICAgICAgICAgYnVmZmVyOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICBvZmZzZXQ7CisgICAgVmtEZXZpY2VTaXplICAgICAgIHNpemU7Cit9IFZrQnVmZmVyTWVtb3J5QmFycmllcjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQWNjZXNzRmxhZ3MgICAgICAgICAgICAgIHNyY0FjY2Vzc01hc2s7CisgICAgVmtBY2Nlc3NGbGFncyAgICAgICAgICAgICAgZHN0QWNjZXNzTWFzazsKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICBvbGRMYXlvdXQ7CisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgbmV3TGF5b3V0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIHNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICBpbWFnZTsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAgICBzdWJyZXNvdXJjZVJhbmdlOworfSBWa0ltYWdlTWVtb3J5QmFycmllcjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgcE5leHQ7CisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICByZW5kZXJQYXNzOworICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgZnJhbWVidWZmZXI7CisgICAgVmtSZWN0MkQgICAgICAgICAgICAgICByZW5kZXJBcmVhOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgY2xlYXJWYWx1ZUNvdW50OworICAgIGNvbnN0IFZrQ2xlYXJWYWx1ZSogICAgcENsZWFyVmFsdWVzOworfSBWa1JlbmRlclBhc3NCZWdpbkluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrRGlzcGF0Y2hJbmRpcmVjdENvbW1hbmQgeworICAgIHVpbnQzMl90ICAgIHg7CisgICAgdWludDMyX3QgICAgeTsKKyAgICB1aW50MzJfdCAgICB6OworfSBWa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kOworCit0eXBlZGVmIHN0cnVjdCBWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIHsKKyAgICB1aW50MzJfdCAgICBpbmRleENvdW50OworICAgIHVpbnQzMl90ICAgIGluc3RhbmNlQ291bnQ7CisgICAgdWludDMyX3QgICAgZmlyc3RJbmRleDsKKyAgICBpbnQzMl90ICAgICB2ZXJ0ZXhPZmZzZXQ7CisgICAgdWludDMyX3QgICAgZmlyc3RJbnN0YW5jZTsKK30gVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEcmF3SW5kaXJlY3RDb21tYW5kIHsKKyAgICB1aW50MzJfdCAgICB2ZXJ0ZXhDb3VudDsKKyAgICB1aW50MzJfdCAgICBpbnN0YW5jZUNvdW50OworICAgIHVpbnQzMl90ICAgIGZpcnN0VmVydGV4OworICAgIHVpbnQzMl90ICAgIGZpcnN0SW5zdGFuY2U7Cit9IFZrRHJhd0luZGlyZWN0Q29tbWFuZDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtCYXNlT3V0U3RydWN0dXJlIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBzdHJ1Y3QgVmtCYXNlT3V0U3RydWN0dXJlKiAgICBwTmV4dDsKK30gVmtCYXNlT3V0U3RydWN0dXJlOworCit0eXBlZGVmIHN0cnVjdCBWa0Jhc2VJblN0cnVjdHVyZSB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCBzdHJ1Y3QgVmtCYXNlSW5TdHJ1Y3R1cmUqICAgIHBOZXh0OworfSBWa0Jhc2VJblN0cnVjdHVyZTsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVJbnN0YW5jZSkoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrSW5zdGFuY2UqIHBJbnN0YW5jZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveUluc3RhbmNlKShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIHVpbnQzMl90KiBwUGh5c2ljYWxEZXZpY2VDb3VudCwgVmtQaHlzaWNhbERldmljZSogcFBoeXNpY2FsRGV2aWNlcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcykoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiBwRmVhdHVyZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcykoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0Zvcm1hdFByb3BlcnRpZXMqIHBGb3JtYXRQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVR5cGUgdHlwZSwgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyogcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogcE1lbW9yeVByb3BlcnRpZXMpOwordHlwZWRlZiBQRk5fdmtWb2lkRnVuY3Rpb24gKFZLQVBJX1BUUiAqUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkcikoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciogcE5hbWUpOwordHlwZWRlZiBQRk5fdmtWb2lkRnVuY3Rpb24gKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgY2hhciogcE5hbWUpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVEZXZpY2UpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXZpY2UqIHBEZXZpY2UpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lEZXZpY2UpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKShjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcykodWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0xheWVyUHJvcGVydGllcyogcFByb3BlcnRpZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtMYXllclByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXREZXZpY2VRdWV1ZSkoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCBxdWV1ZUluZGV4LCBWa1F1ZXVlKiBwUXVldWUpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtRdWV1ZVN1Ym1pdCkoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyogcFN1Ym1pdHMsIFZrRmVuY2UgZmVuY2UpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtRdWV1ZVdhaXRJZGxlKShWa1F1ZXVlIHF1ZXVlKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrRGV2aWNlV2FpdElkbGUpKFZrRGV2aWNlIGRldmljZSk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0FsbG9jYXRlTWVtb3J5KShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlTWVtb3J5KiBwTWVtb3J5KTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtGcmVlTWVtb3J5KShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrTWFwTWVtb3J5KShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsIFZrTWVtb3J5TWFwRmxhZ3MgZmxhZ3MsIHZvaWQqKiBwcERhdGEpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a1VubWFwTWVtb3J5KShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IG1lbW9yeVJhbmdlQ291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IG1lbW9yeVJhbmdlQ291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQpKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUqIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeSkoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0JpbmRJbWFnZU1lbW9yeSkoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cykoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cykoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa01lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcykoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1F1ZXVlQmluZFNwYXJzZSkoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyogcEJpbmRJbmZvLCBWa0ZlbmNlIGZlbmNlKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlRmVuY2UpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveUZlbmNlKShWa0RldmljZSBkZXZpY2UsIFZrRmVuY2UgZmVuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1Jlc2V0RmVuY2VzKShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGZlbmNlQ291bnQsIGNvbnN0IFZrRmVuY2UqIHBGZW5jZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRGZW5jZVN0YXR1cykoVmtEZXZpY2UgZGV2aWNlLCBWa0ZlbmNlIGZlbmNlKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrV2FpdEZvckZlbmNlcykoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlKiBwRmVuY2VzLCBWa0Jvb2wzMiB3YWl0QWxsLCB1aW50NjRfdCB0aW1lb3V0KTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlU2VtYXBob3JlKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTZW1hcGhvcmUqIHBTZW1hcGhvcmUpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lTZW1hcGhvcmUpKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVFdmVudCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtFdmVudCogcEV2ZW50KTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtEZXN0cm95RXZlbnQpKFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RXZlbnRTdGF0dXMpKFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1NldEV2ZW50KShWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtSZXNldEV2ZW50KShWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVRdWVyeVBvb2wpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1F1ZXJ5UG9vbCogcFF1ZXJ5UG9vbCk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveVF1ZXJ5UG9vbCkoVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFF1ZXJ5UG9vbFJlc3VsdHMpKFZrRGV2aWNlIGRldmljZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhLCBWa0RldmljZVNpemUgc3RyaWRlLCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVCdWZmZXIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0J1ZmZlciogcEJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveUJ1ZmZlcikoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZUJ1ZmZlclZpZXcpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtCdWZmZXJWaWV3KiBwVmlldyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveUJ1ZmZlclZpZXcpKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXJWaWV3IGJ1ZmZlclZpZXcsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZUltYWdlKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ltYWdlKiBwSW1hZ2UpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lJbWFnZSkoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQpKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiBwU3VicmVzb3VyY2UsIFZrU3VicmVzb3VyY2VMYXlvdXQqIHBMYXlvdXQpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVJbWFnZVZpZXcpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ltYWdlVmlldyogcFZpZXcpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lJbWFnZVZpZXcpKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVTaGFkZXJNb2R1bGUpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveVNoYWRlck1vZHVsZSkoVmtEZXZpY2UgZGV2aWNlLCBWa1NoYWRlck1vZHVsZSBzaGFkZXJNb2R1bGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZVBpcGVsaW5lQ2FjaGUpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZUNhY2hlKiBwUGlwZWxpbmVDYWNoZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveVBpcGVsaW5lQ2FjaGUpKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBpcGVsaW5lQ2FjaGVEYXRhKShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtNZXJnZVBpcGVsaW5lQ2FjaGVzKShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBkc3RDYWNoZSwgdWludDMyX3Qgc3JjQ2FjaGVDb3VudCwgY29uc3QgVmtQaXBlbGluZUNhY2hlKiBwU3JjQ2FjaGVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMpKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lQaXBlbGluZSkoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVQaXBlbGluZUxheW91dCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZUxheW91dCogcFBpcGVsaW5lTGF5b3V0KTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQpKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlU2FtcGxlcikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXIqIHBTYW1wbGVyKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtEZXN0cm95U2FtcGxlcikoVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXIgc2FtcGxlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqIHBTZXRMYXlvdXQpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldExheW91dCBkZXNjcmlwdG9yU2V0TGF5b3V0LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXNjcmlwdG9yUG9vbCogcERlc2NyaXB0b3JQb29sKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtEZXN0cm95RGVzY3JpcHRvclBvb2wpKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrUmVzZXREZXNjcmlwdG9yUG9vbCkoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCBWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncyBmbGFncyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0FsbG9jYXRlRGVzY3JpcHRvclNldHMpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cykoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsIGNvbnN0IFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0cykoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yV3JpdGVzLCB1aW50MzJfdCBkZXNjcmlwdG9yQ29weUNvdW50LCBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvckNvcGllcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZUZyYW1lYnVmZmVyKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ZyYW1lYnVmZmVyKiBwRnJhbWVidWZmZXIpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lGcmFtZWJ1ZmZlcikoVmtEZXZpY2UgZGV2aWNlLCBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVSZW5kZXJQYXNzKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyogcFJlbmRlclBhc3MpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lSZW5kZXJQYXNzKShWa0RldmljZSBkZXZpY2UsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSkoVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgVmtFeHRlbnQyRCogcEdyYW51bGFyaXR5KTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlQ29tbWFuZFBvb2wpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQ29tbWFuZFBvb2wqIHBDb21tYW5kUG9vbCk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveUNvbW1hbmRQb29sKShWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1Jlc2V0Q29tbWFuZFBvb2wpKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgZmxhZ3MpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0ZyZWVDb21tYW5kQnVmZmVycykoVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQmVnaW5Db21tYW5kQnVmZmVyKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiBwQmVnaW5JbmZvKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrRW5kQ29tbWFuZEJ1ZmZlcikoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtSZXNldENvbW1hbmRCdWZmZXIpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCaW5kUGlwZWxpbmUpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lIHBpcGVsaW5lKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRTZXRWaWV3cG9ydCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnQqIHBWaWV3cG9ydHMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFNldFNjaXNzb3IpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFNjaXNzb3IsIHVpbnQzMl90IHNjaXNzb3JDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBTY2lzc29ycyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kU2V0TGluZVdpZHRoKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbGluZVdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRTZXREZXB0aEJpYXMpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZmxvYXQgZGVwdGhCaWFzQ2xhbXAsIGZsb2F0IGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRTZXRCbGVuZENvbnN0YW50cykoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IGZsb2F0IGJsZW5kQ29uc3RhbnRzWzRdKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRTZXREZXB0aEJvdW5kcykoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IG1pbkRlcHRoQm91bmRzLCBmbG9hdCBtYXhEZXB0aEJvdW5kcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCBjb21wYXJlTWFzayk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzaykoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3Qgd3JpdGVNYXNrKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCByZWZlcmVuY2UpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZEJpbmREZXNjcmlwdG9yU2V0cykoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgdWludDMyX3QgZHluYW1pY09mZnNldENvdW50LCBjb25zdCB1aW50MzJfdCogcER5bmFtaWNPZmZzZXRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCaW5kSW5kZXhCdWZmZXIpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrSW5kZXhUeXBlIGluZGV4VHlwZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnMpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdEJpbmRpbmcsIHVpbnQzMl90IGJpbmRpbmdDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBPZmZzZXRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREcmF3KShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdmVydGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREcmF3SW5kZXhlZCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGluZGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0SW5kZXgsIGludDMyX3QgdmVydGV4T2Zmc2V0LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREcmF3SW5kaXJlY3QpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kRGlzcGF0Y2gpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREaXNwYXRjaEluZGlyZWN0KShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRDb3B5QnVmZmVyKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckNvcHkqIHBSZWdpb25zKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRDb3B5SW1hZ2UpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZUNvcHkqIHBSZWdpb25zKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCbGl0SW1hZ2UpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZUJsaXQqIHBSZWdpb25zLCBWa0ZpbHRlciBmaWx0ZXIpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZENvcHlCdWZmZXJUb0ltYWdlKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcikoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kVXBkYXRlQnVmZmVyKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgZGF0YVNpemUsIGNvbnN0IHZvaWQqIHBEYXRhKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRGaWxsQnVmZmVyKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgdWludDMyX3QgZGF0YSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kQ2xlYXJDb2xvckltYWdlKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUqIHBDb2xvciwgdWludDMyX3QgcmFuZ2VDb3VudCwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqIHBSYW5nZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRDbGVhckF0dGFjaG1lbnRzKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYXR0YWNobWVudENvdW50LCBjb25zdCBWa0NsZWFyQXR0YWNobWVudCogcEF0dGFjaG1lbnRzLCB1aW50MzJfdCByZWN0Q291bnQsIGNvbnN0IFZrQ2xlYXJSZWN0KiBwUmVjdHMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFJlc29sdmVJbWFnZSkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlUmVzb2x2ZSogcFJlZ2lvbnMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFNldEV2ZW50KShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRSZXNldEV2ZW50KShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRXYWl0RXZlbnRzKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZXZlbnRDb3VudCwgY29uc3QgVmtFdmVudCogcEV2ZW50cywgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFBpcGVsaW5lQmFycmllcikoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBWa0RlcGVuZGVuY3lGbGFncyBkZXBlbmRlbmN5RmxhZ3MsIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZEJlZ2luUXVlcnkpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRFbmRRdWVyeSkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFJlc2V0UXVlcnlQb29sKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50KTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRXcml0ZVRpbWVzdGFtcCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzdHJpZGUsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kUHVzaENvbnN0YW50cykoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCBWa1NoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFncywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLCBjb25zdCB2b2lkKiBwVmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIHBSZW5kZXJQYXNzQmVnaW4sIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWROZXh0U3VicGFzcykoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRFbmRSZW5kZXJQYXNzKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kRXhlY3V0ZUNvbW1hbmRzKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbnN0YW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lJbnN0YW5jZSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VDcmVhdGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKiAgICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHZrR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworCitWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlUHJvY0FkZHIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmFtZSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURldmljZSgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJOYW1lLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllck5hbWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VRdWV1ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUluZGV4LAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVTdWJtaXQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdENvdW50LAorICAgIGNvbnN0IFZrU3VibWl0SW5mbyogICAgICAgICAgICAgICAgICAgICAgICAgcFN1Ym1pdHMsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlV2FpdElkbGUoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0RldmljZVdhaXRJZGxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0ZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrTWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICBWa01lbW9yeU1hcEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBEYXRhKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtVbm1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0JpbmRCdWZmZXJNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCaW5kSW1hZ2VNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlQmluZFNwYXJzZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiAgICAgICAgICAgICAgICAgICAgIHBCaW5kSW5mbywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0RmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRGZW5jZVN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrV2FpdEZvckZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzLAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEFsbCwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTZW1hcGhvcmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyVmlldyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiAgICAgICAgICAgICAgICAgICBwU3VicmVzb3VyY2UsCisgICAgVmtTdWJyZXNvdXJjZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0KTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2VWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2hhZGVyTW9kdWxlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRlck1vZHVsZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lQ2FjaGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a01lcmdlUGlwZWxpbmVDYWNoZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUxheW91dCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVyKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgIHBTZXRMYXlvdXQpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yUG9vbCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUmVzZXREZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0ZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZyYW1lYnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95UmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtDb21tYW5kUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZFBvb2wpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWxsb2NhdGVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0ZyZWVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQmVnaW5Db21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qICAgICAgICAgICAgIHBCZWdpbkluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbmRDb21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0Q29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZFBpcGVsaW5lKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFZpZXdwb3J0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U2Npc3NvcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNjaXNzb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lzc29yQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Npc3NvcnMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldExpbmVXaWR0aCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldERlcHRoQmlhcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NsYW1wLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldEJsZW5kQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kQ29uc3RhbnRzWzRdKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFzayk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTWFzayk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljT2Zmc2V0Q291bnQsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHluYW1pY09mZnNldHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRJbmRleEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtJbmRleFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFR5cGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXcoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWZXJ0ZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kZXhlZCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXgsCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRGlzcGF0Y2goCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ29weUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckNvcHkqICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQmxpdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLAorICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ29weUltYWdlVG9CdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRGaWxsQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckNvbG9ySW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSogICAgICAgICAgICAgICAgICAgIHBDb2xvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENsZWFyQXR0YWNobWVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNvbHZlSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlUmVzb2x2ZSogICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUmVzZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kV2FpdEV2ZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50LAorICAgIGNvbnN0IFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50cywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCZWdpblF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZFF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmVnaW5SZW5kZXJQYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kTmV4dFN1YnBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRFeGVjdXRlQ29tbWFuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfVkVSU0lPTl8xXzEgMQorLy8gVnVsa2FuIDEuMSB2ZXJzaW9uIG51bWJlcgorI2RlZmluZSBWS19BUElfVkVSU0lPTl8xXzEgVktfTUFLRV9WRVJTSU9OKDEsIDEsIDApLy8gUGF0Y2ggdmVyc2lvbiBzaG91bGQgYWx3YXlzIGJlIHNldCB0byAwCisKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24pCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpCisjZGVmaW5lIFZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRSAgICAgICAgICAzMgorI2RlZmluZSBWS19MVUlEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBWS19RVUVVRV9GQU1JTFlfRVhURVJOQUwgICAgICAgICAgKH4wVS0xKQorCit0eXBlZGVmIGVudW0gVmtQb2ludENsaXBwaW5nQmVoYXZpb3IgeworICAgIFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX0FMTF9DTElQX1BMQU5FUyA9IDAsCisgICAgVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfVVNFUl9DTElQX1BMQU5FU19PTkxZID0gMSwKKyAgICBWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9BTExfQ0xJUF9QTEFORVNfS0hSID0gVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfQUxMX0NMSVBfUExBTkVTLAorICAgIFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX1VTRVJfQ0xJUF9QTEFORVNfT05MWV9LSFIgPSBWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9VU0VSX0NMSVBfUExBTkVTX09OTFksCisgICAgVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfQkVHSU5fUkFOR0UgPSBWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9BTExfQ0xJUF9QTEFORVMsCisgICAgVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfRU5EX1JBTkdFID0gVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfVVNFUl9DTElQX1BMQU5FU19PTkxZLAorICAgIFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX1JBTkdFX1NJWkUgPSAoVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfVVNFUl9DTElQX1BMQU5FU19PTkxZIC0gVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfQUxMX0NMSVBfUExBTkVTICsgMSksCisgICAgVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yOworCit0eXBlZGVmIGVudW0gVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4geworICAgIFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1VQUEVSX0xFRlQgPSAwLAorICAgIFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX0xPV0VSX0xFRlQgPSAxLAorICAgIFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1VQUEVSX0xFRlRfS0hSID0gVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fVVBQRVJfTEVGVCwKKyAgICBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9MT1dFUl9MRUZUX0tIUiA9IFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX0xPV0VSX0xFRlQsCisgICAgVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fQkVHSU5fUkFOR0UgPSBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZULAorICAgIFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX0VORF9SQU5HRSA9IFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX0xPV0VSX0xFRlQsCisgICAgVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fUkFOR0VfU0laRSA9IChWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9MT1dFUl9MRUZUIC0gVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fVVBQRVJfTEVGVCArIDEpLAorICAgIFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa1Rlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbjsKKwordHlwZWRlZiBlbnVtIFZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIHsKKyAgICBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZID0gMCwKKyAgICBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfSURFTlRJVFkgPSAxLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl83MDkgPSAyLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl82MDEgPSAzLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwID0gNCwKKyAgICBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZX0tIUiA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SR0JfSURFTlRJVFksCisgICAgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSX0lERU5USVRZX0tIUiA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl9JREVOVElUWSwKKyAgICBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfNzA5X0tIUiA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl83MDksCisgICAgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzYwMV9LSFIgPSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfNjAxLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwX0tIUiA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9CRUdJTl9SQU5HRSA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SR0JfSURFTlRJVFksCisgICAgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX0VORF9SQU5HRSA9IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SQU5HRV9TSVpFID0gKFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwIC0gVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1JHQl9JREVOVElUWSArIDEpLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb247CisKK3R5cGVkZWYgZW51bSBWa1NhbXBsZXJZY2JjclJhbmdlIHsKKyAgICBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMID0gMCwKKyAgICBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9OQVJST1cgPSAxLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX0ZVTExfS0hSID0gVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfRlVMTCwKKyAgICBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9OQVJST1dfS0hSID0gVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfQkVHSU5fUkFOR0UgPSBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfRU5EX1JBTkdFID0gVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XLAorICAgIFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfUkFOR0VfU0laRSA9IChWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9OQVJST1cgLSBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMICsgMSksCisgICAgVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTYW1wbGVyWWNiY3JSYW5nZTsKKwordHlwZWRlZiBlbnVtIFZrQ2hyb21hTG9jYXRpb24geworICAgIFZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU4gPSAwLAorICAgIFZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVCA9IDEsCisgICAgVktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTl9LSFIgPSBWS19DSFJPTUFfTE9DQVRJT05fQ09TSVRFRF9FVkVOLAorICAgIFZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVF9LSFIgPSBWS19DSFJPTUFfTE9DQVRJT05fTUlEUE9JTlQsCisgICAgVktfQ0hST01BX0xPQ0FUSU9OX0JFR0lOX1JBTkdFID0gVktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTiwKKyAgICBWS19DSFJPTUFfTE9DQVRJT05fRU5EX1JBTkdFID0gVktfQ0hST01BX0xPQ0FUSU9OX01JRFBPSU5ULAorICAgIFZLX0NIUk9NQV9MT0NBVElPTl9SQU5HRV9TSVpFID0gKFZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVCAtIFZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU4gKyAxKSwKKyAgICBWS19DSFJPTUFfTE9DQVRJT05fTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrQ2hyb21hTG9jYXRpb247CisKK3R5cGVkZWYgZW51bSBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGUgeworICAgIFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQgPSAwLAorICAgIFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfUFVTSF9ERVNDUklQVE9SU19LSFIgPSAxLAorICAgIFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVRfS0hSID0gVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9ERVNDUklQVE9SX1NFVCwKKyAgICBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0JFR0lOX1JBTkdFID0gVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9ERVNDUklQVE9SX1NFVCwKKyAgICBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0VORF9SQU5HRSA9IFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQsCisgICAgVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9SQU5HRV9TSVpFID0gKFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQgLSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUICsgMSksCisgICAgVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlOworCit0eXBlZGVmIGVudW0gVmtTdWJncm91cEZlYXR1cmVGbGFnQml0cyB7CisgICAgVktfU1VCR1JPVVBfRkVBVFVSRV9CQVNJQ19CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX1NVQkdST1VQX0ZFQVRVUkVfVk9URV9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX1NVQkdST1VQX0ZFQVRVUkVfQVJJVEhNRVRJQ19CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX1NVQkdST1VQX0ZFQVRVUkVfQkFMTE9UX0JJVCA9IDB4MDAwMDAwMDgsCisgICAgVktfU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX0JJVCA9IDB4MDAwMDAwMTAsCisgICAgVktfU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX1JFTEFUSVZFX0JJVCA9IDB4MDAwMDAwMjAsCisgICAgVktfU1VCR1JPVVBfRkVBVFVSRV9DTFVTVEVSRURfQklUID0gMHgwMDAwMDA0MCwKKyAgICBWS19TVUJHUk9VUF9GRUFUVVJFX1FVQURfQklUID0gMHgwMDAwMDA4MCwKKyAgICBWS19TVUJHUk9VUF9GRUFUVVJFX1BBUlRJVElPTkVEX0JJVF9OViA9IDB4MDAwMDAxMDAsCisgICAgVktfU1VCR1JPVVBfRkVBVFVSRV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtTdWJncm91cEZlYXR1cmVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyB7CisgICAgVktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX1NSQ19CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9EU1RfQklUID0gMHgwMDAwMDAwMiwKKyAgICBWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfU1JDX0JJVCA9IDB4MDAwMDAwMDQsCisgICAgVktfUEVFUl9NRU1PUllfRkVBVFVSRV9HRU5FUklDX0RTVF9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9TUkNfQklUX0tIUiA9IFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9TUkNfQklULAorICAgIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9EU1RfQklUX0tIUiA9IFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9EU1RfQklULAorICAgIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklUX0tIUiA9IFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklULAorICAgIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19EU1RfQklUX0tIUiA9IFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19EU1RfQklULAorICAgIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIHsKKyAgICBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUiA9IDB4MDAwMDAwMDIsCisgICAgVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIgPSAweDAwMDAwMDA0LAorICAgIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfTUFTS19CSVRfS0hSID0gVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9NQVNLX0JJVCwKKyAgICBWS19NRU1PUllfQUxMT0NBVEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzOwordHlwZWRlZiBWa0ZsYWdzIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3M7Cit0eXBlZGVmIFZrRmxhZ3MgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgeworICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVQgPSAweDAwMDAwMDEwLAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVCA9IDB4MDAwMDAwMjAsCisgICAgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVCA9IDB4MDAwMDAwNDAsCisgICAgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0RNQV9CVUZfQklUX0VYVCA9IDB4MDAwMDAyMDAsCisgICAgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEID0gMHgwMDAwMDQwMCwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQgPSAweDAwMDAwMDgwLAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX01BUFBFRF9GT1JFSUdOX01FTU9SWV9CSVRfRVhUID0gMHgwMDAwMDEwMCwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVF9LSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfS0hSID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklULAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0JJVF9LSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQsCisgICAgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfS01UX0JJVF9LSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9LTVRfQklULAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVF9LSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfSEVBUF9CSVQsCisgICAgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVF9LSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfUkVTT1VSQ0VfQklULAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHMgeworICAgIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0RFRElDQVRFRF9PTkxZX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUID0gMHgwMDAwMDAwNCwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVRfS0hSID0gVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfREVESUNBVEVEX09OTFlfQklULAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX0tIUiA9IFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0VYUE9SVEFCTEVfQklULAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX0tIUiA9IFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklULAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIHsKKyAgICBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUID0gMHgwMDAwMDAwMiwKKyAgICBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCA9IDB4MDAwMDAwMDQsCisgICAgVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVRfS0hSID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCwKKyAgICBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUX0tIUiA9IFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQsCisgICAgVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfS0hSID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQsCisgICAgVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfU1lOQ19GRF9CSVRfS0hSID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQsCisgICAgVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIHsKKyAgICBWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUID0gMHgwMDAwMDAwMSwKKyAgICBWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUID0gMHgwMDAwMDAwMiwKKyAgICBWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX0tIUiA9IFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVQsCisgICAgVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVF9LSFIgPSBWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklULAorICAgIFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzOworCit0eXBlZGVmIGVudW0gVmtGZW5jZUltcG9ydEZsYWdCaXRzIHsKKyAgICBWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfRkVOQ0VfSU1QT1JUX1RFTVBPUkFSWV9CSVRfS0hSID0gVktfRkVOQ0VfSU1QT1JUX1RFTVBPUkFSWV9CSVQsCisgICAgVktfRkVOQ0VfSU1QT1JUX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtGZW5jZUltcG9ydEZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrRmVuY2VJbXBvcnRGbGFnczsKKwordHlwZWRlZiBlbnVtIFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMgeworICAgIFZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfU0VNQVBIT1JFX0lNUE9SVF9URU1QT1JBUllfQklUX0tIUiA9IFZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVCwKKyAgICBWS19TRU1BUEhPUkVfSU1QT1JUX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa1NlbWFwaG9yZUltcG9ydEZsYWdzOworCit0eXBlZGVmIGVudW0gVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyB7CisgICAgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQgPSAweDAwMDAwMDAxLAorICAgIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUID0gMHgwMDAwMDAwMiwKKyAgICBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQgPSAweDAwMDAwMDA0LAorICAgIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVQgPSAweDAwMDAwMDA4LAorICAgIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVCA9IDB4MDAwMDAwMTAsCisgICAgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVRfS0hSID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQsCisgICAgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfS0hSID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQsCisgICAgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUiA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCwKKyAgICBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfRDNEMTJfRkVOQ0VfQklUX0tIUiA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVQsCisgICAgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUX0tIUiA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVCwKKyAgICBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3M7CisKK3R5cGVkZWYgZW51bSBWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIHsKKyAgICBWS19FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQgPSAweDAwMDAwMDAyLAorICAgIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX0tIUiA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklULAorICAgIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX0tIUiA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklULAorICAgIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzOwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgc3ViZ3JvdXBTaXplOworICAgIFZrU2hhZGVyU3RhZ2VGbGFncyAgICAgICAgc3VwcG9ydGVkU3RhZ2VzOworICAgIFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ3MgICAgc3VwcG9ydGVkT3BlcmF0aW9uczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgIHF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXM7Cit9IFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtCdWZmZXIgICAgICAgICAgIGJ1ZmZlcjsKKyAgICBWa0RldmljZU1lbW9yeSAgICAgbWVtb3J5OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICBtZW1vcnlPZmZzZXQ7Cit9IFZrQmluZEJ1ZmZlck1lbW9yeUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa0ltYWdlICAgICAgICAgICAgaW1hZ2U7CisgICAgVmtEZXZpY2VNZW1vcnkgICAgIG1lbW9yeTsKKyAgICBWa0RldmljZVNpemUgICAgICAgbWVtb3J5T2Zmc2V0OworfSBWa0JpbmRJbWFnZU1lbW9yeUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzOworICAgIFZrQm9vbDMyICAgICAgICAgICB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzOworICAgIFZrQm9vbDMyICAgICAgICAgICBzdG9yYWdlUHVzaENvbnN0YW50MTY7CisgICAgVmtCb29sMzIgICAgICAgICAgIHN0b3JhZ2VJbnB1dE91dHB1dDE2OworfSBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbjsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uOworfSBWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50czsKKwordHlwZWRlZiBzdHJ1Y3QgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtJbWFnZSAgICAgICAgICAgIGltYWdlOworICAgIFZrQnVmZmVyICAgICAgICAgICBidWZmZXI7Cit9IFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrTWVtb3J5QWxsb2NhdGVGbGFncyAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgZGV2aWNlTWFzazsKK30gVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIGRldmljZU1hc2s7CisgICAgdWludDMyX3QgICAgICAgICAgIGRldmljZVJlbmRlckFyZWFDb3VudDsKKyAgICBjb25zdCBWa1JlY3QyRCogICAgcERldmljZVJlbmRlckFyZWFzOworfSBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIGRldmljZU1hc2s7Cit9IFZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0RldmljZUdyb3VwU3VibWl0SW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgd2FpdFNlbWFwaG9yZUNvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiAgICBwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXM7CisgICAgdWludDMyX3QgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogICAgcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgc2lnbmFsU2VtYXBob3JlQ291bnQ7CisgICAgY29uc3QgdWludDMyX3QqICAgIHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzOworfSBWa0RldmljZUdyb3VwU3VibWl0SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICByZXNvdXJjZURldmljZUluZGV4OworICAgIHVpbnQzMl90ICAgICAgICAgICBtZW1vcnlEZXZpY2VJbmRleDsKK30gVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIGRldmljZUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqICAgIHBEZXZpY2VJbmRpY2VzOworfSBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBkZXZpY2VJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiAgICBwRGV2aWNlSW5kaWNlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudDsKKyAgICBjb25zdCBWa1JlY3QyRCogICAgcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uczsKK30gVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlQ291bnQ7CisgICAgVmtQaHlzaWNhbERldmljZSAgICBwaHlzaWNhbERldmljZXNbVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFXTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgIHN1YnNldEFsbG9jYXRpb247Cit9IFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZUNvdW50OworICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2UqICAgIHBQaHlzaWNhbERldmljZXM7Cit9IFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrQnVmZmVyICAgICAgICAgICBidWZmZXI7Cit9IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI7CisKK3R5cGVkZWYgc3RydWN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa0ltYWdlICAgICAgICAgICAgaW1hZ2U7Cit9IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrSW1hZ2UgICAgICAgICAgICBpbWFnZTsKK30gVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yOworCit0eXBlZGVmIHN0cnVjdCBWa01lbW9yeVJlcXVpcmVtZW50czIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzICAgIG1lbW9yeVJlcXVpcmVtZW50czsKK30gVmtNZW1vcnlSZXF1aXJlbWVudHMyOworCit0eXBlZGVmIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiBWa01lbW9yeVJlcXVpcmVtZW50czJLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyAgICBtZW1vcnlSZXF1aXJlbWVudHM7Cit9IFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAgICBmZWF0dXJlczsKK30gVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyAgICBwcm9wZXJ0aWVzOworfSBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CisKK3R5cGVkZWYgc3RydWN0IFZrRm9ybWF0UHJvcGVydGllczIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzICAgIGZvcm1hdFByb3BlcnRpZXM7Cit9IFZrRm9ybWF0UHJvcGVydGllczI7CisKK3R5cGVkZWYgc3RydWN0IFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgICAgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworfSBWa0ltYWdlRm9ybWF0UHJvcGVydGllczI7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgIHBOZXh0OworICAgIFZrRm9ybWF0ICAgICAgICAgICAgICBmb3JtYXQ7CisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgIHR5cGU7CisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgIHRpbGluZzsKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgdXNhZ2U7CisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgIGZsYWdzOworfSBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAgICBxdWV1ZUZhbWlseVByb3BlcnRpZXM7Cit9IFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyAgICBtZW1vcnlQcm9wZXJ0aWVzOworfSBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI7CisKK3R5cGVkZWYgc3RydWN0IFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgICAgcHJvcGVydGllczsKK30gVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgZm9ybWF0OworICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICB0eXBlOworICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICBzYW1wbGVzOworICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICB1c2FnZTsKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgdGlsaW5nOworfSBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BvaW50Q2xpcHBpbmdCZWhhdmlvciAgICBwb2ludENsaXBwaW5nQmVoYXZpb3I7Cit9IFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllczsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UgeworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBzdWJwYXNzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBpbnB1dEF0dGFjaG1lbnRJbmRleDsKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgICAgYXNwZWN0TWFzazsKK30gVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2U7CisKK3R5cGVkZWYgc3RydWN0IFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdFJlZmVyZW5jZUNvdW50OworICAgIGNvbnN0IFZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlKiAgICBwQXNwZWN0UmVmZXJlbmNlczsKK30gVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgIHBOZXh0OworICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgIHVzYWdlOworfSBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4gICAgZG9tYWluT3JpZ2luOworfSBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBzdWJwYXNzQ291bnQ7CisgICAgY29uc3QgdWludDMyX3QqICAgIHBWaWV3TWFza3M7CisgICAgdWludDMyX3QgICAgICAgICAgIGRlcGVuZGVuY3lDb3VudDsKKyAgICBjb25zdCBpbnQzMl90KiAgICAgcFZpZXdPZmZzZXRzOworICAgIHVpbnQzMl90ICAgICAgICAgICBjb3JyZWxhdGlvbk1hc2tDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogICAgcENvcnJlbGF0aW9uTWFza3M7Cit9IFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgbXVsdGl2aWV3OworICAgIFZrQm9vbDMyICAgICAgICAgICBtdWx0aXZpZXdHZW9tZXRyeVNoYWRlcjsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgbXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyOworfSBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhNdWx0aXZpZXdWaWV3Q291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heE11bHRpdmlld0luc3RhbmNlSW5kZXg7Cit9IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICB2YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlcjsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgdmFyaWFibGVQb2ludGVyczsKK30gVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlczsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJGZWF0dXJlczsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBwcm90ZWN0ZWRNZW1vcnk7Cit9IFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlczsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHByb3RlY3RlZE5vRmF1bHQ7Cit9IFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa0RldmljZVF1ZXVlSW5mbzIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBxdWV1ZUluZGV4OworfSBWa0RldmljZVF1ZXVlSW5mbzI7CisKK3R5cGVkZWYgc3RydWN0IFZrUHJvdGVjdGVkU3VibWl0SW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgcHJvdGVjdGVkU3VibWl0OworfSBWa1Byb3RlY3RlZFN1Ym1pdEluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDsKKyAgICBWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbiAgICB5Y2Jjck1vZGVsOworICAgIFZrU2FtcGxlclljYmNyUmFuZ2UgICAgICAgICAgICAgIHljYmNyUmFuZ2U7CisgICAgVmtDb21wb25lbnRNYXBwaW5nICAgICAgICAgICAgICAgY29tcG9uZW50czsKKyAgICBWa0Nocm9tYUxvY2F0aW9uICAgICAgICAgICAgICAgICB4Q2hyb21hT2Zmc2V0OworICAgIFZrQ2hyb21hTG9jYXRpb24gICAgICAgICAgICAgICAgIHlDaHJvbWFPZmZzZXQ7CisgICAgVmtGaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21hRmlsdGVyOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlRXhwbGljaXRSZWNvbnN0cnVjdGlvbjsKK30gVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgY29udmVyc2lvbjsKK30gVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtJbWFnZUFzcGVjdEZsYWdCaXRzICAgIHBsYW5lQXNwZWN0OworfSBWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgICAgcGxhbmVBc3BlY3Q7Cit9IFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNhbXBsZXJZY2JjckNvbnZlcnNpb247Cit9IFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgY29tYmluZWRJbWFnZVNhbXBsZXJEZXNjcmlwdG9yQ291bnQ7Cit9IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllczsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSB7CisgICAgdWludDMyX3QgICAgICAgICAgICBkc3RCaW5kaW5nOworICAgIHVpbnQzMl90ICAgICAgICAgICAgZHN0QXJyYXlFbGVtZW50OworICAgIHVpbnQzMl90ICAgICAgICAgICAgZGVzY3JpcHRvckNvdW50OworICAgIFZrRGVzY3JpcHRvclR5cGUgICAgZGVzY3JpcHRvclR5cGU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBvZmZzZXQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBzdHJpZGU7Cit9IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFncyAgICAgZmxhZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQ7CisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSogICAgcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzOworICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVHlwZSAgICAgICAgICAgIHRlbXBsYXRlVHlwZTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0OworICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50OworICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lTGF5b3V0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDsKK30gVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0V4dGVybmFsTWVtb3J5UHJvcGVydGllcyB7CisgICAgVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFncyAgICAgICBleHRlcm5hbE1lbW9yeUZlYXR1cmVzOworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgICAgZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXM7CisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyAgICBjb21wYXRpYmxlSGFuZGxlVHlwZXM7Cit9IFZrRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgIGhhbmRsZVR5cGU7Cit9IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgICAgZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzOworfSBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCdWZmZXJDcmVhdGVGbGFncyAgICAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBWa0J1ZmZlclVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgIHVzYWdlOworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgaGFuZGxlVHlwZTsKK30gVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzICAgIGV4dGVybmFsTWVtb3J5UHJvcGVydGllczsKK30gVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDhfdCAgICAgICAgICAgIGRldmljZVVVSURbVktfVVVJRF9TSVpFXTsKKyAgICB1aW50OF90ICAgICAgICAgICAgZHJpdmVyVVVJRFtWS19VVUlEX1NJWkVdOworICAgIHVpbnQ4X3QgICAgICAgICAgICBkZXZpY2VMVUlEW1ZLX0xVSURfU0laRV07CisgICAgdWludDMyX3QgICAgICAgICAgIGRldmljZU5vZGVNYXNrOworICAgIFZrQm9vbDMyICAgICAgICAgICBkZXZpY2VMVUlEVmFsaWQ7Cit9IFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM7CisKK3R5cGVkZWYgc3RydWN0IFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzICAgIGhhbmRsZVR5cGVzOworfSBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgICAgaGFuZGxlVHlwZXM7Cit9IFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgICAgaGFuZGxlVHlwZXM7Cit9IFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzICAgIGhhbmRsZVR5cGU7Cit9IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgICAgZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXM7CisgICAgVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzICAgIGNvbXBhdGlibGVIYW5kbGVUeXBlczsKKyAgICBWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ3MgICAgICAgZXh0ZXJuYWxGZW5jZUZlYXR1cmVzOworfSBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgICAgaGFuZGxlVHlwZXM7Cit9IFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzICAgIGhhbmRsZVR5cGVzOworfSBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzICAgIGhhbmRsZVR5cGU7Cit9IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFncyAgICBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlczsKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzICAgIGNvbXBhdGlibGVIYW5kbGVUeXBlczsKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzICAgICAgIGV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXM7Cit9IFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4UGVyU2V0RGVzY3JpcHRvcnM7CisgICAgVmtEZXZpY2VTaXplICAgICAgIG1heE1lbW9yeUFsbG9jYXRpb25TaXplOworfSBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllczsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc3VwcG9ydGVkOworfSBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0OworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2hhZGVyRHJhd1BhcmFtZXRlcnM7Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzOworCit0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyRmVhdHVyZXM7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uKSh1aW50MzJfdCogcEFwaVZlcnNpb24pOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MikoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBwQmluZEluZm9zKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQmluZEltYWdlTWVtb3J5MikoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGhlYXBJbmRleCwgdWludDMyX3QgbG9jYWxEZXZpY2VJbmRleCwgdWludDMyX3QgcmVtb3RlRGV2aWNlSW5kZXgsIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogcFBlZXJNZW1vcnlGZWF0dXJlcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kU2V0RGV2aWNlTWFzaykoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGRldmljZU1hc2spOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZERpc3BhdGNoQmFzZSkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcykoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqIHBGZWF0dXJlcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0Zvcm1hdFByb3BlcnRpZXMyKiBwRm9ybWF0UHJvcGVydGllcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqIHBJbWFnZUZvcm1hdEluZm8sIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIHBNZW1vcnlQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqIHBQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtUcmltQ29tbWFuZFBvb2wpKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVmtDb21tYW5kUG9vbFRyaW1GbGFncyBmbGFncyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGV2aWNlUXVldWUyKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogcFF1ZXVlSW5mbywgVmtRdWV1ZSogcFF1ZXVlKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qIHBZY2JjckNvbnZlcnNpb24pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKShWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IHZvaWQqIHBEYXRhKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcykoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogcEV4dGVybmFsQnVmZmVySW5mbywgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogcEV4dGVybmFsRmVuY2VJbmZvLCBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHBTdXBwb3J0KTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24oCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXBpVmVyc2lvbik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0JpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0RGV2aWNlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREaXNwYXRjaEJhc2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqICAgICAgICAgIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtUcmltQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VRdWV1ZTIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VRdWV1ZUluZm8yKiAgICAgICAgICAgICAgICAgICBwUXVldWVJbmZvLAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldCwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qICAgcEV4dGVybmFsQnVmZmVySW5mbywKKyAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfS0hSX3N1cmZhY2UgMQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrU3VyZmFjZUtIUikKKyNkZWZpbmUgVktfS0hSX1NVUkZBQ0VfU1BFQ19WRVJTSU9OICAgICAgIDI1CisjZGVmaW5lIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FICAgICAiVktfS0hSX3N1cmZhY2UiCisKK3R5cGVkZWYgZW51bSBWa0NvbG9yU3BhY2VLSFIgeworICAgIFZLX0NPTE9SX1NQQUNFX1NSR0JfTk9OTElORUFSX0tIUiA9IDAsCisgICAgVktfQ09MT1JfU1BBQ0VfRElTUExBWV9QM19OT05MSU5FQVJfRVhUID0gMTAwMDEwNDAwMSwKKyAgICBWS19DT0xPUl9TUEFDRV9FWFRFTkRFRF9TUkdCX0xJTkVBUl9FWFQgPSAxMDAwMTA0MDAyLAorICAgIFZLX0NPTE9SX1NQQUNFX0RJU1BMQVlfUDNfTElORUFSX0VYVCA9IDEwMDAxMDQwMDMsCisgICAgVktfQ09MT1JfU1BBQ0VfRENJX1AzX05PTkxJTkVBUl9FWFQgPSAxMDAwMTA0MDA0LAorICAgIFZLX0NPTE9SX1NQQUNFX0JUNzA5X0xJTkVBUl9FWFQgPSAxMDAwMTA0MDA1LAorICAgIFZLX0NPTE9SX1NQQUNFX0JUNzA5X05PTkxJTkVBUl9FWFQgPSAxMDAwMTA0MDA2LAorICAgIFZLX0NPTE9SX1NQQUNFX0JUMjAyMF9MSU5FQVJfRVhUID0gMTAwMDEwNDAwNywKKyAgICBWS19DT0xPUl9TUEFDRV9IRFIxMF9TVDIwODRfRVhUID0gMTAwMDEwNDAwOCwKKyAgICBWS19DT0xPUl9TUEFDRV9ET0xCWVZJU0lPTl9FWFQgPSAxMDAwMTA0MDA5LAorICAgIFZLX0NPTE9SX1NQQUNFX0hEUjEwX0hMR19FWFQgPSAxMDAwMTA0MDEwLAorICAgIFZLX0NPTE9SX1NQQUNFX0FET0JFUkdCX0xJTkVBUl9FWFQgPSAxMDAwMTA0MDExLAorICAgIFZLX0NPTE9SX1NQQUNFX0FET0JFUkdCX05PTkxJTkVBUl9FWFQgPSAxMDAwMTA0MDEyLAorICAgIFZLX0NPTE9SX1NQQUNFX1BBU1NfVEhST1VHSF9FWFQgPSAxMDAwMTA0MDEzLAorICAgIFZLX0NPTE9SX1NQQUNFX0VYVEVOREVEX1NSR0JfTk9OTElORUFSX0VYVCA9IDEwMDAxMDQwMTQsCisgICAgVktfQ09MT1JfU1BBQ0VfRElTUExBWV9OQVRJVkVfQU1EID0gMTAwMDIxMzAwMCwKKyAgICBWS19DT0xPUlNQQUNFX1NSR0JfTk9OTElORUFSX0tIUiA9IFZLX0NPTE9SX1NQQUNFX1NSR0JfTk9OTElORUFSX0tIUiwKKyAgICBWS19DT0xPUl9TUEFDRV9EQ0lfUDNfTElORUFSX0VYVCA9IFZLX0NPTE9SX1NQQUNFX0RJU1BMQVlfUDNfTElORUFSX0VYVCwKKyAgICBWS19DT0xPUl9TUEFDRV9CRUdJTl9SQU5HRV9LSFIgPSBWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFIsCisgICAgVktfQ09MT1JfU1BBQ0VfRU5EX1JBTkdFX0tIUiA9IFZLX0NPTE9SX1NQQUNFX1NSR0JfTk9OTElORUFSX0tIUiwKKyAgICBWS19DT0xPUl9TUEFDRV9SQU5HRV9TSVpFX0tIUiA9IChWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFIgLSBWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFIgKyAxKSwKKyAgICBWS19DT0xPUl9TUEFDRV9NQVhfRU5VTV9LSFIgPSAweDdGRkZGRkZGCit9IFZrQ29sb3JTcGFjZUtIUjsKKwordHlwZWRlZiBlbnVtIFZrUHJlc2VudE1vZGVLSFIgeworICAgIFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSID0gMCwKKyAgICBWS19QUkVTRU5UX01PREVfTUFJTEJPWF9LSFIgPSAxLAorICAgIFZLX1BSRVNFTlRfTU9ERV9GSUZPX0tIUiA9IDIsCisgICAgVktfUFJFU0VOVF9NT0RFX0ZJRk9fUkVMQVhFRF9LSFIgPSAzLAorICAgIFZLX1BSRVNFTlRfTU9ERV9TSEFSRURfREVNQU5EX1JFRlJFU0hfS0hSID0gMTAwMDExMTAwMCwKKyAgICBWS19QUkVTRU5UX01PREVfU0hBUkVEX0NPTlRJTlVPVVNfUkVGUkVTSF9LSFIgPSAxMDAwMTExMDAxLAorICAgIFZLX1BSRVNFTlRfTU9ERV9CRUdJTl9SQU5HRV9LSFIgPSBWS19QUkVTRU5UX01PREVfSU1NRURJQVRFX0tIUiwKKyAgICBWS19QUkVTRU5UX01PREVfRU5EX1JBTkdFX0tIUiA9IFZLX1BSRVNFTlRfTU9ERV9GSUZPX1JFTEFYRURfS0hSLAorICAgIFZLX1BSRVNFTlRfTU9ERV9SQU5HRV9TSVpFX0tIUiA9IChWS19QUkVTRU5UX01PREVfRklGT19SRUxBWEVEX0tIUiAtIFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSICsgMSksCisgICAgVktfUFJFU0VOVF9NT0RFX01BWF9FTlVNX0tIUiA9IDB4N0ZGRkZGRkYKK30gVmtQcmVzZW50TW9kZUtIUjsKKwordHlwZWRlZiBlbnVtIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHsKKyAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSID0gMHgwMDAwMDAwMSwKKyAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfOTBfQklUX0tIUiA9IDB4MDAwMDAwMDIsCisgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fUk9UQVRFXzE4MF9CSVRfS0hSID0gMHgwMDAwMDAwNCwKKyAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfMjcwX0JJVF9LSFIgPSAweDAwMDAwMDA4LAorICAgIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX0JJVF9LSFIgPSAweDAwMDAwMDEwLAorICAgIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV85MF9CSVRfS0hSID0gMHgwMDAwMDAyMCwKKyAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9IT1JJWk9OVEFMX01JUlJPUl9ST1RBVEVfMTgwX0JJVF9LSFIgPSAweDAwMDAwMDQwLAorICAgIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8yNzBfQklUX0tIUiA9IDB4MDAwMDAwODAsCisgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSU5IRVJJVF9CSVRfS0hSID0gMHgwMDAwMDEwMCwKKyAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9GTEFHX0JJVFNfTUFYX0VOVU1fS0hSID0gMHg3RkZGRkZGRgorfSBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjsKK3R5cGVkZWYgVmtGbGFncyBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUjsKKwordHlwZWRlZiBlbnVtIFZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiB7CisgICAgVktfQ09NUE9TSVRFX0FMUEhBX09QQVFVRV9CSVRfS0hSID0gMHgwMDAwMDAwMSwKKyAgICBWS19DT01QT1NJVEVfQUxQSEFfUFJFX01VTFRJUExJRURfQklUX0tIUiA9IDB4MDAwMDAwMDIsCisgICAgVktfQ09NUE9TSVRFX0FMUEhBX1BPU1RfTVVMVElQTElFRF9CSVRfS0hSID0gMHgwMDAwMDAwNCwKKyAgICBWS19DT01QT1NJVEVfQUxQSEFfSU5IRVJJVF9CSVRfS0hSID0gMHgwMDAwMDAwOCwKKyAgICBWS19DT01QT1NJVEVfQUxQSEFfRkxBR19CSVRTX01BWF9FTlVNX0tIUiA9IDB4N0ZGRkZGRkYKK30gVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSOwordHlwZWRlZiBWa0ZsYWdzIFZrQ29tcG9zaXRlQWxwaGFGbGFnc0tIUjsKK3R5cGVkZWYgc3RydWN0IFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiB7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbWluSW1hZ2VDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtYXhJbWFnZUNvdW50OworICAgIFZrRXh0ZW50MkQgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFeHRlbnQ7CisgICAgVmtFeHRlbnQyRCAgICAgICAgICAgICAgICAgICAgICAgbWluSW1hZ2VFeHRlbnQ7CisgICAgVmtFeHRlbnQyRCAgICAgICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VFeHRlbnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VBcnJheUxheWVyczsKKyAgICBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUiAgICAgICBzdXBwb3J0ZWRUcmFuc2Zvcm1zOworICAgIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSICAgIGN1cnJlbnRUcmFuc2Zvcm07CisgICAgVmtDb21wb3NpdGVBbHBoYUZsYWdzS0hSICAgICAgICAgc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGE7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgc3VwcG9ydGVkVXNhZ2VGbGFnczsKK30gVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1N1cmZhY2VGb3JtYXRLSFIgeworICAgIFZrRm9ybWF0ICAgICAgICAgICBmb3JtYXQ7CisgICAgVmtDb2xvclNwYWNlS0hSICAgIGNvbG9yU3BhY2U7Cit9IFZrU3VyZmFjZUZvcm1hdEtIUjsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSKShWa0luc3RhbmNlIGluc3RhbmNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIFZrQm9vbDMyKiBwU3VwcG9ydGVkKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVmtTdXJmYWNlRm9ybWF0S0hSKiBwU3VyZmFjZUZvcm1hdHMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFByZXNlbnRNb2RlQ291bnQsIFZrUHJlc2VudE1vZGVLSFIqIHBQcmVzZW50TW9kZXMpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2Rlcyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9zd2FwY2hhaW4gMQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrU3dhcGNoYWluS0hSKQorI2RlZmluZSBWS19LSFJfU1dBUENIQUlOX1NQRUNfVkVSU0lPTiAgICAgNzAKKyNkZWZpbmUgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSAgICJWS19LSFJfc3dhcGNoYWluIgorCit0eXBlZGVmIGVudW0gVmtTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUiB7CisgICAgVktfU1dBUENIQUlOX0NSRUFURV9TUExJVF9JTlNUQU5DRV9CSU5EX1JFR0lPTlNfQklUX0tIUiA9IDB4MDAwMDAwMDEsCisgICAgVktfU1dBUENIQUlOX0NSRUFURV9QUk9URUNURURfQklUX0tIUiA9IDB4MDAwMDAwMDIsCisgICAgVktfU1dBUENIQUlOX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVRfS0hSID0gMHgwMDAwMDAwNCwKKyAgICBWS19TV0FQQ0hBSU5fQ1JFQVRFX0ZMQUdfQklUU19NQVhfRU5VTV9LSFIgPSAweDdGRkZGRkZGCit9IFZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFI7Cit0eXBlZGVmIFZrRmxhZ3MgVmtTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUjsKKwordHlwZWRlZiBlbnVtIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIHsKKyAgICBWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX0xPQ0FMX0JJVF9LSFIgPSAweDAwMDAwMDAxLAorICAgIFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfUkVNT1RFX0JJVF9LSFIgPSAweDAwMDAwMDAyLAorICAgIFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfU1VNX0JJVF9LSFIgPSAweDAwMDAwMDA0LAorICAgIFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfTE9DQUxfTVVMVElfREVWSUNFX0JJVF9LSFIgPSAweDAwMDAwMDA4LAorICAgIFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfRkxBR19CSVRTX01BWF9FTlVNX0tIUiA9IDB4N0ZGRkZGRkYKK30gVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI7Cit0eXBlZGVmIFZrRmxhZ3MgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFI7Cit0eXBlZGVmIHN0cnVjdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrU3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIgICAgICAgIGZsYWdzOworICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2U7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbWluSW1hZ2VDb3VudDsKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUZvcm1hdDsKKyAgICBWa0NvbG9yU3BhY2VLSFIgICAgICAgICAgICAgICAgICBpbWFnZUNvbG9yU3BhY2U7CisgICAgVmtFeHRlbnQyRCAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VFeHRlbnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VBcnJheUxheWVyczsKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICBpbWFnZVVzYWdlOworICAgIFZrU2hhcmluZ01vZGUgICAgICAgICAgICAgICAgICAgIGltYWdlU2hhcmluZ01vZGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgICAgcHJlVHJhbnNmb3JtOworICAgIFZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiAgICAgIGNvbXBvc2l0ZUFscGhhOworICAgIFZrUHJlc2VudE1vZGVLSFIgICAgICAgICAgICAgICAgIHByZXNlbnRNb2RlOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwZWQ7CisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgb2xkU3dhcGNoYWluOworfSBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrUHJlc2VudEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgIHdhaXRTZW1hcGhvcmVDb3VudDsKKyAgICBjb25zdCBWa1NlbWFwaG9yZSogICAgICAgcFdhaXRTZW1hcGhvcmVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudDsKKyAgICBjb25zdCBWa1N3YXBjaGFpbktIUiogICAgcFN3YXBjaGFpbnM7CisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgIHBJbWFnZUluZGljZXM7CisgICAgVmtSZXN1bHQqICAgICAgICAgICAgICAgIHBSZXN1bHRzOworfSBWa1ByZXNlbnRJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgc3dhcGNoYWluOworfSBWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrU3dhcGNoYWluS0hSICAgICBzd2FwY2hhaW47CisgICAgdWludDMyX3QgICAgICAgICAgIGltYWdlSW5kZXg7Cit9IFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgc3dhcGNoYWluOworICAgIHVpbnQ2NF90ICAgICAgICAgICB0aW1lb3V0OworICAgIFZrU2VtYXBob3JlICAgICAgICBzZW1hcGhvcmU7CisgICAgVmtGZW5jZSAgICAgICAgICAgIGZlbmNlOworICAgIHVpbnQzMl90ICAgICAgICAgICBkZXZpY2VNYXNrOworfSBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudE1hc2tbVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFXTsKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiAgICBtb2RlczsKK30gVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQ7CisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZU1hc2tzOworICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSICAgIG1vZGU7Cit9IFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSICAgIG1vZGVzOworfSBWa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVTd2FwY2hhaW5LSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N3YXBjaGFpbktIUiogcFN3YXBjaGFpbik7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveVN3YXBjaGFpbktIUikoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFN3YXBjaGFpbkltYWdlc0tIUikoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90KiBwU3dhcGNoYWluSW1hZ2VDb3VudCwgVmtJbWFnZSogcFN3YXBjaGFpbkltYWdlcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIpKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIFZrRmVuY2UgZmVuY2UsIHVpbnQzMl90KiBwSW1hZ2VJbmRleCk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1F1ZXVlUHJlc2VudEtIUikoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogcFByZXNlbnRJbmZvKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKShWa0RldmljZSBkZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogcE1vZGVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwUmVjdENvdW50LCBWa1JlY3QyRCogcFJlY3RzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQWNxdWlyZU5leHRJbWFnZTJLSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogcEFjcXVpcmVJbmZvLCB1aW50MzJfdCogcEltYWdlSW5kZXgpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVN3YXBjaGFpbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW4pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlQ291bnQsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVQcmVzZW50S0hSKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJlc2VudEluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqICAgICAgICBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2Rlcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWNxdWlyZU5leHRJbWFnZTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogICAgICAgICAgICBwQWNxdWlyZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VJbmRleCk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9kaXNwbGF5IDEKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa0Rpc3BsYXlLSFIpCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtEaXNwbGF5TW9kZUtIUikKKyNkZWZpbmUgVktfS0hSX0RJU1BMQVlfU1BFQ19WRVJTSU9OICAgICAgIDIzCisjZGVmaW5lIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FICAgICAiVktfS0hSX2Rpc3BsYXkiCisKK3R5cGVkZWYgZW51bSBWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgeworICAgIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfT1BBUVVFX0JJVF9LSFIgPSAweDAwMDAwMDAxLAorICAgIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfR0xPQkFMX0JJVF9LSFIgPSAweDAwMDAwMDAyLAorICAgIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfUEVSX1BJWEVMX0JJVF9LSFIgPSAweDAwMDAwMDA0LAorICAgIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfUEVSX1BJWEVMX1BSRU1VTFRJUExJRURfQklUX0tIUiA9IDB4MDAwMDAwMDgsCisgICAgVktfRElTUExBWV9QTEFORV9BTFBIQV9GTEFHX0JJVFNfTUFYX0VOVU1fS0hSID0gMHg3RkZGRkZGRgorfSBWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFI7Cit0eXBlZGVmIFZrRmxhZ3MgVmtEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSOwordHlwZWRlZiBWa0ZsYWdzIFZrRGlzcGxheU1vZGVDcmVhdGVGbGFnc0tIUjsKK3R5cGVkZWYgVmtGbGFncyBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI7Cit0eXBlZGVmIHN0cnVjdCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSIHsKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICBkaXNwbGF5OworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOworICAgIFZrRXh0ZW50MkQgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGltZW5zaW9uczsKKyAgICBWa0V4dGVudDJEICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc29sdXRpb247CisgICAgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIgICAgc3VwcG9ydGVkVHJhbnNmb3JtczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICBwbGFuZVJlb3JkZXJQb3NzaWJsZTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50Q29udGVudDsKK30gVmtEaXNwbGF5UHJvcGVydGllc0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgeworICAgIFZrRXh0ZW50MkQgICAgdmlzaWJsZVJlZ2lvbjsKKyAgICB1aW50MzJfdCAgICAgIHJlZnJlc2hSYXRlOworfSBWa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgeworICAgIFZrRGlzcGxheU1vZGVLSFIgICAgICAgICAgICAgIGRpc3BsYXlNb2RlOworICAgIFZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSICAgIHBhcmFtZXRlcnM7Cit9IFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Rpc3BsYXlNb2RlQ3JlYXRlRmxhZ3NLSFIgICAgZmxhZ3M7CisgICAgVmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgICAgIHBhcmFtZXRlcnM7Cit9IFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiB7CisgICAgVmtEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSICAgIHN1cHBvcnRlZEFscGhhOworICAgIFZrT2Zmc2V0MkQgICAgICAgICAgICAgICAgICAgICBtaW5TcmNQb3NpdGlvbjsKKyAgICBWa09mZnNldDJEICAgICAgICAgICAgICAgICAgICAgbWF4U3JjUG9zaXRpb247CisgICAgVmtFeHRlbnQyRCAgICAgICAgICAgICAgICAgICAgIG1pblNyY0V4dGVudDsKKyAgICBWa0V4dGVudDJEICAgICAgICAgICAgICAgICAgICAgbWF4U3JjRXh0ZW50OworICAgIFZrT2Zmc2V0MkQgICAgICAgICAgICAgICAgICAgICBtaW5Ec3RQb3NpdGlvbjsKKyAgICBWa09mZnNldDJEICAgICAgICAgICAgICAgICAgICAgbWF4RHN0UG9zaXRpb247CisgICAgVmtFeHRlbnQyRCAgICAgICAgICAgICAgICAgICAgIG1pbkRzdEV4dGVudDsKKyAgICBWa0V4dGVudDJEICAgICAgICAgICAgICAgICAgICAgbWF4RHN0RXh0ZW50OworfSBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIHsKKyAgICBWa0Rpc3BsYXlLSFIgICAgY3VycmVudERpc3BsYXk7CisgICAgdWludDMyX3QgICAgICAgIGN1cnJlbnRTdGFja0luZGV4OworfSBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGlzcGxheVN1cmZhY2VDcmVhdGVGbGFnc0tIUiAgICBmbGFnczsKKyAgICBWa0Rpc3BsYXlNb2RlS0hSICAgICAgICAgICAgICAgICAgZGlzcGxheU1vZGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXg7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lU3RhY2tJbmRleDsKKyAgICBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiAgICAgdHJhbnNmb3JtOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxBbHBoYTsKKyAgICBWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgICAgYWxwaGFNb2RlOworICAgIFZrRXh0ZW50MkQgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUV4dGVudDsKK30gVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHBsYW5lSW5kZXgsIHVpbnQzMl90KiBwRGlzcGxheUNvdW50LCBWa0Rpc3BsYXlLSFIqIHBEaXNwbGF5cyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlRGlzcGxheU1vZGVLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEaXNwbGF5TW9kZUtIUiogcE1vZGUpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheU1vZGVLSFIgbW9kZSwgdWludDMyX3QgcGxhbmVJbmRleCwgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqIHBDYXBhYmlsaXRpZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlDb3VudCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5cyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5TW9kZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9kaXNwbGF5X3N3YXBjaGFpbiAxCisjZGVmaW5lIFZLX0tIUl9ESVNQTEFZX1NXQVBDSEFJTl9TUEVDX1ZFUlNJT04gMTAKKyNkZWZpbmUgVktfS0hSX0RJU1BMQVlfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4iCit0eXBlZGVmIHN0cnVjdCBWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa1JlY3QyRCAgICAgICAgICAgc3JjUmVjdDsKKyAgICBWa1JlY3QyRCAgICAgICAgICAgZHN0UmVjdDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgcGVyc2lzdGVudDsKK30gVmtEaXNwbGF5UHJlc2VudEluZm9LSFI7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUikoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfc2FtcGxlcl9taXJyb3JfY2xhbXBfdG9fZWRnZSAxCisjZGVmaW5lIFZLX0tIUl9TQU1QTEVSX01JUlJPUl9DTEFNUF9UT19FREdFX1NQRUNfVkVSU0lPTiAzCisjZGVmaW5lIFZLX0tIUl9TQU1QTEVSX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfc2FtcGxlcl9taXJyb3JfY2xhbXBfdG9fZWRnZSIKKworCisjZGVmaW5lIFZLX0tIUl9tdWx0aXZpZXcgMQorI2RlZmluZSBWS19LSFJfTVVMVElWSUVXX1NQRUNfVkVSU0lPTiAgICAgMQorI2RlZmluZSBWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FICAgIlZLX0tIUl9tdWx0aXZpZXciCit0eXBlZGVmIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mb0tIUjsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzS0hSOworCit0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzS0hSOworCisKKworI2RlZmluZSBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiAxCisjZGVmaW5lIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9TUEVDX1ZFUlNJT04gMgorI2RlZmluZSBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIgordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI7CisKK3R5cGVkZWYgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUjsKKwordHlwZWRlZiBWa0Zvcm1hdFByb3BlcnRpZXMyIFZrRm9ybWF0UHJvcGVydGllczJLSFI7CisKK3R5cGVkZWYgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUjsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMktIUjsKKwordHlwZWRlZiBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSOworCit0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFI7CisKK3R5cGVkZWYgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUjsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMktIUjsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiBwRmVhdHVyZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogcFByb3BlcnRpZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtGb3JtYXRQcm9wZXJ0aWVzMiogcEZvcm1hdFByb3BlcnRpZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiBwSW1hZ2VGb3JtYXRJbmZvLCBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiBwTWVtb3J5UHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwUHJvcGVydGllcyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogICAgIHBJbWFnZUZvcm1hdEluZm8sCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9kZXZpY2VfZ3JvdXAgMQorI2RlZmluZSBWS19LSFJfREVWSUNFX0dST1VQX1NQRUNfVkVSU0lPTiAgNAorI2RlZmluZSBWS19LSFJfREVWSUNFX0dST1VQX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfZGV2aWNlX2dyb3VwIgordHlwZWRlZiBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzS0hSOworCit0eXBlZGVmIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFI7CisKK3R5cGVkZWYgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0tIUjsKKwordHlwZWRlZiBWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHMgVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzS0hSOworCit0eXBlZGVmIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mb0tIUjsKKwordHlwZWRlZiBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mb0tIUjsKKwordHlwZWRlZiBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mb0tIUjsKKwordHlwZWRlZiBWa0RldmljZUdyb3VwU3VibWl0SW5mbyBWa0RldmljZUdyb3VwU3VibWl0SW5mb0tIUjsKKwordHlwZWRlZiBWa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8gVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvS0hSOworCit0eXBlZGVmIFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm9LSFI7CisKK3R5cGVkZWYgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm9LSFI7CisKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUikoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqIHBQZWVyTWVtb3J5RmVhdHVyZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFNldERldmljZU1hc2tLSFIpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBkZXZpY2VNYXNrKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREaXNwYXRjaEJhc2VLSFIpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBiYXNlR3JvdXBYLCB1aW50MzJfdCBiYXNlR3JvdXBZLCB1aW50MzJfdCBiYXNlR3JvdXBaLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0RGV2aWNlTWFza0tIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMgMQorI2RlZmluZSBWS19LSFJfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19FWFRFTlNJT05fTkFNRSAiVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMiCisKKworI2RlZmluZSBWS19LSFJfbWFpbnRlbmFuY2UxIDEKKyNkZWZpbmUgVktfS0hSX01BSU5URU5BTkNFMV9TUEVDX1ZFUlNJT04gIDIKKyNkZWZpbmUgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSAiVktfS0hSX21haW50ZW5hbmNlMSIKK3R5cGVkZWYgVmtDb21tYW5kUG9vbFRyaW1GbGFncyBWa0NvbW1hbmRQb29sVHJpbUZsYWdzS0hSOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrVHJpbUNvbW1hbmRQb29sS0hSKShWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrVHJpbUNvbW1hbmRQb29sS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24gMQorI2RlZmluZSBWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9ERVZJQ0VfR1JPVVBfQ1JFQVRJT05fRVhURU5TSU9OX05BTUUgIlZLX0tIUl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24iCisjZGVmaW5lIFZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRV9LSFIgICAgICBWS19NQVhfREVWSUNFX0dST1VQX1NJWkUKK3R5cGVkZWYgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSOworCit0eXBlZGVmIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvS0hSOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKShWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCogcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIgorI2RlZmluZSBWS19MVUlEX1NJWkVfS0hSICAgICAgICAgICAgICAgICAgVktfTFVJRF9TSVpFCit0eXBlZGVmIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc0tIUjsKKwordHlwZWRlZiBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNLSFI7CisKK3R5cGVkZWYgVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFncyBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzS0hSOworCit0eXBlZGVmIFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHMgVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c0tIUjsKKwordHlwZWRlZiBWa0V4dGVybmFsTWVtb3J5UHJvcGVydGllcyBWa0V4dGVybmFsTWVtb3J5UHJvcGVydGllc0tIUjsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvS0hSOworCit0eXBlZGVmIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc0tIUjsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm9LSFI7CisKK3R5cGVkZWYgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFI7CisKK3R5cGVkZWYgVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyBWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzS0hSOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qIHBFeHRlcm5hbEJ1ZmZlckluZm8sIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogICBwRXh0ZXJuYWxCdWZmZXJJbmZvLAorICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9leHRlcm5hbF9tZW1vcnkgMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfTUVNT1JZX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9leHRlcm5hbF9tZW1vcnkiCisjZGVmaW5lIFZLX1FVRVVFX0ZBTUlMWV9FWFRFUk5BTF9LSFIgICAgICBWS19RVUVVRV9GQU1JTFlfRVhURVJOQUwKK3R5cGVkZWYgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvS0hSOworCit0eXBlZGVmIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvS0hSOworCit0eXBlZGVmIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvS0hSOworCisKKworI2RlZmluZSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9GRF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfTUVNT1JZX0ZEX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkIgordHlwZWRlZiBzdHJ1Y3QgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgIGhhbmRsZVR5cGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZDsKK30gVmtJbXBvcnRNZW1vcnlGZEluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBtZW1vcnlUeXBlQml0czsKK30gVmtNZW1vcnlGZFByb3BlcnRpZXNLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnk7CisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICBoYW5kbGVUeXBlOworfSBWa01lbW9yeUdldEZkSW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRNZW1vcnlGZEtIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIpKFZrRGV2aWNlIGRldmljZSwgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBpbnQgZmQsIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5RmRQcm9wZXJ0aWVzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRNZW1vcnlGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsCisgICAgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICBwTWVtb3J5RmRQcm9wZXJ0aWVzKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMgMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0NBUEFCSUxJVElFU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSAiVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMiCit0eXBlZGVmIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnc0tIUjsKKwordHlwZWRlZiBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNLSFI7CisKK3R5cGVkZWYgVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFncyBWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzS0hSOworCit0eXBlZGVmIFZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHMgVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0c0tIUjsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm9LSFI7CisKK3R5cGVkZWYgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFI7CisKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmUgMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmUiCit0eXBlZGVmIFZrU2VtYXBob3JlSW1wb3J0RmxhZ3MgVmtTZW1hcGhvcmVJbXBvcnRGbGFnc0tIUjsKKwordHlwZWRlZiBWa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzIFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHNLSFI7CisKK3R5cGVkZWYgVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mb0tIUjsKKworCisKKyNkZWZpbmUgVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCAxCisjZGVmaW5lIFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRkRfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9GRF9FWFRFTlNJT05fTkFNRSAiVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCIKK3R5cGVkZWYgc3RydWN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmU7CisgICAgVmtTZW1hcGhvcmVJbXBvcnRGbGFncyAgICAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzICAgIGhhbmRsZVR5cGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZDsKK30gVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmU7CisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyAgICBoYW5kbGVUeXBlOworfSBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtJbXBvcnRTZW1hcGhvcmVGZEtIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiogcEltcG9ydFNlbWFwaG9yZUZkSW5mbyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFNlbWFwaG9yZUZkS0hSKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiBwR2V0RmRJbmZvLCBpbnQqIHBGZCk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrSW1wb3J0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqICAgICAgICAgICBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfS0hSX3B1c2hfZGVzY3JpcHRvciAxCisjZGVmaW5lIFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfU1BFQ19WRVJTSU9OIDIKKyNkZWZpbmUgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSAiVktfS0hSX3B1c2hfZGVzY3JpcHRvciIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFB1c2hEZXNjcmlwdG9yczsKK30gVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUjsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvcldyaXRlcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIGNvbnN0IHZvaWQqIHBEYXRhKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfc2hhZGVyX2Zsb2F0MTZfaW50OCAxCisjZGVmaW5lIFZLX0tIUl9TSEFERVJfRkxPQVQxNl9JTlQ4X1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9TSEFERVJfRkxPQVQxNl9JTlQ4X0VYVEVOU0lPTl9OQU1FICJWS19LSFJfc2hhZGVyX2Zsb2F0MTZfaW50OCIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBzaGFkZXJGbG9hdDE2OworICAgIFZrQm9vbDMyICAgICAgICAgICBzaGFkZXJJbnQ4OworfSBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUjsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiBWa1BoeXNpY2FsRGV2aWNlRmxvYXQxNkludDhGZWF0dXJlc0tIUjsKKworCisKKyNkZWZpbmUgVktfS0hSXzE2Yml0X3N0b3JhZ2UgMQorI2RlZmluZSBWS19LSFJfMTZCSVRfU1RPUkFHRV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfMTZCSVRfU1RPUkFHRV9FWFRFTlNJT05fTkFNRSAiVktfS0hSXzE2Yml0X3N0b3JhZ2UiCit0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXNLSFI7CisKKworCisjZGVmaW5lIFZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50IDEKKyNkZWZpbmUgVktfS0hSX0lOQ1JFTUVOVEFMX1BSRVNFTlRfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfS0hSX0lOQ1JFTUVOVEFMX1BSRVNFTlRfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50IgordHlwZWRlZiBzdHJ1Y3QgVmtSZWN0TGF5ZXJLSFIgeworICAgIFZrT2Zmc2V0MkQgICAgb2Zmc2V0OworICAgIFZrRXh0ZW50MkQgICAgZXh0ZW50OworICAgIHVpbnQzMl90ICAgICAgbGF5ZXI7Cit9IFZrUmVjdExheWVyS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1ByZXNlbnRSZWdpb25LSFIgeworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICByZWN0YW5nbGVDb3VudDsKKyAgICBjb25zdCBWa1JlY3RMYXllcktIUiogICAgcFJlY3RhbmdsZXM7Cit9IFZrUHJlc2VudFJlZ2lvbktIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQcmVzZW50UmVnaW9uc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQ7CisgICAgY29uc3QgVmtQcmVzZW50UmVnaW9uS0hSKiAgICBwUmVnaW9uczsKK30gVmtQcmVzZW50UmVnaW9uc0tIUjsKKworCisKKyNkZWZpbmUgVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIDEKK3R5cGVkZWYgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFI7CisKKyNkZWZpbmUgVktfS0hSX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9FWFRFTlNJT05fTkFNRSAiVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIgordHlwZWRlZiBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGUgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlS0hSOworCit0eXBlZGVmIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlRmxhZ3MgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFnc0tIUjsKKwordHlwZWRlZiBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnlLSFI7CisKK3R5cGVkZWYgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUikoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUikoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyIDEKKyNkZWZpbmUgVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGltYWdlbGVzc0ZyYW1lYnVmZmVyOworfSBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgcE5leHQ7CisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgIGZsYWdzOworICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICB1c2FnZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgd2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIGhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbGF5ZXJDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgdmlld0Zvcm1hdENvdW50OworICAgIGNvbnN0IFZrRm9ybWF0KiAgICAgICBwVmlld0Zvcm1hdHM7Cit9IFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQ7CisgICAgY29uc3QgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIqICAgIHBBdHRhY2htZW50SW1hZ2VJbmZvczsKK30gVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50OworICAgIGNvbnN0IFZrSW1hZ2VWaWV3KiAgICBwQXR0YWNobWVudHM7Cit9IFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI7CisKKworCisjZGVmaW5lIFZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIgMQorI2RlZmluZSBWS19LSFJfQ1JFQVRFX1JFTkRFUlBBU1NfMl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfQ1JFQVRFX1JFTkRFUlBBU1NfMl9FWFRFTlNJT05fTkFNRSAiVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMiIKK3R5cGVkZWYgc3RydWN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ3MgICAgZmxhZ3M7CisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgICBzYW1wbGVzOworICAgIFZrQXR0YWNobWVudExvYWRPcCAgICAgICAgICAgICAgbG9hZE9wOworICAgIFZrQXR0YWNobWVudFN0b3JlT3AgICAgICAgICAgICAgc3RvcmVPcDsKKyAgICBWa0F0dGFjaG1lbnRMb2FkT3AgICAgICAgICAgICAgIHN0ZW5jaWxMb2FkT3A7CisgICAgVmtBdHRhY2htZW50U3RvcmVPcCAgICAgICAgICAgICBzdGVuY2lsU3RvcmVPcDsKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgIGluaXRpYWxMYXlvdXQ7CisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICBmaW5hbExheW91dDsKK30gVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBhdHRhY2htZW50OworICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICBsYXlvdXQ7CisgICAgVmtJbWFnZUFzcGVjdEZsYWdzICAgIGFzcGVjdE1hc2s7Cit9IFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFncyAgICAgICAgICAgZmxhZ3M7CisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld01hc2s7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRBdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogICAgcElucHV0QXR0YWNobWVudHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JBdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogICAgcENvbG9yQXR0YWNobWVudHM7CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogICAgcFJlc29sdmVBdHRhY2htZW50czsKKyAgICBjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiAgICBwRGVwdGhTdGVuY2lsQXR0YWNobWVudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICBwUHJlc2VydmVBdHRhY2htZW50czsKK30gVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgc3JjU3VicGFzczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBkc3RTdWJwYXNzOworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgIHNyY1N0YWdlTWFzazsKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICBkc3RTdGFnZU1hc2s7CisgICAgVmtBY2Nlc3NGbGFncyAgICAgICAgICAgc3JjQWNjZXNzTWFzazsKKyAgICBWa0FjY2Vzc0ZsYWdzICAgICAgICAgICBkc3RBY2Nlc3NNYXNrOworICAgIFZrRGVwZW5kZW5jeUZsYWdzICAgICAgIGRlcGVuZGVuY3lGbGFnczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICB2aWV3T2Zmc2V0OworfSBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVGbGFncyAgICAgICAgICAgICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50OworICAgIGNvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiogICAgcEF0dGFjaG1lbnRzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFzc0NvdW50OworICAgIGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiogICAgICAgcFN1YnBhc3NlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lDb3VudDsKKyAgICBjb25zdCBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiogICAgICAgIHBEZXBlbmRlbmNpZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGVkVmlld01hc2tDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgIHBDb3JyZWxhdGVkVmlld01hc2tzOworfSBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICBwTmV4dDsKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICBjb250ZW50czsKK30gVmtTdWJwYXNzQmVnaW5JbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1N1YnBhc3NFbmRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworfSBWa1N1YnBhc3NFbmRJbmZvS0hSOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZVJlbmRlclBhc3MyS0hSKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgIHBSZW5kZXJQYXNzQmVnaW4sIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICBwU3VicGFzc0JlZ2luSW5mbyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUikoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICBwU3VicGFzc0VuZEluZm8pOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWROZXh0U3VicGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICAgICAgICAgICAgcFN1YnBhc3NCZWdpbkluZm8sCisgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgICAgICAgICAgICBwU3VicGFzc0VuZEluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZFJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UgMQorI2RlZmluZSBWS19LSFJfU0hBUkVEX1BSRVNFTlRBQkxFX0lNQUdFX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9TSEFSRURfUFJFU0VOVEFCTEVfSU1BR0VfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UiCit0eXBlZGVmIHN0cnVjdCBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICBzaGFyZWRQcmVzZW50U3VwcG9ydGVkVXNhZ2VGbGFnczsKK30gVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIpKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0NBUEFCSUxJVElFU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfRkVOQ0VfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIgordHlwZWRlZiBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzS0hSOworCit0eXBlZGVmIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFI7CisKK3R5cGVkZWYgVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzIFZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnc0tIUjsKKwordHlwZWRlZiBWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMgVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzS0hSOworCit0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm9LSFI7CisKK3R5cGVkZWYgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiBwRXh0ZXJuYWxGZW5jZUluZm8sIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfZXh0ZXJuYWxfZmVuY2UgMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfRkVOQ0VfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfZXh0ZXJuYWxfZmVuY2UiCit0eXBlZGVmIFZrRmVuY2VJbXBvcnRGbGFncyBWa0ZlbmNlSW1wb3J0RmxhZ3NLSFI7CisKK3R5cGVkZWYgVmtGZW5jZUltcG9ydEZsYWdCaXRzIFZrRmVuY2VJbXBvcnRGbGFnQml0c0tIUjsKKwordHlwZWRlZiBWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyBWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mb0tIUjsKKworCisKKyNkZWZpbmUgVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0ZEX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9GRF9FWFRFTlNJT05fTkFNRSAiVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkIgordHlwZWRlZiBzdHJ1Y3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2U7CisgICAgVmtGZW5jZUltcG9ydEZsYWdzICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyAgICBoYW5kbGVUeXBlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZDsKK30gVmtJbXBvcnRGZW5jZUZkSW5mb0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtGZW5jZUdldEZkSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2U7CisgICAgVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzICAgIGhhbmRsZVR5cGU7Cit9IFZrRmVuY2VHZXRGZEluZm9LSFI7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrSW1wb3J0RmVuY2VGZEtIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKiBwSW1wb3J0RmVuY2VGZEluZm8pOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRGZW5jZUZkS0hSKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtJbXBvcnRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqICAgICAgICAgICAgICAgcEltcG9ydEZlbmNlRmRJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkgMQorI2RlZmluZSBWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkiCisKK3R5cGVkZWYgZW51bSBWa1BlcmZvcm1hbmNlQ291bnRlclVuaXRLSFIgeworICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9HRU5FUklDX0tIUiA9IDAsCisgICAgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX1BFUkNFTlRBR0VfS0hSID0gMSwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfTkFOT1NFQ09ORFNfS0hSID0gMiwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQllURVNfS0hSID0gMywKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQllURVNfUEVSX1NFQ09ORF9LSFIgPSA0LAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9LRUxWSU5fS0hSID0gNSwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfV0FUVFNfS0hSID0gNiwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfVk9MVFNfS0hSID0gNywKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQU1QU19LSFIgPSA4LAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9IRVJUWl9LSFIgPSA5LAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9DWUNMRVNfS0hSID0gMTAsCisgICAgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0JFR0lOX1JBTkdFX0tIUiA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9HRU5FUklDX0tIUiwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfRU5EX1JBTkdFX0tIUiA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9DWUNMRVNfS0hSLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9SQU5HRV9TSVpFX0tIUiA9IChWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQ1lDTEVTX0tIUiAtIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9HRU5FUklDX0tIUiArIDEpLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9NQVhfRU5VTV9LSFIgPSAweDdGRkZGRkZGCit9IFZrUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUjsKKwordHlwZWRlZiBlbnVtIFZrUGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFIgeworICAgIFZLX1FVRVJZX1NDT1BFX0NPTU1BTkRfQlVGRkVSX0tIUiA9IDAsCisgICAgVktfUVVFUllfU0NPUEVfUkVOREVSX1BBU1NfS0hSID0gMSwKKyAgICBWS19RVUVSWV9TQ09QRV9DT01NQU5EX0tIUiA9IDIsCisgICAgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TQ09QRV9CRUdJTl9SQU5HRV9LSFIgPSBWS19RVUVSWV9TQ09QRV9DT01NQU5EX0JVRkZFUl9LSFIsCisgICAgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TQ09QRV9FTkRfUkFOR0VfS0hSID0gVktfUVVFUllfU0NPUEVfQ09NTUFORF9LSFIsCisgICAgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TQ09QRV9SQU5HRV9TSVpFX0tIUiA9IChWS19RVUVSWV9TQ09QRV9DT01NQU5EX0tIUiAtIFZLX1FVRVJZX1NDT1BFX0NPTU1BTkRfQlVGRkVSX0tIUiArIDEpLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU0NPUEVfTUFYX0VOVU1fS0hSID0gMHg3RkZGRkZGRgorfSBWa1BlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSOworCit0eXBlZGVmIGVudW0gVmtQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSIHsKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfSU5UMzJfS0hSID0gMCwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfSU5UNjRfS0hSID0gMSwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfVUlOVDMyX0tIUiA9IDIsCisgICAgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX1VJTlQ2NF9LSFIgPSAzLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9GTE9BVDMyX0tIUiA9IDQsCisgICAgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX0ZMT0FUNjRfS0hSID0gNSwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfQkVHSU5fUkFOR0VfS0hSID0gVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX0lOVDMyX0tIUiwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfRU5EX1JBTkdFX0tIUiA9IFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9GTE9BVDY0X0tIUiwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfUkFOR0VfU0laRV9LSFIgPSAoVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX0ZMT0FUNjRfS0hSIC0gVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX0lOVDMyX0tIUiArIDEpLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9NQVhfRU5VTV9LSFIgPSAweDdGRkZGRkZGCit9IFZrUGVyZm9ybWFuY2VDb3VudGVyU3RvcmFnZUtIUjsKKwordHlwZWRlZiBlbnVtIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUiB7CisgICAgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9QRVJGT1JNQU5DRV9JTVBBQ1RJTkdfS0hSID0gMHgwMDAwMDAwMSwKKyAgICBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX0RFU0NSSVBUSU9OX0NPTkNVUlJFTlRMWV9JTVBBQ1RFRF9LSFIgPSAweDAwMDAwMDAyLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fRkxBR19CSVRTX01BWF9FTlVNX0tIUiA9IDB4N0ZGRkZGRkYKK30gVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSOwordHlwZWRlZiBWa0ZsYWdzIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnc0tIUjsKKwordHlwZWRlZiBlbnVtIFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnQml0c0tIUiB7CisgICAgVktfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19GTEFHX0JJVFNfTUFYX0VOVU1fS0hSID0gMHg3RkZGRkZGRgorfSBWa0FjcXVpcmVQcm9maWxpbmdMb2NrRmxhZ0JpdHNLSFI7Cit0eXBlZGVmIFZrRmxhZ3MgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0ZsYWdzS0hSOwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgcGVyZm9ybWFuY2VDb3VudGVyUXVlcnlQb29sczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzOworfSBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzOworfSBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUiAgICAgICB1bml0OworICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFIgICAgICBzY29wZTsKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFIgICAgc3RvcmFnZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZFtWS19VVUlEX1NJWkVdOworfSBWa1BlcmZvcm1hbmNlQ291bnRlcktIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ3NLSFIgICAgZmxhZ3M7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVtWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKK30gVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXg7CisgICAgdWludDMyX3QgICAgICAgICAgIGNvdW50ZXJJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiAgICBwQ291bnRlckluZGljZXM7Cit9IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSOworCit0eXBlZGVmIHVuaW9uIFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSIHsKKyAgICBpbnQzMl90ICAgICBpbnQzMjsKKyAgICBpbnQ2NF90ICAgICBpbnQ2NDsKKyAgICB1aW50MzJfdCAgICB1aW50MzI7CisgICAgdWludDY0X3QgICAgdWludDY0OworICAgIGZsb2F0ICAgICAgIGZsb2F0MzI7CisgICAgZG91YmxlICAgICAgZmxvYXQ2NDsKK30gVmtQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnc0tIUiAgICBmbGFnczsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDsKK30gVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIGNvdW50ZXJQYXNzSW5kZXg7Cit9IFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFI7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgdWludDMyX3QqIHBDb3VudGVyQ291bnQsIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiBwQ291bnRlcnMsIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqIHBDb3VudGVyRGVzY3JpcHRpb25zKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqIHBQZXJmb3JtYW5jZVF1ZXJ5Q3JlYXRlSW5mbywgdWludDMyX3QqIHBOdW1QYXNzZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiogcEluZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKShWa0RldmljZSBkZXZpY2UpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckNvdW50LAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJzLAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqICAgICAgICAgcENvdW50ZXJEZXNjcmlwdGlvbnMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqICBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtUGFzc2VzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqICAgICAgICBwSW5mbyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfbWFpbnRlbmFuY2UyIDEKKyNkZWZpbmUgVktfS0hSX01BSU5URU5BTkNFMl9TUEVDX1ZFUlNJT04gIDEKKyNkZWZpbmUgVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSAiVktfS0hSX21haW50ZW5hbmNlMiIKK3R5cGVkZWYgVmtQb2ludENsaXBwaW5nQmVoYXZpb3IgVmtQb2ludENsaXBwaW5nQmVoYXZpb3JLSFI7CisKK3R5cGVkZWYgVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4gVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5LSFI7CisKK3R5cGVkZWYgVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzIFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllc0tIUjsKKwordHlwZWRlZiBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UgVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2VLSFI7CisKK3R5cGVkZWYgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvS0hSOworCisKKworI2RlZmluZSBWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiAxCisjZGVmaW5lIFZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfR0VUX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgc3VyZmFjZTsKK30gVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgICAgc3VyZmFjZUNhcGFiaWxpdGllczsKK30gVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTdXJmYWNlRm9ybWF0MktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIgICAgc3VyZmFjZUZvcm1hdDsKK30gVmtTdXJmYWNlRm9ybWF0MktIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgdWludDMyX3QqIHBTdXJmYWNlRm9ybWF0Q291bnQsIFZrU3VyZmFjZUZvcm1hdDJLSFIqIHBTdXJmYWNlRm9ybWF0cyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXQyS0hSKiAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl92YXJpYWJsZV9wb2ludGVycyAxCisjZGVmaW5lIFZLX0tIUl9WQVJJQUJMRV9QT0lOVEVSU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfVkFSSUFCTEVfUE9JTlRFUlNfRVhURU5TSU9OX05BTUUgIlZLX0tIUl92YXJpYWJsZV9wb2ludGVycyIKK3R5cGVkZWYgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyRmVhdHVyZXNLSFI7CisKK3R5cGVkZWYgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzS0hSOworCisKKworI2RlZmluZSBWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIgMQorI2RlZmluZSBWS19LSFJfR0VUX0RJU1BMQVlfUFJPUEVSVElFU18yX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9HRVRfRElTUExBWV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMiIKK3R5cGVkZWYgc3RydWN0IFZrRGlzcGxheVByb3BlcnRpZXMyS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiAgICBkaXNwbGF5UHJvcGVydGllczsKK30gVmtEaXNwbGF5UHJvcGVydGllczJLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSICAgIGRpc3BsYXlQbGFuZVByb3BlcnRpZXM7Cit9IFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgICAgZGlzcGxheU1vZGVQcm9wZXJ0aWVzOworfSBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICBwTmV4dDsKKyAgICBWa0Rpc3BsYXlNb2RlS0hSICAgIG1vZGU7CisgICAgdWludDMyX3QgICAgICAgICAgICBwbGFuZUluZGV4OworfSBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSICAgIGNhcGFiaWxpdGllczsKK30gVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogcFByb3BlcnRpZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqIHBQcm9wZXJ0aWVzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogcERpc3BsYXlQbGFuZUluZm8sIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiogcENhcGFiaWxpdGllcyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogICAgICAgICAgICAgICBwRGlzcGxheVBsYW5lSW5mbywKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24gMQorI2RlZmluZSBWS19LSFJfREVESUNBVEVEX0FMTE9DQVRJT05fU1BFQ19WRVJTSU9OIDMKKyNkZWZpbmUgVktfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24iCit0eXBlZGVmIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzS0hSOworCit0eXBlZGVmIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvS0hSOworCisKKworI2RlZmluZSBWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyAxCisjZGVmaW5lIFZLX0tIUl9TVE9SQUdFX0JVRkZFUl9TVE9SQUdFX0NMQVNTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9TVE9SQUdFX0JVRkZFUl9TVE9SQUdFX0NMQVNTX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyIKKworCisjZGVmaW5lIFZLX0tIUl9yZWxheGVkX2Jsb2NrX2xheW91dCAxCisjZGVmaW5lIFZLX0tIUl9SRUxBWEVEX0JMT0NLX0xBWU9VVF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfUkVMQVhFRF9CTE9DS19MQVlPVVRfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9yZWxheGVkX2Jsb2NrX2xheW91dCIKKworCisjZGVmaW5lIFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIgMQorI2RlZmluZSBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSAiVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiIKK3R5cGVkZWYgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yS0hSOworCit0eXBlZGVmIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJLSFI7CisKK3R5cGVkZWYgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUjsKKwordHlwZWRlZiBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9pbWFnZV9mb3JtYXRfbGlzdCAxCisjZGVmaW5lIFZLX0tIUl9JTUFHRV9GT1JNQVRfTElTVF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfSU1BR0VfRk9STUFUX0xJU1RfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9pbWFnZV9mb3JtYXRfbGlzdCIKK3R5cGVkZWYgc3RydWN0IFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgdmlld0Zvcm1hdENvdW50OworICAgIGNvbnN0IFZrRm9ybWF0KiAgICBwVmlld0Zvcm1hdHM7Cit9IFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjsKKworCisKKyNkZWZpbmUgVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiAxCit0eXBlZGVmIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25LSFI7CisKKyNkZWZpbmUgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9TUEVDX1ZFUlNJT04gMTQKKyNkZWZpbmUgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSAiVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiIKK3R5cGVkZWYgVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24gVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb25LSFI7CisKK3R5cGVkZWYgVmtTYW1wbGVyWWNiY3JSYW5nZSBWa1NhbXBsZXJZY2JjclJhbmdlS0hSOworCit0eXBlZGVmIFZrQ2hyb21hTG9jYXRpb24gVmtDaHJvbWFMb2NhdGlvbktIUjsKKwordHlwZWRlZiBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvS0hSOworCit0eXBlZGVmIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvS0hSOworCit0eXBlZGVmIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mb0tIUjsKKwordHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXNLSFI7CisKK3R5cGVkZWYgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllc0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogcFljYmNyQ29udmVyc2lvbik7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIpKFZrRGV2aWNlIGRldmljZSwgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyQ29udmVyc2lvbiwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfS0hSX2JpbmRfbWVtb3J5MiAxCisjZGVmaW5lIFZLX0tIUl9CSU5EX01FTU9SWV8yX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfYmluZF9tZW1vcnkyIgordHlwZWRlZiBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvIFZrQmluZEJ1ZmZlck1lbW9yeUluZm9LSFI7CisKK3R5cGVkZWYgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIFZrQmluZEltYWdlTWVtb3J5SW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MktIUikoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBwQmluZEluZm9zKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQmluZEltYWdlTWVtb3J5MktIUikoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0JpbmRCdWZmZXJNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCaW5kSW1hZ2VNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworI2VuZGlmCisKKworI2RlZmluZSBWS19LSFJfbWFpbnRlbmFuY2UzIDEKKyNkZWZpbmUgVktfS0hSX01BSU5URU5BTkNFM19TUEVDX1ZFUlNJT04gIDEKKyNkZWZpbmUgVktfS0hSX01BSU5URU5BTkNFM19FWFRFTlNJT05fTkFNRSAiVktfS0hSX21haW50ZW5hbmNlMyIKK3R5cGVkZWYgVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMgVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXNLSFI7CisKK3R5cGVkZWYgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHBTdXBwb3J0KTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50IDEKKyNkZWZpbmUgVktfS0hSX0RSQVdfSU5ESVJFQ1RfQ09VTlRfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfS0hSX0RSQVdfSU5ESVJFQ1RfQ09VTlRfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50IgordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9zaGFkZXJfc3ViZ3JvdXBfZXh0ZW5kZWRfdHlwZXMgMQorI2RlZmluZSBWS19LSFJfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9zaGFkZXJfc3ViZ3JvdXBfZXh0ZW5kZWRfdHlwZXMiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlczsKK30gVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSOworCisKKworI2RlZmluZSBWS19LSFJfOGJpdF9zdG9yYWdlIDEKKyNkZWZpbmUgVktfS0hSXzhCSVRfU1RPUkFHRV9TUEVDX1ZFUlNJT04gIDEKKyNkZWZpbmUgVktfS0hSXzhCSVRfU1RPUkFHRV9FWFRFTlNJT05fTkFNRSAiVktfS0hSXzhiaXRfc3RvcmFnZSIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBzdG9yYWdlQnVmZmVyOEJpdEFjY2VzczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgdW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzOworICAgIFZrQm9vbDMyICAgICAgICAgICBzdG9yYWdlUHVzaENvbnN0YW50ODsKK30gVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFI7CisKKworCisjZGVmaW5lIFZLX0tIUl9zaGFkZXJfYXRvbWljX2ludDY0IDEKKyNkZWZpbmUgVktfS0hSX1NIQURFUl9BVE9NSUNfSU5UNjRfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfS0hSX1NIQURFUl9BVE9NSUNfSU5UNjRfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9zaGFkZXJfYXRvbWljX2ludDY0IgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlckJ1ZmZlckludDY0QXRvbWljczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzOworfSBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUjsKKworCisKKyNkZWZpbmUgVktfS0hSX3NoYWRlcl9jbG9jayAxCisjZGVmaW5lIFZLX0tIUl9TSEFERVJfQ0xPQ0tfU1BFQ19WRVJTSU9OICAxCisjZGVmaW5lIFZLX0tIUl9TSEFERVJfQ0xPQ0tfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9zaGFkZXJfY2xvY2siCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2hhZGVyU3ViZ3JvdXBDbG9jazsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2hhZGVyRGV2aWNlQ2xvY2s7Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSOworCisKKworI2RlZmluZSBWS19LSFJfZHJpdmVyX3Byb3BlcnRpZXMgMQorI2RlZmluZSBWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFIgICAgICAgMjU2CisjZGVmaW5lIFZLX01BWF9EUklWRVJfSU5GT19TSVpFX0tIUiAgICAgICAyNTYKKyNkZWZpbmUgVktfS0hSX0RSSVZFUl9QUk9QRVJUSUVTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9EUklWRVJfUFJPUEVSVElFU19FWFRFTlNJT05fTkFNRSAiVktfS0hSX2RyaXZlcl9wcm9wZXJ0aWVzIgorCit0eXBlZGVmIGVudW0gVmtEcml2ZXJJZEtIUiB7CisgICAgVktfRFJJVkVSX0lEX0FNRF9QUk9QUklFVEFSWV9LSFIgPSAxLAorICAgIFZLX0RSSVZFUl9JRF9BTURfT1BFTl9TT1VSQ0VfS0hSID0gMiwKKyAgICBWS19EUklWRVJfSURfTUVTQV9SQURWX0tIUiA9IDMsCisgICAgVktfRFJJVkVSX0lEX05WSURJQV9QUk9QUklFVEFSWV9LSFIgPSA0LAorICAgIFZLX0RSSVZFUl9JRF9JTlRFTF9QUk9QUklFVEFSWV9XSU5ET1dTX0tIUiA9IDUsCisgICAgVktfRFJJVkVSX0lEX0lOVEVMX09QRU5fU09VUkNFX01FU0FfS0hSID0gNiwKKyAgICBWS19EUklWRVJfSURfSU1BR0lOQVRJT05fUFJPUFJJRVRBUllfS0hSID0gNywKKyAgICBWS19EUklWRVJfSURfUVVBTENPTU1fUFJPUFJJRVRBUllfS0hSID0gOCwKKyAgICBWS19EUklWRVJfSURfQVJNX1BST1BSSUVUQVJZX0tIUiA9IDksCisgICAgVktfRFJJVkVSX0lEX0dPT0dMRV9TV0lGVFNIQURFUl9LSFIgPSAxMCwKKyAgICBWS19EUklWRVJfSURfR0dQX1BST1BSSUVUQVJZX0tIUiA9IDExLAorICAgIFZLX0RSSVZFUl9JRF9CUk9BRENPTV9QUk9QUklFVEFSWV9LSFIgPSAxMiwKKyAgICBWS19EUklWRVJfSURfQkVHSU5fUkFOR0VfS0hSID0gVktfRFJJVkVSX0lEX0FNRF9QUk9QUklFVEFSWV9LSFIsCisgICAgVktfRFJJVkVSX0lEX0VORF9SQU5HRV9LSFIgPSBWS19EUklWRVJfSURfQlJPQURDT01fUFJPUFJJRVRBUllfS0hSLAorICAgIFZLX0RSSVZFUl9JRF9SQU5HRV9TSVpFX0tIUiA9IChWS19EUklWRVJfSURfQlJPQURDT01fUFJPUFJJRVRBUllfS0hSIC0gVktfRFJJVkVSX0lEX0FNRF9QUk9QUklFVEFSWV9LSFIgKyAxKSwKKyAgICBWS19EUklWRVJfSURfTUFYX0VOVU1fS0hSID0gMHg3RkZGRkZGRgorfSBWa0RyaXZlcklkS0hSOwordHlwZWRlZiBzdHJ1Y3QgVmtDb25mb3JtYW5jZVZlcnNpb25LSFIgeworICAgIHVpbnQ4X3QgICAgbWFqb3I7CisgICAgdWludDhfdCAgICBtaW5vcjsKKyAgICB1aW50OF90ICAgIHN1Ym1pbm9yOworICAgIHVpbnQ4X3QgICAgcGF0Y2g7Cit9IFZrQ29uZm9ybWFuY2VWZXJzaW9uS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEcml2ZXJJZEtIUiAgICAgICAgICAgICAgZHJpdmVySUQ7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyTmFtZVtWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFJdOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlckluZm9bVktfTUFYX0RSSVZFUl9JTkZPX1NJWkVfS0hSXTsKKyAgICBWa0NvbmZvcm1hbmNlVmVyc2lvbktIUiAgICBjb25mb3JtYW5jZVZlcnNpb247Cit9IFZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSOworCisKKworI2RlZmluZSBWS19LSFJfc2hhZGVyX2Zsb2F0X2NvbnRyb2xzIDEKKyNkZWZpbmUgVktfS0hSX1NIQURFUl9GTE9BVF9DT05UUk9MU19TUEVDX1ZFUlNJT04gNAorI2RlZmluZSBWS19LSFJfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfc2hhZGVyX2Zsb2F0X2NvbnRyb2xzIgorCit0eXBlZGVmIGVudW0gVmtTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSIHsKKyAgICBWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFXzMyX0JJVF9PTkxZX0tIUiA9IDAsCisgICAgVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9BTExfS0hSID0gMSwKKyAgICBWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFX05PTkVfS0hSID0gMiwKKyAgICBWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFX0JFR0lOX1JBTkdFX0tIUiA9IFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfMzJfQklUX09OTFlfS0hSLAorICAgIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfRU5EX1JBTkdFX0tIUiA9IFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfTk9ORV9LSFIsCisgICAgVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9SQU5HRV9TSVpFX0tIUiA9IChWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFX05PTkVfS0hSIC0gVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV8zMl9CSVRfT05MWV9LSFIgKyAxKSwKKyAgICBWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFX01BWF9FTlVNX0tIUiA9IDB4N0ZGRkZGRkYKK30gVmtTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSOwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUiAgICBkZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZTsKKyAgICBWa1NoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFIgICAgcm91bmRpbmdNb2RlSW5kZXBlbmRlbmNlOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDMyOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDY0OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTY7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMjsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDY0OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTY7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMjsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDY0OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDMyOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDY0OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDMyOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDY0OworfSBWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI7CisKKworCisjZGVmaW5lIFZLX0tIUl9kZXB0aF9zdGVuY2lsX3Jlc29sdmUgMQorI2RlZmluZSBWS19LSFJfREVQVEhfU1RFTkNJTF9SRVNPTFZFX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9kZXB0aF9zdGVuY2lsX3Jlc29sdmUiCisKK3R5cGVkZWYgZW51bSBWa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFIgeworICAgIFZLX1JFU09MVkVfTU9ERV9OT05FX0tIUiA9IDAsCisgICAgVktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFIgPSAweDAwMDAwMDAxLAorICAgIFZLX1JFU09MVkVfTU9ERV9BVkVSQUdFX0JJVF9LSFIgPSAweDAwMDAwMDAyLAorICAgIFZLX1JFU09MVkVfTU9ERV9NSU5fQklUX0tIUiA9IDB4MDAwMDAwMDQsCisgICAgVktfUkVTT0xWRV9NT0RFX01BWF9CSVRfS0hSID0gMHgwMDAwMDAwOCwKKyAgICBWS19SRVNPTFZFX01PREVfRkxBR19CSVRTX01BWF9FTlVNX0tIUiA9IDB4N0ZGRkZGRkYKK30gVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSOwordHlwZWRlZiBWa0ZsYWdzIFZrUmVzb2x2ZU1vZGVGbGFnc0tIUjsKK3R5cGVkZWYgc3RydWN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSICAgICAgICAgICAgZGVwdGhSZXNvbHZlTW9kZTsKKyAgICBWa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFIgICAgICAgICAgICBzdGVuY2lsUmVzb2x2ZU1vZGU7CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogICAgcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50OworfSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1Jlc29sdmVNb2RlRmxhZ3NLSFIgICAgc3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXM7CisgICAgVmtSZXNvbHZlTW9kZUZsYWdzS0hSICAgIHN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXM7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgIGluZGVwZW5kZW50UmVzb2x2ZU5vbmU7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgIGluZGVwZW5kZW50UmVzb2x2ZTsKK30gVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSOworCisKKworI2RlZmluZSBWS19LSFJfc3dhcGNoYWluX211dGFibGVfZm9ybWF0IDEKKyNkZWZpbmUgVktfS0hSX1NXQVBDSEFJTl9NVVRBQkxFX0ZPUk1BVF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfU1dBUENIQUlOX01VVEFCTEVfRk9STUFUX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfc3dhcGNoYWluX211dGFibGVfZm9ybWF0IgorCisKKyNkZWZpbmUgVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSAxCisjZGVmaW5lIFZLX0tIUl9USU1FTElORV9TRU1BUEhPUkVfU1BFQ19WRVJTSU9OIDIKKyNkZWZpbmUgVktfS0hSX1RJTUVMSU5FX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSAiVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSIKKwordHlwZWRlZiBlbnVtIFZrU2VtYXBob3JlVHlwZUtIUiB7CisgICAgVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiA9IDAsCisgICAgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSID0gMSwKKyAgICBWS19TRU1BUEhPUkVfVFlQRV9CRUdJTl9SQU5HRV9LSFIgPSBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSLAorICAgIFZLX1NFTUFQSE9SRV9UWVBFX0VORF9SQU5HRV9LSFIgPSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIsCisgICAgVktfU0VNQVBIT1JFX1RZUEVfUkFOR0VfU0laRV9LSFIgPSAoVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIC0gVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiArIDEpLAorICAgIFZLX1NFTUFQSE9SRV9UWVBFX01BWF9FTlVNX0tIUiA9IDB4N0ZGRkZGRkYKK30gVmtTZW1hcGhvcmVUeXBlS0hSOworCit0eXBlZGVmIGVudW0gVmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIgeworICAgIFZLX1NFTUFQSE9SRV9XQUlUX0FOWV9CSVRfS0hSID0gMHgwMDAwMDAwMSwKKyAgICBWS19TRU1BUEhPUkVfV0FJVF9GTEFHX0JJVFNfTUFYX0VOVU1fS0hSID0gMHg3RkZGRkZGRgorfSBWa1NlbWFwaG9yZVdhaXRGbGFnQml0c0tIUjsKK3R5cGVkZWYgVmtGbGFncyBWa1NlbWFwaG9yZVdhaXRGbGFnc0tIUjsKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICB0aW1lbGluZVNlbWFwaG9yZTsKK30gVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDY0X3QgICAgICAgICAgIG1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlOworfSBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgIHBOZXh0OworICAgIFZrU2VtYXBob3JlVHlwZUtIUiAgICBzZW1hcGhvcmVUeXBlOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICBpbml0aWFsVmFsdWU7Cit9IFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICB3YWl0U2VtYXBob3JlVmFsdWVDb3VudDsKKyAgICBjb25zdCB1aW50NjRfdCogICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXM7CisgICAgdWludDMyX3QgICAgICAgICAgIHNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQ7CisgICAgY29uc3QgdWludDY0X3QqICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXM7Cit9IFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1NlbWFwaG9yZVdhaXRGbGFnc0tIUiAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmVDb3VudDsKKyAgICBjb25zdCBWa1NlbWFwaG9yZSogICAgICAgICBwU2VtYXBob3JlczsKKyAgICBjb25zdCB1aW50NjRfdCogICAgICAgICAgICBwVmFsdWVzOworfSBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtTZW1hcGhvcmUgICAgICAgIHNlbWFwaG9yZTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgdmFsdWU7Cit9IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIpKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCB1aW50NjRfdCogcFZhbHVlKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrV2FpdFNlbWFwaG9yZXNLSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiogcFdhaXRJbmZvLCB1aW50NjRfdCB0aW1lb3V0KTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrU2lnbmFsU2VtYXBob3JlS0hSKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogcFNpZ25hbEluZm8pOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1dhaXRTZW1hcGhvcmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqICAgICAgICAgICAgICAgcFdhaXRJbmZvLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1NpZ25hbFNlbWFwaG9yZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqICAgICAgICAgICAgIHBTaWduYWxJbmZvKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfS0hSX3Z1bGthbl9tZW1vcnlfbW9kZWwgMQorI2RlZmluZSBWS19LSFJfVlVMS0FOX01FTU9SWV9NT0RFTF9TUEVDX1ZFUlNJT04gMworI2RlZmluZSBWS19LSFJfVlVMS0FOX01FTU9SWV9NT0RFTF9FWFRFTlNJT05fTkFNRSAiVktfS0hSX3Z1bGthbl9tZW1vcnlfbW9kZWwiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgdnVsa2FuTWVtb3J5TW9kZWw7CisgICAgVmtCb29sMzIgICAgICAgICAgIHZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGU7CisgICAgVmtCb29sMzIgICAgICAgICAgIHZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWluczsKK30gVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFI7CisKKworCisjZGVmaW5lIFZLX0tIUl9zcGlydl8xXzQgMQorI2RlZmluZSBWS19LSFJfU1BJUlZfMV80X1NQRUNfVkVSU0lPTiAgICAgMQorI2RlZmluZSBWS19LSFJfU1BJUlZfMV80X0VYVEVOU0lPTl9OQU1FICAgIlZLX0tIUl9zcGlydl8xXzQiCisKKworI2RlZmluZSBWS19LSFJfc3VyZmFjZV9wcm90ZWN0ZWRfY2FwYWJpbGl0aWVzIDEKKyNkZWZpbmUgVktfS0hSX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfc3VyZmFjZV9wcm90ZWN0ZWRfY2FwYWJpbGl0aWVzIgordHlwZWRlZiBzdHJ1Y3QgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBzdXBwb3J0c1Byb3RlY3RlZDsKK30gVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSOworCisKKworI2RlZmluZSBWS19LSFJfc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzIDEKKyNkZWZpbmUgVktfS0hSX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfU0VQQVJBVEVfREVQVEhfU1RFTkNJTF9MQVlPVVRTX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBzZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHM7Cit9IFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgc3RlbmNpbExheW91dDsKK30gVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrSW1hZ2VMYXlvdXQgICAgICBzdGVuY2lsSW5pdGlhbExheW91dDsKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgc3RlbmNpbEZpbmFsTGF5b3V0OworfSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFI7CisKKworCisjZGVmaW5lIFZLX0tIUl91bmlmb3JtX2J1ZmZlcl9zdGFuZGFyZF9sYXlvdXQgMQorI2RlZmluZSBWS19LSFJfVU5JRk9STV9CVUZGRVJfU1RBTkRBUkRfTEFZT1VUX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRVhURU5TSU9OX05BTUUgIlZLX0tIUl91bmlmb3JtX2J1ZmZlcl9zdGFuZGFyZF9sYXlvdXQiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dDsKK30gVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSOworCisKKworI2RlZmluZSBWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzIDEKK3R5cGVkZWYgdWludDY0X3QgVmtEZXZpY2VBZGRyZXNzOworI2RlZmluZSBWS19LSFJfQlVGRkVSX0RFVklDRV9BRERSRVNTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9CVUZGRVJfREVWSUNFX0FERFJFU1NfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBidWZmZXJEZXZpY2VBZGRyZXNzOworICAgIFZrQm9vbDMyICAgICAgICAgICBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlOworfSBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrQnVmZmVyICAgICAgICAgICBidWZmZXI7Cit9IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIHVpbnQ2NF90ICAgICAgICAgICBvcGFxdWVDYXB0dXJlQWRkcmVzczsKK30gVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDY0X3QgICAgICAgICAgIG9wYXF1ZUNhcHR1cmVBZGRyZXNzOworfSBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa0RldmljZU1lbW9yeSAgICAgbWVtb3J5OworfSBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUjsKKwordHlwZWRlZiBWa0RldmljZUFkZHJlc3MgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbyk7Cit0eXBlZGVmIHVpbnQ2NF90IChWS0FQSV9QVFIgKlBGTl92a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIHBJbmZvKTsKK3R5cGVkZWYgdWludDY0X3QgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrRGV2aWNlQWRkcmVzcyBWS0FQSV9DQUxMIHZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKTsKKworVktBUElfQVRUUiB1aW50NjRfdCBWS0FQSV9DQUxMIHZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbyk7CisKK1ZLQVBJX0FUVFIgdWludDY0X3QgVktBUElfQ0FMTCB2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMgMQorI2RlZmluZSBWS19LSFJfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMiCisKK3R5cGVkZWYgZW51bSBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0Zvcm1hdEtIUiB7CisgICAgVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX0JPT0wzMl9LSFIgPSAwLAorICAgIFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9JTlQ2NF9LSFIgPSAxLAorICAgIFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9VSU5UNjRfS0hSID0gMiwKKyAgICBWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfRkxPQVQ2NF9LSFIgPSAzLAorICAgIFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9CRUdJTl9SQU5HRV9LSFIgPSBWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfQk9PTDMyX0tIUiwKKyAgICBWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfRU5EX1JBTkdFX0tIUiA9IFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9GTE9BVDY0X0tIUiwKKyAgICBWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfUkFOR0VfU0laRV9LSFIgPSAoVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX0ZMT0FUNjRfS0hSIC0gVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX0JPT0wzMl9LSFIgKyAxKSwKKyAgICBWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfTUFYX0VOVU1fS0hSID0gMHg3RkZGRkZGRgorfSBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0Zvcm1hdEtIUjsKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHBpcGVsaW5lRXhlY3V0YWJsZUluZm87Cit9IFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmUgICAgICAgICBwaXBlbGluZTsKK30gVmtQaXBlbGluZUluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgc3RhZ2VzOworICAgIGNoYXIgICAgICAgICAgICAgICAgICBuYW1lW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25bVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBzdWJncm91cFNpemU7Cit9IFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmUgICAgICAgICBwaXBlbGluZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgZXhlY3V0YWJsZUluZGV4OworfSBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFI7CisKK3R5cGVkZWYgdW5pb24gVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNWYWx1ZUtIUiB7CisgICAgVmtCb29sMzIgICAgYjMyOworICAgIGludDY0X3QgICAgIGk2NDsKKyAgICB1aW50NjRfdCAgICB1NjQ7CisgICAgZG91YmxlICAgICAgZjY0OworfSBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVtWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25bVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljRm9ybWF0S0hSICAgIGZvcm1hdDsKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSICAgICB2YWx1ZTsKK30gVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBjaGFyICAgICAgICAgICAgICAgbmFtZVtWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgY2hhciAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgaXNUZXh0OworICAgIHNpemVfdCAgICAgICAgICAgICBkYXRhU2l6ZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcERhdGE7Cit9IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKShWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICBwUGlwZWxpbmVJbmZvLCB1aW50MzJfdCogcEV4ZWN1dGFibGVDb3VudCwgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIpKFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICBwRXhlY3V0YWJsZUluZm8sIHVpbnQzMl90KiBwU3RhdGlzdGljQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiBwU3RhdGlzdGljcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKShWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgcEV4ZWN1dGFibGVJbmZvLCB1aW50MzJfdCogcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4ZWN1dGFibGVDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogICAgICAgICAgIHBTdGF0aXN0aWNzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfRVhUX2RlYnVnX3JlcG9ydCAxCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKQorI2RlZmluZSBWS19FWFRfREVCVUdfUkVQT1JUX1NQRUNfVkVSU0lPTiAgOQorI2RlZmluZSBWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfZGVidWdfcmVwb3J0IgorCit0eXBlZGVmIGVudW0gVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgeworICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCA9IDAsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lOU1RBTkNFX0VYVCA9IDEsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQgPSAyLAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUID0gMywKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFVUVfRVhUID0gNCwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCA9IDUsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCA9IDYsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVCA9IDcsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhUID0gOCwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCA9IDksCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCA9IDEwLAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQgPSAxMSwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQgPSAxMiwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVdfRVhUID0gMTMsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhUID0gMTQsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhUID0gMTUsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFX0VYVCA9IDE2LAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhUID0gMTcsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCA9IDE4LAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQgPSAxOSwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0VYVCA9IDIwLAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVCA9IDIxLAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhUID0gMjIsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCA9IDIzLAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQgPSAyNCwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MX0VYVCA9IDI1LAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQgPSAyNiwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUl9FWFQgPSAyNywKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0VYVF9FWFQgPSAyOCwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9LSFJfRVhUID0gMjksCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFJfRVhUID0gMzAsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlhfRVhUID0gMzEsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlhfRVhUID0gMzIsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUX0VYVCA9IDMzLAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhUID0gMTAwMDE1NjAwMCwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhUID0gMTAwMDA4NTAwMCwKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVl9FWFQgPSAxMDAwMTY1MDAwLAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfRVhUID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhULAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVCA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVF9FWFQsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0tIUl9FWFQgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhULAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fS0hSX0VYVCA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhULAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CRUdJTl9SQU5HRV9FWFQgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VORF9SQU5HRV9FWFQgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFRfRVhULAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SQU5HRV9TSVpFX0VYVCA9IChWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFRfRVhUIC0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUICsgMSksCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX01BWF9FTlVNX0VYVCA9IDB4N0ZGRkZGRkYKK30gVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ7CisKK3R5cGVkZWYgZW51bSBWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQgeworICAgIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUID0gMHgwMDAwMDAwMSwKKyAgICBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUID0gMHgwMDAwMDAwMiwKKyAgICBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhUID0gMHgwMDAwMDAwNCwKKyAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCA9IDB4MDAwMDAwMDgsCisgICAgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQgPSAweDAwMDAwMDEwLAorICAgIFZLX0RFQlVHX1JFUE9SVF9GTEFHX0JJVFNfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQ7Cit0eXBlZGVmIFZrRmxhZ3MgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUOwordHlwZWRlZiBWa0Jvb2wzMiAoVktBUElfUFRSICpQRk5fdmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSgKKyAgICBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvZGUsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJQcmVmaXgsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVzc2FnZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgICAgICAgICAgIGZsYWdzOworICAgIFBGTl92a0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgICAgcGZuQ2FsbGJhY2s7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGE7Cit9IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQ7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCkoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiBwQ2FsbGJhY2spOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKShWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVidWdSZXBvcnRNZXNzYWdlRVhUKShWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdFR5cGUsIHVpbnQ2NF90IG9iamVjdCwgc2l6ZV90IGxvY2F0aW9uLCBpbnQzMl90IG1lc3NhZ2VDb2RlLCBjb25zdCBjaGFyKiBwTGF5ZXJQcmVmaXgsIGNvbnN0IGNoYXIqIHBNZXNzYWdlKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2spOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRGbGFnc0VYVCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29kZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllclByZWZpeCwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXNzYWdlKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfTlZfZ2xzbF9zaGFkZXIgMQorI2RlZmluZSBWS19OVl9HTFNMX1NIQURFUl9TUEVDX1ZFUlNJT04gICAgMQorI2RlZmluZSBWS19OVl9HTFNMX1NIQURFUl9FWFRFTlNJT05fTkFNRSAgIlZLX05WX2dsc2xfc2hhZGVyIgorCisKKyNkZWZpbmUgVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCAxCisjZGVmaW5lIFZLX0VYVF9ERVBUSF9SQU5HRV9VTlJFU1RSSUNURURfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX0RFUFRIX1JBTkdFX1VOUkVTVFJJQ1RFRF9FWFRFTlNJT05fTkFNRSAiVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCIKKworCisjZGVmaW5lIFZLX0lNR19maWx0ZXJfY3ViaWMgMQorI2RlZmluZSBWS19JTUdfRklMVEVSX0NVQklDX1NQRUNfVkVSU0lPTiAgMQorI2RlZmluZSBWS19JTUdfRklMVEVSX0NVQklDX0VYVEVOU0lPTl9OQU1FICJWS19JTUdfZmlsdGVyX2N1YmljIgorCisKKyNkZWZpbmUgVktfQU1EX3Jhc3Rlcml6YXRpb25fb3JkZXIgMQorI2RlZmluZSBWS19BTURfUkFTVEVSSVpBVElPTl9PUkRFUl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19BTURfUkFTVEVSSVpBVElPTl9PUkRFUl9FWFRFTlNJT05fTkFNRSAiVktfQU1EX3Jhc3Rlcml6YXRpb25fb3JkZXIiCisKK3R5cGVkZWYgZW51bSBWa1Jhc3Rlcml6YXRpb25PcmRlckFNRCB7CisgICAgVktfUkFTVEVSSVpBVElPTl9PUkRFUl9TVFJJQ1RfQU1EID0gMCwKKyAgICBWS19SQVNURVJJWkFUSU9OX09SREVSX1JFTEFYRURfQU1EID0gMSwKKyAgICBWS19SQVNURVJJWkFUSU9OX09SREVSX0JFR0lOX1JBTkdFX0FNRCA9IFZLX1JBU1RFUklaQVRJT05fT1JERVJfU1RSSUNUX0FNRCwKKyAgICBWS19SQVNURVJJWkFUSU9OX09SREVSX0VORF9SQU5HRV9BTUQgPSBWS19SQVNURVJJWkFUSU9OX09SREVSX1JFTEFYRURfQU1ELAorICAgIFZLX1JBU1RFUklaQVRJT05fT1JERVJfUkFOR0VfU0laRV9BTUQgPSAoVktfUkFTVEVSSVpBVElPTl9PUkRFUl9SRUxBWEVEX0FNRCAtIFZLX1JBU1RFUklaQVRJT05fT1JERVJfU1RSSUNUX0FNRCArIDEpLAorICAgIFZLX1JBU1RFUklaQVRJT05fT1JERVJfTUFYX0VOVU1fQU1EID0gMHg3RkZGRkZGRgorfSBWa1Jhc3Rlcml6YXRpb25PcmRlckFNRDsKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUmFzdGVyaXphdGlvbk9yZGVyQU1EICAgIHJhc3Rlcml6YXRpb25PcmRlcjsKK30gVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRDsKKworCisKKyNkZWZpbmUgVktfQU1EX3NoYWRlcl90cmluYXJ5X21pbm1heCAxCisjZGVmaW5lIFZLX0FNRF9TSEFERVJfVFJJTkFSWV9NSU5NQVhfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfQU1EX1NIQURFUl9UUklOQVJZX01JTk1BWF9FWFRFTlNJT05fTkFNRSAiVktfQU1EX3NoYWRlcl90cmluYXJ5X21pbm1heCIKKworCisjZGVmaW5lIFZLX0FNRF9zaGFkZXJfZXhwbGljaXRfdmVydGV4X3BhcmFtZXRlciAxCisjZGVmaW5lIFZLX0FNRF9TSEFERVJfRVhQTElDSVRfVkVSVEVYX1BBUkFNRVRFUl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19BTURfU0hBREVSX0VYUExJQ0lUX1ZFUlRFWF9QQVJBTUVURVJfRVhURU5TSU9OX05BTUUgIlZLX0FNRF9zaGFkZXJfZXhwbGljaXRfdmVydGV4X3BhcmFtZXRlciIKKworCisjZGVmaW5lIFZLX0VYVF9kZWJ1Z19tYXJrZXIgMQorI2RlZmluZSBWS19FWFRfREVCVUdfTUFSS0VSX1NQRUNfVkVSU0lPTiAgNAorI2RlZmluZSBWS19FWFRfREVCVUdfTUFSS0VSX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfZGVidWdfbWFya2VyIgordHlwZWRlZiBzdHJ1Y3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCAgICBvYmplY3RUeXBlOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICBwT2JqZWN0TmFtZTsKK30gVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgICAgb2JqZWN0VHlwZTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgdGFnTmFtZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICB0YWdTaXplOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgIHBUYWc7Cit9IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgcE1hcmtlck5hbWU7CisgICAgZmxvYXQgICAgICAgICAgICAgIGNvbG9yWzRdOworfSBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVDsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogcFRhZ0luZm8pOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiBwTmFtZUluZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZERlYnVnTWFya2VyQmVnaW5FWFQpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZERlYnVnTWFya2VyRW5kRVhUKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8pOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgcFRhZ0luZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiAgICAgICBwTmFtZUluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERlYnVnTWFya2VyRW5kRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pOworI2VuZGlmCisKKworI2RlZmluZSBWS19BTURfZ2NuX3NoYWRlciAxCisjZGVmaW5lIFZLX0FNRF9HQ05fU0hBREVSX1NQRUNfVkVSU0lPTiAgICAxCisjZGVmaW5lIFZLX0FNRF9HQ05fU0hBREVSX0VYVEVOU0lPTl9OQU1FICAiVktfQU1EX2djbl9zaGFkZXIiCisKKworI2RlZmluZSBWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiAxCisjZGVmaW5lIFZLX05WX0RFRElDQVRFRF9BTExPQ0FUSU9OX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX05WX0RFRElDQVRFRF9BTExPQ0FUSU9OX0VYVEVOU0lPTl9OQU1FICJWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiIKK3R5cGVkZWYgc3RydWN0IFZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uOworfSBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uOworfSBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY7CisKK3R5cGVkZWYgc3RydWN0IFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrSW1hZ2UgICAgICAgICAgICBpbWFnZTsKKyAgICBWa0J1ZmZlciAgICAgICAgICAgYnVmZmVyOworfSBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjsKKworCisKKyNkZWZpbmUgVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjayAxCisjZGVmaW5lIFZLX0VYVF9UUkFOU0ZPUk1fRkVFREJBQ0tfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX1RSQU5TRk9STV9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSAiVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjayIKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlRmxhZ3NFWFQ7Cit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgdHJhbnNmb3JtRmVlZGJhY2s7CisgICAgVmtCb29sMzIgICAgICAgICAgIGdlb21ldHJ5U3RyZWFtczsKK30gVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlclNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRGF0YVNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgdHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzOworICAgIFZrQm9vbDMyICAgICAgICAgICB0cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgdHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0OworICAgIFZrQm9vbDMyICAgICAgICAgICB0cmFuc2Zvcm1GZWVkYmFja0RyYXc7Cit9IFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVGbGFnc0VYVCAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyaXphdGlvblN0cmVhbTsKK30gVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ7CisKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwT2Zmc2V0cywgY29uc3QgVmtEZXZpY2VTaXplKiBwU2l6ZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RDb3VudGVyQnVmZmVyLCB1aW50MzJfdCBjb3VudGVyQnVmZmVyQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQ291bnRlckJ1ZmZlcnMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksIFZrUXVlcnlDb250cm9sRmxhZ3MgZmxhZ3MsIHVpbnQzMl90IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCB1aW50MzJfdCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSwgVmtCdWZmZXIgY291bnRlckJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50ZXJCdWZmZXJPZmZzZXQsIHVpbnQzMl90IGNvdW50ZXJPZmZzZXQsIHVpbnQzMl90IHZlcnRleFN0cmlkZSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwU2l6ZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleFN0cmlkZSk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX05WWF9pbWFnZV92aWV3X2hhbmRsZSAxCisjZGVmaW5lIFZLX05WWF9JTUFHRV9WSUVXX0hBTkRMRV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19OVlhfSU1BR0VfVklFV19IQU5ETEVfRVhURU5TSU9OX05BTUUgIlZLX05WWF9pbWFnZV92aWV3X2hhbmRsZSIKK3R5cGVkZWYgc3RydWN0IFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgIHBOZXh0OworICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgaW1hZ2VWaWV3OworICAgIFZrRGVzY3JpcHRvclR5cGUgICAgZGVzY3JpcHRvclR5cGU7CisgICAgVmtTYW1wbGVyICAgICAgICAgICBzYW1wbGVyOworfSBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlg7CisKK3R5cGVkZWYgdWludDMyX3QgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCogcEluZm8pOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgdWludDMyX3QgVktBUElfQ0FMTCB2a0dldEltYWdlVmlld0hhbmRsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqICAgICAgICAgICAgIHBJbmZvKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfQU1EX2RyYXdfaW5kaXJlY3RfY291bnQgMQorI2RlZmluZSBWS19BTURfRFJBV19JTkRJUkVDVF9DT1VOVF9TUEVDX1ZFUlNJT04gMgorI2RlZmluZSBWS19BTURfRFJBV19JTkRJUkVDVF9DT1VOVF9FWFRFTlNJT05fTkFNRSAiVktfQU1EX2RyYXdfaW5kaXJlY3RfY291bnQiCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXdJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfQU1EX25lZ2F0aXZlX3ZpZXdwb3J0X2hlaWdodCAxCisjZGVmaW5lIFZLX0FNRF9ORUdBVElWRV9WSUVXUE9SVF9IRUlHSFRfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfQU1EX05FR0FUSVZFX1ZJRVdQT1JUX0hFSUdIVF9FWFRFTlNJT05fTkFNRSAiVktfQU1EX25lZ2F0aXZlX3ZpZXdwb3J0X2hlaWdodCIKKworCisjZGVmaW5lIFZLX0FNRF9ncHVfc2hhZGVyX2hhbGZfZmxvYXQgMQorI2RlZmluZSBWS19BTURfR1BVX1NIQURFUl9IQUxGX0ZMT0FUX1NQRUNfVkVSU0lPTiAyCisjZGVmaW5lIFZLX0FNRF9HUFVfU0hBREVSX0hBTEZfRkxPQVRfRVhURU5TSU9OX05BTUUgIlZLX0FNRF9ncHVfc2hhZGVyX2hhbGZfZmxvYXQiCisKKworI2RlZmluZSBWS19BTURfc2hhZGVyX2JhbGxvdCAxCisjZGVmaW5lIFZLX0FNRF9TSEFERVJfQkFMTE9UX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0FNRF9TSEFERVJfQkFMTE9UX0VYVEVOU0lPTl9OQU1FICJWS19BTURfc2hhZGVyX2JhbGxvdCIKKworCisjZGVmaW5lIFZLX0FNRF90ZXh0dXJlX2dhdGhlcl9iaWFzX2xvZCAxCisjZGVmaW5lIFZLX0FNRF9URVhUVVJFX0dBVEhFUl9CSUFTX0xPRF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19BTURfVEVYVFVSRV9HQVRIRVJfQklBU19MT0RfRVhURU5TSU9OX05BTUUgIlZLX0FNRF90ZXh0dXJlX2dhdGhlcl9iaWFzX2xvZCIKK3R5cGVkZWYgc3RydWN0IFZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHN1cHBvcnRzVGV4dHVyZUdhdGhlckxPREJpYXNBTUQ7Cit9IFZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQ7CisKKworCisjZGVmaW5lIFZLX0FNRF9zaGFkZXJfaW5mbyAxCisjZGVmaW5lIFZLX0FNRF9TSEFERVJfSU5GT19TUEVDX1ZFUlNJT04gICAxCisjZGVmaW5lIFZLX0FNRF9TSEFERVJfSU5GT19FWFRFTlNJT05fTkFNRSAiVktfQU1EX3NoYWRlcl9pbmZvIgorCit0eXBlZGVmIGVudW0gVmtTaGFkZXJJbmZvVHlwZUFNRCB7CisgICAgVktfU0hBREVSX0lORk9fVFlQRV9TVEFUSVNUSUNTX0FNRCA9IDAsCisgICAgVktfU0hBREVSX0lORk9fVFlQRV9CSU5BUllfQU1EID0gMSwKKyAgICBWS19TSEFERVJfSU5GT19UWVBFX0RJU0FTU0VNQkxZX0FNRCA9IDIsCisgICAgVktfU0hBREVSX0lORk9fVFlQRV9CRUdJTl9SQU5HRV9BTUQgPSBWS19TSEFERVJfSU5GT19UWVBFX1NUQVRJU1RJQ1NfQU1ELAorICAgIFZLX1NIQURFUl9JTkZPX1RZUEVfRU5EX1JBTkdFX0FNRCA9IFZLX1NIQURFUl9JTkZPX1RZUEVfRElTQVNTRU1CTFlfQU1ELAorICAgIFZLX1NIQURFUl9JTkZPX1RZUEVfUkFOR0VfU0laRV9BTUQgPSAoVktfU0hBREVSX0lORk9fVFlQRV9ESVNBU1NFTUJMWV9BTUQgLSBWS19TSEFERVJfSU5GT19UWVBFX1NUQVRJU1RJQ1NfQU1EICsgMSksCisgICAgVktfU0hBREVSX0lORk9fVFlQRV9NQVhfRU5VTV9BTUQgPSAweDdGRkZGRkZGCit9IFZrU2hhZGVySW5mb1R5cGVBTUQ7Cit0eXBlZGVmIHN0cnVjdCBWa1NoYWRlclJlc291cmNlVXNhZ2VBTUQgeworICAgIHVpbnQzMl90ICAgIG51bVVzZWRWZ3ByczsKKyAgICB1aW50MzJfdCAgICBudW1Vc2VkU2dwcnM7CisgICAgdWludDMyX3QgICAgbGRzU2l6ZVBlckxvY2FsV29ya0dyb3VwOworICAgIHNpemVfdCAgICAgIGxkc1VzYWdlU2l6ZUluQnl0ZXM7CisgICAgc2l6ZV90ICAgICAgc2NyYXRjaE1lbVVzYWdlSW5CeXRlczsKK30gVmtTaGFkZXJSZXNvdXJjZVVzYWdlQU1EOworCit0eXBlZGVmIHN0cnVjdCBWa1NoYWRlclN0YXRpc3RpY3NJbmZvQU1EIHsKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgc2hhZGVyU3RhZ2VNYXNrOworICAgIFZrU2hhZGVyUmVzb3VyY2VVc2FnZUFNRCAgICByZXNvdXJjZVVzYWdlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBudW1QaHlzaWNhbFZncHJzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBudW1QaHlzaWNhbFNncHJzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBudW1BdmFpbGFibGVWZ3ByczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbnVtQXZhaWxhYmxlU2dwcnM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVXb3JrR3JvdXBTaXplWzNdOworfSBWa1NoYWRlclN0YXRpc3RpY3NJbmZvQU1EOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFNoYWRlckluZm9BTUQpKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHNoYWRlclN0YWdlLCBWa1NoYWRlckluZm9UeXBlQU1EIGluZm9UeXBlLCBzaXplX3QqIHBJbmZvU2l6ZSwgdm9pZCogcEluZm8pOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFNoYWRlckluZm9BTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0YWdlLAorICAgIFZrU2hhZGVySW5mb1R5cGVBTUQgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mb1NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mbyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0FNRF9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9sb2QgMQorI2RlZmluZSBWS19BTURfU0hBREVSX0lNQUdFX0xPQURfU1RPUkVfTE9EX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0FNRF9TSEFERVJfSU1BR0VfTE9BRF9TVE9SRV9MT0RfRVhURU5TSU9OX05BTUUgIlZLX0FNRF9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9sb2QiCisKKworI2RlZmluZSBWS19OVl9jb3JuZXJfc2FtcGxlZF9pbWFnZSAxCisjZGVmaW5lIFZLX05WX0NPUk5FUl9TQU1QTEVEX0lNQUdFX1NQRUNfVkVSU0lPTiAyCisjZGVmaW5lIFZLX05WX0NPUk5FUl9TQU1QTEVEX0lNQUdFX0VYVEVOU0lPTl9OQU1FICJWS19OVl9jb3JuZXJfc2FtcGxlZF9pbWFnZSIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBjb3JuZXJTYW1wbGVkSW1hZ2U7Cit9IFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WOworCisKKworI2RlZmluZSBWS19JTUdfZm9ybWF0X3B2cnRjIDEKKyNkZWZpbmUgVktfSU1HX0ZPUk1BVF9QVlJUQ19TUEVDX1ZFUlNJT04gIDEKKyNkZWZpbmUgVktfSU1HX0ZPUk1BVF9QVlJUQ19FWFRFTlNJT05fTkFNRSAiVktfSU1HX2Zvcm1hdF9wdnJ0YyIKKworCisjZGVmaW5lIFZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgMQorI2RlZmluZSBWS19OVl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX05WX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUgIlZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMiCisKK3R5cGVkZWYgZW51bSBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYgeworICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUX05WID0gMHgwMDAwMDAwMSwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfTlYgPSAweDAwMDAwMDAyLAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9JTUFHRV9CSVRfTlYgPSAweDAwMDAwMDA0LAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9JTUFHRV9LTVRfQklUX05WID0gMHgwMDAwMDAwOCwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRkxBR19CSVRTX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlY7Cit0eXBlZGVmIFZrRmxhZ3MgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WOworCit0eXBlZGVmIGVudW0gVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WIHsKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVRfTlYgPSAweDAwMDAwMDAxLAorICAgIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX05WID0gMHgwMDAwMDAwMiwKKyAgICBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVF9OViA9IDB4MDAwMDAwMDQsCisgICAgVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRkxBR19CSVRTX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlY7Cit0eXBlZGVmIFZrRmxhZ3MgVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnc05WOwordHlwZWRlZiBzdHJ1Y3QgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIHsKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyAgICAgICAgICAgICAgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NOViAgICAgICBleHRlcm5hbE1lbW9yeUZlYXR1cmVzOworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlczsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgY29tcGF0aWJsZUhhbmRsZVR5cGVzOworfSBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlY7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VUeXBlIHR5cGUsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZSwgVmtJbWFnZUNyZWF0ZUZsYWdzIGZsYWdzLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgZXh0ZXJuYWxIYW5kbGVUeXBlLCBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGV4dGVybmFsSGFuZGxlVHlwZSwKKyAgICBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqICAgICAgICAgIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX05WX2V4dGVybmFsX21lbW9yeSAxCisjZGVmaW5lIFZLX05WX0VYVEVSTkFMX01FTU9SWV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19OVl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUgIlZLX05WX2V4dGVybmFsX21lbW9yeSIKK3R5cGVkZWYgc3RydWN0IFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgaGFuZGxlVHlwZXM7Cit9IFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgaGFuZGxlVHlwZXM7Cit9IFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlY7CisKKworCisjZGVmaW5lIFZLX0VYVF92YWxpZGF0aW9uX2ZsYWdzIDEKKyNkZWZpbmUgVktfRVhUX1ZBTElEQVRJT05fRkxBR1NfU1BFQ19WRVJTSU9OIDIKKyNkZWZpbmUgVktfRVhUX1ZBTElEQVRJT05fRkxBR1NfRVhURU5TSU9OX05BTUUgIlZLX0VYVF92YWxpZGF0aW9uX2ZsYWdzIgorCit0eXBlZGVmIGVudW0gVmtWYWxpZGF0aW9uQ2hlY2tFWFQgeworICAgIFZLX1ZBTElEQVRJT05fQ0hFQ0tfQUxMX0VYVCA9IDAsCisgICAgVktfVkFMSURBVElPTl9DSEVDS19TSEFERVJTX0VYVCA9IDEsCisgICAgVktfVkFMSURBVElPTl9DSEVDS19CRUdJTl9SQU5HRV9FWFQgPSBWS19WQUxJREFUSU9OX0NIRUNLX0FMTF9FWFQsCisgICAgVktfVkFMSURBVElPTl9DSEVDS19FTkRfUkFOR0VfRVhUID0gVktfVkFMSURBVElPTl9DSEVDS19TSEFERVJTX0VYVCwKKyAgICBWS19WQUxJREFUSU9OX0NIRUNLX1JBTkdFX1NJWkVfRVhUID0gKFZLX1ZBTElEQVRJT05fQ0hFQ0tfU0hBREVSU19FWFQgLSBWS19WQUxJREFUSU9OX0NIRUNLX0FMTF9FWFQgKyAxKSwKKyAgICBWS19WQUxJREFUSU9OX0NIRUNLX01BWF9FTlVNX0VYVCA9IDB4N0ZGRkZGRkYKK30gVmtWYWxpZGF0aW9uQ2hlY2tFWFQ7Cit0eXBlZGVmIHN0cnVjdCBWa1ZhbGlkYXRpb25GbGFnc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudDsKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DaGVja0VYVCogICAgcERpc2FibGVkVmFsaWRhdGlvbkNoZWNrczsKK30gVmtWYWxpZGF0aW9uRmxhZ3NFWFQ7CisKKworCisjZGVmaW5lIFZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfYmFsbG90IDEKKyNkZWZpbmUgVktfRVhUX1NIQURFUl9TVUJHUk9VUF9CQUxMT1RfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX1NIQURFUl9TVUJHUk9VUF9CQUxMT1RfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfYmFsbG90IgorCisKKyNkZWZpbmUgVktfRVhUX3NoYWRlcl9zdWJncm91cF92b3RlIDEKKyNkZWZpbmUgVktfRVhUX1NIQURFUl9TVUJHUk9VUF9WT1RFX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9TSEFERVJfU1VCR1JPVVBfVk9URV9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3NoYWRlcl9zdWJncm91cF92b3RlIgorCisKKyNkZWZpbmUgVktfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYXN0Y19oZHIgMQorI2RlZmluZSBWS19FWFRfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYXN0Y19oZHIiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUjsKK30gVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVDsKKworCisKKyNkZWZpbmUgVktfRVhUX2FzdGNfZGVjb2RlX21vZGUgMQorI2RlZmluZSBWS19FWFRfQVNUQ19ERUNPREVfTU9ERV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfQVNUQ19ERUNPREVfTU9ERV9FWFRFTlNJT05fTkFNRSAiVktfRVhUX2FzdGNfZGVjb2RlX21vZGUiCit0eXBlZGVmIHN0cnVjdCBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrRm9ybWF0ICAgICAgICAgICBkZWNvZGVNb2RlOworfSBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBkZWNvZGVNb2RlU2hhcmVkRXhwb25lbnQ7Cit9IFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ7CisKKworCisjZGVmaW5lIFZLX0VYVF9jb25kaXRpb25hbF9yZW5kZXJpbmcgMQorI2RlZmluZSBWS19FWFRfQ09ORElUSU9OQUxfUkVOREVSSU5HX1NQRUNfVkVSU0lPTiAyCisjZGVmaW5lIFZLX0VYVF9DT05ESVRJT05BTF9SRU5ERVJJTkdfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9jb25kaXRpb25hbF9yZW5kZXJpbmciCisKK3R5cGVkZWYgZW51bSBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQgeworICAgIFZLX0NPTkRJVElPTkFMX1JFTkRFUklOR19JTlZFUlRFRF9CSVRfRVhUID0gMHgwMDAwMDAwMSwKKyAgICBWS19DT05ESVRJT05BTF9SRU5ERVJJTkdfRkxBR19CSVRTX01BWF9FTlVNX0VYVCA9IDB4N0ZGRkZGRkYKK30gVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUOwordHlwZWRlZiBWa0ZsYWdzIFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnc0VYVDsKK3R5cGVkZWYgc3RydWN0IFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OworICAgIFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnc0VYVCAgICBmbGFnczsKK30gVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGNvbmRpdGlvbmFsUmVuZGVyaW5nOworICAgIFZrQm9vbDMyICAgICAgICAgICBpbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZzsKK30gVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBjb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZTsKK30gVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQ7CisKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcik7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiAgIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworI2VuZGlmCisKKworI2RlZmluZSBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyAxCitWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUoVmtPYmplY3RUYWJsZU5WWCkKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgpCisjZGVmaW5lIFZLX05WWF9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX1NQRUNfVkVSU0lPTiAzCisjZGVmaW5lIFZLX05WWF9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0VYVEVOU0lPTl9OQU1FICJWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyIKKwordHlwZWRlZiBlbnVtIFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCB7CisgICAgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9QSVBFTElORV9OVlggPSAwLAorICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfREVTQ1JJUFRPUl9TRVRfTlZYID0gMSwKKyAgICBWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0lOREVYX0JVRkZFUl9OVlggPSAyLAorICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfVkVSVEVYX0JVRkZFUl9OVlggPSAzLAorICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfUFVTSF9DT05TVEFOVF9OVlggPSA0LAorICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19JTkRFWEVEX05WWCA9IDUsCisgICAgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9EUkFXX05WWCA9IDYsCisgICAgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ESVNQQVRDSF9OVlggPSA3LAorICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfQkVHSU5fUkFOR0VfTlZYID0gVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9QSVBFTElORV9OVlgsCisgICAgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9FTkRfUkFOR0VfTlZYID0gVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ESVNQQVRDSF9OVlgsCisgICAgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9SQU5HRV9TSVpFX05WWCA9IChWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0RJU1BBVENIX05WWCAtIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfUElQRUxJTkVfTlZYICsgMSksCisgICAgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9NQVhfRU5VTV9OVlggPSAweDdGRkZGRkZGCit9IFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWDsKKwordHlwZWRlZiBlbnVtIFZrT2JqZWN0RW50cnlUeXBlTlZYIHsKKyAgICBWS19PQkpFQ1RfRU5UUllfVFlQRV9ERVNDUklQVE9SX1NFVF9OVlggPSAwLAorICAgIFZLX09CSkVDVF9FTlRSWV9UWVBFX1BJUEVMSU5FX05WWCA9IDEsCisgICAgVktfT0JKRUNUX0VOVFJZX1RZUEVfSU5ERVhfQlVGRkVSX05WWCA9IDIsCisgICAgVktfT0JKRUNUX0VOVFJZX1RZUEVfVkVSVEVYX0JVRkZFUl9OVlggPSAzLAorICAgIFZLX09CSkVDVF9FTlRSWV9UWVBFX1BVU0hfQ09OU1RBTlRfTlZYID0gNCwKKyAgICBWS19PQkpFQ1RfRU5UUllfVFlQRV9CRUdJTl9SQU5HRV9OVlggPSBWS19PQkpFQ1RfRU5UUllfVFlQRV9ERVNDUklQVE9SX1NFVF9OVlgsCisgICAgVktfT0JKRUNUX0VOVFJZX1RZUEVfRU5EX1JBTkdFX05WWCA9IFZLX09CSkVDVF9FTlRSWV9UWVBFX1BVU0hfQ09OU1RBTlRfTlZYLAorICAgIFZLX09CSkVDVF9FTlRSWV9UWVBFX1JBTkdFX1NJWkVfTlZYID0gKFZLX09CSkVDVF9FTlRSWV9UWVBFX1BVU0hfQ09OU1RBTlRfTlZYIC0gVktfT0JKRUNUX0VOVFJZX1RZUEVfREVTQ1JJUFRPUl9TRVRfTlZYICsgMSksCisgICAgVktfT0JKRUNUX0VOVFJZX1RZUEVfTUFYX0VOVU1fTlZYID0gMHg3RkZGRkZGRgorfSBWa09iamVjdEVudHJ5VHlwZU5WWDsKKwordHlwZWRlZiBlbnVtIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlggeworICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9VTk9SREVSRURfU0VRVUVOQ0VTX0JJVF9OVlggPSAweDAwMDAwMDAxLAorICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9TUEFSU0VfU0VRVUVOQ0VTX0JJVF9OVlggPSAweDAwMDAwMDAyLAorICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9FTVBUWV9FWEVDVVRJT05TX0JJVF9OVlggPSAweDAwMDAwMDA0LAorICAgIFZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9JTkRFWEVEX1NFUVVFTkNFU19CSVRfTlZYID0gMHgwMDAwMDAwOCwKKyAgICBWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfRkxBR19CSVRTX01BWF9FTlVNX05WWCA9IDB4N0ZGRkZGRkYKK30gVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWDsKK3R5cGVkZWYgVmtGbGFncyBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdzTlZYOworCit0eXBlZGVmIGVudW0gVmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlggeworICAgIFZLX09CSkVDVF9FTlRSWV9VU0FHRV9HUkFQSElDU19CSVRfTlZYID0gMHgwMDAwMDAwMSwKKyAgICBWS19PQkpFQ1RfRU5UUllfVVNBR0VfQ09NUFVURV9CSVRfTlZYID0gMHgwMDAwMDAwMiwKKyAgICBWS19PQkpFQ1RfRU5UUllfVVNBR0VfRkxBR19CSVRTX01BWF9FTlVNX05WWCA9IDB4N0ZGRkZGRkYKK30gVmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlg7Cit0eXBlZGVmIFZrRmxhZ3MgVmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlg7Cit0eXBlZGVmIHN0cnVjdCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0OworfSBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg7CisKK3R5cGVkZWYgc3RydWN0IFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50OworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhPYmplY3RFbnRyeUNvdW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWluU2VxdWVuY2VJbmRleEJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudDsKK30gVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlggeworICAgIFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCAgICB0b2tlblR5cGU7CisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OworfSBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlggeworICAgIFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCAgICB0b2tlblR5cGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdVbml0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3I7Cit9IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYOworCit0eXBlZGVmIHN0cnVjdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludDsKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdzTlZYICAgICAgZmxhZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuQ291bnQ7CisgICAgY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgqICAgIHBUb2tlbnM7Cit9IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlg7CisKK3R5cGVkZWYgc3RydWN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGU7CisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYICAgICAgICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50OworICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYKiAgICBwSW5kaXJlY3RDb21tYW5kc1Rva2VuczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2VxdWVuY2VzQ291bnQ7CisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENvbW1hbmRCdWZmZXI7CisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlc0NvdW50QnVmZmVyOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZXNDb3VudE9mZnNldDsKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VzSW5kZXhCdWZmZXI7CisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlc0luZGV4T2Zmc2V0OworfSBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlg7CisKK3R5cGVkZWYgc3RydWN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICBvYmplY3RUYWJsZTsKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggICAgaW5kaXJlY3RDb21tYW5kc0xheW91dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgbWF4U2VxdWVuY2VzQ291bnQ7Cit9IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYOworCit0eXBlZGVmIHN0cnVjdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQ7CisgICAgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqICAgICAgICAgIHBPYmplY3RFbnRyeVR5cGVzOworICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0RW50cnlDb3VudHM7CisgICAgY29uc3QgVmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgqICAgIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2FtcGxlZEltYWdlc1BlckRlc2NyaXB0b3I7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBpcGVsaW5lTGF5b3V0czsKK30gVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlg7CisKK3R5cGVkZWYgc3RydWN0IFZrT2JqZWN0VGFibGVFbnRyeU5WWCB7CisgICAgVmtPYmplY3RFbnRyeVR5cGVOVlggICAgICAgICAgdHlwZTsKKyAgICBWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCAgICBmbGFnczsKK30gVmtPYmplY3RUYWJsZUVudHJ5TlZYOworCit0eXBlZGVmIHN0cnVjdCBWa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCB7CisgICAgVmtPYmplY3RFbnRyeVR5cGVOVlggICAgICAgICAgdHlwZTsKKyAgICBWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCAgICBmbGFnczsKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICBwaXBlbGluZTsKK30gVmtPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlg7CisKK3R5cGVkZWYgc3RydWN0IFZrT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlggeworICAgIFZrT2JqZWN0RW50cnlUeXBlTlZYICAgICAgICAgIHR5cGU7CisgICAgVmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlggICAgZmxhZ3M7CisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQ7CisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldDsKK30gVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYIHsKKyAgICBWa09iamVjdEVudHJ5VHlwZU5WWCAgICAgICAgICB0eXBlOworICAgIFZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYICAgIGZsYWdzOworICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjsKK30gVmtPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYOworCit0eXBlZGVmIHN0cnVjdCBWa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWCB7CisgICAgVmtPYmplY3RFbnRyeVR5cGVOVlggICAgICAgICAgdHlwZTsKKyAgICBWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCAgICBmbGFnczsKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICBidWZmZXI7CisgICAgVmtJbmRleFR5cGUgICAgICAgICAgICAgICAgICAgaW5kZXhUeXBlOworfSBWa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYIHsKKyAgICBWa09iamVjdEVudHJ5VHlwZU5WWCAgICAgICAgICB0eXBlOworICAgIFZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYICAgIGZsYWdzOworICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgIHBpcGVsaW5lTGF5b3V0OworICAgIFZrU2hhZGVyU3RhZ2VGbGFncyAgICAgICAgICAgIHN0YWdlRmxhZ3M7Cit9IFZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWDsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFByb2Nlc3NDb21tYW5kc05WWCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogcFByb2Nlc3NDb21tYW5kc0luZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqIHBSZXNlcnZlU3BhY2VJbmZvKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0KTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCkoVmtEZXZpY2UgZGV2aWNlLCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaW5kaXJlY3RDb21tYW5kc0xheW91dCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlT2JqZWN0VGFibGVOVlgpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrT2JqZWN0VGFibGVOVlgqIHBPYmplY3RUYWJsZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveU9iamVjdFRhYmxlTlZYKShWa0RldmljZSBkZXZpY2UsIFZrT2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1JlZ2lzdGVyT2JqZWN0c05WWCkoVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgcHBPYmplY3RUYWJsZUVudHJpZXMsIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0SW5kaWNlcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1VucmVnaXN0ZXJPYmplY3RzTlZYKShWa0RldmljZSBkZXZpY2UsIFZrT2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIHVpbnQzMl90IG9iamVjdENvdW50LCBjb25zdCBWa09iamVjdEVudHJ5VHlwZU5WWCogcE9iamVjdEVudHJ5VHlwZXMsIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0SW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCogcEZlYXR1cmVzLCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiBwTGltaXRzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFByb2Nlc3NDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiAgICAgICAgICBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiAgcFJlc2VydmVTcGFjZUluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqICAgICAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggICAgICAgICAgICAgICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1JlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqICAgICAgIHBGZWF0dXJlcywKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiAgICAgICAgIHBMaW1pdHMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19OVl9jbGlwX3NwYWNlX3dfc2NhbGluZyAxCisjZGVmaW5lIFZLX05WX0NMSVBfU1BBQ0VfV19TQ0FMSU5HX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX05WX0NMSVBfU1BBQ0VfV19TQ0FMSU5HX0VYVEVOU0lPTl9OQU1FICJWS19OVl9jbGlwX3NwYWNlX3dfc2NhbGluZyIKK3R5cGVkZWYgc3RydWN0IFZrVmlld3BvcnRXU2NhbGluZ05WIHsKKyAgICBmbG9hdCAgICB4Y29lZmY7CisgICAgZmxvYXQgICAgeWNvZWZmOworfSBWa1ZpZXdwb3J0V1NjYWxpbmdOVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRXU2NhbGluZ0VuYWJsZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudDsKKyAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogICAgcFZpZXdwb3J0V1NjYWxpbmdzOworfSBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqIHBWaWV3cG9ydFdTY2FsaW5ncyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqICAgICAgICAgICAgICAgICBwVmlld3BvcnRXU2NhbGluZ3MpOworI2VuZGlmCisKKworI2RlZmluZSBWS19FWFRfZGlyZWN0X21vZGVfZGlzcGxheSAxCisjZGVmaW5lIFZLX0VYVF9ESVJFQ1RfTU9ERV9ESVNQTEFZX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9ESVJFQ1RfTU9ERV9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfZGlyZWN0X21vZGVfZGlzcGxheSIKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrUmVsZWFzZURpc3BsYXlFWFQpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5KTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZWxlYXNlRGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciAxCisjZGVmaW5lIFZLX0VYVF9ESVNQTEFZX1NVUkZBQ0VfQ09VTlRFUl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfRElTUExBWV9TVVJGQUNFX0NPVU5URVJfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciIKKwordHlwZWRlZiBlbnVtIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCB7CisgICAgVktfU1VSRkFDRV9DT1VOVEVSX1ZCTEFOS19FWFQgPSAweDAwMDAwMDAxLAorICAgIFZLX1NVUkZBQ0VfQ09VTlRFUl9GTEFHX0JJVFNfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQ7Cit0eXBlZGVmIFZrRmxhZ3MgVmtTdXJmYWNlQ291bnRlckZsYWdzRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbWluSW1hZ2VDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtYXhJbWFnZUNvdW50OworICAgIFZrRXh0ZW50MkQgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFeHRlbnQ7CisgICAgVmtFeHRlbnQyRCAgICAgICAgICAgICAgICAgICAgICAgbWluSW1hZ2VFeHRlbnQ7CisgICAgVmtFeHRlbnQyRCAgICAgICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VFeHRlbnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VBcnJheUxheWVyczsKKyAgICBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUiAgICAgICBzdXBwb3J0ZWRUcmFuc2Zvcm1zOworICAgIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSICAgIGN1cnJlbnRUcmFuc2Zvcm07CisgICAgVmtDb21wb3NpdGVBbHBoYUZsYWdzS0hSICAgICAgICAgc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGE7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgc3VwcG9ydGVkVXNhZ2VGbGFnczsKKyAgICBWa1N1cmZhY2VDb3VudGVyRmxhZ3NFWFQgICAgICAgICBzdXBwb3J0ZWRTdXJmYWNlQ291bnRlcnM7Cit9IFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCkoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19FWFRfZGlzcGxheV9jb250cm9sIDEKKyNkZWZpbmUgVktfRVhUX0RJU1BMQVlfQ09OVFJPTF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfRElTUExBWV9DT05UUk9MX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfZGlzcGxheV9jb250cm9sIgorCit0eXBlZGVmIGVudW0gVmtEaXNwbGF5UG93ZXJTdGF0ZUVYVCB7CisgICAgVktfRElTUExBWV9QT1dFUl9TVEFURV9PRkZfRVhUID0gMCwKKyAgICBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX1NVU1BFTkRfRVhUID0gMSwKKyAgICBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX09OX0VYVCA9IDIsCisgICAgVktfRElTUExBWV9QT1dFUl9TVEFURV9CRUdJTl9SQU5HRV9FWFQgPSBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX09GRl9FWFQsCisgICAgVktfRElTUExBWV9QT1dFUl9TVEFURV9FTkRfUkFOR0VfRVhUID0gVktfRElTUExBWV9QT1dFUl9TVEFURV9PTl9FWFQsCisgICAgVktfRElTUExBWV9QT1dFUl9TVEFURV9SQU5HRV9TSVpFX0VYVCA9IChWS19ESVNQTEFZX1BPV0VSX1NUQVRFX09OX0VYVCAtIFZLX0RJU1BMQVlfUE9XRVJfU1RBVEVfT0ZGX0VYVCArIDEpLAorICAgIFZLX0RJU1BMQVlfUE9XRVJfU1RBVEVfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa0Rpc3BsYXlQb3dlclN0YXRlRVhUOworCit0eXBlZGVmIGVudW0gVmtEZXZpY2VFdmVudFR5cGVFWFQgeworICAgIFZLX0RFVklDRV9FVkVOVF9UWVBFX0RJU1BMQVlfSE9UUExVR19FWFQgPSAwLAorICAgIFZLX0RFVklDRV9FVkVOVF9UWVBFX0JFR0lOX1JBTkdFX0VYVCA9IFZLX0RFVklDRV9FVkVOVF9UWVBFX0RJU1BMQVlfSE9UUExVR19FWFQsCisgICAgVktfREVWSUNFX0VWRU5UX1RZUEVfRU5EX1JBTkdFX0VYVCA9IFZLX0RFVklDRV9FVkVOVF9UWVBFX0RJU1BMQVlfSE9UUExVR19FWFQsCisgICAgVktfREVWSUNFX0VWRU5UX1RZUEVfUkFOR0VfU0laRV9FWFQgPSAoVktfREVWSUNFX0VWRU5UX1RZUEVfRElTUExBWV9IT1RQTFVHX0VYVCAtIFZLX0RFVklDRV9FVkVOVF9UWVBFX0RJU1BMQVlfSE9UUExVR19FWFQgKyAxKSwKKyAgICBWS19ERVZJQ0VfRVZFTlRfVFlQRV9NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrRGV2aWNlRXZlbnRUeXBlRVhUOworCit0eXBlZGVmIGVudW0gVmtEaXNwbGF5RXZlbnRUeXBlRVhUIHsKKyAgICBWS19ESVNQTEFZX0VWRU5UX1RZUEVfRklSU1RfUElYRUxfT1VUX0VYVCA9IDAsCisgICAgVktfRElTUExBWV9FVkVOVF9UWVBFX0JFR0lOX1JBTkdFX0VYVCA9IFZLX0RJU1BMQVlfRVZFTlRfVFlQRV9GSVJTVF9QSVhFTF9PVVRfRVhULAorICAgIFZLX0RJU1BMQVlfRVZFTlRfVFlQRV9FTkRfUkFOR0VfRVhUID0gVktfRElTUExBWV9FVkVOVF9UWVBFX0ZJUlNUX1BJWEVMX09VVF9FWFQsCisgICAgVktfRElTUExBWV9FVkVOVF9UWVBFX1JBTkdFX1NJWkVfRVhUID0gKFZLX0RJU1BMQVlfRVZFTlRfVFlQRV9GSVJTVF9QSVhFTF9PVVRfRVhUIC0gVktfRElTUExBWV9FVkVOVF9UWVBFX0ZJUlNUX1BJWEVMX09VVF9FWFQgKyAxKSwKKyAgICBWS19ESVNQTEFZX0VWRU5UX1RZUEVfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa0Rpc3BsYXlFdmVudFR5cGVFWFQ7Cit0eXBlZGVmIHN0cnVjdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Rpc3BsYXlQb3dlclN0YXRlRVhUICAgIHBvd2VyU3RhdGU7Cit9IFZrRGlzcGxheVBvd2VySW5mb0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZXZpY2VFdmVudEluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGV2aWNlRXZlbnRUeXBlRVhUICAgIGRldmljZUV2ZW50OworfSBWa0RldmljZUV2ZW50SW5mb0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGlzcGxheUV2ZW50VHlwZUVYVCAgICBkaXNwbGF5RXZlbnQ7Cit9IFZrRGlzcGxheUV2ZW50SW5mb0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1N1cmZhY2VDb3VudGVyRmxhZ3NFWFQgICAgc3VyZmFjZUNvdW50ZXJzOworfSBWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQpKFZrRGV2aWNlIGRldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogcERpc3BsYXlQb3dlckluZm8pOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtSZWdpc3RlckRldmljZUV2ZW50RVhUKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiBwRGV2aWNlRXZlbnRJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKShWa0RldmljZSBkZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqIHBEaXNwbGF5RXZlbnRJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQpKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgY291bnRlciwgdWludDY0X3QqIHBDb3VudGVyVmFsdWUpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlQb3dlckluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZWdpc3RlckRldmljZUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICAgcERldmljZUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCAgICAgICAgICAgICAgICAgY291bnRlciwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyVmFsdWUpOworI2VuZGlmCisKKworI2RlZmluZSBWS19HT09HTEVfZGlzcGxheV90aW1pbmcgMQorI2RlZmluZSBWS19HT09HTEVfRElTUExBWV9USU1JTkdfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfR09PR0xFX0RJU1BMQVlfVElNSU5HX0VYVEVOU0lPTl9OQU1FICJWS19HT09HTEVfZGlzcGxheV90aW1pbmciCit0eXBlZGVmIHN0cnVjdCBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIHsKKyAgICB1aW50NjRfdCAgICByZWZyZXNoRHVyYXRpb247Cit9IFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEU7CisKK3R5cGVkZWYgc3RydWN0IFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSB7CisgICAgdWludDMyX3QgICAgcHJlc2VudElEOworICAgIHVpbnQ2NF90ICAgIGRlc2lyZWRQcmVzZW50VGltZTsKKyAgICB1aW50NjRfdCAgICBhY3R1YWxQcmVzZW50VGltZTsKKyAgICB1aW50NjRfdCAgICBlYXJsaWVzdFByZXNlbnRUaW1lOworICAgIHVpbnQ2NF90ICAgIHByZXNlbnRNYXJnaW47Cit9IFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQcmVzZW50VGltZUdPT0dMRSB7CisgICAgdWludDMyX3QgICAgcHJlc2VudElEOworICAgIHVpbnQ2NF90ICAgIGRlc2lyZWRQcmVzZW50VGltZTsKK30gVmtQcmVzZW50VGltZUdPT0dMRTsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudDsKKyAgICBjb25zdCBWa1ByZXNlbnRUaW1lR09PR0xFKiAgICBwVGltZXM7Cit9IFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRTsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSkoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUqIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUpKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50MzJfdCogcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LCBWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUqIHBQcmVzZW50YXRpb25UaW1pbmdzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiAgICAgICAgICAgICAgIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsCisgICAgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5ncyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX05WX3NhbXBsZV9tYXNrX292ZXJyaWRlX2NvdmVyYWdlIDEKKyNkZWZpbmUgVktfTlZfU0FNUExFX01BU0tfT1ZFUlJJREVfQ09WRVJBR0VfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfTlZfU0FNUExFX01BU0tfT1ZFUlJJREVfQ09WRVJBR0VfRVhURU5TSU9OX05BTUUgIlZLX05WX3NhbXBsZV9tYXNrX292ZXJyaWRlX2NvdmVyYWdlIgorCisKKyNkZWZpbmUgVktfTlZfZ2VvbWV0cnlfc2hhZGVyX3Bhc3N0aHJvdWdoIDEKKyNkZWZpbmUgVktfTlZfR0VPTUVUUllfU0hBREVSX1BBU1NUSFJPVUdIX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX05WX0dFT01FVFJZX1NIQURFUl9QQVNTVEhST1VHSF9FWFRFTlNJT05fTkFNRSAiVktfTlZfZ2VvbWV0cnlfc2hhZGVyX3Bhc3N0aHJvdWdoIgorCisKKyNkZWZpbmUgVktfTlZfdmlld3BvcnRfYXJyYXkyIDEKKyNkZWZpbmUgVktfTlZfVklFV1BPUlRfQVJSQVkyX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX05WX1ZJRVdQT1JUX0FSUkFZMl9FWFRFTlNJT05fTkFNRSAiVktfTlZfdmlld3BvcnRfYXJyYXkyIgorCisKKyNkZWZpbmUgVktfTlZYX211bHRpdmlld19wZXJfdmlld19hdHRyaWJ1dGVzIDEKKyNkZWZpbmUgVktfTlZYX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX05WWF9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19FWFRFTlNJT05fTkFNRSAiVktfTlZYX211bHRpdmlld19wZXJfdmlld19hdHRyaWJ1dGVzIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50czsKK30gVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWDsKKworCisKKyNkZWZpbmUgVktfTlZfdmlld3BvcnRfc3dpenpsZSAxCisjZGVmaW5lIFZLX05WX1ZJRVdQT1JUX1NXSVpaTEVfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfTlZfVklFV1BPUlRfU1dJWlpMRV9FWFRFTlNJT05fTkFNRSAiVktfTlZfdmlld3BvcnRfc3dpenpsZSIKKwordHlwZWRlZiBlbnVtIFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WIHsKKyAgICBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfWF9OViA9IDAsCisgICAgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX05FR0FUSVZFX1hfTlYgPSAxLAorICAgIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9ZX05WID0gMiwKKyAgICBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfWV9OViA9IDMsCisgICAgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1pfTlYgPSA0LAorICAgIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9ORUdBVElWRV9aX05WID0gNSwKKyAgICBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfV19OViA9IDYsCisgICAgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX05FR0FUSVZFX1dfTlYgPSA3LAorICAgIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9CRUdJTl9SQU5HRV9OViA9IFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9YX05WLAorICAgIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9FTkRfUkFOR0VfTlYgPSBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfV19OViwKKyAgICBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUkFOR0VfU0laRV9OViA9IChWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfV19OViAtIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9YX05WICsgMSksCisgICAgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVjsKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVGbGFnc05WOwordHlwZWRlZiBzdHJ1Y3QgVmtWaWV3cG9ydFN3aXp6bGVOViB7CisgICAgVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgICAgeDsKKyAgICBWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViAgICB5OworICAgIFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WICAgIHo7CisgICAgVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgICAgdzsKK30gVmtWaWV3cG9ydFN3aXp6bGVOVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlRmxhZ3NOViAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQ7CisgICAgY29uc3QgVmtWaWV3cG9ydFN3aXp6bGVOViogICAgICAgICAgICAgICAgICAgICBwVmlld3BvcnRTd2l6emxlczsKK30gVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WOworCisKKworI2RlZmluZSBWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzIDEKKyNkZWZpbmUgVktfRVhUX0RJU0NBUkRfUkVDVEFOR0xFU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfRElTQ0FSRF9SRUNUQU5HTEVTX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzIgorCit0eXBlZGVmIGVudW0gVmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVCB7CisgICAgVktfRElTQ0FSRF9SRUNUQU5HTEVfTU9ERV9JTkNMVVNJVkVfRVhUID0gMCwKKyAgICBWS19ESVNDQVJEX1JFQ1RBTkdMRV9NT0RFX0VYQ0xVU0lWRV9FWFQgPSAxLAorICAgIFZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfQkVHSU5fUkFOR0VfRVhUID0gVktfRElTQ0FSRF9SRUNUQU5HTEVfTU9ERV9JTkNMVVNJVkVfRVhULAorICAgIFZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfRU5EX1JBTkdFX0VYVCA9IFZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfRVhDTFVTSVZFX0VYVCwKKyAgICBWS19ESVNDQVJEX1JFQ1RBTkdMRV9NT0RFX1JBTkdFX1NJWkVfRVhUID0gKFZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfRVhDTFVTSVZFX0VYVCAtIFZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfSU5DTFVTSVZFX0VYVCArIDEpLAorICAgIFZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa0Rpc2NhcmRSZWN0YW5nbGVNb2RlRVhUOwordHlwZWRlZiBWa0ZsYWdzIFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVGbGFnc0VYVDsKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4RGlzY2FyZFJlY3RhbmdsZXM7Cit9IFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUZsYWdzRVhUICAgIGZsYWdzOworICAgIFZrRGlzY2FyZFJlY3RhbmdsZU1vZGVFWFQgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkUmVjdGFuZ2xlTW9kZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50OworICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXM7Cit9IFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgdWludDMyX3QgZGlzY2FyZFJlY3RhbmdsZUNvdW50LCBjb25zdCBWa1JlY3QyRCogcERpc2NhcmRSZWN0YW5nbGVzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc2NhcmRSZWN0YW5nbGVzKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfRVhUX2NvbnNlcnZhdGl2ZV9yYXN0ZXJpemF0aW9uIDEKKyNkZWZpbmUgVktfRVhUX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9FWFRFTlNJT05fTkFNRSAiVktfRVhUX2NvbnNlcnZhdGl2ZV9yYXN0ZXJpemF0aW9uIgorCit0eXBlZGVmIGVudW0gVmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVCB7CisgICAgVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9ESVNBQkxFRF9FWFQgPSAwLAorICAgIFZLX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX01PREVfT1ZFUkVTVElNQVRFX0VYVCA9IDEsCisgICAgVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9VTkRFUkVTVElNQVRFX0VYVCA9IDIsCisgICAgVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9CRUdJTl9SQU5HRV9FWFQgPSBWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX0RJU0FCTEVEX0VYVCwKKyAgICBWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX0VORF9SQU5HRV9FWFQgPSBWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX1VOREVSRVNUSU1BVEVfRVhULAorICAgIFZLX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX01PREVfUkFOR0VfU0laRV9FWFQgPSAoVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9VTkRFUkVTVElNQVRFX0VYVCAtIFZLX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX01PREVfRElTQUJMRURfRVhUICsgMSksCisgICAgVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVFWFQ7Cit0eXBlZGVmIFZrRmxhZ3MgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUZsYWdzRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIGZsb2F0ICAgICAgICAgICAgICBwcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemU7CisgICAgZmxvYXQgICAgICAgICAgICAgIG1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplOworICAgIGZsb2F0ICAgICAgICAgICAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5OworICAgIFZrQm9vbDMyICAgICAgICAgICBwcmltaXRpdmVVbmRlcmVzdGltYXRpb247CisgICAgVmtCb29sMzIgICAgICAgICAgIGNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb247CisgICAgVmtCb29sMzIgICAgICAgICAgIGRlZ2VuZXJhdGVUcmlhbmdsZXNSYXN0ZXJpemVkOworICAgIFZrQm9vbDMyICAgICAgICAgICBkZWdlbmVyYXRlTGluZXNSYXN0ZXJpemVkOworICAgIFZrQm9vbDMyICAgICAgICAgICBmdWxseUNvdmVyZWRGcmFnbWVudFNoYWRlcklucHV0VmFyaWFibGU7CisgICAgVmtCb29sMzIgICAgICAgICAgIGNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qb3N0RGVwdGhDb3ZlcmFnZTsKK30gVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlRmxhZ3NFWFQgICAgZmxhZ3M7CisgICAgVmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKK30gVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQ7CisKKworCisjZGVmaW5lIFZLX0VYVF9kZXB0aF9jbGlwX2VuYWJsZSAxCisjZGVmaW5lIFZLX0VYVF9ERVBUSF9DTElQX0VOQUJMRV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfREVQVEhfQ0xJUF9FTkFCTEVfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9kZXB0aF9jbGlwX2VuYWJsZSIKK3R5cGVkZWYgVmtGbGFncyBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlRmxhZ3NFWFQ7Cit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGRlcHRoQ2xpcEVuYWJsZTsKK30gVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlRmxhZ3NFWFQgICAgZmxhZ3M7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQ2xpcEVuYWJsZTsKK30gVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQ7CisKKworCisjZGVmaW5lIFZLX0VYVF9zd2FwY2hhaW5fY29sb3JzcGFjZSAxCisjZGVmaW5lIFZLX0VYVF9TV0FQQ0hBSU5fQ09MT1JfU1BBQ0VfU1BFQ19WRVJTSU9OIDQKKyNkZWZpbmUgVktfRVhUX1NXQVBDSEFJTl9DT0xPUl9TUEFDRV9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3N3YXBjaGFpbl9jb2xvcnNwYWNlIgorCisKKyNkZWZpbmUgVktfRVhUX2hkcl9tZXRhZGF0YSAxCisjZGVmaW5lIFZLX0VYVF9IRFJfTUVUQURBVEFfU1BFQ19WRVJTSU9OICAyCisjZGVmaW5lIFZLX0VYVF9IRFJfTUVUQURBVEFfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9oZHJfbWV0YWRhdGEiCit0eXBlZGVmIHN0cnVjdCBWa1hZQ29sb3JFWFQgeworICAgIGZsb2F0ICAgIHg7CisgICAgZmxvYXQgICAgeTsKK30gVmtYWUNvbG9yRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa0hkck1ldGFkYXRhRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrWFlDb2xvckVYVCAgICAgICBkaXNwbGF5UHJpbWFyeVJlZDsKKyAgICBWa1hZQ29sb3JFWFQgICAgICAgZGlzcGxheVByaW1hcnlHcmVlbjsKKyAgICBWa1hZQ29sb3JFWFQgICAgICAgZGlzcGxheVByaW1hcnlCbHVlOworICAgIFZrWFlDb2xvckVYVCAgICAgICB3aGl0ZVBvaW50OworICAgIGZsb2F0ICAgICAgICAgICAgICBtYXhMdW1pbmFuY2U7CisgICAgZmxvYXQgICAgICAgICAgICAgIG1pbkx1bWluYW5jZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgbWF4Q29udGVudExpZ2h0TGV2ZWw7CisgICAgZmxvYXQgICAgICAgICAgICAgIG1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWw7Cit9IFZrSGRyTWV0YWRhdGFFWFQ7CisKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtTZXRIZHJNZXRhZGF0YUVYVCkoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwgY29uc3QgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zLCBjb25zdCBWa0hkck1ldGFkYXRhRVhUKiBwTWV0YWRhdGEpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrU2V0SGRyTWV0YWRhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zLAorICAgIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfRVhUX2V4dGVybmFsX21lbW9yeV9kbWFfYnVmIDEKKyNkZWZpbmUgVktfRVhUX0VYVEVSTkFMX01FTU9SWV9ETUFfQlVGX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9FWFRFUk5BTF9NRU1PUllfRE1BX0JVRl9FWFRFTlNJT05fTkFNRSAiVktfRVhUX2V4dGVybmFsX21lbW9yeV9kbWFfYnVmIgorCisKKyNkZWZpbmUgVktfRVhUX3F1ZXVlX2ZhbWlseV9mb3JlaWduIDEKKyNkZWZpbmUgVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3F1ZXVlX2ZhbWlseV9mb3JlaWduIgorI2RlZmluZSBWS19RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFQgICAgICAgKH4wVS0yKQorCisKKyNkZWZpbmUgVktfRVhUX2RlYnVnX3V0aWxzIDEKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQpCisjZGVmaW5lIFZLX0VYVF9ERUJVR19VVElMU19TUEVDX1ZFUlNJT04gICAxCisjZGVmaW5lIFZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSAiVktfRVhUX2RlYnVnX3V0aWxzIgordHlwZWRlZiBWa0ZsYWdzIFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUZsYWdzRVhUOwordHlwZWRlZiBWa0ZsYWdzIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUZsYWdzRVhUOworCit0eXBlZGVmIGVudW0gVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgeworICAgIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfVkVSQk9TRV9CSVRfRVhUID0gMHgwMDAwMDAwMSwKKyAgICBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0lORk9fQklUX0VYVCA9IDB4MDAwMDAwMTAsCisgICAgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9XQVJOSU5HX0JJVF9FWFQgPSAweDAwMDAwMTAwLAorICAgIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVCA9IDB4MDAwMDEwMDAsCisgICAgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9GTEFHX0JJVFNfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVDsKK3R5cGVkZWYgVmtGbGFncyBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVDsKKwordHlwZWRlZiBlbnVtIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQgeworICAgIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9HRU5FUkFMX0JJVF9FWFQgPSAweDAwMDAwMDAxLAorICAgIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9WQUxJREFUSU9OX0JJVF9FWFQgPSAweDAwMDAwMDAyLAorICAgIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9QRVJGT1JNQU5DRV9CSVRfRVhUID0gMHgwMDAwMDAwNCwKKyAgICBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfRkxBR19CSVRTX01BWF9FTlVNX0VYVCA9IDB4N0ZGRkZGRkYKK30gVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVDsKK3R5cGVkZWYgVmtGbGFncyBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtPYmplY3RUeXBlICAgICAgIG9iamVjdFR5cGU7CisgICAgdWludDY0X3QgICAgICAgICAgIG9iamVjdEhhbmRsZTsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgcE9iamVjdE5hbWU7Cit9IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrT2JqZWN0VHlwZSAgICAgICBvYmplY3RUeXBlOworICAgIHVpbnQ2NF90ICAgICAgICAgICBvYmplY3RIYW5kbGU7CisgICAgdWludDY0X3QgICAgICAgICAgIHRhZ05hbWU7CisgICAgc2l6ZV90ICAgICAgICAgICAgIHRhZ1NpemU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBUYWc7Cit9IFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrRGVidWdVdGlsc0xhYmVsRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIGNvbnN0IGNoYXIqICAgICAgICBwTGFiZWxOYW1lOworICAgIGZsb2F0ICAgICAgICAgICAgICBjb2xvcls0XTsKK30gVmtEZWJ1Z1V0aWxzTGFiZWxFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRmxhZ3NFWFQgICAgZmxhZ3M7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2VJZE5hbWU7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkTnVtYmVyOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXNzYWdlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTGFiZWxDb3VudDsKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgICBwUXVldWVMYWJlbHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kQnVmTGFiZWxDb3VudDsKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgICBwQ21kQnVmTGFiZWxzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50OworICAgIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKiAgICAgICAgIHBPYmplY3RzOworfSBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQ7CisKK3R5cGVkZWYgVmtCb29sMzIgKFZLQVBJX1BUUiAqUEZOX3ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRVhUKSgKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCAgICAgICAgICAgbWVzc2FnZVNldmVyaXR5LAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZXMsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKiAgICAgIHBDYWxsYmFja0RhdGEsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlRmxhZ3NFWFQgICAgIGZsYWdzOworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdzRVhUICAgICBtZXNzYWdlU2V2ZXJpdHk7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCAgICAgICAgIG1lc3NhZ2VUeXBlOworICAgIFBGTl92a0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0VYVCAgICBwZm5Vc2VyQ2FsbGJhY2s7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsKK30gVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVDsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogcE5hbWVJbmZvKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiBwVGFnSW5mbyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCkoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKShWa1F1ZXVlIHF1ZXVlKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCkoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCkoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKiBwTWVzc2VuZ2VyKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCkoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCkoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZVNldmVyaXR5LCBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlcywgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKiBwQ2FsbGJhY2tEYXRhKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogICAgICAgIHBOYW1lSW5mbyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogICAgICAgICBwVGFnSW5mbyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogICAgICAgICAgICAgICAgICAgcE1lc3Nlbmdlcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgICAgICBtZXNzYWdlU2V2ZXJpdHksCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCAgICAgICAgICAgICBtZXNzYWdlVHlwZXMsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKiBwQ2FsbGJhY2tEYXRhKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfRVhUX3NhbXBsZXJfZmlsdGVyX21pbm1heCAxCisjZGVmaW5lIFZLX0VYVF9TQU1QTEVSX0ZJTFRFUl9NSU5NQVhfU1BFQ19WRVJTSU9OIDIKKyNkZWZpbmUgVktfRVhUX1NBTVBMRVJfRklMVEVSX01JTk1BWF9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3NhbXBsZXJfZmlsdGVyX21pbm1heCIKKwordHlwZWRlZiBlbnVtIFZrU2FtcGxlclJlZHVjdGlvbk1vZGVFWFQgeworICAgIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfV0VJR0hURURfQVZFUkFHRV9FWFQgPSAwLAorICAgIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVCA9IDEsCisgICAgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUID0gMiwKKyAgICBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX0JFR0lOX1JBTkdFX0VYVCA9IFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfV0VJR0hURURfQVZFUkFHRV9FWFQsCisgICAgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9FTkRfUkFOR0VfRVhUID0gVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhULAorICAgIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfUkFOR0VfU0laRV9FWFQgPSAoVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUIC0gVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9XRUlHSFRFRF9BVkVSQUdFX0VYVCArIDEpLAorICAgIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUICAgIHJlZHVjdGlvbk1vZGU7Cit9IFZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGZpbHRlck1pbm1heFNpbmdsZUNvbXBvbmVudEZvcm1hdHM7CisgICAgVmtCb29sMzIgICAgICAgICAgIGZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZzsKK30gVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUOworCisKKworI2RlZmluZSBWS19BTURfZ3B1X3NoYWRlcl9pbnQxNiAxCisjZGVmaW5lIFZLX0FNRF9HUFVfU0hBREVSX0lOVDE2X1NQRUNfVkVSU0lPTiAyCisjZGVmaW5lIFZLX0FNRF9HUFVfU0hBREVSX0lOVDE2X0VYVEVOU0lPTl9OQU1FICJWS19BTURfZ3B1X3NoYWRlcl9pbnQxNiIKKworCisjZGVmaW5lIFZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMgMQorI2RlZmluZSBWS19BTURfTUlYRURfQVRUQUNITUVOVF9TQU1QTEVTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0FNRF9NSVhFRF9BVFRBQ0hNRU5UX1NBTVBMRVNfRVhURU5TSU9OX05BTUUgIlZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMiCisKKworI2RlZmluZSBWS19BTURfc2hhZGVyX2ZyYWdtZW50X21hc2sgMQorI2RlZmluZSBWS19BTURfU0hBREVSX0ZSQUdNRU5UX01BU0tfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfQU1EX1NIQURFUl9GUkFHTUVOVF9NQVNLX0VYVEVOU0lPTl9OQU1FICJWS19BTURfc2hhZGVyX2ZyYWdtZW50X21hc2siCisKKworI2RlZmluZSBWS19FWFRfaW5saW5lX3VuaWZvcm1fYmxvY2sgMQorI2RlZmluZSBWS19FWFRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfaW5saW5lX3VuaWZvcm1fYmxvY2siCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGlubGluZVVuaWZvcm1CbG9jazsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQ7Cit9IFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heElubGluZVVuaWZvcm1CbG9ja1NpemU7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3M7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3M7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzOworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrczsKK30gVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBkYXRhU2l6ZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcERhdGE7Cit9IFZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4SW5saW5lVW5pZm9ybUJsb2NrQmluZGluZ3M7Cit9IFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUOworCisKKworI2RlZmluZSBWS19FWFRfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0IDEKKyNkZWZpbmUgVktfRVhUX1NIQURFUl9TVEVOQ0lMX0VYUE9SVF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfU0hBREVSX1NURU5DSUxfRVhQT1JUX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0IgorCisKKyNkZWZpbmUgVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMgMQorI2RlZmluZSBWS19FWFRfU0FNUExFX0xPQ0FUSU9OU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfU0FNUExFX0xPQ0FUSU9OU19FWFRFTlNJT05fTkFNRSAiVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMiCit0eXBlZGVmIHN0cnVjdCBWa1NhbXBsZUxvY2F0aW9uRVhUIHsKKyAgICBmbG9hdCAgICB4OworICAgIGZsb2F0ICAgIHk7Cit9IFZrU2FtcGxlTG9jYXRpb25FWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWw7CisgICAgVmtFeHRlbnQyRCAgICAgICAgICAgICAgICAgICAgc2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uRVhUKiAgICBwU2FtcGxlTG9jYXRpb25zOworfSBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCB7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRJbmRleDsKKyAgICBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQgICAgc2FtcGxlTG9jYXRpb25zSW5mbzsKK30gVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1N1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQgeworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBzdWJwYXNzSW5kZXg7CisgICAgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUICAgIHNhbXBsZUxvY2F0aW9uc0luZm87Cit9IFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50OworICAgIGNvbnN0IFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCogICAgcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBjb25zdCBWa1N1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQqICAgICAgIHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uczsKK30gVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICBzYW1wbGVMb2NhdGlvbnNFbmFibGU7CisgICAgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUICAgIHNhbXBsZUxvY2F0aW9uc0luZm87Cit9IFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrU2FtcGxlQ291bnRGbGFncyAgICBzYW1wbGVMb2NhdGlvblNhbXBsZUNvdW50czsKKyAgICBWa0V4dGVudDJEICAgICAgICAgICAgbWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgc2FtcGxlTG9jYXRpb25Db29yZGluYXRlUmFuZ2VbMl07CisgICAgdWludDMyX3QgICAgICAgICAgICAgIHNhbXBsZUxvY2F0aW9uU3ViUGl4ZWxCaXRzOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICB2YXJpYWJsZVNhbXBsZUxvY2F0aW9uczsKK30gVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRXh0ZW50MkQgICAgICAgICBtYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplOworfSBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVDsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogcFNhbXBsZUxvY2F0aW9uc0luZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNJbmZvKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogICAgICAgICAgICAgICAgIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkIDEKKyNkZWZpbmUgVktfRVhUX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9TUEVDX1ZFUlNJT04gMgorI2RlZmluZSBWS19FWFRfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkIgorCit0eXBlZGVmIGVudW0gVmtCbGVuZE92ZXJsYXBFWFQgeworICAgIFZLX0JMRU5EX09WRVJMQVBfVU5DT1JSRUxBVEVEX0VYVCA9IDAsCisgICAgVktfQkxFTkRfT1ZFUkxBUF9ESVNKT0lOVF9FWFQgPSAxLAorICAgIFZLX0JMRU5EX09WRVJMQVBfQ09OSk9JTlRfRVhUID0gMiwKKyAgICBWS19CTEVORF9PVkVSTEFQX0JFR0lOX1JBTkdFX0VYVCA9IFZLX0JMRU5EX09WRVJMQVBfVU5DT1JSRUxBVEVEX0VYVCwKKyAgICBWS19CTEVORF9PVkVSTEFQX0VORF9SQU5HRV9FWFQgPSBWS19CTEVORF9PVkVSTEFQX0NPTkpPSU5UX0VYVCwKKyAgICBWS19CTEVORF9PVkVSTEFQX1JBTkdFX1NJWkVfRVhUID0gKFZLX0JMRU5EX09WRVJMQVBfQ09OSk9JTlRfRVhUIC0gVktfQkxFTkRfT1ZFUkxBUF9VTkNPUlJFTEFURURfRVhUICsgMSksCisgICAgVktfQkxFTkRfT1ZFUkxBUF9NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrQmxlbmRPdmVybGFwRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgYWR2YW5jZWRCbGVuZENvaGVyZW50T3BlcmF0aW9uczsKK30gVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBhZHZhbmNlZEJsZW5kTWF4Q29sb3JBdHRhY2htZW50czsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkU3JjQ29sb3I7CisgICAgVmtCb29sMzIgICAgICAgICAgIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3I7CisgICAgVmtCb29sMzIgICAgICAgICAgIGFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgYWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnM7Cit9IFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgc3JjUHJlbXVsdGlwbGllZDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICBkc3RQcmVtdWx0aXBsaWVkOworICAgIFZrQmxlbmRPdmVybGFwRVhUICAgIGJsZW5kT3ZlcmxhcDsKK30gVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVDsKKworCisKKyNkZWZpbmUgVktfTlZfZnJhZ21lbnRfY292ZXJhZ2VfdG9fY29sb3IgMQorI2RlZmluZSBWS19OVl9GUkFHTUVOVF9DT1ZFUkFHRV9UT19DT0xPUl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19OVl9GUkFHTUVOVF9DT1ZFUkFHRV9UT19DT0xPUl9FWFRFTlNJT05fTkFNRSAiVktfTlZfZnJhZ21lbnRfY292ZXJhZ2VfdG9fY29sb3IiCit0eXBlZGVmIFZrRmxhZ3MgVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlRmxhZ3NOVjsKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUZsYWdzTlYgICAgZmxhZ3M7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZVRvQ29sb3JFbmFibGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbjsKK30gVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WOworCisKKworI2RlZmluZSBWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzIDEKKyNkZWZpbmUgVktfTlZfRlJBTUVCVUZGRVJfTUlYRURfU0FNUExFU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19OVl9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0VYVEVOU0lPTl9OQU1FICJWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzIgorCit0eXBlZGVmIGVudW0gVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYgeworICAgIFZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9OT05FX05WID0gMCwKKyAgICBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfUkdCX05WID0gMSwKKyAgICBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfQUxQSEFfTlYgPSAyLAorICAgIFZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9SR0JBX05WID0gMywKKyAgICBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfQkVHSU5fUkFOR0VfTlYgPSBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfTk9ORV9OViwKKyAgICBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfRU5EX1JBTkdFX05WID0gVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX1JHQkFfTlYsCisgICAgVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX1JBTkdFX1NJWkVfTlYgPSAoVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX1JHQkFfTlYgLSBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfTk9ORV9OViArIDEpLAorICAgIFZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9NQVhfRU5VTV9OViA9IDB4N0ZGRkZGRkYKK30gVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlY7Cit0eXBlZGVmIFZrRmxhZ3MgVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlRmxhZ3NOVjsKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUZsYWdzTlYgICAgZmxhZ3M7CisgICAgVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZU1vZHVsYXRpb25Nb2RlOworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50OworICAgIGNvbnN0IGZsb2F0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdmVyYWdlTW9kdWxhdGlvblRhYmxlOworfSBWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlY7CisKKworCisjZGVmaW5lIFZLX05WX2ZpbGxfcmVjdGFuZ2xlIDEKKyNkZWZpbmUgVktfTlZfRklMTF9SRUNUQU5HTEVfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfTlZfRklMTF9SRUNUQU5HTEVfRVhURU5TSU9OX05BTUUgIlZLX05WX2ZpbGxfcmVjdGFuZ2xlIgorCisKKyNkZWZpbmUgVktfTlZfc2hhZGVyX3NtX2J1aWx0aW5zIDEKKyNkZWZpbmUgVktfTlZfU0hBREVSX1NNX0JVSUxUSU5TX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX05WX1NIQURFUl9TTV9CVUlMVElOU19FWFRFTlNJT05fTkFNRSAiVktfTlZfc2hhZGVyX3NtX2J1aWx0aW5zIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIHNoYWRlclNNQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgIHNoYWRlcldhcnBzUGVyU007Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlclNNQnVpbHRpbnM7Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVjsKKworCisKKyNkZWZpbmUgVktfRVhUX3Bvc3RfZGVwdGhfY292ZXJhZ2UgMQorI2RlZmluZSBWS19FWFRfUE9TVF9ERVBUSF9DT1ZFUkFHRV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfUE9TVF9ERVBUSF9DT1ZFUkFHRV9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3Bvc3RfZGVwdGhfY292ZXJhZ2UiCisKKworI2RlZmluZSBWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllciAxCisjZGVmaW5lIFZLX0VYVF9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllciIKK3R5cGVkZWYgc3RydWN0IFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIHsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBkcm1Gb3JtYXRNb2RpZmllcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQ7CisgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgICAgZHJtRm9ybWF0TW9kaWZpZXJUaWxpbmdGZWF0dXJlczsKK30gVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtRm9ybWF0TW9kaWZpZXJDb3VudDsKKyAgICBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogICAgcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllczsKK30gVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDY0X3QgICAgICAgICAgIGRybUZvcm1hdE1vZGlmaWVyOworICAgIFZrU2hhcmluZ01vZGUgICAgICBzaGFyaW5nTW9kZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiAgICBwUXVldWVGYW1pbHlJbmRpY2VzOworfSBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBkcm1Gb3JtYXRNb2RpZmllckNvdW50OworICAgIGNvbnN0IHVpbnQ2NF90KiAgICBwRHJtRm9ybWF0TW9kaWZpZXJzOworfSBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICBkcm1Gb3JtYXRNb2RpZmllcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQ7CisgICAgY29uc3QgVmtTdWJyZXNvdXJjZUxheW91dCogICAgcFBsYW5lTGF5b3V0czsKK30gVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQ2NF90ICAgICAgICAgICBkcm1Gb3JtYXRNb2RpZmllcjsKK30gVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVDsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCkoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiBwUHJvcGVydGllcyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUgMQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrVmFsaWRhdGlvbkNhY2hlRVhUKQorI2RlZmluZSBWS19FWFRfVkFMSURBVElPTl9DQUNIRV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfVkFMSURBVElPTl9DQUNIRV9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUiCisKK3R5cGVkZWYgZW51bSBWa1ZhbGlkYXRpb25DYWNoZUhlYWRlclZlcnNpb25FWFQgeworICAgIFZLX1ZBTElEQVRJT05fQ0FDSEVfSEVBREVSX1ZFUlNJT05fT05FX0VYVCA9IDEsCisgICAgVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9CRUdJTl9SQU5HRV9FWFQgPSBWS19WQUxJREFUSU9OX0NBQ0hFX0hFQURFUl9WRVJTSU9OX09ORV9FWFQsCisgICAgVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9FTkRfUkFOR0VfRVhUID0gVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkVfRVhULAorICAgIFZLX1ZBTElEQVRJT05fQ0FDSEVfSEVBREVSX1ZFUlNJT05fUkFOR0VfU0laRV9FWFQgPSAoVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkVfRVhUIC0gVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkVfRVhUICsgMSksCisgICAgVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrVmFsaWRhdGlvbkNhY2hlSGVhZGVyVmVyc2lvbkVYVDsKK3R5cGVkZWYgVmtGbGFncyBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUZsYWdzRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVGbGFnc0VYVCAgICBmbGFnczsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxEYXRhU2l6ZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0aWFsRGF0YTsKK30gVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgIHBOZXh0OworICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgIHZhbGlkYXRpb25DYWNoZTsKK30gVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiBwVmFsaWRhdGlvbkNhY2hlKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKShWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKShWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIGRzdENhY2hlLCB1aW50MzJfdCBzcmNDYWNoZUNvdW50LCBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUVYVCogcFNyY0NhY2hlcyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQpKFZrRGV2aWNlIGRldmljZSwgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgICAgICAgIHBWYWxpZGF0aW9uQ2FjaGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0VYVF9kZXNjcmlwdG9yX2luZGV4aW5nIDEKKyNkZWZpbmUgVktfRVhUX0RFU0NSSVBUT1JfSU5ERVhJTkdfU1BFQ19WRVJTSU9OIDIKKyNkZWZpbmUgVktfRVhUX0RFU0NSSVBUT1JfSU5ERVhJTkdfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9kZXNjcmlwdG9yX2luZGV4aW5nIgorCit0eXBlZGVmIGVudW0gVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUIHsKKyAgICBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCA9IDB4MDAwMDAwMDEsCisgICAgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9VTlVTRURfV0hJTEVfUEVORElOR19CSVRfRVhUID0gMHgwMDAwMDAwMiwKKyAgICBWS19ERVNDUklQVE9SX0JJTkRJTkdfUEFSVElBTExZX0JPVU5EX0JJVF9FWFQgPSAweDAwMDAwMDA0LAorICAgIFZLX0RFU0NSSVBUT1JfQklORElOR19WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0JJVF9FWFQgPSAweDAwMDAwMDA4LAorICAgIFZLX0RFU0NSSVBUT1JfQklORElOR19GTEFHX0JJVFNfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQ7Cit0eXBlZGVmIFZrRmxhZ3MgVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50OworICAgIGNvbnN0IFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCogICAgcEJpbmRpbmdGbGFnczsKK30gVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nOworICAgIFZrQm9vbDMyICAgICAgICAgICBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIFZrQm9vbDMyICAgICAgICAgICBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIFZrQm9vbDMyICAgICAgICAgICBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIFZrQm9vbDMyICAgICAgICAgICBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kOworICAgIFZrQm9vbDMyICAgICAgICAgICBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kOworICAgIFZrQm9vbDMyICAgICAgICAgICBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nOworICAgIFZrQm9vbDMyICAgICAgICAgICBkZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kOworICAgIFZrQm9vbDMyICAgICAgICAgICBkZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50OworICAgIFZrQm9vbDMyICAgICAgICAgICBydW50aW1lRGVzY3JpcHRvckFycmF5OworfSBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhVcGRhdGVBZnRlckJpbmREZXNjcmlwdG9yc0luQWxsUG9vbHM7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIFZrQm9vbDMyICAgICAgICAgICByb2J1c3RCdWZmZXJBY2Nlc3NVcGRhdGVBZnRlckJpbmQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHF1YWREaXZlcmdlbnRJbXBsaWNpdExvZDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnM7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzOworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4UGVyU3RhZ2VVcGRhdGVBZnRlckJpbmRSZXNvdXJjZXM7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVyczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzOworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljOworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnM7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWM7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzOworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHM7Cit9IFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiAgICBwRGVzY3JpcHRvckNvdW50czsKK30gVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4VmFyaWFibGVEZXNjcmlwdG9yQ291bnQ7Cit9IFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVDsKKworCisKKyNkZWZpbmUgVktfRVhUX3NoYWRlcl92aWV3cG9ydF9pbmRleF9sYXllciAxCisjZGVmaW5lIFZLX0VYVF9TSEFERVJfVklFV1BPUlRfSU5ERVhfTEFZRVJfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX1NIQURFUl9WSUVXUE9SVF9JTkRFWF9MQVlFUl9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3NoYWRlcl92aWV3cG9ydF9pbmRleF9sYXllciIKKworCisjZGVmaW5lIFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSAxCisjZGVmaW5lIFZLX05WX1NIQURJTkdfUkFURV9JTUFHRV9TUEVDX1ZFUlNJT04gMworI2RlZmluZSBWS19OVl9TSEFESU5HX1JBVEVfSU1BR0VfRVhURU5TSU9OX05BTUUgIlZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSIKKwordHlwZWRlZiBlbnVtIFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViB7CisgICAgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfTk9fSU5WT0NBVElPTlNfTlYgPSAwLAorICAgIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzE2X0lOVk9DQVRJT05TX1BFUl9QSVhFTF9OViA9IDEsCisgICAgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfOF9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYgPSAyLAorICAgIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzRfSU5WT0NBVElPTlNfUEVSX1BJWEVMX05WID0gMywKKyAgICBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8yX0lOVk9DQVRJT05TX1BFUl9QSVhFTF9OViA9IDQsCisgICAgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl9QSVhFTF9OViA9IDUsCisgICAgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8yWDFfUElYRUxTX05WID0gNiwKKyAgICBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzFYMl9QSVhFTFNfTlYgPSA3LAorICAgIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfMlgyX1BJWEVMU19OViA9IDgsCisgICAgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl80WDJfUElYRUxTX05WID0gOSwKKyAgICBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYNF9QSVhFTFNfTlYgPSAxMCwKKyAgICBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzRYNF9QSVhFTFNfTlYgPSAxMSwKKyAgICBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV9CRUdJTl9SQU5HRV9OViA9IFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZX05PX0lOVk9DQVRJT05TX05WLAorICAgIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZX0VORF9SQU5HRV9OViA9IFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfNFg0X1BJWEVMU19OViwKKyAgICBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV9SQU5HRV9TSVpFX05WID0gKFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfNFg0X1BJWEVMU19OViAtIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZX05PX0lOVk9DQVRJT05TX05WICsgMSksCisgICAgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfTUFYX0VOVU1fTlYgPSAweDdGRkZGRkZGCit9IFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjsKKwordHlwZWRlZiBlbnVtIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgeworICAgIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9ERUZBVUxUX05WID0gMCwKKyAgICBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfQ1VTVE9NX05WID0gMSwKKyAgICBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfUElYRUxfTUFKT1JfTlYgPSAyLAorICAgIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9TQU1QTEVfTUFKT1JfTlYgPSAzLAorICAgIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9CRUdJTl9SQU5HRV9OViA9IFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9ERUZBVUxUX05WLAorICAgIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9FTkRfUkFOR0VfTlYgPSBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfU0FNUExFX01BSk9SX05WLAorICAgIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9SQU5HRV9TSVpFX05WID0gKFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9TQU1QTEVfTUFKT1JfTlYgLSBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfREVGQVVMVF9OViArIDEpLAorICAgIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9NQVhfRU5VTV9OViA9IDB4N0ZGRkZGRkYKK30gVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOVjsKK3R5cGVkZWYgc3RydWN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgeworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudDsKKyAgICBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlYqICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzOworfSBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudDsKKyAgICBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKiAgICBwU2hhZGluZ1JhdGVQYWxldHRlczsKK30gVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRpbmdSYXRlSW1hZ2U7CisgICAgVmtCb29sMzIgICAgICAgICAgIHNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXI7Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtFeHRlbnQyRCAgICAgICAgIHNoYWRpbmdSYXRlVGV4ZWxTaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICBzaGFkaW5nUmF0ZVBhbGV0dGVTaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICBzaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXM7Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WOworCit0eXBlZGVmIHN0cnVjdCBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYgeworICAgIHVpbnQzMl90ICAgIHBpeGVsWDsKKyAgICB1aW50MzJfdCAgICBwaXhlbFk7CisgICAgdWludDMyX3QgICAgc2FtcGxlOworfSBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlY7CisKK3R5cGVkZWYgc3RydWN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViB7CisgICAgVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WICAgICAgICBzaGFkaW5nUmF0ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlTG9jYXRpb25Db3VudDsKKyAgICBjb25zdCBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYqICAgIHBTYW1wbGVMb2NhdGlvbnM7Cit9IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgICAgICAgICAgICAgc2FtcGxlT3JkZXJUeXBlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2FtcGxlT3JkZXJDb3VudDsKKyAgICBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqICAgIHBDdXN0b21TYW1wbGVPcmRlcnM7Cit9IFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlY7CisKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3LCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0KTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogcFNoYWRpbmdSYXRlUGFsZXR0ZXMpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZSwgdWludDMyX3QgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiBwQ3VzdG9tU2FtcGxlT3JkZXJzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogICAgICAgICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViAgICAgICAgICAgICAgICAgICBzYW1wbGVPcmRlclR5cGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TYW1wbGVPcmRlckNvdW50LAorICAgIGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogICAgICAgICAgcEN1c3RvbVNhbXBsZU9yZGVycyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX05WX3JheV90cmFjaW5nIDEKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKQorI2RlZmluZSBWS19OVl9SQVlfVFJBQ0lOR19TUEVDX1ZFUlNJT04gICAgMworI2RlZmluZSBWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSAgIlZLX05WX3JheV90cmFjaW5nIgorI2RlZmluZSBWS19TSEFERVJfVU5VU0VEX05WICAgICAgICAgICAgICAgKH4wVSkKKwordHlwZWRlZiBlbnVtIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WIHsKKyAgICBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfVE9QX0xFVkVMX05WID0gMCwKKyAgICBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WID0gMSwKKyAgICBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQkVHSU5fUkFOR0VfTlYgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfVE9QX0xFVkVMX05WLAorICAgIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9FTkRfUkFOR0VfTlYgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WLAorICAgIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9SQU5HRV9TSVpFX05WID0gKFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlYgLSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfVE9QX0xFVkVMX05WICsgMSksCisgICAgVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOVjsKKwordHlwZWRlZiBlbnVtIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WIHsKKyAgICBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WID0gMCwKKyAgICBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9UUklBTkdMRVNfSElUX0dST1VQX05WID0gMSwKKyAgICBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9QUk9DRURVUkFMX0hJVF9HUk9VUF9OViA9IDIsCisgICAgVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfQkVHSU5fUkFOR0VfTlYgPSBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WLAorICAgIFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0VORF9SQU5HRV9OViA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1BST0NFRFVSQUxfSElUX0dST1VQX05WLAorICAgIFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1JBTkdFX1NJWkVfTlYgPSAoVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfUFJPQ0VEVVJBTF9ISVRfR1JPVVBfTlYgLSBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WICsgMSksCisgICAgVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfTUFYX0VOVU1fTlYgPSAweDdGRkZGRkZGCit9IFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WOworCit0eXBlZGVmIGVudW0gVmtHZW9tZXRyeVR5cGVOViB7CisgICAgVktfR0VPTUVUUllfVFlQRV9UUklBTkdMRVNfTlYgPSAwLAorICAgIFZLX0dFT01FVFJZX1RZUEVfQUFCQlNfTlYgPSAxLAorICAgIFZLX0dFT01FVFJZX1RZUEVfQkVHSU5fUkFOR0VfTlYgPSBWS19HRU9NRVRSWV9UWVBFX1RSSUFOR0xFU19OViwKKyAgICBWS19HRU9NRVRSWV9UWVBFX0VORF9SQU5HRV9OViA9IFZLX0dFT01FVFJZX1RZUEVfQUFCQlNfTlYsCisgICAgVktfR0VPTUVUUllfVFlQRV9SQU5HRV9TSVpFX05WID0gKFZLX0dFT01FVFJZX1RZUEVfQUFCQlNfTlYgLSBWS19HRU9NRVRSWV9UWVBFX1RSSUFOR0xFU19OViArIDEpLAorICAgIFZLX0dFT01FVFJZX1RZUEVfTUFYX0VOVU1fTlYgPSAweDdGRkZGRkZGCit9IFZrR2VvbWV0cnlUeXBlTlY7CisKK3R5cGVkZWYgZW51bSBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgeworICAgIFZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NMT05FX05WID0gMCwKKyAgICBWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DT01QQUNUX05WID0gMSwKKyAgICBWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9CRUdJTl9SQU5HRV9OViA9IFZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NMT05FX05WLAorICAgIFZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0VORF9SQU5HRV9OViA9IFZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NPTVBBQ1RfTlYsCisgICAgVktfQ09QWV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01PREVfUkFOR0VfU0laRV9OViA9IChWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DT01QQUNUX05WIC0gVktfQ09QWV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01PREVfQ0xPTkVfTlYgKyAxKSwKKyAgICBWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9NQVhfRU5VTV9OViA9IDB4N0ZGRkZGRkYKK30gVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WOworCit0eXBlZGVmIGVudW0gVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlYgeworICAgIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX09CSkVDVF9OViA9IDAsCisgICAgVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfQlVJTERfU0NSQVRDSF9OViA9IDEsCisgICAgVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfVVBEQVRFX1NDUkFUQ0hfTlYgPSAyLAorICAgIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX0JFR0lOX1JBTkdFX05WID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WLAorICAgIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX0VORF9SQU5HRV9OViA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX1VQREFURV9TQ1JBVENIX05WLAorICAgIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX1JBTkdFX1NJWkVfTlYgPSAoVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfVVBEQVRFX1NDUkFUQ0hfTlYgLSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9PQkpFQ1RfTlYgKyAxKSwKKyAgICBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9NQVhfRU5VTV9OViA9IDB4N0ZGRkZGRkYKK30gVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlY7CisKK3R5cGVkZWYgZW51bSBWa0dlb21ldHJ5RmxhZ0JpdHNOViB7CisgICAgVktfR0VPTUVUUllfT1BBUVVFX0JJVF9OViA9IDB4MDAwMDAwMDEsCisgICAgVktfR0VPTUVUUllfTk9fRFVQTElDQVRFX0FOWV9ISVRfSU5WT0NBVElPTl9CSVRfTlYgPSAweDAwMDAwMDAyLAorICAgIFZLX0dFT01FVFJZX0ZMQUdfQklUU19NQVhfRU5VTV9OViA9IDB4N0ZGRkZGRkYKK30gVmtHZW9tZXRyeUZsYWdCaXRzTlY7Cit0eXBlZGVmIFZrRmxhZ3MgVmtHZW9tZXRyeUZsYWdzTlY7CisKK3R5cGVkZWYgZW51bSBWa0dlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WIHsKKyAgICBWS19HRU9NRVRSWV9JTlNUQU5DRV9UUklBTkdMRV9DVUxMX0RJU0FCTEVfQklUX05WID0gMHgwMDAwMDAwMSwKKyAgICBWS19HRU9NRVRSWV9JTlNUQU5DRV9UUklBTkdMRV9GUk9OVF9DT1VOVEVSQ0xPQ0tXSVNFX0JJVF9OViA9IDB4MDAwMDAwMDIsCisgICAgVktfR0VPTUVUUllfSU5TVEFOQ0VfRk9SQ0VfT1BBUVVFX0JJVF9OViA9IDB4MDAwMDAwMDQsCisgICAgVktfR0VPTUVUUllfSU5TVEFOQ0VfRk9SQ0VfTk9fT1BBUVVFX0JJVF9OViA9IDB4MDAwMDAwMDgsCisgICAgVktfR0VPTUVUUllfSU5TVEFOQ0VfRkxBR19CSVRTX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa0dlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WOwordHlwZWRlZiBWa0ZsYWdzIFZrR2VvbWV0cnlJbnN0YW5jZUZsYWdzTlY7CisKK3R5cGVkZWYgZW51bSBWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViB7CisgICAgVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9BTExPV19VUERBVEVfQklUX05WID0gMHgwMDAwMDAwMSwKKyAgICBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX0NPTVBBQ1RJT05fQklUX05WID0gMHgwMDAwMDAwMiwKKyAgICBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1BSRUZFUl9GQVNUX1RSQUNFX0JJVF9OViA9IDB4MDAwMDAwMDQsCisgICAgVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9CVUlMRF9CSVRfTlYgPSAweDAwMDAwMDA4LAorICAgIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTE9XX01FTU9SWV9CSVRfTlYgPSAweDAwMDAwMDEwLAorICAgIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfRkxBR19CSVRTX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVjsKK3R5cGVkZWYgVmtGbGFncyBWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOVjsKK3R5cGVkZWYgc3RydWN0IFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOViAgICB0eXBlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYWxTaGFkZXI7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdEhpdFNoYWRlcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBhbnlIaXRTaGFkZXI7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uU2hhZGVyOworfSBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQaXBlbGluZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZUNvdW50OworICAgIGNvbnN0IFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qICAgICAgICBwU3RhZ2VzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50OworICAgIGNvbnN0IFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WKiAgICBwR3JvdXBzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWN1cnNpb25EZXB0aDsKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0OworICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUGlwZWxpbmVIYW5kbGU7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQaXBlbGluZUluZGV4OworfSBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtHZW9tZXRyeVRyaWFuZ2xlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIFZrQnVmZmVyICAgICAgICAgICB2ZXJ0ZXhEYXRhOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICB2ZXJ0ZXhPZmZzZXQ7CisgICAgdWludDMyX3QgICAgICAgICAgIHZlcnRleENvdW50OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICB2ZXJ0ZXhTdHJpZGU7CisgICAgVmtGb3JtYXQgICAgICAgICAgIHZlcnRleEZvcm1hdDsKKyAgICBWa0J1ZmZlciAgICAgICAgICAgaW5kZXhEYXRhOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICBpbmRleE9mZnNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgaW5kZXhDb3VudDsKKyAgICBWa0luZGV4VHlwZSAgICAgICAgaW5kZXhUeXBlOworICAgIFZrQnVmZmVyICAgICAgICAgICB0cmFuc2Zvcm1EYXRhOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICB0cmFuc2Zvcm1PZmZzZXQ7Cit9IFZrR2VvbWV0cnlUcmlhbmdsZXNOVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtHZW9tZXRyeUFBQkJOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa0J1ZmZlciAgICAgICAgICAgYWFiYkRhdGE7CisgICAgdWludDMyX3QgICAgICAgICAgIG51bUFBQkJzOworICAgIHVpbnQzMl90ICAgICAgICAgICBzdHJpZGU7CisgICAgVmtEZXZpY2VTaXplICAgICAgIG9mZnNldDsKK30gVmtHZW9tZXRyeUFBQkJOVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtHZW9tZXRyeURhdGFOViB7CisgICAgVmtHZW9tZXRyeVRyaWFuZ2xlc05WICAgIHRyaWFuZ2xlczsKKyAgICBWa0dlb21ldHJ5QUFCQk5WICAgICAgICAgYWFiYnM7Cit9IFZrR2VvbWV0cnlEYXRhTlY7CisKK3R5cGVkZWYgc3RydWN0IFZrR2VvbWV0cnlOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgcE5leHQ7CisgICAgVmtHZW9tZXRyeVR5cGVOViAgICAgZ2VvbWV0cnlUeXBlOworICAgIFZrR2VvbWV0cnlEYXRhTlYgICAgIGdlb21ldHJ5OworICAgIFZrR2VvbWV0cnlGbGFnc05WICAgIGZsYWdzOworfSBWa0dlb21ldHJ5TlY7CisKK3R5cGVkZWYgc3RydWN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOViAgICAgICAgICB0eXBlOworICAgIFZrQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnc05WICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnlDb3VudDsKKyAgICBjb25zdCBWa0dlb21ldHJ5TlYqICAgICAgICAgICAgICAgICAgICBwR2VvbWV0cmllczsKK30gVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY7CisKK3R5cGVkZWYgc3RydWN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWRTaXplOworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICAgIGluZm87Cit9IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WOworCit0eXBlZGVmIHN0cnVjdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgIG1lbW9yeTsKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICBwRGV2aWNlSW5kaWNlczsKK30gVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WOworCit0eXBlZGVmIHN0cnVjdCBWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDsKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlczsKK30gVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzVHlwZU5WICAgIHR5cGU7CisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlOworfSBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIHNoYWRlckdyb3VwSGFuZGxlU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4UmVjdXJzaW9uRGVwdGg7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFNoYWRlckdyb3VwU3RyaWRlOworICAgIHVpbnQzMl90ICAgICAgICAgICBzaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQ7CisgICAgdWludDY0X3QgICAgICAgICAgIG1heEdlb21ldHJ5Q291bnQ7CisgICAgdWludDY0X3QgICAgICAgICAgIG1heEluc3RhbmNlQ291bnQ7CisgICAgdWludDY0X3QgICAgICAgICAgIG1heFRyaWFuZ2xlQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzOworfSBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogcEFjY2VsZXJhdGlvblN0cnVjdHVyZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKShWa0RldmljZSBkZXZpY2UsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcyk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBwSW5mbywgVmtCdWZmZXIgaW5zdGFuY2VEYXRhLCBWa0RldmljZVNpemUgaW5zdGFuY2VPZmZzZXQsIFZrQm9vbDMyIHVwZGF0ZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0J1ZmZlciBzY3JhdGNoLCBWa0RldmljZVNpemUgc2NyYXRjaE9mZnNldCk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgbW9kZSk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kVHJhY2VSYXlzTlYpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkZXB0aCk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVikoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYpKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwgdWludDMyX3QgZmlyc3RHcm91cCwgdWludDMyX3QgZ3JvdXBDb3VudCwgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKShWa0RldmljZSBkZXZpY2UsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsIFZrUXVlcnlUeXBlIHF1ZXJ5VHlwZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5KTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ29tcGlsZURlZmVycmVkTlYpKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwgdWludDMyX3Qgc2hhZGVyKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqICAgICAgICBwSW5mbywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlT2Zmc2V0LAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hPZmZzZXQpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WICAgICAgICAgICBtb2RlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRUcmFjZVJheXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RHcm91cCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywKKyAgICBWa1F1ZXJ5VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnkpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDb21waWxlRGVmZXJyZWROVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfTlZfcmVwcmVzZW50YXRpdmVfZnJhZ21lbnRfdGVzdCAxCisjZGVmaW5lIFZLX05WX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfU1BFQ19WRVJTSU9OIDIKKyNkZWZpbmUgVktfTlZfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9FWFRFTlNJT05fTkFNRSAiVktfTlZfcmVwcmVzZW50YXRpdmVfZnJhZ21lbnRfdGVzdCIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0OworfSBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgcmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGU7Cit9IFZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WOworCisKKworI2RlZmluZSBWS19FWFRfZmlsdGVyX2N1YmljIDEKKyNkZWZpbmUgVktfRVhUX0ZJTFRFUl9DVUJJQ19TUEVDX1ZFUlNJT04gIDIKKyNkZWZpbmUgVktfRVhUX0ZJTFRFUl9DVUJJQ19FWFRFTlNJT05fTkFNRSAiVktfRVhUX2ZpbHRlcl9jdWJpYyIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtJbWFnZVZpZXdUeXBlICAgIGltYWdlVmlld1R5cGU7Cit9IFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGZpbHRlckN1YmljOworICAgIFZrQm9vbDMyICAgICAgICAgICBmaWx0ZXJDdWJpY01pbm1heCA7Cit9IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ7CisKKworCisjZGVmaW5lIFZLX0VYVF9nbG9iYWxfcHJpb3JpdHkgMQorI2RlZmluZSBWS19FWFRfR0xPQkFMX1BSSU9SSVRZX1NQRUNfVkVSU0lPTiAyCisjZGVmaW5lIFZLX0VYVF9HTE9CQUxfUFJJT1JJVFlfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9nbG9iYWxfcHJpb3JpdHkiCisKK3R5cGVkZWYgZW51bSBWa1F1ZXVlR2xvYmFsUHJpb3JpdHlFWFQgeworICAgIFZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9MT1dfRVhUID0gMTI4LAorICAgIFZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9NRURJVU1fRVhUID0gMjU2LAorICAgIFZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9ISUdIX0VYVCA9IDUxMiwKKyAgICBWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfUkVBTFRJTUVfRVhUID0gMTAyNCwKKyAgICBWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfQkVHSU5fUkFOR0VfRVhUID0gVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0xPV19FWFQsCisgICAgVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0VORF9SQU5HRV9FWFQgPSBWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfUkVBTFRJTUVfRVhULAorICAgIFZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9SQU5HRV9TSVpFX0VYVCA9IChWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfUkVBTFRJTUVfRVhUIC0gVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0xPV19FWFQgKyAxKSwKKyAgICBWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfTUFYX0VOVU1fRVhUID0gMHg3RkZGRkZGRgorfSBWa1F1ZXVlR2xvYmFsUHJpb3JpdHlFWFQ7Cit0eXBlZGVmIHN0cnVjdCBWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrUXVldWVHbG9iYWxQcmlvcml0eUVYVCAgICBnbG9iYWxQcmlvcml0eTsKK30gVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVDsKKworCisKKyNkZWZpbmUgVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0IDEKKyNkZWZpbmUgVktfRVhUX0VYVEVSTkFMX01FTU9SWV9IT1NUX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9FWFRFUk5BTF9NRU1PUllfSE9TVF9FWFRFTlNJT05fTkFNRSAiVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0IgordHlwZWRlZiBzdHJ1Y3QgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgIGhhbmRsZVR5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXI7Cit9IFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWVtb3J5VHlwZUJpdHM7Cit9IFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0RldmljZVNpemUgICAgICAgbWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudDsKK30gVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQ7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKShWa0RldmljZSBkZXZpY2UsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgY29uc3Qgdm9pZCogcEhvc3RQb2ludGVyLCBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCogcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIb3N0UG9pbnRlciwKKyAgICBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCogICAgICAgICAgIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19BTURfYnVmZmVyX21hcmtlciAxCisjZGVmaW5lIFZLX0FNRF9CVUZGRVJfTUFSS0VSX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0FNRF9CVUZGRVJfTUFSS0VSX0VYVEVOU0lPTl9OQU1FICJWS19BTURfYnVmZmVyX21hcmtlciIKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgdWludDMyX3QgbWFya2VyKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RhZ2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIpOworI2VuZGlmCisKKworI2RlZmluZSBWS19BTURfcGlwZWxpbmVfY29tcGlsZXJfY29udHJvbCAxCisjZGVmaW5lIFZLX0FNRF9QSVBFTElORV9DT01QSUxFUl9DT05UUk9MX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0FNRF9QSVBFTElORV9DT01QSUxFUl9DT05UUk9MX0VYVEVOU0lPTl9OQU1FICJWS19BTURfcGlwZWxpbmVfY29tcGlsZXJfY29udHJvbCIKKwordHlwZWRlZiBlbnVtIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xGbGFnQml0c0FNRCB7CisgICAgVktfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9GTEFHX0JJVFNfTUFYX0VOVU1fQU1EID0gMHg3RkZGRkZGRgorfSBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sRmxhZ0JpdHNBTUQ7Cit0eXBlZGVmIFZrRmxhZ3MgVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdzQU1EOwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdzQU1EICAgIGNvbXBpbGVyQ29udHJvbEZsYWdzOworfSBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRDsKKworCisKKyNkZWZpbmUgVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyAxCisjZGVmaW5lIFZLX0VYVF9DQUxJQlJBVEVEX1RJTUVTVEFNUFNfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX0NBTElCUkFURURfVElNRVNUQU1QU19FWFRFTlNJT05fTkFNRSAiVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyIKKwordHlwZWRlZiBlbnVtIFZrVGltZURvbWFpbkVYVCB7CisgICAgVktfVElNRV9ET01BSU5fREVWSUNFX0VYVCA9IDAsCisgICAgVktfVElNRV9ET01BSU5fQ0xPQ0tfTU9OT1RPTklDX0VYVCA9IDEsCisgICAgVktfVElNRV9ET01BSU5fQ0xPQ0tfTU9OT1RPTklDX1JBV19FWFQgPSAyLAorICAgIFZLX1RJTUVfRE9NQUlOX1FVRVJZX1BFUkZPUk1BTkNFX0NPVU5URVJfRVhUID0gMywKKyAgICBWS19USU1FX0RPTUFJTl9CRUdJTl9SQU5HRV9FWFQgPSBWS19USU1FX0RPTUFJTl9ERVZJQ0VfRVhULAorICAgIFZLX1RJTUVfRE9NQUlOX0VORF9SQU5HRV9FWFQgPSBWS19USU1FX0RPTUFJTl9RVUVSWV9QRVJGT1JNQU5DRV9DT1VOVEVSX0VYVCwKKyAgICBWS19USU1FX0RPTUFJTl9SQU5HRV9TSVpFX0VYVCA9IChWS19USU1FX0RPTUFJTl9RVUVSWV9QRVJGT1JNQU5DRV9DT1VOVEVSX0VYVCAtIFZLX1RJTUVfRE9NQUlOX0RFVklDRV9FWFQgKyAxKSwKKyAgICBWS19USU1FX0RPTUFJTl9NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrVGltZURvbWFpbkVYVDsKK3R5cGVkZWYgc3RydWN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtUaW1lRG9tYWluRVhUICAgIHRpbWVEb21haW47Cit9IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQ7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwVGltZURvbWFpbkNvdW50LCBWa1RpbWVEb21haW5FWFQqIHBUaW1lRG9tYWlucyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHRpbWVzdGFtcENvdW50LCBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiBwVGltZXN0YW1wSW5mb3MsIHVpbnQ2NF90KiBwVGltZXN0YW1wcywgdWludDY0X3QqIHBNYXhEZXZpYXRpb24pOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbkNvdW50LAorICAgIFZrVGltZURvbWFpbkVYVCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEb21haW5zKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbik7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0FNRF9zaGFkZXJfY29yZV9wcm9wZXJ0aWVzIDEKKyNkZWZpbmUgVktfQU1EX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfU1BFQ19WRVJTSU9OIDIKKyNkZWZpbmUgVktfQU1EX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUgIlZLX0FNRF9zaGFkZXJfY29yZV9wcm9wZXJ0aWVzIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBzaGFkZXJFbmdpbmVDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgc2hhZGVyQXJyYXlzUGVyRW5naW5lQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgIGNvbXB1dGVVbml0c1BlclNoYWRlckFycmF5OworICAgIHVpbnQzMl90ICAgICAgICAgICBzaW1kUGVyQ29tcHV0ZVVuaXQ7CisgICAgdWludDMyX3QgICAgICAgICAgIHdhdmVmcm9udHNQZXJTaW1kOworICAgIHVpbnQzMl90ICAgICAgICAgICB3YXZlZnJvbnRTaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICBzZ3Byc1BlclNpbWQ7CisgICAgdWludDMyX3QgICAgICAgICAgIG1pblNncHJBbGxvY2F0aW9uOworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhTZ3ByQWxsb2NhdGlvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgc2dwckFsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgdmdwcnNQZXJTaW1kOworICAgIHVpbnQzMl90ICAgICAgICAgICBtaW5WZ3ByQWxsb2NhdGlvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4VmdwckFsbG9jYXRpb247CisgICAgdWludDMyX3QgICAgICAgICAgIHZncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHk7Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRDsKKworCisKKyNkZWZpbmUgVktfQU1EX21lbW9yeV9vdmVyYWxsb2NhdGlvbl9iZWhhdmlvciAxCisjZGVmaW5lIFZLX0FNRF9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQkVIQVZJT1JfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfQU1EX01FTU9SWV9PVkVSQUxMT0NBVElPTl9CRUhBVklPUl9FWFRFTlNJT05fTkFNRSAiVktfQU1EX21lbW9yeV9vdmVyYWxsb2NhdGlvbl9iZWhhdmlvciIKKwordHlwZWRlZiBlbnVtIFZrTWVtb3J5T3ZlcmFsbG9jYXRpb25CZWhhdmlvckFNRCB7CisgICAgVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RFRkFVTFRfQU1EID0gMCwKKyAgICBWS19NRU1PUllfT1ZFUkFMTE9DQVRJT05fQkVIQVZJT1JfQUxMT1dFRF9BTUQgPSAxLAorICAgIFZLX01FTU9SWV9PVkVSQUxMT0NBVElPTl9CRUhBVklPUl9ESVNBTExPV0VEX0FNRCA9IDIsCisgICAgVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0JFR0lOX1JBTkdFX0FNRCA9IFZLX01FTU9SWV9PVkVSQUxMT0NBVElPTl9CRUhBVklPUl9ERUZBVUxUX0FNRCwKKyAgICBWS19NRU1PUllfT1ZFUkFMTE9DQVRJT05fQkVIQVZJT1JfRU5EX1JBTkdFX0FNRCA9IFZLX01FTU9SWV9PVkVSQUxMT0NBVElPTl9CRUhBVklPUl9ESVNBTExPV0VEX0FNRCwKKyAgICBWS19NRU1PUllfT1ZFUkFMTE9DQVRJT05fQkVIQVZJT1JfUkFOR0VfU0laRV9BTUQgPSAoVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RJU0FMTE9XRURfQU1EIC0gVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RFRkFVTFRfQU1EICsgMSksCisgICAgVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX01BWF9FTlVNX0FNRCA9IDB4N0ZGRkZGRkYKK30gVmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EOwordHlwZWRlZiBzdHJ1Y3QgVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EICAgIG92ZXJhbGxvY2F0aW9uQmVoYXZpb3I7Cit9IFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EOworCisKKworI2RlZmluZSBWS19FWFRfdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yIDEKKyNkZWZpbmUgVktfRVhUX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9TUEVDX1ZFUlNJT04gMworI2RlZmluZSBWS19FWFRfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhWZXJ0ZXhBdHRyaWJEaXZpc29yOworfSBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUIHsKKyAgICB1aW50MzJfdCAgICBiaW5kaW5nOworICAgIHVpbnQzMl90ICAgIGRpdmlzb3I7Cit9IFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50OworICAgIGNvbnN0IFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUKiAgICBwVmVydGV4QmluZGluZ0Rpdmlzb3JzOworfSBWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yOworICAgIFZrQm9vbDMyICAgICAgICAgICB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvcjsKK30gVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVDsKKworCisKKyNkZWZpbmUgVktfRVhUX3BpcGVsaW5lX2NyZWF0aW9uX2ZlZWRiYWNrIDEKKyNkZWZpbmUgVktfRVhUX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSAiVktfRVhUX3BpcGVsaW5lX2NyZWF0aW9uX2ZlZWRiYWNrIgorCit0eXBlZGVmIGVudW0gVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVCB7CisgICAgVktfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfVkFMSURfQklUX0VYVCA9IDB4MDAwMDAwMDEsCisgICAgVktfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQVBQTElDQVRJT05fUElQRUxJTkVfQ0FDSEVfSElUX0JJVF9FWFQgPSAweDAwMDAwMDAyLAorICAgIFZLX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0JBU0VfUElQRUxJTkVfQUNDRUxFUkFUSU9OX0JJVF9FWFQgPSAweDAwMDAwMDA0LAorICAgIFZLX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0ZMQUdfQklUU19NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQ7Cit0eXBlZGVmIFZrRmxhZ3MgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnc0VYVDsKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUIHsKKyAgICBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUICAgIGZsYWdzOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb247Cit9IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQqICAgIHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2s7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQ7CisgICAgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQqICAgIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3M7Cit9IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVDsKKworCisKKyNkZWZpbmUgVktfTlZfc2hhZGVyX3N1Ymdyb3VwX3BhcnRpdGlvbmVkIDEKKyNkZWZpbmUgVktfTlZfU0hBREVSX1NVQkdST1VQX1BBUlRJVElPTkVEX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX05WX1NIQURFUl9TVUJHUk9VUF9QQVJUSVRJT05FRF9FWFRFTlNJT05fTkFNRSAiVktfTlZfc2hhZGVyX3N1Ymdyb3VwX3BhcnRpdGlvbmVkIgorCisKKyNkZWZpbmUgVktfTlZfY29tcHV0ZV9zaGFkZXJfZGVyaXZhdGl2ZXMgMQorI2RlZmluZSBWS19OVl9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19OVl9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19FWFRFTlNJT05fTkFNRSAiVktfTlZfY29tcHV0ZV9zaGFkZXJfZGVyaXZhdGl2ZXMiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzOworICAgIFZrQm9vbDMyICAgICAgICAgICBjb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyOworfSBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVjsKKworCisKKyNkZWZpbmUgVktfTlZfbWVzaF9zaGFkZXIgMQorI2RlZmluZSBWS19OVl9NRVNIX1NIQURFUl9TUEVDX1ZFUlNJT04gICAgMQorI2RlZmluZSBWS19OVl9NRVNIX1NIQURFUl9FWFRFTlNJT05fTkFNRSAgIlZLX05WX21lc2hfc2hhZGVyIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICB0YXNrU2hhZGVyOworICAgIFZrQm9vbDMyICAgICAgICAgICBtZXNoU2hhZGVyOworfSBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlY7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhEcmF3TWVzaFRhc2tzQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFRhc2tXb3JrR3JvdXBJbnZvY2F0aW9uczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4VGFza1dvcmtHcm91cFNpemVbM107CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFRhc2tUb3RhbE1lbW9yeVNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgIG1heFRhc2tPdXRwdXRDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4TWVzaFdvcmtHcm91cEludm9jYXRpb25zOworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhNZXNoV29ya0dyb3VwU2l6ZVszXTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4TWVzaFRvdGFsTWVtb3J5U2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4TWVzaE91dHB1dFZlcnRpY2VzOworICAgIHVpbnQzMl90ICAgICAgICAgICBtYXhNZXNoT3V0cHV0UHJpbWl0aXZlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWF4TWVzaE11bHRpdmlld1ZpZXdDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWVzaE91dHB1dFBlclZlcnRleEdyYW51bGFyaXR5OworICAgIHVpbnQzMl90ICAgICAgICAgICBtZXNoT3V0cHV0UGVyUHJpbWl0aXZlR3JhbnVsYXJpdHk7Cit9IFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WOworCit0eXBlZGVmIHN0cnVjdCBWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViB7CisgICAgdWludDMyX3QgICAgdGFza0NvdW50OworICAgIHVpbnQzMl90ICAgIGZpcnN0VGFzazsKK30gVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlY7CisKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREcmF3TWVzaFRhc2tzTlYpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB0YXNrQ291bnQsIHVpbnQzMl90IGZpcnN0VGFzayk7Cit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3TWVzaFRhc2tzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUYXNrKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX05WX2ZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpYyAxCisjZGVmaW5lIFZLX05WX0ZSQUdNRU5UX1NIQURFUl9CQVJZQ0VOVFJJQ19TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19OVl9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRVhURU5TSU9OX05BTUUgIlZLX05WX2ZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpYyIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYzsKK30gVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WOworCisKKworI2RlZmluZSBWS19OVl9zaGFkZXJfaW1hZ2VfZm9vdHByaW50IDEKKyNkZWZpbmUgVktfTlZfU0hBREVSX0lNQUdFX0ZPT1RQUklOVF9TUEVDX1ZFUlNJT04gMgorI2RlZmluZSBWS19OVl9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0VYVEVOU0lPTl9OQU1FICJWS19OVl9zaGFkZXJfaW1hZ2VfZm9vdHByaW50IgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgaW1hZ2VGb290cHJpbnQ7Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY7CisKKworCisjZGVmaW5lIFZLX05WX3NjaXNzb3JfZXhjbHVzaXZlIDEKKyNkZWZpbmUgVktfTlZfU0NJU1NPUl9FWENMVVNJVkVfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfTlZfU0NJU1NPUl9FWENMVVNJVkVfRVhURU5TSU9OX05BTUUgIlZLX05WX3NjaXNzb3JfZXhjbHVzaXZlIgordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBleGNsdXNpdmVTY2lzc29yQ291bnQ7CisgICAgY29uc3QgVmtSZWN0MkQqICAgIHBFeGNsdXNpdmVTY2lzc29yczsKK30gVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGV4Y2x1c2l2ZVNjaXNzb3I7Cit9IFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVjsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVikoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgdWludDMyX3QgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcEV4Y2x1c2l2ZVNjaXNzb3JzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpdmVTY2lzc29yQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXhjbHVzaXZlU2Npc3NvcnMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cyAxCisjZGVmaW5lIFZLX05WX0RFVklDRV9ESUFHTk9TVElDX0NIRUNLUE9JTlRTX1NQRUNfVkVSU0lPTiAyCisjZGVmaW5lIFZLX05WX0RFVklDRV9ESUFHTk9TVElDX0NIRUNLUE9JTlRTX0VYVEVOU0lPTl9OQU1FICJWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cyIKK3R5cGVkZWYgc3RydWN0IFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICBjaGVja3BvaW50RXhlY3V0aW9uU3RhZ2VNYXNrOworfSBWa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtDaGVja3BvaW50RGF0YU5WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyAgICBzdGFnZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludE1hcmtlcjsKK30gVmtDaGVja3BvaW50RGF0YU5WOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kU2V0Q2hlY2twb2ludE5WKShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3Qgdm9pZCogcENoZWNrcG9pbnRNYXJrZXIpOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOVikoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3QqIHBDaGVja3BvaW50RGF0YUNvdW50LCBWa0NoZWNrcG9pbnREYXRhTlYqIHBDaGVja3BvaW50RGF0YSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRDaGVja3BvaW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnRNYXJrZXIpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOVigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhQ291bnQsCisgICAgVmtDaGVja3BvaW50RGF0YU5WKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGEpOworI2VuZGlmCisKKworI2RlZmluZSBWS19JTlRFTF9zaGFkZXJfaW50ZWdlcl9mdW5jdGlvbnMyIDEKKyNkZWZpbmUgVktfSU5URUxfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfSU5URUxfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRVhURU5TSU9OX05BTUUgIlZLX0lOVEVMX3NoYWRlcl9pbnRlZ2VyX2Z1bmN0aW9uczIiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBzaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMjsKK30gVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTDsKKworCisKKyNkZWZpbmUgVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkgMQorVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpCisjZGVmaW5lIFZLX0lOVEVMX1BFUkZPUk1BTkNFX1FVRVJZX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0lOVEVMX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FICJWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSIKKwordHlwZWRlZiBlbnVtIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uVHlwZUlOVEVMIHsKKyAgICBWS19QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX1RZUEVfQ09NTUFORF9RVUVVRV9NRVRSSUNTX0RJU0NPVkVSWV9BQ1RJVkFURURfSU5URUwgPSAwLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fVFlQRV9CRUdJTl9SQU5HRV9JTlRFTCA9IFZLX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fVFlQRV9DT01NQU5EX1FVRVVFX01FVFJJQ1NfRElTQ09WRVJZX0FDVElWQVRFRF9JTlRFTCwKKyAgICBWS19QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX1RZUEVfRU5EX1JBTkdFX0lOVEVMID0gVktfUEVSRk9STUFOQ0VfQ09ORklHVVJBVElPTl9UWVBFX0NPTU1BTkRfUVVFVUVfTUVUUklDU19ESVNDT1ZFUllfQUNUSVZBVEVEX0lOVEVMLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fVFlQRV9SQU5HRV9TSVpFX0lOVEVMID0gKFZLX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fVFlQRV9DT01NQU5EX1FVRVVFX01FVFJJQ1NfRElTQ09WRVJZX0FDVElWQVRFRF9JTlRFTCAtIFZLX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fVFlQRV9DT01NQU5EX1FVRVVFX01FVFJJQ1NfRElTQ09WRVJZX0FDVElWQVRFRF9JTlRFTCArIDEpLAorICAgIFZLX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fVFlQRV9NQVhfRU5VTV9JTlRFTCA9IDB4N0ZGRkZGRkYKK30gVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUw7CisKK3R5cGVkZWYgZW51bSBWa1F1ZXJ5UG9vbFNhbXBsaW5nTW9kZUlOVEVMIHsKKyAgICBWS19RVUVSWV9QT09MX1NBTVBMSU5HX01PREVfTUFOVUFMX0lOVEVMID0gMCwKKyAgICBWS19RVUVSWV9QT09MX1NBTVBMSU5HX01PREVfQkVHSU5fUkFOR0VfSU5URUwgPSBWS19RVUVSWV9QT09MX1NBTVBMSU5HX01PREVfTUFOVUFMX0lOVEVMLAorICAgIFZLX1FVRVJZX1BPT0xfU0FNUExJTkdfTU9ERV9FTkRfUkFOR0VfSU5URUwgPSBWS19RVUVSWV9QT09MX1NBTVBMSU5HX01PREVfTUFOVUFMX0lOVEVMLAorICAgIFZLX1FVRVJZX1BPT0xfU0FNUExJTkdfTU9ERV9SQU5HRV9TSVpFX0lOVEVMID0gKFZLX1FVRVJZX1BPT0xfU0FNUExJTkdfTU9ERV9NQU5VQUxfSU5URUwgLSBWS19RVUVSWV9QT09MX1NBTVBMSU5HX01PREVfTUFOVUFMX0lOVEVMICsgMSksCisgICAgVktfUVVFUllfUE9PTF9TQU1QTElOR19NT0RFX01BWF9FTlVNX0lOVEVMID0gMHg3RkZGRkZGRgorfSBWa1F1ZXJ5UG9vbFNhbXBsaW5nTW9kZUlOVEVMOworCit0eXBlZGVmIGVudW0gVmtQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMIHsKKyAgICBWS19QRVJGT1JNQU5DRV9PVkVSUklERV9UWVBFX05VTExfSEFSRFdBUkVfSU5URUwgPSAwLAorICAgIFZLX1BFUkZPUk1BTkNFX09WRVJSSURFX1RZUEVfRkxVU0hfR1BVX0NBQ0hFU19JTlRFTCA9IDEsCisgICAgVktfUEVSRk9STUFOQ0VfT1ZFUlJJREVfVFlQRV9CRUdJTl9SQU5HRV9JTlRFTCA9IFZLX1BFUkZPUk1BTkNFX09WRVJSSURFX1RZUEVfTlVMTF9IQVJEV0FSRV9JTlRFTCwKKyAgICBWS19QRVJGT1JNQU5DRV9PVkVSUklERV9UWVBFX0VORF9SQU5HRV9JTlRFTCA9IFZLX1BFUkZPUk1BTkNFX09WRVJSSURFX1RZUEVfRkxVU0hfR1BVX0NBQ0hFU19JTlRFTCwKKyAgICBWS19QRVJGT1JNQU5DRV9PVkVSUklERV9UWVBFX1JBTkdFX1NJWkVfSU5URUwgPSAoVktfUEVSRk9STUFOQ0VfT1ZFUlJJREVfVFlQRV9GTFVTSF9HUFVfQ0FDSEVTX0lOVEVMIC0gVktfUEVSRk9STUFOQ0VfT1ZFUlJJREVfVFlQRV9OVUxMX0hBUkRXQVJFX0lOVEVMICsgMSksCisgICAgVktfUEVSRk9STUFOQ0VfT1ZFUlJJREVfVFlQRV9NQVhfRU5VTV9JTlRFTCA9IDB4N0ZGRkZGRkYKK30gVmtQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMOworCit0eXBlZGVmIGVudW0gVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCB7CisgICAgVktfUEVSRk9STUFOQ0VfUEFSQU1FVEVSX1RZUEVfSFdfQ09VTlRFUlNfU1VQUE9SVEVEX0lOVEVMID0gMCwKKyAgICBWS19QRVJGT1JNQU5DRV9QQVJBTUVURVJfVFlQRV9TVFJFQU1fTUFSS0VSX1ZBTElEX0JJVFNfSU5URUwgPSAxLAorICAgIFZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX0JFR0lOX1JBTkdFX0lOVEVMID0gVktfUEVSRk9STUFOQ0VfUEFSQU1FVEVSX1RZUEVfSFdfQ09VTlRFUlNfU1VQUE9SVEVEX0lOVEVMLAorICAgIFZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX0VORF9SQU5HRV9JTlRFTCA9IFZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX1NUUkVBTV9NQVJLRVJfVkFMSURfQklUU19JTlRFTCwKKyAgICBWS19QRVJGT1JNQU5DRV9QQVJBTUVURVJfVFlQRV9SQU5HRV9TSVpFX0lOVEVMID0gKFZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX1NUUkVBTV9NQVJLRVJfVkFMSURfQklUU19JTlRFTCAtIFZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX0hXX0NPVU5URVJTX1NVUFBPUlRFRF9JTlRFTCArIDEpLAorICAgIFZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX01BWF9FTlVNX0lOVEVMID0gMHg3RkZGRkZGRgorfSBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMOworCit0eXBlZGVmIGVudW0gVmtQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMIHsKKyAgICBWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX1VJTlQzMl9JTlRFTCA9IDAsCisgICAgVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9VSU5UNjRfSU5URUwgPSAxLAorICAgIFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfRkxPQVRfSU5URUwgPSAyLAorICAgIFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfQk9PTF9JTlRFTCA9IDMsCisgICAgVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9TVFJJTkdfSU5URUwgPSA0LAorICAgIFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfQkVHSU5fUkFOR0VfSU5URUwgPSBWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX1VJTlQzMl9JTlRFTCwKKyAgICBWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX0VORF9SQU5HRV9JTlRFTCA9IFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfU1RSSU5HX0lOVEVMLAorICAgIFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfUkFOR0VfU0laRV9JTlRFTCA9IChWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX1NUUklOR19JTlRFTCAtIFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfVUlOVDMyX0lOVEVMICsgMSksCisgICAgVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9NQVhfRU5VTV9JTlRFTCA9IDB4N0ZGRkZGRkYKK30gVmtQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMOwordHlwZWRlZiB1bmlvbiBWa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwgeworICAgIHVpbnQzMl90ICAgICAgIHZhbHVlMzI7CisgICAgdWludDY0X3QgICAgICAgdmFsdWU2NDsKKyAgICBmbG9hdCAgICAgICAgICB2YWx1ZUZsb2F0OworICAgIFZrQm9vbDMyICAgICAgIHZhbHVlQm9vbDsKKyAgICBjb25zdCBjaGFyKiAgICB2YWx1ZVN0cmluZzsKK30gVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMOworCit0eXBlZGVmIHN0cnVjdCBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCB7CisgICAgVmtQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMICAgIHR5cGU7CisgICAgVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMICAgIGRhdGE7Cit9IFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMOworCit0eXBlZGVmIHN0cnVjdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcFVzZXJEYXRhOworfSBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1F1ZXJ5UG9vbFNhbXBsaW5nTW9kZUlOVEVMICAgIHBlcmZvcm1hbmNlQ291bnRlcnNTYW1wbGluZzsKK30gVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUw7CisKK3R5cGVkZWYgc3RydWN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDY0X3QgICAgICAgICAgIG1hcmtlcjsKK30gVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbWFya2VyOworfSBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMOworCit0eXBlZGVmIHN0cnVjdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMICAgIHR5cGU7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyOworfSBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUw7CisKK3R5cGVkZWYgc3RydWN0IFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUwgICAgdHlwZTsKK30gVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiBwSW5pdGlhbGl6ZUluZm8pOwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwpKFZrRGV2aWNlIGRldmljZSk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiBwTWFya2VySW5mbyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBwTWFya2VySW5mbyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogcE92ZXJyaWRlSW5mbyk7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHBBY3F1aXJlSW5mbywgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogcENvbmZpZ3VyYXRpb24pOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpKFZrRGV2aWNlIGRldmljZSwgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCkoVmtRdWV1ZSBxdWV1ZSwgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCkoVmtEZXZpY2UgZGV2aWNlLCBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIHBhcmFtZXRlciwgVmtQZXJmb3JtYW5jZVZhbHVlSU5URUwqIHBWYWx1ZSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqICBwSW5pdGlhbGl6ZUluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiAgICAgICAgIHBNYXJrZXJJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogICBwTWFya2VySW5mbyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiAgICAgICBwT3ZlcnJpZGVJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCogcEFjcXVpcmVJbmZvLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwqICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAgICAgICAgICAgICBjb25maWd1cmF0aW9uKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCAgICAgICAgICAgICBwYXJhbWV0ZXIsCisgICAgVmtQZXJmb3JtYW5jZVZhbHVlSU5URUwqICAgICAgICAgICAgICAgICAgICBwVmFsdWUpOworI2VuZGlmCisKKworI2RlZmluZSBWS19FWFRfcGNpX2J1c19pbmZvIDEKKyNkZWZpbmUgVktfRVhUX1BDSV9CVVNfSU5GT19TUEVDX1ZFUlNJT04gIDIKKyNkZWZpbmUgVktfRVhUX1BDSV9CVVNfSU5GT19FWFRFTlNJT05fTkFNRSAiVktfRVhUX3BjaV9idXNfaW5mbyIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgcGNpRG9tYWluOworICAgIHVpbnQzMl90ICAgICAgICAgICBwY2lCdXM7CisgICAgdWludDMyX3QgICAgICAgICAgIHBjaURldmljZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgcGNpRnVuY3Rpb247Cit9IFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVDsKKworCisKKyNkZWZpbmUgVktfQU1EX2Rpc3BsYXlfbmF0aXZlX2hkciAxCisjZGVmaW5lIFZLX0FNRF9ESVNQTEFZX05BVElWRV9IRFJfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfQU1EX0RJU1BMQVlfTkFUSVZFX0hEUl9FWFRFTlNJT05fTkFNRSAiVktfQU1EX2Rpc3BsYXlfbmF0aXZlX2hkciIKK3R5cGVkZWYgc3RydWN0IFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGxvY2FsRGltbWluZ1N1cHBvcnQ7Cit9IFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ7CisKK3R5cGVkZWYgc3RydWN0IFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZTsKK30gVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRDsKKwordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92a1NldExvY2FsRGltbWluZ0FNRCkoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwQ2hhaW4sIFZrQm9vbDMyIGxvY2FsRGltbWluZ0VuYWJsZSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtTZXRMb2NhbERpbW1pbmdBTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwQ2hhaW4sCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpbW1pbmdFbmFibGUpOworI2VuZGlmCisKKworI2RlZmluZSBWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXAgMQorI2RlZmluZSBWS19FWFRfRlJBR01FTlRfREVOU0lUWV9NQVBfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXAiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIGZyYWdtZW50RGVuc2l0eU1hcDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYzsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlczsKK30gVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0V4dGVudDJEICAgICAgICAgbWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplOworICAgIFZrRXh0ZW50MkQgICAgICAgICBtYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemU7CisgICAgVmtCb29sMzIgICAgICAgICAgIGZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zOworfSBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgICAgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDsKK30gVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVDsKKworCisKKyNkZWZpbmUgVktfRVhUX3NjYWxhcl9ibG9ja19sYXlvdXQgMQorI2RlZmluZSBWS19FWFRfU0NBTEFSX0JMT0NLX0xBWU9VVF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfU0NBTEFSX0JMT0NLX0xBWU9VVF9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3NjYWxhcl9ibG9ja19sYXlvdXQiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc2NhbGFyQmxvY2tMYXlvdXQ7Cit9IFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUOworCisKKworI2RlZmluZSBWS19HT09HTEVfaGxzbF9mdW5jdGlvbmFsaXR5MSAxCisjZGVmaW5lIFZLX0dPT0dMRV9ITFNMX0ZVTkNUSU9OQUxJVFkxX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0dPT0dMRV9ITFNMX0ZVTkNUSU9OQUxJVFkxX0VYVEVOU0lPTl9OQU1FICJWS19HT09HTEVfaGxzbF9mdW5jdGlvbmFsaXR5MSIKKworCisjZGVmaW5lIFZLX0dPT0dMRV9kZWNvcmF0ZV9zdHJpbmcgMQorI2RlZmluZSBWS19HT09HTEVfREVDT1JBVEVfU1RSSU5HX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0dPT0dMRV9ERUNPUkFURV9TVFJJTkdfRVhURU5TSU9OX05BTUUgIlZLX0dPT0dMRV9kZWNvcmF0ZV9zdHJpbmciCisKKworI2RlZmluZSBWS19FWFRfc3ViZ3JvdXBfc2l6ZV9jb250cm9sIDEKKyNkZWZpbmUgVktfRVhUX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9TUEVDX1ZFUlNJT04gMgorI2RlZmluZSBWS19FWFRfU1VCR1JPVVBfU0laRV9DT05UUk9MX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfc3ViZ3JvdXBfc2l6ZV9jb250cm9sIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc3ViZ3JvdXBTaXplQ29udHJvbDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgY29tcHV0ZUZ1bGxTdWJncm91cHM7Cit9IFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgbWluU3ViZ3JvdXBTaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtYXhTdWJncm91cFNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1heENvbXB1dGVXb3JrZ3JvdXBTdWJncm91cHM7CisgICAgVmtTaGFkZXJTdGFnZUZsYWdzICAgIHJlcXVpcmVkU3ViZ3JvdXBTaXplU3RhZ2VzOworfSBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgcmVxdWlyZWRTdWJncm91cFNpemU7Cit9IFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVDsKKworCisKKyNkZWZpbmUgVktfQU1EX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMyIDEKKyNkZWZpbmUgVktfQU1EX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfMl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19BTURfU0hBREVSX0NPUkVfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FICJWS19BTURfc2hhZGVyX2NvcmVfcHJvcGVydGllczIiCisKK3R5cGVkZWYgZW51bSBWa1NoYWRlckNvcmVQcm9wZXJ0aWVzRmxhZ0JpdHNBTUQgeworICAgIFZLX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfRkxBR19CSVRTX01BWF9FTlVNX0FNRCA9IDB4N0ZGRkZGRkYKK30gVmtTaGFkZXJDb3JlUHJvcGVydGllc0ZsYWdCaXRzQU1EOwordHlwZWRlZiBWa0ZsYWdzIFZrU2hhZGVyQ29yZVByb3BlcnRpZXNGbGFnc0FNRDsKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTaGFkZXJDb3JlUHJvcGVydGllc0ZsYWdzQU1EICAgIHNoYWRlckNvcmVGZWF0dXJlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ29tcHV0ZVVuaXRDb3VudDsKK30gVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRDsKKworCisKKyNkZWZpbmUgVktfQU1EX2RldmljZV9jb2hlcmVudF9tZW1vcnkgMQorI2RlZmluZSBWS19BTURfREVWSUNFX0NPSEVSRU5UX01FTU9SWV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19BTURfREVWSUNFX0NPSEVSRU5UX01FTU9SWV9FWFRFTlNJT05fTkFNRSAiVktfQU1EX2RldmljZV9jb2hlcmVudF9tZW1vcnkiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZGV2aWNlQ29oZXJlbnRNZW1vcnk7Cit9IFZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EOworCisKKworI2RlZmluZSBWS19FWFRfbWVtb3J5X2J1ZGdldCAxCisjZGVmaW5lIFZLX0VYVF9NRU1PUllfQlVER0VUX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9NRU1PUllfQlVER0VUX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfbWVtb3J5X2J1ZGdldCIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICBoZWFwQnVkZ2V0W1ZLX01BWF9NRU1PUllfSEVBUFNdOworICAgIFZrRGV2aWNlU2l6ZSAgICAgICBoZWFwVXNhZ2VbVktfTUFYX01FTU9SWV9IRUFQU107Cit9IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUOworCisKKworI2RlZmluZSBWS19FWFRfbWVtb3J5X3ByaW9yaXR5IDEKKyNkZWZpbmUgVktfRVhUX01FTU9SWV9QUklPUklUWV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfTUVNT1JZX1BSSU9SSVRZX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfbWVtb3J5X3ByaW9yaXR5IgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIG1lbW9yeVByaW9yaXR5OworfSBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgcHJpb3JpdHk7Cit9IFZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQ7CisKKworCisjZGVmaW5lIFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nIDEKKyNkZWZpbmUgVktfTlZfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfTlZfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRVhURU5TSU9OX05BTUUgIlZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmc7Cit9IFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlY7CisKKworCisjZGVmaW5lIFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MgMQorI2RlZmluZSBWS19FWFRfQlVGRkVSX0RFVklDRV9BRERSRVNTX1NQRUNfVkVSU0lPTiAyCisjZGVmaW5lIFZLX0VYVF9CVUZGRVJfREVWSUNFX0FERFJFU1NfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBidWZmZXJEZXZpY2VBZGRyZXNzOworICAgIFZrQm9vbDMyICAgICAgICAgICBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlOworfSBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUOworCit0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgVmtQaHlzaWNhbERldmljZUJ1ZmZlckFkZHJlc3NGZWF0dXJlc0VYVDsKKwordHlwZWRlZiBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9FWFQ7CisKK3R5cGVkZWYgc3RydWN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgVmtEZXZpY2VBZGRyZXNzICAgIGRldmljZUFkZHJlc3M7Cit9IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ7CisKK3R5cGVkZWYgVmtEZXZpY2VBZGRyZXNzIChWS0FQSV9QVFIgKlBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8pOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtEZXZpY2VBZGRyZXNzIFZLQVBJX0NBTEwgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pOworI2VuZGlmCisKKworI2RlZmluZSBWS19FWFRfdG9vbGluZ19pbmZvIDEKKyNkZWZpbmUgVktfRVhUX1RPT0xJTkdfSU5GT19TUEVDX1ZFUlNJT04gIDEKKyNkZWZpbmUgVktfRVhUX1RPT0xJTkdfSU5GT19FWFRFTlNJT05fTkFNRSAiVktfRVhUX3Rvb2xpbmdfaW5mbyIKKwordHlwZWRlZiBlbnVtIFZrVG9vbFB1cnBvc2VGbGFnQml0c0VYVCB7CisgICAgVktfVE9PTF9QVVJQT1NFX1ZBTElEQVRJT05fQklUX0VYVCA9IDB4MDAwMDAwMDEsCisgICAgVktfVE9PTF9QVVJQT1NFX1BST0ZJTElOR19CSVRfRVhUID0gMHgwMDAwMDAwMiwKKyAgICBWS19UT09MX1BVUlBPU0VfVFJBQ0lOR19CSVRfRVhUID0gMHgwMDAwMDAwNCwKKyAgICBWS19UT09MX1BVUlBPU0VfQURESVRJT05BTF9GRUFUVVJFU19CSVRfRVhUID0gMHgwMDAwMDAwOCwKKyAgICBWS19UT09MX1BVUlBPU0VfTU9ESUZZSU5HX0ZFQVRVUkVTX0JJVF9FWFQgPSAweDAwMDAwMDEwLAorICAgIFZLX1RPT0xfUFVSUE9TRV9ERUJVR19SRVBPUlRJTkdfQklUX0VYVCA9IDB4MDAwMDAwMjAsCisgICAgVktfVE9PTF9QVVJQT1NFX0RFQlVHX01BUktFUlNfQklUX0VYVCA9IDB4MDAwMDAwNDAsCisgICAgVktfVE9PTF9QVVJQT1NFX0ZMQUdfQklUU19NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrVG9vbFB1cnBvc2VGbGFnQml0c0VYVDsKK3R5cGVkZWYgVmtGbGFncyBWa1Rvb2xQdXJwb3NlRmxhZ3NFWFQ7Cit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgIG5hbWVbVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkVdOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uW1ZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFXTsKKyAgICBWa1Rvb2xQdXJwb3NlRmxhZ3NFWFQgICAgcHVycG9zZXM7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgbGF5ZXJbVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkVdOworfSBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCkoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBUb29sQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogcFRvb2xQcm9wZXJ0aWVzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9vbENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogICAgICAgICAgcFRvb2xQcm9wZXJ0aWVzKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfRVhUX3NlcGFyYXRlX3N0ZW5jaWxfdXNhZ2UgMQorI2RlZmluZSBWS19FWFRfU0VQQVJBVEVfU1RFTkNJTF9VU0FHRV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfU0VQQVJBVEVfU1RFTkNJTF9VU0FHRV9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3NlcGFyYXRlX3N0ZW5jaWxfdXNhZ2UiCit0eXBlZGVmIHN0cnVjdCBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgcE5leHQ7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgc3RlbmNpbFVzYWdlOworfSBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDsKKworCisKKyNkZWZpbmUgVktfRVhUX3ZhbGlkYXRpb25fZmVhdHVyZXMgMQorI2RlZmluZSBWS19FWFRfVkFMSURBVElPTl9GRUFUVVJFU19TUEVDX1ZFUlNJT04gMgorI2RlZmluZSBWS19FWFRfVkFMSURBVElPTl9GRUFUVVJFU19FWFRFTlNJT05fTkFNRSAiVktfRVhUX3ZhbGlkYXRpb25fZmVhdHVyZXMiCisKK3R5cGVkZWYgZW51bSBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIHsKKyAgICBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9FWFQgPSAwLAorICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX1JFU0VSVkVfQklORElOR19TTE9UX0VYVCA9IDEsCisgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9CRVNUX1BSQUNUSUNFU19FWFQgPSAyLAorICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfQkVHSU5fUkFOR0VfRVhUID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhULAorICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfRU5EX1JBTkdFX0VYVCA9IFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfQkVTVF9QUkFDVElDRVNfRVhULAorICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfUkFOR0VfU0laRV9FWFQgPSAoVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9CRVNUX1BSQUNUSUNFU19FWFQgLSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9FWFQgKyAxKSwKKyAgICBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX01BWF9FTlVNX0VYVCA9IDB4N0ZGRkZGRkYKK30gVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVDsKKwordHlwZWRlZiBlbnVtIFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUIHsKKyAgICBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BTExfRVhUID0gMCwKKyAgICBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9TSEFERVJTX0VYVCA9IDEsCisgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVEhSRUFEX1NBRkVUWV9FWFQgPSAyLAorICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FQSV9QQVJBTUVURVJTX0VYVCA9IDMsCisgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfT0JKRUNUX0xJRkVUSU1FU19FWFQgPSA0LAorICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0NPUkVfQ0hFQ0tTX0VYVCA9IDUsCisgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVU5JUVVFX0hBTkRMRVNfRVhUID0gNiwKKyAgICBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9CRUdJTl9SQU5HRV9FWFQgPSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BTExfRVhULAorICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0VORF9SQU5HRV9FWFQgPSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9VTklRVUVfSEFORExFU19FWFQsCisgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfUkFOR0VfU0laRV9FWFQgPSAoVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVU5JUVVFX0hBTkRMRVNfRVhUIC0gVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQUxMX0VYVCArIDEpLAorICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX01BWF9FTlVNX0VYVCA9IDB4N0ZGRkZGRkYKK30gVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQ7Cit0eXBlZGVmIHN0cnVjdCBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQ7CisgICAgY29uc3QgVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCogICAgIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQ7CisgICAgY29uc3QgVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQqICAgIHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlczsKK30gVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQ7CisKKworCisjZGVmaW5lIFZLX05WX2Nvb3BlcmF0aXZlX21hdHJpeCAxCisjZGVmaW5lIFZLX05WX0NPT1BFUkFUSVZFX01BVFJJWF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19OVl9DT09QRVJBVElWRV9NQVRSSVhfRVhURU5TSU9OX05BTUUgIlZLX05WX2Nvb3BlcmF0aXZlX21hdHJpeCIKKwordHlwZWRlZiBlbnVtIFZrQ29tcG9uZW50VHlwZU5WIHsKKyAgICBWS19DT01QT05FTlRfVFlQRV9GTE9BVDE2X05WID0gMCwKKyAgICBWS19DT01QT05FTlRfVFlQRV9GTE9BVDMyX05WID0gMSwKKyAgICBWS19DT01QT05FTlRfVFlQRV9GTE9BVDY0X05WID0gMiwKKyAgICBWS19DT01QT05FTlRfVFlQRV9TSU5UOF9OViA9IDMsCisgICAgVktfQ09NUE9ORU5UX1RZUEVfU0lOVDE2X05WID0gNCwKKyAgICBWS19DT01QT05FTlRfVFlQRV9TSU5UMzJfTlYgPSA1LAorICAgIFZLX0NPTVBPTkVOVF9UWVBFX1NJTlQ2NF9OViA9IDYsCisgICAgVktfQ09NUE9ORU5UX1RZUEVfVUlOVDhfTlYgPSA3LAorICAgIFZLX0NPTVBPTkVOVF9UWVBFX1VJTlQxNl9OViA9IDgsCisgICAgVktfQ09NUE9ORU5UX1RZUEVfVUlOVDMyX05WID0gOSwKKyAgICBWS19DT01QT05FTlRfVFlQRV9VSU5UNjRfTlYgPSAxMCwKKyAgICBWS19DT01QT05FTlRfVFlQRV9CRUdJTl9SQU5HRV9OViA9IFZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUMTZfTlYsCisgICAgVktfQ09NUE9ORU5UX1RZUEVfRU5EX1JBTkdFX05WID0gVktfQ09NUE9ORU5UX1RZUEVfVUlOVDY0X05WLAorICAgIFZLX0NPTVBPTkVOVF9UWVBFX1JBTkdFX1NJWkVfTlYgPSAoVktfQ09NUE9ORU5UX1RZUEVfVUlOVDY0X05WIC0gVktfQ09NUE9ORU5UX1RZUEVfRkxPQVQxNl9OViArIDEpLAorICAgIFZLX0NPTVBPTkVOVF9UWVBFX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa0NvbXBvbmVudFR5cGVOVjsKKwordHlwZWRlZiBlbnVtIFZrU2NvcGVOViB7CisgICAgVktfU0NPUEVfREVWSUNFX05WID0gMSwKKyAgICBWS19TQ09QRV9XT1JLR1JPVVBfTlYgPSAyLAorICAgIFZLX1NDT1BFX1NVQkdST1VQX05WID0gMywKKyAgICBWS19TQ09QRV9RVUVVRV9GQU1JTFlfTlYgPSA1LAorICAgIFZLX1NDT1BFX0JFR0lOX1JBTkdFX05WID0gVktfU0NPUEVfREVWSUNFX05WLAorICAgIFZLX1NDT1BFX0VORF9SQU5HRV9OViA9IFZLX1NDT1BFX1FVRVVFX0ZBTUlMWV9OViwKKyAgICBWS19TQ09QRV9SQU5HRV9TSVpFX05WID0gKFZLX1NDT1BFX1FVRVVFX0ZBTUlMWV9OViAtIFZLX1NDT1BFX0RFVklDRV9OViArIDEpLAorICAgIFZLX1NDT1BFX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa1Njb3BlTlY7Cit0eXBlZGVmIHN0cnVjdCBWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICBNU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICBOU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICBLU2l6ZTsKKyAgICBWa0NvbXBvbmVudFR5cGVOViAgICBBVHlwZTsKKyAgICBWa0NvbXBvbmVudFR5cGVOViAgICBCVHlwZTsKKyAgICBWa0NvbXBvbmVudFR5cGVOViAgICBDVHlwZTsKKyAgICBWa0NvbXBvbmVudFR5cGVOViAgICBEVHlwZTsKKyAgICBWa1Njb3BlTlYgICAgICAgICAgICBzY29wZTsKK30gVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVjsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgY29vcGVyYXRpdmVNYXRyaXg7CisgICAgVmtCb29sMzIgICAgICAgICAgIGNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzOworfSBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTaGFkZXJTdGFnZUZsYWdzICAgIGNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzOworfSBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKiBwUHJvcGVydGllcyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogICAgICAgICAgICBwUHJvcGVydGllcyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlIDEKKyNkZWZpbmUgVktfTlZfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfTlZfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfRVhURU5TSU9OX05BTUUgIlZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlIgorCit0eXBlZGVmIGVudW0gVmtDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOViB7CisgICAgVktfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfTUVSR0VfTlYgPSAwLAorICAgIFZLX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX1RSVU5DQVRFX05WID0gMSwKKyAgICBWS19DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9CRUdJTl9SQU5HRV9OViA9IFZLX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX01FUkdFX05WLAorICAgIFZLX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0VORF9SQU5HRV9OViA9IFZLX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX1RSVU5DQVRFX05WLAorICAgIFZLX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX1JBTkdFX1NJWkVfTlYgPSAoVktfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfVFJVTkNBVEVfTlYgLSBWS19DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9NRVJHRV9OViArIDEpLAorICAgIFZLX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX01BWF9FTlVNX05WID0gMHg3RkZGRkZGRgorfSBWa0NvdmVyYWdlUmVkdWN0aW9uTW9kZU5WOwordHlwZWRlZiBWa0ZsYWdzIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlRmxhZ3NOVjsKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBjb3ZlcmFnZVJlZHVjdGlvbk1vZGU7Cit9IFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WOworCit0eXBlZGVmIHN0cnVjdCBWa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUZsYWdzTlYgICAgZmxhZ3M7CisgICAgVmtDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOViAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlUmVkdWN0aW9uTW9kZTsKK30gVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlY7CisKK3R5cGVkZWYgc3RydWN0IFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOViAgICBjb3ZlcmFnZVJlZHVjdGlvbk1vZGU7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICByYXN0ZXJpemF0aW9uU2FtcGxlczsKKyAgICBWa1NhbXBsZUNvdW50RmxhZ3MgICAgICAgICAgIGRlcHRoU3RlbmNpbFNhbXBsZXM7CisgICAgVmtTYW1wbGVDb3VudEZsYWdzICAgICAgICAgICBjb2xvclNhbXBsZXM7Cit9IFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBDb21iaW5hdGlvbkNvdW50LCBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogcENvbWJpbmF0aW9ucyk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tYmluYXRpb25Db3VudCwKKyAgICBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogICAgIHBDb21iaW5hdGlvbnMpOworI2VuZGlmCisKKworI2RlZmluZSBWS19FWFRfZnJhZ21lbnRfc2hhZGVyX2ludGVybG9jayAxCisjZGVmaW5lIFZLX0VYVF9GUkFHTUVOVF9TSEFERVJfSU5URVJMT0NLX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9GUkFHTUVOVF9TSEFERVJfSU5URVJMT0NLX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfZnJhZ21lbnRfc2hhZGVyX2ludGVybG9jayIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBmcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jazsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9jazsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jazsKK30gVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQ7CisKKworCisjZGVmaW5lIFZLX0VYVF95Y2Jjcl9pbWFnZV9hcnJheXMgMQorI2RlZmluZSBWS19FWFRfWUNCQ1JfSU1BR0VfQVJSQVlTX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9ZQ0JDUl9JTUFHRV9BUlJBWVNfRVhURU5TSU9OX05BTUUgIlZLX0VYVF95Y2Jjcl9pbWFnZV9hcnJheXMiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICB5Y2JjckltYWdlQXJyYXlzOworfSBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUOworCisKKworI2RlZmluZSBWS19FWFRfaGVhZGxlc3Nfc3VyZmFjZSAxCisjZGVmaW5lIFZLX0VYVF9IRUFETEVTU19TVVJGQUNFX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9IRUFETEVTU19TVVJGQUNFX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfaGVhZGxlc3Nfc3VyZmFjZSIKK3R5cGVkZWYgVmtGbGFncyBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUZsYWdzRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVGbGFnc0VYVCAgICBmbGFnczsKK30gVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCkoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfRVhUX2xpbmVfcmFzdGVyaXphdGlvbiAxCisjZGVmaW5lIFZLX0VYVF9MSU5FX1JBU1RFUklaQVRJT05fU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX0xJTkVfUkFTVEVSSVpBVElPTl9FWFRFTlNJT05fTkFNRSAiVktfRVhUX2xpbmVfcmFzdGVyaXphdGlvbiIKKwordHlwZWRlZiBlbnVtIFZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIHsKKyAgICBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVCA9IDAsCisgICAgVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfRVhUID0gMSwKKyAgICBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CUkVTRU5IQU1fRVhUID0gMiwKKyAgICBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9TTU9PVEhfRVhUID0gMywKKyAgICBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CRUdJTl9SQU5HRV9FWFQgPSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVCwKKyAgICBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9FTkRfUkFOR0VfRVhUID0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfU01PT1RIX0VYVCwKKyAgICBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SQU5HRV9TSVpFX0VYVCA9IChWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9TTU9PVEhfRVhUIC0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfREVGQVVMVF9FWFQgKyAxKSwKKyAgICBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUOwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtCb29sMzIgICAgICAgICAgIHJlY3Rhbmd1bGFyTGluZXM7CisgICAgVmtCb29sMzIgICAgICAgICAgIGJyZXNlbmhhbUxpbmVzOworICAgIFZrQm9vbDMyICAgICAgICAgICBzbW9vdGhMaW5lczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzOworICAgIFZrQm9vbDMyICAgICAgICAgICBzdGlwcGxlZEJyZXNlbmhhbUxpbmVzOworICAgIFZrQm9vbDMyICAgICAgICAgICBzdGlwcGxlZFNtb290aExpbmVzOworfSBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgbGluZVN1YlBpeGVsUHJlY2lzaW9uQml0czsKK30gVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0xpbmVSYXN0ZXJpemF0aW9uTW9kZUVYVCAgICBsaW5lUmFzdGVyaXphdGlvbk1vZGU7CisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgc3RpcHBsZWRMaW5lRW5hYmxlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlRmFjdG9yOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlUGF0dGVybjsKK30gVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrQ21kU2V0TGluZVN0aXBwbGVFWFQpKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBsaW5lU3RpcHBsZUZhY3RvciwgdWludDE2X3QgbGluZVN0aXBwbGVQYXR0ZXJuKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldExpbmVTdGlwcGxlRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlRmFjdG9yLAorICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVQYXR0ZXJuKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfRVhUX2hvc3RfcXVlcnlfcmVzZXQgMQorI2RlZmluZSBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSAiVktfRVhUX2hvc3RfcXVlcnlfcmVzZXQiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgaG9zdFF1ZXJ5UmVzZXQ7Cit9IFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUOworCit0eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqUEZOX3ZrUmVzZXRRdWVyeVBvb2xFWFQpKFZrRGV2aWNlIGRldmljZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50KTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1Jlc2V0UXVlcnlQb29sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpOworI2VuZGlmCisKKworI2RlZmluZSBWS19FWFRfaW5kZXhfdHlwZV91aW50OCAxCisjZGVmaW5lIFZLX0VYVF9JTkRFWF9UWVBFX1VJTlQ4X1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0VYVF9JTkRFWF9UWVBFX1VJTlQ4X0VYVEVOU0lPTl9OQU1FICJWS19FWFRfaW5kZXhfdHlwZV91aW50OCIKK3R5cGVkZWYgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBpbmRleFR5cGVVaW50ODsKK30gVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQ7CisKKworCisjZGVmaW5lIFZLX0VYVF9zaGFkZXJfZGVtb3RlX3RvX2hlbHBlcl9pbnZvY2F0aW9uIDEKKyNkZWZpbmUgVktfRVhUX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRVhURU5TSU9OX05BTUUgIlZLX0VYVF9zaGFkZXJfZGVtb3RlX3RvX2hlbHBlcl9pbnZvY2F0aW9uIgordHlwZWRlZiBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQm9vbDMyICAgICAgICAgICBzaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb247Cit9IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVDsKKworCisKKyNkZWZpbmUgVktfRVhUX3RleGVsX2J1ZmZlcl9hbGlnbm1lbnQgMQorI2RlZmluZSBWS19FWFRfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9FWFRFTlNJT05fTkFNRSAiVktfRVhUX3RleGVsX2J1ZmZlcl9hbGlnbm1lbnQiCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgdGV4ZWxCdWZmZXJBbGlnbm1lbnQ7Cit9IFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUOworCit0eXBlZGVmIHN0cnVjdCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRGV2aWNlU2l6ZSAgICAgICBzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlczsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQ7CisgICAgVmtEZXZpY2VTaXplICAgICAgIHVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzOworICAgIFZrQm9vbDMyICAgICAgICAgICB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudDsKK30gVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDsKKworCisKKyNkZWZpbmUgVktfR09PR0xFX3VzZXJfdHlwZSAxCisjZGVmaW5lIFZLX0dPT0dMRV9VU0VSX1RZUEVfU1BFQ19WRVJTSU9OICAxCisjZGVmaW5lIFZLX0dPT0dMRV9VU0VSX1RZUEVfRVhURU5TSU9OX05BTUUgIlZLX0dPT0dMRV91c2VyX3R5cGUiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fZnVjaHNpYS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fZnVjaHNpYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWJlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9mdWNoc2lhLmgKQEAgLTAsMCArMSw1NyBAQAorI2lmbmRlZiBWVUxLQU5fRlVDSFNJQV9IXworI2RlZmluZSBWVUxLQU5fRlVDSFNJQV9IXyAxCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisqKgorKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjZGVmaW5lIFZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UgMQorI2RlZmluZSBWS19GVUNIU0lBX0lNQUdFUElQRV9TVVJGQUNFX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0ZVQ0hTSUFfSU1BR0VQSVBFX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUgIlZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UiCit0eXBlZGVmIFZrRmxhZ3MgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlRmxhZ3NGVUNIU0lBOwordHlwZWRlZiBzdHJ1Y3QgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlRmxhZ3NGVUNIU0lBICAgIGZsYWdzOworICAgIHp4X2hhbmRsZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBpcGVIYW5kbGU7Cit9IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX2dncC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fZ2dwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzMDYxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX2dncC5oCkBAIC0wLDAgKzEsNjggQEAKKyNpZm5kZWYgVlVMS0FOX0dHUF9IXworI2RlZmluZSBWVUxLQU5fR0dQX0hfIDEKKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBWdWxrYW4gWE1MIEFQSSBSZWdpc3RyeS4KKyoqCisqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisKKyNkZWZpbmUgVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UgMQorI2RlZmluZSBWS19HR1BfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19HR1BfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSAiVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UiCit0eXBlZGVmIFZrRmxhZ3MgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUZsYWdzR0dQOwordHlwZWRlZiBzdHJ1Y3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUZsYWdzR0dQICAgIGZsYWdzOworICAgIEdncFN0cmVhbURlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjcmlwdG9yOworfSBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUDsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCkoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfR0dQX2ZyYW1lX3Rva2VuIDEKKyNkZWZpbmUgVktfR0dQX0ZSQU1FX1RPS0VOX1NQRUNfVkVSU0lPTiAgIDEKKyNkZWZpbmUgVktfR0dQX0ZSQU1FX1RPS0VOX0VYVEVOU0lPTl9OQU1FICJWS19HR1BfZnJhbWVfdG9rZW4iCit0eXBlZGVmIHN0cnVjdCBWa1ByZXNlbnRGcmFtZVRva2VuR0dQIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgIHBOZXh0OworICAgIEdncEZyYW1lVG9rZW4gICAgICBmcmFtZVRva2VuOworfSBWa1ByZXNlbnRGcmFtZVRva2VuR0dQOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5faW9zLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9pb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmVmMWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5faW9zLmgKQEAgLTAsMCArMSw1NyBAQAorI2lmbmRlZiBWVUxLQU5fSU9TX0hfCisjZGVmaW5lIFZVTEtBTl9JT1NfSF8gMQorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoKKyoqIFRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBLaHJvbm9zIFZ1bGthbiBYTUwgQVBJIFJlZ2lzdHJ5LgorKioKKyovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2RlZmluZSBWS19NVktfaW9zX3N1cmZhY2UgMQorI2RlZmluZSBWS19NVktfSU9TX1NVUkZBQ0VfU1BFQ19WRVJTSU9OICAgMgorI2RlZmluZSBWS19NVktfSU9TX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUgIlZLX01WS19pb3Nfc3VyZmFjZSIKK3R5cGVkZWYgVmtGbGFncyBWa0lPU1N1cmZhY2VDcmVhdGVGbGFnc01WSzsKK3R5cGVkZWYgc3RydWN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrSU9TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLICAgIGZsYWdzOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgIHBWaWV3OworfSBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZUlPU1N1cmZhY2VNVkspKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX21hY29zLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9tYWNvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTVkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9tYWNvcy5oCkBAIC0wLDAgKzEsNTcgQEAKKyNpZm5kZWYgVlVMS0FOX01BQ09TX0hfCisjZGVmaW5lIFZVTEtBTl9NQUNPU19IXyAxCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisqKgorKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjZGVmaW5lIFZLX01WS19tYWNvc19zdXJmYWNlIDEKKyNkZWZpbmUgVktfTVZLX01BQ09TX1NVUkZBQ0VfU1BFQ19WRVJTSU9OIDIKKyNkZWZpbmUgVktfTVZLX01BQ09TX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUgIlZLX01WS19tYWNvc19zdXJmYWNlIgordHlwZWRlZiBWa0ZsYWdzIFZrTWFjT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVks7Cit0eXBlZGVmIHN0cnVjdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa01hY09TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLICAgIGZsYWdzOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgcFZpZXc7Cit9IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSzsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVNYWNPU1N1cmZhY2VNVkspKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9tZXRhbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fbWV0YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGVjNjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fbWV0YWwuaApAQCAtMCwwICsxLDY0IEBACisjaWZuZGVmIFZVTEtBTl9NRVRBTF9IXworI2RlZmluZSBWVUxLQU5fTUVUQUxfSF8gMQorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoKKyoqIFRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBLaHJvbm9zIFZ1bGthbiBYTUwgQVBJIFJlZ2lzdHJ5LgorKioKKyovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2RlZmluZSBWS19FWFRfbWV0YWxfc3VyZmFjZSAxCisKKyNpZmRlZiBfX09CSkNfXworQGNsYXNzIENBTWV0YWxMYXllcjsKKyNlbHNlCit0eXBlZGVmIHZvaWQgQ0FNZXRhbExheWVyOworI2VuZGlmCisKKyNkZWZpbmUgVktfRVhUX01FVEFMX1NVUkZBQ0VfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfRVhUX01FVEFMX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9tZXRhbF9zdXJmYWNlIgordHlwZWRlZiBWa0ZsYWdzIFZrTWV0YWxTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQ7Cit0eXBlZGVmIHN0cnVjdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa01ldGFsU3VyZmFjZUNyZWF0ZUZsYWdzRVhUICAgIGZsYWdzOworICAgIGNvbnN0IENBTWV0YWxMYXllciogICAgICAgICAgICAgcExheWVyOworfSBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQ7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fdmkuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX3ZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiNjZmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX3ZpLmgKQEAgLTAsMCArMSw1NyBAQAorI2lmbmRlZiBWVUxLQU5fVklfSF8KKyNkZWZpbmUgVlVMS0FOX1ZJX0hfIDEKKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBWdWxrYW4gWE1MIEFQSSBSZWdpc3RyeS4KKyoqCisqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisKKyNkZWZpbmUgVktfTk5fdmlfc3VyZmFjZSAxCisjZGVmaW5lIFZLX05OX1ZJX1NVUkZBQ0VfU1BFQ19WRVJTSU9OICAgICAxCisjZGVmaW5lIFZLX05OX1ZJX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUgICAiVktfTk5fdmlfc3VyZmFjZSIKK3R5cGVkZWYgVmtGbGFncyBWa1ZpU3VyZmFjZUNyZWF0ZUZsYWdzTk47Cit0eXBlZGVmIHN0cnVjdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1ZpU3VyZmFjZUNyZWF0ZUZsYWdzTk4gICAgZmxhZ3M7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdzsKK30gVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk47CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlVmlTdXJmYWNlTk4pKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fd2F5bGFuZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fd2F5bGFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OWQwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl93YXlsYW5kLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBWVUxLQU5fV0FZTEFORF9IXworI2RlZmluZSBWVUxLQU5fV0FZTEFORF9IXyAxCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisqKgorKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjZGVmaW5lIFZLX0tIUl93YXlsYW5kX3N1cmZhY2UgMQorI2RlZmluZSBWS19LSFJfV0FZTEFORF9TVVJGQUNFX1NQRUNfVkVSU0lPTiA2CisjZGVmaW5lIFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUgIlZLX0tIUl93YXlsYW5kX3N1cmZhY2UiCit0eXBlZGVmIFZrRmxhZ3MgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUZsYWdzS0hSOwordHlwZWRlZiBzdHJ1Y3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUZsYWdzS0hSICAgIGZsYWdzOworICAgIHN0cnVjdCB3bF9kaXNwbGF5KiAgICAgICAgICAgICAgICBkaXNwbGF5OworICAgIHN0cnVjdCB3bF9zdXJmYWNlKiAgICAgICAgICAgICAgICBzdXJmYWNlOworfSBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUikoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpOwordHlwZWRlZiBWa0Jvb2wzMiAoVktBUElfUFRSICpQRk5fdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBzdHJ1Y3Qgd2xfZGlzcGxheSogZGlzcGxheSk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBzdHJ1Y3Qgd2xfZGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5fd2luMzIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX3dpbjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhMWRjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX3dpbjMyLmgKQEAgLTAsMCArMSwzMjggQEAKKyNpZm5kZWYgVlVMS0FOX1dJTjMyX0hfCisjZGVmaW5lIFZVTEtBTl9XSU4zMl9IXyAxCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisqKgorKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjZGVmaW5lIFZLX0tIUl93aW4zMl9zdXJmYWNlIDEKKyNkZWZpbmUgVktfS0hSX1dJTjMyX1NVUkZBQ0VfU1BFQ19WRVJTSU9OIDYKKyNkZWZpbmUgVktfS0hSX1dJTjMyX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUgIlZLX0tIUl93aW4zMl9zdXJmYWNlIgordHlwZWRlZiBWa0ZsYWdzIFZrV2luMzJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI7Cit0eXBlZGVmIHN0cnVjdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1dpbjMyU3VyZmFjZUNyZWF0ZUZsYWdzS0hSICAgIGZsYWdzOworICAgIEhJTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgaGluc3RhbmNlOworICAgIEhXTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZDsKK30gVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUikoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKK3R5cGVkZWYgVmtCb29sMzIgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCitWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIgMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfTUVNT1JZX1dJTjMyX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfV0lOMzJfRVhURU5TSU9OX05BTUUgIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIiCit0eXBlZGVmIHN0cnVjdCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgaGFuZGxlVHlwZTsKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICBMUENXU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Cit9IFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogICAgcEF0dHJpYnV0ZXM7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgZHdBY2Nlc3M7CisgICAgTFBDV1NUUiAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKK30gVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICBtZW1vcnlUeXBlQml0czsKK30gVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnk7CisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICBoYW5kbGVUeXBlOworfSBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKShWa0RldmljZSBkZXZpY2UsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgSEFORExFIGhhbmRsZSwgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqIHBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcyk7CisjZW5kaWYKKworCisjZGVmaW5lIFZLX0tIUl93aW4zMl9rZXllZF9tdXRleCAxCisjZGVmaW5lIFZLX0tIUl9XSU4zMl9LRVlFRF9NVVRFWF9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfV0lOMzJfS0VZRURfTVVURVhfRVhURU5TSU9OX05BTUUgIlZLX0tIUl93aW4zMl9rZXllZF9tdXRleCIKK3R5cGVkZWYgc3RydWN0IFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgIHBOZXh0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBhY3F1aXJlQ291bnQ7CisgICAgY29uc3QgVmtEZXZpY2VNZW1vcnkqICAgIHBBY3F1aXJlU3luY3M7CisgICAgY29uc3QgdWludDY0X3QqICAgICAgICAgIHBBY3F1aXJlS2V5czsKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgcEFjcXVpcmVUaW1lb3V0czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgcmVsZWFzZUNvdW50OworICAgIGNvbnN0IFZrRGV2aWNlTWVtb3J5KiAgICBwUmVsZWFzZVN5bmNzOworICAgIGNvbnN0IHVpbnQ2NF90KiAgICAgICAgICBwUmVsZWFzZUtleXM7Cit9IFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSOworCisKKworI2RlZmluZSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9XSU4zMl9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX1dJTjMyX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyIgordHlwZWRlZiBzdHJ1Y3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZTsKKyAgICBWa1NlbWFwaG9yZUltcG9ydEZsYWdzICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgICAgaGFuZGxlVHlwZTsKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICBMUENXU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Cit9IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogICAgcEF0dHJpYnV0ZXM7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgZHdBY2Nlc3M7CisgICAgTFBDV1NUUiAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKK30gVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgIHdhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudDsKKyAgICBjb25zdCB1aW50NjRfdCogICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXM7CisgICAgdWludDMyX3QgICAgICAgICAgIHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50OworICAgIGNvbnN0IHVpbnQ2NF90KiAgICBwU2lnbmFsU2VtYXBob3JlVmFsdWVzOworfSBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSOworCit0eXBlZGVmIHN0cnVjdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlOworICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgICAgaGFuZGxlVHlwZTsKK30gVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFI7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVktfS0hSX2V4dGVybmFsX2ZlbmNlX3dpbjMyIDEKKyNkZWZpbmUgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX1dJTjMyX1NQRUNfVkVSU0lPTiAxCisjZGVmaW5lIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9XSU4zMl9FWFRFTlNJT05fTkFNRSAiVktfS0hSX2V4dGVybmFsX2ZlbmNlX3dpbjMyIgordHlwZWRlZiBzdHJ1Y3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2U7CisgICAgVmtGZW5jZUltcG9ydEZsYWdzICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyAgICBoYW5kbGVUeXBlOworICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU7CisgICAgTFBDV1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Cit9IFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIGNvbnN0IFNFQ1VSSVRZX0FUVFJJQlVURVMqICAgIHBBdHRyaWJ1dGVzOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgIGR3QWNjZXNzOworICAgIExQQ1dTVFIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Cit9IFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI7CisKK3R5cGVkZWYgc3RydWN0IFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlOworICAgIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyAgICBoYW5kbGVUeXBlOworfSBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUikoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBwR2V0V2luMzJIYW5kbGVJbmZvLCBIQU5ETEUqIHBIYW5kbGUpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogICAgICBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpOworI2VuZGlmCisKKworI2RlZmluZSBWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIgMQorI2RlZmluZSBWS19OVl9FWFRFUk5BTF9NRU1PUllfV0lOMzJfU1BFQ19WRVJTSU9OIDEKKyNkZWZpbmUgVktfTlZfRVhURVJOQUxfTUVNT1JZX1dJTjMyX0VYVEVOU0lPTl9OQU1FICJWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIiCit0eXBlZGVmIHN0cnVjdCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICBoYW5kbGVUeXBlOworICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU7Cit9IFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY7CisKK3R5cGVkZWYgc3RydWN0IFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIGNvbnN0IFNFQ1VSSVRZX0FUVFJJQlVURVMqICAgIHBBdHRyaWJ1dGVzOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgIGR3QWNjZXNzOworfSBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WOworCit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlTlYpKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgaGFuZGxlVHlwZSwgSEFORExFKiBwSGFuZGxlKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpOworI2VuZGlmCisKKworI2RlZmluZSBWS19OVl93aW4zMl9rZXllZF9tdXRleCAxCisjZGVmaW5lIFZLX05WX1dJTjMyX0tFWUVEX01VVEVYX1NQRUNfVkVSU0lPTiAyCisjZGVmaW5lIFZLX05WX1dJTjMyX0tFWUVEX01VVEVYX0VYVEVOU0lPTl9OQU1FICJWS19OVl93aW4zMl9rZXllZF9tdXRleCIKK3R5cGVkZWYgc3RydWN0IFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgcE5leHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgIGFjcXVpcmVDb3VudDsKKyAgICBjb25zdCBWa0RldmljZU1lbW9yeSogICAgcEFjcXVpcmVTeW5jczsKKyAgICBjb25zdCB1aW50NjRfdCogICAgICAgICAgcEFjcXVpcmVLZXlzOworICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgIHJlbGVhc2VDb3VudDsKKyAgICBjb25zdCBWa0RldmljZU1lbW9yeSogICAgcFJlbGVhc2VTeW5jczsKKyAgICBjb25zdCB1aW50NjRfdCogICAgICAgICAgcFJlbGVhc2VLZXlzOworfSBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WOworCisKKworI2RlZmluZSBWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlIDEKKyNkZWZpbmUgVktfRVhUX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9TUEVDX1ZFUlNJT04gNAorI2RlZmluZSBWS19FWFRfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVEVOU0lPTl9OQU1FICJWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlIgorCit0eXBlZGVmIGVudW0gVmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIHsKKyAgICBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfREVGQVVMVF9FWFQgPSAwLAorICAgIFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BTExPV0VEX0VYVCA9IDEsCisgICAgVktfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0RJU0FMTE9XRURfRVhUID0gMiwKKyAgICBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQVBQTElDQVRJT05fQ09OVFJPTExFRF9FWFQgPSAzLAorICAgIFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9CRUdJTl9SQU5HRV9FWFQgPSBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfREVGQVVMVF9FWFQsCisgICAgVktfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VORF9SQU5HRV9FWFQgPSBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQVBQTElDQVRJT05fQ09OVFJPTExFRF9FWFQsCisgICAgVktfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX1JBTkdFX1NJWkVfRVhUID0gKFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BUFBMSUNBVElPTl9DT05UUk9MTEVEX0VYVCAtIFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9ERUZBVUxUX0VYVCArIDEpLAorICAgIFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9NQVhfRU5VTV9FWFQgPSAweDdGRkZGRkZGCit9IFZrRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDsKK3R5cGVkZWYgc3RydWN0IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgc1R5cGU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCAgICBmdWxsU2NyZWVuRXhjbHVzaXZlOworfSBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIHZvaWQqICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgZnVsbFNjcmVlbkV4Y2x1c2l2ZVN1cHBvcnRlZDsKK30gVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICBwTmV4dDsKKyAgICBITU9OSVRPUiAgICAgICAgICAgaG1vbml0b3I7Cit9IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQ7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCkoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLCB1aW50MzJfdCogcFByZXNlbnRNb2RlQ291bnQsIFZrUHJlc2VudE1vZGVLSFIqIHBQcmVzZW50TW9kZXMpOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQpKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKShWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbik7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQpKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLCBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogcE1vZGVzKTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX3hjYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9pbmNsdWRlL3Z1bGthbi92dWxrYW5feGNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjMGJjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX3hjYi5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgVlVMS0FOX1hDQl9IXworI2RlZmluZSBWVUxLQU5fWENCX0hfIDEKKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBWdWxrYW4gWE1MIEFQSSBSZWdpc3RyeS4KKyoqCisqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisKKyNkZWZpbmUgVktfS0hSX3hjYl9zdXJmYWNlIDEKKyNkZWZpbmUgVktfS0hSX1hDQl9TVVJGQUNFX1NQRUNfVkVSU0lPTiAgIDYKKyNkZWZpbmUgVktfS0hSX1hDQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FICJWS19LSFJfeGNiX3N1cmZhY2UiCit0eXBlZGVmIFZrRmxhZ3MgVmtYY2JTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI7Cit0eXBlZGVmIHN0cnVjdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1hjYlN1cmZhY2VDcmVhdGVGbGFnc0tIUiAgICBmbGFnczsKKyAgICB4Y2JfY29ubmVjdGlvbl90KiAgICAgICAgICAgICBjb25uZWN0aW9uOworICAgIHhjYl93aW5kb3dfdCAgICAgICAgICAgICAgICAgIHdpbmRvdzsKK30gVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKKwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSKShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKK3R5cGVkZWYgVmtCb29sMzIgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB4Y2JfY29ubmVjdGlvbl90KiBjb25uZWN0aW9uLCB4Y2JfdmlzdWFsaWRfdCB2aXN1YWxfaWQpOworCisjaWZuZGVmIFZLX05PX1BST1RPVFlQRVMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVhjYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHhjYl9jb25uZWN0aW9uX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICB4Y2JfdmlzdWFsaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbF9pZCk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl94bGliLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl94bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyYjQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX3hsaWIuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIFZVTEtBTl9YTElCX0hfCisjZGVmaW5lIFZVTEtBTl9YTElCX0hfIDEKKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBWdWxrYW4gWE1MIEFQSSBSZWdpc3RyeS4KKyoqCisqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisKKyNkZWZpbmUgVktfS0hSX3hsaWJfc3VyZmFjZSAxCisjZGVmaW5lIFZLX0tIUl9YTElCX1NVUkZBQ0VfU1BFQ19WRVJTSU9OICA2CisjZGVmaW5lIFZLX0tIUl9YTElCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUgIlZLX0tIUl94bGliX3N1cmZhY2UiCit0eXBlZGVmIFZrRmxhZ3MgVmtYbGliU3VyZmFjZUNyZWF0ZUZsYWdzS0hSOwordHlwZWRlZiBzdHJ1Y3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgICBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgcE5leHQ7CisgICAgVmtYbGliU3VyZmFjZUNyZWF0ZUZsYWdzS0hSICAgIGZsYWdzOworICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICBkcHk7CisgICAgV2luZG93ICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdzsKK30gVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFI7CisKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKK3R5cGVkZWYgVmtCb29sMzIgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGxheSogZHB5LCBWaXN1YWxJRCB2aXN1YWxJRCk7CisKKyNpZm5kZWYgVktfTk9fUFJPVE9UWVBFUworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWaXN1YWxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbElEKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvaW5jbHVkZS92dWxrYW4vdnVsa2FuX3hsaWJfeHJhbmRyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl94bGliX3hyYW5kci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzRmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl94bGliX3hyYW5kci5oCkBAIC0wLDAgKzEsNTUgQEAKKyNpZm5kZWYgVlVMS0FOX1hMSUJfWFJBTkRSX0hfCisjZGVmaW5lIFZVTEtBTl9YTElCX1hSQU5EUl9IXyAxCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisqKgorKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjZGVmaW5lIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSAxCisjZGVmaW5lIFZLX0VYVF9BQ1FVSVJFX1hMSUJfRElTUExBWV9TUEVDX1ZFUlNJT04gMQorI2RlZmluZSBWS19FWFRfQUNRVUlSRV9YTElCX0RJU1BMQVlfRVhURU5TSU9OX05BTUUgIlZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSIKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5KiBkcHksIFZrRGlzcGxheUtIUiBkaXNwbGF5KTsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5KiBkcHksIFJST3V0cHV0IHJyT3V0cHV0LCBWa0Rpc3BsYXlLSFIqIHBEaXNwbGF5KTsKKworI2lmbmRlZiBWS19OT19QUk9UT1RZUEVTCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBSUk91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyT3V0cHV0LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXkpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS9jZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS9jZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTZlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L2NnZW5lcmF0b3IucHkKQEAgLTAsMCArMSw0MTIgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMyAtaQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgKEdlbmVyYXRvck9wdGlvbnMsIE91dHB1dEdlbmVyYXRvciwgbm9uZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVnU29ydEZlYXR1cmVzLCB3cml0ZSkKKworCitjbGFzcyBDR2VuZXJhdG9yT3B0aW9ucyhHZW5lcmF0b3JPcHRpb25zKToKKyAgICAiIiJDR2VuZXJhdG9yT3B0aW9ucyAtIHN1YmNsYXNzIG9mIEdlbmVyYXRvck9wdGlvbnMuCisKKyAgICBBZGRzIG9wdGlvbnMgdXNlZCBieSBDT3V0cHV0R2VuZXJhdG9yIG9iamVjdHMgZHVyaW5nIEMgbGFuZ3VhZ2UgaGVhZGVyCisgICAgZ2VuZXJhdGlvbi4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcmVmaXhUZXh0PSIiLAorICAgICAgICAgICAgICAgICBnZW5GdW5jUG9pbnRlcnM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdEZpbGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdEZlYXR1cmU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdFByb3RvPU5vbmUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RQcm90b1N0cj1Ob25lLAorICAgICAgICAgICAgICAgICBhcGljYWxsPScnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeT0nJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnlwPScnLAorICAgICAgICAgICAgICAgICBpbmRlbnRGdW5jUHJvdG89VHJ1ZSwKKyAgICAgICAgICAgICAgICAgaW5kZW50RnVuY1BvaW50ZXI9RmFsc2UsCisgICAgICAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtPTAsCisgICAgICAgICAgICAgICAgIGdlbkVudW1CZWdpbkVuZFJhbmdlPUZhbHNlLAorICAgICAgICAgICAgICAgICBnZW5BbGlhc01hY3JvPUZhbHNlLAorICAgICAgICAgICAgICAgICBhbGlhc01hY3JvPScnLAorICAgICAgICAgICAgICAgICAqKmt3YXJncworICAgICAgICAgICAgICAgICApOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4KKyAgICAgICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGJleW9uZCBwYXJlbnQgY2xhc3M6CisKKyAgICAgICAgLSBwcmVmaXhUZXh0IC0gbGlzdCBvZiBzdHJpbmdzIHRvIHByZWZpeCBnZW5lcmF0ZWQgaGVhZGVyIHdpdGgKKyAgICAgICAgKHVzdWFsbHkgYSBjb3B5cmlnaHQgc3RhdGVtZW50ICsgY2FsbGluZyBjb252ZW50aW9uIG1hY3JvcykuCisgICAgICAgIC0gcHJvdGVjdEZpbGUgLSBUcnVlIGlmIG11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0aW9uIHNob3VsZCBiZQorICAgICAgICBnZW5lcmF0ZWQgKGJhc2VkIG9uIHRoZSBmaWxlbmFtZSkgYXJvdW5kIHRoZSBlbnRpcmUgaGVhZGVyLgorICAgICAgICAtIHByb3RlY3RGZWF0dXJlIC0gVHJ1ZSBpZiAjaWZuZGVmLi4jZW5kaWYgcHJvdGVjdGlvbiBzaG91bGQgYmUKKyAgICAgICAgZ2VuZXJhdGVkIGFyb3VuZCBhIGZlYXR1cmUgaW50ZXJmYWNlIGluIHRoZSBoZWFkZXIgZmlsZS4KKyAgICAgICAgLSBnZW5GdW5jUG9pbnRlcnMgLSBUcnVlIGlmIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMgc2hvdWxkIGJlCisgICAgICAgIGdlbmVyYXRlZAorICAgICAgICAtIHByb3RlY3RQcm90byAtIElmIGNvbmRpdGlvbmFsIHByb3RlY3Rpb24gc2hvdWxkIGJlIGdlbmVyYXRlZAorICAgICAgICBhcm91bmQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgc2V0IHRvIGVpdGhlciAnI2lmZGVmJworICAgICAgICB0byByZXF1aXJlIG9wdC1pbiAoI2lmZGVmIHByb3RlY3RQcm90b1N0cikgb3IgJyNpZm5kZWYnCisgICAgICAgIHRvIHJlcXVpcmUgb3B0LW91dCAoI2lmbmRlZiBwcm90ZWN0UHJvdG9TdHIpLiBPdGhlcndpc2UKKyAgICAgICAgc2V0IHRvIE5vbmUuCisgICAgICAgIC0gcHJvdGVjdFByb3RvU3RyIC0gI2lmZGVmLyNpZm5kZWYgc3ltYm9sIHRvIHVzZSBhcm91bmQgcHJvdG90eXBlCisgICAgICAgIGRlY2xhcmF0aW9ucywgaWYgcHJvdGVjdFByb3RvIGlzIHNldAorICAgICAgICAtIGFwaWNhbGwgLSBzdHJpbmcgdG8gdXNlIGZvciB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gcHJlZml4LAorICAgICAgICBzdWNoIGFzIEFQSUNBTEwgb24gV2luZG93cy4KKyAgICAgICAgLSBhcGllbnRyeSAtIHN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8sCisgICAgICAgIGluIHR5cGVkZWZzLCBzdWNoIGFzIEFQSUVOVFJZLgorICAgICAgICAtIGFwaWVudHJ5cCAtIHN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8KKyAgICAgICAgaW4gZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmcywgc3VjaCBhcyBBUElFTlRSWVAuCisgICAgICAgIC0gaW5kZW50RnVuY1Byb3RvIC0gVHJ1ZSBpZiBwcm90b3R5cGUgZGVjbGFyYXRpb25zIHNob3VsZCBwdXQgZWFjaAorICAgICAgICBwYXJhbWV0ZXIgb24gYSBzZXBhcmF0ZSBsaW5lCisgICAgICAgIC0gaW5kZW50RnVuY1BvaW50ZXIgLSBUcnVlIGlmIHR5cGVkZWZlZCBmdW5jdGlvbiBwb2ludGVycyBzaG91bGQgcHV0IGVhY2gKKyAgICAgICAgcGFyYW1ldGVyIG9uIGEgc2VwYXJhdGUgbGluZQorICAgICAgICAtIGFsaWduRnVuY1BhcmFtIC0gaWYgbm9uemVybyBhbmQgcGFyYW1ldGVycyBhcmUgYmVpbmcgcHV0IG9uIGEKKyAgICAgICAgc2VwYXJhdGUgbGluZSwgYWxpZ24gcGFyYW1ldGVyIG5hbWVzIGF0IHRoZSBzcGVjaWZpZWQgY29sdW1uCisgICAgICAgIC0gZ2VuRW51bUJlZ2luRW5kUmFuZ2UgLSBUcnVlIGlmIEJFR0lOX1JBTkdFIC8gRU5EX1JBTkdFIG1hY3JvcyBzaG91bGQKKyAgICAgICAgYmUgZ2VuZXJhdGVkIGZvciBlbnVtZXJhdGVkIHR5cGVzCisgICAgICAgIC0gZ2VuQWxpYXNNYWNybyAtIFRydWUgaWYgdGhlIE9wZW5YUiBhbGlhcyBtYWNybyBzaG91bGQgYmUgZ2VuZXJhdGVkCisgICAgICAgIGZvciBhbGlhc2VkIHR5cGVzICh1bmNsZWFyIHdoYXQgb3RoZXIgY2lyY3Vtc3RhbmNlcyB0aGlzIGlzIHVzZWZ1bCkKKyAgICAgICAgLSBhbGlhc01hY3JvIC0gYWxpYXMgbWFjcm8gdG8gaW5qZWN0IHdoZW4gZ2VuQWxpYXNNYWNybyBpcyBUcnVlIiIiCisgICAgICAgIEdlbmVyYXRvck9wdGlvbnMuX19pbml0X18oc2VsZiwgKiprd2FyZ3MpCisKKyAgICAgICAgc2VsZi5wcmVmaXhUZXh0ID0gcHJlZml4VGV4dAorICAgICAgICAiIiJsaXN0IG9mIHN0cmluZ3MgdG8gcHJlZml4IGdlbmVyYXRlZCBoZWFkZXIgd2l0aCAodXN1YWxseSBhIGNvcHlyaWdodCBzdGF0ZW1lbnQgKyBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm9zKS4iIiIKKworICAgICAgICBzZWxmLmdlbkZ1bmNQb2ludGVycyA9IGdlbkZ1bmNQb2ludGVycworICAgICAgICAiIiJUcnVlIGlmIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMgc2hvdWxkIGJlIGdlbmVyYXRlZCIiIgorCisgICAgICAgIHNlbGYucHJvdGVjdEZpbGUgPSBwcm90ZWN0RmlsZQorICAgICAgICAiIiJUcnVlIGlmIG11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0aW9uIHNob3VsZCBiZSBnZW5lcmF0ZWQgKGJhc2VkIG9uIHRoZSBmaWxlbmFtZSkgYXJvdW5kIHRoZSBlbnRpcmUgaGVhZGVyLiIiIgorCisgICAgICAgIHNlbGYucHJvdGVjdEZlYXR1cmUgPSBwcm90ZWN0RmVhdHVyZQorICAgICAgICAiIiJUcnVlIGlmICNpZm5kZWYuLiNlbmRpZiBwcm90ZWN0aW9uIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXJvdW5kIGEgZmVhdHVyZSBpbnRlcmZhY2UgaW4gdGhlIGhlYWRlciBmaWxlLiIiIgorCisgICAgICAgIHNlbGYucHJvdGVjdFByb3RvID0gcHJvdGVjdFByb3RvCisgICAgICAgICIiIklmIGNvbmRpdGlvbmFsIHByb3RlY3Rpb24gc2hvdWxkIGJlIGdlbmVyYXRlZCBhcm91bmQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgc2V0IHRvIGVpdGhlciAnI2lmZGVmJyB0byByZXF1aXJlIG9wdC1pbiAoI2lmZGVmIHByb3RlY3RQcm90b1N0cikgb3IgJyNpZm5kZWYnIHRvIHJlcXVpcmUgb3B0LW91dCAoI2lmbmRlZiBwcm90ZWN0UHJvdG9TdHIpLiBPdGhlcndpc2Ugc2V0IHRvIE5vbmUuIiIiCisKKyAgICAgICAgc2VsZi5wcm90ZWN0UHJvdG9TdHIgPSBwcm90ZWN0UHJvdG9TdHIKKyAgICAgICAgIiIiI2lmZGVmLyNpZm5kZWYgc3ltYm9sIHRvIHVzZSBhcm91bmQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgaWYgcHJvdGVjdFByb3RvIGlzIHNldCIiIgorCisgICAgICAgIHNlbGYuYXBpY2FsbCA9IGFwaWNhbGwKKyAgICAgICAgIiIic3RyaW5nIHRvIHVzZSBmb3IgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHByZWZpeCwgc3VjaCBhcyBBUElDQUxMIG9uIFdpbmRvd3MuIiIiCisKKyAgICAgICAgc2VsZi5hcGllbnRyeSA9IGFwaWVudHJ5CisgICAgICAgICIiInN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8sIGluIHR5cGVkZWZzLCBzdWNoIGFzIEFQSUVOVFJZLiIiIgorCisgICAgICAgIHNlbGYuYXBpZW50cnlwID0gYXBpZW50cnlwCisgICAgICAgICIiInN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8gaW4gZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmcywgc3VjaCBhcyBBUElFTlRSWVAuIiIiCisKKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUHJvdG8gPSBpbmRlbnRGdW5jUHJvdG8KKyAgICAgICAgIiIiVHJ1ZSBpZiBwcm90b3R5cGUgZGVjbGFyYXRpb25zIHNob3VsZCBwdXQgZWFjaCBwYXJhbWV0ZXIgb24gYSBzZXBhcmF0ZSBsaW5lIiIiCisKKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUG9pbnRlciA9IGluZGVudEZ1bmNQb2ludGVyCisgICAgICAgICIiIlRydWUgaWYgdHlwZWRlZmVkIGZ1bmN0aW9uIHBvaW50ZXJzIHNob3VsZCBwdXQgZWFjaCBwYXJhbWV0ZXIgb24gYSBzZXBhcmF0ZSBsaW5lIiIiCisKKyAgICAgICAgc2VsZi5hbGlnbkZ1bmNQYXJhbSA9IGFsaWduRnVuY1BhcmFtCisgICAgICAgICIiImlmIG5vbnplcm8gYW5kIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHB1dCBvbiBhIHNlcGFyYXRlIGxpbmUsIGFsaWduIHBhcmFtZXRlciBuYW1lcyBhdCB0aGUgc3BlY2lmaWVkIGNvbHVtbiIiIgorCisgICAgICAgIHNlbGYuZ2VuRW51bUJlZ2luRW5kUmFuZ2UgPSBnZW5FbnVtQmVnaW5FbmRSYW5nZQorICAgICAgICAiIiJUcnVlIGlmIEJFR0lOX1JBTkdFIC8gRU5EX1JBTkdFIG1hY3JvcyBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciBlbnVtZXJhdGVkIHR5cGVzIiIiCisKKyAgICAgICAgc2VsZi5nZW5BbGlhc01hY3JvID0gZ2VuQWxpYXNNYWNybworICAgICAgICAiIiJUcnVlIGlmIHRoZSBPcGVuWFIgYWxpYXMgbWFjcm8gc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgYWxpYXNlZCB0eXBlcyAodW5jbGVhciB3aGF0IG90aGVyIGNpcmN1bXN0YW5jZXMgdGhpcyBpcyB1c2VmdWwpIiIiCisKKyAgICAgICAgc2VsZi5hbGlhc01hY3JvID0gYWxpYXNNYWNybworICAgICAgICAiIiJhbGlhcyBtYWNybyB0byBpbmplY3Qgd2hlbiBnZW5BbGlhc01hY3JvIGlzIFRydWUiIiIKKworCitjbGFzcyBDT3V0cHV0R2VuZXJhdG9yKE91dHB1dEdlbmVyYXRvcik6CisgICAgIiIiR2VuZXJhdGVzIEMtbGFuZ3VhZ2UgQVBJIGludGVyZmFjZXMuIiIiCisKKyAgICAjIFRoaXMgaXMgYW4gb3JkZXJlZCBsaXN0IG9mIHNlY3Rpb25zIGluIHRoZSBoZWFkZXIgZmlsZS4KKyAgICBUWVBFX1NFQ1RJT05TID0gWydpbmNsdWRlJywgJ2RlZmluZScsICdiYXNldHlwZScsICdoYW5kbGUnLCAnZW51bScsCisgICAgICAgICAgICAgICAgICAgICAnZ3JvdXAnLCAnYml0bWFzaycsICdmdW5jcG9pbnRlcicsICdzdHJ1Y3QnXQorICAgIEFMTF9TRUNUSU9OUyA9IFRZUEVfU0VDVElPTlMgKyBbJ2NvbW1hbmRQb2ludGVyJywgJ2NvbW1hbmQnXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAjIEludGVybmFsIHN0YXRlIC0gYWNjdW11bGF0b3JzIGZvciBkaWZmZXJlbnQgaW5uZXIgYmxvY2sgdGV4dAorICAgICAgICBzZWxmLnNlY3Rpb25zID0ge3NlY3Rpb246IFtdIGZvciBzZWN0aW9uIGluIHNlbGYuQUxMX1NFQ1RJT05TfQorICAgICAgICBzZWxmLmZlYXR1cmVfbm90X2VtcHR5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5tYXlfYWxpYXMgPSBOb25lCisKKyAgICBkZWYgYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpCisgICAgICAgICMgQy1zcGVjaWZpYworICAgICAgICAjCisgICAgICAgICMgTXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gJiBDKysgd3JhcHBlcnMuCisgICAgICAgIGlmIGdlbk9wdHMucHJvdGVjdEZpbGUgYW5kIHNlbGYuZ2VuT3B0cy5maWxlbmFtZToKKyAgICAgICAgICAgIGhlYWRlclN5bSA9IHJlLnN1YihyJ1wuaCcsICdfaF8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5nZW5PcHRzLmZpbGVuYW1lKSkudXBwZXIoKQorICAgICAgICAgICAgd3JpdGUoJyNpZm5kZWYnLCBoZWFkZXJTeW0sIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJyNkZWZpbmUnLCBoZWFkZXJTeW0sICcxJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorCisgICAgICAgICMgVXNlci1zdXBwbGllZCBwcmVmaXggdGV4dCwgaWYgYW55IChsaXN0IG9mIHN0cmluZ3MpCisgICAgICAgIGlmIGdlbk9wdHMucHJlZml4VGV4dDoKKyAgICAgICAgICAgIGZvciBzIGluIGdlbk9wdHMucHJlZml4VGV4dDoKKyAgICAgICAgICAgICAgICB3cml0ZShzLCBmaWxlPXNlbGYub3V0RmlsZSkKKworICAgICAgICAjIEMrKyBleHRlcm4gd3JhcHBlciAtIGFmdGVyIHByZWZpeCBsaW5lcyBzbyB0aGV5IGNhbiBhZGQgaW5jbHVkZXMuCisgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgIHdyaXRlKCcjaWZkZWYgX19jcGx1c3BsdXMnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUoJ2V4dGVybiAiQyIgeycsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICB3cml0ZSgnI2VuZGlmJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIHNlbGYubmV3bGluZSgpCisKKyAgICBkZWYgZW5kRmlsZShzZWxmKToKKyAgICAgICAgIyBDLXNwZWNpZmljCisgICAgICAgICMgRmluaXNoIEMrKyB3cmFwcGVyIGFuZCBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbgorICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICB3cml0ZSgnI2lmZGVmIF9fY3BsdXNwbHVzJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIHdyaXRlKCd9JywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIHdyaXRlKCcjZW5kaWYnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgaWYgc2VsZi5nZW5PcHRzLnByb3RlY3RGaWxlIGFuZCBzZWxmLmdlbk9wdHMuZmlsZW5hbWU6CisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgd3JpdGUoJyNlbmRpZicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAjIEZpbmlzaCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmVuZEZpbGUoc2VsZikKKworICAgIGRlZiBiZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KToKKyAgICAgICAgIyBTdGFydCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpCisgICAgICAgICMgQy1zcGVjaWZpYworICAgICAgICAjIEFjY3VtdWxhdGUgaW5jbHVkZXMsIGRlZmluZXMsIHR5cGVzLCBlbnVtcywgZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmcywKKyAgICAgICAgIyBlbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBzZXBhcmF0ZWx5IGZvciB0aGlzIGZlYXR1cmUuIFRoZXkncmUgb25seQorICAgICAgICAjIHByaW50ZWQgaW4gZW5kRmVhdHVyZSgpLgorICAgICAgICBzZWxmLnNlY3Rpb25zID0ge3NlY3Rpb246IFtdIGZvciBzZWN0aW9uIGluIHNlbGYuQUxMX1NFQ1RJT05TfQorICAgICAgICBzZWxmLmZlYXR1cmVfbm90X2VtcHR5ID0gRmFsc2UKKworICAgIGRlZiBlbmRGZWF0dXJlKHNlbGYpOgorICAgICAgICAiQWN0dWFsbHkgd3JpdGUgdGhlIGludGVyZmFjZSB0byB0aGUgb3V0cHV0IGZpbGUuIgorICAgICAgICAjIEMtc3BlY2lmaWMKKyAgICAgICAgaWYgc2VsZi5lbWl0OgorICAgICAgICAgICAgaWYgc2VsZi5mZWF0dXJlX25vdF9lbXB0eToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmdlbk9wdHMuY29udmVudGlvbnMud3JpdGVGZWF0dXJlKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwgc2VsZi5nZW5PcHRzLmZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5nZW5PcHRzLnByb3RlY3RGZWF0dXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoJyNpZm5kZWYnLCBzZWxmLmZlYXR1cmVOYW1lLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB0eXBlIGRlY2xhcmF0aW9ucyBhcmUgbmVlZGVkIGJ5IG90aGVyIGZlYXR1cmVzIGJhc2VkIG9uCisgICAgICAgICAgICAgICAgICAgICMgdGhpcyBvbmUsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gc3VwcHJlc3MgdGhlIEV4dHJhUHJvdGVjdCwKKyAgICAgICAgICAgICAgICAgICAgIyBvciBtb3ZlIGl0IGJlbG93IHRoZSAnZm9yIHNlY3Rpb24uLi4nIGxvb3AuCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCcjaWZkZWYnLCBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgICAgICAgICB3cml0ZSgnI2RlZmluZScsIHNlbGYuZmVhdHVyZU5hbWUsICcxJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuVFlQRV9TRUNUSU9OUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gc2VsZi5zZWN0aW9uc1tzZWN0aW9uXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoJ1xuJy5qb2luKGNvbnRlbnRzKSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZ2VuT3B0cy5nZW5GdW5jUG9pbnRlcnMgYW5kIHNlbGYuc2VjdGlvbnNbJ2NvbW1hbmRQb2ludGVyJ106CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSgnXG4nLmpvaW4oc2VsZi5zZWN0aW9uc1snY29tbWFuZFBvaW50ZXInXSksIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zZWN0aW9uc1snY29tbWFuZCddOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5nZW5PcHRzLnByb3RlY3RQcm90bzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZShzZWxmLmdlbk9wdHMucHJvdGVjdFByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2VuT3B0cy5wcm90ZWN0UHJvdG9TdHIsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoJ1xuJy5qb2luKHNlbGYuc2VjdGlvbnNbJ2NvbW1hbmQnXSksIGVuZD0nJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmdlbk9wdHMucHJvdGVjdFByb3RvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCcjZW5kaWYnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoJyNlbmRpZiAvKicsIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwgJyovJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZ2VuT3B0cy5wcm90ZWN0RmVhdHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCcjZW5kaWYgLyonLCBzZWxmLmZlYXR1cmVOYW1lLCAnKi8nLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgIyBGaW5pc2ggcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5lbmRGZWF0dXJlKHNlbGYpCisKKyAgICBkZWYgYXBwZW5kU2VjdGlvbihzZWxmLCBzZWN0aW9uLCB0ZXh0KToKKyAgICAgICAgIkFwcGVuZCBhIGRlZmluaXRpb24gdG8gdGhlIHNwZWNpZmllZCBzZWN0aW9uIgorICAgICAgICAjIHNlbGYuc2VjdGlvbnNbc2VjdGlvbl0uYXBwZW5kKCdTRUNUSU9OOiAnICsgc2VjdGlvbiArICdcbicpCisgICAgICAgIHNlbGYuc2VjdGlvbnNbc2VjdGlvbl0uYXBwZW5kKHRleHQpCisgICAgICAgIHNlbGYuZmVhdHVyZV9ub3RfZW1wdHkgPSBUcnVlCisKKyAgICBkZWYgZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICAiR2VuZXJhdGUgdHlwZS4iCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5UeXBlKHNlbGYsIHR5cGVpbmZvLCBuYW1lLCBhbGlhcykKKyAgICAgICAgdHlwZUVsZW0gPSB0eXBlaW5mby5lbGVtCisKKyAgICAgICAgIyBWdWxrYW46CisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBjYXRlZ29yeSBvZiB0aGUgdHlwZSwgYW5kIHRoZSB0eXBlIHNlY3Rpb24gdG8gYWRkCisgICAgICAgICMgaXRzIGRlZmluaXRpb24gdG8uCisgICAgICAgICMgJ2Z1bmNwb2ludGVyJyBpcyBhZGRlZCB0byB0aGUgJ3N0cnVjdCcgc2VjdGlvbiBhcyBhIHdvcmthcm91bmQgZm9yCisgICAgICAgICMgaW50ZXJuYWwgaXNzdWUgIzg3Nywgc2luY2Ugc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcG9pbnRlciB0eXBlcworICAgICAgICAjIGNhbiBoYXZlIGNyb3NzLWRlcGVuZGVuY2llcy4KKyAgICAgICAgY2F0ZWdvcnkgPSB0eXBlRWxlbS5nZXQoJ2NhdGVnb3J5JykKKyAgICAgICAgaWYgY2F0ZWdvcnkgPT0gJ2Z1bmNwb2ludGVyJzoKKyAgICAgICAgICAgIHNlY3Rpb24gPSAnc3RydWN0JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VjdGlvbiA9IGNhdGVnb3J5CisKKyAgICAgICAgaWYgY2F0ZWdvcnkgaW4gKCdzdHJ1Y3QnLCAndW5pb24nKToKKyAgICAgICAgICAgICMgSWYgdGhlIHR5cGUgaXMgYSBzdHJ1Y3QgdHlwZSwgZ2VuZXJhdGUgaXQgdXNpbmcgdGhlCisgICAgICAgICAgICAjIHNwZWNpYWwtcHVycG9zZSBnZW5lcmF0b3IuCisgICAgICAgICAgICBzZWxmLmdlblN0cnVjdCh0eXBlaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE9wZW5YUjogdGhpcyBzZWN0aW9uIHdhcyBub3QgdW5kZXIgJ2Vsc2U6JyBwcmV2aW91c2x5LCBqdXN0IGZlbGwgdGhyb3VnaAorICAgICAgICAgICAgaWYgYWxpYXM6CisgICAgICAgICAgICAgICAgIyBJZiB0aGUgdHlwZSBpcyBhbiBhbGlhcywganVzdCBlbWl0IGEgdHlwZWRlZiBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgIGJvZHkgPSAndHlwZWRlZiAnICsgYWxpYXMgKyAnICcgKyBuYW1lICsgJztcbicKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBSZXBsYWNlIDxhcGllbnRyeSAvPiB0YWdzIHdpdGggYW4gQVBJRU5UUlktc3R5bGUgc3RyaW5nCisgICAgICAgICAgICAgICAgIyAoZnJvbSBzZWxmLmdlbk9wdHMpLiBDb3B5IG90aGVyIHRleHQgdGhyb3VnaCB1bmNoYW5nZWQuCisgICAgICAgICAgICAgICAgIyBJZiB0aGUgcmVzdWx0aW5nIHRleHQgaXMgYW4gZW1wdHkgc3RyaW5nLCBkb24ndCBlbWl0IGl0LgorICAgICAgICAgICAgICAgIGJvZHkgPSBub25lU3RyKHR5cGVFbGVtLnRleHQpCisgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gdHlwZUVsZW06CisgICAgICAgICAgICAgICAgICAgIGlmIGVsZW0udGFnID09ICdhcGllbnRyeSc6CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHNlbGYuZ2VuT3B0cy5hcGllbnRyeSArIG5vbmVTdHIoZWxlbS50YWlsKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBub25lU3RyKGVsZW0udGV4dCkgKyBub25lU3RyKGVsZW0udGFpbCkKKyAgICAgICAgICAgIGlmIGJvZHk6CisgICAgICAgICAgICAgICAgIyBBZGQgZXh0cmEgbmV3bGluZSBhZnRlciBtdWx0aS1saW5lIGVudHJpZXMuCisgICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiBib2R5WzA6LTFdOgorICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICdcbicKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oc2VjdGlvbiwgYm9keSkKKworICAgIGRlZiBnZW5Qcm90ZWN0U3RyaW5nKHNlbGYsIHByb3RlY3Rfc3RyKToKKyAgICAgICAgIiIiR2VuZXJhdGUgcHJvdGVjdGlvbiBzdHJpbmcuCisKKyAgICAgICAgUHJvdGVjdGlvbiBzdHJpbmdzIGFyZSB0aGUgc3RyaW5ncyBkZWZpbmluZyB0aGUgT1MvUGxhdGZvcm0vR3JhcGhpY3MKKyAgICAgICAgcmVxdWlyZW1lbnRzIGZvciBhIGdpdmVuIE9wZW5YUiBjb21tYW5kLiAgV2hlbiBnZW5lcmF0aW5nIHRoZQorICAgICAgICBsYW5ndWFnZSBoZWFkZXIgZmlsZXMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpdGVtcyBzcGVjaWZpYyB0byBhCisgICAgICAgIGdyYXBoaWNzIEFQSSBvciBPUyBwbGF0Zm9ybSBhcmUgcHJvcGVybHkgd3JhcHBlZCBpbiAjaWZzLiIiIgorICAgICAgICBwcm90ZWN0X2lmX3N0ciA9ICcnCisgICAgICAgIHByb3RlY3RfZW5kX3N0ciA9ICcnCisgICAgICAgIGlmIG5vdCBwcm90ZWN0X3N0cjoKKyAgICAgICAgICAgIHJldHVybiAocHJvdGVjdF9pZl9zdHIsIHByb3RlY3RfZW5kX3N0cikKKworICAgICAgICBpZiAnLCcgaW4gcHJvdGVjdF9zdHI6CisgICAgICAgICAgICBwcm90ZWN0X2xpc3QgPSBwcm90ZWN0X3N0ci5zcGxpdCgiLCIpCisgICAgICAgICAgICBwcm90ZWN0X2RlZnMgPSAoJ2RlZmluZWQoJXMpJyAlIGQgZm9yIGQgaW4gcHJvdGVjdF9saXN0KQorICAgICAgICAgICAgcHJvdGVjdF9kZWZfc3RyID0gJyAmJiAnLmpvaW4ocHJvdGVjdF9kZWZzKQorICAgICAgICAgICAgcHJvdGVjdF9pZl9zdHIgPSAnI2lmICVzXG4nICUgcHJvdGVjdF9kZWZfc3RyCisgICAgICAgICAgICBwcm90ZWN0X2VuZF9zdHIgPSAnI2VuZGlmIC8vICVzXG4nICUgcHJvdGVjdF9kZWZfc3RyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm90ZWN0X2lmX3N0ciA9ICcjaWZkZWYgJXNcbicgJSBwcm90ZWN0X3N0cgorICAgICAgICAgICAgcHJvdGVjdF9lbmRfc3RyID0gJyNlbmRpZiAvLyAlc1xuJyAlIHByb3RlY3Rfc3RyCisKKyAgICAgICAgcmV0dXJuIChwcm90ZWN0X2lmX3N0ciwgcHJvdGVjdF9lbmRfc3RyKQorCisgICAgZGVmIHR5cGVNYXlBbGlhcyhzZWxmLCB0eXBlTmFtZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLm1heV9hbGlhczoKKyAgICAgICAgICAgICMgRmlyc3QgdGltZSB3ZSd2ZSBhc2tlZCBpZiBhIHR5cGUgbWF5IGFsaWFzLgorICAgICAgICAgICAgIyBTbywgbGV0J3MgcG9wdWxhdGUgdGhlIHNldCBvZiBhbGwgbmFtZXMgb2YgdHlwZXMgdGhhdCBtYXkuCisKKyAgICAgICAgICAgICMgRXZlcnlvbmUgd2l0aCBhbiBleHBsaWNpdCBtYXlhbGlhcz0idHJ1ZSIKKyAgICAgICAgICAgIHNlbGYubWF5X2FsaWFzID0gc2V0KHR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHlwZU5hbWUsIGRhdGEgaW4gc2VsZi5yZWdpc3RyeS50eXBlZGljdC5pdGVtcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYXRhLmVsZW0uZ2V0KCdtYXlhbGlhcycpID09ICd0cnVlJykKKworICAgICAgICAgICAgIyBFdmVyeSB0eXBlIG1lbnRpb25lZCBpbiBzb21lIG90aGVyIHR5cGUncyBwYXJlbnRzdHJ1Y3QgYXR0cmlidXRlLgorICAgICAgICAgICAgcGFyZW50X3N0cnVjdHMgPSAob3RoZXJUeXBlLmVsZW0uZ2V0KCdwYXJlbnRzdHJ1Y3QnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG90aGVyVHlwZSBpbiBzZWxmLnJlZ2lzdHJ5LnR5cGVkaWN0LnZhbHVlcygpKQorICAgICAgICAgICAgc2VsZi5tYXlfYWxpYXMudXBkYXRlKHNldCh4IGZvciB4IGluIHBhcmVudF9zdHJ1Y3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHggaXMgbm90IE5vbmUpKQorICAgICAgICByZXR1cm4gdHlwZU5hbWUgaW4gc2VsZi5tYXlfYWxpYXMKKworICAgIGRlZiBnZW5TdHJ1Y3Qoc2VsZiwgdHlwZWluZm8sIHR5cGVOYW1lLCBhbGlhcyk6CisgICAgICAgICIiIkdlbmVyYXRlIHN0cnVjdCAoZS5nLiBDICJzdHJ1Y3QiIHR5cGUpLgorCisgICAgICAgIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIDx0eXBlPiB0YWcgd2hlcmUgdGhlIGNvbnRlbnRzIGFyZQorICAgICAgICBpbnRlcnByZXRlZCBhcyBhIHNldCBvZiA8bWVtYmVyPiB0YWdzIGluc3RlYWQgb2YgZnJlZWZvcm0gQworICAgICAgICBDIHR5cGUgZGVjbGFyYXRpb25zLiBUaGUgPG1lbWJlcj4gdGFncyBhcmUganVzdCBsaWtlIDxwYXJhbT4KKyAgICAgICAgdGFncyAtIHRoZXkgYXJlIGEgZGVjbGFyYXRpb24gb2YgYSBzdHJ1Y3Qgb3IgdW5pb24gbWVtYmVyLgorICAgICAgICBPbmx5IHNpbXBsZSBtZW1iZXIgZGVjbGFyYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vIG5lc3RlZAorICAgICAgICBzdHJ1Y3RzIGV0Yy4pCisKKyAgICAgICAgSWYgYWxpYXMgaXMgbm90IE5vbmUsIHRoZW4gdGhpcyBzdHJ1Y3QgYWxpYXNlcyBhbm90aGVyOyBqdXN0CisgICAgICAgIGdlbmVyYXRlIGEgdHlwZWRlZiBvZiB0aGF0IGFsaWFzLiIiIgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuU3RydWN0KHNlbGYsIHR5cGVpbmZvLCB0eXBlTmFtZSwgYWxpYXMpCisKKyAgICAgICAgdHlwZUVsZW0gPSB0eXBlaW5mby5lbGVtCisKKyAgICAgICAgaWYgYWxpYXM6CisgICAgICAgICAgICBib2R5ID0gJ3R5cGVkZWYgJyArIGFsaWFzICsgJyAnICsgdHlwZU5hbWUgKyAnO1xuJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYm9keSA9ICcnCisgICAgICAgICAgICAocHJvdGVjdF9iZWdpbiwgcHJvdGVjdF9lbmQpID0gc2VsZi5nZW5Qcm90ZWN0U3RyaW5nKHR5cGVFbGVtLmdldCgncHJvdGVjdCcpKQorICAgICAgICAgICAgaWYgcHJvdGVjdF9iZWdpbjoKKyAgICAgICAgICAgICAgICBib2R5ICs9IHByb3RlY3RfYmVnaW4KKyAgICAgICAgICAgIGJvZHkgKz0gJ3R5cGVkZWYgJyArIHR5cGVFbGVtLmdldCgnY2F0ZWdvcnknKQorCisgICAgICAgICAgICAjIFRoaXMgaXMgYW4gT3BlblhSLXNwZWNpZmljIGFsdGVybmF0aXZlIHdoZXJlIGFsaWFzaW5nIHJlZmVycworICAgICAgICAgICAgIyB0byBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb2YgdHlwZXMgcmF0aGVyIHRoYW4gQy1sZXZlbCB0eXBlCisgICAgICAgICAgICAjIGFsaWFzZXMuCisgICAgICAgICAgICBpZiBzZWxmLmdlbk9wdHMuZ2VuQWxpYXNNYWNybyBhbmQgc2VsZi50eXBlTWF5QWxpYXModHlwZU5hbWUpOgorICAgICAgICAgICAgICAgIGJvZHkgKz0gJyAnICsgc2VsZi5nZW5PcHRzLmFsaWFzTWFjcm8KKworICAgICAgICAgICAgYm9keSArPSAnICcgKyB0eXBlTmFtZSArICcge1xuJworCisgICAgICAgICAgICB0YXJnZXRMZW4gPSBzZWxmLmdldE1heENQYXJhbVR5cGVMZW5ndGgodHlwZWluZm8pCisgICAgICAgICAgICBmb3IgbWVtYmVyIGluIHR5cGVFbGVtLmZpbmRhbGwoJy4vL21lbWJlcicpOgorICAgICAgICAgICAgICAgIGJvZHkgKz0gc2VsZi5tYWtlQ1BhcmFtRGVjbChtZW1iZXIsIHRhcmdldExlbiArIDQpCisgICAgICAgICAgICAgICAgYm9keSArPSAnO1xuJworICAgICAgICAgICAgYm9keSArPSAnfSAnICsgdHlwZU5hbWUgKyAnO1xuJworICAgICAgICAgICAgaWYgcHJvdGVjdF9lbmQ6CisgICAgICAgICAgICAgICAgYm9keSArPSBwcm90ZWN0X2VuZAorCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc3RydWN0JywgYm9keSkKKworICAgIGRlZiBnZW5Hcm91cChzZWxmLCBncm91cGluZm8sIGdyb3VwTmFtZSwgYWxpYXM9Tm9uZSk6CisgICAgICAgICIiIkdlbmVyYXRlIGdyb3VwcyAoZS5nLiBDICJlbnVtIiB0eXBlKS4KKworICAgICAgICBUaGVzZSBhcmUgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyIHdpdGggb3RoZXIgdHlwZXMuCisKKyAgICAgICAgSWYgYWxpYXMgaXMgbm90IE5vbmUsIGl0IGlzIHRoZSBuYW1lIG9mIGFub3RoZXIgZ3JvdXAgdHlwZQorICAgICAgICB3aGljaCBhbGlhc2VzIHRoaXMgdHlwZTsganVzdCBnZW5lcmF0ZSB0aGF0IGFsaWFzLiIiIgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuR3JvdXAoc2VsZiwgZ3JvdXBpbmZvLCBncm91cE5hbWUsIGFsaWFzKQorICAgICAgICBncm91cEVsZW0gPSBncm91cGluZm8uZWxlbQorCisgICAgICAgICMgQWZ0ZXIgZWl0aGVyIGVudW1lcmF0ZWQgdHlwZSBvciBhbGlhcyBwYXRocywgYWRkIHRoZSBkZWNsYXJhdGlvbgorICAgICAgICAjIHRvIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIGZvciB0aGUgZ3JvdXAgYmVpbmcgZGVmaW5lZC4KKyAgICAgICAgaWYgZ3JvdXBFbGVtLmdldCgndHlwZScpID09ICdiaXRtYXNrJzoKKyAgICAgICAgICAgIHNlY3Rpb24gPSAnYml0bWFzaycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlY3Rpb24gPSAnZ3JvdXAnCisKKyAgICAgICAgaWYgYWxpYXM6CisgICAgICAgICAgICAjIElmIHRoZSBncm91cCBuYW1lIGlzIGFsaWFzZWQsIGp1c3QgZW1pdCBhIHR5cGVkZWYgZGVjbGFyYXRpb24KKyAgICAgICAgICAgICMgZm9yIHRoZSBhbGlhcy4KKyAgICAgICAgICAgIGJvZHkgPSAndHlwZWRlZiAnICsgYWxpYXMgKyAnICcgKyBncm91cE5hbWUgKyAnO1xuJworICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKHNlY3Rpb24sIGJvZHkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAoc2VjdGlvbiwgYm9keSkgPSBzZWxmLmJ1aWxkRW51bUNEZWNsKHNlbGYuZ2VuT3B0cy5nZW5FbnVtQmVnaW5FbmRSYW5nZSwgZ3JvdXBpbmZvLCBncm91cE5hbWUpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oc2VjdGlvbiwgIlxuIiArIGJvZHkpCisKKyAgICBkZWYgZ2VuRW51bShzZWxmLCBlbnVtaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICAiIiJHZW5lcmF0ZSBlbnVtZXJhbnRzLgorCisgICAgICAgIDxlbnVtPiB0YWdzIG1heSBzcGVjaWZ5IHRoZWlyIHZhbHVlcyBpbiBzZXZlcmFsIHdheXMsIGJ1dCBhcmUgdXN1YWxseQorICAgICAgICBqdXN0IGludGVnZXJzLiIiIgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuRW51bShzZWxmLCBlbnVtaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgIChfLCBzdHJWYWwpID0gc2VsZi5lbnVtVG9WYWx1ZShlbnVtaW5mby5lbGVtLCBGYWxzZSkKKyAgICAgICAgYm9keSA9ICcjZGVmaW5lICcgKyBuYW1lLmxqdXN0KDMzKSArICcgJyArIHN0clZhbAorICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2VudW0nLCBib2R5KQorCisgICAgZGVmIGdlbkNtZChzZWxmLCBjbWRpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgICJDb21tYW5kIGdlbmVyYXRpb24iCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpCisKKyAgICAgICAgIyBpZiBhbGlhczoKKyAgICAgICAgIyAgICAgcHJlZml4ID0gJy8vICcgKyBuYW1lICsgJyBpcyBhbiBhbGlhcyBvZiBjb21tYW5kICcgKyBhbGlhcyArICdcbicKKyAgICAgICAgIyBlbHNlOgorICAgICAgICAjICAgICBwcmVmaXggPSAnJworCisgICAgICAgIHByZWZpeCA9ICcnCisgICAgICAgIGRlY2xzID0gc2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSkKKyAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgcHJlZml4ICsgZGVjbHNbMF0gKyAnXG4nKQorICAgICAgICBpZiBzZWxmLmdlbk9wdHMuZ2VuRnVuY1BvaW50ZXJzOgorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kUG9pbnRlcicsIGRlY2xzWzFdKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS9jb252ZW50aW9ucy5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvcmVnaXN0cnkvY29udmVudGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjM2I4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvcmVnaXN0cnkvY29udmVudGlvbnMucHkKQEAgLTAsMCArMSwzMjMgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMyAtaQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQmFzZSBjbGFzcyBmb3Igd29ya2luZy1ncm91cC1zcGVjaWZpYyBzdHlsZSBjb252ZW50aW9ucywKKyMgdXNlZCBpbiBnZW5lcmF0aW9uLgorCitmcm9tIGVudW0gaW1wb3J0IEVudW0KKworIyBUeXBlIGNhdGVnb3JpZXMgdGhhdCByZXNwb25kICJGYWxzZSIgdG8gaXNTdHJ1Y3RBbHdheXNWYWxpZAorIyBiYXNldHlwZSBpcyBob21lIHRvIHR5cGVkZWZzIGxpa2UgLi5Cb29sMzIKK0NBVEVHT1JJRVNfUkVRVUlSSU5HX1ZBTElEQVRJT04gPSBzZXQoKCdoYW5kbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VudW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpdG1hc2snLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2V0eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUpKQorCisjIFRoZXNlIGFyZSBiYXNpYyBDIHR5cGVzIHB1bGxlZCBpbiB2aWEgb3BlbnhyX3BsYXRmb3JtX2RlZmluZXMuaAorVFlQRVNfS05PV05fQUxXQVlTX1ZBTElEID0gc2V0KCgnY2hhcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmbG9hdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnQ4X3QnLCAndWludDhfdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnQzMl90JywgJ3VpbnQzMl90JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludDY0X3QnLCAndWludDY0X3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZV90JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VpbnRwdHJfdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorCisKK2NsYXNzIFByb3NlTGlzdEZvcm1hdHMoRW51bSk6CisgICAgIiIiQSBjb25uZWN0aXZlLCBwb3NzaWJseSB3aXRoIGEgcXVhbnRpZmllci4iIiIKKyAgICBBTkQgPSAwCisgICAgRUFDSF9BTkQgPSAxCisgICAgT1IgPSAyCisgICAgQU5ZX09SID0gMworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fc3RyaW5nKGNscywgcyk6CisgICAgICAgIGlmIHMgPT0gJ29yJzoKKyAgICAgICAgICAgIHJldHVybiBjbHMuT1IKKyAgICAgICAgaWYgcyA9PSAnYW5kJzoKKyAgICAgICAgICAgIHJldHVybiBjbHMuQU5ECisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY29ubmVjdGl2ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZiBpbiAoUHJvc2VMaXN0Rm9ybWF0cy5PUiwgUHJvc2VMaXN0Rm9ybWF0cy5BTllfT1IpOgorICAgICAgICAgICAgcmV0dXJuICdvcicKKyAgICAgICAgcmV0dXJuICdhbmQnCisKKyAgICBkZWYgcXVhbnRpZmllcihzZWxmLCBuKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBkZXNpcmVkIHF1YW50aWZpZXIgZm9yIGEgbGlzdCBvZiBhIGdpdmVuIGxlbmd0aC4iIiIKKyAgICAgICAgaWYgc2VsZiA9PSBQcm9zZUxpc3RGb3JtYXRzLkFOWV9PUjoKKyAgICAgICAgICAgIGlmIG4gPiAxOgorICAgICAgICAgICAgICAgIHJldHVybiAnYW55IG9mICcKKyAgICAgICAgZWxpZiBzZWxmID09IFByb3NlTGlzdEZvcm1hdHMuRUFDSF9BTkQ6CisgICAgICAgICAgICBpZiBuID4gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2VhY2ggb2YgJworICAgICAgICAgICAgaWYgbiA9PSAyOgorICAgICAgICAgICAgICAgIHJldHVybiAnYm90aCBvZiAnCisgICAgICAgIHJldHVybiAnJworCisKK2NsYXNzIENvbnZlbnRpb25zQmFzZToKKyAgICAiIiJXRy1zcGVjaWZpYyBjb252ZW50aW9ucy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fY29tbWFuZF9wcmVmaXggPSBOb25lCisgICAgICAgIHNlbGYuX3R5cGVfcHJlZml4ID0gTm9uZQorCisgICAgZGVmIGZvcm1hdEV4dGVuc2lvbihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiTWFyayB1cCBhIG5hbWUgYXMgYW4gZXh0ZW5zaW9uIGZvciB0aGUgc3BlYy4KKworICAgICAgICBNdXN0IGltcGxlbWVudC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG51bGwoc2VsZik6CisgICAgICAgICIiIlByZWZlcnJlZCBzcGVsbGluZyBvZiBOVUxMLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgbWFrZVByb3NlTGlzdChzZWxmLCBlbGVtZW50cywgZm10PVByb3NlTGlzdEZvcm1hdHMuQU5ELCB3aXRoX3ZlcmI9RmFsc2UsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIk1ha2UgYSAoY29tbWEtc2VwYXJhdGVkKSBsaXN0IGZvciB1c2UgaW4gcHJvc2UuCisKKyAgICAgICAgQWRkcyBhIGNvbm5lY3RpdmUgKGJ5IGRlZmF1bHQsICdhbmQnKQorICAgICAgICBiZWZvcmUgdGhlIGxhc3QgZWxlbWVudCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDEuCisKKyAgICAgICAgQWRkcyB0aGUgcmlnaHQgb25lIG9mICJpcyIgb3IgImFyZSIgdG8gdGhlIGVuZCBpZiB3aXRoX3ZlcmIgaXMgdHJ1ZS4KKworICAgICAgICBPcHRpb25hbGx5IGFkZHMgYSBxdWFudGlmaWVyIChsaWtlICdhbnknKSBiZWZvcmUgYSBsaXN0IG9mIDIgb3IgbW9yZSwKKyAgICAgICAgaWYgc3BlY2lmaWVkIGJ5IGZtdC4KKworICAgICAgICBPdmVycmlkZSB3aXRoIGEgZGlmZmVyZW50IG1ldGhvZCBvciBkaWZmZXJlbnQgY2FsbCB0bworICAgICAgICBfaW1wbE1ha2VQcm9zZUxpc3QgaWYgeW91IHdhbnQgdG8gYWRkIGEgY29tbWEgZm9yIHR3byBlbGVtZW50cywKKyAgICAgICAgb3Igbm90IHVzZSBhIHNlcmlhbCBjb21tYS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pbXBsTWFrZVByb3NlTGlzdChlbGVtZW50cywgZm10LCB3aXRoX3ZlcmIsICphcmdzLCAqKmt3YXJncykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJ1Y3RfbWFjcm8oc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0IG1hY3JvIGZvciBhIHN0cnVjdHVyZS4KKworICAgICAgICBNYXkgb3ZlcnJpZGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gJ3NsaW5rOicKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBleHRlcm5hbF9tYWNybyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgbWFjcm8gZm9yIGFuIGV4dGVybmFsIHR5cGUgbGlrZSB1aW50MzJfdC4KKworICAgICAgICBNYXkgb3ZlcnJpZGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gJ2NvZGU6JworCisgICAgZGVmIG1ha2VTdHJ1Y3ROYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJQcmVwZW5kIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgbWFjcm8gZm9yIGEgc3RydWN0dXJlIHRvIGEgc3RydWN0dXJlIHR5cGUgbmFtZS4KKworICAgICAgICBVc2VzIHN0cnVjdF9tYWNybywgc28ganVzdCBvdmVycmlkZSB0aGF0IGlmIHlvdSB3YW50IHRvIGNoYW5nZSBiZWhhdmlvci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnN0cnVjdF9tYWNybyArIG5hbWUKKworICAgIGRlZiBtYWtlRXh0ZXJuYWxUeXBlTmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUHJlcGVuZCB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0IG1hY3JvIGZvciBhbiBleHRlcm5hbCB0eXBlIGxpa2UgdWludDMyX3QgdG8gYSB0eXBlIG5hbWUuCisKKyAgICAgICAgVXNlcyBleHRlcm5hbF9tYWNybywgc28ganVzdCBvdmVycmlkZSB0aGF0IGlmIHlvdSB3YW50IHRvIGNoYW5nZSBiZWhhdmlvci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmV4dGVybmFsX21hY3JvICsgbmFtZQorCisgICAgZGVmIF9pbXBsTWFrZVByb3NlTGlzdChzZWxmLCBlbGVtZW50cywgZm10LCB3aXRoX3ZlcmIsIGNvbW1hX2Zvcl90d29fZWx0cz1GYWxzZSwgc2VyaWFsX2NvbW1hPVRydWUpOgorICAgICAgICAiIiJJbnRlcm5hbC11c2UgaW1wbGVtZW50YXRpb24gdG8gbWFrZSBhIChjb21tYS1zZXBhcmF0ZWQpIGxpc3QgZm9yIHVzZSBpbiBwcm9zZS4KKworICAgICAgICBBZGRzIGEgY29ubmVjdGl2ZSAoYnkgZGVmYXVsdCwgJ2FuZCcpCisgICAgICAgIGJlZm9yZSB0aGUgbGFzdCBlbGVtZW50IGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMSwKKyAgICAgICAgYW5kIG9ubHkgaW5jbHVkZXMgY29tbWFzIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMgorICAgICAgICAoaWYgY29tbWFfZm9yX3R3b19lbHRzIGlzIEZhbHNlKS4KKworICAgICAgICBBZGRzIHRoZSByaWdodCBvbmUgb2YgImlzIiBvciAiYXJlIiB0byB0aGUgZW5kIGlmIHdpdGhfdmVyYiBpcyB0cnVlLgorCisgICAgICAgIE9wdGlvbmFsbHkgYWRkcyBhIHF1YW50aWZpZXIgKGxpa2UgJ2FueScpIGJlZm9yZSBhIGxpc3Qgb2YgMiBvciBtb3JlLAorICAgICAgICBpZiBzcGVjaWZpZWQgYnkgZm10LgorCisgICAgICAgIERvbid0IGVkaXQgdGhlc2UgZGVmYXVsdHMsIG92ZXJyaWRlIHNlbGYubWFrZVByb3NlTGlzdCgpLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0KHNlcmlhbF9jb21tYSkgICMgZGlkbid0IGltcGxlbWVudCB3aGF0IHdlIGRpZG4ndCBuZWVkCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZm10LCBzdHIpOgorICAgICAgICAgICAgZm10ID0gUHJvc2VMaXN0Rm9ybWF0cy5mcm9tX3N0cmluZyhmbXQpCisKKyAgICAgICAgbXlfZWx0cyA9IGxpc3QoZWxlbWVudHMpCisgICAgICAgIGlmIGxlbihteV9lbHRzKSA+IDE6CisgICAgICAgICAgICBteV9lbHRzWy0xXSA9ICd7fSB7fScuZm9ybWF0KGZtdC5jb25uZWN0aXZlLCBteV9lbHRzWy0xXSkKKworICAgICAgICBpZiBub3QgY29tbWFfZm9yX3R3b19lbHRzIGFuZCBsZW4obXlfZWx0cykgPD0gMjoKKyAgICAgICAgICAgIHByb3NlID0gJyAnLmpvaW4obXlfZWx0cykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb3NlID0gJywgJy5qb2luKG15X2VsdHMpCisKKyAgICAgICAgcXVhbnRpZmllciA9IGZtdC5xdWFudGlmaWVyKGxlbihteV9lbHRzKSkKKworICAgICAgICBwYXJ0cyA9IFtxdWFudGlmaWVyLCBwcm9zZV0KKworICAgICAgICBpZiB3aXRoX3ZlcmI6CisgICAgICAgICAgICBpZiBsZW4obXlfZWx0cykgPiAxOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnIGFyZScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnIGlzJykKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocGFydHMpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZmlsZV9zdWZmaXgoc2VsZik6CisgICAgICAgICIiIlJldHVybiBzdWZmaXggb2YgZ2VuZXJhdGVkIEFzY2lpZG9jdG9yIGZpbGVzIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBhcGlfbmFtZShzZWxmLCBzcGVjdHlwZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIEFQSSBvciBzcGVjaWZpY2F0aW9uIG5hbWUgZm9yIGNpdGF0aW9ucyBpbiByZWYgcGFnZXMuCisKKyAgICAgICAgc3BlY3R5cGUgaXMgdGhlIHNwZWMgdGhpcyByZWZwYWdlIGlzIGZvci4KKyAgICAgICAgJ2FwaScgKHRoZSBkZWZhdWx0IHZhbHVlKSBpcyB0aGUgbWFpbiBBUEkgU3BlY2lmaWNhdGlvbi4KKyAgICAgICAgSWYgYW4gdW5yZWNvZ25pemVkIHNwZWN0eXBlIGlzIGdpdmVuLCByZXR1cm5zIE5vbmUuCisKKyAgICAgICAgTXVzdCBpbXBsZW1lbnQuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBzaG91bGRfaW5zZXJ0X21heV9hbGlhc19tYWNybyhzZWxmLCBnZW5PcHRzKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxkIGluc2VydCBhICJtYXkgYWxpYXMiIG1hY3JvIGluIHRoaXMgZmlsZS4KKworICAgICAgICBPbmx5IHVzZWQgYnkgT3BlblhSIHJpZ2h0IG5vdy4iIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY29tbWFuZF9wcmVmaXgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgZXhwZWN0ZWQgcHJlZml4IG9mIGNvbW1hbmRzL2Z1bmN0aW9ucy4KKworICAgICAgICBJbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBhcGlfcHJlZml4LiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fY29tbWFuZF9wcmVmaXg6CisgICAgICAgICAgICBzZWxmLl9jb21tYW5kX3ByZWZpeCA9IHNlbGYuYXBpX3ByZWZpeFs6XS5yZXBsYWNlKCdfJywgJycpLmxvd2VyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbW1hbmRfcHJlZml4CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdHlwZV9wcmVmaXgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgZXhwZWN0ZWQgcHJlZml4IG9mIHR5cGUgbmFtZXMuCisKKyAgICAgICAgSW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgY29tbWFuZF9wcmVmaXggKGFuZCBpbiB0dXJuLCBhcGlfcHJlZml4KS4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX3R5cGVfcHJlZml4OgorICAgICAgICAgICAgc2VsZi5fdHlwZV9wcmVmaXggPSAnJy5qb2luKAorICAgICAgICAgICAgICAgIChzZWxmLmNvbW1hbmRfcHJlZml4WzA6MV0udXBwZXIoKSwgc2VsZi5jb21tYW5kX3ByZWZpeFsxOl0pKQorICAgICAgICByZXR1cm4gc2VsZi5fdHlwZV9wcmVmaXgKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBhcGlfcHJlZml4KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gQVBJIHRva2VuIHByZWZpeC4KKworICAgICAgICBUeXBpY2FsbHkgdHdvIHVwcGVyY2FzZSBsZXR0ZXJzIGZvbGxvd2VkIGJ5IGFuIHVuZGVyc2NvcmUuCisKKyAgICAgICAgTXVzdCBpbXBsZW1lbnQuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBhcGlfdmVyc2lvbl9wcmVmaXgoc2VsZik6CisgICAgICAgICIiIlJldHVybiBBUEkgY29yZSB2ZXJzaW9uIHRva2VuIHByZWZpeC4KKworICAgICAgICBJbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBhcGlfcHJlZml4LgorCisgICAgICAgIE1heSBvdmVycmlkZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYXBpX3ByZWZpeCArICdWRVJTSU9OXycKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBLSFJfcHJlZml4KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gZXh0ZW5zaW9uIG5hbWUgcHJlZml4IGZvciBLSFIgZXh0ZW5zaW9ucy4KKworICAgICAgICBJbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBhcGlfcHJlZml4LgorCisgICAgICAgIE1heSBvdmVycmlkZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYXBpX3ByZWZpeCArICdLSFJfJworCisgICAgQHByb3BlcnR5CisgICAgZGVmIEVYVF9wcmVmaXgoc2VsZik6CisgICAgICAgICIiIlJldHVybiBleHRlbnNpb24gbmFtZSBwcmVmaXggZm9yIEVYVCBleHRlbnNpb25zLgorCisgICAgICAgIEltcGxlbWVudGVkIGluIHRlcm1zIG9mIGFwaV9wcmVmaXguCisKKyAgICAgICAgTWF5IG92ZXJyaWRlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5hcGlfcHJlZml4ICsgJ0VYVF8nCisKKyAgICBkZWYgd3JpdGVGZWF0dXJlKHNlbGYsIGZlYXR1cmVFeHRyYVByb3RlY3QsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgT3V0cHV0R2VuZXJhdG9yLmVuZEZlYXR1cmUgc2hvdWxkIHdyaXRlIHRoaXMgZmVhdHVyZS4KKworICAgICAgICBEZWZhdWx0cyB0byBhbHdheXMgVHJ1ZS4KKyAgICAgICAgVXNlZCBpbiBDT3V0cHV0R2VuZXJhdG9yLgorCisgICAgICAgIE1heSBvdmVycmlkZS4iIiIKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXF1aXJlc19lcnJvcl92YWxpZGF0aW9uKHNlbGYsIHJldHVybl90eXBlKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIHJldHVybl90eXBlIGVsZW1lbnQgaXMgYW4gQVBJIHJlc3VsdCBjb2RlCisgICAgICAgIHJlcXVpcmluZyBlcnJvciB2YWxpZGF0aW9uLgorCisgICAgICAgIERlZmF1bHRzIHRvIGFsd2F5cyBGYWxzZS4KKworICAgICAgICBNYXkgb3ZlcnJpZGUuIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHJlcXVpcmVkX2Vycm9ycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiByZXF1aXJlZCBlcnJvciBjb2RlcyBmb3IgdmFsaWRhdGlvbi4KKworICAgICAgICBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCisgICAgICAgIE1heSBvdmVycmlkZS4iIiIKKyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgaXNfdm9pZHBvaW50ZXJfYWxpYXMoc2VsZiwgdGFnLCB0ZXh0LCB0YWlsKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIGRlY2xhcmF0aW9uIGNvbXBvbmVudHMgKHRhZyx0ZXh0LHRhaWwpIG9mIGFuCisgICAgICAgIGVsZW1lbnQgcmVwcmVzZW50cyBhIHZvaWQgKiB0eXBlLgorCisgICAgICAgIERlZmF1bHRzIHRvIGEgcmVhc29uYWJsZSBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICBNYXkgb3ZlcnJpZGUuIiIiCisgICAgICAgIHJldHVybiB0YWcgPT0gJ3R5cGUnIGFuZCB0ZXh0ID09ICd2b2lkJyBhbmQgdGFpbC5zdGFydHN3aXRoKCcqJykKKworICAgIGRlZiBtYWtlX3ZvaWRwb2ludGVyX2FsaWFzKHNlbGYsIHRhaWwpOgorICAgICAgICAiIiJSZWZvcm1hdCBhIHZvaWQgKiBkZWNsYXJhdGlvbiB0byBpbmNsdWRlIHRoZSBBUEkgYWxpYXMgbWFjcm8uCisKKyAgICAgICAgRGVmYXVsdHMgdG8gYSBuby1vcC4KKworICAgICAgICBNdXN0IG92ZXJyaWRlIGlmIHlvdSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmUgaW4geW91ciBwcm9qZWN0LiIiIgorICAgICAgICByZXR1cm4gdGFpbAorCisgICAgZGVmIGNhdGVnb3J5X3JlcXVpcmVzX3ZhbGlkYXRpb24oc2VsZiwgY2F0ZWdvcnkpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSAnY2F0ZWdvcnknIGFsd2F5cyByZXF1aXJlcyB2YWxpZGF0aW9uLgorCisgICAgICAgIERlZmF1bHRzIHRvIGEgcmVhc29uYWJsZSBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICBNYXkgb3ZlcnJpZGUuIiIiCisgICAgICAgIHJldHVybiBjYXRlZ29yeSBpbiBDQVRFR09SSUVTX1JFUVVJUklOR19WQUxJREFUSU9OCisKKyAgICBkZWYgdHlwZV9hbHdheXNfdmFsaWQoc2VsZiwgdHlwZW5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBuYW1lIGlzIGFsd2F5cyB2YWxpZCAobmV2ZXIgcmVxdWlyZXMgdmFsaWRhdGlvbikuCisKKyAgICAgICAgVGhpcyBpcyBmb3IgdGhpbmdzIGxpa2UgaW50ZWdlcnMuCisKKyAgICAgICAgRGVmYXVsdHMgdG8gYSByZWFzb25hYmxlIGltcGxlbWVudGF0aW9uLgorCisgICAgICAgIE1heSBvdmVycmlkZS4iIiIKKyAgICAgICAgcmV0dXJuIHR5cGVuYW1lIGluIFRZUEVTX0tOT1dOX0FMV0FZU19WQUxJRAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNob3VsZF9za2lwX2NoZWNraW5nX2NvZGVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBtb3JlIHRoYW4gdGhlIGJhc2ljIHZhbGlkYXRpb24gb2YgcmV0dXJuIGNvZGVzIHNob3VsZAorICAgICAgICBiZSBza2lwcGVkIGZvciBhIGNvbW1hbmQuIiIiCisKKyAgICAgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L2dlbmVyYXRvci5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvcmVnaXN0cnkvZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTc5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDkxNyBAQAorIyEvdXNyL2Jpbi9weXRob24zIC1pCisjCisjIENvcHlyaWdodCAoYykgMjAxMy0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIkJhc2UgY2xhc3MgZm9yIHNvdXJjZS9oZWFkZXIvZG9jIGdlbmVyYXRvcnMsIGFzIHdlbGwgYXMgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucy4iIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2ltcG9ydCBpbworaW1wb3J0IG9zCitpbXBvcnQgcGRiCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK3RyeToKKyAgICBmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIHBhdGhsaWIyIGltcG9ydCBQYXRoCisKK2Zyb20gc3BlY190b29scy51dGlsIGltcG9ydCBnZXRFbGVtTmFtZSwgZ2V0RWxlbVR5cGUKKworCitkZWYgd3JpdGUoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBmaWxlID0ga3dhcmdzLnBvcCgnZmlsZScsIHN5cy5zdGRvdXQpCisgICAgZW5kID0ga3dhcmdzLnBvcCgnZW5kJywgJ1xuJykKKyAgICBmaWxlLndyaXRlKCcgJy5qb2luKHN0cihhcmcpIGZvciBhcmcgaW4gYXJncykpCisgICAgZmlsZS53cml0ZShlbmQpCisKKworZGVmIG5vbmVTdHIocyk6CisgICAgIiIiUmV0dXJuIHN0cmluZyBhcmd1bWVudCwgb3IgIiIgaWYgYXJndW1lbnQgaXMgTm9uZS4KKworICAgIFVzZWQgaW4gY29udmVydGluZyBldHJlZSBFbGVtZW50cyBpbnRvIHRleHQuCisgICAgcyAtIHN0cmluZyB0byBjb252ZXJ0IiIiCisgICAgaWYgczoKKyAgICAgICAgcmV0dXJuIHMKKyAgICByZXR1cm4gIiIKKworZGVmIGVucXVvdGUocyk6CisgICAgIiIiUmV0dXJuIHN0cmluZyBhcmd1bWVudCB3aXRoIHN1cnJvdW5kaW5nIHF1b3RlcywKKyAgICAgIGZvciBzZXJpYWxpemF0aW9uIGludG8gUHl0aG9uIGNvZGUuIiIiCisgICAgaWYgczoKKyAgICAgICAgcmV0dXJuICIne30nIi5mb3JtYXQocykKKyAgICByZXR1cm4gTm9uZQorCitkZWYgcmVnU29ydENhdGVnb3J5S2V5KGZlYXR1cmUpOgorICAgICIiIlByaW1hcnkgc29ydCBrZXkgZm9yIHJlZ1NvcnRGZWF0dXJlcy4KKworICAgIFNvcnRzIGJ5IGNhdGVnb3J5IG9mIHRoZSBmZWF0dXJlIG5hbWUgc3RyaW5nOgorCisgICAgLSBDb3JlIEFQSSBmZWF0dXJlcyAodGhvc2UgZGVmaW5lZCB3aXRoIGEgYDxmZWF0dXJlPmAgdGFnKQorICAgIC0gQVJCL0tIUi9PRVMgKEtocm9ub3MgZXh0ZW5zaW9ucykKKyAgICAtIG90aGVyICAgICAgIChFWFQvdmVuZG9yIGV4dGVuc2lvbnMpCisKKyAgICBUaGlzIG1heSBuZWVkIHRvIGNoYW5nZSBmb3Igc29tZSBBUElzIiIiCisKKyAgICBpZiBmZWF0dXJlLmVsZW0udGFnID09ICdmZWF0dXJlJzoKKyAgICAgICAgcmV0dXJuIDAKKyAgICBpZiAoZmVhdHVyZS5jYXRlZ29yeSA9PSAnQVJCJworICAgICAgICBvciBmZWF0dXJlLmNhdGVnb3J5ID09ICdLSFInCisgICAgICAgICAgICBvciBmZWF0dXJlLmNhdGVnb3J5ID09ICdPRVMnKToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIHJldHVybiAyCisKK2RlZiByZWdTb3J0T3JkZXJLZXkoZmVhdHVyZSk6CisgICAgIiIiU2Vjb25kYXJ5IHNvcnQga2V5IGZvciByZWdTb3J0RmVhdHVyZXMuCisgICAgU29ydHMgYnkgc29ydG9yZGVyIGF0dHJpYnV0ZS4iIiIKKworICAgIHJldHVybiBmZWF0dXJlLnNvcnRvcmRlcgorCitkZWYgcmVnU29ydEZlYXR1cmVWZXJzaW9uS2V5KGZlYXR1cmUpOgorICAgICIiIlRlcnRpYXJ5IHNvcnQga2V5IGZvciByZWdTb3J0RmVhdHVyZXMuCisKKyAgICBTb3J0cyBieSBmZWF0dXJlIHZlcnNpb24uCisgICAgYDxleHRlbnNpb24+YCBlbGVtZW50cyBhbGwgaGF2ZSB2ZXJzaW9uIG51bWJlciAwLiIiIgorCisgICAgcmV0dXJuIGZsb2F0KGZlYXR1cmUudmVyc2lvbk51bWJlcikKKworZGVmIHJlZ1NvcnRFeHRlbnNpb25OdW1iZXJLZXkoZmVhdHVyZSk6CisgICAgIiIiTGFzdCBzb3J0IGtleSBmb3IgcmVnU29ydEZlYXR1cmVzLgorCisgICAgU29ydHMgYnkgZXh0ZW5zaW9uIG51bWJlci4KKyAgICBgPGZlYXR1cmU+YCBlbGVtZW50cyBhbGwgaGF2ZSBleHRlbnNpb24gbnVtYmVyIDAuIiIiCisKKyAgICByZXR1cm4gaW50KGZlYXR1cmUubnVtYmVyKQorCitkZWYgcmVnU29ydEZlYXR1cmVzKGZlYXR1cmVMaXN0KToKKyAgICAiIiJEZWZhdWx0IHNvcnQgcHJvY2VkdXJlIGZvciBmZWF0dXJlcy4KKworICAgIC0gU29ydHMgYnkgcHJpbWFyeSBrZXkgb2YgZmVhdHVyZSBjYXRlZ29yeSAoJ2ZlYXR1cmUnIG9yICdleHRlbnNpb24nKSwKKyAgICAtIHRoZW4gYnkgc29ydCBvcmRlciB3aXRoaW4gdGhlIGNhdGVnb3J5CisgICAgLSB0aGVuIGJ5IHZlcnNpb24gbnVtYmVyIChmb3IgZmVhdHVyZXMpCisgICAgLSB0aGVuIGJ5IGV4dGVuc2lvbiBudW1iZXIgKGZvciBleHRlbnNpb25zKSIiIgorICAgIGZlYXR1cmVMaXN0LnNvcnQoa2V5PXJlZ1NvcnRFeHRlbnNpb25OdW1iZXJLZXkpCisgICAgZmVhdHVyZUxpc3Quc29ydChrZXk9cmVnU29ydEZlYXR1cmVWZXJzaW9uS2V5KQorICAgIGZlYXR1cmVMaXN0LnNvcnQoa2V5PXJlZ1NvcnRPcmRlcktleSkKKyAgICBmZWF0dXJlTGlzdC5zb3J0KGtleT1yZWdTb3J0Q2F0ZWdvcnlLZXkpCisKK2NsYXNzIEdlbmVyYXRvck9wdGlvbnM6CisgICAgIiIiQmFzZSBjbGFzcyBmb3Igb3B0aW9ucyB1c2VkIGR1cmluZyBoZWFkZXIvZG9jdW1lbnRhdGlvbiBwcm9kdWN0aW9uLgorCisgICAgVGhlc2Ugb3B0aW9ucyBhcmUgdGFyZ2V0IGxhbmd1YWdlIGluZGVwZW5kZW50LCBhbmQgdXNlZCBieQorICAgIFJlZ2lzdHJ5LmFwaUdlbigpIGFuZCBieSBiYXNlIE91dHB1dEdlbmVyYXRvciBvYmplY3RzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25zPU5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeT0nLicsCisgICAgICAgICAgICAgICAgIGFwaW5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgICB2ZXJzaW9ucz0nLionLAorICAgICAgICAgICAgICAgICBlbWl0dmVyc2lvbnM9Jy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucz1Ob25lLAorICAgICAgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zPU5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zPU5vbmUsCisgICAgICAgICAgICAgICAgIHNvcnRQcm9jZWR1cmU9cmVnU29ydEZlYXR1cmVzKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuCisKKyAgICAgICAgQXJndW1lbnRzOgorCisgICAgICAgIC0gY29udmVudGlvbnMgLSBtYXkgYmUgbWFuZGF0b3J5IGZvciBzb21lIGdlbmVyYXRvcnM6CisgICAgICAgIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgQ29udmVudGlvbnNCYXNlCisgICAgICAgIC0gZmlsZW5hbWUgLSBiYXNlbmFtZSBvZiBmaWxlIHRvIGdlbmVyYXRlLCBvciBOb25lIHRvIHdyaXRlIHRvIHN0ZG91dC4KKyAgICAgICAgLSBkaXJlY3RvcnkgLSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgZmlsZW5hbWUKKyAgICAgICAgLSBhcGluYW1lIC0gc3RyaW5nIG1hdGNoaW5nIGA8YXBpPmAgJ2FwaW5hbWUnIGF0dHJpYnV0ZSwgZS5nLiAnZ2wnLgorICAgICAgICAtIHByb2ZpbGUgLSBzdHJpbmcgc3BlY2lmeWluZyBBUEkgcHJvZmlsZSAsIGUuZy4gJ2NvcmUnLCBvciBOb25lLgorICAgICAgICAtIHZlcnNpb25zIC0gcmVnZXggbWF0Y2hpbmcgQVBJIHZlcnNpb25zIHRvIHByb2Nlc3MgaW50ZXJmYWNlcyBmb3IuCisgICAgICAgIE5vcm1hbGx5IGAnLionYCBvciBgJ1swLTldWy5dWzAtOV0nYCB0byBtYXRjaCBhbGwgZGVmaW5lZCB2ZXJzaW9ucy4KKyAgICAgICAgLSBlbWl0dmVyc2lvbnMgLSByZWdleCBtYXRjaGluZyBBUEkgdmVyc2lvbnMgdG8gYWN0dWFsbHkgZW1pdAorICAgICAgICBpbnRlcmZhY2VzIGZvciAodGhvdWdoIGFsbCByZXF1ZXN0ZWQgdmVyc2lvbnMgYXJlIGNvbnNpZGVyZWQKKyAgICAgICAgd2hlbiBkZWNpZGluZyB3aGljaCBpbnRlcmZhY2VzIHRvIGdlbmVyYXRlKS4gRm9yIEdMIDQuMyBnbGV4dC5oLAorICAgICAgICB0aGlzIG1pZ2h0IGJlIGAnMVsuXVsyLTVdfFsyLTRdWy5dWzAtOV0nYC4KKyAgICAgICAgLSBkZWZhdWx0RXh0ZW5zaW9ucyAtIElmIG5vdCBOb25lLCBhIHN0cmluZyB3aGljaCBtdXN0IGluIGl0cworICAgICAgICBlbnRpcmV0eSBtYXRjaCB0aGUgcGF0dGVybiBpbiB0aGUgInN1cHBvcnRlZCIgYXR0cmlidXRlIG9mCisgICAgICAgIHRoZSBgPGV4dGVuc2lvbj5gLiBEZWZhdWx0cyB0byBOb25lLiBVc3VhbGx5IHRoZSBzYW1lIGFzIGFwaW5hbWUuCisgICAgICAgIC0gYWRkRXh0ZW5zaW9ucyAtIHJlZ2V4IG1hdGNoaW5nIG5hbWVzIG9mIGFkZGl0aW9uYWwgZXh0ZW5zaW9ucworICAgICAgICB0byBpbmNsdWRlLiBEZWZhdWx0cyB0byBOb25lLgorICAgICAgICAtIHJlbW92ZUV4dGVuc2lvbnMgLSByZWdleCBtYXRjaGluZyBuYW1lcyBvZiBleHRlbnNpb25zIHRvCisgICAgICAgIHJlbW92ZSAoYWZ0ZXIgZGVmYXVsdEV4dGVuc2lvbnMgYW5kIGFkZEV4dGVuc2lvbnMpLiBEZWZhdWx0cworICAgICAgICB0byBOb25lLgorICAgICAgICAtIGVtaXRFeHRlbnNpb25zIC0gcmVnZXggbWF0Y2hpbmcgbmFtZXMgb2YgZXh0ZW5zaW9ucyB0byBhY3R1YWxseSBlbWl0CisgICAgICAgIGludGVyZmFjZXMgZm9yICh0aG91Z2ggYWxsIHJlcXVlc3RlZCB2ZXJzaW9ucyBhcmUgY29uc2lkZXJlZCB3aGVuCisgICAgICAgIGRlY2lkaW5nIHdoaWNoIGludGVyZmFjZXMgdG8gZ2VuZXJhdGUpLgorICAgICAgICAtIHNvcnRQcm9jZWR1cmUgLSB0YWtlcyBhIGxpc3Qgb2YgRmVhdHVyZUluZm8gb2JqZWN0cyBhbmQgc29ydHMKKyAgICAgICAgdGhlbSBpbiBwbGFjZSB0byBhIHByZWZlcnJlZCBvcmRlciBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dC4KKyAgICAgICAgRGVmYXVsdCBpcyBjb3JlIEFQSSB2ZXJzaW9ucywgQVJCL0tIUi9PRVMgZXh0ZW5zaW9ucywgYWxsIG90aGVyCisgICAgICAgIGV4dGVuc2lvbnMsIGJ5IGNvcmUgQVBJIHZlcnNpb24gbnVtYmVyIG9yIGV4dGVuc2lvbiBudW1iZXIgaW4gZWFjaAorICAgICAgICBncm91cC4KKworICAgICAgICBUaGUgcmVnZXggcGF0dGVybnMgY2FuIGJlIE5vbmUgb3IgZW1wdHksIGluIHdoaWNoIGNhc2UgdGhleSBtYXRjaAorICAgICAgICBub3RoaW5nLiIiIgorICAgICAgICBzZWxmLmNvbnZlbnRpb25zID0gY29udmVudGlvbnMKKyAgICAgICAgIiIibWF5IGJlIG1hbmRhdG9yeSBmb3Igc29tZSBnZW5lcmF0b3JzOgorICAgICAgICBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIENvbnZlbnRpb25zQmFzZSIiIgorCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICAiYmFzZW5hbWUgb2YgZmlsZSB0byBnZW5lcmF0ZSwgb3IgTm9uZSB0byB3cml0ZSB0byBzdGRvdXQuIgorCisgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gZGlyZWN0b3J5CisgICAgICAgICJkaXJlY3RvcnkgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgZmlsZW5hbWUiCisKKyAgICAgICAgc2VsZi5hcGluYW1lID0gYXBpbmFtZQorICAgICAgICAic3RyaW5nIG1hdGNoaW5nIGA8YXBpPmAgJ2FwaW5hbWUnIGF0dHJpYnV0ZSwgZS5nLiAnZ2wnLiIKKworICAgICAgICBzZWxmLnByb2ZpbGUgPSBwcm9maWxlCisgICAgICAgICJzdHJpbmcgc3BlY2lmeWluZyBBUEkgcHJvZmlsZSAsIGUuZy4gJ2NvcmUnLCBvciBOb25lLiIKKworICAgICAgICBzZWxmLnZlcnNpb25zID0gc2VsZi5lbXB0eVJlZ2V4KHZlcnNpb25zKQorICAgICAgICAiIiJyZWdleCBtYXRjaGluZyBBUEkgdmVyc2lvbnMgdG8gcHJvY2VzcyBpbnRlcmZhY2VzIGZvci4KKyAgICAgICAgTm9ybWFsbHkgYCcuKidgIG9yIGAnWzAtOV1bLl1bMC05XSdgIHRvIG1hdGNoIGFsbCBkZWZpbmVkIHZlcnNpb25zLiIiIgorCisgICAgICAgIHNlbGYuZW1pdHZlcnNpb25zID0gc2VsZi5lbXB0eVJlZ2V4KGVtaXR2ZXJzaW9ucykKKyAgICAgICAgIiIicmVnZXggbWF0Y2hpbmcgQVBJIHZlcnNpb25zIHRvIGFjdHVhbGx5IGVtaXQKKyAgICAgICAgaW50ZXJmYWNlcyBmb3IgKHRob3VnaCBhbGwgcmVxdWVzdGVkIHZlcnNpb25zIGFyZSBjb25zaWRlcmVkCisgICAgICAgIHdoZW4gZGVjaWRpbmcgd2hpY2ggaW50ZXJmYWNlcyB0byBnZW5lcmF0ZSkuIEZvciBHTCA0LjMgZ2xleHQuaCwKKyAgICAgICAgdGhpcyBtaWdodCBiZSBgJzFbLl1bMi01XXxbMi00XVsuXVswLTldJ2AuIiIiCisKKyAgICAgICAgc2VsZi5kZWZhdWx0RXh0ZW5zaW9ucyA9IGRlZmF1bHRFeHRlbnNpb25zCisgICAgICAgICIiIklmIG5vdCBOb25lLCBhIHN0cmluZyB3aGljaCBtdXN0IGluIGl0cworICAgICAgICBlbnRpcmV0eSBtYXRjaCB0aGUgcGF0dGVybiBpbiB0aGUgInN1cHBvcnRlZCIgYXR0cmlidXRlIG9mCisgICAgICAgIHRoZSBgPGV4dGVuc2lvbj5gLiBEZWZhdWx0cyB0byBOb25lLiBVc3VhbGx5IHRoZSBzYW1lIGFzIGFwaW5hbWUuIiIiCisKKyAgICAgICAgc2VsZi5hZGRFeHRlbnNpb25zID0gc2VsZi5lbXB0eVJlZ2V4KGFkZEV4dGVuc2lvbnMpCisgICAgICAgICIiInJlZ2V4IG1hdGNoaW5nIG5hbWVzIG9mIGFkZGl0aW9uYWwgZXh0ZW5zaW9ucworICAgICAgICB0byBpbmNsdWRlLiBEZWZhdWx0cyB0byBOb25lLiIiIgorCisgICAgICAgIHNlbGYucmVtb3ZlRXh0ZW5zaW9ucyA9IHNlbGYuZW1wdHlSZWdleChyZW1vdmVFeHRlbnNpb25zKQorICAgICAgICAiIiJyZWdleCBtYXRjaGluZyBuYW1lcyBvZiBleHRlbnNpb25zIHRvCisgICAgICAgIHJlbW92ZSAoYWZ0ZXIgZGVmYXVsdEV4dGVuc2lvbnMgYW5kIGFkZEV4dGVuc2lvbnMpLiBEZWZhdWx0cworICAgICAgICB0byBOb25lLiIiIgorCisgICAgICAgIHNlbGYuZW1pdEV4dGVuc2lvbnMgPSBzZWxmLmVtcHR5UmVnZXgoZW1pdEV4dGVuc2lvbnMpCisgICAgICAgICIiInJlZ2V4IG1hdGNoaW5nIG5hbWVzIG9mIGV4dGVuc2lvbnMgdG8gYWN0dWFsbHkgZW1pdAorICAgICAgICBpbnRlcmZhY2VzIGZvciAodGhvdWdoIGFsbCByZXF1ZXN0ZWQgdmVyc2lvbnMgYXJlIGNvbnNpZGVyZWQgd2hlbgorICAgICAgICBkZWNpZGluZyB3aGljaCBpbnRlcmZhY2VzIHRvIGdlbmVyYXRlKS4iIiIKKworICAgICAgICBzZWxmLnNvcnRQcm9jZWR1cmUgPSBzb3J0UHJvY2VkdXJlCisgICAgICAgICIiInRha2VzIGEgbGlzdCBvZiBGZWF0dXJlSW5mbyBvYmplY3RzIGFuZCBzb3J0cworICAgICAgICB0aGVtIGluIHBsYWNlIHRvIGEgcHJlZmVycmVkIG9yZGVyIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LgorICAgICAgICBEZWZhdWx0IGlzIGNvcmUgQVBJIHZlcnNpb25zLCBBUkIvS0hSL09FUyBleHRlbnNpb25zLCBhbGwKKyAgICAgICAgb3RoZXIgZXh0ZW5zaW9ucywgYWxwaGFiZXRpY2FsbHkgd2l0aGluIGVhY2ggZ3JvdXAuIiIiCisKKyAgICBkZWYgZW1wdHlSZWdleChzZWxmLCBwYXQpOgorICAgICAgICAiIiJTdWJzdGl0dXRlIGEgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIG1hdGNoZXMgbm8gdmVyc2lvbgorICAgICAgICBvciBleHRlbnNpb24gbmFtZXMgZm9yIE5vbmUgb3IgdGhlIGVtcHR5IHN0cmluZy4iIiIKKyAgICAgICAgaWYgbm90IHBhdDoKKyAgICAgICAgICAgIHJldHVybiAnX25vbWF0Y2hfXicKKworICAgICAgICByZXR1cm4gcGF0CisKKworY2xhc3MgT3V0cHV0R2VuZXJhdG9yOgorICAgICIiIkdlbmVyYXRlIHNwZWNpZmllZCBBUEkgaW50ZXJmYWNlcyBpbiBhIHNwZWNpZmljIHN0eWxlLCBzdWNoIGFzIGEgQyBoZWFkZXIuCisKKyAgICBCYXNlIGNsYXNzIGZvciBnZW5lcmF0aW5nIEFQSSBpbnRlcmZhY2VzLgorICAgIE1hbmFnZXMgYmFzaWMgbG9naWMsIGxvZ2dpbmcsIGFuZCBvdXRwdXQgZmlsZSBjb250cm9sLgorICAgIERlcml2ZWQgY2xhc3NlcyBhY3R1YWxseSBnZW5lcmF0ZSBmb3JtYXR0ZWQgb3V0cHV0LgorICAgICIiIgorCisgICAgIyBjYXRlZ29yeVRvUGF0aCAtIG1hcCBYTUwgJ2NhdGVnb3J5JyB0byBpbmNsdWRlIGZpbGUgZGlyZWN0b3J5IG5hbWUKKyAgICBjYXRlZ29yeVRvUGF0aCA9IHsKKyAgICAgICAgJ2JpdG1hc2snOiAnZmxhZ3MnLAorICAgICAgICAnZW51bSc6ICdlbnVtcycsCisgICAgICAgICdmdW5jcG9pbnRlcic6ICdmdW5jcG9pbnRlcnMnLAorICAgICAgICAnaGFuZGxlJzogJ2hhbmRsZXMnLAorICAgICAgICAnZGVmaW5lJzogJ2RlZmluZXMnLAorICAgICAgICAnYmFzZXR5cGUnOiAnYmFzZXR5cGVzJywKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyRmlsZT1zeXMuc3RkZXJyLCB3YXJuRmlsZT1zeXMuc3RkZXJyLCBkaWFnRmlsZT1zeXMuc3Rkb3V0KToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IKKworICAgICAgICAtIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSAtIGZpbGUgaGFuZGxlcyB0byB3cml0ZSBlcnJvcnMsCisgICAgICAgICAgd2FybmluZ3MsIGRpYWdub3N0aWNzIHRvLiBNYXkgYmUgTm9uZSB0byBub3Qgd3JpdGUuIiIiCisgICAgICAgIHNlbGYub3V0RmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5lcnJGaWxlID0gZXJyRmlsZQorICAgICAgICBzZWxmLndhcm5GaWxlID0gd2FybkZpbGUKKyAgICAgICAgc2VsZi5kaWFnRmlsZSA9IGRpYWdGaWxlCisgICAgICAgICMgSW50ZXJuYWwgc3RhdGUKKyAgICAgICAgc2VsZi5mZWF0dXJlTmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5nZW5PcHRzID0gTm9uZQorICAgICAgICBzZWxmLnJlZ2lzdHJ5ID0gTm9uZQorICAgICAgICAjIFVzZWQgZm9yIGV4dGVuc2lvbiBlbnVtIHZhbHVlIGdlbmVyYXRpb24KKyAgICAgICAgc2VsZi5leHRCYXNlID0gMTAwMDAwMDAwMAorICAgICAgICBzZWxmLmV4dEJsb2NrU2l6ZSA9IDEwMDAKKyAgICAgICAgc2VsZi5tYWRlRGlycyA9IHt9CisKKyAgICBkZWYgbG9nTXNnKHNlbGYsIGxldmVsLCAqYXJncyk6CisgICAgICAgICIiIldyaXRlIGEgbWVzc2FnZSBvZiBkaWZmZXJlbnQgY2F0ZWdvcmllcyB0byBkaWZmZXJlbnQKKyAgICAgICAgZGVzdGluYXRpb25zLgorCisgICAgICAgIC0gYGxldmVsYAorICAgICAgICAgIC0gJ2RpYWcnIChkaWFnbm9zdGljLCB2b2x1bWlub3VzKQorICAgICAgICAgIC0gJ3dhcm4nICh3YXJuaW5nKQorICAgICAgICAgIC0gJ2Vycm9yJyAoZmF0YWwgZXJyb3IgLSByYWlzZXMgZXhjZXB0aW9uIGFmdGVyIGxvZ2dpbmcpCisKKyAgICAgICAgLSBgKmFyZ3NgIC0gcHJpbnQoKS1zdHlsZSBhcmd1bWVudHMgdG8gZGlyZWN0IHRvIGNvcnJlc3BvbmRpbmcgbG9nIiIiCisgICAgICAgIGlmIGxldmVsID09ICdlcnJvcic6CisgICAgICAgICAgICBzdHJmaWxlID0gaW8uU3RyaW5nSU8oKQorICAgICAgICAgICAgd3JpdGUoJ0VSUk9SOicsICphcmdzLCBmaWxlPXN0cmZpbGUpCisgICAgICAgICAgICBpZiBzZWxmLmVyckZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgd3JpdGUoc3RyZmlsZS5nZXR2YWx1ZSgpLCBmaWxlPXNlbGYuZXJyRmlsZSkKKyAgICAgICAgICAgIHJhaXNlIFVzZXJXYXJuaW5nKHN0cmZpbGUuZ2V0dmFsdWUoKSkKKyAgICAgICAgZWxpZiBsZXZlbCA9PSAnd2Fybic6CisgICAgICAgICAgICBpZiBzZWxmLndhcm5GaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHdyaXRlKCdXQVJOSU5HOicsICphcmdzLCBmaWxlPXNlbGYud2FybkZpbGUpCisgICAgICAgIGVsaWYgbGV2ZWwgPT0gJ2RpYWcnOgorICAgICAgICAgICAgaWYgc2VsZi5kaWFnRmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB3cml0ZSgnRElBRzonLCAqYXJncywgZmlsZT1zZWxmLmRpYWdGaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVXNlcldhcm5pbmcoCisgICAgICAgICAgICAgICAgJyoqKiBGQVRBTCBFUlJPUiBpbiBHZW5lcmF0b3IubG9nTXNnOiB1bmtub3duIGxldmVsOicgKyBsZXZlbCkKKworICAgIGRlZiBlbnVtVG9WYWx1ZShzZWxmLCBlbGVtLCBuZWVkc051bSk6CisgICAgICAgICIiIlBhcnNlIGFuZCBjb252ZXJ0IGFuIGA8ZW51bT5gIHRhZyBpbnRvIGEgdmFsdWUuCisKKyAgICAgICAgUmV0dXJucyBhIGxpc3Q6CisKKyAgICAgICAgLSBmaXJzdCBlbGVtZW50IC0gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUsIG9yIE5vbmUKKyAgICAgICAgICBpZiBuZWVkc051bSBpcyBGYWxzZS4gVGhlIHZhbHVlIG11c3QgYmUgYSBsZWdhbCBudW1iZXIKKyAgICAgICAgICBpZiBuZWVkc051bSBpcyBUcnVlLgorICAgICAgICAtIHNlY29uZCBlbGVtZW50IC0gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZQorCisgICAgICAgIFRoZXJlIGFyZSBzZXZlcmFsIHBvc3NpYmxlIHJlcHJlc2VudGF0aW9ucyBvZiB2YWx1ZXMuCisKKyAgICAgICAgLSBBICd2YWx1ZScgYXR0cmlidXRlIHNpbXBseSBjb250YWlucyB0aGUgdmFsdWUuCisgICAgICAgIC0gQSAnYml0cG9zJyBhdHRyaWJ1dGUgZGVmaW5lcyBhIHZhbHVlIGJ5IHNwZWNpZnlpbmcgdGhlIGJpdAorICAgICAgICAgIHBvc2l0aW9uIHdoaWNoIGlzIHNldCBpbiB0aGF0IHZhbHVlLgorICAgICAgICAtIEFuICdvZmZzZXQnLCdleHRiYXNlJywnZXh0ZW5kcycgdHJpcGxldCBzcGVjaWZpZXMgYSB2YWx1ZQorICAgICAgICAgIGFzIGFuIG9mZnNldCB0byBhIGJhc2UgdmFsdWUgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgJ2V4dGJhc2UnIGV4dGVuc2lvbiBuYW1lLCB3aGljaCBpcyB0aGVuIGNhc3QgdG8gdGhlCisgICAgICAgICAgdHlwZW5hbWUgc3BlY2lmaWVkIGJ5ICdleHRlbmRzJy4gVGhpcyByZXF1aXJlcyBwcm9iaW5nCisgICAgICAgICAgdGhlIHJlZ2lzdHJ5IGRhdGFiYXNlLCBhbmQgaW1iZWRzIGtub3dsZWRnZSBvZiB0aGUKKyAgICAgICAgICBBUEkgZXh0ZW5zaW9uIGVudW0gc2NoZW1lIGluIHRoaXMgZnVuY3Rpb24uCisgICAgICAgIC0gQW4gJ2FsaWFzJyBhdHRyaWJ1dGUgY29udGFpbnMgdGhlIG5hbWUgb2YgYW5vdGhlciBlbnVtCisgICAgICAgICAgd2hpY2ggdGhpcyBpcyBhbiBhbGlhcyBvZi4gVGhlIG90aGVyIGVudW0gbXVzdCBiZQorICAgICAgICAgIGRlY2xhcmVkIGZpcnN0IHdoZW4gZW1pdHRpbmcgdGhpcyBlbnVtLiIiIgorICAgICAgICBuYW1lID0gZWxlbS5nZXQoJ25hbWUnKQorICAgICAgICBudW1WYWwgPSBOb25lCisgICAgICAgIGlmICd2YWx1ZScgaW4gZWxlbS5rZXlzKCk6CisgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0KCd2YWx1ZScpCisgICAgICAgICAgICAjIHByaW50KCdBYm91dCB0byB0cmFuc2xhdGUgdmFsdWUgPScsIHZhbHVlLCAndHlwZSA9JywgdHlwZSh2YWx1ZSkpCisgICAgICAgICAgICBpZiBuZWVkc051bToKKyAgICAgICAgICAgICAgICBudW1WYWwgPSBpbnQodmFsdWUsIDApCisgICAgICAgICAgICAjIElmIHRoZXJlJ3MgYSBub24taW50ZWdlciwgbnVtZXJpYyAndHlwZScgYXR0cmlidXRlIChlLmcuICd1JyBvcgorICAgICAgICAgICAgIyAndWxsJyksIGFwcGVuZCBpdCB0byB0aGUgc3RyaW5nIHZhbHVlLgorICAgICAgICAgICAgIyB0ID0gZW51bWluZm8uZWxlbS5nZXQoJ3R5cGUnKQorICAgICAgICAgICAgIyBpZiB0IGlzIG5vdCBOb25lIGFuZCB0ICE9ICcnIGFuZCB0ICE9ICdpJyBhbmQgdCAhPSAncyc6CisgICAgICAgICAgICAjICAgICB2YWx1ZSArPSBlbnVtaW5mby50eXBlCisgICAgICAgICAgICBzZWxmLmxvZ01zZygnZGlhZycsICdFbnVtJywgbmFtZSwgJy0+IHZhbHVlIFsnLCBudW1WYWwsICcsJywgdmFsdWUsICddJykKKyAgICAgICAgICAgIHJldHVybiBbbnVtVmFsLCB2YWx1ZV0KKyAgICAgICAgaWYgJ2JpdHBvcycgaW4gZWxlbS5rZXlzKCk6CisgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0KCdiaXRwb3MnKQorICAgICAgICAgICAgYml0cG9zID0gaW50KHZhbHVlLCAwKQorICAgICAgICAgICAgbnVtVmFsID0gMSA8PCBiaXRwb3MKKyAgICAgICAgICAgIHZhbHVlID0gJzB4JTA4eCcgJSBudW1WYWwKKyAgICAgICAgICAgIGlmIGJpdHBvcyA+PSAzMjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJ1VMTCcKKyAgICAgICAgICAgIHNlbGYubG9nTXNnKCdkaWFnJywgJ0VudW0nLCBuYW1lLCAnLT4gYml0cG9zIFsnLCBudW1WYWwsICcsJywgdmFsdWUsICddJykKKyAgICAgICAgICAgIHJldHVybiBbbnVtVmFsLCB2YWx1ZV0KKyAgICAgICAgaWYgJ29mZnNldCcgaW4gZWxlbS5rZXlzKCk6CisgICAgICAgICAgICAjIE9idGFpbiB2YWx1ZXMgaW4gdGhlIG1hcHBpbmcgZnJvbSB0aGUgYXR0cmlidXRlcworICAgICAgICAgICAgZW51bU5lZ2F0aXZlID0gRmFsc2UKKyAgICAgICAgICAgIG9mZnNldCA9IGludChlbGVtLmdldCgnb2Zmc2V0JyksIDApCisgICAgICAgICAgICBleHRudW1iZXIgPSBpbnQoZWxlbS5nZXQoJ2V4dG51bWJlcicpLCAwKQorICAgICAgICAgICAgZXh0ZW5kcyA9IGVsZW0uZ2V0KCdleHRlbmRzJykKKyAgICAgICAgICAgIGlmICdkaXInIGluIGVsZW0ua2V5cygpOgorICAgICAgICAgICAgICAgIGVudW1OZWdhdGl2ZSA9IFRydWUKKyAgICAgICAgICAgIHNlbGYubG9nTXNnKCdkaWFnJywgJ0VudW0nLCBuYW1lLCAnb2Zmc2V0ID0nLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAnZXh0bnVtYmVyID0nLCBleHRudW1iZXIsICdleHRlbmRzID0nLCBleHRlbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2VudW1OZWdhdGl2ZSA9JywgZW51bU5lZ2F0aXZlKQorICAgICAgICAgICAgIyBOb3cgZGV0ZXJtaW5lIHRoZSBhY3R1YWwgZW51bWVyYW50IHZhbHVlLCBhcyBkZWZpbmVkCisgICAgICAgICAgICAjIGluIHRoZSAiTGF5ZXJzIGFuZCBFeHRlbnNpb25zIiBhcHBlbmRpeCBvZiB0aGUgc3BlYy4KKyAgICAgICAgICAgIG51bVZhbCA9IHNlbGYuZXh0QmFzZSArIChleHRudW1iZXIgLSAxKSAqIHNlbGYuZXh0QmxvY2tTaXplICsgb2Zmc2V0CisgICAgICAgICAgICBpZiBlbnVtTmVnYXRpdmU6CisgICAgICAgICAgICAgICAgbnVtVmFsICo9IC0xCisgICAgICAgICAgICB2YWx1ZSA9ICclZCcgJSBudW1WYWwKKyAgICAgICAgICAgICMgTW9yZSBsb2dpYyBuZWVkZWQhCisgICAgICAgICAgICBzZWxmLmxvZ01zZygnZGlhZycsICdFbnVtJywgbmFtZSwgJy0+IG9mZnNldCBbJywgbnVtVmFsLCAnLCcsIHZhbHVlLCAnXScpCisgICAgICAgICAgICByZXR1cm4gW251bVZhbCwgdmFsdWVdCisgICAgICAgIGlmICdhbGlhcycgaW4gZWxlbS5rZXlzKCk6CisgICAgICAgICAgICByZXR1cm4gW05vbmUsIGVsZW0uZ2V0KCdhbGlhcycpXQorICAgICAgICByZXR1cm4gW05vbmUsIE5vbmVdCisKKyAgICBkZWYgY2hlY2tEdXBsaWNhdGVFbnVtcyhzZWxmLCBlbnVtcyk6CisgICAgICAgICIiIlNhbml0eSBjaGVjayBlbnVtZXJhdGVkIHZhbHVlcy4KKworICAgICAgICAtICBlbnVtcyAtIGxpc3Qgb2YgYDxlbnVtPmAgRWxlbWVudHMKKworICAgICAgICByZXR1cm5zIHRoZSBsaXN0IHdpdGggZHVwbGljYXRlcyBzdHJpcHBlZCIiIgorICAgICAgICAjIERpY3Rpb25hcmllcyBpbmRleGVkIGJ5IG5hbWUgYW5kIG51bWVyaWMgdmFsdWUuCisgICAgICAgICMgRW50cmllcyBhcmUgWyBFbGVtZW50LCBudW1WYWwsIHN0clZhbCBdIG1hdGNoaW5nIG5hbWUgb3IgdmFsdWUKKworICAgICAgICBuYW1lTWFwID0ge30KKyAgICAgICAgdmFsdWVNYXAgPSB7fQorCisgICAgICAgIHN0cmlwcGVkID0gW10KKyAgICAgICAgZm9yIGVsZW0gaW4gZW51bXM6CisgICAgICAgICAgICBuYW1lID0gZWxlbS5nZXQoJ25hbWUnKQorICAgICAgICAgICAgKG51bVZhbCwgc3RyVmFsKSA9IHNlbGYuZW51bVRvVmFsdWUoZWxlbSwgVHJ1ZSkKKworICAgICAgICAgICAgaWYgbmFtZSBpbiBuYW1lTWFwOgorICAgICAgICAgICAgICAgICMgRHVwbGljYXRlIG5hbWUgZm91bmQ7IGNoZWNrIHZhbHVlcworICAgICAgICAgICAgICAgIChuYW1lMiwgbnVtVmFsMiwgc3RyVmFsMikgPSBuYW1lTWFwW25hbWVdCisKKyAgICAgICAgICAgICAgICAjIER1cGxpY2F0ZSBlbnVtIHZhbHVlcyBmb3IgdGhlIHNhbWUgbmFtZSBhcmUgYmVuaWduLiBUaGlzCisgICAgICAgICAgICAgICAgIyBoYXBwZW5zIHdoZW4gZGVmaW5pbmcgdGhlIHNhbWUgZW51bSBjb25kaXRpb25hbGx5IGluCisgICAgICAgICAgICAgICAgIyBzZXZlcmFsIGV4dGVuc2lvbiBibG9ja3MuCisgICAgICAgICAgICAgICAgaWYgKHN0clZhbDIgPT0gc3RyVmFsIG9yIChudW1WYWwgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBudW1WYWwgPT0gbnVtVmFsMikpOgorICAgICAgICAgICAgICAgICAgICBUcnVlCisgICAgICAgICAgICAgICAgICAgICMgc2VsZi5sb2dNc2coJ2luZm8nLCAnY2hlY2tEdXBsaWNhdGVFbnVtczogRHVwbGljYXRlIGVudW0gKCcgKyBuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAnKSBmb3VuZCB3aXRoIHRoZSBzYW1lIHZhbHVlOicgKyBzdHJWYWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dNc2coJ3dhcm4nLCAnY2hlY2tEdXBsaWNhdGVFbnVtczogRHVwbGljYXRlIGVudW0gKCcgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJykgZm91bmQgd2l0aCBkaWZmZXJlbnQgdmFsdWVzOicgKyBzdHJWYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGFuZCAnICsgc3RyVmFsMikKKworICAgICAgICAgICAgICAgICMgRG9uJ3QgYWRkIHRoZSBkdXBsaWNhdGUgdG8gdGhlIHJldHVybmVkIGxpc3QKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBudW1WYWwgaW4gdmFsdWVNYXA6CisgICAgICAgICAgICAgICAgIyBEdXBsaWNhdGUgdmFsdWUgZm91bmQgKHN1Y2ggYXMgYW4gYWxpYXMpOyByZXBvcnQgaXQsIGJ1dAorICAgICAgICAgICAgICAgICMgc3RpbGwgYWRkIHRoaXMgZW51bSB0byB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAobmFtZTIsIG51bVZhbDIsIHN0clZhbDIpID0gdmFsdWVNYXBbbnVtVmFsXQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ01zZygnd2FybicsICdUd28gZW51bXMgZm91bmQgd2l0aCB0aGUgc2FtZSB2YWx1ZTogJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKyAnID0gJyArIG5hbWUyLmdldCgnbmFtZScpICsgJyA9ICcgKyBzdHJWYWwpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwZGIuc2V0X3RyYWNlKCkKKworICAgICAgICAgICAgIyBUcmFjayB0aGlzIGVudW0gdG8gZGV0ZWN0IGZvbGxvd29uIGR1cGxpY2F0ZXMKKyAgICAgICAgICAgIG5hbWVNYXBbbmFtZV0gPSBbZWxlbSwgbnVtVmFsLCBzdHJWYWxdCisgICAgICAgICAgICBpZiBudW1WYWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWVNYXBbbnVtVmFsXSA9IFtlbGVtLCBudW1WYWwsIHN0clZhbF0KKworICAgICAgICAgICAgIyBBZGQgdGhpcyBlbnVtIHRvIHRoZSBsaXN0CisgICAgICAgICAgICBzdHJpcHBlZC5hcHBlbmQoZWxlbSkKKworICAgICAgICAjIFJldHVybiB0aGUgbGlzdAorICAgICAgICByZXR1cm4gc3RyaXBwZWQKKworICAgIGRlZiBidWlsZEVudW1DRGVjbChzZWxmLCBleHBhbmQsIGdyb3VwaW5mbywgZ3JvdXBOYW1lKToKKyAgICAgICAgIiIiR2VuZXJhdGUgdGhlIEMgZGVjbGFyYXRpb24gZm9yIGFuIGVudW0iIiIKKyAgICAgICAgZ3JvdXBFbGVtID0gZ3JvdXBpbmZvLmVsZW0KKworICAgICAgICBpZiBzZWxmLmdlbk9wdHMuY29udmVudGlvbnMuY29uc3RGbGFnQml0cyBhbmQgZ3JvdXBFbGVtLmdldCgndHlwZScpID09ICdiaXRtYXNrJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkRW51bUNEZWNsX0JpdG1hc2soZ3JvdXBpbmZvLCBncm91cE5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5idWlsZEVudW1DRGVjbF9FbnVtKGV4cGFuZCwgZ3JvdXBpbmZvLCBncm91cE5hbWUpCisKKyAgICBkZWYgYnVpbGRFbnVtQ0RlY2xfQml0bWFzayhzZWxmLCBncm91cGluZm8sIGdyb3VwTmFtZSk6CisgICAgICAgICIiIkdlbmVyYXRlIHRoZSBDIGRlY2xhcmF0aW9uIGZvciBhbiAiZW51bSIgdGhhdCBpcyBhY3R1YWxseSBhCisgICAgICAgIHNldCBvZiBmbGFnIGJpdHMiIiIKKyAgICAgICAgZ3JvdXBFbGVtID0gZ3JvdXBpbmZvLmVsZW0KKyAgICAgICAgZmxhZ1R5cGVOYW1lID0gZ3JvdXBpbmZvLmZsYWdUeXBlLmVsZW0uZ2V0KCduYW1lJykKKworICAgICAgICAjIFByZWZpeAorICAgICAgICBib2R5ID0gIi8vIEZsYWcgYml0cyBmb3IgIiArIGZsYWdUeXBlTmFtZSArICJcbiIKKworICAgICAgICAjIExvb3Agb3ZlciB0aGUgbmVzdGVkICdlbnVtJyB0YWdzLgorICAgICAgICBmb3IgZWxlbSBpbiBncm91cEVsZW0uZmluZGFsbCgnZW51bScpOgorICAgICAgICAgICAgIyBDb252ZXJ0IHRoZSB2YWx1ZSB0byBhbiBpbnRlZ2VyIGFuZCB1c2UgdGhhdCB0byB0cmFjayBtaW4vbWF4LgorICAgICAgICAgICAgIyBWYWx1ZXMgb2YgZm9ybSAtKG51bWJlcikgYXJlIGFjY2VwdGVkIGJ1dCBub3RoaW5nIG1vcmUgY29tcGxleC4KKyAgICAgICAgICAgICMgU2hvdWxkIGNhdGNoIGV4Y2VwdGlvbnMgaGVyZSBmb3IgbW9yZSBjb21wbGV4IGNvbnN0cnVjdHMuIE5vdCB5ZXQuCisgICAgICAgICAgICAoXywgc3RyVmFsKSA9IHNlbGYuZW51bVRvVmFsdWUoZWxlbSwgVHJ1ZSkKKyAgICAgICAgICAgIG5hbWUgPSBlbGVtLmdldCgnbmFtZScpCisgICAgICAgICAgICBib2R5ICs9ICJzdGF0aWMgY29uc3Qge30ge30gPSB7fTtcbiIuZm9ybWF0KGZsYWdUeXBlTmFtZSwgbmFtZSwgc3RyVmFsKQorCisgICAgICAgICMgUG9zdGZpeAorCisgICAgICAgIHJldHVybiAoImJpdG1hc2siLCBib2R5KQorCisgICAgZGVmIGJ1aWxkRW51bUNEZWNsX0VudW0oc2VsZiwgZXhwYW5kLCBncm91cGluZm8sIGdyb3VwTmFtZSk6CisgICAgICAgICIiIkdlbmVyYXRlIHRoZSBDIGRlY2xhcmF0aW9uIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUiIiIKKyAgICAgICAgZ3JvdXBFbGVtID0gZ3JvdXBpbmZvLmVsZW0KKworICAgICAgICAjIEJyZWFrIHRoZSBncm91cCBuYW1lIGludG8gcHJlZml4IGFuZCBzdWZmaXggcG9ydGlvbnMgZm9yIHJhbmdlCisgICAgICAgICMgZW51bSBnZW5lcmF0aW9uCisgICAgICAgIGV4cGFuZE5hbWUgPSByZS5zdWIocicoWzAtOWEtel9dKShbQS1aMC05XSknLCByJ1wxX1wyJywgZ3JvdXBOYW1lKS51cHBlcigpCisgICAgICAgIGV4cGFuZFByZWZpeCA9IGV4cGFuZE5hbWUKKyAgICAgICAgZXhwYW5kU3VmZml4ID0gJycKKyAgICAgICAgZXhwYW5kU3VmZml4TWF0Y2ggPSByZS5zZWFyY2gocidbQS1aXVtBLVpdKyQnLCBncm91cE5hbWUpCisgICAgICAgIGlmIGV4cGFuZFN1ZmZpeE1hdGNoOgorICAgICAgICAgICAgZXhwYW5kU3VmZml4ID0gJ18nICsgZXhwYW5kU3VmZml4TWF0Y2guZ3JvdXAoKQorICAgICAgICAgICAgIyBTdHJpcCBvZmYgdGhlIHN1ZmZpeCBmcm9tIHRoZSBwcmVmaXgKKyAgICAgICAgICAgIGV4cGFuZFByZWZpeCA9IGV4cGFuZE5hbWUucnNwbGl0KGV4cGFuZFN1ZmZpeCwgMSlbMF0KKworICAgICAgICAjIFByZWZpeAorICAgICAgICBib2R5ID0gWyJ0eXBlZGVmIGVudW0gJXMgeyIgJSBncm91cE5hbWVdCisKKyAgICAgICAgIyBAQCBTaG91bGQgdXNlIHRoZSB0eXBlPSJiaXRtYXNrIiBhdHRyaWJ1dGUgaW5zdGVhZAorICAgICAgICBpc0VudW0gPSAoJ0ZMQUdfQklUUycgbm90IGluIGV4cGFuZFByZWZpeCkKKworICAgICAgICAjIEdldCBhIGxpc3Qgb2YgbmVzdGVkICdlbnVtJyB0YWdzLgorICAgICAgICBlbnVtcyA9IGdyb3VwRWxlbS5maW5kYWxsKCdlbnVtJykKKworICAgICAgICAjIENoZWNrIGZvciBhbmQgcmVwb3J0IGR1cGxpY2F0ZXMsIGFuZCByZXR1cm4gYSBsaXN0IHdpdGggdGhlbQorICAgICAgICAjIHJlbW92ZWQuCisgICAgICAgIGVudW1zID0gc2VsZi5jaGVja0R1cGxpY2F0ZUVudW1zKGVudW1zKQorCisgICAgICAgICMgTG9vcCBvdmVyIHRoZSBuZXN0ZWQgJ2VudW0nIHRhZ3MuIEtlZXAgdHJhY2sgb2YgdGhlIG1pbmltdW0gYW5kCisgICAgICAgICMgbWF4aW11bSBudW1lcmljIHZhbHVlcywgaWYgdGhleSBjYW4gYmUgZGV0ZXJtaW5lZDsgYnV0IG9ubHkgZm9yCisgICAgICAgICMgY29yZSBBUEkgZW51bWVyYW50cywgbm90IGV4dGVuc2lvbiBlbnVtZXJhbnRzLiBUaGlzIGlzIGluZmVycmVkCisgICAgICAgICMgYnkgbG9va2luZyBmb3IgJ2V4dGVuZHMnIGF0dHJpYnV0ZXMuCisgICAgICAgIG1pbk5hbWUgPSBOb25lCisKKyAgICAgICAgIyBBY2N1bXVsYXRlIG5vbi1udW1lcmljIGVudW1lcmFudCB2YWx1ZXMgc2VwYXJhdGVseSBhbmQgYXBwZW5kCisgICAgICAgICMgdGhlbSBmb2xsb3dpbmcgdGhlIG51bWVyaWMgdmFsdWVzLCB0byBhbGxvdyBmb3IgYWxpYXNlcy4KKyAgICAgICAgIyBOT1RFOiB0aGlzIGRvZXNuJ3QgZG8gYSB0b3BvbG9naWNhbCBzb3J0IHlldCwgc28gYWxpYXNlcyBvZgorICAgICAgICAjIGFsaWFzZXMgY2FuIHN0aWxsIGdldCBpbiB0aGUgd3Jvbmcgb3JkZXIuCisgICAgICAgIGFsaWFzVGV4dCA9IFtdCisKKyAgICAgICAgZm9yIGVsZW0gaW4gZW51bXM6CisgICAgICAgICAgICAjIENvbnZlcnQgdGhlIHZhbHVlIHRvIGFuIGludGVnZXIgYW5kIHVzZSB0aGF0IHRvIHRyYWNrIG1pbi9tYXguCisgICAgICAgICAgICAjIFZhbHVlcyBvZiBmb3JtIC0obnVtYmVyKSBhcmUgYWNjZXB0ZWQgYnV0IG5vdGhpbmcgbW9yZSBjb21wbGV4LgorICAgICAgICAgICAgIyBTaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyBoZXJlIGZvciBtb3JlIGNvbXBsZXggY29uc3RydWN0cy4gTm90IHlldC4KKyAgICAgICAgICAgIChudW1WYWwsIHN0clZhbCkgPSBzZWxmLmVudW1Ub1ZhbHVlKGVsZW0sIFRydWUpCisgICAgICAgICAgICBuYW1lID0gZWxlbS5nZXQoJ25hbWUnKQorCisgICAgICAgICAgICAjIEV4dGVuc2lvbiBlbnVtZXJhbnRzIGFyZSBvbmx5IGluY2x1ZGVkIGlmIHRoZXkgYXJlIHJlcXVpcmVkCisgICAgICAgICAgICBpZiBzZWxmLmlzRW51bVJlcXVpcmVkKGVsZW0pOgorICAgICAgICAgICAgICAgIGRlY2wgPSAiICAgIHt9ID0ge30sIi5mb3JtYXQobmFtZSwgc3RyVmFsKQorICAgICAgICAgICAgICAgIGlmIG51bVZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoZGVjbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhbGlhc1RleHQuYXBwZW5kKGRlY2wpCisKKyAgICAgICAgICAgICMgRG9uJ3QgdHJhY2sgbWluL21heCBmb3Igbm9uLW51bWJlcnMgKG51bVZhbCBpcyBOb25lKQorICAgICAgICAgICAgaWYgaXNFbnVtIGFuZCBudW1WYWwgaXMgbm90IE5vbmUgYW5kIGVsZW0uZ2V0KCdleHRlbmRzJykgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBtaW5OYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG1pbk5hbWUgPSBtYXhOYW1lID0gbmFtZQorICAgICAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IG1heFZhbHVlID0gbnVtVmFsCisgICAgICAgICAgICAgICAgZWxpZiBudW1WYWwgPCBtaW5WYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgbWluTmFtZSA9IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgbWluVmFsdWUgPSBudW1WYWwKKyAgICAgICAgICAgICAgICBlbGlmIG51bVZhbCA+IG1heFZhbHVlOgorICAgICAgICAgICAgICAgICAgICBtYXhOYW1lID0gbmFtZQorICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IG51bVZhbAorCisgICAgICAgICMgTm93IGFwcGVuZCB0aGUgbm9uLW51bWVyaWMgZW51bWVyYW50IHZhbHVlcworICAgICAgICBib2R5LmV4dGVuZChhbGlhc1RleHQpCisKKyAgICAgICAgIyBHZW5lcmF0ZSBtaW4vbWF4IHZhbHVlIHRva2VucyBhbmQgYSByYW5nZS1wYWRkaW5nIGVudW0uIE5lZWQgc29tZQorICAgICAgICAjIGFkZGl0aW9uYWwgcGFkZGluZyB0byBnZW5lcmF0ZSBjb3JyZWN0IG5hbWVzLi4uCisgICAgICAgIGlmIGlzRW51bSBhbmQgZXhwYW5kOgorICAgICAgICAgICAgYm9keS5leHRlbmQoKCIgICAge31fQkVHSU5fUkFOR0V7fSA9IHt9LCIuZm9ybWF0KGV4cGFuZFByZWZpeCwgZXhwYW5kU3VmZml4LCBtaW5OYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHt9X0VORF9SQU5HRXt9ID0ge30sIi5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZFByZWZpeCwgZXhwYW5kU3VmZml4LCBtYXhOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHt9X1JBTkdFX1NJWkV7fSA9ICh7fSAtIHt9ICsgMSksIi5mb3JtYXQoZXhwYW5kUHJlZml4LCBleHBhbmRTdWZmaXgsIG1heE5hbWUsIG1pbk5hbWUpKSkKKworICAgICAgICBib2R5LmFwcGVuZCgiICAgIHt9X01BWF9FTlVNe30gPSAweDdGRkZGRkZGIi5mb3JtYXQoCisgICAgICAgICAgICBleHBhbmRQcmVmaXgsIGV4cGFuZFN1ZmZpeCkpCisKKyAgICAgICAgIyBQb3N0Zml4CisgICAgICAgIGJvZHkuYXBwZW5kKCJ9ICVzOyIgJSBncm91cE5hbWUpCisKKyAgICAgICAgIyBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgc2VjdGlvbiBmb3IgdGhpcyBkZWNsYXJhdGlvbgorICAgICAgICBpZiBncm91cEVsZW0uZ2V0KCd0eXBlJykgPT0gJ2JpdG1hc2snOgorICAgICAgICAgICAgc2VjdGlvbiA9ICdiaXRtYXNrJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VjdGlvbiA9ICdncm91cCcKKworICAgICAgICByZXR1cm4gKHNlY3Rpb24sICdcbicuam9pbihib2R5KSkKKworICAgIGRlZiBtYWtlRGlyKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiJDcmVhdGUgYSBkaXJlY3RvcnksIGlmIG5vdCBhbHJlYWR5IGRvbmUuCisKKyAgICAgICAgR2VuZXJhbGx5IGNhbGxlZCBmcm9tIGRlcml2ZWQgZ2VuZXJhdG9ycyBjcmVhdGluZyBoaWVyYXJjaGllcy4iIiIKKyAgICAgICAgc2VsZi5sb2dNc2coJ2RpYWcnLCAnT3V0cHV0R2VuZXJhdG9yOjptYWtlRGlyKCcgKyBwYXRoICsgJyknKQorICAgICAgICBpZiBwYXRoIG5vdCBpbiBzZWxmLm1hZGVEaXJzOgorICAgICAgICAgICAgIyBUaGlzIGNhbiBnZXQgcmFjZSBjb25kaXRpb25zIHdpdGggbXVsdGlwbGUgd3JpdGVycywgc2VlCisgICAgICAgICAgICAjIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI3MzE5Mi8KKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQorICAgICAgICAgICAgc2VsZi5tYWRlRGlyc1twYXRoXSA9IE5vbmUKKworICAgIGRlZiBiZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cyk6CisgICAgICAgICIiIlN0YXJ0IGEgbmV3IGludGVyZmFjZSBmaWxlCisKKyAgICAgICAgLSBnZW5PcHRzIC0gR2VuZXJhdG9yT3B0aW9ucyBjb250cm9sbGluZyB3aGF0J3MgZ2VuZXJhdGVkIGFuZCBob3ciIiIKKyAgICAgICAgc2VsZi5nZW5PcHRzID0gZ2VuT3B0cworICAgICAgICBzZWxmLnNob3VsZF9pbnNlcnRfbWF5X2FsaWFzX21hY3JvID0gXAorICAgICAgICAgICAgc2VsZi5nZW5PcHRzLmNvbnZlbnRpb25zLnNob3VsZF9pbnNlcnRfbWF5X2FsaWFzX21hY3JvKHNlbGYuZ2VuT3B0cykKKworICAgICAgICBzZWxmLmNvbnZlbnRpb25zID0gZ2VuT3B0cy5jb252ZW50aW9ucworCisgICAgICAgICMgT3BlbiBzcGVjaWZpZWQgb3V0cHV0IGZpbGUuIE5vdCBkb25lIGluIGNvbnN0cnVjdG9yIHNpbmNlIGEKKyAgICAgICAgIyBHZW5lcmF0b3IgY2FuIGJlIHVzZWQgd2l0aG91dCB3cml0aW5nIHRvIGEgZmlsZS4KKyAgICAgICAgaWYgc2VsZi5nZW5PcHRzLmZpbGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gUGF0aChzZWxmLmdlbk9wdHMuZGlyZWN0b3J5KQorICAgICAgICAgICAgICAgIGlmIG5vdCBQYXRoLmV4aXN0cyhkaXJlY3RvcnkpOgorICAgICAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhkaXJlY3RvcnkpCisgICAgICAgICAgICAgICAgc2VsZi5vdXRGaWxlID0gKGRpcmVjdG9yeSAvIHNlbGYuZ2VuT3B0cy5maWxlbmFtZSkub3BlbigndycsIGVuY29kaW5nPSd1dGYtOCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZW5PcHRzLmRpcmVjdG9yeSArICcvJyArIHNlbGYuZ2VuT3B0cy5maWxlbmFtZQorICAgICAgICAgICAgICAgIHNlbGYub3V0RmlsZSA9IGlvLm9wZW4oZmlsZW5hbWUsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYub3V0RmlsZSA9IHN5cy5zdGRvdXQKKworICAgIGRlZiBlbmRGaWxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVyckZpbGU6CisgICAgICAgICAgICBzZWxmLmVyckZpbGUuZmx1c2goKQorICAgICAgICBpZiBzZWxmLndhcm5GaWxlOgorICAgICAgICAgICAgc2VsZi53YXJuRmlsZS5mbHVzaCgpCisgICAgICAgIGlmIHNlbGYuZGlhZ0ZpbGU6CisgICAgICAgICAgICBzZWxmLmRpYWdGaWxlLmZsdXNoKCkKKyAgICAgICAgc2VsZi5vdXRGaWxlLmZsdXNoKCkKKyAgICAgICAgaWYgc2VsZi5vdXRGaWxlICE9IHN5cy5zdGRvdXQgYW5kIHNlbGYub3V0RmlsZSAhPSBzeXMuc3RkZXJyOgorICAgICAgICAgICAgc2VsZi5vdXRGaWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5nZW5PcHRzID0gTm9uZQorCisgICAgZGVmIGJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpOgorICAgICAgICAiIiJXcml0ZSBpbnRlcmZhY2UgZm9yIGEgZmVhdHVyZSBhbmQgdGFnIGdlbmVyYXRlZCBmZWF0dXJlcyBhcyBoYXZpbmcgYmVlbiBkb25lLgorCisgICAgICAgIC0gaW50ZXJmYWNlIC0gZWxlbWVudCBmb3IgdGhlIGA8dmVyc2lvbj5gIC8gYDxleHRlbnNpb24+YCB0byBnZW5lcmF0ZQorICAgICAgICAtIGVtaXQgLSBhY3R1YWxseSB3cml0ZSB0byB0aGUgaGVhZGVyIG9ubHkgd2hlbiBUcnVlIiIiCisgICAgICAgIHNlbGYuZW1pdCA9IGVtaXQKKyAgICAgICAgc2VsZi5mZWF0dXJlTmFtZSA9IGludGVyZmFjZS5nZXQoJ25hbWUnKQorICAgICAgICAjIElmIHRoZXJlJ3MgYW4gYWRkaXRpb25hbCAncHJvdGVjdCcgYXR0cmlidXRlIGluIHRoZSBmZWF0dXJlLCBzYXZlIGl0CisgICAgICAgIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCA9IGludGVyZmFjZS5nZXQoJ3Byb3RlY3QnKQorCisgICAgZGVmIGVuZEZlYXR1cmUoc2VsZik6CisgICAgICAgICIiIkZpbmlzaCBhbiBpbnRlcmZhY2UgZmlsZSwgY2xvc2luZyBpdCB3aGVuIGRvbmUuCisKKyAgICAgICAgRGVyaXZlZCBjbGFzc2VzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBmZWF0dXJlIiIiCisgICAgICAgIHNlbGYuZmVhdHVyZU5hbWUgPSBOb25lCisgICAgICAgIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCA9IE5vbmUKKworICAgIGRlZiB2YWxpZGF0ZUZlYXR1cmUoc2VsZiwgZmVhdHVyZVR5cGUsIGZlYXR1cmVOYW1lKToKKyAgICAgICAgIiIiVmFsaWRhdGUgd2UncmUgZ2VuZXJhdGluZyBzb21ldGhpbmcgb25seSBpbnNpZGUgYSBgPGZlYXR1cmU+YCB0YWciIiIKKyAgICAgICAgaWYgc2VsZi5mZWF0dXJlTmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVXNlcldhcm5pbmcoJ0F0dGVtcHQgdG8gZ2VuZXJhdGUnLCBmZWF0dXJlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVOYW1lLCAnd2hlbiBub3QgaW4gZmVhdHVyZScpCisKKyAgICBkZWYgZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICAiIiJHZW5lcmF0ZSBpbnRlcmZhY2UgZm9yIGEgdHlwZQorCisgICAgICAgIC0gdHlwZWluZm8gLSBUeXBlSW5mbyBmb3IgYSB0eXBlCisKKyAgICAgICAgRXh0ZW5kIHRvIGdlbmVyYXRlIGFzIGRlc2lyZWQgaW4geW91ciBkZXJpdmVkIGNsYXNzLiIiIgorICAgICAgICBzZWxmLnZhbGlkYXRlRmVhdHVyZSgndHlwZScsIG5hbWUpCisKKyAgICBkZWYgZ2VuU3RydWN0KHNlbGYsIHR5cGVpbmZvLCB0eXBlTmFtZSwgYWxpYXMpOgorICAgICAgICAiIiJHZW5lcmF0ZSBpbnRlcmZhY2UgZm9yIGEgQyAic3RydWN0IiB0eXBlLgorCisgICAgICAgIC0gdHlwZWluZm8gLSBUeXBlSW5mbyBmb3IgYSB0eXBlIGludGVycHJldGVkIGFzIGEgc3RydWN0CisKKyAgICAgICAgRXh0ZW5kIHRvIGdlbmVyYXRlIGFzIGRlc2lyZWQgaW4geW91ciBkZXJpdmVkIGNsYXNzLiIiIgorICAgICAgICBzZWxmLnZhbGlkYXRlRmVhdHVyZSgnc3RydWN0JywgdHlwZU5hbWUpCisKKyAgICAgICAgIyBUaGUgbWl4ZWQtbW9kZSA8bWVtYmVyPiB0YWdzIG1heSBjb250YWluIG5vLW9wIDxjb21tZW50PiB0YWdzLgorICAgICAgICAjIEl0IGlzIGNvbnZlbmllbnQgdG8gcmVtb3ZlIHRoZW0gaGVyZSB3aGVyZSBhbGwgb3V0cHV0IGdlbmVyYXRvcnMKKyAgICAgICAgIyB3aWxsIGJlbmVmaXQuCisgICAgICAgIGZvciBtZW1iZXIgaW4gdHlwZWluZm8uZWxlbS5maW5kYWxsKCcuLy9tZW1iZXInKToKKyAgICAgICAgICAgIGZvciBjb21tZW50IGluIG1lbWJlci5maW5kYWxsKCdjb21tZW50Jyk6CisgICAgICAgICAgICAgICAgbWVtYmVyLnJlbW92ZShjb21tZW50KQorCisgICAgZGVmIGdlbkdyb3VwKHNlbGYsIGdyb3VwaW5mbywgZ3JvdXBOYW1lLCBhbGlhcyk6CisgICAgICAgICIiIkdlbmVyYXRlIGludGVyZmFjZSBmb3IgYSBncm91cCBvZiBlbnVtcyAoQyAiZW51bSIpCisKKyAgICAgICAgLSBncm91cGluZm8gLSBHcm91cEluZm8gZm9yIGEgZ3JvdXAuCisKKyAgICAgICAgRXh0ZW5kIHRvIGdlbmVyYXRlIGFzIGRlc2lyZWQgaW4geW91ciBkZXJpdmVkIGNsYXNzLiIiIgorCisgICAgICAgIHNlbGYudmFsaWRhdGVGZWF0dXJlKCdncm91cCcsIGdyb3VwTmFtZSkKKworICAgIGRlZiBnZW5FbnVtKHNlbGYsIGVudW1pbmZvLCB0eXBlTmFtZSwgYWxpYXMpOgorICAgICAgICAiIiJHZW5lcmF0ZSBpbnRlcmZhY2UgZm9yIGFuIGVudW0gKGNvbnN0YW50KS4KKworICAgICAgICAtIGVudW1pbmZvIC0gRW51bUluZm8gZm9yIGFuIGVudW0KKyAgICAgICAgLSBuYW1lIC0gZW51bSBuYW1lCisKKyAgICAgICAgRXh0ZW5kIHRvIGdlbmVyYXRlIGFzIGRlc2lyZWQgaW4geW91ciBkZXJpdmVkIGNsYXNzLiIiIgorICAgICAgICBzZWxmLnZhbGlkYXRlRmVhdHVyZSgnZW51bScsIHR5cGVOYW1lKQorCisgICAgZGVmIGdlbkNtZChzZWxmLCBjbWQsIGNtZGluZm8sIGFsaWFzKToKKyAgICAgICAgIiIiR2VuZXJhdGUgaW50ZXJmYWNlIGZvciBhIGNvbW1hbmQuCisKKyAgICAgICAgLSBjbWRpbmZvIC0gQ21kSW5mbyBmb3IgYSBjb21tYW5kCisKKyAgICAgICAgRXh0ZW5kIHRvIGdlbmVyYXRlIGFzIGRlc2lyZWQgaW4geW91ciBkZXJpdmVkIGNsYXNzLiIiIgorICAgICAgICBzZWxmLnZhbGlkYXRlRmVhdHVyZSgnY29tbWFuZCcsIGNtZGluZm8pCisKKyAgICBkZWYgbWFrZVByb3RvTmFtZShzZWxmLCBuYW1lLCB0YWlsKToKKyAgICAgICAgIiIiVHVybiBhIGA8cHJvdG8+YCBgPG5hbWU+YCBpbnRvIEMtbGFuZ3VhZ2UgcHJvdG90eXBlCisgICAgICAgIGFuZCB0eXBlZGVmIGRlY2xhcmF0aW9ucyBmb3IgdGhhdCBuYW1lLgorCisgICAgICAgIC0gbmFtZSAtIGNvbnRlbnRzIG9mIGA8bmFtZT5gIHRhZworICAgICAgICAtIHRhaWwgLSB3aGF0ZXZlciB0ZXh0IGZvbGxvd3MgdGhhdCB0YWcgaW4gdGhlIEVsZW1lbnQiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2VuT3B0cy5hcGllbnRyeSArIG5hbWUgKyB0YWlsCisKKyAgICBkZWYgbWFrZVR5cGVkZWZOYW1lKHNlbGYsIG5hbWUsIHRhaWwpOgorICAgICAgICAiIiJNYWtlIHRoZSBmdW5jdGlvbi1wb2ludGVyIHR5cGVkZWYgbmFtZSBmb3IgYSBjb21tYW5kLiIiIgorICAgICAgICByZXR1cm4gJygnICsgc2VsZi5nZW5PcHRzLmFwaWVudHJ5cCArICdQRk5fJyArIG5hbWUgKyB0YWlsICsgJyknCisKKyAgICBkZWYgbWFrZUNQYXJhbURlY2woc2VsZiwgcGFyYW0sIGFsaWduY29sKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHdoaWNoIGlzIGFuIGluZGVudGVkLCBmb3JtYXR0ZWQKKyAgICAgICAgZGVjbGFyYXRpb24gZm9yIGEgYDxwYXJhbT5gIG9yIGA8bWVtYmVyPmAgYmxvY2sgKGUuZy4gZnVuY3Rpb24gcGFyYW1ldGVyCisgICAgICAgIG9yIHN0cnVjdHVyZS91bmlvbiBtZW1iZXIpLgorCisgICAgICAgIC0gcGFyYW0gLSBFbGVtZW50IChgPHBhcmFtPmAgb3IgYDxtZW1iZXI+YCkgdG8gZm9ybWF0CisgICAgICAgIC0gYWxpZ25jb2wgLSBpZiBub24temVybywgYXR0ZW1wdCB0byBhbGlnbiB0aGUgbmVzdGVkIGA8bmFtZT5gIGVsZW1lbnQKKyAgICAgICAgICBhdCB0aGlzIGNvbHVtbiIiIgorICAgICAgICBpbmRlbnQgPSAnICAgICcKKyAgICAgICAgcGFyYW1kZWNsID0gaW5kZW50ICsgbm9uZVN0cihwYXJhbS50ZXh0KQorICAgICAgICBmb3IgZWxlbSBpbiBwYXJhbToKKyAgICAgICAgICAgIHRleHQgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgICAgIHRhaWwgPSBub25lU3RyKGVsZW0udGFpbCkKKworICAgICAgICAgICAgaWYgc2VsZi5zaG91bGRfaW5zZXJ0X21heV9hbGlhc19tYWNybyBhbmQgc2VsZi5nZW5PcHRzLmNvbnZlbnRpb25zLmlzX3ZvaWRwb2ludGVyX2FsaWFzKGVsZW0udGFnLCB0ZXh0LCB0YWlsKToKKyAgICAgICAgICAgICAgICAjIE9wZW5YUi1zcGVjaWZpYyBtYWNybyBpbnNlcnRpb24gLSBidXQgbm90IGluIGFwaWluYyBmb3IgdGhlIHNwZWMKKyAgICAgICAgICAgICAgICB0YWlsID0gc2VsZi5nZW5PcHRzLmNvbnZlbnRpb25zLm1ha2Vfdm9pZHBvaW50ZXJfYWxpYXModGFpbCkKKyAgICAgICAgICAgIGlmIGVsZW0udGFnID09ICduYW1lJyBhbmQgYWxpZ25jb2wgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYubG9nTXNnKCdkaWFnJywgJ0FsaWduaW5nIHBhcmFtZXRlcicsIGVsZW0udGV4dCwgJ3RvIGNvbHVtbicsIHNlbGYuZ2VuT3B0cy5hbGlnbkZ1bmNQYXJhbSkKKyAgICAgICAgICAgICAgICAjIEFsaWduIGF0IHNwZWNpZmllZCBjb2x1bW4sIGlmIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgcGFyYW1kZWNsID0gcGFyYW1kZWNsLnJzdHJpcCgpCisgICAgICAgICAgICAgICAgb2xkTGVuID0gbGVuKHBhcmFtZGVjbCkKKyAgICAgICAgICAgICAgICAjIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSB3aGVyZSB2ZXJ5IGxvbmcgdHlwZSBuYW1lcyAtCisgICAgICAgICAgICAgICAgIyBsb25nZXIgdGhhbiB0aGUgYWxpZ25tZW50IGNvbHVtbiAtIHdvdWxkIHJ1biBpbnRvIHRoZSB0YWlsCisgICAgICAgICAgICAgICAgIyB0ZXh0LgorICAgICAgICAgICAgICAgIHBhcmFtZGVjbCA9IHBhcmFtZGVjbC5sanVzdChhbGlnbmNvbCAtIDEpICsgJyAnCisgICAgICAgICAgICAgICAgbmV3TGVuID0gbGVuKHBhcmFtZGVjbCkKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ01zZygnZGlhZycsICdBZGp1c3QgbGVuZ3RoIG9mIHBhcmFtZXRlciBkZWNsIGZyb20nLCBvbGRMZW4sICd0bycsIG5ld0xlbiwgJzonLCBwYXJhbWRlY2wpCisgICAgICAgICAgICBwYXJhbWRlY2wgKz0gdGV4dCArIHRhaWwKKyAgICAgICAgaWYgYWxpZ25jb2wgPT0gMDoKKyAgICAgICAgICAgICMgU3F1ZWV6ZSBvdXQgbXVsdGlwbGUgc3BhY2VzIG90aGVyIHRoYW4gdGhlIGluZGVudGF0aW9uCisgICAgICAgICAgICBwYXJhbWRlY2wgPSBpbmRlbnQgKyAnICcuam9pbihwYXJhbWRlY2wuc3BsaXQoKSkKKyAgICAgICAgcmV0dXJuIHBhcmFtZGVjbAorCisgICAgZGVmIGdldENQYXJhbVR5cGVMZW5ndGgoc2VsZiwgcGFyYW0pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdHlwZSBmaWVsZCBpcyBhbiBpbmRlbnRlZCwgZm9ybWF0dGVkCisgICAgICAgIGRlY2xhcmF0aW9uIGZvciBhIGA8cGFyYW0+YCBvciBgPG1lbWJlcj5gIGJsb2NrIChlLmcuIGZ1bmN0aW9uIHBhcmFtZXRlcgorICAgICAgICBvciBzdHJ1Y3R1cmUvdW5pb24gbWVtYmVyKS4KKworICAgICAgICAtIHBhcmFtIC0gRWxlbWVudCAoYDxwYXJhbT5gIG9yIGA8bWVtYmVyPmApIHRvIGlkZW50aWZ5IiIiCisgICAgICAgICMgQWxsb3cgZm9yIG1pc3NpbmcgPG5hbWU+IHRhZworICAgICAgICBuZXdMZW4gPSAwCisgICAgICAgIHBhcmFtZGVjbCA9ICcgICAgJyArIG5vbmVTdHIocGFyYW0udGV4dCkKKyAgICAgICAgZm9yIGVsZW0gaW4gcGFyYW06CisgICAgICAgICAgICB0ZXh0ID0gbm9uZVN0cihlbGVtLnRleHQpCisgICAgICAgICAgICB0YWlsID0gbm9uZVN0cihlbGVtLnRhaWwpCisKKyAgICAgICAgICAgIGlmIHNlbGYuc2hvdWxkX2luc2VydF9tYXlfYWxpYXNfbWFjcm8gYW5kIHNlbGYuZ2VuT3B0cy5jb252ZW50aW9ucy5pc192b2lkcG9pbnRlcl9hbGlhcyhlbGVtLnRhZywgdGV4dCwgdGFpbCk6CisgICAgICAgICAgICAgICAgIyBPcGVuWFItc3BlY2lmaWMgbWFjcm8gaW5zZXJ0aW9uCisgICAgICAgICAgICAgICAgdGFpbCA9IHNlbGYuZ2VuT3B0cy5jb252ZW50aW9ucy5tYWtlX3ZvaWRwb2ludGVyX2FsaWFzKHRhaWwpCisgICAgICAgICAgICBpZiBlbGVtLnRhZyA9PSAnbmFtZSc6CisgICAgICAgICAgICAgICAgIyBBbGlnbiBhdCBzcGVjaWZpZWQgY29sdW1uLCBpZiBwb3NzaWJsZQorICAgICAgICAgICAgICAgIG5ld0xlbiA9IGxlbihwYXJhbWRlY2wucnN0cmlwKCkpCisgICAgICAgICAgICAgICAgc2VsZi5sb2dNc2coJ2RpYWcnLCAnSWRlbnRpZnlpbmcgbGVuZ3RoIG9mJywgZWxlbS50ZXh0LCAnYXMnLCBuZXdMZW4pCisgICAgICAgICAgICBwYXJhbWRlY2wgKz0gdGV4dCArIHRhaWwKKworICAgICAgICByZXR1cm4gbmV3TGVuCisKKyAgICBkZWYgZ2V0TWF4Q1BhcmFtVHlwZUxlbmd0aChzZWxmLCBpbmZvKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgdHlwZSBmaWVsZCBmb3IgYSBtZW1iZXIvcGFyYW1ldGVyLgorCisgICAgICAgIC0gaW5mbyAtIFR5cGVJbmZvIG9yIENvbW1hbmRJbmZvLgorICAgICAgICAiIiIKKyAgICAgICAgbGVuZ3RocyA9IChzZWxmLmdldENQYXJhbVR5cGVMZW5ndGgobWVtYmVyKQorICAgICAgICAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gaW5mby5nZXRNZW1iZXJzKCkpCisgICAgICAgIHJldHVybiBtYXgobGVuZ3RocykKKworICAgIGRlZiBnZXRIYW5kbGVQYXJlbnQoc2VsZiwgdHlwZW5hbWUpOgorICAgICAgICAiIiJHZXQgdGhlIHBhcmVudCBvZiBhIGhhbmRsZSBvYmplY3QuIiIiCisgICAgICAgIGluZm8gPSBzZWxmLnJlZ2lzdHJ5LnR5cGVkaWN0LmdldCh0eXBlbmFtZSkKKyAgICAgICAgaWYgaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBlbGVtID0gaW5mby5lbGVtCisgICAgICAgIGlmIGVsZW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXQoJ3BhcmVudCcpCisKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBpdGVyYXRlSGFuZGxlQW5jZXN0b3JzKHNlbGYsIHR5cGVuYW1lKToKKyAgICAgICAgIiIiSXRlcmF0ZSB0aHJvdWdoIHRoZSBhbmNlc3RvcnMgb2YgYSBoYW5kbGUgdHlwZS4iIiIKKyAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0SGFuZGxlUGFyZW50KHR5cGVuYW1lKQorICAgICAgICB3aGlsZSBjdXJyZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeWllbGQgY3VycmVudAorICAgICAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0SGFuZGxlUGFyZW50KGN1cnJlbnQpCisKKyAgICBkZWYgZ2V0SGFuZGxlQW5jZXN0b3JzKHNlbGYsIHR5cGVuYW1lKToKKyAgICAgICAgIiIiR2V0IHRoZSBhbmNlc3RvcnMgb2YgYSBoYW5kbGUgb2JqZWN0LiIiIgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJhdGVIYW5kbGVBbmNlc3RvcnModHlwZW5hbWUpKQorCisgICAgZGVmIGdldFR5cGVDYXRlZ29yeShzZWxmLCB0eXBlbmFtZSk6CisgICAgICAgICIiIkdldCB0aGUgY2F0ZWdvcnkgb2YgYSB0eXBlLiIiIgorICAgICAgICBpbmZvID0gc2VsZi5yZWdpc3RyeS50eXBlZGljdC5nZXQodHlwZW5hbWUpCisgICAgICAgIGlmIGluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZWxlbSA9IGluZm8uZWxlbQorICAgICAgICBpZiBlbGVtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0KCdjYXRlZ29yeScpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgaXNTdHJ1Y3RBbHdheXNWYWxpZChzZWxmLCBzdHJ1Y3RuYW1lKToKKyAgICAgICAgIiIiVHJ5IHRvIGRvIGNoZWNrIGlmIGEgc3RydWN0dXJlIGlzIGFsd2F5cyBjb25zaWRlcmVkIHZhbGlkIChpLmUuIHRoZXJlJ3Mgbm8gcnVsZXMgdG8gaXRzIGFjY2VwdGFuY2UpLiIiIgorICAgICAgICAjIEEgY29udmVudGlvbnMgb2JqZWN0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGNhbGwuCisgICAgICAgIGlmIG5vdCBzZWxmLmNvbnZlbnRpb25zOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJUbyB1c2UgaXNTdHJ1Y3RBbHdheXNWYWxpZCwgYmUgc3VyZSB5b3VyIG9wdGlvbnMgaW5jbHVkZSBhIENvbnZlbnRpb25zIG9iamVjdC4iKQorCisgICAgICAgIGlmIHNlbGYuY29udmVudGlvbnMudHlwZV9hbHdheXNfdmFsaWQoc3RydWN0bmFtZSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGNhdGVnb3J5ID0gc2VsZi5nZXRUeXBlQ2F0ZWdvcnkoc3RydWN0bmFtZSkKKyAgICAgICAgaWYgc2VsZi5jb252ZW50aW9ucy5jYXRlZ29yeV9yZXF1aXJlc192YWxpZGF0aW9uKGNhdGVnb3J5KToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGluZm8gPSBzZWxmLnJlZ2lzdHJ5LnR5cGVkaWN0LmdldChzdHJ1Y3RuYW1lKQorICAgICAgICBhc3NlcnQoaW5mbyBpcyBub3QgTm9uZSkKKworICAgICAgICBtZW1iZXJzID0gaW5mby5nZXRNZW1iZXJzKCkKKworICAgICAgICBmb3IgbWVtYmVyIGluIG1lbWJlcnM6CisgICAgICAgICAgICBtZW1iZXJfbmFtZSA9IGdldEVsZW1OYW1lKG1lbWJlcikKKyAgICAgICAgICAgIGlmIG1lbWJlcl9uYW1lIGluIChzZWxmLmNvbnZlbnRpb25zLnN0cnVjdHR5cGVfbWVtYmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb252ZW50aW9ucy5uZXh0cG9pbnRlcl9tZW1iZXJfbmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIGlmIG1lbWJlci5nZXQoJ25vYXV0b3ZhbGlkaXR5Jyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIG1lbWJlcl90eXBlID0gZ2V0RWxlbVR5cGUobWVtYmVyKQorCisgICAgICAgICAgICBpZiBtZW1iZXJfdHlwZSBpbiAoJ3ZvaWQnLCAnY2hhcicpIG9yIHNlbGYucGFyYW1Jc0FycmF5KG1lbWJlcikgb3Igc2VsZi5wYXJhbUlzUG9pbnRlcihtZW1iZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICBpZiBzZWxmLmNvbnZlbnRpb25zLnR5cGVfYWx3YXlzX3ZhbGlkKG1lbWJlcl90eXBlKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBtZW1iZXJfY2F0ZWdvcnkgPSBzZWxmLmdldFR5cGVDYXRlZ29yeShtZW1iZXJfdHlwZSkKKworICAgICAgICAgICAgaWYgc2VsZi5jb252ZW50aW9ucy5jYXRlZ29yeV9yZXF1aXJlc192YWxpZGF0aW9uKG1lbWJlcl9jYXRlZ29yeSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIGlmIG1lbWJlcl9jYXRlZ29yeSBpbiAoJ3N0cnVjdCcsICd1bmlvbicpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNTdHJ1Y3RBbHdheXNWYWxpZChtZW1iZXJfdHlwZSkgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgaXNFbnVtUmVxdWlyZWQoc2VsZiwgZWxlbSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoaXMgYDxlbnVtPmAgZWxlbWVudCBpcworICAgICAgICByZXF1aXJlZCwgRmFsc2Ugb3RoZXJ3aXNlCisKKyAgICAgICAgLSBlbGVtIC0gYDxlbnVtPmAgZWxlbWVudCB0byB0ZXN0IiIiCisgICAgICAgIHJlcXVpcmVkID0gZWxlbS5nZXQoJ3JlcXVpcmVkJykgaXMgbm90IE5vbmUKKyAgICAgICAgc2VsZi5sb2dNc2coJ2RpYWcnLCAnaXNFbnVtUmVxdWlyZWQ6JywgZWxlbS5nZXQoJ25hbWUnKSwKKyAgICAgICAgICAgICAgICAgICAgJy0+JywgcmVxdWlyZWQpCisgICAgICAgIHJldHVybiByZXF1aXJlZAorCisgICAgICAgICMgQEBAIFRoaXMgY29kZSBpcyBvdmVycmlkZGVuIGJ5IGVxdWl2YWxlbnQgY29kZSBub3cgcnVuIGluCisgICAgICAgICMgQEBAIFJlZ2lzdHJ5LmdlbmVyYXRlRmVhdHVyZQorCisgICAgICAgIHJlcXVpcmVkID0gRmFsc2UKKworICAgICAgICBleHRuYW1lID0gZWxlbS5nZXQoJ2V4dG5hbWUnKQorICAgICAgICBpZiBleHRuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyAnc3VwcG9ydGVkJyBhdHRyaWJ1dGUgd2FzIGluamVjdGVkIHdoZW4gdGhlIDxlbnVtPiBlbGVtZW50IHdhcworICAgICAgICAgICAgIyBtb3ZlZCBpbnRvIHRoZSA8ZW51bXM+IGdyb3VwIGluIFJlZ2lzdHJ5LnBhcnNlVHJlZSgpCisgICAgICAgICAgICBpZiBzZWxmLmdlbk9wdHMuZGVmYXVsdEV4dGVuc2lvbnMgPT0gZWxlbS5nZXQoJ3N1cHBvcnRlZCcpOgorICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiByZS5tYXRjaChzZWxmLmdlbk9wdHMuYWRkRXh0ZW5zaW9ucywgZXh0bmFtZSkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSBUcnVlCisgICAgICAgIGVsaWYgZWxlbS5nZXQoJ3ZlcnNpb24nKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlcXVpcmVkID0gcmUubWF0Y2goc2VsZi5nZW5PcHRzLmVtaXR2ZXJzaW9ucywgZWxlbS5nZXQoJ3ZlcnNpb24nKSkgaXMgbm90IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcXVpcmVkID0gVHJ1ZQorCisgICAgICAgIHJldHVybiByZXF1aXJlZAorCisgICAgZGVmIG1ha2VDRGVjbHMoc2VsZiwgY21kKToKKyAgICAgICAgIiIiUmV0dXJuIEMgcHJvdG90eXBlIGFuZCBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWYgZm9yIGEKKyAgICAgICAgYDxjb21tYW5kPmAgRWxlbWVudCwgYXMgYSB0d28tZWxlbWVudCBsaXN0IG9mIHN0cmluZ3MuCisKKyAgICAgICAgLSBjbWQgLSBFbGVtZW50IGNvbnRhaW5pbmcgYSBgPGNvbW1hbmQ+YCB0YWciIiIKKyAgICAgICAgcHJvdG8gPSBjbWQuZmluZCgncHJvdG8nKQorICAgICAgICBwYXJhbXMgPSBjbWQuZmluZGFsbCgncGFyYW0nKQorICAgICAgICAjIEJlZ2luIGFjY3VtdWxhdGluZyBwcm90b3R5cGUgYW5kIHR5cGVkZWYgc3RyaW5ncworICAgICAgICBwZGVjbCA9IHNlbGYuZ2VuT3B0cy5hcGljYWxsCisgICAgICAgIHRkZWNsID0gJ3R5cGVkZWYgJworCisgICAgICAgICMgSW5zZXJ0IHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZS9uYW1lLgorICAgICAgICAjIEZvciBwcm90b3R5cGVzLCBhZGQgQVBJRU5UUlkgbWFjcm8gYmVmb3JlIHRoZSBuYW1lCisgICAgICAgICMgRm9yIHR5cGVkZWZzLCBhZGQgKEFQSUVOVFJZICo8bmFtZT4pIGFyb3VuZCB0aGUgbmFtZSBhbmQKKyAgICAgICAgIyAgIHVzZSB0aGUgUEZOX2NtZG5hbWVwcm9jIG5hbWluZyBjb252ZW50aW9uLgorICAgICAgICAjIERvbmUgYnkgd2Fsa2luZyB0aGUgdHJlZSBmb3IgPHByb3RvPiBlbGVtZW50IGJ5IGVsZW1lbnQuCisgICAgICAgICMgZXRyZWUgaGFzIGVsZW0udGV4dCBmb2xsb3dlZCBieSAoZWxlbVtpXSwgZWxlbVtpXS50YWlsKQorICAgICAgICAjICAgZm9yIGVhY2ggY2hpbGQgZWxlbWVudCBhbmQgYW55IGZvbGxvd2luZyB0ZXh0CisgICAgICAgICMgTGVhZGluZyB0ZXh0CisgICAgICAgIHBkZWNsICs9IG5vbmVTdHIocHJvdG8udGV4dCkKKyAgICAgICAgdGRlY2wgKz0gbm9uZVN0cihwcm90by50ZXh0KQorICAgICAgICAjIEZvciBlYWNoIGNoaWxkIGVsZW1lbnQsIGlmIGl0J3MgYSA8bmFtZT4gd3JhcCBpbiBhcHByb3ByaWF0ZQorICAgICAgICAjIGRlY2xhcmF0aW9uLiBPdGhlcndpc2UgYXBwZW5kIGl0cyBjb250ZW50cyBhbmQgdGFpbCBjb250ZW50cy4KKyAgICAgICAgZm9yIGVsZW0gaW4gcHJvdG86CisgICAgICAgICAgICB0ZXh0ID0gbm9uZVN0cihlbGVtLnRleHQpCisgICAgICAgICAgICB0YWlsID0gbm9uZVN0cihlbGVtLnRhaWwpCisgICAgICAgICAgICBpZiBlbGVtLnRhZyA9PSAnbmFtZSc6CisgICAgICAgICAgICAgICAgcGRlY2wgKz0gc2VsZi5tYWtlUHJvdG9OYW1lKHRleHQsIHRhaWwpCisgICAgICAgICAgICAgICAgdGRlY2wgKz0gc2VsZi5tYWtlVHlwZWRlZk5hbWUodGV4dCwgdGFpbCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGRlY2wgKz0gdGV4dCArIHRhaWwKKyAgICAgICAgICAgICAgICB0ZGVjbCArPSB0ZXh0ICsgdGFpbAorCisgICAgICAgIGlmIHNlbGYuZ2VuT3B0cy5hbGlnbkZ1bmNQYXJhbSA9PSAwOgorICAgICAgICAgICAgIyBTcXVlZXplIG91dCBtdWx0aXBsZSBzcGFjZXMgLSB0aGVyZSBpcyBubyBpbmRlbnRhdGlvbgorICAgICAgICAgICAgcGRlY2wgPSAnICcuam9pbihwZGVjbC5zcGxpdCgpKQorICAgICAgICAgICAgdGRlY2wgPSAnICcuam9pbih0ZGVjbC5zcGxpdCgpKQorCisgICAgICAgICMgTm93IGFkZCB0aGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIGxpc3QsIHdoaWNoIGlzIGlkZW50aWNhbAorICAgICAgICAjIGZvciBwcm90b3R5cGVzIGFuZCB0eXBlZGVmcy4gQ29uY2F0ZW5hdGUgYWxsIHRoZSB0ZXh0IGZyb20KKyAgICAgICAgIyBhIDxwYXJhbT4gbm9kZSB3aXRob3V0IHRoZSB0YWdzLiBObyB0cmVlIHdhbGtpbmcgcmVxdWlyZWQKKyAgICAgICAgIyBzaW5jZSBhbGwgdGFncyBhcmUgaWdub3JlZC4KKyAgICAgICAgIyBVc2VzOiBzZWxmLmluZGVudEZ1bmNQcm90bworICAgICAgICAjIHNlbGYuaW5kZW50RnVuY1BvaW50ZXIKKyAgICAgICAgIyBzZWxmLmFsaWduRnVuY1BhcmFtCisgICAgICAgIG4gPSBsZW4ocGFyYW1zKQorICAgICAgICAjIEluZGVudGVkIHBhcmFtZXRlcnMKKyAgICAgICAgaWYgbiA+IDA6CisgICAgICAgICAgICBpbmRlbnRkZWNsID0gJyhcbicKKyAgICAgICAgICAgIGluZGVudGRlY2wgKz0gJyxcbicuam9pbihzZWxmLm1ha2VDUGFyYW1EZWNsKHAsIHNlbGYuZ2VuT3B0cy5hbGlnbkZ1bmNQYXJhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBwYXJhbXMpCisgICAgICAgICAgICBpbmRlbnRkZWNsICs9ICcpOycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZGVudGRlY2wgPSAnKHZvaWQpOycKKyAgICAgICAgIyBOb24taW5kZW50ZWQgcGFyYW1ldGVycworICAgICAgICBwYXJhbWRlY2wgPSAnKCcKKyAgICAgICAgaWYgbiA+IDA6CisgICAgICAgICAgICBwYXJhbW5hbWVzID0gKCcnLmpvaW4odCBmb3IgdCBpbiBwLml0ZXJ0ZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIHBhcmFtcykKKyAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnLCAnLmpvaW4ocGFyYW1uYW1lcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcmFtZGVjbCArPSAndm9pZCcKKyAgICAgICAgcGFyYW1kZWNsICs9ICIpOyIKKyAgICAgICAgcmV0dXJuIFtwZGVjbCArIGluZGVudGRlY2wsIHRkZWNsICsgcGFyYW1kZWNsXQorCisgICAgZGVmIG5ld2xpbmUoc2VsZik6CisgICAgICAgICIiIlByaW50IGEgbmV3bGluZSB0byB0aGUgb3V0cHV0IGZpbGUgKHV0aWxpdHkgZnVuY3Rpb24pIiIiCisgICAgICAgIHdyaXRlKCcnLCBmaWxlPXNlbGYub3V0RmlsZSkKKworICAgIGRlZiBzZXRSZWdpc3RyeShzZWxmLCByZWdpc3RyeSk6CisgICAgICAgIHNlbGYucmVnaXN0cnkgPSByZWdpc3RyeQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS9nZW52ay5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvcmVnaXN0cnkvZ2VudmsucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTMxMWE4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvcmVnaXN0cnkvZ2VudmsucHkKQEAgLTAsMCArMSw1NTIgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMworIworIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHBkYgoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBldHJlZQorCitmcm9tIGNnZW5lcmF0b3IgaW1wb3J0IENHZW5lcmF0b3JPcHRpb25zLCBDT3V0cHV0R2VuZXJhdG9yCitmcm9tIGRvY2dlbmVyYXRvciBpbXBvcnQgRG9jR2VuZXJhdG9yT3B0aW9ucywgRG9jT3V0cHV0R2VuZXJhdG9yCitmcm9tIGV4dGVuc2lvbm1ldGFkb2NnZW5lcmF0b3IgaW1wb3J0IChFeHRlbnNpb25NZXRhRG9jR2VuZXJhdG9yT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbk1ldGFEb2NPdXRwdXRHZW5lcmF0b3IpCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgd3JpdGUKK2Zyb20gaG9zdHN5bmNnZW5lcmF0b3IgaW1wb3J0IEhvc3RTeW5jaHJvbml6YXRpb25PdXRwdXRHZW5lcmF0b3IKK2Zyb20gcHlnZW5lcmF0b3IgaW1wb3J0IFB5T3V0cHV0R2VuZXJhdG9yCitmcm9tIHJlZyBpbXBvcnQgUmVnaXN0cnkKK2Zyb20gdmFsaWRpdHlnZW5lcmF0b3IgaW1wb3J0IFZhbGlkaXR5T3V0cHV0R2VuZXJhdG9yCitmcm9tIHZrY29udmVudGlvbnMgaW1wb3J0IFZ1bGthbkNvbnZlbnRpb25zCisKKworIyBTaW1wbGUgdGltZXIgZnVuY3Rpb25zCitzdGFydFRpbWUgPSBOb25lCisKKworZGVmIHN0YXJ0VGltZXIodGltZWl0KToKKyAgICBnbG9iYWwgc3RhcnRUaW1lCisgICAgaWYgdGltZWl0OgorICAgICAgICBzdGFydFRpbWUgPSB0aW1lLnByb2Nlc3NfdGltZSgpCisKKworZGVmIGVuZFRpbWVyKHRpbWVpdCwgbXNnKToKKyAgICBnbG9iYWwgc3RhcnRUaW1lCisgICAgaWYgdGltZWl0OgorICAgICAgICBlbmRUaW1lID0gdGltZS5wcm9jZXNzX3RpbWUoKQorICAgICAgICB3cml0ZShtc2csIGVuZFRpbWUgLSBzdGFydFRpbWUsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgc3RhcnRUaW1lID0gTm9uZQorCisKK2RlZiBtYWtlUkVzdHJpbmcoc3RyaW5ncywgZGVmYXVsdD1Ob25lLCBzdHJpbmdzX2FyZV9yZWdleD1GYWxzZSk6CisgICAgIiIiVHVybiBhIGxpc3Qgb2Ygc3RyaW5ncyBpbnRvIGEgcmVnZXhwIHN0cmluZyBtYXRjaGluZyBleGFjdGx5IHRob3NlIHN0cmluZ3MuIiIiCisgICAgaWYgc3RyaW5ncyBvciBkZWZhdWx0IGlzIE5vbmU6CisgICAgICAgIGlmIG5vdCBzdHJpbmdzX2FyZV9yZWdleDoKKyAgICAgICAgICAgIHN0cmluZ3MgPSAocmUuZXNjYXBlKHMpIGZvciBzIGluIHN0cmluZ3MpCisgICAgICAgIHJldHVybiAnXignICsgJ3wnLmpvaW4oc3RyaW5ncykgKyAnKSQnCisgICAgcmV0dXJuIGRlZmF1bHQKKworCitkZWYgbWFrZUdlbk9wdHMoYXJncyk6CisgICAgIiIiUmV0dXJucyBhIGRpcmVjdG9yeSBvZiBbIGdlbmVyYXRvciBmdW5jdGlvbiwgZ2VuZXJhdG9yIG9wdGlvbnMgXSBpbmRleGVkCisgICAgYnkgc3BlY2lmaWVkIHNob3J0IG5hbWVzLiBUaGUgZ2VuZXJhdG9yIG9wdGlvbnMgaW5jb3Jwb3JhdGUgdGhlIGZvbGxvd2luZworICAgIHBhcmFtZXRlcnM6CisKKyAgICBhcmdzIGlzIGFuIHBhcnNlZCBhcmd1bWVudCBvYmplY3Q7IHNlZSBiZWxvdyBmb3IgdGhlIGZpZWxkcyB0aGF0IGFyZSB1c2VkLiIiIgorICAgIGdsb2JhbCBnZW5PcHRzCisgICAgZ2VuT3B0cyA9IHt9CisKKyAgICAjIERlZmF1bHQgY2xhc3Mgb2YgZXh0ZW5zaW9ucyB0byBpbmNsdWRlLCBvciBOb25lCisgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBhcmdzLmRlZmF1bHRFeHRlbnNpb25zCisKKyAgICAjIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyB0byBpbmNsdWRlIChsaXN0IG9mIGV4dGVuc2lvbnMpCisgICAgZXh0ZW5zaW9ucyA9IGFyZ3MuZXh0ZW5zaW9uCisKKyAgICAjIEV4dGVuc2lvbnMgdG8gcmVtb3ZlIChsaXN0IG9mIGV4dGVuc2lvbnMpCisgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IGFyZ3MucmVtb3ZlRXh0ZW5zaW9ucworCisgICAgIyBFeHRlbnNpb25zIHRvIGVtaXQgKGxpc3Qgb2YgZXh0ZW5zaW9ucykKKyAgICBlbWl0RXh0ZW5zaW9ucyA9IGFyZ3MuZW1pdEV4dGVuc2lvbnMKKworICAgICMgRmVhdHVyZXMgdG8gaW5jbHVkZSAobGlzdCBvZiBmZWF0dXJlcykKKyAgICBmZWF0dXJlcyA9IGFyZ3MuZmVhdHVyZQorCisgICAgIyBXaGV0aGVyIHRvIGRpc2FibGUgaW5jbHVzaW9uIHByb3RlY3QgaW4gaGVhZGVycworICAgIHByb3RlY3QgPSBhcmdzLnByb3RlY3QKKworICAgICMgT3V0cHV0IHRhcmdldCBkaXJlY3RvcnkKKyAgICBkaXJlY3RvcnkgPSBhcmdzLmRpcmVjdG9yeQorCisgICAgIyBEZXNjcmlwdGl2ZSBuYW1lcyBmb3IgdmFyaW91cyByZWdleHAgcGF0dGVybnMgdXNlZCB0byBzZWxlY3QKKyAgICAjIHZlcnNpb25zIGFuZCBleHRlbnNpb25zCisgICAgYWxsRmVhdHVyZXMgPSBhbGxFeHRlbnNpb25zID0gcicuKicKKworICAgICMgVHVybiBsaXN0cyBvZiBuYW1lcy9wYXR0ZXJucyBpbnRvIG1hdGNoaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMKKyAgICBhZGRFeHRlbnNpb25zUGF0ICAgICA9IG1ha2VSRXN0cmluZyhleHRlbnNpb25zLCBOb25lKQorICAgIHJlbW92ZUV4dGVuc2lvbnNQYXQgID0gbWFrZVJFc3RyaW5nKHJlbW92ZUV4dGVuc2lvbnMsIE5vbmUpCisgICAgZW1pdEV4dGVuc2lvbnNQYXQgICAgPSBtYWtlUkVzdHJpbmcoZW1pdEV4dGVuc2lvbnMsIGFsbEV4dGVuc2lvbnMpCisgICAgZmVhdHVyZXNQYXQgICAgICAgICAgPSBtYWtlUkVzdHJpbmcoZmVhdHVyZXMsIGFsbEZlYXR1cmVzKQorCisgICAgIyBDb3B5cmlnaHQgdGV4dCBwcmVmaXhpbmcgYWxsIGhlYWRlcnMgKGxpc3Qgb2Ygc3RyaW5ncykuCisgICAgcHJlZml4U3RyaW5ncyA9IFsKKyAgICAgICAgJy8qJywKKyAgICAgICAgJyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4nLAorICAgICAgICAnKionLAorICAgICAgICAnKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7JywKKyAgICAgICAgJyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4nLAorICAgICAgICAnKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JywKKyAgICAgICAgJyoqJywKKyAgICAgICAgJyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnLAorICAgICAgICAnKionLAorICAgICAgICAnKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZScsCisgICAgICAgICcqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCcsCisgICAgICAgICcqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4nLAorICAgICAgICAnKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCcsCisgICAgICAgICcqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4nLAorICAgICAgICAnKi8nLAorICAgICAgICAnJworICAgIF0KKworICAgICMgVGV4dCBzcGVjaWZpYyB0byBWdWxrYW4gaGVhZGVycworICAgIHZrUHJlZml4U3RyaW5ncyA9IFsKKyAgICAgICAgJy8qJywKKyAgICAgICAgJyoqIFRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBLaHJvbm9zIFZ1bGthbiBYTUwgQVBJIFJlZ2lzdHJ5LicsCisgICAgICAgICcqKicsCisgICAgICAgICcqLycsCisgICAgICAgICcnCisgICAgXQorCisgICAgIyBEZWZhdWx0cyBmb3IgZ2VuZXJhdGluZyByZS1pbmNsdXNpb24gcHJvdGVjdGlvbiB3cmFwcGVycyAob3Igbm90KQorICAgIHByb3RlY3RGaWxlID0gcHJvdGVjdAorCisgICAgIyBBbiBBUEkgc3R5bGUgY29udmVudGlvbnMgb2JqZWN0CisgICAgY29udmVudGlvbnMgPSBWdWxrYW5Db252ZW50aW9ucygpCisKKyAgICAjIEFQSSBpbmNsdWRlIGZpbGVzIGZvciBzcGVjIGFuZCByZWYgcGFnZXMKKyAgICAjIE92ZXJ3cml0ZXMgaW5jbHVkZSBzdWJkaXJlY3RvcmllcyBpbiBzcGVjIHNvdXJjZSB0cmVlCisgICAgIyBUaGUgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZXMgZG8gbm90IGluY2x1ZGUgdGhlIGNhbGxpbmcgY29udmVudGlvbgorICAgICMgbWFjcm9zIChhcGllbnRyeSBldGMuKSwgdW5saWtlIHRoZSBoZWFkZXIgZmlsZXMuCisgICAgIyBCZWNhdXNlIHRoZSAxLjAgY29yZSBicmFuY2ggaW5jbHVkZXMgcmVmIHBhZ2VzIGZvciBleHRlbnNpb25zLAorICAgICMgYWxsIHRoZSBleHRlbnNpb24gaW50ZXJmYWNlcyBuZWVkIHRvIGJlIGdlbmVyYXRlZCwgZXZlbiB0aG91Z2gKKyAgICAjIG5vbmUgYXJlIHVzZWQgYnkgdGhlIGNvcmUgc3BlYyBpdHNlbGYuCisgICAgZ2VuT3B0c1snYXBpaW5jJ10gPSBbCisgICAgICAgICAgRG9jT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIERvY0dlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSAndGltZU1hcmtlcicsCisgICAgICAgICAgICBkaXJlY3RvcnkgICAgICAgICA9IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWUgICAgICAgICAgID0gJ3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlICAgICAgICAgICA9IE5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucyAgICAgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICcnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJyonLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gICAgPSA0OCwKKyAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgID0gRmFsc2UpCisgICAgICAgIF0KKworICAgICMgQVBJIG5hbWVzIHRvIHZhbGlkYXRlIG1hbi9hcGkgc3BlYyBpbmNsdWRlcyAmIGxpbmtzCisgICAgZ2VuT3B0c1sndmthcGkucHknXSA9IFsKKyAgICAgICAgICBQeU91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBEb2NHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3ZrYXBpLnB5JywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCkKKyAgICAgICAgXQorCisgICAgIyBBUEkgdmFsaWRpdHkgZmlsZXMgZm9yIHNwZWMKKyAgICBnZW5PcHRzWyd2YWxpZGluYyddID0gWworICAgICAgICAgIFZhbGlkaXR5T3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIERvY0dlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSAndGltZU1hcmtlcicsCisgICAgICAgICAgICBkaXJlY3RvcnkgICAgICAgICA9IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWUgICAgICAgICAgID0gJ3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlICAgICAgICAgICA9IE5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucyAgICAgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQpCisgICAgICAgIF0KKworICAgICMgQVBJIGhvc3Qgc3luYyB0YWJsZSBmaWxlcyBmb3Igc3BlYworICAgIGdlbk9wdHNbJ2hvc3RzeW5jaW5jJ10gPSBbCisgICAgICAgICAgSG9zdFN5bmNocm9uaXphdGlvbk91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBEb2NHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3RpbWVNYXJrZXInLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IGFkZEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IHJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0KQorICAgICAgICBdCisKKyAgICAjIEV4dGVuc2lvbiBtZXRhaW5mb3JtYXRpb24gZm9yIHNwZWMgZXh0ZW5zaW9uIGFwcGVuZGljZXMKKyAgICBnZW5PcHRzWydleHRpbmMnXSA9IFsKKyAgICAgICAgICBFeHRlbnNpb25NZXRhRG9jT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIEV4dGVuc2lvbk1ldGFEb2NHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3RpbWVNYXJrZXInLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IE5vbmUsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IE5vbmUsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0KQorICAgICAgICBdCisKKyAgICAjIFBsYXRmb3JtIGV4dGVuc2lvbnMsIGluIHRoZWlyIG93biBoZWFkZXIgZmlsZXMKKyAgICAjIEVhY2ggZWxlbWVudCBvZiB0aGUgcGxhdGZvcm1zW10gYXJyYXkgZGVmaW5lcyBpbmZvcm1hdGlvbiBmb3IKKyAgICAjIGdlbmVyYXRpbmcgYSBzaW5nbGUgcGxhdGZvcm06CisgICAgIyAgIFswXSBpcyB0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlIG5hbWUKKyAgICAjICAgWzFdIGlzIHRoZSBzZXQgb2YgcGxhdGZvcm0gZXh0ZW5zaW9ucyB0byBnZW5lcmF0ZQorICAgICMgICBbMl0gaXMgYWRkaXRpb25hbCBleHRlbnNpb25zIHdob3NlIGludGVyZmFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQsCisgICAgIyAgIGJ1dCBzdXBwcmVzc2VkIGluIHRoZSBvdXRwdXQsIHRvIGF2b2lkIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBvZgorICAgICMgICBkZXBlbmRlbnQgdHlwZXMgbGlrZSBWa0Rpc3BsYXlLSFIgYW5kIFZrU3VyZmFjZUtIUiB3aGljaCBjb21lIGZyb20KKyAgICAjICAgbm9uLXBsYXRmb3JtIGV4dGVuc2lvbnMuCisKKyAgICAjIFRyYWNrIGFsbCBwbGF0Zm9ybSBleHRlbnNpb25zLCBmb3IgZXhjbHVzaW9uIGZyb20gdnVsa2FuX2NvcmUuaAorICAgIGFsbFBsYXRmb3JtRXh0ZW5zaW9ucyA9IFtdCisKKyAgICAjIEV4dGVuc2lvbnMgc3VwcHJlc3NlZCBmb3IgYWxsIHBsYXRmb3Jtcy4KKyAgICAjIENvdmVycyBjb21tb24gV1NJIGV4dGVuc2lvbiB0eXBlcy4KKyAgICBjb21tb25TdXBwcmVzc0V4dGVuc2lvbnMgPSBbICdWS19LSFJfZGlzcGxheScsICdWS19LSFJfc3dhcGNoYWluJyBdCisKKyAgICBwbGF0Zm9ybXMgPSBbCisgICAgICAgIFsgJ3Z1bGthbl9hbmRyb2lkLmgnLCAgICAgWyAnVktfS0hSX2FuZHJvaWRfc3VyZmFjZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBjb21tb25TdXBwcmVzc0V4dGVuc2lvbnMgXSwKKyAgICAgICAgWyAndnVsa2FuX2Z1Y2hzaWEuaCcsICAgICBbICdWS19GVUNIU0lBX2ltYWdlcGlwZV9zdXJmYWNlJ10sIGNvbW1vblN1cHByZXNzRXh0ZW5zaW9ucyBdLAorICAgICAgICBbICd2dWxrYW5fZ2dwLmgnLCAgICAgICAgIFsgJ1ZLX0dHUF9zdHJlYW1fZGVzY3JpcHRvcl9zdXJmYWNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWS19HR1BfZnJhbWVfdG9rZW4nICAgICAgICAgIF0sIGNvbW1vblN1cHByZXNzRXh0ZW5zaW9ucyBdLAorICAgICAgICBbICd2dWxrYW5faW9zLmgnLCAgICAgICAgIFsgJ1ZLX01WS19pb3Nfc3VyZmFjZScgICAgICAgICAgXSwgY29tbW9uU3VwcHJlc3NFeHRlbnNpb25zIF0sCisgICAgICAgIFsgJ3Z1bGthbl9tYWNvcy5oJywgICAgICAgWyAnVktfTVZLX21hY29zX3N1cmZhY2UnICAgICAgICBdLCBjb21tb25TdXBwcmVzc0V4dGVuc2lvbnMgXSwKKyAgICAgICAgWyAndnVsa2FuX3ZpLmgnLCAgICAgICAgICBbICdWS19OTl92aV9zdXJmYWNlJyAgICAgICAgICAgIF0sIGNvbW1vblN1cHByZXNzRXh0ZW5zaW9ucyBdLAorICAgICAgICBbICd2dWxrYW5fd2F5bGFuZC5oJywgICAgIFsgJ1ZLX0tIUl93YXlsYW5kX3N1cmZhY2UnICAgICAgXSwgY29tbW9uU3VwcHJlc3NFeHRlbnNpb25zIF0sCisgICAgICAgIFsgJ3Z1bGthbl93aW4zMi5oJywgICAgICAgWyAnVktfLipfd2luMzIofF8uKiknLCAnVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZScgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vblN1cHByZXNzRXh0ZW5zaW9ucyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICdWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZLX0tIUl9leHRlcm5hbF9mZW5jZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSBdLAorICAgICAgICBbICd2dWxrYW5feGNiLmgnLCAgICAgICAgIFsgJ1ZLX0tIUl94Y2Jfc3VyZmFjZScgICAgICAgICAgXSwgY29tbW9uU3VwcHJlc3NFeHRlbnNpb25zIF0sCisgICAgICAgIFsgJ3Z1bGthbl94bGliLmgnLCAgICAgICAgWyAnVktfS0hSX3hsaWJfc3VyZmFjZScgICAgICAgICBdLCBjb21tb25TdXBwcmVzc0V4dGVuc2lvbnMgXSwKKyAgICAgICAgWyAndnVsa2FuX3hsaWJfeHJhbmRyLmgnLCBbICdWS19FWFRfYWNxdWlyZV94bGliX2Rpc3BsYXknIF0sIGNvbW1vblN1cHByZXNzRXh0ZW5zaW9ucyBdLAorICAgICAgICBbICd2dWxrYW5fbWV0YWwuaCcsICAgICAgIFsgJ1ZLX0VYVF9tZXRhbF9zdXJmYWNlJyAgICAgICAgXSwgY29tbW9uU3VwcHJlc3NFeHRlbnNpb25zIF0sCisgICAgXQorCisgICAgZm9yIHBsYXRmb3JtIGluIHBsYXRmb3JtczoKKyAgICAgICAgaGVhZGVybmFtZSA9IHBsYXRmb3JtWzBdCisKKyAgICAgICAgYWxsUGxhdGZvcm1FeHRlbnNpb25zICs9IHBsYXRmb3JtWzFdCisKKyAgICAgICAgYWRkUGxhdGZvcm1FeHRlbnNpb25zUkUgPSBtYWtlUkVzdHJpbmcoCisgICAgICAgICAgICBwbGF0Zm9ybVsxXSArIHBsYXRmb3JtWzJdLCBzdHJpbmdzX2FyZV9yZWdleD1UcnVlKQorICAgICAgICBlbWl0UGxhdGZvcm1FeHRlbnNpb25zUkUgPSBtYWtlUkVzdHJpbmcoCisgICAgICAgICAgICBwbGF0Zm9ybVsxXSwgc3RyaW5nc19hcmVfcmVnZXg9VHJ1ZSkKKworICAgICAgICBvcHRzID0gQ0dlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSBoZWFkZXJuYW1lLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkUGxhdGZvcm1FeHRlbnNpb25zUkUsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IE5vbmUsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRQbGF0Zm9ybUV4dGVuc2lvbnNSRSwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIGdlbkZ1bmNQb2ludGVycyAgID0gVHJ1ZSwKKyAgICAgICAgICAgIHByb3RlY3RGaWxlICAgICAgID0gcHJvdGVjdEZpbGUsCisgICAgICAgICAgICBwcm90ZWN0RmVhdHVyZSAgICA9IEZhbHNlLAorICAgICAgICAgICAgcHJvdGVjdFByb3RvICAgICAgPSAnI2lmbmRlZicsCisgICAgICAgICAgICBwcm90ZWN0UHJvdG9TdHIgICA9ICdWS19OT19QUk9UT1RZUEVTJywKKyAgICAgICAgICAgIGFwaWNhbGwgICAgICAgICAgID0gJ1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5ICAgICAgICAgID0gJ1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJ1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtICAgID0gNDgsCisgICAgICAgICAgICBnZW5FbnVtQmVnaW5FbmRSYW5nZSA9IFRydWUpCisKKyAgICAgICAgZ2VuT3B0c1toZWFkZXJuYW1lXSA9IFsgQ091dHB1dEdlbmVyYXRvciwgb3B0cyBdCisKKyAgICAjIEhlYWRlciBmb3IgY29yZSBBUEkgKyBleHRlbnNpb25zLgorICAgICMgVG8gZ2VuZXJhdGUganVzdCB0aGUgY29yZSBBUEksCisgICAgIyBjaGFuZ2UgdG8gJ2RlZmF1bHRFeHRlbnNpb25zID0gTm9uZScgYmVsb3cuCisgICAgIworICAgICMgQnkgZGVmYXVsdCB0aGlzIGFkZHMgYWxsIGVuYWJsZWQsIG5vbi1wbGF0Zm9ybSBleHRlbnNpb25zLgorICAgICMgSXQgcmVtb3ZlcyBhbGwgcGxhdGZvcm0gZXh0ZW5zaW9ucyAoZnJvbSB0aGUgcGxhdGZvcm0gaGVhZGVycyBvcHRpb25zCisgICAgIyBjb25zdHJ1Y3RlZCBhYm92ZSkgYXMgd2VsbCBhcyBhbnkgZXhwbGljaXRseSBzcGVjaWZpZWQgcmVtb3ZhbHMuCisKKyAgICByZW1vdmVFeHRlbnNpb25zUGF0ID0gbWFrZVJFc3RyaW5nKAorICAgICAgICBhbGxQbGF0Zm9ybUV4dGVuc2lvbnMgKyByZW1vdmVFeHRlbnNpb25zLCBOb25lLCBzdHJpbmdzX2FyZV9yZWdleD1UcnVlKQorCisgICAgZ2VuT3B0c1sndnVsa2FuX2NvcmUuaCddID0gWworICAgICAgICAgIENPdXRwdXRHZW5lcmF0b3IsCisgICAgICAgICAgQ0dlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSAndnVsa2FuX2NvcmUuaCcsCisgICAgICAgICAgICBkaXJlY3RvcnkgICAgICAgICA9IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWUgICAgICAgICAgID0gJ3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlICAgICAgICAgICA9IE5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucyAgICAgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IE5vbmUsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IHJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBwcmVmaXhTdHJpbmdzICsgdmtQcmVmaXhTdHJpbmdzLAorICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzICAgPSBUcnVlLAorICAgICAgICAgICAgcHJvdGVjdEZpbGUgICAgICAgPSBwcm90ZWN0RmlsZSwKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlICAgID0gRmFsc2UsCisgICAgICAgICAgICBwcm90ZWN0UHJvdG8gICAgICA9ICcjaWZuZGVmJywKKyAgICAgICAgICAgIHByb3RlY3RQcm90b1N0ciAgID0gJ1ZLX05PX1BST1RPVFlQRVMnLAorICAgICAgICAgICAgYXBpY2FsbCAgICAgICAgICAgPSAnVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnVktBUElfQ0FMTCAnLAorICAgICAgICAgICAgYXBpZW50cnlwICAgICAgICAgPSAnVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gICAgPSA0OCwKKyAgICAgICAgICAgIGdlbkVudW1CZWdpbkVuZFJhbmdlID0gVHJ1ZSkKKyAgICAgICAgXQorCisgICAgIyBVbnVzZWQgLSB2dWxrYW4xMC5oIHRhcmdldC4KKyAgICAjIEl0IGlzIHBvc3NpYmxlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIHdpdGgganVzdCB0aGUgVnVsa2FuIDEuMCArCisgICAgIyBleHRlbnNpb24gaW50ZXJmYWNlcyBkZWZpbmVkLCBidXQgc2luY2UgdGhlIHByb21vdGVkIEtIUiBleHRlbnNpb25zCisgICAgIyBhcmUgbm93IGRlZmluZWQgaW4gdGVybXMgb2YgdGhlIDEuMSBpbnRlcmZhY2VzLCBzdWNoIGEgaGVhZGVyIGlzIHZlcnkKKyAgICAjIHNpbWlsYXIgdG8gdnVsa2FuX2NvcmUuaC4KKyAgICBnZW5PcHRzWyd2dWxrYW4xMC5oJ10gPSBbCisgICAgICAgICAgQ091dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBDR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICd2dWxrYW4xMC5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gJ1ZLX1ZFUlNJT05fMV8wJywKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gJ1ZLX1ZFUlNJT05fMV8wJywKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IE5vbmUsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IHJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBwcmVmaXhTdHJpbmdzICsgdmtQcmVmaXhTdHJpbmdzLAorICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzICAgPSBUcnVlLAorICAgICAgICAgICAgcHJvdGVjdEZpbGUgICAgICAgPSBwcm90ZWN0RmlsZSwKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlICAgID0gRmFsc2UsCisgICAgICAgICAgICBwcm90ZWN0UHJvdG8gICAgICA9ICcjaWZuZGVmJywKKyAgICAgICAgICAgIHByb3RlY3RQcm90b1N0ciAgID0gJ1ZLX05PX1BST1RPVFlQRVMnLAorICAgICAgICAgICAgYXBpY2FsbCAgICAgICAgICAgPSAnVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnVktBUElfQ0FMTCAnLAorICAgICAgICAgICAgYXBpZW50cnlwICAgICAgICAgPSAnVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gICAgPSA0OCkKKyAgICAgICAgXQorCisgICAgZ2VuT3B0c1snYWxpYXMuaCddID0gWworICAgICAgICAgIENPdXRwdXRHZW5lcmF0b3IsCisgICAgICAgICAgQ0dlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSAnYWxpYXMuaCcsCisgICAgICAgICAgICBkaXJlY3RvcnkgICAgICAgICA9IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWUgICAgICAgICAgID0gJ3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlICAgICAgICAgICA9IE5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucyAgICAgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IE5vbmUsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IHJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzICAgPSBGYWxzZSwKKyAgICAgICAgICAgIHByb3RlY3RGaWxlICAgICAgID0gRmFsc2UsCisgICAgICAgICAgICBwcm90ZWN0RmVhdHVyZSAgICA9IEZhbHNlLAorICAgICAgICAgICAgcHJvdGVjdFByb3RvICAgICAgPSAnJywKKyAgICAgICAgICAgIHByb3RlY3RQcm90b1N0ciAgID0gJycsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICcnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJycsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDM2KQorICAgICAgICBdCisKKworZGVmIGdlblRhcmdldChhcmdzKToKKyAgICAiIiJHZW5lcmF0ZSBhIHRhcmdldCBiYXNlZCBvbiB0aGUgb3B0aW9ucyBpbiB0aGUgbWF0Y2hpbmcgZ2VuT3B0c3t9IG9iamVjdC4KKworICAgIFRoaXMgaXMgZW5jYXBzdWxhdGVkIGluIGEgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHByb2ZpbGVkIGFuZC9vciB0aW1lZC4KKyAgICBUaGUgYXJncyBwYXJhbWV0ZXIgaXMgYW4gcGFyc2VkIGFyZ3VtZW50IG9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcKKyAgICBmaWVsZHMgdGhhdCBhcmUgdXNlZDoKKworICAgIC0gdGFyZ2V0IC0gdGFyZ2V0IHRvIGdlbmVyYXRlCisgICAgLSBkaXJlY3RvcnkgLSBkaXJlY3RvcnkgdG8gZ2VuZXJhdGUgaXQgaW4KKyAgICAtIHByb3RlY3QgLSBUcnVlIGlmIHJlLWluY2x1c2lvbiB3cmFwcGVycyBzaG91bGQgYmUgY3JlYXRlZAorICAgIC0gZXh0ZW5zaW9ucyAtIGxpc3Qgb2YgYWRkaXRpb25hbCBleHRlbnNpb25zIHRvIGluY2x1ZGUgaW4gZ2VuZXJhdGVkIGludGVyZmFjZXMiIiIKKyAgICAjIENyZWF0ZSBnZW5lcmF0b3Igb3B0aW9ucyB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICAgbWFrZUdlbk9wdHMoYXJncykKKworICAgIGlmIGFyZ3MudGFyZ2V0IGluIGdlbk9wdHM6CisgICAgICAgIGNyZWF0ZUdlbmVyYXRvciA9IGdlbk9wdHNbYXJncy50YXJnZXRdWzBdCisgICAgICAgIG9wdGlvbnMgPSBnZW5PcHRzW2FyZ3MudGFyZ2V0XVsxXQorCisgICAgICAgIGlmIG5vdCBhcmdzLnF1aWV0OgorICAgICAgICAgICAgd3JpdGUoJyogQnVpbGRpbmcnLCBvcHRpb25zLmZpbGVuYW1lLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLnZlcnNpb25zICAgICAgICAgID0nLCBvcHRpb25zLnZlcnNpb25zLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLmVtaXR2ZXJzaW9ucyAgICAgID0nLCBvcHRpb25zLmVtaXR2ZXJzaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5kZWZhdWx0RXh0ZW5zaW9ucyA9Jywgb3B0aW9ucy5kZWZhdWx0RXh0ZW5zaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5hZGRFeHRlbnNpb25zICAgICA9Jywgb3B0aW9ucy5hZGRFeHRlbnNpb25zLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLnJlbW92ZUV4dGVuc2lvbnMgID0nLCBvcHRpb25zLnJlbW92ZUV4dGVuc2lvbnMsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHdyaXRlKCcqIG9wdGlvbnMuZW1pdEV4dGVuc2lvbnMgICAgPScsIG9wdGlvbnMuZW1pdEV4dGVuc2lvbnMsIGZpbGU9c3lzLnN0ZGVycikKKworICAgICAgICBzdGFydFRpbWVyKGFyZ3MudGltZSkKKyAgICAgICAgZ2VuID0gY3JlYXRlR2VuZXJhdG9yKGVyckZpbGU9ZXJyV2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5GaWxlPWVycldhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnRmlsZT1kaWFnKQorICAgICAgICByZWcuc2V0R2VuZXJhdG9yKGdlbikKKyAgICAgICAgcmVnLmFwaUdlbihvcHRpb25zKQorCisgICAgICAgIGlmIG5vdCBhcmdzLnF1aWV0OgorICAgICAgICAgICAgd3JpdGUoJyogR2VuZXJhdGVkJywgb3B0aW9ucy5maWxlbmFtZSwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBlbmRUaW1lcihhcmdzLnRpbWUsICcqIFRpbWUgdG8gZ2VuZXJhdGUgJyArIG9wdGlvbnMuZmlsZW5hbWUgKyAnID0nKQorICAgIGVsc2U6CisgICAgICAgIHdyaXRlKCdObyBnZW5lcmF0b3Igb3B0aW9ucyBmb3IgdW5rbm93biB0YXJnZXQ6JywKKyAgICAgICAgICAgICAgYXJncy50YXJnZXQsIGZpbGU9c3lzLnN0ZGVycikKKworCisjIC1mZWF0dXJlIG5hbWUKKyMgLWV4dGVuc2lvbiBuYW1lCisjIEZvciBib3RoLCAibmFtZSIgbWF5IGJlIGEgc2luZ2xlIG5hbWUsIG9yIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QKKyMgb2YgbmFtZXMsIG9yIGEgcmVndWxhciBleHByZXNzaW9uLgoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZGVmYXVsdEV4dGVuc2lvbnMnLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J3Z1bGthbicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGEgc2luZ2xlIGNsYXNzIG9mIGV4dGVuc2lvbnMgdG8gYWRkIHRvIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1leHRlbnNpb24nLCBhY3Rpb249J2FwcGVuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhbiBleHRlbnNpb24gb3IgZXh0ZW5zaW9ucyB0byBhZGQgdG8gdGFyZ2V0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXJlbW92ZUV4dGVuc2lvbnMnLCBhY3Rpb249J2FwcGVuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhbiBleHRlbnNpb24gb3IgZXh0ZW5zaW9ucyB0byByZW1vdmUgZnJvbSB0YXJnZXRzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZW1pdEV4dGVuc2lvbnMnLCBhY3Rpb249J2FwcGVuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhbiBleHRlbnNpb24gb3IgZXh0ZW5zaW9ucyB0byBlbWl0IGluIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1mZWF0dXJlJywgYWN0aW9uPSdhcHBlbmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYSBjb3JlIEFQSSBmZWF0dXJlIG5hbWUgb3IgbmFtZXMgdG8gYWRkIHRvIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgZGVidWdnaW5nJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZHVtcCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgZHVtcCB0byBzdGRlcnInKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kaWFnZmlsZScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nV3JpdGUgZGlhZ25vc3RpY3MgdG8gc3BlY2lmaWVkIGZpbGUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1lcnJmaWxlJywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdXcml0ZSBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHNwZWNpZmllZCBmaWxlIGluc3RlYWQgb2Ygc3RkZXJyJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctbm9wcm90ZWN0JywgZGVzdD0ncHJvdGVjdCcsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRGlzYWJsZSBpbmNsdXNpb24gcHJvdGVjdGlvbiBpbiBvdXRwdXQgaGVhZGVycycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXByb2ZpbGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIHByb2ZpbGluZycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXJlZ2lzdHJ5JywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSd2ay54bWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVXNlIHNwZWNpZmllZCByZWdpc3RyeSBmaWxlIGluc3RlYWQgb2YgdmsueG1sJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdGltZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgdGltaW5nJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdmFsaWRhdGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIGdyb3VwIHZhbGlkYXRpb24nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgYWN0aW9uPSdzdG9yZScsIGRlc3Q9J2RpcmVjdG9yeScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PScuJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0NyZWF0ZSB0YXJnZXQgYW5kIHJlbGF0ZWQgZmlsZXMgaW4gc3BlY2lmaWVkIGRpcmVjdG9yeScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgndGFyZ2V0JywgbWV0YXZhcj0ndGFyZ2V0JywgbmFyZ3M9Jz8nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSB0YXJnZXQnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1N1cHByZXNzIHNjcmlwdCBvdXRwdXQgZHVyaW5nIG5vcm1hbCBleGVjdXRpb24uJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdmVyYm9zZScsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLCBkZXN0PSdxdWlldCcsIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0VuYWJsZSBzY3JpcHQgb3V0cHV0IGR1cmluZyBub3JtYWwgZXhlY3V0aW9uLicpCisKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgIyBUaGlzIHNwbGl0cyBhcmd1bWVudHMgd2hpY2ggYXJlIHNwYWNlLXNlcGFyYXRlZCBsaXN0cworICAgIGFyZ3MuZmVhdHVyZSA9IFtuYW1lIGZvciBhcmcgaW4gYXJncy5mZWF0dXJlIGZvciBuYW1lIGluIGFyZy5zcGxpdCgpXQorICAgIGFyZ3MuZXh0ZW5zaW9uID0gW25hbWUgZm9yIGFyZyBpbiBhcmdzLmV4dGVuc2lvbiBmb3IgbmFtZSBpbiBhcmcuc3BsaXQoKV0KKworICAgICMgTG9hZCAmIHBhcnNlIHJlZ2lzdHJ5CisgICAgcmVnID0gUmVnaXN0cnkoKQorCisgICAgc3RhcnRUaW1lcihhcmdzLnRpbWUpCisgICAgdHJlZSA9IGV0cmVlLnBhcnNlKGFyZ3MucmVnaXN0cnkpCisgICAgZW5kVGltZXIoYXJncy50aW1lLCAnKiBUaW1lIHRvIG1ha2UgRWxlbWVudFRyZWUgPScpCisKKyAgICBpZiBhcmdzLmRlYnVnOgorICAgICAgICBwZGIucnVuKCdyZWcubG9hZEVsZW1lbnRUcmVlKHRyZWUpJykKKyAgICBlbHNlOgorICAgICAgICBzdGFydFRpbWVyKGFyZ3MudGltZSkKKyAgICAgICAgcmVnLmxvYWRFbGVtZW50VHJlZSh0cmVlKQorICAgICAgICBlbmRUaW1lcihhcmdzLnRpbWUsICcqIFRpbWUgdG8gcGFyc2UgRWxlbWVudFRyZWUgPScpCisKKyAgICBpZiBhcmdzLnZhbGlkYXRlOgorICAgICAgICByZWcudmFsaWRhdGVHcm91cHMoKQorCisgICAgaWYgYXJncy5kdW1wOgorICAgICAgICB3cml0ZSgnKiBEdW1waW5nIHJlZ2lzdHJ5IHRvIHJlZ2R1bXAudHh0JywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZWcuZHVtcFJlZyhmaWxlaGFuZGxlPW9wZW4oJ3JlZ2R1bXAudHh0JywgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSkKKworICAgICMgY3JlYXRlIGVycm9yL3dhcm5pbmcgJiBkaWFnbm9zdGljIGZpbGVzCisgICAgaWYgYXJncy5lcnJmaWxlOgorICAgICAgICBlcnJXYXJuID0gb3BlbihhcmdzLmVycmZpbGUsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICBlbHNlOgorICAgICAgICBlcnJXYXJuID0gc3lzLnN0ZGVycgorCisgICAgaWYgYXJncy5kaWFnZmlsZToKKyAgICAgICAgZGlhZyA9IG9wZW4oYXJncy5kaWFnZmlsZSwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKQorICAgIGVsc2U6CisgICAgICAgIGRpYWcgPSBOb25lCisKKyAgICBpZiBhcmdzLmRlYnVnOgorICAgICAgICBwZGIucnVuKCdnZW5UYXJnZXQoYXJncyknKQorICAgIGVsaWYgYXJncy5wcm9maWxlOgorICAgICAgICBpbXBvcnQgY1Byb2ZpbGUKKyAgICAgICAgaW1wb3J0IHBzdGF0cworICAgICAgICBjUHJvZmlsZS5ydW4oJ2dlblRhcmdldChhcmdzKScsICdwcm9maWxlLnR4dCcpCisgICAgICAgIHAgPSBwc3RhdHMuU3RhdHMoJ3Byb2ZpbGUudHh0JykKKyAgICAgICAgcC5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cygndGltZScpLnByaW50X3N0YXRzKDUwKQorICAgIGVsc2U6CisgICAgICAgIGdlblRhcmdldChhcmdzKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS9yZWcucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L3JlZy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjg0YWJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS9yZWcucHkKQEAgLTAsMCArMSwxMjEwIEBACisjIS91c3IvYmluL3B5dGhvbjMgLWkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiVHlwZXMgYW5kIGNsYXNzZXMgZm9yIG1hbmlwdWxhdGluZyBhbiBBUEkgcmVnaXN0cnkuIiIiCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgZXRyZWUKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0LCBuYW1lZHR1cGxlCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgT3V0cHV0R2VuZXJhdG9yLCB3cml0ZQorCitkZWYgbWF0Y2hBUElQcm9maWxlKGFwaSwgcHJvZmlsZSwgZWxlbSk6CisgICAgIiIiUmV0dXJuIHdoZXRoZXIgYW4gQVBJIGFuZCBwcm9maWxlCisgICAgYmVpbmcgZ2VuZXJhdGVkIG1hdGNoZXMgYW4gZWxlbWVudCdzIHByb2ZpbGUKKworICAgIC0gYXBpIC0gc3RyaW5nIG5hbWluZyB0aGUgQVBJIHRvIG1hdGNoCisgICAgLSBwcm9maWxlIC0gc3RyaW5nIG5hbWluZyB0aGUgcHJvZmlsZSB0byBtYXRjaAorICAgIC0gZWxlbSAtIEVsZW1lbnQgd2hpY2ggKG1heSkgaGF2ZSAnYXBpJyBhbmQgJ3Byb2ZpbGUnCisgICAgICBhdHRyaWJ1dGVzIHRvIG1hdGNoIHRvLgorCisgICAgSWYgYSB0YWcgaXMgbm90IHByZXNlbnQgaW4gdGhlIEVsZW1lbnQsIHRoZSBjb3JyZXNwb25kaW5nIEFQSQorICAgICAgb3IgcHJvZmlsZSBhbHdheXMgbWF0Y2hlcy4KKworICAgIE90aGVyd2lzZSwgdGhlIHRhZyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIEFQSSBvciBwcm9maWxlLgorCisgICAgVGh1cywgaWYgJ3Byb2ZpbGUnID0gY29yZToKKworICAgIC0gYDxyZW1vdmU+YCAgd2l0aCBubyBhdHRyaWJ1dGUgd2lsbCBtYXRjaAorICAgIC0gYDxyZW1vdmUgcHJvZmlsZT0iY29yZSI+YCB3aWxsIG1hdGNoCisgICAgLSBgPHJlbW92ZSBwcm9maWxlPSJjb21wYXRpYmlsaXR5Ij5gIHdpbGwgbm90IG1hdGNoCisKKyAgICBQb3NzaWJsZSBtYXRjaCBjb25kaXRpb25zOgorCisgICAgYGBgCisgICAgICBSZXF1ZXN0ZWQgICBFbGVtZW50CisgICAgICBQcm9maWxlICAgICBQcm9maWxlCisgICAgICAtLS0tLS0tLS0gICAtLS0tLS0tLQorICAgICAgTm9uZSAgICAgICAgTm9uZSAgICAgICAgQWx3YXlzIG1hdGNoZXMKKyAgICAgICdzdHJpbmcnICAgIE5vbmUgICAgICAgIEFsd2F5cyBtYXRjaGVzCisgICAgICBOb25lICAgICAgICAnc3RyaW5nJyAgICBEb2VzIG5vdCBtYXRjaC4gQ2FuJ3QgZ2VuZXJhdGUgbXVsdGlwbGUgQVBJcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcHJvZmlsZXMsIHNvIGlmIGFuIEFQSS9wcm9maWxlIGNvbnN0cmFpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHByZXNlbnQsIGl0IG11c3QgYmUgYXNrZWQgZm9yIGV4cGxpY2l0bHkuCisgICAgICAnc3RyaW5nJyAgICAnc3RyaW5nJyAgICBTdHJpbmdzIG11c3QgbWF0Y2gKKyAgICBgYGAKKworICAgICoqIEluIHRoZSBmdXR1cmUsIHdlIHdpbGwgYWxsb3cgcmVnZXhlcyBmb3IgdGhlIGF0dHJpYnV0ZXMsCisgICAgbm90IGp1c3Qgc3RyaW5ncywgc28gdGhhdCBgYXBpPSJeKGdsfGdsZXMyKSJgIHdpbGwgbWF0Y2guIEV2ZW4KKyAgICB0aGlzIGlzbid0IHJlYWxseSBxdWl0ZSBlbm91Z2gsIHdlIG1pZ2h0IHByZWZlciBzb21ldGhpbmcKKyAgICBsaWtlIGAiZ2woY29yZSl8Z2xlczEoY29tbW9uLWxpdGUpImAuIiIiCisgICAgIyBNYXRjaCAnYXBpJywgaWYgcHJlc2VudAorICAgIGVsZW1fYXBpID0gZWxlbS5nZXQoJ2FwaScpCisgICAgaWYgZWxlbV9hcGk6CisgICAgICAgIGlmIGFwaSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVXNlcldhcm5pbmcoIk5vIEFQSSByZXF1ZXN0ZWQsIGJ1dCAnYXBpJyBhdHRyaWJ1dGUgaXMgcHJlc2VudCB3aXRoIHZhbHVlICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVsZW1fYXBpICsgIiciKQorICAgICAgICBlbGlmIGFwaSAhPSBlbGVtX2FwaToKKyAgICAgICAgICAgICMgUmVxdWVzdGVkIEFQSSBkb2Vzbid0IG1hdGNoIGF0dHJpYnV0ZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZWxlbV9wcm9maWxlID0gZWxlbS5nZXQoJ3Byb2ZpbGUnKQorICAgIGlmIGVsZW1fcHJvZmlsZToKKyAgICAgICAgaWYgcHJvZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVXNlcldhcm5pbmcoIk5vIHByb2ZpbGUgcmVxdWVzdGVkLCBidXQgJ3Byb2ZpbGUnIGF0dHJpYnV0ZSBpcyBwcmVzZW50IHdpdGggdmFsdWUgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZWxlbV9wcm9maWxlICsgIiciKQorICAgICAgICBlbGlmIHByb2ZpbGUgIT0gZWxlbV9wcm9maWxlOgorICAgICAgICAgICAgIyBSZXF1ZXN0ZWQgcHJvZmlsZSBkb2Vzbid0IG1hdGNoIGF0dHJpYnV0ZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworIyBkZWYgcHJpbnRLZXlzKG1zZywgZWxlbSk6CisjICAgICAiIiJQcmludCBhbGwgdGhlIGtleXMgaW4gYW4gRWxlbWVudCAtIG9ubHkgZm9yIGRpYWdub3N0aWNzIiIiCisjICAgICBwcmludCgncHJpbnRLZXlzOicsIG1zZywgZmlsZT1zeXMuc3RkZXJyKQorIyAgICAgZm9yIGtleSBpbiBlbGVtLmtleXMoKToKKyMgICAgICAgICBwcmludCgnICAgIHt9IC0+IHt9Jy5mb3JtYXQoa2V5LCBlbGVtLmdldChrZXkpKSwgZmlsZT1zeXMuc3RkZXJyKQorCitjbGFzcyBCYXNlSW5mbzoKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHJlZ2lzdHJ5IGZlYXR1cmUKKyAgICAodHlwZS9ncm91cC9lbnVtL2NvbW1hbmQvQVBJL2V4dGVuc2lvbikuCisKKyAgICBSZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIHJlZ2lzdHJ5IGZlYXR1cmUsIHVzZWQgZHVyaW5nIEFQSSBnZW5lcmF0aW9uLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW0pOgorICAgICAgICBzZWxmLnJlcXVpcmVkID0gRmFsc2UKKyAgICAgICAgIiIic2hvdWxkIHRoaXMgZmVhdHVyZSBiZSBkZWZpbmVkIGR1cmluZyBoZWFkZXIgZ2VuZXJhdGlvbgorICAgICAgICAoaGFzIGl0IGJlZW4gcmVtb3ZlZCBieSBhIHByb2ZpbGUgb3IgdmVyc2lvbik/IiIiCisKKyAgICAgICAgc2VsZi5kZWNsYXJlZCA9IEZhbHNlCisgICAgICAgICJoYXMgdGhpcyBmZWF0dXJlIGJlZW4gZGVmaW5lZCBhbHJlYWR5PyIKKworICAgICAgICBzZWxmLmVsZW0gPSBlbGVtCisgICAgICAgICJldHJlZSBFbGVtZW50IGZvciB0aGlzIGZlYXR1cmUiCisKKyAgICBkZWYgcmVzZXRTdGF0ZShzZWxmKToKKyAgICAgICAgIiIiUmVzZXQgcmVxdWlyZWQvZGVjbGFyZWQgdG8gaW5pdGlhbCB2YWx1ZXMuIFVzZWQKKyAgICAgICAgcHJpb3IgdG8gZ2VuZXJhdGluZyBhIG5ldyBBUEkgaW50ZXJmYWNlLiIiIgorICAgICAgICBzZWxmLnJlcXVpcmVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5kZWNsYXJlZCA9IEZhbHNlCisKKyAgICBkZWYgY29tcGFyZUtleXMoc2VsZiwgaW5mbywga2V5LCByZXF1aXJlZCA9IEZhbHNlKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZi5lbGVtIGFuZCBpbmZvLmVsZW0gaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgdmFsdWUgZm9yIGtleS4KKyAgICAgICAgICAgSWYgJ3JlcXVpcmVkJyBpcyBub3QgVHJ1ZSwgYWxzbyByZXR1cm5zIFRydWUgaWYgbmVpdGhlciBlbGVtZW50CisgICAgICAgICAgIGhhcyBhbiBhdHRyaWJ1dGUgdmFsdWUgZm9yIGtleS4iIiIKKworICAgICAgICBpZiByZXF1aXJlZCBhbmQga2V5IG5vdCBpbiBzZWxmLmVsZW0ua2V5cygpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBzZWxmLmVsZW0uZ2V0KGtleSkgPT0gaW5mby5lbGVtLmdldChrZXkpCisKKyAgICBkZWYgY29tcGFyZUVsZW0oc2VsZiwgaW5mbywgaW5mb05hbWUpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmLmVsZW0gYW5kIGluZm8uZWxlbSBoYXZlIHRoZSBzYW1lIGRlZmluaXRpb24uCisgICAgICAgIGluZm8gLSB0aGUgb3RoZXIgb2JqZWN0CisgICAgICAgIGluZm9OYW1lIC0gJ3R5cGUnIC8gJ2dyb3VwJyAvICdlbnVtJyAvICdjb21tYW5kJyAvICdmZWF0dXJlJyAvCisgICAgICAgICAgICAgICAgICAgJ2V4dGVuc2lvbiciIiIKKworICAgICAgICBpZiBpbmZvTmFtZSA9PSAnZW51bSc6CisgICAgICAgICAgICBpZiBzZWxmLmNvbXBhcmVLZXlzKGluZm8sICdleHRlbmRzJyk6CisgICAgICAgICAgICAgICAgIyBFaXRoZXIgYm90aCBleHRlbmQgdGhlIHNhbWUgdHlwZSwgb3Igbm8gdHlwZQorICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVLZXlzKGluZm8sICd2YWx1ZScsIHJlcXVpcmVkID0gVHJ1ZSkgb3IKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21wYXJlS2V5cyhpbmZvLCAnYml0cG9zJywgcmVxdWlyZWQgPSBUcnVlKSk6CisgICAgICAgICAgICAgICAgICAgICMgSWYgYm90aCBzcGVjaWZ5IHRoZSBzYW1lIHZhbHVlIG9yIGJpdCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIyB0aGV5J3JlIGVxdWFsCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiAoc2VsZi5jb21wYXJlS2V5cyhpbmZvLCAnZXh0ZW5kcycpIGFuZAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcGFyZUtleXMoaW5mbywgJ2V4dG51bWJlcicpIGFuZAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcGFyZUtleXMoaW5mbywgJ29mZnNldCcpIGFuZAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcGFyZUtleXMoaW5mbywgJ2RpcicpKToKKyAgICAgICAgICAgICAgICAgICAgIyBJZiBib3RoIHNwZWNpZnkgdGhlIHNhbWUgcmVsYXRpdmUgb2Zmc2V0LCB0aGV5J3JlIGVxdWFsCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgVGhlIHNhbWUgZW51bSBjYW4ndCBleHRlbmQgdHdvIGRpZmZlcmVudCB0eXBlcworICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBOb24tPGVudW0+cyBzaG91bGQgbmV2ZXIgYmUgcmVkZWZpbmVkCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBUeXBlSW5mbyhCYXNlSW5mbyk6CisgICAgIiIiUmVnaXN0cnkgaW5mb3JtYXRpb24gYWJvdXQgYSB0eXBlLiBObyBhZGRpdGlvbmFsIHN0YXRlCisgICAgICBiZXlvbmQgQmFzZUluZm8gaXMgcmVxdWlyZWQuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbSk6CisgICAgICAgIEJhc2VJbmZvLl9faW5pdF9fKHNlbGYsIGVsZW0pCisgICAgICAgIHNlbGYuYWRkaXRpb25hbFZhbGlkaXR5ID0gW10KKyAgICAgICAgc2VsZi5yZW1vdmVkVmFsaWRpdHkgPSBbXQorCisgICAgZGVmIGdldE1lbWJlcnMoc2VsZik6CisgICAgICAgICIiIkdldCBhIGNvbGxlY3Rpb24gb2YgYWxsIG1lbWJlciBlbGVtZW50cyBmb3IgdGhpcyB0eXBlLCBpZiBhbnkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVsZW0uZmluZGFsbCgnbWVtYmVyJykKKworICAgIGRlZiByZXNldFN0YXRlKHNlbGYpOgorICAgICAgICBCYXNlSW5mby5yZXNldFN0YXRlKHNlbGYpCisgICAgICAgIHNlbGYuYWRkaXRpb25hbFZhbGlkaXR5ID0gW10KKyAgICAgICAgc2VsZi5yZW1vdmVkVmFsaWRpdHkgPSBbXQorCisKK2NsYXNzIEdyb3VwSW5mbyhCYXNlSW5mbyk6CisgICAgIiIiUmVnaXN0cnkgaW5mb3JtYXRpb24gYWJvdXQgYSBncm91cCBvZiByZWxhdGVkIGVudW1zCisgICAgaW4gYW4gPGVudW1zPiBibG9jaywgZ2VuZXJhbGx5IGNvcnJlc3BvbmRpbmcgdG8gYSBDICJlbnVtIiB0eXBlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW0pOgorICAgICAgICBCYXNlSW5mby5fX2luaXRfXyhzZWxmLCBlbGVtKQorCisKK2NsYXNzIEVudW1JbmZvKEJhc2VJbmZvKToKKyAgICAiIiJSZWdpc3RyeSBpbmZvcm1hdGlvbiBhYm91dCBhbiBlbnVtIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbSk6CisgICAgICAgIEJhc2VJbmZvLl9faW5pdF9fKHNlbGYsIGVsZW0pCisgICAgICAgIHNlbGYudHlwZSA9IGVsZW0uZ2V0KCd0eXBlJykKKyAgICAgICAgIiIibnVtZXJpYyB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgPGVudW0+IHRhZworICAgICAgICAoICcnIGZvciBHTGludCwgJ3UnIGZvciBHTHVpbnQsICd1bGwnIGZvciBHTHVpbnQ2NCApIiIiCisgICAgICAgIGlmIHNlbGYudHlwZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50eXBlID0gJycKKworCitjbGFzcyBDbWRJbmZvKEJhc2VJbmZvKToKKyAgICAiIiJSZWdpc3RyeSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbW1hbmQiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtKToKKyAgICAgICAgQmFzZUluZm8uX19pbml0X18oc2VsZiwgZWxlbSkKKyAgICAgICAgc2VsZi5hZGRpdGlvbmFsVmFsaWRpdHkgPSBbXQorICAgICAgICBzZWxmLnJlbW92ZWRWYWxpZGl0eSA9IFtdCisKKyAgICBkZWYgZ2V0UGFyYW1zKHNlbGYpOgorICAgICAgICAiIiJHZXQgYSBjb2xsZWN0aW9uIG9mIGFsbCBwYXJhbSBlbGVtZW50cyBmb3IgdGhpcyBjb21tYW5kLCBpZiBhbnkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVsZW0uZmluZGFsbCgncGFyYW0nKQorCisgICAgZGVmIHJlc2V0U3RhdGUoc2VsZik6CisgICAgICAgIEJhc2VJbmZvLnJlc2V0U3RhdGUoc2VsZikKKyAgICAgICAgc2VsZi5hZGRpdGlvbmFsVmFsaWRpdHkgPSBbXQorICAgICAgICBzZWxmLnJlbW92ZWRWYWxpZGl0eSA9IFtdCisKK2NsYXNzIEZlYXR1cmVJbmZvKEJhc2VJbmZvKToKKyAgICAiIiJSZWdpc3RyeSBpbmZvcm1hdGlvbiBhYm91dCBhbiBBUEkgPGZlYXR1cmU+CisgICAgb3IgPGV4dGVuc2lvbj4uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbSk6CisgICAgICAgIEJhc2VJbmZvLl9faW5pdF9fKHNlbGYsIGVsZW0pCisgICAgICAgIHNlbGYubmFtZSA9IGVsZW0uZ2V0KCduYW1lJykKKyAgICAgICAgImZlYXR1cmUgbmFtZSBzdHJpbmcgKGUuZy4gJ1ZLX0tIUl9zdXJmYWNlJykiCisKKyAgICAgICAgc2VsZi5lbWl0ID0gRmFsc2UKKyAgICAgICAgImhhcyB0aGlzIGZlYXR1cmUgYmVlbiBkZWZpbmVkIGFscmVhZHk/IgorCisgICAgICAgIHNlbGYuc29ydG9yZGVyID0gaW50KGVsZW0uZ2V0KCdzb3J0b3JkZXInLCAwKSkKKyAgICAgICAgIiIiZXhwbGljaXQgbnVtZXJpYyBzb3J0IGtleSB3aXRoaW4gZmVhdHVyZSBhbmQgZXh0ZW5zaW9uIGdyb3Vwcy4KKyAgICAgICAgRGVmYXVsdHMgdG8gMC4iIiIKKworICAgICAgICBpZiBlbGVtLnRhZyA9PSAnZmVhdHVyZSc6CisgICAgICAgICAgICAjIEVsZW1lbnQgY2F0ZWdvcnkgKHZlbmRvcikgaXMgbWVhbmluZ2xlc3MgZm9yIDxmZWF0dXJlPgorICAgICAgICAgICAgc2VsZi5jYXRlZ29yeSA9ICdWRVJTSU9OJworICAgICAgICAgICAgImNhdGVnb3J5LCBlLmcuIFZFUlNJT04gb3Iga2hyL3ZlbmRvciB0YWciCisKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IGVsZW0uZ2V0KCduYW1lJykKKyAgICAgICAgICAgICIiImZlYXR1cmUgbmFtZSBzdHJpbmciIiIKKworICAgICAgICAgICAgc2VsZi52ZXJzaW9uTnVtYmVyID0gZWxlbS5nZXQoJ251bWJlcicpCisgICAgICAgICAgICAiIiJ2ZXJzaW9uTnVtYmVyIC0gQVBJIHZlcnNpb24gbnVtYmVyLCB0YWtlbiBmcm9tIHRoZSAnbnVtYmVyJworICAgICAgICAgICAgICAgYXR0cmlidXRlIG9mIDxmZWF0dXJlPi4gRXh0ZW5zaW9ucyBkbyBub3QgaGF2ZSBBUEkgdmVyc2lvbgorICAgICAgICAgICAgICAgbnVtYmVycyBhbmQgYXJlIGFzc2lnbmVkIG51bWJlciAwLiIiIgorCisgICAgICAgICAgICBzZWxmLm51bWJlciA9ICIwIgorICAgICAgICAgICAgc2VsZi5zdXBwb3J0ZWQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEV4dHJhY3QgdmVuZG9yIHBvcnRpb24gb2YgVktfPHZlbmRvcj5fPG5hbWU+CisgICAgICAgICAgICBzZWxmLmNhdGVnb3J5ID0gc2VsZi5uYW1lLnNwbGl0KCdfJywgMilbMV0KKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9ICIwIgorICAgICAgICAgICAgc2VsZi52ZXJzaW9uTnVtYmVyID0gIjAiCisgICAgICAgICAgICBzZWxmLm51bWJlciA9IGVsZW0uZ2V0KCdudW1iZXInKQorICAgICAgICAgICAgIiIiZXh0ZW5zaW9uIG51bWJlciwgdXNlZCBmb3Igb3JkZXJpbmcgYW5kIGZvciBhc3NpZ25pbmcKKyAgICAgICAgICAgIGVudW1lcmFudCBvZmZzZXRzLiA8ZmVhdHVyZT4gZmVhdHVyZXMgZG8gbm90IGhhdmUgZXh0ZW5zaW9uCisgICAgICAgICAgICBudW1iZXJzIGFuZCBhcmUgYXNzaWduZWQgbnVtYmVyIDAuIiIiCisKKyAgICAgICAgICAgICMgSWYgdGhlcmUncyBubyAnbnVtYmVyJyBhdHRyaWJ1dGUsIHVzZSAwLCBzbyBzb3J0aW5nIHdvcmtzCisgICAgICAgICAgICBpZiBzZWxmLm51bWJlciBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYubnVtYmVyID0gMAorICAgICAgICAgICAgc2VsZi5zdXBwb3J0ZWQgPSBlbGVtLmdldCgnc3VwcG9ydGVkJykKKworCitjbGFzcyBSZWdpc3RyeToKKyAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGFuIEFQSSByZWdpc3RyeSwgbG9hZGVkIGZyb20gYW4gWE1MIGZpbGUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudHJlZSA9IE5vbmUKKyAgICAgICAgIkVsZW1lbnRUcmVlIGNvbnRhaW5pbmcgdGhlIHJvb3QgYDxyZWdpc3RyeT5gIgorCisgICAgICAgIHNlbGYudHlwZWRpY3QgPSB7fQorICAgICAgICAiZGljdGlvbmFyeSBvZiBUeXBlSW5mbyBvYmplY3RzIGtleWVkIGJ5IHR5cGUgbmFtZSIKKworICAgICAgICBzZWxmLmdyb3VwZGljdCA9IHt9CisgICAgICAgICJkaWN0aW9uYXJ5IG9mIEdyb3VwSW5mbyBvYmplY3RzIGtleWVkIGJ5IGdyb3VwIG5hbWUiCisKKyAgICAgICAgc2VsZi5lbnVtZGljdCA9IHt9CisgICAgICAgICJkaWN0aW9uYXJ5IG9mIEVudW1JbmZvIG9iamVjdHMga2V5ZWQgYnkgZW51bSBuYW1lIgorCisgICAgICAgIHNlbGYuY21kZGljdCA9IHt9CisgICAgICAgICJkaWN0aW9uYXJ5IG9mIENtZEluZm8gb2JqZWN0cyBrZXllZCBieSBjb21tYW5kIG5hbWUiCisKKyAgICAgICAgc2VsZi5hcGlkaWN0ID0ge30KKyAgICAgICAgImRpY3Rpb25hcnkgb2YgRmVhdHVyZUluZm8gb2JqZWN0cyBmb3IgYDxmZWF0dXJlPmAgZWxlbWVudHMga2V5ZWQgYnkgQVBJIG5hbWUiCisKKyAgICAgICAgc2VsZi5leHRlbnNpb25zID0gW10KKyAgICAgICAgImxpc3Qgb2YgYDxleHRlbnNpb24+YCBFbGVtZW50cyIKKworICAgICAgICBzZWxmLmV4dGRpY3QgPSB7fQorICAgICAgICAiZGljdGlvbmFyeSBvZiBGZWF0dXJlSW5mbyBvYmplY3RzIGZvciBgPGV4dGVuc2lvbj5gIGVsZW1lbnRzIGtleWVkIGJ5IGV4dGVuc2lvbiBuYW1lIgorCisgICAgICAgICMgQSBkZWZhdWx0IG91dHB1dCBnZW5lcmF0b3IsIHNvIGNvbW1hbmRzIHByaW9yIHRvIGFwaUdlbiBjYW4gcmVwb3J0CisgICAgICAgICMgZXJyb3JzIHZpYSB0aGUgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAgc2VsZi5nZW4gPSBPdXRwdXRHZW5lcmF0b3IoKQorICAgICAgICAiT3V0cHV0R2VuZXJhdG9yIG9iamVjdCB1c2VkIHRvIHdyaXRlIGhlYWRlcnMgLyBtZXNzYWdlcyIKKworICAgICAgICBzZWxmLmdlbk9wdHMgPSBOb25lCisgICAgICAgICIiIkdlbmVyYXRvck9wdGlvbnMgb2JqZWN0IHVzZWQgdG8gY29udHJvbCB3aGljaAorICAgICAgICBmZWF0dXJlcyB0byB3cml0ZSBhbmQgaG93IHRvIGZvcm1hdCB0aGVtIiIiCisKKyAgICAgICAgc2VsZi5lbWl0RmVhdHVyZXMgPSBGYWxzZQorICAgICAgICAiIiJUcnVlIHRvIGFjdHVhbGx5IGVtaXQgZmVhdHVyZXMgZm9yIGEgdmVyc2lvbiAvIGV4dGVuc2lvbiwKKyAgICAgICAgb3IgRmFsc2UgdG8ganVzdCB0cmVhdCB0aGVtIGFzIGVtaXR0ZWQiIiIKKworICAgICAgICBzZWxmLmJyZWFrUGF0ID0gTm9uZQorICAgICAgICAicmVnZXhwIHBhdHRlcm4gdG8gYnJlYWsgb24gd2hlbiBnZW5lcmF0bmcgbmFtZXMiCisgICAgICAgICMgc2VsZi5icmVha1BhdCAgICAgPSByZS5jb21waWxlKCdWa0ZlbmNlSW1wb3J0RmxhZ0JpdHMuKicpCisKKyAgICAgICAgc2VsZi5yZXF1aXJlZGV4dGVuc2lvbnMgPSBbXSAgIyBIYWNrIC0gY2FuIHJlbW92ZSBpdCBhZnRlciB2YWxpZGl0eSBnZW5lcmF0b3IgZ29lcyBhd2F5CisKKyAgICAgICAgIyAqKiBHbG9iYWwgdHlwZXMgZm9yIGF1dG9tYXRpYyBzb3VyY2UgZ2VuZXJhdGlvbiAqKgorICAgICAgICAjIExlbmd0aCBNZW1iZXIgZGF0YQorICAgICAgICBzZWxmLmNvbW1hbmRleHRlbnNpb250dXBsZSA9IG5hbWVkdHVwbGUoJ2NvbW1hbmRleHRlbnNpb250dXBsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2NvbW1hbmQnLCAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZCBiZWluZyBtb2RpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScsICAgICAgICAgICMgVGhlIHZhbHVlIHRvIGFwcGVuZCB0byB0aGUgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHRlbnNpb24nXSkgICAgICMgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0aGF0IGFkZGVkIGl0CisgICAgICAgIHNlbGYudmFsaWRleHRlbnNpb25zdHJ1Y3RzID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgc2VsZi5jb21tYW5kZXh0ZW5zaW9uc3VjY2Vzc2VzID0gW10KKyAgICAgICAgc2VsZi5jb21tYW5kZXh0ZW5zaW9uZXJyb3JzID0gW10KKworICAgICAgICBzZWxmLmZpbGVuYW1lICAgICA9IE5vbmUKKworICAgIGRlZiBsb2FkRWxlbWVudFRyZWUoc2VsZiwgdHJlZSk6CisgICAgICAgICIiIkxvYWQgRWxlbWVudFRyZWUgaW50byBhIFJlZ2lzdHJ5IG9iamVjdCBhbmQgcGFyc2UgaXQuIiIiCisgICAgICAgIHNlbGYudHJlZSA9IHRyZWUKKyAgICAgICAgc2VsZi5wYXJzZVRyZWUoKQorCisgICAgZGVmIGxvYWRGaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICAiIiJMb2FkIGFuIEFQSSByZWdpc3RyeSBYTUwgZmlsZSBpbnRvIGEgUmVnaXN0cnkgb2JqZWN0IGFuZCBwYXJzZSBpdCIiIgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZQorICAgICAgICBzZWxmLnRyZWUgPSBldHJlZS5wYXJzZShmaWxlKQorICAgICAgICBzZWxmLnBhcnNlVHJlZSgpCisKKyAgICBkZWYgc2V0R2VuZXJhdG9yKHNlbGYsIGdlbik6CisgICAgICAgICIiIlNwZWNpZnkgb3V0cHV0IGdlbmVyYXRvciBvYmplY3QuCisKKyAgICAgICAgYE5vbmVgIHJlc3RvcmVzIHRoZSBkZWZhdWx0IGdlbmVyYXRvci4iIiIKKyAgICAgICAgc2VsZi5nZW4gPSBnZW4KKyAgICAgICAgc2VsZi5nZW4uc2V0UmVnaXN0cnkoc2VsZikKKworICAgIGRlZiBhZGRFbGVtZW50SW5mbyhzZWxmLCBlbGVtLCBpbmZvLCBpbmZvTmFtZSwgZGljdGlvbmFyeSk6CisgICAgICAgICIiIkFkZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBlbGVtZW50IHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpY3Rpb25hcnkuCisKKyAgICAgICAgSW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LgorCisgICAgICAgIC0gZWxlbSAtIGA8dHlwZT5gL2A8ZW51bXM+YC9gPGVudW0+YC9gPGNvbW1hbmQ+YC9gPGZlYXR1cmU+YC9gPGV4dGVuc2lvbj5gIEVsZW1lbnQKKyAgICAgICAgLSBpbmZvIC0gY29ycmVzcG9uZGluZyB7VHlwZXxHcm91cHxFbnVtfENtZHxGZWF0dXJlfUluZm8gb2JqZWN0CisgICAgICAgIC0gaW5mb05hbWUgLSAndHlwZScgLyAnZ3JvdXAnIC8gJ2VudW0nIC8gJ2NvbW1hbmQnIC8gJ2ZlYXR1cmUnIC8gJ2V4dGVuc2lvbicKKyAgICAgICAgLSBkaWN0aW9uYXJ5IC0gc2VsZi57dHlwZXxncm91cHxlbnVtfGNtZHxhcGl8ZXh0fWRpY3QKKworICAgICAgICBJZiB0aGUgRWxlbWVudCBoYXMgYW4gJ2FwaScgYXR0cmlidXRlLCB0aGUgZGljdGlvbmFyeSBrZXkgaXMgdGhlCisgICAgICAgIHR1cGxlIChuYW1lLGFwaSkuIElmIG5vdCwgdGhlIGtleSBpcyB0aGUgbmFtZS4gJ25hbWUnIGlzIGFuCisgICAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgRWxlbWVudCIiIgorICAgICAgICAjIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdBZGRpbmcgRWxlbWVudEluZm8ucmVxdWlyZWQgPScsCisgICAgICAgICMgICAgIGluZm8ucmVxdWlyZWQsICduYW1lID0nLCBlbGVtLmdldCgnbmFtZScpKQorICAgICAgICBhcGkgPSBlbGVtLmdldCgnYXBpJykKKyAgICAgICAgaWYgYXBpOgorICAgICAgICAgICAga2V5ID0gKGVsZW0uZ2V0KCduYW1lJyksIGFwaSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtleSA9IGVsZW0uZ2V0KCduYW1lJykKKyAgICAgICAgaWYga2V5IGluIGRpY3Rpb25hcnk6CisgICAgICAgICAgICBpZiBub3QgZGljdGlvbmFyeVtrZXldLmNvbXBhcmVFbGVtKGluZm8sIGluZm9OYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ3dhcm4nLCAnQXR0ZW1wdCB0byByZWRlZmluZScsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyh0aGlzIHNob3VsZCBub3QgaGFwcGVuKScpCisgICAgICAgICAgICAgICAgIyBwcmludEtleXMoJ29sZCBlbGVtZW50JywgZGljdGlvbmFyeVtrZXldLmVsZW0pCisgICAgICAgICAgICAgICAgIyBwcmludEtleXMoJ25ldyBlbGVtZW50JywgaW5mby5lbGVtKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEJlbmlnbiByZWRlZmluaXRpb24gLSBpbnRlbnRpb25hbCBjYXNlcyBleGlzdC4KKyAgICAgICAgICAgICAgICBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaWN0aW9uYXJ5W2tleV0gPSBpbmZvCisKKyAgICBkZWYgbG9va3VwRWxlbWVudEluZm8oc2VsZiwgZm5hbWUsIGRpY3Rpb25hcnkpOgorICAgICAgICAiIiJGaW5kIGEge1R5cGV8RW51bXxDbWR9SW5mbyBvYmplY3QgYnkgbmFtZS4KKworICAgICAgICBJbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisKKyAgICAgICAgSWYgYW4gb2JqZWN0IHF1YWxpZmllZCBieSBBUEkgbmFtZSBleGlzdHMsIHVzZSB0aGF0LgorCisgICAgICAgIC0gZm5hbWUgLSBuYW1lIG9mIHR5cGUgLyBlbnVtIC8gY29tbWFuZAorICAgICAgICAtIGRpY3Rpb25hcnkgLSBzZWxmLnt0eXBlfGVudW18Y21kfWRpY3QiIiIKKyAgICAgICAga2V5ID0gKGZuYW1lLCBzZWxmLmdlbk9wdHMuYXBpbmFtZSkKKyAgICAgICAgaWYga2V5IGluIGRpY3Rpb25hcnk6CisgICAgICAgICAgICAjIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdGb3VuZCBBUEktc3BlY2lmaWMgZWxlbWVudCBmb3IgZmVhdHVyZScsIGZuYW1lKQorICAgICAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnlba2V5XQorICAgICAgICBpZiBmbmFtZSBpbiBkaWN0aW9uYXJ5OgorICAgICAgICAgICAgIyBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnRm91bmQgZ2VuZXJpYyBlbGVtZW50IGZvciBmZWF0dXJlJywgZm5hbWUpCisgICAgICAgICAgICByZXR1cm4gZGljdGlvbmFyeVtmbmFtZV0KKworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGJyZWFrT25OYW1lKHNlbGYsIHJlZ2V4cCk6CisgICAgICAgICIiIlNwZWNpZnkgYSBmZWF0dXJlIG5hbWUgcmVnZXhwIHRvIGJyZWFrIG9uIHdoZW4gZ2VuZXJhdGluZyBmZWF0dXJlcy4iIiIKKyAgICAgICAgc2VsZi5icmVha1BhdCA9IHJlLmNvbXBpbGUocmVnZXhwKQorCisgICAgZGVmIHBhcnNlVHJlZShzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgdGhlIHJlZ2lzdHJ5IEVsZW1lbnQsIG9uY2UgY3JlYXRlZCIiIgorICAgICAgICAjIFRoaXMgbXVzdCBiZSB0aGUgRWxlbWVudCBmb3IgdGhlIHJvb3QgPHJlZ2lzdHJ5PgorICAgICAgICBzZWxmLnJlZyA9IHNlbGYudHJlZS5nZXRyb290KCkKKworICAgICAgICAjIENyZWF0ZSBkaWN0aW9uYXJ5IG9mIHJlZ2lzdHJ5IHR5cGVzIGZyb20gdG9wbGV2ZWwgPHR5cGVzPiB0YWdzCisgICAgICAgICMgYW5kIGFkZCAnbmFtZScgYXR0cmlidXRlIHRvIGVhY2ggPHR5cGU+IHRhZyAod2hlcmUgbWlzc2luZykKKyAgICAgICAgIyBiYXNlZCBvbiBpdHMgPG5hbWU+IGVsZW1lbnQuCisgICAgICAgICMKKyAgICAgICAgIyBUaGVyZSdzIHVzdWFsbHkgb25lIDx0eXBlcz4gYmxvY2s7IG1vcmUgYXJlIE9LCisgICAgICAgICMgUmVxdWlyZWQgPHR5cGU+IGF0dHJpYnV0ZXM6ICduYW1lJyBvciBuZXN0ZWQgPG5hbWU+IHRhZyBjb250ZW50cworICAgICAgICBzZWxmLnR5cGVkaWN0ID0ge30KKyAgICAgICAgZm9yIHR5cGVfZWxlbSBpbiBzZWxmLnJlZy5maW5kYWxsKCd0eXBlcy90eXBlJyk6CisgICAgICAgICAgICAjIElmIHRoZSA8dHlwZT4gZG9lc24ndCBhbHJlYWR5IGhhdmUgYSAnbmFtZScgYXR0cmlidXRlLCBzZXQKKyAgICAgICAgICAgICMgaXQgZnJvbSBjb250ZW50cyBvZiBpdHMgPG5hbWU+IHRhZy4KKyAgICAgICAgICAgIGlmIHR5cGVfZWxlbS5nZXQoJ25hbWUnKSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHR5cGVfZWxlbS5zZXQoJ25hbWUnLCB0eXBlX2VsZW0uZmluZCgnbmFtZScpLnRleHQpCisgICAgICAgICAgICBzZWxmLmFkZEVsZW1lbnRJbmZvKHR5cGVfZWxlbSwgVHlwZUluZm8odHlwZV9lbGVtKSwgJ3R5cGUnLCBzZWxmLnR5cGVkaWN0KQorCisgICAgICAgICMgQ3JlYXRlIGRpY3Rpb25hcnkgb2YgcmVnaXN0cnkgZW51bSBncm91cHMgZnJvbSA8ZW51bXM+IHRhZ3MuCisgICAgICAgICMKKyAgICAgICAgIyBSZXF1aXJlZCA8ZW51bXM+IGF0dHJpYnV0ZXM6ICduYW1lJy4gSWYgbm8gbmFtZSBpcyBnaXZlbiwgb25lIGlzCisgICAgICAgICMgZ2VuZXJhdGVkLCBidXQgdGhhdCBncm91cCBjYW4ndCBiZSBpZGVudGlmaWVkIGFuZCB0dXJuZWQgaW50byBhbgorICAgICAgICAjIGVudW0gdHlwZSBkZWZpbml0aW9uIC0gaXQncyBqdXN0IGEgY29udGFpbmVyIGZvciA8ZW51bT4gdGFncy4KKyAgICAgICAgc2VsZi5ncm91cGRpY3QgPSB7fQorICAgICAgICBmb3IgZ3JvdXAgaW4gc2VsZi5yZWcuZmluZGFsbCgnZW51bXMnKToKKyAgICAgICAgICAgIHNlbGYuYWRkRWxlbWVudEluZm8oZ3JvdXAsIEdyb3VwSW5mbyhncm91cCksICdncm91cCcsIHNlbGYuZ3JvdXBkaWN0KQorCisgICAgICAgICMgQ3JlYXRlIGRpY3Rpb25hcnkgb2YgcmVnaXN0cnkgZW51bXMgZnJvbSA8ZW51bT4gdGFncworICAgICAgICAjCisgICAgICAgICMgPGVudW1zPiB0YWdzIHVzdWFsbHkgZGVmaW5lIGRpZmZlcmVudCBuYW1lc3BhY2VzIGZvciB0aGUgdmFsdWVzCisgICAgICAgICMgICBkZWZpbmVkIGluIHRob3NlIHRhZ3MsIGJ1dCB0aGUgYWN0dWFsIG5hbWVzIGFsbCBzaGFyZSB0aGUKKyAgICAgICAgIyAgIHNhbWUgZGljdGlvbmFyeS4KKyAgICAgICAgIyBSZXF1aXJlZCA8ZW51bT4gYXR0cmlidXRlczogJ25hbWUnLCAndmFsdWUnCisgICAgICAgICMgRm9yIGNvbnRhaW5pbmcgPGVudW1zPiB3aGljaCBoYXZlIHR5cGU9ImVudW0iIG9yIHR5cGU9ImJpdG1hc2siLAorICAgICAgICAjIHRhZyBhbGwgY29udGFpbmVkIDxlbnVtPnMgYXJlIHJlcXVpcmVkLiBUaGlzIGlzIGEgc3RvcGdhcCB1bnRpbAorICAgICAgICAjIGEgYmV0dGVyIHNjaGVtZSBmb3IgdGFnZ2luZyBjb3JlIGFuZCBleHRlbnNpb24gZW51bXMgaXMgY3JlYXRlZC4KKyAgICAgICAgc2VsZi5lbnVtZGljdCA9IHt9CisgICAgICAgIGZvciBlbnVtcyBpbiBzZWxmLnJlZy5maW5kYWxsKCdlbnVtcycpOgorICAgICAgICAgICAgcmVxdWlyZWQgPSAoZW51bXMuZ2V0KCd0eXBlJykgaXMgbm90IE5vbmUpCisgICAgICAgICAgICBmb3IgZW51bSBpbiBlbnVtcy5maW5kYWxsKCdlbnVtJyk6CisgICAgICAgICAgICAgICAgZW51bUluZm8gPSBFbnVtSW5mbyhlbnVtKQorICAgICAgICAgICAgICAgIGVudW1JbmZvLnJlcXVpcmVkID0gcmVxdWlyZWQKKyAgICAgICAgICAgICAgICBzZWxmLmFkZEVsZW1lbnRJbmZvKGVudW0sIGVudW1JbmZvLCAnZW51bScsIHNlbGYuZW51bWRpY3QpCisKKyAgICAgICAgIyBDcmVhdGUgZGljdGlvbmFyeSBvZiByZWdpc3RyeSBjb21tYW5kcyBmcm9tIDxjb21tYW5kPiB0YWdzCisgICAgICAgICMgYW5kIGFkZCAnbmFtZScgYXR0cmlidXRlIHRvIGVhY2ggPGNvbW1hbmQ+IHRhZyAod2hlcmUgbWlzc2luZykKKyAgICAgICAgIyBiYXNlZCBvbiBpdHMgPHByb3RvPjxuYW1lPiBlbGVtZW50LgorICAgICAgICAjCisgICAgICAgICMgVGhlcmUncyB1c3VhbGx5IG9ubHkgb25lIDxjb21tYW5kcz4gYmxvY2s7IG1vcmUgYXJlIE9LLgorICAgICAgICAjIFJlcXVpcmVkIDxjb21tYW5kPiBhdHRyaWJ1dGVzOiAnbmFtZScgb3IgPHByb3RvPjxuYW1lPiB0YWcgY29udGVudHMKKyAgICAgICAgc2VsZi5jbWRkaWN0ID0ge30KKyAgICAgICAgIyBMaXN0IG9mIGNvbW1hbmRzIHdoaWNoIGFsaWFzIG90aGVycy4gQ29udGFpbnMKKyAgICAgICAgIyAgIFsgYWxpYXNOYW1lLCBlbGVtZW50IF0KKyAgICAgICAgIyBmb3IgZWFjaCBhbGlhcworICAgICAgICBjbWRBbGlhcyA9IFtdCisgICAgICAgIGZvciBjbWQgaW4gc2VsZi5yZWcuZmluZGFsbCgnY29tbWFuZHMvY29tbWFuZCcpOgorICAgICAgICAgICAgIyBJZiB0aGUgPGNvbW1hbmQ+IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgJ25hbWUnIGF0dHJpYnV0ZSwgc2V0CisgICAgICAgICAgICAjIGl0IGZyb20gY29udGVudHMgb2YgaXRzIDxwcm90bz48bmFtZT4gdGFnLgorICAgICAgICAgICAgbmFtZSA9IGNtZC5nZXQoJ25hbWUnKQorICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIG5hbWUgPSBjbWQuc2V0KCduYW1lJywgY21kLmZpbmQoJ3Byb3RvL25hbWUnKS50ZXh0KQorICAgICAgICAgICAgY2kgPSBDbWRJbmZvKGNtZCkKKyAgICAgICAgICAgIHNlbGYuYWRkRWxlbWVudEluZm8oY21kLCBjaSwgJ2NvbW1hbmQnLCBzZWxmLmNtZGRpY3QpCisgICAgICAgICAgICBhbGlhcyA9IGNtZC5nZXQoJ2FsaWFzJykKKyAgICAgICAgICAgIGlmIGFsaWFzOgorICAgICAgICAgICAgICAgIGNtZEFsaWFzLmFwcGVuZChbbmFtZSwgYWxpYXMsIGNtZF0pCisKKyAgICAgICAgIyBOb3cgbG9vcCBvdmVyIGFsaWFzZXMsIGluamVjdGluZyBhIGNvcHkgb2YgdGhlIGFsaWFzZWQgY29tbWFuZCdzCisgICAgICAgICMgRWxlbWVudCB3aXRoIHRoZSBhbGlhc2VkIHByb3RvdHlwZSBuYW1lIHJlcGxhY2VkIHdpdGggdGhlIGNvbW1hbmQKKyAgICAgICAgIyBuYW1lIC0gaWYgaXQgZXhpc3RzLgorICAgICAgICBmb3IgKG5hbWUsIGFsaWFzLCBjbWQpIGluIGNtZEFsaWFzOgorICAgICAgICAgICAgaWYgYWxpYXMgaW4gc2VsZi5jbWRkaWN0OgorICAgICAgICAgICAgICAgICMgQCBwZGIuc2V0X3RyYWNlKCkKKyAgICAgICAgICAgICAgICBhbGlhc0luZm8gPSBzZWxmLmNtZGRpY3RbYWxpYXNdCisgICAgICAgICAgICAgICAgY21kRWxlbSA9IGNvcHkuZGVlcGNvcHkoYWxpYXNJbmZvLmVsZW0pCisgICAgICAgICAgICAgICAgY21kRWxlbS5maW5kKCdwcm90by9uYW1lJykudGV4dCA9IG5hbWUKKyAgICAgICAgICAgICAgICBjbWRFbGVtLnNldCgnbmFtZScsIG5hbWUpCisgICAgICAgICAgICAgICAgY21kRWxlbS5zZXQoJ2FsaWFzJywgYWxpYXMpCisgICAgICAgICAgICAgICAgY2kgPSBDbWRJbmZvKGNtZEVsZW0pCisgICAgICAgICAgICAgICAgIyBSZXBsYWNlIHRoZSBkaWN0aW9uYXJ5IGVudHJ5IGZvciB0aGUgQ21kSW5mbyBlbGVtZW50CisgICAgICAgICAgICAgICAgc2VsZi5jbWRkaWN0W25hbWVdID0gY2kKKworICAgICAgICAgICAgICAgICMgQCAgbmV3U3RyaW5nID0gZXRyZWUudG9zdHJpbmcoYmFzZSwgZW5jb2Rpbmc9InVuaWNvZGUiKS5yZXBsYWNlKGFsaWFzVmFsdWUsIGFsaWFzTmFtZSkKKyAgICAgICAgICAgICAgICAjIEBlbGVtLmFwcGVuZChldHJlZS5mcm9tc3RyaW5nKHJlcGxhY2VtZW50KSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCd3YXJuJywgJ05vIG1hdGNoaW5nIDxjb21tYW5kPiBmb3VuZCBmb3IgY29tbWFuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5nZXQoJ25hbWUnKSwgJ2FsaWFzJywgYWxpYXMpCisKKyAgICAgICAgIyBDcmVhdGUgZGljdGlvbmFyaWVzIG9mIEFQSSBhbmQgZXh0ZW5zaW9uIGludGVyZmFjZXMKKyAgICAgICAgIyAgIGZyb20gdG9wbGV2ZWwgPGFwaT4gYW5kIDxleHRlbnNpb24+IHRhZ3MuCisgICAgICAgIHNlbGYuYXBpZGljdCA9IHt9CisgICAgICAgIGZvciBmZWF0dXJlIGluIHNlbGYucmVnLmZpbmRhbGwoJ2ZlYXR1cmUnKToKKyAgICAgICAgICAgIGZlYXR1cmVJbmZvID0gRmVhdHVyZUluZm8oZmVhdHVyZSkKKyAgICAgICAgICAgIHNlbGYuYWRkRWxlbWVudEluZm8oZmVhdHVyZSwgZmVhdHVyZUluZm8sICdmZWF0dXJlJywgc2VsZi5hcGlkaWN0KQorCisgICAgICAgICAgICAjIEFkZCBhZGRpdGlvbmFsIGVudW1zIGRlZmluZWQgb25seSBpbiA8ZmVhdHVyZT4gdGFncworICAgICAgICAgICAgIyB0byB0aGUgY29ycmVzcG9uZGluZyBjb3JlIHR5cGUuCisgICAgICAgICAgICAjIFdoZW4gc2VlbiBoZXJlLCB0aGUgPGVudW0+IGVsZW1lbnQsIHByb2Nlc3NlZCB0byBjb250YWluIHRoZQorICAgICAgICAgICAgIyBudW1lcmljIGVudW0gdmFsdWUsIGlzIGFkZGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIDxlbnVtcz4KKyAgICAgICAgICAgICMgZWxlbWVudCwgYXMgd2VsbCBhcyBhZGRpbmcgdG8gdGhlIGVudW0gZGljdGlvbmFyeS4gSXQgaXMKKyAgICAgICAgICAgICMgKnJlbW92ZWQqIGZyb20gdGhlIDxyZXF1aXJlPiBlbGVtZW50IGl0IGlzIGludHJvZHVjZWQgaW4uCisgICAgICAgICAgICAjIE5vdCBkb2luZyB0aGlzIHdpbGwgY2F1c2Ugc3B1cmlvdXMgZ2VuRW51bSgpCisgICAgICAgICAgICAjIGNhbGxzIHRvIGJlIG1hZGUgaW4gb3V0cHV0IGdlbmVyYXRpb24sIGFuZCBpdCdzIGVhc2llcgorICAgICAgICAgICAgIyB0byBoYW5kbGUgaGVyZSB0aGFuIGluIGdlbkVudW0oKS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgSW4gbHhtbC5ldHJlZSwgYW4gRWxlbWVudCBjYW4gaGF2ZSBvbmx5IG9uZSBwYXJlbnQsIHNvIHRoZQorICAgICAgICAgICAgIyBhcHBlbmQoKSBvcGVyYXRpb24gYWxzbyByZW1vdmVzIHRoZSBlbGVtZW50LiBCdXQgaW4gUHl0aG9uJ3MKKyAgICAgICAgICAgICMgRWxlbWVudFRyZWUgcGFja2FnZSwgYW4gRWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBwYXJlbnRzLiBTbworICAgICAgICAgICAgIyBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgcmVtb3ZlZCBmcm9tIHRoZSA8cmVxdWlyZT4gdGFnLCBsZWFkaW5nCisgICAgICAgICAgICAjIHRvIHRoZSBuZXN0ZWQgbG9vcCB0cmF2ZXJzYWwgb2YgPHJlcXVpcmU+LzxlbnVtPiBlbGVtZW50cworICAgICAgICAgICAgIyBiZWxvdy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhpcyBjb2RlIGFsc28gYWRkcyBhICd2ZXJzaW9uJyBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUKKyAgICAgICAgICAgICMgYXBpIHZlcnNpb24uCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEZvciA8ZW51bT4gdGFncyB3aGljaCBhcmUgYWN0dWFsbHkganVzdCBjb25zdGFudHMsIGlmIHRoZXJlJ3MKKyAgICAgICAgICAgICMgbm8gJ2V4dGVuZHMnIHRhZyBidXQgdGhlcmUgaXMgYSAndmFsdWUnIG9yICdiaXRwb3MnIHRhZywganVzdAorICAgICAgICAgICAgIyBhZGQgYW4gRW51bUluZm8gcmVjb3JkIHRvIHRoZSBkaWN0aW9uYXJ5LiBUaGF0IHdvcmtzIGJlY2F1c2UKKyAgICAgICAgICAgICMgb3V0cHV0IGdlbmVyYXRpb24gb2YgY29uc3RhbnRzIGlzIHB1cmVseSBkZXBlbmRlbmN5LWJhc2VkLCBhbmQKKyAgICAgICAgICAgICMgZG9lc24ndCBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgWE1MIHRhZ3MuCisgICAgICAgICAgICBmb3IgZWxlbSBpbiBmZWF0dXJlLmZpbmRhbGwoJ3JlcXVpcmUnKToKKyAgICAgICAgICAgICAgICBmb3IgZW51bSBpbiBlbGVtLmZpbmRhbGwoJ2VudW0nKToKKyAgICAgICAgICAgICAgICAgICAgYWRkRW51bUluZm8gPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBncm91cE5hbWUgPSBlbnVtLmdldCgnZXh0ZW5kcycpCisgICAgICAgICAgICAgICAgICAgIGlmIGdyb3VwTmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ0ZvdW5kIGV4dGVuc2lvbiBlbnVtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgIGVudW0uZ2V0KCduYW1lJykpCisgICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCB2ZXJzaW9uIG51bWJlciBhdHRyaWJ1dGUgdG8gdGhlIDxlbnVtPiBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtLnNldCgndmVyc2lvbicsIGZlYXR1cmVJbmZvLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAjIExvb2sgdXAgdGhlIEdyb3VwSW5mbyB3aXRoIG1hdGNoaW5nIGdyb3VwTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ3JvdXBOYW1lIGluIHNlbGYuZ3JvdXBkaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ01hdGNoaW5nIGdyb3VwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBncm91cE5hbWUsICdmb3VuZCwgYWRkaW5nIGVsZW1lbnQuLi4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpID0gc2VsZi5ncm91cGRpY3RbZ3JvdXBOYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpLmVsZW0uYXBwZW5kKGVudW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgZWxlbWVudCBmcm9tIHBhcmVudCA8cmVxdWlyZT4gdGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBiZSBhIG5vLW9wIGluIGx4bWwuZXRyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlKGVudW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTXVzdCBiZSBseG1sLmV0cmVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCd3YXJuJywgJ05PIG1hdGNoaW5nIGdyb3VwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBOYW1lLCAnZm9yIGVudW0nLCBlbnVtLmdldCgnbmFtZScpLCAnZm91bmQuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVudW1JbmZvID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBlbGlmIGVudW0uZ2V0KCd2YWx1ZScpIG9yIGVudW0uZ2V0KCdiaXRwb3MnKSBvciBlbnVtLmdldCgnYWxpYXMnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ0FkZGluZyBleHRlbnNpb24gY29uc3RhbnQgImVudW0iJywKKyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgIGVudW0uZ2V0KCduYW1lJykpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbnVtSW5mbyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgaWYgYWRkRW51bUluZm86CisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtSW5mbyA9IEVudW1JbmZvKGVudW0pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZEVsZW1lbnRJbmZvKGVudW0sIGVudW1JbmZvLCAnZW51bScsIHNlbGYuZW51bWRpY3QpCisKKyAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5yZWcuZmluZGFsbCgnZXh0ZW5zaW9ucy9leHRlbnNpb24nKQorICAgICAgICBzZWxmLmV4dGRpY3QgPSB7fQorICAgICAgICBmb3IgZmVhdHVyZSBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBmZWF0dXJlSW5mbyA9IEZlYXR1cmVJbmZvKGZlYXR1cmUpCisgICAgICAgICAgICBzZWxmLmFkZEVsZW1lbnRJbmZvKGZlYXR1cmUsIGZlYXR1cmVJbmZvLCAnZXh0ZW5zaW9uJywgc2VsZi5leHRkaWN0KQorCisgICAgICAgICAgICAjIEFkZCBhZGRpdGlvbmFsIGVudW1zIGRlZmluZWQgb25seSBpbiA8ZXh0ZW5zaW9uPiB0YWdzCisgICAgICAgICAgICAjIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvcmUgdHlwZS4KKyAgICAgICAgICAgICMgQWxnb3JpdGhtIG1hdGNoZXMgdGhhdCBvZiBlbnVtcyBpbiBhICJmZWF0dXJlIiB0YWcgYXMgYWJvdmUuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFRoaXMgY29kZSBhbHNvIGFkZHMgYSAnZXh0bnVtYmVyJyBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUKKyAgICAgICAgICAgICMgZXh0ZW5zaW9uIG51bWJlciwgdXNlZCBmb3IgZW51bWVyYW50IHZhbHVlIGNhbGN1bGF0aW9uLgorICAgICAgICAgICAgZm9yIGVsZW0gaW4gZmVhdHVyZS5maW5kYWxsKCdyZXF1aXJlJyk6CisgICAgICAgICAgICAgICAgZm9yIGVudW0gaW4gZWxlbS5maW5kYWxsKCdlbnVtJyk6CisgICAgICAgICAgICAgICAgICAgIGFkZEVudW1JbmZvID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBOYW1lID0gZW51bS5nZXQoJ2V4dGVuZHMnKQorICAgICAgICAgICAgICAgICAgICBpZiBncm91cE5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdGb3VuZCBleHRlbnNpb24gZW51bScsCisgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBlbnVtLmdldCgnbmFtZScpKQorCisgICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCA8ZXh0ZW5zaW9uPiBibG9jaydzIGV4dGVuc2lvbiBudW1iZXIgYXR0cmlidXRlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSA8ZW51bT4gZWxlbWVudCB1bmxlc3Mgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHN1Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgd2hlbiByZWRlZmluaW5nIGFuIGVudW0gaW4gYW5vdGhlciBleHRlbnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBleHRudW1iZXIgPSBlbnVtLmdldCgnZXh0bnVtYmVyJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleHRudW1iZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bS5zZXQoJ2V4dG51bWJlcicsIGZlYXR1cmVJbmZvLm51bWJlcikKKworICAgICAgICAgICAgICAgICAgICAgICAgZW51bS5zZXQoJ2V4dG5hbWUnLCBmZWF0dXJlSW5mby5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZW51bS5zZXQoJ3N1cHBvcnRlZCcsIGZlYXR1cmVJbmZvLnN1cHBvcnRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTG9vayB1cCB0aGUgR3JvdXBJbmZvIHdpdGggbWF0Y2hpbmcgZ3JvdXBOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBncm91cE5hbWUgaW4gc2VsZi5ncm91cGRpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnTWF0Y2hpbmcgZ3JvdXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgIGdyb3VwTmFtZSwgJ2ZvdW5kLCBhZGRpbmcgZWxlbWVudC4uLicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2kgPSBzZWxmLmdyb3VwZGljdFtncm91cE5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2kuZWxlbS5hcHBlbmQoZW51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZSBlbGVtZW50IGZyb20gcGFyZW50IDxyZXF1aXJlPiB0YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGJlIGEgbm8tb3AgaW4gbHhtbC5ldHJlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5yZW1vdmUoZW51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNdXN0IGJlIGx4bWwuZXRyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ3dhcm4nLCAnTk8gbWF0Y2hpbmcgZ3JvdXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cE5hbWUsICdmb3IgZW51bScsIGVudW0uZ2V0KCduYW1lJyksICdmb3VuZC4nKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkRW51bUluZm8gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgZW51bS5nZXQoJ3ZhbHVlJykgb3IgZW51bS5nZXQoJ2JpdHBvcycpIG9yIGVudW0uZ2V0KCdhbGlhcycpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnQWRkaW5nIGV4dGVuc2lvbiBjb25zdGFudCAiZW51bSInLAorICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgZW51bS5nZXQoJ25hbWUnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVudW1JbmZvID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBhZGRFbnVtSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW1JbmZvID0gRW51bUluZm8oZW51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRWxlbWVudEluZm8oZW51bSwgZW51bUluZm8sICdlbnVtJywgc2VsZi5lbnVtZGljdCkKKworICAgICAgICAjIENvbnN0cnVjdCBhICJ2YWxpZGV4dGVuc2lvbnN0cnVjdHMiIGxpc3QgZm9yIHBhcmVudCBzdHJ1Y3R1cmVzCisgICAgICAgICMgYmFzZWQgb24gInN0cnVjdGV4dGVuZHMiIHRhZ3MgaW4gY2hpbGQgc3RydWN0dXJlcworICAgICAgICBkaXNhYmxlZF90eXBlcyA9IFtdCisgICAgICAgIGZvciBkaXNhYmxlZF9leHQgaW4gc2VsZi5yZWcuZmluZGFsbCgnZXh0ZW5zaW9ucy9leHRlbnNpb25bQHN1cHBvcnRlZD0iZGlzYWJsZWQiXScpOgorICAgICAgICAgICAgZm9yIHR5cGVfZWxlbSBpbiBkaXNhYmxlZF9leHQuZmluZGFsbCgiKi90eXBlIik6CisgICAgICAgICAgICAgICAgZGlzYWJsZWRfdHlwZXMuYXBwZW5kKHR5cGVfZWxlbS5nZXQoJ25hbWUnKSkKKyAgICAgICAgZm9yIHR5cGVfZWxlbSBpbiBzZWxmLnJlZy5maW5kYWxsKCd0eXBlcy90eXBlJyk6CisgICAgICAgICAgICBpZiB0eXBlX2VsZW0uZ2V0KCduYW1lJykgbm90IGluIGRpc2FibGVkX3R5cGVzOgorICAgICAgICAgICAgICAgIHBhcmVudFN0cnVjdHMgPSB0eXBlX2VsZW0uZ2V0KCdzdHJ1Y3RleHRlbmRzJykKKyAgICAgICAgICAgICAgICBpZiBwYXJlbnRTdHJ1Y3RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBmb3IgcGFyZW50IGluIHBhcmVudFN0cnVjdHMuc3BsaXQoJywnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgdHlwZS5nZXQoJ25hbWUnKSwgJ2V4dGVuZHMnLCBwYXJlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbGlkZXh0ZW5zaW9uc3RydWN0c1twYXJlbnRdLmFwcGVuZCh0eXBlX2VsZW0uZ2V0KCduYW1lJykpCisgICAgICAgICMgU29ydCB0aGUgbGlzdHMgc28gdGhleSBkb24ndCBkZXBlbmQgb24gdGhlIFhNTCBvcmRlcgorICAgICAgICBmb3IgcGFyZW50IGluIHNlbGYudmFsaWRleHRlbnNpb25zdHJ1Y3RzOgorICAgICAgICAgICAgc2VsZi52YWxpZGV4dGVuc2lvbnN0cnVjdHNbcGFyZW50XS5zb3J0KCkKKworICAgIGRlZiBkdW1wUmVnKHNlbGYsIG1heGxlbj0xMjAsIGZpbGVoYW5kbGU9c3lzLnN0ZG91dCk6CisgICAgICAgICIiIkR1bXAgYWxsIHRoZSBkaWN0aW9uYXJpZXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgUmVnaXN0cnkgb2JqZWN0LgorCisgICAgICAgIERpYWdub3N0aWMgdG8gZHVtcCB0aGUgZGljdGlvbmFyaWVzIHRvIHNwZWNpZmllZCBmaWxlIGhhbmRsZSAoZGVmYXVsdCBzdGRvdXQpLgorICAgICAgICBUcnVuY2F0ZXMgdHlwZSAvIGVudW0gLyBjb21tYW5kIGVsZW1lbnRzIHRvIG1heGxlbiBjaGFyYWN0ZXJzIChkZWZhdWx0IDEyMCkiIiIKKyAgICAgICAgd3JpdGUoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicsIGZpbGU9ZmlsZWhhbmRsZSkKKyAgICAgICAgd3JpdGUoJyAgICAqKiBEdW1waW5nIFJlZ2lzdHJ5IGNvbnRlbnRzICoqJywgICAgIGZpbGU9ZmlsZWhhbmRsZSkKKyAgICAgICAgd3JpdGUoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicsIGZpbGU9ZmlsZWhhbmRsZSkKKyAgICAgICAgd3JpdGUoJy8vIFR5cGVzJywgZmlsZT1maWxlaGFuZGxlKQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLnR5cGVkaWN0OgorICAgICAgICAgICAgdG9iaiA9IHNlbGYudHlwZWRpY3RbbmFtZV0KKyAgICAgICAgICAgIHdyaXRlKCcgICAgVHlwZScsIG5hbWUsICctPicsIGV0cmVlLnRvc3RyaW5nKHRvYmouZWxlbSlbMDptYXhsZW5dLCBmaWxlPWZpbGVoYW5kbGUpCisgICAgICAgIHdyaXRlKCcvLyBHcm91cHMnLCBmaWxlPWZpbGVoYW5kbGUpCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuZ3JvdXBkaWN0OgorICAgICAgICAgICAgZ29iaiA9IHNlbGYuZ3JvdXBkaWN0W25hbWVdCisgICAgICAgICAgICB3cml0ZSgnICAgIEdyb3VwJywgbmFtZSwgJy0+JywgZXRyZWUudG9zdHJpbmcoZ29iai5lbGVtKVswOm1heGxlbl0sIGZpbGU9ZmlsZWhhbmRsZSkKKyAgICAgICAgd3JpdGUoJy8vIEVudW1zJywgZmlsZT1maWxlaGFuZGxlKQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmVudW1kaWN0OgorICAgICAgICAgICAgZW9iaiA9IHNlbGYuZW51bWRpY3RbbmFtZV0KKyAgICAgICAgICAgIHdyaXRlKCcgICAgRW51bScsIG5hbWUsICctPicsIGV0cmVlLnRvc3RyaW5nKGVvYmouZWxlbSlbMDptYXhsZW5dLCBmaWxlPWZpbGVoYW5kbGUpCisgICAgICAgIHdyaXRlKCcvLyBDb21tYW5kcycsIGZpbGU9ZmlsZWhhbmRsZSkKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5jbWRkaWN0OgorICAgICAgICAgICAgY29iaiA9IHNlbGYuY21kZGljdFtuYW1lXQorICAgICAgICAgICAgd3JpdGUoJyAgICBDb21tYW5kJywgbmFtZSwgJy0+JywgZXRyZWUudG9zdHJpbmcoY29iai5lbGVtKVswOm1heGxlbl0sIGZpbGU9ZmlsZWhhbmRsZSkKKyAgICAgICAgd3JpdGUoJy8vIEFQSXMnLCBmaWxlPWZpbGVoYW5kbGUpCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5hcGlkaWN0OgorICAgICAgICAgICAgd3JpdGUoJyAgICBBUEkgVmVyc2lvbiAnLCBrZXksICctPicsCisgICAgICAgICAgICAgICAgICBldHJlZS50b3N0cmluZyhzZWxmLmFwaWRpY3Rba2V5XS5lbGVtKVswOm1heGxlbl0sIGZpbGU9ZmlsZWhhbmRsZSkKKyAgICAgICAgd3JpdGUoJy8vIEV4dGVuc2lvbnMnLCBmaWxlPWZpbGVoYW5kbGUpCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5leHRkaWN0OgorICAgICAgICAgICAgd3JpdGUoJyAgICBFeHRlbnNpb24nLCBrZXksICctPicsCisgICAgICAgICAgICAgICAgICBldHJlZS50b3N0cmluZyhzZWxmLmV4dGRpY3Rba2V5XS5lbGVtKVswOm1heGxlbl0sIGZpbGU9ZmlsZWhhbmRsZSkKKworICAgIGRlZiBtYXJrVHlwZVJlcXVpcmVkKHNlbGYsIHR5cGVuYW1lLCByZXF1aXJlZCk6CisgICAgICAgICIiIlJlcXVpcmUgKGFsb25nIHdpdGggaXRzIGRlcGVuZGVuY2llcykgb3IgcmVtb3ZlIChidXQgbm90IGl0cyBkZXBlbmRlbmNpZXMpIGEgdHlwZS4KKworICAgICAgICAtIHR5cGVuYW1lIC0gbmFtZSBvZiB0eXBlCisgICAgICAgIC0gcmVxdWlyZWQgLSBib29sZWFuICh0byB0YWcgZmVhdHVyZXMgYXMgcmVxdWlyZWQgb3Igbm90KQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ3RhZ2dpbmcgdHlwZTonLCB0eXBlbmFtZSwgJy0+IHJlcXVpcmVkID0nLCByZXF1aXJlZCkKKyAgICAgICAgIyBHZXQgVHlwZUluZm8gb2JqZWN0IGZvciA8dHlwZT4gdGFnIGNvcnJlc3BvbmRpbmcgdG8gdHlwZW5hbWUKKyAgICAgICAgdHlwZWluZm8gPSBzZWxmLmxvb2t1cEVsZW1lbnRJbmZvKHR5cGVuYW1lLCBzZWxmLnR5cGVkaWN0KQorICAgICAgICBpZiB0eXBlaW5mbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHJlcXVpcmVkOgorICAgICAgICAgICAgICAgICMgVGFnIHR5cGUgZGVwZW5kZW5jaWVzIGluICdhbGlhcycgYW5kICdyZXF1aXJlZCcgYXR0cmlidXRlcyBhcworICAgICAgICAgICAgICAgICMgcmVxdWlyZWQuIFRoaXMgRE9FUyBOT1QgdW4tdGFnIGRlcGVuZGVuY2llcyBpbiBhIDxyZW1vdmU+CisgICAgICAgICAgICAgICAgIyB0YWcuIFNlZSBjb21tZW50cyBpbiBtYXJrUmVxdWlyZWQoKSBiZWxvdyBmb3IgdGhlIHJlYXNvbi4KKyAgICAgICAgICAgICAgICBmb3IgYXR0cmliX25hbWUgaW4gWydyZXF1aXJlcycsICdhbGlhcyddOgorICAgICAgICAgICAgICAgICAgICBkZXBuYW1lID0gdHlwZWluZm8uZWxlbS5nZXQoYXR0cmliX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIGRlcG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnR2VuZXJhdGluZyBkZXBlbmRlbnQgdHlwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbmFtZSwgJ2ZvcicsIGF0dHJpYl9uYW1lLCAndHlwZScsIHR5cGVuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCByZWN1cnNlIG9uIHNlbGYtcmVmZXJlbnRpYWwgc3RydWN0dXJlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHR5cGVuYW1lICE9IGRlcG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJrVHlwZVJlcXVpcmVkKGRlcG5hbWUsIHJlcXVpcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAndHlwZScsIHR5cGVuYW1lLCAnaXMgc2VsZi1yZWZlcmVudGlhbCcpCisgICAgICAgICAgICAgICAgIyBUYWcgdHlwZXMgdXNlZCBpbiBkZWZpbmluZyB0aGlzIHR5cGUgKGUuZy4gaW4gbmVzdGVkCisgICAgICAgICAgICAgICAgIyA8dHlwZT4gdGFncykKKyAgICAgICAgICAgICAgICAjIExvb2sgZm9yIDx0eXBlPiBpbiBlbnRpcmUgPGNvbW1hbmQ+IHRyZWUsCisgICAgICAgICAgICAgICAgIyBub3QganVzdCBpbW1lZGlhdGUgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICBmb3Igc3VidHlwZSBpbiB0eXBlaW5mby5lbGVtLmZpbmRhbGwoJy4vL3R5cGUnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ21hcmtSZXF1aXJlZDogdHlwZSByZXF1aXJlcyBkZXBlbmRlbnQgPHR5cGU+Jywgc3VidHlwZS50ZXh0KQorICAgICAgICAgICAgICAgICAgICBpZiB0eXBlbmFtZSAhPSBzdWJ0eXBlLnRleHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcmtUeXBlUmVxdWlyZWQoc3VidHlwZS50ZXh0LCByZXF1aXJlZCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICd0eXBlJywgdHlwZW5hbWUsICdpcyBzZWxmLXJlZmVyZW50aWFsJykKKyAgICAgICAgICAgICAgICAjIFRhZyBlbnVtcyB1c2VkIGluIGRlZmluaW5nIHRoaXMgdHlwZSwgZm9yIGV4YW1wbGUgaW4KKyAgICAgICAgICAgICAgICAjICAgPG1lbWJlcj48bmFtZT5tZW1iZXI8L25hbWU+WzxlbnVtPk1FTUJFUl9TSVpFPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgICAgICAgICBmb3Igc3ViZW51bSBpbiB0eXBlaW5mby5lbGVtLmZpbmRhbGwoJy4vL2VudW0nKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ21hcmtSZXF1aXJlZDogdHlwZSByZXF1aXJlcyBkZXBlbmRlbnQgPGVudW0+Jywgc3ViZW51bS50ZXh0KQorICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcmtFbnVtUmVxdWlyZWQoc3ViZW51bS50ZXh0LCByZXF1aXJlZCkKKyAgICAgICAgICAgICAgICAjIFRhZyB0eXBlIGRlcGVuZGVuY3kgaW4gJ2JpdHZhbHVlcycgYXR0cmlidXRlcyBhcworICAgICAgICAgICAgICAgICMgcmVxdWlyZWQuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBiaXQgdmFsdWVzIGZvciBhIGZsYWcKKyAgICAgICAgICAgICAgICAjIGFyZSBlbWl0dGVkCisgICAgICAgICAgICAgICAgZGVwVHlwZSA9IHR5cGVpbmZvLmVsZW0uZ2V0KCdiaXR2YWx1ZXMnKQorICAgICAgICAgICAgICAgIGlmIGRlcFR5cGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdHZW5lcmF0aW5nIGJpdGZsYWcgdHlwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBUeXBlLCAnZm9yIHR5cGUnLCB0eXBlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJrVHlwZVJlcXVpcmVkKGRlcFR5cGUsIHJlcXVpcmVkKQorICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNlbGYubG9va3VwRWxlbWVudEluZm8oZGVwVHlwZSwgc2VsZi5ncm91cGRpY3QpCisgICAgICAgICAgICAgICAgICAgIGlmIGdyb3VwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuZmxhZ1R5cGUgPSB0eXBlaW5mbworCisgICAgICAgICAgICB0eXBlaW5mby5yZXF1aXJlZCA9IHJlcXVpcmVkCisgICAgICAgIGVsaWYgJy5oJyBub3QgaW4gdHlwZW5hbWU6CisgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ3dhcm4nLCAndHlwZTonLCB0eXBlbmFtZSwgJ0lTIE5PVCBERUZJTkVEJykKKworICAgIGRlZiBtYXJrRW51bVJlcXVpcmVkKHNlbGYsIGVudW1uYW1lLCByZXF1aXJlZCk6CisgICAgICAgICIiIk1hcmsgYW4gZW51bSBhcyByZXF1aXJlZCBvciBub3QuCisKKyAgICAgICAgLSBlbnVtbmFtZSAtIG5hbWUgb2YgZW51bQorICAgICAgICAtIHJlcXVpcmVkIC0gYm9vbGVhbiAodG8gdGFnIGZlYXR1cmVzIGFzIHJlcXVpcmVkIG9yIG5vdCkiIiIKKyAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ3RhZ2dpbmcgZW51bTonLCBlbnVtbmFtZSwgJy0+IHJlcXVpcmVkID0nLCByZXF1aXJlZCkKKyAgICAgICAgZW51bSA9IHNlbGYubG9va3VwRWxlbWVudEluZm8oZW51bW5hbWUsIHNlbGYuZW51bWRpY3QpCisgICAgICAgIGlmIGVudW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlbnVtLnJlcXVpcmVkID0gcmVxdWlyZWQKKyAgICAgICAgICAgICMgVGFnIGVudW0gZGVwZW5kZW5jaWVzIGluICdhbGlhcycgYXR0cmlidXRlIGFzIHJlcXVpcmVkCisgICAgICAgICAgICBkZXBuYW1lID0gZW51bS5lbGVtLmdldCgnYWxpYXMnKQorICAgICAgICAgICAgaWYgZGVwbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnR2VuZXJhdGluZyBkZXBlbmRlbnQgZW51bScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcG5hbWUsICdmb3IgYWxpYXMnLCBlbnVtbmFtZSwgJ3JlcXVpcmVkID0nLCBlbnVtLnJlcXVpcmVkKQorICAgICAgICAgICAgICAgIHNlbGYubWFya0VudW1SZXF1aXJlZChkZXBuYW1lLCByZXF1aXJlZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnd2FybicsICdlbnVtOicsIGVudW1uYW1lLCAnSVMgTk9UIERFRklORUQnKQorCisgICAgZGVmIG1hcmtDbWRSZXF1aXJlZChzZWxmLCBjbWRuYW1lLCByZXF1aXJlZCk6CisgICAgICAgICIiIk1hcmsgYSBjb21tYW5kIGFzIHJlcXVpcmVkIG9yIG5vdC4KKworICAgICAgICAtIGNtZG5hbWUgLSBuYW1lIG9mIGNvbW1hbmQKKyAgICAgICAgLSByZXF1aXJlZCAtIGJvb2xlYW4gKHRvIHRhZyBmZWF0dXJlcyBhcyByZXF1aXJlZCBvciBub3QpIiIiCisgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICd0YWdnaW5nIGNvbW1hbmQ6JywgY21kbmFtZSwgJy0+IHJlcXVpcmVkID0nLCByZXF1aXJlZCkKKyAgICAgICAgY21kID0gc2VsZi5sb29rdXBFbGVtZW50SW5mbyhjbWRuYW1lLCBzZWxmLmNtZGRpY3QpCisgICAgICAgIGlmIGNtZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNtZC5yZXF1aXJlZCA9IHJlcXVpcmVkCisgICAgICAgICAgICAjIFRhZyBjb21tYW5kIGRlcGVuZGVuY2llcyBpbiAnYWxpYXMnIGF0dHJpYnV0ZSBhcyByZXF1aXJlZAorICAgICAgICAgICAgZGVwbmFtZSA9IGNtZC5lbGVtLmdldCgnYWxpYXMnKQorICAgICAgICAgICAgaWYgZGVwbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnR2VuZXJhdGluZyBkZXBlbmRlbnQgY29tbWFuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcG5hbWUsICdmb3IgYWxpYXMnLCBjbWRuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYubWFya0NtZFJlcXVpcmVkKGRlcG5hbWUsIHJlcXVpcmVkKQorICAgICAgICAgICAgIyBUYWcgYWxsIHBhcmFtZXRlciB0eXBlcyBvZiB0aGlzIGNvbW1hbmQgYXMgcmVxdWlyZWQuCisgICAgICAgICAgICAjIFRoaXMgRE9FUyBOT1QgcmVtb3ZlIHR5cGVzIG9mIGNvbW1hbmRzIGluIGEgPHJlbW92ZT4KKyAgICAgICAgICAgICMgdGFnLCBiZWNhdXNlIG1hbnkgb3RoZXIgY29tbWFuZHMgbWF5IHVzZSB0aGUgc2FtZSB0eXBlLgorICAgICAgICAgICAgIyBXZSBjb3VsZCBiZSBtb3JlIGNsZXZlciBhbmQgcmVmZXJlbmNlIGNvdW50IHR5cGVzLAorICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIHVzaW5nIGEgYm9vbGVhbi4KKyAgICAgICAgICAgIGlmIHJlcXVpcmVkOgorICAgICAgICAgICAgICAgICMgTG9vayBmb3IgPHR5cGU+IGluIGVudGlyZSA8Y29tbWFuZD4gdHJlZSwKKyAgICAgICAgICAgICAgICAjIG5vdCBqdXN0IGltbWVkaWF0ZSBjaGlsZHJlbgorICAgICAgICAgICAgICAgIGZvciB0eXBlX2VsZW0gaW4gY21kLmVsZW0uZmluZGFsbCgnLi8vdHlwZScpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnbWFya1JlcXVpcmVkOiBjb21tYW5kIGltcGxpY2l0bHkgcmVxdWlyZXMgZGVwZW5kZW50IHR5cGUnLCB0eXBlX2VsZW0udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJrVHlwZVJlcXVpcmVkKHR5cGVfZWxlbS50ZXh0LCByZXF1aXJlZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnd2FybicsICdjb21tYW5kOicsIGNtZG5hbWUsICdJUyBOT1QgREVGSU5FRCcpCisKKyAgICBkZWYgbWFya1JlcXVpcmVkKHNlbGYsIGZlYXR1cmVuYW1lLCBmZWF0dXJlLCByZXF1aXJlZCk6CisgICAgICAgICIiIlJlcXVpcmUgb3IgcmVtb3ZlIGZlYXR1cmVzIHNwZWNpZmllZCBpbiB0aGUgRWxlbWVudC4KKworICAgICAgICAtIGZlYXR1cmVuYW1lIC0gbmFtZSBvZiB0aGUgZmVhdHVyZQorICAgICAgICAtIGZlYXR1cmUgLSBFbGVtZW50IGZvciBgPHJlcXVpcmU+YCBvciBgPHJlbW92ZT5gIHRhZworICAgICAgICAtIHJlcXVpcmVkIC0gYm9vbGVhbiAodG8gdGFnIGZlYXR1cmVzIGFzIHJlcXVpcmVkIG9yIG5vdCkiIiIKKyAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ21hcmtSZXF1aXJlZCAoZmVhdHVyZSA9IDx0b28gbG9uZyB0byBwcmludD4sIHJlcXVpcmVkID0nLCByZXF1aXJlZCwgJyknKQorCisgICAgICAgICMgTG9vcCBvdmVyIHR5cGVzLCBlbnVtcywgYW5kIGNvbW1hbmRzIGluIHRoZSB0YWcKKyAgICAgICAgIyBAQCBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byByZXNwZWN0ICdhcGknIGFuZCAncHJvZmlsZScgYXR0cmlidXRlcworICAgICAgICAjICBpbiBpbmRpdmlkdWFsIGZlYXR1cmVzLCBidXQgdGhhdCdzIG5vdCBkb25lIHlldC4KKyAgICAgICAgZm9yIHR5cGVFbGVtIGluIGZlYXR1cmUuZmluZGFsbCgndHlwZScpOgorICAgICAgICAgICAgc2VsZi5tYXJrVHlwZVJlcXVpcmVkKHR5cGVFbGVtLmdldCgnbmFtZScpLCByZXF1aXJlZCkKKyAgICAgICAgZm9yIGVudW1FbGVtIGluIGZlYXR1cmUuZmluZGFsbCgnZW51bScpOgorICAgICAgICAgICAgc2VsZi5tYXJrRW51bVJlcXVpcmVkKGVudW1FbGVtLmdldCgnbmFtZScpLCByZXF1aXJlZCkKKyAgICAgICAgZm9yIGNtZEVsZW0gaW4gZmVhdHVyZS5maW5kYWxsKCdjb21tYW5kJyk6CisgICAgICAgICAgICBzZWxmLm1hcmtDbWRSZXF1aXJlZChjbWRFbGVtLmdldCgnbmFtZScpLCByZXF1aXJlZCkKKworICAgICAgICAjIEV4dGVuc2lvbnMgbWF5IG5lZWQgdG8gZXh0ZW5kIGV4aXN0aW5nIGNvbW1hbmRzIG9yIG90aGVyIGl0ZW1zIGluIHRoZSBmdXR1cmUuCisgICAgICAgICMgU28sIGxvb2sgZm9yIGV4dGVuZCB0YWdzLgorICAgICAgICBmb3IgZXh0ZW5kRWxlbSBpbiBmZWF0dXJlLmZpbmRhbGwoJ2V4dGVuZCcpOgorICAgICAgICAgICAgZXh0ZW5kVHlwZSA9IGV4dGVuZEVsZW0uZ2V0KCd0eXBlJykKKyAgICAgICAgICAgIGlmIGV4dGVuZFR5cGUgPT0gJ2NvbW1hbmQnOgorICAgICAgICAgICAgICAgIGNvbW1hbmROYW1lID0gZXh0ZW5kRWxlbS5nZXQoJ25hbWUnKQorICAgICAgICAgICAgICAgIHN1Y2Nlc3NFeHRlbmRzID0gZXh0ZW5kRWxlbS5nZXQoJ3N1Y2Nlc3Njb2RlcycpCisgICAgICAgICAgICAgICAgaWYgc3VjY2Vzc0V4dGVuZHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZvciBzdWNjZXNzIGluIHN1Y2Nlc3NFeHRlbmRzLnNwbGl0KCcsJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbW1hbmRleHRlbnNpb25zdWNjZXNzZXMuYXBwZW5kKHNlbGYuY29tbWFuZGV4dGVuc2lvbnR1cGxlKGNvbW1hbmQ9Y29tbWFuZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXN1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbj1mZWF0dXJlbmFtZSkpCisgICAgICAgICAgICAgICAgZXJyb3JFeHRlbmRzID0gZXh0ZW5kRWxlbS5nZXQoJ2Vycm9yY29kZXMnKQorICAgICAgICAgICAgICAgIGlmIGVycm9yRXh0ZW5kcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVycm9yIGluIGVycm9yRXh0ZW5kcy5zcGxpdCgnLCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kZXh0ZW5zaW9uZXJyb3JzLmFwcGVuZChzZWxmLmNvbW1hbmRleHRlbnNpb250dXBsZShjb21tYW5kPWNvbW1hbmROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uPWZlYXR1cmVuYW1lKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCd3YXJuJywgJ2V4dGVuZCB0eXBlOicsIGV4dGVuZFR5cGUsICdJUyBOT1QgU1VQUE9SVEVEJykKKworICAgIGRlZiByZXF1aXJlQW5kUmVtb3ZlRmVhdHVyZXMoc2VsZiwgaW50ZXJmYWNlLCBmZWF0dXJlbmFtZSwgYXBpLCBwcm9maWxlKToKKyAgICAgICAgIiIiUHJvY2VzcyBgPHJlcXVpcmU+YCBhbmQgYDxyZW1vdmU+YCB0YWdzIGZvciBhIGA8dmVyc2lvbj5gIG9yIGA8ZXh0ZW5zaW9uPmAuCisKKyAgICAgICAgLSBpbnRlcmZhY2UgLSBFbGVtZW50IGZvciBgPHZlcnNpb24+YCBvciBgPGV4dGVuc2lvbj5gLCBjb250YWluaW5nCisgICAgICAgICAgYDxyZXF1aXJlPmAgYW5kIGA8cmVtb3ZlPmAgdGFncworICAgICAgICAtIGZlYXR1cmVuYW1lIC0gbmFtZSBvZiB0aGUgZmVhdHVyZQorICAgICAgICAtIGFwaSAtIHN0cmluZyBzcGVjaWZ5aW5nIEFQSSBuYW1lIGJlaW5nIGdlbmVyYXRlZAorICAgICAgICAtIHByb2ZpbGUgLSBzdHJpbmcgc3BlY2lmeWluZyBBUEkgcHJvZmlsZSBiZWluZyBnZW5lcmF0ZWQiIiIKKyAgICAgICAgIyA8cmVxdWlyZT4gbWFya3MgdGhpbmdzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoaXMgdmVyc2lvbi9wcm9maWxlCisgICAgICAgIGZvciBmZWF0dXJlIGluIGludGVyZmFjZS5maW5kYWxsKCdyZXF1aXJlJyk6CisgICAgICAgICAgICBpZiBtYXRjaEFQSVByb2ZpbGUoYXBpLCBwcm9maWxlLCBmZWF0dXJlKToKKyAgICAgICAgICAgICAgICBzZWxmLm1hcmtSZXF1aXJlZChmZWF0dXJlbmFtZSwgZmVhdHVyZSwgVHJ1ZSkKKyAgICAgICAgIyA8cmVtb3ZlPiBtYXJrcyB0aGluZ3MgdGhhdCBhcmUgcmVtb3ZlZCBieSB0aGlzIHZlcnNpb24vcHJvZmlsZQorICAgICAgICBmb3IgZmVhdHVyZSBpbiBpbnRlcmZhY2UuZmluZGFsbCgncmVtb3ZlJyk6CisgICAgICAgICAgICBpZiBtYXRjaEFQSVByb2ZpbGUoYXBpLCBwcm9maWxlLCBmZWF0dXJlKToKKyAgICAgICAgICAgICAgICBzZWxmLm1hcmtSZXF1aXJlZChmZWF0dXJlbmFtZSwgZmVhdHVyZSwgRmFsc2UpCisKKyAgICBkZWYgYXNzaWduQWRkaXRpb25hbFZhbGlkaXR5KHNlbGYsIGludGVyZmFjZSwgYXBpLCBwcm9maWxlKToKKyAgICAgICAgIyBMb29wIG92ZXIgYWxsIHVzYWdlIGluc2lkZSBhbGwgPHJlcXVpcmU+IHRhZ3MuCisgICAgICAgIGZvciBmZWF0dXJlIGluIGludGVyZmFjZS5maW5kYWxsKCdyZXF1aXJlJyk6CisgICAgICAgICAgICBpZiBtYXRjaEFQSVByb2ZpbGUoYXBpLCBwcm9maWxlLCBmZWF0dXJlKToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiBmZWF0dXJlLmZpbmRhbGwoJ3VzYWdlJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIHYuZ2V0KCdjb21tYW5kJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNtZGRpY3Rbdi5nZXQoJ2NvbW1hbmQnKV0uYWRkaXRpb25hbFZhbGlkaXR5LmFwcGVuZChjb3B5LmRlZXBjb3B5KHYpKQorICAgICAgICAgICAgICAgICAgICBpZiB2LmdldCgnc3RydWN0Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGVkaWN0W3YuZ2V0KCdzdHJ1Y3QnKV0uYWRkaXRpb25hbFZhbGlkaXR5LmFwcGVuZChjb3B5LmRlZXBjb3B5KHYpKQorCisgICAgICAgICMgTG9vcCBvdmVyIGFsbCB1c2FnZSBpbnNpZGUgYWxsIDxyZW1vdmU+IHRhZ3MuCisgICAgICAgIGZvciBmZWF0dXJlIGluIGludGVyZmFjZS5maW5kYWxsKCdyZW1vdmUnKToKKyAgICAgICAgICAgIGlmIG1hdGNoQVBJUHJvZmlsZShhcGksIHByb2ZpbGUsIGZlYXR1cmUpOgorICAgICAgICAgICAgICAgIGZvciB2IGluIGZlYXR1cmUuZmluZGFsbCgndXNhZ2UnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgdi5nZXQoJ2NvbW1hbmQnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY21kZGljdFt2LmdldCgnY29tbWFuZCcpXS5yZW1vdmVkVmFsaWRpdHkuYXBwZW5kKGNvcHkuZGVlcGNvcHkodikpCisgICAgICAgICAgICAgICAgICAgIGlmIHYuZ2V0KCdzdHJ1Y3QnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZWRpY3Rbdi5nZXQoJ3N0cnVjdCcpXS5yZW1vdmVkVmFsaWRpdHkuYXBwZW5kKGNvcHkuZGVlcGNvcHkodikpCisKKyAgICBkZWYgZ2VuZXJhdGVGZWF0dXJlKHNlbGYsIGZuYW1lLCBmdHlwZSwgZGljdGlvbmFyeSk6CisgICAgICAgICIiIkdlbmVyYXRlIGEgc2luZ2xlIHR5cGUgLyBlbnVtIGdyb3VwIC8gZW51bSAvIGNvbW1hbmQsCisgICAgICAgIGFuZCBhbGwgaXRzIGRlcGVuZGVuY2llcyBhcyBuZWVkZWQuCisKKyAgICAgICAgLSBmbmFtZSAtIG5hbWUgb2YgZmVhdHVyZSAoYDx0eXBlPmAvYDxlbnVtPmAvYDxjb21tYW5kPmApCisgICAgICAgIC0gZnR5cGUgLSB0eXBlIG9mIGZlYXR1cmUsICd0eXBlJyB8ICdlbnVtJyB8ICdjb21tYW5kJworICAgICAgICAtIGRpY3Rpb25hcnkgLSBvZiAqSW5mbyBvYmplY3RzIC0gc2VsZi57dHlwZXxlbnVtfGNtZH1kaWN0IiIiCisgICAgICAgICMgQCAjIEJyZWFrIHRvIGRlYnVnZ2VyIG9uIG1hdGNoaW5nIG5hbWUgcGF0dGVybgorICAgICAgICAjIEAgaWYgc2VsZi5icmVha1BhdCBhbmQgcmUubWF0Y2goc2VsZi5icmVha1BhdCwgZm5hbWUpOgorICAgICAgICAjIEAgICAgcGRiLnNldF90cmFjZSgpCisKKyAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ2dlbmVyYXRlRmVhdHVyZTogZ2VuZXJhdGluZycsIGZ0eXBlLCBmbmFtZSkKKyAgICAgICAgZiA9IHNlbGYubG9va3VwRWxlbWVudEluZm8oZm5hbWUsIGRpY3Rpb25hcnkpCisgICAgICAgIGlmIGYgaXMgTm9uZToKKyAgICAgICAgICAgICMgTm8gc3VjaCBmZWF0dXJlLiBUaGlzIGlzIGFuIGVycm9yLCBidXQgcmVwb3J0ZWQgZWFybGllcgorICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ05vIGVudHJ5IGZvdW5kIGZvciBmZWF0dXJlJywgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybmluZyEnKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBJZiBmZWF0dXJlIGlzbid0IHJlcXVpcmVkLCBvciBoYXMgYWxyZWFkeSBiZWVuIGRlY2xhcmVkLCByZXR1cm4KKyAgICAgICAgaWYgbm90IGYucmVxdWlyZWQ6CisgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnU2tpcHBpbmcnLCBmdHlwZSwgZm5hbWUsICcobm90IHJlcXVpcmVkKScpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgZi5kZWNsYXJlZDoKKyAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdTa2lwcGluZycsIGZ0eXBlLCBmbmFtZSwgJyhhbHJlYWR5IGRlY2xhcmVkKScpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBBbHdheXMgbWFyayBmZWF0dXJlIGRlY2xhcmVkLCBhcyB0aG91Z2ggYWN0dWFsbHkgZW1pdHRlZAorICAgICAgICBmLmRlY2xhcmVkID0gVHJ1ZQorCisgICAgICAgICMgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYW4gYWxpYXMsIGFuZCBvZiB3aGF0LCBpZiBzbworICAgICAgICBhbGlhcyA9IGYuZWxlbS5nZXQoJ2FsaWFzJykKKyAgICAgICAgaWYgYWxpYXM6CisgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCBmbmFtZSwgJ2lzIGFuIGFsaWFzIG9mJywgYWxpYXMpCisKKyAgICAgICAgIyBQdWxsIGluIGRlcGVuZGVudCBkZWNsYXJhdGlvbihzKSBvZiB0aGUgZmVhdHVyZS4KKyAgICAgICAgIyBGb3IgdHlwZXMsIHRoZXJlIG1heSBiZSBvbmUgdHlwZSBpbiB0aGUgJ3JlcXVpcmVzJyBhdHRyaWJ1dGUgb2YKKyAgICAgICAgIyAgIHRoZSBlbGVtZW50LCBvbmUgaW4gdGhlICdhbGlhcycgYXR0cmlidXRlLCBhbmQgbWFueSBpbgorICAgICAgICAjICAgZW1iZWRkZWQgPHR5cGU+IGFuZCA8ZW51bT4gdGFncyB3aXRoaW4gdGhlIGVsZW1lbnQuCisgICAgICAgICMgRm9yIGNvbW1hbmRzLCB0aGVyZSBtYXkgYmUgbWFueSBpbiA8dHlwZT4gdGFncyB3aXRoaW4gdGhlIGVsZW1lbnQuCisgICAgICAgICMgRm9yIGVudW1zLCBubyBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQgKHRob3VnaCBwZXJoYXBzIGlmIHlvdQorICAgICAgICAjICAgaGF2ZSBhIHVpbnQ2NCBlbnVtLCBpdCBzaG91bGQgcmVxdWlyZSB0aGF0IHR5cGUpLgorICAgICAgICBnZW5Qcm9jID0gTm9uZQorICAgICAgICBmb2xsb3d1cEZlYXR1cmUgPSBOb25lCisgICAgICAgIGlmIGZ0eXBlID09ICd0eXBlJzoKKyAgICAgICAgICAgIGdlblByb2MgPSBzZWxmLmdlbi5nZW5UeXBlCisKKyAgICAgICAgICAgICMgR2VuZXJhdGUgdHlwZSBkZXBlbmRlbmNpZXMgaW4gJ2FsaWFzJyBhbmQgJ3JlcXVpcmVzJyBhdHRyaWJ1dGVzCisgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICBzZWxmLmdlbmVyYXRlRmVhdHVyZShhbGlhcywgJ3R5cGUnLCBzZWxmLnR5cGVkaWN0KQorICAgICAgICAgICAgcmVxdWlyZXMgPSBmLmVsZW0uZ2V0KCdyZXF1aXJlcycpCisgICAgICAgICAgICBpZiByZXF1aXJlczoKKyAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnR2VuZXJhdGluZyByZXF1aXJlZCBkZXBlbmRlbnQgdHlwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzKQorICAgICAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVGZWF0dXJlKHJlcXVpcmVzLCAndHlwZScsIHNlbGYudHlwZWRpY3QpCisKKyAgICAgICAgICAgICMgR2VuZXJhdGUgdHlwZXMgdXNlZCBpbiBkZWZpbmluZyB0aGlzIHR5cGUgKGUuZy4gaW4gbmVzdGVkCisgICAgICAgICAgICAjIDx0eXBlPiB0YWdzKQorICAgICAgICAgICAgIyBMb29rIGZvciA8dHlwZT4gaW4gZW50aXJlIDxjb21tYW5kPiB0cmVlLAorICAgICAgICAgICAgIyBub3QganVzdCBpbW1lZGlhdGUgY2hpbGRyZW4KKyAgICAgICAgICAgIGZvciBzdWJ0eXBlIGluIGYuZWxlbS5maW5kYWxsKCcuLy90eXBlJyk6CisgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ0dlbmVyYXRpbmcgcmVxdWlyZWQgZGVwZW5kZW50IDx0eXBlPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUudGV4dCkKKyAgICAgICAgICAgICAgICBzZWxmLmdlbmVyYXRlRmVhdHVyZShzdWJ0eXBlLnRleHQsICd0eXBlJywgc2VsZi50eXBlZGljdCkKKworICAgICAgICAgICAgIyBHZW5lcmF0ZSBlbnVtcyB1c2VkIGluIGRlZmluaW5nIHRoaXMgdHlwZSwgZm9yIGV4YW1wbGUgaW4KKyAgICAgICAgICAgICMgICA8bWVtYmVyPjxuYW1lPm1lbWJlcjwvbmFtZT5bPGVudW0+TUVNQkVSX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgZm9yIHN1YnR5cGUgaW4gZi5lbGVtLmZpbmRhbGwoJy4vL2VudW0nKToKKyAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnR2VuZXJhdGluZyByZXF1aXJlZCBkZXBlbmRlbnQgPGVudW0+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS50ZXh0KQorICAgICAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVGZWF0dXJlKHN1YnR5cGUudGV4dCwgJ2VudW0nLCBzZWxmLmVudW1kaWN0KQorCisgICAgICAgICAgICAjIElmIHRoZSB0eXBlIGlzIGFuIGVudW0gZ3JvdXAsIGxvb2sgdXAgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICMgZ3JvdXAgaW4gdGhlIGdyb3VwIGRpY3Rpb25hcnkgYW5kIGdlbmVyYXRlIHRoYXQgaW5zdGVhZC4KKyAgICAgICAgICAgIGlmIGYuZWxlbS5nZXQoJ2NhdGVnb3J5JykgPT0gJ2VudW0nOgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdUeXBlJywgZm5hbWUsICdpcyBhbiBlbnVtIGdyb3VwLCBzbyBnZW5lcmF0ZSB0aGF0IGluc3RlYWQnKQorICAgICAgICAgICAgICAgIGdyb3VwID0gc2VsZi5sb29rdXBFbGVtZW50SW5mbyhmbmFtZSwgc2VsZi5ncm91cGRpY3QpCisgICAgICAgICAgICAgICAgaWYgYWxpYXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgQW4gYWxpYXMgb2YgYW5vdGhlciBncm91cCBuYW1lLgorICAgICAgICAgICAgICAgICAgICAjIFBhc3MgdG8gZ2VuR3JvdXAgd2l0aCAnYWxpYXMnIHBhcmFtZXRlciA9IGFsaWFzZWQgbmFtZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnR2VuZXJhdGluZyBhbGlhcycsIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciBlbnVtZXJhdGVkIHR5cGUnLCBhbGlhcykKKyAgICAgICAgICAgICAgICAgICAgIyBOb3csIHBhc3MgdGhlICphbGlhc2VkKiBHcm91cEluZm8gdG8gdGhlIGdlbkdyb3VwLCBidXQKKyAgICAgICAgICAgICAgICAgICAgIyB3aXRoIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdoaWNoIGlzIHRoZSBhbGlhcyBuYW1lLgorICAgICAgICAgICAgICAgICAgICBnZW5Qcm9jID0gc2VsZi5nZW4uZ2VuR3JvdXAKKyAgICAgICAgICAgICAgICAgICAgZiA9IHNlbGYubG9va3VwRWxlbWVudEluZm8oYWxpYXMsIHNlbGYuZ3JvdXBkaWN0KQorICAgICAgICAgICAgICAgIGVsaWYgZ3JvdXAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCd3YXJuJywgJ1NraXBwaW5nIGVudW0gdHlwZScsIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzogTm8gbWF0Y2hpbmcgZW51bWVyYW50IGdyb3VwJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZ2VuUHJvYyA9IHNlbGYuZ2VuLmdlbkdyb3VwCisgICAgICAgICAgICAgICAgICAgIGYgPSBncm91cAorCisgICAgICAgICAgICAgICAgICAgICMgQCBUaGUgZW51bSBncm91cCBpcyBub3QgcmVhZHkgZm9yIGdlbmVyYXRpb24uIEF0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgIyBAICAgcG9pbnQsIGl0IGNvbnRhaW5zIGFsbCA8ZW51bT4gdGFncyBpbmplY3RlZCBieQorICAgICAgICAgICAgICAgICAgICAjIEAgICA8ZXh0ZW5zaW9uPiB0YWdzIHdpdGhvdXQgYW55IHZlcmlmaWNhdGlvbiBvZiB3aGV0aGVyCisgICAgICAgICAgICAgICAgICAgICMgQCAgIHRoZXkncmUgcmVxdWlyZWQgb3Igbm90LiBJdCBtYXkgYWxzbyBjb250YWluCisgICAgICAgICAgICAgICAgICAgICMgQCAgIGR1cGxpY2F0ZXMgaW5qZWN0ZWQgYnkgbXVsdGlwbGUgY29uc2lzdGVudAorICAgICAgICAgICAgICAgICAgICAjIEAgICBkZWZpbml0aW9ucyBvZiBhbiA8ZW51bT4uCisKKyAgICAgICAgICAgICAgICAgICAgIyBAIFBhc3Mgb3ZlciBlYWNoIGVudW0sIG1hcmtpbmcgaXRzIGVudW1kaWN0W10gZW50cnkgYXMKKyAgICAgICAgICAgICAgICAgICAgIyBAIHJlcXVpcmVkIG9yIG5vdC4gTWFyayBhbGlhc2VzIG9mIGVudW1zIGFzIHJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAjIEAgdG9vLgorCisgICAgICAgICAgICAgICAgICAgIGVudW1zID0gZ3JvdXAuZWxlbS5maW5kYWxsKCdlbnVtJykKKworICAgICAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnZ2VuZXJhdGVGZWF0dXJlOiBjaGVja2luZyBlbnVtcyBmb3IgZ3JvdXAnLCBmbmFtZSkKKworICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciByZXF1aXJlZCBlbnVtcywgaW5jbHVkaW5nIGFsaWFzZXMKKyAgICAgICAgICAgICAgICAgICAgIyBMQVRFUiAtIENoZWNrIGZvciwgcmVwb3J0LCBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXM/CisgICAgICAgICAgICAgICAgICAgIGVudW1BbGlhc2VzID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gZW51bXM6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZWxlbS5nZXQoJ25hbWUnKQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dG5hbWUgPSBlbGVtLmdldCgnZXh0bmFtZScpCisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZWxlbS5nZXQoJ3ZlcnNpb24nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0bmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICdzdXBwb3J0ZWQnIGF0dHJpYnV0ZSB3YXMgaW5qZWN0ZWQgd2hlbiB0aGUgPGVudW0+IGVsZW1lbnQgd2FzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb3ZlZCBpbnRvIHRoZSA8ZW51bXM+IGdyb3VwIGluIFJlZ2lzdHJ5LnBhcnNlVHJlZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5nZW5PcHRzLmRlZmF1bHRFeHRlbnNpb25zID09IGVsZW0uZ2V0KCdzdXBwb3J0ZWQnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiByZS5tYXRjaChzZWxmLmdlbk9wdHMuYWRkRXh0ZW5zaW9ucywgZXh0bmFtZSkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gcmUubWF0Y2goc2VsZi5nZW5PcHRzLmVtaXR2ZXJzaW9ucywgdmVyc2lvbikgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSBUcnVlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICcqIHJlcXVpcmVkID0nLCByZXF1aXJlZCwgJ2ZvcicsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiByZXF1aXJlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hcmsgdGhpcyBlbGVtZW50IGFzIHJlcXVpcmVkIChpbiB0aGUgZWxlbWVudCwgbm90IHRoZSBFbnVtSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnNldCgncmVxdWlyZWQnLCAndHJ1ZScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBpdCdzIGFuIGFsaWFzLCB0cmFjayB0aGF0IGZvciBsYXRlciB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtQWxpYXMgPSBlbGVtLmdldCgnYWxpYXMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudW1BbGlhczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bUFsaWFzZXMuYXBwZW5kKGVudW1BbGlhcykKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gZW51bXM6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZWxlbS5nZXQoJ25hbWUnKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBlbnVtQWxpYXNlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnNldCgncmVxdWlyZWQnLCAndHJ1ZScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJyogYWxzbyBuZWVkIHRvIHJlcXVpcmUgYWxpYXMnLCBuYW1lKQorICAgICAgICAgICAgaWYgZi5lbGVtLmdldCgnY2F0ZWdvcnknKSA9PSAnYml0bWFzayc6CisgICAgICAgICAgICAgICAgZm9sbG93dXBGZWF0dXJlID0gZi5lbGVtLmdldCgnYml0dmFsdWVzJykKKyAgICAgICAgZWxpZiBmdHlwZSA9PSAnY29tbWFuZCc6CisgICAgICAgICAgICAjIEdlbmVyYXRlIGNvbW1hbmQgZGVwZW5kZW5jaWVzIGluICdhbGlhcycgYXR0cmlidXRlCisgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICBzZWxmLmdlbmVyYXRlRmVhdHVyZShhbGlhcywgJ2NvbW1hbmQnLCBzZWxmLmNtZGRpY3QpCisKKyAgICAgICAgICAgIGdlblByb2MgPSBzZWxmLmdlbi5nZW5DbWQKKyAgICAgICAgICAgIGZvciB0eXBlX2VsZW0gaW4gZi5lbGVtLmZpbmRhbGwoJy4vL3R5cGUnKToKKyAgICAgICAgICAgICAgICBkZXBuYW1lID0gdHlwZV9lbGVtLnRleHQKKyAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnR2VuZXJhdGluZyByZXF1aXJlZCBwYXJhbWV0ZXIgdHlwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5nZW5lcmF0ZUZlYXR1cmUoZGVwbmFtZSwgJ3R5cGUnLCBzZWxmLnR5cGVkaWN0KQorICAgICAgICBlbGlmIGZ0eXBlID09ICdlbnVtJzoKKyAgICAgICAgICAgICMgR2VuZXJhdGUgZW51bSBkZXBlbmRlbmNpZXMgaW4gJ2FsaWFzJyBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGlmIGFsaWFzOgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVGZWF0dXJlKGFsaWFzLCAnZW51bScsIHNlbGYuZW51bWRpY3QpCisgICAgICAgICAgICBnZW5Qcm9jID0gc2VsZi5nZW4uZ2VuRW51bQorCisgICAgICAgICMgQWN0dWFsbHkgZ2VuZXJhdGUgdGhlIHR5cGUgb25seSBpZiBlbWl0dGluZyBkZWNsYXJhdGlvbnMKKyAgICAgICAgaWYgc2VsZi5lbWl0RmVhdHVyZXM6CisgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnRW1pdHRpbmcnLCBmdHlwZSwgJ2RlY2wgZm9yJywgZm5hbWUpCisgICAgICAgICAgICBnZW5Qcm9jKGYsIGZuYW1lLCBhbGlhcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdTa2lwcGluZycsIGZ0eXBlLCBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKHNob3VsZCBub3QgYmUgZW1pdHRlZCknKQorCisgICAgICAgIGlmIGZvbGxvd3VwRmVhdHVyZToKKyAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdHZW5lcmF0aW5nIHJlcXVpcmVkIGJpdHZhbHVlcyA8ZW51bT4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd3VwRmVhdHVyZSkKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVGZWF0dXJlKGZvbGxvd3VwRmVhdHVyZSwgInR5cGUiLCBzZWxmLnR5cGVkaWN0KQorCisgICAgZGVmIGdlbmVyYXRlUmVxdWlyZWRJbnRlcmZhY2Uoc2VsZiwgaW50ZXJmYWNlKToKKyAgICAgICAgIiIiR2VuZXJhdGUgYWxsIGludGVyZmFjZXMgcmVxdWlyZWQgYnkgYW4gQVBJIHZlcnNpb24gb3IgZXh0ZW5zaW9uLgorCisgICAgICAgIC0gaW50ZXJmYWNlIC0gRWxlbWVudCBmb3IgYDx2ZXJzaW9uPmAgb3IgYDxleHRlbnNpb24+YCIiIgorCisgICAgICAgICMgTG9vcCBvdmVyIGFsbCBmZWF0dXJlcyBpbnNpZGUgYWxsIDxyZXF1aXJlPiB0YWdzLgorICAgICAgICBmb3IgZmVhdHVyZXMgaW4gaW50ZXJmYWNlLmZpbmRhbGwoJ3JlcXVpcmUnKToKKyAgICAgICAgICAgIGZvciB0IGluIGZlYXR1cmVzLmZpbmRhbGwoJ3R5cGUnKToKKyAgICAgICAgICAgICAgICBzZWxmLmdlbmVyYXRlRmVhdHVyZSh0LmdldCgnbmFtZScpLCAndHlwZScsIHNlbGYudHlwZWRpY3QpCisgICAgICAgICAgICBmb3IgZSBpbiBmZWF0dXJlcy5maW5kYWxsKCdlbnVtJyk6CisgICAgICAgICAgICAgICAgc2VsZi5nZW5lcmF0ZUZlYXR1cmUoZS5nZXQoJ25hbWUnKSwgJ2VudW0nLCBzZWxmLmVudW1kaWN0KQorICAgICAgICAgICAgZm9yIGMgaW4gZmVhdHVyZXMuZmluZGFsbCgnY29tbWFuZCcpOgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVGZWF0dXJlKGMuZ2V0KCduYW1lJyksICdjb21tYW5kJywgc2VsZi5jbWRkaWN0KQorCisgICAgZGVmIGFwaUdlbihzZWxmLCBnZW5PcHRzKToKKyAgICAgICAgIiIiR2VuZXJhdGUgaW50ZXJmYWNlIGZvciBzcGVjaWZpZWQgdmVyc2lvbnMKKworICAgICAgICAtIGdlbk9wdHMgLSBHZW5lcmF0b3JPcHRpb25zIG9iamVjdCB3aXRoIHBhcmFtZXRlcnMgdXNlZAorICAgICAgICAgIGJ5IHRoZSBHZW5lcmF0b3Igb2JqZWN0LiIiIgorICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicpCisgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICcgIFJlZ2lzdHJ5LmFwaUdlbiBmaWxlOicsIGdlbk9wdHMuZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAnYXBpOicsIGdlbk9wdHMuYXBpbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdwcm9maWxlOicsIGdlbk9wdHMucHJvZmlsZSkKKyAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKQorCisgICAgICAgIHNlbGYuZ2VuT3B0cyA9IGdlbk9wdHMKKyAgICAgICAgIyBSZXNldCByZXF1aXJlZC9kZWNsYXJlZCBmbGFncyBmb3IgYWxsIGZlYXR1cmVzCisgICAgICAgIHNlbGYuYXBpUmVzZXQoKQorCisgICAgICAgICMgQ29tcGlsZSByZWdleHBzIHVzZWQgdG8gc2VsZWN0IHZlcnNpb25zICYgZXh0ZW5zaW9ucworICAgICAgICByZWdWZXJzaW9ucyA9IHJlLmNvbXBpbGUoc2VsZi5nZW5PcHRzLnZlcnNpb25zKQorICAgICAgICByZWdFbWl0VmVyc2lvbnMgPSByZS5jb21waWxlKHNlbGYuZ2VuT3B0cy5lbWl0dmVyc2lvbnMpCisgICAgICAgIHJlZ0FkZEV4dGVuc2lvbnMgPSByZS5jb21waWxlKHNlbGYuZ2VuT3B0cy5hZGRFeHRlbnNpb25zKQorICAgICAgICByZWdSZW1vdmVFeHRlbnNpb25zID0gcmUuY29tcGlsZShzZWxmLmdlbk9wdHMucmVtb3ZlRXh0ZW5zaW9ucykKKyAgICAgICAgcmVnRW1pdEV4dGVuc2lvbnMgPSByZS5jb21waWxlKHNlbGYuZ2VuT3B0cy5lbWl0RXh0ZW5zaW9ucykKKworICAgICAgICAjIEdldCBhbGwgbWF0Y2hpbmcgQVBJIGZlYXR1cmUgbmFtZXMgJiBhZGQgdG8gbGlzdCBvZiBGZWF0dXJlSW5mbworICAgICAgICAjIE5vdGUgd2UgdXNlZCB0byBzZWxlY3Qgb24gZmVhdHVyZSB2ZXJzaW9uIGF0dHJpYnV0ZXMsIG5vdCBuYW1lcy4KKyAgICAgICAgZmVhdHVyZXMgPSBbXQorICAgICAgICBhcGlNYXRjaCA9IEZhbHNlCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5hcGlkaWN0OgorICAgICAgICAgICAgZmkgPSBzZWxmLmFwaWRpY3Rba2V5XQorICAgICAgICAgICAgYXBpID0gZmkuZWxlbS5nZXQoJ2FwaScpCisgICAgICAgICAgICBpZiBhcGkgPT0gc2VsZi5nZW5PcHRzLmFwaW5hbWU6CisgICAgICAgICAgICAgICAgYXBpTWF0Y2ggPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgcmVnVmVyc2lvbnMubWF0Y2goZmkubmFtZSk6CisgICAgICAgICAgICAgICAgICAgICMgTWF0Y2hlcyBBUEkgJiB2ZXJzaW9uICNzIGJlaW5nIGdlbmVyYXRlZC4gTWFyayBmb3IKKyAgICAgICAgICAgICAgICAgICAgIyBlbWlzc2lvbiBhbmQgYWRkIHRvIHRoZSBmZWF0dXJlc1tdIGxpc3QgLgorICAgICAgICAgICAgICAgICAgICAjIEBAIENvdWxkIHVzZSAnZGVjbGFyZWQnIGluc3RlYWQgb2YgJ2VtaXQnPworICAgICAgICAgICAgICAgICAgICBmaS5lbWl0ID0gKHJlZ0VtaXRWZXJzaW9ucy5tYXRjaChmaS5uYW1lKSBpcyBub3QgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMuYXBwZW5kKGZpKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmkuZW1pdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdOT1QgdGFnZ2luZyBmZWF0dXJlIGFwaSA9JywgYXBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lID0nLCBmaS5uYW1lLCAndmVyc2lvbiA9JywgZmkudmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIGVtaXNzaW9uIChkb2VzIG5vdCBtYXRjaCBlbWl0dmVyc2lvbnMgcGF0dGVybiknKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ0luY2x1ZGluZyBmZWF0dXJlIGFwaSA9JywgYXBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lID0nLCBmaS5uYW1lLCAndmVyc2lvbiA9JywgZmkudmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIGVtaXNzaW9uIChtYXRjaGVzIGVtaXR2ZXJzaW9ucyBwYXR0ZXJuKScpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ05PVCBpbmNsdWRpbmcgZmVhdHVyZSBhcGkgPScsIGFwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lID0nLCBmaS5uYW1lLCAndmVyc2lvbiA9JywgZmkudmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoZG9lcyBub3QgbWF0Y2ggcmVxdWVzdGVkIHZlcnNpb25zKScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdOT1QgaW5jbHVkaW5nIGZlYXR1cmUgYXBpID0nLCBhcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lID0nLCBmaS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKGRvZXMgbm90IG1hdGNoIHJlcXVlc3RlZCBBUEkpJykKKyAgICAgICAgaWYgbm90IGFwaU1hdGNoOgorICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCd3YXJuJywgJ05vIG1hdGNoaW5nIEFQSSB2ZXJzaW9ucyBmb3VuZCEnKQorCisgICAgICAgICMgR2V0IGFsbCBtYXRjaGluZyBleHRlbnNpb25zLCBpbiBvcmRlciBieSB0aGVpciBleHRlbnNpb24gbnVtYmVyLAorICAgICAgICAjIGFuZCBhZGQgdG8gdGhlIGxpc3Qgb2YgZmVhdHVyZXMuCisgICAgICAgICMgU3RhcnQgd2l0aCBleHRlbnNpb25zIHRhZ2dlZCB3aXRoICdhcGknIHBhdHRlcm4gbWF0Y2hpbmcgdGhlIEFQSQorICAgICAgICAjIGJlaW5nIGdlbmVyYXRlZC4gQWRkIGV4dGVuc2lvbnMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gc3BlY2lmaWVkIGluCisgICAgICAgICMgcmVnRXh0ZW5zaW9ucywgdGhlbiByZW1vdmUgZXh0ZW5zaW9ucyBtYXRjaGluZyB0aGUgcGF0dGVybgorICAgICAgICAjIHNwZWNpZmllZCBpbiByZWdSZW1vdmVFeHRlbnNpb25zCisgICAgICAgIGZvciAoZXh0TmFtZSwgZWkpIGluIHNvcnRlZChzZWxmLmV4dGRpY3QuaXRlbXMoKSwga2V5PWxhbWJkYSB4OiB4WzFdLm51bWJlciBpZiB4WzFdLm51bWJlciBpcyBub3QgTm9uZSBlbHNlICcwJyk6CisgICAgICAgICAgICBleHROYW1lID0gZWkubmFtZQorICAgICAgICAgICAgaW5jbHVkZSA9IEZhbHNlCisKKyAgICAgICAgICAgICMgSW5jbHVkZSBleHRlbnNpb24gaWYgZGVmYXVsdEV4dGVuc2lvbnMgaXMgbm90IE5vbmUgYW5kIGlmIHRoZQorICAgICAgICAgICAgIyAnc3VwcG9ydGVkJyBhdHRyaWJ1dGUgbWF0Y2hlcyBkZWZhdWx0RXh0ZW5zaW9ucy4gVGhlIHJlZ2V4cCBpbgorICAgICAgICAgICAgIyAnc3VwcG9ydGVkJyBtdXN0IGV4YWN0bHkgbWF0Y2ggZGVmYXVsdEV4dGVuc2lvbnMsIHNvIGJyYWNrZXQKKyAgICAgICAgICAgICMgaXQgd2l0aCBeKHBhdCkkLgorICAgICAgICAgICAgcGF0ID0gJ14oJyArIGVpLmVsZW0uZ2V0KCdzdXBwb3J0ZWQnKSArICcpJCcKKyAgICAgICAgICAgIGlmIChzZWxmLmdlbk9wdHMuZGVmYXVsdEV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgYW5kIHJlLm1hdGNoKHBhdCwgc2VsZi5nZW5PcHRzLmRlZmF1bHRFeHRlbnNpb25zKSk6CisgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ0luY2x1ZGluZyBleHRlbnNpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHROYW1lLCAiKGRlZmF1bHRFeHRlbnNpb25zIG1hdGNoZXMgdGhlICdzdXBwb3J0ZWQnIGF0dHJpYnV0ZSkiKQorICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBUcnVlCisKKyAgICAgICAgICAgICMgSW5jbHVkZSBhZGRpdGlvbmFsIGV4dGVuc2lvbnMgaWYgdGhlIGV4dGVuc2lvbiBuYW1lIG1hdGNoZXMKKyAgICAgICAgICAgICMgdGhlIHJlZ2V4cCBzcGVjaWZpZWQgaW4gdGhlIGdlbmVyYXRvciBvcHRpb25zLiBUaGlzIGFsbG93cworICAgICAgICAgICAgIyBmb3JjaW5nIGV4dGVuc2lvbnMgaW50byBhbiBpbnRlcmZhY2UgZXZlbiBpZiB0aGV5J3JlIG5vdAorICAgICAgICAgICAgIyB0YWdnZWQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcmVnaXN0cnkuCisgICAgICAgICAgICBpZiByZWdBZGRFeHRlbnNpb25zLm1hdGNoKGV4dE5hbWUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdJbmNsdWRpbmcgZXh0ZW5zaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0TmFtZSwgJyhtYXRjaGVzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGV4dGVuc2lvbnMgdG8gYWRkKScpCisgICAgICAgICAgICAgICAgaW5jbHVkZSA9IFRydWUKKyAgICAgICAgICAgICMgUmVtb3ZlIGV4dGVuc2lvbnMgaWYgdGhlIG5hbWUgbWF0Y2hlcyB0aGUgcmVnZXhwIHNwZWNpZmllZAorICAgICAgICAgICAgIyBpbiBnZW5lcmF0b3Igb3B0aW9ucy4gVGhpcyBhbGxvd3MgZm9yY2luZyByZW1vdmFsIG9mCisgICAgICAgICAgICAjIGV4dGVuc2lvbnMgZnJvbSBhbiBpbnRlcmZhY2UgZXZlbiBpZiB0aGV5J3JlIHRhZ2dlZCB0aGF0CisgICAgICAgICAgICAjIHdheSBpbiB0aGUgcmVnaXN0cnkuCisgICAgICAgICAgICBpZiByZWdSZW1vdmVFeHRlbnNpb25zLm1hdGNoKGV4dE5hbWUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdSZW1vdmluZyBleHRlbnNpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHROYW1lLCAnKG1hdGNoZXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgZXh0ZW5zaW9ucyB0byByZW1vdmUpJykKKyAgICAgICAgICAgICAgICBpbmNsdWRlID0gRmFsc2UKKworICAgICAgICAgICAgIyBJZiB0aGUgZXh0ZW5zaW9uIGlzIHRvIGJlIGluY2x1ZGVkLCBhZGQgaXQgdG8gdGhlCisgICAgICAgICAgICAjIGV4dGVuc2lvbiBmZWF0dXJlcyBsaXN0LgorICAgICAgICAgICAgaWYgaW5jbHVkZToKKyAgICAgICAgICAgICAgICBlaS5lbWl0ID0gKHJlZ0VtaXRFeHRlbnNpb25zLm1hdGNoKGV4dE5hbWUpIGlzIG5vdCBOb25lKQorICAgICAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZChlaSkKKyAgICAgICAgICAgICAgICBpZiBub3QgZWkuZW1pdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ05PVCB0YWdnaW5nIGV4dGVuc2lvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciBlbWlzc2lvbiAoZG9lcyBub3QgbWF0Y2ggZW1pdGV4dGVuc2lvbnMgcGF0dGVybiknKQorCisgICAgICAgICAgICAgICAgIyBIYWNrIC0gY2FuIGJlIHJlbW92ZWQgd2hlbiB2YWxpZGl0eSBnZW5lcmF0b3IgZ29lcyBhd2F5CisgICAgICAgICAgICAgICAgIyAoSm9uKSBJJ20gbm90IHN1cmUgd2hhdCB0aGlzIGRvZXMsIG9yIGlmIGl0IHNob3VsZCByZXNwZWN0CisgICAgICAgICAgICAgICAgIyB0aGUgZWkuZW1pdCBmbGFnIGFib3ZlLgorICAgICAgICAgICAgICAgIHNlbGYucmVxdWlyZWRleHRlbnNpb25zLmFwcGVuZChleHROYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnTk9UIGluY2x1ZGluZyBleHRlbnNpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHROYW1lLCAnKGRvZXMgbm90IG1hdGNoIGFwaSBhdHRyaWJ1dGUgb3IgZXhwbGljaXRseSByZXF1ZXN0ZWQgZXh0ZW5zaW9ucyknKQorCisgICAgICAgICMgU29ydCB0aGUgZmVhdHVyZXMgbGlzdCwgaWYgYSBzb3J0IHByb2NlZHVyZSBpcyBkZWZpbmVkCisgICAgICAgIGlmIHNlbGYuZ2VuT3B0cy5zb3J0UHJvY2VkdXJlOgorICAgICAgICAgICAgc2VsZi5nZW5PcHRzLnNvcnRQcm9jZWR1cmUoZmVhdHVyZXMpCisKKyAgICAgICAgIyBQYXNzIDE6IGxvb3Agb3ZlciByZXF1ZXN0ZWQgQVBJIHZlcnNpb25zIGFuZCBleHRlbnNpb25zIHRhZ2dpbmcKKyAgICAgICAgIyAgIHR5cGVzL2NvbW1hbmRzL2ZlYXR1cmVzIGFzIHJlcXVpcmVkIChpbiBhbiA8cmVxdWlyZT4gYmxvY2spIG9yIG5vCisgICAgICAgICMgICBsb25nZXIgcmVxdWlyZWQgKGluIGFuIDxyZW1vdmU+IGJsb2NrKS4gSXQgaXMgcG9zc2libGUgdG8gcmVtb3ZlCisgICAgICAgICMgICBhIGZlYXR1cmUgaW4gb25lIHZlcnNpb24gYW5kIHJlc3RvcmUgaXQgbGF0ZXIgYnkgcmVxdWlyaW5nIGl0IGluCisgICAgICAgICMgICBhIGxhdGVyIHZlcnNpb24uCisgICAgICAgICMgSWYgYSBwcm9maWxlIG90aGVyIHRoYW4gJ05vbmUnIGlzIGJlaW5nIGdlbmVyYXRlZCwgaXQgbXVzdAorICAgICAgICAjICAgbWF0Y2ggdGhlIHByb2ZpbGUgYXR0cmlidXRlIChpZiBhbnkpIG9mIHRoZSA8cmVxdWlyZT4gYW5kCisgICAgICAgICMgICA8cmVtb3ZlPiB0YWdzLgorICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnUEFTUyAxOiBUQUcgRkVBVFVSRVMnKQorICAgICAgICBmb3IgZiBpbiBmZWF0dXJlczoKKyAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdQQVNTIDE6IFRhZ2dpbmcgcmVxdWlyZWQgYW5kIHJlbW92ZWQgZmVhdHVyZXMgZm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm5hbWUpCisgICAgICAgICAgICBzZWxmLnJlcXVpcmVBbmRSZW1vdmVGZWF0dXJlcyhmLmVsZW0sIGYubmFtZSwgc2VsZi5nZW5PcHRzLmFwaW5hbWUsIHNlbGYuZ2VuT3B0cy5wcm9maWxlKQorICAgICAgICAgICAgc2VsZi5hc3NpZ25BZGRpdGlvbmFsVmFsaWRpdHkoZi5lbGVtLCBzZWxmLmdlbk9wdHMuYXBpbmFtZSwgc2VsZi5nZW5PcHRzLnByb2ZpbGUpCisKKyAgICAgICAgIyBQYXNzIDI6IGxvb3Agb3ZlciBzcGVjaWZpZWQgQVBJIHZlcnNpb25zIGFuZCBleHRlbnNpb25zIHByaW50aW5nCisgICAgICAgICMgICBkZWNsYXJhdGlvbnMgZm9yIHJlcXVpcmVkIHRoaW5ncyB3aGljaCBoYXZlbid0IGFscmVhZHkgYmVlbgorICAgICAgICAjICAgZ2VuZXJhdGVkLgorICAgICAgICBzZWxmLmdlbi5sb2dNc2coJ2RpYWcnLCAnUEFTUyAyOiBHRU5FUkFURSBJTlRFUkZBQ0VTIEZPUiBGRUFUVVJFUycpCisgICAgICAgIHNlbGYuZ2VuLmJlZ2luRmlsZShzZWxmLmdlbk9wdHMpCisgICAgICAgIGZvciBmIGluIGZlYXR1cmVzOgorICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ1BBU1MgMjogR2VuZXJhdGluZyBpbnRlcmZhY2UgZm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm5hbWUpCisgICAgICAgICAgICBlbWl0ID0gc2VsZi5lbWl0RmVhdHVyZXMgPSBmLmVtaXQKKyAgICAgICAgICAgIGlmIG5vdCBlbWl0OgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdQQVNTIDI6IE5PVCBkZWNsYXJpbmcgZmVhdHVyZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZWxlbS5nZXQoJ25hbWUnKSwgJ2JlY2F1c2UgaXQgaXMgbm90IHRhZ2dlZCBmb3IgZW1pc3Npb24nKQorICAgICAgICAgICAgIyBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIChvciBqdXN0IHRhZyBpdHMgZWxlbWVudHMgYXMgaGF2aW5nIGJlZW4KKyAgICAgICAgICAgICMgZW1pdHRlZCwgaWYgdGhleSBoYXZlbid0IGJlZW4pLgorICAgICAgICAgICAgc2VsZi5nZW4uYmVnaW5GZWF0dXJlKGYuZWxlbSwgZW1pdCkKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVSZXF1aXJlZEludGVyZmFjZShmLmVsZW0pCisgICAgICAgICAgICBzZWxmLmdlbi5lbmRGZWF0dXJlKCkKKyAgICAgICAgc2VsZi5nZW4uZW5kRmlsZSgpCisKKyAgICBkZWYgYXBpUmVzZXQoc2VsZik6CisgICAgICAgICIiIlJlc2V0IHR5cGUvZW51bS9jb21tYW5kIGRpY3Rpb25hcmllcyBiZWZvcmUgZ2VuZXJhdGluZyBhbm90aGVyIEFQSS4KKworICAgICAgICBVc2UgYmV0d2VlbiBhcGlHZW4oKSBjYWxscyB0byByZXNldCBpbnRlcm5hbCBzdGF0ZS4iIiIKKyAgICAgICAgZm9yIGRhdGF0eXBlIGluIHNlbGYudHlwZWRpY3Q6CisgICAgICAgICAgICBzZWxmLnR5cGVkaWN0W2RhdGF0eXBlXS5yZXNldFN0YXRlKCkKKyAgICAgICAgZm9yIGVudW0gaW4gc2VsZi5lbnVtZGljdDoKKyAgICAgICAgICAgIHNlbGYuZW51bWRpY3RbZW51bV0ucmVzZXRTdGF0ZSgpCisgICAgICAgIGZvciBjbWQgaW4gc2VsZi5jbWRkaWN0OgorICAgICAgICAgICAgc2VsZi5jbWRkaWN0W2NtZF0ucmVzZXRTdGF0ZSgpCisgICAgICAgIGZvciBjbWQgaW4gc2VsZi5hcGlkaWN0OgorICAgICAgICAgICAgc2VsZi5hcGlkaWN0W2NtZF0ucmVzZXRTdGF0ZSgpCisKKyAgICBkZWYgdmFsaWRhdGVHcm91cHMoc2VsZik6CisgICAgICAgICIiIlZhbGlkYXRlIGBncm91cD1gIGF0dHJpYnV0ZXMgb24gYDxwYXJhbT5gIGFuZCBgPHByb3RvPmAgdGFncy4KKworICAgICAgICBDaGVjayB0aGF0IGBncm91cD1gIGF0dHJpYnV0ZXMgbWF0Y2ggYWN0dWFsIGdyb3VwcyIiIgorICAgICAgICAjIEtlZXAgdHJhY2sgb2YgZ3JvdXAgbmFtZXMgbm90IGluIDxncm91cD4gdGFncworICAgICAgICBiYWRHcm91cCA9IHt9CisgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICdWQUxJREFUSU5HIEdST1VQIEFUVFJJQlVURVMnKQorICAgICAgICBmb3IgY21kIGluIHNlbGYucmVnLmZpbmRhbGwoJ2NvbW1hbmRzL2NvbW1hbmQnKToKKyAgICAgICAgICAgIHByb3RvID0gY21kLmZpbmQoJ3Byb3RvJykKKyAgICAgICAgICAgICMgZnVuY25hbWUgPSBjbWQuZmluZCgncHJvdG8vbmFtZScpLnRleHQKKyAgICAgICAgICAgIGdyb3VwID0gcHJvdG8uZ2V0KCdncm91cCcpCisgICAgICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZSBhbmQgZ3JvdXAgbm90IGluIHNlbGYuZ3JvdXBkaWN0OgorICAgICAgICAgICAgICAgICMgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJyoqKiBDb21tYW5kICcsIGZ1bmNuYW1lLCAnIGhhcyBVTktOT1dOIHJldHVybiBncm91cCAnLCBncm91cCkKKyAgICAgICAgICAgICAgICBpZiBncm91cCBub3QgaW4gYmFkR3JvdXA6CisgICAgICAgICAgICAgICAgICAgIGJhZEdyb3VwW2dyb3VwXSA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBiYWRHcm91cFtncm91cF0gPSBiYWRHcm91cFtncm91cF0gKyAxCisKKyAgICAgICAgICAgIGZvciBwYXJhbSBpbiBjbWQuZmluZGFsbCgncGFyYW0nKToKKyAgICAgICAgICAgICAgICBwbmFtZSA9IHBhcmFtLmZpbmQoJ25hbWUnKQorICAgICAgICAgICAgICAgIGlmIHBuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwbmFtZSA9IHBuYW1lLnRleHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwbmFtZSA9IHBhcmFtLmdldCgnbmFtZScpCisgICAgICAgICAgICAgICAgZ3JvdXAgPSBwYXJhbS5nZXQoJ2dyb3VwJykKKyAgICAgICAgICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZSBhbmQgZ3JvdXAgbm90IGluIHNlbGYuZ3JvdXBkaWN0OgorICAgICAgICAgICAgICAgICAgICAjIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICcqKiogQ29tbWFuZCAnLCBmdW5jbmFtZSwgJyBwYXJhbSAnLCBwbmFtZSwgJyBoYXMgVU5LTk9XTiBncm91cCAnLCBncm91cCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZ3JvdXAgbm90IGluIGJhZEdyb3VwOgorICAgICAgICAgICAgICAgICAgICAgICAgYmFkR3JvdXBbZ3JvdXBdID0gMQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYmFkR3JvdXBbZ3JvdXBdID0gYmFkR3JvdXBbZ3JvdXBdICsgMQorCisgICAgICAgIGlmIGJhZEdyb3VwOgorICAgICAgICAgICAgc2VsZi5nZW4ubG9nTXNnKCdkaWFnJywgJ1NVTU1BUlkgT0YgVU5SRUNPR05JWkVEIEdST1VQUycpCisgICAgICAgICAgICBmb3Iga2V5IGluIHNvcnRlZChiYWRHcm91cC5rZXlzKCkpOgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuLmxvZ01zZygnZGlhZycsICcgICAgJywga2V5LCAnIG9jY3VycmVkICcsIGJhZEdyb3VwW2tleV0sICcgdGltZXMnKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS9zcGVjX3Rvb2xzL3V0aWwucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L3NwZWNfdG9vbHMvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDYzMjkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS9zcGVjX3Rvb2xzL3V0aWwucHkKQEAgLTAsMCArMSw2OCBAQAorIiIiVXRpbGl0eSBmdW5jdGlvbnMgbm90IGNsb3NlbHkgdGllZCB0byBvdGhlciBzcGVjX3Rvb2xzIHR5cGVzLiIiIgorIyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBDb2xsYWJvcmEsIEx0ZC4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK2RlZiBnZXRFbGVtTmFtZShlbGVtLCBkZWZhdWx0PU5vbmUpOgorICAgICIiIkdldCB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgZWl0aGVyIGEgbmFtZSBjaGlsZCBvciBuYW1lIGF0dHJpYnV0ZS4iIiIKKyAgICBuYW1lX2VsZW0gPSBlbGVtLmZpbmQoJ25hbWUnKQorICAgIGlmIG5hbWVfZWxlbSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIG5hbWVfZWxlbS50ZXh0CisgICAgIyBGYWxsYmFjayBpZiB0aGVyZSBpcyBubyBjaGlsZC4KKyAgICByZXR1cm4gZWxlbS5nZXQoJ25hbWUnLCBkZWZhdWx0KQorCisKK2RlZiBnZXRFbGVtVHlwZShlbGVtLCBkZWZhdWx0PU5vbmUpOgorICAgICIiIkdldCB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgZWl0aGVyIGEgdHlwZSBjaGlsZCBvciB0eXBlIGF0dHJpYnV0ZS4iIiIKKyAgICB0eXBlX2VsZW0gPSBlbGVtLmZpbmQoJ3R5cGUnKQorICAgIGlmIHR5cGVfZWxlbSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHR5cGVfZWxlbS50ZXh0CisgICAgIyBGYWxsYmFjayBpZiB0aGVyZSBpcyBubyBjaGlsZC4KKyAgICByZXR1cm4gZWxlbS5nZXQoJ3R5cGUnLCBkZWZhdWx0KQorCisKK2RlZiBmaW5kRmlyc3RXaXRoUHJlZGljYXRlKGNvbGxlY3Rpb24sIHByZWQpOgorICAgICIiIlJldHVybiB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlLCBvciBOb25lIGlmIG5vbmUgZXhpc3QuCisKKyAgICBOT1RFOiBTb21lIHBsYWNlcyB3aGVyZSB0aGlzIGlzIHVzZWQgbWlnaHQgYmUgYmV0dGVyIHNlcnZlZCBieSBjaGFuZ2luZyB0byBhIGRpY3Rpb25hcnkuCisgICAgIiIiCisgICAgZm9yIGVsdCBpbiBjb2xsZWN0aW9uOgorICAgICAgICBpZiBwcmVkKGVsdCk6CisgICAgICAgICAgICByZXR1cm4gZWx0CisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgZmluZE5hbWVkRWxlbShlbGVtcywgbmFtZSk6CisgICAgIiIiVHJhdmVyc2UgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIHdpdGggJ25hbWUnIG5vZGVzIG9yIGF0dHJpYnV0ZXMsIGxvb2tpbmcgZm9yIGFuZCByZXR1cm5pbmcgb25lIHdpdGggdGhlIHJpZ2h0IG5hbWUuCisKKyAgICBOT1RFOiBNYW55IHBsYWNlcyB3aGVyZSB0aGlzIGlzIHVzZWQgbWlnaHQgYmUgYmV0dGVyIHNlcnZlZCBieSBjaGFuZ2luZyB0byBhIGRpY3Rpb25hcnkuCisgICAgIiIiCisgICAgcmV0dXJuIGZpbmRGaXJzdFdpdGhQcmVkaWNhdGUoZWxlbXMsIGxhbWJkYSBlbGVtOiBnZXRFbGVtTmFtZShlbGVtKSA9PSBuYW1lKQorCisKK2RlZiBmaW5kVHlwZWRFbGVtKGVsZW1zLCB0eXBlbmFtZSk6CisgICAgIiIiVHJhdmVyc2UgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIHdpdGggJ3R5cGUnIG5vZGVzIG9yIGF0dHJpYnV0ZXMsIGxvb2tpbmcgZm9yIGFuZCByZXR1cm5pbmcgb25lIHdpdGggdGhlIHJpZ2h0IHR5cGVuYW1lLgorCisgICAgTk9URTogTWFueSBwbGFjZXMgd2hlcmUgdGhpcyBpcyB1c2VkIG1pZ2h0IGJlIGJldHRlciBzZXJ2ZWQgYnkgY2hhbmdpbmcgdG8gYSBkaWN0aW9uYXJ5LgorICAgICIiIgorICAgIHJldHVybiBmaW5kRmlyc3RXaXRoUHJlZGljYXRlKGVsZW1zLCBsYW1iZGEgZWxlbTogZ2V0RWxlbVR5cGUoZWxlbSkgPT0gdHlwZW5hbWUpCisKKworZGVmIGZpbmROYW1lZE9iamVjdChjb2xsZWN0aW9uLCBuYW1lKToKKyAgICAiIiJUcmF2ZXJzZSBhIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgd2l0aCAnbmFtZScgYXR0cmlidXRlcywgbG9va2luZyBmb3IgYW5kIHJldHVybmluZyBvbmUgd2l0aCB0aGUgcmlnaHQgbmFtZS4KKworICAgIE5PVEU6IE1hbnkgcGxhY2VzIHdoZXJlIHRoaXMgaXMgdXNlZCBtaWdodCBiZSBiZXR0ZXIgc2VydmVkIGJ5IGNoYW5naW5nIHRvIGEgZGljdGlvbmFyeS4KKyAgICAiIiIKKyAgICByZXR1cm4gZmluZEZpcnN0V2l0aFByZWRpY2F0ZShjb2xsZWN0aW9uLCBsYW1iZGEgZWx0OiBlbHQubmFtZSA9PSBuYW1lKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS92YWxpZHVzYWdlLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L3ZhbGlkdXNhZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRmMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS92YWxpZHVzYWdlLmpzb24KQEAgLTAsMCArMSwyNjI0NiBAQAoreworICAidmVyc2lvbiBpbmZvIjogeworICAgICJzY2hlbWEgdmVyc2lvbiI6IDIsCisgICAgImFwaSB2ZXJzaW9uIjogIjEuMS4xMzAiLAorICAgICJjb21tZW50IjogImZyb20gZ2l0IGJyYW5jaDogZ2l0aHViLW1hc3RlciBjb21taXQ6IDg2MTEzZjcyMjkwY2E1OTk4ZmNhZTc5OGVlMTgwYmY1ODdlY2EyYTAiLAorICAgICJkYXRlIjogIjIwMTktMTItMDcgMTQ6MjM6MzZaIgorICB9LAorICAidmFsaWRhdGlvbiI6IHsKKyAgICAidmtHZXRJbnN0YW5jZVByb2NBZGRyIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW5zdGFuY2VQcm9jQWRkci1pbnN0YW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5pbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW5zdGFuY2VQcm9jQWRkci1wTmFtZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmFtZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXREZXZpY2VQcm9jQWRkciI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZVByb2NBZGRyLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlUHJvY0FkZHItcE5hbWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5hbWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uLXBBcGlWZXJzaW9uLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBBcGlWZXJzaW9uPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZUluc3RhbmNlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlSW5zdGFuY2UtcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtMDEzODgiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgPGEgaHJlZj1cIiNleHRlbmRpbmd2dWxrYW4tZXh0ZW5zaW9ucy1leHRlbnNpb25kZXBlbmRlbmNpZXNcIj5yZXF1aXJlZCBleHRlbnNpb25zPC9hPiBmb3IgZWFjaCBleHRlbnNpb24gaW4gdGhlIDxhIGhyZWY9XCIjVmtJbnN0YW5jZUNyZWF0ZUluZm9cIj5Wa0luc3RhbmNlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzPC9jb2RlPiBsaXN0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gYmUgcHJlc2VudCBpbiB0aGF0IGxpc3QuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUluc3RhbmNlLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5zdGFuY2VDcmVhdGVJbmZvXCI+VmtJbnN0YW5jZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJbnN0YW5jZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJbnN0YW5jZS1wSW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0luc3RhbmNlQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUXCI+VmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVFwiPlZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQ8L2E+LCA8YSBocmVmPVwiI1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUXCI+VmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQ8L2E+LCBvciA8YSBocmVmPVwiI1ZrVmFsaWRhdGlvbkZsYWdzRVhUXCI+VmtWYWxpZGF0aW9uRmxhZ3NFWFQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnNUeXBlPC9jb2RlPiBtZW1iZXIgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1wQXBwbGljYXRpb25JbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBcHBsaWNhdGlvbkluZm88L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFwcGxpY2F0aW9uSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FwcGxpY2F0aW9uSW5mb1wiPlZrQXBwbGljYXRpb25JbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLXBwRW5hYmxlZExheWVyTmFtZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZW5hYmxlZExheWVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cHBFbmFibGVkTGF5ZXJOYW1lczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmVuYWJsZWRMYXllckNvdW50PC9jb2RlPiBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5ncyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbnN0YW5jZUNyZWF0ZUluZm8tcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZW5hYmxlZEV4dGVuc2lvbkNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZW5hYmxlZEV4dGVuc2lvbkNvdW50PC9jb2RlPiBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5ncyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrVmFsaWRhdGlvbkZsYWdzRVhUIjogeworICAgICAgIihWS19FWFRfdmFsaWRhdGlvbl9mbGFncykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmFsaWRhdGlvbkZsYWdzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkxBR1NfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWYWxpZGF0aW9uRmxhZ3NFWFQtcERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1ZhbGlkYXRpb25DaGVja0VYVFwiPlZrVmFsaWRhdGlvbkNoZWNrRVhUPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmFsaWRhdGlvbkZsYWdzRVhULWRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3ZhbGlkYXRpb25fZmVhdHVyZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmFsaWRhdGlvbkZlYXR1cmVzRVhULXBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVFwiPlZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQ8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQtcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFRcIj5Wa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVDwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtBcHBsaWNhdGlvbkluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBcHBsaWNhdGlvbkluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQVBQTElDQVRJT05fSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXBwbGljYXRpb25JbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FwcGxpY2F0aW9uSW5mby1wQXBwbGljYXRpb25OYW1lLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBcHBsaWNhdGlvbk5hbWU8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFwcGxpY2F0aW9uTmFtZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FwcGxpY2F0aW9uSW5mby1wRW5naW5lTmFtZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wRW5naW5lTmFtZTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wRW5naW5lTmFtZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95SW5zdGFuY2UiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW5zdGFuY2UtaW5zdGFuY2UtMDA2MjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgY2hpbGQgb2JqZWN0cyBjcmVhdGVkIHVzaW5nIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gZGVzdHJveWVkIHByaW9yIHRvIGRlc3Ryb3lpbmcgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1pbnN0YW5jZS0wMDYzMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmluc3RhbmNlPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW5zdGFuY2UtaW5zdGFuY2UtMDA2MzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1pbnN0YW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5pbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUluc3RhbmNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMtaW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcy1wUGh5c2ljYWxEZXZpY2VDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUGh5c2ljYWxEZXZpY2VDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcy1wUGh5c2ljYWxEZXZpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBQaHlzaWNhbERldmljZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wUGh5c2ljYWxEZXZpY2VzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBQaHlzaWNhbERldmljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUGh5c2ljYWxEZXZpY2VDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczJcIj5Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSXCI+VmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSXCI+VmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllc1wiPlZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllc1wiPlZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYXCI+VmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllc1wiPlZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllczwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllczwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WXCI+VmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRFwiPlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRFwiPlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlZcIj5Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlZcIj5Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllc1wiPlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDwvYT4sIG9yIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMsVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMsVktfS0hSX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSsoVktfS0hSX2RyaXZlcl9wcm9wZXJ0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSsoVktfRVhUX3BjaV9idXNfaW5mbykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUENJX0JVU19JTkZPX1BST1BFUlRJRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMtcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMtcFF1ZXVlRmFtaWx5UHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wUXVldWVGYW1pbHlQcm9wZXJ0aWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzXCI+VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyLXBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1wUXVldWVGYW1pbHlQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFF1ZXVlRmFtaWx5UHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyXCI+VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlZcIj5Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOVjwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpKyhWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9DSEVDS1BPSU5UX1BST1BFUlRJRVNfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSIjogeworICAgICAgIihWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFItcENvdW50ZXJDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ291bnRlckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUi1wQ291bnRlcnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cENvdW50ZXJDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cENvdW50ZXJzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBDb3VudGVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBDb3VudGVyQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFJcIj5Wa1BlcmZvcm1hbmNlQ291bnRlcktIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSLXBDb3VudGVyRGVzY3JpcHRpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBDb3VudGVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBDb3VudGVyRGVzY3JpcHRpb25zPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBDb3VudGVyRGVzY3JpcHRpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cENvdW50ZXJDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSXCI+VmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGVyZm9ybWFuY2VDb3VudGVyS0hSIjogeworICAgICAgIihWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BlcmZvcm1hbmNlQ291bnRlcktIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGVyZm9ybWFuY2VDb3VudGVyS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiI6IHsKKyAgICAgICIoVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0RFU0NSSVBUSU9OX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwcy1pbnN0YW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMtcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUGh5c2ljYWxEZXZpY2VHcm91cENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMtcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBQaHlzaWNhbERldmljZUdyb3VwQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUGh5c2ljYWxEZXZpY2VHcm91cENvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0dST1VQX1BST1BFUlRJRVM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVEZXZpY2UiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXZpY2UtcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtMDEzODciLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgPGEgaHJlZj1cIiNleHRlbmRpbmd2dWxrYW4tZXh0ZW5zaW9ucy1leHRlbnNpb25kZXBlbmRlbmNpZXNcIj5yZXF1aXJlZCBleHRlbnNpb25zPC9hPiBmb3IgZWFjaCBleHRlbnNpb24gaW4gdGhlIDxhIGhyZWY9XCIjVmtEZXZpY2VDcmVhdGVJbmZvXCI+VmtEZXZpY2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXM8L2NvZGU+IGxpc3QgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBiZSBwcmVzZW50IGluIHRoYXQgbGlzdC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGV2aWNlLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXZpY2UtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VDcmVhdGVJbmZvXCI+VmtEZXZpY2VDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGV2aWNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURldmljZS1wRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXZpY2VDcmVhdGVJbmZvIjogeworICAgICAgIiEoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcXVldWVGYW1pbHlJbmRleC0wMDM3MiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5xdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBRdWV1ZUNyZWF0ZUluZm9zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUgd2l0aGluIDxjb2RlPnBRdWV1ZUNyZWF0ZUluZm9zPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcXVldWVGYW1pbHlJbmRleC0wMjgwMiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5xdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBRdWV1ZUNyZWF0ZUluZm9zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUgd2l0aGluIDxjb2RlPnBRdWV1ZUNyZWF0ZUluZm9zPC9jb2RlPiwgZXhjZXB0IHRoYXQgdHdvIG1lbWJlcnMgY2FuIHNoYXJlIHRoZSBzYW1lIDxjb2RlPnF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGlmIG9uZSBpcyBhIHByb3RlY3RlZC1jYXBhYmxlIHF1ZXVlIGFuZCBvbmUgaXMgbm90IGEgcHJvdGVjdGVkLWNhcGFibGUgcXVldWUuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wTmV4dC0wMDM3MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJcIj5Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyPC9hPiBzdHJ1Y3R1cmUsIHRoZW4gPGNvZGU+cEVuYWJsZWRGZWF0dXJlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0FNRF9uZWdhdGl2ZV92aWV3cG9ydF9oZWlnaHQpKyhWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy0wMTg0MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT48YSBocmVmPVwiI1ZLX0FNRF9uZWdhdGl2ZV92aWV3cG9ydF9oZWlnaHRcIj5WS19BTURfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0PC9hPjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0FNRF9uZWdhdGl2ZV92aWV3cG9ydF9oZWlnaHQpKyEoVktfVkVSU0lPTl8xXzEpKyhWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAwMzc0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIGJvdGggPGNvZGU+PGEgaHJlZj1cIiNWS19LSFJfbWFpbnRlbmFuY2UxXCI+VktfS0hSX21haW50ZW5hbmNlMTwvYT48L2NvZGU+IGFuZCA8Y29kZT48YSBocmVmPVwiI1ZLX0FNRF9uZWdhdGl2ZV92aWV3cG9ydF9oZWlnaHRcIj5WS19BTURfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0PC9hPjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MrVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy0wMzMyOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiBib3RoIDxjb2RlPjxhIGhyZWY9XCIjVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzc1wiPlZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3M8L2E+PC9jb2RlPiBhbmQgPGNvZGU+PGEgaHJlZj1cIiNWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzXCI+VktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzczwvYT48L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnBOZXh0PC9jb2RlPiBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvXCI+VmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm88L2E+LCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EXCI+VmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlc1wiPlZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlczwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EXCI+VmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WXCI+VmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlY8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlZcIj5Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WXCI+VmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMlwiPlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WXCI+VmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzXCI+VmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSXCI+VmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlc1wiPlZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlczwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlY8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXNcIj5Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSXCI+VmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSXCI+VmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXNcIj5Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlczwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUxcIj5Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlZcIj5Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlY8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WXCI+VmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSXCI+VmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFI8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUjwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlc1wiPlZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXM8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSPC9hPiwgb3IgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnNUeXBlPC9jb2RlPiBtZW1iZXIgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBRdWV1ZUNyZWF0ZUluZm9zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBRdWV1ZUNyZWF0ZUluZm9zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cXVldWVDcmVhdGVJbmZvQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm9cIj5Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBwRW5hYmxlZExheWVyTmFtZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZW5hYmxlZExheWVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cHBFbmFibGVkTGF5ZXJOYW1lczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmVuYWJsZWRMYXllckNvdW50PC9jb2RlPiBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5ncyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmVuYWJsZWRFeHRlbnNpb25Db3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmVuYWJsZWRFeHRlbnNpb25Db3VudDwvY29kZT4gbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZ3MiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wRW5hYmxlZEZlYXR1cmVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBFbmFibGVkRmVhdHVyZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEVuYWJsZWRGZWF0dXJlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXNcIj5Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXF1ZXVlQ3JlYXRlSW5mb0NvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWVDcmVhdGVJbmZvQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8tcFBoeXNpY2FsRGV2aWNlcy0wMDM3NSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUGh5c2ljYWxEZXZpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvLXBQaHlzaWNhbERldmljZXMtMDAzNzYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgPGNvZGU+cFBoeXNpY2FsRGV2aWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIHNhbWUgZGV2aWNlIGdyb3VwIGFzIGVudW1lcmF0ZWQgYnkgPGEgaHJlZj1cIiN2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzXCI+dmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvLXBoeXNpY2FsRGV2aWNlQ291bnQtMDAzNzciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waHlzaWNhbERldmljZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIHRoZSA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gcGFyYW1ldGVyIG9mIDxhIGhyZWY9XCIjdmtDcmVhdGVEZXZpY2VcIj52a0NyZWF0ZURldmljZTwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYW4gZWxlbWVudCBvZiA8Y29kZT5wUGh5c2ljYWxEZXZpY2VzPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mby1wUGh5c2ljYWxEZXZpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBoeXNpY2FsRGV2aWNlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFBoeXNpY2FsRGV2aWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBoeXNpY2FsRGV2aWNlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCI6IHsKKyAgICAgICIoVktfQU1EX21lbW9yeV9vdmVyYWxsb2NhdGlvbl9iZWhhdmlvcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1ELXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQ1JFQVRFX0lORk9fQU1EPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQtb3ZlcmFsbG9jYXRpb25CZWhhdmlvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vdmVyYWxsb2NhdGlvbkJlaGF2aW9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EXCI+VmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveURldmljZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXZpY2UtZGV2aWNlLTAwMzc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGNoaWxkIG9iamVjdHMgY3JlYXRlZCBvbiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBkZXN0cm95ZWQgcHJpb3IgdG8gZGVzdHJveWluZyA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXZpY2UtZGV2aWNlLTAwMzc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+ZGV2aWNlPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGV2aWNlLWRldmljZS0wMDM4MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmRldmljZTwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXZpY2UtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRldmljZTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURldmljZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXF1ZXVlRmFtaWx5SW5kZXgtMDAzODEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWV1ZUZhbWlseUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+cFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXF1ZXVlQ291bnQtMDAzODIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWV1ZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIDxjb2RlPnF1ZXVlQ291bnQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2NvZGU+IHN0cnVjdHVyZSwgYXMgcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczwvY29kZT4gaW4gdGhlIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2NvZGU+W3F1ZXVlRmFtaWx5SW5kZXhdIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1wUXVldWVQcmlvcml0aWVzLTAwMzgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBRdWV1ZVByaW9yaXRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MC4wPC9jb2RlPiBhbmQgPGNvZGU+MS4wPC9jb2RlPiBpbmNsdXNpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVFwiPlZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0c1wiPlZrRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1wUXVldWVQcmlvcml0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBRdWV1ZVByaW9yaXRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5xdWV1ZUNvdW50PC9jb2RlPiA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1xdWV1ZUNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2dsb2JhbF9wcmlvcml0eSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0dMT0JBTF9QUklPUklUWV9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhULWdsb2JhbFByaW9yaXR5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmdsb2JhbFByaW9yaXR5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWV1ZUdsb2JhbFByaW9yaXR5RVhUXCI+VmtRdWV1ZUdsb2JhbFByaW9yaXR5RVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0RGV2aWNlUXVldWUiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREZXZpY2VRdWV1ZS1xdWV1ZUZhbWlseUluZGV4LTAwMzg0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgb25lIG9mIHRoZSBxdWV1ZSBmYW1pbHkgaW5kaWNlcyBzcGVjaWZpZWQgd2hlbiA8Y29kZT5kZXZpY2U8L2NvZGU+IHdhcyBjcmVhdGVkLCB2aWEgdGhlIDxjb2RlPlZrRGV2aWNlUXVldWVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlUXVldWUtcXVldWVJbmRleC0wMDM4NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXVlSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXVlcyBjcmVhdGVkIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlIGZhbWlseSBpbmRleCB3aGVuIDxjb2RlPmRldmljZTwvY29kZT4gd2FzIGNyZWF0ZWQsIHZpYSB0aGUgPGNvZGU+cXVldWVDb3VudDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZVF1ZXVlLWZsYWdzLTAxODQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGEgaHJlZj1cIiNWa0RldmljZVF1ZXVlQ3JlYXRlSW5mb1wiPlZrRGV2aWNlUXVldWVDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgdG8gemVybyB3aGVuIDxjb2RlPmRldmljZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlUXVldWUtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREZXZpY2VRdWV1ZS1wUXVldWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFF1ZXVlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrUXVldWVcIj5Wa1F1ZXVlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldERldmljZVF1ZXVlMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZVF1ZXVlMi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZVF1ZXVlMi1wUXVldWVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBRdWV1ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VRdWV1ZUluZm8yXCI+VmtEZXZpY2VRdWV1ZUluZm8yPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlUXVldWUyLXBRdWV1ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUXVldWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtRdWV1ZVwiPlZrUXVldWU8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGV2aWNlUXVldWVJbmZvMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZVF1ZXVlSW5mbzItcXVldWVGYW1pbHlJbmRleC0wMTg0MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZSBvZiB0aGUgcXVldWUgZmFtaWx5IGluZGljZXMgc3BlY2lmaWVkIHdoZW4gPGNvZGU+ZGV2aWNlPC9jb2RlPiB3YXMgY3JlYXRlZCwgdmlhIHRoZSA8Y29kZT5Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZVF1ZXVlSW5mbzItcXVldWVJbmRleC0wMTg0MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXVlSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXVlcyBjcmVhdGVkIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlIGZhbWlseSBpbmRleCBhbmQgPGEgaHJlZj1cIiNWa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ3NcIj5Wa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ3M8L2E+IG1lbWJlciA8Y29kZT5mbGFnczwvY29kZT4gZXF1YWwgdG8gdGhpcyA8Y29kZT5mbGFnczwvY29kZT4gdmFsdWUgd2hlbiA8Y29kZT5kZXZpY2U8L2NvZGU+IHdhcyBjcmVhdGVkLCB2aWEgdGhlIDxjb2RlPnF1ZXVlQ291bnQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VRdWV1ZUluZm8yLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9JTkZPXzI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZVF1ZXVlSW5mbzItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlUXVldWVJbmZvMi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0c1wiPlZrRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVDb21tYW5kUG9vbCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUNvbW1hbmRQb29sLXF1ZXVlRmFtaWx5SW5kZXgtMDE5MzciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4tJmd0O3F1ZXVlRmFtaWx5SW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIGluZGV4IG9mIGEgcXVldWUgZmFtaWx5IGF2YWlsYWJsZSBpbiB0aGUgbG9naWNhbCBkZXZpY2UgPGNvZGU+ZGV2aWNlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQ29tbWFuZFBvb2wtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVDb21tYW5kUG9vbC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRQb29sQ3JlYXRlSW5mb1wiPlZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQ29tbWFuZFBvb2wtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQ29tbWFuZFBvb2wtcENvbW1hbmRQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDb21tYW5kUG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0NvbW1hbmRQb29sXCI+VmtDb21tYW5kUG9vbDwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtDb21tYW5kUG9vbENyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21tYW5kUG9vbENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21tYW5kUG9vbENyZWF0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzXCI+VmtDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1RyaW1Db21tYW5kUG9vbCI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrVHJpbUNvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrVHJpbUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kUG9vbFwiPlZrQ29tbWFuZFBvb2w8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtUcmltQ29tbWFuZFBvb2wtZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrVHJpbUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtSZXNldENvbW1hbmRQb29sIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1jb21tYW5kUG9vbC0wMDA0MCIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCA8Y29kZT5Wa0NvbW1hbmRCdWZmZXI8L2NvZGU+IG9iamVjdHMgYWxsb2NhdGVkIGZyb20gPGNvZGU+Y29tbWFuZFBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5wZW5kaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldENvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1jb21tYW5kUG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kUG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZFBvb2xcIj5Wa0NvbW1hbmRQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzXCI+VmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldENvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95Q29tbWFuZFBvb2wiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtMDAwNDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgPGNvZGU+VmtDb21tYW5kQnVmZmVyPC9jb2RlPiBvYmplY3RzIGFsbG9jYXRlZCBmcm9tIDxjb2RlPmNvbW1hbmRQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cGVuZGluZyBzdGF0ZTwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lDb21tYW5kUG9vbC1jb21tYW5kUG9vbC0wMDA0MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmNvbW1hbmRQb29sPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtMDAwNDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5jb21tYW5kUG9vbDwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lDb21tYW5kUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lDb21tYW5kUG9vbC1jb21tYW5kUG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kUG9vbDwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmNvbW1hbmRQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kUG9vbFwiPlZrQ29tbWFuZFBvb2w8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRQb29sPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzLXBBbGxvY2F0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEFsbG9jYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm9cIj5Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzLXBDb21tYW5kQnVmZmVycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wQWxsb2NhdGVJbmZvPC9jb2RlPjo6Y29tbWFuZEJ1ZmZlckNvdW50IDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMtcEFsbG9jYXRlSW5mbzo6Y29tbWFuZEJ1ZmZlckNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cEFsbG9jYXRlSW5mbzwvY29kZT46Ojxjb2RlPmNvbW1hbmRCdWZmZXJDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mby1jb21tYW5kQnVmZmVyQ291bnQtMDAwNDQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mby1jb21tYW5kUG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kUG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZFBvb2xcIj5Wa0NvbW1hbmRQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mby1sZXZlbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5sZXZlbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlckxldmVsXCI+VmtDb21tYW5kQnVmZmVyTGV2ZWw8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtSZXNldENvbW1hbmRCdWZmZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldENvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA0NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5wZW5kaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldENvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA0NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSBhIHBvb2wgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1Jlc2V0Q29tbWFuZEJ1ZmZlci1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHNcIj5Wa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0ZyZWVDb21tYW5kQnVmZmVycyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1wQ29tbWFuZEJ1ZmZlcnMtMDAwNDciLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cGVuZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRnJlZUNvbW1hbmRCdWZmZXJzLXBDb21tYW5kQnVmZmVycy0wMDA0OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmNvbW1hbmRCdWZmZXJDb3VudDwvY29kZT4gPGNvZGU+VmtDb21tYW5kQnVmZmVyPC9jb2RlPiBoYW5kbGVzLCBlYWNoIGVsZW1lbnQgb2Ygd2hpY2ggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWl0aGVyIGJlIGEgdmFsaWQgaGFuZGxlIG9yIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1jb21tYW5kUG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kUG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZFBvb2xcIj5Wa0NvbW1hbmRQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRnJlZUNvbW1hbmRCdWZmZXJzLWNvbW1hbmRCdWZmZXJDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXJDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1jb21tYW5kUG9vbC1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kUG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtGcmVlQ29tbWFuZEJ1ZmZlcnMtcENvbW1hbmRCdWZmZXJzLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IHRoYXQgaXMgYSB2YWxpZCBoYW5kbGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+Y29tbWFuZFBvb2w8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtCZWdpbkNvbW1hbmRCdWZmZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCZWdpbkNvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA0OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgb3IgcGVuZGluZyBzdGF0ZTwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JlZ2luQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDUwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIGEgPGEgaHJlZj1cIiNWa0NvbW1hbmRQb29sXCI+VmtDb21tYW5kUG9vbDwvYT4gd2hpY2ggZGlkIG5vdCBoYXZlIHRoZSA8Y29kZT5WS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDwvY29kZT4gZmxhZyBzZXQsIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPmluaXRpYWwgc3RhdGU8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCZWdpbkNvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA1MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGEgc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyLCB0aGUgPGNvZGU+cEluaGVyaXRhbmNlSW5mbzwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBCZWdpbkluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGNvZGU+VmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciBhbmQgZWl0aGVyIHRoZSA8Y29kZT5vY2NsdXNpb25RdWVyeUVuYWJsZTwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5wSW5oZXJpdGFuY2VJbmZvPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cEJlZ2luSW5mbzwvY29kZT4gaXMgPGNvZGU+VktfRkFMU0U8L2NvZGU+LCBvciB0aGUgcHJlY2lzZSBvY2NsdXNpb24gcXVlcmllcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB0aGUgPGNvZGU+cXVlcnlGbGFnczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5wSW5oZXJpdGFuY2VJbmZvPC9jb2RlPiBtZW1iZXIgPGNvZGU+cEJlZ2luSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUVVFUllfQ09OVFJPTF9QUkVDSVNFX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JlZ2luQ29tbWFuZEJ1ZmZlci1wQmVnaW5JbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBCZWdpbkluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvXCI+VmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWZsYWdzLTAwMDUzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVDwvY29kZT4sIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cEluaGVyaXRhbmNlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8Y29kZT5Wa1JlbmRlclBhc3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tZmxhZ3MtMDAwNTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUPC9jb2RlPiwgdGhlIDxjb2RlPnN1YnBhc3M8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wSW5oZXJpdGFuY2VJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHN1YnBhc3MgaW5kZXggd2l0aGluIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cEluaGVyaXRhbmNlSW5mbzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1mbGFncy0wMDA1NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQ8L2NvZGU+LCB0aGUgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wSW5oZXJpdGFuY2VJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgb3IgYSB2YWxpZCA8Y29kZT5Wa0ZyYW1lYnVmZmVyPC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBJbmhlcml0YW5jZUluZm88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvXCI+VmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm88L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzXCI+VmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1vY2NsdXNpb25RdWVyeUVuYWJsZS0wMDA1NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWluaGVyaXRlZFF1ZXJpZXNcIj5pbmhlcml0ZWQgcXVlcmllczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+b2NjbHVzaW9uUXVlcnlFbmFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvLXF1ZXJ5RmxhZ3MtMDAwNTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1pbmhlcml0ZWRRdWVyaWVzXCI+aW5oZXJpdGVkIHF1ZXJpZXM8L2E+IGZlYXR1cmUgaXMgZW5hYmxlZCwgPGNvZGU+cXVlcnlGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUXVlcnlDb250cm9sRmxhZ0JpdHNcIj5Wa1F1ZXJ5Q29udHJvbEZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1xdWVyeUZsYWdzLTAyNzg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtaW5oZXJpdGVkUXVlcmllc1wiPmluaGVyaXRlZCBxdWVyaWVzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5xdWVyeUZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvLXBpcGVsaW5lU3RhdGlzdGljcy0wMjc4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5XCI+cGlwZWxpbmUgc3RhdGlzdGljcyBxdWVyaWVzPC9hPiBmZWF0dXJlIGlzIGVuYWJsZWQsIDxjb2RlPnBpcGVsaW5lU3RhdGlzdGljczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzXCI+VmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvLXBpcGVsaW5lU3RhdGlzdGljcy0wMDA1OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5XCI+cGlwZWxpbmUgc3RhdGlzdGljcyBxdWVyaWVzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5waXBlbGluZVN0YXRpc3RpY3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUXCI+VmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfY29uZGl0aW9uYWxfcmVuZGVyaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQtY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGUtMDE5NzciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1pbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZ1wiPmluaGVyaXRlZCBjb25kaXRpb25hbCByZW5kZXJpbmc8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GQUxTRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0VuZENvbW1hbmRCdWZmZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNTkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhIHByaW1hcnkgY29tbWFuZCBidWZmZXIsIHRoZXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhbiBhY3RpdmUgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDYxIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHF1ZXJpZXMgbWFkZSA8YSBocmVmPVwiI3F1ZXJpZXMtb3BlcmF0aW9uLWFjdGl2ZVwiPmFjdGl2ZTwvYT4gZHVyaW5nIHRoZSByZWNvcmRpbmcgb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIG1hZGUgaW5hY3RpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1Ob25lLTAxOTc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgQ29uZGl0aW9uYWwgcmVuZGVyaW5nIG11c3Qgbm90IGJlIDxhIGhyZWY9XCIjYWN0aXZlLWNvbmRpdGlvbmFsLXJlbmRlcmluZ1wiPmFjdGl2ZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9kZWJ1Z191dGlscykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAxODE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIsIHRoZXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhbiBvdXRzdGFuZGluZyA8YSBocmVmPVwiI3ZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFRcIj52a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUPC9hPiBjb21tYW5kIHJlY29yZGVkIHRvIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHRoYXQgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gZW5kZWQgYnkgYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFRcIj52a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVDwvYT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZGVidWdfbWFya2VyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciwgdGhlcmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFuIG91dHN0YW5kaW5nIDxhIGhyZWY9XCIjdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUXCI+dmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUPC9hPiBjb21tYW5kIHJlY29yZGVkIHRvIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHRoYXQgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gZW5kZWQgYnkgYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtDbWREZWJ1Z01hcmtlckVuZEVYVFwiPnZrQ21kRGVidWdNYXJrZXJFbmRFWFQ8L2E+LiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrUXVldWVTdWJtaXQiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVN1Ym1pdC1mZW5jZS0wMDA2MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZlbmNlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+ZmVuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuc2lnbmFsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVTdWJtaXQtZmVuY2UtMDAwNjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mZW5jZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBvdGhlciBxdWV1ZSBjb21tYW5kIHRoYXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGV4ZWN1dGlvbiBvbiB0aGF0IHF1ZXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA2NSIsCisgICAgICAgICAgInRleHQiOiAiIEFueSBjYWxscyB0byA8YSBocmVmPVwiI3ZrQ21kU2V0RXZlbnRcIj52a0NtZFNldEV2ZW50PC9hPiwgPGEgaHJlZj1cIiN2a0NtZFJlc2V0RXZlbnRcIj52a0NtZFJlc2V0RXZlbnQ8L2E+IG9yIDxhIGhyZWY9XCIjdmtDbWRXYWl0RXZlbnRzXCI+dmtDbWRXYWl0RXZlbnRzPC9hPiB0aGF0IGhhdmUgYmVlbiByZWNvcmRlZCBpbnRvIGFueSBvZiB0aGUgY29tbWFuZCBidWZmZXIgZWxlbWVudHMgb2YgdGhlIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBTdWJtaXRzPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IHJlZmVyZW5jZSBhbnkgPGEgaHJlZj1cIiNWa0V2ZW50XCI+VmtFdmVudDwvYT4gdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFueSBvZiB0aG9zZSBjb21tYW5kcyBpbiBhIGNvbW1hbmQgYnVmZmVyIHRoYXQgaGFzIGJlZW4gc3VibWl0dGVkIHRvIGFub3RoZXIgcXVldWUgYW5kIGlzIHN0aWxsIGluIHRoZSA8ZW0+cGVuZGluZyBzdGF0ZTwvZW0+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU3VibWl0LXBXYWl0RHN0U3RhZ2VNYXNrLTAwMDY2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IHN0YWdlIGZsYWcgaW5jbHVkZWQgaW4gYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBXYWl0RHN0U3RhZ2VNYXNrPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFN1Ym1pdHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcGlwZWxpbmUgc3RhZ2Ugc3VwcG9ydGVkIGJ5IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzIG9mIDxjb2RlPnF1ZXVlPC9jb2RlPiwgYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1waXBlbGluZS1zdGFnZXMtc3VwcG9ydGVkXCI+dGFibGUgb2Ygc3VwcG9ydGVkIHBpcGVsaW5lIHN0YWdlczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVTdWJtaXQtcFNpZ25hbFNlbWFwaG9yZXMtMDAwNjciLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBTaWduYWxTZW1hcGhvcmVzPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFN1Ym1pdHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuc2lnbmFsZWQgd2hlbiB0aGUgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb24gaXQgZGVmaW5lcyBpcyBleGVjdXRlZCBvbiB0aGUgZGV2aWNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU3VibWl0LXBXYWl0U2VtYXBob3Jlcy0wMDA2OCIsCisgICAgICAgICAgInRleHQiOiAiIFdoZW4gYSBzZW1hcGhvcmUgd2FpdCBvcGVyYXRpb24gcmVmZXJyaW5nIHRvIGEgYmluYXJ5IHNlbWFwaG9yZSBkZWZpbmVkIGJ5IGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wV2FpdFNlbWFwaG9yZXM8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wU3VibWl0czwvY29kZT4gZXhlY3V0ZXMgb24gPGNvZGU+cXVldWU8L2NvZGU+LCB0aGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBubyBvdGhlciBxdWV1ZXMgd2FpdGluZyBvbiB0aGUgc2FtZSBzZW1hcGhvcmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAwMDcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFN1Ym1pdHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnBlbmRpbmcgb3IgZXhlY3V0YWJsZSBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAwMDcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBTdWJtaXRzPC9jb2RlPiB3YXMgbm90IHJlY29yZGVkIHdpdGggdGhlIDxjb2RlPlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnBlbmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3MiIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLXNlY29uZGFyeVwiPnNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlcnMgcmVjb3JkZWQ8L2E+IGludG8gYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBTdWJtaXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5wZW5kaW5nIG9yIGV4ZWN1dGFibGUgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLXNlY29uZGFyeVwiPnNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlcnMgcmVjb3JkZWQ8L2E+IGludG8gYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBTdWJtaXRzPC9jb2RlPiB3YXMgbm90IHJlY29yZGVkIHdpdGggdGhlIDxjb2RlPlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnBlbmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3NCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiB0aGUgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBTdWJtaXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gYSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IHdhcyBjcmVhdGVkIGZvciB0aGUgc2FtZSBxdWV1ZSBmYW1pbHkgPGNvZGU+cXVldWU8L2NvZGU+IGJlbG9uZ3MgdG8iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVTdWJtaXQtcFN1Ym1pdHMtMDIyMDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wU3VibWl0czwvY29kZT4tJmd0O3BDb21tYW5kQnVmZmVycyBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLXF1ZXVlLXRyYW5zZmVycy1hY3F1aXJlXCI+UXVldWUgRmFtaWx5IFRyYW5zZmVyIEFjcXVpcmUgT3BlcmF0aW9uPC9hPiwgdGhlcmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXhpc3QgYSBwcmV2aW91c2x5IHN1Ym1pdHRlZCA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1xdWV1ZS10cmFuc2ZlcnMtcmVsZWFzZVwiPlF1ZXVlIEZhbWlseSBUcmFuc2ZlciBSZWxlYXNlIE9wZXJhdGlvbjwvYT4gb24gYSBxdWV1ZSBpbiB0aGUgcXVldWUgZmFtaWx5IGlkZW50aWZpZWQgYnkgdGhlIGFjcXVpcmUgb3BlcmF0aW9uLCB3aXRoIHBhcmFtZXRlcnMgbWF0Y2hpbmcgdGhlIGFjcXVpcmUgb3BlcmF0aW9uIGFzIGRlZmluZWQgaW4gdGhlIGRlZmluaXRpb24gb2Ygc3VjaCA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1xdWV1ZS10cmFuc2ZlcnMtYWNxdWlyZVwiPmFjcXVpcmUgb3BlcmF0aW9uczwvYT4sIGFuZCB3aGljaCBoYXBwZW5zIGJlZm9yZSB0aGUgYWNxdWlyZSBvcGVyYXRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVTdWJtaXQtcFN1Ym1pdHMtMDI4MDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgcmVzb3VyY2UgY3JlYXRlZCB3aXRoIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU8L2NvZGU+IHRoYXQgaXMgcmVhZCBieSBhbiBvcGVyYXRpb24gc3BlY2lmaWVkIGJ5IDxjb2RlPnBTdWJtaXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgb3duZWQgYnkgYW55IHF1ZXVlIGZhbWlseSBvdGhlciB0aGFuIHRoZSBvbmUgd2hpY2ggPGNvZGU+cXVldWU8L2NvZGU+IGJlbG9uZ3MgdG8sIGF0IHRoZSB0aW1lIGl0IGlzIGV4ZWN1dGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU3VibWl0LXF1ZXVlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXVlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWV1ZVwiPlZrUXVldWU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVN1Ym1pdC1wU3VibWl0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zdWJtaXRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wU3VibWl0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnN1Ym1pdENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrU3VibWl0SW5mb1wiPlZrU3VibWl0SW5mbzwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVN1Ym1pdC1mZW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mZW5jZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGZW5jZVwiPlZrRmVuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVN1Ym1pdC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmZlbmNlPC9jb2RlPiwgYW5kIDxjb2RlPnF1ZXVlPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU3VibWl0LXBXYWl0U2VtYXBob3Jlcy0wMDA2OSIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBlbGVtZW50cyBvZiB0aGUgPGNvZGU+cFdhaXRTZW1hcGhvcmVzPC9jb2RlPiBtZW1iZXIgb2YgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTdWJtaXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzZW1hcGhvcmVzIHRoYXQgYXJlIHNpZ25hbGVkLCBvciBoYXZlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLXNlbWFwaG9yZXMtc2lnbmFsaW5nXCI+c2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb25zPC9hPiBwcmV2aW91c2x5IHN1Ym1pdHRlZCBmb3IgZXhlY3V0aW9uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfdGltZWxpbmVfc2VtYXBob3JlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVN1Ym1pdC1wV2FpdFNlbWFwaG9yZXMtMDMyMzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgdGhlIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gbWVtYmVyIG9mIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU3VibWl0czwvY29kZT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVLSFJcIj5Wa1NlbWFwaG9yZVR5cGVLSFI8L2E+IG9mIDxjb2RlPlZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHJlZmVyZW5jZSBhIHNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uIHRoYXQgaGFzIGJlZW4gc3VibWl0dGVkIGZvciBleGVjdXRpb24gYW5kIGFueSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbnMgb24gd2hpY2ggaXQgZGVwZW5kcyAoaWYgYW55KSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGFsc28gYmVlbiBzdWJtaXR0ZWQgZm9yIGV4ZWN1dGlvbiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVN1Ym1pdC1wQ29tbWFuZEJ1ZmZlcnMtMDMyMjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIGNvbW1hbmQgcmVjb3JkZWQgaW50byBhbnkgZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IHdhcyBhIDxhIGhyZWY9XCIjdmtDbWRCZWdpblF1ZXJ5XCI+dmtDbWRCZWdpblF1ZXJ5PC9hPiB3aG9zZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSPC9jb2RlPiwgdGhlIDxhIGhyZWY9XCIjcHJvZmlsaW5nLWxvY2tcIj5wcm9maWxpbmcgbG9jazwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGhlbGQgY29udGludW91c2x5IG9uIHRoZSA8Y29kZT5Wa0RldmljZTwvY29kZT4gdGhhdCA8Y29kZT5xdWV1ZTwvY29kZT4gd2FzIHJldHJpZXZlZCBmcm9tLCB0aHJvdWdob3V0IHJlY29yZGluZyBvZiB0aG9zZSBjb21tYW5kIGJ1ZmZlcnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1Ym1pdEluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJtaXRJbmZvLXBDb21tYW5kQnVmZmVycy0wMDA3NSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggPGNvZGU+VktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAwMDc2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZ2VvbWV0cnlTaGFkZXJcIj5nZW9tZXRyeSBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFdhaXREc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDAwNzciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10ZXNzZWxsYXRpb25TaGFkZXJcIj50ZXNzZWxsYXRpb24gc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBXYWl0RHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUPC9jb2RlPiBvciA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAwMDc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBXYWl0RHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1Ym1pdEluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1Ym1pdEluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnBOZXh0PC9jb2RlPiBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFJcIj5Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSPC9hPiwgPGEgaHJlZj1cIiNWa0RldmljZUdyb3VwU3VibWl0SW5mb1wiPlZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvPC9hPiwgPGEgaHJlZj1cIiNWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSXCI+VmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUjwvYT4sIDxhIGhyZWY9XCIjVmtQcm90ZWN0ZWRTdWJtaXRJbmZvXCI+VmtQcm90ZWN0ZWRTdWJtaXRJbmZvPC9hPiwgPGEgaHJlZj1cIiNWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUlwiPlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPC9hPiwgPGEgaHJlZj1cIiNWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUlwiPlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSPC9hPiwgb3IgPGEgaHJlZj1cIiNWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WXCI+VmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VibWl0SW5mby1zVHlwZS11bmlxdWUiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnNUeXBlPC9jb2RlPiBtZW1iZXIgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPndhaXRTZW1hcGhvcmVDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVwiPlZrU2VtYXBob3JlPC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBXYWl0RHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiB2YWxpZCBjb21iaW5hdGlvbnMgb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU3RhZ2VGbGFnQml0c1wiPlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VibWl0SW5mby1wV2FpdERzdFN0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFdhaXREc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJtaXRJbmZvLXBDb21tYW5kQnVmZmVycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlckNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJtaXRJbmZvLXBTaWduYWxTZW1hcGhvcmVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNpZ25hbFNlbWFwaG9yZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBTaWduYWxTZW1hcGhvcmVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVcIj5Wa1NlbWFwaG9yZTwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJtaXRJbmZvLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggb2YgdGhlIGVsZW1lbnRzIG9mIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4sIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wU2lnbmFsU2VtYXBob3JlczwvY29kZT4sIGFuZCB0aGUgZWxlbWVudHMgb2YgPGNvZGU+cFdhaXRTZW1hcGhvcmVzPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtMDMyMzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wV2FpdFNlbWFwaG9yZXM8L2NvZGU+IG9yIDxjb2RlPnBTaWduYWxTZW1hcGhvcmVzPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVLSFJcIj5Wa1NlbWFwaG9yZVR5cGVLSFI8L2E+IG9mIDxjb2RlPlZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUjwvY29kZT4sIHRoZW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIGEgPGEgaHJlZj1cIiNWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUlwiPlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VibWl0SW5mby1wTmV4dC0wMzI0MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgdGhpcyBzdHJ1Y3R1cmUgaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSXCI+VmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI8L2E+IHN0cnVjdHVyZSBhbmQgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFdhaXRTZW1hcGhvcmVzPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVLSFJcIj5Wa1NlbWFwaG9yZVR5cGVLSFI8L2E+IG9mIDxjb2RlPlZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUjwvY29kZT4sIHRoZW4gaXRzIDxjb2RlPndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50PC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgPGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJtaXRJbmZvLXBOZXh0LTAzMjQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiB0aGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFJcIj5Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUjwvYT4gc3RydWN0dXJlIGFuZCBhbnkgZWxlbWVudCBvZiA8Y29kZT5wU2lnbmFsU2VtYXBob3JlczwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+LCB0aGVuIGl0cyA8Y29kZT5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50PC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgPGNvZGU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBTaWduYWxTZW1hcGhvcmVzPC9jb2RlPiBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrU2VtYXBob3JlVHlwZUtIUlwiPlZrU2VtYXBob3JlVHlwZUtIUjwvYT4gb2YgPGNvZGU+VktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSPC9jb2RlPiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIDxhIGhyZWY9XCIjVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFJcIj5Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUjwvYT46OnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlIHdoZW4gdGhlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLXNlbWFwaG9yZXMtc2lnbmFsaW5nXCI+c2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb248L2E+IGlzIGV4ZWN1dGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVzLTAzMjQzIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wV2FpdFNlbWFwaG9yZXM8L2NvZGU+IGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgPGEgaHJlZj1cIiNWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUlwiPlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPC9hPjo6cFdhaXRTZW1hcGhvcmVWYWx1ZXMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIHZhbHVlIHdoaWNoIGRvZXMgbm90IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUgb3IgdGhlIHZhbHVlIG9mIGFueSBvdXRzdGFuZGluZyBzZW1hcGhvcmUgd2FpdCBvciBzaWduYWwgb3BlcmF0aW9uIG9uIHRoYXQgc2VtYXBob3JlIGJ5IG1vcmUgdGhhbiA8YSBocmVmPVwiI2xpbWl0cy1tYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZVwiPjxjb2RlPm1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlPC9jb2RlPjwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBTaWduYWxTZW1hcGhvcmVzPC9jb2RlPiBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrU2VtYXBob3JlVHlwZUtIUlwiPlZrU2VtYXBob3JlVHlwZUtIUjwvYT4gb2YgPGNvZGU+VktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSPC9jb2RlPiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIDxhIGhyZWY9XCIjVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFJcIj5Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUjwvYT46OnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIHZhbHVlIHdoaWNoIGRvZXMgbm90IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUgb3IgdGhlIHZhbHVlIG9mIGFueSBvdXRzdGFuZGluZyBzZW1hcGhvcmUgd2FpdCBvciBzaWduYWwgb3BlcmF0aW9uIG9uIHRoYXQgc2VtYXBob3JlIGJ5IG1vcmUgdGhhbiA8YSBocmVmPVwiI2xpbWl0cy1tYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZVwiPjxjb2RlPm1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlPC9jb2RlPjwvYT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VibWl0SW5mby1wV2FpdERzdFN0YWdlTWFzay0wMjA4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLW1lc2hTaGFkZXJcIj5tZXNoIHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wV2FpdERzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAyMDkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGFza1NoYWRlclwiPnRhc2sgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBXYWl0RHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9USU1FTElORV9TRU1BUEhPUkVfU1VCTUlUX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFItcFdhaXRTZW1hcGhvcmVWYWx1ZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+d2FpdFNlbWFwaG9yZVZhbHVlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBXYWl0U2VtYXBob3JlVmFsdWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBXYWl0U2VtYXBob3JlVmFsdWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+d2FpdFNlbWFwaG9yZVZhbHVlQ291bnQ8L2NvZGU+IDxjb2RlPnVpbnQ2NF90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSLXBTaWduYWxTZW1hcGhvcmVWYWx1ZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFNpZ25hbFNlbWFwaG9yZVZhbHVlczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudDwvY29kZT4gPGNvZGU+dWludDY0X3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSLXdhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudC0wMDA3OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPndhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIHNhbWUgdmFsdWUgYXMgPGNvZGU+VmtTdWJtaXRJbmZvPC9jb2RlPjo6PGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiwgd2hlcmUgPGNvZGU+VmtTdWJtaXRJbmZvPC9jb2RlPiBpcyBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIHRoaXMgPGNvZGU+VmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUjwvY29kZT4gc3RydWN0dXJlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi1zaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudC0wMDA4MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB0aGUgc2FtZSB2YWx1ZSBhcyA8Y29kZT5Wa1N1Ym1pdEluZm88L2NvZGU+Ojo8Y29kZT5zaWduYWxTZW1hcGhvcmVDb3VudDwvY29kZT4sIHdoZXJlIDxjb2RlPlZrU3VibWl0SW5mbzwvY29kZT4gaXMgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiB0aGlzIDxjb2RlPlZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFI8L2NvZGU+IHN0cnVjdHVyZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRDNEMTJfRkVOQ0VfU1VCTUlUX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi1wV2FpdFNlbWFwaG9yZVZhbHVlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT53YWl0U2VtYXBob3JlVmFsdWVzQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBXYWl0U2VtYXBob3JlVmFsdWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBXYWl0U2VtYXBob3JlVmFsdWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+d2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50PC9jb2RlPiA8Y29kZT51aW50NjRfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSLXBTaWduYWxTZW1hcGhvcmVWYWx1ZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBTaWduYWxTZW1hcGhvcmVWYWx1ZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFNpZ25hbFNlbWFwaG9yZVZhbHVlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50PC9jb2RlPiA8Y29kZT51aW50NjRfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl93aW4zMl9rZXllZF9tdXRleCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBBY3F1aXJlU3luY3MtMDAwODEiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG1lbWJlciBvZiA8Y29kZT5wQWNxdWlyZVN5bmNzPC9jb2RlPiBhbmQgPGNvZGU+cFJlbGVhc2VTeW5jczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBkZXZpY2UgbWVtb3J5IG9iamVjdCBpbXBvcnRlZCBieSBzZXR0aW5nIDxhIGhyZWY9XCIjVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFJcIj5Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjwvYT46Ojxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IHRvIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfS01UX0JJVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1wQWNxdWlyZVN5bmNzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmFjcXVpcmVDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wQWNxdWlyZVN5bmNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YWNxdWlyZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBBY3F1aXJlS2V5cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hY3F1aXJlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEFjcXVpcmVLZXlzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YWNxdWlyZUNvdW50PC9jb2RlPiA8Y29kZT51aW50NjRfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1wQWNxdWlyZVRpbWVvdXRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmFjcXVpcmVDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wQWNxdWlyZVRpbWVvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YWNxdWlyZUNvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1wUmVsZWFzZVN5bmNzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnJlbGVhc2VDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wUmVsZWFzZVN5bmNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cmVsZWFzZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBSZWxlYXNlS2V5cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5yZWxlYXNlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFJlbGVhc2VLZXlzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cmVsZWFzZUNvdW50PC9jb2RlPiA8Y29kZT51aW50NjRfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQWNxdWlyZVN5bmNzPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wUmVsZWFzZVN5bmNzPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYiOiB7CisgICAgICAiKFZLX05WX3dpbjMyX2tleWVkX211dGV4KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYtcEFjcXVpcmVTeW5jcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hY3F1aXJlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEFjcXVpcmVTeW5jczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmFjcXVpcmVDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZU1lbW9yeVwiPlZrRGV2aWNlTWVtb3J5PC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBBY3F1aXJlS2V5cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hY3F1aXJlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEFjcXVpcmVLZXlzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YWNxdWlyZUNvdW50PC9jb2RlPiA8Y29kZT51aW50NjRfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hY3F1aXJlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YWNxdWlyZUNvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBSZWxlYXNlU3luY3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cmVsZWFzZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBSZWxlYXNlU3luY3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5yZWxlYXNlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VNZW1vcnlcIj5Wa0RldmljZU1lbW9yeTwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1wUmVsZWFzZUtleXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cmVsZWFzZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBSZWxlYXNlS2V5czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnJlbGVhc2VDb3VudDwvY29kZT4gPGNvZGU+dWludDY0X3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQWNxdWlyZVN5bmNzPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wUmVsZWFzZVN5bmNzPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUHJvdGVjdGVkU3VibWl0SW5mbyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1Byb3RlY3RlZFN1Ym1pdEluZm8tcHJvdGVjdGVkU3VibWl0LTAxODE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHByb3RlY3RlZCBtZW1vcnkgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+cHJvdGVjdGVkU3VibWl0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfVFJVRTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1Byb3RlY3RlZFN1Ym1pdEluZm8tcHJvdGVjdGVkU3VibWl0LTAxODE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cHJvdGVjdGVkU3VibWl0PC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiwgdGhlbiBlYWNoIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gYXJyYXkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1Byb3RlY3RlZFN1Ym1pdEluZm8tcHJvdGVjdGVkU3VibWl0LTAxODE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cHJvdGVjdGVkU3VibWl0PC9jb2RlPiBpcyA8Y29kZT5WS19GQUxTRTwvY29kZT4sIHRoZW4gZWFjaCBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IGFycmF5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcm90ZWN0ZWRTdWJtaXRJbmZvLXBOZXh0LTAxODE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrU3VibWl0SW5mbzwvY29kZT46Ojxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBkb2VzIG5vdCBpbmNsdWRlIGEgPGNvZGU+VmtQcm90ZWN0ZWRTdWJtaXRJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUsIHRoZW4gZWFjaCBlbGVtZW50IG9mIHRoZSBjb21tYW5kIGJ1ZmZlciBvZiB0aGUgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiBhcnJheSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlci4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHJvdGVjdGVkU3VibWl0SW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QUk9URUNURURfU1VCTUlUX0lORk88L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby13YWl0U2VtYXBob3JlQ291bnQtMDAwODIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT53YWl0U2VtYXBob3JlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtTdWJtaXRJbmZvXCI+VmtTdWJtaXRJbmZvPC9hPjo6PGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tY29tbWFuZEJ1ZmZlckNvdW50LTAwMDgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCA8YSBocmVmPVwiI1ZrU3VibWl0SW5mb1wiPlZrU3VibWl0SW5mbzwvYT46Ojxjb2RlPmNvbW1hbmRCdWZmZXJDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLXNpZ25hbFNlbWFwaG9yZUNvdW50LTAwMDg0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtTdWJtaXRJbmZvXCI+VmtTdWJtaXRJbmZvPC9hPjo6PGNvZGU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMtMDAwODUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgPGNvZGU+cFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzPC9jb2RlPiBhbmQgPGNvZGU+cFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGRldmljZSBpbmRpY2VzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzLTAwMDg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGRldmljZSBtYXNrcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPndhaXRTZW1hcGhvcmVDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT53YWl0U2VtYXBob3JlQ291bnQ8L2NvZGU+IDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLXBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb21tYW5kQnVmZmVyQ291bnQ8L2NvZGU+IDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLXBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNpZ25hbFNlbWFwaG9yZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L2NvZGU+IDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSLWNvdW50ZXJQYXNzSW5kZXgtMDMyMjEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb3VudGVyUGFzc0luZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBjb3VudGVyIHBhc3NlcyByZXF1aXJlZCBieSBhbnkgcXVlcmllcyB3aXRoaW4gdGhlIGJhdGNoLiBUaGUgcmVxdWlyZWQgbnVtYmVyIG9mIGNvdW50ZXIgcGFzc2VzIGZvciBhIHBlcmZvcm1hbmNlIHF1ZXJ5IGlzIG9idGFpbmVkIGJ5IGNhbGxpbmcgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSXCI+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kRXhlY3V0ZUNvbW1hbmRzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXItMDAwODciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggYSA8Y29kZT5sZXZlbDwvY29kZT4gb2YgPGNvZGU+VktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA4OCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBhIDxjb2RlPmxldmVsPC9jb2RlPiBvZiA8Y29kZT5WS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5wZW5kaW5nIG9yIGV4ZWN1dGFibGUgc3RhdGU8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiB3YXMgbm90IHJlY29yZGVkIHdpdGggdGhlIDxjb2RlPlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUPC9jb2RlPiBmbGFnLCBhbmQgaXQgd2FzIHJlY29yZGVkIGludG8gYW55IG90aGVyIHByaW1hcnkgY29tbWFuZCBidWZmZXIsIHRoYXQgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cGVuZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBlbGVtZW50IG9mIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gd2FzIG5vdCByZWNvcmRlZCB3aXRoIHRoZSA8Y29kZT5WS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVDwvY29kZT4gZmxhZywgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnBlbmRpbmcgc3RhdGU8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiB3YXMgbm90IHJlY29yZGVkIHdpdGggdGhlIDxjb2RlPlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUPC9jb2RlPiBmbGFnLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhbHJlYWR5IGJlZW4gcmVjb3JkZWQgdG8gPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IHdhcyBub3QgcmVjb3JkZWQgd2l0aCB0aGUgPGNvZGU+VktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQ8L2NvZGU+IGZsYWcsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5NCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSBhIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHRoZSBzYW1lIHF1ZXVlIGZhbWlseSBhcyB0aGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gZnJvbSB3aGljaCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb250ZW50cy0wMDA5NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZrQ21kRXhlY3V0ZUNvbW1hbmRzPC9jb2RlPiBpcyBiZWluZyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoYXQgcmVuZGVyIHBhc3MgaW5zdGFuY2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGJlZ3VuIHdpdGggdGhlIDxjb2RlPmNvbnRlbnRzPC9jb2RlPiBwYXJhbWV0ZXIgb2YgPGNvZGU+dmtDbWRCZWdpblJlbmRlclBhc3M8L2NvZGU+IHNldCB0byA8Y29kZT5WS19TVUJQQVNTX0NPTlRFTlRTX1NFQ09OREFSWV9DT01NQU5EX0JVRkZFUlM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52a0NtZEV4ZWN1dGVDb21tYW5kczwvY29kZT4gaXMgYmVpbmcgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gcmVjb3JkZWQgd2l0aCB0aGUgPGNvZGU+VktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dmtDbWRFeGVjdXRlQ29tbWFuZHM8L2NvZGU+IGlzIGJlaW5nIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHJlY29yZGVkIHdpdGggPGNvZGU+VmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvPC9jb2RlPjo6PGNvZGU+c3VicGFzczwvY29kZT4gc2V0IHRvIHRoZSBpbmRleCBvZiB0aGUgc3VicGFzcyB3aGljaCB0aGUgZ2l2ZW4gY29tbWFuZCBidWZmZXIgd2lsbCBiZSBleGVjdXRlZCBpbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcEluaGVyaXRhbmNlSW5mby0wMDA5OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZrQ21kRXhlY3V0ZUNvbW1hbmRzPC9jb2RlPiBpcyBiZWluZyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSByZW5kZXIgcGFzc2VzIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+cEJlZ2luSW5mbzwvY29kZT4tJmd0O3BJbmhlcml0YW5jZUluZm8tJmd0O3JlbmRlclBhc3MgbWVtYmVycyBvZiB0aGUgPGEgaHJlZj1cIiN2a0JlZ2luQ29tbWFuZEJ1ZmZlclwiPnZrQmVnaW5Db21tYW5kQnVmZmVyPC9hPiBjb21tYW5kcyB1c2VkIHRvIGJlZ2luIHJlY29yZGluZyBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI3JlbmRlcnBhc3MtY29tcGF0aWJpbGl0eVwiPmNvbXBhdGlibGU8L2E+IHdpdGggdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52a0NtZEV4ZWN1dGVDb21tYW5kczwvY29kZT4gaXMgYmVpbmcgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCBhbmQgYW55IGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiB3YXMgcmVjb3JkZWQgd2l0aCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mb1wiPlZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzwvYT46Ojxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiBub3QgZXF1YWwgdG8gPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgdGhhdCA8Y29kZT5Wa0ZyYW1lYnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGUgPGNvZGU+VmtGcmFtZWJ1ZmZlcjwvY29kZT4gdXNlZCBpbiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMTAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dmtDbWRFeGVjdXRlQ29tbWFuZHM8L2NvZGU+IGlzIG5vdCBiZWluZyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gcmVjb3JkZWQgd2l0aCB0aGUgPGNvZGU+VktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMDEwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWluaGVyaXRlZFF1ZXJpZXNcIj5pbmhlcml0ZWQgcXVlcmllczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYW55IHF1ZXJpZXMgPGEgaHJlZj1cIiNxdWVyaWVzLW9wZXJhdGlvbi1hY3RpdmVcIj5hY3RpdmU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMTAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaGFzIGEgPGNvZGU+VktfUVVFUllfVFlQRV9PQ0NMVVNJT048L2NvZGU+IHF1ZXJ5IDxhIGhyZWY9XCIjcXVlcmllcy1vcGVyYXRpb24tYWN0aXZlXCI+YWN0aXZlPC9hPiwgdGhlbiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gcmVjb3JkZWQgd2l0aCA8Y29kZT5Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm88L2NvZGU+Ojo8Y29kZT5vY2NsdXNpb25RdWVyeUVuYWJsZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMTAzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaGFzIGEgPGNvZGU+VktfUVVFUllfVFlQRV9PQ0NMVVNJT048L2NvZGU+IHF1ZXJ5IDxhIGhyZWY9XCIjcXVlcmllcy1vcGVyYXRpb24tYWN0aXZlXCI+YWN0aXZlPC9hPiwgdGhlbiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gcmVjb3JkZWQgd2l0aCA8Y29kZT5Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm88L2NvZGU+Ojo8Y29kZT5xdWVyeUZsYWdzPC9jb2RlPiBoYXZpbmcgYWxsIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBmb3IgdGhlIHF1ZXJ5IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMTA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaGFzIGEgPGNvZGU+VktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTPC9jb2RlPiBxdWVyeSA8YSBocmVmPVwiI3F1ZXJpZXMtb3BlcmF0aW9uLWFjdGl2ZVwiPmFjdGl2ZTwvYT4sIHRoZW4gZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBDb21tYW5kQnVmZmVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHJlY29yZGVkIHdpdGggPGNvZGU+VmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvPC9jb2RlPjo6PGNvZGU+cGlwZWxpbmVTdGF0aXN0aWNzPC9jb2RlPiBoYXZpbmcgYWxsIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbiB0aGUgPGNvZGU+VmtRdWVyeVBvb2w8L2NvZGU+IHRoZSBxdWVyeSB1c2VzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAxMDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cENvbW1hbmRCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmVnaW4gYW55IHF1ZXJ5IHR5cGVzIHRoYXQgYXJlIDxhIGhyZWY9XCIjcXVlcmllcy1vcGVyYXRpb24tYWN0aXZlXCI+YWN0aXZlPC9hPiBpbiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb21tYW5kQnVmZmVyQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IHRyYW5zZmVyLCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1idWZmZXJsZXZlbCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcHJpbWFyeSA8Y29kZT5Wa0NvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMTgyMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMTgyMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQ29tbWFuZEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLU5vbmUtMDIyODYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHJlY29yZGVkIHdoZW4gdHJhbnNmb3JtIGZlZWRiYWNrIGlzIGFjdGl2ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8tZGV2aWNlTWFzay0wMDEwNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgZGV2aWNlIG1hc2sgdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWRldmljZU1hc2stMDAxMDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgemVybyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk88L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRTZXREZXZpY2VNYXNrIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWRldmljZU1hc2stMDAxMDgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGRldmljZSBtYXNrIHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERldmljZU1hc2stZGV2aWNlTWFzay0wMDEwOSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB6ZXJvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERldmljZU1hc2stZGV2aWNlTWFzay0wMDExMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIGFueSBzZXQgYml0cyB0aGF0IHdlcmUgbm90IGluIHRoZSA8YSBocmVmPVwiI1ZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvXCI+VmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm88L2E+Ojo8Y29kZT5kZXZpY2VNYXNrPC9jb2RlPiB2YWx1ZSB3aGVuIHRoZSBjb21tYW5kIGJ1ZmZlciBiZWdhbiByZWNvcmRpbmcuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERldmljZU1hc2stZGV2aWNlTWFzay0wMDExMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZrQ21kU2V0RGV2aWNlTWFzazwvY29kZT4gaXMgY2FsbGVkIGluc2lkZSBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCA8Y29kZT5kZXZpY2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSBhbnkgc2V0IGJpdHMgdGhhdCB3ZXJlIG5vdCBpbiB0aGUgPGEgaHJlZj1cIiNWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mb1wiPlZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvPC9hPjo6PGNvZGU+ZGV2aWNlTWFzazwvY29kZT4gdmFsdWUgd2hlbiB0aGUgcmVuZGVyIHBhc3MgaW5zdGFuY2UgYmVnYW4gcmVjb3JkaW5nLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERldmljZU1hc2stY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERldmljZU1hc2stY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIGNvbXB1dGUsIG9yIHRyYW5zZmVyIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZUZlbmNlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRmVuY2UtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVGZW5jZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ZlbmNlQ3JlYXRlSW5mb1wiPlZrRmVuY2VDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRmVuY2UtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRmVuY2UtcEZlbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBGZW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0ZlbmNlXCI+VmtGZW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtGZW5jZUNyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGZW5jZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZlbmNlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm9cIj5Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbzwvYT4gb3IgPGEgaHJlZj1cIiNWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSXCI+VmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGZW5jZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ZlbmNlQ3JlYXRlRmxhZ0JpdHNcIj5Wa0ZlbmNlQ3JlYXRlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfZmVuY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy0wMTQ0NiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBiaXRzIGluIDxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBtdXN0IGJlIHN1cHBvcnRlZCBhbmQgY29tcGF0aWJsZSwgYXMgcmVwb3J0ZWQgYnkgPGEgaHJlZj1cIiNWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzXCI+VmtFeHRlcm5hbEZlbmNlUHJvcGVydGllczwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX2ZlbmNlX3dpbjMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlcy0wMTQ0NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm9cIj5Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBkb2VzIG5vdCBpbmNsdWRlIDxjb2RlPlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQ8L2NvZGU+LCBhIDxjb2RlPlZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI8L2NvZGU+IHN0cnVjdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiA8YSBocmVmPVwiI1ZrRmVuY2VDcmVhdGVJbmZvXCI+VmtGZW5jZUNyZWF0ZUluZm88L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1wQXR0cmlidXRlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQXR0cmlidXRlczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQXR0cmlidXRlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGNvZGU+U0VDVVJJVFlfQVRUUklCVVRFUzwvY29kZT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9mZW5jZV93aW4zMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEZlbmNlV2luMzJIYW5kbGVLSFItcEdldFdpbjMySGFuZGxlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wR2V0V2luMzJIYW5kbGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFJcIj5Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUi1wSGFuZGxlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBIYW5kbGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPkhBTkRMRTwvY29kZT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NDgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gPGEgaHJlZj1cIiNWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mb1wiPlZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gdGhlIDxjb2RlPmZlbmNlPC9jb2RlPiYjODIxNztzIGN1cnJlbnQgcGF5bG9hZCB3YXMgY3JlYXRlZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ0OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIGRlZmluZWQgYXMgYW4gTlQgaGFuZGxlLCA8YSBocmVmPVwiI3ZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUlwiPnZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUjwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgY2FsbGVkIG5vIG1vcmUgdGhhbiBvbmNlIGZvciBlYWNoIHZhbGlkIHVuaXF1ZSBjb21iaW5hdGlvbiBvZiA8Y29kZT5mZW5jZTwvY29kZT4gYW5kIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUi1mZW5jZS0wMTQ1MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY3VycmVudGx5IGhhdmUgaXRzIHBheWxvYWQgcmVwbGFjZWQgYnkgYW4gaW1wb3J0ZWQgcGF5bG9hZCBhcyBkZXNjcmliZWQgYmVsb3cgaW4gPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tZmVuY2VzLWltcG9ydGluZ1wiPkltcG9ydGluZyBGZW5jZSBQYXlsb2FkczwvYT4gdW5sZXNzIHRoYXQgaW1wb3J0ZWQgcGF5bG9hZCYjODIxNztzIGhhbmRsZSB0eXBlIHdhcyBpbmNsdWRlZCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNcIj5Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzPC9hPjo6PGNvZGU+ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXM8L2NvZGU+IGZvciA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ1MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IHJlZmVycyB0byBhIGhhbmRsZSB0eXBlIHdpdGggY29weSBwYXlsb2FkIHRyYW5zZmVyZW5jZSBzZW1hbnRpY3MsIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzaWduYWxlZCwgb3IgaGF2ZSBhbiBhc3NvY2lhdGVkIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWZlbmNlcy1zaWduYWxpbmdcIj5mZW5jZSBzaWduYWwgb3BlcmF0aW9uPC9hPiBwZW5kaW5nIGV4ZWN1dGlvbi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ1MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGRlZmluZWQgYXMgYW4gTlQgaGFuZGxlIG9yIGEgZ2xvYmFsIHNoYXJlIGhhbmRsZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfR0VUX1dJTjMyX0hBTkRMRV9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItZmVuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmVuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ZlbmNlXCI+VmtGZW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldEZlbmNlRmRLSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9mZW5jZV9mZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RmVuY2VGZEtIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEZlbmNlRmRLSFItcEdldEZkSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wR2V0RmRJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRmVuY2VHZXRGZEluZm9LSFJcIj5Wa0ZlbmNlR2V0RmRJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RmVuY2VGZEtIUi1wRmQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEZkPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRmVuY2VHZXRGZEluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9mZW5jZV9mZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTQ1MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBpbmNsdWRlZCBpbiA8YSBocmVmPVwiI1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvXCI+VmtFeHBvcnRGZW5jZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gd2hlbiA8Y29kZT5mZW5jZTwvY29kZT4mIzgyMTc7cyBjdXJyZW50IHBheWxvYWQgd2FzIGNyZWF0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiByZWZlcnMgdG8gYSBoYW5kbGUgdHlwZSB3aXRoIGNvcHkgcGF5bG9hZCB0cmFuc2ZlcmVuY2Ugc2VtYW50aWNzLCA8Y29kZT5mZW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc2lnbmFsZWQsIG9yIGhhdmUgYW4gYXNzb2NpYXRlZCA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1mZW5jZXMtc2lnbmFsaW5nXCI+ZmVuY2Ugc2lnbmFsIG9wZXJhdGlvbjwvYT4gcGVuZGluZyBleGVjdXRpb24uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLWZlbmNlLTAxNDU1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmVuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjdXJyZW50bHkgaGF2ZSBpdHMgcGF5bG9hZCByZXBsYWNlZCBieSBhbiBpbXBvcnRlZCBwYXlsb2FkIGFzIGRlc2NyaWJlZCBiZWxvdyBpbiA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1mZW5jZXMtaW1wb3J0aW5nXCI+SW1wb3J0aW5nIEZlbmNlIFBheWxvYWRzPC9hPiB1bmxlc3MgdGhhdCBpbXBvcnRlZCBwYXlsb2FkJiM4MjE3O3MgaGFuZGxlIHR5cGUgd2FzIGluY2x1ZGVkIGluIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllc1wiPlZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM8L2E+Ojo8Y29kZT5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlczwvY29kZT4gZm9yIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGZW5jZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDU2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZGVmaW5lZCBhcyBhIFBPU0lYIGZpbGUgZGVzY3JpcHRvciBoYW5kbGUuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9GRF9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItZmVuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmVuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ZlbmNlXCI+VmtGZW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lGZW5jZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lGZW5jZS1mZW5jZS0wMTEyMCIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCA8YSBocmVmPVwiI2RldnNhbmRxdWV1ZXMtc3VibWlzc2lvblwiPnF1ZXVlIHN1Ym1pc3Npb248L2E+IGNvbW1hbmRzIHRoYXQgcmVmZXIgdG8gPGNvZGU+ZmVuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RmVuY2UtZmVuY2UtMDExMjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5mZW5jZTwvY29kZT4gd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHByb3ZpZGVkIGhlcmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUZlbmNlLWZlbmNlLTAxMTIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+ZmVuY2U8L2NvZGU+IHdhcyBjcmVhdGVkLCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RmVuY2UtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RmVuY2UtZmVuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmVuY2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5mZW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRmVuY2VcIj5Wa0ZlbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUZlbmNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lGZW5jZS1mZW5jZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mZW5jZTwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldEZlbmNlU3RhdHVzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RmVuY2VTdGF0dXMtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRGZW5jZVN0YXR1cy1mZW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mZW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRmVuY2VcIj5Wa0ZlbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RmVuY2VTdGF0dXMtZmVuY2UtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmVuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1Jlc2V0RmVuY2VzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRGZW5jZXMtcEZlbmNlcy0wMTEyMyIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wRmVuY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBhbnkgcXVldWUgY29tbWFuZCB0aGF0IGhhcyBub3QgeWV0IGNvbXBsZXRlZCBleGVjdXRpb24gb24gdGhhdCBxdWV1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldEZlbmNlcy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1Jlc2V0RmVuY2VzLXBGZW5jZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEZlbmNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmZlbmNlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtGZW5jZVwiPlZrRmVuY2U8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRGZW5jZXMtZmVuY2VDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZlbmNlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldEZlbmNlcy1wRmVuY2VzLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wRmVuY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtXYWl0Rm9yRmVuY2VzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrV2FpdEZvckZlbmNlcy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1dhaXRGb3JGZW5jZXMtcEZlbmNlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRmVuY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZmVuY2VDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0ZlbmNlXCI+VmtGZW5jZTwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtXYWl0Rm9yRmVuY2VzLWZlbmNlQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mZW5jZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrV2FpdEZvckZlbmNlcy1wRmVuY2VzLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wRmVuY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtSZWdpc3RlckRldmljZUV2ZW50RVhUIjogeworICAgICAgIihWS19FWFRfZGlzcGxheV9jb250cm9sKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWdpc3RlckRldmljZUV2ZW50RVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVC1wRGV2aWNlRXZlbnRJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEZXZpY2VFdmVudEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VFdmVudEluZm9FWFRcIj5Wa0RldmljZUV2ZW50SW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVC1wRmVuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRmVuY2VcIj5Wa0ZlbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0RldmljZUV2ZW50SW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2Rpc3BsYXlfY29udHJvbCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlRXZlbnRJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9FVkVOVF9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlRXZlbnRJbmZvRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUV2ZW50SW5mb0VYVC1kZXZpY2VFdmVudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2VFdmVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlRXZlbnRUeXBlRVhUXCI+VmtEZXZpY2VFdmVudFR5cGVFWFQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCI6IHsKKyAgICAgICIoVktfRVhUX2Rpc3BsYXlfY29udHJvbCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1kaXNwbGF5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRpc3BsYXk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rpc3BsYXlLSFJcIj5Wa0Rpc3BsYXlLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1wRGlzcGxheUV2ZW50SW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGlzcGxheUV2ZW50SW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rpc3BsYXlFdmVudEluZm9FWFRcIj5Wa0Rpc3BsYXlFdmVudEluZm9FWFQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1wRmVuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRmVuY2VcIj5Wa0ZlbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlFdmVudEluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9kaXNwbGF5X2NvbnRyb2wpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlFdmVudEluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9FVkVOVF9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheUV2ZW50SW5mb0VYVC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwbGF5RXZlbnRJbmZvRVhULWRpc3BsYXlFdmVudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNwbGF5RXZlbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rpc3BsYXlFdmVudFR5cGVFWFRcIj5Wa0Rpc3BsYXlFdmVudFR5cGVFWFQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIjogeworICAgICAgIihWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSLXBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUlwiPlZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9mZW5jZV93aW4zMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ1NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsdWUgaW5jbHVkZWQgaW4gdGhlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWZlbmNlLWhhbmRsZXR5cGVzLXdpbjMyXCI+SGFuZGxlIFR5cGVzIFN1cHBvcnRlZCBieSBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSPC9hPiB0YWJsZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ1OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUPC9jb2RlPiwgPGNvZGU+bmFtZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPmhhbmRsZTwvY29kZT4gaXMgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPm5hbWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5hbWUgYSB2YWxpZCBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ2MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+bmFtZTwvY29kZT4gaXMgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPmhhbmRsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBoYW5kbGUgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGUtMDE0NjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+bmFtZTwvY29kZT4gbXVzdCBiZSA8Y29kZT5OVUxMPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNTM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9iZXkgYW55IHJlcXVpcmVtZW50cyBsaXN0ZWQgZm9yIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGluIDxhIGhyZWY9XCIjZXh0ZXJuYWwtZmVuY2UtaGFuZGxlLXR5cGVzLWNvbXBhdGliaWxpdHlcIj5leHRlcm5hbCBmZW5jZSBoYW5kbGUgdHlwZXMgY29tcGF0aWJpbGl0eTwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLW5hbWUtMDE1NDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5uYW1lPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9iZXkgYW55IHJlcXVpcmVtZW50cyBsaXN0ZWQgZm9yIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGluIDxhIGhyZWY9XCIjZXh0ZXJuYWwtZmVuY2UtaGFuZGxlLXR5cGVzLWNvbXBhdGliaWxpdHlcIj5leHRlcm5hbCBmZW5jZSBoYW5kbGUgdHlwZXMgY29tcGF0aWJpbGl0eTwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWZlbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGZW5jZVwiPlZrRmVuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRmVuY2VJbXBvcnRGbGFnQml0c1wiPlZrRmVuY2VJbXBvcnRGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzXCI+VmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrSW1wb3J0RmVuY2VGZEtIUiI6IHsKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtJbXBvcnRGZW5jZUZkS0hSLWZlbmNlLTAxNDYzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmVuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IHF1ZXVlIGNvbW1hbmQgdGhhdCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZXhlY3V0aW9uIG9uIHRoYXQgcXVldWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrSW1wb3J0RmVuY2VGZEtIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ltcG9ydEZlbmNlRmRLSFItcEltcG9ydEZlbmNlRmRJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBJbXBvcnRGZW5jZUZkSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltcG9ydEZlbmNlRmRJbmZvS0hSXCI+VmtJbXBvcnRGZW5jZUZkSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRGZW5jZUZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWx1ZSBpbmNsdWRlZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tZmVuY2UtaGFuZGxldHlwZXMtZmRcIj5IYW5kbGUgVHlwZXMgU3VwcG9ydGVkIGJ5IFZrSW1wb3J0RmVuY2VGZEluZm9LSFI8L2E+IHRhYmxlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRGZW5jZUZkSW5mb0tIUi1mZC0wMTU0MSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZkPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvYmV5IGFueSByZXF1aXJlbWVudHMgbGlzdGVkIGZvciA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpbiA8YSBocmVmPVwiI2V4dGVybmFsLWZlbmNlLWhhbmRsZS10eXBlcy1jb21wYXRpYmlsaXR5XCI+ZXh0ZXJuYWwgZmVuY2UgaGFuZGxlIHR5cGVzIGNvbXBhdGliaWxpdHk8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRGZW5jZUZkSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfRkRfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLWZlbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGZW5jZVwiPlZrRmVuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRGZW5jZUZkSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRmVuY2VJbXBvcnRGbGFnQml0c1wiPlZrRmVuY2VJbXBvcnRGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZVNlbWFwaG9yZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVNlbWFwaG9yZS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVNlbWFwaG9yZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZUNyZWF0ZUluZm9cIj5Wa1NlbWFwaG9yZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTZW1hcGhvcmUtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU2VtYXBob3JlLXBTZW1hcGhvcmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVwiPlZrU2VtYXBob3JlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1NlbWFwaG9yZUNyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvXCI+VmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvPC9hPiwgPGEgaHJlZj1cIiNWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUlwiPlZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSPC9hPiwgb3IgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSXCI+VmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnNUeXBlPC9jb2RlPiBtZW1iZXIgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFItc2VtYXBob3JlVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zZW1hcGhvcmVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUi10aW1lbGluZVNlbWFwaG9yZS0wMzI1MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRpbWVsaW5lU2VtYXBob3JlXCI+PGNvZGU+dGltZWxpbmVTZW1hcGhvcmU8L2NvZGU+PC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zZW1hcGhvcmVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgZXF1YWwgPGNvZGU+VktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUi1zZW1hcGhvcmVUeXBlLTAzMjc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2VtYXBob3JlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUjwvY29kZT4sIDxjb2RlPmluaXRpYWxWYWx1ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgemVyby4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtMDExMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYml0cyBpbiA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGFuZCBjb21wYXRpYmxlLCBhcyByZXBvcnRlZCBieSA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzXCI+VmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzXCI+VmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlcy0wMTEyNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvXCI+VmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVQ8L2NvZGU+LCA8Y29kZT5Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZUNyZWF0ZUluZm9cIj5Wa1NlbWFwaG9yZUNyZWF0ZUluZm88L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1wQXR0cmlidXRlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQXR0cmlidXRlczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQXR0cmlidXRlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGNvZGU+U0VDVVJJVFlfQVRUUklCVVRFUzwvY29kZT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIjogeworICAgICAgIihWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSLXBHZXRXaW4zMkhhbmRsZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEdldFdpbjMySGFuZGxlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUlwiPlZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFItcEhhbmRsZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSGFuZGxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT5IQU5ETEU8L2NvZGU+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluIDxhIGhyZWY9XCIjVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvXCI+VmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gdGhlIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4mIzgyMTc7cyBjdXJyZW50IHBheWxvYWQgd2FzIGNyZWF0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTI3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgZGVmaW5lZCBhcyBhbiBOVCBoYW5kbGUsIDxhIGhyZWY9XCIjdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUlwiPnZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFI8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGNhbGxlZCBubyBtb3JlIHRoYW4gb25jZSBmb3IgZWFjaCB2YWxpZCB1bmlxdWUgY29tYmluYXRpb24gb2YgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiBhbmQgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1zZW1hcGhvcmUtMDExMjgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zZW1hcGhvcmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjdXJyZW50bHkgaGF2ZSBpdHMgcGF5bG9hZCByZXBsYWNlZCBieSBhbiBpbXBvcnRlZCBwYXlsb2FkIGFzIGRlc2NyaWJlZCBiZWxvdyBpbiA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1zZW1hcGhvcmVzLWltcG9ydGluZ1wiPkltcG9ydGluZyBTZW1hcGhvcmUgUGF5bG9hZHM8L2E+IHVubGVzcyB0aGF0IGltcG9ydGVkIHBheWxvYWQmIzgyMTc7cyBoYW5kbGUgdHlwZSB3YXMgaW5jbHVkZWQgaW4gPGEgaHJlZj1cIiNWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc1wiPlZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzPC9hPjo6PGNvZGU+ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXM8L2NvZGU+IGZvciA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDExMjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiByZWZlcnMgdG8gYSBoYW5kbGUgdHlwZSB3aXRoIGNvcHkgcGF5bG9hZCB0cmFuc2ZlcmVuY2Ugc2VtYW50aWNzLCBhcyBkZWZpbmVkIGJlbG93IGluIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLXNlbWFwaG9yZXMtaW1wb3J0aW5nXCI+SW1wb3J0aW5nIFNlbWFwaG9yZSBQYXlsb2FkczwvYT4sIHRoZXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG5vIHF1ZXVlIHdhaXRpbmcgb24gPGNvZGU+c2VtYXBob3JlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDExMzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiByZWZlcnMgdG8gYSBoYW5kbGUgdHlwZSB3aXRoIGNvcHkgcGF5bG9hZCB0cmFuc2ZlcmVuY2Ugc2VtYW50aWNzLCA8Y29kZT5zZW1hcGhvcmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHNpZ25hbGVkLCBvciBoYXZlIGFuIGFzc29jaWF0ZWQgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tc2VtYXBob3Jlcy1zaWduYWxpbmdcIj5zZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbjwvYT4gcGVuZGluZyBleGVjdXRpb24uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTMxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZGVmaW5lZCBhcyBhbiBOVCBoYW5kbGUgb3IgYSBnbG9iYWwgc2hhcmUgaGFuZGxlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2VtYXBob3JlXCI+VmtTZW1hcGhvcmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRTZW1hcGhvcmVGZEtIUiI6IHsKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U2VtYXBob3JlRmRLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTZW1hcGhvcmVGZEtIUi1wR2V0RmRJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBHZXRGZEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVHZXRGZEluZm9LSFJcIj5Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFNlbWFwaG9yZUZkS0hSLXBGZC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRmQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfZmQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluIDxhIGhyZWY9XCIjVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvXCI+VmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gPGNvZGU+c2VtYXBob3JlPC9jb2RlPiYjODIxNztzIGN1cnJlbnQgcGF5bG9hZCB3YXMgY3JlYXRlZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLXNlbWFwaG9yZS0wMTEzMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGN1cnJlbnRseSBoYXZlIGl0cyBwYXlsb2FkIHJlcGxhY2VkIGJ5IGFuIGltcG9ydGVkIHBheWxvYWQgYXMgZGVzY3JpYmVkIGJlbG93IGluIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLXNlbWFwaG9yZXMtaW1wb3J0aW5nXCI+SW1wb3J0aW5nIFNlbWFwaG9yZSBQYXlsb2FkczwvYT4gdW5sZXNzIHRoYXQgaW1wb3J0ZWQgcGF5bG9hZCYjODIxNztzIGhhbmRsZSB0eXBlIHdhcyBpbmNsdWRlZCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzXCI+VmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM8L2E+Ojo8Y29kZT5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlczwvY29kZT4gZm9yIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTEzNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IHJlZmVycyB0byBhIGhhbmRsZSB0eXBlIHdpdGggY29weSBwYXlsb2FkIHRyYW5zZmVyZW5jZSBzZW1hbnRpY3MsIGFzIGRlZmluZWQgYmVsb3cgaW4gPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tc2VtYXBob3Jlcy1pbXBvcnRpbmdcIj5JbXBvcnRpbmcgU2VtYXBob3JlIFBheWxvYWRzPC9hPiwgdGhlcmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbm8gcXVldWUgd2FpdGluZyBvbiA8Y29kZT5zZW1hcGhvcmU8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTEzNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IHJlZmVycyB0byBhIGhhbmRsZSB0eXBlIHdpdGggY29weSBwYXlsb2FkIHRyYW5zZmVyZW5jZSBzZW1hbnRpY3MsIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc2lnbmFsZWQsIG9yIGhhdmUgYW4gYXNzb2NpYXRlZCA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1zZW1hcGhvcmVzLXNpZ25hbGluZ1wiPnNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uPC9hPiBwZW5kaW5nIGV4ZWN1dGlvbi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDExMzYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBkZWZpbmVkIGFzIGEgUE9TSVggZmlsZSBkZXNjcmlwdG9yIGhhbmRsZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfRkRfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2VtYXBob3JlXCI+VmtTZW1hcGhvcmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkKSsoVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiByZWZlcnMgdG8gYSBoYW5kbGUgdHlwZSB3aXRoIGNvcHkgcGF5bG9hZCB0cmFuc2ZlcmVuY2Ugc2VtYW50aWNzLCA8Y29kZT5zZW1hcGhvcmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrU2VtYXBob3JlVHlwZUtIUlwiPlZrU2VtYXBob3JlVHlwZUtIUjwvYT4gb2YgPGNvZGU+VktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUjwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAzMjU0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gcmVmZXJzIHRvIGEgaGFuZGxlIHR5cGUgd2l0aCBjb3B5IHBheWxvYWQgdHJhbnNmZXJlbmNlIHNlbWFudGljcywgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGFuIGFzc29jaWF0ZWQgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb24gdGhhdCBoYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIGV4ZWN1dGlvbiBhbmQgYW55IHNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9ucyBvbiB3aGljaCBpdCBkZXBlbmRzIChpZiBhbnkpIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYWxzbyBiZWVuIHN1Ym1pdHRlZCBmb3IgZXhlY3V0aW9uLiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveVNlbWFwaG9yZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtc2VtYXBob3JlLTAxMTM3IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBiYXRjaGVzIHRoYXQgcmVmZXIgdG8gPGNvZGU+c2VtYXBob3JlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1zZW1hcGhvcmUtMDExMzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5zZW1hcGhvcmU8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtc2VtYXBob3JlLTAxMTM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+c2VtYXBob3JlPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtc2VtYXBob3JlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2VtYXBob3JlXCI+VmtTZW1hcGhvcmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtc2VtYXBob3JlLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiI6IHsKKyAgICAgICIoVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSLXNlbWFwaG9yZS0wMzI1NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1zZW1hcGhvcmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVcIj5Wa1NlbWFwaG9yZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1wVmFsdWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFZhbHVlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50NjRfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSLXNlbWFwaG9yZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zZW1hcGhvcmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1dhaXRTZW1hcGhvcmVzS0hSIjogeworICAgICAgIihWS19LSFJfdGltZWxpbmVfc2VtYXBob3JlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtXYWl0U2VtYXBob3Jlc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1dhaXRTZW1hcGhvcmVzS0hSLXBXYWl0SW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wV2FpdEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVXYWl0SW5mb0tIUlwiPlZrU2VtYXBob3JlV2FpdEluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU2VtYXBob3JlV2FpdEluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSLXBTZW1hcGhvcmVzLTAzMjU2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIG9mIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wU2VtYXBob3JlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gcmVmZXJlbmNlIGEgc2VtYXBob3JlIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9XQUlUX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVXYWl0SW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVXYWl0SW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSXCI+VmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFI8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVXYWl0SW5mb0tIUi1wU2VtYXBob3Jlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU2VtYXBob3JlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnNlbWFwaG9yZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrU2VtYXBob3JlXCI+VmtTZW1hcGhvcmU8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcFZhbHVlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVmFsdWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c2VtYXBob3JlQ291bnQ8L2NvZGU+IDxjb2RlPnVpbnQ2NF90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItc2VtYXBob3JlQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zZW1hcGhvcmVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtTaWduYWxTZW1hcGhvcmVLSFIiOiB7CisgICAgICAiKFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NpZ25hbFNlbWFwaG9yZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NpZ25hbFNlbWFwaG9yZUtIUi1wU2lnbmFsSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU2lnbmFsSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFJcIj5Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi1zZW1hcGhvcmUtMDMyNTciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zZW1hcGhvcmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrU2VtYXBob3JlVHlwZUtIUlwiPlZrU2VtYXBob3JlVHlwZUtIUjwvYT4gb2YgPGNvZGU+VktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXZhbHVlLTAzMjU4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmFsdWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbWFwaG9yZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXZhbHVlLTAzMjU5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmFsdWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgYW55IHBlbmRpbmcgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFItdmFsdWUtMDMyNjAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT52YWx1ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIHZhbHVlIHdoaWNoIGRvZXMgbm90IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUgb3IgdGhlIHZhbHVlIG9mIGFueSBvdXRzdGFuZGluZyBzZW1hcGhvcmUgd2FpdCBvciBzaWduYWwgb3BlcmF0aW9uIG9uIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gYnkgbW9yZSB0aGFuIDxhIGhyZWY9XCIjbGltaXRzLW1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlXCI+PGNvZGU+bWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2U8L2NvZGU+PC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfU0lHTkFMX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2VtYXBob3JlXCI+VmtTZW1hcGhvcmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFItcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSXCI+VmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTE0MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsdWUgaW5jbHVkZWQgaW4gdGhlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLXNlbWFwaG9yZS1oYW5kbGV0eXBlcy13aW4zMlwiPkhhbmRsZSBUeXBlcyBTdXBwb3J0ZWQgYnkgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI8L2E+IHRhYmxlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ2NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX0QzRDEyX0ZFTkNFX0JJVDwvY29kZT4sIDxjb2RlPm5hbWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ2NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+aGFuZGxlPC9jb2RlPiBpcyA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+bmFtZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbmFtZSBhIHZhbGlkIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmUgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ2OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+bmFtZTwvY29kZT4gaXMgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPmhhbmRsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBoYW5kbGUgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNDY5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPm5hbWU8L2NvZGU+IG11c3QgYmUgPGNvZGU+TlVMTDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGUtMDE1NDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb2JleSBhbnkgcmVxdWlyZW1lbnRzIGxpc3RlZCBmb3IgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaW4gPGEgaHJlZj1cIiNleHRlcm5hbC1zZW1hcGhvcmUtaGFuZGxlLXR5cGVzLWNvbXBhdGliaWxpdHlcIj5leHRlcm5hbCBzZW1hcGhvcmUgaGFuZGxlIHR5cGVzIGNvbXBhdGliaWxpdHk8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItbmFtZS0wMTU0MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm5hbWU8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb2JleSBhbnkgcmVxdWlyZW1lbnRzIGxpc3RlZCBmb3IgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaW4gPGEgaHJlZj1cIiNleHRlcm5hbC1zZW1hcGhvcmUtaGFuZGxlLXR5cGVzLWNvbXBhdGliaWxpdHlcIj5leHRlcm5hbCBzZW1hcGhvcmUgaGFuZGxlIHR5cGVzIGNvbXBhdGliaWxpdHk8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMzI2MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUPC9jb2RlPiBvciA8Y29kZT5WS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQ8L2NvZGU+LCB0aGUgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZUNyZWF0ZUluZm9cIj5Wa1NlbWFwaG9yZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gZmllbGQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2ggdGhhdCBvZiB0aGUgc2VtYXBob3JlIGZyb20gd2hpY2ggPGNvZGU+aGFuZGxlPC9jb2RlPiBvciA8Y29kZT5uYW1lPC9jb2RlPiB3YXMgZXhwb3J0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1zZW1hcGhvcmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVcIj5Wa1NlbWFwaG9yZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHNcIj5Wa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyKSsoVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUPC9jb2RlPiwgdGhlIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUlwiPlZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI8L2E+Ojo8Y29kZT5zZW1hcGhvcmVUeXBlPC9jb2RlPiBmaWVsZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGF0IG9mIHRoZSBzZW1hcGhvcmUgZnJvbSB3aGljaCA8Y29kZT5oYW5kbGU8L2NvZGU+IG9yIDxjb2RlPm5hbWU8L2NvZGU+IHdhcyBleHBvcnRlZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWZsYWdzLTAzMzIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVDwvY29kZT4sIHRoZSA8YSBocmVmPVwiI1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFJcIj5Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSPC9hPjo6PGNvZGU+c2VtYXBob3JlVHlwZTwvY29kZT4gZmllbGQgb2YgdGhlIHNlbWFwaG9yZSBmcm9tIHdoaWNoIDxjb2RlPmhhbmRsZTwvY29kZT4gb3IgPGNvZGU+bmFtZTwvY29kZT4gd2FzIGV4cG9ydGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrSW1wb3J0U2VtYXBob3JlRmRLSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfZmQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ltcG9ydFNlbWFwaG9yZUZkS0hSLXNlbWFwaG9yZS0wMTE0MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgcXVldWUgY29tbWFuZCB0aGF0IGhhcyBub3QgeWV0IGNvbXBsZXRlZCBleGVjdXRpb24gb24gdGhhdCBxdWV1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtJbXBvcnRTZW1hcGhvcmVGZEtIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ltcG9ydFNlbWFwaG9yZUZkS0hSLXBJbXBvcnRTZW1hcGhvcmVGZEluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEltcG9ydFNlbWFwaG9yZUZkSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUlwiPlZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDExNDMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbHVlIGluY2x1ZGVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1zZW1hcGhvcmUtaGFuZGxldHlwZXMtZmRcIj5IYW5kbGUgVHlwZXMgU3VwcG9ydGVkIGJ5IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSPC9hPiB0YWJsZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWZkLTAxNTQ0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9iZXkgYW55IHJlcXVpcmVtZW50cyBsaXN0ZWQgZm9yIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGluIDxhIGhyZWY9XCIjZXh0ZXJuYWwtc2VtYXBob3JlLWhhbmRsZS10eXBlcy1jb21wYXRpYmlsaXR5XCI+ZXh0ZXJuYWwgc2VtYXBob3JlIGhhbmRsZSB0eXBlcyBjb21wYXRpYmlsaXR5PC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVDwvY29kZT4sIHRoZSA8YSBocmVmPVwiI1ZrU2VtYXBob3JlQ3JlYXRlSW5mb1wiPlZrU2VtYXBob3JlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiBmaWVsZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGF0IG9mIHRoZSBzZW1hcGhvcmUgZnJvbSB3aGljaCA8Y29kZT5mZDwvY29kZT4gd2FzIGV4cG9ydGVkLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1zZW1hcGhvcmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVcIj5Wa1NlbWFwaG9yZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHNcIj5Wa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNcIj5Wa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCkrKFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1oYW5kbGVUeXBlLTAzMjY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQ8L2NvZGU+LCB0aGUgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSXCI+VmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUjwvYT46Ojxjb2RlPnNlbWFwaG9yZVR5cGU8L2NvZGU+IGZpZWxkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG1hdGNoIHRoYXQgb2YgdGhlIHNlbWFwaG9yZSBmcm9tIHdoaWNoIDxjb2RlPmZkPC9jb2RlPiB3YXMgZXhwb3J0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1mbGFncy0wMzMyMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19TRU1BUEhPUkVfSU1QT1JUX1RFTVBPUkFSWV9CSVQ8L2NvZGU+LCB0aGUgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSXCI+VmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUjwvYT46Ojxjb2RlPnNlbWFwaG9yZVR5cGU8L2NvZGU+IGZpZWxkIG9mIHRoZSBzZW1hcGhvcmUgZnJvbSB3aGljaCA8Y29kZT5mZDwvY29kZT4gd2FzIGV4cG9ydGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlRXZlbnQiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVFdmVudC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUV2ZW50LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXZlbnRDcmVhdGVJbmZvXCI+VmtFdmVudENyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVFdmVudC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVFdmVudC1wRXZlbnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEV2ZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRXZlbnRcIj5Wa0V2ZW50PC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0V2ZW50Q3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V2ZW50Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXZlbnRDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V2ZW50Q3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveUV2ZW50IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LTAxMTQ1IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIDxjb2RlPmV2ZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LTAxMTQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+ZXZlbnQ8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lFdmVudC1ldmVudC0wMTE0NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmV2ZW50PC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmV2ZW50PC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+ZXZlbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0V2ZW50XCI+VmtFdmVudDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lFdmVudC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZXZlbnQ8L2NvZGU+IGlzIGEgdmFsaWQgaGFuZGxlLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRFdmVudFN0YXR1cyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEV2ZW50U3RhdHVzLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RXZlbnRTdGF0dXMtZXZlbnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXZlbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0V2ZW50XCI+VmtFdmVudDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEV2ZW50U3RhdHVzLWV2ZW50LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmV2ZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtTZXRFdmVudCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NldEV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXZlbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0V2ZW50XCI+VmtFdmVudDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NldEV2ZW50LWV2ZW50LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmV2ZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtSZXNldEV2ZW50IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRFdmVudC1ldmVudC0wMTE0OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmV2ZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgd2FpdGVkIG9uIGJ5IGEgPGNvZGU+dmtDbWRXYWl0RXZlbnRzPC9jb2RlPiBjb21tYW5kIHRoYXQgaXMgY3VycmVudGx5IGV4ZWN1dGluZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldEV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRFdmVudC1ldmVudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5ldmVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXZlbnRcIj5Wa0V2ZW50PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRFdmVudC1ldmVudC1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5ldmVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0RXZlbnQiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDExNDkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDExNTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1nZW9tZXRyeVNoYWRlclwiPmdlb21ldHJ5IHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLTAxMTUxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGVzc2VsbGF0aW9uU2hhZGVyXCI+dGVzc2VsbGF0aW9uIHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXZlbnQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXZlbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0V2ZW50XCI+VmtFdmVudDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEV2ZW50LXN0YWdlTWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU3RhZ2VGbGFnQml0c1wiPlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEV2ZW50LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFdmVudC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEV2ZW50LXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEV2ZW50LWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5ldmVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXZlbnQtY29tbWFuZEJ1ZmZlci0wMTE1MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+JiM4MjE3O3MgY3VycmVudCBkZXZpY2UgbWFzayA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIGV4YWN0bHkgb25lIHBoeXNpY2FsIGRldmljZS4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDIxMDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tZXNoU2hhZGVyXCI+bWVzaCBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLTAyMTA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGFza1NoYWRlclwiPnRhc2sgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRSZXNldEV2ZW50IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDExNTMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNldEV2ZW50LXN0YWdlTWFzay0wMTE1NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWdlb21ldHJ5U2hhZGVyXCI+Z2VvbWV0cnkgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNldEV2ZW50LXN0YWdlTWFzay0wMTE1NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRlc3NlbGxhdGlvblNoYWRlclwiPnRlc3NlbGxhdGlvbiBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0RXZlbnQtZXZlbnQtMDExNTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBXaGVuIHRoaXMgY29tbWFuZCBleGVjdXRlcywgPGNvZGU+ZXZlbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB3YWl0ZWQgb24gYnkgYSA8Y29kZT52a0NtZFdhaXRFdmVudHM8L2NvZGU+IGNvbW1hbmQgdGhhdCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0RXZlbnQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzZXRFdmVudC1ldmVudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5ldmVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXZlbnRcIj5Wa0V2ZW50PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHNcIj5Wa1BpcGVsaW5lU3RhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0RXZlbnQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0RXZlbnQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNldEV2ZW50LXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0RXZlbnQtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPmV2ZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNldEV2ZW50LWNvbW1hbmRCdWZmZXItMDExNTciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiYjODIxNztzIGN1cnJlbnQgZGV2aWNlIG1hc2sgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBleGFjdGx5IG9uZSBwaHlzaWNhbCBkZXZpY2UuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDIxMDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tZXNoU2hhZGVyXCI+bWVzaCBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDIxMTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10YXNrU2hhZGVyXCI+dGFzayBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFdhaXRFdmVudHMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMTE1OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIGJpdHdpc2UgT1Igb2YgdGhlIDxjb2RlPnN0YWdlTWFzazwvY29kZT4gcGFyYW1ldGVyIHVzZWQgaW4gcHJldmlvdXMgY2FsbHMgdG8gPGNvZGU+dmtDbWRTZXRFdmVudDwvY29kZT4gd2l0aCBhbnkgb2YgdGhlIG1lbWJlcnMgb2YgPGNvZGU+cEV2ZW50czwvY29kZT4gYW5kIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUPC9jb2RlPiBpZiBhbnkgb2YgdGhlIG1lbWJlcnMgb2YgPGNvZGU+cEV2ZW50czwvY29kZT4gd2FzIHNldCB1c2luZyA8Y29kZT52a1NldEV2ZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMTE1OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWdlb21ldHJ5U2hhZGVyXCI+Z2VvbWV0cnkgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay0wMTE2MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWdlb21ldHJ5U2hhZGVyXCI+Z2VvbWV0cnkgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMTE2MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRlc3NlbGxhdGlvblNoYWRlclwiPnRlc3NlbGxhdGlvbiBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0U3RhZ2VNYXNrLTAxMTYyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGVzc2VsbGF0aW9uU2hhZGVyXCI+dGVzc2VsbGF0aW9uIHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1wRXZlbnRzLTAxMTYzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEV2ZW50czwvY29kZT4gaW5jbHVkZXMgb25lIG9yIG1vcmUgZXZlbnRzIHRoYXQgd2lsbCBiZSBzaWduYWxlZCBieSA8Y29kZT52a1NldEV2ZW50PC9jb2RlPiBhZnRlciA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBoYXMgYmVlbiBzdWJtaXR0ZWQgdG8gYSBxdWV1ZSwgdGhlbiA8Y29kZT52a0NtZFdhaXRFdmVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBjYWxsZWQgaW5zaWRlIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDExNjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgcGlwZWxpbmUgc3RhZ2UgaW5jbHVkZWQgaW4gPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiBvciA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHN1cHBvcnRlZCBieSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBxdWV1ZSBmYW1pbHkgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5xdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtDb21tYW5kUG9vbENyZWF0ZUluZm9cIj5Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSwgYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1waXBlbGluZS1zdGFnZXMtc3VwcG9ydGVkXCI+dGFibGUgb2Ygc3VwcG9ydGVkIHBpcGVsaW5lIHN0YWdlczwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtcE1lbW9yeUJhcnJpZXJzLTAxMTY1IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBNZW1vcnlCYXJyaWVyczwvY29kZT4sIDxjb2RlPnBCdWZmZXJNZW1vcnlCYXJyaWVyczwvY29kZT4gb3IgPGNvZGU+cEltYWdlTWVtb3J5QmFycmllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGFueSBhY2Nlc3MgZmxhZyBpbmNsdWRlZCBpbiBpdHMgPGNvZGU+c3JjQWNjZXNzTWFzazwvY29kZT4gbWVtYmVyIGlmIHRoYXQgYml0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW55IG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiwgYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1hY2Nlc3MtdHlwZXMtc3VwcG9ydGVkXCI+dGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlczwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtcE1lbW9yeUJhcnJpZXJzLTAxMTY2IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBNZW1vcnlCYXJyaWVyczwvY29kZT4sIDxjb2RlPnBCdWZmZXJNZW1vcnlCYXJyaWVyczwvY29kZT4gb3IgPGNvZGU+cEltYWdlTWVtb3J5QmFycmllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGFueSBhY2Nlc3MgZmxhZyBpbmNsdWRlZCBpbiBpdHMgPGNvZGU+ZHN0QWNjZXNzTWFzazwvY29kZT4gbWVtYmVyIGlmIHRoYXQgYml0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW55IG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiwgYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1hY2Nlc3MtdHlwZXMtc3VwcG9ydGVkXCI+dGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlczwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjUXVldWVGYW1pbHlJbmRleC0wMjgwMyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zcmNRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBhbmQgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gbWVtYmVycyBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wQnVmZmVyTWVtb3J5QmFycmllcnM8L2NvZGU+IG9yIDxjb2RlPnBJbWFnZU1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNBY2Nlc3NNYXNrLTAyODA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNyY0FjY2Vzc01hc2s8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cE1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGluY2x1ZGUgYWNjZXNzIGZsYWdzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tYWNjZXNzLXR5cGVzLXN1cHBvcnRlZFwiPnRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0QWNjZXNzTWFzay0wMjgxMCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5kc3RBY2Nlc3NNYXNrPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBNZW1vcnlCYXJyaWVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBpbmNsdWRlIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+LCBhcyBzcGVjaWZpZWQgaW4gdGhlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWFjY2Vzcy10eXBlcy1zdXBwb3J0ZWRcIj50YWJsZSBvZiBzdXBwb3J0ZWQgYWNjZXNzIHR5cGVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY0FjY2Vzc01hc2stMDI4MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c3JjQWNjZXNzTWFzazwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQnVmZmVyTWVtb3J5QmFycmllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgaW5jbHVkZSBhY2Nlc3MgZmxhZ3MgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IG9uZSBvciBtb3JlIG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiwgYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1hY2Nlc3MtdHlwZXMtc3VwcG9ydGVkXCI+dGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RBY2Nlc3NNYXNrLTAyODEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmRzdEFjY2Vzc01hc2s8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGluY2x1ZGUgYWNjZXNzIGZsYWdzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tYWNjZXNzLXR5cGVzLXN1cHBvcnRlZFwiPnRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjQWNjZXNzTWFzay0wMjgxMyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zcmNBY2Nlc3NNYXNrPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBJbWFnZU1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGluY2x1ZGUgYWNjZXNzIGZsYWdzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tYWNjZXNzLXR5cGVzLXN1cHBvcnRlZFwiPnRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0QWNjZXNzTWFzay0wMjgxNCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5kc3RBY2Nlc3NNYXNrPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlTWVtb3J5QmFycmllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgaW5jbHVkZSBhY2Nlc3MgZmxhZ3MgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IG9uZSBvciBtb3JlIG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiwgYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1hY2Nlc3MtdHlwZXMtc3VwcG9ydGVkXCI+dGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXBFdmVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEV2ZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmV2ZW50Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtFdmVudFwiPlZrRXZlbnQ8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHNcIj5Wa1BpcGVsaW5lU3RhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0U3RhZ2VNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzXCI+VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXBNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5tZW1vcnlCYXJyaWVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cE1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+bWVtb3J5QmFycmllckNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrTWVtb3J5QmFycmllclwiPlZrTWVtb3J5QmFycmllcjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXBCdWZmZXJNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXJNZW1vcnlCYXJyaWVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YnVmZmVyTWVtb3J5QmFycmllckNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyTWVtb3J5QmFycmllclwiPlZrQnVmZmVyTWVtb3J5QmFycmllcjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXBJbWFnZU1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlTWVtb3J5QmFycmllckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBJbWFnZU1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+aW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZU1lbW9yeUJhcnJpZXJcIj5Wa0ltYWdlTWVtb3J5QmFycmllcjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1ldmVudENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXZlbnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdhaXRFdmVudHMtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wRXZlbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1hbmRCdWZmZXItMDExNjciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiYjODIxNztzIGN1cnJlbnQgZGV2aWNlIG1hc2sgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBleGFjdGx5IG9uZSBwaHlzaWNhbCBkZXZpY2UuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDIxMTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tZXNoU2hhZGVyXCI+bWVzaCBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDIxMTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10YXNrU2hhZGVyXCI+dGFzayBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stMDIxMTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tZXNoU2hhZGVyXCI+bWVzaCBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stMDIxMTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10YXNrU2hhZGVyXCI+dGFzayBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFBpcGVsaW5lQmFycmllciI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stMDExNjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1nZW9tZXRyeVNoYWRlclwiPmdlb21ldHJ5IHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMTE2OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWdlb21ldHJ5U2hhZGVyXCI+Z2VvbWV0cnkgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAxMTcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGVzc2VsbGF0aW9uU2hhZGVyXCI+dGVzc2VsbGF0aW9uIHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMTE3MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRlc3NlbGxhdGlvblNoYWRlclwiPnRlc3NlbGxhdGlvbiBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wRGVwZW5kZW5jaWVzLTAyMjg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dmtDbWRQaXBlbGluZUJhcnJpZXI8L2NvZGU+IGlzIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhlIHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYXQgbGVhc3Qgb25lIDxjb2RlPlZrU3VicGFzc0RlcGVuZGVuY3k8L2NvZGU+IGluc3RhbmNlIGluIDxjb2RlPlZrUmVuZGVyUGFzc0NyZWF0ZUluZm88L2NvZGU+Ojo8Y29kZT5wRGVwZW5kZW5jaWVzPC9jb2RlPiB0aGF0IGV4cHJlc3NlcyBhIGRlcGVuZGVuY3kgZnJvbSB0aGUgY3VycmVudCBzdWJwYXNzIHRvIGl0c2VsZiwgYW5kIGZvciB3aGljaCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IGNvbnRhaW5zIGEgc3Vic2V0IG9mIHRoZSBiaXQgdmFsdWVzIGluIDxjb2RlPlZrU3VicGFzc0RlcGVuZGVuY3k8L2NvZGU+Ojo8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+LCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IGNvbnRhaW5zIGEgc3Vic2V0IG9mIHRoZSBiaXQgdmFsdWVzIGluIDxjb2RlPlZrU3VicGFzc0RlcGVuZGVuY3k8L2NvZGU+Ojo8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+LCA8Y29kZT5kZXBlbmRlbmN5RmxhZ3M8L2NvZGU+IGlzIGVxdWFsIHRvIDxjb2RlPlZrU3VicGFzc0RlcGVuZGVuY3k8L2NvZGU+Ojo8Y29kZT5kZXBlbmRlbmN5RmxhZ3M8L2NvZGU+LCA8Y29kZT5zcmNBY2Nlc3NNYXNrPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBNZW1vcnlCYXJyaWVyczwvY29kZT4gYW5kIDxjb2RlPnBJbWFnZU1lbW9yeUJhcnJpZXJzPC9jb2RlPiBjb250YWlucyBhIHN1YnNldCBvZiB0aGUgYml0IHZhbHVlcyBpbiA8Y29kZT5Wa1N1YnBhc3NEZXBlbmRlbmN5PC9jb2RlPjo6PGNvZGU+c3JjQWNjZXNzTWFzazwvY29kZT4sIGFuZCA8Y29kZT5kc3RBY2Nlc3NNYXNrPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBNZW1vcnlCYXJyaWVyczwvY29kZT4gYW5kIDxjb2RlPnBJbWFnZU1lbW9yeUJhcnJpZXJzPC9jb2RlPiBjb250YWlucyBhIHN1YnNldCBvZiB0aGUgYml0IHZhbHVlcyBpbiA8Y29kZT5Wa1N1YnBhc3NEZXBlbmRlbmN5PC9jb2RlPjo6PGNvZGU+ZHN0QWNjZXNzTWFzazwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudC0wMTE3OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZrQ21kUGlwZWxpbmVCYXJyaWVyPC9jb2RlPiBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIDxjb2RlPmJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLW9sZExheW91dC0wMTE4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZrQ21kUGlwZWxpbmVCYXJyaWVyPC9jb2RlPiBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IGFuZCA8Y29kZT5uZXdMYXlvdXQ8L2NvZGU+IG1lbWJlcnMgb2YgYW4gZWxlbWVudCBvZiA8Y29kZT5wSW1hZ2VNZW1vcnlCYXJyaWVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1F1ZXVlRmFtaWx5SW5kZXgtMDExODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52a0NtZFBpcGVsaW5lQmFycmllcjwvY29kZT4gaXMgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCB0aGUgPGNvZGU+c3JjUXVldWVGYW1pbHlJbmRleDwvY29kZT4gYW5kIDxjb2RlPmRzdFF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IG1lbWJlcnMgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlTWVtb3J5QmFycmllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAxMTgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IHBpcGVsaW5lIHN0YWdlIGluY2x1ZGVkIGluIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gb3IgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgcXVldWUgZmFtaWx5IHNwZWNpZmllZCBieSB0aGUgPGNvZGU+cXVldWVGYW1pbHlJbmRleDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvXCI+VmtDb21tYW5kUG9vbENyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tcGlwZWxpbmUtc3RhZ2VzLXN1cHBvcnRlZFwiPnRhYmxlIG9mIHN1cHBvcnRlZCBwaXBlbGluZSBzdGFnZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNBY2Nlc3NNYXNrLTAyODE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNyY0FjY2Vzc01hc2s8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cE1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGluY2x1ZGUgYWNjZXNzIGZsYWdzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tYWNjZXNzLXR5cGVzLXN1cHBvcnRlZFwiPnRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RBY2Nlc3NNYXNrLTAyODE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmRzdEFjY2Vzc01hc2s8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cE1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGluY2x1ZGUgYWNjZXNzIGZsYWdzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tYWNjZXNzLXR5cGVzLXN1cHBvcnRlZFwiPnRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wQnVmZmVyTWVtb3J5QmFycmllcnMtMDI4MTciLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzPC9jb2RlPiwgaWYgaXRzIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5kc3RRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBtZW1iZXJzIGFyZSBlcXVhbCwgb3IgaWYgaXRzIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGlzIHRoZSBxdWV1ZSBmYW1pbHkgaW5kZXggdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIGNvbW1hbmQgcG9vbCB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSwgdGhlbiBpdHMgPGNvZGU+c3JjQWNjZXNzTWFzazwvY29kZT4gbWVtYmVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgY29udGFpbiBhY2Nlc3MgZmxhZ3MgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IG9uZSBvciBtb3JlIG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiwgYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1hY2Nlc3MtdHlwZXMtc3VwcG9ydGVkXCI+dGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBCdWZmZXJNZW1vcnlCYXJyaWVycy0wMjgxOCIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBhbnkgZWxlbWVudCBvZiA8Y29kZT5wQnVmZmVyTWVtb3J5QmFycmllcnM8L2NvZGU+LCBpZiBpdHMgPGNvZGU+c3JjUXVldWVGYW1pbHlJbmRleDwvY29kZT4gYW5kIDxjb2RlPmRzdFF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IG1lbWJlcnMgYXJlIGVxdWFsLCBvciBpZiBpdHMgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gaXMgdGhlIHF1ZXVlIGZhbWlseSBpbmRleCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBwb29sIHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tLCB0aGVuIGl0cyA8Y29kZT5kc3RBY2Nlc3NNYXNrPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBjb250YWluIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+LCBhcyBzcGVjaWZpZWQgaW4gdGhlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWFjY2Vzcy10eXBlcy1zdXBwb3J0ZWRcIj50YWJsZSBvZiBzdXBwb3J0ZWQgYWNjZXNzIHR5cGVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcEltYWdlTWVtb3J5QmFycmllcnMtMDI4MTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlTWVtb3J5QmFycmllcnM8L2NvZGU+LCBpZiBpdHMgPGNvZGU+c3JjUXVldWVGYW1pbHlJbmRleDwvY29kZT4gYW5kIDxjb2RlPmRzdFF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IG1lbWJlcnMgYXJlIGVxdWFsLCBvciBpZiBpdHMgPGNvZGU+c3JjUXVldWVGYW1pbHlJbmRleDwvY29kZT4gaXMgdGhlIHF1ZXVlIGZhbWlseSBpbmRleCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBwb29sIHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tLCB0aGVuIGl0cyA8Y29kZT5zcmNBY2Nlc3NNYXNrPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBjb250YWluIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+LCBhcyBzcGVjaWZpZWQgaW4gdGhlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWFjY2Vzcy10eXBlcy1zdXBwb3J0ZWRcIj50YWJsZSBvZiBzdXBwb3J0ZWQgYWNjZXNzIHR5cGVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcEltYWdlTWVtb3J5QmFycmllcnMtMDI4MjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlTWVtb3J5QmFycmllcnM8L2NvZGU+LCBpZiBpdHMgPGNvZGU+c3JjUXVldWVGYW1pbHlJbmRleDwvY29kZT4gYW5kIDxjb2RlPmRzdFF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IG1lbWJlcnMgYXJlIGVxdWFsLCBvciBpZiBpdHMgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gaXMgdGhlIHF1ZXVlIGZhbWlseSBpbmRleCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBwb29sIHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tLCB0aGVuIGl0cyA8Y29kZT5kc3RBY2Nlc3NNYXNrPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBjb250YWluIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+LCBhcyBzcGVjaWZpZWQgaW4gdGhlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWFjY2Vzcy10eXBlcy1zdXBwb3J0ZWRcIj50YWJsZSBvZiBzdXBwb3J0ZWQgYWNjZXNzIHR5cGVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU3RhZ2VGbGFnQml0c1wiPlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0U3RhZ2VNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzXCI+VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0U3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kZXBlbmRlbmN5RmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVwZW5kZW5jeUZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtEZXBlbmRlbmN5RmxhZ0JpdHNcIj5Wa0RlcGVuZGVuY3lGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wTWVtb3J5QmFycmllcnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bWVtb3J5QmFycmllckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBNZW1vcnlCYXJyaWVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPm1lbW9yeUJhcnJpZXJDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa01lbW9yeUJhcnJpZXJcIj5Wa01lbW9yeUJhcnJpZXI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBCdWZmZXJNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXJNZW1vcnlCYXJyaWVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YnVmZmVyTWVtb3J5QmFycmllckNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyTWVtb3J5QmFycmllclwiPlZrQnVmZmVyTWVtb3J5QmFycmllcjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcEltYWdlTWVtb3J5QmFycmllcnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEltYWdlTWVtb3J5QmFycmllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5pbWFnZU1lbW9yeUJhcnJpZXJDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTWVtb3J5QmFycmllclwiPlZrSW1hZ2VNZW1vcnlCYXJyaWVyPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IHRyYW5zZmVyLCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZGVwdGhfc3RlbmNpbF9yZXNvbHZlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItaW1hZ2UtMDI2MzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52a0NtZFBpcGVsaW5lQmFycmllcjwvY29kZT4gaXMgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCB0aGUgPGNvZGU+aW1hZ2U8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wSW1hZ2VNZW1vcnlCYXJyaWVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHRoYXQgdGhlIGN1cnJlbnQgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGgsIHRoYXQgaXMgYWxzbyByZWZlcnJlZCB0byBieSBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSA8Y29kZT5wQ29sb3JBdHRhY2htZW50czwvY29kZT4sIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IG9yIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiBtZW1iZXJzIG9mIHRoZSA8Y29kZT5Wa1N1YnBhc3NEZXNjcmlwdGlvbjwvY29kZT4gaW5zdGFuY2Ugb3IgYnkgdGhlIDxjb2RlPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI8L2NvZGU+IHN0cnVjdHVyZSB0aGF0IHRoZSBjdXJyZW50IHN1YnBhc3Mgd2FzIGNyZWF0ZWQgd2l0aCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItb2xkTGF5b3V0LTAyNjM2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dmtDbWRQaXBlbGluZUJhcnJpZXI8L2NvZGU+IGlzIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhlIDxjb2RlPm9sZExheW91dDwvY29kZT4gYW5kIDxjb2RlPm5ld0xheW91dDwvY29kZT4gbWVtYmVycyBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wSW1hZ2VNZW1vcnlCYXJyaWVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIDxjb2RlPmxheW91dDwvY29kZT4gbWVtYmVyIG9mIGFuIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBDb2xvckF0dGFjaG1lbnRzPC9jb2RlPiwgPGNvZGU+cFJlc29sdmVBdHRhY2htZW50czwvY29kZT4gb3IgPGNvZGU+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ8L2NvZGU+IG1lbWJlcnMgb2YgdGhlIDxjb2RlPlZrU3VicGFzc0Rlc2NyaXB0aW9uPC9jb2RlPiBpbnN0YW5jZSBvciBieSB0aGUgPGNvZGU+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUjwvY29kZT4gc3RydWN0dXJlIHRoYXQgdGhlIGN1cnJlbnQgc3VicGFzcyB3YXMgY3JlYXRlZCB3aXRoLCB0aGF0IHJlZmVycyB0byB0aGUgc2FtZSA8Y29kZT5pbWFnZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19LSFJfZGVwdGhfc3RlbmNpbF9yZXNvbHZlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItaW1hZ2UtMDI2MzciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52a0NtZFBpcGVsaW5lQmFycmllcjwvY29kZT4gaXMgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCB0aGUgPGNvZGU+aW1hZ2U8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wSW1hZ2VNZW1vcnlCYXJyaWVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHRoYXQgdGhlIGN1cnJlbnQgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGgsIHRoYXQgaXMgYWxzbyByZWZlcnJlZCB0byBieSBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSA8Y29kZT5wQ29sb3JBdHRhY2htZW50czwvY29kZT4sIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IG9yIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiBtZW1iZXJzIG9mIHRoZSA8Y29kZT5Wa1N1YnBhc3NEZXNjcmlwdGlvbjwvY29kZT4gaW5zdGFuY2UgdGhhdCB0aGUgY3VycmVudCBzdWJwYXNzIHdhcyBjcmVhdGVkIHdpdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLW9sZExheW91dC0wMjYzOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZrQ21kUGlwZWxpbmVCYXJyaWVyPC9jb2RlPiBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IGFuZCA8Y29kZT5uZXdMYXlvdXQ8L2NvZGU+IG1lbWJlcnMgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlTWVtb3J5QmFycmllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSA8Y29kZT5sYXlvdXQ8L2NvZGU+IG1lbWJlciBvZiBhbiBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQ29sb3JBdHRhY2htZW50czwvY29kZT4sIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IG9yIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiBtZW1iZXJzIG9mIHRoZSA8Y29kZT5Wa1N1YnBhc3NEZXNjcmlwdGlvbjwvY29kZT4gaW5zdGFuY2UgdGhhdCB0aGUgY3VycmVudCBzdWJwYXNzIHdhcyBjcmVhdGVkIHdpdGgsIHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIDxjb2RlPmltYWdlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRlcGVuZGVuY3lGbGFncy0wMTE4NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZrQ21kUGlwZWxpbmVCYXJyaWVyPC9jb2RlPiBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCA8Y29kZT5kZXBlbmRlbmN5RmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIDxjb2RlPlZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMjExNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLW1lc2hTaGFkZXJcIj5tZXNoIHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAyMTE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGFza1NoYWRlclwiPnRhc2sgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RTdGFnZU1hc2stMDIxMTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tZXNoU2hhZGVyXCI+bWVzaCBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMjExOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRhc2tTaGFkZXJcIj50YXNrIHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrTWVtb3J5QmFycmllciI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUJhcnJpZXItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUJhcnJpZXItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QmFycmllci1zcmNBY2Nlc3NNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0FjY2Vzc01hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0FjY2Vzc0ZsYWdCaXRzXCI+VmtBY2Nlc3NGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUJhcnJpZXItZHN0QWNjZXNzTWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RBY2Nlc3NNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtBY2Nlc3NGbGFnQml0c1wiPlZrQWNjZXNzRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQnVmZmVyTWVtb3J5QmFycmllciI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItb2Zmc2V0LTAxMTg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLXNpemUtMDExODgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zaXplPC9jb2RlPiBpcyBub3QgZXF1YWwgdG8gPGNvZGU+VktfV0hPTEVfU0laRTwvY29kZT4sIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLXNpemUtMDExODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zaXplPC9jb2RlPiBpcyBub3QgZXF1YWwgdG8gPGNvZGU+VktfV0hPTEVfU0laRTwvY29kZT4sIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGFuIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4gbWludXMgPGNvZGU+b2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIHNoYXJpbmcgbW9kZSBvZiA8Y29kZT5WS19TSEFSSU5HX01PREVfRVhDTFVTSVZFPC9jb2RlPiwgYW5kIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5kc3RRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBhcmUgbm90IDxjb2RlPlZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEPC9jb2RlPiwgYXQgbGVhc3Qgb25lIG9mIHRoZW0gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIHNhbWUgYXMgdGhlIGZhbWlseSBvZiB0aGUgcXVldWUgdGhhdCB3aWxsIGV4ZWN1dGUgdGhpcyBiYXJyaWVyIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxOTMxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX0JBUlJJRVI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQ8L2NvZGU+LCA8Y29kZT5zcmNRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBhbmQgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTwvY29kZT4sIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5kc3RRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlaXRoZXIgYm90aCBiZSA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4sIG9yIGJvdGggYmUgYSB2YWxpZCBxdWV1ZSBmYW1pbHkgKHNlZSA8YSBocmVmPVwiI2RldnNhbmRxdWV1ZXMtcXVldWVwcm9wc1wiPlF1ZXVlIEZhbWlseSBQcm9wZXJ0aWVzPC9hPikiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YnVmZmVyPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgYXQgbGVhc3Qgb25lIG9mIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5kc3RRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQ8L2NvZGU+LCBhbmQgb25lIG9mIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5kc3RRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBpcyA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4sIHRoZSBvdGhlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4gb3IgYSBzcGVjaWFsIHF1ZXVlIGZhbWlseSByZXNlcnZlZCBmb3IgZXh0ZXJuYWwgbWVtb3J5IG93bmVyc2hpcCB0cmFuc2ZlcnMsIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1xdWV1ZS10cmFuc2ZlcnNcIj5RdWV1ZSBGYW1pbHkgT3duZXJzaGlwIFRyYW5zZmVyPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTwvY29kZT4gYW5kIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGlzIDxjb2RlPlZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEPC9jb2RlPiwgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBiZSA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTwvY29kZT4gYW5kIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcXVldWUgZmFtaWx5IG9yIGEgc3BlY2lhbCBxdWV1ZSBmYW1pbHkgcmVzZXJ2ZWQgZm9yIGV4dGVybmFsIG1lbW9yeSB0cmFuc2ZlcnMsIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1xdWV1ZS10cmFuc2ZlcnNcIj5RdWV1ZSBGYW1pbHkgT3duZXJzaGlwIFRyYW5zZmVyPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTwvY29kZT4gYW5kIDxjb2RlPmRzdFF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcXVldWUgZmFtaWx5IG9yIGEgc3BlY2lhbCBxdWV1ZSBmYW1pbHkgcmVzZXJ2ZWQgZm9yIGV4dGVybmFsIG1lbW9yeSB0cmFuc2ZlcnMsIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1xdWV1ZS10cmFuc2ZlcnNcIj5RdWV1ZSBGYW1pbHkgT3duZXJzaGlwIFRyYW5zZmVyPC9hPi4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlTWVtb3J5QmFycmllciI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDExOTciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ8L2NvZGU+IG9yIHRoZSBjdXJyZW50IGxheW91dCBvZiB0aGUgaW1hZ2Ugc3VicmVzb3VyY2VzIGFmZmVjdGVkIGJ5IHRoZSBiYXJyaWVyIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1uZXdMYXlvdXQtMDExOTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5uZXdMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTIwNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU8L2NvZGU+LCBhbmQgPGNvZGU+c3JjUXVldWVGYW1pbHlJbmRleDwvY29kZT4gYW5kIDxjb2RlPmRzdFF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGFyZSBub3QgPGNvZGU+VktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ8L2NvZGU+LCBhdCBsZWFzdCBvbmUgb2YgdGhlbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB0aGUgc2FtZSBhcyB0aGUgZmFtaWx5IG9mIHRoZSBxdWV1ZSB0aGF0IHdpbGwgZXhlY3V0ZSB0aGlzIGJhcnJpZXIiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE0ODYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNzI0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfUkVNQUlOSU5HX01JUF9MRVZFTFM8L2NvZGU+LCA8c3BhbiBjbGFzcz1cImVxXCI+PGNvZGU+c3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWw8L2NvZGU+ICYjNDM7IDxjb2RlPnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudDwvY29kZT48L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgPGNvZGU+bWlwTGV2ZWxzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTQ4OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNzI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUzwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyPC9jb2RlPiAmIzQzOyA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQ8L2NvZGU+PC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgZWl0aGVyIDxjb2RlPm9sZExheW91dDwvY29kZT4gb3IgPGNvZGU+bmV3TGF5b3V0PC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiB0aGVuIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUPC9jb2RlPiBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIwOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IG9yIDxjb2RlPm5ld0xheW91dDwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiB0aGVuIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgZWl0aGVyIDxjb2RlPm9sZExheW91dDwvY29kZT4gb3IgPGNvZGU+bmV3TGF5b3V0PC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gdGhlbiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IG9yIDxjb2RlPm5ld0xheW91dDwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gdGhlbiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgZWl0aGVyIDxjb2RlPm9sZExheW91dDwvY29kZT4gb3IgPGNvZGU+bmV3TGF5b3V0PC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw8L2NvZGU+IHRoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDwvY29kZT4gc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBlaXRoZXIgPGNvZGU+b2xkTGF5b3V0PC9jb2RlPiBvciA8Y29kZT5uZXdMYXlvdXQ8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDwvY29kZT4gdGhlbiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPiBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxOTMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVFwiPlZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW5ld0xheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5uZXdMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVN1YnJlc291cmNlUmFuZ2VcIj5Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZTwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMTk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQ8L2NvZGU+LCA8Y29kZT5zcmNRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBhbmQgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTwvY29kZT4sIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5kc3RRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlaXRoZXIgYm90aCBiZSA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4sIG9yIGJvdGggYmUgYSB2YWxpZCBxdWV1ZSBmYW1pbHkgKHNlZSA8YSBocmVmPVwiI2RldnNhbmRxdWV1ZXMtcXVldWVwcm9wc1wiPlF1ZXVlIEZhbWlseSBQcm9wZXJ0aWVzPC9hPikuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfbWVtb3J5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEzODEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIHNoYXJpbmcgbW9kZSBvZiA8Y29kZT5WS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVDwvY29kZT4sIGF0IGxlYXN0IG9uZSBvZiA8Y29kZT5zcmNRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBhbmQgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgYW5kIG9uZSBvZiA8Y29kZT5zcmNRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBhbmQgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gaXMgPGNvZGU+VktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ8L2NvZGU+LCB0aGUgb3RoZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ8L2NvZGU+IG9yIGEgc3BlY2lhbCBxdWV1ZSBmYW1pbHkgcmVzZXJ2ZWQgZm9yIGV4dGVybmFsIG1lbW9yeSB0cmFuc2ZlcnMsIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1xdWV1ZS10cmFuc2ZlcnNcIj5RdWV1ZSBGYW1pbHkgT3duZXJzaGlwIFRyYW5zZmVyPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgPGNvZGU+VktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTwvY29kZT4gYW5kIDxjb2RlPnNyY1F1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IGlzIDxjb2RlPlZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEPC9jb2RlPiwgPGNvZGU+ZHN0UXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBiZSA8Y29kZT5WS19RVUVVRV9GQU1JTFlfSUdOT1JFRDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU8L2NvZGU+IGFuZCA8Y29kZT5zcmNRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ8L2NvZGU+LCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHF1ZXVlIGZhbWlseSBvciBhIHNwZWNpYWwgcXVldWUgZmFtaWx5IHJlc2VydmVkIGZvciBleHRlcm5hbCBtZW1vcnkgdHJhbnNmZXJzLCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tcXVldWUtdHJhbnNmZXJzXCI+UXVldWUgRmFtaWx5IE93bmVyc2hpcCBUcmFuc2ZlcjwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU8L2NvZGU+IGFuZCA8Y29kZT5kc3RRdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ8L2NvZGU+LCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHF1ZXVlIGZhbWlseSBvciBhIHNwZWNpYWwgcXVldWUgZmFtaWx5IHJlc2VydmVkIGZvciBleHRlcm5hbCBtZW1vcnkgdHJhbnNmZXJzLCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tcXVldWUtdHJhbnNmZXJzXCI+UXVldWUgRmFtaWx5IE93bmVyc2hpcCBUcmFuc2ZlcjwvYT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDMzMTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gaGFzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2l0aCBib3RoIGRlcHRoIGFuZCBzdGVuY2lsIGFuZCB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNcIj5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHM8L2E+IGZlYXR1cmUgaXMgZW5hYmxlZCwgdGhlbiB0aGUgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnN1YnJlc291cmNlUmFuZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgZWl0aGVyIG9yIGJvdGggPGNvZGU+VktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDwvY29kZT4gYW5kIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAzMzIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGhhcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdpdGggYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBhbmQgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzXCI+c2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB0aGVuIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3VicmVzb3VyY2VSYW5nZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBib3RoIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+IGFuZCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfS0hSX3NlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0cykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGhhcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdpdGggYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBjb21wb25lbnRzLCB0aGVuIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3VicmVzb3VyY2VSYW5nZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBib3RoIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+IGFuZCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE2NzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gaGFzIGEgc2luZ2xlLXBsYW5lIGNvbG9yIGZvcm1hdCBvciBpcyBub3QgPGVtPmRpc2pvaW50PC9lbT4sIHRoZW4gdGhlIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE2NzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gaGFzIGEgbXVsdGktcGxhbmFyIGZvcm1hdCBhbmQgdGhlIGltYWdlIGlzIDxlbT5kaXNqb2ludDwvZW0+LCB0aGVuIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3VicmVzb3VyY2VSYW5nZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBlaXRoZXIgYXQgbGVhc3Qgb25lIG9mIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDwvY29kZT4sIGFuZCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQ8L2NvZGU+OyBvciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTY3MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiBoYXMgYSBtdWx0aS1wbGFuYXIgZm9ybWF0IHdpdGggb25seSB0d28gcGxhbmVzLCB0aGVuIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3VicmVzb3VyY2VSYW5nZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTY1OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IG9yIDxjb2RlPm5ld0xheW91dDwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4gdGhlbiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTY1OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IG9yIDxjb2RlPm5ld0xheW91dDwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gdGhlbiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiBzZXQiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMjA4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciA8Y29kZT5vbGRMYXlvdXQ8L2NvZGU+IG9yIDxjb2RlPm5ld0xheW91dDwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NIQURJTkdfUkFURV9PUFRJTUFMX05WPC9jb2RlPiB0aGVuIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlY8L2NvZGU+IHNldCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrUXVldWVXYWl0SWRsZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlV2FpdElkbGUtcXVldWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1F1ZXVlXCI+VmtRdWV1ZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXZpY2VXYWl0SWRsZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0RldmljZVdhaXRJZGxlLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUIjogeworICAgICAgIihWS19FWFRfY2FsaWJyYXRlZF90aW1lc3RhbXBzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhULXBUaW1lc3RhbXBJbmZvcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVGltZXN0YW1wSW5mb3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT50aW1lc3RhbXBDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUXCI+VmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1wVGltZXN0YW1wcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVGltZXN0YW1wczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnRpbWVzdGFtcENvdW50PC9jb2RlPiA8Y29kZT51aW50NjRfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhULXBNYXhEZXZpYXRpb24tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE1heERldmlhdGlvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDY0X3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhULXRpbWVzdGFtcENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dGltZXN0YW1wQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXRpbWVEb21haW4tMDIzNTQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50aW1lRG9tYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBvbmUgb2YgdGhlIDxhIGhyZWY9XCIjVmtUaW1lRG9tYWluRVhUXCI+VmtUaW1lRG9tYWluRVhUPC9hPiB2YWx1ZXMgcmV0dXJuZWQgYnkgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUXCI+dmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQ0FMSUJSQVRFRF9USU1FU1RBTVBfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXRpbWVEb21haW4tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dGltZURvbWFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrVGltZURvbWFpbkVYVFwiPlZrVGltZURvbWFpbkVYVDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZVJlbmRlclBhc3MiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlUmVuZGVyUGFzcy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NDcmVhdGVJbmZvXCI+VmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlUmVuZGVyUGFzcy1wUmVuZGVyUGFzcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUmVuZGVyUGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NcIj5Wa1JlbmRlclBhc3M8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUmVuZGVyUGFzc0NyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1hdHRhY2htZW50LTAwODM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wSW5wdXRBdHRhY2htZW50czwvY29kZT4sIDxjb2RlPnBDb2xvckF0dGFjaG1lbnRzPC9jb2RlPiwgPGNvZGU+cFJlc29sdmVBdHRhY2htZW50czwvY29kZT4gb3IgPGNvZGU+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ8L2NvZGU+LCBvciBhbnkgZWxlbWVudCBvZiA8Y29kZT5wUHJlc2VydmVBdHRhY2htZW50czwvY29kZT4gaW4gYW55IGVsZW1lbnQgb2YgPGNvZGU+cFN1YnBhc3NlczwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPmF0dGFjaG1lbnRDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODM2IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGFueSBtZW1iZXIgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiB3aXRoIGEgPGNvZGU+bG9hZE9wPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI8L2NvZGU+LCB0aGUgZmlyc3QgdXNlIG9mIHRoYXQgYXR0YWNobWVudCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgc3BlY2lmeSBhIDxjb2RlPmxheW91dDwvY29kZT4gZXF1YWwgdG8gPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI1MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYW55IG1lbWJlciBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHdpdGggYSA8Y29kZT5zdGVuY2lsTG9hZE9wPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI8L2NvZGU+LCB0aGUgZmlyc3QgdXNlIG9mIHRoYXQgYXR0YWNobWVudCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgc3BlY2lmeSBhIDxjb2RlPmxheW91dDwvY29kZT4gZXF1YWwgdG8gPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wRGVwZW5kZW5jaWVzLTAwODM3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGFueSBlbGVtZW50IG9mIDxjb2RlPnBEZXBlbmRlbmNpZXM8L2NvZGU+LCBpZiB0aGUgPGNvZGU+c3JjU3VicGFzczwvY29kZT4gaXMgbm90IDxjb2RlPlZLX1NVQlBBU1NfRVhURVJOQUw8L2NvZGU+LCBhbGwgc3RhZ2UgZmxhZ3MgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gbWVtYmVyIG9mIHRoYXQgZGVwZW5kZW5jeSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHBpcGVsaW5lIHN0YWdlIHN1cHBvcnRlZCBieSB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tcGlwZWxpbmUtc3RhZ2VzLXR5cGVzXCI+cGlwZWxpbmU8L2E+IGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPnBpcGVsaW5lQmluZFBvaW50PC9jb2RlPiBtZW1iZXIgb2YgdGhlIHNvdXJjZSBzdWJwYXNzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cERlcGVuZGVuY2llczwvY29kZT4sIGlmIHRoZSA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfU1VCUEFTU19FWFRFUk5BTDwvY29kZT4sIGFsbCBzdGFnZSBmbGFncyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiBtZW1iZXIgb2YgdGhhdCBkZXBlbmRlbmN5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcGlwZWxpbmUgc3RhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1waXBlbGluZS1zdGFnZXMtdHlwZXNcIj5waXBlbGluZTwvYT4gaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+cGlwZWxpbmVCaW5kUG9pbnQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgZGVzdGluYXRpb24gc3VicGFzcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1zcmNTdWJwYXNzLTAyNTE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNyY1N1YnBhc3M8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cERlcGVuZGVuY2llczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPnN1YnBhc3NDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tZHN0U3VicGFzcy0wMjUxOCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBEZXBlbmRlbmNpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5zdWJwYXNzQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVFwiPlZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvPC9hPiwgb3IgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvXCI+VmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbzwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBBdHRhY2htZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hdHRhY2htZW50Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQXR0YWNobWVudERlc2NyaXB0aW9uXCI+VmtBdHRhY2htZW50RGVzY3JpcHRpb248L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcFN1YnBhc3Nlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3VicGFzc2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c3VicGFzc0NvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrU3VicGFzc0Rlc2NyaXB0aW9uXCI+VmtTdWJwYXNzRGVzY3JpcHRpb248L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcERlcGVuZGVuY2llcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXBlbmRlbmN5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cERlcGVuZGVuY2llczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmRlcGVuZGVuY3lDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1N1YnBhc3NEZXBlbmRlbmN5XCI+VmtTdWJwYXNzRGVwZW5kZW5jeTwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1zdWJwYXNzQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdWJwYXNzQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAxNTY2IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGFueSBtZW1iZXIgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiB3aXRoIGEgPGNvZGU+bG9hZE9wPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI8L2NvZGU+LCB0aGUgZmlyc3QgdXNlIG9mIHRoYXQgYXR0YWNobWVudCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgc3BlY2lmeSBhIDxjb2RlPmxheW91dDwvY29kZT4gZXF1YWwgdG8gPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMTU2NyIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBhbnkgbWVtYmVyIG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gd2l0aCBhIDxjb2RlPnN0ZW5jaWxMb2FkT3A8L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUjwvY29kZT4sIHRoZSBmaXJzdCB1c2Ugb2YgdGhhdCBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBzcGVjaWZ5IGEgPGNvZGU+bGF5b3V0PC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5MjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvXCI+VmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlLCB0aGUgPGNvZGU+c3VicGFzczwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBpdHMgPGNvZGU+cEFzcGVjdFJlZmVyZW5jZXM8L2NvZGU+IG1lbWJlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+c3VicGFzc0NvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUsIHRoZSA8Y29kZT5pbnB1dEF0dGFjaG1lbnRJbmRleDwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBpdHMgPGNvZGU+cEFzcGVjdFJlZmVyZW5jZXM8L2NvZGU+IG1lbWJlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIDxjb2RlPmlucHV0QXR0YWNobWVudENvdW50PC9jb2RlPiBpbiB0aGUgbWVtYmVyIG9mIDxjb2RlPnBTdWJwYXNzZXM8L2NvZGU+IGlkZW50aWZpZWQgYnkgaXRzIDxjb2RlPnN1YnBhc3M8L2NvZGU+IG1lbWJlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTk2MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUsIGZvciBhbnkgZWxlbWVudCBvZiB0aGUgPGNvZGU+cElucHV0QXR0YWNobWVudHM8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wU3VicGFzc2VzPC9jb2RlPiB3aGVyZSB0aGUgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gbWVtYmVyIGlzIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4sIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvPC9hPjo6PGNvZGU+cEFzcGVjdFJlZmVyZW5jZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgaW5jbHVkZSBhc3BlY3RzIHRoYXQgYXJlIHByZXNlbnQgaW4gaW1hZ2VzIG9mIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gYXQgPGNvZGU+YXR0YWNobWVudDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAxOTI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mb1wiPlZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSwgYW5kIGl0cyA8Y29kZT5zdWJwYXNzQ291bnQ8L2NvZGU+IG1lbWJlciBpcyBub3QgemVybywgdGhhdCBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIDxjb2RlPnN1YnBhc3NDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5MjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvXCI+VmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlLCBpZiBpdHMgPGNvZGU+ZGVwZW5kZW5jeUNvdW50PC9jb2RlPiBtZW1iZXIgaXMgbm90IHplcm8sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIDxjb2RlPmRlcGVuZGVuY3lDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5MzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvXCI+VmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlLCBmb3IgZWFjaCBub24temVybyBlbGVtZW50IG9mIDxjb2RlPnBWaWV3T2Zmc2V0czwvY29kZT4sIHRoZSA8Y29kZT5zcmNTdWJwYXNzPC9jb2RlPiBhbmQgPGNvZGU+ZHN0U3VicGFzczwvY29kZT4gbWVtYmVycyBvZiA8Y29kZT5wRGVwZW5kZW5jaWVzPC9jb2RlPiBhdCB0aGUgc2FtZSBpbmRleCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgZXF1YWwiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDI1MTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvXCI+VmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlLCBmb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cERlcGVuZGVuY2llczwvY29kZT4gd2l0aCBhIDxjb2RlPmRlcGVuZGVuY3lGbGFnczwvY29kZT4gbWVtYmVyIHRoYXQgZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUPC9jb2RlPiwgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgPGNvZGU+cFZpZXdPZmZzZXRzPC9jb2RlPiBtZW1iZXIgb2YgdGhhdCA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvPC9hPiBpbnN0YW5jZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMjUxMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUsIGVsZW1lbnRzIG9mIGl0cyA8Y29kZT5wVmlld01hc2tzPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWl0aGVyIGFsbCBiZSA8Y29kZT4wPC9jb2RlPiwgb3IgYWxsIG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMjUxNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUsIGFuZCBlYWNoIGVsZW1lbnQgb2YgaXRzIDxjb2RlPnBWaWV3TWFza3M8L2NvZGU+IG1lbWJlciBpcyA8Y29kZT4wPC9jb2RlPiwgdGhlIDxjb2RlPmRlcGVuZGVuY3lGbGFnczwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wRGVwZW5kZW5jaWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMjUxNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUsIGFuZCBlYWNoIGVsZW1lbnQgb2YgaXRzIDxjb2RlPnBWaWV3TWFza3M8L2NvZGU+IG1lbWJlciBpcyA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+Y29ycmVsYXRlZFZpZXdNYXNrQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAyNTE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mb1wiPlZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSwgZWFjaCBlbGVtZW50IG9mIGl0cyA8Y29kZT5wVmlld01hc2s8L2NvZGU+IG1lbWJlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhIGJpdCBzZXQgYXQgYW4gaW5kZXggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUxpbWl0c1wiPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2E+Ojo8Y29kZT5tYXhGcmFtZWJ1ZmZlckxheWVyczwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbXVsdGl2aWV3KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby1wQ29ycmVsYXRpb25NYXNrcy0wMDg0MSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggdmlldyBpbmRleCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgc2V0IGluIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBvZiA8Y29kZT5wQ29ycmVsYXRpb25NYXNrczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfTVVMVElWSUVXX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby1wVmlld01hc2tzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN1YnBhc3NDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wVmlld01hc2tzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c3VicGFzc0NvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvLXBWaWV3T2Zmc2V0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXBlbmRlbmN5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFZpZXdPZmZzZXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGVwZW5kZW5jeUNvdW50PC9jb2RlPiA8Y29kZT5pbnQzMl90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8tcENvcnJlbGF0aW9uTWFza3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29ycmVsYXRpb25NYXNrQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cENvcnJlbGF0aW9uTWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb3JyZWxhdGlvbk1hc2tDb3VudDwvY29kZT4gPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9mcmFnbWVudF9kZW5zaXR5X21hcCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC0wMjU0NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4sIDxjb2RlPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5Wa1JlbmRlclBhc3NDcmVhdGVJbmZvPC9jb2RlPjo6PGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LTAyNTQ4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgPGNvZGU+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFuIGVsZW1lbnQgb2YgPGNvZGU+VmtTdWJwYXNzRGVzY3JpcHRpb248L2NvZGU+Ojo8Y29kZT5wSW5wdXRBdHRhY2htZW50czwvY29kZT4sIDxjb2RlPlZrU3VicGFzc0Rlc2NyaXB0aW9uPC9jb2RlPjo6PGNvZGU+cENvbG9yQXR0YWNobWVudHM8L2NvZGU+LCA8Y29kZT5Wa1N1YnBhc3NEZXNjcmlwdGlvbjwvY29kZT46Ojxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+LCA8Y29kZT5Wa1N1YnBhc3NEZXNjcmlwdGlvbjwvY29kZT46Ojxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiwgb3IgPGNvZGU+VmtTdWJwYXNzRGVzY3JpcHRpb248L2NvZGU+Ojo8Y29kZT5wUHJlc2VydmVBdHRhY2htZW50czwvY29kZT4gZm9yIGFueSBzdWJwYXNzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhULWZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQtMDI1NDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCA8Y29kZT5sYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LTAyNTUwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgPGNvZGU+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gcmVmZXJlbmNlIGFuIGF0dGFjaG1lbnQgd2l0aCBhIDxjb2RlPmxvYWRPcDwvY29kZT4gZXF1YWwgdG8gPGNvZGU+VktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQ8L2NvZGU+IG9yIDxjb2RlPlZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkU8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LTAyNTUxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgPGNvZGU+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gcmVmZXJlbmNlIGFuIGF0dGFjaG1lbnQgd2l0aCBhIDxjb2RlPnN0b3JlT3A8L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfQ1JFQVRFX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRSZWZlcmVuY2VcIj5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQXR0YWNobWVudERlc2NyaXB0aW9uIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZpbmFsTGF5b3V0LTAwODQzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgY29sb3IgZm9ybWF0LCA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCwgPGNvZGU+aW5pdGlhbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgY29sb3IgZm9ybWF0LCBuYW1lOmZpbmFsTGF5b3V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0LCA8Y29kZT5maW5hbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHNcIj5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc2FtcGxlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zYW1wbGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTYW1wbGVDb3VudEZsYWdCaXRzXCI+VmtTYW1wbGVDb3VudEZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tbG9hZE9wLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmxvYWRPcDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQXR0YWNobWVudExvYWRPcFwiPlZrQXR0YWNobWVudExvYWRPcDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXN0b3JlT3AtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RvcmVPcDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQXR0YWNobWVudFN0b3JlT3BcIj5Wa0F0dGFjaG1lbnRTdG9yZU9wPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc3RlbmNpbExvYWRPcC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGVuY2lsTG9hZE9wPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBdHRhY2htZW50TG9hZE9wXCI+VmtBdHRhY2htZW50TG9hZE9wPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc3RlbmNpbFN0b3JlT3AtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RlbmNpbFN0b3JlT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRTdG9yZU9wXCI+VmtBdHRhY2htZW50U3RvcmVPcDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWluaXRpYWxMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5pdGlhbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZmluYWxMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9zZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNcIj48Y29kZT5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHM8L2NvZGU+PC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI4NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c1wiPjxjb2RlPnNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0czwvY29kZT48L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmZpbmFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgYSBjb2xvciBmb3JtYXQsIDxjb2RlPmluaXRpYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGNvbG9yIGZvcm1hdCwgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIGJvdGggZGVwdGggYW5kIHN0ZW5jaWwgYXNwZWN0cywgPGNvZGU+aW5pdGlhbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBhc3BlY3RzLCA8Y29kZT5maW5hbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyOTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgb25seSB0aGUgZGVwdGggYXNwZWN0LCA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIGRlcHRoIGFzcGVjdCwgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyOTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgb25seSB0aGUgc3RlbmNpbCBhc3BlY3QsIDxjb2RlPmluaXRpYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI5MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCB3aGljaCBpbmNsdWRlcyBvbmx5IHRoZSBzdGVuY2lsIGFzcGVjdCwgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19JTlBVVF9BVFRBQ0hNRU5UX0FTUEVDVF9DUkVBVEVfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8tcEFzcGVjdFJlZmVyZW5jZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEFzcGVjdFJlZmVyZW5jZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5hc3BlY3RSZWZlcmVuY2VDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZVwiPlZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvLWFzcGVjdFJlZmVyZW5jZUNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXNwZWN0UmVmZXJlbmNlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UtYXNwZWN0TWFzay0wMTk2NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9NRVRBREFUQV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZS1hc3BlY3RNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlQXNwZWN0RmxhZ0JpdHNcIj5Wa0ltYWdlQXNwZWN0RmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpKyhWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlLWFzcGVjdE1hc2stMDIyNTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FX2lfQklUX0VYVDwvY29kZT4gZm9yIGFueSBpbmRleCA8Y29kZT5pPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1YnBhc3NEZXNjcmlwdGlvbiI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1waXBlbGluZUJpbmRQb2ludC0wMDg0NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lQmluZFBvaW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tY29sb3JBdHRhY2htZW50Q291bnQtMDA4NDUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb2xvckF0dGFjaG1lbnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhDb2xvckF0dGFjaG1lbnRzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tbG9hZE9wLTAwODQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGZpcnN0IHVzZSBvZiBhbiBhdHRhY2htZW50IGluIHRoaXMgcmVuZGVyIHBhc3MgaXMgYXMgYW4gaW5wdXQgYXR0YWNobWVudCwgYW5kIHRoZSBhdHRhY2htZW50IGlzIG5vdCBhbHNvIHVzZWQgYXMgYSBjb2xvciBvciBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgaW4gdGhlIHNhbWUgc3VicGFzcywgdGhlbiA8Y29kZT5sb2FkT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAwODQ3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFJlc29sdmVBdHRhY2htZW50czwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCBmb3IgZWFjaCByZXNvbHZlIGF0dGFjaG1lbnQgdGhhdCBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCB0aGUgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wUmVzb2x2ZUF0dGFjaG1lbnRzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIGZvciBlYWNoIHJlc29sdmUgYXR0YWNobWVudCB0aGF0IGlzIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4sIHRoZSBjb3JyZXNwb25kaW5nIGNvbG9yIGF0dGFjaG1lbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSBzYW1wbGUgY291bnQgb2YgPGNvZGU+VktfU0FNUExFX0NPVU5UXzFfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy0wMDg0OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgZWFjaCByZXNvbHZlIGF0dGFjaG1lbnQgdGhhdCBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSBzYW1wbGUgY291bnQgb2YgPGNvZGU+VktfU0FNUExFX0NPVU5UXzFfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy0wMDg1MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgZWFjaCByZXNvbHZlIGF0dGFjaG1lbnQgdGhhdCBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiBhcyBpdHMgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wQ29sb3JBdHRhY2htZW50cy0wMTQxNyIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBhdHRhY2htZW50cyBpbiA8Y29kZT5wQ29sb3JBdHRhY2htZW50czwvY29kZT4gdGhhdCBhcmUgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIHRoZSBzYW1lIHNhbXBsZSBjb3VudCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcElucHV0QXR0YWNobWVudHMtMDI2NDciLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgYXR0YWNobWVudHMgaW4gPGNvZGU+cElucHV0QXR0YWNobWVudHM8L2NvZGU+IHRoYXQgYXJlIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBmb3JtYXRzIHdob3NlIGZlYXR1cmVzIGNvbnRhaW4gYXQgbGVhc3Qgb25lIG9mIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUPC9jb2RlPiBvciA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBDb2xvckF0dGFjaG1lbnRzLTAyNjQ4IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGF0dGFjaG1lbnRzIGluIDxjb2RlPnBDb2xvckF0dGFjaG1lbnRzPC9jb2RlPiB0aGF0IGFyZSBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgZm9ybWF0cyB3aG9zZSBmZWF0dXJlcyBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy0wMjY0OSIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBhdHRhY2htZW50cyBpbiA8Y29kZT5wUmVzb2x2ZUF0dGFjaG1lbnRzPC9jb2RlPiB0aGF0IGFyZSBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgZm9ybWF0cyB3aG9zZSBmZWF0dXJlcyBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtMDI2NTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+IGFuZCB0aGUgYXR0YWNobWVudCBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIGZvcm1hdCB3aG9zZSBmZWF0dXJlcyBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0wMTQxOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5laXRoZXIgdGhlIDxjb2RlPlZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXM8L2NvZGU+IG5vciB0aGUgPGNvZGU+VktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlczwvY29kZT4gZXh0ZW5zaW9ucyBhcmUgZW5hYmxlZCwgYW5kIGlmIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IGFuZCBhbnkgYXR0YWNobWVudHMgaW4gPGNvZGU+cENvbG9yQXR0YWNobWVudHM8L2NvZGU+IGFyZSBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCB0aGV5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgdGhlIHNhbWUgc2FtcGxlIGNvdW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1hdHRhY2htZW50LTAwODUzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFByZXNlcnZlQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLTAwODU0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWxzbyBiZSBhbiBlbGVtZW50IG9mIGFueSBvdGhlciBtZW1iZXIgb2YgdGhlIHN1YnBhc3MgZGVzY3JpcHRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWxheW91dC0wMjUxOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBhdHRhY2htZW50IGlzIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSA8YSBocmVmPVwiI1ZrQXR0YWNobWVudFJlZmVyZW5jZVwiPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvYT4gbWVtYmVyLCB0aGVuIGVhY2ggdXNlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHVzZSB0aGUgc2FtZSA8Y29kZT5sYXlvdXQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHNcIj5Wa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBpcGVsaW5lQmluZFBvaW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lQmluZFBvaW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUJpbmRQb2ludFwiPlZrUGlwZWxpbmVCaW5kUG9pbnQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wSW5wdXRBdHRhY2htZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbnB1dEF0dGFjaG1lbnRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wSW5wdXRBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmlucHV0QXR0YWNobWVudENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQXR0YWNobWVudFJlZmVyZW5jZVwiPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcENvbG9yQXR0YWNobWVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29sb3JBdHRhY2htZW50Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cENvbG9yQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb2xvckF0dGFjaG1lbnRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRSZWZlcmVuY2VcIj5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29sb3JBdHRhY2htZW50Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFJlc29sdmVBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmNvbG9yQXR0YWNobWVudENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQXR0YWNobWVudFJlZmVyZW5jZVwiPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBdHRhY2htZW50UmVmZXJlbmNlXCI+VmtBdHRhY2htZW50UmVmZXJlbmNlPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnByZXNlcnZlQXR0YWNobWVudENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cHJlc2VydmVBdHRhY2htZW50Q291bnQ8L2NvZGU+IDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wQ29sb3JBdHRhY2htZW50cy0wMTUwNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5WS19BTURfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzPC9jb2RlPiBleHRlbnNpb24gaXMgZW5hYmxlZCwgYW5kIGFsbCBhdHRhY2htZW50cyBpbiA8Y29kZT5wQ29sb3JBdHRhY2htZW50czwvY29kZT4gdGhhdCBhcmUgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgc2FtcGxlIGNvdW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzYW1wbGUgY291bnQgb2YgPGNvZGU+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ8L2NvZGU+IGlmIGl0IGlzIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WWF9tdWx0aXZpZXdfcGVyX3ZpZXdfYXR0cmlidXRlcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWZsYWdzLTAwODU2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfUE9TSVRJT05fWF9PTkxZX0JJVF9OVlg8L2NvZGU+LCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGluY2x1ZGUgPGNvZGU+VktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19BVFRSSUJVVEVTX0JJVF9OVlg8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQXR0YWNobWVudFJlZmVyZW5jZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UtbGF5b3V0LTAwODU3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlLWxheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5sYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1YnBhc3NEZXBlbmRlbmN5IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3RhZ2VNYXNrLTAwODYwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZ2VvbWV0cnlTaGFkZXJcIj5nZW9tZXRyeSBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdFN0YWdlTWFzay0wMDg2MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWdlb21ldHJ5U2hhZGVyXCI+Z2VvbWV0cnkgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDA4NjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10ZXNzZWxsYXRpb25TaGFkZXJcIj50ZXNzZWxsYXRpb24gc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUPC9jb2RlPiBvciA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stMDA4NjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10ZXNzZWxsYXRpb25TaGFkZXJcIj50ZXNzZWxsYXRpb24gc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUPC9jb2RlPiBvciA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjU3VicGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPmRzdFN1YnBhc3M8L2NvZGU+LCB1bmxlc3Mgb25lIG9mIHRoZW0gaXMgPGNvZGU+VktfU1VCUEFTU19FWFRFUk5BTDwvY29kZT4sIHRvIGF2b2lkIGN5Y2xpYyBkZXBlbmRlbmNpZXMgYW5kIGVuc3VyZSBhIHZhbGlkIGV4ZWN1dGlvbiBvcmRlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjU3VicGFzczwvY29kZT4gYW5kIDxjb2RlPmRzdFN1YnBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBib3RoIGJlIGVxdWFsIHRvIDxjb2RlPlZLX1NVQlBBU1NfRVhURVJOQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N1YnBhc3MtMDA4NjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zcmNTdWJwYXNzPC9jb2RlPiBpcyBlcXVhbCB0byA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPiBhbmQgbm90IGFsbCBvZiB0aGUgc3RhZ2VzIGluIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gYW5kIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gYXJlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWZyYW1lYnVmZmVyLXJlZ2lvbnNcIj5mcmFtZWJ1ZmZlci1zcGFjZSBzdGFnZXM8L2E+LCB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tcGlwZWxpbmUtc3RhZ2VzLW9yZGVyXCI+bG9naWNhbGx5IGxhdGVzdDwvYT4gcGlwZWxpbmUgc3RhZ2UgaW4gPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1waXBlbGluZS1zdGFnZXMtb3JkZXJcIj5sb2dpY2FsbHkgZWFybGllcjwvYT4gdGhhbiBvciBlcXVhbCB0byB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tcGlwZWxpbmUtc3RhZ2VzLW9yZGVyXCI+bG9naWNhbGx5IGVhcmxpZXN0PC9hPiBwaXBlbGluZSBzdGFnZSBpbiA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY0FjY2Vzc01hc2stMDA4NjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgYWNjZXNzIGZsYWcgaW5jbHVkZWQgaW4gPGNvZGU+c3JjQWNjZXNzTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGJ5IG9uZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tYWNjZXNzLXR5cGVzLXN1cHBvcnRlZFwiPnRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdEFjY2Vzc01hc2stMDA4NjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgYWNjZXNzIGZsYWcgaW5jbHVkZWQgaW4gPGNvZGU+ZHN0QWNjZXNzTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGJ5IG9uZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tYWNjZXNzLXR5cGVzLXN1cHBvcnRlZFwiPnRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N1YnBhc3MtMDIyNDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zcmNTdWJwYXNzPC9jb2RlPiBlcXVhbHMgPGNvZGU+ZHN0U3VicGFzczwvY29kZT4sIGFuZCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IGFuZCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IGJvdGggaW5jbHVkZSBhIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWZyYW1lYnVmZmVyLXJlZ2lvbnNcIj5mcmFtZWJ1ZmZlci1zcGFjZSBzdGFnZTwvYT4sIHRoZW4gPGNvZGU+ZGVwZW5kZW5jeUZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIDxjb2RlPlZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3RhZ2VNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzXCI+VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzXCI+VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjQWNjZXNzTWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNBY2Nlc3NNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtBY2Nlc3NGbGFnQml0c1wiPlZrQWNjZXNzRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RBY2Nlc3NNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEFjY2Vzc01hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0FjY2Vzc0ZsYWdCaXRzXCI+VmtBY2Nlc3NGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRlcGVuZGVuY3lGbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXBlbmRlbmN5RmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0RlcGVuZGVuY3lGbGFnQml0c1wiPlZrRGVwZW5kZW5jeUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRlcGVuZGVuY3lGbGFncy0wMjUyMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlcGVuZGVuY3lGbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVDwvY29kZT4sIDxjb2RlPnNyY1N1YnBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBlcXVhbCB0byA8Y29kZT5WS19TVUJQQVNTX0VYVEVSTkFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kZXBlbmRlbmN5RmxhZ3MtMDI1MjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXBlbmRlbmN5RmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQ8L2NvZGU+LCA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgZXF1YWwgdG8gPGNvZGU+VktfU1VCUEFTU19FWFRFUk5BTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3VicGFzcy0wMDg3MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNyY1N1YnBhc3M8L2NvZGU+IGVxdWFscyA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPiBhbmQgdGhhdCBzdWJwYXNzIGhhcyBtb3JlIHRoYW4gb25lIGJpdCBzZXQgaW4gdGhlIHZpZXcgbWFzaywgdGhlbiA8Y29kZT5kZXBlbmRlbmN5RmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgPGNvZGU+VktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDIwOTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tZXNoU2hhZGVyXCI+bWVzaCBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3RhZ2VNYXNrLTAyMTAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGFza1NoYWRlclwiPnRhc2sgc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdFN0YWdlTWFzay0wMjEwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLW1lc2hTaGFkZXJcIj5tZXNoIHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stMDIxMDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10YXNrU2hhZGVyXCI+dGFzayBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIjogeworICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzMktIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MyS0hSLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSXCI+VmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzMktIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzMktIUi1wUmVuZGVyUGFzcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUmVuZGVyUGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NcIj5Wa1JlbmRlclBhc3M8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIjogeworICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItTm9uZS0wMzA0OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSB0d28gc3VicGFzc2VzIG9wZXJhdGUgb24gYXR0YWNobWVudHMgd2l0aCBvdmVybGFwcGluZyByYW5nZXMgb2YgdGhlIHNhbWUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCwgYW5kIGF0IGxlYXN0IG9uZSBzdWJwYXNzIHdyaXRlcyB0byB0aGF0IGFyZWEgb2YgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+LCBhIHN1YnBhc3MgZGVwZW5kZW5jeSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbmNsdWRlZCAoZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSBzb21lIGludGVybWVkaWF0ZSBzdWJwYXNzZXMpIGJldHdlZW4gdGhlbSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItYXR0YWNobWVudC0wMzA1MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5hdHRhY2htZW50PC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cElucHV0QXR0YWNobWVudHM8L2NvZGU+LCA8Y29kZT5wQ29sb3JBdHRhY2htZW50czwvY29kZT4sIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IG9yIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiwgb3IgdGhlIGF0dGFjaG1lbnQgaW5kZXhlZCBieSBhbnkgZWxlbWVudCBvZiA8Y29kZT5wUHJlc2VydmVBdHRhY2htZW50czwvY29kZT4gaW4gYW55IGdpdmVuIGVsZW1lbnQgb2YgPGNvZGU+cFN1YnBhc3NlczwvY29kZT4gaXMgYm91bmQgdG8gYSByYW5nZSBvZiBhIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QgdGhhdCBvdmVybGFwcyB3aXRoIGFueSBvdGhlciBhdHRhY2htZW50IGluIGFueSBzdWJwYXNzIChpbmNsdWRpbmcgdGhlIHNhbWUgc3VicGFzcyksIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFI8L2NvZGU+IHN0cnVjdHVyZXMgZGVzY3JpYmluZyB0aGVtIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgPGNvZGU+VktfQVRUQUNITUVOVF9ERVNDUklQVElPTl9NQVlfQUxJQVNfQklUPC9jb2RlPiBpbiA8Y29kZT5mbGFnczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLWF0dGFjaG1lbnQtMDMwNTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBJbnB1dEF0dGFjaG1lbnRzPC9jb2RlPiwgPGNvZGU+cENvbG9yQXR0YWNobWVudHM8L2NvZGU+LCA8Y29kZT5wUmVzb2x2ZUF0dGFjaG1lbnRzPC9jb2RlPiBvciA8Y29kZT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudDwvY29kZT4sIG9yIGFueSBlbGVtZW50IG9mIDxjb2RlPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzPC9jb2RlPiBpbiBhbnkgZ2l2ZW4gZWxlbWVudCBvZiA8Y29kZT5wU3VicGFzc2VzPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcEF0dGFjaG1lbnRzLTAyNTIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGFueSBtZW1iZXIgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiB3aXRoIGEgPGNvZGU+bG9hZE9wPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI8L2NvZGU+LCB0aGUgZmlyc3QgdXNlIG9mIHRoYXQgYXR0YWNobWVudCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgc3BlY2lmeSBhIDxjb2RlPmxheW91dDwvY29kZT4gZXF1YWwgdG8gPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBBdHRhY2htZW50cy0wMjUyMyIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBhbnkgbWVtYmVyIG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gd2l0aCBhIDxjb2RlPnN0ZW5jaWxMb2FkT3A8L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUjwvY29kZT4sIHRoZSBmaXJzdCB1c2Ugb2YgdGhhdCBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBzcGVjaWZ5IGEgPGNvZGU+bGF5b3V0PC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBEZXBlbmRlbmNpZXMtMDMwNTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cERlcGVuZGVuY2llczwvY29kZT4sIGlmIHRoZSA8Y29kZT5zcmNTdWJwYXNzPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfU1VCUEFTU19FWFRFUk5BTDwvY29kZT4sIGFsbCBzdGFnZSBmbGFncyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiBtZW1iZXIgb2YgdGhhdCBkZXBlbmRlbmN5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcGlwZWxpbmUgc3RhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1waXBlbGluZS1zdGFnZXMtdHlwZXNcIj5waXBlbGluZTwvYT4gaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+cGlwZWxpbmVCaW5kUG9pbnQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgc291cmNlIHN1YnBhc3MiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBEZXBlbmRlbmNpZXMtMDMwNTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cERlcGVuZGVuY2llczwvY29kZT4sIGlmIHRoZSA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfU1VCUEFTU19FWFRFUk5BTDwvY29kZT4sIGFsbCBzdGFnZSBmbGFncyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiBtZW1iZXIgb2YgdGhhdCBkZXBlbmRlbmN5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcGlwZWxpbmUgc3RhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1waXBlbGluZS1zdGFnZXMtdHlwZXNcIj5waXBlbGluZTwvYT4gaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+cGlwZWxpbmVCaW5kUG9pbnQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgZGVzdGluYXRpb24gc3VicGFzcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcENvcnJlbGF0ZWRWaWV3TWFza3MtMDMwNTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc2V0IG9mIGJpdHMgaW5jbHVkZWQgaW4gYW55IGVsZW1lbnQgb2YgPGNvZGU+cENvcnJlbGF0ZWRWaWV3TWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBvdmVybGFwIHdpdGggdGhlIHNldCBvZiBiaXRzIGluY2x1ZGVkIGluIGFueSBvdGhlciBlbGVtZW50IG9mIDxjb2RlPnBDb3JyZWxhdGVkVmlld01hc2tzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItdmlld01hc2stMDMwNTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFJcIj5Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFI8L2E+Ojo8Y29kZT52aWV3TWFzazwvY29kZT4gbWVtYmVyIG9mIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU3VicGFzc2VzPC9jb2RlPiBpcyA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+Y29ycmVsYXRlZFZpZXdNYXNrQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi12aWV3TWFzay0wMzA1OCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUlwiPlZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUjwvYT46Ojxjb2RlPnZpZXdNYXNrPC9jb2RlPiBtZW1iZXIgb2YgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTdWJwYXNzZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVpdGhlciBhbGwgYmUgPGNvZGU+MDwvY29kZT4sIG9yIGFsbCBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXZpZXdNYXNrLTAzMDU5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSXCI+VmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSPC9hPjo6PGNvZGU+dmlld01hc2s8L2NvZGU+IG1lbWJlciBvZiBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFN1YnBhc3NlczwvY29kZT4gaXMgPGNvZGU+MDwvY29kZT4sIHRoZSA8Y29kZT5kZXBlbmRlbmN5RmxhZ3M8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wRGVwZW5kZW5jaWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcERlcGVuZGVuY2llcy0wMzA2MCIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBhbnkgZWxlbWVudCBvZiA8Y29kZT5wRGVwZW5kZW5jaWVzPC9jb2RlPiB3aGVyZSBpdHMgPGNvZGU+c3JjU3VicGFzczwvY29kZT4gbWVtYmVyIGVxdWFscyBpdHMgPGNvZGU+ZHN0U3VicGFzczwvY29kZT4gbWVtYmVyLCBpZiB0aGUgPGNvZGU+dmlld01hc2s8L2NvZGU+IG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIDxjb2RlPnBTdWJwYXNzZXM8L2NvZGU+IGluY2x1ZGVzIG1vcmUgdGhhbiBvbmUgYml0LCBpdHMgPGNvZGU+ZGVwZW5kZW5jeUZsYWdzPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSA8Y29kZT5WS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItdmlld01hc2stMDI1MjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+dmlld01hc2s8L2NvZGU+IG1lbWJlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhIGJpdCBzZXQgYXQgYW4gaW5kZXggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUxpbWl0c1wiPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2E+Ojo8Y29kZT5tYXhGcmFtZWJ1ZmZlckxheWVyczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLWF0dGFjaG1lbnQtMDI1MjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wSW5wdXRBdHRhY2htZW50czwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBTdWJwYXNzZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4sIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgdGhhdCBlbGVtZW50IG9mIDxjb2RlPnBJbnB1dEF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGluY2x1ZGUgYXNwZWN0cyB0aGF0IGFyZSBwcmVzZW50IGluIGltYWdlcyBvZiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB0aGUgZWxlbWVudCBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHNwZWNpZmllZCBieSA8Y29kZT5hdHRhY2htZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItc3JjU3VicGFzcy0wMjUyNiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zcmNTdWJwYXNzPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBEZXBlbmRlbmNpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5zdWJwYXNzQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1kc3RTdWJwYXNzLTAyNTI3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmRzdFN1YnBhc3M8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cERlcGVuZGVuY2llczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPnN1YnBhc3NDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPXzJfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUXCI+VmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wQXR0YWNobWVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmF0dGFjaG1lbnRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFJcIj5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBTdWJwYXNzZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1YnBhc3NlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnN1YnBhc3NDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFJcIj5Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBEZXBlbmRlbmNpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVwZW5kZW5jeUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBEZXBlbmRlbmNpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kZXBlbmRlbmN5Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFJcIj5Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcENvcnJlbGF0ZWRWaWV3TWFza3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29ycmVsYXRlZFZpZXdNYXNrQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cENvcnJlbGF0ZWRWaWV3TWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb3JyZWxhdGVkVmlld01hc2tDb3VudDwvY29kZT4gPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItc3VicGFzc0NvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3VicGFzc0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIiOiB7CisgICAgICAiKFZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZmluYWxMYXlvdXQtMDMwNjEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5maW5hbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMyOTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgY29sb3IgZm9ybWF0LCBuYW1lOmluaXRpYWxMYXlvdXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMjk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0LCBuYW1lOmluaXRpYWxMYXlvdXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMjk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGNvbG9yIGZvcm1hdCwgbmFtZTpmaW5hbExheW91dCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMyOTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQsIG5hbWU6ZmluYWxMYXlvdXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl8yX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHNcIj5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zYW1wbGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZUNvdW50RmxhZ0JpdHNcIj5Wa1NhbXBsZUNvdW50RmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItbG9hZE9wLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmxvYWRPcDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQXR0YWNobWVudExvYWRPcFwiPlZrQXR0YWNobWVudExvYWRPcDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zdG9yZU9wLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0b3JlT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRTdG9yZU9wXCI+VmtBdHRhY2htZW50U3RvcmVPcDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zdGVuY2lsTG9hZE9wLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0ZW5jaWxMb2FkT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRMb2FkT3BcIj5Wa0F0dGFjaG1lbnRMb2FkT3A8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc3RlbmNpbFN0b3JlT3AtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RlbmNpbFN0b3JlT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRTdG9yZU9wXCI+VmtBdHRhY2htZW50U3RvcmVPcDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1pbml0aWFsTGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluaXRpYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1maW5hbExheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5maW5hbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMikrKFZLX0tIUl9zZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzXCI+PGNvZGU+c2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzPC9jb2RlPjwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+aW5pdGlhbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyOTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNcIj48Y29kZT5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHM8L2NvZGU+PC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5maW5hbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgY29sb3IgZm9ybWF0LCA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgYSBjb2xvciBmb3JtYXQsIDxjb2RlPmZpbmFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCB3aGljaCBpbmNsdWRlcyBib3RoIGRlcHRoIGFuZCBzdGVuY2lsIGFzcGVjdHMsIGFuZCA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4sIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSXCI+VmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBhc3BlY3RzLCBhbmQgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIGEgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFJcIj5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCB3aGljaCBpbmNsdWRlcyBvbmx5IHRoZSBkZXB0aCBhc3BlY3QsIDxjb2RlPmluaXRpYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIGRlcHRoIGFzcGVjdCwgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIHN0ZW5jaWwgYXNwZWN0LCA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIHN0ZW5jaWwgYXNwZWN0LCA8Y29kZT5maW5hbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiI6IHsKKyAgICAgICIoVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMikrKFZLX0tIUl9zZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEluaXRpYWxMYXlvdXQtMDMzMDgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGVuY2lsSW5pdGlhbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxGaW5hbExheW91dC0wMzMwOSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0ZW5jaWxGaW5hbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxGaW5hbExheW91dC0wMzMxMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0ZW5jaWxGaW5hbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX1NURU5DSUxfTEFZT1VUX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUi1zdGVuY2lsSW5pdGlhbExheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGVuY2lsSW5pdGlhbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxGaW5hbExheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGVuY2lsRmluYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIiOiB7CisgICAgICAiKFZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcGlwZWxpbmVCaW5kUG9pbnQtMDMwNjIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1jb2xvckF0dGFjaG1lbnRDb3VudC0wMzA2MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbG9yQXR0YWNobWVudENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heENvbG9yQXR0YWNobWVudHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItbG9hZE9wLTAzMDY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGZpcnN0IHVzZSBvZiBhbiBhdHRhY2htZW50IGluIHRoaXMgcmVuZGVyIHBhc3MgaXMgYXMgYW4gaW5wdXQgYXR0YWNobWVudCwgYW5kIHRoZSBhdHRhY2htZW50IGlzIG5vdCBhbHNvIHVzZWQgYXMgYSBjb2xvciBvciBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgaW4gdGhlIHNhbWUgc3VicGFzcywgdGhlbiA8Y29kZT5sb2FkT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy0wMzA2NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgZm9yIGVhY2ggcmVzb2x2ZSBhdHRhY2htZW50IHRoYXQgZG9lcyBub3QgaGF2ZSB0aGUgdmFsdWUgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCB0aGUgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIHRoZSB2YWx1ZSA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAzMDY2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFJlc29sdmVBdHRhY2htZW50czwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCBmb3IgZWFjaCByZXNvbHZlIGF0dGFjaG1lbnQgdGhhdCBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCB0aGUgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGEgc2FtcGxlIGNvdW50IG9mIDxjb2RlPlZLX1NBTVBMRV9DT1VOVF8xX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAzMDY3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFJlc29sdmVBdHRhY2htZW50czwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCBlYWNoIHJlc29sdmUgYXR0YWNobWVudCB0aGF0IGlzIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIHNhbXBsZSBjb3VudCBvZiA8Y29kZT5WS19TQU1QTEVfQ09VTlRfMV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy0wMzA2OCIsCisgICAgICAgICAgInRleHQiOiAiIEFueSBnaXZlbiBlbGVtZW50IG9mIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiBhcyBpdHMgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcENvbG9yQXR0YWNobWVudHMtMDMwNjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgYXR0YWNobWVudHMgaW4gPGNvZGU+cENvbG9yQXR0YWNobWVudHM8L2NvZGU+IHRoYXQgYXJlIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSB0aGUgc2FtZSBzYW1wbGUgY291bnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0wMzA3MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5laXRoZXIgdGhlIDxjb2RlPlZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXM8L2NvZGU+IG5vciB0aGUgPGNvZGU+VktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlczwvY29kZT4gZXh0ZW5zaW9ucyBhcmUgZW5hYmxlZCwgYW5kIGlmIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IGFuZCBhbnkgYXR0YWNobWVudHMgaW4gPGNvZGU+cENvbG9yQXR0YWNobWVudHM8L2NvZGU+IGFyZSBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCB0aGV5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgdGhlIHNhbWUgc2FtcGxlIGNvdW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItYXR0YWNobWVudC0wMzA3MyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5hdHRhY2htZW50PC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFByZXNlcnZlQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUHJlc2VydmVBdHRhY2htZW50cy0wMzA3NCIsCisgICAgICAgICAgInRleHQiOiAiIEFueSBnaXZlbiBlbGVtZW50IG9mIDxjb2RlPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWxzbyBiZSBhbiBlbGVtZW50IG9mIGFueSBvdGhlciBtZW1iZXIgb2YgdGhlIHN1YnBhc3MgZGVzY3JpcHRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1sYXlvdXQtMDI1MjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgYXR0YWNobWVudCBpcyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRSZWZlcmVuY2VcIj5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L2E+IG1lbWJlciwgdGhlbiBlYWNoIHVzZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiB1c2UgdGhlIHNhbWUgPGNvZGU+bGF5b3V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWF0dGFjaG1lbnQtMDI3OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBJbnB1dEF0dGFjaG1lbnRzPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCB0aGVuIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrSW1hZ2VBc3BlY3RGbGFnQml0c1wiPlZrSW1hZ2VBc3BlY3RGbGFnQml0czwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1hdHRhY2htZW50LTAyODAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wSW5wdXRBdHRhY2htZW50czwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgdGhlbiB0aGUgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gbWVtYmVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWF0dGFjaG1lbnQtMDI4MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBJbnB1dEF0dGFjaG1lbnRzPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCB0aGVuIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OXzJfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0c1wiPlZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBpcGVsaW5lQmluZFBvaW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lQmluZFBvaW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUJpbmRQb2ludFwiPlZrUGlwZWxpbmVCaW5kUG9pbnQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcElucHV0QXR0YWNobWVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW5wdXRBdHRhY2htZW50Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cElucHV0QXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5pbnB1dEF0dGFjaG1lbnRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSXCI+VmtBdHRhY2htZW50UmVmZXJlbmNlMktIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBDb2xvckF0dGFjaG1lbnRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbG9yQXR0YWNobWVudENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBDb2xvckF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+Y29sb3JBdHRhY2htZW50Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUlwiPlZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUmVzb2x2ZUF0dGFjaG1lbnRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbG9yQXR0YWNobWVudENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wUmVzb2x2ZUF0dGFjaG1lbnRzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBSZXNvbHZlQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb2xvckF0dGFjaG1lbnRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSXCI+VmtBdHRhY2htZW50UmVmZXJlbmNlMktIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFJcIj5Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUHJlc2VydmVBdHRhY2htZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wUHJlc2VydmVBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnByZXNlcnZlQXR0YWNobWVudENvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSsoVktfQU1EX21peGVkX2F0dGFjaG1lbnRfc2FtcGxlcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wQ29sb3JBdHRhY2htZW50cy0wMzA3MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5WS19BTURfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzPC9jb2RlPiBleHRlbnNpb24gaXMgZW5hYmxlZCwgYWxsIGF0dGFjaG1lbnRzIGluIDxjb2RlPnBDb2xvckF0dGFjaG1lbnRzPC9jb2RlPiB0aGF0IGFyZSBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSBzYW1wbGUgY291bnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNhbXBsZSBjb3VudCBvZiA8Y29kZT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudDwvY29kZT4gaWYgaXQgaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMikrKFZLX05WWF9tdWx0aXZpZXdfcGVyX3ZpZXdfYXR0cmlidXRlcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1mbGFncy0wMzA3NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19TVUJQQVNTX0RFU0NSSVBUSU9OX1BFUl9WSUVXX1BPU0lUSU9OX1hfT05MWV9CSVRfTlZYPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBpbmNsdWRlIDxjb2RlPlZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfQVRUUklCVVRFU19CSVRfTlZYPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIiOiB7CisgICAgICAiKFZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIpKyhWS19LSFJfZGVwdGhfc3RlbmNpbF9yZXNvbHZlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0wMzE3NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+IGFuZCBkb2VzIG5vdCBoYXZlIHRoZSB2YWx1ZSA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4sIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSB0aGUgdmFsdWUgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50PC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4gYW5kIGRvZXMgbm90IGhhdmUgdGhlIHZhbHVlIDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgPGNvZGU+ZGVwdGhSZXNvbHZlTW9kZTwvY29kZT4gYW5kIDxjb2RlPnN0ZW5jaWxSZXNvbHZlTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJvdGggYmUgPGNvZGU+VktfUkVTT0xWRV9NT0RFX05PTkVfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0wMzE3OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+IGFuZCBkb2VzIG5vdCBoYXZlIHRoZSB2YWx1ZSA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4sIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhIHNhbXBsZSBjb3VudCBvZiA8Y29kZT5WS19TQU1QTEVfQ09VTlRfMV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTgwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50PC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4gYW5kIGRvZXMgbm90IGhhdmUgdGhlIHZhbHVlIDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgPGNvZGU+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgc2FtcGxlIGNvdW50IG9mIDxjb2RlPlZLX1NBTVBMRV9DT1VOVF8xX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDI2NTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiBhbmQgZG9lcyBub3QgaGF2ZSB0aGUgdmFsdWUgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+IHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIGZvcm1hdCB3aG9zZSBmZWF0dXJlcyBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTgxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gb2YgPGNvZGU+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50PC9jb2RlPiBoYXMgYSBkZXB0aCBjb21wb25lbnQsIHRoZW4gdGhlIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gb2YgPGNvZGU+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSBkZXB0aCBjb21wb25lbnQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYml0cyBhbmQgbnVtZXJpY2FsIHR5cGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiBvZiA8Y29kZT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQ8L2NvZGU+IGhhcyBhIHN0ZW5jaWwgY29tcG9uZW50LCB0aGVuIHRoZSA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IG9mIDxjb2RlPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgc3RlbmNpbCBjb21wb25lbnQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYml0cyBhbmQgbnVtZXJpY2FsIHR5cGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1kZXB0aFJlc29sdmVNb2RlLTAzMTgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHZhbHVlIG9mIDxjb2RlPmRlcHRoUmVzb2x2ZU1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZSBvZiB0aGUgYml0cyBzZXQgaW4gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFI8L2E+Ojo8Y29kZT5zdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlczwvY29kZT4gb3IgPGNvZGU+VktfUkVTT0xWRV9NT0RFX05PTkVfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXN0ZW5jaWxSZXNvbHZlTW9kZS0wMzE4NCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB2YWx1ZSBvZiA8Y29kZT5zdGVuY2lsUmVzb2x2ZU1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZSBvZiB0aGUgYml0cyBzZXQgaW4gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFI8L2E+Ojo8Y29kZT5zdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzPC9jb2RlPiBvciA8Y29kZT5WS19SRVNPTFZFX01PREVfTk9ORV9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gb2YgPGNvZGU+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50PC9jb2RlPiBoYXMgYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBjb21wb25lbnRzLCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUlwiPlZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUjwvYT46Ojxjb2RlPmluZGVwZW5kZW50UmVzb2x2ZTwvY29kZT4gaXMgPGNvZGU+VktfRkFMU0U8L2NvZGU+LCBhbmQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFI8L2E+Ojo8Y29kZT5pbmRlcGVuZGVudFJlc29sdmVOb25lPC9jb2RlPiBpcyA8Y29kZT5WS19GQUxTRTwvY29kZT4sIHRoZW4gdGhlIHZhbHVlcyBvZiA8Y29kZT5kZXB0aFJlc29sdmVNb2RlPC9jb2RlPiBhbmQgPGNvZGU+c3RlbmNpbFJlc29sdmVNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpZGVudGljYWwiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiBvZiA8Y29kZT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQ8L2NvZGU+IGhhcyBib3RoIGRlcHRoIGFuZCBzdGVuY2lsIGNvbXBvbmVudHMsIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSXCI+VmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSPC9hPjo6PGNvZGU+aW5kZXBlbmRlbnRSZXNvbHZlPC9jb2RlPiBpcyA8Y29kZT5WS19GQUxTRTwvY29kZT4gYW5kIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSXCI+VmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSPC9hPjo6PGNvZGU+aW5kZXBlbmRlbnRSZXNvbHZlTm9uZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIHRoZW4gdGhlIHZhbHVlcyBvZiA8Y29kZT5kZXB0aFJlc29sdmVNb2RlPC9jb2RlPiBhbmQgPGNvZGU+c3RlbmNpbFJlc29sdmVNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpZGVudGljYWwgb3Igb25lIG9mIHRoZW0gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfUkVTT0xWRV9NT0RFX05PTkVfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fREVQVEhfU1RFTkNJTF9SRVNPTFZFX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1kZXB0aFJlc29sdmVNb2RlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlcHRoUmVzb2x2ZU1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFJcIj5Wa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFI8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItc3RlbmNpbFJlc29sdmVNb2RlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0ZW5jaWxSZXNvbHZlTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUlwiPlZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50PC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSXCI+VmtBdHRhY2htZW50UmVmZXJlbmNlMktIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiI6IHsKKyAgICAgICIoVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItbGF5b3V0LTAzMDc3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hdHRhY2htZW50PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCBhbmQgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+LCA8Y29kZT5sYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgYW5kIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDwvY29kZT4sIDxjb2RlPmxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1sYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZUxheW91dFwiPlZrSW1hZ2VMYXlvdXQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSsoVktfS0hSX3NlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0cykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMzEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzXCI+PGNvZGU+c2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzPC9jb2RlPjwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4sIDxjb2RlPmxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+LCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgYW5kIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ8L2NvZGU+LCA8Y29kZT5sYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiwiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4sIGFuZCA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBpbmNsdWRlcyBib3RoIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+IGFuZCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ8L2NvZGU+LCBhbmQgPGNvZGU+bGF5b3V0PC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4sIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUlwiPlZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgYW5kIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IGluY2x1ZGVzIG9ubHkgPGNvZGU+VktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDwvY29kZT4gdGhlbiA8Y29kZT5sYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YXR0YWNobWVudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgYW5kIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IGluY2x1ZGVzIG9ubHkgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUPC9jb2RlPiB0aGVuIDxjb2RlPmxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSIjogeworICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSsoVktfS0hSX3NlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0cykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbExheW91dC0wMzMxOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0ZW5jaWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV9TVEVOQ0lMX0xBWU9VVF9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RlbmNpbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3VicGFzc0RlcGVuZGVuY3kyS0hSIjogeworICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLTAzMDgwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZ2VvbWV0cnlTaGFkZXJcIj5nZW9tZXRyeSBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDMwODEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1nZW9tZXRyeVNoYWRlclwiPmdlb21ldHJ5IHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay0wMzA4MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRlc3NlbGxhdGlvblNoYWRlclwiPnRlc3NlbGxhdGlvbiBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDMwODMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10ZXNzZWxsYXRpb25TaGFkZXJcIj50ZXNzZWxsYXRpb24gc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUPC9jb2RlPiBvciA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3VicGFzcy0wMzA4NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY1N1YnBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPiwgdW5sZXNzIG9uZSBvZiB0aGVtIGlzIDxjb2RlPlZLX1NVQlBBU1NfRVhURVJOQUw8L2NvZGU+LCB0byBhdm9pZCBjeWNsaWMgZGVwZW5kZW5jaWVzIGFuZCBlbnN1cmUgYSB2YWxpZCBleGVjdXRpb24gb3JkZXIiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N1YnBhc3MtMDMwODUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNTdWJwYXNzPC9jb2RlPiBhbmQgPGNvZGU+ZHN0U3VicGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJvdGggYmUgZXF1YWwgdG8gPGNvZGU+VktfU1VCUEFTU19FWFRFUk5BTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N1YnBhc3MtMDMwODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zcmNTdWJwYXNzPC9jb2RlPiBpcyBlcXVhbCB0byA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPiBhbmQgbm90IGFsbCBvZiB0aGUgc3RhZ2VzIGluIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gYW5kIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gYXJlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWZyYW1lYnVmZmVyLXJlZ2lvbnNcIj5mcmFtZWJ1ZmZlci1zcGFjZSBzdGFnZXM8L2E+LCB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tcGlwZWxpbmUtc3RhZ2VzLW9yZGVyXCI+bG9naWNhbGx5IGxhdGVzdDwvYT4gcGlwZWxpbmUgc3RhZ2UgaW4gPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1waXBlbGluZS1zdGFnZXMtb3JkZXJcIj5sb2dpY2FsbHkgZWFybGllcjwvYT4gdGhhbiBvciBlcXVhbCB0byB0aGUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tcGlwZWxpbmUtc3RhZ2VzLW9yZGVyXCI+bG9naWNhbGx5IGVhcmxpZXN0PC9hPiBwaXBlbGluZSBzdGFnZSBpbiA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNBY2Nlc3NNYXNrLTAzMDg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IGFjY2VzcyBmbGFnIGluY2x1ZGVkIGluIDxjb2RlPnNyY0FjY2Vzc01hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHN1cHBvcnRlZCBieSBvbmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+LCBhcyBzcGVjaWZpZWQgaW4gdGhlIDxhIGhyZWY9XCIjc3luY2hyb25pemF0aW9uLWFjY2Vzcy10eXBlcy1zdXBwb3J0ZWRcIj50YWJsZSBvZiBzdXBwb3J0ZWQgYWNjZXNzIHR5cGVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0QWNjZXNzTWFzay0wMzA4OSIsCisgICAgICAgICAgInRleHQiOiAiIEFueSBhY2Nlc3MgZmxhZyBpbmNsdWRlZCBpbiA8Y29kZT5kc3RBY2Nlc3NNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzdXBwb3J0ZWQgYnkgb25lIG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiwgYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1hY2Nlc3MtdHlwZXMtc3VwcG9ydGVkXCI+dGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRlcGVuZGVuY3lGbGFncy0wMzA5MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlcGVuZGVuY3lGbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVDwvY29kZT4sIDxjb2RlPnNyY1N1YnBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBlcXVhbCB0byA8Y29kZT5WS19TVUJQQVNTX0VYVEVSTkFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZGVwZW5kZW5jeUZsYWdzLTAzMDkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVwZW5kZW5jeUZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUPC9jb2RlPiwgPGNvZGU+ZHN0U3VicGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGVxdWFsIHRvIDxjb2RlPlZLX1NVQlBBU1NfRVhURVJOQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAyMjQ1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3JjU3VicGFzczwvY29kZT4gZXF1YWxzIDxjb2RlPmRzdFN1YnBhc3M8L2NvZGU+LCBhbmQgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiBhbmQgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiBib3RoIGluY2x1ZGUgYSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1mcmFtZWJ1ZmZlci1yZWdpb25zXCI+ZnJhbWVidWZmZXItc3BhY2Ugc3RhZ2U8L2E+LCB0aGVuIDxjb2RlPmRlcGVuZGVuY3lGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSA8Y29kZT5WS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi12aWV3T2Zmc2V0LTAyNTMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dmlld09mZnNldDwvY29kZT4gaXMgbm90IGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5zcmNTdWJwYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgZXF1YWwgdG8gPGNvZGU+ZHN0U3VicGFzczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRlcGVuZGVuY3lGbGFncy0wMzA5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlcGVuZGVuY3lGbGFnczwvY29kZT4gZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUPC9jb2RlPiwgPGNvZGU+dmlld09mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXZpZXdPZmZzZXQtMDMwOTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52aWV3T2Zmc2V0PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnNyY1N1YnBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBlcXVhbCB0byA8Y29kZT5kc3RTdWJwYXNzPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU3RhZ2VGbGFnQml0c1wiPlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzXCI+VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdFN0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNBY2Nlc3NNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0FjY2Vzc01hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0FjY2Vzc0ZsYWdCaXRzXCI+VmtBY2Nlc3NGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RBY2Nlc3NNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEFjY2Vzc01hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0FjY2Vzc0ZsYWdCaXRzXCI+VmtBY2Nlc3NGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kZXBlbmRlbmN5RmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVwZW5kZW5jeUZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtEZXBlbmRlbmN5RmxhZ0JpdHNcIj5Wa0RlcGVuZGVuY3lGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSsoVktfTlZfbWVzaF9zaGFkZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdGFnZU1hc2stMDIxMDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tZXNoU2hhZGVyXCI+bWVzaCBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay0wMjEwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRhc2tTaGFkZXJcIj50YXNrIHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnNyY1N0YWdlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLTAyMTA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbWVzaFNoYWRlclwiPm1lc2ggc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDIxMDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10YXNrU2hhZGVyXCI+dGFzayBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lSZW5kZXJQYXNzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy0wMDg3MyIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy0wMDg3NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lSZW5kZXJQYXNzLXJlbmRlclBhc3MtMDA4NzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzXCI+VmtSZW5kZXJQYXNzPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlRnJhbWVidWZmZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVGcmFtZWJ1ZmZlci1wQ3JlYXRlSW5mby0wMjc3NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPi0mZ3Q7ZmxhZ3MgZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBhbmQgPGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4tJmd0O3BBdHRhY2htZW50cyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCBvbiA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUZyYW1lYnVmZmVyLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRnJhbWVidWZmZXItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUZyYW1lYnVmZmVyLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUZyYW1lYnVmZmVyLXBGcmFtZWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRnJhbWVidWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlclwiPlZrRnJhbWVidWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWF0dGFjaG1lbnRDb3VudC0wMDg3NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmF0dGFjaG1lbnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIGF0dGFjaG1lbnQgY291bnQgc3BlY2lmaWVkIGluIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMjc3OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBkb2VzIG5vdCBpbmNsdWRlIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGFuZCA8Y29kZT5hdHRhY2htZW50Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5hdHRhY2htZW50Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODc3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gdGhhdCBpcyB1c2VkIGFzIGEgY29sb3IgYXR0YWNobWVudCBvciByZXNvbHZlIGF0dGFjaG1lbnQgYnkgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI2MzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiB0aGF0IGlzIHVzZWQgYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgYnkgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg3OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBkb2VzIG5vdCBpbmNsdWRlIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHRoYXQgaXMgdXNlZCBhcyBhbiBpbnB1dCBhdHRhY2htZW50IGJ5IDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgaW5jbHVkaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODgwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gdmFsdWUgdGhhdCBtYXRjaGVzIHRoZSA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHNwZWNpZmllZCBieSB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gaW4gPGNvZGU+cmVuZGVyUGFzczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBkb2VzIG5vdCBpbmNsdWRlIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT5zYW1wbGVzPC9jb2RlPiB2YWx1ZSB0aGF0IG1hdGNoZXMgdGhlIDxjb2RlPnNhbXBsZXM8L2NvZGU+IHZhbHVlIHNwZWNpZmllZCBieSB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gaW4gPGNvZGU+cmVuZGVyUGFzczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBkb2VzIG5vdCBpbmNsdWRlIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgc3BlY2lmeSBhIHNpbmdsZSBtaXAgbGV2ZWwiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBkb2VzIG5vdCBpbmNsdWRlIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIGlkZW50aXR5IHN3aXp6bGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXdpZHRoLTAwODg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+d2lkdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXdpZHRoLTAwODg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+d2lkdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RnJhbWVidWZmZXJXaWR0aDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWhlaWdodC0wMDg4NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhlaWdodDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8taGVpZ2h0LTAwODg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heEZyYW1lYnVmZmVySGVpZ2h0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tbGF5ZXJzLTAwODg5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5ZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1sYXllcnMtMDA4OTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5sYXllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RnJhbWVidWZmZXJMYXllcnM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBkb2VzIG5vdCBpbmNsdWRlIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGFuZCA8Y29kZT5hdHRhY2htZW50Q291bnQ8L2NvZGU+IGlzIG5vdCAwLCA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5hdHRhY2htZW50Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFJcIj5Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHNcIj5Wa0ZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzXCI+VmtSZW5kZXJQYXNzPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4sIGFuZCB0aGUgZWxlbWVudHMgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2RlcHRoX3N0ZW5jaWxfcmVzb2x2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjYzNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBkb2VzIG5vdCBpbmNsdWRlIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHRoYXQgaXMgdXNlZCBhcyBhIGRlcHRoL3N0ZW5jaWwgcmVzb2x2ZSBhdHRhY2htZW50IGJ5IDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgaW5jbHVkaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI1NTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiB0aGF0IGlzIHVzZWQgYXMgYSBmcmFnbWVudCBkZW5zaXR5IG1hcCBhdHRhY2htZW50IGJ5IDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPGNvZGU+ZmxhZ3M8L2NvZGU+IHZhbHVlIGluY2x1ZGluZyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDI1NTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBoYXMgYSBmcmFnbWVudCBkZW5zaXR5IG1hcCBhdHRhY2htZW50IGFuZCA8YSBocmVmPVwiI2ZlYXR1cmVzLW5vbnN1YnNhbXBsZWRpbWFnZXNcIj5ub24tc3Vic2FtcGxlIGltYWdlIGZlYXR1cmU8L2E+IGlzIG5vdCBlbmFibGVkLCBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPGNvZGU+ZmxhZ3M8L2NvZGU+IHZhbHVlIGluY2x1ZGluZyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUPC9jb2RlPiB1bmxlc3MgdGhhdCBlbGVtZW50IGlzIHRoZSBmcmFnbWVudCBkZW5zaXR5IG1hcCBhdHRhY2htZW50LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNTU0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBkaW1lbnNpb25zIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBjb3JyZXNwb25kaW5nIGZyYW1lYnVmZmVyIGRpbWVuc2lvbiBleGNlcHQgZm9yIGFueSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSA8Y29kZT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNTU1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgYW4gZWxlbWVudCBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHRoYXQgaXMgcmVmZXJlbmNlZCBieSA8Y29kZT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgd2lkdGggYXQgbGVhc3QgYXMgbGFyZ2UgYXMgXFwoXFxsY2VpbHtcXGZyYWN7d2lkdGh9e21heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZV97d2lkdGh9fX1cXHJjZWlsXFwpIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI1NTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBhbiBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gdGhhdCBpcyByZWZlcmVuY2VkIGJ5IDxjb2RlPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSBoZWlnaHQgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgXFwoXFxsY2VpbHtcXGZyYWN7aGVpZ2h0fXttYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemVfe2hlaWdodH19fVxccmNlaWxcXCkiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGRpbWVuc2lvbnMgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZnJhbWVidWZmZXIgZGltZW5zaW9uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDI3NDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiB3YXMgc3BlY2lmaWVkIHdpdGggbm9uLXplcm8gdmlldyBtYXNrcywgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IGdyZWF0ZXIgdGhhbiB0aGUgaW5kZXggb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCBpbiBhbnkgb2YgdGhvc2UgdmlldyBtYXNrcyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSshKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI3NDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbiBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gdGhhdCBpcyByZWZlcmVuY2VkIGJ5IDxjb2RlPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8Y29kZT5sYXllckNvdW50PC9jb2RlPiBlcXVhbCB0byA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDI3NDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiB3YXMgc3BlY2lmaWVkIHdpdGggbm9uLXplcm8gdmlldyBtYXNrcywgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gdGhhdCBpcyBub3QgcmVmZXJlbmNlZCBieSA8Y29kZT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gZ3JlYXRlciB0aGFuIHRoZSBpbmRleCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0IGluIGFueSBvZiB0aG9zZSB2aWV3IG1hc2tzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAyNzQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gd2FzIHNwZWNpZmllZCB3aXRoIG5vbi16ZXJvIHZpZXcgbWFza3MsIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHRoYXQgaXMgcmVmZXJlbmNlZCBieSA8Y29kZT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gZXF1YWwgdG8gPGNvZGU+MTwvY29kZT4gb3IgZ3JlYXRlciB0aGFuIHRoZSBpbmRleCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0IGluIGFueSBvZiB0aG9zZSB2aWV3IG1hc2tzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAyNzQ3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gd2FzIG5vdCBzcGVjaWZpZWQgd2l0aCBub24temVybyB2aWV3IG1hc2tzLCBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgPGNvZGU+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IGVxdWFsIHRvIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbXVsdGl2aWV3KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjUzMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IHdhcyBzcGVjaWZpZWQgd2l0aCBub24temVybyB2aWV3IG1hc2tzLCA8Y29kZT5sYXllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gdGhhdCBpcyBhIDJEIG9yIDJEIGFycmF5IGltYWdlIHZpZXcgdGFrZW4gZnJvbSBhIDNEIGltYWdlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1pbWFnZWxlc3NGcmFtZWJ1ZmZlclwiPmltYWdlbGVzcyBmcmFtZWJ1ZmZlcjwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPmF0dGFjaG1lbnRJbWFnZUluZm9Db3VudDwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gZWl0aGVyIHplcm8gb3IgPGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPnVzYWdlPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50SW1hZ2VJbmZvczwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gdGhhdCByZWZlcnMgdG8gYW4gYXR0YWNobWVudCB1c2VkIGFzIGEgY29sb3IgYXR0YWNobWVudCBvciByZXNvbHZlIGF0dGFjaG1lbnQgYnkgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIHRoZSA8Y29kZT51c2FnZTwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudEltYWdlSW5mb3M8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIHRoYXQgcmVmZXJzIHRvIGFuIGF0dGFjaG1lbnQgdXNlZCBhcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCBieSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCB0aGUgPGNvZGU+dXNhZ2U8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiB0aGUgPGNvZGU+cEF0dGFjaG1lbnRJbWFnZUluZm9zPC9jb2RlPiBtZW1iZXIgb2YgYSA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFJcIj5Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiB0aGF0IHJlZmVycyB0byBhbiBhdHRhY2htZW50IHVzZWQgYXMgYW4gaW5wdXQgYXR0YWNobWVudCBieSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgYXQgbGVhc3Qgb25lIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBWaWV3Rm9ybWF0czwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudEltYWdlSW5mb3M8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mIDxhIGhyZWY9XCIjVmtBdHRhY2htZW50RGVzY3JpcHRpb25cIj5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvYT46Ojxjb2RlPmZvcm1hdDwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9pbWFnZWxlc3NfZnJhbWVidWZmZXIpKyEoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50SW1hZ2VJbmZvczwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPndpZHRoPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPmhlaWdodDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudEltYWdlSW5mb3M8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5oZWlnaHQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyKSsoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50SW1hZ2VJbmZvczwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPndpZHRoPC9jb2RlPiwgZXhjZXB0IGZvciBhbnkgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUXCI+VmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVDwvYT46Ojxjb2RlPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQ8L2NvZGU+IGluIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCB0aGUgPGNvZGU+aGVpZ2h0PC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50SW1hZ2VJbmZvczwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPmhlaWdodDwvY29kZT4sIGV4Y2VwdCBmb3IgYW55IGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVFwiPlZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50PC9jb2RlPiBpbiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50SW1hZ2VJbmZvczwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gdGhhdCBpcyByZWZlcmVuY2VkIGJ5IDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVFwiPlZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50PC9jb2RlPiBpbiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXFwoXFxsY2VpbHtcXGZyYWN7d2lkdGh9e21heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZV97d2lkdGh9fX1cXHJjZWlsXFwpIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCB0aGUgPGNvZGU+aGVpZ2h0PC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50SW1hZ2VJbmZvczwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gdGhhdCBpcyByZWZlcmVuY2VkIGJ5IDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVFwiPlZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50PC9jb2RlPiBpbiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXFwoXFxsY2VpbHtcXGZyYWN7aGVpZ2h0fXttYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemVfe2hlaWdodH19fVxccmNlaWxcXCkiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9pbWFnZWxlc3NfZnJhbWVidWZmZXIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfbXVsdGl2aWV3KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMzE5OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG11bHRpdmlldyBpcyBlbmFibGVkIGZvciA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCB0aGUgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudEltYWdlSW5mb3M8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBiaXQgaW5kZXggc2V0IGluIHRoZSB2aWV3IG1hc2sgaW4gdGhlIHN1YnBhc3NlcyBpbiB3aGljaCBpdCBpcyB1c2VkIGluIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAzMTk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbXVsdGl2aWV3IGlzIG5vdCBlbmFibGVkIGZvciA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCB0aGUgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudEltYWdlSW5mb3M8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5sYXllcnM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyKSshKFZLX1ZFUlNJT05fMV8xK1ZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCB0aGUgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudEltYWdlSW5mb3M8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5sYXllcnM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyKSsoVktfS0hSX2RlcHRoX3N0ZW5jaWxfcmVzb2x2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIHRoZSA8Y29kZT51c2FnZTwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudEltYWdlSW5mb3M8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIHRoYXQgcmVmZXJzIHRvIGFuIGF0dGFjaG1lbnQgdXNlZCBhcyBhIGRlcHRoL3N0ZW5jaWwgcmVzb2x2ZSBhdHRhY2htZW50IGJ5IDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgPGNvZGU+VktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSLXBBdHRhY2htZW50SW1hZ2VJbmZvcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hdHRhY2htZW50SW1hZ2VJbmZvQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEF0dGFjaG1lbnRJbWFnZUluZm9zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YXR0YWNobWVudEltYWdlSW5mb0NvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2ltYWdlbGVzc19mcmFtZWJ1ZmZlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfSU1BR0VfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFItZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlRmxhZ0JpdHNcIj5Wa0ltYWdlQ3JlYXRlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFItdXNhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlVXNhZ2VGbGFnQml0c1wiPlZrSW1hZ2VVc2FnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSLXBWaWV3Rm9ybWF0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52aWV3Rm9ybWF0Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFZpZXdGb3JtYXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dmlld0Zvcm1hdENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveUZyYW1lYnVmZmVyIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLTAwODkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLTAwODkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1mcmFtZWJ1ZmZlci0wMDg5NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyXCI+VmtGcmFtZWJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RnJhbWVidWZmZXItZnJhbWVidWZmZXItcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IGlzIGEgdmFsaWQgaGFuZGxlLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRCZWdpblJlbmRlclBhc3MiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtaW5pdGlhbExheW91dC0wMDg5NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBvZiB0aGUgPGNvZGU+aW5pdGlhbExheW91dDwvY29kZT4gb3IgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtBdHRhY2htZW50RGVzY3JpcHRpb248L2NvZGU+IHN0cnVjdHVyZXMgb3IgdGhlIDxjb2RlPmxheW91dDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L2NvZGU+IHN0cnVjdHVyZXMgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlbmRlciBwYXNzIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+IHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSB2aWV3IG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiBvciA8Y29kZT5maW5hbExheW91dDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gc3RydWN0dXJlcyBvciB0aGUgPGNvZGU+bGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvY29kZT4gc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gdGhlbiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGltYWdlIHZpZXcgb2YgdGhlIGZyYW1lYnVmZmVyIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUmVuZGVyUGFzc0JlZ2luPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPGNvZGU+dXNhZ2U8L2NvZGU+IHZhbHVlIGluY2x1ZGluZyA8Y29kZT5WS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiBvciA8Y29kZT5maW5hbExheW91dDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gc3RydWN0dXJlcyBvciB0aGUgPGNvZGU+bGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvY29kZT4gc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMPC9jb2RlPiB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgaW5jbHVkaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiBvciA8Y29kZT5maW5hbExheW91dDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gc3RydWN0dXJlcyBvciB0aGUgPGNvZGU+bGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvY29kZT4gc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMPC9jb2RlPiB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgaW5jbHVkaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwOTAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiBtZW1iZXJzIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ8L2NvZGU+LCB0aGVuIGVhY2ggc3VjaCA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byB0aGUgY3VycmVudCBsYXlvdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSBzdWJyZXNvdXJjZSBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1zcmNTdGFnZU1hc2stMDA5MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c3JjU3RhZ2VNYXNrPC9jb2RlPiBhbmQgPGNvZGU+ZHN0U3RhZ2VNYXNrPC9jb2RlPiBtZW1iZXJzIG9mIGFueSBlbGVtZW50IG9mIHRoZSA8Y29kZT5wRGVwZW5kZW5jaWVzPC9jb2RlPiBtZW1iZXIgb2YgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NDcmVhdGVJbmZvXCI+VmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzwvYT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGJ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHF1ZXVlIGZhbWlseSBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5xdWV1ZUZhbWlseUluZGV4PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtDb21tYW5kUG9vbENyZWF0ZUluZm9cIj5Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbzwvYT4gdXNlZCB0byBjcmVhdGUgdGhlIGNvbW1hbmQgcG9vbCB3aGljaCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWZyYW1lYnVmZmVyLTAyNTMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGFueSBhdHRhY2htZW50IGluIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiB0aGF0IGlzIHVzZWQgYnkgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gYW5kIGlzIGJvdW5kIHRvIG1lbW9yeSBsb2NhdGlvbnMgdGhhdCBhcmUgYWxzbyBib3VuZCB0byBhbm90aGVyIGF0dGFjaG1lbnQgdXNlZCBieSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiwgYW5kIGlmIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSB1c2VzIGNhdXNlcyBlaXRoZXIgYXR0YWNobWVudCB0byBiZSB3cml0dGVuIHRvLCBib3RoIGF0dGFjaG1lbnRzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgaGFkIHRoZSA8Y29kZT5WS19BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX01BWV9BTElBU19CSVQ8L2NvZGU+IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLXBSZW5kZXJQYXNzQmVnaW4tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NCZWdpbkluZm9cIj5Wa1JlbmRlclBhc3NCZWdpbkluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtY29udGVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29udGVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N1YnBhc3NDb250ZW50c1wiPlZrU3VicGFzc0NvbnRlbnRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtYnVmZmVybGV2ZWwiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHByaW1hcnkgPGNvZGU+VmtDb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiBvciA8Y29kZT5maW5hbExheW91dDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gc3RydWN0dXJlcyBvciB0aGUgPGNvZGU+bGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvY29kZT4gc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+IHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSB2aWV3IG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAxNzU4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiBvciA8Y29kZT5maW5hbExheW91dDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gc3RydWN0dXJlcyBvciB0aGUgPGNvZGU+bGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvY29kZT4gc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gdGhlbiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGltYWdlIHZpZXcgb2YgdGhlIGZyYW1lYnVmZmVyIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUmVuZGVyUGFzc0JlZ2luPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPGNvZGU+dXNhZ2U8L2NvZGU+IHZhbHVlIGluY2x1ZGluZyA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiI6IHsKKyAgICAgICIoVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1mcmFtZWJ1ZmZlci0wMjc3OSIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggdGhlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiBhbmQgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gbWVtYmVycyBvZiA8Y29kZT5wUmVuZGVyUGFzc0JlZ2luPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCBvbiB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWluaXRpYWxMYXlvdXQtMDMwOTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgb2YgdGhlIDxjb2RlPmluaXRpYWxMYXlvdXQ8L2NvZGU+IG9yIDxjb2RlPmZpbmFsTGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudERlc2NyaXB0aW9uPC9jb2RlPiBzdHJ1Y3R1cmVzIG9yIHRoZSA8Y29kZT5sYXlvdXQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtBdHRhY2htZW50UmVmZXJlbmNlPC9jb2RlPiBzdHJ1Y3R1cmVzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUmVuZGVyUGFzc0JlZ2luPC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgaW5jbHVkaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWluaXRpYWxMYXlvdXQtMDMwOTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgb2YgdGhlIDxjb2RlPmluaXRpYWxMYXlvdXQ8L2NvZGU+IG9yIDxjb2RlPmZpbmFsTGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudERlc2NyaXB0aW9uPC9jb2RlPiBzdHJ1Y3R1cmVzIG9yIHRoZSA8Y29kZT5sYXlvdXQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtBdHRhY2htZW50UmVmZXJlbmNlPC9jb2RlPiBzdHJ1Y3R1cmVzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUmVuZGVyUGFzc0JlZ2luPC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgaW5jbHVkaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBvZiB0aGUgPGNvZGU+aW5pdGlhbExheW91dDwvY29kZT4gb3IgPGNvZGU+ZmluYWxMYXlvdXQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtBdHRhY2htZW50RGVzY3JpcHRpb248L2NvZGU+IHN0cnVjdHVyZXMgb3IgdGhlIDxjb2RlPmxheW91dDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L2NvZGU+IHN0cnVjdHVyZXMgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlbmRlciBwYXNzIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+IHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSB2aWV3IG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWluaXRpYWxMYXlvdXQtMDMwOTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgb2YgdGhlIDxjb2RlPmluaXRpYWxMYXlvdXQ8L2NvZGU+IG9yIDxjb2RlPmZpbmFsTGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudERlc2NyaXB0aW9uPC9jb2RlPiBzdHJ1Y3R1cmVzIG9yIHRoZSA8Y29kZT5sYXlvdXQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtBdHRhY2htZW50UmVmZXJlbmNlPC9jb2RlPiBzdHJ1Y3R1cmVzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUmVuZGVyUGFzc0JlZ2luPC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw8L2NvZGU+IHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSB2aWV3IG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiBvciA8Y29kZT5maW5hbExheW91dDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjwvY29kZT4gc3RydWN0dXJlcyBvciB0aGUgPGNvZGU+bGF5b3V0PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvY29kZT4gc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJlbmRlclBhc3NCZWdpbjwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMPC9jb2RlPiB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgaW5jbHVkaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzEwMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBvZiB0aGUgPGNvZGU+aW5pdGlhbExheW91dDwvY29kZT4gbWVtYmVycyBvZiB0aGUgPGNvZGU+VmtBdHRhY2htZW50RGVzY3JpcHRpb248L2NvZGU+IHN0cnVjdHVyZXMgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlbmRlciBwYXNzIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSZW5kZXJQYXNzQmVnaW48L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEPC9jb2RlPiwgdGhlbiBlYWNoIHN1Y2ggPGNvZGU+aW5pdGlhbExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIGN1cnJlbnQgbGF5b3V0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2Ugc3VicmVzb3VyY2Ugb2YgdGhlIGZyYW1lYnVmZmVyIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUmVuZGVyUGFzc0JlZ2luPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLXNyY1N0YWdlTWFzay0wMzEwMSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zcmNTdGFnZU1hc2s8L2NvZGU+IGFuZCA8Y29kZT5kc3RTdGFnZU1hc2s8L2NvZGU+IG1lbWJlcnMgb2YgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEZXBlbmRlbmNpZXM8L2NvZGU+IG1lbWJlciBvZiA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NDcmVhdGVJbmZvPC9hPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgcXVldWUgZmFtaWx5IGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPnF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGEgaHJlZj1cIiNWa0NvbW1hbmRQb29sQ3JlYXRlSW5mb1wiPlZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvPC9hPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBwb29sIHdoaWNoIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWZyYW1lYnVmZmVyLTAyNTMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGFueSBhdHRhY2htZW50IGluIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiB0aGF0IGlzIHVzZWQgYnkgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gYW5kIGlzIGJvdW5kIHRvIG1lbW9yeSBsb2NhdGlvbnMgdGhhdCBhcmUgYWxzbyBib3VuZCB0byBhbm90aGVyIGF0dGFjaG1lbnQgdXNlZCBieSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiwgYW5kIGlmIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSB1c2VzIGNhdXNlcyBlaXRoZXIgYXR0YWNobWVudCB0byBiZSB3cml0dGVuIHRvLCBib3RoIGF0dGFjaG1lbnRzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgaGFkIHRoZSA8Y29kZT5WS19BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX01BWV9BTElBU19CSVQ8L2NvZGU+IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItcFJlbmRlclBhc3NCZWdpbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUmVuZGVyUGFzc0JlZ2luPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0JlZ2luSW5mb1wiPlZrUmVuZGVyUGFzc0JlZ2luSW5mbzwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItcFN1YnBhc3NCZWdpbkluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1YnBhc3NCZWdpbkluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdWJwYXNzQmVnaW5JbmZvS0hSXCI+VmtTdWJwYXNzQmVnaW5JbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1idWZmZXJsZXZlbCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcHJpbWFyeSA8Y29kZT5Wa0NvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtSZW5kZXJQYXNzQmVnaW5JbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1jbGVhclZhbHVlQ291bnQtMDA5MDIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jbGVhclZhbHVlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbGFyZ2VzdCBhdHRhY2htZW50IGluZGV4IGluIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IHRoYXQgc3BlY2lmaWVzIGEgPGNvZGU+bG9hZE9wPC9jb2RlPiAob3IgPGNvZGU+c3RlbmNpbExvYWRPcDwvY29kZT4sIGlmIHRoZSBhdHRhY2htZW50IGhhcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0KSBvZiA8Y29kZT5WS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcmVuZGVyUGFzcy0wMDkwNCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxhIGhyZWY9XCIjcmVuZGVycGFzcy1jb21wYXRpYmlsaXR5XCI+Y29tcGF0aWJsZTwvYT4gd2l0aCB0aGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mb1wiPlZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvPC9hPiwgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSXCI+VmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjwvYT4sIG9yIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUXCI+VmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXJlbmRlclBhc3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc1wiPlZrUmVuZGVyUGFzczwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyXCI+VmtGcmFtZWJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcENsZWFyVmFsdWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNsZWFyVmFsdWVDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wQ2xlYXJWYWx1ZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jbGVhclZhbHVlQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtDbGVhclZhbHVlXCI+VmtDbGVhclZhbHVlPC9hPiB1bmlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9pbWFnZWxlc3NfZnJhbWVidWZmZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiB2YWx1ZSB0aGF0IGRpZCBub3QgaW5jbHVkZSA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUlwiPlZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI8L2E+IHN0cnVjdHVyZSwgaXRzIDxjb2RlPmF0dGFjaG1lbnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgemVybyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvXCI+VmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gdmFsdWUgdGhhdCBpbmNsdWRlZCA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCB0aGUgPGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiBvZiBhIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUlwiPlZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFJcIj5Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSPC9hPjo6PGNvZGU+YXR0YWNobWVudEltYWdlSW5mb0NvdW50PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMjc4MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mb1wiPlZrRnJhbWVidWZmZXJDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IHZhbHVlIHRoYXQgaW5jbHVkZWQgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUlwiPlZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIG9uIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gYXMgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IGFuZCA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvXCI+VmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gdmFsdWUgdGhhdCBpbmNsdWRlZCA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBlYWNoIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSXCI+VmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IG9mIGFuIGltYWdlIGNyZWF0ZWQgd2l0aCBhIHZhbHVlIG9mIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiBlcXVhbCB0byB0aGUgPGNvZGU+ZmxhZ3M8L2NvZGU+IG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+Ojo8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvXCI+VmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gdmFsdWUgdGhhdCBpbmNsdWRlZCA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBlYWNoIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSXCI+VmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IG9mIGFuIGltYWdlIGNyZWF0ZWQgd2l0aCBhIHZhbHVlIG9mIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPnVzYWdlPC9jb2RlPiBlcXVhbCB0byB0aGUgPGNvZGU+dXNhZ2U8L2NvZGU+IG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+Ojo8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjExIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvXCI+VmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gdmFsdWUgdGhhdCBpbmNsdWRlZCA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBlYWNoIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSXCI+VmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IHdpdGggYSB3aWR0aCBlcXVhbCB0byB0aGUgPGNvZGU+d2lkdGg8L2NvZGU+IG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+Ojo8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvXCI+VmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gdmFsdWUgdGhhdCBpbmNsdWRlZCA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBlYWNoIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSXCI+VmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IHdpdGggYSBoZWlnaHQgZXF1YWwgdG8gdGhlIDxjb2RlPmhlaWdodDwvY29kZT4gbWVtYmVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT46Ojxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiB2YWx1ZSB0aGF0IGluY2x1ZGVkIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiB0aGUgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiBtZW1iZXIgb2YgYSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFJcIj5Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSPC9hPiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gb2YgYW4gaW1hZ2UgY3JlYXRlZCB3aXRoIGEgdmFsdWUgb2YgPGEgaHJlZj1cIiNWa0ltYWdlVmlld0NyZWF0ZUluZm9cIj5Wa0ltYWdlVmlld0NyZWF0ZUluZm88L2E+Ojo8Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQ8L2NvZGU+IGVxdWFsIHRvIHRoZSA8Y29kZT5sYXllckNvdW50PC9jb2RlPiBtZW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFJcIj5Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSPC9hPjo6PGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mb1wiPlZrRnJhbWVidWZmZXJDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IHZhbHVlIHRoYXQgaW5jbHVkZWQgPGNvZGU+VktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIHRoZSA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUlwiPlZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBvZiBhbiBpbWFnZSBjcmVhdGVkIHdpdGggYSB2YWx1ZSBvZiA8YSBocmVmPVwiI1ZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUlwiPlZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjwvYT46Ojxjb2RlPnZpZXdGb3JtYXRDb3VudDwvY29kZT4gZXF1YWwgdG8gdGhlIDxjb2RlPnZpZXdGb3JtYXRDb3VudDwvY29kZT4gbWVtYmVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgPGEgaHJlZj1cIiNWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSXCI+VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjwvYT46Ojxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiB2YWx1ZSB0aGF0IGluY2x1ZGVkIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiB0aGUgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiBtZW1iZXIgb2YgYSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFJcIj5Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSPC9hPiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gb2YgYW4gaW1hZ2UgY3JlYXRlZCB3aXRoIGEgc2V0IG9mIGVsZW1lbnRzIGluIDxhIGhyZWY9XCIjVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSXCI+VmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSPC9hPjo6PGNvZGU+cFZpZXdGb3JtYXRzPC9jb2RlPiBlcXVhbCB0byB0aGUgc2V0IG9mIGVsZW1lbnRzIGluIHRoZSA8Y29kZT5wVmlld0Zvcm1hdHM8L2NvZGU+IG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUlwiPlZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI8L2E+Ojo8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPmZyYW1lYnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZnJhbWVidWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvXCI+VmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gdmFsdWUgdGhhdCBpbmNsdWRlZCA8Y29kZT5WS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI8L2NvZGU+LCBlYWNoIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSXCI+VmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IG9mIGFuIGltYWdlIGNyZWF0ZWQgd2l0aCBhIHZhbHVlIG9mIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdDcmVhdGVJbmZvXCI+VmtJbWFnZVZpZXdDcmVhdGVJbmZvPC9hPjo6PGNvZGU+Zm9ybWF0PC9jb2RlPiBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZiA8YSBocmVmPVwiI1ZrQXR0YWNobWVudERlc2NyaXB0aW9uXCI+VmtBdHRhY2htZW50RGVzY3JpcHRpb248L2E+Ojo8Y29kZT5mb3JtYXQ8L2NvZGU+IGluIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mcmFtZWJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiB2YWx1ZSB0aGF0IGluY2x1ZGVkIDxjb2RlPlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiB0aGUgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiBtZW1iZXIgb2YgYSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFJcIj5Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSPC9hPiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gb2YgYW4gaW1hZ2UgY3JlYXRlZCB3aXRoIGEgdmFsdWUgb2YgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+c2FtcGxlczwvY29kZT4gZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2YgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnREZXNjcmlwdGlvblwiPlZrQXR0YWNobWVudERlc2NyaXB0aW9uPC9hPjo6PGNvZGU+c2FtcGxlczwvY29kZT4gaW4gPGNvZGU+cmVuZGVyUGFzczwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX1NBTVBMRV9MT0NBVElPTlNfQkVHSU5fSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQtcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFRcIj5Wa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQ8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVC1wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0NvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVFwiPlZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQtYXR0YWNobWVudEluZGV4LTAxNTMxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXR0YWNobWVudEluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIDxjb2RlPmF0dGFjaG1lbnRDb3VudDwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzQ3JlYXRlSW5mb1wiPlZrUmVuZGVyUGFzc0NyZWF0ZUluZm88L2E+IHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgYnkgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NCZWdpbkluZm9cIj5Wa1JlbmRlclBhc3NCZWdpbkluZm88L2E+Ojo8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQtc2FtcGxlTG9jYXRpb25zSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zYW1wbGVMb2NhdGlvbnNJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUXCI+VmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhULXN1YnBhc3NJbmRleC0wMTUzMiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1YnBhc3NJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5zdWJwYXNzQ291bnQ8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NDcmVhdGVJbmZvPC9hPiB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGJ5IDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzQmVnaW5JbmZvXCI+VmtSZW5kZXJQYXNzQmVnaW5JbmZvPC9hPjo6PGNvZGU+cmVuZGVyUGFzczwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhULXNhbXBsZUxvY2F0aW9uc0luZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2FtcGxlTG9jYXRpb25zSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVFwiPlZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTdWJwYXNzQmVnaW5JbmZvS0hSIjogeworICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdWJwYXNzQmVnaW5JbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NCZWdpbkluZm9LSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0JlZ2luSW5mb0tIUi1jb250ZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb250ZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3VicGFzc0NvbnRlbnRzXCI+VmtTdWJwYXNzQ29udGVudHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBkZXZpY2UgbWFzayB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8tZGV2aWNlTWFzay0wMDkwNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB6ZXJvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBzdWJzZXQgb2YgdGhlIGNvbW1hbmQgYnVmZmVyJiM4MjE3O3MgaW5pdGlhbCBkZXZpY2UgbWFzayIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8tZGV2aWNlUmVuZGVyQXJlYUNvdW50LTAwOTA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlUmVuZGVyQXJlYUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlaXRoZXIgYmUgemVybyBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZXMgaW4gdGhlIGxvZ2ljYWwgZGV2aWNlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1wRGV2aWNlUmVuZGVyQXJlYXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGV2aWNlUmVuZGVyQXJlYUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBEZXZpY2VSZW5kZXJBcmVhczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmRldmljZVJlbmRlckFyZWFDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1JlY3QyRFwiPlZrUmVjdDJEPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2ltYWdlbGVzc19mcmFtZWJ1ZmZlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItcEF0dGFjaG1lbnRzLTAzMjE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBzcGVjaWZ5IGEgc2luZ2xlIG1pcCBsZXZlbCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUi1wQXR0YWNobWVudHMtMDMyMTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBpZGVudGl0eSBzd2l6emxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0FUVEFDSE1FTlRfQkVHSU5fSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLXBBdHRhY2htZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hdHRhY2htZW50Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGhhbmRsZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFJlbmRlckFyZWFHcmFudWxhcml0eS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFJlbmRlckFyZWFHcmFudWxhcml0eS1yZW5kZXJQYXNzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NcIj5Wa1JlbmRlclBhc3M8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHktcEdyYW51bGFyaXR5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBHcmFudWxhcml0eTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0V4dGVudDJEXCI+VmtFeHRlbnQyRDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFJlbmRlckFyZWFHcmFudWxhcml0eS1yZW5kZXJQYXNzLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZE5leHRTdWJwYXNzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MtTm9uZS0wMDkwOSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBjdXJyZW50IHN1YnBhc3MgaW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2Ygc3VicGFzc2VzIGluIHRoZSByZW5kZXIgcGFzcyBtaW51cyBvbmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MtY29udGVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29udGVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N1YnBhc3NDb250ZW50c1wiPlZrU3VicGFzc0NvbnRlbnRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWROZXh0U3VicGFzcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWROZXh0U3VicGFzcy1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZE5leHRTdWJwYXNzLWJ1ZmZlcmxldmVsIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBwcmltYXJ5IDxjb2RlPlZrQ29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZE5leHRTdWJwYXNzLU5vbmUtMDIzNDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHJlY29yZGVkIHdoZW4gdHJhbnNmb3JtIGZlZWRiYWNrIGlzIGFjdGl2ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kTmV4dFN1YnBhc3MyS0hSIjogeworICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItTm9uZS0wMzEwMiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBjdXJyZW50IHN1YnBhc3MgaW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2Ygc3VicGFzc2VzIGluIHRoZSByZW5kZXIgcGFzcyBtaW51cyBvbmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MyS0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1wU3VicGFzc0JlZ2luSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3VicGFzc0JlZ2luSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N1YnBhc3NCZWdpbkluZm9LSFJcIj5Wa1N1YnBhc3NCZWdpbkluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItcFN1YnBhc3NFbmRJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdWJwYXNzRW5kSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N1YnBhc3NFbmRJbmZvS0hSXCI+VmtTdWJwYXNzRW5kSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MyS0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MyS0hSLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MyS0hSLWJ1ZmZlcmxldmVsIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBwcmltYXJ5IDxjb2RlPlZrQ29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIpKyhWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItTm9uZS0wMjM1MCIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgcmVjb3JkZWQgd2hlbiB0cmFuc2Zvcm0gZmVlZGJhY2sgaXMgYWN0aXZlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRFbmRSZW5kZXJQYXNzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1Ob25lLTAwOTEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGN1cnJlbnQgc3VicGFzcyBpbmRleCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHN1YnBhc3NlcyBpbiB0aGUgcmVuZGVyIHBhc3MgbWludXMgb25lIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzLWJ1ZmZlcmxldmVsIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBwcmltYXJ5IDxjb2RlPlZrQ29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtTm9uZS0wMjM1MSIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgcmVjb3JkZWQgd2hlbiB0cmFuc2Zvcm0gZmVlZGJhY2sgaXMgYWN0aXZlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRFbmRSZW5kZXJQYXNzMktIUiI6IHsKKyAgICAgICIoVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItTm9uZS0wMzEwMyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBjdXJyZW50IHN1YnBhc3MgaW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzdWJwYXNzZXMgaW4gdGhlIHJlbmRlciBwYXNzIG1pbnVzIG9uZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1wU3VicGFzc0VuZEluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1YnBhc3NFbmRJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3VicGFzc0VuZEluZm9LSFJcIj5Wa1N1YnBhc3NFbmRJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1idWZmZXJsZXZlbCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcHJpbWFyeSA8Y29kZT5Wa0NvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyKSsoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItTm9uZS0wMjM1MiIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgcmVjb3JkZWQgd2hlbiB0cmFuc2Zvcm0gZmVlZGJhY2sgaXMgYWN0aXZlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTdWJwYXNzRW5kSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VicGFzc0VuZEluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1YnBhc3NFbmRJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVTaGFkZXJNb2R1bGUiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTaGFkZXJNb2R1bGUtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTaGFkZXJNb2R1bGUtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvXCI+VmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU2hhZGVyTW9kdWxlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVNoYWRlck1vZHVsZS1wU2hhZGVyTW9kdWxlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTaGFkZXJNb2R1bGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtTaGFkZXJNb2R1bGVcIj5Wa1NoYWRlck1vZHVsZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1jb2RlU2l6ZS0wMTA4NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvZGVTaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gMCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMDg5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENvZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGRlY2xhcmUgdGhlIDxjb2RlPlNoYWRlcjwvY29kZT4gY2FwYWJpbGl0eSBmb3IgU1BJUi1WIGNvZGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1wQ29kZS0wMTA5MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgZGVjbGFyZSBhbnkgY2FwYWJpbGl0eSB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEFQSSwgYXMgZGVzY3JpYmVkIGJ5IHRoZSA8YSBocmVmPVwiI3NwaXJ2ZW52LW1vZHVsZS12YWxpZGF0aW9uXCI+Q2FwYWJpbGl0aWVzPC9hPiBzZWN0aW9uIG9mIHRoZSA8YSBocmVmPVwiI3NwaXJ2ZW52LWNhcGFiaWxpdGllc1wiPlNQSVItViBFbnZpcm9ubWVudDwvYT4gYXBwZW5kaXgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1wQ29kZS0wMTA5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBDb2RlPC9jb2RlPiBkZWNsYXJlcyBhbnkgb2YgdGhlIGNhcGFiaWxpdGllcyBsaXN0ZWQgYXMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm9wdGlvbmFsPC9zdHJvbmc+IGluIHRoZSA8YSBocmVmPVwiI3NwaXJ2ZW52LWNhcGFiaWxpdGllcy10YWJsZVwiPlNQSVItViBFbnZpcm9ubWVudDwvYT4gYXBwZW5kaXgsIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUocykgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW5hYmxlZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUXCI+VmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENvZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBcXChcXHRleHRybXtjb2RlU2l6ZX0gXFxvdmVyIDRcXCkgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX05WX2dsc2xfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLWNvZGVTaXplLTAxMDg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29kZVNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgNCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMDg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENvZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHBvaW50IHRvIHZhbGlkIFNQSVItViBjb2RlLCBmb3JtYXR0ZWQgYW5kIHBhY2tlZCBhcyBkZXNjcmliZWQgYnkgdGhlIDxhIGhyZWY9XCIjc3BpcnYtc3BlY1wiPktocm9ub3MgU1BJUi1WIFNwZWNpZmljYXRpb248L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtMDEwODgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ29kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWRoZXJlIHRvIHRoZSB2YWxpZGF0aW9uIHJ1bGVzIGRlc2NyaWJlZCBieSB0aGUgPGEgaHJlZj1cIiNzcGlydmVudi1tb2R1bGUtdmFsaWRhdGlvblwiPlZhbGlkYXRpb24gUnVsZXMgd2l0aGluIGEgTW9kdWxlPC9hPiBzZWN0aW9uIG9mIHRoZSA8YSBocmVmPVwiI3NwaXJ2ZW52LWNhcGFiaWxpdGllc1wiPlNQSVItViBFbnZpcm9ubWVudDwvYT4gYXBwZW5kaXgiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX2dsc2xfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cENvZGU8L2NvZGU+IGlzIGEgcG9pbnRlciB0byBTUElSLVYgY29kZSwgPGNvZGU+Y29kZVNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgNCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENvZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHBvaW50IHRvIGVpdGhlciB2YWxpZCBTUElSLVYgY29kZSwgZm9ybWF0dGVkIGFuZCBwYWNrZWQgYXMgZGVzY3JpYmVkIGJ5IHRoZSA8YSBocmVmPVwiI3NwaXJ2LXNwZWNcIj5LaHJvbm9zIFNQSVItViBTcGVjaWZpY2F0aW9uPC9hPiBvciB2YWxpZCBHTFNMIGNvZGUgd2hpY2ggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgd3JpdHRlbiB0byB0aGUgPGNvZGU+R0xfS0hSX3Z1bGthbl9nbHNsPC9jb2RlPiBleHRlbnNpb24gc3BlY2lmaWNhdGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cENvZGU8L2NvZGU+IGlzIGEgcG9pbnRlciB0byBTUElSLVYgY29kZSwgdGhhdCBjb2RlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFkaGVyZSB0byB0aGUgdmFsaWRhdGlvbiBydWxlcyBkZXNjcmliZWQgYnkgdGhlIDxhIGhyZWY9XCIjc3BpcnZlbnYtbW9kdWxlLXZhbGlkYXRpb25cIj5WYWxpZGF0aW9uIFJ1bGVzIHdpdGhpbiBhIE1vZHVsZTwvYT4gc2VjdGlvbiBvZiB0aGUgPGEgaHJlZj1cIiNzcGlydmVudi1jYXBhYmlsaXRpZXNcIj5TUElSLVYgRW52aXJvbm1lbnQ8L2E+IGFwcGVuZGl4IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtMDEzNzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQ29kZTwvY29kZT4gaXMgYSBwb2ludGVyIHRvIEdMU0wgY29kZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdmFsaWQgR0xTTCBjb2RlIHdyaXR0ZW4gdG8gdGhlIDxjb2RlPkdMX0tIUl92dWxrYW5fZ2xzbDwvY29kZT4gR0xTTCBleHRlbnNpb24gc3BlY2lmaWNhdGlvbiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC12YWxpZGF0aW9uQ2FjaGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmFsaWRhdGlvbkNhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtWYWxpZGF0aW9uQ2FjaGVFWFRcIj5Wa1ZhbGlkYXRpb25DYWNoZUVYVDwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95U2hhZGVyTW9kdWxlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVNoYWRlck1vZHVsZS1zaGFkZXJNb2R1bGUtMDEwOTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5zaGFkZXJNb2R1bGU8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTaGFkZXJNb2R1bGUtc2hhZGVyTW9kdWxlLTAxMDkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+c2hhZGVyTW9kdWxlPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVNoYWRlck1vZHVsZS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTaGFkZXJNb2R1bGUtc2hhZGVyTW9kdWxlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNoYWRlck1vZHVsZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPnNoYWRlck1vZHVsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2hhZGVyTW9kdWxlXCI+VmtTaGFkZXJNb2R1bGU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTaGFkZXJNb2R1bGUtc2hhZGVyTW9kdWxlLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNoYWRlck1vZHVsZTwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYiOiB7CisgICAgICAiKFZLX05WX2Nvb3BlcmF0aXZlX21hdHJpeCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVlwiPlZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIjogeworICAgICAgIihWS19OVl9jb29wZXJhdGl2ZV9tYXRyaXgpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0NPT1BFUkFUSVZFX01BVFJJWF9QUk9QRVJUSUVTX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1BVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5BVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tcG9uZW50VHlwZU5WXCI+VmtDb21wb25lbnRUeXBlTlY8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLUJUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPkJUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21wb25lbnRUeXBlTlZcIj5Wa0NvbXBvbmVudFR5cGVOVjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYtQ1R5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Q1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbXBvbmVudFR5cGVOVlwiPlZrQ29tcG9uZW50VHlwZU5WPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1EVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5EVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tcG9uZW50VHlwZU5WXCI+VmtDb21wb25lbnRUeXBlTlY8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXNjb3BlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNjb3BlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTY29wZU5WXCI+VmtTY29wZU5WPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIjogeworICAgICAgIihWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhULXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVFwiPlZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQtcFZhbGlkYXRpb25DYWNoZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVmFsaWRhdGlvbkNhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrVmFsaWRhdGlvbkNhY2hlRVhUXCI+VmtWYWxpZGF0aW9uQ2FjaGVFWFQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQtaW5pdGlhbERhdGFTaXplLTAxNTM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW5pdGlhbERhdGFTaXplPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPnBJbml0aWFsRGF0YTwvY29kZT4sIGFzIHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVDwvY29kZT4gd2hlbiA8Y29kZT5wSW5pdGlhbERhdGE8L2NvZGU+IHdhcyBvcmlnaW5hbGx5IHJldHJpZXZlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULWluaXRpYWxEYXRhU2l6ZS0wMTUzNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmluaXRpYWxEYXRhU2l6ZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wSW5pdGlhbERhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiByZXRyaWV2ZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gPGNvZGU+dmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfQ1JFQVRFX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC1wSW5pdGlhbERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW5pdGlhbERhdGFTaXplPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBJbml0aWFsRGF0YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmluaXRpYWxEYXRhU2l6ZTwvY29kZT4gYnl0ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1kc3RDYWNoZS0wMTUzNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdENhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYXBwZWFyIGluIHRoZSBsaXN0IG9mIHNvdXJjZSBjYWNoZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRzdENhY2hlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdENhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtWYWxpZGF0aW9uQ2FjaGVFWFRcIj5Wa1ZhbGlkYXRpb25DYWNoZUVYVDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1wU3JjQ2FjaGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTcmNDYWNoZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zcmNDYWNoZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrVmFsaWRhdGlvbkNhY2hlRVhUXCI+VmtWYWxpZGF0aW9uQ2FjaGVFWFQ8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULXNyY0NhY2hlQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNDYWNoZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRzdENhY2hlLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdENhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1wU3JjQ2FjaGVzLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wU3JjQ2FjaGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIjogeworICAgICAgIihWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQtdmFsaWRhdGlvbkNhY2hlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnZhbGlkYXRpb25DYWNoZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrVmFsaWRhdGlvbkNhY2hlRVhUXCI+VmtWYWxpZGF0aW9uQ2FjaGVFWFQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhULXBEYXRhU2l6ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGF0YVNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnNpemVfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVC1wRGF0YS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wRGF0YVNpemU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBEYXRhPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cERhdGFTaXplPC9jb2RlPiBieXRlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhULXZhbGlkYXRpb25DYWNoZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT52YWxpZGF0aW9uQ2FjaGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQiOiB7CisgICAgICAiKFZLX0VYVF92YWxpZGF0aW9uX2NhY2hlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhULXZhbGlkYXRpb25DYWNoZS0wMTUzNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPnZhbGlkYXRpb25DYWNoZTwvY29kZT4gd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHByb3ZpZGVkIGhlcmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVC12YWxpZGF0aW9uQ2FjaGUtMDE1MzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT52YWxpZGF0aW9uQ2FjaGU8L2NvZGU+IHdhcyBjcmVhdGVkLCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVC12YWxpZGF0aW9uQ2FjaGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dmFsaWRhdGlvbkNhY2hlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+dmFsaWRhdGlvbkNhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtWYWxpZGF0aW9uQ2FjaGVFWFRcIj5Wa1ZhbGlkYXRpb25DYWNoZUVYVDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVC12YWxpZGF0aW9uQ2FjaGUtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dmFsaWRhdGlvbkNhY2hlPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtZmxhZ3MtMDA2OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+ZmxhZ3M8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wQ3JlYXRlSW5mb3M8L2NvZGU+IGNvbnRhaW5zIHRoZSA8Y29kZT5WS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQ8L2NvZGU+IGZsYWcsIGFuZCB0aGUgPGNvZGU+YmFzZVBpcGVsaW5lSW5kZXg8L2NvZGU+IG1lbWJlciBvZiB0aGF0IHNhbWUgZWxlbWVudCBpcyBub3QgPGNvZGU+LTE8L2NvZGU+LCA8Y29kZT5iYXNlUGlwZWxpbmVJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBpbmRleCBpbnRvIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGF0IGVsZW1lbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1mbGFncy0wMDY5NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5mbGFnczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gY29udGFpbnMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVDwvY29kZT4gZmxhZywgdGhlIGJhc2UgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0FMTE9XX0RFUklWQVRJVkVTX0JJVDwvY29kZT4gZmxhZyBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtcGlwZWxpbmVDYWNoZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+cGlwZWxpbmVDYWNoZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDYWNoZVwiPlZrUGlwZWxpbmVDYWNoZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtcENyZWF0ZUluZm9zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmNyZWF0ZUluZm9Db3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm9cIj5Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLXBQaXBlbGluZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFBpcGVsaW5lczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmNyZWF0ZUluZm9Db3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1BpcGVsaW5lXCI+VmtQaXBlbGluZTwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLWNyZWF0ZUluZm9Db3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNyZWF0ZUluZm9Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtcGlwZWxpbmVDYWNoZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA2OTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVDwvY29kZT4gZmxhZywgYW5kIDxjb2RlPmJhc2VQaXBlbGluZUluZGV4PC9jb2RlPiBpcyAtMSwgPGNvZGU+YmFzZVBpcGVsaW5lSGFuZGxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGhhbmRsZSB0byBhIGNvbXB1dGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDY5OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUPC9jb2RlPiBmbGFnLCBhbmQgPGNvZGU+YmFzZVBpcGVsaW5lSGFuZGxlPC9jb2RlPiBpcyA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5iYXNlUGlwZWxpbmVJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBpbmRleCBpbnRvIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5wQ3JlYXRlSW5mb3M8L2NvZGU+IHBhcmFtZXRlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNjk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIHRoZSA8Y29kZT5WS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQ8L2NvZGU+IGZsYWcsIGFuZCA8Y29kZT5iYXNlUGlwZWxpbmVJbmRleDwvY29kZT4gaXMgbm90IC0xLCA8Y29kZT5iYXNlUGlwZWxpbmVIYW5kbGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcwMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUPC9jb2RlPiBmbGFnLCBhbmQgPGNvZGU+YmFzZVBpcGVsaW5lSGFuZGxlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+YmFzZVBpcGVsaW5lSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIC0xIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c3RhZ2U8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5zdGFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLXN0YWdlLTAwNzAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHNoYWRlciBjb2RlIGZvciB0aGUgZW50cnkgcG9pbnQgaWRlbnRpZmllZCBieSA8Y29kZT5zdGFnZTwvY29kZT4gYW5kIHRoZSByZXN0IG9mIHRoZSBzdGF0ZSBpZGVudGlmaWVkIGJ5IHRoaXMgc3RydWN0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFkaGVyZSB0byB0aGUgcGlwZWxpbmUgbGlua2luZyBydWxlcyBkZXNjcmliZWQgaW4gdGhlIDxhIGhyZWY9XCIjaW50ZXJmYWNlc1wiPlNoYWRlciBJbnRlcmZhY2VzPC9hPiBjaGFwdGVyIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tbGF5b3V0LTAwNzAzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLXBpcGVsaW5lbGF5b3V0LWNvbnNpc3RlbmN5XCI+Y29uc2lzdGVudDwvYT4gd2l0aCB0aGUgbGF5b3V0IG9mIHRoZSBjb21wdXRlIHNoYWRlciBzcGVjaWZpZWQgaW4gPGNvZGU+c3RhZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tbGF5b3V0LTAxNjg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIG51bWJlciBvZiByZXNvdXJjZXMgaW4gPGNvZGU+bGF5b3V0PC9jb2RlPiBhY2Nlc3NpYmxlIHRvIHRoZSBjb21wdXRlIHNoYWRlciBzdGFnZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlUmVzb3VyY2VzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnBOZXh0PC9jb2RlPiBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EXCI+VmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQ8L2E+IG9yIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzXCI+VmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm9cIj5Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1sYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUxheW91dFwiPlZrUGlwZWxpbmVMYXlvdXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+YmFzZVBpcGVsaW5lSGFuZGxlPC9jb2RlPiwgYW5kIDxjb2RlPmxheW91dDwvY29kZT4gdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1nZW9tZXRyeVNoYWRlclwiPmdlb21ldHJ5IHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnN0YWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy10ZXNzZWxsYXRpb25TaGFkZXJcIj50ZXNzZWxsYXRpb24gc2hhZGVyczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3RhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUPC9jb2RlPiBvciA8Y29kZT5WS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMDcwNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0YWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDUzwvY29kZT4sIG9yIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9BTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXBOYW1lLTAwNzA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5hbWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHRoZSBuYW1lIG9mIGFuIDxjb2RlPk9wRW50cnlQb2ludDwvY29kZT4gaW4gPGNvZGU+bW9kdWxlPC9jb2RlPiB3aXRoIGFuIGV4ZWN1dGlvbiBtb2RlbCB0aGF0IG1hdGNoZXMgPGNvZGU+c3RhZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1heENsaXBEaXN0YW5jZXMtMDA3MDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCBpbmNsdWRlcyBhbnkgdmFyaWFibGUgaW4gaXRzIGludGVyZmFjZSB0aGF0IGlzIGRlY2xhcmVkIHdpdGggdGhlIDxjb2RlPkNsaXBEaXN0YW5jZTwvY29kZT4gPGNvZGU+QnVpbHRJbjwvY29kZT4gZGVjb3JhdGlvbiwgdGhhdCB2YXJpYWJsZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhbiBhcnJheSBzaXplIGdyZWF0ZXIgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Q2xpcERpc3RhbmNlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tbWF4Q3VsbERpc3RhbmNlcy0wMDcwOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBpZGVudGlmaWVkIGVudHJ5IHBvaW50IGluY2x1ZGVzIGFueSB2YXJpYWJsZSBpbiBpdHMgaW50ZXJmYWNlIHRoYXQgaXMgZGVjbGFyZWQgd2l0aCB0aGUgPGNvZGU+Q3VsbERpc3RhbmNlPC9jb2RlPiA8Y29kZT5CdWlsdEluPC9jb2RlPiBkZWNvcmF0aW9uLCB0aGF0IHZhcmlhYmxlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGFuIGFycmF5IHNpemUgZ3JlYXRlciB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhDdWxsRGlzdGFuY2VzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1tYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzLTAwNzEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgaW5jbHVkZXMgYW55IHZhcmlhYmxlcyBpbiBpdHMgaW50ZXJmYWNlIHRoYXQgYXJlIGRlY2xhcmVkIHdpdGggdGhlIDxjb2RlPkNsaXBEaXN0YW5jZTwvY29kZT4gb3IgPGNvZGU+Q3VsbERpc3RhbmNlPC9jb2RlPiA8Y29kZT5CdWlsdEluPC9jb2RlPiBkZWNvcmF0aW9uLCB0aG9zZSB2YXJpYWJsZXMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYXJyYXkgc2l6ZXMgd2hpY2ggc3VtIHRvIG1vcmUgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tbWF4U2FtcGxlTWFza1dvcmRzLTAwNzExIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgaW5jbHVkZXMgYW55IHZhcmlhYmxlIGluIGl0cyBpbnRlcmZhY2UgdGhhdCBpcyBkZWNsYXJlZCB3aXRoIHRoZSA8Y29kZT5TYW1wbGVNYXNrPC9jb2RlPiA8Y29kZT5CdWlsdEluPC9jb2RlPiBkZWNvcmF0aW9uLCB0aGF0IHZhcmlhYmxlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGFuIGFycmF5IHNpemUgZ3JlYXRlciB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhTYW1wbGVNYXNrV29yZHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3RhZ2U8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUPC9jb2RlPiwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgYW55IGlucHV0IHZhcmlhYmxlIGluIGl0cyBpbnRlcmZhY2UgdGhhdCBpcyBkZWNvcmF0ZWQgd2l0aCA8Y29kZT5DdWxsRGlzdGFuY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3RhZ2U8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQ8L2NvZGU+LCBhbmQgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgaGFzIGFuIDxjb2RlPk9wRXhlY3V0aW9uTW9kZTwvY29kZT4gaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgYSBwYXRjaCBzaXplIHdpdGggPGNvZGU+T3V0cHV0VmVydGljZXM8L2NvZGU+LCB0aGUgcGF0Y2ggc2l6ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMDcxNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN0YWdlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUPC9jb2RlPiwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhbiA8Y29kZT5PcEV4ZWN1dGlvbk1vZGU8L2NvZGU+IGluc3RydWN0aW9uIHRoYXQgc3BlY2lmaWVzIGEgbWF4aW11bSBvdXRwdXQgdmVydGV4IGNvdW50IHRoYXQgaXMgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3RhZ2U8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQ8L2NvZGU+LCB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGFuIDxjb2RlPk9wRXhlY3V0aW9uTW9kZTwvY29kZT4gaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgYW4gaW52b2NhdGlvbiBjb3VudCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMjU5NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN0YWdlPC9jb2RlPiBpcyBhIHZlcnRleCBwcm9jZXNzaW5nIHN0YWdlLCBhbmQgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgd3JpdGVzIHRvIDxjb2RlPkxheWVyPC9jb2RlPiBmb3IgYW55IHByaW1pdGl2ZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gd3JpdGUgdGhlIHNhbWUgdmFsdWUgdG8gPGNvZGU+TGF5ZXI8L2NvZGU+IGZvciBhbGwgdmVydGljZXMgb2YgYSBnaXZlbiBwcmltaXRpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDI1OTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zdGFnZTwvY29kZT4gaXMgYSB2ZXJ0ZXggcHJvY2Vzc2luZyBzdGFnZSwgYW5kIHRoZSBpZGVudGlmaWVkIGVudHJ5IHBvaW50IHdyaXRlcyB0byA8Y29kZT5WaWV3cG9ydEluZGV4PC9jb2RlPiBmb3IgYW55IHByaW1pdGl2ZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gd3JpdGUgdGhlIHNhbWUgdmFsdWUgdG8gPGNvZGU+Vmlld3BvcnRJbmRleDwvY29kZT4gZm9yIGFsbCB2ZXJ0aWNlcyBvZiBhIGdpdmVuIHByaW1pdGl2ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMDcxOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN0YWdlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUPC9jb2RlPiwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgYW55IG91dHB1dCB2YXJpYWJsZXMgaW4gaXRzIGludGVyZmFjZSBkZWNvcmF0ZWQgd2l0aCA8Y29kZT5DdWxsRGlzdGFuY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3RhZ2U8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ8L2NvZGU+LCBhbmQgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgd3JpdGVzIHRvIDxjb2RlPkZyYWdEZXB0aDwvY29kZT4gaW4gYW55IGV4ZWN1dGlvbiBwYXRoLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiB3cml0ZSB0byA8Y29kZT5GcmFnRGVwdGg8L2NvZGU+IGluIGFsbCBleGVjdXRpb24gcGF0aHMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0c1wiPlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NoYWRlclN0YWdlRmxhZ0JpdHNcIj5Wa1NoYWRlclN0YWdlRmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1vZHVsZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tb2R1bGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NoYWRlck1vZHVsZVwiPlZrU2hhZGVyTW9kdWxlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5hbWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5hbWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wU3BlY2lhbGl6YXRpb25JbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBTcGVjaWFsaXphdGlvbkluZm88L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFNwZWNpYWxpemF0aW9uSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NwZWNpYWxpemF0aW9uSW5mb1wiPlZrU3BlY2lhbGl6YXRpb25JbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMjA5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLW1lc2hTaGFkZXJcIj5tZXNoIHNoYWRlcjwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3RhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyMDkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGFza1NoYWRlclwiPnRhc2sgc2hhZGVyPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zdGFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDIwOTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zdGFnZTwvY29kZT4gaXMgPGNvZGU+VktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WPC9jb2RlPiwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhbiA8Y29kZT5PcEV4ZWN1dGlvbk1vZGU8L2NvZGU+IGluc3RydWN0aW9uIHRoYXQgc3BlY2lmaWVzIGEgbWF4aW11bSBvdXRwdXQgdmVydGV4IGNvdW50LCA8Y29kZT5PdXRwdXRWZXJ0aWNlczwvY29kZT4sIHRoYXQgaXMgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY8L2NvZGU+Ojo8Y29kZT5tYXhNZXNoT3V0cHV0VmVydGljZXM8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMjA5NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN0YWdlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlY8L2NvZGU+LCB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGFuIDxjb2RlPk9wRXhlY3V0aW9uTW9kZTwvY29kZT4gaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgYSBtYXhpbXVtIG91dHB1dCBwcmltaXRpdmUgY291bnQsIDxjb2RlPk91dHB1dFByaW1pdGl2ZXNOVjwvY29kZT4sIHRoYXQgaXMgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY8L2NvZGU+Ojo8Y29kZT5tYXhNZXNoT3V0cHV0UHJpbWl0aXZlczwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMTUxMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN0YWdlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUPC9jb2RlPiwgYW5kIHRoZSBpZGVudGlmaWVkIGVudHJ5IHBvaW50IHdyaXRlcyB0byA8Y29kZT5GcmFnU3RlbmNpbFJlZkVYVDwvY29kZT4gaW4gYW55IGV4ZWN1dGlvbiBwYXRoLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiB3cml0ZSB0byA8Y29kZT5GcmFnU3RlbmNpbFJlZkVYVDwvY29kZT4gaW4gYWxsIGV4ZWN1dGlvbiBwYXRocyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3N1Ymdyb3VwX3NpemVfY29udHJvbCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI3ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaGFzIHRoZSA8Y29kZT5WS19QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0FMTE9XX1ZBUllJTkdfU1VCR1JPVVBfU0laRV9CSVRfRVhUPC9jb2RlPiBmbGFnIHNldCwgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc3ViZ3JvdXBTaXplQ29udHJvbFwiPjxjb2RlPnN1Ymdyb3VwU2l6ZUNvbnRyb2w8L2NvZGU+PC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNzg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGhhcyB0aGUgPGNvZGU+VktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9SRVFVSVJFX0ZVTExfU1VCR1JPVVBTX0JJVF9FWFQ8L2NvZGU+IGZsYWcgc2V0LCB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1jb21wdXRlRnVsbFN1Ymdyb3Vwc1wiPjxjb2RlPmNvbXB1dGVGdWxsU3ViZ3JvdXBzPC9jb2RlPjwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC0wMjc1NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluLCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfQUxMT1dfVkFSWUlOR19TVUJHUk9VUF9TSVpFX0JJVF9FWFQ8L2NvZGU+IGZsYWcgc2V0LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC0wMjc1NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluLCB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zdWJncm91cFNpemVDb250cm9sXCI+PGNvZGU+c3ViZ3JvdXBTaXplQ29udHJvbDwvY29kZT48L2E+IGZlYXR1cmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW5hYmxlZCwgYW5kIDxjb2RlPnN0YWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGJpdCBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNsaW1pdHMtcmVxdWlyZWQtc3ViZ3JvdXAtc2l6ZS1zdGFnZXNcIj48Y29kZT5yZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlczwvY29kZT48L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC0wMjc1NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGFuZCA8Y29kZT5zdGFnZTwvY29kZT4gaXMgPGNvZGU+VktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUPC9jb2RlPiwgdGhlIGxvY2FsIHdvcmtncm91cCBzaXplIG9mIHRoZSBzaGFkZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUPC9hPjo6PGNvZGU+cmVxdWlyZWRTdWJncm91cFNpemU8L2NvZGU+IGFuZCA8YSBocmVmPVwiI2xpbWl0cy1tYXgtc3ViZ3JvdXBzLXBlci13b3JrZ3JvdXBcIj48Y29kZT5tYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzPC9jb2RlPjwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXBOZXh0LTAyNzU3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4sIGFuZCA8Y29kZT5mbGFnczwvY29kZT4gaGFzIHRoZSA8Y29kZT5WS19QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX1JFUVVJUkVfRlVMTF9TVUJHUk9VUFNfQklUX0VYVDwvY29kZT4gZmxhZyBzZXQsIHRoZSBsb2NhbCB3b3JrZ3JvdXAgc2l6ZSBpbiB0aGUgWCBkaW1lbnNpb24gb2YgdGhlIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5yZXF1aXJlZFN1Ymdyb3VwU2l6ZTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNzU4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGhhcyBib3RoIHRoZSA8Y29kZT5WS19QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX1JFUVVJUkVfRlVMTF9TVUJHUk9VUFNfQklUX0VYVDwvY29kZT4gYW5kIDxjb2RlPlZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfQUxMT1dfVkFSWUlOR19TVUJHUk9VUF9TSVpFX0JJVF9FWFQ8L2NvZGU+IGZsYWdzIHNldCwgdGhlIGxvY2FsIHdvcmtncm91cCBzaXplIGluIHRoZSBYIGRpbWVuc2lvbiBvZiB0aGUgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8YSBocmVmPVwiI2xpbWl0cy1tYXgtc3ViZ3JvdXAtc2l6ZVwiPjxjb2RlPm1heFN1Ymdyb3VwU2l6ZTwvY29kZT48L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1mbGFncy0wMjc1OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBoYXMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfUkVRVUlSRV9GVUxMX1NVQkdST1VQU19CSVRfRVhUPC9jb2RlPiBmbGFnIHNldCBhbmQgPGNvZGU+ZmxhZ3M8L2NvZGU+IGRvZXMgbm90IGhhdmUgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfQUxMT1dfVkFSWUlOR19TVUJHUk9VUF9TSVpFX0JJVF9FWFQ8L2NvZGU+IGZsYWcgc2V0IGFuZCBubyA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4sIHRoZSBsb2NhbCB3b3JrZ3JvdXAgc2l6ZSBpbiB0aGUgWCBkaW1lbnNpb24gb2YgdGhlIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGEgaHJlZj1cIiNsaW1pdHMtc3ViZ3JvdXAtc2l6ZVwiPjxjb2RlPnN1Ymdyb3VwU2l6ZTwvY29kZT48L2E+LiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3N1Ymdyb3VwX3NpemVfY29udHJvbCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVC1yZXF1aXJlZFN1Ymdyb3VwU2l6ZS0wMjc2MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJlcXVpcmVkU3ViZ3JvdXBTaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHBvd2VyLW9mLXR3byBpbnRlZ2VyLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhULXJlcXVpcmVkU3ViZ3JvdXBTaXplLTAyNzYxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cmVxdWlyZWRTdWJncm91cFNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gPGEgaHJlZj1cIiNsaW1pdHMtbWluLXN1Ymdyb3VwLXNpemVcIj5taW5TdWJncm91cFNpemU8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhULXJlcXVpcmVkU3ViZ3JvdXBTaXplLTAyNzYyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cmVxdWlyZWRTdWJncm91cFNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8YSBocmVmPVwiI2xpbWl0cy1tYXgtc3ViZ3JvdXAtc2l6ZVwiPm1heFN1Ymdyb3VwU2l6ZTwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX1JFUVVJUkVEX1NVQkdST1VQX1NJWkVfQ1JFQVRFX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1mbGFncy0wMDcyMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5mbGFnczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gY29udGFpbnMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVDwvY29kZT4gZmxhZywgYW5kIHRoZSA8Y29kZT5iYXNlUGlwZWxpbmVJbmRleDwvY29kZT4gbWVtYmVyIG9mIHRoYXQgc2FtZSBlbGVtZW50IGlzIG5vdCA8Y29kZT4tMTwvY29kZT4sIDxjb2RlPmJhc2VQaXBlbGluZUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIGluZGV4IGludG8gPGNvZGU+cENyZWF0ZUluZm9zPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXQgZWxlbWVudCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1mbGFncy0wMDcyMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5mbGFnczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gY29udGFpbnMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVDwvY29kZT4gZmxhZywgdGhlIGJhc2UgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0FMTE9XX0RFUklWQVRJVkVTX0JJVDwvY29kZT4gZmxhZyBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1waXBlbGluZUNhY2hlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBpcGVsaW5lQ2FjaGU8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNhY2hlXCI+VmtQaXBlbGluZUNhY2hlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcENyZWF0ZUluZm9zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmNyZWF0ZUluZm9Db3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvXCI+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1wUGlwZWxpbmVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQaXBlbGluZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jcmVhdGVJbmZvQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtQaXBlbGluZVwiPlZrUGlwZWxpbmU8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtY3JlYXRlSW5mb0NvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y3JlYXRlSW5mb0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcGlwZWxpbmVDYWNoZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUPC9jb2RlPiBmbGFnLCBhbmQgPGNvZGU+YmFzZVBpcGVsaW5lSW5kZXg8L2NvZGU+IGlzIC0xLCA8Y29kZT5iYXNlUGlwZWxpbmVIYW5kbGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgaGFuZGxlIHRvIGEgZ3JhcGhpY3MgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3MjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVDwvY29kZT4gZmxhZywgYW5kIDxjb2RlPmJhc2VQaXBlbGluZUhhbmRsZTwvY29kZT4gaXMgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+YmFzZVBpcGVsaW5lSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgaW5kZXggaW50byB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+cENyZWF0ZUluZm9zPC9jb2RlPiBwYXJhbWV0ZXIiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3MjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVDwvY29kZT4gZmxhZywgYW5kIDxjb2RlPmJhc2VQaXBlbGluZUluZGV4PC9jb2RlPiBpcyBub3QgLTEsIDxjb2RlPmJhc2VQaXBlbGluZUhhbmRsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUPC9jb2RlPiBmbGFnLCBhbmQgPGNvZGU+YmFzZVBpcGVsaW5lSGFuZGxlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+YmFzZVBpcGVsaW5lSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIC0xIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0YWdlLTAwNzI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnN0YWdlPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBTdGFnZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMDcyOCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zdGFnZTwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzI5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFN0YWdlczwvY29kZT4gaW5jbHVkZXMgYSB0ZXNzZWxsYXRpb24gY29udHJvbCBzaGFkZXIgc3RhZ2UsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYSB0ZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDczMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBTdGFnZXM8L2NvZGU+IGluY2x1ZGVzIGEgdGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc2hhZGVyIHN0YWdlLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIGEgdGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiBpbmNsdWRlcyBhIHRlc3NlbGxhdGlvbiBjb250cm9sIHNoYWRlciBzdGFnZSBhbmQgYSB0ZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXIgc3RhZ2UsIDxjb2RlPnBUZXNzZWxsYXRpb25TdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGNvZGU+VmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiBpbmNsdWRlcyB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlcywgdGhlIHNoYWRlciBjb2RlIG9mIGF0IGxlYXN0IG9uZSBzdGFnZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIGFuIDxjb2RlPk9wRXhlY3V0aW9uTW9kZTwvY29kZT4gaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc3ViZGl2aXNpb24gaW4gdGhlIHBpcGVsaW5lIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiBpbmNsdWRlcyB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlcywgYW5kIHRoZSBzaGFkZXIgY29kZSBvZiBib3RoIHN0YWdlcyBjb250YWluIGFuIDxjb2RlPk9wRXhlY3V0aW9uTW9kZTwvY29kZT4gaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc3ViZGl2aXNpb24gaW4gdGhlIHBpcGVsaW5lLCB0aGV5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggc3BlY2lmeSB0aGUgc2FtZSBzdWJkaXZpc2lvbiBtb2RlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiBpbmNsdWRlcyB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlcywgdGhlIHNoYWRlciBjb2RlIG9mIGF0IGxlYXN0IG9uZSBzdGFnZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIGFuIDxjb2RlPk9wRXhlY3V0aW9uTW9kZTwvY29kZT4gaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIG91dHB1dCBwYXRjaCBzaXplIGluIHRoZSBwaXBlbGluZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzM1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFN0YWdlczwvY29kZT4gaW5jbHVkZXMgdGVzc2VsbGF0aW9uIHNoYWRlciBzdGFnZXMsIGFuZCB0aGUgc2hhZGVyIGNvZGUgb2YgYm90aCBjb250YWluIGFuIDxjb2RlPk9wRXhlY3V0aW9uTW9kZTwvY29kZT4gaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIG91dCBwYXRjaCBzaXplIGluIHRoZSBwaXBlbGluZSwgdGhleSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIHNwZWNpZnkgdGhlIHNhbWUgcGF0Y2ggc2l6ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzM2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFN0YWdlczwvY29kZT4gaW5jbHVkZXMgdGVzc2VsbGF0aW9uIHNoYWRlciBzdGFnZXMsIHRoZSA8Y29kZT50b3BvbG9neTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBJbnB1dEFzc2VtYmx5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA3MzciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+dG9wb2xvZ3k8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wSW5wdXRBc3NlbWJseTwvY29kZT4gaXMgPGNvZGU+VktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1Q8L2NvZGU+LCA8Y29kZT5wU3RhZ2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIHRlc3NlbGxhdGlvbiBzaGFkZXIgc3RhZ2VzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiBpbmNsdWRlcyBhIGdlb21ldHJ5IHNoYWRlciBzdGFnZSwgYW5kIGRvZXMgbm90IGluY2x1ZGUgYW55IHRlc3NlbGxhdGlvbiBzaGFkZXIgc3RhZ2VzLCBpdHMgc2hhZGVyIGNvZGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiBhbiA8Y29kZT5PcEV4ZWN1dGlvbk1vZGU8L2NvZGU+IGluc3RydWN0aW9uIHRoYXQgc3BlY2lmaWVzIGFuIGlucHV0IHByaW1pdGl2ZSB0eXBlIHRoYXQgaXMgPGEgaHJlZj1cIiNzaGFkZXJzLWdlb21ldHJ5LWV4ZWN1dGlvblwiPmNvbXBhdGlibGU8L2E+IHdpdGggdGhlIHByaW1pdGl2ZSB0b3BvbG9neSBzcGVjaWZpZWQgaW4gPGNvZGU+cElucHV0QXNzZW1ibHk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiBpbmNsdWRlcyBhIGdlb21ldHJ5IHNoYWRlciBzdGFnZSwgYW5kIGFsc28gaW5jbHVkZXMgdGVzc2VsbGF0aW9uIHNoYWRlciBzdGFnZXMsIGl0cyBzaGFkZXIgY29kZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIGFuIDxjb2RlPk9wRXhlY3V0aW9uTW9kZTwvY29kZT4gaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgYW4gaW5wdXQgcHJpbWl0aXZlIHR5cGUgdGhhdCBpcyA8YSBocmVmPVwiI3NoYWRlcnMtZ2VvbWV0cnktZXhlY3V0aW9uXCI+Y29tcGF0aWJsZTwvYT4gd2l0aCB0aGUgcHJpbWl0aXZlIHRvcG9sb2d5IHRoYXQgaXMgb3V0cHV0IGJ5IHRoZSB0ZXNzZWxsYXRpb24gc3RhZ2VzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3NDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiBpbmNsdWRlcyBhIGZyYWdtZW50IHNoYWRlciBzdGFnZSBhbmQgYSBnZW9tZXRyeSBzaGFkZXIgc3RhZ2UsIGFuZCB0aGUgZnJhZ21lbnQgc2hhZGVyIGNvZGUgcmVhZHMgZnJvbSBhbiBpbnB1dCB2YXJpYWJsZSB0aGF0IGlzIGRlY29yYXRlZCB3aXRoIDxjb2RlPlByaW1pdGl2ZUlEPC9jb2RlPiwgdGhlbiB0aGUgZ2VvbWV0cnkgc2hhZGVyIGNvZGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gd3JpdGUgdG8gYSBtYXRjaGluZyBvdXRwdXQgdmFyaWFibGUsIGRlY29yYXRlZCB3aXRoIDxjb2RlPlByaW1pdGl2ZUlEPC9jb2RlPiwgaW4gYWxsIGV4ZWN1dGlvbiBwYXRocyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFN0YWdlczwvY29kZT4gaW5jbHVkZXMgYSBmcmFnbWVudCBzaGFkZXIgc3RhZ2UsIGl0cyBzaGFkZXIgY29kZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgcmVhZCBmcm9tIGFueSBpbnB1dCBhdHRhY2htZW50IHRoYXQgaXMgZGVmaW5lZCBhcyA8Y29kZT5WS19BVFRBQ0hNRU5UX1VOVVNFRDwvY29kZT4gaW4gPGNvZGU+c3VicGFzczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDc0MiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzaGFkZXIgY29kZSBmb3IgdGhlIGVudHJ5IHBvaW50cyBpZGVudGlmaWVkIGJ5IDxjb2RlPnBTdGFnZXM8L2NvZGU+LCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlIGlkZW50aWZpZWQgYnkgdGhpcyBzdHJ1Y3R1cmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWRoZXJlIHRvIHRoZSBwaXBlbGluZSBsaW5raW5nIHJ1bGVzIGRlc2NyaWJlZCBpbiB0aGUgPGEgaHJlZj1cIiNpbnRlcmZhY2VzXCI+U2hhZGVyIEludGVyZmFjZXM8L2E+IGNoYXB0ZXIiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tYmxlbmRFbmFibGUtMDIwMjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiByYXN0ZXJpemF0aW9uIGlzIG5vdCBkaXNhYmxlZCBhbmQgdGhlIHN1YnBhc3MgdXNlcyBjb2xvciBhdHRhY2htZW50cywgdGhlbiBmb3IgZWFjaCBjb2xvciBhdHRhY2htZW50IGluIHRoZSBzdWJwYXNzIHRoZSA8Y29kZT5ibGVuZEVuYWJsZTwvY29kZT4gbWVtYmVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBBdHRhY2htZW50PC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cENvbG9yQmxlbmRTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+IGlmIHRoZSBhdHRhY2hlZCBpbWFnZSYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gZG9lcyBub3QgY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JMRU5EX0JJVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWF0dGFjaG1lbnRDb3VudC0wMDc0NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHJhc3Rlcml6YXRpb24gaXMgbm90IGRpc2FibGVkIGFuZCB0aGUgc3VicGFzcyB1c2VzIGNvbG9yIGF0dGFjaG1lbnRzLCB0aGUgPGNvZGU+YXR0YWNobWVudENvdW50PC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cENvbG9yQmxlbmRTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIDxjb2RlPmNvbG9yQXR0YWNobWVudENvdW50PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5zdWJwYXNzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVDwvY29kZT4sIHRoZSA8Y29kZT5wVmlld3BvcnRzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFZpZXdwb3J0U3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wVmlld3BvcnRTdGF0ZTwvY29kZT4tJmd0O3ZpZXdwb3J0Q291bnQgdmFsaWQgPGNvZGU+VmtWaWV3cG9ydDwvY29kZT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9TQ0lTU09SPC9jb2RlPiwgdGhlIDxjb2RlPnBTY2lzc29yczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBWaWV3cG9ydFN0YXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cFZpZXdwb3J0U3RhdGU8L2NvZGU+LSZndDtzY2lzc29yQ291bnQgPGNvZGU+VmtSZWN0MkQ8L2NvZGU+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgd2lkZSBsaW5lcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgbm8gZWxlbWVudCBvZiB0aGUgPGNvZGU+cER5bmFtaWNTdGF0ZXM8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wRHluYW1pY1N0YXRlPC9jb2RlPiBpcyA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX0xJTkVfV0lEVEg8L2NvZGU+LCB0aGUgPGNvZGU+bGluZVdpZHRoPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJhc3Rlcml6YXRpb25TdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MS4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZS0wMDc1MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSYXN0ZXJpemF0aW9uU3RhdGU8L2NvZGU+IGlzIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiwgPGNvZGU+cFZpZXdwb3J0U3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxjb2RlPlZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlLTAwNzUxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJhc3Rlcml6YXRpb25TdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRkFMU0U8L2NvZGU+LCA8Y29kZT5wTXVsdGlzYW1wbGVTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGNvZGU+VmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cmFzdGVyaXplckRpc2NhcmRFbmFibGU8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUmFzdGVyaXphdGlvblN0YXRlPC9jb2RlPiBpcyA8Y29kZT5WS19GQUxTRTwvY29kZT4sIGFuZCA8Y29kZT5zdWJwYXNzPC9jb2RlPiB1c2VzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50LCA8Y29kZT5wRGVwdGhTdGVuY2lsU3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxjb2RlPlZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZS0wMDc1MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSYXN0ZXJpemF0aW9uU3RhdGU8L2NvZGU+IGlzIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiwgYW5kIDxjb2RlPnN1YnBhc3M8L2NvZGU+IHVzZXMgY29sb3IgYXR0YWNobWVudHMsIDxjb2RlPnBDb2xvckJsZW5kU3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxjb2RlPlZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZGVwdGggYmlhcyBjbGFtcGluZyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBubyBlbGVtZW50IG9mIHRoZSA8Y29kZT5wRHluYW1pY1N0YXRlczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBEeW5hbWljU3RhdGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RZTkFNSUNfU1RBVEVfREVQVEhfQklBUzwvY29kZT4sIGFuZCB0aGUgPGNvZGU+ZGVwdGhCaWFzRW5hYmxlPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFJhc3Rlcml6YXRpb25TdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIHRoZSA8Y29kZT5kZXB0aEJpYXNDbGFtcDwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBSYXN0ZXJpemF0aW9uU3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjAuMDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tbGF5b3V0LTAwNzU2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLXBpcGVsaW5lbGF5b3V0LWNvbnNpc3RlbmN5XCI+Y29uc2lzdGVudDwvYT4gd2l0aCBhbGwgc2hhZGVycyBzcGVjaWZpZWQgaW4gPGNvZGU+cFN0YWdlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc1NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5laXRoZXIgdGhlIDxjb2RlPlZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXM8L2NvZGU+IG5vciB0aGUgPGNvZGU+VktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlczwvY29kZT4gZXh0ZW5zaW9ucyBhcmUgZW5hYmxlZCwgYW5kIGlmIDxjb2RlPnN1YnBhc3M8L2NvZGU+IHVzZXMgY29sb3IgYW5kL29yIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudHMsIHRoZW4gdGhlIDxjb2RlPnJhc3Rlcml6YXRpb25TYW1wbGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cE11bHRpc2FtcGxlU3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHRoZSBzYW1lIGFzIHRoZSBzYW1wbGUgY291bnQgZm9yIHRob3NlIHN1YnBhc3MgYXR0YWNobWVudHMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc1OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN1YnBhc3M8L2NvZGU+IGRvZXMgbm90IHVzZSBhbnkgY29sb3IgYW5kL29yIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudHMsIHRoZW4gdGhlIDxjb2RlPnJhc3Rlcml6YXRpb25TYW1wbGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cE11bHRpc2FtcGxlU3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGZvbGxvdyB0aGUgcnVsZXMgZm9yIGEgPGEgaHJlZj1cIiNyZW5kZXJwYXNzLW5vYXR0YWNobWVudHNcIj56ZXJvLWF0dGFjaG1lbnQgc3VicGFzczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc1OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1YnBhc3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgc3VicGFzcyB3aXRoaW4gPGNvZGU+cmVuZGVyUGFzczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tbGF5b3V0LTAxNjg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIG51bWJlciBvZiByZXNvdXJjZXMgaW4gPGNvZGU+bGF5b3V0PC9jb2RlPiBhY2Nlc3NpYmxlIHRvIGVhY2ggc2hhZGVyIHN0YWdlIHRoYXQgaXMgdXNlZCBieSB0aGUgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhQZXJTdGFnZVJlc291cmNlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjA5NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBTdGFnZXM8L2NvZGU+IGluY2x1ZGVzIGEgdmVydGV4IHNoYWRlciBzdGFnZSwgPGNvZGU+cFZlcnRleElucHV0U3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvXCI+VmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjA5OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBTdGFnZXM8L2NvZGU+IGluY2x1ZGVzIGEgdmVydGV4IHNoYWRlciBzdGFnZSwgPGNvZGU+cElucHV0QXNzZW1ibHlTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mb1wiPlZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRFwiPlZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EPC9hPiwgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+LCBvciA8YSBocmVmPVwiI1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WXCI+VmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlY8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDcmVhdGVGbGFnQml0c1wiPlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN0YWdlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnN0YWdlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1wiPlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFJhc3Rlcml6YXRpb25TdGF0ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUmFzdGVyaXphdGlvblN0YXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvXCI+VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBEeW5hbWljU3RhdGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mb1wiPlZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tbGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVMYXlvdXRcIj5Wa1BpcGVsaW5lTGF5b3V0PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzXCI+VmtSZW5kZXJQYXNzPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2VDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0YWdlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmJhc2VQaXBlbGluZUhhbmRsZTwvY29kZT4sIDxjb2RlPmxheW91dDwvY29kZT4sIGFuZCA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX05WX21lc2hfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMDcyNyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zdGFnZTwvY29kZT4gbWVtYmVyIG9mIG9uZSBlbGVtZW50IG9mIDxjb2RlPnBTdGFnZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDIwOTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgZ2VvbWV0cmljIHNoYWRlciBzdGFnZXMgcHJvdmlkZWQgaW4gPGNvZGU+cFN0YWdlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIGZyb20gdGhlIG1lc2ggc2hhZGluZyBwaXBlbGluZSAoPGNvZGU+c3RhZ2U8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OVjwvY29kZT4gb3IgPGNvZGU+VktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WPC9jb2RlPikgb3IgZnJvbSB0aGUgcHJpbWl0aXZlIHNoYWRpbmcgcGlwZWxpbmUgKDxjb2RlPnN0YWdlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVDwvY29kZT4sIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVDwvY29kZT4pLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMjA5NiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zdGFnZTwvY29kZT4gbWVtYmVyIG9mIG9uZSBlbGVtZW50IG9mIDxjb2RlPnBTdGFnZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5WS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAwNzQzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgcmFzdGVyaXphdGlvbiBpcyBub3QgZGlzYWJsZWQgYW5kIDxjb2RlPnN1YnBhc3M8L2NvZGU+IHVzZXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgaW4gPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gdGhhdCBoYXMgYSBsYXlvdXQgb2YgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw8L2NvZGU+IGluIHRoZSA8Y29kZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L2NvZGU+IGRlZmluZWQgYnkgPGNvZGU+c3VicGFzczwvY29kZT4sIHRoZSA8Y29kZT5kZXB0aFdyaXRlRW5hYmxlPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cERlcHRoU3RlbmNpbFN0YXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GQUxTRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc0NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHJhc3Rlcml6YXRpb24gaXMgbm90IGRpc2FibGVkIGFuZCA8Y29kZT5zdWJwYXNzPC9jb2RlPiB1c2VzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGluIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IHRoYXQgaGFzIGEgbGF5b3V0IG9mIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiBpbiB0aGUgPGNvZGU+VmtBdHRhY2htZW50UmVmZXJlbmNlPC9jb2RlPiBkZWZpbmVkIGJ5IDxjb2RlPnN1YnBhc3M8L2NvZGU+LCB0aGUgPGNvZGU+ZmFpbE9wPC9jb2RlPiwgPGNvZGU+cGFzc09wPC9jb2RlPiBhbmQgPGNvZGU+ZGVwdGhGYWlsT3A8L2NvZGU+IG1lbWJlcnMgb2YgZWFjaCBvZiB0aGUgPGNvZGU+ZnJvbnQ8L2NvZGU+IGFuZCA8Y29kZT5iYWNrPC9jb2RlPiBtZW1iZXJzIG9mIDxjb2RlPnBEZXB0aFN0ZW5jaWxTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RFTkNJTF9PUF9LRUVQPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMTc1NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHJhc3Rlcml6YXRpb24gaXMgbm90IGRpc2FibGVkIGFuZCA8Y29kZT5zdWJwYXNzPC9jb2RlPiB1c2VzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGluIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IHRoYXQgaGFzIGEgbGF5b3V0IG9mIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMPC9jb2RlPiBpbiB0aGUgPGNvZGU+VmtBdHRhY2htZW50UmVmZXJlbmNlPC9jb2RlPiBkZWZpbmVkIGJ5IDxjb2RlPnN1YnBhc3M8L2NvZGU+LCB0aGUgPGNvZGU+ZGVwdGhXcml0ZUVuYWJsZTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBEZXB0aFN0ZW5jaWxTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDE3NTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiByYXN0ZXJpemF0aW9uIGlzIG5vdCBkaXNhYmxlZCBhbmQgPGNvZGU+c3VicGFzczwvY29kZT4gdXNlcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCBpbiA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiB0aGF0IGhhcyBhIGxheW91dCBvZiA8Y29kZT5WS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDwvY29kZT4gaW4gdGhlIDxjb2RlPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvY29kZT4gZGVmaW5lZCBieSA8Y29kZT5zdWJwYXNzPC9jb2RlPiwgdGhlIDxjb2RlPmZhaWxPcDwvY29kZT4sIDxjb2RlPnBhc3NPcDwvY29kZT4gYW5kIDxjb2RlPmRlcHRoRmFpbE9wPC9jb2RlPiBtZW1iZXJzIG9mIGVhY2ggb2YgdGhlIDxjb2RlPmZyb250PC9jb2RlPiBhbmQgPGNvZGU+YmFjazwvY29kZT4gbWVtYmVycyBvZiA8Y29kZT5wRGVwdGhTdGVuY2lsU3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NURU5DSUxfT1BfS0VFUDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMTU2NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBTdGFnZXM8L2NvZGU+IGluY2x1ZGVzIGEgZnJhZ21lbnQgc2hhZGVyIHN0YWdlIGFuZCBhbiBpbnB1dCBhdHRhY2htZW50IHdhcyByZWZlcmVuY2VkIGJ5IHRoZSA8YSBocmVmPVwiI1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm9cIj5Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvPC9hPiBhdCA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBjcmVhdGUgdGltZSwgaXRzIHNoYWRlciBjb2RlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCByZWFkIGZyb20gYW55IGFzcGVjdCB0aGF0IHdhcyBub3Qgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBvZiB0aGUgY29ycmVzcG9uZGluZyA8YSBocmVmPVwiI1ZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlXCI+VmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2U8L2E+IHN0cnVjdHVyZS4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc1NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9ERVBUSF9CT1VORFM8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPmRlcHRoQm91bmRzVGVzdEVuYWJsZTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBEZXB0aFN0ZW5jaWxTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIHRoZSA8Y29kZT5taW5EZXB0aEJvdW5kczwvY29kZT4gYW5kIDxjb2RlPm1heERlcHRoQm91bmRzPC9jb2RlPiBtZW1iZXJzIG9mIDxjb2RlPnBEZXB0aFN0ZW5jaWxTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4wLjA8L2NvZGU+IGFuZCA8Y29kZT4xLjA8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAyNTEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPjxhIGhyZWY9XCIjVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZFwiPlZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQ8L2E+PC9jb2RlPiBleHRlbnNpb24gaXMgbm90IGVuYWJsZWQgYW5kIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9ERVBUSF9CT1VORFM8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPmRlcHRoQm91bmRzVGVzdEVuYWJsZTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBEZXB0aFN0ZW5jaWxTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIHRoZSA8Y29kZT5taW5EZXB0aEJvdW5kczwvY29kZT4gYW5kIDxjb2RlPm1heERlcHRoQm91bmRzPC9jb2RlPiBtZW1iZXJzIG9mIDxjb2RlPnBEZXB0aFN0ZW5jaWxTdGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4wLjA8L2NvZGU+IGFuZCA8Y29kZT4xLjA8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMTUyMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVDwvY29kZT4sIGFuZCB0aGUgPGNvZGU+c2FtcGxlTG9jYXRpb25zRW5hYmxlPC9jb2RlPiBtZW1iZXIgb2YgYSA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiA8Y29kZT5wTXVsdGlzYW1wbGVTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIDxjb2RlPnNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25HcmlkU2l6ZS53aWR0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXZlbmx5IGRpdmlkZSA8YSBocmVmPVwiI1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUXCI+VmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ8L2E+Ojo8Y29kZT5zYW1wbGVMb2NhdGlvbkdyaWRTaXplLndpZHRoPC9jb2RlPiBhcyByZXR1cm5lZCBieSA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFRcIj52a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUPC9hPiB3aXRoIGEgPGNvZGU+c2FtcGxlczwvY29kZT4gcGFyYW1ldGVyIGVxdWFsaW5nIDxjb2RlPnJhc3Rlcml6YXRpb25TYW1wbGVzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMTUyMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVDwvY29kZT4sIGFuZCB0aGUgPGNvZGU+c2FtcGxlTG9jYXRpb25zRW5hYmxlPC9jb2RlPiBtZW1iZXIgb2YgYSA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiA8Y29kZT5wTXVsdGlzYW1wbGVTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIDxjb2RlPnNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25HcmlkU2l6ZS5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGV2ZW5seSBkaXZpZGUgPGEgaHJlZj1cIiNWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVFwiPlZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+c2FtcGxlTG9jYXRpb25HcmlkU2l6ZS5oZWlnaHQ8L2NvZGU+IGFzIHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVFwiPnZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ8L2E+IHdpdGggYSA8Y29kZT5zYW1wbGVzPC9jb2RlPiBwYXJhbWV0ZXIgZXF1YWxpbmcgPGNvZGU+cmFzdGVyaXphdGlvblNhbXBsZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAxNTIzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gZWxlbWVudCBvZiB0aGUgPGNvZGU+cER5bmFtaWNTdGF0ZXM8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wRHluYW1pY1N0YXRlPC9jb2RlPiBpcyA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX1NBTVBMRV9MT0NBVElPTlNfRVhUPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIDxjb2RlPnBNdWx0aXNhbXBsZVN0YXRlPC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiwgPGNvZGU+c2FtcGxlTG9jYXRpb25zSW5mby5zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgPGNvZGU+cmFzdGVyaXphdGlvblNhbXBsZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMTUyNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L2NvZGU+IG1lbWJlciBvZiBhIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIDxjb2RlPnBNdWx0aXNhbXBsZVN0YXRlPC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiwgdGhlIGZyYWdtZW50IHNoYWRlciBjb2RlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBzdGF0aWNhbGx5IHVzZSB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gPGNvZGU+SW50ZXJwb2xhdGVBdFNhbXBsZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDE1MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VktfQU1EX21peGVkX2F0dGFjaG1lbnRfc2FtcGxlczwvY29kZT4gZXh0ZW5zaW9uIGlzIGVuYWJsZWQsIGFuZCBpZiA8Y29kZT5zdWJwYXNzPC9jb2RlPiB1c2VzIGNvbG9yIGFuZC9vciBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnRzLCB0aGVuIHRoZSA8Y29kZT5yYXN0ZXJpemF0aW9uU2FtcGxlczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBNdWx0aXNhbXBsZVN0YXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgbWF4aW11bSBvZiB0aGUgc2FtcGxlIGNvdW50cyBvZiB0aG9zZSBzdWJwYXNzIGF0dGFjaG1lbnRzIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAxNDExIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZLX05WX2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXM8L2NvZGU+IGV4dGVuc2lvbiBpcyBlbmFibGVkLCBhbmQgaWYgPGNvZGU+c3VicGFzczwvY29kZT4gaGFzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGFuZCBkZXB0aCB0ZXN0LCBzdGVuY2lsIHRlc3QsIG9yIGRlcHRoIGJvdW5kcyB0ZXN0IGFyZSBlbmFibGVkLCB0aGVuIHRoZSA8Y29kZT5yYXN0ZXJpemF0aW9uU2FtcGxlczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBNdWx0aXNhbXBsZVN0YXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB0aGUgc2FtZSBhcyB0aGUgc2FtcGxlIGNvdW50IG9mIHRoZSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMTQxMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5WS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzPC9jb2RlPiBleHRlbnNpb24gaXMgZW5hYmxlZCwgYW5kIGlmIDxjb2RlPnN1YnBhc3M8L2NvZGU+IGhhcyBhbnkgY29sb3IgYXR0YWNobWVudHMsIHRoZW4gdGhlIDxjb2RlPnJhc3Rlcml6YXRpb25TYW1wbGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cE11bHRpc2FtcGxlU3RhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2FtcGxlIGNvdW50IGZvciB0aG9zZSBzdWJwYXNzIGF0dGFjaG1lbnRzIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9jb3ZlcmFnZV9yZWR1Y3Rpb25fbW9kZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlLTAyNzIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlPC9jb2RlPiBleHRlbnNpb24gaXMgZW5hYmxlZCwgdGhlIGNvdmVyYWdlIHJlZHVjdGlvbiBtb2RlIHNwZWNpZmllZCBieSA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WXCI+VmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlY8L2E+Ojo8Y29kZT5jb3ZlcmFnZVJlZHVjdGlvbk1vZGU8L2NvZGU+LCB0aGUgPGNvZGU+cmFzdGVyaXphdGlvblNhbXBsZXM8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wTXVsdGlzYW1wbGVTdGF0ZTwvY29kZT4gYW5kIHRoZSBzYW1wbGUgY291bnRzIGZvciB0aGUgY29sb3IgYW5kIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudHMgKGlmIHRoZSBzdWJwYXNzIGhhcyB0aGVtKSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMDc2MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBoYXMgbXVsdGl2aWV3IGVuYWJsZWQgYW5kIDxjb2RlPnN1YnBhc3M8L2NvZGU+IGhhcyBtb3JlIHRoYW4gb25lIGJpdCBzZXQgaW4gdGhlIHZpZXcgbWFzayBhbmQgPGNvZGU+bXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyPC9jb2RlPiBpcyBub3QgZW5hYmxlZCwgdGhlbiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSB0ZXNzZWxsYXRpb24gc2hhZGVycy4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMDc2MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBoYXMgbXVsdGl2aWV3IGVuYWJsZWQgYW5kIDxjb2RlPnN1YnBhc3M8L2NvZGU+IGhhcyBtb3JlIHRoYW4gb25lIGJpdCBzZXQgaW4gdGhlIHZpZXcgbWFzayBhbmQgPGNvZGU+bXVsdGl2aWV3R2VvbWV0cnlTaGFkZXI8L2NvZGU+IGlzIG5vdCBlbmFibGVkLCB0aGVuIDxjb2RlPnBTdGFnZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIGEgZ2VvbWV0cnkgc2hhZGVyLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAwNzYyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IGhhcyBtdWx0aXZpZXcgZW5hYmxlZCBhbmQgPGNvZGU+c3VicGFzczwvY29kZT4gaGFzIG1vcmUgdGhhbiBvbmUgYml0IHNldCBpbiB0aGUgdmlldyBtYXNrLCBzaGFkZXJzIGluIHRoZSBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgd3JpdGUgdG8gdGhlIDxjb2RlPkxheWVyPC9jb2RlPiBidWlsdC1pbiBvdXRwdXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMDc2MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBoYXMgbXVsdGl2aWV3IGVuYWJsZWQsIHRoZW4gYWxsIHNoYWRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgdmFyaWFibGVzIGRlY29yYXRlZCB3aXRoIHRoZSA8Y29kZT5MYXllcjwvY29kZT4gYnVpbHQtaW4gZGVjb3JhdGlvbiBpbiB0aGVpciBpbnRlcmZhY2VzLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3NjQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ESVNQQVRDSF9CQVNFPC9jb2RlPiBmbGFnLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfY2xpcF9zcGFjZV93X3NjYWxpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAxNzE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gZWxlbWVudCBvZiB0aGUgPGNvZGU+cER5bmFtaWNTdGF0ZXM8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wRHluYW1pY1N0YXRlPC9jb2RlPiBpcyA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1dfU0NBTElOR19OVjwvY29kZT4sIGFuZCB0aGUgPGNvZGU+dmlld3BvcnRXU2NhbGluZ0VuYWJsZTwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WXCI+VmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVjwvYT4gc3RydWN0dXJlLCBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIDxjb2RlPnBWaWV3cG9ydFN0YXRlPC9jb2RlPiwgaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIHRoZSA8Y29kZT5wVmlld3BvcnRXU2NhbGluZ3M8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGEgaHJlZj1cIiNWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WXCI+VmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVjwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVlwiPlZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY8L2E+Ojo8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrVmlld3BvcnRXU2NhbGluZ05WXCI+VmtWaWV3cG9ydFdTY2FsaW5nTlY8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDIzMTciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+WGZiPC9jb2RlPiBleGVjdXRpb24gbW9kZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+Y2FuPC9zdHJvbmc+IGJlIHNwZWNpZmllZCBieSBvbmx5IG9uZSBzaGFkZXIgc3RhZ2UgaW4gPGNvZGU+cFN0YWdlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjMxOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBzaGFkZXIgc3RhZ2UgaW4gPGNvZGU+cFN0YWdlczwvY29kZT4gc3BlY2lmaWVzIDxjb2RlPlhmYjwvY29kZT4gZXhlY3V0aW9uIG1vZGUgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIGxhc3QgdmVydGV4IHByb2Nlc3Npbmcgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXphdGlvblN0cmVhbS0wMjMxOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ8L2NvZGU+Ojo8Y29kZT5yYXN0ZXJpemF0aW9uU3RyZWFtPC9jb2RlPiB2YWx1ZSBvdGhlciB0aGFuIHplcm8gaXMgc3BlY2lmaWVkLCBhbGwgdmFyaWFibGVzIGluIHRoZSBvdXRwdXQgaW50ZXJmYWNlIG9mIHRoZSBlbnRyeSBwb2ludCBiZWluZyBjb21waWxlZCBkZWNvcmF0ZWQgd2l0aCA8Y29kZT5Qb3NpdGlvbjwvY29kZT4sIDxjb2RlPlBvaW50U2l6ZTwvY29kZT4sIDxjb2RlPkNsaXBEaXN0YW5jZTwvY29kZT4sIG9yIDxjb2RlPkN1bGxEaXN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxsIGJlIGRlY29yYXRlZCB3aXRoIGlkZW50aWNhbCA8Y29kZT5TdHJlYW08L2NvZGU+IHZhbHVlcyB0aGF0IG1hdGNoIHRoZSA8Y29kZT5yYXN0ZXJpemF0aW9uU3RyZWFtPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yYXN0ZXJpemF0aW9uU3RyZWFtLTAyMzIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ8L2NvZGU+Ojo8Y29kZT5yYXN0ZXJpemF0aW9uU3RyZWFtPC9jb2RlPiBpcyB6ZXJvLCBvciBub3Qgc3BlY2lmaWVkLCBhbGwgdmFyaWFibGVzIGluIHRoZSBvdXRwdXQgaW50ZXJmYWNlIG9mIHRoZSBlbnRyeSBwb2ludCBiZWluZyBjb21waWxlZCBkZWNvcmF0ZWQgd2l0aCA8Y29kZT5Qb3NpdGlvbjwvY29kZT4sIDxjb2RlPlBvaW50U2l6ZTwvY29kZT4sIDxjb2RlPkNsaXBEaXN0YW5jZTwvY29kZT4sIG9yIDxjb2RlPkN1bGxEaXN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxsIGJlIGRlY29yYXRlZCB3aXRoIGEgPGNvZGU+U3RyZWFtPC9jb2RlPiB2YWx1ZSBvZiB6ZXJvLCBvciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgc3BlY2lmeSB0aGUgPGNvZGU+U3RyZWFtPC9jb2RlPiBkZWNvcmF0aW9uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWdlb21ldHJ5U3RyZWFtcy0wMjMyMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBsYXN0IHZlcnRleCBwcm9jZXNzaW5nIHN0YWdlIGlzIGEgZ2VvbWV0cnkgc2hhZGVyLCBhbmQgdGhhdCBnZW9tZXRyeSBzaGFkZXIgdXNlcyB0aGUgPGNvZGU+R2VvbWV0cnlTdHJlYW1zPC9jb2RlPiBjYXBhYmlsaXR5LCB0aGVuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUPC9jb2RlPjo6PGNvZGU+Z2VvbWV0cnlTdHJlYW1zPC9jb2RlPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spKyhWS19OVl9tZXNoX3NoYWRlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tTm9uZS0wMjMyMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZXJlIGFyZSBhbnkgbWVzaCBzaGFkZXIgc3RhZ2VzIGluIHRoZSBwaXBlbGluZSB0aGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYW55IHNoYWRlciBzdGFnZSBpbiB0aGUgcGlwZWxpbmUgd2l0aCBhIDxjb2RlPlhmYjwvY29kZT4gZXhlY3V0aW9uIG1vZGUuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfbGluZV9yYXN0ZXJpemF0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1saW5lUmFzdGVyaXphdGlvbk1vZGUtMDI3NjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+bGluZVJhc3Rlcml6YXRpb25Nb2RlPC9jb2RlPiBtZW1iZXIgb2YgYSA8YSBocmVmPVwiI1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgPGNvZGU+cFJhc3Rlcml6YXRpb25TdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfTElORV9SQVNURVJJWkFUSU9OX01PREVfQlJFU0VOSEFNX0VYVDwvY29kZT4gb3IgPGNvZGU+VktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfU01PT1RIX0VYVDwvY29kZT4gYW5kIGlmIHJhc3Rlcml6YXRpb24gaXMgZW5hYmxlZCwgdGhlbiB0aGUgPGNvZGU+YWxwaGFUb0NvdmVyYWdlRW5hYmxlPC9jb2RlPiwgPGNvZGU+YWxwaGFUb09uZUVuYWJsZTwvY29kZT4sIGFuZCA8Y29kZT5zYW1wbGVTaGFkaW5nRW5hYmxlPC9jb2RlPiBtZW1iZXJzIG9mIDxjb2RlPnBNdWx0aXNhbXBsZVN0YXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbGwgYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0aXBwbGVkTGluZUVuYWJsZS0wMjc2NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5zdGlwcGxlZExpbmVFbmFibGU8L2NvZGU+IG1lbWJlciBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVDwvYT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4gYW5kIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9MSU5FX1NUSVBQTEVfRVhUPC9jb2RlPiwgdGhlbiB0aGUgPGNvZGU+bGluZVN0aXBwbGVGYWN0b3I8L2NvZGU+IG1lbWJlciBvZiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVDwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIHJhbmdlIDxzcGFuIGNsYXNzPVwiZXFcIj5bMSwyNTZdPC9zcGFuPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAxNDQyIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmR5bmFtaWNTdGF0ZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZHluYW1pY1N0YXRlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtEeW5hbWljU3RhdGVcIj5Wa0R5bmFtaWNTdGF0ZTwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95UGlwZWxpbmUiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UGlwZWxpbmUtcGlwZWxpbmUtMDA3NjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgc3VibWl0dGVkIGNvbW1hbmRzIHRoYXQgcmVmZXIgdG8gPGNvZGU+cGlwZWxpbmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UGlwZWxpbmUtcGlwZWxpbmUtMDA3NjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5waXBlbGluZTwvY29kZT4gd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHByb3ZpZGVkIGhlcmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLTAwNzY3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+cGlwZWxpbmU8L2NvZGU+IHdhcyBjcmVhdGVkLCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UGlwZWxpbmUtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UGlwZWxpbmUtcGlwZWxpbmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cGlwZWxpbmU8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5waXBlbGluZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVcIj5Wa1BpcGVsaW5lPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1waXBlbGluZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZTwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVQaXBlbGluZUNhY2hlLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlUGlwZWxpbmVDYWNoZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvXCI+VmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVBpcGVsaW5lQ2FjaGUtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlUGlwZWxpbmVDYWNoZS1wUGlwZWxpbmVDYWNoZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUGlwZWxpbmVDYWNoZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ2FjaGVcIj5Wa1BpcGVsaW5lQ2FjaGU8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mby1pbml0aWFsRGF0YVNpemUtMDA3NjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbml0aWFsRGF0YVNpemU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIHNpemUgb2YgPGNvZGU+cEluaXRpYWxEYXRhPC9jb2RlPiwgYXMgcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaXBlbGluZUNhY2hlRGF0YTwvY29kZT4gd2hlbiA8Y29kZT5wSW5pdGlhbERhdGE8L2NvZGU+IHdhcyBvcmlnaW5hbGx5IHJldHJpZXZlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mby1pbml0aWFsRGF0YVNpemUtMDA3NjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbml0aWFsRGF0YVNpemU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEluaXRpYWxEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gcmV0cmlldmVkIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIDxjb2RlPnZrR2V0UGlwZWxpbmVDYWNoZURhdGE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NBQ0hFX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mby1wSW5pdGlhbERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW5pdGlhbERhdGFTaXplPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBJbml0aWFsRGF0YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmluaXRpYWxEYXRhU2l6ZTwvY29kZT4gYnl0ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a01lcmdlUGlwZWxpbmVDYWNoZXMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtNZXJnZVBpcGVsaW5lQ2FjaGVzLWRzdENhY2hlLTAwNzcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0Q2FjaGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2Ygc291cmNlIGNhY2hlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtNZXJnZVBpcGVsaW5lQ2FjaGVzLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1kc3RDYWNoZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RDYWNoZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDYWNoZVwiPlZrUGlwZWxpbmVDYWNoZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtcFNyY0NhY2hlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3JjQ2FjaGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c3JjQ2FjaGVDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ2FjaGVcIj5Wa1BpcGVsaW5lQ2FjaGU8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1zcmNDYWNoZUNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjQ2FjaGVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtZHN0Q2FjaGUtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0Q2FjaGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1wU3JjQ2FjaGVzLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wU3JjQ2FjaGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaXBlbGluZUNhY2hlRGF0YSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lQ2FjaGVEYXRhLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVDYWNoZURhdGEtcGlwZWxpbmVDYWNoZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNhY2hlXCI+VmtQaXBlbGluZUNhY2hlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVDYWNoZURhdGEtcERhdGFTaXplLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEYXRhU2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+c2l6ZV90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaXBlbGluZUNhY2hlRGF0YS1wRGF0YS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wRGF0YVNpemU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBEYXRhPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cERhdGFTaXplPC9jb2RlPiBieXRlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaXBlbGluZUNhY2hlRGF0YS1waXBlbGluZUNhY2hlLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lQ2FjaGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtcGlwZWxpbmVDYWNoZS0wMDc3MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPnBpcGVsaW5lQ2FjaGU8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUNhY2hlLXBpcGVsaW5lQ2FjaGUtMDA3NzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UGlwZWxpbmVDYWNoZS1waXBlbGluZUNhY2hlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBpcGVsaW5lQ2FjaGU8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNhY2hlXCI+VmtQaXBlbGluZUNhY2hlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtcGlwZWxpbmVDYWNoZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3BlY2lhbGl6YXRpb25JbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BlY2lhbGl6YXRpb25JbmZvLW9mZnNldC0wMDc3MyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cE1hcEVudHJpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BlY2lhbGl6YXRpb25JbmZvLXBNYXBFbnRyaWVzLTAwNzc0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNpemU8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cE1hcEVudHJpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gbWludXMgPGNvZGU+b2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tcE1hcEVudHJpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bWFwRW50cnlDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wTWFwRW50cmllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPm1hcEVudHJ5Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5XCI+VmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5PC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwZWNpYWxpemF0aW9uSW5mby1wRGF0YS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wRGF0YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmRhdGFTaXplPC9jb2RlPiBieXRlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwZWNpYWxpemF0aW9uTWFwRW50cnktY29uc3RhbnRJRC0wMDc3NiIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBhIDxjb2RlPmNvbnN0YW50SUQ8L2NvZGU+IHNwZWNpYWxpemF0aW9uIGNvbnN0YW50IGRlY2xhcmVkIGluIGEgc2hhZGVyLCA8Y29kZT5zaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGUgYnl0ZSBzaXplIG9mIHRoZSA8Y29kZT5jb25zdGFudElEPC9jb2RlPi4gSWYgdGhlIHNwZWNpYWxpemF0aW9uIGNvbnN0YW50IGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHRoZSBieXRlIHNpemUgb2YgPGNvZGU+VmtCb29sMzI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRCaW5kUGlwZWxpbmUiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtMDA3NzciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gaXMgPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFPC9jb2RlPiwgdGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMDc3OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBpcGVsaW5lQmluZFBvaW50PC9jb2RlPiBpcyA8Y29kZT5WS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTPC9jb2RlPiwgdGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtMDA3NzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gaXMgPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFPC9jb2RlPiwgPGNvZGU+cGlwZWxpbmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgY29tcHV0ZSBwaXBlbGluZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtMDA3ODAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gaXMgPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4sIDxjb2RlPnBpcGVsaW5lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIGdyYXBoaWNzIHBpcGVsaW5lIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZS0wMDc4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlXCI+dmFyaWFibGUgbXVsdGlzYW1wbGUgcmF0ZTwvYT4gZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLCA8Y29kZT5waXBlbGluZTwvY29kZT4gaXMgYSBncmFwaGljcyBwaXBlbGluZSwgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgbm8gYXR0YWNobWVudHMsIGFuZCB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHdpdGggYSBncmFwaGljcyBwaXBlbGluZSBhZnRlciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBjdXJyZW50IHN1YnBhc3MsIHRoZW4gdGhlIHNhbXBsZSBjb3VudCBzcGVjaWZpZWQgYnkgdGhpcyBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGF0IHNldCBpbiB0aGUgcHJldmlvdXMgcGlwZWxpbmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFBpcGVsaW5lLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVCaW5kUG9pbnRcIj5Wa1BpcGVsaW5lQmluZFBvaW50PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGlwZWxpbmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lXCI+VmtQaXBlbGluZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFBpcGVsaW5lLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFBpcGVsaW5lLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5waXBlbGluZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS12YXJpYWJsZVNhbXBsZUxvY2F0aW9ucy0wMTUyNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVDwvYT46Ojxjb2RlPnZhcmlhYmxlU2FtcGxlTG9jYXRpb25zPC9jb2RlPiBpcyA8Y29kZT5WS19GQUxTRTwvY29kZT4sIGFuZCA8Y29kZT5waXBlbGluZTwvY29kZT4gaXMgYSBncmFwaGljcyBwaXBlbGluZSBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUgaGF2aW5nIGl0cyA8Y29kZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L2NvZGU+IG1lbWJlciBzZXQgdG8gPGNvZGU+VktfVFJVRTwvY29kZT4gYnV0IHdpdGhvdXQgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVDwvY29kZT4gZW5hYmxlZCB0aGVuIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIGluc3RhbmNlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBiZWd1biBieSBzcGVjaWZ5aW5nIGEgPGEgaHJlZj1cIiNWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFRcIj5Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQ8L2E+IHN0cnVjdHVyZSB3aG9zZSA8Y29kZT5wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnM8L2NvZGU+IG1lbWJlciBjb250YWlucyBhbiBlbGVtZW50IHdpdGggYSA8Y29kZT5zdWJwYXNzSW5kZXg8L2NvZGU+IG1hdGNoaW5nIHRoZSBjdXJyZW50IHN1YnBhc3MgaW5kZXggYW5kIHRoZSA8Y29kZT5zYW1wbGVMb2NhdGlvbnNJbmZvPC9jb2RlPiBtZW1iZXIgb2YgdGhhdCBlbGVtZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG1hdGNoIHRoZSA8Y29kZT5zYW1wbGVMb2NhdGlvbnNJbmZvPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVDwvYT4gd2hlbiB0aGUgcGlwZWxpbmUgd2FzIGNyZWF0ZWQiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1Ob25lLTAyMzIzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSByZWNvcmRlZCB3aGVuIHRyYW5zZm9ybSBmZWVkYmFjayBpcyBhY3RpdmUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtMDIzOTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gaXMgPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVjwvY29kZT4sIHRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtMDIzOTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gaXMgPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVjwvY29kZT4sIHRoZSA8Y29kZT5waXBlbGluZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSByYXkgdHJhY2luZyBwaXBlbGluZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3BpcGVsaW5lX2V4ZWN1dGFibGVfcHJvcGVydGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUi1waXBlbGluZUV4ZWN1dGFibGVJbmZvLTAzMjcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGEgaHJlZj1cIiNmZWF0dXJlcy1waXBlbGluZUV4ZWN1dGFibGVJbmZvXCI+PGNvZGU+cGlwZWxpbmVFeGVjdXRhYmxlSW5mbzwvY29kZT48L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcGlwZWxpbmUtMDMyNzEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBQaXBlbGluZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+ZGV2aWNlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcFBpcGVsaW5lSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUGlwZWxpbmVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVJbmZvS0hSXCI+VmtQaXBlbGluZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXBFeGVjdXRhYmxlQ291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEV4ZWN1dGFibGVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cEV4ZWN1dGFibGVDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wRXhlY3V0YWJsZUNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUlwiPlZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUluZm9LSFItcGlwZWxpbmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGlwZWxpbmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lXCI+VmtQaXBlbGluZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIjogeworICAgICAgIihWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIiOiB7CisgICAgICAiKFZLX0tIUl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFItcGlwZWxpbmVFeGVjdXRhYmxlSW5mby0wMzI3MiIsCisgICAgICAgICAgInRleHQiOiAiIDxhIGhyZWY9XCIjZmVhdHVyZXMtcGlwZWxpbmVFeGVjdXRhYmxlSW5mb1wiPjxjb2RlPnBpcGVsaW5lRXhlY3V0YWJsZUluZm88L2NvZGU+PC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSLXBpcGVsaW5lLTAzMjczIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGlwZWxpbmU8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wRXhlY3V0YWJsZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+ZGV2aWNlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1waXBlbGluZS0wMzI3NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cEV4ZWN1dGFibGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9DQVBUVVJFX1NUQVRJU1RJQ1NfQklUX0tIUjwvY29kZT4gc2V0IGluIHRoZSA8Y29kZT5mbGFnczwvY29kZT4gZmllbGQgb2YgPGEgaHJlZj1cIiNWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvXCI+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvYT4gb3IgPGEgaHJlZj1cIiNWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm9cIj5Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm88L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1wRXhlY3V0YWJsZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEV4ZWN1dGFibGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUlwiPlZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFItcFN0YXRpc3RpY0NvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdGF0aXN0aWNDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFItcFN0YXRpc3RpY3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFN0YXRpc3RpY0NvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wU3RhdGlzdGljczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wU3RhdGlzdGljczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBTdGF0aXN0aWNDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUlwiPlZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLWV4ZWN1dGFibGVJbmRleC0wMzI3NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmV4ZWN1dGFibGVJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgZXhlY3V0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPnBpcGVsaW5lPC9jb2RlPiBhcyByZXR1cm5lZCBpbiB0aGUgPGNvZGU+cEV4ZWN1dGFibGVDb3VudDwvY29kZT4gcGFyYW1ldGVyIG9mIDxjb2RlPnZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLXBpcGVsaW5lLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZVwiPlZrUGlwZWxpbmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIjogeworICAgICAgIihWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSIjogeworICAgICAgIihWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUi1waXBlbGluZUV4ZWN1dGFibGVJbmZvLTAzMjc2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGEgaHJlZj1cIiNmZWF0dXJlcy1waXBlbGluZUV4ZWN1dGFibGVJbmZvXCI+PGNvZGU+cGlwZWxpbmVFeGVjdXRhYmxlSW5mbzwvY29kZT48L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSLXBpcGVsaW5lLTAzMjc3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGlwZWxpbmU8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wRXhlY3V0YWJsZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+ZGV2aWNlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcGlwZWxpbmUtMDMyNzgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBFeGVjdXRhYmxlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19QSVBFTElORV9DUkVBVEVfQ0FQVFVSRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTlNfQklUX0tIUjwvY29kZT4gc2V0IGluIHRoZSA8Y29kZT5mbGFnczwvY29kZT4gZmllbGQgb2YgPGEgaHJlZj1cIiNWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvXCI+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvYT4gb3IgPGEgaHJlZj1cIiNWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm9cIj5Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm88L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSLXBFeGVjdXRhYmxlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRXhlY3V0YWJsZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSXCI+VmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcEludGVybmFsUmVwcmVzZW50YXRpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBJbnRlcm5hbFJlcHJlc2VudGF0aW9uczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wSW50ZXJuYWxSZXByZXNlbnRhdGlvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUlwiPlZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiI6IHsKKyAgICAgICIoVktfS0hSX3BpcGVsaW5lX2V4ZWN1dGFibGVfcHJvcGVydGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lOVEVSTkFMX1JFUFJFU0VOVEFUSU9OX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0U2hhZGVySW5mb0FNRCI6IHsKKyAgICAgICIoVktfQU1EX3NoYWRlcl9pbmZvKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1waXBlbGluZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVcIj5Wa1BpcGVsaW5lPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1zaGFkZXJTdGFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zaGFkZXJTdGFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2hhZGVyU3RhZ2VGbGFnQml0c1wiPlZrU2hhZGVyU3RhZ2VGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1pbmZvVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbmZvVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2hhZGVySW5mb1R5cGVBTURcIj5Wa1NoYWRlckluZm9UeXBlQU1EPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELXBJbmZvU2l6ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW5mb1NpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnNpemVfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1wSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wSW5mb1NpemU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBJbmZvPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cEluZm9TaXplPC9jb2RlPiBieXRlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELXBpcGVsaW5lLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQiOiB7CisgICAgICAiKFZLX0FNRF9waXBlbGluZV9jb21waWxlcl9jb250cm9sKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRC1jb21waWxlckNvbnRyb2xGbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbXBpbGVyQ29udHJvbEZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLWZsYWdzLTAyNDAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPmZsYWdzPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cENyZWF0ZUluZm9zPC9jb2RlPiBjb250YWlucyB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUPC9jb2RlPiBmbGFnLCBhbmQgdGhlIDxjb2RlPmJhc2VQaXBlbGluZUluZGV4PC9jb2RlPiBtZW1iZXIgb2YgdGhhdCBzYW1lIGVsZW1lbnQgaXMgbm90IDxjb2RlPi0xPC9jb2RlPiwgPGNvZGU+YmFzZVBpcGVsaW5lSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgaW5kZXggaW50byA8Y29kZT5wQ3JlYXRlSW5mb3M8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhhdCBlbGVtZW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1mbGFncy0wMjQwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5mbGFnczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gY29udGFpbnMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVDwvY29kZT4gZmxhZywgdGhlIGJhc2UgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0FMTE9XX0RFUklWQVRJVkVTX0JJVDwvY29kZT4gZmxhZyBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLXBpcGVsaW5lQ2FjaGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cGlwZWxpbmVDYWNoZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPnBpcGVsaW5lQ2FjaGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ2FjaGVcIj5Wa1BpcGVsaW5lQ2FjaGU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtcENyZWF0ZUluZm9zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmNyZWF0ZUluZm9Db3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVlwiPlZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtcFBpcGVsaW5lcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUGlwZWxpbmVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+Y3JlYXRlSW5mb0NvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVcIj5Wa1BpcGVsaW5lPC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1jcmVhdGVJbmZvQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jcmVhdGVJbmZvQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtcGlwZWxpbmVDYWNoZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUNhY2hlPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWZsYWdzLTAyNDA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIHRoZSA8Y29kZT5WS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQ8L2NvZGU+IGZsYWcsIGFuZCA8Y29kZT5iYXNlUGlwZWxpbmVJbmRleDwvY29kZT4gaXMgPGNvZGU+LTE8L2NvZGU+LCA8Y29kZT5iYXNlUGlwZWxpbmVIYW5kbGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgaGFuZGxlIHRvIGEgcmF5IHRyYWNpbmcgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWZsYWdzLTAyNDA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIHRoZSA8Y29kZT5WS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQ8L2NvZGU+IGZsYWcsIGFuZCA8Y29kZT5iYXNlUGlwZWxpbmVIYW5kbGU8L2NvZGU+IGlzIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmJhc2VQaXBlbGluZUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGluZGV4IGludG8gdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnBDcmVhdGVJbmZvczwvY29kZT4gcGFyYW1ldGVyIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1mbGFncy0wMjQwNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyB0aGUgPGNvZGU+VktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUPC9jb2RlPiBmbGFnLCBhbmQgPGNvZGU+YmFzZVBpcGVsaW5lSW5kZXg8L2NvZGU+IGlzIG5vdCA8Y29kZT4tMTwvY29kZT4sIDxjb2RlPmJhc2VQaXBlbGluZUhhbmRsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtZmxhZ3MtMDI0MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgdGhlIDxjb2RlPlZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVDwvY29kZT4gZmxhZywgYW5kIDxjb2RlPmJhc2VQaXBlbGluZUhhbmRsZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmJhc2VQaXBlbGluZUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4tMTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLXN0YWdlLTAyNDA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnN0YWdlPC9jb2RlPiBtZW1iZXIgb2Ygb25lIGVsZW1lbnQgb2YgPGNvZGU+cFN0YWdlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1wU3RhZ2VzLTAyNDA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHNoYWRlciBjb2RlIGZvciB0aGUgZW50cnkgcG9pbnRzIGlkZW50aWZpZWQgYnkgPGNvZGU+cFN0YWdlczwvY29kZT4sIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RhdGUgaWRlbnRpZmllZCBieSB0aGlzIHN0cnVjdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhZGhlcmUgdG8gdGhlIHBpcGVsaW5lIGxpbmtpbmcgcnVsZXMgZGVzY3JpYmVkIGluIHRoZSA8YSBocmVmPVwiI2ludGVyZmFjZXNcIj5TaGFkZXIgSW50ZXJmYWNlczwvYT4gY2hhcHRlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtbGF5b3V0LTAyNDEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLXBpcGVsaW5lbGF5b3V0LWNvbnNpc3RlbmN5XCI+Y29uc2lzdGVudDwvYT4gd2l0aCBhbGwgc2hhZGVycyBzcGVjaWZpZWQgaW4gPGNvZGU+cFN0YWdlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWxheW91dC0wMjQxMSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGluIDxjb2RlPmxheW91dDwvY29kZT4gYWNjZXNzaWJsZSB0byBlYWNoIHNoYWRlciBzdGFnZSB0aGF0IGlzIHVzZWQgYnkgdGhlIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VMaW1pdHNcIj5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9hPjo6PGNvZGU+bWF4UGVyU3RhZ2VSZXNvdXJjZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1tYXhSZWN1cnNpb25EZXB0aC0wMjQxMiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1heFJlY3Vyc2lvbkRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVlwiPlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPC9hPjo6PGNvZGU+bWF4UmVjdXJzaW9uRGVwdGg8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19QSVBFTElORV9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHNcIj5Wa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtcFN0YWdlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3RhZ2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c3RhZ2VDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvXCI+VmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtcEdyb3Vwcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wR3JvdXBzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+Z3JvdXBDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVlwiPlZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1sYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUxheW91dFwiPlZrUGlwZWxpbmVMYXlvdXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtc3RhZ2VDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0YWdlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtZ3JvdXBDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmdyb3VwQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5iYXNlUGlwZWxpbmVIYW5kbGU8L2NvZGU+LCBhbmQgPGNvZGU+bGF5b3V0PC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXR5cGUtMDI0MTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT50eXBlPC9jb2RlPiBpcyA8Y29kZT5WS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WPC9jb2RlPiB0aGVuIDxjb2RlPmdlbmVyYWxTaGFkZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgaW5kZXggaW50byA8Y29kZT5wU3RhZ2VzPC9jb2RlPiByZWZlcnJpbmcgdG8gYSBzaGFkZXIgb2YgPGNvZGU+VktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlY8L2NvZGU+LCA8Y29kZT5WS19TSEFERVJfU1RBR0VfTUlTU19CSVRfTlY8L2NvZGU+LCBvciA8Y29kZT5WS19TSEFERVJfU1RBR0VfQ0FMTEFCTEVfQklUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY8L2NvZGU+IHRoZW4gPGNvZGU+Y2xvc2VzdEhpdFNoYWRlcjwvY29kZT4sIDxjb2RlPmFueUhpdFNoYWRlcjwvY29kZT4sIGFuZCA8Y29kZT5pbnRlcnNlY3Rpb25TaGFkZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NIQURFUl9VTlVTRURfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi10eXBlLTAyNDE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dHlwZTwvY29kZT4gaXMgPGNvZGU+VktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfUFJPQ0VEVVJBTF9ISVRfR1JPVVBfTlY8L2NvZGU+IHRoZW4gPGNvZGU+aW50ZXJzZWN0aW9uU2hhZGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGluZGV4IGludG8gPGNvZGU+cFN0YWdlczwvY29kZT4gcmVmZXJyaW5nIHRvIGEgc2hhZGVyIG9mIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9JTlRFUlNFQ1RJT05fQklUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1RSSUFOR0xFU19ISVRfR1JPVVBfTlY8L2NvZGU+IHRoZW4gPGNvZGU+aW50ZXJzZWN0aW9uU2hhZGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TSEFERVJfVU5VU0VEX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtY2xvc2VzdEhpdFNoYWRlci0wMjQxNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNsb3Nlc3RIaXRTaGFkZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5WS19TSEFERVJfVU5VU0VEX05WPC9jb2RlPiBvciBhIHZhbGlkIGluZGV4IGludG8gPGNvZGU+cFN0YWdlczwvY29kZT4gcmVmZXJyaW5nIHRvIGEgc2hhZGVyIG9mIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi1hbnlIaXRTaGFkZXItMDI0MTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hbnlIaXRTaGFkZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5WS19TSEFERVJfVU5VU0VEX05WPC9jb2RlPiBvciBhIHZhbGlkIGluZGV4IGludG8gPGNvZGU+cFN0YWdlczwvY29kZT4gcmVmZXJyaW5nIHRvIGEgc2hhZGVyIG9mIDxjb2RlPlZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi10eXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOVlwiPlZrUmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLWZpcnN0R3JvdXAtMDI0MTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPmZpcnN0R3JvdXA8L2NvZGU+IGFuZCA8Y29kZT5ncm91cENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBzaGFkZXIgZ3JvdXBzIGluIDxjb2RlPnBpcGVsaW5lPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLWRhdGFTaXplLTAyNDIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGF0YVNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGF0IGxlYXN0IDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvY29kZT46Ojxjb2RlPnNoYWRlckdyb3VwSGFuZGxlU2l6ZTwvY29kZT4ge3RpbWVzfSA8Y29kZT5ncm91cENvdW50PC9jb2RlPjwvc3Bhbj4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLXBpcGVsaW5lLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZVwiPlZrUGlwZWxpbmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYtcERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cERhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gYnl0ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLWRhdGFTaXplLWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGF0YVNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYtcGlwZWxpbmUtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGlwZWxpbmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NvbXBpbGVEZWZlcnJlZE5WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ29tcGlsZURlZmVycmVkTlYtcGlwZWxpbmUtMDIyMzciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19QSVBFTElORV9DUkVBVEVfREVGRVJfQ09NUElMRV9CSVRfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NvbXBpbGVEZWZlcnJlZE5WLXNoYWRlci0wMjIzOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNoYWRlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYmVlbiBjYWxsZWQgYXMgYSBkZWZlcnJlZCBjb21waWxlIGJlZm9yZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDb21waWxlRGVmZXJyZWROVi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NvbXBpbGVEZWZlcnJlZE5WLXBpcGVsaW5lLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZVwiPlZrUGlwZWxpbmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDb21waWxlRGVmZXJyZWROVi1waXBlbGluZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3BpcGVsaW5lX2NyZWF0aW9uX2ZlZWRiYWNrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQtMDI2NjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBXaGVuIGNoYWluZWQgdG8gPGEgaHJlZj1cIiNWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvXCI+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvYT4sIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFRcIj5Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVDwvYT46Ojxjb2RlPnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mb1wiPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5zdGFnZUNvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQtMDI2NjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBXaGVuIGNoYWluZWQgdG8gPGEgaHJlZj1cIiNWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm9cIj5Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm88L2E+LCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUXCI+VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQ8L2E+Ojo8Y29kZT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCAxIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVFwiPlZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1wUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUXCI+VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQ8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfcGlwZWxpbmVfY3JlYXRpb25fZmVlZGJhY2spKyhWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50LTAyNjcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgV2hlbiBjaGFpbmVkIHRvIDxhIGhyZWY9XCIjVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlZcIj5Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVjwvYT4sIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFRcIj5Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVDwvYT46Ojxjb2RlPnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlZcIj5Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVjwvYT46Ojxjb2RlPnN0YWdlQ291bnQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGZuQWxsb2NhdGlvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgdXNlci1kZWZpbmVkIDxhIGhyZWY9XCIjUEZOX3ZrQWxsb2NhdGlvbkZ1bmN0aW9uXCI+UEZOX3ZrQWxsb2NhdGlvbkZ1bmN0aW9uPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBmblJlYWxsb2NhdGlvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgdXNlci1kZWZpbmVkIDxhIGhyZWY9XCIjUEZOX3ZrUmVhbGxvY2F0aW9uRnVuY3Rpb25cIj5QRk5fdmtSZWFsbG9jYXRpb25GdW5jdGlvbjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGZuRnJlZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgdXNlci1kZWZpbmVkIDxhIGhyZWY9XCIjUEZOX3ZrRnJlZUZ1bmN0aW9uXCI+UEZOX3ZrRnJlZUZ1bmN0aW9uPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciBvZiA8Y29kZT5wZm5JbnRlcm5hbEFsbG9jYXRpb248L2NvZGU+IG9yIDxjb2RlPnBmbkludGVybmFsRnJlZTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCBib3RoIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGNhbGxiYWNrcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMtcE1lbW9yeVByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE1lbW9yeVByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMi1wTWVtb3J5UHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTWVtb3J5UHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJcIj5Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUIjogeworICAgICAgIihWS19FWFRfbWVtb3J5X2J1ZGdldCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfQlVER0VUX1BST1BFUlRJRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQWxsb2NhdGVNZW1vcnkiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1wQWxsb2NhdGVJbmZvLTAxNzEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEFsbG9jYXRlSW5mbzwvY29kZT4tJmd0O2FsbG9jYXRpb25TaXplIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzXCI+VmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM8L2E+Ojo8Y29kZT5tZW1vcnlIZWFwczwvY29kZT5bbWVtaW5kZXhdLnNpemUgd2hlcmUgPGNvZGU+bWVtaW5kZXg8L2NvZGU+ID0gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllc1wiPlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzPC9hPjo6PGNvZGU+bWVtb3J5VHlwZXM8L2NvZGU+W3BBbGxvY2F0ZUluZm8tJmd0O21lbW9yeVR5cGVJbmRleF0uaGVhcEluZGV4IGFzIHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXNcIj52a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczwvYT4gZm9yIHRoZSA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiB0aGF0IDxjb2RlPmRldmljZTwvY29kZT4gd2FzIGNyZWF0ZWQgZnJvbS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWxsb2NhdGVNZW1vcnktcEFsbG9jYXRlSW5mby0wMTcxNCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBBbGxvY2F0ZUluZm88L2NvZGU+LSZndDttZW1vcnlUeXBlSW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczwvYT46Ojxjb2RlPm1lbW9yeVR5cGVDb3VudDwvY29kZT4gYXMgcmV0dXJuZWQgYnkgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllc1wiPnZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzPC9hPiBmb3IgdGhlIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IHRoYXQgPGNvZGU+ZGV2aWNlPC9jb2RlPiB3YXMgY3JlYXRlZCBmcm9tLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FsbG9jYXRlTWVtb3J5LXBBbGxvY2F0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEFsbG9jYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa01lbW9yeUFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5QWxsb2NhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWxsb2NhdGVNZW1vcnktcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWxsb2NhdGVNZW1vcnktcE1lbW9yeS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfQU1EX2RldmljZV9jb2hlcmVudF9tZW1vcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FsbG9jYXRlTWVtb3J5LWRldmljZUNvaGVyZW50TWVtb3J5LTAyNzkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZGV2aWNlQ29oZXJlbnRNZW1vcnlcIj48Y29kZT5kZXZpY2VDb2hlcmVudE1lbW9yeTwvY29kZT48L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnBBbGxvY2F0ZUluZm88L2NvZGU+LSZndDttZW1vcnlUeXBlSW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGlkZW50aWZ5IGEgbWVtb3J5IHR5cGUgc3VwcG9ydGluZyA8Y29kZT5WS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0NPSEVSRU5UX0JJVF9BTUQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNZW1vcnlBbGxvY2F0ZUluZm8iOiB7CisgICAgICAiIShWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAwNjM4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YWxsb2NhdGlvblNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX21lbW9yeSkrKFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbixWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAwNjM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgICAgIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8Y29kZT5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzwvY29kZT4gICAgIHN0cnVjdHVyZSwgYW5kIGFueSBvZiB0aGUgaGFuZGxlIHR5cGVzIHNwZWNpZmllZCBpbiAgICAgPGNvZGU+VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+Ojo8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gcmVxdWlyZSBhIGRlZGljYXRlZCAgICAgYWxsb2NhdGlvbiwgYXMgcmVwb3J0ZWQgYnkgICAgIDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJcIj52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvYT4gaW4gICAgIDxjb2RlPlZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM8L2NvZGU+Ojo8Y29kZT5leHRlcm5hbE1lbW9yeVByb3BlcnRpZXMuZXh0ZXJuYWxNZW1vcnlGZWF0dXJlczwvY29kZT4gICAgIG9yICAgICA8Y29kZT5Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczwvY29kZT46Ojxjb2RlPmV4dGVybmFsTWVtb3J5UHJvcGVydGllcy5leHRlcm5hbE1lbW9yeUZlYXR1cmVzPC9jb2RlPiwgICAgIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gbXVzdCBpbmNsdWRlIGEgaWZkZWY6OlZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbls8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+XSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX21lbW9yeSkrKFZLX05WX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAwNjQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzwvYT4gc3RydWN0dXJlLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVlwiPlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlY8L2E+IG9yIDxhIGhyZWY9XCIjVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVlwiPlZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY8L2E+IHN0cnVjdHVyZS4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIrVktfTlZfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDA2NDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUlwiPlZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIGEgPGEgaHJlZj1cIiNWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WXCI+VmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVjwvYT4gc3RydWN0dXJlLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAxNzQyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgc3BlY2lmaWVkIHdhcyBjcmVhdGVkIGJ5IHRoZSBWdWxrYW4gQVBJLCBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIGlzIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUjwvY29kZT4sIHRoZW4gdGhlIHZhbHVlcyBvZiA8Y29kZT5hbGxvY2F0aW9uU2l6ZTwvY29kZT4gYW5kIDxjb2RlPm1lbW9yeVR5cGVJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2ggdGhvc2Ugc3BlY2lmaWVkIHdoZW4gdGhlIG1lbW9yeSBvYmplY3QgYmVpbmcgaW1wb3J0ZWQgd2FzIGNyZWF0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1tZW1vcnlUeXBlSW5kZXgtMDA2NDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSBpcyBhIFBPU0lYIGZpbGUgZGVzY3JpcHRvciBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFZ1bGthbiBBUEksIHRoZSB2YWx1ZSBvZiA8Y29kZT5tZW1vcnlUeXBlSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZSBvZiB0aG9zZSByZXR1cm5lZCBieSA8YSBocmVmPVwiI3ZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSXCI+dmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFI8L2E+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX21lbW9yeStWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tTm9uZS0wMDY0MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHNwZWNpZmllZCB3YXMgY3JlYXRlZCBieSB0aGUgVnVsa2FuIEFQSSwgdGhlIGRldmljZSBtYXNrIHNwZWNpZmllZCBieSA8YSBocmVmPVwiI1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm9cIj5Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGF0IHNwZWNpZmllZCB3aGVuIHRoZSBtZW1vcnkgb2JqZWN0IGJlaW5nIGltcG9ydGVkIHdhcyBhbGxvY2F0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1Ob25lLTAwNjQ0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgc3BlY2lmaWVkIHdhcyBjcmVhdGVkIGJ5IHRoZSBWdWxrYW4gQVBJLCB0aGUgbGlzdCBvZiBwaHlzaWNhbCBkZXZpY2VzIHRoYXQgY29tcHJpc2UgdGhlIGxvZ2ljYWwgZGV2aWNlIHBhc3NlZCB0byA8YSBocmVmPVwiI3ZrQWxsb2NhdGVNZW1vcnlcIj52a0FsbG9jYXRlTWVtb3J5PC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGUgbGlzdCBvZiBwaHlzaWNhbCBkZXZpY2VzIHRoYXQgY29tcHJpc2UgdGhlIGxvZ2ljYWwgZGV2aWNlIG9uIHdoaWNoIHRoZSBtZW1vcnkgd2FzIG9yaWdpbmFsbHkgYWxsb2NhdGVkLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX21lbW9yeV93aW4zMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW1lbW9yeVR5cGVJbmRleC0wMDY0NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGFuIE5UIGhhbmRsZSBvciBhIGdsb2JhbCBzaGFyZSBoYW5kbGUgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBWdWxrYW4gQVBJLCB0aGUgdmFsdWUgb2YgPGNvZGU+bWVtb3J5VHlwZUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBvbmUgb2YgdGhvc2UgcmV0dXJuZWQgYnkgPGEgaHJlZj1cIiN2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUlwiPnZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAxNzQzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgd2FzIGNyZWF0ZWQgYnkgdGhlIFZ1bGthbiBBUEksIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHR5cGUgaXMgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfS0hSPC9jb2RlPiBvciA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfS0hSPC9jb2RlPiwgdGhlbiB0aGUgdmFsdWVzIG9mIDxjb2RlPmFsbG9jYXRpb25TaXplPC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5VHlwZUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgd2hlbiB0aGUgbWVtb3J5IG9iamVjdCBiZWluZyBpbXBvcnRlZCB3YXMgY3JlYXRlZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAwNjQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBpcyA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQ8L2NvZGU+LCA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9LTVRfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVDwvY29kZT4sIDxjb2RlPmFsbG9jYXRpb25TaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGUgc2l6ZSByZXBvcnRlZCBpbiB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBvZiB0aGUgPGNvZGU+aW1hZ2U8L2NvZGU+IG9yIDxjb2RlPmJ1ZmZlcjwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjwvY29kZT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1hbGxvY2F0aW9uU2l6ZS0wMDY0NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHR5cGUgaXMgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX0hFQVBfQklUPC9jb2RlPiwgPGNvZGU+YWxsb2NhdGlvblNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG1hdGNoIHRoZSBzaXplIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBEaXJlY3QzRCAxMiBoZWFwIGZyb20gd2hpY2ggdGhlIGV4dGVybmFsIGhhbmRsZSB3YXMgZXh0cmFjdGVkLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1tZW1vcnlUeXBlSW5kZXgtMDE4NzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcHJvdGVjdGVkIG1lbW9yeSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB0aGUgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+Ojo8Y29kZT5tZW1vcnlUeXBlSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmRpY2F0ZSBhIG1lbW9yeSB0eXBlIHRoYXQgcmVwb3J0cyA8Y29kZT5WS19NRU1PUllfUFJPUEVSVFlfUFJPVEVDVEVEX0JJVDwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1tZW1vcnlUeXBlSW5kZXgtMDE3NDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSBpcyBhIGhvc3QgcG9pbnRlciwgdGhlIHZhbHVlIG9mIDxjb2RlPm1lbW9yeVR5cGVJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgb25lIG9mIHRob3NlIHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFRcIj52a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAxNzQ1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgaXMgYSBob3N0IHBvaW50ZXIsIDxjb2RlPmFsbG9jYXRpb25TaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9leHRlcm5hbF9tZW1vcnlfaG9zdCkrKFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDI4MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSBpcyBhIGhvc3QgcG9pbnRlciwgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlZcIj5Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjwvYT4gc3RydWN0dXJlIHdpdGggZWl0aGVyIGl0cyA8Y29kZT5pbWFnZTwvY29kZT4gb3IgPGNvZGU+YnVmZmVyPC9jb2RlPiBmaWVsZCBzZXQgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QpKyhWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjgwNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGEgaG9zdCBwb2ludGVyLCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUgd2l0aCBlaXRoZXIgaXRzIDxjb2RlPmltYWdlPC9jb2RlPiBvciA8Y29kZT5idWZmZXI8L2NvZGU+IGZpZWxkIHNldCB0byBhIHZhbHVlIG90aGVyIHRoYW4gPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDIzODMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIGlzIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRDwvY29kZT4sIDxjb2RlPmFsbG9jYXRpb25TaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB0aGUgc2l6ZSByZXR1cm5lZCBieSA8YSBocmVmPVwiI3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSURcIj52a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEPC9hPiBmb3IgdGhlIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIGlzIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRDwvY29kZT4sIGFuZCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGRvZXMgbm90IGluY2x1ZGUgYSA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+IHN0cnVjdHVyZSBvciA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+Ojo8Y29kZT5pbWFnZTwvY29kZT4gaXMgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgdGhlIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8Y29kZT5BSGFyZHdhcmVCdWZmZXJfRGVzYzwvY29kZT46Ojxjb2RlPmZvcm1hdDwvY29kZT4gb2YgPGNvZGU+QUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9CTE9CPC9jb2RlPiBhbmQgYSA8Y29kZT5BSGFyZHdhcmVCdWZmZXJfRGVzYzwvY29kZT46Ojxjb2RlPnVzYWdlPC9jb2RlPiB0aGF0IGluY2x1ZGVzIDxjb2RlPkFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfREFUQV9CVUZGRVI8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tbWVtb3J5VHlwZUluZGV4LTAyMzg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBpcyA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQ8L2NvZGU+LCA8Y29kZT5tZW1vcnlUeXBlSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZSBvZiB0aG9zZSByZXR1cm5lZCBieSA8YSBocmVmPVwiI3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSURcIj52a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEPC9hPiBmb3IgdGhlIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDE4NzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcGFyYW1ldGVycyBkbyBub3QgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24sIGFuZCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGNvZGU+VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSB3aXRoIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRDwvY29kZT4gaW5jbHVkZWQgaW4gaXRzIDxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBtZW1iZXIsIGFuZCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUgd2l0aCA8Y29kZT5pbWFnZTwvY29kZT4gbm90IGVxdWFsIHRvIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZW4gPGNvZGU+YWxsb2NhdGlvblNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+LCBvdGhlcndpc2UgPGNvZGU+YWxsb2NhdGlvblNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgaXMgYW4gQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIsIGFuZCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiB3aXRoIDxjb2RlPmltYWdlPC9jb2RlPiB0aGF0IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXImIzgyMTc7cyA8YSBocmVmPVwiI0FIYXJkd2FyZUJ1ZmZlclwiPkFIYXJkd2FyZUJ1ZmZlcjwvYT46Ojxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIGF0IGxlYXN0IG9uZSBvZiA8Y29kZT5BSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVDwvY29kZT4gb3IgPGNvZGU+QUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgaXMgYW4gQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIsIGFuZCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiB3aXRoIDxjb2RlPmltYWdlPC9jb2RlPiB0aGF0IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCB0aGUgZm9ybWF0IG9mIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GT1JNQVRfVU5ERUZJTkVEPC9jb2RlPiBvciB0aGUgZm9ybWF0IHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRFwiPnZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ8L2E+IGluIDxhIGhyZWY9XCIjVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRFwiPlZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQ8L2E+Ojo8Y29kZT5mb3JtYXQ8L2NvZGU+IGZvciB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjM4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGFuIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyLCBhbmQgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT4gc3RydWN0dXJlIHdpdGggPGNvZGU+aW1hZ2U8L2NvZGU+IHRoYXQgaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZSB3aWR0aCwgaGVpZ2h0LCBhbmQgYXJyYXkgbGF5ZXIgZGltZW5zaW9ucyBvZiA8Y29kZT5pbWFnZTwvY29kZT4gYW5kIHRoZSBBbmRyb2lkIGhhcmR3YXJlIGJ1ZmZlciYjODIxNztzIDxjb2RlPkFIYXJkd2FyZUJ1ZmZlcl9EZXNjPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpZGVudGljYWwuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjM4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGFuIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyLCBhbmQgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT4gc3RydWN0dXJlIHdpdGggPGNvZGU+aW1hZ2U8L2NvZGU+IHRoYXQgaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIGFuZCB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXImIzgyMTc7cyA8YSBocmVmPVwiI0FIYXJkd2FyZUJ1ZmZlclwiPkFIYXJkd2FyZUJ1ZmZlcjwvYT46Ojxjb2RlPnVzYWdlPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5BSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURTwvY29kZT4sIHRoZSA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIGNvbXBsZXRlIG1pcG1hcCBjaGFpbi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyNTg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgaXMgYW4gQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIsIGFuZCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUgd2l0aCA8Y29kZT5pbWFnZTwvY29kZT4gdGhhdCBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgYW5kIHRoZSBBbmRyb2lkIGhhcmR3YXJlIGJ1ZmZlciYjODIxNztzIDxhIGhyZWY9XCIjQUhhcmR3YXJlQnVmZmVyXCI+QUhhcmR3YXJlQnVmZmVyPC9hPjo6PGNvZGU+dXNhZ2U8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+QUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9NSVBNQVBfQ09NUExFVEU8L2NvZGU+LCB0aGUgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgZXhhY3RseSBvbmUgbWlwbWFwIGxldmVsLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzOTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiwgdGhlIGV4dGVybmFsIGhhbmRsZSBpcyBhbiBBbmRyb2lkIGhhcmR3YXJlIGJ1ZmZlciwgYW5kIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+IHN0cnVjdHVyZSB3aXRoIDxjb2RlPmltYWdlPC9jb2RlPiB0aGF0IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCBlYWNoIGJpdCBzZXQgaW4gdGhlIHVzYWdlIG9mIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsaXN0ZWQgaW4gPGEgaHJlZj1cIiNtZW1vcnktZXh0ZXJuYWwtYW5kcm9pZC1oYXJkd2FyZS1idWZmZXItdXNhZ2VcIj5BSGFyZHdhcmVCdWZmZXIgVXNhZ2UgRXF1aXZhbGVuY2U8L2E+LCBhbmQgaWYgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIDxjb2RlPkFIQVJEV0FSRUJVRkZFUl9VU0FHRTwvY29kZT4gYml0IGxpc3RlZCB0aGF0IGJpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbmNsdWRlZCBpbiB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXImIzgyMTc7cyA8Y29kZT5BSGFyZHdhcmVCdWZmZXJfRGVzYzwvY29kZT46Ojxjb2RlPnVzYWdlPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1vcGFxdWVDYXB0dXJlQWRkcmVzcy0wMzMyOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUlwiPlZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFI8L2E+Ojo8Y29kZT5vcGFxdWVDYXB0dXJlQWRkcmVzczwvY29kZT4gaXMgbm90IHplcm8sIDxjb2RlPlZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm88L2NvZGU+Ojo8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSA8Y29kZT5WS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWZsYWdzLTAzMzMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzwvY29kZT46Ojxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUjwvY29kZT4sIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5XCI+YnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXk8L2E+IGZlYXR1cmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tZmxhZ3MtMDMzMzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvPC9jb2RlPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19CSVRfS0hSPC9jb2RlPiwgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtYnVmZmVyRGV2aWNlQWRkcmVzc1wiPmJ1ZmZlckRldmljZUFkZHJlc3M8L2E+IGZlYXR1cmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tb3BhcXVlQ2FwdHVyZUFkZHJlc3MtMDMzMzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiwgPGEgaHJlZj1cIiNWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSXCI+VmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUjwvYT46Ojxjb2RlPm9wYXF1ZUNhcHR1cmVBZGRyZXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzKSsoVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDMzMzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGNvZGU+VmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ8L2NvZGU+IHN0cnVjdHVyZSwgPGEgaHJlZj1cIiNWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSXCI+VmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUjwvYT46Ojxjb2RlPm9wYXF1ZUNhcHR1cmVBZGRyZXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnBOZXh0PC9jb2RlPiBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WXCI+VmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlY8L2E+LCA8YSBocmVmPVwiI1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvXCI+VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm88L2E+LCA8YSBocmVmPVwiI1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlZcIj5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WPC9hPiwgPGEgaHJlZj1cIiNWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUlwiPlZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSPC9hPiwgPGEgaHJlZj1cIiNWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WXCI+VmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVjwvYT4sIDxhIGhyZWY9XCIjVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRFwiPlZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ8L2E+LCA8YSBocmVmPVwiI1ZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSXCI+VmtJbXBvcnRNZW1vcnlGZEluZm9LSFI8L2E+LCA8YSBocmVmPVwiI1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUXCI+VmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ8L2E+LCA8YSBocmVmPVwiI1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSXCI+VmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFI8L2E+LCA8YSBocmVmPVwiI1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlZcIj5Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WPC9hPiwgPGEgaHJlZj1cIiNWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvXCI+VmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzwvYT4sIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT4sIDxhIGhyZWY9XCIjVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUlwiPlZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFI8L2E+LCBvciA8YSBocmVmPVwiI1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFRcIj5Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWltYWdlLTAxNDMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgQXQgbGVhc3Qgb25lIG9mIDxjb2RlPmltYWdlPC9jb2RlPiBhbmQgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1pbWFnZS0wMTQzMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+Ojo8Y29kZT5hbGxvY2F0aW9uU2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIDxjb2RlPlZrTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPjo6PGNvZGU+c2l6ZTwvY29kZT4gb2YgdGhlIGltYWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1pbWFnZS0wMTQzNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGhvdXQgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVDwvY29kZT4gc2V0IGluIDxjb2RlPlZrSW1hZ2VDcmVhdGVJbmZvPC9jb2RlPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1idWZmZXItMDE0MzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5Wa01lbW9yeUFsbG9jYXRlSW5mbzwvY29kZT46Ojxjb2RlPmFsbG9jYXRpb25TaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgPGNvZGU+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2NvZGU+Ojo8Y29kZT5zaXplPC9jb2RlPiBvZiB0aGUgYnVmZmVyIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1idWZmZXItMDE0MzYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGhvdXQgPGNvZGU+VktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ8L2NvZGU+IHNldCBpbiA8YSBocmVmPVwiI1ZrQnVmZmVyQ3JlYXRlSW5mb1wiPlZrQnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8taW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPmltYWdlPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uKSsoVktfS0hSX2V4dGVybmFsX21lbW9yeV93aW4zMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWltYWdlLTAxODc2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IGFuZCA8YSBocmVmPVwiI1ZrTWVtb3J5QWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2E+IGRlZmluZXMgYSBtZW1vcnkgaW1wb3J0IG9wZXJhdGlvbiB3aXRoIGhhbmRsZSB0eXBlIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUPC9jb2RlPiwgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUPC9jb2RlPiwgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfQklUPC9jb2RlPiwgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfS01UX0JJVDwvY29kZT4sIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVDwvY29kZT4sIG9yIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9SRVNPVVJDRV9CSVQ8L2NvZGU+LCBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSB3YXMgY3JlYXRlZCBieSB0aGUgVnVsa2FuIEFQSSwgdGhlbiB0aGUgbWVtb3J5IGJlaW5nIGltcG9ydGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gYmUgYSBkZWRpY2F0ZWQgaW1hZ2UgYWxsb2NhdGlvbiBhbmQgPGNvZGU+aW1hZ2U8L2NvZGU+IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGltcG9ydGVkIG1lbW9yeS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWJ1ZmZlci0wMTg3NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4gYW5kIDxhIGhyZWY9XCIjVmtNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeUFsbG9jYXRlSW5mbzwvYT4gZGVmaW5lcyBhIG1lbW9yeSBpbXBvcnQgb3BlcmF0aW9uIHdpdGggaGFuZGxlIHR5cGUgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQ8L2NvZGU+LCA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQ8L2NvZGU+LCA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9LTVRfQklUPC9jb2RlPiwgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX0hFQVBfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVDwvY29kZT4sIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHdhcyBjcmVhdGVkIGJ5IHRoZSBWdWxrYW4gQVBJLCB0aGVuIHRoZSBtZW1vcnkgYmVpbmcgaW1wb3J0ZWQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBiZSBhIGRlZGljYXRlZCBidWZmZXIgYWxsb2NhdGlvbiBhbmQgPGNvZGU+YnVmZmVyPC9jb2RlPiBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1wb3J0ZWQgbWVtb3J5LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uKSsoVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWltYWdlLTAxODc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IGFuZCA8YSBocmVmPVwiI1ZrTWVtb3J5QWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2E+IGRlZmluZXMgYSBtZW1vcnkgaW1wb3J0IG9wZXJhdGlvbiB3aXRoIGhhbmRsZSB0eXBlIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUPC9jb2RlPiwgdGhlIG1lbW9yeSBiZWluZyBpbXBvcnRlZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGJlIGEgZGVkaWNhdGVkIGltYWdlIGFsbG9jYXRpb24gYW5kIDxjb2RlPmltYWdlPC9jb2RlPiBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbXBvcnRlZCBtZW1vcnkuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1idWZmZXItMDE4NzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IGFuZCA8YSBocmVmPVwiI1ZrTWVtb3J5QWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2E+IGRlZmluZXMgYSBtZW1vcnkgaW1wb3J0IG9wZXJhdGlvbiB3aXRoIGhhbmRsZSB0eXBlIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUPC9jb2RlPiwgdGhlIG1lbW9yeSBiZWluZyBpbXBvcnRlZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGJlIGEgZGVkaWNhdGVkIGJ1ZmZlciBhbGxvY2F0aW9uIGFuZCA8Y29kZT5idWZmZXI8L2NvZGU+IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbXBvcnRlZCBtZW1vcnkuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24pKyhWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8taW1hZ2UtMDE3OTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9DUkVBVEVfRElTSk9JTlRfQklUPC9jb2RlPiBzZXQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYiOiB7CisgICAgICAiKFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtaW1hZ2UtMDA2NDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBBdCBsZWFzdCBvbmUgb2YgPGNvZGU+aW1hZ2U8L2NvZGU+IGFuZCA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWltYWdlLTAwNjUwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCB0aGUgaW1hZ2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjwvY29kZT46Ojxjb2RlPmRlZGljYXRlZEFsbG9jYXRpb248L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVi1idWZmZXItMDA2NTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCB0aGUgYnVmZmVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WPC9jb2RlPjo6PGNvZGU+ZGVkaWNhdGVkQWxsb2NhdGlvbjwvY29kZT4gZXF1YWwgdG8gPGNvZGU+VktfVFJVRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWltYWdlLTAwNjUyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5Wa01lbW9yeUFsbG9jYXRlSW5mbzwvY29kZT46Ojxjb2RlPmFsbG9jYXRpb25TaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgPGNvZGU+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2NvZGU+Ojo8Y29kZT5zaXplPC9jb2RlPiBvZiB0aGUgaW1hZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWJ1ZmZlci0wMDY1MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPlZrTWVtb3J5QWxsb2NhdGVJbmZvPC9jb2RlPjo6PGNvZGU+YWxsb2NhdGlvblNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIHRoZSA8Y29kZT5Wa01lbW9yeVJlcXVpcmVtZW50czwvY29kZT46Ojxjb2RlPnNpemU8L2NvZGU+IG9mIHRoZSBidWZmZXIiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX01FTU9SWV9BTExPQ0FURV9JTkZPX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtaW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPmltYWdlPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24pKyhWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyLFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVi1pbWFnZS0wMDY1NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiBhbmQgPGEgaHJlZj1cIiNWa01lbW9yeUFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5QWxsb2NhdGVJbmZvPC9hPiBkZWZpbmVzIGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24sIHRoZSBtZW1vcnkgYmVpbmcgaW1wb3J0ZWQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBiZSBhIGRlZGljYXRlZCBpbWFnZSBhbGxvY2F0aW9uIGFuZCA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaWRlbnRpY2FsIHRvIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGltcG9ydGVkIG1lbW9yeS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWJ1ZmZlci0wMDY1NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4gYW5kIDxhIGhyZWY9XCIjVmtNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeUFsbG9jYXRlSW5mbzwvYT4gZGVmaW5lcyBhIG1lbW9yeSBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgbWVtb3J5IGJlaW5nIGltcG9ydGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gYmUgYSBkZWRpY2F0ZWQgYnVmZmVyIGFsbG9jYXRpb24gYW5kIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaWRlbnRpY2FsIHRvIHRoZSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbXBvcnRlZCBtZW1vcnkuIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX21lbW9yeV9wcmlvcml0eSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQtcHJpb3JpdHktMDI2MDIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wcmlvcml0eTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+MTwvY29kZT4sIGluY2x1c2l2ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUFJJT1JJVFlfQUxMT0NBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mby1oYW5kbGVUeXBlcy0wMDY1NiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBiaXRzIGluIDxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzdXBwb3J0ZWQgYW5kIGNvbXBhdGlibGUsIGFzIHJlcG9ydGVkIGJ5IDxhIGhyZWY9XCIjVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc1wiPlZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM8L2E+IG9yIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNcIj5Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNcIj5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX21lbW9yeV93aW4zMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGVzLTAwNjU3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGEgaHJlZj1cIiNWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb1wiPlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQ8L2NvZGU+LCA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQ8L2NvZGU+LCA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfSEVBUF9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfUkVTT1VSQ0VfQklUPC9jb2RlPiwgYSA8Y29kZT5Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjwvY29kZT4gc3RydWN0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIDxhIGhyZWY9XCIjVmtNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeUFsbG9jYXRlSW5mbzwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLXBBdHRyaWJ1dGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBdHRyaWJ1dGVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBdHRyaWJ1dGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8Y29kZT5TRUNVUklUWV9BVFRSSUJVVEVTPC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMDY1OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGZvciBpbXBvcnQsIGFzIHJlcG9ydGVkIGJ5IDxhIGhyZWY9XCIjVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc1wiPlZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM8L2E+IG9yIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNcIj5Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGUtMDA2NTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgbWVtb3J5IGZyb20gd2hpY2ggPGNvZGU+aGFuZGxlPC9jb2RlPiB3YXMgZXhwb3J0ZWQsIG9yIHRoZSBtZW1vcnkgbmFtZWQgYnkgPGNvZGU+bmFtZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgb24gdGhlIHNhbWUgdW5kZXJseWluZyBwaHlzaWNhbCBkZXZpY2UgYXMgPGNvZGU+ZGV2aWNlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGRlZmluZWQgYXMgYW4gTlQgaGFuZGxlIG9yIGEgZ2xvYmFsIHNoYXJlIGhhbmRsZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0MzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQ8L2NvZGU+LCA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQ8L2NvZGU+LCA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfSEVBUF9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfUkVTT1VSQ0VfQklUPC9jb2RlPiwgPGNvZGU+bmFtZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+IGFuZCA8Y29kZT5oYW5kbGU8L2NvZGU+IGlzIDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5uYW1lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBuYW1lIGEgdmFsaWQgbWVtb3J5IHJlc291cmNlIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPm5hbWU8L2NvZGU+IGlzIDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5oYW5kbGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgaGFuZGxlIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZS0wMTQ0MSIsCisgICAgICAgICAgInRleHQiOiAiIGlmIDxjb2RlPmhhbmRsZTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5uYW1lPC9jb2RlPiBtdXN0IGJlIDxjb2RlPk5VTEw8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNTE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9iZXkgYW55IHJlcXVpcmVtZW50cyBsaXN0ZWQgZm9yIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGluIDxhIGhyZWY9XCIjZXh0ZXJuYWwtbWVtb3J5LWhhbmRsZS10eXBlcy1jb21wYXRpYmlsaXR5XCI+ZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSB0eXBlcyBjb21wYXRpYmlsaXR5PC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLW5hbWUtMDE1MTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5uYW1lPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9iZXkgYW55IHJlcXVpcmVtZW50cyBsaXN0ZWQgZm9yIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGluIDxhIGhyZWY9XCIjZXh0ZXJuYWwtbWVtb3J5LWhhbmRsZS10eXBlcy1jb21wYXRpYmlsaXR5XCI+ZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSB0eXBlcyBjb21wYXRpYmlsaXR5PC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzXCI+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSIjogeworICAgICAgIihWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSLXBHZXRXaW4zMkhhbmRsZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEdldFdpbjMySGFuZGxlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUlwiPlZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFItcEhhbmRsZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSGFuZGxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT5IQU5ETEU8L2NvZGU+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjYyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluIDxhIGhyZWY9XCIjVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiB3aGVuIDxjb2RlPm1lbW9yeTwvY29kZT4gd2FzIGNyZWF0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjYzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgZGVmaW5lZCBhcyBhbiBOVCBoYW5kbGUsIDxhIGhyZWY9XCIjdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUlwiPnZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFI8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGNhbGxlZCBubyBtb3JlIHRoYW4gb25jZSBmb3IgZWFjaCB2YWxpZCB1bmlxdWUgY29tYmluYXRpb24gb2YgPGNvZGU+bWVtb3J5PC9jb2RlPiBhbmQgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZGVmaW5lZCBhcyBhbiBOVCBoYW5kbGUgb3IgYSBnbG9iYWwgc2hhcmUgaGFuZGxlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFItbWVtb3J5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1oYW5kbGUtMDA2NjUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIGV4dGVybmFsIG1lbW9yeSBoYW5kbGUgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBWdWxrYW4gQVBJLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFItaGFuZGxlVHlwZS0wMDY2NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBvbmUgb2YgdGhlIGhhbmRsZSB0eXBlcyBkZWZpbmVkIGFzIG9wYXF1ZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNcIj5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFItcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSXCI+VmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIjogeworICAgICAgIihWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1dJTjMyX0hBTkRMRV9QUk9QRVJUSUVTX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjY3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzdXBwb3J0ZWQgZm9yIGltcG9ydCwgYXMgcmVwb3J0ZWQgYnkgPGEgaHJlZj1cIiNWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzXCI+VmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllczwvYT4gb3IgPGEgaHJlZj1cIiNWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllc1wiPlZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWZkLTAwNjY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIG1lbW9yeSBmcm9tIHdoaWNoIDxjb2RlPmZkPC9jb2RlPiB3YXMgZXhwb3J0ZWQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgb24gdGhlIHNhbWUgdW5kZXJseWluZyBwaHlzaWNhbCBkZXZpY2UgYXMgPGNvZGU+ZGV2aWNlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGRlZmluZWQgYXMgYSBQT1NJWCBmaWxlIGRlc2NyaXB0b3IgaGFuZGxlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRNZW1vcnlGZEluZm9LSFItaGFuZGxlVHlwZS0wMDY3MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+ZmQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgaGFuZGxlIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWZkLTAxNzQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIG1lbW9yeSByZXByZXNlbnRlZCBieSA8Y29kZT5mZDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSBhIHBoeXNpY2FsIGRldmljZSBhbmQgZHJpdmVyIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIDxjb2RlPmRldmljZTwvY29kZT4gYW5kIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+LCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNleHRlcm5hbC1tZW1vcnktaGFuZGxlLXR5cGVzLWNvbXBhdGliaWxpdHlcIj5FeHRlcm5hbCBtZW1vcnkgaGFuZGxlIHR5cGVzIGNvbXBhdGliaWxpdHk8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRNZW1vcnlGZEluZm9LSFItZmQtMDE1MjAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mZDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb2JleSBhbnkgcmVxdWlyZW1lbnRzIGxpc3RlZCBmb3IgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaW4gPGEgaHJlZj1cIiNleHRlcm5hbC1tZW1vcnktaGFuZGxlLXR5cGVzLWNvbXBhdGliaWxpdHlcIj5leHRlcm5hbCBtZW1vcnkgaGFuZGxlIHR5cGVzIGNvbXBhdGliaWxpdHk8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRNZW1vcnlGZEluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9GRF9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRNZW1vcnlGZEtIUiI6IHsKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5RmRLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRNZW1vcnlGZEtIUi1wR2V0RmRJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBHZXRGZEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtNZW1vcnlHZXRGZEluZm9LSFJcIj5Wa01lbW9yeUdldEZkSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUZkS0hSLXBGZC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRmQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNZW1vcnlHZXRGZEluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluIDxhIGhyZWY9XCIjVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiB3aGVuIDxjb2RlPm1lbW9yeTwvY29kZT4gd2FzIGNyZWF0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZGVmaW5lZCBhcyBhIFBPU0lYIGZpbGUgZGVzY3JpcHRvciBoYW5kbGUuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUdldEZkSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0ZEX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5R2V0RmRJbmZvS0hSLW1lbW9yeS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZU1lbW9yeVwiPlZrRGV2aWNlTWVtb3J5PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5R2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNcIj5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIjogeworICAgICAgIihWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFItZmQtMDA2NzMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mZDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYW4gZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFZ1bGthbiBBUEkuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUi1oYW5kbGVUeXBlLTAwNjc0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUjwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzXCI+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSLXBNZW1vcnlGZFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE1lbW9yeUZkUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa01lbW9yeUZkUHJvcGVydGllc0tIUlwiPlZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa01lbW9yeUZkUHJvcGVydGllc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9GRF9QUk9QRVJUSUVTX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9leHRlcm5hbF9tZW1vcnlfaG9zdCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULWhhbmRsZVR5cGUtMDE3NDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHN1cHBvcnRlZCBmb3IgaW1wb3J0LCBhcyByZXBvcnRlZCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzXCI+VmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1oYW5kbGVUeXBlLTAxNzQ4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQ8L2NvZGU+IG9yIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX01BUFBFRF9GT1JFSUdOX01FTU9SWV9CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQtcEhvc3RQb2ludGVyLTAxNzQ5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEhvc3RQb2ludGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHBvaW50ZXIgYWxpZ25lZCB0byBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULWhhbmRsZVR5cGUtMDE3NTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQ8L2NvZGU+LCA8Y29kZT5wSG9zdFBvaW50ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcG9pbnRlciB0byA8Y29kZT5hbGxvY2F0aW9uU2l6ZTwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIG9mIGhvc3QgbWVtb3J5LCB3aGVyZSA8Y29kZT5hbGxvY2F0aW9uU2l6ZTwvY29kZT4gaXMgdGhlIG1lbWJlciBvZiB0aGUgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSB0aGlzIHN0cnVjdHVyZSBpcyBjaGFpbmVkIHRvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1oYW5kbGVUeXBlLTAxNzUxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfTUFQUEVEX0ZPUkVJR05fTUVNT1JZX0JJVF9FWFQ8L2NvZGU+LCA8Y29kZT5wSG9zdFBvaW50ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcG9pbnRlciB0byA8Y29kZT5hbGxvY2F0aW9uU2l6ZTwvY29kZT4gbnVtYmVyIG9mIGJ5dGVzIG9mIGhvc3QgbWFwcGVkIGZvcmVpZ24gbWVtb3J5LCB3aGVyZSA8Y29kZT5hbGxvY2F0aW9uU2l6ZTwvY29kZT4gaXMgdGhlIG1lbWJlciBvZiB0aGUgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSB0aGlzIHN0cnVjdHVyZSBpcyBjaGFpbmVkIHRvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0hPU1RfUE9JTlRFUl9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNcIj5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIjogeworICAgICAgIihWS19FWFRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1oYW5kbGVUeXBlLTAxNzUyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfQUxMT0NBVElPTl9CSVRfRVhUPC9jb2RlPiBvciA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9NQVBQRURfRk9SRUlHTl9NRU1PUllfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULXBIb3N0UG9pbnRlci0wMTc1MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBIb3N0UG9pbnRlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBwb2ludGVyIGFsaWduZWQgdG8gYW4gaW50ZWdlciBtdWx0aXBsZSBvZiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1oYW5kbGVUeXBlLTAxNzU0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfQUxMT0NBVElPTl9CSVRfRVhUPC9jb2RlPiwgPGNvZGU+cEhvc3RQb2ludGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHBvaW50ZXIgdG8gaG9zdCBtZW1vcnkiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULWhhbmRsZVR5cGUtMDE3NTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9NQVBQRURfRk9SRUlHTl9NRU1PUllfQklUX0VYVDwvY29kZT4sIDxjb2RlPnBIb3N0UG9pbnRlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBwb2ludGVyIHRvIGhvc3QgbWFwcGVkIGZvcmVpZ24gbWVtb3J5IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1oYW5kbGVUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzXCI+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULXBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVFwiPlZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0hPU1RfUE9JTlRFUl9QUk9QRVJUSUVTX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCI6IHsKKyAgICAgICIoVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELWJ1ZmZlci0wMTg4MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCBBbmRyb2lkIGhhcmR3YXJlIGJ1ZmZlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGZvciBpbXBvcnQsIGFzIHJlcG9ydGVkIGJ5IDxhIGhyZWY9XCIjVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc1wiPlZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM8L2E+IG9yIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNcIj5Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELWJ1ZmZlci0wMTg4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyIG9iamVjdCB3aXRoIDxjb2RlPkFIYXJkd2FyZUJ1ZmZlcl9EZXNjPC9jb2RlPjo6PGNvZGU+Zm9ybWF0PC9jb2RlPiBhbmQgPGNvZGU+QUhhcmR3YXJlQnVmZmVyX0Rlc2M8L2NvZGU+Ojo8Y29kZT51c2FnZTwvY29kZT4gY29tcGF0aWJsZSB3aXRoIFZ1bGthbiBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNtZW1vcnktZXh0ZXJuYWwtYW5kcm9pZC1oYXJkd2FyZS1idWZmZXJcIj5BbmRyb2lkIEhhcmR3YXJlIEJ1ZmZlcnM8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfSU5GT19BTkRST0lEPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gPGNvZGU+QUhhcmR3YXJlQnVmZmVyPC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCI6IHsKKyAgICAgICIoVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lELXBJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSURcIj5Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRC1wQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gPGNvZGU+QUhhcmR3YXJlQnVmZmVyPC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQiOiB7CisgICAgICAiKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1oYW5kbGVUeXBlcy0wMTg4MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluIDxhIGhyZWY9XCIjVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiB3aGVuIDxjb2RlPm1lbW9yeTwvY29kZT4gd2FzIGNyZWF0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELXBOZXh0LTAxODgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiB0aGUgPGEgaHJlZj1cIiNWa01lbW9yeUFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5QWxsb2NhdGVJbmZvPC9hPiB1c2VkIHRvIGFsbG9jYXRlIDxjb2RlPm1lbW9yeTwvY29kZT4gaW5jbHVkZWQgYSA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+IHdpdGggbm9uLTxjb2RlPk5VTEw8L2NvZGU+IDxjb2RlPmltYWdlPC9jb2RlPiBtZW1iZXIsIHRoZW4gdGhhdCA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxyZWFkeSBiZSBib3VuZCB0byA8Y29kZT5tZW1vcnk8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtbWVtb3J5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiOiB7CisgICAgICAiKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRC1idWZmZXItMDE4ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIgb2JqZWN0IHdpdGggYXQgbGVhc3Qgb25lIG9mIHRoZSA8Y29kZT5BSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVXzwvY29kZT4qIGZsYWdzIGluIGl0cyA8Y29kZT5BSGFyZHdhcmVCdWZmZXJfRGVzYzwvY29kZT46Ojxjb2RlPnVzYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxjb2RlPkFIYXJkd2FyZUJ1ZmZlcjwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRFwiPlZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiOiB7CisgICAgICAiKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRFwiPlZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQ8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCI6IHsKKyAgICAgICIoVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lELXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViI6IHsKKyAgICAgICIoVktfTlZfZXh0ZXJuYWxfbWVtb3J5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WLWhhbmRsZVR5cGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WXCI+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIjogeworICAgICAgIihWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLXBBdHRyaWJ1dGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBdHRyaWJ1dGVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBdHRyaWJ1dGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8Y29kZT5TRUNVUklUWV9BVFRSSUJVVEVTPC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYiOiB7CisgICAgICAiKFZLX05WX2V4dGVybmFsX21lbW9yeV93aW4zMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtaGFuZGxlVHlwZS0wMTMyNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgYml0IHNldC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtaGFuZGxlLTAxMzI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGhhbmRsZSB0byBtZW1vcnksIG9idGFpbmVkIGFzIHNwZWNpZmllZCBieSA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WXCI+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYiOiB7CisgICAgICAiKFZLX05WX2V4dGVybmFsX21lbW9yeV93aW4zMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1oYW5kbGVUeXBlLTAxMzI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBmbGFnIHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlZcIj5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gYWxsb2NhdGluZyA8Y29kZT5tZW1vcnk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlTlYtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLW1lbW9yeS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZU1lbW9yeVwiPlZrRGV2aWNlTWVtb3J5PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlZcIj5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlY8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLWhhbmRsZVR5cGUtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlTlYtcEhhbmRsZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSGFuZGxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT5IQU5ETEU8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlTlYtbWVtb3J5LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvLWRldmljZU1hc2stMDA2NzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5WS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUPC9jb2RlPiBpcyBzZXQsIDxjb2RlPmRldmljZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgZGV2aWNlIG1hc2suIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvLWRldmljZU1hc2stMDA2NzYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5WS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUPC9jb2RlPiBpcyBzZXQsIDxjb2RlPmRldmljZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB6ZXJvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9GTEFHU19JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mby1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrTWVtb3J5QWxsb2NhdGVGbGFnQml0c1wiPlZrTWVtb3J5QWxsb2NhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQUxMT0NBVEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtGcmVlTWVtb3J5IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRnJlZU1lbW9yeS1tZW1vcnktMDA2NzciLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgc3VibWl0dGVkIGNvbW1hbmRzIHRoYXQgcmVmZXIgdG8gPGNvZGU+bWVtb3J5PC9jb2RlPiAodmlhIGltYWdlcyBvciBidWZmZXJzKSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRnJlZU1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVNZW1vcnktbWVtb3J5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm1lbW9yeTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtGcmVlTWVtb3J5LXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVNZW1vcnktbWVtb3J5LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm1lbW9yeTwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a01hcE1lbW9yeSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a01hcE1lbW9yeS1tZW1vcnktMDA2NzgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBjdXJyZW50bHkgaG9zdCBtYXBwZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWFwTWVtb3J5LW9mZnNldC0wMDY3OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIDxjb2RlPm1lbW9yeTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWFwTWVtb3J5LXNpemUtMDA2ODAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zaXplPC9jb2RlPiBpcyBub3QgZXF1YWwgdG8gPGNvZGU+VktfV0hPTEVfU0laRTwvY29kZT4sIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtNYXBNZW1vcnktc2l6ZS0wMDY4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNpemU8L2NvZGU+IGlzIG5vdCBlcXVhbCB0byA8Y29kZT5WS19XSE9MRV9TSVpFPC9jb2RlPiwgPGNvZGU+c2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSA8Y29kZT5tZW1vcnk8L2NvZGU+IG1pbnVzIDxjb2RlPm9mZnNldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWFwTWVtb3J5LW1lbW9yeS0wMDY4MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSB0eXBlIHRoYXQgcmVwb3J0cyA8Y29kZT5WS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWFwTWVtb3J5LWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWFwTWVtb3J5LW1lbW9yeS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZU1lbW9yeVwiPlZrRGV2aWNlTWVtb3J5PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrTWFwTWVtb3J5LWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a01hcE1lbW9yeS1wcERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cHBEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBwb2ludGVyIHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a01hcE1lbW9yeS1tZW1vcnktcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtNYXBNZW1vcnktbWVtb3J5LTAwNjgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIG11bHRpcGxlIGluc3RhbmNlcy4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcy1wTWVtb3J5UmFuZ2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNZW1vcnlSYW5nZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5tZW1vcnlSYW5nZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrTWFwcGVkTWVtb3J5UmFuZ2VcIj5Wa01hcHBlZE1lbW9yeVJhbmdlPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzLW1lbW9yeVJhbmdlQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnlSYW5nZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcy1wTWVtb3J5UmFuZ2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNZW1vcnlSYW5nZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5tZW1vcnlSYW5nZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrTWFwcGVkTWVtb3J5UmFuZ2VcIj5Wa01hcHBlZE1lbW9yeVJhbmdlPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMtbWVtb3J5UmFuZ2VDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeVJhbmdlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrTWFwcGVkTWVtb3J5UmFuZ2UiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1tZW1vcnktMDA2ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGN1cnJlbnRseSBob3N0IG1hcHBlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zaXplLTAwNjg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2l6ZTwvY29kZT4gaXMgbm90IGVxdWFsIHRvIDxjb2RlPlZLX1dIT0xFX1NJWkU8L2NvZGU+LCA8Y29kZT5vZmZzZXQ8L2NvZGU+IGFuZCA8Y29kZT5zaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5IGEgcmFuZ2UgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudGx5IG1hcHBlZCByYW5nZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLXNpemUtMDA2ODYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zaXplPC9jb2RlPiBpcyBlcXVhbCB0byA8Y29kZT5WS19XSE9MRV9TSVpFPC9jb2RlPiwgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB3aXRoaW4gdGhlIGN1cnJlbnRseSBtYXBwZWQgcmFuZ2Ugb2YgPGNvZGU+bWVtb3J5PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zaXplLTAxMzg5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2l6ZTwvY29kZT4gaXMgZXF1YWwgdG8gPGNvZGU+VktfV0hPTEVfU0laRTwvY29kZT4sIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWFwcGluZyBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTGltaXRzXCI+VmtQaHlzaWNhbERldmljZUxpbWl0czwvYT46Ojxjb2RlPm5vbkNvaGVyZW50QXRvbVNpemU8L2NvZGU+IGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVtb3J5IG9iamVjdC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utb2Zmc2V0LTAwNjg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUxpbWl0c1wiPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2E+Ojo8Y29kZT5ub25Db2hlcmVudEF0b21TaXplPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zaXplLTAxMzkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2l6ZTwvY29kZT4gaXMgbm90IGVxdWFsIHRvIDxjb2RlPlZLX1dIT0xFX1NJWkU8L2NvZGU+LCA8Y29kZT5zaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlaXRoZXIgYmUgYSBtdWx0aXBsZSBvZiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VMaW1pdHNcIj5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9hPjo6PGNvZGU+bm9uQ29oZXJlbnRBdG9tU2l6ZTwvY29kZT4sIG9yIDxjb2RlPm9mZnNldDwvY29kZT4gcGx1cyA8Y29kZT5zaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1tZW1vcnktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VNZW1vcnlcIj5Wa0RldmljZU1lbW9yeTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtVbm1hcE1lbW9yeSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VubWFwTWVtb3J5LW1lbW9yeS0wMDY4OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgY3VycmVudGx5IGhvc3QgbWFwcGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VubWFwTWVtb3J5LWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrVW5tYXBNZW1vcnktbWVtb3J5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtVbm1hcE1lbW9yeS1tZW1vcnktcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudC1tZW1vcnktMDA2OTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBtZW1vcnkgdHlwZSB0aGF0IHJlcG9ydHMgPGNvZGU+VktfTUVNT1JZX1BST1BFUlRZX0xBWklMWV9BTExPQ0FURURfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudC1tZW1vcnktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VNZW1vcnlcIj5Wa0RldmljZU1lbW9yeTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQtcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENvbW1pdHRlZE1lbW9yeUluQnl0ZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPlZrRGV2aWNlU2l6ZTwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudC1tZW1vcnktcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMtaGVhcEluZGV4LTAwNjkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGVhcEluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+bWVtb3J5SGVhcENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1sb2NhbERldmljZUluZGV4LTAwNjkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bG9jYWxEZXZpY2VJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBkZXZpY2UgaW5kZXgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMtcmVtb3RlRGV2aWNlSW5kZXgtMDA2OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yZW1vdGVEZXZpY2VJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBkZXZpY2UgaW5kZXgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMtbG9jYWxEZXZpY2VJbmRleC0wMDY5NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmxvY2FsRGV2aWNlSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBlcXVhbCA8Y29kZT5yZW1vdGVEZXZpY2VJbmRleDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1wUGVlck1lbW9yeUZlYXR1cmVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQZWVyTWVtb3J5RmVhdHVyZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzXCI+VmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiOiB7CisgICAgICAiKFZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLU5vbmUtMDMzMzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1idWZmZXJEZXZpY2VBZGRyZXNzXCI+YnVmZmVyRGV2aWNlQWRkcmVzczwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLWRldmljZS0wMzMzNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRldmljZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBtdWx0aXBsZSBwaHlzaWNhbCBkZXZpY2VzLCB0aGVuIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZVwiPmJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZTwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItcEluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFJcIj5Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUi1tZW1vcnktMDMzMzYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCA8Y29kZT5WS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUi1tZW1vcnktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VNZW1vcnlcIj5Wa0RldmljZU1lbW9yeTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVCdWZmZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVCdWZmZXItZmxhZ3MtMDA5MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+ZmxhZ3M8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ8L2NvZGU+LCBjcmVhdGluZyB0aGlzIDxjb2RlPlZrQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY2F1c2UgdGhlIHRvdGFsIHJlcXVpcmVkIHNwYXJzZSBtZW1vcnkgZm9yIGFsbCBjdXJyZW50bHkgdmFsaWQgc3BhcnNlIHJlc291cmNlcyBvbiB0aGUgZGV2aWNlIHRvIGV4Y2VlZCA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+c3BhcnNlQWRkcmVzc1NwYWNlU2l6ZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQnVmZmVyLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQnVmZmVyLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyQ3JlYXRlSW5mb1wiPlZrQnVmZmVyQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUJ1ZmZlci1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVCdWZmZXItcEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQnVmZmVyQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tc2l6ZS0wMDkxMiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAwOTEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgPGNvZGU+cFF1ZXVlRmFtaWx5SW5kaWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDwvY29kZT4gPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAwOTE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgPGNvZGU+cXVldWVGYW1pbHlJbmRleENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMDkxNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNwYXJzZUJpbmRpbmdcIj5zcGFyc2UgYmluZGluZ3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMDkxNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNwYXJzZVJlc2lkZW5jeUJ1ZmZlclwiPnNwYXJzZSBidWZmZXIgcmVzaWRlbmN5PC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfQlVGRkVSX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMDkxNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNwYXJzZVJlc2lkZW5jeUFsaWFzZWRcIj5zcGFyc2UgYWxpYXNlZCByZXNpZGVuY3k8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMDkxOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUPC9jb2RlPiBvciA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gY29udGFpbiA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnBOZXh0PC9jb2RlPiBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFRcIj5Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUPC9hPiwgPGEgaHJlZj1cIiNWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUlwiPlZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSPC9hPiwgPGEgaHJlZj1cIiNWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlZcIj5Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY8L2E+LCBvciA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvXCI+VmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm88L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0J1ZmZlckNyZWF0ZUZsYWdCaXRzXCI+VmtCdWZmZXJDcmVhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tdXNhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0J1ZmZlclVzYWdlRmxhZ0JpdHNcIj5Wa0J1ZmZlclVzYWdlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zaGFyaW5nTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2hhcmluZ01vZGVcIj5Wa1NoYXJpbmdNb2RlPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxMzkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBRdWV1ZUZhbWlseUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSBhbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ8L2NvZGU+IHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllc1wiPnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2E+IGZvciB0aGUgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxNDE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBRdWV1ZUZhbWlseUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSBhbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ8L2NvZGU+IHJldHVybmVkIGJ5IGVpdGhlciA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXNcIj52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzPC9hPiBvciA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyXCI+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczI8L2E+IGZvciB0aGUgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tcE5leHQtMDA5MjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mb1wiPlZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUsIGl0cyA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gbWVtYmVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgY29udGFpbiBiaXRzIHRoYXQgYXJlIGFsc28gaW4gPGEgaHJlZj1cIiNWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllc1wiPlZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzPC9hPjo6PGNvZGU+ZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzLmNvbXBhdGlibGVIYW5kbGVUeXBlczwvY29kZT4sIGFzIHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc1wiPnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM8L2E+IHdpdGggPGNvZGU+cEV4dGVybmFsQnVmZmVySW5mbzwvY29kZT4tJmd0O2hhbmRsZVR5cGUgZXF1YWwgdG8gYW55IG9uZSBvZiB0aGUgaGFuZGxlIHR5cGVzIHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvXCI+VmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAxODg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHByb3RlY3RlZCBtZW1vcnkgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX0JVRkZFUl9DUkVBVEVfUFJPVEVDVEVEX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1Ob25lLTAxODg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSBiaXRzIDxjb2RlPlZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUPC9jb2RlPiwgPGNvZGU+VktfQlVGRkVSX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVDwvY29kZT4sIG9yIDxjb2RlPlZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUPC9jb2RlPiBhcmUgc2V0LCA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1BST1RFQ1RFRF9CSVQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhbHNvIGJlIHNldCIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tcE5leHQtMDE1NzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlZcIj5Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY8L2E+IHN0cnVjdHVyZSwgYW5kIHRoZSA8Y29kZT5kZWRpY2F0ZWRBbGxvY2F0aW9uPC9jb2RlPiBtZW1iZXIgb2YgdGhlIGNoYWluZWQgc3RydWN0dXJlIGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCB0aGVuIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVDwvY29kZT4sIDxjb2RlPlZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MsVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykrKFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZGV2aWNlQWRkcmVzcy0wMjYwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVFwiPlZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5kZXZpY2VBZGRyZXNzPC9jb2RlPiBpcyBub3QgemVybywgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgPGNvZGU+VktfQlVGRkVSX0NSRUFURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyxWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzKSsoVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1vcGFxdWVDYXB0dXJlQWRkcmVzcy0wMzMzNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFJcIj5Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUjwvYT46Ojxjb2RlPm9wYXF1ZUNhcHR1cmVBZGRyZXNzPC9jb2RlPiBpcyBub3QgemVybywgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgPGNvZGU+VktfQlVGRkVSX0NSRUFURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyxWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMzM4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUjwvY29kZT4sIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5XCI+YnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXk8L2E+IG9yIDxhIGhyZWY9XCIjZmVhdHVyZXMtYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXlFWFRcIj48Y29kZT5Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUPC9jb2RlPjo6PGNvZGU+YnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXk8L2NvZGU+PC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYiOiB7CisgICAgICAiKFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JVRkZFUl9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNcIj5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0NSRUFURV9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfQ1JFQVRFX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveUJ1ZmZlciI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lCdWZmZXItYnVmZmVyLTAwOTIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIDxjb2RlPmJ1ZmZlcjwvY29kZT4sIGVpdGhlciBkaXJlY3RseSBvciB2aWEgYSA8Y29kZT5Wa0J1ZmZlclZpZXc8L2NvZGU+LCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUJ1ZmZlci1idWZmZXItMDA5MjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lCdWZmZXItYnVmZmVyLTAwOTI0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUJ1ZmZlci1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lCdWZmZXItYnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QnVmZmVyLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lCdWZmZXItYnVmZmVyLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZUJ1ZmZlclZpZXciOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVCdWZmZXJWaWV3LWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQnVmZmVyVmlldy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclZpZXdDcmVhdGVJbmZvXCI+VmtCdWZmZXJWaWV3Q3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUJ1ZmZlclZpZXctcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQnVmZmVyVmlldy1wVmlldy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVmlldzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0J1ZmZlclZpZXdcIj5Wa0J1ZmZlclZpZXc8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQnVmZmVyVmlld0NyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1vZmZzZXQtMDA5MjUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5idWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLXJhbmdlLTAwOTI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cmFuZ2U8L2NvZGU+IGlzIG5vdCBlcXVhbCB0byA8Y29kZT5WS19XSE9MRV9TSVpFPC9jb2RlPiwgPGNvZGU+cmFuZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1yYW5nZS0wMDkyOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnJhbmdlPC9jb2RlPiBpcyBub3QgZXF1YWwgdG8gPGNvZGU+VktfV0hPTEVfU0laRTwvY29kZT4sIDxjb2RlPnJhbmdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSB0ZXhlbCBibG9jayBzaXplIG9mIDxjb2RlPmZvcm1hdDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tcmFuZ2UtMDA5MzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5yYW5nZTwvY29kZT4gaXMgbm90IGVxdWFsIHRvIDxjb2RlPlZLX1dIT0xFX1NJWkU8L2NvZGU+LCA8Y29kZT5yYW5nZTwvY29kZT4gZGl2aWRlZCBieSB0aGUgdGV4ZWwgYmxvY2sgc2l6ZSBvZiA8Y29kZT5mb3JtYXQ8L2NvZGU+LCBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgdGV4ZWxzIHBlciB0ZXhlbCBibG9jayBmb3IgdGhhdCBmb3JtYXQgKGFzIGRlZmluZWQgaW4gdGhlIDxhIGhyZWY9XCIjZm9ybWF0cy1jb21wYXRpYmlsaXR5XCI+Q29tcGF0aWJsZSBGb3JtYXRzPC9hPiB0YWJsZSksIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VGV4ZWxCdWZmZXJFbGVtZW50czwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tb2Zmc2V0LTAwOTMxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cmFuZ2U8L2NvZGU+IGlzIG5vdCBlcXVhbCB0byA8Y29kZT5WS19XSE9MRV9TSVpFPC9jb2RlPiwgdGhlIHN1bSBvZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGFuZCA8Y29kZT5yYW5nZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAwOTMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPGNvZGU+dXNhZ2U8L2NvZGU+IHZhbHVlIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIG9mIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMDkzMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCA8Y29kZT51c2FnZTwvY29kZT4gY29udGFpbmluZyA8Y29kZT5WS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUPC9jb2RlPiwgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzdXBwb3J0ZWQgZm9yIHVuaWZvcm0gdGV4ZWwgYnVmZmVycywgYXMgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQ8L2NvZGU+IGZsYWcgaW4gPGNvZGU+VmtGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPjo6PGNvZGU+YnVmZmVyRmVhdHVyZXM8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItMDA5MzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggPGNvZGU+dXNhZ2U8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVDwvY29kZT4sIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGZvciBzdG9yYWdlIHRleGVsIGJ1ZmZlcnMsIGFzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUPC9jb2RlPiBmbGFnIGluIDxjb2RlPlZrRm9ybWF0UHJvcGVydGllczwvY29kZT46Ojxjb2RlPmJ1ZmZlckZlYXR1cmVzPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAwOTM1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX1ZJRVdfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tZm9ybWF0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfRVhUX3RleGVsX2J1ZmZlcl9hbGlnbm1lbnQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLW9mZnNldC0wMDkyNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfdGV4ZWxfYnVmZmVyX2FsaWdubWVudCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tb2Zmc2V0LTAyNzQ5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGV4ZWxCdWZmZXJBbGlnbm1lbnRcIj50ZXhlbEJ1ZmZlckFsaWdubWVudDwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5taW5UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAyNzUwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtdGV4ZWxCdWZmZXJBbGlnbm1lbnRcIj50ZXhlbEJ1ZmZlckFsaWdubWVudDwvYT4gZmVhdHVyZSBpcyBlbmFibGVkIGFuZCBpZiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggPGNvZGU+dXNhZ2U8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVDwvY29kZT4sIDxjb2RlPm9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgbGVzc2VyIG9mIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ8L2E+Ojo8Y29kZT5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlczwvY29kZT4gb3IsIGlmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ8L2E+Ojo8Y29kZT5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudDwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIHRoZSBzaXplIG9mIGEgdGV4ZWwgb2YgdGhlIHJlcXVlc3RlZCA8Y29kZT5mb3JtYXQ8L2NvZGU+LiBJZiB0aGUgc2l6ZSBvZiBhIHRleGVsIGlzIGEgbXVsdGlwbGUgb2YgdGhyZWUgYnl0ZXMsIHRoZW4gdGhlIHNpemUgb2YgYSBzaW5nbGUgY29tcG9uZW50IG9mIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgdXNlZCBpbnN0ZWFkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMjc1MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRleGVsQnVmZmVyQWxpZ25tZW50XCI+dGV4ZWxCdWZmZXJBbGlnbm1lbnQ8L2E+IGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgaWYgPGNvZGU+YnVmZmVyPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIDxjb2RlPnVzYWdlPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQ8L2NvZGU+LCA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGxlc3NlciBvZiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+dW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXM8L2NvZGU+IG9yLCBpZiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+dW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQ8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCB0aGUgc2l6ZSBvZiBhIHRleGVsIG9mIHRoZSByZXF1ZXN0ZWQgPGNvZGU+Zm9ybWF0PC9jb2RlPi4gSWYgdGhlIHNpemUgb2YgYSB0ZXhlbCBpcyBhIG11bHRpcGxlIG9mIHRocmVlIGJ5dGVzLCB0aGVuIHRoZSBzaXplIG9mIGEgc2luZ2xlIGNvbXBvbmVudCBvZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIHVzZWQgaW5zdGVhZCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveUJ1ZmZlclZpZXciOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LTAwOTM2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIDxjb2RlPmJ1ZmZlclZpZXc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LTAwOTM3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+YnVmZmVyVmlldzwvY29kZT4gd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHByb3ZpZGVkIGhlcmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUJ1ZmZlclZpZXctYnVmZmVyVmlldy0wMDkzOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmJ1ZmZlclZpZXc8L2NvZGU+IHdhcyBjcmVhdGVkLCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LWJ1ZmZlclZpZXctcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YnVmZmVyVmlldzwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmJ1ZmZlclZpZXc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclZpZXdcIj5Wa0J1ZmZlclZpZXc8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlclZpZXc8L2NvZGU+IGlzIGEgdmFsaWQgaGFuZGxlLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVJbWFnZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUltYWdlLWZsYWdzLTAwOTM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPmZsYWdzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ8L2NvZGU+LCBjcmVhdGluZyB0aGlzIDxjb2RlPlZrSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjYXVzZSB0aGUgdG90YWwgcmVxdWlyZWQgc3BhcnNlIG1lbW9yeSBmb3IgYWxsIGN1cnJlbnRseSB2YWxpZCBzcGFyc2UgcmVzb3VyY2VzIG9uIHRoZSBkZXZpY2UgdG8gZXhjZWVkIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5zcGFyc2VBZGRyZXNzU3BhY2VTaXplPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJbWFnZS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUltYWdlLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJbWFnZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJbWFnZS1wSW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZUNyZWF0ZU1heE1pcExldmVscy0wMjI1MSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgKGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1jcmVhdGlvbi1saW1pdHNcIj5JbWFnZSBDcmVhdGlvbiBMaW1pdHM8L2E+KSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdW5kZWZpbmVkIDxjb2RlPmltYWdlQ3JlYXRlTWF4TWlwTGV2ZWxzPC9jb2RlPiwgPGNvZGU+aW1hZ2VDcmVhdGVNYXhBcnJheUxheWVyczwvY29kZT4sIDxjb2RlPmltYWdlQ3JlYXRlTWF4RXh0ZW50PC9jb2RlPiwgYW5kIDxjb2RlPmltYWdlQ3JlYXRlU2FtcGxlQ291bnRzPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAwOTQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgPGNvZGU+cFF1ZXVlRmFtaWx5SW5kaWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDwvY29kZT4gPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDA5NDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zaGFyaW5nTW9kZTwvY29kZT4gaXMgPGNvZGU+VktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQ8L2NvZGU+LCA8Y29kZT5xdWV1ZUZhbWlseUluZGV4Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZXh0ZW50LTAwOTQ0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDA5NDUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDA5NDYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMDk0NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1pcExldmVsczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1hcnJheUxheWVycy0wMDk0OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAwOTQ5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklUPC9jb2RlPiwgPGNvZGU+aW1hZ2VUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZXh0ZW50LTAyMjUyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+aW1hZ2VDcmVhdGVNYXhFeHRlbnQud2lkdGg8L2NvZGU+IChhcyBkZWZpbmVkIGluIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLWNyZWF0aW9uLWxpbWl0c1wiPkltYWdlIENyZWF0aW9uIExpbWl0czwvYT4pLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZXh0ZW50LTAyMjUzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPmltYWdlQ3JlYXRlTWF4RXh0ZW50LmhlaWdodDwvY29kZT4gKGFzIGRlZmluZWQgaW4gPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtY3JlYXRpb24tbGltaXRzXCI+SW1hZ2UgQ3JlYXRpb24gTGltaXRzPC9hPikuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDIyNTQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5pbWFnZUNyZWF0ZU1heEV4dGVudC5kZXB0aDwvY29kZT4gKGFzIGRlZmluZWQgaW4gPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtY3JlYXRpb24tbGltaXRzXCI+SW1hZ2UgQ3JlYXRpb24gTGltaXRzPC9hPikuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+IGFuZCA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQ8L2NvZGU+LCA8Y29kZT5leHRlbnQud2lkdGg8L2NvZGU+IGFuZCA8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCBhbmQgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA2IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX1RZUEVfMUQ8L2NvZGU+LCBib3RoIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IGFuZCA8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+LCA8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1taXBMZXZlbHMtMDA5NTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgY29tcGxldGUgbWlwbWFwIGNoYWluIGJhc2VkIG9uIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5leHRlbnQud2lkdGg8L2NvZGU+PC9zcGFuPiwgPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+PC9zcGFuPiwgYW5kIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+PC9zcGFuPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMjI1NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1pcExldmVsczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPmltYWdlQ3JlYXRlTWF4TWlwTGV2ZWxzPC9jb2RlPiAoYXMgZGVmaW5lZCBpbiA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1jcmVhdGlvbi1saW1pdHNcIj5JbWFnZSBDcmVhdGlvbiBMaW1pdHM8L2E+KS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWFycmF5TGF5ZXJzLTAyMjU2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5pbWFnZUNyZWF0ZU1heEFycmF5TGF5ZXJzPC9jb2RlPiAoYXMgZGVmaW5lZCBpbiA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1jcmVhdGlvbi1saW1pdHNcIj5JbWFnZSBDcmVhdGlvbiBMaW1pdHM8L2E+KS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk2MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVFlQRV8zRDwvY29kZT4sIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtMDIyNTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zYW1wbGVzPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfU0FNUExFX0NPVU5UXzFfQklUPC9jb2RlPiwgdGhlbiA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQ8L2NvZGU+LCA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIDxjb2RlPjE8L2NvZGU+LCBhbmQgPGNvZGU+aW1hZ2VDcmVhdGVNYXliZUxpbmVhcjwvY29kZT4gKGFzIGRlZmluZWQgaW4gPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtY3JlYXRpb24tbGltaXRzXCI+SW1hZ2UgQ3JlYXRpb24gTGltaXRzPC9hPikgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+ZmFsc2U8L2NvZGU+LCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51c2FnZTwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgdGhlbiBiaXRzIG90aGVyIHRoYW4gPGNvZGU+VktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgYW5kIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMDk2NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnVzYWdlPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhGcmFtZWJ1ZmZlcldpZHRoPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51c2FnZTwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCA8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heEZyYW1lYnVmZmVySGVpZ2h0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51c2FnZTwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gY29udGFpbiBhdCBsZWFzdCBvbmUgb2YgPGNvZGU+VktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2FtcGxlcy0wMjI1OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgYml0IHZhbHVlIHRoYXQgaXMgc2V0IGluIDxjb2RlPmltYWdlQ3JlYXRlU2FtcGxlQ291bnRzPC9jb2RlPiAoYXMgZGVmaW5lZCBpbiA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1jcmVhdGlvbi1saW1pdHNcIj5JbWFnZSBDcmVhdGlvbiBMaW1pdHM8L2E+KS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGVcIj5tdWx0aXNhbXBsZWQgc3RvcmFnZSBpbWFnZXM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCA8Y29kZT51c2FnZTwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQ8L2NvZGU+LCA8Y29kZT5zYW1wbGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TQU1QTEVfQ09VTlRfMV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMDk2OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNwYXJzZUJpbmRpbmdcIj5zcGFyc2UgYmluZGluZ3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDE5MjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zcGFyc2VSZXNpZGVuY3lBbGlhc2VkXCI+c3BhcnNlIGFsaWFzZWQgcmVzaWRlbmN5PC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVFlQRV8xRDwvY29kZT4sIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zcGFyc2VSZXNpZGVuY3lJbWFnZTJEXCI+c3BhcnNlIHJlc2lkZW5jeSBmb3IgMkQgaW1hZ2VzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgPGNvZGU+aW1hZ2VUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPiwgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNwYXJzZVJlc2lkZW5jeUltYWdlM0RcIj5zcGFyc2UgcmVzaWRlbmN5IGZvciAzRCBpbWFnZXM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTczIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc3BhcnNlUmVzaWRlbmN5MlNhbXBsZXNcIj5zcGFyc2UgcmVzaWRlbmN5IGZvciBpbWFnZXMgd2l0aCAyIHNhbXBsZXM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVFlQRV8yRDwvY29kZT4sIGFuZCA8Y29kZT5zYW1wbGVzPC9jb2RlPiBpcyA8Y29kZT5WS19TQU1QTEVfQ09VTlRfMl9CSVQ8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTc0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc3BhcnNlUmVzaWRlbmN5NFNhbXBsZXNcIj5zcGFyc2UgcmVzaWRlbmN5IGZvciBpbWFnZXMgd2l0aCA0IHNhbXBsZXM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVFlQRV8yRDwvY29kZT4sIGFuZCA8Y29kZT5zYW1wbGVzPC9jb2RlPiBpcyA8Y29kZT5WS19TQU1QTEVfQ09VTlRfNF9CSVQ8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTc1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc3BhcnNlUmVzaWRlbmN5OFNhbXBsZXNcIj5zcGFyc2UgcmVzaWRlbmN5IGZvciBpbWFnZXMgd2l0aCA4IHNhbXBsZXM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVFlQRV8yRDwvY29kZT4sIGFuZCA8Y29kZT5zYW1wbGVzPC9jb2RlPiBpcyA8Y29kZT5WS19TQU1QTEVfQ09VTlRfOF9CSVQ8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTc2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzXCI+c3BhcnNlIHJlc2lkZW5jeSBmb3IgaW1hZ2VzIHdpdGggMTYgc2FtcGxlczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+aW1hZ2VUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPiwgYW5kIDxjb2RlPnNhbXBsZXM8L2NvZGU+IGlzIDxjb2RlPlZLX1NBTVBMRV9DT1VOVF8xNl9CSVQ8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDA5ODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBjb250YWluIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1Ob25lLTAxOTI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSBiaXRzIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUPC9jb2RlPiBhcmUgc2V0LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhbHNvIGJlIHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW5pdGlhbExheW91dC0wMDk5MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluaXRpYWxMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVlwiPlZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WPC9hPiwgPGEgaHJlZj1cIiNWa0V4dGVybmFsRm9ybWF0QU5EUk9JRFwiPlZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEPC9hPiwgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvXCI+VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzwvYT4sIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WXCI+VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WPC9hPiwgPGEgaHJlZj1cIiNWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQ8L2E+LCA8YSBocmVmPVwiI1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQ8L2E+LCA8YSBocmVmPVwiI1ZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUlwiPlZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjwvYT4sIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDwvYT4sIG9yIDxhIGhyZWY9XCIjVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFJcIj5Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlRmxhZ0JpdHNcIj5Wa0ltYWdlQ3JlYXRlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VUeXBlXCI+VmtJbWFnZVR5cGU8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2FtcGxlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlQ291bnRGbGFnQml0c1wiPlZrU2FtcGxlQ291bnRGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXRpbGluZy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50aWxpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVGlsaW5nXCI+VmtJbWFnZVRpbGluZzwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtJbWFnZVVzYWdlRmxhZ0JpdHNcIj5Wa0ltYWdlVXNhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT51c2FnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zaGFyaW5nTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2hhcmluZ01vZGVcIj5Wa1NoYXJpbmdNb2RlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW5pdGlhbExheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbml0aWFsTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZUxheW91dFwiPlZrSW1hZ2VMYXlvdXQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMTM5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNoYXJpbmdNb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVDwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUXVldWVGYW1pbHlJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUgYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50PC9jb2RlPiByZXR1cm5lZCBieSA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXNcIj52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzPC9hPiBmb3IgdGhlIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxNDIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBRdWV1ZUZhbWlseUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSBhbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ8L2NvZGU+IHJldHVybmVkIGJ5IGVpdGhlciA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXNcIj52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzPC9hPiBvciA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyXCI+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczI8L2E+IGZvciB0aGUgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMDk0MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0ZPUk1BVF9VTkRFRklORUQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAxOTc0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEZvcm1hdEFORFJPSURcIj5Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRDwvYT4gc3RydWN0dXJlLCBhbmQgaXRzIDxjb2RlPmV4dGVybmFsRm9ybWF0PC9jb2RlPiBtZW1iZXIgaXMgbm9uLXplcm8gdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRk9STUFUX1VOREVGSU5FRDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMTk3NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gZG9lcyBub3QgaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEZvcm1hdEFORFJPSURcIj5Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRDwvYT4gc3RydWN0dXJlLCBvciBkb2VzIGFuZCBpdHMgPGNvZGU+ZXh0ZXJuYWxGb3JtYXQ8L2NvZGU+IG1lbWJlciBpcyA8Y29kZT4wPC9jb2RlPiwgdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0ZPUk1BVF9VTkRFRklORUQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIzOTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvXCI+VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIHdob3NlIDxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBtZW1iZXIgaW5jbHVkZXMgPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEPC9jb2RlPiwgPGNvZGU+aW1hZ2VUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb1wiPlZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSB3aG9zZSA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gbWVtYmVyIGluY2x1ZGVzIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRDwvY29kZT4sIDxjb2RlPm1pcExldmVsczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWl0aGVyIGJlIDxjb2RlPjE8L2NvZGU+IG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBjb21wbGV0ZSBtaXBtYXAgY2hhaW4gYmFzZWQgb24gPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPmV4dGVudC53aWR0aDwvY29kZT48L3NwYW4+LCA8c3BhbiBjbGFzcz1cImVxXCI+PGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT48L3NwYW4+LCBhbmQgPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT48L3NwYW4+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIzOTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0V4dGVybmFsRm9ybWF0QU5EUk9JRFwiPlZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEPC9hPiBzdHJ1Y3R1cmUgd2hvc2UgPGNvZGU+ZXh0ZXJuYWxGb3JtYXQ8L2NvZGU+IG1lbWJlciBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEZvcm1hdEFORFJPSURcIj5Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRDwvYT4gc3RydWN0dXJlIHdob3NlIDxjb2RlPmV4dGVybmFsRm9ybWF0PC9jb2RlPiBtZW1iZXIgaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT51c2FnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgYW55IHVzYWdlcyBleGNlcHQgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIzOTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0V4dGVybmFsRm9ybWF0QU5EUk9JRFwiPlZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEPC9hPiBzdHJ1Y3R1cmUgd2hvc2UgPGNvZGU+ZXh0ZXJuYWxGb3JtYXQ8L2NvZGU+IG1lbWJlciBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnRpbGluZzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfVElMSU5HX09QVElNQUw8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVDwvY29kZT4sIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfVFlQRV8yRDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtMDI1NTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zYW1wbGVzPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfU0FNUExFX0NPVU5UXzFfQklUPC9jb2RlPiwgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMjU1OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnVzYWdlPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUPC9jb2RlPiwgPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gXFwoXFxsY2VpbHtcXGZyYWN7bWF4RnJhbWVidWZmZXJXaWR0aH17bWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplX3t3aWR0aH19fVxccmNlaWxcXCkiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAyNTYwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dXNhZ2U8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQ8L2NvZGU+LCA8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gXFwoXFxsY2VpbHtcXGZyYWN7bWF4RnJhbWVidWZmZXJIZWlnaHR9e21pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZV97aGVpZ2h0fX19XFxyY2VpbFxcKSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVDwvY29kZT4sIDxjb2RlPnRpbGluZzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfVElMSU5HX09QVElNQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjU2NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUPC9jb2RlPiwgPGNvZGU+aW1hZ2VUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVDwvY29kZT4sIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNTY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQ8L2NvZGU+LCA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDA5NTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUPC9jb2RlPiwgPGNvZGU+aW1hZ2VUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9UWVBFXzNEPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMTg5MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBwcm90ZWN0ZWQgbWVtb3J5IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19JTUFHRV9DUkVBVEVfUFJPVEVDVEVEX0JJVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1Ob25lLTAxODkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIHRoZSBiaXRzIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUPC9jb2RlPiBhcmUgc2V0LCA8Y29kZT5WS19JTUFHRV9DUkVBVEVfUFJPVEVDVEVEX0JJVDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFsc28gYmUgc2V0LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeSkrKFZLX05WX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAwOTg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WXCI+VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WPC9hPiBzdHJ1Y3R1cmUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIGEgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvXCI+VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAwOTkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb1wiPlZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSwgaXRzIDxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBjb250YWluIGJpdHMgdGhhdCBhcmUgYWxzbyBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNcIj5Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9hPjo6PGNvZGU+ZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzLmNvbXBhdGlibGVIYW5kbGVUeXBlczwvY29kZT4sIGFzIHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJcIj52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvYT4gd2l0aCA8Y29kZT5mb3JtYXQ8L2NvZGU+LCA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+LCA8Y29kZT50aWxpbmc8L2NvZGU+LCA8Y29kZT51c2FnZTwvY29kZT4sIGFuZCA8Y29kZT5mbGFnczwvY29kZT4gZXF1YWwgdG8gdGhvc2UgaW4gdGhpcyBzdHJ1Y3R1cmUsIGFuZCB3aXRoIGEgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm9cIj5Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm88L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluLCB3aXRoIGEgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gZXF1YWwgdG8gYW55IG9uZSBvZiB0aGUgaGFuZGxlIHR5cGVzIHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9leHRlcm5hbF9tZW1vcnkrVktfTlZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAwOTkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WXCI+VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WPC9hPiBzdHJ1Y3R1cmUsIGl0cyA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gbWVtYmVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgY29udGFpbiBiaXRzIHRoYXQgYXJlIGFsc28gaW4gPGEgaHJlZj1cIiNWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlZcIj5Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlY8L2E+Ojo8Y29kZT5leHRlcm5hbE1lbW9yeVByb3BlcnRpZXMuY29tcGF0aWJsZUhhbmRsZVR5cGVzPC9jb2RlPiwgYXMgcmV0dXJuZWQgYnkgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVlwiPnZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WPC9hPiB3aXRoIDxjb2RlPmZvcm1hdDwvY29kZT4sIDxjb2RlPmltYWdlVHlwZTwvY29kZT4sIDxjb2RlPnRpbGluZzwvY29kZT4sIDxjb2RlPnVzYWdlPC9jb2RlPiwgYW5kIDxjb2RlPmZsYWdzPC9jb2RlPiBlcXVhbCB0byB0aG9zZSBpbiB0aGlzIHN0cnVjdHVyZSwgYW5kIHdpdGggPGNvZGU+ZXh0ZXJuYWxIYW5kbGVUeXBlPC9jb2RlPiBlcXVhbCB0byBhbnkgb25lIG9mIHRoZSBoYW5kbGUgdHlwZXMgc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WXCI+VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcGh5c2ljYWxEZXZpY2VDb3VudC0wMTQyMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBsb2dpY2FsIGRldmljZSB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm9cIj5Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPnBoeXNpY2FsRGV2aWNlQ291bnQ8L2NvZGU+IGVxdWFsIHRvIDEsIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMjU5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUExJVF9JTlNUQU5DRV9CSU5EX1JFR0lPTlNfQklUPC9jb2RlPiwgdGhlbiA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZSwgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZSwgPGNvZGU+aW1hZ2VUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPi4gYW5kIDxjb2RlPmltYWdlQ3JlYXRlTWF5YmVMaW5lYXI8L2NvZGU+IChhcyBkZWZpbmVkIGluIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLWNyZWF0aW9uLWxpbWl0c1wiPkltYWdlIENyZWF0aW9uIExpbWl0czwvYT4pIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPmZhbHNlPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMTU3MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVDwvY29kZT4sIHRoZW4gPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIDxhIGhyZWY9XCIjYXBwZW5kaXgtY29tcHJlc3NlZHRleC1iY1wiPmJsb2NrLWNvbXByZXNzZWQgaW1hZ2UgZm9ybWF0PC9hPiwgYW4gPGEgaHJlZj1cIiNhcHBlbmRpeC1jb21wcmVzc2VkdGV4LWV0YzJcIj5FVEMgY29tcHJlc3NlZCBpbWFnZSBmb3JtYXQ8L2E+LCBvciBhbiA8YSBocmVmPVwiI2FwcGVuZGl4LWNvbXByZXNzZWR0ZXgtYXN0Y1wiPkFTVEMgY29tcHJlc3NlZCBpbWFnZSBmb3JtYXQ8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDE1NzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVQ8L2NvZGU+LCB0aGVuIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVDwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfbWVtb3J5LFZLX05WX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAxNDQzIiwKKyAgICAgICAgICAidGV4dCI6ICIgICAgIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSBpZmRlZjo6VktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeVs8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPC9hPl0iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI1NjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgaW1hZ2UgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBvbmUgb2YgdGhvc2UgbGlzdGVkIGluIDxhIGhyZWY9XCIjZm9ybWF0cy1yZXF1aXJpbmctc2FtcGxlci15Y2Jjci1jb252ZXJzaW9uXCI+Rm9ybWF0cyByZXF1aXJpbmcgc2FtcGxlciBZJiM4MjE3O0M8c3ViPkI8L3N1Yj5DPHN1Yj5SPC9zdWI+IGNvbnZlcnNpb24gZm9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ8L2NvZGU+IGltYWdlIHZpZXdzPC9hPiwgdGhlbiA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDEiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjU2MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBpbWFnZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIG9uZSBvZiB0aG9zZSBsaXN0ZWQgaW4gPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5Gb3JtYXRzIHJlcXVpcmluZyBzYW1wbGVyIFkmIzgyMTc7QzxzdWI+Qjwvc3ViPkM8c3ViPlI8L3N1Yj4gY29udmVyc2lvbiBmb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDwvY29kZT4gaW1hZ2Ugdmlld3M8L2E+LCA8Y29kZT5zYW1wbGVzPC9jb2RlPiBtdXN0IGJlIDxjb2RlPlZLX1NBTVBMRV9DT1VOVF8xX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjU2MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBpbWFnZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIG9uZSBvZiB0aG9zZSBsaXN0ZWQgaW4gPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5Gb3JtYXRzIHJlcXVpcmluZyBzYW1wbGVyIFkmIzgyMTc7QzxzdWI+Qjwvc3ViPkM8c3ViPlI8L3N1Yj4gY29udmVyc2lvbiBmb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDwvY29kZT4gaW1hZ2Ugdmlld3M8L2E+LCA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZUNyZWF0ZUZvcm1hdEZlYXR1cmVzLTAyMjYwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIDxlbT5tdWx0aS1wbGFuYXI8L2VtPiBmb3JtYXQsIGFuZCBpZiA8Y29kZT5pbWFnZUNyZWF0ZUZvcm1hdEZlYXR1cmVzPC9jb2RlPiAoYXMgZGVmaW5lZCBpbiA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1jcmVhdGlvbi1saW1pdHNcIj5JbWFnZSBDcmVhdGlvbiBMaW1pdHM8L2E+KSBkb2VzIG5vdCBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX0RJU0pPSU5UX0JJVDwvY29kZT4sIHRoZW4gPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDE1NzciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIG5vdCBhIDxlbT5tdWx0aS1wbGFuYXI8L2VtPiBmb3JtYXQsIGFuZCA8Y29kZT5mbGFnczwvY29kZT4gZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUPC9jb2RlPiwgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSsoVktfRVhUX3ljYmNyX2ltYWdlX2FycmF5cykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjY1MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBpbWFnZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIG9uZSBvZiB0aG9zZSBsaXN0ZWQgaW4gPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5Gb3JtYXRzIHJlcXVpcmluZyBzYW1wbGVyIFkmIzgyMTc7QzxzdWI+Qjwvc3ViPkM8c3ViPlI8L3N1Yj4gY29udmVyc2lvbiBmb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDwvY29kZT4gaW1hZ2Ugdmlld3M8L2E+LCBhbmQgdGhlIDxjb2RlPnljYmNySW1hZ2VBcnJheXM8L2NvZGU+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSAxIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSshKFZLX0VYVF95Y2Jjcl9pbWFnZV9hcnJheXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI1NjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgaW1hZ2UgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBvbmUgb2YgdGhvc2UgbGlzdGVkIGluIDxhIGhyZWY9XCIjZm9ybWF0cy1yZXF1aXJpbmctc2FtcGxlci15Y2Jjci1jb252ZXJzaW9uXCI+Rm9ybWF0cyByZXF1aXJpbmcgc2FtcGxlciBZJiM4MjE3O0M8c3ViPkI8L3N1Yj5DPHN1Yj5SPC9zdWI+IGNvbnZlcnNpb24gZm9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ8L2NvZGU+IGltYWdlIHZpZXdzPC9hPiwgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDEiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdGlsaW5nLTAyMjYxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dGlsaW5nPC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQ8L2NvZGU+LCB0aGVuIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBleGFjdGx5IG9uZSBvZiA8YSBocmVmPVwiI1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQ8L2E+IG9yIDxhIGhyZWY9XCIjVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMjI2MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQ8L2E+IG9yIDxhIGhyZWY9XCIjVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUsIHRoZW4gPGNvZGU+dGlsaW5nPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby10aWxpbmctMDIzNTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT50aWxpbmc8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVDwvY29kZT4gYW5kIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUPC9jb2RlPiwgdGhlbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYW4gPGEgaHJlZj1cIiNWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFJcIj5Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSB3aXRoIG5vbi16ZXJvIDxjb2RlPnZpZXdGb3JtYXRDb3VudDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDE1MzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUPC9jb2RlPiA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgZGVwdGggb3IgZGVwdGgvc3RlbmNpbCBmb3JtYXQiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9zZXBhcmF0ZV9zdGVuY2lsX3VzYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNzk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0LCA8Y29kZT51c2FnZTwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIGFuZCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVFwiPlZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUsIHRoZW4gaXRzIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDwvYT46Ojxjb2RlPnN0ZW5jaWxVc2FnZTwvY29kZT4gbWVtYmVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNzk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0LCA8Y29kZT51c2FnZTwvY29kZT4gZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSwgdGhlbiBpdHMgPGEgaHJlZj1cIiNWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVFwiPlZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUPC9hPjo6PGNvZGU+c3RlbmNpbFVzYWdlPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNzk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0LCA8Y29kZT51c2FnZTwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSwgdGhlbiBpdHMgPGEgaHJlZj1cIiNWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVFwiPlZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUPC9hPjo6PGNvZGU+c3RlbmNpbFVzYWdlPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBpbmNsdWRlIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjc5OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgYSBkZXB0aC1zdGVuY2lsIGZvcm1hdCwgPGNvZGU+dXNhZ2U8L2NvZGU+IGRvZXMgbm90IGluY2x1ZGUgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSwgdGhlbiBpdHMgPGEgaHJlZj1cIiNWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVFwiPlZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUPC9hPjo6PGNvZGU+c3RlbmNpbFVzYWdlPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1Gb3JtYXQtMDI1MzYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Gb3JtYXQ8L2NvZGU+IGlzIGEgZGVwdGgtc3RlbmNpbCBmb3JtYXQgYW5kIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSB3aXRoIGl0cyA8Y29kZT5zdGVuY2lsVXNhZ2U8L2NvZGU+IG1lbWJlciBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCA8Y29kZT5leHRlbnQud2lkdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RnJhbWVidWZmZXJXaWR0aDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjUzNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZvcm1hdDwvY29kZT4gaXMgYSBkZXB0aC1zdGVuY2lsIGZvcm1hdCBhbmQgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIHdpdGggaXRzIDxjb2RlPnN0ZW5jaWxVc2FnZTwvY29kZT4gbWVtYmVyIGluY2x1ZGluZyA8Y29kZT5WS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RnJhbWVidWZmZXJIZWlnaHQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI1MzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZVwiPm11bHRpc2FtcGxlZCBzdG9yYWdlIGltYWdlczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0IGFuZCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVFwiPlZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUgd2l0aCBpdHMgPGNvZGU+c3RlbmNpbFVzYWdlPC9jb2RlPiBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQ8L2NvZGU+LCA8Y29kZT5zYW1wbGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TQU1QTEVfQ09VTlRfMV9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9jb3JuZXJfc2FtcGxlZF9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMDUwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlY8L2NvZGU+LCA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1RZUEVfM0Q8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjA1MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQ8L2NvZGU+IGFuZCB0aGUgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDIwNTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gYW5kIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVFlQRV8yRDwvY29kZT4sIDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4gYW5kIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDIwNTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gYW5kIDxjb2RlPmltYWdlVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVFlQRV8zRDwvY29kZT4sIDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4sIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+LCBhbmQgPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMjA4MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnVzYWdlPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WPC9jb2RlPiwgPGNvZGU+aW1hZ2VUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtMDIwODMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51c2FnZTwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVjwvY29kZT4sIDxjb2RlPnNhbXBsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NBTVBMRV9DT1VOVF8xX0JJVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby10aWxpbmctMDIwODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51c2FnZTwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVjwvY29kZT4sIDxjb2RlPnRpbGluZzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfVElMSU5HX09QVElNQUw8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfc2VwYXJhdGVfc3RlbmNpbF91c2FnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhULXN0ZW5jaWxVc2FnZS0wMjUzOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN0ZW5jaWxVc2FnZTwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgYml0cyBvdGhlciB0aGFuIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVC1zdGVuY2lsVXNhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RlbmNpbFVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtJbWFnZVVzYWdlRmxhZ0JpdHNcIj5Wa0ltYWdlVXNhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVC1zdGVuY2lsVXNhZ2UtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RlbmNpbFVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViI6IHsKKyAgICAgICIoVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVi1kZWRpY2F0ZWRBbGxvY2F0aW9uLTAwOTk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVkaWNhdGVkQWxsb2NhdGlvbjwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIDxjb2RlPlZrSW1hZ2VDcmVhdGVJbmZvPC9jb2RlPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQ1JFQVRFX0lORk9fTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNcIj5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViI6IHsKKyAgICAgICIoVktfTlZfZXh0ZXJuYWxfbWVtb3J5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVi1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVlwiPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVjwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQiOiB7CisgICAgICAiKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQtZXh0ZXJuYWxGb3JtYXQtMDE4OTQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5leHRlcm5hbEZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gb3IgYSB2YWx1ZSByZXR1cm5lZCBpbiB0aGUgPGNvZGU+ZXh0ZXJuYWxGb3JtYXQ8L2NvZGU+IG1lbWJlciBvZiA8YSBocmVmPVwiI1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSURcIj5Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEPC9hPiBieSBhbiBlYXJsaWVyIGNhbGwgdG8gPGEgaHJlZj1cIiN2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEXCI+dmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXh0ZXJuYWxGb3JtYXRBTkRST0lELXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZPUk1BVF9BTkRST0lEPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSsoVktfS0hSX3N3YXBjaGFpbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXN3YXBjaGFpbi0wMDk5NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZSBmaWVsZHMgb2YgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGUgPGEgaHJlZj1cIiNzd2FwY2hhaW4td3NpLWltYWdlLWNyZWF0ZS1pbmZvXCI+aW1wbGllZCBpbWFnZSBjcmVhdGlvbiBwYXJhbWV0ZXJzPC9hPiBvZiB0aGUgc3dhcGNoYWluIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFItc3dhcGNoYWluLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3dhcGNoYWluS0hSXCI+VmtTd2FwY2hhaW5LSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2ltYWdlX2Zvcm1hdF9saXN0KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSLXZpZXdGb3JtYXRDb3VudC0wMTU3OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZpZXdGb3JtYXRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbGwgb2YgdGhlIGZvcm1hdHMgaW4gdGhlIDxjb2RlPnBWaWV3Rm9ybWF0czwvY29kZT4gYXJyYXkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IGZpZWxkIG9mIDxjb2RlPlZrSW1hZ2VDcmVhdGVJbmZvPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIHRoZSA8YSBocmVmPVwiI2Zvcm1hdHMtY29tcGF0aWJpbGl0eVwiPmNvbXBhdGliaWxpdHkgdGFibGU8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSLWZsYWdzLTAxNTc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtJbWFnZUNyZWF0ZUluZm88L2NvZGU+Ojo8Y29kZT5mbGFnczwvY29kZT4gZG9lcyBub3QgY29udGFpbiA8Y29kZT5WS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUPC9jb2RlPiwgPGNvZGU+dmlld0Zvcm1hdENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBvciA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUi12aWV3Rm9ybWF0Q291bnQtMDE1ODAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52aWV3Rm9ybWF0Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+VmtJbWFnZUNyZWF0ZUluZm88L2NvZGU+Ojo8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIDxjb2RlPnBWaWV3Rm9ybWF0czwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSLXBWaWV3Rm9ybWF0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52aWV3Rm9ybWF0Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFZpZXdGb3JtYXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dmlld0Zvcm1hdENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhULXBEcm1Gb3JtYXRNb2RpZmllcnMtMDIyNjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxlbT5tb2RpZmllcjwvZW0+IGluIDxjb2RlPnBEcm1Gb3JtYXRNb2RpZmllcnM8L2NvZGU+IG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gYW5kIGl0cyA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4sIGFzIGRldGVybWluZWQgYnkgcXVlcnlpbmcgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMlwiPlZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yPC9hPiBleHRlbmRlZCB3aXRoIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUXCI+VmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVC1wRHJtRm9ybWF0TW9kaWZpZXJzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEcm1Gb3JtYXRNb2RpZmllcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kcm1Gb3JtYXRNb2RpZmllckNvdW50PC9jb2RlPiA8Y29kZT51aW50NjRfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVC1kcm1Gb3JtYXRNb2RpZmllckNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHJtRm9ybWF0TW9kaWZpZXJDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1kcm1Gb3JtYXRNb2RpZmllci0wMjI2NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRybUZvcm1hdE1vZGlmaWVyPC9jb2RlPiBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IGFuZCBpdHMgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluLCBhcyBkZXRlcm1pbmVkIGJ5IHF1ZXJ5aW5nIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzJcIj5Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjwvYT4gZXh0ZW5kZWQgd2l0aCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVDwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQtZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50LTAyMjY1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byB0aGUgPGEgaHJlZj1cIiNWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVFwiPlZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+ZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+Zm9ybWF0PC9jb2RlPiBhbmQgPGNvZGU+ZHJtRm9ybWF0TW9kaWZpZXI8L2NvZGU+LCBhcyBmb3VuZCBieSBxdWVyeWluZyA8YSBocmVmPVwiI1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVFwiPlZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVDwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQtc2l6ZS0wMjI2NyIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFBsYW5lTGF5b3V0czwvY29kZT4sIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDAiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1hcnJheVBpdGNoLTAyMjY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUGxhbmVMYXlvdXRzPC9jb2RlPiwgPGNvZGU+YXJyYXlQaXRjaDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgMCBpZiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5hcnJheUxheWVyczwvY29kZT4gaXMgMS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1kZXB0aFBpdGNoLTAyMjY5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUGxhbmVMYXlvdXRzPC9jb2RlPiwgPGNvZGU+ZGVwdGhQaXRjaDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgMCBpZiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IGlzIDEuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQtcFBsYW5lTGF5b3V0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFBsYW5lTGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1N1YnJlc291cmNlTGF5b3V0XCI+VmtTdWJyZXNvdXJjZUxheW91dDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCI6IHsKKyAgICAgICIhKFZLX0VYVF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLTAwOTk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+dGlsaW5nPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19JTUFHRV9USUxJTkdfTElORUFSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtaW1hZ2UtMDIyNzAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT50aWxpbmc8L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX0lNQUdFX1RJTElOR19MSU5FQVI8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC10aWxpbmctMDIyNzEiLAorICAgICAgICAgICJ0ZXh0IjogIiAgSWYgdGhlIDxjb2RlPnRpbGluZzwvY29kZT4gb2YgdGhlIDxjb2RlPmltYWdlPC9jb2RlPiBpcyAgPGNvZGU+VktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUPC9jb2RlPiwgdGhlbiB0aGUgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gIG1lbWJlciBvZiA8Y29kZT5wU3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlICA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FX2lfQklUX0VYVDwvY29kZT4gYW5kIHRoZSBpbmRleCA8Y29kZT5pPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiAgYmUgbGVzcyB0aGFuIHRoZSAgPGEgaHJlZj1cIiNWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVFwiPjxjb2RlPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudDwvY29kZT48L2E+ICBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlJiM4MjE3O3MgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPjxjb2RlPmZvcm1hdDwvY29kZT48L2E+IGFuZCA8YSBocmVmPVwiI1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFRcIj48Y29kZT5kcm1Gb3JtYXRNb2RpZmllcjwvY29kZT48L2E+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtYXNwZWN0TWFzay0wMDk5NyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGhhdmUgYSBzaW5nbGUgYml0IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LW1pcExldmVsLTAxNzE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPm1pcExldmVsPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIDxjb2RlPm1pcExldmVsczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1hcnJheUxheWVyLTAxNzE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmFycmF5TGF5ZXI8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wU3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LXBTdWJyZXNvdXJjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVN1YnJlc291cmNlXCI+VmtJbWFnZVN1YnJlc291cmNlPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1wTGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtTdWJyZXNvdXJjZUxheW91dFwiPlZrU3VicmVzb3VyY2VMYXlvdXQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWZvcm1hdC0wMTU4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT50aWxpbmc8L2NvZGU+IG9mIHRoZSA8Y29kZT5pbWFnZTwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVElMSU5HX0xJTkVBUjwvY29kZT4gYW5kIGl0cyA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5tdWx0aS1wbGFuYXIgZm9ybWF0PC9hPiB3aXRoIHR3byBwbGFuZXMsIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1mb3JtYXQtMDE1ODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+dGlsaW5nPC9jb2RlPiBvZiB0aGUgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX1RJTElOR19MSU5FQVI8L2NvZGU+IGFuZCBpdHMgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyBhIDxhIGhyZWY9XCIjZm9ybWF0cy1yZXF1aXJpbmctc2FtcGxlci15Y2Jjci1jb252ZXJzaW9uXCI+bXVsdGktcGxhbmFyIGZvcm1hdDwvYT4gd2l0aCB0aHJlZSBwbGFuZXMsIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLTAxODk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRDwvY29kZT4gZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSB0eXBlLCB0aGVuIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byBtZW1vcnkuIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbWFnZVN1YnJlc291cmNlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZS1hc3BlY3RNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlQXNwZWN0RmxhZ0JpdHNcIj5Wa0ltYWdlQXNwZWN0RmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULWltYWdlLTAyMjcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPjxjb2RlPnRpbGluZzwvY29kZT48L2E+IGVxdWFsIHRvIDxjb2RlPlZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtaW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFRcIj5Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtaW1hZ2UtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIjogeworICAgICAgIihWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lJbWFnZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lJbWFnZS1pbWFnZS0wMTAwMCIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byA8Y29kZT5pbWFnZTwvY29kZT4sIGVpdGhlciBkaXJlY3RseSBvciB2aWEgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtMDEwMDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHByb3ZpZGVkIGhlcmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUltYWdlLWltYWdlLTAxMDAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkLCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW1hZ2UtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUltYWdlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lJbWFnZS1pbWFnZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZUltYWdlVmlldyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUltYWdlVmlldy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUltYWdlVmlldy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVmlld0NyZWF0ZUluZm9cIj5Wa0ltYWdlVmlld0NyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJbWFnZVZpZXctcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlSW1hZ2VWaWV3LXBWaWV3LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBWaWV3PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIG5vdCBjcmVhdGVkIHdpdGggPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQ8L2NvZGU+IHRoZW4gPGNvZGU+dmlld1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdmlld1R5cGUtMDEwMDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1pbWFnZUN1YmVBcnJheVwiPmltYWdlIGN1YmVtYXAgYXJyYXlzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT52aWV3VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLU5vbmUtMDIyNzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IG9mIHRoZSByZXN1bHRhbnQgaW1hZ2UgdmlldyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIGF0IGxlYXN0IG9uZSBiaXQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51c2FnZTwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ8L2NvZGU+LCB0aGVuIHRoZSA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gb2YgdGhlIHJlc3VsdGFudCBpbWFnZSB2aWV3IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXVzYWdlLTAyMjc1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dXNhZ2U8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1NUT1JBR0VfQklUPC9jb2RlPiwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklUPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby11c2FnZS0wMjI3NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnVzYWdlPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51c2FnZTwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby11c2FnZS0wMjY1MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnVzYWdlPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiBhdCBsZWFzdCBvbmUgb2YgPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE0NzgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3VicmVzb3VyY2VSYW5nZS0wMTcxOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX1JFTUFJTklOR19NSVBfTEVWRUxTPC9jb2RlPiwgPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsPC9jb2RlPiAmIzQzOyA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQ8L2NvZGU+PC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIDxjb2RlPm1pcExldmVsczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTAxOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUPC9jb2RlPiBmbGFnLCA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgPGNvZGU+Zm9ybWF0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5pbWFnZTwvY29kZT4sIGFzIGRlZmluZWQgaW4gPGEgaHJlZj1cIiNmb3JtYXRzLWNvbXBhdGliaWxpdHktY2xhc3Nlc1wiPkZvcm1hdCBDb21wYXRpYmlsaXR5IENsYXNzZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gaXMgbm9uLXNwYXJzZSB0aGVuIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3ViUmVzb3VyY2VSYW5nZS0wMTAyMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1YnJlc291cmNlUmFuZ2U8L2NvZGU+IGFuZCA8Y29kZT52aWV3VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBpbWFnZSwgYXMgZGVzY3JpYmVkIGluIHRoZSA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3cy1jb21wYXRpYmlsaXR5XCI+Y29tcGF0aWJpbGl0eSB0YWJsZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUXCI+VmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVDwvYT4sIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbzwvYT4sIG9yIDxhIGhyZWY9XCIjVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mb1wiPlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm88L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlVmlld0NyZWF0ZUZsYWdCaXRzXCI+VmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdmlld1R5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmlld1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tZm9ybWF0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tY29tcG9uZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21wb25lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21wb25lbnRNYXBwaW5nXCI+VmtDb21wb25lbnRNYXBwaW5nPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1YnJlc291cmNlUmFuZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9UWVBFXzNEPC9jb2RlPiBidXQgd2l0aG91dCA8Y29kZT5WS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVQ8L2NvZGU+IHNldCB0aGVuIDxjb2RlPnZpZXdUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzJEPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDE0ODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gaXMgbm90IGEgM0QgaW1hZ2UgY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVDwvY29kZT4gc2V0LCBvciA8Y29kZT52aWV3VHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZPC9jb2RlPiwgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNDgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUzwvY29kZT4sIDxjb2RlPmltYWdlPC9jb2RlPiBpcyBub3QgYSAzRCBpbWFnZSBjcmVhdGVkIHdpdGggPGNvZGU+VktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUPC9jb2RlPiBzZXQsIG9yIDxjb2RlPnZpZXdUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzJEPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVk8L2NvZGU+LCA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG5vbi16ZXJvIGFuZCA8c3BhbiBjbGFzcz1cImVxXCI+PGNvZGU+c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllcjwvY29kZT4gJiM0MzsgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50PC9jb2RlPjwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjcyNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiBpcyBhIDNEIGltYWdlIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVQ8L2NvZGU+IHNldCwgYW5kIDxjb2RlPnZpZXdUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4sIDxjb2RlPnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgZGVwdGggY29tcHV0ZWQgZnJvbSA8Y29kZT5iYXNlTWlwTGV2ZWw8L2NvZGU+IGFuZCA8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgZGVmaW5lZCBpbiA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1taXBsZXZlbC1zaXppbmdcIj5JbWFnZSBNaXBsZXZlbCBTaXppbmc8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDI3MjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTPC9jb2RlPiwgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIGEgM0QgaW1hZ2UgY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVDwvY29kZT4gc2V0LCBhbmQgPGNvZGU+dmlld1R5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZPC9jb2RlPiwgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBub24temVybyBhbmQgPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXI8L2NvZGU+ICYjNDM7IDxjb2RlPnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudDwvY29kZT48L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVwdGggY29tcHV0ZWQgZnJvbSA8Y29kZT5iYXNlTWlwTGV2ZWw8L2NvZGU+IGFuZCA8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgZGVmaW5lZCBpbiA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1taXBsZXZlbC1zaXppbmdcIj5JbWFnZSBNaXBsZXZlbCBTaXppbmc8L2E+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX0VYVF9mcmFnbWVudF9kZW5zaXR5X21hcCkrIShWS19OVl9zaGFkaW5nX3JhdGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBvZiA8Y29kZT5WS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1NUT1JBR0VfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSsoVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyMDg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgb2YgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9mcmFnbWVudF9kZW5zaXR5X21hcCkrIShWS19OVl9zaGFkaW5nX3JhdGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI1NjkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBvZiA8Y29kZT5WS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1NUT1JBR0VfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSsoVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyNTcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgb2YgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVjwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI1NzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCA8Y29kZT51c2FnZTwvY29kZT4gY29udGFpbmluZyA8Y29kZT5WS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUPC9jb2RlPiwgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWZsYWdzLTAyNTcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGEgaHJlZj1cIiNmZWF0dXJlcy1mcmFnbWVudGRlbnNpdHltYXBkeW5hbWljXCI+ZHluYW1pYyBmcmFnbWVudCBkZW5zaXR5IG1hcDwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX0lNQUdFX1ZJRVdfQ1JFQVRFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0RZTkFNSUNfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjU3MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjZmVhdHVyZXMtZnJhZ21lbnRkZW5zaXR5bWFwZHluYW1pY1wiPmR5bmFtaWMgZnJhZ21lbnQgZGVuc2l0eSBtYXA8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgYW5kIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIDxjb2RlPnVzYWdlPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQ8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gYW55IG9mIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9QUk9URUNURURfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNDgwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNzE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+VktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUzwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyPC9jb2RlPiAmIzQzOyA8Y29kZT5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQ8L2NvZGU+PC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMikrIShWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNzU5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQ8L2NvZGU+IGZsYWcsIGJ1dCB3aXRob3V0IHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVDwvY29kZT4gZmxhZywgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBjb21wYXRpYmxlIHdpdGggdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+aW1hZ2U8L2NvZGU+LCBhcyBkZWZpbmVkIGluIDxhIGhyZWY9XCIjZm9ybWF0cy1jb21wYXRpYmlsaXR5LWNsYXNzZXNcIj5Gb3JtYXQgQ29tcGF0aWJpbGl0eSBDbGFzc2VzPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNzYwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQ8L2NvZGU+IGZsYWcsIGFuZCBpZiB0aGUgPGNvZGU+Zm9ybWF0PC9jb2RlPiBvZiB0aGUgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIG5vdCBhIDxhIGhyZWY9XCIjZm9ybWF0cy1yZXF1aXJpbmctc2FtcGxlci15Y2Jjci1jb252ZXJzaW9uXCI+bXVsdGktcGxhbmFyPC9hPiBmb3JtYXQsIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPmltYWdlPC9jb2RlPiwgYXMgZGVmaW5lZCBpbiA8YSBocmVmPVwiI2Zvcm1hdHMtY29tcGF0aWJpbGl0eS1jbGFzc2VzXCI+Rm9ybWF0IENvbXBhdGliaWxpdHkgQ2xhc3NlczwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNzYxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQ8L2NvZGU+IGZsYWcsIGJ1dCB3aXRob3V0IHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVDwvY29kZT4gZmxhZywgYW5kIGlmIHRoZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IG9mIHRoZSA8Y29kZT5pbWFnZTwvY29kZT4gaXMgbm90IGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5tdWx0aS1wbGFuYXI8L2E+IGZvcm1hdCwgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBjb21wYXRpYmxlIHdpdGggdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+aW1hZ2U8L2NvZGU+LCBhcyBkZWZpbmVkIGluIDxhIGhyZWY9XCIjZm9ybWF0cy1jb21wYXRpYmlsaXR5LWNsYXNzZXNcIj5Gb3JtYXQgQ29tcGF0aWJpbGl0eSBDbGFzc2VzPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTU4MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVDwvY29kZT4gZmxhZywgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBjb21wYXRpYmxlIHdpdGgsIG9yIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIHVuY29tcHJlc3NlZCBmb3JtYXQgdGhhdCBpcyBzaXplLWNvbXBhdGlibGUgd2l0aCwgdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+aW1hZ2U8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNTg0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklUPC9jb2RlPiBmbGFnLCB0aGUgPGNvZGU+bGV2ZWxDb3VudDwvY29kZT4gYW5kIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IG1lbWJlcnMgb2YgPGNvZGU+c3VicmVzb3VyY2VSYW5nZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9pbWFnZV9mb3JtYXRfbGlzdCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1wTmV4dC0wMTU4NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSPC9jb2RlPiBzdHJ1Y3R1cmUgd2FzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgdGhlIDxjb2RlPlZrSW1hZ2VDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGNyZWF0aW5nIDxjb2RlPmltYWdlPC9jb2RlPiBhbmQgdGhlIDxjb2RlPnZpZXdGb3JtYXRDb3VudDwvY29kZT4gZmllbGQgb2YgPGNvZGU+VmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSPC9jb2RlPiBpcyBub3QgemVybyB0aGVuIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgb25lIG9mIHRoZSBmb3JtYXRzIGluIDxjb2RlPlZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjwvY29kZT46Ojxjb2RlPnBWaWV3Rm9ybWF0czwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNTg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQ8L2NvZGU+IGZsYWcsIGlmIHRoZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IG9mIHRoZSA8Y29kZT5pbWFnZTwvY29kZT4gaXMgYSA8YSBocmVmPVwiI2Zvcm1hdHMtcmVxdWlyaW5nLXNhbXBsZXIteWNiY3ItY29udmVyc2lvblwiPm11bHRpLXBsYW5hcjwvYT4gZm9ybWF0LCBhbmQgaWYgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrPC9jb2RlPiBpcyBvbmUgb2YgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUPC9jb2RlPiwgdGhlbiA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiBmb3IgdGhlIHBsYW5lIG9mIHRoZSA8Y29kZT5pbWFnZTwvY29kZT4gPGNvZGU+Zm9ybWF0PC9jb2RlPiBpbmRpY2F0ZWQgYnkgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrPC9jb2RlPiwgYXMgZGVmaW5lZCBpbiA8YSBocmVmPVwiI2Zvcm1hdHMtY29tcGF0aWJsZS1wbGFuZXNcIj5Db21wYXRpYmxlIGZvcm1hdHMgb2YgcGxhbmVzIG9mIG11bHRpLXBsYW5hciBmb3JtYXRzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNzYyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBub3QgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUPC9jb2RlPiBmbGFnLCBvciBpZiB0aGUgPGNvZGU+Zm9ybWF0PC9jb2RlPiBvZiB0aGUgPGNvZGU+aW1hZ2U8L2NvZGU+IGlzIGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5tdWx0aS1wbGFuYXI8L2E+IGZvcm1hdCBhbmQgaWYgPGNvZGU+c3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrPC9jb2RlPiBpcyA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUPC9jb2RlPiwgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpZGVudGljYWwgdG8gdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tcE5leHQtMDE5NzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvXCI+VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbzwvYT4gc3RydWN0dXJlIHdpdGggYSA8Y29kZT5jb252ZXJzaW9uPC9jb2RlPiB2YWx1ZSBvdGhlciB0aGFuIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIGFsbCBtZW1iZXJzIG9mIDxjb2RlPmNvbXBvbmVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgdGhlIHZhbHVlIDxjb2RlPlZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBub3QgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUPC9jb2RlPiBmbGFnLCA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGlkZW50aWNhbCB0byB0aGUgPGNvZGU+Zm9ybWF0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5pbWFnZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyMzk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGhhcyBhbiA8YSBocmVmPVwiI21lbW9yeS1leHRlcm5hbC1hbmRyb2lkLWhhcmR3YXJlLWJ1ZmZlci1leHRlcm5hbC1mb3JtYXRzXCI+ZXh0ZXJuYWwgZm9ybWF0PC9hPiwgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GT1JNQVRfVU5ERUZJTkVEPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjQwMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiBoYXMgYW4gPGEgaHJlZj1cIiNtZW1vcnktZXh0ZXJuYWwtYW5kcm9pZC1oYXJkd2FyZS1idWZmZXItZXh0ZXJuYWwtZm9ybWF0c1wiPmV4dGVybmFsIGZvcm1hdDwvYT4sIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mb1wiPlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm88L2E+IHN0cnVjdHVyZSB3aXRoIGEgPGNvZGU+Y29udmVyc2lvbjwvY29kZT4gb2JqZWN0IGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBleHRlcm5hbCBmb3JtYXQgYXMgPGNvZGU+aW1hZ2U8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyNDAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IGhhcyBhbiA8YSBocmVmPVwiI21lbW9yeS1leHRlcm5hbC1hbmRyb2lkLWhhcmR3YXJlLWJ1ZmZlci1leHRlcm5hbC1mb3JtYXRzXCI+ZXh0ZXJuYWwgZm9ybWF0PC9hPiwgYWxsIG1lbWJlcnMgb2YgPGNvZGU+Y29tcG9uZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFk8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyMDg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggPGNvZGU+dXNhZ2U8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVjwvY29kZT4sIDxjb2RlPnZpZXdUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjA4NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIDxjb2RlPnVzYWdlPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlY8L2NvZGU+LCA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0ZPUk1BVF9SOF9VSU5UPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMikrIShWS19FWFRfc2VwYXJhdGVfc3RlbmNpbF91c2FnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1wTmV4dC0wMjY2MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSwgaXRzIDxjb2RlPnVzYWdlPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgYW55IGJpdHMgdGhhdCB3ZXJlIG5vdCBzZXQgaW4gdGhlIDxjb2RlPnVzYWdlPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIHVzZWQgdG8gY3JlYXRlIDxjb2RlPmltYWdlPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpKyhWS19FWFRfc2VwYXJhdGVfc3RlbmNpbF91c2FnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1wTmV4dC0wMjY2MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSwgYW5kIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgbm90IGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiwgaXRzIDxjb2RlPnVzYWdlPC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgYW55IGJpdHMgdGhhdCB3ZXJlIG5vdCBzZXQgaW4gdGhlIDxjb2RlPnVzYWdlPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIHVzZWQgdG8gY3JlYXRlIDxjb2RlPmltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXBOZXh0LTAyNjYzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlLCA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiwgYW5kIDxjb2RlPnN1YlJlc291cmNlUmFuZ2UuYXNwZWN0TWFzazwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUPC9jb2RlPiwgdGhlIDxjb2RlPnVzYWdlPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbzwvYT4gaW5zdGFuY2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgYW55IGJpdHMgdGhhdCB3ZXJlIG5vdCBzZXQgaW4gdGhlIDxjb2RlPnVzYWdlPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIHVzZWQgdG8gY3JlYXRlIDxjb2RlPmltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXBOZXh0LTAyNjY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlLCA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiwgYW5kIDxjb2RlPnN1YlJlc291cmNlUmFuZ2UuYXNwZWN0TWFzazwvY29kZT4gaW5jbHVkZXMgYml0cyBvdGhlciB0aGFuIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDwvY29kZT4sIHRoZSA8Y29kZT51c2FnZTwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSBhbnkgYml0cyB0aGF0IHdlcmUgbm90IHNldCBpbiB0aGUgPGNvZGU+dXNhZ2U8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUgdXNlZCB0byBjcmVhdGUgPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8tdXNhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlVXNhZ2VGbGFnQml0c1wiPlZrSW1hZ2VVc2FnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1sZXZlbENvdW50LTAxNzIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bGV2ZWxDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX1JFTUFJTklOR19NSVBfTEVWRUxTPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1sYXllckNvdW50LTAxNzIxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPlZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlM8L2NvZGU+LCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWFzcGVjdE1hc2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrSW1hZ2VBc3BlY3RGbGFnQml0c1wiPlZrSW1hZ2VBc3BlY3RGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWFzcGVjdE1hc2stMDE2NzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUPC9jb2RlPiwgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSBhbnkgb2YgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLTAyMjc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV9pX0JJVF9FWFQ8L2NvZGU+IGZvciBhbnkgaW5kZXggPGNvZGU+aTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0NvbXBvbmVudE1hcHBpbmciOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tcG9uZW50U3dpenpsZVwiPlZrQ29tcG9uZW50U3dpenpsZTwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29tcG9uZW50TWFwcGluZy1nLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbXBvbmVudFN3aXp6bGVcIj5Wa0NvbXBvbmVudFN3aXp6bGU8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbXBvbmVudE1hcHBpbmctYi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5iPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21wb25lbnRTd2l6emxlXCI+VmtDb21wb25lbnRTd2l6emxlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLWEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tcG9uZW50U3dpenpsZVwiPlZrQ29tcG9uZW50U3dpenpsZTwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIjogeworICAgICAgIihWS19FWFRfYXN0Y19kZWNvZGVfbW9kZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQtZGVjb2RlTW9kZS0wMjIzMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlY29kZU1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZSBvZiA8Y29kZT5WS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NGTE9BVDwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTwvY29kZT4sIG9yIDxjb2RlPlZLX0ZPUk1BVF9FNUI5RzlSOV9VRkxPQVRfUEFDSzMyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVC1kZWNvZGVNb2RlLTAyMjMxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtYXN0Yy1kZWNvZGVNb2RlU2hhcmVkRXhwb25lbnRcIj48Y29kZT5kZWNvZGVNb2RlU2hhcmVkRXhwb25lbnQ8L2NvZGU+PC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kZWNvZGVNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULWRlY29kZU1vZGUtMDIyMzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZWNvZGVNb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19GT1JNQVRfUjhHOEI4QThfVU5PUk08L2NvZGU+IHRoZSBpbWFnZSB2aWV3IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIGJsb2NrcyB1c2luZyBhbnkgb2YgdGhlIEFTVEMgSERSIG1vZGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULWZvcm1hdC0wMjIzMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZvcm1hdDwvY29kZT4gb2YgdGhlIGltYWdlIHZpZXcgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgb25lIG9mIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzR4NF9VTk9STV9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzR4NF9TUkdCX0JMT0NLPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX0FTVENfNXg0X1VOT1JNX0JMT0NLPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX0FTVENfNXg0X1NSR0JfQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ181eDVfVU5PUk1fQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ181eDVfU1JHQl9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzZ4NV9VTk9STV9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzZ4NV9TUkdCX0JMT0NLPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX0FTVENfNng2X1VOT1JNX0JMT0NLPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX0FTVENfNng2X1NSR0JfQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ184eDVfVU5PUk1fQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ184eDVfU1JHQl9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzh4Nl9VTk9STV9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzh4Nl9TUkdCX0JMT0NLPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX0FTVENfOHg4X1VOT1JNX0JMT0NLPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX0FTVENfOHg4X1NSR0JfQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ18xMHg1X1VOT1JNX0JMT0NLPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX0FTVENfMTB4NV9TUkdCX0JMT0NLPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX0FTVENfMTB4Nl9VTk9STV9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzEweDZfU1JHQl9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzEweDhfVU5PUk1fQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ18xMHg4X1NSR0JfQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ18xMHgxMF9VTk9STV9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzEweDEwX1NSR0JfQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DSzwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0s8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfQVNUQ18xMngxMl9VTk9STV9CTE9DSzwvY29kZT4sIG9yIDxjb2RlPlZLX0ZPUk1BVF9BU1RDXzEyeDEyX1NSR0JfQkxPQ0s8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULWRlY29kZU1vZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVjb2RlTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95SW1hZ2VWaWV3IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUltYWdlVmlldy1pbWFnZVZpZXctMDEwMjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgc3VibWl0dGVkIGNvbW1hbmRzIHRoYXQgcmVmZXIgdG8gPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUltYWdlVmlldy1pbWFnZVZpZXctMDEwMjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LTAxMDI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUltYWdlVmlldy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlVmlldzwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmltYWdlVmlldzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW1hZ2VWaWV3LXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlVmlldzwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldEltYWdlVmlld0hhbmRsZU5WWCI6IHsKKyAgICAgICIoVktfTlZYX2ltYWdlX3ZpZXdfaGFuZGxlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgtcEluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYXCI+VmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgiOiB7CisgICAgICAiKFZLX05WWF9pbWFnZV92aWV3X2hhbmRsZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1kZXNjcmlwdG9yVHlwZS0wMjY1NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTwvY29kZT4sIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFPC9jb2RlPiwgb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtc2FtcGxlci0wMjY1NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZXJcIj5Wa1NhbXBsZXI8L2E+IGlmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1pbWFnZVZpZXctMDI2NTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBkZXNjcmlwdG9yVHlwZSBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTwvY29kZT4gb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI8L2NvZGU+LCB0aGUgaW1hZ2UgdGhhdCA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+IHdhcyBjcmVhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ8L2NvZGU+IHVzYWdlIGJpdCBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1pbWFnZVZpZXctMDI2NTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBkZXNjcmlwdG9yVHlwZSBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTwvY29kZT4sIHRoZSBpbWFnZSB0aGF0IDxjb2RlPmltYWdlVmlldzwvY29kZT4gd2FzIGNyZWF0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVDwvY29kZT4gdXNhZ2UgYml0IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfSEFORExFX0lORk9fTlZYPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtaW1hZ2VWaWV3LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlVmlldzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLWRlc2NyaXB0b3JUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yVHlwZVwiPlZrRGVzY3JpcHRvclR5cGU8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtc2FtcGxlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zYW1wbGVyPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+c2FtcGxlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlclwiPlZrU2FtcGxlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+LCBhbmQgPGNvZGU+c2FtcGxlcjwvY29kZT4gdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cy1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cy1wTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNZW1vcnlSZXF1aXJlbWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtNZW1vcnlSZXF1aXJlbWVudHNcIj5Wa01lbW9yeVJlcXVpcmVtZW50czwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cy1idWZmZXItcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtaW1hZ2UtMDE1ODgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQ8L2NvZGU+IGZsYWcgc2V0IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cy1pbWFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrTWVtb3J5UmVxdWlyZW1lbnRzXCI+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cy1pbWFnZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czItcEluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMlwiPlZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE1lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa01lbW9yeVJlcXVpcmVtZW50czJcIj5Wa01lbW9yeVJlcXVpcmVtZW50czI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItYnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItcEluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yXCI+VmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE1lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa01lbW9yeVJlcXVpcmVtZW50czJcIj5Wa01lbW9yeVJlcXVpcmVtZW50czI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItaW1hZ2UtMDE1ODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxlbT5tdWx0aS1wbGFuYXI8L2VtPiBmb3JtYXQgYW5kIHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfRElTSk9JTlRfQklUPC9jb2RlPiBmbGFnLCB0aGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mb1wiPlZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm88L2E+IGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgdGhlIDxhIGhyZWY9XCIjVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yXCI+VmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS0wMTU5MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgbm90IGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVDwvY29kZT4gZmxhZywgdGhlcmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgPGEgaHJlZj1cIiNWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvXCI+VmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzwvYT4gaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiB0aGUgPGEgaHJlZj1cIiNWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJcIj5Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pKyhWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS0wMjI3OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQ8L2NvZGU+IGFuZCB3aXRoIDxjb2RlPlZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVDwvY29kZT4sIHRoZW4gdGhlcmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm9cIj5Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvPC9hPiBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIHRoZSA8YSBocmVmPVwiI1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMlwiPlZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItaW1hZ2UtMDIyODAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIHNpbmdsZS1wbGFuZSBmb3JtYXQgYW5kIHdpdGggYW55IDxjb2RlPnRpbGluZzwvY29kZT4gb3RoZXIgdGhhbiA8Y29kZT5WS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQ8L2NvZGU+LCB0aGVuIHRoZXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mb1wiPlZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm88L2E+IGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgdGhlIDxhIGhyZWY9XCIjVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yXCI+VmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSshKFZLX0VYVF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLTAxNTkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBzaW5nbGUtcGxhbmUgZm9ybWF0LCB0aGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm9cIj5Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvPC9hPiBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIHRoZSA8YSBocmVmPVwiI1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMlwiPlZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikrKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLTAxODk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRDwvY29kZT4gZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSB0eXBlLCB0aGVuIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byBtZW1vcnkuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mb1wiPlZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm88L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItaW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvLXBsYW5lQXNwZWN0LTAyMjgxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGltYWdlJiM4MjE3O3MgdGlsaW5nIGlzIDxjb2RlPlZLX0lNQUdFX1RJTElOR19MSU5FQVI8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1RJTElOR19PUFRJTUFMPC9jb2RlPiwgdGhlbiA8Y29kZT5wbGFuZUFzcGVjdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBzaW5nbGUgdmFsaWQgPGVtPmZvcm1hdCBwbGFuZTwvZW0+IGZvciB0aGUgaW1hZ2UuIChUaGF0IGlzLCBmb3IgYSB0d28tcGxhbmUgaW1hZ2UgPGNvZGU+cGxhbmVBc3BlY3Q8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUPC9jb2RlPiwgYW5kIGZvciBhIHRocmVlLXBsYW5lIGltYWdlIDxjb2RlPnBsYW5lQXNwZWN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVDwvY29kZT4pLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9QTEFORV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvLXBsYW5lQXNwZWN0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBsYW5lQXNwZWN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZUFzcGVjdEZsYWdCaXRzXCI+VmtJbWFnZUFzcGVjdEZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pKyhWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8tcGxhbmVBc3BlY3QtMDIyODIiLAorICAgICAgICAgICJ0ZXh0IjogIiAgSWYgdGhlIGltYWdlJiM4MjE3O3MgdGlsaW5nIGlzIDxjb2RlPlZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVDwvY29kZT4sICB0aGVuIDxjb2RlPnBsYW5lQXNwZWN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHNpbmdsZSB2YWxpZCA8ZW0+bWVtb3J5IHBsYW5lPC9lbT4gZm9yIHRoZSAgaW1hZ2UuICAoVGhhdCBpcywgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSBhIHBsYW5lIGluZGV4IHRoYXQgaXMgbGVzcyB0aGFuICB0aGUgIDxhIGhyZWY9XCIjVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFRcIj48Y29kZT5kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQ8L2NvZGU+PC9hPiAgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZSYjODIxNztzIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj48Y29kZT5mb3JtYXQ8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj1cIiNWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUXCI+PGNvZGU+ZHJtRm9ybWF0TW9kaWZpZXI8L2NvZGU+PC9hPi4pIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNZW1vcnlSZXF1aXJlbWVudHMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZW1vcnlSZXF1aXJlbWVudHMyLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5UmVxdWlyZW1lbnRzMi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzXCI+VmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHM8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfUkVRVUlSRU1FTlRTPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQmluZEJ1ZmZlck1lbW9yeSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyLTAxMDI5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWxyZWFkeSBiZSBiYWNrZWQgYnkgYSBtZW1vcnkgb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyLTAxMDMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhbnkgc3BhcnNlIG1lbW9yeSBiaW5kaW5nIGZsYWdzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDMxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+bWVtb3J5PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS0wMTAzNSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSA8Y29kZT5tZW1vcnlUeXBlQml0czwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa01lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxjb2RlPnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiB3aXRoIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnlPZmZzZXQtMDEwMzYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgdGhlIDxjb2RlPmFsaWdubWVudDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa01lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxjb2RlPnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiB3aXRoIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1zaXplLTAxMDM3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNpemU8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8Y29kZT52a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gd2l0aCA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IG1pbnVzIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZU1lbW9yeVwiPlZrRGV2aWNlTWVtb3J5PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci0wMTQ0NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gcmVxdWlyZXMgYSBkZWRpY2F0ZWQgYWxsb2NhdGlvbihhcyByZXBvcnRlZCBieSA8YSBocmVmPVwiI3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMlwiPnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMjwvYT4gaW4gPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50c1wiPlZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzPC9hPjo6cmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uIGZvciA8Y29kZT5idWZmZXI8L2NvZGU+KSwgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmJ1ZmZlcjwvY29kZT4gZXF1YWwgdG8gPGNvZGU+YnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS0wMTUwOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa01lbW9yeUFsbG9jYXRlSW5mbzwvY29kZT4gcHJvdmlkZWQgd2hlbiA8Y29kZT5tZW1vcnk8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgaW5jbHVkZWQgYSA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+IHN0cnVjdHVyZSBpbiBpdHMgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluLCBhbmQgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+YnVmZmVyPC9jb2RlPiB3YXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZW4gPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+Ojo8Y29kZT5idWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktTm9uZS0wMTg5OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGJ1ZmZlciB3YXMgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX1BST1RFQ1RFRF9CSVQ8L2NvZGU+IGJpdCBzZXQsIHRoZSBidWZmZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgdG8gYSBtZW1vcnkgb2JqZWN0IGFsbG9jYXRlZCB3aXRoIGEgbWVtb3J5IHR5cGUgdGhhdCByZXBvcnRzIDxjb2RlPlZLX01FTU9SWV9QUk9QRVJUWV9QUk9URUNURURfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LU5vbmUtMDE4OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfQlVGRkVSX0NSRUFURV9QUk9URUNURURfQklUPC9jb2RlPiBiaXQgbm90IHNldCwgdGhlIGJ1ZmZlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYm91bmQgdG8gYSBtZW1vcnkgb2JqZWN0IGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSB0eXBlIHRoYXQgcmVwb3J0cyA8Y29kZT5WS19NRU1PUllfUFJPUEVSVFlfUFJPVEVDVEVEX0JJVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci0wMTAzOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCA8YSBocmVmPVwiI1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVlwiPlZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVjwvYT46Ojxjb2RlPmRlZGljYXRlZEFsbG9jYXRpb248L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVlwiPlZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WPC9hPjo6PGNvZGU+YnVmZmVyPC9jb2RlPiBlcXVhbCB0byBhIGJ1ZmZlciBoYW5kbGUgY3JlYXRlZCB3aXRoIGlkZW50aWNhbCBjcmVhdGlvbiBwYXJhbWV0ZXJzIHRvIDxjb2RlPmJ1ZmZlcjwvY29kZT4gYW5kIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgemVybyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24pKyEoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci0wMTAzOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2FzIG5vdCBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlZcIj5Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY8L2E+Ojo8Y29kZT5kZWRpY2F0ZWRBbGxvY2F0aW9uPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiwgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkZWRpY2F0ZWQgZm9yIGEgc3BlY2lmaWMgYnVmZmVyIG9yIGltYWdlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfbWVtb3J5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS0wMjcyNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSBvZiA8YSBocmVmPVwiI1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvXCI+VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm88L2E+Ojo8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gdXNlZCB0byBhbGxvY2F0ZSA8Y29kZT5tZW1vcnk8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhdCBsZWFzdCBvbmUgb2YgdGhlIGhhbmRsZXMgc2V0IGluIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiB3aGVuIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnktMDI3MjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5tZW1vcnk8L2NvZGU+IHdhcyBjcmVhdGVkIGJ5IGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbWVtb3J5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gaGF2ZSBiZWVuIHNldCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvXCI+VmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gd2hlbiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlckRldmljZUFkZHJlc3MtMDMzMzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSXCI+VmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUjwvYT46Ojxjb2RlPmJ1ZmZlckRldmljZUFkZHJlc3M8L2NvZGU+IGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgPGNvZGU+YnVmZmVyPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9LSFI8L2NvZGU+IGJpdCBzZXQsIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUjwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQmluZEJ1ZmZlck1lbW9yeTIiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9iaW5kX21lbW9yeTIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnkyLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItcEJpbmRJbmZvcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQmluZEluZm9zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YmluZEluZm9Db3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0JpbmRCdWZmZXJNZW1vcnlJbmZvXCI+VmtCaW5kQnVmZmVyTWVtb3J5SW5mbzwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5Mi1iaW5kSW5mb0NvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YmluZEluZm9Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tYnVmZmVyLTAxNTkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWxyZWFkeSBiZSBiYWNrZWQgYnkgYSBtZW1vcnkgb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWJ1ZmZlci0wMTU5NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYW55IHNwYXJzZSBtZW1vcnkgYmluZGluZyBmbGFncyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1tZW1vcnlPZmZzZXQtMDE1OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeS0wMTU5OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSA8Y29kZT5tZW1vcnlUeXBlQml0czwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa01lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxjb2RlPnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiB3aXRoIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tbWVtb3J5T2Zmc2V0LTAxNjAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSA8Y29kZT5hbGlnbm1lbnQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8Y29kZT52a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gd2l0aCA8Y29kZT5idWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLXNpemUtMDE2MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c2l6ZTwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa01lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxjb2RlPnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiB3aXRoIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPm1lbW9yeTwvY29kZT4gbWludXMgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm9cIj5Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm88L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tbWVtb3J5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9iaW5kX21lbW9yeTIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWJ1ZmZlci0wMTYwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gcmVxdWlyZXMgYSBkZWRpY2F0ZWQgYWxsb2NhdGlvbihhcyByZXBvcnRlZCBieSA8YSBocmVmPVwiI3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMlwiPnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMjwvYT4gaW4gPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50c1wiPlZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzPC9hPjo6cmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uIGZvciA8Y29kZT5idWZmZXI8L2NvZGU+KSwgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmJ1ZmZlcjwvY29kZT4gZXF1YWwgdG8gPGNvZGU+YnVmZmVyPC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeS0wMTkwMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa01lbW9yeUFsbG9jYXRlSW5mbzwvY29kZT4gcHJvdmlkZWQgd2hlbiA8Y29kZT5tZW1vcnk8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgaW5jbHVkZWQgYSA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+IHN0cnVjdHVyZSBpbiBpdHMgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluLCBhbmQgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+YnVmZmVyPC9jb2RlPiB3YXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZW4gPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+Ojo8Y29kZT5idWZmZXI8L2NvZGU+IGFuZCA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSsoVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWJ1ZmZlci0wMTYwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCA8YSBocmVmPVwiI1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVlwiPlZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVjwvYT46Ojxjb2RlPmRlZGljYXRlZEFsbG9jYXRpb248L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVlwiPlZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WPC9hPjo6PGNvZGU+YnVmZmVyPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5idWZmZXI8L2NvZGU+IGFuZCA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9iaW5kX21lbW9yeTIpKyhWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikrIShWS19WRVJTSU9OXzFfMSxWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWJ1ZmZlci0wMTYwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2FzIG5vdCBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlZcIj5Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY8L2E+Ojo8Y29kZT5kZWRpY2F0ZWRBbGxvY2F0aW9uPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiwgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkZWRpY2F0ZWQgZm9yIGEgc3BlY2lmaWMgYnVmZmVyIG9yIGltYWdlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tcE5leHQtMDE2MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm9cIj5Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm88L2E+IHN0cnVjdHVyZSwgYWxsIGluc3RhbmNlcyBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IHNwZWNpZmllZCBieSA8YSBocmVmPVwiI1ZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mb1wiPlZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbzwvYT46Ojxjb2RlPnBEZXZpY2VJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYWxsb2NhdGVkIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8taGFuZGxlVHlwZXMtMDI3OTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgb2YgPGEgaHJlZj1cIiNWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb1wiPlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHVzZWQgdG8gYWxsb2NhdGUgPGNvZGU+bWVtb3J5PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG9mIHRoZSBoYW5kbGVzIHNldCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvXCI+VmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm88L2E+Ojo8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gd2hlbiA8Y29kZT5idWZmZXI8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeS0wMjc5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm1lbW9yeTwvY29kZT4gd2FzIGNyZWF0ZWQgYnkgYSBtZW1vcnkgaW1wb3J0IG9wZXJhdGlvbiwgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIG9mIHRoZSBpbXBvcnRlZCBtZW1vcnkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBoYXZlIGJlZW4gc2V0IGluIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiB3aGVuIDxjb2RlPmJ1ZmZlcjwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9iaW5kX21lbW9yeTIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvLWRldmljZUluZGV4Q291bnQtMDE2MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2VJbmRleENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlaXRoZXIgYmUgemVybyBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZXMgaW4gdGhlIGxvZ2ljYWwgZGV2aWNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8tcERldmljZUluZGljZXMtMDE2MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgPGNvZGU+cERldmljZUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGRldmljZSBpbmRpY2VzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvLXBEZXZpY2VJbmRpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRldmljZUluZGV4Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cERldmljZUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kZXZpY2VJbmRleENvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtCaW5kSW1hZ2VNZW1vcnkiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTYwOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVDwvY29kZT4gc2V0LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTA0NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWxyZWFkeSBiZSBiYWNrZWQgYnkgYSBtZW1vcnkgb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTA0NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhbnkgc3BhcnNlIG1lbW9yeSBiaW5kaW5nIGZsYWdzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnlPZmZzZXQtMDEwNDYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktMDEwNDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgb25lIG9mIHRoZSBtZW1vcnkgdHlwZXMgYWxsb3dlZCBpbiB0aGUgPGNvZGU+bWVtb3J5VHlwZUJpdHM8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8Y29kZT52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiB3aXRoIDxjb2RlPmltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDQ4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSA8Y29kZT5hbGlnbm1lbnQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8Y29kZT52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiB3aXRoIDxjb2RlPmltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktc2l6ZS0wMTA0OSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zaXplPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gPGNvZGU+dmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gd2l0aCA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPm1lbW9yeTwvY29kZT4gbWludXMgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VNZW1vcnlcIj5Wa0RldmljZU1lbW9yeTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtMDE0NDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gcmVxdWlyZXMgYSBkZWRpY2F0ZWQgYWxsb2NhdGlvbiAoYXMgcmVwb3J0ZWQgYnkgPGEgaHJlZj1cIiN2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMlwiPnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyPC9hPiBpbiA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzXCI+VmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHM8L2E+OjpyZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gZm9yIDxjb2RlPmltYWdlPC9jb2RlPiksIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+Ojo8Y29kZT5pbWFnZTwvY29kZT4gZXF1YWwgdG8gPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24pKyEoVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb25faW1hZ2VfYWxpYXNpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktMDE1MDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+IHByb3ZpZGVkIHdoZW4gPGNvZGU+bWVtb3J5PC9jb2RlPiB3YXMgYWxsb2NhdGVkIGluY2x1ZGVkIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUgaW4gaXRzIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiwgYW5kIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiB3YXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24pKyhWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbl9pbWFnZV9hbGlhc2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS0wMjYyOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nXCI+ZGVkaWNhdGVkIGFsbG9jYXRpb24gaW1hZ2UgYWxpYXNpbmc8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCB0aGUgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+IHByb3ZpZGVkIHdoZW4gPGNvZGU+bWVtb3J5PC9jb2RlPiB3YXMgYWxsb2NhdGVkIGluY2x1ZGVkIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUgaW4gaXRzIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiwgYW5kIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiB3YXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAyNjI5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdcIj5kZWRpY2F0ZWQgYWxsb2NhdGlvbiBpbWFnZSBhbGlhc2luZzwvYT4gZmVhdHVyZSBpcyBlbmFibGVkLCBhbmQgdGhlIDxjb2RlPlZrTWVtb3J5QWxsb2NhdGVJbmZvPC9jb2RlPiBwcm92aWRlZCB3aGVuIDxjb2RlPm1lbW9yeTwvY29kZT4gd2FzIGFsbG9jYXRlZCBpbmNsdWRlZCBhIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT4gc3RydWN0dXJlIGluIGl0cyA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4sIGFuZCA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+Ojo8Y29kZT5pbWFnZTwvY29kZT4gd2FzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCB0aGVuIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgemVybywgYW5kIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgZXF1YWwgdG8gPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+aW1hZ2U8L2NvZGU+IG9yIGFuIGltYWdlIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIHNhbWUgcGFyYW1ldGVycyBpbiA8Y29kZT5Wa0ltYWdlQ3JlYXRlSW5mbzwvY29kZT4sIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IDxjb2RlPmV4dGVudDwvY29kZT4gYW5kIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bWF5PC9zdHJvbmc+IGRpZmZlciBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBldmVyeSBkaW1lbnNpb24gaW4gdGhlIDxjb2RlPmV4dGVudDwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZSBpbWFnZSBiZWluZyBib3VuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byBvciBzbWFsbGVyIHRoYW4gdGhlIG9yaWdpbmFsIGltYWdlIGZvciB3aGljaCB0aGUgYWxsb2NhdGlvbiB3YXMgY3JlYXRlZDsgYW5kIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZSBpbWFnZSBiZWluZyBib3VuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byBvciBzbWFsbGVyIHRoYW4gdGhlIG9yaWdpbmFsIGltYWdlIGZvciB3aGljaCB0aGUgYWxsb2NhdGlvbiB3YXMgY3JlYXRlZC4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktTm9uZS0wMTkwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9QUk9URUNURURfQklUPC9jb2RlPiBiaXQgc2V0LCB0aGUgaW1hZ2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgdG8gYSBtZW1vcnkgb2JqZWN0IGFsbG9jYXRlZCB3aXRoIGEgbWVtb3J5IHR5cGUgdGhhdCByZXBvcnRzIDxjb2RlPlZLX01FTU9SWV9QUk9QRVJUWV9QUk9URUNURURfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktTm9uZS0wMTkwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9QUk9URUNURURfQklUPC9jb2RlPiBiaXQgbm90IHNldCwgdGhlIGltYWdlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBib3VuZCB0byBhIG1lbW9yeSBvYmplY3QgY3JlYXRlZCB3aXRoIGEgbWVtb3J5IHR5cGUgdGhhdCByZXBvcnRzIDxjb2RlPlZLX01FTU9SWV9QUk9QRVJUWV9QUk9URUNURURfQklUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTA1MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlZcIj5Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjwvYT46Ojxjb2RlPmRlZGljYXRlZEFsbG9jYXRpb248L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVlwiPlZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WPC9hPjo6PGNvZGU+aW1hZ2U8L2NvZGU+IGVxdWFsIHRvIGFuIGltYWdlIGhhbmRsZSBjcmVhdGVkIHdpdGggaWRlbnRpY2FsIGNyZWF0aW9uIHBhcmFtZXRlcnMgdG8gPGNvZGU+aW1hZ2U8L2NvZGU+IGFuZCA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uKSshKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLTAxMDUxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBub3QgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlZcIj5Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjwvYT46Ojxjb2RlPmRlZGljYXRlZEFsbG9jYXRpb248L2NvZGU+IGVxdWFsIHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGRlZGljYXRlZCBmb3IgYSBzcGVjaWZpYyBidWZmZXIgb3IgaW1hZ2UiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktMDI3MjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgb2YgPGEgaHJlZj1cIiNWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb1wiPlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHVzZWQgdG8gYWxsb2NhdGUgPGNvZGU+bWVtb3J5PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG9mIHRoZSBoYW5kbGVzIHNldCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktMDI3MjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5tZW1vcnk8L2NvZGU+IHdhcyBjcmVhdGVkIGJ5IGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbWVtb3J5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gaGF2ZSBiZWVuIHNldCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtCaW5kSW1hZ2VNZW1vcnkyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnkyLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEltYWdlTWVtb3J5Mi1wQmluZEluZm9zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBCaW5kSW5mb3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5iaW5kSW5mb0NvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQmluZEltYWdlTWVtb3J5SW5mb1wiPlZrQmluZEltYWdlTWVtb3J5SW5mbzwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnkyLWJpbmRJbmZvQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5iaW5kSW5mb0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0JpbmRJbWFnZU1lbW9yeUluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9iaW5kX21lbW9yeTIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taW1hZ2UtMDE2MDkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFscmVhZHkgYmUgYmFja2VkIGJ5IGEgbWVtb3J5IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWltYWdlLTAxNjEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGFueSBzcGFyc2UgbWVtb3J5IGJpbmRpbmcgZmxhZ3MiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1tZW1vcnlPZmZzZXQtMDE2MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm9cIj5Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzwvYT4sIDxhIGhyZWY9XCIjVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSXCI+VmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSPC9hPiwgb3IgPGEgaHJlZj1cIiNWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mb1wiPlZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+aW1hZ2U8L2NvZGU+LCBhbmQgPGNvZGU+bWVtb3J5PC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikrIShWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMTYxMiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSA8Y29kZT5tZW1vcnlUeXBlQml0czwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrTWVtb3J5UmVxdWlyZW1lbnRzXCI+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2E+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNcIj52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzPC9hPiB3aXRoIDxjb2RlPmltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeU9mZnNldC0wMTYxMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiB0aGUgPGNvZGU+YWxpZ25tZW50PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtNZW1vcnlSZXF1aXJlbWVudHNcIj5Wa01lbW9yeVJlcXVpcmVtZW50czwvYT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50c1wiPnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM8L2E+IHdpdGggPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tbWVtb3J5LTAxNjE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHNpemUgb2YgPGNvZGU+bWVtb3J5PC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIDxjb2RlPnNpemU8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGEgaHJlZj1cIiNWa01lbW9yeVJlcXVpcmVtZW50c1wiPlZrTWVtb3J5UmVxdWlyZW1lbnRzPC9hPiBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gPGEgaHJlZj1cIiN2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzXCI+dmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czwvYT4gd2l0aCB0aGUgc2FtZSA8Y29kZT5pbWFnZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9iaW5kX21lbW9yeTIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBkb2VzIG5vdCBpbmNsdWRlIGEgPGEgaHJlZj1cIiNWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mb1wiPlZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvPC9hPiBzdHJ1Y3R1cmUsIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSA8Y29kZT5tZW1vcnlUeXBlQml0czwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrTWVtb3J5UmVxdWlyZW1lbnRzXCI+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2E+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyXCI+dmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI8L2E+IHdpdGggPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGRvZXMgbm90IGluY2x1ZGUgYSA8YSBocmVmPVwiI1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvXCI+VmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm88L2E+IHN0cnVjdHVyZSwgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSA8Y29kZT5hbGlnbm1lbnQ8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGEgaHJlZj1cIiNWa01lbW9yeVJlcXVpcmVtZW50c1wiPlZrTWVtb3J5UmVxdWlyZW1lbnRzPC9hPiBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gPGEgaHJlZj1cIiN2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMlwiPnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyPC9hPiB3aXRoIDxjb2RlPmltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBkb2VzIG5vdCBpbmNsdWRlIGEgPGEgaHJlZj1cIiNWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mb1wiPlZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvPC9hPiBzdHJ1Y3R1cmUsIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSBzaXplIG9mIDxjb2RlPm1lbW9yeTwvY29kZT4gYW5kIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSA8Y29kZT5zaXplPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtNZW1vcnlSZXF1aXJlbWVudHNcIj5Wa01lbW9yeVJlcXVpcmVtZW50czwvYT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJcIj52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjwvYT4gd2l0aCB0aGUgc2FtZSA8Y29kZT5pbWFnZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYxOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvXCI+VmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm88L2E+IHN0cnVjdHVyZSwgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQ8L2NvZGU+IGJpdCBzZXQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mb1wiPlZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvPC9hPiBzdHJ1Y3R1cmUsIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSA8Y29kZT5tZW1vcnlUeXBlQml0czwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrTWVtb3J5UmVxdWlyZW1lbnRzXCI+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2E+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyXCI+dmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI8L2E+IHdpdGggPGNvZGU+aW1hZ2U8L2NvZGU+IGFuZCB0aGUgY29ycmVjdCA8Y29kZT5wbGFuZUFzcGVjdDwvY29kZT4gZm9yIHRoaXMgcGxhbmUgaW4gdGhlIDxhIGhyZWY9XCIjVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mb1wiPlZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm88L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGEgaHJlZj1cIiNWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJcIj5Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI8L2E+IHN0cnVjdHVyZSYjODIxNztzIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm9cIj5Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbzwvYT4gc3RydWN0dXJlLCA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgdGhlIDxjb2RlPmFsaWdubWVudDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrTWVtb3J5UmVxdWlyZW1lbnRzXCI+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2E+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyXCI+dmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI8L2E+IHdpdGggPGNvZGU+aW1hZ2U8L2NvZGU+IGFuZCB0aGUgY29ycmVjdCA8Y29kZT5wbGFuZUFzcGVjdDwvY29kZT4gZm9yIHRoaXMgcGxhbmUgaW4gdGhlIDxhIGhyZWY9XCIjVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mb1wiPlZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm88L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGEgaHJlZj1cIiNWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJcIj5Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI8L2E+IHN0cnVjdHVyZSYjODIxNztzIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjIxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm9cIj5Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbzwvYT4gc3RydWN0dXJlLCB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IGFuZCA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgPGNvZGU+c2l6ZTwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrTWVtb3J5UmVxdWlyZW1lbnRzXCI+VmtNZW1vcnlSZXF1aXJlbWVudHM8L2E+IHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyXCI+dmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI8L2E+IHdpdGggdGhlIHNhbWUgPGNvZGU+aW1hZ2U8L2NvZGU+IGFuZCB0aGUgY29ycmVjdCA8Y29kZT5wbGFuZUFzcGVjdDwvY29kZT4gZm9yIHRoaXMgcGxhbmUgaW4gdGhlIDxhIGhyZWY9XCIjVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mb1wiPlZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm88L2E+IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgPGEgaHJlZj1cIiNWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJcIj5Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI8L2E+IHN0cnVjdHVyZSYjODIxNztzIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS0wMTYyMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiByZXF1aXJlcyBhIGRlZGljYXRlZCBhbGxvY2F0aW9uIChhcyByZXBvcnRlZCBieSA8YSBocmVmPVwiI3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyXCI+dmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI8L2E+IGluIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHNcIj5Wa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50czwvYT46OnJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiBmb3IgPGNvZGU+aW1hZ2U8L2NvZGU+KSwgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5pbWFnZTwvY29kZT4gYW5kIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgemVybyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikrIShWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbl9pbWFnZV9hbGlhc2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1tZW1vcnktMDE5MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+IHByb3ZpZGVkIHdoZW4gPGNvZGU+bWVtb3J5PC9jb2RlPiB3YXMgYWxsb2NhdGVkIGluY2x1ZGVkIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUgaW4gaXRzIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiwgYW5kIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiB3YXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvLiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikrKFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMjYzMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nXCI+ZGVkaWNhdGVkIGFsbG9jYXRpb24gaW1hZ2UgYWxpYXNpbmc8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCB0aGUgPGNvZGU+VmtNZW1vcnlBbGxvY2F0ZUluZm88L2NvZGU+IHByb3ZpZGVkIHdoZW4gPGNvZGU+bWVtb3J5PC9jb2RlPiB3YXMgYWxsb2NhdGVkIGluY2x1ZGVkIGEgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUgaW4gaXRzIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiwgYW5kIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiB3YXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIHRoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMjYzMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nXCI+ZGVkaWNhdGVkIGFsbG9jYXRpb24gaW1hZ2UgYWxpYXNpbmc8L2E+IGZlYXR1cmUgaXMgZW5hYmxlZCwgYW5kIHRoZSA8Y29kZT5Wa01lbW9yeUFsbG9jYXRlSW5mbzwvY29kZT4gcHJvdmlkZWQgd2hlbiA8Y29kZT5tZW1vcnk8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgaW5jbHVkZWQgYSA8YSBocmVmPVwiI1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXCI+VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm88L2E+IHN0cnVjdHVyZSBpbiBpdHMgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluLCBhbmQgPGEgaHJlZj1cIiNWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb1wiPlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgdGhlbiA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8sIGFuZCA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9cIj5Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiBvciBhbiBpbWFnZSB0aGF0IHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBzYW1lIHBhcmFtZXRlcnMgaW4gPGNvZGU+VmtJbWFnZUNyZWF0ZUluZm88L2NvZGU+LCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCA8Y29kZT5leHRlbnQ8L2NvZGU+IGFuZCA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm1heTwvc3Ryb25nPiBkaWZmZXIgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogZXZlcnkgZGltZW5zaW9uIGluIHRoZSA8Y29kZT5leHRlbnQ8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGUgaW1hZ2UgYmVpbmcgYm91bmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gb3Igc21hbGxlciB0aGFuIHRoZSBvcmlnaW5hbCBpbWFnZSBmb3Igd2hpY2ggdGhlIGFsbG9jYXRpb24gd2FzIGNyZWF0ZWQ7IGFuZCB0aGUgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGUgaW1hZ2UgYmVpbmcgYm91bmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gb3Igc21hbGxlciB0aGFuIHRoZSBvcmlnaW5hbCBpbWFnZSBmb3Igd2hpY2ggdGhlIGFsbG9jYXRpb24gd2FzIGNyZWF0ZWQuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSsoVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taW1hZ2UtMDE2MjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCA8YSBocmVmPVwiI1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WXCI+VmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlY8L2E+Ojo8Y29kZT5kZWRpY2F0ZWRBbGxvY2F0aW9uPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiwgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlZcIj5Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjwvYT46Ojxjb2RlPmltYWdlPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5pbWFnZTwvY29kZT4gYW5kIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgemVybyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikrKFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uKSshKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS0wMTYyNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgbm90IGNyZWF0ZWQgd2l0aCA8YSBocmVmPVwiI1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WXCI+VmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlY8L2E+Ojo8Y29kZT5kZWRpY2F0ZWRBbGxvY2F0aW9uPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiwgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkZWRpY2F0ZWQgZm9yIGEgc3BlY2lmaWMgYnVmZmVyIG9yIGltYWdlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSshKFZLX1ZFUlNJT05fMV8xK1ZLX0tIUl9zd2FwY2hhaW4pKyEoVktfS0hSX2RldmljZV9ncm91cCtWS19LSFJfc3dhcGNoYWluKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMTYyNSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mb1wiPlZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvPC9hPiBzdHJ1Y3R1cmUsIGFsbCBpbnN0YW5jZXMgb2YgPGNvZGU+bWVtb3J5PC9jb2RlPiBzcGVjaWZpZWQgYnkgPGEgaHJlZj1cIiNWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mb1wiPlZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvPC9hPjo6PGNvZGU+cERldmljZUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBhbGxvY2F0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYyNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvXCI+VmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm88L2E+IHN0cnVjdHVyZSwgYW5kIDxhIGhyZWY9XCIjVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm9cIj5Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzwvYT46Ojxjb2RlPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQ8L2NvZGU+IGlzIG5vdCB6ZXJvLCB0aGVuIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm9cIj5Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzwvYT4gc3RydWN0dXJlLCBhbGwgZWxlbWVudHMgb2YgPGEgaHJlZj1cIiNWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mb1wiPlZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvPC9hPjo6PGNvZGU+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdmFsaWQgcmVjdGFuZ2xlcyBjb250YWluZWQgd2l0aGluIHRoZSBkaW1lbnNpb25zIG9mIDxjb2RlPmltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjI5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBpbmNsdWRlcyBhIDxhIGhyZWY9XCIjVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm9cIj5Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzwvYT4gc3RydWN0dXJlLCB0aGUgdW5pb24gb2YgdGhlIGFyZWFzIG9mIGFsbCBlbGVtZW50cyBvZiA8YSBocmVmPVwiI1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvXCI+VmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm88L2E+Ojo8Y29kZT5wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvdmVyIHRoZSBlbnRpcmUgaW1hZ2UuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkrKFZLX0tIUl9zd2FwY2hhaW4pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taW1hZ2UtMDE2MzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIHZhbGlkIHN3YXBjaGFpbiBoYW5kbGUgaW4gPGEgaHJlZj1cIiNWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUlwiPlZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPC9hPjo6PGNvZGU+c3dhcGNoYWluPC9jb2RlPiwgdGhlbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYSA8YSBocmVmPVwiI1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUlwiPlZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUjwvYT4gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNhbWUgc3dhcGNoYWluIGhhbmRsZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYzMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUlwiPlZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUjwvYT4gc3RydWN0dXJlLCA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYzMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gZG9lcyBub3QgaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSXCI+VmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSPC9hPiBzdHJ1Y3R1cmUsIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlTWVtb3J5XCI+VmtEZXZpY2VNZW1vcnk8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taGFuZGxlVHlwZXMtMDI3OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgb2YgPGEgaHJlZj1cIiNWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb1wiPlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHVzZWQgdG8gYWxsb2NhdGUgPGNvZGU+bWVtb3J5PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG9mIHRoZSBoYW5kbGVzIHNldCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tbWVtb3J5LTAyNzk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bWVtb3J5PC9jb2RlPiB3YXMgY3JlYXRlZCBieSBhIG1lbW9yeSBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHR5cGUgb2YgdGhlIGltcG9ydGVkIG1lbW9yeSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGhhdmUgYmVlbiBzZXQgaW4gPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvXCI+VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiB3aGVuIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLWRldmljZUluZGV4Q291bnQtMDE2MzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBBdCBsZWFzdCBvbmUgb2YgPGNvZGU+ZGV2aWNlSW5kZXhDb3VudDwvY29kZT4gYW5kIDxjb2RlPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1kZXZpY2VJbmRleENvdW50LTAxNjM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlSW5kZXhDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWl0aGVyIGJlIHplcm8gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwaHlzaWNhbCBkZXZpY2VzIGluIHRoZSBsb2dpY2FsIGRldmljZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tcERldmljZUluZGljZXMtMDE2MzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgPGNvZGU+cERldmljZUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGRldmljZSBpbmRpY2VzLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudC0wMTYzNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVpdGhlciBiZSB6ZXJvIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgZGV2aWNlcyBpbiB0aGUgbG9naWNhbCBkZXZpY2Ugc3F1YXJlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucy0wMTYzNyIsCisgICAgICAgICAgInRleHQiOiAiIEVsZW1lbnRzIG9mIDxjb2RlPnBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnM8L2NvZGU+IHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc2FtZSBpbnN0YW5jZSBvZiBhbiBpbWFnZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgb3ZlcmxhcC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLW9mZnNldC0wMTYzOCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5vZmZzZXQueDwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHNwYXJzZSBpbWFnZSBibG9jayB3aWR0aCAoPGNvZGU+VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM8L2NvZGU+Ojo8Y29kZT5pbWFnZUdyYW51bGFyaXR5LndpZHRoPC9jb2RlPikgb2YgYWxsIG5vbi1tZXRhZGF0YSBhc3BlY3RzIG9mIHRoZSBpbWFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tb2Zmc2V0LTAxNjM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPm9mZnNldC55PC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3BhcnNlIGltYWdlIGJsb2NrIGhlaWdodCAoPGNvZGU+VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM8L2NvZGU+Ojo8Y29kZT5pbWFnZUdyYW51bGFyaXR5LmhlaWdodDwvY29kZT4pIG9mIGFsbCBub24tbWV0YWRhdGEgYXNwZWN0cyBvZiB0aGUgaW1hZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLWV4dGVudC0wMTY0MCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5leHRlbnQud2lkdGg8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlaXRoZXIgYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3BhcnNlIGltYWdlIGJsb2NrIHdpZHRoIG9mIGFsbCBub24tbWV0YWRhdGEgYXNwZWN0cyBvZiB0aGUgaW1hZ2UsIG9yIGVsc2UgPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5vZmZzZXQueDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tZXh0ZW50LTAxNjQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlaXRoZXIgYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3BhcnNlIGltYWdlIGJsb2NrIGhlaWdodCBvZiBhbGwgbm9uLW1ldGFkYXRhIGFzcGVjdHMgb2YgdGhlIGltYWdlLCBvciBlbHNlIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+ICYjNDM7IDxjb2RlPm9mZnNldC55PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgd2lkdGggb2YgdGhlIGltYWdlIHN1YnJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLXBEZXZpY2VJbmRpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRldmljZUluZGV4Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cERldmljZUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kZXZpY2VJbmRleENvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtSZWN0MkRcIj5Wa1JlY3QyRDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2JpbmRfbWVtb3J5MikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApKyhWS19LSFJfc3dhcGNoYWluKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSLWltYWdlSW5kZXgtMDE2NDQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBpbWFnZXMgaW4gPGNvZGU+c3dhcGNoYWluPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX1NXQVBDSEFJTl9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUi1zd2FwY2hhaW4tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTd2FwY2hhaW5LSFJcIj5Wa1N3YXBjaGFpbktIUjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9iaW5kX21lbW9yeTIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8tcGxhbmVBc3BlY3QtMDIyODMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgaW1hZ2UmIzgyMTc7cyB0aWxpbmcgaXMgPGNvZGU+VktfSU1BR0VfVElMSU5HX0xJTkVBUjwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVElMSU5HX09QVElNQUw8L2NvZGU+LCB0aGVuIDxjb2RlPnBsYW5lQXNwZWN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHNpbmdsZSB2YWxpZCA8ZW0+Zm9ybWF0IHBsYW5lPC9lbT4gZm9yIHRoZSBpbWFnZS4gKFRoYXQgaXMsIDxjb2RlPnBsYW5lQXNwZWN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDwvY29kZT4gZm9yICYjODIyMDs8Y29kZT5fMlBMQU5FPC9jb2RlPiYjODIyMTsgZm9ybWF0cyBhbmQgPGNvZGU+cGxhbmVBc3BlY3Q8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVDwvY29kZT4gZm9yICYjODIyMDs8Y29kZT5fM1BMQU5FPC9jb2RlPiYjODIyMTsgZm9ybWF0cy4pIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1Ob25lLTAxNjQzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQSBzaW5nbGUgY2FsbCB0byA8YSBocmVmPVwiI3ZrQmluZEltYWdlTWVtb3J5MlwiPnZrQmluZEltYWdlTWVtb3J5MjwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmluZCBhbGwgb3Igbm9uZSBvZiB0aGUgcGxhbmVzIG9mIGFuIGltYWdlIChpLmUuIGJpbmRpbmdzIHRvIGFsbCBwbGFuZXMgb2YgYW4gaW1hZ2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbWFkZSBpbiBhIHNpbmdsZSA8YSBocmVmPVwiI3ZrQmluZEltYWdlTWVtb3J5MlwiPnZrQmluZEltYWdlTWVtb3J5MjwvYT4gY2FsbCksIGFzIHNlcGFyYXRlIGJpbmRpbmdzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8tcGxhbmVBc3BlY3QtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGxhbmVBc3BlY3Q8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlQXNwZWN0RmxhZ0JpdHNcIj5Wa0ltYWdlQXNwZWN0RmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfYmluZF9tZW1vcnkyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikrKFZLX0VYVF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8tcGxhbmVBc3BlY3QtMDIyODQiLAorICAgICAgICAgICJ0ZXh0IjogIiAgSWYgdGhlIGltYWdlJiM4MjE3O3MgdGlsaW5nIGlzIDxjb2RlPlZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVDwvY29kZT4sICB0aGVuIDxjb2RlPnBsYW5lQXNwZWN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHNpbmdsZSB2YWxpZCA8ZW0+bWVtb3J5IHBsYW5lPC9lbT4gZm9yIHRoZSAgaW1hZ2UuICAoVGhhdCBpcywgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSBhIHBsYW5lIGluZGV4IHRoYXQgaXMgbGVzcyB0aGFuICB0aGUgIDxhIGhyZWY9XCIjVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFRcIj48Y29kZT5kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQ8L2NvZGU+PC9hPiAgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZSYjODIxNztzIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj48Y29kZT5mb3JtYXQ8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj1cIiNWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUXCI+PGNvZGU+ZHJtRm9ybWF0TW9kaWZpZXI8L2NvZGU+PC9hPi4pIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViI6IHsKKyAgICAgICIoVktfTlZfcmF5X3RyYWNpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEFjY2VsZXJhdGlvblN0cnVjdHVyZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WXCI+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYiOiB7CisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYtY29tcGFjdGVkU2l6ZS0wMjQyMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbXBhY3RlZFNpemU8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiB0aGVuIGJvdGggPGNvZGU+aW5mby5nZW9tZXRyeUNvdW50PC9jb2RlPiBhbmQgPGNvZGU+aW5mby5pbnN0YW5jZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVi1pbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViI6IHsKKyAgICAgICIoVktfTlZfcmF5X3RyYWNpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1nZW9tZXRyeUNvdW50LTAyNDIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Z2VvbWV0cnlDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlZcIj5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvYT46Ojxjb2RlPm1heEdlb21ldHJ5Q291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1pbnN0YW5jZUNvdW50LTAyNDIzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2VDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlZcIj5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvYT46Ojxjb2RlPm1heEluc3RhbmNlQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1tYXhUcmlhbmdsZUNvdW50LTAyNDI0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiB0cmlhbmdsZXMgaW4gYWxsIGdlb21ldHJpZXMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlZcIj5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvYT46Ojxjb2RlPm1heFRyaWFuZ2xlQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi10eXBlLTAyNDI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dHlwZTwvY29kZT4gaXMgPGNvZGU+VktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX1RPUF9MRVZFTF9OVjwvY29kZT4gdGhlbiA8Y29kZT5nZW9tZXRyeUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtdHlwZS0wMjQyNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlY8L2NvZGU+IHRoZW4gPGNvZGU+aW5zdGFuY2VDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXR5cGUtMDI3ODYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT50eXBlPC9jb2RlPiBpcyA8Y29kZT5WS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WPC9jb2RlPiB0aGVuIHRoZSA8Y29kZT5nZW9tZXRyeVR5cGU8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGdlb21ldHJ5IGluIDxjb2RlPnBHZW9tZXRyaWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB0aGUgc2FtZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtZmxhZ3MtMDI1OTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaGFzIHRoZSA8Y29kZT5WS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1BSRUZFUl9GQVNUX1RSQUNFX0JJVF9OVjwvY29kZT4gYml0IHNldCwgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSB0aGUgPGNvZGU+VktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9CVUlMRF9CSVRfTlY8L2NvZGU+IGJpdCBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXNjcmF0Y2gtMDI3ODEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zY3JhdGNoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9SQVlfVFJBQ0lOR19CSVRfTlY8L2NvZGU+IHVzYWdlIGZsYWciCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLWluc3RhbmNlRGF0YS0wMjc4MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmluc3RhbmNlRGF0YTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmluc3RhbmNlRGF0YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtdHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50eXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOVjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlZcIj5Wa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVjwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1wR2VvbWV0cmllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5nZW9tZXRyeUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBHZW9tZXRyaWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+Z2VvbWV0cnlDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0dlb21ldHJ5TlZcIj5Wa0dlb21ldHJ5TlY8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0dlb21ldHJ5TlYiOiB7CisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeU5WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeU5WLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5TlYtZ2VvbWV0cnlUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmdlb21ldHJ5VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrR2VvbWV0cnlUeXBlTlZcIj5Wa0dlb21ldHJ5VHlwZU5WPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeU5WLWdlb21ldHJ5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmdlb21ldHJ5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtHZW9tZXRyeURhdGFOVlwiPlZrR2VvbWV0cnlEYXRhTlY8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeU5WLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtHZW9tZXRyeUZsYWdCaXRzTlZcIj5Wa0dlb21ldHJ5RmxhZ0JpdHNOVjwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtHZW9tZXRyeURhdGFOViI6IHsKKyAgICAgICIoVktfTlZfcmF5X3RyYWNpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5RGF0YU5WLXRyaWFuZ2xlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50cmlhbmdsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0dlb21ldHJ5VHJpYW5nbGVzTlZcIj5Wa0dlb21ldHJ5VHJpYW5nbGVzTlY8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeURhdGFOVi1hYWJicy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hYWJiczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrR2VvbWV0cnlBQUJCTlZcIj5Wa0dlb21ldHJ5QUFCQk5WPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0dlb21ldHJ5VHJpYW5nbGVzTlYiOiB7CisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleE9mZnNldC0wMjQyOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnZlcnRleE9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIDxjb2RlPnZlcnRleERhdGE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdmVydGV4T2Zmc2V0LTAyNDI5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmVydGV4T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wb25lbnQgc2l6ZSBvZiA8Y29kZT52ZXJ0ZXhGb3JtYXQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdmVydGV4Rm9ybWF0LTAyNDMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmVydGV4Rm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBvbmUgb2YgPGNvZGU+VktfRk9STUFUX1IzMkczMkIzMl9TRkxPQVQ8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfUjMyRzMyX1NGTE9BVDwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9SMTZHMTZCMTZfU0ZMT0FUPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX1IxNkcxNl9TRkxPQVQ8L2NvZGU+LCA8Y29kZT5WS19GT1JNQVRfUjE2RzE2X1NOT1JNPC9jb2RlPiwgb3IgPGNvZGU+VktfRk9STUFUX1IxNkcxNkIxNl9TTk9STTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleE9mZnNldC0wMjQzMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGV4T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+aW5kZXhEYXRhPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4T2Zmc2V0LTAyNDMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5kZXhPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGVsZW1lbnQgc2l6ZSBvZiA8Y29kZT5pbmRleFR5cGU8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhUeXBlLTAyNDMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5kZXhUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTkRFWF9UWVBFX1VJTlQxNjwvY29kZT4sIDxjb2RlPlZLX0lOREVYX1RZUEVfVUlOVDMyPC9jb2RlPiwgb3IgPGNvZGU+VktfSU5ERVhfVFlQRV9OT05FX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4RGF0YS0wMjQzNCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGV4RGF0YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiBpZiA8Y29kZT5pbmRleFR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0lOREVYX1RZUEVfTk9ORV9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleERhdGEtMDI0MzUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbmRleERhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGNvZGU+VmtCdWZmZXI8L2NvZGU+IGhhbmRsZSBpZiA8Y29kZT5pbmRleFR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19JTkRFWF9UWVBFX05PTkVfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhDb3VudC0wMjQzNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGV4Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IGlmIDxjb2RlPmluZGV4VHlwZTwvY29kZT4gaXMgPGNvZGU+VktfSU5ERVhfVFlQRV9OT05FX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXRyYW5zZm9ybU9mZnNldC0wMjQzNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRyYW5zZm9ybU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIDxjb2RlPnRyYW5zZm9ybURhdGE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdHJhbnNmb3JtT2Zmc2V0LTAyNDM4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dHJhbnNmb3JtT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjE2PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX1RSSUFOR0xFU19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dmVydGV4RGF0YTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPnZlcnRleERhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi12ZXJ0ZXhGb3JtYXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmVydGV4Rm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW5kZXhEYXRhPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+aW5kZXhEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGV4VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5kZXhUeXBlXCI+VmtJbmRleFR5cGU8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdHJhbnNmb3JtRGF0YS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT50cmFuc2Zvcm1EYXRhPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+dHJhbnNmb3JtRGF0YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggb2YgPGNvZGU+aW5kZXhEYXRhPC9jb2RlPiwgPGNvZGU+dHJhbnNmb3JtRGF0YTwvY29kZT4sIGFuZCA8Y29kZT52ZXJ0ZXhEYXRhPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrR2VvbWV0cnlBQUJCTlYiOiB7CisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeUFBQkJOVi1vZmZzZXQtMDI0MzkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5hYWJiRGF0YTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrR2VvbWV0cnlBQUJCTlYtb2Zmc2V0LTAyNDQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjg8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0dlb21ldHJ5QUFCQk5WLXN0cmlkZS0wMjQ0MSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0cmlkZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT44PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeUFBQkJOVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeUFBQkJOVi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtHZW9tZXRyeUFBQkJOVi1hYWJiRGF0YS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hYWJiRGF0YTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmFhYmJEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiOiB7CisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLTAyNDQyIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIDxjb2RlPmFjY2VsZXJhdGlvblN0cnVjdHVyZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtMDI0NDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmU8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtMDI0NDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmU8L2NvZGU+IHdhcyBjcmVhdGVkLCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFjY2VsZXJhdGlvblN0cnVjdHVyZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViI6IHsKKyAgICAgICIoVktfTlZfcmF5X3RyYWNpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYtcEluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE1lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa01lbW9yeVJlcXVpcmVtZW50czJLSFJcIj5Wa01lbW9yeVJlcXVpcmVtZW50czJLSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WLXR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzVHlwZU5WXCI+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlY8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WLXBCaW5kSW5mb3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEJpbmRJbmZvczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmJpbmRJbmZvQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WXCI+VmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVi1iaW5kSW5mb0NvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YmluZEluZm9Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtMDI0NTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhbHJlYWR5IGJlIGJhY2tlZCBieSBhIG1lbW9yeSBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnlPZmZzZXQtMDI0NTEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtbWVtb3J5LTAyNTkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYWxsb2NhdGVkIHVzaW5nIG9uZSBvZiB0aGUgbWVtb3J5IHR5cGVzIGFsbG93ZWQgaW4gdGhlIDxjb2RlPm1lbW9yeVR5cGVCaXRzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtNZW1vcnlSZXF1aXJlbWVudHNcIj5Wa01lbW9yeVJlcXVpcmVtZW50czwvYT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVlwiPnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY8L2E+IHdpdGggPGNvZGU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9jb2RlPiBhbmQgPGNvZGU+dHlwZTwvY29kZT4gb2YgPGNvZGU+VktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLW1lbW9yeU9mZnNldC0wMjU5NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiB0aGUgPGNvZGU+YWxpZ25tZW50PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtNZW1vcnlSZXF1aXJlbWVudHNcIj5Wa01lbW9yeVJlcXVpcmVtZW50czwvYT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVlwiPnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY8L2E+IHdpdGggPGNvZGU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9jb2RlPiBhbmQgPGNvZGU+dHlwZTwvY29kZT4gb2YgPGNvZGU+VktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLXNpemUtMDI1OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c2l6ZTwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa01lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVlwiPnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY8L2E+IHdpdGggPGNvZGU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9jb2RlPiBhbmQgPGNvZGU+dHlwZTwvY29kZT4gb2YgPGNvZGU+VktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgPGNvZGU+bWVtb3J5PC9jb2RlPiBtaW51cyA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQklORF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9JTkZPX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFjY2VsZXJhdGlvblN0cnVjdHVyZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VNZW1vcnlcIj5Wa0RldmljZU1lbW9yeTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtcERldmljZUluZGljZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGV2aWNlSW5kZXhDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wRGV2aWNlSW5kaWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmRldmljZUluZGV4Q291bnQ8L2NvZGU+IDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmFjY2VsZXJhdGlvblN0cnVjdHVyZTwvY29kZT4sIGFuZCA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtZGF0YVNpemUtMDIyNDAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHJlc3VsdCBvZiB0aGUgcXVlcnksIGFzIGRlc2NyaWJlZCBhYm92ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtMDI3ODciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IHZpYSA8YSBocmVmPVwiI3ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WXCI+dmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlY8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFjY2VsZXJhdGlvblN0cnVjdHVyZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtcERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cERhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gYnl0ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtZGF0YVNpemUtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZVNhbXBsZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTYW1wbGVyLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU2FtcGxlci1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZXJDcmVhdGVJbmZvXCI+VmtTYW1wbGVyQ3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVNhbXBsZXItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU2FtcGxlci1wU2FtcGxlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU2FtcGxlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJcIj5Wa1NhbXBsZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU2FtcGxlckNyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1taXBMb2RCaWFzLTAxMDY5IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGFic29sdXRlIHZhbHVlIG9mIDxjb2RlPm1pcExvZEJpYXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4U2FtcGxlckxvZEJpYXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1heExvZC0wMTk3MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1heExvZDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPm1pbkxvZDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYW5pc290cm9weUVuYWJsZS0wMTA3MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNhbXBsZXJBbmlzb3Ryb3B5XCI+YW5pc290cm9waWMgc2FtcGxpbmc8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmFuaXNvdHJvcHlFbmFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hbmlzb3Ryb3B5RW5hYmxlLTAxMDcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YW5pc290cm9weUVuYWJsZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIDxjb2RlPm1heEFuaXNvdHJvcHk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MS4wPC9jb2RlPiBhbmQgPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFNhbXBsZXJBbmlzb3Ryb3B5PC9jb2RlPiwgaW5jbHVzaXZlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXM8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5taW5GaWx0ZXI8L2NvZGU+IGFuZCA8Y29kZT5tYWdGaWx0ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDczIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXM8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5taXBtYXBNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TQU1QTEVSX01JUE1BUF9NT0RFX05FQVJFU1Q8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDc0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXM8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5taW5Mb2Q8L2NvZGU+IGFuZCA8Y29kZT5tYXhMb2Q8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51bm5vcm1hbGl6ZWRDb29yZGluYXRlczwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIDxjb2RlPmFkZHJlc3NNb2RlVTwvY29kZT4gYW5kIDxjb2RlPmFkZHJlc3NNb2RlVjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWFjaCBiZSBlaXRoZXIgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTwvY29kZT4gb3IgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnVubm9ybWFsaXplZENvb3JkaW5hdGVzPC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiwgPGNvZGU+YW5pc290cm9weUVuYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDc3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXM8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5jb21wYXJlRW5hYmxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GQUxTRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYWRkcmVzc01vZGVVLTAxMDc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IG9mIDxjb2RlPmFkZHJlc3NNb2RlVTwvY29kZT4sIDxjb2RlPmFkZHJlc3NNb2RlVjwvY29kZT4gb3IgPGNvZGU+YWRkcmVzc01vZGVXPC9jb2RlPiBhcmUgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSPC9jb2RlPiwgPGNvZGU+Ym9yZGVyQ29sb3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0JvcmRlckNvbG9yXCI+VmtCb3JkZXJDb2xvcjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tY29tcGFyZUVuYWJsZS0wMTA4MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbXBhcmVFbmFibGU8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5jb21wYXJlT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbXBhcmVPcFwiPlZrQ29tcGFyZU9wPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFRcIj5Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVDwvYT4gb3IgPGEgaHJlZj1cIiNWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvXCI+VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbzwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHNcIj5Wa1NhbXBsZXJDcmVhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1hZ0ZpbHRlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tYWdGaWx0ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ZpbHRlclwiPlZrRmlsdGVyPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1taW5GaWx0ZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWluRmlsdGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGaWx0ZXJcIj5Wa0ZpbHRlcjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWlwbWFwTW9kZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5taXBtYXBNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTYW1wbGVyTWlwbWFwTW9kZVwiPlZrU2FtcGxlck1pcG1hcE1vZGU8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWFkZHJlc3NNb2RlVS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hZGRyZXNzTW9kZVU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZXJBZGRyZXNzTW9kZVwiPlZrU2FtcGxlckFkZHJlc3NNb2RlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVYtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YWRkcmVzc01vZGVWPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTYW1wbGVyQWRkcmVzc01vZGVcIj5Wa1NhbXBsZXJBZGRyZXNzTW9kZTwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYWRkcmVzc01vZGVXLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFkZHJlc3NNb2RlVzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlckFkZHJlc3NNb2RlXCI+VmtTYW1wbGVyQWRkcmVzc01vZGU8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1taW5GaWx0ZXItMDE2NDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8YSBocmVmPVwiI3NhbXBsZXJzLVlDYkNyLWNvbnZlcnNpb25cIj5zYW1wbGVyIFkmIzgyMTc7QzxzdWI+Qjwvc3ViPkM8c3ViPlI8L3N1Yj4gY29udmVyc2lvbjwvYT4gaXMgZW5hYmxlZCBhbmQgPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX1NFUEFSQVRFX1JFQ09OU1RSVUNUSU9OX0ZJTFRFUl9CSVQ8L2NvZGU+IGlzIG5vdCBzZXQgZm9yIHRoZSBmb3JtYXQsIDxjb2RlPm1pbkZpbHRlcjwvY29kZT4gYW5kIDxjb2RlPm1hZ0ZpbHRlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIHNhbXBsZXIgWSYjODIxNztDPHN1Yj5CPC9zdWI+QzxzdWI+Ujwvc3ViPiBjb252ZXJzaW9uJiM4MjE3O3MgPGNvZGU+Y2hyb21hRmlsdGVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVUtMDE2NDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8YSBocmVmPVwiI3NhbXBsZXJzLVlDYkNyLWNvbnZlcnNpb25cIj5zYW1wbGVyIFkmIzgyMTc7QzxzdWI+Qjwvc3ViPkM8c3ViPlI8L3N1Yj4gY29udmVyc2lvbjwvYT4gaXMgZW5hYmxlZCwgPGNvZGU+YWRkcmVzc01vZGVVPC9jb2RlPiwgPGNvZGU+YWRkcmVzc01vZGVWPC9jb2RlPiwgYW5kIDxjb2RlPmFkZHJlc3NNb2RlVzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTwvY29kZT4sIDxjb2RlPmFuaXNvdHJvcHlFbmFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiwgYW5kIDxjb2RlPnVubm9ybWFsaXplZENvb3JkaW5hdGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GQUxTRTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pKyhWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1Ob25lLTAxNjQ3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHNhbXBsZXIgcmVkdWN0aW9uIG1vZGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc2V0IHRvIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfV0VJR0hURURfQVZFUkFHRV9FWFQ8L2NvZGU+IGlmIDxhIGhyZWY9XCIjc2FtcGxlcnMtWUNiQ3ItY29udmVyc2lvblwiPnNhbXBsZXIgWSYjODIxNztDPHN1Yj5CPC9zdWI+QzxzdWI+Ujwvc3ViPiBjb252ZXJzaW9uPC9hPiBpcyBlbmFibGVkIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc2FtcGxlcl9taXJyb3JfY2xhbXBfdG9fZWRnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYWRkcmVzc01vZGVVLTAxMDc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPjxhIGhyZWY9XCIjVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2VcIj5WS19LSFJfc2FtcGxlcl9taXJyb3JfY2xhbXBfdG9fZWRnZTwvYT48L2NvZGU+IGV4dGVuc2lvbiBpcyBub3QgZW5hYmxlZCwgPGNvZGU+YWRkcmVzc01vZGVVPC9jb2RlPiwgPGNvZGU+YWRkcmVzc01vZGVWPC9jb2RlPiBhbmQgPGNvZGU+YWRkcmVzc01vZGVXPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SX0NMQU1QX1RPX0VER0U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1hZ0ZpbHRlci0wMTA4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciA8Y29kZT5tYWdGaWx0ZXI8L2NvZGU+IG9yIDxjb2RlPm1pbkZpbHRlcjwvY29kZT4gaXMgPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4sIDxjb2RlPmFuaXNvdHJvcHlFbmFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfSU1HX2ZpbHRlcl9jdWJpYytWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4KSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1hZ0ZpbHRlci0wMTQyMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciA8Y29kZT5tYWdGaWx0ZXI8L2NvZGU+IG9yIDxjb2RlPm1pbkZpbHRlcjwvY29kZT4gaXMgPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4sIHRoZSA8Y29kZT5yZWR1Y3Rpb25Nb2RlPC9jb2RlPiBtZW1iZXIgb2YgPGEgaHJlZj1cIiNWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVFwiPlZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX1dFSUdIVEVEX0FWRVJBR0VfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3NhbXBsZXJfZmlsdGVyX21pbm1heCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tY29tcGFyZUVuYWJsZS0wMTQyMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbXBhcmVFbmFibGU8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCB0aGUgPGNvZGU+cmVkdWN0aW9uTW9kZTwvY29kZT4gbWVtYmVyIG9mIDxhIGhyZWY9XCIjVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFRcIj5Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVDwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9XRUlHSFRFRF9BVkVSQUdFX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9mcmFnbWVudF9kZW5zaXR5X21hcCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tZmxhZ3MtMDI1NzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfU0FNUExFUl9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUPC9jb2RlPiwgdGhlbiA8Y29kZT5taW5GaWx0ZXI8L2NvZGU+IGFuZCA8Y29kZT5tYWdGaWx0ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1mbGFncy0wMjU3NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQ8L2NvZGU+LCB0aGVuIDxjb2RlPm1pcG1hcE1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NBTVBMRVJfTUlQTUFQX01PREVfTkVBUkVTVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTc2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVDwvY29kZT4sIHRoZW4gPGNvZGU+bWluTG9kPC9jb2RlPiBhbmQgPGNvZGU+bWF4TG9kPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1mbGFncy0wMjU3NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQ8L2NvZGU+LCB0aGVuIDxjb2RlPmFkZHJlc3NNb2RlVTwvY29kZT4gYW5kIDxjb2RlPmFkZHJlc3NNb2RlVjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWFjaCBiZSBlaXRoZXIgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTwvY29kZT4gb3IgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tZmxhZ3MtMDI1NzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfU0FNUExFUl9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUPC9jb2RlPiwgdGhlbiA8Y29kZT5hbmlzb3Ryb3B5RW5hYmxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GQUxTRTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVDwvY29kZT4sIHRoZW4gPGNvZGU+Y29tcGFyZUVuYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1mbGFncy0wMjU4MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQ8L2NvZGU+LCB0aGVuIDxjb2RlPnVubm9ybWFsaXplZENvb3JkaW5hdGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GQUxTRTwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9zYW1wbGVyX2ZpbHRlcl9taW5tYXgpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1JFRFVDVElPTl9NT0RFX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhULXJlZHVjdGlvbk1vZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cmVkdWN0aW9uTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVFWFRcIj5Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveVNhbXBsZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2FtcGxlci1zYW1wbGVyLTAxMDgyIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIDxjb2RlPnNhbXBsZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2FtcGxlci1zYW1wbGVyLTAxMDgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+c2FtcGxlcjwvY29kZT4gd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHByb3ZpZGVkIGhlcmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVNhbXBsZXItc2FtcGxlci0wMTA4NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPnNhbXBsZXI8L2NvZGU+IHdhcyBjcmVhdGVkLCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2FtcGxlci1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2FtcGxlcjwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPnNhbXBsZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZXJcIj5Wa1NhbXBsZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2FtcGxlci1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2FtcGxlci1zYW1wbGVyLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNhbXBsZXI8L2NvZGU+IGlzIGEgdmFsaWQgaGFuZGxlLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvLWNvbnZlcnNpb24tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29udmVyc2lvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlclljYmNyQ29udmVyc2lvblwiPlZrU2FtcGxlclljYmNyQ29udmVyc2lvbjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLU5vbmUtMDE2NDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zYW1wbGVyLVlDYkNyLWNvbnZlcnNpb25cIj5zYW1wbGVyIFkmIzgyMTc7QzxzdWI+Qjwvc3ViPkM8c3ViPlI8L3N1Yj4gY29udmVyc2lvbiBmZWF0dXJlPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24tZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm9cIj5Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXBZY2JjckNvbnZlcnNpb24tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFljYmNyQ29udmVyc2lvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25cIj5Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb248L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pKyEoVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC0wMTY0OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0ZPUk1BVF9VTkRFRklORUQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSsoVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC0wMTkwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFuIGV4dGVybmFsIGZvcm1hdCBjb252ZXJzaW9uIGlzIGJlaW5nIGNyZWF0ZWQsIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRk9STUFUX1VOREVGSU5FRDwvY29kZT4sIG90aGVyd2lzZSBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfRk9STUFUX1VOREVGSU5FRDwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JtYXQtMDE2NTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfTUlEUE9JTlRfQ0hST01BX1NBTVBMRVNfQklUPC9jb2RlPiBvciA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teENocm9tYU9mZnNldC0wMTY1MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVDwvY29kZT4sIDxjb2RlPnhDaHJvbWFPZmZzZXQ8L2NvZGU+IGFuZCA8Y29kZT55Q2hyb21hT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teENocm9tYU9mZnNldC0wMTY1MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9NSURQT0lOVF9DSFJPTUFfU0FNUExFU19CSVQ8L2NvZGU+LCA8Y29kZT54Q2hyb21hT2Zmc2V0PC9jb2RlPiBhbmQgPGNvZGU+eUNocm9tYU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tZm9ybWF0LTAxNjUzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiByZXByZXNlbnQgdW5zaWduZWQgbm9ybWFsaXplZCB2YWx1ZXMgKGkuZS4gdGhlIGZvcm1hdCBtdXN0IGJlIGEgPGNvZGU+VU5PUk08L2NvZGU+IGZvcm1hdCkiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tY29tcG9uZW50cy0wMjU4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBmb3JtYXQgaGFzIGEgPGNvZGU+XzQyMjwvY29kZT4gb3IgPGNvZGU+XzQyMDwvY29kZT4gc3VmZml4LCB0aGVuIDxjb2RlPmNvbXBvbmVudHMuZzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNvbXBvbmVudHMtMDI1ODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZm9ybWF0IGhhcyBhIDxjb2RlPl80MjI8L2NvZGU+IG9yIDxjb2RlPl80MjA8L2NvZGU+IHN1ZmZpeCwgdGhlbiA8Y29kZT5jb21wb25lbnRzLmE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZPC9jb2RlPiwgPGNvZGU+VktfQ09NUE9ORU5UX1NXSVpaTEVfT05FPC9jb2RlPiwgb3IgPGNvZGU+VktfQ09NUE9ORU5UX1NXSVpaTEVfWkVSTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tY29tcG9uZW50cy0wMjU4MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBmb3JtYXQgaGFzIGEgPGNvZGU+XzQyMjwvY29kZT4gb3IgPGNvZGU+XzQyMDwvY29kZT4gc3VmZml4LCB0aGVuIDxjb2RlPmNvbXBvbmVudHMucjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFk8L2NvZGU+IG9yIDxjb2RlPlZLX0NPTVBPTkVOVF9TV0laWkxFX0I8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNvbXBvbmVudHMtMDI1ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZm9ybWF0IGhhcyBhIDxjb2RlPl80MjI8L2NvZGU+IG9yIDxjb2RlPl80MjA8L2NvZGU+IHN1ZmZpeCwgdGhlbiA8Y29kZT5jb21wb25lbnRzLmI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZPC9jb2RlPiBvciA8Y29kZT5WS19DT01QT05FTlRfU1dJWlpMRV9SPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jb21wb25lbnRzLTAyNTg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGZvcm1hdCBoYXMgYSA8Y29kZT5fNDIyPC9jb2RlPiBvciA8Y29kZT5fNDIwPC9jb2RlPiBzdWZmaXgsIGFuZCBpZiBlaXRoZXIgPGNvZGU+Y29tcG9uZW50cy5yPC9jb2RlPiBvciA8Y29kZT5jb21wb25lbnRzLmI8L2NvZGU+IGlzIDxjb2RlPlZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZPC9jb2RlPiwgYm90aCB2YWx1ZXMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXljYmNyTW9kZWwtMDE2NTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT55Y2Jjck1vZGVsPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1JHQl9JREVOVElUWTwvY29kZT4sIHRoZW4gPGNvZGU+Y29tcG9uZW50cy5yPC9jb2RlPiwgPGNvZGU+Y29tcG9uZW50cy5nPC9jb2RlPiwgYW5kIDxjb2RlPmNvbXBvbmVudHMuYjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29ycmVzcG9uZCB0byBjaGFubmVscyBvZiB0aGUgPGNvZGU+Zm9ybWF0PC9jb2RlPjsgdGhhdCBpcywgPGNvZGU+Y29tcG9uZW50cy5yPC9jb2RlPiwgPGNvZGU+Y29tcG9uZW50cy5nPC9jb2RlPiwgYW5kIDxjb2RlPmNvbXBvbmVudHMuYjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0NPTVBPTkVOVF9TV0laWkxFX1pFUk88L2NvZGU+IG9yIDxjb2RlPlZLX0NPTVBPTkVOVF9TV0laWkxFX09ORTwvY29kZT4sIGFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29ycmVzcG9uZCB0byBhIGNoYW5uZWwgd2hpY2ggY29udGFpbnMgemVybyBvciBvbmUgYXMgYSBjb25zZXF1ZW5jZSBvZiA8YSBocmVmPVwiI3RleHR1cmVzLWNvbnZlcnNpb24tdG8tcmdiYVwiPmNvbnZlcnNpb24gdG8gUkdCQTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JSYW5nZS0wMjc0OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnljYmNyUmFuZ2U8L2NvZGU+IGlzIDxjb2RlPlZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX05BUlJPVzwvY29kZT4gdGhlbiB0aGUgUiwgRyBhbmQgQiBjaGFubmVscyBvYnRhaW5lZCBieSBhcHBseWluZyB0aGUgPGNvZGU+Y29tcG9uZW50PC9jb2RlPiBzd2l6emxlIHRvIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWFjaCBoYXZlIGEgYml0LWRlcHRoIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA4LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb24tMDE2NTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9GT1JDRUFCTEVfQklUPC9jb2RlPiwgPGNvZGU+Zm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBGQUxTRSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jaHJvbWFGaWx0ZXItMDE2NTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0xJTkVBUl9GSUxURVJfQklUPC9jb2RlPiwgPGNvZGU+Y2hyb21hRmlsdGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GSUxURVJfTkVBUkVTVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEXCI+VmtFeHRlcm5hbEZvcm1hdEFORFJPSUQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby15Y2Jjck1vZGVsLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnljYmNyTW9kZWw8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvblwiPlZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby15Y2JjclJhbmdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnljYmNyUmFuZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZXJZY2JjclJhbmdlXCI+VmtTYW1wbGVyWWNiY3JSYW5nZTwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tY29tcG9uZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21wb25lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21wb25lbnRNYXBwaW5nXCI+VmtDb21wb25lbnRNYXBwaW5nPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teENocm9tYU9mZnNldC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT54Q2hyb21hT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDaHJvbWFMb2NhdGlvblwiPlZrQ2hyb21hTG9jYXRpb248L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXlDaHJvbWFPZmZzZXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+eUNocm9tYU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ2hyb21hTG9jYXRpb25cIj5Wa0Nocm9tYUxvY2F0aW9uPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jaHJvbWFGaWx0ZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y2hyb21hRmlsdGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGaWx0ZXJcIj5Wa0ZpbHRlcjwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXljYmNyQ29udmVyc2lvbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT55Y2JjckNvbnZlcnNpb248L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT55Y2JjckNvbnZlcnNpb248L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25cIj5Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb248L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbi15Y2JjckNvbnZlcnNpb24tcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+eWNiY3JDb252ZXJzaW9uPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm9cIj5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0LXBTZXRMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFNldExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRMYXlvdXRcIj5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1iaW5kaW5nLTAwMjc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1wiPlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc8L2E+Ojo8Y29kZT5iaW5kaW5nPC9jb2RlPiBtZW1iZXJzIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgPGNvZGU+cEJpbmRpbmdzPC9jb2RlPiBhcnJheSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlYWNoIGhhdmUgZGlmZmVyZW50IHZhbHVlcy4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFRcIj5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzXCI+VmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1wQmluZGluZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YmluZGluZ0NvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBCaW5kaW5nczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nXCI+VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZzwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3B1c2hfZGVzY3JpcHRvcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtMDAyODAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUjwvY29kZT4sIHRoZW4gYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBCaW5kaW5nczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gb2YgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM8L2NvZGU+IG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy0wMDI4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSPC9jb2RlPiwgdGhlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGFsbCBiaW5kaW5ncyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSXCI+VmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUjwvYT46Ojxjb2RlPm1heFB1c2hEZXNjcmlwdG9yczwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IpKyhWS19FWFRfaW5saW5lX3VuaWZvcm1fYmxvY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLTAyMjA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFI8L2NvZGU+LCB0aGVuIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wQmluZGluZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtMDMwMDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgYmluZGluZyBoYXMgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhbnkgYmluZGluZyBoYXMgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0LCB0aGVuIGFsbCBiaW5kaW5ncyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gb2YgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM8L2NvZGU+IG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmciOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZy1kZXNjcmlwdG9yVHlwZS0wMDI4MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjwvY29kZT4gb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI8L2NvZGU+LCBhbmQgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPnBJbW11dGFibGVTYW1wbGVyczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wSW1tdXRhYmxlU2FtcGxlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IHZhbGlkIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZy1kZXNjcmlwdG9yQ291bnQtMDAyODMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+c3RhZ2VGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU2hhZGVyU3RhZ2VGbGFnQml0c1wiPlZrU2hhZGVyU3RhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JUeXBlLTAxNTEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UPC9jb2RlPiBhbmQgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIHRoZW4gPGNvZGU+c3RhZ2VGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gb3IgPGNvZGU+VktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JUeXBlXCI+VmtEZXNjcmlwdG9yVHlwZTwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtMDIyMDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4gdGhlbiA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtMDIyMTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4gdGhlbiA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heElubGluZVVuaWZvcm1CbG9ja1NpemU8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWJpbmRpbmdDb3VudC0wMzAwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4gaXMgbm90IHplcm8sIDxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvXCI+VmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbzwvYT46Ojxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtcEJpbmRpbmdGbGFncy0wMzAwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFuIGVsZW1lbnQgb2YgPGNvZGU+cEJpbmRpbmdGbGFnczwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfREVTQ1JJUFRPUl9CSU5ESU5HX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQklUX0VYVDwvY29kZT4sIHRoZW4gYWxsIG90aGVyIGVsZW1lbnRzIG9mIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mb1wiPlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm88L2E+Ojo8Y29kZT5wQmluZGluZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSBzbWFsbGVyIHZhbHVlIG9mIDxjb2RlPmJpbmRpbmc8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZC0wMzAwNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUPC9hPjo6PGNvZGU+ZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kPC9jb2RlPiBpcyBub3QgZW5hYmxlZCwgYWxsIGJpbmRpbmdzIHdpdGggZGVzY3JpcHRvciB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IHVzZSA8Y29kZT5WS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQtMDMwMDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDwvYT46Ojxjb2RlPmRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kPC9jb2RlPiBpcyBub3QgZW5hYmxlZCwgYWxsIGJpbmRpbmdzIHdpdGggZGVzY3JpcHRvciB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSPC9jb2RlPiwgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI8L2NvZGU+LCBvciA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IHVzZSA8Y29kZT5WS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmQtMDMwMDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDwvYT46Ojxjb2RlPmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kPC9jb2RlPiBpcyBub3QgZW5hYmxlZCwgYWxsIGJpbmRpbmdzIHdpdGggZGVzY3JpcHRvciB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgdXNlIDxjb2RlPlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQtMDMwMDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDwvYT46Ojxjb2RlPmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZDwvY29kZT4gaXMgbm90IGVuYWJsZWQsIGFsbCBiaW5kaW5ncyB3aXRoIGRlc2NyaXB0b3IgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCB1c2UgPGNvZGU+VktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kLTAzMDA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ8L2E+Ojo8Y29kZT5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDwvY29kZT4gaXMgbm90IGVuYWJsZWQsIGFsbCBiaW5kaW5ncyB3aXRoIGRlc2NyaXB0b3IgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCB1c2UgPGNvZGU+VktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kLTAzMDEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ8L2E+Ojo8Y29kZT5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDwvY29kZT4gaXMgbm90IGVuYWJsZWQsIGFsbCBiaW5kaW5ncyB3aXRoIGRlc2NyaXB0b3IgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCB1c2UgPGNvZGU+VktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULU5vbmUtMDMwMTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgYmluZGluZ3Mgd2l0aCBkZXNjcmlwdG9yIHR5cGUgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ8L2NvZGU+LCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzwvY29kZT4sIG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgdXNlIDxjb2RlPlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZy0wMzAxMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUPC9hPjo6PGNvZGU+ZGVzY3JpcHRvckJpbmRpbmdVcGRhdGVVbnVzZWRXaGlsZVBlbmRpbmc8L2NvZGU+IGlzIG5vdCBlbmFibGVkLCBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cEJpbmRpbmdGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgPGNvZGU+VktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9VTlVTRURfV0hJTEVfUEVORElOR19CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kLTAzMDEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ8L2E+Ojo8Y29kZT5kZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kPC9jb2RlPiBpcyBub3QgZW5hYmxlZCwgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBCaW5kaW5nRmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIDxjb2RlPlZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudC0wMzAxNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUXCI+VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUPC9hPjo6PGNvZGU+ZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudDwvY29kZT4gaXMgbm90IGVuYWJsZWQsIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wQmluZGluZ0ZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19ERVNDUklQVE9SX0JJTkRJTkdfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1wQmluZGluZ0ZsYWdzLTAzMDE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW4gZWxlbWVudCBvZiA8Y29kZT5wQmluZGluZ0ZsYWdzPC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19ERVNDUklQVE9SX0JJTkRJTkdfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9CSVRfRVhUPC9jb2RlPiwgdGhhdCBlbGVtZW50JiM4MjE3O3MgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzwvY29kZT4gb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9CSU5ESU5HX0ZMQUdTX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtcEJpbmRpbmdGbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5iaW5kaW5nQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBCaW5kaW5nRmxhZ3M8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEJpbmRpbmdGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4gdmFsaWQgY29tYmluYXRpb25zIG9mIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUXCI+VmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9kZXNjcmlwdG9yX2luZGV4aW5nKSsoVktfS0hSX3B1c2hfZGVzY3JpcHRvcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZmxhZ3MtMDMwMDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm9cIj5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGluY2x1ZGVzIDxjb2RlPlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFI8L2NvZGU+LCB0aGVuIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wQmluZGluZ0ZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVDwvY29kZT4sIDxjb2RlPlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVDwvY29kZT4sIG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfQklORElOR19WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZykrKFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQtMDIyMTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVFwiPlZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVDwvYT46Ojxjb2RlPmRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kPC9jb2RlPiBpcyBub3QgZW5hYmxlZCwgYWxsIGJpbmRpbmdzIHdpdGggZGVzY3JpcHRvciB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCB1c2UgPGNvZGU+VktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvXCI+VmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbzwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXBTdXBwb3J0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXBwb3J0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnRcIj5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0PC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFRcIj5Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQ8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIjogeworICAgICAgIihWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGVzY3JpcHRvclNldExheW91dC0wMDI4NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmRlc2NyaXB0b3JTZXRMYXlvdXQ8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAyODUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5kZXNjcmlwdG9yU2V0TGF5b3V0PC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dC1kZXNjcmlwdG9yU2V0TGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JTZXRMYXlvdXQ8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5kZXNjcmlwdG9yU2V0TGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yU2V0TGF5b3V0XCI+VmtEZXNjcmlwdG9yU2V0TGF5b3V0PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGVzY3JpcHRvclNldExheW91dC1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yU2V0TGF5b3V0PC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVQaXBlbGluZUxheW91dC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVBpcGVsaW5lTGF5b3V0LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvXCI+VmtQaXBlbGluZUxheW91dENyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVQaXBlbGluZUxheW91dC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVQaXBlbGluZUxheW91dC1wUGlwZWxpbmVMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFBpcGVsaW5lTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrUGlwZWxpbmVMYXlvdXRcIj5Wa1BpcGVsaW5lTGF5b3V0PC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1zZXRMYXlvdXRDb3VudC0wMDI4NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNldExheW91dENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heEJvdW5kRGVzY3JpcHRvclNldHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wUHVzaENvbnN0YW50UmFuZ2VzLTAwMjkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IHR3byBlbGVtZW50cyBvZiA8Y29kZT5wUHVzaENvbnN0YW50UmFuZ2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSB0aGUgc2FtZSBzdGFnZSBpbiA8Y29kZT5zdGFnZUZsYWdzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zZXRMYXlvdXRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnNldExheW91dENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldExheW91dFwiPlZrRGVzY3JpcHRvclNldExheW91dDwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFB1c2hDb25zdGFudFJhbmdlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wdXNoQ29uc3RhbnRSYW5nZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBQdXNoQ29uc3RhbnRSYW5nZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wdXNoQ29uc3RhbnRSYW5nZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrUHVzaENvbnN0YW50UmFuZ2VcIj5Wa1B1c2hDb25zdGFudFJhbmdlPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI4NyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgb2YgdGhlIHR5cGUgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI8L2NvZGU+IGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4gYWNjZXNzaWJsZSB0byBhbnkgc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI4OCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgb2YgdGhlIHR5cGUgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSPC9jb2RlPiBhbmQgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjwvY29kZT4gYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiBhY2Nlc3NpYmxlIHRvIGFueSBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVyczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4sIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFPC9jb2RlPiwgYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSB0byBhbnkgc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTwvY29kZT4sIGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3NiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgb2YgdGhlIHR5cGUgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3NyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgb2YgdGhlIHR5cGUgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI8L2NvZGU+IGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFNhbXBsZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODAiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSPC9jb2RlPiwgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U8L2NvZGU+LCBhbmQgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTwvY29kZT4sIGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI8L2NvZGU+IGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50czwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZykrKFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBiaW5kaW5ncyB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbmxpbmVVbmlmb3JtQmxvY2tzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDIyMTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGJpbmRpbmdzIHdpdGggYSA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gb2YgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAxNiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gZGVzY3JpcHRvciBzZXQgbGF5b3V0cyBjcmVhdGVkIHdpdGhvdXQgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0IHdpdGggYSA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gb2YgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI8L2NvZGU+IGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4gYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAxNyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gZGVzY3JpcHRvciBzZXQgbGF5b3V0cyBjcmVhdGVkIHdpdGhvdXQgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0IHdpdGggYSA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gb2YgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSPC9jb2RlPiBhbmQgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjwvY29kZT4gYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiBhY2Nlc3NpYmxlIHRvIGFueSBnaXZlbiBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVyczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQ8L2NvZGU+IGJpdCBzZXQgd2l0aCBhIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4sIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFPC9jb2RlPiwgYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQ8L2NvZGU+IGJpdCBzZXQgd2l0aCBhIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTwvY29kZT4sIGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyMSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gZGVzY3JpcHRvciBzZXQgbGF5b3V0cyBjcmVhdGVkIHdpdGhvdXQgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0IHdpdGggYSA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gb2YgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyMiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgd2l0aCBhIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjwvY29kZT4gYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSPC9jb2RlPiBhY2Nlc3NpYmxlIHRvIGFueSBnaXZlbiBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyMyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgd2l0aCBhIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI8L2NvZGU+IGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzwvY29kZT4gYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHdpdGggYSA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gb2YgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSPC9jb2RlPiBhbmQgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSPC9jb2RlPiwgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U8L2NvZGU+LCBhbmQgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSPC9jb2RlPiBhY2Nlc3NpYmxlIHRvIGFueSBnaXZlbiBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFPC9jb2RlPiwgYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyNyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgd2l0aCBhIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVDwvY29kZT4gYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyOCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gZGVzY3JpcHRvciBzZXQgbGF5b3V0cyBjcmVhdGVkIHdpdGhvdXQgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0IHdpdGggYSA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gb2YgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI8L2NvZGU+IGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFNhbXBsZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSPC9jb2RlPiwgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U8L2NvZGU+LCBhbmQgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQ8L2NvZGU+IGJpdCBzZXQgd2l0aCBhIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTwvY29kZT4sIGFuZCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI8L2NvZGU+IGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50czwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAzMDM2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjwvY29kZT4gYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwMzciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAzMDM4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyc0R5bmFtaWM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzAzOSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgb2YgdGhlIHR5cGUgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzRHluYW1pYzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAzMDQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4sIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFPC9jb2RlPiwgYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFPC9jb2RlPiwgYW5kIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjwvY29kZT4gYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZykrKFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBiaW5kaW5ncyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQ8L2NvZGU+IGJpdCBzZXQgd2l0aCBhIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUPC9jb2RlPiBhY2Nlc3NpYmxlIHRvIGFueSBnaXZlbiBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBiaW5kaW5ncyB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ8L2NvZGU+IGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDIyMTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdG90YWwgbnVtYmVyIG9mIGJpbmRpbmdzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ8L2NvZGU+IGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBiaW5kaW5ncyB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ8L2NvZGU+IGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrczwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI5MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGRlc2NyaXB0b3Igc2V0IGxheW91dCB0aGF0IHdhcyBjcmVhdGVkIHdpdGggPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUjwvY29kZT4gc2V0IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMzgxIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHRvdGFsIG51bWJlciBvZiBiaW5kaW5ncyB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WPC9jb2RlPiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPC9jb2RlPjo6PGNvZGU+bWF4RGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZXM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQdXNoQ29uc3RhbnRSYW5nZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLW9mZnNldC0wMDI5NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhQdXNoQ29uc3RhbnRzU2l6ZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utb2Zmc2V0LTAwMjk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLXNpemUtMDAyOTYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utc2l6ZS0wMDI5NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utc2l6ZS0wMDI5OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4UHVzaENvbnN0YW50c1NpemU8L2NvZGU+IG1pbnVzIDxjb2RlPm9mZnNldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utc3RhZ2VGbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGFnZUZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtTaGFkZXJTdGFnZUZsYWdCaXRzXCI+VmtTaGFkZXJTdGFnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utc3RhZ2VGbGFncy1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGFnZUZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lQaXBlbGluZUxheW91dCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC0wMDI5OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPnBpcGVsaW5lTGF5b3V0PC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQtcGlwZWxpbmVMYXlvdXQtMDAzMDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5waXBlbGluZUxheW91dDwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC0wMjAwNCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIHBhc3NlZCB0byBhbnkgPGNvZGU+dmtDbWQqPC9jb2RlPiBjb21tYW5kIGZvciBhbnkgY29tbWFuZCBidWZmZXJzIHRoYXQgYXJlIHN0aWxsIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4gd2hlbiA8Y29kZT52a0Rlc3Ryb3lQaXBlbGluZUxheW91dDwvY29kZT4gaXMgY2FsbGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5waXBlbGluZUxheW91dDwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPnBpcGVsaW5lTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUxheW91dFwiPlZrUGlwZWxpbmVMYXlvdXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVBpcGVsaW5lTGF5b3V0LXBpcGVsaW5lTGF5b3V0LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBpcGVsaW5lTGF5b3V0PC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JQb29sLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvXCI+VmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yUG9vbC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yUG9vbC1wRGVzY3JpcHRvclBvb2wtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cERlc2NyaXB0b3JQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclBvb2xcIj5Wa0Rlc2NyaXB0b3JQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1tYXhTZXRzLTAwMzAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWF4U2V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUXCI+VmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0c1wiPlZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1wUG9vbFNpemVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQb29sU2l6ZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wb29sU2l6ZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclBvb2xTaXplXCI+VmtEZXNjcmlwdG9yUG9vbFNpemU8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvLXBvb2xTaXplQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wb29sU2l6ZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2lubGluZV91bmlmb3JtX2Jsb2NrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0lOTElORV9VTklGT1JNX0JMT0NLX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rlc2NyaXB0b3JQb29sU2l6ZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS1kZXNjcmlwdG9yQ291bnQtMDAzMDIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yUG9vbFNpemUtdHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50eXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yVHlwZVwiPlZrRGVzY3JpcHRvclR5cGU8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfaW5saW5lX3VuaWZvcm1fYmxvY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS10eXBlLTAyMjE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4gdGhlbiA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC0wMDMwMyIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byA8Y29kZT5kZXNjcmlwdG9yUG9vbDwvY29kZT4gKHZpYSBhbnkgYWxsb2NhdGVkIGRlc2NyaXB0b3Igc2V0cykgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC0wMDMwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmRlc2NyaXB0b3JQb29sPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtMDAzMDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBubyA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5kZXNjcmlwdG9yUG9vbDwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yUG9vbDwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmRlc2NyaXB0b3JQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yUG9vbFwiPlZrRGVzY3JpcHRvclBvb2w8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JQb29sPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FsbG9jYXRlRGVzY3JpcHRvclNldHMtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzLXBBbGxvY2F0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEFsbG9jYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm9cIj5Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGVzY3JpcHRvclNldHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wQWxsb2NhdGVJbmZvPC9jb2RlPjo6ZGVzY3JpcHRvclNldENvdW50IDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yU2V0XCI+VmtEZXNjcmlwdG9yU2V0PC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FsbG9jYXRlRGVzY3JpcHRvclNldHMtcEFsbG9jYXRlSW5mbzo6ZGVzY3JpcHRvclNldENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cEFsbG9jYXRlSW5mbzwvY29kZT46Ojxjb2RlPmRlc2NyaXB0b3JTZXRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIjogeworICAgICAgIiEoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1kZXNjcmlwdG9yU2V0Q291bnQtMDAzMDYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXNjcmlwdG9yU2V0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBzZXRzIHRoYXQgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gaW4gPGNvZGU+ZGVzY3JpcHRvclBvb2w8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tZGVzY3JpcHRvclBvb2wtMDAzMDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXNjcmlwdG9yUG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBlbm91Z2ggZnJlZSBkZXNjcmlwdG9yIGNhcGFjaXR5IHJlbWFpbmluZyB0byBhbGxvY2F0ZSB0aGUgZGVzY3JpcHRvciBzZXRzIG9mIHRoZSBzcGVjaWZpZWQgbGF5b3V0cyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3B1c2hfZGVzY3JpcHRvcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1wU2V0TGF5b3V0cy0wMDMwOCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wU2V0TGF5b3V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUjwvY29kZT4gc2V0IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1wU2V0TGF5b3V0cy0wMzA0NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBlbGVtZW50IG9mIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gYml0IHNldCwgPGNvZGU+ZGVzY3JpcHRvclBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVDwvY29kZT4gZmxhZyBzZXQiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVFwiPlZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yUG9vbFwiPlZrRGVzY3JpcHRvclBvb2w8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLXBTZXRMYXlvdXRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGVzY3JpcHRvclNldENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldExheW91dFwiPlZrRGVzY3JpcHRvclNldExheW91dDwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLWRlc2NyaXB0b3JTZXRDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JTZXRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5kZXNjcmlwdG9yUG9vbDwvY29kZT4sIGFuZCB0aGUgZWxlbWVudHMgb2YgPGNvZGU+cFNldExheW91dHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVC1kZXNjcmlwdG9yU2V0Q291bnQtMDMwNDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yU2V0Q291bnQ8L2NvZGU+IGlzIG5vdCB6ZXJvLCA8Y29kZT5kZXNjcmlwdG9yU2V0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvXCI+VmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvPC9hPjo6PGNvZGU+ZGVzY3JpcHRvclNldENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQtcFNldExheW91dHMtMDMwNDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mb1wiPlZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPnBTZXRMYXlvdXRzPC9jb2RlPltpXSBoYXMgYSB2YXJpYWJsZSBkZXNjcmlwdG9yIGNvdW50IGJpbmRpbmcsIHRoZW4gPGNvZGU+cERlc2NyaXB0b3JDb3VudHM8L2NvZGU+W2ldIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVzY3JpcHRvciBjb3VudCBzcGVjaWZpZWQgZm9yIHRoYXQgYmluZGluZyB3aGVuIHRoZSBkZXNjcmlwdG9yIHNldCBsYXlvdXQgd2FzIGNyZWF0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0FMTE9DQVRFX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQtcERlc2NyaXB0b3JDb3VudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclNldENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBEZXNjcmlwdG9yQ291bnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGVzY3JpcHRvclNldENvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtGcmVlRGVzY3JpcHRvclNldHMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JTZXRzLTAwMzA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIGFueSBlbGVtZW50IG9mIDxjb2RlPnBEZXNjcmlwdG9yU2V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtMDAzMTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGVzY3JpcHRvclNldHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kZXNjcmlwdG9yU2V0Q291bnQ8L2NvZGU+IDxjb2RlPlZrRGVzY3JpcHRvclNldDwvY29kZT4gaGFuZGxlcywgZWFjaCBlbGVtZW50IG9mIHdoaWNoIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVpdGhlciBiZSBhIHZhbGlkIGhhbmRsZSBvciA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtMDAzMTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIHZhbGlkIGhhbmRsZSBpbiA8Y29kZT5wRGVzY3JpcHRvclNldHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSA8Y29kZT5kZXNjcmlwdG9yUG9vbDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JQb29sLTAwMzEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVzY3JpcHRvclBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfRlJFRV9ERVNDUklQVE9SX1NFVF9CSVQ8L2NvZGU+IGZsYWciCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yUG9vbFwiPlZrRGVzY3JpcHRvclBvb2w8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtZGVzY3JpcHRvclNldENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVzY3JpcHRvclNldENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JQb29sLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBEZXNjcmlwdG9yU2V0czwvY29kZT4gdGhhdCBpcyBhIHZhbGlkIGhhbmRsZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXNjcmlwdG9yUG9vbDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1Jlc2V0RGVzY3JpcHRvclBvb2wiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldERlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLTAwMzEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHVzZXMgb2YgPGNvZGU+ZGVzY3JpcHRvclBvb2w8L2NvZGU+ICh2aWEgYW55IGFsbG9jYXRlZCBkZXNjcmlwdG9yIHNldHMpIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldERlc2NyaXB0b3JQb29sLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXREZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXNjcmlwdG9yUG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclBvb2xcIj5Wa0Rlc2NyaXB0b3JQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXREZXNjcmlwdG9yUG9vbC1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldERlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtVcGRhdGVEZXNjcmlwdG9yU2V0cyI6IHsKKyAgICAgICIhKFZLX0VYVF9kZXNjcmlwdG9yX2luZGV4aW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1kc3RTZXQtMDAzMTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+ZHN0U2V0PC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBEZXNjcmlwdG9yV3JpdGVzPC9jb2RlPiBvciA8Y29kZT5wRGVzY3JpcHRvckNvcGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgYnkgYW55IGNvbW1hbmQgdGhhdCB3YXMgcmVjb3JkZWQgdG8gYSBjb21tYW5kIGJ1ZmZlciB3aGljaCBpcyBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5wZW5kaW5nIHN0YXRlPC9hPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9kZXNjcmlwdG9yX2luZGV4aW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1Ob25lLTAzMDQ3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRGVzY3JpcHRvciBiaW5kaW5ncyB1cGRhdGVkIGJ5IHRoaXMgY29tbWFuZCB3aGljaCB3ZXJlIGNyZWF0ZWQgd2l0aG91dCB0aGUgPGNvZGU+VktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQ8L2NvZGU+IG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVDwvY29kZT4gYml0cyBzZXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgYnkgYW55IGNvbW1hbmQgdGhhdCB3YXMgcmVjb3JkZWQgdG8gYSBjb21tYW5kIGJ1ZmZlciB3aGljaCBpcyBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5wZW5kaW5nIHN0YXRlPC9hPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yV3JpdGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JXcml0ZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBEZXNjcmlwdG9yV3JpdGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGVzY3JpcHRvcldyaXRlQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtXcml0ZURlc2NyaXB0b3JTZXRcIj5Wa1dyaXRlRGVzY3JpcHRvclNldDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvckNvcGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yQ29weUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBEZXNjcmlwdG9yQ29waWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGVzY3JpcHRvckNvcHlDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0NvcHlEZXNjcmlwdG9yU2V0XCI+VmtDb3B5RGVzY3JpcHRvclNldDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrV3JpdGVEZXNjcmlwdG9yU2V0IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRzdEJpbmRpbmctMDAzMTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RCaW5kaW5nPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1heGltdW0gdmFsdWUgb2YgPGNvZGU+YmluZGluZzwvY29kZT4gb2YgYWxsIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1wiPlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc8L2E+IHN0cnVjdHVyZXMgc3BlY2lmaWVkIHdoZW4gPGNvZGU+ZHN0U2V0PC9jb2RlPiYjODIxNztzIGRlc2NyaXB0b3Igc2V0IGxheW91dCB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDMxNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEJpbmRpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgYmluZGluZyB3aXRoIGEgbm9uLXplcm8gPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvckNvdW50LTAwMzE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGNvbnNlY3V0aXZlIGJpbmRpbmdzIHVwZGF0ZWQgdmlhIGEgc2luZ2xlIDxjb2RlPlZrV3JpdGVEZXNjcmlwdG9yU2V0PC9jb2RlPiBzdHJ1Y3R1cmUsIGV4Y2VwdCB0aG9zZSB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiBvZiB6ZXJvLCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGlkZW50aWNhbCA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gYW5kIDxjb2RlPnN0YWdlRmxhZ3M8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvckNvdW50LTAwMzE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGNvbnNlY3V0aXZlIGJpbmRpbmdzIHVwZGF0ZWQgdmlhIGEgc2luZ2xlIDxjb2RlPlZrV3JpdGVEZXNjcmlwdG9yU2V0PC9jb2RlPiBzdHJ1Y3R1cmUsIGV4Y2VwdCB0aG9zZSB3aXRoIGEgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiBvZiB6ZXJvLCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbGwgZWl0aGVyIHVzZSBpbW11dGFibGUgc2FtcGxlcnMgb3IgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxsIG5vdCB1c2UgaW1tdXRhYmxlIHNhbXBsZXJzLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMTkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2ggdGhlIHR5cGUgb2YgPGNvZGU+ZHN0QmluZGluZzwvY29kZT4gd2l0aGluIDxjb2RlPmRzdFNldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRzdFNldC0wMDMyMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdFNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldFwiPlZrRGVzY3JpcHRvclNldDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kc3RBcnJheUVsZW1lbnQtMDAzMjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPmRzdEFycmF5RWxlbWVudDwvY29kZT4gYW5kIDxjb2RlPmRlc2NyaXB0b3JDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc3BlY2lmaWVkIGJ5IDxjb2RlPmRzdEJpbmRpbmc8L2NvZGU+LCBhbmQgYWxsIGFwcGxpY2FibGUgY29uc2VjdXRpdmUgYmluZGluZ3MsIGFzIGRlc2NyaWJlZCBieSA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLXVwZGF0ZXMtY29uc2VjdXRpdmVcIj5jb25zZWN1dGl2ZSBiaW5kaW5nIHVwZGF0ZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjwvY29kZT4sIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSPC9jb2RlPiwgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U8L2NvZGU+LCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTwvY29kZT4sIG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UPC9jb2RlPiwgPGNvZGU+cEltYWdlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmRlc2NyaXB0b3JDb3VudDwvY29kZT4gdmFsaWQgPGNvZGU+VmtEZXNjcmlwdG9ySW1hZ2VJbmZvPC9jb2RlPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI8L2NvZGU+IG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjwvY29kZT4sIDxjb2RlPnBUZXhlbEJ1ZmZlclZpZXc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IHZhbGlkIDxjb2RlPlZrQnVmZmVyVmlldzwvY29kZT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSPC9jb2RlPiwgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSPC9jb2RlPiwgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM8L2NvZGU+LCBvciA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzwvY29kZT4sIDxjb2RlPnBCdWZmZXJJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiB2YWxpZCA8Y29kZT5Wa0Rlc2NyaXB0b3JCdWZmZXJJbmZvPC9jb2RlPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjwvY29kZT4gb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI8L2NvZGU+LCBhbmQgPGNvZGU+ZHN0U2V0PC9jb2RlPiB3YXMgbm90IGFsbG9jYXRlZCB3aXRoIGEgbGF5b3V0IHRoYXQgaW5jbHVkZWQgaW1tdXRhYmxlIHNhbXBsZXJzIGZvciA8Y29kZT5kc3RCaW5kaW5nPC9jb2RlPiB3aXRoIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiwgdGhlIDxjb2RlPnNhbXBsZXI8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI8L2NvZGU+LCA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTwvY29kZT4sIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFPC9jb2RlPiwgb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ8L2NvZGU+LCB0aGUgPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiBhbmQgPGNvZGU+aW1hZ2VMYXlvdXQ8L2NvZGU+IG1lbWJlcnMgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBJbWFnZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGFuZCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiwgcmVzcGVjdGl2ZWx5IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMTk0NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTwvY29kZT4sIHRoZW4gdGhlIDxjb2RlPmltYWdlVmlldzwvY29kZT4gbWVtYmVyIG9mIGVhY2ggPGNvZGU+cEltYWdlSW5mbzwvY29kZT4gZWxlbWVudCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRob3V0IGEgPGNvZGU+VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbzwvY29kZT4gc3RydWN0dXJlIGluIGl0cyA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAyNzM4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSPC9jb2RlPiwgYW5kIGlmIGFueSBlbGVtZW50IG9mIDxjb2RlPnBJbWFnZUluZm88L2NvZGU+IGhhcyBhIDxjb2RlPmltYWdlVmlldzwvY29kZT4gbWVtYmVyIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm88L2NvZGU+IHN0cnVjdHVyZSBpbiBpdHMgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluLCB0aGVuIDxjb2RlPmRzdFNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGEgbGF5b3V0IHRoYXQgaW5jbHVkZWQgaW1tdXRhYmxlIHNhbXBsZXJzIGZvciA8Y29kZT5kc3RCaW5kaW5nPC9jb2RlPiwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGltbXV0YWJsZSBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYW4gPGVtPmlkZW50aWNhbGx5IGRlZmluZWQ8L2VtPiA8Y29kZT5Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvPC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAxOTQ4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSPC9jb2RlPiwgYW5kIDxjb2RlPmRzdFNldDwvY29kZT4gd2FzIGFsbG9jYXRlZCB3aXRoIGEgbGF5b3V0IHRoYXQgaW5jbHVkZWQgaW1tdXRhYmxlIHNhbXBsZXJzIGZvciA8Y29kZT5kc3RCaW5kaW5nPC9jb2RlPiwgdGhlbiB0aGUgPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBJbWFnZUluZm88L2NvZGU+IHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuIGltbXV0YWJsZSBzYW1wbGVyIHRoYXQgZW5hYmxlcyA8YSBocmVmPVwiI3NhbXBsZXJzLVlDYkNyLWNvbnZlcnNpb25cIj5zYW1wbGVyIFkmIzgyMTc7QzxzdWI+Qjwvc3ViPkM8c3ViPlI8L3N1Yj4gY29udmVyc2lvbjwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm88L2NvZGU+IHN0cnVjdHVyZSBpbiBpdHMgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIHdpdGggYW4gPGVtPmlkZW50aWNhbGx5IGRlZmluZWQ8L2VtPiA8Y29kZT5Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvPC9jb2RlPiB0byB0aGUgY29ycmVzcG9uZGluZyBpbW11dGFibGUgc2FtcGxlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDE0MDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0U8L2NvZGU+LCBmb3IgZWFjaCBkZXNjcmlwdG9yIHRoYXQgd2lsbCBiZSBhY2Nlc3NlZCB2aWEgbG9hZCBvciBzdG9yZSBvcGVyYXRpb25zIHRoZSA8Y29kZT5pbWFnZUxheW91dDwvY29kZT4gbWVtYmVyIGZvciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIDxjb2RlPnBJbWFnZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSPC9jb2RlPiBvciA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzwvY29kZT4sIHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEJ1ZmZlckluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI8L2NvZGU+IG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiwgdGhlIDxjb2RlPm9mZnNldDwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQnVmZmVySW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjwvY29kZT4sIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiwgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSPC9jb2RlPiwgb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPmJ1ZmZlcjwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBCdWZmZXJJbmZvPC9jb2RlPiBpcyB0aGUgaGFuZGxlIG9mIGEgbm9uLXNwYXJzZSBidWZmZXIsIHRoZW4gdGhhdCBidWZmZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjwvY29kZT4gb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM8L2NvZGU+LCB0aGUgPGNvZGU+YnVmZmVyPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBCdWZmZXJJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQ8L2NvZGU+IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSPC9jb2RlPiBvciA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzwvY29kZT4sIHRoZSA8Y29kZT5idWZmZXI8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEJ1ZmZlckluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfQlVGRkVSX0JJVDwvY29kZT4gc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI8L2NvZGU+IG9yIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiwgdGhlIDxjb2RlPnJhbmdlPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBCdWZmZXJJbmZvPC9jb2RlPiwgb3IgdGhlIGVmZmVjdGl2ZSByYW5nZSBpZiA8Y29kZT5yYW5nZTwvY29kZT4gaXMgPGNvZGU+VktfV0hPTEVfU0laRTwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VW5pZm9ybUJ1ZmZlclJhbmdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSPC9jb2RlPiBvciA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzwvY29kZT4sIHRoZSA8Y29kZT5yYW5nZTwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wQnVmZmVySW5mbzwvY29kZT4sIG9yIHRoZSBlZmZlY3RpdmUgcmFuZ2UgaWYgPGNvZGU+cmFuZ2U8L2NvZGU+IGlzIDxjb2RlPlZLX1dIT0xFX1NJWkU8L2NvZGU+LCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFN0b3JhZ2VCdWZmZXJSYW5nZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUjwvY29kZT4sIHRoZSA8Y29kZT5Wa0J1ZmZlcjwvY29kZT4gdGhhdCBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFRleGVsQnVmZmVyVmlldzwvY29kZT4gd2FzIGNyZWF0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQ8L2NvZGU+IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSPC9jb2RlPiwgdGhlIDxjb2RlPlZrQnVmZmVyPC9jb2RlPiB0aGF0IGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wVGV4ZWxCdWZmZXJWaWV3PC9jb2RlPiB3YXMgY3JlYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVDwvY29kZT4gc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTwvY29kZT4gb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ8L2NvZGU+LCB0aGUgPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBJbWFnZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIGlkZW50aXR5IHN3aXp6bGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFPC9jb2RlPiBvciA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjwvY29kZT4sIHRoZSA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDwvY29kZT4gc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMTQwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3JUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTwvY29kZT4gb3IgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI8L2NvZGU+LCB0aGUgPGNvZGU+aW1hZ2VMYXlvdXQ8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtZW1iZXIgb2YgdGhlIGxpc3QgZ2l2ZW4gaW4gPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy1zYW1wbGVkaW1hZ2VcIj5TYW1wbGVkIEltYWdlPC9hPiBvciA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbWJpbmVkaW1hZ2VzYW1wbGVyXCI+Q29tYmluZWQgSW1hZ2UgU2FtcGxlcjwvYT4sIGNvcnJlc3BvbmRpbmcgdG8gaXRzIHR5cGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UPC9jb2RlPiwgdGhlIDxjb2RlPmltYWdlVmlldzwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wSW1hZ2VJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUPC9jb2RlPiBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFPC9jb2RlPiwgdGhlIDxjb2RlPmltYWdlVmlldzwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wSW1hZ2VJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0lNQUdFX1VTQUdFX1NUT1JBR0VfQklUPC9jb2RlPiBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAyNzUyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSPC9jb2RlPiwgdGhlbiA8Y29kZT5kc3RTZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggYSBsYXlvdXQgdGhhdCBpbmNsdWRlZCBpbW11dGFibGUgc2FtcGxlcnMgZm9yIDxjb2RlPmRzdEJpbmRpbmc8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WXCI+VmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvYT4gb3IgPGEgaHJlZj1cIiNWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVFwiPlZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclR5cGVcIj5Wa0Rlc2NyaXB0b3JUeXBlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvckNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+ZHN0U2V0PC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wVGV4ZWxCdWZmZXJWaWV3PC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2lubGluZV91bmlmb3JtX2Jsb2NrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4sIDxjb2RlPmRzdEFycmF5RWxlbWVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiA8Y29kZT40PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4sIDxjb2RlPmRlc2NyaXB0b3JDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiA8Y29kZT40PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4sIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFRcIj5Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVDwvYT4gc3RydWN0dXJlIHdob3NlIDxjb2RlPmRhdGFTaXplPC9jb2RlPiBtZW1iZXIgZXF1YWxzIDxjb2RlPmRlc2NyaXB0b3JDb3VudDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIzODIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXNjcmlwdG9yVHlwZTwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY8L2NvZGU+LCB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYSA8YSBocmVmPVwiI1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlZcIj5Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC9hPiBzdHJ1Y3R1cmUgd2hvc2UgPGNvZGU+YWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ8L2NvZGU+IG1lbWJlciBlcXVhbHMgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yQ291bnQtMDMwNDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgY29uc2VjdXRpdmUgYmluZGluZ3MgdXBkYXRlZCB2aWEgYSBzaW5nbGUgPGNvZGU+VmtXcml0ZURlc2NyaXB0b3JTZXQ8L2NvZGU+IHN0cnVjdHVyZSwgZXhjZXB0IHRob3NlIHdpdGggYSA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IG9mIHplcm8sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgaWRlbnRpY2FsIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUXCI+VmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUPC9hPi4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tb2Zmc2V0LTAwMzQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yQnVmZmVySW5mby1yYW5nZS0wMDM0MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnJhbmdlPC9jb2RlPiBpcyBub3QgZXF1YWwgdG8gPGNvZGU+VktfV0hPTEVfU0laRTwvY29kZT4sIDxjb2RlPnJhbmdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tcmFuZ2UtMDAzNDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5yYW5nZTwvY29kZT4gaXMgbm90IGVxdWFsIHRvIDxjb2RlPlZLX1dIT0xFX1NJWkU8L2NvZGU+LCA8Y29kZT5yYW5nZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4gbWludXMgPGNvZGU+b2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yQnVmZmVySW5mby1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXNjcmlwdG9ySW1hZ2VJbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWltYWdlVmlldy0wMDM0MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlVmlldzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDJEIG9yIDJEIGFycmF5IGltYWdlIHZpZXcgY3JlYXRlZCBmcm9tIGEgM0QgaW1hZ2UiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWltYWdlVmlldy0wMTk3NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlVmlldzwvY29kZT4gaXMgY3JlYXRlZCBmcm9tIGEgZGVwdGgvc3RlbmNpbCBpbWFnZSwgdGhlIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIHRoZSA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgZWl0aGVyIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDwvY29kZT4gYnV0IG5vdCBib3RoLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWltYWdlTGF5b3V0LTAwMzQ0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG1hdGNoIHRoZSBhY3R1YWwgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gb2YgZWFjaCBzdWJyZXNvdXJjZSBhY2Nlc3NpYmxlIGZyb20gPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiBhdCB0aGUgdGltZSB0aGlzIGRlc2NyaXB0b3IgaXMgYWNjZXNzZWQgYXMgZGVmaW5lZCBieSB0aGUgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtbGF5b3V0cy1tYXRjaGluZy1ydWxlXCI+aW1hZ2UgbGF5b3V0IG1hdGNoaW5nIHJ1bGVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiwgYW5kIDxjb2RlPnNhbXBsZXI8L2NvZGU+IHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLXNhbXBsZXItMDE1NjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zYW1wbGVyPC9jb2RlPiBpcyB1c2VkIGFuZCB0aGUgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiBvZiB0aGUgaW1hZ2UgaXMgYSA8YSBocmVmPVwiI2Zvcm1hdHMtcmVxdWlyaW5nLXNhbXBsZXIteWNiY3ItY29udmVyc2lvblwiPm11bHRpLXBsYW5hciBmb3JtYXQ8L2E+LCB0aGUgaW1hZ2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBvZiB0aGUgPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ8L2NvZGU+IG9yIChmb3IgdGhyZWUtcGxhbmUgZm9ybWF0cyBvbmx5KSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQiOiB7CisgICAgICAiKFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhULWRhdGFTaXplLTAyMjIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGF0YVNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhULXBEYXRhLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGF0YVNpemU8L2NvZGU+IGJ5dGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVC1kYXRhU2l6ZS1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRhdGFTaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQtMDIyMzYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiBpbiB0aGUgZXh0ZW5kZWQgc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLTAyNzY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGluIDxjb2RlPnBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzPC9jb2RlPiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX1RPUF9MRVZFTF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEFjY2VsZXJhdGlvblN0cnVjdHVyZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WXCI+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0NvcHlEZXNjcmlwdG9yU2V0IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjQmluZGluZy0wMDM0NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0JpbmRpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgYmluZGluZyB3aXRoaW4gPGNvZGU+c3JjU2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNBcnJheUVsZW1lbnQtMDAzNDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPnNyY0FycmF5RWxlbWVudDwvY29kZT4gYW5kIDxjb2RlPmRlc2NyaXB0b3JDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc3BlY2lmaWVkIGJ5IDxjb2RlPnNyY0JpbmRpbmc8L2NvZGU+LCBhbmQgYWxsIGFwcGxpY2FibGUgY29uc2VjdXRpdmUgYmluZGluZ3MsIGFzIGRlc2NyaWJlZCBieSA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLXVwZGF0ZXMtY29uc2VjdXRpdmVcIj5jb25zZWN1dGl2ZSBiaW5kaW5nIHVwZGF0ZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWRzdEJpbmRpbmctMDAzNDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RCaW5kaW5nPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGJpbmRpbmcgd2l0aGluIDxjb2RlPmRzdFNldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtZHN0QXJyYXlFbGVtZW50LTAwMzQ4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1bSBvZiA8Y29kZT5kc3RBcnJheUVsZW1lbnQ8L2NvZGU+IGFuZCA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIGluIHRoZSBkZXNjcmlwdG9yIHNldCBiaW5kaW5nIHNwZWNpZmllZCBieSA8Y29kZT5kc3RCaW5kaW5nPC9jb2RlPiwgYW5kIGFsbCBhcHBsaWNhYmxlIGNvbnNlY3V0aXZlIGJpbmRpbmdzLCBhcyBkZXNjcmliZWQgYnkgPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy11cGRhdGVzLWNvbnNlY3V0aXZlXCI+Y29uc2VjdXRpdmUgYmluZGluZyB1cGRhdGVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RCaW5kaW5nLTAyNjMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHR5cGUgb2YgPGNvZGU+ZHN0QmluZGluZzwvY29kZT4gd2l0aGluIDxjb2RlPmRzdFNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIHR5cGUgb2YgPGNvZGU+c3JjQmluZGluZzwvY29kZT4gd2l0aGluIDxjb2RlPnNyY1NldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LTAwMzQ5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3JjU2V0PC9jb2RlPiBpcyBlcXVhbCB0byA8Y29kZT5kc3RTZXQ8L2NvZGU+LCB0aGVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJhbmdlcyBvZiBkZXNjcmlwdG9ycyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgb3ZlcmxhcCwgd2hlcmUgdGhlIHJhbmdlcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bWF5PC9zdHJvbmc+IGluY2x1ZGUgYXJyYXkgZWxlbWVudHMgZnJvbSBjb25zZWN1dGl2ZSBiaW5kaW5ncyBhcyBkZXNjcmliZWQgYnkgPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy11cGRhdGVzLWNvbnNlY3V0aXZlXCI+Y29uc2VjdXRpdmUgYmluZGluZyB1cGRhdGVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RCaW5kaW5nLTAyNzUzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGRlc2NyaXB0b3IgdHlwZSBvZiB0aGUgZGVzY3JpcHRvciBzZXQgYmluZGluZyBzcGVjaWZpZWQgYnkgPGNvZGU+ZHN0QmluZGluZzwvY29kZT4gaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI8L2NvZGU+LCB0aGVuIDxjb2RlPmRzdFNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBhIGxheW91dCB0aGF0IGluY2x1ZGVkIGltbXV0YWJsZSBzYW1wbGVycyBmb3IgPGNvZGU+ZHN0QmluZGluZzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQ09QWV9ERVNDUklQVE9SX1NFVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY1NldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldFwiPlZrRGVzY3JpcHRvclNldDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWRzdFNldC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RTZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRcIj5Wa0Rlc2NyaXB0b3JTZXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmRzdFNldDwvY29kZT4sIGFuZCA8Y29kZT5zcmNTZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjQmluZGluZy0wMjIyMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBkZXNjcmlwdG9yIHR5cGUgb2YgdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc3BlY2lmaWVkIGJ5IDxjb2RlPnNyY0JpbmRpbmc8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ8L2NvZGU+LCA8Y29kZT5zcmNBcnJheUVsZW1lbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMjIyNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBkZXNjcmlwdG9yIHR5cGUgb2YgdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc3BlY2lmaWVkIGJ5IDxjb2RlPmRzdEJpbmRpbmc8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ8L2NvZGU+LCA8Y29kZT5kc3RBcnJheUVsZW1lbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjQmluZGluZy0wMjIyNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBkZXNjcmlwdG9yIHR5cGUgb2YgdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc3BlY2lmaWVkIGJ5IGVpdGhlciA8Y29kZT5zcmNCaW5kaW5nPC9jb2RlPiBvciA8Y29kZT5kc3RCaW5kaW5nPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUPC9jb2RlPiwgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LTAxOTE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3JjU2V0PC9jb2RlPiYjODIxNztzIGxheW91dCB3YXMgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDwvY29kZT4gZmxhZyBzZXQsIHRoZW4gPGNvZGU+ZHN0U2V0PC9jb2RlPiYjODIxNztzIGxheW91dCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUPC9jb2RlPiBmbGFnIHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNTZXQtMDE5MTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zcmNTZXQ8L2NvZGU+JiM4MjE3O3MgbGF5b3V0IHdhcyBjcmVhdGVkIHdpdGhvdXQgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUPC9jb2RlPiBmbGFnIHNldCwgdGhlbiA8Y29kZT5kc3RTZXQ8L2NvZGU+JiM4MjE3O3MgbGF5b3V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aG91dCB0aGUgPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQ8L2NvZGU+IGZsYWcgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY1NldC0wMTkyMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBkZXNjcmlwdG9yIHBvb2wgZnJvbSB3aGljaCA8Y29kZT5zcmNTZXQ8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9CSVRfRVhUPC9jb2RlPiBmbGFnIHNldCwgdGhlbiB0aGUgZGVzY3JpcHRvciBwb29sIGZyb20gd2hpY2ggPGNvZGU+ZHN0U2V0PC9jb2RlPiB3YXMgYWxsb2NhdGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9CSVRfRVhUPC9jb2RlPiBmbGFnIHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNTZXQtMDE5MjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZGVzY3JpcHRvciBwb29sIGZyb20gd2hpY2ggPGNvZGU+c3JjU2V0PC9jb2RlPiB3YXMgYWxsb2NhdGVkIHdhcyBjcmVhdGVkIHdpdGhvdXQgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVDwvY29kZT4gZmxhZyBzZXQsIHRoZW4gdGhlIGRlc2NyaXB0b3IgcG9vbCBmcm9tIHdoaWNoIDxjb2RlPmRzdFNldDwvY29kZT4gd2FzIGFsbG9jYXRlZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGhhdmUgYmVlbiBjcmVhdGVkIHdpdGhvdXQgdGhlIDxjb2RlPlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVDwvY29kZT4gZmxhZyBzZXQiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvXCI+VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVcIj5Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tdGVtcGxhdGVUeXBlLTAwMzUwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dGVtcGxhdGVUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUPC9jb2RlPiwgPGNvZGU+ZGVzY3JpcHRvclNldExheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8Y29kZT5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXQ8L2NvZGU+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeVwiPlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnk8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dGVtcGxhdGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlXCI+VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLWRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+ZGVzY3JpcHRvclNldExheW91dDwvY29kZT4sIGFuZCA8Y29kZT5waXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZSkrKFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tdGVtcGxhdGVUeXBlLTAwMzUxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dGVtcGxhdGVUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSPC9jb2RlPiwgPGNvZGU+cGlwZWxpbmVCaW5kUG9pbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQmluZFBvaW50XCI+VmtQaXBlbGluZUJpbmRQb2ludDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtMDAzNTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT50ZW1wbGF0ZVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfUFVTSF9ERVNDUklQVE9SU19LSFI8L2NvZGU+LCA8Y29kZT5waXBlbGluZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtMDAzNTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT50ZW1wbGF0ZVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfUFVTSF9ERVNDUklQVE9SU19LSFI8L2NvZGU+LCA8Y29kZT5zZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHRoZSB1bmlxdWUgc2V0IG51bWJlciBpbiB0aGUgcGlwZWxpbmUgbGF5b3V0IHRoYXQgdXNlcyBhIGRlc2NyaXB0b3Igc2V0IGxheW91dCB0aGF0IHdhcyBjcmVhdGVkIHdpdGggPGNvZGU+VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5IjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5LWRzdEJpbmRpbmctMDAzNTQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RCaW5kaW5nPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGJpbmRpbmcgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGxheW91dCBpbXBsaWNpdGx5IHNwZWNpZmllZCB3aGVuIHVzaW5nIGEgZGVzY3JpcHRvciB1cGRhdGUgdGVtcGxhdGUgdG8gdXBkYXRlIGRlc2NyaXB0b3JzLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeS1kc3RBcnJheUVsZW1lbnQtMDAzNTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RBcnJheUVsZW1lbnQ8L2NvZGU+IGFuZCA8Y29kZT5kZXNjcmlwdG9yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIGluIHRoZSBkZXNjcmlwdG9yIHNldCBiaW5kaW5nIGltcGxpY2l0bHkgc3BlY2lmaWVkIHdoZW4gdXNpbmcgYSBkZXNjcmlwdG9yIHVwZGF0ZSB0ZW1wbGF0ZSB0byB1cGRhdGUgZGVzY3JpcHRvcnMsIGFuZCBhbGwgYXBwbGljYWJsZSBjb25zZWN1dGl2ZSBiaW5kaW5ncywgYXMgZGVzY3JpYmVkIGJ5IDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtdXBkYXRlcy1jb25zZWN1dGl2ZVwiPmNvbnNlY3V0aXZlIGJpbmRpbmcgdXBkYXRlczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnktZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVzY3JpcHRvclR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JUeXBlXCI+VmtEZXNjcmlwdG9yVHlwZTwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZSkrKFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnktZGVzY3JpcHRvci0wMjIyNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRlc2NyaXB0b3I8L2NvZGU+IHR5cGUgaXMgPGNvZGU+VktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDwvY29kZT4sIDxjb2RlPmRzdEFycmF5RWxlbWVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiA8Y29kZT40PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeS1kZXNjcmlwdG9yLTAyMjI3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvcjwvY29kZT4gdHlwZSBpcyA8Y29kZT5WS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUPC9jb2RlPiwgPGNvZGU+ZGVzY3JpcHRvckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGVzY3JpcHRvclNldExheW91dC0wMDM1NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmRlc2NyaXB0b3JTZXRMYXlvdXQ8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGVzY3JpcHRvclNldExheW91dC0wMDM1NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmRlc2NyaXB0b3JTZXRMYXlvdXQ8L2NvZGU+IHdhcyBjcmVhdGVkLCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+ZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVcIj5Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlLXBEYXRhLTAxNjg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cERhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIG1lbW9yeSBjb250YWluaW5nIG9uZSBvciBtb3JlIHZhbGlkIGluc3RhbmNlcyBvZiA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvckltYWdlSW5mb1wiPlZrRGVzY3JpcHRvckltYWdlSW5mbzwvYT4sIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yQnVmZmVySW5mb1wiPlZrRGVzY3JpcHRvckJ1ZmZlckluZm88L2E+LCBvciA8YSBocmVmPVwiI1ZrQnVmZmVyVmlld1wiPlZrQnVmZmVyVmlldzwvYT4gaW4gYSBsYXlvdXQgZGVmaW5lZCBieSA8Y29kZT5kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L2NvZGU+IHdoZW4gaXQgd2FzIGNyZWF0ZWQgd2l0aCA8YSBocmVmPVwiI3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlXCI+dmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlLWRlc2NyaXB0b3JTZXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVzY3JpcHRvclNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclNldFwiPlZrRGVzY3JpcHRvclNldDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlXCI+VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZEJpbmREZXNjcmlwdG9yU2V0cyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtMDAzNTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cERlc2NyaXB0b3JTZXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggYSA8Y29kZT5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXQ8L2NvZGU+IHRoYXQgbWF0Y2hlcyAoaXMgdGhlIHNhbWUgYXMsIG9yIGlkZW50aWNhbGx5IGRlZmluZWQgYXMpIHRoZSA8Y29kZT5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXQ8L2NvZGU+IGF0IHNldCA8ZW0+bjwvZW0+IGluIDxjb2RlPmxheW91dDwvY29kZT4sIHdoZXJlIDxlbT5uPC9lbT4gaXMgdGhlIHN1bSBvZiA8Y29kZT5maXJzdFNldDwvY29kZT4gYW5kIHRoZSBpbmRleCBpbnRvIDxjb2RlPnBEZXNjcmlwdG9yU2V0czwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWR5bmFtaWNPZmZzZXRDb3VudC0wMDM1OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmR5bmFtaWNPZmZzZXRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBkeW5hbWljIGRlc2NyaXB0b3JzIGluIDxjb2RlPnBEZXNjcmlwdG9yU2V0czwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWZpcnN0U2V0LTAwMzYwIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1bSBvZiA8Y29kZT5maXJzdFNldDwvY29kZT4gYW5kIDxjb2RlPmRlc2NyaXB0b3JTZXRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvPC9jb2RlPjo6PGNvZGU+c2V0TGF5b3V0Q291bnQ8L2NvZGU+IHByb3ZpZGVkIHdoZW4gPGNvZGU+bGF5b3V0PC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcGlwZWxpbmVCaW5kUG9pbnQtMDAzNjEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGJ5IHRoZSA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiYjODIxNztzIHBhcmVudCA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiYjODIxNztzIHF1ZXVlIGZhbWlseSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcER5bmFtaWNPZmZzZXRzLTAxOTcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBEeW5hbWljT2Zmc2V0czwvY29kZT4gd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBkZXNjcmlwdG9yIGJpbmRpbmcgd2l0aCB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5taW5Vbmlmb3JtQnVmZmVyT2Zmc2V0QWxpZ25tZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcER5bmFtaWNPZmZzZXRzLTAxOTcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBEeW5hbWljT2Zmc2V0czwvY29kZT4gd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBkZXNjcmlwdG9yIGJpbmRpbmcgd2l0aCB0eXBlIDxjb2RlPlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5taW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JTZXRzLTAxOTc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggZHluYW1pYyB1bmlmb3JtIG9yIHN0b3JhZ2UgYnVmZmVyIGJpbmRpbmcgaW4gPGNvZGU+cERlc2NyaXB0b3JTZXRzPC9jb2RlPiwgdGhlIHN1bSBvZiB0aGUgZWZmZWN0aXZlIG9mZnNldCwgYXMgZGVmaW5lZCBhYm92ZSwgYW5kIHRoZSByYW5nZSBvZiB0aGUgYmluZGluZyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBpcGVsaW5lQmluZFBvaW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lQmluZFBvaW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUJpbmRQb2ludFwiPlZrUGlwZWxpbmVCaW5kUG9pbnQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1sYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUxheW91dFwiPlZrUGlwZWxpbmVMYXlvdXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JTZXRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEZXNjcmlwdG9yU2V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmRlc2NyaXB0b3JTZXRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRcIj5Wa0Rlc2NyaXB0b3JTZXQ8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBEeW5hbWljT2Zmc2V0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5keW5hbWljT2Zmc2V0Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cER5bmFtaWNPZmZzZXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+ZHluYW1pY09mZnNldENvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JTZXRDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JTZXRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCA8Y29kZT5sYXlvdXQ8L2NvZGU+LCBhbmQgdGhlIGVsZW1lbnRzIG9mIDxjb2RlPnBEZXNjcmlwdG9yU2V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIiOiB7CisgICAgICAiKFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLXBpcGVsaW5lQmluZFBvaW50LTAwMzYzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGlwZWxpbmVCaW5kUG9pbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHN1cHBvcnRlZCBieSB0aGUgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4mIzgyMTc7cyBwYXJlbnQgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4mIzgyMTc7cyBxdWV1ZSBmYW1pbHkiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItc2V0LTAwMzY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+VmtQaXBlbGluZUxheW91dENyZWF0ZUluZm88L2NvZGU+Ojo8Y29kZT5zZXRMYXlvdXRDb3VudDwvY29kZT4gcHJvdmlkZWQgd2hlbiA8Y29kZT5sYXlvdXQ8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLXNldC0wMDM2NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIHVuaXF1ZSBzZXQgbnVtYmVyIGluIHRoZSBwaXBlbGluZSBsYXlvdXQgdGhhdCB1c2VzIGEgZGVzY3JpcHRvciBzZXQgbGF5b3V0IHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1waXBlbGluZUJpbmRQb2ludC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVCaW5kUG9pbnRcIj5Wa1BpcGVsaW5lQmluZFBvaW50PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1sYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUxheW91dFwiPlZrUGlwZWxpbmVMYXlvdXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1wRGVzY3JpcHRvcldyaXRlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGVzY3JpcHRvcldyaXRlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmRlc2NyaXB0b3JXcml0ZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrV3JpdGVEZXNjcmlwdG9yU2V0XCI+VmtXcml0ZURlc2NyaXB0b3JTZXQ8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItZGVzY3JpcHRvcldyaXRlQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXNjcmlwdG9yV3JpdGVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5sYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSIjogeworICAgICAgIihWS19LSFJfcHVzaF9kZXNjcmlwdG9yKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1jb21tYW5kQnVmZmVyLTAwMzY2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnBpcGVsaW5lQmluZFBvaW50PC9jb2RlPiBzcGVjaWZpZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgZGVzY3JpcHRvciB1cGRhdGUgdGVtcGxhdGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc3VwcG9ydGVkIGJ5IHRoZSA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiYjODIxNztzIHBhcmVudCA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiYjODIxNztzIHF1ZXVlIGZhbWlseSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1wRGF0YS0wMTY4NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBtZW1vcnkgY29udGFpbmluZyBvbmUgb3IgbW9yZSB2YWxpZCBpbnN0YW5jZXMgb2YgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JJbWFnZUluZm9cIj5Wa0Rlc2NyaXB0b3JJbWFnZUluZm88L2E+LCA8YSBocmVmPVwiI1ZrRGVzY3JpcHRvckJ1ZmZlckluZm9cIj5Wa0Rlc2NyaXB0b3JCdWZmZXJJbmZvPC9hPiwgb3IgPGEgaHJlZj1cIiNWa0J1ZmZlclZpZXdcIj5Wa0J1ZmZlclZpZXc8L2E+IGluIGEgbGF5b3V0IGRlZmluZWQgYnkgPGNvZGU+ZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPC9jb2RlPiB3aGVuIGl0IHdhcyBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiN2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUlwiPnZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVcIj5Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWxheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5sYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BpcGVsaW5lTGF5b3V0XCI+VmtQaXBlbGluZUxheW91dDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIDxjb2RlPmRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTwvY29kZT4sIGFuZCA8Y29kZT5sYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFB1c2hDb25zdGFudHMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMTc5NSIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIGJ5dGUgaW4gdGhlIHJhbmdlIHNwZWNpZmllZCBieSA8Y29kZT5vZmZzZXQ8L2NvZGU+IGFuZCA8Y29kZT5zaXplPC9jb2RlPiBhbmQgZm9yIGVhY2ggc2hhZGVyIHN0YWdlIGluIDxjb2RlPnN0YWdlRmxhZ3M8L2NvZGU+LCB0aGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHB1c2ggY29uc3RhbnQgcmFuZ2UgaW4gPGNvZGU+bGF5b3V0PC9jb2RlPiB0aGF0IGluY2x1ZGVzIHRoYXQgYnl0ZSBhbmQgdGhhdCBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMTc5NiIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIGJ5dGUgaW4gdGhlIHJhbmdlIHNwZWNpZmllZCBieSA8Y29kZT5vZmZzZXQ8L2NvZGU+IGFuZCA8Y29kZT5zaXplPC9jb2RlPiBhbmQgZm9yIGVhY2ggcHVzaCBjb25zdGFudCByYW5nZSB0aGF0IG92ZXJsYXBzIHRoYXQgYnl0ZSwgPGNvZGU+c3RhZ2VGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhbGwgc3RhZ2VzIGluIHRoYXQgcHVzaCBjb25zdGFudCByYW5nZSYjODIxNztzIDxhIGhyZWY9XCIjVmtQdXNoQ29uc3RhbnRSYW5nZVwiPlZrUHVzaENvbnN0YW50UmFuZ2U8L2E+Ojo8Y29kZT5zdGFnZUZsYWdzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMDM2OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT40PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXNpemUtMDAzNjkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtb2Zmc2V0LTAwMzcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFB1c2hDb25zdGFudHNTaXplPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXNpemUtMDAzNzEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFB1c2hDb25zdGFudHNTaXplPC9jb2RlPiBtaW51cyA8Y29kZT5vZmZzZXQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1sYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUxheW91dFwiPlZrUGlwZWxpbmVMYXlvdXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXN0YWdlRmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RhZ2VGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU2hhZGVyU3RhZ2VGbGFnQml0c1wiPlZrU2hhZGVyU3RhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc3RhZ2VGbGFncy1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdGFnZUZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1wVmFsdWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBWYWx1ZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zaXplPC9jb2RlPiBieXRlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1zaXplLWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPmxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUiI6IHsKKyAgICAgICIoVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyxWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSLWJ1ZmZlckRldmljZUFkZHJlc3MtMDMzMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1idWZmZXJEZXZpY2VBZGRyZXNzXCI+YnVmZmVyRGV2aWNlQWRkcmVzczwvYT4gb3IgPGEgaHJlZj1cIiNmZWF0dXJlcy1idWZmZXJEZXZpY2VBZGRyZXNzRVhUXCI+PGNvZGU+VmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVDwvY29kZT46Ojxjb2RlPmJ1ZmZlckRldmljZUFkZHJlc3M8L2NvZGU+PC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUi1kZXZpY2UtMDMzMjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kZXZpY2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggbXVsdGlwbGUgcGh5c2ljYWwgZGV2aWNlcywgdGhlbiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2VcIj5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U8L2E+IG9yIDxhIGhyZWY9XCIjZmVhdHVyZXMtYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlRVhUXCI+PGNvZGU+VmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVDwvY29kZT46Ojxjb2RlPmJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZTwvY29kZT48L2E+IGZlYXR1cmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUi1wSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSXCI+VmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiI6IHsKKyAgICAgICIoVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyxWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1idWZmZXItMDI2MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgYW5kIHdhcyBub3QgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFI8L2NvZGU+IGZsYWcsIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItYnVmZmVyLTAyNjAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9TSEFERVJfREVWSUNFX0FERFJFU1NfQklUX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItTm9uZS0wMzMyNiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWJ1ZmZlckRldmljZUFkZHJlc3NcIj5idWZmZXJEZXZpY2VBZGRyZXNzPC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItZGV2aWNlLTAzMzI3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZGV2aWNlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIG11bHRpcGxlIHBoeXNpY2FsIGRldmljZXMsIHRoZW4gdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlXCI+YnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlPC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUi1wSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSXCI+VmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVRdWVyeVBvb2wiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVRdWVyeVBvb2wtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVRdWVyeVBvb2wtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWVyeVBvb2xDcmVhdGVJbmZvXCI+VmtRdWVyeVBvb2xDcmVhdGVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlUXVlcnlQb29sLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVF1ZXJ5UG9vbC1wUXVlcnlQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBRdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtRdWVyeVBvb2xcIj5Wa1F1ZXJ5UG9vbDwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtRdWVyeVBvb2xDcmVhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDA3OTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1waXBlbGluZVN0YXRpc3RpY3NRdWVyeVwiPnBpcGVsaW5lIHN0YXRpc3RpY3MgcXVlcmllczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLXF1ZXJ5VHlwZS0wMDc5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gaXMgPGNvZGU+VktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTPC9jb2RlPiwgPGNvZGU+cGlwZWxpbmVTdGF0aXN0aWNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHNcIj5Wa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tcXVlcnlDb3VudC0wMjc2MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXJ5Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiAwIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSXCI+VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWVyeVR5cGVcIj5Wa1F1ZXJ5VHlwZTwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9wZXJmb3JtYW5jZV9xdWVyeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDMyMjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIGEgc3RydWN0dXJlIG9mIHR5cGUgPGEgaHJlZj1cIiNWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUlwiPlZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1xdWV1ZUZhbWlseUluZGV4LTAzMjM2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBxdWV1ZSBmYW1pbHkgaW5kZXggb2YgdGhlIGRldmljZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItcGVyZm9ybWFuY2VDb3VudGVyUXVlcnlQb29scy0wMzIzNyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWZlYXR1cmVzLXBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHNcIj48Y29kZT5wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzPC9jb2RlPjwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1wQ291bnRlckluZGljZXMtMDMzMjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cENvdW50ZXJJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgcmFuZ2Ugb2YgY291bnRlcnMgcmVwb3J0ZWQgYnkgPGNvZGU+dmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSPC9jb2RlPiBmb3IgdGhlIHF1ZXVlIGZhbWlseSBzcGVjaWZpZWQgaW4gPGNvZGU+cXVldWVGYW1pbHlJbmRleDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItcENvdW50ZXJJbmRpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDb3VudGVySW5kaWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmNvdW50ZXJJbmRleENvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1jb3VudGVySW5kZXhDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvdW50ZXJJbmRleENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSIjogeworICAgICAgIihWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUi1wUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSXCI+VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUi1wTnVtUGFzc2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOdW1QYXNzZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveVF1ZXJ5UG9vbCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtcXVlcnlQb29sLTAwNzkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtcXVlcnlQb29sLTAwNzk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC0wMDc5NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1F1ZXJ5UG9vbFwiPlZrUXVlcnlQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVF1ZXJ5UG9vbC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IGlzIGEgdmFsaWQgaGFuZGxlLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRSZXNldFF1ZXJ5UG9vbCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLWZpcnN0UXVlcnktMDA3OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5maXJzdFF1ZXJ5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzZXRRdWVyeVBvb2wtZmlyc3RRdWVyeS0wMDc5NyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdW0gb2YgPGNvZGU+Zmlyc3RRdWVyeTwvY29kZT4gYW5kIDxjb2RlPnF1ZXJ5Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gPGNvZGU+cXVlcnlQb29sPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1xdWVyeVBvb2wtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWVyeVBvb2xcIj5Wa1F1ZXJ5UG9vbDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1Jlc2V0UXVlcnlQb29sRVhUIjogeworICAgICAgIihWS19FWFRfaG9zdF9xdWVyeV9yZXNldCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtTm9uZS0wMjY2NSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWhvc3RRdWVyeVJlc2V0XCI+aG9zdFF1ZXJ5UmVzZXQ8L2E+IGZlYXR1cmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1maXJzdFF1ZXJ5LTAyNjY2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zmlyc3RRdWVyeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULWZpcnN0UXVlcnktMDI2NjciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPmZpcnN0UXVlcnk8L2NvZGU+IGFuZCA8Y29kZT5xdWVyeUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtZmlyc3RRdWVyeS0wMjc0MSIsCisgICAgICAgICAgInRleHQiOiAiIFN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgPGNvZGU+Zmlyc3RRdWVyeTwvY29kZT4gYW5kIDxjb2RlPnF1ZXJ5Q291bnQ8L2NvZGU+IGluIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULWZpcnN0UXVlcnktMDI3NDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgcmFuZ2Ugb2YgcXVlcmllcyBzcGVjaWZpZWQgYnkgPGNvZGU+Zmlyc3RRdWVyeTwvY29kZT4gYW5kIDxjb2RlPnF1ZXJ5Q291bnQ8L2NvZGU+IGluIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGluIHVzZSBieSBjYWxscyB0byA8YSBocmVmPVwiI3ZrR2V0UXVlcnlQb29sUmVzdWx0c1wiPnZrR2V0UXVlcnlQb29sUmVzdWx0czwvYT4gb3IgPGNvZGU+dmtSZXNldFF1ZXJ5UG9vbEVYVDwvY29kZT4gaW4gb3RoZXIgdGhyZWFkcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1F1ZXJ5UG9vbFwiPlZrUXVlcnlQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtcXVlcnlQb29sLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQmVnaW5RdWVyeSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAxOTIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiB0aGF0IGRpZmZlcnMgZnJvbSB0aGF0IG9mIGFueSBxdWVyaWVzIHRoYXQgYXJlIDxhIGhyZWY9XCIjcXVlcmllcy1vcGVyYXRpb24tYWN0aXZlXCI+YWN0aXZlPC9hPiB3aXRoaW4gPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeS1Ob25lLTAwODA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHF1ZXJpZXMgdXNlZCBieSB0aGUgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmF2YWlsYWJsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMjgwNCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX1FVRVJZX1RZUEVfVElNRVNUQU1QPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMDgwMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLW9jY2x1c2lvblF1ZXJ5UHJlY2lzZVwiPnByZWNpc2Ugb2NjbHVzaW9uIHF1ZXJpZXM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIG9yIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIG5vdCA8Y29kZT5WS19RVUVSWV9UWVBFX09DQ0xVU0lPTjwvY29kZT4sIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19RVUVSWV9DT05UUk9MX1BSRUNJU0VfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5LTAwODAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gPGNvZGU+cXVlcnlQb29sPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMDgwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIDxjb2RlPlZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OPC9jb2RlPiwgdGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMDgwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIDxjb2RlPlZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUzwvY29kZT4gYW5kIGFueSBvZiB0aGUgPGNvZGU+cGlwZWxpbmVTdGF0aXN0aWNzPC9jb2RlPiBpbmRpY2F0ZSBncmFwaGljcyBvcGVyYXRpb25zLCB0aGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlUeXBlLTAwODA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTPC9jb2RlPiBhbmQgYW55IG9mIHRoZSA8Y29kZT5waXBlbGluZVN0YXRpc3RpY3M8L2NvZGU+IGluZGljYXRlIGNvbXB1dGUgb3BlcmF0aW9ucywgdGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVBvb2wtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWVyeVBvb2xcIj5Wa1F1ZXJ5UG9vbDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1F1ZXJ5Q29udHJvbEZsYWdCaXRzXCI+VmtRdWVyeUNvbnRyb2xGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LWNvbW1hbmRCdWZmZXItMDE4ODUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnktMDA4MDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSBzdW0gb2YgPGNvZGU+cXVlcnk8L2NvZGU+IGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBjdXJyZW50IHN1YnBhc3MmIzgyMTc7cyB2aWV3IG1hc2sgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMjMyNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIDxjb2RlPlZLX1FVRVJZX1RZUEVfVFJBTlNGT1JNX0ZFRURCQUNLX1NUUkVBTV9FWFQ8L2NvZGU+IHRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDIzMjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyA8Y29kZT5WS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUPC9jb2RlPiB0aGVuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT50cmFuc2Zvcm1GZWVkYmFja1F1ZXJpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHN1cHBvcnRlZCIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC0wMzIyMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gb2YgPGNvZGU+VktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI8L2NvZGU+LCB0aGUgPGEgaHJlZj1cIiNwcm9maWxpbmctbG9ja1wiPnByb2ZpbGluZyBsb2NrPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gaGVsZCBiZWZvcmUgPGEgaHJlZj1cIiN2a0JlZ2luQ29tbWFuZEJ1ZmZlclwiPnZrQmVnaW5Db21tYW5kQnVmZmVyPC9hPiB3YXMgY2FsbGVkIG9uIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAzMjI0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUjwvY29kZT4gYW5kIG9uZSBvZiB0aGUgY291bnRlcnMgdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfU0NPUEVfQ09NTUFORF9CVUZGRVJfS0hSPC9jb2RlPiwgdGhlIHF1ZXJ5IGJlZ2luIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHRoZSBmaXJzdCByZWNvcmRlZCBjb21tYW5kIGluIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAzMjI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUjwvY29kZT4gYW5kIG9uZSBvZiB0aGUgY291bnRlcnMgdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfU0NPUEVfUkVOREVSX1BBU1NfS0hSPC9jb2RlPiwgdGhlIGJlZ2luIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHJlY29yZGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAzMjI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUjwvY29kZT4gYW5kIGFub3RoZXIgcXVlcnkgcG9vbCB3aXRoIGEgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiA8Y29kZT5WS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUjwvY29kZT4gaGFzIGJlZW4gdXNlZCB3aXRoaW4gPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGl0cyBwYXJlbnQgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlciBvciBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIgcmVjb3JkZWQgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBwcmltYXJ5IGNvbW1hbmQgYnVmZmVyIGFzIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1mZWF0dXJlcy1wZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHNcIj48Y29kZT5wZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHM8L2NvZGU+PC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIjogeworICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDE5MjIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHRoYXQgZGlmZmVycyBmcm9tIHRoYXQgb2YgYW55IHF1ZXJpZXMgdGhhdCBhcmUgPGEgaHJlZj1cIiNxdWVyaWVzLW9wZXJhdGlvbi1hY3RpdmVcIj5hY3RpdmU8L2E+IHdpdGhpbiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1Ob25lLTAwODA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHF1ZXJpZXMgdXNlZCBieSB0aGUgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmF2YWlsYWJsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDI4MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19RVUVSWV9UWVBFX1RJTUVTVEFNUDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAwODAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtb2NjbHVzaW9uUXVlcnlQcmVjaXNlXCI+cHJlY2lzZSBvY2NsdXNpb24gcXVlcmllczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgb3IgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgbm90IDxjb2RlPlZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OPC9jb2RlPiwgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjb250YWluIDxjb2RlPlZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5LTAwODAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gPGNvZGU+cXVlcnlQb29sPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDA4MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyA8Y29kZT5WS19RVUVSWV9UWVBFX09DQ0xVU0lPTjwvY29kZT4sIHRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAwODA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTPC9jb2RlPiBhbmQgYW55IG9mIHRoZSA8Y29kZT5waXBlbGluZVN0YXRpc3RpY3M8L2NvZGU+IGluZGljYXRlIGdyYXBoaWNzIG9wZXJhdGlvbnMsIHRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAwODA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTPC9jb2RlPiBhbmQgYW55IG9mIHRoZSA8Y29kZT5waXBlbGluZVN0YXRpc3RpY3M8L2NvZGU+IGluZGljYXRlIGNvbXB1dGUgb3BlcmF0aW9ucywgdGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjMzOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIDxjb2RlPlZLX1FVRVJZX1RZUEVfVFJBTlNGT1JNX0ZFRURCQUNLX1NUUkVBTV9FWFQ8L2NvZGU+IHRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAyMzM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9UUkFOU0ZPUk1fRkVFREJBQ0tfU1RSRUFNX0VYVDwvY29kZT4gdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBwYXJhbWV0ZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjM0MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIG5vdCA8Y29kZT5WS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUPC9jb2RlPiB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAyMzQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9UUkFOU0ZPUk1fRkVFREJBQ0tfU1RSRUFNX0VYVDwvY29kZT4gdGhlbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+dHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzdXBwb3J0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUXVlcnlQb29sXCI+VmtRdWVyeVBvb2w8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUXVlcnlDb250cm9sRmxhZ0JpdHNcIj5Wa1F1ZXJ5Q29udHJvbEZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykrKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1jb21tYW5kQnVmZmVyLTAxODg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnktMDA4MDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSBzdW0gb2YgPGNvZGU+cXVlcnk8L2NvZGU+IGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBjdXJyZW50IHN1YnBhc3MmIzgyMTc7cyB2aWV3IG1hc2sgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSsoVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSPC9jb2RlPiwgdGhlIDxhIGhyZWY9XCIjcHJvZmlsaW5nLWxvY2tcIj5wcm9maWxpbmcgbG9jazwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGhlbGQgYmVmb3JlIDxhIGhyZWY9XCIjdmtCZWdpbkNvbW1hbmRCdWZmZXJcIj52a0JlZ2luQ29tbWFuZEJ1ZmZlcjwvYT4gd2FzIGNhbGxlZCBvbiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IG9mIDxjb2RlPlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSPC9jb2RlPiBhbmQgb25lIG9mIHRoZSBjb3VudGVycyB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyA8Y29kZT5WS19RVUVSWV9TQ09QRV9DT01NQU5EX0JVRkZFUl9LSFI8L2NvZGU+LCB0aGUgcXVlcnkgYmVnaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIGZpcnN0IHJlY29yZGVkIGNvbW1hbmQgaW4gPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlQb29sLTAzMjI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUjwvY29kZT4gYW5kIG9uZSBvZiB0aGUgY291bnRlcnMgdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfU0NPUEVfUkVOREVSX1BBU1NfS0hSPC9jb2RlPiwgdGhlIGJlZ2luIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHJlY29yZGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5UG9vbC0wMzIyNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gb2YgPGNvZGU+VktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI8L2NvZGU+IGFuZCBhbm90aGVyIHF1ZXJ5IHBvb2wgd2l0aCBhIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gPGNvZGU+VktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI8L2NvZGU+IGhhcyBiZWVuIHVzZWQgd2l0aGluIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCBpdHMgcGFyZW50IHByaW1hcnkgY29tbWFuZCBidWZmZXIgb3Igc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyIHJlY29yZGVkIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlciBhcyA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZmVhdHVyZXMtcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzXCI+PGNvZGU+cGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzPC9jb2RlPjwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRFbmRRdWVyeSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFF1ZXJ5LU5vbmUtMDE5MjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgcXVlcmllcyB1c2VkIGJ5IHRoZSBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxhIGhyZWY9XCIjcXVlcmllcy1vcGVyYXRpb24tYWN0aXZlXCI+YWN0aXZlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRRdWVyeS1xdWVyeS0wMDgxMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXJ5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnktY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnktcXVlcnlQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUXVlcnlQb29sXCI+VmtRdWVyeVBvb2w8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRRdWVyeS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnktY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRRdWVyeS1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnktY29tbWFuZEJ1ZmZlci0wMTg4NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnktcXVlcnktMDA4MTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52a0NtZEVuZFF1ZXJ5PC9jb2RlPiBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSBzdW0gb2YgPGNvZGU+cXVlcnk8L2NvZGU+IGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBjdXJyZW50IHN1YnBhc3MmIzgyMTc7cyB2aWV3IG1hc2sgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFF1ZXJ5LXF1ZXJ5UG9vbC0wMzIyNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gb2YgPGNvZGU+VktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI8L2NvZGU+IGFuZCBvbmUgb3IgbW9yZSBvZiB0aGUgY291bnRlcnMgdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfU0NPUEVfQ09NTUFORF9CVUZGRVJfS0hSPC9jb2RlPiwgdGhlIDxhIGhyZWY9XCIjdmtDbWRFbmRRdWVyeVwiPnZrQ21kRW5kUXVlcnk8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHRoZSBsYXN0IHJlY29yZGVkIGNvbW1hbmQgaW4gPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnktcXVlcnlQb29sLTAzMjI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUjwvY29kZT4gYW5kIG9uZSBvciBtb3JlIG9mIHRoZSBjb3VudGVycyB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyA8Y29kZT5WS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFI8L2NvZGU+LCB0aGUgPGEgaHJlZj1cIiN2a0NtZEVuZFF1ZXJ5XCI+dmtDbWRFbmRRdWVyeTwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHJlY29yZGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQiOiB7CisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVC1Ob25lLTAyMzQyIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHF1ZXJpZXMgdXNlZCBieSB0aGUgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI3F1ZXJpZXMtb3BlcmF0aW9uLWFjdGl2ZVwiPmFjdGl2ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULXF1ZXJ5LTAyMzQzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gPGNvZGU+cXVlcnlQb29sPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAyMzQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9UUkFOU0ZPUk1fRkVFREJBQ0tfU1RSRUFNX0VYVDwvY29kZT4gdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBwYXJhbWV0ZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDIzNDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyBub3QgPGNvZGU+VktfUVVFUllfVFlQRV9UUkFOU0ZPUk1fRkVFREJBQ0tfU1RSRUFNX0VYVDwvY29kZT4gdGhlIDxjb2RlPmluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB6ZXJvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDI3MjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyA8Y29kZT5WS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUPC9jb2RlPiA8Y29kZT5pbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiB1c2VkIHRvIGJlZ2luIHRoZSBxdWVyeSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1F1ZXJ5UG9vbFwiPlZrUXVlcnlQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykrKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci0wMjM0NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVC1xdWVyeS0wMjM0NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZrQ21kRW5kUXVlcnlJbmRleGVkRVhUPC9jb2RlPiBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSBzdW0gb2YgPGNvZGU+cXVlcnk8L2NvZGU+IGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBjdXJyZW50IHN1YnBhc3MmIzgyMTc7cyB2aWV3IG1hc2sgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRRdWVyeVBvb2xSZXN1bHRzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1maXJzdFF1ZXJ5LTAwODEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zmlyc3RRdWVyeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtMDI4MjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5WS19RVUVSWV9SRVNVTFRfNjRfQklUPC9jb2RlPiBpcyBub3Qgc2V0IGluIDxjb2RlPmZsYWdzPC9jb2RlPiwgdGhlbiA8Y29kZT5wRGF0YTwvY29kZT4gYW5kIDxjb2RlPnN0cmlkZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbXVsdGlwbGVzIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtMDA4MTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5WS19RVUVSWV9SRVNVTFRfNjRfQklUPC9jb2RlPiBpcyBzZXQgaW4gPGNvZGU+ZmxhZ3M8L2NvZGU+IHRoZW4gPGNvZGU+cERhdGE8L2NvZGU+IGFuZCA8Y29kZT5zdHJpZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG11bHRpcGxlcyBvZiA8Y29kZT44PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWZpcnN0UXVlcnktMDA4MTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPmZpcnN0UXVlcnk8L2NvZGU+IGFuZCA8Y29kZT5xdWVyeUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1kYXRhU2l6ZS0wMDgxNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRhdGFTaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgcmVzdWx0IG9mIGVhY2ggcXVlcnksIGFzIGRlc2NyaWJlZCA8YSBocmVmPVwiI3F1ZXJpZXMtb3BlcmF0aW9uLW1lbW9yeWxheW91dFwiPmhlcmU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAwODE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9USU1FU1RBTVA8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUVVFUllfUkVTVUxUX1BBUlRJQUxfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1xdWVyeVBvb2wtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWVyeVBvb2xcIj5Wa1F1ZXJ5UG9vbDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cERhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gYnl0ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrUXVlcnlSZXN1bHRGbGFnQml0c1wiPlZrUXVlcnlSZXN1bHRGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZGF0YVNpemUtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlQb29sLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAyODI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VktfUVVFUllfUkVTVUxUXzY0X0JJVDwvY29kZT4gaXMgbm90IHNldCBpbiA8Y29kZT5mbGFnczwvY29kZT4gYW5kIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIG5vdCA8Y29kZT5WS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUjwvY29kZT4sIHRoZW4gPGNvZGU+cERhdGE8L2NvZGU+IGFuZCA8Y29kZT5zdHJpZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG11bHRpcGxlcyBvZiA8Y29kZT40PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIyOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIDxjb2RlPlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSPC9jb2RlPiwgdGhlbiA8Y29kZT5wRGF0YTwvY29kZT4gYW5kIDxjb2RlPnN0cmlkZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbXVsdGlwbGVzIG9mIHRoZSBzaXplIG9mIDxhIGhyZWY9XCIjVmtQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFJcIj5Wa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDMyMzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IHdhcyA8Y29kZT5WS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUjwvY29kZT4sIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY29udGFpbiA8Y29kZT5WS19RVUVSWV9SRVNVTFRfV0lUSF9BVkFJTEFCSUxJVFlfQklUPC9jb2RlPiwgPGNvZGU+VktfUVVFUllfUkVTVUxUX1BBUlRJQUxfQklUPC9jb2RlPiBvciA8Y29kZT5WS19RVUVSWV9SRVNVTFRfNjRfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIDxjb2RlPlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSPC9jb2RlPiwgdGhlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHJlY29yZGVkIG9uY2UgZm9yIGVhY2ggcGFzcyBhcyByZXRyaWV2ZWQgdmlhIGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFJcIj52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1kc3RPZmZzZXQtMDA4MTkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZpcnN0UXVlcnktMDA4MjAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5maXJzdFF1ZXJ5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZmlyc3RRdWVyeS0wMDgyMSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdW0gb2YgPGNvZGU+Zmlyc3RRdWVyeTwvY29kZT4gYW5kIDxjb2RlPnF1ZXJ5Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gPGNvZGU+cXVlcnlQb29sPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1mbGFncy0wMDgyMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZLX1FVRVJZX1JFU1VMVF82NF9CSVQ8L2NvZGU+IGlzIG5vdCBzZXQgaW4gPGNvZGU+ZmxhZ3M8L2NvZGU+IHRoZW4gPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiBhbmQgPGNvZGU+c3RyaWRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBtdWx0aXBsZXMgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtMDA4MjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5WS19RVUVSWV9SRVNVTFRfNjRfQklUPC9jb2RlPiBpcyBzZXQgaW4gPGNvZGU+ZmxhZ3M8L2NvZGU+IHRoZW4gPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiBhbmQgPGNvZGU+c3RyaWRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBtdWx0aXBsZXMgb2YgPGNvZGU+ODwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZHN0QnVmZmVyLTAwODI0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGVub3VnaCBzdG9yYWdlLCBmcm9tIDxjb2RlPmRzdE9mZnNldDwvY29kZT4sIHRvIGNvbnRhaW4gdGhlIHJlc3VsdCBvZiBlYWNoIHF1ZXJ5LCBhcyBkZXNjcmliZWQgPGEgaHJlZj1cIiNxdWVyaWVzLW9wZXJhdGlvbi1tZW1vcnlsYXlvdXRcIj5oZXJlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1kc3RCdWZmZXItMDA4MjUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ8L2NvZGU+IHVzYWdlIGZsYWciCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZHN0QnVmZmVyLTAwODI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAwODI3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9USU1FU1RBTVA8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUVVFUllfUkVTVUxUX1BBUlRJQUxfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1xdWVyeVBvb2wtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWVyeVBvb2xcIj5Wa1F1ZXJ5UG9vbDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWRzdEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1F1ZXJ5UmVzdWx0RmxhZ0JpdHNcIj5Wa1F1ZXJ5UmVzdWx0RmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gd2FzIDxjb2RlPlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSPC9jb2RlPiwgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFJcIj5Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFI8L2E+Ojo8Y29kZT5hbGxvd0NvbW1hbmRCdWZmZXJRdWVyeUNvcGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfVFJVRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI8L2NvZGU+LCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfUVVFUllfUkVTVUxUX1dJVEhfQVZBSUxBQklMSVRZX0JJVDwvY29kZT4sIDxjb2RlPlZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVDwvY29kZT4gb3IgPGNvZGU+VktfUVVFUllfUkVTVUxUXzY0X0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI8L2NvZGU+LCB0aGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc3VibWl0dGVkIG9uY2UgZm9yIGVhY2ggcGFzcyBhcyByZXRyaWV2ZWQgdmlhIGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFJcIj52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMjczNCIsCisgICAgICAgICAgInRleHQiOiAiIDxhIGhyZWY9XCIjdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0c1wiPnZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBjYWxsZWQgaWYgdGhlIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiB3YXMgPGNvZGU+VktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9JTlRFTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFdyaXRlVGltZXN0YW1wIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcXVlcnlQb29sLTAxNDE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiBvZiA8Y29kZT5WS19RVUVSWV9UWVBFX1RJTUVTVEFNUDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcXVlcnlQb29sLTAwODI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHF1ZXJ5IGlkZW50aWZpZWQgYnkgPGNvZGU+cXVlcnlQb29sPC9jb2RlPiBhbmQgPGNvZGU+cXVlcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxlbT51bmF2YWlsYWJsZTwvZW0+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLXRpbWVzdGFtcFZhbGlkQml0cy0wMDgyOSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBjb21tYW5kIHBvb2wmIzgyMTc7cyBxdWV1ZSBmYW1pbHkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBhIG5vbi16ZXJvIDxjb2RlPnRpbWVzdGFtcFZhbGlkQml0czwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcGlwZWxpbmVTdGFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZVN0YWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHNcIj5Wa1BpcGVsaW5lU3RhZ2VGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcXVlcnlQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUXVlcnlQb29sXCI+VmtRdWVyeVBvb2w8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgdHJhbnNmZXIsIGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtTm9uZS0wMDgzMCIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBxdWVyaWVzIHVzZWQgYnkgdGhlIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5hdmFpbGFibGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcXVlcnktMDA4MzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52a0NtZFdyaXRlVGltZXN0YW1wPC9jb2RlPiBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSBzdW0gb2YgPGNvZGU+cXVlcnk8L2NvZGU+IGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBjdXJyZW50IHN1YnBhc3MmIzgyMTc7cyB2aWV3IG1hc2sgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSLXBJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSXCI+VmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX1BST0ZJTElOR19MT0NLX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUi1kZXZpY2UtMDMyMzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgcHJvZmlsaW5nIGxvY2sgb2YgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gaGVsZCB2aWEgYSBwcmV2aW91cyBzdWNjZXNzZnVsIGNhbGwgdG8gPGEgaHJlZj1cIiN2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSXCI+dmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwiOiB7CisgICAgICAiKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSsoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwtcEluaXRpYWxpemVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBJbml0aWFsaXplSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTFwiPlZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCI6IHsKKyAgICAgICIoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpKyhWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCI6IHsKKyAgICAgICIoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpKyhWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMIjogeworICAgICAgIihWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkrKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTC1wYXJhbWV0ZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGFyYW1ldGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTFwiPlZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUw8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwtcFZhbHVlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBWYWx1ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTFwiPlZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCI6IHsKKyAgICAgICIoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpKyhWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMLXR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGVyZm9ybWFuY2VWYWx1ZVR5cGVJTlRFTFwiPlZrUGVyZm9ybWFuY2VWYWx1ZVR5cGVJTlRFTDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMLWRhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGF0YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTFwiPlZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTDwvYT4gdW5pb24iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwiOiB7CisgICAgICAiKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSsoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwtdmFsdWVTdHJpbmctcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmFsdWVTdHJpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwiOiB7CisgICAgICAiKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSsoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMLXBlcmZvcm1hbmNlQ291bnRlcnNTYW1wbGluZy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1F1ZXJ5UG9vbFNhbXBsaW5nTW9kZUlOVEVMXCI+VmtRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwiOiB7CisgICAgICAiKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSsoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTC1wTWFya2VySW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTWFya2VySW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMXCI+VmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIGNvbXB1dGUsIG9yIHRyYW5zZmVyIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMIjogeworICAgICAgIihWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkrKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9NQVJLRVJfSU5GT19JTlRFTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwiOiB7CisgICAgICAiKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSsoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTC1wTWFya2VySW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTWFya2VySW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMXCI+VmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIGNvbXB1dGUsIG9yIHRyYW5zZmVyIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMIjogeworICAgICAgIihWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkrKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTC1tYXJrZXItMDI3MzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdmFsdWUgd3JpdHRlbiBieSB0aGUgYXBwbGljYXRpb24gaW50byA8Y29kZT5tYXJrZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgdXNlZCB0aGUgdmFsaWQgYml0cyBhcyByZXBvcnRlZCBieSA8YSBocmVmPVwiI3ZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTFwiPnZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTDwvYT4gd2l0aCB0aGUgPGNvZGU+VktfUEVSRk9STUFOQ0VfUEFSQU1FVEVSX1RZUEVfU1RSRUFNX01BUktFUl9WQUxJRF9CSVRTX0lOVEVMPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfU1RSRUFNX01BUktFUl9JTkZPX0lOVEVMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMIjogeworICAgICAgIihWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkrKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtcE92ZXJyaWRlSW5mby0wMjczNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBPdmVycmlkZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYSA8YSBocmVmPVwiI1ZrUGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTFwiPlZrUGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTDwvYT4gdGhhdCBpcyBub3QgcmVwb3J0ZWQgYXZhaWxhYmxlIGJ5IDxjb2RlPnZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtcE92ZXJyaWRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wT3ZlcnJpZGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTFwiPlZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBjb21wdXRlLCBvciB0cmFuc2ZlciBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMIjogeworICAgICAgIihWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkrKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX09WRVJSSURFX0lORk9fSU5URUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTC10eXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUxcIj5Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUw8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiOiB7CisgICAgICAiKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSsoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1wQWNxdWlyZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEFjcXVpcmVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTFwiPlZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1wQ29uZmlndXJhdGlvbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ29uZmlndXJhdGlvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMXCI+VmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMIjogeworICAgICAgIihWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkrKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwtdHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50eXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUxcIj5Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiOiB7CisgICAgICAiKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSsoVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwtcXVldWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1F1ZXVlXCI+VmtRdWV1ZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwtY29uZmlndXJhdGlvbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb25maWd1cmF0aW9uPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTFwiPlZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29uZmlndXJhdGlvbjwvY29kZT4sIGFuZCA8Y29kZT5xdWV1ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIjogeworICAgICAgIihWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSkrKFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwtY29uZmlndXJhdGlvbi0wMjczNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbmZpZ3VyYXRpb248L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSByZWxlYXNlZCBiZWZvcmUgYWxsIGNvbW1hbmQgYnVmZmVycyBzdWJtaXR0ZWQgd2hpbGUgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHNldCBhcmUgaW4gPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5wZW5kaW5nIHN0YXRlPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbmZpZ3VyYXRpb24tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29uZmlndXJhdGlvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUxcIj5Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbmZpZ3VyYXRpb24tcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29uZmlndXJhdGlvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQ2xlYXJDb2xvckltYWdlIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtMDE5OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiBvZiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtMDAwMDIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS0wMDAwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlTGF5b3V0LTAwMDA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHNwZWNpZnkgdGhlIGxheW91dCBvZiB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgcmFuZ2VzIG9mIDxjb2RlPmltYWdlPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGNvZGU+cFJhbmdlczwvY29kZT4gYXQgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIG9uIGEgPGNvZGU+VmtEZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1hc3BlY3RNYXNrLTAyNDk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxhIGhyZWY9XCIjVmtJbWFnZVN1YnJlc291cmNlUmFuZ2VcIj5Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZTwvYT46Ojxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IG1lbWJlcnMgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSA8Y29kZT5wUmFuZ2VzPC9jb2RlPiBhcnJheSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlYWNoIG9ubHkgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtYmFzZU1pcExldmVsLTAxNDcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxhIGhyZWY9XCIjVmtJbWFnZVN1YnJlc291cmNlUmFuZ2VcIj5Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZTwvYT46Ojxjb2RlPmJhc2VNaXBMZXZlbDwvY29kZT4gbWVtYmVycyBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIDxjb2RlPnBSYW5nZXM8L2NvZGU+IGFycmF5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVhY2ggYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1wUmFuZ2VzLTAxNjkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPiBlbGVtZW50IG9mIDxjb2RlPnBSYW5nZXM8L2NvZGU+LCBpZiB0aGUgPGNvZGU+bGV2ZWxDb3VudDwvY29kZT4gbWVtYmVyIGlzIG5vdCA8Y29kZT5WS19SRU1BSU5JTkdfTUlQX0xFVkVMUzwvY29kZT4sIHRoZW4gPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPmJhc2VNaXBMZXZlbDwvY29kZT4gJiM0MzsgPGNvZGU+bGV2ZWxDb3VudDwvY29kZT48L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+bWlwTGV2ZWxzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtYmFzZUFycmF5TGF5ZXItMDE0NzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPjo6PGNvZGU+YmFzZUFycmF5TGF5ZXI8L2NvZGU+IG1lbWJlcnMgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSA8Y29kZT5wUmFuZ2VzPC9jb2RlPiBhcnJheSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlYWNoIGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1wUmFuZ2VzLTAxNjkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPiBlbGVtZW50IG9mIDxjb2RlPnBSYW5nZXM8L2NvZGU+LCBpZiB0aGUgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gbWVtYmVyIGlzIG5vdCA8Y29kZT5WS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTPC9jb2RlPiwgdGhlbiA8c3BhbiBjbGFzcz1cImVxXCI+PGNvZGU+YmFzZUFycmF5TGF5ZXI8L2NvZGU+ICYjNDM7IDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+PC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtMDAwMDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSBjb21wcmVzc2VkIG9yIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZUxheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcENvbG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDb2xvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NsZWFyQ29sb3JWYWx1ZVwiPlZrQ2xlYXJDb2xvclZhbHVlPC9hPiB1bmlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcFJhbmdlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUmFuZ2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cmFuZ2VDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1yYW5nZUNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cmFuZ2VDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS0wMTU0NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgdXNlIGEgZm9ybWF0IGxpc3RlZCBpbiA8YSBocmVmPVwiI2Zvcm1hdHMtcmVxdWlyaW5nLXNhbXBsZXIteWNiY3ItY29udmVyc2lvblwiPkZvcm1hdHMgcmVxdWlyaW5nIHNhbXBsZXIgWSYjODIxNztDPHN1Yj5CPC9zdWI+QzxzdWI+Ujwvc3ViPiBjb252ZXJzaW9uIGZvciA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUPC9jb2RlPiBpbWFnZSB2aWV3czwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2VMYXlvdXQtMDAwMDUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfR0VORVJBTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZUxheW91dC0wMTM5NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfR0VORVJBTDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWNvbW1hbmRCdWZmZXItMDE4MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGltYWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tYW5kQnVmZmVyLTAxODA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhbiB1bnByb3RlY3RlZCBpbWFnZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMTk5NCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IG9mIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQ8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX0VYVF9zZXBhcmF0ZV9zdGVuY2lsX3VzYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLTAwMDA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDwvY29kZT4gdXNhZ2UgZmxhZyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3NlcGFyYXRlX3N0ZW5jaWxfdXNhZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMjY1OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBlbGVtZW50IG9mIDxjb2RlPnBSYW5nZXMuYXNwZWN0PC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ8L2NvZGU+LCBhbmQgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVFwiPnNlcGFyYXRlIHN0ZW5jaWwgdXNhZ2U8L2E+LCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhlIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDwvYT46Ojxjb2RlPnN0ZW5jaWxVc2FnZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMjY1OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBlbGVtZW50IG9mIDxjb2RlPnBSYW5nZXMuYXNwZWN0PC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ8L2NvZGU+LCBhbmQgPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBub3QgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFRcIj5zZXBhcmF0ZSBzdGVuY2lsIHVzYWdlPC9hPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluIHRoZSA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT51c2FnZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMjY2MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBlbGVtZW50IG9mIDxjb2RlPnBSYW5nZXMuYXNwZWN0PC9jb2RlPiBpbmNsdWRlcyA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluIHRoZSA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT51c2FnZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMDAxMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZUxheW91dC0wMDAxMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5IHRoZSBsYXlvdXQgb2YgdGhlIGltYWdlIHN1YnJlc291cmNlIHJhbmdlcyBvZiA8Y29kZT5pbWFnZTwvY29kZT4gc3BlY2lmaWVkIGluIDxjb2RlPnBSYW5nZXM8L2NvZGU+IGF0IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCBvbiBhIDxjb2RlPlZrRGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlTGF5b3V0LTAwMDEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciBvZiA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWFzcGVjdE1hc2stMDI4MjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPjo6PGNvZGU+YXNwZWN0TWFzazwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiB0aGUgPGNvZGU+cFJhbmdlczwvY29kZT4gYXJyYXkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgYml0cyBvdGhlciB0aGFuIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMjgyNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5pbWFnZTwvY29kZT4mIzgyMTc7cyBmb3JtYXQgZG9lcyBub3QgaGF2ZSBhIHN0ZW5jaWwgY29tcG9uZW50LCB0aGVuIHRoZSA8YSBocmVmPVwiI1ZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlXCI+VmtJbWFnZVN1YnJlc291cmNlUmFuZ2U8L2E+Ojo8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHRoZSA8Y29kZT5wUmFuZ2VzPC9jb2RlPiBhcnJheSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSB0aGUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUPC9jb2RlPiBiaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMjgyNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5pbWFnZTwvY29kZT4mIzgyMTc7cyBmb3JtYXQgZG9lcyBub3QgaGF2ZSBhIGRlcHRoIGNvbXBvbmVudCwgdGhlbiB0aGUgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPjo6PGNvZGU+YXNwZWN0TWFzazwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiB0aGUgPGNvZGU+cFJhbmdlczwvY29kZT4gYXJyYXkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgdGhlIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+IGJpdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWJhc2VNaXBMZXZlbC0wMTQ3NCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI1ZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlXCI+VmtJbWFnZVN1YnJlc291cmNlUmFuZ2U8L2E+Ojo8Y29kZT5iYXNlTWlwTGV2ZWw8L2NvZGU+IG1lbWJlcnMgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSA8Y29kZT5wUmFuZ2VzPC9jb2RlPiBhcnJheSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlYWNoIGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+bWlwTGV2ZWxzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPmltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtMDE2OTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCA8YSBocmVmPVwiI1ZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlXCI+VmtJbWFnZVN1YnJlc291cmNlUmFuZ2U8L2E+IGVsZW1lbnQgb2YgPGNvZGU+cFJhbmdlczwvY29kZT4sIGlmIHRoZSA8Y29kZT5sZXZlbENvdW50PC9jb2RlPiBtZW1iZXIgaXMgbm90IDxjb2RlPlZLX1JFTUFJTklOR19NSVBfTEVWRUxTPC9jb2RlPiwgdGhlbiA8c3BhbiBjbGFzcz1cImVxXCI+PGNvZGU+YmFzZU1pcExldmVsPC9jb2RlPiAmIzQzOyA8Y29kZT5sZXZlbENvdW50PC9jb2RlPjwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtYmFzZUFycmF5TGF5ZXItMDE0NzYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPjo6PGNvZGU+YmFzZUFycmF5TGF5ZXI8L2NvZGU+IG1lbWJlcnMgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSA8Y29kZT5wUmFuZ2VzPC9jb2RlPiBhcnJheSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlYWNoIGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMTY5NSIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIDxhIGhyZWY9XCIjVmtJbWFnZVN1YnJlc291cmNlUmFuZ2VcIj5Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZTwvYT4gZWxlbWVudCBvZiA8Y29kZT5wUmFuZ2VzPC9jb2RlPiwgaWYgdGhlIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IG1lbWJlciBpcyBub3QgPGNvZGU+VktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUzwvY29kZT4sIHRoZW4gPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPmJhc2VBcnJheUxheWVyPC9jb2RlPiAmIzQzOyA8Y29kZT5sYXllckNvdW50PC9jb2RlPjwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMDAxNCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlTGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZUxheW91dFwiPlZrSW1hZ2VMYXlvdXQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcERlcHRoU3RlbmNpbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGVwdGhTdGVuY2lsPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZVwiPlZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZTwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUmFuZ2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cmFuZ2VDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VSYW5nZVwiPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcmFuZ2VDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJhbmdlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgwNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgaW1hZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tYW5kQnVmZmVyLTAxODA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhbiB1bnByb3RlY3RlZCBpbWFnZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQ2xlYXJBdHRhY2htZW50cyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtYXNwZWN0TWFzay0wMjUwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUPC9jb2RlPiwgdGhlbiB0aGUgPGNvZGU+Y29sb3JBdHRhY2htZW50PC9jb2RlPiBtZW1iZXIgb2YgdGhhdCBlbGVtZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVpdGhlciByZWZlciB0byBhIGNvbG9yIGF0dGFjaG1lbnQgd2hpY2ggaXMgPGNvZGU+VktfQVRUQUNITUVOVF9VTlVTRUQ8L2NvZGU+LCBvciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbG9yIGF0dGFjaG1lbnQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtYXNwZWN0TWFzay0wMjUwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUPC9jb2RlPiwgdGhlbiB0aGUgY3VycmVudCBzdWJwYXNzJyBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWl0aGVyIGJlIDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgb3IgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIGRlcHRoIGNvbXBvbmVudCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWFzcGVjdE1hc2stMDI1MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUPC9jb2RlPiwgdGhlbiB0aGUgY3VycmVudCBzdWJwYXNzJyBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWl0aGVyIGJlIDxjb2RlPlZLX0FUVEFDSE1FTlRfVU5VU0VEPC9jb2RlPiwgb3IgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIHN0ZW5jaWwgY29tcG9uZW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcmVjdC0wMjY4MiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5yZWN0PC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWN0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhbiA8Y29kZT5leHRlbnQud2lkdGg8L2NvZGU+IGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXJlY3QtMDI2ODMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+cmVjdDwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVjdHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYW4gPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4gZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcFJlY3RzLTAwMDE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiBzcGVjaWZpZWQgYnkgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWN0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgcmVuZGVyIGFyZWEgb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1wUmVjdHMtMDAwMTciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgbGF5ZXJzIHNwZWNpZmllZCBieSBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlY3RzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBjb250YWluZWQgd2l0aGluIGV2ZXJ5IGF0dGFjaG1lbnQgdGhhdCA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IHJlZmVycyB0byIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWxheWVyQ291bnQtMDE5MzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVjdHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcEF0dGFjaG1lbnRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBBdHRhY2htZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmF0dGFjaG1lbnRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0NsZWFyQXR0YWNobWVudFwiPlZrQ2xlYXJBdHRhY2htZW50PC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcFJlY3RzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBSZWN0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnJlY3RDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa0NsZWFyUmVjdFwiPlZrQ2xlYXJSZWN0PC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1hdHRhY2htZW50Q291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hdHRhY2htZW50Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXJlY3RDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJlY3RDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1jb21tYW5kQnVmZmVyLTAyNTA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gZWFjaCBhdHRhY2htZW50IHRvIGJlIGNsZWFyZWQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGltYWdlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWNvbW1hbmRCdWZmZXItMDI1MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBlYWNoIGF0dGFjaG1lbnQgdG8gYmUgY2xlYXJlZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgaW1hZ2UuIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbXVsdGl2aWV3KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWJhc2VBcnJheUxheWVyLTAwMDE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHJlbmRlciBwYXNzIGluc3RhbmNlIHRoaXMgaXMgcmVjb3JkZWQgaW4gdXNlcyBtdWx0aXZpZXcsIHRoZW4gPGNvZGU+YmFzZUFycmF5TGF5ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8gYW5kIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9uZS4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0NsZWFyQXR0YWNobWVudCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NsZWFyQXR0YWNobWVudC1hc3BlY3RNYXNrLTAwMDE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gaW5jbHVkZXMgPGNvZGU+VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDwvY29kZT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBpbmNsdWRlIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ2xlYXJBdHRhY2htZW50LWFzcGVjdE1hc2stMDAwMjAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDbGVhckF0dGFjaG1lbnQtY2xlYXJWYWx1ZS0wMDAyMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNsZWFyVmFsdWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGNvZGU+VmtDbGVhclZhbHVlPC9jb2RlPiB1bmlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDbGVhckF0dGFjaG1lbnQtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtJbWFnZUFzcGVjdEZsYWdCaXRzXCI+VmtJbWFnZUFzcGVjdEZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ2xlYXJBdHRhY2htZW50LWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ2xlYXJBdHRhY2htZW50LWFzcGVjdE1hc2stMDIyNDYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FX2lfQklUX0VYVDwvY29kZT4gZm9yIGFueSBpbmRleCA8Y29kZT5pPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUiOiB7CisgICAgICAiKFZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUtZGVwdGgtMDAwMjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBVbmxlc3MgdGhlIDxjb2RlPjxhIGhyZWY9XCIjVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZFwiPlZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQ8L2E+PC9jb2RlPiBleHRlbnNpb24gaXMgZW5hYmxlZCA8Y29kZT5kZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4wLjA8L2NvZGU+IGFuZCA8Y29kZT4xLjA8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlLWRlcHRoLTAyNTA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MC4wPC9jb2RlPiBhbmQgPGNvZGU+MS4wPC9jb2RlPiwgaW5jbHVzaXZlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRGaWxsQnVmZmVyIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RPZmZzZXQtMDAwMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEZpbGxCdWZmZXItZHN0T2Zmc2V0LTAwMDI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEZpbGxCdWZmZXItc2l6ZS0wMDAyNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNpemU8L2NvZGU+IGlzIG5vdCBlcXVhbCB0byA8Y29kZT5WS19XSE9MRV9TSVpFPC9jb2RlPiwgPGNvZGU+c2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEZpbGxCdWZmZXItc2l6ZS0wMDAyNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNpemU8L2NvZGU+IGlzIG5vdCBlcXVhbCB0byA8Y29kZT5WS19XSE9MRV9TSVpFPC9jb2RlPiwgPGNvZGU+c2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gbWludXMgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRGaWxsQnVmZmVyLXNpemUtMDAwMjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zaXplPC9jb2RlPiBpcyBub3QgZXF1YWwgdG8gPGNvZGU+VktfV0hPTEVfU0laRTwvY29kZT4sIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RCdWZmZXItMDAwMjkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ8L2NvZGU+IHVzYWdlIGZsYWciCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RCdWZmZXItMDAwMzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEZpbGxCdWZmZXItZHN0QnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IHRyYW5zZmVyLCBncmFwaGljcyBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwMzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItMDE4MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBidWZmZXIiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAxODEyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgYnVmZmVyIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRVcGRhdGVCdWZmZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0T2Zmc2V0LTAwMDMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZGF0YVNpemUtMDAwMzMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gbWludXMgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0QnVmZmVyLTAwMDM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kc3RCdWZmZXItMDAwMzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0T2Zmc2V0LTAwMDM2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kYXRhU2l6ZS0wMDAzNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRhdGFTaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+NjU1MzY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kYXRhU2l6ZS0wMDAzOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRhdGFTaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0QnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItcERhdGEtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cERhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kYXRhU2l6ZTwvY29kZT4gYnl0ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgdHJhbnNmZXIsIGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kYXRhU2l6ZS1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRhdGFTaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGJ1ZmZlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFuIHVucHJvdGVjdGVkIGJ1ZmZlciIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQ29weUJ1ZmZlciI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXItc3JjT2Zmc2V0LTAwMTEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNyY09mZnNldDwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIDxjb2RlPnNyY0J1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlci1kc3RPZmZzZXQtMDAxMTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNpemUtMDAxMTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c2l6ZTwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPnNyY0J1ZmZlcjwvY29kZT4gbWludXMgPGNvZGU+c3JjT2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNpemUtMDAxMTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c2l6ZTwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gbWludXMgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXBSZWdpb25zLTAwMTE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHVuaW9uIG9mIHRoZSBzb3VyY2UgcmVnaW9ucywgYW5kIHRoZSB1bmlvbiBvZiB0aGUgZGVzdGluYXRpb24gcmVnaW9ucywgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBvdmVybGFwIGluIG1lbW9yeSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNyY0J1ZmZlci0wMDExOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0J1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDwvY29kZT4gdXNhZ2UgZmxhZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNyY0J1ZmZlci0wMDExOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNyY0J1ZmZlcjwvY29kZT4gaXMgbm9uLXNwYXJzZSB0aGVuIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXItZHN0QnVmZmVyLTAwMTIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXItZHN0QnVmZmVyLTAwMTIxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNyY0J1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlci1kc3RCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXItcFJlZ2lvbnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5yZWdpb25Db3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlckNvcHlcIj5Wa0J1ZmZlckNvcHk8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlci1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlci1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCB0cmFuc2ZlciwgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXItcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yZWdpb25Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXItY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPnNyY0J1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgyMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPnNyY0J1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGJ1ZmZlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1hbmRCdWZmZXItMDE4MjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBidWZmZXIiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlci1jb21tYW5kQnVmZmVyLTAxODI0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgYnVmZmVyIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtCdWZmZXJDb3B5IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVyQ29weS1zaXplLTAxOTg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQ29weUltYWdlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHNvdXJjZSByZWdpb24gc3BlY2lmaWVkIGJ5IGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSByZWdpb24gdGhhdCBpcyBjb250YWluZWQgd2l0aGluIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtcFJlZ2lvbnMtMDAxMjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgZGVzdGluYXRpb24gcmVnaW9uIHNwZWNpZmllZCBieSBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcmVnaW9uIHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTI0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHVuaW9uIG9mIGFsbCBzb3VyY2UgcmVnaW9ucywgYW5kIHRoZSB1bmlvbiBvZiBhbGwgZGVzdGluYXRpb24gcmVnaW9ucywgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBvdmVybGFwIGluIG1lbW9yeSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMjYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZUxheW91dC0wMDEyOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5IHRoZSBsYXlvdXQgb2YgdGhlIGltYWdlIHN1YnJlc291cmNlcyBvZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gc3BlY2lmaWVkIGluIDxjb2RlPnBSZWdpb25zPC9jb2RlPiBhdCB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgb24gYSA8Y29kZT5Wa0RldmljZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlLTAwMTMxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDwvY29kZT4gdXNhZ2UgZmxhZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxMzMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2YgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IHNwZWNpZmllZCBpbiA8Y29kZT5wUmVnaW9uczwvY29kZT4gYXQgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIG9uIGEgPGNvZGU+VmtEZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEzNiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzYW1wbGUgY291bnQgb2YgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IGFuZCA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2giCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXNyY1N1YnJlc291cmNlLTAxNjk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNyY1N1YnJlc291cmNlLm1pcExldmVsPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIDxjb2RlPm1pcExldmVsczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLWRzdFN1YnJlc291cmNlLTAxNjk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmRzdFN1YnJlc291cmNlLm1pcExldmVsPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIDxjb2RlPm1pcExldmVsczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXNyY1N1YnJlc291cmNlLTAxNjk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcjwvY29kZT4gJiM0MzsgPGNvZGU+c3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudDwvY29kZT48L3NwYW4+IG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLWRzdFN1YnJlc291cmNlLTAxNjk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcjwvY29kZT4gJiM0MzsgPGNvZGU+ZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudDwvY29kZT48L3NwYW4+IG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXNyY09mZnNldC0wMTc4MyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zcmNPZmZzZXQ8L2NvZGU+IGFuZCA8Y29kZT5leHRlbnQ8L2NvZGU+IG1lbWJlcnMgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiByZXNwZWN0IHRoZSBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eSByZXF1aXJlbWVudHMgb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4mIzgyMTc7cyBjb21tYW5kIHBvb2wmIzgyMTc7cyBxdWV1ZSBmYW1pbHksIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI1ZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzXCI+VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RPZmZzZXQtMDE3ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiBhbmQgPGNvZGU+ZXh0ZW50PC9jb2RlPiBtZW1iZXJzIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gcmVzcGVjdCB0aGUgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkgcmVxdWlyZW1lbnRzIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+JiM4MjE3O3MgY29tbWFuZCBwb29sJiM4MjE3O3MgcXVldWUgZmFtaWx5LCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNWa1F1ZXVlRmFtaWx5UHJvcGVydGllc1wiPlZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjSW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cmVnaW9uQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZUNvcHlcIj5Wa0ltYWdlQ29weTwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCB0cmFuc2ZlciwgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXJlZ2lvbkNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cmVnaW9uQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+LCBhbmQgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMTk5NSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IG9mIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2UtMDE5OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiBvZiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgbm9uLXNwYXJzZSB0aGVuIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMDEzMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAwMTM1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gb2YgZWFjaCBvZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gYW5kIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBjb21wYXRpYmxlLCBhcyBkZWZpbmVkIDxhIGhyZWY9XCIjY29waWVzLWltYWdlcy1mb3JtYXQtY29tcGF0aWJpbGl0eVwiPmFib3ZlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAxNTQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiB0aGUgaW1hZ2Ugb3IgPGVtPmRpc2pvaW50PC9lbT4gcGxhbmUgdG8gYmUgY29waWVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMTU0NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gdGhlIGltYWdlIG9yIDxlbT5kaXNqb2ludDwvZW0+IHBsYW5lIHRoYXQgaXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjb3B5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMTU0OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IG9mIGVhY2ggb2YgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IGFuZCA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaXMgbm90IGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj48ZW0+bXVsdGktcGxhbmFyIGZvcm1hdDwvZW0+PC9hPiwgdGhlIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gb2YgZWFjaCBvZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gYW5kIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBjb21wYXRpYmxlLCBhcyBkZWZpbmVkIDxhIGhyZWY9XCIjY29waWVzLWltYWdlcy1mb3JtYXQtY29tcGF0aWJpbGl0eVwiPmFib3ZlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtTm9uZS0wMTU0OSIsCisgICAgICAgICAgInRleHQiOiAiIEluIGEgY29weSB0byBvciBmcm9tIGEgcGxhbmUgb2YgYSA8YSBocmVmPVwiI2Zvcm1hdHMtcmVxdWlyaW5nLXNhbXBsZXIteWNiY3ItY29udmVyc2lvblwiPm11bHRpLXBsYW5hciBpbWFnZTwvYT4sIHRoZSA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IG9mIHRoZSBpbWFnZSBhbmQgcGxhbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgY29tcGF0aWJsZSBhY2NvcmRpbmcgdG8gPGEgaHJlZj1cIiNmb3JtYXRzLWNvbXBhdGlibGUtcGxhbmVzXCI+dGhlIGRlc2NyaXB0aW9uIG9mIGNvbXBhdGlibGUgcGxhbmVzPC9hPiBmb3IgdGhlIHBsYW5lIGJlaW5nIGNvcGllZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtYXNwZWN0TWFzay0wMTU1MCIsCisgICAgICAgICAgInRleHQiOiAiIFdoZW4gYSBjb3B5IGlzIHBlcmZvcm1lZCB0byBvciBmcm9tIGFuIGltYWdlIHdpdGggYSA8YSBocmVmPVwiI2Zvcm1hdHMtcmVxdWlyaW5nLXNhbXBsZXIteWNiY3ItY29udmVyc2lvblwiPm11bHRpLXBsYW5hciBmb3JtYXQ8L2E+LCB0aGUgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gb2YgdGhlIDxjb2RlPnNyY1N1YnJlc291cmNlPC9jb2RlPiBhbmQvb3IgPGNvZGU+ZHN0U3VicmVzb3VyY2U8L2NvZGU+IHRoYXQgcmVmZXJzIHRvIHRoZSBtdWx0aS1wbGFuYXIgaW1hZ2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUPC9jb2RlPiAod2l0aCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQ8L2NvZGU+IHZhbGlkIG9ubHkgZm9yIGEgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiB3aXRoIHRocmVlIHBsYW5lcykiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDAxMjkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfR0VORVJBTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlTGF5b3V0LTAwMTM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0dFTkVSQUw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDE5MTciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0dFTkVSQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDEzOTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0dFTkVSQUw8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1jb21tYW5kQnVmZmVyLTAxODI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBpbWFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgyNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgaW1hZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlLWNvbW1hbmRCdWZmZXItMDE4MjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFuIHVucHJvdGVjdGVkIGltYWdlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMjU0MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBhbmQgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbWFnZUNvcHkiOiB7CisgICAgICAiIShWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktYXNwZWN0TWFzay0wMDEzNyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3JjU3VicmVzb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5kc3RTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2giCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE1NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgYSBjb21wcmVzc2VkIGltYWdlLCBhbGwgbWVtYmVycyBvZiA8Y29kZT5zcmNPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZGltZW5zaW9ucyBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTU4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayB3aWR0aCBvciA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4gJiM0MzsgPGNvZGU+c3JjT2Zmc2V0Lng8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSB3aWR0aCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTU5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgaGVpZ2h0IG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4gJiM0MzsgPGNvZGU+c3JjT2Zmc2V0Lnk8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgYSBjb21wcmVzc2VkIGltYWdlLCA8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgZGVwdGggb3IgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+ICYjNDM7IDxjb2RlPnNyY09mZnNldC56PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE2MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaXMgYSBjb21wcmVzc2VkIGZvcm1hdCBpbWFnZSwgYWxsIG1lbWJlcnMgb2YgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGRpbWVuc2lvbnMgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2siCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaXMgYSBjb21wcmVzc2VkIGZvcm1hdCBpbWFnZSwgPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHdpZHRoIG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5kc3RPZmZzZXQueDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaXMgYSBjb21wcmVzc2VkIGZvcm1hdCBpbWFnZSwgPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayBoZWlnaHQgb3IgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPiAmIzQzOyA8Y29kZT5kc3RPZmZzZXQueTwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGlzIGEgY29tcHJlc3NlZCBmb3JtYXQgaW1hZ2UsIDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayBkZXB0aCBvciA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gJiM0MzsgPGNvZGU+ZHN0T2Zmc2V0Lno8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIGRlcHRoIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE1NTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBuZWl0aGVyIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gbm9yIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaGFzIGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5tdWx0aS1wbGFuYXIgaW1hZ2UgZm9ybWF0PC9hPiB0aGVuIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3JjU3VicmVzb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5kc3RTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2giCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNTUyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBoYXMgYSA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHdpdGggPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj50d28gcGxhbmVzPC9hPiB0aGVuIHRoZSA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTU1MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaGFzIGEgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiB3aXRoIDxhIGhyZWY9XCIjZm9ybWF0cy1yZXF1aXJpbmctc2FtcGxlci15Y2Jjci1jb252ZXJzaW9uXCI+dGhyZWUgcGxhbmVzPC9hPiB0aGVuIHRoZSA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE1NTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGhhcyBhIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gd2l0aCA8YSBocmVmPVwiI2Zvcm1hdHMtcmVxdWlyaW5nLXNhbXBsZXIteWNiY3ItY29udmVyc2lvblwiPnR3byBwbGFuZXM8L2E+IHRoZW4gdGhlIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNTU1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBoYXMgYSA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHdpdGggPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj50aHJlZSBwbGFuZXM8L2E+IHRoZW4gdGhlIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTU1NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaGFzIGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5tdWx0aS1wbGFuYXIgaW1hZ2UgZm9ybWF0PC9hPiBhbmQgdGhlIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBkb2VzIG5vdCBoYXZlIGEgbXVsdGktcGxhbmFyIGltYWdlIGZvcm1hdCwgdGhlIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE1NTciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGhhcyBhIDxhIGhyZWY9XCIjZm9ybWF0cy1yZXF1aXJpbmctc2FtcGxlci15Y2Jjci1jb252ZXJzaW9uXCI+bXVsdGktcGxhbmFyIGltYWdlIGZvcm1hdDwvYT4gYW5kIHRoZSA8Y29kZT5zcmNJbWFnZTwvY29kZT4gZG9lcyBub3QgaGF2ZSBhIG11bHRpLXBsYW5hciBpbWFnZSBmb3JtYXQsIHRoZSA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzI3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIG9yIGEgPGVtPnNpbmdsZS1wbGFuZTwvZW0+LCAmIzgyMjA7PGNvZGU+XzQyMjwvY29kZT4mIzgyMjE7IGltYWdlIGZvcm1hdCwgYWxsIG1lbWJlcnMgb2YgPGNvZGU+c3JjT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGRpbWVuc2lvbnMgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2siCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIG9yIGEgPGVtPnNpbmdsZS1wbGFuZTwvZW0+LCAmIzgyMjA7PGNvZGU+XzQyMjwvY29kZT4mIzgyMjE7IGltYWdlIGZvcm1hdCwgPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHdpZHRoIG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5zcmNPZmZzZXQueDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTcyOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIDxlbT5zaW5nbGUtcGxhbmU8L2VtPiwgJiM4MjIwOzxjb2RlPl80MjI8L2NvZGU+JiM4MjIxOyBpbWFnZSBmb3JtYXQsIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgaGVpZ2h0IG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4gJiM0MzsgPGNvZGU+c3JjT2Zmc2V0Lnk8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIG9yIGEgPGVtPnNpbmdsZS1wbGFuZTwvZW0+LCAmIzgyMjA7PGNvZGU+XzQyMjwvY29kZT4mIzgyMjE7IGltYWdlIGZvcm1hdCwgPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIGRlcHRoIG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5zcmNPZmZzZXQuejwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIGRlcHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTczMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaXMgYSBjb21wcmVzc2VkIGZvcm1hdCBpbWFnZSwgb3IgYSA8ZW0+c2luZ2xlLXBsYW5lPC9lbT4sICYjODIyMDs8Y29kZT5fNDIyPC9jb2RlPiYjODIyMTsgaW1hZ2UgZm9ybWF0LCBhbGwgbWVtYmVycyBvZiA8Y29kZT5kc3RPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZGltZW5zaW9ucyBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGlzIGEgY29tcHJlc3NlZCBmb3JtYXQgaW1hZ2UsIG9yIGEgPGVtPnNpbmdsZS1wbGFuZTwvZW0+LCAmIzgyMjA7PGNvZGU+XzQyMjwvY29kZT4mIzgyMjE7IGltYWdlIGZvcm1hdCwgPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHdpZHRoIG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5kc3RPZmZzZXQueDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBhIGNvbXByZXNzZWQgZm9ybWF0IGltYWdlLCBvciBhIDxlbT5zaW5nbGUtcGxhbmU8L2VtPiwgJiM4MjIwOzxjb2RlPl80MjI8L2NvZGU+JiM4MjIxOyBpbWFnZSBmb3JtYXQsIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgaGVpZ2h0IG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4gJiM0MzsgPGNvZGU+ZHN0T2Zmc2V0Lnk8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIGhlaWdodCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGlzIGEgY29tcHJlc3NlZCBmb3JtYXQgaW1hZ2UsIG9yIGEgPGVtPnNpbmdsZS1wbGFuZTwvZW0+LCAmIzgyMjA7PGNvZGU+XzQyMjwvY29kZT4mIzgyMjE7IGltYWdlIGZvcm1hdCwgPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIGRlcHRoIG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5kc3RPZmZzZXQuejwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGgiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktbGF5ZXJDb3VudC0wMDEzOCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5sYXllckNvdW50PC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3JjU3VicmVzb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5kc3RTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2giCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgZWl0aGVyIG9mIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gb3IgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IHBhcmFtZXRlcnMgYXJlIG9mIDxhIGhyZWY9XCIjVmtJbWFnZVR5cGVcIj5Wa0ltYWdlVHlwZTwvYT4gPGNvZGU+VktfSU1BR0VfVFlQRV8zRDwvY29kZT4sIHRoZSA8Y29kZT5iYXNlQXJyYXlMYXllcjwvY29kZT4gYW5kIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IG1lbWJlcnMgb2YgYm90aCA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gYW5kIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+MTwvY29kZT4sIHJlc3BlY3RpdmVseSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3ODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IG9yIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+LCB0aGVuIDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIG51bWJlciBvZiBzbGljZXMgb2YgdGhlIDxjb2RlPmV4dGVudDwvY29kZT4gKGZvciAzRCkgb3IgbGF5ZXJzIG9mIHRoZSA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gKGZvciBub24tM0QpIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG1hdGNoIHRoZSBudW1iZXIgb2Ygc2xpY2VzIG9mIHRoZSA8Y29kZT5leHRlbnQ8L2NvZGU+IChmb3IgM0QpIG9yIGxheWVycyBvZiB0aGUgPGNvZGU+ZHN0U3VicmVzb3VyY2U8L2NvZGU+IChmb3Igbm9uLTNEKSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDAxNDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBlaXRoZXIgb2YgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBvciA8Y29kZT5kc3RJbWFnZTwvY29kZT4gcGFyYW1ldGVycyBhcmUgb2YgPGEgaHJlZj1cIiNWa0ltYWdlVHlwZVwiPlZrSW1hZ2VUeXBlPC9hPiA8Y29kZT5WS19JTUFHRV9UWVBFXzNEPC9jb2RlPiwgdGhlIDxjb2RlPmJhc2VBcnJheUxheWVyPC9jb2RlPiBhbmQgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gbWVtYmVycyBvZiB0aGUgY29ycmVzcG9uZGluZyBzdWJyZXNvdXJjZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+MTwvY29kZT4sIHJlc3BlY3RpdmVseSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3OTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBib3RoIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBhbmQgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGFyZSBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+IHRoZW4gPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfM0Q8L2NvZGU+LCB0aGVuIDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdG8gdGhlIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTc5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaXMgb2YgdHlwZSA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgb2YgdHlwZSA8Y29kZT5WS19JTUFHRV9UWVBFXzNEPC9jb2RlPiwgdGhlbiA8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIHRvIHRoZSA8Y29kZT5sYXllckNvdW50PC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+ZHN0U3VicmVzb3VyY2U8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1hc3BlY3RNYXNrLTAwMTQyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSBhc3BlY3RzIHByZXNlbnQgaW4gdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktYXNwZWN0TWFzay0wMDE0MyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+ZHN0U3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHNwZWNpZnkgYXNwZWN0cyBwcmVzZW50IGluIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE0NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY09mZnNldC54PC9jb2RlPiBhbmQgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5leHRlbnQud2lkdGg8L2NvZGU+ICYjNDM7IDxjb2RlPnNyY09mZnNldC54PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSB3aWR0aCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjT2Zmc2V0Lnk8L2NvZGU+IGFuZCA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+ICYjNDM7IDxjb2RlPnNyY09mZnNldC55PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMUQ8L2NvZGU+LCB0aGVuIDxjb2RlPnNyY09mZnNldC55PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1zcmNPZmZzZXQtMDAxNDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNPZmZzZXQuejwvY29kZT4gYW5kIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5zcmNPZmZzZXQuejwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMUQ8L2NvZGU+LCB0aGVuIDxjb2RlPnNyY09mZnNldC56PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMUQ8L2NvZGU+LCB0aGVuIDxjb2RlPmRzdE9mZnNldC56PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+ZXh0ZW50LmRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+LCB0aGVuIDxjb2RlPnNyY09mZnNldC56PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+LCB0aGVuIDxjb2RlPmRzdE9mZnNldC56PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE1MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdE9mZnNldC54PC9jb2RlPiBhbmQgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5leHRlbnQud2lkdGg8L2NvZGU+ICYjNDM7IDxjb2RlPmRzdE9mZnNldC54PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RPZmZzZXQueTwvY29kZT4gYW5kIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4gJiM0MzsgPGNvZGU+ZHN0T2Zmc2V0Lnk8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMDE1MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaXMgb2YgdHlwZSA8Y29kZT5WS19JTUFHRV9UWVBFXzFEPC9jb2RlPiwgdGhlbiA8Y29kZT5kc3RPZmZzZXQueTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUNvcHktZHN0T2Zmc2V0LTAwMTUzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0T2Zmc2V0Lno8L2NvZGU+IGFuZCA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gJiM0MzsgPGNvZGU+ZHN0T2Zmc2V0Lno8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LXNyY1N1YnJlc291cmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY1N1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzXCI+VmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VDb3B5LWRzdFN1YnJlc291cmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzXCI+VmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stMDAxNjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUPC9jb2RlPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gZWl0aGVyIG9mIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAwMTY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1sYXllckNvdW50LTAxNzAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDAiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlQXNwZWN0RmxhZ0JpdHNcIj5Wa0ltYWdlQXNwZWN0RmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAyMjQ3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGluY2x1ZGUgPGNvZGU+VktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV9pX0JJVF9FWFQ8L2NvZGU+IGZvciBhbnkgaW5kZXggPGNvZGU+aTwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXBSZWdpb25zLTAwMTcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbGwgYnVmZmVyIGxvY2F0aW9ucyB0aGF0IGFyZSBhY2Nlc3NlZCBhY2NvcmRpbmcgdG8gPGEgaHJlZj1cIiNjb3BpZXMtYnVmZmVycy1pbWFnZXMtYWRkcmVzc2luZ1wiPkJ1ZmZlciBhbmQgSW1hZ2UgQWRkcmVzc2luZzwvYT4sIGZvciBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXBSZWdpb25zLTAwMTcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGltYWdlIHJlZ2lvbiBzcGVjaWZpZWQgYnkgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHJlZ2lvbiB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXBSZWdpb25zLTAwMTczIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHVuaW9uIG9mIGFsbCBzb3VyY2UgcmVnaW9ucywgYW5kIHRoZSB1bmlvbiBvZiBhbGwgZGVzdGluYXRpb24gcmVnaW9ucywgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBvdmVybGFwIGluIG1lbW9yeSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1zcmNCdWZmZXItMDAxNzQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+VktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ8L2NvZGU+IHVzYWdlIGZsYWciCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2Utc3JjQnVmZmVyLTAwMTc2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3JjQnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtMDAxNzciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlLTAwMTc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS0wMDE3OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgc2FtcGxlIGNvdW50IGVxdWFsIHRvIDxjb2RlPlZLX1NBTVBMRV9DT1VOVF8xX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxODAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2YgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IHNwZWNpZmllZCBpbiA8Y29kZT5wUmVnaW9uczwvY29kZT4gYXQgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIG9uIGEgPGNvZGU+VmtEZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWltYWdlU3VicmVzb3VyY2UtMDE3MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+aW1hZ2VTdWJyZXNvdXJjZS5taXBMZXZlbDwvY29kZT4gbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5taXBMZXZlbHM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWltYWdlU3VicmVzb3VyY2UtMDE3MDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPmltYWdlU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXI8L2NvZGU+ICYjNDM7IDxjb2RlPmltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudDwvY29kZT48L3NwYW4+IG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtaW1hZ2VPZmZzZXQtMDE3OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+aW1hZ2VPZmZzZXQ8L2NvZGU+IGFuZCA8Y29kZT5pbWFnZUV4dGVudDwvY29kZT4gbWVtYmVycyBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHJlc3BlY3QgdGhlIGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5IHJlcXVpcmVtZW50cyBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiYjODIxNztzIGNvbW1hbmQgcG9vbCYjODIxNztzIHF1ZXVlIGZhbWlseSwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjVmtRdWV1ZUZhbWlseVByb3BlcnRpZXNcIj5Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2Utc3JjQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0J1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5yZWdpb25Db3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlckltYWdlQ29weVwiPlZrQnVmZmVySW1hZ2VDb3B5PC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCB0cmFuc2ZlciwgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1yZWdpb25Db3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJlZ2lvbkNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+LCBhbmQgPGNvZGU+c3JjQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS0wMTk5NyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IG9mIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQ8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlTGF5b3V0LTAwMTgxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0dFTkVSQUw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZUxheW91dC0wMTM5NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfR0VORVJBTDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgyOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPnNyY0J1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGJ1ZmZlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tYW5kQnVmZmVyLTAxODI5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBpbWFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tYW5kQnVmZmVyLTAxODMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhbiB1bnByb3RlY3RlZCBpbWFnZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS0wMjU0MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbmluZyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQ29weUltYWdlVG9CdWZmZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBpbWFnZSByZWdpb24gc3BlY2lmaWVkIGJ5IGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSByZWdpb24gdGhhdCBpcyBjb250YWluZWQgd2l0aGluIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gYWxsIGJ1ZmZlciBsb2NhdGlvbnMgdGhhdCBhcmUgYWNjZXNzZWQgYWNjb3JkaW5nIHRvIDxhIGhyZWY9XCIjY29waWVzLWJ1ZmZlcnMtaW1hZ2VzLWFkZHJlc3NpbmdcIj5CdWZmZXIgYW5kIEltYWdlIEFkZHJlc3Npbmc8L2E+LCBmb3IgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4NCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSB1bmlvbiBvZiBhbGwgc291cmNlIHJlZ2lvbnMsIGFuZCB0aGUgdW5pb24gb2YgYWxsIGRlc3RpbmF0aW9uIHJlZ2lvbnMsIHNwZWNpZmllZCBieSB0aGUgZWxlbWVudHMgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+LCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgb3ZlcmxhcCBpbiBtZW1vcnkiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2UtMDAxODYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLTAwMTg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZS0wMDE4OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgc2FtcGxlIGNvdW50IGVxdWFsIHRvIDxjb2RlPlZLX1NBTVBMRV9DT1VOVF8xX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2VMYXlvdXQtMDAxODkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2YgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IHNwZWNpZmllZCBpbiA8Y29kZT5wUmVnaW9uczwvY29kZT4gYXQgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIG9uIGEgPGNvZGU+VmtEZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWRzdEJ1ZmZlci0wMDE5MSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDwvY29kZT4gdXNhZ2UgZmxhZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1kc3RCdWZmZXItMDAxOTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1pbWFnZVN1YnJlc291cmNlLTAxNzAzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmltYWdlU3VicmVzb3VyY2UubWlwTGV2ZWw8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+bWlwTGV2ZWxzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1pbWFnZVN1YnJlc291cmNlLTAxNzA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5pbWFnZVN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyPC9jb2RlPiAmIzQzOyA8Y29kZT5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQ8L2NvZGU+PC9zcGFuPiBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgPGNvZGU+YXJyYXlMYXllcnM8L2NvZGU+IHNwZWNpZmllZCBpbiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+IHdoZW4gPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWltYWdlT2Zmc2V0LTAxNzk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmltYWdlT2Zmc2V0PC9jb2RlPiBhbmQgPGNvZGU+aW1hZ2VFeHRlbnQ8L2NvZGU+IG1lbWJlcnMgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiByZXNwZWN0IHRoZSBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eSByZXF1aXJlbWVudHMgb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4mIzgyMTc7cyBjb21tYW5kIHBvb2wmIzgyMTc7cyBxdWV1ZSBmYW1pbHksIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI1ZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzXCI+VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZUxheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1kc3RCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cmVnaW9uQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJJbWFnZUNvcHlcIj5Wa0J1ZmZlckltYWdlQ29weTwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgdHJhbnNmZXIsIGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yZWdpb25Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggb2YgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2UtMDE5OTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiBvZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZUxheW91dC0wMDE5MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2VMYXlvdXQtMDEzOTciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0dFTkVSQUw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgzMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgaW1hZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgzMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGJ1ZmZlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tYW5kQnVmZmVyLTAxODMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+ZHN0QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgYnVmZmVyIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLTAyNTQ0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtCdWZmZXJJbWFnZUNvcHkiOiB7CisgICAgICAiIShWS19WRVJTSU9OXzFfMSxWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVyT2Zmc2V0LTAwMTkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHBhcmFtZXRlciYjODIxNztzIGZvcm1hdCBpcyBub3QgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCwgdGhlbiA8Y29kZT5idWZmZXJPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGZvcm1hdCYjODIxNztzIHRleGVsIGJsb2NrIHNpemUuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJSb3dMZW5ndGgtMDAyMDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+VmtJbWFnZTwvY29kZT4gcGFyYW1ldGVyIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgPGNvZGU+YnVmZmVyUm93TGVuZ3RoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHdpZHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJJbWFnZUhlaWdodC0wMDIwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5Wa0ltYWdlPC9jb2RlPiBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCA8Y29kZT5idWZmZXJJbWFnZUhlaWdodDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayBoZWlnaHQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMjA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHBhcmFtZXRlciBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIGFsbCBtZW1iZXJzIG9mIDxjb2RlPmltYWdlT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGRpbWVuc2lvbnMgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2siCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlck9mZnNldC0wMDIwNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5Wa0ltYWdlPC9jb2RlPiBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCA8Y29kZT5idWZmZXJPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgc2l6ZSBpbiBieXRlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VFeHRlbnQtMDAyMDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+VmtJbWFnZTwvY29kZT4gcGFyYW1ldGVyIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgPGNvZGU+aW1hZ2VFeHRlbnQud2lkdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgd2lkdGggb3IgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5pbWFnZUV4dGVudC53aWR0aDwvY29kZT4gJiM0MzsgPGNvZGU+aW1hZ2VPZmZzZXQueDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlRXh0ZW50LTAwMjA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHBhcmFtZXRlciBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIDxjb2RlPmltYWdlRXh0ZW50LmhlaWdodDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayBoZWlnaHQgb3IgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5pbWFnZUV4dGVudC5oZWlnaHQ8L2NvZGU+ICYjNDM7IDxjb2RlPmltYWdlT2Zmc2V0Lnk8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIGltYWdlIHN1YnJlc291cmNlIGhlaWdodCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VFeHRlbnQtMDAyMDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+VmtJbWFnZTwvY29kZT4gcGFyYW1ldGVyIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgPGNvZGU+aW1hZ2VFeHRlbnQuZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgZGVwdGggb3IgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5pbWFnZUV4dGVudC5kZXB0aDwvY29kZT4gJiM0MzsgPGNvZGU+aW1hZ2VPZmZzZXQuejwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGgiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDE1NTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+VmtJbWFnZTwvY29kZT4gcGFyYW1ldGVyJiM4MjE3O3MgZm9ybWF0IGlzIG5vdCBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IG9yIGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5tdWx0aS1wbGFuYXIgZm9ybWF0PC9hPiwgdGhlbiA8Y29kZT5idWZmZXJPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGZvcm1hdCYjODIxNztzIHRleGVsIGJsb2NrIHNpemUuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDE1NTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+VmtJbWFnZTwvY29kZT4gcGFyYW1ldGVyJiM4MjE3O3MgZm9ybWF0IGlzIGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5tdWx0aS1wbGFuYXIgZm9ybWF0PC9hPiwgdGhlbiA8Y29kZT5idWZmZXJPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGVsZW1lbnQgc2l6ZSBvZiB0aGUgY29tcGF0aWJsZSBmb3JtYXQgZm9yIHRoZSBmb3JtYXQgYW5kIHRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBvZiB0aGUgPGNvZGU+aW1hZ2VTdWJyZXNvdXJjZTwvY29kZT4gYXMgZGVmaW5lZCBpbiA8YSBocmVmPVwiI2Zvcm1hdHMtY29tcGF0aWJsZS1wbGFuZXNcIj5Db21wYXRpYmxlIGZvcm1hdHMgb2YgcGxhbmVzIG9mIG11bHRpLXBsYW5hciBmb3JtYXRzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMTczNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5Wa0ltYWdlPC9jb2RlPiBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIDxlbT5zaW5nbGUtcGxhbmU8L2VtPiwgJiM4MjIwOzxjb2RlPl80MjI8L2NvZGU+JiM4MjIxOyBpbWFnZSBmb3JtYXQsIDxjb2RlPmJ1ZmZlclJvd0xlbmd0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayB3aWR0aCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMTczNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5Wa0ltYWdlPC9jb2RlPiBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIDxlbT5zaW5nbGUtcGxhbmU8L2VtPiwgJiM4MjIwOzxjb2RlPl80MjI8L2NvZGU+JiM4MjIxOyBpbWFnZSBmb3JtYXQsIDxjb2RlPmJ1ZmZlckltYWdlSGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIGhlaWdodCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMTczNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5Wa0ltYWdlPC9jb2RlPiBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIDxlbT5zaW5nbGUtcGxhbmU8L2VtPiwgJiM4MjIwOzxjb2RlPl80MjI8L2NvZGU+JiM4MjIxOyBpbWFnZSBmb3JtYXQsIGFsbCBtZW1iZXJzIG9mIDxjb2RlPmltYWdlT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGRpbWVuc2lvbnMgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2siCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LU5vbmUtMDE3MzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+VmtJbWFnZTwvY29kZT4gcGFyYW1ldGVyIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgb3IgYSA8ZW0+c2luZ2xlLXBsYW5lPC9lbT4sICYjODIyMDs8Y29kZT5fNDIyPC9jb2RlPiYjODIyMTsgaW1hZ2UgZm9ybWF0LCA8Y29kZT5idWZmZXJPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgc2l6ZSBpbiBieXRlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMTczOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5Wa0ltYWdlPC9jb2RlPiBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIDxlbT5zaW5nbGUtcGxhbmU8L2VtPiwgJiM4MjIwOzxjb2RlPl80MjI8L2NvZGU+JiM4MjIxOyBpbWFnZSBmb3JtYXQsIDxjb2RlPmltYWdlRXh0ZW50LndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHdpZHRoIG9yIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+aW1hZ2VFeHRlbnQud2lkdGg8L2NvZGU+ICYjNDM7IDxjb2RlPmltYWdlT2Zmc2V0Lng8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAxNzQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHBhcmFtZXRlciBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIG9yIGEgPGVtPnNpbmdsZS1wbGFuZTwvZW0+LCAmIzgyMjA7PGNvZGU+XzQyMjwvY29kZT4mIzgyMjE7IGltYWdlIGZvcm1hdCwgPGNvZGU+aW1hZ2VFeHRlbnQuaGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIGhlaWdodCBvciA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmltYWdlRXh0ZW50LmhlaWdodDwvY29kZT4gJiM0MzsgPGNvZGU+aW1hZ2VPZmZzZXQueTwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAxNzQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHBhcmFtZXRlciBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIG9yIGEgPGVtPnNpbmdsZS1wbGFuZTwvZW0+LCAmIzgyMjA7PGNvZGU+XzQyMjwvY29kZT4mIzgyMjE7IGltYWdlIGZvcm1hdCwgPGNvZGU+aW1hZ2VFeHRlbnQuZGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgZGVwdGggb3IgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5pbWFnZUV4dGVudC5kZXB0aDwvY29kZT4gJiM0MzsgPGNvZGU+aW1hZ2VPZmZzZXQuejwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWFzcGVjdE1hc2stMDE1NjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+VmtJbWFnZTwvY29kZT4gcGFyYW1ldGVyJiM4MjE3O3MgZm9ybWF0IGlzIGEgPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5tdWx0aS1wbGFuYXIgZm9ybWF0PC9hPiwgdGhlbiB0aGUgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPmltYWdlU3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVDwvY29kZT4gKHdpdGggPGNvZGU+VktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUPC9jb2RlPiB2YWxpZCBvbmx5IGZvciBpbWFnZSBmb3JtYXRzIHdpdGggdGhyZWUgcGxhbmVzKSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDAxOTQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXJPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlclJvd0xlbmd0aC0wMDE5NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJ1ZmZlclJvd0xlbmd0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4sIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgPGNvZGU+d2lkdGg8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5pbWFnZUV4dGVudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlckltYWdlSGVpZ2h0LTAwMTk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVySW1hZ2VIZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+LCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIDxjb2RlPmhlaWdodDwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPmltYWdlRXh0ZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAxOTciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZU9mZnNldC54PC9jb2RlPiBhbmQgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5pbWFnZUV4dGVudC53aWR0aDwvY29kZT4gJiM0MzsgPGNvZGU+aW1hZ2VPZmZzZXQueDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSB3aWR0aCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAxOTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZU9mZnNldC55PC9jb2RlPiBhbmQgPHNwYW4gY2xhc3M9XCJlcVwiPihpbWFnZUV4dGVudC5oZWlnaHQgJiM0MzsgPGNvZGU+aW1hZ2VPZmZzZXQueTwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiAoPGEgaHJlZj1cIiN2a0NtZENvcHlJbWFnZVRvQnVmZmVyXCI+dmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcjwvYT4pIG9yIDxjb2RlPmRzdEltYWdlPC9jb2RlPiAoPGEgaHJlZj1cIiN2a0NtZENvcHlCdWZmZXJUb0ltYWdlXCI+dmtDbWRDb3B5QnVmZmVyVG9JbWFnZTwvYT4pIGlzIG9mIHR5cGUgPGNvZGU+VktfSU1BR0VfVFlQRV8xRDwvY29kZT4sIHRoZW4gPGNvZGU+aW1hZ2VPZmZzZXQueTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPmltYWdlRXh0ZW50LmhlaWdodDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDIwMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlT2Zmc2V0Lno8L2NvZGU+IGFuZCA8c3BhbiBjbGFzcz1cImVxXCI+KGltYWdlRXh0ZW50LmRlcHRoICYjNDM7IDxjb2RlPmltYWdlT2Zmc2V0Lno8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LXNyY0ltYWdlLTAwMjAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiAoPGEgaHJlZj1cIiN2a0NtZENvcHlJbWFnZVRvQnVmZmVyXCI+dmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcjwvYT4pIG9yIDxjb2RlPmRzdEltYWdlPC9jb2RlPiAoPGEgaHJlZj1cIiN2a0NtZENvcHlCdWZmZXJUb0ltYWdlXCI+dmtDbWRDb3B5QnVmZmVyVG9JbWFnZTwvYT4pIGlzIG9mIHR5cGUgPGNvZGU+VktfSU1BR0VfVFlQRV8xRDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVFlQRV8yRDwvY29kZT4sIHRoZW4gPGNvZGU+aW1hZ2VPZmZzZXQuejwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPmltYWdlRXh0ZW50LmRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYXNwZWN0TWFzay0wMDIxMSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+aW1hZ2VTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSBhc3BlY3RzIHByZXNlbnQgaW4gdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHBhcmFtZXRlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYXNwZWN0TWFzay0wMDIxMiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+aW1hZ2VTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBoYXZlIGEgc2luZ2xlIGJpdCBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJhc2VBcnJheUxheWVyLTAwMjEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHBhcmFtZXRlciBpcyBvZiA8YSBocmVmPVwiI1ZrSW1hZ2VUeXBlXCI+VmtJbWFnZVR5cGU8L2E+IDxjb2RlPlZLX0lNQUdFX1RZUEVfM0Q8L2NvZGU+LCB0aGUgPGNvZGU+YmFzZUFycmF5TGF5ZXI8L2NvZGU+IGFuZCA8Y29kZT5sYXllckNvdW50PC9jb2RlPiBtZW1iZXJzIG9mIDxjb2RlPmltYWdlU3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IGFuZCA8Y29kZT4xPC9jb2RlPiwgcmVzcGVjdGl2ZWx5IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZVN1YnJlc291cmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlU3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VMYXllcnNcIj5Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnM8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAwMjE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgV2hlbiBjb3B5aW5nIHRvIHRoZSBkZXB0aCBhc3BlY3Qgb2YgYW4gaW1hZ2Ugc3VicmVzb3VyY2UsIHRoZSBkYXRhIGluIHRoZSBzb3VyY2UgYnVmZmVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSByYW5nZSA8c3BhbiBjbGFzcz1cImVxXCI+WzAsMV08L3NwYW4+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRCbGl0SW1hZ2UiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtcFJlZ2lvbnMtMDAyMTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc291cmNlIHJlZ2lvbiBzcGVjaWZpZWQgYnkgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHJlZ2lvbiB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy0wMDIxNiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBkZXN0aW5hdGlvbiByZWdpb24gc3BlY2lmaWVkIGJ5IGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSByZWdpb24gdGhhdCBpcyBjb250YWluZWQgd2l0aGluIDxjb2RlPmRzdEltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtcFJlZ2lvbnMtMDAyMTciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdW5pb24gb2YgYWxsIGRlc3RpbmF0aW9uIHJlZ2lvbnMsIHNwZWNpZmllZCBieSB0aGUgZWxlbWVudHMgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+LCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgb3ZlcmxhcCBpbiBtZW1vcnkgd2l0aCBhbnkgdGV4ZWwgdGhhdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bWF5PC9zdHJvbmc+IGJlIHNhbXBsZWQgZHVyaW5nIHRoZSBibGl0IG9wZXJhdGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDE5OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiBvZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9CTElUX1NSQ19CSVQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMTkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIyMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMjIxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjSW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHNwZWNpZnkgdGhlIGxheW91dCBvZiB0aGUgaW1hZ2Ugc3VicmVzb3VyY2VzIG9mIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IGF0IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCBvbiBhIDxjb2RlPlZrRGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDIwMDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiBvZiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9CTElUX0RTVF9CSVQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDAyMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUPC9jb2RlPiB1c2FnZSBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMDIyNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlTGF5b3V0LTAwMjI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHNwZWNpZnkgdGhlIGxheW91dCBvZiB0aGUgaW1hZ2Ugc3VicmVzb3VyY2VzIG9mIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IGF0IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCBvbiBhIDxjb2RlPlZrRGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc2FtcGxlIGNvdW50IG9mIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBhbmQgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgZXF1YWwgdG8gPGNvZGU+VktfU0FNUExFX0NPVU5UXzFfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBlaXRoZXIgb2YgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IG9yIDxjb2RlPmRzdEltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIGEgc2lnbmVkIGludGVnZXIgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiwgdGhlIG90aGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHNpZ25lZCBpbnRlZ2VyIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgZWl0aGVyIG9mIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBvciA8Y29kZT5kc3RJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhbiB1bnNpZ25lZCBpbnRlZ2VyIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4sIHRoZSBvdGhlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYW4gdW5zaWduZWQgaW50ZWdlciA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciBvZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gb3IgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCwgdGhlIG90aGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBmb3JtYXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCwgPGNvZGU+ZmlsdGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GSUxURVJfTkVBUkVTVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT5zYW1wbGVzPC9jb2RlPiB2YWx1ZSBvZiA8Y29kZT5WS19TQU1QTEVfQ09VTlRfMV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMDIzNCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPGNvZGU+c2FtcGxlczwvY29kZT4gdmFsdWUgb2YgPGNvZGU+VktfU0FNUExFX0NPVU5UXzFfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZmlsdGVyLTAyMDAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmlsdGVyPC9jb2RlPiBpcyA8Y29kZT5WS19GSUxURVJfTElORUFSPC9jb2RlPiwgdGhlbiB0aGUgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2UtZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiBvZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY1N1YnJlc291cmNlLTAxNzA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPnNyY1N1YnJlc291cmNlLm1pcExldmVsPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIDxjb2RlPm1pcExldmVsczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdFN1YnJlc291cmNlLTAxNzA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmRzdFN1YnJlc291cmNlLm1pcExldmVsPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIDxjb2RlPm1pcExldmVsczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY1N1YnJlc291cmNlLTAxNzA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcjwvY29kZT4gJiM0MzsgPGNvZGU+c3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudDwvY29kZT48L3NwYW4+IG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdFN1YnJlc291cmNlLTAxNzA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxzcGFuIGNsYXNzPVwiZXFcIj48Y29kZT5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcjwvY29kZT4gJiM0MzsgPGNvZGU+ZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudDwvY29kZT48L3NwYW4+IG9mIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlTGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZUxheW91dFwiPlZrSW1hZ2VMYXlvdXQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlTGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZUxheW91dFwiPlZrSW1hZ2VMYXlvdXQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnJlZ2lvbkNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VCbGl0XCI+VmtJbWFnZUJsaXQ8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLWZpbHRlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5maWx0ZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ZpbHRlclwiPlZrRmlsdGVyPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yZWdpb25Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCA8Y29kZT5kc3RJbWFnZTwvY29kZT4sIGFuZCA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAxNTYxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCB1c2UgYSBmb3JtYXQgbGlzdGVkIGluIDxhIGhyZWY9XCIjZm9ybWF0cy1yZXF1aXJpbmctc2FtcGxlci15Y2Jjci1jb252ZXJzaW9uXCI+Rm9ybWF0cyByZXF1aXJpbmcgc2FtcGxlciBZJiM4MjE3O0M8c3ViPkI8L3N1Yj5DPHN1Yj5SPC9zdWI+IGNvbnZlcnNpb24gZm9yIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ8L2NvZGU+IGltYWdlIHZpZXdzPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDE1NjIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IHVzZSBhIGZvcm1hdCBsaXN0ZWQgaW4gPGEgaHJlZj1cIiNmb3JtYXRzLXJlcXVpcmluZy1zYW1wbGVyLXljYmNyLWNvbnZlcnNpb25cIj5Gb3JtYXRzIHJlcXVpcmluZyBzYW1wbGVyIFkmIzgyMTc7QzxzdWI+Qjwvc3ViPkM8c3ViPlI8L3N1Yj4gY29udmVyc2lvbiBmb3IgPGNvZGU+VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDwvY29kZT4gaW1hZ2Ugdmlld3M8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMjIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjSW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0dFTkVSQUw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZUxheW91dC0wMDIyNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlTGF5b3V0LTAxMzk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjSW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDEzOTkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUjwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfTEFZT1VUX0dFTkVSQUw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItMDIwMDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5maWx0ZXI8L2NvZGU+IGlzIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+LCB0aGVuIHRoZSA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IG9mIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9FWFQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZmlsdGVyLTAwMjM3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmlsdGVyPC9jb2RlPiBpcyA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiwgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VUeXBlXCI+VmtJbWFnZVR5cGU8L2E+IG9mIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItMDE4MzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGltYWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tYW5kQnVmZmVyLTAxODM1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBpbWFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCbGl0SW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgzNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgaW1hZ2UiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF9mcmFnbWVudF9kZW5zaXR5X21hcCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAyNTQ1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGFuZCA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlQmxpdCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQmxpdC1hc3BlY3RNYXNrLTAwMjM4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmFzcGVjdE1hc2s8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gYW5kIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUJsaXQtbGF5ZXJDb3VudC0wMDIzOSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5sYXllckNvdW50PC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3JjU3VicmVzb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5kc3RTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2giCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VCbGl0LXNyY0ltYWdlLTAwMjQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgZWl0aGVyIG9mIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gb3IgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IHBhcmFtZXRlcnMgYXJlIG9mIDxhIGhyZWY9XCIjVmtJbWFnZVR5cGVcIj5Wa0ltYWdlVHlwZTwvYT4gPGNvZGU+VktfSU1BR0VfVFlQRV8zRDwvY29kZT4sIHRoZSA8Y29kZT5iYXNlQXJyYXlMYXllcjwvY29kZT4gYW5kIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IG1lbWJlcnMgb2YgYm90aCA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gYW5kIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+MTwvY29kZT4sIHJlc3BlY3RpdmVseSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUJsaXQtYXNwZWN0TWFzay0wMDI0MSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3JjU3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHNwZWNpZnkgYXNwZWN0cyBwcmVzZW50IGluIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VCbGl0LWFzcGVjdE1hc2stMDAyNDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+YXNwZWN0TWFzazwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5IGFzcGVjdHMgcHJlc2VudCBpbiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQmxpdC1zcmNPZmZzZXQtMDAyNDMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNPZmZzZXQ8L2NvZGU+WzBdLnggYW5kIDxjb2RlPnNyY09mZnNldDwvY29kZT5bMV0ueCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VCbGl0LXNyY09mZnNldC0wMDI0NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY09mZnNldDwvY29kZT5bMF0ueSBhbmQgPGNvZGU+c3JjT2Zmc2V0PC9jb2RlPlsxXS55IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VCbGl0LXNyY0ltYWdlLTAwMjQ1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMUQ8L2NvZGU+LCB0aGVuIDxjb2RlPnNyY09mZnNldDwvY29kZT5bMF0ueSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+c3JjT2Zmc2V0PC9jb2RlPlsxXS55IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUJsaXQtc3JjT2Zmc2V0LTAwMjQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjT2Zmc2V0PC9jb2RlPlswXS56IGFuZCA8Y29kZT5zcmNPZmZzZXQ8L2NvZGU+WzFdLnogPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIGRlcHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQmxpdC1zcmNJbWFnZS0wMDI0NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgb2YgdHlwZSA8Y29kZT5WS19JTUFHRV9UWVBFXzFEPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPiwgdGhlbiA8Y29kZT5zcmNPZmZzZXQ8L2NvZGU+WzBdLnogPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPnNyY09mZnNldDwvY29kZT5bMV0ueiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VCbGl0LWRzdE9mZnNldC0wMDI0OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdE9mZnNldDwvY29kZT5bMF0ueCBhbmQgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPlsxXS54IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlQmxpdC1kc3RPZmZzZXQtMDAyNDkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RPZmZzZXQ8L2NvZGU+WzBdLnkgYW5kIDxjb2RlPmRzdE9mZnNldDwvY29kZT5bMV0ueSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VCbGl0LWRzdEltYWdlLTAwMjUwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMUQ8L2NvZGU+LCB0aGVuIDxjb2RlPmRzdE9mZnNldDwvY29kZT5bMF0ueSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPlsxXS55IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUJsaXQtZHN0T2Zmc2V0LTAwMjUxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPlswXS56IGFuZCA8Y29kZT5kc3RPZmZzZXQ8L2NvZGU+WzFdLnogPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VCbGl0LWRzdEltYWdlLTAwMjUyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBvZiB0eXBlIDxjb2RlPlZLX0lNQUdFX1RZUEVfMUQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1RZUEVfMkQ8L2NvZGU+LCB0aGVuIDxjb2RlPmRzdE9mZnNldDwvY29kZT5bMF0ueiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+ZHN0T2Zmc2V0PC9jb2RlPlsxXS56IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUJsaXQtc3JjU3VicmVzb3VyY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjU3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VMYXllcnNcIj5Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnM8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUJsaXQtZHN0U3VicmVzb3VyY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0U3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlU3VicmVzb3VyY2VMYXllcnNcIj5Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnM8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kUmVzb2x2ZUltYWdlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXBSZWdpb25zLTAwMjUzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHNvdXJjZSByZWdpb24gc3BlY2lmaWVkIGJ5IGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSByZWdpb24gdGhhdCBpcyBjb250YWluZWQgd2l0aGluIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcFJlZ2lvbnMtMDAyNTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgZGVzdGluYXRpb24gcmVnaW9uIHNwZWNpZmllZCBieSBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgcmVnaW9uIHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXBSZWdpb25zLTAwMjU1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHVuaW9uIG9mIGFsbCBzb3VyY2UgcmVnaW9ucywgYW5kIHRoZSB1bmlvbiBvZiBhbGwgZGVzdGluYXRpb24gcmVnaW9ucywgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wUmVnaW9uczwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBvdmVybGFwIGluIG1lbW9yeSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2UtMDAyNTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgbm9uLXNwYXJzZSB0aGVuIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZS0wMDI1NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgc2FtcGxlIGNvdW50IGVxdWFsIHRvIGFueSB2YWxpZCBzYW1wbGUgY291bnQgdmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5WS19TQU1QTEVfQ09VTlRfMV9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZS0wMDI1OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlLTAwMjU5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSBzYW1wbGUgY291bnQgZXF1YWwgdG8gPGNvZGU+VktfU0FNUExFX0NPVU5UXzFfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDAyNjAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2YgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IHNwZWNpZmllZCBpbiA8Y29kZT5wUmVnaW9uczwvY29kZT4gYXQgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIG9uIGEgPGNvZGU+VmtEZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZUxheW91dC0wMDI2MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5IHRoZSBsYXlvdXQgb2YgdGhlIGltYWdlIHN1YnJlc291cmNlcyBvZiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gc3BlY2lmaWVkIGluIDxjb2RlPnBSZWdpb25zPC9jb2RlPiBhdCB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgb24gYSA8Y29kZT5Wa0RldmljZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlLTAyMDAzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gb2YgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2UtMDEzODYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNJbWFnZTwvY29kZT4gYW5kIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGltYWdlIGZvcm1hdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjU3VicmVzb3VyY2UtMDE3MDkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c3JjU3VicmVzb3VyY2UubWlwTGV2ZWw8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+bWlwTGV2ZWxzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE3MTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+ZHN0U3VicmVzb3VyY2UubWlwTGV2ZWw8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFJlZ2lvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+bWlwTGV2ZWxzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPmRzdEltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjU3VicmVzb3VyY2UtMDE3MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyPC9jb2RlPiAmIzQzOyA8Y29kZT5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50PC9jb2RlPjwvc3Bhbj4gb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE3MTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPHNwYW4gY2xhc3M9XCJlcVwiPjxjb2RlPmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyPC9jb2RlPiAmIzQzOyA8Y29kZT5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50PC9jb2RlPjwvc3Bhbj4gb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIDxjb2RlPmFycmF5TGF5ZXJzPC9jb2RlPiBzcGVjaWZpZWQgaW4gPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPiB3aGVuIDxjb2RlPmRzdEltYWdlPC9jb2RlPiB3YXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2VMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjSW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlTGF5b3V0XCI+VmtJbWFnZUxheW91dDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXBSZWdpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBSZWdpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cmVnaW9uQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVJlc29sdmVcIj5Wa0ltYWdlUmVzb2x2ZTwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yZWdpb25Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCA8Y29kZT5kc3RJbWFnZTwvY29kZT4sIGFuZCA8Y29kZT5zcmNJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZUxheW91dC0wMDI2MSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAyNjMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RJbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfR0VORVJBTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZUxheW91dC0wMTQwMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0ltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9MQVlPVVRfR0VORVJBTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlTGF5b3V0LTAxNDAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0SW1hZ2VMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFI8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tYW5kQnVmZmVyLTAxODM3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBpbWFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgzOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIDxjb2RlPmRzdEltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgaW1hZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWNvbW1hbmRCdWZmZXItMDE4MzkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiA8Y29kZT5kc3RJbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFuIHVucHJvdGVjdGVkIGltYWdlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZS0wMjU0NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEltYWdlPC9jb2RlPiBhbmQgPGNvZGU+c3JjSW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbWFnZVJlc29sdmUiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVJlc29sdmUtYXNwZWN0TWFzay0wMDI2NiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5hc3BlY3RNYXNrPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+c3JjU3VicmVzb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5kc3RTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBjb250YWluIDxjb2RlPlZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1sYXllckNvdW50LTAwMjY3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPmxheWVyQ291bnQ8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gYW5kIDxjb2RlPmRzdFN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVJlc29sdmUtc3JjSW1hZ2UtMDAyNjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBlaXRoZXIgb2YgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPnNyY0ltYWdlPC9jb2RlPiBvciA8Y29kZT5kc3RJbWFnZTwvY29kZT4gcGFyYW1ldGVycyBhcmUgb2YgPGEgaHJlZj1cIiNWa0ltYWdlVHlwZVwiPlZrSW1hZ2VUeXBlPC9hPiA8Y29kZT5WS19JTUFHRV9UWVBFXzNEPC9jb2RlPiwgdGhlIDxjb2RlPmJhc2VBcnJheUxheWVyPC9jb2RlPiBhbmQgPGNvZGU+bGF5ZXJDb3VudDwvY29kZT4gbWVtYmVycyBvZiBib3RoIDxjb2RlPnNyY1N1YnJlc291cmNlPC9jb2RlPiBhbmQgPGNvZGU+ZHN0U3VicmVzb3VyY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IGFuZCA8Y29kZT4xPC9jb2RlPiwgcmVzcGVjdGl2ZWx5IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1zcmNPZmZzZXQtMDAyNjkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNPZmZzZXQueDwvY29kZT4gYW5kIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5zcmNPZmZzZXQueDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGgiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VSZXNvbHZlLXNyY09mZnNldC0wMDI3MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY09mZnNldC55PC9jb2RlPiBhbmQgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPiAmIzQzOyA8Y29kZT5zcmNPZmZzZXQueTwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1zcmNJbWFnZS0wMDI3MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgb2YgdHlwZSA8Y29kZT5WS19JTUFHRV9UWVBFXzFEPC9jb2RlPiwgdGhlbiA8Y29kZT5zcmNPZmZzZXQueTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVJlc29sdmUtc3JjT2Zmc2V0LTAwMjcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjT2Zmc2V0Lno8L2NvZGU+IGFuZCA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gJiM0MzsgPGNvZGU+c3JjT2Zmc2V0Lno8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIGRlcHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1zcmNJbWFnZS0wMDI3MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5zcmNJbWFnZTwvY29kZT4gaXMgb2YgdHlwZSA8Y29kZT5WS19JTUFHRV9UWVBFXzFEPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPiwgdGhlbiA8Y29kZT5zcmNPZmZzZXQuejwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1kc3RPZmZzZXQtMDAyNzQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RPZmZzZXQueDwvY29kZT4gYW5kIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiAmIzQzOyA8Y29kZT5kc3RPZmZzZXQueDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBzdWJyZXNvdXJjZSB3aWR0aCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVJlc29sdmUtZHN0T2Zmc2V0LTAwMjc1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0T2Zmc2V0Lnk8L2NvZGU+IGFuZCA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+ICYjNDM7IDxjb2RlPmRzdE9mZnNldC55PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIGhlaWdodCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVJlc29sdmUtZHN0SW1hZ2UtMDAyNzYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY2FsbGluZyBjb21tYW5kJiM4MjE3O3MgPGNvZGU+ZHN0SW1hZ2U8L2NvZGU+IGlzIG9mIHR5cGUgPGNvZGU+VktfSU1BR0VfVFlQRV8xRDwvY29kZT4sIHRoZW4gPGNvZGU+ZHN0T2Zmc2V0Lnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IGFuZCA8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VSZXNvbHZlLWRzdE9mZnNldC0wMDI3NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdE9mZnNldC56PC9jb2RlPiBhbmQgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+ICYjNDM7IDxjb2RlPmRzdE9mZnNldC56PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+IGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIGRlcHRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1kc3RJbWFnZS0wMDI3OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjYWxsaW5nIGNvbW1hbmQmIzgyMTc7cyA8Y29kZT5kc3RJbWFnZTwvY29kZT4gaXMgb2YgdHlwZSA8Y29kZT5WS19JTUFHRV9UWVBFXzFEPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9UWVBFXzJEPC9jb2RlPiwgdGhlbiA8Y29kZT5kc3RPZmZzZXQuejwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1zcmNTdWJyZXNvdXJjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zcmNTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VTdWJyZXNvdXJjZUxheWVyc1wiPlZrSW1hZ2VTdWJyZXNvdXJjZUxheWVyczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1kc3RTdWJyZXNvdXJjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RTdWJyZXNvdXJjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VTdWJyZXNvdXJjZUxheWVyc1wiPlZrSW1hZ2VTdWJyZXNvdXJjZUxheWVyczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCI6IHsKKyAgICAgICIoVktfQU1EX2J1ZmZlcl9tYXJrZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELWRzdE9mZnNldC0wMTc5OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdE9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gbWludXMgPGNvZGU+NDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELWRzdEJ1ZmZlci0wMTc5OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCA8Y29kZT5WS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDwvY29kZT4gdXNhZ2UgZmxhZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1kc3RCdWZmZXItMDE4MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kc3RCdWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1kc3RPZmZzZXQtMDE4MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtcGlwZWxpbmVTdGFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZVN0YWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHNcIj5Wa1BpcGVsaW5lU3RhZ2VGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtZHN0QnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgdHJhbnNmZXIsIGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPmRzdEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXRvcG9sb2d5LTAwNDI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dG9wb2xvZ3k8L2NvZGU+IGlzIDxjb2RlPlZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUPC9jb2RlPiwgPGNvZGU+VktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVDwvY29kZT4sIDxjb2RlPlZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUPC9jb2RlPiwgPGNvZGU+VktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVF9XSVRIX0FESkFDRU5DWTwvY29kZT4sIDxjb2RlPlZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZPC9jb2RlPiBvciA8Y29kZT5WS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVDwvY29kZT4sIDxjb2RlPnByaW1pdGl2ZVJlc3RhcnRFbmFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA0MjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1nZW9tZXRyeVNoYWRlclwiPmdlb21ldHJ5IHNoYWRlcnM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnRvcG9sb2d5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYW55IG9mIDxjb2RlPlZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX0xJU1RfV0lUSF9BREpBQ0VOQ1k8L2NvZGU+LCA8Y29kZT5WS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUF9XSVRIX0FESkFDRU5DWTwvY29kZT4sIDxjb2RlPlZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZPC9jb2RlPiBvciA8Y29kZT5WS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfU1RSSVBfV0lUSF9BREpBQ0VOQ1k8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQzMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXRlc3NlbGxhdGlvblNoYWRlclwiPnRlc3NlbGxhdGlvbiBzaGFkZXJzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT50b3BvbG9neTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXRvcG9sb2d5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRvcG9sb2d5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQcmltaXRpdmVUb3BvbG9neVwiPlZrUHJpbWl0aXZlVG9wb2xvZ3k8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRCaW5kSW5kZXhCdWZmZXIiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItb2Zmc2V0LTAwNDMxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItb2Zmc2V0LTAwNDMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1bSBvZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgcmFuZ2Ugb2YgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCB0aGF0IGlzIGJhY2tpbmcgPGNvZGU+YnVmZmVyPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgdHlwZSBpbmRpY2F0ZWQgYnkgPGNvZGU+aW5kZXhUeXBlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItYnVmZmVyLTAwNDMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVDwvY29kZT4gZmxhZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItYnVmZmVyLTAwNDM0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1pbmRleFR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5kZXhUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbmRleFR5cGVcIj5Wa0luZGV4VHlwZTwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5idWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfcmF5X3RyYWNpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1pbmRleFR5cGUtMDI1MDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbmRleFR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19JTkRFWF9UWVBFX05PTkVfTlY8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2luZGV4X3R5cGVfdWludDgpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1pbmRleFR5cGUtMDI3NjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbmRleFR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX0lOREVYX1RZUEVfVUlOVDhfRVhUPC9jb2RlPiwgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtaW5kZXhUeXBlVWludDhcIj5pbmRleFR5cGVVaW50ODwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWREcmF3IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9MSU5FQVI8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctTm9uZS0wMjY5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggc2V0IDxlbT5uPC9lbT4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBib3VuZCB0byA8ZW0+bjwvZW0+IGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCA8ZW0+bjwvZW0+LCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI2OTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBwdXNoIGNvbnN0YW50IHZhbHVlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI2OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBEZXNjcmlwdG9ycyBpbiBlYWNoIGJvdW5kIGRlc2NyaXB0b3Igc2V0LCBzcGVjaWZpZWQgdmlhIDxjb2RlPnZrQ21kQmluZERlc2NyaXB0b3JTZXRzPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBIHZhbGlkIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci0wMjcwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNzAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgPGNvZGU+VmtJbWFnZTwvY29kZT4gd2l0aCBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBvZiB0aGUgdHlwZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+LCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctTm9uZS0wMjcwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB3aXRoIDxjb2RlPkltcGxpY2l0TG9kPC9jb2RlPiwgPGNvZGU+RHJlZjwvY29kZT4gb3IgPGNvZGU+UHJvajwvY29kZT4gaW4gdGhlaXIgbmFtZSwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctTm9uZS0wMjcwNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJvYnVzdEJ1ZmZlckFjY2Vzc1wiPnJvYnVzdCBidWZmZXIgYWNjZXNzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhdy1yZW5kZXJQYXNzLTAyNjg0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNyZW5kZXJwYXNzLWNvbXBhdGliaWxpdHlcIj5jb21wYXRpYmxlPC9hPiB3aXRoIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctc3VicGFzcy0wMjY4NSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdWJwYXNzIGluZGV4IG9mIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSA8Y29kZT5zdWJwYXNzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctTm9uZS0wMjY4NiIsCisgICAgICAgICAgInRleHQiOiAiIEV2ZXJ5IGlucHV0IGF0dGFjaG1lbnQgdXNlZCBieSB0aGUgY3VycmVudCBzdWJwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSB2aWEgYSBkZXNjcmlwdG9yIHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI2ODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJbWFnZSBzdWJyZXNvdXJjZXMgdXNlZCBhcyBhdHRhY2htZW50cyBpbiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgdmVydGV4IGlucHV0IGJpbmRpbmdzIGFjY2Vzc2VkIHZpYSB2ZXJ0ZXggaW5wdXQgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIGVudHJ5IHBvaW50JiM4MjE3O3MgaW50ZXJmYWNlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgdmFsaWQgYnVmZmVycyBib3VuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYSBnaXZlbiB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFueSBhdHRyaWJ1dGUgZGF0YSBmZXRjaGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVudGlyZWx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgdmVydGV4IGJ1ZmZlciBiaW5kaW5nLCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNmeHZlcnRleC1pbnB1dFwiPlZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhdy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhdy1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctTm9uZS0wMjY5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctTm9uZS0wMjY5MyIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gb2YgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctZmlsdGVyQ3ViaWMtMDI2OTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpYzwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQ8L2NvZGU+IG9yIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSA8Y29kZT5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+ZmlsdGVyQ3ViaWNNaW5tYXg8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctZmxhZ3MtMDI2OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJBZGRyZXNzTW9kZVwiPlZrU2FtcGxlckFkZHJlc3NNb2RlPC9hPiBvZiA8Y29kZT5WS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItMDI3MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci0wMjcxMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBhbnkgcmVzb3VyY2Ugd3JpdHRlbiB0byBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhbiB1bnByb3RlY3RlZCByZXNvdXJjZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItMDI3MTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgcGlwZWxpbmUgc3RhZ2VzIG90aGVyIHRoYW4gdGhlIGZyYW1lYnVmZmVyLXNwYWNlIGFuZCBjb21wdXRlIHN0YWdlcyBpbiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCB3cml0ZSB0byBhbnkgcmVzb3VyY2UiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBkcmF3IGlzIHJlY29yZGVkIGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2Ugd2l0aCBtdWx0aXZpZXcgZW5hYmxlZCwgdGhlIG1heGltdW0gaW5zdGFuY2UgaW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczwvYT46Ojxjb2RlPm1heE11bHRpdmlld0luc3RhbmNlSW5kZXg8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXctc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVDwvYT46Ojxjb2RlPnNhbXBsZUxvY2F0aW9uc0VuYWJsZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+IGFuZCB0aGUgY3VycmVudCBzdWJwYXNzIGhhcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCwgdGhlbiB0aGF0IGF0dGFjaG1lbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWREcmF3SW5kZXhlZCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2OTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0xJTkVBUjwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5NyIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHNldCA8ZW0+bjwvZW0+IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYm91bmQgdG8gPGVtPm48L2VtPiBhdCB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgPGVtPm48L2VtPiwgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5OCIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+LCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy1jb21wYXRpYmlsaXR5XCI+UGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHk8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBEZXNjcmlwdG9ycyBpbiBlYWNoIGJvdW5kIGRlc2NyaXB0b3Igc2V0LCBzcGVjaWZpZWQgdmlhIDxjb2RlPnZrQ21kQmluZERlc2NyaXB0b3JTZXRzPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQSB2YWxpZCBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLTAyNzAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCByZXF1aXJlcyBhbnkgZHluYW1pYyBzdGF0ZSwgdGhhdCBzdGF0ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc2V0IGZvciA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgPGNvZGU+VmtJbWFnZTwvY29kZT4gd2l0aCBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBvZiB0aGUgdHlwZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+LCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI3MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgd2l0aCA8Y29kZT5JbXBsaWNpdExvZDwvY29kZT4sIDxjb2RlPkRyZWY8L2NvZGU+IG9yIDxjb2RlPlByb2o8L2NvZGU+IGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjcwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjcwNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJvYnVzdEJ1ZmZlckFjY2Vzc1wiPnJvYnVzdCBidWZmZXIgYWNjZXNzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgc3RvcmFnZSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLXJlbmRlclBhc3MtMDI2ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI3JlbmRlcnBhc3MtY29tcGF0aWJpbGl0eVwiPmNvbXBhdGlibGU8L2E+IHdpdGggdGhlIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byA8Y29kZT5WS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtc3VicGFzcy0wMjY4NSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdWJwYXNzIGluZGV4IG9mIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSA8Y29kZT5zdWJwYXNzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2ODYiLAorICAgICAgICAgICJ0ZXh0IjogIiBFdmVyeSBpbnB1dCBhdHRhY2htZW50IHVzZWQgYnkgdGhlIGN1cnJlbnQgc3VicGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgdmlhIGEgZGVzY3JpcHRvciBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY4NyIsCisgICAgICAgICAgInRleHQiOiAiIEltYWdlIHN1YnJlc291cmNlcyB1c2VkIGFzIGF0dGFjaG1lbnRzIGluIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhY2Nlc3NlZCBpbiBhbnkgd2F5IG90aGVyIHRoYW4gYXMgYW4gYXR0YWNobWVudCBieSB0aGlzIGNvbW1hbmQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI3MjAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgdmVydGV4IGlucHV0IGJpbmRpbmdzIGFjY2Vzc2VkIHZpYSB2ZXJ0ZXggaW5wdXQgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIGVudHJ5IHBvaW50JiM4MjE3O3MgaW50ZXJmYWNlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgdmFsaWQgYnVmZmVycyBib3VuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzIxIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGEgZ2l2ZW4gdmVydGV4IGJ1ZmZlciBiaW5kaW5nLCBhbnkgYXR0cmlidXRlIGRhdGEgZmV0Y2hlZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBidWZmZXIgYmluZGluZywgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZnh2ZXJ0ZXgtaW5wdXRcIj5WZXJ0ZXggSW5wdXQgRGVzY3JpcHRpb248L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLWluZGV4U2l6ZS0wMDQ2MyIsCisgICAgICAgICAgInRleHQiOiAiIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+aW5kZXhTaXplPC9jb2RlPiAqICg8Y29kZT5maXJzdEluZGV4PC9jb2RlPiAmIzQzOyA8Y29kZT5pbmRleENvdW50PC9jb2RlPikgJiM0MzsgPGNvZGU+b2Zmc2V0PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgYm91bmQgaW5kZXggYnVmZmVyLCB3aXRoIDxjb2RlPmluZGV4U2l6ZTwvY29kZT4gYmVpbmcgYmFzZWQgb24gdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IDxjb2RlPmluZGV4VHlwZTwvY29kZT4sIHdoZXJlIHRoZSBpbmRleCBidWZmZXIsIDxjb2RlPmluZGV4VHlwZTwvY29kZT4sIGFuZCA8Y29kZT5vZmZzZXQ8L2NvZGU+IGFyZSBzcGVjaWZpZWQgdmlhIDxjb2RlPnZrQ21kQmluZEluZGV4QnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2OTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrIShWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNjkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBvZiA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSsoVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtZmlsdGVyQ3ViaWMtMDI2OTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpYzwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUPC9jb2RlPiBvciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljTWlubWF4PC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX2Nvcm5lcl9zYW1wbGVkX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1mbGFncy0wMjY5NiIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbmluZyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WPC9jb2RlPiBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIHNhbXBsZWQgdXNpbmcgYSA8YSBocmVmPVwiI1ZrU2FtcGxlckFkZHJlc3NNb2RlXCI+VmtTYW1wbGVyQWRkcmVzc01vZGU8L2E+IG9mIDxjb2RlPlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0U8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLWNvbW1hbmRCdWZmZXItMDI3MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLWNvbW1hbmRCdWZmZXItMDI3MTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIHdyaXR0ZW4gdG8gYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgcmVzb3VyY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci0wMjcxMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBwaXBlbGluZSBzdGFnZXMgb3RoZXIgdGhhbiB0aGUgZnJhbWVidWZmZXItc3BhY2UgYW5kIGNvbXB1dGUgc3RhZ2VzIGluIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IHdyaXRlIHRvIGFueSByZXNvdXJjZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBkcmF3IGlzIHJlY29yZGVkIGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2Ugd2l0aCBtdWx0aXZpZXcgZW5hYmxlZCwgdGhlIG1heGltdW0gaW5zdGFuY2UgaW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczwvYT46Ojxjb2RlPm1heE11bHRpdmlld0luc3RhbmNlSW5kZXg8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L2NvZGU+IHNldCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kRHJhd0luZGlyZWN0IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0xJTkVBUjwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBhY2Nlc3NlZCB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggc2V0IDxlbT5uPC9lbT4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBib3VuZCB0byA8ZW0+bjwvZW0+IGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCA8ZW0+bjwvZW0+LCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjY5OCIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+LCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy1jb21wYXRpYmlsaXR5XCI+UGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHk8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSA8Y29kZT52a0NtZEJpbmREZXNjcmlwdG9yU2V0czwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGlmIHRoZXkgYXJlIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI3MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBIHZhbGlkIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1jb21tYW5kQnVmZmVyLTAyNzAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCByZXF1aXJlcyBhbnkgZHluYW1pYyBzdGF0ZSwgdGhhdCBzdGF0ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc2V0IGZvciA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgdG8gc2FtcGxlIGZyb20gYW55IDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHdpdGggYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gb2YgdGhlIHR5cGUgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVk8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVk8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB3aXRoIDxjb2RlPkltcGxpY2l0TG9kPC9jb2RlPiwgPGNvZGU+RHJlZjwvY29kZT4gb3IgPGNvZGU+UHJvajwvY29kZT4gaW4gdGhlaXIgbmFtZSwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI3MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSB1bmlmb3JtIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI3MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LXJlbmRlclBhc3MtMDI2ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI3JlbmRlcnBhc3MtY29tcGF0aWJpbGl0eVwiPmNvbXBhdGlibGU8L2E+IHdpdGggdGhlIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byA8Y29kZT5WS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LXN1YnBhc3MtMDI2ODUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VicGFzcyBpbmRleCBvZiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byB0aGUgPGNvZGU+c3VicGFzczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIDxjb2RlPlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjY4NiIsCisgICAgICAgICAgInRleHQiOiAiIEV2ZXJ5IGlucHV0IGF0dGFjaG1lbnQgdXNlZCBieSB0aGUgY3VycmVudCBzdWJwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSB2aWEgYSBkZXNjcmlwdG9yIHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjY4NyIsCisgICAgICAgICAgInRleHQiOiAiIEltYWdlIHN1YnJlc291cmNlcyB1c2VkIGFzIGF0dGFjaG1lbnRzIGluIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhY2Nlc3NlZCBpbiBhbnkgd2F5IG90aGVyIHRoYW4gYXMgYW4gYXR0YWNobWVudCBieSB0aGlzIGNvbW1hbmQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHZlcnRleCBpbnB1dCBiaW5kaW5ncyBhY2Nlc3NlZCB2aWEgdmVydGV4IGlucHV0IHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgdmVydGV4IHNoYWRlciBlbnRyeSBwb2ludCYjODIxNztzIGludGVyZmFjZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIHZhbGlkIGJ1ZmZlcnMgYm91bmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI3MjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYSBnaXZlbiB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFueSBhdHRyaWJ1dGUgZGF0YSBmZXRjaGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVudGlyZWx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgdmVydGV4IGJ1ZmZlciBiaW5kaW5nLCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNmeHZlcnRleC1pbnB1dFwiPlZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWJ1ZmZlci0wMjcwOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm9uLXNwYXJzZSB0aGVuIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1idWZmZXItMDI3MDkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1vZmZzZXQtMDI3MTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWRyYXdDb3VudC0wMjcxOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLW11bHRpRHJhd0luZGlyZWN0XCI+bXVsdGktZHJhdyBpbmRpcmVjdDwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZHJhd0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiBvciA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZHJhd0NvdW50LTAyNzE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHJhd0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heERyYXdJbmRpcmVjdENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZmlyc3RJbnN0YW5jZS0wMDQ3OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2VcIj5kcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbGwgdGhlIDxjb2RlPmZpcnN0SW5zdGFuY2U8L2NvZGU+IG1lbWJlcnMgb2YgdGhlIDxjb2RlPlZrRHJhd0luZGlyZWN0Q29tbWFuZDwvY29kZT4gc3RydWN0dXJlcyBhY2Nlc3NlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWRyYXdDb3VudC0wMDQ3NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRyYXdDb3VudDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIDxjb2RlPjE8L2NvZGU+LCA8Y29kZT5zdHJpZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4gYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5zaXplb2Y8L2NvZGU+KDxjb2RlPlZrRHJhd0luZGlyZWN0Q29tbWFuZDwvY29kZT4pIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1kcmF3Q291bnQtMDA0ODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kcmF3Q291bnQ8L2NvZGU+IGlzIGVxdWFsIHRvIDxjb2RlPjE8L2NvZGU+LCA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPm9mZnNldDwvY29kZT4gJiM0MzsgPGNvZGU+c2l6ZW9mPC9jb2RlPig8YSBocmVmPVwiI1ZrRHJhd0luZGlyZWN0Q29tbWFuZFwiPlZrRHJhd0luZGlyZWN0Q29tbWFuZDwvYT4pKTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWRyYXdDb3VudC0wMDQ4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRyYXdDb3VudDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIDxjb2RlPjE8L2NvZGU+LCA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPnN0cmlkZTwvY29kZT4ge3RpbWVzfSAoPGNvZGU+ZHJhd0NvdW50PC9jb2RlPiAtIDEpICYjNDM7IDxjb2RlPm9mZnNldDwvY29kZT4gJiM0MzsgPGNvZGU+c2l6ZW9mPC9jb2RlPig8YSBocmVmPVwiI1ZrRHJhd0luZGlyZWN0Q29tbWFuZFwiPlZrRHJhd0luZGlyZWN0Q29tbWFuZDwvYT4pKTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrIShWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjY5MyIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gb2YgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1maWx0ZXJDdWJpYy0wMjY5NCIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUPC9jb2RlPiBvciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljTWlubWF4PC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX2Nvcm5lcl9zYW1wbGVkX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZmxhZ3MtMDI2OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJBZGRyZXNzTW9kZVwiPlZrU2FtcGxlckFkZHJlc3NNb2RlPC9hPiBvZiA8Y29kZT5WS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcwNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBhbnkgcmVzb3VyY2UgYWNjZXNzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LTAyNjg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGRyYXcgaXMgcmVjb3JkZWQgaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSB3aXRoIG11bHRpdmlldyBlbmFibGVkLCB0aGUgbWF4aW11bSBpbnN0YW5jZSBpbmRleCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllc1wiPlZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzPC9hPjo6PGNvZGU+bWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleDwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfc2FtcGxlX2xvY2F0aW9ucykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L2NvZGU+IHNldCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRHJhd0luZGlyZWN0Q29tbWFuZCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RyYXdJbmRpcmVjdENvbW1hbmQtTm9uZS0wMDUwMCIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBhIGdpdmVuIHZlcnRleCBidWZmZXIgYmluZGluZywgYW55IGF0dHJpYnV0ZSBkYXRhIGZldGNoZWQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW50aXJlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Z4dmVydGV4LWlucHV0XCI+VmVydGV4IElucHV0IERlc2NyaXB0aW9uPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEcmF3SW5kaXJlY3RDb21tYW5kLWZpcnN0SW5zdGFuY2UtMDA1MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1kcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlXCI+ZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZTwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+Zmlyc3RJbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSIjogeworICAgICAgIihWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfTElORUFSPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggc2V0IDxlbT5uPC9lbT4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBib3VuZCB0byA8ZW0+bjwvZW0+IGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCA8ZW0+bjwvZW0+LCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggcHVzaCBjb25zdGFudCB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBwdXNoIGNvbnN0YW50cywgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5OSIsCisgICAgICAgICAgInRleHQiOiAiIERlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgPGNvZGU+dmtDbWRCaW5kRGVzY3JpcHRvclNldHM8L2NvZGU+LCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBIHZhbGlkIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItMDI3MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSA8Y29kZT5Wa0ltYWdlPC9jb2RlPiB3aXRoIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IG9mIHRoZSB0eXBlIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8zRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4sIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB3aXRoIDxjb2RlPkltcGxpY2l0TG9kPC9jb2RlPiwgPGNvZGU+RHJlZjwvY29kZT4gb3IgPGNvZGU+UHJvajwvY29kZT4gaW4gdGhlaXIgbmFtZSwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIDxjb2RlPk9wSW1hZ2VTYW1wbGUqPC9jb2RlPiBvciA8Y29kZT5PcEltYWdlU3BhcnNlU2FtcGxlKjwvY29kZT4gaW5zdHJ1Y3Rpb25zIHRoYXQgaW5jbHVkZXMgYSBMT0QgYmlhcyBvciBhbnkgb2Zmc2V0IHZhbHVlcywgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItcmVuZGVyUGFzcy0wMjY4NCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBjdXJyZW50IHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxhIGhyZWY9XCIjcmVuZGVycGFzcy1jb21wYXRpYmlsaXR5XCI+Y29tcGF0aWJsZTwvYT4gd2l0aCB0aGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIDxjb2RlPlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1zdWJwYXNzLTAyNjg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1YnBhc3MgaW5kZXggb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIDxjb2RlPnN1YnBhc3M8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byA8Y29kZT5WS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY4NiIsCisgICAgICAgICAgInRleHQiOiAiIEV2ZXJ5IGlucHV0IGF0dGFjaG1lbnQgdXNlZCBieSB0aGUgY3VycmVudCBzdWJwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSB2aWEgYSBkZXNjcmlwdG9yIHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSW1hZ2Ugc3VicmVzb3VyY2VzIHVzZWQgYXMgYXR0YWNobWVudHMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgb3RoZXIgdGhhbiBhcyBhbiBhdHRhY2htZW50IGJ5IHRoaXMgY29tbWFuZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcyMCIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCB2ZXJ0ZXggaW5wdXQgYmluZGluZ3MgYWNjZXNzZWQgdmlhIHZlcnRleCBpbnB1dCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHZlcnRleCBzaGFkZXIgZW50cnkgcG9pbnQmIzgyMTc7cyBpbnRlcmZhY2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSB2YWxpZCBidWZmZXJzIGJvdW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYSBnaXZlbiB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFueSBhdHRyaWJ1dGUgZGF0YSBmZXRjaGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVudGlyZWx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgdmVydGV4IGJ1ZmZlciBiaW5kaW5nLCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNmeHZlcnRleC1pbnB1dFwiPlZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1vZmZzZXQtMDI3MTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb3VudEJ1ZmZlcjwvY29kZT4gaXMgbm9uLXNwYXJzZSB0aGVuIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y291bnRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyT2Zmc2V0LTAyNzE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y291bnRCdWZmZXJPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgY291bnQgc3RvcmVkIGluIDxjb2RlPmNvdW50QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heERyYXdJbmRpcmVjdENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1zdHJpZGUtMDMxMTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdHJpZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4gYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBzaXplb2YoPGNvZGU+VmtEcmF3SW5kaXJlY3RDb21tYW5kPC9jb2RlPikiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItbWF4RHJhd0NvdW50LTAzMTExIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bWF4RHJhd0NvdW50PC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+c3RyaWRlPC9jb2RlPiB7dGltZXN9ICg8Y29kZT5tYXhEcmF3Q291bnQ8L2NvZGU+IC0gMSkgJiM0MzsgPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyBzaXplb2YoPGNvZGU+VmtEcmF3SW5kaXJlY3RDb21tYW5kPC9jb2RlPikpPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMzEyMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBjb3VudCBzdG9yZWQgaW4gPGNvZGU+Y291bnRCdWZmZXI8L2NvZGU+IGlzIGVxdWFsIHRvIDxjb2RlPjE8L2NvZGU+LCA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPm9mZnNldDwvY29kZT4gJiM0Mzsgc2l6ZW9mKDxjb2RlPlZrRHJhd0luZGlyZWN0Q29tbWFuZDwvY29kZT4pKTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDMxMjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY291bnQgc3RvcmVkIGluIDxjb2RlPmNvdW50QnVmZmVyPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+c3RyaWRlPC9jb2RlPiB7dGltZXN9ICg8Y29kZT5kcmF3Q291bnQ8L2NvZGU+IC0gMSkgJiM0MzsgPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyBzaXplb2YoPGNvZGU+VmtEcmF3SW5kaXJlY3RDb21tYW5kPC9jb2RlPikpPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvdW50QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBvZiA8Y29kZT5idWZmZXI8L2NvZGU+LCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPmNvdW50QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCkrKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQpKyhWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpKyEoVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5MyIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gb2YgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50KSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSsoVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItZmlsdGVyQ3ViaWMtMDI2OTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpYzwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUPC9jb2RlPiBvciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljTWlubWF4PC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50KSsoVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWZsYWdzLTAyNjk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlY8L2NvZGU+IHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIDxhIGhyZWY9XCIjVmtTYW1wbGVyQWRkcmVzc01vZGVcIj5Wa1NhbXBsZXJBZGRyZXNzTW9kZTwvYT4gb2YgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCkrKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCByZXNvdXJjZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzExIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCkrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZHJhdyBpcyByZWNvcmRlZCBpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIHdpdGggbXVsdGl2aWV3IGVuYWJsZWQsIHRoZSBtYXhpbXVtIGluc3RhbmNlIGluZGV4IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzXCI+VmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM8L2E+Ojo8Y29kZT5tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4PC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50KSsoVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L2NvZGU+IHNldCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfTElORUFSPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI2OTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBhY2Nlc3NlZCB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5NyIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHNldCA8ZW0+bjwvZW0+IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYm91bmQgdG8gPGVtPm48L2VtPiBhdCB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgPGVtPm48L2VtPiwgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggcHVzaCBjb25zdGFudCB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBwdXNoIGNvbnN0YW50cywgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSA8Y29kZT52a0NtZEJpbmREZXNjcmlwdG9yU2V0czwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGlmIHRoZXkgYXJlIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQSB2YWxpZCBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjcwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgdG8gc2FtcGxlIGZyb20gYW55IDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHdpdGggYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gb2YgdGhlIHR5cGUgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVk8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVk8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI3MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgd2l0aCA8Y29kZT5JbXBsaWNpdExvZDwvY29kZT4sIDxjb2RlPkRyZWY8L2NvZGU+IG9yIDxjb2RlPlByb2o8L2NvZGU+IGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIDxjb2RlPk9wSW1hZ2VTYW1wbGUqPC9jb2RlPiBvciA8Y29kZT5PcEltYWdlU3BhcnNlU2FtcGxlKjwvY29kZT4gaW5zdHJ1Y3Rpb25zIHRoYXQgaW5jbHVkZXMgYSBMT0QgYmlhcyBvciBhbnkgb2Zmc2V0IHZhbHVlcywgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI3MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSB1bmlmb3JtIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgc3RvcmFnZSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtcmVuZGVyUGFzcy0wMjY4NCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBjdXJyZW50IHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxhIGhyZWY9XCIjcmVuZGVycGFzcy1jb21wYXRpYmlsaXR5XCI+Y29tcGF0aWJsZTwvYT4gd2l0aCB0aGUgPGNvZGU+cmVuZGVyUGFzczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIDxjb2RlPlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LXN1YnBhc3MtMDI2ODUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VicGFzcyBpbmRleCBvZiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byB0aGUgPGNvZGU+c3VicGFzczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIDxjb2RlPlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI2ODYiLAorICAgICAgICAgICJ0ZXh0IjogIiBFdmVyeSBpbnB1dCBhdHRhY2htZW50IHVzZWQgYnkgdGhlIGN1cnJlbnQgc3VicGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgdmlhIGEgZGVzY3JpcHRvciBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSW1hZ2Ugc3VicmVzb3VyY2VzIHVzZWQgYXMgYXR0YWNobWVudHMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgb3RoZXIgdGhhbiBhcyBhbiBhdHRhY2htZW50IGJ5IHRoaXMgY29tbWFuZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHZlcnRleCBpbnB1dCBiaW5kaW5ncyBhY2Nlc3NlZCB2aWEgdmVydGV4IGlucHV0IHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgdmVydGV4IHNoYWRlciBlbnRyeSBwb2ludCYjODIxNztzIGludGVyZmFjZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIHZhbGlkIGJ1ZmZlcnMgYm91bmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzIxIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGEgZ2l2ZW4gdmVydGV4IGJ1ZmZlciBiaW5kaW5nLCBhbnkgYXR0cmlidXRlIGRhdGEgZmV0Y2hlZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBidWZmZXIgYmluZGluZywgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZnh2ZXJ0ZXgtaW5wdXRcIj5WZXJ0ZXggSW5wdXQgRGVzY3JpcHRpb248L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtYnVmZmVyLTAyNzA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1idWZmZXItMDI3MDkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3Qtb2Zmc2V0LTAyNzEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAyNzE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbXVsdGlEcmF3SW5kaXJlY3RcIj5tdWx0aS1kcmF3IGluZGlyZWN0PC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kcmF3Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IG9yIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAyNzE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHJhd0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heERyYXdJbmRpcmVjdENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWRyYXdDb3VudC0wMDUyOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRyYXdDb3VudDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIDxjb2RlPjE8L2NvZGU+LCA8Y29kZT5zdHJpZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4gYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5zaXplb2Y8L2NvZGU+KDxjb2RlPlZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQ8L2NvZGU+KSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWZpcnN0SW5zdGFuY2UtMDA1MzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1kcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlXCI+ZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZTwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYWxsIHRoZSA8Y29kZT5maXJzdEluc3RhbmNlPC9jb2RlPiBtZW1iZXJzIG9mIHRoZSA8Y29kZT5Wa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kPC9jb2RlPiBzdHJ1Y3R1cmVzIGFjY2Vzc2VkIGJ5IHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWRyYXdDb3VudC0wMDUzOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRyYXdDb3VudDwvY29kZT4gaXMgZXF1YWwgdG8gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyA8Y29kZT5zaXplb2Y8L2NvZGU+KDxjb2RlPlZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQ8L2NvZGU+KSk8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5idWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAwNTQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZHJhd0NvdW50PC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+c3RyaWRlPC9jb2RlPiB7dGltZXN9ICg8Y29kZT5kcmF3Q291bnQ8L2NvZGU+IC0gMSkgJiM0MzsgPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyA8Y29kZT5zaXplb2Y8L2NvZGU+KDxjb2RlPlZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQ8L2NvZGU+KSk8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5idWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5MyIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gb2YgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZmlsdGVyQ3ViaWMtMDI2OTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpYzwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQ8L2NvZGU+IG9yIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSA8Y29kZT5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+ZmlsdGVyQ3ViaWNNaW5tYXg8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZmxhZ3MtMDI2OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJBZGRyZXNzTW9kZVwiPlZrU2FtcGxlckFkZHJlc3NNb2RlPC9hPiBvZiA8Y29kZT5WS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcxMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LTAyNjg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGRyYXcgaXMgcmVjb3JkZWQgaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSB3aXRoIG11bHRpdmlldyBlbmFibGVkLCB0aGUgbWF4aW11bSBpbnN0YW5jZSBpbmRleCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllc1wiPlZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzPC9hPjo6PGNvZGU+bWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleDwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfc2FtcGxlX2xvY2F0aW9ucykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1zYW1wbGVMb2NhdGlvbnNFbmFibGUtMDI2ODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUPC9hPjo6PGNvZGU+c2FtcGxlTG9jYXRpb25zRW5hYmxlPC9jb2RlPiBzZXQgdG8gPGNvZGU+VktfVFJVRTwvY29kZT4gYW5kIHRoZSBjdXJyZW50IHN1YnBhc3MgaGFzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50LCB0aGVuIHRoYXQgYXR0YWNobWVudCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19JTUFHRV9DUkVBVEVfU0FNUExFX0xPQ0FUSU9OU19DT01QQVRJQkxFX0RFUFRIX0JJVF9FWFQ8L2NvZGU+IGJpdCBzZXQiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQtTm9uZS0wMDU1MiIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBhIGdpdmVuIHZlcnRleCBidWZmZXIgYmluZGluZywgYW55IGF0dHJpYnV0ZSBkYXRhIGZldGNoZWQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW50aXJlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Z4dmVydGV4LWlucHV0XCI+VmVydGV4IElucHV0IERlc2NyaXB0aW9uPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZC1pbmRleFNpemUtMDA1NTMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmluZGV4U2l6ZTwvY29kZT4gKiAoPGNvZGU+Zmlyc3RJbmRleDwvY29kZT4gJiM0MzsgPGNvZGU+aW5kZXhDb3VudDwvY29kZT4pICYjNDM7IDxjb2RlPm9mZnNldDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGJvdW5kIGluZGV4IGJ1ZmZlciwgd2l0aCA8Y29kZT5pbmRleFNpemU8L2NvZGU+IGJlaW5nIGJhc2VkIG9uIHRoZSB0eXBlIHNwZWNpZmllZCBieSA8Y29kZT5pbmRleFR5cGU8L2NvZGU+LCB3aGVyZSB0aGUgaW5kZXggYnVmZmVyLCA8Y29kZT5pbmRleFR5cGU8L2NvZGU+LCBhbmQgPGNvZGU+b2Zmc2V0PC9jb2RlPiBhcmUgc3BlY2lmaWVkIHZpYSA8Y29kZT52a0NtZEJpbmRJbmRleEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQtZmlyc3RJbnN0YW5jZS0wMDU1NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2VcIj5kcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5maXJzdEluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSIjogeworICAgICAgIihWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0xJTkVBUjwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBhY2Nlc3NlZCB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggc2V0IDxlbT5uPC9lbT4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBib3VuZCB0byA8ZW0+bjwvZW0+IGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCA8ZW0+bjwvZW0+LCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5OCIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+LCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy1jb21wYXRpYmlsaXR5XCI+UGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHk8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSA8Y29kZT52a0NtZEJpbmREZXNjcmlwdG9yU2V0czwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGlmIHRoZXkgYXJlIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBIHZhbGlkIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCByZXF1aXJlcyBhbnkgZHluYW1pYyBzdGF0ZSwgdGhhdCBzdGF0ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc2V0IGZvciA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgdG8gc2FtcGxlIGZyb20gYW55IDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHdpdGggYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gb2YgdGhlIHR5cGUgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVk8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVk8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB3aXRoIDxjb2RlPkltcGxpY2l0TG9kPC9jb2RlPiwgPGNvZGU+RHJlZjwvY29kZT4gb3IgPGNvZGU+UHJvajwvY29kZT4gaW4gdGhlaXIgbmFtZSwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSB1bmlmb3JtIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLXJlbmRlclBhc3MtMDI2ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI3JlbmRlcnBhc3MtY29tcGF0aWJpbGl0eVwiPmNvbXBhdGlibGU8L2E+IHdpdGggdGhlIDxjb2RlPnJlbmRlclBhc3M8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byA8Y29kZT5WS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLXN1YnBhc3MtMDI2ODUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VicGFzcyBpbmRleCBvZiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byB0aGUgPGNvZGU+c3VicGFzczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIDxjb2RlPlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjY4NiIsCisgICAgICAgICAgInRleHQiOiAiIEV2ZXJ5IGlucHV0IGF0dGFjaG1lbnQgdXNlZCBieSB0aGUgY3VycmVudCBzdWJwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSB2aWEgYSBkZXNjcmlwdG9yIHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjY4NyIsCisgICAgICAgICAgInRleHQiOiAiIEltYWdlIHN1YnJlc291cmNlcyB1c2VkIGFzIGF0dGFjaG1lbnRzIGluIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhY2Nlc3NlZCBpbiBhbnkgd2F5IG90aGVyIHRoYW4gYXMgYW4gYXR0YWNobWVudCBieSB0aGlzIGNvbW1hbmQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzIwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHZlcnRleCBpbnB1dCBiaW5kaW5ncyBhY2Nlc3NlZCB2aWEgdmVydGV4IGlucHV0IHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgdmVydGV4IHNoYWRlciBlbnRyeSBwb2ludCYjODIxNztzIGludGVyZmFjZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIHZhbGlkIGJ1ZmZlcnMgYm91bmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgYSBnaXZlbiB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFueSBhdHRyaWJ1dGUgZGF0YSBmZXRjaGVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVudGlyZWx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgdmVydGV4IGJ1ZmZlciBiaW5kaW5nLCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNmeHZlcnRleC1pbnB1dFwiPlZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWJ1ZmZlci0wMjcwOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm9uLXNwYXJzZSB0aGVuIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1idWZmZXItMDI3MDkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1vZmZzZXQtMDI3MTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y291bnRCdWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb3VudEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQ8L2NvZGU+IGJpdCBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyT2Zmc2V0LTAyNzE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y291bnRCdWZmZXJPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGNvdW50IHN0b3JlZCBpbiA8Y29kZT5jb3VudEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEcmF3SW5kaXJlY3RDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLXN0cmlkZS0wMzE0MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0cmlkZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT40PC9jb2RlPiBhbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHNpemVvZig8Y29kZT5Wa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kPC9jb2RlPikiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLW1heERyYXdDb3VudC0wMzE0MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm1heERyYXdDb3VudDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjE8L2NvZGU+LCA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPnN0cmlkZTwvY29kZT4ge3RpbWVzfSAoPGNvZGU+bWF4RHJhd0NvdW50PC9jb2RlPiAtIDEpICYjNDM7IDxjb2RlPm9mZnNldDwvY29kZT4gJiM0Mzsgc2l6ZW9mKDxjb2RlPlZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQ8L2NvZGU+KSk8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5idWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMzE1MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIGNvdW50IHN0b3JlZCBpbiA8Y29kZT5jb3VudEJ1ZmZlcjwvY29kZT4gaXMgZXF1YWwgdG8gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyBzaXplb2YoPGNvZGU+VmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZDwvY29kZT4pKTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAzMTU0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgY291bnQgc3RvcmVkIGluIDxjb2RlPmNvdW50QnVmZmVyPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+c3RyaWRlPC9jb2RlPiB7dGltZXN9ICg8Y29kZT5kcmF3Q291bnQ8L2NvZGU+IC0gMSkgJiM0MzsgPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyBzaXplb2YoPGNvZGU+VmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZDwvY29kZT4pKTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb3VudEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4sIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+Y291bnRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50KSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQpKyhWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpKyEoVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IG9mIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8zRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCkrKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1maWx0ZXJDdWJpYy0wMjY5NCIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUPC9jb2RlPiBvciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljTWlubWF4PC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50KSsoVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1mbGFncy0wMjY5NiIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbmluZyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WPC9jb2RlPiBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIHNhbXBsZWQgdXNpbmcgYSA8YSBocmVmPVwiI1ZrU2FtcGxlckFkZHJlc3NNb2RlXCI+VmtTYW1wbGVyQWRkcmVzc01vZGU8L2E+IG9mIDxjb2RlPlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0U8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQpKyhWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItMDI3MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzExIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCkrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tdWx0aXZpZXcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LTAyNjg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGRyYXcgaXMgcmVjb3JkZWQgaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSB3aXRoIG11bHRpdmlldyBlbmFibGVkLCB0aGUgbWF4aW11bSBpbnN0YW5jZSBpbmRleCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllc1wiPlZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzPC9hPjo6PGNvZGU+bWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleDwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCkrKFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVDwvYT46Ojxjb2RlPnNhbXBsZUxvY2F0aW9uc0VuYWJsZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+IGFuZCB0aGUgY3VycmVudCBzdWJwYXNzIGhhcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCwgdGhlbiB0aGF0IGF0dGFjaG1lbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQiOiB7CisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9MSU5FQVI8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY5NyIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHNldCA8ZW0+bjwvZW0+IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYm91bmQgdG8gPGVtPm48L2VtPiBhdCB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgPGVtPm48L2VtPiwgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI2OTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBwdXNoIGNvbnN0YW50IHZhbHVlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY5OSIsCisgICAgICAgICAgInRleHQiOiAiIERlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgPGNvZGU+dmtDbWRCaW5kRGVzY3JpcHRvclNldHM8L2NvZGU+LCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNzAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQSB2YWxpZCBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbWFuZEJ1ZmZlci0wMjcwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSA8Y29kZT5Wa0ltYWdlPC9jb2RlPiB3aXRoIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IG9mIHRoZSB0eXBlIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8zRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4sIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgd2l0aCA8Y29kZT5JbXBsaWNpdExvZDwvY29kZT4sIDxjb2RlPkRyZWY8L2NvZGU+IG9yIDxjb2RlPlByb2o8L2NvZGU+IGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNzA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNzA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgc3RvcmFnZSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1yZW5kZXJQYXNzLTAyNjg0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNyZW5kZXJwYXNzLWNvbXBhdGliaWxpdHlcIj5jb21wYXRpYmxlPC9hPiB3aXRoIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1zdWJwYXNzLTAyNjg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1YnBhc3MgaW5kZXggb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIDxjb2RlPnN1YnBhc3M8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byA8Y29kZT5WS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI2ODYiLAorICAgICAgICAgICJ0ZXh0IjogIiBFdmVyeSBpbnB1dCBhdHRhY2htZW50IHVzZWQgYnkgdGhlIGN1cnJlbnQgc3VicGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgdmlhIGEgZGVzY3JpcHRvciBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI2ODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJbWFnZSBzdWJyZXNvdXJjZXMgdXNlZCBhcyBhdHRhY2htZW50cyBpbiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjcyMCIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCB2ZXJ0ZXggaW5wdXQgYmluZGluZ3MgYWNjZXNzZWQgdmlhIHZlcnRleCBpbnB1dCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHZlcnRleCBzaGFkZXIgZW50cnkgcG9pbnQmIzgyMTc7cyBpbnRlcmZhY2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSB2YWxpZCBidWZmZXJzIGJvdW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNzIxIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGEgZ2l2ZW4gdmVydGV4IGJ1ZmZlciBiaW5kaW5nLCBhbnkgYXR0cmlidXRlIGRhdGEgZmV0Y2hlZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBidWZmZXIgYmluZGluZywgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZnh2ZXJ0ZXgtaW5wdXRcIj5WZXJ0ZXggSW5wdXQgRGVzY3JpcHRpb248L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC10cmFuc2Zvcm1GZWVkYmFjay0wMjI4NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUPC9jb2RlPjo6PGNvZGU+dHJhbnNmb3JtRmVlZGJhY2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULXRyYW5zZm9ybUZlZWRiYWNrRHJhdy0wMjI4OCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBpbXBsZW1lbnRhdGlvbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT50cmFuc2Zvcm1GZWVkYmFja0RyYXc8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC12ZXJ0ZXhTdHJpZGUtMDIyODkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT52ZXJ0ZXhTdHJpZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTGltaXRzXCI+VmtQaHlzaWNhbERldmljZUxpbWl0czwvYT46Ojxjb2RlPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvdW50ZXJCdWZmZXItMDIyOTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb3VudGVyQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvdW50ZXJCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y291bnRlckJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+Y291bnRlckJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykrKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI2OTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spKyhWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpKyEoVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI2OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IG9mIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8zRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSsoVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWZpbHRlckN1YmljLTAyNjk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSA8Y29kZT5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+ZmlsdGVyQ3ViaWM8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQ8L2NvZGU+IG9yIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSA8Y29kZT5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+ZmlsdGVyQ3ViaWNNaW5tYXg8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykrKFZLX05WX2Nvcm5lcl9zYW1wbGVkX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtZmxhZ3MtMDI2OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJBZGRyZXNzTW9kZVwiPlZrU2FtcGxlckFkZHJlc3NNb2RlPC9hPiBvZiA8Y29kZT5WS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spKyhWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvbW1hbmRCdWZmZXItMDI3MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tYW5kQnVmZmVyLTAyNjQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZHJhdyBpcyByZWNvcmRlZCBpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIHdpdGggbXVsdGl2aWV3IGVuYWJsZWQsIHRoZSBtYXhpbXVtIGluc3RhbmNlIGluZGV4IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzXCI+VmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM8L2E+Ojo8Y29kZT5tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4PC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spKyhWS19FWFRfc2FtcGxlX2xvY2F0aW9ucykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L2NvZGU+IHNldCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVC1Ob25lLTAxOTgwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQ29uZGl0aW9uYWwgcmVuZGVyaW5nIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhbHJlYWR5IGJlIDxhIGhyZWY9XCIjYWN0aXZlLWNvbmRpdGlvbmFsLXJlbmRlcmluZ1wiPmFjdGl2ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhULXBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFRcIj5Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtYnVmZmVyLTAxOTgxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YnVmZmVyPC9jb2RlPiBpcyBub24tc3BhcnNlIHRoZW4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtYnVmZmVyLTAxOTgyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfVVNBR0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0JJVF9FWFQ8L2NvZGU+IGJpdCBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtb2Zmc2V0LTAxOTgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiBieSBhdCBsZWFzdCAzMiBiaXRzLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVC1vZmZzZXQtMDE5ODQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgNCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFRcIj5Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQ8L2E+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiOiB7CisgICAgICAiKFZLX0VYVF9jb25kaXRpb25hbF9yZW5kZXJpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULU5vbmUtMDE5ODUiLAorICAgICAgICAgICJ0ZXh0IjogIiBDb25kaXRpb25hbCByZW5kZXJpbmcgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNhY3RpdmUtY29uZGl0aW9uYWwtcmVuZGVyaW5nXCI+YWN0aXZlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVC1Ob25lLTAxOTg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgY29uZGl0aW9uYWwgcmVuZGVyaW5nIHdhcyBtYWRlIDxhIGhyZWY9XCIjYWN0aXZlLWNvbmRpdGlvbmFsLXJlbmRlcmluZ1wiPmFjdGl2ZTwvYT4gb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCBpdCBtdXN0IG5vdCBiZSBlbmRlZCBpbnNpZGUgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVC1Ob25lLTAxOTg3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgY29uZGl0aW9uYWwgcmVuZGVyaW5nIHdhcyBtYWRlIDxhIGhyZWY9XCIjYWN0aXZlLWNvbmRpdGlvbmFsLXJlbmRlcmluZ1wiPmFjdGl2ZTwvYT4gd2l0aGluIGEgc3VicGFzcyBpdCBtdXN0IGJlIGVuZGVkIGluIHRoZSBzYW1lIHN1YnBhc3MiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZERyYXdNZXNoVGFza3NOViI6IHsKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9MSU5FQVI8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjY5NyIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHNldCA8ZW0+bjwvZW0+IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYm91bmQgdG8gPGVtPm48L2VtPiBhdCB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgPGVtPm48L2VtPiwgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBwdXNoIGNvbnN0YW50IHZhbHVlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjY5OSIsCisgICAgICAgICAgInRleHQiOiAiIERlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgPGNvZGU+dmtDbWRCaW5kRGVzY3JpcHRvclNldHM8L2NvZGU+LCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNzAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQSB2YWxpZCBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtY29tbWFuZEJ1ZmZlci0wMjcwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI3MDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSA8Y29kZT5Wa0ltYWdlPC9jb2RlPiB3aXRoIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IG9mIHRoZSB0eXBlIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8zRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4sIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI3MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgd2l0aCA8Y29kZT5JbXBsaWNpdExvZDwvY29kZT4sIDxjb2RlPkRyZWY8L2NvZGU+IG9yIDxjb2RlPlByb2o8L2NvZGU+IGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI3MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNzA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNzA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgc3RvcmFnZSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1yZW5kZXJQYXNzLTAyNjg0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNyZW5kZXJwYXNzLWNvbXBhdGliaWxpdHlcIj5jb21wYXRpYmxlPC9hPiB3aXRoIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1zdWJwYXNzLTAyNjg1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1YnBhc3MgaW5kZXggb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIDxjb2RlPnN1YnBhc3M8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzwvY29kZT4gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byA8Y29kZT5WS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2ODYiLAorICAgICAgICAgICJ0ZXh0IjogIiBFdmVyeSBpbnB1dCBhdHRhY2htZW50IHVzZWQgYnkgdGhlIGN1cnJlbnQgc3VicGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgdmlhIGEgZGVzY3JpcHRvciBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2ODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJbWFnZSBzdWJyZXNvdXJjZXMgdXNlZCBhcyBhdHRhY2htZW50cyBpbiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtdGFza0NvdW50LTAyMTE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dGFza0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY8L2NvZGU+Ojo8Y29kZT5tYXhEcmF3TWVzaFRhc2tzQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikrKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBvZiA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpKyhWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpKyhWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtZmlsdGVyQ3ViaWMtMDI2OTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpYzwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiB3aXRoIGEgcmVkdWN0aW9uIG1vZGUgb2YgZWl0aGVyIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVDwvY29kZT4gb3IgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nIHRvZ2V0aGVyIHdpdGggbWlubWF4IGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpY01pbm1heDwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikrKFZLX05WX2Nvcm5lcl9zYW1wbGVkX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtZmxhZ3MtMDI2OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJBZGRyZXNzTW9kZVwiPlZrU2FtcGxlckFkZHJlc3NNb2RlPC9hPiBvZiA8Y29kZT5WS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1jb21tYW5kQnVmZmVyLTAyNzA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCByZXNvdXJjZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfbXVsdGl2aWV3KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBkcmF3IGlzIHJlY29yZGVkIGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2Ugd2l0aCBtdWx0aXZpZXcgZW5hYmxlZCwgdGhlIG1heGltdW0gaW5zdGFuY2UgaW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczwvYT46Ojxjb2RlPm1heE11bHRpdmlld0luc3RhbmNlSW5kZXg8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpKyhWS19FWFRfc2FtcGxlX2xvY2F0aW9ucykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+Ojo8Y29kZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L2NvZGU+IHNldCB0byA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYiOiB7CisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9MSU5FQVI8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2OTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBhY2Nlc3NlZCB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2OTciLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBzZXQgPGVtPm48L2VtPiB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgZGVzY3JpcHRvciBzZXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGJvdW5kIHRvIDxlbT5uPC9lbT4gYXQgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHRoYXQgaXMgY29tcGF0aWJsZSBmb3Igc2V0IDxlbT5uPC9lbT4sIHdpdGggdGhlIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+LCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy1jb21wYXRpYmlsaXR5XCI+UGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHk8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2OTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBwdXNoIGNvbnN0YW50IHZhbHVlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSA8Y29kZT52a0NtZEJpbmREZXNjcmlwdG9yU2V0czwvY29kZT4sIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHZhbGlkIGlmIHRoZXkgYXJlIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjcwMCIsCisgICAgICAgICAgInRleHQiOiAiIEEgdmFsaWQgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci0wMjcwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjcwMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgdG8gc2FtcGxlIGZyb20gYW55IDxjb2RlPlZrSW1hZ2U8L2NvZGU+IHdpdGggYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gb2YgdGhlIHR5cGUgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVk8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVk8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNzAzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIDxjb2RlPk9wSW1hZ2VTYW1wbGUqPC9jb2RlPiBvciA8Y29kZT5PcEltYWdlU3BhcnNlU2FtcGxlKjwvY29kZT4gaW5zdHJ1Y3Rpb25zIHdpdGggPGNvZGU+SW1wbGljaXRMb2Q8L2NvZGU+LCA8Y29kZT5EcmVmPC9jb2RlPiBvciA8Y29kZT5Qcm9qPC9jb2RlPiBpbiB0aGVpciBuYW1lLCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI3MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI3MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSB1bmlmb3JtIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjcwNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJvYnVzdEJ1ZmZlckFjY2Vzc1wiPnJvYnVzdCBidWZmZXIgYWNjZXNzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1yZW5kZXJQYXNzLTAyNjg0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNyZW5kZXJwYXNzLWNvbXBhdGliaWxpdHlcIj5jb21wYXRpYmxlPC9hPiB3aXRoIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLXN1YnBhc3MtMDI2ODUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VicGFzcyBpbmRleCBvZiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byB0aGUgPGNvZGU+c3VicGFzczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPC9jb2RlPiBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIDxjb2RlPlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgRXZlcnkgaW5wdXQgYXR0YWNobWVudCB1c2VkIGJ5IHRoZSBjdXJyZW50IHN1YnBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIHZpYSBhIGRlc2NyaXB0b3Igc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2ODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJbWFnZSBzdWJyZXNvdXJjZXMgdXNlZCBhcyBhdHRhY2htZW50cyBpbiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1idWZmZXItMDI3MDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1idWZmZXItMDI3MDkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLW9mZnNldC0wMjcxMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT40PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1kcmF3Q291bnQtMDI3MTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tdWx0aURyYXdJbmRpcmVjdFwiPm11bHRpLWRyYXcgaW5kaXJlY3Q8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmRyYXdDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gb3IgPGNvZGU+MTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZHJhd0NvdW50LTAyNzE5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHJhd0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heERyYXdJbmRpcmVjdENvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1kcmF3Q291bnQtMDIxNDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5kcmF3Q291bnQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT4xPC9jb2RlPiwgPGNvZGU+c3RyaWRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPjQ8L2NvZGU+IGFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+c2l6ZW9mPC9jb2RlPig8Y29kZT5Wa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROVjwvY29kZT4pIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWRyYXdDb3VudC0wMjE1NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmRyYXdDb3VudDwvY29kZT4gaXMgZXF1YWwgdG8gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyA8Y29kZT5zaXplb2Y8L2NvZGU+KDxhIGhyZWY9XCIjVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlZcIj5Wa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROVjwvYT4pKTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZHJhd0NvdW50LTAyMTU3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZHJhd0NvdW50PC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+c3RyaWRlPC9jb2RlPiB7dGltZXN9ICg8Y29kZT5kcmF3Q291bnQ8L2NvZGU+IC0gMSkgJiM0MzsgPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyA8Y29kZT5zaXplb2Y8L2NvZGU+KDxhIGhyZWY9XCIjVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlZcIj5Wa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROVjwvYT4pKTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtYnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiwgYW5kIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikrKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrIShWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBvZiA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpKyhWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpKyhWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1maWx0ZXJDdWJpYy0wMjY5NCIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQ8L2NvZGU+IG9yIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSA8Y29kZT5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+ZmlsdGVyQ3ViaWNNaW5tYXg8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpKyhWS19OVl9jb3JuZXJfc2FtcGxlZF9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZmxhZ3MtMDI2OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJBZGRyZXNzTW9kZVwiPlZrU2FtcGxlckFkZHJlc3NNb2RlPC9hPiBvZiA8Y29kZT5WS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1hbmRCdWZmZXItMDI3MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1hbmRCdWZmZXItMDI3MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSBkcmF3IGlzIHJlY29yZGVkIGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2Ugd2l0aCBtdWx0aXZpZXcgZW5hYmxlZCwgdGhlIG1heGltdW0gaW5zdGFuY2UgaW5kZXggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXNcIj5Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczwvYT46Ojxjb2RlPm1heE11bHRpdmlld0luc3RhbmNlSW5kZXg8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpKyhWS19FWFRfc2FtcGxlX2xvY2F0aW9ucykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVDwvYT46Ojxjb2RlPnNhbXBsZUxvY2F0aW9uc0VuYWJsZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+IGFuZCB0aGUgY3VycmVudCBzdWJwYXNzIGhhcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCwgdGhlbiB0aGF0IGF0dGFjaG1lbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYiOiB7CisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYtdGFza0NvdW50LTAyMTc1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dGFza0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY8L2NvZGU+Ojo8Y29kZT5tYXhEcmF3TWVzaFRhc2tzQ291bnQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIjogeworICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9MSU5FQVI8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggc2V0IDxlbT5uPC9lbT4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBib3VuZCB0byA8ZW0+bjwvZW0+IGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCA8ZW0+bjwvZW0+LCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2OTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBwdXNoIGNvbnN0YW50IHZhbHVlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBEZXNjcmlwdG9ycyBpbiBlYWNoIGJvdW5kIGRlc2NyaXB0b3Igc2V0LCBzcGVjaWZpZWQgdmlhIDxjb2RlPnZrQ21kQmluZERlc2NyaXB0b3JTZXRzPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI3MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBIHZhbGlkIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci0wMjcwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNzAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgPGNvZGU+VmtJbWFnZTwvY29kZT4gd2l0aCBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBvZiB0aGUgdHlwZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+LCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjcwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB3aXRoIDxjb2RlPkltcGxpY2l0TG9kPC9jb2RlPiwgPGNvZGU+RHJlZjwvY29kZT4gb3IgPGNvZGU+UHJvajwvY29kZT4gaW4gdGhlaXIgbmFtZSwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI3MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjcwNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJvYnVzdEJ1ZmZlckFjY2Vzc1wiPnJvYnVzdCBidWZmZXIgYWNjZXNzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI3MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1yZW5kZXJQYXNzLTAyNjg0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGEgaHJlZj1cIiNyZW5kZXJwYXNzLWNvbXBhdGliaWxpdHlcIj5jb21wYXRpYmxlPC9hPiB3aXRoIHRoZSA8Y29kZT5yZW5kZXJQYXNzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtc3VicGFzcy0wMjY4NSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdWJwYXNzIGluZGV4IG9mIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSA8Y29kZT5zdWJwYXNzPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2NvZGU+IHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gPGNvZGU+VktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY4NiIsCisgICAgICAgICAgInRleHQiOiAiIEV2ZXJ5IGlucHV0IGF0dGFjaG1lbnQgdXNlZCBieSB0aGUgY3VycmVudCBzdWJwYXNzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSB2aWEgYSBkZXNjcmlwdG9yIHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2ODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJbWFnZSBzdWJyZXNvdXJjZXMgdXNlZCBhcyBhdHRhY2htZW50cyBpbiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWJ1ZmZlci0wMjcwOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlcjwvY29kZT4gaXMgbm9uLXNwYXJzZSB0aGVuIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSA8Y29kZT5Wa0RldmljZU1lbW9yeTwvY29kZT4gb2JqZWN0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtYnVmZmVyLTAyNzA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLW9mZnNldC0wMjcxMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT40PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y291bnRCdWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y291bnRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY291bnRCdWZmZXJPZmZzZXQtMDI3MTYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb3VudEJ1ZmZlck9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT40PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGNvdW50IHN0b3JlZCBpbiA8Y29kZT5jb3VudEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhEcmF3SW5kaXJlY3RDb3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1zdHJpZGUtMDIxODIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdHJpZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4gYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5zaXplb2Y8L2NvZGU+KDxjb2RlPlZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WPC9jb2RlPikiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1tYXhEcmF3Q291bnQtMDIxODMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5tYXhEcmF3Q291bnQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT4xPC9jb2RlPiwgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5zdHJpZGU8L2NvZGU+IHt0aW1lc30gKDxjb2RlPm1heERyYXdDb3VudDwvY29kZT4gLSAxKSAmIzQzOyA8Y29kZT5vZmZzZXQ8L2NvZGU+ICYjNDM7IDxjb2RlPnNpemVvZjwvY29kZT4oPGNvZGU+VmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlY8L2NvZGU+KSk8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5idWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY291bnRCdWZmZXItMDIxOTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY291bnQgc3RvcmVkIGluIDxjb2RlPmNvdW50QnVmZmVyPC9jb2RlPiBpcyBlcXVhbCB0byA8Y29kZT4xPC9jb2RlPiwgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5vZmZzZXQ8L2NvZGU+ICYjNDM7IDxjb2RlPnNpemVvZjwvY29kZT4oPGNvZGU+VmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlY8L2NvZGU+KSk8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5idWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY291bnRCdWZmZXItMDIxOTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgY291bnQgc3RvcmVkIGluIDxjb2RlPmNvdW50QnVmZmVyPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+MTwvY29kZT4sIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+c3RyaWRlPC9jb2RlPiB7dGltZXN9ICg8Y29kZT5kcmF3Q291bnQ8L2NvZGU+IC0gMSkgJiM0MzsgPGNvZGU+b2Zmc2V0PC9jb2RlPiAmIzQzOyA8Y29kZT5zaXplb2Y8L2NvZGU+KDxjb2RlPlZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WPC9jb2RlPikpPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgPGNvZGU+YnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtYnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvdW50QnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4sIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+Y291bnRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2OTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY5MyIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gb2YgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSsoVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1maWx0ZXJDdWJpYy0wMjY5NCIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiB3aXRoIGEgcmVkdWN0aW9uIG1vZGUgb2YgZWl0aGVyIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVDwvY29kZT4gb3IgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nIHRvZ2V0aGVyIHdpdGggbWlubWF4IGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpY01pbm1heDwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikrKFZLX05WX2Nvcm5lcl9zYW1wbGVkX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWZsYWdzLTAyNjk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlY8L2NvZGU+IHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIDxhIGhyZWY9XCIjVmtTYW1wbGVyQWRkcmVzc01vZGVcIj5Wa1NhbXBsZXJBZGRyZXNzTW9kZTwvYT4gb2YgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9tZXNoX3NoYWRlcikrKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1hbmRCdWZmZXItMDI3MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci0wMjcxMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfbXVsdGl2aWV3KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgZHJhdyBpcyByZWNvcmRlZCBpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIHdpdGggbXVsdGl2aWV3IGVuYWJsZWQsIHRoZSBtYXhpbXVtIGluc3RhbmNlIGluZGV4IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzXCI+VmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM8L2E+Ojo8Y29kZT5tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4PC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSsoVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGggPGEgaHJlZj1cIiNWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVDwvYT46Ojxjb2RlPnNhbXBsZUxvY2F0aW9uc0VuYWJsZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX1RSVUU8L2NvZGU+IGFuZCB0aGUgY3VycmVudCBzdWJwYXNzIGhhcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCwgdGhlbiB0aGF0IGF0dGFjaG1lbnQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby12ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudC0wMDYxMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFZlcnRleElucHV0QmluZGluZ3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tdmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudC0wMDYxNCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLWJpbmRpbmctMDA2MTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZXZlcnkgPGNvZGU+YmluZGluZzwvY29kZT4gc3BlY2lmaWVkIGJ5IGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zPC9jb2RlPiwgYSA8Y29kZT5Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBleGlzdCBpbiA8Y29kZT5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uczwvY29kZT4gd2l0aCB0aGUgc2FtZSB2YWx1ZSBvZiA8Y29kZT5iaW5kaW5nPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLTAwNjE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBkZXNjcmliZSBkaXN0aW5jdCBiaW5kaW5nIG51bWJlcnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLTAwNjE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGRlc2NyaWJlIGRpc3RpbmN0IGF0dHJpYnV0ZSBsb2NhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvblwiPlZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb248L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uXCI+VmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLWJpbmRpbmctMDA2MTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5iaW5kaW5nPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFZlcnRleElucHV0QmluZGluZ3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLXN0cmlkZS0wMDYxOSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0cmlkZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGU8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLWlucHV0UmF0ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbnB1dFJhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1ZlcnRleElucHV0UmF0ZVwiPlZrVmVydGV4SW5wdXRSYXRlPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tbG9jYXRpb24tMDA2MjAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5sb2NhdGlvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tYmluZGluZy0wMDYyMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJpbmRpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VmVydGV4SW5wdXRCaW5kaW5nczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbi1vZmZzZXQtMDA2MjIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tZm9ybWF0LTAwNjIzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbGxvd2VkIGFzIGEgdmVydGV4IGJ1ZmZlciBmb3JtYXQsIGFzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfVkVSVEVYX0JVRkZFUl9CSVQ8L2NvZGU+IGZsYWcgaW4gPGNvZGU+VmtGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPjo6PGNvZGU+YnVmZmVyRmVhdHVyZXM8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uLWZvcm1hdC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1maXJzdEJpbmRpbmctMDA2MjQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5maXJzdEJpbmRpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VmVydGV4SW5wdXRCaW5kaW5nczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtZmlyc3RCaW5kaW5nLTAwNjI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1bSBvZiA8Y29kZT5maXJzdEJpbmRpbmc8L2NvZGU+IGFuZCA8Y29kZT5iaW5kaW5nQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VmVydGV4SW5wdXRCaW5kaW5nczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcE9mZnNldHMtMDA2MjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgPGNvZGU+cE9mZnNldHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGluIDxjb2RlPnBCdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1wQnVmZmVycy0wMDYyNyIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBlbGVtZW50cyBvZiA8Y29kZT5wQnVmZmVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfQlVGRkVSX1VTQUdFX1ZFUlRFWF9CVUZGRVJfQklUPC9jb2RlPiBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLXBCdWZmZXJzLTAwNjI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBCdWZmZXJzPC9jb2RlPiB0aGF0IGlzIG5vbi1zcGFyc2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIDxjb2RlPlZrRGV2aWNlTWVtb3J5PC9jb2RlPiBvYmplY3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcEJ1ZmZlcnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5iaW5kaW5nQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1wT2Zmc2V0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wT2Zmc2V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4gPGNvZGU+VmtEZXZpY2VTaXplPC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtYmluZGluZ0NvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YmluZGluZ0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQnVmZmVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF92ZXJ0ZXhfYXR0cmlidXRlX2Rpdmlzb3IpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9ESVZJU09SX1NUQVRFX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQtcFZlcnRleEJpbmRpbmdEaXZpc29ycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVmVydGV4QmluZGluZ0Rpdmlzb3JzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVFwiPlZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhULXZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT52ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVCI6IHsKKyAgICAgICIoVktfRVhUX3ZlcnRleF9hdHRyaWJ1dGVfZGl2aXNvcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhULWJpbmRpbmctMDE4NjkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5iaW5kaW5nPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFZlcnRleElucHV0QmluZGluZ3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC12ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvci0wMjIyOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvcjwvY29kZT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZGl2aXNvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC12ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yLTAyMjI5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3I8L2NvZGU+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmRpdmlzb3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC1kaXZpc29yLTAxODcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGl2aXNvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDxjb2RlPjA8L2NvZGU+IGFuZCA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhWZXJ0ZXhBdHRyaWJEaXZpc29yPC9jb2RlPiwgaW5jbHVzaXZlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtaW5wdXRSYXRlLTAxODcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGEgaHJlZj1cIiNWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uXCI+VmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbjwvYT46Ojxjb2RlPmlucHV0UmF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgb2YgdHlwZSA8Y29kZT5WS19WRVJURVhfSU5QVVRfUkFURV9JTlNUQU5DRTwvY29kZT4gZm9yIHRoaXMgPGNvZGU+YmluZGluZzwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvLXBhdGNoQ29udHJvbFBvaW50cy0wMTIxNCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBhdGNoQ29udHJvbFBvaW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mb1wiPlZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm88L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fU1RBVEVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvLWRvbWFpbk9yaWdpbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kb21haW5PcmlnaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1Rlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblwiPlZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC10cmFuc2Zvcm1GZWVkYmFjay0wMjM1NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUPC9jb2RlPjo6PGNvZGU+dHJhbnNmb3JtRmVlZGJhY2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1maXJzdEJpbmRpbmctMDIzNTYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5maXJzdEJpbmRpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULWZpcnN0QmluZGluZy0wMjM1NyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdW0gb2YgPGNvZGU+Zmlyc3RCaW5kaW5nPC9jb2RlPiBhbmQgPGNvZGU+YmluZGluZ0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wT2Zmc2V0cy0wMjM1OCIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBlbGVtZW50cyBvZiA8Y29kZT5wT2Zmc2V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gPGNvZGU+cEJ1ZmZlcnM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtcE9mZnNldHMtMDIzNTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgPGNvZGU+cE9mZnNldHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgNCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBCdWZmZXJzLTAyMzYwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSVRfRVhUPC9jb2RlPiBmbGFnIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtcFNpemUtMDIzNjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgb3B0aW9uYWwgPGNvZGU+cFNpemU8L2NvZGU+IGFycmF5IGlzIHNwZWNpZmllZCwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBTaXplczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWl0aGVyIGJlIDxjb2RlPlZLX1dIT0xFX1NJWkU8L2NvZGU+LCBvciBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyU2l6ZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wU2l6ZXMtMDIzNjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgPGNvZGU+cFNpemVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYnVmZmVyIGluIDxjb2RlPnBCdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBPZmZzZXRzLTAyMzYzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGVsZW1lbnRzIG9mIDxjb2RlPnBPZmZzZXRzPC9jb2RlPiBwbHVzIDxjb2RlPnBTaXplczwvY29kZT4sIHdoZXJlIHRoZSA8Y29kZT5wU2l6ZXM8L2NvZGU+LCBlbGVtZW50IGlzIG5vdCA8Y29kZT5WS19XSE9MRV9TSVpFPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gPGNvZGU+cEJ1ZmZlcnM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtcEJ1ZmZlcnMtMDIzNjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEJ1ZmZlcnM8L2NvZGU+IHRoYXQgaXMgbm9uLXNwYXJzZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULU5vbmUtMDIzNjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUcmFuc2Zvcm0gZmVlZGJhY2sgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFjdGl2ZSB3aGVuIHRoZSA8Y29kZT52a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQ8L2NvZGU+IGNvbW1hbmQgaXMgcmVjb3JkZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBCdWZmZXJzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBCdWZmZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YmluZGluZ0NvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wT2Zmc2V0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wT2Zmc2V0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4gPGNvZGU+VmtEZXZpY2VTaXplPC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wU2l6ZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFNpemVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBTaXplczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4gPGNvZGU+VmtEZXZpY2VTaXplPC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtYmluZGluZ0NvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFNpemVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPmJpbmRpbmdDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQnVmZmVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC10cmFuc2Zvcm1GZWVkYmFjay0wMjM2NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUPC9jb2RlPjo6PGNvZGU+dHJhbnNmb3JtRmVlZGJhY2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1Ob25lLTAyMzY3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVHJhbnNmb3JtIGZlZWRiYWNrIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhY3RpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1maXJzdENvdW50ZXJCdWZmZXItMDIzNjgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5maXJzdENvdW50ZXJCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULWZpcnN0Q291bnRlckJ1ZmZlci0wMjM2OSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdW0gb2YgPGNvZGU+Zmlyc3RDb3VudGVyQnVmZmVyPC9jb2RlPiBhbmQgPGNvZGU+Y291bnRlckJ1ZmZlckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb3VudGVyQnVmZmVyQ291bnQtMDI2MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb3VudGVyQnVmZmVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBDb3VudGVyQnVmZmVyczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQ291bnRlckJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb3VudGVyQnVmZmVyQ291bnQ8L2NvZGU+IDxjb2RlPlZrQnVmZmVyPC9jb2RlPiBoYW5kbGVzIHRoYXQgYXJlIGVpdGhlciB2YWxpZCBvciA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtcENvdW50ZXJCdWZmZXJPZmZzZXRzLTAyMzcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggYnVmZmVyIGhhbmRsZSBpbiB0aGUgYXJyYXksIGlmIGl0IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHJlZmVyZW5jZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCA0IGJ5dGVzIGF0IHRoZSBjb3JyZXNwb25kaW5nIG9mZnNldCBmcm9tIHRoZSA8Y29kZT5wQ291bnRlckJ1ZmZlck9mZnNldHM8L2NvZGU+IGFycmF5IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtcENvdW50ZXJCdWZmZXItMDIzNzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQ291bnRlckJ1ZmZlcjwvY29kZT4gaXMgPGNvZGU+TlVMTDwvY29kZT4sIHRoZW4gPGNvZGU+cENvdW50ZXJCdWZmZXJPZmZzZXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtcENvdW50ZXJCdWZmZXJzLTAyMzcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggYnVmZmVyIGhhbmRsZSBpbiB0aGUgPGNvZGU+cENvdW50ZXJCdWZmZXJzPC9jb2RlPiBhcnJheSB0aGF0IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgY29udGFpbmluZyA8Y29kZT5WS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfQlVGRkVSX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlck9mZnNldHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y291bnRlckJ1ZmZlckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wQ291bnRlckJ1ZmZlck9mZnNldHM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cENvdW50ZXJCdWZmZXJPZmZzZXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+Y291bnRlckJ1ZmZlckNvdW50PC9jb2RlPiA8Y29kZT5Wa0RldmljZVNpemU8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQ291bnRlckJ1ZmZlcnM8L2NvZGU+IHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1Ob25lLTAyMzczIiwKKyAgICAgICAgICAidGV4dCI6ICIgVHJhbnNmb3JtIGZlZWRiYWNrIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBtYWRlIGFjdGl2ZSBpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIHdpdGggbXVsdGl2aWV3IGVuYWJsZWQiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUIjogeworICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC10cmFuc2Zvcm1GZWVkYmFjay0wMjM3NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUPC9jb2RlPjo6PGNvZGU+dHJhbnNmb3JtRmVlZGJhY2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtTm9uZS0wMjM3NSIsCisgICAgICAgICAgInRleHQiOiAiIFRyYW5zZm9ybSBmZWVkYmFjayA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhY3RpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtZmlyc3RDb3VudGVyQnVmZmVyLTAyMzc2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zmlyc3RDb3VudGVyQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyczwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtZmlyc3RDb3VudGVyQnVmZmVyLTAyMzc3IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1bSBvZiA8Y29kZT5maXJzdENvdW50ZXJCdWZmZXI8L2NvZGU+IGFuZCA8Y29kZT5jb3VudGVyQnVmZmVyQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1jb3VudGVyQnVmZmVyQ291bnQtMDI2MDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb3VudGVyQnVmZmVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBDb3VudGVyQnVmZmVyczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQ291bnRlckJ1ZmZlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb3VudGVyQnVmZmVyQ291bnQ8L2NvZGU+IDxjb2RlPlZrQnVmZmVyPC9jb2RlPiBoYW5kbGVzIHRoYXQgYXJlIGVpdGhlciB2YWxpZCBvciA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULXBDb3VudGVyQnVmZmVyT2Zmc2V0cy0wMjM3OCIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIGJ1ZmZlciBoYW5kbGUgaW4gdGhlIGFycmF5LCBpZiBpdCBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiByZWZlcmVuY2UgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgNCBieXRlcyBhdCB0aGUgY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSB0aGUgPGNvZGU+cENvdW50ZXJCdWZmZXJPZmZzZXRzPC9jb2RlPiBhcnJheSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlci0wMjM3OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBDb3VudGVyQnVmZmVyPC9jb2RlPiBpcyA8Y29kZT5OVUxMPC9jb2RlPiwgdGhlbiA8Y29kZT5wQ291bnRlckJ1ZmZlck9mZnNldHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtcENvdW50ZXJCdWZmZXJzLTAyMzgwIiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggYnVmZmVyIGhhbmRsZSBpbiB0aGUgPGNvZGU+cENvdW50ZXJCdWZmZXJzPC9jb2RlPiBhcnJheSB0aGF0IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSA8Y29kZT51c2FnZTwvY29kZT4gdmFsdWUgY29udGFpbmluZyA8Y29kZT5WS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfQlVGRkVSX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULXBDb3VudGVyQnVmZmVyT2Zmc2V0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb3VudGVyQnVmZmVyQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBDb3VudGVyQnVmZmVyT2Zmc2V0czwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQ291bnRlckJ1ZmZlck9mZnNldHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jb3VudGVyQnVmZmVyQ291bnQ8L2NvZGU+IDxjb2RlPlZrRGV2aWNlU2l6ZTwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wQ291bnRlckJ1ZmZlcnM8L2NvZGU+IHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WIjogeworICAgICAgIihWS19OVl92aWV3cG9ydF9zd2l6emxlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLXZpZXdwb3J0Q291bnQtMDEyMTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGUgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gc2V0IGluIDxjb2RlPlZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TV0laWkxFX1NUQVRFX0NSRUFURV9JTkZPX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYtcFZpZXdwb3J0U3dpenpsZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFZpZXdwb3J0U3dpenpsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrVmlld3BvcnRTd2l6emxlTlZcIj5Wa1ZpZXdwb3J0U3dpenpsZU5WPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYtdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnZpZXdwb3J0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrVmlld3BvcnRTd2l6emxlTlYiOiB7CisgICAgICAiKFZLX05WX3ZpZXdwb3J0X3N3aXp6bGUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpZXdwb3J0U3dpenpsZU5WLXgtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+eDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WXCI+VmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpZXdwb3J0U3dpenpsZU5WLXktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+eTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WXCI+VmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpZXdwb3J0U3dpenpsZU5WLXotcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ejwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WXCI+VmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpZXdwb3J0U3dpenpsZU5WLXctcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WXCI+VmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViI6IHsKKyAgICAgICIoVktfTlZfY2xpcF9zcGFjZV93X3NjYWxpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1dfU0NBTElOR19TVEFURV9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYtdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnZpZXdwb3J0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WIjogeworICAgICAgIihWS19OVl9jbGlwX3NwYWNlX3dfc2NhbGluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLU5vbmUtMDEzMjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9XX1NDQUxJTkdfTlY8L2NvZGU+IGR5bmFtaWMgc3RhdGUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtZmlyc3RWaWV3cG9ydC0wMTMyMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZpcnN0Vmlld3BvcnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VMaW1pdHNcIj5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9hPjo6PGNvZGU+bWF4Vmlld3BvcnRzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtZmlyc3RWaWV3cG9ydC0wMTMyNCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdW0gb2YgPGNvZGU+Zmlyc3RWaWV3cG9ydDwvY29kZT4gYW5kIDxjb2RlPnZpZXdwb3J0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MTwvY29kZT4gYW5kIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUxpbWl0c1wiPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2E+Ojo8Y29kZT5tYXhWaWV3cG9ydHM8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1wVmlld3BvcnRXU2NhbGluZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFZpZXdwb3J0V1NjYWxpbmdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1ZpZXdwb3J0V1NjYWxpbmdOVlwiPlZrVmlld3BvcnRXU2NhbGluZ05WPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLXZpZXdwb3J0Q291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tdWx0aVZpZXdwb3J0XCI+bXVsdGlwbGUgdmlld3BvcnRzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLW11bHRpVmlld3BvcnRcIj5tdWx0aXBsZSB2aWV3cG9ydHM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPnNjaXNzb3JDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LTAxMjE4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4xPC9jb2RlPiBhbmQgPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFZpZXdwb3J0czwvY29kZT4sIGluY2x1c2l2ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxOSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNjaXNzb3JDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4xPC9jb2RlPiBhbmQgPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFZpZXdwb3J0czwvY29kZT4sIGluY2x1c2l2ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIyMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNjaXNzb3JDb3VudDwvY29kZT4gYW5kIDxjb2RlPnZpZXdwb3J0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGlkZW50aWNhbCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXgtMDI4MjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+eDwvY29kZT4gYW5kIDxjb2RlPnk8L2NvZGU+IG1lbWJlcnMgb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFNjaXNzb3JzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1vZmZzZXQtMDI4MjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBFdmFsdWF0aW9uIG9mIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+b2Zmc2V0Lng8L2NvZGU+ICYjNDM7IDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY2F1c2UgYSBzaWduZWQgaW50ZWdlciBhZGRpdGlvbiBvdmVyZmxvdyBmb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFNjaXNzb3JzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLW9mZnNldC0wMjgyMyIsCisgICAgICAgICAgInRleHQiOiAiIEV2YWx1YXRpb24gb2YgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5vZmZzZXQueTwvY29kZT4gJiM0MzsgPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY2F1c2UgYSBzaWduZWQgaW50ZWdlciBhZGRpdGlvbiBvdmVyZmxvdyBmb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFNjaXNzb3JzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WXCI+VmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVjwvYT4sIDxhIGhyZWY9XCIjVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WXCI+VmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WPC9hPiwgPGEgaHJlZj1cIiNWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlZcIj5Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlY8L2E+LCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVlwiPlZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVjwvYT4sIG9yIDxhIGhyZWY9XCIjVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVlwiPlZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2Npc3NvckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX2NsaXBfc3BhY2Vfd19zY2FsaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0V1NjYWxpbmdFbmFibGUtMDE3MjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+dmlld3BvcnRXU2NhbGluZ0VuYWJsZTwvY29kZT4gbWVtYmVyIG9mIGEgPGEgaHJlZj1cIiNWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WXCI+VmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVjwvYT4gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIHRoZSA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVlwiPlZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY8L2E+IHN0cnVjdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0Vmlld3BvcnQiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1Ob25lLTAxMjIxIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQ8L2NvZGU+IGR5bmFtaWMgc3RhdGUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1maXJzdFZpZXdwb3J0LTAxMjIyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zmlyc3RWaWV3cG9ydDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWaWV3cG9ydHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFZpZXdwb3J0LWZpcnN0Vmlld3BvcnQtMDEyMjMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPmZpcnN0Vmlld3BvcnQ8L2NvZGU+IGFuZCA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBiZXR3ZWVuIDxjb2RlPjE8L2NvZGU+IGFuZCA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Vmlld3BvcnRzPC9jb2RlPiwgaW5jbHVzaXZlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFZpZXdwb3J0LWZpcnN0Vmlld3BvcnQtMDEyMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tdWx0aVZpZXdwb3J0XCI+bXVsdGlwbGUgdmlld3BvcnRzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5maXJzdFZpZXdwb3J0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC12aWV3cG9ydENvdW50LTAxMjI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbXVsdGlWaWV3cG9ydFwiPm11bHRpcGxlIHZpZXdwb3J0czwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtcFZpZXdwb3J0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVmlld3BvcnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1ZpZXdwb3J0XCI+VmtWaWV3cG9ydDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtWaWV3cG9ydCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+d2lkdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wLjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+d2lkdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Vmlld3BvcnREaW1lbnNpb25zPC9jb2RlPlswXSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWaWV3cG9ydC1oZWlnaHQtMDE3NzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgPGNvZGU+aGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFZpZXdwb3J0RGltZW5zaW9uczwvY29kZT5bMV0iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmlld3BvcnQteC0wMTc3NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPng8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT52aWV3cG9ydEJvdW5kc1JhbmdlPC9jb2RlPlswXSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWaWV3cG9ydC14LTAxMjMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT54PC9jb2RlPiAmIzQzOyA8Y29kZT53aWR0aDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+dmlld3BvcnRCb3VuZHNSYW5nZTwvY29kZT5bMV0iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmlld3BvcnQteS0wMTc3NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT52aWV3cG9ydEJvdW5kc1JhbmdlPC9jb2RlPlswXSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWaWV3cG9ydC15LTAxMjMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT55PC9jb2RlPiAmIzQzOyA8Y29kZT5oZWlnaHQ8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPnZpZXdwb3J0Qm91bmRzUmFuZ2U8L2NvZGU+WzFdIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMSxWS19BTURfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWaWV3cG9ydC1oZWlnaHQtMDE3NzIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wLjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfbWFpbnRlbmFuY2UxLFZLX0FNRF9uZWdhdGl2ZV92aWV3cG9ydF9oZWlnaHQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpZXdwb3J0LXktMDE3NzYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT55PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+dmlld3BvcnRCb3VuZHNSYW5nZTwvY29kZT5bMV0iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmlld3BvcnQteS0wMTc3NyIsCisgICAgICAgICAgInRleHQiOiAiIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+eTwvY29kZT4gJiM0MzsgPGNvZGU+aGVpZ2h0PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA8Y29kZT52aWV3cG9ydEJvdW5kc1JhbmdlPC9jb2RlPlswXSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmlld3BvcnQtbWluRGVwdGgtMDEyMzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBVbmxlc3MgPGNvZGU+PGEgaHJlZj1cIiNWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkXCI+VktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZDwvYT48L2NvZGU+IGV4dGVuc2lvbiBpcyBlbmFibGVkIDxjb2RlPm1pbkRlcHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBiZXR3ZWVuIDxjb2RlPjAuMDwvY29kZT4gYW5kIDxjb2RlPjEuMDwvY29kZT4sIGluY2x1c2l2ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWaWV3cG9ydC1tYXhEZXB0aC0wMTIzNSIsCisgICAgICAgICAgInRleHQiOiAiIFVubGVzcyA8Y29kZT48YSBocmVmPVwiI1ZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWRcIj5WS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkPC9hPjwvY29kZT4gZXh0ZW5zaW9uIGlzIGVuYWJsZWQgPGNvZGU+bWF4RGVwdGg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MC4wPC9jb2RlPiBhbmQgPGNvZGU+MS4wPC9jb2RlPiwgaW5jbHVzaXZlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIiEoVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmlld3BvcnQtbWluRGVwdGgtMDI1NDAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5taW5EZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4wLjA8L2NvZGU+IGFuZCA8Y29kZT4xLjA8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmlld3BvcnQtbWF4RGVwdGgtMDI1NDEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tYXhEZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4wLjA8L2NvZGU+IGFuZCA8Y29kZT4xLjA8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1kZXB0aENsYW1wRW5hYmxlLTAwNzgyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZGVwdGhDbGFtcFwiPmRlcHRoIGNsYW1waW5nPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kZXB0aENsYW1wRW5hYmxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GQUxTRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUXCI+VmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EXCI+VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRDwvYT4sIG9yIDxhIGhyZWY9XCIjVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFRcIj5Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBvbHlnb25Nb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQb2x5Z29uTW9kZVwiPlZrUG9seWdvbk1vZGU8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1jdWxsTW9kZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jdWxsTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrQ3VsbE1vZGVGbGFnQml0c1wiPlZrQ3VsbE1vZGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1mcm9udEZhY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZnJvbnRGYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGcm9udEZhY2VcIj5Wa0Zyb250RmFjZTwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiIShWS19OVl9maWxsX3JlY3RhbmdsZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLTAxNDEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZmlsbE1vZGVOb25Tb2xpZFwiPm5vbi1zb2xpZCBmaWxsIG1vZGVzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5wb2x5Z29uTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfUE9MWUdPTl9NT0RFX0ZJTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9maWxsX3JlY3RhbmdsZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLTAxNTA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZmlsbE1vZGVOb25Tb2xpZFwiPm5vbi1zb2xpZCBmaWxsIG1vZGVzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5wb2x5Z29uTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfUE9MWUdPTl9NT0RFX0ZJTEw8L2NvZGU+IG9yIDxjb2RlPlZLX1BPTFlHT05fTU9ERV9GSUxMX1JFQ1RBTkdMRV9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLTAxNDE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPjxhIGhyZWY9XCIjVktfTlZfZmlsbF9yZWN0YW5nbGVcIj5WS19OVl9maWxsX3JlY3RhbmdsZTwvYT48L2NvZGU+IGV4dGVuc2lvbiBpcyBub3QgZW5hYmxlZCwgPGNvZGU+cG9seWdvbk1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19QT0xZR09OX01PREVfRklMTF9SRUNUQU5HTEVfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZXB0aF9jbGlwX2VuYWJsZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fREVQVEhfQ0xJUF9TVEFURV9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tc2FtcGxlU2hhZGluZ0VuYWJsZS0wMDc4NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNhbXBsZVJhdGVTaGFkaW5nXCI+c2FtcGxlIHJhdGUgc2hhZGluZzwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c2FtcGxlU2hhZGluZ0VuYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tYWxwaGFUb09uZUVuYWJsZS0wMDc4NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWFscGhhVG9PbmVcIj5hbHBoYSB0byBvbmU8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmFscGhhVG9PbmVFbmFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLW1pblNhbXBsZVNoYWRpbmctMDA3ODYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5taW5TYW1wbGVTaGFkaW5nPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgcmFuZ2UgPHNwYW4gY2xhc3M9XCJlcVwiPlswLDFdPC9zcGFuPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX01VTFRJU0FNUExFX1NUQVRFX0NSRUFURV9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlZcIj5Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlY8L2E+LCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WXCI+VmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlY8L2E+LCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVlwiPlZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVjwvYT4sIG9yIDxhIGhyZWY9XCIjVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1yYXN0ZXJpemF0aW9uU2FtcGxlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yYXN0ZXJpemF0aW9uU2FtcGxlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlQ291bnRGbGFnQml0c1wiPlZrU2FtcGxlQ291bnRGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1wU2FtcGxlTWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wU2FtcGxlTWFzazwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wU2FtcGxlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFxcKFxcbGNlaWx7XFxtYXRoaXR7cmFzdGVyaXphdGlvblNhbXBsZXN9IFxcb3ZlciAzMn1cXHJjZWlsXFwpIDxjb2RlPlZrU2FtcGxlTWFzazwvY29kZT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXJhc3Rlcml6YXRpb25TYW1wbGVzLTAxNDE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZLX05WX2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXM8L2NvZGU+IGV4dGVuc2lvbiBpcyBlbmFibGVkLCBhbmQgaWYgdGhlIHN1YnBhc3MgaGFzIGFueSBjb2xvciBhdHRhY2htZW50cyBhbmQgPGNvZGU+cmFzdGVyaXphdGlvblNhbXBsZXM8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbG9yIHNhbXBsZXMsIHRoZW4gPGNvZGU+c2FtcGxlU2hhZGluZ0VuYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVC1nZW9tZXRyeVN0cmVhbXMtMDIzMjQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVDwvY29kZT46Ojxjb2RlPmdlb21ldHJ5U3RyZWFtczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQtcmFzdGVyaXphdGlvblN0cmVhbS0wMjMyNSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJhc3Rlcml6YXRpb25TdHJlYW08L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+bWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQtcmFzdGVyaXphdGlvblN0cmVhbS0wMjMyNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJhc3Rlcml6YXRpb25TdHJlYW08L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHplcm8gaWYgPGNvZGU+VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPnRyYW5zZm9ybUZlZWRiYWNrUmFzdGVyaXphdGlvblN0cmVhbVNlbGVjdDwvY29kZT4gaXMgPGNvZGU+VktfRkFMU0U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1NUUkVBTV9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQiOiB7CisgICAgICAiKFZLX0FNRF9yYXN0ZXJpemF0aW9uX29yZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1JBU1RFUklaQVRJT05fT1JERVJfQU1EPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRC1yYXN0ZXJpemF0aW9uT3JkZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cmFzdGVyaXphdGlvbk9yZGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtSYXN0ZXJpemF0aW9uT3JkZXJBTURcIj5Wa1Jhc3Rlcml6YXRpb25PcmRlckFNRDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfc2FtcGxlX2xvY2F0aW9ucykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0FNUExFX0xPQ0FUSU9OU19TVEFURV9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhULXNhbXBsZUxvY2F0aW9uc0luZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2FtcGxlTG9jYXRpb25zSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVFwiPlZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfc2FtcGxlX2xvY2F0aW9ucykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbC0wMTUyNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZUxvY2F0aW9uc1BlclBpeGVsPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIGJpdCB2YWx1ZSB0aGF0IGlzIHNldCBpbiA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ8L2E+Ojo8Y29kZT5zYW1wbGVMb2NhdGlvblNhbXBsZUNvdW50czwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1zYW1wbGVMb2NhdGlvbnNDb3VudC0wMTUyNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZUxvY2F0aW9uc0NvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCA8c3BhbiBjbGFzcz1cImVxXCI+PGNvZGU+c2FtcGxlTG9jYXRpb25zUGVyUGl4ZWw8L2NvZGU+IHt0aW1lc30gPGNvZGU+c2FtcGxlTG9jYXRpb25HcmlkU2l6ZS53aWR0aDwvY29kZT4ge3RpbWVzfSA8Y29kZT5zYW1wbGVMb2NhdGlvbkdyaWRTaXplLmhlaWdodDwvY29kZT48L3NwYW4+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlQ291bnRGbGFnQml0c1wiPlZrU2FtcGxlQ291bnRGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1wU2FtcGxlTG9jYXRpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNhbXBsZUxvY2F0aW9uc0NvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBTYW1wbGVMb2NhdGlvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zYW1wbGVMb2NhdGlvbnNDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1NhbXBsZUxvY2F0aW9uRVhUXCI+VmtTYW1wbGVMb2NhdGlvbkVYVDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUIjogeworICAgICAgIihWS19FWFRfc2FtcGxlX2xvY2F0aW9ucykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhULU5vbmUtMDE1MjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVDwvY29kZT4gZHluYW1pYyBzdGF0ZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbC0wMTUyOSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbDwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBTYW1wbGVMb2NhdGlvbnNJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCB0aGUgPGNvZGU+cmFzdGVyaXphdGlvblNhbXBsZXM8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGEgaHJlZj1cIiNWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm9cIj5Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm88L2E+IHN0cnVjdHVyZSB0aGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC12YXJpYWJsZVNhbXBsZUxvY2F0aW9ucy0wMTUzMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFRcIj5Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVDwvYT46Ojxjb2RlPnZhcmlhYmxlU2FtcGxlTG9jYXRpb25zPC9jb2RlPiBpcyA8Y29kZT5WS19GQUxTRTwvY29kZT4gdGhlbiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYmVndW4gYnkgc3BlY2lmeWluZyBhIDxhIGhyZWY9XCIjVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUXCI+VmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUPC9hPiBzdHJ1Y3R1cmUgd2hvc2UgPGNvZGU+cFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zPC9jb2RlPiBtZW1iZXIgY29udGFpbnMgYW4gZWxlbWVudCB3aXRoIGEgPGNvZGU+c3VicGFzc0luZGV4PC9jb2RlPiBtYXRjaGluZyB0aGUgY3VycmVudCBzdWJwYXNzIGluZGV4IGFuZCB0aGUgPGNvZGU+c2FtcGxlTG9jYXRpb25zSW5mbzwvY29kZT4gbWVtYmVyIG9mIHRoYXQgZWxlbWVudCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGUgc2FtcGxlIGxvY2F0aW9ucyBzdGF0ZSBwb2ludGVkIHRvIGJ5IDxjb2RlPnBTYW1wbGVMb2NhdGlvbnNJbmZvPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhULXBTYW1wbGVMb2NhdGlvbnNJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTYW1wbGVMb2NhdGlvbnNJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVFwiPlZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYiOiB7CisgICAgICAiKFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi12aWV3cG9ydENvdW50LTAyMDU0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbXVsdGlWaWV3cG9ydFwiPm11bHRpcGxlIHZpZXdwb3J0czwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4gb3IgPGNvZGU+MTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi12aWV3cG9ydENvdW50LTAyMDU1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWaWV3cG9ydHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYtc2hhZGluZ1JhdGVJbWFnZUVuYWJsZS0wMjA1NiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNoYWRpbmdSYXRlSW1hZ2VFbmFibGU8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlcXVhbCB0byB0aGUgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPlZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi1wRHluYW1pY1N0YXRlcy0wMjA1NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfUEFMRVRURV9OVjwvY29kZT4sIDxjb2RlPnBTaGFkaW5nUmF0ZVBhbGV0dGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPGNvZGU+VmtTaGFkaW5nUmF0ZVBhbGV0dGVOVjwvY29kZT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9JTUFHRV9TVEFURV9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi1wU2hhZGluZ1JhdGVQYWxldHRlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52aWV3cG9ydENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wU2hhZGluZ1JhdGVQYWxldHRlczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wU2hhZGluZ1JhdGVQYWxldHRlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnZpZXdwb3J0Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVlwiPlZrU2hhZGluZ1JhdGVQYWxldHRlTlY8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYiOiB7CisgICAgICAiKFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1Ob25lLTAyMDU4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc2hhZGluZ1JhdGVJbWFnZVwiPnNoYWRpbmcgcmF0ZSBpbWFnZTwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA1OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlVmlldzwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBoYW5kbGUgb2YgdHlwZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfMkQ8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtaW1hZ2VWaWV3LTAyMDYwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIGZvcm1hdCBvZiA8Y29kZT5WS19GT1JNQVRfUjhfVUlOVDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtaW1hZ2VWaWV3LTAyMDYxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnVzYWdlPC9jb2RlPiB2YWx1ZSBpbmNsdWRpbmcgPGNvZGU+VktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1pbWFnZVZpZXctMDIwNjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5pbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2ggdGhlIGFjdHVhbCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiBvZiBlYWNoIHN1YnJlc291cmNlIGFjY2Vzc2libGUgZnJvbSA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+IGF0IHRoZSB0aW1lIHRoZSBzdWJyZXNvdXJjZSBpcyBhY2Nlc3NlZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1pbWFnZUxheW91dC0wMjA2MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlVmlldzwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmltYWdlTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfU0hBRElOR19SQVRFX09QVElNQUxfTlY8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5pbWFnZVZpZXc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1pbWFnZUxheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VMYXlvdXRcIj5Wa0ltYWdlTGF5b3V0PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+aW1hZ2VWaWV3PC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViI6IHsKKyAgICAgICIoVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLU5vbmUtMDIwNjQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zaGFkaW5nUmF0ZUltYWdlXCI+c2hhZGluZyByYXRlIGltYWdlPC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtTm9uZS0wMjA2NSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9QQUxFVFRFX05WPC9jb2RlPiBkeW5hbWljIHN0YXRlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1maXJzdFZpZXdwb3J0LTAyMDY2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zmlyc3RWaWV3cG9ydDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWaWV3cG9ydHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtZmlyc3RWaWV3cG9ydC0wMjA2NyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBzdW0gb2YgPGNvZGU+Zmlyc3RWaWV3cG9ydDwvY29kZT4gYW5kIDxjb2RlPnZpZXdwb3J0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MTwvY29kZT4gYW5kIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWaWV3cG9ydHM8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1maXJzdFZpZXdwb3J0LTAyMDY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbXVsdGlWaWV3cG9ydFwiPm11bHRpcGxlIHZpZXdwb3J0czwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+Zmlyc3RWaWV3cG9ydDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi12aWV3cG9ydENvdW50LTAyMDY5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbXVsdGlWaWV3cG9ydFwiPm11bHRpcGxlIHZpZXdwb3J0czwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLXBTaGFkaW5nUmF0ZVBhbGV0dGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTaGFkaW5nUmF0ZVBhbGV0dGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WXCI+VmtTaGFkaW5nUmF0ZVBhbGV0dGVOVjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViI6IHsKKyAgICAgICIoVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVi1zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50LTAyMDcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4xPC9jb2RlPiBhbmQgPGNvZGU+VmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlY8L2NvZGU+Ojo8Y29kZT5zaGFkaW5nUmF0ZVBhbGV0dGVTaXplPC9jb2RlPiwgaW5jbHVzaXZlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WLXBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlZcIj5Wa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlY8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVi1zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViI6IHsKKyAgICAgICIoVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVi1zYW1wbGVPcmRlclR5cGUtMDIwNzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zYW1wbGVPcmRlclR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfQ1VTVE9NX05WPC9jb2RlPiwgPGNvZGU+Y3VzdG9tU2FtcGxlck9yZGVyQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WLXBDdXN0b21TYW1wbGVPcmRlcnMtMDIyMzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYXJyYXkgPGNvZGU+cEN1c3RvbVNhbXBsZU9yZGVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gdHdvIHN0cnVjdHVyZXMgd2l0aCBtYXRjaGluZyB2YWx1ZXMgZm9yIGJvdGggdGhlIDxjb2RlPnNoYWRpbmdSYXRlPC9jb2RlPiBhbmQgPGNvZGU+c2FtcGxlQ291bnQ8L2NvZGU+IG1lbWJlcnMuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WLXNhbXBsZU9yZGVyVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zYW1wbGVPcmRlclR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WXCI+VmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOVjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtcEN1c3RvbVNhbXBsZU9yZGVycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jdXN0b21TYW1wbGVPcmRlckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBDdXN0b21TYW1wbGVPcmRlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jdXN0b21TYW1wbGVPcmRlckNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVlwiPlZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViI6IHsKKyAgICAgICIoVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNoYWRpbmdSYXRlLTAyMDczIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2hhZGluZ1JhdGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgc2hhZGluZyByYXRlIHRoYXQgZ2VuZXJhdGVzIGZyYWdtZW50cyB3aXRoIG1vcmUgdGhhbiBvbmUgcGl4ZWwuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2FtcGxlQ291bnQtMDIwNzQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zYW1wbGVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29ycmVzcG9uZCB0byBhIHNhbXBsZSBjb3VudCBlbnVtZXJhdGVkIGluIDxhIGhyZWY9XCIjVmtTYW1wbGVDb3VudEZsYWdzXCI+VmtTYW1wbGVDb3VudEZsYWdzPC9hPiB3aG9zZSBjb3JyZXNwb25kaW5nIGJpdCBpcyBzZXQgaW4gPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlTGltaXRzXCI+VmtQaHlzaWNhbERldmljZUxpbWl0czwvYT46Ojxjb2RlPmZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50czwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2FtcGxlTG9jYXRpb25Db3VudC0wMjA3NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZUxvY2F0aW9uQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG9mIDxjb2RlPnNhbXBsZUNvdW50PC9jb2RlPiwgdGhlIGZyYWdtZW50IHdpZHRoIGZvciA8Y29kZT5zaGFkaW5nUmF0ZTwvY29kZT4sIGFuZCB0aGUgZnJhZ21lbnQgaGVpZ2h0IGZvciA8Y29kZT5zaGFkaW5nUmF0ZTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2FtcGxlTG9jYXRpb25Db3VudC0wMjA3NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZUxvY2F0aW9uQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdmFsdWUgb2YgPGNvZGU+VmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlY8L2NvZGU+Ojo8Y29kZT5zaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXM8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXBTYW1wbGVMb2NhdGlvbnMtMDIwNzciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYXJyYXkgPGNvZGU+cFNhbXBsZUxvY2F0aW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiBleGFjdGx5IG9uZSBlbnRyeSBmb3IgZXZlcnkgY29tYmluYXRpb24gb2YgdmFsaWQgdmFsdWVzIGZvciA8Y29kZT5waXhlbFg8L2NvZGU+LCA8Y29kZT5waXhlbFk8L2NvZGU+LCBhbmQgPGNvZGU+c2FtcGxlPC9jb2RlPiBpbiB0aGUgc3RydWN0dXJlIDxhIGhyZWY9XCIjVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WXCI+VmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zaGFkaW5nUmF0ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zaGFkaW5nUmF0ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVlwiPlZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1wU2FtcGxlTG9jYXRpb25zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTYW1wbGVMb2NhdGlvbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zYW1wbGVMb2NhdGlvbkNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVlwiPlZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUxvY2F0aW9uQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zYW1wbGVMb2NhdGlvbkNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYiOiB7CisgICAgICAiKFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVi1waXhlbFgtMDIwNzgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXhlbFg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYWdtZW50LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WLXBpeGVsWS0wMjA3OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpeGVsWTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBoZWlnaHQgKGluIHBpeGVscykgb2YgdGhlIGZyYWdtZW50LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WLXNhbXBsZS0wMjA4MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgY292ZXJhZ2Ugc2FtcGxlcyBpbiBlYWNoIHBpeGVsIGJlbG9uZ2luZyB0byB0aGUgZnJhZ21lbnQuIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WIjogeworICAgICAgIihWS19OVl9zaGFkaW5nX3JhdGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtc2FtcGxlT3JkZXJUeXBlLTAyMDgxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2FtcGxlT3JkZXJUeXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+VktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX0NVU1RPTV9OVjwvY29kZT4sIDxjb2RlPmN1c3RvbVNhbXBsZXJPcmRlckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WLXBDdXN0b21TYW1wbGVPcmRlcnMtMDIyMzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYXJyYXkgPGNvZGU+cEN1c3RvbVNhbXBsZU9yZGVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gdHdvIHN0cnVjdHVyZXMgd2l0aCBtYXRjaGluZyB2YWx1ZXMgZm9yIGJvdGggdGhlIDxjb2RlPnNoYWRpbmdSYXRlPC9jb2RlPiBhbmQgPGNvZGU+c2FtcGxlQ291bnQ8L2NvZGU+IG1lbWJlcnMuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVi1zYW1wbGVPcmRlclR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2FtcGxlT3JkZXJUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOVlwiPlZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlY8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtcEN1c3RvbVNhbXBsZU9yZGVycy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jdXN0b21TYW1wbGVPcmRlckNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBDdXN0b21TYW1wbGVPcmRlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5jdXN0b21TYW1wbGVPcmRlckNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVlwiPlZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9saW5lX3Jhc3Rlcml6YXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bGluZVJhc3Rlcml6YXRpb25Nb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9FWFQ8L2NvZGU+LCB0aGVuIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJlY3Rhbmd1bGFyTGluZXNcIj5yZWN0YW5ndWxhckxpbmVzPC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1saW5lUmFzdGVyaXphdGlvbk1vZGUtMDI3NjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5saW5lUmFzdGVyaXphdGlvbk1vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX0JSRVNFTkhBTV9FWFQ8L2NvZGU+LCB0aGVuIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWJyZXNlbmhhbUxpbmVzXCI+YnJlc2VuaGFtTGluZXM8L2E+IGZlYXR1cmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULWxpbmVSYXN0ZXJpemF0aW9uTW9kZS0wMjc3MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmxpbmVSYXN0ZXJpemF0aW9uTW9kZTwvY29kZT4gaXMgPGNvZGU+VktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfU01PT1RIX0VYVDwvY29kZT4sIHRoZW4gdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtYnJlc2VuaGFtTGluZXNcIj5zbW9vdGhMaW5lczwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtc3RpcHBsZWRMaW5lRW5hYmxlLTAyNzcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3RpcHBsZWRMaW5lRW5hYmxlPC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgPGNvZGU+bGluZVJhc3Rlcml6YXRpb25Nb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9FWFQ8L2NvZGU+LCB0aGVuIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lc1wiPnN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lczwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtc3RpcHBsZWRMaW5lRW5hYmxlLTAyNzcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3RpcHBsZWRMaW5lRW5hYmxlPC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgPGNvZGU+bGluZVJhc3Rlcml6YXRpb25Nb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CUkVTRU5IQU1fRVhUPC9jb2RlPiwgdGhlbiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zdGlwcGxlZEJyZXNlbmhhbUxpbmVzXCI+c3RpcHBsZWRCcmVzZW5oYW1MaW5lczwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtc3RpcHBsZWRMaW5lRW5hYmxlLTAyNzczIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3RpcHBsZWRMaW5lRW5hYmxlPC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgPGNvZGU+bGluZVJhc3Rlcml6YXRpb25Nb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9TTU9PVEhfRVhUPC9jb2RlPiwgdGhlbiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1zdGlwcGxlZFNtb290aExpbmVzXCI+c3RpcHBsZWRTbW9vdGhMaW5lczwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtc3RpcHBsZWRMaW5lRW5hYmxlLTAyNzc0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c3RpcHBsZWRMaW5lRW5hYmxlPC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiBhbmQgPGNvZGU+bGluZVJhc3Rlcml6YXRpb25Nb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVDwvY29kZT4sIHRoZW4gdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzXCI+c3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzPC9hPiBmZWF0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVuYWJsZWQgYW5kIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUxpbWl0c1wiPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2E+Ojo8Y29kZT5zdHJpY3RMaW5lczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfVFJVRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0xJTkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULWxpbmVSYXN0ZXJpemF0aW9uTW9kZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5saW5lUmFzdGVyaXphdGlvbk1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0xpbmVSYXN0ZXJpemF0aW9uTW9kZUVYVFwiPlZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0TGluZVdpZHRoIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0TGluZVdpZHRoLU5vbmUtMDA3ODciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9MSU5FX1dJRFRIPC9jb2RlPiBkeW5hbWljIHN0YXRlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0TGluZVdpZHRoLWxpbmVXaWR0aC0wMDc4OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXdpZGVMaW5lc1wiPndpZGUgbGluZXM8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmxpbmVXaWR0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MS4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0TGluZVdpZHRoLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0TGluZVN0aXBwbGVFWFQiOiB7CisgICAgICAiKFZLX0VYVF9saW5lX3Jhc3Rlcml6YXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldExpbmVTdGlwcGxlRVhULU5vbmUtMDI3NzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9MSU5FX1NUSVBQTEVfRVhUPC9jb2RlPiBkeW5hbWljIHN0YXRlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0TGluZVN0aXBwbGVFWFQtbGluZVN0aXBwbGVGYWN0b3ItMDI3NzYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5saW5lU3RpcHBsZUZhY3RvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIHJhbmdlIDxzcGFuIGNsYXNzPVwiZXFcIj5bMSwyNTZdPC9zcGFuPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRMaW5lU3RpcHBsZUVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRMaW5lU3RpcHBsZUVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0TGluZVN0aXBwbGVFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0RGVwdGhCaWFzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGVwdGhCaWFzLU5vbmUtMDA3ODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9ERVBUSF9CSUFTPC9jb2RlPiBkeW5hbWljIHN0YXRlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGVwdGhCaWFzLWRlcHRoQmlhc0NsYW1wLTAwNzkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZGVwdGhCaWFzQ2xhbXBcIj5kZXB0aCBiaWFzIGNsYW1waW5nPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5kZXB0aEJpYXNDbGFtcDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MC4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREZXB0aEJpYXMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGVwdGhCaWFzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREZXB0aEJpYXMtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVC1leHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZS0wMTc2OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgcmFuZ2Ugb2YgPGNvZGU+MC4wPC9jb2RlPiB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5tYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTwvY29kZT4gaW5jbHVzaXZlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0NPTlNFUlZBVElWRV9TVEFURV9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQtY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlRVhUXCI+VmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2Rpc2NhcmRfcmVjdGFuZ2xlcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhULWRpc2NhcmRSZWN0YW5nbGVDb3VudC0wMDU4MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRpc2NhcmRSZWN0YW5nbGVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+VmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+bWF4RGlzY2FyZFJlY3RhbmdsZXM8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RJU0NBUkRfUkVDVEFOR0xFX1NUQVRFX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVC1kaXNjYXJkUmVjdGFuZ2xlTW9kZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNjYXJkUmVjdGFuZ2xlTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzY2FyZFJlY3RhbmdsZU1vZGVFWFRcIj5Wa0Rpc2NhcmRSZWN0YW5nbGVNb2RlRVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCI6IHsKKyAgICAgICIoVktfRVhUX2Rpc2NhcmRfcmVjdGFuZ2xlcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1Ob25lLTAwNTgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0RZTkFNSUNfU1RBVEVfRElTQ0FSRF9SRUNUQU5HTEVfRVhUPC9jb2RlPiBkeW5hbWljIHN0YXRlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1maXJzdERpc2NhcmRSZWN0YW5nbGUtMDA1ODUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPmZpcnN0RGlzY2FyZFJlY3RhbmdsZTwvY29kZT4gYW5kIDxjb2RlPmRpc2NhcmRSZWN0YW5nbGVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+bWF4RGlzY2FyZFJlY3RhbmdsZXM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQteC0wMDU4NyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT54PC9jb2RlPiBhbmQgPGNvZGU+eTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPm9mZnNldDwvY29kZT4gaW4gZWFjaCA8YSBocmVmPVwiI1ZrUmVjdDJEXCI+VmtSZWN0MkQ8L2E+IGVsZW1lbnQgb2YgPGNvZGU+cERpc2NhcmRSZWN0YW5nbGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1vZmZzZXQtMDA1ODgiLAorICAgICAgICAgICJ0ZXh0IjogIiBFdmFsdWF0aW9uIG9mIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+b2Zmc2V0Lng8L2NvZGU+ICYjNDM7IDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4pPC9zcGFuPiBpbiBlYWNoIDxhIGhyZWY9XCIjVmtSZWN0MkRcIj5Wa1JlY3QyRDwvYT4gZWxlbWVudCBvZiA8Y29kZT5wRGlzY2FyZFJlY3RhbmdsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjYXVzZSBhIHNpZ25lZCBpbnRlZ2VyIGFkZGl0aW9uIG92ZXJmbG93IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQtb2Zmc2V0LTAwNTg5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRXZhbHVhdGlvbiBvZiA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPm9mZnNldC55PC9jb2RlPiAmIzQzOyA8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPik8L3NwYW4+IGluIGVhY2ggPGEgaHJlZj1cIiNWa1JlY3QyRFwiPlZrUmVjdDJEPC9hPiBlbGVtZW50IG9mIDxjb2RlPnBEaXNjYXJkUmVjdGFuZ2xlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNhdXNlIGEgc2lnbmVkIGludGVnZXIgYWRkaXRpb24gb3ZlcmZsb3ciCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULXBEaXNjYXJkUmVjdGFuZ2xlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGlzY2FyZFJlY3RhbmdsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5kaXNjYXJkUmVjdGFuZ2xlQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtSZWN0MkRcIj5Wa1JlY3QyRDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1kaXNjYXJkUmVjdGFuZ2xlQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNjYXJkUmVjdGFuZ2xlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0U2Npc3NvciI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNjaXNzb3ItTm9uZS0wMDU5MCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX1NDSVNTT1I8L2NvZGU+IGR5bmFtaWMgc3RhdGUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTY2lzc29yLWZpcnN0U2Npc3Nvci0wMDU5MSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZpcnN0U2Npc3NvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWaWV3cG9ydHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNjaXNzb3ItZmlyc3RTY2lzc29yLTAwNTkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHN1bSBvZiA8Y29kZT5maXJzdFNjaXNzb3I8L2NvZGU+IGFuZCA8Y29kZT5zY2lzc29yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MTwvY29kZT4gYW5kIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWaWV3cG9ydHM8L2NvZGU+LCBpbmNsdXNpdmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U2Npc3Nvci1maXJzdFNjaXNzb3ItMDA1OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tdWx0aVZpZXdwb3J0XCI+bXVsdGlwbGUgdmlld3BvcnRzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5maXJzdFNjaXNzb3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNjaXNzb3Itc2Npc3NvckNvdW50LTAwNTk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbXVsdGlWaWV3cG9ydFwiPm11bHRpcGxlIHZpZXdwb3J0czwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c2Npc3NvckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTY2lzc29yLXgtMDA1OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+eDwvY29kZT4gYW5kIDxjb2RlPnk8L2NvZGU+IG1lbWJlcnMgb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFNjaXNzb3JzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U2Npc3Nvci1vZmZzZXQtMDA1OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBFdmFsdWF0aW9uIG9mIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+b2Zmc2V0Lng8L2NvZGU+ICYjNDM7IDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY2F1c2UgYSBzaWduZWQgaW50ZWdlciBhZGRpdGlvbiBvdmVyZmxvdyBmb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFNjaXNzb3JzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTY2lzc29yLW9mZnNldC0wMDU5NyIsCisgICAgICAgICAgInRleHQiOiAiIEV2YWx1YXRpb24gb2YgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5vZmZzZXQueTwvY29kZT4gJiM0MzsgPGNvZGU+ZXh0ZW50LmhlaWdodDwvY29kZT4pPC9zcGFuPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY2F1c2UgYSBzaWduZWQgaW50ZWdlciBhZGRpdGlvbiBvdmVyZmxvdyBmb3IgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFNjaXNzb3JzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTY2lzc29yLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNjaXNzb3ItcFNjaXNzb3JzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTY2lzc29yczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnNjaXNzb3JDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1JlY3QyRFwiPlZrUmVjdDJEPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNjaXNzb3ItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFNjaXNzb3ItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTY2lzc29yLXNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNjaXNzb3JDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIjogeworICAgICAgIihWS19OVl9zY2lzc29yX2V4Y2x1c2l2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1leGNsdXNpdmVTY2lzc29yQ291bnQtMDIwMjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1tdWx0aVZpZXdwb3J0XCI+bXVsdGlwbGUgdmlld3BvcnRzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5leGNsdXNpdmVTY2lzc29yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IG9yIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDI4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXhjbHVzaXZlU2Npc3NvckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFZpZXdwb3J0czwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1leGNsdXNpdmVTY2lzc29yQ291bnQtMDIwMjkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5leGNsdXNpdmVTY2lzc29yQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IG9yIGlkZW50aWNhbCB0byB0aGUgPGNvZGU+dmlld3BvcnRDb3VudDwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPlZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1wRHluYW1pY1N0YXRlcy0wMjAzMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBEeW5hbWljU3RhdGVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cER5bmFtaWNTdGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9FWENMVVNJVkVfU0NJU1NPUl9OVjwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wRXhjbHVzaXZlU2Npc3NvcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5leGNsdXNpdmVTY2lzc29yQ291bnQ8L2NvZGU+IDxjb2RlPlZrUmVjdDJEPC9jb2RlPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtcEV4Y2x1c2l2ZVNjaXNzb3JzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cEV4Y2x1c2l2ZVNjaXNzb3JzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBFeGNsdXNpdmVTY2lzc29yczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1JlY3QyRFwiPlZrUmVjdDJEPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYiOiB7CisgICAgICAiKFZLX05WX3NjaXNzb3JfZXhjbHVzaXZlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtTm9uZS0wMjAzMSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWV4Y2x1c2l2ZVNjaXNzb3JcIj5leGNsdXNpdmUgc2Npc3NvcjwvYT4gZmVhdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlbmFibGVkLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtTm9uZS0wMjAzMiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX0VYQ0xVU0lWRV9TQ0lTU09SX05WPC9jb2RlPiBkeW5hbWljIHN0YXRlIGVuYWJsZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWZpcnN0RXhjbHVzaXZlU2Npc3Nvci0wMjAzMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZpcnN0RXhjbHVzaXZlU2Npc3NvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhWaWV3cG9ydHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1maXJzdEV4Y2x1c2l2ZVNjaXNzb3ItMDIwMzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPmZpcnN0RXhjbHVzaXZlU2Npc3NvcjwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmV0d2VlbiA8Y29kZT4xPC9jb2RlPiBhbmQgPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heFZpZXdwb3J0czwvY29kZT4sIGluY2x1c2l2ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZmlyc3RFeGNsdXNpdmVTY2lzc29yLTAyMDM1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbXVsdGlWaWV3cG9ydFwiPm11bHRpcGxlIHZpZXdwb3J0czwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+Zmlyc3RFeGNsdXNpdmVTY2lzc29yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDM2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtbXVsdGlWaWV3cG9ydFwiPm11bHRpcGxlIHZpZXdwb3J0czwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZXhjbHVzaXZlU2Npc3NvckNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4xPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYteC0wMjAzNyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT54PC9jb2RlPiBhbmQgPGNvZGU+eTwvY29kZT4gbWVtYmVycyBvZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGluIGVhY2ggbWVtYmVyIG9mIDxjb2RlPnBFeGNsdXNpdmVTY2lzc29yczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1vZmZzZXQtMDIwMzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBFdmFsdWF0aW9uIG9mIDxzcGFuIGNsYXNzPVwiZXFcIj4oPGNvZGU+b2Zmc2V0Lng8L2NvZGU+ICYjNDM7IDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4pPC9zcGFuPiBmb3IgZWFjaCBtZW1iZXIgb2YgPGNvZGU+cEV4Y2x1c2l2ZVNjaXNzb3JzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgY2F1c2UgYSBzaWduZWQgaW50ZWdlciBhZGRpdGlvbiBvdmVyZmxvdyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtb2Zmc2V0LTAyMDM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRXZhbHVhdGlvbiBvZiA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPm9mZnNldC55PC9jb2RlPiAmIzQzOyA8Y29kZT5leHRlbnQuaGVpZ2h0PC9jb2RlPik8L3NwYW4+IGZvciBlYWNoIG1lbWJlciBvZiA8Y29kZT5wRXhjbHVzaXZlU2Npc3NvcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBjYXVzZSBhIHNpZ25lZCBpbnRlZ2VyIGFkZGl0aW9uIG92ZXJmbG93IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtcEV4Y2x1c2l2ZVNjaXNzb3JzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBFeGNsdXNpdmVTY2lzc29yczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1JlY3QyRFwiPlZrUmVjdDJEPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWV4Y2x1c2l2ZVNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWRlcHRoQm91bmRzVGVzdEVuYWJsZS0wMDU5OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWRlcHRoQm91bmRzXCI+ZGVwdGggYm91bmRzIHRlc3Rpbmc8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmRlcHRoQm91bmRzVGVzdEVuYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWRlcHRoQ29tcGFyZU9wLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlcHRoQ29tcGFyZU9wPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21wYXJlT3BcIj5Wa0NvbXBhcmVPcDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8tZnJvbnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZnJvbnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N0ZW5jaWxPcFN0YXRlXCI+VmtTdGVuY2lsT3BTdGF0ZTwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWJhY2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YmFjazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3RlbmNpbE9wU3RhdGVcIj5Wa1N0ZW5jaWxPcFN0YXRlPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFNldERlcHRoQm91bmRzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0RGVwdGhCb3VuZHMtTm9uZS0wMDU5OSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUzwvY29kZT4gZHluYW1pYyBzdGF0ZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREZXB0aEJvdW5kcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREZXB0aEJvdW5kcy1taW5EZXB0aEJvdW5kcy0wMDYwMCIsCisgICAgICAgICAgInRleHQiOiAiIFVubGVzcyB0aGUgPGNvZGU+PGEgaHJlZj1cIiNWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkXCI+VktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZDwvYT48L2NvZGU+IGV4dGVuc2lvbiBpcyBlbmFibGVkIDxjb2RlPm1pbkRlcHRoQm91bmRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBiZXR3ZWVuIDxjb2RlPjAuMDwvY29kZT4gYW5kIDxjb2RlPjEuMDwvY29kZT4sIGluY2x1c2l2ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXREZXB0aEJvdW5kcy1tYXhEZXB0aEJvdW5kcy0wMDYwMSIsCisgICAgICAgICAgInRleHQiOiAiIFVubGVzcyB0aGUgPGNvZGU+PGEgaHJlZj1cIiNWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkXCI+VktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZDwvYT48L2NvZGU+IGV4dGVuc2lvbiBpcyBlbmFibGVkIDxjb2RlPm1heERlcHRoQm91bmRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBiZXR3ZWVuIDxjb2RlPjAuMDwvY29kZT4gYW5kIDxjb2RlPjEuMDwvY29kZT4sIGluY2x1c2l2ZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIhKFZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLW1pbkRlcHRoQm91bmRzLTAyNTA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWluRGVwdGhCb3VuZHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MC4wPC9jb2RlPiBhbmQgPGNvZGU+MS4wPC9jb2RlPiwgaW5jbHVzaXZlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLW1heERlcHRoQm91bmRzLTAyNTA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWF4RGVwdGhCb3VuZHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJldHdlZW4gPGNvZGU+MC4wPC9jb2RlPiBhbmQgPGNvZGU+MS4wPC9jb2RlPiwgaW5jbHVzaXZlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTdGVuY2lsT3BTdGF0ZSI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N0ZW5jaWxPcFN0YXRlLWZhaWxPcC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mYWlsT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N0ZW5jaWxPcFwiPlZrU3RlbmNpbE9wPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdGVuY2lsT3BTdGF0ZS1wYXNzT3AtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGFzc09wPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdGVuY2lsT3BcIj5Wa1N0ZW5jaWxPcDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3RlbmNpbE9wU3RhdGUtZGVwdGhGYWlsT3AtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGVwdGhGYWlsT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N0ZW5jaWxPcFwiPlZrU3RlbmNpbE9wPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdGVuY2lsT3BTdGF0ZS1jb21wYXJlT3AtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tcGFyZU9wPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21wYXJlT3BcIj5Wa0NvbXBhcmVPcDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzay1Ob25lLTAwNjAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIDxjb2RlPlZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9DT01QQVJFX01BU0s8L2NvZGU+IGR5bmFtaWMgc3RhdGUgZW5hYmxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLWZhY2VNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZhY2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtTdGVuY2lsRmFjZUZsYWdCaXRzXCI+VmtTdGVuY2lsRmFjZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLWZhY2VNYXNrLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZhY2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2stTm9uZS0wMDYwMyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfV1JJVEVfTUFTSzwvY29kZT4gZHluYW1pYyBzdGF0ZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2stY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzay1mYWNlTWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mYWNlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU3RlbmNpbEZhY2VGbGFnQml0c1wiPlZrU3RlbmNpbEZhY2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2stZmFjZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmFjZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLU5vbmUtMDA2MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1JFRkVSRU5DRTwvY29kZT4gZHluYW1pYyBzdGF0ZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZS1mYWNlTWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mYWNlTWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU3RlbmNpbEZhY2VGbGFnQml0c1wiPlZrU3RlbmNpbEZhY2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UtZmFjZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmFjZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViI6IHsKKyAgICAgICIoVktfTlZfcmVwcmVzZW50YXRpdmVfZnJhZ21lbnRfdGVzdCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfU1RBVEVfQ1JFQVRFX0lORk9fTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WIjogeworICAgICAgIihWS19OVl9mcmFnbWVudF9jb3ZlcmFnZV90b19jb2xvcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVi1jb3ZlcmFnZVRvQ29sb3JFbmFibGUtMDE0MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb3ZlcmFnZVRvQ29sb3JFbmFibGU8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCB0aGVuIHRoZSByZW5kZXIgcGFzcyBzdWJwYXNzIGluZGljYXRlZCBieSA8YSBocmVmPVwiI1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm9cIj5Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPC9hPjo6PGNvZGU+cmVuZGVyUGFzczwvY29kZT4gYW5kIDxhIGhyZWY9XCIjVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mb1wiPlZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5zdWJwYXNzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgY29sb3IgYXR0YWNobWVudCBhdCB0aGUgbG9jYXRpb24gc2VsZWN0ZWQgYnkgPGNvZGU+Y292ZXJhZ2VUb0NvbG9yTG9jYXRpb248L2NvZGU+LCB3aXRoIGEgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiBvZiA8Y29kZT5WS19GT1JNQVRfUjhfVUlOVDwvY29kZT4sIDxjb2RlPlZLX0ZPUk1BVF9SOF9TSU5UPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX1IxNl9VSU5UPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX1IxNl9TSU5UPC9jb2RlPiwgPGNvZGU+VktfRk9STUFUX1IzMl9VSU5UPC9jb2RlPiwgb3IgPGNvZGU+VktfRk9STUFUX1IzMl9TSU5UPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1RPX0NPTE9SX1NUQVRFX0NSRUFURV9JTkZPX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYiOiB7CisgICAgICAiKFZLX05WX2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXMpKyhWS19OVl9jb3ZlcmFnZV9yZWR1Y3Rpb25fbW9kZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1JFRFVDVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OVi1jb3ZlcmFnZVJlZHVjdGlvbk1vZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y292ZXJhZ2VSZWR1Y3Rpb25Nb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOVlwiPlZrQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlY8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYiOiB7CisgICAgICAiKFZLX05WX2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXMpKyhWS19OVl9jb3ZlcmFnZV9yZWR1Y3Rpb25fbW9kZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYtcENvbWJpbmF0aW9uQ291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENvbWJpbmF0aW9uQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYtcENvbWJpbmF0aW9ucy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wQ29tYmluYXRpb25Db3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cENvbWJpbmF0aW9uczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQ29tYmluYXRpb25zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cENvbWJpbmF0aW9uQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlZcIj5Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WIjogeworICAgICAgIihWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzKSsoVktfTlZfY292ZXJhZ2VfcmVkdWN0aW9uX21vZGUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYiOiB7CisgICAgICAiKFZLX05WX2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYtY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGUtMDE0MDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIDxjb2RlPmNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcmFzdGVyaXphdGlvbiBzYW1wbGVzIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBjb2xvciBzYW1wbGVzIGluIHRoZSBzdWJwYXNzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfTU9EVUxBVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVi1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WLWNvdmVyYWdlTW9kdWxhdGlvbk1vZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y292ZXJhZ2VNb2R1bGF0aW9uTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ292ZXJhZ2VNb2R1bGF0aW9uTW9kZU5WXCI+VmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlY8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwNjA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtaW5kZXBlbmRlbnRCbGVuZFwiPmluZGVwZW5kZW50IGJsZW5kaW5nPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbGwgZWxlbWVudHMgb2YgPGNvZGU+cEF0dGFjaG1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpZGVudGljYWwiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLWxvZ2ljT3BFbmFibGUtMDA2MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1sb2dpY09wXCI+bG9naWMgb3BlcmF0aW9uczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+bG9naWNPcEVuYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfRkFMU0U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1sb2dpY09wRW5hYmxlLTAwNjA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bG9naWNPcEVuYWJsZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIDxjb2RlPmxvZ2ljT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0xvZ2ljT3BcIj5Wa0xvZ2ljT3A8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVFwiPlZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmF0dGFjaG1lbnRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wQXR0YWNobWVudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5hdHRhY2htZW50Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGVcIj5Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZTwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLXNyY0NvbG9yQmxlbmRGYWN0b3ItMDA2MDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1kdWFsU3JjQmxlbmRcIj5kdWFsIHNvdXJjZSBibGVuZGluZzwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+c3JjQ29sb3JCbGVuZEZhY3RvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0NPTE9SPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0NPTE9SPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfRkFDVE9SX1NSQzFfQUxQSEE8L2NvZGU+LCBvciA8Y29kZT5WS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQUxQSEE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1kc3RDb2xvckJsZW5kRmFjdG9yLTAwNjA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtZHVhbFNyY0JsZW5kXCI+ZHVhbCBzb3VyY2UgYmxlbmRpbmc8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIDxjb2RlPmRzdENvbG9yQmxlbmRGYWN0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19CTEVORF9GQUNUT1JfU1JDMV9DT0xPUjwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9DT0xPUjwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0FMUEhBPC9jb2RlPiwgb3IgPGNvZGU+VktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0FMUEhBPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtc3JjQWxwaGFCbGVuZEZhY3Rvci0wMDYxMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLWR1YWxTcmNCbGVuZFwiPmR1YWwgc291cmNlIGJsZW5kaW5nPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5zcmNBbHBoYUJsZW5kRmFjdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfQkxFTkRfRkFDVE9SX1NSQzFfQ09MT1I8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQ09MT1I8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9GQUNUT1JfU1JDMV9BTFBIQTwvY29kZT4sIG9yIDxjb2RlPlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9BTFBIQTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWRzdEFscGhhQmxlbmRGYWN0b3ItMDA2MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1kdWFsU3JjQmxlbmRcIj5kdWFsIHNvdXJjZSBibGVuZGluZzwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+ZHN0QWxwaGFCbGVuZEZhY3RvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0NPTE9SPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0NPTE9SPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfRkFDVE9SX1NSQzFfQUxQSEE8L2NvZGU+LCBvciA8Y29kZT5WS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQUxQSEE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1zcmNDb2xvckJsZW5kRmFjdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY0NvbG9yQmxlbmRGYWN0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0JsZW5kRmFjdG9yXCI+VmtCbGVuZEZhY3RvcjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWRzdENvbG9yQmxlbmRGYWN0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0Q29sb3JCbGVuZEZhY3RvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQmxlbmRGYWN0b3JcIj5Wa0JsZW5kRmFjdG9yPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtY29sb3JCbGVuZE9wLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbG9yQmxlbmRPcDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQmxlbmRPcFwiPlZrQmxlbmRPcDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLXNyY0FscGhhQmxlbmRGYWN0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjQWxwaGFCbGVuZEZhY3RvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQmxlbmRGYWN0b3JcIj5Wa0JsZW5kRmFjdG9yPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtZHN0QWxwaGFCbGVuZEZhY3Rvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3RBbHBoYUJsZW5kRmFjdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCbGVuZEZhY3RvclwiPlZrQmxlbmRGYWN0b3I8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1hbHBoYUJsZW5kT3AtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YWxwaGFCbGVuZE9wPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCbGVuZE9wXCI+VmtCbGVuZE9wPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtY29sb3JXcml0ZU1hc2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29sb3JXcml0ZU1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0NvbG9yQ29tcG9uZW50RmxhZ0JpdHNcIj5Wa0NvbG9yQ29tcG9uZW50RmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfRVhUX2JsZW5kX29wZXJhdGlvbl9hZHZhbmNlZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWNvbG9yQmxlbmRPcC0wMTQwNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGVpdGhlciBvZiA8Y29kZT5jb2xvckJsZW5kT3A8L2NvZGU+IG9yIDxjb2RlPmFscGhhQmxlbmRPcDwvY29kZT4gaXMgYW4gPGEgaHJlZj1cIiNmcmFtZWJ1ZmZlci1ibGVuZC1hZHZhbmNlZFwiPmFkdmFuY2VkIGJsZW5kIG9wZXJhdGlvbjwvYT4sIHRoZW4gPGNvZGU+Y29sb3JCbGVuZE9wPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlcXVhbCA8Y29kZT5hbHBoYUJsZW5kT3A8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1hZHZhbmNlZEJsZW5kSW5kZXBlbmRlbnRCbGVuZC0wMTQwNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+YWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQ8L2NvZGU+IGlzIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiBhbmQgPGNvZGU+Y29sb3JCbGVuZE9wPC9jb2RlPiBpcyBhbiA8YSBocmVmPVwiI2ZyYW1lYnVmZmVyLWJsZW5kLWFkdmFuY2VkXCI+YWR2YW5jZWQgYmxlbmQgb3BlcmF0aW9uPC9hPiwgdGhlbiA8Y29kZT5jb2xvckJsZW5kT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHRoZSBzYW1lIGZvciBhbGwgYXR0YWNobWVudHMuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1hZHZhbmNlZEJsZW5kSW5kZXBlbmRlbnRCbGVuZC0wMTQwOCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+YWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQ8L2NvZGU+IGlzIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiBhbmQgPGNvZGU+YWxwaGFCbGVuZE9wPC9jb2RlPiBpcyBhbiA8YSBocmVmPVwiI2ZyYW1lYnVmZmVyLWJsZW5kLWFkdmFuY2VkXCI+YWR2YW5jZWQgYmxlbmQgb3BlcmF0aW9uPC9hPiwgdGhlbiA8Y29kZT5hbHBoYUJsZW5kT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHRoZSBzYW1lIGZvciBhbGwgYXR0YWNobWVudHMuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1hZHZhbmNlZEJsZW5kQWxsT3BlcmF0aW9ucy0wMTQwOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUPC9hPjo6PGNvZGU+YWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnM8L2NvZGU+IGlzIDxjb2RlPlZLX0ZBTFNFPC9jb2RlPiwgdGhlbiA8Y29kZT5jb2xvckJsZW5kT3A8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19CTEVORF9PUF9aRVJPX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX1NSQ19FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9EU1RfRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfU1JDX09WRVJfRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfRFNUX09WRVJfRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfU1JDX0lOX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX0RTVF9JTl9FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9TUkNfT1VUX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX0RTVF9PVVRfRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfU1JDX0FUT1BfRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfRFNUX0FUT1BfRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfWE9SX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX0lOVkVSVF9FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9JTlZFUlRfUkdCX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX0xJTkVBUkRPREdFX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX0xJTkVBUkJVUk5fRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfVklWSURMSUdIVF9FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9MSU5FQVJMSUdIVF9FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9QSU5MSUdIVF9FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9IQVJETUlYX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX1BMVVNfRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfUExVU19DTEFNUEVEX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX1BMVVNfQ0xBTVBFRF9BTFBIQV9FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9QTFVTX0RBUktFUl9FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9NSU5VU19FWFQ8L2NvZGU+LCA8Y29kZT5WS19CTEVORF9PUF9NSU5VU19DTEFNUEVEX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX0NPTlRSQVNUX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX0lOVkVSVF9PVkdfRVhUPC9jb2RlPiwgPGNvZGU+VktfQkxFTkRfT1BfUkVEX0VYVDwvY29kZT4sIDxjb2RlPlZLX0JMRU5EX09QX0dSRUVOX0VYVDwvY29kZT4sIG9yIDxjb2RlPlZLX0JMRU5EX09QX0JMVUVfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtY29sb3JCbGVuZE9wLTAxNDEwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29sb3JCbGVuZE9wPC9jb2RlPiBvciA8Y29kZT5hbHBoYUJsZW5kT3A8L2NvZGU+IGlzIGFuIDxhIGhyZWY9XCIjZnJhbWVidWZmZXItYmxlbmQtYWR2YW5jZWRcIj5hZHZhbmNlZCBibGVuZCBvcGVyYXRpb248L2E+LCB0aGVuIDxhIGhyZWY9XCIjVmtTdWJwYXNzRGVzY3JpcHRpb25cIj5Wa1N1YnBhc3NEZXNjcmlwdGlvbjwvYT46Ojxjb2RlPmNvbG9yQXR0YWNobWVudENvdW50PC9jb2RlPiBvZiB0aGUgc3VicGFzcyB0aGlzIHBpcGVsaW5lIGlzIGNvbXBpbGVkIGFnYWluc3QgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUPC9hPjo6YWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFNldEJsZW5kQ29uc3RhbnRzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0QmxlbmRDb25zdGFudHMtTm9uZS0wMDYxMiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19EWU5BTUlDX1NUQVRFX0JMRU5EX0NPTlNUQU5UUzwvY29kZT4gZHluYW1pYyBzdGF0ZSBlbmFibGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEJsZW5kQ29uc3RhbnRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldEJsZW5kQ29uc3RhbnRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRTZXRCbGVuZENvbnN0YW50cy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2JsZW5kX29wZXJhdGlvbl9hZHZhbmNlZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQtc3JjUHJlbXVsdGlwbGllZC0wMTQyNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2xpbWl0cy1hZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yXCI+bm9uLXByZW11bHRpcGxpZWQgc291cmNlIGNvbG9yPC9hPiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLCA8Y29kZT5zcmNQcmVtdWx0aXBsaWVkPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19UUlVFPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVC1kc3RQcmVtdWx0aXBsaWVkLTAxNDI1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjbGltaXRzLWFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3JcIj5ub24tcHJlbXVsdGlwbGllZCBkZXN0aW5hdGlvbiBjb2xvcjwvYT4gcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCwgPGNvZGU+ZHN0UHJlbXVsdGlwbGllZDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfVFJVRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQtYmxlbmRPdmVybGFwLTAxNDI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjbGltaXRzLWFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcFwiPmNvcnJlbGF0ZWQgb3ZlcmxhcDwvYT4gcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCwgPGNvZGU+YmxlbmRPdmVybGFwPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19CTEVORF9PVkVSTEFQX1VOQ09SUkVMQVRFRF9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX0FEVkFOQ0VEX1NUQVRFX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQtYmxlbmRPdmVybGFwLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJsZW5kT3ZlcmxhcDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQmxlbmRPdmVybGFwRVhUXCI+VmtCbGVuZE92ZXJsYXBFWFQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWREaXNwYXRjaCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI2OTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0xJTkVBUjwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5NyIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHNldCA8ZW0+bjwvZW0+IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYm91bmQgdG8gPGVtPm48L2VtPiBhdCB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgPGVtPm48L2VtPiwgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5OCIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+LCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy1jb21wYXRpYmlsaXR5XCI+UGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHk8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI2OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBEZXNjcmlwdG9ycyBpbiBlYWNoIGJvdW5kIGRlc2NyaXB0b3Igc2V0LCBzcGVjaWZpZWQgdmlhIDxjb2RlPnZrQ21kQmluZERlc2NyaXB0b3JTZXRzPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNzAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgQSB2YWxpZCBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLTAyNzAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCByZXF1aXJlcyBhbnkgZHluYW1pYyBzdGF0ZSwgdGhhdCBzdGF0ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc2V0IGZvciA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNzAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgPGNvZGU+VmtJbWFnZTwvY29kZT4gd2l0aCBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBvZiB0aGUgdHlwZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+LCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI3MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgd2l0aCA8Y29kZT5JbXBsaWNpdExvZDwvY29kZT4sIDxjb2RlPkRyZWY8L2NvZGU+IG9yIDxjb2RlPlByb2o8L2NvZGU+IGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjcwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjcwNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJvYnVzdEJ1ZmZlckFjY2Vzc1wiPnJvYnVzdCBidWZmZXIgYWNjZXNzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNzA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgc3RvcmFnZSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRYLTAwMzg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Z3JvdXBDb3VudFg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50PC9jb2RlPlswXSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaC1ncm91cENvdW50WS0wMDM4NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmdyb3VwQ291bnRZPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudDwvY29kZT5bMV0iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtZ3JvdXBDb3VudFotMDAzODgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5ncm91cENvdW50WjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhDb21wdXRlV29ya0dyb3VwQ291bnQ8L2NvZGU+WzJdIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI2OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IG9mIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8zRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpKyhWS19FWFRfZmlsdGVyX2N1YmljKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaC1maWx0ZXJDdWJpYy0wMjY5NCIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQ8L2NvZGU+IG9yIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSA8Y29kZT5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+ZmlsdGVyQ3ViaWNNaW5tYXg8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoLWZsYWdzLTAyNjk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlY8L2NvZGU+IHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIDxhIGhyZWY9XCIjVmtTYW1wbGVyQWRkcmVzc01vZGVcIj5Wa1NhbXBsZXJBZGRyZXNzTW9kZTwvYT4gb2YgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci0wMjcwNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBhbnkgcmVzb3VyY2UgYWNjZXNzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci0wMjcxMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBhbnkgcmVzb3VyY2Ugd3JpdHRlbiB0byBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhbiB1bnByb3RlY3RlZCByZXNvdXJjZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLTAyNzEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHBpcGVsaW5lIHN0YWdlcyBvdGhlciB0aGFuIHRoZSBmcmFtZWJ1ZmZlci1zcGFjZSBhbmQgY29tcHV0ZSBzdGFnZXMgaW4gdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgd3JpdGUgdG8gYW55IHJlc291cmNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWREaXNwYXRjaEluZGlyZWN0IjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNjkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9MSU5FQVI8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNjk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggc2V0IDxlbT5uPC9lbT4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBib3VuZCB0byA8ZW0+bjwvZW0+IGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCA8ZW0+bjwvZW0+LCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI2OTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBwdXNoIGNvbnN0YW50IHZhbHVlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI2OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBEZXNjcmlwdG9ycyBpbiBlYWNoIGJvdW5kIGRlc2NyaXB0b3Igc2V0LCBzcGVjaWZpZWQgdmlhIDxjb2RlPnZrQ21kQmluZERlc2NyaXB0b3JTZXRzPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI3MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBIHZhbGlkIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcwMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIHNldCBmb3IgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNzAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgPGNvZGU+VmtJbWFnZTwvY29kZT4gd2l0aCBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBvZiB0aGUgdHlwZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+LCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjcwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB3aXRoIDxjb2RlPkltcGxpY2l0TG9kPC9jb2RlPiwgPGNvZGU+RHJlZjwvY29kZT4gb3IgPGNvZGU+UHJvajwvY29kZT4gaW4gdGhlaXIgbmFtZSwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI3MDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgPGNvZGU+T3BJbWFnZVNhbXBsZSo8L2NvZGU+IG9yIDxjb2RlPk9wSW1hZ2VTcGFyc2VTYW1wbGUqPC9jb2RlPiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjcwNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJvYnVzdEJ1ZmZlckFjY2Vzc1wiPnJvYnVzdCBidWZmZXIgYWNjZXNzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI3MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1idWZmZXItMDI3MDgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5idWZmZXI8L2NvZGU+IGlzIG5vbi1zcGFyc2UgdGhlbiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgPGNvZGU+VmtEZXZpY2VNZW1vcnk8L2NvZGU+IG9iamVjdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWJ1ZmZlci0wMjcwOSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+VktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQ8L2NvZGU+IGJpdCBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1vZmZzZXQtMDI3MTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgPGNvZGU+NDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1vZmZzZXQtMDA0MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPm9mZnNldDwvY29kZT4gYW5kIHRoZSBzaXplIG9mIDxjb2RlPlZrRGlzcGF0Y2hJbmRpcmVjdENvbW1hbmQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5idWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmJ1ZmZlcjwvY29kZT4sIGFuZCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5MyIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gb2YgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzNEPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkU8L2NvZGU+LCBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtZmlsdGVyQ3ViaWMtMDI2OTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpYzwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQ8L2NvZGU+IG9yIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3VHlwZVwiPlZrSW1hZ2VWaWV3VHlwZTwvYT4gYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSA8Y29kZT5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+ZmlsdGVyQ3ViaWNNaW5tYXg8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtZmxhZ3MtMDI2OTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa0ltYWdlQ3JlYXRlSW5mb1wiPlZrSW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+VktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVjwvY29kZT4gc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgPGEgaHJlZj1cIiNWa1NhbXBsZXJBZGRyZXNzTW9kZVwiPlZrU2FtcGxlckFkZHJlc3NNb2RlPC9hPiBvZiA8Y29kZT5WS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcxMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGlzcGF0Y2hJbmRpcmVjdENvbW1hbmQiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwYXRjaEluZGlyZWN0Q29tbWFuZC14LTAwNDE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+eDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhDb21wdXRlV29ya0dyb3VwQ291bnQ8L2NvZGU+WzBdIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kLXktMDA0MTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT55PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudDwvY29kZT5bMV0iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGF0Y2hJbmRpcmVjdENvbW1hbmQtei0wMDQxOSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPno8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50PC9jb2RlPlsyXSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kRGlzcGF0Y2hCYXNlIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjY5MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfTElORUFSPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjY5MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI2OTciLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBzZXQgPGVtPm48L2VtPiB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgZGVzY3JpcHRvciBzZXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGJvdW5kIHRvIDxlbT5uPC9lbT4gYXQgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHRoYXQgaXMgY29tcGF0aWJsZSBmb3Igc2V0IDxlbT5uPC9lbT4sIHdpdGggdGhlIDxjb2RlPlZrUGlwZWxpbmVMYXlvdXQ8L2NvZGU+IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+LCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj1cIiNkZXNjcmlwdG9yc2V0cy1jb21wYXRpYmlsaXR5XCI+UGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHk8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggcHVzaCBjb25zdGFudCB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBwdXNoIGNvbnN0YW50cywgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI2OTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBEZXNjcmlwdG9ycyBpbiBlYWNoIGJvdW5kIGRlc2NyaXB0b3Igc2V0LCBzcGVjaWZpZWQgdmlhIDxjb2RlPnZrQ21kQmluZERlc2NyaXB0b3JTZXRzPC9jb2RlPiwgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjcwMCIsCisgICAgICAgICAgInRleHQiOiAiIEEgdmFsaWQgcGlwZWxpbmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItMDI3MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNzAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgPGNvZGU+VmtJbWFnZTwvY29kZT4gd2l0aCBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBvZiB0aGUgdHlwZSA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWTwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTwvY29kZT4gb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+LCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNzAzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIDxjb2RlPk9wSW1hZ2VTYW1wbGUqPC9jb2RlPiBvciA8Y29kZT5PcEltYWdlU3BhcnNlU2FtcGxlKjwvY29kZT4gaW5zdHJ1Y3Rpb25zIHdpdGggPGNvZGU+SW1wbGljaXRMb2Q8L2NvZGU+LCA8Y29kZT5EcmVmPC9jb2RlPiBvciA8Y29kZT5Qcm9qPC9jb2RlPiBpbiB0aGVpciBuYW1lLCBpbiBhbnkgc2hhZGVyIHN0YWdlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNzA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIDxjb2RlPk9wSW1hZ2VTYW1wbGUqPC9jb2RlPiBvciA8Y29kZT5PcEltYWdlU3BhcnNlU2FtcGxlKjwvY29kZT4gaW5zdHJ1Y3Rpb25zIHRoYXQgaW5jbHVkZXMgYSBMT0QgYmlhcyBvciBhbnkgb2Zmc2V0IHZhbHVlcywgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjcwNSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJvYnVzdEJ1ZmZlckFjY2Vzc1wiPnJvYnVzdCBidWZmZXIgYWNjZXNzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjcwNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXJvYnVzdEJ1ZmZlckFjY2Vzc1wiPnJvYnVzdCBidWZmZXIgYWNjZXNzPC9hPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtYmFzZUdyb3VwWC0wMDQyMSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJhc2VHcm91cFg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50PC9jb2RlPlswXSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtYmFzZUdyb3VwWC0wMDQyMiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJhc2VHcm91cFg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50PC9jb2RlPlsxXSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtYmFzZUdyb3VwWi0wMDQyMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJhc2VHcm91cFo8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50PC9jb2RlPlsyXSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtZ3JvdXBDb3VudFgtMDA0MjQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5ncm91cENvdW50WDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhDb21wdXRlV29ya0dyb3VwQ291bnQ8L2NvZGU+WzBdIG1pbnVzIDxjb2RlPmJhc2VHcm91cFg8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1ncm91cENvdW50WS0wMDQyNSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmdyb3VwQ291bnRZPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudDwvY29kZT5bMV0gbWludXMgPGNvZGU+YmFzZUdyb3VwWTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWdyb3VwQ291bnRaLTAwNDI2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Z3JvdXBDb3VudFo8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlTGltaXRzPC9jb2RlPjo6PGNvZGU+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50PC9jb2RlPlsyXSBtaW51cyA8Y29kZT5iYXNlR3JvdXBaPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtYmFzZUdyb3VwWC0wMDQyNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIGFueSBvZiA8Y29kZT5iYXNlR3JvdXBYPC9jb2RlPiwgPGNvZGU+YmFzZUdyb3VwWTwvY29kZT4sIG9yIDxjb2RlPmJhc2VHcm91cFo8L2NvZGU+IGFyZSBub3QgemVybywgdGhlbiB0aGUgYm91bmQgY29tcHV0ZSBwaXBlbGluZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT5WS19QSVBFTElORV9DUkVBVEVfRElTUEFUQ0hfQkFTRTwvY29kZT4gZmxhZy4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApKyhWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldyYjODIxNztzIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWltYWdlLXZpZXctZm9ybWF0LWZlYXR1cmVzXCI+Zm9ybWF0IGZlYXR1cmVzPC9hPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBjb250YWluIDxjb2RlPlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBvZiA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfM0Q8L2NvZGU+LCA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTwvY29kZT4sIG9yIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkrKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1maWx0ZXJDdWJpYy0wMjY5NCIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUPC9jb2RlPiBvciA8Y29kZT5WS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvY29kZT46Ojxjb2RlPmZpbHRlckN1YmljTWlubWF4PC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApKyhWS19OVl9jb3JuZXJfc2FtcGxlZF9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWZsYWdzLTAyNjk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlY8L2NvZGU+IHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIDxhIGhyZWY9XCIjVmtTYW1wbGVyQWRkcmVzc01vZGVcIj5Wa1NhbXBsZXJBZGRyZXNzTW9kZTwvYT4gb2YgPGNvZGU+VktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSsoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1jb21tYW5kQnVmZmVyLTAyNzA3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhIHByb3RlY3RlZCByZXNvdXJjZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgiOiB7CisgICAgICAiKFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgtcEZlYXR1cmVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBGZWF0dXJlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlhcIj5Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWC1wTGltaXRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBMaW1pdHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWFwiPlZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCI6IHsKKyAgICAgICIoVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19GRUFUVVJFU19OVlg8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYIjogeworICAgICAgIihWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiOiB7CisgICAgICAiKFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVPYmplY3RUYWJsZU5WWC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZU9iamVjdFRhYmxlTlZYLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYXCI+VmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlg8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVPYmplY3RUYWJsZU5WWC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVPYmplY3RUYWJsZU5WWC1wT2JqZWN0VGFibGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE9iamVjdFRhYmxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrT2JqZWN0VGFibGVOVlhcIj5Wa09iamVjdFRhYmxlTlZYPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCI6IHsKKyAgICAgICIoVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1jb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydC0wMTM1NSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg8L2NvZGU+Ojo8Y29kZT5jb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydDwvY29kZT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgPGNvZGU+cE9iamVjdEVudHJ5VXNhZ2VGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfT0JKRUNUX0VOVFJZX1VTQUdFX0NPTVBVVEVfQklUX05WWDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLXBPYmplY3RFbnRyeUNvdW50cy0wMTM1NiIsCisgICAgICAgICAgInRleHQiOiAiIEFueSB2YWx1ZSB3aXRoaW4gPGNvZGU+cE9iamVjdEVudHJ5Q291bnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgZXhjZWVkIDxjb2RlPlZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg8L2NvZGU+Ojo8Y29kZT5tYXhPYmplY3RFbnRyeUNvdW50czwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLW1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvci0wMTM1NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgd2l0aGluIHRoZSBsaW1pdHMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1tYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3ItMDEzNTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHdpdGhpbiB0aGUgbGltaXRzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtbWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3ItMDEzNTkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgd2l0aGluIHRoZSBsaW1pdHMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1tYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvci0wMTM2MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB3aXRoaW4gdGhlIGxpbWl0cyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX09CSkVDVF9UQUJMRV9DUkVBVEVfSU5GT19OVlg8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE9iamVjdEVudHJ5VHlwZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE9iamVjdEVudHJ5VHlwZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5vYmplY3RDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa09iamVjdEVudHJ5VHlwZU5WWFwiPlZrT2JqZWN0RW50cnlUeXBlTlZYPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLXBPYmplY3RFbnRyeUNvdW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wT2JqZWN0RW50cnlDb3VudHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5vYmplY3RDb3VudDwvY29kZT4gPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE9iamVjdEVudHJ5VXNhZ2VGbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wT2JqZWN0RW50cnlVc2FnZUZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+b2JqZWN0Q291bnQ8L2NvZGU+IHZhbGlkIGNvbWJpbmF0aW9ucyBvZiA8YSBocmVmPVwiI1ZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYXCI+VmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlg8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE9iamVjdEVudHJ5VXNhZ2VGbGFncy1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cE9iamVjdEVudHJ5VXNhZ2VGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1vYmplY3RDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9iamVjdENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCI6IHsKKyAgICAgICIoVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1vYmplY3RUYWJsZS0wMTM2MSIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byA8Y29kZT5vYmplY3RUYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95T2JqZWN0VGFibGVOVlgtb2JqZWN0VGFibGUtMDEzNjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5vYmplY3RUYWJsZTwvY29kZT4gd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHByb3ZpZGVkIGhlcmUuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1vYmplY3RUYWJsZS0wMTM2MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPm9iamVjdFRhYmxlPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1vYmplY3RUYWJsZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vYmplY3RUYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrT2JqZWN0VGFibGVOVlhcIj5Wa09iamVjdFRhYmxlTlZYPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveU9iamVjdFRhYmxlTlZYLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1vYmplY3RUYWJsZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vYmplY3RUYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+ZGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrUmVnaXN0ZXJPYmplY3RzTlZYIjogeworICAgICAgIihWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RUYWJsZUVudHJ5LTAxMzY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIGNvbnRlbnRzIG9mIDxjb2RlPnBPYmplY3RUYWJsZUVudHJ5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiB5aWVsZCBwbGF1c2libGUgYmluZGluZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1JlZ2lzdGVyT2JqZWN0c05WWC1wT2JqZWN0SW5kaWNlcy0wMTM2NSIsCisgICAgICAgICAgInRleHQiOiAiIEF0IGFueSA8Y29kZT5wT2JqZWN0SW5kaWNlczwvY29kZT4gdGhlcmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGEgcmVnaXN0ZXJlZCByZXNvdXJjZSBhbHJlYWR5LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEluZGljZXMtMDEzNjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgdmFsdWUgaW5zaWRlIDxjb2RlPnBPYmplY3RJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBiZWxvdyB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+VmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlg8L2NvZGU+Ojo8Y29kZT5wT2JqZWN0RW50cnlDb3VudHM8L2NvZGU+IGxpbWl0cyBwcm92aWRlZCBhdCA8Y29kZT5vYmplY3RUYWJsZTwvY29kZT4gY3JlYXRpb24gdGltZS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLW9iamVjdFRhYmxlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9iamVjdFRhYmxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtPYmplY3RUYWJsZU5WWFwiPlZrT2JqZWN0VGFibGVOVlg8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtcHBPYmplY3RUYWJsZUVudHJpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cHBPYmplY3RUYWJsZUVudHJpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5vYmplY3RDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa09iamVjdFRhYmxlRW50cnlOVlhcIj5Wa09iamVjdFRhYmxlRW50cnlOVlg8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RJbmRpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBPYmplY3RJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+b2JqZWN0Q291bnQ8L2NvZGU+IDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLW9iamVjdENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0VGFibGUtcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0VGFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa09iamVjdFRhYmxlRW50cnlOVlgiOiB7CisgICAgICAiKFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUVudHJ5TlZYLWNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0LTAxMzY3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWDwvY29kZT46Ojxjb2RlPmNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0PC9jb2RlPiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfT0JKRUNUX0VOVFJZX1VTQUdFX0NPTVBVVEVfQklUX05WWDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVFbnRyeU5WWC10eXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa09iamVjdEVudHJ5VHlwZU5WWFwiPlZrT2JqZWN0RW50cnlUeXBlTlZYPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUVudHJ5TlZYLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlhcIj5Wa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWDwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlRW50cnlOVlgtZmxhZ3MtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYIjogeworICAgICAgIihWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYLXR5cGUtMDEzNjgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50eXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19PQkpFQ1RfRU5UUllfVFlQRV9QSVBFTElORV9OVlg8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWC10eXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa09iamVjdEVudHJ5VHlwZU5WWFwiPlZrT2JqZWN0RW50cnlUeXBlTlZYPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlgtZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWFwiPlZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYLXBpcGVsaW5lLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZVwiPlZrUGlwZWxpbmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlgiOiB7CisgICAgICAiKFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC10eXBlLTAxMzY5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfT0JKRUNUX0VOVFJZX1RZUEVfREVTQ1JJUFRPUl9TRVRfTlZYPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC10eXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa09iamVjdEVudHJ5VHlwZU5WWFwiPlZrT2JqZWN0RW50cnlUeXBlTlZYPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYXCI+VmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlg8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC1mbGFncy1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYLXBpcGVsaW5lTGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBpcGVsaW5lTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaXBlbGluZUxheW91dFwiPlZrUGlwZWxpbmVMYXlvdXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC1kZXNjcmlwdG9yU2V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRlc2NyaXB0b3JTZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rlc2NyaXB0b3JTZXRcIj5Wa0Rlc2NyaXB0b3JTZXQ8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmRlc2NyaXB0b3JTZXQ8L2NvZGU+LCBhbmQgPGNvZGU+cGlwZWxpbmVMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgiOiB7CisgICAgICAiKFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYLXR5cGUtMDEzNzAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50eXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19PQkpFQ1RfRU5UUllfVFlQRV9WRVJURVhfQlVGRkVSX05WWDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWC10eXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa09iamVjdEVudHJ5VHlwZU5WWFwiPlZrT2JqZWN0RW50cnlUeXBlTlZYPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlhcIj5Wa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWDwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgtZmxhZ3MtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYLWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5idWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWCI6IHsKKyAgICAgICIoVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWC10eXBlLTAxMzcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfT0JKRUNUX0VOVFJZX1RZUEVfSU5ERVhfQlVGRkVSX05WWDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYLWluZGV4VHlwZS0wMjc4MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGV4VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU5ERVhfVFlQRV9VSU5UMTY8L2NvZGU+LCBvciA8Y29kZT5WS19JTkRFWF9UWVBFX1VJTlQzMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYLXR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrT2JqZWN0RW50cnlUeXBlTlZYXCI+VmtPYmplY3RFbnRyeVR5cGVOVlg8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYXCI+VmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlg8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgtZmxhZ3MtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgtYnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgtaW5kZXhUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGV4VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5kZXhUeXBlXCI+VmtJbmRleFR5cGU8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYIjogeworICAgICAgIihWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWC10eXBlLTAxMzcyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfT0JKRUNUX0VOVFJZX1RZUEVfUFVTSF9DT05TVEFOVF9OVlg8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa09iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgtdHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50eXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtPYmplY3RFbnRyeVR5cGVOVlhcIj5Wa09iamVjdEVudHJ5VHlwZU5WWDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYXCI+VmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlg8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWC1waXBlbGluZUxheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZUxheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVMYXlvdXRcIj5Wa1BpcGVsaW5lTGF5b3V0PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWC1zdGFnZUZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN0YWdlRmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1NoYWRlclN0YWdlRmxhZ0JpdHNcIj5Wa1NoYWRlclN0YWdlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYLXN0YWdlRmxhZ3MtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3RhZ2VGbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtVbnJlZ2lzdGVyT2JqZWN0c05WWCI6IHsKKyAgICAgICIoVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RJbmRpY2VzLTAxMzczIiwKKyAgICAgICAgICAidGV4dCI6ICIgQXQgYW55IDxjb2RlPnBPYmplY3RJbmRpY2VzPC9jb2RlPiB0aGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHJlZ2lzdGVyZWQgcmVzb3VyY2UgYWxyZWFkeS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEVudHJ5VHlwZXMtMDEzNzQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+cE9iamVjdEVudHJ5VHlwZXM8L2NvZGU+IG9mIHRoZSByZXNvdXJjZSBhdCA8Y29kZT5wT2JqZWN0SW5kaWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2guIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLU5vbmUtMDEzNzUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgZGV2aWNlIHVzaW5nIHRoZSByZWdpc3RlcmVkIHJlc291cmNlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjb21wbGV0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0VGFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa09iamVjdFRhYmxlTlZYXCI+VmtPYmplY3RUYWJsZU5WWDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RFbnRyeVR5cGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBPYmplY3RFbnRyeVR5cGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+b2JqZWN0Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtPYmplY3RFbnRyeVR5cGVOVlhcIj5Wa09iamVjdEVudHJ5VHlwZU5WWDwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RJbmRpY2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBPYmplY3RJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+b2JqZWN0Q291bnQ8L2NvZGU+IDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0Q291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vYmplY3RDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLW9iamVjdFRhYmxlLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9iamVjdFRhYmxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgiOiB7CisgICAgICAiKFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgtYmluZGluZ1VuaXQtMDEzNDIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5iaW5kaW5nVW5pdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3RheSB3aXRoaW4gZGV2aWNlIHN1cHBvcnRlZCBsaW1pdHMgZm9yIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kcy4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYLWR5bmFtaWNDb3VudC0wMTM0MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmR5bmFtaWNDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3RheSB3aXRoaW4gZGV2aWNlIHN1cHBvcnRlZCBsaW1pdHMgZm9yIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kcy4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYLWRpdmlzb3ItMDEzNDQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXZpc29yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4gYW5kIGEgcG93ZXIgb2YgdHdvLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgtdG9rZW5UeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRva2VuVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWFwiPlZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWDwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCI6IHsKKyAgICAgICIoVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWC1idWZmZXItMDEzNDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+YnVmZmVyPC9jb2RlPiYjODIxNztzIHVzYWdlIGZsYWcgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSB0aGUgPGNvZGU+VktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQ8L2NvZGU+IGJpdCBzZXQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWC1vZmZzZXQtMDEzNDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+b2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbGlnbmVkIHRvIDxjb2RlPlZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg8L2NvZGU+Ojo8Y29kZT5taW5Db21tYW5kc1Rva2VuQnVmZmVyT2Zmc2V0QWxpZ25tZW50PC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYLXRva2VuVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50b2tlblR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlhcIj5Wa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlg8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWC1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIjogeworICAgICAgIihWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWFwiPlZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlg8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYXCI+VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIjogeworICAgICAgIihWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtdG9rZW5Db3VudC0wMTM0NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRva2VuQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBhbmQgYmVsb3cgPGNvZGU+VmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWDwvY29kZT46Ojxjb2RlPm1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1jb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydC0wMTM0OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg8L2NvZGU+Ojo8Y29kZT5jb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydDwvY29kZT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgdGhlbiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtcFRva2Vucy0wMTM0OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBUb2tlbnM8L2NvZGU+IGNvbnRhaW5zIGFuIGVudHJ5IG9mIDxjb2RlPlZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfUElQRUxJTkVfTlZYPC9jb2RlPiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgYW5kIHRoZXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG9ubHkgYSBzaW5nbGUgZWxlbWVudCBvZiBzdWNoIHRva2VuIHR5cGUuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXBUb2tlbnMtMDEzNTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgc3RhdGUgYmluZGluZyB0b2tlbnMgaW4gPGNvZGU+cFRva2VuczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb2NjdXIgcHJpb3Igd29yayBwcm92b2tpbmcgdG9rZW5zICg8Y29kZT5WS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0RSQVdfTlZYPC9jb2RlPiwgPGNvZGU+VktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9EUkFXX0lOREVYRURfTlZYPC9jb2RlPiwgPGNvZGU+VktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ESVNQQVRDSF9OVlg8L2NvZGU+KS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtcFRva2Vucy0wMTM1MSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBjb250ZW50IG9mIDxjb2RlPnBUb2tlbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgb25lIHNpbmdsZSB3b3JrIHByb3Zva2luZyB0b2tlbiB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgPGNvZGU+cGlwZWxpbmVCaW5kUG9pbnQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfQ1JFQVRFX0lORk9fTlZYPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1waXBlbGluZUJpbmRQb2ludC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waXBlbGluZUJpbmRQb2ludDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGlwZWxpbmVCaW5kUG9pbnRcIj5Wa1BpcGVsaW5lQmluZFBvaW50PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlhcIj5Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtZmxhZ3MtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1wVG9rZW5zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBUb2tlbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT50b2tlbkNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYXCI+VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlg8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtdG9rZW5Db3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRva2VuQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiOiB7CisgICAgICAiKFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1pbmRpcmVjdENvbW1hbmRzTGF5b3V0LTAxMzUyIiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1vYmplY3RUYWJsZS0wMTM1MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPm9iamVjdFRhYmxlPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1vYmplY3RUYWJsZS0wMTM1NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPm9iamVjdFRhYmxlPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1pbmRpcmVjdENvbW1hbmRzTGF5b3V0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlhcIj5Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1pbmRpcmVjdENvbW1hbmRzTGF5b3V0LXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIjogeworICAgICAgIihWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci0wMTMyOSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSBwcm92aWRlZCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBoYWQgYSBwcmlvciBzcGFjZSByZXNlcnZhdGlvbiBzaW5jZSBpdHMgY3JlYXRpb24gb3IgdGhlIGxhc3QgcmVzZXQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItMDEzMzAiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3RhdGUgb2YgdGhlIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlZ2FsIHRvIGV4ZWN1dGUgYWxsIGNvbW1hbmRzIHdpdGhpbiB0aGUgc2VxdWVuY2UgcHJvdmlkZWQgYnkgdGhlIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUHJvY2Vzc0NvbW1hbmRzSW5mbzwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLXBSZXNlcnZlU3BhY2VJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBSZXNlcnZlU3BhY2VJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYXCI+VmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlg8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWC1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWJ1ZmZlcmxldmVsIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBzZWNvbmRhcnkgPGNvZGU+VmtDb21tYW5kQnVmZmVyPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIjogeworICAgICAgIihWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWC1vYmplY3RUYWJsZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vYmplY3RUYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrT2JqZWN0VGFibGVOVlhcIj5Wa09iamVjdFRhYmxlTlZYPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYLWluZGlyZWN0Q29tbWFuZHNMYXlvdXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5kaXJlY3RDb21tYW5kc0xheW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWFwiPlZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+LCBhbmQgPGNvZGU+b2JqZWN0VGFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFByb2Nlc3NDb21tYW5kc05WWCI6IHsKKyAgICAgICIoVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFByb2Nlc3NDb21tYW5kc05WWC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgtcFByb2Nlc3NDb21tYW5kc0luZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFByb2Nlc3NDb21tYW5kc0luZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYXCI+VmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgtcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCI6IHsKKyAgICAgICIoVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtb2JqZWN0VGFibGUtMDEzMzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgcHJvdmlkZWQgPGNvZGU+b2JqZWN0VGFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYWxsIG9iamVjdHMgcmVmZXJlbmNlZCBieSB0aGUgZ2VuZXJhdGlvbiBwcm9jZXNzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQtMDEzMzIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2ggdGhlIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+JiM4MjE3O3MgPGNvZGU+dG9rZW5Db3VudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC10b2tlblR5cGUtMDEzMzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+dG9rZW5UeXBlPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbnRyeSBpbiB0aGUgPGNvZGU+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnM8L2NvZGU+IGFycmF5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG1hdGNoIHRoZSB2YWx1ZXMgdXNlZCBhdCBjcmVhdGlvbiB0aW1lIG9mIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtdGFyZ2V0Q29tbWFuZEJ1ZmZlci0wMTMzNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnRhcmdldENvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIHByb3ZpZGVkLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIHJlc2VydmVkIGNvbW1hbmQgc3BhY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC10YXJnZXRDb21tYW5kQnVmZmVyLTAxMzM1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dGFyZ2V0Q29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgcHJvdmlkZWQsIHRoZSA8Y29kZT5vYmplY3RUYWJsZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2ggdGhlIHJlc2VydmF0aW9uJiM4MjE3O3MgPGNvZGU+b2JqZWN0VGFibGU8L2NvZGU+IGFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGhhZCBhbGwgcmVmZXJlbmNlZCBvYmplY3RzIHJlZ2lzdGVyZWQgYXQgcmVzZXJ2YXRpb24gdGltZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXRhcmdldENvbW1hbmRCdWZmZXItMDEzMzYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT50YXJnZXRDb21tYW5kQnVmZmVyPC9jb2RlPiBpcyBwcm92aWRlZCwgdGhlIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG1hdGNoIHRoZSByZXNlcnZhdGlvbiYjODIxNztzIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtdGFyZ2V0Q29tbWFuZEJ1ZmZlci0wMTMzNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnRhcmdldENvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIHByb3ZpZGVkLCB0aGUgPGNvZGU+bWF4U2VxdWVuY2VzQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBleGNlZWQgdGhlIHJlc2VydmF0aW9uJiM4MjE3O3MgPGNvZGU+bWF4U2VxdWVuY2VzQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtc2VxdWVuY2VzQ291bnRCdWZmZXItMDEzMzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zZXF1ZW5jZXNDb3VudEJ1ZmZlcjwvY29kZT4gaXMgdXNlZCwgaXRzIHVzYWdlIGZsYWcgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSB0aGUgPGNvZGU+VktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQ8L2NvZGU+IGJpdCBzZXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zZXF1ZW5jZXNDb3VudEJ1ZmZlci0wMTMzOSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNlcXVlbmNlc0NvdW50QnVmZmVyPC9jb2RlPiBpcyB1c2VkLCA8Y29kZT5zZXF1ZW5jZXNDb3VudE9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYWxpZ25lZCB0byA8Y29kZT5Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYPC9jb2RlPjo6PGNvZGU+bWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zZXF1ZW5jZXNJbmRleEJ1ZmZlci0wMTM0MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNlcXVlbmNlc0luZGV4QnVmZmVyPC9jb2RlPiBpcyB1c2VkLCBpdHMgdXNhZ2UgZmxhZyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIHRoZSA8Y29kZT5WS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVDwvY29kZT4gYml0IHNldCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXNlcXVlbmNlc0luZGV4QnVmZmVyLTAxMzQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2VxdWVuY2VzSW5kZXhCdWZmZXI8L2NvZGU+IGlzIHVzZWQsIDxjb2RlPnNlcXVlbmNlc0luZGV4T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbGlnbmVkIHRvIDxjb2RlPlZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg8L2NvZGU+Ojo8Y29kZT5taW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0VGFibGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa09iamVjdFRhYmxlTlZYXCI+VmtPYmplY3RUYWJsZU5WWDwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtaW5kaXJlY3RDb21tYW5kc0xheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbmRpcmVjdENvbW1hbmRzTGF5b3V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYXCI+VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1wSW5kaXJlY3RDb21tYW5kc1Rva2Vucy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW5kaXJlY3RDb21tYW5kc1Rva2VuczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYXCI+VmtJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlg8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC10YXJnZXRDb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnRhcmdldENvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+dGFyZ2V0Q29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtc2VxdWVuY2VzQ291bnRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2VxdWVuY2VzQ291bnRCdWZmZXI8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5zZXF1ZW5jZXNDb3VudEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXNlcXVlbmNlc0luZGV4QnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNlcXVlbmNlc0luZGV4QnVmZmVyPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+c2VxdWVuY2VzSW5kZXhCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1pbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L2NvZGU+LCA8Y29kZT5vYmplY3RUYWJsZTwvY29kZT4sIDxjb2RlPnNlcXVlbmNlc0NvdW50QnVmZmVyPC9jb2RlPiwgPGNvZGU+c2VxdWVuY2VzSW5kZXhCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+dGFyZ2V0Q29tbWFuZEJ1ZmZlcjwvY29kZT4gdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtc2FtcGxlcy0wMTA5NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgYml0IHZhbHVlIHRoYXQgaXMgc2V0IGluIDxjb2RlPlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPjo6PGNvZGU+c2FtcGxlQ291bnRzPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPiB3aXRoIDxjb2RlPmZvcm1hdDwvY29kZT4sIDxjb2RlPnR5cGU8L2NvZGU+LCA8Y29kZT50aWxpbmc8L2NvZGU+LCBhbmQgPGNvZGU+dXNhZ2U8L2NvZGU+IGVxdWFsIHRvIHRob3NlIGluIHRoaXMgY29tbWFuZCBhbmQgPGNvZGU+ZmxhZ3M8L2NvZGU+IGVxdWFsIHRvIHRoZSB2YWx1ZSB0aGF0IGlzIHNldCBpbiA8Y29kZT5Wa0ltYWdlQ3JlYXRlSW5mbzwvY29kZT46Ojxjb2RlPmZsYWdzPC9jb2RlPiB3aGVuIHRoZSBpbWFnZSBpcyBjcmVhdGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy1mb3JtYXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50eXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVR5cGVcIj5Wa0ltYWdlVHlwZTwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtc2FtcGxlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zYW1wbGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTYW1wbGVDb3VudEZsYWdCaXRzXCI+VmtTYW1wbGVDb3VudEZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy11c2FnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT51c2FnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrSW1hZ2VVc2FnZUZsYWdCaXRzXCI+VmtJbWFnZVVzYWdlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy11c2FnZS1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT51c2FnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXRpbGluZy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50aWxpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVGlsaW5nXCI+VmtJbWFnZVRpbGluZzwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllc1wiPlZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wRm9ybWF0SW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRm9ybWF0SW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMlwiPlZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wUHJvcGVydGllczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMlwiPlZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXNhbXBsZXMtMDEwOTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zYW1wbGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIGJpdCB2YWx1ZSB0aGF0IGlzIHNldCBpbiA8Y29kZT5Wa0ltYWdlRm9ybWF0UHJvcGVydGllczwvY29kZT46Ojxjb2RlPnNhbXBsZUNvdW50czwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczwvY29kZT4gd2l0aCA8Y29kZT5mb3JtYXQ8L2NvZGU+LCA8Y29kZT50eXBlPC9jb2RlPiwgPGNvZGU+dGlsaW5nPC9jb2RlPiwgYW5kIDxjb2RlPnVzYWdlPC9jb2RlPiBlcXVhbCB0byB0aG9zZSBpbiB0aGlzIGNvbW1hbmQgYW5kIDxjb2RlPmZsYWdzPC9jb2RlPiBlcXVhbCB0byB0aGUgdmFsdWUgdGhhdCBpcyBzZXQgaW4gPGNvZGU+VmtJbWFnZUNyZWF0ZUluZm88L2NvZGU+Ojo8Y29kZT5mbGFnczwvY29kZT4gd2hlbiB0aGUgaW1hZ2UgaXMgY3JlYXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NQQVJTRV9JTUFHRV9GT1JNQVRfSU5GT18yPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLWZvcm1hdC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mb3JtYXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Zvcm1hdFwiPlZrRm9ybWF0PC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItdHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50eXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVR5cGVcIj5Wa0ltYWdlVHlwZTwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXNhbXBsZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2FtcGxlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2FtcGxlQ291bnRGbGFnQml0c1wiPlZrU2FtcGxlQ291bnRGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXVzYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtJbWFnZVVzYWdlRmxhZ0JpdHNcIj5Wa0ltYWdlVXNhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT51c2FnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi10aWxpbmctcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dGlsaW5nPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVRpbGluZ1wiPlZrSW1hZ2VUaWxpbmc8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLWltYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVwiPlZrSW1hZ2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLXBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNcIj5Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLWltYWdlLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMi1wSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJcIj5Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czItcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czItcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJcIj5Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TUEFSU0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3BhcnNlTWVtb3J5QmluZCI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtbWVtb3J5LTAxMDk2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bWVtb3J5PC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+bWVtb3J5PC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5T2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBtYXRjaCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBvZiB0aGUgcmVzb3VyY2UsIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDxhIGhyZWY9XCIjcmVzb3VyY2VzLWFzc29jaWF0aW9uXCI+UmVzb3VyY2UgTWVtb3J5IEFzc29jaWF0aW9uPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLW1lbW9yeS0wMTA5NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm1lbW9yeTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPm1lbW9yeTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBtZW1vcnkgdHlwZSB0aGF0IHJlcG9ydHMgPGNvZGU+VktfTUVNT1JZX1BST1BFUlRZX0xBWklMWV9BTExPQ0FURURfQklUPC9jb2RlPiBiaXQgc2V0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtc2l6ZS0wMTA5OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLXJlc291cmNlT2Zmc2V0LTAxMDk5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cmVzb3VyY2VPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgcmVzb3VyY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1zaXplLTAxMTAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSByZXNvdXJjZSBtaW51cyA8Y29kZT5yZXNvdXJjZU9mZnNldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1tZW1vcnlPZmZzZXQtMDExMDEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZW1vcnlPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtc2l6ZS0wMTEwMiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNpemU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5tZW1vcnk8L2NvZGU+IG1pbnVzIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1tZW1vcnktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bWVtb3J5PC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+bWVtb3J5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VNZW1vcnlcIj5Wa0RldmljZU1lbW9yeTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1NwYXJzZU1lbW9yeUJpbmRGbGFnQml0c1wiPlZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtbWVtb3J5LTAyNzMwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bWVtb3J5PC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBub3QgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4sIGF0IGxlYXN0IG9uZSBoYW5kbGUgdHlwZSBpdCBjb250YWluZWQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBoYXZlIGJlZW4gc2V0IGluIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBvciA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLW1lbW9yeS0wMjczMSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm1lbW9yeTwvY29kZT4gd2FzIGNyZWF0ZWQgYnkgYSBtZW1vcnkgaW1wb3J0IG9wZXJhdGlvbiwgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIG9mIHRoZSBpbXBvcnRlZCBtZW1vcnkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBoYXZlIGJlZW4gc2V0IGluIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBvciA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8iOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mby1idWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+YnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvLXBCaW5kcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQmluZHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5iaW5kQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtTcGFyc2VNZW1vcnlCaW5kXCI+VmtTcGFyc2VNZW1vcnlCaW5kPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvLWJpbmRDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmJpbmRDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mby1wQmluZHMtMDExMDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+ZmxhZ3M8L2NvZGU+IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiA8Y29kZT5wQmluZHM8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX1NQQVJTRV9NRU1PUllfQklORF9NRVRBREFUQV9CSVQ8L2NvZGU+LCB0aGUgYmluZGluZyByYW5nZSBkZWZpbmVkIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHdpdGhpbiB0aGUgbWlwIHRhaWwgcmVnaW9uIG9mIHRoZSBtZXRhZGF0YSBhc3BlY3Qgb2YgPGNvZGU+aW1hZ2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8taW1hZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8tcEJpbmRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBCaW5kczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmJpbmRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1NwYXJzZU1lbW9yeUJpbmRcIj5Wa1NwYXJzZU1lbW9yeUJpbmQ8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mby1iaW5kQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5iaW5kQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8tc3VicmVzb3VyY2UtMDE3MjIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+c3VicmVzb3VyY2UubWlwTGV2ZWw8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEJpbmRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIDxjb2RlPm1pcExldmVsczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby1zdWJyZXNvdXJjZS0wMTcyMyIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5zdWJyZXNvdXJjZS5hcnJheUxheWVyPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBCaW5kczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5hcnJheUxheWVyczwvY29kZT4gc3BlY2lmaWVkIGluIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUluZm9cIj5Wa0ltYWdlQ3JlYXRlSW5mbzwvYT4gd2hlbiA8Y29kZT5pbWFnZTwvY29kZT4gd2FzIGNyZWF0ZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby1pbWFnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby1wQmluZHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEJpbmRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+YmluZENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kXCI+VmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQ8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby1iaW5kQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5iaW5kQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLW1lbW9yeS0wMTEwNCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8YSBocmVmPVwiI2ZlYXR1cmVzLXNwYXJzZVJlc2lkZW5jeUFsaWFzZWRcIj5zcGFyc2UgYWxpYXNlZCByZXNpZGVuY3k8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiBhbnkgb3RoZXIgcmVzb3VyY2VzIGFyZSBib3VuZCB0byByYW5nZXMgb2YgPGNvZGU+bWVtb3J5PC9jb2RlPiwgdGhlIHJhbmdlIG9mIDxjb2RlPm1lbW9yeTwvY29kZT4gYmVpbmcgYm91bmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IG92ZXJsYXAgd2l0aCB0aG9zZSBib3VuZCByYW5nZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLW1lbW9yeS0wMTEwNSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lbW9yeTwvY29kZT4gYW5kIDxjb2RlPm1lbW9yeU9mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2ggdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgdGhlIGNhbGxpbmcgY29tbWFuZCYjODIxNztzIDxjb2RlPmltYWdlPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gPGEgaHJlZj1cIiNyZXNvdXJjZXMtYXNzb2NpYXRpb25cIj5SZXNvdXJjZSBNZW1vcnkgQXNzb2NpYXRpb248L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1zdWJyZXNvdXJjZS0wMTEwNiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGltYWdlIHN1YnJlc291cmNlIGZvciA8Y29kZT5pbWFnZTwvY29kZT4gKHNlZSA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3c1wiPkltYWdlIFZpZXdzPC9hPikiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLW9mZnNldC0wMTEwNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9mZnNldC54PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIHRoZSBzcGFyc2UgaW1hZ2UgYmxvY2sgd2lkdGggKDxjb2RlPlZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPjo6PGNvZGU+aW1hZ2VHcmFudWxhcml0eS53aWR0aDwvY29kZT4pIG9mIHRoZSBpbWFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtZXh0ZW50LTAxMTA4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZXh0ZW50LndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBlaXRoZXIgYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3BhcnNlIGltYWdlIGJsb2NrIHdpZHRoIG9mIHRoZSBpbWFnZSwgb3IgZWxzZSA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmV4dGVudC53aWR0aDwvY29kZT4gJiM0MzsgPGNvZGU+b2Zmc2V0Lng8L2NvZGU+KTwvc3Bhbj4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtb2Zmc2V0LTAxMTA5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2Zmc2V0Lnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHNwYXJzZSBpbWFnZSBibG9jayBoZWlnaHQgKDxjb2RlPlZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPjo6PGNvZGU+aW1hZ2VHcmFudWxhcml0eS5oZWlnaHQ8L2NvZGU+KSBvZiB0aGUgaW1hZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLWV4dGVudC0wMTExMCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVpdGhlciBiZSBhIG11bHRpcGxlIG9mIHRoZSBzcGFyc2UgaW1hZ2UgYmxvY2sgaGVpZ2h0IG9mIHRoZSBpbWFnZSwgb3IgZWxzZSA8c3BhbiBjbGFzcz1cImVxXCI+KDxjb2RlPmV4dGVudC5oZWlnaHQ8L2NvZGU+ICYjNDM7IDxjb2RlPm9mZnNldC55PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIHN1YnJlc291cmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1vZmZzZXQtMDExMTEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vZmZzZXQuejwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3BhcnNlIGltYWdlIGJsb2NrIGRlcHRoICg8Y29kZT5Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczwvY29kZT46Ojxjb2RlPmltYWdlR3JhbnVsYXJpdHkuZGVwdGg8L2NvZGU+KSBvZiB0aGUgaW1hZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLWV4dGVudC0wMTExMiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmV4dGVudC5kZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZWl0aGVyIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHNwYXJzZSBpbWFnZSBibG9jayBkZXB0aCBvZiB0aGUgaW1hZ2UsIG9yIGVsc2UgPHNwYW4gY2xhc3M9XCJlcVwiPig8Y29kZT5leHRlbnQuZGVwdGg8L2NvZGU+ICYjNDM7IDxjb2RlPm9mZnNldC56PC9jb2RlPik8L3NwYW4+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIHRoZSBkZXB0aCBvZiB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLXN1YnJlc291cmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1YnJlc291cmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVN1YnJlc291cmNlXCI+VmtJbWFnZVN1YnJlc291cmNlPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLW1lbW9yeS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5tZW1vcnk8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5tZW1vcnk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZU1lbW9yeVwiPlZrRGV2aWNlTWVtb3J5PC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtTcGFyc2VNZW1vcnlCaW5kRmxhZ0JpdHNcIj5Wa1NwYXJzZU1lbW9yeUJpbmRGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfbWVtb3J5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtbWVtb3J5LTAyNzMyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bWVtb3J5PC9jb2RlPiB3YXMgY3JlYXRlZCB3aXRoIDxhIGhyZWY9XCIjVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9cIj5Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzwvYT46Ojxjb2RlPmhhbmRsZVR5cGVzPC9jb2RlPiBub3QgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT4sIGF0IGxlYXN0IG9uZSBoYW5kbGUgdHlwZSBpdCBjb250YWluZWQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYWxzbyBoYXZlIGJlZW4gc2V0IGluIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb1wiPlZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5oYW5kbGVUeXBlczwvY29kZT4gd2hlbiB0aGUgaW1hZ2Ugd2FzIGNyZWF0ZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1tZW1vcnktMDI3MzMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5tZW1vcnk8L2NvZGU+IHdhcyBjcmVhdGVkIGJ5IGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbWVtb3J5IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gaGF2ZSBiZWVuIHNldCBpbiA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9cIj5Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPC9hPjo6PGNvZGU+aGFuZGxlVHlwZXM8L2NvZGU+IHdoZW4gPGNvZGU+aW1hZ2U8L2NvZGU+IHdhcyBjcmVhdGVkLiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrUXVldWVCaW5kU3BhcnNlIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVCaW5kU3BhcnNlLWZlbmNlLTAxMTEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmVuY2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5mZW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5zaWduYWxlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtZmVuY2UtMDExMTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mZW5jZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBvdGhlciBxdWV1ZSBjb21tYW5kIHRoYXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGV4ZWN1dGlvbiBvbiB0aGF0IHF1ZXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1wU2lnbmFsU2VtYXBob3Jlcy0wMTExNSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiB0aGUgPGNvZGU+cFNpZ25hbFNlbWFwaG9yZXM8L2NvZGU+IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEJpbmRJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bnNpZ25hbGVkIHdoZW4gdGhlIHNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uIGl0IGRlZmluZXMgaXMgZXhlY3V0ZWQgb24gdGhlIGRldmljZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtcFdhaXRTZW1hcGhvcmVzLTAxMTE2IiwKKyAgICAgICAgICAidGV4dCI6ICIgV2hlbiBhIHNlbWFwaG9yZSB3YWl0IG9wZXJhdGlvbiByZWZlcnJpbmcgdG8gYSBiaW5hcnkgc2VtYXBob3JlIGRlZmluZWQgYnkgYW55IGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIDxjb2RlPnBCaW5kSW5mbzwvY29kZT4gZXhlY3V0ZXMgb24gPGNvZGU+cXVldWU8L2NvZGU+LCB0aGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBubyBvdGhlciBxdWV1ZXMgd2FpdGluZyBvbiB0aGUgc2FtZSBzZW1hcGhvcmUuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1wV2FpdFNlbWFwaG9yZXMtMDExMTciLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgdGhlIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gbWVtYmVyIG9mIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wQmluZEluZm88L2NvZGU+IG1lbWJlciByZWZlcnJpbmcgdG8gYSBiaW5hcnkgc2VtYXBob3JlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHNlbWFwaG9yZXMgdGhhdCBhcmUgc2lnbmFsZWQsIG9yIGhhdmUgPGEgaHJlZj1cIiNzeW5jaHJvbml6YXRpb24tc2VtYXBob3Jlcy1zaWduYWxpbmdcIj5zZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbnM8L2E+IHByZXZpb3VzbHkgc3VibWl0dGVkIGZvciBleGVjdXRpb24uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1xdWV1ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWV1ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUXVldWVcIj5Wa1F1ZXVlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVCaW5kU3BhcnNlLXBCaW5kSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5iaW5kSW5mb0NvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBCaW5kSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmJpbmRJbmZvQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtCaW5kU3BhcnNlSW5mb1wiPlZrQmluZFNwYXJzZUluZm88L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVCaW5kU3BhcnNlLWZlbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZlbmNlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+ZmVuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ZlbmNlXCI+VmtGZW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1xdWV1ZXR5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+cXVldWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgc3BhcnNlIGJpbmRpbmcgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5mZW5jZTwvY29kZT4sIGFuZCA8Y29kZT5xdWV1ZTwvY29kZT4gdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1wV2FpdFNlbWFwaG9yZXMtMDMyNDUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgdGhlIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gbWVtYmVyIG9mIGFsbCBlbGVtZW50cyBvZiA8Y29kZT5wQmluZEluZm88L2NvZGU+IGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiByZWZlcmVuY2UgYSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgZXhlY3V0aW9uIGFuZCBhbnkgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb25zIG9uIHdoaWNoIGl0IGRlcGVuZHMgKGlmIGFueSkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhbHNvIGJlZW4gc3VibWl0dGVkIGZvciBleGVjdXRpb24uIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtCaW5kU3BhcnNlSW5mbyI6IHsKKyAgICAgICIoVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZFNwYXJzZUluZm8tcFdhaXRTZW1hcGhvcmVzLTAzMjQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFdhaXRTZW1hcGhvcmVzPC9jb2RlPiBvciA8Y29kZT5wU2lnbmFsU2VtYXBob3JlczwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+IHRoZW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIGEgPGEgaHJlZj1cIiNWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUlwiPlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZFNwYXJzZUluZm8tcE5leHQtMDMyNDciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIHRoaXMgc3RydWN0dXJlIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUlwiPlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUgYW5kIGFueSBlbGVtZW50IG9mIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gd2FzIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+IHRoZW4gaXRzIDxjb2RlPndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50PC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgPGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wTmV4dC0wMzI0OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgdGhpcyBzdHJ1Y3R1cmUgaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSXCI+VmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI8L2E+IHN0cnVjdHVyZSBhbmQgYW55IGVsZW1lbnQgb2YgPGNvZGU+cFNpZ25hbFNlbWFwaG9yZXM8L2NvZGU+IHdhcyBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrU2VtYXBob3JlVHlwZUtIUlwiPlZrU2VtYXBob3JlVHlwZUtIUjwvYT4gb2YgPGNvZGU+VktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSPC9jb2RlPiB0aGVuIGl0cyA8Y29kZT5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50PC9jb2RlPiBtZW1iZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgPGNvZGU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBTaWduYWxTZW1hcGhvcmVzLTAzMjQ5IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wU2lnbmFsU2VtYXBob3JlczwvY29kZT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVLSFJcIj5Wa1NlbWFwaG9yZVR5cGVLSFI8L2E+IG9mIDxjb2RlPlZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUjwvY29kZT4gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiA8YSBocmVmPVwiI1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSXCI+VmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI8L2E+OjpwU2lnbmFsU2VtYXBob3JlVmFsdWVzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbWFwaG9yZSB3aGVuIHRoZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1zZW1hcGhvcmVzLXNpZ25hbGluZ1wiPnNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uPC9hPiBpcyBleGVjdXRlZCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wV2FpdFNlbWFwaG9yZXMtMDMyNTAiLAorICAgICAgICAgICJ0ZXh0IjogIiBGb3IgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVLSFJcIj5Wa1NlbWFwaG9yZVR5cGVLSFI8L2E+IG9mIDxjb2RlPlZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUjwvY29kZT4gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiA8YSBocmVmPVwiI1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSXCI+VmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI8L2E+OjpwV2FpdFNlbWFwaG9yZVZhbHVlcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgdmFsdWUgd2hpY2ggZG9lcyBub3QgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbWFwaG9yZSBvciBmcm9tIHRoZSB2YWx1ZSBvZiBhbnkgb3V0c3RhbmRpbmcgc2VtYXBob3JlIHdhaXQgb3Igc2lnbmFsIG9wZXJhdGlvbiBvbiB0aGF0IHNlbWFwaG9yZSBieSBtb3JlIHRoYW4gPGEgaHJlZj1cIiNsaW1pdHMtbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2VcIj48Y29kZT5tYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZTwvY29kZT48L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wU2lnbmFsU2VtYXBob3Jlcy0wMzI1MSIsCisgICAgICAgICAgInRleHQiOiAiIEZvciBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cFNpZ25hbFNlbWFwaG9yZXM8L2NvZGU+IGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI8L2NvZGU+IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgPGEgaHJlZj1cIiNWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUlwiPlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPC9hPjo6cFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgdmFsdWUgd2hpY2ggZG9lcyBub3QgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbWFwaG9yZSBvciBmcm9tIHRoZSB2YWx1ZSBvZiBhbnkgb3V0c3RhbmRpbmcgc2VtYXBob3JlIHdhaXQgb3Igc2lnbmFsIG9wZXJhdGlvbiBvbiB0aGF0IHNlbWFwaG9yZSBieSBtb3JlIHRoYW4gPGEgaHJlZj1cIiNsaW1pdHMtbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2VcIj48Y29kZT5tYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZTwvY29kZT48L2E+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm9cIj5Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm88L2E+IG9yIDxhIGhyZWY9XCIjVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFJcIj5Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZFNwYXJzZUluZm8tc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBXYWl0U2VtYXBob3Jlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT53YWl0U2VtYXBob3JlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFdhaXRTZW1hcGhvcmVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrU2VtYXBob3JlXCI+VmtTZW1hcGhvcmU8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZFNwYXJzZUluZm8tcEJ1ZmZlckJpbmRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmJ1ZmZlckJpbmRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wQnVmZmVyQmluZHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5idWZmZXJCaW5kQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mb1wiPlZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm88L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZFNwYXJzZUluZm8tcEltYWdlT3BhcXVlQmluZHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2VPcGFxdWVCaW5kQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEltYWdlT3BhcXVlQmluZHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5pbWFnZU9wYXF1ZUJpbmRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm9cIj5Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm88L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZFNwYXJzZUluZm8tcEltYWdlQmluZHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aW1hZ2VCaW5kQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cEltYWdlQmluZHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5pbWFnZUJpbmRDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm9cIj5Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm88L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQmluZFNwYXJzZUluZm8tcFNpZ25hbFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFNpZ25hbFNlbWFwaG9yZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zaWduYWxTZW1hcGhvcmVDb3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVwiPlZrU2VtYXBob3JlPC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgdGhlIGVsZW1lbnRzIG9mIDxjb2RlPnBTaWduYWxTZW1hcGhvcmVzPC9jb2RlPiwgYW5kIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wV2FpdFNlbWFwaG9yZXM8L2NvZGU+IHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvLXJlc291cmNlRGV2aWNlSW5kZXgtMDExMTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yZXNvdXJjZURldmljZUluZGV4PC9jb2RlPiBhbmQgPGNvZGU+bWVtb3J5RGV2aWNlSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJvdGggYmUgdmFsaWQgZGV2aWNlIGluZGljZXMuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8tbWVtb3J5RGV2aWNlSW5kZXgtMDExMTkiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG1lbW9yeSBhbGxvY2F0aW9uIGJvdW5kIGluIHRoaXMgYmF0Y2ggPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhbGxvY2F0ZWQgYW4gaW5zdGFuY2UgZm9yIDxjb2RlPm1lbW9yeURldmljZUluZGV4PC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTzwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9hbmRyb2lkX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUlwiPlZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFItcFN1cmZhY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfYW5kcm9pZF9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFItd2luZG93LTAxMjQ4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+d2luZG93PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBwb2ludCB0byBhIHZhbGlkIEFuZHJvaWQgPGEgaHJlZj1cIiNBTmF0aXZlV2luZG93XCI+QU5hdGl2ZVdpbmRvdzwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfd2F5bGFuZF9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFJcIj5Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUtIUlwiPlZrU3VyZmFjZUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3dheWxhbmRfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLWRpc3BsYXktMDEzMDQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNwbGF5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBwb2ludCB0byBhIHZhbGlkIFdheWxhbmQgPGNvZGU+d2xfZGlzcGxheTwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zdXJmYWNlLTAxMzA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gcG9pbnQgdG8gYSB2YWxpZCBXYXlsYW5kIDxjb2RlPndsX3N1cmZhY2U8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfV0FZTEFORF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl93aW4zMl9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFJcIj5Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUtIUlwiPlZrU3VyZmFjZUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl93aW4zMl9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSLWhpbnN0YW5jZS0wMTMwNyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhpbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBXaW4zMiA8Y29kZT5ISU5TVEFOQ0U8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSLWh3bmQtMDEzMDgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5od25kPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIFdpbjMyIDxjb2RlPkhXTkQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFItZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3hjYl9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFJcIj5Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlWGNiU3VyZmFjZUtIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUtIUlwiPlZrU3VyZmFjZUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfeGNiX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLWNvbm5lY3Rpb24tMDEzMTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb25uZWN0aW9uPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBwb2ludCB0byBhIHZhbGlkIFgxMSA8Y29kZT54Y2JfY29ubmVjdGlvbl90PC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFItd2luZG93LTAxMzExIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+d2luZG93PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIFgxMSA8Y29kZT54Y2Jfd2luZG93X3Q8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9YQ0JfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVYbGliU3VyZmFjZUtIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfeGxpYl9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVYbGliU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlWGxpYlN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFJcIj5Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVhsaWJTdXJmYWNlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVhsaWJTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUtIUlwiPlZrU3VyZmFjZUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3hsaWJfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSLWRweS0wMTMxMyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRweTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gcG9pbnQgdG8gYSB2YWxpZCBYbGliIDxjb2RlPkRpc3BsYXk8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFItd2luZG93LTAxMzE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+d2luZG93PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIFhsaWIgPGNvZGU+V2luZG93PC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFItZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBLWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQVwiPlZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEtcFN1cmZhY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19GVUNIU0lBX2ltYWdlcGlwZV9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEtaW1hZ2VQaXBlSGFuZGxlLTAwMDAwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2VQaXBlSGFuZGxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxjb2RlPnp4X2hhbmRsZV90PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQS1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQLWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUFwiPlZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AtcFN1cmZhY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19HR1Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQLXN0cmVhbURlc2NyaXB0b3ItMDI2ODEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdHJlYW1EZXNjcmlwdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxjb2RlPkdncFN0cmVhbURlc2NyaXB0b3I8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TVFJFQU1fREVTQ1JJUFRPUl9TVVJGQUNFX0NSRUFURV9JTkZPX0dHUDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUC1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlSU9TU3VyZmFjZU1WSyI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19NVktfaW9zX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUlPU1N1cmZhY2VNVkstaW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUlPU1N1cmZhY2VNVkstcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WS1wiPlZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVks8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVJT1NTdXJmYWNlTVZLLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUlPU1N1cmZhY2VNVkstcFN1cmZhY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX01WS19pb3Nfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVkstcFZpZXctMDEzMTYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVmlldzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8Y29kZT5VSVZpZXc8L2NvZGU+IGFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBiYWNrZWQgYnkgYSA8Y29kZT5DQUxheWVyPC9jb2RlPiBpbnN0YW5jZSBvZiB0eXBlIDxhIGhyZWY9XCIjQ0FNZXRhbExheWVyXCI+Q0FNZXRhbExheWVyPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVkstc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSU9TX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTVZLPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX01WS19tYWNvc19zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVNYWNPU1N1cmZhY2VNVkstaW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZU1hY09TU3VyZmFjZU1WSy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVktcIj5Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVks8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVNYWNPU1N1cmZhY2VNVkstcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLLXBTdXJmYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUtIUlwiPlZrU3VyZmFjZUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX01WS19tYWNvc19zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLLXBWaWV3LTAxMzE3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFZpZXc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGNvZGU+TlNWaWV3PC9jb2RlPiBhbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYmFja2VkIGJ5IGEgPGNvZGU+Q0FMYXllcjwvY29kZT4gaW5zdGFuY2Ugb2YgdHlwZSA8YSBocmVmPVwiI0NBTWV0YWxMYXllclwiPkNBTWV0YWxMYXllcjwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVkstc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfTUFDT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVks8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVkstcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1mbGFncy16ZXJvYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlVmlTdXJmYWNlTk4iOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfTk5fdmlfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlVmlTdXJmYWNlTk4taW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVZpU3VyZmFjZU5OLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OXCI+VmtWaVN1cmZhY2VDcmVhdGVJbmZvTk48L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVWaVN1cmZhY2VOTi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVWaVN1cmZhY2VOTi1wU3VyZmFjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1N1cmZhY2VLSFJcIj5Wa1N1cmZhY2VLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX05OX3ZpX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTi13aW5kb3ctMDEzMTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT53aW5kb3c8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGNvZGU+bm48L2NvZGU+Ojo8Y29kZT52aTwvY29kZT46Ojxjb2RlPk5hdGl2ZVdpbmRvd0hhbmRsZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1ZJX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTk48L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4tZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19FWFRfbWV0YWxfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhULWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUXCI+VmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVC1wU3VyZmFjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1N1cmZhY2VLSFJcIj5Wa1N1cmZhY2VLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19FWFRfbWV0YWxfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95U3VyZmFjZUtIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLXN1cmZhY2UtMDEyNjYiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgPGNvZGU+VmtTd2FwY2hhaW5LSFI8L2NvZGU+IG9iamVjdHMgY3JlYXRlZCBmb3IgPGNvZGU+c3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGRlc3Ryb3llZCBwcmlvciB0byBkZXN0cm95aW5nIDxjb2RlPnN1cmZhY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLXN1cmZhY2UtMDEyNjciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5zdXJmYWNlPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLTAxMjY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgbm8gPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+c3VyZmFjZTwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnN1cmZhY2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5zdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItc3VyZmFjZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zdXJmYWNlPC9jb2RlPiBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+aW5zdGFuY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSXCI+VmtEaXNwbGF5UHJvcGVydGllc0tIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2Rpc3BsYXkpKyhWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUi1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wUHJvcGVydGllczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSXCI+VmtEaXNwbGF5UHJvcGVydGllczJLSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZGlzcGxheSkrKFZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheVByb3BlcnRpZXMyS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJPUEVSVElFU18yX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheVByb3BlcnRpZXMyS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2Rpc3BsYXkpKyhWS19FWFRfZGlyZWN0X21vZGVfZGlzcGxheSkrKFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZVhsaWJEaXNwbGF5RVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQtZHB5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRweTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+RGlzcGxheTwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZVhsaWJEaXNwbGF5RVhULWRpc3BsYXktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGlzcGxheTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzcGxheUtIUlwiPlZrRGlzcGxheUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2Rpc3BsYXkpKyhWS19FWFRfZGlyZWN0X21vZGVfZGlzcGxheSkrKFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQtZHB5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRweTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+RGlzcGxheTwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULXBEaXNwbGF5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEaXNwbGF5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRGlzcGxheUtIUlwiPlZrRGlzcGxheUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtSZWxlYXNlRGlzcGxheUVYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZGlzcGxheSkrKFZLX0VYVF9kaXJlY3RfbW9kZV9kaXNwbGF5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWxlYXNlRGlzcGxheUVYVC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVsZWFzZURpc3BsYXlFWFQtZGlzcGxheS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNwbGF5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEaXNwbGF5S0hSXCI+VmtEaXNwbGF5S0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZGlzcGxheSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFItcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSXCI+VmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSsoVktfS0hSX2dldF9kaXNwbGF5X3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSXCI+VmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2Rpc3BsYXkpKyhWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfUFJPUEVSVElFU18yX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUi1wbGFuZUluZGV4LTAxMjQ5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGxhbmVJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgZGlzcGxheSBwbGFuZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYXMgZGV0ZXJtaW5lZCBieSBjYWxsaW5nIDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFItcERpc3BsYXlDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRGlzcGxheUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFItcERpc3BsYXlzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBEaXNwbGF5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBEaXNwbGF5czwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wRGlzcGxheXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wRGlzcGxheUNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrRGlzcGxheUtIUlwiPlZrRGlzcGxheUtIUjwvYT4gaGFuZGxlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUi1kaXNwbGF5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRpc3BsYXk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rpc3BsYXlLSFJcIj5Wa0Rpc3BsYXlLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFItcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFJcIj5Wa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZGlzcGxheSkrKFZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1kaXNwbGF5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRpc3BsYXk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rpc3BsYXlLSFJcIj5Wa0Rpc3BsYXlLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFJcIj5Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2Rpc3BsYXkpKyhWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9NT0RFX1BST1BFUlRJRVNfMl9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZGlzcGxheSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSLXdpZHRoLTAxOTkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPndpZHRoPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+dmlzaWJsZVJlZ2lvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUi1oZWlnaHQtMDE5OTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+aGVpZ2h0PC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+dmlzaWJsZVJlZ2lvbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUi1yZWZyZXNoUmF0ZS0wMTk5MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJlZnJlc2hSYXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEaXNwbGF5TW9kZUtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItZGlzcGxheS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNwbGF5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEaXNwbGF5S0hSXCI+VmtEaXNwbGF5S0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFJcIj5Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURpc3BsYXlNb2RlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURpc3BsYXlNb2RlS0hSLXBNb2RlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRGlzcGxheU1vZGVLSFJcIj5Wa0Rpc3BsYXlNb2RlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZGlzcGxheSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9DUkVBVEVfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFItZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSLXBhcmFtZXRlcnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGFyYW1ldGVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSXCI+VmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUi1tb2RlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rpc3BsYXlNb2RlS0hSXCI+VmtEaXNwbGF5TW9kZUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUi1wQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDYXBhYmlsaXRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFJcIj5Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSsoVktfS0hSX2dldF9kaXNwbGF5X3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSLXBEaXNwbGF5UGxhbmVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEaXNwbGF5UGxhbmVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzcGxheVBsYW5lSW5mbzJLSFJcIj5Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1wQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDYXBhYmlsaXRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSXCI+VmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlQbGFuZUluZm8yS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSsoVktfS0hSX2dldF9kaXNwbGF5X3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwbGF5UGxhbmVJbmZvMktIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX0lORk9fMl9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSLW1vZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzcGxheU1vZGVLSFJcIj5Wa0Rpc3BsYXlNb2RlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2Rpc3BsYXkpKyhWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9DQVBBQklMSVRJRVNfMl9LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2Rpc3BsYXkpKyhWS19FWFRfZGlzcGxheV9jb250cm9sKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEaXNwbGF5UG93ZXJDb250cm9sRVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGlzcGxheVBvd2VyQ29udHJvbEVYVC1kaXNwbGF5LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRpc3BsYXk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0Rpc3BsYXlLSFJcIj5Wa0Rpc3BsYXlLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEaXNwbGF5UG93ZXJDb250cm9sRVhULXBEaXNwbGF5UG93ZXJJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEaXNwbGF5UG93ZXJJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzcGxheVBvd2VySW5mb0VYVFwiPlZrRGlzcGxheVBvd2VySW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEaXNwbGF5UG93ZXJJbmZvRVhUIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSsoVktfRVhUX2Rpc3BsYXlfY29udHJvbCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheVBvd2VySW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BPV0VSX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwbGF5UG93ZXJJbmZvRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlQb3dlckluZm9FWFQtcG93ZXJTdGF0ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wb3dlclN0YXRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEaXNwbGF5UG93ZXJTdGF0ZUVYVFwiPlZrRGlzcGxheVBvd2VyU3RhdGVFWFQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9kaXNwbGF5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBDcmVhdGVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSXCI+VmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFItcFN1cmZhY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZGlzcGxheSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLXBsYW5lSW5kZXgtMDEyNTIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wbGFuZUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBkaXNwbGF5IHBsYW5lcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBhcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wbGFuZVJlb3JkZXJQb3NzaWJsZS0wMTI1MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wbGFuZVJlb3JkZXJQb3NzaWJsZTwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSPC9jb2RlPiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSPC9jb2RlPiBmb3IgdGhlIGRpc3BsYXkgY29ycmVzcG9uZGluZyB0byA8Y29kZT5kaXNwbGF5TW9kZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4gdGhlbiA8Y29kZT5wbGFuZVN0YWNrSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGRpc3BsYXkgcGxhbmVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGFzIGRldGVybWluZWQgYnkgY2FsbGluZyA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUjwvY29kZT47IG90aGVyd2lzZSA8Y29kZT5wbGFuZVN0YWNrSW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGVxdWFsIHRoZSA8Y29kZT5jdXJyZW50U3RhY2tJbmRleDwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPlZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUjwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFI8L2NvZGU+IGZvciB0aGUgZGlzcGxheSBwbGFuZSBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPmRpc3BsYXlNb2RlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItYWxwaGFNb2RlLTAxMjU0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+YWxwaGFNb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19ESVNQTEFZX1BMQU5FX0FMUEhBX0dMT0JBTF9CSVRfS0hSPC9jb2RlPiB0aGVuIDxjb2RlPmdsb2JhbEFscGhhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBiZXR3ZWVuIDxjb2RlPjA8L2NvZGU+IGFuZCA8Y29kZT4xPC9jb2RlPiwgaW5jbHVzaXZlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1hbHBoYU1vZGUtMDEyNTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hbHBoYU1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IG9yIG9uZSBvZiB0aGUgYml0cyBwcmVzZW50IGluIHRoZSA8Y29kZT5zdXBwb3J0ZWRBbHBoYTwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPlZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUjwvY29kZT4gZm9yIHRoZSBkaXNwbGF5IHBsYW5lIGNvcnJlc3BvbmRpbmcgdG8gPGNvZGU+ZGlzcGxheU1vZGU8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi13aWR0aC0wMTI1NiIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT53aWR0aDwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gbWVtYmVycyBvZiA8Y29kZT5pbWFnZUV4dGVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIHRoZSA8Y29kZT5tYXhJbWFnZURpbWVuc2lvbnMyRDwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1kaXNwbGF5TW9kZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNwbGF5TW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzcGxheU1vZGVLSFJcIj5Wa0Rpc3BsYXlNb2RlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLXRyYW5zZm9ybS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50cmFuc2Zvcm08L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUlwiPlZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItYWxwaGFNb2RlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmFscGhhTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUlwiPlZrRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19FWFRfaGVhZGxlc3Nfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhULWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUXCI+VmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVC1wU3VyZmFjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1N1cmZhY2VLSFJcIj5Wa1N1cmZhY2VLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19FWFRfaGVhZGxlc3Nfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9IRUFETEVTU19TVVJGQUNFX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUi1xdWV1ZUZhbWlseUluZGV4LTAxMjY5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUi1wU3VwcG9ydGVkLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXBwb3J0ZWQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPlZrQm9vbDMyPC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+LCBhbmQgPGNvZGU+c3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3dheWxhbmRfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1xdWV1ZUZhbWlseUluZGV4LTAxMzA2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWVGYW1pbHlJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFItZGlzcGxheS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kaXNwbGF5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT53bF9kaXNwbGF5PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3dpbjMyX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDEzMDkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWV1ZUZhbWlseUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+cFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczwvY29kZT4gZm9yIHRoZSBnaXZlbiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3hjYl9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFItcXVldWVGYW1pbHlJbmRleC0wMTMxMiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXVlRmFtaWx5SW5kZXg8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50PC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzPC9jb2RlPiBmb3IgdGhlIGdpdmVuIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1jb25uZWN0aW9uLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbm5lY3Rpb248L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiA8Y29kZT54Y2JfY29ubmVjdGlvbl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfeGxpYl9zdXJmYWNlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDEzMTUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWV1ZUZhbWlseUluZGV4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gPGNvZGU+cFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczwvY29kZT4gZm9yIHRoZSBnaXZlbiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1kcHktcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHB5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT5EaXNwbGF5PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLXBTdXJmYWNlQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlQ2FwYWJpbGl0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUlwiPlZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyKSsoVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZStWS19LSFJfd2luMzJfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUi1wTmV4dC0wMjY3MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGEgaHJlZj1cIiNWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUXCI+VmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDwvYT4gc3RydWN0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgPGNvZGU+cFN1cmZhY2VDYXBhYmlsaXRpZXM8L2NvZGU+LCBhIDxhIGhyZWY9XCIjVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVFwiPlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQ8L2E+IHN0cnVjdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIDxjb2RlPnBTdXJmYWNlSW5mbzwvY29kZT4uIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXBTdXJmYWNlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3VyZmFjZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUlwiPlZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXBTdXJmYWNlQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlQ2FwYWJpbGl0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFJcIj5Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyKSsoVktfS0hSX3dpbjMyX3N1cmZhY2UrVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFItcE5leHQtMDI2NzIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVFwiPlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUgd2l0aCBpdHMgPGNvZGU+ZnVsbFNjcmVlbkV4Y2x1c2l2ZTwvY29kZT4gbWVtYmVyIHNldCB0byA8Y29kZT5WS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQVBQTElDQVRJT05fQ09OVFJPTExFRF9FWFQ8L2NvZGU+LCBhbmQgPGNvZGU+c3VyZmFjZTwvY29kZT4gd2FzIGNyZWF0ZWQgdXNpbmcgPGEgaHJlZj1cIiN2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUlwiPnZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSPC9hPiwgYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFRcIj5Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVUkZBQ0VfSU5GT18yX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnBOZXh0PC9jb2RlPiBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUXCI+VmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ8L2E+IG9yIDxhIGhyZWY9XCIjVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVFwiPlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zdXJmYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N1cmZhY2VLSFJcIj5Wa1N1cmZhY2VLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyKSsoVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQtZnVsbFNjcmVlbkV4Y2x1c2l2ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mdWxsU2NyZWVuRXhjbHVzaXZlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUXCI+VmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIpKyhWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlKSsoVktfS0hSX3dpbjMyX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhULWhtb25pdG9yLTAyNjczIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aG1vbml0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGNvZGU+SE1PTklUT1I8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX1dJTjMyX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRFwiPlZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ8L2E+LCA8YSBocmVmPVwiI1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFJcIj5Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPC9hPiwgPGEgaHJlZj1cIiNWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUXCI+VmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDwvYT4sIG9yIDxhIGhyZWY9XCIjVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSXCI+VmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUi1zVHlwZS11bmlxdWUiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnNUeXBlPC9jb2RlPiBtZW1iZXIgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIpKyhWS19LSFJfc3VyZmFjZV9wcm90ZWN0ZWRfY2FwYWJpbGl0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19LSFI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMikrKFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NIQVJFRF9QUkVTRU5UX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyKSsoVktfQU1EX2Rpc3BsYXlfbmF0aXZlX2hkcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9OQVRJVkVfSERSX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0FNRDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyKSsoVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfRVhUX2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXN1cmZhY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3VyZmFjZUtIUlwiPlZrU3VyZmFjZUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtcFN1cmZhY2VDYXBhYmlsaXRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1cmZhY2VDYXBhYmlsaXRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVFwiPlZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+LCBhbmQgPGNvZGU+c3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzLTAxMjQ2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaW5jbHVkZSA8Y29kZT5WS19TVVJGQUNFX0NPVU5URVJfVkJMQU5LX0VYVDwvY29kZT4gdW5sZXNzIHRoZSBzdXJmYWNlIHF1ZXJpZWQgaXMgYSA8YSBocmVmPVwiI3dzaS1kaXNwbGF5LXN1cmZhY2VzXCI+ZGlzcGxheSBzdXJmYWNlPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1zdXJmYWNlLTAyNzM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3VyZmFjZTwvY29kZT4gbXVzdCBiZSBzdXBwb3J0ZWQgYnkgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+LCBhcyByZXBvcnRlZCBieSA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUlwiPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjwvYT4gb3IgYW4gZXF1aXZhbGVudCBwbGF0Zm9ybS1zcGVjaWZpYyBtZWNoYW5pc20uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1wU3VyZmFjZUZvcm1hdENvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlRm9ybWF0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSLXBTdXJmYWNlRm9ybWF0cy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wU3VyZmFjZUZvcm1hdENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wU3VyZmFjZUZvcm1hdHM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFN1cmZhY2VGb3JtYXRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cFN1cmZhY2VGb3JtYXRDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1N1cmZhY2VGb3JtYXRLSFJcIj5Wa1N1cmZhY2VGb3JtYXRLSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFItcFN1cmZhY2VJbmZvLTAyNzQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN1cmZhY2VJbmZvPC9jb2RlPi0mZ3Q7c3VyZmFjZSBtdXN0IGJlIHN1cHBvcnRlZCBieSA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4sIGFzIHJlcG9ydGVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSXCI+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSPC9hPiBvciBhbiBlcXVpdmFsZW50IHBsYXRmb3JtLXNwZWNpZmljIG1lY2hhbmlzbS4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSLXBTdXJmYWNlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3VyZmFjZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUlwiPlZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1wU3VyZmFjZUZvcm1hdENvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlRm9ybWF0Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1wU3VyZmFjZUZvcm1hdHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFN1cmZhY2VGb3JtYXRDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFN1cmZhY2VGb3JtYXRzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBTdXJmYWNlRm9ybWF0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBTdXJmYWNlRm9ybWF0Q291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtTdXJmYWNlRm9ybWF0MktIUlwiPlZrU3VyZmFjZUZvcm1hdDJLSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N1cmZhY2VGb3JtYXQyS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTdXJmYWNlRm9ybWF0MktIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZPUk1BVF8yX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3VyZmFjZUZvcm1hdDJLSFItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3VyZmFjZUtIUlwiPlZrU3VyZmFjZUtIUjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1wUHJlc2VudE1vZGVDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUHJlc2VudE1vZGVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1wUHJlc2VudE1vZGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBQcmVzZW50TW9kZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wUHJlc2VudE1vZGVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBQcmVzZW50TW9kZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUHJlc2VudE1vZGVDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1ByZXNlbnRNb2RlS0hSXCI+VmtQcmVzZW50TW9kZUtIUjwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcFN1cmZhY2VJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSXCI+VmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcFByZXNlbnRNb2RlQ291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFByZXNlbnRNb2RlQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhULXBQcmVzZW50TW9kZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFByZXNlbnRNb2RlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBQcmVzZW50TW9kZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFByZXNlbnRNb2RlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBQcmVzZW50TW9kZUNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrUHJlc2VudE1vZGVLSFJcIj5Wa1ByZXNlbnRNb2RlS0hSPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtc3dhcGNoYWluLTAyNjc0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgaW4gdGhlIHJldGlyZWQgc3RhdGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULXN3YXBjaGFpbi0wMjY3NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBzd2FwY2hhaW4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVFwiPlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUsIHdpdGggPGNvZGU+ZnVsbFNjcmVlbkV4Y2x1c2l2ZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BUFBMSUNBVElPTl9DT05UUk9MTEVEX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULXN3YXBjaGFpbi0wMjY3NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGN1cnJlbnRseSBoYXZlIGV4Y2x1c2l2ZSBmdWxsLXNjcmVlbiBhY2Nlc3MiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULXN3YXBjaGFpbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zd2FwY2hhaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbktIUlwiPlZrU3dhcGNoYWluS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+ZGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtc3dhcGNoYWluLTAyNjc3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgaW4gdGhlIHJldGlyZWQgc3RhdGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULXN3YXBjaGFpbi0wMjY3OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBzd2FwY2hhaW4gY3JlYXRlZCB3aXRoIGEgPGEgaHJlZj1cIiNWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVFwiPlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUsIHdpdGggPGNvZGU+ZnVsbFNjcmVlbkV4Y2x1c2l2ZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BUFBMSUNBVElPTl9DT05UUk9MTEVEX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSLWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSLXBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUlwiPlZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0NBUEFCSUxJVElFU19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSLXBNb2Rlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTW9kZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFJcIj5Wa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+ZGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSsoVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcFN1cmZhY2VJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTdXJmYWNlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSXCI+VmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcE1vZGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNb2RlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUlwiPlZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1zdXJmYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N1cmZhY2VLSFJcIj5Wa1N1cmZhY2VLSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSLXBSZWN0Q291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFJlY3RDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFItcFJlY3RzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBSZWN0Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBSZWN0czwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wUmVjdHM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUmVjdENvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrUmVjdDJEXCI+VmtSZWN0MkQ8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN1cmZhY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfR09PR0xFX2Rpc3BsYXlfdGltaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zd2FwY2hhaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbktIUlwiPlZrU3dhcGNoYWluS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUtcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBEaXNwbGF5VGltaW5nUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFXCI+VmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRTwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+ZGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikrKFZLX0dPT0dMRV9kaXNwbGF5X3RpbWluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRS1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtc3dhcGNoYWluLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3dhcGNoYWluS0hSXCI+VmtTd2FwY2hhaW5LSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFLXBQcmVzZW50YXRpb25UaW1pbmdDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wUHJlc2VudGF0aW9uVGltaW5nQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFLXBQcmVzZW50YXRpb25UaW1pbmdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBQcmVzZW50YXRpb25UaW1pbmdDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFByZXNlbnRhdGlvblRpbWluZ3M8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFByZXNlbnRhdGlvblRpbWluZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUHJlc2VudGF0aW9uVGltaW5nQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFXCI+VmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5kZXZpY2U8L2NvZGU+LCBhbmQgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0U3dhcGNoYWluU3RhdHVzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFItc3dhcGNoYWluLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3dhcGNoYWluS0hSXCI+VmtTd2FwY2hhaW5LSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFItY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5kZXZpY2U8L2NvZGU+LCBhbmQgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlU3dhcGNoYWluS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVN3YXBjaGFpbktIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVN3YXBjaGFpbktIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFJcIj5Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTd2FwY2hhaW5LSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU3dhcGNoYWluS0hSLXBTd2FwY2hhaW4tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbktIUlwiPlZrU3dhcGNoYWluS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zdXJmYWNlLTAxMjcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3VyZmFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBzdXJmYWNlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYXMgZGV0ZXJtaW5lZCB1c2luZyA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUlwiPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1taW5JbWFnZUNvdW50LTAxMjcxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWluSW1hZ2VDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBpbiB0aGUgPGNvZGU+bWluSW1hZ2VDb3VudDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBieSA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSXCI+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFI8L2E+IGZvciB0aGUgc3VyZmFjZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1pbkltYWdlQ291bnQtMDEyNzIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5taW5JbWFnZUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIGluIHRoZSA8Y29kZT5tYXhJbWFnZUNvdW50PC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvY29kZT4gc3RydWN0dXJlIHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPC9jb2RlPiBmb3IgdGhlIHN1cmZhY2UgaWYgdGhlIHJldHVybmVkIDxjb2RlPm1heEltYWdlQ291bnQ8L2NvZGU+IGlzIG5vdCB6ZXJvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VGb3JtYXQtMDEyNzMiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZUZvcm1hdDwvY29kZT4gYW5kIDxjb2RlPmltYWdlQ29sb3JTcGFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbWF0Y2ggdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gYW5kIDxjb2RlPmNvbG9yU3BhY2U8L2NvZGU+IG1lbWJlcnMsIHJlc3BlY3RpdmVseSwgb2Ygb25lIG9mIHRoZSA8Y29kZT5Wa1N1cmZhY2VGb3JtYXRLSFI8L2NvZGU+IHN0cnVjdHVyZXMgcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSPC9jb2RlPiBmb3IgdGhlIHN1cmZhY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUV4dGVudC0wMTI3NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlRXh0ZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBiZXR3ZWVuIDxjb2RlPm1pbkltYWdlRXh0ZW50PC9jb2RlPiBhbmQgPGNvZGU+bWF4SW1hZ2VFeHRlbnQ8L2NvZGU+LCBpbmNsdXNpdmUsIHdoZXJlIDxjb2RlPm1pbkltYWdlRXh0ZW50PC9jb2RlPiBhbmQgPGNvZGU+bWF4SW1hZ2VFeHRlbnQ8L2NvZGU+IGFyZSBtZW1iZXJzIG9mIHRoZSA8Y29kZT5Wa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvY29kZT4gZm9yIHRoZSBzdXJmYWNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VFeHRlbnQtMDE2ODkiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZUV4dGVudDwvY29kZT4gbWVtYmVycyA8Y29kZT53aWR0aDwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYm90aCBiZSBub24temVybyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlQXJyYXlMYXllcnMtMDEyNzUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZUFycmF5TGF5ZXJzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgPGNvZGU+bWF4SW1hZ2VBcnJheUxheWVyczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvY29kZT4gZm9yIHRoZSBzdXJmYWNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VTaGFyaW5nTW9kZS0wMTI3NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlU2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgPGNvZGU+cFF1ZXVlRmFtaWx5SW5kaWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDwvY29kZT4gPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtMDEyNzgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZVNoYXJpbmdNb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVDwvY29kZT4sIDxjb2RlPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjE8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcHJlVHJhbnNmb3JtLTAxMjc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cHJlVHJhbnNmb3JtPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBvbmUgb2YgdGhlIGJpdHMgcHJlc2VudCBpbiB0aGUgPGNvZGU+c3VwcG9ydGVkVHJhbnNmb3JtczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvY29kZT4gZm9yIHRoZSBzdXJmYWNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItY29tcG9zaXRlQWxwaGEtMDEyODAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21wb3NpdGVBbHBoYTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgb25lIG9mIHRoZSBiaXRzIHByZXNlbnQgaW4gdGhlIDxjb2RlPnN1cHBvcnRlZENvbXBvc2l0ZUFscGhhPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxjb2RlPlZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvY29kZT4gc3RydWN0dXJlIHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPC9jb2RlPiBmb3IgdGhlIHN1cmZhY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wcmVzZW50TW9kZS0wMTI4MSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnByZXNlbnRNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBvbmUgb2YgdGhlIDxhIGhyZWY9XCIjVmtQcmVzZW50TW9kZUtIUlwiPlZrUHJlc2VudE1vZGVLSFI8L2E+IHZhbHVlcyByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUjwvY29kZT4gZm9yIHRoZSBzdXJmYWNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItb2xkU3dhcGNoYWluLTAxOTMzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+b2xkU3dhcGNoYWluPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+b2xkU3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG5vbi1yZXRpcmVkIHN3YXBjaGFpbiBhc3NvY2lhdGVkIHdpdGggbmF0aXZlIHdpbmRvdyByZWZlcnJlZCB0byBieSA8Y29kZT5zdXJmYWNlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlRm9ybWF0LTAxNzc4IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxhIGhyZWY9XCIjc3dhcGNoYWluLXdzaS1pbWFnZS1jcmVhdGUtaW5mb1wiPmltcGxpZWQgaW1hZ2UgY3JlYXRpb24gcGFyYW1ldGVyczwvYT4gb2YgdGhlIHN3YXBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBzdXBwb3J0ZWQgYXMgcmVwb3J0ZWQgYnkgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzXCI+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUlwiPlZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPC9hPiwgPGEgaHJlZj1cIiNWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFJcIj5Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI8L2E+LCA8YSBocmVmPVwiI1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUXCI+VmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ8L2E+LCA8YSBocmVmPVwiI1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFRcIj5Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUPC9hPiwgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUXCI+VmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVDwvYT4sIG9yIDxhIGhyZWY9XCIjVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRFwiPlZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSXCI+VmtTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUjwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItc3VyZmFjZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zdXJmYWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdXJmYWNlS0hSXCI+VmtTdXJmYWNlS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUZvcm1hdC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZUZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VDb2xvclNwYWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlQ29sb3JTcGFjZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29sb3JTcGFjZUtIUlwiPlZrQ29sb3JTcGFjZUtIUjwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVVzYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlVXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlVXNhZ2VGbGFnQml0c1wiPlZrSW1hZ2VVc2FnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVVzYWdlLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlVXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW1hZ2VTaGFyaW5nTW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2hhcmluZ01vZGVcIj5Wa1NoYXJpbmdNb2RlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZVRyYW5zZm9ybS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wcmVUcmFuc2Zvcm08L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUlwiPlZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWNvbXBvc2l0ZUFscGhhLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbXBvc2l0ZUFscGhhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSXCI+VmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZXNlbnRNb2RlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnByZXNlbnRNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQcmVzZW50TW9kZUtIUlwiPlZrUHJlc2VudE1vZGVLSFI8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItb2xkU3dhcGNoYWluLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm9sZFN3YXBjaGFpbjwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPm9sZFN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU3dhcGNoYWluS0hSXCI+VmtTd2FwY2hhaW5LSFI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW9sZFN3YXBjaGFpbi1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5vbGRTd2FwY2hhaW48L2NvZGU+IGlzIGEgdmFsaWQgaGFuZGxlLCBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSA8Y29kZT5zdXJmYWNlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+b2xkU3dhcGNoYWluPC9jb2RlPiwgYW5kIDxjb2RlPnN1cmZhY2U8L2NvZGU+IHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1taW5JbWFnZUNvdW50LTAxMzgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWluSW1hZ2VDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MTwvY29kZT4gaWYgPGNvZGU+cHJlc2VudE1vZGU8L2NvZGU+IGlzIGVpdGhlciA8Y29kZT5WS19QUkVTRU5UX01PREVfU0hBUkVEX0RFTUFORF9SRUZSRVNIX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfUFJFU0VOVF9NT0RFX1NIQVJFRF9DT05USU5VT1VTX1JFRlJFU0hfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZXNlbnRNb2RlLTAxNDI3IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cHJlc2VudE1vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSPC9jb2RlPiwgPGNvZGU+VktfUFJFU0VOVF9NT0RFX01BSUxCT1hfS0hSPC9jb2RlPiwgPGNvZGU+VktfUFJFU0VOVF9NT0RFX0ZJRk9fS0hSPC9jb2RlPiBvciA8Y29kZT5WS19QUkVTRU5UX01PREVfRklGT19SRUxBWEVEX0tIUjwvY29kZT4sIDxjb2RlPmltYWdlVXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgc3Vic2V0IG9mIHRoZSBzdXBwb3J0ZWQgdXNhZ2UgZmxhZ3MgcHJlc2VudCBpbiB0aGUgPGNvZGU+c3VwcG9ydGVkVXNhZ2VGbGFnczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUlwiPlZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvYT4gc3RydWN0dXJlIHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFJcIj52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvYT4gZm9yIDxjb2RlPnN1cmZhY2U8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VVc2FnZS0wMTM4NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnByZXNlbnRNb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19QUkVTRU5UX01PREVfU0hBUkVEX0RFTUFORF9SRUZSRVNIX0tIUjwvY29kZT4gb3IgPGNvZGU+VktfUFJFU0VOVF9NT0RFX1NIQVJFRF9DT05USU5VT1VTX1JFRlJFU0hfS0hSPC9jb2RlPiwgPGNvZGU+aW1hZ2VVc2FnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBzdWJzZXQgb2YgdGhlIHN1cHBvcnRlZCB1c2FnZSBmbGFncyBwcmVzZW50IGluIHRoZSA8Y29kZT5zaGFyZWRQcmVzZW50U3VwcG9ydGVkVXNhZ2VGbGFnczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8YSBocmVmPVwiI1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFJcIj5Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPC9hPiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFJcIj52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFI8L2E+IGZvciA8Y29kZT5zdXJmYWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSshKFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VVc2FnZS0wMTI3NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmltYWdlVXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgc3Vic2V0IG9mIHRoZSBzdXBwb3J0ZWQgdXNhZ2UgZmxhZ3MgcHJlc2VudCBpbiB0aGUgPGNvZGU+c3VwcG9ydGVkVXNhZ2VGbGFnczwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI8L2NvZGU+IHN0cnVjdHVyZSByZXR1cm5lZCBieSA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvY29kZT4gZm9yIHRoZSBzdXJmYWNlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyEoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VTaGFyaW5nTW9kZS0wMTM5MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmltYWdlU2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBRdWV1ZUZhbWlseUluZGljZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSBhbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ8L2NvZGU+IHJldHVybmVkIGJ5IDxhIGhyZWY9XCIjdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllc1wiPnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXM8L2E+IGZvciB0aGUgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtMDE0MjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbWFnZVNoYXJpbmdNb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVDwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUXVldWVGYW1pbHlJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUgYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiA8Y29kZT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50PC9jb2RlPiByZXR1cm5lZCBieSBlaXRoZXIgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzXCI+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczwvYT4gb3IgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMlwiPnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyPC9hPiBmb3IgdGhlIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5kZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXBoeXNpY2FsRGV2aWNlQ291bnQtMDE0MjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgbG9naWNhbCBkZXZpY2Ugd2FzIGNyZWF0ZWQgd2l0aCA8YSBocmVmPVwiI1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvXCI+VmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5waHlzaWNhbERldmljZUNvdW50PC9jb2RlPiBlcXVhbCB0byAxLCA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGNvbnRhaW4gPGNvZGU+VktfU1dBUENIQUlOX0NSRUFURV9TUExJVF9JTlNUQU5DRV9CSU5EX1JFR0lPTlNfQklUX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikrKFZLX0tIUl9zd2FwY2hhaW5fbXV0YWJsZV9mb3JtYXQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItZmxhZ3MtMDMxNjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbnMgPGNvZGU+VktfU1dBUENIQUlOX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVRfS0hSPC9jb2RlPiB0aGVuIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSXCI+VmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSPC9hPiBzdHJ1Y3R1cmUgd2l0aCBhIDxjb2RlPnZpZXdGb3JtYXRDb3VudDwvY29kZT4gZ3JlYXRlciB0aGFuIHplcm8gYW5kIDxjb2RlPnBWaWV3Rm9ybWF0czwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhbiBlbGVtZW50IGVxdWFsIHRvIDxjb2RlPmltYWdlRm9ybWF0PC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfS0hSX3N1cmZhY2VfcHJvdGVjdGVkX2NhcGFiaWxpdGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1mbGFncy0wMzE4NyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZsYWdzPC9jb2RlPiBjb250YWlucyA8Y29kZT5WS19TV0FQQ0hBSU5fQ1JFQVRFX1BST1RFQ1RFRF9CSVRfS0hSPC9jb2RlPiwgdGhlbiA8Y29kZT5Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFI8L2NvZGU+Ojo8Y29kZT5zdXBwb3J0c1Byb3RlY3RlZDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfVFJVRTwvY29kZT4gaW4gdGhlIDxhIGhyZWY9XCIjVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSXCI+VmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSPC9hPiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFJcIj52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFI8L2E+IGZvciA8Y29kZT5zdXJmYWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZStWS19LSFJfd2luMzJfc3VyZmFjZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wTmV4dC0wMjY3OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUXCI+VmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSB3aXRoIGl0cyA8Y29kZT5mdWxsU2NyZWVuRXhjbHVzaXZlPC9jb2RlPiBtZW1iZXIgc2V0IHRvIDxjb2RlPlZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BUFBMSUNBVElPTl9DT05UUk9MTEVEX0VYVDwvY29kZT4sIGFuZCA8Y29kZT5zdXJmYWNlPC9jb2RlPiB3YXMgY3JlYXRlZCB1c2luZyA8YSBocmVmPVwiI3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSXCI+dmtDcmVhdGVXaW4zMlN1cmZhY2VLSFI8L2E+LCBhIDxhIGhyZWY9XCIjVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVFwiPlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQ8L2E+IHN0cnVjdHVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1vZGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1vZGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFJcIj5Wa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUjwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1tb2Rlcy1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tb2RlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfQU1EX2Rpc3BsYXlfbmF0aXZlX2hkcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1ELWxvY2FsRGltbWluZ0VuYWJsZS1YWFhYWCIsCisgICAgICAgICAgInRleHQiOiAiIEl0IGlzIG9ubHkgdmFsaWQgdG8gc2V0IDxjb2RlPmxvY2FsRGltbWluZ0VuYWJsZTwvY29kZT4gdG8gPGNvZGU+VktfVFJVRTwvY29kZT4gaWYgPGEgaHJlZj1cIiNWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EXCI+VmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRDwvYT46Ojxjb2RlPmxvY2FsRGltbWluZ1N1cHBvcnQ8L2NvZGU+IGlzIHN1cHBvcnRlZC4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1NldExvY2FsRGltbWluZ0FNRCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfQU1EX2Rpc3BsYXlfbmF0aXZlX2hkcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU2V0TG9jYWxEaW1taW5nQU1ELWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU2V0TG9jYWxEaW1taW5nQU1ELXN3YXBDaGFpbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zd2FwQ2hhaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbktIUlwiPlZrU3dhcGNoYWluS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU2V0TG9jYWxEaW1taW5nQU1ELWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+ZGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN3YXBDaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU2V0TG9jYWxEaW1taW5nQU1ELVhYWFhYIiwKKyAgICAgICAgICAidGV4dCI6ICIgSXQgaXMgb25seSB2YWxpZCB0byBjYWxsIDxhIGhyZWY9XCIjdmtTZXRMb2NhbERpbW1pbmdBTURcIj52a1NldExvY2FsRGltbWluZ0FNRDwvYT4gaWYgPGEgaHJlZj1cIiNWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EXCI+VmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRDwvYT46Ojxjb2RlPmxvY2FsRGltbWluZ1N1cHBvcnQ8L2NvZGU+IGlzIHN1cHBvcnRlZC4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19FWFRfZGlzcGxheV9jb250cm9sKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVC1zdXJmYWNlQ291bnRlcnMtMDEyNDQiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgYml0cyBpbiA8Y29kZT5zdXJmYWNlQ291bnRlcnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHN1cHBvcnRlZCBieSA8YSBocmVmPVwiI1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUlwiPlZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjwvYT46Ojxjb2RlPnN1cmZhY2U8L2NvZGU+LCBhcyByZXBvcnRlZCBieSA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVFwiPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVDwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DT1VOVEVSX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQtc3VyZmFjZUNvdW50ZXJzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN1cmZhY2VDb3VudGVyczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVFwiPlZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVDwvYT4gdmFsdWVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19FWFRfZGlzcGxheV9jb250cm9sKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULXN3YXBjaGFpbi0wMTI0NSIsCisgICAgICAgICAgInRleHQiOiAiIE9uZSBvciBtb3JlIHByZXNlbnQgY29tbWFuZHMgb24gPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBwcmVzZW50YXRpb24gZW5naW5lLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0U3dhcGNoYWluQ291bnRlckVYVC1zd2FwY2hhaW4tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTd2FwY2hhaW5LSFJcIj5Wa1N3YXBjaGFpbktIUjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtY291bnRlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb3VudGVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUXCI+VmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULXBDb3VudGVyVmFsdWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENvdW50ZXJWYWx1ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDY0X3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5kZXZpY2U8L2NvZGU+LCBhbmQgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVzdHJveVN3YXBjaGFpbktIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U3dhcGNoYWluS0hSLXN3YXBjaGFpbi0wMTI4MiIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCB1c2VzIG9mIHByZXNlbnRhYmxlIGltYWdlcyBhY3F1aXJlZCBmcm9tIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItc3dhcGNoYWluLTAxMjgzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9jb2RlPiB3ZXJlIHByb3ZpZGVkIHdoZW4gPGNvZGU+c3dhcGNoYWluPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U3dhcGNoYWluS0hSLXN3YXBjaGFpbi0wMTI4NCIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U3dhcGNoYWluS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zd2FwY2hhaW48L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5zd2FwY2hhaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbktIUlwiPlZrU3dhcGNoYWluS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveVN3YXBjaGFpbktIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95U3dhcGNoYWluS0hSLWNvbW1vbnBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIEJvdGggb2YgPGNvZGU+ZGV2aWNlPC9jb2RlPiwgYW5kIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXBDcmVhdGVJbmZvcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mb3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zd2FwY2hhaW5Db3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFJcIj5Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FsbG9jYXRpb25DYWxsYmFja3NcIj5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXBTd2FwY2hhaW5zLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBTd2FwY2hhaW5zPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c3dhcGNoYWluQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtTd2FwY2hhaW5LSFJcIj5Wa1N3YXBjaGFpbktIUjwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1zd2FwY2hhaW4tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTd2FwY2hhaW5LSFJcIj5Wa1N3YXBjaGFpbktIUjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1wU3dhcGNoYWluSW1hZ2VDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3dhcGNoYWluSW1hZ2VDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1wU3dhcGNoYWluSW1hZ2VzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBTd2FwY2hhaW5JbWFnZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wU3dhcGNoYWluSW1hZ2VzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBTd2FwY2hhaW5JbWFnZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wU3dhcGNoYWluSW1hZ2VDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa0ltYWdlXCI+VmtJbWFnZTwvYT4gaGFuZGxlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFItY29tbW9ucGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgQm90aCBvZiA8Y29kZT5kZXZpY2U8L2NvZGU+LCBhbmQgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQWNxdWlyZU5leHRJbWFnZUtIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXN3YXBjaGFpbi0wMTI4NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGluIHRoZSByZXRpcmVkIHN0YXRlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItc2VtYXBob3JlLTAxMjg2IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bnNpZ25hbGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItc2VtYXBob3JlLTAxNzc5IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgaGF2ZSBhbnkgdW5jb21wbGV0ZWQgc2lnbmFsIG9yIHdhaXQgb3BlcmF0aW9ucyBwZW5kaW5nIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItZmVuY2UtMDEyODciLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mZW5jZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5zaWduYWxlZCBhbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgb3RoZXIgcXVldWUgY29tbWFuZCB0aGF0IGhhcyBub3QgeWV0IGNvbXBsZXRlZCBleGVjdXRpb24gb24gdGhhdCBxdWV1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS0wMTc4MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gYW5kIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYm90aCBiZSBlcXVhbCB0byA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItc3dhcGNoYWluLTAxODAyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgYWNxdWlyZWQgaW1hZ2VzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgaW1hZ2VzIGluIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gYW5kIHRoZSB2YWx1ZSBvZiA8YSBocmVmPVwiI1ZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUlwiPlZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvYT46Ojxjb2RlPm1pbkltYWdlQ291bnQ8L2NvZGU+IGFzIHJldHVybmVkIGJ5IGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUlwiPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUjwvYT4gd2l0aCB0aGUgPGNvZGU+c3VyZmFjZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiwgPGNvZGU+dGltZW91dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlVJTlQ2NF9NQVg8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zd2FwY2hhaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbktIUlwiPlZrU3dhcGNoYWluS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVcIj5Wa1NlbWFwaG9yZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItZmVuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+ZmVuY2U8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5mZW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRmVuY2VcIj5Wa0ZlbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1wSW1hZ2VJbmRleC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW1hZ2VJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItc2VtYXBob3JlLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1mZW5jZS1wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mZW5jZTwvY29kZT4gaXMgYSB2YWxpZCBoYW5kbGUsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmRldmljZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmRldmljZTwvY29kZT4sIGFuZCA8Y29kZT5zd2FwY2hhaW48L2NvZGU+IHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtMDMyNjUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zZW1hcGhvcmU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSA8YSBocmVmPVwiI1ZrU2VtYXBob3JlVHlwZUtIUlwiPlZrU2VtYXBob3JlVHlwZUtIUjwvYT4gb2YgPGNvZGU+VktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlMktIUi1zd2FwY2hhaW4tMDE4MDMiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBhY3F1aXJlZCBpbWFnZXMgaXMgZ3JlYXRlciB0aGFuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG51bWJlciBvZiBpbWFnZXMgaW4gdGhlIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBBY3F1aXJlSW5mbzwvY29kZT4gYW5kIHRoZSB2YWx1ZSBvZiA8YSBocmVmPVwiI1ZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUlwiPlZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUjwvYT46Ojxjb2RlPm1pbkltYWdlQ291bnQ8L2NvZGU+IGFzIHJldHVybmVkIGJ5IGEgY2FsbCB0byA8YSBocmVmPVwiI3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUlwiPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUjwvYT4gd2l0aCB0aGUgPGNvZGU+c3VyZmFjZTwvY29kZT4gdXNlZCB0byBjcmVhdGUgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiwgdGhlIDxjb2RlPnRpbWVvdXQ8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wQWNxdWlyZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5VSU5UNjRfTUFYPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlMktIUi1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2UyS0hSLXBBY3F1aXJlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQWNxdWlyZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUlwiPlZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlMktIUi1wSW1hZ2VJbmRleC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wSW1hZ2VJbmRleDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2RldmljZV9ncm91cCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc3dhcGNoYWluLTAxNjc1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgaW4gdGhlIHJldGlyZWQgc3RhdGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc2VtYXBob3JlLTAxMjg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bnNpZ25hbGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXNlbWFwaG9yZS0wMTc4MSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4gaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGhhdmUgYW55IHVuY29tcGxldGVkIHNpZ25hbCBvciB3YWl0IG9wZXJhdGlvbnMgcGVuZGluZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1mZW5jZS0wMTI4OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmZlbmNlPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiBpdCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bnNpZ25hbGVkIGFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBvdGhlciBxdWV1ZSBjb21tYW5kIHRoYXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGV4ZWN1dGlvbiBvbiB0aGF0IHF1ZXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXNlbWFwaG9yZS0wMTc4MiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gYW5kIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYm90aCBiZSBlcXVhbCB0byA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLWRldmljZU1hc2stMDEyOTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGRldmljZSBtYXNrIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLWRldmljZU1hc2stMDEyOTEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2VNYXNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgemVybyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX05FWFRfSU1BR0VfSU5GT19LSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zd2FwY2hhaW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbktIUlwiPlZrU3dhcGNoYWluS0hSPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPnNlbWFwaG9yZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrU2VtYXBob3JlXCI+VmtTZW1hcGhvcmU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1mZW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5mZW5jZTwvY29kZT4gaXMgbm90IDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4sIDxjb2RlPmZlbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGZW5jZVwiPlZrRmVuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmZlbmNlPC9jb2RlPiwgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiwgYW5kIDxjb2RlPnN3YXBjaGFpbjwvY29kZT4gdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfZGV2aWNlX2dyb3VwKSsoVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc2VtYXBob3JlLTAzMjY2IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c2VtYXBob3JlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGEgaHJlZj1cIiNWa1NlbWFwaG9yZVR5cGVLSFJcIj5Wa1NlbWFwaG9yZVR5cGVLSFI8L2E+IG9mIDxjb2RlPlZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtRdWV1ZVByZXNlbnRLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVQcmVzZW50S0hSLXBTd2FwY2hhaW5zLTAxMjkyIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCBlbGVtZW50IG9mIDxjb2RlPnBTd2FwY2hhaW5zPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFByZXNlbnRJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHN3YXBjaGFpbiB0aGF0IGlzIGNyZWF0ZWQgZm9yIGEgc3VyZmFjZSBmb3Igd2hpY2ggcHJlc2VudGF0aW9uIGlzIHN1cHBvcnRlZCBmcm9tIDxjb2RlPnF1ZXVlPC9jb2RlPiBhcyBkZXRlcm1pbmVkIHVzaW5nIGEgY2FsbCB0byA8Y29kZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wV2FpdFNlbWFwaG9yZXMtMDEyOTQiLAorICAgICAgICAgICJ0ZXh0IjogIiBXaGVuIGEgc2VtYXBob3JlIHdhaXQgb3BlcmF0aW9uIHJlZmVycmluZyB0byBhIGJpbmFyeSBzZW1hcGhvcmUgZGVmaW5lZCBieSB0aGUgZWxlbWVudHMgb2YgdGhlIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBQcmVzZW50SW5mbzwvY29kZT4gZXhlY3V0ZXMgb24gPGNvZGU+cXVldWU8L2NvZGU+LCB0aGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBubyBvdGhlciBxdWV1ZXMgd2FpdGluZyBvbiB0aGUgc2FtZSBzZW1hcGhvcmUuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wV2FpdFNlbWFwaG9yZXMtMDEyOTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgdGhlIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gbWVtYmVyIG9mIDxjb2RlPnBQcmVzZW50SW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgc2VtYXBob3JlcyB0aGF0IGFyZSBzaWduYWxlZCwgb3IgaGF2ZSA8YSBocmVmPVwiI3N5bmNocm9uaXphdGlvbi1zZW1hcGhvcmVzLXNpZ25hbGluZ1wiPnNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uczwvYT4gcHJldmlvdXNseSBzdWJtaXR0ZWQgZm9yIGV4ZWN1dGlvbi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVQcmVzZW50S0hSLXF1ZXVlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXVlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWV1ZVwiPlZrUXVldWU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcFByZXNlbnRJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcmVzZW50SW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1ByZXNlbnRJbmZvS0hSXCI+VmtQcmVzZW50SW5mb0tIUjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wU3dhcGNoYWlucy0wMTI5MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIG1vcmUgdGhhbiBvbmUgbWVtYmVyIG9mIDxjb2RlPnBTd2FwY2hhaW5zPC9jb2RlPiB3YXMgY3JlYXRlZCBmcm9tIGEgZGlzcGxheSBzdXJmYWNlLCBhbGwgZGlzcGxheSBzdXJmYWNlcyByZWZlcmVuY2VkIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgZGlzcGxheSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiB1c2UgdGhlIHNhbWUgZGlzcGxheSBtb2RlIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19LSFJfdGltZWxpbmVfc2VtYXBob3JlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcFdhaXRTZW1hcGhvcmVzLTAzMjY3IiwKKyAgICAgICAgICAidGV4dCI6ICIgQWxsIGVsZW1lbnRzIG9mIHRoZSA8Y29kZT5wV2FpdFNlbWFwaG9yZXM8L2NvZGU+IG1lbWJlciBvZiA8Y29kZT5wUHJlc2VudEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGNyZWF0ZWQgd2l0aCBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrUXVldWVQcmVzZW50S0hSLXBXYWl0U2VtYXBob3Jlcy0wMzI2OCIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBlbGVtZW50cyBvZiB0aGUgPGNvZGU+cFdhaXRTZW1hcGhvcmVzPC9jb2RlPiBtZW1iZXIgb2YgPGNvZGU+cFByZXNlbnRJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiByZWZlcmVuY2UgYSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgZXhlY3V0aW9uIGFuZCBhbnkgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb25zIG9uIHdoaWNoIGl0IGRlcGVuZHMgKGlmIGFueSkgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhbHNvIGJlZW4gc3VibWl0dGVkIGZvciBleGVjdXRpb24uIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQcmVzZW50SW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSshKFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBJbWFnZUluZGljZXMtMDEyOTYiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIGVsZW1lbnQgb2YgPGNvZGU+cEltYWdlSW5kaWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIGluZGV4IG9mIGEgcHJlc2VudGFibGUgaW1hZ2UgYWNxdWlyZWQgZnJvbSB0aGUgc3dhcGNoYWluIHNwZWNpZmllZCBieSB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoZSA8Y29kZT5wU3dhcGNoYWluczwvY29kZT4gYXJyYXksIGFuZCB0aGUgcHJlc2VudGVkIGltYWdlIHN1YnJlc291cmNlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8Y29kZT5WS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSPC9jb2RlPiBsYXlvdXQgYXQgdGhlIHRpbWUgdGhlIG9wZXJhdGlvbiBpcyBleGVjdXRlZCBvbiBhIDxjb2RlPlZrRGV2aWNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHJlc2VudEluZm9LSFItcEltYWdlSW5kaWNlcy0wMTQzMCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggZWxlbWVudCBvZiA8Y29kZT5wSW1hZ2VJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB0aGUgaW5kZXggb2YgYSBwcmVzZW50YWJsZSBpbWFnZSBhY3F1aXJlZCBmcm9tIHRoZSBzd2FwY2hhaW4gc3BlY2lmaWVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIDxjb2RlPnBTd2FwY2hhaW5zPC9jb2RlPiBhcnJheSwgYW5kIHRoZSBwcmVzZW50ZWQgaW1hZ2Ugc3VicmVzb3VyY2UgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFI8L2NvZGU+IG9yIDxjb2RlPlZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFI8L2NvZGU+IGxheW91dCBhdCB0aGUgdGltZSB0aGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIG9uIGEgPGNvZGU+VmtEZXZpY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19LSFJfdGltZWxpbmVfc2VtYXBob3JlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wV2FpdFNlbWFwaG9yZXMtMDMyNjkiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbGwgZWxlbWVudHMgb2YgdGhlIDxjb2RlPnBXYWl0U2VtYXBob3JlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlS0hSXCI+VmtTZW1hcGhvcmVUeXBlS0hSPC9hPiBvZiA8Y29kZT5WS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+cE5leHQ8L2NvZGU+IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZWl0aGVyIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSXCI+VmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSPC9hPiwgPGEgaHJlZj1cIiNWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUlwiPlZrRGlzcGxheVByZXNlbnRJbmZvS0hSPC9hPiwgPGEgaHJlZj1cIiNWa1ByZXNlbnRGcmFtZVRva2VuR0dQXCI+VmtQcmVzZW50RnJhbWVUb2tlbkdHUDwvYT4sIDxhIGhyZWY9XCIjVmtQcmVzZW50UmVnaW9uc0tIUlwiPlZrUHJlc2VudFJlZ2lvbnNLSFI8L2E+LCBvciA8YSBocmVmPVwiI1ZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRVwiPlZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHJlc2VudEluZm9LSFItc1R5cGUtdW5pcXVlIiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5zVHlwZTwvY29kZT4gbWVtYmVyIGluIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdW5pcXVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBXYWl0U2VtYXBob3Jlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT53YWl0U2VtYXBob3JlQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFdhaXRTZW1hcGhvcmVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+d2FpdFNlbWFwaG9yZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrU2VtYXBob3JlXCI+VmtTZW1hcGhvcmU8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHJlc2VudEluZm9LSFItcFN3YXBjaGFpbnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFN3YXBjaGFpbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zd2FwY2hhaW5Db3VudDwvY29kZT4gdmFsaWQgPGEgaHJlZj1cIiNWa1N3YXBjaGFpbktIUlwiPlZrU3dhcGNoYWluS0hSPC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBJbWFnZUluZGljZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEltYWdlSW5kaWNlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnN3YXBjaGFpbkNvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBSZXN1bHRzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBSZXN1bHRzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBSZXN1bHRzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+c3dhcGNoYWluQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtSZXN1bHRcIj5Wa1Jlc3VsdDwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5wU3dhcGNoYWluczwvY29kZT4sIGFuZCB0aGUgZWxlbWVudHMgb2YgPGNvZGU+cFdhaXRTZW1hcGhvcmVzPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1ByZXNlbnRSZWdpb25zS0hSIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19LSFJfaW5jcmVtZW50YWxfcHJlc2VudCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHJlc2VudFJlZ2lvbnNLSFItc3dhcGNoYWluQ291bnQtMDEyNjAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zd2FwY2hhaW5Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIHNhbWUgdmFsdWUgYXMgPGNvZGU+VmtQcmVzZW50SW5mb0tIUjwvY29kZT46Ojxjb2RlPnN3YXBjaGFpbkNvdW50PC9jb2RlPiwgd2hlcmUgPGNvZGU+VmtQcmVzZW50SW5mb0tIUjwvY29kZT4gaXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiB0aGlzIDxjb2RlPlZrUHJlc2VudFJlZ2lvbnNLSFI8L2NvZGU+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50UmVnaW9uc0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1JFR0lPTlNfS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50UmVnaW9uc0tIUi1wUmVnaW9ucy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wUmVnaW9uczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wUmVnaW9uczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnN3YXBjaGFpbkNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrUHJlc2VudFJlZ2lvbktIUlwiPlZrUHJlc2VudFJlZ2lvbktIUjwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50UmVnaW9uc0tIUi1zd2FwY2hhaW5Db3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnN3YXBjaGFpbkNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1ByZXNlbnRSZWdpb25LSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikrKFZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50UmVnaW9uS0hSLXBSZWN0YW5nbGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnJlY3RhbmdsZUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wUmVjdGFuZ2xlczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wUmVjdGFuZ2xlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnJlY3RhbmdsZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrUmVjdExheWVyS0hSXCI+VmtSZWN0TGF5ZXJLSFI8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1JlY3RMYXllcktIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1JlY3RMYXllcktIUi1vZmZzZXQtMDEyNjEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgc3VtIG9mIDxjb2RlPm9mZnNldDwvY29kZT4gYW5kIDxjb2RlPmV4dGVudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbm8gZ3JlYXRlciB0aGFuIHRoZSA8Y29kZT5pbWFnZUV4dGVudDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFI8L2NvZGU+IHN0cnVjdHVyZSBnaXZlbiB0byA8YSBocmVmPVwiI3ZrQ3JlYXRlU3dhcGNoYWluS0hSXCI+dmtDcmVhdGVTd2FwY2hhaW5LSFI8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtSZWN0TGF5ZXJLSFItbGF5ZXItMDEyNjIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5sYXllcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIDxjb2RlPmltYWdlQXJyYXlMYXllcnM8L2NvZGU+IG1lbWJlciBvZiB0aGUgPGNvZGU+VmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPC9jb2RlPiBzdHJ1Y3R1cmUgZ2l2ZW4gdG8gPGEgaHJlZj1cIiN2a0NyZWF0ZVN3YXBjaGFpbktIUlwiPnZrQ3JlYXRlU3dhcGNoYWluS0hSPC9hPi4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfS0hSX2Rpc3BsYXlfc3dhcGNoYWluKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEaXNwbGF5UHJlc2VudEluZm9LSFItc3JjUmVjdC0wMTI1NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNyY1JlY3Q8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHNwZWNpZnkgYSByZWN0YW5ndWxhciByZWdpb24gdGhhdCBpcyBhIHN1YnNldCBvZiB0aGUgaW1hZ2UgYmVpbmcgcHJlc2VudGVkIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUi1kc3RSZWN0LTAxMjU4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0UmVjdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3BlY2lmeSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiB0aGF0IGlzIGEgc3Vic2V0IG9mIHRoZSA8Y29kZT52aXNpYmxlUmVnaW9uPC9jb2RlPiBwYXJhbWV0ZXIgb2YgdGhlIGRpc3BsYXkgbW9kZSB0aGUgc3dhcGNoYWluIGJlaW5nIHByZXNlbnRlZCB1c2VzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUi1wZXJzaXN0ZW50Q29udGVudC0wMTI1OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wZXJzaXN0ZW50Q29udGVudDwvY29kZT4gbWVtYmVyIG9mIHRoZSA8Y29kZT5Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSPC9jb2RlPiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSPC9jb2RlPiBmb3IgdGhlIGRpc3BsYXkgdGhlIHByZXNlbnQgb3BlcmF0aW9uIHRhcmdldHMgdGhlbiA8Y29kZT5wZXJzaXN0ZW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19GQUxTRTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGlzcGxheVByZXNlbnRJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJFU0VOVF9JTkZPX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9kZXZpY2VfZ3JvdXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItc3dhcGNoYWluQ291bnQtMDEyOTciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zd2FwY2hhaW5Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gZXF1YWwgPGNvZGU+MDwvY29kZT4gb3IgPGEgaHJlZj1cIiNWa1ByZXNlbnRJbmZvS0hSXCI+VmtQcmVzZW50SW5mb0tIUjwvYT46Ojxjb2RlPnN3YXBjaGFpbkNvdW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLW1vZGUtMDEyOTgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5tb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX0xPQ0FMX0JJVF9LSFI8L2NvZGU+LCB0aGVuIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wRGV2aWNlTWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgZXhhY3RseSBvbmUgYml0IHNldCwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgPGEgaHJlZj1cIiNWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUlwiPlZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPC9hPjo6PGNvZGU+cHJlc2VudE1hc2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIG5vbi16ZXJvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItbW9kZS0wMTI5OSIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm1vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfUkVNT1RFX0JJVF9LSFI8L2NvZGU+LCB0aGVuIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wRGV2aWNlTWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgZXhhY3RseSBvbmUgYml0IHNldCwgYW5kIHNvbWUgcGh5c2ljYWwgZGV2aWNlIGluIHRoZSBsb2dpY2FsIGRldmljZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBpbmNsdWRlIHRoYXQgYml0IGluIGl0cyA8YSBocmVmPVwiI1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSXCI+VmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI8L2E+Ojo8Y29kZT5wcmVzZW50TWFzazwvY29kZT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItbW9kZS0wMTMwMCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm1vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfU1VNX0JJVF9LSFI8L2NvZGU+LCB0aGVuIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wRGV2aWNlTWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYSB2YWx1ZSBmb3Igd2hpY2ggYWxsIHNldCBiaXRzIGFyZSBzZXQgaW4gb25lIG9mIHRoZSBlbGVtZW50cyBvZiA8YSBocmVmPVwiI1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSXCI+VmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI8L2E+Ojo8Y29kZT5wcmVzZW50TWFzazwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1tb2RlLTAxMzAxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bW9kZTwvY29kZT4gaXMgPGNvZGU+VktfREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9MT0NBTF9NVUxUSV9ERVZJQ0VfQklUX0tIUjwvY29kZT4sIHRoZW4gZm9yIGVhY2ggYml0IHNldCBpbiBlYWNoIGVsZW1lbnQgb2YgPGNvZGU+cERldmljZU1hc2tzPC9jb2RlPiwgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiA8YSBocmVmPVwiI1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSXCI+VmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI8L2E+Ojo8Y29kZT5wcmVzZW50TWFzazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbm9uLXplcm8iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1wRGV2aWNlTWFza3MtMDEzMDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgdmFsdWUgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBEZXZpY2VNYXNrczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZXF1YWwgdG8gdGhlIGRldmljZSBtYXNrIHBhc3NlZCBpbiA8YSBocmVmPVwiI1ZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFJcIj5Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSPC9hPjo6PGNvZGU+ZGV2aWNlTWFzazwvY29kZT4gd2hlbiB0aGUgaW1hZ2UgaW5kZXggd2FzIGxhc3QgYWNxdWlyZWQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1tb2RlLTAxMzAzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBleGFjdGx5IG9uZSBiaXQgc2V0LCBhbmQgdGhhdCBiaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluIDxhIGhyZWY9XCIjVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFJcIj5Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjwvYT46Ojxjb2RlPm1vZGVzPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0lORk9fS0hSPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLXBEZXZpY2VNYXNrcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zd2FwY2hhaW5Db3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5wRGV2aWNlTWFza3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zd2FwY2hhaW5Db3VudDwvY29kZT4gPGNvZGU+dWludDMyX3Q8L2NvZGU+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLW1vZGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bW9kZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSXCI+VmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQcmVzZW50VGltZXNJbmZvR09PR0xFIjogeworICAgICAgIihWS19LSFJfc3VyZmFjZSkrKFZLX0tIUl9zd2FwY2hhaW4pKyhWS19HT09HTEVfZGlzcGxheV90aW1pbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUtc3dhcGNoYWluQ291bnQtMDEyNDciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zd2FwY2hhaW5Db3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgdGhlIHNhbWUgdmFsdWUgYXMgPGNvZGU+VmtQcmVzZW50SW5mb0tIUjwvY29kZT46Ojxjb2RlPnN3YXBjaGFpbkNvdW50PC9jb2RlPiwgd2hlcmUgPGNvZGU+VmtQcmVzZW50SW5mb0tIUjwvY29kZT4gaXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiBvZiB0aGlzIDxjb2RlPlZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRTwvY29kZT4gc3RydWN0dXJlLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEU8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUtcFRpbWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBUaW1lczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wVGltZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5zd2FwY2hhaW5Db3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa1ByZXNlbnRUaW1lR09PR0xFXCI+VmtQcmVzZW50VGltZUdPT0dMRTwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUHJlc2VudEZyYW1lVG9rZW5HR1AiOiB7CisgICAgICAiKFZLX0tIUl9zdXJmYWNlKSsoVktfS0hSX3N3YXBjaGFpbikrKFZLX0dHUF9mcmFtZV90b2tlbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHJlc2VudEZyYW1lVG9rZW5HR1AtZnJhbWVUb2tlbi0wMjY4MCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZyYW1lVG9rZW48L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGNvZGU+R2dwRnJhbWVUb2tlbjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUHJlc2VudEZyYW1lVG9rZW5HR1Atc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9GUkFNRV9UT0tFTl9HR1A8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtTZXRIZHJNZXRhZGF0YUVYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfRVhUX2hkcl9tZXRhZGF0YSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU2V0SGRyTWV0YWRhdGFFWFQtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmRldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtTZXRIZHJNZXRhZGF0YUVYVC1wU3dhcGNoYWlucy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wU3dhcGNoYWluczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnN3YXBjaGFpbkNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrU3dhcGNoYWluS0hSXCI+VmtTd2FwY2hhaW5LSFI8L2E+IGhhbmRsZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU2V0SGRyTWV0YWRhdGFFWFQtcE1ldGFkYXRhLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNZXRhZGF0YTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnN3YXBjaGFpbkNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrSGRyTWV0YWRhdGFFWFRcIj5Wa0hkck1ldGFkYXRhRVhUPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NldEhkck1ldGFkYXRhRVhULXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3dhcGNoYWluQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtTZXRIZHJNZXRhZGF0YUVYVC1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBCb3RoIG9mIDxjb2RlPmRldmljZTwvY29kZT4sIGFuZCB0aGUgZWxlbWVudHMgb2YgPGNvZGU+cFN3YXBjaGFpbnM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtIZHJNZXRhZGF0YUVYVCI6IHsKKyAgICAgICIoVktfS0hSX3N1cmZhY2UpKyhWS19LSFJfc3dhcGNoYWluKSsoVktfRVhUX2hkcl9tZXRhZGF0YSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSGRyTWV0YWRhdGFFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfSERSX01FVEFEQVRBX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSGRyTWV0YWRhdGFFWFQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFRyYWNlUmF5c05WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjY5MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IGlzIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfTElORUFSPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcmIzgyMTc7cyA8YSBocmVmPVwiI3Jlc291cmNlcy1pbWFnZS12aWV3LWZvcm1hdC1mZWF0dXJlc1wiPmZvcm1hdCBmZWF0dXJlczwvYT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gY29udGFpbiA8Y29kZT5WS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgYSA8Y29kZT5Wa0ltYWdlVmlldzwvY29kZT4gaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggc2V0IDxlbT5uPC9lbT4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBib3VuZCB0byA8ZW0+bjwvZW0+IGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCA8ZW0+bjwvZW0+LCB3aXRoIHRoZSA8Y29kZT5Wa1BpcGVsaW5lTGF5b3V0PC9jb2RlPiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9XCIjZGVzY3JpcHRvcnNldHMtY29tcGF0aWJpbGl0eVwiPlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5PC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjk4IiwKKyAgICAgICAgICAidGV4dCI6ICIgRm9yIGVhY2ggcHVzaCBjb25zdGFudCB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdGhhdCBpcyBjb21wYXRpYmxlIGZvciBwdXNoIGNvbnN0YW50cywgd2l0aCB0aGUgPGNvZGU+VmtQaXBlbGluZUxheW91dDwvY29kZT4gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4sIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPVwiI2Rlc2NyaXB0b3JzZXRzLWNvbXBhdGliaWxpdHlcIj5QaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjY5OSIsCisgICAgICAgICAgInRleHQiOiAiIERlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgPGNvZGU+dmtDbWRCaW5kRGVzY3JpcHRvclNldHM8L2NvZGU+LCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI3MDAiLAorICAgICAgICAgICJ0ZXh0IjogIiBBIHZhbGlkIHBpcGVsaW5lIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1hbmRCdWZmZXItMDI3MDEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBzZXQgZm9yIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI3MDIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgPGNvZGU+VmtTYW1wbGVyPC9jb2RlPiBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSA8Y29kZT5Wa0ltYWdlPC9jb2RlPiB3aXRoIGEgPGNvZGU+VmtJbWFnZVZpZXc8L2NvZGU+IG9mIHRoZSB0eXBlIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8zRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZPC9jb2RlPiwgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZPC9jb2RlPiBvciA8Y29kZT5WS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWTwvY29kZT4sIGluIGFueSBzaGFkZXIgc3RhZ2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjcwMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSA8Y29kZT5Wa1NhbXBsZXI8L2NvZGU+IG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViA8Y29kZT5PcEltYWdlU2FtcGxlKjwvY29kZT4gb3IgPGNvZGU+T3BJbWFnZVNwYXJzZVNhbXBsZSo8L2NvZGU+IGluc3RydWN0aW9ucyB3aXRoIDxjb2RlPkltcGxpY2l0TG9kPC9jb2RlPiwgPGNvZGU+RHJlZjwvY29kZT4gb3IgPGNvZGU+UHJvajwvY29kZT4gaW4gdGhlaXIgbmFtZSwgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNzA0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIDxjb2RlPlZrU2FtcGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIDxjb2RlPk9wSW1hZ2VTYW1wbGUqPC9jb2RlPiBvciA8Y29kZT5PcEltYWdlU3BhcnNlU2FtcGxlKjwvY29kZT4gaW5zdHJ1Y3Rpb25zIHRoYXQgaW5jbHVkZXMgYSBMT0QgYmlhcyBvciBhbnkgb2Zmc2V0IHZhbHVlcywgaW4gYW55IHNoYWRlciBzdGFnZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNzA1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIDxhIGhyZWY9XCIjZmVhdHVyZXMtcm9idXN0QnVmZmVyQWNjZXNzXCI+cm9idXN0IGJ1ZmZlciBhY2Nlc3M8L2E+IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI3MDYiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGEgaHJlZj1cIiNmZWF0dXJlcy1yb2J1c3RCdWZmZXJBY2Nlc3NcIj5yb2J1c3QgYnVmZmVyIGFjY2VzczwvYT4gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSA8Y29kZT5Wa1BpcGVsaW5lPC9jb2RlPiBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldC0wMjQ1NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5yYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLXJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQtMDI0NTYiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPC9jb2RlPjo6PGNvZGU+c2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1taXNzU2hhZGVyQmluZGluZ09mZnNldC0wMjQ1NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgPGNvZGU+bWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQtMDI0NTgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5taXNzU2hhZGVyQmluZGluZ09mZnNldDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvY29kZT46Ojxjb2RlPnNoYWRlckdyb3VwQmFzZUFsaWdubWVudDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtaGl0U2hhZGVyQmluZGluZ09mZnNldC0wMjQ1OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmhpdFNoYWRlckJpbmRpbmdPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5oaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWhpdFNoYWRlckJpbmRpbmdPZmZzZXQtMDI0NjAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oaXRTaGFkZXJCaW5kaW5nT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPC9jb2RlPjo6PGNvZGU+c2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQtMDI0NjEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiA8Y29kZT5jYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlcjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LTAyNDYyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPC9jb2RlPjo6PGNvZGU+c2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1taXNzU2hhZGVyQmluZGluZ1N0cmlkZS0wMjQ2MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPC9jb2RlPjo6PGNvZGU+c2hhZGVyR3JvdXBIYW5kbGVTaXplPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1oaXRTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGl0U2hhZGVyQmluZGluZ1N0cmlkZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBtdWx0aXBsZSBvZiA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvY29kZT46Ojxjb2RlPnNoYWRlckdyb3VwSGFuZGxlU2l6ZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY1IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG11bHRpcGxlIG9mIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPC9jb2RlPjo6PGNvZGU+c2hhZGVyR3JvdXBIYW5kbGVTaXplPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1taXNzU2hhZGVyQmluZGluZ1N0cmlkZS0wMjQ2NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvY29kZT46Ojxjb2RlPm1heFNoYWRlckdyb3VwU3RyaWRlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1oaXRTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGl0U2hhZGVyQmluZGluZ1N0cmlkZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY8L2NvZGU+Ojo8Y29kZT5tYXhTaGFkZXJHcm91cFN0cmlkZTwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvY29kZT46Ojxjb2RlPm1heFNoYWRlckdyb3VwU3RyaWRlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi13aWR0aC0wMjQ2OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPndpZHRoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudDwvY29kZT5bMF0iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtaGVpZ2h0LTAyNDcwIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGVpZ2h0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+VmtQaHlzaWNhbERldmljZUxpbWl0czwvY29kZT46Ojxjb2RlPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudDwvY29kZT5bMV0iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtZGVwdGgtMDI0NzEiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXB0aDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L2NvZGU+Ojo8Y29kZT5tYXhDb21wdXRlV29ya0dyb3VwQ291bnQ8L2NvZGU+WzJdIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLXJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5yYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5taXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+bWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQnVmZmVyXCI+VmtCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1oaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+aGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyPC9jb2RlPiBpcyBub3QgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiwgPGNvZGU+Y2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyPC9jb2RlPiwgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4sIDxjb2RlPmhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlcjwvY29kZT4sIDxjb2RlPm1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXI8L2NvZGU+LCBhbmQgPGNvZGU+cmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyPC9jb2RlPiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfcmF5X3RyYWNpbmcpKyhWS19JTUdfZmlsdGVyX2N1YmljLFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI2OTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiBhIDxjb2RlPlZrSW1hZ2VWaWV3PC9jb2RlPiBpcyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3JiM4MjE3O3MgPGEgaHJlZj1cIiNyZXNvdXJjZXMtaW1hZ2Utdmlldy1mb3JtYXQtZmVhdHVyZXNcIj5mb3JtYXQgZmVhdHVyZXM8L2E+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGNvbnRhaW4gPGNvZGU+VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSsoVktfSU1HX2ZpbHRlcl9jdWJpYyxWS19FWFRfZmlsdGVyX2N1YmljKSshKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI2OTMiLAorICAgICAgICAgICJ0ZXh0IjogIiBBbnkgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1wiPlZrSW1hZ2VWaWV3PC9hPiBiZWluZyBzYW1wbGVkIHdpdGggPGNvZGU+VktfRklMVEVSX0NVQklDX0VYVDwvY29kZT4gYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IG9mIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV8zRDwvY29kZT4sIDxjb2RlPlZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFPC9jb2RlPiwgb3IgPGNvZGU+VktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9yYXlfdHJhY2luZykrKFZLX0lNR19maWx0ZXJfY3ViaWMsVktfRVhUX2ZpbHRlcl9jdWJpYykrKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWZpbHRlckN1YmljLTAyNjk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgQW55IDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdcIj5Wa0ltYWdlVmlldzwvYT4gYmVpbmcgc2FtcGxlZCB3aXRoIDxjb2RlPlZLX0ZJTFRFUl9DVUJJQ19FWFQ8L2NvZGU+IGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGEgPGEgaHJlZj1cIiNWa0ltYWdlVmlld1R5cGVcIj5Wa0ltYWdlVmlld1R5cGU8L2E+IGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSA8Y29kZT5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9jb2RlPjo6PGNvZGU+ZmlsdGVyQ3ViaWM8L2NvZGU+IHJldHVybmVkIGJ5IDxjb2RlPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VWaWV3XCI+VmtJbWFnZVZpZXc8L2E+IGJlaW5nIHNhbXBsZWQgd2l0aCA8Y29kZT5WS19GSUxURVJfQ1VCSUNfRVhUPC9jb2RlPiB3aXRoIGEgcmVkdWN0aW9uIG1vZGUgb2YgZWl0aGVyIDxjb2RlPlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVDwvY29kZT4gb3IgPGNvZGU+VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUPC9jb2RlPiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nIHRvZ2V0aGVyIHdpdGggbWlubWF4IGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ8L2NvZGU+Ojo8Y29kZT5maWx0ZXJDdWJpY01pbm1heDwvY29kZT4gcmV0dXJuZWQgYnkgPGNvZGU+dmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdLAorICAgICAgIihWS19OVl9yYXlfdHJhY2luZykrKFZLX05WX2Nvcm5lcl9zYW1wbGVkX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1mbGFncy0wMjY5NiIsCisgICAgICAgICAgInRleHQiOiAiIEFueSA8YSBocmVmPVwiI1ZrSW1hZ2VcIj5Wa0ltYWdlPC9hPiBjcmVhdGVkIHdpdGggYSA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVJbmZvXCI+VmtJbWFnZUNyZWF0ZUluZm88L2E+Ojo8Y29kZT5mbGFnczwvY29kZT4gY29udGFpbmluZyA8Y29kZT5WS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WPC9jb2RlPiBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIHNhbXBsZWQgdXNpbmcgYSA8YSBocmVmPVwiI1ZrU2FtcGxlckFkZHJlc3NNb2RlXCI+VmtTYW1wbGVyQWRkcmVzc01vZGU8L2E+IG9mIDxjb2RlPlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0U8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfTlZfcmF5X3RyYWNpbmcpKyhWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci0wMjcwNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBhbnkgcmVzb3VyY2UgYWNjZXNzZWQgYnkgdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci0wMjcxMiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBhbnkgcmVzb3VyY2Ugd3JpdHRlbiB0byBieSB0aGUgPGNvZGU+VmtQaXBlbGluZTwvY29kZT4gb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSBhbiB1bnByb3RlY3RlZCByZXNvdXJjZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tYW5kQnVmZmVyLTAyNzEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHBpcGVsaW5lIHN0YWdlcyBvdGhlciB0aGFuIHRoZSBmcmFtZWJ1ZmZlci1zcGFjZSBhbmQgY29tcHV0ZSBzdGFnZXMgaW4gdGhlIDxjb2RlPlZrUGlwZWxpbmU8L2NvZGU+IG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3Qgd3JpdGUgdG8gYW55IHJlc291cmNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1nZW9tZXRyeUNvdW50LTAyMjQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Z2VvbWV0cnlDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlZcIj5Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjwvYT46Ojxjb2RlPm1heEdlb21ldHJ5Q291bnQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZHN0LTAyNDg4IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGNvbXBhdGlibGUgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WPC9hPiB3aGVyZSA8YSBocmVmPVwiI1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WXCI+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY8L2E+Ojo8Y29kZT50eXBlPC9jb2RlPiBhbmQgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IGFyZSBpZGVudGljYWwsIDxhIGhyZWY9XCIjVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjwvYT46Ojxjb2RlPmluc3RhbmNlQ291bnQ8L2NvZGU+IGFuZCA8YSBocmVmPVwiI1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WXCI+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY8L2E+Ojo8Y29kZT5nZW9tZXRyeUNvdW50PC9jb2RlPiBmb3IgPGNvZGU+ZHN0PC9jb2RlPiBhcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBidWlsZCBzaXplIGFuZCBlYWNoIGdlb21ldHJ5IGluIDxhIGhyZWY9XCIjVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjwvYT46Ojxjb2RlPnBHZW9tZXRyaWVzPC9jb2RlPiBmb3IgPGNvZGU+ZHN0PC9jb2RlPiBoYXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdmVydGljZXMsIGluZGljZXMsIGFuZCBBQUJCcy4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi11cGRhdGUtMDI0ODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT51cGRhdGU8L2NvZGU+IGlzIDxjb2RlPlZLX1RSVUU8L2NvZGU+LCA8Y29kZT5zcmM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtdXBkYXRlLTAyNDkwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dXBkYXRlPC9jb2RlPiBpcyA8Y29kZT5WS19UUlVFPC9jb2RlPiwgPGNvZGU+c3JjPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYnVpbHQgYmVmb3JlIHdpdGggPGNvZGU+VktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9BTExPV19VUERBVEVfQklUX05WPC9jb2RlPiBzZXQgaW4gPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WPC9hPjo6PGNvZGU+ZmxhZ3M8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtdXBkYXRlLTAyNDkxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+dXBkYXRlPC9jb2RlPiBpcyA8Y29kZT5WS19GQUxTRTwvY29kZT4sIFRoZSA8Y29kZT5zaXplPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtNZW1vcnlSZXF1aXJlbWVudHNcIj5Wa01lbW9yeVJlcXVpcmVtZW50czwvYT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVlwiPnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY8L2E+IHdpdGggPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WPC9hPjo6PGNvZGU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9jb2RlPiBzZXQgdG8gPGNvZGU+ZHN0PC9jb2RlPiBhbmQgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WPC9hPjo6PGNvZGU+dHlwZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX0JVSUxEX1NDUkFUQ0hfTlY8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiA8Y29kZT5zY3JhdGNoPC9jb2RlPiBtaW51cyA8Y29kZT5zY3JhdGNoT2Zmc2V0PC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ5MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnVwZGF0ZTwvY29kZT4gaXMgPGNvZGU+VktfVFJVRTwvY29kZT4sIFRoZSA8Y29kZT5zaXplPC9jb2RlPiBtZW1iZXIgb2YgdGhlIDxhIGhyZWY9XCIjVmtNZW1vcnlSZXF1aXJlbWVudHNcIj5Wa01lbW9yeVJlcXVpcmVtZW50czwvYT4gc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVlwiPnZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY8L2E+IHdpdGggPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WPC9hPjo6PGNvZGU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9jb2RlPiBzZXQgdG8gPGNvZGU+ZHN0PC9jb2RlPiBhbmQgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WPC9hPjo6PGNvZGU+dHlwZTwvY29kZT4gc2V0IHRvIDxjb2RlPlZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX1VQREFURV9TQ1JBVENIX05WPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgPGNvZGU+c2NyYXRjaDwvY29kZT4gbWludXMgPGNvZGU+c2NyYXRjaE9mZnNldDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WXCI+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWluc3RhbmNlRGF0YS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5pbnN0YW5jZURhdGE8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5pbnN0YW5jZURhdGE8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0J1ZmZlclwiPlZrQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kc3QtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZHN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNyYy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5zcmM8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5zcmM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WXCI+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtc2NyYXRjaC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zY3JhdGNoPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtCdWZmZXJcIj5Wa0J1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcmVuZGVycGFzcyIsCisgICAgICAgICAgInRleHQiOiAiIFRoaXMgY29tbWFuZCA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCA8Y29kZT5kc3Q8L2NvZGU+LCA8Y29kZT5pbnN0YW5jZURhdGE8L2NvZGU+LCA8Y29kZT5zY3JhdGNoPC9jb2RlPiwgYW5kIDxjb2RlPnNyYzwvY29kZT4gdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViI6IHsKKyAgICAgICIoVktfTlZfcmF5X3RyYWNpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1xdWVyeVR5cGUtMDIyNDIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1FVRVJZX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DT01QQUNURURfU0laRV9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLXF1ZXJ5UG9vbC0wMjQ5MyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXJ5UG9vbDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIDxjb2RlPnF1ZXJ5VHlwZTwvY29kZT4gbWF0Y2hpbmcgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtcXVlcnlQb29sLTAyNDk0IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIHF1ZXJpZXMgaWRlbnRpZmllZCBieSA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IGFuZCA8Y29kZT5maXJzdFF1ZXJ5PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8ZW0+dW5hdmFpbGFibGU8L2VtPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlcy0wMjQ5NSIsCisgICAgICAgICAgInRleHQiOiAiIEFsbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlcyBpbiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYnVpbHQgd2l0aCA8Y29kZT5WS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX0NPTVBBQ1RJT05fQklUX05WPC9jb2RlPiBpZiA8Y29kZT5xdWVyeVR5cGU8L2NvZGU+IGlzIDxjb2RlPlZLX1FVRVJZX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DT01QQUNURURfU0laRV9OVjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1wQWNjZWxlcmF0aW9uU3RydWN0dXJlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQWNjZWxlcmF0aW9uU3RydWN0dXJlczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZcIj5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC9hPiBoYW5kbGVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1xdWVyeVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVlcnlUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWVyeVR5cGVcIj5Wa1F1ZXJ5VHlwZTwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1F1ZXJ5UG9vbFwiPlZrUXVlcnlQb29sPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1yZW5kZXJwYXNzIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhpcyBjb21tYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCA8Y29kZT5xdWVyeVBvb2w8L2NvZGU+LCBhbmQgdGhlIGVsZW1lbnRzIG9mIDxjb2RlPnBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiOiB7CisgICAgICAiKFZLX05WX3JheV90cmFjaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtbW9kZS0wMjQ5NiIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1vZGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NPTVBBQ1RfTlY8L2NvZGU+IG9yIDxjb2RlPlZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NMT05FX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtc3JjLTAyNDk3IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gYnVpbHQgd2l0aCA8Y29kZT5WS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX0NPTVBBQ1RJT05fQklUX05WPC9jb2RlPiBpZiA8Y29kZT5tb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DT01QQUNUX05WPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRzdC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kc3Q8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WXCI+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1zcmMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c3JjPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVlwiPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtbW9kZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WXCI+VmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBjb21wdXRlIG9wZXJhdGlvbnMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXJlbmRlcnBhc3MiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGlzIGNvbW1hbmQgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIG9mIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+LCA8Y29kZT5kc3Q8L2NvZGU+LCBhbmQgPGNvZGU+c3JjPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSA8YSBocmVmPVwiI1ZrRGV2aWNlXCI+VmtEZXZpY2U8L2E+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtMYXllclByb3BlcnRpZXNcIj5Wa0xheWVyUHJvcGVydGllczwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMtcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgYW5kIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cFByb3BlcnR5Q291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtMYXllclByb3BlcnRpZXNcIj5Wa0xheWVyUHJvcGVydGllczwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIjogeworICAgICAgImNvcmUiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLXBMYXllck5hbWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cExheWVyTmFtZTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wTGF5ZXJOYW1lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmciCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wUHJvcGVydGllczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8YSBocmVmPVwiI1ZrRXh0ZW5zaW9uUHJvcGVydGllc1wiPlZrRXh0ZW5zaW9uUHJvcGVydGllczwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyI6IHsKKyAgICAgICJjb3JlIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMtcExheWVyTmFtZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wTGF5ZXJOYW1lPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBMYXllck5hbWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBQcm9wZXJ0eUNvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcy1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT5wUHJvcGVydHlDb3VudDwvY29kZT4gPGEgaHJlZj1cIiNWa0V4dGVuc2lvblByb3BlcnRpZXNcIj5Wa0V4dGVuc2lvblByb3BlcnRpZXM8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzLXBGZWF0dXJlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRmVhdHVyZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUZlYXR1cmVzXCI+VmtQaHlzaWNhbERldmljZUZlYXR1cmVzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXBGZWF0dXJlcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRmVhdHVyZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMlwiPlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfdmFyaWFibGVfcG9pbnRlcnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzLXZhcmlhYmxlUG9pbnRlcnMtMDE0MzEiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT52YXJpYWJsZVBvaW50ZXJzPC9jb2RlPiBpcyBlbmFibGVkIHRoZW4gPGNvZGU+dmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGFsc28gYmUgZW5hYmxlZC4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZBUklBQkxFX1BPSU5URVJTX0ZFQVRVUkVTPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcy1tdWx0aXZpZXdHZW9tZXRyeVNoYWRlci0wMDU4MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm11bHRpdmlld0dlb21ldHJ5U2hhZGVyPC9jb2RlPiBpcyBlbmFibGVkIHRoZW4gPGNvZGU+bXVsdGl2aWV3PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGJlIGVuYWJsZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMtbXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyLTAwNTgxIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+bXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyPC9jb2RlPiBpcyBlbmFibGVkIHRoZW4gPGNvZGU+bXVsdGl2aWV3PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBhbHNvIGJlIGVuYWJsZWQuIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFUzwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3NoYWRlcl9hdG9taWNfaW50NjQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0FUT01JQ19JTlQ2NF9GRUFUVVJFU19LSFI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl84Yml0X3N0b3JhZ2UpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl8xNmJpdF9zdG9yYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIjogeworICAgICAgIihWS19LSFJfc2hhZGVyX2Zsb2F0MTZfaW50OCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3NoYWRlcl9jbG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRkVBVFVSRVM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcy1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUzwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIjogeworICAgICAgIihWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX0ZFQVRVUkVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRFJBV19QQVJBTUVURVJTX0ZFQVRVUkVTPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViI6IHsKKyAgICAgICIoVktfTlZfbWVzaF9zaGFkZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX0ZFQVRVUkVTX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF92ZXJ0ZXhfYXR0cmlidXRlX2Rpdmlzb3IpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9hc3RjX2RlY29kZV9tb2RlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQVNUQ19ERUNPREVfRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUIjogeworICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19GRUFUVVJFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl92dWxrYW5fbWVtb3J5X21vZGVsKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZVTEtBTl9NRU1PUllfTU9ERUxfRkVBVFVSRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2lubGluZV91bmlmb3JtX2Jsb2NrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViI6IHsKKyAgICAgICIoVktfTlZfcmVwcmVzZW50YXRpdmVfZnJhZ21lbnRfdGVzdCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfRkVBVFVSRVNfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WIjogeworICAgICAgIihWS19OVl9zY2lzc29yX2V4Y2x1c2l2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhDTFVTSVZFX1NDSVNTT1JfRkVBVFVSRVNfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYiOiB7CisgICAgICAiKFZLX05WX2Nvcm5lcl9zYW1wbGVkX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPUk5FUl9TQU1QTEVEX0lNQUdFX0ZFQVRVUkVTX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WIjogeworICAgICAgIihWS19OVl9jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19GRUFUVVJFU19OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYiOiB7CisgICAgICAiKFZLX05WX2ZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYiOiB7CisgICAgICAiKFZLX05WX3NoYWRlcl9pbWFnZV9mb290cHJpbnQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0ZFQVRVUkVTX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViI6IHsKKyAgICAgICIoVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfRkVBVFVSRVNfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIjogeworICAgICAgIihWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXApIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0ZFQVRVUkVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3NjYWxhcl9ibG9ja19sYXlvdXQpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0NBTEFSX0JMT0NLX0xBWU9VVF9GRUFUVVJFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSIjogeworICAgICAgIihWS19LSFJfdW5pZm9ybV9idWZmZXJfc3RhbmRhcmRfbGF5b3V0KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2RlcHRoX2NsaXBfZW5hYmxlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9DTElQX0VOQUJMRV9GRUFUVVJFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9tZW1vcnlfcHJpb3JpdHkpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BSSU9SSVRZX0ZFQVRVUkVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIjogeworICAgICAgIihWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzLFZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MsVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykrKFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYiOiB7CisgICAgICAiKFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl9pbWFnZWxlc3NfZnJhbWVidWZmZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2ZyYWdtZW50X3NoYWRlcl9pbnRlcmxvY2spIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0lOVEVSTE9DS19GRUFUVVJFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViI6IHsKKyAgICAgICIoVktfTlZfY29vcGVyYXRpdmVfbWF0cml4KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX0ZFQVRVUkVTX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF95Y2Jjcl9pbWFnZV9hcnJheXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpKyhWS19LSFJfc2hhZGVyX3N1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRkVBVFVSRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIjogeworICAgICAgIihWS19FWFRfaG9zdF9xdWVyeV9yZXNldCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9IT1NUX1FVRVJZX1JFU0VUX0ZFQVRVUkVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMIjogeworICAgICAgIihWS19JTlRFTF9zaGFkZXJfaW50ZWdlcl9mdW5jdGlvbnMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRkVBVFVSRVNfSU5URUw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYiOiB7CisgICAgICAiKFZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0ZFQVRVUkVTX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIjogeworICAgICAgIihWS19LSFJfdGltZWxpbmVfc2VtYXBob3JlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9GRUFUVVJFU19LSFI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9pbmRleF90eXBlX3VpbnQ4KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOREVYX1RZUEVfVUlOVDhfRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViI6IHsKKyAgICAgICIoVktfTlZfc2hhZGVyX3NtX2J1aWx0aW5zKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU01fQlVJTFRJTlNfRkVBVFVSRVNfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSIjogeworICAgICAgIihWS19LSFJfc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRkVBVFVSRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3NoYWRlcl9kZW1vdGVfdG9faGVscGVyX2ludm9jYXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIjogeworICAgICAgIihWS19FWFRfdGV4ZWxfYnVmZmVyX2FsaWdubWVudCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0ZFQVRVUkVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUIjogeworICAgICAgIihWS19FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9hc3RjX2hkcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWFRVUkVfQ09NUFJFU1NJT05fQVNUQ19IRFJfRkVBVFVSRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUIjogeworICAgICAgIihWS19FWFRfbGluZV9yYXN0ZXJpemF0aW9uKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9GRUFUVVJFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3N1Ymdyb3VwX3NpemVfY29udHJvbCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQiOiB7CisgICAgICAiKFZLX0FNRF9kZXZpY2VfY29oZXJlbnRfbWVtb3J5KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPSEVSRU5UX01FTU9SWV9GRUFUVVJFU19BTUQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX3B1c2hfZGVzY3JpcHRvcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BVU0hfREVTQ1JJUFRPUl9QUk9QRVJUSUVTX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX211bHRpdmlldykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUFJPUEVSVElFUzwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl9zaGFkZXJfZmxvYXRfY29udHJvbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUX0NPTlRST0xTX1BST1BFUlRJRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2Rpc2NhcmRfcmVjdGFuZ2xlcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRElTQ0FSRF9SRUNUQU5HTEVfUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRV9MT0NBVElPTlNfUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9leHRlcm5hbF9tZW1vcnlfaG9zdCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9NRU1PUllfSE9TVF9QUk9QRVJUSUVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYIjogeworICAgICAgIihWS19OVlhfbXVsdGl2aWV3X3Blcl92aWV3X2F0dHJpYnV0ZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19QUk9QRVJUSUVTX05WWDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9tYWludGVuYW5jZTIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9QUk9QRVJUSUVTPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEpKyhWS19FWFRfc3ViZ3JvdXBfc2l6ZV9jb250cm9sKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUIjogeworICAgICAgIihWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUIjogeworICAgICAgIihWS19FWFRfdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUIjogeworICAgICAgIihWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX0ZJTFRFUl9NSU5NQVhfUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfUFJPUEVSVElFUzwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX21haW50ZW5hbmNlMykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYiOiB7CisgICAgICAiKFZLX05WX21lc2hfc2hhZGVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX1BST1BFUlRJRVNfTlY8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZXNjcmlwdG9yX2luZGV4aW5nKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19QUk9QRVJUSUVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9jb25zZXJ2YXRpdmVfcmFzdGVyaXphdGlvbikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9mcmFnbWVudF9kZW5zaXR5X21hcCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQiOiB7CisgICAgICAiKFZLX0FNRF9zaGFkZXJfY29yZV9wcm9wZXJ0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1ELXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0FNRDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIjogeworICAgICAgIihWS19BTURfc2hhZGVyX2NvcmVfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1ELXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiI6IHsKKyAgICAgICIoVktfS0hSX2RlcHRoX3N0ZW5jaWxfcmVzb2x2ZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfU1RFTkNJTF9SRVNPTFZFX1BST1BFUlRJRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl9wZXJmb3JtYW5jZV9xdWVyeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFItc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIiOiB7CisgICAgICAiKFZLX0tIUl9wZXJmb3JtYW5jZV9xdWVyeSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfUFJPUEVSVElFU19LSFI8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYiOiB7CisgICAgICAiKFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfUFJPUEVSVElFU19OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUIjogeworICAgICAgIihWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX1BST1BFUlRJRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WIjogeworICAgICAgIihWS19OVl9yYXlfdHJhY2luZykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SQVlfVFJBQ0lOR19QUk9QRVJUSUVTX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViI6IHsKKyAgICAgICIoVktfTlZfY29vcGVyYXRpdmVfbWF0cml4KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OVjwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViI6IHsKKyAgICAgICIoVktfTlZfc2hhZGVyX3NtX2J1aWx0aW5zKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19QUk9QRVJUSUVTX05WPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF90ZXhlbF9idWZmZXJfYWxpZ25tZW50KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9QUk9QRVJUSUVTX0VYVDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIjogeworICAgICAgIihWS19LSFJfdGltZWxpbmVfc2VtYXBob3JlKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9saW5lX3Jhc3Rlcml6YXRpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVC1zYW1wbGVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNhbXBsZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1NhbXBsZUNvdW50RmxhZ0JpdHNcIj5Wa1NhbXBsZUNvdW50RmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhULXBNdWx0aXNhbXBsZVByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE11bHRpc2FtcGxlUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVFwiPlZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCI6IHsKKyAgICAgICIoVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiOiB7CisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcy1mb3JtYXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzLXBGb3JtYXRQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBGb3JtYXRQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRm9ybWF0UHJvcGVydGllc1wiPlZrRm9ybWF0UHJvcGVydGllczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMi1mb3JtYXQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Zm9ybWF0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtGb3JtYXRcIj5Wa0Zvcm1hdDwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMi1wRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRm9ybWF0UHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0Zvcm1hdFByb3BlcnRpZXMyXCI+VmtGb3JtYXRQcm9wZXJ0aWVzMjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtGb3JtYXRQcm9wZXJ0aWVzMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Zvcm1hdFByb3BlcnRpZXMyLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0ZPUk1BVF9QUk9QRVJUSUVTXzI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0Zvcm1hdFByb3BlcnRpZXMyLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUXCI+VmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUPC9hPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpKyhWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfTElTVF9FWFQ8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyI6IHsKKyAgICAgICIoVktfRVhUX2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXRpbGluZy0wMjI0OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRpbGluZzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVDwvY29kZT4uIChVc2UgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMlwiPnZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9hPiBpbnN0ZWFkKS4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiY29yZSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtZm9ybWF0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VUeXBlXCI+VmtJbWFnZVR5cGU8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXRpbGluZy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50aWxpbmc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVGlsaW5nXCI+VmtJbWFnZVRpbGluZzwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdXNhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlVXNhZ2VGbGFnQml0c1wiPlZrSW1hZ2VVc2FnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT4wPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy1mbGFncy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrSW1hZ2VDcmVhdGVGbGFnQml0c1wiPlZrSW1hZ2VDcmVhdGVGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBJbWFnZUZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cEltYWdlRm9ybWF0UHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0ltYWdlRm9ybWF0UHJvcGVydGllc1wiPlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViI6IHsKKyAgICAgICIoVktfTlZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtZm9ybWF0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVi10eXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVHlwZVwiPlZrSW1hZ2VUeXBlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdGlsaW5nLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRpbGluZzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VUaWxpbmdcIj5Wa0ltYWdlVGlsaW5nPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdXNhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlVXNhZ2VGbGFnQml0c1wiPlZrSW1hZ2VVc2FnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUZsYWdCaXRzXCI+VmtJbWFnZUNyZWF0ZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLWV4dGVybmFsSGFuZGxlVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5leHRlcm5hbEhhbmRsZVR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlZcIj5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlY8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgPGEgaHJlZj1cIiNWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlZcIj5Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlY8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikrKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcE5leHQtMDE4NjgiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIG9mIDxjb2RlPnBJbWFnZUZvcm1hdFByb3BlcnRpZXM8L2NvZGU+IGluY2x1ZGVzIGEgPGEgaHJlZj1cIiNWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRFwiPlZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEPC9hPiBzdHJ1Y3R1cmUsIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgPGNvZGU+cEltYWdlRm9ybWF0SW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSBhIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvXCI+VmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvPC9hPiBzdHJ1Y3R1cmUgd2l0aCA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiBzZXQgdG8gPGNvZGU+VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEPC9jb2RlPi4iCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wSW1hZ2VGb3JtYXRJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBJbWFnZUZvcm1hdEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzJcIj5Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBJbWFnZUZvcm1hdFByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyXCI+VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpKyhWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy0wMjI0OSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRpbGluZzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIGluY2x1ZGVzIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUXCI+VmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUPC9hPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy0wMjMxMyIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnRpbGluZzwvY29kZT4gaXMgPGNvZGU+VktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUPC9jb2RlPiBhbmQgPGNvZGU+ZmxhZ3M8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPlZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQ8L2NvZGU+LCB0aGVuIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaW5jbHVkZSA8YSBocmVmPVwiI1ZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUlwiPlZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjwvYT4gd2l0aCBub24temVybyA8Y29kZT52aWV3Rm9ybWF0Q291bnQ8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgRWFjaCA8Y29kZT5wTmV4dDwvY29kZT4gbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBlaXRoZXIgPGNvZGU+TlVMTDwvY29kZT4gb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgPGEgaHJlZj1cIiNWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFJcIj5Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI8L2E+LCA8YSBocmVmPVwiI1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUXCI+VmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ8L2E+LCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mb1wiPlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbzwvYT4sIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUXCI+VmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUPC9hPiwgb3IgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUXCI+VmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXNUeXBlLXVuaXF1ZSIsCisgICAgICAgICAgInRleHQiOiAiIEVhY2ggPGNvZGU+c1R5cGU8L2NvZGU+IG1lbWJlciBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIHVuaXF1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzItZm9ybWF0LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZvcm1hdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRm9ybWF0XCI+VmtGb3JtYXQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi10eXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0ltYWdlVHlwZVwiPlZrSW1hZ2VUeXBlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzItdGlsaW5nLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnRpbGluZzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW1hZ2VUaWxpbmdcIj5Wa0ltYWdlVGlsaW5nPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzItdXNhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dXNhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0ltYWdlVXNhZ2VGbGFnQml0c1wiPlZrSW1hZ2VVc2FnZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtJbWFnZUNyZWF0ZUZsYWdCaXRzXCI+VmtJbWFnZUNyZWF0ZUZsYWdCaXRzPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0ltYWdlRm9ybWF0UHJvcGVydGllczIiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzI8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0ltYWdlRm9ybWF0UHJvcGVydGllczItcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnBOZXh0PC9jb2RlPiBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgPGNvZGU+cE5leHQ8L2NvZGU+IGNoYWluIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGVpdGhlciA8Y29kZT5OVUxMPC9jb2RlPiBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiA8YSBocmVmPVwiI1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEXCI+VmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQ8L2E+LCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNcIj5Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9hPiwgPGEgaHJlZj1cIiNWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUXCI+VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDwvYT4sIDxhIGhyZWY9XCIjVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzXCI+VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9hPiwgb3IgPGEgaHJlZj1cIiNWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EXCI+VmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRDwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS11bmlxdWUiLAorICAgICAgICAgICJ0ZXh0IjogIiBFYWNoIDxjb2RlPnNUeXBlPC9jb2RlPiBtZW1iZXIgaW4gdGhlIDxjb2RlPnBOZXh0PC9jb2RlPiBjaGFpbiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikrKFZLX0FNRF90ZXh0dXJlX2dhdGhlcl9iaWFzX2xvZCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfVEVYVFVSRV9MT0RfR0FUSEVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FNRDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSsoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpKyhWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfSU1BR0VfRk9STUFUX1BST1BFUlRJRVM8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikrKFZLX0VYVF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULXNoYXJpbmdNb2RlLTAyMzE0IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgdGhlbiA8Y29kZT5wUXVldWVGYW1pbHlJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cXVldWVGYW1pbHlJbmRleENvdW50PC9jb2RlPiA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWVzLiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULXNoYXJpbmdNb2RlLTAyMzE1IiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+c2hhcmluZ01vZGU8L2NvZGU+IGlzIDxjb2RlPlZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UPC9jb2RlPiwgdGhlbiA8Y29kZT5xdWV1ZUZhbWlseUluZGV4Q291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGdyZWF0ZXIgdGhhbiA8Y29kZT4xPC9jb2RlPi4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVC1zaGFyaW5nTW9kZS0wMjMxNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnNoYXJpbmdNb2RlPC9jb2RlPiBpcyA8Y29kZT5WS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVDwvY29kZT4sIGVhY2ggZWxlbWVudCBvZiA8Y29kZT5wUXVldWVGYW1pbHlJbmRpY2VzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSB1bmlxdWUgYW5kIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGxlc3MgdGhhbiB0aGUgPGNvZGU+cFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDwvY29kZT4gcmV0dXJuZWQgYnkgPGEgaHJlZj1cIiN2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMlwiPnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyPC9hPiBmb3IgdGhlIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSA8Y29kZT5kZXZpY2U8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULXNoYXJpbmdNb2RlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNoYXJpbmdNb2RlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtTaGFyaW5nTW9kZVwiPlZrU2hhcmluZ01vZGU8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikrKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikrKFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfVVNBR0VfQU5EUk9JRDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikrKFZLX0VYVF9maWx0ZXJfY3ViaWMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQtaW1hZ2VWaWV3VHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbWFnZVZpZXdUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbWFnZVZpZXdUeXBlXCI+VmtJbWFnZVZpZXdUeXBlPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSsoVktfRVhUX2ZpbHRlcl9jdWJpYykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRklMVEVSX0NVQklDX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVC1wTmV4dC0wMjYyNyIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgdGhlIDxhIGhyZWY9XCIjVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyXCI+VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC9hPiBzdHJ1Y3R1cmUgaW5jbHVkZXMgYSA8YSBocmVmPVwiI1ZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFRcIj5Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUPC9hPiBzdHJ1Y3R1cmUsIHRoZSA8Y29kZT5wTmV4dDwvY29kZT4gY2hhaW4gb2YgdGhlIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzJcIj5Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjwvYT4gc3RydWN0dXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGluY2x1ZGUgYSA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFRcIj5Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUgd2l0aCBhbiA8Y29kZT5pbWFnZVZpZXdUeXBlPC9jb2RlPiB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCA8Y29kZT5pbWFnZVR5cGU8L2NvZGU+LiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcEV4dGVybmFsQnVmZmVySW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRXh0ZXJuYWxCdWZmZXJJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm9cIj5Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzXCI+VmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtCdWZmZXJDcmVhdGVGbGFnQml0c1wiPlZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHM8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby11c2FnZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT51c2FnZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiA8YSBocmVmPVwiI1ZrQnVmZmVyVXNhZ2VGbGFnQml0c1wiPlZrQnVmZmVyVXNhZ2VGbGFnQml0czwvYT4gdmFsdWVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnVzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8taGFuZGxlVHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5oYW5kbGVUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVM8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcy1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5waHlzaWNhbERldmljZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VcIj5Wa1BoeXNpY2FsRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcEV4dGVybmFsU2VtYXBob3JlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRXh0ZXJuYWxTZW1hcGhvcmVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm9cIj5Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzXCI+VmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8iOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk88L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIDxhIGhyZWY9XCIjVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUlwiPlZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNcIj5Wa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiOiB7CisgICAgICAiKFZLX1ZFUlNJT05fMV8xLFZLX0tIUl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcEV4dGVybmFsRmVuY2VJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBFeHRlcm5hbEZlbmNlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm9cIj5Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm88L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxhIGhyZWY9XCIjVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllc1wiPlZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyI6IHsKKyAgICAgICIoVktfVkVSU0lPTl8xXzEsVktfS0hSX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mby1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfRkVOQ0VfSU5GTzwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mby1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aGFuZGxlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c1wiPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czwvYT4gdmFsdWUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIjogeworICAgICAgIihWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQiOiB7CisgICAgICAiKFZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBoeXNpY2FsRGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVwiPlZrUGh5c2ljYWxEZXZpY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVC1wVGltZURvbWFpbkNvdW50LXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBUaW1lRG9tYWluQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVC1wVGltZURvbWFpbnMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgPGNvZGU+cFRpbWVEb21haW5Db3VudDwvY29kZT4gaXMgbm90IDxjb2RlPjA8L2NvZGU+LCBhbmQgPGNvZGU+cFRpbWVEb21haW5zPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBUaW1lRG9tYWluczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBUaW1lRG9tYWluQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtUaW1lRG9tYWluRVhUXCI+VmtUaW1lRG9tYWluRVhUPC9hPiB2YWx1ZXMiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfdXRpbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhULXBOYW1lSW5mby0wMjU4NyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOYW1lSW5mbzwvY29kZT4tJmd0O29iamVjdFR5cGUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX09CSkVDVF9UWVBFX1VOS05PV048L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhULXBOYW1lSW5mby0wMjU4OCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOYW1lSW5mbzwvY29kZT4tJmd0O29iamVjdEhhbmRsZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhULXBOYW1lSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmFtZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFRcIj5Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z191dGlscykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtMDI1ODkiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5vYmplY3RUeXBlPC9jb2RlPiBpcyA8Y29kZT5WS19PQkpFQ1RfVFlQRV9VTktOT1dOPC9jb2RlPiwgPGNvZGU+b2JqZWN0SGFuZGxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0VHlwZS0wMjU5MCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm9iamVjdFR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19PQkpFQ1RfVFlQRV9VTktOT1dOPC9jb2RlPiwgPGNvZGU+b2JqZWN0SGFuZGxlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+IG9yIGEgdmFsaWQgVnVsa2FuIGhhbmRsZSBvZiB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggPGNvZGU+b2JqZWN0VHlwZTwvY29kZT4gYXMgZGVmaW5lZCBpbiB0aGUgPGEgaHJlZj1cIiNkZWJ1Z2dpbmctb2JqZWN0LXR5cGVzXCI+VmtPYmplY3RUeXBlIGFuZCBWdWxrYW4gSGFuZGxlIFJlbGF0aW9uc2hpcDwvYT4gdGFibGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9OQU1FX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrT2JqZWN0VHlwZVwiPlZrT2JqZWN0VHlwZTwvYT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULXBPYmplY3ROYW1lLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBPYmplY3ROYW1lPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBPYmplY3ROYW1lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmciCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z191dGlscykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQtcFRhZ0luZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFRhZ0luZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVFwiPlZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z191dGlscykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtb2JqZWN0VHlwZS0wMTkwOCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9iamVjdFR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IG5vdCBiZSA8Y29kZT5WS19PQkpFQ1RfVFlQRV9VTktOT1dOPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVC1vYmplY3RIYW5kbGUtMDE5MTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vYmplY3RIYW5kbGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgVnVsa2FuIGhhbmRsZSBvZiB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggPGNvZGU+b2JqZWN0VHlwZTwvY29kZT4gYXMgZGVmaW5lZCBpbiB0aGUgPGEgaHJlZj1cIiNkZWJ1Z2dpbmctb2JqZWN0LXR5cGVzXCI+VmtPYmplY3RUeXBlIGFuZCBWdWxrYW4gSGFuZGxlIFJlbGF0aW9uc2hpcDwvYT4gdGFibGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vYmplY3RUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtPYmplY3RUeXBlXCI+VmtPYmplY3RUeXBlPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVC1wVGFnLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBUYWc8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiA8Y29kZT50YWdTaXplPC9jb2RlPiBieXRlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVC10YWdTaXplLWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+dGFnU2l6ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfdXRpbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQtcXVldWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cXVldWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1F1ZXVlXCI+VmtRdWV1ZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTGFiZWxJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVidWdVdGlsc0xhYmVsRVhUXCI+VmtEZWJ1Z1V0aWxzTGFiZWxFWFQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIlZrRGVidWdVdGlsc0xhYmVsRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfdXRpbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNMYWJlbEVYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNMYWJlbEVYVC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsTmFtZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTGFiZWxOYW1lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmciCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfdXRpbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhULU5vbmUtMDE5MTEiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBvdXRzdGFuZGluZyA8Y29kZT52a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQ8L2NvZGU+IGNvbW1hbmQgcHJpb3IgdG8gdGhlIDxjb2RlPnZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQ8L2NvZGU+IG9uIHRoZSBxdWV1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVC1xdWV1ZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5xdWV1ZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrUXVldWVcIj5Wa1F1ZXVlPC9hPiBoYW5kbGUiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfdXRpbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhULXF1ZXVlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXVlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWV1ZVwiPlZrUXVldWU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBMYWJlbEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzTGFiZWxFWFRcIj5Wa0RlYnVnVXRpbHNMYWJlbEVYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCI6IHsKKyAgICAgICIoVktfRVhUX2RlYnVnX3V0aWxzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBMYWJlbEluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzTGFiZWxFWFRcIj5Wa0RlYnVnVXRpbHNMYWJlbEVYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z191dGlscykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItMDE5MTIiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGVyZSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhbiBvdXRzdGFuZGluZyA8Y29kZT52a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUPC9jb2RlPiBjb21tYW5kIHByaW9yIHRvIHRoZSA8Y29kZT52a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVDwvY29kZT4gb24gdGhlIHF1ZXVlIHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgc3VibWl0dGVkIHRvIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLTAxOTEzIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIsIHRoZXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIG91dHN0YW5kaW5nIDxjb2RlPnZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQ8L2NvZGU+IGNvbW1hbmQgcmVjb3JkZWQgdG8gPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gdGhhdCBoYXMgbm90IHByZXZpb3VzbHkgYmVlbiBlbmRlZCBieSBhIGNhbGwgdG8gPGNvZGU+dmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQ8L2NvZGU+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIDxhIGhyZWY9XCIjY29tbWFuZGJ1ZmZlcnMtbGlmZWN5Y2xlXCI+cmVjb3JkaW5nIHN0YXRlPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfdXRpbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTGFiZWxJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVidWdVdGlsc0xhYmVsRVhUXCI+VmtEZWJ1Z1V0aWxzTGFiZWxFWFQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBpbiB0aGUgPGEgaHJlZj1cIiNjb21tYW5kYnVmZmVycy1saWZlY3ljbGVcIj5yZWNvcmRpbmcgc3RhdGU8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfdXRpbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtaW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENyZWF0ZUluZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVFwiPlZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrQWxsb2NhdGlvbkNhbGxiYWNrc1wiPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtcE1lc3Nlbmdlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTWVzc2VuZ2VyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRGVidWdVdGlsc01lc3NlbmdlckVYVFwiPlZrRGVidWdVdGlsc01lc3NlbmdlckVYVDwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2RlYnVnX3V0aWxzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1wZm5Vc2VyQ2FsbGJhY2stMDE5MTQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wZm5Vc2VyQ2FsbGJhY2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNQRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFRcIj5QRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFQ8L2E+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DUkVBVEVfSU5GT19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VTZXZlcml0eS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZXNzYWdlU2V2ZXJpdHk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVFwiPlZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQtbWVzc2FnZVNldmVyaXR5LXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lc3NhZ2VTZXZlcml0eTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lc3NhZ2VUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVFwiPlZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQ8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1tZXNzYWdlVHlwZS1yZXF1aXJlZGJpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZXNzYWdlVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPjA8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULXBmblVzZXJDYWxsYmFjay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wZm5Vc2VyQ2FsbGJhY2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNQRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFRcIj5QRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFQ8L2E+IHZhbHVlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfdXRpbHMpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NBTExCQUNLX0RBVEFfRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtZmxhZ3MtemVyb2JpdG1hc2siLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5mbGFnczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wTWVzc2FnZUlkTmFtZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wTWVzc2FnZUlkTmFtZTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCA8Y29kZT5wTWVzc2FnZUlkTmFtZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtcE1lc3NhZ2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE1lc3NhZ2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULXBRdWV1ZUxhYmVscy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5xdWV1ZUxhYmVsQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cFF1ZXVlTGFiZWxzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cXVldWVMYWJlbENvdW50PC9jb2RlPiB2YWxpZCA8YSBocmVmPVwiI1ZrRGVidWdVdGlsc0xhYmVsRVhUXCI+VmtEZWJ1Z1V0aWxzTGFiZWxFWFQ8L2E+IHN0cnVjdHVyZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wQ21kQnVmTGFiZWxzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPmNtZEJ1ZkxhYmVsQ291bnQ8L2NvZGU+IGlzIG5vdCA8Y29kZT4wPC9jb2RlPiwgPGNvZGU+cENtZEJ1ZkxhYmVsczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPmNtZEJ1ZkxhYmVsQ291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzTGFiZWxFWFRcIj5Wa0RlYnVnVXRpbHNMYWJlbEVYVDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULXBPYmplY3RzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm9iamVjdENvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIDxjb2RlPnBPYmplY3RzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+b2JqZWN0Q291bnQ8L2NvZGU+IHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFRcIj5Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVDwvYT4gc3RydWN0dXJlcyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z191dGlscykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtb2JqZWN0VHlwZS0wMjU5MSIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5vYmplY3RUeXBlPC9jb2RlPiBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIDxjb2RlPnBDYWxsYmFja0RhdGE8L2NvZGU+LSZndDtwT2JqZWN0cyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfT0JKRUNUX1RZUEVfVU5LTk9XTjwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtaW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhULW1lc3NhZ2VTZXZlcml0eS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5tZXNzYWdlU2V2ZXJpdHk8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVFwiPlZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVC1tZXNzYWdlVHlwZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVzc2FnZVR5cGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVFwiPlZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQ8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVC1tZXNzYWdlVHlwZXMtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVzc2FnZVR5cGVzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtcENhbGxiYWNrRGF0YS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ2FsbGJhY2tEYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVFwiPlZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCI6IHsKKyAgICAgICIoVktfRVhUX2RlYnVnX3V0aWxzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVC1tZXNzZW5nZXItMDE5MTUiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L2NvZGU+IHdlcmUgcHJvdmlkZWQgd2hlbiA8Y29kZT5tZXNzZW5nZXI8L2NvZGU+IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBwcm92aWRlZCBoZXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULW1lc3Nlbmdlci0wMTkxNiIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPm1lc3NlbmdlcjwvY29kZT4gd2FzIGNyZWF0ZWQsIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmluc3RhbmNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtJbnN0YW5jZVwiPlZrSW5zdGFuY2U8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVC1tZXNzZW5nZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+bWVzc2VuZ2VyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUXCI+VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtbWVzc2VuZ2VyLXBhcmVudCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm1lc3NlbmdlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gPGNvZGU+aW5zdGFuY2U8L2NvZGU+IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z19tYXJrZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZGV2aWNlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZXZpY2VcIj5Wa0RldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVC1wTmFtZUluZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5hbWVJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVFwiPlZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfbWFya2VyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtMDE0OTAiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vYmplY3RUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+VktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULW9iamVjdC0wMTQ5MSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9iamVjdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVC1vYmplY3QtMDE0OTIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5vYmplY3Q8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgVnVsa2FuIG9iamVjdCBvZiB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggPGNvZGU+b2JqZWN0VHlwZTwvY29kZT4gYXMgZGVmaW5lZCBpbiA8YSBocmVmPVwiI2RlYnVnLXJlcG9ydC1vYmplY3QtdHlwZXNcIj5Wa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBhbmQgVnVsa2FuIEhhbmRsZSBSZWxhdGlvbnNoaXA8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+c1R5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfTkFNRV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVC1wTmV4dC1wTmV4dCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBOZXh0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5OVUxMPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUXCI+VmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQtcE9iamVjdE5hbWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE9iamVjdE5hbWU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z19tYXJrZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhULWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5kZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RldmljZVwiPlZrRGV2aWNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQtcFRhZ0luZm8tcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cFRhZ0luZm88L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFRcIj5Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z19tYXJrZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC1vYmplY3RUeXBlLTAxNDkzIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxjb2RlPlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULW9iamVjdC0wMTQ5NCIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9iamVjdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gbm90IGJlIDxhIGhyZWY9XCIjVktfTlVMTF9IQU5ETEVcIj5WS19OVUxMX0hBTkRMRTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULW9iamVjdC0wMTQ5NSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9iamVjdDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSBWdWxrYW4gb2JqZWN0IG9mIHRoZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5vYmplY3RUeXBlPC9jb2RlPiBhcyBkZWZpbmVkIGluIDxhIGhyZWY9XCIjZGVidWctcmVwb3J0LW9iamVjdC10eXBlc1wiPlZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGFuZCBWdWxrYW4gSGFuZGxlIFJlbGF0aW9uc2hpcDwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX1RBR19JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULXBOZXh0LXBOZXh0IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cE5leHQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIDxjb2RlPk5VTEw8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC1vYmplY3RUeXBlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPm9iamVjdFR5cGU8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVFwiPlZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQtcFRhZy1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVGFnPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+dGFnU2l6ZTwvY29kZT4gYnl0ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULXRhZ1NpemUtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT50YWdTaXplPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z19tYXJrZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERlYnVnTWFya2VyQmVnaW5FWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtDb21tYW5kQnVmZmVyXCI+VmtDb21tYW5kQnVmZmVyPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1wTWFya2VySW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTWFya2VySW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVFwiPlZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgPGNvZGU+VmtDb21tYW5kUG9vbDwvY29kZT4gdGhhdCA8Y29kZT5jb21tYW5kQnVmZmVyPC9jb2RlPiB3YXMgYWxsb2NhdGVkIGZyb20gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z19tYXJrZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVC1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfTUFSS0VSX0lORk9fRVhUPC9jb2RlPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhULXBNYXJrZXJOYW1lLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNYXJrZXJOYW1lPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmciCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0NtZERlYnVnTWFya2VyRW5kRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfbWFya2VyKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLTAxMjM5IiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlcmUgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYW4gb3V0c3RhbmRpbmcgPGEgaHJlZj1cIiN2a0NtZERlYnVnTWFya2VyQmVnaW5FWFRcIj52a0NtZERlYnVnTWFya2VyQmVnaW5FWFQ8L2E+IGNvbW1hbmQgcHJpb3IgdG8gdGhlIDxjb2RlPnZrQ21kRGVidWdNYXJrZXJFbmRFWFQ8L2NvZGU+IG9uIHRoZSBxdWV1ZSB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IGlzIHN1Ym1pdHRlZCB0byIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLTAxMjQwIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gaXMgYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIsIHRoZXJlIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGFuIG91dHN0YW5kaW5nIDxhIGhyZWY9XCIjdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUXCI+dmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUPC9hPiBjb21tYW5kIHJlY29yZGVkIHRvIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHRoYXQgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gZW5kZWQgYnkgYSBjYWxsIHRvIDxhIGhyZWY9XCIjdmtDbWREZWJ1Z01hcmtlckVuZEVYVFwiPnZrQ21kRGVidWdNYXJrZXJFbmRFWFQ8L2E+LiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0NvbW1hbmRCdWZmZXJcIj5Wa0NvbW1hbmRCdWZmZXI8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGVidWdNYXJrZXJFbmRFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiOiB7CisgICAgICAiKFZLX0VYVF9kZWJ1Z19tYXJrZXIpIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERlYnVnTWFya2VySW5zZXJ0RVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZERlYnVnTWFya2VySW5zZXJ0RVhULXBNYXJrZXJJbmZvLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNYXJrZXJJbmZvPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUXCI+VmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQ8L2E+IHN0cnVjdHVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAidGV4dCI6ICIgVGhlIDxjb2RlPlZrQ29tbWFuZFBvb2w8L2NvZGU+IHRoYXQgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gd2FzIGFsbG9jYXRlZCBmcm9tIDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2RlYnVnX3JlcG9ydCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVC1pbnN0YW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wQ3JlYXRlSW5mbzwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUXCI+VmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVDwvYT4gc3RydWN0dXJlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVC1wQ2FsbGJhY2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENhbGxiYWNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8YSBocmVmPVwiI1ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVFwiPlZrRGVidWdSZXBvcnRDYWxsYmFja0VYVDwvYT4gaGFuZGxlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCI6IHsKKyAgICAgICIoVktfRVhUX2RlYnVnX3JlcG9ydCkiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0NSRUFURV9JTkZPX0VYVDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQtZmxhZ3MtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+ZmxhZ3M8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgPGEgaHJlZj1cIiNWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFRcIj5Wa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQ8L2E+IHZhbHVlcyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVC1wZm5DYWxsYmFjay1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wZm5DYWxsYmFjazwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1BGTl92a0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFRcIj5QRk5fdmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPC9hPiB2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrRGVidWdSZXBvcnRNZXNzYWdlRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfcmVwb3J0KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtb2JqZWN0LTAxMjQxIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIFZ1bGthbiBvYmplY3Qgb3IgPGEgaHJlZj1cIiNWS19OVUxMX0hBTkRMRVwiPlZLX05VTExfSEFORExFPC9hPiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtb2JqZWN0VHlwZS0wMTQ5OCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPm9iamVjdFR5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5WS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQ8L2NvZGU+IGFuZCA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIG5vdCA8YSBocmVmPVwiI1ZLX05VTExfSEFORExFXCI+VktfTlVMTF9IQU5ETEU8L2E+LCA8Y29kZT5vYmplY3Q8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgVnVsa2FuIG9iamVjdCBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5vYmplY3RUeXBlPC9jb2RlPiBhcyBkZWZpbmVkIGluIDxhIGhyZWY9XCIjZGVidWctcmVwb3J0LW9iamVjdC10eXBlc1wiPlZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGFuZCBWdWxrYW4gSGFuZGxlIFJlbGF0aW9uc2hpcDwvYT4uIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1pbnN0YW5jZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5pbnN0YW5jZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrSW5zdGFuY2VcIj5Wa0luc3RhbmNlPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVidWdSZXBvcnRNZXNzYWdlRVhULWZsYWdzLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIDxhIGhyZWY9XCIjVmtEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUXCI+VmtEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUPC9hPiB2YWx1ZXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVidWdSZXBvcnRNZXNzYWdlRVhULWZsYWdzLXJlcXVpcmVkYml0bWFzayIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmZsYWdzPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBub3QgYmUgPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVidWdSZXBvcnRNZXNzYWdlRVhULW9iamVjdFR5cGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+b2JqZWN0VHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUXCI+VmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ8L2E+IHZhbHVlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1wTGF5ZXJQcmVmaXgtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cExheWVyUHJlZml4PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmciCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVidWdSZXBvcnRNZXNzYWdlRVhULXBNZXNzYWdlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnBNZXNzYWdlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmciCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIjogeworICAgICAgIihWS19FWFRfZGVidWdfcmVwb3J0KSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVC1pbnN0YW5jZS0wMTI0MiIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmNhbGxiYWNrPC9jb2RlPiB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgaGVyZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVC1pbnN0YW5jZS0wMTI0MyIsCisgICAgICAgICAgInRleHQiOiAiIElmIG5vIDxjb2RlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvY29kZT4gd2VyZSBwcm92aWRlZCB3aGVuIDxjb2RlPmNhbGxiYWNrPC9jb2RlPiB3YXMgY3JlYXRlZCwgPGNvZGU+cEFsbG9jYXRvcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtaW5zdGFuY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa0luc3RhbmNlXCI+VmtJbnN0YW5jZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWNhbGxiYWNrLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNhbGxiYWNrPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUXCI+VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPC9hPiBoYW5kbGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiBJZiA8Y29kZT5wQWxsb2NhdG9yPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBBbGxvY2F0b3I8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIDxhIGhyZWY9XCIjVmtBbGxvY2F0aW9uQ2FsbGJhY2tzXCI+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC9hPiBzdHJ1Y3R1cmUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtY2FsbGJhY2stcGFyZW50IiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y2FsbGJhY2s8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIDxjb2RlPmluc3RhbmNlPC9jb2RlPiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInZrQ21kU2V0Q2hlY2twb2ludE5WIjogeworICAgICAgIihWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Q2hlY2twb2ludE5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+Y29tbWFuZEJ1ZmZlcjwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCA8YSBocmVmPVwiI1ZrQ29tbWFuZEJ1ZmZlclwiPlZrQ29tbWFuZEJ1ZmZlcjwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0NtZFNldENoZWNrcG9pbnROVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGluIHRoZSA8YSBocmVmPVwiI2NvbW1hbmRidWZmZXJzLWxpZmVjeWNsZVwiPnJlY29yZGluZyBzdGF0ZTwvYT4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrQ21kU2V0Q2hlY2twb2ludE5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgInRleHQiOiAiIFRoZSA8Y29kZT5Wa0NvbW1hbmRQb29sPC9jb2RlPiB0aGF0IDxjb2RlPmNvbW1hbmRCdWZmZXI8L2NvZGU+IHdhcyBhbGxvY2F0ZWQgZnJvbSA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBzdXBwb3J0IGdyYXBoaWNzLCBjb21wdXRlLCBvciB0cmFuc2ZlciBvcGVyYXRpb25zIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYiOiB7CisgICAgICAiKFZLX05WX2RldmljZV9kaWFnbm9zdGljX2NoZWNrcG9pbnRzKSI6IFsKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYtcXVldWUtMDIwMjUiLAorICAgICAgICAgICJ0ZXh0IjogIiBUaGUgZGV2aWNlIHRoYXQgPGNvZGU+cXVldWU8L2NvZGU+IGJlbG9uZ3MgdG8gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgaW4gdGhlIGxvc3Qgc3RhdGUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WLXF1ZXVlLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnF1ZXVlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIDxhIGhyZWY9XCIjVmtRdWV1ZVwiPlZrUXVldWU8L2E+IGhhbmRsZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYtcENoZWNrcG9pbnREYXRhQ291bnQtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cENoZWNrcG9pbnREYXRhQ291bnQ8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIDxjb2RlPnVpbnQzMl90PC9jb2RlPiB2YWx1ZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2dWlkIjogIlZVSUQtdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYtcENoZWNrcG9pbnREYXRhLXBhcmFtZXRlciIsCisgICAgICAgICAgInRleHQiOiAiIElmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IDxjb2RlPnBDaGVja3BvaW50RGF0YUNvdW50PC9jb2RlPiBpcyBub3QgPGNvZGU+MDwvY29kZT4sIGFuZCA8Y29kZT5wQ2hlY2twb2ludERhdGE8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgPGNvZGU+cENoZWNrcG9pbnREYXRhPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPGNvZGU+cENoZWNrcG9pbnREYXRhQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtDaGVja3BvaW50RGF0YU5WXCI+VmtDaGVja3BvaW50RGF0YU5WPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiVmtDaGVja3BvaW50RGF0YU5WIjogeworICAgICAgIihWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cykiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELVZrQ2hlY2twb2ludERhdGFOVi1zVHlwZS1zVHlwZSIsCisgICAgICAgICAgInRleHQiOiAiIDxjb2RlPnNUeXBlPC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSA8Y29kZT5WS19TVFJVQ1RVUkVfVFlQRV9DSEVDS1BPSU5UX0RBVEFfTlY8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa0NoZWNrcG9pbnREYXRhTlYtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF90b29saW5nX2luZm8pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgPGNvZGU+cGh5c2ljYWxEZXZpY2U8L2NvZGU+IDxzdHJvbmcgY2xhc3M9XCJwdXJwbGVcIj5tdXN0PC9zdHJvbmc+IGJlIGEgdmFsaWQgPGEgaHJlZj1cIiNWa1BoeXNpY2FsRGV2aWNlXCI+VmtQaHlzaWNhbERldmljZTwvYT4gaGFuZGxlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtcFRvb2xDb3VudC1wYXJhbWV0ZXIiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wVG9vbENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSA8Y29kZT51aW50MzJfdDwvY29kZT4gdmFsdWUiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAidnVpZCI6ICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVC1wVG9vbFByb3BlcnRpZXMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAidGV4dCI6ICIgSWYgPGNvZGU+cFRvb2xQcm9wZXJ0aWVzPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sIDxjb2RlPnBUb29sUHJvcGVydGllczwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDxjb2RlPnBUb29sQ291bnQ8L2NvZGU+IDxhIGhyZWY9XCIjVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUXCI+VmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUPC9hPiBzdHJ1Y3R1cmVzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtcFRvb2xDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgInRleHQiOiAiIElmIDxjb2RlPnBUb29sUHJvcGVydGllczwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LCB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSA8Y29kZT5wVG9vbENvdW50PC9jb2RlPiA8c3Ryb25nIGNsYXNzPVwicHVycGxlXCI+bXVzdDwvc3Ryb25nPiBiZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQiOiB7CisgICAgICAiKFZLX0VYVF90b29saW5nX2luZm8pIjogWworICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5zVHlwZTwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RPT0xfUFJPUEVSVElFU19FWFQ8L2NvZGU+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgInZ1aWQiOiAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtcE5leHQtcE5leHQiLAorICAgICAgICAgICJ0ZXh0IjogIiA8Y29kZT5wTmV4dDwvY29kZT4gPHN0cm9uZyBjbGFzcz1cInB1cnBsZVwiPm11c3Q8L3N0cm9uZz4gYmUgPGNvZGU+TlVMTDwvY29kZT4iCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L3ZrLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4taGVhZGVycy9zcmMvcmVnaXN0cnkvdmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhM2Q2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L3ZrLnhtbApAQCAtMCwwICsxLDExOTUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHJlZ2lzdHJ5PgorICAgIDxjb21tZW50PgorQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tIEV4Y2VwdGlvbnMgdG8gdGhlIEFwYWNoZSAyLjAgTGljZW5zZTogLS0tLQorCitBcyBhbiBleGNlcHRpb24sIGlmIHlvdSB1c2UgdGhpcyBTb2Z0d2FyZSB0byBnZW5lcmF0ZSBjb2RlIGFuZCBwb3J0aW9ucyBvZgordGhpcyBTb2Z0d2FyZSBhcmUgZW1iZWRkZWQgaW50byB0aGUgZ2VuZXJhdGVkIGNvZGUgYXMgYSByZXN1bHQsIHlvdSBtYXkKK3JlZGlzdHJpYnV0ZSBzdWNoIHByb2R1Y3Qgd2l0aG91dCBwcm92aWRpbmcgYXR0cmlidXRpb24gYXMgd291bGQgb3RoZXJ3aXNlCitiZSByZXF1aXJlZCBieSBTZWN0aW9ucyA0KGEpLCA0KGIpIGFuZCA0KGQpIG9mIHRoZSBMaWNlbnNlLgorCitJbiBhZGRpdGlvbiwgaWYgeW91IGNvbWJpbmUgb3IgbGluayBjb2RlIGdlbmVyYXRlZCBieSB0aGlzIFNvZnR3YXJlIHdpdGgKK3NvZnR3YXJlIHRoYXQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTHYyIG9yIHRoZSBMR1BMIHYyLjAgb3IgMi4xCisoImBDb21iaW5lZCBTb2Z0d2FyZWAiKSBhbmQgaWYgYSBjb3VydCBvZiBjb21wZXRlbnQganVyaXNkaWN0aW9uIGRldGVybWluZXMKK3RoYXQgdGhlIHBhdGVudCBwcm92aXNpb24gKFNlY3Rpb24gMyksIHRoZSBpbmRlbW5pdHkgcHJvdmlzaW9uIChTZWN0aW9uIDkpCitvciBvdGhlciBTZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGNvbmZsaWN0cyB3aXRoIHRoZSBjb25kaXRpb25zIG9mIHRoZQorYXBwbGljYWJsZSBHUEwgb3IgTEdQTCBsaWNlbnNlLCB5b3UgbWF5IHJldHJvYWN0aXZlbHkgYW5kIHByb3NwZWN0aXZlbHkKK2Nob29zZSB0byBkZWVtIHdhaXZlZCBvciBvdGhlcndpc2UgZXhjbHVkZSBzdWNoIFNlY3Rpb24ocykgb2YgdGhlIExpY2Vuc2UsCitidXQgb25seSBpbiB0aGVpciBlbnRpcmV0eSBhbmQgb25seSB3aXRoIHJlc3BlY3QgdG8gdGhlIENvbWJpbmVkIFNvZnR3YXJlLgorICAgIDwvY29tbWVudD4KKworICAgIDxjb21tZW50PgorVGhpcyBmaWxlLCB2ay54bWwsIGlzIHRoZSBWdWxrYW4gQVBJIFJlZ2lzdHJ5LiBJdCBpcyBhIGNyaXRpY2FsbHkgaW1wb3J0YW50CithbmQgbm9ybWF0aXZlIHBhcnQgb2YgdGhlIFZ1bGthbiBTcGVjaWZpY2F0aW9uLCBpbmNsdWRpbmcgYSBjYW5vbmljYWwKK21hY2hpbmUtcmVhZGFibGUgZGVmaW5pdGlvbiBvZiB0aGUgQVBJLCBwYXJhbWV0ZXIgYW5kIG1lbWJlciB2YWxpZGF0aW9uCitsYW5ndWFnZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgU3BlY2lmaWNhdGlvbiBhbmQgcmVmZXJlbmNlIHBhZ2VzLCBhbmQgb3RoZXIKK21hdGVyaWFsIHdoaWNoIGlzIHJlZ2lzdGVyZWQgYnkgS2hyb25vcywgc3VjaCBhcyB0YWdzIHVzZWQgYnkgZXh0ZW5zaW9uIGFuZAorbGF5ZXIgYXV0aG9ycy4gVGhlIGF1dGhvcml0YXRpdmUgcHVibGljIHZlcnNpb24gb2YgdmsueG1sIGlzIG1haW50YWluZWQgaW4KK3RoZSBtYXN0ZXIgYnJhbmNoIG9mIHRoZSBLaHJvbm9zIFZ1bGthbiBHaXRIdWIgcHJvamVjdC4gVGhlIGF1dGhvcml0YXRpdmUKK3ByaXZhdGUgdmVyc2lvbiBpcyBtYWludGFpbmVkIGluIHRoZSBtYXN0ZXIgYnJhbmNoIG9mIHRoZSBtZW1iZXIgZ2l0bGFiCitzZXJ2ZXIuCisgICAgPC9jb21tZW50PgorCisgICAgPHBsYXRmb3JtcyBjb21tZW50PSJWdWxrYW4gcGxhdGZvcm0gbmFtZXMsIHJlc2VydmVkIGZvciB1c2Ugd2l0aCBwbGF0Zm9ybS0gYW5kIHdpbmRvdyBzeXN0ZW0tc3BlY2lmaWMgZXh0ZW5zaW9ucyI+CisgICAgICAgIDxwbGF0Zm9ybSBuYW1lPSJ4bGliIiBwcm90ZWN0PSJWS19VU0VfUExBVEZPUk1fWExJQl9LSFIiIGNvbW1lbnQ9IlggV2luZG93IFN5c3RlbSwgWGxpYiBjbGllbnQgbGlicmFyeSIvPgorICAgICAgICA8cGxhdGZvcm0gbmFtZT0ieGxpYl94cmFuZHIiIHByb3RlY3Q9IlZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQiIGNvbW1lbnQ9IlggV2luZG93IFN5c3RlbSwgWGxpYiBjbGllbnQgbGlicmFyeSwgWFJhbmRSIGV4dGVuc2lvbiIvPgorICAgICAgICA8cGxhdGZvcm0gbmFtZT0ieGNiIiBwcm90ZWN0PSJWS19VU0VfUExBVEZPUk1fWENCX0tIUiIgY29tbWVudD0iWCBXaW5kb3cgU3lzdGVtLCBYY2IgY2xpZW50IGxpYnJhcnkiLz4KKyAgICAgICAgPHBsYXRmb3JtIG5hbWU9IndheWxhbmQiIHByb3RlY3Q9IlZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUiIgY29tbWVudD0iV2F5bGFuZCBkaXNwbGF5IHNlcnZlciBwcm90b2NvbCIvPgorICAgICAgICA8cGxhdGZvcm0gbmFtZT0iYW5kcm9pZCIgcHJvdGVjdD0iVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSIiBjb21tZW50PSJBbmRyb2lkIE9TIi8+CisgICAgICAgIDxwbGF0Zm9ybSBuYW1lPSJ3aW4zMiIgcHJvdGVjdD0iVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiIgY29tbWVudD0iTWljcm9zb2Z0IFdpbjMyIEFQSSAoYWxzbyByZWZlcnMgdG8gV2luNjQgYXBwcykiLz4KKyAgICAgICAgPHBsYXRmb3JtIG5hbWU9InZpIiBwcm90ZWN0PSJWS19VU0VfUExBVEZPUk1fVklfTk4iIGNvbW1lbnQ9Ik5pbnRlbmRvIFZpIi8+CisgICAgICAgIDxwbGF0Zm9ybSBuYW1lPSJpb3MiIHByb3RlY3Q9IlZLX1VTRV9QTEFURk9STV9JT1NfTVZLIiBjb21tZW50PSJBcHBsZSBJT1MiLz4KKyAgICAgICAgPHBsYXRmb3JtIG5hbWU9Im1hY29zIiBwcm90ZWN0PSJWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLIiBjb21tZW50PSJBcHBsZSBNYWNPUyIvPgorICAgICAgICA8cGxhdGZvcm0gbmFtZT0ibWV0YWwiIHByb3RlY3Q9IlZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQiIGNvbW1lbnQ9Ik1ldGFsIG9uIENvcmVBbmltYXRpb24gb24gQXBwbGUgcGxhdGZvcm1zIi8+CisgICAgICAgIDxwbGF0Zm9ybSBuYW1lPSJmdWNoc2lhIiBwcm90ZWN0PSJWS19VU0VfUExBVEZPUk1fRlVDSFNJQSIgY29tbWVudD0iRnVjaHNpYSIvPgorICAgICAgICA8cGxhdGZvcm0gbmFtZT0iZ2dwIiBwcm90ZWN0PSJWS19VU0VfUExBVEZPUk1fR0dQIiBjb21tZW50PSJHb29nbGUgR2FtZXMgUGxhdGZvcm0iLz4KKyAgICA8L3BsYXRmb3Jtcz4KKworICAgIDx0YWdzIGNvbW1lbnQ9IlZ1bGthbiB2ZW5kb3IvYXV0aG9yIHRhZ3MgZm9yIGV4dGVuc2lvbnMgYW5kIGxheWVycyI+CisgICAgICAgIDx0YWcgbmFtZT0iSU1HIiAgICAgICAgIGF1dGhvcj0iSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIiAgICAgIGNvbnRhY3Q9Ik1pY2hhZWwgV29yY2VzdGVyIEBtaWNoYWVsd29yY2VzdGVyIi8+CisgICAgICAgIDx0YWcgbmFtZT0iQU1EIiAgICAgICAgIGF1dGhvcj0iQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiIgIGNvbnRhY3Q9IkRhbmllbCBSYWtvcyBAZHJha29zLWFtZCIvPgorICAgICAgICA8dGFnIG5hbWU9IkFNRFgiICAgICAgICBhdXRob3I9IkFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4iICBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiLz4KKyAgICAgICAgPHRhZyBuYW1lPSJBUk0iICAgICAgICAgYXV0aG9yPSJBUk0gTGltaXRlZCIgICAgICAgICAgICAgICAgICAgY29udGFjdD0iSmFuLUhhcmFsZCBGcmVkcmlrc2VuIEBqYW5oYXJhbGRmcmVkcmlrc2VuLWFybSIvPgorICAgICAgICA8dGFnIG5hbWU9IkZTTCIgICAgICAgICBhdXRob3I9IkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIiBjb250YWN0PSJOb3JiZXJ0IE5vcHBlciBARnNsTm9wcGVyIi8+CisgICAgICAgIDx0YWcgbmFtZT0iQlJDTSIgICAgICAgIGF1dGhvcj0iQnJvYWRjb20gQ29ycG9yYXRpb24iICAgICAgICAgIGNvbnRhY3Q9IkdyYWVtZSBMZWVzZSBAZ25sMjEiLz4KKyAgICAgICAgPHRhZyBuYW1lPSJOWFAiICAgICAgICAgYXV0aG9yPSJOWFAgU2VtaWNvbmR1Y3RvcnMgTi5WLiIgICAgICAgY29udGFjdD0iTm9yYmVydCBOb3BwZXIgQEZzbE5vcHBlciIvPgorICAgICAgICA8dGFnIG5hbWU9Ik5WIiAgICAgICAgICBhdXRob3I9Ik5WSURJQSBDb3Jwb3JhdGlvbiIgICAgICAgICAgICBjb250YWN0PSJEYW5pZWwgS29jaCBAZGdrb2NoIi8+CisgICAgICAgIDx0YWcgbmFtZT0iTlZYIiAgICAgICAgIGF1dGhvcj0iTlZJRElBIENvcnBvcmF0aW9uIiAgICAgICAgICAgIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giLz4KKyAgICAgICAgPHRhZyBuYW1lPSJWSVYiICAgICAgICAgYXV0aG9yPSJWaXZhbnRlIENvcnBvcmF0aW9uIiAgICAgICAgICAgY29udGFjdD0iWWFuanVuIFpoYW5nIGdpdGxhYjpAeWFuanVuemhhbmciLz4KKyAgICAgICAgPHRhZyBuYW1lPSJWU0kiICAgICAgICAgYXV0aG9yPSJWZXJpU2lsaWNvbiBIb2xkaW5ncyBDby4sIEx0ZC4iIGNvbnRhY3Q9Illhbmp1biBaaGFuZyBnaXRsYWI6QHlhbmp1bnpoYW5nIi8+CisgICAgICAgIDx0YWcgbmFtZT0iS0RBQiIgICAgICAgIGF1dGhvcj0iS0RBQiIgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3Q9IlNlYW4gSGFybWVyIEBzZWFuaGFybWVyIi8+CisgICAgICAgIDx0YWcgbmFtZT0iQU5EUk9JRCIgICAgIGF1dGhvcj0iR29vZ2xlIExMQyIgICAgICAgICAgICAgICAgICAgIGNvbnRhY3Q9Ikplc3NlIEhhbGwgQGNyaXRzZWMiLz4KKyAgICAgICAgPHRhZyBuYW1lPSJDSFJPTUlVTSIgICAgYXV0aG9yPSJHb29nbGUgTExDIiAgICAgICAgICAgICAgICAgICAgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyIvPgorICAgICAgICA8dGFnIG5hbWU9IkZVQ0hTSUEiICAgICBhdXRob3I9Ikdvb2dsZSBMTEMiICAgICAgICAgICAgICAgICAgICBjb250YWN0PSJDcmFpZyBTdG91dCBAY2RvdHN0b3V0LCBKZXNzZSBIYWxsIEBjcml0c2VjIi8+CisgICAgICAgIDx0YWcgbmFtZT0iR0dQIiAgICAgICAgIGF1dGhvcj0iR29vZ2xlLCBMTEMiICAgICAgICAgICAgICAgICAgIGNvbnRhY3Q9IkplYW4tRnJhbmNvaXMgUm95IEBqZnJveSwgSGFpIE5ndXllbiBAY2hhb3RpY2JvYiwgSmVzc2UgSGFsbCBAY3JpdHNlYyIvPgorICAgICAgICA8dGFnIG5hbWU9IkdPT0dMRSIgICAgICBhdXRob3I9Ikdvb2dsZSBMTEMiICAgICAgICAgICAgICAgICAgICBjb250YWN0PSJKZXNzZSBIYWxsIEBjcml0c2VjIi8+CisgICAgICAgIDx0YWcgbmFtZT0iUUNPTSIgICAgICAgIGF1dGhvcj0iUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIiAgIGNvbnRhY3Q9Ik1hdXJpY2UgUmliYmxlIEBtcmliYmxlIi8+CisgICAgICAgIDx0YWcgbmFtZT0iTFVOQVJHIiAgICAgIGF1dGhvcj0iTHVuYXJHLCBJbmMuIiAgICAgICAgICAgICAgICAgIGNvbnRhY3Q9IkthcmVuIEdoYXZhbSBAa2FyZW5naGF2YW0tbHVuYXJnIi8+CisgICAgICAgIDx0YWcgbmFtZT0iU0FNU1VORyIgICAgIGF1dGhvcj0iU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4iIGNvbnRhY3Q9IkFsb24gT3ItYmFjaCBAYWxvbm9yYmFjaCIvPgorICAgICAgICA8dGFnIG5hbWU9IlNFQyIgICAgICAgICBhdXRob3I9IlNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuIiBjb250YWN0PSJBbG9uIE9yLWJhY2ggQGFsb25vcmJhY2giLz4KKyAgICAgICAgPHRhZyBuYW1lPSJUSVpFTiIgICAgICAgYXV0aG9yPSJTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLiIgY29udGFjdD0iQWxvbiBPci1iYWNoIEBhbG9ub3JiYWNoIi8+CisgICAgICAgIDx0YWcgbmFtZT0iUkVOREVSRE9DIiAgIGF1dGhvcj0iUmVuZGVyRG9jIChyZW5kZXJkb2Mub3JnKSIgICAgIGNvbnRhY3Q9IkJhbGR1ciBLYXJsc3NvbiBAYmFsZHVyayIvPgorICAgICAgICA8dGFnIG5hbWU9Ik5OIiAgICAgICAgICBhdXRob3I9Ik5pbnRlbmRvIENvLiwgTHRkLiIgICAgICAgICAgICBjb250YWN0PSJZYXN1aGlybyBZb3NoaW9rYSBnaXRsYWI6QHlvc2hpb2thX3lhc3VoaXJvIi8+CisgICAgICAgIDx0YWcgbmFtZT0iTVZLIiAgICAgICAgIGF1dGhvcj0iVGhlIEJyZW53aWxsIFdvcmtzaG9wIEx0ZC4iICAgIGNvbnRhY3Q9IkJpbGwgSG9sbGluZ3MgQGJpbGxob2xsaW5ncyIvPgorICAgICAgICA8dGFnIG5hbWU9IktIUiIgICAgICAgICBhdXRob3I9Iktocm9ub3MiICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0PSJUb20gT2xzb24gQHRvbW9sc29uIi8+CisgICAgICAgIDx0YWcgbmFtZT0iS0hYIiAgICAgICAgIGF1dGhvcj0iS2hyb25vcyIgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3Q9IlRvbSBPbHNvbiBAdG9tb2xzb24iLz4KKyAgICAgICAgPHRhZyBuYW1lPSJFWFQiICAgICAgICAgYXV0aG9yPSJNdWx0aXZlbmRvciIgICAgICAgICAgICAgICAgICAgY29udGFjdD0iSm9uIExlZWNoIEBvZGRoYWNrIi8+CisgICAgICAgIDx0YWcgbmFtZT0iTUVTQSIgICAgICAgIGF1dGhvcj0iTWVzYSBvcGVuIHNvdXJjZSBwcm9qZWN0IiAgICAgIGNvbnRhY3Q9IkNoYWQgVmVyc2FjZSBAY2hhZHZlcnNhcnksIERhbmllbCBTdG9uZSBAZm9vaXNoYmFyLCBEYXZpZCBBaXJsaWUgQGFpcmxpZWQsIEphc29uIEVrc3RyYW5kIEBqZWtzdHJhbmQiLz4KKyAgICAgICAgPHRhZyBuYW1lPSJJTlRFTCIgICAgICAgYXV0aG9yPSJJbnRlbCBDb3Jwb3JhdGlvbiIgICAgICAgICAgICAgY29udGFjdD0iU2xhd2VrIEdyYWpld3NraSBAc2dyYWpld3NraSIvPgorICAgIDwvdGFncz4KKworICAgIDx0eXBlcyBjb21tZW50PSJWdWxrYW4gdHlwZSBkZWZpbml0aW9ucyI+CisgICAgICAgIDx0eXBlIG5hbWU9InZrX3BsYXRmb3JtIiBjYXRlZ29yeT0iaW5jbHVkZSI+I2luY2x1ZGUgInZrX3BsYXRmb3JtLmgiPC90eXBlPgorCisgICAgICAgICAgICA8Y29tbWVudD5XU0kgZXh0ZW5zaW9uczwvY29tbWVudD4KKworICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaW5jbHVkZSIgbmFtZT0iWDExL1hsaWIuaCIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaW5jbHVkZSIgbmFtZT0iWDExL2V4dGVuc2lvbnMvWHJhbmRyLmgiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImluY2x1ZGUiIG5hbWU9IndheWxhbmQtY2xpZW50LmgiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImluY2x1ZGUiIG5hbWU9IndpbmRvd3MuaCIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaW5jbHVkZSIgbmFtZT0ieGNiL3hjYi5oIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJpbmNsdWRlIiBuYW1lPSJ6aXJjb24vdHlwZXMuaCIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaW5jbHVkZSIgbmFtZT0iZ2dwX2MvdnVsa2FuX3R5cGVzLmgiLz4KKyAgICAgICAgICAgIDxjb21tZW50PgorICAgICAgICAgICAgICAgIEluIHRoZSBjdXJyZW50IGhlYWRlciBzdHJ1Y3R1cmUsIGVhY2ggcGxhdGZvcm0ncyBpbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgYXJlIGNvbmZpbmVkIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgaGVhZGVyICh2dWxrYW5feGxpYi5oLAorICAgICAgICAgICAgICAgIHZ1bGthbl93aW4zMi5oLCBldGMuKS4gVGhlc2UgaGVhZGVycyBhcmUgbm90IHNlbGYtY29udGFpbmVkLAorICAgICAgICAgICAgICAgIGFuZCBzaG91bGQgbm90IGluY2x1ZGUgbmF0aXZlIGhlYWRlcnMgKFgxMS9YbGliLmgsCisgICAgICAgICAgICAgICAgd2luZG93cy5oLCBldGMuKS4gQ29kZSBzaG91bGQgZWl0aGVyIGluY2x1ZGUgdnVsa2FuLmggYWZ0ZXIKKyAgICAgICAgICAgICAgICBkZWZpbmluZyB0aGUgYXBwcm9wcmlhdGUgVktfVVNFX1BMQVRGT1JNX3BsYXRmb3JtCisgICAgICAgICAgICAgICAgbWFjcm9zLCBvciBpbmNsdWRlIHRoZSByZXF1aXJlZCBuYXRpdmUgaGVhZGVycyBwcmlvciB0bworICAgICAgICAgICAgICAgIGV4cGxpY2l0bHkgaW5jbHVkaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBsYXRmb3JtIGhlYWRlci4KKworICAgICAgICAgICAgICAgIFRvIGFjY29tcGxpc2ggdGhpcywgdGhlIGRlcGVuZGVuY2llcyBvZiBuYXRpdmUgdHlwZXMgcmVxdWlyZQorICAgICAgICAgICAgICAgIG5hdGl2ZSBoZWFkZXJzLCBidXQgdGhlIFhNTCBkZWZpbmVzIHRoZSBjb250ZW50IGZvciB0aG9zZQorICAgICAgICAgICAgICAgIG5hdGl2ZSBoZWFkZXJzIGFzIGVtcHR5LiBUaGUgYWN0dWFsIG5hdGl2ZSBoZWFkZXIgaW5jbHVkZXMKKyAgICAgICAgICAgICAgICBjYW4gYmUgcmVzdG9yZWQgYnkgbW9kaWZ5aW5nIHRoZSBuYXRpdmUgaGVhZGVyIHRhZ3MgYWJvdmUKKyAgICAgICAgICAgICAgICB0byAjaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUgaW4gdGhlICduYW1lJyBhdHRyaWJ1dGUuCisgICAgICAgICAgICA8L2NvbW1lbnQ+CisKKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlgxMS9YbGliLmgiIG5hbWU9IkRpc3BsYXkiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlgxMS9YbGliLmgiIG5hbWU9IlZpc3VhbElEIi8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJYMTEvWGxpYi5oIiBuYW1lPSJXaW5kb3ciLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlgxMS9leHRlbnNpb25zL1hyYW5kci5oIiBuYW1lPSJSUk91dHB1dCIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0id2F5bGFuZC1jbGllbnQuaCIgbmFtZT0id2xfZGlzcGxheSIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0id2F5bGFuZC1jbGllbnQuaCIgbmFtZT0id2xfc3VyZmFjZSIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0id2luZG93cy5oIiBuYW1lPSJISU5TVEFOQ0UiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IndpbmRvd3MuaCIgbmFtZT0iSFdORCIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0id2luZG93cy5oIiBuYW1lPSJITU9OSVRPUiIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0id2luZG93cy5oIiBuYW1lPSJIQU5ETEUiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IndpbmRvd3MuaCIgbmFtZT0iU0VDVVJJVFlfQVRUUklCVVRFUyIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0id2luZG93cy5oIiBuYW1lPSJEV09SRCIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0id2luZG93cy5oIiBuYW1lPSJMUENXU1RSIi8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJ4Y2IveGNiLmgiIG5hbWU9InhjYl9jb25uZWN0aW9uX3QiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9InhjYi94Y2IuaCIgbmFtZT0ieGNiX3Zpc3VhbGlkX3QiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9InhjYi94Y2IuaCIgbmFtZT0ieGNiX3dpbmRvd190Ii8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJ6aXJjb24vdHlwZXMuaCIgbmFtZT0ienhfaGFuZGxlX3QiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9ImdncF9jL3Z1bGthbl90eXBlcy5oIiBuYW1lPSJHZ3BTdHJlYW1EZXNjcmlwdG9yIi8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJnZ3BfYy92dWxrYW5fdHlwZXMuaCIgbmFtZT0iR2dwRnJhbWVUb2tlbiIvPgorCisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJkZWZpbmUiPiNkZWZpbmUgPG5hbWU+VktfTUFLRV9WRVJTSU9OPC9uYW1lPihtYWpvciwgbWlub3IsIHBhdGNoKSBcCisgICAgKCgobWFqb3IpICZsdDsmbHQ7IDIyKSB8ICgobWlub3IpICZsdDsmbHQ7IDEyKSB8IChwYXRjaCkpPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZGVmaW5lIj4jZGVmaW5lIDxuYW1lPlZLX1ZFUlNJT05fTUFKT1I8L25hbWU+KHZlcnNpb24pICgodWludDMyX3QpKHZlcnNpb24pICZndDsmZ3Q7IDIyKTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImRlZmluZSI+I2RlZmluZSA8bmFtZT5WS19WRVJTSU9OX01JTk9SPC9uYW1lPih2ZXJzaW9uKSAoKCh1aW50MzJfdCkodmVyc2lvbikgJmd0OyZndDsgMTIpICZhbXA7IDB4M2ZmKTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImRlZmluZSI+I2RlZmluZSA8bmFtZT5WS19WRVJTSU9OX1BBVENIPC9uYW1lPih2ZXJzaW9uKSAoKHVpbnQzMl90KSh2ZXJzaW9uKSAmYW1wOyAweGZmZik8L3R5cGU+CisKKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImRlZmluZSI+Ly8gREVQUkVDQVRFRDogVGhpcyBkZWZpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gU3BlY2lmaWMgdmVyc2lvbiBkZWZpbmVzIChlLmcuIFZLX0FQSV9WRVJTSU9OXzFfMCksIG9yIHRoZSBWS19NQUtFX1ZFUlNJT04gbWFjcm8sIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisvLyNkZWZpbmUgPG5hbWU+VktfQVBJX1ZFUlNJT048L25hbWU+IDx0eXBlPlZLX01BS0VfVkVSU0lPTjwvdHlwZT4oMSwgMCwgMCkgLy8gUGF0Y2ggdmVyc2lvbiBzaG91bGQgYWx3YXlzIGJlIHNldCB0byAwPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZGVmaW5lIj4vLyBWdWxrYW4gMS4wIHZlcnNpb24gbnVtYmVyCisjZGVmaW5lIDxuYW1lPlZLX0FQSV9WRVJTSU9OXzFfMDwvbmFtZT4gPHR5cGU+VktfTUFLRV9WRVJTSU9OPC90eXBlPigxLCAwLCAwKS8vIFBhdGNoIHZlcnNpb24gc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gMDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImRlZmluZSI+Ly8gVnVsa2FuIDEuMSB2ZXJzaW9uIG51bWJlcgorI2RlZmluZSA8bmFtZT5WS19BUElfVkVSU0lPTl8xXzE8L25hbWU+IDx0eXBlPlZLX01BS0VfVkVSU0lPTjwvdHlwZT4oMSwgMSwgMCkvLyBQYXRjaCB2ZXJzaW9uIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIDA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJkZWZpbmUiPi8vIFZlcnNpb24gb2YgdGhpcyBmaWxlCisjZGVmaW5lIDxuYW1lPlZLX0hFQURFUl9WRVJTSU9OPC9uYW1lPiAxMzA8L3R5cGU+CisKKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImRlZmluZSI+CisjZGVmaW5lIDxuYW1lPlZLX0RFRklORV9IQU5ETEU8L25hbWU+KG9iamVjdCkgdHlwZWRlZiBzdHJ1Y3Qgb2JqZWN0IyNfVCogb2JqZWN0OzwvdHlwZT4KKworICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZGVmaW5lIiBuYW1lPSJWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUiPgorI2lmICFkZWZpbmVkKFZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRSkKKyNpZiBkZWZpbmVkKF9fTFA2NF9fKSB8fCBkZWZpbmVkKF9XSU42NCkgfHwgKGRlZmluZWQoX194ODZfNjRfXykgJmFtcDsmYW1wOyAhZGVmaW5lZChfX0lMUDMyX18pICkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX19pYTY0KSB8fCBkZWZpbmVkIChfTV9JQTY0KSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisgICAgICAgICNkZWZpbmUgVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKG9iamVjdCkgdHlwZWRlZiBzdHJ1Y3Qgb2JqZWN0IyNfVCAqb2JqZWN0OworI2Vsc2UKKyAgICAgICAgI2RlZmluZSBWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUob2JqZWN0KSB0eXBlZGVmIHVpbnQ2NF90IG9iamVjdDsKKyNlbmRpZgorI2VuZGlmPC90eXBlPgorCisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJkZWZpbmUiPgorI2RlZmluZSA8bmFtZT5WS19OVUxMX0hBTkRMRTwvbmFtZT4gMDwvdHlwZT4KKworICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZGVmaW5lIj5zdHJ1Y3QgPG5hbWU+QU5hdGl2ZVdpbmRvdzwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZGVmaW5lIj5zdHJ1Y3QgPG5hbWU+QUhhcmR3YXJlQnVmZmVyPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJkZWZpbmUiPgorI2lmZGVmIF9fT0JKQ19fCitAY2xhc3MgQ0FNZXRhbExheWVyOworI2Vsc2UKK3R5cGVkZWYgdm9pZCA8bmFtZT5DQU1ldGFsTGF5ZXI8L25hbWU+OworI2VuZGlmPC90eXBlPgorCisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJiYXNldHlwZSI+dHlwZWRlZiA8dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+VmtTYW1wbGVNYXNrPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJiYXNldHlwZSI+dHlwZWRlZiA8dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+VmtCb29sMzI8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImJhc2V0eXBlIj50eXBlZGVmIDx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5Wa0ZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJiYXNldHlwZSI+dHlwZWRlZiA8dHlwZT51aW50NjRfdDwvdHlwZT4gPG5hbWU+VmtEZXZpY2VTaXplPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJiYXNldHlwZSI+dHlwZWRlZiA8dHlwZT51aW50NjRfdDwvdHlwZT4gPG5hbWU+VmtEZXZpY2VBZGRyZXNzPC9uYW1lPjs8L3R5cGU+CisKKyAgICAgICAgICAgIDxjb21tZW50PkJhc2ljIEMgdHlwZXMsIHB1bGxlZCBpbiB2aWEgdmtfcGxhdGZvcm0uaDwvY29tbWVudD4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9InZrX3BsYXRmb3JtIiBuYW1lPSJ2b2lkIi8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJ2a19wbGF0Zm9ybSIgbmFtZT0iY2hhciIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0idmtfcGxhdGZvcm0iIG5hbWU9ImZsb2F0Ii8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJ2a19wbGF0Zm9ybSIgbmFtZT0iZG91YmxlIi8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJ2a19wbGF0Zm9ybSIgbmFtZT0idWludDhfdCIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0idmtfcGxhdGZvcm0iIG5hbWU9InVpbnQxNl90Ii8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJ2a19wbGF0Zm9ybSIgbmFtZT0idWludDMyX3QiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9InZrX3BsYXRmb3JtIiBuYW1lPSJ1aW50NjRfdCIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0idmtfcGxhdGZvcm0iIG5hbWU9ImludDMyX3QiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9InZrX3BsYXRmb3JtIiBuYW1lPSJpbnQ2NF90Ii8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJ2a19wbGF0Zm9ybSIgbmFtZT0ic2l6ZV90Ii8+CisgICAgICAgIDx0eXBlIG5hbWU9ImludCIvPgorCisgICAgICAgICAgICA8Y29tbWVudD5CaXRtYXNrIHR5cGVzPC9jb21tZW50PgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzIiAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrRnJhbWVidWZmZXJDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUXVlcnlQb29sQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrUmVuZGVyUGFzc0NyZWF0ZUZsYWdCaXRzIiAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1JlbmRlclBhc3NDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrU2FtcGxlckNyZWF0ZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtQaXBlbGluZUxheW91dENyZWF0ZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtQaXBlbGluZUNhY2hlQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrQnVmZmVyVmlld0NyZWF0ZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtJbnN0YW5jZUNyZWF0ZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtEZXZpY2VDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIiAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrRGV2aWNlUXVldWVDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtRdWV1ZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUXVldWVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIiAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrTWVtb3J5UHJvcGVydHlGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtNZW1vcnlIZWFwRmxhZ0JpdHMiICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrTWVtb3J5SGVhcEZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0FjY2Vzc0ZsYWdCaXRzIiAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtBY2Nlc3NGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtCdWZmZXJVc2FnZUZsYWdCaXRzIiAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrQnVmZmVyVXNhZ2VGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtCdWZmZXJDcmVhdGVGbGFnQml0cyIgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrQnVmZmVyQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrU2hhZGVyU3RhZ2VGbGFnQml0cyIgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1NoYWRlclN0YWdlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0ltYWdlVXNhZ2VGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrSW1hZ2VDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cyIgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrQ29sb3JDb21wb25lbnRGbGFnQml0cyIgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0NvbG9yQ29tcG9uZW50RmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrRmVuY2VDcmVhdGVGbGFnQml0cyIgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0ZlbmNlQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1NlbWFwaG9yZUNyZWF0ZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyIgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtGb3JtYXRGZWF0dXJlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrUXVlcnlDb250cm9sRmxhZ0JpdHMiICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1F1ZXJ5Q29udHJvbEZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1F1ZXJ5UmVzdWx0RmxhZ0JpdHMiICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtRdWVyeVJlc3VsdEZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1NoYWRlck1vZHVsZUNyZWF0ZUZsYWdCaXRzIiAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtTaGFkZXJNb2R1bGVDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrRXZlbnRDcmVhdGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzIiAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzIiAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtDb21tYW5kUG9vbFJlc2V0RmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHMiICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtDb21tYW5kQnVmZmVyUmVzZXRGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0cyIgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cyIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa01lbW9yeU1hcEZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtJbWFnZUFzcGVjdEZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1NwYXJzZU1lbW9yeUJpbmRGbGFnQml0cyIgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtTcGFyc2VNZW1vcnlCaW5kRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0cyIgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1NwYXJzZUltYWdlRm9ybWF0RmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMiICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyIgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtQaXBlbGluZVN0YWdlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrU2FtcGxlQ291bnRGbGFnQml0cyIgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1NhbXBsZUNvdW50RmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMiICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1N0ZW5jaWxGYWNlRmxhZ0JpdHMiICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtTdGVuY2lsRmFjZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0N1bGxNb2RlRmxhZ0JpdHMiICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtDdWxsTW9kZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMiICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrRGVwZW5kZW5jeUZsYWdCaXRzIiAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0RlcGVuZGVuY3lGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtTdWJncm91cEZlYXR1cmVGbGFnQml0cyIgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrU3ViZ3JvdXBGZWF0dXJlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlgiICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdzTlZYPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWCIgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlg8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrR2VvbWV0cnlGbGFnQml0c05WIiAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrR2VvbWV0cnlGbGFnc05WPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0dlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WIiAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0dlb21ldHJ5SW5zdGFuY2VGbGFnc05WPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlY8L25hbWU+OzwvdHlwZT4KKworICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayIgbmFtZT0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFnc0tIUiIgYWxpYXM9IlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlRmxhZ3MiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQiIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ3NFWFQ8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUiIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0FjcXVpcmVQcm9maWxpbmdMb2NrRmxhZ0JpdHNLSFIiICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrQWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnc0tIUjwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIiICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrU2VtYXBob3JlV2FpdEZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sRmxhZ0JpdHNBTUQiIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xGbGFnc0FNRDwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtTaGFkZXJDb3JlUHJvcGVydGllc0ZsYWdCaXRzQU1EIiBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1NoYWRlckNvcmVQcm9wZXJ0aWVzRmxhZ3NBTUQ8L25hbWU+OzwvdHlwZT4KKworICAgICAgICAgICAgPGNvbW1lbnQ+V1NJIGV4dGVuc2lvbnM8L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIiICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtDb21wb3NpdGVBbHBoYUZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIiICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiIgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFI8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFIiICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1N3YXBjaGFpbkNyZWF0ZUZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtEaXNwbGF5TW9kZUNyZWF0ZUZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtWaVN1cmZhY2VDcmVhdGVGbGFnc05OPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtXaW4zMlN1cmZhY2VDcmVhdGVGbGFnc0tIUjwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrWGxpYlN1cmZhY2VDcmVhdGVGbGFnc0tIUjwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrWGNiU3VyZmFjZUNyZWF0ZUZsYWdzS0hSPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtJT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVks8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa01hY09TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtNZXRhbFN1cmZhY2VDcmVhdGVGbGFnc0VYVDwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUZsYWdzRlVDSFNJQTwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVGbGFnc0dHUDwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQ8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyIgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayIgbmFtZT0iVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzS0hSIiAgICAgICAgICAgICAgIGFsaWFzPSJWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrTWVtb3J5QWxsb2NhdGVGbGFnQml0cyIgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa01lbW9yeUFsbG9jYXRlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayIgbmFtZT0iVmtNZW1vcnlBbGxvY2F0ZUZsYWdzS0hSIiAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa01lbW9yeUFsbG9jYXRlRmxhZ3MiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIiBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUjwvbmFtZT47PC90eXBlPgorCisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQiICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtEZWJ1Z1JlcG9ydEZsYWdzRVhUPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtDb21tYW5kUG9vbFRyaW1GbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIiBuYW1lPSJWa0NvbW1hbmRQb29sVHJpbUZsYWdzS0hSIiAgICAgICAgICAgICAgICAgYWxpYXM9IlZrQ29tbWFuZFBvb2xUcmltRmxhZ3MiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlYiIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NOVjwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIiBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzS0hSIiAgICAgICAgYWxpYXM9IlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHMiIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayIgbmFtZT0iVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnc0tIUiIgICAgICAgICAgIGFsaWFzPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzIi8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIiBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3NLSFIiICAgICBhbGlhcz0iVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFncyIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0cyIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIiBuYW1lPSJWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzS0hSIiAgICAgICAgYWxpYXM9IlZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3MiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMiIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrU2VtYXBob3JlSW1wb3J0RmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayIgbmFtZT0iVmtTZW1hcGhvcmVJbXBvcnRGbGFnc0tIUiIgICAgICAgICAgICAgICAgIGFsaWFzPSJWa1NlbWFwaG9yZUltcG9ydEZsYWdzIi8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMiIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnczwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIiBuYW1lPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3NLSFIiICAgICAgICAgYWxpYXM9IlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncyIvPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIiBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ3M8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayIgbmFtZT0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzS0hSIiAgICAgICAgICAgIGFsaWFzPSJWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ3MiLz4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrRmVuY2VJbXBvcnRGbGFnQml0cyIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtGZW5jZUltcG9ydEZsYWdzPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siIG5hbWU9IlZrRmVuY2VJbXBvcnRGbGFnc0tIUiIgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtGZW5jZUltcG9ydEZsYWdzIi8+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQiICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtTdXJmYWNlQ291bnRlckZsYWdzRVhUPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlRmxhZ3NOVjwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVGbGFnc0VYVDwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUZsYWdzTlY8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVGbGFnc05WPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVGbGFnc05WPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVGbGFnc0VYVDwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQiICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVDwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCIgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlRmxhZ3NFWFQ8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFGbGFnc0VYVDwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PSJiaXRtYXNrIj50eXBlZGVmIDx0eXBlPlZrRmxhZ3M8L3R5cGU+IDxuYW1lPlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVGbGFnc0VYVDwvbmFtZT47PC90eXBlPgorICAgICAgICA8dHlwZSByZXF1aXJlcz0iVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUIiBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQ8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVCIgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQ8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiIgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1Jlc29sdmVNb2RlRmxhZ3NLSFI8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlRmxhZ3NFWFQ8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT0iYml0bWFzayI+dHlwZWRlZiA8dHlwZT5Wa0ZsYWdzPC90eXBlPiA8bmFtZT5Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlRmxhZ3NFWFQ8L25hbWU+OzwvdHlwZT4KKyAgICAgICAgPHR5cGUgcmVxdWlyZXM9IlZrU3dhcGNoYWluSW1hZ2VVc2FnZUZsYWdCaXRzQU5EUk9JRCIgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtTd2FwY2hhaW5JbWFnZVVzYWdlRmxhZ3NBTkRST0lEPC9uYW1lPjs8L3R5cGU+CisgICAgICAgIDx0eXBlIHJlcXVpcmVzPSJWa1Rvb2xQdXJwb3NlRmxhZ0JpdHNFWFQiICAgICAgICAgY2F0ZWdvcnk9ImJpdG1hc2siPnR5cGVkZWYgPHR5cGU+VmtGbGFnczwvdHlwZT4gPG5hbWU+VmtUb29sUHVycG9zZUZsYWdzRVhUPC9uYW1lPjs8L3R5cGU+CisKKyAgICAgICAgICAgIDxjb21tZW50PlR5cGVzIHdoaWNoIGNhbiBiZSB2b2lkIHBvaW50ZXJzIG9yIGNsYXNzIHBvaW50ZXJzLCBzZWxlY3RlZCBhdCBjb21waWxlIHRpbWU8L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiPjx0eXBlPlZLX0RFRklORV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrSW5zdGFuY2U8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0luc3RhbmNlIj48dHlwZT5WS19ERUZJTkVfSEFORExFPC90eXBlPig8bmFtZT5Wa1BoeXNpY2FsRGV2aWNlPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtQaHlzaWNhbERldmljZSI+PHR5cGU+VktfREVGSU5FX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtEZXZpY2U8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0RldmljZSI+PHR5cGU+VktfREVGSU5FX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtRdWV1ZTwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrQ29tbWFuZFBvb2wiPjx0eXBlPlZLX0RFRklORV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrQ29tbWFuZEJ1ZmZlcjwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrRGV2aWNlTWVtb3J5PC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtDb21tYW5kUG9vbDwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrQnVmZmVyPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtCdWZmZXJWaWV3PC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtJbWFnZTwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrSW1hZ2VWaWV3PC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtTaGFkZXJNb2R1bGU8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0RldmljZSI+PHR5cGU+VktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFPC90eXBlPig8bmFtZT5Wa1BpcGVsaW5lPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtQaXBlbGluZUxheW91dDwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrU2FtcGxlcjwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGVzY3JpcHRvclBvb2wiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtEZXNjcmlwdG9yU2V0PC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtEZXNjcmlwdG9yU2V0TGF5b3V0PC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtEZXNjcmlwdG9yUG9vbDwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrRmVuY2U8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0RldmljZSI+PHR5cGU+VktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFPC90eXBlPig8bmFtZT5Wa1NlbWFwaG9yZTwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrRXZlbnQ8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0RldmljZSI+PHR5cGU+VktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFPC90eXBlPig8bmFtZT5Wa1F1ZXJ5UG9vbDwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrRnJhbWVidWZmZXI8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0RldmljZSI+PHR5cGU+VktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFPC90eXBlPig8bmFtZT5Wa1JlbmRlclBhc3M8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0RldmljZSI+PHR5cGU+VktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFPC90eXBlPig8bmFtZT5Wa1BpcGVsaW5lQ2FjaGU8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0RldmljZSI+PHR5cGU+VktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFPC90eXBlPig8bmFtZT5Wa09iamVjdFRhYmxlTlZYPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgbmFtZT0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiIGFsaWFzPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrU2FtcGxlclljYmNyQ29udmVyc2lvbjwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBuYW1lPSJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiICAgYWxpYXM9IlZrU2FtcGxlclljYmNyQ29udmVyc2lvbiIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrVmFsaWRhdGlvbkNhY2hlRVhUPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtEZXZpY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrRGV2aWNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw8L25hbWU+KTwvdHlwZT4KKworICAgICAgICAgICAgPGNvbW1lbnQ+V1NJIGV4dGVuc2lvbnM8L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtEaXNwbGF5S0hSPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtQaHlzaWNhbERldmljZSxWa0Rpc3BsYXlLSFIiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtEaXNwbGF5TW9kZUtIUjwvbmFtZT4pPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iaGFuZGxlIiBwYXJlbnQ9IlZrSW5zdGFuY2UiPjx0eXBlPlZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRTwvdHlwZT4oPG5hbWU+VmtTdXJmYWNlS0hSPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtTdXJmYWNlS0hSIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrU3dhcGNoYWluS0hSPC9uYW1lPik8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJoYW5kbGUiIHBhcmVudD0iVmtJbnN0YW5jZSI+PHR5cGU+VktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFPC90eXBlPig8bmFtZT5Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ8L25hbWU+KTwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImhhbmRsZSIgcGFyZW50PSJWa0luc3RhbmNlIj48dHlwZT5WS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEU8L3R5cGU+KDxuYW1lPlZrRGVidWdVdGlsc01lc3NlbmdlckVYVDwvbmFtZT4pPC90eXBlPgorCisgICAgICAgICAgICA8Y29tbWVudD5UeXBlcyBnZW5lcmF0ZWQgZnJvbSBjb3JyZXNwb25kaW5nIGVudW1zIHRhZ3MgYmVsb3c8L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrQXR0YWNobWVudExvYWRPcCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtBdHRhY2htZW50U3RvcmVPcCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtCbGVuZEZhY3RvciIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtCbGVuZE9wIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0JvcmRlckNvbG9yIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0ZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUXVlcnlQb29sQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUmVuZGVyUGFzc0NyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNhY2hlSGVhZGVyVmVyc2lvbiIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUxheW91dENyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lQ2FjaGVDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtCdWZmZXJWaWV3Q3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrSW5zdGFuY2VDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0J1ZmZlckNyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0J1ZmZlclVzYWdlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrQ29sb3JDb21wb25lbnRGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtDb21wb25lbnRTd2l6emxlIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbW1hbmRCdWZmZXJMZXZlbCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtDb21wYXJlT3AiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrQ3VsbE1vZGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXNjcmlwdG9yVHlwZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtEeW5hbWljU3RhdGUiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRmVuY2VDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQb2x5Z29uTW9kZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtGb3JtYXQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0Zyb250RmFjZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1hZ2VMYXlvdXQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1hZ2VUaWxpbmciIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1hZ2VUeXBlIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlVXNhZ2VGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZVZpZXdUeXBlIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1NoYXJpbmdNb2RlIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0luZGV4VHlwZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtMb2dpY09wIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeUhlYXBGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtBY2Nlc3NGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVHlwZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUJpbmRQb2ludCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1ByaW1pdGl2ZVRvcG9sb2d5IiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1F1ZXJ5Q29udHJvbEZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtRdWVyeVJlc3VsdEZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1F1ZXJ5VHlwZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtRdWV1ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1N1YnBhc3NDb250ZW50cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtSZXN1bHQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU2hhZGVyU3RhZ2VGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTcGFyc2VNZW1vcnlCaW5kRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU3RlbmNpbEZhY2VGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTdGVuY2lsT3AiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU3RydWN0dXJlVHlwZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrSW50ZXJuYWxBbGxvY2F0aW9uVHlwZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTYW1wbGVyQWRkcmVzc01vZGUiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRmlsdGVyIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJNaXBtYXBNb2RlIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1ZlcnRleElucHV0UmF0ZSIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTYW1wbGVDb3VudEZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVwZW5kZW5jeUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa09iamVjdFR5cGUiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUIiBjYXRlZ29yeT0iZW51bSIvPgorCisgICAgICAgIDxjb21tZW50PkV4dGVuc2lvbnM8L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlgiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlgiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrT2JqZWN0RW50cnlUeXBlTlZYIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGUiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJlbnVtIiBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGVLSFIiICAgICAgICAgICAgIGFsaWFzPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGUiLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRGlzY2FyZFJlY3RhbmdsZU1vZGVFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtQb2ludENsaXBwaW5nQmVoYXZpb3JLSFIiICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtQb2ludENsaXBwaW5nQmVoYXZpb3IiLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlYiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrVmFsaWRhdGlvbkNhY2hlSGVhZGVyVmVyc2lvbkVYVCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTaGFkZXJJbmZvVHlwZUFNRCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtRdWV1ZUdsb2JhbFByaW9yaXR5RVhUIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1RpbWVEb21haW5FWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU2VtYXBob3JlVHlwZUtIUiIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0dlb21ldHJ5RmxhZ0JpdHNOViIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOViIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlYiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlYiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrR2VvbWV0cnlUeXBlTlYiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUmF5VHJhY2luZ1NoYWRlckdyb3VwVHlwZU5WIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOViIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1Njb3BlTlYiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrQ29tcG9uZW50VHlwZU5WIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdCaXRzRVhUIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlQ291bnRlclVuaXRLSFIiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUGVyZm9ybWFuY2VDb3VudGVyU3RvcmFnZUtIUiIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0FjcXVpcmVQcm9maWxpbmdMb2NrRmxhZ0JpdHNLSFIiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUwiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1NoYWRlck1vZHVsZUNyZWF0ZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sRmxhZ0JpdHNBTUQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU2hhZGVyQ29yZVByb3BlcnRpZXNGbGFnQml0c0FNRCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtUb29sUHVycG9zZUZsYWdCaXRzRVhUIiBjYXRlZ29yeT0iZW51bSIvPgorCisgICAgICAgICAgICA8Y29tbWVudD5XU0kgZXh0ZW5zaW9uczwvY29tbWVudD4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtDb2xvclNwYWNlS0hSIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUiIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQcmVzZW50TW9kZUtIUiIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVidWdSZXBvcnRGbGFnQml0c0VYVCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUmFzdGVyaXphdGlvbk9yZGVyQU1EIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOViIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtWYWxpZGF0aW9uQ2hlY2tFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c0tIUiIgICAgICAgICBhbGlhcz0iVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c0tIUiIgICAgICAgICAgICBhbGlhcz0iVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0c0tIUiIgICAgICBhbGlhcz0iVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0c0tIUiIgICAgICAgICBhbGlhcz0iVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0cyIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0c0tIUiIgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJlbnVtIiBuYW1lPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFIiICAgICAgICAgIGFsaWFzPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMiLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzS0hSIiAgICAgICAgICAgICBhbGlhcz0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRmVuY2VJbXBvcnRGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImVudW0iIG5hbWU9IlZrRmVuY2VJbXBvcnRGbGFnQml0c0tIUiIgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrRmVuY2VJbXBvcnRGbGFnQml0cyIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRGlzcGxheVBvd2VyU3RhdGVFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlRXZlbnRUeXBlRVhUIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlFdmVudFR5cGVFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImVudW0iIG5hbWU9IlZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0c0tIUiIgICAgICAgICAgICAgICAgYWxpYXM9IlZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJlbnVtIiBuYW1lPSJWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHNLSFIiICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHMiLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFIiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHMiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5LSFIiICAgICAgICAgICAgICAgICBhbGlhcz0iVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24iIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJlbnVtIiBuYW1lPSJWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbktIUiIgICAgICAgICAgICAgIGFsaWFzPSJWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbiIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJZY2JjclJhbmdlIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtTYW1wbGVyWWNiY3JSYW5nZUtIUiIgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtTYW1wbGVyWWNiY3JSYW5nZSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0Nocm9tYUxvY2F0aW9uIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZW51bSIgbmFtZT0iVmtDaHJvbWFMb2NhdGlvbktIUiIgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtDaHJvbWFMb2NhdGlvbiIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa0JsZW5kT3ZlcmxhcEVYVCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSIiBjYXRlZ29yeT0iZW51bSIvPgorICAgICAgICA8dHlwZSBuYW1lPSJWa1N3YXBjaGFpbkltYWdlVXNhZ2VGbGFnQml0c0FORFJPSUQiIGNhdGVnb3J5PSJlbnVtIi8+CisKKyAgICAgICAgICAgIDxjb21tZW50PkVudW1lcmF0ZWQgdHlwZXMgaW4gdGhlIGhlYWRlciwgYnV0IG5vdCB1c2VkIGJ5IHRoZSBBUEk8L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrVmVuZG9ySWQiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrRHJpdmVySWRLSFIiIGNhdGVnb3J5PSJlbnVtIi8+CisgICAgICAgIDx0eXBlIG5hbWU9IlZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViIgY2F0ZWdvcnk9ImVudW0iLz4KKyAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNGb3JtYXRLSFIiIGNhdGVnb3J5PSJlbnVtIi8+CisKKyAgICAgICAgPGNvbW1lbnQ+VGhlIFBGTl92aypGdW5jdGlvbiB0eXBlcyBhcmUgdXNlZCBieSBWa0FsbG9jYXRpb25DYWxsYmFja3MgYmVsb3c8L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJmdW5jcG9pbnRlciI+dHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKjxuYW1lPlBGTl92a0ludGVybmFsQWxsb2NhdGlvbk5vdGlmaWNhdGlvbjwvbmFtZT4pKAorICAgIDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSwKKyAgICA8dHlwZT5zaXplX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIDx0eXBlPlZrSW50ZXJuYWxBbGxvY2F0aW9uVHlwZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25UeXBlLAorICAgIDx0eXBlPlZrU3lzdGVtQWxsb2NhdGlvblNjb3BlPC90eXBlPiAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25TY29wZSk7PC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZnVuY3BvaW50ZXIiPnR5cGVkZWYgdm9pZCAoVktBUElfUFRSICo8bmFtZT5QRk5fdmtJbnRlcm5hbEZyZWVOb3RpZmljYXRpb248L25hbWU+KSgKKyAgICA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEsCisgICAgPHR5cGU+c2l6ZV90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICA8dHlwZT5Wa0ludGVybmFsQWxsb2NhdGlvblR5cGU8L3R5cGU+ICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uVHlwZSwKKyAgICA8dHlwZT5Wa1N5c3RlbUFsbG9jYXRpb25TY29wZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uU2NvcGUpOzwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImZ1bmNwb2ludGVyIj50eXBlZGVmIHZvaWQqIChWS0FQSV9QVFIgKjxuYW1lPlBGTl92a1JlYWxsb2NhdGlvbkZ1bmN0aW9uPC9uYW1lPikoCisgICAgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhLAorICAgIDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPcmlnaW5hbCwKKyAgICA8dHlwZT5zaXplX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIDx0eXBlPnNpemVfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCwKKyAgICA8dHlwZT5Wa1N5c3RlbUFsbG9jYXRpb25TY29wZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uU2NvcGUpOzwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImZ1bmNwb2ludGVyIj50eXBlZGVmIHZvaWQqIChWS0FQSV9QVFIgKjxuYW1lPlBGTl92a0FsbG9jYXRpb25GdW5jdGlvbjwvbmFtZT4pKAorICAgIDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSwKKyAgICA8dHlwZT5zaXplX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIDx0eXBlPnNpemVfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCwKKyAgICA8dHlwZT5Wa1N5c3RlbUFsbG9jYXRpb25TY29wZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uU2NvcGUpOzwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9ImZ1bmNwb2ludGVyIj50eXBlZGVmIHZvaWQgKFZLQVBJX1BUUiAqPG5hbWU+UEZOX3ZrRnJlZUZ1bmN0aW9uPC9uYW1lPikoCisgICAgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhLAorICAgIDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpOzwvdHlwZT4KKworICAgICAgICAgICAgPGNvbW1lbnQ+VGhlIFBGTl92a1ZvaWRGdW5jdGlvbiB0eXBlIGFyZSB1c2VkIGJ5IFZrR2V0KlByb2NBZGRyIGJlbG93PC9jb21tZW50PgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0iZnVuY3BvaW50ZXIiPnR5cGVkZWYgdm9pZCAoVktBUElfUFRSICo8bmFtZT5QRk5fdmtWb2lkRnVuY3Rpb248L25hbWU+KSh2b2lkKTs8L3R5cGU+CisKKyAgICAgICAgICAgIDxjb21tZW50PlRoZSBQRk5fdmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIHR5cGUgYXJlIHVzZWQgYnkgdGhlIERFQlVHX1JFUE9SVCBleHRlbnNpb248L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJmdW5jcG9pbnRlciI+dHlwZWRlZiBWa0Jvb2wzMiAoVktBUElfUFRSICo8bmFtZT5QRk5fdmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPC9uYW1lPikoCisgICAgPHR5cGU+VmtEZWJ1Z1JlcG9ydEZsYWdzRVhUPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgPHR5cGU+VmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSwKKyAgICA8dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCisgICAgPHR5cGU+c2l6ZV90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCisgICAgPHR5cGU+aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvZGUsCisgICAgY29uc3QgPHR5cGU+Y2hhcjwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXNzYWdlLAorICAgIDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSk7PC90eXBlPgorCisgICAgICAgICAgICA8Y29tbWVudD5UaGUgUEZOX3ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRVhUIHR5cGUgYXJlIHVzZWQgYnkgdGhlIFZLX0VYVF9kZWJ1Z191dGlscyBleHRlbnNpb248L2NvbW1lbnQ+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJmdW5jcG9pbnRlciIgcmVxdWlyZXM9IlZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCI+dHlwZWRlZiBWa0Jvb2wzMiAoVktBUElfUFRSICo8bmFtZT5QRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFQ8L25hbWU+KSgKKyAgICA8dHlwZT5Wa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVDwvdHlwZT4gICAgICAgICAgIG1lc3NhZ2VTZXZlcml0eSwKKyAgICA8dHlwZT5Wa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUPC90eXBlPiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlcywKKyAgICBjb25zdCA8dHlwZT5Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQ8L3R5cGU+KiAgICAgIHBDYWxsYmFja0RhdGEsCisgICAgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEpOzwvdHlwZT4KKworICAgICAgICAgICAgPGNvbW1lbnQ+U3RydWN0IHR5cGVzPC9jb21tZW50PgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Jhc2VPdXRTdHJ1Y3R1cmUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5zdHJ1Y3QgPHR5cGU+VmtCYXNlT3V0U3RydWN0dXJlPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtCYXNlSW5TdHJ1Y3R1cmUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCBzdHJ1Y3QgPHR5cGU+VmtCYXNlSW5TdHJ1Y3R1cmU8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa09mZnNldDJEIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+aW50MzJfdDwvdHlwZT4gICAgICAgIDxuYW1lPng8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmludDMyX3Q8L3R5cGU+ICAgICAgICA8bmFtZT55PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrT2Zmc2V0M0QiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5pbnQzMl90PC90eXBlPiAgICAgICAgPG5hbWU+eDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+aW50MzJfdDwvdHlwZT4gICAgICAgIDxuYW1lPnk8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmludDMyX3Q8L3R5cGU+ICAgICAgICA8bmFtZT56PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXh0ZW50MkQiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgIDxuYW1lPndpZHRoPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgIDxuYW1lPmhlaWdodDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4dGVudDNEIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICA8bmFtZT53aWR0aDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICA8bmFtZT5oZWlnaHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgPG5hbWU+ZGVwdGg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtWaWV3cG9ydCI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5mbG9hdDwvdHlwZT4gPG5hbWU+eDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPmZsb2F0PC90eXBlPiA8bmFtZT55PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+ZmxvYXQ8L3R5cGU+IDxuYW1lPndpZHRoPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+ZmxvYXQ8L3R5cGU+IDxuYW1lPmhlaWdodDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5taW5EZXB0aDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhEZXB0aDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1JlY3QyRCI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2Zmc2V0MkQ8L3R5cGU+ICAgICA8bmFtZT5vZmZzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZW50MkQ8L3R5cGU+ICAgICA8bmFtZT5leHRlbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtDbGVhclJlY3QiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1JlY3QyRDwvdHlwZT4gICAgICAgPG5hbWU+cmVjdDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgIDxuYW1lPmJhc2VBcnJheUxheWVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgPG5hbWU+bGF5ZXJDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0NvbXBvbmVudE1hcHBpbmciPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0NvbXBvbmVudFN3aXp6bGU8L3R5cGU+IDxuYW1lPnI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29tcG9uZW50U3dpenpsZTwvdHlwZT4gPG5hbWU+ZzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDb21wb25lbnRTd2l6emxlPC90eXBlPiA8bmFtZT5iPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0NvbXBvbmVudFN3aXp6bGU8L3R5cGU+IDxuYW1lPmE8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICA8bmFtZT5hcGlWZXJzaW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgPG5hbWU+ZHJpdmVyVmVyc2lvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgIDxuYW1lPnZlbmRvcklEPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgPG5hbWU+ZGV2aWNlSUQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2VUeXBlPC90eXBlPiA8bmFtZT5kZXZpY2VUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgPG5hbWU+ZGV2aWNlTmFtZTwvbmFtZT5bPGVudW0+VktfTUFYX1BIWVNJQ0FMX0RFVklDRV9OQU1FX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50OF90PC90eXBlPiAgICAgICAgPG5hbWU+cGlwZWxpbmVDYWNoZVVVSUQ8L25hbWU+WzxlbnVtPlZLX1VVSURfU0laRTwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM8L3R5cGU+IDxuYW1lPmxpbWl0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXM8L3R5cGU+IDxuYW1lPnNwYXJzZVByb3BlcnRpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgIDxuYW1lPmV4dGVuc2lvbk5hbWU8L25hbWU+WzxlbnVtPlZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFPC9lbnVtPl08Y29tbWVudD5leHRlbnNpb24gbmFtZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICA8bmFtZT5zcGVjVmVyc2lvbjwvbmFtZT48Y29tbWVudD52ZXJzaW9uIG9mIHRoZSBleHRlbnNpb24gc3BlY2lmaWNhdGlvbiBpbXBsZW1lbnRlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0xheWVyUHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+Y2hhcjwvdHlwZT4gICAgICAgICAgICA8bmFtZT5sYXllck5hbWU8L25hbWU+WzxlbnVtPlZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFPC9lbnVtPl08Y29tbWVudD5sYXllciBuYW1lPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgIDxuYW1lPnNwZWNWZXJzaW9uPC9uYW1lPjxjb21tZW50PnZlcnNpb24gb2YgdGhlIGxheWVyIHNwZWNpZmljYXRpb24gaW1wbGVtZW50ZWQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgPG5hbWU+aW1wbGVtZW50YXRpb25WZXJzaW9uPC9uYW1lPjxjb21tZW50PmJ1aWxkIG9yIHJlbGVhc2UgdmVyc2lvbiBvZiB0aGUgbGF5ZXIncyBsaWJyYXJ5PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgIDxuYW1lPmRlc2NyaXB0aW9uPC9uYW1lPls8ZW51bT5WS19NQVhfREVTQ1JJUFRJT05fU0laRTwvZW51bT5dPGNvbW1lbnQ+RnJlZS1mb3JtIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXllcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0FwcGxpY2F0aW9uSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQVBQTElDQVRJT05fSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiIGxlbj0ibnVsbC10ZXJtaW5hdGVkIj5jb25zdCA8dHlwZT5jaGFyPC90eXBlPiogICAgIDxuYW1lPnBBcHBsaWNhdGlvbk5hbWU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgPG5hbWU+YXBwbGljYXRpb25WZXJzaW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbGVuPSJudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiAgICAgPG5hbWU+cEVuZ2luZU5hbWU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgPG5hbWU+ZW5naW5lVmVyc2lvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICA8bmFtZT5hcGlWZXJzaW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQWxsb2NhdGlvbkNhbGxiYWNrcyI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgIDxuYW1lPnBVc2VyRGF0YTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlBGTl92a0FsbG9jYXRpb25GdW5jdGlvbjwvdHlwZT4gICA8bmFtZT5wZm5BbGxvY2F0aW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+UEZOX3ZrUmVhbGxvY2F0aW9uRnVuY3Rpb248L3R5cGU+IDxuYW1lPnBmblJlYWxsb2NhdGlvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlBGTl92a0ZyZWVGdW5jdGlvbjwvdHlwZT4gICAgPG5hbWU+cGZuRnJlZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5QRk5fdmtJbnRlcm5hbEFsbG9jYXRpb25Ob3RpZmljYXRpb248L3R5cGU+IDxuYW1lPnBmbkludGVybmFsQWxsb2NhdGlvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5QRk5fdmtJbnRlcm5hbEZyZWVOb3RpZmljYXRpb248L3R5cGU+IDxuYW1lPnBmbkludGVybmFsRnJlZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzPC90eXBlPiAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICA8bmFtZT5xdWV1ZUZhbWlseUluZGV4PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgIDxuYW1lPnF1ZXVlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0icXVldWVDb3VudCI+Y29uc3QgPHR5cGU+ZmxvYXQ8L3R5cGU+KiAgICA8bmFtZT5wUXVldWVQcmlvcml0aWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtEZXZpY2VDcmVhdGVGbGFnczwvdHlwZT4gICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgPG5hbWU+cXVldWVDcmVhdGVJbmZvQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0icXVldWVDcmVhdGVJbmZvQ291bnQiPmNvbnN0IDx0eXBlPlZrRGV2aWNlUXVldWVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cFF1ZXVlQ3JlYXRlSW5mb3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5lbmFibGVkTGF5ZXJDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJlbmFibGVkTGF5ZXJDb3VudCxudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiBjb25zdCogICAgICA8bmFtZT5wcEVuYWJsZWRMYXllck5hbWVzPC9uYW1lPjxjb21tZW50Pk9yZGVyZWQgbGlzdCBvZiBsYXllciBuYW1lcyB0byBiZSBlbmFibGVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZW5hYmxlZEV4dGVuc2lvbkNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImVuYWJsZWRFeHRlbnNpb25Db3VudCxudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiBjb25zdCogICAgICA8bmFtZT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczwvdHlwZT4qIDxuYW1lPnBFbmFibGVkRmVhdHVyZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbnN0YW5jZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtJbnN0YW5jZUNyZWF0ZUZsYWdzPC90eXBlPiAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FwcGxpY2F0aW9uSW5mbzwvdHlwZT4qIDxuYW1lPnBBcHBsaWNhdGlvbkluZm88L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5lbmFibGVkTGF5ZXJDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJlbmFibGVkTGF5ZXJDb3VudCxudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiBjb25zdCogICAgICA8bmFtZT5wcEVuYWJsZWRMYXllck5hbWVzPC9uYW1lPjxjb21tZW50Pk9yZGVyZWQgbGlzdCBvZiBsYXllciBuYW1lcyB0byBiZSBlbmFibGVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZW5hYmxlZEV4dGVuc2lvbkNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImVuYWJsZWRFeHRlbnNpb25Db3VudCxudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiBjb25zdCogICAgICA8bmFtZT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lczwvbmFtZT48Y29tbWVudD5FeHRlbnNpb24gbmFtZXMgdG8gYmUgZW5hYmxlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUXVldWVGbGFnczwvdHlwZT4gICAgICAgICAgIDxuYW1lPnF1ZXVlRmxhZ3M8L25hbWU+PGNvbW1lbnQ+UXVldWUgZmxhZ3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnF1ZXVlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnRpbWVzdGFtcFZhbGlkQml0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQzRDwvdHlwZT4gICAgICAgICAgICAgPG5hbWU+bWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5PC9uYW1lPjxjb21tZW50Pk1pbmltdW0gYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciBpbWFnZSB0cmFuc2ZlcnM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1lbW9yeVR5cGVDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtNZW1vcnlUeXBlPC90eXBlPiAgICAgICAgICAgPG5hbWU+bWVtb3J5VHlwZXM8L25hbWU+WzxlbnVtPlZLX01BWF9NRU1PUllfVFlQRVM8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tZW1vcnlIZWFwQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrTWVtb3J5SGVhcDwvdHlwZT4gICAgICAgICAgIDxuYW1lPm1lbW9yeUhlYXBzPC9uYW1lPls8ZW51bT5WS19NQVhfTUVNT1JZX0hFQVBTPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeUFsbG9jYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICA8bmFtZT5hbGxvY2F0aW9uU2l6ZTwvbmFtZT48Y29tbWVudD5TaXplIG9mIG1lbW9yeSBhbGxvY2F0aW9uPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tZW1vcnlUeXBlSW5kZXg8L25hbWU+PGNvbW1lbnQ+SW5kZXggb2YgdGhlIG9mIHRoZSBtZW1vcnkgdHlwZSB0byBhbGxvY2F0ZSBmcm9tPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWVtb3J5UmVxdWlyZW1lbnRzIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICA8bmFtZT5zaXplPC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+YWxpZ25tZW50PC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWVtb3J5VHlwZUJpdHM8L25hbWU+PGNvbW1lbnQ+Qml0bWFzayBvZiB0aGUgYWxsb3dlZCBtZW1vcnkgdHlwZSBpbmRpY2VzIGludG8gbWVtb3J5VHlwZXNbXSBmb3IgdGhpcyBvYmplY3Q8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0ltYWdlQXNwZWN0RmxhZ3M8L3R5cGU+ICAgICA8bmFtZT5hc3BlY3RNYXNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDNEPC90eXBlPiAgICAgICAgICAgICA8bmFtZT5pbWFnZUdyYW51bGFyaXR5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTcGFyc2VJbWFnZUZvcm1hdEZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczwvdHlwZT4gPG5hbWU+Zm9ybWF0UHJvcGVydGllczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+aW1hZ2VNaXBUYWlsRmlyc3RMb2Q8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPmltYWdlTWlwVGFpbFNpemU8L25hbWU+PGNvbW1lbnQ+U3BlY2lmaWVkIGluIGJ5dGVzLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc3BhcnNlIGJsb2NrIHNpemUgaW4gYnl0ZXMgLyBhbGlnbm1lbnQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPmltYWdlTWlwVGFpbE9mZnNldDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzcGFyc2UgYmxvY2sgc2l6ZSBpbiBieXRlcyAvIGFsaWdubWVudDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+aW1hZ2VNaXBUYWlsU3RyaWRlPC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHNwYXJzZSBibG9jayBzaXplIGluIGJ5dGVzIC8gYWxpZ25tZW50PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWVtb3J5VHlwZSIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrTWVtb3J5UHJvcGVydHlGbGFnczwvdHlwZT4gIDxuYW1lPnByb3BlcnR5RmxhZ3M8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IHByb3BlcnRpZXMgb2YgdGhpcyBtZW1vcnkgdHlwZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+aGVhcEluZGV4PC9uYW1lPjxjb21tZW50PkluZGV4IG9mIHRoZSBtZW1vcnkgaGVhcCBhbGxvY2F0aW9ucyBvZiB0aGlzIG1lbW9yeSB0eXBlIGFyZSB0YWtlbiBmcm9tPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWVtb3J5SGVhcCIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+c2l6ZTwvbmFtZT48Y29tbWVudD5BdmFpbGFibGUgbWVtb3J5IGluIHRoZSBoZWFwPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtNZW1vcnlIZWFwRmxhZ3M8L3R5cGU+ICAgICAgPG5hbWU+ZmxhZ3M8L25hbWU+PGNvbW1lbnQ+RmxhZ3MgZm9yIHRoZSBoZWFwPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWFwcGVkTWVtb3J5UmFuZ2UiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0UiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZU1lbW9yeTwvdHlwZT4gICAgICAgICA8bmFtZT5tZW1vcnk8L25hbWU+PGNvbW1lbnQ+TWFwcGVkIG1lbW9yeSBvYmplY3Q8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPm9mZnNldDwvbmFtZT48Y29tbWVudD5PZmZzZXQgd2l0aGluIHRoZSBtZW1vcnkgb2JqZWN0IHdoZXJlIHRoZSByYW5nZSBzdGFydHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPnNpemU8L25hbWU+PGNvbW1lbnQ+U2l6ZSBvZiB0aGUgcmFuZ2Ugd2l0aGluIHRoZSBtZW1vcnkgb2JqZWN0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRm9ybWF0UHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRm9ybWF0RmVhdHVyZUZsYWdzPC90eXBlPiAgIDxuYW1lPmxpbmVhclRpbGluZ0ZlYXR1cmVzPC9uYW1lPjxjb21tZW50PkZvcm1hdCBmZWF0dXJlcyBpbiBjYXNlIG9mIGxpbmVhciB0aWxpbmc8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0Zvcm1hdEZlYXR1cmVGbGFnczwvdHlwZT4gICA8bmFtZT5vcHRpbWFsVGlsaW5nRmVhdHVyZXM8L25hbWU+PGNvbW1lbnQ+Rm9ybWF0IGZlYXR1cmVzIGluIGNhc2Ugb2Ygb3B0aW1hbCB0aWxpbmc8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0Zvcm1hdEZlYXR1cmVGbGFnczwvdHlwZT4gICA8bmFtZT5idWZmZXJGZWF0dXJlczwvbmFtZT48Y29tbWVudD5Gb3JtYXQgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IGJ1ZmZlcnM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZW50M0Q8L3R5cGU+ICAgICAgICAgICAgIDxuYW1lPm1heEV4dGVudDwvbmFtZT48Y29tbWVudD5tYXggaW1hZ2UgZGltZW5zaW9ucyBmb3IgdGhpcyByZXNvdXJjZSB0eXBlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhNaXBMZXZlbHM8L25hbWU+PGNvbW1lbnQ+bWF4IG51bWJlciBvZiBtaXBtYXAgbGV2ZWxzIGZvciB0aGlzIHJlc291cmNlIHR5cGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heEFycmF5TGF5ZXJzPC9uYW1lPjxjb21tZW50Pm1heCBhcnJheSBzaXplIGZvciB0aGlzIHJlc291cmNlIHR5cGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1NhbXBsZUNvdW50RmxhZ3M8L3R5cGU+ICAgICA8bmFtZT5zYW1wbGVDb3VudHM8L25hbWU+PGNvbW1lbnQ+c3VwcG9ydGVkIHNhbXBsZSBjb3VudHMgZm9yIHRoaXMgcmVzb3VyY2UgdHlwZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+bWF4UmVzb3VyY2VTaXplPC9uYW1lPjxjb21tZW50Pm1heCBzaXplIChpbiBieXRlcykgb2YgdGhpcyByZXNvdXJjZSB0eXBlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVzY3JpcHRvckJ1ZmZlckluZm8iPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5idWZmZXI8L25hbWU+PGNvbW1lbnQ+QnVmZmVyIHVzZWQgZm9yIHRoaXMgZGVzY3JpcHRvciBzbG90LjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+b2Zmc2V0PC9uYW1lPjxjb21tZW50PkJhc2Ugb2Zmc2V0IGZyb20gYnVmZmVyIHN0YXJ0IGluIGJ5dGVzIHRvIHVwZGF0ZSBpbiB0aGUgZGVzY3JpcHRvciBzZXQuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICA8bmFtZT5yYW5nZTwvbmFtZT48Y29tbWVudD5TaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgcmVzb3VyY2UgZm9yIHRoaXMgZGVzY3JpcHRvciB1cGRhdGUuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVzY3JpcHRvckltYWdlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa1NhbXBsZXI8L3R5cGU+ICAgICAgIDxuYW1lPnNhbXBsZXI8L25hbWU+PGNvbW1lbnQ+U2FtcGxlciB0byB3cml0ZSB0byB0aGUgZGVzY3JpcHRvciBpbiBjYXNlIGl0IGlzIGEgU0FNUExFUiBvciBDT01CSU5FRF9JTUFHRV9TQU1QTEVSIGRlc2NyaXB0b3IuIElnbm9yZWQgb3RoZXJ3aXNlLjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrSW1hZ2VWaWV3PC90eXBlPiAgICAgPG5hbWU+aW1hZ2VWaWV3PC9uYW1lPjxjb21tZW50PkltYWdlIHZpZXcgdG8gd3JpdGUgdG8gdGhlIGRlc2NyaXB0b3IgaW4gY2FzZSBpdCBpcyBhIFNBTVBMRURfSU1BR0UsIFNUT1JBR0VfSU1BR0UsIENPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIG9yIElOUFVUX0FUVEFDSE1FTlQgZGVzY3JpcHRvci4gSWdub3JlZCBvdGhlcndpc2UuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtJbWFnZUxheW91dDwvdHlwZT4gICA8bmFtZT5pbWFnZUxheW91dDwvbmFtZT48Y29tbWVudD5MYXlvdXQgdGhlIGltYWdlIGlzIGV4cGVjdGVkIHRvIGJlIGluIHdoZW4gYWNjZXNzZWQgdXNpbmcgdGhpcyBkZXNjcmlwdG9yIChvbmx5IHVzZWQgaWYgaW1hZ2VWaWV3IGlzIG5vdCBWS19OVUxMX0hBTkRMRSkuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrV3JpdGVEZXNjcmlwdG9yU2V0Ij4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa0Rlc2NyaXB0b3JTZXQ8L3R5cGU+ICAgICAgICA8bmFtZT5kc3RTZXQ8L25hbWU+PGNvbW1lbnQ+RGVzdGluYXRpb24gZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRzdEJpbmRpbmc8L25hbWU+PGNvbW1lbnQ+QmluZGluZyB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIGRlc2NyaXB0b3Igc2V0IHRvIHdyaXRlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kc3RBcnJheUVsZW1lbnQ8L25hbWU+PGNvbW1lbnQ+QXJyYXkgZWxlbWVudCB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIGJpbmRpbmcgdG8gd3JpdGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlc2NyaXB0b3JDb3VudDwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2YgZGVzY3JpcHRvcnMgdG8gd3JpdGUgKGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGFycmF5IHBvaW50ZWQgYnkgcERlc2NyaXB0b3JzKTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXNjcmlwdG9yVHlwZTwvdHlwZT4gICAgICAgPG5hbWU+ZGVzY3JpcHRvclR5cGU8L25hbWU+PGNvbW1lbnQ+RGVzY3JpcHRvciB0eXBlIHRvIHdyaXRlIChkZXRlcm1pbmVzIHdoaWNoIG1lbWJlcnMgb2YgdGhlIGFycmF5IHBvaW50ZWQgYnkgcERlc2NyaXB0b3JzIGFyZSBnb2luZyB0byBiZSB1c2VkKTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIGxlbj0iZGVzY3JpcHRvckNvdW50Ij5jb25zdCA8dHlwZT5Wa0Rlc2NyaXB0b3JJbWFnZUluZm88L3R5cGU+KiA8bmFtZT5wSW1hZ2VJbmZvPC9uYW1lPjxjb21tZW50PlNhbXBsZXIsIGltYWdlIHZpZXcsIGFuZCBsYXlvdXQgZm9yIFNBTVBMRVIsIENPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIHtTQU1QTEVELFNUT1JBR0V9X0lNQUdFLCBhbmQgSU5QVVRfQVRUQUNITUVOVCBkZXNjcmlwdG9yIHR5cGVzLjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIGxlbj0iZGVzY3JpcHRvckNvdW50Ij5jb25zdCA8dHlwZT5Wa0Rlc2NyaXB0b3JCdWZmZXJJbmZvPC90eXBlPiogPG5hbWU+cEJ1ZmZlckluZm88L25hbWU+PGNvbW1lbnQ+UmF3IGJ1ZmZlciwgc2l6ZSwgYW5kIG9mZnNldCBmb3Ige1VOSUZPUk0sU1RPUkFHRX1fQlVGRkVSW19EWU5BTUlDXSBkZXNjcmlwdG9yIHR5cGVzLjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIGxlbj0iZGVzY3JpcHRvckNvdW50Ij5jb25zdCA8dHlwZT5Wa0J1ZmZlclZpZXc8L3R5cGU+KiAgICA8bmFtZT5wVGV4ZWxCdWZmZXJWaWV3PC9uYW1lPjxjb21tZW50PkJ1ZmZlciB2aWV3IHRvIHdyaXRlIHRvIHRoZSBkZXNjcmlwdG9yIGZvciB7VU5JRk9STSxTVE9SQUdFfV9URVhFTF9CVUZGRVIgZGVzY3JpcHRvciB0eXBlcy48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtDb3B5RGVzY3JpcHRvclNldCI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQ09QWV9ERVNDUklQVE9SX1NFVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGVzY3JpcHRvclNldDwvdHlwZT4gICAgICAgIDxuYW1lPnNyY1NldDwvbmFtZT48Y29tbWVudD5Tb3VyY2UgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNyY0JpbmRpbmc8L25hbWU+PGNvbW1lbnQ+QmluZGluZyB3aXRoaW4gdGhlIHNvdXJjZSBkZXNjcmlwdG9yIHNldCB0byBjb3B5IGZyb208L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNyY0FycmF5RWxlbWVudDwvbmFtZT48Y29tbWVudD5BcnJheSBlbGVtZW50IHdpdGhpbiB0aGUgc291cmNlIGJpbmRpbmcgdG8gY29weSBmcm9tPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rlc2NyaXB0b3JTZXQ8L3R5cGU+ICAgICAgICA8bmFtZT5kc3RTZXQ8L25hbWU+PGNvbW1lbnQ+RGVzdGluYXRpb24gZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRzdEJpbmRpbmc8L25hbWU+PGNvbW1lbnQ+QmluZGluZyB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIGRlc2NyaXB0b3Igc2V0IHRvIGNvcHkgdG88L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRzdEFycmF5RWxlbWVudDwvbmFtZT48Y29tbWVudD5BcnJheSBlbGVtZW50IHdpdGhpbiB0aGUgZGVzdGluYXRpb24gYmluZGluZyB0byBjb3B5IHRvPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yQ291bnQ8L25hbWU+PGNvbW1lbnQ+TnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRvIHdyaXRlIChkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBhcnJheSBwb2ludGVkIGJ5IHBEZXNjcmlwdG9ycyk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtCdWZmZXJDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtCdWZmZXJDcmVhdGVGbGFnczwvdHlwZT4gICAgPG5hbWU+ZmxhZ3M8L25hbWU+PGNvbW1lbnQ+QnVmZmVyIGNyZWF0aW9uIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICA8bmFtZT5zaXplPC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCdWZmZXJVc2FnZUZsYWdzPC90eXBlPiAgICAgPG5hbWU+dXNhZ2U8L25hbWU+PGNvbW1lbnQ+QnVmZmVyIHVzYWdlIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NoYXJpbmdNb2RlPC90eXBlPiAgICAgICAgICA8bmFtZT5zaGFyaW5nTW9kZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIGxlbj0icXVldWVGYW1pbHlJbmRleENvdW50Ij5jb25zdCA8dHlwZT51aW50MzJfdDwvdHlwZT4qICAgICAgICA8bmFtZT5wUXVldWVGYW1pbHlJbmRpY2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQnVmZmVyVmlld0NyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9WSUVXX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQnVmZmVyVmlld0NyZWF0ZUZsYWdzPC90eXBlPjxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5idWZmZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmZvcm1hdDwvbmFtZT48Y29tbWVudD5PcHRpb25hbGx5IHNwZWNpZmllcyBmb3JtYXQgb2YgZWxlbWVudHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPm9mZnNldDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPnJhbmdlPC9uYW1lPjxjb21tZW50PlZpZXcgc2l6ZSBzcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZVN1YnJlc291cmNlIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZUFzcGVjdEZsYWdzPC90eXBlPiAgICAgPG5hbWU+YXNwZWN0TWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWlwTGV2ZWw8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmFycmF5TGF5ZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZUFzcGVjdEZsYWdzPC90eXBlPiAgICAgPG5hbWU+YXNwZWN0TWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWlwTGV2ZWw8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmJhc2VBcnJheUxheWVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5sYXllckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZUFzcGVjdEZsYWdzPC90eXBlPiAgICAgPG5hbWU+YXNwZWN0TWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YmFzZU1pcExldmVsPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5sZXZlbENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5iYXNlQXJyYXlMYXllcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bGF5ZXJDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeUJhcnJpZXIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9CQVJSSUVSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICAgICAgIDxuYW1lPnNyY0FjY2Vzc01hc2s8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIHNvdXJjZSBvZiB0aGUgZGVwZW5kZW5jeSB0byBzeW5jaHJvbml6ZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICAgICAgIDxuYW1lPmRzdEFjY2Vzc01hc2s8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBkZXBlbmRlbmN5IHRvIHN5bmNocm9uaXplPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQnVmZmVyTWVtb3J5QmFycmllciI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9CQVJSSUVSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICAgICAgIDxuYW1lPnNyY0FjY2Vzc01hc2s8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIHNvdXJjZSBvZiB0aGUgZGVwZW5kZW5jeSB0byBzeW5jaHJvbml6ZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICAgICAgIDxuYW1lPmRzdEFjY2Vzc01hc2s8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBkZXBlbmRlbmN5IHRvIHN5bmNocm9uaXplPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zcmNRdWV1ZUZhbWlseUluZGV4PC9uYW1lPjxjb21tZW50PlF1ZXVlIGZhbWlseSB0byB0cmFuc2l0aW9uIG93bmVyc2hpcCBmcm9tPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kc3RRdWV1ZUZhbWlseUluZGV4PC9uYW1lPjxjb21tZW50PlF1ZXVlIGZhbWlseSB0byB0cmFuc2l0aW9uIG93bmVyc2hpcCB0bzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCdWZmZXI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YnVmZmVyPC9uYW1lPjxjb21tZW50PkJ1ZmZlciB0byBzeW5jPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICA8bmFtZT5vZmZzZXQ8L25hbWU+PGNvbW1lbnQ+T2Zmc2V0IHdpdGhpbiB0aGUgYnVmZmVyIHRvIHN5bmM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPnNpemU8L25hbWU+PGNvbW1lbnQ+QW1vdW50IG9mIGJ5dGVzIHRvIHN5bmM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZU1lbW9yeUJhcnJpZXIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICAgICAgIDxuYW1lPnNyY0FjY2Vzc01hc2s8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIHNvdXJjZSBvZiB0aGUgZGVwZW5kZW5jeSB0byBzeW5jaHJvbml6ZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICAgICAgIDxuYW1lPmRzdEFjY2Vzc01hc2s8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBkZXBlbmRlbmN5IHRvIHN5bmNocm9uaXplPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiAgICAgICAgICA8bmFtZT5vbGRMYXlvdXQ8L25hbWU+PGNvbW1lbnQ+Q3VycmVudCBsYXlvdXQgb2YgdGhlIGltYWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiAgICAgICAgICA8bmFtZT5uZXdMYXlvdXQ8L25hbWU+PGNvbW1lbnQ+TmV3IGxheW91dCB0byB0cmFuc2l0aW9uIHRoZSBpbWFnZSB0bzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c3JjUXVldWVGYW1pbHlJbmRleDwvbmFtZT48Y29tbWVudD5RdWV1ZSBmYW1pbHkgdG8gdHJhbnNpdGlvbiBvd25lcnNoaXAgZnJvbTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZHN0UXVldWVGYW1pbHlJbmRleDwvbmFtZT48Y29tbWVudD5RdWV1ZSBmYW1pbHkgdG8gdHJhbnNpdGlvbiBvd25lcnNoaXAgdG88L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2U8L3R5cGU+ICAgICAgICAgICAgICAgIDxuYW1lPmltYWdlPC9uYW1lPjxjb21tZW50PkltYWdlIHRvIHN5bmM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC90eXBlPiA8bmFtZT5zdWJyZXNvdXJjZVJhbmdlPC9uYW1lPjxjb21tZW50PlN1YnJlc291cmNlIHJhbmdlIHRvIHN5bmM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSW1hZ2VDcmVhdGVGbGFnczwvdHlwZT4gICAgIDxuYW1lPmZsYWdzPC9uYW1lPjxjb21tZW50PkltYWdlIGNyZWF0aW9uIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlVHlwZTwvdHlwZT4gICAgICAgICAgICA8bmFtZT5pbWFnZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmZvcm1hdDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQzRDwvdHlwZT4gICAgICAgICAgICAgPG5hbWU+ZXh0ZW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5taXBMZXZlbHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmFycmF5TGF5ZXJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZUNvdW50RmxhZ0JpdHM8L3R5cGU+ICA8bmFtZT5zYW1wbGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlVGlsaW5nPC90eXBlPiAgICAgICAgICA8bmFtZT50aWxpbmc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VVc2FnZUZsYWdzPC90eXBlPiAgICAgIDxuYW1lPnVzYWdlPC9uYW1lPjxjb21tZW50PkltYWdlIHVzYWdlIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NoYXJpbmdNb2RlPC90eXBlPiAgICAgICAgICA8bmFtZT5zaGFyaW5nTW9kZTwvbmFtZT48Y29tbWVudD5Dcm9zcy1xdWV1ZS1mYW1pbHkgc2hhcmluZyBtb2RlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+cXVldWVGYW1pbHlJbmRleENvdW50PC9uYW1lPjxjb21tZW50Pk51bWJlciBvZiBxdWV1ZSBmYW1pbGllcyB0byBzaGFyZSBhY3Jvc3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBsZW49InF1ZXVlRmFtaWx5SW5kZXhDb3VudCI+Y29uc3QgPHR5cGU+dWludDMyX3Q8L3R5cGU+KiAgICAgICAgPG5hbWU+cFF1ZXVlRmFtaWx5SW5kaWNlczwvbmFtZT48Y29tbWVudD5BcnJheSBvZiBxdWV1ZSBmYW1pbHkgaW5kaWNlcyB0byBzaGFyZSBhY3Jvc3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VMYXlvdXQ8L3R5cGU+ICAgICAgICAgIDxuYW1lPmluaXRpYWxMYXlvdXQ8L25hbWU+PGNvbW1lbnQ+SW5pdGlhbCBpbWFnZSBsYXlvdXQgZm9yIGFsbCBzdWJyZXNvdXJjZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdWJyZXNvdXJjZUxheW91dCIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+b2Zmc2V0PC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+c2l6ZTwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPnJvd1BpdGNoPC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+YXJyYXlQaXRjaDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPmRlcHRoUGl0Y2g8L25hbWU+PGNvbW1lbnQ+U3BlY2lmaWVkIGluIGJ5dGVzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0ltYWdlVmlld0NyZWF0ZUZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZTwvdHlwZT4gICAgICAgICAgICAgICAgPG5hbWU+aW1hZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VWaWV3VHlwZTwvdHlwZT4gICAgICAgIDxuYW1lPnZpZXdUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Zvcm1hdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5mb3JtYXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29tcG9uZW50TWFwcGluZzwvdHlwZT4gICAgIDxuYW1lPmNvbXBvbmVudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlPC90eXBlPiA8bmFtZT5zdWJyZXNvdXJjZVJhbmdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQnVmZmVyQ29weSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNyY09mZnNldDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRzdE9mZnNldDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPnNpemU8L25hbWU+PGNvbW1lbnQ+U3BlY2lmaWVkIGluIGJ5dGVzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3BhcnNlTWVtb3J5QmluZCI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPnJlc291cmNlT2Zmc2V0PC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+c2l6ZTwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0RldmljZU1lbW9yeTwvdHlwZT4gICAgICAgICA8bmFtZT5tZW1vcnk8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPm1lbW9yeU9mZnNldDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1NwYXJzZU1lbW9yeUJpbmRGbGFnczwvdHlwZT48bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NwYXJzZUltYWdlTWVtb3J5QmluZCI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VTdWJyZXNvdXJjZTwvdHlwZT4gICAgIDxuYW1lPnN1YnJlc291cmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09mZnNldDNEPC90eXBlPiAgICAgICAgICAgICA8bmFtZT5vZmZzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZW50M0Q8L3R5cGU+ICAgICAgICAgICAgIDxuYW1lPmV4dGVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRGV2aWNlTWVtb3J5PC90eXBlPiAgICAgICAgIDxuYW1lPm1lbW9yeTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+bWVtb3J5T2Zmc2V0PC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU3BhcnNlTWVtb3J5QmluZEZsYWdzPC90eXBlPjxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8iPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+YnVmZmVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5iaW5kQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iYmluZENvdW50Ij5jb25zdCA8dHlwZT5Wa1NwYXJzZU1lbW9yeUJpbmQ8L3R5cGU+KiA8bmFtZT5wQmluZHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+aW1hZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmJpbmRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJiaW5kQ291bnQiPmNvbnN0IDx0eXBlPlZrU3BhcnNlTWVtb3J5QmluZDwvdHlwZT4qIDxuYW1lPnBCaW5kczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8iPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlPC90eXBlPiA8bmFtZT5pbWFnZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YmluZENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImJpbmRDb3VudCI+Y29uc3QgPHR5cGU+VmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQ8L3R5cGU+KiA8bmFtZT5wQmluZHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtCaW5kU3BhcnNlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9TUEFSU0VfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT53YWl0U2VtYXBob3JlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0id2FpdFNlbWFwaG9yZUNvdW50Ij5jb25zdCA8dHlwZT5Wa1NlbWFwaG9yZTwvdHlwZT4qICAgICA8bmFtZT5wV2FpdFNlbWFwaG9yZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5idWZmZXJCaW5kQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iYnVmZmVyQmluZENvdW50Ij5jb25zdCA8dHlwZT5Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvPC90eXBlPiogPG5hbWU+cEJ1ZmZlckJpbmRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+aW1hZ2VPcGFxdWVCaW5kQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iaW1hZ2VPcGFxdWVCaW5kQ291bnQiPmNvbnN0IDx0eXBlPlZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbzwvdHlwZT4qIDxuYW1lPnBJbWFnZU9wYXF1ZUJpbmRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+aW1hZ2VCaW5kQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iaW1hZ2VCaW5kQ291bnQiPmNvbnN0IDx0eXBlPlZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbzwvdHlwZT4qIDxuYW1lPnBJbWFnZUJpbmRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ic2lnbmFsU2VtYXBob3JlQ291bnQiPmNvbnN0IDx0eXBlPlZrU2VtYXBob3JlPC90eXBlPiogICAgIDxuYW1lPnBTaWduYWxTZW1hcGhvcmVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VDb3B5Ij4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzPC90eXBlPiA8bmFtZT5zcmNTdWJyZXNvdXJjZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPZmZzZXQzRDwvdHlwZT4gICAgICAgICAgICAgPG5hbWU+c3JjT2Zmc2V0PC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBwaXhlbHMgZm9yIGJvdGggY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIGltYWdlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzPC90eXBlPiA8bmFtZT5kc3RTdWJyZXNvdXJjZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPZmZzZXQzRDwvdHlwZT4gICAgICAgICAgICAgPG5hbWU+ZHN0T2Zmc2V0PC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBwaXhlbHMgZm9yIGJvdGggY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIGltYWdlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQzRDwvdHlwZT4gICAgICAgICAgICAgPG5hbWU+ZXh0ZW50PC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBwaXhlbHMgZm9yIGJvdGggY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIGltYWdlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltYWdlQmxpdCI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VTdWJyZXNvdXJjZUxheWVyczwvdHlwZT4gPG5hbWU+c3JjU3VicmVzb3VyY2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2Zmc2V0M0Q8L3R5cGU+ICAgICAgICAgICAgIDxuYW1lPnNyY09mZnNldHM8L25hbWU+WzJdPGNvbW1lbnQ+U3BlY2lmaWVkIGluIHBpeGVscyBmb3IgYm90aCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgaW1hZ2VzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnM8L3R5cGU+IDxuYW1lPmRzdFN1YnJlc291cmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09mZnNldDNEPC90eXBlPiAgICAgICAgICAgICA8bmFtZT5kc3RPZmZzZXRzPC9uYW1lPlsyXTxjb21tZW50PlNwZWNpZmllZCBpbiBwaXhlbHMgZm9yIGJvdGggY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIGltYWdlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0J1ZmZlckltYWdlQ29weSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPmJ1ZmZlck9mZnNldDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmJ1ZmZlclJvd0xlbmd0aDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gdGV4ZWxzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5idWZmZXJJbWFnZUhlaWdodDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzPC90eXBlPiA8bmFtZT5pbWFnZVN1YnJlc291cmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09mZnNldDNEPC90eXBlPiAgICAgICAgICAgICA8bmFtZT5pbWFnZU9mZnNldDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gcGl4ZWxzIGZvciBib3RoIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBpbWFnZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZW50M0Q8L3R5cGU+ICAgICAgICAgICAgIDxuYW1lPmltYWdlRXh0ZW50PC9uYW1lPjxjb21tZW50PlNwZWNpZmllZCBpbiBwaXhlbHMgZm9yIGJvdGggY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIGltYWdlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltYWdlUmVzb2x2ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VTdWJyZXNvdXJjZUxheWVyczwvdHlwZT4gPG5hbWU+c3JjU3VicmVzb3VyY2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2Zmc2V0M0Q8L3R5cGU+ICAgICAgICAgICAgIDxuYW1lPnNyY09mZnNldDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzPC90eXBlPiA8bmFtZT5kc3RTdWJyZXNvdXJjZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPZmZzZXQzRDwvdHlwZT4gICAgICAgICAgICAgPG5hbWU+ZHN0T2Zmc2V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDNEPC90eXBlPiAgICAgICAgICAgICA8bmFtZT5leHRlbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU2hhZGVyTW9kdWxlQ3JlYXRlRmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5zaXplX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICA8bmFtZT5jb2RlU2l6ZTwvbmFtZT48Y29tbWVudD5TcGVjaWZpZWQgaW4gYnl0ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ibGF0ZXhtYXRoOltcdGV4dHJte2NvZGVTaXplfSBcb3ZlciA0XSIgYWx0bGVuPSJjb2RlU2l6ZSAvIDQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogICAgICAgICAgICA8bmFtZT5wQ29kZTwvbmFtZT48Y29tbWVudD5CaW5hcnkgY29kZSBvZiBzaXplIGNvZGVTaXplPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmciPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5iaW5kaW5nPC9uYW1lPjxjb21tZW50PkJpbmRpbmcgbnVtYmVyIGZvciB0aGlzIGVudHJ5PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rlc2NyaXB0b3JUeXBlPC90eXBlPiAgICAgICA8bmFtZT5kZXNjcmlwdG9yVHlwZTwvbmFtZT48Y29tbWVudD5UeXBlIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGlzIGJpbmRpbmc8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZGVzY3JpcHRvckNvdW50PC9uYW1lPjxjb21tZW50Pk51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGlzIGJpbmRpbmc8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa1NoYWRlclN0YWdlRmxhZ3M8L3R5cGU+ICAgICA8bmFtZT5zdGFnZUZsYWdzPC9uYW1lPjxjb21tZW50PlNoYWRlciBzdGFnZXMgdGhpcyBiaW5kaW5nIGlzIHZpc2libGUgdG88L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBvcHRpb25hbD0idHJ1ZSIgbGVuPSJkZXNjcmlwdG9yQ291bnQiPmNvbnN0IDx0eXBlPlZrU2FtcGxlcjwvdHlwZT4qICAgICAgIDxuYW1lPnBJbW11dGFibGVTYW1wbGVyczwvbmFtZT48Y29tbWVudD5JbW11dGFibGUgc2FtcGxlcnMgKHVzZWQgaWYgZGVzY3JpcHRvciB0eXBlIGlzIFNBTVBMRVIgb3IgQ09NQklORURfSU1BR0VfU0FNUExFUiwgaXMgZWl0aGVyIE5VTEwgb3IgY29udGFpbnMgY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzKTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3M8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YmluZGluZ0NvdW50PC9uYW1lPjxjb21tZW50Pk51bWJlciBvZiBiaW5kaW5ncyBpbiB0aGUgZGVzY3JpcHRvciBzZXQgbGF5b3V0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImJpbmRpbmdDb3VudCI+Y29uc3QgPHR5cGU+VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZzwvdHlwZT4qIDxuYW1lPnBCaW5kaW5nczwvbmFtZT48Y29tbWVudD5BcnJheSBvZiBkZXNjcmlwdG9yIHNldCBsYXlvdXQgYmluZGluZ3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXNjcmlwdG9yUG9vbFNpemUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rlc2NyaXB0b3JUeXBlPC90eXBlPiAgICAgICA8bmFtZT50eXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ3M8L3R5cGU+ICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4U2V0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+cG9vbFNpemVDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJwb29sU2l6ZUNvdW50Ij5jb25zdCA8dHlwZT5Wa0Rlc2NyaXB0b3JQb29sU2l6ZTwvdHlwZT4qIDxuYW1lPnBQb29sU2l6ZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXNjcmlwdG9yUG9vbDwvdHlwZT4gICAgICAgPG5hbWU+ZGVzY3JpcHRvclBvb2w8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlc2NyaXB0b3JTZXRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJkZXNjcmlwdG9yU2V0Q291bnQiPmNvbnN0IDx0eXBlPlZrRGVzY3JpcHRvclNldExheW91dDwvdHlwZT4qIDxuYW1lPnBTZXRMYXlvdXRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmNvbnN0YW50SUQ8L25hbWU+PGNvbW1lbnQ+VGhlIFNwZWNDb25zdGFudCBJRCBzcGVjaWZpZWQgaW4gdGhlIEJJTDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b2Zmc2V0PC9uYW1lPjxjb21tZW50Pk9mZnNldCBvZiB0aGUgdmFsdWUgaW4gdGhlIGRhdGEgYmxvY2s8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5zaXplX3Q8L3R5cGU+IDxuYW1lPnNpemU8L25hbWU+PGNvbW1lbnQ+U2l6ZSBpbiBieXRlcyBvZiB0aGUgU3BlY0NvbnN0YW50PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3BlY2lhbGl6YXRpb25JbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1hcEVudHJ5Q291bnQ8L25hbWU+PGNvbW1lbnQ+TnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1hcDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJtYXBFbnRyeUNvdW50Ij5jb25zdCA8dHlwZT5Wa1NwZWNpYWxpemF0aW9uTWFwRW50cnk8L3R5cGU+KiA8bmFtZT5wTWFwRW50cmllczwvbmFtZT48Y29tbWVudD5BcnJheSBvZiBtYXAgZW50cmllczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnNpemVfdDwvdHlwZT4gICAgICAgICAgICAgICAgIDxuYW1lPmRhdGFTaXplPC9uYW1lPjxjb21tZW50PlNpemUgaW4gYnl0ZXMgb2YgcERhdGE8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iZGF0YVNpemUiPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBEYXRhPC9uYW1lPjxjb21tZW50PlBvaW50ZXIgdG8gU3BlY0NvbnN0YW50IGRhdGE8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdzPC90eXBlPiAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTaGFkZXJTdGFnZUZsYWdCaXRzPC90eXBlPiAgPG5hbWU+c3RhZ2U8L25hbWU+PGNvbW1lbnQ+U2hhZGVyIHN0YWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NoYWRlck1vZHVsZTwvdHlwZT4gICAgICAgICA8bmFtZT5tb2R1bGU8L25hbWU+PGNvbW1lbnQ+TW9kdWxlIGNvbnRhaW5pbmcgZW50cnkgcG9pbnQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ibnVsbC10ZXJtaW5hdGVkIj5jb25zdCA8dHlwZT5jaGFyPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmFtZTwvbmFtZT48Y29tbWVudD5OdWxsLXRlcm1pbmF0ZWQgZW50cnkgcG9pbnQgbmFtZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrU3BlY2lhbGl6YXRpb25JbmZvPC90eXBlPiogPG5hbWU+cFNwZWNpYWxpemF0aW9uSW5mbzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUNyZWF0ZUZsYWdzPC90eXBlPiAgPG5hbWU+ZmxhZ3M8L25hbWU+PGNvbW1lbnQ+UGlwZWxpbmUgY3JlYXRpb24gZmxhZ3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm88L3R5cGU+IDxuYW1lPnN0YWdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BpcGVsaW5lTGF5b3V0PC90eXBlPiAgICAgICA8bmFtZT5sYXlvdXQ8L25hbWU+PGNvbW1lbnQ+SW50ZXJmYWNlIGxheW91dCBvZiB0aGUgcGlwZWxpbmU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZTwvdHlwZT4gICAgICA8bmFtZT5iYXNlUGlwZWxpbmVIYW5kbGU8L25hbWU+PGNvbW1lbnQ+SWYgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGlzIHNldCBhbmQgdGhpcyB2YWx1ZSBpcyBub256ZXJvLCBpdCBzcGVjaWZpZXMgdGhlIGhhbmRsZSBvZiB0aGUgYmFzZSBwaXBlbGluZSB0aGlzIGlzIGEgZGVyaXZhdGl2ZSBvZjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgPG5hbWU+YmFzZVBpcGVsaW5lSW5kZXg8L25hbWU+PGNvbW1lbnQ+SWYgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGlzIHNldCBhbmQgdGhpcyB2YWx1ZSBpcyBub3QgLTEsIGl0IHNwZWNpZmllcyBhbiBpbmRleCBpbnRvIHBDcmVhdGVJbmZvcyBvZiB0aGUgYmFzZSBwaXBlbGluZSB0aGlzIGlzIGEgZGVyaXZhdGl2ZSBvZjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YmluZGluZzwvbmFtZT48Y29tbWVudD5WZXJ0ZXggYnVmZmVyIGJpbmRpbmcgaWQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnN0cmlkZTwvbmFtZT48Y29tbWVudD5EaXN0YW5jZSBiZXR3ZWVuIHZlcnRpY2VzIGluIGJ5dGVzICgwID0gbm8gYWR2YW5jZW1lbnQpPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1ZlcnRleElucHV0UmF0ZTwvdHlwZT4gICAgICA8bmFtZT5pbnB1dFJhdGU8L25hbWU+PGNvbW1lbnQ+VGhlIHJhdGUgYXQgd2hpY2ggdGhlIHZlcnRleCBkYXRhIGlzIGNvbnN1bWVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmxvY2F0aW9uPC9uYW1lPjxjb21tZW50PmxvY2F0aW9uIG9mIHRoZSBzaGFkZXIgdmVydGV4IGF0dHJpYjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YmluZGluZzwvbmFtZT48Y29tbWVudD5WZXJ0ZXggYnVmZmVyIGJpbmRpbmcgaWQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmZvcm1hdDwvbmFtZT48Y29tbWVudD5mb3JtYXQgb2Ygc291cmNlIGRhdGE8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm9mZnNldDwvbmFtZT48Y29tbWVudD5PZmZzZXQgb2YgZmlyc3QgZWxlbWVudCBpbiBieXRlcyBmcm9tIGJhc2Ugb2YgdmVydGV4PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX1NUQVRFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ8L25hbWU+PGNvbW1lbnQ+bnVtYmVyIG9mIGJpbmRpbmdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50Ij5jb25zdCA8dHlwZT5Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uPC90eXBlPiogPG5hbWU+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50PC9uYW1lPjxjb21tZW50Pm51bWJlciBvZiBhdHRyaWJ1dGVzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQiPmNvbnN0IDx0eXBlPlZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbjwvdHlwZT4qIDxuYW1lPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVGbGFnczwvdHlwZT4gICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUHJpbWl0aXZlVG9wb2xvZ3k8L3R5cGU+ICAgIDxuYW1lPnRvcG9sb2d5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5wcmltaXRpdmVSZXN0YXJ0RW5hYmxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9TVEFURV9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVGbGFnczwvdHlwZT4gICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnBhdGNoQ29udHJvbFBvaW50czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT52aWV3cG9ydENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSIgb3B0aW9uYWw9InRydWUiIGxlbj0idmlld3BvcnRDb3VudCI+Y29uc3QgPHR5cGU+VmtWaWV3cG9ydDwvdHlwZT4qICAgICAgPG5hbWU+cFZpZXdwb3J0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2Npc3NvckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSIgb3B0aW9uYWw9InRydWUiIGxlbj0ic2Npc3NvckNvdW50Ij5jb25zdCA8dHlwZT5Wa1JlY3QyRDwvdHlwZT4qICAgICAgICA8bmFtZT5wU2Npc3NvcnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVGbGFnczwvdHlwZT4gICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlcHRoQ2xhbXBFbmFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BvbHlnb25Nb2RlPC90eXBlPiAgICAgICAgICA8bmFtZT5wb2x5Z29uTW9kZTwvbmFtZT48Y29tbWVudD5vcHRpb25hbCAoR0w0NSk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0N1bGxNb2RlRmxhZ3M8L3R5cGU+ICAgICAgICA8bmFtZT5jdWxsTW9kZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtGcm9udEZhY2U8L3R5cGU+ICAgICAgICAgICAgPG5hbWU+ZnJvbnRGYWNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXB0aEJpYXNFbmFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPmRlcHRoQmlhc0NvbnN0YW50RmFjdG9yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5kZXB0aEJpYXNDbGFtcDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+ZGVwdGhCaWFzU2xvcGVGYWN0b3I8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPmxpbmVXaWR0aDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX01VTFRJU0FNUExFX1NUQVRFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZUNvdW50RmxhZ0JpdHM8L3R5cGU+ICA8bmFtZT5yYXN0ZXJpemF0aW9uU2FtcGxlczwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2Ygc2FtcGxlcyB1c2VkIGZvciByYXN0ZXJpemF0aW9uPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zYW1wbGVTaGFkaW5nRW5hYmxlPC9uYW1lPjxjb21tZW50Pm9wdGlvbmFsIChHTDQ1KTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bWluU2FtcGxlU2hhZGluZzwvbmFtZT48Y29tbWVudD5vcHRpb25hbCAoR0w0NSk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIiBsZW49ImxhdGV4bWF0aDpbXGxjZWlse1xtYXRoaXR7cmFzdGVyaXphdGlvblNhbXBsZXN9IFxvdmVyIDMyfVxyY2VpbF0iIGFsdGxlbj0iKHJhc3Rlcml6YXRpb25TYW1wbGVzICsgMzEpIC8gMzIiPmNvbnN0IDx0eXBlPlZrU2FtcGxlTWFzazwvdHlwZT4qICAgIDxuYW1lPnBTYW1wbGVNYXNrPC9uYW1lPjxjb21tZW50PkFycmF5IG9mIHNhbXBsZU1hc2sgd29yZHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmFscGhhVG9Db3ZlcmFnZUVuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YWxwaGFUb09uZUVuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmJsZW5kRW5hYmxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0JsZW5kRmFjdG9yPC90eXBlPiAgICAgICAgICA8bmFtZT5zcmNDb2xvckJsZW5kRmFjdG9yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0JsZW5kRmFjdG9yPC90eXBlPiAgICAgICAgICA8bmFtZT5kc3RDb2xvckJsZW5kRmFjdG9yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0JsZW5kT3A8L3R5cGU+ICAgICAgICAgICAgICA8bmFtZT5jb2xvckJsZW5kT3A8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQmxlbmRGYWN0b3I8L3R5cGU+ICAgICAgICAgIDxuYW1lPnNyY0FscGhhQmxlbmRGYWN0b3I8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQmxlbmRGYWN0b3I8L3R5cGU+ICAgICAgICAgIDxuYW1lPmRzdEFscGhhQmxlbmRGYWN0b3I8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQmxlbmRPcDwvdHlwZT4gICAgICAgICAgICAgIDxuYW1lPmFscGhhQmxlbmRPcDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQ29sb3JDb21wb25lbnRGbGFnczwvdHlwZT4gIDxuYW1lPmNvbG9yV3JpdGVNYXNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5sb2dpY09wRW5hYmxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtMb2dpY09wPC90eXBlPiAgICAgICAgICAgICAgPG5hbWU+bG9naWNPcDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmF0dGFjaG1lbnRDb3VudDwvbmFtZT48Y29tbWVudD4jIG9mIHBBdHRhY2htZW50czwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJhdHRhY2htZW50Q291bnQiPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlPC90eXBlPiogPG5hbWU+cEF0dGFjaG1lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5ibGVuZENvbnN0YW50czwvbmFtZT5bNF08L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRFlOQU1JQ19TVEFURV9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZHluYW1pY1N0YXRlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iZHluYW1pY1N0YXRlQ291bnQiPmNvbnN0IDx0eXBlPlZrRHluYW1pY1N0YXRlPC90eXBlPiogIDxuYW1lPnBEeW5hbWljU3RhdGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3RlbmNpbE9wU3RhdGUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N0ZW5jaWxPcDwvdHlwZT4gICAgICAgICAgICA8bmFtZT5mYWlsT3A8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU3RlbmNpbE9wPC90eXBlPiAgICAgICAgICAgIDxuYW1lPnBhc3NPcDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTdGVuY2lsT3A8L3R5cGU+ICAgICAgICAgICAgPG5hbWU+ZGVwdGhGYWlsT3A8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29tcGFyZU9wPC90eXBlPiAgICAgICAgICAgIDxuYW1lPmNvbXBhcmVPcDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+Y29tcGFyZU1hc2s8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPndyaXRlTWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+cmVmZXJlbmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXB0aFRlc3RFbmFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlcHRoV3JpdGVFbmFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29tcGFyZU9wPC90eXBlPiAgICAgICAgICAgIDxuYW1lPmRlcHRoQ29tcGFyZU9wPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXB0aEJvdW5kc1Rlc3RFbmFibGU8L25hbWU+PGNvbW1lbnQ+b3B0aW9uYWwgKGRlcHRoX2JvdW5kc190ZXN0KTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c3RlbmNpbFRlc3RFbmFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU3RlbmNpbE9wU3RhdGU8L3R5cGU+ICAgICAgIDxuYW1lPmZyb250PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N0ZW5jaWxPcFN0YXRlPC90eXBlPiAgICAgICA8bmFtZT5iYWNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5taW5EZXB0aEJvdW5kczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4RGVwdGhCb3VuZHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUNyZWF0ZUZsYWdzPC90eXBlPiAgPG5hbWU+ZmxhZ3M8L25hbWU+PGNvbW1lbnQ+UGlwZWxpbmUgY3JlYXRpb24gZmxhZ3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnN0YWdlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ic3RhZ2VDb3VudCI+Y29uc3QgPHR5cGU+VmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBTdGFnZXM8L25hbWU+PGNvbW1lbnQ+T25lIGVudHJ5IGZvciBlYWNoIGFjdGl2ZSBzaGFkZXIgc3RhZ2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cFZlcnRleElucHV0U3RhdGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wSW5wdXRBc3NlbWJseVN0YXRlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wVGVzc2VsbGF0aW9uU3RhdGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cFZpZXdwb3J0U3RhdGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cFJhc3Rlcml6YXRpb25TdGF0ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wTXVsdGlzYW1wbGVTdGF0ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cERlcHRoU3RlbmNpbFN0YXRlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENvbG9yQmxlbmRTdGF0ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cER5bmFtaWNTdGF0ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaXBlbGluZUxheW91dDwvdHlwZT4gICAgICAgPG5hbWU+bGF5b3V0PC9uYW1lPjxjb21tZW50PkludGVyZmFjZSBsYXlvdXQgb2YgdGhlIHBpcGVsaW5lPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1JlbmRlclBhc3M8L3R5cGU+ICAgICAgICAgICA8bmFtZT5yZW5kZXJQYXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zdWJwYXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmU8L3R5cGU+ICAgICAgPG5hbWU+YmFzZVBpcGVsaW5lSGFuZGxlPC9uYW1lPjxjb21tZW50PklmIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCBpcyBzZXQgYW5kIHRoaXMgdmFsdWUgaXMgbm9uemVybywgaXQgc3BlY2lmaWVzIHRoZSBoYW5kbGUgb2YgdGhlIGJhc2UgcGlwZWxpbmUgdGhpcyBpcyBhIGRlcml2YXRpdmUgb2Y8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgIDxuYW1lPmJhc2VQaXBlbGluZUluZGV4PC9uYW1lPjxjb21tZW50PklmIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCBpcyBzZXQgYW5kIHRoaXMgdmFsdWUgaXMgbm90IC0xLCBpdCBzcGVjaWZpZXMgYW4gaW5kZXggaW50byBwQ3JlYXRlSW5mb3Mgb2YgdGhlIGJhc2UgcGlwZWxpbmUgdGhpcyBpcyBhIGRlcml2YXRpdmUgb2Y8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ0FDSEVfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUNhY2hlQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+c2l6ZV90PC90eXBlPiAgICAgICAgICAgICAgICAgPG5hbWU+aW5pdGlhbERhdGFTaXplPC9uYW1lPjxjb21tZW50PlNpemUgb2YgaW5pdGlhbCBkYXRhIHRvIHBvcHVsYXRlIGNhY2hlLCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJpbml0aWFsRGF0YVNpemUiPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBJbml0aWFsRGF0YTwvbmFtZT48Y29tbWVudD5Jbml0aWFsIGRhdGEgdG8gcG9wdWxhdGUgY2FjaGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQdXNoQ29uc3RhbnRSYW5nZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2hhZGVyU3RhZ2VGbGFnczwvdHlwZT4gICAgIDxuYW1lPnN0YWdlRmxhZ3M8L25hbWU+PGNvbW1lbnQ+V2hpY2ggc3RhZ2VzIHVzZSB0aGUgcmFuZ2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm9mZnNldDwvbmFtZT48Y29tbWVudD5TdGFydCBvZiB0aGUgcmFuZ2UsIGluIGJ5dGVzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaXplPC9uYW1lPjxjb21tZW50PlNpemUgb2YgdGhlIHJhbmdlLCBpbiBieXRlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVMYXlvdXRDcmVhdGVGbGFnczwvdHlwZT4gICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zZXRMYXlvdXRDb3VudDwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2YgZGVzY3JpcHRvciBzZXRzIGludGVyZmFjZWQgYnkgdGhlIHBpcGVsaW5lPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InNldExheW91dENvdW50Ij5jb25zdCA8dHlwZT5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXQ8L3R5cGU+KiA8bmFtZT5wU2V0TGF5b3V0czwvbmFtZT48Y29tbWVudD5BcnJheSBvZiBzZXRDb3VudCBudW1iZXIgb2YgZGVzY3JpcHRvciBzZXQgbGF5b3V0IG9iamVjdHMgZGVmaW5pbmcgdGhlIGxheW91dCBvZiB0aGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5wdXNoQ29uc3RhbnRSYW5nZUNvdW50PC9uYW1lPjxjb21tZW50Pk51bWJlciBvZiBwdXNoLWNvbnN0YW50IHJhbmdlcyB1c2VkIGJ5IHRoZSBwaXBlbGluZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJwdXNoQ29uc3RhbnRSYW5nZUNvdW50Ij5jb25zdCA8dHlwZT5Wa1B1c2hDb25zdGFudFJhbmdlPC90eXBlPiogPG5hbWU+cFB1c2hDb25zdGFudFJhbmdlczwvbmFtZT48Y29tbWVudD5BcnJheSBvZiBwdXNoQ29uc3RhbnRSYW5nZUNvdW50IG51bWJlciBvZiByYW5nZXMgdXNlZCBieSB2YXJpb3VzIHNoYWRlciBzdGFnZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTYW1wbGVyQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1NhbXBsZXJDcmVhdGVGbGFnczwvdHlwZT4gICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtGaWx0ZXI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWFnRmlsdGVyPC9uYW1lPjxjb21tZW50PkZpbHRlciBtb2RlIGZvciBtYWduaWZpY2F0aW9uPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ZpbHRlcjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5taW5GaWx0ZXI8L25hbWU+PGNvbW1lbnQ+RmlsdGVyIG1vZGUgZm9yIG1pbmlmaWF0aW9uPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZXJNaXBtYXBNb2RlPC90eXBlPiAgICA8bmFtZT5taXBtYXBNb2RlPC9uYW1lPjxjb21tZW50Pk1pcG1hcCBzZWxlY3Rpb24gbW9kZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTYW1wbGVyQWRkcmVzc01vZGU8L3R5cGU+ICAgPG5hbWU+YWRkcmVzc01vZGVVPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZXJBZGRyZXNzTW9kZTwvdHlwZT4gICA8bmFtZT5hZGRyZXNzTW9kZVY8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2FtcGxlckFkZHJlc3NNb2RlPC90eXBlPiAgIDxuYW1lPmFkZHJlc3NNb2RlVzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bWlwTG9kQmlhczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YW5pc290cm9weUVuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4QW5pc290cm9weTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+Y29tcGFyZUVuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrQ29tcGFyZU9wPC90eXBlPiAgICAgICAgICAgIDxuYW1lPmNvbXBhcmVPcDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bWluTG9kPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5tYXhMb2Q8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa0JvcmRlckNvbG9yPC90eXBlPiAgICAgICAgICA8bmFtZT5ib3JkZXJDb2xvcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtDb21tYW5kUG9vbENyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PGNvbW1lbnQ+Q29tbWFuZCBwb29sIGNyZWF0aW9uIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5xdWV1ZUZhbWlseUluZGV4PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29tbWFuZFBvb2w8L3R5cGU+ICAgICAgICAgIDxuYW1lPmNvbW1hbmRQb29sPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0NvbW1hbmRCdWZmZXJMZXZlbDwvdHlwZT4gICA8bmFtZT5sZXZlbDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+Y29tbWFuZEJ1ZmZlckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIiBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtSZW5kZXJQYXNzPC90eXBlPiAgICA8bmFtZT5yZW5kZXJQYXNzPC9uYW1lPjxjb21tZW50PlJlbmRlciBwYXNzIGZvciBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXJzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zdWJwYXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrRnJhbWVidWZmZXI8L3R5cGU+ICAgPG5hbWU+ZnJhbWVidWZmZXI8L25hbWU+PGNvbW1lbnQ+RnJhbWVidWZmZXIgZm9yIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlcnM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm9jY2x1c2lvblF1ZXJ5RW5hYmxlPC9uYW1lPjxjb21tZW50PldoZXRoZXIgdGhpcyBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIgbWF5IGJlIGV4ZWN1dGVkIGR1cmluZyBhbiBvY2NsdXNpb24gcXVlcnk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIiBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtRdWVyeUNvbnRyb2xGbGFnczwvdHlwZT4gICAgPG5hbWU+cXVlcnlGbGFnczwvbmFtZT48Y29tbWVudD5RdWVyeSBmbGFncyB1c2VkIGJ5IHRoaXMgc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyLCBpZiBleGVjdXRlZCBkdXJpbmcgYW4gb2NjbHVzaW9uIHF1ZXJ5PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzPC90eXBlPiA8bmFtZT5waXBlbGluZVN0YXRpc3RpY3M8L25hbWU+PGNvbW1lbnQ+UGlwZWxpbmUgc3RhdGlzdGljcyB0aGF0IG1heSBiZSBjb3VudGVkIGZvciB0aGlzIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnczwvdHlwZT4gIDxuYW1lPmZsYWdzPC9uYW1lPjxjb21tZW50PkNvbW1hbmQgYnVmZmVyIHVzYWdlIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbm9hdXRvdmFsaWRpdHk9InRydWUiPmNvbnN0IDx0eXBlPlZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzwvdHlwZT4qICAgICAgIDxuYW1lPnBJbmhlcml0YW5jZUluZm88L25hbWU+PGNvbW1lbnQ+UG9pbnRlciB0byBpbmhlcml0YW5jZSBpbmZvIGZvciBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXJzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUmVuZGVyUGFzc0JlZ2luSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUmVuZGVyUGFzczwvdHlwZT4gICAgICAgICAgIDxuYW1lPnJlbmRlclBhc3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRnJhbWVidWZmZXI8L3R5cGU+ICAgICAgICAgIDxuYW1lPmZyYW1lYnVmZmVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1JlY3QyRDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5yZW5kZXJBcmVhPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+Y2xlYXJWYWx1ZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImNsZWFyVmFsdWVDb3VudCI+Y29uc3QgPHR5cGU+VmtDbGVhclZhbHVlPC90eXBlPiogICAgPG5hbWU+cENsZWFyVmFsdWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJ1bmlvbiIgbmFtZT0iVmtDbGVhckNvbG9yVmFsdWUiIGNvbW1lbnQ9Ii8vIFVuaW9uIGFsbG93aW5nIHNwZWNpZmljYXRpb24gb2YgZmxvYXRpbmcgcG9pbnQsIGludGVnZXIsIG9yIHVuc2lnbmVkIGludGVnZXIgY29sb3IgZGF0YS4gQWN0dWFsIHZhbHVlIHNlbGVjdGVkIGlzIGJhc2VkIG9uIGltYWdlL2F0dGFjaG1lbnQgYmVpbmcgY2xlYXJlZC4iPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5mbG9hdDMyPC9uYW1lPls0XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5pbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5pbnQzMjwvbmFtZT5bNF08L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dWludDMyPC9uYW1lPls0XTwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPmRlcHRoPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zdGVuY2lsPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJ1bmlvbiIgbmFtZT0iVmtDbGVhclZhbHVlIiBjb21tZW50PSIvLyBVbmlvbiBhbGxvd2luZyBzcGVjaWZpY2F0aW9uIG9mIGNvbG9yIG9yIGRlcHRoIGFuZCBzdGVuY2lsIHZhbHVlcy4gQWN0dWFsIHZhbHVlIHNlbGVjdGVkIGlzIGJhc2VkIG9uIGF0dGFjaG1lbnQgYmVpbmcgY2xlYXJlZC4iPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0NsZWFyQ29sb3JWYWx1ZTwvdHlwZT4gICAgICA8bmFtZT5jb2xvcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlPC90eXBlPiA8bmFtZT5kZXB0aFN0ZW5jaWw8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtDbGVhckF0dGFjaG1lbnQiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlQXNwZWN0RmxhZ3M8L3R5cGU+ICAgICA8bmFtZT5hc3BlY3RNYXNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5jb2xvckF0dGFjaG1lbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ2xlYXJWYWx1ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPmNsZWFyVmFsdWU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtBdHRhY2htZW50RGVzY3JpcHRpb24iPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnczwvdHlwZT4gPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmZvcm1hdDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTYW1wbGVDb3VudEZsYWdCaXRzPC90eXBlPiAgPG5hbWU+c2FtcGxlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtBdHRhY2htZW50TG9hZE9wPC90eXBlPiAgICAgPG5hbWU+bG9hZE9wPC9uYW1lPjxjb21tZW50PkxvYWQgb3BlcmF0aW9uIGZvciBjb2xvciBvciBkZXB0aCBkYXRhPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0F0dGFjaG1lbnRTdG9yZU9wPC90eXBlPiAgICA8bmFtZT5zdG9yZU9wPC9uYW1lPjxjb21tZW50PlN0b3JlIG9wZXJhdGlvbiBmb3IgY29sb3Igb3IgZGVwdGggZGF0YTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtBdHRhY2htZW50TG9hZE9wPC90eXBlPiAgICAgPG5hbWU+c3RlbmNpbExvYWRPcDwvbmFtZT48Y29tbWVudD5Mb2FkIG9wZXJhdGlvbiBmb3Igc3RlbmNpbCBkYXRhPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0F0dGFjaG1lbnRTdG9yZU9wPC90eXBlPiAgICA8bmFtZT5zdGVuY2lsU3RvcmVPcDwvbmFtZT48Y29tbWVudD5TdG9yZSBvcGVyYXRpb24gZm9yIHN0ZW5jaWwgZGF0YTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZUxheW91dDwvdHlwZT4gICAgICAgICAgPG5hbWU+aW5pdGlhbExheW91dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZUxheW91dDwvdHlwZT4gICAgICAgICAgPG5hbWU+ZmluYWxMYXlvdXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtBdHRhY2htZW50UmVmZXJlbmNlIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YXR0YWNobWVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZUxheW91dDwvdHlwZT4gICAgICAgICAgPG5hbWU+bGF5b3V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3VicGFzc0Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BpcGVsaW5lQmluZFBvaW50PC90eXBlPiAgICA8bmFtZT5waXBlbGluZUJpbmRQb2ludDwvbmFtZT48Y29tbWVudD5NdXN0IGJlIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MgZm9yIG5vdzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmlucHV0QXR0YWNobWVudENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImlucHV0QXR0YWNobWVudENvdW50Ij5jb25zdCA8dHlwZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L3R5cGU+KiA8bmFtZT5wSW5wdXRBdHRhY2htZW50czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmNvbG9yQXR0YWNobWVudENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImNvbG9yQXR0YWNobWVudENvdW50Ij5jb25zdCA8dHlwZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L3R5cGU+KiA8bmFtZT5wQ29sb3JBdHRhY2htZW50czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiIGxlbj0iY29sb3JBdHRhY2htZW50Q291bnQiPmNvbnN0IDx0eXBlPlZrQXR0YWNobWVudFJlZmVyZW5jZTwvdHlwZT4qIDxuYW1lPnBSZXNvbHZlQXR0YWNobWVudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L3R5cGU+KiA8bmFtZT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnByZXNlcnZlQXR0YWNobWVudENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InByZXNlcnZlQXR0YWNobWVudENvdW50Ij5jb25zdCA8dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3VicGFzc0RlcGVuZGVuY3kiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zcmNTdWJwYXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kc3RTdWJwYXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BpcGVsaW5lU3RhZ2VGbGFnczwvdHlwZT4gICA8bmFtZT5zcmNTdGFnZU1hc2s8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVTdGFnZUZsYWdzPC90eXBlPiAgIDxuYW1lPmRzdFN0YWdlTWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICAgICAgIDxuYW1lPnNyY0FjY2Vzc01hc2s8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIHNvdXJjZSBvZiB0aGUgZGVwZW5kZW5jeSB0byBzeW5jaHJvbml6ZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICAgICAgIDxuYW1lPmRzdEFjY2Vzc01hc2s8L25hbWU+PGNvbW1lbnQ+TWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBkZXBlbmRlbmN5IHRvIHN5bmNocm9uaXplPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtEZXBlbmRlbmN5RmxhZ3M8L3R5cGU+ICAgICAgPG5hbWU+ZGVwZW5kZW5jeUZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUmVuZGVyUGFzc0NyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUmVuZGVyUGFzc0NyZWF0ZUZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgIDxuYW1lPmF0dGFjaG1lbnRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJhdHRhY2htZW50Q291bnQiPmNvbnN0IDx0eXBlPlZrQXR0YWNobWVudERlc2NyaXB0aW9uPC90eXBlPiogPG5hbWU+cEF0dGFjaG1lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zdWJwYXNzQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ic3VicGFzc0NvdW50Ij5jb25zdCA8dHlwZT5Wa1N1YnBhc3NEZXNjcmlwdGlvbjwvdHlwZT4qIDxuYW1lPnBTdWJwYXNzZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgPG5hbWU+ZGVwZW5kZW5jeUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImRlcGVuZGVuY3lDb3VudCI+Y29uc3QgPHR5cGU+VmtTdWJwYXNzRGVwZW5kZW5jeTwvdHlwZT4qIDxuYW1lPnBEZXBlbmRlbmNpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFdmVudENyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXZlbnRDcmVhdGVGbGFnczwvdHlwZT4gICAgIDxuYW1lPmZsYWdzPC9uYW1lPjxjb21tZW50PkV2ZW50IGNyZWF0aW9uIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRmVuY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0ZlbmNlQ3JlYXRlRmxhZ3M8L3R5cGU+ICAgICA8bmFtZT5mbGFnczwvbmFtZT48Y29tbWVudD5GZW5jZSBjcmVhdGlvbiBmbGFnczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5yb2J1c3RCdWZmZXJBY2Nlc3M8L25hbWU+PGNvbW1lbnQ+b3V0IG9mIGJvdW5kcyBidWZmZXIgYWNjZXNzZXMgYXJlIHdlbGwgZGVmaW5lZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZnVsbERyYXdJbmRleFVpbnQzMjwvbmFtZT48Y29tbWVudD5mdWxsIDMyLWJpdCByYW5nZSBvZiBpbmRpY2VzIGZvciBpbmRleGVkIGRyYXcgY2FsbHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmltYWdlQ3ViZUFycmF5PC9uYW1lPjxjb21tZW50PmltYWdlIHZpZXdzIHdoaWNoIGFyZSBhcnJheXMgb2YgY3ViZSBtYXBzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5pbmRlcGVuZGVudEJsZW5kPC9uYW1lPjxjb21tZW50PmJsZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGNvbnRyb2xsZWQgcGVyLWF0dGFjaG1lbnQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmdlb21ldHJ5U2hhZGVyPC9uYW1lPjxjb21tZW50Pmdlb21ldHJ5IHN0YWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT50ZXNzZWxsYXRpb25TaGFkZXI8L25hbWU+PGNvbW1lbnQ+dGVzc2VsbGF0aW9uIGNvbnRyb2wgYW5kIGV2YWx1YXRpb24gc3RhZ2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNhbXBsZVJhdGVTaGFkaW5nPC9uYW1lPjxjb21tZW50PnBlci1zYW1wbGUgc2hhZGluZyBhbmQgaW50ZXJwb2xhdGlvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZHVhbFNyY0JsZW5kPC9uYW1lPjxjb21tZW50PmJsZW5kIG9wZXJhdGlvbnMgd2hpY2ggdGFrZSB0d28gc291cmNlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bG9naWNPcDwvbmFtZT48Y29tbWVudD5sb2dpYyBvcGVyYXRpb25zPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tdWx0aURyYXdJbmRpcmVjdDwvbmFtZT48Y29tbWVudD5tdWx0aSBkcmF3IGluZGlyZWN0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlPC9uYW1lPjxjb21tZW50PmluZGlyZWN0IGRyYXdzIGNhbiB1c2Ugbm9uLXplcm8gZmlyc3RJbnN0YW5jZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZGVwdGhDbGFtcDwvbmFtZT48Y29tbWVudD5kZXB0aCBjbGFtcGluZzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZGVwdGhCaWFzQ2xhbXA8L25hbWU+PGNvbW1lbnQ+ZGVwdGggYmlhcyBjbGFtcGluZzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZmlsbE1vZGVOb25Tb2xpZDwvbmFtZT48Y29tbWVudD5wb2ludCBhbmQgd2lyZWZyYW1lIGZpbGwgbW9kZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlcHRoQm91bmRzPC9uYW1lPjxjb21tZW50PmRlcHRoIGJvdW5kcyB0ZXN0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT53aWRlTGluZXM8L25hbWU+PGNvbW1lbnQ+bGluZXMgd2l0aCB3aWR0aCBncmVhdGVyIHRoYW4gMTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bGFyZ2VQb2ludHM8L25hbWU+PGNvbW1lbnQ+cG9pbnRzIHdpdGggc2l6ZSBncmVhdGVyIHRoYW4gMTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YWxwaGFUb09uZTwvbmFtZT48Y29tbWVudD50aGUgZnJhZ21lbnQgYWxwaGEgY29tcG9uZW50IGNhbiBiZSBmb3JjZWQgdG8gbWF4aW11bSByZXByZXNlbnRhYmxlIGFscGhhIHZhbHVlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tdWx0aVZpZXdwb3J0PC9uYW1lPjxjb21tZW50PnZpZXdwb3J0IGFycmF5czwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2FtcGxlckFuaXNvdHJvcHk8L25hbWU+PGNvbW1lbnQ+YW5pc290cm9waWMgc2FtcGxlciBmaWx0ZXJpbmc8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnRleHR1cmVDb21wcmVzc2lvbkVUQzI8L25hbWU+PGNvbW1lbnQ+RVRDIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0czwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFI8L25hbWU+PGNvbW1lbnQ+QVNUQyBMRFIgdGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXRzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT50ZXh0dXJlQ29tcHJlc3Npb25CQzwvbmFtZT48Y29tbWVudD5CQzEtNyB0ZXh0dXJlIGNvbXByZXNzZWQgZm9ybWF0czwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+b2NjbHVzaW9uUXVlcnlQcmVjaXNlPC9uYW1lPjxjb21tZW50PnByZWNpc2Ugb2NjbHVzaW9uIHF1ZXJpZXMgcmV0dXJuaW5nIGFjdHVhbCBzYW1wbGUgY291bnRzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5waXBlbGluZVN0YXRpc3RpY3NRdWVyeTwvbmFtZT48Y29tbWVudD5waXBlbGluZSBzdGF0aXN0aWNzIHF1ZXJ5PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT52ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3M8L25hbWU+PGNvbW1lbnQ+c3RvcmVzIGFuZCBhdG9taWMgb3BzIG9uIHN0b3JhZ2UgYnVmZmVycyBhbmQgaW1hZ2VzIGFyZSBzdXBwb3J0ZWQgaW4gdmVydGV4LCB0ZXNzZWxsYXRpb24sIGFuZCBnZW9tZXRyeSBzdGFnZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmZyYWdtZW50U3RvcmVzQW5kQXRvbWljczwvbmFtZT48Y29tbWVudD5zdG9yZXMgYW5kIGF0b21pYyBvcHMgb24gc3RvcmFnZSBidWZmZXJzIGFuZCBpbWFnZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGUgZnJhZ21lbnQgc3RhZ2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclRlc3NlbGxhdGlvbkFuZEdlb21ldHJ5UG9pbnRTaXplPC9uYW1lPjxjb21tZW50PnRlc3NlbGxhdGlvbiBhbmQgZ2VvbWV0cnkgc3RhZ2VzIGNhbiBleHBvcnQgcG9pbnQgc2l6ZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZDwvbmFtZT48Y29tbWVudD5pbWFnZSBnYXRoZXIgd2l0aCBydW4tdGltZSB2YWx1ZXMgYW5kIGluZGVwZW5kZW50IG9mZnNldHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0czwvbmFtZT48Y29tbWVudD50aGUgZXh0ZW5kZWQgc2V0IG9mIGZvcm1hdHMgY2FuIGJlIHVzZWQgZm9yIHN0b3JhZ2UgaW1hZ2VzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZTwvbmFtZT48Y29tbWVudD5tdWx0aXNhbXBsZSBpbWFnZXMgY2FuIGJlIHVzZWQgZm9yIHN0b3JhZ2UgaW1hZ2VzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdDwvbmFtZT48Y29tbWVudD5yZWFkIGZyb20gc3RvcmFnZSBpbWFnZSBkb2VzIG5vdCByZXF1aXJlIGZvcm1hdCBxdWFsaWZpZXI8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdDwvbmFtZT48Y29tbWVudD53cml0ZSB0byBzdG9yYWdlIGltYWdlIGRvZXMgbm90IHJlcXVpcmUgZm9ybWF0IHF1YWxpZmllcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nPC9uYW1lPjxjb21tZW50PmFycmF5cyBvZiB1bmlmb3JtIGJ1ZmZlcnMgY2FuIGJlIGFjY2Vzc2VkIHdpdGggZHluYW1pY2FsbHkgdW5pZm9ybSBpbmRpY2VzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZzwvbmFtZT48Y29tbWVudD5hcnJheXMgb2Ygc2FtcGxlZCBpbWFnZXMgY2FuIGJlIGFjY2Vzc2VkIHdpdGggZHluYW1pY2FsbHkgdW5pZm9ybSBpbmRpY2VzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc8L25hbWU+PGNvbW1lbnQ+YXJyYXlzIG9mIHN0b3JhZ2UgYnVmZmVycyBjYW4gYmUgYWNjZXNzZWQgd2l0aCBkeW5hbWljYWxseSB1bmlmb3JtIGluZGljZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nPC9uYW1lPjxjb21tZW50PmFycmF5cyBvZiBzdG9yYWdlIGltYWdlcyBjYW4gYmUgYWNjZXNzZWQgd2l0aCBkeW5hbWljYWxseSB1bmlmb3JtIGluZGljZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlckNsaXBEaXN0YW5jZTwvbmFtZT48Y29tbWVudD5jbGlwIGRpc3RhbmNlIGluIHNoYWRlcnM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlckN1bGxEaXN0YW5jZTwvbmFtZT48Y29tbWVudD5jdWxsIGRpc3RhbmNlIGluIHNoYWRlcnM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlckZsb2F0NjQ8L25hbWU+PGNvbW1lbnQ+NjQtYml0IGZsb2F0cyAoZG91YmxlcykgaW4gc2hhZGVyczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVySW50NjQ8L25hbWU+PGNvbW1lbnQ+NjQtYml0IGludGVnZXJzIGluIHNoYWRlcnM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlckludDE2PC9uYW1lPjxjb21tZW50PjE2LWJpdCBpbnRlZ2VycyBpbiBzaGFkZXJzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJSZXNvdXJjZVJlc2lkZW5jeTwvbmFtZT48Y29tbWVudD5zaGFkZXIgY2FuIHVzZSB0ZXh0dXJlIG9wZXJhdGlvbnMgdGhhdCByZXR1cm4gcmVzb3VyY2UgcmVzaWRlbmN5IGluZm9ybWF0aW9uIChyZXF1aXJlcyBzcGFyc2VOb25SZXNpZGVudCBzdXBwb3J0KTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyUmVzb3VyY2VNaW5Mb2Q8L25hbWU+PGNvbW1lbnQ+c2hhZGVyIGNhbiB1c2UgdGV4dHVyZSBvcGVyYXRpb25zIHRoYXQgc3BlY2lmeSBtaW5pbXVtIHJlc291cmNlIExPRDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c3BhcnNlQmluZGluZzwvbmFtZT48Y29tbWVudD5TcGFyc2UgcmVzb3VyY2VzIHN1cHBvcnQ6IFJlc291cmNlIG1lbW9yeSBjYW4gYmUgbWFuYWdlZCBhdCBvcGFxdWUgcGFnZSBsZXZlbCByYXRoZXIgdGhhbiBvYmplY3QgbGV2ZWw8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNwYXJzZVJlc2lkZW5jeUJ1ZmZlcjwvbmFtZT48Y29tbWVudD5TcGFyc2UgcmVzb3VyY2VzIHN1cHBvcnQ6IEdQVSBjYW4gYWNjZXNzIHBhcnRpYWxseSByZXNpZGVudCBidWZmZXJzIDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c3BhcnNlUmVzaWRlbmN5SW1hZ2UyRDwvbmFtZT48Y29tbWVudD5TcGFyc2UgcmVzb3VyY2VzIHN1cHBvcnQ6IEdQVSBjYW4gYWNjZXNzIHBhcnRpYWxseSByZXNpZGVudCAyRCAobm9uLU1TQUEgbm9uLWRlcHRoL3N0ZW5jaWwpIGltYWdlcyA8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNwYXJzZVJlc2lkZW5jeUltYWdlM0Q8L25hbWU+PGNvbW1lbnQ+U3BhcnNlIHJlc291cmNlcyBzdXBwb3J0OiBHUFUgY2FuIGFjY2VzcyBwYXJ0aWFsbHkgcmVzaWRlbnQgM0QgaW1hZ2VzIDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c3BhcnNlUmVzaWRlbmN5MlNhbXBsZXM8L25hbWU+PGNvbW1lbnQ+U3BhcnNlIHJlc291cmNlcyBzdXBwb3J0OiBHUFUgY2FuIGFjY2VzcyBwYXJ0aWFsbHkgcmVzaWRlbnQgTVNBQSAyRCBpbWFnZXMgd2l0aCAyIHNhbXBsZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNwYXJzZVJlc2lkZW5jeTRTYW1wbGVzPC9uYW1lPjxjb21tZW50PlNwYXJzZSByZXNvdXJjZXMgc3VwcG9ydDogR1BVIGNhbiBhY2Nlc3MgcGFydGlhbGx5IHJlc2lkZW50IE1TQUEgMkQgaW1hZ2VzIHdpdGggNCBzYW1wbGVzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zcGFyc2VSZXNpZGVuY3k4U2FtcGxlczwvbmFtZT48Y29tbWVudD5TcGFyc2UgcmVzb3VyY2VzIHN1cHBvcnQ6IEdQVSBjYW4gYWNjZXNzIHBhcnRpYWxseSByZXNpZGVudCBNU0FBIDJEIGltYWdlcyB3aXRoIDggc2FtcGxlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzPC9uYW1lPjxjb21tZW50PlNwYXJzZSByZXNvdXJjZXMgc3VwcG9ydDogR1BVIGNhbiBhY2Nlc3MgcGFydGlhbGx5IHJlc2lkZW50IE1TQUEgMkQgaW1hZ2VzIHdpdGggMTYgc2FtcGxlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c3BhcnNlUmVzaWRlbmN5QWxpYXNlZDwvbmFtZT48Y29tbWVudD5TcGFyc2UgcmVzb3VyY2VzIHN1cHBvcnQ6IEdQVSBjYW4gY29ycmVjdGx5IGFjY2VzcyBkYXRhIGFsaWFzZWQgaW50byBtdWx0aXBsZSBsb2NhdGlvbnMgKG9wdC1pbik8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlPC9uYW1lPjxjb21tZW50Pm11bHRpc2FtcGxlIHJhdGUgbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsIHBpcGVsaW5lcyBpbiBhIHN1YnBhc3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmluaGVyaXRlZFF1ZXJpZXM8L25hbWU+PGNvbW1lbnQ+UXVlcmllcyBtYXkgYmUgaW5oZXJpdGVkIGZyb20gcHJpbWFyeSB0byBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXJzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5yZXNpZGVuY3lTdGFuZGFyZDJEQmxvY2tTaGFwZTwvbmFtZT48Y29tbWVudD5TcGFyc2UgcmVzb3VyY2VzIHN1cHBvcnQ6IEdQVSB3aWxsIGFjY2VzcyBhbGwgMkQgKHNpbmdsZSBzYW1wbGUpIHNwYXJzZSByZXNvdXJjZXMgdXNpbmcgdGhlIHN0YW5kYXJkIHNwYXJzZSBpbWFnZSBibG9jayBzaGFwZXMgKGJhc2VkIG9uIHBpeGVsIGZvcm1hdCk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGU8L25hbWU+PGNvbW1lbnQ+U3BhcnNlIHJlc291cmNlcyBzdXBwb3J0OiBHUFUgd2lsbCBhY2Nlc3MgYWxsIDJEIChtdWx0aXNhbXBsZSkgc3BhcnNlIHJlc291cmNlcyB1c2luZyB0aGUgc3RhbmRhcmQgc3BhcnNlIGltYWdlIGJsb2NrIHNoYXBlcyAoYmFzZWQgb24gcGl4ZWwgZm9ybWF0KTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+cmVzaWRlbmN5U3RhbmRhcmQzREJsb2NrU2hhcGU8L25hbWU+PGNvbW1lbnQ+U3BhcnNlIHJlc291cmNlcyBzdXBwb3J0OiBHUFUgd2lsbCBhY2Nlc3MgYWxsIDNEIHNwYXJzZSByZXNvdXJjZXMgdXNpbmcgdGhlIHN0YW5kYXJkIHNwYXJzZSBpbWFnZSBibG9jayBzaGFwZXMgKGJhc2VkIG9uIHBpeGVsIGZvcm1hdCk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnJlc2lkZW5jeUFsaWduZWRNaXBTaXplPC9uYW1lPjxjb21tZW50PlNwYXJzZSByZXNvdXJjZXMgc3VwcG9ydDogSW1hZ2VzIHdpdGggbWlwIGxldmVsIGRpbWVuc2lvbnMgdGhhdCBhcmUgTk9UIGEgbXVsdGlwbGUgb2YgdGhlIHNwYXJzZSBpbWFnZSBibG9jayBkaW1lbnNpb25zIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBtaXAgdGFpbDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+cmVzaWRlbmN5Tm9uUmVzaWRlbnRTdHJpY3Q8L25hbWU+PGNvbW1lbnQ+U3BhcnNlIHJlc291cmNlcyBzdXBwb3J0OiBHUFUgY2FuIGNvbnNpc3RlbnRseSBhY2Nlc3Mgbm9uLXJlc2lkZW50IHJlZ2lvbnMgb2YgYSByZXNvdXJjZSwgYWxsIHJlYWRzIHJldHVybiBhcyBpZiBkYXRhIGlzIDAsIHdyaXRlcyBhcmUgZGlzY2FyZGVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VMaW1pdHMiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICAgICAgPGNvbW1lbnQ+cmVzb3VyY2UgbWF4aW11bSBzaXplczwvY29tbWVudD4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4SW1hZ2VEaW1lbnNpb24xRDwvbmFtZT48Y29tbWVudD5tYXggMUQgaW1hZ2UgZGltZW5zaW9uPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhJbWFnZURpbWVuc2lvbjJEPC9uYW1lPjxjb21tZW50Pm1heCAyRCBpbWFnZSBkaW1lbnNpb248L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heEltYWdlRGltZW5zaW9uM0Q8L25hbWU+PGNvbW1lbnQ+bWF4IDNEIGltYWdlIGRpbWVuc2lvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4SW1hZ2VEaW1lbnNpb25DdWJlPC9uYW1lPjxjb21tZW50Pm1heCBjdWJlbWFwIGltYWdlIGRpbWVuc2lvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4SW1hZ2VBcnJheUxheWVyczwvbmFtZT48Y29tbWVudD5tYXggbGF5ZXJzIGZvciBpbWFnZSBhcnJheXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRleGVsQnVmZmVyRWxlbWVudHM8L25hbWU+PGNvbW1lbnQ+bWF4IHRleGVsIGJ1ZmZlciBzaXplIChmc3RleGVscyk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFVuaWZvcm1CdWZmZXJSYW5nZTwvbmFtZT48Y29tbWVudD5tYXggdW5pZm9ybSBidWZmZXIgcmFuZ2UgKGJ5dGVzKTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4U3RvcmFnZUJ1ZmZlclJhbmdlPC9uYW1lPjxjb21tZW50Pm1heCBzdG9yYWdlIGJ1ZmZlciByYW5nZSAoYnl0ZXMpPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQdXNoQ29uc3RhbnRzU2l6ZTwvbmFtZT48Y29tbWVudD5tYXggc2l6ZSBvZiB0aGUgcHVzaCBjb25zdGFudHMgcG9vbCAoYnl0ZXMpPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxjb21tZW50Pm1lbW9yeSBsaW1pdHM8L2NvbW1lbnQ+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heE1lbW9yeUFsbG9jYXRpb25Db3VudDwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIGRldmljZSBtZW1vcnkgYWxsb2NhdGlvbnMgc3VwcG9ydGVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50PC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2Ygc2FtcGxlcnMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIG9uIGEgZGV2aWNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICA8bmFtZT5idWZmZXJJbWFnZUdyYW51bGFyaXR5PC9uYW1lPjxjb21tZW50PkdyYW51bGFyaXR5IChpbiBieXRlcykgYXQgd2hpY2ggYnVmZmVycyBhbmQgaW1hZ2VzIGNhbiBiZSBib3VuZCB0byBhZGphY2VudCBtZW1vcnkgZm9yIHNpbXVsdGFuZW91cyB1c2FnZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+c3BhcnNlQWRkcmVzc1NwYWNlU2l6ZTwvbmFtZT48Y29tbWVudD5Ub3RhbCBhZGRyZXNzIHNwYWNlIGF2YWlsYWJsZSBmb3Igc3BhcnNlIGFsbG9jYXRpb25zIChieXRlcyk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICAgICAgPGNvbW1lbnQ+ZGVzY3JpcHRvciBzZXQgbGltaXRzPC9jb21tZW50PgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhCb3VuZERlc2NyaXB0b3JTZXRzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgc2V0cyB0aGF0IGNhbiBiZSBib3VuZCB0byBhIHBpcGVsaW5lPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVyczwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIHNhbXBsZXJzIGFsbG93ZWQgcGVyLXN0YWdlIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgdW5pZm9ybSBidWZmZXJzIGFsbG93ZWQgcGVyLXN0YWdlIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VCdWZmZXJzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2Ygc3RvcmFnZSBidWZmZXJzIGFsbG93ZWQgcGVyLXN0YWdlIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZWRJbWFnZXM8L25hbWU+PGNvbW1lbnQ+bWF4IG51bWJlciBvZiBzYW1wbGVkIGltYWdlcyBhbGxvd2VkIHBlci1zdGFnZSBpbiBhIGRlc2NyaXB0b3Igc2V0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2Ygc3RvcmFnZSBpbWFnZXMgYWxsb3dlZCBwZXItc3RhZ2UgaW4gYSBkZXNjcmlwdG9yIHNldDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5wdXRBdHRhY2htZW50czwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIGlucHV0IGF0dGFjaG1lbnRzIGFsbG93ZWQgcGVyLXN0YWdlIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFBlclN0YWdlUmVzb3VyY2VzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgcmVzb3VyY2VzIGFsbG93ZWQgYnkgYSBzaW5nbGUgc3RhZ2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRTYW1wbGVyczwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIHNhbXBsZXJzIGFsbG93ZWQgaW4gYWxsIHN0YWdlcyBpbiBhIGRlc2NyaXB0b3Igc2V0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnM8L25hbWU+PGNvbW1lbnQ+bWF4IG51bWJlciBvZiB1bmlmb3JtIGJ1ZmZlcnMgYWxsb3dlZCBpbiBhbGwgc3RhZ2VzIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWM8L25hbWU+PGNvbW1lbnQ+bWF4IG51bWJlciBvZiBkeW5hbWljIHVuaWZvcm0gYnVmZmVycyBhbGxvd2VkIGluIGFsbCBzdGFnZXMgaW4gYSBkZXNjcmlwdG9yIHNldDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2Ygc3RvcmFnZSBidWZmZXJzIGFsbG93ZWQgaW4gYWxsIHN0YWdlcyBpbiBhIGRlc2NyaXB0b3Igc2V0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgZHluYW1pYyBzdG9yYWdlIGJ1ZmZlcnMgYWxsb3dlZCBpbiBhbGwgc3RhZ2VzIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2Ygc2FtcGxlZCBpbWFnZXMgYWxsb3dlZCBpbiBhbGwgc3RhZ2VzIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2Ygc3RvcmFnZSBpbWFnZXMgYWxsb3dlZCBpbiBhbGwgc3RhZ2VzIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRJbnB1dEF0dGFjaG1lbnRzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgaW5wdXQgYXR0YWNobWVudHMgYWxsb3dlZCBpbiBhbGwgc3RhZ2VzIGluIGEgZGVzY3JpcHRvciBzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICAgICAgPGNvbW1lbnQ+dmVydGV4IHN0YWdlIGxpbWl0czwvY29tbWVudD4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgdmVydGV4IGlucHV0IGF0dHJpYnV0ZSBzbG90czwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VmVydGV4SW5wdXRCaW5kaW5nczwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIHZlcnRleCBpbnB1dCBiaW5kaW5nIHNsb3RzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldDwvbmFtZT48Y29tbWVudD5tYXggdmVydGV4IGlucHV0IGF0dHJpYnV0ZSBvZmZzZXQgYWRkZWQgdG8gdmVydGV4IGJ1ZmZlciBvZmZzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZTwvbmFtZT48Y29tbWVudD5tYXggdmVydGV4IGlucHV0IGJpbmRpbmcgc3RyaWRlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2Ygb3V0cHV0IGNvbXBvbmVudHMgd3JpdHRlbiBieSB2ZXJ0ZXggc2hhZGVyPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxjb21tZW50PnRlc3NlbGxhdGlvbiBjb250cm9sIHN0YWdlIGxpbWl0czwvY29tbWVudD4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsPC9uYW1lPjxjb21tZW50Pm1heCBsZXZlbCBzdXBwb3J0ZWQgYnkgdGVzc2VsbGF0aW9uIHByaW1pdGl2ZSBnZW5lcmF0b3I8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRlc3NlbGxhdGlvblBhdGNoU2l6ZTwvbmFtZT48Y29tbWVudD5tYXggcGF0Y2ggc2l6ZSAodmVydGljZXMpPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgaW5wdXQgY29tcG9uZW50cyBwZXItdmVydGV4IGluIFRDUzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHM8L25hbWU+PGNvbW1lbnQ+bWF4IG51bWJlciBvZiBvdXRwdXQgY29tcG9uZW50cyBwZXItdmVydGV4IGluIFRDUzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclBhdGNoT3V0cHV0Q29tcG9uZW50czwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIG91dHB1dCBjb21wb25lbnRzIHBlci1wYXRjaCBpbiBUQ1M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRlc3NlbGxhdGlvbkNvbnRyb2xUb3RhbE91dHB1dENvbXBvbmVudHM8L25hbWU+PGNvbW1lbnQ+bWF4IHRvdGFsIG51bWJlciBvZiBwZXItdmVydGV4IGFuZCBwZXItcGF0Y2ggb3V0cHV0IGNvbXBvbmVudHMgaW4gVENTPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxjb21tZW50PnRlc3NlbGxhdGlvbiBldmFsdWF0aW9uIHN0YWdlIGxpbWl0czwvY29tbWVudD4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50czwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIGlucHV0IGNvbXBvbmVudHMgcGVyIHZlcnRleCBpbiBURVM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2Ygb3V0cHV0IGNvbXBvbmVudHMgcGVyIHZlcnRleCBpbiBURVM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICAgICAgPGNvbW1lbnQ+Z2VvbWV0cnkgc3RhZ2UgbGltaXRzPC9jb21tZW50PgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zPC9uYW1lPjxjb21tZW50Pm1heCBpbnZvY2F0aW9uIGNvdW50IHN1cHBvcnRlZCBpbiBnZW9tZXRyeSBzaGFkZXI8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgaW5wdXQgY29tcG9uZW50cyByZWFkIGluIGdlb21ldHJ5IHN0YWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHM8L25hbWU+PGNvbW1lbnQ+bWF4IG51bWJlciBvZiBvdXRwdXQgY29tcG9uZW50cyB3cml0dGVuIGluIGdlb21ldHJ5IHN0YWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgdmVydGljZXMgdGhhdCBjYW4gYmUgZW1pdHRlZCBpbiBnZW9tZXRyeSBzdGFnZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHM8L25hbWU+PGNvbW1lbnQ+bWF4IHRvdGFsIG51bWJlciBvZiBjb21wb25lbnRzIChhbGwgdmVydGljZXMpIHdyaXR0ZW4gaW4gZ2VvbWV0cnkgc3RhZ2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICAgICAgPGNvbW1lbnQ+ZnJhZ21lbnQgc3RhZ2UgbGltaXRzPC9jb21tZW50PgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhGcmFnbWVudElucHV0Q29tcG9uZW50czwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIGlucHV0IGNvbXBvbmVudHMgcmVhZCBpbiBmcmFnbWVudCBzdGFnZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50czwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIG91dHB1dCBhdHRhY2htZW50cyB3cml0dGVuIGluIGZyYWdtZW50IHN0YWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhGcmFnbWVudER1YWxTcmNBdHRhY2htZW50czwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIG91dHB1dCBhdHRhY2htZW50cyB3cml0dGVuIHdoZW4gdXNpbmcgZHVhbCBzb3VyY2UgYmxlbmRpbmc8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heEZyYWdtZW50Q29tYmluZWRPdXRwdXRSZXNvdXJjZXM8L25hbWU+PGNvbW1lbnQ+bWF4IHRvdGFsIG51bWJlciBvZiBzdG9yYWdlIGJ1ZmZlcnMsIHN0b3JhZ2UgaW1hZ2VzIGFuZCBvdXRwdXQgYnVmZmVyczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8Y29tbWVudD5jb21wdXRlIHN0YWdlIGxpbWl0czwvY29tbWVudD4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemU8L25hbWU+PGNvbW1lbnQ+bWF4IHRvdGFsIHN0b3JhZ2Ugc2l6ZSBvZiB3b3JrIGdyb3VwIGxvY2FsIHN0b3JhZ2UgKGJ5dGVzKTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50PC9uYW1lPlszXTxjb21tZW50Pm1heCBudW0gb2YgY29tcHV0ZSB3b3JrIGdyb3VwcyB0aGF0IG1heSBiZSBkaXNwYXRjaGVkIGJ5IGEgc2luZ2xlIGNvbW1hbmQgKHgseSx6KTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zPC9uYW1lPjxjb21tZW50Pm1heCB0b3RhbCBjb21wdXRlIGludm9jYXRpb25zIGluIGEgc2luZ2xlIGxvY2FsIHdvcmsgZ3JvdXA8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heENvbXB1dGVXb3JrR3JvdXBTaXplPC9uYW1lPlszXTxjb21tZW50Pm1heCBsb2NhbCBzaXplIG9mIGEgY29tcHV0ZSB3b3JrIGdyb3VwICh4LHkseik8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnN1YlBpeGVsUHJlY2lzaW9uQml0czwvbmFtZT48Y29tbWVudD5udW1iZXIgYml0cyBvZiBzdWJwaXhlbCBwcmVjaXNpb24gaW4gc2NyZWVuIHggYW5kIHk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnN1YlRleGVsUHJlY2lzaW9uQml0czwvbmFtZT48Y29tbWVudD5udW1iZXIgYml0cyBvZiBwcmVjaXNpb24gZm9yIHNlbGVjdGluZyB0ZXhlbCB3ZWlnaHRzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5taXBtYXBQcmVjaXNpb25CaXRzPC9uYW1lPjxjb21tZW50Pm51bWJlciBiaXRzIG9mIHByZWNpc2lvbiBmb3Igc2VsZWN0aW5nIG1pcG1hcCB3ZWlnaHRzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhEcmF3SW5kZXhlZEluZGV4VmFsdWU8L25hbWU+PGNvbW1lbnQ+bWF4IGluZGV4IHZhbHVlIGZvciBpbmRleGVkIGRyYXcgY2FsbHMgKGZvciAzMi1iaXQgaW5kaWNlcyk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERyYXdJbmRpcmVjdENvdW50PC9uYW1lPjxjb21tZW50Pm1heCBkcmF3IGNvdW50IGZvciBpbmRpcmVjdCBkcmF3IGNhbGxzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5tYXhTYW1wbGVyTG9kQmlhczwvbmFtZT48Y29tbWVudD5tYXggYWJzb2x1dGUgc2FtcGxlciBMT0QgYmlhczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4U2FtcGxlckFuaXNvdHJvcHk8L25hbWU+PGNvbW1lbnQ+bWF4IGRlZ3JlZSBvZiBzYW1wbGVyIGFuaXNvdHJvcHk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFZpZXdwb3J0czwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIGFjdGl2ZSB2aWV3cG9ydHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFZpZXdwb3J0RGltZW5zaW9uczwvbmFtZT5bMl08Y29tbWVudD5tYXggdmlld3BvcnQgZGltZW5zaW9ucyAoeCx5KTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+dmlld3BvcnRCb3VuZHNSYW5nZTwvbmFtZT5bMl08Y29tbWVudD52aWV3cG9ydCBib3VuZHMgcmFuZ2UgKG1pbixtYXgpPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT52aWV3cG9ydFN1YlBpeGVsQml0czwvbmFtZT48Y29tbWVudD5udW1iZXIgYml0cyBvZiBzdWJwaXhlbCBwcmVjaXNpb24gZm9yIHZpZXdwb3J0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5zaXplX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICA8bmFtZT5taW5NZW1vcnlNYXBBbGlnbm1lbnQ8L25hbWU+PGNvbW1lbnQ+bWluIHJlcXVpcmVkIGFsaWdubWVudCBvZiBwb2ludGVycyByZXR1cm5lZCBieSBNYXBNZW1vcnkgKGJ5dGVzKTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+bWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQ8L25hbWU+PGNvbW1lbnQ+bWluIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGV4ZWwgYnVmZmVyIG9mZnNldHMgKGJ5dGVzKSA8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQ8L25hbWU+PGNvbW1lbnQ+bWluIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgdW5pZm9ybSBidWZmZXIgc2l6ZXMgYW5kIG9mZnNldHMgKGJ5dGVzKTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+bWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudDwvbmFtZT48Y29tbWVudD5taW4gcmVxdWlyZWQgYWxpZ25tZW50IGZvciBzdG9yYWdlIGJ1ZmZlciBvZmZzZXRzIChieXRlcyk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgIDxuYW1lPm1pblRleGVsT2Zmc2V0PC9uYW1lPjxjb21tZW50Pm1pbiB0ZXhlbCBvZmZzZXQgZm9yIE9wVGV4dHVyZVNhbXBsZU9mZnNldDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VGV4ZWxPZmZzZXQ8L25hbWU+PGNvbW1lbnQ+bWF4IHRleGVsIG9mZnNldCBmb3IgT3BUZXh0dXJlU2FtcGxlT2Zmc2V0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5pbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5taW5UZXhlbEdhdGhlck9mZnNldDwvbmFtZT48Y29tbWVudD5taW4gdGV4ZWwgb2Zmc2V0IGZvciBPcFRleHR1cmVHYXRoZXJPZmZzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRleGVsR2F0aGVyT2Zmc2V0PC9uYW1lPjxjb21tZW50Pm1heCB0ZXhlbCBvZmZzZXQgZm9yIE9wVGV4dHVyZUdhdGhlck9mZnNldDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bWluSW50ZXJwb2xhdGlvbk9mZnNldDwvbmFtZT48Y29tbWVudD5mdXJ0aGVzdCBuZWdhdGl2ZSBvZmZzZXQgZm9yIGludGVycG9sYXRlQXRPZmZzZXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPm1heEludGVycG9sYXRpb25PZmZzZXQ8L25hbWU+PGNvbW1lbnQ+ZnVydGhlc3QgcG9zaXRpdmUgb2Zmc2V0IGZvciBpbnRlcnBvbGF0ZUF0T2Zmc2V0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzPC9uYW1lPjxjb21tZW50Pm51bWJlciBvZiBzdWJwaXhlbCBiaXRzIGZvciBpbnRlcnBvbGF0ZUF0T2Zmc2V0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhGcmFtZWJ1ZmZlcldpZHRoPC9uYW1lPjxjb21tZW50Pm1heCB3aWR0aCBmb3IgYSBmcmFtZWJ1ZmZlcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4RnJhbWVidWZmZXJIZWlnaHQ8L25hbWU+PGNvbW1lbnQ+bWF4IGhlaWdodCBmb3IgYSBmcmFtZWJ1ZmZlcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4RnJhbWVidWZmZXJMYXllcnM8L25hbWU+PGNvbW1lbnQ+bWF4IGxheWVyIGNvdW50IGZvciBhIGxheWVyZWQgZnJhbWVidWZmZXI8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1NhbXBsZUNvdW50RmxhZ3M8L3R5cGU+ICAgICA8bmFtZT5mcmFtZWJ1ZmZlckNvbG9yU2FtcGxlQ291bnRzPC9uYW1lPjxjb21tZW50PnN1cHBvcnRlZCBjb2xvciBzYW1wbGUgY291bnRzIGZvciBhIGZyYW1lYnVmZmVyPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTYW1wbGVDb3VudEZsYWdzPC90eXBlPiAgICAgPG5hbWU+ZnJhbWVidWZmZXJEZXB0aFNhbXBsZUNvdW50czwvbmFtZT48Y29tbWVudD5zdXBwb3J0ZWQgZGVwdGggc2FtcGxlIGNvdW50cyBmb3IgYSBmcmFtZWJ1ZmZlcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU2FtcGxlQ291bnRGbGFnczwvdHlwZT4gICAgIDxuYW1lPmZyYW1lYnVmZmVyU3RlbmNpbFNhbXBsZUNvdW50czwvbmFtZT48Y29tbWVudD5zdXBwb3J0ZWQgc3RlbmNpbCBzYW1wbGUgY291bnRzIGZvciBhIGZyYW1lYnVmZmVyPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTYW1wbGVDb3VudEZsYWdzPC90eXBlPiAgICAgPG5hbWU+ZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzPC9uYW1lPjxjb21tZW50PnN1cHBvcnRlZCBzYW1wbGUgY291bnRzIGZvciBhIGZyYW1lYnVmZmVyIHdpdGggbm8gYXR0YWNobWVudHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heENvbG9yQXR0YWNobWVudHM8L25hbWU+PGNvbW1lbnQ+bWF4IG51bWJlciBvZiBjb2xvciBhdHRhY2htZW50cyBwZXIgc3VicGFzczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU2FtcGxlQ291bnRGbGFnczwvdHlwZT4gICAgIDxuYW1lPnNhbXBsZWRJbWFnZUNvbG9yU2FtcGxlQ291bnRzPC9uYW1lPjxjb21tZW50PnN1cHBvcnRlZCBjb2xvciBzYW1wbGUgY291bnRzIGZvciBhIG5vbi1pbnRlZ2VyIHNhbXBsZWQgaW1hZ2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1NhbXBsZUNvdW50RmxhZ3M8L3R5cGU+ICAgICA8bmFtZT5zYW1wbGVkSW1hZ2VJbnRlZ2VyU2FtcGxlQ291bnRzPC9uYW1lPjxjb21tZW50PnN1cHBvcnRlZCBzYW1wbGUgY291bnRzIGZvciBhbiBpbnRlZ2VyIGltYWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTYW1wbGVDb3VudEZsYWdzPC90eXBlPiAgICAgPG5hbWU+c2FtcGxlZEltYWdlRGVwdGhTYW1wbGVDb3VudHM8L25hbWU+PGNvbW1lbnQ+c3VwcG9ydGVkIGRlcHRoIHNhbXBsZSBjb3VudHMgZm9yIGEgc2FtcGxlZCBpbWFnZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU2FtcGxlQ291bnRGbGFnczwvdHlwZT4gICAgIDxuYW1lPnNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHM8L25hbWU+PGNvbW1lbnQ+c3VwcG9ydGVkIHN0ZW5jaWwgc2FtcGxlIGNvdW50cyBmb3IgYSBzYW1wbGVkIGltYWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTYW1wbGVDb3VudEZsYWdzPC90eXBlPiAgICAgPG5hbWU+c3RvcmFnZUltYWdlU2FtcGxlQ291bnRzPC9uYW1lPjxjb21tZW50PnN1cHBvcnRlZCBzYW1wbGUgY291bnRzIGZvciBhIHN0b3JhZ2UgaW1hZ2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFNhbXBsZU1hc2tXb3JkczwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIHNhbXBsZSBtYXNrIHdvcmRzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT50aW1lc3RhbXBDb21wdXRlQW5kR3JhcGhpY3M8L25hbWU+PGNvbW1lbnQ+dGltZXN0YW1wcyBvbiBncmFwaGljcyBhbmQgY29tcHV0ZSBxdWV1ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPnRpbWVzdGFtcFBlcmlvZDwvbmFtZT48Y29tbWVudD5udW1iZXIgb2YgbmFub3NlY29uZHMgaXQgdGFrZXMgZm9yIHRpbWVzdGFtcCBxdWVyeSB2YWx1ZSB0byBpbmNyZW1lbnQgYnkgMTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4Q2xpcERpc3RhbmNlczwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIGNsaXAgZGlzdGFuY2VzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhDdWxsRGlzdGFuY2VzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgY3VsbCBkaXN0YW5jZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXM8L25hbWU+PGNvbW1lbnQ+bWF4IGNvbWJpbmVkIG51bWJlciBvZiB1c2VyIGNsaXBwaW5nPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kaXNjcmV0ZVF1ZXVlUHJpb3JpdGllczwvbmFtZT48Y29tbWVudD5kaXN0aW5jdCBxdWV1ZSBwcmlvcml0aWVzIGF2YWlsYWJsZSA8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPnBvaW50U2l6ZVJhbmdlPC9uYW1lPlsyXTxjb21tZW50PnJhbmdlIChtaW4sbWF4KSBvZiBzdXBwb3J0ZWQgcG9pbnQgc2l6ZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPmxpbmVXaWR0aFJhbmdlPC9uYW1lPlsyXTxjb21tZW50PnJhbmdlIChtaW4sbWF4KSBvZiBzdXBwb3J0ZWQgbGluZSB3aWR0aHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPnBvaW50U2l6ZUdyYW51bGFyaXR5PC9uYW1lPjxjb21tZW50PmdyYW51bGFyaXR5IG9mIHN1cHBvcnRlZCBwb2ludCBzaXplczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bGluZVdpZHRoR3JhbnVsYXJpdHk8L25hbWU+PGNvbW1lbnQ+Z3JhbnVsYXJpdHkgb2Ygc3VwcG9ydGVkIGxpbmUgd2lkdGhzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zdHJpY3RMaW5lczwvbmFtZT48Y29tbWVudD5saW5lIHJhc3Rlcml6YXRpb24gZm9sbG93cyBwcmVmZXJyZWQgcnVsZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnN0YW5kYXJkU2FtcGxlTG9jYXRpb25zPC9uYW1lPjxjb21tZW50PnN1cHBvcnRzIHN0YW5kYXJkIHNhbXBsZSBsb2NhdGlvbnMgZm9yIGFsbCBzdXBwb3J0ZWQgc2FtcGxlIGNvdW50czwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+b3B0aW1hbEJ1ZmZlckNvcHlPZmZzZXRBbGlnbm1lbnQ8L25hbWU+PGNvbW1lbnQ+b3B0aW1hbCBvZmZzZXQgb2YgYnVmZmVyIGNvcGllczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgPG5hbWU+b3B0aW1hbEJ1ZmZlckNvcHlSb3dQaXRjaEFsaWdubWVudDwvbmFtZT48Y29tbWVudD5vcHRpbWFsIHBpdGNoIG9mIGJ1ZmZlciBjb3BpZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPm5vbkNvaGVyZW50QXRvbVNpemU8L25hbWU+PGNvbW1lbnQ+bWluaW11bSBzaXplIGFuZCBhbGlnbm1lbnQgZm9yIG5vbi1jb2hlcmVudCBob3N0LW1hcHBlZCBkZXZpY2UgbWVtb3J5IGFjY2VzczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NlbWFwaG9yZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1NlbWFwaG9yZUNyZWF0ZUZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48Y29tbWVudD5TZW1hcGhvcmUgY3JlYXRpb24gZmxhZ3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtRdWVyeVBvb2xDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUXVlcnlQb29sQ3JlYXRlRmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1F1ZXJ5VHlwZTwvdHlwZT4gICAgICAgICAgICA8bmFtZT5xdWVyeVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnF1ZXJ5Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIiBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3M8L3R5cGU+IDxuYW1lPnBpcGVsaW5lU3RhdGlzdGljczwvbmFtZT48Y29tbWVudD5PcHRpb25hbDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzPC90eXBlPiAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtSZW5kZXJQYXNzPC90eXBlPiAgICAgICAgICAgPG5hbWU+cmVuZGVyUGFzczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmF0dGFjaG1lbnRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIGxlbj0iYXR0YWNobWVudENvdW50Ij5jb25zdCA8dHlwZT5Wa0ltYWdlVmlldzwvdHlwZT4qICAgICA8bmFtZT5wQXR0YWNobWVudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPndpZHRoPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5oZWlnaHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmxheWVyczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RyYXdJbmRpcmVjdENvbW1hbmQiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnZlcnRleENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmluc3RhbmNlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Zmlyc3RWZXJ0ZXg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RJbnN0YW5jZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbmRleENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmluc3RhbmNlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Zmlyc3RJbmRleDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52ZXJ0ZXhPZmZzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RJbnN0YW5jZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kIj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT54PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnk8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ejwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1N1Ym1pdEluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgPG5hbWU+d2FpdFNlbWFwaG9yZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49IndhaXRTZW1hcGhvcmVDb3VudCI+Y29uc3QgPHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+KiAgICAgPG5hbWU+cFdhaXRTZW1hcGhvcmVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49IndhaXRTZW1hcGhvcmVDb3VudCI+Y29uc3QgPHR5cGU+VmtQaXBlbGluZVN0YWdlRmxhZ3M8L3R5cGU+KiAgICAgICAgICAgPG5hbWU+cFdhaXREc3RTdGFnZU1hc2s8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgPG5hbWU+Y29tbWFuZEJ1ZmZlckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImNvbW1hbmRCdWZmZXJDb3VudCI+Y29uc3QgPHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiogICAgIDxuYW1lPnBDb21tYW5kQnVmZmVyczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICA8bmFtZT5zaWduYWxTZW1hcGhvcmVDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJzaWduYWxTZW1hcGhvcmVDb3VudCI+Y29uc3QgPHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+KiAgICAgPG5hbWU+cFNpZ25hbFNlbWFwaG9yZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgICAgIDxjb21tZW50PldTSSBleHRlbnNpb25zPC9jb21tZW50PgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rpc3BsYXlLSFI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGlzcGxheTwvbmFtZT48Y29tbWVudD5IYW5kbGUgb2YgdGhlIGRpc3BsYXkgb2JqZWN0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49Im51bGwtdGVybWluYXRlZCI+Y29uc3QgPHR5cGU+Y2hhcjwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRpc3BsYXlOYW1lPC9uYW1lPjxjb21tZW50Pk5hbWUgb2YgdGhlIGRpc3BsYXk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZW50MkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5waHlzaWNhbERpbWVuc2lvbnM8L25hbWU+PGNvbW1lbnQ+SW4gbWlsbGltZXRlcnM/PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGh5c2ljYWxSZXNvbHV0aW9uPC9uYW1lPjxjb21tZW50Pk1heCByZXNvbHV0aW9uIGZvciBDUlQ/PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFI8L3R5cGU+ICAgICAgIDxuYW1lPnN1cHBvcnRlZFRyYW5zZm9ybXM8L25hbWU+PGNvbW1lbnQ+b25lIG9yIG1vcmUgYml0cyBmcm9tIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGxhbmVSZW9yZGVyUG9zc2libGU8L25hbWU+PGNvbW1lbnQ+VktfVFJVRSBpZiB0aGUgb3ZlcmxheSBwbGFuZSdzIHotb3JkZXIgY2FuIGJlIGNoYW5nZWQgb24gdGhpcyBkaXNwbGF5LjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBlcnNpc3RlbnRDb250ZW50PC9uYW1lPjxjb21tZW50PlZLX1RSVUUgaWYgdGhpcyBpcyBhICJzbWFydCIgZGlzcGxheSB0aGF0IHN1cHBvcnRzIHNlbGYtcmVmcmVzaC9pbnRlcm5hbCBidWZmZXJpbmcuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEaXNwbGF5S0hSPC90eXBlPiAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmN1cnJlbnREaXNwbGF5PC9uYW1lPjxjb21tZW50PkRpc3BsYXkgdGhlIHBsYW5lIGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGguICBXaWxsIGJlIFZLX05VTExfSEFORExFIGlmIHRoZSBwbGFuZSBpcyBub3QgaW4gdXNlLjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmN1cnJlbnRTdGFja0luZGV4PC9uYW1lPjxjb21tZW50PkN1cnJlbnQgei1vcmRlciBvZiB0aGUgcGxhbmUuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnZpc2libGVSZWdpb248L25hbWU+PGNvbW1lbnQ+VmlzaWJsZSBzY2Fub3V0IHJlZ2lvbi48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICA8bmFtZT5yZWZyZXNoUmF0ZTwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2YgdGltZXMgcGVyIHNlY29uZCB0aGUgZGlzcGxheSBpcyB1cGRhdGVkLjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEaXNwbGF5TW9kZUtIUjwvdHlwZT4gICAgICAgICAgICAgICAgIDxuYW1lPmRpc3BsYXlNb2RlPC9uYW1lPjxjb21tZW50PkhhbmRsZSBvZiB0aGlzIGRpc3BsYXkgbW9kZS48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSPC90eXBlPiAgICAgICA8bmFtZT5wYXJhbWV0ZXJzPC9uYW1lPjxjb21tZW50PlRoZSBwYXJhbWV0ZXJzIHRoaXMgbW9kZSB1c2VzLjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9NT0RFX0NSRUFURV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtEaXNwbGF5TW9kZUNyZWF0ZUZsYWdzS0hSPC90eXBlPiAgICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUjwvdHlwZT4gICAgICAgPG5hbWU+cGFyYW1ldGVyczwvbmFtZT48Y29tbWVudD5UaGUgcGFyYW1ldGVycyB0aGlzIG1vZGUgdXNlcy48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ3NLSFI8L3R5cGU+ICAgICAgPG5hbWU+c3VwcG9ydGVkQWxwaGE8L25hbWU+PGNvbW1lbnQ+VHlwZXMgb2YgYWxwaGEgYmxlbmRpbmcgc3VwcG9ydGVkLCBpZiBhbnkuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09mZnNldDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWluU3JjUG9zaXRpb248L25hbWU+PGNvbW1lbnQ+RG9lcyB0aGUgcGxhbmUgaGF2ZSBhbnkgcG9zaXRpb24gYW5kIGV4dGVudCByZXN0cmljdGlvbnM/PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09mZnNldDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4U3JjUG9zaXRpb248L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZW50MkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5taW5TcmNFeHRlbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZW50MkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhTcmNFeHRlbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2Zmc2V0MkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5taW5Ec3RQb3NpdGlvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPZmZzZXQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heERzdFBvc2l0aW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWluRHN0RXh0ZW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4RHN0RXh0ZW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGlzcGxheU1vZGVLSFI8L3R5cGU+ICAgICAgICAgICAgICAgICA8bmFtZT5kaXNwbGF5TW9kZTwvbmFtZT48Y29tbWVudD5UaGUgbW9kZSB0byB1c2Ugd2hlbiBkaXNwbGF5aW5nIHRoaXMgc3VyZmFjZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBsYW5lSW5kZXg8L25hbWU+PGNvbW1lbnQ+VGhlIHBsYW5lIG9uIHdoaWNoIHRoaXMgc3VyZmFjZSBhcHBlYXJzLiAgTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUigpIGluIHBQcm9wZXJ0eUNvdW50LjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBsYW5lU3RhY2tJbmRleDwvbmFtZT48Y29tbWVudD5UaGUgei1vcmRlciBvZiB0aGUgcGxhbmUuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjwvdHlwZT4gICAgPG5hbWU+dHJhbnNmb3JtPC9uYW1lPjxjb21tZW50PlRyYW5zZm9ybSB0byBhcHBseSB0byB0aGUgaW1hZ2VzIGFzIHBhcnQgb2YgdGhlIHNjYW5vdXQgb3BlcmF0aW9uPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Z2xvYmFsQWxwaGE8L25hbWU+PGNvbW1lbnQ+R2xvYmFsIGFscGhhIHZhbHVlLiAgTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEsIGluY2x1c2l2ZS4gIElnbm9yZWQgaWYgYWxwaGFNb2RlIGlzIG5vdCBWS19ESVNQTEFZX1BMQU5FX0FMUEhBX0dMT0JBTF9CSVRfS0hSPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFI8L3R5cGU+ICAgPG5hbWU+YWxwaGFNb2RlPC9uYW1lPjxjb21tZW50PldoYXQgdHlwZSBvZiBhbHBoYSBibGVuZGluZyB0byB1c2UuICBNdXN0IGJlIGEgYml0IGZyb20gdmtHZXREaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSOjpzdXBwb3J0ZWRBbHBoYS48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZW50MkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbWFnZUV4dGVudDwvbmFtZT48Y29tbWVudD5zaXplIG9mIHRoZSBpbWFnZXMgdG8gdXNlIHdpdGggdGhpcyBzdXJmYWNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGlzcGxheVByZXNlbnRJbmZvS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1ByZXNlbnRJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BSRVNFTlRfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtSZWN0MkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNyY1JlY3Q8L25hbWU+PGNvbW1lbnQ+UmVjdGFuZ2xlIHdpdGhpbiB0aGUgcHJlc2VudGFibGUgaW1hZ2UgdG8gcmVhZCBwaXhlbCBkYXRhIGZyb20gd2hlbiBwcmVzZW50aW5nIHRvIHRoZSBkaXNwbGF5LjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtSZWN0MkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRzdFJlY3Q8L25hbWU+PGNvbW1lbnQ+UmVjdGFuZ2xlIHdpdGhpbiB0aGUgY3VycmVudCBkaXNwbGF5IG1vZGUncyB2aXNpYmxlIHJlZ2lvbiB0byBkaXNwbGF5IHNyY1JlY3RhbmdsZSBpbi48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJzaXN0ZW50PC9uYW1lPjxjb21tZW50PkZvciBzbWFydCBkaXNwbGF5cywgdXNlIGJ1ZmZlcmVkIG1vZGUuICBJZiB0aGUgZGlzcGxheSBwcm9wZXJ0aWVzIG1lbWJlciAicGVyc2lzdGVudE1vZGUiIGlzIFZLX0ZBTFNFLCB0aGlzIG1lbWJlciBtdXN0IGFsd2F5cyBiZSBWS19GQUxTRS48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWluSW1hZ2VDb3VudDwvbmFtZT48Y29tbWVudD5TdXBwb3J0ZWQgbWluaW11bSBudW1iZXIgb2YgaW1hZ2VzIGZvciB0aGUgc3VyZmFjZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heEltYWdlQ291bnQ8L25hbWU+PGNvbW1lbnQ+U3VwcG9ydGVkIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyBmb3IgdGhlIHN1cmZhY2UsIDAgZm9yIHVubGltaXRlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmN1cnJlbnRFeHRlbnQ8L25hbWU+PGNvbW1lbnQ+Q3VycmVudCBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUgc3VyZmFjZSwgKDAsIDApIGlmIHVuZGVmaW5lZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1pbkltYWdlRXh0ZW50PC9uYW1lPjxjb21tZW50PlN1cHBvcnRlZCBtaW5pbXVtIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSBzdXJmYWNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4SW1hZ2VFeHRlbnQ8L25hbWU+PGNvbW1lbnQ+U3VwcG9ydGVkIG1heGltdW0gaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIHN1cmZhY2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhJbWFnZUFycmF5TGF5ZXJzPC9uYW1lPjxjb21tZW50PlN1cHBvcnRlZCBtYXhpbXVtIG51bWJlciBvZiBpbWFnZSBsYXllcnMgZm9yIHRoZSBzdXJmYWNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFI8L3R5cGU+ICAgICAgIDxuYW1lPnN1cHBvcnRlZFRyYW5zZm9ybXM8L25hbWU+PGNvbW1lbnQ+MSBvciBtb3JlIGJpdHMgcmVwcmVzZW50aW5nIHRoZSB0cmFuc2Zvcm1zIHN1cHBvcnRlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI8L3R5cGU+ICAgIDxuYW1lPmN1cnJlbnRUcmFuc2Zvcm08L25hbWU+PGNvbW1lbnQ+VGhlIHN1cmZhY2UncyBjdXJyZW50IHRyYW5zZm9ybSByZWxhdGl2ZSB0byB0aGUgZGV2aWNlJ3MgbmF0dXJhbCBvcmllbnRhdGlvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQ29tcG9zaXRlQWxwaGFGbGFnc0tIUjwvdHlwZT4gICAgICAgICA8bmFtZT5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYTwvbmFtZT48Y29tbWVudD4xIG9yIG1vcmUgYml0cyByZXByZXNlbnRpbmcgdGhlIGFscGhhIGNvbXBvc2l0aW5nIG1vZGVzIHN1cHBvcnRlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSW1hZ2VVc2FnZUZsYWdzPC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5zdXBwb3J0ZWRVc2FnZUZsYWdzPC9uYW1lPjxjb21tZW50PlN1cHBvcnRlZCBpbWFnZSB1c2FnZSBmbGFncyBmb3IgdGhlIHN1cmZhY2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUZsYWdzS0hSPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPnN0cnVjdCA8dHlwZT5BTmF0aXZlV2luZG93PC90eXBlPiogICAgPG5hbWU+d2luZG93PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9WSV9TVVJGQUNFX0NSRUFURV9JTkZPX05OIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1ZpU3VyZmFjZUNyZWF0ZUZsYWdzTk48L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+d2luZG93PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9XQVlMQU5EX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj5zdHJ1Y3QgPHR5cGU+d2xfZGlzcGxheTwvdHlwZT4qICAgICAgICAgICAgICAgPG5hbWU+ZGlzcGxheTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPnN0cnVjdCA8dHlwZT53bF9zdXJmYWNlPC90eXBlPiogICAgICAgICAgICAgICA8bmFtZT5zdXJmYWNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrV2luMzJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPkhJTlNUQU5DRTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5oaW5zdGFuY2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPkhXTkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5od25kPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9YTElCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1hsaWJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5EaXNwbGF5PC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZHB5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5XaW5kb3c8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+d2luZG93PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1hDQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtYY2JTdXJmYWNlQ3JlYXRlRmxhZ3NLSFI8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT54Y2JfY29ubmVjdGlvbl90PC90eXBlPiogICAgICAgICAgICAgICAgPG5hbWU+Y29ubmVjdGlvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+eGNiX3dpbmRvd190PC90eXBlPiAgICAgICAgICAgICAgICAgICAgIDxuYW1lPndpbmRvdzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQSI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlRmxhZ3NGVUNIU0lBPC90eXBlPiAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT56eF9oYW5kbGVfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aW1hZ2VQaXBlSGFuZGxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TVFJFQU1fREVTQ1JJUFRPUl9TVVJGQUNFX0NSRUFURV9JTkZPX0dHUCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUZsYWdzR0dQPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+R2dwU3RyZWFtRGVzY3JpcHRvcjwvdHlwZT4gICAgICAgICAgICAgIDxuYW1lPnN0cmVhbURlc2NyaXB0b3I8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdXJmYWNlRm9ybWF0S0hSIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Zvcm1hdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Zm9ybWF0PC9uYW1lPjxjb21tZW50PlN1cHBvcnRlZCBwYWlyIG9mIHJlbmRlcmluZyBmb3JtYXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29sb3JTcGFjZUtIUjwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5jb2xvclNwYWNlPC9uYW1lPjxjb21tZW50PmFuZCBjb2xvciBzcGFjZSBmb3IgdGhlIHN1cmZhY2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1N3YXBjaGFpbkNyZWF0ZUZsYWdzS0hSPC90eXBlPiAgICAgICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU3VyZmFjZUtIUjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICA8bmFtZT5zdXJmYWNlPC9uYW1lPjxjb21tZW50PlRoZSBzd2FwY2hhaW4ncyB0YXJnZXQgc3VyZmFjZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1pbkltYWdlQ291bnQ8L25hbWU+PGNvbW1lbnQ+TWluaW11bSBudW1iZXIgb2YgcHJlc2VudGF0aW9uIGltYWdlcyB0aGUgYXBwbGljYXRpb24gbmVlZHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbWFnZUZvcm1hdDwvbmFtZT48Y29tbWVudD5Gb3JtYXQgb2YgdGhlIHByZXNlbnRhdGlvbiBpbWFnZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29sb3JTcGFjZUtIUjwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5pbWFnZUNvbG9yU3BhY2U8L25hbWU+PGNvbW1lbnQ+Q29sb3JzcGFjZSBvZiB0aGUgcHJlc2VudGF0aW9uIGltYWdlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmltYWdlRXh0ZW50PC9uYW1lPjxjb21tZW50PkRpbWVuc2lvbnMgb2YgdGhlIHByZXNlbnRhdGlvbiBpbWFnZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbWFnZUFycmF5TGF5ZXJzPC9uYW1lPjxjb21tZW50PkRldGVybWluZXMgdGhlIG51bWJlciBvZiB2aWV3cyBmb3IgbXVsdGl2aWV3L3N0ZXJlbyBwcmVzZW50YXRpb248L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VVc2FnZUZsYWdzPC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5pbWFnZVVzYWdlPC9uYW1lPjxjb21tZW50PkJpdHMgaW5kaWNhdGluZyBob3cgdGhlIHByZXNlbnRhdGlvbiBpbWFnZXMgd2lsbCBiZSB1c2VkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NoYXJpbmdNb2RlPC90eXBlPiAgICAgICAgICAgICAgICAgICAgPG5hbWU+aW1hZ2VTaGFyaW5nTW9kZTwvbmFtZT48Y29tbWVudD5TaGFyaW5nIG1vZGUgdXNlZCBmb3IgdGhlIHByZXNlbnRhdGlvbiBpbWFnZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICA8bmFtZT5xdWV1ZUZhbWlseUluZGV4Q291bnQ8L25hbWU+PGNvbW1lbnQ+TnVtYmVyIG9mIHF1ZXVlIGZhbWlsaWVzIGhhdmluZyBhY2Nlc3MgdG8gdGhlIGltYWdlcyBpbiBjYXNlIG9mIGNvbmN1cnJlbnQgc2hhcmluZyBtb2RlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSIgbGVuPSJxdWV1ZUZhbWlseUluZGV4Q291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogICAgICAgICAgICAgICAgICA8bmFtZT5wUXVldWVGYW1pbHlJbmRpY2VzPC9uYW1lPjxjb21tZW50PkFycmF5IG9mIHF1ZXVlIGZhbWlseSBpbmRpY2VzIGhhdmluZyBhY2Nlc3MgdG8gdGhlIGltYWdlcyBpbiBjYXNlIG9mIGNvbmN1cnJlbnQgc2hhcmluZyBtb2RlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjwvdHlwZT4gICAgPG5hbWU+cHJlVHJhbnNmb3JtPC9uYW1lPjxjb21tZW50PlRoZSB0cmFuc2Zvcm0sIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UncyBuYXR1cmFsIG9yaWVudGF0aW9uLCBhcHBsaWVkIHRvIHRoZSBpbWFnZSBjb250ZW50IHByaW9yIHRvIHByZXNlbnRhdGlvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSPC90eXBlPiAgICAgIDxuYW1lPmNvbXBvc2l0ZUFscGhhPC9uYW1lPjxjb21tZW50PlRoZSBhbHBoYSBibGVuZGluZyBtb2RlIHVzZWQgd2hlbiBjb21wb3NpdGluZyB0aGlzIHN1cmZhY2Ugd2l0aCBvdGhlciBzdXJmYWNlcyBpbiB0aGUgd2luZG93IHN5c3RlbTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQcmVzZW50TW9kZUtIUjwvdHlwZT4gICAgICAgICAgICAgICAgIDxuYW1lPnByZXNlbnRNb2RlPC9uYW1lPjxjb21tZW50PldoaWNoIHByZXNlbnRhdGlvbiBtb2RlIHRvIHVzZSBmb3IgcHJlc2VudHMgb24gdGhpcyBzd2FwIGNoYWluPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y2xpcHBlZDwvbmFtZT48Y29tbWVudD5TcGVjaWZpZXMgd2hldGhlciBwcmVzZW50YWJsZSBpbWFnZXMgbWF5IGJlIGFmZmVjdGVkIGJ5IHdpbmRvdyBjbGlwIHJlZ2lvbnM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1N3YXBjaGFpbktIUjwvdHlwZT4gICA8bmFtZT5vbGRTd2FwY2hhaW48L25hbWU+PGNvbW1lbnQ+RXhpc3Rpbmcgc3dhcCBjaGFpbiB0byByZXBsYWNlLCBpZiBhbnk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQcmVzZW50SW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgIDxuYW1lPndhaXRTZW1hcGhvcmVDb3VudDwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2Ygc2VtYXBob3JlcyB0byB3YWl0IGZvciBiZWZvcmUgcHJlc2VudGluZzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJ3YWl0U2VtYXBob3JlQ291bnQiPmNvbnN0IDx0eXBlPlZrU2VtYXBob3JlPC90eXBlPiogPG5hbWU+cFdhaXRTZW1hcGhvcmVzPC9uYW1lPjxjb21tZW50PlNlbWFwaG9yZXMgdG8gd2FpdCBmb3IgYmVmb3JlIHByZXNlbnRpbmc8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zd2FwY2hhaW5Db3VudDwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2Ygc3dhcGNoYWlucyB0byBwcmVzZW50IGluIHRoaXMgY2FsbDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJzd2FwY2hhaW5Db3VudCI+Y29uc3QgPHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+KiA8bmFtZT5wU3dhcGNoYWluczwvbmFtZT48Y29tbWVudD5Td2FwY2hhaW5zIHRvIHByZXNlbnQgYW4gaW1hZ2UgZnJvbTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJzd2FwY2hhaW5Db3VudCI+Y29uc3QgPHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wSW1hZ2VJbmRpY2VzPC9uYW1lPjxjb21tZW50PkluZGljZXMgb2Ygd2hpY2ggcHJlc2VudGFibGUgaW1hZ2VzIHRvIHByZXNlbnQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIiBsZW49InN3YXBjaGFpbkNvdW50Ij48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4qIDxuYW1lPnBSZXN1bHRzPC9uYW1lPjxjb21tZW50Pk9wdGlvbmFsIChpLmUuIGlmIG5vbi1OVUxMKSBWa1Jlc3VsdCBmb3IgZWFjaCBzd2FwY2hhaW48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtJbnN0YW5jZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRGVidWdSZXBvcnRGbGFnc0VYVDwvdHlwZT4gICAgICAgICAgICA8bmFtZT5mbGFnczwvbmFtZT48Y29tbWVudD5JbmRpY2F0ZXMgd2hpY2ggZXZlbnRzIGNhbGwgdGhpcyBjYWxsYmFjazwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+UEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVDwvdHlwZT4gICAgIDxuYW1lPnBmbkNhbGxiYWNrPC9uYW1lPjxjb21tZW50PkZ1bmN0aW9uIHBvaW50ZXIgb2YgYSBjYWxsYmFjayBmdW5jdGlvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBVc2VyRGF0YTwvbmFtZT48Y29tbWVudD5Vc2VyIGRhdGEgcHJvdmlkZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb248L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtWYWxpZGF0aW9uRmxhZ3NFWFQiIHN0cnVjdGV4dGVuZHM9IlZrSW5zdGFuY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZMQUdTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPnNUeXBlPC9uYW1lPjxjb21tZW50Pk11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GTEFHU19FWFQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQ8L25hbWU+PGNvbW1lbnQ+TnVtYmVyIG9mIHZhbGlkYXRpb24gY2hlY2tzIHRvIGRpc2FibGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudCI+Y29uc3QgPHR5cGU+VmtWYWxpZGF0aW9uQ2hlY2tFWFQ8L3R5cGU+KiA8bmFtZT5wRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzPC9uYW1lPjxjb21tZW50PlZhbGlkYXRpb24gY2hlY2tzIHRvIGRpc2FibGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrSW5zdGFuY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiAgPG5hbWU+c1R5cGU8L25hbWU+PGNvbW1lbnQ+TXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50PC9uYW1lPjxjb21tZW50Pk51bWJlciBvZiB2YWxpZGF0aW9uIGZlYXR1cmVzIHRvIGVuYWJsZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJlbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCI+Y29uc3QgPHR5cGU+VmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVDwvdHlwZT4qIDxuYW1lPnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzPC9uYW1lPjxjb21tZW50PlZhbGlkYXRpb24gZmVhdHVyZXMgdG8gZW5hYmxlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudDwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2YgdmFsaWRhdGlvbiBmZWF0dXJlcyB0byBkaXNhYmxlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCI+Y29uc3QgPHR5cGU+VmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQ8L3R5cGU+KiA8bmFtZT5wRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXM8L25hbWU+PGNvbW1lbnQ+VmFsaWRhdGlvbiBmZWF0dXJlcyB0byBkaXNhYmxlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQiIHN0cnVjdGV4dGVuZHM9IlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1JBU1RFUklaQVRJT05fT1JERVJfQU1EIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUmFzdGVyaXphdGlvbk9yZGVyQU1EPC90eXBlPiAgICAgICAgICA8bmFtZT5yYXN0ZXJpemF0aW9uT3JkZXI8L25hbWU+PGNvbW1lbnQ+UmFzdGVyaXphdGlvbiBvcmRlciB0byB1c2UgZm9yIHRoZSBwaXBlbGluZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfTkFNRV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDwvdHlwZT4gICAgICAgPG5hbWU+b2JqZWN0VHlwZTwvbmFtZT48Y29tbWVudD5UaGUgdHlwZSBvZiB0aGUgb2JqZWN0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b2JqZWN0PC9uYW1lPjxjb21tZW50PlRoZSBoYW5kbGUgb2YgdGhlIG9iamVjdCwgY2FzdCB0byB1aW50NjRfdDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiA8bmFtZT5wT2JqZWN0TmFtZTwvbmFtZT48Y29tbWVudD5OYW1lIHRvIGFwcGx5IHRvIHRoZSBvYmplY3Q8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfVEFHX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUPC90eXBlPiAgICAgICA8bmFtZT5vYmplY3RUeXBlPC9uYW1lPjxjb21tZW50PlRoZSB0eXBlIG9mIHRoZSBvYmplY3Q8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vYmplY3Q8L25hbWU+PGNvbW1lbnQ+VGhlIGhhbmRsZSBvZiB0aGUgb2JqZWN0LCBjYXN0IHRvIHVpbnQ2NF90PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dGFnTmFtZTwvbmFtZT48Y29tbWVudD5UaGUgbmFtZSBvZiB0aGUgdGFnIHRvIHNldCBvbiB0aGUgb2JqZWN0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5zaXplX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dGFnU2l6ZTwvbmFtZT48Y29tbWVudD5UaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSB0YWcgZGF0YTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJ0YWdTaXplIj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgIDxuYW1lPnBUYWc8L25hbWU+PGNvbW1lbnQ+VGFnIGRhdGEgdG8gYXR0YWNoIHRvIHRoZSBvYmplY3Q8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9NQVJLRVJfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiA8bmFtZT5wTWFya2VyTmFtZTwvbmFtZT48Y29tbWVudD5OYW1lIG9mIHRoZSBkZWJ1ZyBtYXJrZXI8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICA8bmFtZT5jb2xvcjwvbmFtZT5bNF08Y29tbWVudD5PcHRpb25hbCBjb2xvciBmb3IgZGVidWcgbWFya2VyPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQ1JFQVRFX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlZGljYXRlZEFsbG9jYXRpb248L25hbWU+PGNvbW1lbnQ+V2hldGhlciB0aGlzIGltYWdlIHVzZXMgYSBkZWRpY2F0ZWQgYWxsb2NhdGlvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYiIHN0cnVjdGV4dGVuZHM9IlZrQnVmZmVyQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fQlVGRkVSX0NSRUFURV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZWRpY2F0ZWRBbGxvY2F0aW9uPC9uYW1lPjxjb21tZW50PldoZXRoZXIgdGhpcyBidWZmZXIgdXNlcyBhIGRlZGljYXRlZCBhbGxvY2F0aW9uPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIiBzdHJ1Y3RleHRlbmRzPSJWa01lbW9yeUFsbG9jYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSW1hZ2U8L3R5cGU+ICAgICAgICAgIDxuYW1lPmltYWdlPC9uYW1lPjxjb21tZW50PkltYWdlIHRoYXQgdGhpcyBhbGxvY2F0aW9uIHdpbGwgYmUgYm91bmQgdG88L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICAgICAgICA8bmFtZT5idWZmZXI8L25hbWU+PGNvbW1lbnQ+QnVmZmVyIHRoYXQgdGhpcyBhbGxvY2F0aW9uIHdpbGwgYmUgYm91bmQgdG88L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlRm9ybWF0UHJvcGVydGllczwvdHlwZT4gICAgICAgICAgPG5hbWU+aW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnc05WPC90eXBlPiAgIDxuYW1lPmV4dGVybmFsTWVtb3J5RmVhdHVyZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlY8L3R5cGU+IDxuYW1lPmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WPC90eXBlPiA8bmFtZT5jb21wYXRpYmxlSGFuZGxlVHlwZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlY8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYiIHN0cnVjdGV4dGVuZHM9IlZrTWVtb3J5QWxsb2NhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOVjwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOVjwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPkhBTkRMRTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5oYW5kbGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlNFQ1VSSVRZX0FUVFJJQlVURVM8L3R5cGU+KiAgICAgICA8bmFtZT5wQXR0cmlidXRlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPkRXT1JEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kd0FjY2VzczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIiBzdHJ1Y3RleHRlbmRzPSJWa1N1Ym1pdEluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YWNxdWlyZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImFjcXVpcmVDb3VudCI+Y29uc3QgPHR5cGU+VmtEZXZpY2VNZW1vcnk8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBBY3F1aXJlU3luY3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iYWNxdWlyZUNvdW50Ij5jb25zdCA8dHlwZT51aW50NjRfdDwvdHlwZT4qICAgICAgICAgICAgICAgICAgPG5hbWU+cEFjcXVpcmVLZXlzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImFjcXVpcmVDb3VudCI+Y29uc3QgPHR5cGU+dWludDMyX3Q8L3R5cGU+KiAgICAgICAgICAgICAgICAgIDxuYW1lPnBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5yZWxlYXNlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0icmVsZWFzZUNvdW50Ij5jb25zdCA8dHlwZT5Wa0RldmljZU1lbW9yeTwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cFJlbGVhc2VTeW5jczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJyZWxlYXNlQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQ2NF90PC90eXBlPiogICAgICAgICAgICAgICAgICA8bmFtZT5wUmVsZWFzZUtleXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0ZFQVRVUkVTX05WWCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heE9iamVjdEVudHJ5Q291bnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1pblNlcXVlbmNlSW5kZXhCdWZmZXJPZmZzZXRBbGlnbm1lbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5taW5Db21tYW5kc1Rva2VuQnVmZmVyT2Zmc2V0QWxpZ25tZW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYPC90eXBlPiAgICAgIDxuYW1lPnRva2VuVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCdWZmZXI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmJ1ZmZlcjwvbmFtZT48Y29tbWVudD5idWZmZXIgY29udGFpbmluZyB0YWJsZUVudHJpZXMgYW5kIGFkZGl0aW9uYWwgZGF0YSBmb3IgaW5kaXJlY3RDb21tYW5kczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9mZnNldDwvbmFtZT48Y29tbWVudD5vZmZzZXQgZnJvbSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBidWZmZXI8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlg8L3R5cGU+ICAgICAgPG5hbWU+dG9rZW5UeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YmluZGluZ1VuaXQ8L25hbWU+PGNvbW1lbnQ+QmluZGluZyB1bml0IGZvciB2ZXJ0ZXggYXR0cmlidXRlIC8gZGVzY3JpcHRvciBzZXQsIG9mZnNldCBmb3IgcHVzaGNvbnN0YW50czwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmR5bmFtaWNDb3VudDwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2YgdmFyaWFibGUgZHluYW1pYyB2YWx1ZXMgZm9yIGRlc2NyaXB0b3Igc2V0IC8gcHVzaCBjb25zdGFudHM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kaXZpc29yPC9uYW1lPjxjb21tZW50PlJhdGUgdGhlIHdoaWNoIHRoZSBhcnJheSBpcyBhZHZhbmNlZCBwZXIgZWxlbWVudCAobXVzdCBiZSBwb3dlciBvZiAyLCBtaW5pbXVtIDEpPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlgiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaXBlbGluZUJpbmRQb2ludDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGlwZWxpbmVCaW5kUG9pbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlg8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT50b2tlbkNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InRva2VuQ291bnQiPmNvbnN0IDx0eXBlPlZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYPC90eXBlPiogIDxuYW1lPnBUb2tlbnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9DTURfUFJPQ0VTU19DT01NQU5EU19JTkZPX05WWCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa09iamVjdFRhYmxlTlZYPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b2JqZWN0VGFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbmRpcmVjdENvbW1hbmRzTGF5b3V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQiPmNvbnN0IDx0eXBlPlZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYPC90eXBlPiogICAgICAgPG5hbWU+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhTZXF1ZW5jZXNDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnRhcmdldENvbW1hbmRCdWZmZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zZXF1ZW5jZXNDb3VudEJ1ZmZlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNlcXVlbmNlc0NvdW50T2Zmc2V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtCdWZmZXI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2VxdWVuY2VzSW5kZXhCdWZmZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zZXF1ZW5jZXNJbmRleE9mZnNldDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQ01EX1JFU0VSVkVfU1BBQ0VfRk9SX0NPTU1BTkRTX0lORk9fTlZYIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrT2JqZWN0VGFibGVOVlg8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vYmplY3RUYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhTZXF1ZW5jZXNDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfT0JKRUNUX1RBQkxFX0NSRUFURV9JTkZPX05WWCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vYmplY3RDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJvYmplY3RDb3VudCI+Y29uc3QgPHR5cGU+VmtPYmplY3RFbnRyeVR5cGVOVlg8L3R5cGU+KiAgICAgICA8bmFtZT5wT2JqZWN0RW50cnlUeXBlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJvYmplY3RDb3VudCI+Y29uc3QgPHR5cGU+dWludDMyX3Q8L3R5cGU+KiAgICAgICAgICAgICAgICAgICA8bmFtZT5wT2JqZWN0RW50cnlDb3VudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ib2JqZWN0Q291bnQiPmNvbnN0IDx0eXBlPlZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYPC90eXBlPiogPG5hbWU+cE9iamVjdEVudHJ5VXNhZ2VGbGFnczwvbmFtZT48L21lbWJlcj4KKworICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3I8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5tYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm1heFBpcGVsaW5lTGF5b3V0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa09iamVjdFRhYmxlRW50cnlOVlgiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09iamVjdEVudHJ5VHlwZU5WWDwvdHlwZT4gICAgICAgICA8bmFtZT50eXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWDwvdHlwZT4gICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWCI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2JqZWN0RW50cnlUeXBlTlZYPC90eXBlPiAgICAgICAgIDxuYW1lPnR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYPC90eXBlPiAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BpcGVsaW5lPC90eXBlPiAgICAgICAgICAgICAgICAgICA8bmFtZT5waXBlbGluZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa09iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPYmplY3RFbnRyeVR5cGVOVlg8L3R5cGU+ICAgICAgICAgPG5hbWU+dHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlg8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVMYXlvdXQ8L3R5cGU+ICAgICAgICAgICAgIDxuYW1lPnBpcGVsaW5lTGF5b3V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rlc2NyaXB0b3JTZXQ8L3R5cGU+ICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yU2V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWCI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2JqZWN0RW50cnlUeXBlTlZYPC90eXBlPiAgICAgICAgIDxuYW1lPnR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYPC90eXBlPiAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWZmZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09iamVjdEVudHJ5VHlwZU5WWDwvdHlwZT4gICAgICAgICA8bmFtZT50eXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWDwvdHlwZT4gICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCdWZmZXI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVmZmVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0luZGV4VHlwZTwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5pbmRleFR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPYmplY3RFbnRyeVR5cGVOVlg8L3R5cGU+ICAgICAgICAgPG5hbWU+dHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlg8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVMYXlvdXQ8L3R5cGU+ICAgICAgICAgICAgIDxuYW1lPnBpcGVsaW5lTGF5b3V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NoYWRlclN0YWdlRmxhZ3M8L3R5cGU+ICAgICAgICAgICA8bmFtZT5zdGFnZUZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiIHN0cnVjdGV4dGVuZHM9IlZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaHlzaWNhbERldmljZUZlYXR1cmVzPC90eXBlPiAgICAgICAgIDxuYW1lPmZlYXR1cmVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzPC90eXBlPiAgICAgICA8bmFtZT5wcm9wZXJ0aWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiIgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtGb3JtYXRQcm9wZXJ0aWVzMiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0UHJvcGVydGllczwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5mb3JtYXRQcm9wZXJ0aWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRm9ybWF0UHJvcGVydGllczJLSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0Zvcm1hdFByb3BlcnRpZXMyIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC90eXBlPiAgICAgICAgICA8bmFtZT5pbWFnZUZvcm1hdFByb3BlcnRpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtGb3JtYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmZvcm1hdDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZVR5cGU8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VUaWxpbmc8L3R5cGU+ICAgICAgICAgICAgICAgICAgICA8bmFtZT50aWxpbmc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VVc2FnZUZsYWdzPC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT51c2FnZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSW1hZ2VDcmVhdGVGbGFnczwvdHlwZT4gPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzJLSFIiICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzPC90eXBlPiAgICAgICAgICA8bmFtZT5xdWV1ZUZhbWlseVByb3BlcnRpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM8L3R5cGU+IDxuYW1lPm1lbW9yeVByb3BlcnRpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIiAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM8L3R5cGU+ICAgIDxuYW1lPnByb3BlcnRpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NQQVJTRV9JTUFHRV9GT1JNQVRfSU5GT18yIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5mb3JtYXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VUeXBlPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT50eXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZUNvdW50RmxhZ0JpdHM8L3R5cGU+ICAgICAgICAgICAgPG5hbWU+c2FtcGxlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZVVzYWdlRmxhZ3M8L3R5cGU+ICAgICAgICAgICAgICAgIDxuYW1lPnVzYWdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlVGlsaW5nPC90eXBlPiAgICAgICAgICAgICAgICAgICAgPG5hbWU+dGlsaW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yS0hSIiAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BVU0hfREVTQ1JJUFRPUl9QUk9QRVJUSUVTX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4UHVzaERlc2NyaXB0b3JzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQ29uZm9ybWFuY2VWZXJzaW9uS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDhfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1ham9yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50OF90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWlub3I8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ4X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zdWJtaW5vcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDhfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBhdGNoPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RyaXZlcklkS0hSPC90eXBlPiAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZHJpdmVySUQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmNoYXI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kcml2ZXJOYW1lPC9uYW1lPls8ZW51bT5WS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFI8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZHJpdmVySW5mbzwvbmFtZT5bPGVudW0+VktfTUFYX0RSSVZFUl9JTkZPX1NJWkVfS0hSPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDb25mb3JtYW5jZVZlcnNpb25LSFI8L3R5cGU+ICAgICAgICAgIDxuYW1lPmNvbmZvcm1hbmNlVmVyc2lvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1ByZXNlbnRSZWdpb25zS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1ByZXNlbnRJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1JFR0lPTlNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zd2FwY2hhaW5Db3VudDwvbmFtZT48Y29tbWVudD5Db3B5IG9mIFZrUHJlc2VudEluZm9LSFI6OnN3YXBjaGFpbkNvdW50PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InN3YXBjaGFpbkNvdW50IiBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtQcmVzZW50UmVnaW9uS0hSPC90eXBlPiogICA8bmFtZT5wUmVnaW9uczwvbmFtZT48Y29tbWVudD5UaGUgcmVnaW9ucyB0aGF0IGhhdmUgY2hhbmdlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1ByZXNlbnRSZWdpb25LSFIiPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgPG5hbWU+cmVjdGFuZ2xlQ291bnQ8L25hbWU+PGNvbW1lbnQ+TnVtYmVyIG9mIHJlY3RhbmdsZXMgaW4gcFJlY3RhbmdsZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIiBsZW49InJlY3RhbmdsZUNvdW50Ij5jb25zdCA8dHlwZT5Wa1JlY3RMYXllcktIUjwvdHlwZT4qICAgPG5hbWU+cFJlY3RhbmdsZXM8L25hbWU+PGNvbW1lbnQ+QXJyYXkgb2YgcmVjdGFuZ2xlcyB0aGF0IGhhdmUgY2hhbmdlZCBpbiBhIHN3YXBjaGFpbidzIGltYWdlKHMpPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUmVjdExheWVyS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPZmZzZXQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9mZnNldDwvbmFtZT48Y29tbWVudD51cHBlci1sZWZ0IGNvcm5lciBvZiBhIHJlY3RhbmdsZSB0aGF0IGhhcyBub3QgY2hhbmdlZCwgaW4gcGl4ZWxzIG9mIGEgcHJlc2VudGF0aW9uIGltYWdlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrRXh0ZW50MkQ8L3R5cGU+IDxuYW1lPmV4dGVudDwvbmFtZT48Y29tbWVudD5EaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlIHRoYXQgaGFzIG5vdCBjaGFuZ2VkLCBpbiBwaXhlbHMgb2YgYSBwcmVzZW50YXRpb24gaW1hZ2VzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bGF5ZXI8L25hbWU+PGNvbW1lbnQ+TGF5ZXIgb2YgYSBzd2FwY2hhaW4ncyBpbWFnZShzKSwgZm9yIHN0ZXJlb3Njb3BpYy0zRCBpbWFnZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFUyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52YXJpYWJsZVBvaW50ZXJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXNLSFIiICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJGZWF0dXJlc0tIUiIgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJGZWF0dXJlcyIgICAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzPC90eXBlPiAgPG5hbWU+ZXh0ZXJuYWxNZW1vcnlGZWF0dXJlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3M8L3R5cGU+IDxuYW1lPmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzPC90eXBlPiA8bmFtZT5jb21wYXRpYmxlSGFuZGxlVHlwZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXNLSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyIgIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfSU1BR0VfRk9STUFUX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvS0hSIiAgICAgICAgICAgICAgYWxpYXM9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfSU1BR0VfRk9STUFUX1BST1BFUlRJRVMiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXM8L3R5cGU+IDxuYW1lPmV4dGVybmFsTWVtb3J5UHJvcGVydGllczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzS0hSIiAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQnVmZmVyQ3JlYXRlRmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0J1ZmZlclVzYWdlRmxhZ3M8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dXNhZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mb0tIUiIgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVMiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXM8L3R5cGU+ICAgIDxuYW1lPmV4dGVybmFsTWVtb3J5UHJvcGVydGllczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JRF9QUk9QRVJUSUVTIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ4X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZXZpY2VVVUlEPC9uYW1lPls8ZW51bT5WS19VVUlEX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50OF90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZHJpdmVyVVVJRDwvbmFtZT5bPGVudW0+VktfVVVJRF9TSVpFPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDhfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRldmljZUxVSUQ8L25hbWU+WzxlbnVtPlZLX0xVSURfU0laRTwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZXZpY2VOb2RlTWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRldmljZUxVSURWYWxpZDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3M8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9LSFIiICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvIiBzdHJ1Y3RleHRlbmRzPSJWa0J1ZmZlckNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3M8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvS0hSIiAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyIgc3RydWN0ZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnczwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9LSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa01lbW9yeUFsbG9jYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5IQU5ETEU8L3R5cGU+ICAgICAgICAgICA8bmFtZT5oYW5kbGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5MUENXU1RSPC90eXBlPiAgICAgICAgICA8bmFtZT5uYW1lPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa01lbW9yeUFsbG9jYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlNFQ1VSSVRZX0FUVFJJQlVURVM8L3R5cGU+KiA8bmFtZT5wQXR0cmlidXRlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+RFdPUkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmR3QWNjZXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5MUENXU1RSPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfV0lOMzJfSEFORExFX1BST1BFUlRJRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tZW1vcnlUeXBlQml0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VNZW1vcnk8L3R5cGU+ICAgICAgICAgICAgICAgICAgIDxuYW1lPm1lbW9yeTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmludDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5mZDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeUZkUHJvcGVydGllc0tIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfRkRfUFJPUEVSVElFU19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1lbW9yeVR5cGVCaXRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWVtb3J5R2V0RmRJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0ZEX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlTWVtb3J5PC90eXBlPiAgICAgICAgICAgICAgICAgICA8bmFtZT5tZW1vcnk8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIiIHN0cnVjdGV4dGVuZHM9IlZrU3VibWl0SW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICA8bmFtZT5hY3F1aXJlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iYWNxdWlyZUNvdW50Ij5jb25zdCA8dHlwZT5Wa0RldmljZU1lbW9yeTwvdHlwZT4qIDxuYW1lPnBBY3F1aXJlU3luY3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iYWNxdWlyZUNvdW50Ij5jb25zdCA8dHlwZT51aW50NjRfdDwvdHlwZT4qIDxuYW1lPnBBY3F1aXJlS2V5czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJhY3F1aXJlQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cEFjcXVpcmVUaW1lb3V0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgIDxuYW1lPnJlbGVhc2VDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJyZWxlYXNlQ291bnQiPmNvbnN0IDx0eXBlPlZrRGV2aWNlTWVtb3J5PC90eXBlPiogPG5hbWU+cFJlbGVhc2VTeW5jczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJyZWxlYXNlQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQ2NF90PC90eXBlPiogPG5hbWU+cFJlbGVhc2VLZXlzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9TRU1BUEhPUkVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzPC90eXBlPiA8bmFtZT5oYW5kbGVUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm9LSFIiICAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3M8L3R5cGU+IDxuYW1lPmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzPC90eXBlPiA8bmFtZT5jb21wYXRpYmxlSGFuZGxlVHlwZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzPC90eXBlPiA8bmFtZT5leHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8iIHN0cnVjdGV4dGVuZHM9IlZrU2VtYXBob3JlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnczwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+ICAgIDxuYW1lPnNlbWFwaG9yZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU2VtYXBob3JlSW1wb3J0RmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPkhBTkRMRTwvdHlwZT4gICAgICAgICAgIDxuYW1lPmhhbmRsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPkxQQ1dTVFI8L3R5cGU+ICAgICAgICAgIDxuYW1lPm5hbWU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIiIHN0cnVjdGV4dGVuZHM9IlZrU2VtYXBob3JlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlNFQ1VSSVRZX0FUVFJJQlVURVM8L3R5cGU+KiAgICAgICA8bmFtZT5wQXR0cmlidXRlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+RFdPUkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmR3QWNjZXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5MUENXU1RSPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1N1Ym1pdEluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0QzRDEyX0ZFTkNFX1NVQk1JVF9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgPG5hbWU+d2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbGVuPSJ3YWl0U2VtYXBob3JlVmFsdWVzQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQ2NF90PC90eXBlPiogPG5hbWU+cFdhaXRTZW1hcGhvcmVWYWx1ZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICA8bmFtZT5zaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiIGxlbj0ic2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQ2NF90PC90eXBlPiogPG5hbWU+cFNpZ25hbFNlbWFwaG9yZVZhbHVlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNlbWFwaG9yZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0czwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1NlbWFwaG9yZTwvdHlwZT4gICAgPG5hbWU+c2VtYXBob3JlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTZW1hcGhvcmVJbXBvcnRGbGFnczwvdHlwZT4gPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmludDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5mZDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9GRF9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NlbWFwaG9yZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2VtYXBob3JlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzPC90eXBlPiA8bmFtZT5oYW5kbGVUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzPC90eXBlPiA8bmFtZT5oYW5kbGVUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mb0tIUiIgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnczwvdHlwZT4gPG5hbWU+ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnczwvdHlwZT4gPG5hbWU+Y29tcGF0aWJsZUhhbmRsZVR5cGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzPC90eXBlPiA8bmFtZT5leHRlcm5hbEZlbmNlRmVhdHVyZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8iIHN0cnVjdGV4dGVuZHM9IlZrRmVuY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnczwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm9LSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtGZW5jZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmZlbmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtGZW5jZUltcG9ydEZsYWdzPC90eXBlPiAgICAgICAgICAgICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+ICA8bmFtZT5oYW5kbGVUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+SEFORExFPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aGFuZGxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+TFBDV1NUUjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa0ZlbmNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX0ZFTkNFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlNFQ1VSSVRZX0FUVFJJQlVURVM8L3R5cGU+KiA8bmFtZT5wQXR0cmlidXRlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+RFdPUkQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kd0FjY2VzczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+TFBDV1NUUjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5uYW1lPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtGZW5jZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmZlbmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+ICAgPG5hbWU+aGFuZGxlVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltcG9ydEZlbmNlRmRJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfRkRfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtGZW5jZTwvdHlwZT4gICAgICAgICAgICAgIDxuYW1lPmZlbmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtGZW5jZUltcG9ydEZsYWdzPC90eXBlPiAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0czwvdHlwZT4gICA8bmFtZT5oYW5kbGVUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5pbnQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZmQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtGZW5jZUdldEZkSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfR0VUX0ZEX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRmVuY2U8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5mZW5jZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzPC90eXBlPiAgIDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFUyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm11bHRpdmlldzwvbmFtZT48Y29tbWVudD5NdWx0aXBsZSB2aWV3cyBpbiBhIHJlbmRlcnBhc3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tdWx0aXZpZXdHZW9tZXRyeVNoYWRlcjwvbmFtZT48Y29tbWVudD5NdWx0aXBsZSB2aWV3cyBpbiBhIHJlbmRlcnBhc3Mgdy8gZ2VvbWV0cnkgc2hhZGVyPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyPC9uYW1lPjxjb21tZW50Pk11bHRpcGxlIHZpZXdzIGluIGEgcmVuZGVycGFzcyB3LyB0ZXNzZWxsYXRpb24gc2hhZGVyPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlc0tIUiIgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BST1BFUlRJRVMiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heE11bHRpdmlld1ZpZXdDb3VudDwvbmFtZT48Y29tbWVudD5tYXggbnVtYmVyIG9mIHZpZXdzIGluIGEgc3VicGFzczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heE11bHRpdmlld0luc3RhbmNlSW5kZXg8L25hbWU+PGNvbW1lbnQ+bWF4IGluc3RhbmNlIGluZGV4IGZvciBhIGRyYXcgaW4gYSBtdWx0aXZpZXcgc3VicGFzczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllc0tIUiIgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyIgc3RydWN0ZXh0ZW5kcz0iVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfTVVMVElWSUVXX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+ICAgICAgICA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zdWJwYXNzQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ic3VicGFzc0NvdW50Ij5jb25zdCA8dHlwZT51aW50MzJfdDwvdHlwZT4qICAgICA8bmFtZT5wVmlld01hc2tzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZGVwZW5kZW5jeUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImRlcGVuZGVuY3lDb3VudCI+Y29uc3QgPHR5cGU+aW50MzJfdDwvdHlwZT4qICAgPG5hbWU+cFZpZXdPZmZzZXRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+Y29ycmVsYXRpb25NYXNrQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iY29ycmVsYXRpb25NYXNrQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cENvcnJlbGF0aW9uTWFza3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mb0tIUiIgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWluSW1hZ2VDb3VudDwvbmFtZT48Y29tbWVudD5TdXBwb3J0ZWQgbWluaW11bSBudW1iZXIgb2YgaW1hZ2VzIGZvciB0aGUgc3VyZmFjZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heEltYWdlQ291bnQ8L25hbWU+PGNvbW1lbnQ+U3VwcG9ydGVkIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyBmb3IgdGhlIHN1cmZhY2UsIDAgZm9yIHVubGltaXRlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmN1cnJlbnRFeHRlbnQ8L25hbWU+PGNvbW1lbnQ+Q3VycmVudCBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUgc3VyZmFjZSwgKDAsIDApIGlmIHVuZGVmaW5lZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1pbkltYWdlRXh0ZW50PC9uYW1lPjxjb21tZW50PlN1cHBvcnRlZCBtaW5pbXVtIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSBzdXJmYWNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4SW1hZ2VFeHRlbnQ8L25hbWU+PGNvbW1lbnQ+U3VwcG9ydGVkIG1heGltdW0gaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIHN1cmZhY2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhJbWFnZUFycmF5TGF5ZXJzPC9uYW1lPjxjb21tZW50PlN1cHBvcnRlZCBtYXhpbXVtIG51bWJlciBvZiBpbWFnZSBsYXllcnMgZm9yIHRoZSBzdXJmYWNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFI8L3R5cGU+ICAgICAgIDxuYW1lPnN1cHBvcnRlZFRyYW5zZm9ybXM8L25hbWU+PGNvbW1lbnQ+MSBvciBtb3JlIGJpdHMgcmVwcmVzZW50aW5nIHRoZSB0cmFuc2Zvcm1zIHN1cHBvcnRlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFI8L3R5cGU+ICAgIDxuYW1lPmN1cnJlbnRUcmFuc2Zvcm08L25hbWU+PGNvbW1lbnQ+VGhlIHN1cmZhY2UncyBjdXJyZW50IHRyYW5zZm9ybSByZWxhdGl2ZSB0byB0aGUgZGV2aWNlJ3MgbmF0dXJhbCBvcmllbnRhdGlvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQ29tcG9zaXRlQWxwaGFGbGFnc0tIUjwvdHlwZT4gICAgICAgICA8bmFtZT5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYTwvbmFtZT48Y29tbWVudD4xIG9yIG1vcmUgYml0cyByZXByZXNlbnRpbmcgdGhlIGFscGhhIGNvbXBvc2l0aW5nIG1vZGVzIHN1cHBvcnRlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSW1hZ2VVc2FnZUZsYWdzPC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5zdXBwb3J0ZWRVc2FnZUZsYWdzPC9uYW1lPjxjb21tZW50PlN1cHBvcnRlZCBpbWFnZSB1c2FnZSBmbGFncyBmb3IgdGhlIHN1cmZhY2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1N1cmZhY2VDb3VudGVyRmxhZ3NFWFQ8L3R5cGU+IDxuYW1lPnN1cHBvcnRlZFN1cmZhY2VDb3VudGVyczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rpc3BsYXlQb3dlckluZm9FWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUE9XRVJfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEaXNwbGF5UG93ZXJTdGF0ZUVYVDwvdHlwZT4gICAgICAgICAgIDxuYW1lPnBvd2VyU3RhdGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXZpY2VFdmVudEluZm9FWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9FVkVOVF9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZUV2ZW50VHlwZUVYVDwvdHlwZT4gICAgICAgICAgICAgPG5hbWU+ZGV2aWNlRXZlbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEaXNwbGF5RXZlbnRJbmZvRVhUIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX0VWRU5UX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGlzcGxheUV2ZW50VHlwZUVYVDwvdHlwZT4gICAgICAgICAgICA8bmFtZT5kaXNwbGF5RXZlbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ09VTlRFUl9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU3VyZmFjZUNvdW50ZXJGbGFnc0VYVDwvdHlwZT4gICAgICAgICA8bmFtZT5zdXJmYWNlQ291bnRlcnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfR1JPVVBfUFJPUEVSVElFUyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGh5c2ljYWxEZXZpY2VDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gICAgICAgICAgICAgICAgIDxuYW1lPnBoeXNpY2FsRGV2aWNlczwvbmFtZT5bPGVudW0+VktfTUFYX0RFVklDRV9HUk9VUF9TSVpFPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN1YnNldEFsbG9jYXRpb248L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUiIgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyIgc3RydWN0ZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9GTEFHU19JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa01lbW9yeUFsbG9jYXRlRmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGV2aWNlTWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0JpbmRCdWZmZXJNZW1vcnlJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVmZmVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZU1lbW9yeTwvdHlwZT4gICAgICAgICAgICAgICAgICAgPG5hbWU+bWVtb3J5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWVtb3J5T2Zmc2V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQmluZEJ1ZmZlck1lbW9yeUluZm9LSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0JpbmRCdWZmZXJNZW1vcnlJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyIgc3RydWN0ZXh0ZW5kcz0iVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICA8bmFtZT5kZXZpY2VJbmRleENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImRldmljZUluZGV4Q291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogIDxuYW1lPnBEZXZpY2VJbmRpY2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mb0tIUiIgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2U8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbWFnZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrRGV2aWNlTWVtb3J5PC90eXBlPiAgICAgICAgICAgICAgICAgICA8bmFtZT5tZW1vcnk8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICA8bmFtZT5tZW1vcnlPZmZzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtCaW5kSW1hZ2VNZW1vcnlJbmZvS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrQmluZEltYWdlTWVtb3J5SW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyIgc3RydWN0ZXh0ZW5kcz0iVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgPG5hbWU+ZGV2aWNlSW5kZXhDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJkZXZpY2VJbmRleENvdW50Ij5jb25zdCA8dHlwZT51aW50MzJfdDwvdHlwZT4qICA8bmFtZT5wRGV2aWNlSW5kaWNlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgIDxuYW1lPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ic3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCI+Y29uc3QgPHR5cGU+VmtSZWN0MkQ8L3R5cGU+KiAgPG5hbWU+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mb0tIUiIgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8iIHN0cnVjdGV4dGVuZHM9IlZrUmVuZGVyUGFzc0JlZ2luSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRldmljZU1hc2s8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICA8bmFtZT5kZXZpY2VSZW5kZXJBcmVhQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iZGV2aWNlUmVuZGVyQXJlYUNvdW50Ij5jb25zdCA8dHlwZT5Wa1JlY3QyRDwvdHlwZT4qICA8bmFtZT5wRGV2aWNlUmVuZGVyQXJlYXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm9LSFIiICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvIiBzdHJ1Y3RleHRlbmRzPSJWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZXZpY2VNYXNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvS0hSIiAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RldmljZUdyb3VwU3VibWl0SW5mbyIgc3RydWN0ZXh0ZW5kcz0iVmtTdWJtaXRJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1VCTUlUX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgIDxuYW1lPndhaXRTZW1hcGhvcmVDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJ3YWl0U2VtYXBob3JlQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogICAgPG5hbWU+cFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgPG5hbWU+Y29tbWFuZEJ1ZmZlckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImNvbW1hbmRCdWZmZXJDb3VudCI+Y29uc3QgPHR5cGU+dWludDMyX3Q8L3R5cGU+KiAgICA8bmFtZT5wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgPG5hbWU+c2lnbmFsU2VtYXBob3JlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ic2lnbmFsU2VtYXBob3JlQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogIDxuYW1lPnBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0RldmljZUdyb3VwU3VibWl0SW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8iIHN0cnVjdGV4dGVuZHM9IlZrQmluZFNwYXJzZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9CSU5EX1NQQVJTRV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5yZXNvdXJjZURldmljZUluZGV4PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWVtb3J5RGV2aWNlSW5kZXg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVzZW50TWFzazwvbmFtZT5bPGVudW0+VktfTUFYX0RFVklDRV9HUk9VUF9TSVpFPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFI8L3R5cGU+IDxuYW1lPm1vZGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+ICAgPG5hbWU+c3dhcGNoYWluPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9TV0FQQ0hBSU5fSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+IDxuYW1lPnN3YXBjaGFpbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmltYWdlSW5kZXg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9ORVhUX0lNQUdFX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrU3dhcGNoYWluS0hSPC90eXBlPiA8bmFtZT5zd2FwY2hhaW48L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT50aW1lb3V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+IDxuYW1lPnNlbWFwaG9yZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrRmVuY2U8L3R5cGU+IDxuYW1lPmZlbmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGV2aWNlTWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIiIHN0cnVjdGV4dGVuZHM9IlZrUHJlc2VudEluZm9LSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICA8bmFtZT5zd2FwY2hhaW5Db3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJzd2FwY2hhaW5Db3VudCI+Y29uc3QgPHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wRGV2aWNlTWFza3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSPC90eXBlPiA8bmFtZT5tb2RlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvIiBzdHJ1Y3RleHRlbmRzPSJWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk8iPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5waHlzaWNhbERldmljZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InBoeXNpY2FsRGV2aWNlQ291bnQiPmNvbnN0IDx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+KiAgPG5hbWU+cFBoeXNpY2FsRGV2aWNlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mb0tIUiIgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIiIHN0cnVjdGV4dGVuZHM9IlZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1vZGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZHN0QmluZGluZzwvbmFtZT48Y29tbWVudD5CaW5kaW5nIHdpdGhpbiB0aGUgZGVzdGluYXRpb24gZGVzY3JpcHRvciBzZXQgdG8gd3JpdGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kc3RBcnJheUVsZW1lbnQ8L25hbWU+PGNvbW1lbnQ+QXJyYXkgZWxlbWVudCB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIGJpbmRpbmcgdG8gd3JpdGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yQ291bnQ8L25hbWU+PGNvbW1lbnQ+TnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRvIHdyaXRlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rlc2NyaXB0b3JUeXBlPC90eXBlPiAgICAgICAgICAgICAgICAgPG5hbWU+ZGVzY3JpcHRvclR5cGU8L25hbWU+PGNvbW1lbnQ+RGVzY3JpcHRvciB0eXBlIHRvIHdyaXRlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5zaXplX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b2Zmc2V0PC9uYW1lPjxjb21tZW50Pk9mZnNldCBpbnRvIHBEYXRhIHdoZXJlIHRoZSBkZXNjcmlwdG9ycyB0byB1cGRhdGUgYXJlIHN0b3JlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+c2l6ZV90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN0cmlkZTwvbmFtZT48Y29tbWVudD5TdHJpZGUgYmV0d2VlbiB0d28gZGVzY3JpcHRvcnMgaW4gcERhdGEgd2hlbiB3cml0aW5nIG1vcmUgdGhhbiBvbmUgZGVzY3JpcHRvcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5S0hSIiAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUZsYWdzPC90eXBlPiAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudDwvbmFtZT48Y29tbWVudD5OdW1iZXIgb2YgZGVzY3JpcHRvciB1cGRhdGUgZW50cmllcyB0byB1c2UgZm9yIHRoZSB1cGRhdGUgdGVtcGxhdGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQiPmNvbnN0IDx0eXBlPlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnk8L3R5cGU+KiA8bmFtZT5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXM8L25hbWU+PGNvbW1lbnQ+RGVzY3JpcHRvciB1cGRhdGUgZW50cmllcyBmb3IgdGhlIHRlbXBsYXRlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGU8L3R5cGU+IDxuYW1lPnRlbXBsYXRlVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrRGVzY3JpcHRvclNldExheW91dDwvdHlwZT4gPG5hbWU+ZGVzY3JpcHRvclNldExheW91dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVCaW5kUG9pbnQ8L3R5cGU+IDxuYW1lPnBpcGVsaW5lQmluZFBvaW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUxheW91dDwvdHlwZT48bmFtZT5waXBlbGluZUxheW91dDwvbmFtZT48Y29tbWVudD5JZiB1c2VkIGZvciBwdXNoIGRlc2NyaXB0b3JzLCB0aGlzIGlzIHRoZSBvbmx5IGFsbG93ZWQgbGF5b3V0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnNldDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm9LSFIiICAgICAgICAgICAgICAgICBhbGlhcz0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrWFlDb2xvckVYVCIgY29tbWVudD0iQ2hyb21hdGljaXR5IGNvb3JkaW5hdGUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICA8bmFtZT54PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICA8bmFtZT55PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSGRyTWV0YWRhdGFFWFQiPgorICAgICAgICAgICAgICAgIDxjb21tZW50PkRpc3BsYXkgcHJpbWFyeSBpbiBjaHJvbWF0aWNpdHkgY29vcmRpbmF0ZXM8L2NvbW1lbnQ+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSERSX01FVEFEQVRBX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxjb21tZW50PiBGcm9tIFNNUFRFIDIwODY8L2NvbW1lbnQ+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa1hZQ29sb3JFWFQ8L3R5cGU+ICAgPG5hbWU+ZGlzcGxheVByaW1hcnlSZWQ8L25hbWU+PGNvbW1lbnQ+RGlzcGxheSBwcmltYXJ5J3MgUmVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtYWUNvbG9yRVhUPC90eXBlPiAgIDxuYW1lPmRpc3BsYXlQcmltYXJ5R3JlZW48L25hbWU+PGNvbW1lbnQ+RGlzcGxheSBwcmltYXJ5J3MgR3JlZW48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa1hZQ29sb3JFWFQ8L3R5cGU+ICAgPG5hbWU+ZGlzcGxheVByaW1hcnlCbHVlPC9uYW1lPjxjb21tZW50PkRpc3BsYXkgcHJpbWFyeSdzIEJsdWU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa1hZQ29sb3JFWFQ8L3R5cGU+ICAgPG5hbWU+d2hpdGVQb2ludDwvbmFtZT48Y29tbWVudD5EaXNwbGF5IHByaW1hcnkncyBCbHVlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgIDxuYW1lPm1heEx1bWluYW5jZTwvbmFtZT48Y29tbWVudD5EaXNwbGF5IG1heGltdW0gbHVtaW5hbmNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgIDxuYW1lPm1pbkx1bWluYW5jZTwvbmFtZT48Y29tbWVudD5EaXNwbGF5IG1pbmltdW0gbHVtaW5hbmNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxjb21tZW50PiBGcm9tIENUQSA4NjEuMzwvY29tbWVudD4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICA8bmFtZT5tYXhDb250ZW50TGlnaHRMZXZlbDwvbmFtZT48Y29tbWVudD5Db250ZW50IG1heGltdW0gbHVtaW5hbmNlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgIDxuYW1lPm1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWw8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX05BVElWRV9IRFJfU1VSRkFDRV9DQVBBQklMSVRJRVNfQU1EIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICA8bmFtZT5sb2NhbERpbW1pbmdTdXBwb3J0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQiIHN0cnVjdGV4dGVuZHM9IlZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgIDxuYW1lPmxvY2FsRGltbWluZ0VuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cmVmcmVzaER1cmF0aW9uPC9uYW1lPjxjb21tZW50Pk51bWJlciBvZiBuYW5vc2Vjb25kcyBmcm9tIHRoZSBzdGFydCBvZiBvbmUgcmVmcmVzaCBjeWNsZSB0byB0aGUgbmV4dDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVzZW50SUQ8L25hbWU+PGNvbW1lbnQ+QXBwbGljYXRpb24tcHJvdmlkZWQgaWRlbnRpZmllciwgcHJldmlvdXNseSBnaXZlbiB0byB2a1F1ZXVlUHJlc2VudEtIUjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlc2lyZWRQcmVzZW50VGltZTwvbmFtZT48Y29tbWVudD5FYXJsaWVzdCB0aW1lIGFuIGltYWdlIHNob3VsZCBoYXZlIGJlZW4gcHJlc2VudGVkLCBwcmV2aW91c2x5IGdpdmVuIHRvIHZrUXVldWVQcmVzZW50S0hSPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YWN0dWFsUHJlc2VudFRpbWU8L25hbWU+PGNvbW1lbnQ+VGltZSB0aGUgaW1hZ2Ugd2FzIGFjdHVhbGx5IGRpc3BsYXllZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmVhcmxpZXN0UHJlc2VudFRpbWU8L25hbWU+PGNvbW1lbnQ+RWFybGllc3QgdGltZSB0aGUgaW1hZ2UgY291bGQgaGF2ZSBiZWVuIGRpc3BsYXllZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXNlbnRNYXJnaW48L25hbWU+PGNvbW1lbnQ+SG93IGVhcmx5IHZrUXVldWVQcmVzZW50S0hSIHdhcyBwcm9jZXNzZWQgdnMuIGhvdyBzb29uIGl0IG5lZWRlZCB0byBiZSBhbmQgbWFrZSBlYXJsaWVzdFByZXNlbnRUaW1lPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSIgc3RydWN0ZXh0ZW5kcz0iVmtQcmVzZW50SW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9USU1FU19JTkZPX0dPT0dMRSI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3dhcGNoYWluQ291bnQ8L25hbWU+PGNvbW1lbnQ+Q29weSBvZiBWa1ByZXNlbnRJbmZvS0hSOjpzd2FwY2hhaW5Db3VudDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJzd2FwY2hhaW5Db3VudCIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrUHJlc2VudFRpbWVHT09HTEU8L3R5cGU+KiAgIDxuYW1lPnBUaW1lczwvbmFtZT48Y29tbWVudD5UaGUgZWFybGllc3QgdGltZXMgdG8gcHJlc2VudCBpbWFnZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQcmVzZW50VGltZUdPT0dMRSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVzZW50SUQ8L25hbWU+PGNvbW1lbnQ+QXBwbGljYXRpb24tcHJvdmlkZWQgaWRlbnRpZmllcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlc2lyZWRQcmVzZW50VGltZTwvbmFtZT48Y29tbWVudD5FYXJsaWVzdCB0aW1lIGFuIGltYWdlIHNob3VsZCBiZSBwcmVzZW50ZWQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU9TX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTVZLIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSU9TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLPC90eXBlPiAgICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wVmlldzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX01BQ09TX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTVZLIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrTWFjT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVks8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wVmlldzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX01FVEFMX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrTWV0YWxTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQ8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj5jb25zdCA8dHlwZT5DQU1ldGFsTGF5ZXI8L3R5cGU+KiAgICAgIDxuYW1lPnBMYXllcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1ZpZXdwb3J0V1NjYWxpbmdOViI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICA8bmFtZT54Y29lZmY8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICA8bmFtZT55Y29lZmY8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dmlld3BvcnRXU2NhbGluZ0VuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dmlld3BvcnRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIG9wdGlvbmFsPSJ0cnVlIiBsZW49InZpZXdwb3J0Q291bnQiPmNvbnN0IDx0eXBlPlZrVmlld3BvcnRXU2NhbGluZ05WPC90eXBlPiogICAgICA8bmFtZT5wVmlld3BvcnRXU2NhbGluZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtWaWV3cG9ydFN3aXp6bGVOViI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WPC90eXBlPiAgICAgICAgICA8bmFtZT54PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVjwvdHlwZT4gICAgICAgICAgPG5hbWU+eTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY8L3R5cGU+ICAgICAgICAgIDxuYW1lPno8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WPC90eXBlPiAgICAgICAgICA8bmFtZT53PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TV0laWkxFX1NUQVRFX0NSRUFURV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUZsYWdzTlY8L3R5cGU+ICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT52aWV3cG9ydENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InZpZXdwb3J0Q291bnQiPmNvbnN0IDx0eXBlPlZrVmlld3BvcnRTd2l6emxlTlY8L3R5cGU+KiAgICAgIDxuYW1lPnBWaWV3cG9ydFN3aXp6bGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ESVNDQVJEX1JFQ1RBTkdMRV9QUk9QRVJUSUVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERpc2NhcmRSZWN0YW5nbGVzPC9uYW1lPjxjb21tZW50Pm1heCBudW1iZXIgb2YgYWN0aXZlIGRpc2NhcmQgcmVjdGFuZ2xlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRElTQ0FSRF9SRUNUQU5HTEVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlRmxhZ3NFWFQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRpc2NhcmRSZWN0YW5nbGVNb2RlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGlzY2FyZFJlY3RhbmdsZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSIgb3B0aW9uYWw9InRydWUiIGxlbj0iZGlzY2FyZFJlY3RhbmdsZUNvdW50Ij5jb25zdCA8dHlwZT5Wa1JlY3QyRDwvdHlwZT4qIDxuYW1lPnBEaXNjYXJkUmVjdGFuZ2xlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN1YnBhc3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmlucHV0QXR0YWNobWVudEluZGV4PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlQXNwZWN0RmxhZ3M8L3R5cGU+ICAgICAgICAgICAgICA8bmFtZT5hc3BlY3RNYXNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlS0hSIiAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZSIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIiBzdHJ1Y3RleHRlbmRzPSJWa1JlbmRlclBhc3NDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19JTlBVVF9BVFRBQ0hNRU5UX0FTUEVDVF9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmFzcGVjdFJlZmVyZW5jZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImFzcGVjdFJlZmVyZW5jZUNvdW50Ij5jb25zdCA8dHlwZT5Wa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZTwvdHlwZT4qIDxuYW1lPnBBc3BlY3RSZWZlcmVuY2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm9LSFIiICAgICAgICAgIGFsaWFzPSJWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTdXJmYWNlS0hSPC90eXBlPiA8bmFtZT5zdXJmYWNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI8L3R5cGU+IDxuYW1lPnN1cmZhY2VDYXBhYmlsaXRpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdXJmYWNlRm9ybWF0MktIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZPUk1BVF8yX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N1cmZhY2VGb3JtYXRLSFI8L3R5cGU+IDxuYW1lPnN1cmZhY2VGb3JtYXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEaXNwbGF5UHJvcGVydGllczJLSFIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUk9QRVJUSUVTXzJfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGlzcGxheVByb3BlcnRpZXNLSFI8L3R5cGU+IDxuYW1lPmRpc3BsYXlQcm9wZXJ0aWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9QUk9QRVJUSUVTXzJfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUjwvdHlwZT4gPG5hbWU+ZGlzcGxheVBsYW5lUHJvcGVydGllczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9NT0RFX1BST1BFUlRJRVNfMl9LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFI8L3R5cGU+IDxuYW1lPmRpc3BsYXlNb2RlUHJvcGVydGllczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rpc3BsYXlQbGFuZUluZm8yS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX0lORk9fMl9LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEaXNwbGF5TW9kZUtIUjwvdHlwZT4gPG5hbWU+bW9kZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnBsYW5lSW5kZXg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSPC90eXBlPiA8bmFtZT5jYXBhYmlsaXRpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TSEFSRURfUFJFU0VOVF9TVVJGQUNFX0NBUEFCSUxJVElFU19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0ltYWdlVXNhZ2VGbGFnczwvdHlwZT4gPG5hbWU+c2hhcmVkUHJlc2VudFN1cHBvcnRlZFVzYWdlRmxhZ3M8L25hbWU+PGNvbW1lbnQ+U3VwcG9ydGVkIGltYWdlIHVzYWdlIGZsYWdzIGlmIHN3YXBjaGFpbiBjcmVhdGVkIHVzaW5nIGEgc2hhcmVkIHByZXNlbnQgbW9kZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfMTZCSVRfU1RPUkFHRV9GRUFUVVJFUyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzPC9uYW1lPjxjb21tZW50PjE2LWJpdCBpbnRlZ2VyL2Zsb2F0aW5nLXBvaW50IHZhcmlhYmxlcyBzdXBwb3J0ZWQgaW4gQnVmZmVyQmxvY2s8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT51bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzPC9uYW1lPjxjb21tZW50PjE2LWJpdCBpbnRlZ2VyL2Zsb2F0aW5nLXBvaW50IHZhcmlhYmxlcyBzdXBwb3J0ZWQgaW4gQnVmZmVyQmxvY2sgYW5kIEJsb2NrPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3RvcmFnZVB1c2hDb25zdGFudDE2PC9uYW1lPjxjb21tZW50PjE2LWJpdCBpbnRlZ2VyL2Zsb2F0aW5nLXBvaW50IHZhcmlhYmxlcyBzdXBwb3J0ZWQgaW4gUHVzaENvbnN0YW50PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3RvcmFnZUlucHV0T3V0cHV0MTY8L25hbWU+PGNvbW1lbnQ+MTYtYml0IGludGVnZXIvZmxvYXRpbmctcG9pbnQgdmFyaWFibGVzIHN1cHBvcnRlZCBpbiBzaGFkZXIgaW5wdXRzIGFuZCBvdXRwdXRzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlc0tIUiIgICAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9QUk9QRVJUSUVTIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3ViZ3JvdXBTaXplPC9uYW1lPjxjb21tZW50PlRoZSBzaXplIG9mIGEgc3ViZ3JvdXAgZm9yIHRoaXMgcXVldWUuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtTaGFkZXJTdGFnZUZsYWdzPC90eXBlPiAgICAgICAgICAgIDxuYW1lPnN1cHBvcnRlZFN0YWdlczwvbmFtZT48Y29tbWVudD5CaXRmaWVsZCBvZiB3aGF0IHNoYWRlciBzdGFnZXMgc3VwcG9ydCBzdWJncm91cCBvcGVyYXRpb25zPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtTdWJncm91cEZlYXR1cmVGbGFnczwvdHlwZT4gICAgICAgIDxuYW1lPnN1cHBvcnRlZE9wZXJhdGlvbnM8L25hbWU+PGNvbW1lbnQ+Qml0ZmllbGQgb2Ygd2hhdCBzdWJncm91cCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtCb29sMzI8L3R5cGU+IDxuYW1lPnF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXM8L25hbWU+PGNvbW1lbnQ+RmxhZyB0byBzcGVjaWZ5IHdoZXRoZXIgcXVhZCBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUgaW4gYWxsIHN0YWdlcy48L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRkVBVFVSRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gPG5hbWU+c2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzPC9uYW1lPjxjb21tZW50PkZsYWcgdG8gc3BlY2lmeSB3aGV0aGVyIHN1Ymdyb3VwIG9wZXJhdGlvbnMgd2l0aCBleHRlbmRlZCB0eXBlcyBhcmUgc3VwcG9ydGVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVmZmVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJLSFIiICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmltYWdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiIgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TUEFSU0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmltYWdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiIgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtNZW1vcnlSZXF1aXJlbWVudHMyIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa01lbW9yeVJlcXVpcmVtZW50czwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWVtb3J5UmVxdWlyZW1lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa01lbW9yeVJlcXVpcmVtZW50czIiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tZW1vcnlSZXF1aXJlbWVudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QT0lOVF9DTElQUElOR19QUk9QRVJUSUVTIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yPC90eXBlPiAgICAgIDxuYW1lPnBvaW50Q2xpcHBpbmdCZWhhdmlvcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXNLSFIiICAgICAgICAgICAgICBhbGlhcz0iVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrTWVtb3J5UmVxdWlyZW1lbnRzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFMiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzS0hSIiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyIgc3RydWN0ZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfQUxMT0NBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtJbWFnZTwvdHlwZT4gICAgICAgICAgPG5hbWU+aW1hZ2U8L25hbWU+PGNvbW1lbnQ+SW1hZ2UgdGhhdCB0aGlzIGFsbG9jYXRpb24gd2lsbCBiZSBib3VuZCB0bzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQnVmZmVyPC90eXBlPiAgICAgICAgIDxuYW1lPmJ1ZmZlcjwvbmFtZT48Y29tbWVudD5CdWZmZXIgdGhhdCB0aGlzIGFsbG9jYXRpb24gd2lsbCBiZSBib3VuZCB0bzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb0tIUiIgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8iIHN0cnVjdGV4dGVuZHM9IlZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19VU0FHRV9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlVXNhZ2VGbGFnczwvdHlwZT4gPG5hbWU+dXNhZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm9LSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8iIHN0cnVjdGV4dGVuZHM9IlZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luPC90eXBlPiAgICA8bmFtZT5kb21haW5PcmlnaW48L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mb0tIUiIgICAgYWxpYXM9IlZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyIgc3RydWN0ZXh0ZW5kcz0iVmtTYW1wbGVyQ3JlYXRlSW5mbyxWa0ltYWdlVmlld0NyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2FtcGxlclljYmNyQ29udmVyc2lvbjwvdHlwZT4gICAgICA8bmFtZT5jb252ZXJzaW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm9LSFIiICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Zvcm1hdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Zm9ybWF0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbjwvdHlwZT4gPG5hbWU+eWNiY3JNb2RlbDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTYW1wbGVyWWNiY3JSYW5nZTwvdHlwZT4gICAgICAgICAgIDxuYW1lPnljYmNyUmFuZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29tcG9uZW50TWFwcGluZzwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5jb21wb25lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Nocm9tYUxvY2F0aW9uPC90eXBlPiAgICAgICAgICAgICAgPG5hbWU+eENocm9tYU9mZnNldDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDaHJvbWFMb2NhdGlvbjwvdHlwZT4gICAgICAgICAgICAgIDxuYW1lPnlDaHJvbWFPZmZzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRmlsdGVyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jaHJvbWFGaWx0ZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5mb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb248L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mb0tIUiIgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8iLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8iIHN0cnVjdGV4dGVuZHM9IlZrQmluZEltYWdlTWVtb3J5SW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9QTEFORV9NRU1PUllfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlQXNwZWN0RmxhZ0JpdHM8L3R5cGU+ICAgICAgICAgICAgPG5hbWU+cGxhbmVBc3BlY3Q8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm9LSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9IlZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8iIHN0cnVjdGV4dGVuZHM9IlZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfUExBTkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VBc3BlY3RGbGFnQml0czwvdHlwZT4gICAgICAgICAgICA8bmFtZT5wbGFuZUFzcGVjdDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvS0hSIiAgICAgICAgICAgICAgICAgICBhbGlhcz0iVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2FtcGxlclljYmNyQ29udmVyc2lvbjwvbmFtZT48Y29tbWVudD5TYW1wbGVyIGNvbG9yIGNvbnZlcnNpb24gc3VwcG9ydGVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXNLSFIiICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzIi8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlRm9ybWF0UHJvcGVydGllczIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTUFHRV9GT1JNQVRfUFJPUEVSVElFUyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y29tYmluZWRJbWFnZVNhbXBsZXJEZXNjcmlwdG9yQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzS0hSIiAgICAgICAgYWxpYXM9IlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfVEVYVFVSRV9MT0RfR0FUSEVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FNRCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3VwcG9ydHNUZXh0dXJlR2F0aGVyTE9EQmlhc0FNRDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCdWZmZXI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmJ1ZmZlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9mZnNldDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnc0VYVDwvdHlwZT4gICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQcm90ZWN0ZWRTdWJtaXRJbmZvIiBzdHJ1Y3RleHRlbmRzPSJWa1N1Ym1pdEluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnByb3RlY3RlZFN1Ym1pdDwvbmFtZT48Y29tbWVudD5TdWJtaXQgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJvdGVjdGVkTWVtb3J5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfUFJPUEVSVElFUyI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJvdGVjdGVkTm9GYXVsdDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RldmljZVF1ZXVlSW5mbzIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9JTkZPXzIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRGV2aWNlUXVldWVDcmVhdGVGbGFnczwvdHlwZT4gICAgICAgICAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnF1ZXVlRmFtaWx5SW5kZXg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5xdWV1ZUluZGV4PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlRmxhZ3NOVjwvdHlwZT4gICAgICAgICAgICAgICAgICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y292ZXJhZ2VUb0NvbG9yRW5hYmxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgPG5hbWU+Y292ZXJhZ2VUb0NvbG9yTG9jYXRpb248L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfRklMVEVSX01JTk1BWF9QUk9QRVJUSUVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmZpbHRlck1pbm1heFNpbmdsZUNvbXBvbmVudEZvcm1hdHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NhbXBsZUxvY2F0aW9uRVhUIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPng8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT55PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtJbWFnZU1lbW9yeUJhcnJpZXIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU2FtcGxlQ291bnRGbGFnQml0czwvdHlwZT4gIDxuYW1lPnNhbXBsZUxvY2F0aW9uc1BlclBpeGVsPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2FtcGxlTG9jYXRpb25HcmlkU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNhbXBsZUxvY2F0aW9uc0NvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InNhbXBsZUxvY2F0aW9uc0NvdW50Ij5jb25zdCA8dHlwZT5Wa1NhbXBsZUxvY2F0aW9uRVhUPC90eXBlPiogPG5hbWU+cFNhbXBsZUxvY2F0aW9uczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YXR0YWNobWVudEluZGV4PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQ8L3R5cGU+ICAgICAgICAgPG5hbWU+c2FtcGxlTG9jYXRpb25zSW5mbzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1N1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3VicGFzc0luZGV4PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQ8L3R5cGU+ICAgICAgICAgPG5hbWU+c2FtcGxlTG9jYXRpb25zSW5mbzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrUmVuZGVyUGFzc0JlZ2luSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfU0FNUExFX0xPQ0FUSU9OU19CRUdJTl9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgPG5hbWU+YXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50Ij5jb25zdCA8dHlwZT5Wa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQ8L3R5cGU+KiA8bmFtZT5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICA8bmFtZT5wb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0NvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQiPmNvbnN0IDx0eXBlPlZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVDwvdHlwZT4qIDxuYW1lPnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NBTVBMRV9MT0NBVElPTlNfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zYW1wbGVMb2NhdGlvbnNFbmFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVDwvdHlwZT4gICAgICAgICA8bmFtZT5zYW1wbGVMb2NhdGlvbnNJbmZvPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRV9MT0NBVElPTlNfUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTYW1wbGVDb3VudEZsYWdzPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlPC9uYW1lPlsyXTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2FtcGxlTG9jYXRpb25TdWJQaXhlbEJpdHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52YXJpYWJsZVNhbXBsZUxvY2F0aW9uczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtTYW1wbGVyQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUPC90eXBlPiA8bmFtZT5yZWR1Y3Rpb25Nb2RlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9QUk9QRVJUSUVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmFkdmFuY2VkQmxlbmRNYXhDb2xvckF0dGFjaG1lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5hZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWREc3RDb2xvcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zcmNQcmVtdWx0aXBsaWVkPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kc3RQcmVtdWx0aXBsaWVkPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0JsZW5kT3ZlcmxhcEVYVDwvdHlwZT4gICAgICA8bmFtZT5ibGVuZE92ZXJsYXA8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmlubGluZVVuaWZvcm1CbG9jazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbmxpbmVVbmlmb3JtQmxvY2tzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQiIHN0cnVjdGV4dGVuZHM9IlZrV3JpdGVEZXNjcmlwdG9yU2V0Ij4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVF9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kYXRhU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJkYXRhU2l6ZSI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBEYXRhPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0lOTElORV9VTklGT1JNX0JMT0NLX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heElubGluZVVuaWZvcm1CbG9ja0JpbmRpbmdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9NT0RVTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVGbGFnc05WPC90eXBlPiAgICAgICAgICAgICAgICAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlY8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmNvdmVyYWdlTW9kdWxhdGlvbk1vZGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBvcHRpb25hbD0idHJ1ZSIgbGVuPSJjb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50Ij5jb25zdCA8dHlwZT5mbG9hdDwvdHlwZT4qIDxuYW1lPnBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIiIHN0cnVjdGV4dGVuZHM9IlZrSW1hZ2VDcmVhdGVJbmZvLFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUixWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnZpZXdGb3JtYXRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJ2aWV3Rm9ybWF0Q291bnQiPmNvbnN0IDx0eXBlPlZrRm9ybWF0PC90eXBlPiogICAgICA8bmFtZT5wVmlld0Zvcm1hdHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUZsYWdzRVhUPC90eXBlPiAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnNpemVfdDwvdHlwZT4gICAgICAgICAgICAgICAgIDxuYW1lPmluaXRpYWxEYXRhU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJpbml0aWFsRGF0YVNpemUiPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBJbml0aWFsRGF0YTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrVmFsaWRhdGlvbkNhY2hlRVhUPC90eXBlPiAgICA8bmFtZT52YWxpZGF0aW9uQ2FjaGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTZXREZXNjcmlwdG9yczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heE1lbW9yeUFsbG9jYXRpb25TaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzS0hSIiAgICAgICAgICAgICAgIGFsaWFzPSJWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9TVVBQT1JUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgPG5hbWU+c3VwcG9ydGVkPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Ii8+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVMiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJEcmF3UGFyYW1ldGVyczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlckZlYXR1cmVzIiAgICAgICAgICAgICBhbGlhcz0iVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0ZMT0FUMTZfSU5UOF9GRUFUVVJFU19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQb2ludGVyIHRvIG5leHQgc3RydWN0dXJlIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyRmxvYXQxNjwvbmFtZT48L21lbWJlcj4gICAgICAgICAgICAgICAgIDwhLS0gMTYtYml0IGZsb2F0cyAoaGFsZnMpIGluIHNoYWRlcnMgLS0+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJJbnQ4PC9uYW1lPjwvbWVtYmVyPiAgICAgICAgICAgICAgICAgICAgPCEtLSA4LWJpdCBpbnRlZ2VycyBpbiBzaGFkZXJzIC0tPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VGbG9hdDE2SW50OEZlYXR1cmVzS0hSIiBhbGlhcz0iVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUX0NPTlRST0xTX1BST1BFUlRJRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUjwvdHlwZT4gPG5hbWU+ZGVub3JtQmVoYXZpb3JJbmRlcGVuZGVuY2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUjwvdHlwZT4gPG5hbWU+cm91bmRpbmdNb2RlSW5kZXBlbmRlbmNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQxNjwvbmFtZT48L21lbWJlcj4gIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIHByZXNlcnZlIHNpZ25lZCB6ZXJvLCBuYW4sIGluZiAtLT4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzI8L25hbWU+PC9tZW1iZXI+ICA8IS0tIEFuIGltcGxlbWVudGF0aW9uIGNhbiBwcmVzZXJ2ZSBzaWduZWQgemVybywgbmFuLCBpbmYgLS0+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDY0PC9uYW1lPjwvbWVtYmVyPiAgPCEtLSBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gcHJlc2VydmUgc2lnbmVkIHplcm8sIG5hbiwgaW5mIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDE2PC9uYW1lPjwvbWVtYmVyPiAgICAgICAgICAgIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIHByZXNlcnZlICBkZW5vcm1hbHMgLS0+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MzI8L25hbWU+PC9tZW1iZXI+ICAgICAgICAgICAgPCEtLSBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gcHJlc2VydmUgIGRlbm9ybWFscyAtLT4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQ2NDwvbmFtZT48L21lbWJlcj4gICAgICAgICAgICA8IS0tIEFuIGltcGxlbWVudGF0aW9uIGNhbiBwcmVzZXJ2ZSAgZGVub3JtYWxzIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDE2PC9uYW1lPjwvbWVtYmVyPiAgICAgICAgIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIGZsdXNoIHRvIHplcm8gIGRlbm9ybWFscyAtLT4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMjwvbmFtZT48L21lbWJlcj4gICAgICAgICA8IS0tIEFuIGltcGxlbWVudGF0aW9uIGNhbiBmbHVzaCB0byB6ZXJvICBkZW5vcm1hbHMgLS0+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0NjQ8L25hbWU+PC9tZW1iZXI+ICAgICAgICAgPCEtLSBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gZmx1c2ggdG8gemVybyAgZGVub3JtYWxzIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQxNjwvbmFtZT48L21lbWJlcj4gICAgICAgICAgIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIHN1cHBvcnQgUlRFIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQzMjwvbmFtZT48L21lbWJlcj4gICAgICAgICAgIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIHN1cHBvcnQgUlRFIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NDwvbmFtZT48L21lbWJlcj4gICAgICAgICAgIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIHN1cHBvcnQgUlRFIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQxNjwvbmFtZT48L21lbWJlcj4gICAgICAgICAgIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIHN1cHBvcnQgUlRaIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQzMjwvbmFtZT48L21lbWJlcj4gICAgICAgICAgIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIHN1cHBvcnQgUlRaIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NDwvbmFtZT48L21lbWJlcj4gICAgICAgICAgIDwhLS0gQW4gaW1wbGVtZW50YXRpb24gY2FuIHN1cHBvcnQgUlRaIC0tPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aG9zdFF1ZXJ5UmVzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtOYXRpdmVCdWZmZXJVc2FnZTJBTkRST0lEIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+IDxuYW1lPmNvbnN1bWVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gPG5hbWU+cHJvZHVjZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtOYXRpdmVCdWZmZXJBTkRST0lEIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9OQVRJVkVfQlVGRkVSX0FORFJPSUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPmhhbmRsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+aW50PC90eXBlPiA8bmFtZT5zdHJpZGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmludDwvdHlwZT4gPG5hbWU+Zm9ybWF0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5pbnQ8L3R5cGU+IDxuYW1lPnVzYWdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa05hdGl2ZUJ1ZmZlclVzYWdlMkFORFJPSUQ8L3R5cGU+IDxuYW1lPnVzYWdlMjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1N3YXBjaGFpbkltYWdlQ3JlYXRlSW5mb0FORFJPSUQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9JTUFHRV9DUkVBVEVfSU5GT19BTkRST0lEIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU3dhcGNoYWluSW1hZ2VVc2FnZUZsYWdzQU5EUk9JRDwvdHlwZT4gPG5hbWU+dXNhZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVByZXNlbnRhdGlvblByb3BlcnRpZXNBTkRST0lEIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJFU0VOVEFUSU9OX1BST1BFUlRJRVNfQU5EUk9JRCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gPG5hbWU+c2hhcmVkSW1hZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTaGFkZXJSZXNvdXJjZVVzYWdlQU1EIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bnVtVXNlZFZncHJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bnVtVXNlZFNncHJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bGRzU2l6ZVBlckxvY2FsV29ya0dyb3VwPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5zaXplX3Q8L3R5cGU+IDxuYW1lPmxkc1VzYWdlU2l6ZUluQnl0ZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnNpemVfdDwvdHlwZT4gPG5hbWU+c2NyYXRjaE1lbVVzYWdlSW5CeXRlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NoYWRlclN0YXRpc3RpY3NJbmZvQU1EIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NoYWRlclN0YWdlRmxhZ3M8L3R5cGU+IDxuYW1lPnNoYWRlclN0YWdlTWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTaGFkZXJSZXNvdXJjZVVzYWdlQU1EPC90eXBlPiA8bmFtZT5yZXNvdXJjZVVzYWdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bnVtUGh5c2ljYWxWZ3ByczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm51bVBoeXNpY2FsU2dwcnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5udW1BdmFpbGFibGVWZ3ByczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm51bUF2YWlsYWJsZVNncHJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Y29tcHV0ZVdvcmtHcm91cFNpemU8L25hbWU+WzNdPC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9HTE9CQUxfUFJJT1JJVFlfQ1JFQVRFX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1F1ZXVlR2xvYmFsUHJpb3JpdHlFWFQ8L3R5cGU+ICAgICAgIDxuYW1lPmdsb2JhbFByaW9yaXR5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtPYmplY3RUeXBlPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vYmplY3RUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9iamVjdEhhbmRsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiIGxlbj0ibnVsbC10ZXJtaW5hdGVkIj5jb25zdCA8dHlwZT5jaGFyPC90eXBlPiogICAgICA8bmFtZT5wT2JqZWN0TmFtZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfVEFHX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrT2JqZWN0VHlwZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vYmplY3RUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b2JqZWN0SGFuZGxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dGFnTmFtZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+c2l6ZV90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnRhZ1NpemU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0idGFnU2l6ZSI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICA8bmFtZT5wVGFnPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVidWdVdGlsc0xhYmVsRVhUIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiAgICAgIDxuYW1lPnBMYWJlbE5hbWU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5jb2xvcjwvbmFtZT5bNF08L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa0luc3RhbmNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVGbGFnc0VYVDwvdHlwZT4gIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5tZXNzYWdlU2V2ZXJpdHk8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1lc3NhZ2VUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5QRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFQ8L3R5cGU+ICAgICAgICAgICAgICAgICA8bmFtZT5wZm5Vc2VyQ2FsbGJhY2s8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBVc2VyRGF0YTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DQUxMQkFDS19EQVRBX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFGbGFnc0VYVDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbGVuPSJudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTWVzc2FnZUlkTmFtZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPmludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWVzc2FnZUlkTnVtYmVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49Im51bGwtdGVybWluYXRlZCI+Y29uc3QgPHR5cGU+Y2hhcjwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTWVzc2FnZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cXVldWVMYWJlbENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InF1ZXVlTGFiZWxDb3VudCI+Y29uc3QgPHR5cGU+VmtEZWJ1Z1V0aWxzTGFiZWxFWFQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgIDxuYW1lPnBRdWV1ZUxhYmVsczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y21kQnVmTGFiZWxDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJjbWRCdWZMYWJlbENvdW50Ij5jb25zdCA8dHlwZT5Wa0RlYnVnVXRpbHNMYWJlbEVYVDwvdHlwZT4qICAgICAgICAgICAgICAgICA8bmFtZT5wQ21kQnVmTGFiZWxzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vYmplY3RDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJvYmplY3RDb3VudCI+Y29uc3QgPHR5cGU+VmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQ8L3R5cGU+KiAgICAgICAgICAgICA8bmFtZT5wT2JqZWN0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfSE9TVF9QT0lOVEVSX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJmYWxzZSI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBIb3N0UG9pbnRlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfSE9TVF9QT0lOVEVSX1BST1BFUlRJRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5tZW1vcnlUeXBlQml0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9NRU1PUllfSE9TVF9QUk9QRVJUSUVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPm1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48Y29tbWVudD5Qb2ludGVyIHRvIG5leHQgc3RydWN0dXJlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5wcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemU8L25hbWU+PGNvbW1lbnQ+VGhlIHNpemUgaW4gcGl4ZWxzIHRoZSBwcmltaXRpdmUgaXMgZW5sYXJnZWQgYXQgZWFjaCBlZGdlIGR1cmluZyBjb25zZXJ2YXRpdmUgcmFzdGVyaXphdGlvbjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4RXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemU8L25hbWU+PGNvbW1lbnQ+VGhlIG1heGltdW0gYWRkaXRpb25hbCBvdmVyZXN0aW1hdGlvbiB0aGUgY2xpZW50IGNhbiBzcGVjaWZ5IGluIHRoZSBwaXBlbGluZSBzdGF0ZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+ZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemVHcmFudWxhcml0eTwvbmFtZT48Y29tbWVudD5UaGUgZ3JhbnVsYXJpdHkgb2YgZXh0cmEgb3ZlcmVzdGltYXRpb24gc2l6ZXMgdGhlIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0cyBiZXR3ZWVuIDAgYW5kIG1heEV4dHJhT3ZlcmVzdGltYXRpb25TaXplPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5wcmltaXRpdmVVbmRlcmVzdGltYXRpb248L25hbWU+PGNvbW1lbnQ+dHJ1ZSBpZiB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgY29uc2VydmF0aXZlIHJhc3Rlcml6YXRpb24gdW5kZXJlc3RpbWF0aW9uIG1vZGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb248L25hbWU+PGNvbW1lbnQ+dHJ1ZSBpZiBjb25zZXJ2YXRpdmUgcmFzdGVyaXphdGlvbiBhbHNvIGFwcGxpZXMgdG8gcG9pbnRzIGFuZCBsaW5lczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQ8L25hbWU+PGNvbW1lbnQ+dHJ1ZSBpZiBkZWdlbmVyYXRlIHRyaWFuZ2xlcyAodGhvc2Ugd2l0aCB6ZXJvIGFyZWEgYWZ0ZXIgc25hcCkgYXJlIHJhc3Rlcml6ZWQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQ8L25hbWU+PGNvbW1lbnQ+dHJ1ZSBpZiBkZWdlbmVyYXRlIGxpbmVzICh0aG9zZSB3aXRoIHplcm8gbGVuZ3RoIGFmdGVyIHNuYXApIGFyZSByYXN0ZXJpemVkPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5mdWxseUNvdmVyZWRGcmFnbWVudFNoYWRlcklucHV0VmFyaWFibGU8L25hbWU+PGNvbW1lbnQ+dHJ1ZSBpZiB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIEZ1bGx5Q292ZXJlZEVYVCBTUElSLVYgYnVpbHRpbiBmcmFnbWVudCBzaGFkZXIgaW5wdXQgdmFyaWFibGU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qb3N0RGVwdGhDb3ZlcmFnZTwvbmFtZT48Y29tbWVudD50cnVlIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBib3RoIGNvbnNlcnZhdGl2ZSByYXN0ZXJpemF0aW9uIGFuZCBwb3N0IGRlcHRoIGNvdmVyYWdlIHNhbXBsZSBjb3ZlcmFnZSBtYXNrPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0NBTElCUkFURURfVElNRVNUQU1QX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtUaW1lRG9tYWluRVhUPC90eXBlPiAgICAgICAgPG5hbWU+dGltZURvbWFpbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NPUkVfUFJPUEVSVElFU19BTUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICA8bmFtZT5wTmV4dDwvbmFtZT48Y29tbWVudD5Qb2ludGVyIHRvIG5leHQgc3RydWN0dXJlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c2hhZGVyRW5naW5lQ291bnQ8L25hbWU+PGNvbW1lbnQ+bnVtYmVyIG9mIHNoYWRlciBlbmdpbmVzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c2hhZGVyQXJyYXlzUGVyRW5naW5lQ291bnQ8L25hbWU+PGNvbW1lbnQ+bnVtYmVyIG9mIHNoYWRlciBhcnJheXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5jb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheTwvbmFtZT48Y29tbWVudD5udW1iZXIgb2YgcGh5c2ljYWwgQ1VzIHBlciBzaGFkZXIgYXJyYXk8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5zaW1kUGVyQ29tcHV0ZVVuaXQ8L25hbWU+PGNvbW1lbnQ+bnVtYmVyIG9mIFNJTURzIHBlciBjb21wdXRlIHVuaXQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT53YXZlZnJvbnRzUGVyU2ltZDwvbmFtZT48Y29tbWVudD5udW1iZXIgb2Ygd2F2ZWZyb250IHNsb3RzIGluIGVhY2ggU0lNRDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPndhdmVmcm9udFNpemU8L25hbWU+PGNvbW1lbnQ+bWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgd2F2ZWZyb250PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c2dwcnNQZXJTaW1kPC9uYW1lPjxjb21tZW50Pm51bWJlciBvZiBwaHlzaWNhbCBTR1BScyBwZXIgU0lNRDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm1pblNncHJBbGxvY2F0aW9uPC9uYW1lPjxjb21tZW50Pm1pbmltdW0gbnVtYmVyIG9mIFNHUFJzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZCBieSBhIHdhdmU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5tYXhTZ3ByQWxsb2NhdGlvbjwvbmFtZT48Y29tbWVudD5udW1iZXIgb2YgYXZhaWxhYmxlIFNHUFJzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c2dwckFsbG9jYXRpb25HcmFudWxhcml0eTwvbmFtZT48Y29tbWVudD5TR1BScyBhcmUgYWxsb2NhdGVkIGluIGdyb3VwcyBvZiB0aGlzIHNpemU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT52Z3Byc1BlclNpbWQ8L25hbWU+PGNvbW1lbnQ+bnVtYmVyIG9mIHBoeXNpY2FsIFZHUFJzIHBlciBTSU1EPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bWluVmdwckFsbG9jYXRpb248L25hbWU+PGNvbW1lbnQ+bWluaW11bSBudW1iZXIgb2YgVkdQUnMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIGJ5IGEgd2F2ZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm1heFZncHJBbGxvY2F0aW9uPC9uYW1lPjxjb21tZW50Pm51bWJlciBvZiBhdmFpbGFibGUgVkdQUnM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT52Z3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5PC9uYW1lPjxjb21tZW50PlZHUFJzIGFyZSBhbGxvY2F0ZWQgaW4gZ3JvdXBzIG9mIHRoaXMgc2l6ZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfMl9BTUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICA8bmFtZT5wTmV4dDwvbmFtZT48Y29tbWVudD5Qb2ludGVyIHRvIG5leHQgc3RydWN0dXJlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NoYWRlckNvcmVQcm9wZXJ0aWVzRmxhZ3NBTUQ8L3R5cGU+IDxuYW1lPnNoYWRlckNvcmVGZWF0dXJlczwvbmFtZT48Y29tbWVudD5mZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhlIHNoYWRlciBjb3JlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+YWN0aXZlQ29tcHV0ZVVuaXRDb3VudDwvbmFtZT48Y29tbWVudD5udW1iZXIgb2YgYWN0aXZlIGNvbXB1dGUgdW5pdHMgYWNyb3NzIGFsbCBzaGFkZXIgZW5naW5lcy9hcnJheXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0NPTlNFUlZBVElWRV9TVEFURV9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4gICAgICAgICAgICAgICAgIDwhLS0gUG9pbnRlciB0byBuZXh0IHN0cnVjdHVyZSAtLT4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVGbGFnc0VYVDwvdHlwZT4gICAgICAgICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPiAgICAgICAgICAgICAgICAgPCEtLSBSZXNlcnZlZCAtLT4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlPC9uYW1lPjwvbWVtYmVyPiAgICAgIDwhLS0gQ29uc2VydmF0aXZlIHJhc3Rlcml6YXRpb24gbW9kZSAtLT4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+ZmxvYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplPC9uYW1lPjwvbWVtYmVyPiAgIDwhLS0gRXh0cmEgb3ZlcmVzdGltYXRpb24gdG8gYWRkIHRvIHRoZSBwcmltaXRpdmUgLS0+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfRkVBVFVSRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5ydW50aW1lRGVzY3JpcHRvckFycmF5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29sczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnJvYnVzdEJ1ZmZlckFjY2Vzc1VwZGF0ZUFmdGVyQmluZDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+cXVhZERpdmVyZ2VudEltcGxpY2l0TG9kPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVyczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhQZXJTdGFnZVVwZGF0ZUFmdGVyQmluZFJlc291cmNlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyc0R5bmFtaWM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzRHluYW1pYzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YmluZGluZ0NvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImJpbmRpbmdDb3VudCIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVDwvdHlwZT4qIDxuYW1lPnBCaW5kaW5nRmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9BTExPQ0FURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yU2V0Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iZGVzY3JpcHRvclNldENvdW50Ij5jb25zdCA8dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBEZXNjcmlwdG9yQ291bnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCIgc3RydWN0ZXh0ZW5kcz0iVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgIDxuYW1lPm1heFZhcmlhYmxlRGVzY3JpcHRvckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl8yX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnczwvdHlwZT4gPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5mb3JtYXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2FtcGxlQ291bnRGbGFnQml0czwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zYW1wbGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0F0dGFjaG1lbnRMb2FkT3A8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bG9hZE9wPC9uYW1lPjxjb21tZW50PkxvYWQgb3BlcmF0aW9uIGZvciBjb2xvciBvciBkZXB0aCBkYXRhPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0F0dGFjaG1lbnRTdG9yZU9wPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3RvcmVPcDwvbmFtZT48Y29tbWVudD5TdG9yZSBvcGVyYXRpb24gZm9yIGNvbG9yIG9yIGRlcHRoIGRhdGE8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQXR0YWNobWVudExvYWRPcDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zdGVuY2lsTG9hZE9wPC9uYW1lPjxjb21tZW50PkxvYWQgb3BlcmF0aW9uIGZvciBzdGVuY2lsIGRhdGE8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQXR0YWNobWVudFN0b3JlT3A8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zdGVuY2lsU3RvcmVPcDwvbmFtZT48Y29tbWVudD5TdG9yZSBvcGVyYXRpb24gZm9yIHN0ZW5jaWwgZGF0YTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZUxheW91dDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmluaXRpYWxMYXlvdXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VMYXlvdXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5maW5hbExheW91dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV8yX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5hdHRhY2htZW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmxheW91dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPlZrSW1hZ2VBc3BlY3RGbGFnczwvdHlwZT4gPG5hbWU+YXNwZWN0TWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fMl9LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3M8L3R5cGU+ICAgICAgICAgICAgICAgICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BpcGVsaW5lQmluZFBvaW50PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGlwZWxpbmVCaW5kUG9pbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52aWV3TWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmlucHV0QXR0YWNobWVudENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImlucHV0QXR0YWNobWVudENvdW50Ij5jb25zdCA8dHlwZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSPC90eXBlPiogPG5hbWU+cElucHV0QXR0YWNobWVudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb2xvckF0dGFjaG1lbnRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJjb2xvckF0dGFjaG1lbnRDb3VudCI+Y29uc3QgPHR5cGU+VmtBdHRhY2htZW50UmVmZXJlbmNlMktIUjwvdHlwZT4qIDxuYW1lPnBDb2xvckF0dGFjaG1lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbGVuPSJjb2xvckF0dGFjaG1lbnRDb3VudCI+Y29uc3QgPHR5cGU+VmtBdHRhY2htZW50UmVmZXJlbmNlMktIUjwvdHlwZT4qIDxuYW1lPnBSZXNvbHZlQXR0YWNobWVudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXNlcnZlQXR0YWNobWVudENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InByZXNlcnZlQXR0YWNobWVudENvdW50Ij5jb25zdCA8dHlwZT51aW50MzJfdDwvdHlwZT4qICAgICAgICAgICAgICAgPG5hbWU+cFByZXNlcnZlQXR0YWNobWVudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zcmNTdWJwYXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRzdFN1YnBhc3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVTdGFnZUZsYWdzPC90eXBlPiAgICAgICAgICAgICAgPG5hbWU+c3JjU3RhZ2VNYXNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BpcGVsaW5lU3RhZ2VGbGFnczwvdHlwZT4gICAgICAgICAgICAgIDxuYW1lPmRzdFN0YWdlTWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQWNjZXNzRmxhZ3M8L3R5cGU+ICAgICA8bmFtZT5zcmNBY2Nlc3NNYXNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtBY2Nlc3NGbGFnczwvdHlwZT4gICAgIDxuYW1lPmRzdEFjY2Vzc01hc2s8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0RlcGVuZGVuY3lGbGFnczwvdHlwZT4gPG5hbWU+ZGVwZW5kZW5jeUZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+aW50MzJfdDwvdHlwZT4gICAgICAgICAgIDxuYW1lPnZpZXdPZmZzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPXzJfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1JlbmRlclBhc3NDcmVhdGVGbGFnczwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmF0dGFjaG1lbnRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJhdHRhY2htZW50Q291bnQiPmNvbnN0IDx0eXBlPlZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUjwvdHlwZT4qIDxuYW1lPnBBdHRhY2htZW50czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN1YnBhc3NDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJzdWJwYXNzQ291bnQiPmNvbnN0IDx0eXBlPlZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUjwvdHlwZT4qICAgICAgIDxuYW1lPnBTdWJwYXNzZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZXBlbmRlbmN5Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iZGVwZW5kZW5jeUNvdW50Ij5jb25zdCA8dHlwZT5Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUjwvdHlwZT4qICAgICA8bmFtZT5wRGVwZW5kZW5jaWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y29ycmVsYXRlZFZpZXdNYXNrQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iY29ycmVsYXRlZFZpZXdNYXNrQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogICAgICAgICAgICA8bmFtZT5wQ29ycmVsYXRlZFZpZXdNYXNrczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1N1YnBhc3NCZWdpbkluZm9LSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1N1YnBhc3NDb250ZW50czwvdHlwZT4gICAgICA8bmFtZT5jb250ZW50czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1N1YnBhc3NFbmRJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0VORF9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX0ZFQVRVUkVTX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnRpbWVsaW5lU2VtYXBob3JlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtTZW1hcGhvcmVDcmVhdGVJbmZvLFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2VtYXBob3JlVHlwZUtIUjwvdHlwZT4gICAgIDxuYW1lPnNlbWFwaG9yZVR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmluaXRpYWxWYWx1ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtTdWJtaXRJbmZvLFZrQmluZFNwYXJzZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgIDxuYW1lPndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbGVuPSJ3YWl0U2VtYXBob3JlVmFsdWVDb3VudCI+Y29uc3QgPHR5cGU+dWludDY0X3Q8L3R5cGU+KiA8bmFtZT5wV2FpdFNlbWFwaG9yZVZhbHVlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgIDxuYW1lPnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIiBsZW49InNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQiPmNvbnN0IDx0eXBlPnVpbnQ2NF90PC90eXBlPiogPG5hbWU+cFNpZ25hbFNlbWFwaG9yZVZhbHVlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1NlbWFwaG9yZVdhaXRJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfV0FJVF9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1NlbWFwaG9yZVdhaXRGbGFnc0tIUjwvdHlwZT4gPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnNlbWFwaG9yZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InNlbWFwaG9yZUNvdW50Ij5jb25zdCA8dHlwZT5Wa1NlbWFwaG9yZTwvdHlwZT4qIDxuYW1lPnBTZW1hcGhvcmVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InNlbWFwaG9yZUNvdW50Ij5jb25zdCA8dHlwZT51aW50NjRfdDwvdHlwZT4qICAgIDxuYW1lPnBWYWx1ZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfU0lHTkFMX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+ICAgICAgICAgICAgPG5hbWU+c2VtYXBob3JlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVCI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICA8bmFtZT5iaW5kaW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgPG5hbWU+ZGl2aXNvcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9ESVZJU09SX1NUQVRFX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJ2ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50Ij5jb25zdCA8dHlwZT5Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVDwvdHlwZT4qICAgICAgPG5hbWU+cFZlcnRleEJpbmRpbmdEaXZpc29yczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX1BST1BFUlRJRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VmVydGV4QXR0cmliRGl2aXNvcjwvbmFtZT48Y29tbWVudD5tYXggdmFsdWUgb2YgdmVydGV4IGF0dHJpYnV0ZSBkaXZpc29yPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QQ0lfQlVTX0lORk9fUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5wY2lEb21haW48L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnBjaUJ1czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+cGNpRGV2aWNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5wY2lGdW5jdGlvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIiBzdHJ1Y3RleHRlbmRzPSJWa01lbW9yeUFsbG9jYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPnN0cnVjdCA8dHlwZT5BSGFyZHdhcmVCdWZmZXI8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPmJ1ZmZlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCIgc3RydWN0ZXh0ZW5kcz0iVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1VTQUdFX0FORFJPSUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5hbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1BST1BFUlRJRVNfQU5EUk9JRCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmFsbG9jYXRpb25TaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tZW1vcnlUeXBlQml0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlTWVtb3J5PC90eXBlPiAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1lbW9yeTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIiBzdHJ1Y3RleHRlbmRzPSJWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Zvcm1hdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5mb3JtYXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmV4dGVybmFsRm9ybWF0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Zvcm1hdEZlYXR1cmVGbGFnczwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5mb3JtYXRGZWF0dXJlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDb21wb25lbnRNYXBwaW5nPC90eXBlPiAgICAgICAgICAgICAgICAgPG5hbWU+c2FtcGxlclljYmNyQ29udmVyc2lvbkNvbXBvbmVudHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uPC90eXBlPiAgICAgIDxuYW1lPnN1Z2dlc3RlZFljYmNyTW9kZWw8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2FtcGxlclljYmNyUmFuZ2U8L3R5cGU+ICAgICAgICAgICAgICAgIDxuYW1lPnN1Z2dlc3RlZFljYmNyUmFuZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ2hyb21hTG9jYXRpb248L3R5cGU+ICAgICAgICAgICAgICAgICAgIDxuYW1lPnN1Z2dlc3RlZFhDaHJvbWFPZmZzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ2hyb21hTG9jYXRpb248L3R5cGU+ICAgICAgICAgICAgICAgICAgIDxuYW1lPnN1Z2dlc3RlZFlDaHJvbWFPZmZzZXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZTwvbmFtZT48Y29tbWVudD5XaGV0aGVyIHRoaXMgc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyIG1heSBiZSBleGVjdXRlZCBkdXJpbmcgYW4gYWN0aXZlIGNvbmRpdGlvbmFsIHJlbmRlcmluZzwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCIgc3RydWN0ZXh0ZW5kcz0iVmtJbWFnZUNyZWF0ZUluZm8sVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5leHRlcm5hbEZvcm1hdDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV84QklUX1NUT1JBR0VfRkVBVFVSRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zdG9yYWdlQnVmZmVyOEJpdEFjY2VzczwvbmFtZT48Y29tbWVudD44LWJpdCBpbnRlZ2VyIHZhcmlhYmxlcyBzdXBwb3J0ZWQgaW4gU3RvcmFnZUJ1ZmZlcjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2VzczwvbmFtZT48Y29tbWVudD44LWJpdCBpbnRlZ2VyIHZhcmlhYmxlcyBzdXBwb3J0ZWQgaW4gU3RvcmFnZUJ1ZmZlciBhbmQgVW5pZm9ybTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN0b3JhZ2VQdXNoQ29uc3RhbnQ4PC9uYW1lPjxjb21tZW50PjgtYml0IGludGVnZXIgdmFyaWFibGVzIHN1cHBvcnRlZCBpbiBQdXNoQ29uc3RhbnQ8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmNvbmRpdGlvbmFsUmVuZGVyaW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dnVsa2FuTWVtb3J5TW9kZWw8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52dWxrYW5NZW1vcnlNb2RlbERldmljZVNjb3BlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dnVsa2FuTWVtb3J5TW9kZWxBdmFpbGFiaWxpdHlWaXNpYmlsaXR5Q2hhaW5zPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9BVE9NSUNfSU5UNjRfRkVBVFVSRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJCdWZmZXJJbnQ2NEF0b21pY3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3I8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYiIHN0cnVjdGV4dGVuZHM9IlZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfQ0hFQ0tQT0lOVF9QUk9QRVJUSUVTX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BpcGVsaW5lU3RhZ2VGbGFnczwvdHlwZT4gPG5hbWU+Y2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFzazwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0NoZWNrcG9pbnREYXRhTlYiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQ0hFQ0tQT0lOVF9EQVRBX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM8L3R5cGU+ICAgPG5hbWU+c3RhZ2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cENoZWNrcG9pbnRNYXJrZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9QUk9QRVJUSUVTX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtSZXNvbHZlTW9kZUZsYWdzS0hSPC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5zdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlczwvbmFtZT48Y29tbWVudD5zdXBwb3J0ZWQgZGVwdGggcmVzb2x2ZSBtb2RlczwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtSZXNvbHZlTW9kZUZsYWdzS0hSPC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5zdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzPC9uYW1lPjxjb21tZW50PnN1cHBvcnRlZCBzdGVuY2lsIHJlc29sdmUgbW9kZXM8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aW5kZXBlbmRlbnRSZXNvbHZlTm9uZTwvbmFtZT48Y29tbWVudD5kZXB0aCBhbmQgc3RlbmNpbCByZXNvbHZlIG1vZGVzIGNhbiBiZSBzZXQgaW5kZXBlbmRlbnRseSBpZiBvbmUgb2YgdGhlbSBpcyBub25lPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmluZGVwZW5kZW50UmVzb2x2ZTwvbmFtZT48Y29tbWVudD5kZXB0aCBhbmQgc3RlbmNpbCByZXNvbHZlIG1vZGVzIGNhbiBiZSBzZXQgaW5kZXBlbmRlbnRseTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIiIHN0cnVjdGV4dGVuZHM9IlZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZXB0aFJlc29sdmVNb2RlPC9uYW1lPjxjb21tZW50PmRlcHRoIHJlc29sdmUgbW9kZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN0ZW5jaWxSZXNvbHZlTW9kZTwvbmFtZT48Y29tbWVudD5zdGVuY2lsIHJlc29sdmUgbW9kZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFI8L3R5cGU+KiAgICAgICAgIDxuYW1lPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudDwvbmFtZT48Y29tbWVudD5kZXB0aC9zdGVuY2lsIHJlc29sdmUgYXR0YWNobWVudDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlVmlld0NyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtGb3JtYXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlY29kZU1vZGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlY29kZU1vZGVTaGFyZWRFeHBvbmVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dHJhbnNmb3JtRmVlZGJhY2s8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmdlb21ldHJ5U3RyZWFtczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19QUk9QRVJUSUVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICA8bmFtZT5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlclNpemU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRGF0YVNpemU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVNpemU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT50cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT50cmFuc2Zvcm1GZWVkYmFja0RyYXc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1NUUkVBTV9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVGbGFnc0VYVDwvdHlwZT4gICAgICAgICAgICAgICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cmFzdGVyaXphdGlvblN0cmVhbTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfRkVBVFVSRVNfTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT48bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5yZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9TVEFURV9DUkVBVEVfSU5GT19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgPG5hbWU+cmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYQ0xVU0lWRV9TQ0lTU09SX0ZFQVRVUkVTX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5leGNsdXNpdmVTY2lzc29yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9FWENMVVNJVkVfU0NJU1NPUl9TVEFURV9DUkVBVEVfSU5GT19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZXhjbHVzaXZlU2Npc3NvckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49ImV4Y2x1c2l2ZVNjaXNzb3JDb3VudCIgb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrUmVjdDJEPC90eXBlPiogICAgPG5hbWU+cEV4Y2x1c2l2ZVNjaXNzb3JzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPUk5FUl9TQU1QTEVEX0lNQUdFX0ZFQVRVUkVTX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y29ybmVyU2FtcGxlZEltYWdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb21wdXRlRGVyaXZhdGl2ZUdyb3VwUXVhZHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRkVBVFVSRVNfTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0ZFQVRVUkVTX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aW1hZ2VGb290cHJpbnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19GRUFUVVJFU19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0ic2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudCI+Y29uc3QgPHR5cGU+VmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WPC90eXBlPiogIDxuYW1lPnBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViIgc3RydWN0ZXh0ZW5kcz0iVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfSU1BR0VfU1RBVEVfQ1JFQVRFX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkaW5nUmF0ZUltYWdlRW5hYmxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dmlld3BvcnRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJ2aWV3cG9ydENvdW50IiBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtTaGFkaW5nUmF0ZVBhbGV0dGVOVjwvdHlwZT4qICAgICAgPG5hbWU+cFNoYWRpbmdSYXRlUGFsZXR0ZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9GRUFUVVJFU19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGluZ1JhdGVJbWFnZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX1BST1BFUlRJRVNfTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRpbmdSYXRlVGV4ZWxTaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGluZ1JhdGVQYWxldHRlU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRpbmdSYXRlTWF4Q29hcnNlU2FtcGxlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGl4ZWxYPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGl4ZWxZPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2FtcGxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVjwvdHlwZT4gICAgICAgICA8bmFtZT5zaGFkaW5nUmF0ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNhbXBsZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2FtcGxlTG9jYXRpb25Db3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJzYW1wbGVMb2NhdGlvbkNvdW50Ij5jb25zdCA8dHlwZT5Wa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlY8L3R5cGU+KiA8bmFtZT5wU2FtcGxlTG9jYXRpb25zPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYiIHN0cnVjdGV4dGVuZHM9IlZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfQ09BUlNFX1NBTVBMRV9PUkRFUl9TVEFURV9DUkVBVEVfSU5GT19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlY8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNhbXBsZU9yZGVyVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y3VzdG9tU2FtcGxlT3JkZXJDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJjdXN0b21TYW1wbGVPcmRlckNvdW50Ij5jb25zdCA8dHlwZT5Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlY8L3R5cGU+KiAgICAgICAgPG5hbWU+cEN1c3RvbVNhbXBsZU9yZGVyczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfRkVBVFVSRVNfTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnRhc2tTaGFkZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tZXNoU2hhZGVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX1BST1BFUlRJRVNfTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heERyYXdNZXNoVGFza3NDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heFRhc2tXb3JrR3JvdXBJbnZvY2F0aW9uczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heFRhc2tXb3JrR3JvdXBTaXplPC9uYW1lPlszXTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4VGFza1RvdGFsTWVtb3J5U2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heFRhc2tPdXRwdXRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heE1lc2hXb3JrR3JvdXBJbnZvY2F0aW9uczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heE1lc2hXb3JrR3JvdXBTaXplPC9uYW1lPlszXTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4TWVzaFRvdGFsTWVtb3J5U2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heE1lc2hPdXRwdXRWZXJ0aWNlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heE1lc2hPdXRwdXRQcmltaXRpdmVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4TWVzaE11bHRpdmlld1ZpZXdDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1lc2hPdXRwdXRQZXJWZXJ0ZXhHcmFudWxhcml0eTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnRhc2tDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+Zmlyc3RUYXNrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOVjwvdHlwZT4gPG5hbWU+dHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+Z2VuZXJhbFNoYWRlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+Y2xvc2VzdEhpdFNoYWRlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+YW55SGl0U2hhZGVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5pbnRlcnNlY3Rpb25TaGFkZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVDcmVhdGVGbGFnczwvdHlwZT4gIDxuYW1lPmZsYWdzPC9uYW1lPjxjb21tZW50PlBpcGVsaW5lIGNyZWF0aW9uIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5zdGFnZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49InN0YWdlQ291bnQiPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wU3RhZ2VzPC9uYW1lPjxjb21tZW50Pk9uZSBlbnRyeSBmb3IgZWFjaCBhY3RpdmUgc2hhZGVyIHN0YWdlPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5ncm91cENvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49Imdyb3VwQ291bnQiPmNvbnN0IDx0eXBlPlZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WPC90eXBlPiogPG5hbWU+cEdyb3VwczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bWF4UmVjdXJzaW9uRGVwdGg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVMYXlvdXQ8L3R5cGU+ICAgICAgIDxuYW1lPmxheW91dDwvbmFtZT48Y29tbWVudD5JbnRlcmZhY2UgbGF5b3V0IG9mIHRoZSBwaXBlbGluZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lPC90eXBlPiAgICAgIDxuYW1lPmJhc2VQaXBlbGluZUhhbmRsZTwvbmFtZT48Y29tbWVudD5JZiBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgaXMgc2V0IGFuZCB0aGlzIHZhbHVlIGlzIG5vbnplcm8sIGl0IHNwZWNpZmllcyB0aGUgaGFuZGxlIG9mIHRoZSBiYXNlIHBpcGVsaW5lIHRoaXMgaXMgYSBkZXJpdmF0aXZlIG9mPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5pbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5iYXNlUGlwZWxpbmVJbmRleDwvbmFtZT48Y29tbWVudD5JZiBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgaXMgc2V0IGFuZCB0aGlzIHZhbHVlIGlzIG5vdCAtMSwgaXQgc3BlY2lmaWVzIGFuIGluZGV4IGludG8gcENyZWF0ZUluZm9zIG9mIHRoZSBiYXNlIHBpcGVsaW5lIHRoaXMgaXMgYSBkZXJpdmF0aXZlIG9mPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrR2VvbWV0cnlUcmlhbmdsZXNOViI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICA8bmFtZT52ZXJ0ZXhEYXRhPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+dmVydGV4T2Zmc2V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgPG5hbWU+dmVydGV4Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT52ZXJ0ZXhTdHJpZGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRm9ybWF0PC90eXBlPiAgICAgICAgICAgICAgICAgICA8bmFtZT52ZXJ0ZXhGb3JtYXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICA8bmFtZT5pbmRleERhdGE8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5pbmRleE9mZnNldDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgIDxuYW1lPmluZGV4Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW5kZXhUeXBlPC90eXBlPiAgICAgICAgICAgICAgICA8bmFtZT5pbmRleFR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICA8bmFtZT50cmFuc2Zvcm1EYXRhPC9uYW1lPjxjb21tZW50Pk9wdGlvbmFsIHJlZmVyZW5jZSB0byBhcnJheSBvZiBmbG9hdHMgcmVwcmVzZW50aW5nIGEgM3g0IHJvdyBtYWpvciBhZmZpbmUgdHJhbnNmb3JtYXRpb24gbWF0cml4LjwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPnRyYW5zZm9ybU9mZnNldDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0dlb21ldHJ5QUFCQk5WIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICA8bmFtZT5hYWJiRGF0YTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgIDxuYW1lPm51bUFBQkJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgPG5hbWU+c3RyaWRlPC9uYW1lPjxjb21tZW50PlN0cmlkZSBpbiBieXRlcyBiZXR3ZWVuIEFBQkJzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+b2Zmc2V0PC9uYW1lPjxjb21tZW50Pk9mZnNldCBpbiBieXRlcyBvZiB0aGUgZmlyc3QgQUFCQiBpbiBhYWJiRGF0YTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0dlb21ldHJ5RGF0YU5WIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtHZW9tZXRyeVRyaWFuZ2xlc05WPC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPnRyaWFuZ2xlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtHZW9tZXRyeUFBQkJOVjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmFhYmJzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrR2VvbWV0cnlOViI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0dlb21ldHJ5VHlwZU5WPC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPmdlb21ldHJ5VHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtHZW9tZXRyeURhdGFOVjwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5nZW9tZXRyeTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrR2VvbWV0cnlGbGFnc05WPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WPC90eXBlPiAgICAgICAgIDxuYW1lPnR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOVjwvdHlwZT48bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmluc3RhbmNlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5nZW9tZXRyeUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBsZW49Imdlb21ldHJ5Q291bnQiPmNvbnN0IDx0eXBlPlZrR2VvbWV0cnlOVjwvdHlwZT4qIDxuYW1lPnBHZW9tZXRyaWVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NSRUFURV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb21wYWN0ZWRTaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjwvdHlwZT4gICAgICAgICAgPG5hbWU+aW5mbzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfSU5GT19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC90eXBlPiAgICAgICAgPG5hbWU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZU1lbW9yeTwvdHlwZT4gICAgICAgICAgICAgICAgICAgPG5hbWU+bWVtb3J5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWVtb3J5T2Zmc2V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgPG5hbWU+ZGV2aWNlSW5kZXhDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJkZXZpY2VJbmRleENvdW50Ij5jb25zdCA8dHlwZT51aW50MzJfdDwvdHlwZT4qICA8bmFtZT5wRGV2aWNlSW5kaWNlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiBzdHJ1Y3RleHRlbmRzPSJWa1dyaXRlRGVzY3JpcHRvclNldCI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQiPmNvbnN0IDx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L3R5cGU+KiA8bmFtZT5wQWNjZWxlcmF0aW9uU3RydWN0dXJlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlY8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkFZX1RSQUNJTkdfUFJPUEVSVElFU19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyR3JvdXBIYW5kbGVTaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4UmVjdXJzaW9uRGVwdGg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhTaGFkZXJHcm91cFN0cmlkZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlckdyb3VwQmFzZUFsaWdubWVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heEdlb21ldHJ5Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXhJbnN0YW5jZUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF4VHJpYW5nbGVDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa0Zvcm1hdFByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfTElTVF9FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5kcm1Gb3JtYXRNb2RpZmllckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSxmYWxzZSIgbGVuPSJkcm1Gb3JtYXRNb2RpZmllckNvdW50Ij48dHlwZT5Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVDwvdHlwZT4qIDxuYW1lPnBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiA8bmFtZT5kcm1Gb3JtYXRNb2RpZmllcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtGb3JtYXRGZWF0dXJlRmxhZ3M8L3R5cGU+IDxuYW1lPmRybUZvcm1hdE1vZGlmaWVyVGlsaW5nRmVhdHVyZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+IDxuYW1lPmRybUZvcm1hdE1vZGlmaWVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1NoYXJpbmdNb2RlPC90eXBlPiA8bmFtZT5zaGFyaW5nTW9kZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5xdWV1ZUZhbWlseUluZGV4Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBsZW49InF1ZXVlRmFtaWx5SW5kZXhDb3VudCI+Y29uc3QgPHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUXVldWVGYW1pbHlJbmRpY2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9MSVNUX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZHJtRm9ybWF0TW9kaWZpZXJDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJkcm1Gb3JtYXRNb2RpZmllckNvdW50Ij5jb25zdCA8dHlwZT51aW50NjRfdDwvdHlwZT4qIDxuYW1lPnBEcm1Gb3JtYXRNb2RpZmllcnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+IDxuYW1lPmRybUZvcm1hdE1vZGlmaWVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0iZmFsc2UiPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50Ij5jb25zdCA8dHlwZT5Wa1N1YnJlc291cmNlTGF5b3V0PC90eXBlPiogPG5hbWU+cFBsYW5lTGF5b3V0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+IDxuYW1lPmRybUZvcm1hdE1vZGlmaWVyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa0ltYWdlQ3JlYXRlSW5mbyxWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtJbWFnZVVzYWdlRmxhZ3M8L3R5cGU+IDxuYW1lPnN0ZW5jaWxVc2FnZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCIgIHN0cnVjdGV4dGVuZHM9IlZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EPC90eXBlPiA8bmFtZT5vdmVyYWxsb2NhdGlvbkJlaGF2aW9yPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZnJhZ21lbnREZW5zaXR5TWFwPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYzwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmZyYWdtZW50RGVuc2l0eU1hcE5vblN1YnNhbXBsZWRJbWFnZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtFeHRlbnQyRDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrUmVuZGVyUGFzc0NyZWF0ZUluZm8sVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0F0dGFjaG1lbnRSZWZlcmVuY2U8L3R5cGU+ICAgICAgICAgICAgPG5hbWU+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2NhbGFyQmxvY2tMYXlvdXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiA8bmFtZT5zdXBwb3J0c1Byb3RlY3RlZDwvbmFtZT48Y29tbWVudD5SZXByZXNlbnRzIGlmIHN1cmZhY2UgY2FuIGJlIHByb3RlY3RlZDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVU5JRk9STV9CVUZGRVJfU1RBTkRBUkRfTEFZT1VUX0ZFQVRVUkVTX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9DTElQX0VOQUJMRV9GRUFUVVJFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjxjb21tZW50PlBvaW50ZXIgdG8gbmV4dCBzdHJ1Y3R1cmU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlcHRoQ2xpcEVuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fREVQVEhfQ0xJUF9TVEFURV9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+ICAgICAgICAgICAgICAgICA8IS0tIFBvaW50ZXIgdG8gbmV4dCBzdHJ1Y3R1cmUgLS0+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlRmxhZ3NFWFQ8L3R5cGU+ICAgICAgICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+ICAgICAgICAgICAgICAgICA8IS0tIFJlc2VydmVkIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlcHRoQ2xpcEVuYWJsZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfQlVER0VUX1BST1BFUlRJRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aGVhcEJ1ZGdldDwvbmFtZT5bPGVudW0+VktfTUFYX01FTU9SWV9IRUFQUzwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmhlYXBVc2FnZTwvbmFtZT5bPGVudW0+VktfTUFYX01FTU9SWV9IRUFQUzwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BSSU9SSVRZX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1lbW9yeVByaW9yaXR5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrTWVtb3J5QWxsb2NhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUFJJT1JJVFlfQUxMT0NBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmlvcml0eTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWZmZXJEZXZpY2VBZGRyZXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0RFVklDRV9BRERSRVNTX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmJ1ZmZlckRldmljZUFkZHJlc3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUJ1ZmZlckFkZHJlc3NGZWF0dXJlc0VYVCIgICAgICAgYWxpYXM9IlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmJ1ZmZlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvRVhUIiBhbGlhcz0iVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiIvPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtCdWZmZXJDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19DUkVBVEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9wYXF1ZUNhcHR1cmVBZGRyZXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQiIHN0cnVjdGV4dGVuZHM9IlZrQnVmZmVyQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0RldmljZUFkZHJlc3M8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+ZGV2aWNlQWRkcmVzczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VWaWV3VHlwZTwvdHlwZT4gICAgICAgICAgICAgICAgICA8bmFtZT5pbWFnZVZpZXdUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9GSUxURVJfQ1VCSUNfSU1BR0VfVklFV19JTUFHRV9GT1JNQVRfUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmZpbHRlckN1YmljPC9uYW1lPjwvbWVtYmVyPiA8IS0tIFRoZSBjb21iaW5hdGlvbnMgb2YgZm9ybWF0LCBpbWFnZSB0eXBlIChhbmQgaW1hZ2UgdmlldyB0eXBlIGlmIHByb3ZpZGVkKSBjYW4gYmUgZmlsdGVyZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZmlsdGVyQ3ViaWNNaW5tYXg8L25hbWU+IDwvbWVtYmVyPiA8IS0tIFRoZSBjb21iaW5hdGlvbiBvZiBmb3JtYXQsIGltYWdlIHR5cGUgKGFuZCBpbWFnZSB2aWV3IHR5cGUgaWYgcHJvdmlkZWQpIGNhbiBiZSBmaWx0ZXJlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYW5kIFJlZHVjdGlvbk1vZGUgb2YgTWluIG9yIE1heCAtLT4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aW1hZ2VsZXNzRnJhbWVidWZmZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRTX0NSRUFURV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgIDxuYW1lPmF0dGFjaG1lbnRJbWFnZUluZm9Db3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQiPmNvbnN0IDx0eXBlPlZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSPC90eXBlPiogPG5hbWU+cEF0dGFjaG1lbnRJbWFnZUluZm9zPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0lNQUdFX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSW1hZ2VDcmVhdGVGbGFnczwvdHlwZT4gICAgICAgPG5hbWU+ZmxhZ3M8L25hbWU+PGNvbW1lbnQ+SW1hZ2UgY3JlYXRpb24gZmxhZ3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VVc2FnZUZsYWdzPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnVzYWdlPC9uYW1lPjxjb21tZW50PkltYWdlIHVzYWdlIGZsYWdzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT53aWR0aDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+aGVpZ2h0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5sYXllckNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICA8bmFtZT52aWV3Rm9ybWF0Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0idmlld0Zvcm1hdENvdW50Ij5jb25zdCA8dHlwZT5Wa0Zvcm1hdDwvdHlwZT4qICAgIDxuYW1lPnBWaWV3Rm9ybWF0czwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa1JlbmRlclBhc3NCZWdpbkluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0FUVEFDSE1FTlRfQkVHSU5fSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPiAgICAgICAgICAgICA8IS0tIFBvaW50ZXIgdG8gbmV4dCBzdHJ1Y3R1cmUgLS0+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgIDxuYW1lPmF0dGFjaG1lbnRDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJhdHRhY2htZW50Q291bnQiPmNvbnN0IDx0eXBlPlZrSW1hZ2VWaWV3PC90eXBlPiogPG5hbWU+cEF0dGFjaG1lbnRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9GRUFUVVJFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT50ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9GRUFUVVJFU19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y29vcGVyYXRpdmVNYXRyaXg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb29wZXJhdGl2ZU1hdHJpeFJvYnVzdEJ1ZmZlckFjY2VzczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYiIHJldHVybmVkb25seT0idHJ1ZSIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTaGFkZXJTdGFnZUZsYWdzPC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPmNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0NPT1BFUkFUSVZFX01BVFJJWF9QUk9QRVJUSUVTX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5NU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPk5TaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+S1NpemU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29tcG9uZW50VHlwZU5WPC90eXBlPiAgICAgICAgICAgICAgICAgICA8bmFtZT5BVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtDb21wb25lbnRUeXBlTlY8L3R5cGU+ICAgICAgICAgICAgICAgICAgIDxuYW1lPkJUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0NvbXBvbmVudFR5cGVOVjwvdHlwZT4gICAgICAgICAgICAgICAgICAgPG5hbWU+Q1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ29tcG9uZW50VHlwZU5WPC90eXBlPiAgICAgICAgICAgICAgICAgICA8bmFtZT5EVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTY29wZU5WPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfWUNCQ1JfSU1BR0VfQVJSQVlTX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnljYmNySW1hZ2VBcnJheXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0hBTkRMRV9JTkZPX05WWCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VWaWV3PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbWFnZVZpZXc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGVzY3JpcHRvclR5cGU8L3R5cGU+ICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZXNjcmlwdG9yVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrU2FtcGxlcjwvdHlwZT4gICAgICAgICAgIDxuYW1lPnNhbXBsZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQcmVzZW50RnJhbWVUb2tlbkdHUCIgc3RydWN0ZXh0ZW5kcz0iVmtQcmVzZW50SW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9GUkFNRV9UT0tFTl9HR1AiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+R2dwRnJhbWVUb2tlbjwvdHlwZT4gICAgICAgICAgICAgICAgICAgIDxuYW1lPmZyYW1lVG9rZW48L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ3NFWFQ8L3R5cGU+ICA8bmFtZT5mbGFnczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmR1cmF0aW9uPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyxWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8sVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVDwvdHlwZT4qICAgICAgPG5hbWU+cFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjazwvbmFtZT48Y29tbWVudD5PdXRwdXQgcGlwZWxpbmUgY3JlYXRpb24gZmVlZGJhY2suPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbGVuPSJwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50Ij48dHlwZT5Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVDwvdHlwZT4qIDxuYW1lPnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3M8L25hbWU+PGNvbW1lbnQ+T25lIGVudHJ5IGZvciBlYWNoIHNoYWRlciBzdGFnZSBzcGVjaWZpZWQgaW4gdGhlIHBhcmVudCBWaypQaXBlbGluZUNyZWF0ZUluZm8gc3RydWN0PC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUPC90eXBlPiAgICAgICAgIDxuYW1lPmZ1bGxTY3JlZW5FeGNsdXNpdmU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUixWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX1dJTjMyX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+SE1PTklUT1I8L3R5cGU+ICAgICAgICAgPG5hbWU+aG1vbml0b3I8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCIgc3RydWN0ZXh0ZW5kcz0iVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgIDxuYW1lPmZ1bGxTY3JlZW5FeGNsdXNpdmVTdXBwb3J0ZWQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9GRUFUVVJFU19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHM8L25hbWU+PGNvbW1lbnQ+cGVyZm9ybWFuY2UgY291bnRlcnMgc3VwcG9ydGVkIGluIHF1ZXJ5IHBvb2xzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzPC9uYW1lPjxjb21tZW50PnBlcmZvcm1hbmNlIGNvdW50ZXJzIGZyb20gbXVsdGlwbGUgcXVlcnkgcG9vbHMgY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSBzYW1lIHByaW1hcnkgY29tbWFuZCBidWZmZXI8L2NvbW1lbnQ+PC9tZW1iZXI+ICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiPgorICAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfUFJPUEVSVElFU19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+VmtCb29sMzI8L3R5cGU+IDxuYW1lPmFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzPC9uYW1lPjxjb21tZW50PkZsYWcgdG8gc3BlY2lmeSB3aGV0aGVyIHBlcmZvcm1hbmNlIHF1ZXJpZXMgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCBpbiB2a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGVyZm9ybWFuY2VDb3VudGVyS0hSIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPiA8IS0tIFBvaW50ZXIgdG8gbmV4dCBzdHJ1Y3R1cmUgLS0+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUjwvdHlwZT4gICAgICAgIDxuYW1lPnVuaXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFI8L3R5cGU+ICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFI8L3R5cGU+ICAgICA8bmFtZT5zdG9yYWdlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50OF90PC90eXBlPiA8bmFtZT51dWlkPC9uYW1lPls8ZW51bT5WS19VVUlEX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+IDwhLS0gUG9pbnRlciB0byBuZXh0IHN0cnVjdHVyZSAtLT4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnc0tIUjwvdHlwZT4gPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmNoYXI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT5bPGVudW0+VktfTUFYX0RFU0NSSVBUSU9OX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmNhdGVnb3J5PC9uYW1lPls8ZW51bT5WS19NQVhfREVTQ1JJUFRJT05fU0laRTwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmNoYXI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGVzY3JpcHRpb248L25hbWU+WzxlbnVtPlZLX01BWF9ERVNDUklQVElPTl9TSVpFPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtRdWVyeVBvb2xDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4gPCEtLSBQb2ludGVyIHRvIG5leHQgc3RydWN0dXJlIC0tPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnF1ZXVlRmFtaWx5SW5kZXg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y291bnRlckluZGV4Q291bnQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIGxlbj0iY291bnRlckluZGV4Q291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cENvdW50ZXJJbmRpY2VzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJ1bmlvbiIgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIiIGNvbW1lbnQ9Ii8vIFVuaW9uIG9mIGFsbCB0aGUgcG9zc2libGUgcmV0dXJuIHR5cGVzIGEgY291bnRlciByZXN1bHQgY291bGQgcmV0dXJuIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+aW50MzJfdDwvdHlwZT4gIDxuYW1lPmludDMyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5pbnQ2NF90PC90eXBlPiAgPG5hbWU+aW50NjQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT51aW50MzI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiA8bmFtZT51aW50NjQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmZsb2F0PC90eXBlPiAgICA8bmFtZT5mbG9hdDMyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5kb3VibGU8L3R5cGU+ICAgPG5hbWU+ZmxvYXQ2NDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0FjcXVpcmVQcm9maWxpbmdMb2NrRmxhZ3NLSFI8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjxjb21tZW50PkFjcXVpcmUgcHJvZmlsaW5nIGxvY2sgZmxhZ3M8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiA8bmFtZT50aW1lb3V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIiIHN0cnVjdGV4dGVuZHM9IlZrU3VibWl0SW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgPG5hbWU+Y291bnRlclBhc3NJbmRleDwvbmFtZT48Y29tbWVudD5JbmRleCBmb3Igd2hpY2ggY291bnRlciBwYXNzIHRvIHN1Ym1pdDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0hFQURMRVNTX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQ8L3R5cGU+ICAgPG5hbWU+ZmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfRkVBVFVSRVNfTlYiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT48bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb3ZlcmFnZVJlZHVjdGlvbk1vZGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYiIHN0cnVjdGV4dGVuZHM9IlZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfUkVEVUNUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVGbGFnc05WPC90eXBlPiAgICAgIDxuYW1lPmZsYWdzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0NvdmVyYWdlUmVkdWN0aW9uTW9kZU5WPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmNvdmVyYWdlUmVkdWN0aW9uTW9kZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlY8L3R5cGU+ICA8bmFtZT5jb3ZlcmFnZVJlZHVjdGlvbk1vZGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2FtcGxlQ291bnRGbGFnQml0czwvdHlwZT4gICAgICA8bmFtZT5yYXN0ZXJpemF0aW9uU2FtcGxlczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTYW1wbGVDb3VudEZsYWdzPC90eXBlPiAgICAgICAgIDxuYW1lPmRlcHRoU3RlbmNpbFNhbXBsZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2FtcGxlQ291bnRGbGFnczwvdHlwZT4gICAgICAgICA8bmFtZT5jb2xvclNhbXBsZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU5URUdFUl9GVU5DVElPTlNfMl9GRUFUVVJFU19JTlRFTCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVySW50ZWdlckZ1bmN0aW9uczI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InVuaW9uIiBuYW1lPSJWa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52YWx1ZTMyPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50NjRfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52YWx1ZTY0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5mbG9hdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52YWx1ZUZsb2F0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT52YWx1ZUJvb2w8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnZhbHVlU3RyaW5nPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMIj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMPC90eXBlPiAgICAgICAgPG5hbWU+dHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMPC90eXBlPiAgICAgICAgPG5hbWU+ZGF0YTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCIgPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUwiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9ImZhbHNlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgPG5hbWU+cFVzZXJEYXRhPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUXVlcnlQb29sU2FtcGxpbmdNb2RlSU5URUw8L3R5cGU+ICAgICAgICA8bmFtZT5wZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmc8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfTUFSS0VSX0lORk9fSU5URUwiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1hcmtlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9TVFJFQU1fTUFSS0VSX0lORk9fSU5URUwiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm1hcmtlcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX09WRVJSSURFX0lORk9fSU5URUwiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMPC90eXBlPiAgICAgIDxuYW1lPnR5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5lbmFibGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wYXJhbWV0ZXI8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX0FDUVVJUkVfSU5GT19JTlRFTCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTDwvdHlwZT4gPG5hbWU+dHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTdWJncm91cENsb2NrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2hhZGVyRGV2aWNlQ2xvY2s8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5ERVhfVFlQRV9VSU5UOF9GRUFUVVJFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5pbmRleFR5cGVVaW50ODwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU01fQlVJTFRJTlNfUFJPUEVSVElFU19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaGFkZXJTTUNvdW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlcldhcnBzUGVyU008L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLFZrRGV2aWNlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19GRUFUVVJFU19OViI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPjxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlclNNQnVpbHRpbnM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0lOVEVSTE9DS19GRUFUVVJFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjxjb21tZW50PlBvaW50ZXIgdG8gbmV4dCBzdHJ1Y3R1cmU8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5mcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5mcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+PG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIiIHN0cnVjdGV4dGVuZHM9IlZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFX1NURU5DSUxfTEFZT1VUX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPjxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiAgICAgICAgICAgICAgICAgIDxuYW1lPnN0ZW5jaWxMYXlvdXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSIiBzdHJ1Y3RleHRlbmRzPSJWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fU1RFTkNJTF9MQVlPVVRfS0hSIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+PG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT52b2lkPC90eXBlPiogICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VMYXlvdXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+c3RlbmNpbEluaXRpYWxMYXlvdXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrSW1hZ2VMYXlvdXQ8L3R5cGU+ICAgICAgICAgICAgICAgICAgPG5hbWU+c3RlbmNpbEZpbmFsTGF5b3V0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0ZFQVRVUkVTX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICA8bmFtZT5waXBlbGluZUV4ZWN1dGFibGVJbmZvPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaXBlbGluZTwvdHlwZT4gICAgICAgICA8bmFtZT5waXBlbGluZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtTaGFkZXJTdGFnZUZsYWdzPC90eXBlPiA8bmFtZT5zdGFnZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmNoYXI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT5bPGVudW0+VktfTUFYX0RFU0NSSVBUSU9OX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlc2NyaXB0aW9uPC9uYW1lPls8ZW51bT5WS19NQVhfREVTQ1JJUFRJT05fU0laRTwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQzMl90PC90eXBlPiAgICAgICAgICAgPG5hbWU+c3ViZ3JvdXBTaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTkZPX0tIUiI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtQaXBlbGluZTwvdHlwZT4gICAgICAgICA8bmFtZT5waXBlbGluZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICA8bmFtZT5leGVjdXRhYmxlSW5kZXg8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InVuaW9uIiBuYW1lPSJWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY1ZhbHVlS0hSIiByZXR1cm5lZG9ubHk9InRydWUiPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgIDxuYW1lPmIzMjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+aW50NjRfdDwvdHlwZT4gICAgICAgICAgICA8bmFtZT5pNjQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnVpbnQ2NF90PC90eXBlPiAgICAgICAgICAgPG5hbWU+dTY0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5kb3VibGU8L3R5cGU+ICAgICAgICAgICAgIDxuYW1lPmY2NDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmNoYXI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT5bPGVudW0+VktfTUFYX0RFU0NSSVBUSU9OX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlc2NyaXB0aW9uPC9uYW1lPls8ZW51bT5WS19NQVhfREVTQ1JJUFRJT05fU0laRTwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljRm9ybWF0S0hSPC90eXBlPiA8bmFtZT5mb3JtYXQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljVmFsdWVLSFI8L3R5cGU+ICA8bmFtZT52YWx1ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIiIHJldHVybmVkb25seT0idHJ1ZSI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmNoYXI8L3R5cGU+ICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT5bPGVudW0+VktfTUFYX0RFU0NSSVBUSU9OX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRlc2NyaXB0aW9uPC9uYW1lPls8ZW51bT5WS19NQVhfREVTQ1JJUFRJT05fU0laRTwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgPG5hbWU+aXNUZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+c2l6ZV90PC90eXBlPiAgICAgICAgICAgICAgIDxuYW1lPmRhdGFTaXplPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSIgbGVuPSJkYXRhU2l6ZSI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBEYXRhPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0ZFQVRVUkVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnRleGVsQnVmZmVyQWxpZ25tZW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9QUk9QRVJUSUVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+IDxuYW1lPnN1Ymdyb3VwU2l6ZUNvbnRyb2w8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gPG5hbWU+Y29tcHV0ZUZ1bGxTdWJncm91cHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUIiByZXR1cm5lZG9ubHk9InRydWUiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiI+CisgICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICAgPG1lbWJlcj48dHlwZT52b2lkPC90eXBlPiogICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5taW5TdWJncm91cFNpemU8L25hbWU+PGNvbW1lbnQ+VGhlIG1pbmltdW0gc3ViZ3JvdXAgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2U8L2NvbW1lbnQ+PC9tZW1iZXI+CisgICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm1heFN1Ymdyb3VwU2l6ZTwvbmFtZT48Y29tbWVudD5UaGUgbWF4aW11bSBzdWJncm91cCBzaXplIHN1cHBvcnRlZCBieSB0aGlzIGRldmljZTwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgICA8bWVtYmVyIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bWF4Q29tcHV0ZVdvcmtncm91cFN1Ymdyb3VwczwvbmFtZT48Y29tbWVudD5UaGUgbWF4aW11bSBudW1iZXIgb2Ygc3ViZ3JvdXBzIHN1cHBvcnRlZCBpbiBhIHdvcmtncm91cDwvY29tbWVudD48L21lbWJlcj4KKyAgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrU2hhZGVyU3RhZ2VGbGFnczwvdHlwZT4gICAgICAgICAgICAgPG5hbWU+cmVxdWlyZWRTdWJncm91cFNpemVTdGFnZXM8L25hbWU+PGNvbW1lbnQ+VGhlIHNoYWRlciBzdGFnZXMgdGhhdCBzdXBwb3J0IHNwZWNpZnlpbmcgYSBzdWJncm91cCBzaXplPC9jb21tZW50PjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfUkVRVUlSRURfU1VCR1JPVVBfU0laRV9DUkVBVEVfSU5GT19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT51aW50MzJfdDwvdHlwZT4gICAgICAgICAgICAgICA8bmFtZT5yZXF1aXJlZFN1Ymdyb3VwU2l6ZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSIiBzdHJ1Y3RleHRlbmRzPSJWa01lbW9yeUFsbG9jYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQUxMT0NBVEVfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDY0X3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9wYXF1ZUNhcHR1cmVBZGRyZXNzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFIiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPmNvbnN0IDx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtEZXZpY2VNZW1vcnk8L3R5cGU+ICAgICAgICAgICAgICAgICAgIDxuYW1lPm1lbW9yeTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgPC90eXBlPgorICAgICAgICA8dHlwZSBjYXRlZ29yeT0ic3RydWN0IiBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCIgc3RydWN0ZXh0ZW5kcz0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8iPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fRkVBVFVSRVNfRVhUIj48dHlwZT5Wa1N0cnVjdHVyZVR5cGU8L3R5cGU+IDxuYW1lPnNUeXBlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBub2F1dG92YWxpZGl0eT0idHJ1ZSI+PHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cmVjdGFuZ3VsYXJMaW5lczwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnJlc2VuaGFtTGluZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNtb290aExpbmVzPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN0aXBwbGVkQnJlc2VuaGFtTGluZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnN0aXBwbGVkU21vb3RoTGluZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIiBzdHJ1Y3RleHRlbmRzPSJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiPgorICAgICAgICAgICAgPG1lbWJlciB2YWx1ZXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gPG5hbWU+c1R5cGU8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5wTmV4dDwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIiBzdHJ1Y3RleHRlbmRzPSJWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9MSU5FX1NUQVRFX0NSRUFURV9JTkZPX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmxpbmVSYXN0ZXJpemF0aW9uTW9kZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+VmtCb29sMzI8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3RpcHBsZWRMaW5lRW5hYmxlPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5saW5lU3RpcHBsZUZhY3RvcjwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQxNl90PC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bGluZVN0aXBwbGVQYXR0ZXJuPC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIiBzdHJ1Y3RleHRlbmRzPSJWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyI+CisgICAgICAgICAgICA8bWVtYmVyIHZhbHVlcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQiPjx0eXBlPlZrU3RydWN0dXJlVHlwZTwvdHlwZT4gICA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlciBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdzQU1EPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y29tcGlsZXJDb250cm9sRmxhZ3M8L25hbWU+PC9tZW1iZXI+CisgICAgICAgIDwvdHlwZT4KKyAgICAgICAgPHR5cGUgY2F0ZWdvcnk9InN0cnVjdCIgbmFtZT0iVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQiIHN0cnVjdGV4dGVuZHM9IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsVmtEZXZpY2VDcmVhdGVJbmZvIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0ZFQVRVUkVTX0FNRCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXIgbm9hdXRvdmFsaWRpdHk9InRydWUiPjx0eXBlPnZvaWQ8L3R5cGU+KiAgICAgICAgPG5hbWU+cE5leHQ8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrQm9vbDMyPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRldmljZUNvaGVyZW50TWVtb3J5PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgICAgIDx0eXBlIGNhdGVnb3J5PSJzdHJ1Y3QiIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCIgcmV0dXJuZWRvbmx5PSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZW1iZXIgdmFsdWVzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVE9PTF9QUk9QRVJUSUVTX0VYVCI+PHR5cGU+VmtTdHJ1Y3R1cmVUeXBlPC90eXBlPiA8bmFtZT5zVHlwZTwvbmFtZT48L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBOZXh0PC9uYW1lPjwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj48dHlwZT5jaGFyPC90eXBlPiAgICAgICAgICAgIDxuYW1lPm5hbWU8L25hbWU+WzxlbnVtPlZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+Y2hhcjwvdHlwZT4gICAgICAgICAgICA8bmFtZT52ZXJzaW9uPC9uYW1lPls8ZW51bT5WS19NQVhfRVhURU5TSU9OX05BTUVfU0laRTwvZW51bT5dPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPlZrVG9vbFB1cnBvc2VGbGFnc0VYVDwvdHlwZT4gPG5hbWU+cHVycG9zZXM8L25hbWU+PC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPjx0eXBlPmNoYXI8L3R5cGU+ICAgICAgICAgICAgPG5hbWU+ZGVzY3JpcHRpb248L25hbWU+WzxlbnVtPlZLX01BWF9ERVNDUklQVElPTl9TSVpFPC9lbnVtPl08L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+PHR5cGU+Y2hhcjwvdHlwZT4gICAgICAgICAgICA8bmFtZT5sYXllcjwvbmFtZT5bPGVudW0+VktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU8L2VudW0+XTwvbWVtYmVyPgorICAgICAgICA8L3R5cGU+CisgICAgPC90eXBlcz4KKworICAgIDxjb21tZW50PlZ1bGthbiBlbnVtZXJhbnQgKHRva2VuKSBkZWZpbml0aW9uczwvY29tbWVudD4KKworICAgIDxlbnVtcyBuYW1lPSJBUEkgQ29uc3RhbnRzIiBjb21tZW50PSJWdWxrYW4gaGFyZGNvZGVkIGNvbnN0YW50cyAtIG5vdCBhbiBlbnVtZXJhdGVkIHR5cGUsIHBhcnQgb2YgdGhlIGhlYWRlciBib2lsZXJwbGF0ZSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNTYiICAgbmFtZT0iVktfTUFYX1BIWVNJQ0FMX0RFVklDRV9OQU1FX1NJWkUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE2IiAgICBuYW1lPSJWS19VVUlEX1NJWkUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjgiICAgICBuYW1lPSJWS19MVUlEX1NJWkUiLz4KKyAgICAgICAgPGVudW0gICAgICAgICAgICAgICBuYW1lPSJWS19MVUlEX1NJWkVfS0hSIiBhbGlhcz0iVktfTFVJRF9TSVpFIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNTYiICAgbmFtZT0iVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjI1NiIgICBuYW1lPSJWS19NQVhfREVTQ1JJUFRJT05fU0laRSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMzIiICAgIG5hbWU9IlZLX01BWF9NRU1PUllfVFlQRVMiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE2IiAgICBuYW1lPSJWS19NQVhfTUVNT1JZX0hFQVBTIiBjb21tZW50PSJUaGUgbWF4aW11bSBudW1iZXIgb2YgdW5pcXVlIG1lbW9yeSBoZWFwcywgZWFjaCBvZiB3aGljaCBzdXBwb3J0aW5nIDEgb3IgbW9yZSBtZW1vcnkgdHlwZXMiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEwMDAuMGYiIG5hbWU9IlZLX0xPRF9DTEFNUF9OT05FIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIofjBVKSIgbmFtZT0iVktfUkVNQUlOSU5HX01JUF9MRVZFTFMiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Iih+MFUpIiBuYW1lPSJWS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIofjBVTEwpIiBuYW1lPSJWS19XSE9MRV9TSVpFIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIofjBVKSIgbmFtZT0iVktfQVRUQUNITUVOVF9VTlVTRUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19UUlVFIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfRkFMU0UiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Iih+MFUpIiBuYW1lPSJWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iKH4wVS0xKSIgbmFtZT0iVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMIi8+CisgICAgICAgIDxlbnVtICAgICAgICAgICAgICAgbmFtZT0iVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMX0tIUiIgYWxpYXM9IlZLX1FVRVVFX0ZBTUlMWV9FWFRFUk5BTCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iKH4wVS0yKSIgbmFtZT0iVktfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIofjBVKSIgbmFtZT0iVktfU1VCUEFTU19FWFRFUk5BTCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMzIiICAgIG5hbWU9IlZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRSIvPgorICAgICAgICA8ZW51bSAgICAgICAgICAgICAgIG5hbWU9IlZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRV9LSFIiIGFsaWFzPSJWS19NQVhfREVWSUNFX0dST1VQX1NJWkUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjI1NiIgICBuYW1lPSJWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjI1NiIgICBuYW1lPSJWS19NQVhfRFJJVkVSX0lORk9fU0laRV9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Iih+MFUpIiBuYW1lPSJWS19TSEFERVJfVU5VU0VEX05WIi8+CisgICAgPC9lbnVtcz4KKworICAgIDxjb21tZW50PgorICAgICAgICBVbmxpa2UgT3BlbkdMLCBtb3N0IHRva2VucyBpbiBWdWxrYW4gYXJlIGFjdHVhbCB0eXBlZCBlbnVtZXJhbnRzIGluCisgICAgICAgIHRoZWlyIG93biBudW1lcmljIG5hbWVzcGFjZXMuIFRoZSAibmFtZSIgYXR0cmlidXRlIGlzIHRoZSBDIGVudW0KKyAgICAgICAgdHlwZSBuYW1lLCBhbmQgaXMgcHVsbGVkIGluIGZyb20gYSB0eXBlIHRhZyBkZWZpbml0aW9uIGFib3ZlCisgICAgICAgIChzbGlnaHRseSBjbHVua3ksIGJ1dCByZXRhaW5zIHRoZSB0eXBlIC8gZW51bSBkaXN0aW5jdGlvbikuICJ0eXBlIgorICAgICAgICBhdHRyaWJ1dGVzIG9mICJlbnVtIiBvciAiYml0bWFzayIgaW5kaWNhdGUgdGhhdCB0aGVzZSB2YWx1ZXMgc2hvdWxkCisgICAgICAgIGJlIGdlbmVyYXRlZCBpbnNpZGUgYW4gYXBwcm9wcmlhdGUgZGVmaW5pdGlvbi4KKyAgICA8L2NvbW1lbnQ+CisKKyAgICA8ZW51bXMgbmFtZT0iVmtJbWFnZUxheW91dCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCIgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iSW1wbGljaXQgbGF5b3V0IGFuIGltYWdlIGlzIHdoZW4gaXRzIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQgZHVlIHRvIHZhcmlvdXMgcmVhc29ucyAoZS5nLiByaWdodCBhZnRlciBjcmVhdGlvbikiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19JTUFHRV9MQVlPVVRfR0VORVJBTCIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJHZW5lcmFsIGxheW91dCB3aGVuIGltYWdlIGNhbiBiZSB1c2VkIGZvciBhbnkga2luZCBvZiBhY2Nlc3MiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMIiAgICAgICAgICBjb21tZW50PSJPcHRpbWFsIGxheW91dCB3aGVuIGltYWdlIGlzIG9ubHkgdXNlZCBmb3IgY29sb3IgYXR0YWNobWVudCByZWFkL3dyaXRlIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIiAgY29tbWVudD0iT3B0aW1hbCBsYXlvdXQgd2hlbiBpbWFnZSBpcyBvbmx5IHVzZWQgZm9yIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCByZWFkL3dyaXRlIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwiICAgY29tbWVudD0iT3B0aW1hbCBsYXlvdXQgd2hlbiBpbWFnZSBpcyB1c2VkIGZvciByZWFkIG9ubHkgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGFuZCBzaGFkZXIgYWNjZXNzIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1IiAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCIgICAgICAgICAgY29tbWVudD0iT3B0aW1hbCBsYXlvdXQgd2hlbiBpbWFnZSBpcyB1c2VkIGZvciByZWFkIG9ubHkgc2hhZGVyIGFjY2VzcyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgIG5hbWU9IlZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCIgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGltYWwgbGF5b3V0IHdoZW4gaW1hZ2UgaXMgdXNlZCBvbmx5IGFzIHNvdXJjZSBvZiB0cmFuc2ZlciBvcGVyYXRpb25zIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3IiAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIiAgICAgICAgICAgICAgY29tbWVudD0iT3B0aW1hbCBsYXlvdXQgd2hlbiBpbWFnZSBpcyB1c2VkIG9ubHkgYXMgZGVzdGluYXRpb24gb2YgdHJhbnNmZXIgb3BlcmF0aW9ucyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOCIgICAgIG5hbWU9IlZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCIgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkluaXRpYWwgbGF5b3V0IHVzZWQgd2hlbiB0aGUgZGF0YSBpcyBwb3B1bGF0ZWQgYnkgdGhlIENQVSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQXR0YWNobWVudExvYWRPcCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtBdHRhY2htZW50U3RvcmVPcCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtJbWFnZVR5cGUiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX0lNQUdFX1RZUEVfMUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19JTUFHRV9UWVBFXzJEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfSU1BR0VfVFlQRV8zRCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrSW1hZ2VUaWxpbmciIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX0lNQUdFX1RJTElOR19PUFRJTUFMIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfSU1BR0VfVElMSU5HX0xJTkVBUiIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrSW1hZ2VWaWV3VHlwZSIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfSU1BR0VfVklFV19UWVBFXzFEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfSU1BR0VfVklFV19UWVBFXzJEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfSU1BR0VfVklFV19UWVBFXzNEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfSU1BR0VfVklFV19UWVBFX0NVQkUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVkiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYiICAgICBuYW1lPSJWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQ29tbWFuZEJ1ZmZlckxldmVsIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDb21wb25lbnRTd2l6emxlIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX0NPTVBPTkVOVF9TV0laWkxFX1pFUk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19DT01QT05FTlRfU1dJWlpMRV9PTkUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICBuYW1lPSJWS19DT01QT05FTlRfU1dJWlpMRV9SIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfQ09NUE9ORU5UX1NXSVpaTEVfRyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNSIgICAgIG5hbWU9IlZLX0NPTVBPTkVOVF9TV0laWkxFX0IiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYiICAgICBuYW1lPSJWS19DT01QT05FTlRfU1dJWlpMRV9BIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtEZXNjcmlwdG9yVHlwZSIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYiICAgICBuYW1lPSJWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICBuYW1lPSJWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjgiICAgICBuYW1lPSJWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOSIgICAgIG5hbWU9IlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMCIgICAgbmFtZT0iVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1F1ZXJ5VHlwZSIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfUVVFUllfVFlQRV9PQ0NMVVNJT04iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19RVUVSWV9UWVBFX1BJUEVMSU5FX1NUQVRJU1RJQ1MiICAgICAgICAgICAgICAgICBjb21tZW50PSJPcHRpb25hbCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1FVRVJZX1RZUEVfVElNRVNUQU1QIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtCb3JkZXJDb2xvciIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQk9SREVSX0NPTE9SX0ZMT0FUX1RSQU5TUEFSRU5UX0JMQUNLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfQk9SREVSX0NPTE9SX0lOVF9UUkFOU1BBUkVOVF9CTEFDSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfQkxBQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICBuYW1lPSJWS19CT1JERVJfQ09MT1JfSU5UX09QQVFVRV9CTEFDSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgICAgIG5hbWU9IlZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfV0hJVEUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19CT1JERVJfQ09MT1JfSU5UX09QQVFVRV9XSElURSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrUGlwZWxpbmVCaW5kUG9pbnQiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BpcGVsaW5lQ2FjaGVIZWFkZXJWZXJzaW9uIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19QSVBFTElORV9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkUiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1ByaW1pdGl2ZVRvcG9sb2d5IiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19QUklNSVRJVkVfVE9QT0xPR1lfUE9JTlRfTElTVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX0xJU1QiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1IiAgICAgbmFtZT0iVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0ZBTiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgIG5hbWU9IlZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX0xJU1RfV0lUSF9BREpBQ0VOQ1kiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICBuYW1lPSJWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUF9XSVRIX0FESkFDRU5DWSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOCIgICAgIG5hbWU9IlZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5IiAgICAgbmFtZT0iVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQX1dJVEhfQURKQUNFTkNZIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMCIgICAgbmFtZT0iVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1NoYXJpbmdNb2RlIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0luZGV4VHlwZSIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfSU5ERVhfVFlQRV9VSU5UMTYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19JTkRFWF9UWVBFX1VJTlQzMiIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRmlsdGVyIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19GSUxURVJfTkVBUkVTVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX0ZJTFRFUl9MSU5FQVIiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1NhbXBsZXJNaXBtYXBNb2RlIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19TQU1QTEVSX01JUE1BUF9NT0RFX05FQVJFU1QiICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ2hvb3NlIG5lYXJlc3QgbWlwIGxldmVsIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfU0FNUExFUl9NSVBNQVBfTU9ERV9MSU5FQVIiICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkxpbmVhciBmaWx0ZXIgYmV0d2VlbiBtaXAgbGV2ZWxzIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTYW1wbGVyQWRkcmVzc01vZGUiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX1JFUEVBVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUkVEX1JFUEVBVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICBuYW1lPSJWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19CT1JERVIiLz4KKyAgICAgICAgICAgIDxjb21tZW50PgorICAgICAgICAgICAgICAgIHZhbHVlPSI0IiByZXNlcnZlZCBmb3IgVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UKKyAgICAgICAgICAgICAgICBlbnVtIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFOyBkbyBub3QKKyAgICAgICAgICAgICAgICBhbGlhcyEKKyAgICAgICAgICAgIDwvY29tbWVudD4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0NvbXBhcmVPcCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQ09NUEFSRV9PUF9ORVZFUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX0NPTVBBUkVfT1BfTEVTUyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX0NPTVBBUkVfT1BfRVFVQUwiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICBuYW1lPSJWS19DT01QQVJFX09QX0xFU1NfT1JfRVFVQUwiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19DT01QQVJFX09QX0dSRUFURVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19DT01QQVJFX09QX05PVF9FUVVBTCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgIG5hbWU9IlZLX0NPTVBBUkVfT1BfR1JFQVRFUl9PUl9FUVVBTCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNyIgICAgIG5hbWU9IlZLX0NPTVBBUkVfT1BfQUxXQVlTIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtQb2x5Z29uTW9kZSIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfUE9MWUdPTl9NT0RFX0ZJTEwiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19QT0xZR09OX01PREVfTElORSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1BPTFlHT05fTU9ERV9QT0lOVCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQ3VsbE1vZGVGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQ1VMTF9NT0RFX05PTkUiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19DVUxMX01PREVfRlJPTlRfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfQ1VMTF9NT0RFX0JBQ0tfQklUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIweDAwMDAwMDAzIiBuYW1lPSJWS19DVUxMX01PREVfRlJPTlRfQU5EX0JBQ0siLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0Zyb250RmFjZSIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfRlJPTlRfRkFDRV9DT1VOVEVSX0NMT0NLV0lTRSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX0ZST05UX0ZBQ0VfQ0xPQ0tXSVNFIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtCbGVuZEZhY3RvciIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQkxFTkRfRkFDVE9SX1pFUk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19CTEVORF9GQUNUT1JfT05FIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfQkxFTkRfRkFDVE9SX1NSQ19DT0xPUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDX0NPTE9SIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfQkxFTkRfRkFDVE9SX0RTVF9DT0xPUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNSIgICAgIG5hbWU9IlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfRFNUX0NPTE9SIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI2IiAgICAgbmFtZT0iVktfQkxFTkRfRkFDVE9SX1NSQ19BTFBIQSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNyIgICAgIG5hbWU9IlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDX0FMUEhBIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI4IiAgICAgbmFtZT0iVktfQkxFTkRfRkFDVE9SX0RTVF9BTFBIQSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOSIgICAgIG5hbWU9IlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfRFNUX0FMUEhBIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMCIgICAgbmFtZT0iVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0NPTE9SIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMSIgICAgbmFtZT0iVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTIiICAgIG5hbWU9IlZLX0JMRU5EX0ZBQ1RPUl9DT05TVEFOVF9BTFBIQSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTMiICAgIG5hbWU9IlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE0IiAgICBuYW1lPSJWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBX1NBVFVSQVRFIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNSIgICAgbmFtZT0iVktfQkxFTkRfRkFDVE9SX1NSQzFfQ09MT1IiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE2IiAgICBuYW1lPSJWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQ09MT1IiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE3IiAgICBuYW1lPSJWS19CTEVORF9GQUNUT1JfU1JDMV9BTFBIQSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTgiICAgIG5hbWU9IlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9BTFBIQSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQmxlbmRPcCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQkxFTkRfT1BfQUREIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfQkxFTkRfT1BfU1VCVFJBQ1QiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19CTEVORF9PUF9SRVZFUlNFX1NVQlRSQUNUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfQkxFTkRfT1BfTUlOIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfQkxFTkRfT1BfTUFYIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTdGVuY2lsT3AiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1NURU5DSUxfT1BfS0VFUCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1NURU5DSUxfT1BfWkVSTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1NURU5DSUxfT1BfUkVQTEFDRSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX1NURU5DSUxfT1BfSU5DUkVNRU5UX0FORF9DTEFNUCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgICAgIG5hbWU9IlZLX1NURU5DSUxfT1BfREVDUkVNRU5UX0FORF9DTEFNUCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNSIgICAgIG5hbWU9IlZLX1NURU5DSUxfT1BfSU5WRVJUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI2IiAgICAgbmFtZT0iVktfU1RFTkNJTF9PUF9JTkNSRU1FTlRfQU5EX1dSQVAiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICBuYW1lPSJWS19TVEVOQ0lMX09QX0RFQ1JFTUVOVF9BTkRfV1JBUCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrTG9naWNPcCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfTE9HSUNfT1BfQ0xFQVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19MT0dJQ19PUF9BTkQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19MT0dJQ19PUF9BTkRfUkVWRVJTRSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX0xPR0lDX09QX0NPUFkiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19MT0dJQ19PUF9BTkRfSU5WRVJURUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19MT0dJQ19PUF9OT19PUCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgIG5hbWU9IlZLX0xPR0lDX09QX1hPUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNyIgICAgIG5hbWU9IlZLX0xPR0lDX09QX09SIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI4IiAgICAgbmFtZT0iVktfTE9HSUNfT1BfTk9SIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5IiAgICAgbmFtZT0iVktfTE9HSUNfT1BfRVFVSVZBTEVOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTAiICAgIG5hbWU9IlZLX0xPR0lDX09QX0lOVkVSVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTEiICAgIG5hbWU9IlZLX0xPR0lDX09QX09SX1JFVkVSU0UiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEyIiAgICBuYW1lPSJWS19MT0dJQ19PUF9DT1BZX0lOVkVSVEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMyIgICAgbmFtZT0iVktfTE9HSUNfT1BfT1JfSU5WRVJURUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE0IiAgICBuYW1lPSJWS19MT0dJQ19PUF9OQU5EIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNSIgICAgbmFtZT0iVktfTE9HSUNfT1BfU0VUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtJbnRlcm5hbEFsbG9jYXRpb25UeXBlIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19JTlRFUk5BTF9BTExPQ0FUSU9OX1RZUEVfRVhFQ1VUQUJMRSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU3lzdGVtQWxsb2NhdGlvblNjb3BlIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DT01NQU5EIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ0FDSEUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICBuYW1lPSJWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9ERVZJQ0UiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUeXBlIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9PVEhFUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0lOVEVHUkFURURfR1BVIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfRElTQ1JFVEVfR1BVIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfVklSVFVBTF9HUFUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9DUFUiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1ZlcnRleElucHV0UmF0ZSIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfVkVSVEVYX0lOUFVUX1JBVEVfVkVSVEVYIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfVkVSVEVYX0lOUFVUX1JBVEVfSU5TVEFOQ0UiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0Zvcm1hdCIgdHlwZT0iZW51bSIgY29tbWVudD0iVnVsa2FuIGZvcm1hdCBkZWZpbml0aW9ucyI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfRk9STUFUX1VOREVGSU5FRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX0ZPUk1BVF9SNEc0X1VOT1JNX1BBQ0s4Ii8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfRk9STUFUX1I0RzRCNEE0X1VOT1JNX1BBQ0sxNiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX0ZPUk1BVF9CNEc0UjRBNF9VTk9STV9QQUNLMTYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19GT1JNQVRfUjVHNkI1X1VOT1JNX1BBQ0sxNiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNSIgICAgIG5hbWU9IlZLX0ZPUk1BVF9CNUc2UjVfVU5PUk1fUEFDSzE2Ii8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI2IiAgICAgbmFtZT0iVktfRk9STUFUX1I1RzVCNUExX1VOT1JNX1BBQ0sxNiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNyIgICAgIG5hbWU9IlZLX0ZPUk1BVF9CNUc1UjVBMV9VTk9STV9QQUNLMTYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjgiICAgICBuYW1lPSJWS19GT1JNQVRfQTFSNUc1QjVfVU5PUk1fUEFDSzE2Ii8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5IiAgICAgbmFtZT0iVktfRk9STUFUX1I4X1VOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMCIgICAgbmFtZT0iVktfRk9STUFUX1I4X1NOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMSIgICAgbmFtZT0iVktfRk9STUFUX1I4X1VTQ0FMRUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEyIiAgICBuYW1lPSJWS19GT1JNQVRfUjhfU1NDQUxFRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTMiICAgIG5hbWU9IlZLX0ZPUk1BVF9SOF9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNCIgICAgbmFtZT0iVktfRk9STUFUX1I4X1NJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE1IiAgICBuYW1lPSJWS19GT1JNQVRfUjhfU1JHQiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTYiICAgIG5hbWU9IlZLX0ZPUk1BVF9SOEc4X1VOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNyIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhfU05PUk0iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE4IiAgICBuYW1lPSJWS19GT1JNQVRfUjhHOF9VU0NBTEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxOSIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhfU1NDQUxFRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjAiICAgIG5hbWU9IlZLX0ZPUk1BVF9SOEc4X1VJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIxIiAgICBuYW1lPSJWS19GT1JNQVRfUjhHOF9TSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyMiIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhfU1JHQiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjMiICAgIG5hbWU9IlZLX0ZPUk1BVF9SOEc4QjhfVU5PUk0iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjI0IiAgICBuYW1lPSJWS19GT1JNQVRfUjhHOEI4X1NOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNSIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhCOF9VU0NBTEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNiIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhCOF9TU0NBTEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNyIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhCOF9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyOCIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhCOF9TSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyOSIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhCOF9TUkdCIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzMCIgICAgbmFtZT0iVktfRk9STUFUX0I4RzhSOF9VTk9STSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMzEiICAgIG5hbWU9IlZLX0ZPUk1BVF9COEc4UjhfU05PUk0iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMyIiAgICBuYW1lPSJWS19GT1JNQVRfQjhHOFI4X1VTQ0FMRUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMzIiAgICBuYW1lPSJWS19GT1JNQVRfQjhHOFI4X1NTQ0FMRUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM0IiAgICBuYW1lPSJWS19GT1JNQVRfQjhHOFI4X1VJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM1IiAgICBuYW1lPSJWS19GT1JNQVRfQjhHOFI4X1NJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM2IiAgICBuYW1lPSJWS19GT1JNQVRfQjhHOFI4X1NSR0IiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM3IiAgICBuYW1lPSJWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM4IiAgICBuYW1lPSJWS19GT1JNQVRfUjhHOEI4QThfU05PUk0iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM5IiAgICBuYW1lPSJWS19GT1JNQVRfUjhHOEI4QThfVVNDQUxFRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNDAiICAgIG5hbWU9IlZLX0ZPUk1BVF9SOEc4QjhBOF9TU0NBTEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0MSIgICAgbmFtZT0iVktfRk9STUFUX1I4RzhCOEE4X1VJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQyIiAgICBuYW1lPSJWS19GT1JNQVRfUjhHOEI4QThfU0lOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNDMiICAgIG5hbWU9IlZLX0ZPUk1BVF9SOEc4QjhBOF9TUkdCIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0NCIgICAgbmFtZT0iVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0NSIgICAgbmFtZT0iVktfRk9STUFUX0I4RzhSOEE4X1NOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0NiIgICAgbmFtZT0iVktfRk9STUFUX0I4RzhSOEE4X1VTQ0FMRUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQ3IiAgICBuYW1lPSJWS19GT1JNQVRfQjhHOFI4QThfU1NDQUxFRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNDgiICAgIG5hbWU9IlZLX0ZPUk1BVF9COEc4UjhBOF9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0OSIgICAgbmFtZT0iVktfRk9STUFUX0I4RzhSOEE4X1NJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUwIiAgICBuYW1lPSJWS19GT1JNQVRfQjhHOFI4QThfU1JHQiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNTEiICAgIG5hbWU9IlZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUyIiAgICBuYW1lPSJWS19GT1JNQVRfQThCOEc4UjhfU05PUk1fUEFDSzMyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1MyIgICAgbmFtZT0iVktfRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1NCIgICAgbmFtZT0iVktfRk9STUFUX0E4QjhHOFI4X1NTQ0FMRURfUEFDSzMyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1NSIgICAgbmFtZT0iVktfRk9STUFUX0E4QjhHOFI4X1VJTlRfUEFDSzMyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1NiIgICAgbmFtZT0iVktfRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1NyIgICAgbmFtZT0iVktfRk9STUFUX0E4QjhHOFI4X1NSR0JfUEFDSzMyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1OCIgICAgbmFtZT0iVktfRk9STUFUX0EyUjEwRzEwQjEwX1VOT1JNX1BBQ0szMiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNTkiICAgIG5hbWU9IlZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TTk9STV9QQUNLMzIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYwIiAgICBuYW1lPSJWS19GT1JNQVRfQTJSMTBHMTBCMTBfVVNDQUxFRF9QQUNLMzIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYxIiAgICBuYW1lPSJWS19GT1JNQVRfQTJSMTBHMTBCMTBfU1NDQUxFRF9QQUNLMzIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYyIiAgICBuYW1lPSJWS19GT1JNQVRfQTJSMTBHMTBCMTBfVUlOVF9QQUNLMzIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYzIiAgICBuYW1lPSJWS19GT1JNQVRfQTJSMTBHMTBCMTBfU0lOVF9QQUNLMzIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjY0IiAgICBuYW1lPSJWS19GT1JNQVRfQTJCMTBHMTBSMTBfVU5PUk1fUEFDSzMyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI2NSIgICAgbmFtZT0iVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNjYiICAgIG5hbWU9IlZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNjciICAgIG5hbWU9IlZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TU0NBTEVEX1BBQ0szMiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNjgiICAgIG5hbWU9IlZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VSU5UX1BBQ0szMiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNjkiICAgIG5hbWU9IlZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TSU5UX1BBQ0szMiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNzAiICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTZfVU5PUk0iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjcxIiAgICBuYW1lPSJWS19GT1JNQVRfUjE2X1NOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3MiIgICAgbmFtZT0iVktfRk9STUFUX1IxNl9VU0NBTEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3MyIgICAgbmFtZT0iVktfRk9STUFUX1IxNl9TU0NBTEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3NCIgICAgbmFtZT0iVktfRk9STUFUX1IxNl9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3NSIgICAgbmFtZT0iVktfRk9STUFUX1IxNl9TSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3NiIgICAgbmFtZT0iVktfRk9STUFUX1IxNl9TRkxPQVQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ijc3IiAgICBuYW1lPSJWS19GT1JNQVRfUjE2RzE2X1VOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3OCIgICAgbmFtZT0iVktfRk9STUFUX1IxNkcxNl9TTk9STSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNzkiICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTZHMTZfVVNDQUxFRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iODAiICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTZHMTZfU1NDQUxFRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iODEiICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTZHMTZfVUlOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iODIiICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTZHMTZfU0lOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iODMiICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTZHMTZfU0ZMT0FUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI4NCIgICAgbmFtZT0iVktfRk9STUFUX1IxNkcxNkIxNl9VTk9STSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iODUiICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTZHMTZCMTZfU05PUk0iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ijg2IiAgICBuYW1lPSJWS19GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ijg3IiAgICBuYW1lPSJWS19GT1JNQVRfUjE2RzE2QjE2X1NTQ0FMRUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ijg4IiAgICBuYW1lPSJWS19GT1JNQVRfUjE2RzE2QjE2X1VJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ijg5IiAgICBuYW1lPSJWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjkwIiAgICBuYW1lPSJWS19GT1JNQVRfUjE2RzE2QjE2X1NGTE9BVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOTEiICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk0iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjkyIiAgICBuYW1lPSJWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5MyIgICAgbmFtZT0iVktfRk9STUFUX1IxNkcxNkIxNkExNl9VU0NBTEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5NCIgICAgbmFtZT0iVktfRk9STUFUX1IxNkcxNkIxNkExNl9TU0NBTEVEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5NSIgICAgbmFtZT0iVktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5NiIgICAgbmFtZT0iVktfRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5NyIgICAgbmFtZT0iVktfRk9STUFUX1IxNkcxNkIxNkExNl9TRkxPQVQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ijk4IiAgICBuYW1lPSJWS19GT1JNQVRfUjMyX1VJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ijk5IiAgICBuYW1lPSJWS19GT1JNQVRfUjMyX1NJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEwMCIgICBuYW1lPSJWS19GT1JNQVRfUjMyX1NGTE9BVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTAxIiAgIG5hbWU9IlZLX0ZPUk1BVF9SMzJHMzJfVUlOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTAyIiAgIG5hbWU9IlZLX0ZPUk1BVF9SMzJHMzJfU0lOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTAzIiAgIG5hbWU9IlZLX0ZPUk1BVF9SMzJHMzJfU0ZMT0FUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMDQiICAgbmFtZT0iVktfRk9STUFUX1IzMkczMkIzMl9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMDUiICAgbmFtZT0iVktfRk9STUFUX1IzMkczMkIzMl9TSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMDYiICAgbmFtZT0iVktfRk9STUFUX1IzMkczMkIzMl9TRkxPQVQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEwNyIgICBuYW1lPSJWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEwOCIgICBuYW1lPSJWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEwOSIgICBuYW1lPSJWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTEwIiAgIG5hbWU9IlZLX0ZPUk1BVF9SNjRfVUlOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTExIiAgIG5hbWU9IlZLX0ZPUk1BVF9SNjRfU0lOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTEyIiAgIG5hbWU9IlZLX0ZPUk1BVF9SNjRfU0ZMT0FUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMTMiICAgbmFtZT0iVktfRk9STUFUX1I2NEc2NF9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMTQiICAgbmFtZT0iVktfRk9STUFUX1I2NEc2NF9TSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMTUiICAgbmFtZT0iVktfRk9STUFUX1I2NEc2NF9TRkxPQVQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjExNiIgICBuYW1lPSJWS19GT1JNQVRfUjY0RzY0QjY0X1VJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjExNyIgICBuYW1lPSJWS19GT1JNQVRfUjY0RzY0QjY0X1NJTlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjExOCIgICBuYW1lPSJWS19GT1JNQVRfUjY0RzY0QjY0X1NGTE9BVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTE5IiAgIG5hbWU9IlZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfVUlOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTIwIiAgIG5hbWU9IlZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0lOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTIxIiAgIG5hbWU9IlZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0ZMT0FUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMjIiICAgbmFtZT0iVktfRk9STUFUX0IxMEcxMVIxMV9VRkxPQVRfUEFDSzMyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMjMiICAgbmFtZT0iVktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEyNCIgICBuYW1lPSJWS19GT1JNQVRfRDE2X1VOT1JNIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMjUiICAgbmFtZT0iVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEyNiIgICBuYW1lPSJWS19GT1JNQVRfRDMyX1NGTE9BVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTI3IiAgIG5hbWU9IlZLX0ZPUk1BVF9TOF9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMjgiICAgbmFtZT0iVktfRk9STUFUX0QxNl9VTk9STV9TOF9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMjkiICAgbmFtZT0iVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5UIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMzAiICAgbmFtZT0iVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTMxIiAgIG5hbWU9IlZLX0ZPUk1BVF9CQzFfUkdCX1VOT1JNX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMzIiICAgbmFtZT0iVktfRk9STUFUX0JDMV9SR0JfU1JHQl9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTMzIiAgIG5hbWU9IlZLX0ZPUk1BVF9CQzFfUkdCQV9VTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTM0IiAgIG5hbWU9IlZLX0ZPUk1BVF9CQzFfUkdCQV9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMzUiICAgbmFtZT0iVktfRk9STUFUX0JDMl9VTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTM2IiAgIG5hbWU9IlZLX0ZPUk1BVF9CQzJfU1JHQl9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTM3IiAgIG5hbWU9IlZLX0ZPUk1BVF9CQzNfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEzOCIgICBuYW1lPSJWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEzOSIgICBuYW1lPSJWS19GT1JNQVRfQkM0X1VOT1JNX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNDAiICAgbmFtZT0iVktfRk9STUFUX0JDNF9TTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTQxIiAgIG5hbWU9IlZLX0ZPUk1BVF9CQzVfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE0MiIgICBuYW1lPSJWS19GT1JNQVRfQkM1X1NOT1JNX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNDMiICAgbmFtZT0iVktfRk9STUFUX0JDNkhfVUZMT0FUX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNDQiICAgbmFtZT0iVktfRk9STUFUX0JDNkhfU0ZMT0FUX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNDUiICAgbmFtZT0iVktfRk9STUFUX0JDN19VTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTQ2IiAgIG5hbWU9IlZLX0ZPUk1BVF9CQzdfU1JHQl9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTQ3IiAgIG5hbWU9IlZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9VTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTQ4IiAgIG5hbWU9IlZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNDkiICAgbmFtZT0iVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE1MCIgICBuYW1lPSJWS19GT1JNQVRfRVRDMl9SOEc4QjhBMV9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNTEiICAgbmFtZT0iVktfRk9STUFUX0VUQzJfUjhHOEI4QThfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE1MiIgICBuYW1lPSJWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNTMiICAgbmFtZT0iVktfRk9STUFUX0VBQ19SMTFfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE1NCIgICBuYW1lPSJWS19GT1JNQVRfRUFDX1IxMV9TTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTU1IiAgIG5hbWU9IlZLX0ZPUk1BVF9FQUNfUjExRzExX1VOT1JNX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNTYiICAgbmFtZT0iVktfRk9STUFUX0VBQ19SMTFHMTFfU05PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE1NyIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ180eDRfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE1OCIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTU5IiAgIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzV4NF9VTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTYwIiAgIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzV4NF9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNjEiICAgbmFtZT0iVktfRk9STUFUX0FTVENfNXg1X1VOT1JNX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNjIiICAgbmFtZT0iVktfRk9STUFUX0FTVENfNXg1X1NSR0JfQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE2MyIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ182eDVfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE2NCIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTY1IiAgIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzZ4Nl9VTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTY2IiAgIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzZ4Nl9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNjciICAgbmFtZT0iVktfRk9STUFUX0FTVENfOHg1X1VOT1JNX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNjgiICAgbmFtZT0iVktfRk9STUFUX0FTVENfOHg1X1NSR0JfQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE2OSIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ184eDZfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE3MCIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTcxIiAgIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzh4OF9VTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTcyIiAgIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzh4OF9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNzMiICAgbmFtZT0iVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTc0IiAgIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzEweDVfU1JHQl9CTE9DSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTc1IiAgIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzEweDZfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE3NiIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ18xMHg2X1NSR0JfQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE3NyIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ18xMHg4X1VOT1JNX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNzgiICAgbmFtZT0iVktfRk9STUFUX0FTVENfMTB4OF9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNzkiICAgbmFtZT0iVktfRk9STUFUX0FTVENfMTB4MTBfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE4MCIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ18xMHgxMF9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxODEiICAgbmFtZT0iVktfRk9STUFUX0FTVENfMTJ4MTBfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE4MiIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ18xMngxMF9TUkdCX0JMT0NLIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxODMiICAgbmFtZT0iVktfRk9STUFUX0FTVENfMTJ4MTJfVU5PUk1fQkxPQ0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE4NCIgICBuYW1lPSJWS19GT1JNQVRfQVNUQ18xMngxMl9TUkdCX0JMT0NLIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTdHJ1Y3R1cmVUeXBlIiB0eXBlPSJlbnVtIiBjb21tZW50PSJTdHJ1Y3R1cmUgdHlwZSBlbnVtZXJhbnQiPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1IiAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYiICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3IiAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9TUEFSU0VfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOCIgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5IiAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMCIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjExIiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMiIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMyIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX1ZJRVdfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE0IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTUiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE2IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNyIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ0FDSEVfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE4IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE5IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIwIiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjEiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9TVEFURV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjIiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyMyIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjQiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX01VTFRJU0FNUExFX1NUQVRFX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNSIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfREVQVEhfU1RFTkNJTF9TVEFURV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjYiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX1NUQVRFX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNyIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRFlOQU1JQ19TVEFURV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjgiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyOSIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQ09NUFVURV9QSVBFTElORV9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMzAiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMzEiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMyIiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMzIiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM0IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzNSIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM2IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9DT1BZX0RFU0NSSVBUT1JfU0VUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzNyIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjM4IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMzkiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNDAiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQxIiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0MiIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNDMiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQ0IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX0JBUlJJRVIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQ1IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNDYiICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9CQVJSSUVSIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0NyIgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPIiBjb21tZW50PSJSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBsb2FkZXIsIGxheWVycywgYW5kIElDRHMiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQ4IiAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfREVWSUNFX0NSRUFURV9JTkZPIiBjb21tZW50PSJSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBsb2FkZXIsIGxheWVycywgYW5kIElDRHMiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1N1YnBhc3NDb250ZW50cyIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19TVUJQQVNTX0NPTlRFTlRTX1NFQ09OREFSWV9DT01NQU5EX0JVRkZFUlMiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1Jlc3VsdCIgdHlwZT0iZW51bSIgY29tbWVudD0iQVBJIHJlc3VsdCBjb2RlcyI+CisgICAgICAgICAgICA8Y29tbWVudD5SZXR1cm4gY29kZXMgKHBvc2l0aXZlIHZhbHVlcyk8L2NvbW1lbnQ+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfU1VDQ0VTUyIgY29tbWVudD0iQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ii8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfTk9UX1JFQURZIiBjb21tZW50PSJBIGZlbmNlIG9yIHF1ZXJ5IGhhcyBub3QgeWV0IGNvbXBsZXRlZCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1RJTUVPVVQiIGNvbW1lbnQ9IkEgd2FpdCBvcGVyYXRpb24gaGFzIG5vdCBjb21wbGV0ZWQgaW4gdGhlIHNwZWNpZmllZCB0aW1lIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfRVZFTlRfU0VUIiBjb21tZW50PSJBbiBldmVudCBpcyBzaWduYWxlZCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgICAgIG5hbWU9IlZLX0VWRU5UX1JFU0VUIiBjb21tZW50PSJBbiBldmVudCBpcyB1bnNpZ25hbGVkIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1IiAgICAgbmFtZT0iVktfSU5DT01QTEVURSIgY29tbWVudD0iQSByZXR1cm4gYXJyYXkgd2FzIHRvbyBzbWFsbCBmb3IgdGhlIHJlc3VsdCIvPgorICAgICAgICAgICAgPGNvbW1lbnQ+RXJyb3IgY29kZXMgKG5lZ2F0aXZlIHZhbHVlcyk8L2NvbW1lbnQ+CisgICAgICAgIDxlbnVtIHZhbHVlPSItMSIgICAgbmFtZT0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIiBjb21tZW50PSJBIGhvc3QgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iLTIiICAgIG5hbWU9IlZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIiBjb21tZW50PSJBIGRldmljZSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSItMyIgICAgbmFtZT0iVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEIiBjb21tZW50PSJJbml0aWFsaXphdGlvbiBvZiBhIG9iamVjdCBoYXMgZmFpbGVkIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSItNCIgICAgbmFtZT0iVktfRVJST1JfREVWSUNFX0xPU1QiIGNvbW1lbnQ9IlRoZSBsb2dpY2FsIGRldmljZSBoYXMgYmVlbiBsb3N0LiBTZWUgJmx0OyZsdDtkZXZzYW5kcXVldWVzLWxvc3QtZGV2aWNlJmd0OyZndDsiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ii01IiAgICBuYW1lPSJWS19FUlJPUl9NRU1PUllfTUFQX0ZBSUxFRCIgY29tbWVudD0iTWFwcGluZyBvZiBhIG1lbW9yeSBvYmplY3QgaGFzIGZhaWxlZCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iLTYiICAgIG5hbWU9IlZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UIiBjb21tZW50PSJMYXllciBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ii03IiAgICBuYW1lPSJWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQiIGNvbW1lbnQ9IkV4dGVuc2lvbiBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9Ii04IiAgICBuYW1lPSJWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UIiBjb21tZW50PSJSZXF1ZXN0ZWQgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgZGV2aWNlIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSItOSIgICAgbmFtZT0iVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUiIgY29tbWVudD0iVW5hYmxlIHRvIGZpbmQgYSBWdWxrYW4gZHJpdmVyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSItMTAiICAgbmFtZT0iVktfRVJST1JfVE9PX01BTllfT0JKRUNUUyIgY29tbWVudD0iVG9vIG1hbnkgb2JqZWN0cyBvZiB0aGUgdHlwZSBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSItMTEiICAgbmFtZT0iVktfRVJST1JfRk9STUFUX05PVF9TVVBQT1JURUQiIGNvbW1lbnQ9IlJlcXVlc3RlZCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iLTEyIiAgIG5hbWU9IlZLX0VSUk9SX0ZSQUdNRU5URURfUE9PTCIgY29tbWVudD0iQSByZXF1ZXN0ZWQgcG9vbCBhbGxvY2F0aW9uIGhhcyBmYWlsZWQgZHVlIHRvIGZyYWdtZW50YXRpb24gb2YgdGhlIHBvb2wncyBtZW1vcnkiLz4KKyAgICAgICAgICAgIDx1bnVzZWQgc3RhcnQ9Ii0xMyIgY29tbWVudD0iVGhpcyBpcyB0aGUgbmV4dCB1bnVzZWQgYXZhaWxhYmxlIGVycm9yIGNvZGUgKG5lZ2F0aXZlIHZhbHVlKSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRHluYW1pY1N0YXRlIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfRFlOQU1JQ19TVEFURV9MSU5FX1dJRFRIIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfRFlOQU1JQ19TVEFURV9ERVBUSF9CSUFTIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfRFlOQU1JQ19TVEFURV9CTEVORF9DT05TVEFOVFMiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgIG5hbWU9IlZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9DT01QQVJFX01BU0siLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICBuYW1lPSJWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfV1JJVEVfTUFTSyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOCIgICAgIG5hbWU9IlZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9SRUZFUkVOQ0UiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGUiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQiICAgY29tbWVudD0iQ3JlYXRlIGRlc2NyaXB0b3IgdXBkYXRlIHRlbXBsYXRlIGZvciBkZXNjcmlwdG9yIHNldCB1cGRhdGVzIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtPYmplY3RUeXBlIiB0eXBlPSJlbnVtIiBjb21tZW50PSJFbnVtcyB0byB0cmFjayBvYmplY3RzIG9mIHZhcmlvdXMgdHlwZXMiPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1VOS05PV04iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19PQkpFQ1RfVFlQRV9JTlNUQU5DRSIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJWa0luc3RhbmNlIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFIiAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtQaHlzaWNhbERldmljZSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX0RFVklDRSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZrRGV2aWNlIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfUVVFVUUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtRdWV1ZSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNSIgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1NFTUFQSE9SRSIgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZrU2VtYXBob3JlIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI2IiAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVIiICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtDb21tYW5kQnVmZmVyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3IiAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfRkVOQ0UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtGZW5jZSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOCIgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUlkiICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZrRGV2aWNlTWVtb3J5Ii8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5IiAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfQlVGRkVSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtCdWZmZXIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEwIiAgICBuYW1lPSJWS19PQkpFQ1RfVFlQRV9JTUFHRSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJWa0ltYWdlIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMSIgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfRVZFTlQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtFdmVudCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTIiICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1FVRVJZX1BPT0wiICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZrUXVlcnlQb29sIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMyIgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVciICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtCdWZmZXJWaWV3Ii8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNCIgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfSU1BR0VfVklFVyIgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtJbWFnZVZpZXciLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE1IiAgICBuYW1lPSJWS19PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFIiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJWa1NoYWRlck1vZHVsZSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTYiICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFIiAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZrUGlwZWxpbmVDYWNoZSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTciICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVCIgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZrUGlwZWxpbmVMYXlvdXQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE4IiAgICBuYW1lPSJWS19PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTUyIgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJWa1JlbmRlclBhc3MiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE5IiAgICBuYW1lPSJWS19PQkpFQ1RfVFlQRV9QSVBFTElORSIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJWa1BpcGVsaW5lIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyMCIgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUIiAgICAgICAgICAgICAgY29tbWVudD0iVmtEZXNjcmlwdG9yU2V0TGF5b3V0Ii8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyMSIgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfU0FNUExFUiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtTYW1wbGVyIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyMiIgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MIiAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtEZXNjcmlwdG9yUG9vbCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjMiICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUIiAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZrRGVzY3JpcHRvclNldCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjQiICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSIiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZrRnJhbWVidWZmZXIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjI1IiAgICBuYW1lPSJWS19PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0wiICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJWa0NvbW1hbmRQb29sIi8+CisgICAgPC9lbnVtcz4KKworICAgICAgICA8Y29tbWVudD5GbGFnczwvY29tbWVudD4KKyAgICA8ZW51bXMgbmFtZT0iVmtRdWV1ZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19RVUVVRV9HUkFQSElDU19CSVQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJRdWV1ZSBzdXBwb3J0cyBncmFwaGljcyBvcGVyYXRpb25zIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfUVVFVUVfQ09NUFVURV9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iUXVldWUgc3VwcG9ydHMgY29tcHV0ZSBvcGVyYXRpb25zIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfUVVFVUVfVFJBTlNGRVJfQklUIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iUXVldWUgc3VwcG9ydHMgdHJhbnNmZXIgb3BlcmF0aW9ucyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX1FVRVVFX1NQQVJTRV9CSU5ESU5HX0JJVCIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlF1ZXVlIHN1cHBvcnRzIHNwYXJzZSByZXNvdXJjZSBtZW1vcnkgbWFuYWdlbWVudCBvcGVyYXRpb25zIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtSZW5kZXJQYXNzQ3JlYXRlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPjwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+PC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJJZiBvdGhlcndpc2Ugc3RhdGVkLCB0aGVuIGFsbG9jYXRlIG1lbW9yeSBvbiBkZXZpY2UiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJNZW1vcnkgaXMgbWFwcGFibGUgYnkgaG9zdCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCIgICAgICAgICAgICAgIGNvbW1lbnQ9Ik1lbW9yeSB3aWxsIGhhdmUgaS9vIGNvaGVyZW5jeS4gSWYgbm90IHNldCwgYXBwbGljYXRpb24gbWF5IG5lZWQgdG8gdXNlIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgYW5kIHZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyB0byBmbHVzaC9pbnZhbGlkYXRlIGhvc3QgY2FjaGUiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiAgICBuYW1lPSJWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DQUNIRURfQklUIiAgICAgICAgICAgICAgICBjb21tZW50PSJNZW1vcnkgd2lsbCBiZSBjYWNoZWQgYnkgdGhlIGhvc3QiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI0IiAgICBuYW1lPSJWS19NRU1PUllfUFJPUEVSVFlfTEFaSUxZX0FMTE9DQVRFRF9CSVQiICAgICAgICAgICBjb21tZW50PSJNZW1vcnkgbWF5IGJlIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIHdoZW4gaXQgaXMgcmVxdWlyZWQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa01lbW9yeUhlYXBGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfTUVNT1JZX0hFQVBfREVWSUNFX0xPQ0FMX0JJVCIgICAgICAgICAgICAgICAgICAgY29tbWVudD0iSWYgc2V0LCBoZWFwIHJlcHJlc2VudHMgZGV2aWNlIG1lbW9yeSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQWNjZXNzRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0FDQ0VTU19JTkRJUkVDVF9DT01NQU5EX1JFQURfQklUIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNvbnRyb2xzIGNvaGVyZW5jeSBvZiBpbmRpcmVjdCBjb21tYW5kIHJlYWRzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfQUNDRVNTX0lOREVYX1JFQURfQklUIiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ29udHJvbHMgY29oZXJlbmN5IG9mIGluZGV4IHJlYWRzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfQUNDRVNTX1ZFUlRFWF9BVFRSSUJVVEVfUkVBRF9CSVQiICAgICAgICAgICAgICAgY29tbWVudD0iQ29udHJvbHMgY29oZXJlbmN5IG9mIHZlcnRleCBhdHRyaWJ1dGUgcmVhZHMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiAgICBuYW1lPSJWS19BQ0NFU1NfVU5JRk9STV9SRUFEX0JJVCIgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJDb250cm9scyBjb2hlcmVuY3kgb2YgdW5pZm9ybSBidWZmZXIgcmVhZHMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI0IiAgICBuYW1lPSJWS19BQ0NFU1NfSU5QVVRfQVRUQUNITUVOVF9SRUFEX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJDb250cm9scyBjb2hlcmVuY3kgb2YgaW5wdXQgYXR0YWNobWVudCByZWFkcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjUiICAgIG5hbWU9IlZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNvbnRyb2xzIGNvaGVyZW5jeSBvZiBzaGFkZXIgcmVhZHMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI2IiAgICBuYW1lPSJWS19BQ0NFU1NfU0hBREVSX1dSSVRFX0JJVCIgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJDb250cm9scyBjb2hlcmVuY3kgb2Ygc2hhZGVyIHdyaXRlcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjciICAgIG5hbWU9IlZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfQklUIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNvbnRyb2xzIGNvaGVyZW5jeSBvZiBjb2xvciBhdHRhY2htZW50IHJlYWRzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iOCIgICAgbmFtZT0iVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUIiAgICAgICAgICAgICAgY29tbWVudD0iQ29udHJvbHMgY29oZXJlbmN5IG9mIGNvbG9yIGF0dGFjaG1lbnQgd3JpdGVzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iOSIgICAgbmFtZT0iVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9SRUFEX0JJVCIgICAgICAgY29tbWVudD0iQ29udHJvbHMgY29oZXJlbmN5IG9mIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCByZWFkcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEwIiAgIG5hbWU9IlZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklUIiAgICAgIGNvbW1lbnQ9IkNvbnRyb2xzIGNvaGVyZW5jeSBvZiBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgd3JpdGVzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMTEiICAgbmFtZT0iVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklUIiAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ29udHJvbHMgY29oZXJlbmN5IG9mIHRyYW5zZmVyIHJlYWRzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMTIiICAgbmFtZT0iVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCIgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ29udHJvbHMgY29oZXJlbmN5IG9mIHRyYW5zZmVyIHdyaXRlcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEzIiAgIG5hbWU9IlZLX0FDQ0VTU19IT1NUX1JFQURfQklUIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNvbnRyb2xzIGNvaGVyZW5jeSBvZiBob3N0IHJlYWRzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMTQiICAgbmFtZT0iVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUIiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ29udHJvbHMgY29oZXJlbmN5IG9mIGhvc3Qgd3JpdGVzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMTUiICAgbmFtZT0iVktfQUNDRVNTX01FTU9SWV9SRUFEX0JJVCIgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ29udHJvbHMgY29oZXJlbmN5IG9mIG1lbW9yeSByZWFkcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjE2IiAgIG5hbWU9IlZLX0FDQ0VTU19NRU1PUllfV1JJVEVfQklUIiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNvbnRyb2xzIGNvaGVyZW5jeSBvZiBtZW1vcnkgd3JpdGVzIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtCdWZmZXJVc2FnZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCIgICAgICAgICAgICAgICAgICBjb21tZW50PSJDYW4gYmUgdXNlZCBhcyBhIHNvdXJjZSBvZiB0cmFuc2ZlciBvcGVyYXRpb25zIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQiICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ2FuIGJlIHVzZWQgYXMgYSBkZXN0aW5hdGlvbiBvZiB0cmFuc2ZlciBvcGVyYXRpb25zIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCIgICAgICAgICAgY29tbWVudD0iQ2FuIGJlIHVzZWQgYXMgVEJPIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCIgICAgICAgICAgY29tbWVudD0iQ2FuIGJlIHVzZWQgYXMgSUJPIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNCIgICAgbmFtZT0iVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVCIgICAgICAgICAgICAgICAgY29tbWVudD0iQ2FuIGJlIHVzZWQgYXMgVUJPIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgICAgbmFtZT0iVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfQlVGRkVSX0JJVCIgICAgICAgICAgICAgICAgY29tbWVudD0iQ2FuIGJlIHVzZWQgYXMgU1NCTyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjYiICAgIG5hbWU9IlZLX0JVRkZFUl9VU0FHRV9JTkRFWF9CVUZGRVJfQklUIiAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNhbiBiZSB1c2VkIGFzIHNvdXJjZSBvZiBmaXhlZC1mdW5jdGlvbiBpbmRleCBmZXRjaCAoaW5kZXggYnVmZmVyKSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjciICAgIG5hbWU9IlZLX0JVRkZFUl9VU0FHRV9WRVJURVhfQlVGRkVSX0JJVCIgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNhbiBiZSB1c2VkIGFzIHNvdXJjZSBvZiBmaXhlZC1mdW5jdGlvbiB2ZXJ0ZXggZmV0Y2ggKFZCTykiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI4IiAgICBuYW1lPSJWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJDYW4gYmUgdGhlIHNvdXJjZSBvZiBpbmRpcmVjdCBwYXJhbWV0ZXJzIChlLmcuIGluZGlyZWN0IGJ1ZmZlciwgcGFyYW1ldGVyIGJ1ZmZlcikiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0J1ZmZlckNyZWF0ZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJCdWZmZXIgc2hvdWxkIHN1cHBvcnQgc3BhcnNlIGJhY2tpbmciLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIiAgICAgICAgICAgICBjb21tZW50PSJCdWZmZXIgc2hvdWxkIHN1cHBvcnQgc3BhcnNlIGJhY2tpbmcgd2l0aCBwYXJ0aWFsIHJlc2lkZW5jeSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IkJ1ZmZlciBzaG91bGQgc3VwcG9ydCBjb25zdGVudCBkYXRhIGFjY2VzcyB0byBwaHlzaWNhbCBtZW1vcnkgcmFuZ2VzIG1hcHBlZCBpbnRvIG11bHRpcGxlIGxvY2F0aW9ucyBvZiBzcGFyc2UgYnVmZmVycyIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU2hhZGVyU3RhZ2VGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI0IiAgICBuYW1lPSJWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgICAgbmFtZT0iVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIweDAwMDAwMDFGIiBuYW1lPSJWS19TSEFERVJfU1RBR0VfQUxMX0dSQVBISUNTIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIweDdGRkZGRkZGIiBuYW1lPSJWS19TSEFERVJfU1RBR0VfQUxMIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtJbWFnZVVzYWdlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQiICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNhbiBiZSB1c2VkIGFzIGEgc291cmNlIG9mIHRyYW5zZmVyIG9wZXJhdGlvbnMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIiAgICAgICAgICAgICAgICAgICBjb21tZW50PSJDYW4gYmUgdXNlZCBhcyBhIGRlc3RpbmF0aW9uIG9mIHRyYW5zZmVyIG9wZXJhdGlvbnMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIyIiAgICBuYW1lPSJWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCIgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJDYW4gYmUgc2FtcGxlZCBmcm9tIChTQU1QTEVEX0lNQUdFIGFuZCBDT01CSU5FRF9JTUFHRV9TQU1QTEVSIGRlc2NyaXB0b3IgdHlwZXMpIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ2FuIGJlIHVzZWQgYXMgc3RvcmFnZSBpbWFnZSAoU1RPUkFHRV9JTUFHRSBkZXNjcmlwdG9yIHR5cGUpIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNCIgICAgbmFtZT0iVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQiICAgICAgICAgICAgICAgY29tbWVudD0iQ2FuIGJlIHVzZWQgYXMgZnJhbWVidWZmZXIgY29sb3IgYXR0YWNobWVudCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjUiICAgIG5hbWU9IlZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQiICAgICAgIGNvbW1lbnQ9IkNhbiBiZSB1c2VkIGFzIGZyYW1lYnVmZmVyIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjYiICAgIG5hbWU9IlZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCIgICAgICAgICAgIGNvbW1lbnQ9IkltYWdlIGRhdGEgbm90IG5lZWRlZCBvdXRzaWRlIG9mIHJlbmRlcmluZyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjciICAgIG5hbWU9IlZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IkNhbiBiZSB1c2VkIGFzIGZyYW1lYnVmZmVyIGlucHV0IGF0dGFjaG1lbnQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQiICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkltYWdlIHNob3VsZCBzdXBwb3J0IHNwYXJzZSBiYWNraW5nIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIiAgICAgICAgICAgICAgY29tbWVudD0iSW1hZ2Ugc2hvdWxkIHN1cHBvcnQgc3BhcnNlIGJhY2tpbmcgd2l0aCBwYXJ0aWFsIHJlc2lkZW5jeSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQiICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkltYWdlIHNob3VsZCBzdXBwb3J0IGNvbnN0ZW50IGRhdGEgYWNjZXNzIHRvIHBoeXNpY2FsIG1lbW9yeSByYW5nZXMgbWFwcGVkIGludG8gbXVsdGlwbGUgbG9jYXRpb25zIG9mIHNwYXJzZSBpbWFnZXMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiAgICBuYW1lPSJWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUIiAgICAgICAgICAgICAgICBjb21tZW50PSJBbGxvd3MgaW1hZ2Ugdmlld3MgdG8gaGF2ZSBkaWZmZXJlbnQgZm9ybWF0IHRoYW4gdGhlIGJhc2UgaW1hZ2UiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI0IiAgICBuYW1lPSJWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJBbGxvd3MgY3JlYXRpbmcgaW1hZ2Ugdmlld3Mgd2l0aCBjdWJlIHR5cGUgZnJvbSB0aGUgY3JlYXRlZCBpbWFnZSIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU2FtcGxlckNyZWF0ZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX1BJUEVMSU5FX0NSRUFURV9ESVNBQkxFX09QVElNSVpBVElPTl9CSVQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19QSVBFTElORV9DUkVBVEVfQUxMT1dfREVSSVZBVElWRVNfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQ29sb3JDb21wb25lbnRGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfQ09MT1JfQ09NUE9ORU5UX1JfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfQ09MT1JfQ09NUE9ORU5UX0dfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfQ09MT1JfQ09NUE9ORU5UX0JfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfQ09MT1JfQ09NUE9ORU5UX0FfQklUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtGZW5jZUNyZWF0ZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19GRU5DRV9DUkVBVEVfU0lHTkFMRURfQklUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTZW1hcGhvcmVDcmVhdGVGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IkZvcm1hdCBjYW4gYmUgdXNlZCBmb3Igc2FtcGxlZCBpbWFnZXMgKFNBTVBMRURfSU1BR0UgYW5kIENPTUJJTkVEX0lNQUdFX1NBTVBMRVIgZGVzY3JpcHRvciB0eXBlcykiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJGb3JtYXQgY2FuIGJlIHVzZWQgZm9yIHN0b3JhZ2UgaW1hZ2VzIChTVE9SQUdFX0lNQUdFIGRlc2NyaXB0b3IgdHlwZSkiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIyIiAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQiICAgICAgICBjb21tZW50PSJGb3JtYXQgc3VwcG9ydHMgYXRvbWljIG9wZXJhdGlvbnMgaW4gY2FzZSBpdCBpcyB1c2VkIGZvciBzdG9yYWdlIGltYWdlcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCIgICAgICAgIGNvbW1lbnQ9IkZvcm1hdCBjYW4gYmUgdXNlZCBmb3IgdW5pZm9ybSB0ZXhlbCBidWZmZXJzIChUQk9zKSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjQiICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCIgICAgICAgIGNvbW1lbnQ9IkZvcm1hdCBjYW4gYmUgdXNlZCBmb3Igc3RvcmFnZSB0ZXhlbCBidWZmZXJzIChJQk9zKSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjUiICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0FUT01JQ19CSVQiIGNvbW1lbnQ9IkZvcm1hdCBzdXBwb3J0cyBhdG9taWMgb3BlcmF0aW9ucyBpbiBjYXNlIGl0IGlzIHVzZWQgZm9yIHN0b3JhZ2UgdGV4ZWwgYnVmZmVycyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjYiICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1ZFUlRFWF9CVUZGRVJfQklUIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IkZvcm1hdCBjYW4gYmUgdXNlZCBmb3IgdmVydGV4IGJ1ZmZlcnMgKFZCT3MpIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNyIgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQiICAgICAgICAgICAgY29tbWVudD0iRm9ybWF0IGNhbiBiZSB1c2VkIGZvciBjb2xvciBhdHRhY2htZW50IGltYWdlcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjgiICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQkxFTkRfQklUIiAgICAgIGNvbW1lbnQ9IkZvcm1hdCBzdXBwb3J0cyBibGVuZGluZyBpbiBjYXNlIGl0IGlzIHVzZWQgZm9yIGNvbG9yIGF0dGFjaG1lbnQgaW1hZ2VzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iOSIgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCIgICAgY29tbWVudD0iRm9ybWF0IGNhbiBiZSB1c2VkIGZvciBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgaW1hZ2VzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMTAiICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9TUkNfQklUIiAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iRm9ybWF0IGNhbiBiZSB1c2VkIGFzIHRoZSBzb3VyY2UgaW1hZ2Ugb2YgYmxpdHMgd2l0aCB2a0NtZEJsaXRJbWFnZSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjExIiAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX0JMSVRfRFNUX0JJVCIgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkZvcm1hdCBjYW4gYmUgdXNlZCBhcyB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugb2YgYmxpdHMgd2l0aCB2a0NtZEJsaXRJbWFnZSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEyIiAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQiIGNvbW1lbnQ9IkZvcm1hdCBjYW4gYmUgZmlsdGVyZWQgd2l0aCBWS19GSUxURVJfTElORUFSIHdoZW4gYmVpbmcgc2FtcGxlZCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrUXVlcnlDb250cm9sRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQiICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlJlcXVpcmUgcHJlY2lzZSByZXN1bHRzIHRvIGJlIGNvbGxlY3RlZCBieSB0aGUgcXVlcnkiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1F1ZXJ5UmVzdWx0RmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX1FVRVJZX1JFU1VMVF82NF9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlJlc3VsdHMgb2YgdGhlIHF1ZXJpZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBhcyA2NC1iaXQgdmFsdWVzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfUVVFUllfUkVTVUxUX1dBSVRfQklUIiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iUmVzdWx0cyBvZiB0aGUgcXVlcmllcyBhcmUgd2FpdGVkIG9uIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGhlIHJlc3VsdCBjb3B5Ii8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfUVVFUllfUkVTVUxUX1dJVEhfQVZBSUxBQklMSVRZX0JJVCIgICAgICAgICAgICAgY29tbWVudD0iQmVzaWRlcyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnksIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHJlc3VsdHMgaXMgYWxzbyB3cml0dGVuIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfUVVFUllfUkVTVUxUX1BBUlRJQUxfQklUIiAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iQ29weSB0aGUgcGFydGlhbCByZXN1bHRzIG9mIHRoZSBxdWVyeSBldmVuIGlmIHRoZSBmaW5hbCByZXN1bHRzIGFyZSBub3QgYXZhaWxhYmxlIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfT05FX1RJTUVfU1VCTUlUX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEiICAgIG5hbWU9IlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUIiAgICAgIGNvbW1lbnQ9IkNvbW1hbmQgYnVmZmVyIG1heSBiZSBzdWJtaXR0ZWQvZXhlY3V0ZWQgbW9yZSB0aGFuIG9uY2Ugc2ltdWx0YW5lb3VzbHkiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0lOUFVUX0FTU0VNQkxZX1ZFUlRJQ0VTX0JJVCIgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0lOUFVUX0FTU0VNQkxZX1BSSU1JVElWRVNfQklUIiAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1ZFUlRFWF9TSEFERVJfSU5WT0NBVElPTlNfQklUIiAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQiICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNCIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0dFT01FVFJZX1NIQURFUl9QUklNSVRJVkVTX0JJVCIgICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NMSVBQSU5HX0lOVk9DQVRJT05TX0JJVCIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNiIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NMSVBQSU5HX1BSSU1JVElWRVNfQklUIiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNyIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0ZSQUdNRU5UX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQiICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iOCIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9QQVRDSEVTX0JJVCIgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iOSIgICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQiIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMTAiICAgbmFtZT0iVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NPTVBVVEVfU0hBREVSX0lOVk9DQVRJT05TX0JJVCIgICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik9wdGlvbmFsIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX0lNQUdFX0FTUEVDVF9NRVRBREFUQV9CSVQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1NwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX1NQQVJTRV9JTUFHRV9GT1JNQVRfU0lOR0xFX01JUFRBSUxfQklUIiAgICAgICAgIGNvbW1lbnQ9IkltYWdlIHVzZXMgYSBzaW5nbGUgbWlwIHRhaWwgcmVnaW9uIGZvciBhbGwgYXJyYXkgbGF5ZXJzIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfU1BBUlNFX0lNQUdFX0ZPUk1BVF9BTElHTkVEX01JUF9TSVpFX0JJVCIgICAgICAgY29tbWVudD0iSW1hZ2UgcmVxdWlyZXMgbWlwIGxldmVsIGRpbWVuc2lvbnMgdG8gYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiB0aGUgc3BhcnNlIGltYWdlIGJsb2NrIGRpbWVuc2lvbnMgZm9yIG5vbi10YWlsIG1pcCBsZXZlbHMuIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfU1BBUlNFX0lNQUdFX0ZPUk1BVF9OT05TVEFOREFSRF9CTE9DS19TSVpFX0JJVCIgY29tbWVudD0iSW1hZ2UgdXNlcyBhIG5vbi1zdGFuZGFyZCBzcGFyc2UgaW1hZ2UgYmxvY2sgZGltZW5zaW9ucyIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19TUEFSU0VfTUVNT1JZX0JJTkRfTUVUQURBVEFfQklUIiAgICAgICAgICAgICAgICBjb21tZW50PSJPcGVyYXRpb24gYmluZHMgcmVzb3VyY2UgbWV0YWRhdGEgdG8gbWVtb3J5Ii8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCIgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkJlZm9yZSBzdWJzZXF1ZW50IGNvbW1hbmRzIGFyZSBwcm9jZXNzZWQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19QSVBFTElORV9TVEFHRV9EUkFXX0lORElSRUNUX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJEcmF3L0Rpc3BhdGNoSW5kaXJlY3QgY29tbWFuZCBmZXRjaCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9JTlBVVF9CSVQiICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZlcnRleC9pbmRleCBmZXRjaCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9TSEFERVJfQklUIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZlcnRleCBzaGFkaW5nIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNCIgICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCIgY29tbWVudD0iVGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGluZyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjUiICAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQiIGNvbW1lbnQ9IlRlc3NlbGxhdGlvbiBldmFsdWF0aW9uIHNoYWRpbmciLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI2IiAgICBuYW1lPSJWS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUIiAgICAgICAgICAgICBjb21tZW50PSJHZW9tZXRyeSBzaGFkaW5nIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNyIgICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCIgICAgICAgICAgICAgY29tbWVudD0iRnJhZ21lbnQgc2hhZGluZyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjgiICAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX0VBUkxZX0ZSQUdNRU5UX1RFU1RTX0JJVCIgICAgICAgIGNvbW1lbnQ9IkVhcmx5IGZyYWdtZW50IChkZXB0aCBhbmQgc3RlbmNpbCkgdGVzdHMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI5IiAgICBuYW1lPSJWS19QSVBFTElORV9TVEFHRV9MQVRFX0ZSQUdNRU5UX1RFU1RTX0JJVCIgICAgICAgICBjb21tZW50PSJMYXRlIGZyYWdtZW50IChkZXB0aCBhbmQgc3RlbmNpbCkgdGVzdHMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxMCIgICBuYW1lPSJWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQiICAgICBjb21tZW50PSJDb2xvciBhdHRhY2htZW50IHdyaXRlcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjExIiAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCIgICAgICAgICAgICAgIGNvbW1lbnQ9IkNvbXB1dGUgc2hhZGluZyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEyIiAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCIgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlRyYW5zZmVyL2NvcHkgb3BlcmF0aW9ucyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEzIiAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCIgICAgICAgICAgICAgIGNvbW1lbnQ9IkFmdGVyIHByZXZpb3VzIGNvbW1hbmRzIGhhdmUgY29tcGxldGVkIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMTQiICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iSW5kaWNhdGVzIGhvc3QgKENQVSkgaXMgYSBzb3VyY2Uvc2luayBvZiB0aGUgZGVwZW5kZW5jeSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjE1IiAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX0FMTF9HUkFQSElDU19CSVQiICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkFsbCBzdGFnZXMgb2YgdGhlIGdyYXBoaWNzIHBpcGVsaW5lIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMTYiICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCIgICAgICAgICAgICAgICAgY29tbWVudD0iQWxsIHN0YWdlcyBzdXBwb3J0ZWQgb24gdGhlIHF1ZXVlIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1RSQU5TSUVOVF9CSVQiICAgICAgICAgICAgICBjb21tZW50PSJDb21tYW5kIGJ1ZmZlcnMgaGF2ZSBhIHNob3J0IGxpZmV0aW1lIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQiICAgY29tbWVudD0iQ29tbWFuZCBidWZmZXJzIG1heSByZWxlYXNlIHRoZWlyIG1lbW9yeSBpbmRpdmlkdWFsbHkiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0NvbW1hbmRQb29sUmVzZXRGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfQ09NTUFORF9QT09MX1JFU0VUX1JFTEVBU0VfUkVTT1VSQ0VTX0JJVCIgICAgICAgY29tbWVudD0iUmVsZWFzZSByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHBvb2wiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19DT01NQU5EX0JVRkZFUl9SRVNFVF9SRUxFQVNFX1JFU09VUkNFU19CSVQiICAgICBjb21tZW50PSJSZWxlYXNlIHJlc291cmNlcyBvd25lZCBieSB0aGUgYnVmZmVyIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTYW1wbGVDb3VudEZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19TQU1QTEVfQ09VTlRfMV9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJTYW1wbGUgY291bnQgMSBzdXBwb3J0ZWQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19TQU1QTEVfQ09VTlRfMl9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJTYW1wbGUgY291bnQgMiBzdXBwb3J0ZWQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIyIiAgICBuYW1lPSJWS19TQU1QTEVfQ09VTlRfNF9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJTYW1wbGUgY291bnQgNCBzdXBwb3J0ZWQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiAgICBuYW1lPSJWS19TQU1QTEVfQ09VTlRfOF9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJTYW1wbGUgY291bnQgOCBzdXBwb3J0ZWQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI0IiAgICBuYW1lPSJWS19TQU1QTEVfQ09VTlRfMTZfQklUIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PSJTYW1wbGUgY291bnQgMTYgc3VwcG9ydGVkIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgICAgbmFtZT0iVktfU0FNUExFX0NPVU5UXzMyX0JJVCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iU2FtcGxlIGNvdW50IDMyIHN1cHBvcnRlZCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjYiICAgIG5hbWU9IlZLX1NBTVBMRV9DT1VOVF82NF9CSVQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IlNhbXBsZSBjb3VudCA2NCBzdXBwb3J0ZWQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX01BWV9BTElBU19CSVQiICAgICAgICAgICBjb21tZW50PSJUaGUgYXR0YWNobWVudCBtYXkgYWxpYXMgcGh5c2ljYWwgbWVtb3J5IG9mIGFub3RoZXIgYXR0YWNobWVudCBpbiB0aGUgc2FtZSByZW5kZXIgcGFzcyIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU3RlbmNpbEZhY2VGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfU1RFTkNJTF9GQUNFX0ZST05UX0JJVCIgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iRnJvbnQgZmFjZSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEiICAgIG5hbWU9IlZLX1NURU5DSUxfRkFDRV9CQUNLX0JJVCIgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkJhY2sgZmFjZSIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMHgwMDAwMDAwMyIgbmFtZT0iVktfU1RFTkNJTF9GQUNFX0ZST05UX0FORF9CQUNLIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IkZyb250IGFuZCBiYWNrIGZhY2VzIi8+CisgICAgICAgIDxlbnVtICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVEVOQ0lMX0ZST05UX0FORF9CQUNLIiBhbGlhcz0iVktfU1RFTkNJTF9GQUNFX0ZST05UX0FORF9CQUNLIiBjb21tZW50PSJBbGlhcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfRlJFRV9ERVNDUklQVE9SX1NFVF9CSVQiIGNvbW1lbnQ9IkRlc2NyaXB0b3Igc2V0cyBtYXkgYmUgZnJlZWQgaW5kaXZpZHVhbGx5Ii8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtEZXBlbmRlbmN5RmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9IkRlcGVuZGVuY3kgaXMgcGVyIHBpeGVsIHJlZ2lvbiAiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1NlbWFwaG9yZVR5cGVLSFIiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1NlbWFwaG9yZVdhaXRGbGFnQml0c0tIUiIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfU0VNQVBIT1JFX1dBSVRfQU5ZX0JJVF9LSFIiLz4KKyAgICA8L2VudW1zPgorCisgICAgICAgIDxjb21tZW50PldTSSBFeHRlbnNpb25zPC9jb21tZW50PgorICAgIDxlbnVtcyBuYW1lPSJWa1ByZXNlbnRNb2RlS0hSIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19QUkVTRU5UX01PREVfSU1NRURJQVRFX0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1BSRVNFTlRfTU9ERV9NQUlMQk9YX0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1BSRVNFTlRfTU9ERV9GSUZPX0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX1BSRVNFTlRfTU9ERV9GSUZPX1JFTEFYRURfS0hSIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDb2xvclNwYWNlS0hSIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFIiLz4KKyAgICAgICAgPGVudW0gICAgICAgICAgICAgICBuYW1lPSJWS19DT0xPUlNQQUNFX1NSR0JfTk9OTElORUFSX0tIUiIgYWxpYXM9IlZLX0NPTE9SX1NQQUNFX1NSR0JfTk9OTElORUFSX0tIUiIgY29tbWVudD0iQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMgY29udGFpbmluZyBhIHR5cG8iLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0RJU1BMQVlfUExBTkVfQUxQSEFfT1BBUVVFX0JJVF9LSFIiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19ESVNQTEFZX1BMQU5FX0FMUEhBX0dMT0JBTF9CSVRfS0hSIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfRElTUExBWV9QTEFORV9BTFBIQV9QRVJfUElYRUxfQklUX0tIUiIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX0RJU1BMQVlfUExBTkVfQUxQSEFfUEVSX1BJWEVMX1BSRU1VTFRJUExJRURfQklUX0tIUiIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfQ09NUE9TSVRFX0FMUEhBX09QQVFVRV9CSVRfS0hSIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfQ09NUE9TSVRFX0FMUEhBX1BSRV9NVUxUSVBMSUVEX0JJVF9LSFIiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIyIiAgICBuYW1lPSJWS19DT01QT1NJVEVfQUxQSEFfUE9TVF9NVUxUSVBMSUVEX0JJVF9LSFIiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiAgICBuYW1lPSJWS19DT01QT1NJVEVfQUxQSEFfSU5IRVJJVF9CSVRfS0hSIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX1NVUkZBQ0VfVFJBTlNGT1JNX0lERU5USVRZX0JJVF9LSFIiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfOTBfQklUX0tIUiIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV8xODBfQklUX0tIUiIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV8yNzBfQklUX0tIUiIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjQiICAgIG5hbWU9IlZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX0JJVF9LSFIiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI1IiAgICBuYW1lPSJWS19TVVJGQUNFX1RSQU5TRk9STV9IT1JJWk9OVEFMX01JUlJPUl9ST1RBVEVfOTBfQklUX0tIUiIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjYiICAgIG5hbWU9IlZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8xODBfQklUX0tIUiIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjciICAgIG5hbWU9IlZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8yNzBfQklUX0tIUiIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjgiICAgIG5hbWU9IlZLX1NVUkZBQ0VfVFJBTlNGT1JNX0lOSEVSSVRfQklUX0tIUiIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU3dhcGNoYWluSW1hZ2VVc2FnZUZsYWdCaXRzQU5EUk9JRCIgdHlwZT0iYml0bWFzayI+CisgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgICAgbmFtZT0iVktfU1dBUENIQUlOX0lNQUdFX1VTQUdFX1NIQVJFRF9CSVRfQU5EUk9JRCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrVGltZURvbWFpbkVYVCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfVElNRV9ET01BSU5fREVWSUNFX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1RJTUVfRE9NQUlOX0NMT0NLX01PTk9UT05JQ19FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19USU1FX0RPTUFJTl9DTE9DS19NT05PVE9OSUNfUkFXX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX1RJTUVfRE9NQUlOX1FVRVJZX1BFUkZPUk1BTkNFX0NPVU5URVJfRVhUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEiICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIyIiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI0IiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI4IiAgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5IiAgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEwIiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMSIgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VWRU5UX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTIiICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVSWV9QT09MX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTMiICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfVklFV19FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE0IiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfVklFV19FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE1IiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE2IiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEVfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxNyIgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjE4IiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxOSIgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjAiICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyMSIgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyMiIgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIzIiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNCIgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjUiICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0xfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyNiIgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjciICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjgiICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfRVhUX0VYVCIvPgorICAgICAgICA8ZW51bSAgICAgICAgICAgICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfRVhUIiBhbGlhcz0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhUIiBjb21tZW50PSJCYWNrd2FyZHMtY29tcGF0aWJsZSBhbGlhcyBjb250YWluaW5nIGEgdHlwbyIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjkiICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUl9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMwIiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUl9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMxIiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMyIiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMzIiAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFRfRVhUIi8+CisgICAgICAgIDxlbnVtICAgICAgICAgICAgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUIiBhbGlhcz0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUX0VYVCIgY29tbWVudD0iQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMgY29udGFpbmluZyBhIHR5cG8iLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1Jhc3Rlcml6YXRpb25PcmRlckFNRCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfUkFTVEVSSVpBVElPTl9PUkRFUl9TVFJJQ1RfQU1EIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfUkFTVEVSSVpBVElPTl9PUkRFUl9SRUxBWEVEX0FNRCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfTlYiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfTlYiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIyIiAgICBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfSU1BR0VfQklUX05WIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX0lNQUdFX0tNVF9CSVRfTlYiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlYiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0RFRElDQVRFRF9PTkxZX0JJVF9OViIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEiICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX05WIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfTlYiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1ZhbGlkYXRpb25DaGVja0VYVCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfVkFMSURBVElPTl9DSEVDS19BTExfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfVkFMSURBVElPTl9DSEVDS19TSEFERVJTX0VYVCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX1JFU0VSVkVfQklORElOR19TTE9UX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfQkVTVF9QUkFDVElDRVNfRVhUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FMTF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9TSEFERVJTX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1RIUkVBRF9TQUZFVFlfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQVBJX1BBUkFNRVRFUlNfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfT0JKRUNUX0xJRkVUSU1FU19FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9DT1JFX0NIRUNLU19FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYiICAgICBuYW1lPSJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9VTklRVUVfSEFORExFU19FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1N1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19TVUJHUk9VUF9GRUFUVVJFX0JBU0lDX0JJVCIgICAgICAgICAgICAgIGNvbW1lbnQ9IkJhc2ljIHN1Ymdyb3VwIG9wZXJhdGlvbnMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19TVUJHUk9VUF9GRUFUVVJFX1ZPVEVfQklUIiAgICAgICAgICAgICAgIGNvbW1lbnQ9IlZvdGUgc3ViZ3JvdXAgb3BlcmF0aW9ucyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX1NVQkdST1VQX0ZFQVRVUkVfQVJJVEhNRVRJQ19CSVQiICAgICAgICAgY29tbWVudD0iQXJpdGhtZXRpYyBzdWJncm91cCBvcGVyYXRpb25zIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfU1VCR1JPVVBfRkVBVFVSRV9CQUxMT1RfQklUIiAgICAgICAgICAgICBjb21tZW50PSJCYWxsb3Qgc3ViZ3JvdXAgb3BlcmF0aW9ucyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjQiICAgIG5hbWU9IlZLX1NVQkdST1VQX0ZFQVRVUkVfU0hVRkZMRV9CSVQiICAgICAgICAgICAgY29tbWVudD0iU2h1ZmZsZSBzdWJncm91cCBvcGVyYXRpb25zIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgICAgbmFtZT0iVktfU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX1JFTEFUSVZFX0JJVCIgICBjb21tZW50PSJTaHVmZmxlIHJlbGF0aXZlIHN1Ymdyb3VwIG9wZXJhdGlvbnMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI2IiAgICBuYW1lPSJWS19TVUJHUk9VUF9GRUFUVVJFX0NMVVNURVJFRF9CSVQiICAgICAgICAgIGNvbW1lbnQ9IkNsdXN0ZXJlZCBzdWJncm91cCBvcGVyYXRpb25zIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNyIgICAgbmFtZT0iVktfU1VCR1JPVVBfRkVBVFVSRV9RVUFEX0JJVCIgICAgICAgICAgICAgICBjb21tZW50PSJRdWFkIHN1Ymdyb3VwIG9wZXJhdGlvbnMiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfVU5PUkRFUkVEX1NFUVVFTkNFU19CSVRfTlZYIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX1VTQUdFX1NQQVJTRV9TRVFVRU5DRVNfQklUX05WWCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9FTVBUWV9FWEVDVVRJT05TX0JJVF9OVlgiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiAgICBuYW1lPSJWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfSU5ERVhFRF9TRVFVRU5DRVNfQklUX05WWCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19PQkpFQ1RfRU5UUllfVVNBR0VfR1JBUEhJQ1NfQklUX05WWCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEiICAgIG5hbWU9IlZLX09CSkVDVF9FTlRSWV9VU0FHRV9DT01QVVRFX0JJVF9OVlgiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlgiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfUElQRUxJTkVfTlZYIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ERVNDUklQVE9SX1NFVF9OVlgiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0lOREVYX0JVRkZFUl9OVlgiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICBuYW1lPSJWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX1ZFUlRFWF9CVUZGRVJfTlZYIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9QVVNIX0NPTlNUQU5UX05WWCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNSIgICAgIG5hbWU9IlZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19JTkRFWEVEX05WWCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgIG5hbWU9IlZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19OVlgiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICBuYW1lPSJWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0RJU1BBVENIX05WWCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrT2JqZWN0RW50cnlUeXBlTlZYIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19PQkpFQ1RfRU5UUllfVFlQRV9ERVNDUklQVE9SX1NFVF9OVlgiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19PQkpFQ1RfRU5UUllfVFlQRV9QSVBFTElORV9OVlgiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19PQkpFQ1RfRU5UUllfVFlQRV9JTkRFWF9CVUZGRVJfTlZYIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfT0JKRUNUX0VOVFJZX1RZUEVfVkVSVEVYX0JVRkZFUl9OVlgiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19PQkpFQ1RfRU5UUllfVFlQRV9QVVNIX0NPTlNUQU5UX05WWCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEiICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iNCIgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfS01UX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjUiICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjYiICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9SRVNPVVJDRV9CSVQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSI0IiAgICBuYW1lPSJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEiICAgIG5hbWU9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfU0VNQVBIT1JFX0lNUE9SVF9URU1QT1JBUllfQklUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtGZW5jZUltcG9ydEZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfU1VSRkFDRV9DT1VOVEVSX1ZCTEFOS19FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0Rpc3BsYXlQb3dlclN0YXRlRVhUIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19ESVNQTEFZX1BPV0VSX1NUQVRFX09GRl9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19ESVNQTEFZX1BPV0VSX1NUQVRFX1NVU1BFTkRfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfRElTUExBWV9QT1dFUl9TVEFURV9PTl9FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0RldmljZUV2ZW50VHlwZUVYVCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfREVWSUNFX0VWRU5UX1RZUEVfRElTUExBWV9IT1RQTFVHX0VYVCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRGlzcGxheUV2ZW50VHlwZUVYVCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfRElTUExBWV9FVkVOVF9UWVBFX0ZJUlNUX1BJWEVMX09VVF9FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9TUkNfQklUIiAgICAgICAgICAgY29tbWVudD0iQ2FuIHJlYWQgd2l0aCB2a0NtZENvcHkgY29tbWFuZHMiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfRFNUX0JJVCIgICAgICAgICAgIGNvbW1lbnQ9IkNhbiB3cml0ZSB3aXRoIHZrQ21kQ29weSBjb21tYW5kcyIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklUIiAgICAgICAgY29tbWVudD0iQ2FuIHJlYWQgd2l0aCBhbnkgYWNjZXNzIHR5cGUvY29tbWFuZCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiICAgIG5hbWU9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19EU1RfQklUIiAgICAgICAgY29tbWVudD0iQ2FuIHdyaXRlIHdpdGggYW5kIGFjY2VzcyB0eXBlL2NvbW1hbmQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfTUFTS19CSVQiICAgICAgICAgICAgY29tbWVudD0iRm9yY2UgYWxsb2NhdGlvbiBvbiBzcGVjaWZpYyBkZXZpY2VzIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgIG5hbWU9IlZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfTE9DQUxfQklUX0tIUiIgICAgICAgIGNvbW1lbnQ9IlByZXNlbnQgZnJvbSBsb2NhbCBtZW1vcnkiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICBuYW1lPSJWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX1JFTU9URV9CSVRfS0hSIiAgICAgICBjb21tZW50PSJQcmVzZW50IGZyb20gcmVtb3RlIG1lbW9yeSIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfU1VNX0JJVF9LSFIiICAgICAgICAgIGNvbW1lbnQ9IlByZXNlbnQgc3VtIG9mIGxvY2FsIGFuZC9vciByZW1vdGUgbWVtb3J5Ii8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgICAgbmFtZT0iVktfREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9MT0NBTF9NVUxUSV9ERVZJQ0VfQklUX0tIUiIgY29tbWVudD0iRWFjaCBwaHlzaWNhbCBkZXZpY2UgcHJlc2VudHMgZnJvbSBsb2NhbCBtZW1vcnkiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1N3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIiB0eXBlPSJiaXRtYXNrIj4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1hfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfWF9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9ZX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX05FR0FUSVZFX1lfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfWl9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNSIgICAgIG5hbWU9IlZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9ORUdBVElWRV9aX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI2IiAgICAgbmFtZT0iVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1dfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICBuYW1lPSJWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfV19OViIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRGlzY2FyZFJlY3RhbmdsZU1vZGVFWFQiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfSU5DTFVTSVZFX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfRVhDTFVTSVZFX0VYVCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMiIHR5cGU9ImJpdG1hc2siPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9BTExfQ0xJUF9QTEFORVMiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9VU0VSX0NMSVBfUExBTkVTX09OTFkiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX1dFSUdIVEVEX0FWRVJBR0VfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4iIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1VQUEVSX0xFRlQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9MT1dFUl9MRUZUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24iIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SR0JfSURFTlRJVFkiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfSURFTlRJVFkiIGNvbW1lbnQ9Imp1c3QgcmFuZ2UgZXhwYW5zaW9uIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzcwOSIgICAgICBjb21tZW50PSJha2EgSEQgWVVWIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzYwMSIgICAgICBjb21tZW50PSJha2EgU0QgWVVWIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzIwMjAiICAgICBjb21tZW50PSJha2EgVUhEIFlVViIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU2FtcGxlclljYmNyUmFuZ2UiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX0ZVTEwiICAgIGNvbW1lbnQ9Ikx1bWEgMC4uMSBtYXBzIHRvIDAuLjI1NSwgY2hyb21hIC0wLjUuLjAuNSB0byAxLi4yNTUgKGNsYW1wZWQpIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XIiAgY29tbWVudD0iTHVtYSAwLi4xIG1hcHMgdG8gMTYuLjIzNSwgY2hyb21hIC0wLjUuLjAuNSB0byAxNi4uMjQwIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDaHJvbWFMb2NhdGlvbiIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQmxlbmRPdmVybGFwRVhUIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19CTEVORF9PVkVSTEFQX1VOQ09SUkVMQVRFRF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19CTEVORF9PVkVSTEFQX0RJU0pPSU5UX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX0JMRU5EX09WRVJMQVBfQ09OSk9JTlRfRVhUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9OT05FX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX1JHQl9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9BTFBIQV9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9SR0JBX05WIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOViIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfTUVSR0VfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9UUlVOQ0FURV9OViIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrVmFsaWRhdGlvbkNhY2hlSGVhZGVyVmVyc2lvbkVYVCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkVfRVhUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTaGFkZXJJbmZvVHlwZUFNRCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfU0hBREVSX0lORk9fVFlQRV9TVEFUSVNUSUNTX0FNRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1NIQURFUl9JTkZPX1RZUEVfQklOQVJZX0FNRCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1NIQURFUl9JTkZPX1RZUEVfRElTQVNTRU1CTFlfQU1EIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtRdWV1ZUdsb2JhbFByaW9yaXR5RVhUIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEyOCIgICBuYW1lPSJWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfTE9XX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMjU2IiAgIG5hbWU9IlZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9NRURJVU1fRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1MTIiICAgbmFtZT0iVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0hJR0hfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMDI0IiAgbmFtZT0iVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX1JFQUxUSU1FX0VYVCIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1ZFUkJPU0VfQklUX0VYVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjQiICAgIG5hbWU9IlZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iOCIgICAgbmFtZT0iVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9XQVJOSU5HX0JJVF9FWFQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxMiIgICBuYW1lPSJWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0VSUk9SX0JJVF9FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfR0VORVJBTF9CSVRfRVhUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1ZBTElEQVRJT05fQklUX0VYVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICAgIG5hbWU9IlZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9QRVJGT1JNQU5DRV9CSVRfRVhUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9ESVNBQkxFRF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX09WRVJFU1RJTUFURV9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX1VOREVSRVNUSU1BVEVfRVhUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiBuYW1lPSJWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjEiIG5hbWU9IlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiIG5hbWU9IlZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjMiIG5hbWU9IlZLX0RFU0NSSVBUT1JfQklORElOR19WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0JJVF9FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1ZlbmRvcklkIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGNvbW1lbnQ+VmVuZG9yIElEcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGVudW1zIGluc3RlYWQgb2YgdGhlIG9sZAorICAgICAgICAgICAgICAgICAmbHQ7dmVuZG9yaWRzJmd0OyB0YWcsIGFsbG93aW5nIHRoZW0gdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgIEFQSSBoZWFkZXJzLjwvY29tbWVudD4KKyAgICAgICAgPGVudW0gdmFsdWU9IjB4MTAwMDEiIG5hbWU9IlZLX1ZFTkRPUl9JRF9WSVYiICAgY29tbWVudD0iVml2YW50ZSB2ZW5kb3IgSUQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjB4MTAwMDIiIG5hbWU9IlZLX1ZFTkRPUl9JRF9WU0kiICAgY29tbWVudD0iVmVyaVNpbGljb24gdmVuZG9yIElEIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIweDEwMDAzIiBuYW1lPSJWS19WRU5ET1JfSURfS0FaQU4iIGNvbW1lbnQ9IkthemFuIFNvZnR3YXJlIFJlbmRlcmVyIi8+CisgICAgICAgICAgICA8dW51c2VkIHN0YXJ0PSIweDEwMDA0IiBjb21tZW50PSJUaGlzIGlzIHRoZSBuZXh0IHVudXNlZCBhdmFpbGFibGUgS2hyb25vcyB2ZW5kb3IgSUQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0RyaXZlcklkS0hSIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGNvbW1lbnQ+RHJpdmVyIElEcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGVudW1zIGluc3RlYWQgb2YgdGhlIG9sZAorICAgICAgICAgICAgICAgICAmbHQ7ZHJpdmVyaWRzJmd0OyB0YWcsIGFsbG93aW5nIHRoZW0gdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgIEFQSSBoZWFkZXJzLjwvY29tbWVudD4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgIG5hbWU9IlZLX0RSSVZFUl9JRF9BTURfUFJPUFJJRVRBUllfS0hSIiAgICAgICAgICAgY29tbWVudD0iQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgbmFtZT0iVktfRFJJVkVSX0lEX0FNRF9PUEVOX1NPVVJDRV9LSFIiICAgICAgICAgICBjb21tZW50PSJBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgICBuYW1lPSJWS19EUklWRVJfSURfTUVTQV9SQURWX0tIUiIgICAgICAgICAgICAgICAgIGNvbW1lbnQ9Ik1lc2Egb3BlbiBzb3VyY2UgcHJvamVjdCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgICAgICAgbmFtZT0iVktfRFJJVkVSX0lEX05WSURJQV9QUk9QUklFVEFSWV9LSFIiICAgICAgICBjb21tZW50PSJOVklESUEgQ29ycG9yYXRpb24iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICAgIG5hbWU9IlZLX0RSSVZFUl9JRF9JTlRFTF9QUk9QUklFVEFSWV9XSU5ET1dTX0tIUiIgY29tbWVudD0iSW50ZWwgQ29ycG9yYXRpb24iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYiICAgICAgIG5hbWU9IlZLX0RSSVZFUl9JRF9JTlRFTF9PUEVOX1NPVVJDRV9NRVNBX0tIUiIgICAgY29tbWVudD0iSW50ZWwgQ29ycG9yYXRpb24iLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICAgIG5hbWU9IlZLX0RSSVZFUl9JRF9JTUFHSU5BVElPTl9QUk9QUklFVEFSWV9LSFIiICAgY29tbWVudD0iSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI4IiAgICAgICBuYW1lPSJWS19EUklWRVJfSURfUVVBTENPTU1fUFJPUFJJRVRBUllfS0hSIiAgICAgIGNvbW1lbnQ9IlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iOSIgICAgICAgbmFtZT0iVktfRFJJVkVSX0lEX0FSTV9QUk9QUklFVEFSWV9LSFIiICAgICAgICAgICBjb21tZW50PSJBcm0gTGltaXRlZCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTAiICAgICAgbmFtZT0iVktfRFJJVkVSX0lEX0dPT0dMRV9TV0lGVFNIQURFUl9LSFIiICAgICAgICBjb21tZW50PSJHb29nbGUgTExDIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxMSIgICAgICBuYW1lPSJWS19EUklWRVJfSURfR0dQX1BST1BSSUVUQVJZX0tIUiIgICAgICAgICAgIGNvbW1lbnQ9Ikdvb2dsZSBMTEMiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEyIiAgICAgIG5hbWU9IlZLX0RSSVZFUl9JRF9CUk9BRENPTV9QUk9QUklFVEFSWV9LSFIiICAgICAgY29tbWVudD0iQnJvYWRjb20gSW5jLiIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVCIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgbmFtZT0iVktfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lOVkVSVEVEX0JJVF9FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFIiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgbmFtZT0iVktfUkVTT0xWRV9NT0RFX05PTkVfS0hSIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgbmFtZT0iVktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFIiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiBuYW1lPSJWS19SRVNPTFZFX01PREVfQVZFUkFHRV9CSVRfS0hSIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgbmFtZT0iVktfUkVTT0xWRV9NT0RFX01JTl9CSVRfS0hSIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgbmFtZT0iVktfUkVTT0xWRV9NT0RFX01BWF9CSVRfS0hSIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiIG5hbWU9IlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZX05PX0lOVk9DQVRJT05TX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiBuYW1lPSJWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xNl9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiIG5hbWU9IlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzhfSU5WT0NBVElPTlNfUEVSX1BJWEVMX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiBuYW1lPSJWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV80X0lOVk9DQVRJT05TX1BFUl9QSVhFTF9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgbmFtZT0iVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMl9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiIG5hbWU9IlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfUElYRUxfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjYiIG5hbWU9IlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfMlgxX1BJWEVMU19OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNyIgbmFtZT0iVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8xWDJfUElYRUxTX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI4IiBuYW1lPSJWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYMl9QSVhFTFNfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjkiIG5hbWU9IlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfNFgyX1BJWEVMU19OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTAiIG5hbWU9IlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfMlg0X1BJWEVMU19OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTEiIG5hbWU9IlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfNFg0X1BJWEVMU19OViIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgbmFtZT0iVktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX0RFRkFVTFRfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiIG5hbWU9IlZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9DVVNUT01fTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiIG5hbWU9IlZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9QSVhFTF9NQUpPUl9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgbmFtZT0iVktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX1NBTVBMRV9NQUpPUl9OViIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlYiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiIG5hbWU9IlZLX0dFT01FVFJZX0lOU1RBTkNFX1RSSUFOR0xFX0NVTExfRElTQUJMRV9CSVRfTlYiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiBuYW1lPSJWS19HRU9NRVRSWV9JTlNUQU5DRV9UUklBTkdMRV9GUk9OVF9DT1VOVEVSQ0xPQ0tXSVNFX0JJVF9OViIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjIiIG5hbWU9IlZLX0dFT01FVFJZX0lOU1RBTkNFX0ZPUkNFX09QQVFVRV9CSVRfTlYiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiBuYW1lPSJWS19HRU9NRVRSWV9JTlNUQU5DRV9GT1JDRV9OT19PUEFRVUVfQklUX05WIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtHZW9tZXRyeUZsYWdCaXRzTlYiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiIG5hbWU9IlZLX0dFT01FVFJZX09QQVFVRV9CSVRfTlYiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiBuYW1lPSJWS19HRU9NRVRSWV9OT19EVVBMSUNBVEVfQU5ZX0hJVF9JTlZPQ0FUSU9OX0JJVF9OViIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiBuYW1lPSJWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX1VQREFURV9CSVRfTlYiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiBuYW1lPSJWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX0NPTVBBQ1RJT05fQklUX05WIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgbmFtZT0iVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9UUkFDRV9CSVRfTlYiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiBuYW1lPSJWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1BSRUZFUl9GQVNUX0JVSUxEX0JJVF9OViIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjQiIG5hbWU9IlZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTE9XX01FTU9SWV9CSVRfTlYiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgbmFtZT0iVktfQ09QWV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01PREVfQ0xPTkVfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiIG5hbWU9IlZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NPTVBBQ1RfTlYiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOViIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiBuYW1lPSJWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfVE9QX0xFVkVMX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiBuYW1lPSJWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtHZW9tZXRyeVR5cGVOViIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiBuYW1lPSJWS19HRU9NRVRSWV9UWVBFX1RSSUFOR0xFU19OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgbmFtZT0iVktfR0VPTUVUUllfVFlQRV9BQUJCU19OViIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzVHlwZU5WIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiIG5hbWU9IlZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX09CSkVDVF9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgbmFtZT0iVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfQlVJTERfU0NSQVRDSF9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgbmFtZT0iVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfVVBEQVRFX1NDUkFUQ0hfTlYiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOViIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiBuYW1lPSJWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiBuYW1lPSJWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9UUklBTkdMRVNfSElUX0dST1VQX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiBuYW1lPSJWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9QUk9DRURVUkFMX0hJVF9HUk9VUF9OViIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrTWVtb3J5T3ZlcmFsbG9jYXRpb25CZWhhdmlvckFNRCIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RFRkFVTFRfQU1EIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0FMTE9XRURfQU1EIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RJU0FMTE9XRURfQU1EIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1Njb3BlTlYiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgIG5hbWU9IlZLX1NDT1BFX0RFVklDRV9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1NDT1BFX1dPUktHUk9VUF9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX1NDT1BFX1NVQkdST1VQX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1IiAgICAgbmFtZT0iVktfU0NPUEVfUVVFVUVfRkFNSUxZX05WIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtDb21wb25lbnRUeXBlTlYiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUMTZfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19DT01QT05FTlRfVFlQRV9GTE9BVDMyX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfQ09NUE9ORU5UX1RZUEVfRkxPQVQ2NF9OViIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX0NPTVBPTkVOVF9UWVBFX1NJTlQ4X05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfQ09NUE9ORU5UX1RZUEVfU0lOVDE2X05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI1IiAgICAgbmFtZT0iVktfQ09NUE9ORU5UX1RZUEVfU0lOVDMyX05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI2IiAgICAgbmFtZT0iVktfQ09NUE9ORU5UX1RZUEVfU0lOVDY0X05WIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI3IiAgICAgbmFtZT0iVktfQ09NUE9ORU5UX1RZUEVfVUlOVDhfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjgiICAgICBuYW1lPSJWS19DT01QT05FTlRfVFlQRV9VSU5UMTZfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjkiICAgICBuYW1lPSJWS19DT01QT05FTlRfVFlQRV9VSU5UMzJfTlYiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEwIiAgICBuYW1lPSJWS19DT01QT05FTlRfVFlQRV9VSU5UNjRfTlYiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdCaXRzRVhUIiB0eXBlPSJiaXRtYXNrIj4KKyAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgICBuYW1lPSJWS19QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19WQUxJRF9CSVRfRVhUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQVBQTElDQVRJT05fUElQRUxJTkVfQ0FDSEVfSElUX0JJVF9FWFQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIyIiAgICBuYW1lPSJWS19QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19CQVNFX1BJUEVMSU5FX0FDQ0VMRVJBVElPTl9CSVRfRVhUIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfREVGQVVMVF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQUxMT1dFRF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRElTQUxMT1dFRF9FWFQiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICBuYW1lPSJWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQVBQTElDQVRJT05fQ09OVFJPTExFRF9FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19RVUVSWV9TQ09QRV9DT01NQU5EX0JVRkZFUl9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19RVUVSWV9TQ09QRV9DT01NQU5EX0tIUiIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUiIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0dFTkVSSUNfS0hSIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX1BFUkNFTlRBR0VfS0hSIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX05BTk9TRUNPTkRTX0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9CWVRFU19LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQllURVNfUEVSX1NFQ09ORF9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfS0VMVklOX0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgIG5hbWU9IlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9XQVRUU19LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjciICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfVk9MVFNfS0hSIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI4IiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0FNUFNfS0hSIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI5IiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0hFUlRaX0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMTAiICAgIG5hbWU9IlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9DWUNMRVNfS0hSIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfSU5UMzJfS0hSIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX0lOVDY0X0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgIG5hbWU9IlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9VSU5UMzJfS0hSIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX1VJTlQ2NF9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfRkxPQVQzMl9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjUiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfRkxPQVQ2NF9LSFIiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ0JpdHNLSFIiIHR5cGU9ImJpdG1hc2siPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX0RFU0NSSVBUSU9OX1BFUkZPUk1BTkNFX0lNUEFDVElOR19LSFIiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9DT05DVVJSRU5UTFlfSU1QQUNURURfS0hSIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0ZsYWdCaXRzS0hSIiB0eXBlPSJiaXRtYXNrIj4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1NoYWRlckNvcmVQcm9wZXJ0aWVzRmxhZ0JpdHNBTUQiIHR5cGU9ImJpdG1hc2siPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uVHlwZUlOVEVMIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX1RZUEVfQ09NTUFORF9RVUVVRV9NRVRSSUNTX0RJU0NPVkVSWV9BQ1RJVkFURURfSU5URUwiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1F1ZXJ5UG9vbFNhbXBsaW5nTW9kZUlOVEVMIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19RVUVSWV9QT09MX1NBTVBMSU5HX01PREVfTUFOVUFMX0lOVEVMIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9PVkVSUklERV9UWVBFX05VTExfSEFSRFdBUkVfSU5URUwiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9PVkVSUklERV9UWVBFX0ZMVVNIX0dQVV9DQUNIRVNfSU5URUwiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIiB0eXBlPSJlbnVtIj4KKyAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9QQVJBTUVURVJfVFlQRV9IV19DT1VOVEVSU19TVVBQT1JURURfSU5URUwiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9QQVJBTUVURVJfVFlQRV9TVFJFQU1fTUFSS0VSX1ZBTElEX0JJVFNfSU5URUwiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUwiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfVUlOVDMyX0lOVEVMIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9VSU5UNjRfSU5URUwiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX0ZMT0FUX0lOVEVMIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9CT09MX0lOVEVMIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgbmFtZT0iVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9TVFJJTkdfSU5URUwiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0Zvcm1hdEtIUiIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiBuYW1lPSJWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfQk9PTDMyX0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgbmFtZT0iVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX0lOVDY0X0tIUiIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgbmFtZT0iVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX1VJTlQ2NF9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjMiIG5hbWU9IlZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9GTE9BVDY0X0tIUiIvPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUiIgdHlwZT0iZW51bSI+CisgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgbmFtZT0iVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV8zMl9CSVRfT05MWV9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICBuYW1lPSJWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFX0FMTF9LSFIiLz4KKyAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICBuYW1lPSJWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFX05PTkVfS0hSIi8+CisgICAgPC9lbnVtcz4KKyAgICA8ZW51bXMgbmFtZT0iVmtMaW5lUmFzdGVyaXphdGlvbk1vZGVFWFQiIHR5cGU9ImVudW0iPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgIG5hbWU9IlZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX0RFRkFVTFRfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgbmFtZT0iVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfRVhUIi8+CisgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgbmFtZT0iVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfQlJFU0VOSEFNX0VYVCIvPgorICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgIG5hbWU9IlZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX1NNT09USF9FWFQiLz4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1NoYWRlck1vZHVsZUNyZWF0ZUZsYWdCaXRzIiB0eXBlPSJiaXRtYXNrIj4KKyAgICA8L2VudW1zPgorICAgIDxlbnVtcyBuYW1lPSJWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sRmxhZ0JpdHNBTUQiIHR5cGU9ImJpdG1hc2siPgorICAgIDwvZW51bXM+CisgICAgPGVudW1zIG5hbWU9IlZrVG9vbFB1cnBvc2VGbGFnQml0c0VYVCIgdHlwZT0iYml0bWFzayI+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgICAgIG5hbWU9IlZLX1RPT0xfUFVSUE9TRV9WQUxJREFUSU9OX0JJVF9FWFQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgICAgbmFtZT0iVktfVE9PTF9QVVJQT1NFX1BST0ZJTElOR19CSVRfRVhUIi8+CisgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgICAgIG5hbWU9IlZLX1RPT0xfUFVSUE9TRV9UUkFDSU5HX0JJVF9FWFQiLz4KKyAgICAgICAgPGVudW0gYml0cG9zPSIzIiAgICAgbmFtZT0iVktfVE9PTF9QVVJQT1NFX0FERElUSU9OQUxfRkVBVFVSRVNfQklUX0VYVCIvPgorICAgICAgICA8ZW51bSBiaXRwb3M9IjQiICAgICBuYW1lPSJWS19UT09MX1BVUlBPU0VfTU9ESUZZSU5HX0ZFQVRVUkVTX0JJVF9FWFQiLz4KKyAgICA8L2VudW1zPgorCisgICAgPGNvbW1hbmRzIGNvbW1lbnQ9IlZ1bGthbiBjb21tYW5kIGRlZmluaXRpb25zIj4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVELFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5ULFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVCxWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVJbnN0YW5jZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrSW5zdGFuY2VDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5zdGFuY2U8L3R5cGU+KiA8bmFtZT5wSW5zdGFuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lJbnN0YW5jZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5zdGFuY2U8L3R5cGU+IDxuYW1lPmluc3RhbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFBoeXNpY2FsRGV2aWNlQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgbGVuPSJwUGh5c2ljYWxEZXZpY2VDb3VudCI+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4qIDxuYW1lPnBQaHlzaWNhbERldmljZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5QRk5fdmtWb2lkRnVuY3Rpb248L3R5cGU+IDxuYW1lPnZrR2V0RGV2aWNlUHJvY0FkZHI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiA8bmFtZT5wTmFtZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlBGTl92a1ZvaWRGdW5jdGlvbjwvdHlwZT4gPG5hbWU+dmtHZXRJbnN0YW5jZVByb2NBZGRyPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSW5zdGFuY2U8L3R5cGU+IDxuYW1lPmluc3RhbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJudWxsLXRlcm1pbmF0ZWQiPmNvbnN0IDx0eXBlPmNoYXI8L3R5cGU+KiA8bmFtZT5wTmFtZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQiPjx0eXBlPlZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzPC90eXBlPiogPG5hbWU+cFF1ZXVlRmFtaWx5UHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBNZW1vcnlQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM8L3R5cGU+KiA8bmFtZT5wRmVhdHVyZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtGb3JtYXQ8L3R5cGU+IDxuYW1lPmZvcm1hdDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRm9ybWF0UHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBGb3JtYXRQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfRk9STUFUX05PVF9TVVBQT1JURUQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0Zvcm1hdDwvdHlwZT4gPG5hbWU+Zm9ybWF0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZVR5cGU8L3R5cGU+IDxuYW1lPnR5cGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlVGlsaW5nPC90eXBlPiA8bmFtZT50aWxpbmc8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlVXNhZ2VGbGFnczwvdHlwZT4gPG5hbWU+dXNhZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtJbWFnZUNyZWF0ZUZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPC90eXBlPiogPG5hbWU+cEltYWdlRm9ybWF0UHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRCxWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQsVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVCxWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTLFZLX0VSUk9SX0RFVklDRV9MT1NUIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVEZXZpY2U8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGV2aWNlQ3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4qIDxuYW1lPnBEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lEZXZpY2U8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb248L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBBcGlWZXJzaW9uPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUHJvcGVydHlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBQcm9wZXJ0eUNvdW50Ij48dHlwZT5Wa0xheWVyUHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVCI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0ibnVsbC10ZXJtaW5hdGVkIj5jb25zdCA8dHlwZT5jaGFyPC90eXBlPiogPG5hbWU+cExheWVyTmFtZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0eUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFByb3BlcnR5Q291bnQiPjx0eXBlPlZrRXh0ZW5zaW9uUHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUHJvcGVydHlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBQcm9wZXJ0eUNvdW50Ij48dHlwZT5Wa0xheWVyUHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVCI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0ibnVsbC10ZXJtaW5hdGVkIj5jb25zdCA8dHlwZT5jaGFyPC90eXBlPiogPG5hbWU+cExheWVyTmFtZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0eUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFByb3BlcnR5Q291bnQiPjx0eXBlPlZrRXh0ZW5zaW9uUHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXREZXZpY2VRdWV1ZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cXVldWVGYW1pbHlJbmRleDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5xdWV1ZUluZGV4PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtRdWV1ZTwvdHlwZT4qIDxuYW1lPnBRdWV1ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0RFVklDRV9MT1NUIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtRdWV1ZVN1Ym1pdDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrUXVldWU8L3R5cGU+IDxuYW1lPnF1ZXVlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5zdWJtaXRDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ic3VibWl0Q291bnQiPmNvbnN0IDx0eXBlPlZrU3VibWl0SW5mbzwvdHlwZT4qIDxuYW1lPnBTdWJtaXRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrRmVuY2U8L3R5cGU+IDxuYW1lPmZlbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfREVWSUNFX0xPU1QiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1F1ZXVlV2FpdElkbGU8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1F1ZXVlPC90eXBlPiA8bmFtZT5xdWV1ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0RFVklDRV9MT1NUIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtEZXZpY2VXYWl0SWRsZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxpbXBsaWNpdGV4dGVybnN5bmNwYXJhbXM+CisgICAgICAgICAgICAgICAgPHBhcmFtPmFsbCBzbmFtZTpWa1F1ZXVlIG9iamVjdHMgY3JlYXRlZCBmcm9tIHBuYW1lOmRldmljZTwvcGFyYW0+CisgICAgICAgICAgICA8L2ltcGxpY2l0ZXh0ZXJuc3luY3BhcmFtcz4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTLFZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFLFZLX0VSUk9SX0lOVkFMSURfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0FsbG9jYXRlTWVtb3J5PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrTWVtb3J5QWxsb2NhdGVJbmZvPC90eXBlPiogPG5hbWU+cEFsbG9jYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VNZW1vcnk8L3R5cGU+KiA8bmFtZT5wTWVtb3J5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtGcmVlTWVtb3J5PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0RldmljZU1lbW9yeTwvdHlwZT4gPG5hbWU+bWVtb3J5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9NRU1PUllfTUFQX0ZBSUxFRCI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrTWFwTWVtb3J5PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrRGV2aWNlTWVtb3J5PC90eXBlPiA8bmFtZT5tZW1vcnk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPm9mZnNldDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gPG5hbWU+c2l6ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa01lbW9yeU1hcEZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT52b2lkPC90eXBlPioqIDxuYW1lPnBwRGF0YTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrVW5tYXBNZW1vcnk8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEZXZpY2VNZW1vcnk8L3R5cGU+IDxuYW1lPm1lbW9yeTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bWVtb3J5UmFuZ2VDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ibWVtb3J5UmFuZ2VDb3VudCI+Y29uc3QgPHR5cGU+VmtNYXBwZWRNZW1vcnlSYW5nZTwvdHlwZT4qIDxuYW1lPnBNZW1vcnlSYW5nZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bWVtb3J5UmFuZ2VDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ibWVtb3J5UmFuZ2VDb3VudCI+Y29uc3QgPHR5cGU+VmtNYXBwZWRNZW1vcnlSYW5nZTwvdHlwZT4qIDxuYW1lPnBNZW1vcnlSYW5nZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VNZW1vcnk8L3R5cGU+IDxuYW1lPm1lbW9yeTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4qIDxuYW1lPnBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPmJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrTWVtb3J5UmVxdWlyZW1lbnRzPC90eXBlPiogPG5hbWU+cE1lbW9yeVJlcXVpcmVtZW50czwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0lOVkFMSURfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0JpbmRCdWZmZXJNZW1vcnk8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPmJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlTWVtb3J5PC90eXBlPiA8bmFtZT5tZW1vcnk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPm1lbW9yeU9mZnNldDwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+aW1hZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa01lbW9yeVJlcXVpcmVtZW50czwvdHlwZT4qIDxuYW1lPnBNZW1vcnlSZXF1aXJlbWVudHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQmluZEltYWdlTWVtb3J5PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrSW1hZ2U8L3R5cGU+IDxuYW1lPmltYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VNZW1vcnk8L3R5cGU+IDxuYW1lPm1lbW9yeTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gPG5hbWU+bWVtb3J5T2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlPC90eXBlPiA8bmFtZT5pbWFnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQiPjx0eXBlPlZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM8L3R5cGU+KiA8bmFtZT5wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtGb3JtYXQ8L3R5cGU+IDxuYW1lPmZvcm1hdDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2VUeXBlPC90eXBlPiA8bmFtZT50eXBlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTYW1wbGVDb3VudEZsYWdCaXRzPC90eXBlPiA8bmFtZT5zYW1wbGVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZVVzYWdlRmxhZ3M8L3R5cGU+IDxuYW1lPnVzYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZVRpbGluZzwvdHlwZT4gPG5hbWU+dGlsaW5nPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFByb3BlcnR5Q291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgbGVuPSJwUHJvcGVydHlDb3VudCI+PHR5cGU+VmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM8L3R5cGU+KiA8bmFtZT5wUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0ic3BhcnNlX2JpbmRpbmciIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0RFVklDRV9MT1NUIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtRdWV1ZUJpbmRTcGFyc2U8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1F1ZXVlPC90eXBlPiA8bmFtZT5xdWV1ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+YmluZEluZm9Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYmluZEluZm9Db3VudCIgZXh0ZXJuc3luYz0icEJpbmRJbmZvW10ucEJ1ZmZlckJpbmRzW10uYnVmZmVyLHBCaW5kSW5mb1tdLnBJbWFnZU9wYXF1ZUJpbmRzW10uaW1hZ2UscEJpbmRJbmZvW10ucEltYWdlQmluZHNbXS5pbWFnZSI+Y29uc3QgPHR5cGU+VmtCaW5kU3BhcnNlSW5mbzwvdHlwZT4qIDxuYW1lPnBCaW5kSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0ZlbmNlPC90eXBlPiA8bmFtZT5mZW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVGZW5jZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0ZlbmNlQ3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ZlbmNlPC90eXBlPiogPG5hbWU+cEZlbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95RmVuY2U8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrRmVuY2U8L3R5cGU+IDxuYW1lPmZlbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrUmVzZXRGZW5jZXM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZlbmNlQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImZlbmNlQ291bnQiIGV4dGVybnN5bmM9InRydWUiPmNvbnN0IDx0eXBlPlZrRmVuY2U8L3R5cGU+KiA8bmFtZT5wRmVuY2VzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX05PVF9SRUFEWSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0RFVklDRV9MT1NUIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRGZW5jZVN0YXR1czwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ZlbmNlPC90eXBlPiA8bmFtZT5mZW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19USU1FT1VUIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfREVWSUNFX0xPU1QiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1dhaXRGb3JGZW5jZXM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZlbmNlQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImZlbmNlQ291bnQiPmNvbnN0IDx0eXBlPlZrRmVuY2U8L3R5cGU+KiA8bmFtZT5wRmVuY2VzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCb29sMzI8L3R5cGU+IDxuYW1lPndhaXRBbGw8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50NjRfdDwvdHlwZT4gPG5hbWU+dGltZW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVTZW1hcGhvcmU8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtTZW1hcGhvcmVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU2VtYXBob3JlPC90eXBlPiogPG5hbWU+cFNlbWFwaG9yZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrRGVzdHJveVNlbWFwaG9yZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+IDxuYW1lPnNlbWFwaG9yZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZUV2ZW50PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRXZlbnRDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRXZlbnQ8L3R5cGU+KiA8bmFtZT5wRXZlbnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lFdmVudDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtFdmVudDwvdHlwZT4gPG5hbWU+ZXZlbnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfRVZFTlRfU0VULFZLX0VWRU5UX1JFU0VUIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfREVWSUNFX0xPU1QiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldEV2ZW50U3RhdHVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRXZlbnQ8L3R5cGU+IDxuYW1lPmV2ZW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1NldEV2ZW50PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrRXZlbnQ8L3R5cGU+IDxuYW1lPmV2ZW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1Jlc2V0RXZlbnQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtFdmVudDwvdHlwZT4gPG5hbWU+ZXZlbnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlUXVlcnlQb29sPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUXVlcnlQb29sQ3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXJ5UG9vbDwvdHlwZT4qIDxuYW1lPnBRdWVyeVBvb2w8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lRdWVyeVBvb2w8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrUXVlcnlQb29sPC90eXBlPiA8bmFtZT5xdWVyeVBvb2w8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19OT1RfUkVBRFkiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9ERVZJQ0VfTE9TVCI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0UXVlcnlQb29sUmVzdWx0czwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXJ5UG9vbDwvdHlwZT4gPG5hbWU+cXVlcnlQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZpcnN0UXVlcnk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cXVlcnlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnNpemVfdDwvdHlwZT4gPG5hbWU+ZGF0YVNpemU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImRhdGFTaXplIj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cERhdGE8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPnN0cmlkZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1F1ZXJ5UmVzdWx0RmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtSZXNldFF1ZXJ5UG9vbEVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXJ5UG9vbDwvdHlwZT4gPG5hbWU+cXVlcnlQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZpcnN0UXVlcnk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cXVlcnlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0lOVkFMSURfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZUJ1ZmZlcjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0J1ZmZlckNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCdWZmZXI8L3R5cGU+KiA8bmFtZT5wQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95QnVmZmVyPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+YnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlQnVmZmVyVmlldzwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyVmlldzwvdHlwZT4qIDxuYW1lPnBWaWV3PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95QnVmZmVyVmlldzwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtCdWZmZXJWaWV3PC90eXBlPiA8bmFtZT5idWZmZXJWaWV3PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlSW1hZ2U8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtJbWFnZUNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4qIDxuYW1lPnBJbWFnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrRGVzdHJveUltYWdlPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0ltYWdlPC90eXBlPiA8bmFtZT5pbWFnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2U8L3R5cGU+IDxuYW1lPmltYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtJbWFnZVN1YnJlc291cmNlPC90eXBlPiogPG5hbWU+cFN1YnJlc291cmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdWJyZXNvdXJjZUxheW91dDwvdHlwZT4qIDxuYW1lPnBMYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlSW1hZ2VWaWV3PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrSW1hZ2VWaWV3Q3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlVmlldzwvdHlwZT4qIDxuYW1lPnBWaWV3PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95SW1hZ2VWaWV3PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0ltYWdlVmlldzwvdHlwZT4gPG5hbWU+aW1hZ2VWaWV3PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9JTlZBTElEX1NIQURFUl9OViI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlU2hhZGVyTW9kdWxlPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1NoYWRlck1vZHVsZTwvdHlwZT4qIDxuYW1lPnBTaGFkZXJNb2R1bGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lTaGFkZXJNb2R1bGU8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrU2hhZGVyTW9kdWxlPC90eXBlPiA8bmFtZT5zaGFkZXJNb2R1bGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVQaXBlbGluZUNhY2hlPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaXBlbGluZUNhY2hlPC90eXBlPiogPG5hbWU+cFBpcGVsaW5lQ2FjaGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lQaXBlbGluZUNhY2hlPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lQ2FjaGU8L3R5cGU+IDxuYW1lPnBpcGVsaW5lQ2FjaGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBpcGVsaW5lQ2FjaGVEYXRhPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGlwZWxpbmVDYWNoZTwvdHlwZT4gPG5hbWU+cGlwZWxpbmVDYWNoZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT5zaXplX3Q8L3R5cGU+KiA8bmFtZT5wRGF0YVNpemU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgbGVuPSJwRGF0YVNpemUiPjx0eXBlPnZvaWQ8L3R5cGU+KiA8bmFtZT5wRGF0YTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtNZXJnZVBpcGVsaW5lQ2FjaGVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrUGlwZWxpbmVDYWNoZTwvdHlwZT4gPG5hbWU+ZHN0Q2FjaGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c3JjQ2FjaGVDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ic3JjQ2FjaGVDb3VudCI+Y29uc3QgPHR5cGU+VmtQaXBlbGluZUNhY2hlPC90eXBlPiogPG5hbWU+cFNyY0NhY2hlczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0lOVkFMSURfU0hBREVSX05WIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUNhY2hlPC90eXBlPiA8bmFtZT5waXBlbGluZUNhY2hlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmNyZWF0ZUluZm9Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iY3JlYXRlSW5mb0NvdW50Ij5jb25zdCA8dHlwZT5Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm9zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImNyZWF0ZUluZm9Db3VudCI+PHR5cGU+VmtQaXBlbGluZTwvdHlwZT4qIDxuYW1lPnBQaXBlbGluZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9JTlZBTElEX1NIQURFUl9OViI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUNhY2hlPC90eXBlPiA8bmFtZT5waXBlbGluZUNhY2hlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmNyZWF0ZUluZm9Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iY3JlYXRlSW5mb0NvdW50Ij5jb25zdCA8dHlwZT5Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mb3M8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iY3JlYXRlSW5mb0NvdW50Ij48dHlwZT5Wa1BpcGVsaW5lPC90eXBlPiogPG5hbWU+cFBpcGVsaW5lczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrRGVzdHJveVBpcGVsaW5lPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lPC90eXBlPiA8bmFtZT5waXBlbGluZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZVBpcGVsaW5lTGF5b3V0PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGlwZWxpbmVMYXlvdXQ8L3R5cGU+KiA8bmFtZT5wUGlwZWxpbmVMYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lQaXBlbGluZUxheW91dDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtQaXBlbGluZUxheW91dDwvdHlwZT4gPG5hbWU+cGlwZWxpbmVMYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFMiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZVNhbXBsZXI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtTYW1wbGVyQ3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1NhbXBsZXI8L3R5cGU+KiA8bmFtZT5wU2FtcGxlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrRGVzdHJveVNhbXBsZXI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrU2FtcGxlcjwvdHlwZT4gPG5hbWU+c2FtcGxlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXQ8L3R5cGU+KiA8bmFtZT5wU2V0TGF5b3V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEZXNjcmlwdG9yU2V0TGF5b3V0PC90eXBlPiA8bmFtZT5kZXNjcmlwdG9yU2V0TGF5b3V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9GUkFHTUVOVEFUSU9OX0VYVCI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlRGVzY3JpcHRvclBvb2w8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXNjcmlwdG9yUG9vbDwvdHlwZT4qIDxuYW1lPnBEZXNjcmlwdG9yUG9vbDwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrRGVzdHJveURlc2NyaXB0b3JQb29sPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0Rlc2NyaXB0b3JQb29sPC90eXBlPiA8bmFtZT5kZXNjcmlwdG9yUG9vbDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtSZXNldERlc2NyaXB0b3JQb29sPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrRGVzY3JpcHRvclBvb2w8L3R5cGU+IDxuYW1lPmRlc2NyaXB0b3JQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPGltcGxpY2l0ZXh0ZXJuc3luY3BhcmFtcz4KKyAgICAgICAgICAgICAgICA8cGFyYW0+YW55IHNuYW1lOlZrRGVzY3JpcHRvclNldCBvYmplY3RzIGFsbG9jYXRlZCBmcm9tIHBuYW1lOmRlc2NyaXB0b3JQb29sPC9wYXJhbT4KKyAgICAgICAgICAgIDwvaW1wbGljaXRleHRlcm5zeW5jcGFyYW1zPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0ZSQUdNRU5URURfUE9PTCxWS19FUlJPUl9PVVRfT0ZfUE9PTF9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0FsbG9jYXRlRGVzY3JpcHRvclNldHM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0icEFsbG9jYXRlSW5mbzo6ZGVzY3JpcHRvclBvb2wiPmNvbnN0IDx0eXBlPlZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InBBbGxvY2F0ZUluZm86OmRlc2NyaXB0b3JTZXRDb3VudCI+PHR5cGU+VmtEZXNjcmlwdG9yU2V0PC90eXBlPiogPG5hbWU+cERlc2NyaXB0b3JTZXRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtGcmVlRGVzY3JpcHRvclNldHM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEZXNjcmlwdG9yUG9vbDwvdHlwZT4gPG5hbWU+ZGVzY3JpcHRvclBvb2w8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZGVzY3JpcHRvclNldENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbm9hdXRvdmFsaWRpdHk9InRydWUiIGV4dGVybnN5bmM9InRydWUiIGxlbj0iZGVzY3JpcHRvclNldENvdW50Ij5jb25zdCA8dHlwZT5Wa0Rlc2NyaXB0b3JTZXQ8L3R5cGU+KiA8bmFtZT5wRGVzY3JpcHRvclNldHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a1VwZGF0ZURlc2NyaXB0b3JTZXRzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZGVzY3JpcHRvcldyaXRlQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImRlc2NyaXB0b3JXcml0ZUNvdW50IiBleHRlcm5zeW5jPSJwRGVzY3JpcHRvcldyaXRlc1tdLmRzdFNldCI+Y29uc3QgPHR5cGU+VmtXcml0ZURlc2NyaXB0b3JTZXQ8L3R5cGU+KiA8bmFtZT5wRGVzY3JpcHRvcldyaXRlczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZGVzY3JpcHRvckNvcHlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iZGVzY3JpcHRvckNvcHlDb3VudCIgZXh0ZXJuc3luYz0icERlc2NyaXB0b3JDb3BpZXNbXS5kc3RTZXQiPmNvbnN0IDx0eXBlPlZrQ29weURlc2NyaXB0b3JTZXQ8L3R5cGU+KiA8bmFtZT5wRGVzY3JpcHRvckNvcGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVGcmFtZWJ1ZmZlcjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ZyYW1lYnVmZmVyPC90eXBlPiogPG5hbWU+cEZyYW1lYnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95RnJhbWVidWZmZXI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrRnJhbWVidWZmZXI8L3R5cGU+IDxuYW1lPmZyYW1lYnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlUmVuZGVyUGFzczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1JlbmRlclBhc3NDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUmVuZGVyUGFzczwvdHlwZT4qIDxuYW1lPnBSZW5kZXJQYXNzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95UmVuZGVyUGFzczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtSZW5kZXJQYXNzPC90eXBlPiA8bmFtZT5yZW5kZXJQYXNzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldFJlbmRlckFyZWFHcmFudWxhcml0eTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1JlbmRlclBhc3M8L3R5cGU+IDxuYW1lPnJlbmRlclBhc3M8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0V4dGVudDJEPC90eXBlPiogPG5hbWU+cEdyYW51bGFyaXR5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZUNvbW1hbmRQb29sPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29tbWFuZFBvb2w8L3R5cGU+KiA8bmFtZT5wQ29tbWFuZFBvb2w8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lDb21tYW5kUG9vbDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kUG9vbDwvdHlwZT4gPG5hbWU+Y29tbWFuZFBvb2w8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtSZXNldENvbW1hbmRQb29sPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZFBvb2w8L3R5cGU+IDxuYW1lPmNvbW1hbmRQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQ29tbWFuZFBvb2xSZXNldEZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InBBbGxvY2F0ZUluZm86OmNvbW1hbmRQb29sIj5jb25zdCA8dHlwZT5Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm88L3R5cGU+KiA8bmFtZT5wQWxsb2NhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJwQWxsb2NhdGVJbmZvOjpjb21tYW5kQnVmZmVyQ291bnQiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4qIDxuYW1lPnBDb21tYW5kQnVmZmVyczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrRnJlZUNvbW1hbmRCdWZmZXJzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZFBvb2w8L3R5cGU+IDxuYW1lPmNvbW1hbmRQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIiBsZW49ImNvbW1hbmRCdWZmZXJDb3VudCI+Y29uc3QgPHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiogPG5hbWU+cENvbW1hbmRCdWZmZXJzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0JlZ2luQ29tbWFuZEJ1ZmZlcjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzwvdHlwZT4qIDxuYW1lPnBCZWdpbkluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxpbXBsaWNpdGV4dGVybnN5bmNwYXJhbXM+CisgICAgICAgICAgICAgICAgPHBhcmFtPnRoZSBzbmFtZTpWa0NvbW1hbmRQb29sIHRoYXQgcG5hbWU6Y29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb208L3BhcmFtPgorICAgICAgICAgICAgPC9pbXBsaWNpdGV4dGVybnN5bmNwYXJhbXM+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0VuZENvbW1hbmRCdWZmZXI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxpbXBsaWNpdGV4dGVybnN5bmNwYXJhbXM+CisgICAgICAgICAgICAgICAgPHBhcmFtPnRoZSBzbmFtZTpWa0NvbW1hbmRQb29sIHRoYXQgcG5hbWU6Y29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb208L3BhcmFtPgorICAgICAgICAgICAgPC9pbXBsaWNpdGV4dGVybnN5bmNwYXJhbXM+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1Jlc2V0Q29tbWFuZEJ1ZmZlcjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzPC90eXBlPiA8bmFtZT5mbGFnczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEJpbmRQaXBlbGluZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGlwZWxpbmVCaW5kUG9pbnQ8L3R5cGU+IDxuYW1lPnBpcGVsaW5lQmluZFBvaW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaXBlbGluZTwvdHlwZT4gPG5hbWU+cGlwZWxpbmU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0Vmlld3BvcnQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RWaWV3cG9ydDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT52aWV3cG9ydENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJ2aWV3cG9ydENvdW50Ij5jb25zdCA8dHlwZT5Wa1ZpZXdwb3J0PC90eXBlPiogPG5hbWU+cFZpZXdwb3J0czwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRTZXRTY2lzc29yPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZpcnN0U2Npc3NvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5zY2lzc29yQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InNjaXNzb3JDb3VudCI+Y29uc3QgPHR5cGU+VmtSZWN0MkQ8L3R5cGU+KiA8bmFtZT5wU2Npc3NvcnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0TGluZVdpZHRoPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+ZmxvYXQ8L3R5cGU+IDxuYW1lPmxpbmVXaWR0aDwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRTZXREZXB0aEJpYXM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5mbG9hdDwvdHlwZT4gPG5hbWU+ZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5mbG9hdDwvdHlwZT4gPG5hbWU+ZGVwdGhCaWFzQ2xhbXA8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5mbG9hdDwvdHlwZT4gPG5hbWU+ZGVwdGhCaWFzU2xvcGVGYWN0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0QmxlbmRDb25zdGFudHM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5mbG9hdDwvdHlwZT4gPG5hbWU+YmxlbmRDb25zdGFudHM8L25hbWU+WzRdPC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0RGVwdGhCb3VuZHM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5mbG9hdDwvdHlwZT4gPG5hbWU+bWluRGVwdGhCb3VuZHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5mbG9hdDwvdHlwZT4gPG5hbWU+bWF4RGVwdGhCb3VuZHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdGVuY2lsRmFjZUZsYWdzPC90eXBlPiA8bmFtZT5mYWNlTWFzazwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5jb21wYXJlTWFzazwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdGVuY2lsRmFjZUZsYWdzPC90eXBlPiA8bmFtZT5mYWNlTWFzazwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT53cml0ZU1hc2s8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU3RlbmNpbEZhY2VGbGFnczwvdHlwZT4gPG5hbWU+ZmFjZU1hc2s8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cmVmZXJlbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kQmluZERlc2NyaXB0b3JTZXRzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaXBlbGluZUJpbmRQb2ludDwvdHlwZT4gPG5hbWU+cGlwZWxpbmVCaW5kUG9pbnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BpcGVsaW5lTGF5b3V0PC90eXBlPiA8bmFtZT5sYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RTZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZGVzY3JpcHRvclNldENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJkZXNjcmlwdG9yU2V0Q291bnQiPmNvbnN0IDx0eXBlPlZrRGVzY3JpcHRvclNldDwvdHlwZT4qIDxuYW1lPnBEZXNjcmlwdG9yU2V0czwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZHluYW1pY09mZnNldENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJkeW5hbWljT2Zmc2V0Q291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cER5bmFtaWNPZmZzZXRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEJpbmRJbmRleEJ1ZmZlcjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5idWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPm9mZnNldDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5kZXhUeXBlPC90eXBlPiA8bmFtZT5pbmRleFR5cGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kQmluZFZlcnRleEJ1ZmZlcnM8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RCaW5kaW5nPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmJpbmRpbmdDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYmluZGluZ0NvdW50Ij5jb25zdCA8dHlwZT5Wa0J1ZmZlcjwvdHlwZT4qIDxuYW1lPnBCdWZmZXJzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJiaW5kaW5nQ291bnQiPmNvbnN0IDx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4qIDxuYW1lPnBPZmZzZXRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iaW5zaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiIHBpcGVsaW5lPSJncmFwaGljcyI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWREcmF3PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnZlcnRleENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmluc3RhbmNlQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RWZXJ0ZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RJbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9Imluc2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0iZ3JhcGhpY3MiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRHJhd0luZGV4ZWQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+aW5kZXhDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5pbnN0YW5jZUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZpcnN0SW5kZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5pbnQzMl90PC90eXBlPiA8bmFtZT52ZXJ0ZXhPZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RJbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9Imluc2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0iZ3JhcGhpY3MiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRHJhd0luZGlyZWN0PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPmJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gPG5hbWU+b2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmRyYXdDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5zdHJpZGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJpbnNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSIgcGlwZWxpbmU9ImdyYXBoaWNzIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZERyYXdJbmRleGVkSW5kaXJlY3Q8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+YnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5vZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZHJhd0NvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnN0cmlkZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iY29tcHV0ZSIgcmVuZGVycGFzcz0ib3V0c2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0iY29tcHV0ZSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWREaXNwYXRjaDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5ncm91cENvdW50WDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5ncm91cENvdW50WTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5ncm91cENvdW50WjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iY29tcHV0ZSIgcmVuZGVycGFzcz0ib3V0c2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0iY29tcHV0ZSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWREaXNwYXRjaEluZGlyZWN0PC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPmJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gPG5hbWU+b2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJ0cmFuc2ZlcixncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJvdXRzaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiIHBpcGVsaW5lPSJ0cmFuc2ZlciI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRDb3B5QnVmZmVyPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPnNyY0J1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5kc3RCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cmVnaW9uQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InJlZ2lvbkNvdW50Ij5jb25zdCA8dHlwZT5Wa0J1ZmZlckNvcHk8L3R5cGU+KiA8bmFtZT5wUmVnaW9uczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0idHJhbnNmZXIsZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0ib3V0c2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0idHJhbnNmZXIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kQ29weUltYWdlPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+c3JjSW1hZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiA8bmFtZT5zcmNJbWFnZUxheW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2U8L3R5cGU+IDxuYW1lPmRzdEltYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZUxheW91dDwvdHlwZT4gPG5hbWU+ZHN0SW1hZ2VMYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cmVnaW9uQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InJlZ2lvbkNvdW50Ij5jb25zdCA8dHlwZT5Wa0ltYWdlQ29weTwvdHlwZT4qIDxuYW1lPnBSZWdpb25zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0ib3V0c2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0idHJhbnNmZXIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kQmxpdEltYWdlPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+c3JjSW1hZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiA8bmFtZT5zcmNJbWFnZUxheW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2U8L3R5cGU+IDxuYW1lPmRzdEltYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZUxheW91dDwvdHlwZT4gPG5hbWU+ZHN0SW1hZ2VMYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cmVnaW9uQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InJlZ2lvbkNvdW50Ij5jb25zdCA8dHlwZT5Wa0ltYWdlQmxpdDwvdHlwZT4qIDxuYW1lPnBSZWdpb25zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtGaWx0ZXI8L3R5cGU+IDxuYW1lPmZpbHRlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0idHJhbnNmZXIsZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0ib3V0c2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0idHJhbnNmZXIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kQ29weUJ1ZmZlclRvSW1hZ2U8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+c3JjQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+ZHN0SW1hZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiA8bmFtZT5kc3RJbWFnZUxheW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5yZWdpb25Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0icmVnaW9uQ291bnQiPmNvbnN0IDx0eXBlPlZrQnVmZmVySW1hZ2VDb3B5PC90eXBlPiogPG5hbWU+cFJlZ2lvbnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9InRyYW5zZmVyLGdyYXBoaWNzLGNvbXB1dGUiIHJlbmRlcnBhc3M9Im91dHNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSIgcGlwZWxpbmU9InRyYW5zZmVyIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZENvcHlJbWFnZVRvQnVmZmVyPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+c3JjSW1hZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiA8bmFtZT5zcmNJbWFnZUxheW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5kc3RCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cmVnaW9uQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InJlZ2lvbkNvdW50Ij5jb25zdCA8dHlwZT5Wa0J1ZmZlckltYWdlQ29weTwvdHlwZT4qIDxuYW1lPnBSZWdpb25zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJ0cmFuc2ZlcixncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJvdXRzaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiIHBpcGVsaW5lPSJ0cmFuc2ZlciI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRVcGRhdGVCdWZmZXI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+ZHN0QnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5kc3RPZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPmRhdGFTaXplPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJkYXRhU2l6ZSI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBEYXRhPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJ0cmFuc2ZlcixncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJvdXRzaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiIHBpcGVsaW5lPSJ0cmFuc2ZlciIgY29tbWVudD0idHJhbnNmZXIgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIFZLX0tIUl9tYWludGVuYW5jZTEgaXMgZW5hYmxlZCwgYXMgZG9jdW1lbnRlZCBpbiB2YWxpZCB1c2FnZSBsYW5ndWFnZSBpbiB0aGUgc3BlY2lmaWNhdGlvbiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRGaWxsQnVmZmVyPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPmRzdEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gPG5hbWU+ZHN0T2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5zaXplPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmRhdGE8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzLGNvbXB1dGUiIHJlbmRlcnBhc3M9Im91dHNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSIgcGlwZWxpbmU9InRyYW5zZmVyIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZENsZWFyQ29sb3JJbWFnZTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2U8L3R5cGU+IDxuYW1lPmltYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZUxheW91dDwvdHlwZT4gPG5hbWU+aW1hZ2VMYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0NsZWFyQ29sb3JWYWx1ZTwvdHlwZT4qIDxuYW1lPnBDb2xvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5yYW5nZUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJyYW5nZUNvdW50Ij5jb25zdCA8dHlwZT5Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZTwvdHlwZT4qIDxuYW1lPnBSYW5nZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJvdXRzaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiIHBpcGVsaW5lPSJ0cmFuc2ZlciI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+aW1hZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiA8bmFtZT5pbWFnZUxheW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZTwvdHlwZT4qIDxuYW1lPnBEZXB0aFN0ZW5jaWw8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cmFuZ2VDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0icmFuZ2VDb3VudCI+Y29uc3QgPHR5cGU+VmtJbWFnZVN1YnJlc291cmNlUmFuZ2U8L3R5cGU+KiA8bmFtZT5wUmFuZ2VzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iaW5zaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiIHBpcGVsaW5lPSJncmFwaGljcyI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRDbGVhckF0dGFjaG1lbnRzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmF0dGFjaG1lbnRDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYXR0YWNobWVudENvdW50Ij5jb25zdCA8dHlwZT5Wa0NsZWFyQXR0YWNobWVudDwvdHlwZT4qIDxuYW1lPnBBdHRhY2htZW50czwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5yZWN0Q291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InJlY3RDb3VudCI+Y29uc3QgPHR5cGU+VmtDbGVhclJlY3Q8L3R5cGU+KiA8bmFtZT5wUmVjdHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJvdXRzaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiIHBpcGVsaW5lPSJ0cmFuc2ZlciI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRSZXNvbHZlSW1hZ2U8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlPC90eXBlPiA8bmFtZT5zcmNJbWFnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2VMYXlvdXQ8L3R5cGU+IDxuYW1lPnNyY0ltYWdlTGF5b3V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+ZHN0SW1hZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlTGF5b3V0PC90eXBlPiA8bmFtZT5kc3RJbWFnZUxheW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5yZWdpb25Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0icmVnaW9uQ291bnQiPmNvbnN0IDx0eXBlPlZrSW1hZ2VSZXNvbHZlPC90eXBlPiogPG5hbWU+cFJlZ2lvbnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzLGNvbXB1dGUiIHJlbmRlcnBhc3M9Im91dHNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRTZXRFdmVudDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRXZlbnQ8L3R5cGU+IDxuYW1lPmV2ZW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaXBlbGluZVN0YWdlRmxhZ3M8L3R5cGU+IDxuYW1lPnN0YWdlTWFzazwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0ib3V0c2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFJlc2V0RXZlbnQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0V2ZW50PC90eXBlPiA8bmFtZT5ldmVudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGlwZWxpbmVTdGFnZUZsYWdzPC90eXBlPiA8bmFtZT5zdGFnZU1hc2s8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzLGNvbXB1dGUiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRXYWl0RXZlbnRzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmV2ZW50Q291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImV2ZW50Q291bnQiPmNvbnN0IDx0eXBlPlZrRXZlbnQ8L3R5cGU+KiA8bmFtZT5wRXZlbnRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaXBlbGluZVN0YWdlRmxhZ3M8L3R5cGU+IDxuYW1lPnNyY1N0YWdlTWFzazwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGlwZWxpbmVTdGFnZUZsYWdzPC90eXBlPiA8bmFtZT5kc3RTdGFnZU1hc2s8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm1lbW9yeUJhcnJpZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ibWVtb3J5QmFycmllckNvdW50Ij5jb25zdCA8dHlwZT5Wa01lbW9yeUJhcnJpZXI8L3R5cGU+KiA8bmFtZT5wTWVtb3J5QmFycmllcnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYnVmZmVyTWVtb3J5QmFycmllckNvdW50Ij5jb25zdCA8dHlwZT5Wa0J1ZmZlck1lbW9yeUJhcnJpZXI8L3R5cGU+KiA8bmFtZT5wQnVmZmVyTWVtb3J5QmFycmllcnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmltYWdlTWVtb3J5QmFycmllckNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCI+Y29uc3QgPHR5cGU+VmtJbWFnZU1lbW9yeUJhcnJpZXI8L3R5cGU+KiA8bmFtZT5wSW1hZ2VNZW1vcnlCYXJyaWVyczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0idHJhbnNmZXIsZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFBpcGVsaW5lQmFycmllcjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGlwZWxpbmVTdGFnZUZsYWdzPC90eXBlPiA8bmFtZT5zcmNTdGFnZU1hc2s8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BpcGVsaW5lU3RhZ2VGbGFnczwvdHlwZT4gPG5hbWU+ZHN0U3RhZ2VNYXNrPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrRGVwZW5kZW5jeUZsYWdzPC90eXBlPiA8bmFtZT5kZXBlbmRlbmN5RmxhZ3M8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm1lbW9yeUJhcnJpZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ibWVtb3J5QmFycmllckNvdW50Ij5jb25zdCA8dHlwZT5Wa01lbW9yeUJhcnJpZXI8L3R5cGU+KiA8bmFtZT5wTWVtb3J5QmFycmllcnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYnVmZmVyTWVtb3J5QmFycmllckNvdW50Ij5jb25zdCA8dHlwZT5Wa0J1ZmZlck1lbW9yeUJhcnJpZXI8L3R5cGU+KiA8bmFtZT5wQnVmZmVyTWVtb3J5QmFycmllcnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmltYWdlTWVtb3J5QmFycmllckNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCI+Y29uc3QgPHR5cGU+VmtJbWFnZU1lbW9yeUJhcnJpZXI8L3R5cGU+KiA8bmFtZT5wSW1hZ2VNZW1vcnlCYXJyaWVyczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEJlZ2luUXVlcnk8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXJ5UG9vbDwvdHlwZT4gPG5hbWU+cXVlcnlQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnF1ZXJ5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUXVlcnlDb250cm9sRmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRW5kUXVlcnk8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXJ5UG9vbDwvdHlwZT4gPG5hbWU+cXVlcnlQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnF1ZXJ5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQ8L3R5cGU+KiA8bmFtZT5wQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJvdXRzaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kUmVzZXRRdWVyeVBvb2w8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXJ5UG9vbDwvdHlwZT4gPG5hbWU+cXVlcnlQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZpcnN0UXVlcnk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cXVlcnlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0idHJhbnNmZXIsZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0idHJhbnNmZXIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kV3JpdGVUaW1lc3RhbXA8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BpcGVsaW5lU3RhZ2VGbGFnQml0czwvdHlwZT4gPG5hbWU+cGlwZWxpbmVTdGFnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUXVlcnlQb29sPC90eXBlPiA8bmFtZT5xdWVyeVBvb2w8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cXVlcnk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzLGNvbXB1dGUiIHJlbmRlcnBhc3M9Im91dHNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSIgcGlwZWxpbmU9InRyYW5zZmVyIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtRdWVyeVBvb2w8L3R5cGU+IDxuYW1lPnF1ZXJ5UG9vbDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5maXJzdFF1ZXJ5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnF1ZXJ5Q291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+ZHN0QnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5kc3RPZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPnN0cmlkZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1F1ZXJ5UmVzdWx0RmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kUHVzaENvbnN0YW50czwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGlwZWxpbmVMYXlvdXQ8L3R5cGU+IDxuYW1lPmxheW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU2hhZGVyU3RhZ2VGbGFnczwvdHlwZT4gPG5hbWU+c3RhZ2VGbGFnczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5vZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c2l6ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ic2l6ZSI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBWYWx1ZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJvdXRzaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSIgcGlwZWxpbmU9ImdyYXBoaWNzIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEJlZ2luUmVuZGVyUGFzczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUmVuZGVyUGFzc0JlZ2luSW5mbzwvdHlwZT4qIDxuYW1lPnBSZW5kZXJQYXNzQmVnaW48L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1YnBhc3NDb250ZW50czwvdHlwZT4gPG5hbWU+Y29udGVudHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJpbnNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5IiBwaXBlbGluZT0iZ3JhcGhpY3MiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kTmV4dFN1YnBhc3M8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1YnBhc3NDb250ZW50czwvdHlwZT4gPG5hbWU+Y29udGVudHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJpbnNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5IiBwaXBlbGluZT0iZ3JhcGhpY3MiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRW5kUmVuZGVyUGFzczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0idHJhbnNmZXIsZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRXhlY3V0ZUNvbW1hbmRzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iY29tbWFuZEJ1ZmZlckNvdW50Ij5jb25zdCA8dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+KiA8bmFtZT5wQ29tbWFuZEJ1ZmZlcnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9OQVRJVkVfV0lORE9XX0lOX1VTRV9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbnN0YW5jZTwvdHlwZT4gPG5hbWU+aW5zdGFuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUjwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+KiA8bmFtZT5wU3VyZmFjZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0eUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFByb3BlcnR5Q291bnQiPjx0eXBlPlZrRGlzcGxheVByb3BlcnRpZXNLSFI8L3R5cGU+KiA8bmFtZT5wUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFByb3BlcnR5Q291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgbGVuPSJwUHJvcGVydHlDb3VudCI+PHR5cGU+VmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSPC90eXBlPiogPG5hbWU+cFByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnBsYW5lSW5kZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wRGlzcGxheUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icERpc3BsYXlDb3VudCI+PHR5cGU+VmtEaXNwbGF5S0hSPC90eXBlPiogPG5hbWU+cERpc3BsYXlzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0Rpc3BsYXlLSFI8L3R5cGU+IDxuYW1lPmRpc3BsYXk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUHJvcGVydHlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBQcm9wZXJ0eUNvdW50Ij48dHlwZT5Wa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUjwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVEaXNwbGF5TW9kZUtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEaXNwbGF5S0hSPC90eXBlPiA8bmFtZT5kaXNwbGF5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFI8L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEaXNwbGF5TW9kZUtIUjwvdHlwZT4qIDxuYW1lPnBNb2RlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEaXNwbGF5TW9kZUtIUjwvdHlwZT4gPG5hbWU+bW9kZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5wbGFuZUluZGV4PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFI8L3R5cGU+KiA8bmFtZT5wQ2FwYWJpbGl0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU3VyZmFjZUtIUjwvdHlwZT4qIDxuYW1lPnBTdXJmYWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfSU5DT01QQVRJQkxFX0RJU1BMQVlfS0hSLFZLX0VSUk9SX0RFVklDRV9MT1NULFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnN3YXBjaGFpbkNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJzd2FwY2hhaW5Db3VudCIgZXh0ZXJuc3luYz0icENyZWF0ZUluZm9zW10uc3VyZmFjZSxwQ3JlYXRlSW5mb3NbXS5vbGRTd2FwY2hhaW4iPmNvbnN0IDx0eXBlPlZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJzd2FwY2hhaW5Db3VudCI+PHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+KiA8bmFtZT5wU3dhcGNoYWluczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrRGVzdHJveVN1cmZhY2VLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+IDxuYW1lPnN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5xdWV1ZUZhbWlseUluZGV4PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlS0hSPC90eXBlPiA8bmFtZT5zdXJmYWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCb29sMzI8L3R5cGU+KiA8bmFtZT5wU3VwcG9ydGVkPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfU1VSRkFDRV9MT1NUX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+IDxuYW1lPnN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI8L3R5cGU+KiA8bmFtZT5wU3VyZmFjZUNhcGFiaWxpdGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfU1VSRkFDRV9MT1NUX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlS0hSPC90eXBlPiA8bmFtZT5zdXJmYWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFN1cmZhY2VGb3JtYXRDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBTdXJmYWNlRm9ybWF0Q291bnQiPjx0eXBlPlZrU3VyZmFjZUZvcm1hdEtIUjwvdHlwZT4qIDxuYW1lPnBTdXJmYWNlRm9ybWF0czwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfU1VSRkFDRV9MT1NUX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+IDxuYW1lPnN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUHJlc2VudE1vZGVDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBQcmVzZW50TW9kZUNvdW50Ij48dHlwZT5Wa1ByZXNlbnRNb2RlS0hSPC90eXBlPiogPG5hbWU+cFByZXNlbnRNb2RlczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0RFVklDRV9MT1NULFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIsVktfRVJST1JfTkFUSVZFX1dJTkRPV19JTl9VU0VfS0hSLFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRCI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlU3dhcGNoYWluS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InBDcmVhdGVJbmZvLnN1cmZhY2UscENyZWF0ZUluZm8ub2xkU3dhcGNoYWluIj5jb25zdCA8dHlwZT5Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFI8L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+KiA8bmFtZT5wU3dhcGNoYWluPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95U3dhcGNoYWluS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1N3YXBjaGFpbktIUjwvdHlwZT4gPG5hbWU+c3dhcGNoYWluPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRTd2FwY2hhaW5JbWFnZXNLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+IDxuYW1lPnN3YXBjaGFpbjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBTd2FwY2hhaW5JbWFnZUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFN3YXBjaGFpbkltYWdlQ291bnQiPjx0eXBlPlZrSW1hZ2U8L3R5cGU+KiA8bmFtZT5wU3dhcGNoYWluSW1hZ2VzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX1RJTUVPVVQsVktfTk9UX1JFQURZLFZLX1NVQk9QVElNQUxfS0hSIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfREVWSUNFX0xPU1QsVktfRVJST1JfT1VUX09GX0RBVEVfS0hSLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIsVktfRVJST1JfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX01PREVfTE9TVF9FWFQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0FjcXVpcmVOZXh0SW1hZ2VLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+IDxuYW1lPnN3YXBjaGFpbjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQ2NF90PC90eXBlPiA8bmFtZT50aW1lb3V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrU2VtYXBob3JlPC90eXBlPiA8bmFtZT5zZW1hcGhvcmU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtGZW5jZTwvdHlwZT4gPG5hbWU+ZmVuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBJbWFnZUluZGV4PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX1NVQk9QVElNQUxfS0hSIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfREVWSUNFX0xPU1QsVktfRVJST1JfT1VUX09GX0RBVEVfS0hSLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIsVktfRVJST1JfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX01PREVfTE9TVF9FWFQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1F1ZXVlUHJlc2VudEtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrUXVldWU8L3R5cGU+IDxuYW1lPnF1ZXVlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0icFByZXNlbnRJbmZvLnBXYWl0U2VtYXBob3Jlc1tdLHBQcmVzZW50SW5mby5wU3dhcGNoYWluc1tdIj5jb25zdCA8dHlwZT5Wa1ByZXNlbnRJbmZvS0hSPC90eXBlPiogPG5hbWU+cFByZXNlbnRJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfTkFUSVZFX1dJTkRPV19JTl9VU0VfS0hSIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVWaVN1cmZhY2VOTjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5zdGFuY2U8L3R5cGU+IDxuYW1lPmluc3RhbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtWaVN1cmZhY2VDcmVhdGVJbmZvTk48L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlS0hSPC90eXBlPiogPG5hbWU+cFN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU3VyZmFjZUtIUjwvdHlwZT4qIDxuYW1lPnBTdXJmYWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtCb29sMzI8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnF1ZXVlRmFtaWx5SW5kZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5zdHJ1Y3QgPHR5cGU+d2xfZGlzcGxheTwvdHlwZT4qIDxuYW1lPmRpc3BsYXk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbnN0YW5jZTwvdHlwZT4gPG5hbWU+aW5zdGFuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFI8L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlS0hSPC90eXBlPiogPG5hbWU+cFN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnF1ZXVlRmFtaWx5SW5kZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlWGxpYlN1cmZhY2VLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU3VyZmFjZUtIUjwvdHlwZT4qIDxuYW1lPnBTdXJmYWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtCb29sMzI8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnF1ZXVlRmFtaWx5SW5kZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5EaXNwbGF5PC90eXBlPiogPG5hbWU+ZHB5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmlzdWFsSUQ8L3R5cGU+IDxuYW1lPnZpc3VhbElEPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZVhjYlN1cmZhY2VLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFI8L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlS0hSPC90eXBlPiogPG5hbWU+cFN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa0Jvb2wzMjwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5xdWV1ZUZhbWlseUluZGV4PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+eGNiX2Nvbm5lY3Rpb25fdDwvdHlwZT4qIDxuYW1lPmNvbm5lY3Rpb248L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT54Y2JfdmlzdWFsaWRfdDwvdHlwZT4gPG5hbWU+dmlzdWFsX2lkPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbnN0YW5jZTwvdHlwZT4gPG5hbWU+aW5zdGFuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQTwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+KiA8bmFtZT5wU3VyZmFjZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX05BVElWRV9XSU5ET1dfSU5fVVNFX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1A8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU3VyZmFjZUtIUjwvdHlwZT4qIDxuYW1lPnBTdXJmYWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQ8L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPC90eXBlPiogPG5hbWU+cENhbGxiYWNrPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5zdGFuY2U8L3R5cGU+IDxuYW1lPmluc3RhbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPC90eXBlPiA8bmFtZT5jYWxsYmFjazwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGVidWdSZXBvcnRGbGFnc0VYVDwvdHlwZT4gPG5hbWU+ZmxhZ3M8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVDwvdHlwZT4gPG5hbWU+b2JqZWN0VHlwZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQ2NF90PC90eXBlPiA8bmFtZT5vYmplY3Q8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5zaXplX3Q8L3R5cGU+IDxuYW1lPmxvY2F0aW9uPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+aW50MzJfdDwvdHlwZT4gPG5hbWU+bWVzc2FnZUNvZGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49Im51bGwtdGVybWluYXRlZCI+Y29uc3QgPHR5cGU+Y2hhcjwvdHlwZT4qIDxuYW1lPnBMYXllclByZWZpeDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ibnVsbC10ZXJtaW5hdGVkIj5jb25zdCA8dHlwZT5jaGFyPC90eXBlPiogPG5hbWU+cE1lc3NhZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InBOYW1lSW5mby5vYmplY3QiPmNvbnN0IDx0eXBlPlZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVDwvdHlwZT4qIDxuYW1lPnBOYW1lSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJwVGFnSW5mby5vYmplY3QiPmNvbnN0IDx0eXBlPlZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUPC90eXBlPiogPG5hbWU+cFRhZ0luZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzLGNvbXB1dGUiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQ8L3R5cGU+KiA8bmFtZT5wTWFya2VySW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZERlYnVnTWFya2VyRW5kRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVDwvdHlwZT4qIDxuYW1lPnBNYXJrZXJJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfRk9STUFUX05PVF9TVVBQT1JURUQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtGb3JtYXQ8L3R5cGU+IDxuYW1lPmZvcm1hdDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2VUeXBlPC90eXBlPiA8bmFtZT50eXBlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZVRpbGluZzwvdHlwZT4gPG5hbWU+dGlsaW5nPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZVVzYWdlRmxhZ3M8L3R5cGU+IDxuYW1lPnVzYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrSW1hZ2VDcmVhdGVGbGFnczwvdHlwZT4gPG5hbWU+ZmxhZ3M8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WPC90eXBlPiA8bmFtZT5leHRlcm5hbEhhbmRsZVR5cGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlY8L3R5cGU+KiA8bmFtZT5wRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFMsVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlTWVtb3J5PC90eXBlPiA8bmFtZT5tZW1vcnk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlY8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5IQU5ETEU8L3R5cGU+KiA8bmFtZT5wSGFuZGxlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJpbnNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRQcm9jZXNzQ29tbWFuZHNOVlg8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlg8L3R5cGU+KiA8bmFtZT5wUHJvY2Vzc0NvbW1hbmRzSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iaW5zaWRlIiBjbWRidWZmZXJsZXZlbD0ic2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlg8L3R5cGU+KiA8bmFtZT5wUmVzZXJ2ZVNwYWNlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlg8L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPC90eXBlPiogPG5hbWU+cEluZGlyZWN0Q29tbWFuZHNMYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDwvdHlwZT4gPG5hbWU+aW5kaXJlY3RDb21tYW5kc0xheW91dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZU9iamVjdFRhYmxlTlZYPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrT2JqZWN0VGFibGVOVlg8L3R5cGU+KiA8bmFtZT5wT2JqZWN0VGFibGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa09iamVjdFRhYmxlTlZYPC90eXBlPiA8bmFtZT5vYmplY3RUYWJsZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1JlZ2lzdGVyT2JqZWN0c05WWDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa09iamVjdFRhYmxlTlZYPC90eXBlPiA8bmFtZT5vYmplY3RUYWJsZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5vYmplY3RDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ib2JqZWN0Q291bnQiPmNvbnN0IDx0eXBlPlZrT2JqZWN0VGFibGVFbnRyeU5WWDwvdHlwZT4qIGNvbnN0KiAgICA8bmFtZT5wcE9iamVjdFRhYmxlRW50cmllczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ib2JqZWN0Q291bnQiPmNvbnN0IDx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cE9iamVjdEluZGljZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrVW5yZWdpc3Rlck9iamVjdHNOVlg8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtPYmplY3RUYWJsZU5WWDwvdHlwZT4gPG5hbWU+b2JqZWN0VGFibGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+b2JqZWN0Q291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49Im9iamVjdENvdW50Ij5jb25zdCA8dHlwZT5Wa09iamVjdEVudHJ5VHlwZU5WWDwvdHlwZT4qIDxuYW1lPnBPYmplY3RFbnRyeVR5cGVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJvYmplY3RDb3VudCI+Y29uc3QgPHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wT2JqZWN0SW5kaWNlczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlg8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWDwvdHlwZT4qIDxuYW1lPnBGZWF0dXJlczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg8L3R5cGU+KiA8bmFtZT5wTGltaXRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMjwvdHlwZT4qIDxuYW1lPnBGZWF0dXJlczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9InZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLz4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczI8L3R5cGU+KiA8bmFtZT5wUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiIgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9InZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiIvPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRm9ybWF0PC90eXBlPiA8bmFtZT5mb3JtYXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0Zvcm1hdFByb3BlcnRpZXMyPC90eXBlPiogPG5hbWU+cEZvcm1hdFByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIiICAgICAgICAgICAgICAgIGFsaWFzPSJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIiLz4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfRk9STUFUX05PVF9TVVBQT1JURUQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzI8L3R5cGU+KiA8bmFtZT5wSW1hZ2VGb3JtYXRJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyPC90eXBlPiogPG5hbWU+cEltYWdlRm9ybWF0UHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiAgICAgICAgICAgYWxpYXM9InZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIi8+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCI+PHR5cGU+VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyPC90eXBlPiogPG5hbWU+cFF1ZXVlRmFtaWx5UHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSIiAgICAgICAgICAgYWxpYXM9InZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIi8+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyPC90eXBlPiogPG5hbWU+cE1lbW9yeVByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIiICAgICAgICAgICAgICAgIGFsaWFzPSJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIiLz4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yPC90eXBlPiogPG5hbWU+cEZvcm1hdEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUHJvcGVydHlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBQcm9wZXJ0eUNvdW50Ij48dHlwZT5Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI8L3R5cGU+KiA8bmFtZT5wUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiAgICAgYWxpYXM9InZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIi8+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaXBlbGluZUJpbmRQb2ludDwvdHlwZT4gPG5hbWU+cGlwZWxpbmVCaW5kUG9pbnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BpcGVsaW5lTGF5b3V0PC90eXBlPiA8bmFtZT5sYXlvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmRlc2NyaXB0b3JXcml0ZUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJkZXNjcmlwdG9yV3JpdGVDb3VudCI+Y29uc3QgPHR5cGU+VmtXcml0ZURlc2NyaXB0b3JTZXQ8L3R5cGU+KiA8bmFtZT5wRGVzY3JpcHRvcldyaXRlczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrVHJpbUNvbW1hbmRQb29sPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZFBvb2w8L3R5cGU+IDxuYW1lPmNvbW1hbmRQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQ29tbWFuZFBvb2xUcmltRmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtUcmltQ29tbWFuZFBvb2xLSFIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0idmtUcmltQ29tbWFuZFBvb2wiLz4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbzwvdHlwZT4qIDxuYW1lPnBFeHRlcm5hbEJ1ZmZlckluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSIiAgICAgICAgIGFsaWFzPSJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIi8+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfVE9PX01BTllfT0JKRUNUUyxWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSPC90eXBlPiogPG5hbWU+cEdldFdpbjMySGFuZGxlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPkhBTkRMRTwvdHlwZT4qIDxuYW1lPnBIYW5kbGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPkhBTkRMRTwvdHlwZT4gPG5hbWU+aGFuZGxlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI8L3R5cGU+KiA8bmFtZT5wTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTLFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0TWVtb3J5RmRLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtNZW1vcnlHZXRGZEluZm9LSFI8L3R5cGU+KiA8bmFtZT5wR2V0RmRJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+aW50PC90eXBlPiogPG5hbWU+cEZkPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9JTlZBTElEX0VYVEVSTkFMX0hBTkRMRSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHM8L3R5cGU+IDxuYW1lPmhhbmRsZVR5cGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5pbnQ8L3R5cGU+IDxuYW1lPmZkPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtNZW1vcnlGZFByb3BlcnRpZXNLSFI8L3R5cGU+KiA8bmFtZT5wTWVtb3J5RmRQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbzwvdHlwZT4qIDxuYW1lPnBFeHRlcm5hbFNlbWFwaG9yZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIiAgICAgICAgICAgYWxpYXM9InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiLz4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTLFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFI8L3R5cGU+KiA8bmFtZT5wR2V0V2luMzJIYW5kbGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+SEFORExFPC90eXBlPiogPG5hbWU+cEhhbmRsZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjwvdHlwZT4qIDxuYW1lPnBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFMsVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRTZW1hcGhvcmVGZEtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUjwvdHlwZT4qIDxuYW1lPnBHZXRGZEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5pbnQ8L3R5cGU+KiA8bmFtZT5wRmQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9JTlZBTElEX0VYVEVSTkFMX0hBTkRMRSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrSW1wb3J0U2VtYXBob3JlRmRLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFI8L3R5cGU+KiA8bmFtZT5wSW1wb3J0U2VtYXBob3JlRmRJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm88L3R5cGU+KiA8bmFtZT5wRXh0ZXJuYWxGZW5jZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzPC90eXBlPiogPG5hbWU+cEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIiAgICAgICAgICAgYWxpYXM9InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyIvPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFMsVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFI8L3R5cGU+KiA8bmFtZT5wR2V0V2luMzJIYW5kbGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+SEFORExFPC90eXBlPiogPG5hbWU+cEhhbmRsZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI8L3R5cGU+KiA8bmFtZT5wSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFMsVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRGZW5jZUZkS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRmVuY2VHZXRGZEluZm9LSFI8L3R5cGU+KiA8bmFtZT5wR2V0RmRJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+aW50PC90eXBlPiogPG5hbWU+cEZkPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfSU5WQUxJRF9FWFRFUk5BTF9IQU5ETEUiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0ltcG9ydEZlbmNlRmRLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtJbXBvcnRGZW5jZUZkSW5mb0tIUjwvdHlwZT4qIDxuYW1lPnBJbXBvcnRGZW5jZUZkSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrUmVsZWFzZURpc3BsYXlFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGlzcGxheUtIUjwvdHlwZT4gPG5hbWU+ZGlzcGxheTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPkRpc3BsYXk8L3R5cGU+KiA8bmFtZT5kcHk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0Rpc3BsYXlLSFI8L3R5cGU+IDxuYW1lPmRpc3BsYXk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+RGlzcGxheTwvdHlwZT4qIDxuYW1lPmRweTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlJST3V0cHV0PC90eXBlPiA8bmFtZT5yck91dHB1dDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGlzcGxheUtIUjwvdHlwZT4qIDxuYW1lPnBEaXNwbGF5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtEaXNwbGF5UG93ZXJDb250cm9sRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGlzcGxheUtIUjwvdHlwZT4gPG5hbWU+ZGlzcGxheTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGlzcGxheVBvd2VySW5mb0VYVDwvdHlwZT4qIDxuYW1lPnBEaXNwbGF5UG93ZXJJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtSZWdpc3RlckRldmljZUV2ZW50RVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGV2aWNlRXZlbnRJbmZvRVhUPC90eXBlPiogPG5hbWU+cERldmljZUV2ZW50SW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtGZW5jZTwvdHlwZT4qIDxuYW1lPnBGZW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEaXNwbGF5S0hSPC90eXBlPiA8bmFtZT5kaXNwbGF5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtEaXNwbGF5RXZlbnRJbmZvRVhUPC90eXBlPiogPG5hbWU+cERpc3BsYXlFdmVudEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRmVuY2U8L3R5cGU+KiA8bmFtZT5wRmVuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX0RFVklDRV9MT1NULFZLX0VSUk9SX09VVF9PRl9EQVRFX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0U3dhcGNoYWluQ291bnRlckVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N3YXBjaGFpbktIUjwvdHlwZT4gPG5hbWU+c3dhcGNoYWluPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUPC90eXBlPiA8bmFtZT5jb3VudGVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDY0X3Q8L3R5cGU+KiA8bmFtZT5wQ291bnRlclZhbHVlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfU1VSRkFDRV9MT1NUX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlS0hSPC90eXBlPiA8bmFtZT5zdXJmYWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVDwvdHlwZT4qIDxuYW1lPnBTdXJmYWNlQ2FwYWJpbGl0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbnN0YW5jZTwvdHlwZT4gPG5hbWU+aW5zdGFuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUGh5c2ljYWxEZXZpY2VHcm91cENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCI+PHR5cGU+VmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllczwvdHlwZT4qIDxuYW1lPnBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIiICAgICAgICAgICAgICAgICAgICAgYWxpYXM9InZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMiLz4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlczwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+aGVhcEluZGV4PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmxvY2FsRGV2aWNlSW5kZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+cmVtb3RlRGV2aWNlSW5kZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3M8L3R5cGU+KiA8bmFtZT5wUGVlck1lbW9yeUZlYXR1cmVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiIgICAgICAgICAgICAgICAgICBhbGlhcz0idmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIvPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9JTlZBTElEX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfS0hSIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtCaW5kQnVmZmVyTWVtb3J5MjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+YmluZEluZm9Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYmluZEluZm9Db3VudCI+Y29uc3QgPHR5cGU+VmtCaW5kQnVmZmVyTWVtb3J5SW5mbzwvdHlwZT4qIDxuYW1lPnBCaW5kSW5mb3M8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0JpbmRCdWZmZXJNZW1vcnkyS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJ2a0JpbmRCdWZmZXJNZW1vcnkyIi8+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtCaW5kSW1hZ2VNZW1vcnkyPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5iaW5kSW5mb0NvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJiaW5kSW5mb0NvdW50Ij5jb25zdCA8dHlwZT5Wa0JpbmRJbWFnZU1lbW9yeUluZm88L3R5cGU+KiA8bmFtZT5wQmluZEluZm9zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtCaW5kSW1hZ2VNZW1vcnkyS0hSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0idmtCaW5kSW1hZ2VNZW1vcnkyIi8+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSx0cmFuc2ZlciIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFNldERldmljZU1hc2s8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZGV2aWNlTWFzazwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0RGV2aWNlTWFza0tIUiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9InZrQ21kU2V0RGV2aWNlTWFzayIvPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPC90eXBlPiogPG5hbWU+cERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+IDxuYW1lPnN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+VmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFI8L3R5cGU+KiA8bmFtZT5wTW9kZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfVElNRU9VVCxWS19OT1RfUkVBRFksVktfU1VCT1BUSU1BTF9LSFIiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9ERVZJQ0VfTE9TVCxWS19FUlJPUl9PVVRfT0ZfREFURV9LSFIsVktfRVJST1JfU1VSRkFDRV9MT1NUX0tIUixWS19FUlJPUl9GVUxMX1NDUkVFTl9FWENMVVNJVkVfTU9ERV9MT1NUX0VYVCI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQWNxdWlyZU5leHRJbWFnZTJLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUjwvdHlwZT4qIDxuYW1lPnBBY3F1aXJlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cEltYWdlSW5kZXg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImNvbXB1dGUiIHJlbmRlcnBhc3M9Im91dHNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWREaXNwYXRjaEJhc2U8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+YmFzZUdyb3VwWDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5iYXNlR3JvdXBZPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmJhc2VHcm91cFo8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Z3JvdXBDb3VudFg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Z3JvdXBDb3VudFk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Z3JvdXBDb3VudFo8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZERpc3BhdGNoQmFzZUtIUiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJ2a0NtZERpc3BhdGNoQmFzZSIvPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+IDxuYW1lPnN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUmVjdENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFJlY3RDb3VudCI+PHR5cGU+VmtSZWN0MkQ8L3R5cGU+KiA8bmFtZT5wUmVjdHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTwvdHlwZT4qIDxuYW1lPnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIvPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPC90eXBlPiA8bmFtZT5kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIgICAgICAgICAgICAgICAgICAgYWxpYXM9InZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIvPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGU8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtEZXNjcmlwdG9yU2V0PC90eXBlPiA8bmFtZT5kZXNjcmlwdG9yU2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU8L3R5cGU+IDxuYW1lPmRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cERhdGE8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiICAgICAgICAgICAgICAgICAgIGFsaWFzPSJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUiLz4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTwvdHlwZT4gPG5hbWU+ZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaXBlbGluZUxheW91dDwvdHlwZT4gPG5hbWU+bGF5b3V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnNldDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIj5jb25zdCA8dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cERhdGE8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a1NldEhkck1ldGFkYXRhRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5zd2FwY2hhaW5Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ic3dhcGNoYWluQ291bnQiPmNvbnN0IDx0eXBlPlZrU3dhcGNoYWluS0hSPC90eXBlPiogPG5hbWU+cFN3YXBjaGFpbnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InN3YXBjaGFpbkNvdW50Ij5jb25zdCA8dHlwZT5Wa0hkck1ldGFkYXRhRVhUPC90eXBlPiogPG5hbWU+cE1ldGFkYXRhPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX1NVQk9QVElNQUxfS0hSIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfREVWSUNFX0xPU1QsVktfRVJST1JfT1VUX09GX0RBVEVfS0hSLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIsVktfRVJST1JfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX01PREVfTE9TVF9FWFQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFN3YXBjaGFpblN0YXR1c0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1N3YXBjaGFpbktIUjwvdHlwZT4gPG5hbWU+c3dhcGNoYWluPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9ERVZJQ0VfTE9TVCxWS19FUlJPUl9TVVJGQUNFX0xPU1RfS0hSIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1N3YXBjaGFpbktIUjwvdHlwZT4gPG5hbWU+c3dhcGNoYWluPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRTwvdHlwZT4qIDxuYW1lPnBEaXNwbGF5VGltaW5nUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9ERVZJQ0VfTE9TVCxWS19FUlJPUl9PVVRfT0ZfREFURV9LSFIsVktfRVJST1JfU1VSRkFDRV9MT1NUX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRTwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1N3YXBjaGFpbktIUjwvdHlwZT4gPG5hbWU+c3dhcGNoYWluPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFByZXNlbnRhdGlvblRpbWluZ0NvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFByZXNlbnRhdGlvblRpbWluZ0NvdW50Ij48dHlwZT5Wa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEU8L3R5cGU+KiA8bmFtZT5wUHJlc2VudGF0aW9uVGltaW5nczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX05BVElWRV9XSU5ET1dfSU5fVVNFX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlSU9TU3VyZmFjZU1WSzwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5zdGFuY2U8L3R5cGU+IDxuYW1lPmluc3RhbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSzwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+KiA8bmFtZT5wU3VyZmFjZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX05BVElWRV9XSU5ET1dfSU5fVVNFX0tIUiI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbnN0YW5jZTwvdHlwZT4gPG5hbWU+aW5zdGFuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVks8L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTdXJmYWNlS0hSPC90eXBlPiogPG5hbWU+cFN1cmZhY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9OQVRJVkVfV0lORE9XX0lOX1VTRV9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5zdGFuY2U8L3R5cGU+IDxuYW1lPmluc3RhbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU3VyZmFjZUtIUjwvdHlwZT4qIDxuYW1lPnBTdXJmYWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5maXJzdFZpZXdwb3J0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnZpZXdwb3J0Q291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InZpZXdwb3J0Q291bnQiPmNvbnN0IDx0eXBlPlZrVmlld3BvcnRXU2NhbGluZ05WPC90eXBlPiogPG5hbWU+cFZpZXdwb3J0V1NjYWxpbmdzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3REaXNjYXJkUmVjdGFuZ2xlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmRpc2NhcmRSZWN0YW5nbGVDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iZGlzY2FyZFJlY3RhbmdsZUNvdW50Ij5jb25zdCA8dHlwZT5Wa1JlY3QyRDwvdHlwZT4qIDxuYW1lPnBEaXNjYXJkUmVjdGFuZ2xlczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQ8L3R5cGU+KiA8bmFtZT5wU2FtcGxlTG9jYXRpb25zSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU2FtcGxlQ291bnRGbGFnQml0czwvdHlwZT4gPG5hbWU+c2FtcGxlczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUPC90eXBlPiogPG5hbWU+cE11bHRpc2FtcGxlUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI8L3R5cGU+KiA8bmFtZT5wU3VyZmFjZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSPC90eXBlPiogPG5hbWU+cFN1cmZhY2VDYXBhYmlsaXRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSPC90eXBlPiogPG5hbWU+cFN1cmZhY2VJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFN1cmZhY2VGb3JtYXRDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBTdXJmYWNlRm9ybWF0Q291bnQiPjx0eXBlPlZrU3VyZmFjZUZvcm1hdDJLSFI8L3R5cGU+KiA8bmFtZT5wU3VyZmFjZUZvcm1hdHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFByb3BlcnR5Q291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgbGVuPSJwUHJvcGVydHlDb3VudCI+PHR5cGU+VmtEaXNwbGF5UHJvcGVydGllczJLSFI8L3R5cGU+KiA8bmFtZT5wUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0eUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFByb3BlcnR5Q291bnQiPjx0eXBlPlZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI8L3R5cGU+KiA8bmFtZT5wUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGlzcGxheUtIUjwvdHlwZT4gPG5hbWU+ZGlzcGxheTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0eUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFByb3BlcnR5Q291bnQiPjx0eXBlPlZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUjwvdHlwZT4qIDxuYW1lPnBQcm9wZXJ0aWVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGlzcGxheVBsYW5lSW5mbzJLSFI8L3R5cGU+KiA8bmFtZT5wRGlzcGxheVBsYW5lSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjwvdHlwZT4qIDxuYW1lPnBDYXBhYmlsaXRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjwvdHlwZT4qIDxuYW1lPnBJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtNZW1vcnlSZXF1aXJlbWVudHMyPC90eXBlPiogPG5hbWU+cE1lbW9yeVJlcXVpcmVtZW50czwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9InZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiIvPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI8L3R5cGU+KiA8bmFtZT5wSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrTWVtb3J5UmVxdWlyZW1lbnRzMjwvdHlwZT4qIDxuYW1lPnBNZW1vcnlSZXF1aXJlbWVudHM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiIvPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI8L3R5cGU+KiA8bmFtZT5wSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQiPjx0eXBlPlZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyPC90eXBlPiogPG5hbWU+cFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiAgICAgICAgICAgICAgICAgYWxpYXM9InZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIi8+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm88L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uPC90eXBlPiogPG5hbWU+cFljYmNyQ29udmVyc2lvbjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIgICAgICAgICAgICAgICAgICAgICAgYWxpYXM9InZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIvPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb248L3R5cGU+IDxuYW1lPnljYmNyQ29udmVyc2lvbjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIgICAgICAgICAgICAgICAgICAgICBhbGlhcz0idmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiIvPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldERldmljZVF1ZXVlMjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0RldmljZVF1ZXVlSW5mbzI8L3R5cGU+KiA8bmFtZT5wUXVldWVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtRdWV1ZTwvdHlwZT4qIDxuYW1lPnBRdWV1ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrVmFsaWRhdGlvbkNhY2hlRVhUPC90eXBlPiogPG5hbWU+cFZhbGlkYXRpb25DYWNoZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtWYWxpZGF0aW9uQ2FjaGVFWFQ8L3R5cGU+IDxuYW1lPnZhbGlkYXRpb25DYWNoZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1ZhbGlkYXRpb25DYWNoZUVYVDwvdHlwZT4gPG5hbWU+dmFsaWRhdGlvbkNhY2hlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnNpemVfdDwvdHlwZT4qIDxuYW1lPnBEYXRhU2l6ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBEYXRhU2l6ZSI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBEYXRhPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa1ZhbGlkYXRpb25DYWNoZUVYVDwvdHlwZT4gPG5hbWU+ZHN0Q2FjaGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c3JjQ2FjaGVDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0ic3JjQ2FjaGVDb3VudCI+Y29uc3QgPHR5cGU+VmtWYWxpZGF0aW9uQ2FjaGVFWFQ8L3R5cGU+KiA8bmFtZT5wU3JjQ2FjaGVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0PC90eXBlPiogPG5hbWU+cFN1cHBvcnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIiAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Ii8+CisgICAgICAgIDxjb21tYW5kPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFN3YXBjaGFpbkdyYWxsb2NVc2FnZUFORFJPSUQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtGb3JtYXQ8L3R5cGU+IDxuYW1lPmZvcm1hdDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2VVc2FnZUZsYWdzPC90eXBlPiA8bmFtZT5pbWFnZVVzYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+aW50PC90eXBlPiogPG5hbWU+Z3JhbGxvY1VzYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0U3dhcGNoYWluR3JhbGxvY1VzYWdlMkFORFJPSUQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtGb3JtYXQ8L3R5cGU+IDxuYW1lPmZvcm1hdDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2VVc2FnZUZsYWdzPC90eXBlPiA8bmFtZT5pbWFnZVVzYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTd2FwY2hhaW5JbWFnZVVzYWdlRmxhZ3NBTkRST0lEPC90eXBlPiA8bmFtZT5zd2FwY2hhaW5JbWFnZVVzYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDY0X3Q8L3R5cGU+KiA8bmFtZT5ncmFsbG9jQ29uc3VtZXJVc2FnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQ2NF90PC90eXBlPiogPG5hbWU+Z3JhbGxvY1Byb2R1Y2VyVXNhZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtBY3F1aXJlSW1hZ2VBTkRST0lEPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2U8L3R5cGU+IDxuYW1lPmltYWdlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+aW50PC90eXBlPiA8bmFtZT5uYXRpdmVGZW5jZUZkPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+IDxuYW1lPnNlbWFwaG9yZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRmVuY2U8L3R5cGU+IDxuYW1lPmZlbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrUXVldWVTaWduYWxSZWxlYXNlSW1hZ2VBTkRST0lEPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtRdWV1ZTwvdHlwZT4gPG5hbWU+cXVldWU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+d2FpdFNlbWFwaG9yZUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtTZW1hcGhvcmU8L3R5cGU+KiA8bmFtZT5wV2FpdFNlbWFwaG9yZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlPC90eXBlPiA8bmFtZT5pbWFnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPmludDwvdHlwZT4qIDxuYW1lPnBOYXRpdmVGZW5jZUZkPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX0ZFQVRVUkVfTk9UX1BSRVNFTlQsVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRTaGFkZXJJbmZvQU1EPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGlwZWxpbmU8L3R5cGU+IDxuYW1lPnBpcGVsaW5lPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTaGFkZXJTdGFnZUZsYWdCaXRzPC90eXBlPiA8bmFtZT5zaGFkZXJTdGFnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrU2hhZGVySW5mb1R5cGVBTUQ8L3R5cGU+IDxuYW1lPmluZm9UeXBlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnNpemVfdDwvdHlwZT4qIDxuYW1lPnBJbmZvU2l6ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBJbmZvU2l6ZSI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtTZXRMb2NhbERpbW1pbmdBTUQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+IDxuYW1lPnN3YXBDaGFpbjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQm9vbDMyPC90eXBlPiA8bmFtZT5sb2NhbERpbW1pbmdFbmFibGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFRpbWVEb21haW5Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBUaW1lRG9tYWluQ291bnQiPjx0eXBlPlZrVGltZURvbWFpbkVYVDwvdHlwZT4qIDxuYW1lPnBUaW1lRG9tYWluczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+dGltZXN0YW1wQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49InRpbWVzdGFtcENvdW50Ij5jb25zdCA8dHlwZT5Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUPC90eXBlPiogPG5hbWU+cFRpbWVzdGFtcEluZm9zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJ0aW1lc3RhbXBDb3VudCI+PHR5cGU+dWludDY0X3Q8L3R5cGU+KiA8bmFtZT5wVGltZXN0YW1wczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQ2NF90PC90eXBlPiogPG5hbWU+cE1heERldmlhdGlvbjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJwTmFtZUluZm8ub2JqZWN0SGFuZGxlIj5jb25zdCA8dHlwZT5Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVDwvdHlwZT4qIDxuYW1lPnBOYW1lSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InBUYWdJbmZvLm9iamVjdEhhbmRsZSI+Y29uc3QgPHR5cGU+VmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVDwvdHlwZT4qIDxuYW1lPnBUYWdJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtRdWV1ZTwvdHlwZT4gPG5hbWU+cXVldWU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0RlYnVnVXRpbHNMYWJlbEVYVDwvdHlwZT4qIDxuYW1lPnBMYWJlbEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtRdWV1ZTwvdHlwZT4gPG5hbWU+cXVldWU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtRdWV1ZTwvdHlwZT4gPG5hbWU+cXVldWU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0RlYnVnVXRpbHNMYWJlbEVYVDwvdHlwZT4qIDxuYW1lPnBMYWJlbEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzLGNvbXB1dGUiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGVidWdVdGlsc0xhYmVsRVhUPC90eXBlPiogPG5hbWU+cExhYmVsSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGVidWdVdGlsc0xhYmVsRVhUPC90eXBlPiogPG5hbWU+cExhYmVsSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbnN0YW5jZTwvdHlwZT4gPG5hbWU+aW5zdGFuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGVidWdVdGlsc01lc3NlbmdlckVYVDwvdHlwZT4qIDxuYW1lPnBNZXNzZW5nZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbnN0YW5jZTwvdHlwZT4gPG5hbWU+aW5zdGFuY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQ8L3R5cGU+IDxuYW1lPm1lc3NlbmdlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW5zdGFuY2U8L3R5cGU+IDxuYW1lPmluc3RhbmNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQ8L3R5cGU+IDxuYW1lPm1lc3NhZ2VTZXZlcml0eTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQ8L3R5cGU+IDxuYW1lPm1lc3NhZ2VUeXBlczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVDwvdHlwZT4qIDxuYW1lPnBDYWxsYmFja0RhdGE8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0czwvdHlwZT4gPG5hbWU+aGFuZGxlVHlwZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBIb3N0UG9pbnRlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUPC90eXBlPiogPG5hbWU+cE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0idHJhbnNmZXIsZ3JhcGhpY3MsY29tcHV0ZSIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0idHJhbnNmZXIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BpcGVsaW5lU3RhZ2VGbGFnQml0czwvdHlwZT4gPG5hbWU+cGlwZWxpbmVTdGFnZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5kc3RCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPmRzdE9mZnNldDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5tYXJrZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlUmVuZGVyUGFzczJLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFI8L3R5cGU+KiA8bmFtZT5wQ3JlYXRlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj5jb25zdCA8dHlwZT5Wa0FsbG9jYXRpb25DYWxsYmFja3M8L3R5cGU+KiA8bmFtZT5wQWxsb2NhdG9yPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtSZW5kZXJQYXNzPC90eXBlPiogPG5hbWU+cFJlbmRlclBhc3M8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJvdXRzaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSIgcGlwZWxpbmU9ImdyYXBoaWNzIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEJlZ2luUmVuZGVyUGFzczJLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1JlbmRlclBhc3NCZWdpbkluZm88L3R5cGU+KiAgICAgIDxuYW1lPnBSZW5kZXJQYXNzQmVnaW48L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1N1YnBhc3NCZWdpbkluZm9LSFI8L3R5cGU+KiAgICAgIDxuYW1lPnBTdWJwYXNzQmVnaW5JbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iaW5zaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSIgcGlwZWxpbmU9ImdyYXBoaWNzIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZE5leHRTdWJwYXNzMktIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrU3VicGFzc0JlZ2luSW5mb0tIUjwvdHlwZT4qICAgICAgPG5hbWU+cFN1YnBhc3NCZWdpbkluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1N1YnBhc3NFbmRJbmZvS0hSPC90eXBlPiogICAgICAgIDxuYW1lPnBTdWJwYXNzRW5kSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9Imluc2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnkiIHBpcGVsaW5lPSJncmFwaGljcyI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRFbmRSZW5kZXJQYXNzMktIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrU3VicGFzc0VuZEluZm9LSFI8L3R5cGU+KiAgICAgICAgPG5hbWU+cFN1YnBhc3NFbmRJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlksVktfRVJST1JfREVWSUNFX0xPU1QiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1NlbWFwaG9yZTwvdHlwZT4gPG5hbWU+c2VtYXBob3JlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDY0X3Q8L3R5cGU+KiA8bmFtZT5wVmFsdWU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfVElNRU9VVCIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0RFVklDRV9MT1NUIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtXYWl0U2VtYXBob3Jlc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSPC90eXBlPiogPG5hbWU+cFdhaXRJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDY0X3Q8L3R5cGU+IDxuYW1lPnRpbWVvdXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrU2lnbmFsU2VtYXBob3JlS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUjwvdHlwZT4qIDxuYW1lPnBTaWduYWxJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9JTlZBTElEX0VYVEVSTkFMX0hBTkRMRV9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IHN0cnVjdCA8dHlwZT5BSGFyZHdhcmVCdWZmZXI8L3R5cGU+KiA8bmFtZT5idWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEPC90eXBlPiogPG5hbWU+cFByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFMsVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ8L3R5cGU+KiA8bmFtZT5wSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPnN0cnVjdCA8dHlwZT5BSGFyZHdhcmVCdWZmZXI8L3R5cGU+KiogPG5hbWU+cEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9Imluc2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0iZ3JhcGhpY3MiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+YnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5vZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+Y291bnRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPmNvdW50QnVmZmVyT2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm1heERyYXdDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5zdHJpZGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZERyYXdJbmRpcmVjdENvdW50QU1EIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcz0idmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiIvPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJpbnNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSIgcGlwZWxpbmU9ImdyYXBoaWNzIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5idWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPm9mZnNldDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5jb3VudEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gPG5hbWU+Y291bnRCdWZmZXJPZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bWF4RHJhd0NvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnN0cmlkZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzPSJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiIvPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzLGNvbXB1dGUsdHJhbnNmZXIiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRTZXRDaGVja3BvaW50TlY8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBub2F1dG92YWxpZGl0eT0idHJ1ZSI+Y29uc3QgPHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBDaGVja3BvaW50TWFya2VyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlY8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXVlPC90eXBlPiA8bmFtZT5xdWV1ZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBDaGVja3BvaW50RGF0YUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icENoZWNrcG9pbnREYXRhQ291bnQiPjx0eXBlPlZrQ2hlY2twb2ludERhdGFOVjwvdHlwZT4qIDxuYW1lPnBDaGVja3BvaW50RGF0YTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZpcnN0QmluZGluZzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5iaW5kaW5nQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImJpbmRpbmdDb3VudCI+Y29uc3QgPHR5cGU+VmtCdWZmZXI8L3R5cGU+KiA8bmFtZT5wQnVmZmVyczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYmluZGluZ0NvdW50Ij5jb25zdCA8dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+KiA8bmFtZT5wT2Zmc2V0czwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49ImJpbmRpbmdDb3VudCI+Y29uc3QgPHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiogPG5hbWU+cFNpemVzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iaW5zaWRlIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5maXJzdENvdW50ZXJCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmNvdW50ZXJCdWZmZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG5vYXV0b3ZhbGlkaXR5PSJ0cnVlIiBsZW49ImNvdW50ZXJCdWZmZXJDb3VudCI+Y29uc3QgPHR5cGU+VmtCdWZmZXI8L3R5cGU+KiA8bmFtZT5wQ291bnRlckJ1ZmZlcnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgbGVuPSJjb3VudGVyQnVmZmVyQ291bnQiPmNvbnN0IDx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4qIDxuYW1lPnBDb3VudGVyQnVmZmVyT2Zmc2V0czwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9Imluc2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZpcnN0Q291bnRlckJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Y291bnRlckJ1ZmZlckNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbm9hdXRvdmFsaWRpdHk9InRydWUiIGxlbj0iY291bnRlckJ1ZmZlckNvdW50Ij5jb25zdCA8dHlwZT5Wa0J1ZmZlcjwvdHlwZT4qIDxuYW1lPnBDb3VudGVyQnVmZmVyczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49ImNvdW50ZXJCdWZmZXJDb3VudCI+Y29uc3QgPHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiogPG5hbWU+cENvdW50ZXJCdWZmZXJPZmZzZXRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXJ5UG9vbDwvdHlwZT4gPG5hbWU+cXVlcnlQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnF1ZXJ5PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrUXVlcnlDb250cm9sRmxhZ3M8L3R5cGU+IDxuYW1lPmZsYWdzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmluZGV4PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRW5kUXVlcnlJbmRleGVkRVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtRdWVyeVBvb2w8L3R5cGU+IDxuYW1lPnF1ZXJ5UG9vbDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5xdWVyeTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5pbmRleDwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9Imluc2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0iZ3JhcGhpY3MiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmluc3RhbmNlQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RJbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5jb3VudGVyQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5jb3VudGVyQnVmZmVyT2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmNvdW50ZXJPZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+dmVydGV4U3RyaWRlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5maXJzdEV4Y2x1c2l2ZVNjaXNzb3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+ZXhjbHVzaXZlU2Npc3NvckNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJleGNsdXNpdmVTY2lzc29yQ291bnQiPmNvbnN0IDx0eXBlPlZrUmVjdDJEPC90eXBlPiogPG5hbWU+cEV4Y2x1c2l2ZVNjaXNzb3JzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlY8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtJbWFnZVZpZXc8L3R5cGU+IDxuYW1lPmltYWdlVmlldzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrSW1hZ2VMYXlvdXQ8L3R5cGU+IDxuYW1lPmltYWdlTGF5b3V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlY8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Zmlyc3RWaWV3cG9ydDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT52aWV3cG9ydENvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJ2aWV3cG9ydENvdW50Ij5jb25zdCA8dHlwZT5Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WPC90eXBlPiogPG5hbWU+cFNoYWRpbmdSYXRlUGFsZXR0ZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtIGV4dGVybnN5bmM9InRydWUiPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlY8L3R5cGU+IDxuYW1lPnNhbXBsZU9yZGVyVHlwZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Y3VzdG9tU2FtcGxlT3JkZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iY3VzdG9tU2FtcGxlT3JkZXJDb3VudCI+Y29uc3QgPHR5cGU+VmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WPC90eXBlPiogPG5hbWU+cEN1c3RvbVNhbXBsZU9yZGVyczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MiIHJlbmRlcnBhc3M9Imluc2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBwaXBlbGluZT0iZ3JhcGhpY3MiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kRHJhd01lc2hUYXNrc05WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPnRhc2tDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5maXJzdFRhc2s8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJpbnNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSIgcGlwZWxpbmU9ImdyYXBoaWNzIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0gZXh0ZXJuc3luYz0idHJ1ZSI+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPmJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gPG5hbWU+b2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmRyYXdDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5zdHJpZGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJpbnNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSIgcGlwZWxpbmU9ImdyYXBoaWNzIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlY8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+YnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5vZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+Y291bnRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPmNvdW50QnVmZmVyT2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPm1heERyYXdDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5zdHJpZGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ29tcGlsZURlZmVycmVkTlY8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaXBlbGluZTwvdHlwZT4gPG5hbWU+cGlwZWxpbmU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+c2hhZGVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+Y29uc3QgPHR5cGU+VmtBbGxvY2F0aW9uQ2FsbGJhY2tzPC90eXBlPiogPG5hbWU+cEFsbG9jYXRvcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L3R5cGU+KiA8bmFtZT5wQWNjZWxlcmF0aW9uU3RydWN0dXJlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvdHlwZT4gPG5hbWU+YWNjZWxlcmF0aW9uU3RydWN0dXJlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WPC90eXBlPiogPG5hbWU+cEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa01lbW9yeVJlcXVpcmVtZW50czJLSFI8L3R5cGU+KiA8bmFtZT5wTWVtb3J5UmVxdWlyZW1lbnRzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+YmluZEluZm9Db3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYmluZEluZm9Db3VudCI+Y29uc3QgPHR5cGU+VmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WPC90eXBlPiogPG5hbWU+cEJpbmRJbmZvczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iY29tcHV0ZSIgcmVuZGVycGFzcz0ib3V0c2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L3R5cGU+IDxuYW1lPmRzdDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L3R5cGU+IDxuYW1lPnNyYzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOVjwvdHlwZT4gPG5hbWU+bW9kZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iY29tcHV0ZSIgcmVuZGVycGFzcz0ib3V0c2lkZSIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIGxlbj0iYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQiPmNvbnN0IDx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L3R5cGU+KiA8bmFtZT5wQWNjZWxlcmF0aW9uU3RydWN0dXJlczwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUXVlcnlUeXBlPC90eXBlPiA8bmFtZT5xdWVyeVR5cGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1F1ZXJ5UG9vbDwvdHlwZT4gPG5hbWU+cXVlcnlQb29sPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmZpcnN0UXVlcnk8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImNvbXB1dGUiIHJlbmRlcnBhc3M9Im91dHNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtDb21tYW5kQnVmZmVyPC90eXBlPiA8bmFtZT5jb21tYW5kQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY8L3R5cGU+KiA8bmFtZT5wSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+aW5zdGFuY2VEYXRhPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5pbnN0YW5jZU9mZnNldDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQm9vbDMyPC90eXBlPiA8bmFtZT51cGRhdGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPC90eXBlPiA8bmFtZT5kc3Q8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjwvdHlwZT4gPG5hbWU+c3JjPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPnNjcmF0Y2g8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPnNjcmF0Y2hPZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImNvbXB1dGUiIHJlbmRlcnBhc3M9Im91dHNpZGUiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtDbWRUcmFjZVJheXNOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5yYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPnJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSI+PHR5cGU+VmtCdWZmZXI8L3R5cGU+IDxuYW1lPm1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZVNpemU8L3R5cGU+IDxuYW1lPm1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5taXNzU2hhZGVyQmluZGluZ1N0cmlkZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa0J1ZmZlcjwvdHlwZT4gPG5hbWU+aGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5oaXRTaGFkZXJCaW5kaW5nT2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5oaXRTaGFkZXJCaW5kaW5nU3RyaWRlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPjx0eXBlPlZrQnVmZmVyPC90eXBlPiA8bmFtZT5jYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlU2l6ZTwvdHlwZT4gPG5hbWU+Y2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2VTaXplPC90eXBlPiA8bmFtZT5jYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+d2lkdGg8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+aGVpZ2h0PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmRlcHRoPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BpcGVsaW5lPC90eXBlPiA8bmFtZT5waXBlbGluZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5maXJzdEdyb3VwPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+dWludDMyX3Q8L3R5cGU+IDxuYW1lPmdyb3VwQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5zaXplX3Q8L3R5cGU+IDxuYW1lPmRhdGFTaXplPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJkYXRhU2l6ZSI+PHR5cGU+dm9pZDwvdHlwZT4qIDxuYW1lPnBEYXRhPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY8L3R5cGU+IDxuYW1lPmFjY2VsZXJhdGlvblN0cnVjdHVyZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnNpemVfdDwvdHlwZT4gPG5hbWU+ZGF0YVNpemU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImRhdGFTaXplIj48dHlwZT52b2lkPC90eXBlPiogPG5hbWU+cERhdGE8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9JTlZBTElEX1NIQURFUl9OViI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIj48dHlwZT5Wa1BpcGVsaW5lQ2FjaGU8L3R5cGU+IDxuYW1lPnBpcGVsaW5lQ2FjaGU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+Y3JlYXRlSW5mb0NvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gbGVuPSJjcmVhdGVJbmZvQ291bnQiPmNvbnN0IDx0eXBlPlZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WPC90eXBlPiogPG5hbWU+cENyZWF0ZUluZm9zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBsZW49ImNyZWF0ZUluZm9Db3VudCI+PHR5cGU+VmtQaXBlbGluZTwvdHlwZT4qIDxuYW1lPnBQaXBlbGluZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQaHlzaWNhbERldmljZTwvdHlwZT4gPG5hbWU+cGh5c2ljYWxEZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUHJvcGVydHlDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBQcm9wZXJ0eUNvdW50Ij48dHlwZT5Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WPC90eXBlPiogPG5hbWU+cFByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+dmtHZXRJbWFnZVZpZXdIYW5kbGVOVlg8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYPC90eXBlPiogPG5hbWU+cEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI8L3R5cGU+KiA8bmFtZT5wU3VyZmFjZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wUHJlc2VudE1vZGVDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBQcmVzZW50TW9kZUNvdW50Ij48dHlwZT5Wa1ByZXNlbnRNb2RlS0hSPC90eXBlPiogPG5hbWU+cFByZXNlbnRNb2RlczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUjwvdHlwZT4qIDxuYW1lPnBTdXJmYWNlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT5Wa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUjwvdHlwZT4qIDxuYW1lPnBNb2RlczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRCxWS19FUlJPUl9TVVJGQUNFX0xPU1RfS0hSIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtTd2FwY2hhaW5LSFI8L3R5cGU+IDxuYW1lPnN3YXBjaGFpbjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N3YXBjaGFpbktIUjwvdHlwZT4gPG5hbWU+c3dhcGNoYWluPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSxWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFI8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiA8bmFtZT5xdWV1ZUZhbWlseUluZGV4PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cENvdW50ZXJDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBDb3VudGVyQ291bnQiPjx0eXBlPlZrUGVyZm9ybWFuY2VDb3VudGVyS0hSPC90eXBlPiogPG5hbWU+cENvdW50ZXJzPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icENvdW50ZXJDb3VudCI+PHR5cGU+VmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUjwvdHlwZT4qIDxuYW1lPnBDb3VudGVyRGVzY3JpcHRpb25zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQ+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+dm9pZDwvdHlwZT4gPG5hbWU+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI8L3R5cGU+KiA8bmFtZT5wUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBOdW1QYXNzZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX1RJTUVPVVQiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSPC90eXBlPiogPG5hbWU+cEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtJbWFnZTwvdHlwZT4gPG5hbWU+aW1hZ2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUPC90eXBlPiogPG5hbWU+cFByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT51aW50NjRfdDwvdHlwZT4gPG5hbWU+dmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSPC90eXBlPiogPG5hbWU+cEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa0RldmljZUFkZHJlc3M8L3R5cGU+IDxuYW1lPnZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSPC90eXBlPiogPG5hbWU+cEluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQiICAgICAgICBhbGlhcz0idmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIi8+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0luc3RhbmNlPC90eXBlPiA8bmFtZT5pbnN0YW5jZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVDwvdHlwZT4qIDxuYW1lPnBDcmVhdGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiPmNvbnN0IDx0eXBlPlZrQWxsb2NhdGlvbkNhbGxiYWNrczwvdHlwZT4qIDxuYW1lPnBBbGxvY2F0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1N1cmZhY2VLSFI8L3R5cGU+KiA8bmFtZT5wU3VyZmFjZTwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2U8L3R5cGU+IDxuYW1lPnBoeXNpY2FsRGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9ImZhbHNlLHRydWUiPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cENvbWJpbmF0aW9uQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgbGVuPSJwQ29tYmluYXRpb25Db3VudCI+PHR5cGU+VmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlY8L3R5cGU+KiA8bmFtZT5wQ29tYmluYXRpb25zPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTLFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUw8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUw8L3R5cGU+KiA8bmFtZT5wSW5pdGlhbGl6ZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT52b2lkPC90eXBlPiA8bmFtZT52a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUw8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgcXVldWVzPSJncmFwaGljcyxjb21wdXRlLHRyYW5zZmVyIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfVE9PX01BTllfT0JKRUNUUyxWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUw8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMPC90eXBlPiogPG5hbWU+cE1hcmtlckluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzLGNvbXB1dGUsdHJhbnNmZXIiIHJlbmRlcnBhc3M9ImJvdGgiIGNtZGJ1ZmZlcmxldmVsPSJwcmltYXJ5LHNlY29uZGFyeSIgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTLFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrQ29tbWFuZEJ1ZmZlcjwvdHlwZT4gPG5hbWU+Y29tbWFuZEJ1ZmZlcjwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUw8L3R5cGU+KiA8bmFtZT5wTWFya2VySW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHF1ZXVlcz0iZ3JhcGhpY3MsY29tcHV0ZSx0cmFuc2ZlciIgcmVuZGVycGFzcz0iYm90aCIgY21kYnVmZmVybGV2ZWw9InByaW1hcnksc2Vjb25kYXJ5IiBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MiIGVycm9yY29kZXM9IlZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFMsVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUw8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUw8L3R5cGU+KiA8bmFtZT5wT3ZlcnJpZGVJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTLFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+IDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTDwvdHlwZT4qIDxuYW1lPnBBY3F1aXJlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw8L3R5cGU+KiA8bmFtZT5wQ29uZmlndXJhdGlvbjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfVE9PX01BTllfT0JKRUNUUyxWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMPC90eXBlPiA8bmFtZT5jb25maWd1cmF0aW9uPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTLFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrUXVldWU8L3R5cGU+IDxuYW1lPnF1ZXVlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDwvdHlwZT4gPG5hbWU+Y29uZmlndXJhdGlvbjwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfVE9PX01BTllfT0JKRUNUUyxWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUw8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa0RldmljZTwvdHlwZT4gPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTDwvdHlwZT4gPG5hbWU+cGFyYW1ldGVyPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtQZXJmb3JtYW5jZVZhbHVlSU5URUw8L3R5cGU+KiA8bmFtZT5wVmFsdWU8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZD4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT51aW50NjRfdDwvdHlwZT4gPG5hbWU+dmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiA8bmFtZT5kZXZpY2U8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT5jb25zdCA8dHlwZT5Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUjwvdHlwZT4qIDxuYW1lPnBJbmZvPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiIGVycm9yY29kZXM9IlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSxWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSI+CisgICAgICAgICAgICA8cHJvdG8+PHR5cGU+VmtSZXN1bHQ8L3R5cGU+IDxuYW1lPnZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjwvbmFtZT48L3Byb3RvPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPlZrRGV2aWNlPC90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPmNvbnN0IDx0eXBlPlZrUGlwZWxpbmVJbmZvS0hSPC90eXBlPiogICAgICAgIDxuYW1lPnBQaXBlbGluZUluZm88L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0iZmFsc2UsdHJ1ZSI+PHR5cGU+dWludDMyX3Q8L3R5cGU+KiA8bmFtZT5wRXhlY3V0YWJsZUNvdW50PC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0gb3B0aW9uYWw9InRydWUiIGxlbj0icEV4ZWN1dGFibGVDb3VudCI+PHR5cGU+VmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSPC90eXBlPiogPG5hbWU+cFByb3BlcnRpZXM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBzdWNjZXNzY29kZXM9IlZLX1NVQ0NFU1MsVktfSU5DT01QTEVURSIgZXJyb3Jjb2Rlcz0iVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZLFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIj4KKyAgICAgICAgICAgIDxwcm90bz48dHlwZT5Wa1Jlc3VsdDwvdHlwZT4gPG5hbWU+dmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSPC90eXBlPiogIDxuYW1lPnBFeGVjdXRhYmxlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBTdGF0aXN0aWNDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBTdGF0aXN0aWNDb3VudCI+PHR5cGU+VmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFI8L3R5cGU+KiA8bmFtZT5wU3RhdGlzdGljczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kIHN1Y2Nlc3Njb2Rlcz0iVktfU1VDQ0VTUyxWS19JTkNPTVBMRVRFIiBlcnJvcmNvZGVzPSJWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSPC9uYW1lPjwvcHJvdG8+CisgICAgICAgICAgICA8cGFyYW0+PHR5cGU+VmtEZXZpY2U8L3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGV2aWNlPC9uYW1lPjwvcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0+Y29uc3QgPHR5cGU+VmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSPC90eXBlPiogIDxuYW1lPnBFeGVjdXRhYmxlSW5mbzwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJmYWxzZSx0cnVlIj48dHlwZT51aW50MzJfdDwvdHlwZT4qIDxuYW1lPnBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQ8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbSBvcHRpb25hbD0idHJ1ZSIgbGVuPSJwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50Ij48dHlwZT5Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFI8L3R5cGU+KiA8bmFtZT5wSW50ZXJuYWxSZXByZXNlbnRhdGlvbnM8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICAgICA8Y29tbWFuZCBxdWV1ZXM9ImdyYXBoaWNzIiByZW5kZXJwYXNzPSJib3RoIiBjbWRidWZmZXJsZXZlbD0icHJpbWFyeSxzZWNvbmRhcnkiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPnZvaWQ8L3R5cGU+IDxuYW1lPnZrQ21kU2V0TGluZVN0aXBwbGVFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbSBleHRlcm5zeW5jPSJ0cnVlIj48dHlwZT5Wa0NvbW1hbmRCdWZmZXI8L3R5cGU+IDxuYW1lPmNvbW1hbmRCdWZmZXI8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MzJfdDwvdHlwZT4gPG5hbWU+bGluZVN0aXBwbGVGYWN0b3I8L25hbWU+PC9wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT51aW50MTZfdDwvdHlwZT4gPG5hbWU+bGluZVN0aXBwbGVQYXR0ZXJuPC9uYW1lPjwvcGFyYW0+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQgc3VjY2Vzc2NvZGVzPSJWS19TVUNDRVNTLFZLX0lOQ09NUExFVEUiPgorICAgICAgICAgICAgPHByb3RvPjx0eXBlPlZrUmVzdWx0PC90eXBlPiA8bmFtZT52a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ8L25hbWU+PC9wcm90bz4KKyAgICAgICAgICAgIDxwYXJhbT48dHlwZT5Wa1BoeXNpY2FsRGV2aWNlPC90eXBlPiA8bmFtZT5waHlzaWNhbERldmljZTwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtPjx0eXBlPnVpbnQzMl90PC90eXBlPiogPG5hbWU+cFRvb2xDb3VudDwvbmFtZT48L3BhcmFtPgorICAgICAgICAgICAgPHBhcmFtIG9wdGlvbmFsPSJ0cnVlIiBsZW49InBUb29sQ291bnQiPjx0eXBlPlZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVDwvdHlwZT4qIDxuYW1lPnBUb29sUHJvcGVydGllczwvbmFtZT48L3BhcmFtPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgPC9jb21tYW5kcz4KKworICAgIDxmZWF0dXJlIGFwaT0idnVsa2FuIiBuYW1lPSJWS19WRVJTSU9OXzFfMCIgbnVtYmVyPSIxLjAiIGNvbW1lbnQ9IlZ1bGthbiBjb3JlIEFQSSBpbnRlcmZhY2UgZGVmaW5pdGlvbnMiPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJIZWFkZXIgYm9pbGVycGxhdGUiPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0idmtfcGxhdGZvcm0iLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJBUEkgdmVyc2lvbiI+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWS19BUElfVkVSU0lPTiIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVktfQVBJX1ZFUlNJT05fMV8wIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWS19WRVJTSU9OX01BSk9SIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWS19WRVJTSU9OX01JTk9SIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWS19WRVJTSU9OX1BBVENIIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWS19IRUFERVJfVkVSU0lPTiIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IkFQSSBjb25zdGFudHMiPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iVktfTE9EX0NMQU1QX05PTkUiLz4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9IlZLX1JFTUFJTklOR19NSVBfTEVWRUxTIi8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJWS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTIi8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJWS19XSE9MRV9TSVpFIi8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJWS19BVFRBQ0hNRU5UX1VOVVNFRCIvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iVktfVFJVRSIvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iVktfRkFMU0UiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZLX05VTExfSEFORExFIi8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCIvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iVktfU1VCUEFTU19FWFRFUk5BTCIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNhY2hlSGVhZGVyVmVyc2lvbiIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IkRldmljZSBpbml0aWFsaXphdGlvbiI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZUluc3RhbmNlIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lJbnN0YW5jZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRJbnN0YW5jZVByb2NBZGRyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERldmljZVByb2NBZGRyIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iRGV2aWNlIGNvbW1hbmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlRGV2aWNlIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lEZXZpY2UiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJFeHRlbnNpb24gZGlzY292ZXJ5IGNvbW1hbmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJMYXllciBkaXNjb3ZlcnkgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJxdWV1ZSBjb21tYW5kcyI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERldmljZVF1ZXVlIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1F1ZXVlU3VibWl0Ii8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1F1ZXVlV2FpdElkbGUiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGV2aWNlV2FpdElkbGUiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJNZW1vcnkgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtBbGxvY2F0ZU1lbW9yeSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtGcmVlTWVtb3J5Ii8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a01hcE1lbW9yeSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtVbm1hcE1lbW9yeSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJNZW1vcnkgbWFuYWdlbWVudCBBUEkgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtCaW5kQnVmZmVyTWVtb3J5Ii8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0JpbmRJbWFnZU1lbW9yeSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJTcGFyc2UgcmVzb3VyY2UgbWVtb3J5IG1hbmFnZW1lbnQgQVBJIGNvbW1hbmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUXVldWVCaW5kU3BhcnNlIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iRmVuY2UgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVGZW5jZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95RmVuY2UiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUmVzZXRGZW5jZXMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RmVuY2VTdGF0dXMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrV2FpdEZvckZlbmNlcyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlF1ZXVlIHNlbWFwaG9yZSBjb21tYW5kcyI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZVNlbWFwaG9yZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95U2VtYXBob3JlIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iRXZlbnQgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVFdmVudCIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95RXZlbnQiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RXZlbnRTdGF0dXMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrU2V0RXZlbnQiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUmVzZXRFdmVudCIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlF1ZXJ5IGNvbW1hbmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlUXVlcnlQb29sIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lRdWVyeVBvb2wiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UXVlcnlQb29sUmVzdWx0cyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IkJ1ZmZlciBjb21tYW5kcyI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZUJ1ZmZlciIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95QnVmZmVyIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iQnVmZmVyIHZpZXcgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVCdWZmZXJWaWV3Ii8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lCdWZmZXJWaWV3Ii8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iSW1hZ2UgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVJbWFnZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95SW1hZ2UiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IkltYWdlIHZpZXcgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVJbWFnZVZpZXciLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveUltYWdlVmlldyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlNoYWRlciBjb21tYW5kcyI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95U2hhZGVyTW9kdWxlIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUGlwZWxpbmUgQ2FjaGUgY29tbWFuZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVQaXBlbGluZUNhY2hlIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBpcGVsaW5lQ2FjaGVEYXRhIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a01lcmdlUGlwZWxpbmVDYWNoZXMiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQaXBlbGluZSBjb21tYW5kcyI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveVBpcGVsaW5lIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUGlwZWxpbmUgbGF5b3V0IGNvbW1hbmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveVBpcGVsaW5lTGF5b3V0Ii8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iU2FtcGxlciBjb21tYW5kcyI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZVNhbXBsZXIiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveVNhbXBsZXIiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJEZXNjcmlwdG9yIHNldCBjb21tYW5kcyI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveURlc2NyaXB0b3JQb29sIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1Jlc2V0RGVzY3JpcHRvclBvb2wiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtGcmVlRGVzY3JpcHRvclNldHMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrVXBkYXRlRGVzY3JpcHRvclNldHMiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQYXNzIGNvbW1hbmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlRnJhbWVidWZmZXIiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveUZyYW1lYnVmZmVyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZVJlbmRlclBhc3MiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveVJlbmRlclBhc3MiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5Ii8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iQ29tbWFuZCBwb29sIGNvbW1hbmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlQ29tbWFuZFBvb2wiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveUNvbW1hbmRQb29sIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1Jlc2V0Q29tbWFuZFBvb2wiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJDb21tYW5kIGJ1ZmZlciBjb21tYW5kcyI+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRnJlZUNvbW1hbmRCdWZmZXJzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0JlZ2luQ29tbWFuZEJ1ZmZlciIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtFbmRDb21tYW5kQnVmZmVyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1Jlc2V0Q29tbWFuZEJ1ZmZlciIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IkNvbW1hbmQgYnVmZmVyIGJ1aWxkaW5nIGNvbW1hbmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQmluZFBpcGVsaW5lIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFNldFZpZXdwb3J0Ii8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFNldFNjaXNzb3IiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0TGluZVdpZHRoIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFNldERlcHRoQmlhcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXRCbGVuZENvbnN0YW50cyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXREZXB0aEJvdW5kcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2siLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZEJpbmREZXNjcmlwdG9yU2V0cyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRCaW5kSW5kZXhCdWZmZXIiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRHJhdyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREcmF3SW5kZXhlZCIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREcmF3SW5kaXJlY3QiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREaXNwYXRjaCIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREaXNwYXRjaEluZGlyZWN0Ii8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZENvcHlCdWZmZXIiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQ29weUltYWdlIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZEJsaXRJbWFnZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRDb3B5QnVmZmVyVG9JbWFnZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRVcGRhdGVCdWZmZXIiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRmlsbEJ1ZmZlciIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRDbGVhckNvbG9ySW1hZ2UiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRDbGVhckF0dGFjaG1lbnRzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFJlc29sdmVJbWFnZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXRFdmVudCIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRSZXNldEV2ZW50Ii8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFdhaXRFdmVudHMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kUGlwZWxpbmVCYXJyaWVyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZEJlZ2luUXVlcnkiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRW5kUXVlcnkiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kUmVzZXRRdWVyeVBvb2wiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kV3JpdGVUaW1lc3RhbXAiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kUHVzaENvbnN0YW50cyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRCZWdpblJlbmRlclBhc3MiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kTmV4dFN1YnBhc3MiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRW5kUmVuZGVyUGFzcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRFeGVjdXRlQ29tbWFuZHMiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJUaGVzZSB0eXBlcyBhcmUgcGFydCBvZiB0aGUgQVBJIGFuZCBzaG91bGQgYWx3YXlzIGJlIGRlZmluZWQsIGV2ZW4gd2hlbiBubyBlbmFibGVkIGZlYXR1cmVzIHJlcXVpcmUgdGhlbS4iPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCdWZmZXJNZW1vcnlCYXJyaWVyIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RyYXdJbmRpcmVjdENvbW1hbmQiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1hZ2VNZW1vcnlCYXJyaWVyIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeUJhcnJpZXIiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrT2JqZWN0VHlwZSIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCYXNlT3V0U3RydWN0dXJlIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Jhc2VJblN0cnVjdHVyZSIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtWZW5kb3JJZCIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgPC9mZWF0dXJlPgorICAgIDxmZWF0dXJlIGFwaT0idnVsa2FuIiBuYW1lPSJWS19WRVJTSU9OXzFfMSIgbnVtYmVyPSIxLjEiIGNvbW1lbnQ9IlZ1bGthbiAxLjEgY29yZSBBUEkgaW50ZXJmYWNlIGRlZmluaXRpb25zLiI+CisgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVktfQVBJX1ZFUlNJT05fMV8xIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iRGV2aWNlIEluaXRpYWxpemF0aW9uIj4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfcmVsYXhlZF9ibG9ja19sYXlvdXQsIHdoaWNoIGhhcyBubyBBUEkiLz4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcywgd2hpY2ggaGFzIG5vIEFQSSIvPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJPcmlnaW5hbGx5IGJhc2VkIG9uIFZLX0tIUl9zdWJncm91cCAoZXh0ZW5zaW9uIDk0KSwgYnV0IHRoZSBhY3R1YWwgZW51bSBibG9jayB1c2VkIHdhcywgaW5jb3JyZWN0bHksIHRoYXQgb2YgZXh0ZW5zaW9uIDk1Ij4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI5NSIgIG9mZnNldD0iMCIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1BST1BFUlRJRVMiLz4KKyAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyIvPgorICAgICAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWa1N1Ymdyb3VwRmVhdHVyZUZsYWdzIi8+CisgICAgICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHMiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQcm9tb3RlZCBmcm9tIFZLX0tIUl9iaW5kX21lbW9yeTIiPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtCaW5kQnVmZmVyTWVtb3J5MiIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtCaW5kSW1hZ2VNZW1vcnkyIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMTU4IiBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMTU4IiBvZmZzZXQ9IjEiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTAiIGV4dGVuZHM9IlZrSW1hZ2VDcmVhdGVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX0FMSUFTX0JJVCIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfMTZiaXRfc3RvcmFnZSI+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iODQiICBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQcm9tb3RlZCBmcm9tIFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiI+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMTI4IiBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfUkVRVUlSRU1FTlRTIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMTI4IiBvZmZzZXQ9IjEiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfQUxMT0NBVEVfSU5GTyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfZGV2aWNlX2dyb3VwIj4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MSIgIG9mZnNldD0iMCIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk8iLz4KKyAgICAgICAgICAgIDxjb21tZW50Pm9mZnNldCAxIHJlc2VydmVkIGZvciB0aGUgb2xkIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPX0tIWCBlbnVtPC9jb21tZW50PgorICAgICAgICAgICAgPGNvbW1lbnQ+b2Zmc2V0IDIgcmVzZXJ2ZWQgZm9yIHRoZSBvbGQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GT19LSFggZW51bTwvY29tbWVudD4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MSIgIG9mZnNldD0iMyIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MSIgIG9mZnNldD0iNCIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MSIgIG9mZnNldD0iNSIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNjEiICBvZmZzZXQ9IjYiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9CSU5EX1NQQVJTRV9JTkZPIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlBbGxvY2F0ZUZsYWdzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8iLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8iLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXREZXZpY2VNYXNrIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZERpc3BhdGNoQmFzZSIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSIzIiAgZXh0ZW5kcz0iVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgICAgICBuYW1lPSJWS19QSVBFTElORV9DUkVBVEVfVklFV19JTkRFWF9GUk9NX0RFVklDRV9JTkRFWF9CSVQiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNCIgIGV4dGVuZHM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgICAgICAgICAgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX0RJU1BBVENIX0JBU0VfQklUIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1BJUEVMSU5FX0NSRUFURV9ESVNQQVRDSF9CQVNFIiBhbGlhcz0iVktfUElQRUxJTkVfQ1JFQVRFX0RJU1BBVENIX0JBU0VfQklUIi8+CisgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjIiICBleHRlbmRzPSJWa0RlcGVuZGVuY3lGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0RFUEVOREVOQ1lfREVWSUNFX0dST1VQX0JJVCIgY29tbWVudD0iRGVwZW5kZW5jeSBpcyBhY3Jvc3MgZGV2aWNlcyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlByb21vdGVkIGZyb20gVktfS0hSX2RldmljZV9ncm91cCArIFZLX0tIUl9iaW5kX21lbW9yeTIiPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjYxIiAgb2Zmc2V0PSIxMyIgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfREVWSUNFX0dST1VQX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MSIgIG9mZnNldD0iMTQiICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfREVWSUNFX0dST1VQX0lORk8iLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8iLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNiIgIGV4dGVuZHM9IlZrSW1hZ2VDcmVhdGVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVQiIGNvbW1lbnQ9IkFsbG93cyB1c2luZyBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzo6cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyB3aGVuIGJpbmRpbmcgbWVtb3J5IHRvIHRoZSBpbWFnZSIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlByb21vdGVkIGZyb20gVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbiI+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNzEiICBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNzEiICBvZmZzZXQ9IjEiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9IlZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRSIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8iLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgIGV4dGVuZHM9IlZrTWVtb3J5SGVhcEZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTUVNT1JZX0hFQVBfTVVMVElfSU5TVEFOQ0VfQklUIiBjb21tZW50PSJJZiBzZXQsIGhlYXAgYWxsb2NhdGlvbnMgYWxsb2NhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIGJ5IGRlZmF1bHQiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQcm9tb3RlZCBmcm9tIFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIiPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjE0NyIgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSIxNDciIG9mZnNldD0iMSIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSIxNDciIG9mZnNldD0iMiIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1BBUlNFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMTQ3IiBvZmZzZXQ9IjMiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjE0NyIgb2Zmc2V0PSI0IiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU18yIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeVJlcXVpcmVtZW50czIiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlByb21vdGVkIGZyb20gVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjYwIiAgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjYwIiAgb2Zmc2V0PSIxIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNjAiICBvZmZzZXQ9IjIiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0ZPUk1BVF9QUk9QRVJUSUVTXzIiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MCIgIG9mZnNldD0iMyIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjYwIiAgb2Zmc2V0PSI0IiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjYwIiAgb2Zmc2V0PSI1IiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNjAiICBvZmZzZXQ9IjYiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJPUEVSVElFU18yIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNjAiICBvZmZzZXQ9IjciICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNjAiICBvZmZzZXQ9IjgiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMiIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Zvcm1hdFByb3BlcnRpZXMyIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlRm9ybWF0UHJvcGVydGllczIiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlByb21vdGVkIGZyb20gVktfS0hSX21haW50ZW5hbmNlMSI+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1Jlc3VsdCIgICAgICAgIGV4dG51bWJlcj0iNzAiICBvZmZzZXQ9IjAiICBkaXI9Ii0iIG5hbWU9IlZLX0VSUk9SX09VVF9PRl9QT09MX01FTU9SWSIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxNCIgZXh0ZW5kcz0iVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUIiBjb21tZW50PSJGb3JtYXQgY2FuIGJlIHVzZWQgYXMgdGhlIHNvdXJjZSBpbWFnZSBvZiBpbWFnZSB0cmFuc2ZlciBjb21tYW5kcyIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxNSIgZXh0ZW5kcz0iVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUIiBjb21tZW50PSJGb3JtYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIGltYWdlIG9mIGltYWdlIHRyYW5zZmVyIGNvbW1hbmRzIi8+CisgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjUiICBleHRlbmRzPSJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVCIgY29tbWVudD0iVGhlIDNEIGltYWdlIGNhbiBiZSB2aWV3ZWQgYXMgYSAyRCBvciAyRCBhcnJheSBpbWFnZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtUcmltQ29tbWFuZFBvb2wiLz4KKyAgICAgICAgICAgIDxjb21tZW50PkFkZGl0aW9uYWwgZGVwZW5kZW50IHR5cGVzIC8gdG9rZW5zIGV4dGVuZGluZyBlbnVtZXJhbnRzLCBub3QgZXhwbGljaXRseSBtZW50aW9uZWQ8L2NvbW1lbnQ+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbW1hbmRQb29sVHJpbUZsYWdzIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfbWFpbnRlbmFuY2UyIj4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNyIgIGV4dGVuZHM9IlZrSW1hZ2VDcmVhdGVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVQiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iOCIgIGV4dGVuZHM9IlZrSW1hZ2VDcmVhdGVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX0VYVEVOREVEX1VTQUdFX0JJVCIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjExOCIgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUE9JTlRfQ0xJUFBJTkdfUFJPUEVSVElFUyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjExOCIgb2Zmc2V0PSIxIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19JTlBVVF9BVFRBQ0hNRU5UX0FTUEVDVF9DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjExOCIgb2Zmc2V0PSIyIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMTE4IiBvZmZzZXQ9IjMiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0ltYWdlTGF5b3V0IiAgIGV4dG51bWJlcj0iMTE4IiBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrSW1hZ2VMYXlvdXQiICAgZXh0bnVtYmVyPSIxMTgiIG9mZnNldD0iMSIgICAgICAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BvaW50Q2xpcHBpbmdCZWhhdmlvciIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1Rlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbiIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlByb21vdGVkIGZyb20gVktfS0hSX211bHRpdmlldyI+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNTQiICBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjU0IiAgb2Zmc2V0PSIxIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX0ZFQVRVUkVTIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNTQiICBvZmZzZXQ9IjIiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUFJPUEVSVElFUyIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxIiAgZXh0ZW5kcz0iVmtEZXBlbmRlbmN5RmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfdmFyaWFibGVfcG9pbnRlcnMiPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjEyMSIgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZBUklBQkxFX1BPSU5URVJfRkVBVFVSRVMiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJGZWF0dXJlcyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9Ik9yaWdpbmFsbHkgYmFzZWQgb24gVktfS0hSX3Byb3RlY3RlZF9tZW1vcnkgKGV4dGVuc2lvbiAxNDYpLCB3aGljaCB3YXMgbmV2ZXIgcHVibGlzaGVkOyB0aHVzIHRoZSBteXN0aWZ5aW5nIGxhcmdlIHZhbHVlPSBudW1iZXJzIGJlbG93LiBUaGVzZSBhcmUgbm90IGFsaWFzZWQgc2luY2UgdGhleSB3ZXJlbid0IGFjdHVhbGx5IHByb21vdGVkIGZyb20gYW4gZXh0ZW5zaW9uLiI+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMTQ2IiBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjE0NiIgb2Zmc2V0PSIxIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjE0NiIgb2Zmc2V0PSIyIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9QUk9QRVJUSUVTIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMTQ2IiBvZmZzZXQ9IjMiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9JTkZPXzIiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNCIgIGV4dGVuZHM9IlZrUXVldWVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfUVVFVUVfUFJPVEVDVEVEX0JJVCIgY29tbWVudD0iUXVldWVzIG1heSBzdXBwb3J0IHByb3RlY3RlZCBvcGVyYXRpb25zIi8+CisgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICBleHRlbmRzPSJWa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgIG5hbWU9IlZLX0RFVklDRV9RVUVVRV9DUkVBVEVfUFJPVEVDVEVEX0JJVCIgY29tbWVudD0iUXVldWUgaXMgYSBwcm90ZWN0ZWQtY2FwYWJsZSBkZXZpY2UgcXVldWUiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgIGV4dGVuZHM9IlZrTWVtb3J5UHJvcGVydHlGbGFnQml0cyIgICAgICAgICAgICAgICAgbmFtZT0iVktfTUVNT1JZX1BST1BFUlRZX1BST1RFQ1RFRF9CSVQiIGNvbW1lbnQ9Ik1lbW9yeSBpcyBwcm90ZWN0ZWQiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgIGV4dGVuZHM9IlZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQlVGRkVSX0NSRUFURV9QUk9URUNURURfQklUIiBjb21tZW50PSJCdWZmZXIgcmVxdWlyZXMgcHJvdGVjdGVkIG1lbW9yeSIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxMSIgZXh0ZW5kcz0iVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9DUkVBVEVfUFJPVEVDVEVEX0JJVCIgY29tbWVudD0iSW1hZ2UgcmVxdWlyZXMgcHJvdGVjdGVkIG1lbW9yeSIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyIiAgZXh0ZW5kcz0iVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgICBuYW1lPSJWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1BST1RFQ1RFRF9CSVQiIGNvbW1lbnQ9IkNvbW1hbmQgYnVmZmVycyBhbGxvY2F0ZWQgZnJvbSBwb29sIGFyZSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXJzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RldmljZVF1ZXVlSW5mbzIiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUHJvdGVjdGVkU3VibWl0SW5mbyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXREZXZpY2VRdWV1ZTIiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQcm9tb3RlZCBmcm9tIFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24iPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMSIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMiIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9QTEFORV9NRU1PUllfSU5GTyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIzIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9QTEFORV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iNCIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSI1IiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU1BR0VfRk9STUFUX1BST1BFUlRJRVMiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrT2JqZWN0VHlwZSIgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMCIgICAgICAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk0iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMSIgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0I4RzhSOEc4XzQyMl9VTk9STSIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIyIiAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STSIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIzIiAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIwX1VOT1JNIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjQiICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjUiICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjJfVU5PUk0iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iNiIgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80NDRfVU5PUk0iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iNyIgICAgICAgICAgbmFtZT0iVktfRk9STUFUX1IxMFg2X1VOT1JNX1BBQ0sxNiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSI4IiAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2Ii8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjkiICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2Ii8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjEwIiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIxMSIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTYiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMTIiICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIxMyIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMTQiICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIxNSIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMTYiICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIxNyIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2Ii8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjE4IiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTYiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMTkiICAgICAgICAgbmFtZT0iVktfRk9STUFUX1IxMlg0RzEyWDRCMTJYNEExMlg0X1VOT1JNXzRQQUNLMTYiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMjAiICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2Ii8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjIxIiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIyMiIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2Ii8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjIzIiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIyNCIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2Ii8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjI1IiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIyNiIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2Ii8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjI3IiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTZCMTZHMTZSMTZfNDIyX1VOT1JNIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjI4IiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjI5IiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgIGV4dG51bWJlcj0iMTU3IiBvZmZzZXQ9IjMwIiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjBfVU5PUk0iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMzEiICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjJfVU5PUk0iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMzIiICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STSIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICBleHRudW1iZXI9IjE1NyIgb2Zmc2V0PSIzMyIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STSIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSI0IiAgZXh0ZW5kcz0iVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgIGV4dGVuZHM9IlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUIi8+CisgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjYiICBleHRlbmRzPSJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVCIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSI5IiAgZXh0ZW5kcz0iVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9DUkVBVEVfRElTSk9JTlRfQklUIi8+CisgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE3IiBleHRlbmRzPSJWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX01JRFBPSU5UX0NIUk9NQV9TQU1QTEVTX0JJVCIgY29tbWVudD0iRm9ybWF0IGNhbiBoYXZlIG1pZHBvaW50IHJhdGhlciB0aGFuIGNvc2l0ZWQgY2hyb21hIHNhbXBsZXMiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTgiIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0xJTkVBUl9GSUxURVJfQklUIiBjb21tZW50PSJGb3JtYXQgY2FuIGJlIHVzZWQgd2l0aCBsaW5lYXIgZmlsdGVyaW5nIHdoaWxzdCBjb2xvciBjb252ZXJzaW9uIGlzIGVuYWJsZWQiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTkiIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX1NFUEFSQVRFX1JFQ09OU1RSVUNUSU9OX0ZJTFRFUl9CSVQiIGNvbW1lbnQ9IkZvcm1hdCBjYW4gaGF2ZSBkaWZmZXJlbnQgY2hyb21hLCBtaW4gYW5kIG1hZyBmaWx0ZXJzIi8+CisgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjIwIiBleHRlbmRzPSJWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfQklUIi8+CisgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjIxIiBleHRlbmRzPSJWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfRk9SQ0VBQkxFX0JJVCIvPgorICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyMiIgZXh0ZW5kcz0iVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9ESVNKT0lOVF9CSVQiIGNvbW1lbnQ9IkZvcm1hdCBzdXBwb3J0cyBkaXNqb2ludCBwbGFuZXMiLz4KKyAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjMiIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfQ09TSVRFRF9DSFJPTUFfU0FNUExFU19CSVQiIGNvbW1lbnQ9IkZvcm1hdCBjYW4gaGF2ZSBjb3NpdGVkIHJhdGhlciB0aGFuIG1pZHBvaW50IGNocm9tYSBzYW1wbGVzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLz4KKyAgICAgICAgICAgIDxjb21tZW50PkFkZGl0aW9uYWwgZGVwZW5kZW50IHR5cGVzIC8gdG9rZW5zIGV4dGVuZGluZyBlbnVtZXJhbnRzLCBub3QgZXhwbGljaXRseSBtZW50aW9uZWQ8L2NvbW1lbnQ+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24iLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJZY2JjclJhbmdlIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Nocm9tYUxvY2F0aW9uIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUiPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9Ijg2IiAgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtPYmplY3RUeXBlIiAgICBleHRudW1iZXI9Ijg2IiAgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFncyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5Ii8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8iLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQcm9tb3RlZCBmcm9tIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIj4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI3MiIgIG9mZnNldD0iMCIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNzIiICBvZmZzZXQ9IjEiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNzIiICBvZmZzZXQ9IjIiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GTyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjcyIiAgb2Zmc2V0PSIzIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjcyIiAgb2Zmc2V0PSI0IiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSURfUFJPUEVSVElFUyIvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iVktfTFVJRF9TSVpFIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5UHJvcGVydGllcyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlByb21vdGVkIGZyb20gVktfS0hSX2V4dGVybmFsX21lbW9yeSI+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNzMiICBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI3MyIgIG9mZnNldD0iMSIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPIi8+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNzMiICBvZmZzZXQ9IjIiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtSZXN1bHQiICAgICAgICBleHRudW1iZXI9IjczIiAgb2Zmc2V0PSIzIiAgZGlyPSItIiBuYW1lPSJWS19FUlJPUl9JTlZBTElEX0VYVEVSTkFMX0hBTkRMRSIvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8iLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQcm9tb3RlZCBmcm9tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMiPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjExMyIgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfRkVOQ0VfSU5GTyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjExMyIgb2Zmc2V0PSIxIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyIvPgorICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfZXh0ZXJuYWxfZmVuY2UiPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjExNCIgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRmVuY2VJbXBvcnRGbGFncyIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtGZW5jZUltcG9ydEZsYWdCaXRzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlByb21vdGVkIGZyb20gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZSI+CisgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNzgiICBvZmZzZXQ9IjAiICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2VtYXBob3JlSW1wb3J0RmxhZ3MiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDxyZXF1aXJlIGNvbW1lbnQ9IlByb21vdGVkIGZyb20gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMiPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9Ijc3IiAgb2Zmc2V0PSIwIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk8iLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI3NyIgIG9mZnNldD0iMSIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3MiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8iLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIi8+CisgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPHJlcXVpcmUgY29tbWVudD0iUHJvbW90ZWQgZnJvbSBWS19LSFJfbWFpbnRlbmFuY2UzIj4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSIxNjkiIG9mZnNldD0iMCIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUyIvPgorICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjE2OSIgb2Zmc2V0PSIxIiAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVCIvPgorICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMiLz4KKyAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiLz4KKyAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiLz4KKyAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8cmVxdWlyZSBjb21tZW50PSJQcm9tb3RlZCBmcm9tIFZLX0tIUl9zaGFkZXJfZHJhd19wYXJhbWV0ZXJzLCB3aXRoIGEgZmVhdHVyZSBzdXBwb3J0IHF1ZXJ5IGFkZGVkIj4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2NCIgIG9mZnNldD0iMCIgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVMiLz4KKyAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUl9GRUFUVVJFUyIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRFJBV19QQVJBTUVURVJTX0ZFQVRVUkVTIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlckZlYXR1cmVzIi8+CisgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyIvPgorICAgICAgICA8L3JlcXVpcmU+CisgICAgPC9mZWF0dXJlPgorCisKKyAgICA8ZXh0ZW5zaW9ucyBjb21tZW50PSJWdWxrYW4gZXh0ZW5zaW9uIGludGVyZmFjZSBkZWZpbml0aW9ucyI+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX3N1cmZhY2UiIG51bWJlcj0iMSIgdHlwZT0iaW5zdGFuY2UiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vLElhbiBFbGxpb3R0IEBpYW5lbGxpb3R0dXMiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyNSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfU1VSRkFDRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3N1cmZhY2UmcXVvdDsiICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrUmVzdWx0IiBkaXI9Ii0iICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVJST1JfU1VSRkFDRV9MT1NUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtSZXN1bHQiIGRpcj0iLSIgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FUlJPUl9OQVRJVkVfV0lORE9XX0lOX1VTRV9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrT2JqZWN0VHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFIiICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtTdXJmYWNlS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95U3VyZmFjZUtIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX3N3YXBjaGFpbiIgbnVtYmVyPSIyIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8sSWFuIEVsbGlvdHQgQGlhbmVsbGlvdHR1cyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjcwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9TV0FQQ0hBSU5fU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9zd2FwY2hhaW4mcXVvdDsiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa0ltYWdlTGF5b3V0IiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjMiIGV4dGVuZHM9IlZrUmVzdWx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1VCT1BUSU1BTF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjQiIGV4dGVuZHM9IlZrUmVzdWx0IiBkaXI9Ii0iICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVJST1JfT1VUX09GX0RBVEVfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa09iamVjdFR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFIiICAgICAgICAgICAgICBjb21tZW50PSJWa1N3YXBjaGFpbktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlU3dhcGNoYWluS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95U3dhcGNoYWluS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1F1ZXVlUHJlc2VudEtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICAgICAgPHJlcXVpcmUgZmVhdHVyZT0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgICAgIDxjb21tZW50PlRoaXMgZHVwbGljYXRlcyBkZWZpbml0aW9ucyBpbiBWS19LSFJfZGV2aWNlX2dyb3VwIGJlbG93PC9jb21tZW50PgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MSIgIG9mZnNldD0iNyIgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjYxIiAgb2Zmc2V0PSI4IiAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iNjEiICBvZmZzZXQ9IjkiICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfU1dBUENIQUlOX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBleHRudW1iZXI9IjYxIiAgb2Zmc2V0PSIxMCIgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfTkVYVF9JTUFHRV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MSIgIG9mZnNldD0iMTEiICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgZXh0bnVtYmVyPSI2MSIgIG9mZnNldD0iMTIiICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgZXh0ZW5kcz0iVmtTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUiIgICAgICAgICBuYW1lPSJWS19TV0FQQ0hBSU5fQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVRfS0hSIiBjb21tZW50PSJBbGxvdyBpbWFnZXMgd2l0aCBWS19JTUFHRV9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQWNxdWlyZU5leHRJbWFnZTJLSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEiIGV4dGVuZHM9IlZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFIiICAgICAgICAgbmFtZT0iVktfU1dBUENIQUlOX0NSRUFURV9QUk9URUNURURfQklUX0tIUiIgICAgIGNvbW1lbnQ9IlN3YXBjaGFpbiBpcyBwcm90ZWN0ZWQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2Rpc3BsYXkiIG51bWJlcj0iMyIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8sTm9yYmVydCBOb3BwZXIgQEZzbE5vcHBlciIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjIzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9ESVNQTEFZX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZGlzcGxheSZxdW90OyIgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRElTUExBWV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfQ1JFQVRFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrT2JqZWN0VHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfRElTUExBWV9LSFIiICAgICAgICAgICAgICAgY29tbWVudD0iVmtEaXNwbGF5S0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa09iamVjdFR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFIiICAgICAgICAgIGNvbW1lbnQ9IlZrRGlzcGxheU1vZGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ3NLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVEaXNwbGF5TW9kZUtIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9kaXNwbGF5X3N3YXBjaGFpbiIgbnVtYmVyPSI0IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfc3dhcGNoYWluLFZLX0tIUl9kaXNwbGF5IiBhdXRob3I9IktIUiIgY29udGFjdD0iSmFtZXMgSm9uZXMgQGN1YmFuaXNtbyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9ESVNQTEFZX1NXQVBDSEFJTl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2Rpc3BsYXlfc3dhcGNoYWluJnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0RJU1BMQVlfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJFU0VOVF9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtSZXN1bHQiIGRpcj0iLSIgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FUlJPUl9JTkNPTVBBVElCTEVfRElTUExBWV9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfeGxpYl9zdXJmYWNlIiBudW1iZXI9IjUiIHR5cGU9Imluc3RhbmNlIiByZXF1aXJlcz0iVktfS0hSX3N1cmZhY2UiIHBsYXRmb3JtPSJ4bGliIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyxJYW4gRWxsaW90dCBAaWFuZWxsaW90dHVzIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1hMSUJfU1VSRkFDRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3hsaWJfc3VyZmFjZSZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1hMSUJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9YTElCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtYbGliU3VyZmFjZUNyZWF0ZUZsYWdzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl94Y2Jfc3VyZmFjZSIgbnVtYmVyPSI2IiB0eXBlPSJpbnN0YW5jZSIgcmVxdWlyZXM9IlZLX0tIUl9zdXJmYWNlIiBwbGF0Zm9ybT0ieGNiIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyxJYW4gRWxsaW90dCBAaWFuZWxsaW90dHVzIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1hDQl9TVVJGQUNFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfeGNiX3N1cmZhY2UmcXVvdDsiICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfWENCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtYY2JTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVYY2JTdXJmYWNlS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX3dheWxhbmRfc3VyZmFjZSIgbnVtYmVyPSI3IiB0eXBlPSJpbnN0YW5jZSIgcmVxdWlyZXM9IlZLX0tIUl9zdXJmYWNlIiBwbGF0Zm9ybT0id2F5bGFuZCIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9Ikplc3NlIEhhbGwgQGNyaXRzZWMsSWFuIEVsbGlvdHQgQGlhbmVsbGlvdHR1cyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl93YXlsYW5kX3N1cmZhY2UmcXVvdDsiICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfV0FZTEFORF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrV2F5bGFuZFN1cmZhY2VDcmVhdGVGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPCEtLSBFeHRlbnNpb24gcGVybWFuZW50bHkgZGlzYWJsZWQuICBFeHRlbnNpb24gbnVtYmVyIHNob3VsZCBub3QgYmUgcmUtdXNlZCAtLT4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfbWlyX3N1cmZhY2UiIG51bWJlcj0iOCIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgYXV0aG9yPSJLSFIiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9NSVJfU1VSRkFDRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX21pcl9zdXJmYWNlJnF1b3Q7IiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX01JUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9hbmRyb2lkX3N1cmZhY2UiIG51bWJlcj0iOSIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgcGxhdGZvcm09ImFuZHJvaWQiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKZXNzZSBIYWxsIEBjcml0c2VjIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0FORFJPSURfU1VSRkFDRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2FuZHJvaWRfc3VyZmFjZSZxdW90OyIgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0FORFJPSURfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IkFOYXRpdmVXaW5kb3ciLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQW5kcm9pZFN1cmZhY2VDcmVhdGVGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfd2luMzJfc3VyZmFjZSIgbnVtYmVyPSIxMCIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgcGxhdGZvcm09IndpbjMyIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyxJYW4gRWxsaW90dCBAaWFuZWxsaW90dHVzIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iNiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1dJTjMyX1NVUkZBQ0VfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl93aW4zMl9zdXJmYWNlJnF1b3Q7IiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9XSU4zMl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtXaW4zMlN1cmZhY2VDcmVhdGVGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTkRST0lEX25hdGl2ZV9idWZmZXIiIG51bWJlcj0iMTEiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJBTkRST0lEIiBwbGF0Zm9ybT0iYW5kcm9pZCIgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8Y29tbWVudD5WS19BTkRST0lEX25hdGl2ZV9idWZmZXIgaXMgdXNlZCBiZXR3ZWVuIHRoZSBBbmRyb2lkIFZ1bGthbiBsb2FkZXIgYW5kIGRyaXZlcnMgdG8gaW1wbGVtZW50IHRoZSBXU0kgZXh0ZW5zaW9ucy4gSXQgaXNuJ3QgZXhwb3NlZCB0byBhcHBsaWNhdGlvbnMgYW5kIHVzZXMgdHlwZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiBBbmRyb2lkJ3Mgc3RhYmxlIHB1YmxpYyBBUEksIHNvIGl0IGlzIGxlZnQgZGlzYWJsZWQgdG8ga2VlcCBpdCBvdXQgb2YgdGhlIHN0YW5kYXJkIFZ1bGthbiBoZWFkZXJzLjwvY29tbWVudD4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iOCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU5EUk9JRF9OQVRJVkVfQlVGRkVSX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTkRST0lEX05BVElWRV9CVUZGRVJfTlVNQkVSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FORFJPSURfbmF0aXZlX2J1ZmZlciZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0FORFJPSURfTkFUSVZFX0JVRkZFUl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX05BVElWRV9CVUZGRVJfQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fSU1BR0VfQ1JFQVRFX0lORk9fQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJFU0VOVEFUSU9OX1BST1BFUlRJRVNfQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTmF0aXZlQnVmZmVyQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3dhcGNoYWluSW1hZ2VDcmVhdGVJbmZvQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQcmVzZW50YXRpb25Qcm9wZXJ0aWVzQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTmF0aXZlQnVmZmVyVXNhZ2UyQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3dhcGNoYWluSW1hZ2VVc2FnZUZsYWdCaXRzQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3dhcGNoYWluSW1hZ2VVc2FnZUZsYWdzQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0U3dhcGNoYWluR3JhbGxvY1VzYWdlQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQWNxdWlyZUltYWdlQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUXVldWVTaWduYWxSZWxlYXNlSW1hZ2VBTkRST0lEIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRTd2FwY2hhaW5HcmFsbG9jVXNhZ2UyQU5EUk9JRCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZGVidWdfcmVwb3J0IiBudW1iZXI9IjEyIiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJHT09HTEUiIGNvbnRhY3Q9IkNvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgQGNvdXJ0bmV5LWciIHN1cHBvcnRlZD0idnVsa2FuIiBkZXByZWNhdGVkYnk9IlZLX0VYVF9kZWJ1Z191dGlscyI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iOSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0RFQlVHX1JFUE9SVF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2RlYnVnX3JlcG9ydCZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0RFQlVHX1JFUE9SVF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19DUkVBVEVfSU5GT19FWFQiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfUkVQT1JUX0NSRUFURV9JTkZPX0VYVCIgY29tbWVudD0iQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMgY29udGFpbmluZyBhIHR5cG8iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrUmVzdWx0IiBkaXI9Ii0iICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa09iamVjdFR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFQiICAgICAgICAgIGNvbW1lbnQ9IlZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICAgICAgPHJlcXVpcmUgZmVhdHVyZT0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgICAgIDxjb21tZW50PlRoaXMgZHVwbGljYXRlcyBkZWZpbml0aW9ucyBpbiBvdGhlciBleHRlbnNpb25zLCBiZWxvdzwvY29tbWVudD4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCIgZXh0bnVtYmVyPSIxNTciIG9mZnNldD0iMCIgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQiIGV4dG51bWJlcj0iODYiICBvZmZzZXQ9IjAiICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2dsc2xfc2hhZGVyIiBudW1iZXI9IjEzIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9InZ1bGthbiIgZGVwcmVjYXRlZGJ5PSIiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0dMU0xfU0hBREVSX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9nbHNsX3NoYWRlciZxdW90OyIgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9HTFNMX1NIQURFUl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtSZXN1bHQiIGRpcj0iLSIgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FUlJPUl9JTlZBTElEX1NIQURFUl9OViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkIiB0eXBlPSJkZXZpY2UiIG51bWJlcj0iMTQiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0RFUFRIX1JBTkdFX1VOUkVTVFJJQ1RFRF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCZxdW90OyIgICAgICAgbmFtZT0iVktfRVhUX0RFUFRIX1JBTkdFX1VOUkVTVFJJQ1RFRF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfc2FtcGxlcl9taXJyb3JfY2xhbXBfdG9fZWRnZSIgdHlwZT0iZGV2aWNlIiBudW1iZXI9IjE1IiBhdXRob3I9IktIUiIgY29udGFjdD0iVG9iaWFzIEhlY3RvciBAdG9ic2tpIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1NBTVBMRVJfTUlSUk9SX0NMQU1QX1RPX0VER0VfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9zYW1wbGVyX21pcnJvcl9jbGFtcF90b19lZGdlJnF1b3Q7IiAgIG5hbWU9IlZLX0tIUl9TQU1QTEVSX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjQiIGV4dGVuZHM9IlZrU2FtcGxlckFkZHJlc3NNb2RlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFIiBjb21tZW50PSJOb3RlIHRoYXQgdGhpcyBkZWZpbmVzIHdoYXQgd2FzIHByZXZpb3VzbHkgYSBjb3JlIGVudW0sIGFuZCBzbyB1c2VzIHRoZSAndmFsdWUnIGF0dHJpYnV0ZSByYXRoZXIgdGhhbiAnb2Zmc2V0JywgYW5kIGRvZXMgbm90IGhhdmUgYSBzdWZmaXguIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UsIGFuZCBzaG91bGQgbm90IGJlIHJlcGVhdGVkIi8+CisgICAgICAgICAgICAgICAgPGVudW0gICAgICAgICAgIGV4dGVuZHM9IlZrU2FtcGxlckFkZHJlc3NNb2RlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFX0tIUiIgYWxpYXM9IlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFIiBjb21tZW50PSJBbGlhcyBpbnRyb2R1Y2VkIGZvciBjb25zaXN0ZW5jeSB3aXRoIGV4dGVuc2lvbiBzdWZmaXhpbmcgcnVsZXMiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfSU1HX2ZpbHRlcl9jdWJpYyIgbnVtYmVyPSIxNiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IklNRyIgY29udGFjdD0iVG9iaWFzIEhlY3RvciBAdG9ic2tpIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1HX0ZJTFRFUl9DVUJJQ19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfSU1HX2ZpbHRlcl9jdWJpYyZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1HX0ZJTFRFUl9DVUJJQ19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtGaWx0ZXIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GSUxURVJfQ1VCSUNfSU1HIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxMyIgZXh0ZW5kcz0iVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMiICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9JTUciIGNvbW1lbnQ9IkZvcm1hdCBjYW4gYmUgZmlsdGVyZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfSU1HIHdoZW4gYmVpbmcgc2FtcGxlZCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzE3IiBudW1iZXI9IjE3IiBhdXRob3I9IkFNRCIgY29udGFjdD0iRGFuaWVsIFJha29zIEBkcmFrb3MtYW1kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzE3X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzE3JnF1b3Q7IiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzE3X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMTgiIG51bWJlcj0iMTgiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMThfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fMTgmcXVvdDsiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMThfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX3Jhc3Rlcml6YXRpb25fb3JkZXIiIG51bWJlcj0iMTkiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IkRhbmllbCBSYWtvcyBAZHJha29zLWFtZCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9SQVNURVJJWkFUSU9OX09SREVSX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfcmFzdGVyaXphdGlvbl9vcmRlciZxdW90OyIgICAgICAgICAgICBuYW1lPSJWS19BTURfUkFTVEVSSVpBVElPTl9PUkRFUl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1JBU1RFUklaQVRJT05fT1JERVJfQU1EIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtSYXN0ZXJpemF0aW9uT3JkZXJBTUQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMjAiIG51bWJlcj0iMjAiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMjBfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fMjAmcXVvdDsiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMjBfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX3NoYWRlcl90cmluYXJ5X21pbm1heCIgbnVtYmVyPSIyMSIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFNRCIgY29udGFjdD0iUXVuIExpbiBAbGlucXVuIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX1NIQURFUl9UUklOQVJZX01JTk1BWF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX3NoYWRlcl90cmluYXJ5X21pbm1heCZxdW90OyIgICAgICAgICAgbmFtZT0iVktfQU1EX1NIQURFUl9UUklOQVJZX01JTk1BWF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfc2hhZGVyX2V4cGxpY2l0X3ZlcnRleF9wYXJhbWV0ZXIiIG51bWJlcj0iMjIiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IlF1biBMaW4gQGxpbnF1biIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9TSEFERVJfRVhQTElDSVRfVkVSVEVYX1BBUkFNRVRFUl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX3NoYWRlcl9leHBsaWNpdF92ZXJ0ZXhfcGFyYW1ldGVyJnF1b3Q7IiBuYW1lPSJWS19BTURfU0hBREVSX0VYUExJQ0lUX1ZFUlRFWF9QQVJBTUVURVJfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2RlYnVnX21hcmtlciIgbnVtYmVyPSIyMyIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfRVhUX2RlYnVnX3JlcG9ydCIgYXV0aG9yPSJCYWxkdXIgS2FybHNzb24iIGNvbnRhY3Q9IkJhbGR1ciBLYXJsc3NvbiBAYmFsZHVyayIgc3VwcG9ydGVkPSJ2dWxrYW4iIHByb21vdGVkdG89IlZLX0VYVF9kZWJ1Z191dGlscyI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0RFQlVHX01BUktFUl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2RlYnVnX21hcmtlciZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0RFQlVHX01BUktFUl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX05BTUVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9UQUdfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX01BUktFUl9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRGVidWdNYXJrZXJFbmRFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMjQiIG51bWJlcj0iMjQiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzI0X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzI0JnF1b3Q7IiAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl8yNF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNiIgZXh0ZW5kcz0iVmtRdWV1ZUZsYWdCaXRzIiAgICAgICAgICAgICAgbmFtZT0iVktfUVVFVUVfUkVTRVJWRURfNl9CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyNyIgZXh0ZW5kcz0iVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiICAgICBuYW1lPSJWS19QSVBFTElORV9TVEFHRV9SRVNFUlZFRF8yN19CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIzMCIgZXh0ZW5kcz0iVmtBY2Nlc3NGbGFnQml0cyIgICAgICAgICAgICBuYW1lPSJWS19BQ0NFU1NfUkVTRVJWRURfMzBfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMzEiIGV4dGVuZHM9IlZrQWNjZXNzRmxhZ0JpdHMiICAgICAgICAgICAgbmFtZT0iVktfQUNDRVNTX1JFU0VSVkVEXzMxX0JJVF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE1IiBleHRlbmRzPSJWa0J1ZmZlclVzYWdlRmxhZ0JpdHMiICAgICAgIG5hbWU9IlZLX0JVRkZFUl9VU0FHRV9SRVNFUlZFRF8xNV9CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxNiIgZXh0ZW5kcz0iVmtCdWZmZXJVc2FnZUZsYWdCaXRzIiAgICAgICBuYW1lPSJWS19CVUZGRVJfVVNBR0VfUkVTRVJWRURfMTZfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTMiIGV4dGVuZHM9IlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfSU1BR0VfVVNBR0VfUkVTRVJWRURfMTNfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTQiIGV4dGVuZHM9IlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfSU1BR0VfVVNBR0VfUkVTRVJWRURfMTRfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTUiIGV4dGVuZHM9IlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfSU1BR0VfVVNBR0VfUkVTRVJWRURfMTVfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjciIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfUkVTRVJWRURfMjdfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjgiIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfUkVTRVJWRURfMjhfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iOCIgZXh0ZW5kcz0iVmtRdWVyeVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfUVVFUllfVFlQRV9SRVNFUlZFRF84Ii8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMjUiIG51bWJlcj0iMjUiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzI1X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzI1JnF1b3Q7IiAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl8yNV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgZXh0ZW5kcz0iVmtRdWV1ZUZsYWdCaXRzIiAgICAgICAgICAgICAgbmFtZT0iVktfUVVFVUVfUkVTRVJWRURfNV9CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyNiIgZXh0ZW5kcz0iVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiICAgICBuYW1lPSJWS19QSVBFTElORV9TVEFHRV9SRVNFUlZFRF8yNl9CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyOCIgZXh0ZW5kcz0iVmtBY2Nlc3NGbGFnQml0cyIgICAgICAgICAgICBuYW1lPSJWS19BQ0NFU1NfUkVTRVJWRURfMjhfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjkiIGV4dGVuZHM9IlZrQWNjZXNzRmxhZ0JpdHMiICAgICAgICAgICAgbmFtZT0iVktfQUNDRVNTX1JFU0VSVkVEXzI5X0JJVF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEzIiBleHRlbmRzPSJWa0J1ZmZlclVzYWdlRmxhZ0JpdHMiICAgICAgIG5hbWU9IlZLX0JVRkZFUl9VU0FHRV9SRVNFUlZFRF8xM19CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxNCIgZXh0ZW5kcz0iVmtCdWZmZXJVc2FnZUZsYWdCaXRzIiAgICAgICBuYW1lPSJWS19CVUZGRVJfVVNBR0VfUkVTRVJWRURfMTRfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTAiIGV4dGVuZHM9IlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfSU1BR0VfVVNBR0VfUkVTRVJWRURfMTBfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTEiIGV4dGVuZHM9IlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfSU1BR0VfVVNBR0VfUkVTRVJWRURfMTFfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTIiIGV4dGVuZHM9IlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfSU1BR0VfVVNBR0VfUkVTRVJWRURfMTJfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjUiIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfUkVTRVJWRURfMjVfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjYiIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfUkVTRVJWRURfMjZfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNCIgIGV4dGVuZHM9IlZrUXVlcnlUeXBlIiAgICAgICAgICAgICAgICAgbmFtZT0iVktfUVVFUllfVFlQRV9SRVNFUlZFRF80Ii8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9nY25fc2hhZGVyIiBudW1iZXI9IjI2IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEb21pbmlrIFdpdGN6YWsgQGRvbWluaWt3aXRjemFrYW1kIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0dDTl9TSEFERVJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9nY25fc2hhZGVyJnF1b3Q7IiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9HQ05fU0hBREVSX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uIiBudW1iZXI9IjI3IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgc3VwcG9ydGVkPSJ2dWxrYW4iIGRlcHJlY2F0ZWRieT0iVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24mcXVvdDsiICAgICAgICAgICAgbmFtZT0iVktfTlZfREVESUNBVEVEX0FMTE9DQVRJT05fRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQ1JFQVRFX0lORk9fTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fQlVGRkVSX0NSRUFURV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX01FTU9SWV9BTExPQ0FURV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZXh0ZW5zaW9uXzI4IiBudW1iZXI9IjI4IiBhdXRob3I9Ik5WIiBjb250YWN0PSJQaWVycyBEYW5pZWxsIEBwZGFuaWVsbC1udiIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yOF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZW5zaW9uXzI4JnF1b3Q7IiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yOF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrIiBudW1iZXI9IjI5IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9InZ1bGthbiIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfVFJBTlNGT1JNX0ZFRURCQUNLX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrJnF1b3Q7IiAgICAgICAgICAgICBuYW1lPSJWS19FWFRfVFJBTlNGT1JNX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUIi8+CisKKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19QUk9QRVJUSUVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1NUUkVBTV9DUkVBVEVfSU5GT19FWFQiLz4KKworICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNCIgZXh0ZW5kcz0iVmtRdWVyeVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUIi8+CisKKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjExIiBleHRlbmRzPSJWa0J1ZmZlclVzYWdlRmxhZ0JpdHMiICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX0JJVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEyIiBleHRlbmRzPSJWa0J1ZmZlclVzYWdlRmxhZ0JpdHMiICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9CVUZGRVJfQklUX0VYVCIvPgorCisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyNSIgZXh0ZW5kcz0iVmtBY2Nlc3NGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfV1JJVEVfQklUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjYiIGV4dGVuZHM9IlZrQWNjZXNzRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BQ0NFU1NfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfUkVBRF9CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyNyIgZXh0ZW5kcz0iVmtBY2Nlc3NGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9XUklURV9CSVRfRVhUIi8+CisKKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjI0IiBleHRlbmRzPSJWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyIgICAgICAgICAgICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0JJVF9FWFQiLz4KKworICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIi8+CisKKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlRmxhZ3NFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZYX2V4dGVuc2lvbl8zMCIgbnVtYmVyPSIzMCIgYXV0aG9yPSJOVlgiIGNvbnRhY3Q9IkplZmYgSnVsaWFubyBAamp1bGlhbm9hdG52IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVlhfRVhURU5TSU9OXzMwX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVlhfZXh0ZW5zaW9uXzMwJnF1b3Q7IiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVlhfRVhURU5TSU9OXzMwX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WWF9pbWFnZV92aWV3X2hhbmRsZSIgbnVtYmVyPSIzMSIgdHlwZT0iZGV2aWNlIiBhdXRob3I9Ik5WWCIgY29udGFjdD0iRXJpYyBXZXJuZXNzIEBld2VybmVzcyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WWF9JTUFHRV9WSUVXX0hBTkRMRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZYX2ltYWdlX3ZpZXdfaGFuZGxlJnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfTlZYX0lNQUdFX1ZJRVdfSEFORExFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfSEFORExFX0lORk9fTlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX2V4dGVuc2lvbl8zMiIgbnVtYmVyPSIzMiIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IkRhbmllbCBSYWtvcyBAZHJha29zLWFtZCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl8zMl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8zMiZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl8zMl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzMzIiBudW1iZXI9IjMzIiBhdXRob3I9IkFNRCIgY29udGFjdD0iRGFuaWVsIFJha29zIEBkcmFrb3MtYW1kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzMzX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzMzJnF1b3Q7IiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzMzX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9kcmF3X2luZGlyZWN0X2NvdW50IiBudW1iZXI9IjM0IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0RSQVdfSU5ESVJFQ1RfQ09VTlRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9kcmF3X2luZGlyZWN0X2NvdW50JnF1b3Q7IiAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9EUkFXX0lORElSRUNUX0NPVU5UX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMzUiIG51bWJlcj0iMzUiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMzVfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fMzUmcXVvdDsiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMzVfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX25lZ2F0aXZlX3ZpZXdwb3J0X2hlaWdodCIgbnVtYmVyPSIzNiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFNRCIgY29udGFjdD0iTWF0dGhhZXVzIEcuIENoYWpkYXMgQGFudGVydSIgc3VwcG9ydGVkPSJ2dWxrYW4iIG9ic29sZXRlZGJ5PSJWS19LSFJfbWFpbnRlbmFuY2UxIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfTkVHQVRJVkVfVklFV1BPUlRfSEVJR0hUX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0JnF1b3Q7IiAgICAgICBuYW1lPSJWS19BTURfTkVHQVRJVkVfVklFV1BPUlRfSEVJR0hUX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9ncHVfc2hhZGVyX2hhbGZfZmxvYXQiIG51bWJlcj0iMzciIHR5cGU9ImRldmljZSIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IkRvbWluaWsgV2l0Y3phayBAZG9taW5pa3dpdGN6YWthbWQiIHN1cHBvcnRlZD0idnVsa2FuIiBkZXByZWNhdGVkYnk9IlZLX0tIUl9zaGFkZXJfZmxvYXQxNl9pbnQ4Ij4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfR1BVX1NIQURFUl9IQUxGX0ZMT0FUX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZ3B1X3NoYWRlcl9oYWxmX2Zsb2F0JnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19BTURfR1BVX1NIQURFUl9IQUxGX0ZMT0FUX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9zaGFkZXJfYmFsbG90IiBudW1iZXI9IjM4IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEb21pbmlrIFdpdGN6YWsgQGRvbWluaWt3aXRjemFrYW1kIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX1NIQURFUl9CQUxMT1RfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9zaGFkZXJfYmFsbG90JnF1b3Q7IiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9TSEFERVJfQkFMTE9UX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMzkiIG51bWJlcj0iMzkiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMzlfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fMzkmcXVvdDsiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMzlfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX2V4dGVuc2lvbl80MCIgbnVtYmVyPSI0MCIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IkRhbmllbCBSYWtvcyBAZHJha29zLWFtZCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl80MF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl80MCZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl80MF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzQxIiBudW1iZXI9IjQxIiBhdXRob3I9IkFNRCIgY29udGFjdD0iRGFuaWVsIFJha29zIEBkcmFrb3MtYW1kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzQxX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzQxJnF1b3Q7IiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzQxX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF90ZXh0dXJlX2dhdGhlcl9iaWFzX2xvZCIgbnVtYmVyPSI0MiIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IlJleCBYdSBAYW1kcmV4dSIgc3VwcG9ydGVkPSJ2dWxrYW4iIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfVEVYVFVSRV9HQVRIRVJfQklBU19MT0RfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF90ZXh0dXJlX2dhdGhlcl9iaWFzX2xvZCZxdW90OyIgICAgICAgIG5hbWU9IlZLX0FNRF9URVhUVVJFX0dBVEhFUl9CSUFTX0xPRF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9URVhUVVJFX0xPRF9HQVRIRVJfRk9STUFUX1BST1BFUlRJRVNfQU1EIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfc2hhZGVyX2luZm8iIG51bWJlcj0iNDMiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJKYWFra28gS29udHRpbmVuIEBqYWFra29hbWQiIHN1cHBvcnRlZD0idnVsa2FuIiB0eXBlPSJkZXZpY2UiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9TSEFERVJfSU5GT19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX3NoYWRlcl9pbmZvJnF1b3Q7IiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX1NIQURFUl9JTkZPX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTaGFkZXJJbmZvVHlwZUFNRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2hhZGVyUmVzb3VyY2VVc2FnZUFNRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2hhZGVyU3RhdGlzdGljc0luZm9BTUQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFNoYWRlckluZm9BTUQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX2V4dGVuc2lvbl80NCIgbnVtYmVyPSI0NCIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IkRhbmllbCBSYWtvcyBAZHJha29zLWFtZCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl80NF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl80NCZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl80NF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzQ1IiBudW1iZXI9IjQ1IiBhdXRob3I9IkFNRCIgY29udGFjdD0iRGFuaWVsIFJha29zIEBkcmFrb3MtYW1kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzQ1X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzQ1JnF1b3Q7IiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzQ1X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fNDYiIG51bWJlcj0iNDYiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fNDZfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fNDYmcXVvdDsiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fNDZfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2xvZCIgbnVtYmVyPSI0NyIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IkRvbWluaWsgV2l0Y3phayBAZG9taW5pa3dpdGN6YWthbWQiIHN1cHBvcnRlZD0idnVsa2FuIiB0eXBlPSJkZXZpY2UiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9TSEFERVJfSU1BR0VfTE9BRF9TVE9SRV9MT0RfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9sb2QmcXVvdDsiICAgIG5hbWU9IlZLX0FNRF9TSEFERVJfSU1BR0VfTE9BRF9TVE9SRV9MT0RfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZYX2V4dGVuc2lvbl80OCIgbnVtYmVyPSI0OCIgYXV0aG9yPSJOVlgiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8iIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WWF9FWFRFTlNJT05fNDhfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WWF9leHRlbnNpb25fNDgmcXVvdDsiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WWF9FWFRFTlNJT05fNDhfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfR09PR0xFX2V4dGVuc2lvbl80OSIgbnVtYmVyPSI0OSIgYXV0aG9yPSJHT09HTEUiIGNvbnRhY3Q9IkplYW4tRnJhbmNvaXMgUm95IEBqZnJveSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfR09PR0xFX0VYVEVOU0lPTl80OV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfR09PR0xFX2V4dGVuc2lvbl80OSZxdW90OyIgICAgICAgICAgICAgICAgbmFtZT0iVktfR09PR0xFX0VYVEVOU0lPTl80OV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19HR1Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSIgbnVtYmVyPSI1MCIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgcGxhdGZvcm09ImdncCIgYXV0aG9yPSJHR1AiIGNvbnRhY3Q9IkplYW4tRnJhbmNvaXMgUm95IEBqZnJveSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0dHUF9TVFJFQU1fREVTQ1JJUFRPUl9TVVJGQUNFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19HR1Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSZxdW90OyIgICAgICBuYW1lPSJWS19HR1BfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TVFJFQU1fREVTQ1JJUFRPUl9TVVJGQUNFX0NSRUFURV9JTkZPX0dHUCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVGbGFnc0dHUCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9jb3JuZXJfc2FtcGxlZF9pbWFnZSIgbnVtYmVyPSI1MSIgYXV0aG9yPSJOViIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9DT1JORVJfU0FNUExFRF9JTUFHRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UmcXVvdDsiICAgICAgICAgICAgbmFtZT0iVktfTlZfQ09STkVSX1NBTVBMRURfSU1BR0VfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEzIiBleHRlbmRzPSJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09STkVSX1NBTVBMRURfSU1BR0VfRkVBVFVSRVNfTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fNTIiIG51bWJlcj0iNTIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVOU0lPTl81Ml9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZW5zaW9uXzUyJnF1b3Q7IiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzUyX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIwIiBleHRlbmRzPSJWa1NoYWRlck1vZHVsZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgIG5hbWU9IlZLX1NIQURFUl9NT0RVTEVfQ1JFQVRFX1JFU0VSVkVEXzBfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyIiBleHRlbmRzPSJWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyIgIG5hbWU9IlZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfUkVTRVJWRURfMl9CSVRfTlYiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfZXh0ZW5zaW9uXzUzIiBudW1iZXI9IjUzIiBhdXRob3I9Ik5WIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVOU0lPTl81M19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZW5zaW9uXzUzJnF1b3Q7IiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzUzX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9tdWx0aXZpZXciIG51bWJlcj0iNTQiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgY29udGFjdD0iSmVmZiBCb2x6IEBqZWZmYm9sem52IiBzdXBwb3J0ZWQ9InZ1bGthbiIgcHJvbW90ZWR0bz0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9NVUxUSVZJRVdfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9tdWx0aXZpZXcmcXVvdDsiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9NVUxUSVZJRVdfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfTVVMVElWSUVXX0NSRUFURV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX0ZFQVRVUkVTX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVMiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QUk9QRVJUSUVTX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUFJPUEVSVElFUyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRGVwZW5kZW5jeUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUX0tIUiIgYWxpYXM9IlZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfSU1HX2Zvcm1hdF9wdnJ0YyIgbnVtYmVyPSI1NSIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IklNRyIgY29udGFjdD0iU3R1YXJ0IFNtaXRoIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1HX0ZPUk1BVF9QVlJUQ19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfSU1HX2Zvcm1hdF9wdnJ0YyZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1HX0ZPUk1BVF9QVlJUQ19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUFZSVEMxXzJCUFBfVU5PUk1fQkxPQ0tfSU1HIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9QVlJUQzFfNEJQUF9VTk9STV9CTE9DS19JTUciLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX1BWUlRDMl8yQlBQX1VOT1JNX0JMT0NLX0lNRyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUFZSVEMyXzRCUFBfVU5PUk1fQkxPQ0tfSU1HIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI0IiBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9QVlJUQzFfMkJQUF9TUkdCX0JMT0NLX0lNRyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNSIgZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUFZSVEMxXzRCUFBfU1JHQl9CTE9DS19JTUciLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjYiIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX1BWUlRDMl8yQlBQX1NSR0JfQkxPQ0tfSU1HIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI3IiBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9QVlJUQzJfNEJQUF9TUkdCX0JMT0NLX0lNRyIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIiBudW1iZXI9IjU2IiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJOViIgY29udGFjdD0iSmFtZXMgSm9uZXMgQGN1YmFuaXNtbyIgc3VwcG9ydGVkPSJ2dWxrYW4iIGRlcHJlY2F0ZWRieT0iVktfS0hSX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMmcXVvdDsiICAgIG5hbWU9IlZLX05WX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlcm5hbF9tZW1vcnkiIG51bWJlcj0iNTciIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8iIHN1cHBvcnRlZD0idnVsa2FuIiBkZXByZWNhdGVkYnk9IlZLX0tIUl9leHRlcm5hbF9tZW1vcnkiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVSTkFMX01FTU9SWV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZXJuYWxfbWVtb3J5JnF1b3Q7IiAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GT19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2V4dGVybmFsX21lbW9yeV93aW4zMiIgbnVtYmVyPSI1OCIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfTlZfZXh0ZXJuYWxfbWVtb3J5IiBhdXRob3I9Ik5WIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vIiBwbGF0Zm9ybT0id2luMzIiIHN1cHBvcnRlZD0idnVsa2FuIiBkZXByZWNhdGVkYnk9IlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVSTkFMX01FTU9SWV9XSU4zMl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyJnF1b3Q7IiAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURVJOQUxfTUVNT1JZX1dJTjMyX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX3dpbjMyX2tleWVkX211dGV4IiBudW1iZXI9IjU5IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkNhcnN0ZW4gUm9oZGUgQGNyb2hkZSIgcGxhdGZvcm09IndpbjMyIiBzdXBwb3J0ZWQ9InZ1bGthbiIgcHJvbW90ZWR0bz0iVktfS0hSX3dpbjMyX2tleWVkX211dGV4Ij4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9XSU4zMl9LRVlFRF9NVVRFWF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfd2luMzJfa2V5ZWRfbXV0ZXgmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfV0lOMzJfS0VZRURfTVVURVhfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBudW1iZXI9IjYwIiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgc3VwcG9ydGVkPSJ2dWxrYW4iIHByb21vdGVkdG89IlZLX1ZFUlNJT05fMV8xIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyJnF1b3Q7IiBuYW1lPSJWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzJfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0ZPUk1BVF9QUk9QRVJUSUVTXzJfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzJfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUVVFVUVfRkFNSUxZX1BST1BFUlRJRVNfMl9LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJPUEVSVElFU18yX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJPUEVSVElFU18yIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMl9LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1BBUlNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtGb3JtYXRQcm9wZXJ0aWVzMktIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzJLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9kZXZpY2VfZ3JvdXAiIG51bWJlcj0iNjEiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIHJlcXVpcmVzPSJWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iNCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0RFVklDRV9HUk9VUF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2RldmljZV9ncm91cCZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0RFVklDRV9HUk9VUF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfRkxBR1NfSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfRkxBR1NfSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUkVOREVSX1BBU1NfQkVHSU5fSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUkVOREVSX1BBU1NfQkVHSU5fSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1VCTUlUX0lORk9fS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9CSU5EX1NQQVJTRV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9CSU5EX1NQQVJTRV9JTkZPIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9TUkNfQklUX0tIUiIgYWxpYXM9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9TUkNfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9EU1RfQklUX0tIUiIgYWxpYXM9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9EU1RfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklUX0tIUiIgYWxpYXM9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19EU1RfQklUX0tIUiIgYWxpYXM9IlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19EU1RfQklUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlBbGxvY2F0ZUZsYWdzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfTUFTS19CSVRfS0hSIiBhbGlhcz0iVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9NQVNLX0JJVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cFN1Ym1pdEluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXREZXZpY2VNYXNrS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREaXNwYXRjaEJhc2VLSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX1ZJRVdfSU5ERVhfRlJPTV9ERVZJQ0VfSU5ERVhfQklUX0tIUiIgYWxpYXM9IlZLX1BJUEVMSU5FX0NSRUFURV9WSUVXX0lOREVYX0ZST01fREVWSUNFX0lOREVYX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19QSVBFTElORV9DUkVBVEVfRElTUEFUQ0hfQkFTRV9LSFIiIGFsaWFzPSJWS19QSVBFTElORV9DUkVBVEVfRElTUEFUQ0hfQkFTRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRGVwZW5kZW5jeUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19ERVBFTkRFTkNZX0RFVklDRV9HUk9VUF9CSVRfS0hSIiBhbGlhcz0iVktfREVQRU5ERU5DWV9ERVZJQ0VfR1JPVVBfQklUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgICAgICA8cmVxdWlyZSBleHRlbnNpb249IlZLX0tIUl9iaW5kX21lbW9yeTIiPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfREVWSUNFX0dST1VQX0lORk9fS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVRfS0hSIiBhbGlhcz0iVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgICAgIDxyZXF1aXJlIGV4dGVuc2lvbj0iVktfS0hSX3N1cmZhY2UiPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICAgICAgPHJlcXVpcmUgZXh0ZW5zaW9uPSJWS19LSFJfc3dhcGNoYWluIj4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjgiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iOSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9TV0FQQ0hBSU5fSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9ORVhUX0lNQUdFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIwIiBleHRlbmRzPSJWa1N3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIiAgICAgICAgIG5hbWU9IlZLX1NXQVBDSEFJTl9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVF9LSFIiIGNvbW1lbnQ9IkFsbG93IGltYWdlcyB3aXRoIFZLX0lNQUdFX0NSRUFURV9TUExJVF9JTlNUQU5DRV9CSU5EX1JFR0lPTlNfQklUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF92YWxpZGF0aW9uX2ZsYWdzIiBudW1iZXI9IjYyIiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJHT09HTEUiIGNvbnRhY3Q9IlRvYmluIEVobGlzIEB0b2JpbmUiIHN1cHBvcnRlZD0idnVsa2FuIiBkZXByZWNhdGVkYnk9IlZLX0VYVF92YWxpZGF0aW9uX2ZlYXR1cmVzIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfVkFMSURBVElPTl9GTEFHU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX3ZhbGlkYXRpb25fZmxhZ3MmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX1ZBTElEQVRJT05fRkxBR1NfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GTEFHU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1ZhbGlkYXRpb25GbGFnc0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OTl92aV9zdXJmYWNlIiBudW1iZXI9IjYzIiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJOTiIgY29udGFjdD0iTWF0aGlhcyBIZXllciBnaXRsYWI6QG1oZXllciIgcmVxdWlyZXM9IlZLX0tIUl9zdXJmYWNlIiBwbGF0Zm9ybT0idmkiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OTl9WSV9TVVJGQUNFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OTl92aV9zdXJmYWNlJnF1b3Q7IiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OTl9WSV9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1ZJX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTk4iLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1ZpU3VyZmFjZUNyZWF0ZUZsYWdzTk4iLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlVmlTdXJmYWNlTk4iLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMiIG51bWJlcj0iNjQiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9zaGFkZXJfZHJhd19wYXJhbWV0ZXJzJnF1b3Q7IiAgICAgICAgIG5hbWU9IlZLX0tIUl9TSEFERVJfRFJBV19QQVJBTUVURVJTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfYmFsbG90IiBudW1iZXI9IjY1IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfU0hBREVSX1NVQkdST1VQX0JBTExPVF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX3NoYWRlcl9zdWJncm91cF9iYWxsb3QmcXVvdDsiICAgICAgICAgbmFtZT0iVktfRVhUX1NIQURFUl9TVUJHUk9VUF9CQUxMT1RfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX3NoYWRlcl9zdWJncm91cF92b3RlIiBudW1iZXI9IjY2IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfU0hBREVSX1NVQkdST1VQX1ZPVEVfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfdm90ZSZxdW90OyIgICAgICAgICAgIG5hbWU9IlZLX0VYVF9TSEFERVJfU1VCR1JPVVBfVk9URV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9hc3RjX2hkciIgbnVtYmVyPSI2NyIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFSTSIgY29udGFjdD0iSmFuLUhhcmFsZCBGcmVkcmlrc2VuIEBqYW5oYXJhbGRmcmVkcmlrc2VuLWFybSIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9hc3RjX2hkciZxdW90OyIgbmFtZT0iVktfRVhUX1RFWFRVUkVfQ09NUFJFU1NJT05fQVNUQ19IRFJfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX0ZFQVRVUkVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgZXh0bnVtYmVyPSI2NyIgb2Zmc2V0PSIwIiBuYW1lPSJWS19GT1JNQVRfQVNUQ180eDRfU0ZMT0FUX0JMT0NLX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiBleHRudW1iZXI9IjY3IiBvZmZzZXQ9IjEiIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzV4NF9TRkxPQVRfQkxPQ0tfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiIGV4dG51bWJlcj0iNjciIG9mZnNldD0iMiIgbmFtZT0iVktfRk9STUFUX0FTVENfNXg1X1NGTE9BVF9CTE9DS19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgZXh0bnVtYmVyPSI2NyIgb2Zmc2V0PSIzIiBuYW1lPSJWS19GT1JNQVRfQVNUQ182eDVfU0ZMT0FUX0JMT0NLX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiBleHRudW1iZXI9IjY3IiBvZmZzZXQ9IjQiIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzZ4Nl9TRkxPQVRfQkxPQ0tfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiIGV4dG51bWJlcj0iNjciIG9mZnNldD0iNSIgbmFtZT0iVktfRk9STUFUX0FTVENfOHg1X1NGTE9BVF9CTE9DS19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgZXh0bnVtYmVyPSI2NyIgb2Zmc2V0PSI2IiBuYW1lPSJWS19GT1JNQVRfQVNUQ184eDZfU0ZMT0FUX0JMT0NLX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiBleHRudW1iZXI9IjY3IiBvZmZzZXQ9IjciIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzh4OF9TRkxPQVRfQkxPQ0tfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiIGV4dG51bWJlcj0iNjciIG9mZnNldD0iOCIgbmFtZT0iVktfRk9STUFUX0FTVENfMTB4NV9TRkxPQVRfQkxPQ0tfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiIGV4dG51bWJlcj0iNjciIG9mZnNldD0iOSIgbmFtZT0iVktfRk9STUFUX0FTVENfMTB4Nl9TRkxPQVRfQkxPQ0tfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiIGV4dG51bWJlcj0iNjciIG9mZnNldD0iMTAiIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzEweDhfU0ZMT0FUX0JMT0NLX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiBleHRudW1iZXI9IjY3IiBvZmZzZXQ9IjExIiBuYW1lPSJWS19GT1JNQVRfQVNUQ18xMHgxMF9TRkxPQVRfQkxPQ0tfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiIGV4dG51bWJlcj0iNjciIG9mZnNldD0iMTIiIG5hbWU9IlZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NGTE9BVF9CTE9DS19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgZXh0bnVtYmVyPSI2NyIgb2Zmc2V0PSIxMyIgbmFtZT0iVktfRk9STUFUX0FTVENfMTJ4MTJfU0ZMT0FUX0JMT0NLX0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfYXN0Y19kZWNvZGVfbW9kZSIgbnVtYmVyPSI2OCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFSTSIgY29udGFjdD0iSmFuLUhhcmFsZCBGcmVkcmlrc2VuIEBqYW5oYXJhbGRmcmVkcmlrc2VuLWFybSIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9BU1RDX0RFQ09ERV9NT0RFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfYXN0Y19kZWNvZGVfbW9kZSZxdW90OyIgICAgICAgbmFtZT0iVktfRVhUX0FTVENfREVDT0RFX01PREVfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19JTUdfZXh0ZW5zaW9uXzY5IiBudW1iZXI9IjY5IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iSU1HIiBjb250YWN0PSJUb2JpYXMgSGVjdG9yIEB0b2Jza2kiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNR19FWFRFTlNJT05fNjlfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0lNR19leHRlbnNpb25fNjkmcXVvdDsiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNR19FWFRFTlNJT05fNjlfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX21haW50ZW5hbmNlMSIgbnVtYmVyPSI3MCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iUGllcnMgRGFuaWVsbCBAcGRhbmllbGwtbnYiIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX01BSU5URU5BTkNFMV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX21haW50ZW5hbmNlMSZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrUmVzdWx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FUlJPUl9PVVRfT0ZfUE9PTF9NRU1PUllfS0hSIiBhbGlhcz0iVktfRVJST1JfT1VUX09GX1BPT0xfTUVNT1JZIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVRfS0hSIiBhbGlhcz0iVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUX0tIUiIgYWxpYXM9IlZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQ29tbWFuZFBvb2xUcmltRmxhZ3NLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1RyaW1Db21tYW5kUG9vbEtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIiBudW1iZXI9IjcxIiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgc3VwcG9ydGVkPSJ2dWxrYW4iIHByb21vdGVkdG89IlZLX1ZFUlNJT05fMV8xIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uJnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk9fS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG5hbWU9IlZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRV9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtNZW1vcnlIZWFwRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX01FTU9SWV9IRUFQX01VTFRJX0lOU1RBTkNFX0JJVF9LSFIiIGFsaWFzPSJWS19NRU1PUllfSEVBUF9NVUxUSV9JTlNUQU5DRV9CSVQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMiIG51bWJlcj0iNzIiIHR5cGU9Imluc3RhbmNlIiBhdXRob3I9IktIUiIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vIiBzdXBwb3J0ZWQ9InZ1bGthbiIgcHJvbW90ZWR0bz0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyZxdW90OyIgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfTUVNT1JZX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfSU1BR0VfRk9STUFUX0lORk9fS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk8iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVNfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVMiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVNfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVMiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBuYW1lPSJWS19MVUlEX1NJWkVfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNLSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiAgICAgICAgICAgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiAgICAgICAgICAgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiAgICAgICAgICAgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUiIgYWxpYXM9IlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMiICAgICAgICAgICAgICBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyIgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfS01UX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMiICAgICAgICAgICAgICBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfSEVBUF9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX0hFQVBfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyIgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9SRVNPVVJDRV9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cyIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0RFRElDQVRFRF9PTkxZX0JJVF9LSFIiIGFsaWFzPSJWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5UHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5IiBudW1iZXI9IjczIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8iIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVSTkFMX01FTU9SWV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVybmFsX21lbW9yeSZxdW90OyIgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfQlVGRkVSX0NSRUFURV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtSZXN1bHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFX0tIUiIgYWxpYXM9IlZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFIi8+CisgICAgICAgICAgICAgICAgPGVudW0gbmFtZT0iVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIiIG51bWJlcj0iNzQiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9leHRlcm5hbF9tZW1vcnkiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vIiBwbGF0Zm9ybT0id2luMzIiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfTUVNT1JZX1dJTjMyX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyJnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfTUVNT1JZX1dJTjMyX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9XSU4zMl9IQU5ETEVfUFJPUEVSVElFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjMiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkIiBudW1iZXI9Ijc1IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5IiBhdXRob3I9IktIUiIgY29udGFjdD0iSmFtZXMgSm9uZXMgQGN1YmFuaXNtbyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRkRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQmcXVvdDsiICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRkRfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9GRF9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfRkRfUFJPUEVSVElFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9GRF9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeUdldEZkSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0TWVtb3J5RmRLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfd2luMzJfa2V5ZWRfbXV0ZXgiIG51bWJlcj0iNzYiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJDYXJzdGVuIFJvaGRlIEBjcm9oZGUiIHBsYXRmb3JtPSJ3aW4zMiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9XSU4zMl9LRVlFRF9NVVRFWF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3dpbjMyX2tleWVkX211dGV4JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1dJTjMyX0tFWUVEX01VVEVYX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzIiBudW1iZXI9Ijc3IiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJLSFIiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgY29udGFjdD0iSmFtZXMgSm9uZXMgQGN1YmFuaXNtbyIgc3VwcG9ydGVkPSJ2dWxrYW4iIHByb21vdGVkdG89IlZLX1ZFUlNJT05fMV8xIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0NBUEFCSUxJVElFU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMmcXVvdDsiIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9TRU1BUEhPUkVfSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk8iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVMiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBuYW1lPSJWS19MVUlEX1NJWkVfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNLSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIiAgICAgICBuYW1lPSJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVF9LSFIiIGFsaWFzPSJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMiICAgICAgIG5hbWU9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUX0tIUiIgYWxpYXM9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyIgICAgICAgbmFtZT0iVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUiIgYWxpYXM9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMiICAgICAgIG5hbWU9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX0QzRDEyX0ZFTkNFX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMiICAgICAgIG5hbWU9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVF9LSFIiIGFsaWFzPSJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0c0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHMiICAgICAgICAgIG5hbWU9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX0tIUiIgYWxpYXM9IlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0cyIgICAgICAgICAgbmFtZT0iVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfS0hSIiBhbGlhcz0iVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlIiBudW1iZXI9Ijc4IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcyIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8iIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlJnF1b3Q7IiAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX0NSRUFURV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NlbWFwaG9yZUltcG9ydEZsYWdzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0c0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVF9LSFIiIGFsaWFzPSJWS19TRU1BUEhPUkVfSU1QT1JUX1RFTVBPUkFSWV9CSVQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV93aW4zMiIgbnVtYmVyPSI3OSIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8iIHBsYXRmb3JtPSJ3aW4zMiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9XSU4zMl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV93aW4zMiZxdW90OyIgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX1dJTjMyX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0QzRDEyX0ZFTkNFX1NVQk1JVF9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfZmQiIG51bWJlcj0iODAiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmUiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0ZEX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkJnF1b3Q7IiAgICAgIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRkRfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX0ZEX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9GRF9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0ltcG9ydFNlbWFwaG9yZUZkS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRTZW1hcGhvcmVGZEtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfcHVzaF9kZXNjcmlwdG9yIiBudW1iZXI9IjgxIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iS0hSIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3B1c2hfZGVzY3JpcHRvciZxdW90OyIgICAgICAgICAgICBuYW1lPSJWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BVU0hfREVTQ1JJUFRPUl9QUk9QRVJUSUVTX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMCIgZXh0ZW5kcz0iVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMiICAgbmFtZT0iVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUiIgIGNvbW1lbnQ9IkRlc2NyaXB0b3JzIGFyZSBwdXNoZWQgdmlhIGZsaW5rOnZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICAgICAgPHJlcXVpcmUgZmVhdHVyZT0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgZXh0ZW5kcz0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIiAgICBuYW1lPSJWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSIiBjb21tZW50PSJDcmVhdGUgZGVzY3JpcHRvciB1cGRhdGUgdGVtcGxhdGUgZm9yIHB1c2hlZCBkZXNjcmlwdG9yIHVwZGF0ZXMiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZyIgbnVtYmVyPSI4MiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9Ik5WIiBjb250YWN0PSJWaWtyYW0gS3VzaHdhaGEgQHZrdXNod2FoYSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0NPTkRJVElPTkFMX1JFTkRFUklOR19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZyZxdW90OyIgICAgICBuYW1lPSJWS19FWFRfQ09ORElUSU9OQUxfUkVOREVSSU5HX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjIwIiBleHRlbmRzPSJWa0FjY2Vzc0ZsYWdCaXRzIiAgICAgICAgICAgICAgICBuYW1lPSJWS19BQ0NFU1NfQ09ORElUSU9OQUxfUkVOREVSSU5HX1JFQURfQklUX0VYVCIgICAgY29tbWVudD0icmVhZCBhY2Nlc3MgZmxhZyBmb3IgcmVhZGluZyBjb25kaXRpb25hbCByZW5kZXJpbmcgcHJlZGljYXRlIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSI5IiAgZXh0ZW5kcz0iVmtCdWZmZXJVc2FnZUZsYWdCaXRzIiAgICAgICAgICAgbmFtZT0iVktfQlVGRkVSX1VTQUdFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CSVRfRVhUIiAgIGNvbW1lbnQ9IlNwZWNpZmllcyB0aGUgYnVmZmVyIGNhbiBiZSB1c2VkIGFzIHByZWRpY2F0ZSBpbiBjb25kaXRpb25hbCByZW5kZXJpbmciLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE4IiBleHRlbmRzPSJWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyIgICAgICAgICBuYW1lPSJWS19QSVBFTElORV9TVEFHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCIgY29tbWVudD0iQSBwaXBlbGluZSBzdGFnZSBmb3IgY29uZGl0aW9uYWwgcmVuZGVyaW5nIHByZWRpY2F0ZSBmZXRjaCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfc2hhZGVyX2Zsb2F0MTZfaW50OCIgbnVtYmVyPSI4MyIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJBbGV4YW5kZXIgR2FsYXppbiBAYWxlZ2FsLWFybSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9TSEFERVJfRkxPQVQxNl9JTlQ4X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfc2hhZGVyX2Zsb2F0MTZfaW50OCZxdW90OyIgICAgICBuYW1lPSJWS19LSFJfU0hBREVSX0ZMT0FUMTZfSU5UOF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0ZMT0FUMTZfSU5UOF9GRUFUVVJFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSAgICAgICAgICAgIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUMTZfSU5UOF9GRUFUVVJFU19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0ZMT0FUMTZfSU5UOF9GRUFUVVJFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VGbG9hdDE2SW50OEZlYXR1cmVzS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl8xNmJpdF9zdG9yYWdlIiBudW1iZXI9Ijg0IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMixWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9Ikphbi1IYXJhbGQgRnJlZHJpa3NlbiBAamFuaGFyYWxkZnJlZHJpa3Nlbi1hcm0iIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfMTZCSVRfU1RPUkFHRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSXzE2Yml0X3N0b3JhZ2UmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfMTZCSVRfU1RPUkFHRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50IiBudW1iZXI9Ijg1IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iS0hSIiByZXF1aXJlcz0iVktfS0hSX3N3YXBjaGFpbiIgY29udGFjdD0iSWFuIEVsbGlvdHQgQGlhbmVsbGlvdHR1cyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0lOQ1JFTUVOVEFMX1BSRVNFTlRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50JnF1b3Q7IiAgICAgICAgbmFtZT0iVktfS0hSX0lOQ1JFTUVOVEFMX1BSRVNFTlRfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1JFR0lPTlNfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQcmVzZW50UmVnaW9uc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUHJlc2VudFJlZ2lvbktIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUmVjdExheWVyS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9kZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZSIgbnVtYmVyPSI4NiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iTWFya3VzIFRhdmVucmF0aCBAbXRhdmVucmF0aCIgc3VwcG9ydGVkPSJ2dWxrYW4iIHByb21vdGVkdG89IlZLX1ZFUlNJT05fMV8xIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlJnF1b3Q7IiBuYW1lPSJWS19LSFJfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9DUkVBVEVfSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrT2JqZWN0VHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0tIUiIgYWxpYXM9IlZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlRmxhZ3NLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5S0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9ERVNDUklQVE9SX1NFVF9LSFIiIGFsaWFzPSJWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgICAgICA8cmVxdWlyZSBleHRlbnNpb249IlZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IiPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgZXh0ZW5kcz0iVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIiAgICBuYW1lPSJWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSIiBjb21tZW50PSJDcmVhdGUgZGVzY3JpcHRvciB1cGRhdGUgdGVtcGxhdGUgZm9yIHB1c2hlZCBkZXNjcmlwdG9yIHVwZGF0ZXMiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgICAgIDxyZXF1aXJlIGV4dGVuc2lvbj0iVktfRVhUX2RlYnVnX3JlcG9ydCI+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0tIUl9FWFQiIGFsaWFzPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIiBudW1iZXI9Ijg3IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlZYIiBjb250YWN0PSJDaHJpc3RvcGggS3ViaXNjaCBAcGl4ZWxqZXRzdHJlYW0iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WWF9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyZxdW90OyIgIG5hbWU9IlZLX05WWF9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfT0JKRUNUX1RBQkxFX0NSRUFURV9JTkZPX05WWCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlgiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9DTURfUFJPQ0VTU19DT01NQU5EU19JTkZPX05WWCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfTElNSVRTX05WWCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRkVBVFVSRVNfTlZYIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxNyIgZXh0ZW5kcz0iVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiICAgICAgICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfQ09NTUFORF9QUk9DRVNTX0JJVF9OVlgiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE3IiBleHRlbmRzPSJWa0FjY2Vzc0ZsYWdCaXRzIiAgICAgICAgICAgICAgICBuYW1lPSJWS19BQ0NFU1NfQ09NTUFORF9QUk9DRVNTX1JFQURfQklUX05WWCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTgiIGV4dGVuZHM9IlZrQWNjZXNzRmxhZ0JpdHMiICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FDQ0VTU19DT01NQU5EX1BST0NFU1NfV1JJVEVfQklUX05WWCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtPYmplY3RUeXBlIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlgiICAgICAgICAgICAgICAgICAgICAgY29tbWVudD0iVmtvYmplY3RUYWJsZU5WWCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtPYmplY3RUeXBlIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlgiICAgICAgICAgY29tbWVudD0iVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtPYmplY3RUYWJsZU5WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlgiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlgiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlgiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrT2JqZWN0RW50cnlUeXBlTlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrT2JqZWN0VGFibGVFbnRyeU5WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUmVnaXN0ZXJPYmplY3RzTlZYIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtVbnJlZ2lzdGVyT2JqZWN0c05WWCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfY2xpcF9zcGFjZV93X3NjYWxpbmciIG51bWJlcj0iODgiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJOViIgY29udGFjdD0iRXJpYyBXZXJuZXNzIEBld2VybmVzcy1udiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfQ0xJUF9TUEFDRV9XX1NDQUxJTkdfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2NsaXBfc3BhY2Vfd19zY2FsaW5nJnF1b3Q7IiAgICAgICAgbmFtZT0iVktfTlZfQ0xJUF9TUEFDRV9XX1NDQUxJTkdfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrRHluYW1pY1N0YXRlIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1dfU0NBTElOR19OViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrVmlld3BvcnRXU2NhbGluZ05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9kaXJlY3RfbW9kZV9kaXNwbGF5IiBudW1iZXI9Ijg5IiB0eXBlPSJpbnN0YW5jZSIgcmVxdWlyZXM9IlZLX0tIUl9kaXNwbGF5IiBhdXRob3I9Ik5WIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRElSRUNUX01PREVfRElTUExBWV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2RpcmVjdF9tb2RlX2Rpc3BsYXkmcXVvdDsiICAgICAgICBuYW1lPSJWS19FWFRfRElSRUNUX01PREVfRElTUExBWV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUmVsZWFzZURpc3BsYXlFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2FjcXVpcmVfeGxpYl9kaXNwbGF5IiBudW1iZXI9IjkwIiB0eXBlPSJpbnN0YW5jZSIgcmVxdWlyZXM9IlZLX0VYVF9kaXJlY3RfbW9kZV9kaXNwbGF5IiBhdXRob3I9Ik5WIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vIiBwbGF0Zm9ybT0ieGxpYl94cmFuZHIiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9BQ1FVSVJFX1hMSUJfRElTUExBWV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2FjcXVpcmVfeGxpYl9kaXNwbGF5JnF1b3Q7IiAgICAgICBuYW1lPSJWS19FWFRfQUNRVUlSRV9YTElCX0RJU1BMQVlfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0FjcXVpcmVYbGliRGlzcGxheUVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciIgbnVtYmVyPSI5MSIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzPSJWS19LSFJfZGlzcGxheSIgYXV0aG9yPSJOViIgY29udGFjdD0iSmFtZXMgSm9uZXMgQGN1YmFuaXNtbyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0RJU1BMQVlfU1VSRkFDRV9DT1VOVEVSX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfZGlzcGxheV9zdXJmYWNlX2NvdW50ZXImcXVvdDsiICAgIG5hbWU9IlZLX0VYVF9ESVNQTEFZX1NVUkZBQ0VfQ09VTlRFUl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFUzJfRVhUIiBjb21tZW50PSJCYWNrd2FyZHMtY29tcGF0aWJsZSBhbGlhcyBjb250YWluaW5nIGEgdHlwbyIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3VyZmFjZUNvdW50ZXJGbGFnc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2Rpc3BsYXlfY29udHJvbCIgbnVtYmVyPSI5MiIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfRVhUX2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyLFZLX0tIUl9zd2FwY2hhaW4iIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9ESVNQTEFZX0NPTlRST0xfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9kaXNwbGF5X2NvbnRyb2wmcXVvdDsiICAgICAgICAgICAgbmFtZT0iVktfRVhUX0RJU1BMQVlfQ09OVFJPTF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUE9XRVJfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfRVZFTlRfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX0VWRU5UX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NPVU5URVJfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNwbGF5UG93ZXJTdGF0ZUVYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGV2aWNlRXZlbnRUeXBlRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNwbGF5RXZlbnRUeXBlRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNwbGF5UG93ZXJJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VFdmVudEluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlFdmVudEluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEaXNwbGF5UG93ZXJDb250cm9sRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtSZWdpc3RlckRldmljZUV2ZW50RVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0U3dhcGNoYWluQ291bnRlckVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19HT09HTEVfZGlzcGxheV90aW1pbmciIG51bWJlcj0iOTMiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJHT09HTEUiIHJlcXVpcmVzPSJWS19LSFJfc3dhcGNoYWluIiBjb250YWN0PSJJYW4gRWxsaW90dCBAaWFuZWxsaW90dHVzIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19HT09HTEVfRElTUExBWV9USU1JTkdfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0dPT0dMRV9kaXNwbGF5X3RpbWluZyZxdW90OyIgICAgICAgICAgbmFtZT0iVktfR09PR0xFX0RJU1BMQVlfVElNSU5HX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9USU1FU19JTkZPX0dPT0dMRSIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1ByZXNlbnRUaW1lc0luZm9HT09HTEUiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1ByZXNlbnRUaW1lR09PR0xFIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJSRVNFUlZFRF9ET19OT1RfVVNFXzk0IiBudW1iZXI9Ijk0IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIiBjb21tZW50PSJVc2VkIGZvciBmdW5jdGlvbmFsaXR5IHN1YnN1bWVkIGludG8gVnVsa2FuIDEuMSBhbmQgbm90IHB1Ymxpc2hlZCBhcyBhbiBleHRlbnNpb24iPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9zYW1wbGVfbWFza19vdmVycmlkZV9jb3ZlcmFnZSIgbnVtYmVyPSI5NSIgdHlwZT0iZGV2aWNlIiBhdXRob3I9Ik5WIiBjb250YWN0PSJQaWVycyBEYW5pZWxsIEBwZGFuaWVsbC1udiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfU0FNUExFX01BU0tfT1ZFUlJJREVfQ09WRVJBR0VfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX3NhbXBsZV9tYXNrX292ZXJyaWRlX2NvdmVyYWdlJnF1b3Q7IiBuYW1lPSJWS19OVl9TQU1QTEVfTUFTS19PVkVSUklERV9DT1ZFUkFHRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxjb21tZW50PgorICAgICAgICAgICAgICAgICAgICBlbnVtIG9mZnNldD0wIHdhcyBtaXN0YWtlbmx5IHVzZWQgZm9yIHRoZSAxLjEgY29yZSBlbnVtCisgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9QUk9QRVJUSUVTCisgICAgICAgICAgICAgICAgICAgICh2YWx1ZT0xMDAwMDk0MDAwKS4gRm9ydHVuYXRlbHksIG5vIGNvbmZsaWN0IHJlc3VsdGVkLgorICAgICAgICAgICAgICAgIDwvY29tbWVudD4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfZ2VvbWV0cnlfc2hhZGVyX3Bhc3N0aHJvdWdoIiBudW1iZXI9Ijk2IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0dFT01FVFJZX1NIQURFUl9QQVNTVEhST1VHSF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZ2VvbWV0cnlfc2hhZGVyX3Bhc3N0aHJvdWdoJnF1b3Q7IiBuYW1lPSJWS19OVl9HRU9NRVRSWV9TSEFERVJfUEFTU1RIUk9VR0hfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfdmlld3BvcnRfYXJyYXkyIiBudW1iZXI9Ijk3IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX1ZJRVdQT1JUX0FSUkFZMl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfdmlld3BvcnRfYXJyYXkyJnF1b3Q7IiAgICAgICAgICAgICBuYW1lPSJWS19OVl9WSUVXUE9SVF9BUlJBWTJfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZYX211bHRpdmlld19wZXJfdmlld19hdHRyaWJ1dGVzIiBudW1iZXI9Ijk4IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfbXVsdGl2aWV3IiBhdXRob3I9Ik5WWCIgY29udGFjdD0iSmVmZiBCb2x6IEBqZWZmYm9sem52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVlhfTVVMVElWSUVXX1BFUl9WSUVXX0FUVFJJQlVURVNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WWF9tdWx0aXZpZXdfcGVyX3ZpZXdfYXR0cmlidXRlcyZxdW90OyIgbmFtZT0iVktfTlZYX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIwIiBleHRlbmRzPSJWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIiAgICAgbmFtZT0iVktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19BVFRSSUJVVEVTX0JJVF9OVlgiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEiIGV4dGVuZHM9IlZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMiICAgICBuYW1lPSJWS19TVUJQQVNTX0RFU0NSSVBUSU9OX1BFUl9WSUVXX1BPU0lUSU9OX1hfT05MWV9CSVRfTlZYIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl92aWV3cG9ydF9zd2l6emxlIiBudW1iZXI9Ijk5IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9WSUVXUE9SVF9TV0laWkxFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl92aWV3cG9ydF9zd2l6emxlJnF1b3Q7IiAgICAgICAgICAgIG5hbWU9IlZLX05WX1ZJRVdQT1JUX1NXSVpaTEVfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TV0laWkxFX1NUQVRFX0NSRUFURV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtWaWV3cG9ydFN3aXp6bGVOViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlRmxhZ3NOViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzIiBudW1iZXI9IjEwMCIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRElTQ0FSRF9SRUNUQU5HTEVTX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzJnF1b3Q7IiAgICAgICAgIG5hbWU9IlZLX0VYVF9ESVNDQVJEX1JFQ1RBTkdMRVNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRElTQ0FSRF9SRUNUQU5HTEVfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9ESVNDQVJEX1JFQ1RBTkdMRV9TVEFURV9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrRHluYW1pY1N0YXRlIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19EWU5BTUlDX1NUQVRFX0RJU0NBUkRfUkVDVEFOR0xFX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUZsYWdzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fMTAxIiBudW1iZXI9IjEwMSIgYXV0aG9yPSJOViIgY29udGFjdD0iRGFuaWVsIEtvY2ggQGRna29jaCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMTAxX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9leHRlbnNpb25fMTAxJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVOU0lPTl8xMDFfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2NvbnNlcnZhdGl2ZV9yYXN0ZXJpemF0aW9uIiBudW1iZXI9IjEwMiIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2NvbnNlcnZhdGl2ZV9yYXN0ZXJpemF0aW9uJnF1b3Q7IiAgICBuYW1lPSJWS19FWFRfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlRmxhZ3NFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9kZXB0aF9jbGlwX2VuYWJsZSIgbnVtYmVyPSIxMDMiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfREVQVEhfQ0xJUF9FTkFCTEVfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9kZXB0aF9jbGlwX2VuYWJsZSZxdW90OyIgICAgICAgICAgbmFtZT0iVktfRVhUX0RFUFRIX0NMSVBfRU5BQkxFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX0NMSVBfRU5BQkxFX0ZFQVRVUkVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fREVQVEhfQ0xJUF9TVEFURV9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVGbGFnc0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fMTA0IiBudW1iZXI9IjEwNCIgYXV0aG9yPSJOViIgY29udGFjdD0iTWF0aGlhcyBTY2hvdHQgZ2l0bGFiOkBtc2Nob3R0IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVOU0lPTl8xMDRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2V4dGVuc2lvbl8xMDQmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzEwNF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfc3dhcGNoYWluX2NvbG9yc3BhY2UiIG51bWJlcj0iMTA1IiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJHT09HTEUiIGNvbnRhY3Q9IkNvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgQGNvdXJ0bmV5LWciIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX1NXQVBDSEFJTl9DT0xPUl9TUEFDRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX3N3YXBjaGFpbl9jb2xvcnNwYWNlJnF1b3Q7IiAgICAgICBuYW1lPSJWS19FWFRfU1dBUENIQUlOX0NPTE9SX1NQQUNFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQ09MT1JfU1BBQ0VfRElTUExBWV9QM19OT05MSU5FQVJfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQ09MT1JfU1BBQ0VfRVhURU5ERURfU1JHQl9MSU5FQVJfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQ09MT1JfU1BBQ0VfRElTUExBWV9QM19MSU5FQVJfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI0IiBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQ09MT1JfU1BBQ0VfRENJX1AzX05PTkxJTkVBUl9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjUiIGV4dGVuZHM9IlZrQ29sb3JTcGFjZUtIUiIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19DT0xPUl9TUEFDRV9CVDcwOV9MSU5FQVJfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI2IiBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQ09MT1JfU1BBQ0VfQlQ3MDlfTk9OTElORUFSX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNyIgZXh0ZW5kcz0iVmtDb2xvclNwYWNlS0hSIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0NPTE9SX1NQQUNFX0JUMjAyMF9MSU5FQVJfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI4IiBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQ09MT1JfU1BBQ0VfSERSMTBfU1QyMDg0X0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iOSIgZXh0ZW5kcz0iVmtDb2xvclNwYWNlS0hSIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0NPTE9SX1NQQUNFX0RPTEJZVklTSU9OX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMTAiIGV4dGVuZHM9IlZrQ29sb3JTcGFjZUtIUiIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0NPTE9SX1NQQUNFX0hEUjEwX0hMR19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjExIiBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiICAgICAgICAgICAgICAgICBuYW1lPSJWS19DT0xPUl9TUEFDRV9BRE9CRVJHQl9MSU5FQVJfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxMiIgZXh0ZW5kcz0iVmtDb2xvclNwYWNlS0hSIiAgICAgICAgICAgICAgICAgbmFtZT0iVktfQ09MT1JfU1BBQ0VfQURPQkVSR0JfTk9OTElORUFSX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMTMiIGV4dGVuZHM9IlZrQ29sb3JTcGFjZUtIUiIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0NPTE9SX1NQQUNFX1BBU1NfVEhST1VHSF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjE0IiBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiICAgICAgICAgICAgICAgICBuYW1lPSJWS19DT0xPUl9TUEFDRV9FWFRFTkRFRF9TUkdCX05PTkxJTkVBUl9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0NvbG9yU3BhY2VLSFIiIG5hbWU9IlZLX0NPTE9SX1NQQUNFX0RDSV9QM19MSU5FQVJfRVhUIiBhbGlhcz0iVktfQ09MT1JfU1BBQ0VfRElTUExBWV9QM19MSU5FQVJfRVhUIiBjb21tZW50PSJEZXByZWNhdGVkIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ii8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9oZHJfbWV0YWRhdGEiIG51bWJlcj0iMTA2IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfc3dhcGNoYWluIiBhdXRob3I9IkdPT0dMRSIgY29udGFjdD0iQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciBAY291cnRuZXktZyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0hEUl9NRVRBREFUQV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2hkcl9tZXRhZGF0YSZxdW90OyIgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfSERSX01FVEFEQVRBX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSERSX01FVEFEQVRBX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSGRyTWV0YWRhdGFFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1hZQ29sb3JFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1NldEhkck1ldGFkYXRhRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0lNR19leHRlbnNpb25fMTA3IiBudW1iZXI9IjEwNyIgYXV0aG9yPSJJTUciIGNvbnRhY3Q9Ik1pY2hhZWwgV29yY2VzdGVyIEBtaWNoYWVsd29yY2VzdGVyIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNR19FWFRFTlNJT05fMTA3X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19JTUdfZXh0ZW5zaW9uXzEwNyZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0lNR19FWFRFTlNJT05fMTA3X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0lNR19leHRlbnNpb25fMTA4IiBudW1iZXI9IjEwOCIgYXV0aG9yPSJJTUciIGNvbnRhY3Q9Ik1pY2hhZWwgV29yY2VzdGVyIEBtaWNoYWVsd29yY2VzdGVyIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNR19FWFRFTlNJT05fMTA4X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19JTUdfZXh0ZW5zaW9uXzEwOCZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0lNR19FWFRFTlNJT05fMTA4X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9pbWFnZWxlc3NfZnJhbWVidWZmZXIiIHJlcXVpcmVzPSJWS19LSFJfbWFpbnRlbmFuY2UyLFZLX0tIUl9pbWFnZV9mb3JtYXRfbGlzdCIgbnVtYmVyPSIxMDkiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJUb2JpYXMgSGVjdG9yIEB0b2JpYXMiIHR5cGU9ImRldmljZSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2ltYWdlbGVzc19mcmFtZWJ1ZmZlciZxdW90OyIgICAgICBuYW1lPSJWS19LSFJfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19BVFRBQ0hNRU5UX0JFR0lOX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIwIiBleHRlbmRzPSJWa0ZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHMiIG5hbWU9IlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIiByZXF1aXJlcz0iVktfS0hSX211bHRpdmlldyxWS19LSFJfbWFpbnRlbmFuY2UyIiBudW1iZXI9IjExMCIgY29udGFjdD0iVG9iaWFzIEhlY3RvciBAdG9iaWFzIiB0eXBlPSJkZXZpY2UiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0NSRUFURV9SRU5ERVJQQVNTXzJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczImcXVvdDsiICAgICBuYW1lPSJWS19LSFJfQ1JFQVRFX1JFTkRFUlBBU1NfMl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl8yX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fMl9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjMiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk9fMl9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjUiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjYiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfRU5EX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVSZW5kZXJQYXNzMktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kTmV4dFN1YnBhc3MyS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRFbmRSZW5kZXJQYXNzMktIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19JTUdfZXh0ZW5zaW9uXzExMSIgbnVtYmVyPSIxMTEiIGF1dGhvcj0iSU1HIiBjb250YWN0PSJNaWNoYWVsIFdvcmNlc3RlciBAbWljaGFlbHdvcmNlc3RlciIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUdfRVhURU5TSU9OXzExMV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfSU1HX2V4dGVuc2lvbl8xMTEmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19JTUdfRVhURU5TSU9OXzExMV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlIiBudW1iZXI9IjExMiIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX3N3YXBjaGFpbixWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMixWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkFsb24gT3ItYmFjaCBAYWxvbm9yYmFjaCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1NIQVJFRF9QUkVTRU5UQUJMRV9JTUFHRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSZxdW90OyIgICBuYW1lPSJWS19LSFJfU0hBUkVEX1BSRVNFTlRBQkxFX0lNQUdFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1ByZXNlbnRNb2RlS0hSIiAgICAgICAgICAgICAgICAgbmFtZT0iVktfUFJFU0VOVF9NT0RFX1NIQVJFRF9ERU1BTkRfUkVGUkVTSF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrUHJlc2VudE1vZGVLSFIiICAgICAgICAgICAgICAgICBuYW1lPSJWS19QUkVTRU5UX01PREVfU0hBUkVEX0NPTlRJTlVPVVNfUkVGUkVTSF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrSW1hZ2VMYXlvdXQiICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0U3dhcGNoYWluU3RhdHVzS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMiIG51bWJlcj0iMTEzIiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJLSFIiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyIgc3VwcG9ydGVkPSJ2dWxrYW4iIHByb21vdGVkdG89IlZLX1ZFUlNJT05fMV8xIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9GRU5DRV9DQVBBQklMSVRJRVNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMmcXVvdDsiIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9GRU5DRV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfRkVOQ0VfSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfRkVOQ0VfSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZFTkNFX1BST1BFUlRJRVNfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRkVOQ0VfUFJPUEVSVElFUyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG5hbWU9IlZLX0xVSURfU0laRV9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3NLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMiICAgICAgICAgICBuYW1lPSJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUiIgYWxpYXM9IlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMiICAgICAgICAgICBuYW1lPSJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUX0tIUiIgYWxpYXM9IlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMiICAgICAgICAgICBuYW1lPSJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVF9LSFIiIGFsaWFzPSJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyIgICAgICAgICAgIG5hbWU9IlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUX0tIUiIgYWxpYXM9IlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgbmFtZT0iVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9LSFIiIGFsaWFzPSJWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgbmFtZT0iVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVF9LSFIiIGFsaWFzPSJWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVybmFsX2ZlbmNlIiBudW1iZXI9IjExNCIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcyIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9Ikplc3NlIEhhbGwgQGNyaXRzZWMiIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfRkVOQ0VfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlcm5hbF9mZW5jZSZxdW90OyIgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX0ZFTkNFX0NSRUFURV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRmVuY2VJbXBvcnRGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRmVuY2VJbXBvcnRGbGFnQml0c0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRmVuY2VJbXBvcnRGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZFTkNFX0lNUE9SVF9URU1QT1JBUllfQklUX0tIUiIgYWxpYXM9IlZLX0ZFTkNFX0lNUE9SVF9URU1QT1JBUllfQklUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVybmFsX2ZlbmNlX3dpbjMyIiBudW1iZXI9IjExNSIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2V4dGVybmFsX2ZlbmNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyIgcGxhdGZvcm09IndpbjMyIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfRkVOQ0VfV0lOMzJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlcm5hbF9mZW5jZV93aW4zMiZxdW90OyIgICAgICAgbmFtZT0iVktfS0hSX0VYVEVSTkFMX0ZFTkNFX1dJTjMyX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlcm5hbF9mZW5jZV9mZCIgbnVtYmVyPSIxMTYiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9leHRlcm5hbF9mZW5jZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9Ikplc3NlIEhhbGwgQGNyaXRzZWMiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFUk5BTF9GRU5DRV9GRF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkJnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURVJOQUxfRkVOQ0VfRkRfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfRkRfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltcG9ydEZlbmNlRmRJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtGZW5jZUdldEZkSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrSW1wb3J0RmVuY2VGZEtIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RmVuY2VGZEtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkiIG51bWJlcj0iMTE3IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkFsb24gT3ItYmFjaCBAYWxvbm9yYmFjaCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkmcXVvdDsiIG5hbWU9IlZLX0tIUl9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtRdWVyeVR5cGUiICAgICAgICAgICAgIG5hbWU9IlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9QUk9QRVJUSUVTX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI0IiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI2IiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQWNxdWlyZVByb2ZpbGluZ0xvY2tGbGFnQml0c0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX21haW50ZW5hbmNlMiIgbnVtYmVyPSIxMTgiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9Ik1pY2hhZWwgV29yY2VzdGVyIEBtaWNoYWVsd29yY2VzdGVyIiBzdXBwb3J0ZWQ9InZ1bGthbiIgcHJvbW90ZWR0bz0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX01BSU5URU5BTkNFMl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX21haW50ZW5hbmNlMiZxdW90OyIgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVRfS0hSIiBhbGlhcz0iVktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9DUkVBVEVfRVhURU5ERURfVVNBR0VfQklUX0tIUiIgYWxpYXM9IlZLX0lNQUdFX0NSRUFURV9FWFRFTkRFRF9VU0FHRV9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUE9JTlRfQ0xJUFBJTkdfUFJPUEVSVElFU19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUE9JTlRfQ0xJUFBJTkdfUFJPUEVSVElFUyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0lOUFVUX0FUVEFDSE1FTlRfQVNQRUNUX0NSRUFURV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0lOUFVUX0FUVEFDSE1FTlRfQVNQRUNUX0NSRUFURV9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19VU0FHRV9DUkVBVEVfSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fU1RBVEVfQ1JFQVRFX0lORk9fS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fU1RBVEVfQ1JFQVRFX0lORk8iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0ltYWdlTGF5b3V0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiIgYWxpYXM9IlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0ltYWdlTGF5b3V0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiIgYWxpYXM9IlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BvaW50Q2xpcHBpbmdCZWhhdmlvcktIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX0FMTF9DTElQX1BMQU5FU19LSFIiIGFsaWFzPSJWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9BTExfQ0xJUF9QTEFORVMiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1BvaW50Q2xpcHBpbmdCZWhhdmlvciIgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9VU0VSX0NMSVBfUExBTkVTX09OTFlfS0hSIiBhbGlhcz0iVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfVVNFUl9DTElQX1BMQU5FU19PTkxZIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1Rlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbktIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1VQUEVSX0xFRlRfS0hSIiBhbGlhcz0iVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fVVBQRVJfTEVGVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX0xPV0VSX0xFRlRfS0hSIiBhbGlhcz0iVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fTE9XRVJfTEVGVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVuc2lvbl8xMTkiIG51bWJlcj0iMTE5IiBhdXRob3I9IktIUiIgY29udGFjdD0iTWljaGFlbCBXb3JjZXN0ZXIgQG1pY2hhZWx3b3JjZXN0ZXIiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8xMTlfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlbnNpb25fMTE5JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8xMTlfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIiIG51bWJlcj0iMTIwIiB0eXBlPSJpbnN0YW5jZSIgcmVxdWlyZXM9IlZLX0tIUl9zdXJmYWNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmFtZXMgSm9uZXMgQGN1YmFuaXNtbyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0dFVF9TVVJGQUNFX0NBUEFCSUxJVElFU18yX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiZxdW90OyIgIG5hbWU9IlZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRk9STUFUXzJfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1N1cmZhY2VGb3JtYXQyS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfdmFyaWFibGVfcG9pbnRlcnMiIG51bWJlcj0iMTIxIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKZXNzZSBIYWxsIEBjcml0c2VjIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIsVktfS0hSX3N0b3JhZ2VfYnVmZmVyX3N0b3JhZ2VfY2xhc3MiIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfVkFSSUFCTEVfUE9JTlRFUlNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl92YXJpYWJsZV9wb2ludGVycyZxdW90OyIgICAgICAgICAgbmFtZT0iVktfS0hSX1ZBUklBQkxFX1BPSU5URVJTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZBUklBQkxFX1BPSU5URVJfRkVBVFVSRVNfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZBUklBQkxFX1BPSU5URVJfRkVBVFVSRVMiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVNfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZBUklBQkxFX1BPSU5URVJfRkVBVFVSRVMiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyRmVhdHVyZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMiIgbnVtYmVyPSIxMjIiIHR5cGU9Imluc3RhbmNlIiByZXF1aXJlcz0iVktfS0hSX2Rpc3BsYXkiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9HRVRfRElTUExBWV9QUk9QRVJUSUVTXzJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMiZxdW90OyIgbmFtZT0iVktfS0hSX0dFVF9ESVNQTEFZX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUk9QRVJUSUVTXzJfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9QUk9QRVJUSUVTXzJfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX0lORk9fMl9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjQiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNwbGF5UHJvcGVydGllczJLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEaXNwbGF5UGxhbmVJbmZvMktIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTVZLX2lvc19zdXJmYWNlIiBudW1iZXI9IjEyMyIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgcGxhdGZvcm09ImlvcyIgc3VwcG9ydGVkPSJ2dWxrYW4iIGF1dGhvcj0iTVZLIiBjb250YWN0PSJCaWxsIEhvbGxpbmdzIEBiaWxsaG9sbGluZ3MiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTVZLX0lPU19TVVJGQUNFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19NVktfaW9zX3N1cmZhY2UmcXVvdDsiICAgICAgICAgICAgICAgIG5hbWU9IlZLX01WS19JT1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSyIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSU9TU3VyZmFjZUNyZWF0ZUZsYWdzTVZLIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlSU9TU3VyZmFjZU1WSyIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19NVktfbWFjb3Nfc3VyZmFjZSIgbnVtYmVyPSIxMjQiIHR5cGU9Imluc3RhbmNlIiByZXF1aXJlcz0iVktfS0hSX3N1cmZhY2UiIHBsYXRmb3JtPSJtYWNvcyIgc3VwcG9ydGVkPSJ2dWxrYW4iIGF1dGhvcj0iTVZLIiBjb250YWN0PSJCaWxsIEhvbGxpbmdzIEBiaWxsaG9sbGluZ3MiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTVZLX01BQ09TX1NVUkZBQ0VfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX01WS19tYWNvc19zdXJmYWNlJnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfTVZLX01BQ09TX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSyIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTWFjT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVksiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19NVktfbW9sdGVudmsiIG51bWJlcj0iMTI1IiB0eXBlPSJpbnN0YW5jZSIgYXV0aG9yPSJNVksiIGNvbnRhY3Q9IkJpbGwgSG9sbGluZ3MgQGJpbGxob2xsaW5ncyIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19NVktfTU9MVEVOVktfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX01WS19tb2x0ZW52ayZxdW90OyIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTVZLX01PTFRFTlZLX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9leHRlcm5hbF9tZW1vcnlfZG1hX2J1ZiIgbnVtYmVyPSIxMjYiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJDaGFkIFZlcnNhY2UgQGNoYWR2ZXJzYXJ5IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURVJOQUxfTUVNT1JZX0RNQV9CVUZfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9leHRlcm5hbF9tZW1vcnlfZG1hX2J1ZiZxdW90OyIgICAgbmFtZT0iVktfRVhUX0VYVEVSTkFMX01FTU9SWV9ETUFfQlVGX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSI5IiBleHRlbmRzPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRE1BX0JVRl9CSVRfRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9xdWV1ZV9mYW1pbHlfZm9yZWlnbiIgbnVtYmVyPSIxMjciIHR5cGU9ImRldmljZSIgYXV0aG9yPSJFWFQiIHJlcXVpcmVzPSJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5IiBjb250YWN0PSJDaGFkIFZlcnNhY2UgQGNoYWR2ZXJzYXJ5IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfUVVFVUVfRkFNSUxZX0ZPUkVJR05fU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9xdWV1ZV9mYW1pbHlfZm9yZWlnbiZxdW90OyIgICAgICAgbmFtZT0iVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiIgbnVtYmVyPSIxMjgiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyIiBjb250YWN0PSJKYW1lcyBKb25lcyBAY3ViYW5pc21vIiBzdXBwb3J0ZWQ9InZ1bGthbiIgcHJvbW90ZWR0bz0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24mcXVvdDsiICAgICAgIG5hbWU9IlZLX0tIUl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfUkVRVUlSRU1FTlRTX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfUkVRVUlSRU1FTlRTIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfQUxMT0NBVEVfSU5GTyIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2RlYnVnX3V0aWxzIiBudW1iZXI9IjEyOSIgdHlwZT0iaW5zdGFuY2UiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJNYXJrIFlvdW5nIEBtYXJreS1sdW5hcmciIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9ERUJVR19VVElMU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2RlYnVnX3V0aWxzJnF1b3Q7IiAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfREVCVUdfVVRJTFNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9UQUdfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjMiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjQiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa09iamVjdFR5cGUiICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0VYVCIgICAgICAgICAgY29tbWVudD0iVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZWJ1Z1V0aWxzTGFiZWxFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciIgbnVtYmVyPSIxMzAiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJBTkRST0lEIiByZXF1aXJlcz0iVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbixWS19LSFJfZXh0ZXJuYWxfbWVtb3J5LFZLX0VYVF9xdWV1ZV9mYW1pbHlfZm9yZWlnbiIgcGxhdGZvcm09ImFuZHJvaWQiIGNvbnRhY3Q9Ikplc3NlIEhhbGwgQGNyaXRzZWMiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciZxdW90OyIgbmFtZT0iVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEwIiBleHRlbmRzPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiBuYW1lPSJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9VU0FHRV9BTkRST0lEIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfUFJPUEVSVElFU19BTkRST0lEIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRk9STUFUX1BST1BFUlRJRVNfQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjQiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZPUk1BVF9BTkRST0lEIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9zYW1wbGVyX2ZpbHRlcl9taW5tYXgiIG51bWJlcj0iMTMxIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgY29udGFjdD0iSmVmZiBCb2x6IEBqZWZmYm9sem52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfU0FNUExFUl9GSUxURVJfTUlOTUFYX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4JnF1b3Q7IiAgICAgIG5hbWU9IlZLX0VYVF9TQU1QTEVSX0ZJTFRFUl9NSU5NQVhfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9GSUxURVJfTUlOTUFYX1BST1BFUlRJRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE2IiBleHRlbmRzPSJWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyIgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9NSU5NQVhfQklUX0VYVCIgY29tbWVudD0iRm9ybWF0IGNhbiBiZSB1c2VkIHdpdGggbWluL21heCByZWR1Y3Rpb24gZmlsdGVyaW5nIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUVYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9zdG9yYWdlX2J1ZmZlcl9zdG9yYWdlX2NsYXNzIiBudW1iZXI9IjEzMiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iQWxleGFuZGVyIEdhbGF6aW4gQGFsZWdhbC1hcm0iIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfU1RPUkFHRV9CVUZGRVJfU1RPUkFHRV9DTEFTU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3N0b3JhZ2VfYnVmZmVyX3N0b3JhZ2VfY2xhc3MmcXVvdDsiIG5hbWU9IlZLX0tIUl9TVE9SQUdFX0JVRkZFUl9TVE9SQUdFX0NMQVNTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9ncHVfc2hhZGVyX2ludDE2IiBudW1iZXI9IjEzMyIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFNRCIgY29udGFjdD0iUXVuIExpbiBAbGlucXVuIiBzdXBwb3J0ZWQ9InZ1bGthbiIgZGVwcmVjYXRlZGJ5PSJWS19LSFJfc2hhZGVyX2Zsb2F0MTZfaW50OCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfR1BVX1NIQURFUl9JTlQxNl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2dwdV9zaGFkZXJfaW50MTYmcXVvdDsiICAgICAgICAgICBuYW1lPSJWS19BTURfR1BVX1NIQURFUl9JTlQxNl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzEzNCIgbnVtYmVyPSIxMzQiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYWlzIEFsbmFzc2VyIEBtYWxuYXNzZSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzEzNF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8xMzQmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzEzNF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzEzNSIgbnVtYmVyPSIxMzUiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYWlzIEFsbmFzc2VyIEBtYWxuYXNzZSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzEzNV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8xMzUmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzEzNV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzEzNiIgbnVtYmVyPSIxMzYiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYWlzIEFsbmFzc2VyIEBtYWxuYXNzZSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzEzNl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8xMzYmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzEzNl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzIiBudW1iZXI9IjEzNyIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFNRCIgY29udGFjdD0iTWF0dGhhZXVzIEcuIENoYWpkYXMgQGFudGVydSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX01JWEVEX0FUVEFDSE1FTlRfU0FNUExFU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX21peGVkX2F0dGFjaG1lbnRfc2FtcGxlcyZxdW90OyIgICBuYW1lPSJWS19BTURfTUlYRURfQVRUQUNITUVOVF9TQU1QTEVTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9zaGFkZXJfZnJhZ21lbnRfbWFzayIgbnVtYmVyPSIxMzgiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJBYXJvbiBIYWdhbiBAQWFyb25IYWdhbkFNRCIgc3VwcG9ydGVkPSJ2dWxrYW4iIHR5cGU9ImRldmljZSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfU0hBREVSX0ZSQUdNRU5UX01BU0tfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9zaGFkZXJfZnJhZ21lbnRfbWFzayZxdW90OyIgICAgICAgbmFtZT0iVktfQU1EX1NIQURFUl9GUkFHTUVOVF9NQVNLX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jayIgbnVtYmVyPSIxMzkiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJFWFQiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMixWS19LSFJfbWFpbnRlbmFuY2UxIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGFxbnVlcCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0lOTElORV9VTklGT1JNX0JMT0NLX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfaW5saW5lX3VuaWZvcm1fYmxvY2smcXVvdDsiICAgIG5hbWU9IlZLX0VYVF9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtEZXNjcmlwdG9yVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRkVBVFVSRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX1BST1BFUlRJRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0lOTElORV9VTklGT1JNX0JMT0NLX0NSRUFURV9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzE0MCIgbnVtYmVyPSIxNDAiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYWlzIEFsbmFzc2VyIEBtYWxuYXNzZSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzE0MF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8xNDAmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzE0MF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0IiBudW1iZXI9IjE0MSIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkVYVCIgY29udGFjdD0iRG9taW5payBXaXRjemFrIEBkb21pbmlrd2l0Y3pha2FtZCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX1NIQURFUl9TVEVOQ0lMX0VYUE9SVF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX3NoYWRlcl9zdGVuY2lsX2V4cG9ydCZxdW90OyIgICAgICBuYW1lPSJWS19FWFRfU0hBREVSX1NURU5DSUxfRVhQT1JUX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMTQyIiBudW1iZXI9IjE0MiIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9Ik1haXMgQWxuYXNzZXIgQG1hbG5hc3NlIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMTQyX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzE0MiZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMTQyX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMTQzIiBudW1iZXI9IjE0MyIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9Ik1haXMgQWxuYXNzZXIgQG1hbG5hc3NlIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMTQzX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzE0MyZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMTQzX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIiBudW1iZXI9IjE0NCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFNRCIgY29udGFjdD0iRGFuaWVsIFJha29zIEBkcmFrb3MtYW1kIiBzdXBwb3J0ZWQ9InZ1bGthbiIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9TQU1QTEVfTE9DQVRJT05TX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyZxdW90OyIgICAgICAgICAgIG5hbWU9IlZLX0VYVF9TQU1QTEVfTE9DQVRJT05TX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxMiIgZXh0ZW5kcz0iVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX1NBTVBMRV9MT0NBVElPTlNfQkVHSU5fSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TQU1QTEVfTE9DQVRJT05TX1NUQVRFX0NSRUFURV9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVfTE9DQVRJT05TX1BST1BFUlRJRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI0IiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTVVMVElTQU1QTEVfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrRHluYW1pY1N0YXRlIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19EWU5BTUlDX1NUQVRFX1NBTVBMRV9MT0NBVElPTlNfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTYW1wbGVMb2NhdGlvbkVYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9yZWxheGVkX2Jsb2NrX2xheW91dCIgbnVtYmVyPSIxNDUiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkpvaG4gS2Vzc2VuaWNoIEBqb2hua3NsYW5nIiBzdXBwb3J0ZWQ9InZ1bGthbiIgcHJvbW90ZWR0bz0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1JFTEFYRURfQkxPQ0tfTEFZT1VUX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfcmVsYXhlZF9ibG9ja19sYXlvdXQmcXVvdDsiICAgICAgIG5hbWU9IlZLX0tIUl9SRUxBWEVEX0JMT0NLX0xBWU9VVF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJSRVNFUlZFRF9ET19OT1RfVVNFXzE0NiIgbnVtYmVyPSIxNDYiIHN1cHBvcnRlZD0iZGlzYWJsZWQiIGNvbW1lbnQ9IlVzZWQgZm9yIGZ1bmN0aW9uYWxpdHkgc3Vic3VtZWQgaW50byBWdWxrYW4gMS4xIGFuZCBub3QgcHVibGlzaGVkIGFzIGFuIGV4dGVuc2lvbiI+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIiIG51bWJlcj0iMTQ3IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKYXNvbiBFa3N0cmFuZCBAamVrc3RyYW5kIiBzdXBwb3J0ZWQ9InZ1bGthbiIgcHJvbW90ZWR0bz0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiIG5hbWU9IlZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyJnF1b3Q7IiAgIG5hbWU9IlZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1BBUlNFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9pbWFnZV9mb3JtYXRfbGlzdCIgbnVtYmVyPSIxNDgiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9Ikphc29uIEVrc3RyYW5kIEBqZWtzdHJhbmQiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9JTUFHRV9GT1JNQVRfTElTVF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2ltYWdlX2Zvcm1hdF9saXN0JnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19LSFJfSU1BR0VfRk9STUFUX0xJU1RfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfTElTVF9DUkVBVEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2JsZW5kX29wZXJhdGlvbl9hZHZhbmNlZCIgbnVtYmVyPSIxNDkiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJOViIgY29udGFjdD0iSmVmZiBCb2x6IEBqZWZmYm9sem52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkJnF1b3Q7IiAgIG5hbWU9IlZLX0VYVF9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX0ZFQVRVUkVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQmxlbmRPdmVybGFwRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfWkVST19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9TUkNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfRFNUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX1NSQ19PVkVSX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNCIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0RTVF9PVkVSX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNSIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX1NSQ19JTl9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjYiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9EU1RfSU5fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI3IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfU1JDX09VVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjgiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9EU1RfT1VUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iOSIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX1NSQ19BVE9QX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMTAiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0RTVF9BVE9QX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMTEiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX1hPUl9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEyIiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9NVUxUSVBMWV9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEzIiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9TQ1JFRU5fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxNCIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfT1ZFUkxBWV9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjE1IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9EQVJLRU5fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxNiIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfTElHSFRFTl9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjE3IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9DT0xPUkRPREdFX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMTgiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0NPTE9SQlVSTl9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjE5IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9IQVJETElHSFRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyMCIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfU09GVExJR0hUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMjEiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0RJRkZFUkVOQ0VfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyMiIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfRVhDTFVTSU9OX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMjMiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0lOVkVSVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjI0IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9JTlZFUlRfUkdCX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMjUiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0xJTkVBUkRPREdFX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMjYiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0xJTkVBUkJVUk5fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyNyIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfVklWSURMSUdIVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjI4IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9MSU5FQVJMSUdIVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjI5IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9QSU5MSUdIVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjMwIiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9IQVJETUlYX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMzEiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0hTTF9IVUVfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzMiIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfSFNMX1NBVFVSQVRJT05fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzMyIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfSFNMX0NPTE9SX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMzQiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0hTTF9MVU1JTk9TSVRZX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMzUiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX1BMVVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzNiIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfUExVU19DTEFNUEVEX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMzciIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX1BMVVNfQ0xBTVBFRF9BTFBIQV9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjM4IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9QTFVTX0RBUktFUl9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjM5IiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9NSU5VU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjQwIiBleHRlbmRzPSJWa0JsZW5kT3AiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19CTEVORF9PUF9NSU5VU19DTEFNUEVEX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNDEiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0NPTlRSQVNUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNDIiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0lOVkVSVF9PVkdfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI0MyIgZXh0ZW5kcz0iVmtCbGVuZE9wIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQkxFTkRfT1BfUkVEX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNDQiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0dSRUVOX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNDUiIGV4dGVuZHM9IlZrQmxlbmRPcCIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0JMRU5EX09QX0JMVUVfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxOSIgZXh0ZW5kcz0iVmtBY2Nlc3NGbGFnQml0cyIgICAgICAgICAgICAgICAgbmFtZT0iVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfUkVBRF9OT05DT0hFUkVOVF9CSVRfRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2ZyYWdtZW50X2NvdmVyYWdlX3RvX2NvbG9yIiBudW1iZXI9IjE1MCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9Ik5WIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0ZSQUdNRU5UX0NPVkVSQUdFX1RPX0NPTE9SX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9mcmFnbWVudF9jb3ZlcmFnZV90b19jb2xvciZxdW90OyIgIG5hbWU9IlZLX05WX0ZSQUdNRU5UX0NPVkVSQUdFX1RPX0NPTE9SX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfVE9fQ09MT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVGbGFnc05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2V4dGVuc2lvbl8xNTEiIG51bWJlcj0iMTUxIiBhdXRob3I9Ik5WIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzE1MV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZW5zaW9uXzE1MSZxdW90OyIgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMTUxX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxMSIgZXh0ZW5kcz0iVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX0VYVEVOU0lPTl8xNTFfQklUMF9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjkiIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1JFU0VSVkVEXzI5X0JJVF9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTQiIGV4dGVuZHM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgICAgIG5hbWU9IlZLX1BJUEVMSU5FX0NSRUFURV9FWFRFTlNJT05fMTUxX0JJVDFfTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE1IiBleHRlbmRzPSJWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMiICAgICAgICBuYW1lPSJWS19QSVBFTElORV9DUkVBVEVfRVhURU5TSU9OXzE1MV9CSVQyX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxNiIgZXh0ZW5kcz0iVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX0VYVEVOU0lPTl8xNTFfQklUM19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTciIGV4dGVuZHM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgICAgIG5hbWU9IlZLX1BJUEVMSU5FX0NSRUFURV9FWFRFTlNJT05fMTUxX0JJVDRfTlYiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfZXh0ZW5zaW9uXzE1MiIgbnVtYmVyPSIxNTIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMTUyX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9leHRlbnNpb25fMTUyJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVOU0lPTl8xNTJfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlcyIgbnVtYmVyPSIxNTMiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJOViIgY29udGFjdD0iSmVmZiBCb2x6IEBqZWZmYm9sem52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzJnF1b3Q7IiAgIG5hbWU9IlZLX05WX0ZSQU1FQlVGRkVSX01JWEVEX1NBTVBMRVNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9NT0RVTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlRmxhZ3NOViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQ292ZXJhZ2VNb2R1bGF0aW9uTW9kZU5WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2ZpbGxfcmVjdGFuZ2xlIiBudW1iZXI9IjE1NCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9Ik5WIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0ZJTExfUkVDVEFOR0xFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9maWxsX3JlY3RhbmdsZSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0ZJTExfUkVDVEFOR0xFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1BvbHlnb25Nb2RlIiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfUE9MWUdPTl9NT0RFX0ZJTExfUkVDVEFOR0xFX05WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX3NoYWRlcl9zbV9idWlsdGlucyIgbnVtYmVyPSIxNTUiIHR5cGU9ImRldmljZSIgcmVxdWlyZXNDb3JlPSIxLjEiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX1NIQURFUl9TTV9CVUlMVElOU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfc2hhZGVyX3NtX2J1aWx0aW5zJnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19OVl9TSEFERVJfU01fQlVJTFRJTlNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19QUk9QRVJUSUVTX05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX3Bvc3RfZGVwdGhfY292ZXJhZ2UiIG51bWJlcj0iMTU2IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9QT1NUX0RFUFRIX0NPVkVSQUdFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfcG9zdF9kZXB0aF9jb3ZlcmFnZSZxdW90OyIgICAgICAgIG5hbWU9IlZLX0VYVF9QT1NUX0RFUFRIX0NPVkVSQUdFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24iIG51bWJlcj0iMTU3IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfbWFpbnRlbmFuY2UxLFZLX0tIUl9iaW5kX21lbW9yeTIsVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMixWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkFuZHJldyBHYXJyYXJkIEBmbHVwcGV0ZWVyIiBzdXBwb3J0ZWQ9InZ1bGthbiIgcHJvbW90ZWR0bz0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjE0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiZxdW90OyIgICBuYW1lPSJWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9QTEFORV9NRU1PUllfSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfUExBTkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRkVBVFVSRVNfS0hSIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU1BR0VfRk9STUFUX1BST1BFUlRJRVMiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0tIUl9FWFQiIGFsaWFzPSJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrT2JqZWN0VHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9LSFIiIGFsaWFzPSJWS19PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzhCOEc4UjhfNDIyX1VOT1JNX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk0iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfQjhHOFI4RzhfNDIyX1VOT1JNX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk0iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STV9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk1fS0hSIiBhbGlhcz0iVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMF9VTk9STSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STV9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIyX1VOT1JNIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80NDRfVU5PUk1fS0hSIiBhbGlhcz0iVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80NDRfVU5PUk0iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2X0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2X0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9SMTBYNkcxMFg2X1VOT1JNXzJQQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUjEwWDZHMTBYNkIxMFg2QTEwWDZfVU5PUk1fNFBBQ0sxNl9LSFIiIGFsaWFzPSJWS19GT1JNQVRfUjEwWDZHMTBYNkIxMFg2QTEwWDZfVU5PUk1fNFBBQ0sxNiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNl9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTZfS0hSIiBhbGlhcz0iVktfRk9STUFUX0IxMFg2RzEwWDZSMTBYNkcxMFg2XzQyMl9VTk9STV80UEFDSzE2Ii8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2Ii8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSIiBhbGlhcz0iVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2X0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2X0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9SMTJYNF9VTk9STV9QQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUjEyWDRHMTJYNF9VTk9STV8yUEFDSzE2X0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfUjEyWDRHMTJYNEIxMlg0QTEyWDRfVU5PUk1fNFBBQ0sxNl9LSFIiIGFsaWFzPSJWS19GT1JNQVRfUjEyWDRHMTJYNEIxMlg0QTEyWDRfVU5PUk1fNFBBQ0sxNiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTJYNEIxMlg0RzEyWDRSMTJYNF80MjJfVU5PUk1fNFBBQ0sxNl9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzEyWDRCMTJYNEcxMlg0UjEyWDRfNDIyX1VOT1JNXzRQQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfQjEyWDRHMTJYNFIxMlg0RzEyWDRfNDIyX1VOT1JNXzRQQUNLMTZfS0hSIiBhbGlhcz0iVktfRk9STUFUX0IxMlg0RzEyWDRSMTJYNEcxMlg0XzQyMl9VTk9STV80UEFDSzE2Ii8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2Ii8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSIiBhbGlhcz0iVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2X0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzE2QjE2RzE2UjE2XzQyMl9VTk9STV9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzE2QjE2RzE2UjE2XzQyMl9VTk9STSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk1fS0hSIiBhbGlhcz0iVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk0iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIwX1VOT1JNX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjBfVU5PUk0iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STV9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjJfVU5PUk1fS0hSIiBhbGlhcz0iVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUiIgYWxpYXM9IlZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVF9LSFIiIGFsaWFzPSJWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSIiBhbGlhcz0iVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVF9LSFIiIGFsaWFzPSJWS19JTUFHRV9DUkVBVEVfRElTSk9JTlRfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfTUlEUE9JTlRfQ0hST01BX1NBTVBMRVNfQklUX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9GRUFUVVJFX01JRFBPSU5UX0NIUk9NQV9TQU1QTEVTX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9MSU5FQVJfRklMVEVSX0JJVF9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fTElORUFSX0ZJTFRFUl9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVF9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfQklUX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfQklUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMiICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9GT1JDRUFCTEVfQklUX0tIUiIgYWxpYXM9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfRk9SQ0VBQkxFX0JJVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX0RJU0pPSU5UX0JJVF9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRkVBVFVSRV9ESVNKT0lOVF9CSVQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVF9LSFIiIGFsaWFzPSJWS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbktIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIiAgICAgICAgICAgICAgIG5hbWU9IlZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SR0JfSURFTlRJVFlfS0hSIiBhbGlhcz0iVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1JHQl9JREVOVElUWSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIiAgICAgICAgICAgICAgIG5hbWU9IlZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl9JREVOVElUWV9LSFIiIGFsaWFzPSJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfSURFTlRJVFkiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbiIgICAgICAgICAgICAgICBuYW1lPSJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfNzA5X0tIUiIgYWxpYXM9IlZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl83MDkiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbiIgICAgICAgICAgICAgICBuYW1lPSJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfNjAxX0tIUiIgYWxpYXM9IlZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl82MDEiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbiIgICAgICAgICAgICAgICBuYW1lPSJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfMjAyMF9LSFIiIGFsaWFzPSJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfMjAyMCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2FtcGxlclljYmNyUmFuZ2VLSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1NhbXBsZXJZY2JjclJhbmdlIiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMX0tIUiIgYWxpYXM9IlZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX0ZVTEwiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1NhbXBsZXJZY2JjclJhbmdlIiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9OQVJST1dfS0hSIiBhbGlhcz0iVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtDaHJvbWFMb2NhdGlvbktIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrQ2hyb21hTG9jYXRpb24iICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU5fS0hSIiBhbGlhcz0iVktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrQ2hyb21hTG9jYXRpb24iICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVF9LSFIiIGFsaWFzPSJWS19DSFJPTUFfTE9DQVRJT05fTUlEUE9JTlQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgICAgIDxyZXF1aXJlIGV4dGVuc2lvbj0iVktfRVhUX2RlYnVnX3JlcG9ydCI+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQiIG9mZnNldD0iMCIgICAgICAgbmFtZT0iVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2JpbmRfbWVtb3J5MiIgbnVtYmVyPSIxNTgiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IlRvYmlhcyBIZWN0b3IgQHRvYnNraSIgc3VwcG9ydGVkPSJ2dWxrYW4iIHByb21vdGVkdG89IlZLX1ZFUlNJT05fMV8xIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9CSU5EX01FTU9SWV8yX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfYmluZF9tZW1vcnkyJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtCaW5kQnVmZmVyTWVtb3J5MktIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQmluZEltYWdlTWVtb3J5MktIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GT19LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfQ1JFQVRFX0FMSUFTX0JJVF9LSFIiIGFsaWFzPSJWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kQnVmZmVyTWVtb3J5SW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQmluZEltYWdlTWVtb3J5SW5mb0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllciIgbnVtYmVyPSIxNTkiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9iaW5kX21lbW9yeTIsVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIsVktfS0hSX2ltYWdlX2Zvcm1hdF9saXN0LFZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24iIGF1dGhvcj0iRVhUIiBjb250YWN0PSJDaGFkIFZlcnNhY2UgQGNoYWR2ZXJzYXJ5IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXImcXVvdDsiICBuYW1lPSJWS19FWFRfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFRFTlNJT05fTkFNRSIvPgorCisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBkaXI9Ii0iIGV4dGVuZHM9IlZrUmVzdWx0IiBuYW1lPSJWS19FUlJPUl9JTlZBTElEX0RSTV9GT1JNQVRfTU9ESUZJRVJfUExBTkVfTEFZT1VUX0VYVCIvPgorCisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19MSVNUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjQiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjUiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0VYVCIvPgorCisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa0ltYWdlVGlsaW5nIiBuYW1lPSJWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQiLz4KKworICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNyIgIGV4dGVuZHM9IlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIgbmFtZT0iVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8wX0JJVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjgiICBleHRlbmRzPSJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiIG5hbWU9IlZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfMV9CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSI5IiAgZXh0ZW5kcz0iVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiBuYW1lPSJWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzJfQklUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTAiIGV4dGVuZHM9IlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIgbmFtZT0iVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8zX0JJVF9FWFQiLz4KKworICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIi8+CisKKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9leHRlbnNpb25fMTYwIiBudW1iZXI9IjE2MCIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9Ik1hcmsgWW91bmcgQG1hcmt5LWx1bmFyZyIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURU5TSU9OXzE2MF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2V4dGVuc2lvbl8xNjAmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURU5TSU9OXzE2MF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSIgbnVtYmVyPSIxNjEiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJHT09HTEUiIGNvbnRhY3Q9IkNvcnQgU3RyYXR0b24gQGNkd2ZzIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfVkFMSURBVElPTl9DQUNIRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX3ZhbGlkYXRpb25fY2FjaGUmcXVvdDsiICAgICAgICAgICBuYW1lPSJWS19FWFRfVkFMSURBVElPTl9DQUNIRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtPYmplY3RUeXBlIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUIiBjb21tZW50PSJWa1ZhbGlkYXRpb25DYWNoZUVYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrVmFsaWRhdGlvbkNhY2hlRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtWYWxpZGF0aW9uQ2FjaGVIZWFkZXJWZXJzaW9uRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVGbGFnc0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmciIG51bWJlcj0iMTYyIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMixWS19LSFJfbWFpbnRlbmFuY2UzIiBhdXRob3I9Ik5WIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9ERVNDUklQVE9SX0lOREVYSU5HX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZyZxdW90OyIgICAgIG5hbWU9IlZLX0VYVF9ERVNDUklQVE9SX0lOREVYSU5HX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0JJTkRJTkdfRkxBR1NfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfRkVBVFVSRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjMiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0FMTE9DQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI0IiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9MQVlPVVRfU1VQUE9SVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEiIGV4dGVuZHM9IlZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0cyIgbmFtZT0iVktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxIiBleHRlbmRzPSJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cyIgbmFtZT0iVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGRpcj0iLSIgZXh0ZW5kcz0iVmtSZXN1bHQiICAgICAgICAgICAgICBuYW1lPSJWS19FUlJPUl9GUkFHTUVOVEFUSU9OX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9zaGFkZXJfdmlld3BvcnRfaW5kZXhfbGF5ZXIiIG51bWJlcj0iMTYzIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9TSEFERVJfVklFV1BPUlRfSU5ERVhfTEFZRVJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9zaGFkZXJfdmlld3BvcnRfaW5kZXhfbGF5ZXImcXVvdDsiIG5hbWU9IlZLX0VYVF9TSEFERVJfVklFV1BPUlRfSU5ERVhfTEFZRVJfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfZXh0ZW5zaW9uXzE2NCIgbnVtYmVyPSIxNjQiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8xNjRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2V4dGVuc2lvbl8xNjQmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8xNjRfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlIiBudW1iZXI9IjE2NSIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlBhdCBCcm93biBAbnZwYnJvd24iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX1NIQURJTkdfUkFURV9JTUFHRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfc2hhZGluZ19yYXRlX2ltYWdlJnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19OVl9TSEFESU5HX1JBVEVfSU1BR0VfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfSU1BR0VfU1RBVEVfQ1JFQVRFX0lORk9fTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX0ZFQVRVUkVTX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9QUk9QRVJUSUVTX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa0ltYWdlTGF5b3V0IiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX1NIQURJTkdfUkFURV9PUFRJTUFMX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI0IiBleHRlbmRzPSJWa0R5bmFtaWNTdGF0ZSIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfUEFMRVRURV9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjMiIGV4dGVuZHM9IlZrQWNjZXNzRmxhZ0JpdHMiICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FDQ0VTU19TSEFESU5HX1JBVEVfSU1BR0VfUkVBRF9CSVRfTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjgiIGV4dGVuZHM9IlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyMiIgZXh0ZW5kcz0iVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiICAgICAgICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjYiIGV4dGVuZHM9IlZrRHluYW1pY1N0YXRlIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9yYXlfdHJhY2luZyIgbnVtYmVyPSIxNjYiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyLFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkVyaWMgV2VybmVzcyBAZXdlcm5lc3MiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX1JBWV9UUkFDSU5HX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9yYXlfdHJhY2luZyZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU0hBREVSX1VOVVNFRF9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI0IiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI1IiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfQUFCQl9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfSU5GT19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjgiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iOSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SQVlfVFJBQ0lOR19QUk9QRVJUSUVTX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSI4IiBleHRlbmRzPSJWa1NoYWRlclN0YWdlRmxhZ0JpdHMiICAgICAgICAgbmFtZT0iVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjkiIGV4dGVuZHM9IlZrU2hhZGVyU3RhZ2VGbGFnQml0cyIgICAgICAgICBuYW1lPSJWS19TSEFERVJfU1RBR0VfQU5ZX0hJVF9CSVRfTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEwIiBleHRlbmRzPSJWa1NoYWRlclN0YWdlRmxhZ0JpdHMiICAgICAgICBuYW1lPSJWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxMSIgZXh0ZW5kcz0iVmtTaGFkZXJTdGFnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfU0hBREVSX1NUQUdFX01JU1NfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxMiIgZXh0ZW5kcz0iVmtTaGFkZXJTdGFnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfU0hBREVSX1NUQUdFX0lOVEVSU0VDVElPTl9CSVRfTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEzIiBleHRlbmRzPSJWa1NoYWRlclN0YWdlRmxhZ0JpdHMiICAgICAgICBuYW1lPSJWS19TSEFERVJfU1RBR0VfQ0FMTEFCTEVfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyMSIgZXh0ZW5kcz0iVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiICAgICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfUkFZX1RSQUNJTkdfU0hBREVSX0JJVF9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjUiIGV4dGVuZHM9IlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIiAgICAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQlVJTERfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxMCIgZXh0ZW5kcz0iVmtCdWZmZXJVc2FnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtQaXBlbGluZUJpbmRQb2ludCIgICAgICAgICAgIG5hbWU9IlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrRGVzY3JpcHRvclR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19ERVNDUklQVE9SX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjEiIGV4dGVuZHM9IlZrQWNjZXNzRmxhZ0JpdHMiICAgICAgICAgICAgIG5hbWU9IlZLX0FDQ0VTU19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1JFQURfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyMiIgZXh0ZW5kcz0iVmtBY2Nlc3NGbGFnQml0cyIgICAgICAgICAgICAgbmFtZT0iVktfQUNDRVNTX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfV1JJVEVfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1F1ZXJ5VHlwZSIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfUVVFUllfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NPTVBBQ1RFRF9TSVpFX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSI1IiBleHRlbmRzPSJWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMiICAgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX0RFRkVSX0NPTVBJTEVfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa09iamVjdFR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQiICAgIG5hbWU9IlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtJbmRleFR5cGUiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lOREVYX1RZUEVfTk9ORV9OViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtHZW9tZXRyeVRyaWFuZ2xlc05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtHZW9tZXRyeUFBQkJOViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrR2VvbWV0cnlEYXRhTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0dlb21ldHJ5TlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0dlb21ldHJ5RmxhZ3NOViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrR2VvbWV0cnlJbnN0YW5jZUZsYWdzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0dlb21ldHJ5RmxhZ0JpdHNOViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0dlb21ldHJ5VHlwZU5WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeVJlcXVpcmVtZW50czJLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRUcmFjZVJheXNOViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NvbXBpbGVEZWZlcnJlZE5WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX3JlcHJlc2VudGF0aXZlX2ZyYWdtZW50X3Rlc3QiIG51bWJlcj0iMTY3IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IktlZGFybmF0aCBUaGFuZ3VkdSBAa3RoYW5ndWR1IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9yZXByZXNlbnRhdGl2ZV9mcmFnbWVudF90ZXN0JnF1b3Q7IiBuYW1lPSJWS19OVl9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9GRUFUVVJFU19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9TVEFURV9DUkVBVEVfSU5GT19OViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fMTY4IiBudW1iZXI9IjE2OCIgYXV0aG9yPSJOViIgY29udGFjdD0iRGFuaWVsIEtvY2ggQGRna29jaCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURU5TSU9OXzE2OF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZW5zaW9uXzE2OCZxdW90OyIgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURU5TSU9OXzE2OF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfbWFpbnRlbmFuY2UzIiBudW1iZXI9IjE2OSIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0idnVsa2FuIiBwcm9tb3RlZHRvPSJWS19WRVJTSU9OXzFfMSI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfTUFJTlRFTkFOQ0UzX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfbWFpbnRlbmFuY2UzJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTX0tIUiIgYWxpYXM9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVMiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVF9LSFIiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQiIG51bWJlcj0iMTcwIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJQaWVycyBEYW5pZWxsIEBwZGFuaWVsbC1udiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0RSQVdfSU5ESVJFQ1RfQ09VTlRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50JnF1b3Q7IiAgICAgbmFtZT0iVktfS0hSX0RSQVdfSU5ESVJFQ1RfQ09VTlRfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2ZpbHRlcl9jdWJpYyIgbnVtYmVyPSIxNzEiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0lNR19maWx0ZXJfY3ViaWMiIGF1dGhvcj0iUUNPTSIgY29udGFjdD0iQmlsbCBMaWNlYS1LYW5lIEB3d2xrIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRklMVEVSX0NVQklDX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfZmlsdGVyX2N1YmljJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9GSUxURVJfQ1VCSUNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa0ZpbHRlciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19GSUxURVJfQ1VCSUNfRVhUIiBhbGlhcz0iVktfRklMVEVSX0NVQklDX0lNRyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9FWFQiIGFsaWFzPSJWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfSU1HIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRklMVEVSX0NVQklDX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfUUNPTV9leHRlbnNpb25fMTcyIiBudW1iZXI9IjE3MiIgYXV0aG9yPSJRQ09NIiBjb250YWN0PSJCaWxsIExpY2VhLUthbmUgQHd3bGsiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfUUNPTV9leHRlbnNpb25fMTcyX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19RQ09NX2V4dGVuc2lvbl8xNzImcXVvdDsiICAgICAgICAgICAgIG5hbWU9IlZLX1FDT01fZXh0ZW5zaW9uXzE3Ml9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgZXh0ZW5kcz0iVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0cyIgICAgIG5hbWU9IlZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUkVTRVJWRURfMl9CSVRfUUNPTSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMyIgZXh0ZW5kcz0iVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0cyIgICAgIG5hbWU9IlZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUkVTRVJWRURfM19CSVRfUUNPTSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19RQ09NX2V4dGVuc2lvbl8xNzMiIG51bWJlcj0iMTczIiBhdXRob3I9IlFDT00iIGNvbnRhY3Q9IkJpbGwgTGljZWEtS2FuZSBAd3dsayIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19RQ09NX2V4dGVuc2lvbl8xNzNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX1FDT01fZXh0ZW5zaW9uXzE3MyZxdW90OyIgICAgICAgICAgICAgbmFtZT0iVktfUUNPTV9leHRlbnNpb25fMTczX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX1FDT01fZXh0ZW5zaW9uXzE3NCIgbnVtYmVyPSIxNzQiIGF1dGhvcj0iUUNPTSIgY29udGFjdD0iQmlsbCBMaWNlYS1LYW5lIEB3d2xrIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1FDT01fZXh0ZW5zaW9uXzE3NF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfUUNPTV9leHRlbnNpb25fMTc0JnF1b3Q7IiAgICAgICAgICAgICBuYW1lPSJWS19RQ09NX2V4dGVuc2lvbl8xNzRfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2dsb2JhbF9wcmlvcml0eSIgbnVtYmVyPSIxNzUiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IkFuZHJlcyBSb2RyaWd1ZXogQGxvc3Rnb2F0IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfR0xPQkFMX1BSSU9SSVRZX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfZ2xvYmFsX3ByaW9yaXR5JnF1b3Q7IiAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9HTE9CQUxfUFJJT1JJVFlfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0NSRUFURV9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZGlyPSItIiBleHRlbmRzPSJWa1Jlc3VsdCIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VSUk9SX05PVF9QRVJNSVRURURfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUXVldWVHbG9iYWxQcmlvcml0eUVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfc2hhZGVyX3N1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzIiBudW1iZXI9IjE3NiIgdHlwZT0iZGV2aWNlIiByZXF1aXJlc0NvcmU9IjEuMSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9Ik5laWwgSGVubmluZyBAc2hlcmVkb20iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfc2hhZGVyX3N1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzJnF1b3Q7IiBuYW1lPSJWS19LSFJfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX0ZFQVRVUkVTX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZXh0ZW5zaW9uXzE3NyIgbnVtYmVyPSIxNzciIGF1dGhvcj0iRVhUIiBjb250YWN0PSJOZWlsIEhlbm5pbmcgQHNoZXJlZG9tIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMTc3X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZW5zaW9uXzE3NyZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMTc3X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl84Yml0X3N0b3JhZ2UiIG51bWJlcj0iMTc4IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMixWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkFsZXhhbmRlciBHYWxhemluIEBhbGVnYWwtYXJtIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfOEJJVF9TVE9SQUdFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfOGJpdF9zdG9yYWdlJnF1b3Q7IiAgICAgICAgICAgIG5hbWU9IlZLX0tIUl84QklUX1NUT1JBR0VfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9leHRlcm5hbF9tZW1vcnlfaG9zdCIgbnVtYmVyPSIxNzkiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJFWFQiIHJlcXVpcmVzPSJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5IiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9FWFRFUk5BTF9NRU1PUllfSE9TVF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0JnF1b3Q7IiAgICAgICBuYW1lPSJWS19FWFRfRVhURVJOQUxfTUVNT1JZX0hPU1RfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0hPU1RfUE9JTlRFUl9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9IT1NUX1BPSU5URVJfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfTUVNT1JZX0hPU1RfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjciIGV4dGVuZHM9IlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMiIG5hbWU9IlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX0FMTE9DQVRJT05fQklUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iOCIgZXh0ZW5kcz0iVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyIgbmFtZT0iVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfTUFQUEVEX0ZPUkVJR05fTUVNT1JZX0JJVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9idWZmZXJfbWFya2VyIiBudW1iZXI9IjE4MCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFNRCIgY29udGFjdD0iRGFuaWVsIFJha29zIEBkcmFrb3MtYW1kIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfQlVGRkVSX01BUktFUl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2J1ZmZlcl9tYXJrZXImcXVvdDsiICAgICAgICAgICBuYW1lPSJWS19BTURfQlVGRkVSX01BUktFUl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX3NoYWRlcl9hdG9taWNfaW50NjQiIG51bWJlcj0iMTgxIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iS0hSIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGNvbnRhY3Q9IkFhcm9uIEhhZ2FuIEBhaGFnYW4iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9TSEFERVJfQVRPTUlDX0lOVDY0X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfc2hhZGVyX2F0b21pY19pbnQ2NCZxdW90OyIgICAgICAgIG5hbWU9IlZLX0tIUl9TSEFERVJfQVRPTUlDX0lOVDY0X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9BVE9NSUNfSU5UNjRfRkVBVFVSRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX3NoYWRlcl9jbG9jayIgbnVtYmVyPSIxODIiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgY29udGFjdD0iQWFyb24gSGFnYW4gQGFoYWdhbiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1NIQURFUl9DTE9DS19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3NoYWRlcl9jbG9jayZxdW90OyIgICAgICAgICAgICBuYW1lPSJWS19LSFJfU0hBREVSX0NMT0NLX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DTE9DS19GRUFUVVJFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzE4MyIgbnVtYmVyPSIxODMiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8xODNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fMTgzJnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8xODNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX3BpcGVsaW5lX2NvbXBpbGVyX2NvbnRyb2wiIG51bWJlcj0iMTg0IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYXR0aGFldXMgRy4gQ2hhamRhcyBAYW50ZXJ1IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX3BpcGVsaW5lX2NvbXBpbGVyX2NvbnRyb2wmcXVvdDsiICBuYW1lPSJWS19BTURfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTVBJTEVSX0NPTlRST0xfQ1JFQVRFX0lORk9fQU1EIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdCaXRzQU1EIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdzQU1EIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyIgbnVtYmVyPSIxODUiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IkRhbmllbCBSYWtvcyBAZHJha29zLWFtZCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0NBTElCUkFURURfVElNRVNUQU1QU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyZxdW90OyIgICAgICBuYW1lPSJWS19FWFRfQ0FMSUJSQVRFRF9USU1FU1RBTVBTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQ0FMSUJSQVRFRF9USU1FU1RBTVBfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1RpbWVEb21haW5FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMiIG51bWJlcj0iMTg2IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iQU1EIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGNvbnRhY3Q9Ik1hcnRpbiBEaW5rb3YgQG1kaW5rb3YiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfc2hhZGVyX2NvcmVfcHJvcGVydGllcyZxdW90OyIgIG5hbWU9IlZLX0FNRF9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfQU1EIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMTg3IiBudW1iZXI9IjE4NyIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IkRhbmllbCBSYWtvcyBAZHJha29zLWFtZCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzE4N19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8xODcmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzE4N19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzE4OCIgbnVtYmVyPSIxODgiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8xODhfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fMTg4JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8xODhfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX2V4dGVuc2lvbl8xODkiIG51bWJlcj0iMTg5IiBhdXRob3I9IkFNRCIgY29udGFjdD0iRGFuaWVsIFJha29zIEBkcmFrb3MtYW1kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMTg5X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzE4OSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMTg5X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9tZW1vcnlfb3ZlcmFsbG9jYXRpb25fYmVoYXZpb3IiIG51bWJlcj0iMTkwIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYXJ0aW4gRGlua292IEBtZGlua292IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfbWVtb3J5X292ZXJhbGxvY2F0aW9uX2JlaGF2aW9yJnF1b3Q7IiAgICBuYW1lPSJWS19BTURfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTUQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yIiBudW1iZXI9IjE5MSIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlZpa3JhbSBLdXNod2FoYSBAdmt1c2h3YWhhIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF92ZXJ0ZXhfYXR0cmlidXRlX2Rpdmlzb3ImcXVvdDsiICAgbmFtZT0iVktfRVhUX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9QUk9QRVJUSUVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX0RJVklTT1JfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0ZFQVRVUkVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfR0dQX2ZyYW1lX3Rva2VuIiBudW1iZXI9IjE5MiIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX3N3YXBjaGFpbixWS19HR1Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSIgcGxhdGZvcm09ImdncCIgYXV0aG9yPSJHR1AiIGNvbnRhY3Q9IkplYW4tRnJhbmNvaXMgUm95IEBqZnJveSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0dHUF9GUkFNRV9UT0tFTl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfR0dQX2ZyYW1lX3Rva2VuJnF1b3Q7IiAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfR0dQX0ZSQU1FX1RPS0VOX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfRlJBTUVfVE9LRU5fR0dQIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQcmVzZW50RnJhbWVUb2tlbkdHUCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfcGlwZWxpbmVfY3JlYXRpb25fZmVlZGJhY2siIG51bWJlcj0iMTkzIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iR09PR0xFIiBjb250YWN0PSJKZWFuLUZyYW5jb2lzIFJveSBAamZyb3kiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfcGlwZWxpbmVfY3JlYXRpb25fZmVlZGJhY2smcXVvdDsiIG5hbWU9IlZLX0VYVF9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ3NFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19HT09HTEVfZXh0ZW5zaW9uXzE5NCIgbnVtYmVyPSIxOTQiIGF1dGhvcj0iR09PR0xFIiBjb250YWN0PSJKZWFuLUZyYW5jb2lzIFJveSBAamZyb3kiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19HT09HTEVfRVhURU5TSU9OXzE5NF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfR09PR0xFX2V4dGVuc2lvbl8xOTQmcXVvdDsiICAgICAgIG5hbWU9IlZLX0dPT0dMRV9FWFRFTlNJT05fMTk0X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0dPT0dMRV9leHRlbnNpb25fMTk1IiBudW1iZXI9IjE5NSIgYXV0aG9yPSJHT09HTEUiIGNvbnRhY3Q9IkplYW4tRnJhbmNvaXMgUm95IEBqZnJveSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0dPT0dMRV9FWFRFTlNJT05fMTk1X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19HT09HTEVfZXh0ZW5zaW9uXzE5NSZxdW90OyIgICAgICAgbmFtZT0iVktfR09PR0xFX0VYVEVOU0lPTl8xOTVfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfR09PR0xFX2V4dGVuc2lvbl8xOTYiIG51bWJlcj0iMTk2IiBhdXRob3I9IkdPT0dMRSIgY29udGFjdD0iSmVhbi1GcmFuY29pcyBSb3kgQGpmcm95IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfR09PR0xFX0VYVEVOU0lPTl8xOTZfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0dPT0dMRV9leHRlbnNpb25fMTk2JnF1b3Q7IiAgICAgICBuYW1lPSJWS19HT09HTEVfRVhURU5TSU9OXzE5Nl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZHJpdmVyX3Byb3BlcnRpZXMiIG51bWJlcj0iMTk3IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkRhbmllbCBSYWtvcyBAZHJha29zLWFtZCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRFJJVkVSX1BST1BFUlRJRVNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9kcml2ZXJfcHJvcGVydGllcyZxdW90OyIgICAgICBuYW1lPSJWS19LSFJfRFJJVkVSX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9EUklWRVJfUFJPUEVSVElFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBuYW1lPSJWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBuYW1lPSJWS19NQVhfRFJJVkVSX0lORk9fU0laRV9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RyaXZlcklkS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtDb25mb3JtYW5jZVZlcnNpb25LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfc2hhZGVyX2Zsb2F0X2NvbnRyb2xzIiBudW1iZXI9IjE5OCIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJBbGV4YW5kZXIgR2FsYXppbiBAYWxlZ2FsLWFybSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9TSEFERVJfRkxPQVRfQ09OVFJPTFNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9zaGFkZXJfZmxvYXRfY29udHJvbHMmcXVvdDsiICAgIG5hbWU9IlZLX0tIUl9TSEFERVJfRkxPQVRfQ09OVFJPTFNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUX0NPTlRST0xTX1BST1BFUlRJRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX3NoYWRlcl9zdWJncm91cF9wYXJ0aXRpb25lZCIgbnVtYmVyPSIxOTkiIHR5cGU9ImRldmljZSIgcmVxdWlyZXNDb3JlPSIxLjEiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfU0hBREVSX1NVQkdST1VQX1BBUlRJVElPTkVEX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9zaGFkZXJfc3ViZ3JvdXBfcGFydGl0aW9uZWQmcXVvdDsiIG5hbWU9IlZLX05WX1NIQURFUl9TVUJHUk9VUF9QQVJUSVRJT05FRF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iOCIgZXh0ZW5kcz0iVmtTdWJncm91cEZlYXR1cmVGbGFnQml0cyIgICAgICAgIG5hbWU9IlZLX1NVQkdST1VQX0ZFQVRVUkVfUEFSVElUSU9ORURfQklUX05WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9kZXB0aF9zdGVuY2lsX3Jlc29sdmUiIG51bWJlcj0iMjAwIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmFuLUhhcmFsZCBGcmVkcmlrc2VuIEBqYW5oYXJhbGQiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9kZXB0aF9zdGVuY2lsX3Jlc29sdmUmcXVvdDsiICAgICAgbmFtZT0iVktfS0hSX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfUFJPUEVSVElFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX3N3YXBjaGFpbl9tdXRhYmxlX2Zvcm1hdCIgbnVtYmVyPSIyMDEiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIHJlcXVpcmVzPSJWS19LSFJfc3dhcGNoYWluLFZLX0tIUl9tYWludGVuYW5jZTIsVktfS0hSX2ltYWdlX2Zvcm1hdF9saXN0IiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hcm0iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1NXQVBDSEFJTl9NVVRBQkxFX0ZPUk1BVF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3N3YXBjaGFpbl9tdXRhYmxlX2Zvcm1hdCZxdW90OyIgbmFtZT0iVktfS0hSX1NXQVBDSEFJTl9NVVRBQkxFX0ZPUk1BVF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgZXh0ZW5kcz0iVmtTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUiIgbmFtZT0iVktfU1dBUENIQUlOX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVRfS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2NvbXB1dGVfc2hhZGVyX2Rlcml2YXRpdmVzIiBudW1iZXI9IjIwMiIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IlBhdCBCcm93biBAbnZwYnJvd24iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfQ09NUFVURV9TSEFERVJfREVSSVZBVElWRVNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2NvbXB1dGVfc2hhZGVyX2Rlcml2YXRpdmVzJnF1b3Q7IiBuYW1lPSJWS19OVl9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09NUFVURV9TSEFERVJfREVSSVZBVElWRVNfRkVBVFVSRVNfTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9tZXNoX3NoYWRlciIgbnVtYmVyPSIyMDMiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBhdXRob3I9Ik5WIiBjb250YWN0PSJDaHJpc3RvcGggS3ViaXNjaCBAcGl4ZWxqZXRzdHJlYW0iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfTUVTSF9TSEFERVJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX21lc2hfc2hhZGVyJnF1b3Q7IiAgICAgICAgICAgICBuYW1lPSJWS19OVl9NRVNIX1NIQURFUl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX0ZFQVRVUkVTX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfUFJPUEVSVElFU19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNiIgZXh0ZW5kcz0iVmtTaGFkZXJTdGFnZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfU0hBREVSX1NUQUdFX1RBU0tfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSI3IiBleHRlbmRzPSJWa1NoYWRlclN0YWdlRmxhZ0JpdHMiICAgICAgICBuYW1lPSJWS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlYiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE5IiBleHRlbmRzPSJWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyIgICAgIG5hbWU9IlZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjAiIGV4dGVuZHM9IlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIiAgICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREcmF3TWVzaFRhc2tzTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9mcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWMiIG51bWJlcj0iMjA0IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgYXV0aG9yPSJOViIgY29udGFjdD0iUGF0IEJyb3duIEBudnBicm93biIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2ZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpYyZxdW90OyIgbmFtZT0iVktfTlZfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRkVBVFVSRVNfTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfc2hhZGVyX2ltYWdlX2Zvb3RwcmludCIgbnVtYmVyPSIyMDUiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBhdXRob3I9Ik5WIiBjb250YWN0PSJQYXQgQnJvd24gQG52cGJyb3duIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX3NoYWRlcl9pbWFnZV9mb290cHJpbnQmcXVvdDsiICBuYW1lPSJWS19OVl9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lNQUdFX0ZPT1RQUklOVF9GRUFUVVJFU19OViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfc2Npc3Nvcl9leGNsdXNpdmUiIG51bWJlcj0iMjA2IiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgYXV0aG9yPSJOViIgY29udGFjdD0iUGF0IEJyb3duIEBudnBicm93biIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9TQ0lTU09SX0VYQ0xVU0lWRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfc2Npc3Nvcl9leGNsdXNpdmUmcXVvdDsiICAgICAgIG5hbWU9IlZLX05WX1NDSVNTT1JfRVhDTFVTSVZFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0VYQ0xVU0lWRV9TQ0lTU09SX1NUQVRFX0NSRUFURV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa0R5bmFtaWNTdGF0ZSIgbmFtZT0iVktfRFlOQU1JQ19TVEFURV9FWENMVVNJVkVfU0NJU1NPUl9OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhDTFVTSVZFX1NDSVNTT1JfRkVBVFVSRVNfTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cyIgdHlwZT0iZGV2aWNlIiBudW1iZXI9IjIwNyIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBhdXRob3I9Ik5WSURJQSIgY29udGFjdD0iTnVubyBTdWJ0aWwgQG5zdWJ0aWwiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfREVWSUNFX0RJQUdOT1NUSUNfQ0hFQ0tQT0lOVFNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2RldmljZV9kaWFnbm9zdGljX2NoZWNrcG9pbnRzJnF1b3Q7IiBuYW1lPSJWS19OVl9ERVZJQ0VfRElBR05PU1RJQ19DSEVDS1BPSU5UU19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQ0hFQ0tQT0lOVF9EQVRBX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfQ0hFQ0tQT0lOVF9QUk9QRVJUSUVTX05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NoZWNrcG9pbnREYXRhTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NtZFNldENoZWNrcG9pbnROViIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUiIG51bWJlcj0iMjA4IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iS0hSIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGNvbnRhY3Q9Ikphc29uIEVrc3RyYW5kIEBqZWtzdHJhbmQiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1RJTUVMSU5FX1NFTUFQSE9SRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSZxdW90OyIgICAgIG5hbWU9IlZLX0tIUl9USU1FTElORV9TRU1BUEhPUkVfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfRkVBVFVSRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfVFlQRV9DUkVBVEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjMiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjQiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9XQUlUX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI1IiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfU0lHTkFMX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTZW1hcGhvcmVUeXBlS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NlbWFwaG9yZVdhaXRGbGFnc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrU2VtYXBob3JlV2FpdEluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrV2FpdFNlbWFwaG9yZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1NpZ25hbFNlbWFwaG9yZUtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZXh0ZW5zaW9uXzIwOSIgbnVtYmVyPSIyMDkiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IklhbiBFbGxpb3R0IEBpYW5lbGxpb3R0IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8yMDlfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlbnNpb25fMjA5JnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzIwOV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19JTlRFTF9zaGFkZXJfaW50ZWdlcl9mdW5jdGlvbnMyIiBudW1iZXI9IjIxMCIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iSU5URUwiIGNvbnRhY3Q9IklhbiBSb21hbmljayBAaWFucm9tYW5pY2siIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU5URUxfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0lOVEVMX3NoYWRlcl9pbnRlZ2VyX2Z1bmN0aW9uczImcXVvdDsiIG5hbWU9IlZLX0lOVEVMX1NIQURFUl9JTlRFR0VSX0ZVTkNUSU9OU18yX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRkVBVFVSRVNfSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5IiBudW1iZXI9IjIxMSIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IklOVEVMIiBjb250YWN0PSJMaW9uZWwgTGFuZHdlcmxpbiBAbGxhbmR3ZXJsaW4iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU5URUxfUEVSRk9STUFOQ0VfUVVFUllfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5JnF1b3Q7IiAgICBuYW1lPSJWS19JTlRFTF9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GT19JTlRFTCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU5JVElBTElaRV9QRVJGT1JNQU5DRV9BUElfSU5GT19JTlRFTCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfTUFSS0VSX0lORk9fSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjMiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX1NUUkVBTV9NQVJLRVJfSU5GT19JTlRFTCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfT1ZFUlJJREVfSU5GT19JTlRFTCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09ORklHVVJBVElPTl9BQ1FVSVJFX0lORk9fSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrUXVlcnlUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrT2JqZWN0VHlwZSIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX09CSkVDVF9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUXVlcnlQb29sU2FtcGxpbmdNb2RlSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZVZhbHVlSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfdnVsa2FuX21lbW9yeV9tb2RlbCIgbnVtYmVyPSIyMTIiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfVlVMS0FOX01FTU9SWV9NT0RFTF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3Z1bGthbl9tZW1vcnlfbW9kZWwmcXVvdDsiICAgIG5hbWU9IlZLX0tIUl9WVUxLQU5fTUVNT1JZX01PREVMX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfcGNpX2J1c19pbmZvIiBudW1iZXI9IjIxMyIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkVYVCIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBjb250YWN0PSJNYXR0aGFldXMgRy4gQ2hhamRhcyBAYW50ZXJ1IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9QQ0lfQlVTX0lORk9fU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9wY2lfYnVzX2luZm8mcXVvdDsiICAgICAgICAgICBuYW1lPSJWS19FWFRfUENJX0JVU19JTkZPX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUENJX0JVU19JTkZPX1BST1BFUlRJRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9kaXNwbGF5X25hdGl2ZV9oZHIiIG51bWJlcj0iMjE0IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iQU1EIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIsVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIsVktfS0hSX3N3YXBjaGFpbiIgY29udGFjdD0iTWF0dGhhZXVzIEcuIENoYWpkYXMgQGFudGVydSIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRElTUExBWV9OQVRJVkVfSERSX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZGlzcGxheV9uYXRpdmVfaGRyJnF1b3Q7IiAgICAgbmFtZT0iVktfQU1EX0RJU1BMQVlfTkFUSVZFX0hEUl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9OQVRJVkVfSERSX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0FNRCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrQ29sb3JTcGFjZUtIUiIgICAgICAgICAgICAgIG5hbWU9IlZLX0NPTE9SX1NQQUNFX0RJU1BMQVlfTkFUSVZFX0FNRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtTZXRMb2NhbERpbW1pbmdBTUQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRlVDSFNJQV9pbWFnZXBpcGVfc3VyZmFjZSIgbnVtYmVyPSIyMTUiIHR5cGU9Imluc3RhbmNlIiBhdXRob3I9IkZVQ0hTSUEiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgcGxhdGZvcm09ImZ1Y2hzaWEiIGNvbnRhY3Q9IkNyYWlnIFN0b3V0IEBjZG90c3RvdXQiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRlVDSFNJQV9JTUFHRVBJUEVfU1VSRkFDRV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRlVDSFNJQV9pbWFnZXBpcGVfc3VyZmFjZSZxdW90OyIgIG5hbWU9IlZLX0ZVQ0hTSUFfSU1BR0VQSVBFX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFUElQRV9TVVJGQUNFX0NSRUFURV9JTkZPX0ZVQ0hTSUEiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVGbGFnc0ZVQ0hTSUEiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfR09PR0xFX2V4dGVuc2lvbl8yMTYiIG51bWJlcj0iMjE2IiBhdXRob3I9IkdPT0dMRSIgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzIxNl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVuc2lvbl8yMTYmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzIxNl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19HT09HTEVfZXh0ZW5zaW9uXzIxNyIgbnVtYmVyPSIyMTciIGF1dGhvcj0iR09PR0xFIiBjb250YWN0PSJKZXNzZSBIYWxsIEBjcml0c2VjIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMjE3X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZW5zaW9uXzIxNyZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMjE3X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9tZXRhbF9zdXJmYWNlIiBudW1iZXI9IjIxOCIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzPSJWS19LSFJfc3VyZmFjZSIgcGxhdGZvcm09Im1ldGFsIiBzdXBwb3J0ZWQ9InZ1bGthbiIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IkR6bWl0cnkgTWFseXNoYXUgQGt2YXJrIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9NRVRBTF9TVVJGQUNFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfbWV0YWxfc3VyZmFjZSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9NRVRBTF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTUVUQUxfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01ldGFsU3VyZmFjZUNyZWF0ZUZsYWdzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwIiBudW1iZXI9IjIxOSIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJNYXR0aGV3IE5ldHNjaCBAbW5ldHNjaCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXAmcXVvdDsiICAgICAgIG5hbWU9IlZLX0VYVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiICBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiICBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19GUkFHTUVOVF9ERU5TSVRZX01BUF9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE0IiBleHRlbmRzPSJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiAgZXh0ZW5kcz0iVmtJbWFnZUxheW91dCIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX09QVElNQUxfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyNCIgZXh0ZW5kcz0iVmtBY2Nlc3NGbGFnQml0cyIgICAgICAgICAgICAgICAgbmFtZT0iVktfQUNDRVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX1JFQURfQklUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMjQiIGV4dGVuZHM9IlZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIiAgICAgICAgIG5hbWU9IlZLX0ZPUk1BVF9GRUFUVVJFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjkiICBleHRlbmRzPSJWa0ltYWdlVXNhZ2VGbGFnQml0cyIgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIwIiAgZXh0ZW5kcz0iVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cyIgICAgICAgbmFtZT0iVktfSU1BR0VfVklFV19DUkVBVEVfRlJBR01FTlRfREVOU0lUWV9NQVBfRFlOQU1JQ19CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIyMyIgZXh0ZW5kcz0iVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiICAgICAgICAgbmFtZT0iVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfREVOU0lUWV9QUk9DRVNTX0JJVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjAiICBleHRlbmRzPSJWa1NhbXBsZXJDcmVhdGVGbGFnQml0cyIgICAgICAgICBuYW1lPSJWS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEiICBleHRlbmRzPSJWa1NhbXBsZXJDcmVhdGVGbGFnQml0cyIgICAgICAgICBuYW1lPSJWS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0NPQVJTRV9SRUNPTlNUUlVDVElPTl9CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9leHRlbnNpb25fMjIwIiBudW1iZXI9IjIyMCIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IkR6bWl0cnkgTWFseXNoYXUgQGt2YXJrIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURU5TSU9OXzIyMF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2V4dGVuc2lvbl8yMjAmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yMjBfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVuc2lvbl8yMjEiIG51bWJlcj0iMjIxIiBhdXRob3I9IktIUiIgY29udGFjdD0iVG9iaWFzIEhlY3RvciBAdG9ic2tpIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzIyMV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVuc2lvbl8yMjEmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8yMjFfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjAiIGV4dGVuZHM9IlZrUmVuZGVyUGFzc0NyZWF0ZUZsYWdCaXRzIiAgICAgICAgbmFtZT0iVktfUkVOREVSX1BBU1NfQ1JFQVRFX1JFU0VSVkVEXzBfQklUX0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfc2NhbGFyX2Jsb2NrX2xheW91dCIgbnVtYmVyPSIyMjIiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkVYVCIgY29udGFjdD0iVG9iaWFzIEhlY3RvciBAdG9ic2tpIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfU0NBTEFSX0JMT0NLX0xBWU9VVF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX3NjYWxhcl9ibG9ja19sYXlvdXQmcXVvdDsiICAgICAgICBuYW1lPSJWS19FWFRfU0NBTEFSX0JMT0NLX0xBWU9VVF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9leHRlbnNpb25fMjIzIiBudW1iZXI9IjIyMyIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IlRvYmlhcyBIZWN0b3IgQHRvYnNraSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yMjNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9leHRlbnNpb25fMjIzJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9FWFRFTlNJT05fMjIzX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0dPT0dMRV9obHNsX2Z1bmN0aW9uYWxpdHkxIiBudW1iZXI9IjIyNCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkdPT0dMRSIgY29udGFjdD0iSGFpIE5ndXllbiBAY2hhb3RpY2JvYiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfR09PR0xFX0hMU0xfRlVOQ1RJT05BTElUWTFfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0dPT0dMRV9obHNsX2Z1bmN0aW9uYWxpdHkxJnF1b3Q7IiAgICAgbmFtZT0iVktfR09PR0xFX0hMU0xfRlVOQ1RJT05BTElUWTFfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfR09PR0xFX2RlY29yYXRlX3N0cmluZyIgbnVtYmVyPSIyMjUiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJHT09HTEUiIGNvbnRhY3Q9IkhhaSBOZ3V5ZW4gQGNoYW90aWNib2IiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0dPT0dMRV9ERUNPUkFURV9TVFJJTkdfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0dPT0dMRV9kZWNvcmF0ZV9zdHJpbmcmcXVvdDsiICAgICAgICAgbmFtZT0iVktfR09PR0xFX0RFQ09SQVRFX1NUUklOR19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfc3ViZ3JvdXBfc2l6ZV9jb250cm9sIiBudW1iZXI9IjIyNiIgdHlwZT0iZGV2aWNlIiByZXF1aXJlc0NvcmU9IjEuMSIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9Ik5laWwgSGVubmluZyBAc2hlcmVkb20iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9TVUJHUk9VUF9TSVpFX0NPTlRST0xfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9zdWJncm91cF9zaXplX2NvbnRyb2wmcXVvdDsiICAgICAgICAgbmFtZT0iVktfRVhUX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX1BST1BFUlRJRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX1JFUVVJUkVEX1NVQkdST1VQX1NJWkVfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjAiIGV4dGVuZHM9IlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzIiBuYW1lPSJWS19QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0FMTE9XX1ZBUllJTkdfU1VCR1JPVVBfU0laRV9CSVRfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxIiBleHRlbmRzPSJWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyIgbmFtZT0iVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9SRVFVSVJFX0ZVTExfU1VCR1JPVVBTX0JJVF9FWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX2V4dGVuc2lvbl8yMjciIG51bWJlcj0iMjI3IiBhdXRob3I9IkFNRCIgY29udGFjdD0iTWFydGluIERpbmtvdiBAbWRpbmtvdiIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzIyN19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8yMjcmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzIyN19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfc2hhZGVyX2NvcmVfcHJvcGVydGllczIiIG51bWJlcj0iMjI4IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYXR0aGFldXMgRy4gQ2hhamRhcyBAYW50ZXJ1IiBzdXBwb3J0ZWQ9InZ1bGthbiIgcmVxdWlyZXM9IlZLX0FNRF9zaGFkZXJfY29yZV9wcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9zaGFkZXJfY29yZV9wcm9wZXJ0aWVzMiZxdW90OyIgICAgbmFtZT0iVktfQU1EX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrU2hhZGVyQ29yZVByb3BlcnRpZXNGbGFnQml0c0FNRCIvPgorICAgICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrU2hhZGVyQ29yZVByb3BlcnRpZXNGbGFnc0FNRCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzIyOSIgbnVtYmVyPSIyMjkiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYXJ0aW4gRGlua292IEBtZGlua292IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMjI5X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzIyOSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMjI5X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9kZXZpY2VfY29oZXJlbnRfbWVtb3J5IiBudW1iZXI9IjIzMCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkFNRCIgY29udGFjdD0iVG9iaWFzIEhlY3RvciBAdG9ic2tpIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfREVWSUNFX0NPSEVSRU5UX01FTU9SWV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2RldmljZV9jb2hlcmVudF9tZW1vcnkmcXVvdDsiICAgICBuYW1lPSJWS19BTURfREVWSUNFX0NPSEVSRU5UX01FTU9SWV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNiIgZXh0ZW5kcz0iVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIiAgICAgICAgIG5hbWU9IlZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfQ09IRVJFTlRfQklUX0FNRCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNyIgZXh0ZW5kcz0iVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIiAgICAgICAgIG5hbWU9IlZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfVU5DQUNIRURfQklUX0FNRCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1EIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX2V4dGVuc2lvbl8yMzEiIG51bWJlcj0iMjMxIiBhdXRob3I9IkFNRCIgY29udGFjdD0iTWFydGluIERpbmtvdiBAbWRpbmtvdiIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzIzMV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8yMzEmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzIzMV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzIzMiIgbnVtYmVyPSIyMzIiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYXJ0aW4gRGlua292IEBtZGlua292IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMjMyX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzIzMiZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMjMyX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMjMzIiBudW1iZXI9IjIzMyIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9Ik1hcnRpbiBEaW5rb3YgQG1kaW5rb3YiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl8yMzNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fMjMzJnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl8yMzNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfQU1EX2V4dGVuc2lvbl8yMzQiIG51bWJlcj0iMjM0IiBhdXRob3I9IkFNRCIgY29udGFjdD0iTWFydGluIERpbmtvdiBAbWRpbmtvdiIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzIzNF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfQU1EX2V4dGVuc2lvbl8yMzQmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19BTURfRVhURU5TSU9OXzIzNF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BTURfZXh0ZW5zaW9uXzIzNSIgbnVtYmVyPSIyMzUiIGF1dGhvcj0iQU1EIiBjb250YWN0PSJNYXJ0aW4gRGlua292IEBtZGlua292IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMjM1X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BTURfZXh0ZW5zaW9uXzIzNSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0FNRF9FWFRFTlNJT05fMjM1X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0FNRF9leHRlbnNpb25fMjM2IiBudW1iZXI9IjIzNiIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9Ik1hcnRpbiBEaW5rb3YgQG1kaW5rb3YiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl8yMzZfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0FNRF9leHRlbnNpb25fMjM2JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfQU1EX0VYVEVOU0lPTl8yMzZfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX3NwaXJ2XzFfNCIgbnVtYmVyPSIyMzciIHR5cGU9ImRldmljZSIgcmVxdWlyZXNDb3JlPSIxLjEiIHJlcXVpcmVzPSJWS19LSFJfc2hhZGVyX2Zsb2F0X2NvbnRyb2xzIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmVzc2UgSGFsbCBAY3JpdHNlYyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX1NQSVJWXzFfNF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX3NwaXJ2XzFfNCZxdW90OyIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfU1BJUlZfMV80X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9tZW1vcnlfYnVkZ2V0IiBudW1iZXI9IjIzOCIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9NRU1PUllfQlVER0VUX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfbWVtb3J5X2J1ZGdldCZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9NRU1PUllfQlVER0VUX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9CVURHRVRfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfbWVtb3J5X3ByaW9yaXR5IiBudW1iZXI9IjIzOSIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiICBhdXRob3I9IkVYVCIgY29udGFjdD0iSmVmZiBCb2x6IEBqZWZmYm9sem52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfTUVNT1JZX1BSSU9SSVRZX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfbWVtb3J5X3ByaW9yaXR5JnF1b3Q7IiAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9NRU1PUllfUFJJT1JJVFlfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BSSU9SSVRZX0ZFQVRVUkVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9QUklPUklUWV9BTExPQ0FURV9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfc3VyZmFjZV9wcm90ZWN0ZWRfY2FwYWJpbGl0aWVzIiBudW1iZXI9IjI0MCIgdHlwZT0iaW5zdGFuY2UiIHJlcXVpcmVzQ29yZT0iMS4xIiByZXF1aXJlcz0iVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJTYW5kZWVwIFNoaW5kZSBAc2FzaGluZGUiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9zdXJmYWNlX3Byb3RlY3RlZF9jYXBhYmlsaXRpZXMmcXVvdDsiICAgbmFtZT0iVktfS0hSX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb25faW1hZ2VfYWxpYXNpbmciIG51bWJlcj0iMjQxIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24iIGF1dGhvcj0iTlZJRElBIiBjb250YWN0PSJOdW5vIFN1YnRpbCBAbnN1YnRpbCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nJnF1b3Q7IiAgICAgbmFtZT0iVktfTlZfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9zZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHMiIG51bWJlcj0iMjQyIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMixWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIiBhdXRob3I9IktIUiIgY29udGFjdD0iUGllcnMgRGFuaWVsbCBAcGRhbmllbGwtbnYiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9zZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHMmcXVvdDsiICAgbmFtZT0iVktfS0hSX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfU1RFTkNJTF9MQVlPVVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrSW1hZ2VMYXlvdXQiICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtJbWFnZUxheW91dCIgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrSW1hZ2VMYXlvdXQiICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa0ltYWdlTGF5b3V0IiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19JTlRFTF9leHRlbnNpb25fMjQzIiBudW1iZXI9IjI0MyIgYXV0aG9yPSJJTlRFTCIgY29udGFjdD0iU2xhd2VrIEdyYWpld3NraSBAc2dyYWpld3NraSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfSU5URUxfRVhURU5TSU9OXzI0M19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfSU5URUxfZXh0ZW5zaW9uXzI0MyZxdW90OyIgICAgICAgICAgICAgbmFtZT0iVktfSU5URUxfRVhURU5TSU9OXzI0M19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19NRVNBX2V4dGVuc2lvbl8yNDQiIG51bWJlcj0iMjQ0IiBhdXRob3I9Ik1FU0EiIGNvbnRhY3Q9IkFuZHJlcyBSb2RyaWd1ZXogQGxvc3Rnb2F0IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19NRVNBX0VYVEVOU0lPTl8yNDRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX01FU0FfZXh0ZW5zaW9uXzI0NCZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX01FU0FfRVhURU5TSU9OXzI0NF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzIiBudW1iZXI9IjI0NSIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgIGRlcHJlY2F0ZWRieT0iVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyZxdW90OyIgICAgICBuYW1lPSJWS19FWFRfQlVGRkVSX0RFVklDRV9BRERSRVNTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0FERFJFU1NfRkVBVFVSRVNfRVhUIiBhbGlhcz0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19FWFQiIGFsaWFzPSJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjIiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtCdWZmZXJVc2FnZUZsYWdCaXRzIiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfRVhUIiBhbGlhcz0iVktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtCdWZmZXJDcmVhdGVGbGFnQml0cyIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQlVGRkVSX0NSRUFURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfRVhUIiBhbGlhcz0iVktfQlVGRkVSX0NSRUFURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gZXh0ZW5kcz0iVmtSZXN1bHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVJST1JfSU5WQUxJRF9ERVZJQ0VfQUREUkVTU19FWFQiIGFsaWFzPSJWS19FUlJPUl9JTlZBTElEX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUJ1ZmZlckFkZHJlc3NGZWF0dXJlc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfdG9vbGluZ19pbmZvIiBudW1iZXI9IjI0NiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IkVYVCIgY29udGFjdD0iVG9iaWFzIEhlY3RvciBAdG9ic2tpIiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfVE9PTElOR19JTkZPX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfdG9vbGluZ19pbmZvJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9UT09MSU5HX0lORk9fRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVE9PTF9QUk9QRVJUSUVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrVG9vbFB1cnBvc2VGbGFnQml0c0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrVG9vbFB1cnBvc2VGbGFnc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgICAgIDxjb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICAgICAgPHJlcXVpcmUgZXh0ZW5zaW9uPSJWS19FWFRfZGVidWdfcmVwb3J0Ij4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjUiIGV4dGVuZHM9IlZrVG9vbFB1cnBvc2VGbGFnQml0c0VYVCIgICAgICAgICBuYW1lPSJWS19UT09MX1BVUlBPU0VfREVCVUdfUkVQT1JUSU5HX0JJVF9FWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgICAgIDxyZXF1aXJlIGV4dGVuc2lvbj0iVktfRVhUX2RlYnVnX21hcmtlciI+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSI2IiBleHRlbmRzPSJWa1Rvb2xQdXJwb3NlRmxhZ0JpdHNFWFQiICAgICAgICAgbmFtZT0iVktfVE9PTF9QVVJQT1NFX0RFQlVHX01BUktFUlNfQklUX0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICAgICAgPHJlcXVpcmUgZXh0ZW5zaW9uPSJWS19FWFRfZGVidWdfdXRpbHMiPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNSIgZXh0ZW5kcz0iVmtUb29sUHVycG9zZUZsYWdCaXRzRVhUIiAgICAgICAgIG5hbWU9IlZLX1RPT0xfUFVSUE9TRV9ERUJVR19SRVBPUlRJTkdfQklUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNiIgZXh0ZW5kcz0iVmtUb29sUHVycG9zZUZsYWdCaXRzRVhUIiAgICAgICAgIG5hbWU9IlZLX1RPT0xfUFVSUE9TRV9ERUJVR19NQVJLRVJTX0JJVF9FWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX3NlcGFyYXRlX3N0ZW5jaWxfdXNhZ2UiIG51bWJlcj0iMjQ3IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJEYW5pZWwgUmFrb3MgQGRyYWtvcy1hbWQiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9TRVBBUkFURV9TVEVOQ0lMX1VTQUdFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfc2VwYXJhdGVfc3RlbmNpbF91c2FnZSZxdW90OyIgICAgIG5hbWU9IlZLX0VYVF9TRVBBUkFURV9TVEVOQ0lMX1VTQUdFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfdmFsaWRhdGlvbl9mZWF0dXJlcyIgbnVtYmVyPSIyNDgiIHR5cGU9Imluc3RhbmNlIiBhdXRob3I9IkxVTkFSRyIgY29udGFjdD0iS2FybCBTY2h1bHR6IEBrYXJsLWx1bmFyZyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX1ZBTElEQVRJT05fRkVBVFVSRVNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF92YWxpZGF0aW9uX2ZlYXR1cmVzJnF1b3Q7IiAgICAgICAgbmFtZT0iVktfRVhUX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlbnNpb25fMjQ5IiBudW1iZXI9IjI0OSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IktlaXRoIFBhY2thcmQgQGtlaXRocCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzI0OV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVuc2lvbl8yNDkmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzI0OV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9jb29wZXJhdGl2ZV9tYXRyaXgiIG51bWJlcj0iMjUwIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgYXV0aG9yPSJOViIgY29udGFjdD0iSmVmZiBCb2x6IEBqZWZmYm9sem52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfQ09PUEVSQVRJVkVfTUFUUklYX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9jb29wZXJhdGl2ZV9tYXRyaXgmcXVvdDsiICAgICAgICAgICBuYW1lPSJWS19OVl9DT09QRVJBVElWRV9NQVRSSVhfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9GRUFUVVJFU19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMSIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OViIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTY29wZU5WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtDb21wb25lbnRUeXBlTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlIiBudW1iZXI9IjI1MSIgcmVxdWlyZXM9IlZLX05WX2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXMiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJOViIgY29udGFjdD0iS2VkYXJuYXRoIFRoYW5ndWR1IEBrdGhhbmd1ZHUiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9jb3ZlcmFnZV9yZWR1Y3Rpb25fbW9kZSZxdW90OyIgICAgIG5hbWU9IlZLX05WX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0ZFQVRVUkVTX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfUkVEVUNUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfTUlYRURfU0FNUExFU19DT01CSU5BVElPTl9OViIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUZsYWdzTlYiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0NvdmVyYWdlUmVkdWN0aW9uTW9kZU5WIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZnJhZ21lbnRfc2hhZGVyX2ludGVybG9jayIgbnVtYmVyPSIyNTIiIGF1dGhvcj0iRVhUIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgY29udGFjdD0iUGllcnMgRGFuaWVsbCBAcGRhbmllbGwtbnYiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRlJBR01FTlRfU0hBREVSX0lOVEVSTE9DS19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2ZyYWdtZW50X3NoYWRlcl9pbnRlcmxvY2smcXVvdDsiICAgICAgbmFtZT0iVktfRVhUX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX3ljYmNyX2ltYWdlX2FycmF5cyIgbnVtYmVyPSIyNTMiIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24iIGF1dGhvcj0iRVhUIiBjb250YWN0PSJQaWVycyBEYW5pZWxsIEBwZGFuaWVsbC1udiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX1lDQkNSX0lNQUdFX0FSUkFZU19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX3ljYmNyX2ltYWdlX2FycmF5cyZxdW90OyIgICAgICAgICBuYW1lPSJWS19FWFRfWUNCQ1JfSU1BR0VfQVJSQVlTX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1lDQkNSX0lNQUdFX0FSUkFZU19GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl91bmlmb3JtX2J1ZmZlcl9zdGFuZGFyZF9sYXlvdXQiIG51bWJlcj0iMjU0IiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkdyYWVtZSBMZWVzZSBAZ25sMjEiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfVU5JRk9STV9CVUZGRVJfU1RBTkRBUkRfTEFZT1VUX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfdW5pZm9ybV9idWZmZXJfc3RhbmRhcmRfbGF5b3V0JnF1b3Q7IiBuYW1lPSJWS19LSFJfVU5JRk9STV9CVUZGRVJfU1RBTkRBUkRfTEFZT1VUX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVU5JRk9STV9CVUZGRVJfU1RBTkRBUkRfTEFZT1VUX0ZFQVRVUkVTX0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZXh0ZW5zaW9uXzI1NSIgbnVtYmVyPSIyNTUiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJKZXNzZSBIYWxsIEBqZXNzZWhhbGwiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yNTVfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9leHRlbnNpb25fMjU1JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yNTVfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSIgbnVtYmVyPSIyNTYiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJFWFQiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMixWS19LSFJfc3VyZmFjZSxWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMixWS19LSFJfc3dhcGNoYWluIiBwbGF0Zm9ybT0id2luMzIiIGNvbnRhY3Q9IkphbWVzIEpvbmVzIEBjdWJhbmlzbW8iIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSI0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9GVUxMX1NDUkVFTl9FWENMVVNJVkVfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUmcXVvdDsiICAgICAgbmFtZT0iVktfRVhUX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtSZXN1bHQiIGRpcj0iLSIgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VSUk9SX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9NT0RFX0xPU1RfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICAgICAgPHJlcXVpcmUgZXh0ZW5zaW9uPSJWS19LSFJfd2luMzJfc3VyZmFjZSI+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgICAgICA8cmVxdWlyZSBleHRlbnNpb249IlZLX0tIUl9kZXZpY2VfZ3JvdXAiPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICAgICAgPHJlcXVpcmUgZmVhdHVyZT0iVktfVkVSU0lPTl8xXzEiPgorICAgICAgICAgICAgICAgIDxjb21tYW5kIG5hbWU9InZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfaGVhZGxlc3Nfc3VyZmFjZSIgbnVtYmVyPSIyNTciIHR5cGU9Imluc3RhbmNlIiByZXF1aXJlcz0iVktfS0hSX3N1cmZhY2UiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJMaXNhIFd1IEBjaGVuZ3RpYW53dyIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9IRUFETEVTU19TVVJGQUNFX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfaGVhZGxlc3Nfc3VyZmFjZSZxdW90OyIgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfSEVBRExFU1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9IRUFETEVTU19TVVJGQUNFX0NSRUFURV9JTkZPX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlRmxhZ3NFWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzIiBudW1iZXI9IjI1OCIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9CVUZGRVJfREVWSUNFX0FERFJFU1NfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MmcXVvdDsiICAgICAgbmFtZT0iVktfS0hSX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiIGV4dG51bWJlcj0iMjQ1IiAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQ1JFQVRFX0lORk9fS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIzIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQUxMT0NBVEVfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjQiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjE3IiBleHRlbmRzPSJWa0J1ZmZlclVzYWdlRmxhZ0JpdHMiICAgICAgICAgICBuYW1lPSJWS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjQiICBleHRlbmRzPSJWa0J1ZmZlckNyZWF0ZUZsYWdCaXRzIiAgICAgICAgICBuYW1lPSJWS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEiIGV4dGVuZHM9IlZrTWVtb3J5QWxsb2NhdGVGbGFnQml0cyIgICAgICAgICBuYW1lPSJWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMiIgZXh0ZW5kcz0iVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIiAgICAgICAgIG5hbWU9IlZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBkaXI9Ii0iIGV4dGVuZHM9IlZrUmVzdWx0IiBleHRudW1iZXI9IjI0NSIgbmFtZT0iVktfRVJST1JfSU5WQUxJRF9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZXh0ZW5zaW9uXzI1OSIgbnVtYmVyPSIyNTkiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJKZWZmIExlZ2VyIEBqYWNrb2hvdW5kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9FWFRFTlNJT05fMjU5X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfZXh0ZW5zaW9uXzI1OSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9FWFRFTlNJT05fMjU5X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9saW5lX3Jhc3Rlcml6YXRpb24iIG51bWJlcj0iMjYwIiB0eXBlPSJkZXZpY2UiIHJlcXVpcmVzPSJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IkplZmYgQm9seiBAamVmZmJvbHpudiIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0xJTkVfUkFTVEVSSVpBVElPTl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2xpbmVfcmFzdGVyaXphdGlvbiZxdW90OyIgICAgICAgICBuYW1lPSJWS19FWFRfTElORV9SQVNURVJJWkFUSU9OX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9GRUFUVVJFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjEiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0xJTkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIyIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtEeW5hbWljU3RhdGUiICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0RZTkFNSUNfU1RBVEVfTElORV9TVElQUExFX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtDbWRTZXRMaW5lU3RpcHBsZUVYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fMjYxIiBudW1iZXI9IjI2MSIgYXV0aG9yPSJOViIgY29udGFjdD0iS2VkYXJuYXRoIFRoYW5ndWR1IEBrdGhhbmd1ZHUiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzI2MV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZW5zaW9uXzI2MSZxdW90OyIgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMjYxX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9ob3N0X3F1ZXJ5X3Jlc2V0IiBudW1iZXI9IjI2MiIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IkJhcyBOaWV1d2VuaHVpemVuIEBCTmlldXdlbmh1aXplbiIgc3VwcG9ydGVkPSJ2dWxrYW4iIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9IT1NUX1FVRVJZX1JFU0VUX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfaG9zdF9xdWVyeV9yZXNldCZxdW90OyIgICAgICAgICAgIG5hbWU9IlZLX0VYVF9IT1NUX1FVRVJZX1JFU0VUX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgICAgICA8Y29tbWFuZCBuYW1lPSJ2a1Jlc2V0UXVlcnlQb29sRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0dHUF9leHRlbnNpb25fMjYzIiBudW1iZXI9IjI2MyIgYXV0aG9yPSJHR1AiIGNvbnRhY3Q9IkplYW4tRnJhbmNvaXMgUm95IEBqZnJveSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19HT09HTEVfRVhURU5TSU9OXzI2M19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfR0dQX2V4dGVuc2lvbl8yNjMmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19HT09HTEVfRVhURU5TSU9OXzI2M19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19CUkNNX2V4dGVuc2lvbl8yNjQiIG51bWJlcj0iMjY0IiBhdXRob3I9IkJSQ00iIGNvbnRhY3Q9IkdyYWVtZSBMZWVzZSBAZ25sMjEiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQlJDTV9FWFRFTlNJT05fMjY0X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19CUkNNX2V4dGVuc2lvbl8yNjQmcXVvdDsiICAgICAgICAgICAgIG5hbWU9IlZLX0JSQ01fRVhURU5TSU9OXzI2NF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19CUkNNX2V4dGVuc2lvbl8yNjUiIG51bWJlcj0iMjY1IiBhdXRob3I9IkJSQ00iIGNvbnRhY3Q9IkdyYWVtZSBMZWVzZSBAZ25sMjEiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfQlJDTV9FWFRFTlNJT05fMjY1X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19CUkNNX2V4dGVuc2lvbl8yNjUmcXVvdDsiICAgICAgICAgICAgIG5hbWU9IlZLX0JSQ01fRVhURU5TSU9OXzI2NV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfaW5kZXhfdHlwZV91aW50OCIgbnVtYmVyPSIyNjYiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfSU5ERVhfVFlQRV9VSU5UOF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2luZGV4X3R5cGVfdWludDgmcXVvdDsiICAgICAgICAgICBuYW1lPSJWS19FWFRfSU5ERVhfVFlQRV9VSU5UOF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkRFWF9UWVBFX1VJTlQ4X0ZFQVRVUkVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMCIgZXh0ZW5kcz0iVmtJbmRleFR5cGUiICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lOREVYX1RZUEVfVUlOVDhfRVhUIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2V4dGVuc2lvbl8yNjciIG51bWJlcj0iMjY3IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJQaWVycyBEYW5pZWxsIEBwZGFuaWVsbC1udiIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURU5TSU9OXzI2N19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2V4dGVuc2lvbl8yNjcmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfZXh0ZW5zaW9uXzI2NyIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZXh0ZW5zaW9uXzI2OCIgbnVtYmVyPSIyNjgiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IlBpZXJzIERhbmllbGwgQHBkYW5pZWxsLW52IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9FWFRFTlNJT05fMjY4X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZW5zaW9uXzI2OCZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9leHRlbnNpb25fMjY4Ii8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlbnNpb25fMjY5IiBudW1iZXI9IjI2OSIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iSm9zaCBCYXJjemFrIEBqYmFyY3phayIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzI2OV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVuc2lvbl8yNjkmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfZXh0ZW5zaW9uXzI2OSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzIiBudW1iZXI9IjI3MCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmFzb24gRWtzdHJhbmQgQGpla3N0cmFuZCIgc3VwcG9ydGVkPSJ2dWxrYW4iPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzJnF1b3Q7IiAgIG5hbWU9IlZLX0tIUl9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRkVBVFVSRVNfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMiIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iMyIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTkZPX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIG9mZnNldD0iNCIgZXh0ZW5kcz0iVmtTdHJ1Y3R1cmVUeXBlIiAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSI1IiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICBuYW1lPSJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lOVEVSTkFMX1JFUFJFU0VOVEFUSU9OX0tIUiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iNiIgZXh0ZW5kcz0iVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIiAgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX0NBUFRVUkVfU1RBVElTVElDU19CSVRfS0hSIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSI3IiBleHRlbmRzPSJWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMiICAgICBuYW1lPSJWS19QSVBFTElORV9DUkVBVEVfQ0FQVFVSRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTlNfQklUX0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BpcGVsaW5lSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljRm9ybWF0S0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNWYWx1ZUtIUiIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIi8+CisgICAgICAgICAgICAgICAgPHR5cGUgbmFtZT0iVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIi8+CisgICAgICAgICAgICAgICAgPGNvbW1hbmQgbmFtZT0idmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19JTlRFTF9leHRlbnNpb25fMjcxIiBudW1iZXI9IjI3MSIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IklOVEVMIiBjb250YWN0PSJKYXNvbiBFa3N0cmFuZCBAamVrc3RyYW5kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lOVEVMX0VYVEVOU0lPTl8yNzFfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlbnNpb25fMjcxJnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfSU5URUxfZXh0ZW5zaW9uXzI3MSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19JTlRFTF9leHRlbnNpb25fMjcyIiBudW1iZXI9IjI3MiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IklOVEVMIiBjb250YWN0PSJKYXNvbiBFa3N0cmFuZCBAamVrc3RyYW5kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lOVEVMX0VYVEVOU0lPTl8yNzJfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlbnNpb25fMjcyJnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfSU5URUxfZXh0ZW5zaW9uXzI3MiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19JTlRFTF9leHRlbnNpb25fMjczIiBudW1iZXI9IjI3MyIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IklOVEVMIiBjb250YWN0PSJKYXNvbiBFa3N0cmFuZCBAamVrc3RyYW5kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lOVEVMX0VYVEVOU0lPTl8yNzNfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlbnNpb25fMjczJnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfSU5URUxfZXh0ZW5zaW9uXzI3MyIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19JTlRFTF9leHRlbnNpb25fMjc0IiBudW1iZXI9IjI3NCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IklOVEVMIiBjb250YWN0PSJKYXNvbiBFa3N0cmFuZCBAamVrc3RyYW5kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0lOVEVMX0VYVEVOU0lPTl8yNzRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlbnNpb25fMjc0JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfSU5URUxfZXh0ZW5zaW9uXzI3NCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZXh0ZW5zaW9uXzI3NSIgbnVtYmVyPSIyNzUiIHR5cGU9Imluc3RhbmNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iTGlvbmVsIExhbmR3ZXJsaW4gQGxsYW5kd2VybGluIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMjc1X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZW5zaW9uXzI3NSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9leHRlbnNpb25fMjc1Ii8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlbnNpb25fMjc2IiBudW1iZXI9IjI3NiIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IktIUiIgY29udGFjdD0iSmFtZXMgSm9uZXMgQGN1YmFuaXNtbyIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzI3Nl9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVuc2lvbl8yNzYmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfZXh0ZW5zaW9uXzI3NiIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfc2hhZGVyX2RlbW90ZV90b19oZWxwZXJfaW52b2NhdGlvbiIgbnVtYmVyPSIyNzciIHR5cGU9ImRldmljZSIgcmVxdWlyZXM9IlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiBhdXRob3I9IkVYVCIgY29udGFjdD0iSmVmZiBCb2x6IEBqZWZmYm9sem52IiBzdXBwb3J0ZWQ9InZ1bGthbiI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfc2hhZGVyX2RlbW90ZV90b19oZWxwZXJfaW52b2NhdGlvbiZxdW90OyIgbmFtZT0iVktfRVhUX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBvZmZzZXQ9IjAiIGV4dGVuZHM9IlZrU3RydWN0dXJlVHlwZSIgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0ZFQVRVUkVTX0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fMjc4IiBudW1iZXI9IjI3OCIgdHlwZT0iZGV2aWNlIiBhdXRob3I9Ik5WIiBjb250YWN0PSJDaHJpc3RvcGggS3ViaXNjaCBAcGl4ZWxqZXRzdHJlYW0iIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzI3OF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZW5zaW9uXzI3OCZxdW90OyIgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9leHRlbnNpb25fMjc4Ii8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2V4dGVuc2lvbl8yNzkiIG51bWJlcj0iMjc5IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkNocmlzdG9waCBLdWJpc2NoIEBwaXhlbGpldHN0cmVhbSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMjc5X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9leHRlbnNpb25fMjc5JnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX2V4dGVuc2lvbl8yNzkiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVuc2lvbl8yODAiIG51bWJlcj0iMjgwIiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iS0hSIiBjb250YWN0PSJLZXZpbiBQZXRpdCBAa2V2aW5wZXRpdCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzI4MF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVuc2lvbl8yODAmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfZXh0ZW5zaW9uXzI4MCIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19BUk1fZXh0ZW5zaW9uXzI4MSIgbnVtYmVyPSIyODEiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJBUk0iIGNvbnRhY3Q9IktldmluIFBldGl0IEBrZXZpbnBldGl0IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0FSTV9FWFRFTlNJT05fMjgxX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19BUk1fZXh0ZW5zaW9uXzI4MSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0FSTV9leHRlbnNpb25fMjgxIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF90ZXhlbF9idWZmZXJfYWxpZ25tZW50IiBudW1iZXI9IjI4MiIgdHlwZT0iZGV2aWNlIiByZXF1aXJlcz0iVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJKZWZmIEJvbHogQGplZmZib2x6bnYiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0VYVF9URVhFTF9CVUZGRVJfQUxJR05NRU5UX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19FWFRfdGV4ZWxfYnVmZmVyX2FsaWdubWVudCZxdW90OyIgICAgIG5hbWU9IlZLX0VYVF9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIwIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhUIi8+CisgICAgICAgICAgICAgICAgPGVudW0gb2Zmc2V0PSIxIiBleHRlbmRzPSJWa1N0cnVjdHVyZVR5cGUiICAgICAgICAgICAgICAgICAgbmFtZT0iVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfUFJPUEVSVElFU19FWFQiLz4KKyAgICAgICAgICAgICAgICA8dHlwZSBuYW1lPSJWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCIvPgorICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9IlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfUUNPTV9leHRlbnNpb25fMjgzIiBudW1iZXI9IjI4MyIgdHlwZT0iZGV2aWNlIiBhdXRob3I9IlFDT00iIGNvbnRhY3Q9IkplZmYgTGVnZXIgQGphY2tvaG91bmQiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfUUNPTV9FWFRFTlNJT05fMjgzX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19RQ09NX2V4dGVuc2lvbl8yODMmcXVvdDsiICAgICAgICAgICAgIG5hbWU9IlZLX1FDT01fZXh0ZW5zaW9uXzI4MyIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMSIgZXh0ZW5kcz0iVmtSZW5kZXJQYXNzQ3JlYXRlRmxhZ0JpdHMiICAgICAgIG5hbWU9IlZLX1JFTkRFUl9QQVNTX1JFU0VSVkVEX0JJVF8xX1FDT00iLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2V4dGVuc2lvbl8yODQiIG51bWJlcj0iMjg0IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJTYW11ZWwgUGl0b2lzZXQgQGhha3pzYW0iIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yODRfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9leHRlbnNpb25fMjg0JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX2V4dGVuc2lvbl8yODQiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfRVhUX2V4dGVuc2lvbl8yODUiIG51bWJlcj0iMjg1IiB0eXBlPSJkZXZpY2UiIGF1dGhvcj0iRVhUIiBjb250YWN0PSJZaXdlaSBaaGFuZyBAenp5aXdlaSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURU5TSU9OXzI4NV9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfRVhUX2V4dGVuc2lvbl8yODUmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19FWFRfZXh0ZW5zaW9uXzI4NSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19FWFRfZXh0ZW5zaW9uXzI4NiIgbnVtYmVyPSIyODYiIHR5cGU9Imluc3RhbmNlIiBhdXRob3I9IkVYVCIgY29udGFjdD0iRHJldyBEZVZhdWx0IHNpckBjbXB3bi5jb20iIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yODZfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9leHRlbnNpb25fMjg2JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX2V4dGVuc2lvbl8yODYiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZYX2V4dGVuc2lvbl8yODciIG51bWJlcj0iMjg3IiBhdXRob3I9Ik5WWCIgY29udGFjdD0iTGlhbSBNaWRkbGVicm9vayBAbGlhbS1taWRkbGVicm9vayIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVlhfRVhURU5TSU9OXzI4N19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZYX2V4dGVuc2lvbl8yODcmcXVvdDsiICAgICAgICAgICAgICBuYW1lPSJWS19OVlhfRVhURU5TSU9OXzI4N19FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVlhfZXh0ZW5zaW9uXzI4OCIgbnVtYmVyPSIyODgiIGF1dGhvcj0iTlZYIiBjb250YWN0PSJMaWFtIE1pZGRsZWJyb29rIEBsaWFtLW1pZGRsZWJyb29rIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WWF9FWFRFTlNJT05fMjg4X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVlhfZXh0ZW5zaW9uXzI4OCZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX05WWF9FWFRFTlNJT05fMjg4X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9leHRlbnNpb25fMjg5IiBudW1iZXI9IjI4OSIgYXV0aG9yPSJFWFQiIGNvbnRhY3Q9Ikphbi1IYXJhbGQgRnJlZHJpa3NlbiBAamFuaGFyYWxkZnJlZHJpa3Nlbi1hcm0iIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yODlfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9leHRlbnNpb25fMjg5JnF1b3Q7IiAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yODlfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfR09PR0xFX3VzZXJfdHlwZSIgbnVtYmVyPSIyOTAiIHR5cGU9ImRldmljZSIgYXV0aG9yPSJHT09HTEUiIGNvbnRhY3Q9IktheWUgTWFzb24gQGNoYWxldXIiIHN1cHBvcnRlZD0idnVsa2FuIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0dPT0dMRV9VU0VSX1RZUEVfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0dPT0dMRV91c2VyX3R5cGUmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfR09PR0xFX1VTRVJfVFlQRV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fMjkxIiBudW1iZXI9IjI5MSIgYXV0aG9yPSJOViIgY29udGFjdD0iRGFuaWVsIEtvY2ggQGRna29jaCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMjkxX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9leHRlbnNpb25fMjkxJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVOU0lPTl8yOTFfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBiaXRwb3M9IjEyIiAgZXh0ZW5kcz0iVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIiAgICAgICBuYW1lPSJWS19QSVBFTElORV9DUkVBVEVfRVhURU5TSU9OXzI5MV9CSVQwX05WIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIxMyIgIGV4dGVuZHM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX0VYVEVOU0lPTl8yOTFfQklUMV9OViIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fMjkyIiBudW1iZXI9IjI5MiIgYXV0aG9yPSJOViIgY29udGFjdD0iRGFuaWVsIEtvY2ggQGRna29jaCIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMjkyX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9leHRlbnNpb25fMjkyJnF1b3Q7IiAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVOU0lPTl8yOTJfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfTlZfZXh0ZW5zaW9uXzI5MyIgbnVtYmVyPSIyOTMiIGF1dGhvcj0iTlYiIGNvbnRhY3Q9IkRhbmllbCBLb2NoIEBkZ2tvY2giIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzI5M19TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfTlZfZXh0ZW5zaW9uXzI5MyZxdW90OyIgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMjkzX0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlbnNpb25fMjk0IiBudW1iZXI9IjI5NCIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9IkJhbGR1ciBLYXJsc3NvbiBAYmFsZHVyayIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzI5NF9TUEVDX1ZFUlNJT04iLz4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iJnF1b3Q7VktfS0hSX2V4dGVuc2lvbl8yOTQmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8yOTRfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVuc2lvbl8yOTUiIG51bWJlcj0iMjk1IiBhdXRob3I9IktIUiIgY29udGFjdD0iS2VpdGggUGFja2FyZCBAa2VpdGhwIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMjk1X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZW5zaW9uXzI5NSZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMjk1X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX05WX2V4dGVuc2lvbl8yOTYiIG51bWJlcj0iMjk2IiBhdXRob3I9Ik5WIiBjb250YWN0PSJNYXR0aGV3IFJ1c2NoIGdpdGxhYjpAbXJ1c2NoIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX05WX0VYVEVOU0lPTl8yOTZfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX05WX2V4dGVuc2lvbl8yOTYmcXVvdDsiICAgICAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzI5Nl9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19LSFJfZXh0ZW5zaW9uXzI5NyIgbnVtYmVyPSIyOTciIGF1dGhvcj0iS0hSIiBjb250YWN0PSJDb3JlbnRpbiBXYWxsZXogQEthbmd6IiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMjk3X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZW5zaW9uXzI5NyZxdW90OyIgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMjk3X0VYVEVOU0lPTl9OQU1FIi8+CisgICAgICAgICAgICAgICAgPGVudW0gYml0cG9zPSIzIiBleHRlbmRzPSJWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyIgIG5hbWU9IlZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfUkVTRVJWRURfM19CSVRfS0hSIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0VYVF9leHRlbnNpb25fMjk4IiBudW1iZXI9IjI5OCIgYXV0aG9yPSJBTUQiIGNvbnRhY3Q9IkdyZWdvcnkgR3JlYmUgQGdyZ3JlYmUtYW1kIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfRVhUX0VYVEVOU0lPTl8yOThfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0VYVF9leHRlbnNpb25fMjk4JnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19FWFRfRVhURU5TSU9OXzI5OF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iOCIgIGV4dGVuZHM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX1JFU0VSVkVEXzhfQklUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iOSIgIGV4dGVuZHM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX1JFU0VSVkVEXzlfQklUX0VYVCIvPgorICAgICAgICAgICAgICAgIDxlbnVtIGJpdHBvcz0iMTAiIGV4dGVuZHM9IlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIgICAgbmFtZT0iVktfUElQRUxJTkVfQ1JFQVRFX1JFU0VSVkVEXzEwX0JJVF9FWFQiLz4KKyAgICAgICAgICAgICAgICA8ZW51bSBleHRlbmRzPSJWa1Jlc3VsdCIgb2Zmc2V0PSIwIiAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX1JFU1VMVF9FWFRfMjk4X1JFU0VSVkVEX1ZBTFVFXzBfRVhUIi8+CisgICAgICAgICAgICA8L3JlcXVpcmU+CisgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8ZXh0ZW5zaW9uIG5hbWU9IlZLX0tIUl9leHRlbnNpb25fMjk5IiBudW1iZXI9IjI5OSIgYXV0aG9yPSJLSFIiIGNvbnRhY3Q9Ik1hcmsgQmVsbGFteSBAbWFyay5iZWxsYW15X2FybSIgc3VwcG9ydGVkPSJkaXNhYmxlZCI+CisgICAgICAgICAgICA8cmVxdWlyZT4KKyAgICAgICAgICAgICAgICA8ZW51bSB2YWx1ZT0iMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZLX0tIUl9FWFRFTlNJT05fMjk5X1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19LSFJfZXh0ZW5zaW9uXzI5OSZxdW90OyIgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8yOTlfRVhURU5TSU9OX05BTUUiLz4KKyAgICAgICAgICAgIDwvcmVxdWlyZT4KKyAgICAgICAgPC9leHRlbnNpb24+CisgICAgICAgIDxleHRlbnNpb24gbmFtZT0iVktfS0hSX2V4dGVuc2lvbl8zMDAiIG51bWJlcj0iMzAwIiBhdXRob3I9IktIUiIgY29udGFjdD0iQWlkYW4gRmFiaXVzIEBhZmFiaXVzIiBzdXBwb3J0ZWQ9ImRpc2FibGVkIj4KKyAgICAgICAgICAgIDxyZXF1aXJlPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVktfS0hSX0VYVEVOU0lPTl8zMDBfU1BFQ19WRVJTSU9OIi8+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IiZxdW90O1ZLX0tIUl9leHRlbnNpb25fMzAwJnF1b3Q7IiAgICAgICAgICBuYW1lPSJWS19LSFJfRVhURU5TSU9OXzMwMF9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPGV4dGVuc2lvbiBuYW1lPSJWS19OVl9leHRlbnNpb25fMzAxIiBudW1iZXI9IjMwMSIgYXV0aG9yPSJOViIgY29udGFjdD0iS2VkYXJuYXRoIFRoYW5ndWR1IEBrdGhhbmd1ZHUiIHN1cHBvcnRlZD0iZGlzYWJsZWQiPgorICAgICAgICAgICAgPHJlcXVpcmU+CisgICAgICAgICAgICAgICAgPGVudW0gdmFsdWU9IjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWS19OVl9FWFRFTlNJT05fMzAxX1NQRUNfVkVSU0lPTiIvPgorICAgICAgICAgICAgICAgIDxlbnVtIHZhbHVlPSImcXVvdDtWS19OVl9leHRlbnNpb25fMzAxJnF1b3Q7IiAgICAgICAgICAgbmFtZT0iVktfTlZfRVhURU5TSU9OXzMwMV9FWFRFTlNJT05fTkFNRSIvPgorICAgICAgICAgICAgPC9yZXF1aXJlPgorICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2V4dGVuc2lvbnM+Cis8L3JlZ2lzdHJ5PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS92a2NvbnZlbnRpb25zLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1oZWFkZXJzL3NyYy9yZWdpc3RyeS92a2NvbnZlbnRpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGUzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWhlYWRlcnMvc3JjL3JlZ2lzdHJ5L3ZrY29udmVudGlvbnMucHkKQEAgLTAsMCArMSwyNDggQEAKKyMhL3Vzci9iaW4vcHl0aG9uMyAtaQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgV29ya2luZy1ncm91cC1zcGVjaWZpYyBzdHlsZSBjb252ZW50aW9ucywKKyMgdXNlZCBpbiBnZW5lcmF0aW9uLgorCitpbXBvcnQgcmUKKworZnJvbSBjb252ZW50aW9ucyBpbXBvcnQgQ29udmVudGlvbnNCYXNlCisKKworIyBNb2RpZmllZCBmcm9tIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLSBzZWUgY2F0ZWdvcnlfcmVxdWlyZXNfdmFsaWRhdGlvbigpIGJlbG93CitDQVRFR09SSUVTX1JFUVVJUklOR19WQUxJREFUSU9OID0gc2V0KCgnaGFuZGxlJywgJ2VudW0nLCAnYml0bWFzaycpKQorCisjIFRva2VuaXplIGludG8gIndvcmRzIiBmb3Igc3RydWN0dXJlIHR5cGVzLCBhcHByb3hpbWF0ZWx5IHBlciBzcGVjICJJbXBsaWNpdCBWYWxpZCBVc2FnZSIgc2VjdGlvbiAyLjcuMgorIyBUaGlzIGZpcnN0IHNldCBpcyBmb3IgdGhpbmdzIHdlIHJlY29nbml6ZSBleHBsaWNpdGx5IGFzIHdvcmRzLAorIyBhcyBleGNlcHRpb25zIHRvIHRoZSBnZW5lcmFsIHJlZ2V4LgorIyBJZGVhbGx5IHRoZXNlIHdvdWxkIGJlIGxpc3RlZCBpbiB0aGUgc3BlYyBhcyBleGNlcHRpb25zLCBhcyBPcGVuWFIgZG9lcy4KK1NQRUNJQUxfV09SRFMgPSBzZXQoKAorICAgICcxNkJpdCcsICAjIFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcworICAgICc4Qml0JywgICMgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIKKyAgICAnQUFCQicsICAjIFZrR2VvbWV0cnlBQUJCTlYKKyAgICAnQVNUQycsICAjIFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQKKyAgICAnRDNEMTInLCAgIyBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSCisgICAgJ0Zsb2F0MTYnLCAgIyBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUgorICAgICdJbWFnZVBpcGUnLCAgIyBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQQorICAgICdJbnQ2NCcsICAjIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSCisgICAgJ0ludDgnLCAgIyBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUgorICAgICdNYWNPUycsICAjIFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSworICAgICdVaW50OCcsICAjIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUCisgICAgJ1dpbjMyJywgICMgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSCispKQorIyBBIHJlZ2V4IHRvIG1hdGNoIGFueSBvZiB0aGUgU1BFQ0lBTF9XT1JEUworRVhDRVBUSU9OX1BBVFRFUk4gPSByJyg/UDxleGNlcHRpb24+e30pJy5mb3JtYXQoCisgICAgJ3wnLmpvaW4oJyglcyknICUgcmUuZXNjYXBlKHcpIGZvciB3IGluIFNQRUNJQUxfV09SRFMpKQorTUFJTl9SRSA9IHJlLmNvbXBpbGUoCisgICAgIyB0aGUgbmVnYXRpdmUgbG9va2FoZWFkIGlzIHRvIHByZXZlbnQgdGhlIGFsbC1jYXBzIHBhdHRlcm4gZnJvbSBiZWluZyB0b28gZ3JlZWR5LgorICAgIHInKHt9fChbMC05XSspfChbQS1aXVthLXpdKyl8KFtBLVpdW0EtWl0qKD8hW2Etel0pKSknLmZvcm1hdChFWENFUFRJT05fUEFUVEVSTikpCisKKworY2xhc3MgVnVsa2FuQ29udmVudGlvbnMoQ29udmVudGlvbnNCYXNlKToKKyAgICBkZWYgZm9ybWF0RXh0ZW5zaW9uKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJNYXJrIHVwIGEgbmFtZSBhcyBhbiBleHRlbnNpb24gZm9yIHRoZSBzcGVjLiIiIgorICAgICAgICByZXR1cm4gJ2A8PHt9Pj5gJy5mb3JtYXQobmFtZSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBudWxsKHNlbGYpOgorICAgICAgICAiIiJQcmVmZXJyZWQgc3BlbGxpbmcgb2YgTlVMTC4iIiIKKyAgICAgICAgcmV0dXJuICdgTlVMTGAnCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3RydWN0X21hY3JvKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCBtYWNybyBmb3IgYSBzdHJ1Y3R1cmUuCisKKyAgICAgICAgUHJpbWFyaWx5IGFmZmVjdHMgZ2VuZXJhdGVkIHZhbGlkIHVzYWdlIHN0YXRlbWVudHMuCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiAnc2xpbms6JworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnN0RmxhZ0JpdHMoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiBzdGF0aWMgY29uc3QgZmxhZyBiaXRzIHNob3VsZCBiZSBnZW5lcmF0ZWQsIEZhbHNlIGlmIGFuIGVudW1lcmF0ZWQgdHlwZSBzaG91bGQgYmUgZ2VuZXJhdGVkLiIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJ1Y3R0eXBlX21lbWJlcl9uYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUgbWVtYmVyIiIiCisgICAgICAgIHJldHVybiAnc1R5cGUnCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmV4dHBvaW50ZXJfbWVtYmVyX25hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBuYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlciBjaGFpbiBtZW1iZXIiIiIKKyAgICAgICAgcmV0dXJuICdwTmV4dCcKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2YWxpZF9wb2ludGVyX3ByZWZpeChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHByZWZpeCB0byBwb2ludGVycyB3aGljaCBtdXN0IHRoZW1zZWx2ZXMgYmUgdmFsaWQiIiIKKyAgICAgICAgcmV0dXJuICd2YWxpZCcKKworICAgIGRlZiBpc19zdHJ1Y3R1cmVfdHlwZV9tZW1iZXIoc2VsZiwgcGFyYW10eXBlLCBwYXJhbW5hbWUpOgorICAgICAgICAiIiJEZXRlcm1pbmUgaWYgbWVtYmVyIHR5cGUgYW5kIG5hbWUgbWF0Y2ggdGhlIHN0cnVjdHVyZSB0eXBlIG1lbWJlci4iIiIKKyAgICAgICAgcmV0dXJuIHBhcmFtdHlwZSA9PSAnVmtTdHJ1Y3R1cmVUeXBlJyBhbmQgcGFyYW1uYW1lID09IHNlbGYuc3RydWN0dHlwZV9tZW1iZXJfbmFtZQorCisgICAgZGVmIGlzX25leHRwb2ludGVyX21lbWJlcihzZWxmLCBwYXJhbXR5cGUsIHBhcmFtbmFtZSk6CisgICAgICAgICIiIkRldGVybWluZSBpZiBtZW1iZXIgdHlwZSBhbmQgbmFtZSBtYXRjaCB0aGUgbmV4dCBwb2ludGVyIGNoYWluIG1lbWJlci4iIiIKKyAgICAgICAgcmV0dXJuIHBhcmFtdHlwZSA9PSAndm9pZCcgYW5kIHBhcmFtbmFtZSA9PSBzZWxmLm5leHRwb2ludGVyX21lbWJlcl9uYW1lCisKKyAgICBkZWYgZ2VuZXJhdGVfc3RydWN0dXJlX3R5cGVfZnJvbV9uYW1lKHNlbGYsIHN0cnVjdG5hbWUpOgorICAgICAgICAiIiJHZW5lcmF0ZSBhIHN0cnVjdHVyZSB0eXBlIG5hbWUsIGxpa2UgVktfU1RSVUNUVVJFX1RZUEVfQ1JFQVRFX0lOU1RBTkNFX0lORk8iIiIKKyAgICAgICAgc3RydWN0dXJlX3R5cGVfcGFydHMgPSBbXQorICAgICAgICAjIFRva2VuaXplIGludG8gIndvcmRzIgorICAgICAgICBmb3IgZWxlbSBpbiBNQUlOX1JFLmZpbmRhbGwoc3RydWN0bmFtZSk6CisgICAgICAgICAgICB3b3JkID0gZWxlbVswXQorICAgICAgICAgICAgaWYgd29yZCA9PSAnVmsnOgorICAgICAgICAgICAgICAgIHN0cnVjdHVyZV90eXBlX3BhcnRzLmFwcGVuZCgnVktfU1RSVUNUVVJFX1RZUEUnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVfdHlwZV9wYXJ0cy5hcHBlbmQod29yZC51cHBlcigpKQorICAgICAgICByZXR1cm4gJ18nLmpvaW4oc3RydWN0dXJlX3R5cGVfcGFydHMpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgd2FybmluZ19jb21tZW50KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gd2FybmluZyBjb21tZW50IHRvIGJlIHBsYWNlZCBpbiBoZWFkZXIgb2YgZ2VuZXJhdGVkIEFzY2lpZG9jdG9yIGZpbGVzIiIiCisgICAgICAgIHJldHVybiAnLy8gV0FSTklORzogRE8gTk9UIE1PRElGWSEgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIHZrLnhtbCByZWdpc3RyeScKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBmaWxlX3N1ZmZpeChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHN1ZmZpeCBvZiBnZW5lcmF0ZWQgQXNjaWlkb2N0b3IgZmlsZXMiIiIKKyAgICAgICAgcmV0dXJuICcudHh0JworCisgICAgZGVmIGFwaV9uYW1lKHNlbGYsIHNwZWN0eXBlPSdhcGknKToKKyAgICAgICAgIiIiUmV0dXJuIEFQSSBvciBzcGVjaWZpY2F0aW9uIG5hbWUgZm9yIGNpdGF0aW9ucyBpbiByZWYgcGFnZXMucmVmCisgICAgICAgICAgIHBhZ2VzIHNob3VsZCBsaW5rIHRvIGZvcgorCisgICAgICAgICAgIHNwZWN0eXBlIGlzIHRoZSBzcGVjIHRoaXMgcmVmcGFnZSBpcyBmb3I6ICdhcGknIGlzIHRoZSBWdWxrYW4gQVBJCisgICAgICAgICAgIFNwZWNpZmljYXRpb24uIERlZmF1bHRzIHRvICdhcGknLiBJZiBhbiB1bnJlY29nbml6ZWQgc3BlY3R5cGUgaXMKKyAgICAgICAgICAgZ2l2ZW4sIHJldHVybnMgTm9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNwZWN0eXBlID09ICdhcGknIG9yIHNwZWN0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gJ1Z1bGthbicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgeG1sX3N1cHBvcnRlZF9uYW1lX29mX2FwaShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzdXBwb3J0ZWQ9IGF0dHJpYnV0ZSB1c2VkIGluIEFQSSBYTUwiIiIKKyAgICAgICAgcmV0dXJuICd2dWxrYW4nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgYXBpX3ByZWZpeChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIEFQSSB0b2tlbiBwcmVmaXgiIiIKKyAgICAgICAgcmV0dXJuICdWS18nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgd3JpdGVfY29udGFjdHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB3aGV0aGVyIGNvbnRhY3QgbGlzdCBzaG91bGQgYmUgd3JpdHRlbiB0byBleHRlbnNpb24gYXBwZW5kaWNlcyIiIgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHdyaXRlX3JlZnBhZ2VfaW5jbHVkZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgcmVmcGFnZSBpbmNsdWRlIHNob3VsZCBiZSB3cml0dGVuIHRvIGV4dGVuc2lvbiBhcHBlbmRpY2VzIiIiCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbWVtYmVyX3VzZWRfZm9yX3VuaXF1ZV92dWlkKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG1lbWJlciBuYW1lIHVzZWQgaW4gdGhlIFZVSUQtLi4uLS4uLi11bmlxdWUgSUQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnN0cnVjdHR5cGVfbWVtYmVyX25hbWUKKworICAgIGRlZiBpc19leHRlcm5zeW5jX2NvbW1hbmQoc2VsZiwgcHJvdG9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIHRoZSBwcm90b25hbWUgZWxlbWVudCBpcyBhbiBBUEkgY29tbWFuZCByZXF1aXJpbmcKKyAgICAgICAgICAgZXh0ZXJuYWwgc3luY2hyb25pemF0aW9uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gcHJvdG9uYW1lIGlzIG5vdCBOb25lIGFuZCAndmtDbWQnIGluIHByb3RvbmFtZQorCisgICAgZGVmIGlzX2FwaV9uYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgbmFtZSBpcyBpbiB0aGUgcmVzZXJ2ZWQgQVBJIG5hbWVzcGFjZS4KKyAgICAgICAgRm9yIFZ1bGthbiwgdGhlc2UgYXJlIG5hbWVzIHdpdGggYSBjYXNlLWluc2Vuc2l0aXZlICd2aycgcHJlZml4LCBvcgorICAgICAgICBhICdQRk5fdmsnIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSBwcmVmaXguCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gbmFtZVswOjJdLmxvd2VyKCkgPT0gJ3ZrJyBvciBuYW1lWzA6Nl0gPT0gJ1BGTl92aycKKworICAgIGRlZiBzcGVjVVJMKHNlbGYsIHNwZWN0eXBlPSdhcGknKToKKyAgICAgICAgIiIiUmV0dXJuIHB1YmxpYyByZWdpc3RyeSBVUkwgd2hpY2ggcmVmIHBhZ2VzIHNob3VsZCBsaW5rIHRvIGZvciB0aGUKKyAgICAgICAgICAgY3VycmVudCBhbGwtZXh0ZW5zaW9ucyBIVE1MIHNwZWNpZmljYXRpb24sIHNvIHhyZWZzIGluIHRoZQorICAgICAgICAgICBhc2NpaWRvYyBzb3VyY2UgdGhhdCBhcmVuJ3QgdG8gcmVmIHBhZ2VzIGNhbiBsaW5rIGludG8gaXQKKyAgICAgICAgICAgaW5zdGVhZC4gTi5iLiB0aGlzIG1heSBuZWVkIHRvIGNoYW5nZSBvbiBhIHBlci1yZWZwYWdlIGJhc2lzIGlmCisgICAgICAgICAgIHRoZXJlIGFyZSBtdWx0aXBsZSBkb2N1bWVudHMgaW52b2x2ZWQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gJ2h0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sJworCisgICAgQHByb3BlcnR5CisgICAgZGVmIHhtbF9hcGlfbmFtZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIHVzZWQgaW4gdGhlIGRlZmF1bHQgQVBJIFhNTCByZWdpc3RyeSBmb3IgdGhlIGRlZmF1bHQgQVBJIiIiCisgICAgICAgIHJldHVybiAndnVsa2FuJworCisgICAgQHByb3BlcnR5CisgICAgZGVmIHJlZ2lzdHJ5X3BhdGgoc2VsZik6CisgICAgICAgICIiIlJldHVybiByZWxwYXRoIHRvIHRoZSBkZWZhdWx0IEFQSSBYTUwgcmVnaXN0cnkgaW4gdGhpcyBwcm9qZWN0LiIiIgorICAgICAgICByZXR1cm4gJ3htbC92ay54bWwnCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3BlY2lmaWNhdGlvbl9wYXRoKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gcmVscGF0aCB0byB0aGUgQXNjaWlkb2N0b3Igc3BlY2lmaWNhdGlvbiBzb3VyY2VzIGluIHRoaXMgcHJvamVjdC4iIiIKKyAgICAgICAgcmV0dXJuICd7Z2VuZXJhdGVkfS9tZXRhJworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGV4dHJhX3JlZnBhZ2VfaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFueSBleHRyYSB0ZXh0IHRvIGFkZCB0byByZWZwYWdlIGhlYWRlcnMuIiIiCisgICAgICAgIHJldHVybiAnaW5jbHVkZTo6Li4vY29uZmlnL2F0dHJpYnMudHh0W10nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZXh0ZW5zaW9uX2luZGV4X3ByZWZpeGVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGV4dGVuc2lvbiBwcmVmaXhlcyB1c2VkIHRvIGdyb3VwIGV4dGVuc2lvbiByZWZwYWdlcy4iIiIKKyAgICAgICAgcmV0dXJuIFsnVktfS0hSJywgJ1ZLX0VYVCcsICdWSyddCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdW5pZmllZF9mbGFnX3JlZnBhZ2VzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBGbGFncy9GbGFnQml0cyByZWZwYWdlcyBhcmUgdW5pZmllZCwgRmFsc2UgaWYKKyAgICAgICAgICAgdGhleSdyZSBzZXBhcmF0ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNwZWNfcmVmbG93X3BhdGgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc3BlYyBzb3VyY2UgZm9sZGVyIHRvIHJlZmxvdyIiIgorICAgICAgICByZXR1cm4gJy4nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3BlY19ub19yZWZsb3dfZGlycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc2V0IG9mIGRpcmVjdG9yaWVzIG5vdCB0byBhdXRvbWF0aWNhbGx5IGRlc2NlbmQgaW50bworICAgICAgICAgICB3aGVuIHJlZmxvd2luZyBzcGVjIHRleHQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAoJ3NjcmlwdHMnLCAnc3R5bGUnKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHplcm8oc2VsZik6CisgICAgICAgIHJldHVybiAnYDBgJworCisgICAgZGVmIGNhdGVnb3J5X3JlcXVpcmVzX3ZhbGlkYXRpb24oc2VsZiwgY2F0ZWdvcnkpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSAnY2F0ZWdvcnknIGFsd2F5cyByZXF1aXJlcyB2YWxpZGF0aW9uLgorCisgICAgICAgIE92ZXJyaWRkZW4gYmVjYXVzZSBWdWxrYW4gZG9lc24ndCByZXF1aXJlICJ2YWxpZCIgdGV4dCBmb3IgYmFzZXR5cGUgaW4gdGhlIHNwZWMgcmlnaHQgbm93LiIiIgorICAgICAgICByZXR1cm4gY2F0ZWdvcnkgaW4gQ0FURUdPUklFU19SRVFVSVJJTkdfVkFMSURBVElPTgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNob3VsZF9za2lwX2NoZWNraW5nX2NvZGVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBtb3JlIHRoYW4gdGhlIGJhc2ljIHZhbGlkYXRpb24gb2YgcmV0dXJuIGNvZGVzIHNob3VsZAorICAgICAgICBiZSBza2lwcGVkIGZvciBhIGNvbW1hbmQuCisKKyAgICAgICAgVnVsa2FuIG1vc3RseSByZWxpZXMgb24gdGhlIHZhbGlkYXRpb24gbGF5ZXJzIHJhdGhlciB0aGFuIEFQSQorICAgICAgICBidWlsdGluIGVycm9yIGNoZWNraW5nLCBzbyB0aGVzZSBjaGVja3MgYXJlIG5vdCBhcHByb3ByaWF0ZS4KKworICAgICAgICBGb3IgZXhhbXBsZSwgcGFzc2luZyBpbiBhIFZrRm9ybWF0IHBhcmFtZXRlciB3aWxsIG5vdCBwb3RlbnRpYWxseQorICAgICAgICBnZW5lcmF0ZSBhIFZLX0VSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEIGNvZGUuIiIiCisKKyAgICAgICAgcmV0dXJuIFRydWUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy8uYXBwdmV5b3IueW1sIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjLy5hcHB2ZXlvci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0Njg5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy8uYXBwdmV5b3IueW1sCkBAIC0wLDAgKzEsNzcgQEAKKyMgV2luZG93cyBCdWlsZCBDb25maWd1cmF0aW9uIGZvciBBcHBWZXlvcgorIyBodHRwOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2FwcHZleW9yLXltbAorIworCisjIFRoaXMgdmVyc2lvbiBzdGFydHMgYSBzZXBhcnRlIGpvYiBmb3IgZWFjaCBwbGF0Zm9ybSBjb25maWcKKyMgaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGUgQXBwVmV5b3IgbGltaXQgb2YgNjAgbWlucyBwZXIgam9iLgorCisjIGJ1aWxkIHZlcnNpb24gZm9ybWF0Cit2ZXJzaW9uOiAie2J1aWxkfSIKKworIyBGcmVlIGFjY291bnRzIGhhdmUgYSBtYXggb2YgMSwgYnV0IGFzayBhbnl3YXkuCittYXhfam9iczogNAorCitvczoKKyAgLSBWaXN1YWwgU3R1ZGlvIDIwMTUKKworaW5pdDoKKyAgLSBnaXQgY29uZmlnIC0tZ2xvYmFsIGNvcmUuYXV0b2NybGYgdHJ1ZQorCitlbnZpcm9ubWVudDoKKyAgUFlUSE9OX1BBVEg6ICJDOi9QeXRob24zNSIKKyAgUFlUSE9OX1BBQ0tBR0VfUEFUSDogIkM6L1B5dGhvbjM1L1NjcmlwdHMiCisgIENNQUtFX1VSTDogImh0dHA6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLXdpbjY0LXg2NC56aXAiCisKK2JyYW5jaGVzOgorICBvbmx5OgorICAgIC0gbWFzdGVyCisKK2luc3RhbGw6CisgIC0gYXBwdmV5b3IgRG93bmxvYWRGaWxlICVDTUFLRV9VUkwlIC1GaWxlTmFtZSBjbWFrZS56aXAKKyAgLSA3eiB4IGNtYWtlLnppcCAtb0M6XGNtYWtlID4gbnVsCisgIC0gc2V0IHBhdGg9QzpcY21ha2VcYmluOyVwYXRoJQorICAtIGNtYWtlIC0tdmVyc2lvbgorCitiZWZvcmVfYnVpbGQ6CisgIC0gIlNFVCBQQVRIPUM6XFxQeXRob24zNTtDOlxcUHl0aG9uMzVcXFNjcmlwdHM7JVBBVEglIgorICAtIGVjaG8uCisgIC0gZWNobyBTdGFydGluZyBidWlsZCBmb3IgJUFQUFZFWU9SX1JFUE9fTkFNRSUKKyAgIyBJbnN0YWxsIGRlcGVuZGVuY2llcworICAtIHB5dGhvbiBzY3JpcHRzL3VwZGF0ZV9kZXBzLnB5IC0tZGlyPWV4dGVybmFsCisgICMgR2V0IEdvb2dsZSBUZXN0CisgIC0gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xldGVzdC5naXQgZXh0ZXJuYWwvZ29vZ2xldGVzdAorICAtIGNkIGV4dGVybmFsL2dvb2dsZXRlc3QKKyAgLSBnaXQgY2hlY2tvdXQgdGFncy9yZWxlYXNlLTEuOC4xCisgIC0gY2QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKyAgIyBWZXJpZnkgY29uc2lzdGVuY3kgYmV0d2VlbiBzb3VyY2UgZmlsZSBnZW5lcmF0b3JzIGFuZCBvdXRwdXQKKyAgLSBlY2hvIFZlcmlmeWluZyBjb25zaXN0ZW5jeSBiZXR3ZWVuIHNvdXJjZSBmaWxlIGdlbmVyYXRvcnMgYW5kIG91dHB1dAorICAtIHB5dGhvbiBzY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weSAtLXZlcmlmeSBleHRlcm5hbC9WdWxrYW4tSGVhZGVycy9yZWdpc3RyeQorICAjIEdlbmVyYXRlIGJ1aWxkIGZpbGVzIHVzaW5nIENNYWtlIGZvciB0aGUgYnVpbGQgc3RlcC4KKyAgLSBlY2hvIEdlbmVyYXRpbmcgQ01ha2UgZmlsZXMgZm9yICVQTEFURk9STSUKKyAgLSBta2RpciBidWlsZAorICAtIGNkIGJ1aWxkCisgIC0gY21ha2UgLUEgJVBMQVRGT1JNJSAtQy4uL2V4dGVybmFsL2hlbHBlci5jbWFrZSAuLgorICAtIGVjaG8gQnVpbGRpbmcgcGxhdGZvcm09JVBMQVRGT1JNJSBjb25maWd1cmF0aW9uPSVDT05GSUdVUkFUSU9OJQorCitwbGF0Zm9ybToKKyAgLSBXaW4zMgorICAtIHg2NAorCitjb25maWd1cmF0aW9uOgorICAtIFJlbGVhc2UKKyAgLSBEZWJ1ZworCisjIEJ1aWxkIG9ubHkgeDY0IFJlbGVhc2UgYW5kIFdpbjMyKHg4NikgRGVidWcgdG8gcmVkdWNlIGJ1aWxkIHRpbWUuCisjIFRoaXMgc2hvdWxkIHN0aWxsIHByb3ZpZGUgYWRlcXVhdGUgMzItYml0IHZzIDY0LWJpdCBhbmQKKyMgUmVsZWFzZSB2cyBEZWJ1ZyBjb3ZlcmFnZS4KK21hdHJpeDoKKyAgZXhjbHVkZToKKyAgICAtIGNvbmZpZ3VyYXRpb246IFJlbGVhc2UKKyAgICAgIHBsYXRmb3JtOiBXaW4zMgorICAgIC0gY29uZmlndXJhdGlvbjogRGVidWcKKyAgICAgIHBsYXRmb3JtOiB4NjQKKworYnVpbGQ6CisgIHBhcmFsbGVsOiB0cnVlICAgICAgICAgICAgICAgICAgICMgZW5hYmxlIE1TQnVpbGQgcGFyYWxsZWwgYnVpbGRzCisgIHByb2plY3Q6IGJ1aWxkL1Z1bGthbi1Mb2FkZXIuc2xuICMgcGF0aCB0byBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIG9yIHByb2plY3QKKyAgdmVyYm9zaXR5OiBxdWlldCAgICAgICAgICAgICAgICAgIyBxdWlldHxtaW5pbWFsfG5vcm1hbHxkZXRhaWxlZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjLy5jbGFuZy1mb3JtYXQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWY0ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjLy5jbGFuZy1mb3JtYXQKQEAgLTAsMCArMSw3IEBACistLS0KKyMgVXNlIGRlZmF1bHRzIGZyb20gdGhlIEdvb2dsZSBzdHlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKK0Jhc2VkT25TdHlsZTogR29vZ2xlCitJbmRlbnRXaWR0aDogNAorQ29sdW1uTGltaXQ6IDEzMgorU29ydEluY2x1ZGVzOiBmYWxzZQorLi4uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvLmNtYWtlLWZvcm1hdC5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy8uY21ha2UtZm9ybWF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDJmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvLmNtYWtlLWZvcm1hdC5weQpAQCAtMCwwICsxLDM0IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIGNtYWtlLWZvcm1hdCAodjAuNC4xLCBjaXJjYSBKdWwgMjAxOCkKKyMgaHR0cHM6Ly9naXRodWIuY29tL2NoZXNoaXJla293L2NtYWtlX2Zvcm1hdAorCisjIEhvdyB3aWRlIHRvIGFsbG93IGZvcm1hdHRlZCBjbWFrZSBmaWxlcworbGluZV93aWR0aCA9IDEzMgorCisjIEhvdyBtYW55IHNwYWNlcyB0byB0YWIgZm9yIGluZGVudAordGFiX3NpemUgPSA0CisKKyMgSWYgYXJnbGlzdHMgYXJlIGxvbmdlciB0aGFuIHRoaXMsIGJyZWFrIHRoZW0gYWx3YXlzCittYXhfc3ViYXJnc19wZXJfbGluZSA9IDMKKworIyBJZiB0cnVlLCBzZXBhcmF0ZSBmbG93IGNvbnRyb2wgbmFtZXMgZnJvbSB0aGVpciBwYXJlbnRoZXNlcyB3aXRoIGEgc3BhY2UKK3NlcGFyYXRlX2N0cmxfbmFtZV93aXRoX3NwYWNlID0gRmFsc2UKKworIyBJZiB0cnVlLCBzZXBhcmF0ZSBmdW5jdGlvbiBuYW1lcyBmcm9tIHBhcmVudGhlc2VzIHdpdGggYSBzcGFjZQorc2VwYXJhdGVfZm5fbmFtZV93aXRoX3NwYWNlID0gRmFsc2UKKworIyBJZiBhIHN0YXRlbWVudCBpcyB3cmFwcGVkIHRvIG1vcmUgdGhhbiBvbmUgbGluZSwgdGhhbiBkYW5nbGUgdGhlIGNsb3NpbmcKKyMgcGFyZW50aGVzaXMgb24gaXQncyBvd24gbGluZQorZGFuZ2xlX3BhcmVucyA9IEZhbHNlCisKKyMgV2hhdCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBidWxsZXRlZCBsaXN0cworYnVsbGV0X2NoYXIgPSB1JyonCisKKyMgV2hhdCBjaGFyYWN0ZXIgdG8gdXNlIGFzIHB1bmN0dWF0aW9uIGFmdGVyIG51bWVyYWxzIGluIGFuIGVudW1lcmF0ZWQgbGlzdAorZW51bV9jaGFyID0gdScuJworCisjIFdoYXQgc3R5bGUgbGluZSBlbmRpbmdzIHRvIHVzZSBpbiB0aGUgb3V0cHV0LgorbGluZV9lbmRpbmcgPSB1J3VuaXgnCisKKyMgRm9ybWF0IGNvbW1hbmQgbmFtZXMgY29uc2lzdGVudGx5IGFzICdsb3dlcicgb3IgJ3VwcGVyJyBjYXNlCitjb21tYW5kX2Nhc2UgPSB1J2xvd2VyJworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvLmduIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjLy5nbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTkwMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjLy5nbgpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoQykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2J1aWxkY29uZmlnID0gIi8vYnVpbGQvY29uZmlnL0JVSUxEQ09ORklHLmduIgorc2Vjb25kYXJ5X3NvdXJjZSA9ICIvL2J1aWxkLWduL3NlY29uZGFyeS8iCisKK2RlZmF1bHRfYXJncyA9IHsKKyAgICBjbGFuZ191c2VfY2hyb21lX3BsdWdpbnMgPSBmYWxzZQorICAgIHVzZV9jdXN0b21fbGliY3h4ID0gZmFsc2UKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjLy50cmF2aXMueW1sIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzAyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvLnRyYXZpcy55bWwKQEAgLTAsMCArMSwxMzkgQEAKKyMgQnVpbGQgQ29uZmlndXJhdGlvbiBmb3IgVHJhdmlzIENJCisjIGh0dHBzOi8vdHJhdmlzLWNpLm9yZworCitkaXN0OiB4ZW5pYWwKK3N1ZG86IHJlcXVpcmVkCitsYW5ndWFnZTogY3BwCisKK21hdHJpeDoKKyAgIyBTaG93IGZpbmFsIHN0YXR1cyBpbW1lZGlhdGVseSBpZiBhIHRlc3QgZmFpbHMuCisgIGZhc3RfZmluaXNoOiB0cnVlCisgIGFsbG93X2ZhaWx1cmVzOgorICAgIC0gZW52OiBDSEVDS19DT01NSVRfRk9STUFUPU9OCisgICAgLSBlbnY6IFZVTEtBTl9CVUlMRF9UQVJHRVQ9R04KKyAgaW5jbHVkZToKKyAgICAjIExpbnV4IEdDQyBkZWJ1ZyBidWlsZC4KKyAgICAtIG9zOiBsaW51eAorICAgICAgY29tcGlsZXI6IGdjYworICAgICAgZW52OiBWVUxLQU5fQlVJTERfVEFSR0VUPUxJTlVYCisgICAgIyBMaW51eCBjbGFuZyBkZWJ1ZyBidWlsZC4KKyAgICAtIG9zOiBsaW51eAorICAgICAgY29tcGlsZXI6IGNsYW5nCisgICAgICBlbnY6IFZVTEtBTl9CVUlMRF9UQVJHRVQ9TElOVVgKKyAgICAjIExpbnV4IEdOIGRlYnVnIGJ1aWxkCisgICAgLSBvczogbGludXgKKyAgICAgIGVudjogVlVMS0FOX0JVSUxEX1RBUkdFVD1HTgorICAgICMgTWFjT1MgY2xhbmcgZGVidWcgYnVpbGQuCisgICAgLSBvczogb3N4CisgICAgICBjb21waWxlcjogY2xhbmcKKyAgICAgIGVudjogVlVMS0FOX0JVSUxEX1RBUkdFVD1NQUNPUworICAgICMgQ2hlY2sgZm9yIHByb3BlciBjbGFuZyBmb3JtYXR0aW5nIGluIHRoZSBwdWxsIHJlcXVlc3QuCisgICAgLSBlbnY6IENIRUNLX0ZPUk1BVD1PTgorICAgICMgQ2hlY2sgZm9yIHByb3BlciBjb21taXQgbWVzc2FnZSBmb3JtYXR0aW5nIGZvciBjb21taXRzIGluIFBSCisgICAgLSBlbnY6IENIRUNLX0NPTU1JVF9GT1JNQVQ9T04KKworY2FjaGU6IGNjYWNoZQorCisjIFVzZSBzZXQgLWUgc28gdGhhdCB0aGUgYnVpbGQgZmFpbHMgd2hlbiBhIGNvbW1hbmQgZmFpbHMuCisjIE5vdGUgdGhhdCBzZXQgK2UgbXVzdCBiZSBjYWxsZWQgYXQgdGhlIGVuZCBvciBlbHNlIGZhaWx1cmVzIG1heSBvY2N1ciB3aXRoaW4gVHJhdmlzCisjIFRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgVHJhdmlzLUNJIGlzIHRvIGNvbnRpbnVlIHJ1bm5pbmcgZXZlbiBpZiBhIGNvbW1hbmQgZmFpbHMuCisjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHJhdmlzLWNpL3RyYXZpcy1jaS9pc3N1ZXMvMTA2Ni4KKyMgVXNlIHRoZSBZQU1MIGJsb2NrIHNjYWxhciBoZWFkZXIgKHwpIHRvIGFsbG93IGVhc2llciBtdWx0aWxpbmUgc2NyaXB0IGNvZGluZy4KKworYmVmb3JlX2luc3RhbGw6CisgIC0gc2V0IC1lCisgIC0gQ01BS0VfVkVSU0lPTj0zLjEwLjIKKyAgLSB8CisgICAgaWYgW1sgIiR7VFJBVklTX09TX05BTUV9IiA9PSAibGludXgiIF1dOyB0aGVuCisgICAgICAjIFVwZ3JhZGUgdG8gdGhlIGRlc2lyZWQgdmVyc2lvbiBvZiBDTWFrZQorICAgICAgQ01BS0VfVVJMPSJodHRwczovL2NtYWtlLm9yZy9maWxlcy92JHtDTUFLRV9WRVJTSU9OJS4qfS9jbWFrZS0ke0NNQUtFX1ZFUlNJT059LUxpbnV4LXg4Nl82NC50YXIuZ3oiCisgICAgICBlY2hvIENNQUtFX1VSTD0ke0NNQUtFX1VSTH0KKyAgICAgIG1rZGlyIGNtYWtlLSR7Q01BS0VfVkVSU0lPTn0gJiYgdHJhdmlzX3JldHJ5IHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAtTyAtICR7Q01BS0VfVVJMfSB8IHRhciAtLXN0cmlwLWNvbXBvbmVudHM9MSAteHogLUMgY21ha2UtJHtDTUFLRV9WRVJTSU9OfQorICAgICAgZXhwb3J0IFBBVEg9JHtQV0R9L2NtYWtlLSR7Q01BS0VfVkVSU0lPTn0vYmluOiR7UEFUSH0KKyAgICBlbHNlCisgICAgICBicmV3IGluc3RhbGwgY21ha2UgfHwgYnJldyB1cGdyYWRlIGNtYWtlCisgICAgZmkKKyAgICBjbWFrZSAtLXZlcnNpb24KKyAgLSB1bnNldCAtZiBjZCBwdXNoZCBwb3BkCisgIC0gfAorICAgIGlmIFtbICIkVFJBVklTX0VWRU5UX1RZUEUiID09ICJjcm9uIiBdXTsgdGhlbgorICAgICAgICAjIEFkZCBhbiBvcHRpb24gdG8gdXBkYXRlIGRlcGVuZGVuY2llcyBmcm9tIG1hc3RlcgorICAgICAgICBVUERBVEVfREVQU19FWFRSQV9PUFRJT05TPSItLXJlZj1tYXN0ZXIiCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRWVUxLQU5fQlVJTERfVEFSR0VUIiA9PSAiTElOVVgiIF1dIHx8IFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkdOIiBdXTsgdGhlbgorICAgICAgIyBJbnN0YWxsIHRoZSBhcHByb3ByaWF0ZSBMaW51eCBwYWNrYWdlcy4KKyAgICAgIHN1ZG8gYXB0LWdldCAtcXEgdXBkYXRlCisgICAgICBzdWRvIGFwdC1nZXQgLXkgaW5zdGFsbCBsaWJ4a2Jjb21tb24tZGV2IGxpYndheWxhbmQtZGV2IGxpYnhyYW5kci1kZXYgbGlieDExLXhjYi1kZXYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0aG9uLXBhdGhsaWIKKyAgICBmaQorICAtIHwKKyAgICBpZiBbWyAiJFZVTEtBTl9CVUlMRF9UQVJHRVQiID09ICJMSU5VWCIgXV0gfHwgW1sgIiRWVUxLQU5fQlVJTERfVEFSR0VUIiA9PSAiTUFDT1MiIF1dOyB0aGVuCisgICAgICAjIEluc3RhbGwgZGVwZW5kZW5jaWVzCisgICAgICBweXRob24gc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLWRpcj1leHRlcm5hbCAkVVBEQVRFX0RFUFNfRVhUUkFfT1BUSU9OUworICAgICAgIyBHZXQgR29vZ2xlIFRlc3QKKyAgICAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QuZ2l0IGV4dGVybmFsL2dvb2dsZXRlc3QKKyAgICAgIHB1c2hkICR7VFJBVklTX0JVSUxEX0RJUn0vZXh0ZXJuYWwvZ29vZ2xldGVzdAorICAgICAgZ2l0IGNoZWNrb3V0IHRhZ3MvcmVsZWFzZS0xLjguMQorICAgICAgcG9wZAorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkQ0hFQ0tfRk9STUFUIiA9PSAiT04iICYmICIkVFJBVklTX1BVTExfUkVRVUVTVCIgIT0gImZhbHNlIiBdXTsgdGhlbgorICAgICAgIyBJbnN0YWxsIHRoZSBjbGFuZyBmb3JtYXQgZGlmZiB0b29sLCBidXQgb25seSBmb3IgcHVsbCByZXF1ZXN0cy4KKyAgICAgIGN1cmwgLUwgaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3QvY2ZlL3RydW5rL3Rvb2xzL2NsYW5nLWZvcm1hdC9jbGFuZy1mb3JtYXQtZGlmZi5weSAtbyBzY3JpcHRzL2NsYW5nLWZvcm1hdC1kaWZmLnB5OworICAgIGZpCisgICMgTWlzYyBzZXR1cAorICAtIHwKKyAgLSBleHBvcnQgY29yZV9jb3VudD0kKG5wcm9jIHx8IGVjaG8gNCkgJiYgZWNobyBjb3JlX2NvdW50ID0gJGNvcmVfY291bnQKKyAgLSBzZXQgK2UKKworIyBJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIGB1bnNldCAtZiBjZGAgb24gTWFjT1MgYmVjYXVzZSBSVk0gb3ZlcnJpZGVzIGl0LCB3aGljaCBjYXVzZXMgY29uZmxpY3RzIHdpdGggYHNldCAtZWAKKworc2NyaXB0OgorICAtIHNldCAtZQorICAtIHwKKyAgICBpZiBbWyAiJFZVTEtBTl9CVUlMRF9UQVJHRVQiID09ICJMSU5VWCIgXV0gfHwgW1sgIiRWVUxLQU5fQlVJTERfVEFSR0VUIiA9PSAiTUFDT1MiIF1dOyB0aGVuCisgICAgICAjIFZlcmlmeSBjb25zaXN0ZW5jeSBiZXR3ZWVuIHNvdXJjZSBmaWxlIGdlbmVyYXRvcnMgYW5kIG91dHB1dAorICAgICAgZWNobyBWZXJpZnlpbmcgY29uc2lzdGVuY3kgYmV0d2VlbiBzb3VyY2UgZmlsZSBnZW5lcmF0b3JzIGFuZCBvdXRwdXQKKyAgICAgIHB5dGhvbjMgc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkgLS12ZXJpZnkgZXh0ZXJuYWwvVnVsa2FuLUhlYWRlcnMvcmVnaXN0cnkKKyAgICAgICMgQnVpbGQgVnVsa2FuLUxvYWRlcgorICAgICAgbWtkaXIgYnVpbGQKKyAgICAgIGNkIGJ1aWxkCisgICAgICBjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLUMuLi9leHRlcm5hbC9oZWxwZXIuY21ha2UgLi4KKyAgICAgIG1ha2UgLWogJGNvcmVfY291bnQKKyAgICAgIGNkIC4uCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRWVUxLQU5fQlVJTERfVEFSR0VUIiA9PSAiR04iIF1dOyB0aGVuCisgICAgICBnaXQgY2xvbmUgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3Rvb2xzL2RlcG90X3Rvb2xzLmdpdCBkZXBvdF90b29scworICAgICAgZXhwb3J0IFBBVEg9JFBBVEg6JFBXRC9kZXBvdF90b29scworICAgICAgLi9idWlsZC1nbi91cGRhdGVfZGVwcy5zaAorICAgICAgZ24gZ2VuIG91dC9EZWJ1ZworICAgICAgbmluamEgLUMgb3V0L0RlYnVnCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRDSEVDS19GT1JNQVQiID09ICJPTiIgXV07IHRoZW4KKyAgICAgIGlmIFtbICIkVFJBVklTX1BVTExfUkVRVUVTVCIgIT0gImZhbHNlIiBdXTsgdGhlbgorICAgICAgICAjIFJ1biB0aGUgY2xhbmcgZm9ybWF0IGNoZWNrIG9ubHkgZm9yIHB1bGwgcmVxdWVzdCBidWlsZHMgYmVjYXVzZSB0aGUKKyAgICAgICAgIyBtYXN0ZXIgYnJhbmNoIGlzIG5lZWRlZCB0byBkbyB0aGUgZ2l0IGRpZmYuCisgICAgICAgIGVjaG8gIkNoZWNraW5nIGNsYW5nLWZvcm1hdCBiZXR3ZWVuIFRSQVZJU19CUkFOQ0g9JFRSQVZJU19CUkFOQ0ggYW5kIFRSQVZJU19QVUxMX1JFUVVFU1RfQlJBTkNIPSRUUkFWSVNfUFVMTF9SRVFVRVNUX0JSQU5DSCIKKyAgICAgICAgLi9zY3JpcHRzL2NoZWNrX2NvZGVfZm9ybWF0LnNoCisgICAgICBlbHNlCisgICAgICAgIGVjaG8gIlNraXBwaW5nIGNsYW5nLWZvcm1hdCBjaGVjayBzaW5jZSB0aGlzIGlzIG5vdCBhIHB1bGwgcmVxdWVzdC4iCisgICAgICBmaQorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkQ0hFQ0tfQ09NTUlUX0ZPUk1BVCIgPT0gIk9OIiBdXTsgdGhlbgorICAgICAgaWYgW1sgIiRUUkFWSVNfUFVMTF9SRVFVRVNUIiAhPSAiZmFsc2UiIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIkNoZWNraW5nIGNvbW1pdCBtZXNzYWdlIGZvcm1hdHM6ICBTZWUgQ09OVFJJQlVUSU5HLm1kIgorICAgICAgICAuL3NjcmlwdHMvY2hlY2tfY29tbWl0X21lc3NhZ2VfZm9ybWF0LnNoCisgICAgICBmaQorICAgIGZpCisgIC0gc2V0ICtlCisKK25vdGlmaWNhdGlvbnM6CisgIGVtYWlsOgorICAgIHJlY2lwaWVudHM6CisgICAgICAtIGxlbm55QGx1bmFyZy5jb20KKyAgICBvbl9zdWNjZXNzOiBjaGFuZ2UKKyAgICBvbl9mYWlsdXJlOiBhbHdheXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9CVUlMRC5nbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9CVUlMRC5nbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGE1NWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL0JVSUxELmduCkBAIC0wLDAgKzEsMTM2IEBACisjIENvcHlyaWdodCAoQykgMjAxOC0yMDE5IFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuCisjIENvcHlyaWdodCAoQykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCgiLy9idWlsZF9vdmVycmlkZXMvdnVsa2FuX2xvYWRlci5nbmkiKQorCisjIEZ1Y2hzaWEgaGFzIG5vbi11cHN0cmVhbSBjaGFuZ2VzIHRvIHRoZSB2dWxrYW4gbG9hZGVyLCBzbyB3ZSBkb24ndCB3YW50CisjIHRvIGJ1aWxkIGl0IGZyb20gdXBzdHJlYW0gc291cmNlcy4KK2Fzc2VydCghaXNfZnVjaHNpYSkKKworaWYgKCFpc19hbmRyb2lkKSB7CisgIHZ1bGthbl91bmRlZmluZV9jb25maWdzID0gW10KK30KK2lmIChpc193aW4pIHsKKyAgdnVsa2FuX3VuZGVmaW5lX2NvbmZpZ3MgKz0gWworICAgICIvL2J1aWxkL2NvbmZpZy93aW46bm9taW5tYXgiLAorICAgICIvL2J1aWxkL2NvbmZpZy93aW46dW5pY29kZSIsCisgIF0KK30KKworY29uZmlnKCJ2dWxrYW5faW50ZXJuYWxfY29uZmlnIikgeworICBkZWZpbmVzID0gWyAiVlVMS0FOX05PTl9DTUFLRV9CVUlMRCIgXQorICBpZiAoaXNfY2xhbmcgfHwgIWlzX3dpbikgeworICAgIGNmbGFncyA9IFsgIi1Xbm8tdW51c2VkLWZ1bmN0aW9uIiBdCisgIH0KKyAgaWYgKGlzX2xpbnV4IHx8IGlzX21hYykgeworICAgIGRlZmluZXMgKz0gWworICAgICAgIlNZU0NPTkZESVI9XCIvZXRjXCIiLAorICAgICAgIkZBTExCQUNLX0NPTkZJR19ESVJTPVwiL2V0Yy94ZGdcIiIsCisgICAgICAiRkFMTEJBQ0tfREFUQV9ESVJTPVwiL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlXCIiLAorICAgIF0KKyAgfQorfQorCisjIFZ1bGthbiBsb2FkZXIKKyMgLS0tLS0tLS0tLS0tLQorCitjb25maWcoInZ1bGthbl9sb2FkZXJfY29uZmlnIikgeworICBpbmNsdWRlX2RpcnMgPSBbCisgICAgImxvYWRlci9nZW5lcmF0ZWQiLAorICAgICJsb2FkZXIiLAorICBdCisgIGRlZmluZXMgPSBbCisgICAgIkFQSV9OQU1FPVwiVnVsa2FuXCIiLAorICAgICJVU0VfVU5TQUZFX0ZJTEVfU0VBUkNIPTEiCisgIF0KKworICBpZiAoaXNfd2luKSB7CisgICAgY2ZsYWdzID0gWyAiL3dkNDIwMSIgXQorICB9CisgIGlmIChpc19saW51eCkgeworICAgICMgYXNzdW1lIHNlY3VyZV9nZXRlbnYoKSBpcyBhdmFpbGFibGUKKyAgICBkZWZpbmVzICs9IFsgIkhBVkVfU0VDVVJFX0dFVEVOViIgXQorICB9Cit9CisKK2lmICghaXNfYW5kcm9pZCkgeworICBpZiAodnVsa2FuX2xvYWRlcl9zaGFyZWQpIHsKKyAgICBsaWJyYXJ5X3R5cGUgPSAic2hhcmVkX2xpYnJhcnkiCisgIH0gZWxzZSB7CisgICAgbGlicmFyeV90eXBlID0gInN0YXRpY19saWJyYXJ5IgorICB9CisKKyAgdGFyZ2V0KGxpYnJhcnlfdHlwZSwgImxpYnZ1bGthbiIpIHsKKyAgICBzb3VyY2VzID0gWworICAgICAgImxvYWRlci9hc21fb2Zmc2V0LmMiLAorICAgICAgImxvYWRlci9jSlNPTi5jIiwKKyAgICAgICJsb2FkZXIvY0pTT04uaCIsCisgICAgICAibG9hZGVyL2RlYnVnX3V0aWxzLmMiLAorICAgICAgImxvYWRlci9kZWJ1Z191dGlscy5oIiwKKyAgICAgICJsb2FkZXIvZGV2X2V4dF90cmFtcG9saW5lLmMiLAorICAgICAgImxvYWRlci9leHRlbnNpb25fbWFudWFsLmMiLAorICAgICAgImxvYWRlci9leHRlbnNpb25fbWFudWFsLmgiLAorICAgICAgImxvYWRlci9ncGFfaGVscGVyLmgiLAorICAgICAgImxvYWRlci9sb2FkZXIuYyIsCisgICAgICAibG9hZGVyL2xvYWRlci5oIiwKKyAgICAgICJsb2FkZXIvbXVybXVyaGFzaC5jIiwKKyAgICAgICJsb2FkZXIvbXVybXVyaGFzaC5oIiwKKyAgICAgICJsb2FkZXIvcGh5c19kZXZfZXh0LmMiLAorICAgICAgImxvYWRlci90cmFtcG9saW5lLmMiLAorCisgICAgICAjIFRPRE8oam1hZGlsbCk6IFVzZSBhc3NlbWJsZXIgd2hlcmUgYXZhaWxhYmxlLgorICAgICAgImxvYWRlci91bmtub3duX2V4dF9jaGFpbi5jIiwKKyAgICAgICJsb2FkZXIvdmtfbG9hZGVyX3BsYXRmb3JtLmgiLAorICAgICAgImxvYWRlci93c2kuYyIsCisgICAgICAibG9hZGVyL3dzaS5oIiwKKyAgICBdCisgICAgaWYgKGlzX3dpbikgeworICAgICAgc291cmNlcyArPSBbCisgICAgICAgICJsb2FkZXIvZGlyZW50X29uX3dpbmRvd3MuYyIsCisgICAgICAgICJsb2FkZXIvZGlyZW50X29uX3dpbmRvd3MuaCIsCisgICAgICAgICJsb2FkZXIvZHhnaV9sb2FkZXIuYyIsCisgICAgICAgICJsb2FkZXIvZHhnaV9sb2FkZXIuaCIsCisgICAgICBdCisgICAgICBpZiAoIWlzX2NsYW5nKSB7CisgICAgICAgIGNmbGFncyA9IFsKKyAgICAgICAgICAiL3dkNDA1NCIsICAjIFR5cGUgY2FzdCBmcm9tIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAgICAgICAiL3dkNDA1NSIsICAjIFR5cGUgY2FzdCBmcm9tIGRhdGEgcG9pbnRlcgorICAgICAgICAgICIvd2Q0MTAwIiwgICMgVW5yZWZlcmVuY2VkIGZvcm1hbCBwYXJhbWV0ZXIKKyAgICAgICAgICAiL3dkNDE1MiIsICAjIE5vbnN0YW5kYXJkIGV4dGVuc2lvbiB1c2VkIChwb2ludGVyIGNvbnZlcnNpb24pCisgICAgICAgICAgIi93ZDQyMDEiLCAgIyBOb25zdGFuZGFyZCBleHRlbnNpb24gdXNlZDogbmFtZWxlc3Mgc3RydWN0L3VuaW9uCisgICAgICAgICAgIi93ZDQyMTQiLCAgIyBOb25zdGFuZGFyZCBleHRlbnNpb24gdXNlZDogYml0IGZpZWxkIHR5cGVzIG90aGVyIHRoYW4gaW50CisgICAgICAgICAgIi93ZDQyMzIiLCAgIyBOb25zdGFuZGFyZCBleHRlbnNpb24gdXNlZDogYWRkcmVzcyBvZiBkbGxpbXBvcnQgaXMgbm90IHN0YXRpYworICAgICAgICAgICIvd2Q0MzA1IiwgICMgVHlwZSBjYXN0IHRydW5jYXRpb24KKyAgICAgICAgICAiL3dkNDcwNiIsICAjIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KKyAgICAgICAgICAiL3dkNDk5NiIsICAjIFVuc2FmZSBzdGRsaWIgZnVuY3Rpb24KKyAgICAgICAgXQorICAgICAgfQorICAgICAgaWYgKGlzX2NsYW5nKSB7CisgICAgICAgICAgY2ZsYWdzID0gWyAiLVduby1pbmNvbXBhdGlibGUtcG9pbnRlci10eXBlcyIgXQorICAgICAgfQorICAgIH0KKyAgICBpZiAoaXNfbWFjKSB7CisgICAgICBsaWJzID0gWyAiQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIiBdCisgICAgfQorICAgIHB1YmxpY19kZXBzID0gWworICAgICAgIiR2dWxrYW5faGVhZGVyc19kaXI6dnVsa2FuX2hlYWRlcnMiLAorICAgIF0KKyAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsgIjp2dWxrYW5faW50ZXJuYWxfY29uZmlnIiBdCisgICAgcHVibGljX2NvbmZpZ3MgPSBbICI6dnVsa2FuX2xvYWRlcl9jb25maWciIF0KKyAgICBjb25maWdzIC09IHZ1bGthbl91bmRlZmluZV9jb25maWdzCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9CVUlMRC5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9CVUlMRC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmM3MDc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL0JVSUxELm1kCkBAIC0wLDAgKzEsNjkzIEBACisjIEJ1aWxkIEluc3RydWN0aW9ucworCitJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIHRoaXMgcmVwb3NpdG9yeSBvbiBMaW51eCwgV2luZG93cywgYW5kIE1hY09TLgorCisjIyBJbmRleAorCisxLiBbQ29udHJpYnV0aW5nXSgjY29udHJpYnV0aW5nLXRvLXRoZS1yZXBvc2l0b3J5KQorMS4gW1JlcG9zaXRvcnkgQ29udGVudF0oI3JlcG9zaXRvcnktY29udGVudCkKKzEuIFtSZXBvc2l0b3J5IFNldC1VcF0oI3JlcG9zaXRvcnktc2V0LXVwKQorMS4gW1dpbmRvd3MgQnVpbGRdKCNidWlsZGluZy1vbi13aW5kb3dzKQorMS4gW0xpbnV4IEJ1aWxkXSgjYnVpbGRpbmctb24tbGludXgpCisxLiBbTWFjT1MgYnVpbGRdKCNidWlsZGluZy1vbi1tYWNvcykKKworIyMgQ29udHJpYnV0aW5nIHRvIHRoZSBSZXBvc2l0b3J5CisKK0lmIHlvdSBpbnRlbmQgdG8gY29udHJpYnV0ZSwgdGhlIHByZWZlcnJlZCB3b3JrIGZsb3cgaXMgZm9yIHlvdSB0byBkZXZlbG9wCit5b3VyIGNvbnRyaWJ1dGlvbiBpbiBhIGZvcmsgb2YgdGhpcyByZXBvc2l0b3J5IGluIHlvdXIgR2l0SHViIGFjY291bnQgYW5kIHRoZW4KK3N1Ym1pdCBhIHB1bGwgcmVxdWVzdC4gUGxlYXNlIHNlZSB0aGUgW0NPTlRSSUJVVElORy5tZF0oQ09OVFJJQlVUSU5HLm1kKSBmaWxlCitpbiB0aGlzIHJlcG9zaXRvcnkgZm9yIG1vcmUgZGV0YWlscy4KKworIyMgUmVwb3NpdG9yeSBDb250ZW50CisKK1RoaXMgcmVwb3NpdG9yeSBjb250YWlucyB0aGUgc291cmNlIGNvZGUgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBkZXNrdG9wIFZ1bGthbgorbG9hZGVyIGFuZCBpdHMgdGVzdHMuCisKKyMjIyBJbnN0YWxsZWQgRmlsZXMKKworVGhlIGBpbnN0YWxsYCB0YXJnZXQgaW5zdGFsbHMgdGhlIGZvbGxvd2luZyBmaWxlcyB1bmRlciB0aGUgZGlyZWN0b3J5CitpbmRpY2F0ZWQgYnkgKmluc3RhbGxfZGlyKjoKKworLSAqaW5zdGFsbF9kaXIqYC9saWJgIDogVGhlIFZ1bGthbiBsb2FkZXIgbGlicmFyeQorLSAqaW5zdGFsbF9kaXIqYC9iaW5gIDogVGhlIFZ1bGthbiBsb2FkZXIgbGlicmFyeSBETEwgKFdpbmRvd3MpCisKK1RoZSBgdW5pbnN0YWxsYCB0YXJnZXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBhYm92ZSBmaWxlcyBmcm9tIHRoZSBpbnN0YWxsCitkaXJlY3RvcnkuCisKKyMjIFJlcG9zaXRvcnkgU2V0LVVwCisKKyMjIyBEaXNwbGF5IERyaXZlcnMKKworVGhpcyByZXBvc2l0b3J5IGRvZXMgbm90IGNvbnRhaW4gYSBWdWxrYW4tY2FwYWJsZSBkcml2ZXIuIFlvdSB3aWxsIG5lZWQgdG8KK29idGFpbiBhbmQgaW5zdGFsbCBhIFZ1bGthbiBkcml2ZXIgZnJvbSB5b3VyIGdyYXBoaWNzIGhhcmR3YXJlIHZlbmRvciBvciBmcm9tCitzb21lIG90aGVyIHN1aXRhYmxlIHNvdXJjZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biBWdWxrYW4gYXBwbGljYXRpb25zLgorCisjIyMgRG93bmxvYWQgdGhlIFJlcG9zaXRvcnkKKworVG8gY3JlYXRlIHlvdXIgbG9jYWwgZ2l0IHJlcG9zaXRvcnk6CisKKyAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tTG9hZGVyLmdpdAorCisjIyMgUmVwb3NpdG9yeSBEZXBlbmRlbmNpZXMKKworVGhpcyByZXBvc2l0b3J5IGF0dGVtcHRzIHRvIHJlc29sdmUgc29tZSBvZiBpdHMgZGVwZW5kZW5jaWVzIGJ5IHVzaW5nCitjb21wb25lbnRzIGZvdW5kIGZyb20gdGhlIGZvbGxvd2luZyBwbGFjZXMsIGluIHRoaXMgb3JkZXI6CisKKzEuIENNYWtlIG9yIEVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlcyAoZS5nLiwgLURWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUikKKzEuIEx1bmFyRyBWdWxrYW4gU0RLLCBsb2NhdGVkIGJ5IHRoZSBgVlVMS0FOX1NES2AgZW52aXJvbm1lbnQgdmFyaWFibGUKKzEuIFN5c3RlbS1pbnN0YWxsZWQgcGFja2FnZXMsIG1vc3RseSBhcHBsaWNhYmxlIG9uIExpbnV4CisKK0RlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBieSB0aGUgU0RLIG9yIGluc3RhbGxlZCBwYWNrYWdlcyBtdXN0IGJlCityZXNvbHZlZCB3aXRoIHRoZSAiaW5zdGFsbCBkaXJlY3RvcnkiIG92ZXJyaWRlIGFuZCBhcmUgbGlzdGVkIGJlbG93LiBUaGUKKyJpbnN0YWxsIGRpcmVjdG9yeSIgb3ZlcnJpZGUgY2FuIGFsc28gYmUgdXNlZCB0byBmb3JjZSB0aGUgdXNlIG9mIGEgc3BlY2lmaWMKK3ZlcnNpb24gb2YgdGhhdCBkZXBlbmRlbmN5LgorCisjIyMjIFZ1bGthbi1IZWFkZXJzCisKK1RoaXMgcmVwb3NpdG9yeSBoYXMgYSByZXF1aXJlZCBkZXBlbmRlbmN5IG9uIHRoZSBbVnVsa2FuIEhlYWRlcnMgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tSGVhZGVycykuCitZb3UgbXVzdCBjbG9uZSB0aGUgaGVhZGVycyByZXBvc2l0b3J5IGFuZCBidWlsZCBpdHMgYGluc3RhbGxgIHRhcmdldCBiZWZvcmUKK2J1aWxkaW5nIHRoaXMgcmVwb3NpdG9yeS4gVGhlIFZ1bGthbi1IZWFkZXJzIHJlcG9zaXRvcnkgaXMgcmVxdWlyZWQgYmVjYXVzZSBpdAorY29udGFpbnMgdGhlIFZ1bGthbiBBUEkgZGVmaW5pdGlvbiBmaWxlcyAocmVnaXN0cnkpIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJ1aWxkCit0aGUgbG9hZGVyLiBZb3UgbXVzdCBhbHNvIHRha2Ugbm90ZSBvZiB0aGUgaGVhZGVycyBpbnN0YWxsIGRpcmVjdG9yeSBhbmQgcGFzcworaXQgb24gdGhlIENNYWtlIGNvbW1hbmQgbGluZSBmb3IgYnVpbGRpbmcgdGhpcyByZXBvc2l0b3J5LCBhcyBkZXNjcmliZWQgYmVsb3cuCisKKyMjIyMgV2luZG93cyBEcml2ZXIgS2l0IChXREspCisKK09uIFdpbmRvd3MgYnVpbGRzLCB0aGUgbG9hZGVyIG5lZWRzIHRvIGhhdmUgYSBXREsgaW5zdGFsbGVkLiBNaWNyb3NvZnQgcHJvdmlkZXMKK1tXREsgcmVsZWFzZXNdKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3MtaGFyZHdhcmUvZHJpdmVycy9kb3dubG9hZC10aGUtd2RrKSwKK2luY2x1ZGluZyBzZXZlcmFsIG9sZCByZWxlYXNlcy4gVGhlIGluc3RhbGxlZCBXREsgbXVzdCBiZSBhdCBsZWFzdCB2ZXJzaW9uIDE3MDkuCitUYWtlIG5vdGUgb2YgdGhlIGZhY3QgdGhhdCB0aGUgbGF0ZXN0IFdESyByZWxlYXNlIGdlbmVyYWxseSByZXF1aXJlcyB0aGUgbGF0ZXN0Cit2ZXJzaW9uIG9mIFZpc3VhbCBTdHVkaW8uIEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gdXNlIGFuIG9sZGVyIFdESyB3aXRoIGFuIG9sZGVyCitWaXN1YWwgU3R1ZGlvLgorCisjIyMjIEdvb2dsZSBUZXN0CisKK1RoZSBsb2FkZXIgdGVzdHMgZGVwZW5kIG9uIHRoZSBbR29vZ2xlIFRlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xldGVzdCkKK2ZyYW1ld29yayBhbmQgZG8gbm90IGJ1aWxkIHVubGVzcyB0aGlzIGZyYW1ld29yayBpcyBkb3dubG9hZGVkIGludG8gdGhlCityZXBvc2l0b3J5J3MgYGV4dGVybmFsYCBkaXJlY3RvcnkuCisKK1RvIG9idGFpbiB0aGUgZnJhbWV3b3JrLCBjaGFuZ2UgeW91ciBjdXJyZW50IGRpcmVjdG9yeSB0byB0aGUgdG9wIG9mIHlvdXIKK1Z1bGthbi1Mb2FkZXIgcmVwb3NpdG9yeSBhbmQgcnVuOgorCisgICAgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xldGVzdC5naXQgZXh0ZXJuYWwvZ29vZ2xldGVzdAorICAgIGNkIGV4dGVybmFsL2dvb2dsZXRlc3QKKyAgICBnaXQgY2hlY2tvdXQgdGFncy9yZWxlYXNlLTEuOC4xCisKK2JlZm9yZSBjb25maWd1cmluZyB5b3VyIGJ1aWxkIHdpdGggQ01ha2UuCisKK0lmIHlvdSBkbyBub3QgbmVlZCB0aGUgbG9hZGVyIHRlc3RzLCB0aGVyZSBpcyBubyBuZWVkIHRvIGRvd25sb2FkIHRoaXMKK2ZyYW1ld29yay4KKworIyMjIEJ1aWxkIGFuZCBJbnN0YWxsIERpcmVjdG9yaWVzCisKK0EgY29tbW9uIGNvbnZlbnRpb24gaXMgdG8gcGxhY2UgdGhlIGBidWlsZGAgZGlyZWN0b3J5IGluIHRoZSB0b3AgZGlyZWN0b3J5IG9mCit0aGUgcmVwb3NpdG9yeSBhbmQgcGxhY2UgdGhlIGBpbnN0YWxsYCBkaXJlY3RvcnkgYXMgYSBjaGlsZCBvZiB0aGUgYGJ1aWxkYAorZGlyZWN0b3J5LiBUaGUgcmVtYWluZGVyIG9mIHRoZXNlIGluc3RydWN0aW9ucyBmb2xsb3cgdGhpcyBjb252ZW50aW9uLAorYWx0aG91Z2ggeW91IGNhbiBwbGFjZSB0aGVzZSBkaXJlY3RvcmllcyBpbiBhbnkgbG9jYXRpb24uCisKKyMjIyBCdWlsZGluZyBEZXBlbmRlbnQgUmVwb3NpdG9yaWVzIHdpdGggS25vd24tR29vZCBSZXZpc2lvbnMKKworVGhlcmUgaXMgYSBQeXRob24gdXRpbGl0eSBzY3JpcHQsIGBzY3JpcHRzL3VwZGF0ZV9kZXBzLnB5YCwgdGhhdCB5b3UgY2FuIHVzZQordG8gZ2F0aGVyIGFuZCBidWlsZCB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcyBtZW50aW9uZWQgYWJvdmUuIFRoaXMgcHJvZ3JhbQorYWxzbyB1c2VzIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgYHNjcmlwdHMva25vd24tZ29vZC5qc29uYCBmaWxlIHRvIGNoZWNrb3V0CitkZXBlbmRlbnQgcmVwb3NpdG9yeSByZXZpc2lvbnMgdGhhdCBhcmUga25vd24gdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZQorcmV2aXNpb24gb2YgdGhpcyByZXBvc2l0b3J5IHRoYXQgeW91IGN1cnJlbnRseSBoYXZlIGNoZWNrZWQgb3V0LgorCitIZXJlIGlzIGEgdXNhZ2UgZXhhbXBsZSBmb3IgdGhpcyByZXBvc2l0b3J5OgorCisgICAgZ2l0IGNsb25lIGdpdEBnaXRodWIuY29tOktocm9ub3NHcm91cC9WdWxrYW4tTG9hZGVyLmdpdAorICAgIGNkIFZ1bGthbi1Mb2FkZXIKKyAgICBta2RpciBidWlsZAorICAgIGNkIGJ1aWxkCisgICAgLi4vc2NyaXB0cy91cGRhdGVfZGVwcy5weQorICAgIGNtYWtlIC1DIGhlbHBlci5jbWFrZSAuLgorICAgIGNtYWtlIC0tYnVpbGQgLgorCisjIyMjIE5vdGVzCisKKy0gWW91IG1heSBuZWVkIHRvIGFkanVzdCBzb21lIG9mIHRoZSBDTWFrZSBvcHRpb25zIGJhc2VkIG9uIHlvdXIgcGxhdGZvcm0uIFNlZQorICB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgc2VjdGlvbnMgbGF0ZXIgaW4gdGhpcyBkb2N1bWVudC4KKy0gVGhlIGB1cGRhdGVfZGVwcy5weWAgc2NyaXB0IGZldGNoZXMgYW5kIGJ1aWxkcyB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcyBpbgorICB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hlbiBpdCBpcyBpbnZva2VkLiBJbiB0aGlzIGNhc2UsIHRoZXkgYXJlIGJ1aWx0IGluCisgIHRoZSBgYnVpbGRgIGRpcmVjdG9yeS4KKy0gVGhlIGBidWlsZGAgZGlyZWN0b3J5IGlzIGFsc28gYmVpbmcgdXNlZCB0byBidWlsZCB0aGlzCisgIChWdWxrYW4tVmFsaWRhdGlvbkxheWVycykgcmVwb3NpdG9yeS4gQnV0IHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgY29uZmxpY3RzCisgIGluc2lkZSB0aGUgYGJ1aWxkYCBkaXJlY3RvcnkgYmV0d2VlbiB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcyBhbmQgdGhlCisgIGJ1aWxkIGZpbGVzIGZvciB0aGlzIHJlcG9zaXRvcnkuCistIFRoZSBgLS1kaXJgIG9wdGlvbiBmb3IgYHVwZGF0ZV9kZXBzLnB5YCBjYW4gYmUgdXNlZCB0byByZWxvY2F0ZSB0aGUKKyAgZGVwZW5kZW50IHJlcG9zaXRvcmllcyB0byBhbm90aGVyIGFyYml0cmFyeSBkaXJlY3RvcnkgdXNpbmcgYW4gYWJzb2x1dGUgb3IKKyAgcmVsYXRpdmUgcGF0aC4KKy0gVGhlIGB1cGRhdGVfZGVwcy5weWAgc2NyaXB0IGdlbmVyYXRlcyBhIGZpbGUgbmFtZWQgYGhlbHBlci5jbWFrZWAgYW5kIHBsYWNlcworICBpdCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgKGBidWlsZGAgaW4gdGhpcworICBjYXNlKS4gVGhpcyBmaWxlIGNvbnRhaW5zIENNYWtlIGNvbW1hbmRzIHRvIHNldCB0aGUgQ01ha2UgYCpfSU5TVEFMTF9ESVJgCisgIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIHRvIHBvaW50IHRvIHRoZSBpbnN0YWxsIGFydGlmYWN0cyBvZiB0aGUgZGVwZW5kZW50CisgIHJlcG9zaXRvcmllcy4gWW91IGNhbiB1c2UgdGhpcyBmaWxlIHdpdGggdGhlIGBjbWFrZSAtQ2Agb3B0aW9uIHRvIHNldCB0aGVzZQorICB2YXJpYWJsZXMgd2hlbiB5b3UgZ2VuZXJhdGUgeW91ciBidWlsZCBmaWxlcyB3aXRoIENNYWtlLiBUaGlzIGxldHMgeW91IGF2b2lkCisgIGVudGVyaW5nIHNldmVyYWwgYCpfSU5TVEFMTF9ESVJgIHZhcmlhYmxlIHNldHRpbmdzIG9uIHRoZSBDTWFrZSBjb21tYW5kIGxpbmUuCistIElmIHVzaW5nICJNSU5HVyIgKEdpdCBGb3IgV2luZG93cyksIHlvdSBtYXkgd2lzaCB0byBydW4KKyAgYHdpbnB0eSB1cGRhdGVfZGVwcy5weWAgaW4gb3JkZXIgdG8gYXZvaWQgYnVmZmVyaW5nIGFsbCBvZiB0aGUgc2NyaXB0J3MKKyAgInByaW50IiBvdXRwdXQgdW50aWwgdGhlIGVuZCBhbmQgdG8gcmV0YWluIHRoZSBhYmlsaXR5IHRvIGludGVycnVwdCBzY3JpcHQKKyAgZXhlY3V0aW9uLgorLSBQbGVhc2UgdXNlIGB1cGRhdGVfZGVwcy5weSAtLWhlbHBgIHRvIGxpc3QgYWRkaXRpb25hbCBvcHRpb25zIGFuZCByZWFkIHRoZQorICBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIGluIGB1cGRhdGVfZGVwcy5weWAgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisKKyMjIyBHZW5lcmF0ZWQgc291cmNlIGNvZGUKKworVGhpcyByZXBvc2l0b3J5IGNvbnRhaW5zIGdlbmVyYXRlZCBzb3VyY2UgY29kZSBpbiB0aGUgYGxvYWRlci9nZW5lcmF0ZWRgCitkaXJlY3Rvcnkgd2hpY2ggaXMgbm90IGludGVuZGVkIHRvIGJlIG1vZGlmaWVkIGRpcmVjdGx5LiBJbnN0ZWFkLCBjaGFuZ2VzIHNob3VsZCBiZQorbWFkZSB0byB0aGUgY29ycmVzcG9uZGluZyBnZW5lcmF0b3IgaW4gdGhlIGBzY3JpcHRzYCBkaXJlY3RvcnkuIFRoZSBzb3VyY2UgZmlsZXMgY2FuCit0aGVuIGJlIHJlZ2VuZXJhdGVkIHVzaW5nIGBzY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weWA6CisKKyAgICBweXRob24zIHNjcmlwdHMvZ2VuZXJhdGVfc291cmNlLnB5IFBBVEhfVE9fVlVMS0FOX0hFQURFUlNfUkVHSVNUUllfRElSCisKK0EgaGVscGVyIENNYWtlIHRhcmdldCBgVnVsa2FuTG9hZGVyX2dlbmVyYXRlZF9zb3VyY2VgIGlzIGFsc28gcHJvdmlkZWQgdG8gc2ltcGxpZnkKK3RoZSBpbnZvY2F0aW9uIG9mIGBzY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weWAgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5OgorCisgICAgY21ha2UgLS1idWlsZCAuIC0tdGFyZ2V0IFZ1bGthbkxvYWRlcl9nZW5lcmF0ZWRfc291cmNlCisKKyMjIyBCdWlsZCBPcHRpb25zCisKK1doZW4gZ2VuZXJhdGluZyBuYXRpdmUgcGxhdGZvcm0gYnVpbGQgZmlsZXMgdGhyb3VnaCBDTWFrZSwgc2V2ZXJhbCBvcHRpb25zIGNhbgorYmUgc3BlY2lmaWVkIHRvIGN1c3RvbWl6ZSB0aGUgYnVpbGQuIFNvbWUgb2YgdGhlIG9wdGlvbnMgYXJlIGJpbmFyeSBvbi9vZmYKK29wdGlvbnMsIHdoaWxlIG90aGVycyB0YWtlIGEgc3RyaW5nIGFzIGlucHV0LiBUaGUgZm9sbG93aW5nIGlzIGEgdGFibGUgb2YgYWxsCitvbi9vZmYgb3B0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoaXMgcmVwb3NpdG9yeToKKworfCBPcHRpb24gfCBQbGF0Zm9ybSB8IERlZmF1bHQgfCBEZXNjcmlwdGlvbiB8Cit8IC0tLS0tLSB8IC0tLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwKK3wgQlVJTERfTE9BREVSIHwgQWxsIHwgYE9OYCB8IENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBsb2FkZXIgaXMgYnVpbHQuIFNldHRpbmcgdGhpcyB0byBgT0ZGYCB3aWxsIGFsbG93IGJ1aWxkaW5nIHRoZSB0ZXN0cyBhZ2FpbnN0IGEgbG9hZGVyIHRoYXQgaXMgaW5zdGFsbGVkIHRvIHRoZSBzeXN0ZW0uIHwKK3wgQlVJTERfVEVTVFMgfCBBbGwgfCBgPz8/YCB8IENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBsb2FkZXIgdGVzdHMgYXJlIGJ1aWx0LiBUaGUgZGVmYXVsdCBpcyBgT05gIHdoZW4gdGhlIEdvb2dsZSBUZXN0IHJlcG9zaXRvcnkgaXMgY2xvbmVkIGludG8gdGhlIGBleHRlcm5hbGAgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBpcyBgT0ZGYC4gfAorfCBCVUlMRF9XU0lfWENCX1NVUFBPUlQgfCBMaW51eCB8IGBPTmAgfCBCdWlsZCB0aGUgbG9hZGVyIHdpdGggdGhlIFhDQiBlbnRyeSBwb2ludHMgZW5hYmxlZC4gV2l0aG91dCB0aGlzLCB0aGUgWENCIGhlYWRlcnMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCB0aGUgZXh0ZW5zaW9uIGBWS19LSFJfeGNiX3N1cmZhY2VgIHdvbid0IGJlIGF2YWlsYWJsZS4gfAorfCBCVUlMRF9XU0lfWExJQl9TVVBQT1JUIHwgTGludXggfCBgT05gIHwgQnVpbGQgdGhlIGxvYWRlciB3aXRoIHRoZSBYbGliIGVudHJ5IHBvaW50cyBlbmFibGVkLiBXaXRob3V0IHRoaXMsIHRoZSBYMTEgaGVhZGVycyBzaG91bGQgbm90IGJlIG5lZWRlZCwgYnV0IHRoZSBleHRlbnNpb24gYFZLX0tIUl94bGliX3N1cmZhY2VgIHdvbid0IGJlIGF2YWlsYWJsZS4gfAorfCBCVUlMRF9XU0lfV0FZTEFORF9TVVBQT1JUIHwgTGludXggfCBgT05gIHwgQnVpbGQgdGhlIGxvYWRlciB3aXRoIHRoZSBXYXlsYW5kIGVudHJ5IHBvaW50cyBlbmFibGVkLiBXaXRob3V0IHRoaXMsIHRoZSBXYXlsYW5kIGhlYWRlcnMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCB0aGUgZXh0ZW5zaW9uIGBWS19LSFJfd2F5bGFuZF9zdXJmYWNlYCB3b24ndCBiZSBhdmFpbGFibGUuIHwKK3wgRU5BQkxFX1NUQVRJQ19MT0FERVIgfCBXaW5kb3dzIHwgYE9GRmAgfCBCeSBkZWZhdWx0LCB0aGUgbG9hZGVyIGlzIGJ1aWx0IGFzIGEgZHluYW1pYyBsaWJyYXJ5LiBUaGlzIGFsbG93cyBpdCB0byBiZSBidWlsdCBhcyBhIHN0YXRpYyBsaWJyYXJ5LCBpbnN0ZWFkLiB8Cit8IEVOQUJMRV9XSU4xMF9PTkVDT1JFIHwgV2luZG93cyB8IGBPRkZgIHwgTGluayB0aGUgbG9hZGVyIHRvIHRoZSBbT25lQ29yZV0oaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXQ2NTQwMzkuYXNweCkgdW1icmVsbGEgbGlicmFyeSwgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgV2luMzIgb25lcy4gfAorfCBVU0VfQ0NBQ0hFIHwgTGludXggfCBgT0ZGYCB8IEVuYWJsZSBjYWNoaW5nIHdpdGggdGhlIENDYWNoZSBwcm9ncmFtLiB8CisKK1RoZSBmb2xsb3dpbmcgaXMgYSB0YWJsZSBvZiBhbGwgc3RyaW5nIG9wdGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGlzIHJlcG9zaXRvcnk6CisKK3wgT3B0aW9uIHwgUGxhdGZvcm0gfCBEZWZhdWx0IHwgRGVzY3JpcHRpb24gfAorfCAtLS0tLS0gfCAtLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8Cit8IENNQUtFX09TWF9ERVBMT1lNRU5UX1RBUkdFVCB8IE1hY09TIHwgYDEwLjEyYCB8IFRoZSBtaW5pbXVtIHZlcnNpb24gb2YgTWFjT1MgZm9yIGxvYWRlciBkZXBsb3ltZW50LiB8Cit8IEZBTExCQUNLX0NPTkZJR19ESVJTIHwgTGludXgvTWFjT1MgfCBgL2V0Yy94ZGdgIHwgQ29uZmlndXJhdGlvbiBwYXRoKHMpIHRvIHVzZSBpbnN0ZWFkIG9mIGBYREdfQ09ORklHX0RJUlNgIGlmIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdW5hdmFpbGFibGUuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgZnJlZWRlc2t0b3AgY29tcGxpYW50LiB8Cit8IEZBTExCQUNLX0RBVEFfRElSUyB8IExpbnV4L01hY09TIHwgYC91c3IvbG9jYWwvc2hhcmU6L3Vzci9zaGFyZWAgfCBDb25maWd1cmF0aW9uIHBhdGgocykgdG8gdXNlIGluc3RlYWQgb2YgYFhER19EQVRBX0RJUlNgIGlmIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdW5hdmFpbGFibGUuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgZnJlZWRlc2t0b3AgY29tcGxpYW50LiB8CisKK1RoZXNlIHZhcmlhYmxlcyBzaG91bGQgYmUgc2V0IHVzaW5nIHRoZSBgLURgIG9wdGlvbiB3aGVuIGludm9raW5nCitDTWFrZSB0byBnZW5lcmF0ZSB0aGUgbmF0aXZlIHBsYXRmb3JtIGZpbGVzLgorCisjIyBCdWlsZGluZyBPbiBXaW5kb3dzCisKKyMjIyBXaW5kb3dzIERldmVsb3BtZW50IEVudmlyb25tZW50IFJlcXVpcmVtZW50cworCistIFdpbmRvd3MKKyAgLSBBbnkgUGVyc29uYWwgQ29tcHV0ZXIgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgTWljcm9zb2Z0CistIE1pY3Jvc29mdCBbVmlzdWFsIFN0dWRpb10oaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS8pCisgIC0gVmVyc2lvbnMKKyAgICAtIFsyMDE1XShodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL29sZGVyLWRvd25sb2Fkcy8pCisgICAgLSBbMjAxN10oaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy9vbGRlci1kb3dubG9hZHMvKQorICAgIC0gWzIwMTldKGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvZG93bmxvYWRzLykKKyAgLSBUaGUgQ29tbXVuaXR5IEVkaXRpb24gb2YgZWFjaCBvZiB0aGUgYWJvdmUgdmVyc2lvbnMgaXMgc3VmZmljaWVudCwgYXMKKyAgICB3ZWxsIGFzIGFueSBtb3JlIGNhcGFibGUgZWRpdGlvbi4KKy0gW1dpbmRvd3MgRHJpdmVyIEtpdF0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy1oYXJkd2FyZS9kcml2ZXJzL2Rvd25sb2FkLXRoZS13ZGspIDE4MDMgb3IgbGF0ZXIKKy0gW0NNYWtlIDMuMTAuMl0oaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLXdpbjY0LXg2NC56aXApIGlzIHJlY29tbWVuZGVkLgorICAtIFVzZSB0aGUgaW5zdGFsbGVyIG9wdGlvbiB0byBhZGQgQ01ha2UgdG8gdGhlIHN5c3RlbSBQQVRICistIEdpdCBDbGllbnQgU3VwcG9ydAorICAtIFtHaXQgZm9yIFdpbmRvd3NdKGh0dHA6Ly9naXQtc2NtLmNvbS9kb3dubG9hZC93aW4pIGlzIGEgcG9wdWxhciBzb2x1dGlvbgorICAgIGZvciBXaW5kb3dzCisgIC0gU29tZSBJREVzIChlLmcuLCBbVmlzdWFsIFN0dWRpb10oaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS8pLAorICAgIFtHaXRIdWIgRGVza3RvcF0oaHR0cHM6Ly9kZXNrdG9wLmdpdGh1Yi5jb20vKSkgaGF2ZSBpbnRlZ3JhdGVkCisgICAgR2l0IGNsaWVudCBzdXBwb3J0CisKKyMjIyBXaW5kb3dzIEJ1aWxkIC0gTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KKworVGhlIGdlbmVyYWwgYXBwcm9hY2ggaXMgdG8gcnVuIENNYWtlIHRvIGdlbmVyYXRlIHRoZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QKK2ZpbGVzLiBUaGVuIGVpdGhlciBydW4gQ01ha2Ugd2l0aCB0aGUgYC0tYnVpbGRgIG9wdGlvbiB0byBidWlsZCBmcm9tIHRoZQorY29tbWFuZCBsaW5lIG9yIHVzZSB0aGUgVmlzdWFsIFN0dWRpbyBJREUgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIHNvbHV0aW9uIGFuZAord29yayB3aXRoIHRoZSBzb2x1dGlvbiBpbnRlcmFjdGl2ZWx5LgorCisjIyMjIFdpbmRvd3MgUXVpY2sgU3RhcnQKKworT3BlbiBhIGRldmVsb3BlciBjb21tYW5kIHByb21wdCBhbmQgZW50ZXI6CisKKyAgICBjZCBWdWxrYW4tTG9hZGVyCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorICAgIGNtYWtlIC1BIHg2NCAtRFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIgLi4KKyAgICBjbWFrZSAtLWJ1aWxkIC4KKworVGhlIGFib3ZlIGNvbW1hbmRzIGluc3RydWN0IENNYWtlIHRvIGZpbmQgYW5kIHVzZSB0aGUgZGVmYXVsdCBWaXN1YWwgU3R1ZGlvCitpbnN0YWxsYXRpb24gdG8gZ2VuZXJhdGUgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGFuZCBwcm9qZWN0cyBmb3IgdGhlIHg2NAorYXJjaGl0ZWN0dXJlLiBUaGUgc2Vjb25kIENNYWtlIGNvbW1hbmQgYnVpbGRzIHRoZSBEZWJ1ZyAoZGVmYXVsdCkKK2NvbmZpZ3VyYXRpb24gb2YgdGhlIHNvbHV0aW9uLgorCitOb3RlIHRoYXQgaWYgeW91IGRvIG5vdCB3aXNoIHRvIHVzZSBhIGRldmVsb3BlciBjb21tYW5kIHByb21wdCwgeW91IG1heSBlaXRoZXIKK3J1biBlaXRoZXIgYHZjdmFyczY0LmJhdGAgb3IgYHZjdmFyczMyLmJhdGAgdG8gc2V0IHRoZSByZXF1aXJlZCBlbnZpcm9ubWVudAordmFyaWFibGVzLiBZb3UgbWF5IGFsc28gZGVmaW5lIGEgYFdES19GVUxMX1BBVEhgIHZhcmlhYmxlIHdoZW4gZmlyc3QgaW52b2tpbmcgQ01ha2UKK2xpa2U6CisKKyAgICBjbWFrZSAtQSB4NjQgLS1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpciAtRFdES19CQVNFPSJDOi9Qcm9ncmFtIEZpbGVzICh4ODYpL1dpbmRvd3MgS2l0cy8xMC9JbmNsdWRlLzEwLjAuMTc3NjMuMCIgLi4KKworU2VlIGJlbG93IGZvciB0aGUgZGV0YWlscy4KKworIyMjIyBVc2UgYENNYWtlYCB0byBDcmVhdGUgdGhlIFZpc3VhbCBTdHVkaW8gUHJvamVjdCBGaWxlcworCitDaGFuZ2UgeW91ciBjdXJyZW50IGRpcmVjdG9yeSB0byB0aGUgdG9wIG9mIHRoZSBjbG9uZWQgcmVwb3NpdG9yeSBkaXJlY3RvcnksCitjcmVhdGUgYSBidWlsZCBkaXJlY3RvcnkgYW5kIGdlbmVyYXRlIHRoZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXM6CisKKyAgICBjZCBWdWxrYW4tTG9hZGVyCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorICAgIGNtYWtlIC1BIHg2NCAtRFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIgLi4KKworPiBOb3RlOiBUaGUgYC4uYCBwYXJhbWV0ZXIgdGVsbHMgYGNtYWtlYCB0aGUgbG9jYXRpb24gb2YgdGhlIHRvcCBvZiB0aGUKKz4gcmVwb3NpdG9yeS4gSWYgeW91IHBsYWNlIHlvdXIgYnVpbGQgZGlyZWN0b3J5IHNvbWVwbGFjZSBlbHNlLCB5b3UnbGwgbmVlZCB0bworPiBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0b3AgZGlmZmVyZW50bHkuCisKK1RoZSBgLUFgIG9wdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBlaXRoZXIgdGhlICJXaW4zMiIgb3IgIng2NCIgYXJjaGl0ZWN0dXJlLgorCitJZiBhIGdlbmVyYXRvciBmb3IgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIFZpc3VhbCBTdHVkaW8gaXMgcmVxdWlyZWQsIHlvdSBjYW4KK3NwZWNpZnkgaXQgZm9yIFZpc3VhbCBTdHVkaW8gMjAxNSwgZm9yIGV4YW1wbGUsIHdpdGg6CisKKyAgICA2NC1iaXQ6IC1HICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisgICAgMzItYml0OiAtRyAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IgorCitTZWUgdGhpcyBbbGlzdF0oI2NtYWtlLXZpc3VhbC1zdHVkaW8tZ2VuZXJhdG9ycykgb2Ygb3RoZXIgcG9zc2libGUgZ2VuZXJhdG9ycworZm9yIFZpc3VhbCBTdHVkaW8uCisKK1doZW4gZ2VuZXJhdGluZyB0aGUgcHJvamVjdCBmaWxlcywgdGhlIGFic29sdXRlIHBhdGggdG8gYSBWdWxrYW4tSGVhZGVycworaW5zdGFsbCBkaXJlY3RvcnkgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIHRoZQorYFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIHRoZQorYFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSYCBDTWFrZSB2YXJpYWJsZSB3aXRoIHRoZSBgLURgIENNYWtlIG9wdGlvbi4gSW4KK2VpdGhlciBjYXNlLCB0aGUgdmFyaWFibGUgc2hvdWxkIHBvaW50IHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEKK1Z1bGthbi1IZWFkZXJzIHJlcG9zaXRvcnkgYnVpbHQgd2l0aCB0aGUgaW5zdGFsbCB0YXJnZXQuCisKK1RoZSBhYm92ZSBzdGVwcyBjcmVhdGUgYSBXaW5kb3dzIHNvbHV0aW9uIGZpbGUgbmFtZWQgYFZ1bGthbi1Mb2FkZXIuc2xuYCBpbgordGhlIGJ1aWxkIGRpcmVjdG9yeS4KKworQXQgdGhpcyBwb2ludCwgeW91IGNhbiBidWlsZCB0aGUgc29sdXRpb24gZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIG9wZW4gdGhlCitnZW5lcmF0ZWQgc29sdXRpb24gd2l0aCBWaXN1YWwgU3R1ZGlvLgorCisjIyMjIEJ1aWxkIHRoZSBTb2x1dGlvbiBGcm9tIHRoZSBDb21tYW5kIExpbmUKKworV2hpbGUgc3RpbGwgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeToKKworICAgIGNtYWtlIC0tYnVpbGQgLgorCit0byBidWlsZCB0aGUgRGVidWcgY29uZmlndXJhdGlvbiAodGhlIGRlZmF1bHQpLCBvcjoKKworICAgIGNtYWtlIC0tYnVpbGQgLiAtLWNvbmZpZyBSZWxlYXNlCisKK3RvIG1ha2UgYSBSZWxlYXNlIGJ1aWxkLgorCisjIyMjIEJ1aWxkIHRoZSBTb2x1dGlvbiBXaXRoIFZpc3VhbCBTdHVkaW8KKworTGF1bmNoIFZpc3VhbCBTdHVkaW8gYW5kIG9wZW4gdGhlICJWdWxrYW4tTG9hZGVyLnNsbiIgc29sdXRpb24gZmlsZSBpbiB0aGUKK2J1aWxkIGZvbGRlci4gWW91IG1heSBzZWxlY3QgIkRlYnVnIiBvciAiUmVsZWFzZSIgZnJvbSB0aGUgU29sdXRpb24KK0NvbmZpZ3VyYXRpb25zIGRyb3AtZG93biBsaXN0LiBTdGFydCBhIGJ1aWxkIGJ5IHNlbGVjdGluZyB0aGUgQnVpbGQtPkJ1aWxkCitTb2x1dGlvbiBtZW51IGl0ZW0uCisKKyMjIyMgV2luZG93cyBJbnN0YWxsIFRhcmdldAorCitUaGUgQ01ha2UgcHJvamVjdCBhbHNvIGdlbmVyYXRlcyBhbiAiaW5zdGFsbCIgdGFyZ2V0IHRoYXQgeW91IGNhbiB1c2UgdG8gY29weQordGhlIHByaW1hcnkgYnVpbGQgYXJ0aWZhY3RzIHRvIGEgc3BlY2lmaWMgbG9jYXRpb24gdXNpbmcgYSAiYmluLCBpbmNsdWRlLCBsaWIiCitzdHlsZSBkaXJlY3Rvcnkgc3RydWN0dXJlLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGNvbGxlY3RpbmcgdGhlIGFydGlmYWN0cyBhbmQKK3Byb3ZpZGluZyB0aGVtIHRvIGFub3RoZXIgcHJvamVjdCB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGVtLgorCitUaGUgZGVmYXVsdCBsb2NhdGlvbiBpcyBgJENNQUtFX0JJTkFSWV9ESVJcaW5zdGFsbGAsIGJ1dCBjYW4gYmUgY2hhbmdlZCB3aXRoCit0aGUgYENNQUtFX0lOU1RBTExfUFJFRklYYCB2YXJpYWJsZSB3aGVuIGZpcnN0IGdlbmVyYXRpbmcgdGhlIHByb2plY3QgYnVpbGQKK2ZpbGVzIHdpdGggQ01ha2UuCisKK1lvdSBjYW4gYnVpbGQgdGhlIGluc3RhbGwgdGFyZ2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aXRoOgorCisgICAgY21ha2UgLS1idWlsZCAuIC0tY29uZmlnIFJlbGVhc2UgLS10YXJnZXQgaW5zdGFsbAorCitvciBidWlsZCB0aGUgYElOU1RBTExgIHRhcmdldCBmcm9tIHRoZSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGV4cGxvcmVyLgorCisjIyMgV2luZG93cyBUZXN0cworCitUaGUgVnVsa2FuLUxvYWRlciByZXBvc2l0b3J5IGNvbnRhaW5zIHNvbWUgc2ltcGxlIHVuaXQgdGVzdHMgZm9yIHRoZSBsb2FkZXIKK2J1dCBubyBvdGhlciB0ZXN0IGNsaWVudHMuCisKK1RvIHJ1biB0aGUgbG9hZGVyIHRlc3Qgc2NyaXB0LCBvcGVuIGEgUG93ZXJzaGVsbCBDb25zb2xlLCBjaGFuZ2UgdG8gdGhlCitgYnVpbGRcdGVzdHNgIGRpcmVjdG9yeSwgYW5kIHJ1bjoKKworRm9yIFJlbGVhc2UgYnVpbGRzOgorCisgICAgLlxydW5fYWxsX3Rlc3RzLnBzMQorCitGb3IgRGVidWcgYnVpbGRzOgorCisgICAgLlxydW5fYWxsX3Rlc3RzLnBzMSAtRGVidWcKKworVGhpcyBzY3JpcHQgd2lsbCBydW4gdGhlIGZvbGxvd2luZyB0ZXN0czoKKworLSBgdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHNgOgorICBWdWxrYW4gbG9hZGVyIGhhbmRsZSB3cmFwcGluZywgYWxsb2NhdGlvbiBjYWxsYmFjaywgYW5kIGxvYWRlci9sYXllciBpbnRlcmZhY2UgdGVzdHMKKworWW91IGNhbiBhbHNvIGNoYW5nZSB0byBlaXRoZXIgYGJ1aWxkXHRlc3RzXERlYnVnYCBvciBgYnVpbGRcdGVzdHNcUmVsZWFzZWAKKyhkZXBlbmRpbmcgb24gd2hpY2ggb25lIHlvdSBidWlsdCkgYW5kIHJ1biB0aGUgZXhlY3V0YWJsZSB0ZXN0cyAoYCouZXhlYCkKK2ZpbGVzIGZyb20gdGhlcmUuCisKKyMjIyBXaW5kb3dzIE5vdGVzCisKKyMjIyMgQ01ha2UgVmlzdWFsIFN0dWRpbyBHZW5lcmF0b3JzCisKK1RoZSBjaG9zZW4gZ2VuZXJhdG9yIHNob3VsZCBtYXRjaCBvbmUgb2YgdGhlIFZpc3VhbCBTdHVkaW8gdmVyc2lvbnMgdGhhdCB5b3UKK2hhdmUgaW5zdGFsbGVkLiBHZW5lcmF0b3Igc3RyaW5ncyB0aGF0IGNvcnJlc3BvbmQgdG8gdmVyc2lvbnMgb2YgVmlzdWFsIFN0dWRpbworaW5jbHVkZToKKworfCBCdWlsZCBQbGF0Zm9ybSAgICAgICAgICAgICAgIHwgNjQtYml0IEdlbmVyYXRvciAgICAgICAgICAgICAgfCAzMi1iaXQgR2VuZXJhdG9yICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxNSB8ICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiIHwgIlZpc3VhbCBTdHVkaW8gMTQgMjAxNSIgfAorfCBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDE3IHwgIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyBXaW42NCIgfCAiVmlzdWFsIFN0dWRpbyAxNSAyMDE3IiB8Cit8IE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTkgfCAiVmlzdWFsIFN0dWRpbyAxNiAyMDE5IiAgICAgICB8ICJWaXN1YWwgU3R1ZGlvIDE2IDIwMTkiIHwKKworTm90ZSB0aGF0IHdpdGggVmlzdWFsIFN0dWRpbyAyMDE5LCB0aGUgYXJjaGl0ZWN0dXJlIHdpbGwgbmVlZCB0byBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgYC1BYAorZmxhZyBmb3IgNjQtYml0IGJ1aWxkcy4KKworIyMjIyBVc2luZyBUaGUgVnVsa2FuIExvYWRlciBMaWJyYXJ5IGluIHRoaXMgUmVwb3NpdG9yeSBvbiBXaW5kb3dzCisKK1Z1bGthbiBwcm9ncmFtcyBtdXN0IGJlIGFibGUgdG8gZmluZCBhbmQgdXNlIHRoZSBWdWxrYW4gbG9hZGVyCisoYHZ1bGthbi0xLmRsbGApIGxpYnJhcnkgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbGlicmFyaWVzIHRoZSBwcm9ncmFtIHJlcXVpcmVzLgorT25lIGNvbnZlbmllbnQgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY29weSB0aGUgcmVxdWlyZWQgbGlicmFyaWVzIGludG8gdGhlIHNhbWUKK2RpcmVjdG9yeSBhcyB0aGUgcHJvZ3JhbS4gVGhlIHByb2plY3RzIGluIHRoaXMgc29sdXRpb24gY29weSB0aGUgVnVsa2FuIGxvYWRlcgorbGlicmFyeSBhbmQgdGhlICJnb29nbGV0ZXN0IiBsaWJyYXJpZXMgdG8gdGhlIGBidWlsZFx0ZXN0c1xEZWJ1Z2Agb3IgdGhlCitgYnVpbGRcdGVzdHNcUmVsZWFzZWAgZGlyZWN0b3J5LCB3aGljaCBpcyB3aGVyZSB0aGUKK2B2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0LmV4ZWAgZXhlY3V0YWJsZSBpcyBmb3VuZCwgZGVwZW5kaW5nIG9uIHdoYXQKK2NvbmZpZ3VyYXRpb24geW91IGJ1aWx0LiAoVGhlIGxvYWRlciB2YWxpZGF0aW9uIHRlc3RzIHVzZSB0aGUgImdvb2dsZXRlc3QiCit0ZXN0aW5nIGZyYW1ld29yay4pCisKK090aGVyIHRlY2huaXF1ZXMgaW5jbHVkZSBwbGFjaW5nIHRoZSBsaWJyYXJ5IGluIGEgc3lzdGVtIGZvbGRlcgorKEM6XFdpbmRvd3NcU3lzdGVtMzIpIG9yIGluIGEgZGlyZWN0b3J5IHRoYXQgYXBwZWFycyBpbiB0aGUgYFBBVEhgIGVudmlyb25tZW50Cit2YXJpYWJsZS4KKworU2VlIHRoZSBgTG9hZGVyQW5kTGF5ZXJJbnRlcmZhY2VgIGRvY3VtZW50IGluIHRoZSBgbG9hZGVyYCBmb2xkZXIgaW4gdGhpcworcmVwb3NpdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdGhlIGxvYWRlciBmaW5kcyBkcml2ZXIgbGlicmFyaWVzIGFuZAorbGF5ZXIgbGlicmFyaWVzLiBUaGUgZG9jdW1lbnQgYWxzbyBkZXNjcmliZXMgYm90aCBob3cgSUNEcyBhbmQgbGF5ZXJzIHNob3VsZAorYmUgcGFja2FnZWQsIGFuZCBob3cgZGV2ZWxvcGVycyBjYW4gcG9pbnQgdG8gSUNEcyBhbmQgbGF5ZXJzIHdpdGhpbiB0aGVpcgorYnVpbGRzLgorCisjIyBCdWlsZGluZyBPbiBMaW51eAorCisjIyMgTGludXggRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgUmVxdWlyZW1lbnRzCisKK1RoaXMgcmVwb3NpdG9yeSBoYXMgYmVlbiBidWlsdCBhbmQgdGVzdGVkIG9uIHRoZSB0d28gbW9zdCByZWNlbnQgVWJ1bnR1IExUUwordmVyc2lvbnMuIEN1cnJlbnRseSwgdGhlIG9sZGVzdCBzdXBwb3J0ZWQgdmVyc2lvbiBpcyBVYnVudHUgMTYuMDQsIG1lYW5pbmcKK3RoYXQgdGhlIG1pbmltdW0gb2ZmaWNpYWxseSBzdXBwb3J0ZWQgQysrMTEgY29tcGlsZXIgdmVyc2lvbiBpcyBHQ0MgNS40LjAsCithbHRob3VnaCBlYXJsaWVyIHZlcnNpb25zIG1heSB3b3JrLiBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIHRvIGFkYXB0IHRoaXMKK3JlcG9zaXRvcnkgdG8gb3RoZXIgTGludXggZGlzdHJpYnV0aW9ucy4KKworW0NNYWtlIDMuMTAuMl0oaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLUxpbnV4LXg4Nl82NC50YXIuZ3opIGlzIHJlY29tbWVuZGVkLgorCisjIyMjIFJlcXVpcmVkIFBhY2thZ2UgTGlzdAorCisgICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgZ2l0IGJ1aWxkLWVzc2VudGlhbCBsaWJ4MTEteGNiLWRldiBcCisgICAgICAgIGxpYnhrYmNvbW1vbi1kZXYgbGlid2F5bGFuZC1kZXYgbGlieHJhbmRyLWRldgorCisjIyMgTGludXggQnVpbGQKKworVGhlIGdlbmVyYWwgYXBwcm9hY2ggaXMgdG8gcnVuIENNYWtlIHRvIGdlbmVyYXRlIG1ha2UgZmlsZXMuIFRoZW4gZWl0aGVyIHJ1bgorQ01ha2Ugd2l0aCB0aGUgYC0tYnVpbGRgIG9wdGlvbiBvciBgbWFrZWAgdG8gYnVpbGQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCisjIyMjIExpbnV4IFF1aWNrIFN0YXJ0CisKKyAgICBjZCBWdWxrYW4tTG9hZGVyCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorICAgIGNtYWtlIC1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpciAuLgorICAgIG1ha2UKKworU2VlIGJlbG93IGZvciB0aGUgZGV0YWlscy4KKworIyMjIyBVc2UgQ01ha2UgdG8gQ3JlYXRlIHRoZSBNYWtlIEZpbGVzCisKK0NoYW5nZSB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5IHRvIHRoZSB0b3Agb2YgdGhlIGNsb25lZCByZXBvc2l0b3J5IGRpcmVjdG9yeSwKK2NyZWF0ZSBhIGJ1aWxkIGRpcmVjdG9yeSBhbmQgZ2VuZXJhdGUgdGhlIG1ha2UgZmlsZXMuCisKKyAgICBjZCBWdWxrYW4tTG9hZGVyCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorICAgIGNtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyBcCisgICAgICAgICAgLURWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIFwKKyAgICAgICAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPWluc3RhbGwgLi4KKworPiBOb3RlOiBUaGUgYC4uYCBwYXJhbWV0ZXIgdGVsbHMgYGNtYWtlYCB0aGUgbG9jYXRpb24gb2YgdGhlIHRvcCBvZiB0aGUKKz4gcmVwb3NpdG9yeS4gSWYgeW91IHBsYWNlIHlvdXIgYGJ1aWxkYCBkaXJlY3Rvcnkgc29tZXBsYWNlIGVsc2UsIHlvdSdsbCBuZWVkCis+IHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IHRvcCBkaWZmZXJlbnRseS4KKworVXNlIGAtRENNQUtFX0JVSUxEX1RZUEVgIHRvIHNwZWNpZnkgYSBEZWJ1ZyBvciBSZWxlYXNlIGJ1aWxkLgorCitXaGVuIGdlbmVyYXRpbmcgdGhlIHByb2plY3QgZmlsZXMsIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgVnVsa2FuLUhlYWRlcnMKK2luc3RhbGwgZGlyZWN0b3J5IG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB0aGUKK2BWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkgc2V0dGluZyB0aGUKK2BWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUmAgQ01ha2UgdmFyaWFibGUgd2l0aCB0aGUgYC1EYCBDTWFrZSBvcHRpb24uIEluCitlaXRoZXIgY2FzZSwgdGhlIHZhcmlhYmxlIHNob3VsZCBwb2ludCB0byB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBhCitWdWxrYW4tSGVhZGVycyByZXBvc2l0b3J5IGJ1aWx0IHdpdGggdGhlIGluc3RhbGwgdGFyZ2V0LgorCis+IE5vdGU6IEZvciBMaW51eCwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGBDTUFLRV9JTlNUQUxMX1BSRUZJWGAgaXMKKz4gYC91c3IvbG9jYWxgLCB3aGljaCB3b3VsZCBiZSB1c2VkIGlmIHlvdSBkbyBub3Qgc3BlY2lmeQorPiBgQ01BS0VfSU5TVEFMTF9QUkVGSVhgLiBJbiB0aGlzIGNhc2UsIHlvdSBtYXkgbmVlZCB0byB1c2UgYHN1ZG9gIHRvIGluc3RhbGwKKz4gdG8gc3lzdGVtIGRpcmVjdG9yaWVzIGxhdGVyIHdoZW4geW91IHJ1biBgbWFrZSBpbnN0YWxsYC4KKworIyMjIyBCdWlsZCB0aGUgUHJvamVjdAorCitZb3UgY2FuIGp1c3QgcnVuIGBtYWtlYCB0byBiZWdpbiB0aGUgYnVpbGQuCisKK1RvIHNwZWVkIHVwIHRoZSBidWlsZCBvbiBhIG11bHRpLWNvcmUgbWFjaGluZSwgdXNlIHRoZSBgLWpgIG9wdGlvbiBmb3IgYG1ha2VgCit0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29yZXMgdG8gdXNlIGZvciB0aGUgYnVpbGQuIEZvciBleGFtcGxlOgorCisgICAgbWFrZSAtajQKKworWW91IGNhbiBhbHNvIHVzZQorCisgICAgY21ha2UgLS1idWlsZCAuCisKK0lmIHlvdXIgYnVpbGQgc3lzdGVtIHN1cHBvcnRzIGNjYWNoZSwgeW91IGNhbiBlbmFibGUgdGhhdCB2aWEgQ01ha2Ugb3B0aW9uCitgLURVU0VfQ0NBQ0hFPU9uYAorCisjIyMgTGludXggTm90ZXMKKworIyMjIyBVc2luZyBUaGUgVnVsa2FuIExvYWRlciBMaWJyYXJ5IGluIHRoaXMgUmVwb3NpdG9yeSBvbiBMaW51eAorCitUaGUgYHZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzYCBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIGFuIFJQQVRIIHNldHRpbmcgdG8KK2FsbG93IGl0IHRvIGZpbmQgdGhlIFZ1bGthbiBsb2FkZXIgbGlicmFyeSBpbiB0aGUgcmVwb3NpdG9yeSdzIGJ1aWxkCitkaXJlY3RvcnkuIFRoaXMgYWxsb3dzIHRoZSB0ZXN0IGV4ZWN1dGFibGUgdG8gcnVuIGFuZCBmaW5kIHRoaXMgVnVsa2FuIGxvYWRlcgorbGlicmFyeSB3aXRob3V0IGluc3RhbGxpbmcgdGhlIGxvYWRlciBsaWJyYXJ5IHRvIGEgZGlyZWN0b3J5IHNlYXJjaGVkIGJ5IHRoZQorc3lzdGVtIGxvYWRlciBvciBpbiB0aGUgYExEX0xJQlJBUllfUEFUSGAuCisKK0lmIHlvdSB3YW50IHRvIHRlc3QgYSBWdWxrYW4gYXBwbGljYXRpb24gdGhhdCBpcyBub3QgYnVpbHQgd2l0aGluIHRoaXMKK3JlcG9zaXRvcnkgd2l0aCB0aGUgbG9hZGVyIHlvdSBqdXN0IGJ1aWx0IGZyb20gdGhpcyByZXBvc2l0b3J5LCB5b3UgY2FuIGRpcmVjdAordGhlIGFwcGxpY2F0aW9uIHRvIGxvYWQgaXQgZnJvbSB5b3VyIGJ1aWxkIGRpcmVjdG9yeToKKworICAgIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg9PHBhdGggdG8geW91ciByZXBvc2l0b3J5IHJvb3Q+L2J1aWxkL2xvYWRlcgorCisjIyMjIFdTSSBTdXBwb3J0IEJ1aWxkIE9wdGlvbnMKKworQnkgZGVmYXVsdCwgdGhlIFZ1bGthbiBMb2FkZXIgaXMgYnVpbHQgd2l0aCBzdXBwb3J0IGZvciB0aGUgVnVsa2FuLWRlZmluZWQgV1NJCitkaXNwbGF5IHNlcnZlcnM6IFhjYiwgWGxpYiwgYW5kIFdheWxhbmQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGJ1aWxkIHRoZQorcmVwb3NpdG9yeSBjb21wb25lbnRzIHdpdGggc3VwcG9ydCBmb3IgdGhlc2UgZGlzcGxheSBzZXJ2ZXJzIHRvIG1heGltaXplIHRoZWlyCit1c2FiaWxpdHkgYWNyb3NzIExpbnV4IHBsYXRmb3Jtcy4gSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZXNlIG1vZHVsZXMKK3dpdGhvdXQgc3VwcG9ydCBmb3Igb25lIG9mIHRoZSBkaXNwbGF5IHNlcnZlcnMsIHRoZSBhcHByb3ByaWF0ZSBDTWFrZSBvcHRpb24KK29mIHRoZSBmb3JtIGBCVUlMRF9XU0lfeHh4X1NVUFBPUlRgIGNhbiBiZSBzZXQgdG8gYE9GRmAuCisKKyMjIyMgTGludXggSW5zdGFsbCB0byBTeXN0ZW0gRGlyZWN0b3JpZXMKKworSW5zdGFsbGluZyB0aGUgZmlsZXMgcmVzdWx0aW5nIGZyb20geW91ciBidWlsZCB0byB0aGUgc3lzdGVtcyBkaXJlY3RvcmllcyBpcworb3B0aW9uYWwgc2luY2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiB1c3VhbGx5IGJlIHVzZWQgaW5zdGVhZCB0byBsb2NhdGUgdGhlCitiaW5hcmllcy4gVGhlcmUgYXJlIGFsc28gcmlza3Mgd2l0aCBpbnRlcmZlcmluZyB3aXRoIGJpbmFyaWVzIGluc3RhbGxlZCBieQorcGFja2FnZXMuIElmIHlvdSBhcmUgY2VydGFpbiB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGluc3RhbGwgeW91ciBiaW5hcmllcyB0bworc3lzdGVtIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHByb2NlZWQgd2l0aCB0aGVzZSBpbnN0cnVjdGlvbnMuCisKK0Fzc3VtaW5nIHRoYXQgeW91J3ZlIGJ1aWx0IHRoZSBjb2RlIGFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgdGhlIGN1cnJlbnQKK2RpcmVjdG9yeSBpcyBzdGlsbCBgYnVpbGRgLCB5b3UgY2FuIGV4ZWN1dGU6CisKKyAgICBzdWRvIG1ha2UgaW5zdGFsbAorCitUaGlzIGNvbW1hbmQgaW5zdGFsbHMgZmlsZXMgdG8gYC91c3IvbG9jYWxgIGlmIG5vIGBDTUFLRV9JTlNUQUxMX1BSRUZJWGAgaXMKK3NwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBidWlsZCBmaWxlcyB3aXRoIENNYWtlOgorCistIGAvdXNyL2xvY2FsL2xpYmA6ICBWdWxrYW4gbG9hZGVyIGxpYnJhcnkgYW5kIHBhY2thZ2UgY29uZmlnIGZpbGVzCisKK1lvdSBtYXkgbmVlZCB0byBydW4gYGxkY29uZmlnYCBpbiBvcmRlciB0byByZWZyZXNoIHRoZSBzeXN0ZW0gbG9hZGVyIHNlYXJjaAorY2FjaGUgb24gc29tZSBMaW51eCBzeXN0ZW1zLgorCitZb3UgY2FuIGZ1cnRoZXIgY3VzdG9taXplIHRoZSBpbnN0YWxsYXRpb24gbG9jYXRpb24gYnkgc2V0dGluZyBhZGRpdGlvbmFsCitDTWFrZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlaXIgZGVmYXVsdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd291bGQgbGlrZSB0bworaW5zdGFsbCB0byBgL3RtcC9idWlsZGAgaW5zdGVhZCBvZiBgL3Vzci9sb2NhbGAsIG9uIHlvdXIgQ01ha2UgY29tbWFuZCBsaW5lCitzcGVjaWZ5OgorCisgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0vdG1wL2J1aWxkCisKK1RoZW4gcnVuIGBtYWtlIGluc3RhbGxgIGFzIGJlZm9yZS4gVGhlIGluc3RhbGwgc3RlcCBwbGFjZXMgdGhlIGZpbGVzIGluCitgL3RtcC9idWlsZGAuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgY29sbGVjdGluZyB0aGUgYXJ0aWZhY3RzIGFuZCBwcm92aWRpbmcKK3RoZW0gdG8gYW5vdGhlciBwcm9qZWN0IHRoYXQgaXMgZGVwZW5kZW50IG9uIHRoZW0uCisKK1VzaW5nIHRoZSBgQ01BS0VfSU5TVEFMTF9QUkVGSVhgIHRvIGN1c3RvbWl6ZSB0aGUgaW5zdGFsbCBsb2NhdGlvbiBhbHNvCittb2RpZmllcyB0aGUgbG9hZGVyIHNlYXJjaCBwYXRocyB0byBpbmNsdWRlIHNlYXJjaGluZyBmb3IgbGF5ZXJzIGluIHRoZQorc3BlY2lmaWVkIGluc3RhbGwgbG9jYXRpb24uIEluIHRoaXMgZXhhbXBsZSwgc2V0dGluZyBgQ01BS0VfSU5TVEFMTF9QUkVGSVhgIHRvCitgL3RtcC9idWlsZGAgY2F1c2VzIHRoZSBsb2FkZXIgdG8gc2VhcmNoCitgL3RtcC9idWlsZC9ldGMvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmRgIGFuZAorYC90bXAvYnVpbGQvc2hhcmUvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmRgIGZvciB0aGUgbGF5ZXIgSlNPTiBmaWxlcy4gVGhlCitsb2FkZXIgYWxzbyBzZWFyY2hlcyB0aGUgInN0YW5kYXJkIiBzeXN0ZW0gbG9jYXRpb25zIG9mCitgL2V0Yy92dWxrYW4vZXhwbGljaXRfbGF5ZXIuZGAgYW5kIGAvdXNyL3NoYXJlL3Z1bGthbi9leHBsaWNpdF9sYXllci5kYCBhZnRlcgorc2VhcmNoaW5nIHRoZSB0d28gbG9jYXRpb25zIHVuZGVyIGAvdG1wL2J1aWxkYC4KKworWW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGJ5IHVzaW5nIHRoZSBDTWFrZQordmFyaWFibGVzIGBDTUFLRV9JTlNUQUxMX1NZU0NPTkZESVJgIHRvIHJlbmFtZSB0aGUgYGV0Y2AgZGlyZWN0b3J5IGFuZAorYENNQUtFX0lOU1RBTExfREFUQURJUmAgdG8gcmVuYW1lIHRoZSBgc2hhcmVgIGRpcmVjdG9yeS4KKworU2VlIHRoZSBDTWFrZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhlc2UgdmFyaWFibGVzIHRvCitmdXJ0aGVyIGN1c3RvbWl6ZSB5b3VyIGluc3RhbGxhdGlvbi4KKworQWxzbyBzZWUgdGhlIGBMb2FkZXJBbmRMYXllckludGVyZmFjZWAgZG9jdW1lbnQgaW4gdGhlIGBsb2FkZXJgIGZvbGRlciBpbiB0aGlzCityZXBvc2l0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGxvYWRlciBvcGVyYXRpb24uCisKK05vdGUgdGhhdCBzb21lIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVwb3NpdG9yeSAoZS5nLiwKK2B2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0c2ApIHVzZSB0aGUgUlBBVEggbGlua2VyIGRpcmVjdGl2ZSB0byBsb2FkIHRoZQorVnVsa2FuIGxvYWRlciBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnksIGBidWlsZGAgaW4gdGhpcyBleGFtcGxlLiBUaGlzIG1lYW5zCit0aGF0IGV2ZW4gYWZ0ZXIgaW5zdGFsbGluZyB0aGUgbG9hZGVyIHRvIHRoZSBzeXN0ZW0gZGlyZWN0b3JpZXMsIHRoZXNlCitleGVjdXRhYmxlcyBzdGlsbCB1c2UgdGhlIGxvYWRlciBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisKKyMjIyMgTGludXggVW5pbnN0YWxsCisKK1RvIHVuaW5zdGFsbCB0aGUgZmlsZXMgZnJvbSB0aGUgc3lzdGVtIGRpcmVjdG9yaWVzLCB5b3UgY2FuIGV4ZWN1dGU6CisKKyAgICBzdWRvIG1ha2UgdW5pbnN0YWxsCisKKyMjIyMgTGludXggVGVzdHMKKworVGhlIFZ1bGthbi1Mb2FkZXIgcmVwb3NpdG9yeSBjb250YWlucyBzb21lIHNpbXBsZSB1bml0IHRlc3RzIGZvciB0aGUgbG9hZGVyCitidXQgbm8gb3RoZXIgdGVzdCBjbGllbnRzLgorCitUbyBydW4gdGhlIGxvYWRlciB0ZXN0IHNjcmlwdCwgY2hhbmdlIHRvIHRoZSBgYnVpbGQvdGVzdHNgIGRpcmVjdG9yeSwgYW5kIHJ1bjoKKworICAgIC4vcnVuX2FsbF90ZXN0cy5zaAorCitUaGlzIHNjcmlwdCB3aWxsIHJ1biB0aGUgZm9sbG93aW5nIHRlc3RzOgorCistIGB2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0c2A6IFZ1bGthbiBsb2FkZXIgaGFuZGxlIHdyYXBwaW5nLCBhbGxvY2F0aW9uCisgIGNhbGxiYWNrLCBhbmQgbG9hZGVyL2xheWVyIGludGVyZmFjZSB0ZXN0cworCisjIyMjIExpbnV4IDMyLWJpdCBzdXBwb3J0CisKK1VzYWdlIG9mIHRoaXMgcmVwb3NpdG9yeSdzIGNvbnRlbnRzIGluIDMyLWJpdCBMaW51eCBlbnZpcm9ubWVudHMgaXMgbm90CitvZmZpY2lhbGx5IHN1cHBvcnRlZC4gSG93ZXZlciwgc2luY2UgdGhpcyByZXBvc2l0b3J5IGlzIHN1cHBvcnRlZCBvbiAzMi1iaXQKK1dpbmRvd3MsIHRoZXNlIG1vZHVsZXMgc2hvdWxkIGdlbmVyYWxseSB3b3JrIG9uIDMyLWJpdCBMaW51eC4KKworSGVyZSBhcmUgc29tZSBub3RlcyBmb3IgYnVpbGRpbmcgMzItYml0IHRhcmdldHMgb24gYSA2NC1iaXQgVWJ1bnR1ICJyZWZlcmVuY2UiCitwbGF0Zm9ybToKKworSWYgbm90IGFscmVhZHkgaW5zdGFsbGVkLCBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgMzItYml0IGRldmVsb3BtZW50IGxpYnJhcmllczoKKworYGdjYy1tdWx0aWxpYiBnKystbXVsdGlsaWIgbGlieDExLWRldjppMzg2YAorCitUaGlzIGxpc3QgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHlvdXIgZGlzdHJpYnV0aW9uIGFuZCB3aGljaCB3aW5kb3dpbmcgc3lzdGVtcworeW91IGFyZSBidWlsZGluZyBmb3IuCisKK1NldCB1cCB5b3VyIGVudmlyb25tZW50IGZvciBidWlsZGluZyAzMi1iaXQgdGFyZ2V0czoKKworICAgIGV4cG9ydCBBU0ZMQUdTPS0tMzIKKyAgICBleHBvcnQgQ0ZMQUdTPS1tMzIKKyAgICBleHBvcnQgQ1hYRkxBR1M9LW0zMgorICAgIGV4cG9ydCBQS0dfQ09ORklHX0xJQkRJUj0vdXNyL2xpYi9pMzg2LWxpbnV4LWdudQorCitBZ2FpbiwgeW91ciBQS0dfQ09ORklHIGNvbmZpZ3VyYXRpb24gbWF5IGJlIGRpZmZlcmVudCwgZGVwZW5kaW5nIG9uIHlvdXIKK2Rpc3RyaWJ1dGlvbi4KKworRmluYWxseSwgcmVidWlsZCB0aGUgcmVwb3NpdG9yeSB1c2luZyBgY21ha2VgIGFuZCBgbWFrZWAsIGFzIGV4cGxhaW5lZCBhYm92ZS4KKworIyMgQnVpbGRpbmcgb24gTWFjT1MKKworIyMjIE1hY09TIERldmVsb3BtZW50IEVudmlyb25tZW50IFJlcXVpcmVtZW50cworCitUZXN0ZWQgb24gT1NYIHZlcnNpb24gMTAuMTIuNgorCitTZXR1cCBIb21lYnJldyBhbmQgY29tcG9uZW50cworCistIEZvbGxvdyBpbnN0cnVjdGlvbnMgb24gW2JyZXcuc2hdKGh0dHA6Ly9icmV3LnNoKSB0byBnZXQgSG9tZWJyZXcgaW5zdGFsbGVkLgorCisgICAgICAvdXNyL2Jpbi9ydWJ5IC1lICIkKGN1cmwgLWZzU0wgXAorICAgICAgICAgIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Ib21lYnJldy9pbnN0YWxsL21hc3Rlci9pbnN0YWxsKSIKKworLSBFbnN1cmUgSG9tZWJyZXcgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB5b3VyIFBBVEg6CisKKyAgICAgIGV4cG9ydCBQQVRIPS91c3IvbG9jYWwvYmluOiRQQVRICisKKy0gQWRkIHBhY2thZ2VzIHdpdGggdGhlIGZvbGxvd2luZyAobWF5IG5lZWQgcmVmaW5lbWVudCkKKworICAgICAgYnJldyBpbnN0YWxsIHB5dGhvbiBweXRob24zIGdpdAorCisjIyMgQ2xvbmUgdGhlIFJlcG9zaXRvcnkKKworQ2xvbmUgdGhlIFZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzIHJlcG9zaXRvcnk6CisKKyAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tVmFsaWRhdGlvbkxheWVycy5naXQKKworIyMjIE1hY09TIGJ1aWxkCisKK1tDTWFrZSAzLjEwLjJdKGh0dHBzOi8vY21ha2Uub3JnL2ZpbGVzL3YzLjEwL2NtYWtlLTMuMTAuMi1EYXJ3aW4teDg2XzY0LnRhci5neikgaXMgcmVjb21tZW5kZWQuCisKKyMjIyMgQ01ha2UgR2VuZXJhdG9ycworCitUaGlzIHJlcG9zaXRvcnkgdXNlcyBDTWFrZSB0byBnZW5lcmF0ZSBidWlsZCBvciBwcm9qZWN0IGZpbGVzIHRoYXQgYXJlIHRoZW4KK3VzZWQgdG8gYnVpbGQgdGhlIHJlcG9zaXRvcnkuIFRoZSBDTWFrZSBnZW5lcmF0b3JzIGV4cGxpY2l0bHkgc3VwcG9ydGVkIGluCit0aGlzIHJlcG9zaXRvcnkgYXJlOgorCistIFVuaXggTWFrZWZpbGVzCistIFhjb2RlCisKKyMjIyMgQnVpbGRpbmcgd2l0aCB0aGUgVW5peCBNYWtlZmlsZXMgR2VuZXJhdG9yCisKK1RoaXMgZ2VuZXJhdG9yIGlzIHRoZSBkZWZhdWx0IGdlbmVyYXRvci4KKworV2hlbiBnZW5lcmF0aW5nIHRoZSBwcm9qZWN0IGZpbGVzLCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIFZ1bGthbi1IZWFkZXJzCitpbnN0YWxsIGRpcmVjdG9yeSBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgdGhlCitgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJgIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgdGhlCitgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJgIENNYWtlIHZhcmlhYmxlIHdpdGggdGhlIGAtRGAgQ01ha2Ugb3B0aW9uLiBJbgorZWl0aGVyIGNhc2UsIHRoZSB2YXJpYWJsZSBzaG91bGQgcG9pbnQgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYQorVnVsa2FuLUhlYWRlcnMgcmVwb3NpdG9yeSBidWlsdCB3aXRoIHRoZSBpbnN0YWxsIHRhcmdldC4KKworICAgIG1rZGlyIGJ1aWxkCisgICAgY2QgYnVpbGQKKyAgICBjbWFrZSAtRFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIgLURDTUFLRV9CVUlMRF9UWVBFPURlYnVnIC4uCisgICAgbWFrZQorCitUbyBzcGVlZCB1cCB0aGUgYnVpbGQgb24gYSBtdWx0aS1jb3JlIG1hY2hpbmUsIHVzZSB0aGUgYC1qYCBvcHRpb24gZm9yIGBtYWtlYAordG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvcmVzIHRvIHVzZSBmb3IgdGhlIGJ1aWxkLiBGb3IgZXhhbXBsZToKKworICAgIG1ha2UgLWo0CisKKyMjIyMgQnVpbGRpbmcgd2l0aCB0aGUgWGNvZGUgR2VuZXJhdG9yCisKK1RvIGNyZWF0ZSBhbmQgb3BlbiBhbiBYY29kZSBwcm9qZWN0OgorCisgICAgbWtkaXIgYnVpbGQteGNvZGUKKyAgICBjZCBidWlsZC14Y29kZQorICAgIGNtYWtlIC1HWGNvZGUgLi4KKyAgICBvcGVuIFZ1bGthbi1Mb2FkZXIueGNvZGVwcm9qCisKK1dpdGhpbiBYY29kZSwgeW91IGNhbiBzZWxlY3QgRGVidWcgb3IgUmVsZWFzZSBidWlsZHMgaW4gdGhlIHByb2plY3QncyBCdWlsZAorU2V0dGluZ3MuCisKKyMjIyBVc2luZyB0aGUgbmV3IG1hY09TIGxvYWRlcgorCitJZiB5b3Ugd2FudCB0byB0ZXN0IGEgVnVsa2FuIGFwcGxpY2F0aW9uIHdpdGggdGhlIGxvYWRlciB5b3UganVzdCBidWlsdCwgeW91CitjYW4gZGlyZWN0IHRoZSBhcHBsaWNhdGlvbiB0byBsb2FkIGl0IGZyb20geW91ciBidWlsZCBkaXJlY3Rvcnk6CisKKyAgICBleHBvcnQgRFlMRF9MSUJSQVJZX1BBVEg9PHBhdGggdG8geW91ciByZXBvc2l0b3J5Pi9idWlsZC9sb2FkZXIKKworIyMjIE1hY09TIFRlc3RzCisKK1RoZSBWdWxrYW4tTG9hZGVyIHJlcG9zaXRvcnkgY29udGFpbnMgc29tZSBzaW1wbGUgdW5pdCB0ZXN0cyBmb3IgdGhlIGxvYWRlcgorYnV0IG5vIG90aGVyIHRlc3QgY2xpZW50cy4KKworQmVmb3JlIHlvdSBydW4gdGhlc2UgdGVzdHMsIHlvdSB3aWxsIG5lZWQgdG8gY2xvbmUgYW5kIGJ1aWxkIHRoZQorW01vbHRlblZLXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL01vbHRlblZLKSByZXBvc2l0b3J5LgorCitZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gZGlyZWN0IHlvdXIgbmV3IGxvYWRlciB0byB0aGUgTW9sdGVuVksgSUNEOgorCisgICAgZXhwb3J0IFZLX0lDRF9GSUxFTkFNRVM9PHBhdGggdG8gTW9sdGVuVksgcmVwb3NpdG9yeT4vUGFja2FnZS9MYXRlc3QvTW9sdGVuVksvbWFjT1MvTW9sdGVuVktfaWNkLmpzb24KKworVG8gcnVuIHRoZSBsb2FkZXIgdGVzdCBzY3JpcHQsIGNoYW5nZSB0byB0aGUgYGJ1aWxkL3Rlc3RzYCBkaXJlY3RvcnkgaW4geW91cgorVnVsa2FuLUxvYWRlciByZXBvc2l0b3J5LCBhbmQgcnVuOgorCisgICAgLi92a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTllZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMjEgQEAKKyMgfn5+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNC0yMDE5IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyB+fn4KKworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMTAuMikKKworIyBBcHBsZTogTXVzdCBiZSBzZXQgYmVmb3JlIGVuYWJsZV9sYW5ndWFnZSgpIG9yIHByb2plY3QoKSBhcyBpdCBtYXkgaW5mbHVlbmNlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRvb2xjaGFpbiBhbmQgZmxhZ3MuCitzZXQoQ01BS0VfT1NYX0RFUExPWU1FTlRfVEFSR0VUICIxMC4xMiIgQ0FDSEUgU1RSSU5HICJNaW5pbXVtIE9TIFggZGVwbG95bWVudCB2ZXJzaW9uIikKKworcHJvamVjdChWdWxrYW4tTG9hZGVyKQorCitlbmFibGVfdGVzdGluZygpCisKK3NldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlMgQVBJX05BTUU9IlZ1bGthbiIpCisKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX01PRFVMRV9QQVRIfSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlIikKK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnAgMyBRVUlFVCkKKworaWYgKFRBUkdFVCBWdWxrYW46OkhlYWRlcnMpCisgICAgbWVzc2FnZShTVEFUVVMgIlVzaW5nIFZ1bGthbiBoZWFkZXJzIGZyb20gVnVsa2FuOjpIZWFkZXJzIHRhcmdldCIpCisgICAgZ2V0X3RhcmdldF9wcm9wZXJ0eShWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSUyBWdWxrYW46OkhlYWRlcnMgSU5URVJGQUNFX0lOQ0xVREVfRElSRUNUT1JJRVMpCisgICAgZ2V0X3RhcmdldF9wcm9wZXJ0eShWdWxrYW5SZWdpc3RyeV9ESVIgVnVsa2FuOjpSZWdpc3RyeSBJTlRFUkZBQ0VfSU5DTFVERV9ESVJFQ1RPUklFUykKK2Vsc2UoKQorICAgIGZpbmRfcGFja2FnZShWdWxrYW5IZWFkZXJzKQorICAgIGlmKE5PVCAke1Z1bGthbkhlYWRlcnNfRk9VTkR9KQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBub3QgZmluZCBWdWxrYW4gaGVhZGVycyBwYXRoLiBUaGlzIGNhbiBiZSBmaXhlZCBieSBzZXR0aW5nIFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSIHRvIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIG9mIHRoZSBWdWxrYW4tSGVhZGVycyByZXBvc2l0b3J5LiIpCisgICAgZW5kaWYoKQorICAgIGlmKE5PVCAke1Z1bGthblJlZ2lzdHJ5X0ZPVU5EfSkKKyAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ291bGQgbm90IGZpbmQgVnVsa2FuIHJlZ2lzdHJ5IHBhdGguIFRoaXMgY2FuIGJlIGZpeGVkIGJ5IHNldHRpbmcgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVIgdG8gYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsYXRpb24gb2YgdGhlIFZ1bGthbi1IZWFkZXJzIHJlcG9zaXRvcnkuIikKKyAgICBlbmRpZigpCisKKyAgICAjIHNldCB1cCB0aGUgVnVsa2FuOjpIZWFkZXJzIHRhcmdldCBmb3IgY29uc2lzdGVuY3kKKyAgICBhZGRfbGlicmFyeSh2dWxrYW4taGVhZGVycyBJTlRFUkZBQ0UpCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXModnVsa2FuLWhlYWRlcnMgSU5URVJGQUNFICIke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTfSIpCisgICAgYWRkX2xpYnJhcnkoVnVsa2FuOjpIZWFkZXJzIEFMSUFTIHZ1bGthbi1oZWFkZXJzKQorZW5kaWYoKQorCitvcHRpb24oVVNFX0NDQUNIRSAiVXNlIGNjYWNoZSIgT0ZGKQoraWYoVVNFX0NDQUNIRSkKKyAgICBmaW5kX3Byb2dyYW0oQ0NBQ0hFX0ZPVU5EIGNjYWNoZSkKKyAgICBpZihDQ0FDSEVfRk9VTkQpCisgICAgICAgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgUlVMRV9MQVVOQ0hfQ09NUElMRSBjY2FjaGUpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpbmNsdWRlKEdOVUluc3RhbGxEaXJzKQorCitpZihVTklYIEFORCBOT1QgQVBQTEUpICMgaS5lLjogTGludXgKKyAgICBpbmNsdWRlKEZpbmRQa2dDb25maWcpCitlbmRpZigpCisKK2lmKEFQUExFKQorICAgICMgQ01ha2UgdmVyc2lvbnMgMyBvciBsYXRlciBuZWVkIENNQUtFX01BQ09TWF9SUEFUSCBkZWZpbmVkLiBUaGlzIGF2b2lkcyB0aGUgQ01QMDA0MiBwb2xpY3kgbWVzc2FnZS4KKyAgICBzZXQoQ01BS0VfTUFDT1NYX1JQQVRIIDEpCitlbmRpZigpCisKK2lmKFdJTjMyIEFORCBDTUFLRV9JTlNUQUxMX1BSRUZJWF9JTklUSUFMSVpFRF9UT19ERUZBVUxUKQorICAgICMgV2luZG93czogaWYgaW5zdGFsbCBsb2NhdGlvbnMgbm90IHNldCBieSB1c2VyLCBzZXQgaW5zdGFsbCBwcmVmaXggdG8gIjxidWlsZF9kaXI+XGluc3RhbGwiLgorICAgIHNldChDTUFLRV9JTlNUQUxMX1BSRUZJWCAiJHtDTUFLRV9CSU5BUllfRElSfS9pbnN0YWxsIiBDQUNIRSBQQVRIICJkZWZhdWx0IGluc3RhbGwgcGF0aCIgRk9SQ0UpCitlbmRpZigpCisKKyMgRW5hYmxlIElERSBHVUkgZm9sZGVycy4gICJIZWxwZXIgdGFyZ2V0cyIgdGhhdCBkb24ndCBoYXZlIGludGVyZXN0aW5nIHNvdXJjZSBjb2RlIHNob3VsZCBzZXQgdGhlaXIgRk9MREVSIHByb3BlcnR5IHRvIHRoaXMKK3NldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgVVNFX0ZPTERFUlMgT04pCitzZXQoTE9BREVSX0hFTFBFUl9GT0xERVIgIkhlbHBlciBUYXJnZXRzIikKKworaWYoVU5JWCkKKyAgICBzZXQoCisgICAgICAgIEZBTExCQUNLX0NPTkZJR19ESVJTICIvZXRjL3hkZyIKKyAgICAgICAgQ0FDSEUKKyAgICAgICAgICAgIFNUUklORworICAgICAgICAgICAgIlNlYXJjaCBwYXRoIHRvIHVzZSB3aGVuIFhER19DT05GSUdfRElSUyBpcyB1bnNldCBvciBlbXB0eSBvciB0aGUgY3VycmVudCBwcm9jZXNzIGlzIFNVSUQvU0dJRC4gRGVmYXVsdCBpcyBmcmVlZGVza3RvcCBjb21wbGlhbnQuIgorICAgICAgICApCisgICAgc2V0KAorICAgICAgICBGQUxMQkFDS19EQVRBX0RJUlMgIi91c3IvbG9jYWwvc2hhcmU6L3Vzci9zaGFyZSIKKyAgICAgICAgQ0FDSEUKKyAgICAgICAgICAgIFNUUklORworICAgICAgICAgICAgIlNlYXJjaCBwYXRoIHRvIHVzZSB3aGVuIFhER19EQVRBX0RJUlMgaXMgdW5zZXQgb3IgZW1wdHkgb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBTVUlEL1NHSUQuIERlZmF1bHQgaXMgZnJlZWRlc2t0b3AgY29tcGxpYW50LiIKKyAgICAgICAgKQorICAgIHNldCgKKyAgICAgICAgU1lTQ09ORkRJUiAiIgorICAgICAgICBDQUNIRQorICAgICAgICAgICAgU1RSSU5HCisgICAgICAgICAgICAiU3lzdGVtLXdpZGUgc2VhcmNoIGRpcmVjdG9yeS4gSWYgbm90IHNldCBvciBlbXB0eSwgQ01BS0VfSU5TVEFMTF9GVUxMX1NZU0NPTkZESVIgYW5kIC9ldGMgYXJlIHVzZWQuIgorICAgICAgICApCitlbmRpZigpCisKK2lmKFVOSVggQU5EIE5PVCBBUFBMRSkgIyBpLmUuOiBMaW51eAorICAgIG9wdGlvbihCVUlMRF9XU0lfWENCX1NVUFBPUlQgIkJ1aWxkIFhDQiBXU0kgc3VwcG9ydCIgT04pCisgICAgb3B0aW9uKEJVSUxEX1dTSV9YTElCX1NVUFBPUlQgIkJ1aWxkIFhsaWIgV1NJIHN1cHBvcnQiIE9OKQorICAgIG9wdGlvbihCVUlMRF9XU0lfV0FZTEFORF9TVVBQT1JUICJCdWlsZCBXYXlsYW5kIFdTSSBzdXBwb3J0IiBPTikKKworICAgIGlmKEJVSUxEX1dTSV9YQ0JfU1VQUE9SVCkKKyAgICAgICAgZmluZF9wYWNrYWdlKFhDQiBSRVFVSVJFRCkKKyAgICBlbmRpZigpCisKKyAgICBpZihCVUlMRF9XU0lfWExJQl9TVVBQT1JUKQorICAgICAgICBmaW5kX3BhY2thZ2UoWDExIFJFUVVJUkVEKQorICAgIGVuZGlmKCkKKworICAgIGlmKEJVSUxEX1dTSV9XQVlMQU5EX1NVUFBPUlQpCisgICAgICAgIGZpbmRfcGFja2FnZShXYXlsYW5kIFJFUVVJUkVEKQorICAgICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7V0FZTEFORF9DTElFTlRfSU5DTFVERV9ESVJ9KQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoV0lOMzIpCisgICAgb3B0aW9uKEVOQUJMRV9XSU4xMF9PTkVDT1JFICJMaW5rIHRoZSBsb2FkZXIgd2l0aCBPbmVDb3JlIHVtYnJlbGxhIGxpYnJhcmllcyIgT0ZGKQorICAgIG9wdGlvbihFTkFCTEVfU1RBVElDX0xPQURFUiAiQnVpbGQgdGhlIGxvYWRlciBhcyBhIHN0YXRpYyBsaWJyYXJ5IiBPRkYpCitlbmRpZigpCisKK29wdGlvbihCVUlMRF9MT0FERVIgIkJ1aWxkIGxvYWRlciIgT04pCisKK2lmKElTX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXh0ZXJuYWwvZ29vZ2xldGVzdCkKKyAgICBvcHRpb24oQlVJTERfVEVTVFMgIkJ1aWxkIFRlc3RzIiBPTikKK2Vsc2UoKQorICAgIG9wdGlvbihCVUlMRF9URVNUUyAiQnVpbGQgVGVzdHMiIE9GRikKK2VuZGlmKCkKKworaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgT1IgQ01BS0VfQ19DT01QSUxFUl9JRCBNQVRDSEVTICJDbGFuZyIpCisgICAgc2V0KENPTU1PTl9DT01QSUxFX0ZMQUdTICItV2FsbCAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIikKKyAgICBzZXQoQ09NTU9OX0NPTVBJTEVfRkxBR1MgIiR7Q09NTU9OX0NPTVBJTEVfRkxBR1N9IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tYnVpbHRpbi1tZW1jbXAiKQorCisgICAgIyBGb3IgR0NDIHZlcnNpb24gNy4xIG9yIGdyZWF0ZXIsIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGUgaW1wbGljaXQgZmFsbHRocm91Z2ggd2FybmluZyBzaW5jZSB0aGVyZSdzIG5vIGNvbnNpc3RlbnQgd2F5IHRvIHNhdGlzZnkKKyAgICAjIGFsbCBjb21waWxlcnMgdW50aWwgdGhleSBhbGwgYWNjZXB0IHRoZSBDKysxNyBzdGFuZGFyZAorICAgIGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDKQorICAgICAgICBzZXQoQ09NTU9OX0NPTVBJTEVfRkxBR1MgIiR7Q09NTU9OX0NPTVBJTEVfRkxBR1N9IC1Xbm8tc3RyaW5nb3AtdHJ1bmNhdGlvbiAtV25vLXN0cmluZ29wLW92ZXJmbG93IikKKyAgICAgICAgaWYoQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gR1JFQVRFUl9FUVVBTCA3LjEpCisgICAgICAgICAgICBzZXQoQ09NTU9OX0NPTVBJTEVfRkxBR1MgIiR7Q09NTU9OX0NPTVBJTEVfRkxBR1N9IC1XaW1wbGljaXQtZmFsbHRocm91Z2g9MCIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisKKyAgICBpZihBUFBMRSkKKyAgICAgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gJHtDT01NT05fQ09NUElMRV9GTEFHU30iKQorICAgICNjbGFuZy1jbCBvbiBXaW5kb3dzCisgICAgZWxzZWlmKChDTUFLRV9DX0NPTVBJTEVSX0lEIE1BVENIRVMgIkNsYW5nIikgQU5EIChDTUFLRV9DWFhfU0lNVUxBVEVfSUQgTUFUQ0hFUyAiTVNWQyIpKQorICAgICAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtWGNsYW5nIC1zdGQ9Yzk5ICR7Q09NTU9OX0NPTVBJTEVfRkxBR1N9IikKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1YY2xhbmcgLXN0ZD1jKysxMSAtZm5vLXJ0dGkiKQorICAgICMgY2xhbmcgKG5vdCBjbGFuZy1jbCkgb3IgZ2NjCisgICAgZWxzZSgpCisgICAgICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC1zdGQ9Yzk5ICR7Q09NTU9OX0NPTVBJTEVfRkxBR1N9IikKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1zdGQ9YysrMTEgLWZuby1ydHRpIikKKyAgICBlbmRpZigpCisKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gJHtDT01NT05fQ09NUElMRV9GTEFHU30iKQorCisgICAgaWYoVU5JWCkKKyAgICAgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLWZ2aXNpYmlsaXR5PWhpZGRlbiIpCisgICAgICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtZnZpc2liaWxpdHk9aGlkZGVuIikKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2lmKE1TVkMpCisgICAgIyAvV1g6IFRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycworICAgICMgL0dSLTogRGlzYWJsZSBSVFRJCisgICAgIyAvdzM0NDU2OiBXYXJuIGFib3V0IG5lc3RlZCBkZWNsYXJhdGlvbnMKKyAgICAjIC93MzQ3MDEsIC93MzQ3MDM6IFdhcm4gYWJvdXQgcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKKyAgICAjIC93MzQwNTc6IFdhcm4gYWJvdXQgZGlmZmVyZW50IGluZGlyZWN0aW9uIHR5cGVzLgorICAgICMgL3czNDI0NTogV2FybiBhYm91dCBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2guCisgICAgc2V0KE1TVkNfTE9BREVSX0NPTVBJTEVfT1BUSU9OUyAvV1ggL0dSLSAvdzM0NDU2IC93MzQ3MDEgL3czNDcwMyAvdzM0MDU3IC93MzQyNDUpCitlbmRpZigpCisKKyMgT3B0aW9uYWwgY29kZWdlbiB0YXJnZXQKK2lmKFBZVEhPTklOVEVSUF9GT1VORCkKKyAgICBhZGRfY3VzdG9tX3RhcmdldChWdWxrYW5Mb2FkZXJfZ2VuZXJhdGVkX3NvdXJjZQorICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3NjcmlwdHMvZ2VuZXJhdGVfc291cmNlLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke1Z1bGthblJlZ2lzdHJ5X0RJUn0gLS1pbmNyZW1lbnRhbAorICAgICAgICAgICAgICAgICAgICAgICkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoIldBUk5JTkc6IFZ1bGthbkxvYWRlcl9nZW5lcmF0ZWRfc291cmNlIHRhcmdldCByZXF1aXJlcyBweXRob24gMyIpCitlbmRpZigpCisKKworaWYoVU5JWCkKKyAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TIEZBTExCQUNLX0NPTkZJR19ESVJTPSIke0ZBTExCQUNLX0NPTkZJR19ESVJTfSIgRkFMTEJBQ0tfREFUQV9ESVJTPSIke0ZBTExCQUNLX0RBVEFfRElSU30iKQorCisgICAgaWYoTk9UIChTWVNDT05GRElSIFNUUkVRVUFMICIiKSkKKyAgICAgICAgIyBTWVNDT05GRElSIGlzIHNwZWNpZmllZCwgdXNlIGl0IGFuZCBkbyBub3QgZm9yY2UgL2V0Yy4KKyAgICAgICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBTWVNDT05GRElSPSIke1NZU0NPTkZESVJ9IikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBTWVNDT05GRElSPSIke0NNQUtFX0lOU1RBTExfRlVMTF9TWVNDT05GRElSfSIpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgL2V0YyBpcyBzZWFyY2hlZCBieSB0aGUgbG9hZGVyCisgICAgICAgIGlmKE5PVCAoQ01BS0VfSU5TVEFMTF9GVUxMX1NZU0NPTkZESVIgU1RSRVFVQUwgIi9ldGMiKSkKKyAgICAgICAgICAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlMgRVhUUkFTWVNDT05GRElSPSIvZXRjIikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworIyB1bmluc3RhbGwgdGFyZ2V0CitpZihOT1QgVEFSR0VUIHVuaW5zdGFsbCkKKyAgICBjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbiIKKyAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NtYWtlX3VuaW5zdGFsbC5jbWFrZSIKKyAgICAgICAgICAgICAgICAgICBJTU1FRElBVEUKKyAgICAgICAgICAgICAgICAgICBAT05MWSkKKyAgICBhZGRfY3VzdG9tX3RhcmdldCh1bmluc3RhbGwgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1QICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9jbWFrZV91bmluc3RhbGwuY21ha2UpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHVuaW5zdGFsbCBQUk9QRVJUSUVTIEZPTERFUiAke0xPQURFUl9IRUxQRVJfRk9MREVSfSkKK2VuZGlmKCkKKworaWYoQlVJTERfTE9BREVSKQorICAgIGFkZF9zdWJkaXJlY3RvcnkobG9hZGVyKQorZW5kaWYoKQorCithZGRfc3ViZGlyZWN0b3J5KGV4dGVybmFsKQoraWYoQlVJTERfVEVTVFMpCisgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0cykKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9DT0RFX09GX0NPTkRVQ1QubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvQ09ERV9PRl9DT05EVUNULm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTYxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvQ09ERV9PRl9DT05EVUNULm1kCkBAIC0wLDAgKzEgQEAKK0EgcmVtaW5kZXIgdGhhdCB0aGlzIGlzc3VlIHRyYWNrZXIgaXMgbWFuYWdlZCBieSB0aGUgS2hyb25vcyBHcm91cC4gSW50ZXJhY3Rpb25zIGhlcmUgc2hvdWxkIGZvbGxvdyB0aGUgS2hyb25vcyBDb2RlIG9mIENvbmR1Y3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL2RldmVsb3BlcnMvY29kZS1vZi1jb25kdWN0KSwgd2hpY2ggcHJvaGliaXRzIGFnZ3Jlc3NpdmUgb3IgZGVyb2dhdG9yeSBsYW5ndWFnZS4gUGxlYXNlIGtlZXAgdGhlIGRpc2N1c3Npb24gZnJpZW5kbHkgYW5kIGNpdmlsLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL0NPTlRSSUJVVElORy5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2ODc5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwxNjkgQEAKKyMgSG93IHRvIENvbnRyaWJ1dGUgdG8gVnVsa2FuIFNvdXJjZSBSZXBvc2l0b3JpZXMKKworIyMgVGhlIFJlcG9zaXRvcnkKKworVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgVnVsa2FuIExvYWRlciBjb21wb25lbnQgaXMgc3BvbnNvcmVkCitieSBLaHJvbm9zIGFuZCBMdW5hckcuCisKKyogW0tocm9ub3NHcm91cC9WdWxrYW4tTG9hZGVyXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Mb2FkZXIpCisKKyMjIyBUaGUgVnVsa2FuIEVjb3N5c3RlbSBOZWVkcyBZb3VyIEhlbHAKKworVGhlcmUgYXJlIGEgY291cGxlIG9mIG1ldGhvZHMgdG8gaWRlbnRpZnkgYXJlYXMgb2YgbmVlZDoKKworKiBFeGFtaW5lIHRoZSBbaXNzdWVzIGxpc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLUxvYWRlci9pc3N1ZXMpCisgIGluIHRoaXMgcmVwb3NpdG9yeSBhbmQgbG9vayBmb3IgaXNzdWVzIHRoYXQgYXJlIG9mIGludGVyZXN0CisqIElmIHlvdSBoYXZlIHlvdXIgb3duIHdvcmsgaW4gbWluZCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgdG8gZGVzY3JpYmUKKyAgaXQgYW5kIGFzc2lnbiBpdCB0byB5b3Vyc2VsZi4KKworUGxlYXNlIGZlZWwgZnJlZSB0byBjb250YWN0IGFueSBvZiB0aGUgZGV2ZWxvcGVycyB0aGF0IGFyZSBhY3RpdmVseQorY29udHJpYnV0aW5nIHNob3VsZCB5b3Ugd2lzaCB0byBjb29yZGluYXRlIGZ1cnRoZXIuCisKK1JlcG9zaXRvcnkgSXNzdWUgbGFiZWxzOgorCisqIF9CdWdfOiAgICAgICAgICBUaGVzZSBpc3N1ZXMgcmVmZXIgdG8gaW52YWxpZCBvciBicm9rZW4gZnVuY3Rpb25hbGl0eSBhbmQgYXJlCisgIHRoZSBoaWdoZXN0IHByaW9yaXR5LgorKiBfRW5oYW5jZW1lbnRfOiAgVGhlc2UgaXNzdWVzIHJlZmVyIHRvIGlkZWFzIGZvciBleHRlbmRpbmcgb3IgaW1wcm92aW5nIHRoZQorICBsb2FkZXIuCisKK0l0IGlzIHRoZSBtYWludGFpbmVycyBnb2FsIGZvciBhbGwgaXNzdWVzIHRvIGJlIGFzc2lnbmVkIHdpdGhpbiBvbmUgYnVzaW5lc3MgZGF5CitvZiB0aGVpciBzdWJtaXNzaW9uLgorSWYgeW91IGNob29zZSB0byB3b3JrIG9uIGFuIGlzc3VlIHRoYXQgaXMgYXNzaWduZWQsIHNpbXBseSBjb29yZGluYXRlIHdpdGggdGhlCitjdXJyZW50IGFzc2lnbmVlLgorCisjIyMgSG93IHRvIFN1Ym1pdCBGaXhlcworCisqICoqRW5zdXJlIHRoYXQgdGhlIGJ1ZyB3YXMgbm90IGFscmVhZHkgcmVwb3J0ZWQgb3IgZml4ZWQqKiBieSBzZWFyY2hpbmcgb24KKyAgR2l0SHViIHVuZGVyIElzc3VlcyBhbmQgUHVsbCBSZXF1ZXN0cy4KKyogVXNlIHRoZSBleGlzdGluZyBHaXRIdWIgZm9ya2luZyBhbmQgcHVsbCByZXF1ZXN0IHByb2Nlc3MuCisgIFRoaXMgd2lsbCBpbnZvbHZlCisgIFtmb3JraW5nIHRoZSByZXBvc2l0b3J5XShodHRwczovL2hlbHAuZ2l0aHViLmNvbS9hcnRpY2xlcy9mb3JrLWEtcmVwby8pLAorICBjcmVhdGluZyBhIGJyYW5jaCB3aXRoIHlvdXIgY29tbWl0cywgYW5kIHRoZW4KKyAgW3N1Ym1pdHRpbmcgYSBwdWxsIHJlcXVlc3RdKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL3VzaW5nLXB1bGwtcmVxdWVzdHMvKS4KKyogUGxlYXNlIHJlYWQgYW5kIGFkaGVyZSB0byB0aGUgc3R5bGUgYW5kIHByb2Nlc3MKKyAgW2d1aWRlbGluZXNdKCNjb2RpbmctY29udmVudGlvbnMtYW5kLWZvcm1hdHRpbmcpIGVudW1lcmF0ZWQgYmVsb3cuCisqIFBsZWFzZSBiYXNlIHlvdXIgZml4ZXMgb24gdGhlIG1hc3RlciBicmFuY2guCisgIFNESyBicmFuY2hlcyBhcmUgZ2VuZXJhbGx5IG5vdCB1cGRhdGVkIGV4Y2VwdCBmb3IgY3JpdGljYWwgZml4ZXMgbmVlZGVkIHRvCisgIHJlcGFpciBhbiBTREsgcmVsZWFzZS4KKyogVGhlIHJlc3VsdGluZyBQdWxsIFJlcXVlc3Qgd2lsbCBiZSBhc3NpZ25lZCB0byBhIHJlcG9zaXRvcnkgbWFpbnRhaW5lci4KKyAgSXQgaXMgdGhlIG1haW50YWluZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhlIFB1bGwgUmVxdWVzdAorICBwYXNzZXMgdGhlIEdvb2dsZS9MdW5hckcgaW50ZXJuYWwgQ0kgcHJvY2Vzc2VzLgorICBPbmNlIHRoZSBQdWxsIFJlcXVlc3QgaGFzIGJlZW4gYXBwcm92ZWQgYW5kIGlzIHBhc3NpbmcgaW50ZXJuYWwgQ0ksCisgIGEgcmVwb3NpdG9yeSBtYWludGFpbmVyIHdpbGwgbWVyZ2UgdGhlIFBSLgorCisjIyMjIENvZGluZyBDb252ZW50aW9ucyBhbmQgRm9ybWF0dGluZworCisqIFVzZSB0aGUKKyAqKltHb29nbGUgc3R5bGUgZ3VpZGVdKGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL2NwcGd1aWRlLmh0bWwpKioKKyBmb3Igc291cmNlIGNvZGUgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisgICogVGhlIGNvbHVtbiBsaW1pdCBpcyAxMzIgKGFzIG9wcG9zZWQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgODApLgorICAgIFRoZSBjbGFuZy1mb3JtYXQgdG9vbCB3aWxsIGhhbmRsZSB0aGlzLiBTZWUgYmVsb3cuCisgICogVGhlIGluZGVudCBpcyA0IHNwYWNlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDIgc3BhY2VzLgorICAgIEFnYWluLCB0aGUgY2xhbmctZm9ybWF0IHRvb2wgd2lsbCBoYW5kbGUgdGhpcy4KKyAgKiBJZiB5b3UgY2FuIGp1c3RpZnkgYSByZWFzb24gZm9yIHZpb2xhdGluZyBhIHJ1bGUgaW4gdGhlIGd1aWRlbGluZXMsCisgICAgdGhlbiB5b3UgYXJlIGZyZWUgdG8gZG8gc28uIEJlIHByZXBhcmVkIHRvIGRlZmVuZCB5b3VyCisgICAgZGVjaXNpb24gZHVyaW5nIGNvZGUgcmV2aWV3LiBUaGlzIHNob3VsZCBiZSB1c2VkIHJlc3BvbnNpYmx5LgorICAgIEFuIGV4YW1wbGUgb2YgYSBiYWQgcmVhc29uIGlzICJJIGRvbid0IGxpa2UgdGhhdCBydWxlLiIKKyAgICBBbiBleGFtcGxlIG9mIGEgZ29vZCByZWFzb24gaXMgIlRoaXMgdmlvbGF0ZXMgdGhlIHN0eWxlIGd1aWRlLAorICAgIGJ1dCBpdCBpbXByb3ZlcyB0eXBlIHNhZmV0eS4iCisKKyogUnVuICoqY2xhbmctZm9ybWF0Kiogb24geW91ciBjaGFuZ2VzIHRvIG1haW50YWluIGNvbnNpc3RlbnQgZm9ybWF0dGluZworICAqIFRoZXJlIGFyZSBgLmNsYW5nLWZvcm1hdGAgZmlsZXMgcHJlc2VudCBpbiB0aGUgcmVwb3NpdG9yeSB0byBkZWZpbmUKKyAgICBjbGFuZy1mb3JtYXQgc2V0dGluZ3Mgd2hpY2ggYXJlIGZvdW5kIGFuZCB1c2VkIGF1dG9tYXRpY2FsbHkgYnkgY2xhbmctZm9ybWF0LgorICAqICoqY2xhbmctZm9ybWF0KiogYmluYXJpZXMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBMTFZNIG9yZ2luaXphdGlvbiwgaGVyZToKKyAgICBbTExWTV0oaHR0cHM6Ly9jbGFuZy5sbHZtLm9yZy8pLgorICAgIE91ciBDSSBzeXN0ZW0gKFRyYXZpcy1DSSkgY3VycmVudGx5IHVzZXMgY2xhbmctZm9ybWF0IHZlcnNpb24gNS4wLjAgdG8KKyAgICBjaGVjayB0aGF0IHRoZSBsaW5lcyBvZiBjb2RlIHlvdSBoYXZlIGNoYW5nZWQgYXJlIGZvcm1hdHRlZCBwcm9wZXJseS4KKyAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgdGhlIHNhbWUgdmVyc2lvbiB0byBmb3JtYXQgeW91ciBjb2RlIHByaW9yCisgICAgdG8gc3VibWlzc2lvbi4KKyAgKiBBIHNhbXBsZSBnaXQgd29ya2Zsb3cgbWF5IGxvb2sgbGlrZToKKworPiAgICAgICAgIyBNYWtlIGNoYW5nZXMgdG8gdGhlIHNvdXJjZS4KKz4gICAgICAgICQgZ2l0IGFkZCAtdSAuCis+ICAgICAgICAkIGdpdCBjbGFuZy1mb3JtYXQgLS1zdHlsZT1maWxlCis+ICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiBjbGFuZy1mb3JtYXQgbWFkZSBhbnkgY2hhbmdlcyBhbmQgaWYgdGhleSBhcmUgT0suCis+ICAgICAgICAkIGdpdCBhZGQgLXUgLgorPiAgICAgICAgJCBnaXQgY29tbWl0CisKKyogKipDb21taXQgTWVzc2FnZXMqKgorICAqIExpbWl0IHRoZSBzdWJqZWN0IGxpbmUgdG8gNTAgY2hhcmFjdGVycyAtLQorICAgIHRoaXMgYWxsb3dzIHRoZSBpbmZvcm1hdGlvbiB0byBkaXNwbGF5IGNvcnJlY3RseSBpbiBnaXQvR2l0aHViIGxvZ3MKKyAgKiBCZWdpbiBzdWJqZWN0IGxpbmUgd2l0aCBhIG9uZS13b3JkIGNvbXBvbmVudCBkZXNjcmlwdGlvbiBmb2xsb3dlZAorICAgIGJ5IGEgY29sb24gKGUuZy4gbG9hZGVyLCBsYXllcnMsIHRlc3RzLCBldGMuKQorICAqIFNlcGFyYXRlIHN1YmplY3QgZnJvbSBib2R5IHdpdGggYSBibGFuayBsaW5lCisgICogV3JhcCB0aGUgYm9keSBhdCA3MiBjaGFyYWN0ZXJzCisgICogQ2FwaXRhbGl6ZSB0aGUgc3ViamVjdCBsaW5lCisgICogRG8gbm90IGVuZCB0aGUgc3ViamVjdCBsaW5lIHdpdGggYSBwZXJpb2QKKyAgKiBVc2UgdGhlIGJvZHkgdG8gZXhwbGFpbiB3aGF0IGFuZCB3aHkgdnMuIGhvdworICAqIFVzZSB0aGUgaW1wZXJhdGl2ZSBtb2RlIGluIHRoZSBzdWJqZWN0IGxpbmUuCisgICAgVGhpcyBqdXN0IG1lYW5zIHRvIHdyaXRlIGl0IGFzIGEgY29tbWFuZCAoZS5nLiBGaXggdGhlIHNwcm9ja2V0KQorCitTdHJpdmUgZm9yIGNvbW1pdHMgdGhhdCBpbXBsZW1lbnQgYSBzaW5nbGUgb3IgcmVsYXRlZCBzZXQgb2YgZnVuY3Rpb25hbGl0eSwKK3VzaW5nIGFzIG1hbnkgY29tbWl0cyBhcyBpcyBuZWNlc3NhcnkgKG1vcmUgaXMgYmV0dGVyKS4KKworUGxlYXNlIGVuc3VyZSB0aGF0IHRoZSByZXBvc2l0b3J5IGNvbXBpbGVzIGFuZCBwYXNzZXMgdGVzdHMgd2l0aG91dAorZXJyb3IgZm9yIGVhY2ggY29tbWl0IGluIHlvdXIgcHVsbCByZXF1ZXN0LgorTm90ZSB0aGF0IHRvIGJlIGFjY2VwdGVkIGludG8gdGhlIHJlcG9zaXRvcnksIHRoZSBwdWxsIHJlcXVlc3QgbXVzdAorcGFzcyBhbGwgdGVzdHMgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCitUaGUgYXV0b21hdGljIEdpdGh1YiBUcmF2aXMgYW5kIEFwcFZleW9yIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gZmVhdHVyZXMKK3dpbGwgYXNzaXN0IGluIGVuZm9yY2luZyB0aGlzIHJlcXVpcmVtZW50LioKKworIyMjIyBHZW5lcmF0ZWQgU291cmNlIENvZGUKKworVGhlIGBsb2FkZXIvZ2VuZXJhdGVkYCBkaXJlY3RvcnkgY29udGFpbnMgc291cmNlIGNvZGUgdGhhdCBpcyBjcmVhdGVkIGJ5IHNldmVyYWwKK2dlbmVyYXRvciBzY3JpcHRzIGluIHRoZSBgc2NyaXB0c2AgZGlyZWN0b3J5LiBBbGwgY2hhbmdlcyB0byB0aGVzZSBzY3JpcHRzIF9tdXN0XyBiZSBzdWJtaXR0ZWQgd2l0aCB0aGUKK2NvcnJlc3BvbmRpbmcgZ2VuZXJhdGVkIG91dHB1dCB0byBrZWVwIHRoZSByZXBvc2l0b3J5IHNlbGYtY29uc2lzdGVudC4gVGhpcyByZXF1aXJlbWVudCBpcyBlbmZvcmNlZCBieSBib3RoCitUcmF2aXMgQ0kgYW5kIEFwcFZleW9yIHRlc3QgY29uZmlndXJhdGlvbnMuIFJlZ2VuZXJhdGUgc291cmNlIGZpbGVzIGFmdGVyIG1vZGlmeWluZyBhbnkgb2YgdGhlIGdlbmVyYXRvcgorc2NyaXB0cyBhbmQgYmVmb3JlIGJ1aWxkaW5nIGFuZCB0ZXN0aW5nIHlvdXIgY2hhbmdlcy4gTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbgorW0JVSUxELm1kXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Mb2FkZXIvYmxvYi9tYXN0ZXIvQlVJTEQubWQjZ2VuZXJhdGVkLXNvdXJjZS1jb2RlKS4KKworIyMjIyBUZXN0aW5nIFlvdXIgQ2hhbmdlcworCisqIFJ1biB0aGUgZXhpc3RpbmcgdGVzdHMgaW4gdGhlIGB0ZXN0c2AgZGlyZWN0b3J5IG9mIHRoZSByZXBvc2l0b3J5CisgIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBvZiB5b3VyIGNvbW1pdHMgdG8gY2hlY2sgZm9yIGFueSByZWdyZXNzaW9ucy4KKyAgKiBMaW51eDogYHJ1bl9hbGxfdGVzdHMuc2hgCisgICogV2luZG93czogYHJ1bl9hbGxfdGVzdHMucHMxYAorCisqIFJ1biB0ZXN0cyB0aGF0IGV4cGxpY2l0bHkgZXhlcmNpc2UgeW91ciBjaGFuZ2VzLgorKiBGZWVsIGZyZWUgdG8gc3ViamVjdCB5b3VyIGNvZGUgY2hhbmdlcyB0byBvdGhlciB0ZXN0cyBhcyB3ZWxsIQorCisjIyMjIENvZGluZyBDb252ZW50aW9ucyBmb3IgW0NNYWtlXShodHRwOi8vY21ha2Uub3JnKSBmaWxlcworCisqIFdoZW4gZWRpdGluZyBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBDTWFrZSwgZm9sbG93IHRoZSBzdHlsZSBjb252ZW50aW9ucyBvZiB0aGUgc3Vycm91bmRpbmcgY29kZS4KKyAgKiBUaGUgY29sdW1uIGxpbWl0IGlzIDEzMi4KKyAgKiBUaGUgaW5kZW50IGlzIDQgc3BhY2VzLgorICAqIENNYWtlIGZ1bmN0aW9ucyBhcmUgbG93ZXItY2FzZS4KKyAgKiBWYXJpYWJsZSBhbmQga2V5d29yZCBuYW1lcyBhcmUgdXBwZXItY2FzZS4KKyogVGhlIGZvcm1hdCBpcyBkZWZpbmVkIGJ5CisgIFtjbWFrZS1mb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaGVzaGlyZWtvdy9jbWFrZV9mb3JtYXQpCisgIHVzaW5nIHRoZSBgLmNtYWtlLWZvcm1hdC5weWAgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSB0byBkZWZpbmUgdGhlIHNldHRpbmdzLgorICBTZWUgdGhlIGNtYWtlLWZvcm1hdCBwYWdlIGZvciBpbmZvcm1hdGlvbiBhYm91dCBpdHMgc2ltcGxlIG1hcmt1cCBmb3IgY29tbWVudHMuCisqIERpc2FibGUgcmVmb3JtYXR0aW5nIG9mIGEgYmxvY2sgb2YgY29tbWVudCBsaW5lcyBieSBpbnNlcnRpbmcKKyAgYSBgIyB+fn5gIGNvbW1lbnQgbGluZSBiZWZvcmUgYW5kIGFmdGVyIHRoYXQgYmxvY2suCisqIERpc2FibGUgYW55IGZvcm1hdHRpbmcgb2YgYSBibG9jayBvZiBsaW5lcyBieSBzdXJyb3VuZGluZyB0aGF0IGJsb2NrIHdpdGgKKyAgYCMgY21ha2UtZm9ybWF0OiBvZmZgIGFuZCBgIyBjbWFrZS1mb3JtYXQ6IG9uYCBjb21tZW50IGxpbmVzLgorKiBUbyBpbnN0YWxsOiBgc3VkbyBwaXAgaW5zdGFsbCBjbWFrZV9mb3JtYXRgCisqIFRvIHJ1bjogYGNtYWtlLWZvcm1hdCAtLWluLXBsYWNlICRGSUxFTkFNRWAKKyogKipJTVBPUlRBTlQgKEp1bmUgMjAxOCkqKiBjbWFrZS1mb3JtYXQgdjAuMy42IGhhcyBhCisgIFtidWddKCBodHRwczovL2dpdGh1Yi5jb20vY2hlc2hpcmVrb3cvY21ha2VfZm9ybWF0L2lzc3Vlcy81MCkKKyAgdGhhdCBjYW4gY29ycnVwdCB0aGUgZm9ybWF0dGluZyBvZiBjb21tZW50IGxpbmVzIGluIENNYWtlIGZpbGVzLgorICBBIHdvcmthcm91bmQgaXMgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBfYmVmb3JlXyBydW5uaW5nIGNtYWtlLWZvcm1hdDoKKyAgYHNlZCAtLWluLXBsYWNlPScnICdzL14gICojLyMvJyAkRklMRU5BTUVgCisKKyMjIyBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKQorCitZb3Ugd2lsbCBiZSBwcm9tcHRlZCB3aXRoIGEgb25lLXRpbWUgImNsaWNrLXRocm91Z2giIENMQSBkaWFsb2cgYXMgcGFydCBvZgorc3VibWl0dGluZyB5b3VyIHB1bGwgcmVxdWVzdCBvciBvdGhlciBjb250cmlidXRpb24gdG8gR2l0SHViLgorCisjIyMgTGljZW5zZSBhbmQgQ29weXJpZ2h0cworCitBbGwgY29udHJpYnV0aW9ucyBtYWRlIHRvIHRoZSBWdWxrYW4tTG9hZGVyIHJlcG9zaXRvcnkgYXJlIEtocm9ub3MgYnJhbmRlZAorYW5kIGFzIHN1Y2gsIGFueSBuZXcgZmlsZXMgbmVlZCB0byBoYXZlIHRoZSBLaHJvbm9zIGxpY2Vuc2UKKyhBcGFjaGUgMi4wIHN0eWxlKSBhbmQgY29weXJpZ2h0IGluY2x1ZGVkLgorUGxlYXNlIHNlZSBhbiBleGlzdGluZyBmaWxlIGluIHRoaXMgcmVwb3NpdG9yeSBmb3IgYW4gZXhhbXBsZS4KKworQWxsIGNvbnRyaWJ1dGlvbnMgbWFkZSB0byB0aGUgTHVuYXJHIHJlcG9zaXRvcmllcyBhcmUgdG8gYmUgbWFkZSB1bmRlcgordGhlIEFwYWNoZSAyLjAgbGljZW5zZSBhbmQgYW55IG5ldyBmaWxlcyBuZWVkIHRvIGluY2x1ZGUgdGhpcyBsaWNlbnNlCithbmQgYW55IGFwcGxpY2FibGUgY29weXJpZ2h0cy4KKworWW91IGNhbiBpbmNsdWRlIHlvdXIgaW5kaXZpZHVhbCBjb3B5cmlnaHQgYWZ0ZXIgYW55IGV4aXN0aW5nIGNvcHlyaWdodHMuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvR09WRVJOQU5DRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9HT1ZFUk5BTkNFLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NmJmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvR09WRVJOQU5DRS5tZApAQCAtMCwwICsxLDQ4IEBACisjIFZ1bGthbiBMb2FkZXIgUmVwb3NpdG9yeSBNYW5hZ2VtZW50CisKKyMjICoqT3BlbiBTb3VyY2UgUHJvamVjdCBPYmplY3RpdmVzKioKKworLSBBbGlnbm1lbnQgd2l0aCB0aGUgVnVsa2FuIFNwZWNpZmljYXRpb24gYW5kIHRoZSBMb2FkZXIgU3BlY2lmaWNhdGlvbgorICAtIFtWdWxrYW4gU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tRG9jcykKKyAgLSBbTG9hZGVyIFNwZWNpZmljYXRpb25dKGxvYWRlci9Mb2FkZXJBbmRMYXllckludGVyZmFjZS5tZCkKKy0gSUhWL0lTViBFbmFibGVtZW50CisgIC0gVXBkYXRlcyBvZiBsb2FkZXIgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgYXZhaWxhYmxlIGluIGEgdGltZWx5IGZhc2hpb24KKyAgLSBFdmVyeSBlZmZvcnQgd2lsbCBiZSBtYWRlIHRvIGJlIHJlc3BvbnNpdmUgdG8gSUhWL0lTViBpc3N1ZXMgd2l0aCB0aGUgbG9hZGVyCistIENyb3NzIFBsYXRmb3JtIENvbXBhdGliaWxpdHkKKyAgLSBMdW5hckc6IE1vbml0b3IgZm9yIGRlc2t0b3AgKFdpbmRvd3MgYW5kIExpbnV4KQorICAtIENvbnRpbnVvdXMgSW50ZWdyYXRpb246IEhXIHRlc3QgZmFybXMgb3BlcmF0ZWQgYnkgTHVuYXJHIG1vbml0b3IgdmFyaW91cyBoYXJkd2FyZS9zb2Z0d2FyZSBwbGF0Zm9ybXMKKy0gUmVwbyBRdWFsaXR5CisgIC0gUmVwbyByZW1haW5zIGluIGhlYWx0aHkgc3RhdGUgd2l0aCBhbGwgdGVzdHMgcGFzc2luZyBhbmQgZ29vZC1xdWFsaXR5LCBjb25zaXN0ZW50IGNvZGViYXNlCisgIC0gQ29udGludW91cyBJbnRlZ3JhdGlvbjogQWxvbmcgd2l0aCBHaXRodWIsIEhXIHRlc3QgZmFybXMgb3BlcmF0ZWQgYnkgTHVuYXJHIHBlcmZvcm0gcHJlLWNvbW1pdCBjbG91ZCB0ZXN0aW5nIG9uIHB1bGwtcmVxdWVzdHMKKworIyMgKipSb2xlcyBhbmQgRGVmaW5pdGlvbnMqKgorCistIENvbnRyaWJ1dG9yLCBDb21tZW50ZXIsIFVzZXIKKyAgLSBTdWJtaXR0aW5nIGNvbnRyaWJ1dGlvbnMsIGNyZWF0aW5nIGlzc3Vlcywgb3IgdXNpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXBvc2l0b3J5CistIEFwcHJvdmVyCisgIC0gRXhwZXJpZW5jZWQgcHJvamVjdCBtZW1iZXJzIHdobyBoYXZlIG1hZGUgc2lnbmlmaWNhbnQgdGVjaG5pY2FsIGNvbnRyaWJ1dGlvbnMKKyAgLSBXcml0ZSBjb250cm9sOiBBcHByb3ZlIHB1bGwvbWVyZ2UgcmVxdWVzdHMgKHZlcmlmeSBzdWJtaXNzaW9ucyB2cy4gYWNjZXB0YW5jZSBjcml0ZXJpYSkKKy0gVGVjaG5pY2FsIFByb2plY3QgTGVhZHMKKyAgLSBMZWFkIHRoZSBwcm9qZWN0IGluIHRlcm1zIG9mIHZlcnNpb25pbmcsIHF1YWxpdHkgYXNzdXJhbmNlLCBhbmQgb3ZlcmFyY2hpbmcgb2JqZWN0aXZlcworICAtIE1vbml0b3IgZ2l0aHViIGlzc3VlcyBhbmQgZHJpdmUgdGltZWx5IHJlc29sdXRpb24KKyAgLSBEZXNpZ25hdGUgbmV3IGFwcHJvdmVycworICAtIEVuc3VyZSBwcm9qZWN0IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIFJlYWRtZSwgQ29udHJpYnV0aW5nIGRvY3MsIHdpa2ksIGV0Yy4sIGtlcHQgdXAtdG8tZGF0ZQorICAtIEFjdCBhcyBhIGZhY2lsaXRhdG9yIGluIHJlc29sdmluZyB0ZWNobmljYWwgY29uZmxpY3RzCisgIC0gSXMgYSBwb2ludC1vZi1jb250YWN0IGZvciBwcm9qZWN0LXJlbGF0ZWQgcXVlc3Rpb25zCisKK1RoZSB0ZWNobmljYWwgcHJvamVjdCBsZWFkcyBmb3IgdGhpcyByZXBvc2l0b3J5IGFyZToKKworLSAqKkxlbm55IEtvbW93KiogW2xlbm55QGx1bmFyZy5jb21dKG1haWx0bzpsZW5ueUBsdW5hcmcuY29tKQorCisjIyAqKkFjY2VwdGFuY2UgQ3JpdGVyaWEgYW5kIFByb2Nlc3MqKgorCistIEFsbCBzb3VyY2UgY29kZSB0byBpbmNsdWRlIEtocm9ub3MgY29weXJpZ2h0IGFuZCBsaWNlbnNlIChBcGFjaGUgMi4wKS4KKyAgLSBBZGRpdGlvbmFsIGNvcHlyaWdodHMgb2YgY29udHJpYnV0b3JzIGFwcGVuZGVkCistIENvbnRyaWJ1dGlvbnMgYXJlIHZpYSBwdWxsIHJlcXVlc3RzCisgIC0gUHJvamVjdCBsZWFkcyB3aWxsIGFzc2lnbmluZyBhcHByb3ZlcnMgdG8gY29udHJpYnV0b3IgcHVsbCByZXF1ZXN0cworICAtIEFwcHJvdmVycyBjYW4gc2VsZi1hc3NpZ24gdGhlaXIgcmV2aWV3ZXJzCisgIC0gRm9yIGNvbXBsZXggb3IgaW52YXNpdmUgY29udHJpYnV0aW9ucywgUHJvamVjdCBMZWFkcyBtYXkgcmVxdWVzdCBhcHByb3ZhbCBmcm9tIHNwZWNpZmljIHJldmlld2VycworICAtIEF0IGxlYXN0IG9uZSByZXZpZXcgYXBwcm92YWwgaXMgcmVxdWlyZWQgdG8gY29tcGxldGUgYSBwdWxsIHJlcXVlc3QKKyAgLSBUaGUgZ29hbCBpcyB0byBiZSByZXNwb25zaXZlIHRvIGNvbnRyaWJ1dG9ycyB3aGlsZSBlbnN1cmluZyBhY2NlcHRhbmNlIGNyaXRlcmlhIGlzIG1ldCBhbmQgdG8gZmFjaWxpdGF0ZSB0aGVpciBzdWJtaXNzaW9ucworICAtIEFwcHJvdmFsIGlzIGRlcGVuZGVudCB1cG9uIGFkaGVyZW5jZSB0byB0aGUgZ3VpZGVsaW5lcyBpbiBbQ09OVFJJQlVUSU5HLm1kXShDT05UUklCVVRJTkcubWQpLCBhbmQgYWxpZ25tZW50IHdpdGggcmVwb3NpdG9yeSBnb2FscyBvZiBtYWludGFpbmFiaWxpdHksIGNvbXBsZXRlbmVzcywgYW5kIHF1YWxpdHkKKyAgLSBDb25mbGljdHMgb3IgcXVlc3Rpb25zIHdpbGwgdWx0aW1hdGVseSBiZSByZXNvbHZlZCBieSB0aGUgcHJvamVjdCBsZWFkcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL0xJQ0VOU0UudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTllMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvTElDRU5TRS50eHQKQEAgLTAsMCArMSwyMDcgQEAKK1RoZSBtYWpvcml0eSBvZiBmaWxlcyBpbiB0aGlzIHByb2plY3QgdXNlIHRoZSBBcGFjaGUgMi4wIExpY2Vuc2UuCitUaGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9ucyBhbmQgdGhlaXIgbGljZW5zZSBjYW4gYmUgZm91bmQgaW4gdGhlIHNvdXJjZS4KK0FueSBsaWNlbnNlIGRldmlhdGlvbnMgZnJvbSBBcGFjaGUgMi4wIGFyZSAibW9yZSBwZXJtaXNzaXZlIiBsaWNlbnNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzFkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjcgQEAKKyMgVnVsa2FuIEVjb3N5c3RlbSBDb21wb25lbnRzCisKK1RoaXMgcHJvamVjdCBwcm92aWRlcyB0aGUgS2hyb25vcyBvZmZpY2lhbCBWdWxrYW4gSUNEIGRlc2t0b3AgbG9hZGVyIGZvciBXaW5kb3dzLCBMaW51eCwgYW5kIE1hY09TLgorCisjIyBDSSBCdWlsZCBTdGF0dXMKKworfCBQbGF0Zm9ybSB8IEJ1aWxkIFN0YXR1cyB8Cit8Oi0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnwKK3wgTGludXgvTWFjT1MgfCBbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9LaHJvbm9zR3JvdXAvVnVsa2FuLUxvYWRlci5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9LaHJvbm9zR3JvdXAvVnVsa2FuLUxvYWRlcikgfAorfCBXaW5kb3dzIHxbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvbDkzcHUwdzkwdHVpNzA4bT9zdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvS2hyb25vc3dlYm1hc3Rlci92dWxrYW4tbG9hZGVyL2JyYW5jaC9tYXN0ZXIpIHwKKworIyMgSW50cm9kdWN0aW9uCisKK1Z1bGthbiBpcyBhbiBleHBsaWNpdCBBUEksIGVuYWJsaW5nIGRpcmVjdCBjb250cm9sIG92ZXIgaG93IEdQVXMgYWN0dWFsbHkgd29yay4KK0FzIHN1Y2gsIFZ1bGthbiBzdXBwb3J0cyBzeXN0ZW1zIHRoYXQgaGF2ZSBtdWx0aXBsZSBHUFVzLCBlYWNoIHJ1bm5pbmcgd2l0aCBhIGRpZmZlcmVudCBkcml2ZXIsIG9yIElDRCAoSW5zdGFsbGFibGUgQ2xpZW50IERyaXZlcikuCitWdWxrYW4gYWxzbyBzdXBwb3J0cyBtdWx0aXBsZSBnbG9iYWwgY29udGV4dHMgKGluc3RhbmNlcywgaW4gVnVsa2FuIHRlcm1pbm9sb2d5KS4KK1RoZSBJQ0QgbG9hZGVyIGlzIGEgbGlicmFyeSB0aGF0IGlzIHBsYWNlZCBiZXR3ZWVuIGEgVnVsa2FuIGFwcGxpY2F0aW9uIGFuZCBhbnkgbnVtYmVyIG9mIFZ1bGthbiBkcml2ZXJzLCBpbiBvcmRlciB0byBzdXBwb3J0IG11bHRpcGxlIGRyaXZlcnMgYW5kIHRoZSBpbnN0YW5jZS1sZXZlbCBmdW5jdGlvbmFsaXR5IHRoYXQgd29ya3MgYWNyb3NzIHRoZXNlIGRyaXZlcnMuCitBZGRpdGlvbmFsbHksIHRoZSBsb2FkZXIgbWFuYWdlcyBpbnNlcnRpbmcgVnVsa2FuIGxheWVyIGxpYnJhcmllcywgc3VjaCBhcyB2YWxpZGF0aW9uIGxheWVycywgYmV0d2VlbiBhbiBhcHBsaWNhdGlvbiBhbmQgdGhlIGRyaXZlcnMuCisKK1RoaXMgcmVwb3NpdG9yeSBjb250YWlucyB0aGUgVnVsa2FuIGxvYWRlciB0aGF0IGlzIHVzZWQgZm9yIExpbnV4LCBXaW5kb3dzLCBNYWNPUywgYW5kIGlPUy4KK1RoZXJlIGlzIGFsc28gYSBzZXBhcmF0ZSBsb2FkZXIsIG1haW50YWluZWQgYnkgR29vZ2xlLCB3aGljaCBpcyB1c2VkIG9uIEFuZHJvaWQuCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeToKKworLSBbVnVsa2FuIGhlYWRlciBmaWxlcyAoVnVsa2FuLUhlYWRlcnMgc3VibW9kdWxlKV0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tSGVhZGVycykKKy0gW0lDRCBMb2FkZXJdKGxvYWRlci8pCistIFtMb2FkZXIgRG9jdW1lbnRhdGlvbl0obG9hZGVyL0xvYWRlckFuZExheWVySW50ZXJmYWNlLm1kKQorLSBbVGVzdHNdKHRlc3RzLykKKworIyMgQ29udGFjdCBJbmZvcm1hdGlvbgorCistIFtMZW5ueSBLb21vd10obWFpbHRvOmxlbm55QGx1bmFyZy5jb20pCisKKyMjIEluZm9ybWF0aW9uIGZvciBEZXZlbG9waW5nIG9yIENvbnRyaWJ1dGluZworCitQbGVhc2Ugc2VlIHRoZSBbQ09OVFJJQlVUSU5HLm1kXShDT05UUklCVVRJTkcubWQpIGZpbGUgaW4gdGhpcyByZXBvc2l0b3J5IGZvciBtb3JlIGRldGFpbHMuCitQbGVhc2Ugc2VlIHRoZSBbR09WRVJOQU5DRS5tZF0oR09WRVJOQU5DRS5tZCkgZmlsZSBpbiB0aGlzIHJlcG9zaXRvcnkgZm9yIHJlcG9zaXRvcnkKK21hbmFnZW1lbnQgZGV0YWlscy4KKworIyMgSG93IHRvIEJ1aWxkIGFuZCBSdW4KKworW0JVSUxELm1kXShCVUlMRC5tZCkKK0luY2x1ZGVzIGRpcmVjdGlvbnMgZm9yIGJ1aWxkaW5nIGFsbCBjb21wb25lbnRzLgorCitBcmNoaXRlY3R1cmUgYW5kIGludGVyZmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGxvYWRlciBpcyBpbgorW2xvYWRlci9Mb2FkZXJBbmRMYXllckludGVyZmFjZS5tZF0obG9hZGVyL0xvYWRlckFuZExheWVySW50ZXJmYWNlLm1kKS4KKworIyMgVmVyc2lvbiBUYWdnaW5nIFNjaGVtZQorCitVcGRhdGVzIHRvIHRoZSBgVnVsa2FuLUxvYWRlcmAgcmVwb3NpdG9yeSB3aGljaCBjb3JyZXNwb25kIHRvIGEgbmV3IFZ1bGthbiBzcGVjaWZpY2F0aW9uIHJlbGVhc2UgYXJlIHRhZ2dlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdDogYHY8YF9gdmVyc2lvbmBfYD5gIChlLmcuLCBgdjEuMS45NmApLgorCisqKk5vdGUqKjogTWFya2VkIHZlcnNpb24gcmVsZWFzZXMgaGF2ZSB1bmRlcmdvbmUgdGhvcm91Z2ggdGVzdGluZyBidXQgZG8gbm90IGltcGx5IHRoZSBzYW1lIHF1YWxpdHkgbGV2ZWwgYXMgU0RLIHRhZ3MuIFNESyB0YWdzIGZvbGxvdyB0aGUgYHNkay08YF9gdmVyc2lvbmBfYD4uPGBfYHBhdGNoYF9gPmAgZm9ybWF0IChlLmcuLCBgc2RrLTEuMS45Mi4wYCkuCisKK1RoaXMgc2NoZW1lIHdhcyBhZG9wdGVkIGZvbGxvd2luZyB0aGUgMS4xLjk2IFZ1bGthbiBzcGVjaWZpY2F0aW9uIHJlbGVhc2UuCisKKyMjIExpY2Vuc2UKKworVGhpcyB3b3JrIGlzIHJlbGVhc2VkIGFzIG9wZW4gc291cmNlIHVuZGVyIGEgQXBhY2hlLXN0eWxlIGxpY2Vuc2UgZnJvbSBLaHJvbm9zCitpbmNsdWRpbmcgYSBLaHJvbm9zIGNvcHlyaWdodC4KKworU2VlIENPUFlSSUdIVC50eHQgZm9yIGEgZnVsbCBsaXN0IG9mIGxpY2Vuc2VzIHVzZWQgaW4gdGhpcyByZXBvc2l0b3J5LgorCisjIyBBY2tub3dsZWRnZW1lbnRzCisKK1doaWxlIHRoaXMgcHJvamVjdCBoYXMgYmVlbiBkZXZlbG9wZWQgcHJpbWFyaWx5IGJ5IEx1bmFyRywgSW5jLiwgdGhlcmUgYXJlIG1hbnkgb3RoZXIKK2NvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgbWFraW5nIHRoaXMgcG9zc2libGU6IFZhbHZlIENvcnBvcmF0aW9uLCBmdW5kaW5nCitwcm9qZWN0IGRldmVsb3BtZW50OyBLaHJvbm9zIHByb3ZpZGluZyBvdmVyc2lnaHQgYW5kIGhvc3Rpbmcgb2YgdGhlIHByb2plY3QuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvYnVpbGQtZ24vc2Vjb25kYXJ5L2J1aWxkX292ZXJyaWRlcy9idWlsZC5nbmkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvYnVpbGQtZ24vc2Vjb25kYXJ5L2J1aWxkX292ZXJyaWRlcy9idWlsZC5nbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMTFmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL2J1aWxkLmduaQpAQCAtMCwwICsxLDE4IEBACisjIENvcHlyaWdodCAoYykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2J1aWxkX3dpdGhfY2hyb21pdW0gPSBmYWxzZQoraWdub3JlX2VsZjMyX2xpbWl0YXRpb25zID0gdHJ1ZQorbGludXhfdXNlX2J1bmRsZWRfYmludXRpbHNfb3ZlcnJpZGUgPSBmYWxzZQordXNlX3N5c3RlbV94Y29kZSA9IHRydWUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL3Z1bGthbl9sb2FkZXIuZ25pIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2J1aWxkLWduL3NlY29uZGFyeS9idWlsZF9vdmVycmlkZXMvdnVsa2FuX2xvYWRlci5nbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyNmZjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL3Z1bGthbl9sb2FkZXIuZ25pCkBAIC0wLDAgKzEsMjMgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBQYXRocyB0byBsb2FkZXIgZGVwZW5kZW5jaWVzCit2dWxrYW5faGVhZGVyc19kaXIgPSAiLy9leHRlcm5hbC9WdWxrYW4tSGVhZGVycyIKKworIyBTdWJkaXJlY3RvcmllcyBmb3IgZ2VuZXJhdGVkIGZpbGVzCit2dWxrYW5fZ2VuX3N1YmRpciA9ICIiIAorCisjIFZ1bGthbiBsb2FkZXIgYnVpbGQgb3B0aW9ucwordnVsa2FuX2xvYWRlcl9zaGFyZWQgPSB0cnVlCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9idWlsZC1nbi91cGRhdGVfZGVwcy5zaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9idWlsZC1nbi91cGRhdGVfZGVwcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNmExOTRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2J1aWxkLWduL3VwZGF0ZV9kZXBzLnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoYykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgRXhlY3V0ZSBhdCByZXBvIHJvb3QKK2NkICIkKGRpcm5hbWUgJDApLy4uIgorCisjIFVzZSB1cGRhdGVfZGVwcy5weSB0byB1cGRhdGUgc291cmNlIGRlcGVuZGVuY2llcyBmcm9tIC9zY3JpcHRzL2tub3duX2dvb2QuanNvbgorc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLWRpcj0iZXh0ZXJuYWwiIC0tbm8tYnVpbGQKKworIyBVc2UgZ2NsaWVudCB0byB1cGRhdGUgdG9vbGNoYWluIGRlcGVuZGVuY2llcyBmcm9tIC9idWlsZC1nbi9ERVBTIChmcm9tIGNocm9taXVtKQorY2F0IDw8IEVPRiA+PiAuZ2NsaWVudAorc29sdXRpb25zID0gWworICB7ICJuYW1lIiAgICAgICAgOiAiLiIsCisgICAgInVybCIgICAgICAgICA6ICJodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Mb2FkZXIiLAorICAgICJkZXBzX2ZpbGUiICAgOiAiYnVpbGQtZ24vREVQUyIsCisgICAgIm1hbmFnZWQiICAgICA6IEZhbHNlLAorICAgICJjdXN0b21fZGVwcyIgOiB7CisgICAgfSwKKyAgICAiY3VzdG9tX3ZhcnMiOiB7fSwKKyAgfSwKK10KK0VPRgorZ2NsaWVudCBzeW5jCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9Db3B5cmlnaHRfY21ha2UudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2NtYWtlL0NvcHlyaWdodF9jbWFrZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzYzYzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9Db3B5cmlnaHRfY21ha2UudHh0CkBAIC0wLDAgKzEsMTI2IEBACitDTWFrZSAtIENyb3NzIFBsYXRmb3JtIE1ha2VmaWxlIEdlbmVyYXRvcgorQ29weXJpZ2h0IDIwMDAtMjAxOCBLaXR3YXJlLCBJbmMuIGFuZCBDb250cmlidXRvcnMKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyogTmVpdGhlciB0aGUgbmFtZSBvZiBLaXR3YXJlLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgQ29udHJpYnV0b3JzCisgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK0hPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFuZCBpbnN0aXR1dGlvbnMgYXJlIGFtb25nIHRoZSBDb250cmlidXRvcnM6CisKKyogQWFyb24gQy4gTWVhZG93cyA8Y21ha2VAc2hhZG93Z3VhcmRkZXYuY29tPgorKiBBZHJpYWFuIGRlIEdyb290IDxncm9vdEBrZGUub3JnPgorKiBBbGVrc2V5IEF2ZGVldiA8c29sb0BhbHRsaW51eC5ydT4KKyogQWxleGFuZGVyIE5ldW5kb3JmIDxuZXVuZG9yZkBrZGUub3JnPgorKiBBbGV4YW5kZXIgU21vcmthbG92IDxhbGV4YW5kZXIuc21vcmthbG92QGl0c2Vlei5jb20+CisqIEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisqIEFsZXggVHVyYm92IDxpLnphdWZpQGdtYWlsLmNvbT4KKyogQW5kcmVhcyBQYWt1bGF0IDxhcGFrdUBnbXguZGU+CisqIEFuZHJlYXMgU2NobmVpZGVyIDxhc25AY3J5cHRvbWlsay5vcmc+CisqIEFuZHLDqSBSaWdsYW5kIEJyb2R0a29yYiA8QW5kcmUuQnJvZHRrb3JiQGlmaS51aW8ubm8+CisqIEF4ZWwgSHVlYmwsIEhlbG1ob2x0ei1aZW50cnVtIERyZXNkZW4gLSBSb3NzZW5kb3JmCisqIEJlbmphbWluIEVpa2VsCisqIEJqb2VybiBSaWNrcyA8YmpvZXJuLnJpY2tzQGdtYWlsLmNvbT4KKyogQnJhZCBIYXJkcyA8YnJhZGhAa2RlLm9yZz4KKyogQ2hyaXN0b3BoZXIgSGFydmV5CisqIENocmlzdG9waCBHcsO8bmluZ2VyIDxmb3NzQGdydWVuaW5nZXIuZGU+CisqIENsZW1lbnQgQ3JldXNvdCA8Y3JldXNvdEBjcy55b3JrLmFjLnVrPgorKiBEYW5pZWwgQmxlemVrIDxibGV6ZWtAZ21haWwuY29tPgorKiBEYW5pZWwgUGZlaWZlciA8ZGFuaWVsQHBmZWlmZXItbWFpbC5kZT4KKyogRW5yaWNvIFNjaG9seiA8ZW5yaWNvLnNjaG9sekBpbmZvcm1hdGlrLnR1LWNoZW1uaXR6LmRlPgorKiBFcmFuIElmcmFoIDxlcmFuLmlmcmFoQGdtYWlsLmNvbT4KKyogRXNiZW4gTW9zZSBIYW5zZW4sIEFuZ2UgT3B0aW1pemF0aW9uIEFwUworKiBHZW9mZnJleSBWaW9sYSA8Z2VvZmZyZXkudmlvbGFAYXNpcm9ib3RzLmNvbT4KKyogR29vZ2xlIEluYworKiBHcmVnb3IgSmFzbnkKKyogSGVsaW8gQ2hpc3NpbmkgZGUgQ2FzdHJvIDxoZWxpb0BrZGUub3JnPgorKiBJbHlhIExhdnJlbm92IDxpbHlhLmxhdnJlbm92QGl0c2Vlei5jb20+CisqIEluc2lnaHQgU29mdHdhcmUgQ29uc29ydGl1bSA8aW5zaWdodHNvZnR3YXJlY29uc29ydGl1bS5vcmc+CisqIEphbiBXb2V0emVsCisqIEtlbGx5IFRob21wc29uIDxrZ3RAbGFubC5nb3Y+CisqIEtvbnN0YW50aW4gUG9kc3Zpcm92IDxrb25zdGFudGluQHBvZHN2aXJvdi5wcm8+CisqIE1hcmlvIEJlbnNpIDxtYmVuc2lAaXBzcXVhZC5uZXQ+CisqIE1hdGhpZXUgTWFsYXRlcnJlIDxtYXRoaWV1Lm1hbGF0ZXJyZUBnbWFpbC5jb20+CisqIE1hdHRoYWV1cyBHLiBDaGFqZGFzCisqIE1hdHRoaWFzIEtyZXR6IDxrcmV0ekBrZGUub3JnPgorKiBNYXR0aGlhcyBNYWVubmljaCA8bWF0dGhpYXNAbWFlbm5pY2gubmV0PgorKiBNaWNoYWVsIFN0w7xybWVyCisqIE1pZ3VlbCBBLiBGaWd1ZXJvYS1WaWxsYW51ZXZhCisqIE1pa2UgSmFja3NvbgorKiBNaWtlIE1jUXVhaWQgPG1pa2VAbWlrZW1jcXVhaWQuY29tPgorKiBOaWNvbGFzIEJvY2sgPG5pY29sYXNib2NrQGdtYWlsLmNvbT4KKyogTmljb2xhcyBEZXNwcmVzIDxuaWNvbGFzLmRlc3ByZXNAZ21haWwuY29tPgorKiBOaWtpdGEgS3J1cGVuJ2tvIDxrcm5la2l0QGdtYWlsLmNvbT4KKyogTlZJRElBIENvcnBvcmF0aW9uIDx3d3cubnZpZGlhLmNvbT4KKyogT3BlbkdhbW1hIEx0ZC4gPG9wZW5nYW1tYS5jb20+CisqIFBhdHJpY2sgU3RvdGtvIDxzdG90a29AY3MudW5pLWJvbm4uZGU+CisqIFBlciDDmHl2aW5kIEthcmxzZW4gPHBlcm95dmluZEBtYW5kcml2YS5vcmc+CisqIFBldGVyIENvbGxpbmdib3VybmUgPHBldGVyQHBjYy5tZS51az4KKyogUGV0ciBHb3R0aGFyZCA8Z290dGhhcmRAaG9uZXl3ZWxsLmNvbT4KKyogUGhpbGlwIExvd21hbiA8cGhpbGlwQHloYnQuY29tPgorKiBQaGlsaXBwZSBQcm91bHggPHBwcm91bHhAZWZmaWNpb3MuY29tPgorKiBSYWZmaSBFbmZpY2lhdWQsIE1heCBQbGFuY2sgU29jaWV0eQorKiBSYXVtZmVsZCA8cmF1bWZlbGQuY29tPgorKiBSb2dlciBMZWlnaCA8cmxlaWdoQGNvZGVsaWJyZS5uZXQ+CisqIFJvbGYgRWlrZSBCZWVyIDxlaWtlQHNmLW1haWwuZGU+CisqIFJvbWFuIERvbmNoZW5rbyA8cm9tYW4uZG9uY2hlbmtvQGl0c2Vlei5jb20+CisqIFJvbWFuIEtoYXJpdG9ub3YgPHJvbWFuLmtoYXJpdG9ub3ZAaXRzZWV6LmNvbT4KKyogUnVzbGFuIEJhcmF0b3YKKyogU2ViYXN0aWFuIEhvbHRlcm1hbm4gPHNlYmhvbHRAeHdtdy5vcmc+CisqIFN0ZXBoZW4gS2VsbHkgPHN0ZXZlaXJlQGdtYWlsLmNvbT4KKyogU3lsdmFpbiBKb3ViZXJ0IDxqb3ViZXJ0LnN5QGdtYWlsLmNvbT4KKyogVGhvbWFzIFNvbmRlcmdhYXJkIDx0c0BtZWRpY2FsLWluc2lnaHQuY29tPgorKiBUb2JpYXMgSHVuZ2VyIDx0b2JpYXMuaHVuZ2VyQHF0LmlvPgorKiBUb2RkIEdhbWJsaW4gPHRnYW1ibGluQGxsbmwuZ292PgorKiBUcmlzdGFuIENhcmVsCisqIFVuaXZlcnNpdHkgb2YgRHVuZGVlCisqIFZhZGltIFpodWtvdgorKiBXaWxsIERpY2hhcnJ5IDx3ZGljaGFycnlAc3RlbGxhcnNjaWVuY2UuY29tPgorCitTZWUgdmVyc2lvbiBjb250cm9sIGhpc3RvcnkgZm9yIGRldGFpbHMgb2YgaW5kaXZpZHVhbCBjb250cmlidXRpb25zLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZSBhcHBsaWVzIHRvIGRpc3RyaWJ1dGlvbnMgb2YKK0NNYWtlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm0uICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSBwYWNrYWdlcyBzdXBwbGllZAord2l0aCBDTWFrZSB1bmRlciBjb21wYXRpYmxlIGxpY2Vuc2VzIHByb3ZpZGUgdGhlaXIgb3duIGNvcHlyaWdodCBub3RpY2VzCitkb2N1bWVudGVkIGluIGNvcnJlc3BvbmRpbmcgc3ViZGlyZWN0b3JpZXMgb3Igc291cmNlIGZpbGVzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ01ha2Ugd2FzIGluaXRpYWxseSBkZXZlbG9wZWQgYnkgS2l0d2FyZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3BvbnNvcnNoaXA6CisKKyAqIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgYXQgdGhlIE5hdGlvbmFsIEluc3RpdHV0ZXMgb2YgSGVhbHRoCisgICBhcyBwYXJ0IG9mIHRoZSBJbnNpZ2h0IFNlZ21lbnRhdGlvbiBhbmQgUmVnaXN0cmF0aW9uIFRvb2xraXQgKElUSykuCisKKyAqIFVTIE5hdGlvbmFsIExhYnMgKExvcyBBbGFtb3MsIExpdmVybW9yZSwgU2FuZGlhKSBBU0MgUGFyYWxsZWwKKyAgIFZpc3VhbGl6YXRpb24gSW5pdGlhdGl2ZS4KKworICogTmF0aW9uYWwgQWxsaWFuY2UgZm9yIE1lZGljYWwgSW1hZ2UgQ29tcHV0aW5nIChOQU1JQykgaXMgZnVuZGVkIGJ5IHRoZQorICAgTmF0aW9uYWwgSW5zdGl0dXRlcyBvZiBIZWFsdGggdGhyb3VnaCB0aGUgTklIIFJvYWRtYXAgZm9yIE1lZGljYWwgUmVzZWFyY2gsCisgICBHcmFudCBVNTQgRUIwMDUxNDkuCisKKyAqIEtpdHdhcmUsIEluYy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9GaW5kUENJQWNjZXNzLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2NtYWtlL0ZpbmRQQ0lBY2Nlc3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmN2Q1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9GaW5kUENJQWNjZXNzLmNtYWtlCkBAIC0wLDAgKzEsMjggQEAKKyMgLSBGaW5kUENJQWNjZXNzCisjCisjIENvcHlyaWdodCAyMDE1IFZhbHZlIENvcnBvcmF0aW9uCisKK2ZpbmRfcGFja2FnZShQa2dDb25maWcpCisKK3BrZ19jaGVja19tb2R1bGVzKFBDX1BDSUFDQ0VTUyBRVUlFVCBwY2lhY2Nlc3MpCisKK2ZpbmRfcGF0aChQQ0lBQ0NFU1NfSU5DTFVERV9ESVIgTkFNRVMgcGNpYWNjZXNzLmgKKyAgICBISU5UUworICAgICR7UENfUENJQUNDRVNTX0lOQ0xVREVESVJ9CisgICAgJHtQQ19QQ0lBQ0NFU1NfSU5DTFVERV9ESVJTfQorICAgICkKKworZmluZF9saWJyYXJ5KFBDSUFDQ0VTU19MSUJSQVJZIE5BTUVTIHBjaWFjY2VzcworICAgIEhJTlRTCisgICAgJHtQQ19QQ0lBQ0NFU1NfTElCRElSfQorICAgICR7UENfUENJQUNDRVNTX0xJQlJBUllfRElSU30KKyAgICApCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoUENJQWNjZXNzIERFRkFVTFRfTVNHCisgICAgUENJQUNDRVNTX0lOQ0xVREVfRElSIFBDSUFDQ0VTU19MSUJSQVJZKQorCittYXJrX2FzX2FkdmFuY2VkKFBDSUFDQ0VTU19JTkNMVURFX0RJUiBQQ0lBQ0NFU1NfTElCUkFSWSkKKworc2V0KFBDSUFDQ0VTU19JTkNMVURFX0RJUlMgJHtQQ0lBQ0NFU1NfSU5DTFVERV9ESVJ9KQorc2V0KFBDSUFDQ0VTU19MSUJSQVJJRVMgJHtQQ0lBQ0NFU1NfTElCUkFSWX0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFB0aHJlYWRTdHVicy5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9GaW5kUHRocmVhZFN0dWJzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2M2JiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFB0aHJlYWRTdHVicy5jbWFrZQpAQCAtMCwwICsxLDE0IEBACisjIC0gRmluZFB0aHJlYWRTdHVicworIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKworZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKKworcGtnX2NoZWNrX21vZHVsZXMoUENfUFRIUkVBRFNUVUJTIFFVSUVUIHB0aHJlYWQtc3R1YnMpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoUHRocmVhZFN0dWJzIERFRkFVTFRfTVNHCisgICAgUENfUFRIUkVBRFNUVUJTX0ZPVU5EKQorCitzZXQoUFRIUkVBRFNUVUJTX0lOQ0xVREVfRElSUyAiIikKK3NldChQVEhSRUFEU1RVQlNfTElCUkFSSUVTICIiKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2NtYWtlL0ZpbmRVRGV2LmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2NtYWtlL0ZpbmRVRGV2LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDE2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFVEZXYuY21ha2UKQEAgLTAsMCArMSwyOCBAQAorIyAtIEZpbmRVRGV2CisjCisjIENvcHlyaWdodCAoQykgMjAxNSBWYWx2ZSBDb3Jwb3JhdGlvbgorCitmaW5kX3BhY2thZ2UoUGtnQ29uZmlnKQorCitwa2dfY2hlY2tfbW9kdWxlcyhQQ19MSUJVREVWIFFVSUVUIGxpYnVkZXYpCisKK2ZpbmRfcGF0aChVREVWX0lOQ0xVREVfRElSIE5BTUVTIGxpYnVkZXYuaAorICAgIEhJTlRTCisgICAgJHtQQ19MSUJVREVWX0lOQ0xVREVESVJ9CisgICAgJHtQQ19MSUJVREVWX0lOQ0xVREVfRElSU30KKyAgICApCisKK2ZpbmRfbGlicmFyeShVREVWX0xJQlJBUlkgTkFNRVMgdWRldgorICAgIEhJTlRTCisgICAgJHtQQ19MSUJVREVWX0xJQkRJUn0KKyAgICAke1BDX0xJQlVERVZfTElCUkFSWV9ESVJTfQorICAgICkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhVRGV2IERFRkFVTFRfTVNHCisgICAgVURFVl9JTkNMVURFX0RJUiBVREVWX0xJQlJBUlkpCisKK21hcmtfYXNfYWR2YW5jZWQoVURFVl9JTkNMVURFX0RJUiBVREVWX0xJQlJBUlkpCisKK3NldChVREVWX0lOQ0xVREVfRElSUyAke1VERVZfSU5DTFVERV9ESVJ9KQorc2V0KFVERVZfTElCUkFSSUVTICR7VURFVl9MSUJSQVJZfSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9GaW5kVmFsZ3JpbmQuY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFZhbGdyaW5kLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMWZiNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFZhbGdyaW5kLmNtYWtlCkBAIC0wLDAgKzEsMjIgQEAKKyMgLSBGaW5kVmFsZ3JpbmQKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFZhbHZlIENvcnBvcmF0aW9uCisKK2ZpbmRfcGFja2FnZShQa2dDb25maWcpCisKK3BrZ19jaGVja19tb2R1bGVzKFBDX1ZBTEdSSU5EIFFVSUVUIHZhbGdyaW5kKQorCitmaW5kX3BhdGgoVkFMR1JJTkRfSU5DTFVERV9ESVIgTkFNRVMgdmFsZ3JpbmQuaCBtZW1jaGVjay5oCisgICAgSElOVFMKKyAgICAke1BDX1ZBTEdSSU5EX0lOQ0xVREVESVJ9CisgICAgJHtQQ19WQUxHUklORF9JTkNMVURFX0RJUlN9CisgICAgKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFZhbGdyaW5kIERFRkFVTFRfTVNHCisgICAgVkFMR1JJTkRfSU5DTFVERV9ESVIpCisKK21hcmtfYXNfYWR2YW5jZWQoVkFMR1JJTkRfSU5DTFVERV9ESVIpCisKK3NldChWQUxHUklORF9JTkNMVURFX0RJUlMgJHtWQUxHUklORF9JTkNMVURFX0RJUn0pCitzZXQoVkFMR1JJTkRfTElCUkFSSUVTICIiKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2NtYWtlL0ZpbmRWdWxrYW5IZWFkZXJzLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2NtYWtlL0ZpbmRWdWxrYW5IZWFkZXJzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYWZhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFZ1bGthbkhlYWRlcnMuY21ha2UKQEAgLTAsMCArMSwxMzQgQEAKKyMucnN0OgorIyBGaW5kVnVsa2FuSGVhZGVycworIyAtLS0tLS0tLS0tLS0tLS0tLQorIworIyBUcnkgdG8gZmluZCBWdWxrYW4gSGVhZGVycyBhbmQgUmVnaXN0cnkuCisjCisjIFRoaXMgbW9kdWxlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgcHJvamVjdHMgdGhhdCBidWlsZCBWdWxrYW4KKyMgInN5c3RlbSIgY29tcG9uZW50cyBzdWNoIGFzIHRoZSBsb2FkZXIgYW5kIGxheWVycy4KKyMgVnVsa2FuIGFwcGxpY2F0aW9ucyBzaG91bGQgaW5zdGVhZCB1c2UgdGhlIEZpbmRWdWxrYW4gKG9yIHNpbWlsYXIpCisjIGZpbmQgbW9kdWxlIHRoYXQgbG9jYXRlcyB0aGUgaGVhZGVycyBhbmQgdGhlIGxvYWRlciBsaWJyYXJ5LgorIworIyBXaGVuIHVzaW5nIHRoaXMgZmluZCBtb2R1bGUgdG8gbG9jYXRlIHRoZSBoZWFkZXJzIGFuZCByZWdpc3RyeQorIyBpbiBhIFZ1bGthbi1IZWFkZXJzIHJlcG9zaXRvcnksIHRoZSBWdWxrYW4tSGVhZGVycyByZXBvc2l0b3J5CisjIHNob3VsZCBiZSBidWlsdCB3aXRoICdpbnN0YWxsJyB0YXJnZXQgYW5kIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQKKyMgb3IgQ01ha2UgdmFyaWFibGUgc2V0IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdGFsbCBkaXJlY3RvcnkuCisjCisjICAgIFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSCisjCisjIElNUE9SVEVEIFRhcmdldHMKKyMgXl5eXl5eXl5eXl5eXl5eXgorIworIyBUaGlzIG1vZHVsZSBkZWZpbmVzIG5vIElNUE9SVEVEIHRhcmdldHMKKyMKKyMgUmVzdWx0IFZhcmlhYmxlcworIyBeXl5eXl5eXl5eXl5eXl5eCisjCisjIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6OgorIworIyAgIFZ1bGthbkhlYWRlcnNfRk9VTkQgICAgICAgICAgLSBUcnVlIGlmIFZ1bGthbkhlYWRlcnMgd2FzIGZvdW5kCisjICAgVnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlMgICAtIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIFZ1bGthbkhlYWRlcnMKKyMKKyMgICBWdWxrYW5SZWdpc3RyeV9GT1VORCAgICAgICAgIC0gVHJ1ZSBpZiBWdWxrYW5SZWdpc3RyeSB3YXMgZm91bmQKKyMgICBWdWxrYW5SZWdpc3RyeV9ESVJTICAgICAgICAgIC0gZGlyZWN0b3JpZXMgZm9yIFZ1bGthblJlZ2lzdHJ5CisjCisjICAgVnVsa2FuSGVhZGVyc19WRVJTSU9OX01BSk9SICAtIFRoZSBNYWpvciBBUEkgdmVyc2lvbiBvZiB0aGUgbGF0ZXN0IHZlcnNpb24KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIHRoZSBWdWxrYW4gaGVhZGVyCisjICAgVnVsa2FuSGVhZGVyc19WRVJTSU9OX01JTk9SICAtIFRoZSBNaW5vciBBUEkgdmVyc2lvbiBvZiB0aGUgbGF0ZXN0IHZlcnNpb24KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIHRoZSBWdWxrYW4gaGVhZGVyCisjICAgVnVsa2FuSGVhZGVyc19WRVJTSU9OX1BBVENIICAtIFRoZSBQYXRjaCBBUEkgdmVyc2lvbiBvZiB0aGUgbGF0ZXN0IHZlcnNpb24KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIHRoZSBWdWxrYW4gaGVhZGVyCisjCisjIFRoZSBtb2R1bGUgd2lsbCBhbHNvIGRlZmluZSB0d28gY2FjaGUgdmFyaWFibGVzOjoKKyMKKyMgICBWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSICAgIC0gdGhlIFZ1bGthbkhlYWRlcnMgaW5jbHVkZSBkaXJlY3RvcnkKKyMgICBWdWxrYW5SZWdpc3RyeV9ESVIgICAgICAgICAgIC0gdGhlIFZ1bGthblJlZ2lzdHJ5IGRpcmVjdG9yeQorIworCisjIFVzZSBISU5UUyBpbnN0ZWFkIG9mIFBBVEggdG8gc2VhcmNoIHRoZXNlIGxvY2F0aW9ucyBiZWZvcmUKKyMgc2VhcmNoaW5nIHN5c3RlbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbGlrZSAkUEFUSCB0aGF0IG1heQorIyBjb250YWluIFNESyBkaXJlY3Rvcmllcy4KK2ZpbmRfcGF0aChWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSCisgICAgTkFNRVMgdnVsa2FuL3Z1bGthbi5oCisgICAgSElOVFMKKyAgICAgICAgJHtWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUn0vaW5jbHVkZQorICAgICAgICAiJEVOVntWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUn0vaW5jbHVkZSIKKyAgICAgICAgIiRFTlZ7VlVMS0FOX1NES30vaW5jbHVkZSIpCisKK2lmKFZ1bGthbkhlYWRlcnNfSU5DTFVERV9ESVIpCisgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KFZVTEtBTl9SRUdJU1RSWV9QQVRIX0hJTlQgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSfSBESVJFQ1RPUlkpCisgICBmaW5kX3BhdGgoVnVsa2FuUmVnaXN0cnlfRElSCisgICAgICAgTkFNRVMgdmsueG1sCisgICAgICAgSElOVFMgIiR7VlVMS0FOX1JFR0lTVFJZX1BBVEhfSElOVH0vc2hhcmUvdnVsa2FuL3JlZ2lzdHJ5IikKK2VuZGlmKCkKKworc2V0KFZ1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0pCitzZXQoVnVsa2FuUmVnaXN0cnlfRElSUyAke1Z1bGthblJlZ2lzdHJ5X0RJUn0pCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoVnVsa2FuSGVhZGVycworICAgIERFRkFVTFRfTVNHCisgICAgVnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhWdWxrYW5SZWdpc3RyeQorICAgIERFRkFVTFRfTVNHCisgICAgVnVsa2FuUmVnaXN0cnlfRElSKQorCittYXJrX2FzX2FkdmFuY2VkKFZ1bGthbkhlYWRlcnNfSU5DTFVERV9ESVIgVnVsa2FuUmVnaXN0cnlfRElSKQorCisjIERldGVybWluZSB0aGUgbWFqb3IvbWlub3IvcGF0Y2ggdmVyc2lvbiBmcm9tIHRoZSB2dWxrYW4gaGVhZGVyCitzZXQoVnVsa2FuSGVhZGVyc19WRVJTSU9OX01BSk9SICIwIikKK3NldChWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUlOT1IgIjAiKQorc2V0KFZ1bGthbkhlYWRlcnNfVkVSU0lPTl9QQVRDSCAiMCIpCisKKyMgRmlyc3QsIGRldGVybWluZSB3aGljaCBoZWFkZXIgd2UgbmVlZCB0byBncmFiIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20uCisjIFN0YXJ0aW5nIHdpdGggVnVsa2FuIDEuMSwgd2Ugc2hvdWxkIHVzZSB2dWxrYW5fY29yZS5oLCBidXQgcHJpb3IgdG8gdGhhdCwKKyMgdGhlIGluZm9ybWF0aW9uIHdhcyBpbiB2dWxrYW4uaC4KK2lmIChFWElTVFMgIiR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0vdnVsa2FuL3Z1bGthbl9jb3JlLmgiKQorICAgIHNldChWdWxrYW5IZWFkZXJzX21haW5faGVhZGVyICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0vdnVsa2FuL3Z1bGthbl9jb3JlLmgpCitlbHNlKCkKKyAgICBzZXQoVnVsa2FuSGVhZGVyc19tYWluX2hlYWRlciAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJ9L3Z1bGthbi92dWxrYW4uaCkKK2VuZGlmKCkKKworIyBGaW5kIGFsbCBsaW5lcyBpbiB0aGUgaGVhZGVyIGZpbGUgdGhhdCBjb250YWluIGFueSB2ZXJzaW9uIHdlIG1heSBiZSBpbnRlcmVzdGVkIGluCisjICBOT1RFOiBUaGV5IHN0YXJ0IHdpdGggI2RlZmluZSBhbmQgdGhlbiBoYXZlIG90aGVyIGtleXdvcmRzCitmaWxlKFNUUklOR1MKKyAgICAgICAgJHtWdWxrYW5IZWFkZXJzX21haW5faGVhZGVyfQorICAgICAgICBWdWxrYW5IZWFkZXJzX2xpbmVzCisgICAgICAgIFJFR0VYICJeI2RlZmluZSAoVktfQVBJX1ZFUlNJT04uKlZLX01BS0VfVkVSU0lPTnxWS19IRUFERVJfVkVSU0lPTikiKQorCitmb3JlYWNoKFZ1bGthbkhlYWRlcnNfbGluZSAke1Z1bGthbkhlYWRlcnNfbGluZXN9KQorCisgICAgIyBGaXJzdCwgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYSBtYWpvci9taW5vciB2ZXJzaW9uCisgICAgIyAgIEZvcm1hdCBpczoKKyAgICAjICAgICAgICAjZGVmaW5lIFZLX0FQSV9WRVJTSU9OX1hfWSBWS19NQUtFX1ZFUlNJT04oWCwgWSwgMCkKKyAgICAjICAgV2UgZ3JhYiB0aGUgbWFqb3IgdmVyc2lvbiAoWCkgYW5kIG1pbm9yIHZlcnNpb24gKFkpIG91dCBvZiB0aGUgcGFyZW50aGVzZXMKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIlZLX01BS0VfVkVSU0lPTlxcKC4qXFwpIiBWdWxrYW5IZWFkZXJzX291dCAke1Z1bGthbkhlYWRlcnNfbGluZX0pCisgICAgc3RyaW5nKFJFR0VYIE1BVENIQUxMICJbMC05XSsiIFZ1bGthbkhlYWRlcnNfTUFKT1JfTUlOT1IgIiR7VnVsa2FuSGVhZGVyc19vdXR9IikKKyAgICBpZiAoVnVsa2FuSGVhZGVyc19NQUpPUl9NSU5PUikKKyAgICAgICAgbGlzdCAoR0VUIFZ1bGthbkhlYWRlcnNfTUFKT1JfTUlOT1IgMCBWdWxrYW5IZWFkZXJzX2N1cl9tYWpvcikKKyAgICAgICAgbGlzdCAoR0VUIFZ1bGthbkhlYWRlcnNfTUFKT1JfTUlOT1IgMSBWdWxrYW5IZWFkZXJzX2N1cl9taW5vcikKKyAgICAgICAgaWYgKCR7VnVsa2FuSGVhZGVyc19jdXJfbWFqb3J9IEdSRUFURVIgJHtWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUFKT1J9KQorICAgICAgICAgICAgc2V0KFZ1bGthbkhlYWRlcnNfVkVSU0lPTl9NQUpPUiAke1Z1bGthbkhlYWRlcnNfY3VyX21ham9yfSkKKyAgICAgICAgICAgIHNldChWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUlOT1IgJHtWdWxrYW5IZWFkZXJzX2N1cl9taW5vcn0pCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYgKCR7VnVsa2FuSGVhZGVyc19jdXJfbWFqb3J9IEVRVUFMICR7VnVsa2FuSGVhZGVyc19WRVJTSU9OX01BSk9SfSBBTkQKKyAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19jdXJfbWlub3J9IEdSRUFURVIgJHtWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUlOT1J9KQorICAgICAgICAgICAgc2V0KFZ1bGthbkhlYWRlcnNfVkVSU0lPTl9NSU5PUiAke1Z1bGthbkhlYWRlcnNfY3VyX21pbm9yfSkKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKworICAgICMgU2Vjb25kLCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSB0aGUgcGF0Y2ggdmVyc2lvbgorICAgICMgICBGb3JtYXQgaXM6CisgICAgIyAgICAgICNkZWZpbmUgVktfSEVBREVSX1ZFUlNJT04gWgorICAgICMgICBXaGVyZSBaIGlzIHRoZSBwYXRjaCB2ZXJzaW9uIHdoaWNoIHdlIGp1c3QgZ3JhYiBvZmYgdGhlIGVuZAorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lLipWS19IRUFERVJfVkVSU0lPTi4qWzAtOV0rIiBWdWxrYW5IZWFkZXJzX291dCAke1Z1bGthbkhlYWRlcnNfbGluZX0pCisgICAgbGlzdChMRU5HVEggVnVsa2FuSGVhZGVyc19vdXQgVnVsa2FuSGVhZGVyc19sZW4pCisgICAgaWYgKFZ1bGthbkhlYWRlcnNfbGVuKQorICAgICAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIlswLTldKyIgVnVsa2FuSGVhZGVyc19WRVJTSU9OX1BBVENIICIke1Z1bGthbkhlYWRlcnNfb3V0fSIpCisgICAgZW5kaWYoKQorCitlbmRmb3JlYWNoKCkKK01FU1NBR0UoU1RBVFVTCisgICAgICAgICJEZXRlY3RlZCBWdWxrYW4gVmVyc2lvbiAke1Z1bGthbkhlYWRlcnNfVkVSU0lPTl9NQUpPUn0uIgorICAgICAgICAiJHtWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUlOT1J9LiIKKyAgICAgICAgIiR7VnVsa2FuSGVhZGVyc19WRVJTSU9OX1BBVENIfSIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFdheWxhbmQuY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFdheWxhbmQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMjE4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9GaW5kV2F5bGFuZC5jbWFrZQpAQCAtMCwwICsxLDY2IEBACisjIFRyeSB0byBmaW5kIFdheWxhbmQgb24gYSBVbml4IHN5c3RlbQorIworIyBUaGlzIHdpbGwgZGVmaW5lOgorIworIyAgIFdBWUxBTkRfRk9VTkQgICAgICAgLSBUcnVlIGlmIFdheWxhbmQgaXMgZm91bmQKKyMgICBXQVlMQU5EX0xJQlJBUklFUyAgIC0gTGluayB0aGVzZSB0byB1c2UgV2F5bGFuZAorIyAgIFdBWUxBTkRfSU5DTFVERV9ESVIgLSBJbmNsdWRlIGRpcmVjdG9yeSBmb3IgV2F5bGFuZAorIyAgIFdBWUxBTkRfREVGSU5JVElPTlMgLSBDb21waWxlciBmbGFncyBmb3IgdXNpbmcgV2F5bGFuZAorIworIyBJbiBhZGRpdGlvbiB0aGUgZm9sbG93aW5nIG1vcmUgZmluZSBncmFpbmVkIHZhcmlhYmxlcyB3aWxsIGJlIGRlZmluZWQ6CisjCisjICAgV0FZTEFORF9DTElFTlRfRk9VTkQgIFdBWUxBTkRfQ0xJRU5UX0lOQ0xVREVfRElSICBXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVMKKyMgICBXQVlMQU5EX1NFUlZFUl9GT1VORCAgV0FZTEFORF9TRVJWRVJfSU5DTFVERV9ESVIgIFdBWUxBTkRfU0VSVkVSX0xJQlJBUklFUworIyAgIFdBWUxBTkRfRUdMX0ZPVU5EICAgICBXQVlMQU5EX0VHTF9JTkNMVURFX0RJUiAgICAgV0FZTEFORF9FR0xfTElCUkFSSUVTCisjCisjIENvcHlyaWdodCAoYykgMjAxMyBNYXJ0aW4gR3LDpMOfbGluIDxtZ3JhZXNzbGluQGtkZS5vcmc+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKK0lGIChOT1QgV0lOMzIpCisgIElGIChXQVlMQU5EX0lOQ0xVREVfRElSIEFORCBXQVlMQU5EX0xJQlJBUklFUykKKyAgICAjIEluIHRoZSBjYWNoZSBhbHJlYWR5CisgICAgU0VUKFdBWUxBTkRfRklORF9RVUlFVExZIFRSVUUpCisgIEVORElGICgpCisKKyAgIyBVc2UgcGtnLWNvbmZpZyB0byBnZXQgdGhlIGRpcmVjdG9yaWVzIGFuZCB0aGVuIHVzZSB0aGVzZSB2YWx1ZXMKKyAgIyBpbiB0aGUgRklORF9QQVRIKCkgYW5kIEZJTkRfTElCUkFSWSgpIGNhbGxzCisgIEZJTkRfUEFDS0FHRShQa2dDb25maWcpCisgIFBLR19DSEVDS19NT0RVTEVTKFBLR19XQVlMQU5EIFFVSUVUIHdheWxhbmQtY2xpZW50IHdheWxhbmQtc2VydmVyIHdheWxhbmQtZWdsIHdheWxhbmQtY3Vyc29yKQorCisgIFNFVChXQVlMQU5EX0RFRklOSVRJT05TICR7UEtHX1dBWUxBTkRfQ0ZMQUdTfSkKKworICBGSU5EX1BBVEgoV0FZTEFORF9DTElFTlRfSU5DTFVERV9ESVIgIE5BTUVTIHdheWxhbmQtY2xpZW50LmggSElOVFMgJHtQS0dfV0FZTEFORF9JTkNMVURFX0RJUlN9KQorICBGSU5EX1BBVEgoV0FZTEFORF9TRVJWRVJfSU5DTFVERV9ESVIgIE5BTUVTIHdheWxhbmQtc2VydmVyLmggSElOVFMgJHtQS0dfV0FZTEFORF9JTkNMVURFX0RJUlN9KQorICBGSU5EX1BBVEgoV0FZTEFORF9FR0xfSU5DTFVERV9ESVIgICAgIE5BTUVTIHdheWxhbmQtZWdsLmggICAgSElOVFMgJHtQS0dfV0FZTEFORF9JTkNMVURFX0RJUlN9KQorICBGSU5EX1BBVEgoV0FZTEFORF9DVVJTT1JfSU5DTFVERV9ESVIgIE5BTUVTIHdheWxhbmQtY3Vyc29yLmggSElOVFMgJHtQS0dfV0FZTEFORF9JTkNMVURFX0RJUlN9KQorCisgIEZJTkRfTElCUkFSWShXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVMgTkFNRVMgd2F5bGFuZC1jbGllbnQgICBISU5UUyAke1BLR19XQVlMQU5EX0xJQlJBUllfRElSU30pCisgIEZJTkRfTElCUkFSWShXQVlMQU5EX1NFUlZFUl9MSUJSQVJJRVMgTkFNRVMgd2F5bGFuZC1zZXJ2ZXIgICBISU5UUyAke1BLR19XQVlMQU5EX0xJQlJBUllfRElSU30pCisgIEZJTkRfTElCUkFSWShXQVlMQU5EX0VHTF9MSUJSQVJJRVMgICAgTkFNRVMgd2F5bGFuZC1lZ2wgICAgICBISU5UUyAke1BLR19XQVlMQU5EX0xJQlJBUllfRElSU30pCisgIEZJTkRfTElCUkFSWShXQVlMQU5EX0NVUlNPUl9MSUJSQVJJRVMgTkFNRVMgd2F5bGFuZC1jdXJzb3IgICBISU5UUyAke1BLR19XQVlMQU5EX0xJQlJBUllfRElSU30pCisKKyAgc2V0KFdBWUxBTkRfSU5DTFVERV9ESVIgJHtXQVlMQU5EX0NMSUVOVF9JTkNMVURFX0RJUn0gJHtXQVlMQU5EX1NFUlZFUl9JTkNMVURFX0RJUn0gJHtXQVlMQU5EX0VHTF9JTkNMVURFX0RJUn0gJHtXQVlMQU5EX0NVUlNPUl9JTkNMVURFX0RJUn0pCisKKyAgc2V0KFdBWUxBTkRfTElCUkFSSUVTICR7V0FZTEFORF9DTElFTlRfTElCUkFSSUVTfSAke1dBWUxBTkRfU0VSVkVSX0xJQlJBUklFU30gJHtXQVlMQU5EX0VHTF9MSUJSQVJJRVN9ICR7V0FZTEFORF9DVVJTT1JfTElCUkFSSUVTfSkKKworICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIFdBWUxBTkRfSU5DTFVERV9ESVIpCisKKyAgaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORF9DTElFTlQgIERFRkFVTFRfTVNHICBXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVMgIFdBWUxBTkRfQ0xJRU5UX0lOQ0xVREVfRElSKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORF9TRVJWRVIgIERFRkFVTFRfTVNHICBXQVlMQU5EX1NFUlZFUl9MSUJSQVJJRVMgIFdBWUxBTkRfU0VSVkVSX0lOQ0xVREVfRElSKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORF9FR0wgICAgIERFRkFVTFRfTVNHICBXQVlMQU5EX0VHTF9MSUJSQVJJRVMgICAgIFdBWUxBTkRfRUdMX0lOQ0xVREVfRElSKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORF9DVVJTT1IgIERFRkFVTFRfTVNHICBXQVlMQU5EX0NVUlNPUl9MSUJSQVJJRVMgIFdBWUxBTkRfQ1VSU09SX0lOQ0xVREVfRElSKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORCAgICAgICAgIERFRkFVTFRfTVNHICBXQVlMQU5EX0xJQlJBUklFUyAgICAgICAgIFdBWUxBTkRfSU5DTFVERV9ESVIpCisKKyAgTUFSS19BU19BRFZBTkNFRCgKKyAgICAgICAgV0FZTEFORF9JTkNMVURFX0RJUiAgICAgICAgIFdBWUxBTkRfTElCUkFSSUVTCisgICAgICAgIFdBWUxBTkRfQ0xJRU5UX0lOQ0xVREVfRElSICBXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVMKKyAgICAgICAgV0FZTEFORF9TRVJWRVJfSU5DTFVERV9ESVIgIFdBWUxBTkRfU0VSVkVSX0xJQlJBUklFUworICAgICAgICBXQVlMQU5EX0VHTF9JTkNMVURFX0RJUiAgICAgV0FZTEFORF9FR0xfTElCUkFSSUVTCisgICAgICAgIFdBWUxBTkRfQ1VSU09SX0lOQ0xVREVfRElSICBXQVlMQU5EX0NVUlNPUl9MSUJSQVJJRVMKKyAgKQorCitFTkRJRiAoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2NtYWtlL0ZpbmRYMTFfWENCLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2NtYWtlL0ZpbmRYMTFfWENCLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmJmODkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFgxMV9YQ0IuY21ha2UKQEAgLTAsMCArMSwzMiBAQAorIyAtIFRyeSB0byBmaW5kIGxpYlgxMS14Y2IKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgWDExX1hDQl9GT1VORCAtIHN5c3RlbSBoYXMgbGliWDExLXhjYgorIyBYMTFfWENCX0xJQlJBUklFUyAtIExpbmsgdGhlc2UgdG8gdXNlIGxpYlgxMS14Y2IKKyMgWDExX1hDQl9JTkNMVURFX0RJUiAtIHRoZSBsaWJYMTEteGNiIGluY2x1ZGUgZGlyCisjIFgxMV9YQ0JfREVGSU5JVElPTlMgLSBjb21waWxlciBzd2l0Y2hlcyByZXF1aXJlZCBmb3IgdXNpbmcgbGliWDExLXhjYgorCisjIENvcHlyaWdodCAoYykgMjAxMSBGcmVkcmlrIEjDtmdsdW5kIDxmcmVkcmlrQGtkZS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAwOCBIZWxpbyBDaGlzc2luaSBkZSBDYXN0cm8sIDxoZWxpb0BrZGUub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDcgTWF0dGhpYXMgS3JldHosIDxrcmV0ekBrZGUub3JnPgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIEZvciBkZXRhaWxzIHNlZSB0aGUgYWNjb21wYW55aW5nIENPUFlJTkctQ01BS0UtU0NSSVBUUyBmaWxlLgorCitJRiAoTk9UIFdJTjMyKQorICAjIHVzZSBwa2ctY29uZmlnIHRvIGdldCB0aGUgZGlyZWN0b3JpZXMgYW5kIHRoZW4gdXNlIHRoZXNlIHZhbHVlcworICAjIGluIHRoZSBGSU5EX1BBVEgoKSBhbmQgRklORF9MSUJSQVJZKCkgY2FsbHMKKyAgRklORF9QQUNLQUdFKFBrZ0NvbmZpZykKKyAgUEtHX0NIRUNLX01PRFVMRVMoUEtHX1gxMV9YQ0IgUVVJRVQgeDExLXhjYikKKworICBTRVQoWDExX1hDQl9ERUZJTklUSU9OUyAke1BLR19YMTFfWENCX0NGTEFHU30pCisKKyAgRklORF9QQVRIKFgxMV9YQ0JfSU5DTFVERV9ESVIgTkFNRVMgWDExL1hsaWIteGNiLmggSElOVFMgJHtQS0dfWDExX1hDQl9JTkNMVURFX0RJUlN9KQorICBGSU5EX0xJQlJBUlkoWDExX1hDQl9MSUJSQVJJRVMgTkFNRVMgWDExLXhjYiBISU5UUyAke1BLR19YMTFfWENCX0xJQlJBUllfRElSU30pCisKKyAgaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKyAgRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKFgxMV9YQ0IgREVGQVVMVF9NU0cgWDExX1hDQl9MSUJSQVJJRVMgWDExX1hDQl9JTkNMVURFX0RJUikKKworICBNQVJLX0FTX0FEVkFOQ0VEKFgxMV9YQ0JfSU5DTFVERV9ESVIgWDExX1hDQl9MSUJSQVJJRVMpCitFTkRJRiAoTk9UIFdJTjMyKQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFhDQi5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9GaW5kWENCLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTE1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvRmluZFhDQi5jbWFrZQpAQCAtMCwwICsxLDUxIEBACisjIC0gRmluZFhDQgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKworZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKKworaWYoTk9UIFhDQl9GSU5EX0NPTVBPTkVOVFMpCisgICAgc2V0KFhDQl9GSU5EX0NPTVBPTkVOVFMgeGNiKQorZW5kaWYoKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorc2V0KFhDQl9GT1VORCB0cnVlKQorc2V0KFhDQl9JTkNMVURFX0RJUlMgIiIpCitzZXQoWENCX0xJQlJBUklFUyAiIikKK2ZvcmVhY2goY29tcCAke1hDQl9GSU5EX0NPTVBPTkVOVFN9KQorICAgICMgY29tcG9uZW50IG5hbWUKKyAgICBzdHJpbmcoVE9VUFBFUiAke2NvbXB9IGNvbXBuYW1lKQorICAgIHN0cmluZyhSRVBMQUNFICItIiAiXyIgY29tcG5hbWUgJHtjb21wbmFtZX0pCisgICAgIyBoZWFkZXIgbmFtZQorICAgIHN0cmluZyhSRVBMQUNFICJ4Y2ItIiAiIiBoZWFkZXJuYW1lIHhjYi8ke2NvbXB9LmgpCisgICAgIyBsaWJyYXJ5IG5hbWUKKyAgICBzZXQobGlibmFtZSAke2NvbXB9KQorCisgICAgcGtnX2NoZWNrX21vZHVsZXMoUENfJHtjb21wfSBRVUlFVCAke2NvbXB9KQorCisgICAgZmluZF9wYXRoKCR7Y29tcG5hbWV9X0lOQ0xVREVfRElSIE5BTUVTICR7aGVhZGVybmFtZX0KKyAgICAgICAgSElOVFMKKyAgICAgICAgJHtQQ18ke2NvbXB9X0lOQ0xVREVESVJ9CisgICAgICAgICR7UENfJHtjb21wfV9JTkNMVURFX0RJUlN9CisgICAgICAgICkKKworICAgIGZpbmRfbGlicmFyeSgke2NvbXBuYW1lfV9MSUJSQVJZIE5BTUVTICR7bGlibmFtZX0KKyAgICAgICAgSElOVFMKKyAgICAgICAgJHtQQ18ke2NvbXB9X0xJQkRJUn0KKyAgICAgICAgJHtQQ18ke2NvbXB9X0xJQlJBUllfRElSU30KKyAgICAgICAgKQorCisgICAgZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKCR7Y29tcH0KKyAgICAgICAgRk9VTkRfVkFSICR7Y29tcH1fRk9VTkQKKyAgICAgICAgUkVRVUlSRURfVkFSUyAke2NvbXBuYW1lfV9JTkNMVURFX0RJUiAke2NvbXBuYW1lfV9MSUJSQVJZKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtjb21wbmFtZX1fSU5DTFVERV9ESVIgJHtjb21wbmFtZX1fTElCUkFSWSkKKworICAgIGxpc3QoQVBQRU5EIFhDQl9JTkNMVURFX0RJUlMgJHske2NvbXBuYW1lfV9JTkNMVURFX0RJUn0pCisgICAgbGlzdChBUFBFTkQgWENCX0xJQlJBUklFUyAkeyR7Y29tcG5hbWV9X0xJQlJBUll9KQorCisgICAgaWYoTk9UICR7Y29tcH1fRk9VTkQpCisgICAgICAgIHNldChYQ0JfRk9VTkQgZmFsc2UpCisgICAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCisKK2xpc3QoUkVNT1ZFX0RVUExJQ0FURVMgWENCX0lOQ0xVREVfRElSUykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9jbWFrZS9jbWFrZV91bmluc3RhbGwuY21ha2UuaW4gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzdlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvY21ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluCkBAIC0wLDAgKzEsMjEgQEAKK2lmKE5PVCBFWElTVFMgIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAL2luc3RhbGxfbWFuaWZlc3QudHh0IikKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ2Fubm90IGZpbmQgaW5zdGFsbCBtYW5pZmVzdDogQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorZW5kaWYoTk9UIEVYSVNUUyAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorCitmaWxlKFJFQUQgIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAL2luc3RhbGxfbWFuaWZlc3QudHh0IiBmaWxlcykKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJcbiIgIjsiIGZpbGVzICIke2ZpbGVzfSIpCitmb3JlYWNoKGZpbGUgJHtmaWxlc30pCisgIG1lc3NhZ2UoU1RBVFVTICJVbmluc3RhbGxpbmcgJEVOVntERVNURElSfSR7ZmlsZX0iKQorICBpZihJU19TWU1MSU5LICIkRU5We0RFU1RESVJ9JHtmaWxlfSIgT1IgRVhJU1RTICIkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgICAgZXhlY19wcm9ncmFtKAorICAgICAgIkBDTUFLRV9DT01NQU5EQCIgQVJHUyAiLUUgcmVtb3ZlIFwiJEVOVntERVNURElSfSR7ZmlsZX1cIiIKKyAgICAgIE9VVFBVVF9WQVJJQUJMRSBybV9vdXQKKyAgICAgIFJFVFVSTl9WQUxVRSBybV9yZXR2YWwKKyAgICAgICkKKyAgICBpZihOT1QgIiR7cm1fcmV0dmFsfSIgU1RSRVFVQUwgMCkKKyAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlByb2JsZW0gd2hlbiByZW1vdmluZyAkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgICAgZW5kaWYoTk9UICIke3JtX3JldHZhbH0iIFNUUkVRVUFMIDApCisgIGVsc2UoSVNfU1lNTElOSyAiJEVOVntERVNURElSfSR7ZmlsZX0iIE9SIEVYSVNUUyAiJEVOVntERVNURElSfSR7ZmlsZX0iKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGaWxlICRFTlZ7REVTVERJUn0ke2ZpbGV9IGRvZXMgbm90IGV4aXN0LiIpCisgIGVuZGlmKElTX1NZTUxJTksgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IiBPUiBFWElTVFMgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IikKK2VuZGZvcmVhY2goZmlsZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9leHRlcm5hbC9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9leHRlcm5hbC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjRkMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2V4dGVybmFsL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzkgQEAKKyMgfn5+CisjIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIH5+fgorCisjIEFkZCB5b3VyIG9wdGlvbmFsIGRlcGVuZGVuY2llcyBpbiB0aGlzICJleHRlcm5hbCIgZGlyZWN0b3J5LgorCisjIGdvb2dsZXRlc3QgaXMgYW4gb3B0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jeSBmb3IgdGhpcyByZXBvLgoraWYoQlVJTERfVEVTVFMpCisgICAgIyBBdHRlbXB0IHRvIGVuYWJsZSBpZiBpdCBpcyBhdmFpbGFibGUuCisgICAgaWYoVEFSR0VUIGd0ZXN0X21haW4pCisgICAgICAgICMgQWxyZWFkeSBlbmFibGVkIGFzIGEgdGFyZ2V0IChwZXJoYXBzIGJ5IGEgcHJvamVjdCBlbmNsb3NpbmcgdGhpcyBvbmUpCisgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJWdWxrYW4tTG9hZGVyL2V4dGVybmFsOiAiICJnb29nbGV0ZXN0IGFscmVhZHkgY29uZmlndXJlZCAtIHVzaW5nIGl0IikKKyAgICBlbHNlaWYoSVNfRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZ29vZ2xldGVzdCIpCisgICAgICAgICMgVGhlIGdvb2dsZXRlc3QgZGlyZWN0b3J5IGV4aXN0cywgc28gZW5hYmxlIGl0IGFzIGEgdGFyZ2V0LgorICAgICAgICBtZXNzYWdlKFNUQVRVUyAiVnVsa2FuLUxvYWRlci9leHRlcm5hbDogIiAiZ29vZ2xldGVzdCBmb3VuZCAtIGNvbmZpZ3VyaW5nIGl0IGZvciB0ZXN0cyIpCisgICAgICAgIHNldChCVUlMRF9HVEVTVCBPTiBDQUNIRSBCT09MICJCdWlsZHMgdGhlIGdvb2dsZXRlc3Qgc3VicHJvamVjdCIpCisgICAgICAgIHNldChCVUlMRF9HTU9DSyBPRkYgQ0FDSEUgQk9PTCAiQnVpbGRzIHRoZSBnb29nbGVtb2NrIHN1YnByb2plY3QiKQorICAgICAgICBzZXQoZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydCBPTiBDQUNIRSBCT09MICJMaW5rIGd0ZXN0IHJ1bnRpbWVzIGR5bmFtaWNhbGx5IikKKyAgICAgICAgc2V0KEJVSUxEX1NIQVJFRF9MSUJTIE9OIENBQ0hFIEJPT0wgIkJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiKQorICAgICAgICAjIEVYQ0xVREVfRlJPTV9BTEwga2VlcHMgdGhlIGluc3RhbGwgdGFyZ2V0IGZyb20gaW5zdGFsbGluZyBHVEVTVCBmaWxlcy4KKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2dvb2dsZXRlc3QiIEVYQ0xVREVfRlJPTV9BTEwpCisgICAgZWxzZSgpCisgICAgICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiVnVsa2FuLUxvYWRlci9leHRlcm5hbDogIiAiR29vZ2xlIFRlc3Qgd2FzIG5vdCBmb3VuZC4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIEdvb2dsZSBUZXN0IGluIGV4dGVybmFsL2dvb2dsZXRlc3Qgb3Igc2V0IEJVSUxEX1RFU1RTPU9GRiIpCisgICAgZW5kaWYoKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2V4dGVybmFsL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9leHRlcm5hbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1MDJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9leHRlcm5hbC9SRUFETUUubWQKQEAgLTAsMCArMSw5IEBACisjIEV4dGVybmFsIGRlcGVuZGVuY2llcworCitUaGlzIGRpcmVjdG9yeSBwcm92aWRlcyBhIGxvY2F0aW9uIHdoZXJlIGV4dGVybmFsIHByb2plY3RzIGNhbiBiZSBjbG9uZWQgdGhhdCBhcmUgdXNlZCBieSB0aGUgbG9hZGVyLgorQ3VycmVudGx5LCB0aGUgb25seSBwcm9qZWN0IHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGxvYWRlciBpcyBHb29nbGUgVGVzdC4KK0l0IGNhbiBiZSBlbmFibGVkIGJ5IGNsb25pbmcgaXQgaGVyZSBsaWtlOgorCitgYGAKK2dpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QuZ2l0CitgYGAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvQ01ha2VMaXN0cy50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjlkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzE4IEBACisjIH5+fgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgfn5+CisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9nZW5lcmF0ZWQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIENoZWNrIGZvciB0aGUgZXhpc3RhbmNlIG9mIHRoZSBzZWN1cmVfZ2V0ZW52IG9yIF9fc2VjdXJlX2dldGVudiBjb21tYW5kcworaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlKQorCitjaGVja19mdW5jdGlvbl9leGlzdHMoc2VjdXJlX2dldGVudiBIQVZFX1NFQ1VSRV9HRVRFTlYpCitjaGVja19mdW5jdGlvbl9leGlzdHMoX19zZWN1cmVfZ2V0ZW52IEhBVkVfX19TRUNVUkVfR0VURU5WKQoraWYoTk9UIChIQVZFX1NFQ1VSRV9HRVRFTlYgT1IgSEFWRV9fU0VDVVJFX0dFVEVOVikpCisgICAgbWVzc2FnZShXQVJOSU5HICJVc2luZyBub24tc2VjdXJlIGVudmlyb25tZW50YWwgbG9va3Vwcy4gVGhpcyBsb2FkZXIgd2lsbCBub3QgcHJvcGVybHkgZGlzYWJsZSBlbnZpcm9uZW50IHZhcmlhYmxlcyB3aGVuIHJ1biB3aXRoIGVsZXZhdGVkIHBlcm1pc3Npb25zLiIpCitlbmRpZigpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbG9hZGVyX2NtYWtlX2NvbmZpZy5oLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9sb2FkZXJfY21ha2VfY29uZmlnLmgpCisKK2lmKFdJTjMyKQorICAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlMgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiBXSU4zMl9MRUFOX0FORF9NRUFOKQorICAgIGlmKE1TVkMgQU5EIE5PVCBNU1ZDX1ZFUlNJT04gTEVTUyAxOTAwKQorICAgICAgICAjIEVuYWJsZSBjb250cm9sIGZsb3cgZ3VhcmQKKyAgICAgICAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkaW5nIGxvYWRlciB3aXRoIGNvbnRyb2wgZmxvdyBndWFyZCIpCisgICAgICAgIHNldChNU1ZDX0xPQURFUl9DT01QSUxFX09QVElPTlMgJHtNU1ZDX0xPQURFUl9DT01QSUxFX09QVElPTlN9IC9ndWFyZDpjZikKKyAgICAgICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30gL2d1YXJkOmNmIikKKyAgICAgICAgc2V0KENNQUtFX0VYRV9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU30gL2d1YXJkOmNmIikKKyAgICBlbmRpZigpCitlbHNlaWYoQU5EUk9JRCkKKyAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUikKK2Vsc2VpZihBUFBMRSkKKyAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKK2Vsc2VpZihVTklYIEFORCBOT1QgQVBQTEUpICMgaS5lLjogTGludXgKKyAgICBpZihCVUlMRF9XU0lfWENCX1NVUFBPUlQpCisgICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICBlbmRpZigpCisKKyAgICBpZihCVUlMRF9XU0lfWExJQl9TVVBQT1JUKQorICAgICAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUKQorICAgIGVuZGlmKCkKKworICAgIGlmKEJVSUxEX1dTSV9XQVlMQU5EX1NVUFBPUlQpCisgICAgICAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlMgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuc3VwcG9ydGVkIFBsYXRmb3JtISIpCitlbmRpZigpCisKKyMgREVCVUcgZW5hYmxlcyBydW50aW1lIGxvYWRlciBJQ0QgdmVyaWZpY2F0aW9uCitzZXQoQ01BS0VfQ19GTEFHU19ERUJVRyAiJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAtRERFQlVHIikKK3NldChDTUFLRV9DWFhfRkxBR1NfREVCVUcgIiR7Q01BS0VfQ1hYX0ZMQUdTX0RFQlVHfSAtRERFQlVHIikKKworaWYoV0lOMzIpCisgICAgIyBVc2Ugc3RhdGljIE1TVkNSVCBsaWJyYXJpZXMKKyAgICBmb3JlYWNoKGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGluCisgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX0RFQlVHCisgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX01JTlNJWkVSRUwKKyAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMRUFTRQorICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19SRUxXSVRIREVCSU5GTworICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHCisgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTAorICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTykKKyAgICAgICAgaWYoJHtjb25maWd1cmF0aW9ufSBNQVRDSEVTICIvTUQiKQorICAgICAgICAgICAgc3RyaW5nKFJFR0VYCisgICAgICAgICAgICAgICAgICAgUkVQTEFDRSAiL01EIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9NVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29uZmlndXJhdGlvbn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIkeyR7Y29uZmlndXJhdGlvbn19IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorCisgICAgaWYoRU5BQkxFX1dJTjEwX09ORUNPUkUpCisgICAgICAgICMgTm90ZTogV2hlbiBsaW5raW5nIHlvdXIgYXBwIG9yIGRyaXZlciB0byBPbmVDb3JlLmxpYiwgYmUgc3VyZSB0byByZW1vdmUgYW55IGxpbmtzIHRvIG5vbi11bWJyZWxsYSBsaWJzIChzdWNoIGFzCisgICAgICAgICMga2VybmVsMzIubGliKS4KKyAgICAgICAgc2V0KENNQUtFX0NYWF9TVEFOREFSRF9MSUJSQVJJRVMgIiAiKSAjIHNwYWNlIGlzIGludGVudGlvbmFsCisgICAgICAgIHNldChDTUFLRV9DX1NUQU5EQVJEX0xJQlJBUklFUyAke0NNQUtFX0NYWF9TVEFOREFSRF9MSUJSQVJJRVN9KQorICAgIGVuZGlmKCkKKworICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgICMgfn5+CisgICAgIyBCdWlsZCBkZXZfZXh0X3RyYW1wb2xpbmUuYyB3aXRoIC1PMiB0byBhbGxvdyB0YWlsLWNhbGwgb3B0aW1pemF0aW9uLgorICAgICMgQnVpbGQgb3RoZXIgQyBmaWxlcyB3aXRoIG5vcm1hbCBvcHRpb25zLgorICAgICMgU2V0dXAgdHdvIENNYWtlIHRhcmdldHMgKGxvYWRlci1ub3JtIGFuZCBsb2FkZXItb3B0KSBmb3IgdGhlIGRpZmZlcmVudCBjb21waWxhdGlvbiBmbGFncy4KKyAgICAjIH5+fgorICAgIHNlcGFyYXRlX2FyZ3VtZW50cyhMT0NBTF9DX0ZMQUdTX0RCRyBXSU5ET1dTX0NPTU1BTkQgJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSkKKyAgICBzZXQoQ01BS0VfQ19GTEFHU19ERUJVRyAiICIpCisgICAgc2VwYXJhdGVfYXJndW1lbnRzKExPQ0FMX0NfRkxBR1NfUkVMIFdJTkRPV1NfQ09NTUFORCAke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0pCitlbmRpZigpCisKK3NldChOT1JNQUxfTE9BREVSX1NSQ1MKKyAgICBleHRlbnNpb25fbWFudWFsLmMKKyAgICBsb2FkZXIuYworICAgIGxvYWRlci5oCisgICAgdmtfbG9hZGVyX3BsYXRmb3JtLmgKKyAgICB2a19sb2FkZXJfbGF5ZXIuaAorICAgIHRyYW1wb2xpbmUuYworICAgIHdzaS5jCisgICAgd3NpLmgKKyAgICBkZWJ1Z191dGlscy5jCisgICAgZGVidWdfdXRpbHMuaAorICAgIGdwYV9oZWxwZXIuaAorICAgIGNKU09OLmMKKyAgICBjSlNPTi5oCisgICAgbXVybXVyaGFzaC5jCisgICAgbXVybXVyaGFzaC5oKQorCitpZihXSU4zMikKKyAgICBzZXQoTk9STUFMX0xPQURFUl9TUkNTICR7Tk9STUFMX0xPQURFUl9TUkNTfSBhZGFwdGVycy5oKQorZW5kaWYoKQorCitzZXQoT1BUX0xPQURFUl9TUkNTIGRldl9leHRfdHJhbXBvbGluZS5jIHBoeXNfZGV2X2V4dC5jKQorCisjIENoZWNrIGZvciBhc3NlbWJsZXIgc3VwcG9ydAorc2V0KEFTTV9GQUlMVVJFX01TRyAiVGhlIGJ1aWxkIHdpbGwgZmFsbCBiYWNrIG9uIGJ1aWxkaW5nIHdpdGggQyBjb2RlXG4iKQorc2V0KEFTTV9GQUlMVVJFX01TRyAiJHtBU01fRkFJTFVSRV9NU0d9Tm90ZSB0aGF0IHRoaXMgbWF5IGJlIHVuc2FmZSwgYXMgdGhlIEMgY29kZSByZXF1aXJlcyB0YWlsLWNhbGwgb3B0aW1pemF0aW9ucyB0byByZW1vdmUiKQorc2V0KEFTTV9GQUlMVVJFX01TRyAiJHtBU01fRkFJTFVSRV9NU0d9IHRoZSBzdGFjayBmcmFtZSBmb3IgY2VydGFpbiBjYWxscy4gSWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGRvIHRoaXMsIHRoZW4gdW5rbm93biBkZXZpY2UiKQorc2V0KEFTTV9GQUlMVVJFX01TRyAiJHtBU01fRkFJTFVSRV9NU0d9IGV4dGVuc2lvbnMgd2lsbCBzdWZmZXIgZnJvbSBhIGNvcnJ1cHRlZCBzdGFjay4iKQoraWYoV0lOMzIpCisgICAgZW5hYmxlX2xhbmd1YWdlKEFTTV9NQVNNKQorICAgIGlmKENNQUtFX0FTTV9NQVNNX0NPTVBJTEVSX1dPUktTKQorICAgICAgICBpZihOT1QgQ01BS0VfQ0xfNjQpCisgICAgICAgICAgICBzZXQoQ01BS0VfQVNNX01BU01fRkxBR1MgJHtDTUFLRV9BU01fTUFTTV9GTEFHU30gL3NhZmVzZWgpCisgICAgICAgIGVuZGlmKCkKKworICAgICAgICBhZGRfZXhlY3V0YWJsZShhc21fb2Zmc2V0IGFzbV9vZmZzZXQuYykKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGFzbV9vZmZzZXQgVnVsa2FuOjpIZWFkZXJzKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbl9kZWZpbmVzLmFzbSBERVBFTkRTIGFzbV9vZmZzZXQgQ09NTUFORCBhc21fb2Zmc2V0IE1BU00pCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KGxvYWRlcl9hc21fZ2VuX2ZpbGVzIERFUEVORFMgZ2VuX2RlZmluZXMuYXNtKQorICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMobG9hZGVyX2FzbV9nZW5fZmlsZXMgUFJPUEVSVElFUyBGT0xERVIgJHtMT0FERVJfSEVMUEVSX0ZPTERFUn0pCisgICAgICAgIGFkZF9saWJyYXJ5KGxvYWRlci11bmtub3duLWNoYWluIE9CSkVDVCB1bmtub3duX2V4dF9jaGFpbl9tYXNtLmFzbSkKKyAgICAgICAgYWRkX2RlcGVuZGVuY2llcyhsb2FkZXItdW5rbm93bi1jaGFpbiBsb2FkZXJfYXNtX2dlbl9maWxlcykKKyAgICBlbHNlKCkKKyAgICAgICAgbWVzc2FnZShXQVJOSU5HICJDb3VsZCBub3QgZmluZCB3b3JraW5nIE1BU00gYXNzZWJsZXJcbiR7QVNNX0ZBSUxVUkVfTVNHfSIpCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KGxvYWRlcl9hc21fZ2VuX2ZpbGVzKQorICAgICAgICBhZGRfbGlicmFyeShsb2FkZXItdW5rbm93bi1jaGFpbiBPQkpFQ1QgdW5rbm93bl9leHRfY2hhaW4uYykKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfb3B0aW9ucyhsb2FkZXItdW5rbm93bi1jaGFpbiBQVUJMSUMgIiQ8JDxDT05GSUc6REVCVUc+OiR7TE9DQUxfQ19GTEFHU19SRUx9PiIpCisgICAgICAgIHRhcmdldF9jb21waWxlX29wdGlvbnMobG9hZGVyLXVua25vd24tY2hhaW4gUFVCTElDICR7TVNWQ19MT0FERVJfQ09NUElMRV9PUFRJT05TfSkKKyAgICBlbmRpZigpCitlbHNlaWYoQVBQTEUpCisgICAgIyBGb3IgTWFjT1MsIHVzZSB0aGUgQyBjb2RlIGFuZCBmb3JjZSB0aGUgY29tcGlsZXIncyB0YWlsLWNhbGwgb3B0aW1pemF0aW9uIGluc3RlYWQgb2YgdXNpbmcgYXNzZW1ibHkgY29kZS4KKyAgICBzZXQoT1BUX0xPQURFUl9TUkNTICR7T1BUX0xPQURFUl9TUkNTfSB1bmtub3duX2V4dF9jaGFpbi5jKQorICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke09QVF9MT0FERVJfU1JDU30gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTIC1PKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KGxvYWRlcl9hc21fZ2VuX2ZpbGVzKSAjIFRoaXMgY2F1c2VzIG5vIGFzc2VtYmx5IGZpbGVzIHRvIGJlIGdlbmVyYXRlZC4KK2Vsc2UoVU5JWCBBTkQgTk9UIEFQUExFKSAjIGkuZS46IExpbnV4CisgICAgZW5hYmxlX2xhbmd1YWdlKEFTTSkKKyAgICBzZXQoQ01BS0VfQVNNX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IikKKworICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgiY2V0LmgiIEhBVkVfQ0VUX0gpCisgICAgaWYoSEFWRV9DRVRfSCkKKyAgICAgICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBIQVZFX0NFVF9IKQorICAgIGVuZGlmKCkKKyAgICBzZXQoQ01BS0VfVFJZX0NPTVBJTEVfVEFSR0VUX1RZUEUgU1RBVElDX0xJQlJBUlkpCisgICAgdHJ5X2NvbXBpbGUoQVNTRU1CTEVSX1dPUktTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYXNtX3Rlc3QuUykKKyAgICBpZihBU1NFTUJMRVJfV09SS1MpCisgICAgICAgIHNldChPUFRfTE9BREVSX1NSQ1MgJHtPUFRfTE9BREVSX1NSQ1N9IHVua25vd25fZXh0X2NoYWluX2dhcy5TKQorICAgICAgICBhZGRfZXhlY3V0YWJsZShhc21fb2Zmc2V0IGFzbV9vZmZzZXQuYykKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGFzbV9vZmZzZXQgVnVsa2FuOjpIZWFkZXJzKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbl9kZWZpbmVzLmFzbSBERVBFTkRTIGFzbV9vZmZzZXQgQ09NTUFORCBhc21fb2Zmc2V0IEdBUykKKyAgICAgICAgYWRkX2N1c3RvbV90YXJnZXQobG9hZGVyX2FzbV9nZW5fZmlsZXMgREVQRU5EUyBnZW5fZGVmaW5lcy5hc20pCisgICAgZWxzZSgpCisgICAgICAgIG1lc3NhZ2UoV0FSTklORyAiQ291bGQgbm90IGZpbmQgd29ya2luZyB4ODYgR0FTIGFzc2VtYmxlclxuJHtBU01fRkFJTFVSRV9NU0d9IikKKyAgICAgICAgc2V0KE9QVF9MT0FERVJfU1JDUyAke09QVF9MT0FERVJfU1JDU30gdW5rbm93bl9leHRfY2hhaW4uYykKKyAgICAgICAgYWRkX2N1c3RvbV90YXJnZXQobG9hZGVyX2FzbV9nZW5fZmlsZXMpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgICBhZGRfbGlicmFyeShsb2FkZXItbm9ybSBPQkpFQ1QgJHtOT1JNQUxfTE9BREVSX1NSQ1N9IGRpcmVudF9vbl93aW5kb3dzLmMgZHhnaV9sb2FkZXIuYykKKyAgICB0YXJnZXRfY29tcGlsZV9vcHRpb25zKGxvYWRlci1ub3JtIFBVQkxJQyAiJDwkPENPTkZJRzpERUJVRz46JHtMT0NBTF9DX0ZMQUdTX0RCR30+IikKKyAgICB0YXJnZXRfY29tcGlsZV9vcHRpb25zKGxvYWRlci1ub3JtIFBVQkxJQyAke01TVkNfTE9BREVSX0NPTVBJTEVfT1BUSU9OU30pCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMobG9hZGVyLW5vcm0gUFJJVkFURSAiJDxUQVJHRVRfUFJPUEVSVFk6VnVsa2FuOjpIZWFkZXJzLElOVEVSRkFDRV9JTkNMVURFX0RJUkVDVE9SSUVTPiIpCisKKyAgICBhZGRfbGlicmFyeShsb2FkZXItb3B0IE9CSkVDVCAke09QVF9MT0FERVJfU1JDU30pCisgICAgYWRkX2RlcGVuZGVuY2llcyhsb2FkZXItb3B0IGxvYWRlcl9hc21fZ2VuX2ZpbGVzKQorICAgIHRhcmdldF9jb21waWxlX29wdGlvbnMobG9hZGVyLW9wdCBQVUJMSUMgIiQ8JDxDT05GSUc6REVCVUc+OiR7TE9DQUxfQ19GTEFHU19SRUx9PiIpCisgICAgdGFyZ2V0X2NvbXBpbGVfb3B0aW9ucyhsb2FkZXItb3B0IFBVQkxJQyAke01TVkNfTE9BREVSX0NPTVBJTEVfT1BUSU9OU30pCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMobG9hZGVyLW9wdCBQUklWQVRFICIkPFRBUkdFVF9QUk9QRVJUWTpWdWxrYW46OkhlYWRlcnMsSU5URVJGQUNFX0lOQ0xVREVfRElSRUNUT1JJRVM+IikKKworICAgIGlmKE5PVCBFTkFCTEVfU1RBVElDX0xPQURFUikKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMobG9hZGVyLW5vcm0gUFVCTElDIExPQURFUl9EWU5BTUlDX0xJQikKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMobG9hZGVyLW9wdCBQVUJMSUMgTE9BREVSX0RZTkFNSUNfTElCKQorCisgICAgICAgIGFkZF9saWJyYXJ5KHZ1bGthbgorICAgICAgICAgICAgICAgICAgICBTSEFSRUQKKyAgICAgICAgICAgICAgICAgICAgJDxUQVJHRVRfT0JKRUNUUzpsb2FkZXItb3B0PgorICAgICAgICAgICAgICAgICAgICAkPFRBUkdFVF9PQkpFQ1RTOmxvYWRlci1ub3JtPgorICAgICAgICAgICAgICAgICAgICAkPFRBUkdFVF9PQkpFQ1RTOmxvYWRlci11bmtub3duLWNoYWluPgorICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdnVsa2FuLTEuZGVmCisgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9sb2FkZXIucmMpCisgICAgICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh2dWxrYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMgTElOS19GTEFHU19ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2lnbm9yZTo0MDk4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfTkFNRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dWxrYW4tMSkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHZ1bGthbiBWdWxrYW46OkhlYWRlcnMpCisgICAgZWxzZSgpCisgICAgICAgIGFkZF9saWJyYXJ5KHZ1bGthbgorICAgICAgICAgICAgICAgICAgICBTVEFUSUMKKyAgICAgICAgICAgICAgICAgICAgJDxUQVJHRVRfT0JKRUNUUzpsb2FkZXItb3B0PgorICAgICAgICAgICAgICAgICAgICAkPFRBUkdFVF9PQkpFQ1RTOmxvYWRlci1ub3JtPgorICAgICAgICAgICAgICAgICAgICAkPFRBUkdFVF9PQkpFQ1RTOmxvYWRlci11bmtub3duLWNoYWluPikKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHZ1bGthbiBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FIFZLc3RhdGljLjEpCisgICAgZW5kaWYoKQorCisgICAgaWYoRU5BQkxFX1dJTjEwX09ORUNPUkUpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2dWxrYW4gT25lQ29yZVVBUC5saWIgTElCQ01ULkxJQiBMSUJDTVRELkxJQiBMSUJWQ1JVTlRJTUUuTElCIExJQlVDUlQuTElCKQorICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXModnVsa2FuIFBST1BFUlRJRVMgTElOS19GTEFHUyAiL05PREVGQVVMVExJQiIpCisgICAgZWxzZSgpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2dWxrYW4gQ2ZnbWdyMzIpCisgICAgZW5kaWYoKQorCisgICAgYWRkX2RlcGVuZGVuY2llcyh2dWxrYW4gbG9hZGVyX2FzbV9nZW5fZmlsZXMpCisKK2Vsc2UoKQorICAgICMgTGludXggYW5kIE1hY09TCisgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLVdwb2ludGVyLWFyaXRoIikKKworICAgICMgQ2xhbmcgKGFuZCBub3QgZ2NjKSB3YXJucyBhYm91dCByZWRlZmluaW5nIGEgdHlwZWRlZiB3aXRoIHRoZSBzYW1lIHR5cGVzLCBzbyBkaXNhYmxlIHRoYXQgd2FybmluZy4gTm90ZSB0aGF0IGl0IHdpbGwgc3RpbGwKKyAgICAjIHRocm93IGFuIGVycm9yIGlmIGEgdHlwZWRlZiBpcyByZWRlZmluZWQgd2l0aCBhIGRpZmZlcmVudCB0eXBlLgorICAgIGlmKENNQUtFX0NfQ09NUElMRVJfSUQgTUFUQ0hFUyAiQ2xhbmciKQorICAgICAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtV25vLXR5cGVkZWYtcmVkZWZpbml0aW9uIikKKyAgICBlbmRpZigpCisKKyAgICBhZGRfbGlicmFyeSh2dWxrYW4gU0hBUkVEICR7Tk9STUFMX0xPQURFUl9TUkNTfSAke09QVF9MT0FERVJfU1JDU30pCisgICAgYWRkX2RlcGVuZGVuY2llcyh2dWxrYW4gbG9hZGVyX2FzbV9nZW5fZmlsZXMpCisgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnModnVsa2FuIFBVQkxJQyBMT0FERVJfRFlOQU1JQ19MSUIpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHZ1bGthbgorICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUSUVTIFNPVkVSU0lPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlNJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUFKT1J9LiR7VnVsa2FuSGVhZGVyc19WRVJTSU9OX01JTk9SfS4ke1Z1bGthbkhlYWRlcnNfVkVSU0lPTl9QQVRDSH0iKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2dWxrYW4gJHtDTUFLRV9ETF9MSUJTfSBwdGhyZWFkIG0pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHZ1bGthbiBWdWxrYW46OkhlYWRlcnMpCisKKyAgICBpZihBUFBMRSkKKyAgICAgICAgZmluZF9saWJyYXJ5KENPUkVGT1VOREFUSU9OX0xJQlJBUlkgTkFNRVMgQ29yZUZvdW5kYXRpb24pCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2dWxrYW4gIi1mcmFtZXdvcmsgQ29yZUZvdW5kYXRpb24iKQorCisgICAgICAgICMgQnVpbGQgdnVsa2FuLmZyYW1ld29yaworICAgICAgICBzZXQoRlJBTUVXT1JLX0hFQURFUlMKKyAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlN9L3Z1bGthbi92a19pY2QuaAorICAgICAgICAgICAgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSU30vdnVsa2FuL3ZrX2xheWVyLmgKKyAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlN9L3Z1bGthbi92a19wbGF0Zm9ybS5oCisgICAgICAgICAgICAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTfS92dWxrYW4vdmtfc2RrX3BsYXRmb3JtLmgKKyAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlN9L3Z1bGthbi92dWxrYW5fYW5kcm9pZC5oCisgICAgICAgICAgICAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTfS92dWxrYW4vdnVsa2FuX2NvcmUuaAorICAgICAgICAgICAgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSU30vdnVsa2FuL3Z1bGthbl9pb3MuaAorICAgICAgICAgICAgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSU30vdnVsa2FuL3Z1bGthbl9tYWNvcy5oCisgICAgICAgICAgICAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTfS92dWxrYW4vdnVsa2FuX3ZpLmgKKyAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlN9L3Z1bGthbi92dWxrYW5fd2F5bGFuZC5oCisgICAgICAgICAgICAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTfS92dWxrYW4vdnVsa2FuX3dpbjMyLmgKKyAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlN9L3Z1bGthbi92dWxrYW5feGNiLmgKKyAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlN9L3Z1bGthbi92dWxrYW5feGxpYi5oCisgICAgICAgICAgICAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTfS92dWxrYW4vdnVsa2FuX3hsaWJfeHJhbmRyLmgKKyAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlN9L3Z1bGthbi92dWxrYW4uaAorICAgICAgICAgICAgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSU30vdnVsa2FuL3Z1bGthbi5ocHApCisgICAgICAgIGFkZF9saWJyYXJ5KHZ1bGthbi1mcmFtZXdvcmsgU0hBUkVEICR7Tk9STUFMX0xPQURFUl9TUkNTfSAke09QVF9MT0FERVJfU1JDU30gJHtGUkFNRVdPUktfSEVBREVSU30pCisgICAgICAgIGFkZF9kZXBlbmRlbmNpZXModnVsa2FuLWZyYW1ld29yayBsb2FkZXJfYXNtX2dlbl9maWxlcykKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnModnVsa2FuLWZyYW1ld29yayBQVUJMSUMgTE9BREVSX0RZTkFNSUNfTElCKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXModnVsa2FuLWZyYW1ld29yayAtbGRsIC1scHRocmVhZCAtbG0gIi1mcmFtZXdvcmsgQ29yZUZvdW5kYXRpb24iKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXModnVsa2FuLWZyYW1ld29yayBWdWxrYW46OkhlYWRlcnMpCisKKyAgICAgICAgIyBUaGUgRlJBTUVXT1JLX1ZFUlNJT04gbmVlZHMgdG8gYmUgIkEiIGhlcmUgc28gdGhhdCBYY29kZSBjb2RlLXNpZ25pbmcgd29ya3Mgd2hlbiBhIHVzZXIgYWRkcyB0aGVpciBmcmFtZXdvcmsgdG8gYW4gWGNvZGUKKyAgICAgICAgIyBwcm9qZWN0IGFuZCBkb2VzICJTaWduIG9uIENvcHkiLiBJdCB3b3VsZCBoYXZlIGJlZW4gbmljZXIgdG8gdXNlICIxIiB0byBkZW5vdGUgVnVsa2FuIDEuIEFsdGhvdWdoIEFwcGxlIGRvY3Mgc2F5IHRoYXQgYQorICAgICAgICAjIGZyYW1ld29yayB2ZXJzaW9uIGRvZXMgbm90IGhhdmUgdG8gYmUgIkEiLCB0aGlzIHBhcnQgb2YgdGhlIEFwcGxlIHRvb2xjaGFpbiBleHBlY3RzIGl0LgorICAgICAgICAjIGh0dHBzOi8vZm9ydW1zLmRldmVsb3Blci5hcHBsZS5jb20vdGhyZWFkLzY1OTYzCisKKyMgY21ha2UtZm9ybWF0OiBvZmYKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHZ1bGthbi1mcmFtZXdvcmsgUFJPUEVSVElFUworICAgICAgICAgICAgT1VUUFVUX05BTUUgdnVsa2FuCisgICAgICAgICAgICBGUkFNRVdPUksgVFJVRQorICAgICAgICAgICAgRlJBTUVXT1JLX1ZFUlNJT04gQQorICAgICAgICAgICAgVkVSU0lPTiAiJHtWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUFKT1J9LiR7VnVsa2FuSGVhZGVyc19WRVJTSU9OX01JTk9SfS4ke1Z1bGthbkhlYWRlcnNfVkVSU0lPTl9QQVRDSH0iICMgImN1cnJlbnQgdmVyc2lvbiIKKyAgICAgICAgICAgIFNPVkVSU0lPTiAiMS4wLjAiICAgICAgICAgICAgICAgICAgICAgICAgIyAiY29tcGF0aWJpbGl0eSB2ZXJzaW9uIgorICAgICAgICAgICAgTUFDT1NYX0ZSQU1FV09SS19JREVOVElGSUVSIGNvbS5sdW5hcmcudnVsa2FuRnJhbWV3b3JrCisgICAgICAgICAgICBQVUJMSUNfSEVBREVSICIke0ZSQU1FV09SS19IRUFERVJTfSIKKyAgICAgICAgKQorICAgICAgICBpbnN0YWxsKFRBUkdFVFMgdnVsa2FuLWZyYW1ld29yaworICAgICAgICAgICAgUFVCTElDX0hFQURFUiBERVNUSU5BVElPTiB2dWxrYW4KKyAgICAgICAgICAgIEZSQU1FV09SSyBERVNUSU5BVElPTiBsb2FkZXIKKyAgICAgICAgKQorIyBjbWFrZS1mb3JtYXQ6IG9uCisgICAgZW5kaWYoKQorCisgICAgaWYoTk9UIEFQUExFKQorICAgICAgICAjIEdlbmVyYXRlIHBrZy1jb25maWcgZmlsZS4KKyAgICAgICAgaW5jbHVkZShGaW5kUGtnQ29uZmlnIFFVSUVUKQorICAgICAgICBpZihQS0dfQ09ORklHX0ZPVU5EKQorICAgICAgICAgICAgc2V0KFZLX0FQSV9WRVJTSU9OICIke1Z1bGthbkhlYWRlcnNfVkVSU0lPTl9NQUpPUn0uJHtWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUlOT1J9LiR7VnVsa2FuSGVhZGVyc19WRVJTSU9OX1BBVENIfSIpCisgICAgICAgICAgICBmb3JlYWNoKExJQiAke0NNQUtFX0NYWF9JTVBMSUNJVF9MSU5LX0xJQlJBUklFU30gJHtQTEFURk9STV9MSUJTfSkKKyAgICAgICAgICAgICAgICBzZXQoUFJJVkFURV9MSUJTICIke1BSSVZBVEVfTElCU30gLWwke0xJQn0iKQorICAgICAgICAgICAgZW5kZm9yZWFjaCgpCisgICAgICAgICAgICBjb25maWd1cmVfZmlsZSgidnVsa2FuLnBjLmluIiAidnVsa2FuLnBjIiBAT05MWSkKKyAgICAgICAgICAgIGluc3RhbGwoRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS92dWxrYW4ucGMiIERFU1RJTkFUSU9OICIke0NNQUtFX0lOU1RBTExfTElCRElSfS9wa2djb25maWciKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCit0YXJnZXRfbGlua19saWJyYXJpZXModnVsa2FuIFZ1bGthbjo6SGVhZGVycykKK2FkZF9saWJyYXJ5KFZ1bGthbjo6VnVsa2FuIEFMSUFTIHZ1bGthbikKKworaW5zdGFsbChUQVJHRVRTIHZ1bGthbgorICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9CisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0KKyAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfQklORElSfSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvTG9hZGVyQW5kTGF5ZXJJbnRlcmZhY2UubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL0xvYWRlckFuZExheWVySW50ZXJmYWNlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDkxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL0xvYWRlckFuZExheWVySW50ZXJmYWNlLm1kCkBAIC0wLDAgKzEsMjc3MyBAQAorPCEtLSBtYXJrZG93bmxpbnQtZGlzYWJsZSBNRDA0MSAtLT4KK1shW0tocm9ub3MgVnVsa2FuXVsxXV1bMl0KKworWzFdOiBodHRwczovL3Z1bGthbi5sdW5hcmcuY29tL2ltZy9WdWxrYW5fMTAwcHhfRGVjMTYucG5nICJodHRwczovL3d3dy5raHJvbm9zLm9yZy92dWxrYW4vIgorWzJdOiBodHRwczovL3d3dy5raHJvbm9zLm9yZy92dWxrYW4vCisKKyMgQXJjaGl0ZWN0dXJlIG9mIHRoZSBWdWxrYW4gTG9hZGVyIEludGVyZmFjZXMKK1shW0NyZWF0aXZlIENvbW1vbnNdWzNdXVs0XQorCis8IS0tIENvcHlyaWdodCAmY29weTsgMjAxNS0yMDE5IEx1bmFyRywgSW5jLiAtLT4KKworCitbM106IGh0dHBzOi8vaS5jcmVhdGl2ZWNvbW1vbnMub3JnL2wvYnktbmQvNC4wLzg4eDMxLnBuZyAiQ3JlYXRpdmUgQ29tbW9ucyBMaWNlbnNlIgorWzRdOiBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmQvNC4wLworIyMgVGFibGUgb2YgQ29udGVudHMKKyAgKiBbT3ZlcnZpZXddKCNvdmVydmlldykKKyAgICAqIFtXaG8gU2hvdWxkIFJlYWQgVGhpcyBEb2N1bWVudF0oI3doby1zaG91bGQtcmVhZC10aGlzLWRvY3VtZW50KQorICAgICogW1RoZSBMb2FkZXJdKCN0aGUtbG9hZGVyKQorICAgICogW0xheWVyc10oI2xheWVycykKKyAgICAqIFtJbnN0YWxsYWJsZSBDbGllbnQgRHJpdmVyc10oI2luc3RhbGxhYmxlLWNsaWVudC1kcml2ZXJzKQorICAgICogW0luc3RhbmNlIFZlcnN1cyBEZXZpY2VdKCNpbnN0YW5jZS12ZXJzdXMtZGV2aWNlKQorICAgICogW0Rpc3BhdGNoIFRhYmxlcyBhbmQgQ2FsbCBDaGFpbnNdKCNkaXNwYXRjaC10YWJsZXMtYW5kLWNhbGwtY2hhaW5zKQorCisgICogW0FwcGxpY2F0aW9uIEludGVyZmFjZSB0byB0aGUgTG9hZGVyXSgjYXBwbGljYXRpb24taW50ZXJmYWNlLXRvLXRoZS1sb2FkZXIpCisgICAgKiBbSW50ZXJmYWNpbmcgd2l0aCBWdWxrYW4gRnVuY3Rpb25zXSgjaW50ZXJmYWNpbmctd2l0aC12dWxrYW4tZnVuY3Rpb25zKQorICAgICogW0FwcGxpY2F0aW9uIExheWVyIFVzYWdlXSgjYXBwbGljYXRpb24tbGF5ZXItdXNhZ2UpCisgICAgKiBbQXBwbGljYXRpb24gVXNhZ2Ugb2YgRXh0ZW5zaW9uc10oI2FwcGxpY2F0aW9uLXVzYWdlLW9mLWV4dGVuc2lvbnMpCisKKyAgKiBbTG9hZGVyIGFuZCBMYXllciBJbnRlcmZhY2VdKCNsb2FkZXItYW5kLWxheWVyLWludGVyZmFjZSkKKyAgICAqIFtMYXllciBEaXNjb3ZlcnldKCNsYXllci1kaXNjb3ZlcnkpCisgICAgKiBbTGF5ZXIgVmVyc2lvbiBOZWdvdGlhdGlvbl0oI2xheWVyLXZlcnNpb24tbmVnb3RpYXRpb24pCisgICAgKiBbTGF5ZXIgQ2FsbCBDaGFpbnMgYW5kIERpc3RyaWJ1dGVkIERpc3BhdGNoXSgjbGF5ZXItY2FsbC1jaGFpbnMtYW5kLWRpc3RyaWJ1dGVkLWRpc3BhdGNoKQorICAgICogW0xheWVyIFVua25vd24gUGh5c2ljYWwgRGV2aWNlIEV4dGVuc2lvbnNdKCNsYXllci11bmtub3duLXBoeXNpY2FsLWRldmljZS1leHRlbnNpb25zKQorICAgICogW0xheWVyIEludGVyY2VwdCBSZXF1aXJlbWVudHNdKCNsYXllci1pbnRlcmNlcHQtcmVxdWlyZW1lbnRzKQorICAgICogW0Rpc3RyaWJ1dGVkIERpc3BhdGNoaW5nIFJlcXVpcmVtZW50c10oI2Rpc3RyaWJ1dGVkLWRpc3BhdGNoaW5nLXJlcXVpcmVtZW50cykKKyAgICAqIFtMYXllciBDb252ZW50aW9ucyBhbmQgUnVsZXNdKCNsYXllci1jb252ZW50aW9ucy1hbmQtcnVsZXMpCisgICAgKiBbTGF5ZXIgRGlzcGF0Y2ggSW5pdGlhbGl6YXRpb25dKCNsYXllci1kaXNwYXRjaC1pbml0aWFsaXphdGlvbikKKyAgICAqIFtFeGFtcGxlIENvZGUgZm9yIENyZWF0ZUluc3RhbmNlXSgjZXhhbXBsZS1jb2RlLWZvci1jcmVhdGVpbnN0YW5jZSkKKyAgICAqIFtFeGFtcGxlIENvZGUgZm9yIENyZWF0ZURldmljZV0oI2V4YW1wbGUtY29kZS1mb3ItY3JlYXRlZGV2aWNlKQorICAgICogW01ldGEtbGF5ZXJzXSgjbWV0YS1sYXllcnMpCisgICAgKiBbUHJlLUluc3RhbmNlIEZ1bmN0aW9uc10oI3ByZS1pbnN0YW5jZS1mdW5jdGlvbnMpCisgICAgKiBbU3BlY2lhbCBDb25zaWRlcmF0aW9uc10oI3NwZWNpYWwtY29uc2lkZXJhdGlvbnMpCisgICAgKiBbTGF5ZXIgTWFuaWZlc3QgRmlsZSBGb3JtYXRdKCNsYXllci1tYW5pZmVzdC1maWxlLWZvcm1hdCkKKyAgICAqIFtMYXllciBMaWJyYXJ5IFZlcnNpb25zXSgjbGF5ZXItbGlicmFyeS12ZXJzaW9ucykKKworICAqIFtWdWxrYW4gSW5zdGFsbGFibGUgQ2xpZW50IERyaXZlciBpbnRlcmZhY2Ugd2l0aCB0aGUgbG9hZGVyXSgjdnVsa2FuLWluc3RhbGxhYmxlLWNsaWVudC1kcml2ZXItaW50ZXJmYWNlLXdpdGgtdGhlLWxvYWRlcikKKyAgICAqIFtJQ0QgRGlzY292ZXJ5XSgjaWNkLWRpc2NvdmVyeSkKKyAgICAqIFtJQ0QgTWFuaWZlc3QgRmlsZSBGb3JtYXRdKCNpY2QtbWFuaWZlc3QtZmlsZS1mb3JtYXQpCisgICAgKiBbSUNEIFZ1bGthbiBFbnRyeSBQb2ludCBEaXNjb3ZlcnldKCNpY2QtdnVsa2FuLWVudHJ5LXBvaW50LWRpc2NvdmVyeSkKKyAgICAqIFtJQ0QgQVBJIFZlcnNpb25dKCNpY2QtYXBpLXZlcnNpb24pCisgICAgKiBbSUNEIFVua25vd24gUGh5c2ljYWwgRGV2aWNlIEV4dGVuc2lvbnNdKCNpY2QtdW5rbm93bi1waHlzaWNhbC1kZXZpY2UtZXh0ZW5zaW9ucykKKyAgICAqIFtJQ0QgRGlzcGF0Y2hhYmxlIE9iamVjdCBDcmVhdGlvbl0oI2ljZC1kaXNwYXRjaGFibGUtb2JqZWN0LWNyZWF0aW9uKQorICAgICogW0hhbmRsaW5nIEtIUiBTdXJmYWNlIE9iamVjdHMgaW4gV1NJIEV4dGVuc2lvbnNdKCNoYW5kbGluZy1raHItc3VyZmFjZS1vYmplY3RzLWluLXdzaS1leHRlbnNpb25zKQorICAgICogW0xvYWRlciBhbmQgSUNEIEludGVyZmFjZSBOZWdvdGlhdGlvbl0oI2xvYWRlci1hbmQtaWNkLWludGVyZmFjZS1uZWdvdGlhdGlvbikKKworICAqIFtUYWJsZSBvZiBEZWJ1ZyBFbnZpcm9ubWVudCBWYXJpYWJsZXNdKCN0YWJsZS1vZi1kZWJ1Zy1lbnZpcm9ubWVudC12YXJpYWJsZXMpCisgICogW0dsb3NzYXJ5IG9mIFRlcm1zXSgjZ2xvc3Nhcnktb2YtdGVybXMpCisgCisjIyBPdmVydmlldworCitWdWxrYW4gaXMgYSBsYXllcmVkIGFyY2hpdGVjdHVyZSwgbWFkZSB1cCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgorICAqIFRoZSBWdWxrYW4gQXBwbGljYXRpb24KKyAgKiBbVGhlIFZ1bGthbiBMb2FkZXJdKCN0aGUtbG9hZGVyKQorICAqIFtWdWxrYW4gTGF5ZXJzXSgjbGF5ZXJzKQorICAqIFtJbnN0YWxsYWJsZSBDbGllbnQgRHJpdmVycyAoSUNEcyldKCNpbnN0YWxsYWJsZS1jbGllbnQtZHJpdmVycykKKworIVtIaWdoIExldmVsIFZpZXcgb2YgTG9hZGVyXSguL2ltYWdlcy9oaWdoX2xldmVsX2xvYWRlci5wbmcpCisKK1RoZSBnZW5lcmFsIGNvbmNlcHRzIGluIHRoaXMgZG9jdW1lbnQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGxvYWRlcnMgYXZhaWxhYmxlCitmb3IgV2luZG93cywgTGludXgsIEFuZHJvaWQsIGFuZCBtYWNPUyBzeXN0ZW1zLgorCisKKyMjIyMgV2hvIFNob3VsZCBSZWFkIFRoaXMgRG9jdW1lbnQKKworV2hpbGUgdGhpcyBkb2N1bWVudCBpcyBwcmltYXJpbHkgdGFyZ2V0ZWQgYXQgZGV2ZWxvcGVycyBvZiBWdWxrYW4gYXBwbGljYXRpb25zLAorZHJpdmVycyBhbmQgbGF5ZXJzLCB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIGl0IGNvdWxkIGJlIHVzZWZ1bCB0byBhbnlvbmUKK3dhbnRpbmcgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgVnVsa2FuIHJ1bnRpbWUuCisKKworIyMjIyBUaGUgTG9hZGVyCisKK1RoZSBhcHBsaWNhdGlvbiBzaXRzIG9uIG9uZSBlbmQgb2YsIGFuZCBpbnRlcmZhY2VzIGRpcmVjdGx5IHdpdGgsIHRoZQorbG9hZGVyLiAgT24gdGhlIG90aGVyIGVuZCBvZiB0aGUgbG9hZGVyIGZyb20gdGhlIGFwcGxpY2F0aW9uIGFyZSB0aGUgSUNEcywgd2hpY2gKK2NvbnRyb2wgdGhlIFZ1bGthbi1jYXBhYmxlIGhhcmR3YXJlLiAgQW4gaW1wb3J0YW50IHBvaW50IHRvIHJlbWVtYmVyIGlzIHRoYXQKK1Z1bGthbi1jYXBhYmxlIGhhcmR3YXJlIGNhbiBiZSBncmFwaGljcy1iYXNlZCwgY29tcHV0ZS1iYXNlZCwgb3IgYm90aC4gQmV0d2VlbgordGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgSUNEcyB0aGUgbG9hZGVyIGNhbiBpbmplY3QgYSBudW1iZXIgb2Ygb3B0aW9uYWwKK1tsYXllcnNdKCNsYXllcnMpIHRoYXQgcHJvdmlkZSBzcGVjaWFsIGZ1bmN0aW9uYWxpdHkuCisKK1RoZSBsb2FkZXIgaXMgcmVzcG9uc2libGUgZm9yIHdvcmtpbmcgd2l0aCB0aGUgdmFyaW91cyBsYXllcnMgYXMgd2VsbCBhcworc3VwcG9ydGluZyBtdWx0aXBsZSBHUFVzIGFuZCB0aGVpciBkcml2ZXJzLiAgQW55IFZ1bGthbiBmdW5jdGlvbiBtYXkKK3dpbmQgdXAgY2FsbGluZyBpbnRvIGEgZGl2ZXJzZSBzZXQgb2YgbW9kdWxlczogbG9hZGVyLCBsYXllcnMsIGFuZCBJQ0RzLgorVGhlIGxvYWRlciBpcyBjcml0aWNhbCB0byBtYW5hZ2luZyB0aGUgcHJvcGVyIGRpc3BhdGNoaW5nIG9mIFZ1bGthbgorZnVuY3Rpb25zIHRvIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2YgbGF5ZXJzIGFuZCBJQ0RzLiBUaGUgVnVsa2FuIG9iamVjdAorbW9kZWwgYWxsb3dzIHRoZSBsb2FkZXIgdG8gaW5zZXJ0IGxheWVycyBpbnRvIGEgY2FsbCBjaGFpbiBzbyB0aGF0IHRoZSBsYXllcnMKK2NhbiBwcm9jZXNzIFZ1bGthbiBmdW5jdGlvbnMgcHJpb3IgdG8gdGhlIElDRCBiZWluZyBjYWxsZWQuCisKK1RoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhbiBvdmVydmlldyBvZiB0aGUgbmVjZXNzYXJ5IGludGVyZmFjZXMKK2JldHdlZW4gZWFjaCBvZiB0aGVzZS4KKworCisjIyMjIyBHb2FscyBvZiB0aGUgTG9hZGVyCisKK1RoZSBsb2FkZXIgd2FzIGRlc2lnbmVkIHdpdGggdGhlIGZvbGxvd2luZyBnb2FscyBpbiBtaW5kLgorIDEuIFN1cHBvcnQgb25lIG9yIG1vcmUgVnVsa2FuLWNhcGFibGUgSUNEIG9uIGEgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSB3aXRob3V0Cit0aGVtIGludGVyZmVyaW5nIHdpdGggb25lIGFub3RoZXIuCisgMi4gU3VwcG9ydCBWdWxrYW4gTGF5ZXJzIHdoaWNoIGFyZSBvcHRpb25hbCBtb2R1bGVzIHRoYXQgY2FuIGJlIGVuYWJsZWQgYnkgYW4KK2FwcGxpY2F0aW9uLCBkZXZlbG9wZXIsIG9yIHN0YW5kYXJkIHN5c3RlbSBzZXR0aW5ncy4KKyAzLiBJbXBhY3QgdGhlIG92ZXJhbGwgcGVyZm9ybWFuY2Ugb2YgYSBWdWxrYW4gYXBwbGljYXRpb24gaW4gdGhlIGxvd2VzdAorcG9zc2libGUgZmFzaGlvbi4KKworCisjIyMjIExheWVycworCitMYXllcnMgYXJlIG9wdGlvbmFsIGNvbXBvbmVudHMgdGhhdCBhdWdtZW50IHRoZSBWdWxrYW4gc3lzdGVtLiAgVGhleSBjYW4KK2ludGVyY2VwdCwgZXZhbHVhdGUsIGFuZCBtb2RpZnkgZXhpc3RpbmcgVnVsa2FuIGZ1bmN0aW9ucyBvbiB0aGVpciB3YXkgZnJvbSB0aGUKK2FwcGxpY2F0aW9uIGRvd24gdG8gdGhlIGhhcmR3YXJlLiAgTGF5ZXJzIGFyZSBpbXBsZW1lbnRlZCBhcyBsaWJyYXJpZXMgdGhhdCBjYW4KK2JlIGVuYWJsZWQgaW4gZGlmZmVyZW50IHdheXMgKGluY2x1ZGluZyBieSBhcHBsaWNhdGlvbiByZXF1ZXN0KSBhbmQgYXJlIGxvYWRlZAorZHVyaW5nIENyZWF0ZUluc3RhbmNlLiAgRWFjaCBsYXllciBjYW4gY2hvb3NlIHRvIGhvb2sgKGludGVyY2VwdCkgYW55IFZ1bGthbgorZnVuY3Rpb25zIHdoaWNoIGluIHR1cm4gY2FuIGJlIGlnbm9yZWQgb3IgYXVnbWVudGVkLiAgQSBsYXllciBkb2VzIG5vdCBuZWVkIHRvCitpbnRlcmNlcHQgYWxsIFZ1bGthbiBmdW5jdGlvbnMuICBJdCBtYXkgY2hvb3NlIHRvIGludGVyY2VwdCBhbGwga25vd24gZnVuY3Rpb25zLAorb3IsIGl0IG1heSBjaG9vc2UgdG8gaW50ZXJjZXB0IG9ubHkgb25lIGZ1bmN0aW9uLgorCitTb21lIGV4YW1wbGVzIG9mIGZlYXR1cmVzIHRoYXQgbGF5ZXJzIG1heSBleHBvc2UgaW5jbHVkZToKKyAqIFZhbGlkYXRpbmcgQVBJIHVzYWdlCisgKiBBZGRpbmcgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBWdWxrYW4gQVBJIHRyYWNpbmcgYW5kIGRlYnVnZ2luZworICogT3ZlcmxheSBhZGRpdGlvbmFsIGNvbnRlbnQgb24gdGhlIGFwcGxpY2F0aW9uJ3Mgc3VyZmFjZXMKKworQmVjYXVzZSBsYXllcnMgYXJlIG9wdGlvbmFsLCB5b3UgbWF5IGNob29zZSB0byBlbmFibGUgbGF5ZXJzIGZvciBkZWJ1Z2dpbmcKK3lvdXIgYXBwbGljYXRpb24sIGJ1dCB0aGVuIGRpc2FibGUgYW55IGxheWVyIHVzYWdlIHdoZW4geW91IHJlbGVhc2UgeW91cgorcHJvZHVjdC4KKworCisjIyMjIEluc3RhbGxhYmxlIENsaWVudCBEcml2ZXJzCisKK1Z1bGthbiBhbGxvd3MgbXVsdGlwbGUgSW5zdGFsbGFibGUgQ2xpZW50IERyaXZlcnMgKElDRHMpIGVhY2ggc3VwcG9ydGluZyBvbmUKK29yIG1vcmUgZGV2aWNlcyAocmVwcmVzZW50ZWQgYnkgYSBWdWxrYW4gYFZrUGh5c2ljYWxEZXZpY2VgIG9iamVjdCkgdG8gYmUgdXNlZAorY29sbGVjdGl2ZWx5LiBUaGUgbG9hZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNjb3ZlcmluZyBhdmFpbGFibGUgVnVsa2FuIElDRHMgb24KK3RoZSBzeXN0ZW0uIEdpdmVuIGEgbGlzdCBvZiBhdmFpbGFibGUgSUNEcywgdGhlIGxvYWRlciBjYW4gZW51bWVyYXRlIGFsbCB0aGUKK3BoeXNpY2FsIGRldmljZXMgYXZhaWxhYmxlICBmb3IgYW4gYXBwbGljYXRpb24gYW5kIHJldHVybiB0aGlzIGluZm9ybWF0aW9uIHRvCit0aGUgYXBwbGljYXRpb24uCisKKworIyMjIyBJbnN0YW5jZSBWZXJzdXMgRGV2aWNlCisKK1RoZXJlIGlzIGFuIGltcG9ydGFudCBjb25jZXB0IHdoaWNoIHlvdSB3aWxsIHNlZSBicm91Z2h0IHVwIHJlcGVhdGVkbHkKK3Rocm91Z2hvdXQgdGhpcyBkb2N1bWVudC4gIE1hbnkgZnVuY3Rpb25zLCBleHRlbnNpb25zLCBhbmQgb3RoZXIgdGhpbmdzIGluCitWdWxrYW4gYXJlIHNlcGFyYXRlZCBpbnRvIHR3byBtYWluIGdyb3VwczoKKyAqIEluc3RhbmNlLXJlbGF0ZWQgT2JqZWN0cworICogRGV2aWNlLXJlbGF0ZWQgT2JqZWN0cworCisKKyMjIyMjIEluc3RhbmNlLXJlbGF0ZWQgT2JqZWN0cworCitBIFZ1bGthbiBJbnN0YW5jZSBpcyBhIGhpZ2gtbGV2ZWwgY29uc3RydWN0IHVzZWQgdG8gcHJvdmlkZSBWdWxrYW4gc3lzdGVtLWxldmVsCitpbmZvcm1hdGlvbiwgb3IgZnVuY3Rpb25hbGl0eS4gIFZ1bGthbiBvYmplY3RzIGFzc29jaWF0ZWQgZGlyZWN0bHkgd2l0aCBhbgoraW5zdGFuY2UgYXJlOgorICogYFZrSW5zdGFuY2VgCisgKiBgVmtQaHlzaWNhbERldmljZWAKKworQW4gSW5zdGFuY2UgZnVuY3Rpb24gaXMgYW55IFZ1bGthbiBmdW5jdGlvbiB3aGljaCB0YWtlcyBhcyBpdHMgZmlyc3QgcGFyYW1ldGVyCitlaXRoZXIgYW4gb2JqZWN0IGZyb20gdGhlIEluc3RhbmNlIGxpc3QsIG9yIG5vdGhpbmcgYXQgYWxsLiAgU29tZSBWdWxrYW4KK0luc3RhbmNlIGZ1bmN0aW9ucyBhcmU6CisgKiBgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNgCisgKiBgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXNgCisgKiBgdmtDcmVhdGVJbnN0YW5jZWAKKyAqIGB2a0Rlc3Ryb3lJbnN0YW5jZWAKKworWW91IHF1ZXJ5IFZ1bGthbiBJbnN0YW5jZSBmdW5jdGlvbnMgdXNpbmcgYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAuCitgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCBjYW4gYmUgdXNlZCB0byBxdWVyeSBlaXRoZXIgZGV2aWNlIG9yIGluc3RhbmNlIGVudHJ5Citwb2ludHMgaW4gYWRkaXRpb24gdG8gYWxsIGNvcmUgZW50cnkgcG9pbnRzLiAgVGhlIHJldHVybmVkIGZ1bmN0aW9uIHBvaW50ZXIgaXMKK3ZhbGlkIGZvciB0aGlzIEluc3RhbmNlIGFuZCBhbnkgb2JqZWN0IGNyZWF0ZWQgdW5kZXIgdGhpcyBJbnN0YW5jZSAoaW5jbHVkaW5nCithbGwgYFZrRGV2aWNlYCBvYmplY3RzKS4gIAorCitTaW1pbGFybHksIGFuIEluc3RhbmNlIGV4dGVuc2lvbiBpcyBhIHNldCBvZiBWdWxrYW4gSW5zdGFuY2UgZnVuY3Rpb25zIGV4dGVuZGluZwordGhlIFZ1bGthbiBsYW5ndWFnZS4gIFRoZXNlIHdpbGwgYmUgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsIGxhdGVyLgorCisKKyMjIyMjIERldmljZS1yZWxhdGVkIE9iamVjdHMKKworQSBWdWxrYW4gRGV2aWNlLCBvbiB0aGUgb3RoZXItaGFuZCwgaXMgYSBsb2dpY2FsIGlkZW50aWZpZXIgdXNlZCB0byBhc3NvY2lhdGUKK2Z1bmN0aW9ucyB3aXRoIGEgcGFydGljdWxhciBwaHlzaWNhbCBkZXZpY2Ugb24gYSB1c2VyJ3Mgc3lzdGVtLiAgVnVsa2FuCitjb25zdHJ1Y3RzIGFzc29jaWF0ZWQgZGlyZWN0bHkgd2l0aCBhIGRldmljZSBpbmNsdWRlOgorICogYFZrRGV2aWNlYAorICogYFZrUXVldWVgCisgKiBgVmtDb21tYW5kQnVmZmVyYAorICogQW55IGRpc3BhdGNoYWJsZSBvYmplY3QgdGhhdCBpcyBhIGNoaWxkIG9mIG9uZSBvZiB0aGUgYWJvdmUKKworQSBEZXZpY2UgZnVuY3Rpb24gaXMgYW55IFZ1bGthbiBmdW5jdGlvbiB3aGljaCB0YWtlcyBhbnkgRGV2aWNlIE9iamVjdCBhcyBpdHMKK2ZpcnN0IHBhcmFtZXRlci4gIFNvbWUgVnVsa2FuIERldmljZSBmdW5jdGlvbnMgYXJlOgorICogYHZrUXVldWVTdWJtaXRgCisgKiBgdmtCZWdpbkNvbW1hbmRCdWZmZXJgCisgKiBgdmtDcmVhdGVFdmVudGAKKworWW91IGNhbiBxdWVyeSBWdWxrYW4gRGV2aWNlIGZ1bmN0aW9ucyB1c2luZyBlaXRoZXIgYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAgb3IgCitgdmtHZXREZXZpY2VQcm9jQWRkcmAuICBJZiB5b3UgY2hvb3NlIHRvIHVzZSBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCwgaXQgd2lsbAoraGF2ZSBhbiBhZGRpdGlvbmFsIGxldmVsIGJ1aWx0IGludG8gdGhlIGNhbGwgY2hhaW4sIHdoaWNoIHdpbGwgcmVkdWNlCitwZXJmb3JtYW5jZSBzbGlnaHRseS4gIEhvd2V2ZXIsIHRoZSBmdW5jdGlvbiBwb2ludGVyIHJldHVybmVkIGNhbiBiZSB1c2VkIGZvcgorYW55IGRldmljZSBjcmVhdGVkIGxhdGVyLCBhcyBsb25nIGFzIGl0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBWdWxrYW4KK0luc3RhbmNlLiBJZiwgaW5zdGVhZCB5b3UgdXNlIGB2a0dldERldmljZVByb2NBZGRyYCwgdGhlIGNhbGwgY2hhaW4gd2lsbCBiZSBtb3JlCitvcHRpbWl6ZWQgdG8gdGhlIHNwZWNpZmljIGRldmljZSwgYnV0IGl0IHdpbGwgKipvbmx5Kiogd29yayBmb3IgdGhlIGRldmljZSB1c2VkCit0byBxdWVyeSB0aGUgZnVuY3Rpb24gZnVuY3Rpb24gcG9pbnRlci4gIEFsc28sIHVubGlrZSBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCwKK2B2a0dldERldmljZVByb2NBZGRyYCBjYW4gb25seSBiZSB1c2VkIG9uIGNvcmUgVnVsa2FuIERldmljZSBmdW5jdGlvbnMsIG9yCitEZXZpY2UgZXh0ZW5zaW9uIGZ1bmN0aW9ucy4KKworVGhlIGJlc3Qgc29sdXRpb24gaXMgdG8gcXVlcnkgSW5zdGFuY2UgZXh0ZW5zaW9uIGZ1bmN0aW9ucyB1c2luZworYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAsIGFuZCB0byBxdWVyeSBEZXZpY2UgZXh0ZW5zaW9uIGZ1bmN0aW9ucyB1c2luZworYHZrR2V0RGV2aWNlUHJvY0FkZHJgLiAgU2VlCitbQmVzdCBBcHBsaWNhdGlvbiBQZXJmb3JtYW5jZSBTZXR1cF0oI2Jlc3QtYXBwbGljYXRpb24tcGVyZm9ybWFuY2Utc2V0dXApIGZvcgorbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLgorCitBcyB3aXRoIEluc3RhbmNlIGV4dGVuc2lvbnMsIGEgRGV2aWNlIGV4dGVuc2lvbiBpcyBhIHNldCBvZiBWdWxrYW4gRGV2aWNlCitmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBWdWxrYW4gbGFuZ3VhZ2UuIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IHRoZXNlIGxhdGVyIGluCit0aGUgZG9jdW1lbnQuCisKKworIyMjIyBEaXNwYXRjaCBUYWJsZXMgYW5kIENhbGwgQ2hhaW5zCisKK1Z1bGthbiB1c2VzIGFuIG9iamVjdCBtb2RlbCB0byBjb250cm9sIHRoZSBzY29wZSBvZiBhIHBhcnRpY3VsYXIgYWN0aW9uIG9yCitvcGVyYXRpb24uICBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIG9uIGlzIGFsd2F5cyB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIGEgVnVsa2FuCitjYWxsIGFuZCBpcyBhIGRpc3BhdGNoYWJsZSBvYmplY3QgKHNlZSBWdWxrYW4gc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDIuMyBPYmplY3QKK01vZGVsKS4gIFVuZGVyIHRoZSBjb3ZlcnMsIHRoZSBkaXNwYXRjaGFibGUgb2JqZWN0IGhhbmRsZSBpcyBhIHBvaW50ZXIgdG8gYQorc3RydWN0dXJlLCB3aGljaCBpbiB0dXJuLCBjb250YWlucyBhIHBvaW50ZXIgdG8gYSBkaXNwYXRjaCB0YWJsZSBtYWludGFpbmVkIGJ5Cit0aGUgbG9hZGVyLiAgVGhpcyBkaXNwYXRjaCB0YWJsZSBjb250YWlucyBwb2ludGVycyB0byB0aGUgVnVsa2FuIGZ1bmN0aW9ucworYXBwcm9wcmlhdGUgdG8gdGhhdCBvYmplY3QuCisKK1RoZXJlIGFyZSB0d28gdHlwZXMgb2YgZGlzcGF0Y2ggdGFibGVzIHRoZSBsb2FkZXIgbWFpbnRhaW5zOgorIC0gSW5zdGFuY2UgRGlzcGF0Y2ggVGFibGUKKyAgIC0gQ3JlYXRlZCBpbiB0aGUgbG9hZGVyIGR1cmluZyB0aGUgY2FsbCB0byBgdmtDcmVhdGVJbnN0YW5jZWAKKyAtIERldmljZSBEaXNwYXRjaCBUYWJsZQorICAgLSBDcmVhdGVkIGluIHRoZSBsb2FkZXIgZHVyaW5nIHRoZSBjYWxsIHRvIGB2a0NyZWF0ZURldmljZWAKKworQXQgdGhhdCB0aW1lIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIHN5c3RlbSBjYW4gZWFjaCBzcGVjaWZ5IG9wdGlvbmFsIGxheWVycyB0byBiZQoraW5jbHVkZWQuICBUaGUgbG9hZGVyIHdpbGwgaW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIGxheWVycyB0byBjcmVhdGUgYSBjYWxsCitjaGFpbiBmb3IgZWFjaCBWdWxrYW4gZnVuY3Rpb24gYW5kIGVhY2ggZW50cnkgb2YgdGhlIGRpc3BhdGNoIHRhYmxlIHdpbGwgcG9pbnQKK3RvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoYXQgY2hhaW4uIFRodXMsIHRoZSBsb2FkZXIgYnVpbGRzIGFuIGluc3RhbmNlIGNhbGwKK2NoYWluIGZvciBlYWNoIGBWa0luc3RhbmNlYCB0aGF0IGlzIGNyZWF0ZWQgYW5kIGEgZGV2aWNlIGNhbGwgY2hhaW4gZm9yIGVhY2gKK2BWa0RldmljZWAgdGhhdCBpcyBjcmVhdGVkLgorCitXaGVuIGFuIGFwcGxpY2F0aW9uIGNhbGxzIGEgVnVsa2FuIGZ1bmN0aW9uLCB0aGlzIHR5cGljYWxseSB3aWxsIGZpcnN0IGhpdCBhCisqdHJhbXBvbGluZSogZnVuY3Rpb24gaW4gdGhlIGxvYWRlci4gIFRoZXNlICp0cmFtcG9saW5lKiBmdW5jdGlvbnMgYXJlIHNtYWxsLAorc2ltcGxlIGZ1bmN0aW9ucyB0aGF0IGp1bXAgdG8gdGhlIGFwcHJvcHJpYXRlIGRpc3BhdGNoIHRhYmxlIGVudHJ5IGZvciB0aGUKK29iamVjdCB0aGV5IGFyZSBnaXZlbi4gIEFkZGl0aW9uYWxseSwgZm9yIGZ1bmN0aW9ucyBpbiB0aGUgaW5zdGFuY2UgY2FsbCBjaGFpbiwKK3RoZSBsb2FkZXIgaGFzIGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24sIGNhbGxlZCBhICp0ZXJtaW5hdG9yKiwgd2hpY2ggaXMgY2FsbGVkCithZnRlciBhbGwgZW5hYmxlZCBsYXllcnMgdG8gbWFyc2hhbGwgdGhlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIHRvIGFsbAorYXZhaWxhYmxlIElDRHMuCisKKworIyMjIyMgSW5zdGFuY2UgQ2FsbCBDaGFpbiBFeGFtcGxlCisKK0ZvciBleGFtcGxlLCB0aGUgZGlhZ3JhbSBiZWxvdyByZXByZXNlbnRzIHdoYXQgaGFwcGVucyBpbiB0aGUgY2FsbCBjaGFpbiBmb3IKK2B2a0NyZWF0ZUluc3RhbmNlYC4gQWZ0ZXIgaW5pdGlhbGl6aW5nIHRoZSBjaGFpbiwgdGhlIGxvYWRlciB3aWxsIGNhbGwgaW50byB0aGUKK2ZpcnN0IGxheWVyJ3MgYHZrQ3JlYXRlSW5zdGFuY2VgIHdoaWNoIHdpbGwgY2FsbCB0aGUgbmV4dCBmaW5hbGx5IHRlcm1pbmF0aW5nIGluCit0aGUgbG9hZGVyIGFnYWluIHdoZXJlIHRoaXMgZnVuY3Rpb24gY2FsbHMgZXZlcnkgSUNEJ3MgYHZrQ3JlYXRlSW5zdGFuY2VgIGFuZAorc2F2ZXMgdGhlIHJlc3VsdHMuIFRoaXMgYWxsb3dzIGV2ZXJ5IGVuYWJsZWQgbGF5ZXIgZm9yIHRoaXMgY2hhaW4gdG8gc2V0IHVwCit3aGF0IGl0IG5lZWRzIGJhc2VkIG9uIHRoZSBgVmtJbnN0YW5jZUNyZWF0ZUluZm9gIHN0cnVjdHVyZSBmcm9tIHRoZQorYXBwbGljYXRpb24uCisKKyFbSW5zdGFuY2UgQ2FsbCBDaGFpbl0oLi9pbWFnZXMvbG9hZGVyX2luc3RhbmNlX2NoYWluLnBuZykKKworVGhpcyBhbHNvIGhpZ2hsaWdodHMgc29tZSBvZiB0aGUgY29tcGxleGl0eSB0aGUgbG9hZGVyIG11c3QgbWFuYWdlIHdoZW4gdXNpbmcKK2luc3RhbmNlIGNhbGwgY2hhaW5zLiBBcyBzaG93biBoZXJlLCB0aGUgbG9hZGVyJ3MgKnRlcm1pbmF0b3IqIG11c3QgYWdncmVnYXRlCitpbmZvcm1hdGlvbiB0byBhbmQgZnJvbSBtdWx0aXBsZSBJQ0RzIHdoZW4gdGhleSBhcmUgcHJlc2VudC4gVGhpcyBpbXBsaWVzIHRoYXQKK3RoZSBsb2FkZXIgaGFzIHRvIGJlIGF3YXJlIG9mIGFueSBpbnN0YW5jZS1sZXZlbCBleHRlbnNpb25zIHdoaWNoIHdvcmsgb24gYQorYFZrSW5zdGFuY2VgIHRvIGFnZ3JlZ2F0ZSB0aGVtIGNvcnJlY3RseS4KKworCisjIyMjIyBEZXZpY2UgQ2FsbCBDaGFpbiBFeGFtcGxlCisKK0RldmljZSBjYWxsIGNoYWlucyBhcmUgY3JlYXRlZCBhdCBgdmtDcmVhdGVEZXZpY2VgIGFuZCBhcmUgZ2VuZXJhbGx5IHNpbXBsZXIKK2JlY2F1c2UgdGhleSBkZWFsIHdpdGggb25seSBhIHNpbmdsZSBkZXZpY2UgYW5kIHRoZSBJQ0QgY2FuIGFsd2F5cyBiZSB0aGUKKyp0ZXJtaW5hdG9yKiBvZiB0aGUgY2hhaW4uIAorCishW0xvYWRlciBEZXZpY2UgQ2FsbCBDaGFpbl0oLi9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9sb2FkZXIucG5nKQorCisKKzxici8+Cis8YnIvPgorCisjIyBBcHBsaWNhdGlvbiBJbnRlcmZhY2UgdG8gdGhlIExvYWRlcgorCitJbiB0aGlzIHNlY3Rpb24gd2UnbGwgZGlzY3VzcyBob3cgYW4gYXBwbGljYXRpb24gaW50ZXJhY3RzIHdpdGggdGhlIGxvYWRlciwKK2luY2x1ZGluZzoKKyAgKiBbSW50ZXJmYWNpbmcgd2l0aCBWdWxrYW4gRnVuY3Rpb25zXSgjaW50ZXJmYWNpbmctd2l0aC12dWxrYW4tZnVuY3Rpb25zKQorICAgICogW1Z1bGthbiBEaXJlY3QgRXhwb3J0c10oI3Z1bGthbi1kaXJlY3QtZXhwb3J0cykKKyAgICAqIFtEaXJlY3RseSBMaW5raW5nIHRvIHRoZSBMb2FkZXJdKCNkaXJlY3RseS1saW5raW5nLXRvLXRoZS1sb2FkZXIpCisgICAgICAqIFtEeW5hbWljIExpbmtpbmddKCNkeW5hbWljLWxpbmtpbmcpCisgICAgICAqIFtTdGF0aWMgTGlua2luZ10oI3N0YXRpYy1saW5raW5nKQorICAgICogW0luZGlyZWN0bHkgTGlua2luZyB0byB0aGUgTG9hZGVyXSgjaW5kaXJlY3RseS1saW5raW5nLXRvLXRoZS1sb2FkZXIpCisgICAgKiBbQmVzdCBBcHBsaWNhdGlvbiBQZXJmb3JtYW5jZSBTZXR1cF0oI2Jlc3QtYXBwbGljYXRpb24tcGVyZm9ybWFuY2Utc2V0dXApCisgICAgKiBbQUJJIFZlcnNpb25pbmddKCNhYmktdmVyc2lvbmluZykKKyAgKiBbQXBwbGljYXRpb24gTGF5ZXIgVXNhZ2VdKCNhcHBsaWNhdGlvbi1sYXllci11c2FnZSkKKyAgICAqIFtJbXBsaWNpdCB2cyBFeHBsaWNpdCBMYXllcnNdKCNpbXBsaWNpdC12cy1leHBsaWNpdC1sYXllcnMpCisgICAgKiBbRm9yY2luZyBMYXllciBTb3VyY2UgRm9sZGVyc10oI2ZvcmNpbmctbGF5ZXItc291cmNlLWZvbGRlcnMpCisgICAgKiBbRm9yY2luZyBMYXllcnMgdG8gYmUgRW5hYmxlZF0oI2ZvcmNpbmctbGF5ZXJzLXRvLWJlLWVuYWJsZWQpCisgICAgKiBbT3ZlcmFsbCBMYXllciBPcmRlcmluZ10oI292ZXJhbGwtbGF5ZXItb3JkZXJpbmcpCisgICogW0FwcGxpY2F0aW9uIFVzYWdlIG9mIEV4dGVuc2lvbnNdKCNhcHBsaWNhdGlvbi11c2FnZS1vZi1leHRlbnNpb25zKQorICAgICogW0luc3RhbmNlIGFuZCBEZXZpY2UgRXh0ZW5zaW9uc10oI2luc3RhbmNlLWFuZC1kZXZpY2UtZXh0ZW5zaW9ucykKKyAgICAqIFtXU0kgRXh0ZW5zaW9uc10oI3dzaS1leHRlbnNpb25zKQorICAgICogW1Vua25vd24gRXh0ZW5zaW9uc10oI3Vua25vd24tZXh0ZW5zaW9ucykKKworICAKKyMjIyMgSW50ZXJmYWNpbmcgd2l0aCBWdWxrYW4gRnVuY3Rpb25zCitUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHlvdSBjYW4gaW50ZXJmYWNlIHdpdGggVnVsa2FuIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZQorbG9hZGVyLgorCisKKyMjIyMjIFZ1bGthbiBEaXJlY3QgRXhwb3J0cworVGhlIGxvYWRlciBsaWJyYXJ5IG9uIFdpbmRvd3MsIExpbnV4LCBBbmRyb2lkLCBhbmQgbWFjT1Mgd2lsbCBleHBvcnQgYWxsIGNvcmUgVnVsa2FuCithbmQgYWxsIGFwcHJvcHJpYXRlIFdpbmRvdyBTeXN0ZW0gSW50ZXJmYWNlIChXU0kpIGV4dGVuc2lvbnMuIFRoaXMgaXMgZG9uZSB0bworbWFrZSBpdCBzaW1wbGVyIHRvIGdldCBzdGFydGVkIHdpdGggVnVsa2FuIGRldmVsb3BtZW50LiBXaGVuIGFuIGFwcGxpY2F0aW9uCitsaW5rcyBkaXJlY3RseSB0byB0aGUgbG9hZGVyIGxpYnJhcnkgaW4gdGhpcyB3YXksIHRoZSBWdWxrYW4gY2FsbHMgYXJlIHNpbXBsZQorKnRyYW1wb2xpbmUqIGZ1bmN0aW9ucyB0aGF0IGp1bXAgdG8gdGhlIGFwcHJvcHJpYXRlIGRpc3BhdGNoIHRhYmxlIGVudHJ5IGZvciB0aGUKK29iamVjdCB0aGV5IGFyZSBnaXZlbi4KKworCisjIyMjIyBEaXJlY3RseSBMaW5raW5nIHRvIHRoZSBMb2FkZXIKKworIyMjIyMjIER5bmFtaWMgTGlua2luZworVGhlIGxvYWRlciBpcyBvcmRpbmFyaWx5IGRpc3RyaWJ1dGVkIGFzIGEgZHluYW1pYyBsaWJyYXJ5ICguZGxsIG9uIFdpbmRvd3Mgb3IKKy5zbyBvbiBMaW51eCBvciAuZHlsaWIgb24gbWFjT1MpIHdoaWNoIGdldHMgaW5zdGFsbGVkIHRvIHRoZSBzeXN0ZW0gcGF0aAorZm9yIGR5bmFtaWMgbGlicmFyaWVzLgorTGlua2luZyB0byB0aGUgZHluYW1pYyBsaWJyYXJ5IGlzIGdlbmVyYWxseSB0aGUgcHJlZmVycmVkIG1ldGhvZCBvZiBsaW5raW5nIHRvCit0aGUgbG9hZGVyLCBhcyBkb2luZyBzbyBhbGxvd3MgdGhlIGxvYWRlciB0byBiZSB1cGRhdGVkIGZvciBidWcgZml4ZXMgYW5kCitpbXByb3ZlbWVudHMuIEZ1cnRoZXJtb3JlLCB0aGUgZHluYW1pYyBsaWJyYXJ5IGlzIGdlbmVyYWxseSBpbnN0YWxsZWQgdG8gV2luZG93cworc3lzdGVtcyBhcyBwYXJ0IG9mIGRyaXZlciBpbnN0YWxsYXRpb24gYW5kIGlzIGdlbmVyYWxseSBwcm92aWRlZCBvbiBMaW51eAordGhyb3VnaCB0aGUgc3lzdGVtIHBhY2thZ2UgbWFuYWdlci4gVGhpcyBtZWFucyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gdXN1YWxseQorZXhwZWN0IGEgY29weSBvZiB0aGUgbG9hZGVyIHRvIGJlIHByZXNlbnQgb24gYSBzeXN0ZW0uIElmIGFwcGxpY2F0aW9ucyB3YW50IHRvCitiZSBjb21wbGV0ZWx5IHN1cmUgdGhhdCBhIGxvYWRlciBpcyBwcmVzZW50LCB0aGV5IGNhbiBpbmNsdWRlIGEgbG9hZGVyIG9yCitydW50aW1lIGluc3RhbGxlciB3aXRoIHRoZWlyIGFwcGxpY2F0aW9uLgorCisjIyMjIyMgU3RhdGljIExpbmtpbmcKK1RoZSBsb2FkZXIgY2FuIGFsc28gYmUgdXNlZCBhcyBhIHN0YXRpYyBsaWJyYXJ5ICh0aGlzIGlzIHNoaXBwZWQgaW4gdGhlCitXaW5kb3dzIFNESyBhcyBgVktzdGF0aWMuMS5saWJgKS4gTGlua2luZyB0byB0aGUgc3RhdGljIGxvYWRlciBtZWFucyB0aGF0IHRoZQordXNlciBkb2VzIG5vdCBuZWVkIHRvIGhhdmUgYSBWdWxrYW4gcnVudGltZSBpbnN0YWxsZWQsIGFuZCBpdCBhbHNvIGd1YXJhbnRlZXMKK3RoYXQgeW91ciBhcHBsaWNhdGlvbiB3aWxsIHVzZSBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGxvYWRlci4gSG93ZXZlciwgdGhlcmUKK2FyZSBzZXZlcmFsIGRvd25zaWRlcyB0byB0aGlzIGFwcHJvYWNoOgorCisgIC0gVGhlIHN0YXRpYyBsaWJyYXJ5IGNhbiBuZXZlciBiZSB1cGRhdGVkIHdpdGhvdXQgcmUtbGlua2luZyB0aGUgYXBwbGljYXRpb24KKyAgLSBUaGlzIG9wZW5zIHVwIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHR3byBpbmNsdWRlZCBsaWJyYXJpZXMgY291bGQgY29udGFpbgorICBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGxvYWRlcgorICAgIC0gVGhpcyBjb3VsZCBwb3RlbnRpYWxseSBjYXVzZSBjb25mbGljdHMgYmV0d2VlbiB0aGUgZGlmZmVyZW50IGxvYWRlciB2ZXJzaW9ucworCitBcyBhIHJlc3VsdCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB1c2VycyBwcmVmZXIgbGlua2luZyB0byB0aGUgZHluYW1pYwordmVyc2lvbnMgb2YgdGhlIGxvYWRlci4KKworCisjIyMjIyBJbmRpcmVjdGx5IExpbmtpbmcgdG8gdGhlIExvYWRlcgorQXBwbGljYXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gbGluayBkaXJlY3RseSB0byB0aGUgbG9hZGVyIGxpYnJhcnksIGluc3RlYWQKK3RoZXkgY2FuIHVzZSB0aGUgYXBwcm9wcmlhdGUgcGxhdGZvcm0tc3BlY2lmaWMgZHluYW1pYyBzeW1ib2wgbG9va3VwIG9uIHRoZQorbG9hZGVyIGxpYnJhcnkgdG8gaW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24ncyBvd24gZGlzcGF0Y2ggdGFibGUuIFRoaXMgYWxsb3dzCithbiBhcHBsaWNhdGlvbiB0byBmYWlsIGdyYWNlZnVsbHkgaWYgdGhlIGxvYWRlciBjYW5ub3QgYmUgZm91bmQuICBJdCBhbHNvCitwcm92aWRlcyB0aGUgZmFzdGVzdCBtZWNoYW5pc20gZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBjYWxsIFZ1bGthbiBmdW5jdGlvbnMuIEFuCithcHBsaWNhdGlvbiB3aWxsIG9ubHkgbmVlZCB0byBxdWVyeSAodmlhIHN5c3RlbSBjYWxscyBzdWNoIGFzIGBkbHN5bWApIHRoZQorYWRkcmVzcyBvZiBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCBmcm9tIHRoZSBsb2FkZXIgbGlicmFyeS4gVXNpbmcKK2B2a0dldEluc3RhbmNlUHJvY0FkZHJgIHRoZSBhcHBsaWNhdGlvbiBjYW4gdGhlbiBkaXNjb3ZlciB0aGUgYWRkcmVzcyBvZiBhbGwKK2Z1bmN0aW9ucyBhbmQgZXh0ZW5zaW9ucyBhdmFpbGFibGUsIHN1Y2ggYXMgYHZrQ3JlYXRlSW5zdGFuY2VgLAorYHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzYCBhbmQKK2B2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzYCBpbiBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHdheS4KKworCisjIyMjIyBCZXN0IEFwcGxpY2F0aW9uIFBlcmZvcm1hbmNlIFNldHVwCisKK0lmIHlvdSBkZXNpcmUgdGhlIGJlc3QgcGVyZm9ybWFuY2UgcG9zc2libGUsIHlvdSBzaG91bGQgc2V0IHVwIHlvdXIgb3duCitkaXNwYXRjaCB0YWJsZSBzbyB0aGF0IGFsbCB5b3VyIEluc3RhbmNlIGZ1bmN0aW9ucyBhcmUgcXVlcmllZCB1c2luZworYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAgYW5kIGFsbCB5b3VyIERldmljZSBmdW5jdGlvbnMgYXJlIHF1ZXJpZWQgdXNpbmcKK2B2a0dldERldmljZVByb2NBZGRyYC4KKworKldoeSBzaG91bGQgeW91IGRvIHRoaXM/KgorCitUaGUgYW5zd2VyIGNvbWVzIGluIGhvdyB0aGUgY2FsbCBjaGFpbiBvZiBJbnN0YW5jZSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkCit2ZXJzdXMgdGhlIGNhbGwgY2hhaW4gb2YgYSBEZXZpY2UgZnVuY3Rpb25zLiAgUmVtZW1iZXIsIGEgW1Z1bGthbiBJbnN0YW5jZSBpcyBhCitoaWdoLWxldmVsIGNvbnN0cnVjdCB1c2VkIHRvIHByb3ZpZGUgVnVsa2FuIHN5c3RlbS1sZXZlbCAKK2luZm9ybWF0aW9uXSgjaW5zdGFuY2UtcmVsYXRlZC1vYmplY3RzKS4KK0JlY2F1c2Ugb2YgdGhpcywgSW5zdGFuY2UgZnVuY3Rpb25zIG5lZWQgdG8gYmUgYnJvYWRjYXN0IHRvCitldmVyeSBhdmFpbGFibGUgSUNEIG9uIHRoZSBzeXN0ZW0uICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gc2hvd3MgYW4gYXBwcm94aW1hdGUKK3ZpZXcgb2YgYW4gSW5zdGFuY2UgY2FsbCBjaGFpbiB3aXRoIHRocmVlIGVuYWJsZWQgbGF5ZXJzOgorCishW0luc3RhbmNlIENhbGwgQ2hhaW5dKC4vaW1hZ2VzL2xvYWRlcl9pbnN0YW5jZV9jaGFpbi5wbmcpCisKK1RoaXMgaXMgYWxzbyBob3cgYSBWdWxrYW4gRGV2aWNlIGZ1bmN0aW9uIGNhbGwgY2hhaW4gbG9va3MgaWYgeW91IHF1ZXJ5IGl0Cit1c2luZyBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYC4gIE9uIHRoZSBvdGhlciBoYW5kLCBhIERldmljZQorZnVuY3Rpb24gZG9lc24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBicm9hZGNhc3QgYmVjYXVzZSBpdCBrbm93cyBzcGVjaWZpY2FsbHkKK3doaWNoIGFzc29jaWF0ZWQgSUNEIGFuZCB3aGljaCBhc3NvY2lhdGVkIFBoeXNpY2FsIERldmljZSB0aGUgY2FsbCBzaG91bGQKK3Rlcm1pbmF0ZSBhdC4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGxvYWRlciBkb2Vzbid0IG5lZWQgdG8gZ2V0IGludm9sdmVkIGJldHdlZW4KK2FueSBlbmFibGVkIGxheWVycyBhbmQgdGhlIElDRC4gIFRodXMsIGlmIHlvdSB1c2VkIGEgbG9hZGVyLWV4cG9ydGVkIFZ1bGthbgorRGV2aWNlIGZ1bmN0aW9uLCB0aGUgY2FsbCBjaGFpbiBpbiB0aGUgc2FtZSBzY2VuYXJpbyBhcyBhYm92ZSB3b3VsZCBsb29rIGxpa2U6CisKKyFbTG9hZGVyIERldmljZSBDYWxsIENoYWluXSguL2ltYWdlcy9sb2FkZXJfZGV2aWNlX2NoYWluX2xvYWRlci5wbmcpCisKK0FuIGV2ZW4gYmV0dGVyIHNvbHV0aW9uIHdvdWxkIGJlIGZvciBhbiBhcHBsaWNhdGlvbiB0byBwZXJmb3JtIGEKK2B2a0dldERldmljZVByb2NBZGRyYCBjYWxsIG9uIGFsbCBEZXZpY2UgZnVuY3Rpb25zLiAgVGhpcyBmdXJ0aGVyIG9wdGltaXplcyB0aGUKK2NhbGwgY2hhaW4gYnkgcmVtb3ZpbmcgdGhlIGxvYWRlciBhbGwtdG9nZXRoZXIgdW5kZXIgbW9zdCBzY2VuYXJpb3M6CisKKyFbQXBwbGljYXRpb24gRGV2aWNlIENhbGwgQ2hhaW5dKC4vaW1hZ2VzL2xvYWRlcl9kZXZpY2VfY2hhaW5fYXBwLnBuZykKKworQWxzbywgbm90aWNlIGlmIG5vIGxheWVycyBhcmUgZW5hYmxlZCwgeW91ciBhcHBsaWNhdGlvbiBmdW5jdGlvbiBwb2ludGVyIHdvdWxkCitwb2ludCAqKmRpcmVjdGx5IHRvIHRoZSBJQ0QqKi4gIElmIGNhbGxlZCBlbm91Z2gsIHRob3NlIGZld2VyIGNhbGxzIGNhbiBhZGQgdXAKK3RvIHBlcmZvcm1hbmNlIHNhdmluZ3MuCisKKyoqTk9URToqKiBUaGVyZSBhcmUgc29tZSBEZXZpY2UgZnVuY3Rpb25zIHdoaWNoIHN0aWxsIHJlcXVpcmUgdGhlIGxvYWRlciB0bworaW50ZXJjZXB0IHRoZW0gd2l0aCBhICp0cmFtcG9saW5lKiBhbmQgKnRlcm1pbmF0b3IqLiBUaGVyZSBhcmUgdmVyeSBmZXcgb2YKK3RoZXNlLCBidXQgdGhleSBhcmUgdHlwaWNhbGx5IGZ1bmN0aW9ucyB3aGljaCB0aGUgbG9hZGVyIHdyYXBzIHdpdGggaXRzIG93bgorZGF0YS4gIEluIHRob3NlIGNhc2VzLCBldmVuIHRoZSBEZXZpY2UgY2FsbCBjaGFpbiB3aWxsIGNvbnRpbnVlIHRvIGxvb2sgbGlrZSB0aGUKK0luc3RhbmNlIGNhbGwgY2hhaW4uICBPbmUgZXhhbXBsZSBvZiBhIERldmljZSBmdW5jdGlvbiByZXF1aXJpbmcgYSAqdGVybWluYXRvcioKK2lzIGB2a0NyZWF0ZVN3YXBjaGFpbktIUmAuICBGb3IgdGhhdCBmdW5jdGlvbiwgdGhlIGxvYWRlciBuZWVkcyB0byBwb3RlbnRpYWxseQorY29udmVydCB0aGUgS0hSX3N1cmZhY2Ugb2JqZWN0IGludG8gYW4gSUNELXNwZWNpZmljIEtIUl9zdXJmYWNlIG9iamVjdCBwcmlvciB0bworcGFzc2luZyBkb3duIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbidzIGluZm9ybWF0aW9uIHRvIHRoZSBJQ0QuCisKK1JlbWVtYmVyOgorICogYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAgY2FuIGJlIHVzZWQgdG8gcXVlcnkKK2VpdGhlciBkZXZpY2Ugb3IgaW5zdGFuY2UgZW50cnkgcG9pbnRzIGluIGFkZGl0aW9uIHRvIGFsbCBjb3JlIGVudHJ5IHBvaW50cy4KKyAqIGB2a0dldERldmljZVByb2NBZGRyYCBjYW4gb25seSBiZSB1c2VkIHRvIHF1ZXJ5IGZvciBkZXZpY2UKK2V4dGVuc2lvbiBvciBjb3JlIGRldmljZSBlbnRyeSBwb2ludHMuCisKKworIyMjIyMgQUJJIFZlcnNpb25pbmcKKworVGhlIFZ1bGthbiBsb2FkZXIgbGlicmFyeSB3aWxsIGJlIGRpc3RyaWJ1dGVkIGluIHZhcmlvdXMgd2F5cyBpbmNsdWRpbmcgVnVsa2FuCitTREtzLCBPUyBwYWNrYWdlIGRpc3RyaWJ1dGlvbnMgYW5kIEluZGVwZW5kZW50IEhhcmR3YXJlIFZlbmRvciAoSUhWKSBkcml2ZXIKK3BhY2thZ2VzLiBUaGVzZSBkZXRhaWxzIGFyZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuIEhvd2V2ZXIsIHRoZSBuYW1lCithbmQgdmVyc2lvbmluZyBvZiB0aGUgVnVsa2FuIGxvYWRlciBsaWJyYXJ5IGlzIHNwZWNpZmllZCBzbyBhbiBhcHAgY2FuIGxpbmsgdG8KK3RoZSBjb3JyZWN0IFZ1bGthbiBBQkkgbGlicmFyeSB2ZXJzaW9uLiBWdWxrYW4gdmVyc2lvbmluZyBpcyBzdWNoIHRoYXQgQUJJCitiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzIGd1YXJhbnRlZWQgZm9yIGFsbCB2ZXJzaW9ucyB3aXRoIHRoZSBzYW1lIG1ham9yCitudW1iZXIgKGUuZy4gMS4wIGFuZCAxLjEpLiBPbiBXaW5kb3dzLCB0aGUgbG9hZGVyIGxpYnJhcnkgZW5jb2RlcyB0aGUgQUJJCit2ZXJzaW9uIGluIGl0cyBuYW1lIHN1Y2ggdGhhdCBtdWx0aXBsZSBBQkkgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIHRoZSBsb2FkZXIKK2NhbiBwZWFjZWZ1bGx5IGNvZXhpc3Qgb24gYSBnaXZlbiBzeXN0ZW0uIFRoZSBWdWxrYW4gbG9hZGVyIGxpYnJhcnkgZmlsZSBuYW1lIGlzCitgdnVsa2FuLTxBQkkgdmVyc2lvbj4uZGxsYC4gRm9yIGV4YW1wbGUsIGZvciBWdWxrYW4gdmVyc2lvbiAxLlggb24gV2luZG93cyB0aGUKK2xpYnJhcnkgZmlsZW5hbWUgaXMgYHZ1bGthbi0xLmRsbGAuIEFuZCB0aGlzIGxpYnJhcnkgZmlsZSBjYW4gdHlwaWNhbGx5IGJlIGZvdW5kCitpbiB0aGUgYHdpbmRvd3Ncc3lzdGVtMzJgIGRpcmVjdG9yeSAob24gNjQtYml0IFdpbmRvd3MgaW5zdGFsbHMsIHRoZSAzMi1iaXQKK3ZlcnNpb24gb2YgdGhlIGxvYWRlciB3aXRoIHRoZSBzYW1lIG5hbWUgY2FuIGJlIGZvdW5kIGluIHRoZSBgd2luZG93c1xzeXNXT1c2NGAKK2RpcmVjdG9yeSkuCisKK0ZvciBMaW51eCBhbmQgbWFjT1MsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHZlcnNpb25lZCBiYXNlZCBvbiBhIHN1ZmZpeC4gVGh1cywgdGhlIEFCSQorbnVtYmVyIGlzIG5vdCBlbmNvZGVkIGluIHRoZSBiYXNlIG9mIHRoZSBsaWJyYXJ5IGZpbGVuYW1lIGFzIG9uIFdpbmRvd3MuIE9uCitMaW51eCBhbiBhcHBsaWNhdGlvbiB3YW50aW5nIHRvIGxpbmsgdG8gdGhlIGxhdGVzdCBWdWxrYW4gQUJJIHZlcnNpb24gd291bGQKK2p1c3QgbGluayB0byB0aGUgbmFtZSB2dWxrYW4gKGBsaWJ2dWxrYW4uc29gKS4gIEEgc3BlY2lmaWMgVnVsa2FuIEFCSSB2ZXJzaW9uIGNhbgorYWxzbyBiZSBsaW5rZWQgdG8gYnkgYXBwbGljYXRpb25zIChlLmcuIGBsaWJ2dWxrYW4uc28uMWApLgorT24gbWFjT1MsIHRoZSBsaWJyYXJpZXMgYXJlIGBsaWJ2dWxrYW4uZHlsaWJgIGFuZCBgbGlidnVsa2FuLjEuZHlsaWJgLgorCisKKyMjIyMgQXBwbGljYXRpb24gTGF5ZXIgVXNhZ2UKKworQXBwbGljYXRpb25zIGRlc2lyaW5nIFZ1bGthbiBmdW5jdGlvbmFsaXR5IGJleW9uZCB3aGF0IHRoZSBjb3JlIEFQSSBvZmZlcnMgbWF5Cit1c2UgdmFyaW91cyBsYXllcnMgb3IgZXh0ZW5zaW9ucy4gQSBsYXllciBjYW5ub3QgaW50cm9kdWNlIG5ldyBWdWxrYW4gY29yZSBBUEkKK2VudHJ5IHBvaW50cyB0byBhbiBhcHBsaWNhdGlvbiB0aGF0IGFyZSBub3QgZXhwb3NlZCBpbiBWdWxrYW4uaC4gIEhvd2V2ZXIsCitsYXllcnMgbWF5IG9mZmVyIGV4dGVuc2lvbnMgdGhhdCBpbnRyb2R1Y2UgbmV3IFZ1bGthbiBjb21tYW5kcyB0aGF0IGNhbiBiZQorcXVlcmllZCB0aHJvdWdoIHRoZSBleHRlbnNpb24gaW50ZXJmYWNlLgorCitBIGNvbW1vbiB1c2Ugb2YgbGF5ZXJzIGlzIGZvciBBUEkgdmFsaWRhdGlvbiB3aGljaCBjYW4gYmUgZW5hYmxlZCBieQorbG9hZGluZyB0aGUgbGF5ZXIgZHVyaW5nIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50LCBidXQgbm90IGxvYWRpbmcgdGhlIGxheWVyCitmb3IgYXBwbGljYXRpb24gcmVsZWFzZS4gVGhpcyBlbGltaW5hdGVzIHRoZSBvdmVyaGVhZCBvZiB2YWxpZGF0aW5nIHRoZQorYXBwbGljYXRpb24ncyB1c2FnZSBvZiB0aGUgQVBJLCBzb21ldGhpbmcgdGhhdCB3YXNuJ3QgYXZhaWxhYmxlIG9uIHNvbWUgcHJldmlvdXMKK2dyYXBoaWNzIEFQSXMuCisKK1RvIGZpbmQgb3V0IHdoYXQgbGF5ZXJzIGFyZSBhdmFpbGFibGUgdG8geW91ciBhcHBsaWNhdGlvbiwgdXNlCitgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllc2AuICBUaGlzIHdpbGwgcmVwb3J0IGFsbCBsYXllcnMKK3RoYXQgaGF2ZSBiZWVuIGRpc2NvdmVyZWQgYnkgdGhlIGxvYWRlci4gIFRoZSBsb2FkZXIgbG9va3MgaW4gdmFyaW91cyBsb2NhdGlvbnMKK3RvIGZpbmQgbGF5ZXJzIG9uIHRoZSBzeXN0ZW0uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlCitbTGF5ZXIgZGlzY292ZXJ5XSgjbGF5ZXItZGlzY292ZXJ5KSBzZWN0aW9uIGJlbG93LgorCitUbyBlbmFibGUgYSBsYXllciwgb3IgbGF5ZXJzLCBzaW1wbHkgcGFzcyB0aGUgbmFtZSBvZiB0aGUgbGF5ZXJzIHlvdSB3aXNoIHRvCitlbmFibGUgaW4gdGhlIGBwcEVuYWJsZWRMYXllck5hbWVzYCBmaWVsZCBvZiB0aGUgYFZrSW5zdGFuY2VDcmVhdGVJbmZvYCBkdXJpbmcKK2EgY2FsbCB0byBgdmtDcmVhdGVJbnN0YW5jZWAuICBPbmNlIGRvbmUsIHRoZSBsYXllcnMgeW91IGhhdmUgZW5hYmxlZCB3aWxsIGJlCithY3RpdmUgZm9yIGFsbCBWdWxrYW4gZnVuY3Rpb25zIHVzaW5nIHRoZSBjcmVhdGVkIGBWa0luc3RhbmNlYCwgYW5kIGFueSBvZgoraXRzIGNoaWxkIG9iamVjdHMuCisKKyoqTk9URToqKiBMYXllciBvcmRlcmluZyBpcyBpbXBvcnRhbnQgaW4gc2V2ZXJhbCBjYXNlcyBzaW5jZSBzb21lIGxheWVycworaW50ZXJhY3Qgd2l0aCBlYWNoIG90aGVyLiAgQmUgY2FyZWZ1bCB3aGVuIGVuYWJsaW5nIGxheWVycyBhcyB0aGlzIG1heSBiZQordGhlIGNhc2UuICBTZWUgdGhlIFtPdmVyYWxsIExheWVyIE9yZGVyaW5nXSgjb3ZlcmFsbC1sYXllci1vcmRlcmluZykgc2VjdGlvbgorZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1RoZSBmb2xsb3dpbmcgY29kZSBzZWN0aW9uIHNob3dzIGhvdyB5b3Ugd291bGQgZ28gYWJvdXQgZW5hYmxpbmcgdGhlCitWS19MQVlFUl9MVU5BUkdfc3RhbmRhcmRfdmFsaWRhdGlvbiBsYXllci4KKworYGBgCisgICBjaGFyICppbnN0YW5jZV92YWxpZGF0aW9uX2xheWVyc1tdID0geworICAgICAgICAiVktfTEFZRVJfTFVOQVJHX3N0YW5kYXJkX3ZhbGlkYXRpb24iCisgICAgfTsKKyAgICBjb25zdCBWa0FwcGxpY2F0aW9uSW5mbyBhcHAgPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8sCisgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgIC5wQXBwbGljYXRpb25OYW1lID0gIlRFU1RfQVBQIiwKKyAgICAgICAgLmFwcGxpY2F0aW9uVmVyc2lvbiA9IDAsCisgICAgICAgIC5wRW5naW5lTmFtZSA9ICJURVNUX0VOR0lORSIsCisgICAgICAgIC5lbmdpbmVWZXJzaW9uID0gMCwKKyAgICAgICAgLmFwaVZlcnNpb24gPSBWS19BUElfVkVSU0lPTl8xXzAsCisgICAgfTsKKyAgICBWa0luc3RhbmNlQ3JlYXRlSW5mbyBpbnN0X2luZm8gPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAucEFwcGxpY2F0aW9uSW5mbyA9ICZhcHAsCisgICAgICAgIC5lbmFibGVkTGF5ZXJDb3VudCA9IDEsCisgICAgICAgIC5wcEVuYWJsZWRMYXllck5hbWVzID0gKGNvbnN0IGNoYXIgKmNvbnN0ICopaW5zdGFuY2VfdmFsaWRhdGlvbl9sYXllcnMsCisgICAgICAgIC5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSAwLAorICAgICAgICAucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBOVUxMLAorICAgIH07CisgICAgZXJyID0gdmtDcmVhdGVJbnN0YW5jZSgmaW5zdF9pbmZvLCBOVUxMLCAmZGVtby0+aW5zdCk7CitgYGAKKworQXQgYHZrQ3JlYXRlSW5zdGFuY2VgIGFuZCBgdmtDcmVhdGVEZXZpY2VgLCB0aGUgbG9hZGVyIGNvbnN0cnVjdHMgY2FsbCBjaGFpbnMKK3RoYXQgaW5jbHVkZSB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVkIChlbmFibGVkKSBsYXllcnMuICBPcmRlciBpcyBpbXBvcnRhbnQgaW4KK3RoZSBgcHBFbmFibGVkTGF5ZXJOYW1lc2AgYXJyYXk7IGFycmF5IGVsZW1lbnQgMCBpcyB0aGUgdG9wbW9zdCAoY2xvc2VzdCB0byB0aGUKK2FwcGxpY2F0aW9uKSBsYXllciBpbnNlcnRlZCBpbiB0aGUgY2hhaW4gYW5kIHRoZSBsYXN0IGFycmF5IGVsZW1lbnQgaXMgY2xvc2VzdAordG8gdGhlIGRyaXZlci4gIFNlZSB0aGUgW092ZXJhbGwgTGF5ZXIgT3JkZXJpbmddKCNvdmVyYWxsLWxheWVyLW9yZGVyaW5nKQorc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBsYXllciBvcmRlcmluZy4KKworKipOT1RFOioqICpEZXZpY2UgTGF5ZXJzIEFyZSBOb3cgRGVwcmVjYXRlZCoKKz4gYHZrQ3JlYXRlRGV2aWNlYCBvcmlnaW5hbGx5IHdhcyBhYmxlIHRvIHNlbGVjdCBsYXllcnMgaW4gYSBzaW1pbGFyIG1hbm5lciB0bworYHZrQ3JlYXRlSW5zdGFuY2VgLiAgVGhpcyBsZWFkIHRvIHRoZSBjb25jZXB0IG9mICJpbnN0YW5jZQorPiBsYXllcnMiIGFuZCAiZGV2aWNlIGxheWVycyIuICBJdCB3YXMgZGVjaWRlZCBieSBLaHJvbm9zIHRvIGRlcHJlY2F0ZSB0aGUKKz4gImRldmljZSBsYXllciIgZnVuY3Rpb25hbGl0eSBhbmQgb25seSBjb25zaWRlciAiaW5zdGFuY2UgbGF5ZXJzIi4KKz4gVGhlcmVmb3JlLCBgdmtDcmVhdGVEZXZpY2VgIHdpbGwgdXNlIHRoZSBsYXllcnMgc3BlY2lmaWVkIGF0CitgdmtDcmVhdGVJbnN0YW5jZWAuCis+IEJlY2F1c2Ugb2YgdGhpcywgdGhlIGZvbGxvd2luZyBpdGVtcyBoYXZlIGJlZW4gZGVwcmVjYXRlZDoKKz4gKiBgVmtEZXZpY2VDcmVhdGVJbmZvYCBmaWVsZHM6Cis+ICAqIGBwcEVuYWJsZWRMYXllck5hbWVzYAorPiAgKiBgZW5hYmxlZExheWVyQ291bnRgCis+ICogVGhlIGB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllc2AgZnVuY3Rpb24KKworCisjIyMjIyBJbXBsaWNpdCB2cyBFeHBsaWNpdCBMYXllcnMKKworRXhwbGljaXQgbGF5ZXJzIGFyZSBsYXllcnMgd2hpY2ggYXJlIGVuYWJsZWQgYnkgYW4gYXBwbGljYXRpb24gKGUuZy4gd2l0aCB0aGUKK3ZrQ3JlYXRlSW5zdGFuY2UgZnVuY3Rpb24pLCBvciBieSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoYXMgbWVudGlvbmVkCitwcmV2aW91c2x5KS4KKworSW1wbGljaXQgbGF5ZXJzIGFyZSB0aG9zZSB3aGljaCBhcmUgZW5hYmxlZCBieSB0aGVpciBleGlzdGVuY2UuIEZvciBleGFtcGxlLAorY2VydGFpbiBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudHMgKGUuZy4gU3RlYW0gb3IgYW4gYXV0b21vdGl2ZSBpbmZvdGFpbm1lbnQKK3N5c3RlbSkgbWF5IGhhdmUgbGF5ZXJzIHdoaWNoIHRoZXkgYWx3YXlzIHdhbnQgZW5hYmxlZCBmb3IgYWxsIGFwcGxpY2F0aW9ucwordGhhdCB0aGV5IHN0YXJ0LiBPdGhlciBpbXBsaWNpdCBsYXllcnMgbWF5IGJlIGZvciBhbGwgYXBwbGljYXRpb25zIHN0YXJ0ZWQgb24gYQorZ2l2ZW4gc3lzdGVtIChlLmcuIGxheWVycyB0aGF0IG92ZXJsYXkgZnJhbWVzLXBlci1zZWNvbmQpLiBJbXBsaWNpdCBsYXllcnMgYXJlCitlbmFibGVkIGF1dG9tYXRpY2FsbHksIHdoZXJlYXMgZXhwbGljaXQgbGF5ZXJzIG11c3QgYmUgZW5hYmxlZCBleHBsaWNpdGx5LgorCitJbXBsaWNpdCBsYXllcnMgaGF2ZSBhbiBhZGRpdGlvbmFsIHJlcXVpcmVtZW50IG92ZXIgZXhwbGljaXQgbGF5ZXJzIGluIHRoYXQgdGhleQorcmVxdWlyZSBiZWluZyBhYmxlIHRvIGJlIGRpc2FibGVkIGJ5IGFuIGVudmlyb25tZW50YWwgdmFyaWFibGUuICBUaGlzIGlzIGR1ZQordG8gdGhlIGZhY3QgdGhhdCB0aGV5IGFyZSBub3QgdmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24gYW5kIGNvdWxkIGNhdXNlIGlzc3Vlcy4KK0EgZ29vZCBwcmluY2lwbGUgdG8ga2VlcCBpbiBtaW5kIHdvdWxkIGJlIHRvIGRlZmluZSBib3RoIGFuIGVuYWJsZSBhbmQgZGlzYWJsZQorZW52aXJvbm1lbnQgdmFyaWFibGUgc28gdGhlIHVzZXJzIGNhbiBkZXRlcm1pbmlzdGljYWxseSBlbmFibGUgdGhlIGZ1bmN0aW9uYWxpdHkuCitPbiBEZXNrdG9wIHBsYXRmb3JtcyAoV2luZG93cywgTGludXgsIGFuZCBtYWNPUyksIHRoZXNlIGVuYWJsZS9kaXNhYmxlIHNldHRpbmdzIGFyZQorZGVmaW5lZCBpbiB0aGUgbGF5ZXIncyBKU09OIGZpbGUuCisKK0Rpc2NvdmVyeSBvZiBzeXN0ZW0taW5zdGFsbGVkIGltcGxpY2l0IGFuZCBleHBsaWNpdCBsYXllcnMgaXMgZGVzY3JpYmVkIGxhdGVyIGluCit0aGUgW0xheWVyIERpc2NvdmVyeSBTZWN0aW9uXSgjbGF5ZXItZGlzY292ZXJ5KS4gIEZvciBub3csIHNpbXBseSBrbm93IHRoYXQgd2hhdAorZGlzdGluZ3Vpc2hlcyBhIGxheWVyIGFzIGltcGxpY2l0IG9yIGV4cGxpY2l0IGlzIGRlcGVuZGVudCBvbiB0aGUgT3BlcmF0aW5nCitzeXN0ZW0sIGFzIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdy4KKworfCBPcGVyYXRpbmcgU3lzdGVtIHwgSW1wbGljaXQgTGF5ZXIgSWRlbnRpZmljYXRpb24gfAorfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IFdpbmRvd3MgIHwgSW1wbGljaXQgbGF5ZXJzIGFyZSBsb2NhdGVkIGluIGEgZGlmZmVyZW50IFdpbmRvd3MgcmVnaXN0cnkgbG9jYXRpb24gdGhhbiBleHBsaWNpdCBsYXllcnMuIHwKK3wgTGludXggfCBJbXBsaWNpdCBsYXllcnMgYXJlIGxvY2F0ZWQgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5IGxvY2F0aW9uIHRoYW4gZXhwbGljaXQgbGF5ZXJzLiB8Cit8IEFuZHJvaWQgfCBUaGVyZSBpcyAqKk5vIFN1cHBvcnQgRm9yIEltcGxpY2l0IExheWVycyoqIG9uIEFuZHJvaWQuIHwKK3wgbWFjT1MgfCBJbXBsaWNpdCBsYXllcnMgYXJlIGxvY2F0ZWQgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5IGxvY2F0aW9uIHRoYW4gZXhwbGljaXQgbGF5ZXJzLiB8CisKKworIyMjIyMgRm9yY2luZyBMYXllciBTb3VyY2UgRm9sZGVycworCitEZXZlbG9wZXJzIG1heSBuZWVkIHRvIHVzZSBzcGVjaWFsLCBwcmUtcHJvZHVjdGlvbiBsYXllcnMsIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZQorc3lzdGVtLWluc3RhbGxlZCBsYXllcnMuIFlvdSBjYW4gZGlyZWN0IHRoZSBsb2FkZXIgdG8gbG9vayBmb3IgbGF5ZXJzIGluIGEKK3NwZWNpZmljIGZvbGRlciBieSBkZWZpbmluZyB0aGUgIlZLXF9MQVlFUlxfUEFUSCIgZW52aXJvbm1lbnQgdmFyaWFibGUuICBUaGlzCit3aWxsIG92ZXJyaWRlIHRoZSBtZWNoYW5pc20gdXNlZCBmb3IgZmluZGluZyBzeXN0ZW0taW5zdGFsbGVkIGxheWVycy4gQmVjYXVzZQorbGF5ZXJzIG9mIGludGVyZXN0IG1heSBleGlzdCBpbiBzZXZlcmFsIGRpc3RpbmN0IGZvbGRlcnMgb24gYSBzeXN0ZW0sIHRoaXMKK2Vudmlyb25tZW50IHZhcmlhYmxlIGNhbiBjb250YWlucyBzZXZlcmFsIHBhdGhzIHNlcGFyYXRlZCBieSB0aGUgb3BlcmF0aW5nCitzcGVjaWZpYyBwYXRoIHNlcGFyYXRvci4gIE9uIFdpbmRvd3MsIGVhY2ggc2VwYXJhdGUgZm9sZGVyIHNob3VsZCBiZSBzZXBhcmF0ZWQKK2luIHRoZSBsaXN0IHVzaW5nIGEgc2VtaS1jb2xvbi4gIE9uIExpbnV4IGFuZCBtYWNPUywgZWFjaCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgc2VwYXJhdGVkCit1c2luZyBhIGNvbG9uLgorCitJZiAiVktcX0xBWUVSXF9QQVRIIiBleGlzdHMsICoqb25seSoqIHRoZSBmb2xkZXJzIGxpc3RlZCBpbiBpdCB3aWxsIGJlIHNjYW5uZWQKK2ZvciBsYXllcnMuICBFYWNoIGRpcmVjdG9yeSBsaXN0ZWQgc2hvdWxkIGJlIHRoZSBmdWxsIHBhdGhuYW1lIG9mIGEgZm9sZGVyCitjb250YWluaW5nIGxheWVyIG1hbmlmZXN0IGZpbGVzLgorCisKKyMjIyMjIEZvcmNpbmcgTGF5ZXJzIHRvIGJlIEVuYWJsZWQgb24gV2luZG93cywgTGludXggYW5kIG1hY09TCisKK0RldmVsb3BlcnMgbWF5IHdhbnQgdG8gZW5hYmxlIGxheWVycyB0aGF0IGFyZSBub3QgZW5hYmxlZCBieSB0aGUgZ2l2ZW4KK2FwcGxpY2F0aW9uIHRoZXkgYXJlIHVzaW5nLiBPbiBkZXNrdG9wIHN5c3RlbXMsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorIlZLXF9JTlNUQU5DRVxfTEFZRVJTIiBjYW4gYmUgdXNlZCB0byBlbmFibGUgYWRkaXRpb25hbCBsYXllcnMgd2hpY2ggYXJlCitub3Qgc3BlY2lmaWVkIChlbmFibGVkKSBieSB0aGUgYXBwbGljYXRpb24gYXQgYHZrQ3JlYXRlSW5zdGFuY2VgLgorIlZLXF9JTlNUQU5DRVxfTEFZRVJTIiBpcyBhIGNvbG9uIChMaW51eCBhbmQgbWFjT1MpL3NlbWktY29sb24gKFdpbmRvd3MpIHNlcGFyYXRlZAorbGlzdCBvZiBsYXllciBuYW1lcyB0byBlbmFibGUuIE9yZGVyIGlzIHJlbGV2YW50IHdpdGggdGhlIGZpcnN0IGxheWVyIGluIHRoZQorbGlzdCBiZWluZyB0aGUgdG9wLW1vc3QgbGF5ZXIgKGNsb3Nlc3QgdG8gdGhlIGFwcGxpY2F0aW9uKSBhbmQgdGhlIGxhc3QKK2xheWVyIGluIHRoZSBsaXN0IGJlaW5nIHRoZSBib3R0b20tbW9zdCBsYXllciAoY2xvc2VzdCB0byB0aGUgZHJpdmVyKS4KK1NlZSB0aGUgW092ZXJhbGwgTGF5ZXIgT3JkZXJpbmddKCNvdmVyYWxsLWxheWVyLW9yZGVyaW5nKSBzZWN0aW9uCitmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQXBwbGljYXRpb24gc3BlY2lmaWVkIGxheWVycyBhbmQgdXNlciBzcGVjaWZpZWQgbGF5ZXJzICh2aWEgZW52aXJvbm1lbnQKK3ZhcmlhYmxlcykgYXJlIGFnZ3JlZ2F0ZWQgYW5kIGR1cGxpY2F0ZXMgcmVtb3ZlZCBieSB0aGUgbG9hZGVyIHdoZW4gZW5hYmxpbmcKK2xheWVycy4gTGF5ZXJzIHNwZWNpZmllZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGUgYXJlIHRvcC1tb3N0IChjbG9zZXN0IHRvIHRoZQorYXBwbGljYXRpb24pIHdoaWxlIGxheWVycyBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFyZSBib3R0b20tbW9zdC4KKworQW4gZXhhbXBsZSBvZiB1c2luZyB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYWN0aXZhdGUgdGhlIHZhbGlkYXRpb24KK2xheWVyIGBWS19MQVlFUl9MVU5BUkdfcGFyYW1ldGVyX3ZhbGlkYXRpb25gIG9uIExpbnV4IG9yIG1hY09TIGlzIGFzIGZvbGxvd3M6CisKK2BgYAorPiAkIGV4cG9ydCBWS19JTlNUQU5DRV9MQVlFUlM9VktfTEFZRVJfTFVOQVJHX3BhcmFtZXRlcl92YWxpZGF0aW9uCitgYGAKKworCisjIyMjIyBPdmVyYWxsIExheWVyIE9yZGVyaW5nCisKK1RoZSBvdmVyYWxsIG9yZGVyaW5nIG9mIGFsbCBsYXllcnMgYnkgdGhlIGxvYWRlciBiYXNlZCBvbiB0aGUgYWJvdmUgbG9va3MKK2FzIGZvbGxvd3M6CisKKyFbTG9hZGVyIExheWVyIE9yZGVyaW5nXSguL2ltYWdlcy9sb2FkZXJfbGF5ZXJfb3JkZXIucG5nKQorCitPcmRlcmluZyBtYXkgYWxzbyBiZSBpbXBvcnRhbnQgaW50ZXJuYWwgdG8gdGhlIGxpc3Qgb2YgZXhwbGljaXQgbGF5ZXJzLgorU29tZSBsYXllcnMgbWF5IGJlIGRlcGVuZGVudCBvbiBvdGhlciBiZWhhdmlvciBiZWluZyBpbXBsZW1lbnRlZCBiZWZvcmUKK29yIGFmdGVyIHRoZSBsb2FkZXIgY2FsbHMgaXQuICBGb3IgZXhhbXBsZTogdGhlIFZLX0xBWUVSX0xVTkFSR19jb3JlX3ZhbGlkYXRpb24KK2xheWVyIGV4cGVjdHMgdGhlIFZLX0xBWUVSX0xVTkFSR19wYXJhbWV0ZXJfdmFsaWRhdGlvbiBsYXllciB0byBiZSBjYWxsZWQgZmlyc3QuCitUaGlzIGlzIGJlY2F1c2UgdGhlIFZLX0xBWUVSX0xVTkFSR19wYXJhbWV0ZXJfdmFsaWRhdGlvbiBsYXllciB3aWxsIGZpbHRlciBvdXQgYW55CitpbnZhbGlkIGBOVUxMYCBwb2ludGVyIGNhbGxzIHByaW9yIHRvIHRoZSByZXN0IG9mIHRoZSB2YWxpZGF0aW9uIGNoZWNraW5nCitkb25lIGJ5IHRoZSBWS19MQVlFUl9MVU5BUkdfY29yZV92YWxpZGF0aW9uIGxheWVyLiAgSWYgbm90IGRvbmUgcHJvcGVybHksIHlvdSBtYXkgc2VlCitjcmFzaGVzIGluIHRoZSBWS19MQVlFUl9MVU5BUkdfY29yZV92YWxpZGF0aW9uIGxheWVyIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlCithdm9pZGVkLgorCisKKyMjIyMgQXBwbGljYXRpb24gVXNhZ2Ugb2YgRXh0ZW5zaW9ucworCitFeHRlbnNpb25zIGFyZSBvcHRpb25hbCBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IGEgbGF5ZXIsIHRoZSBsb2FkZXIgb3IgYW4KK0lDRC4gRXh0ZW5zaW9ucyBjYW4gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiB0aGUgVnVsa2FuIEFQSSBhbmQgbmVlZCB0byBiZQorc3BlY2lmaWVkIGFuZCByZWdpc3RlcmVkIHdpdGggS2hyb25vcy4gIFRoZXNlIGV4dGVuc2lvbnMgY2FuIGJlIGNyZWF0ZWQKK2J5IGFuIEluZGVwZW5kZW50IEhhcmR3YXJlIFZlbmRvciAoSUhWKSB0byBleHBvc2UgbmV3IGhhcmR3YXJlIGZ1bmN0aW9uYWxpdHksCitvciBieSBhIGxheWVyIHdyaXRlciB0byBleHBvc2Ugc29tZSBpbnRlcm5hbCBmZWF0dXJlLCBvciBieSB0aGUgbG9hZGVyIHRvCitpbXByb3ZlIGZ1bmN0aW9uYWwgYmVoYXZpb3IuICBJbmZvcm1hdGlvbiBhYm91dCB2YXJpb3VzIGV4dGVuc2lvbnMgY2FuIGJlCitmb3VuZCBpbiB0aGUgVnVsa2FuIFNwZWMsIGFuZCB2dWxrYW4uaCBoZWFkZXIgZmlsZS4KKworCisjIyMjIyBJbnN0YW5jZSBhbmQgRGV2aWNlIEV4dGVuc2lvbnMKKworQXMgaGludGVkIGF0IGluIHRoZSBbSW5zdGFuY2UgVmVyc3VzIERldmljZV0oI2luc3RhbmNlLXZlcnN1cy1kZXZpY2UpIHNlY3Rpb24sCit0aGVyZSBhcmUgcmVhbGx5IHR3byB0eXBlcyBvZiBleHRlbnNpb25zOgorICogSW5zdGFuY2UgRXh0ZW5zaW9ucworICogRGV2aWNlIEV4dGVuc2lvbnMKKworQW4gSW5zdGFuY2UgZXh0ZW5zaW9uIGlzIGFuIGV4dGVuc2lvbiB3aGljaCBtb2RpZmllcyBleGlzdGluZyBiZWhhdmlvciBvcgoraW1wbGVtZW50cyBuZXcgYmVoYXZpb3Igb24gaW5zdGFuY2UtbGV2ZWwgb2JqZWN0cywgbGlrZSBhIGBWa0luc3RhbmNlYCBvcgorYSBgVmtQaHlzaWNhbERldmljZWAuICBBIERldmljZSBleHRlbnNpb24gaXMgYW4gZXh0ZW5zaW9uIHdoaWNoIGRvZXMgdGhlIHNhbWUsCitidXQgZm9yIGFueSBgVmtEZXZpY2VgIG9iamVjdCwgb3IgYW55IGRpc3BhdGNoYWJsZSBvYmplY3QgdGhhdCBpcyBhIGNoaWxkIG9mIGEKK2BWa0RldmljZWAgKGBWa1F1ZXVlYCBhbmQgYFZrQ29tbWFuZEJ1ZmZlcmAgYXJlIGV4YW1wbGVzIG9mIHRoZXNlKS4KKworSXQgaXMgKip2ZXJ5KiogaW1wb3J0YW50IHRvIGtub3cgd2hhdCB0eXBlIG9mIGV4dGVuc2lvbiB5b3UgYXJlIGRlc2lyaW5nIHRvCitlbmFibGUgYXMgeW91IHdpbGwgZW5hYmxlIEluc3RhbmNlIGV4dGVuc2lvbnMgZHVyaW5nIGB2a0NyZWF0ZUluc3RhbmNlYCBhbmQKK0RldmljZSBleHRlbnNpb25zIGR1cmluZyBgdmtDcmVhdGVEZXZpY2VgLgorCitUaGUgbG9hZGVyIGRpc2NvdmVycyBhbmQgYWdncmVnYXRlcyBhbGwKK2V4dGVuc2lvbnMgZnJvbSBsYXllcnMgKGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0KSwgSUNEcyBhbmQgdGhlIGxvYWRlciBiZWZvcmUKK3JlcG9ydGluZyB0aGVtIHRvIHRoZSBhcHBsaWNhdGlvbiBpbiBgdmtFbnVtZXJhdGVYWFhFeHRlbnNpb25Qcm9wZXJ0aWVzYAorKHdoZXJlIFhYWCBpcyBlaXRoZXIgIkluc3RhbmNlIiBvciAiRGV2aWNlIikuCisgLSBJbnN0YW5jZSBleHRlbnNpb25zIGFyZSBkaXNjb3ZlcmVkIHZpYQorYHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzYAorIC0gRGV2aWNlIGV4dGVuc2lvbnMgYXJlIGJlIGRpc2NvdmVyZWQgdmlhCitgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzYAorCitMb29raW5nIGF0IGB2dWxrYW4uaGAsIHlvdSdsbCBub3RpY2UgdGhhdCB0aGV5IGFyZSBib3RoIHNpbWlsYXIuICBGb3IgZXhhbXBsZSwKK3RoZSBgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNgIHByb3RvdHlwZSBsb29rcyBhcyBmb2xsb3dzOgorCitgYGAKKyAgIFZrUmVzdWx0CisgICB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcyk7CitgYGAKKworVGhlICJwTGF5ZXJOYW1lIiBwYXJhbWV0ZXIgaW4gdGhlc2UgZnVuY3Rpb25zIGlzIHVzZWQgdG8gc2VsZWN0IGVpdGhlciBhIHNpbmdsZQorbGF5ZXIgb3IgdGhlIFZ1bGthbiBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbi4gSWYgInBMYXllck5hbWUiIGlzIE5VTEwsIGV4dGVuc2lvbnMKK2Zyb20gVnVsa2FuIGltcGxlbWVudGF0aW9uIGNvbXBvbmVudHMgKGluY2x1ZGluZyBsb2FkZXIsIGltcGxpY2l0IGxheWVycywgYW5kCitJQ0RzKSBhcmUgZW51bWVyYXRlZC4gSWYgInBMYXllck5hbWUiIGlzIGVxdWFsIHRvIGEgZGlzY292ZXJlZCBsYXllciBtb2R1bGUgbmFtZQordGhlbiBvbmx5IGV4dGVuc2lvbnMgZnJvbSB0aGF0IGxheWVyICh3aGljaCBtYXkgYmUgaW1wbGljaXQgb3IgZXhwbGljaXQpIGFyZQorZW51bWVyYXRlZC4gRHVwbGljYXRlIGV4dGVuc2lvbnMgKGUuZy4gYW4gaW1wbGljaXQgbGF5ZXIgYW5kIElDRCBtaWdodCByZXBvcnQKK3N1cHBvcnQgZm9yIHRoZSBzYW1lIGV4dGVuc2lvbikgYXJlIGVsaW1pbmF0ZWQgYnkgdGhlIGxvYWRlci4gRm9yIGR1cGxpY2F0ZXMsCit0aGUgSUNEIHZlcnNpb24gaXMgcmVwb3J0ZWQgYW5kIHRoZSBsYXllciB2ZXJzaW9uIGlzIGN1bGxlZC4KKworQWxzbywgRXh0ZW5zaW9ucyAqbXVzdCBiZSBlbmFibGVkKiAoaW4gYHZrQ3JlYXRlSW5zdGFuY2VgIG9yIGB2a0NyZWF0ZURldmljZWApCitiZWZvcmUgdGhlIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVuc2lvbnMgY2FuIGJlIHVzZWQuICBJZiB5b3UgZ2V0IGFuCitFeHRlbnNpb24gZnVuY3Rpb24gdXNpbmcgZWl0aGVyIGB2a0dldEluc3RhbmNlUHJvY0FkZHJgIG9yCitgdmtHZXREZXZpY2VQcm9jQWRkcmAsIGJ1dCBmYWlsIHRvIGVuYWJsZSBpdCwgeW91IGNvdWxkIGV4cGVyaWVuY2UgdW5kZWZpbmVkCitiZWhhdmlvci4gIFRoaXMgc2hvdWxkIGFjdHVhbGx5IGJlIGZsYWdnZWQgaWYgeW91IHJ1biB3aXRoIFZhbGlkYXRpb24gbGF5ZXJzCitlbmFibGVkLgorCisKKyMjIyMjIFdTSSBFeHRlbnNpb25zCisKK0tocm9ub3MtYXBwcm92ZWQgV1NJIGV4dGVuc2lvbnMgYXJlIGF2YWlsYWJsZSBhbmQgcHJvdmlkZSBXaW5kb3dzIFN5c3RlbQorSW50ZWdyYXRpb24gc3VwcG9ydCBmb3IgdmFyaW91cyBleGVjdXRpb24gZW52aXJvbm1lbnRzLiBJdCBpcyBpbXBvcnRhbnQgdG8KK3VuZGVyc3RhbmQgdGhhdCBzb21lIFdTSSBleHRlbnNpb25zIGFyZSB2YWxpZCBmb3IgYWxsIHRhcmdldHMsIGJ1dCBvdGhlcnMgYXJlCitwYXJ0aWN1bGFyIHRvIGEgZ2l2ZW4gZXhlY3V0aW9uIGVudmlyb25tZW50IChhbmQgbG9hZGVyKS4gVGhpcyBkZXNrdG9wIGxvYWRlcgorKGN1cnJlbnRseSB0YXJnZXRpbmcgV2luZG93cywgTGludXgsIGFuZCBtYWNPUykgb25seSBlbmFibGVzIGFuZCBkaXJlY3RseSBleHBvcnRzIHRob3NlCitXU0kgZXh0ZW5zaW9ucyB0aGF0IGFyZSBhcHByb3ByaWF0ZSB0byB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gRm9yIHRoZSBtb3N0CitwYXJ0LCB0aGUgc2VsZWN0aW9uIGlzIGRvbmUgaW4gdGhlIGxvYWRlciB1c2luZyBjb21waWxlLXRpbWUgcHJlcHJvY2Vzc29yIGZsYWdzLgorQWxsIHZlcnNpb25zIG9mIHRoZSBkZXNrdG9wIGxvYWRlciBjdXJyZW50bHkgZXhwb3NlIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgV1NJCitleHRlbnNpb24gc3VwcG9ydDoKKy0gVktfS0hSX3N1cmZhY2UKKy0gVktfS0hSX3N3YXBjaGFpbgorLSBWS19LSFJfZGlzcGxheQorCitJbiBhZGRpdGlvbiwgZWFjaCBvZiB0aGUgZm9sbG93aW5nIE9TIHRhcmdldHMgZm9yIHRoZSBsb2FkZXIgc3VwcG9ydCAKK3RhcmdldC1zcGVjaWZpYyBleHRlbnNpb25zOgorCit8IFdpbmRvd2luZyBTeXN0ZW0gfCBFeHRlbnNpb25zIGF2YWlsYWJsZSB8Cit8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgV2luZG93cyAgfCBWS19LSFJfd2luMzJfc3VyZmFjZSB8Cit8IExpbnV4IChXYXlsYW5kKSB8IFZLX0tIUl93YXlsYW5kX3N1cmZhY2UgfAorfCBMaW51eCAoWDExKSB8ICBWS19LSFJfeGNiX3N1cmZhY2UgYW5kIFZLX0tIUl94bGliX3N1cmZhY2UgfAorfCBtYWNPUyAoTW9sdGVuVkspIHwgVktfTVZLX21hY29zX3N1cmZhY2UgfAorCitJdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IHdoaWxlIHRoZSBsb2FkZXIgbWF5IHN1cHBvcnQgdGhlIHZhcmlvdXMKK2VudHJ5IHBvaW50cyBmb3IgdGhlc2UgZXh0ZW5zaW9ucywgdGhlcmUgaXMgYSBoYW5kc2hha2UgcmVxdWlyZWQgdG8gYWN0dWFsbHkKK3VzZSB0aGVtOgorKiBBdCBsZWFzdCBvbmUgcGh5c2ljYWwgZGV2aWNlIG11c3Qgc3VwcG9ydCB0aGUgZXh0ZW5zaW9uKHMpCisqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNlbGVjdCBzdWNoIGEgcGh5c2ljYWwgZGV2aWNlCisqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHJlcXVlc3QgdGhlIGV4dGVuc2lvbihzKSBiZSBlbmFibGVkIHdoaWxlIGNyZWF0aW5nIHRoZQoraW5zdGFuY2Ugb3IgbG9naWNhbCBkZXZpY2UgKHRoaXMgZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uCit3b3JrcyB3aXRoIGFuIGluc3RhbmNlIG9yIGEgZGV2aWNlKQorKiBUaGUgaW5zdGFuY2UgYW5kL29yIGxvZ2ljYWwgZGV2aWNlIGNyZWF0aW9uIG11c3Qgc3VjY2VlZAorCitPbmx5IHRoZW4gY2FuIHlvdSBleHBlY3QgdG8gcHJvcGVybHkgdXNlIGEgV1NJIGV4dGVuc2lvbiBpbiB5b3VyIFZ1bGthbiBwcm9ncmFtLgorCisKKyMjIyMjIFVua25vd24gRXh0ZW5zaW9ucworCitXaXRoIHRoZSBhYmlsaXR5IHRvIGV4cGFuZCBWdWxrYW4gc28gZWFzaWx5LCBleHRlbnNpb25zIHdpbGwgYmUgY3JlYXRlZCB0aGF0IHRoZQorbG9hZGVyIGtub3dzIG5vdGhpbmcgYWJvdXQuICBJZiB0aGUgZXh0ZW5zaW9uIGlzIGEgZGV2aWNlIGV4dGVuc2lvbiwgdGhlIGxvYWRlcgord2lsbCBwYXNzIHRoZSB1bmtub3duIGVudHJ5IHBvaW50IGRvd24gdGhlIGRldmljZSBjYWxsIGNoYWluIGVuZGluZyB3aXRoIHRoZQorYXBwcm9wcmlhdGUgSUNEIGVudHJ5IHBvaW50cy4gIFRoZSBzYW1lIHRoaW5nIHdpbGwgaGFwcGVuIGlmIHRoZSBleHRlbnNpb24gaXMKK2FuIGluc3RhbmNlIGV4dGVuc2lvbiB3aGljaCB0YWtlcyBhIHBoeXNpY2FsIGRldmljZSBwYXJhbWV0ZXIgYXMgaXRzIGZpcnN0Citjb21wb25lbnQuICBIb3dldmVyLCBmb3IgYWxsIG90aGVyIGluc3RhbmNlIGV4dGVuc2lvbnMgdGhlIGxvYWRlciB3aWxsIGZhaWwgdG8KK2xvYWQgaXQuCisKKypCdXQgd2h5IGRvZXNuJ3QgdGhlIGxvYWRlciBzdXBwb3J0IHVua25vd24gaW5zdGFuY2UgZXh0ZW5zaW9ucz8qCis8YnIvPgorTGV0J3MgbG9vayBhZ2FpbiBhdCB0aGUgSW5zdGFuY2UgY2FsbCBjaGFpbjoKKworIVtJbnN0YW5jZSBjYWxsIGNoYWluXSguL2ltYWdlcy9sb2FkZXJfaW5zdGFuY2VfY2hhaW4ucG5nKQorCitOb3RpY2UgdGhhdCBmb3IgYSBub3JtYWwgaW5zdGFuY2UgZnVuY3Rpb24gY2FsbCwgdGhlIGxvYWRlciBoYXMgdG8gaGFuZGxlCitwYXNzaW5nIGFsb25nIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBhdmFpbGFibGUgSUNEcy4gIElmIHRoZSBsb2FkZXIgaGFzIG5vCitpZGVhIG9mIHRoZSBwYXJhbWV0ZXJzIG9yIHJldHVybiB2YWx1ZSBvZiB0aGUgaW5zdGFuY2UgY2FsbCwgaXQgY2FuJ3QgcHJvcGVybHkKK3Bhc3MgaW5mb3JtYXRpb24gYWxvbmcgdG8gdGhlIElDRHMuICBUaGVyZSBtYXkgYmUgd2F5cyB0byBkbyB0aGlzLCB3aGljaCB3aWxsIGJlCitleHBsb3JlZCBpbiB0aGUgZnV0dXJlLiAgSG93ZXZlciwgZm9yIG5vdywgdGhpcyBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydAoraW5zdGFuY2UgZXh0ZW5zaW9ucyB3aGljaCBkb24ndCB0YWtlIGEgcGh5c2ljYWwgZGV2aWNlIGFzIHRoZWlyIGZpcnN0IHBhcmFtZXRlci4KKworQmVjYXVzZSB0aGUgZGV2aWNlIGNhbGwtY2hhaW4gZG9lcyBub3Qgbm9ybWFsbHkgcGFzcyB0aHJvdWdoIHRoZSBsb2FkZXIKKyp0ZXJtaW5hdG9yKiwgdGhpcyBpcyBub3QgYSBwcm9ibGVtIGZvciBkZXZpY2UgZXh0ZW5zaW9ucy4gIEFkZGl0aW9uYWxseSwKK3NpbmNlIGEgcGh5c2ljYWwgZGV2aWNlIGlzIGFzc29jaWF0ZWQgd2l0aCBvbmUgSUNELCB3ZSBjYW4gdXNlIGEgZ2VuZXJpYworKnRlcm1pbmF0b3IqIHBvaW50aW5nIHRvIG9uZSBJQ0QuICBUaGlzIGlzIGJlY2F1c2UgYm90aCBvZiB0aGVzZSBleHRlbnNpb25zCit0ZXJtaW5hdGUgZGlyZWN0bHkgaW4gdGhlIElDRCB0aGV5IGFyZSBhc3NvY2lhdGVkIHdpdGguCisKKypJcyB0aGlzIGEgYmlnIHByb2JsZW0/KgorPGJyLz4KK05vISAgTW9zdCBleHRlbnNpb24gZnVuY3Rpb25hbGl0eSBvbmx5IGFmZmVjdHMgZWl0aGVyIGEgcGh5c2ljYWwgb3IgbG9naWNhbAorZGV2aWNlIGFuZCBub3QgYW4gaW5zdGFuY2UuICBUaHVzLCB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGV4dGVuc2lvbnMKK3Nob3VsZCBiZSBzdXBwb3J0ZWQgd2l0aCBkaXJlY3QgbG9hZGVyIHN1cHBvcnQuCisKKyMjIyMjIEZpbHRlcmluZyBPdXQgVW5rbm93biBJbnN0YW5jZSBFeHRlbnNpb24gTmFtZXMKK0luIHNvbWUgY2FzZXMsIGFuIElDRCBtYXkgc3VwcG9ydCBpbnN0YW5jZSBleHRlbnNpb25zIHRoYXQgdGhlIGxvYWRlciBkb2VzIG5vdC4KK0ZvciB0aGUgYWJvdmUgcmVhc29ucywgdGhlIGxvYWRlciB3aWxsIGZpbHRlciBvdXQgdGhlIG5hbWVzIG9mIHRoZXNlIHVua25vd24gaW5zdGFuY2UKK2V4dGVuc2lvbnMgd2hlbiBhbiBhcHBsaWNhdGlvbiBjYWxscyBgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNgLgorQWRkaXRpb25hbGx5LCB0aGlzIGJlaGF2aW9yIHdpbGwgY2F1c2UgdGhlIGxvYWRlciB0byB0aHJvdyBhbiBlcnJvciBkdXJpbmcKK2B2a0NyZWF0ZUluc3RhbmNlYCBpZiB5b3Ugc3RpbGwgYXR0ZW1wdCB0byB1c2Ugb25lIG9mIHRoZXNlIGV4dGVuc2lvbnMuICBUaGUgaW50ZW50IGlzCit0byBwcm90ZWN0IGFwcGxpY2F0aW9ucyBzbyB0aGF0IHRoZXkgZG9uJ3QgaW5hZHZlcnRlbnRseSB1c2UgZnVuY3Rpb25hbGl0eQord2hpY2ggY291bGQgbGVhZCB0byBhIGNyYXNoLiAgCisKK09uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3Uga25vdyB5b3UgY2FuIHNhZmVseSB1c2UgdGhlIGV4dGVuc2lvbiwgeW91IG1heSBkaXNhYmxlCit0aGUgZmlsdGVyaW5nIGJ5IGRlZmluaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgVktfTE9BREVSX0RJU0FCTEVfSU5TVF9FWFRfRklMVEVSYAorYW5kIHNldHRpbmcgdGhlIHZhbHVlIHRvIGEgbm9uLXplcm8gbnVtYmVyLiAgVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IGRpc2FibGUgdGhlCitsb2FkZXIncyBmaWx0ZXJpbmcgb2YgaW5zdGFuY2UgZXh0ZW5zaW9uIG5hbWVzLgorCis8YnIvPgorPGJyLz4KKworIyMgTG9hZGVyIGFuZCBMYXllciBJbnRlcmZhY2UKKworSW4gdGhpcyBzZWN0aW9uIHdlJ2xsIGRpc2N1c3MgaG93IHRoZSBsb2FkZXIgaW50ZXJhY3RzIHdpdGggbGF5ZXJzLCBpbmNsdWRpbmc6CisgICogW0xheWVyIERpc2NvdmVyeV0oI2xheWVyLWRpc2NvdmVyeSkKKyAgICAqIFtMYXllciBNYW5pZmVzdCBGaWxlIFVzYWdlXSgjbGF5ZXItbWFuaWZlc3QtZmlsZS11c2FnZSkKKyAgICAqIFtBbmRyb2lkIExheWVyIERpc2NvdmVyeV0oI2FuZHJvaWQtbGF5ZXItZGlzY292ZXJ5KQorICAgICogW1dpbmRvd3MgTGF5ZXIgRGlzY292ZXJ5XSgjd2luZG93cy1sYXllci1kaXNjb3ZlcnkpCisgICAgKiBbTGludXggTGF5ZXIgRGlzY292ZXJ5XSgjbGludXgtbGF5ZXItZGlzY292ZXJ5KQorICAgICogW21hY09TIExheWVyIERpc2NvdmVyeV0oI21hY29zLWxheWVyLWRpc2NvdmVyeSkKKyAgKiBbTGF5ZXIgVmVyc2lvbiBOZWdvdGlhdGlvbl0oI2xheWVyLXZlcnNpb24tbmVnb3RpYXRpb24pCisgICogW0xheWVyIENhbGwgQ2hhaW5zIGFuZCBEaXN0cmlidXRlZCBEaXNwYXRjaF0oI2xheWVyLWNhbGwtY2hhaW5zLWFuZC1kaXN0cmlidXRlZC1kaXNwYXRjaCkKKyAgKiBbTGF5ZXIgVW5rbm93biBQaHlzaWNhbCBEZXZpY2UgRXh0ZW5zaW9uc10oI2xheWVyLXVua25vd24tcGh5c2ljYWwtZGV2aWNlLWV4dGVuc2lvbnMpCisgICogW0xheWVyIEludGVyY2VwdCBSZXF1aXJlbWVudHNdKCNsYXllci1pbnRlcmNlcHQtcmVxdWlyZW1lbnRzKQorICAqIFtEaXN0cmlidXRlZCBEaXNwYXRjaGluZyBSZXF1aXJlbWVudHNdKCNkaXN0cmlidXRlZC1kaXNwYXRjaGluZy1yZXF1aXJlbWVudHMpCisgICogW0xheWVyIENvbnZlbnRpb25zIGFuZCBSdWxlc10oI2xheWVyLWNvbnZlbnRpb25zLWFuZC1ydWxlcykKKyAgKiBbTGF5ZXIgRGlzcGF0Y2ggSW5pdGlhbGl6YXRpb25dKCNsYXllci1kaXNwYXRjaC1pbml0aWFsaXphdGlvbikKKyAgKiBbRXhhbXBsZSBDb2RlIGZvciBDcmVhdGVJbnN0YW5jZV0oI2V4YW1wbGUtY29kZS1mb3ItY3JlYXRlaW5zdGFuY2UpCisgICogW0V4YW1wbGUgQ29kZSBmb3IgQ3JlYXRlRGV2aWNlXSgjZXhhbXBsZS1jb2RlLWZvci1jcmVhdGVkZXZpY2UpCisgICogW01ldGEtbGF5ZXJzXSgjbWV0YS1sYXllcnMpCisgICogW1ByZS1JbnN0YW5jZSBGdW5jdGlvbnNdKCNwcmUtaW5zdGFuY2UtZnVuY3Rpb25zKQorICAqIFtTcGVjaWFsIENvbnNpZGVyYXRpb25zXSgjc3BlY2lhbC1jb25zaWRlcmF0aW9ucykKKyAgICAqIFtBc3NvY2lhdGluZyBQcml2YXRlIERhdGEgd2l0aCBWdWxrYW4gT2JqZWN0cyBXaXRoaW4gYSBMYXllcl0oI2Fzc29jaWF0aW5nLXByaXZhdGUtZGF0YS13aXRoLXZ1bGthbi1vYmplY3RzLXdpdGhpbi1hLWxheWVyKQorICAgICAgKiBbV3JhcHBpbmddKCN3cmFwcGluZykKKyAgICAgICogW0hhc2ggTWFwc10oI2hhc2gtbWFwcykKKyAgICAqIFtDcmVhdGluZyBOZXcgRGlzcGF0Y2hhYmxlIE9iamVjdHNdKCNjcmVhdGluZy1uZXctZGlzcGF0Y2hhYmxlLW9iamVjdHMpCisgICogW0xheWVyIE1hbmlmZXN0IEZpbGUgRm9ybWF0XSgjbGF5ZXItbWFuaWZlc3QtZmlsZS1mb3JtYXQpCisgICAgKiBbTGF5ZXIgTWFuaWZlc3QgRmlsZSBWZXJzaW9uIEhpc3RvcnldKCNsYXllci1tYW5pZmVzdC1maWxlLXZlcnNpb24taGlzdG9yeSkKKyAgKiBbTGF5ZXIgTGlicmFyeSBWZXJzaW9uc10oI2xheWVyLWxpYnJhcnktdmVyc2lvbnMpCisgICAgKiBbTGF5ZXIgTGlicmFyeSBBUEkgVmVyc2lvbiAyXSgjbGF5ZXItbGlicmFyeS1hcGktdmVyc2lvbi0yKQorICAgICogW0xheWVyIExpYnJhcnkgQVBJIFZlcnNpb24gMV0oI2xheWVyLWxpYnJhcnktYXBpLXZlcnNpb24tMSkKKyAgICAqIFtMYXllciBMaWJyYXJ5IEFQSSBWZXJzaW9uIDBdKCNsYXllci1saWJyYXJ5LWFwaS12ZXJzaW9uLTApCisgIAorCisgCisjIyMjIExheWVyIERpc2NvdmVyeQorCitBcyBtZW50aW9uZWQgaW4gdGhlCitbQXBwbGljYXRpb24gSW50ZXJmYWNlIHNlY3Rpb25dKCNpbXBsaWNpdC12cy1leHBsaWNpdC1sYXllcnMpLAorbGF5ZXJzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIHR3byBjYXRlZ29yaWVzOgorICogSW1wbGljaXQgTGF5ZXJzCisgKiBFeHBsaWNpdCBMYXllcnMKKworVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaXMgdGhhdCBpbXBsaWNpdCBsYXllcnMgYXJlIGF1dG9tYXRpY2FsbHkKK2VuYWJsZWQsIHVubGVzcyBvdmVycmlkZGVuLCBhbmQgZXhwbGljaXQgbGF5ZXJzIG11c3QgYmUgZW5hYmxlZC4gIFJlbWVtYmVyLAoraW1wbGljaXQgbGF5ZXJzIGFyZSBub3QgcHJlc2VudCBvbiBhbGwgT3BlcmF0aW5nIFN5c3RlbXMgKGxpa2UgQW5kcm9pZCkuCisKK09uIGFueSBzeXN0ZW0sIHRoZSBsb2FkZXIgbG9va3MgaW4gc3BlY2lmaWMgYXJlYXMgZm9yIGluZm9ybWF0aW9uIG9uIHRoZQorbGF5ZXJzIHRoYXQgaXQgY2FuIGxvYWQgYXQgYSB1c2VyJ3MgcmVxdWVzdC4gIFRoZSBwcm9jZXNzIG9mIGZpbmRpbmcgdGhlCithdmFpbGFibGUgbGF5ZXJzIG9uIGEgc3lzdGVtIGlzIGtub3duIGFzIExheWVyIERpc2NvdmVyeS4gIER1cmluZyBkaXNjb3ZlcnksCit0aGUgbG9hZGVyIGRldGVybWluZXMgd2hhdCBsYXllcnMgYXJlIGF2YWlsYWJsZSwgdGhlIGxheWVyIG5hbWUsIHRoZSBsYXllcgordmVyc2lvbiwgYW5kIGFueSBleHRlbnNpb25zIHN1cHBvcnRlZCBieSB0aGUgbGF5ZXIuICBUaGlzIGluZm9ybWF0aW9uIGlzCitwcm92aWRlZCBiYWNrIHRvIGFuIGFwcGxpY2F0aW9uIHRocm91Z2ggYHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNgLgorCitUaGUgZ3JvdXAgb2YgbGF5ZXJzIGF2YWlsYWJsZSB0byB0aGUgbG9hZGVyIGlzIGtub3duIGFzIGEgbGF5ZXIgbGlicmFyeS4gIFRoaXMKK3NlY3Rpb24gZGVmaW5lcyBhbiBleHRlbnNpYmxlIGludGVyZmFjZSB0byBkaXNjb3ZlciB3aGF0IGxheWVycyBhcmUgY29udGFpbmVkIGluCit0aGUgbGF5ZXIgbGlicmFyeS4KKworVGhpcyBzZWN0aW9uIGFsc28gc3BlY2lmaWVzIHRoZSBtaW5pbWFsIGNvbnZlbnRpb25zIGFuZCBydWxlcyBhIGxheWVyIG11c3QKK2ZvbGxvdywgZXNwZWNpYWxseSB3aXRoIHJlZ2FyZHMgdG8gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbG9hZGVyIGFuZCBvdGhlciBsYXllcnMuCisKKyMjIyMjIExheWVyIE1hbmlmZXN0IEZpbGUgVXNhZ2UKKworT24gV2luZG93cywgTGludXgsIGFuZCBtYWNPUyBzeXN0ZW1zLCBKU09OLWZvcm1hdHRlZCBtYW5pZmVzdCBmaWxlcyBhcmUgdXNlZCB0byBzdG9yZQorbGF5ZXIgaW5mb3JtYXRpb24uICBJbiBvcmRlciB0byBmaW5kIHN5c3RlbS1pbnN0YWxsZWQgbGF5ZXJzLCB0aGUgVnVsa2FuIGxvYWRlcgord2lsbCByZWFkIHRoZSBKU09OIGZpbGVzIHRvIGlkZW50aWZ5IHRoZSBuYW1lcyBhbmQgYXR0cmlidXRlcyBvZiBsYXllcnMgYW5kCit0aGVpciBleHRlbnNpb25zLiBUaGUgdXNlIG9mIG1hbmlmZXN0IGZpbGVzIGFsbG93cyB0aGUgbG9hZGVyIHRvIGF2b2lkIGxvYWRpbmcKK2FueSBzaGFyZWQgbGlicmFyeSBmaWxlcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBxdWVyeSBub3IgcmVxdWVzdCBhbnkKK2V4dGVuc2lvbnMuICBUaGUgZm9ybWF0IG9mIFtMYXllciBNYW5pZmVzdCBGaWxlXSgjbGF5ZXItbWFuaWZlc3QtZmlsZS1mb3JtYXQpCitpcyBkZXRhaWxlZCBiZWxvdy4KKworVGhlIEFuZHJvaWQgbG9hZGVyIGRvZXMgbm90IHVzZSBtYW5pZmVzdCBmaWxlcy4gIEluc3RlYWQsIHRoZSBsb2FkZXIgcXVlcmllcyB0aGUKK2xheWVyIHByb3BlcnRpZXMgdXNpbmcgc3BlY2lhbCBmdW5jdGlvbnMga25vd24gYXMgImludHJvc3BlY3Rpb24iIGZ1bmN0aW9ucy4KK1RoZSBpbnRlbnQgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIHRvIGRldGVybWluZSB0aGUgc2FtZSByZXF1aXJlZCBpbmZvcm1hdGlvbgorZ2F0aGVyZWQgZnJvbSByZWFkaW5nIHRoZSBtYW5pZmVzdCBmaWxlcy4gIFRoZXNlIGludHJvc3BlY3Rpb24gZnVuY3Rpb25zIGFyZQorbm90IHVzZWQgYnkgdGhlIGRlc2t0b3AgbG9hZGVyIGJ1dCBzaG91bGQgYmUgcHJlc2VudCBpbiBsYXllcnMgdG8gbWFpbnRhaW4KK2NvbnNpc3RlbmN5LiAgVGhlIHNwZWNpZmljICJpbnRyb3NwZWN0aW9uIiBmdW5jdGlvbnMgYXJlIGNhbGxlZCBvdXQgaW4KK3RoZSBbTGF5ZXIgTWFuaWZlc3QgRmlsZSBGb3JtYXRdKCNsYXllci1tYW5pZmVzdC1maWxlLWZvcm1hdCkgdGFibGUuCisKKworIyMjIyMgQW5kcm9pZCBMYXllciBEaXNjb3ZlcnkKKworT24gQW5kcm9pZCwgdGhlIGxvYWRlciBsb29rcyBmb3IgbGF5ZXJzIHRvIGVudW1lcmF0ZSBpbiB0aGUKK2AvZGF0YS9sb2NhbC9kZWJ1Zy92dWxrYW5gIGZvbGRlci4gIEFuIGFwcGxpY2F0aW9uIGVuYWJsZWQgZm9yIGRlYnVnIGhhcyB0aGUKK2FiaWxpdHkgdG8gZW51bWVyYXRlIGFuZCBlbmFibGUgYW55IGxheWVycyBpbiB0aGF0IGxvY2F0aW9uLgorCisKKyMjIyMjIFdpbmRvd3MgTGF5ZXIgRGlzY292ZXJ5CisKK0luIG9yZGVyIHRvIGZpbmQgc3lzdGVtLWluc3RhbGxlZCBsYXllcnMsIHRoZSBWdWxrYW4gbG9hZGVyIHdpbGwgc2NhbiB0aGUKK3ZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIFdpbmRvd3MgcmVnaXN0cnkga2V5czoKKworYGBgCisgICBIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcS2hyb25vc1xWdWxrYW5cRXhwbGljaXRMYXllcnMKKyAgIEhLRVlfQ1VSUkVOVF9VU0VSXFNPRlRXQVJFXEtocm9ub3NcVnVsa2FuXEV4cGxpY2l0TGF5ZXJzCisgICBIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcS2hyb25vc1xWdWxrYW5cSW1wbGljaXRMYXllcnMKKyAgIEhLRVlfQ1VSUkVOVF9VU0VSXFNPRlRXQVJFXEtocm9ub3NcVnVsa2FuXEltcGxpY2l0TGF5ZXJzCitgYGAKKworRm9yIGVhY2ggdmFsdWUgaW4gdGhlc2Uga2V5cyB3aGljaCBoYXMgRFdPUkQgZGF0YSBzZXQgdG8gMCwgdGhlIGxvYWRlciBvcGVucwordGhlIEpTT04gbWFuaWZlc3QgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHZhbHVlLiBFYWNoIG5hbWUgbXVzdCBiZSBhCitmdWxsIHBhdGhuYW1lIHRvIHRoZSBtYW5pZmVzdCBmaWxlLiBBZGRpdGlvbmFsbHksIHRoZSBgSEtFWV9DVVJSRU5UX1VTRVJgIGxvY2F0aW9ucword2lsbCBvbmx5IGJlIHNlYXJjaGVkIGlmIGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgYWRtaW5pc3RyYXRpdmUgcHJpdmlsZWdlcy4KK1RoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCBhbiBhcHBsaWNhdGlvbiB3aXRoIGFkbWluaXN0cmF0aXZlIHByaXZpbGVnZXMgZG9lcyBub3QKK3J1biBsYXllcnMgdGhhdCBkaWQgbm90IG5lZWQgYWRtaW5pc3RyYXRvciBhY2Nlc3MgdG8gaW5zdGFsbC4KKworQWRkaXRpb25hbGx5LCB0aGUgbG9hZGVyIHdpbGwgc2NhbiB0aHJvdWdoIHJlZ2lzdHJ5IGtleXMgc3BlY2lmaWMgdG8gRGlzcGxheQorQWRhcHRlcnMgYW5kIGFsbCBTb2Z0d2FyZSBDb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBhZGFwdGVycyBmb3IgdGhlCitsb2NhdGlvbnMgb2YgSlNPTiBtYW5pZmVzdCBmaWxlcy4gVGhlc2Uga2V5cyBhcmUgbG9jYXRlZCBpbiBkZXZpY2Uga2V5cworY3JlYXRlZCBkdXJpbmcgZHJpdmVyIGluc3RhbGxhdGlvbiBhbmQgY29udGFpbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCitmb3IgYmFzZSBzZXR0aW5ncywgaW5jbHVkaW5nIFZ1bGthbiwgT3BlbkdMLCBhbmQgRGlyZWN0M0QgSUNEIGxvY2F0aW9uLgorCitUaGUgRGV2aWNlIEFkYXB0ZXIgYW5kIFNvZnR3YXJlIENvbXBvbmVudCBrZXkgcGF0aHMgc2hvdWxkIGJlIG9idGFpbmVkIHRocm91Z2ggdGhlIFBuUAorQ29uZmlndXJhdGlvbiBNYW5hZ2VyIEFQSS4gVGhlIGAwMDBYYCBrZXkgd2lsbCBiZSBhIG51bWJlcmVkIGtleSwgd2hlcmUgZWFjaAorZGV2aWNlIGlzIGFzc2lnbmVkIGEgZGlmZmVyZW50IG51bWJlci4KKworYGBgCisgICBIS0VZX0xPQ0FMX01BQ0hJTkVcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcQ2xhc3Nce0FkYXB0ZXIgR1VJRH1cMDAwWFxWdWxrYW5FeHBsaWNpdExheWVycworICAgSEtFWV9MT0NBTF9NQUNISU5FXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXENsYXNzXHtBZGFwdGVyIEdVSUR9XDAwMFhcVnVsa2FuSW1wbGljaXRMYXllcnMKKyAgIEhLRVlfTE9DQUxfTUFDSElORVxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxDbGFzc1x7U29mdHdhcmUgQ29tcG9uZW50IEdVSUR9XDAwMFhcVnVsa2FuRXhwbGljaXRMYXllcnMKKyAgIEhLRVlfTE9DQUxfTUFDSElORVxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxDbGFzc1x7U29mdHdhcmUgQ29tcG9uZW50IEdVSUR9XDAwMFhcVnVsa2FuSW1wbGljaXRMYXllcnMKK2BgYAorCitJbiBhZGRpdGlvbiwgb24gNjQtYml0IHN5c3RlbXMgdGhlcmUgbWF5IGJlIGFub3RoZXIgc2V0IG9mIHJlZ2lzdHJ5IHZhbHVlcywgbGlzdGVkCitiZWxvdy4gVGhlc2UgdmFsdWVzIHJlY29yZCB0aGUgbG9jYXRpb25zIG9mIDMyLWJpdCBsYXllcnMgb24gNjQtYml0IG9wZXJhdGluZyBzeXN0ZW1zLAoraW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBXaW5kb3dzLW9uLVdpbmRvd3MgZnVuY3Rpb25hbGl0eS4KKworYGBgCisgICBIS0VZX0xPQ0FMX01BQ0hJTkVcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcQ2xhc3Nce0FkYXB0ZXIgR1VJRH1cMDAwWFxWdWxrYW5FeHBsaWNpdExheWVyc1dvdworICAgSEtFWV9MT0NBTF9NQUNISU5FXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXENsYXNzXHtBZGFwdGVyIEdVSUR9XDAwMFhcVnVsa2FuSW1wbGljaXRMYXllcnNXb3cKKyAgIEhLRVlfTE9DQUxfTUFDSElORVxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxDbGFzc1x7U29mdHdhcmUgQ29tcG9uZW50IEdVSUR9XDAwMFhcVnVsa2FuRXhwbGljaXRMYXllcnNXb3cKKyAgIEhLRVlfTE9DQUxfTUFDSElORVxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxDbGFzc1x7U29mdHdhcmUgQ29tcG9uZW50IEdVSUR9XDAwMFhcVnVsa2FuSW1wbGljaXRMYXllcnNXb3cKK2BgYAorCitJZiBhbnkgb2YgdGhlIGFib3ZlIHZhbHVlcyBleGlzdCBhbmQgaXMgb2YgdHlwZSBgUkVHX1NaYCwgdGhlIGxvYWRlciB3aWxsIG9wZW4gdGhlIEpTT04KK21hbmlmZXN0IGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBrZXkgdmFsdWUuIEVhY2ggdmFsdWUgbXVzdCBiZSBhIGZ1bGwgYWJzb2x1dGUKK3BhdGggdG8gYSBKU09OIG1hbmlmZXN0IGZpbGUuIEEga2V5IHZhbHVlIG1heSBhbHNvIGJlIG9mIHR5cGUgYFJFR19NVUxUSV9TWmAsIGluCit3aGljaCBjYXNlIHRoZSB2YWx1ZSB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgbGlzdCBvZiBwYXRocyB0byBKU09OIG1hbmlmZXN0IGZpbGVzLgorCitJbiBnZW5lcmFsLCBhcHBsaWNhdGlvbnMgc2hvdWxkIGluc3RhbGwgbGF5ZXJzIGludG8gdGhlIGBTT0ZUV0FSRVxLaHJvbm9zXFZ1bGthbmAKK3BhdGhzLiBUaGUgUG5QIHJlZ2lzdHJ5IGxvY2F0aW9ucyBhcmUgaW50ZW5kZWQgc3BlY2lmaWNhbGx5IGZvciBsYXllcnMgdGhhdCBhcmUKK2Rpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBkcml2ZXIgaW5zdGFsbGF0aW9uLiBBbiBhcHBsaWNhdGlvbiBpbnN0YWxsZXIgc2hvdWxkIG5vdAorbW9kaWZ5IHRoZSBkZXZpY2Utc3BlY2lmaWMgcmVnaXN0cmllcywgd2hpbGUgYSBkZXZpY2UgZHJpdmVyIHNob3VsZCBub3QgbW9kaWZ5Cit0aGUgc3lzdGVtIHJlZ2lzdHJpZXMuCisKK1RoZSBWdWxrYW4gbG9hZGVyIHdpbGwgb3BlbiBlYWNoIG1hbmlmZXN0IGZpbGUgdGhhdCBpcyBnaXZlbgordG8gb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXllciwgaW5jbHVkaW5nIHRoZSBuYW1lIG9yIHBhdGhuYW1lIG9mIGEKK3NoYXJlZCBsaWJyYXJ5ICgiLmRsbCIpIGZpbGUuICBIb3dldmVyLCBpZiBWS1xfTEFZRVJcX1BBVEggaXMgZGVmaW5lZCwgdGhlbiB0aGUKK2xvYWRlciB3aWxsIGluc3RlYWQgbG9vayBhdCB0aGUgcGF0aHMgZGVmaW5lZCBieSB0aGF0IHZhcmlhYmxlIGluc3RlYWQgb2YgdXNpbmcKK3RoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGVzZSByZWdpc3RyeSBrZXlzLiAgU2VlCitbRm9yY2luZyBMYXllciBTb3VyY2UgRm9sZGVyc10oI2ZvcmNpbmctbGF5ZXItc291cmNlLWZvbGRlcnMpIGZvciBtb3JlCitpbmZvcm1hdGlvbiBvbiB0aGlzLgorCisKKyMjIyMjIExpbnV4IExheWVyIERpc2NvdmVyeQorCitPbiBMaW51eCwgdGhlIFZ1bGthbiBsb2FkZXIgd2lsbCBzY2FuIHRoZSBmaWxlcyBpbiB0aGUgZm9sbG93aW5nIExpbnV4CitkaXJlY3RvcmllczoKKworICAgIC91c3IvbG9jYWwvZXRjL3Z1bGthbi9leHBsaWNpdF9sYXllci5kCisgICAgL3Vzci9sb2NhbC9ldGMvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQKKyAgICAvdXNyL2xvY2FsL3NoYXJlL3Z1bGthbi9leHBsaWNpdF9sYXllci5kCisgICAgL3Vzci9sb2NhbC9zaGFyZS92dWxrYW4vaW1wbGljaXRfbGF5ZXIuZAorICAgIC9ldGMvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmQKKyAgICAvZXRjL3Z1bGthbi9pbXBsaWNpdF9sYXllci5kCisgICAgL3Vzci9zaGFyZS92dWxrYW4vZXhwbGljaXRfbGF5ZXIuZAorICAgIC91c3Ivc2hhcmUvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQKKyAgICAkSE9NRS8ubG9jYWwvc2hhcmUvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmQKKyAgICAkSE9NRS8ubG9jYWwvc2hhcmUvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQKKworT2YgY291cnNlLCB0aGVyZSBhcmUgc29tZSB0aGluZ3MgeW91IGhhdmUgdG8ga25vdyBhYm91dCB0aGUgYWJvdmUgZm9sZGVyczoKKyAxLiBUaGUgIi91c3IvbG9jYWwvKiIgZGlyZWN0b3JpZXMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYmUgb3RoZXIgZGlyZWN0b3JpZXMgYXQKK2J1aWxkIHRpbWUuCisgMi4gJEhPTUUgaXMgdGhlIGN1cnJlbnQgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGFwcGxpY2F0aW9uJ3MgdXNlciBpZDsgdGhpcyBwYXRoCit3aWxsIGJlIGlnbm9yZWQgZm9yIHN1aWQgcHJvZ3JhbXMuCisgMy4gVGhlICIvdXNyL2xvY2FsL2V0Yy92dWxrYW4vXCpcX2xheWVyLmQiIGFuZAorIi91c3IvbG9jYWwvc2hhcmUvdnVsa2FuL1wqXF9sYXllci5kIiBkaXJlY3RvcmllcyBhcmUgZm9yIGxheWVycyB0aGF0IGFyZQoraW5zdGFsbGVkIGZyb20gbG9jYWxseS1idWlsdCBzb3VyY2VzLgorIDQuIFRoZSAiL3Vzci9zaGFyZS92dWxrYW4vXCpcX2xheWVyLmQiIGRpcmVjdG9yaWVzIGFyZSBmb3IgbGF5ZXJzIHRoYXQgYXJlCitpbnN0YWxsZWQgZnJvbSBMaW51eC1kaXN0cmlidXRpb24tcHJvdmlkZWQgcGFja2FnZXMuCis1LiBUaGUgbG9jYXRpb25zIGluIGAkSE9NRWAgd2lsbCBvbmx5IGJlIHNlYXJjaGVkIGlmIGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUKK3Jvb3QgYWNjZXNzLiBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgYW4gYXBwbGljYXRpb24gd2l0aCByb290IGFjY2VzcyBkb2VzIG5vdAorcnVuIGxheWVycyB0aGF0IGRpZCBub3QgbmVlZCByb290IGFjY2VzcyB0byBpbnN0YWxsLgorCitBcyBvbiBXaW5kb3dzLCBpZiBWS1xfTEFZRVJcX1BBVEggaXMgZGVmaW5lZCwgdGhlbiB0aGUKK2xvYWRlciB3aWxsIGluc3RlYWQgbG9vayBhdCB0aGUgcGF0aHMgZGVmaW5lZCBieSB0aGF0IHZhcmlhYmxlIGluc3RlYWQgb2YgdXNpbmcKK3RoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGVzZSBkZWZhdWx0IHBhdGhzLiAgSG93ZXZlciwgdGhlc2UKK2Vudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgb25seSB1c2VkIGZvciBub24tc3VpZCBwcm9ncmFtcy4gIFNlZQorW0ZvcmNpbmcgTGF5ZXIgU291cmNlIEZvbGRlcnNdKCNmb3JjaW5nLWxheWVyLXNvdXJjZS1mb2xkZXJzKSBmb3IgbW9yZQoraW5mb3JtYXRpb24gb24gdGhpcy4KKworIyMjIyMgbWFjT1MgTGF5ZXIgRGlzY292ZXJ5CisKK09uIG1hY09TLCB0aGUgVnVsa2FuIGxvYWRlciB3aWxsIHNjYW4gdGhlIGZpbGVzIGluIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXM6CisKKyAgICA8YnVuZGxlPi9Db250ZW50cy9SZXNvdXJjZXMvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmQKKyAgICA8YnVuZGxlPi9Db250ZW50cy9SZXNvdXJjZXMvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQKKyAgICAvZXRjL3Z1bGthbi9leHBsaWNpdF9sYXllci5kCisgICAgL2V0Yy92dWxrYW4vaW1wbGljaXRfbGF5ZXIuZAorICAgIC91c3IvbG9jYWwvc2hhcmUvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmQKKyAgICAvdXNyL2xvY2FsL3NoYXJlL3Z1bGthbi9pbXBsaWNpdF9sYXllci5kCisgICAgL3Vzci9zaGFyZS92dWxrYW4vZXhwbGljaXRfbGF5ZXIuZAorICAgIC91c3Ivc2hhcmUvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQKKyAgICAkSE9NRS8ubG9jYWwvc2hhcmUvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmQKKyAgICAkSE9NRS8ubG9jYWwvc2hhcmUvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQKKworMS4gJmx0O2J1bmRsZSZndDsgaXMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGEgYnVuZGxlZCBhcHBsaWNhdGlvbi4gIEl0IGlzIHNjYW5uZWQgZmlyc3QuCisyLiBUaGUgIi91c3IvbG9jYWwvXCoiIGRpcmVjdG9yaWVzIGNhbiBiZSBjb25maWd1cmVkIHRvIGJlIG90aGVyIGRpcmVjdG9yaWVzIGF0CitidWlsZCB0aW1lLgorMy4gJEhPTUUgaXMgdGhlIGN1cnJlbnQgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGFwcGxpY2F0aW9uJ3MgdXNlciBpZDsgdGhpcyBwYXRoCit3aWxsIGJlIGlnbm9yZWQgZm9yIHN1aWQgcHJvZ3JhbXMuCis0LiBUaGUgbG9jYXRpb25zIGluIGAkSE9NRWAgd2lsbCBvbmx5IGJlIHNlYXJjaGVkIGlmIGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUKK3Jvb3QgYWNjZXNzLiBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgYW4gYXBwbGljYXRpb24gd2l0aCByb290IGFjY2VzcyBkb2VzIG5vdAorcnVuIGxheWVycyB0aGF0IGRpZCBub3QgbmVlZCByb290IGFjY2VzcyB0byBpbnN0YWxsLgorCitBcyBvbiBXaW5kb3dzLCBpZiBWS1xfTEFZRVJcX1BBVEggaXMgZGVmaW5lZCwgdGhlbiB0aGUKK2xvYWRlciB3aWxsIGluc3RlYWQgbG9vayBhdCB0aGUgcGF0aHMgZGVmaW5lZCBieSB0aGF0IHZhcmlhYmxlIGluc3RlYWQgb2YgdXNpbmcKK3RoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGVzZSBkZWZhdWx0IHBhdGhzLiAgSG93ZXZlciwgdGhlc2UKK2Vudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgb25seSB1c2VkIGZvciBub24tc3VpZCBwcm9ncmFtcy4gIFNlZQorW0ZvcmNpbmcgTGF5ZXIgU291cmNlIEZvbGRlcnNdKCNmb3JjaW5nLWxheWVyLXNvdXJjZS1mb2xkZXJzKSBmb3IgbW9yZQoraW5mb3JtYXRpb24gb24gdGhpcy4KKworIyMjIyBMYXllciBWZXJzaW9uIE5lZ290aWF0aW9uCisKK05vdyB0aGF0IGEgbGF5ZXIgaGFzIGJlZW4gZGlzY292ZXJlZCwgYW4gYXBwbGljYXRpb24gY2FuIGNob29zZSB0byBsb2FkIGl0IChvcgoraXQgaXMgbG9hZGVkIGJ5IGRlZmF1bHQgaWYgaXQgaXMgYW4gSW1wbGljaXQgbGF5ZXIpLiAgV2hlbiB0aGUgbG9hZGVyIGF0dGVtcHRzCit0byBsb2FkIHRoZSBsYXllciwgdGhlIGZpcnN0IHRoaW5nIGl0IGRvZXMgaXMgYXR0ZW1wdCB0byBuZWdvdGlhdGUgdGhlIHZlcnNpb24KK29mIHRoZSBsb2FkZXIgdG8gbGF5ZXIgaW50ZXJmYWNlLiAgSW4gb3JkZXIgdG8gbmVnb3RpYXRlIHRoZSBsb2FkZXIvbGF5ZXIKK2ludGVyZmFjZSB2ZXJzaW9uLCB0aGUgbGF5ZXIgbXVzdCBpbXBsZW1lbnQgdGhlCitgdmtOZWdvdGlhdGVMb2FkZXJMYXllckludGVyZmFjZVZlcnNpb25gIGZ1bmN0aW9uLiAgVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpcworcHJvdmlkZWQgZm9yIHRoaXMgaW50ZXJmYWNlIGluIGluY2x1ZGUvdnVsa2FuL3ZrX2xheWVyLmg6CisKK2BgYGNwcAorICB0eXBlZGVmIGVudW0gVmtOZWdvdGlhdGVMYXllclN0cnVjdFR5cGUgeworICAgICAgTEFZRVJfTkVHT1RJQVRFX0lOVEVSRkFDRV9TVFJVQ1QgPSAxLAorICB9IFZrTmVnb3RpYXRlTGF5ZXJTdHJ1Y3RUeXBlOworCisgIHR5cGVkZWYgc3RydWN0IFZrTmVnb3RpYXRlTGF5ZXJJbnRlcmZhY2UgeworICAgICAgVmtOZWdvdGlhdGVMYXllclN0cnVjdFR5cGUgc1R5cGU7CisgICAgICB2b2lkICpwTmV4dDsKKyAgICAgIHVpbnQzMl90IGxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbjsKKyAgICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgcGZuR2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIHBmbkdldERldmljZVByb2NBZGRyOworICAgICAgUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgcGZuR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcjsKKyAgfSBWa05lZ290aWF0ZUxheWVySW50ZXJmYWNlOworCisgIFZrUmVzdWx0IHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uKAorICAgICAgICAgICAgICAgICAgIFZrTmVnb3RpYXRlTGF5ZXJJbnRlcmZhY2UgKnBWZXJzaW9uU3RydWN0KTsKK2BgYAorCitZb3UnbGwgbm90aWNlIHRoZSBgVmtOZWdvdGlhdGVMYXllckludGVyZmFjZWAgc3RydWN0dXJlIGlzIHNpbWlsYXIgdG8gb3RoZXIKK1Z1bGthbiBzdHJ1Y3R1cmVzLiAgVGhlICJzVHlwZSIgZmllbGQsIGluIHRoaXMgY2FzZSB0YWtlcyBhIG5ldyBlbnVtIGRlZmluZWQKK2p1c3QgZm9yIGludGVybmFsIGxvYWRlci9sYXllciBpbnRlcmZhY2luZyB1c2UuICBUaGUgdmFsaWQgdmFsdWVzIGZvciAic1R5cGUiCitjb3VsZCBncm93IGluIHRoZSBmdXR1cmUsIGJ1dCByaWdodCBub3cgb25seSBoYXMgdGhlIG9uZSB2YWx1ZQorIkxBWUVSX05FR09USUFURV9JTlRFUkZBQ0VfU1RSVUNUIi4KKworVGhpcyBmdW5jdGlvbiAoYHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uYCkgc2hvdWxkIGJlIGV4cG9ydGVkIGJ5Cit0aGUgbGF5ZXIgc28gdGhhdCB1c2luZyAiR2V0UHJvY0FkZHJlc3MiIG9uIFdpbmRvd3Mgb3IgImRsc3ltIiBvbiBMaW51eCBvciBtYWNPUywgc2hvdWxkCityZXR1cm4gYSB2YWxpZCBmdW5jdGlvbiBwb2ludGVyIHRvIGl0LiAgT25jZSB0aGUgbG9hZGVyIGhhcyBncmFiYmVkIGEgdmFsaWQKK2FkZHJlc3MgdG8gdGhlIGxheWVycyBmdW5jdGlvbiwgdGhlIGxvYWRlciB3aWxsIGNyZWF0ZSBhIHZhcmlhYmxlIG9mIHR5cGUKK2BWa05lZ290aWF0ZUxheWVySW50ZXJmYWNlYCBhbmQgaW5pdGlhbGl6ZSBpdCBpbiB0aGUgZm9sbG93aW5nIHdheXM6CisgMS4gU2V0IHRoZSBzdHJ1Y3R1cmUgInNUeXBlIiB0byAiTEFZRVJfTkVHT1RJQVRFX0lOVEVSRkFDRV9TVFJVQ1QiCisgMi4gU2V0IHBOZXh0IHRvIE5VTEwuCisgICAgIC0gVGhpcyBpcyBmb3IgZnV0dXJlIGdyb3d0aAorIDMuIFNldCAibG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uIiB0byB0aGUgY3VycmVudCB2ZXJzaW9uIHRoZSBsb2FkZXIgZGVzaXJlcwordG8gc2V0IHRoZSBpbnRlcmZhY2UgdG8uCisgICAgICAtIFRoZSBtaW5pbXVtIHZhbHVlIHNlbnQgYnkgdGhlIGxvYWRlciB3aWxsIGJlIDIgc2luY2UgaXQgaXMgdGhlIGZpcnN0Cit2ZXJzaW9uIHN1cHBvcnRpbmcgdGhpcyBmdW5jdGlvbi4KKworVGhlIGxvYWRlciB3aWxsIHRoZW4gaW5kaXZpZHVhbGx5IGNhbGwgZWFjaCBsYXllcuKAmXMKK2B2a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbmAgZnVuY3Rpb24gd2l0aCB0aGUgZmlsbGVkIG91dAor4oCcVmtOZWdvdGlhdGVMYXllckludGVyZmFjZeKAnS4gVGhlIGxheWVyIHdpbGwgZWl0aGVyIGFjY2VwdCB0aGUgbG9hZGVyJ3MgdmVyc2lvbgorc2V0IGluICJsb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24iLCBvciBtb2RpZnkgaXQgdG8gdGhlIGNsb3Nlc3QgdmFsdWUgdmVyc2lvbgorb2YgdGhlIGludGVyZmFjZSB0aGF0IHRoZSBsYXllciBjYW4gc3VwcG9ydC4gIFRoZSB2YWx1ZSBzaG91bGQgbm90IGJlIGhpZ2hlcgordGhhbiB0aGUgdmVyc2lvbiByZXF1ZXN0ZWQgYnkgdGhlIGxvYWRlci4gIElmIHRoZSBsYXllciBjYW4ndCBzdXBwb3J0IGF0IGEKK21pbmltdW0gdGhlIHZlcnNpb24gcmVxdWVzdGVkLCB0aGVuIHRoZSBsYXllciBzaG91bGQgcmV0dXJuIGFuIGVycm9yIGxpa2UKKyJWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQiLiAgSWYgYSBsYXllciBjYW4gc3VwcG9ydCBzb21lIHZlcnNpb24sIHRoZW4KK3RoZSBsYXllciBzaG91bGQgZG8gdGhlIGZvbGxvd2luZzoKKyAxLiBBZGp1c3QgdGhlIHZlcnNpb24gdG8gdGhlIGxheWVyJ3MgZGVzaXJlZCB2ZXJzaW9uLgorIDIuIFRoZSBsYXllciBzaG91bGQgZmlsbCBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciB2YWx1ZXMgdG8gaXRzIGludGVybmFsCitmdW5jdGlvbnM6CisgICAgLSAicGZuR2V0SW5zdGFuY2VQcm9jQWRkciIgc2hvdWxkIGJlIHNldCB0byB0aGUgbGF5ZXLigJlzIGludGVybmFsCitgR2V0SW5zdGFuY2VQcm9jQWRkcmAgZnVuY3Rpb24uCisgICAgLSAicGZuR2V0RGV2aWNlUHJvY0FkZHIiIHNob3VsZCBiZSBzZXQgdG8gdGhlIGxheWVy4oCZcyBpbnRlcm5hbAorYEdldERldmljZVByb2NBZGRyYCBmdW5jdGlvbi4KKyAgICAtICJwZm5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyIiBzaG91bGQgYmUgc2V0IHRvIHRoZSBsYXllcuKAmXMgaW50ZXJuYWwKK2BHZXRQaHlzaWNhbERldmljZVByb2NBZGRyYCBmdW5jdGlvbi4KKyAgICAgIC0gSWYgdGhlIGxheWVyIHN1cHBvcnRzIG5vIHBoeXNpY2FsIGRldmljZSBleHRlbnNpb25zLCBpdCBtYXkgc2V0IHRoZQordmFsdWUgdG8gTlVMTC4KKyAgICAgIC0gTW9yZSBvbiB0aGlzIGZ1bmN0aW9uIGxhdGVyCisgMy4gVGhlIGxheWVyIHNob3VsZCByZXR1cm4gIlZLX1NVQ0NFU1MiCisKK1RoaXMgZnVuY3Rpb24gKipTSE9VTEQgTk9UIENBTEwgRE9XTioqIHRoZSBsYXllciBjaGFpbiB0byB0aGUgbmV4dCBsYXllci4KK1RoZSBsb2FkZXIgd2lsbCB3b3JrIHdpdGggZWFjaCBsYXllciBpbmRpdmlkdWFsbHkuCisKK0lmIHRoZSBsYXllciBzdXBwb3J0cyB0aGUgbmV3IGludGVyZmFjZSBhbmQgcmVwb3J0cyB2ZXJzaW9uIDIgb3IgZ3JlYXRlciwgdGhlbgordGhlIGxvYWRlciB3aWxsIHVzZSB0aGUg4oCcZnBHZXRJbnN0YW5jZVByb2NBZGRy4oCdIGFuZCDigJxmcEdldERldmljZVByb2NBZGRy4oCdCitmdW5jdGlvbnMgZnJvbSB0aGUg4oCcVmtOZWdvdGlhdGVMYXllckludGVyZmFjZeKAnSBzdHJ1Y3R1cmUuICBQcmlvciB0byB0aGVzZQorY2hhbmdlcywgdGhlIGxvYWRlciB3b3VsZCBxdWVyeSBlYWNoIG9mIHRob3NlIGZ1bmN0aW9ucyB1c2luZyAiR2V0UHJvY0FkZHJlc3MiCitvbiBXaW5kb3dzIG9yICJkbHN5bSIgb24gTGludXggb3IgbWFjT1MuCisKKworIyMjIyBMYXllciBDYWxsIENoYWlucyBhbmQgRGlzdHJpYnV0ZWQgRGlzcGF0Y2gKKworVGhlcmUgYXJlIHR3byBrZXkgYXJjaGl0ZWN0dXJhbCBmZWF0dXJlcyB0aGF0IGRyaXZlIHRoZSBsb2FkZXIgdG8gbGF5ZXIgbGlicmFyeQoraW50ZXJmYWNlOgorIDEuIFNlcGFyYXRlIGFuZCBkaXN0aW5jdCBpbnN0YW5jZSBhbmQgZGV2aWNlIGNhbGwgY2hhaW5zCisgMi4gRGlzdHJpYnV0ZWQgZGlzcGF0Y2guCisKK1lvdSBjYW4gcmVhZCBhbiBvdmVydmlldyBvZiBkaXNwYXRjaCB0YWJsZXMgYW5kIGNhbGwgY2hhaW5zIGFib3ZlIGluIHRoZQorW0Rpc3BhdGNoIFRhYmxlcyBhbmQgQ2FsbCBDaGFpbnNdKCNkaXNwYXRjaC10YWJsZXMtYW5kLWNhbGwtY2hhaW5zKSBzZWN0aW9uLgorCitXaGF0J3MgaW1wb3J0YW50IHRvIG5vdGUgaGVyZSBpcyB0aGF0IGEgbGF5ZXIgY2FuIGludGVyY2VwdCBWdWxrYW4KK2luc3RhbmNlIGZ1bmN0aW9ucywgZGV2aWNlIGZ1bmN0aW9ucyBvciBib3RoLiBGb3IgYSBsYXllciB0byBpbnRlcmNlcHQgaW5zdGFuY2UKK2Z1bmN0aW9ucywgaXQgbXVzdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgaW5zdGFuY2UgY2FsbCBjaGFpbi4gIEZvciBhIGxheWVyIHRvCitpbnRlcmNlcHQgZGV2aWNlIGZ1bmN0aW9ucywgaXQgbXVzdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgZGV2aWNlIGNhbGwgY2hhaW4uCisKK1JlbWVtYmVyLCBhIGxheWVyIGRvZXMgbm90IG5lZWQgdG8gaW50ZXJjZXB0IGFsbCBpbnN0YW5jZSBvciBkZXZpY2UgZnVuY3Rpb25zLAoraW5zdGVhZCwgaXQgY2FuIGNob29zZSB0byBpbnRlcmNlcHQgb25seSBhIHN1YnNldCBvZiB0aG9zZSBmdW5jdGlvbnMuCisKK05vcm1hbGx5LCB3aGVuIGEgbGF5ZXIgaW50ZXJjZXB0cyBhIGdpdmVuIFZ1bGthbiBmdW5jdGlvbiwgaXQgd2lsbCBjYWxsIGRvd24gdGhlCitpbnN0YW5jZSBvciBkZXZpY2UgY2FsbCBjaGFpbiBhcyBuZWVkZWQuIFRoZSBsb2FkZXIgYW5kIGFsbCBsYXllciBsaWJyYXJpZXMgdGhhdAorcGFydGljaXBhdGUgaW4gYSBjYWxsIGNoYWluIGNvb3BlcmF0ZSB0byBlbnN1cmUgdGhlIGNvcnJlY3Qgc2VxdWVuY2luZyBvZiBjYWxscworZnJvbSBvbmUgZW50aXR5IHRvIHRoZSBuZXh0LiBUaGlzIGdyb3VwIGVmZm9ydCBmb3IgY2FsbCBjaGFpbiBzZXF1ZW5jaW5nIGlzCitoZXJlaW5hZnRlciByZWZlcnJlZCB0byBhcyAqKmRpc3RyaWJ1dGVkIGRpc3BhdGNoKiouCisKK0luIGRpc3RyaWJ1dGVkIGRpc3BhdGNoIGVhY2ggbGF5ZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3Blcmx5IGNhbGxpbmcgdGhlIG5leHQKK2VudGl0eSBpbiB0aGUgY2FsbCBjaGFpbi4gVGhpcyBtZWFucyB0aGF0IGEgZGlzcGF0Y2ggbWVjaGFuaXNtIGlzIHJlcXVpcmVkIGZvcgorYWxsIFZ1bGthbiBmdW5jdGlvbnMgdGhhdCBhIGxheWVyIGludGVyY2VwdHMuIElmIGEgVnVsa2FuIGZ1bmN0aW9uIGlzIG5vdAoraW50ZXJjZXB0ZWQgYnkgYSBsYXllciwgb3IgaWYgYSBsYXllciBjaG9vc2VzIHRvIHRlcm1pbmF0ZSB0aGUgZnVuY3Rpb24gYnkgbm90CitjYWxsaW5nIGRvd24gdGhlIGNoYWluLCB0aGVuIG5vIGRpc3BhdGNoIGlzIG5lZWRlZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgorCitGb3IgZXhhbXBsZSwgaWYgdGhlIGVuYWJsZWQgbGF5ZXJzIGludGVyY2VwdGVkIG9ubHkgY2VydGFpbiBpbnN0YW5jZSBmdW5jdGlvbnMsCit0aGUgY2FsbCBjaGFpbiB3b3VsZCBsb29rIGFzIGZvbGxvd3M6CishW0luc3RhbmNlIEZ1bmN0aW9uIENoYWluXSguL2ltYWdlcy9mdW5jdGlvbl9pbnN0YW5jZV9jaGFpbi5wbmcpCisKK0xpa2V3aXNlLCBpZiB0aGUgZW5hYmxlZCBsYXllcnMgaW50ZXJjZXB0ZWQgb25seSBhIGZldyBvZiB0aGUgZGV2aWNlIGZ1bmN0aW9ucywKK3RoZSBjYWxsIGNoYWluIGNvdWxkIGxvb2sgdGhpcyB3YXk6CishW0RldmljZSBGdW5jdGlvbiBDaGFpbl0oLi9pbWFnZXMvZnVuY3Rpb25fZGV2aWNlX2NoYWluLnBuZykKKworVGhlIGxvYWRlciBpcyByZXNwb25zaWJsZSBmb3IgZGlzcGF0Y2hpbmcgYWxsIGNvcmUgYW5kIGluc3RhbmNlIGV4dGVuc2lvbiBWdWxrYW4KK2Z1bmN0aW9ucyB0byB0aGUgZmlyc3QgZW50aXR5IGluIHRoZSBjYWxsIGNoYWluLgorCisKKyMjIyMgTGF5ZXIgVW5rbm93biBQaHlzaWNhbCBEZXZpY2UgRXh0ZW5zaW9ucworCitPcmlnaW5hbGx5LCBpZiB0aGUgbG9hZGVyIHdhcyBjYWxsZWQgd2l0aCBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCwgaXQgd291bGQKK3Jlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGJlaGF2aW9yOgorIDEuIFRoZSBsb2FkZXIgd291bGQgY2hlY2sgaWYgY29yZSBmdW5jdGlvbjoKKyAgICAtIElmIGl0IHdhcywgaXQgd291bGQgcmV0dXJuIHRoZSBmdW5jdGlvbiBwb2ludGVyCisgMi4gVGhlIGxvYWRlciB3b3VsZCBjaGVjayBpZiBrbm93biBleHRlbnNpb24gZnVuY3Rpb246CisgICAgLSBJZiBpdCB3YXMsIGl0IHdvdWxkIHJldHVybiB0aGUgZnVuY3Rpb24gcG9pbnRlcgorIDMuIElmIHRoZSBsb2FkZXIga25ldyBub3RoaW5nIGFib3V0IGl0LCBpdCB3b3VsZCBjYWxsIGRvd24gdXNpbmcKK2BHZXRJbnN0YW5jZVByb2NBZGRyYAorICAgIC0gSWYgaXQgcmV0dXJuZWQgbm9uLU5VTEwsIHRyZWF0IGl0IGFzIGFuIHVua25vd24gbG9naWNhbCBkZXZpY2UgY29tbWFuZC4KKyAgICAtIFRoaXMgbWVhbnQgc2V0dGluZyB1cCBhIGdlbmVyaWMgdHJhbXBvbGluZSBmdW5jdGlvbiB0aGF0IHRha2VzIGluIGEKK1ZrRGV2aWNlIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIGFkanVzdGluZyB0aGUgZGlzcGF0Y2ggdGFibGUgdG8gY2FsbCB0aGUKK0lDRC9MYXllcnMgZnVuY3Rpb24gYWZ0ZXIgZ2V0dGluZyB0aGUgZGlzcGF0Y2ggdGFibGUgZnJvbSB0aGUgVmtEZXZpY2UuCisgNC4gSWYgYWxsIHRoZSBhYm92ZSBmYWlsZWQsIHRoZSBsb2FkZXIgd291bGQgcmV0dXJuIE5VTEwgdG8gdGhlIGFwcGxpY2F0aW9uLgorCitUaGlzIGNhdXNlZCBwcm9ibGVtcyB3aGVuIGEgbGF5ZXIgYXR0ZW1wdGVkIHRvIGV4cG9zZSBuZXcgcGh5c2ljYWwgZGV2aWNlCitleHRlbnNpb25zIHRoZSBsb2FkZXIga25ldyBub3RoaW5nIGFib3V0LCBidXQgYW4gYXBwbGljYXRpb24gZGlkLiAgQmVjYXVzZSB0aGUKK2xvYWRlciBrbmV3IG5vdGhpbmcgYWJvdXQgaXQsIHRoZSBsb2FkZXIgd291bGQgZ2V0IHRvIHN0ZXAgMyBpbiB0aGUgYWJvdmUKK3Byb2Nlc3MgYW5kIHdvdWxkIHRyZWF0IHRoZSBmdW5jdGlvbiBhcyBhbiB1bmtub3duIGxvZ2ljYWwgZGV2aWNlIGNvbW1hbmQuICBUaGUKK3Byb2JsZW0gaXMsIHRoaXMgd291bGQgY3JlYXRlIGEgZ2VuZXJpYyBWa0RldmljZSB0cmFtcG9saW5lIGZ1bmN0aW9uIHdoaWNoLCBvbgordGhlIGZpcnN0IGNhbGwsIHdvdWxkIGF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgdGhlIFZrUGh5c2ljYWxEZXZpY2UgYXMgYSBWa0RldmljZS4KK1RoaXMgd291bGQgbGVhZCB0byBhIGNyYXNoIG9yIGNvcnJ1cHRpb24uCisKK0luIG9yZGVyIHRvIGlkZW50aWZ5IHRoZSBleHRlbnNpb24gZW50cnkgcG9pbnRzIHNwZWNpZmljIHRvIHBoeXNpY2FsIGRldmljZQorZXh0ZW5zaW9ucywgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjYW4gYmUgYWRkZWQgdG8gYSBsYXllcjoKKworYGBgY3BwCitQRk5fdmtWb2lkRnVuY3Rpb24gdmtfbGF5ZXJHZXRQaHlzaWNhbERldmljZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBOYW1lKTsKK2BgYAorCitUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgc2ltaWxhciB0byBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCBhbmQKK2B2a0dldERldmljZVByb2NBZGRyYCBleGNlcHQgaXQgc2hvdWxkIG9ubHkgcmV0dXJuIHZhbHVlcyBmb3IgcGh5c2ljYWwgZGV2aWNlCitleHRlbnNpb24gZW50cnkgcG9pbnRzLiAgSW4gdGhpcyB3YXksIGl0IGNvbXBhcmVzICJwTmFtZSIgdG8gZXZlcnkgcGh5c2ljYWwKK2RldmljZSBmdW5jdGlvbiBzdXBwb3J0ZWQgaW4gdGhlIGxheWVyLgorCitUaGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgorICAqIElmIGl0IGlzIHRoZSBuYW1lIG9mIGEgcGh5c2ljYWwgZGV2aWNlIGZ1bmN0aW9uIHN1cHBvcnRlZCBieSB0aGUgbGF5ZXIsIHRoZQorcG9pbnRlciB0byB0aGUgbGF5ZXIncyBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgKiBJZiBpdCBpcyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZ1bmN0aW9uIHdoaWNoIGlzICoqbm90KiogYSBwaHlzaWNhbCBkZXZpY2UKK2Z1bmN0aW9uIChpLmUuIGFuIEluc3RhbmNlLCBEZXZpY2UsIG9yIG90aGVyIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJ5IHRoZSBsYXllciksCit0aGVuIHRoZSB2YWx1ZSBvZiBOVUxMIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAqIFdlIGRvbuKAmXQgY2FsbCBkb3duIHNpbmNlIHdlIGtub3cgdGhlIGNvbW1hbmQgaXMgbm90IGEgcGh5c2ljYWwgZGV2aWNlCitleHRlbnNpb24pLgorICAqIElmIHRoZSBsYXllciBoYXMgbm8gaWRlYSB3aGF0IHRoaXMgZnVuY3Rpb24gaXMsIGl0IHNob3VsZCBjYWxsIGRvd24gdGhlIGxheWVyCitjaGFpbiB0byB0aGUgbmV4dCBgdmtfbGF5ZXJHZXRQaHlzaWNhbERldmljZVByb2NBZGRyYCBjYWxsLgorICAgICogVGhpcyBjYW4gYmUgcmV0cmlldmVkIGluIG9uZSBvZiB0d28gd2F5czoKKyAgICAgICogRHVyaW5nIGB2a0NyZWF0ZUluc3RhbmNlYCwgaXQgaXMgcGFzc2VkIHRvIGEgbGF5ZXIgaW4gdGhlCitjaGFpbiBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gYSBsYXllciBpbiB0aGUgYFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm9gCitzdHJ1Y3R1cmUuCisgICAgICAgICogVXNlIGBnZXRfY2hhaW5faW5mbygpYCB0byBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlCitgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mb2Agc3RydWN0dXJlLiAgTGV0J3MgY2FsbCBpdCBjaGFpbl9pbmZvLgorICAgICAgICAqIFRoZSBhZGRyZXNzIGlzIHRoZW4gdW5kZXIKK2NoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIKKyAgICAgICAgKiBTZWUKK1tFeGFtcGxlIENvZGUgZm9yIENyZWF0ZUluc3RhbmNlXSgjZXhhbXBsZS1jb2RlLWZvci1jcmVhdGVpbnN0YW5jZSkKKyAgICAgICogVXNpbmcgdGhlIG5leHQgbGF5ZXLigJlzIGBHZXRJbnN0YW5jZVByb2NBZGRyYCBmdW5jdGlvbiB0byBxdWVyeSBmb3IKK2B2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHJgLgorCitUaGlzIHN1cHBvcnQgaXMgb3B0aW9uYWwgYW5kIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhIHJlcXVpcmVtZW50LiAgVGhpcyBpcworb25seSByZXF1aXJlZCBpZiBhIGxheWVyIGludGVuZHMgdG8gc3VwcG9ydCBzb21lIGZ1bmN0aW9uYWxpdHkgbm90IGRpcmVjdGx5CitzdXBwb3J0ZWQgYnkgbG9hZGVycyByZWxlYXNlZCBpbiB0aGUgcHVibGljLiAgSWYgYSBsYXllciBkb2VzIGltcGxlbWVudCB0aGlzCitzdXBwb3J0LCBpdCBzaG91bGQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIGl0cyBgdmtfbGF5ZXJHZXRQaHlzaWNhbERldmljZVByb2NBZGRyYAorZnVuY3Rpb24gaW4gdGhlICJwZm5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyIiBtZW1iZXIgb2YgdGhlCitgVmtOZWdvdGlhdGVMYXllckludGVyZmFjZWAgc3RydWN0dXJlIGR1cmluZworW0xheWVyIFZlcnNpb24gTmVnb3RpYXRpb25dKCNsYXllci12ZXJzaW9uLW5lZ290aWF0aW9uKS4gIEFkZGl0aW9uYWxseSwgdGhlCitsYXllciBzaG91bGQgYWxzbyBtYWtlIHN1cmUgYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAgcmV0dXJucyBhIHZhbGlkIGZ1bmN0aW9uCitwb2ludGVyIHRvIGEgcXVlcnkgb2YgYHZrX2xheWVyR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcmAuCisKK1RoZSBuZXcgYmVoYXZpb3Igb2YgdGhlIGxvYWRlcidzIGB2a0dldEluc3RhbmNlUHJvY0FkZHJgIHdpdGggc3VwcG9ydCBmb3IgdGhlCitgdmtfbGF5ZXJHZXRQaHlzaWNhbERldmljZVByb2NBZGRyYCBmdW5jdGlvbiBpcyBhcyBmb2xsb3dzOgorIDEuIENoZWNrIGlmIGNvcmUgZnVuY3Rpb246CisgICAgLSBJZiBpdCBpcywgcmV0dXJuIHRoZSBmdW5jdGlvbiBwb2ludGVyCisgMi4gQ2hlY2sgaWYga25vd24gaW5zdGFuY2Ugb3IgZGV2aWNlIGV4dGVuc2lvbiBmdW5jdGlvbjoKKyAgICAtIElmIGl0IGlzLCByZXR1cm4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIKKyAzLiBDYWxsIHRoZSBsYXllci9JQ0QgYEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHJgCisgICAgLSBJZiBpdCByZXR1cm5zIG5vbi1OVUxMLCByZXR1cm4gYSB0cmFtcG9saW5lIHRvIGEgZ2VuZXJpYyBwaHlzaWNhbCBkZXZpY2UKK2Z1bmN0aW9uLCBhbmQgc2V0IHVwIGEgZ2VuZXJpYyB0ZXJtaW5hdG9yIHdoaWNoIHdpbGwgcGFzcyBpdCB0byB0aGUgcHJvcGVyIElDRC4KKyA0LiBDYWxsIGRvd24gdXNpbmcgYEdldEluc3RhbmNlUHJvY0FkZHJgCisgICAgLSBJZiBpdCByZXR1cm5zIG5vbi1OVUxMLCB0cmVhdCBpdCBhcyBhbiB1bmtub3duIGxvZ2ljYWwgZGV2aWNlIGNvbW1hbmQuCitUaGlzIG1lYW5zIHNldHRpbmcgdXAgYSBnZW5lcmljIHRyYW1wb2xpbmUgZnVuY3Rpb24gdGhhdCB0YWtlcyBpbiBhIFZrRGV2aWNlIGFzCit0aGUgZmlyc3QgcGFyYW1ldGVyIGFuZCBhZGp1c3RpbmcgdGhlIGRpc3BhdGNoIHRhYmxlIHRvIGNhbGwgdGhlIElDRC9MYXllcnMKK2Z1bmN0aW9uIGFmdGVyIGdldHRpbmcgdGhlIGRpc3BhdGNoIHRhYmxlIGZyb20gdGhlIFZrRGV2aWNlLiBUaGVuLCByZXR1cm4gdGhlCitwb2ludGVyIHRvIGNvcnJlc3BvbmRpbmcgdHJhbXBvbGluZSBmdW5jdGlvbi4KKyA1LiBSZXR1cm4gTlVMTAorCitZb3UgY2FuIHNlZSBub3csIHRoYXQsIGlmIHRoZSBjb21tYW5kIGdldHMgcHJvbW90ZWQgdG8gY29yZSBsYXRlciwgaXQgd2lsbCBubworbG9uZ2VyIGJlIHNldCB1cCB1c2luZyBgdmtfbGF5ZXJHZXRQaHlzaWNhbERldmljZVByb2NBZGRyYC4gIEFkZGl0aW9uYWxseSwgaWYgdGhlCitsb2FkZXIgYWRkcyBkaXJlY3Qgc3VwcG9ydCBmb3IgdGhlIGV4dGVuc2lvbiwgaXQgd2lsbCBubyBsb25nZXIgZ2V0IHRvIHN0ZXAgMywKK2JlY2F1c2Ugc3RlcCAyIHdpbGwgcmV0dXJuIGEgdmFsaWQgZnVuY3Rpb24gcG9pbnRlci4gIEhvd2V2ZXIsIHRoZSBsYXllciBzaG91bGQKK2NvbnRpbnVlIHRvIHN1cHBvcnQgdGhlIGNvbW1hbmQgcXVlcnkgdmlhIGB2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHJgLAordW50aWwgYXQgbGVhc3QgYSBWdWxrYW4gdmVyc2lvbiBidW1wLCBiZWNhdXNlIGFuIG9sZGVyIGxvYWRlciBtYXkgc3RpbGwgYmUKK2F0dGVtcHRpbmcgdG8gdXNlIHRoZSBjb21tYW5kcy4KKworCisjIyMjIExheWVyIEludGVyY2VwdCBSZXF1aXJlbWVudHMKKworICAqIExheWVycyBpbnRlcmNlcHQgYSBWdWxrYW4gZnVuY3Rpb24gYnkgZGVmaW5pbmcgYSBDL0MrKyBmdW5jdGlvbiB3aXRoCitzaWduYXR1cmUgKippZGVudGljYWwqKiB0byB0aGUgVnVsa2FuIEFQSSBmb3IgdGhhdCBmdW5jdGlvbi4KKyAgKiBBIGxheWVyICoqbXVzdCBpbnRlcmNlcHQgYXQgbGVhc3QqKiBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCBhbmQKK2B2a0NyZWF0ZUluc3RhbmNlYCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgaW5zdGFuY2UgY2FsbCBjaGFpbi4KKyAgKiBBIGxheWVyICoqbWF5IGFsc28gaW50ZXJjZXB0KiogYHZrR2V0RGV2aWNlUHJvY0FkZHJgIGFuZCBgdmtDcmVhdGVEZXZpY2VgCit0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZGV2aWNlIGNhbGwgY2hhaW4uCisgICogRm9yIGFueSBWdWxrYW4gZnVuY3Rpb24gYSBsYXllciBpbnRlcmNlcHRzIHdoaWNoIGhhcyBhIG5vbi12b2lkIHJldHVybiB2YWx1ZSwKKyoqYW4gYXBwcm9wcmlhdGUgdmFsdWUgbXVzdCBiZSByZXR1cm5lZCoqIGJ5IHRoZSBsYXllciBpbnRlcmNlcHQgZnVuY3Rpb24uCisgICogTW9zdCBmdW5jdGlvbnMgYSBsYXllciBpbnRlcmNlcHRzICoqc2hvdWxkIGNhbGwgZG93biB0aGUgY2hhaW4qKiB0byB0aGUKK2NvcnJlc3BvbmRpbmcgVnVsa2FuIGZ1bmN0aW9uIGluIHRoZSBuZXh0IGVudGl0eS4KKyAgICAqIFRoZSBjb21tb24gYmVoYXZpb3IgZm9yIGEgbGF5ZXIgaXMgdG8gaW50ZXJjZXB0IGEgY2FsbCwgcGVyZm9ybSBzb21lCitiZWhhdmlvciwgdGhlbiBwYXNzIGl0IGRvd24gdG8gdGhlIG5leHQgZW50aXR5LgorICAgICAgKiBJZiB5b3UgZG9uJ3QgcGFzcyB0aGUgaW5mb3JtYXRpb24gZG93biwgdW5kZWZpbmVkIGJlaGF2aW9yIG1heSBvY2N1ci4KKyAgICAgICogVGhpcyBpcyBiZWNhdXNlIHRoZSBmdW5jdGlvbiB3aWxsIG5vdCBiZSByZWNlaXZlZCBieSBsYXllcnMgZnVydGhlciBkb3duCit0aGUgY2hhaW4sIG9yIGFueSBJQ0RzLgorICAgICogT25lIGZ1bmN0aW9uIHRoYXQgKiptdXN0IG5ldmVyIGNhbGwgZG93biB0aGUgY2hhaW4qKiBpczoKKyAgICAgICogYHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uYAorICAgICogVGhyZWUgY29tbW9uIGZ1bmN0aW9ucyB0aGF0ICoqbWF5IG5vdCBjYWxsIGRvd24gdGhlIGNoYWluKiogYXJlOgorICAgICAgKiBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYAorICAgICAgKiBgdmtHZXREZXZpY2VQcm9jQWRkcmAKKyAgICAgICogYHZrX2xheWVyR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcmAKKyAgICAgICogVGhlc2UgZnVuY3Rpb25zIG9ubHkgY2FsbCBkb3duIHRoZSBjaGFpbiBmb3IgVnVsa2FuIGZ1bmN0aW9ucyB0aGF0IHRoZXkKK2RvIG5vdCBpbnRlcmNlcHQuCisgICogTGF5ZXIgaW50ZXJjZXB0IGZ1bmN0aW9ucyAqKm1heSBpbnNlcnQgZXh0cmEgY2FsbHMqKiB0byBWdWxrYW4gZnVuY3Rpb25zIGluCithZGRpdGlvbiB0byB0aGUgaW50ZXJjZXB0LgorICAgICogRm9yIGV4YW1wbGUsIGEgbGF5ZXIgaW50ZXJjZXB0aW5nIGB2a1F1ZXVlU3VibWl0YCBtYXkgd2FudCB0byBhZGQgYSBjYWxsIHRvCitgdmtRdWV1ZVdhaXRJZGxlYCBhZnRlciBjYWxsaW5nIGRvd24gdGhlIGNoYWluIGZvciBgdmtRdWV1ZVN1Ym1pdGAuCisgICAgKiBUaGlzIHdvdWxkIHJlc3VsdCBpbiB0d28gY2FsbHMgZG93biB0aGUgY2hhaW46IEZpcnN0IGEgY2FsbCBkb3duIHRoZQorYHZrUXVldWVTdWJtaXRgIGNoYWluLCBmb2xsb3dlZCBieSBhIGNhbGwgZG93biB0aGUgYHZrUXVldWVXYWl0SWRsZWAgY2hhaW4uCisgICAgKiBBbnkgYWRkaXRpb25hbCBjYWxscyBpbnNlcnRlZCBieSBhIGxheWVyIG11c3QgYmUgb24gdGhlIHNhbWUgY2hhaW4KKyAgICAgICogSWYgdGhlIGZ1bmN0aW9uIGlzIGEgZGV2aWNlIGZ1bmN0aW9uLCBvbmx5IG90aGVyIGRldmljZSBmdW5jdGlvbnMgc2hvdWxkCitiZSBhZGRlZC4KKyAgICAgICogTGlrZXdpc2UsIGlmIHRoZSBmdW5jdGlvbiBpcyBhbiBpbnN0YW5jZSBmdW5jdGlvbiwgb25seSBvdGhlciBpbnN0YW5jZQorZnVuY3Rpb25zIHNob3VsZCBiZSBhZGRlZC4KKworCisjIyMjIERpc3RyaWJ1dGVkIERpc3BhdGNoaW5nIFJlcXVpcmVtZW50cworCistIEZvciBlYWNoIGVudHJ5IHBvaW50IGEgbGF5ZXIgaW50ZXJjZXB0cywgaXQgbXVzdCBrZWVwIHRyYWNrIG9mIHRoZSBlbnRyeQorcG9pbnQgcmVzaWRpbmcgaW4gdGhlIG5leHQgZW50aXR5IGluIHRoZSBjaGFpbiBpdCB3aWxsIGNhbGwgZG93biBpbnRvLgorICAqIEluIG90aGVyIHdvcmRzLCB0aGUgbGF5ZXIgbXVzdCBoYXZlIGEgbGlzdCBvZiBwb2ludGVycyB0byBmdW5jdGlvbnMgb2YgdGhlCithcHByb3ByaWF0ZSB0eXBlIHRvIGNhbGwgaW50byB0aGUgbmV4dCBlbnRpdHkuCisgICogVGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdmFyaW91cyB3YXlzIGJ1dAorZm9yIGNsYXJpdHksIHdpbGwgYmUgcmVmZXJyZWQgdG8gYXMgYSBkaXNwYXRjaCB0YWJsZS4KKy0gQSBsYXllciBjYW4gdXNlIHRoZSBgVmtMYXllckRpc3BhdGNoVGFibGVgIHN0cnVjdHVyZSBhcyBhIGRldmljZSBkaXNwYXRjaAordGFibGUgKHNlZSBpbmNsdWRlL3Z1bGthbi92a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaCkuCistIEEgbGF5ZXIgY2FuIHVzZSB0aGUgYFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGVgIHN0cnVjdHVyZSBhcyBhIGluc3RhbmNlCitkaXNwYXRjaCB0YWJsZSAoc2VlIGluY2x1ZGUvdnVsa2FuL3ZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oKS4KKy0gQSBMYXllcidzIGB2a0dldEluc3RhbmNlUHJvY0FkZHJgIGZ1bmN0aW9uIHVzZXMgdGhlIG5leHQgZW50aXR5J3MKK2B2a0dldEluc3RhbmNlUHJvY0FkZHJgIHRvIGNhbGwgZG93biB0aGUgY2hhaW4gZm9yIHVua25vd24gKGkuZS4KK25vbi1pbnRlcmNlcHRlZCkgZnVuY3Rpb25zLgorLSBBIExheWVyJ3MgYHZrR2V0RGV2aWNlUHJvY0FkZHJgIGZ1bmN0aW9uIHVzZXMgdGhlIG5leHQgZW50aXR5J3MKK2B2a0dldERldmljZVByb2NBZGRyYCB0byBjYWxsIGRvd24gdGhlIGNoYWluIGZvciB1bmtub3duIChpLmUuIG5vbi1pbnRlcmNlcHRlZCkKK2Z1bmN0aW9ucy4KKy0gQSBMYXllcidzIGB2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHJgIGZ1bmN0aW9uIHVzZXMgdGhlIG5leHQgZW50aXR5J3MKK2B2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHJgIHRvIGNhbGwgZG93biB0aGUgY2hhaW4gZm9yIHVua25vd24gKGkuZS4KK25vbi1pbnRlcmNlcHRlZCkgZnVuY3Rpb25zLgorCisKKyMjIyMgTGF5ZXIgQ29udmVudGlvbnMgYW5kIFJ1bGVzCisKK0EgbGF5ZXIsIHdoZW4gaW5zZXJ0ZWQgaW50byBhbiBvdGhlcndpc2UgY29tcGxpYW50IFZ1bGthbiBpbXBsZW1lbnRhdGlvbiwgbXVzdAorc3RpbGwgcmVzdWx0IGluIGEgY29tcGxpYW50IFZ1bGthbiBpbXBsZW1lbnRhdGlvbi4gIFRoZSBpbnRlbnRpb24gaXMgZm9yIGxheWVycwordG8gaGF2ZSBhIHdlbGwtZGVmaW5lZCBiYXNlbGluZSBiZWhhdmlvci4gIFRoZXJlZm9yZSwgaXQgbXVzdCBmb2xsb3cgc29tZQorY29udmVudGlvbnMgYW5kIHJ1bGVzIGRlZmluZWQgYmVsb3cuCisKK0EgbGF5ZXIgaXMgYWx3YXlzIGNoYWluZWQgd2l0aCBvdGhlciBsYXllcnMuICBJdCBtdXN0IG5vdCBtYWtlIGludmFsaWQgY2FsbHMKK3RvLCBvciByZWx5IG9uIHVuZGVmaW5lZCBiZWhhdmlvcnMgb2YsIGl0cyBsb3dlciBsYXllcnMuICBXaGVuIGl0IGNoYW5nZXMgdGhlCitiZWhhdmlvciBvZiBhIGZ1bmN0aW9uLCBpdCBtdXN0IG1ha2Ugc3VyZSBpdHMgdXBwZXIgbGF5ZXJzIGRvIG5vdCBtYWtlIGludmFsaWQKK2NhbGxzIHRvIG9yIHJlbHkgb24gdW5kZWZpbmVkIGJlaGF2aW9ycyBvZiBpdHMgbG93ZXIgbGF5ZXJzIGJlY2F1c2Ugb2YgdGhlCitjaGFuZ2VkIGJlaGF2aW9yLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSBsYXllciBpbnRlcmNlcHRzIGFuIG9iamVjdCBjcmVhdGlvbgorZnVuY3Rpb24gdG8gd3JhcCB0aGUgb2JqZWN0cyBjcmVhdGVkIGJ5IGl0cyBsb3dlciBsYXllcnMsIGl0IG11c3QgbWFrZSBzdXJlIGl0cworbG93ZXIgbGF5ZXJzIG5ldmVyIHNlZSB0aGUgd3JhcHBpbmcgb2JqZWN0cywgZGlyZWN0bHkgZnJvbSBpdHNlbGYgb3IKK2luZGlyZWN0bHkgZnJvbSBpdHMgdXBwZXIgbGF5ZXJzLgorCitXaGVuIGEgbGF5ZXIgcmVxdWlyZXMgaG9zdCBtZW1vcnksIGl0IG1heSBpZ25vcmUgdGhlIHByb3ZpZGVkIGFsbG9jYXRvcnMuICBJdAorc2hvdWxkIHVzZSBtZW1vcnkgYWxsb2NhdG9ycyBpZiB0aGUgbGF5ZXIgaXMgaW50ZW5kZWQgdG8gcnVuIGluIGEgcHJvZHVjdGlvbgorZW52aXJvbm1lbnQuICBGb3IgZXhhbXBsZSwgdGhpcyB1c3VhbGx5IGFwcGxpZXMgdG8gaW1wbGljaXQgbGF5ZXJzIHRoYXQgYXJlCithbHdheXMgZW5hYmxlZC4gIFRoYXQgd2lsbCBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gaW5jbHVkZSB0aGUgbGF5ZXIncyBtZW1vcnkKK3VzYWdlLgorCitBZGRpdGlvbmFsIHJ1bGVzIGluY2x1ZGU6CisgIC0gYHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNgICoqbXVzdCoqIGVudW1lcmF0ZSBhbmQgKipvbmx5KioKK2VudW1lcmF0ZSB0aGUgbGF5ZXIgaXRzZWxmLgorICAtIGB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc2AgKiptdXN0KiogaGFuZGxlIHRoZSBjYXNlIHdoZXJlCitgcExheWVyTmFtZWAgaXMgaXRzZWxmLgorICAgIC0gSXQgKiptdXN0KiogcmV0dXJuIGBWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVGAgb3RoZXJ3aXNlLCBpbmNsdWRpbmcgd2hlbgorYHBMYXllck5hbWVgIGlzIGBOVUxMYC4KKyAgLSBgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXNgICoqaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIG9taXR0ZWQqKi4KKyAgICAtIFVzaW5nIHRoaXMgd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAtIGB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXNgICoqbXVzdCoqIGhhbmRsZSB0aGUgY2FzZSB3aGVyZQorYHBMYXllck5hbWVgIGlzIGl0c2VsZi4KKyAgICAtIEluIG90aGVyIGNhc2VzLCBpdCBzaG91bGQgbm9ybWFsbHkgY2hhaW4gdG8gb3RoZXIgbGF5ZXJzLgorICAtIGB2a0NyZWF0ZUluc3RhbmNlYCAqKm11c3Qgbm90KiogZ2VuZXJhdGUgYW4gZXJyb3IgZm9yIHVucmVjb2duaXplZCBsYXllcgorbmFtZXMgYW5kIGV4dGVuc2lvbiBuYW1lcy4KKyAgICAtIEl0IG1heSBhc3N1bWUgdGhlIGxheWVyIG5hbWVzIGFuZCBleHRlbnNpb24gbmFtZXMgaGF2ZSBiZWVuIHZhbGlkYXRlZC4KKyAgLSBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCBpbnRlcmNlcHRzIGEgVnVsa2FuIGZ1bmN0aW9uIGJ5IHJldHVybmluZyBhIGxvY2FsCitlbnRyeSBwb2ludAorICAgIC0gT3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIHZhbHVlIG9idGFpbmVkIGJ5IGNhbGxpbmcgZG93biB0aGUgaW5zdGFuY2UgY2FsbAorY2hhaW4uCisgIC0gYHZrR2V0RGV2aWNlUHJvY0FkZHJgIGludGVyY2VwdHMgYSBWdWxrYW4gZnVuY3Rpb24gYnkgcmV0dXJuaW5nIGEgbG9jYWwKK2VudHJ5IHBvaW50CisgICAgLSBPdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgdmFsdWUgb2J0YWluZWQgYnkgY2FsbGluZyBkb3duIHRoZSBkZXZpY2UgY2FsbAorY2hhaW4uCisgICAgLSBUaGVzZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBtdXN0IGJlIGludGVyY2VwdGVkIGlmIHRoZSBsYXllciBpbXBsZW1lbnRzCitkZXZpY2UtbGV2ZWwgY2FsbCBjaGFpbmluZzoKKyAgICAgIC0gYHZrR2V0RGV2aWNlUHJvY0FkZHJgCisgICAgICAtIGB2a0NyZWF0ZURldmljZWAob25seSByZXF1aXJlZCBmb3IgYW55IGRldmljZS1sZXZlbCBjaGFpbmluZykKKyAgICAgICAgIC0gKipOT1RFOioqIG9sZGVyIGxheWVyIGxpYnJhcmllcyBtYXkgZXhwZWN0IHRoYXQgYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAKK2lnbm9yZSBgaW5zdGFuY2VgIHdoZW4gYHBOYW1lYCBpcyBgdmtDcmVhdGVEZXZpY2VgLgorICAtIFRoZSBzcGVjaWZpY2F0aW9uICoqcmVxdWlyZXMqKiBgTlVMTGAgdG8gYmUgcmV0dXJuZWQgZnJvbQorYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAgYW5kIGB2a0dldERldmljZVByb2NBZGRyYCBmb3IgZGlzYWJsZWQgZnVuY3Rpb25zLgorICAgIC0gQSBsYXllciBtYXkgcmV0dXJuIGBOVUxMYCBpdHNlbGYgb3IgcmVseSBvbiB0aGUgZm9sbG93aW5nIGxheWVycyB0byBkbyBzby4KKworCisjIyMjIExheWVyIERpc3BhdGNoIEluaXRpYWxpemF0aW9uCisKKy0gQSBsYXllciBpbml0aWFsaXplcyBpdHMgaW5zdGFuY2UgZGlzcGF0Y2ggdGFibGUgd2l0aGluIGl0cyBgdmtDcmVhdGVJbnN0YW5jZWAKK2Z1bmN0aW9uLgorLSBBIGxheWVyIGluaXRpYWxpemVzIGl0cyBkZXZpY2UgZGlzcGF0Y2ggdGFibGUgd2l0aGluIGl0cyBgdmtDcmVhdGVEZXZpY2VgCitmdW5jdGlvbi4KKy0gVGhlIGxvYWRlciBwYXNzZXMgYSBsaW5rZWQgbGlzdCBvZiBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmVzIHRvIGxheWVycyB2aWEKK3RoZSAicE5leHQiIGZpZWxkIGluIHRoZSBgVmtJbnN0YW5jZUNyZWF0ZUluZm9gIGFuZCBgVmtEZXZpY2VDcmVhdGVJbmZvYAorc3RydWN0dXJlcyBmb3IgYHZrQ3JlYXRlSW5zdGFuY2VgIGFuZCBgVmtDcmVhdGVEZXZpY2VgIHJlc3BlY3RpdmVseS4KKy0gVGhlIGhlYWQgbm9kZSBpbiB0aGlzIGxpbmtlZCBsaXN0IGlzIG9mIHR5cGUgYFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm9gIGZvcgoraW5zdGFuY2UgYW5kIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvIGZvciBkZXZpY2UuIFNlZSBmaWxlCitgaW5jbHVkZS92dWxrYW4vdmtfbGF5ZXIuaGAgZm9yIGRldGFpbHMuCistIEEgVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPIGlzIHVzZWQgYnkgdGhlIGxvYWRlciBmb3IgdGhlCisic1R5cGUiIGZpZWxkIGluIGBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvYC4KKy0gQSBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfREVWSUNFX0NSRUFURV9JTkZPIGlzIHVzZWQgYnkgdGhlIGxvYWRlciBmb3IgdGhlCisic1R5cGUiIGZpZWxkIGluIGBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mb2AuCistIFRoZSAiZnVuY3Rpb24iIGZpZWxkIGluZGljYXRlcyBob3cgdGhlIHVuaW9uIGZpZWxkICJ1IiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQKK3dpdGhpbiBgVmtMYXllcipDcmVhdGVJbmZvYC4gVGhlIGxvYWRlciB3aWxsIHNldCB0aGUgImZ1bmN0aW9uIiBmaWVsZCB0bworVktfTEFZRVJfTElOS19JTkZPLiBUaGlzIGluZGljYXRlcyAidSIgZmllbGQgc2hvdWxkIGJlIGBWa0xheWVySW5zdGFuY2VMaW5rYCBvcgorYFZrTGF5ZXJEZXZpY2VMaW5rYC4KKy0gVGhlIGBWa0xheWVySW5zdGFuY2VMaW5rYCBhbmQgYFZrTGF5ZXJEZXZpY2VMaW5rYCBzdHJ1Y3R1cmVzIGFyZSB0aGUgbGlzdAorbm9kZXMuCistIFRoZSBgVmtMYXllckluc3RhbmNlTGlua2AgY29udGFpbnMgdGhlIG5leHQgZW50aXR5J3MgYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAKK3VzZWQgYnkgYSBsYXllci4KKy0gVGhlIGBWa0xheWVyRGV2aWNlTGlua2AgY29udGFpbnMgdGhlIG5leHQgZW50aXR5J3MgYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAgYW5kCitgdmtHZXREZXZpY2VQcm9jQWRkcmAgdXNlZCBieSBhIGxheWVyLgorLSBHaXZlbiB0aGUgYWJvdmUgc3RydWN0dXJlcyBzZXQgdXAgYnkgdGhlIGxvYWRlciwgbGF5ZXIgbXVzdCBpbml0aWFsaXplIHRoZWlyCitkaXNwYXRjaCB0YWJsZSBhcyBmb2xsb3dzOgorICAtIEZpbmQgdGhlIGBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvYC9gVmtMYXllckRldmljZUNyZWF0ZUluZm9gIHN0cnVjdHVyZSBpbgordGhlIGBWa0luc3RhbmNlQ3JlYXRlSW5mb2AvYFZrRGV2aWNlQ3JlYXRlSW5mb2Agc3RydWN0dXJlLgorICAtIEdldCB0aGUgbmV4dCBlbnRpdHkncyB2a0dldCpQcm9jQWRkciBmcm9tIHRoZSAicExheWVySW5mbyIgZmllbGQuCisgIC0gRm9yIENyZWF0ZUluc3RhbmNlIGdldCB0aGUgbmV4dCBlbnRpdHkncyBgdmtDcmVhdGVJbnN0YW5jZWAgYnkgY2FsbGluZyB0aGUKKyJwZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkciI6CisgICAgIHBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0NyZWF0ZUluc3RhbmNlIikuCisgIC0gRm9yIENyZWF0ZURldmljZSBnZXQgdGhlIG5leHQgZW50aXR5J3MgYHZrQ3JlYXRlRGV2aWNlYCBieSBjYWxsaW5nIHRoZQorInBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyIjoKKyAgICAgcGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHIoTlVMTCwgInZrQ3JlYXRlRGV2aWNlIikuCisgIC0gQWR2YW5jZWQgdGhlIGxpbmtlZCBsaXN0IHRvIHRoZSBuZXh0IG5vZGU6IHBMYXllckluZm8gPSBwTGF5ZXJJbmZvLT5wTmV4dC4KKyAgLSBDYWxsIGRvd24gdGhlIGNoYWluIGVpdGhlciBgdmtDcmVhdGVEZXZpY2VgIG9yIGB2a0NyZWF0ZUluc3RhbmNlYAorICAtIEluaXRpYWxpemUgeW91ciBsYXllciBkaXNwYXRjaCB0YWJsZSBieSBjYWxsaW5nIHRoZSBuZXh0IGVudGl0eSdzCitHZXQqUHJvY0FkZHIgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBWdWxrYW4gZnVuY3Rpb24gbmVlZGVkIGluIHlvdXIgZGlzcGF0Y2gKK3RhYmxlCisKKyMjIyMgRXhhbXBsZSBDb2RlIGZvciBDcmVhdGVJbnN0YW5jZQorCitgYGBjcHAKK1ZrUmVzdWx0IHZrQ3JlYXRlSW5zdGFuY2UoCisgICAgICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICBWa0luc3RhbmNlICpwSW5zdGFuY2UpCit7CisgICBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0KKyAgICAgICAgZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisKKyAgICBhc3NlcnQoY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvKTsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9CisgICAgICAgIGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgUEZOX3ZrQ3JlYXRlSW5zdGFuY2UgZnBDcmVhdGVJbnN0YW5jZSA9CisgICAgICAgIChQRk5fdmtDcmVhdGVJbnN0YW5jZSlmcEdldEluc3RhbmNlUHJvY0FkZHIoTlVMTCwgInZrQ3JlYXRlSW5zdGFuY2UiKTsKKyAgICBpZiAoZnBDcmVhdGVJbnN0YW5jZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gQWR2YW5jZSB0aGUgbGluayBpbmZvIGZvciB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBjaGFpbgorICAgIGNoYWluX2luZm8tPnUucExheWVySW5mbyA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cE5leHQ7CisKKyAgICAvLyBDb250aW51ZSBjYWxsIGRvd24gdGhlIGNoYWluCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZnBDcmVhdGVJbnN0YW5jZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluc3RhbmNlKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBJbml0IGxheWVyJ3MgZGlzcGF0Y2ggdGFibGUgdXNpbmcgR2V0SW5zdGFuY2VQcm9jQWRkciBvZgorICAgIC8vIG5leHQgbGF5ZXIgaW4gdGhlIGNoYWluLgorICAgIGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlID0gbmV3IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGU7CisgICAgbGF5ZXJfaW5pdF9pbnN0YW5jZV9kaXNwYXRjaF90YWJsZSgKKyAgICAgICAgKnBJbnN0YW5jZSwgbXlfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUsIGZwR2V0SW5zdGFuY2VQcm9jQWRkcik7CisKKyAgICAvLyBPdGhlciBsYXllciBpbml0aWFsaXphdGlvbgorICAgIC4uLgorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CitgYGAKKworIyMjIyBFeGFtcGxlIENvZGUgZm9yIENyZWF0ZURldmljZQorCitgYGBjcHAKK1ZrUmVzdWx0IAordmtDcmVhdGVEZXZpY2UoCisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UgZ3B1LAorICAgICAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgIFZrRGV2aWNlICpwRGV2aWNlKQoreworICAgIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0KKyAgICAgICAgZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9CisgICAgICAgIGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZnBHZXREZXZpY2VQcm9jQWRkciA9CisgICAgICAgIGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldERldmljZVByb2NBZGRyOworICAgIFBGTl92a0NyZWF0ZURldmljZSBmcENyZWF0ZURldmljZSA9CisgICAgICAgIChQRk5fdmtDcmVhdGVEZXZpY2UpZnBHZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0NyZWF0ZURldmljZSIpOworICAgIGlmIChmcENyZWF0ZURldmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gQWR2YW5jZSB0aGUgbGluayBpbmZvIGZvciB0aGUgbmV4dCBlbGVtZW50IG9uIHRoZSBjaGFpbgorICAgIGNoYWluX2luZm8tPnUucExheWVySW5mbyA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cE5leHQ7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBmcENyZWF0ZURldmljZShncHUsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGxheWVyJ3MgZGlzcGF0Y2ggdGFibGUKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUgPSBuZXcgVmtMYXllckRpc3BhdGNoVGFibGU7CisgICAgbGF5ZXJfaW5pdF9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoCisgICAgICAgICpwRGV2aWNlLCBkZXZpY2VfZGlzcGF0Y2hfdGFibGUsIGZwR2V0RGV2aWNlUHJvY0FkZHIpOworCisgICAgLy8gT3RoZXIgbGF5ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAuLi4KKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorYGBgCisKKworIyMjIyBNZXRhLWxheWVycworCitNZXRhLWxheWVycyBhcmUgYSBzcGVjaWFsIGtpbmQgb2YgbGF5ZXIgd2hpY2ggaXMgb25seSBhdmFpbGFibGUgdGhyb3VnaCB0aGUKK2Rlc2t0b3AgbG9hZGVyLiAgV2hpbGUgbm9ybWFsIGxheWVycyBhcmUgYXNzb2NpYXRlZCB3aXRoIG9uZSBwYXJ0aWN1bGFyIGxpYnJhcnksCithIG1ldGEtbGF5ZXIgaXMgYWN0dWFsbHkgYSBjb2xsZWN0aW9uIGxheWVyIHdoaWNoIGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZgorb3RoZXIgbGF5ZXJzIChjYWxsZWQgY29tcG9uZW50IGxheWVycykuCisKK1RoZSBtb3N0IGNvbW1vbiBleGFtcGxlIG9mIGEgbWV0YS1sYXllciBpcyB0aGUKK2BWS19MQVlFUl9MVU5BUkdfc3RhbmRhcmRfdmFsaWRhdGlvbmAgbGF5ZXIgd2hpY2ggZ3JvdXBzIGFsbCB0aGUgbW9zdCBjb21tb24KK2luZGl2aWR1YWwgdmFsaWRhdGlvbiBsYXllcnMgaW50byBhIHNpbmdsZSBsYXllciBmb3IgZWFzZS1vZi11c2UuCisKK1RoZSBiZW5lZml0cyBvZiBhIG1ldGEtbGF5ZXIgYXJlOgorIDEuIFlvdSBjYW4gYWN0aXZhdGUgbW9yZSB0aGFuIG9uZSBsYXllciB1c2luZyBhIHNpbmdsZSBsYXllciBuYW1lIGJ5IHNpbXBseQorZ3JvdXBpbmcgbXVsdGlwbGUgbGF5ZXJzIGluIGEgbWV0YS1sYXllci4KKyAyLiBZb3UgY2FuIGRlZmluZSB0aGUgb3JkZXIgdGhlIGxvYWRlciB3aWxsIGFjdGl2YXRlIGluZGl2aWR1YWwgbGF5ZXJzIHdpdGhpbgordGhlIG1ldGEtbGF5ZXIuCisgMy4gWW91IGNhbiBlYXNpbHkgc2hhcmUgeW91ciBzcGVjaWFsIGxheWVyIGNvbmZpZ3VyYXRpb24gd2l0aCBvdGhlcnMuCisgNC4gVGhlIGxvYWRlciB3aWxsIGF1dG9tYXRpY2FsbHkgY29sbGF0ZSBhbGwgaW5zdGFuY2UgYW5kIGRldmljZSBleHRlbnNpb25zIGluCithIG1ldGEtbGF5ZXIncyBjb21wb25lbnQgbGF5ZXJzLCBhbmQgcmVwb3J0IHRoZW0gYXMgdGhlIG1ldGEtbGF5ZXIncyBwcm9wZXJ0aWVzCit0byB0aGUgYXBwbGljYXRpb24gd2hlbiBxdWVyaWVkLgorIAorUmVzdHJpY3Rpb25zIHRvIGRlZmluaW5nIGFuZCB1c2luZyBhIG1ldGEtbGF5ZXIgYXJlOgorIDEuIEEgTWV0YS1sYXllciBNYW5pZmVzdCBmaWxlICoqbXVzdCoqIGJlIGEgcHJvcGVybHkgZm9ybWF0dGVkIHRoYXQgY29udGFpbnMgb25lCitvciBtb3JlIGNvbXBvbmVudCBsYXllcnMuCisgMy4gQWxsIGNvbXBvbmVudCBsYXllcnMgKiptdXN0IGJlKiogcHJlc2VudCBvbiBhIHN5c3RlbSBmb3IgdGhlIG1ldGEtbGF5ZXIgdG8KK2JlIHVzZWQuCisgNC4gQWxsIGNvbXBvbmVudCBsYXllcnMgKiptdXN0IGJlKiogYXQgdGhlIHNhbWUgVnVsa2FuIEFQSSBtYWpvciBhbmQgbWlub3IKK3ZlcnNpb24gZm9yIHRoZSBtZXRhLWxheWVyIHRvIGJlIHVzZWQuCisgCitUaGUgb3JkZXJpbmcgb2YgYSBtZXRhLWxheWVyJ3MgY29tcG9uZW50IGxheWVycyBpbiB0aGUgaW5zdGFuY2Ugb3IgZGV2aWNlCitjYWxsLWNoYWluIGlzIHNpbXBsZToKKyAgKiBUaGUgZmlyc3QgbGF5ZXIgbGlzdGVkIHdpbGwgYmUgdGhlIGxheWVyIGNsb3Nlc3QgdG8gdGhlIGFwcGxpY2F0aW9uLgorICAqIFRoZSBsYXN0IGxheWVyIGxpc3RlZCB3aWxsIGJlIHRoZSBsYXllciBjbG9zZXN0IHRvIHRoZSBkcml2ZXJzLgorCitJbnNpZGUgdGhlIG1ldGEtbGF5ZXIgTWFuaWZlc3QgZmlsZSwgZWFjaCBjb21wb25lbnQgbGF5ZXIgaXMgbGlzdGVkIGJ5IGl0cworbGF5ZXIgbmFtZS4gIFRoaXMgaXMgdGhlICJuYW1lIiB0YWcncyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBjb21wb25lbnQgbGF5ZXIncworTWFuaWZlc3QgZmlsZSB1bmRlciB0aGUgImxheWVyIiBvciAibGF5ZXJzIiB0YWcuICBUaGlzIGlzIGFsc28gdGhlIG5hbWUgdGhhdAord291bGQgbm9ybWFsbHkgYmUgdXNlZCB3aGVuIGFjdGl2YXRpbmcgYSBsYXllciBkdXJpbmcgYHZrQ3JlYXRlSW5zdGFuY2VgLgorCitBbnkgZHVwbGljYXRlIGxheWVyIG5hbWVzIGluIGVpdGhlciB0aGUgY29tcG9uZW50IGxheWVyIGxpc3QsIG9yIGdsb2JhbGx5IGFtb25nCithbGwgZW5hYmxlZCBsYXllcnMsIHdpbGwgc2ltcGx5IGJlIGlnbm9yZWQuICBPbmx5IHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhbnkKK2xheWVyIG5hbWUgd2lsbCBiZSB1c2VkLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBsYXllciBlbmFibGVkIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorYFZLX0lOU1RBTkNFX0xBWUVSU2AgYW5kIGhhdmUgdGhhdCBzYW1lIGxheWVyIGxpc3RlZCBpbiBhIG1ldGEtbGF5ZXIsIHRoZW4gdGhlCitlbnZpcm9ubWVudC12YXJpYWJsZS1lbmFibGVkIGxheWVyIHdpbGwgYmUgdXNlZCBhbmQgdGhlIGNvbXBvbmVudCBsYXllciB3aWxsCitiZSBkcm9wcGVkLiAgTGlrZXdpc2UsIGlmIGEgcGVyc29uIHdlcmUgdG8gZW5hYmxlIGEgbWV0YS1sYXllciBhbmQgdGhlbgorc2VwYXJhdGVseSBlbmFibGUgb25lIG9mIHRoZSBjb21wb25lbnQgbGF5ZXJzIGFmdGVyd2FyZHMsIHRoZSBzZWNvbmQKK2luc3RhbnRpYXRpb24gb2YgdGhlIGxheWVyIG5hbWUgd291bGQgYmUgaWdub3JlZC4KKworVGhlCitNYW5pZmVzdCBmaWxlIGZvcm1hdHRpbmcgbmVjZXNzYXJ5IHRvIGRlZmluZSBhIG1ldGEtbGF5ZXIgY2FuIGJlIGZvdW5kIGluIHRoZQorW0xheWVyIE1hbmlmZXN0IEZpbGUgRm9ybWF0XSgjbGF5ZXItbWFuaWZlc3QtZmlsZS1mb3JtYXQpIHNlY3Rpb24uCisKKyMjIyMgUHJlLUluc3RhbmNlIEZ1bmN0aW9ucworCitWdWxrYW4gaW5jbHVkZXMgYSBzbWFsbCBudW1iZXIgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgd2l0aG91dCBhbnkgZGlzcGF0Y2hhYmxlIG9iamVjdC4KK01vc3QgbGF5ZXJzIGRvIG5vdCBpbnRlcmNlcHQgdGhlc2UgZnVuY3Rpb25zLCBhcyBsYXllcnMgYXJlIGVuYWJsZWQgd2hlbiBhbiBpbnN0YW5jZSBpcyBjcmVhdGVkLgorSG93ZXZlciwgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zIGl0IGlzIHBvc3NpYmxlIGZvciBhIGxheWVyIHRvIGludGVyY2VwdCB0aGVzZSBmdW5jdGlvbnMuCisKK0luIG9yZGVyIHRvIGludGVyY2VwdCB0aGUgcHJlLWluc3RhbmNlIGZ1bmN0aW9ucywgc2V2ZXJhbCBjb25kaXRpb25zIG11c3QgYmUgbWV0OgorKiBUaGUgbGF5ZXIgbXVzdCBiZSBpbXBsaWNpdAorKiBUaGUgbGF5ZXIgbWFuaWZlc3QgdmVyc2lvbiBtdXN0IGJlIDEuMS4yIG9yIGxhdGVyCisqIFRoZSBsYXllciBtdXN0IGV4cG9ydCB0aGUgZW50cnkgcG9pbnQgc3ltYm9scyBmb3IgZWFjaCBpbnRlcmNlcHRlZCBmdW5jdGlvbgorKiBUaGUgbGF5ZXIgbWFuaWZlc3QgbXVzdCBzcGVjaWZ5IHRoZSBuYW1lIG9mIGVhY2ggaW50ZXJjZXB0ZWQgZnVuY3Rpb24gaW4gYSBgcHJlX2luc3RhbmNlX2Z1bmN0aW9uc2AgSlNPTiBvYmplY3QKKworVGhlIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSBpbnRlcmNlcHRlZCBpbiB0aGlzIHdheSBhcmU6CisqIGB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc2AKKyogYHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNgCisKK1ByZS1pbnN0YW5jZSBmdW5jdGlvbnMgd29yayBkaWZmZXJlbnRseSBmcm9tIGFsbCBvdGhlciBsYXllciBpbnRlcmNlcHQgZnVuY3Rpb25zLgorT3RoZXIgaW50ZXJjZXB0IGZ1bmN0aW9ucyBoYXZlIGEgZnVuY3Rpb24gcHJvdG90eXBlIGlkZW50aWNhbCB0byB0aGF0IG9mIHRoZSBmdW5jdGlvbiB0aGV5IGFyZSBpbnRlcmNlcHRpbmcuCitUaGV5IHRoZW4gcmVseSBvbiBkYXRhIHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgbGF5ZXIgYXQgaW5zdGFuY2Ugb3IgZGV2aWNlIGNyZWF0aW9uIHNvIHRoYXQgbGF5ZXJzIGNhbiBjYWxsIGRvd24gdGhlIGNoYWluLgorQmVjYXVzZSB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBiZWZvcmUgY2FsbGluZyB0aGUgcHJlLWluc3RhbmNlIGZ1bmN0aW9ucywgdGhlc2UgZnVuY3Rpb25zIG11c3QgdXNlIGEgc2VwYXJhdGUgbWVjaGFuaXNtIGZvciBjb25zdHJ1Y3RpbmcgdGhlIGNhbGwgY2hhaW4uCitUaGlzIG1lY2hhbmlzbSBjb25zaXN0cyBvZiBhbiBleHRyYSBwYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgbGF5ZXIgaW50ZXJjZXB0IGZ1bmN0aW9uIHdoZW4gaXQgaXMgY2FsbGVkLgorVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QsIGRlZmluZWQgYXMgZm9sbG93czoKKworYGBgCit0eXBlZGVmIHN0cnVjdCBWay4uLkNoYWluCit7CisgICAgc3RydWN0IHsKKyAgICAgICAgVmtDaGFpblR5cGUgdHlwZTsKKyAgICAgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB9IGhlYWRlcjsKKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gcGZuTmV4dExheWVyOworICAgIGNvbnN0IHN0cnVjdCBWay4uLkNoYWluKiBwTmV4dExpbms7Cit9IFZrLi4uQ2hhaW47CitgYGAKKworVGhlc2Ugc3RydWN0cyBhcmUgZGVmaW5lZCBpbiB0aGUgYHZrX2xheWVyLmhgIGZpbGUgc28gdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHJlZGVmaW5lIHRoZSBjaGFpbiBzdHJ1Y3RzIGluIGFueSBleHRlcm5hbCBjb2RlLgorVGhlIG5hbWUgb2YgZWFjaCBzdHJ1Y3QgaXMgYmUgc2ltaWxhciB0byB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaXQgY29ycmVzcG9uZHMgdG8sIGJ1dCB0aGUgbGVhZGluZyAiViIgaXMgY2FwaXRhbGl6ZWQsIGFuZCB0aGUgd29yZCAiQ2hhaW4iIGlzIGFkZGVkIHRvIHRoZSBlbmQuCitGb3IgZXhhbXBsZSwgdGhlIHN0cnVjdCBmb3IgYHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzYCBpcyBjYWxsZWQgYFZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzQ2hhaW5gLgorRnVydGhlcm1vcmUsIHRoZSBgcGZuTmV4dExheWVyYCBzdHJ1Y3QgbWVtYmVyIGlzIG5vdCBhY3R1YWxseSBhIHZvaWQgZnVuY3Rpb24gcG9pbnRlciAmbWRhc2g7IGl0cyB0eXBlIHdpbGwgYmUgdGhlIGFjdHVhbCB0eXBlIG9mIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGNhbGwgY2hhaW4uCisKK0VhY2ggbGF5ZXIgaW50ZXJjZXB0IGZ1bmN0aW9uIG11c3QgaGF2ZSBhIHByb3RvdHlwZSB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBwcm90b3R5cGUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGludGVyY2VwdGVkLCBleGNlcHQgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIG11c3QgYmUgdGhhdCBmdW5jdGlvbidzIGNoYWluIHN0cnVjdCAocGFzc2VkIGFzIGEgY29uc3QgcG9pbnRlcikuCitGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiB0aGF0IHdpc2hlcyB0byBpbnRlcmNlcHQgYHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzYCB3b3VsZCBoYXZlIHRoZSBwcm90b3R5cGU6CisKK2BgYAorVmtSZXN1bHQgSW50ZXJjZXB0RnVuY3Rpb25OYW1lKGNvbnN0IFZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKiBwQ2hhaW4sCisgICAgY29uc3QgY2hhciogcExheWVyTmFtZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0V4dGVuc2lvblByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKTsKK2BgYAorCitUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaXMgYXJiaXRyYXJ5OyBpdCBjYW4gYmUgYW55dGhpbmcgcHJvdmlkZWQgdGhhdCBpdCBpcyBnaXZlbiBpbiB0aGUgbGF5ZXIgbWFuaWZlc3QgZmlsZSAoc2VlIFtMYXllciBNYW5pZmVzdCBGaWxlIEZvcm1hdF0oI2xheWVyLW1hbmlmZXN0LWZpbGUtZm9ybWF0KSkuCitUaGUgaW1wbGVtZW50YXRpb24gb2YgZWFjaCBpbnRlcmNlcHQgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIG5leHQgaXRlbSBpbiB0aGUgY2FsbCBjaGFpbiwgdXNpbmcgdGhlIGNoYWluIHBhcmFtZXRlci4KK1RoaXMgaXMgZG9uZSBieSBjYWxsaW5nIHRoZSBgcGZuTmV4dExheWVyYCBtZW1iZXIgb2YgdGhlIGNoYWluIHN0cnVjdCwgcGFzc2luZyBgcE5leHRMaW5rYCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIGFuZCBwYXNzaW5nIHRoZSByZW1haW5pbmcgZnVuY3Rpb24gYXJndW1lbnRzIGFmdGVyIHRoYXQuCitGb3IgZXhhbXBsZSwgYSBzaW1wbGUgaW1wbGVtZW50YXRpb24gZm9yIGB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc2AgdGhhdCBkb2VzIG5vdGhpbmcgYnV0IGNhbGwgZG93biB0aGUgY2hhaW4gd291bGQgbG9vayBsaWtlOgorCitgYGAKK1ZrUmVzdWx0IEludGVyY2VwdEZ1bmN0aW9uTmFtZShjb25zdCBWa0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyogcENoYWluLAorICAgIGNvbnN0IGNoYXIqIHBMYXllck5hbWUsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiBwUHJvcGVydGllcykKK3sKKyAgICByZXR1cm4gcENoYWluLT5wZm5OZXh0TGF5ZXIocENoYWluLT5wTmV4dExpbmssIHBMYXllck5hbWUsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7Cit9CitgYGAKKworV2hlbiB1c2luZyBhIEMrKyBjb21waWxlciwgZWFjaCBjaGFpbiB0eXBlIGFsc28gZGVmaW5lcyBhIGZ1bmN0aW9uIG5hbWVkIGBDYWxsRG93bmAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgdGhlIGZpcnN0IGFyZ3VtZW50LgorSW1wbGVtZW50aW5nIHRoZSBhYm92ZSBmdW5jdGlvbiB1c2luZyB0aGlzIG1ldGhvZCB3b3VsZCBsb29rIGxpa2U6CisKK2BgYAorVmtSZXN1bHQgSW50ZXJjZXB0RnVuY3Rpb25OYW1lKGNvbnN0IFZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKiBwQ2hhaW4sCisgICAgY29uc3QgY2hhciogcExheWVyTmFtZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0V4dGVuc2lvblByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKQoreworICAgIHJldHVybiBwQ2hhaW4tPkNhbGxEb3duKHBMYXllck5hbWUsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7Cit9CitgYGAKKworVW5saWtlIHdpdGggb3RoZXIgZnVuY3Rpb25zIGluIGxheWVycywgdGhlIGxheWVyIG1heSBub3Qgc2F2ZSBhbnkgZ2xvYmFsIGRhdGEgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbiBjYWxscy4KK0JlY2F1c2UgVnVsa2FuIGRvZXMgbm90IHN0b3JlIGFueSBzdGF0ZSB1bnRpbCBhbiBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkLCBhbGwgbGF5ZXIgbGlicmFyaWVzIGFyZSByZWxlYXNlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcHJlLWluc3RhbmNlIGNhbGwuCitUaGlzIG1lYW5zIHRoYXQgaW1wbGljaXQgbGF5ZXJzIGNhbiB1c2UgcHJlLWluc3RhbmNlIGludGVyY2VwdHMgdG8gbW9kaWZ5IGRhdGEgdGhhdCBpcyByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb25zLCBidXQgdGhleSBjYW5ub3QgYmUgdXNlZCB0byByZWNvcmQgdGhhdCBkYXRhLgorCisjIyMjIFNwZWNpYWwgQ29uc2lkZXJhdGlvbnMKKworCisjIyMjIyBBc3NvY2lhdGluZyBQcml2YXRlIERhdGEgd2l0aCBWdWxrYW4gT2JqZWN0cyBXaXRoaW4gYSBMYXllcgorCitBIGxheWVyIG1heSB3YW50IHRvIGFzc29jaWF0ZSBpdHMgb3duIHByaXZhdGUgZGF0YSB3aXRoIG9uZSBvciBtb3JlIFZ1bGthbgorb2JqZWN0cy4gIFR3byBjb21tb24gbWV0aG9kcyB0byBkbyB0aGlzIGFyZSBoYXNoIG1hcHMgYW5kIG9iamVjdCB3cmFwcGluZy4gCisKKworIyMjIyMjIFdyYXBwaW5nCisKK1RoZSBsb2FkZXIgc3VwcG9ydHMgbGF5ZXJzIHdyYXBwaW5nIGFueSBWdWxrYW4gb2JqZWN0LCBpbmNsdWRpbmcgZGlzcGF0Y2hhYmxlCitvYmplY3RzLiAgRm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBvYmplY3QgaGFuZGxlcywgZWFjaCBsYXllciBkb2VzIG5vdCB0b3VjaAordGhlIHZhbHVlIHBhc3NlZCBkb3duIHRoZSBjYWxsIGNoYWluLiAgVGhpcyBpcyBiZWNhdXNlIGxvd2VyIGl0ZW1zIG1heSBuZWVkIHRvCit1c2UgdGhlIG9yaWdpbmFsIHZhbHVlLiAgSG93ZXZlciwgd2hlbiB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSBhCitsb3dlci1sZXZlbCBsYXllciAocG9zc2libHkgdGhlIElDRCksIHRoZSBsYXllciBzYXZlcyB0aGUgaGFuZGxlICBhbmQgcmV0dXJucworaXRzIG93biBoYW5kbGUgdG8gdGhlIGxheWVyIGFib3ZlIGl0IChwb3NzaWJseSB0aGUgYXBwbGljYXRpb24pLiAgV2hlbiBhIGxheWVyCityZWNlaXZlcyBhIFZ1bGthbiBmdW5jdGlvbiB1c2luZyBzb21ldGhpbmcgdGhhdCBpdCBwcmV2aW91c2x5IHJldHVybmVkIGEgaGFuZGxlCitmb3IsIHRoZSBsYXllciBpcyByZXF1aXJlZCB0byB1bndyYXAgdGhlIGhhbmRsZSBhbmQgcGFzcyBhbG9uZyB0aGUgc2F2ZWQgaGFuZGxlCit0byB0aGUgbGF5ZXIgYmVsb3cgaXQuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGxheWVyICoqbXVzdCBpbnRlcmNlcHQgZXZlcnkgVnVsa2FuCitmdW5jdGlvbiB3aGljaCB1c2VzIHRoZSBvYmplY3QgaW4gcXVlc3Rpb24qKiwgYW5kIHdyYXAgb3IgdW53cmFwIHRoZSBvYmplY3QsIGFzCithcHByb3ByaWF0ZS4gIFRoaXMgaW5jbHVkZXMgYWRkaW5nIHN1cHBvcnQgZm9yIGFsbCBleHRlbnNpb25zIHdpdGggZnVuY3Rpb25zCit1c2luZyBhbnkgb2JqZWN0IHRoZSBsYXllciB3cmFwcy4KKworTGF5ZXJzIGFib3ZlIHRoZSBvYmplY3Qgd3JhcHBpbmcgbGF5ZXIgd2lsbCBzZWUgdGhlIHdyYXBwZWQgb2JqZWN0LiBMYXllcnMKK3doaWNoIHdyYXAgZGlzcGF0Y2hhYmxlIG9iamVjdHMgbXVzdCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIHdyYXBwaW5nCitzdHJ1Y3R1cmUgaXMgYSBwb2ludGVyIHRvIGEgZGlzcGF0Y2ggdGFibGUgYXMgZGVmaW5lZCBpbiBgdmtfbGF5ZXIuaGAuCitTcGVjaWZpY2FsbHksIGFuIGluc3RhbmNlIHdyYXBwZWQgZGlzcGF0Y2hhYmxlIG9iamVjdCBjb3VsZCBiZSBhcyBmb2xsb3dzOgorYGBgCitzdHJ1Y3QgbXlfd3JhcHBlZF9pbnN0YW5jZV9vYmpfIHsKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIC8vIHdoYXRldmVyIGRhdGEgbGF5ZXIgd2FudHMgdG8gYWRkIHRvIHRoaXMgb2JqZWN0Cit9OworYGBgCitBIGRldmljZSB3cmFwcGVkIGRpc3BhdGNoYWJsZSBvYmplY3QgY291bGQgYmUgYXMgZm9sbG93czoKK2BgYAorc3RydWN0IG15X3dyYXBwZWRfaW5zdGFuY2Vfb2JqXyB7CisgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgLy8gd2hhdGV2ZXIgZGF0YSBsYXllciB3YW50cyB0byBhZGQgdG8gdGhpcyBvYmplY3QKK307CitgYGAKKworTGF5ZXJzIHRoYXQgd3JhcCBkaXNwYXRjaGFibGUgb2JqZWN0cyBtdXN0IGZvbGxvdyB0aGUgZ3VpZGVsaW5lcyBmb3IgY3JlYXRpbmcKK25ldyBkaXNwYXRjaGFibGUgb2JqZWN0cyAoYmVsb3cpLgorCisjIyMjIyMgQ2F1dGlvbnMgQWJvdXQgV3JhcHBpbmcKKworTGF5ZXJzIGFyZSBnZW5lcmFsbHkgZGlzY291cmFnZWQgZnJvbSB3cmFwcGluZyBvYmplY3RzLCBiZWNhdXNlIG9mIHRoZQorcG90ZW50aWFsIGZvciBpbmNvbXBhdGliaWxpdGllcyB3aXRoIG5ldyBleHRlbnNpb25zLiAgRm9yIGV4YW1wbGUsIGxldCdzIHNheQordGhhdCBhIGxheWVyIHdyYXBzIGBWa0ltYWdlYCBvYmplY3RzLCBhbmQgcHJvcGVybHkgd3JhcHMgYW5kIHVud3JhcHMgYFZrSW1hZ2VgCitvYmplY3QgaGFuZGxlcyBmb3IgYWxsIGNvcmUgZnVuY3Rpb25zLiAgSWYgYSBuZXcgZXh0ZW5zaW9uIGlzIGNyZWF0ZWQgd2hpY2ggaGFzCitmdW5jdGlvbnMgdGhhdCB0YWtlIGBWa0ltYWdlYCBvYmplY3RzIGFzIHBhcmFtZXRlcnMsIGFuZCBpZiB0aGUgbGF5ZXIgZG9lcyBub3QKK3N1cHBvcnQgdGhvc2UgbmV3IGZ1bmN0aW9ucywgYW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIGJvdGggdGhlIGxheWVyIGFuZCB0aGUgbmV3CitleHRlbnNpb24gd2lsbCBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciB3aGVuIHRob3NlIG5ldyBmdW5jdGlvbnMgYXJlIGNhbGxlZCAoZS5nLgordGhlIGFwcGxpY2F0aW9uIG1heSBjcmFzaCkuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGxvd2VyLWxldmVsIGxheWVycyBhbmQgSUNECit3b24ndCByZWNlaXZlIHRoZSBoYW5kbGUgdGhhdCB0aGV5IGdlbmVyYXRlZC4gIEluc3RlYWQsIHRoZXkgd2lsbCByZWNlaXZlIGEKK2hhbmRsZSB0aGF0IGlzIG9ubHkga25vd24gYnkgdGhlIGxheWVyIHRoYXQgaXMgd3JhcHBpbmcgdGhlIG9iamVjdC4KKworQmVjYXVzZSBvZiB0aGUgcG90ZW50aWFsIGZvciBpbmNvbXBhdGliaWxpdGllcyB3aXRoIHVuc3VwcG9ydGVkIGV4dGVuc2lvbnMsCitsYXllcnMgdGhhdCB3cmFwIG9iamVjdHMgbXVzdCBjaGVjayB3aGljaCBleHRlbnNpb25zIGFyZSBiZWluZyB1c2VkIGJ5IHRoZQorYXBwbGljYXRpb24sIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBpZiB0aGUgbGF5ZXIgaXMgdXNlZCB3aXRoIHVuc3VwcG9ydGVkCitleHRlbnNpb25zIChlLmcuIGRpc2FibGUgbGF5ZXIgZnVuY3Rpb25hbGl0eSwgc3RvcCB3cmFwcGluZyBvYmplY3RzLCBpc3N1ZSBhCittZXNzYWdlIHRvIHRoZSB1c2VyKS4KKworVGhlIHJlYXNvbiB0aGF0IHRoZSB2YWxpZGF0aW9uIGxheWVycyB3cmFwIG9iamVjdHMgaXMgdG8gdHJhY2sgdGhlIHByb3BlciB1c2UKK2FuZCBkZXN0cnVjdGlvbiBvZiBlYWNoIG9iamVjdC4gIFRoZXkgaXNzdWUgYSB2YWxpZGF0aW9uIGVycm9yIGlmIHVzZWQgd2l0aAordW5zdXBwb3J0ZWQgZXh0ZW5zaW9ucywgYWxlcnRpbmcgdGhlIHVzZXIgdG8gdGhlIHBvdGVudGlhbCBmb3IgdW5kZWZpbmVkCitiZWhhdmlvci4KKworCisjIyMjIyMgSGFzaCBNYXBzCisKK0FsdGVybmF0aXZlbHksIGEgbGF5ZXIgbWF5IHdhbnQgdG8gdXNlIGEgaGFzaCBtYXAgdG8gYXNzb2NpYXRlIGRhdGEgd2l0aCBhCitnaXZlbiBvYmplY3QuIFRoZSBrZXkgdG8gdGhlIG1hcCBjb3VsZCBiZSB0aGUgb2JqZWN0LiBBbHRlcm5hdGl2ZWx5LCBmb3IKK2Rpc3BhdGNoYWJsZSBvYmplY3RzIGF0IGEgZ2l2ZW4gbGV2ZWwgKGVnIGRldmljZSBvciBpbnN0YW5jZSkgdGhlIGxheWVyIG1heQord2FudCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYFZrRGV2aWNlYCBvciBgVmtJbnN0YW5jZWAgb2JqZWN0cy4gU2luY2UKK3RoZXJlIGFyZSBtdWx0aXBsZSBkaXNwYXRjaGFibGUgb2JqZWN0cyBmb3IgYSBnaXZlbiBgVmtJbnN0YW5jZWAgb3IgYFZrRGV2aWNlYCwKK3RoZSBgVmtEZXZpY2VgIG9yIGBWa0luc3RhbmNlYCBvYmplY3QgaXMgbm90IGEgZ3JlYXQgbWFwIGtleS4gSW5zdGVhZCB0aGUgbGF5ZXIKK3Nob3VsZCB1c2UgdGhlIGRpc3BhdGNoIHRhYmxlIHBvaW50ZXIgd2l0aGluIHRoZSBgVmtEZXZpY2VgIG9yIGBWa0luc3RhbmNlYAorc2luY2UgdGhhdCB3aWxsIGJlIHVuaXF1ZSBmb3IgYSBnaXZlbiBgVmtJbnN0YW5jZWAgb3IgYFZrRGV2aWNlYC4KKworCisjIyMjIyBDcmVhdGluZyBOZXcgRGlzcGF0Y2hhYmxlIE9iamVjdHMKKworTGF5ZXJzIHdoaWNoIGNyZWF0ZSBkaXNwYXRjaGFibGUgb2JqZWN0cyBtdXN0IHRha2Ugc3BlY2lhbCBjYXJlLiBSZW1lbWJlciB0aGF0Citsb2FkZXIgKnRyYW1wb2xpbmUqIGNvZGUgbm9ybWFsbHkgZmlsbHMgaW4gdGhlIGRpc3BhdGNoIHRhYmxlIHBvaW50ZXIgaW4gdGhlCituZXdseSBjcmVhdGVkIG9iamVjdC4gVGh1cywgdGhlIGxheWVyIG11c3QgZmlsbCBpbiB0aGUgZGlzcGF0Y2ggdGFibGUgcG9pbnRlciBpZgordGhlIGxvYWRlciAqdHJhbXBvbGluZSogd2lsbCBub3QgZG8gc28uICBDb21tb24gY2FzZXMgd2hlcmUgYSBsYXllciAob3IgSUNEKSBtYXkKK2NyZWF0ZSBhIGRpc3BhdGNoYWJsZSBvYmplY3Qgd2l0aG91dCBsb2FkZXIgKnRyYW1wb2xpbmUqIGNvZGUgaXMgYXMgZm9sbG93czoKKy0gbGF5ZXJzIHRoYXQgd3JhcCBkaXNwYXRjaGFibGUgb2JqZWN0cworLSBsYXllcnMgd2hpY2ggYWRkIGV4dGVuc2lvbnMgdGhhdCBjcmVhdGUgZGlzcGF0Y2hhYmxlIG9iamVjdHMKKy0gbGF5ZXJzIHdoaWNoIGluc2VydCBleHRyYSBWdWxrYW4gZnVuY3Rpb25zIGluIHRoZSBzdHJlYW0gb2YgZnVuY3Rpb25zIHRoZXkKK2ludGVyY2VwdCBmcm9tIHRoZSBhcHBsaWNhdGlvbgorLSBJQ0RzIHdoaWNoIGFkZCBleHRlbnNpb25zIHRoYXQgY3JlYXRlIGRpc3BhdGNoYWJsZSBvYmplY3RzCisKK1RoZSBkZXNrdG9wIGxvYWRlciBwcm92aWRlcyBhIGNhbGxiYWNrIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGluaXRpYWxpemluZworYSBkaXNwYXRjaGFibGUgb2JqZWN0LiAgVGhlIGNhbGxiYWNrIGlzIHBhc3NlZCBhcyBhbiBleHRlbnNpb24gc3RydWN0dXJlIHZpYSB0aGUKK3BOZXh0IGZpZWxkIGluIHRoZSBjcmVhdGUgaW5mbyBzdHJ1Y3R1cmUgd2hlbiBjcmVhdGluZyBhbiBpbnN0YW5jZQorKGBWa0luc3RhbmNlQ3JlYXRlSW5mb2ApIG9yIGRldmljZSAoYFZrRGV2aWNlQ3JlYXRlSW5mb2ApLiAgVGhlIGNhbGxiYWNrCitwcm90b3R5cGUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIGZvciBpbnN0YW5jZSBhbmQgZGV2aWNlIGNhbGxiYWNrcyByZXNwZWN0aXZlbHkKKyhzZWUgYHZrX2xheWVyLmhgKToKKworYGBgY3BwCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtTZXRJbnN0YW5jZUxvYWRlckRhdGEoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvYmplY3QpOworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrU2V0RGV2aWNlTG9hZGVyRGF0YShWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9iamVjdCk7CitgYGAKKworVG8gb2J0YWluIHRoZXNlIGNhbGxiYWNrcyB0aGUgbGF5ZXIgbXVzdCBzZWFyY2ggdGhyb3VnaCB0aGUgbGlzdCBvZiBzdHJ1Y3R1cmVzCitwb2ludGVkIHRvIGJ5IHRoZSAicE5leHQiIGZpZWxkIGluIHRoZSBgVmtJbnN0YW5jZUNyZWF0ZUluZm9gIGFuZAorYFZrRGV2aWNlQ3JlYXRlSW5mb2AgcGFyYW1ldGVycyB0byBmaW5kIGFueSBjYWxsYmFjayBzdHJ1Y3R1cmVzIGluc2VydGVkIGJ5IHRoZQorbG9hZGVyLiBUaGUgc2FsaWVudCBkZXRhaWxzIGFyZSBhcyBmb2xsb3dzOgorLSBGb3IgYFZrSW5zdGFuY2VDcmVhdGVJbmZvYCB0aGUgY2FsbGJhY2sgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgInBOZXh0IiBpcworYFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm9gIGFzIGRlZmluZWQgaW4gYGluY2x1ZGUvdnVsa2FuL3ZrX2xheWVyLmhgLgorLSBBICJzVHlwZSIgZmllbGQgaW4gb2YgVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPIHdpdGhpbgorYFZrSW5zdGFuY2VDcmVhdGVJbmZvYCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGEgbG9hZGVyIHN0cnVjdHVyZS4KKy0gV2l0aGluIGBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvYCwgdGhlICJmdW5jdGlvbiIgZmllbGQgaW5kaWNhdGVzIGhvdyB0aGUKK3VuaW9uIGZpZWxkICJ1IiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQuCistIEEgImZ1bmN0aW9uIiBlcXVhbCB0byBWS19MT0FERVJfREFUQV9DQUxMQkFDSyBpbmRpY2F0ZXMgdGhlICJ1IiBmaWVsZCB3aWxsCitjb250YWluIHRoZSBjYWxsYmFjayBpbiAicGZuU2V0SW5zdGFuY2VMb2FkZXJEYXRhIi4KKy0gRm9yIGBWa0RldmljZUNyZWF0ZUluZm9gIHRoZSBjYWxsYmFjayBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSAicE5leHQiIGlzCitgVmtMYXllckRldmljZUNyZWF0ZUluZm9gIGFzIGRlZmluZWQgaW4gYGluY2x1ZGUvdnVsa2FuL3ZrX2xheWVyLmhgLgorLSBBICJzVHlwZSIgZmllbGQgaW4gb2YgVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0RFVklDRV9DUkVBVEVfSU5GTyB3aXRoaW4KK2BWa0RldmljZUNyZWF0ZUluZm9gIHBhcmFtZXRlciBpbmRpY2F0ZXMgYSBsb2FkZXIgc3RydWN0dXJlLgorLSBXaXRoaW4gYFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvYCwgdGhlICJmdW5jdGlvbiIgZmllbGQgaW5kaWNhdGVzIGhvdyB0aGUgdW5pb24KK2ZpZWxkICJ1IiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQuCistIEEgImZ1bmN0aW9uIiBlcXVhbCB0byBWS19MT0FERVJfREFUQV9DQUxMQkFDSyBpbmRpY2F0ZXMgdGhlICJ1IiBmaWVsZCB3aWxsCitjb250YWluIHRoZSBjYWxsYmFjayBpbiAicGZuU2V0RGV2aWNlTG9hZGVyRGF0YSIuCisKK0FsdGVybmF0aXZlbHksIGlmIGFuIG9sZGVyIGxvYWRlciBpcyBiZWluZyB1c2VkIHRoYXQgZG9lc24ndCBwcm92aWRlIHRoZXNlCitjYWxsYmFja3MsIHRoZSBsYXllciBtYXkgbWFudWFsbHkgaW5pdGlhbGl6ZSB0aGUgbmV3bHkgY3JlYXRlZCBkaXNwYXRjaGFibGUKK29iamVjdC4gIFRvIGZpbGwgaW4gdGhlIGRpc3BhdGNoIHRhYmxlIHBvaW50ZXIgaW4gbmV3bHkgY3JlYXRlZCBkaXNwYXRjaGFibGUKK29iamVjdCwgdGhlIGxheWVyIHNob3VsZCBjb3B5IHRoZSBkaXNwYXRjaCBwb2ludGVyLCB3aGljaCBpcyBhbHdheXMgdGhlIGZpcnN0CitlbnRyeSBpbiB0aGUgc3RydWN0dXJlLCBmcm9tIGFuIGV4aXN0aW5nIHBhcmVudCBvYmplY3Qgb2YgdGhlIHNhbWUgbGV2ZWwKKyhpbnN0YW5jZSB2ZXJzdXMgZGV2aWNlKS4KKworRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGEgbmV3bHkgY3JlYXRlZCBgVmtDb21tYW5kQnVmZmVyYCBvYmplY3QsIHRoZW4gdGhlCitkaXNwYXRjaCBwb2ludGVyIGZyb20gdGhlIGBWa0RldmljZWAgb2JqZWN0LCB3aGljaCBpcyB0aGUgcGFyZW50IG9mIHRoZQorYFZrQ29tbWFuZEJ1ZmZlcmAgb2JqZWN0LCBzaG91bGQgYmUgY29waWVkIGludG8gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LgorCisKKyMjIyMgTGF5ZXIgTWFuaWZlc3QgRmlsZSBGb3JtYXQKKworT24gV2luZG93cywgTGludXggYW5kIG1hY09TIChkZXNrdG9wKSwgdGhlIGxvYWRlciB1c2VzIG1hbmlmZXN0IGZpbGVzIHRvIGRpc2NvdmVyCitsYXllciBsaWJyYXJpZXMgYW5kIGxheWVycy4gIFRoZSBkZXNrdG9wIGxvYWRlciBkb2Vzbid0IGRpcmVjdGx5IHF1ZXJ5IHRoZQorbGF5ZXIgbGlicmFyeSBleGNlcHQgZHVyaW5nIGNoYWluaW5nLiAgVGhpcyBpcyB0byByZWR1Y2UgdGhlIGxpa2VsaWhvb2Qgb2YKK2xvYWRpbmcgYSBtYWxpY2lvdXMgbGF5ZXIgaW50byBtZW1vcnkuICBJbnN0ZWFkLCBkZXRhaWxzIGFyZSByZWFkIGZyb20gdGhlCitNYW5pZmVzdCBmaWxlLCB3aGljaCBhcmUgdGhlbiBwcm92aWRlZCBmb3IgYXBwbGljYXRpb25zIHRvIGRldGVybWluZSB3aGF0CitsYXllcnMgc2hvdWxkIGFjdHVhbGx5IGJlIGxvYWRlZC4KKworVGhlIGZvbGxvd2luZyBzZWN0aW9uIGRpc2N1c3NlcyB0aGUgZGV0YWlscyBvZiB0aGUgTGF5ZXIgTWFuaWZlc3QgSlNPTiBmaWxlCitmb3JtYXQuICBUaGUgSlNPTiBmaWxlIGl0c2VsZiBkb2VzIG5vdCBoYXZlIGFueSByZXF1aXJlbWVudHMgZm9yIG5hbWluZy4gIFRoZQorb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSBleHRlbnNpb24gc3VmZml4IG9mIHRoZSBmaWxlIGlzICIuanNvbiIuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBsYXllciBKU09OIE1hbmlmZXN0IGZpbGUgd2l0aCBhIHNpbmdsZSBsYXllcjoKKworYGBgCit7CisgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4wLjAiLAorICAgImxheWVyIjogeworICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19vdmVybGF5IiwKKyAgICAgICAidHlwZSI6ICJJTlNUQU5DRSIsCisgICAgICAgImxpYnJhcnlfcGF0aCI6ICJ2a092ZXJsYXlMYXllci5kbGwiLAorICAgICAgICJhcGlfdmVyc2lvbiIgOiAiMS4wLjUiLAorICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIiA6ICIyIiwKKyAgICAgICAiZGVzY3JpcHRpb24iIDogIkx1bmFyRyBIVUQgbGF5ZXIiLAorICAgICAgICJmdW5jdGlvbnMiOiB7CisgICAgICAgICAgICJ2a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbiI6CisgICAgICAgICAgICAgICAiT3ZlcmxheUxheWVyX05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbiIKKyAgICAgICB9LAorICAgICAgICJpbnN0YW5jZV9leHRlbnNpb25zIjogWworICAgICAgICAgICB7CisgICAgICAgICAgICAgICAibmFtZSI6ICJWS19FWFRfZGVidWdfcmVwb3J0IiwKKyAgICAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMSIKKyAgICAgICAgICAgfSwKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgIm5hbWUiOiAiVktfVkVORE9SX2V4dF94IiwKKyAgICAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMyIKKyAgICAgICAgICAgIH0KKyAgICAgICBdLAorICAgICAgICJkZXZpY2VfZXh0ZW5zaW9ucyI6IFsKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgIm5hbWUiOiAiVktfRVhUX2RlYnVnX21hcmtlciIsCisgICAgICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjEiLAorICAgICAgICAgICAgICAgImVudHJ5cG9pbnRzIjogWyJ2a0NtZERiZ01hcmtlckJlZ2luIiwgInZrQ21kRGJnTWFya2VyRW5kIl0KKyAgICAgICAgICAgfQorICAgICAgIF0sCisgICAgICAgImVuYWJsZV9lbnZpcm9ubWVudCI6IHsKKyAgICAgICAgICAgIkVOQUJMRV9MQVlFUl9PVkVSTEFZXzEiOiAiMSIKKyAgICAgICB9LAorICAgICAgICJkaXNhYmxlX2Vudmlyb25tZW50IjogeworICAgICAgICAgICAiRElTQUJMRV9MQVlFUl9PVkVSTEFZXzEiOiAiIgorICAgICAgIH0KKyAgIH0KK30KK2BgYAorCitIZXJlJ3MgYSBzbmlwcGV0IHdpdGggdGhlIGNoYW5nZXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSBsYXllcnMgcGVyCittYW5pZmVzdCBmaWxlOgorYGBgCit7CisgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4wLjEiLAorICAgImxheWVycyI6IFsKKyAgICAgIHsKKyAgICAgICAgICAgIm5hbWUiOiAiVktfTEFZRVJfbGF5ZXJfbmFtZTEiLAorICAgICAgICAgICAidHlwZSI6ICJJTlNUQU5DRSIsCisgICAgICAgICAgIC4uLgorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgICAgIm5hbWUiOiAiVktfTEFZRVJfbGF5ZXJfbmFtZTIiLAorICAgICAgICAgICAidHlwZSI6ICJJTlNUQU5DRSIsCisgICAgICAgICAgIC4uLgorICAgICAgfQorICAgXQorfQorYGBgCisKK0hlcmUncyBhbiBleGFtcGxlIG9mIGEgbWV0YS1sYXllciBtYW5pZmVzdCBmaWxlOgorYGBgCit7CisgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4xLjEiLAorICAgImxheWVyIjogeworICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19zdGFuZGFyZF92YWxpZGF0aW9uIiwKKyAgICAgICAidHlwZSI6ICJHTE9CQUwiLAorICAgICAgICJhcGlfdmVyc2lvbiIgOiAiMS4wLjQwIiwKKyAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiIgOiAiMSIsCisgICAgICAgImRlc2NyaXB0aW9uIiA6ICJMdW5hckcgU3RhbmRhcmQgVmFsaWRhdGlvbiBNZXRhLWxheWVyIiwKKyAgICAgICAiY29tcG9uZW50X2xheWVycyI6IFsKKyAgICAgICAgICAgIlZLX0xBWUVSX0dPT0dMRV90aHJlYWRpbmciLAorICAgICAgICAgICAiVktfTEFZRVJfTFVOQVJHX3BhcmFtZXRlcl92YWxpZGF0aW9uIiwKKyAgICAgICAgICAgIlZLX0xBWUVSX0xVTkFSR19vYmplY3RfdHJhY2tlciIsCisgICAgICAgICAgICJWS19MQVlFUl9MVU5BUkdfY29yZV92YWxpZGF0aW9uIiwKKyAgICAgICAgICAgIlZLX0xBWUVSX0dPT0dMRV91bmlxdWVfb2JqZWN0cyIKKyAgICAgICBdCisgICB9Cit9CitgYGAKK3wgSlNPTiBOb2RlIHwgRGVzY3JpcHRpb24gYW5kIE5vdGVzIHwgSW50cm9zcGVjdGlvbiBRdWVyeSB8Cit8Oi0tLS0tLS0tLS0tLS0tLS06fC0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tOgorfCAiZmlsZVxfZm9ybWF0XF92ZXJzaW9uIiB8IE1hbmlmZXN0IGZvcm1hdCBtYWpvci5taW5vci5wYXRjaCB2ZXJzaW9uIG51bWJlci4gfCBOL0EgfAorfCB8IFN1cHBvcnRlZCB2ZXJzaW9ucyBhcmU6IDEuMC4wLCAxLjAuMSwgMS4xLjAsIDEuMS4xLCBhbmQgMS4xLjIuIHwgfAorfCAibGF5ZXIiIHwgVGhlIGlkZW50aWZpZXIgdXNlZCB0byBncm91cCBhIHNpbmdsZSBsYXllcidzIGluZm9ybWF0aW9uIHRvZ2V0aGVyLiB8IHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMgfAorfCAibGF5ZXJzIiB8IFRoZSBpZGVudGlmaWVyIHVzZWQgdG8gZ3JvdXAgbXVsdGlwbGUgbGF5ZXJzJyBpbmZvcm1hdGlvbiB0b2dldGhlci4gIFRoaXMgcmVxdWlyZXMgYSBtaW5pbXVtIE1hbmlmZXN0IGZpbGUgZm9ybWF0IHZlcnNpb24gb2YgMS4wLjEufCB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIHwKK3wgIm5hbWUiIHwgVGhlIHN0cmluZyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgbGF5ZXIgdG8gYXBwbGljYXRpb25zLiB8IHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMgfAorfCAidHlwZSIgfCBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgdHlwZSBvZiBsYXllci4gIFRoZSB2YWx1ZXMgY2FuIGJlOiBHTE9CQUwsIG9yIElOU1RBTkNFLiB8IHZrRW51bWVyYXRlKkxheWVyUHJvcGVydGllcyB8Cit8ICB8ICoqTk9URVM6KiogUHJpb3IgdG8gZGVwcmVjYXRpb24sIHRoZSAidHlwZSIgbm9kZSB3YXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBsYXllciBjaGFpbihzKSB0byBhY3RpdmF0ZSB0aGUgbGF5ZXIgdXBvbjogaW5zdGFuY2UsIGRldmljZSwgb3IgYm90aC4gRGlzdGluY3QgaW5zdGFuY2UgYW5kIGRldmljZSBsYXllcnMgYXJlIGRlcHJlY2F0ZWQ7IHRoZXJlIGFyZSBub3cganVzdCBsYXllcnMuIEFsbG93YWJsZSB2YWx1ZXMgZm9yIHR5cGUgKGJvdGggYmVmb3JlIGFuZCBhZnRlciBkZXByZWNhdGlvbikgYXJlICJJTlNUQU5DRSIsICJHTE9CQUwiIGFuZCwgIkRFVklDRS4iICJERVZJQ0UiIGxheWVycyBhcmUgc2tpcHBlZCBvdmVyIGJ5IHRoZSBsb2FkZXIgYXMgaWYgdGhleSB3ZXJlIG5vdCBmb3VuZC4gfCAgfAorfCAibGlicmFyeVxfcGF0aCIgfCBUaGUgImxpYnJhcnlcX3BhdGgiIHNwZWNpZmllcyBlaXRoZXIgYSBmaWxlbmFtZSwgYSByZWxhdGl2ZSBwYXRobmFtZSwgb3IgYSBmdWxsIHBhdGhuYW1lIHRvIGEgbGF5ZXIgc2hhcmVkIGxpYnJhcnkgZmlsZS4gIElmICJsaWJyYXJ5XF9wYXRoIiBzcGVjaWZpZXMgYSByZWxhdGl2ZSBwYXRobmFtZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIHBhdGggb2YgdGhlIEpTT04gbWFuaWZlc3QgZmlsZSAoZS5nLiBmb3IgY2FzZXMgd2hlbiBhbiBhcHBsaWNhdGlvbiBwcm92aWRlcyBhIGxheWVyIHRoYXQgaXMgaW4gdGhlIHNhbWUgZm9sZGVyIGhpZXJhcmNoeSBhcyB0aGUgcmVzdCBvZiB0aGUgYXBwbGljYXRpb24gZmlsZXMpLiAgSWYgImxpYnJhcnlcX3BhdGgiIHNwZWNpZmllcyBhIGZpbGVuYW1lLCB0aGUgbGlicmFyeSBtdXN0IGxpdmUgaW4gdGhlIHN5c3RlbSdzIHNoYXJlZCBvYmplY3Qgc2VhcmNoIHBhdGguIFRoZXJlIGFyZSBubyBydWxlcyBhYm91dCB0aGUgbmFtZSBvZiB0aGUgbGF5ZXIgc2hhcmVkIGxpYnJhcnkgZmlsZXMgb3RoZXIgdGhhbiBpdCBzaG91bGQgZW5kIHdpdGggdGhlIGFwcHJvcHJpYXRlIHN1ZmZpeCAoIi5ETEwiIG9uIFdpbmRvd3MsICIuc28iIG9uIExpbnV4LCBhbmQgIi5keWxpYiIgb24gbWFjT1MpLiAgKipUaGlzIGZpZWxkIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgImNvbXBvbmVudF9sYXllcnMiIGlzIGRlZmluZWQqKi4gIHwgTi9BIHwKK3wgImFwaVxfdmVyc2lvbiIgfCBUaGUgbWFqb3IubWlub3IucGF0Y2ggdmVyc2lvbiBudW1iZXIgb2YgdGhlIFZ1bGthbiBBUEkgdGhhdCB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZSBmb3IgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0IGFnYWluc3QuIEZvciBleGFtcGxlOiAxLjAuMzMuIHwgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyB8Cit8ICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIiB8IFRoZSB2ZXJzaW9uIG9mIHRoZSBsYXllciBpbXBsZW1lbnRlZC4gIElmIHRoZSBsYXllciBpdHNlbGYgaGFzIGFueSBtYWpvciBjaGFuZ2VzLCB0aGlzIG51bWJlciBzaG91bGQgY2hhbmdlIHNvIHRoZSBsb2FkZXIgYW5kL29yIGFwcGxpY2F0aW9uIGNhbiBpZGVudGlmeSBpdCBwcm9wZXJseS4gfCB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIHwKK3wgImRlc2NyaXB0aW9uIiB8IEEgaGlnaC1sZXZlbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGF5ZXIgYW5kIGl0cyBpbnRlbmRlZCB1c2UuIHwgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyB8Cit8ICJmdW5jdGlvbnMiIHwgKipPUFRJT05BTDoqKiBUaGlzIHNlY3Rpb24gY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBkaWZmZXJlbnQgZnVuY3Rpb24gbmFtZSBmb3IgdGhlIGxvYWRlciB0byB1c2UgaW4gcGxhY2Ugb2Ygc3RhbmRhcmQgbGF5ZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gVGhlICJmdW5jdGlvbnMiIG5vZGUgaXMgcmVxdWlyZWQgaWYgdGhlIGxheWVyIGlzIHVzaW5nIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIGB2a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbmAuIHwgdmtHZXQqUHJvY0FkZHIgfAorfCAiaW5zdGFuY2VcX2V4dGVuc2lvbnMiIHwgKipPUFRJT05BTDoqKiBDb250YWlucyB0aGUgbGlzdCBvZiBpbnN0YW5jZSBleHRlbnNpb24gbmFtZXMgc3VwcG9ydGVkIGJ5IHRoaXMgbGF5ZXIuIE9uZSAiaW5zdGFuY2VcX2V4dGVuc2lvbnMiIG5vZGUgd2l0aCBhbiBhcnJheSBvZiBvbmUgb3IgbW9yZSBlbGVtZW50cyBpcyByZXF1aXJlZCBpZiBhbnkgaW5zdGFuY2UgZXh0ZW5zaW9ucyBhcmUgc3VwcG9ydGVkIGJ5IGEgbGF5ZXI7IG90aGVyd2lzZSB0aGUgbm9kZSBpcyBvcHRpb25hbC4gRWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSBtdXN0IGhhdmUgdGhlIG5vZGVzICJuYW1lIiBhbmQgInNwZWNfdmVyc2lvbiIgd2hpY2ggY29ycmVzcG9uZCB0byBgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzYCAiZXh0ZW5zaW9uTmFtZSIgYW5kICJzcGVjVmVyc2lvbiIgcmVzcGVjdGl2ZWx5LiB8IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIHwKK3wgImRldmljZVxfZXh0ZW5zaW9ucyIgfCAqKk9QVElPTkFMOioqIENvbnRhaW5zIHRoZSBsaXN0IG9mIGRldmljZSBleHRlbnNpb24gbmFtZXMgc3VwcG9ydGVkIGJ5IHRoaXMgbGF5ZXIuIE9uZSAiZGV2aWNlXF9leHRlbnNpb25zIiBub2RlIHdpdGggYW4gYXJyYXkgb2Ygb25lIG9yIG1vcmUgZWxlbWVudHMgaXMgcmVxdWlyZWQgaWYgYW55IGRldmljZSBleHRlbnNpb25zIGFyZSBzdXBwb3J0ZWQgYnkgYSBsYXllcjsgb3RoZXJ3aXNlIHRoZSBub2RlIGlzIG9wdGlvbmFsLiBFYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IG11c3QgaGF2ZSB0aGUgbm9kZXMgIm5hbWUiIGFuZCAic3BlY192ZXJzaW9uIiB3aGljaCBjb3JyZXNwb25kIHRvIGBWa0V4dGVuc2lvblByb3BlcnRpZXNgICJleHRlbnNpb25OYW1lIiBhbmQgInNwZWNWZXJzaW9uIiByZXNwZWN0aXZlbHkuIEFkZGl0aW9uYWxseSwgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSBvZiBkZXZpY2UgZXh0ZW5zaW9ucyBtdXN0IGhhdmUgdGhlIG5vZGUgImVudHJ5cG9pbnRzIiBpZiB0aGUgZGV2aWNlIGV4dGVuc2lvbiBhZGRzIFZ1bGthbiBBUEkgZnVuY3Rpb25zOyBvdGhlcndpc2UgdGhpcyBub2RlIGlzIG5vdCByZXF1aXJlZC4gVGhlICJlbnRyeXBvaW50IiBub2RlIGlzIGFuIGFycmF5IG9mIHRoZSBuYW1lcyBvZiBhbGwgZW50cnlwb2ludHMgYWRkZWQgYnkgdGhlIHN1cHBvcnRlZCBleHRlbnNpb24uIHwgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIHwKK3wgImVuYWJsZVxfZW52aXJvbm1lbnQiIHwgKipJbXBsaWNpdCBMYXllcnMgT25seSoqIC0gKipPUFRJT05BTDoqKiBJbmRpY2F0ZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCB0byBlbmFibGUgdGhlIEltcGxpY2l0IExheWVyIChpZiBzZXQgdG8gYSB2YWx1ZSBvZiAxKS4gIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgKHdoaWNoIHNob3VsZCB2YXJ5IHdpdGggZWFjaCAidmVyc2lvbiIgb2YgdGhlIGxheWVyKSBtdXN0IGJlIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUgb3IgZWxzZSB0aGUgaW1wbGljaXQgbGF5ZXIgaXMgbm90IGxvYWRlZC4gVGhpcyBpcyBmb3IgYXBwbGljYXRpb24gZW52aXJvbm1lbnRzIChlLmcuIFN0ZWFtKSB3aGljaCB3YW50IHRvIGVuYWJsZSBhIGxheWVyKHMpIG9ubHkgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHRoZXkgbGF1bmNoLCBhbmQgYWxsb3dzIGZvciBhcHBsaWNhdGlvbnMgcnVuIG91dHNpZGUgb2YgYW4gYXBwbGljYXRpb24gZW52aXJvbm1lbnQgdG8gbm90IGdldCB0aGF0IGltcGxpY2l0IGxheWVyKHMpLnwgTi9BIHwKK3wgImRpc2FibGVcX2Vudmlyb25tZW50IiB8ICoqSW1wbGljaXQgTGF5ZXJzIE9ubHkqKiAtICoqUkVRVUlSRUQ6KipJbmRpY2F0ZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCB0byBkaXNhYmxlIHRoZSBJbXBsaWNpdCBMYXllciAody8gdmFsdWUgb2YgMSkuIEluIHJhcmUgY2FzZXMgb2YgYW4gYXBwbGljYXRpb24gbm90IHdvcmtpbmcgd2l0aCBhbiBpbXBsaWNpdCBsYXllciwgdGhlIGFwcGxpY2F0aW9uIGNhbiBzZXQgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSAoYmVmb3JlIGNhbGxpbmcgVnVsa2FuIGZ1bmN0aW9ucykgaW4gb3JkZXIgdG8gImJsYWNrbGlzdCIgdGhlIGxheWVyLiBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlICh3aGljaCBzaG91bGQgdmFyeSB3aXRoIGVhY2ggInZlcnNpb24iIG9mIHRoZSBsYXllcikgbXVzdCBiZSBzZXQgKG5vdCBwYXJ0aWN1bGFybHkgdG8gYW55IHZhbHVlKS4gSWYgYm90aCB0aGUgImVuYWJsZV9lbnZpcm9ubWVudCIgYW5kICJkaXNhYmxlX2Vudmlyb25tZW50IiB2YXJpYWJsZXMgYXJlIHNldCwgdGhlIGltcGxpY2l0IGxheWVyIGlzIGRpc2FibGVkLiB8IE4vQSB8Cit8ICJjb21wb25lbnRfbGF5ZXJzIiB8ICoqTWV0YS1sYXllcnMgT25seSoqIC0gSW5kaWNhdGVzIHRoZSBjb21wb25lbnQgbGF5ZXIgbmFtZXMgdGhhdCBhcmUgcGFydCBvZiBhIG1ldGEtbGF5ZXIuICBUaGUgbmFtZXMgbGlzdGVkIG11c3QgYmUgdGhlICJuYW1lIiBpZGVudGlmaWVkIGluIGVhY2ggb2YgdGhlIGNvbXBvbmVudCBsYXllcidzIE1haW5mZXN0IGZpbGUgIm5hbWUiIHRhZyAodGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5ZXIgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGB2a0NyZWF0ZUluc3RhbmNlYCBjb21tYW5kKS4gIEFsbCBjb21wb25lbnQgbGF5ZXJzIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgc3lzdGVtIGFuZCBmb3VuZCBieSB0aGUgbG9hZGVyIGluIG9yZGVyIGZvciB0aGlzIG1ldGEtbGF5ZXIgdG8gYmUgYXZhaWxhYmxlIGFuZCBhY3RpdmF0ZWQuICoqVGhpcyBmaWVsZCBtdXN0IG5vdCBiZSBwcmVzZW50IGlmICJsaWJyYXJ5XF9wYXRoIiBpcyBkZWZpbmVkKiouIHwgTi9BIHwKK3wgInByZV9pbnN0YW5jZV9mdW5jdGlvbnMiIHwgKipJbXBsaWNpdCBMYXllcnMgT25seSoqIC0gKipPUFRJT05BTDoqKiBJbmRpY2F0ZXMgd2hpY2ggZnVuY3Rpb25zIHRoZSBsYXllciB3aXNoZXMgdG8gaW50ZXJjZXB0LCB0aGF0IGRvIG5vdCByZXF1aXJlIHRoYXQgYW4gaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZC4gVGhpcyBzaG91bGQgYmUgYW4gb2JqZWN0IHdoZXJlIGVhY2ggZnVuY3Rpb24gdG8gYmUgaW50ZXJjZXB0ZWQgaXMgZGVmaW5lZCBhcyBhIHN0cmluZyBlbnRyeSB3aGVyZSB0aGUga2V5IGlzIHRoZSBWdWxrYW4gZnVuY3Rpb24gbmFtZSBhbmQgdGhlIHZhbHVlIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHQgZnVuY3Rpb24gaW4gdGhlIGxheWVyJ3MgZHluYW1pYyBsaWJyYXJ5LiBBdmFpbGFibGUgaW4gbGF5ZXIgbWFuaWZlc3QgdmVyc2lvbnMgMS4xLjIgYW5kIHVwLiBTZWUgW1ByZS1JbnN0YW5jZSBGdW5jdGlvbnNdKCNwcmUtaW5zdGFuY2UtZnVuY3Rpb25zKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gfCB2a0VudW1lcmF0ZUluc3RhbmNlKlByb3BlcnRpZXMgfAorCisjIyMjIyBMYXllciBNYW5pZmVzdCBGaWxlIFZlcnNpb24gSGlzdG9yeQorCitUaGUgY3VycmVudCBoaWdoZXN0IHN1cHBvcnRlZCBMYXllciBNYW5pZmVzdCBmaWxlIGZvcm1hdCBzdXBwb3J0ZWQgaXMgMS4xLjIuCitJbmZvcm1hdGlvbiBhYm91dCBlYWNoIHZlcnNpb24gaXMgZGV0YWlsZWQgaW4gdGhlIGZvbGxvd2luZyBzdWItc2VjdGlvbnM6CisKKyMjIyMjIyBMYXllciBNYW5pZmVzdCBGaWxlIFZlcnNpb24gMS4xLjIKKworVmVyc2lvbiAxLjEuMiBpbnRyb2R1Y2VkIHRoZSBhYmlsaXR5IG9mIGxheWVycyB0byBpbnRlcmNlcHQgZnVuY3Rpb24gY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhbiBpbnN0YW5jZS4KKworIyMjIyMjIExheWVyIE1hbmlmZXN0IEZpbGUgVmVyc2lvbiAxLjEuMQorCitUaGUgYWJpbGl0eSB0byBkZWZpbmUgY3VzdG9tIG1ldGFsYXllcnMgd2FzIGFkZGVkLgorVG8gc3VwcG9ydCBtZXRhbGF5ZXJzLCB0aGUgImNvbXBvbmVudF9sYXllcnMiIHNlY3Rpb24gd2FzIGFkZGVkLCBhbmQgdGhlIHJlcXVpcmVtZW50IGZvciBhICJsaWJyYXJ5X3BhdGgiIHNlY3Rpb24gdG8gYmUgcHJlc2VudCB3YXMgcmVtb3ZlZCB3aGVuIHRoZSAiY29tcG9uZW50X2xheWVycyIgc2VjdGlvbiBpcyBwcmVzZW50LgorCisjIyMjIyMgTGF5ZXIgTWFuaWZlc3QgRmlsZSBWZXJzaW9uIDEuMS4wCisKK0xheWVyIE1hbmlmZXN0IEZpbGUgVmVyc2lvbiAxLjEuMCBpcyB0aWVkIHRvIGNoYW5nZXMgZXhwb3NlZCBieSB0aGUgTG9hZGVyL0xheWVyCitpbnRlcmZhY2UgdmVyc2lvbiAyLgorICAxLiBSZW5hbWluZyAidmtHZXRJbnN0YW5jZVByb2NBZGRyIiBpbiB0aGUgImZ1bmN0aW9ucyIgc2VjdGlvbiBpcworICAgICBkZXByZWNhdGVkIHNpbmNlIHRoZSBsb2FkZXIgbm8gbG9uZ2VyIG5lZWRzIHRvIHF1ZXJ5IHRoZSBsYXllciBhYm91dAorICAgICAidmtHZXRJbnN0YW5jZVByb2NBZGRyIiBkaXJlY3RseS4gIEl0IGlzIG5vdyByZXR1cm5lZCBkdXJpbmcgdGhlIGxheWVyCisgICAgIG5lZ290aWF0aW9uLCBzbyB0aGlzIGZpZWxkIHdpbGwgYmUgaWdub3JlZC4KKyAgMi4gUmVuYW1pbmcgInZrR2V0RGV2aWNlUHJvY0FkZHIiIGluIHRoZSAiZnVuY3Rpb25zIiBzZWN0aW9uIGlzCisgICAgIGRlcHJlY2F0ZWQgc2luY2UgdGhlIGxvYWRlciBubyBsb25nZXIgbmVlZHMgdG8gcXVlcnkgdGhlIGxheWVyIGFib3V0CisgICAgICJ2a0dldERldmljZVByb2NBZGRyIiBkaXJlY3RseS4gIEl0IHRvbyBpcyBub3cgcmV0dXJuZWQgZHVyaW5nIHRoZSBsYXllcgorICAgICBuZWdvdGlhdGlvbiwgc28gdGhpcyBmaWVsZCB3aWxsIGJlIGlnbm9yZWQuCisgIDMuIFJlbmFtaW5nIHRoZSAidmtOZWdvdGlhdGVMb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24iIGZ1bmN0aW9uIGlzCisgICAgIGJlaW5nIGFkZGVkIHRvIHRoZSAiZnVuY3Rpb25zIiBzZWN0aW9uLCBzaW5jZSB0aGlzIGlzIG5vdyB0aGUgb25seQorICAgICBmdW5jdGlvbiB0aGUgbG9hZGVyIG5lZWRzIHRvIHF1ZXJ5IHVzaW5nIE9TLXNwZWNpZmljIGNhbGxzLgorICAgICAgLSBOT1RFOiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIGFuZCwgYXMgdGhlIHR3byBwcmV2aW91cyBmaWVsZHMsIG9ubHkKK25lZWRlZCBpZiB0aGUgbGF5ZXIgcmVxdWlyZXMgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGZvciBzb21lIHJlYXNvbi4KKworWW91IGRvIG5vdCBuZWVkIHRvIHVwZGF0ZSB5b3VyIGxheWVyIG1hbmlmZXN0IGZpbGUgaWYgeW91IGRvbid0IGNoYW5nZSB0aGUKK25hbWVzIG9mIGFueSBvZiB0aGUgbGlzdGVkIGZ1bmN0aW9ucy4KKworIyMjIyMjIExheWVyIE1hbmlmZXN0IEZpbGUgVmVyc2lvbiAxLjAuMQorCitUaGUgYWJpbGl0eSB0byBkZWZpbmUgbXVsdGlwbGUgbGF5ZXJzIHVzaW5nIHRoZSAibGF5ZXJzIiBhcnJheSB3YXMgYWRkZWQuICBUaGlzCitKU09OIGFycmF5IGZpZWxkIGNhbiBiZSB1c2VkIHdoZW4gZGVmaW5pbmcgYSBzaW5nbGUgbGF5ZXIgb3IgbXVsdGlwbGUgbGF5ZXJzLgorVGhlICJsYXllciIgZmllbGQgaXMgc3RpbGwgcHJlc2VudCBhbmQgdmFsaWQgZm9yIGEgc2luZ2xlIGxheWVyIGRlZmluaXRpb24uCisKKyMjIyMjIyBMYXllciBNYW5pZmVzdCBGaWxlIFZlcnNpb24gMS4wLjAKKworVGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGUgbGF5ZXIgbWFuaWZlc3QgZmlsZSBzcGVjaWZpZWQgdGhlIGJhc2ljIGZvcm1hdCBhbmQKK2ZpZWxkcyBvZiBhIGxheWVyIEpTT04gZmlsZS4gIFRoZSBmaWVsZHMgb2YgdGhlIDEuMC4wIGZpbGUgZm9ybWF0IGluY2x1ZGU6CisgKiAiZmlsZVxfZm9ybWF0XF92ZXJzaW9uIgorICogImxheWVyIgorICogIm5hbWUiCisgKiAidHlwZSIKKyAqICJsaWJyYXJ5XF9wYXRoIgorICogImFwaVxfdmVyc2lvbiIKKyAqICJpbXBsZW1lbnRhdGlvblxfdmVyc2lvbiIKKyAqICJkZXNjcmlwdGlvbiIKKyAqICJmdW5jdGlvbnMiCisgKiAiaW5zdGFuY2VcX2V4dGVuc2lvbnMiCisgKiAiZGV2aWNlXF9leHRlbnNpb25zIgorICogImVuYWJsZVxfZW52aXJvbm1lbnQiCisgKiAiZGlzYWJsZVxfZW52aXJvbm1lbnQiCisKK0l0IHdhcyBhbHNvIGR1cmluZyB0aGlzIHRpbWUgdGhhdCB0aGUgdmFsdWUgb2YgIkRFVklDRSIgd2FzIGRlcHJlY2F0ZWQgZnJvbQordGhlICJ0eXBlIiBmaWVsZC4KKworCisjIyMjIExheWVyIExpYnJhcnkgVmVyc2lvbnMKKworVGhlIGN1cnJlbnQgTGF5ZXIgTGlicmFyeSBpbnRlcmZhY2UgaXMgYXQgdmVyc2lvbiAyLiAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucworZGV0YWlsIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB2YXJpb3VzIHZlcnNpb25zLgorCisjIyMjIyBMYXllciBMaWJyYXJ5IEFQSSBWZXJzaW9uIDIKKworSW50cm9kdWNlZCB0aGUgY29uY2VwdCBvZgorW2xvYWRlciBhbmQgbGF5ZXIgaW50ZXJmYWNlXSgjbGF5ZXItdmVyc2lvbi1uZWdvdGlhdGlvbikgdXNpbmcgdGhlIG5ldworYHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uYCBmdW5jdGlvbi4gQWRkaXRpb25hbGx5LCBpdCBpbnRyb2R1Y2VkCit0aGUgY29uY2VwdCBvZgorW0xheWVyIFVua25vd24gUGh5c2ljYWwgRGV2aWNlIEV4dGVuc2lvbnNdKCNsYXllci11bmtub3duLXBoeXNpY2FsLWRldmljZS1leHRlbnNpb25zKQorYW5kIHRoZSBhc3NvY2lhdGVkIGB2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHJgIGZ1bmN0aW9uLiAgRmluYWxseSwgaXQKK2NoYW5nZWQgdGhlIG1hbmlmZXN0IGZpbGUgZGVmaW5pdGlvbiB0byAxLjEuMC4KKworIyMjIyMgTGF5ZXIgTGlicmFyeSBBUEkgVmVyc2lvbiAxCisKK0EgbGF5ZXIgbGlicmFyeSBzdXBwb3J0aW5nIGludGVyZmFjZSB2ZXJzaW9uIDEgaGFkIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3I6CisgMS4gYEdldEluc3RhbmNlUHJvY0FkZHJgIGFuZCBgR2V0RGV2aWNlUHJvY0FkZHJgIHdlcmUgZGlyZWN0bHkgZXhwb3J0ZWQKKyAyLiBUaGUgbGF5ZXIgbWFuaWZlc3QgZmlsZSB3YXMgYWJsZSB0byBvdmVycmlkZSB0aGUgbmFtZXMgb2YgdGhlCitgR2V0SW5zdGFuY2VQcm9jQWRkcmAgYW5kIGBHZXREZXZpY2VQcm9jQWRkcmBmdW5jdGlvbnMuCisKKyMjIyMjIExheWVyIExpYnJhcnkgQVBJIFZlcnNpb24gMAorCitBIGxheWVyIGxpYnJhcnkgc3VwcG9ydGluZyBpbnRlcmZhY2UgdmVyc2lvbiAwIG11c3QgZGVmaW5lIGFuZCBleHBvcnQgdGhlc2UKK2ludHJvc3BlY3Rpb24gZnVuY3Rpb25zLCB1bnJlbGF0ZWQgdG8gYW55IFZ1bGthbiBmdW5jdGlvbiBkZXNwaXRlIHRoZSBuYW1lcywKK3NpZ25hdHVyZXMsIGFuZCBvdGhlciBzaW1pbGFyaXRpZXM6CisKKy0gYHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNgIGVudW1lcmF0ZXMgYWxsIGxheWVycyBpbiBhIGxheWVyCitsaWJyYXJ5LgorICAtIFRoaXMgZnVuY3Rpb24gbmV2ZXIgZmFpbHMuCisgIC0gV2hlbiBhIGxheWVyIGxpYnJhcnkgY29udGFpbnMgb25seSBvbmUgbGF5ZXIsIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGFuIGFsaWFzCisgICB0byB0aGUgbGF5ZXIncyBgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllc2AuCistIGB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc2AgZW51bWVyYXRlcyBpbnN0YW5jZSBleHRlbnNpb25zIG9mCisgICBsYXllcnMgaW4gYSBsYXllciBsaWJyYXJ5LgorICAtICJwTGF5ZXJOYW1lIiBpcyBhbHdheXMgYSB2YWxpZCBsYXllciBuYW1lLgorICAtIFRoaXMgZnVuY3Rpb24gbmV2ZXIgZmFpbHMuCisgIC0gV2hlbiBhIGxheWVyIGxpYnJhcnkgY29udGFpbnMgb25seSBvbmUgbGF5ZXIsIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGFuIGFsaWFzCisgICB0byB0aGUgbGF5ZXIncyBgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNgLgorLSBgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXNgIGVudW1lcmF0ZXMgYSBzdWJzZXQgKGNhbiBiZSBmdWxsLAorICAgcHJvcGVyLCBvciBlbXB0eSBzdWJzZXQpIG9mIGxheWVycyBpbiBhIGxheWVyIGxpYnJhcnkuCisgIC0gInBoeXNpY2FsRGV2aWNlIiBpcyBhbHdheXMgYFZLX05VTExfSEFORExFYC4KKyAgLSBUaGlzIGZ1bmN0aW9uIG5ldmVyIGZhaWxzLgorICAtIElmIGEgbGF5ZXIgaXMgbm90IGVudW1lcmF0ZWQgYnkgdGhpcyBmdW5jdGlvbiwgaXQgd2lsbCBub3QgcGFydGljaXBhdGUgaW4KKyAgIGRldmljZSBmdW5jdGlvbiBpbnRlcmNlcHRpb24uCistIGB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXNgIGVudW1lcmF0ZXMgZGV2aWNlIGV4dGVuc2lvbnMgb2YKKyAgIGxheWVycyBpbiBhIGxheWVyIGxpYnJhcnkuCisgIC0gInBoeXNpY2FsRGV2aWNlIiBpcyBhbHdheXMgYFZLX05VTExfSEFORExFYC4KKyAgLSAicExheWVyTmFtZSIgaXMgYWx3YXlzIGEgdmFsaWQgbGF5ZXIgbmFtZS4KKyAgLSBUaGlzIGZ1bmN0aW9uIG5ldmVyIGZhaWxzLgorCitJdCBtdXN0IGFsc28gZGVmaW5lIGFuZCBleHBvcnQgdGhlc2UgZnVuY3Rpb25zIG9uY2UgZm9yIGVhY2ggbGF5ZXIgaW4gdGhlCitsaWJyYXJ5OgorCistIGA8bGF5ZXJOYW1lPkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIHBOYW1lKWAgYmVoYXZlcyBpZGVudGljYWxseSB0byBhCitsYXllcidzIHZrR2V0SW5zdGFuY2VQcm9jQWRkciBleGNlcHQgaXQgaXMgZXhwb3J0ZWQuCisKKyAgIFdoZW4gYSBsYXllciBsaWJyYXJ5IGNvbnRhaW5zIG9ubHkgb25lIGxheWVyLCB0aGlzIGZ1bmN0aW9uIG1heQorICAgYWx0ZXJuYXRpdmVseSBiZSBuYW1lZCBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYC4KKworLSBgPGxheWVyTmFtZT5HZXREZXZpY2VQcm9jQWRkcmAgIGJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8gYSBsYXllcidzCit2a0dldERldmljZVByb2NBZGRyIGV4Y2VwdCBpdCBpcyBleHBvcnRlZC4KKworICAgV2hlbiBhIGxheWVyIGxpYnJhcnkgY29udGFpbnMgb25seSBvbmUgbGF5ZXIsIHRoaXMgZnVuY3Rpb24gbWF5CisgICBhbHRlcm5hdGl2ZWx5IGJlIG5hbWVkIGB2a0dldERldmljZVByb2NBZGRyYC4KKworQWxsIGxheWVycyBjb250YWluZWQgd2l0aGluIGEgbGlicmFyeSBtdXN0IHN1cHBvcnQgYHZrX2xheWVyLmhgLiAgVGhleSBkbyBub3QKK25lZWQgdG8gaW1wbGVtZW50IGZ1bmN0aW9ucyB0aGF0IHRoZXkgZG8gbm90IGludGVyY2VwdC4gIFRoZXkgYXJlIHJlY29tbWVuZGVkCitub3QgdG8gZXhwb3J0IGFueSBmdW5jdGlvbnMuCisKKworPGJyLz4KKzxici8+CisKKyMjIFZ1bGthbiBJbnN0YWxsYWJsZSBDbGllbnQgRHJpdmVyIEludGVyZmFjZSBXaXRoIHRoZSBMb2FkZXIKKworVGhpcyBzZWN0aW9uIGRpc2N1c3NlcyB0aGUgdmFyaW91cyByZXF1aXJlbWVudHMgZm9yIHRoZSBsb2FkZXIgYW5kIGEgVnVsa2FuCitJQ0QgdG8gcHJvcGVybHkgaGFuZHNoYWtlLgorCisgICogW0lDRCBEaXNjb3ZlcnldKCNpY2QtZGlzY292ZXJ5KQorICAgICogW092ZXJyaWRpbmcgdGhlIERlZmF1bHQgSUNEIFVzYWdlXSgjb3ZlcnJpZGluZy10aGUtZGVmYXVsdC1pY2QtdXNhZ2UpCisgICAgKiBbSUNEIE1hbmlmZXN0IEZpbGUgVXNhZ2VdKCNpY2QtbWFuaWZlc3QtZmlsZS11c2FnZSkKKyAgICAqIFtJQ0QgRGlzY292ZXJ5IG9uIFdpbmRvd3NdKCNpY2QtZGlzY292ZXJ5LW9uLXdpbmRvd3MpCisgICAgKiBbSUNEIERpc2NvdmVyeSBvbiBMaW51eF0oI2ljZC1kaXNjb3Zlcnktb24tbGludXgpCisgICAgKiBbSUNEIERpc2NvdmVyeSBvbiBtYWNPU10oI2ljZC1kaXNjb3Zlcnktb24tbWFjb3MpCisgICAgKiBbVXNpbmcgUHJlLVByb2R1Y3Rpb24gSUNEcyBvbiBXaW5kb3dzLCBMaW51eCBhbmQgbWFjT1NdKCN1c2luZy1wcmUtcHJvZHVjdGlvbi1pY2RzLW9uLXdpbmRvd3MtYW5kLWxpbnV4KQorICAgICogW0lDRCBEaXNjb3Zlcnkgb24gQW5kcm9pZF0oI2ljZC1kaXNjb3Zlcnktb24tYW5kcm9pZCkKKyAgKiBbSUNEIE1hbmlmZXN0IEZpbGUgRm9ybWF0XSgjaWNkLW1hbmlmZXN0LWZpbGUtZm9ybWF0KQorICAgICogW0lDRCBNYW5pZmVzdCBGaWxlIFZlcnNpb25zXSgjaWNkLW1hbmlmZXN0LWZpbGUtdmVyc2lvbnMpCisgICAgICAqIFtJQ0QgTWFuaWZlc3QgRmlsZSBWZXJzaW9uIDEuMC4wXSgjaWNkLW1hbmlmZXN0LWZpbGUtdmVyc2lvbi0xLjAuMCkKKyAgKiBbSUNEIFZ1bGthbiBFbnRyeSBQb2ludCBEaXNjb3ZlcnldKCNpY2QtdnVsa2FuLWVudHJ5IHBvaW50LWRpc2NvdmVyeSkKKyAgKiBbSUNEIEFQSSBWZXJzaW9uXSgjaWNkLWFwaS12ZXJzaW9uKQorICAqIFtJQ0QgVW5rbm93biBQaHlzaWNhbCBEZXZpY2UgRXh0ZW5zaW9uc10oI2ljZC11bmtub3duLXBoeXNpY2FsLWRldmljZS1leHRlbnNpb25zKQorICAqIFtJQ0QgRGlzcGF0Y2hhYmxlIE9iamVjdCBDcmVhdGlvbl0oI2ljZC1kaXNwYXRjaGFibGUtb2JqZWN0LWNyZWF0aW9uKQorICAqIFtIYW5kbGluZyBLSFIgU3VyZmFjZSBPYmplY3RzIGluIFdTSSBFeHRlbnNpb25zXSgjaGFuZGxpbmcta2hyLXN1cmZhY2Utb2JqZWN0cy1pbi13c2ktZXh0ZW5zaW9ucykKKyAgKiBbTG9hZGVyIGFuZCBJQ0QgSW50ZXJmYWNlIE5lZ290aWF0aW9uXSgjbG9hZGVyLWFuZC1pY2QtaW50ZXJmYWNlLW5lZ290aWF0aW9uKQorICAgICogW1dpbmRvd3MsIExpbnV4LCBhbmQgbWFjT1MgSUNEIE5lZ290aWF0aW9uXSgjd2luZG93cy1hbmQtbGludXgtaWNkLW5lZ290aWF0aW9uKQorICAgICAgKiBbVmVyc2lvbiBOZWdvdGlhdGlvbiBCZXR3ZWVuIExvYWRlciBhbmQgSUNEc10oI3ZlcnNpb24tbmVnb3RpYXRpb24tYmV0d2Vlbi1sb2FkZXItYW5kLWljZHMpCisgICAgICAgICogW0ludGVyZmFjaW5nIFdpdGggTGVnYWN5IElDRHMgb3IgTG9hZGVyXSgjaW50ZXJmYWNpbmctd2l0aC1sZWdhY3ktaWNkcy1vci1sb2FkZXIpCisgICAgICAqIFtMb2FkZXIgVmVyc2lvbiA1IEludGVyZmFjZSBSZXF1aXJlbWVudHNdKCNsb2FkZXItdmVyc2lvbi01LWludGVyZmFjZS1yZXF1aXJlbWVudHMpCisgICAgICAqIFtMb2FkZXIgVmVyc2lvbiA0IEludGVyZmFjZSBSZXF1aXJlbWVudHNdKCNsb2FkZXItdmVyc2lvbi00LWludGVyZmFjZS1yZXF1aXJlbWVudHMpCisgICAgICAqIFtMb2FkZXIgVmVyc2lvbiAzIEludGVyZmFjZSBSZXF1aXJlbWVudHNdKCNsb2FkZXItdmVyc2lvbi0zLWludGVyZmFjZS1yZXF1aXJlbWVudHMpCisgICAgICAqIFtMb2FkZXIgVmVyc2lvbiAyIEludGVyZmFjZSBSZXF1aXJlbWVudHNdKCNsb2FkZXItdmVyc2lvbi0yLWludGVyZmFjZS1yZXF1aXJlbWVudHMpCisgICAgICAqIFtMb2FkZXIgVmVyc2lvbnMgMCBhbmQgMSBJbnRlcmZhY2UgUmVxdWlyZW1lbnRzXSgjbG9hZGVyLXZlcnNpb25zLTAtYW5kLTEtaW50ZXJmYWNlLXJlcXVpcmVtZW50cykKKyAgICAqIFtBbmRyb2lkIElDRCBOZWdvdGlhdGlvbl0oI2FuZHJvaWQtaWNkLW5lZ290aWF0aW9uKQorCisKKyMjIyBJQ0QgRGlzY292ZXJ5CisKK1Z1bGthbiBhbGxvd3MgbXVsdGlwbGUgZHJpdmVycyBlYWNoIHdpdGggb25lIG9yIG1vcmUgZGV2aWNlcyAocmVwcmVzZW50ZWQgYnkgYQorVnVsa2FuIGBWa1BoeXNpY2FsRGV2aWNlYCBvYmplY3QpIHRvIGJlIHVzZWQgY29sbGVjdGl2ZWx5LiBUaGUgbG9hZGVyIGlzCityZXNwb25zaWJsZSBmb3IgZGlzY292ZXJpbmcgYXZhaWxhYmxlIFZ1bGthbiBJQ0RzIG9uIHRoZSBzeXN0ZW0uIEdpdmVuIGEgbGlzdAorb2YgYXZhaWxhYmxlIElDRHMsIHRoZSBsb2FkZXIgY2FuIGVudW1lcmF0ZSBhbGwgdGhlIHBoeXNpY2FsIGRldmljZXMgYXZhaWxhYmxlCitmb3IgYW4gYXBwbGljYXRpb24gYW5kIHJldHVybiB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhlIHByb2Nlc3MKK2luIHdoaWNoIHRoZSBsb2FkZXIgZGlzY292ZXJzIHRoZSBhdmFpbGFibGUgSW5zdGFsbGFibGUgQ2xpZW50IERyaXZlcnMgKElDRHMpCitvbiBhIHN5c3RlbSBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQuIFdpbmRvd3MsIExpbnV4LCBBbmRyb2lkLCBhbmQgbWFjT1MgSUNEIGRpc2NvdmVyeQorZGV0YWlscyBhcmUgbGlzdGVkIGJlbG93LgorCisjIyMjIE92ZXJyaWRpbmcgdGhlIERlZmF1bHQgSUNEIFVzYWdlCisKK1RoZXJlIG1heSBiZSB0aW1lcyB0aGF0IGEgZGV2ZWxvcGVyIHdpc2hlcyB0byBmb3JjZSB0aGUgbG9hZGVyIHRvIHVzZSBhIHNwZWNpZmljIElDRC4KK1RoaXMgY291bGQgYmUgZm9yIG1hbnkgcmVhc29ucyBpbmNsdWRpbmcgIHVzaW5nIGEgYmV0YSBkcml2ZXIsIG9yIGZvcmNpbmcgdGhlIGxvYWRlcgordG8gc2tpcCBhIHByb2JsZW1hdGljIElDRC4gIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcywgdGhlIGxvYWRlciBjYW4gYmUgZm9yY2VkIHRvCitsb29rIGF0IHNwZWNpZmljIElDRHMgd2l0aCB0aGUgYFZLX0lDRF9GSUxFTkFNRVNgIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSW4gb3JkZXIKK3RvIHVzZSB0aGUgc2V0dGluZywgc2ltcGx5IHNldCBpdCB0byBhIHByb3Blcmx5IGRlbGltaXRlZCBsaXN0IG9mIElDRCBNYW5pZmVzdAorZmlsZXMgdGhhdCB5b3Ugd2lzaCB0byB1c2UuICBJbiB0aGlzIGNhc2UsIHBsZWFzZSBwcm92aWRlIHRoZSBnbG9iYWwgcGF0aCB0byB0aGVzZQorZmlsZXMgdG8gcmVkdWNlIGlzc3Vlcy4KKworRm9yIGV4YW1wbGU6CisKKyMjIyMjIE9uIFdpbmRvd3MKKworYGBgCitzZXQgVktfSUNEX0ZJTEVOQU1FUz1cd2luZG93c1xzeXN0ZW0zMlxudi12azY0Lmpzb24KK2BgYAorCitUaGlzIGlzIGFuIGV4YW1wbGUgd2hpY2ggaXMgdXNpbmcgdGhlIGBWS19JQ0RfRklMRU5BTUVTYCBvdmVycmlkZSBvbiBXaW5kb3dzIHRvIHBvaW50Cit0byB0aGUgTnZpZGlhIFZ1bGthbiBkcml2ZXIncyBJQ0QgTWFuaWZlc3QgZmlsZS4KKworIyMjIyMgT24gTGludXgKKworYGBgCitleHBvcnQgVktfSUNEX0ZJTEVOQU1FUz0vaG9tZS91c2VyL2Rldi9tZXNhL3NoYXJlL3Z1bGthbi9pY2QuZC9pbnRlbF9pY2QueDg2XzY0Lmpzb24KK2BgYAorCitUaGlzIGlzIGFuIGV4YW1wbGUgd2hpY2ggaXMgdXNpbmcgdGhlIGBWS19JQ0RfRklMRU5BTUVTYCBvdmVycmlkZSBvbiBMaW51eCB0byBwb2ludAordG8gdGhlIEludGVsIE1lc2EgZHJpdmVyJ3MgSUNEIE1hbmlmZXN0IGZpbGUuCisKKyMjIyMjIE9uIG1hY09TCisKK2BgYAorZXhwb3J0IFZLX0lDRF9GSUxFTkFNRVM9L2hvbWUvdXNlci9Nb2x0ZW5WSy9QYWNrYWdlL0xhdGVzdC9Nb2x0ZW5WSy9tYWNPUy9Nb2x0ZW5WS19pY2QuanNvbgorYGBgCisKK1RoaXMgaXMgYW4gZXhhbXBsZSB3aGljaCBpcyB1c2luZyB0aGUgYFZLX0lDRF9GSUxFTkFNRVNgIG92ZXJyaWRlIG9uIG1hY09TIHRvIHBvaW50Cit0byBhbiBpbnN0YWxsYXRpb24gYW5kIGJ1aWxkIG9mIHRoZSBNb2x0ZW5WSyBHaXRIdWIgcmVwb3NpdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBNb2x0ZW5WSyBJQ0QuCisKKyMjIyMgSUNEIE1hbmlmZXN0IEZpbGUgVXNhZ2UKKworQXMgd2l0aCBsYXllcnMsIG9uIFdpbmRvd3MsIExpbnV4IGFuZCBtYWNPUyBzeXN0ZW1zLCBKU09OLWZvcm1hdHRlZCBtYW5pZmVzdCBmaWxlcyBhcmUKK3VzZWQgdG8gc3RvcmUgSUNEIGluZm9ybWF0aW9uLiAgSW4gb3JkZXIgdG8gZmluZCBzeXN0ZW0taW5zdGFsbGVkIGRyaXZlcnMsIHRoZQorVnVsa2FuIGxvYWRlciB3aWxsIHJlYWQgdGhlIEpTT04gZmlsZXMgdG8gaWRlbnRpZnkgdGhlIG5hbWVzIGFuZCBhdHRyaWJ1dGVzIG9mCitlYWNoIGRyaXZlci4gIE9uZSB0aGluZyB5b3Ugd2lsbCBub3RpY2UgaXMgdGhhdCBJQ0QgTWFuaWZlc3QgZmlsZXMgYXJlIG11Y2gKK3NpbXBsZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBsYXllciBNYW5pZmVzdCBmaWxlcy4KKworU2VlIHRoZSBbQ3VycmVudCBJQ0QgTWFuaWZlc3QgRmlsZSBGb3JtYXRdKCNpY2QtbWFuaWZlc3QtZmlsZS1mb3JtYXQpIHNlY3Rpb24KK2ZvciBtb3JlIGRldGFpbHMuCisKKworIyMjIyBJQ0QgRGlzY292ZXJ5IG9uIFdpbmRvd3MKKworSW4gb3JkZXIgdG8gZmluZCBpbnN0YWxsZWQgSUNEcywgdGhlIGxvYWRlciBzY2FucyB0aHJvdWdoIHJlZ2lzdHJ5IGtleXMgc3BlY2lmaWMgdG8gRGlzcGxheQorQWRhcHRlcnMgYW5kIGFsbCBTb2Z0d2FyZSBDb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBhZGFwdGVycyBmb3IgdGhlCitsb2NhdGlvbnMgb2YgSlNPTiBtYW5pZmVzdCBmaWxlcy4gVGhlc2Uga2V5cyBhcmUgbG9jYXRlZCBpbiBkZXZpY2Uga2V5cworY3JlYXRlZCBkdXJpbmcgZHJpdmVyIGluc3RhbGxhdGlvbiBhbmQgY29udGFpbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCitmb3IgYmFzZSBzZXR0aW5ncywgaW5jbHVkaW5nIE9wZW5HTCBhbmQgRGlyZWN0M0QgSUNEIGxvY2F0aW9uLgorCitUaGUgRGV2aWNlIEFkYXB0ZXIgYW5kIFNvZnR3YXJlIENvbXBvbmVudCBrZXkgcGF0aHMgc2hvdWxkIGJlIG9idGFpbmVkIHRocm91Z2ggdGhlIFBuUAorQ29uZmlndXJhdGlvbiBNYW5hZ2VyIEFQSS4gVGhlIGAwMDBYYCBrZXkgd2lsbCBiZSBhIG51bWJlcmVkIGtleSwgd2hlcmUgZWFjaAorZGV2aWNlIGlzIGFzc2lnbmVkIGEgZGlmZmVyZW50IG51bWJlci4KKworYGBgCisgICBIS0VZX0xPQ0FMX01BQ0hJTkVcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcQ2xhc3Nce0FkYXB0ZXIgR1VJRH1cMDAwWFxWdWxrYW5Ecml2ZXJOYW1lCisgICBIS0VZX0xPQ0FMX01BQ0hJTkVcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcQ2xhc3Nce1NvZnR3YXJlQ29tcG9uZW50IEdVSUR9XDAwMFhcVnVsa2FuRHJpdmVyTmFtZQorYGBgCisKK0luIGFkZGl0aW9uLCBvbiA2NC1iaXQgc3lzdGVtcyB0aGVyZSBtYXkgYmUgYW5vdGhlciBzZXQgb2YgcmVnaXN0cnkgdmFsdWVzLCBsaXN0ZWQKK2JlbG93LiBUaGVzZSB2YWx1ZXMgcmVjb3JkIHRoZSBsb2NhdGlvbnMgb2YgMzItYml0IGxheWVycyBvbiA2NC1iaXQgb3BlcmF0aW5nIHN5c3RlbXMsCitpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIFdpbmRvd3Mtb24tV2luZG93cyBmdW5jdGlvbmFsaXR5LgorCitgYGAKKyAgIEhLRVlfTE9DQUxfTUFDSElORVxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxDbGFzc1x7QWRhcHRlciBHVUlEfVwwMDBYXFZ1bGthbkRyaXZlck5hbWVXb3cKKyAgIEhLRVlfTE9DQUxfTUFDSElORVxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxDbGFzc1x7U29mdHdhcmVDb21wb25lbnQgR1VJRH1cMDAwWFxWdWxrYW5Ecml2ZXJOYW1lV293CitgYGAKKworSWYgYW55IG9mIHRoZSBhYm92ZSB2YWx1ZXMgZXhpc3QgYW5kIGlzIG9mIHR5cGUgYFJFR19TWmAsIHRoZSBsb2FkZXIgd2lsbCBvcGVuIHRoZSBKU09OCittYW5pZmVzdCBmaWxlIHNwZWNpZmllZCBieSB0aGUga2V5IHZhbHVlLiBFYWNoIHZhbHVlIG11c3QgYmUgYSBmdWxsIGFic29sdXRlCitwYXRoIHRvIGEgSlNPTiBtYW5pZmVzdCBmaWxlLiBUaGUgdmFsdWVzIG1heSBhbHNvIGJlIG9mIHR5cGUgYFJFR19NVUxUSV9TWmAsIGluCit3aGljaCBjYXNlIHRoZSB2YWx1ZSB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgbGlzdCBvZiBwYXRocyB0byBKU09OIG1hbmlmZXN0IGZpbGVzLgorCitBZGRpdGlvbmFsbHksIHRoZSBWdWxrYW4gbG9hZGVyIHdpbGwgc2NhbiB0aGUgdmFsdWVzIGluIHRoZSBmb2xsb3dpbmcgV2luZG93cyByZWdpc3RyeSBrZXk6CisKK2BgYAorICAgSEtFWV9MT0NBTF9NQUNISU5FXFNPRlRXQVJFXEtocm9ub3NcVnVsa2FuXERyaXZlcnMKK2BgYAorCitGb3IgMzItYml0IGFwcGxpY2F0aW9ucyBvbiA2NC1iaXQgV2luZG93cywgdGhlIGxvYWRlciBzY2FuJ3MgdGhlIDMyLWJpdAorcmVnaXN0cnkgbG9jYXRpb246CisKK2BgYAorICAgSEtFWV9MT0NBTF9NQUNISU5FXFNPRlRXQVJFXFdPVzY0MzJOb2RlXEtocm9ub3NcVnVsa2FuXERyaXZlcnMKK2BgYAorCitFdmVyeSBJQ0QgaW4gdGhlc2UgbG9jYXRpb25zIHNob3VsZCBiZSBnaXZlbiBhcyBhIERXT1JELCB3aXRoIHZhbHVlIDAsIHdoZXJlCit0aGUgbmFtZSBvZiB0aGUgdmFsdWUgaXMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTT04gbWFuaWZlc3QgZmlsZS4gVGhlIFZ1bGthbiBsb2FkZXIKK3dpbGwgYXR0ZW1wdCB0byBvcGVuIGVhY2ggbWFuaWZlc3QgZmlsZSB0byBvYnRhaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IGFuIElDRCdzCitzaGFyZWQgbGlicmFyeSAoIi5kbGwiKSBmaWxlLgorCitGb3IgZXhhbXBsZSwgbGV0IHVzIGFzc3VtZSB0aGUgcmVnaXN0cnkgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkYXRhOgorCitgYGAKK1tIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcS2hyb25vc1xWdWxrYW5cRHJpdmVyc1xdCisKKyJDOlx2ZW5kb3IgYVx2a192ZW5kb3JhLmpzb24iPWR3b3JkOjAwMDAwMDAwCisiQzpcd2luZG93c1xzeXN0ZW0zMlx2ZW5kb3JiX3ZrLmpzb24iPWR3b3JkOjAwMDAwMDAxCisiQzpcd2luZG93c1xzeXN0ZW0zMlx2ZW5kb3JjX2ljZC5qc29uIj1kd29yZDowMDAwMDAwMAorYGBgCisKK0luIHRoaXMgY2FzZSwgdGhlIGxvYWRlciB3aWxsIHN0ZXAgdGhyb3VnaCBlYWNoIGVudHJ5LCBhbmQgY2hlY2sgdGhlIHZhbHVlLiAgSWYKK3RoZSB2YWx1ZSBpcyAwLCB0aGVuIHRoZSBsb2FkZXIgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIGZpbGUuICBJbiB0aGlzIGNhc2UsCit0aGUgbG9hZGVyIHdpbGwgb3BlbiB0aGUgZmlyc3QgYW5kIGxhc3QgbGlzdGluZ3MsIGJ1dCBub3QgdGhlIG1pZGRsZS4gIFRoaXMKK2lzIGJlY2F1c2UgdGhlIHZhbHVlIG9mIDEgZm9yIHZlbmRvcmJfdmsuanNvbiBkaXNhYmxlcyB0aGUgZHJpdmVyLgorCitUaGUgVnVsa2FuIGxvYWRlciB3aWxsIG9wZW4gZWFjaCBlbmFibGVkIG1hbmlmZXN0IGZpbGUgZm91bmQgdG8gb2J0YWluIHRoZSBuYW1lCitvciBwYXRobmFtZSBvZiBhbiBJQ0Qgc2hhcmVkIGxpYnJhcnkgKCIuRExMIikgZmlsZS4KKworSUNEcyBzaG91bGQgdXNlIHRoZSByZWdpc3RyeSBsb2NhdGlvbnMgZnJvbSB0aGUgUG5QIENvbmZpZ3VyYXRpb24gTWFuYWdlciB3aGVyZXZlcgorcHJhY3RpY2FsLiBUaGF0IGxvY2F0aW9uIGNsZWFybHkgdGllcyB0aGUgSUNEIHRvIGEgZ2l2ZW4gZGV2aWNlLiBUaGUKK2BTT0ZUV0FSRVxLaHJvbm9zXFZ1bGthblxEcml2ZXJzYCBsb2NhdGlvbiBpcyB0aGUgb2xkZXIgbWV0aG9kIGZvciBsb2NhdGluZyBJQ0RzLAorYW5kIGlzIHJldGFpbmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitTZWUgdGhlIFtJQ0QgTWFuaWZlc3QgRmlsZSBGb3JtYXRdKCNpY2QtbWFuaWZlc3QtZmlsZS1mb3JtYXQpIHNlY3Rpb24gZm9yIG1vcmUKK2RldGFpbHMuCisKKworIyMjIyBJQ0QgRGlzY292ZXJ5IG9uIExpbnV4CisKK0luIG9yZGVyIHRvIGZpbmQgaW5zdGFsbGVkIElDRHMsIHRoZSBWdWxrYW4gbG9hZGVyIHdpbGwgc2NhbiB0aGUgZmlsZXMKK2luIHRoZSBmb2xsb3dpbmcgTGludXggZGlyZWN0b3JpZXM6CisKK2BgYAorICAgIC91c3IvbG9jYWwvZXRjL3Z1bGthbi9pY2QuZAorICAgIC91c3IvbG9jYWwvc2hhcmUvdnVsa2FuL2ljZC5kCisgICAgL2V0Yy92dWxrYW4vaWNkLmQKKyAgICAvdXNyL3NoYXJlL3Z1bGthbi9pY2QuZAorICAgICRIT01FLy5sb2NhbC9zaGFyZS92dWxrYW4vaWNkLmQKK2BgYAorCitUaGUgIi91c3IvbG9jYWwvKiIgZGlyZWN0b3JpZXMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYmUgb3RoZXIgZGlyZWN0b3JpZXMgYXQKK2J1aWxkIHRpbWUuCisKK1RoZSB0eXBpY2FsIHVzYWdlIG9mIHRoZSBkaXJlY3RvcmllcyBpcyBpbmRpY2F0ZWQgaW4gdGhlIHRhYmxlIGJlbG93LgorCit8IExvY2F0aW9uICB8ICBEZXRhaWxzIHwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgJEhPTUUvLmxvY2FsL3NoYXJlL3Z1bGthbi9pY2QuZCB8ICRIT01FIGlzIHRoZSBjdXJyZW50IGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvbidzIHVzZXIgaWQ7IHRoaXMgcGF0aCB3aWxsIGJlIGlnbm9yZWQgZm9yIHN1aWQgcHJvZ3JhbXMgfAorfCAiL3Vzci9sb2NhbC9ldGMvdnVsa2FuL2ljZC5kIiB8IERpcmVjdG9yeSBmb3IgbG9jYWxseSBidWlsdCBJQ0RzIHwKK3wgIi91c3IvbG9jYWwvc2hhcmUvdnVsa2FuL2ljZC5kIiB8IERpcmVjdG9yeSBmb3IgbG9jYWxseSBidWlsdCBJQ0RzIHwKK3wgIi9ldGMvdnVsa2FuL2ljZC5kIiB8IExvY2F0aW9uIG9mIElDRHMgaW5zdGFsbGVkIGZyb20gbm9uLUxpbnV4LWRpc3RyaWJ1dGlvbi1wcm92aWRlZCBwYWNrYWdlcyB8Cit8ICIvdXNyL3NoYXJlL3Z1bGthbi9pY2QuZCIgfCBMb2NhdGlvbiBvZiBJQ0RzIGluc3RhbGxlZCBmcm9tIExpbnV4LWRpc3RyaWJ1dGlvbi1wcm92aWRlZCBwYWNrYWdlcyB8CisKK1RoZSBWdWxrYW4gbG9hZGVyIHdpbGwgb3BlbiBlYWNoIG1hbmlmZXN0IGZpbGUgZm91bmQgdG8gb2J0YWluIHRoZSBuYW1lIG9yCitwYXRobmFtZSBvZiBhbiBJQ0Qgc2hhcmVkIGxpYnJhcnkgKCIuc28iKSBmaWxlLgorCitTZWUgdGhlIFtJQ0QgTWFuaWZlc3QgRmlsZSBGb3JtYXRdKCNpY2QtbWFuaWZlc3QtZmlsZS1mb3JtYXQpIHNlY3Rpb24gZm9yIG1vcmUKK2RldGFpbHMuCisKKyMjIyMgSUNEIERpc2NvdmVyeSBvbiBtYWNPUworCitJbiBvcmRlciB0byBmaW5kIGluc3RhbGxlZCBJQ0RzLCB0aGUgVnVsa2FuIGxvYWRlciB3aWxsIHNjYW4gdGhlIGZpbGVzCitpbiB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzOgorCitgYGAKKyAgICA8YnVuZGxlPi9Db250ZW50cy9SZXNvdXJjZXMvdnVsa2FuL2ljZC5kCisgICAgL2V0Yy92dWxrYW4vaWNkLmQKKyAgICAvdXNyL2xvY2FsL3NoYXJlL3Z1bGthbi9pY2QuZAorICAgIC91c3Ivc2hhcmUvdnVsa2FuL2ljZC5kCisgICAgJEhPTUUvLmxvY2FsL3NoYXJlL3Z1bGthbi9pY2QuZAorYGBgCisKK1RoZSAiL3Vzci9sb2NhbC8qIiBkaXJlY3RvcmllcyBjYW4gYmUgY29uZmlndXJlZCB0byBiZSBvdGhlciBkaXJlY3RvcmllcyBhdAorYnVpbGQgdGltZS4KKworVGhlIHR5cGljYWwgdXNhZ2Ugb2YgdGhlIGRpcmVjdG9yaWVzIGlzIGluZGljYXRlZCBpbiB0aGUgdGFibGUgYmVsb3cuCisKK3wgTG9jYXRpb24gIHwgIERldGFpbHMgfAorfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAmbHQ7YnVuZGxlJmd0Oy9Db250ZW50cy9SZXNvdXJjZXMvdnVsa2FuL2ljZC5kIHwgRGlyZWN0b3J5IGZvciBJQ0RzIHRoYXQgYXJlIGJ1bmRsZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gKHNlYXJjaGVkIGZpcnN0KSB8Cit8ICIvZXRjL3Z1bGthbi9pY2QuZCIgfCBMb2NhdGlvbiBvZiBJQ0RzIGluc3RhbGxlZCBtYW51YWxseSB8Cit8ICIvdXNyL2xvY2FsL3NoYXJlL3Z1bGthbi9pY2QuZCIgfCBEaXJlY3RvcnkgZm9yIGxvY2FsbHkgYnVpbHQgSUNEcyB8Cit8ICIvdXNyL3NoYXJlL3Z1bGthbi9pY2QuZCIgfCBMb2NhdGlvbiBvZiBJQ0RzIGluc3RhbGxlZCBmcm9tIHBhY2thZ2VzIHwKK3wgJEhPTUUvLmxvY2FsL3NoYXJlL3Z1bGthbi9pY2QuZCB8ICRIT01FIGlzIHRoZSBjdXJyZW50IGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvbidzIHVzZXIgaWQ7IHRoaXMgcGF0aCB3aWxsIGJlIGlnbm9yZWQgZm9yIHN1aWQgcHJvZ3JhbXMgfAorCitUaGUgVnVsa2FuIGxvYWRlciB3aWxsIG9wZW4gZWFjaCBtYW5pZmVzdCBmaWxlIGZvdW5kIHRvIG9idGFpbiB0aGUgbmFtZSBvcgorcGF0aG5hbWUgb2YgYW4gSUNEIHNoYXJlZCBsaWJyYXJ5ICgiLmR5bGliIikgZmlsZS4KKworU2VlIHRoZSBbSUNEIE1hbmlmZXN0IEZpbGUgRm9ybWF0XSgjaWNkLW1hbmlmZXN0LWZpbGUtZm9ybWF0KSBzZWN0aW9uIGZvciBtb3JlCitkZXRhaWxzLgorCisjIyMjIyBBZGRpdGlvbmFsIFNldHRpbmdzIEZvciBJQ0QgRGVidWdnaW5nCisKK0lmIHlvdSBhcmUgc2VlaW5nIGlzc3VlcyB3aGljaCBtYXkgYmUgcmVsYXRlZCB0byB0aGUgSUNELCBhIHBvc3NpYmxlIG9wdGlvbiB0byBkZWJ1ZyBpcyB0byBlbmFibGUgdGhlCitgTERfQklORF9OT1dgIGVudmlyb25tZW50IHZhcmlhYmxlLiAgVGhpcyBmb3JjZXMgZXZlcnkgZHluYW1pYyBsaWJyYXJ5J3Mgc3ltYm9scyB0byBiZSBmdWxseSByZXNvbHZlZCBvbiBsb2FkLiAgSWYKK3RoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGFuIElDRCBtaXNzaW5nIHN5bWJvbHMgb24geW91ciBzeXN0ZW0sIHRoaXMgd2lsbCBleHBvc2UgaXQgYW5kIGNhdXNlIHRoZSBWdWxrYW4gbG9hZGVyCit0byBmYWlsIG9uIGxvYWRpbmcgdGhlIElDRC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGVuYWJsZSBgTERfQklORF9OT1dgIGFsb25nIHdpdGggYFZLX0xPQURFUl9ERUJVRz13YXJuYAordG8gZXhwb3NlIGFueSBpc3N1ZXMuCisKKyMjIyMgVXNpbmcgUHJlLVByb2R1Y3Rpb24gSUNEcyBvbiBXaW5kb3dzLCBMaW51eCBhbmQgbWFjT1MKKworSW5kZXBlbmRlbnQgSGFyZHdhcmUgVmVuZG9yIChJSFYpIHByZS1wcm9kdWN0aW9uIElDRHMuIEluIHNvbWUgY2FzZXMsIGEKK3ByZS1wcm9kdWN0aW9uIElDRCBtYXkgYmUgaW4gYW4gaW5zdGFsbGFibGUgcGFja2FnZS4gSW4gb3RoZXIgY2FzZXMsIGEKK3ByZS1wcm9kdWN0aW9uIElDRCBtYXkgc2ltcGx5IGJlIGEgc2hhcmVkIGxpYnJhcnkgaW4gdGhlIGRldmVsb3BlcidzIGJ1aWxkIHRyZWUuCitJbiB0aGlzIGxhdHRlciBjYXNlLCB3ZSB3YW50IHRvIGFsbG93IGRldmVsb3BlcnMgdG8gcG9pbnQgdG8gc3VjaCBhbiBJQ0Qgd2l0aG91dAorbW9kaWZ5aW5nIHRoZSBzeXN0ZW0taW5zdGFsbGVkIElDRChzKSBvbiB0aGVpciBzeXN0ZW0uCisKK1RoaXMgbmVlZCBpcyBtZXQgd2l0aCB0aGUgdXNlIG9mIHRoZSAiVktcX0lDRFxfRklMRU5BTUVTIiBlbnZpcm9ubWVudCB2YXJpYWJsZSwKK3doaWNoIHdpbGwgb3ZlcnJpZGUgdGhlIG1lY2hhbmlzbSB1c2VkIGZvciBmaW5kaW5nIHN5c3RlbS1pbnN0YWxsZWQgSUNEcy4gSW4KK290aGVyIHdvcmRzLCBvbmx5IHRoZSBJQ0RzIGxpc3RlZCBpbiAiVktcX0lDRFxfRklMRU5BTUVTIiB3aWxsIGJlIHVzZWQuCisKK1RoZSAiVktcX0lDRFxfRklMRU5BTUVTIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhIGxpc3Qgb2YgSUNECittYW5pZmVzdCBmaWxlcywgY29udGFpbmluZyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBJQ0QgSlNPTiBNYW5pZmVzdCBmaWxlLiAgVGhpcworbGlzdCBpcyBjb2xvbi1zZXBhcmF0ZWQgb24gTGludXggYW5kIG1hY09TLCBhbmQgc2VtaS1jb2xvbi1zZXBhcmF0ZWQgb24gV2luZG93cy4KKworVHlwaWNhbGx5LCAiVktcX0lDRFxfRklMRU5BTUVTIiB3aWxsIG9ubHkgY29udGFpbiBhIGZ1bGwgcGF0aG5hbWUgdG8gb25lIGluZm8KK2ZpbGUgZm9yIGEgZGV2ZWxvcGVyLWJ1aWx0IElDRC4gQSBzZXBhcmF0b3IgKGNvbG9uIG9yIHNlbWktY29sb24pIGlzIG9ubHkgdXNlZAoraWYgbW9yZSB0aGFuIG9uZSBJQ0QgaXMgbGlzdGVkLgorCisqKk5PVEU6KiogT24gTGludXggYW5kIG1hY09TLCB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIHdpbGwgYmUgaWdub3JlZCBmb3Igc3VpZCBwcm9ncmFtcy4KKworCisjIyMjIElDRCBEaXNjb3Zlcnkgb24gQW5kcm9pZAorCitUaGUgQW5kcm9pZCBsb2FkZXIgbGl2ZXMgaW4gdGhlIHN5c3RlbSBsaWJyYXJ5IGZvbGRlci4gVGhlIGxvY2F0aW9uIGNhbm5vdCBiZQorY2hhbmdlZC4gVGhlIGxvYWRlciB3aWxsIGxvYWQgdGhlIGRyaXZlci9JQ0QgdmlhIGBod19nZXRfbW9kdWxlYCB3aXRoIHRoZSBJRAorb2YgInZ1bGthbiIuICoqRHVlIHRvIHNlY3VyaXR5IHBvbGljaWVzIGluIEFuZHJvaWQsIG5vbmUgb2YgdGhpcyBjYW4gYmUgbW9kaWZpZWQKK3VuZGVyIG5vcm1hbCB1c2UuKioKKworCisjIyMgSUNEIE1hbmlmZXN0IEZpbGUgRm9ybWF0CisKK1RoZSBmb2xsb3dpbmcgc2VjdGlvbiBkaXNjdXNzZXMgdGhlIGRldGFpbHMgb2YgdGhlIElDRCBNYW5pZmVzdCBKU09OIGZpbGUKK2Zvcm1hdC4gIFRoZSBKU09OIGZpbGUgaXRzZWxmIGRvZXMgbm90IGhhdmUgYW55IHJlcXVpcmVtZW50cyBmb3IgbmFtaW5nLiAgVGhlCitvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIGV4dGVuc2lvbiBzdWZmaXggb2YgdGhlIGZpbGUgaXMgIi5qc29uIi4KKworSGVyZSBpcyBhbiBleGFtcGxlIElDRCBKU09OIE1hbmlmZXN0IGZpbGU6CisKK2BgYAoreworICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iOiAiMS4wLjAiLAorICAgIklDRCI6IHsKKyAgICAgICJsaWJyYXJ5X3BhdGgiOiAicGF0aCB0byBJQ0QgbGlicmFyeSIsCisgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjUiCisgICB9Cit9CitgYGAKKworfCBGaWVsZCBOYW1lIHwgRmllbGQgVmFsdWUgfAorfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8ICJmaWxlXF9mb3JtYXRcX3ZlcnNpb24iIHwgVGhlIEpTT04gZm9ybWF0IG1ham9yLm1pbm9yLnBhdGNoIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZmlsZS4gIEN1cnJlbnRseSBzdXBwb3J0ZWQgdmVyc2lvbiBpcyAxLjAuMC4gfAorfCAiSUNEIiB8IFRoZSBpZGVudGlmaWVyIHVzZWQgdG8gZ3JvdXAgYWxsIElDRCBpbmZvcm1hdGlvbiB0b2dldGhlci4gfAorfCAibGlicmFyeV9wYXRoIiB8IFRoZSAibGlicmFyeVxfcGF0aCIgc3BlY2lmaWVzIGVpdGhlciBhIGZpbGVuYW1lLCBhIHJlbGF0aXZlIHBhdGhuYW1lLCBvciBhIGZ1bGwgcGF0aG5hbWUgdG8gYW4gSUNEIHNoYXJlZCBsaWJyYXJ5IGZpbGUuICBJZiAibGlicmFyeVxfcGF0aCIgc3BlY2lmaWVzIGEgcmVsYXRpdmUgcGF0aG5hbWUsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBwYXRoIG9mIHRoZSBKU09OIG1hbmlmZXN0IGZpbGUuICBJZiAibGlicmFyeVxfcGF0aCIgc3BlY2lmaWVzIGEgZmlsZW5hbWUsIHRoZSBsaWJyYXJ5IG11c3QgbGl2ZSBpbiB0aGUgc3lzdGVtJ3Mgc2hhcmVkIG9iamVjdCBzZWFyY2ggcGF0aC4gVGhlcmUgYXJlIG5vIHJ1bGVzIGFib3V0IHRoZSBuYW1lIG9mIHRoZSBJQ0Qgc2hhcmVkIGxpYnJhcnkgZmlsZXMgb3RoZXIgdGhhbiBpdCBzaG91bGQgZW5kIHdpdGggdGhlIGFwcHJvcHJpYXRlIHN1ZmZpeCAoIi5ETEwiIG9uIFdpbmRvd3MsICIuc28iIG9uIExpbnV4IGFuZCAiLmR5bGliIiBvbiBtYWNPUykuIHwgTi9BIHwKK3wgImFwaV92ZXJzaW9uIiB8IFRoZSBtYWpvci5taW5vci5wYXRjaCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgVnVsa2FuIEFQSSB0aGF0IHRoZSBzaGFyZWQgbGlicmFyeSBmaWxlcyBmb3IgdGhlIElDRCB3YXMgYnVpbHQgYWdhaW5zdC4gRm9yIGV4YW1wbGU6IDEuMC4zMy4gfAorCisqKk5PVEU6KiogSWYgdGhlIHNhbWUgSUNEIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnRzIG11bHRpcGxlLCBpbmNvbXBhdGlibGUKK3ZlcnNpb25zIG9mIHRleHQgbWFuaWZlc3QgZmlsZSBmb3JtYXQgdmVyc2lvbnMsIGl0IG11c3QgaGF2ZSBzZXBhcmF0ZQorSlNPTiBmaWxlcyBmb3IgZWFjaCAoYWxsIG9mIHdoaWNoIG1heSBwb2ludCB0byB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeSkuCisKKyMjIyMjIElDRCBNYW5pZmVzdCBGaWxlIFZlcnNpb25zCisKK1RoZXJlIGhhcyBvbmx5IGJlZW4gb25lIHZlcnNpb24gb2YgdGhlIElDRCBtYW5pZmVzdCBmaWxlcyBzdXBwb3J0ZWQuICBUaGlzIGlzCit2ZXJzaW9uIDEuMC4wLgorCisjIyMjIyMgSUNEIE1hbmlmZXN0IEZpbGUgVmVyc2lvbiAxLjAuMAorCitUaGUgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoZSBJQ0QgTWFuaWZlc3QgZmlsZSBzcGVjaWZpZWQgdGhlIGJhc2ljIGZvcm1hdCBhbmQKK2ZpZWxkcyBvZiBhIGxheWVyIEpTT04gZmlsZS4gIFRoZSBmaWVsZHMgb2YgdGhlIDEuMC4wIGZpbGUgZm9ybWF0IGluY2x1ZGU6CisgKiAiZmlsZVxfZm9ybWF0XF92ZXJzaW9uIgorICogIklDRCIKKyAqICJsaWJyYXJ5XF9wYXRoIgorICogImFwaVxfdmVyc2lvbiIKKworIAorIyMjICBJQ0QgVnVsa2FuIEVudHJ5IFBvaW50IERpc2NvdmVyeQorCitUaGUgVnVsa2FuIHN5bWJvbHMgZXhwb3J0ZWQgYnkgYW4gSUNEIG11c3Qgbm90IGNsYXNoIHdpdGggdGhlIGxvYWRlcidzIGV4cG9ydGVkCitWdWxrYW4gc3ltYm9scy4gIFRoaXMgY291bGQgYmUgZm9yIHNldmVyYWwgcmVhc29ucy4gIEJlY2F1c2Ugb2YgdGhpcywgYWxsIElDRHMKK211c3QgZXhwb3J0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIGZvciBkaXNjb3Zlcnkgb2YgSUNEIFZ1bGthbgorZW50cnkgcG9pbnRzLiAgVGhpcyBlbnRyeSBwb2ludCBpcyBub3QgYSBwYXJ0IG9mIHRoZSBWdWxrYW4gQVBJIGl0c2VsZiwgb25seSBhCitwcml2YXRlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBsb2FkZXIgYW5kIElDRHMgZm9yIHZlcnNpb24gMSBhbmQgaGlnaGVyCitpbnRlcmZhY2VzLgorCitgYGBjcHAKK1ZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtfaWNkR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcE5hbWUpOworYGBgCisKK1RoaXMgZnVuY3Rpb24gaGFzIHZlcnkgc2ltaWxhciBzZW1hbnRpY3MgdG8gYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAuCitgdmtfaWNkR2V0SW5zdGFuY2VQcm9jQWRkcmAgcmV0dXJucyB2YWxpZCBmdW5jdGlvbiBwb2ludGVycyBmb3IgYWxsIHRoZSAKK2dsb2JhbC1sZXZlbCBhbmQgaW5zdGFuY2UtbGV2ZWwgVnVsa2FuIGZ1bmN0aW9ucywgYW5kIGFsc28gZm9yIGB2a0dldERldmljZVByb2NBZGRyYC4KK0dsb2JhbC1sZXZlbCBmdW5jdGlvbnMgYXJlIHRob3NlIHdoaWNoIGNvbnRhaW4gbm8gZGlzcGF0Y2hhYmxlIG9iamVjdCBhcyB0aGUKK2ZpcnN0IHBhcmFtZXRlciwgc3VjaCBhcyBgdmtDcmVhdGVJbnN0YW5jZWAgYW5kCitgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNgLiBUaGUgSUNEIG11c3Qgc3VwcG9ydCBxdWVyeWluZyAKK2dsb2JhbC1sZXZlbCBlbnRyeSBwb2ludHMgYnkgY2FsbGluZyBgdmtfaWNkR2V0SW5zdGFuY2VQcm9jQWRkcmAgd2l0aCBhIE5VTEwKK2BWa0luc3RhbmNlYCBwYXJhbWV0ZXIuIEluc3RhbmNlLWxldmVsIGZ1bmN0aW9ucyBhcmUgdGhvc2UgdGhhdCBoYXZlIGVpdGhlcgorYFZrSW5zdGFuY2VgLCBvciBgVmtQaHlzaWNhbERldmljZWAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBkaXNwYXRjaGFibGUgb2JqZWN0LgorQm90aCBjb3JlIGVudHJ5IHBvaW50cyBhbmQgYW55IGluc3RhbmNlIGV4dGVuc2lvbiBlbnRyeSBwb2ludHMgdGhlIElDRCBzdXBwb3J0cworc2hvdWxkIGJlIGF2YWlsYWJsZSB2aWEgYHZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHJgLiBGdXR1cmUgVnVsa2FuIGluc3RhbmNlCitleHRlbnNpb25zIG1heSBkZWZpbmUgYW5kIHVzZSBuZXcgaW5zdGFuY2UtbGV2ZWwgZGlzcGF0Y2hhYmxlIG9iamVjdHMgb3RoZXIKK3RoYW4gYFZrSW5zdGFuY2VgIGFuZCBgVmtQaHlzaWNhbERldmljZWAsIGluIHdoaWNoIGNhc2UgZXh0ZW5zaW9uIGVudHJ5IHBvaW50cwordXNpbmcgdGhlc2UgbmV3bHkgZGVmaW5lZCBkaXNwYXRjaGFibGUgb2JqZWN0cyBtdXN0IGJlIHF1ZXJ5YWJsZSB2aWEKK2B2a19pY2RHZXRJbnN0YW5jZVByb2NBZGRyYC4KKworQWxsIG90aGVyIFZ1bGthbiBlbnRyeSBwb2ludHMgbXVzdCBlaXRoZXI6CisgKiBOT1QgYmUgZXhwb3J0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgSUNEIGxpYnJhcnkKKyAqIG9yIE5PVCB1c2UgdGhlIG9mZmljaWFsIFZ1bGthbiBmdW5jdGlvbiBuYW1lcyBpZiB0aGV5IGFyZSBleHBvcnRlZAorIAorVGhpcyByZXF1aXJlbWVudCBpcyBmb3IgSUNEIGxpYnJhcmllcyB0aGF0IGluY2x1ZGUgb3RoZXIKK2Z1bmN0aW9uYWxpdHkgKHN1Y2ggYXMgT3BlbkdMKSBhbmQgdGh1cyBjb3VsZCBiZSBsb2FkZWQgYnkgdGhlCithcHBsaWNhdGlvbiBwcmlvciB0byB3aGVuIHRoZSBWdWxrYW4gbG9hZGVyIGxpYnJhcnkgaXMgbG9hZGVkIGJ5IHRoZQorYXBwbGljYXRpb24uCisKK0Jld2FyZSBvZiBpbnRlcnBvc2luZyBieSBkeW5hbWljIE9TIGxpYnJhcnkgbG9hZGVycyBpZiB0aGUgb2ZmaWNpYWwgVnVsa2FuCituYW1lcyBhcmUgdXNlZC4gT24gTGludXgsIGlmIG9mZmljaWFsIG5hbWVzIGFyZSB1c2VkLCB0aGUgSUNEIGxpYnJhcnkgbXVzdCBiZQorbGlua2VkIHdpdGggYC1Cc3ltYm9saWNgLgorCisKKyMjIyBJQ0QgQVBJIFZlcnNpb24KK1doZW4gYW4gYXBwbGljYXRpb24gY2FsbHMgYHZrQ3JlYXRlSW5zdGFuY2VgLCBpdCBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIGEKK2BWa0FwcGxpY2F0aW9uSW5mb2Agc3RydWN0LCB3aGljaCBpbmNsdWRlcyBhbiBgYXBpVmVyc2lvbmAgZmllbGQuIEEgVnVsa2FuIDEuMAorSUNEIHdhcyByZXF1aXJlZCB0byByZXR1cm4gYFZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVJgIGlmIGl0IGRpZCBub3QKK3N1cHBvcnQgdGhlIEFQSSB2ZXJzaW9uIHRoYXQgdGhlIHVzZXIgcGFzc2VkLiBCZWdpbm5pbmcgd2l0aCBWdWxrYW4gMS4xLCBJQ0RzCithcmUgbm90IGFsbG93ZWQgdG8gcmV0dXJuIHRoaXMgZXJyb3IgZm9yIGFueSB2YWx1ZSBvZiBgYXBpVmVyc2lvbmAuIFRoaXMKK2NyZWF0ZXMgYSBwcm9ibGVtIHdoZW4gd29ya2luZyB3aXRoIG11bHRpcGxlIElDRHMsIHdoZXJlIG9uZSBpcyBhIDEuMCBJQ0QgYW5kCithbm90aGVyIGlzIG5ld2VyLgorCitBIGxvYWRlciB0aGF0IGlzIG5ld2VyIHRoYW4gMS4wIHdpbGwgYWx3YXlzIGdpdmUgdGhlIHZlcnNpb24gaXQgc3VwcG9ydHMgd2hlbgordGhlIGFwcGxpY2F0aW9uIGNhbGxzIGB2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbmAsIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSQordmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIElDRHMgb24gdGhlIHN5c3RlbS4gVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlCithcHBsaWNhdGlvbiBjYWxscyBgdmtDcmVhdGVJbnN0YW5jZWAsIHRoZSBsb2FkZXIgd2lsbCBiZSBmb3JjZWQgdG8gcGFzcyBhIGNvcHkKK29mIHRoZSBgVmtBcHBsaWNhdGlvbkluZm9gIHN0cnVjdCB3aGVyZSBgYXBpVmVyc2lvbmAgaXMgMS4wIHRvIGFueSAxLjAgZHJpdmVycworaW4gb3JkZXIgdG8gcHJldmVudCBhbiBlcnJvci4gVG8gZGV0ZXJtaW5lIGlmIHRoaXMgbXVzdCBiZSBkb25lLCB0aGUgbG9hZGVyCit3aWxsIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwczoKKworMS4gQ2hlY2sgdGhlIElDRCdzIEpTT04gbWFuaWZlc3QgZmlsZSBmb3IgdGhlICJhcGlfdmVyc2lvbiIgZmllbGQuCisyLiBJZiB0aGUgSlNPTiB2ZXJzaW9uIGlzIGdyZWF0ZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuMSwgTG9hZCB0aGUgSUNEJ3MgZHluYW1pYyBsaWJyYXJ5CiszLiBDYWxsIHRoZSBJQ0QncyBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYCBjb21tYW5kIHRvIGdldCBhIHBvaW50ZXIgdG8KK2B2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbmAKKzQuIElmIHRoZSBwb2ludGVyIHRvIGB2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbmAgaXMgbm90IGBOVUxMYCwgaXQgd2lsbCBiZQorY2FsbGVkIHRvIGdldCB0aGUgSUNEJ3Mgc3VwcG9ydGVkIEFQSSB2ZXJzaW9uCisKK1RoZSBJQ0Qgd2lsbCBiZSB0cmVhdGVkIGFzIGEgMS4wIElDRCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKy0gVGhlIEpTT04gbWFuaWZlc3QncyAiYXBpX3ZlcnNpb24iIGZpZWxkIGlzIGxlc3MgdGhhdCB2ZXJzaW9uIDEuMQorLSBUaGUgZnVuY3Rpb24gcG9pbnRlciB0byBgdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb25gIGlzIGBOVUxMYAorLSBUaGUgdmVyc2lvbiByZXR1cm5lZCBieSBgdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb25gIGlzIGxlc3MgdGhhbiAxLjEKKy0gYHZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uYCByZXR1cm5zIGFueXRoaW5nIG90aGVyIHRoYW4gYFZLX1NVQ0NFU1NgCisKK0lmIHRoZSBJQ0Qgb25seSBzdXBwb3J0cyBWdWxrYW4gMS4wLCB0aGUgbG9hZGVyIHdpbGwgZW5zdXJlIHRoYXQgYW55CitgVmtBcHBsaWNhdGlvbkluZm9gIHN0cnVjdCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgSUNEIHdpbGwgaGF2ZSBhbiBgYXBpVmVyc2lvbmAKK2ZpZWxkIHNldCB0byBWdWxrYW4gMS4wLiBPdGhlcndpc2UsIHRoZSBsb2FkZXIgd2lsbCBwYXNzIHRoZSBzdHJ1Y3QgdG8gdGhlIElDRAord2l0aG91dCBhbnkgY2hhbmdlcy4KKworCisjIyMgSUNEIFVua25vd24gUGh5c2ljYWwgRGV2aWNlIEV4dGVuc2lvbnMKKworT3JpZ2luYWxseSwgaWYgdGhlIGxvYWRlciB3YXMgY2FsbGVkIHdpdGggYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAsIGl0IHdvdWxkCityZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBiZWhhdmlvcjoKKyAxLiBUaGUgbG9hZGVyIHdvdWxkIGNoZWNrIGlmIGNvcmUgZnVuY3Rpb246CisgICAgLSBJZiBpdCB3YXMsIGl0IHdvdWxkIHJldHVybiB0aGUgZnVuY3Rpb24gcG9pbnRlcgorIDIuIFRoZSBsb2FkZXIgd291bGQgY2hlY2sgaWYga25vd24gZXh0ZW5zaW9uIGZ1bmN0aW9uOgorICAgIC0gSWYgaXQgd2FzLCBpdCB3b3VsZCByZXR1cm4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIKKyAzLiBJZiB0aGUgbG9hZGVyIGtuZXcgbm90aGluZyBhYm91dCBpdCwgaXQgd291bGQgY2FsbCBkb3duIHVzaW5nCitgR2V0SW5zdGFuY2VQcm9jQWRkcmAKKyAgICAtIElmIGl0IHJldHVybmVkIG5vbi1OVUxMLCB0cmVhdCBpdCBhcyBhbiB1bmtub3duIGxvZ2ljYWwgZGV2aWNlIGNvbW1hbmQuCisgICAgLSBUaGlzIG1lYW50IHNldHRpbmcgdXAgYSBnZW5lcmljIHRyYW1wb2xpbmUgZnVuY3Rpb24gdGhhdCB0YWtlcyBpbiBhCitWa0RldmljZSBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIGFuZCBhZGp1c3RpbmcgdGhlIGRpc3BhdGNoIHRhYmxlIHRvIGNhbGwgdGhlCitJQ0QvTGF5ZXJzIGZ1bmN0aW9uIGFmdGVyIGdldHRpbmcgdGhlIGRpc3BhdGNoIHRhYmxlIGZyb20gdGhlIFZrRGV2aWNlLgorIDQuIElmIGFsbCB0aGUgYWJvdmUgZmFpbGVkLCB0aGUgbG9hZGVyIHdvdWxkIHJldHVybiBOVUxMIHRvIHRoZSBhcHBsaWNhdGlvbi4KKworVGhpcyBjYXVzZWQgcHJvYmxlbXMgd2hlbiBhbiBJQ0QgYXR0ZW1wdGVkIHRvIGV4cG9zZSBuZXcgcGh5c2ljYWwgZGV2aWNlCitleHRlbnNpb25zIHRoZSBsb2FkZXIga25ldyBub3RoaW5nIGFib3V0LCBidXQgYW4gYXBwbGljYXRpb24gZGlkLiAgQmVjYXVzZSB0aGUKK2xvYWRlciBrbmV3IG5vdGhpbmcgYWJvdXQgaXQsIHRoZSBsb2FkZXIgd291bGQgZ2V0IHRvIHN0ZXAgMyBpbiB0aGUgYWJvdmUKK3Byb2Nlc3MgYW5kIHdvdWxkIHRyZWF0IHRoZSBmdW5jdGlvbiBhcyBhbiB1bmtub3duIGxvZ2ljYWwgZGV2aWNlIGNvbW1hbmQuICBUaGUKK3Byb2JsZW0gaXMsIHRoaXMgd291bGQgY3JlYXRlIGEgZ2VuZXJpYyBWa0RldmljZSB0cmFtcG9saW5lIGZ1bmN0aW9uIHdoaWNoLCBvbgordGhlIGZpcnN0IGNhbGwsIHdvdWxkIGF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgdGhlIFZrUGh5c2ljYWxEZXZpY2UgYXMgYSBWa0RldmljZS4KK1RoaXMgd291bGQgbGVhZCB0byBhIGNyYXNoIG9yIGNvcnJ1cHRpb24uCisKK0luIG9yZGVyIHRvIGlkZW50aWZ5IHRoZSBleHRlbnNpb24gZW50cnkgcG9pbnRzIHNwZWNpZmljIHRvIHBoeXNpY2FsIGRldmljZQorZXh0ZW5zaW9ucywgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjYW4gYmUgYWRkZWQgdG8gYW4gSUNEOgorCitgYGBjcHAKK1BGTl92a1ZvaWRGdW5jdGlvbiB2a19pY2RHZXRQaHlzaWNhbERldmljZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwTmFtZSk7CitgYGAKKworVGhpcyBmdW5jdGlvbiBiZWhhdmVzIHNpbWlsYXIgdG8gYHZrR2V0SW5zdGFuY2VQcm9jQWRkcmAgYW5kCitgdmtHZXREZXZpY2VQcm9jQWRkcmAgZXhjZXB0IGl0IHNob3VsZCBvbmx5IHJldHVybiB2YWx1ZXMgZm9yIHBoeXNpY2FsIGRldmljZQorZXh0ZW5zaW9uIGVudHJ5IHBvaW50cy4gIEluIHRoaXMgd2F5LCBpdCBjb21wYXJlcyAicE5hbWUiIHRvIGV2ZXJ5IHBoeXNpY2FsCitkZXZpY2UgZnVuY3Rpb24gc3VwcG9ydGVkIGluIHRoZSBJQ0QuCisKK1RoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHk6CisqIElmIGl0IGlzIHRoZSBuYW1lIG9mIGEgcGh5c2ljYWwgZGV2aWNlIGZ1bmN0aW9uIHN1cHBvcnRlZCBieSB0aGUgSUNELCB0aGUKK3BvaW50ZXIgdG8gdGhlIElDRCdzIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIHJldHVybmVkLgorKiBJZiBpdCBpcyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZ1bmN0aW9uIHdoaWNoIGlzICoqbm90KiogYSBwaHlzaWNhbCBkZXZpY2UKK2Z1bmN0aW9uIChpLmUuIGFuIEluc3RhbmNlLCBEZXZpY2UsIG9yIG90aGVyIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJ5IHRoZSBJQ0QpLAordGhlbiB0aGUgdmFsdWUgb2YgTlVMTCBzaG91bGQgYmUgcmV0dXJuZWQuCisqIElmIHRoZSBJQ0QgaGFzIG5vIGlkZWEgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzLCBpdCBzaG91bGQgcmV0dXJuIE5VTEwuCisKK1RoaXMgc3VwcG9ydCBpcyBvcHRpb25hbCBhbmQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGEgcmVxdWlyZW1lbnQuICBUaGlzIGlzCitvbmx5IHJlcXVpcmVkIGlmIGFuIElDRCBpbnRlbmRzIHRvIHN1cHBvcnQgc29tZSBmdW5jdGlvbmFsaXR5IG5vdCBkaXJlY3RseQorc3VwcG9ydGVkIGJ5IGEgc2lnbmlmaWNhbnQgcG9wdWxhdGlvbiBvZiBsb2FkZXJzIGluIHRoZSBwdWJsaWMuICBJZiBhbiBJQ0QKK2RvZXMgaW1wbGVtZW50IHRoaXMgc3VwcG9ydCwgaXQgc2hvdWxkIHJldHVybiB0aGUgYWRkcmVzcyBvZiBpdHMKK2B2a19pY2RHZXRQaHlzaWNhbERldmljZVByb2NBZGRyYCBmdW5jdGlvbiB0aHJvdWdoIHRoZSBgdmtHZXRJbnN0YW5jZVByb2NBZGRyYAorZnVuY3Rpb24uCisKK1RoZSBuZXcgYmVoYXZpb3Igb2YgdGhlIGxvYWRlcidzIHZrR2V0SW5zdGFuY2VQcm9jQWRkciB3aXRoIHN1cHBvcnQgZm9yIHRoZQorYHZrX2ljZEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHJgIGZ1bmN0aW9uIGlzIGFzIGZvbGxvd3M6CisgMS4gQ2hlY2sgaWYgY29yZSBmdW5jdGlvbjoKKyAgICAtIElmIGl0IGlzLCByZXR1cm4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIKKyAyLiBDaGVjayBpZiBrbm93biBpbnN0YW5jZSBvciBkZXZpY2UgZXh0ZW5zaW9uIGZ1bmN0aW9uOgorICAgIC0gSWYgaXQgaXMsIHJldHVybiB0aGUgZnVuY3Rpb24gcG9pbnRlcgorIDMuIENhbGwgdGhlIGxheWVyL0lDRCBgR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcmAKKyAgICAtIElmIGl0IHJldHVybnMgbm9uLU5VTEwsIHJldHVybiBhIHRyYW1wb2xpbmUgdG8gYSBnZW5lcmljIHBoeXNpY2FsIGRldmljZQorZnVuY3Rpb24sIGFuZCBzZXQgdXAgYSBnZW5lcmljIHRlcm1pbmF0b3Igd2hpY2ggd2lsbCBwYXNzIGl0IHRvIHRoZSBwcm9wZXIgSUNELgorIDQuIENhbGwgZG93biB1c2luZyBgR2V0SW5zdGFuY2VQcm9jQWRkcmAKKyAgICAtIElmIGl0IHJldHVybnMgbm9uLU5VTEwsIHRyZWF0IGl0IGFzIGFuIHVua25vd24gbG9naWNhbCBkZXZpY2UgY29tbWFuZC4KK1RoaXMgbWVhbnMgc2V0dGluZyB1cCBhIGdlbmVyaWMgdHJhbXBvbGluZSBmdW5jdGlvbiB0aGF0IHRha2VzIGluIGEgVmtEZXZpY2UgYXMKK3RoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIGFkanVzdGluZyB0aGUgZGlzcGF0Y2ggdGFibGUgdG8gY2FsbCB0aGUgSUNEL0xheWVycworZnVuY3Rpb24gYWZ0ZXIgZ2V0dGluZyB0aGUgZGlzcGF0Y2ggdGFibGUgZnJvbSB0aGUgVmtEZXZpY2UuIFRoZW4sIHJldHVybiB0aGUKK3BvaW50ZXIgdG8gY29ycmVzcG9uZGluZyB0cmFtcG9saW5lIGZ1bmN0aW9uLgorIDUuIFJldHVybiBOVUxMCisKK1lvdSBjYW4gc2VlIG5vdywgdGhhdCwgaWYgdGhlIGNvbW1hbmQgZ2V0cyBwcm9tb3RlZCB0byBjb3JlIGxhdGVyLCBpdCB3aWxsIG5vCitsb25nZXIgYmUgc2V0IHVwIHVzaW5nIGB2a19pY2RHZXRQaHlzaWNhbERldmljZVByb2NBZGRyYC4gIEFkZGl0aW9uYWxseSwgaWYgdGhlCitsb2FkZXIgYWRkcyBkaXJlY3Qgc3VwcG9ydCBmb3IgdGhlIGV4dGVuc2lvbiwgaXQgd2lsbCBubyBsb25nZXIgZ2V0IHRvIHN0ZXAgMywKK2JlY2F1c2Ugc3RlcCAyIHdpbGwgcmV0dXJuIGEgdmFsaWQgZnVuY3Rpb24gcG9pbnRlci4gIEhvd2V2ZXIsIHRoZSBJQ0Qgc2hvdWxkCitjb250aW51ZSB0byBzdXBwb3J0IHRoZSBjb21tYW5kIHF1ZXJ5IHZpYSBgdmtfaWNkR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcmAsCit1bnRpbCBhdCBsZWFzdCBhIFZ1bGthbiB2ZXJzaW9uIGJ1bXAsIGJlY2F1c2UgYW4gb2xkZXIgbG9hZGVyIG1heSBzdGlsbCBiZQorYXR0ZW1wdGluZyB0byB1c2UgdGhlIGNvbW1hbmRzLgorCisKKyMjIyBJQ0QgRGlzcGF0Y2hhYmxlIE9iamVjdCBDcmVhdGlvbgorCitBcyBwcmV2aW91c2x5IGNvdmVyZWQsIHRoZSBsb2FkZXIgcmVxdWlyZXMgZGlzcGF0Y2ggdGFibGVzIHRvIGJlIGFjY2Vzc2libGUKK3dpdGhpbiBWdWxrYW4gZGlzcGF0Y2hhYmxlIG9iamVjdHMsIHN1Y2ggYXM6IGBWa0luc3RhbmNlYCwgYFZrUGh5c2ljYWxEZXZpY2VgLAorYFZrRGV2aWNlYCwgYFZrUXVldWVgLCBhbmQgYFZrQ29tbWFuZEJ1ZmZlcmAuIFRoZSBzcGVjaWZpYyByZXF1aXJlbWVudHMgb24gYWxsCitkaXNwYXRjaGFibGUgb2JqZWN0cyBjcmVhdGVkIGJ5IElDRHMgYXJlIGFzIGZvbGxvd3M6CisKKy0gQWxsIGRpc3BhdGNoYWJsZSBvYmplY3RzIGNyZWF0ZWQgYnkgYW4gSUNEIGNhbiBiZSBjYXN0IHRvIHZvaWQgXCpcKgorLSBUaGUgbG9hZGVyIHdpbGwgcmVwbGFjZSB0aGUgZmlyc3QgZW50cnkgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGRpc3BhdGNoIHRhYmxlCisgIHdoaWNoIGlzIG93bmVkIGJ5IHRoZSBsb2FkZXIuIFRoaXMgaW1wbGllcyB0aHJlZSB0aGluZ3MgZm9yIElDRCBkcml2ZXJzCisgIDEuIFRoZSBJQ0QgbXVzdCByZXR1cm4gYSBwb2ludGVyIGZvciB0aGUgb3BhcXVlIGRpc3BhdGNoYWJsZSBvYmplY3QgaGFuZGxlCisgIDIuIFRoaXMgcG9pbnRlciBwb2ludHMgdG8gYSByZWd1bGFyIEMgc3RydWN0dXJlIHdpdGggdGhlIGZpcnN0IGVudHJ5IGJlaW5nIGEKKyAgIHBvaW50ZXIuCisgICAqICoqTk9URToqKiBGb3IgYW55IENcKysgSUNEJ3MgdGhhdCBpbXBsZW1lbnQgVksgb2JqZWN0cyBkaXJlY3RseSBhcyBDXCsrCitjbGFzc2VzOgorICAgICAqIFRoZSBDXCsrIGNvbXBpbGVyIG1heSBwdXQgYSB2dGFibGUgYXQgb2Zmc2V0IHplcm8gaWYgeW91ciBjbGFzcyBpcyAKK25vbi1QT0QgZHVlIHRvIHRoZSB1c2Ugb2YgYSB2aXJ0dWFsIGZ1bmN0aW9uLgorICAgICAqIEluIHRoaXMgY2FzZSB1c2UgYSByZWd1bGFyIEMgc3RydWN0dXJlIChzZWUgYmVsb3cpLgorICAzLiBUaGUgbG9hZGVyIGNoZWNrcyBmb3IgYSBtYWdpYyB2YWx1ZSAoSUNEXF9MT0FERVJcX01BR0lDKSBpbiBhbGwgdGhlIGNyZWF0ZWQKKyAgIGRpc3BhdGNoYWJsZSBvYmplY3RzLCBhcyBmb2xsb3dzIChzZWUgYGluY2x1ZGUvdnVsa2FuL3ZrX2ljZC5oYCk6CisKK2BgYGNwcAorI2luY2x1ZGUgInZrX2ljZC5oIgorCit1bmlvbiBfVktfTE9BREVSX0RBVEEgeworICAgIHVpbnRwdHIgbG9hZGVybWFnaWM7CisgICAgdm9pZCAqbG9hZGVyRGF0YTsKK30gVktfTE9BREVSX0RBVEE7CisKK3ZrT2JqIGFsbG9jX2ljZF9vYmooKQoreworICAgIHZrT2JqICpuZXdPYmogPSBhbGxvY19vYmooKTsKKyAgICAuLi4KKyAgICAvLyBJbml0aWFsaXplIHBvaW50ZXIgdG8gbG9hZGVyJ3MgZGlzcGF0Y2ggdGFibGUgd2l0aCBJQ0RfTE9BREVSX01BR0lDCisKKyAgICBzZXRfbG9hZGVyX21hZ2ljX3ZhbHVlKG5ld09iaik7CisgICAgLi4uCisgICAgcmV0dXJuIG5ld09iajsKK30KK2BgYAorIAorCisjIyMgSGFuZGxpbmcgS0hSIFN1cmZhY2UgT2JqZWN0cyBpbiBXU0kgRXh0ZW5zaW9ucworCitOb3JtYWxseSwgSUNEcyBoYW5kbGUgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBmb3IgdmFyaW91cyBWdWxrYW4KK29iamVjdHMuIFRoZSBXU0kgc3VyZmFjZSBleHRlbnNpb25zIGZvciBMaW51eCwgV2luZG93cywgYW5kIG1hY09TCisoIlZLXF9LSFJcX3dpbjMyXF9zdXJmYWNlIiwgIlZLXF9LSFJcX3hjYlxfc3VyZmFjZSIsICJWS1xfS0hSXF94bGliXF9zdXJmYWNlIiwKKyJWS1xfS0hSXF93YXlsYW5kXF9zdXJmYWNlIiwgIlZLXF9NVktcX21hY29zXF9zdXJmYWNlIgorYW5kICJWS1xfS0hSXF9zdXJmYWNlIikKK2FyZSBoYW5kbGVkIGRpZmZlcmVudGx5LiAgRm9yIHRoZXNlIGV4dGVuc2lvbnMsIHRoZSBgVmtTdXJmYWNlS0hSYCBvYmplY3QKK2NyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBtYXkgYmUgaGFuZGxlZCBieSBlaXRoZXIgdGhlIGxvYWRlciAgb3IgYW4gSUNELgorCitJZiB0aGUgbG9hZGVyIGhhbmRsZXMgdGhlIG1hbmFnZW1lbnQgb2YgdGhlIGBWa1N1cmZhY2VLSFJgIG9iamVjdHM6CisgMS4gVGhlIGxvYWRlciB3aWxsIGhhbmRsZSB0aGUgY2FsbHMgdG8gYHZrQ3JlYXRlWFhYU3VyZmFjZUtIUmAgYW5kCitgdmtEZXN0cm95U3VyZmFjZUtIUmAKKyAgICBmdW5jdGlvbnMgd2l0aG91dCBpbnZvbHZpbmcgdGhlIElDRHMuCisgICAgKiBXaGVyZSBYWFggc3RhbmRzIGZvciB0aGUgV2luZG93aW5nIFN5c3RlbSBuYW1lOgorICAgICAgKiBXYXlsYW5kCisgICAgICAqIFhDQgorICAgICAgKiBYbGliCisgICAgICAqIFdpbmRvd3MKKyAgICAgICogQW5kcm9pZAorICAgICAgKiBNYWNPUyAoYHZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLYCkKKyAyLiBUaGUgbG9hZGVyIGNyZWF0ZXMgYSBgVmtJY2RTdXJmYWNlWFhYYCBvYmplY3QgZm9yIHRoZSBjb3JyZXNwb25kaW5nCitgdmtDcmVhdGVYWFhTdXJmYWNlS0hSYCBjYWxsLgorICAgICogVGhlIGBWa0ljZFN1cmZhY2VYWFhgIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gYGluY2x1ZGUvdnVsa2FuL3ZrX2ljZC5oYC4KKyAzLiBJQ0RzIGNhbiBjYXN0IGFueSBgVmtTdXJmYWNlS0hSYCBvYmplY3QgdG8gYSBwb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZQorICAgIGBWa0ljZFN1cmZhY2VYWFhgIHN0cnVjdHVyZS4KKyA0LiBUaGUgZmlyc3QgZmllbGQgb2YgYWxsIHRoZSBgVmtJY2RTdXJmYWNlWFhYYCBzdHJ1Y3R1cmVzIGlzIGEKK2BWa0ljZFN1cmZhY2VCYXNlYCBlbnVtZXJhbnQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUKKyAgICBzdXJmYWNlIG9iamVjdCBpcyBXaW4zMiwgWENCLCBYbGliLCBvciBXYXlsYW5kLgorCitUaGUgSUNEIG1heSBjaG9vc2UgdG8gaGFuZGxlIGBWa1N1cmZhY2VLSFJgIG9iamVjdCBjcmVhdGlvbiBpbnN0ZWFkLiAgSWYgYW4gSUNECitkZXNpcmVzIHRvIGhhbmRsZSBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBpdCBtdXN0IGRvIHRoZSBmb2xsb3dpbmc6CisgMS4gU3VwcG9ydCB2ZXJzaW9uIDMgb3IgbmV3ZXIgb2YgdGhlIGxvYWRlci9JQ0QgaW50ZXJmYWNlLgorIDIuIEV4cG9ydCBhbmQgaGFuZGxlIGFsbCBmdW5jdGlvbnMgdGhhdCB0YWtlIGluIGEgYFZrU3VyZmFjZUtIUmAgb2JqZWN0LAoraW5jbHVkaW5nOgorICAgICAqIGB2a0NyZWF0ZVhYWFN1cmZhY2VLSFJgCisgICAgICogYHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUmAKKyAgICAgKiBgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFJgCisgICAgICogYHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUmAKKyAgICAgKiBgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFJgCisgICAgICogYHZrQ3JlYXRlU3dhcGNoYWluS0hSYAorICAgICAqIGB2a0Rlc3Ryb3lTdXJmYWNlS0hSYAorCitCZWNhdXNlIHRoZSBgVmtTdXJmYWNlS0hSYCBvYmplY3QgaXMgYW4gaW5zdGFuY2UtbGV2ZWwgb2JqZWN0LCBvbmUgb2JqZWN0IGNhbiBiZQorYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIElDRHMuICBUaGVyZWZvcmUsIHdoZW4gdGhlIGxvYWRlciByZWNlaXZlcyB0aGUKK2B2a0NyZWF0ZVhYWFN1cmZhY2VLSFJgIGNhbGwsIGl0IHN0aWxsIGNyZWF0ZXMgYW4gaW50ZXJuYWwgYFZrU3VyZmFjZUljZFhYWGAKK29iamVjdC4gIFRoaXMgb2JqZWN0IGFjdHMgYXMgYSBjb250YWluZXIgZm9yIGVhY2ggSUNEJ3MgdmVyc2lvbiBvZiB0aGUKK2BWa1N1cmZhY2VLSFJgIG9iamVjdC4gIElmIGFuIElDRCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjcmVhdGlvbiBvZiBpdHMgb3duCitgVmtTdXJmYWNlS0hSYCBvYmplY3QsIHRoZSBsb2FkZXIncyBjb250YWluZXIgc3RvcmVzIGEgTlVMTCBmb3IgdGhhdCBJQ0QuICBPbgordGhlIG90aGVyIGhhbmQsIGlmIHRoZSBJQ0QgZG9lcyBzdXBwb3J0IGBWa1N1cmZhY2VLSFJgIGNyZWF0aW9uLCB0aGUgbG9hZGVyIHdpbGwKK21ha2UgdGhlIGFwcHJvcHJpYXRlIGB2a0NyZWF0ZVhYWFN1cmZhY2VLSFJgIGNhbGwgdG8gdGhlIElDRCwgYW5kIHN0b3JlIHRoZQorcmV0dXJuZWQgcG9pbnRlciBpbiBpdHMgY29udGFpbmVyIG9iamVjdC4gIFRoZSBsb2FkZXIgdGhlbiByZXR1cm5zIHRoZQorYFZrU3VyZmFjZUljZFhYWGAgYXMgYSBgVmtTdXJmYWNlS0hSYCBvYmplY3QgYmFjayB1cCB0aGUgY2FsbCBjaGFpbi4gIEZpbmFsbHksCit3aGVuIHRoZSBsb2FkZXIgcmVjZWl2ZXMgdGhlIGB2a0Rlc3Ryb3lTdXJmYWNlS0hSYCBjYWxsLCBpdCBzdWJzZXF1ZW50bHkgY2FsbHMKK2B2a0Rlc3Ryb3lTdXJmYWNlS0hSYCBmb3IgZWFjaCBJQ0Qgd2hvJ3MgaW50ZXJuYWwgYFZrU3VyZmFjZUtIUmAgb2JqZWN0IGlzIG5vdAorTlVMTC4gIFRoZW4gdGhlIGxvYWRlciBkZXN0cm95cyB0aGUgY29udGFpbmVyIG9iamVjdCBiZWZvcmUgcmV0dXJuaW5nLgorCisKKyMjIyBMb2FkZXIgYW5kIElDRCBJbnRlcmZhY2UgTmVnb3RpYXRpb24KKworR2VuZXJhbGx5LCBmb3IgZnVuY3Rpb25zIGlzc3VlZCBieSBhbiBhcHBsaWNhdGlvbiwgdGhlIGxvYWRlciBjYW4gYmUKK3ZpZXdlZCBhcyBhIHBhc3MgdGhyb3VnaC4gVGhhdCBpcywgdGhlIGxvYWRlciBnZW5lcmFsbHkgZG9lc24ndCBtb2RpZnkgdGhlCitmdW5jdGlvbnMgb3IgdGhlaXIgcGFyYW1ldGVycywgYnV0IHNpbXBseSBjYWxscyB0aGUgSUNEcyBlbnRyeSBwb2ludCBmb3IgdGhhdAorZnVuY3Rpb24uIFRoZXJlIGFyZSBzcGVjaWZpYyBhZGRpdGlvbmFsIGludGVyZmFjZSByZXF1aXJlbWVudHMgYW4gSUNEIG5lZWRzIHRvCitjb21wbHkgd2l0aCB0aGF0IGFyZSBub3QgcGFydCBvZiBhbnkgcmVxdWlyZW1lbnRzIGZyb20gdGhlIFZ1bGthbiBzcGVjaWZpY2F0aW9uLgorVGhlc2UgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgYXJlIHZlcnNpb25lZCB0byBhbGxvdyBmbGV4aWJpbGl0eSBpbiB0aGUgZnV0dXJlLgorCisKKyMjIyMgV2luZG93cywgTGludXggYW5kIG1hY09TIElDRCBOZWdvdGlhdGlvbgorCisKKyMjIyMjIFZlcnNpb24gTmVnb3RpYXRpb24gQmV0d2VlbiBMb2FkZXIgYW5kIElDRHMKKworQWxsIElDRHMgKHN1cHBvcnRpbmcgaW50ZXJmYWNlIHZlcnNpb24gMiBvciBoaWdoZXIpIG11c3QgZXhwb3J0IHRoZSBmb2xsb3dpbmcKK2Z1bmN0aW9uIHRoYXQgaXMgdXNlZCBmb3IgZGV0ZXJtaW5hdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHZlcnNpb24gdGhhdCB3aWxsIGJlCit1c2VkLiAgVGhpcyBlbnRyeSBwb2ludCBpcyBub3QgYSBwYXJ0IG9mIHRoZSBWdWxrYW4gQVBJIGl0c2VsZiwgb25seSBhIHByaXZhdGUKK2ludGVyZmFjZSBiZXR3ZWVuIHRoZSBsb2FkZXIgYW5kIElDRHMuCisKK2BgYGNwcAorICAgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCisgICAgICAgdmtfaWNkTmVnb3RpYXRlTG9hZGVySUNESW50ZXJmYWNlVmVyc2lvbigKKyAgICAgICAgICAgdWludDMyX3QqIHBTdXBwb3J0ZWRWZXJzaW9uKTsKK2BgYAorCitUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbG9hZGVyIGFuZCBJQ0QgdG8gYWdyZWUgb24gYW4gaW50ZXJmYWNlIHZlcnNpb24gdG8gdXNlLgorVGhlICJwU3VwcG9ydGVkVmVyc2lvbiIgcGFyYW1ldGVyIGlzIGJvdGggYW4gaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXIuCisicFN1cHBvcnRlZFZlcnNpb24iIGlzIGZpbGxlZCBpbiBieSB0aGUgbG9hZGVyIHdpdGggdGhlIGRlc2lyZWQgbGF0ZXN0IGludGVyZmFjZQordmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIGxvYWRlciAodHlwaWNhbGx5IHRoZSBsYXRlc3QpLiBUaGUgSUNEIHJlY2VpdmVzIHRoaXMKK2FuZCByZXR1cm5zIGJhY2sgdGhlIHZlcnNpb24gaXQgZGVzaXJlcyBpbiB0aGUgc2FtZSBmaWVsZC4gIEJlY2F1c2UgaXQgaXMKK3NldHRpbmcgdXAgdGhlIGludGVyZmFjZSB2ZXJzaW9uIGJldHdlZW4gdGhlIGxvYWRlciBhbmQgSUNELCB0aGlzIHNob3VsZCBiZQordGhlIGZpcnN0IGNhbGwgbWFkZSBieSBhIGxvYWRlciB0byB0aGUgSUNEIChldmVuIHByaW9yIHRvIGFueSBjYWxscyB0bworYHZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHJgKS4KKworSWYgdGhlIElDRCByZWNlaXZpbmcgdGhlIGNhbGwgbm8gbG9uZ2VyIHN1cHBvcnRzIHRoZSBpbnRlcmZhY2UgdmVyc2lvbiBwcm92aWRlZAorYnkgdGhlIGxvYWRlciAoZHVlIHRvIGRlcHJlY2F0aW9uKSwgdGhlbiBpdCBzaG91bGQgcmVwb3J0IGEKK1ZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVIgZXJyb3IuICBPdGhlcndpc2UgaXQgc2V0cyB0aGUgdmFsdWUgcG9pbnRlZCBieQorInBTdXBwb3J0ZWRWZXJzaW9uIiB0byB0aGUgbGF0ZXN0IGludGVyZmFjZSB2ZXJzaW9uIHN1cHBvcnRlZCBieSBib3RoIHRoZSBJQ0QKK2FuZCB0aGUgbG9hZGVyIGFuZCByZXR1cm5zIFZLX1NVQ0NFU1MuCisKK1RoZSBJQ0Qgc2hvdWxkIHJlcG9ydCBWS19TVUNDRVNTIGluIGNhc2UgdGhlIGxvYWRlci1wcm92aWRlZCBpbnRlcmZhY2UgdmVyc2lvbgoraXMgbmV3ZXIgdGhhbiB0aGF0IHN1cHBvcnRlZCBieSB0aGUgSUNELCBhcyBpdCdzIHRoZSBsb2FkZXIncyByZXNwb25zaWJpbGl0eSB0bworZGV0ZXJtaW5lIHdoZXRoZXIgaXQgY2FuIHN1cHBvcnQgdGhlIG9sZGVyIGludGVyZmFjZSB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUKK0lDRC4gIFRoZSBJQ0Qgc2hvdWxkIGFsc28gcmVwb3J0IFZLX1NVQ0NFU1MgaW4gdGhlIGNhc2UgaXRzIGludGVyZmFjZSB2ZXJzaW9uCitpcyBncmVhdGVyIHRoYW4gdGhlIGxvYWRlcidzLCBidXQgcmV0dXJuIHRoZSBsb2FkZXIncyB2ZXJzaW9uLiBUaHVzLCB1cG9uCityZXR1cm4gb2YgVktfU1VDQ0VTUyB0aGUgInBTdXBwb3J0ZWRWZXJzaW9uIiB3aWxsIGNvbnRhaW4gdGhlIGRlc2lyZWQgaW50ZXJmYWNlCit2ZXJzaW9uIHRvIGJlIHVzZWQgYnkgdGhlIElDRC4KKworSWYgdGhlIGxvYWRlciByZWNlaXZlcyBhbiBpbnRlcmZhY2UgdmVyc2lvbiBmcm9tIHRoZSBJQ0QgdGhhdCB0aGUgbG9hZGVyIG5vCitsb25nZXIgc3VwcG9ydHMgKGR1ZSB0byBkZXByZWNhdGlvbiksIG9yIGl0IHJlY2VpdmVzIGEKK1ZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVIgZXJyb3IgaW5zdGVhZCBvZiBWS19TVUNDRVNTLCB0aGVuIHRoZSBsb2FkZXIgd2lsbAordHJlYXQgdGhlIElDRCBhcyBpbmNvbXBhdGlibGUgYW5kIHdpbGwgbm90IGxvYWQgaXQgZm9yIHVzZS4gIEluIHRoaXMgY2FzZSwgdGhlCithcHBsaWNhdGlvbiB3aWxsIG5vdCBzZWUgdGhlIElDRHMgYHZrUGh5c2ljYWxEZXZpY2VgIGR1cmluZyBlbnVtZXJhdGlvbi4KKworIyMjIyMjIEludGVyZmFjaW5nIFdpdGggTGVnYWN5IElDRHMgb3IgTG9hZGVyCisKK0lmIGEgbG9hZGVyIHNlZXMgdGhhdCBhbiBJQ0QgZG9lcyBub3QgZXhwb3J0IHRoZQorYHZrX2ljZE5lZ290aWF0ZUxvYWRlcklDREludGVyZmFjZVZlcnNpb25gIGZ1bmN0aW9uLCB0aGVuIHRoZSBsb2FkZXIgYXNzdW1lcyB0aGUKK2NvcnJlc3BvbmRpbmcgSUNEIG9ubHkgc3VwcG9ydHMgZWl0aGVyIGludGVyZmFjZSB2ZXJzaW9uIDAgb3IgMS4KKworRnJvbSB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgaW50ZXJmYWNlLCBpZiBhbiBJQ0Qgc2VlcyBhIGNhbGwgdG8KK2B2a19pY2RHZXRJbnN0YW5jZVByb2NBZGRyYCBiZWZvcmUgYSBjYWxsIHRvCitgdmtfaWNkTmVnb3RpYXRlTG9hZGVySUNESW50ZXJmYWNlVmVyc2lvbmAsIHRoZW4gaXQga25vd3MgdGhhdCBsb2FkZXIgbWFraW5nIHRoZSBjYWxscworaXMgYSBsZWdhY3kgbG9hZGVyIHN1cHBvcnRpbmcgdmVyc2lvbiAwIG9yIDEuICBJZiB0aGUgbG9hZGVyIGNhbGxzCitgdmtfaWNkR2V0SW5zdGFuY2VQcm9jQWRkcmAgZmlyc3QsIGl0IHN1cHBvcnRzIGF0IGxlYXN0IHZlcnNpb24gMS4gIE90aGVyd2lzZSwKK3RoZSBsb2FkZXIgb25seSBzdXBwb3J0cyB2ZXJzaW9uIDAuCisKKworIyMjIyMgTG9hZGVyIFZlcnNpb24gNSBJbnRlcmZhY2UgUmVxdWlyZW1lbnRzCisKK1ZlcnNpb24gNSBvZiB0aGUgbG9hZGVyL0lDRCBpbnRlcmZhY2UgaGFzIG5vIGNoYW5nZXMgdG8gdGhlIGFjdHVhbCBpbnRlcmZhY2UuCitJZiB0aGUgbG9hZGVyIHJlcXVlc3RzIGludGVyZmFjZSB2ZXJzaW9uIDUgb3IgZ3JlYXRlciwgaXQgaXMgc2ltcGx5CithbiBpbmRpY2F0aW9uIHRvIElDRHMgdGhhdCB0aGUgbG9hZGVyIGlzIG5vdyBldmFsdWF0aW5nIHdoZXRoZXIgdGhlIEFQSSBWZXJzaW9uIGluZm8KK3Bhc3NlZCBpbnRvIHZrQ3JlYXRlSW5zdGFuY2UgaXMgYSB2YWxpZCB2ZXJzaW9uIGZvciB0aGUgbG9hZGVyLiAgSWYgaXQgaXMgbm90LAordGhlIGxvYWRlciB3aWxsIGNhdGNoIHRoaXMgZHVyaW5nIHZrQ3JlYXRlSW5zdGFuY2UgYW5kIGZhaWwgd2l0aCBhCitWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSIGVycm9yLgorCitPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdmVyc2lvbiA1IG9yIG5ld2VyIGlzIG5vdCByZXF1ZXN0ZWQgYnkgdGhlIGxvYWRlciwgdGhlbiBpdAoraW5kaWNhdGVzIHRvIHRoZSBJQ0QgdGhhdCB0aGUgbG9hZGVyIGlzIGlnbm9yYW50IG9mIHRoZSBBUEkgdmVyc2lvbiBiZWluZworcmVxdWVzdGVkLiAgQmVjYXVzZSBvZiB0aGlzLCBpdCBmYWxscyBvbiB0aGUgSUNEIHRvIHZhbGlkYXRlIHRoYXQgdGhlIEFQSQorVmVyc2lvbiBpcyBub3QgZ3JlYXRlciB0aGFuIG1ham9yID0gMSBhbmQgbWlub3IgPSAwLiAgSWYgaXQgaXMsIHRoZW4gdGhlIElDRAorc2hvdWxkIGF1dG9tYXRpY2FsbHkgZmFpbCB3aXRoIGEgVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUiBlcnJvciBzaW5jZSB0aGUKK2xvYWRlciBpcyBhIDEuMCBsb2FkZXIsIGFuZCBpcyB1bmF3YXJlIG9mIHRoZSB2ZXJzaW9uLgorCitIZXJlIGlzIGEgdGFibGUgb2YgdGhlIGV4cGVjdGVkIGJlaGF2aW9yczoKKworfCBMb2FkZXIgU3VwcG9ydHMgSS9mIFZlcnNpb24gIHwgIElDRCBTdXBwb3J0cyBJL2YgVmVyc2lvbiAgfCAgICBSZXN1bHQgICAgICAgIHwKK3wgOi0tLTogfDotLS06fC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgICAgICAgICAgIDw9IDQgICAgICAgICAgICAgICB8ICAgICAgICAgICA8PSA0ICAgICAgICAgICAgIHwgSUNEIG11c3QgZmFpbCB3aXRoIGBWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSYCBmb3IgYWxsIHZrQ3JlYXRlSW5zdGFuY2UgY2FsbHMgd2l0aCBhcGlWZXJzaW9uIHNldCB0byA+IFZ1bGthbiAxLjAgYmVjYXVzZSBib3RoIHRoZSBsb2FkZXIgYW5kIElDRCBzdXBwb3J0IGludGVyZmFjZSB2ZXJzaW9uIDw9IDQuIE90aGVyd2lzZSwgdGhlIElDRCBzaG91bGQgYmVoYXZlIGFzIG5vcm1hbC4gfAorfCAgICAgICAgICAgPD0gNCAgICAgICAgICAgICAgIHwgICAgICAgICAgID49IDUgICAgICAgICAgICAgfCBJQ0QgbXVzdCBmYWlsIHdpdGggYFZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVJgIGZvciBhbGwgdmtDcmVhdGVJbnN0YW5jZSBjYWxscyB3aXRoIGFwaVZlcnNpb24gc2V0IHRvID4gVnVsa2FuIDEuMCBiZWNhdXNlIHRoZSBsb2FkZXIgaXMgc3RpbGwgYXQgaW50ZXJmYWNlIHZlcnNpb24gPD0gNC4gT3RoZXJ3aXNlLCB0aGUgSUNEIHNob3VsZCBiZWhhdmUgYXMgbm9ybWFsLiAgfAorfCAgICAgICAgICAgPj0gNSAgICAgICAgICAgICAgIHwgICAgICAgICAgIDw9IDQgICAgICAgICAgICAgfCBMb2FkZXIgd2lsbCBmYWlsIHdpdGggYFZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVJgIGlmIGl0IGNhbid0IGhhbmRsZSB0aGUgYXBpVmVyc2lvbi4gIElDRCBtYXkgcGFzcyBmb3IgYWxsIGFwaVZlcnNpb25zLCBidXQgc2luY2UgaXRzIGludGVyZmFjZSBpcyA8PSA0LCBpdCBpcyBiZXN0IGlmIGl0IGFzc3VtZXMgaXQgbmVlZHMgdG8gZG8gdGhlIHdvcmsgb2YgcmVqZWN0aW5nIGFueXRoaW5nID4gVnVsa2FuIDEuMCBhbmQgZmFpbCB3aXRoIGBWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSYC4gT3RoZXJ3aXNlLCB0aGUgSUNEIHNob3VsZCBiZWhhdmUgYXMgbm9ybWFsLiAgfAorfCAgICAgICAgICAgPj0gNSAgICAgICAgICAgICAgIHwgICAgICAgICAgID49IDUgICAgICAgICAgICAgfCBMb2FkZXIgd2lsbCBmYWlsIHdpdGggYFZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVJgIGlmIGl0IGNhbid0IGhhbmRsZSB0aGUgYXBpVmVyc2lvbiwgYW5kIElDRHMgc2hvdWxkIGZhaWwgd2l0aCBgVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUmAgKipvbmx5IGlmKiogdGhleSBjYW4gbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBhcGlWZXJzaW9uLiBPdGhlcndpc2UsIHRoZSBJQ0Qgc2hvdWxkIGJlaGF2ZSBhcyBub3JtYWwuICB8CisKKyMjIyMjIExvYWRlciBWZXJzaW9uIDQgSW50ZXJmYWNlIFJlcXVpcmVtZW50cworCitUaGUgbWFqb3IgY2hhbmdlIHRvIHZlcnNpb24gNCBvZiB0aGUgbG9hZGVyL0lDRCBpbnRlcmZhY2UgaXMgdGhlIHN1cHBvcnQgb2YKK1tVbmtub3duIFBoeXNpY2FsIERldmljZSBFeHRlbnNpb25zXSgjaWNkLXVua25vd24tcGh5c2ljYWwtZGV2aWNlLWV4dGVuc2lvbnMpCit1c2luZyB0aGUgYHZrX2ljZEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHJgIGZ1bmN0aW9uLiAgVGhpcworZnVuY3Rpb24gaXMgcHVyZWx5IG9wdGlvbmFsLiAgSG93ZXZlciwgaWYgYW4gSUNEIHN1cHBvcnRzIGEgUGh5c2ljYWwgRGV2aWNlCitleHRlbnNpb24sIGl0IG11c3QgcHJvdmlkZSBhIGB2a19pY2RHZXRQaHlzaWNhbERldmljZVByb2NBZGRyYCBmdW5jdGlvbi4KK090aGVyd2lzZSwgdGhlIGxvYWRlciB3aWxsIGNvbnRpbnVlIHRvIHRyZWF0IGFueSB1bmtub3duIGZ1bmN0aW9ucyBhcyBWa0RldmljZQorZnVuY3Rpb25zIGFuZCBjYXVzZSBpbnZhbGlkIGJlaGF2aW9yLgorCisKKyMjIyMjIExvYWRlciBWZXJzaW9uIDMgSW50ZXJmYWNlIFJlcXVpcmVtZW50cworCitUaGUgcHJpbWFyeSBjaGFuZ2UgdGhhdCBvY2N1cnJlZCBpbiB2ZXJzaW9uIDMgb2YgdGhlIGxvYWRlci9JQ0QgaW50ZXJmYWNlIHdhcyB0bworYWxsb3cgYW4gSUNEIHRvIGhhbmRsZSBjcmVhdGlvbi9kZXN0cnVjdGlvbiBvZiB0aGVpciBvd24gS0hSX3N1cmZhY2VzLiAgVXAgdW50aWwKK3RoaXMgcG9pbnQsIHRoZSBsb2FkZXIgY3JlYXRlZCBhIHN1cmZhY2Ugb2JqZWN0IHRoYXQgd2FzIHVzZWQgYnkgYWxsIElDRHMuCitIb3dldmVyLCBzb21lIElDRHMgbWF5IHdhbnQgdG8gcHJvdmlkZSB0aGVpciBvd24gc3VyZmFjZSBoYW5kbGVzLiAgSWYgYW4gSUNECitjaG9vc2VzIHRvIGVuYWJsZSB0aGlzIHN1cHBvcnQsIGl0IG11c3QgZXhwb3J0IHN1cHBvcnQgZm9yIHZlcnNpb24gMyBvZiB0aGUKK2xvYWRlci9JQ0QgaW50ZXJmYWNlLCBhcyB3ZWxsIGFzIGFueSBWdWxrYW4gZnVuY3Rpb24gdGhhdCB1c2VzIGEgS0hSX3N1cmZhY2UKK2hhbmRsZSwgc3VjaCBhczoKKy0gYHZrQ3JlYXRlWFhYU3VyZmFjZUtIUmAgKHdoZXJlIFhYWCBpcyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgaWRlbnRpZmllciBbaS5lLgorYHZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSYCBmb3IgV2luZG93c10pCistIGB2a0Rlc3Ryb3lTdXJmYWNlS0hSYAorLSBgdmtDcmVhdGVTd2FwY2hhaW5LSFJgCistIGB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFJgCistIGB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUmAKKy0gYHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUmAKKy0gYHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSYAorCitBbiBJQ0QgY2FuIHN0aWxsIGNob29zZSB0byBub3QgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBmdW5jdGlvbmFsaXR5IGJ5IHNpbXBseQorbm90IGV4cG9zaW5nIHRoZSBhYm92ZSBgdmtDcmVhdGVYWFhTdXJmYWNlS0hSYCBhbmQgYHZrRGVzdHJveVN1cmZhY2VLSFJgCitmdW5jdGlvbnMuCisKKworIyMjIyMgTG9hZGVyIFZlcnNpb24gMiBJbnRlcmZhY2UgUmVxdWlyZW1lbnRzCisKK1ZlcnNpb24gMiBpbnRlcmZhY2UgaGFzIHJlcXVpcmVtZW50cyBpbiB0aHJlZSBhcmVhczoKKyAxLiBJQ0QgVnVsa2FuIGVudHJ5IHBvaW50IGRpc2NvdmVyeSwKKyAyLiBgS0hSX3N1cmZhY2VgIHJlbGF0ZWQgcmVxdWlyZW1lbnRzIGluIHRoZSBXU0kgZXh0ZW5zaW9ucywKKyAzLiBWdWxrYW4gZGlzcGF0Y2hhYmxlIG9iamVjdCBjcmVhdGlvbiByZXF1aXJlbWVudHMuCisKKyMjIyMjIExvYWRlciBWZXJzaW9ucyAwIGFuZCAxIEludGVyZmFjZSBSZXF1aXJlbWVudHMKKworVmVyc2lvbiAwIGFuZCAxIGludGVyZmFjZXMgZG8gbm90IHN1cHBvcnQgdmVyc2lvbiBuZWdvdGlhdGlvbiB2aWEKK2B2a19pY2ROZWdvdGlhdGVMb2FkZXJJQ0RJbnRlcmZhY2VWZXJzaW9uYC4gIElDRHMgY2FuIGRpc3Rpbmd1aXNoIHZlcnNpb24gMCBhbmQKK3ZlcnNpb24gMSBpbnRlcmZhY2VzIGFzIGZvbGxvd3M6IGlmIHRoZSBsb2FkZXIgY2FsbHMgYHZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHJgCitmaXJzdCBpdCBzdXBwb3J0cyB2ZXJzaW9uIDE7IG90aGVyd2lzZSB0aGUgbG9hZGVyIG9ubHkgc3VwcG9ydHMgdmVyc2lvbiAwLgorCitWZXJzaW9uIDAgaW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgYHZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHJgLiAgVmVyc2lvbiAwCitpbnRlcmZhY2UgcmVxdWlyZW1lbnRzIGZvciBvYnRhaW5pbmcgSUNEIFZ1bGthbiBlbnRyeSBwb2ludHMgYXJlIGFzIGZvbGxvd3M6CisKKy0gVGhlIGZ1bmN0aW9uIGB2a0dldEluc3RhbmNlUHJvY0FkZHJgICoqbXVzdCBiZSBleHBvcnRlZCoqIGluIHRoZSBJQ0QgbGlicmFyeQorYW5kIHJldHVybnMgdmFsaWQgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIGFsbCB0aGUgVnVsa2FuIEFQSSBlbnRyeSBwb2ludHMuCistIGB2a0NyZWF0ZUluc3RhbmNlYCAqKm11c3QgYmUgZXhwb3J0ZWQqKiBieSB0aGUgSUNEIGxpYnJhcnkuCistIGB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc2AgKiptdXN0IGJlIGV4cG9ydGVkKiogYnkgdGhlIElDRAorbGlicmFyeS4KKworQWRkaXRpb25hbCBOb3RlczoKKworLSBUaGUgbG9hZGVyIHdpbGwgZmlsdGVyIG91dCBleHRlbnNpb25zIHJlcXVlc3RlZCBpbiBgdmtDcmVhdGVJbnN0YW5jZWAgYW5kCitgdmtDcmVhdGVEZXZpY2VgIGJlZm9yZSBjYWxsaW5nIGludG8gdGhlIElDRDsgRmlsdGVyaW5nIHdpbGwgYmUgb2YgZXh0ZW5zaW9ucworYWR2ZXJ0aXNlZCBieSBlbnRpdGllcyAoZS5nLiBsYXllcnMpIGRpZmZlcmVudCBmcm9tIHRoZSBJQ0QgaW4gcXVlc3Rpb24uCistIFRoZSBsb2FkZXIgd2lsbCBub3QgY2FsbCB0aGUgSUNEIGZvciBgdmtFbnVtZXJhdGUqTGF5ZXJQcm9wZXJ0aWVzYCBhcyBsYXllcgorcHJvcGVydGllcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgbGF5ZXIgbGlicmFyaWVzIGFuZCBsYXllciBKU09OIGZpbGVzLgorLSBJZiBhbiBJQ0QgbGlicmFyeSBhdXRob3Igd2FudHMgdG8gaW1wbGVtZW50IGEgbGF5ZXIsIGl0IGNhbiBkbyBzbyBieSBoYXZpbmcKK3RoZSBhcHByb3ByaWF0ZSBsYXllciBKU09OIG1hbmlmZXN0IGZpbGUgcmVmZXIgdG8gdGhlIElDRCBsaWJyYXJ5IGZpbGUuCistIFRoZSBsb2FkZXIgd2lsbCBub3QgY2FsbCB0aGUgSUNEIGZvcgorICBgdmtFbnVtZXJhdGUqRXh0ZW5zaW9uUHJvcGVydGllc2AgaWYgInBMYXllck5hbWUiIGlzIG5vdCBlcXVhbCB0byBgTlVMTGAuCistIElDRHMgY3JlYXRpbmcgbmV3IGRpc3BhdGNoYWJsZSBvYmplY3RzIHZpYSBkZXZpY2UgZXh0ZW5zaW9ucyBuZWVkIHRvCitpbml0aWFsaXplIHRoZSBjcmVhdGVkIGRpc3BhdGNoYWJsZSBvYmplY3QuICBUaGUgbG9hZGVyIGhhcyBnZW5lcmljICp0cmFtcG9saW5lKgorY29kZSBmb3IgdW5rbm93biBkZXZpY2UgZXh0ZW5zaW9ucy4gIFRoaXMgZ2VuZXJpYyAqdHJhbXBvbGluZSogY29kZSBkb2Vzbid0Citpbml0aWFsaXplIHRoZSBkaXNwYXRjaCB0YWJsZSB3aXRoaW4gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LiAgU2VlIHRoZQorW0NyZWF0aW5nIE5ldyBEaXNwYXRjaGFibGUgT2JqZWN0c10oI2NyZWF0aW5nLW5ldy1kaXNwYXRjaGFibGUtb2JqZWN0cykgc2VjdGlvbgorZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGluaXRpYWxpemUgY3JlYXRlZCBkaXNwYXRjaGFibGUgb2JqZWN0cyBmb3IKK2V4dGVuc2lvbnMgbm9uIGtub3duIGJ5IHRoZSBsb2FkZXIuCisKKworIyMjIyBBbmRyb2lkIElDRCBOZWdvdGlhdGlvbgorCitUaGUgQW5kcm9pZCBsb2FkZXIgdXNlcyB0aGUgc2FtZSBwcm90b2NvbCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBkaXNwYXRjaAordGFibGUgYXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIEFuZHJvaWQKK2xvYWRlciBxdWVyaWVzIGxheWVyIGFuZCBleHRlbnNpb24gaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSB0aGUKK3Jlc3BlY3RpdmUgbGlicmFyaWVzIGFuZCBkb2VzIG5vdCB1c2UgdGhlIEpTT04gbWFuaWZlc3QgZmlsZXMgdXNlZAorYnkgdGhlIFdpbmRvd3MsIExpbnV4IGFuZCBtYWNPUyBsb2FkZXJzLgorCisjIyBUYWJsZSBvZiBEZWJ1ZyBFbnZpcm9ubWVudCBWYXJpYWJsZXMKKworVGhlIGZvbGxvd2luZyBhcmUgYWxsIHRoZSBEZWJ1ZyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aCB0aGUKK0xvYWRlci4gIFRoZXNlIGFyZSByZWZlcmVuY2VkIHRocm91Z2hvdXQgdGhlIHRleHQsIGJ1dCBjb2xsZWN0ZWQgaGVyZSBmb3IgZWFzZQorb2YgZGlzY292ZXJ5LgorCit8IEVudmlyb25tZW50IFZhcmlhYmxlICAgICAgICAgICAgICB8IEJlaGF2aW9yIHwgIEV4YW1wbGUgRm9ybWF0ICB8Cit8Oi0tLTp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IFZLX0lDRF9GSUxFTkFNRVMgICAgICAgICAgICAgICAgICB8IEZvcmNlIHRoZSBsb2FkZXIgdG8gdXNlIHRoZSBzcGVjaWZpYyBJQ0QgSlNPTiBmaWxlcy4gIFRoZSB2YWx1ZSBzaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgZGVsaW1pdGVkIGZ1bGwgcGF0aCBsaXN0aW5ncyB0byBJQ0QgSlNPTiBNYW5pZmVzdCBmaWxlcy4gICoqTk9URToqKiBJZiB5b3UgZmFpbCB0byB1c2UgdGhlIGdsb2JhbCBwYXRoIHRvIGEgSlNPTiBmaWxlLCB5b3UgbWF5IGVuY291bnRlciBpc3N1ZXMuICB8ICBgZXhwb3J0IFZLX0lDRF9GSUxFTkFNRVM9PGZvbGRlcl9hPi9pbnRlbC5qc29uOjxmb2xkZXJfYj4vYW1kLmpzb25gPGJyLz48YnIvPmBzZXQgVktfSUNEX0ZJTEVOQU1FUz08Zm9sZGVyX2E+XG52aWRpYS5qc29uOzxmb2xkZXJfYj5cbWVzYS5qc29uYCB8Cit8IFZLX0lOU1RBTkNFX0xBWUVSUyAgICAgICAgICAgICAgICB8IEZvcmNlIHRoZSBsb2FkZXIgdG8gYWRkIHRoZSBnaXZlbiBsYXllcnMgdG8gdGhlIGxpc3Qgb2YgRW5hYmxlZCBsYXllcnMgbm9ybWFsbHkgcGFzc2VkIGludG8gYHZrQ3JlYXRlSW5zdGFuY2VgLiAgVGhlc2UgbGF5ZXJzIGFyZSBhZGRlZCBmaXJzdCwgYW5kIHRoZSBsb2FkZXIgd2lsbCByZW1vdmUgYW55IGR1cGxpY2F0ZSBsYXllcnMgdGhhdCBhcHBlYXIgaW4gYm90aCB0aGlzIGxpc3QgYXMgd2VsbCBhcyB0aGF0IHBhc3NlZCBpbnRvIGBwcEVuYWJsZWRMYXllck5hbWVzYC4gfCBgZXhwb3J0IFZLX0lOU1RBTkNFX0xBWUVSUz08bGF5ZXJfYT46PGxheWVyX2I+YDxici8+PGJyLz5gc2V0IFZLX0lOU1RBTkNFX0xBWUVSUz08bGF5ZXJfYT47PGxheWVyX2I+YCB8Cit8IFZLX0xBWUVSX1BBVEggICAgICAgICAgICAgICAgICAgICB8IE92ZXJyaWRlIHRoZSBsb2FkZXIncyBzdGFuZGFyZCBMYXllciBsaWJyYXJ5IHNlYXJjaCBmb2xkZXJzIGFuZCB1c2UgdGhlIHByb3ZpZGVkIGRlbGltaXRlZCBmb2xkZXJzIHRvIHNlYXJjaCBmb3IgbGF5ZXIgTWFuaWZlc3QgZmlsZXMuIHwgYGV4cG9ydCBWS19MQVlFUl9QQVRIPTxwYXRoX2E+OjxwYXRoX2I+YDxici8+PGJyLz5gc2V0IFZLX0xBWUVSX1BBVEg9PHBhdGhfYT47PHBhdGhfYj5gIHwKK3wgVktfTE9BREVSX0RJU0FCTEVfSU5TVF9FWFRfRklMVEVSIHwgRGlzYWJsZSB0aGUgZmlsdGVyaW5nIG91dCBvZiBpbnN0YW5jZSBleHRlbnNpb25zIHRoYXQgdGhlIGxvYWRlciBkb2Vzbid0IGtub3cgYWJvdXQuICBUaGlzIHdpbGwgYWxsb3cgYXBwbGljYXRpb25zIHRvIGVuYWJsZSBpbnN0YW5jZSBleHRlbnNpb25zIGV4cG9zZWQgYnkgSUNEcyBidXQgdGhhdCB0aGUgbG9hZGVyIGhhcyBubyBzdXBwb3J0IGZvci4gICoqTk9URToqKiBUaGlzIG1heSBjYXVzZSB0aGUgbG9hZGVyIG9yIGFwcGxpY2F0aW9uIHRvIGNyYXNoLiB8ICBgZXhwb3J0IFZLX0xPQURFUl9ESVNBQkxFX0lOU1RfRVhUX0ZJTFRFUj0xYDxici8+PGJyLz5gc2V0IFZLX0xPQURFUl9ESVNBQkxFX0lOU1RfRVhUX0ZJTFRFUj0xYCB8Cit8IFZLX0xPQURFUl9ERUJVRyAgICAgICAgICAgICAgICAgICB8IEVuYWJsZSBsb2FkZXIgZGVidWcgbWVzc2FnZXMuICBPcHRpb25zIGFyZTo8YnIvPi0gZXJyb3IgKG9ubHkgZXJyb3JzKTxici8+LSB3YXJuICh3YXJuaW5ncyBhbmQgZXJyb3JzKTxici8+LSBpbmZvIChpbmZvLCB3YXJuaW5nLCBhbmQgZXJyb3JzKTxici8+IC0gZGVidWcgKGRlYnVnICsgYWxsIGJlZm9yZSkgPGJyLz4gLWFsbCAocmVwb3J0IG91dCBhbGwgbWVzc2FnZXMpIHwgYGV4cG9ydCBWS19MT0FERVJfREVCVUc9YWxsYDxici8+PGJyLz5gc2V0IFZLX0xPQURFUl9ERUJVRz13YXJuYCB8CisgCisjIyBHbG9zc2FyeSBvZiBUZXJtcworCit8IEZpZWxkIE5hbWUgfCBGaWVsZCBWYWx1ZSB8Cit8Oi0tLTp8LS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IEFuZHJvaWQgTG9hZGVyIHwgVGhlIGxvYWRlciBkZXNpZ25lZCB0byB3b3JrIHByaW1hcmlseSBmb3IgdGhlIEFuZHJvaWQgT1MuICBUaGlzIGlzIGdlbmVyYXRlZCBmcm9tIGEgZGlmZmVyZW50IGNvZGUgYmFzZSB0aGFuIHRoZSBkZXNrdG9wIGxvYWRlci4gIEJ1dCwgaW4gYWxsIGltcG9ydGFudCBhc3BlY3RzLCBpdCBzaG91bGQgYmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQuIHwKK3wgRGVza3RvcCBMb2FkZXIgfCBUaGUgbG9hZGVyIGRlc2lnbmVkIHRvIHdvcmsgb24gV2luZG93cywgTGludXggYW5kIG1hY09TLiAgVGhpcyBpcyBnZW5lcmF0ZWQgZnJvbSBhIGRpZmZlcmVudCBbY29kZSBiYXNlXSgjaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tTG9hZGVyKSB0aGFuIHRoZSBBbmRyb2lkIGxvYWRlci4gIEJ1dCBpbiBhbGwgaW1wb3J0YW50IGFzcGVjdHMsIGl0IHNob3VsZCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4gfAorfCBDb3JlIEZ1bmN0aW9uIHwgQSBmdW5jdGlvbiB0aGF0IGlzIGFscmVhZHkgcGFydCBvZiB0aGUgVnVsa2FuIGNvcmUgc3BlY2lmaWNhdGlvbiBhbmQgbm90IGFuIGV4dGVuc2lvbi4gIEZvciBleGFtcGxlLCB2a0NyZWF0ZURldmljZSgpLiB8Cit8IERldmljZSBDYWxsIENoYWluIHwgVGhlIGNhbGwgY2hhaW4gb2YgZnVuY3Rpb25zIGZvbGxvd2VkIGZvciBkZXZpY2UgZnVuY3Rpb25zLiAgVGhpcyBjYWxsIGNoYWluIGZvciBhIGRldmljZSBmdW5jdGlvbiBpcyB1c3VhbGx5IGFzIGZvbGxvd3M6IGZpcnN0IHRoZSBhcHBsaWNhdGlvbiBjYWxscyBpbnRvIGEgbG9hZGVyIHRyYW1wb2xpbmUsIHRoZW4gdGhlIGxvYWRlciB0cmFtcG9saW5lIGNhbGxzIGVuYWJsZWQgbGF5ZXJzLCBhbmQgdGhlIGZpbmFsIGxheWVyIGNhbGxzIGludG8gdGhlIElDRCBzcGVjaWZpYyB0byB0aGUgZGV2aWNlLiAgU2VlIHRoZSBbRGlzcGF0Y2ggVGFibGVzIGFuZCBDYWxsIENoYWluc10oI2Rpc3BhdGNoLXRhYmxlcy1hbmQtY2FsbC1jaGFpbnMpIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gfAorfCBEZXZpY2UgRnVuY3Rpb24gfCBBIERldmljZSBmdW5jdGlvbiBpcyBhbnkgVnVsa2FuIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgYFZrRGV2aWNlYCwgYFZrUXVldWVgLCBgVmtDb21tYW5kQnVmZmVyYCwgb3IgYW55IGNoaWxkIG9mIHRoZXNlLCBhcyBpdHMgZmlyc3QgcGFyYW1ldGVyLiAgU29tZSBWdWxrYW4gRGV2aWNlIGZ1bmN0aW9ucyBhcmU6IGB2a1F1ZXVlU3VibWl0YCwgYHZrQmVnaW5Db21tYW5kQnVmZmVyYCwgYHZrQ3JlYXRlRXZlbnRgLiAgU2VlIHRoZSBbSW5zdGFuY2UgVmVyc3VzIERldmljZV0oI2luc3RhbmNlLXZlcnN1cy1kZXZpY2UpIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIHwKK3wgRGlzY292ZXJ5IHwgVGhlIHByb2Nlc3Mgb2YgdGhlIGxvYWRlciBzZWFyY2hpbmcgZm9yIElDRCBhbmQgTGF5ZXIgZmlsZXMgdG8gc2V0IHVwIHRoZSBpbnRlcm5hbCBsaXN0IG9mIFZ1bGthbiBvYmplY3RzIGF2YWlsYWJsZS4gIE9uIFdpbmRvd3MvTGludXgvbWFjT1MsIHRoZSBkaXNjb3ZlcnkgcHJvY2VzcyB0eXBpY2FsbHkgZm9jdXNlcyBvbiBzZWFyY2hpbmcgZm9yIE1hbmlmZXN0IGZpbGVzLiAgT24gQW5kcm9pZCwgdGhlIHByb2Nlc3MgZm9jdXNlcyBvbiBzZWFyY2hpbmcgZm9yIGxpYnJhcnkgZmlsZXMuIHwKK3wgRGlzcGF0Y2ggVGFibGUgfCBBbiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyAoaW5jbHVkaW5nIGNvcmUgYW5kIHBvc3NpYmx5IGV4dGVuc2lvbiBmdW5jdGlvbnMpIHVzZWQgdG8gc3RlcCB0byB0aGUgbmV4dCBlbnRpdHkgaW4gYSBjYWxsIGNoYWluLiAgVGhlIGVudGl0eSBjb3VsZCBiZSB0aGUgbG9hZGVyLCBhIGxheWVyIG9yIGFuIElDRC4gIFNlZSBbRGlzcGF0Y2ggVGFibGVzIGFuZCBDYWxsIENoYWluc10oI2Rpc3BhdGNoLXRhYmxlcy1hbmQtY2FsbC1jaGFpbnMpIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgfAorfCBFeHRlbnNpb24gfCBBIGNvbmNlcHQgb2YgVnVsa2FuIHVzZWQgdG8gZXhwYW5kIHRoZSBjb3JlIFZ1bGthbiBmdW5jdGlvbmFsaXR5LiAgRXh0ZW5zaW9ucyBtYXkgYmUgSUhWLXNwZWNpZmljLCBwbGF0Zm9ybS1zcGVjaWZpYywgb3IgbW9yZSBicm9hZGx5IGF2YWlsYWJsZS4gIFlvdSBzaG91bGQgYWx3YXlzIHF1ZXJ5IGlmIGFuIGV4dGVuc2lvbiBleGlzdHMsIGFuZCBlbmFibGUgaXQgZHVyaW5nIGB2a0NyZWF0ZUluc3RhbmNlYCAoaWYgaXQgaXMgYW4gaW5zdGFuY2UgZXh0ZW5zaW9uKSBvciBkdXJpbmcgYHZrQ3JlYXRlRGV2aWNlYCAoaWYgaXQgaXMgYSBkZXZpY2UgZXh0ZW5zaW9uKS4gfAorfCBJQ0QgfCBBY3JvbnltIGZvciBJbnN0YWxsYWJsZSBDbGllbnQgRHJpdmVyLiAgVGhlc2UgYXJlIGRyaXZlcnMgdGhhdCBhcmUgcHJvdmlkZWQgYnkgSUhWcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBoYXJkd2FyZSB0aGV5IHByb3ZpZGUuICBTZWUgW0luc3RhbGxhYmxlIENsaWVudCBEcml2ZXJzXSgjaW5zdGFsbGFibGUtY2xpZW50LWRyaXZlcnMpIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCit8IElIViB8IEFjcm9ueW0gZm9yIGFuIEluZGVwZW5kZW50IEhhcmR3YXJlIFZlbmRvci4gIFR5cGljYWxseSB0aGUgY29tcGFueSB0aGF0IGJ1aWx0IHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIHRlY2hub2xvZ3kgeW91IGFyZSB0cnlpbmcgdG8gdXNlLiAgQSB0eXBpY2FsIGV4YW1wbGVzIGZvciBhIEdyYXBoaWNzIElIViBhcmU6IEFNRCwgQVJNLCBJbWFnaW5hdGlvbiwgSW50ZWwsIE52aWRpYSwgUXVhbGNvbW0sIGV0Yy4gfAorfCBJbnN0YW5jZSBDYWxsIENoYWluIHwgVGhlIGNhbGwgY2hhaW4gb2YgZnVuY3Rpb25zIGZvbGxvd2VkIGZvciBpbnN0YW5jZSBmdW5jdGlvbnMuICBUaGlzIGNhbGwgY2hhaW4gZm9yIGFuIGluc3RhbmNlIGZ1bmN0aW9uIGlzIHVzdWFsbHkgYXMgZm9sbG93czogZmlyc3QgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIGludG8gYSBsb2FkZXIgdHJhbXBvbGluZSwgdGhlbiB0aGUgbG9hZGVyIHRyYW1wb2xpbmUgY2FsbHMgZW5hYmxlZCBsYXllcnMsIHRoZSBmaW5hbCBsYXllciBjYWxscyBhIGxvYWRlciB0ZXJtaW5hdG9yLCBhbmQgdGhlIGxvYWRlciB0ZXJtaW5hdG9yIGNhbGxzIGFsbCBhdmFpbGFibGUgSUNEcy4gIFNlZSB0aGUgW0Rpc3BhdGNoIFRhYmxlcyBhbmQgQ2FsbCBDaGFpbnNdKCNkaXNwYXRjaC10YWJsZXMtYW5kLWNhbGwtY2hhaW5zKSBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIHwKK3wgSW5zdGFuY2UgRnVuY3Rpb24gfCBBbiBJbnN0YW5jZSBmdW5jdGlvbiBpcyBhbnkgVnVsa2FuIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXIgZWl0aGVyIGEgYFZrSW5zdGFuY2VgIG9yIGEgYFZrUGh5c2ljYWxEZXZpY2VgIG9yIG5vdGhpbmcgYXQgYWxsLiAgU29tZSBWdWxrYW4gSW5zdGFuY2UgZnVuY3Rpb25zIGFyZTogYHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzYCwgYHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzYCwgYHZrQ3JlYXRlSW5zdGFuY2VgLCBgdmtEZXN0cm95SW5zdGFuY2VgLiAgU2VlIHRoZSBbSW5zdGFuY2UgVmVyc3VzIERldmljZV0oI2luc3RhbmNlLXZlcnN1cy1kZXZpY2UpIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIHwKK3wgTGF5ZXIgfCBMYXllcnMgYXJlIG9wdGlvbmFsIGNvbXBvbmVudHMgdGhhdCBhdWdtZW50IHRoZSBWdWxrYW4gc3lzdGVtLiAgVGhleSBjYW4gaW50ZXJjZXB0LCBldmFsdWF0ZSwgYW5kIG1vZGlmeSBleGlzdGluZyBWdWxrYW4gZnVuY3Rpb25zIG9uIHRoZWlyIHdheSBmcm9tIHRoZSBhcHBsaWNhdGlvbiBkb3duIHRvIHRoZSBoYXJkd2FyZS4gIFNlZSB0aGUgW0xheWVyc10oI2xheWVycykgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gfAorfCBMb2FkZXIgfCBUaGUgbWlkZGxld2FyZSBwcm9ncmFtIHdoaWNoIGFjdHMgYXMgdGhlIG1lZGlhdG9yIGJldHdlZW4gVnVsa2FuIGFwcGxpY2F0aW9ucywgVnVsa2FuIGxheWVycyBhbmQgVnVsa2FuIGRyaXZlcnMuICBTZWUgW1RoZSBMb2FkZXJdKCN0aGUtbG9hZGVyKSBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiB8Cit8IE1hbmlmZXN0IEZpbGVzIHwgRGF0YSBmaWxlcyBpbiBKU09OIGZvcm1hdCB1c2VkIGJ5IHRoZSBkZXNrdG9wIGxvYWRlci4gIFRoZXNlIGZpbGVzIGNvbnRhaW4gc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGVpdGhlciBhIFtMYXllcl0oI2xheWVyLW1hbmlmZXN0LWZpbGUtZm9ybWF0KSBvciBhbiBbSUNEXSgjaWNkLW1hbmlmZXN0LWZpbGUtZm9ybWF0KS4KK3wgVGVybWluYXRvciBGdW5jdGlvbiB8IFRoZSBsYXN0IGZ1bmN0aW9uIGluIHRoZSBpbnN0YW5jZSBjYWxsIGNoYWluIGFib3ZlIHRoZSBJQ0RzIGFuZCBvd25lZCBieSB0aGUgbG9hZGVyLiAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBpbiB0aGUgaW5zdGFuY2UgY2FsbCBjaGFpbiBiZWNhdXNlIGFsbCBpbnN0YW5jZSBmdW5jdGlvbmFsaXR5IG11c3QgYmUgY29tbXVuaWNhdGVkIHRvIGFsbCBJQ0RzIGNhcGFibGUgb2YgcmVjZWl2aW5nIHRoZSBjYWxsLiAgU2VlIFtEaXNwYXRjaCBUYWJsZXMgYW5kIENhbGwgQ2hhaW5zXSgjZGlzcGF0Y2gtdGFibGVzLWFuZC1jYWxsLWNoYWlucykgZm9yIG1vcmUgaW5mb3JtYXRpb24uIHwKK3wgVHJhbXBvbGluZSBGdW5jdGlvbiB8IFRoZSBmaXJzdCBmdW5jdGlvbiBpbiBhbiBpbnN0YW5jZSBvciBkZXZpY2UgY2FsbCBjaGFpbiBvd25lZCBieSB0aGUgbG9hZGVyIHdoaWNoIGhhbmRsZXMgdGhlIHNldCB1cCBhbmQgcHJvcGVyIGNhbGwgY2hhaW4gd2FsayB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZGlzcGF0Y2ggdGFibGUuICBPbiBkZXZpY2UgZnVuY3Rpb25zIChpbiB0aGUgZGV2aWNlIGNhbGwgY2hhaW4pIHRoaXMgZnVuY3Rpb24gY2FuIGFjdHVhbGx5IGJlIHNraXBwZWQuICBTZWUgW0Rpc3BhdGNoIFRhYmxlcyBhbmQgQ2FsbCBDaGFpbnNdKCNkaXNwYXRjaC10YWJsZXMtYW5kLWNhbGwtY2hhaW5zKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gfAorfCBXU0kgRXh0ZW5zaW9uIHwgQWNyb255bSBmb3IgV2luZG93aW5nIFN5c3RlbSBJbnRlZ3JhdGlvbi4gIEEgVnVsa2FuIGV4dGVuc2lvbiB0YXJnZXRpbmcgYSBwYXJ0aWN1bGFyIFdpbmRvd2luZyBzeXN0ZW0gYW5kIGRlc2lnbmVkIHRvIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBXaW5kb3dpbmcgc3lzdGVtIGFuZCBWdWxrYW4uIFNlZSBbV1NJIEV4dGVuc2lvbnNdKCN3c2ktZXh0ZW5zaW9ucykgZm9yIG1vcmUgaW5mb3JtYXRpb24uIHwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmMTNiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNSBAQAorIyBMb2FkZXIgU3BlY2lmaWNhdGlvbiBhbmQgSW50ZXJmYWNlcworU2VlIExvYWRlckFuZExheWVySW50ZXJmYWNlLm1kIGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLgorCisjIEJ1aWxkaW5nCitCdWlsZHMgZm9yIExpbnV4LCBXaW5kb3dzLCBhbmQgTWFjT1MgYXJlIHN1cHBvcnRlZCB2aWEgQ01ha2UuIFNlZSB0b3AgbGV2ZWwgQlVJTEQubWQgZmlsZS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvYWRhcHRlcnMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvYWRhcHRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjk3ZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9hZGFwdGVycy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqIENvcHlyaWdodCAoYykgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorKiBDb3B5cmlnaHQgKGMpIDIwMTkgTHVuYXJHLCBJbmMuCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqIEF1dGhvcjogTGVubnkgS29tb3cgPGxlbm55QGx1bmFyZy5jb20+CisqLworCit0eXBlZGVmIHN0cnVjdCBMb2FkZXJFbnVtQWRhcHRlcnMyIHsKKyAgICBVTE9ORyBhZGFwdGVyX2NvdW50OworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQgaGFuZGxlOworICAgICAgICBMVUlEIGx1aWQ7CisgICAgICAgIFVMT05HIHNvdXJjZV9jb3VudDsKKyAgICAgICAgQk9PTCBwcmVzZW50X21vdmVfcmVnaW9uc19wcmVmZXJyZWQ7CisgICAgfSAqIGFkYXB0ZXJzOworfSBMb2FkZXJFbnVtQWRhcHRlcnMyOworCit0eXBlZGVmIF9DaGVja19yZXR1cm5fIE5UU1RBVFVTKEFQSUVOVFJZICpQRk5fTG9hZGVyRW51bUFkYXB0ZXJzMikoY29uc3QgTG9hZGVyRW51bUFkYXB0ZXJzMiAqKTsKKwordHlwZWRlZiBlbnVtIEFkYXB0ZXJJbmZvVHlwZSB7CisgICAgTE9BREVSX1FVRVJZX1RZUEVfUkVHSVNUUlkgPSA0OCwKK30gQWRhcHRlckluZm9UeXBlOworCit0eXBlZGVmIHN0cnVjdCBMb2FkZXJRdWVyeUFkYXB0ZXJJbmZvIHsKKyAgICBVSU5UIGhhbmRsZTsKKyAgICBBZGFwdGVySW5mb1R5cGUgdHlwZTsKKyAgICBWT0lEICpwcml2YXRlX2RhdGE7CisgICAgVUlOVCBwcml2YXRlX2RhdGFfc2l6ZTsKK30gTG9hZGVyUXVlcnlBZGFwdGVySW5mbzsKKwordHlwZWRlZiBfQ2hlY2tfcmV0dXJuXyBOVFNUQVRVUyhBUElFTlRSWSAqUEZOX0xvYWRlclF1ZXJ5QWRhcHRlckluZm8pKGNvbnN0IExvYWRlclF1ZXJ5QWRhcHRlckluZm8gKik7CisKK3R5cGVkZWYgZW51bSBMb2FkZXJRdWVyeVJlZ2lzdHJ5VHlwZSB7CisgICAgTE9BREVSX1FVRVJZX1JFR0lTVFJZX0FEQVBURVJfS0VZID0gMSwKK30gTG9hZGVyUXVlcnlSZWdpc3RyeVR5cGU7CisKK3R5cGVkZWYgZW51bSBMb2FkZXJRdWVyeVJlZ2lzdHJ5U3RhdHVzIHsKKyAgICBMT0FERVJfUVVFUllfUkVHSVNUUllfU1RBVFVTX1NVQ0NFU1MgPSAwLAorICAgIExPQURFUl9RVUVSWV9SRUdJU1RSWV9TVEFUVVNfQlVGRkVSX09WRVJGTE9XID0gMSwKK30gTG9hZGVyUXVlcnlSZWdpc3RyeVN0YXR1czsKKwordHlwZWRlZiBzdHJ1Y3QgTG9hZGVyUXVlcnlSZWdpc3RyeUZsYWdzIHsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBVSU5UIHRyYW5zbGF0ZV9wYXRoIDogMTsKKyAgICAgICAgICAgIFVJTlQgbXV0YWJsZV92YWx1ZSA6IDE7CisgICAgICAgICAgICBVSU5UIHJlc2VydmVkIDogMzA7CisgICAgICAgIH07CisgICAgICAgIFVJTlQgdmFsdWU7CisgICAgfTsKK30gTG9hZGVyUXVlcnlSZWdpc3RyeUZsYWdzOworCit0eXBlZGVmIHN0cnVjdCBMb2FkZXJRdWVyeVJlZ2lzdHJ5SW5mbyB7CisgICAgTG9hZGVyUXVlcnlSZWdpc3RyeVR5cGUgcXVlcnlfdHlwZTsKKyAgICBMb2FkZXJRdWVyeVJlZ2lzdHJ5RmxhZ3MgcXVlcnlfZmxhZ3M7CisgICAgV0NIQVIgdmFsdWVfbmFtZVtNQVhfUEFUSF07CisgICAgVUxPTkcgdmFsdWVfdHlwZTsKKyAgICBVTE9ORyBwaHlzaWNhbF9hZGFwdGVyX2luZGV4OworICAgIFVMT05HIG91dHB1dF92YWx1ZV9zaXplOworICAgIExvYWRlclF1ZXJ5UmVnaXN0cnlTdGF0dXMgc3RhdHVzOworICAgIHVuaW9uIHsKKyAgICAgICAgRFdPUkQgb3V0cHV0X2R3b3JkOworICAgICAgICBVSU5UNjQgb3V0cHV0X3F3b3JkOworICAgICAgICBXQ0hBUiBvdXRwdXRfc3RyaW5nWzFdOworICAgICAgICBCWVRFIG91dHB1dF9iaW5hcnlbMV07CisgICAgfTsKK30gTG9hZGVyUXVlcnlSZWdpc3RyeUluZm87CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2FzbV9vZmZzZXQuYyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvYXNtX29mZnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODMyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2FzbV9vZmZzZXQuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTGVubnkgS29tb3cgPGxlbm55QGx1bmFyZy5jb20+CisgKi8KKworLy8gVGhpcyBjb2RlIGdlbmVyYXRlcyBhbiBhc3NlbWJseSBmaWxlIHdoaWNoIHByb3ZpZGVzIG9mZnNldHMgdG8gZ2V0IHN0cnVjdCBtZW1iZXJzIGZyb20gYXNzZW1ibHkgY29kZS4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAibG9hZGVyLmgiCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDApCisjZGVmaW5lIFNJWkVfVF9GTVQgIiUtOHp1IgorI2Vsc2UKKyNkZWZpbmUgU0laRV9UX0ZNVCAiJS04bHUiCisjZW5kaWYKKworc3RydWN0IFZhbHVlSW5mbworeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgc2l6ZV90IHZhbHVlOworICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQ7Cit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBjb25zdCBjaGFyICphc3NlbWJsZXIgPSBOVUxMOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7CisgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICJNQVNNIikpIHsKKyAgICAgICAgICAgIGFzc2VtYmxlciA9ICJNQVNNIjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJHQVMiKSkgeworICAgICAgICAgICAgYXNzZW1ibGVyID0gIkdBUyI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFzc2VtYmxlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0cnVjdCBWYWx1ZUluZm8gdmFsdWVzW10gPSB7CisgICAgICAgIHsgLm5hbWUgPSAiVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQiLCAudmFsdWUgPSAoc2l6ZV90KSBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgIC5jb21tZW50ID0gIlRoZSBudW1lcmljYWwgdmFsdWUgb2YgdGhlIGVudW0gdmFsdWUgJ1ZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUJyIgfSwKKyAgICAgICAgeyAubmFtZSA9ICJQVFJfU0laRSIsIC52YWx1ZSA9IHNpemVvZih2b2lkKiksCisgICAgICAgICAgICAuY29tbWVudCA9ICJUaGUgc2l6ZSBvZiBhIHBvaW50ZXIiIH0sCisgICAgICAgIHsgLm5hbWUgPSAiSEFTSF9TSVpFIiwgLnZhbHVlID0gc2l6ZW9mKHN0cnVjdCBsb2FkZXJfZGlzcGF0Y2hfaGFzaF9lbnRyeSksCisgICAgICAgICAgICAuY29tbWVudCA9ICJUaGUgc2l6ZSBvZiBhICdsb2FkZXJfZGlzcGF0Y2hfaGFzaF9lbnRyeScgc3RydWN0IiB9LAorICAgICAgICB7IC5uYW1lID0gIkhBU0hfT0ZGU0VUX0lOU1RBTkNFIiwgLnZhbHVlID0gb2Zmc2V0b2Yoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSwgcGh5c19kZXZfZXh0X2Rpc3BfaGFzaCksCisgICAgICAgICAgICAuY29tbWVudCA9ICJUaGUgb2Zmc2V0IG9mICdwaHlzX2Rldl9leHRfZGlzcF9oYXNoJyB3aXRoaW4gYSAnbG9hZGVyX2luc3RhbmNlJyBzdHJ1Y3QiIH0sCisgICAgICAgIHsgLm5hbWUgPSAiUEhZU19ERVZfT0ZGU0VUX0lOU1RfRElTUEFUQ0giLCAudmFsdWUgPSBvZmZzZXRvZihzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLCBwaHlzX2Rldl9leHQpLAorICAgICAgICAgICAgLmNvbW1lbnQgPSAiVGhlIG9mZnNldCBvZiAncGh5c19kZXZfZXh0JyB3aXRoaW4gaW4gJ2xvYWRlcl9pbnN0YW5jZV9kaXNwYXRjaF90YWJsZScgc3RydWN0IiB9LAorICAgICAgICB7IC5uYW1lID0gIlBIWVNfREVWX09GRlNFVF9QSFlTX0RFVl9UUkFNUCIsIC52YWx1ZSA9IG9mZnNldG9mKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wLCBwaHlzX2RldiksCisgICAgICAgICAgICAuY29tbWVudCA9ICJUaGUgb2Zmc2V0IG9mICdwaHlzX2Rldicgd2l0aGluIGEgJ2xvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAnIHN0cnVjdCIgfSwKKyAgICAgICAgeyAubmFtZSA9ICJJQ0RfVEVSTV9PRkZTRVRfUEhZU19ERVZfVEVSTSIsIC52YWx1ZSA9IG9mZnNldG9mKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0sIHRoaXNfaWNkX3Rlcm0pLAorICAgICAgICAgICAgLmNvbW1lbnQgPSAiVGhlIG9mZnNldCBvZiAndGhpc19pY2RfdGVybScgd2l0aGluIGEgJ2xvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybScgc3RydWN0IiB9LAorICAgICAgICB7IC5uYW1lID0gIlBIWVNfREVWX09GRlNFVF9QSFlTX0RFVl9URVJNIiwgLnZhbHVlID0gb2Zmc2V0b2Yoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSwgcGh5c19kZXYpLAorICAgICAgICAgICAgLmNvbW1lbnQgPSAiVGhlIG9mZnNldCBvZiAncGh5c19kZXYnIHdpdGhpbiBhICdsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0nIHN0cnVjdCIgfSwKKyAgICAgICAgeyAubmFtZSA9ICJJTlNUQU5DRV9PRkZTRVRfSUNEX1RFUk0iLCAudmFsdWUgPSBvZmZzZXRvZihzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtLCB0aGlzX2luc3RhbmNlKSwKKyAgICAgICAgICAgIC5jb21tZW50ID0gIlRoZSBvZmZzZXQgb2YgJ3RoaXNfaW5zdGFuY2UnIHdpdGhpbiBhICdsb2FkZXJfaWNkX3Rlcm0nIHN0cnVjdCIgfSwKKyAgICAgICAgeyAubmFtZSA9ICJESVNQQVRDSF9PRkZTRVRfSUNEX1RFUk0iLCAudmFsdWUgPSBvZmZzZXRvZihzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtLCBwaHlzX2Rldl9leHQpLAorICAgICAgICAgICAgLmNvbW1lbnQgPSAiVGhlIG9mZnNldCBvZiAncGh5c19kZXZfZXh0JyB3aXRoaW4gYSAnbG9hZGVyX2ljZF90ZXJtJyBzdHJ1Y3QiIH0sCisgICAgICAgIHsgLm5hbWUgPSAiRlVOQ19OQU1FX09GRlNFVF9IQVNIIiwgLnZhbHVlID0gb2Zmc2V0b2Yoc3RydWN0IGxvYWRlcl9kaXNwYXRjaF9oYXNoX2VudHJ5LCBmdW5jX25hbWUpLAorICAgICAgICAgICAgLmNvbW1lbnQgPSAiVGhlIG9mZnNldCBvZiAnZnVuY19uYW1lJyB3aXRoaW4gYSAnbG9hZGVyX2Rpc3BhdGNoX2hhc2hfZW50cnknIHN0cnVjdCIgfSwKKyAgICAgICAgeyAubmFtZSA9ICJFWFRfT0ZGU0VUX0RFVklDRV9ESVNQQVRDSCIsIC52YWx1ZSA9IG9mZnNldG9mKHN0cnVjdCBsb2FkZXJfZGV2X2Rpc3BhdGNoX3RhYmxlLCBleHRfZGlzcGF0Y2gpLAorICAgICAgICAgICAgLmNvbW1lbnQgPSAiVGhlIG9mZnNldCBvZiAnZXh0X2Rpc3BhdGNoJyB3aXRoaW4gYSAnbG9hZGVyX2Rldl9kaXNwYXRjaF90YWJsZScgc3RydWN0IiB9LAorICAgIH07CisKKyAgICBGSUxFICpmaWxlID0gZm9wZW4oImdlbl9kZWZpbmVzLmFzbSIsICJ3Iik7CisgICAgZnByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBpZiAoIXN0cmNtcChhc3NlbWJsZXIsICJNQVNNIikpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YodmFsdWVzKS9zaXplb2YodmFsdWVzWzBdKTsgKytpKSB7CisgICAgICAgICAgICBmcHJpbnRmKGZpbGUsICIlLTMycyBlcXUgIiBTSVpFX1RfRk1UICI7ICVzXG4iLCB2YWx1ZXNbaV0ubmFtZSwgdmFsdWVzW2ldLnZhbHVlLCB2YWx1ZXNbaV0uY29tbWVudCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXNzZW1ibGVyLCAiR0FTIikpIHsKKyNpZmRlZiBfX3g4Nl82NF9fCisgICAgICAgIGZwcmludGYoZmlsZSwgIi5zZXQgWDg2XzY0LCAxXG4iKTsKKyNlbmRpZiAvLyBfX3g4Nl82NF9fCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHZhbHVlcykvc2l6ZW9mKHZhbHVlc1swXSk7ICsraSkgeworICAgICAgICAgICAgZnByaW50ZihmaWxlLCAiLnNldCAlLTMycywgIiBTSVpFX1RfRk1UICIjICVzXG4iLCB2YWx1ZXNbaV0ubmFtZSwgdmFsdWVzW2ldLnZhbHVlLCB2YWx1ZXNbaV0uY29tbWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZjbG9zZShmaWxlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvYXNtX3Rlc3QuUyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvYXNtX3Rlc3QuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk3NGRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9hc21fdGVzdC5TCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLmludGVsX3N5bnRheCBub3ByZWZpeAorLnRleHQKKy5nbG9iYWwgc2FtcGxlCisuc2V0IFBIWVNfREVWX09GRlNFVF9JTlNUX0RJU1BBVENILCAxMAorLnNldCBQVFJfU0laRSwgNAorc2FtcGxlOgorICBtb3YgZWN4LCBbZWF4ICsgKFBIWVNfREVWX09GRlNFVF9JTlNUX0RJU1BBVENIICsgKFBUUl9TSVpFICogNCkpXQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9jSlNPTi5jIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9jSlNPTi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTZkODMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2NKU09OLmMKQEAgLTAsMCArMSwxMjE1IEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDkgRGF2ZSBHYW1ibGUKKyAgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKworICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICBUSEUgU09GVFdBUkUuCisqLworCisvKiBjSlNPTiAqLworLyogSlNPTiBwYXJzZXIgaW4gQy4gKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJjSlNPTi5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqZXA7CisKK2NvbnN0IGNoYXIgKmNKU09OX0dldEVycm9yUHRyKHZvaWQpIHsgcmV0dXJuIGVwOyB9CisKK3N0YXRpYyB2b2lkICooKmNKU09OX21hbGxvYykoc2l6ZV90IHN6KSA9IG1hbGxvYzsKK3N0YXRpYyB2b2lkICgqY0pTT05fZnJlZSkodm9pZCAqcHRyKSA9IGZyZWU7CisKK3N0YXRpYyBjaGFyICpjSlNPTl9zdHJkdXAoY29uc3QgY2hhciAqc3RyKSB7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyICpjb3B5OworCisgICAgbGVuID0gc3RybGVuKHN0cikgKyAxOworICAgIGlmICghKGNvcHkgPSAoY2hhciAqKWNKU09OX21hbGxvYyhsZW4pKSkgcmV0dXJuIDA7CisgICAgbWVtY3B5KGNvcHksIHN0ciwgbGVuKTsKKyAgICByZXR1cm4gY29weTsKK30KKwordm9pZCBjSlNPTl9Jbml0SG9va3MoY0pTT05fSG9va3MgKmhvb2tzKSB7CisgICAgaWYgKCFob29rcykgeyAvKiBSZXNldCBob29rcyAqLworICAgICAgICBjSlNPTl9tYWxsb2MgPSBtYWxsb2M7CisgICAgICAgIGNKU09OX2ZyZWUgPSBmcmVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY0pTT05fbWFsbG9jID0gKGhvb2tzLT5tYWxsb2NfZm4pID8gaG9va3MtPm1hbGxvY19mbiA6IG1hbGxvYzsKKyAgICBjSlNPTl9mcmVlID0gKGhvb2tzLT5mcmVlX2ZuKSA/IGhvb2tzLT5mcmVlX2ZuIDogZnJlZTsKK30KKworLyogSW50ZXJuYWwgY29uc3RydWN0b3IuICovCitzdGF0aWMgY0pTT04gKmNKU09OX05ld19JdGVtKHZvaWQpIHsKKyAgICBjSlNPTiAqbm9kZSA9IChjSlNPTiAqKWNKU09OX21hbGxvYyhzaXplb2YoY0pTT04pKTsKKyAgICBpZiAobm9kZSkgbWVtc2V0KG5vZGUsIDAsIHNpemVvZihjSlNPTikpOworICAgIHJldHVybiBub2RlOworfQorCisvKiBEZWxldGUgYSBjSlNPTiBzdHJ1Y3R1cmUuICovCit2b2lkIGNKU09OX0RlbGV0ZShjSlNPTiAqYykgeworICAgIGNKU09OICpuZXh0OworICAgIHdoaWxlIChjKSB7CisgICAgICAgIG5leHQgPSBjLT5uZXh0OworICAgICAgICBpZiAoIShjLT50eXBlICYgY0pTT05fSXNSZWZlcmVuY2UpICYmIGMtPmNoaWxkKSBjSlNPTl9EZWxldGUoYy0+Y2hpbGQpOworICAgICAgICBpZiAoIShjLT50eXBlICYgY0pTT05fSXNSZWZlcmVuY2UpICYmIGMtPnZhbHVlc3RyaW5nKSBjSlNPTl9mcmVlKGMtPnZhbHVlc3RyaW5nKTsKKyAgICAgICAgaWYgKCEoYy0+dHlwZSAmIGNKU09OX1N0cmluZ0lzQ29uc3QpICYmIGMtPnN0cmluZykgY0pTT05fZnJlZShjLT5zdHJpbmcpOworICAgICAgICBjSlNPTl9mcmVlKGMpOworICAgICAgICBjID0gbmV4dDsKKyAgICB9Cit9CisKK3ZvaWQgY0pTT05fRnJlZSh2b2lkICpwKSB7IGNKU09OX2ZyZWUocCk7IH0KKworLyogUGFyc2UgdGhlIGlucHV0IHRleHQgdG8gZ2VuZXJhdGUgYSBudW1iZXIsIGFuZCBwb3B1bGF0ZSB0aGUgcmVzdWx0IGludG8gaXRlbS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX251bWJlcihjSlNPTiAqaXRlbSwgY29uc3QgY2hhciAqbnVtKSB7CisgICAgZG91YmxlIG4gPSAwLCBzaWduID0gMSwgc2NhbGUgPSAwOworICAgIGludCBzdWJzY2FsZSA9IDAsIHNpZ25zdWJzY2FsZSA9IDE7CisKKyAgICBpZiAoKm51bSA9PSAnLScpIHNpZ24gPSAtMSwgbnVtKys7IC8qIEhhcyBzaWduPyAqLworICAgIGlmICgqbnVtID09ICcwJykgbnVtKys7ICAgICAgICAgICAgLyogaXMgemVybyAqLworICAgIGlmICgqbnVtID49ICcxJyAmJiAqbnVtIDw9ICc5JykgZG8KKyAgICAgICAgICAgIG4gPSAobiAqIDEwLjApICsgKCpudW0rKyAtICcwJyk7CisgICAgICAgIHdoaWxlICgqbnVtID49ICcwJyAmJiAqbnVtIDw9ICc5Jyk7IC8qIE51bWJlcj8gKi8KKyAgICBpZiAoKm51bSA9PSAnLicgJiYgbnVtWzFdID49ICcwJyAmJiBudW1bMV0gPD0gJzknKSB7CisgICAgICAgIG51bSsrOworICAgICAgICBkbworICAgICAgICAgICAgbiA9IChuICogMTAuMCkgKyAoKm51bSsrIC0gJzAnKSwgc2NhbGUtLTsKKyAgICAgICAgd2hpbGUgKCpudW0gPj0gJzAnICYmICpudW0gPD0gJzknKTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyYWN0aW9uYWwgcGFydD8gKi8KKyAgICBpZiAoKm51bSA9PSAnZScgfHwgKm51bSA9PSAnRScpIC8qIEV4cG9uZW50PyAqLworICAgIHsKKyAgICAgICAgbnVtKys7CisgICAgICAgIGlmICgqbnVtID09ICcrJykKKyAgICAgICAgICAgIG51bSsrOworICAgICAgICBlbHNlIGlmICgqbnVtID09ICctJykKKyAgICAgICAgICAgIHNpZ25zdWJzY2FsZSA9IC0xLCBudW0rKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaXRoIHNpZ24/ICovCisgICAgICAgIHdoaWxlICgqbnVtID49ICcwJyAmJiAqbnVtIDw9ICc5Jykgc3Vic2NhbGUgPSAoc3Vic2NhbGUgKiAxMCkgKyAoKm51bSsrIC0gJzAnKTsgLyogTnVtYmVyPyAqLworICAgIH0KKworICAgIG4gPSBzaWduICogbiAqIHBvdygxMC4wLCAoc2NhbGUgKyBzdWJzY2FsZSAqIHNpZ25zdWJzY2FsZSkpOyAvKiBudW1iZXIgPSArLy0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLmZyYWN0aW9uICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBeKy8tIGV4cG9uZW50ICovCisKKyAgICBpdGVtLT52YWx1ZWRvdWJsZSA9IG47CisgICAgaXRlbS0+dmFsdWVpbnQgPSAoaW50KW47CisgICAgaXRlbS0+dHlwZSA9IGNKU09OX051bWJlcjsKKyAgICByZXR1cm4gbnVtOworfQorCitzdGF0aWMgc2l6ZV90IHBvdzJndChzaXplX3QgeCkgeworICAgIC0teDsKKyAgICB4IHw9IHggPj4gMTsKKyAgICB4IHw9IHggPj4gMjsKKyAgICB4IHw9IHggPj4gNDsKKyAgICB4IHw9IHggPj4gODsKKyAgICB4IHw9IHggPj4gMTY7CisgICAgcmV0dXJuIHggKyAxOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqYnVmZmVyOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgc2l6ZV90IG9mZnNldDsKK30gcHJpbnRidWZmZXI7CisKK3N0YXRpYyBjaGFyICplbnN1cmUocHJpbnRidWZmZXIgKnAsIHNpemVfdCBuZWVkZWQpIHsKKyAgICBjaGFyICpuZXdidWZmZXI7CisgICAgc2l6ZV90IG5ld3NpemU7CisgICAgaWYgKCFwIHx8ICFwLT5idWZmZXIpIHJldHVybiAwOworICAgIG5lZWRlZCArPSBwLT5vZmZzZXQ7CisgICAgaWYgKG5lZWRlZCA8PSBwLT5sZW5ndGgpIHJldHVybiBwLT5idWZmZXIgKyBwLT5vZmZzZXQ7CisKKyAgICBuZXdzaXplID0gcG93Mmd0KG5lZWRlZCk7CisgICAgbmV3YnVmZmVyID0gKGNoYXIgKiljSlNPTl9tYWxsb2MobmV3c2l6ZSk7CisgICAgaWYgKCFuZXdidWZmZXIpIHsKKyAgICAgICAgY0pTT05fZnJlZShwLT5idWZmZXIpOworICAgICAgICBwLT5sZW5ndGggPSAwLCBwLT5idWZmZXIgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG5ld2J1ZmZlcikgbWVtY3B5KG5ld2J1ZmZlciwgcC0+YnVmZmVyLCBwLT5sZW5ndGgpOworICAgIGNKU09OX2ZyZWUocC0+YnVmZmVyKTsKKyAgICBwLT5sZW5ndGggPSBuZXdzaXplOworICAgIHAtPmJ1ZmZlciA9IG5ld2J1ZmZlcjsKKyAgICByZXR1cm4gbmV3YnVmZmVyICsgcC0+b2Zmc2V0OworfQorCitzdGF0aWMgc2l6ZV90IHVwZGF0ZShwcmludGJ1ZmZlciAqcCkgeworICAgIGNoYXIgKnN0cjsKKyAgICBpZiAoIXAgfHwgIXAtPmJ1ZmZlcikgcmV0dXJuIDA7CisgICAgc3RyID0gcC0+YnVmZmVyICsgcC0+b2Zmc2V0OworICAgIHJldHVybiBwLT5vZmZzZXQgKyBzdHJsZW4oc3RyKTsKK30KKworLyogUmVuZGVyIHRoZSBudW1iZXIgbmljZWx5IGZyb20gdGhlIGdpdmVuIGl0ZW0gaW50byBhIHN0cmluZy4gKi8KK3N0YXRpYyBjaGFyICpwcmludF9udW1iZXIoY0pTT04gKml0ZW0sIHByaW50YnVmZmVyICpwKSB7CisgICAgY2hhciAqc3RyID0gMDsKKyAgICBkb3VibGUgZCA9IGl0ZW0tPnZhbHVlZG91YmxlOworICAgIGlmIChkID09IDApIHsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBzdHIgPSBlbnN1cmUocCwgMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0ciA9IChjaGFyICopY0pTT05fbWFsbG9jKDIpOyAvKiBzcGVjaWFsIGNhc2UgZm9yIDAuICovCisgICAgICAgIGlmIChzdHIpIHN0cmNweShzdHIsICIwIik7CisgICAgfSBlbHNlIGlmIChmYWJzKCgoZG91YmxlKWl0ZW0tPnZhbHVlaW50KSAtIGQpIDw9IERCTF9FUFNJTE9OICYmIGQgPD0gSU5UX01BWCAmJiBkID49IElOVF9NSU4pIHsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBzdHIgPSBlbnN1cmUocCwgMjEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHIgPSAoY2hhciAqKWNKU09OX21hbGxvYygyMSk7IC8qIDJeNjQrMSBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gMjEgY2hhcnMuICovCisgICAgICAgIGlmIChzdHIpIHNwcmludGYoc3RyLCAiJWQiLCBpdGVtLT52YWx1ZWludCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBzdHIgPSBlbnN1cmUocCwgNjQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHIgPSAoY2hhciAqKWNKU09OX21hbGxvYyg2NCk7IC8qIFRoaXMgaXMgYSBuaWNlIHRyYWRlb2ZmLiAqLworICAgICAgICBpZiAoc3RyKSB7CisgICAgICAgICAgICBpZiAoZmFicyhmbG9vcihkKSAtIGQpIDw9IERCTF9FUFNJTE9OICYmIGZhYnMoZCkgPCAxLjBlNjApCisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlLjBmIiwgZCk7CisgICAgICAgICAgICBlbHNlIGlmIChmYWJzKGQpIDwgMS4wZS02IHx8IGZhYnMoZCkgPiAxLjBlOSkKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVlIiwgZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlZiIsIGQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBwYXJzZV9oZXg0KGNvbnN0IGNoYXIgKnN0cikgeworICAgIHVuc2lnbmVkIGggPSAwOworICAgIGlmICgqc3RyID49ICcwJyAmJiAqc3RyIDw9ICc5JykKKyAgICAgICAgaCArPSAoKnN0cikgLSAnMCc7CisgICAgZWxzZSBpZiAoKnN0ciA+PSAnQScgJiYgKnN0ciA8PSAnRicpCisgICAgICAgIGggKz0gMTAgKyAoKnN0cikgLSAnQSc7CisgICAgZWxzZSBpZiAoKnN0ciA+PSAnYScgJiYgKnN0ciA8PSAnZicpCisgICAgICAgIGggKz0gMTAgKyAoKnN0cikgLSAnYSc7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgICBoID0gaCA8PCA0OworICAgIHN0cisrOworICAgIGlmICgqc3RyID49ICcwJyAmJiAqc3RyIDw9ICc5JykKKyAgICAgICAgaCArPSAoKnN0cikgLSAnMCc7CisgICAgZWxzZSBpZiAoKnN0ciA+PSAnQScgJiYgKnN0ciA8PSAnRicpCisgICAgICAgIGggKz0gMTAgKyAoKnN0cikgLSAnQSc7CisgICAgZWxzZSBpZiAoKnN0ciA+PSAnYScgJiYgKnN0ciA8PSAnZicpCisgICAgICAgIGggKz0gMTAgKyAoKnN0cikgLSAnYSc7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgICBoID0gaCA8PCA0OworICAgIHN0cisrOworICAgIGlmICgqc3RyID49ICcwJyAmJiAqc3RyIDw9ICc5JykKKyAgICAgICAgaCArPSAoKnN0cikgLSAnMCc7CisgICAgZWxzZSBpZiAoKnN0ciA+PSAnQScgJiYgKnN0ciA8PSAnRicpCisgICAgICAgIGggKz0gMTAgKyAoKnN0cikgLSAnQSc7CisgICAgZWxzZSBpZiAoKnN0ciA+PSAnYScgJiYgKnN0ciA8PSAnZicpCisgICAgICAgIGggKz0gMTAgKyAoKnN0cikgLSAnYSc7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgICBoID0gaCA8PCA0OworICAgIHN0cisrOworICAgIGlmICgqc3RyID49ICcwJyAmJiAqc3RyIDw9ICc5JykKKyAgICAgICAgaCArPSAoKnN0cikgLSAnMCc7CisgICAgZWxzZSBpZiAoKnN0ciA+PSAnQScgJiYgKnN0ciA8PSAnRicpCisgICAgICAgIGggKz0gMTAgKyAoKnN0cikgLSAnQSc7CisgICAgZWxzZSBpZiAoKnN0ciA+PSAnYScgJiYgKnN0ciA8PSAnZicpCisgICAgICAgIGggKz0gMTAgKyAoKnN0cikgLSAnYSc7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gaDsKK30KKworLyogUGFyc2UgdGhlIGlucHV0IHRleHQgaW50byBhbiB1bmVzY2FwZWQgY3N0cmluZywgYW5kIHBvcHVsYXRlIGl0ZW0uICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGVNYXJrWzddID0gezB4MDAsIDB4MDAsIDB4QzAsIDB4RTAsIDB4RjAsIDB4RjgsIDB4RkN9Oworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX3N0cmluZyhjSlNPTiAqaXRlbSwgY29uc3QgY2hhciAqc3RyKSB7CisgICAgY29uc3QgY2hhciAqcHRyID0gc3RyICsgMTsKKyAgICBjaGFyICpwdHIyOworICAgIGNoYXIgKm91dDsKKyAgICBpbnQgbGVuID0gMDsKKyAgICB1bnNpZ25lZCB1YywgdWMyOworICAgIGlmICgqc3RyICE9ICdcIicpIHsKKyAgICAgICAgZXAgPSBzdHI7CisgICAgICAgIHJldHVybiAwOworICAgIH0gLyogbm90IGEgc3RyaW5nISAqLworCisgICAgd2hpbGUgKCpwdHIgIT0gJ1wiJyAmJiAqcHRyICYmICsrbGVuKQorICAgICAgICBpZiAoKnB0cisrID09ICdcXCcpIHB0cisrOyAvKiBTa2lwIGVzY2FwZWQgcXVvdGVzLiAqLworCisgICAgb3V0ID0gKGNoYXIgKiljSlNPTl9tYWxsb2MobGVuICsgMSk7IC8qIFRoaXMgaXMgaG93IGxvbmcgd2UgbmVlZCBmb3IgdGhlIHN0cmluZywgcm91Z2hseS4gKi8KKyAgICBpZiAoIW91dCkgcmV0dXJuIDA7CisKKyAgICBwdHIgPSBzdHIgKyAxOworICAgIHB0cjIgPSBvdXQ7CisgICAgd2hpbGUgKCpwdHIgIT0gJ1wiJyAmJiAqcHRyKSB7CisgICAgICAgIGlmICgqcHRyICE9ICdcXCcpCisgICAgICAgICAgICAqcHRyMisrID0gKnB0cisrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgc3dpdGNoICgqcHRyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICAgICAgICAgICpwdHIyKysgPSAnXGInOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICAgICAgKnB0cjIrKyA9ICdcZic7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICAgICAqcHRyMisrID0gJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgICAgICpwdHIyKysgPSAnXHInOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICAgICAgKnB0cjIrKyA9ICdcdCc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3UnOiAvKiB0cmFuc2NvZGUgdXRmMTYgdG8gdXRmOC4gKi8KKyAgICAgICAgICAgICAgICAgICAgdWMgPSBwYXJzZV9oZXg0KHB0ciArIDEpOworICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLyogZ2V0IHRoZSB1bmljb2RlIGNoYXIuICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1YyA+PSAweERDMDAgJiYgdWMgPD0gMHhERkZGKSB8fCB1YyA9PSAwKSBicmVhazsgLyogY2hlY2sgZm9yIGludmFsaWQuCSovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVjID49IDB4RDgwMCAmJiB1YyA8PSAweERCRkYpIC8qIFVURjE2IHN1cnJvZ2F0ZSBwYWlycy4JKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0clsxXSAhPSAnXFwnIHx8IHB0clsyXSAhPSAndScpIGJyZWFrOyAvKiBtaXNzaW5nIHNlY29uZC1oYWxmIG9mIHN1cnJvZ2F0ZS4JKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHVjMiA9IHBhcnNlX2hleDQocHRyICsgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YzIgPCAweERDMDAgfHwgdWMyID4gMHhERkZGKSBicmVhazsgLyogaW52YWxpZCBzZWNvbmQtaGFsZiBvZiBzdXJyb2dhdGUuCSovCisgICAgICAgICAgICAgICAgICAgICAgICB1YyA9IDB4MTAwMDAgKyAoKCh1YyAmIDB4M0ZGKSA8PCAxMCkgfCAodWMyICYgMHgzRkYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxlbiA9IDQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh1YyA8IDB4ODApCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAxOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh1YyA8IDB4ODAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodWMgPCAweDEwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMzsKKyAgICAgICAgICAgICAgICAgICAgcHRyMiArPSBsZW47CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLS1wdHIyID0gKCh1YyB8IDB4ODApICYgMHhCRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWMgPj49IDY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi0tcHRyMiA9ICgodWMgfCAweDgwKSAmIDB4QkYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjID4+PSA2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICotLXB0cjIgPSAoKHVjIHwgMHg4MCkgJiAweEJGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YyA+Pj0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLS1wdHIyID0gKCh1bnNpZ25lZCBjaGFyKXVjIHwgZmlyc3RCeXRlTWFya1tsZW5dKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHIyICs9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgKnB0cjIrKyA9ICpwdHI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIH0KKyAgICB9CisgICAgKnB0cjIgPSAwOworICAgIGlmICgqcHRyID09ICdcIicpIHB0cisrOworICAgIGl0ZW0tPnZhbHVlc3RyaW5nID0gb3V0OworICAgIGl0ZW0tPnR5cGUgPSBjSlNPTl9TdHJpbmc7CisgICAgcmV0dXJuIHB0cjsKK30KKworLyogUmVuZGVyIHRoZSBjc3RyaW5nIHByb3ZpZGVkIHRvIGFuIGVzY2FwZWQgdmVyc2lvbiB0aGF0IGNhbiBiZSBwcmludGVkLiAqLworc3RhdGljIGNoYXIgKnByaW50X3N0cmluZ19wdHIoY29uc3QgY2hhciAqc3RyLCBwcmludGJ1ZmZlciAqcCkgeworICAgIGNvbnN0IGNoYXIgKnB0cjsKKyAgICBjaGFyICpwdHIyOworICAgIGNoYXIgKm91dDsKKyAgICBzaXplX3QgbGVuID0gMCwgZmxhZyA9IDA7CisgICAgdW5zaWduZWQgY2hhciB0b2tlbjsKKworICAgIGZvciAocHRyID0gc3RyOyAqcHRyOyBwdHIrKykgZmxhZyB8PSAoKCpwdHIgPiAwICYmICpwdHIgPCAzMikgfHwgKCpwdHIgPT0gJ1wiJykgfHwgKCpwdHIgPT0gJ1xcJykpID8gMSA6IDA7CisgICAgaWYgKCFmbGFnKSB7CisgICAgICAgIGxlbiA9IHB0ciAtIHN0cjsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBvdXQgPSBlbnN1cmUocCwgbGVuICsgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dCA9IChjaGFyICopY0pTT05fbWFsbG9jKGxlbiArIDMpOworICAgICAgICBpZiAoIW91dCkgcmV0dXJuIDA7CisgICAgICAgIHB0cjIgPSBvdXQ7CisgICAgICAgICpwdHIyKysgPSAnXCInOworICAgICAgICBzdHJjcHkocHRyMiwgc3RyKTsKKyAgICAgICAgcHRyMltsZW5dID0gJ1wiJzsKKyAgICAgICAgcHRyMltsZW4gKyAxXSA9IDA7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgaWYgKCFzdHIpIHsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBvdXQgPSBlbnN1cmUocCwgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dCA9IChjaGFyICopY0pTT05fbWFsbG9jKDMpOworICAgICAgICBpZiAoIW91dCkgcmV0dXJuIDA7CisgICAgICAgIHN0cmNweShvdXQsICJcIlwiIik7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorICAgIHB0ciA9IHN0cjsKKyAgICB3aGlsZSAoKHRva2VuID0gKnB0cikgJiYgKytsZW4pIHsKKyAgICAgICAgaWYgKHN0cmNocigiXCJcXFxiXGZcblxyXHQiLCB0b2tlbikpCisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4gPCAzMikKKyAgICAgICAgICAgIGxlbiArPSA1OworICAgICAgICBwdHIrKzsKKyAgICB9CisKKyAgICBpZiAocCkKKyAgICAgICAgb3V0ID0gZW5zdXJlKHAsIGxlbiArIDMpOworICAgIGVsc2UKKyAgICAgICAgb3V0ID0gKGNoYXIgKiljSlNPTl9tYWxsb2MobGVuICsgMyk7CisgICAgaWYgKCFvdXQpIHJldHVybiAwOworCisgICAgcHRyMiA9IG91dDsKKyAgICBwdHIgPSBzdHI7CisgICAgKnB0cjIrKyA9ICdcIic7CisgICAgd2hpbGUgKCpwdHIpIHsKKyAgICAgICAgaWYgKCh1bnNpZ25lZCBjaGFyKSpwdHIgPiAzMSAmJiAqcHRyICE9ICdcIicgJiYgKnB0ciAhPSAnXFwnKQorICAgICAgICAgICAgKnB0cjIrKyA9ICpwdHIrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHRva2VuID0gKnB0cisrKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgICAgICAqcHRyMisrID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICAgICAgICAqcHRyMisrID0gJ1wiJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICAgICAgICAqcHRyMisrID0gJ1xiJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICAgICAgICAqcHRyMisrID0gJ1xmJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAqcHRyMisrID0gJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICAqcHRyMisrID0gJ1xyJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICAqcHRyMisrID0gJ1x0JzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihwdHIyLCAidSUwNHgiLCB0b2tlbik7CisgICAgICAgICAgICAgICAgICAgIHB0cjIgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGVzY2FwZSBhbmQgcHJpbnQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqcHRyMisrID0gJ1wiJzsKKyAgICAqcHRyMisrID0gMDsKKyAgICByZXR1cm4gb3V0OworfQorLyogSW52b3RlIHByaW50X3N0cmluZ19wdHIgKHdoaWNoIGlzIHVzZWZ1bCkgb24gYW4gaXRlbS4gKi8KK3N0YXRpYyBjaGFyICpwcmludF9zdHJpbmcoY0pTT04gKml0ZW0sIHByaW50YnVmZmVyICpwKSB7IHJldHVybiBwcmludF9zdHJpbmdfcHRyKGl0ZW0tPnZhbHVlc3RyaW5nLCBwKTsgfQorCisvKiBQcmVkZWNsYXJlIHRoZXNlIHByb3RvdHlwZXMuICovCitzdGF0aWMgY29uc3QgY2hhciAqcGFyc2VfdmFsdWUoY0pTT04gKml0ZW0sIGNvbnN0IGNoYXIgKnZhbHVlKTsKK3N0YXRpYyBjaGFyICpwcmludF92YWx1ZShjSlNPTiAqaXRlbSwgaW50IGRlcHRoLCBpbnQgZm10LCBwcmludGJ1ZmZlciAqcCk7CitzdGF0aWMgY29uc3QgY2hhciAqcGFyc2VfYXJyYXkoY0pTT04gKml0ZW0sIGNvbnN0IGNoYXIgKnZhbHVlKTsKK3N0YXRpYyBjaGFyICpwcmludF9hcnJheShjSlNPTiAqaXRlbSwgaW50IGRlcHRoLCBpbnQgZm10LCBwcmludGJ1ZmZlciAqcCk7CitzdGF0aWMgY29uc3QgY2hhciAqcGFyc2Vfb2JqZWN0KGNKU09OICppdGVtLCBjb25zdCBjaGFyICp2YWx1ZSk7CitzdGF0aWMgY2hhciAqcHJpbnRfb2JqZWN0KGNKU09OICppdGVtLCBpbnQgZGVwdGgsIGludCBmbXQsIHByaW50YnVmZmVyICpwKTsKKworLyogVXRpbGl0eSB0byBqdW1wIHdoaXRlc3BhY2UgYW5kIGNyL2xmICovCitzdGF0aWMgY29uc3QgY2hhciAqc2tpcChjb25zdCBjaGFyICppbikgeworICAgIHdoaWxlIChpbiAmJiAqaW4gJiYgKHVuc2lnbmVkIGNoYXIpKmluIDw9IDMyKSBpbisrOworICAgIHJldHVybiBpbjsKK30KKworLyogUGFyc2UgYW4gb2JqZWN0IC0gY3JlYXRlIGEgbmV3IHJvb3QsIGFuZCBwb3B1bGF0ZS4gKi8KK2NKU09OICpjSlNPTl9QYXJzZVdpdGhPcHRzKGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBjaGFyICoqcmV0dXJuX3BhcnNlX2VuZCwgaW50IHJlcXVpcmVfbnVsbF90ZXJtaW5hdGVkKSB7CisgICAgY29uc3QgY2hhciAqZW5kID0gMDsKKyAgICBjSlNPTiAqYyA9IGNKU09OX05ld19JdGVtKCk7CisgICAgZXAgPSAwOworICAgIGlmICghYykgcmV0dXJuIDA7IC8qIG1lbW9yeSBmYWlsICovCisKKyAgICBlbmQgPSBwYXJzZV92YWx1ZShjLCBza2lwKHZhbHVlKSk7CisgICAgaWYgKCFlbmQpIHsKKyAgICAgICAgY0pTT05fRGVsZXRlKGMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IC8qIHBhcnNlIGZhaWx1cmUuIGVwIGlzIHNldC4gKi8KKworICAgIC8qIGlmIHdlIHJlcXVpcmUgbnVsbC10ZXJtaW5hdGVkIEpTT04gd2l0aG91dCBhcHBlbmRlZCBnYXJiYWdlLCBza2lwIGFuZAorICAgICAqIHRoZW4gY2hlY2sgZm9yIGEgbnVsbCB0ZXJtaW5hdG9yICovCisgICAgaWYgKHJlcXVpcmVfbnVsbF90ZXJtaW5hdGVkKSB7CisgICAgICAgIGVuZCA9IHNraXAoZW5kKTsKKyAgICAgICAgaWYgKCplbmQpIHsKKyAgICAgICAgICAgIGNKU09OX0RlbGV0ZShjKTsKKyAgICAgICAgICAgIGVwID0gZW5kOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJldHVybl9wYXJzZV9lbmQpICpyZXR1cm5fcGFyc2VfZW5kID0gZW5kOworICAgIHJldHVybiBjOworfQorLyogRGVmYXVsdCBvcHRpb25zIGZvciBjSlNPTl9QYXJzZSAqLworY0pTT04gKmNKU09OX1BhcnNlKGNvbnN0IGNoYXIgKnZhbHVlKSB7IHJldHVybiBjSlNPTl9QYXJzZVdpdGhPcHRzKHZhbHVlLCAwLCAwKTsgfQorCisvKiBSZW5kZXIgYSBjSlNPTiBpdGVtL2VudGl0eS9zdHJ1Y3R1cmUgdG8gdGV4dC4gKi8KK2NoYXIgKmNKU09OX1ByaW50KGNKU09OICppdGVtKSB7IHJldHVybiBwcmludF92YWx1ZShpdGVtLCAwLCAxLCAwKTsgfQorY2hhciAqY0pTT05fUHJpbnRVbmZvcm1hdHRlZChjSlNPTiAqaXRlbSkgeyByZXR1cm4gcHJpbnRfdmFsdWUoaXRlbSwgMCwgMCwgMCk7IH0KKworY2hhciAqY0pTT05fUHJpbnRCdWZmZXJlZChjSlNPTiAqaXRlbSwgaW50IHByZWJ1ZmZlciwgaW50IGZtdCkgeworICAgIHByaW50YnVmZmVyIHA7CisgICAgcC5idWZmZXIgPSAoY2hhciAqKWNKU09OX21hbGxvYyhwcmVidWZmZXIpOworICAgIHAubGVuZ3RoID0gcHJlYnVmZmVyOworICAgIHAub2Zmc2V0ID0gMDsKKyAgICByZXR1cm4gcHJpbnRfdmFsdWUoaXRlbSwgMCwgZm10LCAmcCk7Cit9CisKKy8qIFBhcnNlciBjb3JlIC0gd2hlbiBlbmNvdW50ZXJpbmcgdGV4dCwgcHJvY2VzcyBhcHByb3ByaWF0ZWx5LiAqLworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX3ZhbHVlKGNKU09OICppdGVtLCBjb25zdCBjaGFyICp2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHJldHVybiAwOyAvKiBGYWlsIG9uIG51bGwuICovCisgICAgaWYgKCFzdHJuY21wKHZhbHVlLCAibnVsbCIsIDQpKSB7CisgICAgICAgIGl0ZW0tPnR5cGUgPSBjSlNPTl9OVUxMOworICAgICAgICByZXR1cm4gdmFsdWUgKyA0OworICAgIH0KKyAgICBpZiAoIXN0cm5jbXAodmFsdWUsICJmYWxzZSIsIDUpKSB7CisgICAgICAgIGl0ZW0tPnR5cGUgPSBjSlNPTl9GYWxzZTsKKyAgICAgICAgcmV0dXJuIHZhbHVlICsgNTsKKyAgICB9CisgICAgaWYgKCFzdHJuY21wKHZhbHVlLCAidHJ1ZSIsIDQpKSB7CisgICAgICAgIGl0ZW0tPnR5cGUgPSBjSlNPTl9UcnVlOworICAgICAgICBpdGVtLT52YWx1ZWludCA9IDE7CisgICAgICAgIHJldHVybiB2YWx1ZSArIDQ7CisgICAgfQorICAgIGlmICgqdmFsdWUgPT0gJ1wiJykgeworICAgICAgICByZXR1cm4gcGFyc2Vfc3RyaW5nKGl0ZW0sIHZhbHVlKTsKKyAgICB9CisgICAgaWYgKCp2YWx1ZSA9PSAnLScgfHwgKCp2YWx1ZSA+PSAnMCcgJiYgKnZhbHVlIDw9ICc5JykpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlX251bWJlcihpdGVtLCB2YWx1ZSk7CisgICAgfQorICAgIGlmICgqdmFsdWUgPT0gJ1snKSB7CisgICAgICAgIHJldHVybiBwYXJzZV9hcnJheShpdGVtLCB2YWx1ZSk7CisgICAgfQorICAgIGlmICgqdmFsdWUgPT0gJ3snKSB7CisgICAgICAgIHJldHVybiBwYXJzZV9vYmplY3QoaXRlbSwgdmFsdWUpOworICAgIH0KKworICAgIGVwID0gdmFsdWU7CisgICAgcmV0dXJuIDA7IC8qIGZhaWx1cmUuICovCit9CisKKy8qIFJlbmRlciBhIHZhbHVlIHRvIHRleHQuICovCitzdGF0aWMgY2hhciAqcHJpbnRfdmFsdWUoY0pTT04gKml0ZW0sIGludCBkZXB0aCwgaW50IGZtdCwgcHJpbnRidWZmZXIgKnApIHsKKyAgICBjaGFyICpvdXQgPSAwOworICAgIGlmICghaXRlbSkgcmV0dXJuIDA7CisgICAgaWYgKHApIHsKKyAgICAgICAgc3dpdGNoICgoaXRlbS0+dHlwZSkgJiAyNTUpIHsKKyAgICAgICAgICAgIGNhc2UgY0pTT05fTlVMTDogeworICAgICAgICAgICAgICAgIG91dCA9IGVuc3VyZShwLCA1KTsKKyAgICAgICAgICAgICAgICBpZiAob3V0KSBzdHJjcHkob3V0LCAibnVsbCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBjSlNPTl9GYWxzZTogeworICAgICAgICAgICAgICAgIG91dCA9IGVuc3VyZShwLCA2KTsKKyAgICAgICAgICAgICAgICBpZiAob3V0KSBzdHJjcHkob3V0LCAiZmFsc2UiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgY0pTT05fVHJ1ZTogeworICAgICAgICAgICAgICAgIG91dCA9IGVuc3VyZShwLCA1KTsKKyAgICAgICAgICAgICAgICBpZiAob3V0KSBzdHJjcHkob3V0LCAidHJ1ZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBjSlNPTl9OdW1iZXI6CisgICAgICAgICAgICAgICAgb3V0ID0gcHJpbnRfbnVtYmVyKGl0ZW0sIHApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjSlNPTl9TdHJpbmc6CisgICAgICAgICAgICAgICAgb3V0ID0gcHJpbnRfc3RyaW5nKGl0ZW0sIHApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjSlNPTl9BcnJheToKKyAgICAgICAgICAgICAgICBvdXQgPSBwcmludF9hcnJheShpdGVtLCBkZXB0aCwgZm10LCBwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY0pTT05fT2JqZWN0OgorICAgICAgICAgICAgICAgIG91dCA9IHByaW50X29iamVjdChpdGVtLCBkZXB0aCwgZm10LCBwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoKGl0ZW0tPnR5cGUpICYgMjU1KSB7CisgICAgICAgICAgICBjYXNlIGNKU09OX05VTEw6CisgICAgICAgICAgICAgICAgb3V0ID0gY0pTT05fc3RyZHVwKCJudWxsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNKU09OX0ZhbHNlOgorICAgICAgICAgICAgICAgIG91dCA9IGNKU09OX3N0cmR1cCgiZmFsc2UiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY0pTT05fVHJ1ZToKKyAgICAgICAgICAgICAgICBvdXQgPSBjSlNPTl9zdHJkdXAoInRydWUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY0pTT05fTnVtYmVyOgorICAgICAgICAgICAgICAgIG91dCA9IHByaW50X251bWJlcihpdGVtLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY0pTT05fU3RyaW5nOgorICAgICAgICAgICAgICAgIG91dCA9IHByaW50X3N0cmluZyhpdGVtLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY0pTT05fQXJyYXk6CisgICAgICAgICAgICAgICAgb3V0ID0gcHJpbnRfYXJyYXkoaXRlbSwgZGVwdGgsIGZtdCwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNKU09OX09iamVjdDoKKyAgICAgICAgICAgICAgICBvdXQgPSBwcmludF9vYmplY3QoaXRlbSwgZGVwdGgsIGZtdCwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dDsKK30KKworLyogQnVpbGQgYW4gYXJyYXkgZnJvbSBpbnB1dCB0ZXh0LiAqLworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX2FycmF5KGNKU09OICppdGVtLCBjb25zdCBjaGFyICp2YWx1ZSkgeworICAgIGNKU09OICpjaGlsZDsKKyAgICBpZiAoKnZhbHVlICE9ICdbJykgeworICAgICAgICBlcCA9IHZhbHVlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IC8qIG5vdCBhbiBhcnJheSEgKi8KKworICAgIGl0ZW0tPnR5cGUgPSBjSlNPTl9BcnJheTsKKyAgICB2YWx1ZSA9IHNraXAodmFsdWUgKyAxKTsKKyAgICBpZiAoKnZhbHVlID09ICddJykgcmV0dXJuIHZhbHVlICsgMTsgLyogZW1wdHkgYXJyYXkuICovCisKKyAgICBpdGVtLT5jaGlsZCA9IGNoaWxkID0gY0pTT05fTmV3X0l0ZW0oKTsKKyAgICBpZiAoIWl0ZW0tPmNoaWxkKSByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBmYWlsICovCisgICAgdmFsdWUgPSBza2lwKHBhcnNlX3ZhbHVlKGNoaWxkLCBza2lwKHZhbHVlKSkpOyAvKiBza2lwIGFueSBzcGFjaW5nLCBnZXQgdGhlIHZhbHVlLiAqLworICAgIGlmICghdmFsdWUpIHJldHVybiAwOworCisgICAgd2hpbGUgKCp2YWx1ZSA9PSAnLCcpIHsKKyAgICAgICAgY0pTT04gKm5ld19pdGVtOworICAgICAgICBpZiAoIShuZXdfaXRlbSA9IGNKU09OX05ld19JdGVtKCkpKSByZXR1cm4gMDsgLyogbWVtb3J5IGZhaWwgKi8KKyAgICAgICAgY2hpbGQtPm5leHQgPSBuZXdfaXRlbTsKKyAgICAgICAgbmV3X2l0ZW0tPnByZXYgPSBjaGlsZDsKKyAgICAgICAgY2hpbGQgPSBuZXdfaXRlbTsKKyAgICAgICAgdmFsdWUgPSBza2lwKHBhcnNlX3ZhbHVlKGNoaWxkLCBza2lwKHZhbHVlICsgMSkpKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7IC8qIG1lbW9yeSBmYWlsICovCisgICAgfQorCisgICAgaWYgKCp2YWx1ZSA9PSAnXScpIHJldHVybiB2YWx1ZSArIDE7IC8qIGVuZCBvZiBhcnJheSAqLworICAgIGVwID0gdmFsdWU7CisgICAgcmV0dXJuIDA7IC8qIG1hbGZvcm1lZC4gKi8KK30KKworLyogUmVuZGVyIGFuIGFycmF5IHRvIHRleHQgKi8KK3N0YXRpYyBjaGFyICpwcmludF9hcnJheShjSlNPTiAqaXRlbSwgaW50IGRlcHRoLCBpbnQgZm10LCBwcmludGJ1ZmZlciAqcCkgeworICAgIGNoYXIgKiplbnRyaWVzOworICAgIGNoYXIgKm91dCA9IDAsICpwdHIsICpyZXQ7CisgICAgc2l6ZV90IGxlbiA9IDU7CisgICAgY0pTT04gKmNoaWxkID0gaXRlbS0+Y2hpbGQ7CisgICAgaW50IG51bWVudHJpZXMgPSAwLCBmYWlsID0gMCwgaiA9IDA7CisgICAgc2l6ZV90IHRtcGxlbiA9IDAsIGkgPSAwOworCisgICAgLyogSG93IG1hbnkgZW50cmllcyBpbiB0aGUgYXJyYXk/ICovCisgICAgd2hpbGUgKGNoaWxkKSBudW1lbnRyaWVzKyssIGNoaWxkID0gY2hpbGQtPm5leHQ7CisgICAgLyogRXhwbGljaXRseSBoYW5kbGUgbnVtZW50cmllcz09MCAqLworICAgIGlmICghbnVtZW50cmllcykgeworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIG91dCA9IGVuc3VyZShwLCAzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0ID0gKGNoYXIgKiljSlNPTl9tYWxsb2MoMyk7CisgICAgICAgIGlmIChvdXQpIHN0cmNweShvdXQsICJbXSIpOworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIGlmIChwKSB7CisgICAgICAgIC8qIENvbXBvc2UgdGhlIG91dHB1dCBhcnJheS4gKi8KKyAgICAgICAgaSA9IHAtPm9mZnNldDsKKyAgICAgICAgcHRyID0gZW5zdXJlKHAsIDEpOworICAgICAgICBpZiAoIXB0cikgcmV0dXJuIDA7CisgICAgICAgICpwdHIgPSAnWyc7CisgICAgICAgIHAtPm9mZnNldCsrOworICAgICAgICBjaGlsZCA9IGl0ZW0tPmNoaWxkOworICAgICAgICB3aGlsZSAoY2hpbGQgJiYgIWZhaWwpIHsKKyAgICAgICAgICAgIHByaW50X3ZhbHVlKGNoaWxkLCBkZXB0aCArIDEsIGZtdCwgcCk7CisgICAgICAgICAgICBwLT5vZmZzZXQgPSB1cGRhdGUocCk7CisgICAgICAgICAgICBpZiAoY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBmbXQgPyAyIDogMTsKKyAgICAgICAgICAgICAgICBwdHIgPSBlbnN1cmUocCwgbGVuICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKCFwdHIpIHJldHVybiAwOworICAgICAgICAgICAgICAgICpwdHIrKyA9ICcsJzsKKyAgICAgICAgICAgICAgICBpZiAoZm10KSAqcHRyKysgPSAnICc7CisgICAgICAgICAgICAgICAgKnB0ciA9IDA7CisgICAgICAgICAgICAgICAgcC0+b2Zmc2V0ICs9IGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcHRyID0gZW5zdXJlKHAsIDIpOworICAgICAgICBpZiAoIXB0cikgcmV0dXJuIDA7CisgICAgICAgICpwdHIrKyA9ICddJzsKKyAgICAgICAgKnB0ciA9IDA7CisgICAgICAgIG91dCA9IChwLT5idWZmZXIpICsgaTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBBbGxvY2F0ZSBhbiBhcnJheSB0byBob2xkIHRoZSB2YWx1ZXMgZm9yIGVhY2ggKi8KKyAgICAgICAgZW50cmllcyA9IChjaGFyICoqKWNKU09OX21hbGxvYyhudW1lbnRyaWVzICogc2l6ZW9mKGNoYXIgKikpOworICAgICAgICBpZiAoIWVudHJpZXMpIHJldHVybiAwOworICAgICAgICBtZW1zZXQoZW50cmllcywgMCwgbnVtZW50cmllcyAqIHNpemVvZihjaGFyICopKTsKKyAgICAgICAgLyogUmV0cmlldmUgYWxsIHRoZSByZXN1bHRzOiAqLworICAgICAgICBjaGlsZCA9IGl0ZW0tPmNoaWxkOworICAgICAgICB3aGlsZSAoY2hpbGQgJiYgIWZhaWwpIHsKKyAgICAgICAgICAgIHJldCA9IHByaW50X3ZhbHVlKGNoaWxkLCBkZXB0aCArIDEsIGZtdCwgMCk7CisgICAgICAgICAgICBlbnRyaWVzW2krK10gPSByZXQ7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIGxlbiArPSBzdHJsZW4ocmV0KSArIDIgKyAoZm10ID8gMSA6IDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZhaWwgPSAxOworICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHdlIGRpZG4ndCBmYWlsLCB0cnkgdG8gbWFsbG9jIHRoZSBvdXRwdXQgc3RyaW5nICovCisgICAgICAgIGlmICghZmFpbCkgb3V0ID0gKGNoYXIgKiljSlNPTl9tYWxsb2MobGVuKTsKKyAgICAgICAgLyogSWYgdGhhdCBmYWlscywgd2UgZmFpbC4gKi8KKyAgICAgICAgaWYgKCFvdXQpIGZhaWwgPSAxOworCisgICAgICAgIC8qIEhhbmRsZSBmYWlsdXJlLiAqLworICAgICAgICBpZiAoZmFpbCkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bWVudHJpZXM7IGorKykKKyAgICAgICAgICAgICAgICBpZiAoZW50cmllc1tqXSkgY0pTT05fZnJlZShlbnRyaWVzW2pdKTsKKyAgICAgICAgICAgIGNKU09OX2ZyZWUoZW50cmllcyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBvc2UgdGhlIG91dHB1dCBhcnJheS4gKi8KKyAgICAgICAgKm91dCA9ICdbJzsKKyAgICAgICAgcHRyID0gb3V0ICsgMTsKKyAgICAgICAgKnB0ciA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1lbnRyaWVzOyBqKyspIHsKKyAgICAgICAgICAgIHRtcGxlbiA9IHN0cmxlbihlbnRyaWVzW2pdKTsKKyAgICAgICAgICAgIG1lbWNweShwdHIsIGVudHJpZXNbal0sIHRtcGxlbik7CisgICAgICAgICAgICBwdHIgKz0gdG1wbGVuOworICAgICAgICAgICAgaWYgKGogIT0gbnVtZW50cmllcyAtIDEpIHsKKyAgICAgICAgICAgICAgICAqcHRyKysgPSAnLCc7CisgICAgICAgICAgICAgICAgaWYgKGZtdCkgKnB0cisrID0gJyAnOworICAgICAgICAgICAgICAgICpwdHIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY0pTT05fZnJlZShlbnRyaWVzW2pdKTsKKyAgICAgICAgfQorICAgICAgICBjSlNPTl9mcmVlKGVudHJpZXMpOworICAgICAgICAqcHRyKysgPSAnXSc7CisgICAgICAgICpwdHIrKyA9IDA7CisgICAgfQorICAgIHJldHVybiBvdXQ7Cit9CisKKy8qIEJ1aWxkIGFuIG9iamVjdCBmcm9tIHRoZSB0ZXh0LiAqLworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX29iamVjdChjSlNPTiAqaXRlbSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBjSlNPTiAqY2hpbGQ7CisgICAgaWYgKCp2YWx1ZSAhPSAneycpIHsKKyAgICAgICAgZXAgPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSAvKiBub3QgYW4gb2JqZWN0ISAqLworCisgICAgaXRlbS0+dHlwZSA9IGNKU09OX09iamVjdDsKKyAgICB2YWx1ZSA9IHNraXAodmFsdWUgKyAxKTsKKyAgICBpZiAoKnZhbHVlID09ICd9JykgcmV0dXJuIHZhbHVlICsgMTsgLyogZW1wdHkgYXJyYXkuICovCisKKyAgICBpdGVtLT5jaGlsZCA9IGNoaWxkID0gY0pTT05fTmV3X0l0ZW0oKTsKKyAgICBpZiAoIWl0ZW0tPmNoaWxkKSByZXR1cm4gMDsKKyAgICB2YWx1ZSA9IHNraXAocGFyc2Vfc3RyaW5nKGNoaWxkLCBza2lwKHZhbHVlKSkpOworICAgIGlmICghdmFsdWUpIHJldHVybiAwOworICAgIGNoaWxkLT5zdHJpbmcgPSBjaGlsZC0+dmFsdWVzdHJpbmc7CisgICAgY2hpbGQtPnZhbHVlc3RyaW5nID0gMDsKKyAgICBpZiAoKnZhbHVlICE9ICc6JykgeworICAgICAgICBlcCA9IHZhbHVlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWlsISAqLworICAgIHZhbHVlID0gc2tpcChwYXJzZV92YWx1ZShjaGlsZCwgc2tpcCh2YWx1ZSArIDEpKSk7IC8qIHNraXAgYW55IHNwYWNpbmcsIGdldCB0aGUgdmFsdWUuICovCisgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7CisKKyAgICB3aGlsZSAoKnZhbHVlID09ICcsJykgeworICAgICAgICBjSlNPTiAqbmV3X2l0ZW07CisgICAgICAgIGlmICghKG5ld19pdGVtID0gY0pTT05fTmV3X0l0ZW0oKSkpIHJldHVybiAwOyAvKiBtZW1vcnkgZmFpbCAqLworICAgICAgICBjaGlsZC0+bmV4dCA9IG5ld19pdGVtOworICAgICAgICBuZXdfaXRlbS0+cHJldiA9IGNoaWxkOworICAgICAgICBjaGlsZCA9IG5ld19pdGVtOworICAgICAgICB2YWx1ZSA9IHNraXAocGFyc2Vfc3RyaW5nKGNoaWxkLCBza2lwKHZhbHVlICsgMSkpKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7CisgICAgICAgIGNoaWxkLT5zdHJpbmcgPSBjaGlsZC0+dmFsdWVzdHJpbmc7CisgICAgICAgIGNoaWxkLT52YWx1ZXN0cmluZyA9IDA7CisgICAgICAgIGlmICgqdmFsdWUgIT0gJzonKSB7CisgICAgICAgICAgICBlcCA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhaWwhICovCisgICAgICAgIHZhbHVlID0gc2tpcChwYXJzZV92YWx1ZShjaGlsZCwgc2tpcCh2YWx1ZSArIDEpKSk7IC8qIHNraXAgYW55IHNwYWNpbmcsIGdldCB0aGUgdmFsdWUuICovCisgICAgICAgIGlmICghdmFsdWUpIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgqdmFsdWUgPT0gJ30nKSByZXR1cm4gdmFsdWUgKyAxOyAvKiBlbmQgb2YgYXJyYXkgKi8KKyAgICBlcCA9IHZhbHVlOworICAgIHJldHVybiAwOyAvKiBtYWxmb3JtZWQuICovCit9CisKKy8qIFJlbmRlciBhbiBvYmplY3QgdG8gdGV4dC4gKi8KK3N0YXRpYyBjaGFyICpwcmludF9vYmplY3QoY0pTT04gKml0ZW0sIGludCBkZXB0aCwgaW50IGZtdCwgcHJpbnRidWZmZXIgKnApIHsKKyAgICBjaGFyICoqZW50cmllcyA9IDAsICoqbmFtZXMgPSAwOworICAgIGNoYXIgKm91dCA9IDAsICpwdHIsICpyZXQsICpzdHI7CisgICAgaW50IGo7CisgICAgY0pTT04gKmNoaWxkID0gaXRlbS0+Y2hpbGQ7CisgICAgaW50IG51bWVudHJpZXMgPSAwLCBmYWlsID0gMCwgazsKKyAgICBzaXplX3QgdG1wbGVuID0gMCwgaSA9IDAsIGxlbiA9IDc7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAqLworICAgIHdoaWxlIChjaGlsZCkgbnVtZW50cmllcysrLCBjaGlsZCA9IGNoaWxkLT5uZXh0OworICAgIC8qIEV4cGxpY2l0bHkgaGFuZGxlIGVtcHR5IG9iamVjdCBjYXNlICovCisgICAgaWYgKCFudW1lbnRyaWVzKSB7CisgICAgICAgIGlmIChwKQorICAgICAgICAgICAgb3V0ID0gZW5zdXJlKHAsIGZtdCA/IGRlcHRoICsgNCA6IDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQgPSAoY2hhciAqKWNKU09OX21hbGxvYyhmbXQgPyBkZXB0aCArIDQgOiAzKTsKKyAgICAgICAgaWYgKCFvdXQpIHJldHVybiAwOworICAgICAgICBwdHIgPSBvdXQ7CisgICAgICAgICpwdHIrKyA9ICd7JzsKKyAgICAgICAgaWYgKGZtdCkgeworICAgICAgICAgICAgKnB0cisrID0gJ1xuJzsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZXB0aCAtIDE7IGorKykgKnB0cisrID0gJ1x0JzsKKyAgICAgICAgfQorICAgICAgICAqcHRyKysgPSAnfSc7CisgICAgICAgICpwdHIrKyA9IDA7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorICAgIGlmIChwKSB7CisgICAgICAgIC8qIENvbXBvc2UgdGhlIG91dHB1dDogKi8KKyAgICAgICAgaSA9IHAtPm9mZnNldDsKKyAgICAgICAgbGVuID0gZm10ID8gMiA6IDE7CisgICAgICAgIHB0ciA9IGVuc3VyZShwLCBsZW4gKyAxKTsKKyAgICAgICAgaWYgKCFwdHIpIHJldHVybiAwOworICAgICAgICAqcHRyKysgPSAneyc7CisgICAgICAgIGlmIChmbXQpICpwdHIrKyA9ICdcbic7CisgICAgICAgICpwdHIgPSAwOworICAgICAgICBwLT5vZmZzZXQgKz0gbGVuOworICAgICAgICBjaGlsZCA9IGl0ZW0tPmNoaWxkOworICAgICAgICBkZXB0aCsrOworICAgICAgICB3aGlsZSAoY2hpbGQpIHsKKyAgICAgICAgICAgIGlmIChmbXQpIHsKKyAgICAgICAgICAgICAgICBwdHIgPSBlbnN1cmUocCwgZGVwdGgpOworICAgICAgICAgICAgICAgIGlmICghcHRyKSByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGVwdGg7IGorKykgKnB0cisrID0gJ1x0JzsKKyAgICAgICAgICAgICAgICBwLT5vZmZzZXQgKz0gZGVwdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludF9zdHJpbmdfcHRyKGNoaWxkLT5zdHJpbmcsIHApOworICAgICAgICAgICAgcC0+b2Zmc2V0ID0gdXBkYXRlKHApOworCisgICAgICAgICAgICBsZW4gPSBmbXQgPyAyIDogMTsKKyAgICAgICAgICAgIHB0ciA9IGVuc3VyZShwLCBsZW4pOworICAgICAgICAgICAgaWYgKCFwdHIpIHJldHVybiAwOworICAgICAgICAgICAgKnB0cisrID0gJzonOworICAgICAgICAgICAgaWYgKGZtdCkgKnB0cisrID0gJ1x0JzsKKyAgICAgICAgICAgIHAtPm9mZnNldCArPSBsZW47CisKKyAgICAgICAgICAgIHByaW50X3ZhbHVlKGNoaWxkLCBkZXB0aCwgZm10LCBwKTsKKyAgICAgICAgICAgIHAtPm9mZnNldCA9IHVwZGF0ZShwKTsKKworICAgICAgICAgICAgbGVuID0gKGZtdCA/IDEgOiAwKSArIChjaGlsZC0+bmV4dCA/IDEgOiAwKTsKKyAgICAgICAgICAgIHB0ciA9IGVuc3VyZShwLCBsZW4gKyAxKTsKKyAgICAgICAgICAgIGlmICghcHRyKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChjaGlsZC0+bmV4dCkgKnB0cisrID0gJywnOworICAgICAgICAgICAgaWYgKGZtdCkgKnB0cisrID0gJ1xuJzsKKyAgICAgICAgICAgICpwdHIgPSAwOworICAgICAgICAgICAgcC0+b2Zmc2V0ICs9IGxlbjsKKyAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcHRyID0gZW5zdXJlKHAsIGZtdCA/IChkZXB0aCArIDEpIDogMik7CisgICAgICAgIGlmICghcHRyKSByZXR1cm4gMDsKKyAgICAgICAgaWYgKGZtdCkKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZXB0aCAtIDE7IGorKykgKnB0cisrID0gJ1x0JzsKKyAgICAgICAgKnB0cisrID0gJ30nOworICAgICAgICAqcHRyID0gMDsKKyAgICAgICAgb3V0ID0gKHAtPmJ1ZmZlcikgKyBpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZXMgYW5kIHRoZSBvYmplY3RzICovCisgICAgICAgIGVudHJpZXMgPSAoY2hhciAqKiljSlNPTl9tYWxsb2MobnVtZW50cmllcyAqIHNpemVvZihjaGFyICopKTsKKyAgICAgICAgaWYgKCFlbnRyaWVzKSByZXR1cm4gMDsKKyAgICAgICAgbmFtZXMgPSAoY2hhciAqKiljSlNPTl9tYWxsb2MobnVtZW50cmllcyAqIHNpemVvZihjaGFyICopKTsKKyAgICAgICAgaWYgKCFuYW1lcykgeworICAgICAgICAgICAgY0pTT05fZnJlZShlbnRyaWVzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG1lbXNldChlbnRyaWVzLCAwLCBzaXplb2YoY2hhciAqKSAqIG51bWVudHJpZXMpOworICAgICAgICBtZW1zZXQobmFtZXMsIDAsIHNpemVvZihjaGFyICopICogbnVtZW50cmllcyk7CisKKyAgICAgICAgLyogQ29sbGVjdCBhbGwgdGhlIHJlc3VsdHMgaW50byBvdXIgYXJyYXlzOiAqLworICAgICAgICBjaGlsZCA9IGl0ZW0tPmNoaWxkOworICAgICAgICBkZXB0aCsrOworICAgICAgICBpZiAoZm10KSBsZW4gKz0gZGVwdGg7CisgICAgICAgIHdoaWxlIChjaGlsZCkgeworICAgICAgICAgICAgbmFtZXNbaV0gPSBzdHIgPSBwcmludF9zdHJpbmdfcHRyKGNoaWxkLT5zdHJpbmcsIDApOworICAgICAgICAgICAgZW50cmllc1tpKytdID0gcmV0ID0gcHJpbnRfdmFsdWUoY2hpbGQsIGRlcHRoLCBmbXQsIDApOworICAgICAgICAgICAgaWYgKHN0ciAmJiByZXQpCisgICAgICAgICAgICAgICAgbGVuICs9IHN0cmxlbihyZXQpICsgc3RybGVuKHN0cikgKyAyICsgKGZtdCA/IDIgKyBkZXB0aCA6IDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZhaWwgPSAxOworICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRyeSB0byBhbGxvY2F0ZSB0aGUgb3V0cHV0IHN0cmluZyAqLworICAgICAgICBpZiAoIWZhaWwpIG91dCA9IChjaGFyICopY0pTT05fbWFsbG9jKGxlbik7CisgICAgICAgIGlmICghb3V0KSBmYWlsID0gMTsKKworICAgICAgICAvKiBIYW5kbGUgZmFpbHVyZSAqLworICAgICAgICBpZiAoZmFpbCkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bWVudHJpZXM7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChuYW1lc1tpXSkgY0pTT05fZnJlZShuYW1lc1tqXSk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJpZXNbal0pIGNKU09OX2ZyZWUoZW50cmllc1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjSlNPTl9mcmVlKG5hbWVzKTsKKyAgICAgICAgICAgIGNKU09OX2ZyZWUoZW50cmllcyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBvc2UgdGhlIG91dHB1dDogKi8KKyAgICAgICAgKm91dCA9ICd7JzsKKyAgICAgICAgcHRyID0gb3V0ICsgMTsKKyAgICAgICAgaWYgKGZtdCkgKnB0cisrID0gJ1xuJzsKKyAgICAgICAgKnB0ciA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1lbnRyaWVzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChmbXQpCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGRlcHRoOyBrKyspICpwdHIrKyA9ICdcdCc7CisgICAgICAgICAgICB0bXBsZW4gPSBzdHJsZW4obmFtZXNbal0pOworICAgICAgICAgICAgbWVtY3B5KHB0ciwgbmFtZXNbal0sIHRtcGxlbik7CisgICAgICAgICAgICBwdHIgKz0gdG1wbGVuOworICAgICAgICAgICAgKnB0cisrID0gJzonOworICAgICAgICAgICAgaWYgKGZtdCkgKnB0cisrID0gJ1x0JzsKKyAgICAgICAgICAgIHN0cmNweShwdHIsIGVudHJpZXNbal0pOworICAgICAgICAgICAgcHRyICs9IHN0cmxlbihlbnRyaWVzW2pdKTsKKyAgICAgICAgICAgIGlmIChqICE9IG51bWVudHJpZXMgLSAxKSAqcHRyKysgPSAnLCc7CisgICAgICAgICAgICBpZiAoZm10KSAqcHRyKysgPSAnXG4nOworICAgICAgICAgICAgKnB0ciA9IDA7CisgICAgICAgICAgICBjSlNPTl9mcmVlKG5hbWVzW2pdKTsKKyAgICAgICAgICAgIGNKU09OX2ZyZWUoZW50cmllc1tqXSk7CisgICAgICAgIH0KKworICAgICAgICBjSlNPTl9mcmVlKG5hbWVzKTsKKyAgICAgICAgY0pTT05fZnJlZShlbnRyaWVzKTsKKyAgICAgICAgaWYgKGZtdCkKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZXB0aCAtIDE7IGorKykgKnB0cisrID0gJ1x0JzsKKyAgICAgICAgKnB0cisrID0gJ30nOworICAgICAgICAqcHRyKysgPSAwOworICAgIH0KKyAgICByZXR1cm4gb3V0OworfQorCisvKiBHZXQgQXJyYXkgc2l6ZS9pdGVtIC8gb2JqZWN0IGl0ZW0uICovCitpbnQgY0pTT05fR2V0QXJyYXlTaXplKGNKU09OICphcnJheSkgeworICAgIGNKU09OICpjID0gYXJyYXktPmNoaWxkOworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoYykgaSsrLCBjID0gYy0+bmV4dDsKKyAgICByZXR1cm4gaTsKK30KK2NKU09OICpjSlNPTl9HZXRBcnJheUl0ZW0oY0pTT04gKmFycmF5LCBpbnQgaXRlbSkgeworICAgIGNKU09OICpjID0gYXJyYXktPmNoaWxkOworICAgIHdoaWxlIChjICYmIGl0ZW0gPiAwKSBpdGVtLS0sIGMgPSBjLT5uZXh0OworICAgIHJldHVybiBjOworfQorY0pTT04gKmNKU09OX0dldE9iamVjdEl0ZW0oY0pTT04gKm9iamVjdCwgY29uc3QgY2hhciAqc3RyaW5nKSB7CisgICAgY0pTT04gKmMgPSBvYmplY3QtPmNoaWxkOworICAgIHdoaWxlIChjICYmIHN0cmNtcChjLT5zdHJpbmcsIHN0cmluZykpIGMgPSBjLT5uZXh0OworICAgIHJldHVybiBjOworfQorCisvKiBVdGlsaXR5IGZvciBhcnJheSBsaXN0IGhhbmRsaW5nLiAqLworc3RhdGljIHZvaWQgc3VmZml4X29iamVjdChjSlNPTiAqcHJldiwgY0pTT04gKml0ZW0pIHsKKyAgICBwcmV2LT5uZXh0ID0gaXRlbTsKKyAgICBpdGVtLT5wcmV2ID0gcHJldjsKK30KKy8qIFV0aWxpdHkgZm9yIGhhbmRsaW5nIHJlZmVyZW5jZXMuICovCitzdGF0aWMgY0pTT04gKmNyZWF0ZV9yZWZlcmVuY2UoY0pTT04gKml0ZW0pIHsKKyAgICBjSlNPTiAqcmVmID0gY0pTT05fTmV3X0l0ZW0oKTsKKyAgICBpZiAoIXJlZikgcmV0dXJuIDA7CisgICAgbWVtY3B5KHJlZiwgaXRlbSwgc2l6ZW9mKGNKU09OKSk7CisgICAgcmVmLT5zdHJpbmcgPSAwOworICAgIHJlZi0+dHlwZSB8PSBjSlNPTl9Jc1JlZmVyZW5jZTsKKyAgICByZWYtPm5leHQgPSByZWYtPnByZXYgPSAwOworICAgIHJldHVybiByZWY7Cit9CisKKy8qIEFkZCBpdGVtIHRvIGFycmF5L29iamVjdC4gKi8KK3ZvaWQgY0pTT05fQWRkSXRlbVRvQXJyYXkoY0pTT04gKmFycmF5LCBjSlNPTiAqaXRlbSkgeworICAgIGNKU09OICpjID0gYXJyYXktPmNoaWxkOworICAgIGlmICghaXRlbSkgcmV0dXJuOworICAgIGlmICghYykgeworICAgICAgICBhcnJheS0+Y2hpbGQgPSBpdGVtOworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChjICYmIGMtPm5leHQpIGMgPSBjLT5uZXh0OworICAgICAgICBzdWZmaXhfb2JqZWN0KGMsIGl0ZW0pOworICAgIH0KK30KK3ZvaWQgY0pTT05fQWRkSXRlbVRvT2JqZWN0KGNKU09OICpvYmplY3QsIGNvbnN0IGNoYXIgKnN0cmluZywgY0pTT04gKml0ZW0pIHsKKyAgICBpZiAoIWl0ZW0pIHJldHVybjsKKyAgICBpZiAoaXRlbS0+c3RyaW5nKSBjSlNPTl9mcmVlKGl0ZW0tPnN0cmluZyk7CisgICAgaXRlbS0+c3RyaW5nID0gY0pTT05fc3RyZHVwKHN0cmluZyk7CisgICAgY0pTT05fQWRkSXRlbVRvQXJyYXkob2JqZWN0LCBpdGVtKTsKK30KK3ZvaWQgY0pTT05fQWRkSXRlbVRvT2JqZWN0Q1MoY0pTT04gKm9iamVjdCwgY29uc3QgY2hhciAqc3RyaW5nLCBjSlNPTiAqaXRlbSkgeworICAgIGlmICghaXRlbSkgcmV0dXJuOworICAgIGlmICghKGl0ZW0tPnR5cGUgJiBjSlNPTl9TdHJpbmdJc0NvbnN0KSAmJiBpdGVtLT5zdHJpbmcpIGNKU09OX2ZyZWUoaXRlbS0+c3RyaW5nKTsKKyAgICBpdGVtLT5zdHJpbmcgPSAoY2hhciAqKXN0cmluZzsKKyAgICBpdGVtLT50eXBlIHw9IGNKU09OX1N0cmluZ0lzQ29uc3Q7CisgICAgY0pTT05fQWRkSXRlbVRvQXJyYXkob2JqZWN0LCBpdGVtKTsKK30KK3ZvaWQgY0pTT05fQWRkSXRlbVJlZmVyZW5jZVRvQXJyYXkoY0pTT04gKmFycmF5LCBjSlNPTiAqaXRlbSkgeyBjSlNPTl9BZGRJdGVtVG9BcnJheShhcnJheSwgY3JlYXRlX3JlZmVyZW5jZShpdGVtKSk7IH0KK3ZvaWQgY0pTT05fQWRkSXRlbVJlZmVyZW5jZVRvT2JqZWN0KGNKU09OICpvYmplY3QsIGNvbnN0IGNoYXIgKnN0cmluZywgY0pTT04gKml0ZW0pIHsKKyAgICBjSlNPTl9BZGRJdGVtVG9PYmplY3Qob2JqZWN0LCBzdHJpbmcsIGNyZWF0ZV9yZWZlcmVuY2UoaXRlbSkpOworfQorCitjSlNPTiAqY0pTT05fRGV0YWNoSXRlbUZyb21BcnJheShjSlNPTiAqYXJyYXksIGludCB3aGljaCkgeworICAgIGNKU09OICpjID0gYXJyYXktPmNoaWxkOworICAgIHdoaWxlIChjICYmIHdoaWNoID4gMCkgYyA9IGMtPm5leHQsIHdoaWNoLS07CisgICAgaWYgKCFjKSByZXR1cm4gMDsKKyAgICBpZiAoYy0+cHJldikgYy0+cHJldi0+bmV4dCA9IGMtPm5leHQ7CisgICAgaWYgKGMtPm5leHQpIGMtPm5leHQtPnByZXYgPSBjLT5wcmV2OworICAgIGlmIChjID09IGFycmF5LT5jaGlsZCkgYXJyYXktPmNoaWxkID0gYy0+bmV4dDsKKyAgICBjLT5wcmV2ID0gYy0+bmV4dCA9IDA7CisgICAgcmV0dXJuIGM7Cit9Cit2b2lkIGNKU09OX0RlbGV0ZUl0ZW1Gcm9tQXJyYXkoY0pTT04gKmFycmF5LCBpbnQgd2hpY2gpIHsgY0pTT05fRGVsZXRlKGNKU09OX0RldGFjaEl0ZW1Gcm9tQXJyYXkoYXJyYXksIHdoaWNoKSk7IH0KK2NKU09OICpjSlNPTl9EZXRhY2hJdGVtRnJvbU9iamVjdChjSlNPTiAqb2JqZWN0LCBjb25zdCBjaGFyICpzdHJpbmcpIHsKKyAgICBpbnQgaSA9IDA7CisgICAgY0pTT04gKmMgPSBvYmplY3QtPmNoaWxkOworICAgIHdoaWxlIChjICYmIHN0cmNtcChjLT5zdHJpbmcsIHN0cmluZykpIGkrKywgYyA9IGMtPm5leHQ7CisgICAgaWYgKGMpIHJldHVybiBjSlNPTl9EZXRhY2hJdGVtRnJvbUFycmF5KG9iamVjdCwgaSk7CisgICAgcmV0dXJuIDA7Cit9Cit2b2lkIGNKU09OX0RlbGV0ZUl0ZW1Gcm9tT2JqZWN0KGNKU09OICpvYmplY3QsIGNvbnN0IGNoYXIgKnN0cmluZykgeyBjSlNPTl9EZWxldGUoY0pTT05fRGV0YWNoSXRlbUZyb21PYmplY3Qob2JqZWN0LCBzdHJpbmcpKTsgfQorCisvKiBSZXBsYWNlIGFycmF5L29iamVjdCBpdGVtcyB3aXRoIG5ldyBvbmVzLiAqLwordm9pZCBjSlNPTl9JbnNlcnRJdGVtSW5BcnJheShjSlNPTiAqYXJyYXksIGludCB3aGljaCwgY0pTT04gKm5ld2l0ZW0pIHsKKyAgICBjSlNPTiAqYyA9IGFycmF5LT5jaGlsZDsKKyAgICB3aGlsZSAoYyAmJiB3aGljaCA+IDApIGMgPSBjLT5uZXh0LCB3aGljaC0tOworICAgIGlmICghYykgeworICAgICAgICBjSlNPTl9BZGRJdGVtVG9BcnJheShhcnJheSwgbmV3aXRlbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbmV3aXRlbS0+bmV4dCA9IGM7CisgICAgbmV3aXRlbS0+cHJldiA9IGMtPnByZXY7CisgICAgYy0+cHJldiA9IG5ld2l0ZW07CisgICAgaWYgKGMgPT0gYXJyYXktPmNoaWxkKQorICAgICAgICBhcnJheS0+Y2hpbGQgPSBuZXdpdGVtOworICAgIGVsc2UKKyAgICAgICAgbmV3aXRlbS0+cHJldi0+bmV4dCA9IG5ld2l0ZW07Cit9Cit2b2lkIGNKU09OX1JlcGxhY2VJdGVtSW5BcnJheShjSlNPTiAqYXJyYXksIGludCB3aGljaCwgY0pTT04gKm5ld2l0ZW0pIHsKKyAgICBjSlNPTiAqYyA9IGFycmF5LT5jaGlsZDsKKyAgICB3aGlsZSAoYyAmJiB3aGljaCA+IDApIGMgPSBjLT5uZXh0LCB3aGljaC0tOworICAgIGlmICghYykgcmV0dXJuOworICAgIG5ld2l0ZW0tPm5leHQgPSBjLT5uZXh0OworICAgIG5ld2l0ZW0tPnByZXYgPSBjLT5wcmV2OworICAgIGlmIChuZXdpdGVtLT5uZXh0KSBuZXdpdGVtLT5uZXh0LT5wcmV2ID0gbmV3aXRlbTsKKyAgICBpZiAoYyA9PSBhcnJheS0+Y2hpbGQpCisgICAgICAgIGFycmF5LT5jaGlsZCA9IG5ld2l0ZW07CisgICAgZWxzZQorICAgICAgICBuZXdpdGVtLT5wcmV2LT5uZXh0ID0gbmV3aXRlbTsKKyAgICBjLT5uZXh0ID0gYy0+cHJldiA9IDA7CisgICAgY0pTT05fRGVsZXRlKGMpOworfQordm9pZCBjSlNPTl9SZXBsYWNlSXRlbUluT2JqZWN0KGNKU09OICpvYmplY3QsIGNvbnN0IGNoYXIgKnN0cmluZywgY0pTT04gKm5ld2l0ZW0pIHsKKyAgICBpbnQgaSA9IDA7CisgICAgY0pTT04gKmMgPSBvYmplY3QtPmNoaWxkOworICAgIHdoaWxlIChjICYmIHN0cmNtcChjLT5zdHJpbmcsIHN0cmluZykpIGkrKywgYyA9IGMtPm5leHQ7CisgICAgaWYgKGMpIHsKKyAgICAgICAgbmV3aXRlbS0+c3RyaW5nID0gY0pTT05fc3RyZHVwKHN0cmluZyk7CisgICAgICAgIGNKU09OX1JlcGxhY2VJdGVtSW5BcnJheShvYmplY3QsIGksIG5ld2l0ZW0pOworICAgIH0KK30KKworLyogQ3JlYXRlIGJhc2ljIHR5cGVzOiAqLworY0pTT04gKmNKU09OX0NyZWF0ZU51bGwodm9pZCkgeworICAgIGNKU09OICppdGVtID0gY0pTT05fTmV3X0l0ZW0oKTsKKyAgICBpZiAoaXRlbSkgaXRlbS0+dHlwZSA9IGNKU09OX05VTEw7CisgICAgcmV0dXJuIGl0ZW07Cit9CitjSlNPTiAqY0pTT05fQ3JlYXRlVHJ1ZSh2b2lkKSB7CisgICAgY0pTT04gKml0ZW0gPSBjSlNPTl9OZXdfSXRlbSgpOworICAgIGlmIChpdGVtKSBpdGVtLT50eXBlID0gY0pTT05fVHJ1ZTsKKyAgICByZXR1cm4gaXRlbTsKK30KK2NKU09OICpjSlNPTl9DcmVhdGVGYWxzZSh2b2lkKSB7CisgICAgY0pTT04gKml0ZW0gPSBjSlNPTl9OZXdfSXRlbSgpOworICAgIGlmIChpdGVtKSBpdGVtLT50eXBlID0gY0pTT05fRmFsc2U7CisgICAgcmV0dXJuIGl0ZW07Cit9CitjSlNPTiAqY0pTT05fQ3JlYXRlQm9vbChpbnQgYikgeworICAgIGNKU09OICppdGVtID0gY0pTT05fTmV3X0l0ZW0oKTsKKyAgICBpZiAoaXRlbSkgaXRlbS0+dHlwZSA9IGIgPyBjSlNPTl9UcnVlIDogY0pTT05fRmFsc2U7CisgICAgcmV0dXJuIGl0ZW07Cit9CitjSlNPTiAqY0pTT05fQ3JlYXRlTnVtYmVyKGRvdWJsZSBudW0pIHsKKyAgICBjSlNPTiAqaXRlbSA9IGNKU09OX05ld19JdGVtKCk7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgaXRlbS0+dHlwZSA9IGNKU09OX051bWJlcjsKKyAgICAgICAgaXRlbS0+dmFsdWVkb3VibGUgPSBudW07CisgICAgICAgIGl0ZW0tPnZhbHVlaW50ID0gKGludCludW07CisgICAgfQorICAgIHJldHVybiBpdGVtOworfQorY0pTT04gKmNKU09OX0NyZWF0ZVN0cmluZyhjb25zdCBjaGFyICpzdHJpbmcpIHsKKyAgICBjSlNPTiAqaXRlbSA9IGNKU09OX05ld19JdGVtKCk7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgaXRlbS0+dHlwZSA9IGNKU09OX1N0cmluZzsKKyAgICAgICAgaXRlbS0+dmFsdWVzdHJpbmcgPSBjSlNPTl9zdHJkdXAoc3RyaW5nKTsKKyAgICB9CisgICAgcmV0dXJuIGl0ZW07Cit9CitjSlNPTiAqY0pTT05fQ3JlYXRlQXJyYXkodm9pZCkgeworICAgIGNKU09OICppdGVtID0gY0pTT05fTmV3X0l0ZW0oKTsKKyAgICBpZiAoaXRlbSkgaXRlbS0+dHlwZSA9IGNKU09OX0FycmF5OworICAgIHJldHVybiBpdGVtOworfQorY0pTT04gKmNKU09OX0NyZWF0ZU9iamVjdCh2b2lkKSB7CisgICAgY0pTT04gKml0ZW0gPSBjSlNPTl9OZXdfSXRlbSgpOworICAgIGlmIChpdGVtKSBpdGVtLT50eXBlID0gY0pTT05fT2JqZWN0OworICAgIHJldHVybiBpdGVtOworfQorCisvKiBDcmVhdGUgQXJyYXlzOiAqLworY0pTT04gKmNKU09OX0NyZWF0ZUludEFycmF5KGNvbnN0IGludCAqbnVtYmVycywgaW50IGNvdW50KSB7CisgICAgaW50IGk7CisgICAgY0pTT04gKm4gPSAwLCAqcCA9IDAsICphID0gY0pTT05fQ3JlYXRlQXJyYXkoKTsKKyAgICBmb3IgKGkgPSAwOyBhICYmIGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIG4gPSBjSlNPTl9DcmVhdGVOdW1iZXIobnVtYmVyc1tpXSk7CisgICAgICAgIGlmICghaSkKKyAgICAgICAgICAgIGEtPmNoaWxkID0gbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3VmZml4X29iamVjdChwLCBuKTsKKyAgICAgICAgcCA9IG47CisgICAgfQorICAgIHJldHVybiBhOworfQorY0pTT04gKmNKU09OX0NyZWF0ZUZsb2F0QXJyYXkoY29uc3QgZmxvYXQgKm51bWJlcnMsIGludCBjb3VudCkgeworICAgIGludCBpOworICAgIGNKU09OICpuID0gMCwgKnAgPSAwLCAqYSA9IGNKU09OX0NyZWF0ZUFycmF5KCk7CisgICAgZm9yIChpID0gMDsgYSAmJiBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBuID0gY0pTT05fQ3JlYXRlTnVtYmVyKG51bWJlcnNbaV0pOworICAgICAgICBpZiAoIWkpCisgICAgICAgICAgICBhLT5jaGlsZCA9IG47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1ZmZpeF9vYmplY3QocCwgbik7CisgICAgICAgIHAgPSBuOworICAgIH0KKyAgICByZXR1cm4gYTsKK30KK2NKU09OICpjSlNPTl9DcmVhdGVEb3VibGVBcnJheShjb25zdCBkb3VibGUgKm51bWJlcnMsIGludCBjb3VudCkgeworICAgIGludCBpOworICAgIGNKU09OICpuID0gMCwgKnAgPSAwLCAqYSA9IGNKU09OX0NyZWF0ZUFycmF5KCk7CisgICAgZm9yIChpID0gMDsgYSAmJiBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBuID0gY0pTT05fQ3JlYXRlTnVtYmVyKG51bWJlcnNbaV0pOworICAgICAgICBpZiAoIWkpCisgICAgICAgICAgICBhLT5jaGlsZCA9IG47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1ZmZpeF9vYmplY3QocCwgbik7CisgICAgICAgIHAgPSBuOworICAgIH0KKyAgICByZXR1cm4gYTsKK30KK2NKU09OICpjSlNPTl9DcmVhdGVTdHJpbmdBcnJheShjb25zdCBjaGFyICoqc3RyaW5ncywgaW50IGNvdW50KSB7CisgICAgaW50IGk7CisgICAgY0pTT04gKm4gPSAwLCAqcCA9IDAsICphID0gY0pTT05fQ3JlYXRlQXJyYXkoKTsKKyAgICBmb3IgKGkgPSAwOyBhICYmIGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIG4gPSBjSlNPTl9DcmVhdGVTdHJpbmcoc3RyaW5nc1tpXSk7CisgICAgICAgIGlmICghaSkKKyAgICAgICAgICAgIGEtPmNoaWxkID0gbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3VmZml4X29iamVjdChwLCBuKTsKKyAgICAgICAgcCA9IG47CisgICAgfQorICAgIHJldHVybiBhOworfQorCisvKiBEdXBsaWNhdGlvbiAqLworY0pTT04gKmNKU09OX0R1cGxpY2F0ZShjSlNPTiAqaXRlbSwgaW50IHJlY3Vyc2UpIHsKKyAgICBjSlNPTiAqbmV3aXRlbSwgKmNwdHIsICpucHRyID0gMCwgKm5ld2NoaWxkOworICAgIC8qIEJhaWwgb24gYmFkIHB0ciAqLworICAgIGlmICghaXRlbSkgcmV0dXJuIDA7CisgICAgLyogQ3JlYXRlIG5ldyBpdGVtICovCisgICAgbmV3aXRlbSA9IGNKU09OX05ld19JdGVtKCk7CisgICAgaWYgKCFuZXdpdGVtKSByZXR1cm4gMDsKKyAgICAvKiBDb3B5IG92ZXIgYWxsIHZhcnMgKi8KKyAgICBuZXdpdGVtLT50eXBlID0gaXRlbS0+dHlwZSAmICh+Y0pTT05fSXNSZWZlcmVuY2UpLCBuZXdpdGVtLT52YWx1ZWludCA9IGl0ZW0tPnZhbHVlaW50LCBuZXdpdGVtLT52YWx1ZWRvdWJsZSA9IGl0ZW0tPnZhbHVlZG91YmxlOworICAgIGlmIChpdGVtLT52YWx1ZXN0cmluZykgeworICAgICAgICBuZXdpdGVtLT52YWx1ZXN0cmluZyA9IGNKU09OX3N0cmR1cChpdGVtLT52YWx1ZXN0cmluZyk7CisgICAgICAgIGlmICghbmV3aXRlbS0+dmFsdWVzdHJpbmcpIHsKKyAgICAgICAgICAgIGNKU09OX0RlbGV0ZShuZXdpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpdGVtLT5zdHJpbmcpIHsKKyAgICAgICAgbmV3aXRlbS0+c3RyaW5nID0gY0pTT05fc3RyZHVwKGl0ZW0tPnN0cmluZyk7CisgICAgICAgIGlmICghbmV3aXRlbS0+c3RyaW5nKSB7CisgICAgICAgICAgICBjSlNPTl9EZWxldGUobmV3aXRlbSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJZiBub24tcmVjdXJzaXZlLCB0aGVuIHdlJ3JlIGRvbmUhICovCisgICAgaWYgKCFyZWN1cnNlKSByZXR1cm4gbmV3aXRlbTsKKyAgICAvKiBXYWxrIHRoZSAtPm5leHQgY2hhaW4gZm9yIHRoZSBjaGlsZC4gKi8KKyAgICBjcHRyID0gaXRlbS0+Y2hpbGQ7CisgICAgd2hpbGUgKGNwdHIpIHsKKyAgICAgICAgbmV3Y2hpbGQgPSBjSlNPTl9EdXBsaWNhdGUoY3B0ciwgMSk7IC8qIER1cGxpY2F0ZSAod2l0aCByZWN1cnNlKSBlYWNoIGl0ZW0gaW4gdGhlIC0+bmV4dCBjaGFpbiAqLworICAgICAgICBpZiAoIW5ld2NoaWxkKSB7CisgICAgICAgICAgICBjSlNPTl9EZWxldGUobmV3aXRlbSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobnB0cikgeworICAgICAgICAgICAgbnB0ci0+bmV4dCA9IG5ld2NoaWxkLCBuZXdjaGlsZC0+cHJldiA9IG5wdHI7CisgICAgICAgICAgICBucHRyID0gbmV3Y2hpbGQ7CisgICAgICAgIH0gLyogSWYgbmV3aXRlbS0+Y2hpbGQgYWxyZWFkeSBzZXQsIHRoZW4gY3Jvc3N3aXJlIC0+cHJldiBhbmQgLT5uZXh0IGFuZAorICAgICAgICAgICAgIG1vdmUgb24gKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdpdGVtLT5jaGlsZCA9IG5ld2NoaWxkOworICAgICAgICAgICAgbnB0ciA9IG5ld2NoaWxkOworICAgICAgICB9IC8qIFNldCBuZXdpdGVtLT5jaGlsZCBhbmQgbW92ZSB0byBpdCAqLworICAgICAgICBjcHRyID0gY3B0ci0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIG5ld2l0ZW07Cit9CisKK3ZvaWQgY0pTT05fTWluaWZ5KGNoYXIgKmpzb24pIHsKKyAgICBjaGFyICppbnRvID0ganNvbjsKKyAgICB3aGlsZSAoKmpzb24pIHsKKyAgICAgICAgaWYgKCpqc29uID09ICcgJykKKyAgICAgICAgICAgIGpzb24rKzsKKyAgICAgICAgZWxzZSBpZiAoKmpzb24gPT0gJ1x0JykKKyAgICAgICAgICAgIGpzb24rKzsgLyogV2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAqLworICAgICAgICBlbHNlIGlmICgqanNvbiA9PSAnXHInKQorICAgICAgICAgICAganNvbisrOworICAgICAgICBlbHNlIGlmICgqanNvbiA9PSAnXG4nKQorICAgICAgICAgICAganNvbisrOworICAgICAgICBlbHNlIGlmICgqanNvbiA9PSAnLycgJiYganNvblsxXSA9PSAnLycpCisgICAgICAgICAgICB3aGlsZSAoKmpzb24gJiYgKmpzb24gIT0gJ1xuJykganNvbisrOyAvKiBkb3VibGUtc2xhc2ggY29tbWVudHMsIHRvIGVuZCBvZiBsaW5lLiAqLworICAgICAgICBlbHNlIGlmICgqanNvbiA9PSAnLycgJiYganNvblsxXSA9PSAnKicpIHsKKyAgICAgICAgICAgIHdoaWxlICgqanNvbiAmJiAhKCpqc29uID09ICcqJyAmJiBqc29uWzFdID09ICcvJykpIGpzb24rKzsKKyAgICAgICAgICAgIGpzb24gKz0gMjsKKyAgICAgICAgfSAvKiBtdWx0aWxpbmUgY29tbWVudHMuICovCisgICAgICAgIGVsc2UgaWYgKCpqc29uID09ICdcIicpIHsKKyAgICAgICAgICAgICppbnRvKysgPSAqanNvbisrOworICAgICAgICAgICAgd2hpbGUgKCpqc29uICYmICpqc29uICE9ICdcIicpIHsKKyAgICAgICAgICAgICAgICBpZiAoKmpzb24gPT0gJ1xcJykgKmludG8rKyA9ICpqc29uKys7CisgICAgICAgICAgICAgICAgKmludG8rKyA9ICpqc29uKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqaW50bysrID0gKmpzb24rKzsKKyAgICAgICAgfSAvKiBzdHJpbmcgbGl0ZXJhbHMsIHdoaWNoIGFyZSBcIiBzZW5zaXRpdmUuICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICppbnRvKysgPSAqanNvbisrOyAvKiBBbGwgb3RoZXIgY2hhcmFjdGVycy4gKi8KKyAgICB9CisgICAgKmludG8gPSAwOyAvKiBhbmQgbnVsbC10ZXJtaW5hdGUuICovCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2NKU09OLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2NKU09OLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNTlhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvY0pTT04uaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAgQ29weXJpZ2h0IChjKSAyMDA5IERhdmUgR2FtYmxlCisgIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisKKyAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAgVEhFIFNPRlRXQVJFLgorKi8KKworI2lmbmRlZiBjSlNPTl9faAorI2RlZmluZSBjSlNPTl9faAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIGNKU09OIFR5cGVzOiAqLworI2RlZmluZSBjSlNPTl9GYWxzZSAwCisjZGVmaW5lIGNKU09OX1RydWUgMQorI2RlZmluZSBjSlNPTl9OVUxMIDIKKyNkZWZpbmUgY0pTT05fTnVtYmVyIDMKKyNkZWZpbmUgY0pTT05fU3RyaW5nIDQKKyNkZWZpbmUgY0pTT05fQXJyYXkgNQorI2RlZmluZSBjSlNPTl9PYmplY3QgNgorCisjZGVmaW5lIGNKU09OX0lzUmVmZXJlbmNlIDI1NgorI2RlZmluZSBjSlNPTl9TdHJpbmdJc0NvbnN0IDUxMgorCisvKiBUaGUgY0pTT04gc3RydWN0dXJlOiAqLwordHlwZWRlZiBzdHJ1Y3QgY0pTT04geworICAgIHN0cnVjdCBjSlNPTiAqbmV4dCwgKnByZXY7IC8qIG5leHQvcHJldiBhbGxvdyB5b3UgdG8gd2FsayBhcnJheS9vYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbnMuIEFsdGVybmF0aXZlbHksIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEFycmF5U2l6ZS9HZXRBcnJheUl0ZW0vR2V0T2JqZWN0SXRlbSAqLworICAgIHN0cnVjdCBjSlNPTiAqY2hpbGQ7ICAgICAgIC8qIEFuIGFycmF5IG9yIG9iamVjdCBpdGVtIHdpbGwgaGF2ZSBhIGNoaWxkIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byBhIGNoYWluIG9mIHRoZSBpdGVtcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS9vYmplY3QuICovCisKKyAgICBpbnQgdHlwZTsgLyogVGhlIHR5cGUgb2YgdGhlIGl0ZW0sIGFzIGFib3ZlLiAqLworCisgICAgY2hhciAqdmFsdWVzdHJpbmc7ICAvKiBUaGUgaXRlbSdzIHN0cmluZywgaWYgdHlwZT09Y0pTT05fU3RyaW5nICovCisgICAgaW50IHZhbHVlaW50OyAgICAgICAvKiBUaGUgaXRlbSdzIG51bWJlciwgaWYgdHlwZT09Y0pTT05fTnVtYmVyICovCisgICAgZG91YmxlIHZhbHVlZG91YmxlOyAvKiBUaGUgaXRlbSdzIG51bWJlciwgaWYgdHlwZT09Y0pTT05fTnVtYmVyICovCisKKyAgICBjaGFyICpzdHJpbmc7IC8qIFRoZSBpdGVtJ3MgbmFtZSBzdHJpbmcsIGlmIHRoaXMgaXRlbSBpcyB0aGUgY2hpbGQgb2YsIG9yIGlzCisgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbGlzdCBvZiBzdWJpdGVtcyBvZiBhbiBvYmplY3QuICovCit9IGNKU09OOworCit0eXBlZGVmIHN0cnVjdCBjSlNPTl9Ib29rcyB7CisgICAgdm9pZCAqKCptYWxsb2NfZm4pKHNpemVfdCBzeik7CisgICAgdm9pZCAoKmZyZWVfZm4pKHZvaWQgKnB0cik7Cit9IGNKU09OX0hvb2tzOworCisvKiBTdXBwbHkgbWFsbG9jLCByZWFsbG9jIGFuZCBmcmVlIGZ1bmN0aW9ucyB0byBjSlNPTiAqLworZXh0ZXJuIHZvaWQgY0pTT05fSW5pdEhvb2tzKGNKU09OX0hvb2tzICpob29rcyk7CisKKy8qIFN1cHBseSBhIGJsb2NrIG9mIEpTT04sIGFuZCB0aGlzIHJldHVybnMgYSBjSlNPTiBvYmplY3QgeW91IGNhbiBpbnRlcnJvZ2F0ZS4KKyAqIENhbGwgY0pTT05fRGVsZXRlIHdoZW4gZmluaXNoZWQuICovCitleHRlcm4gY0pTT04gKmNKU09OX1BhcnNlKGNvbnN0IGNoYXIgKnZhbHVlKTsKKy8qIFJlbmRlciBhIGNKU09OIGVudGl0eSB0byB0ZXh0IGZvciB0cmFuc2Zlci9zdG9yYWdlLiBGcmVlIHRoZSBjaGFyKiB3aGVuCisgKiBmaW5pc2hlZC4gKi8KK2V4dGVybiBjaGFyICpjSlNPTl9QcmludChjSlNPTiAqaXRlbSk7CisvKiBSZW5kZXIgYSBjSlNPTiBlbnRpdHkgdG8gdGV4dCBmb3IgdHJhbnNmZXIvc3RvcmFnZSB3aXRob3V0IGFueSBmb3JtYXR0aW5nLgorICogRnJlZSB0aGUgY2hhciogd2hlbiBmaW5pc2hlZC4gKi8KK2V4dGVybiBjaGFyICpjSlNPTl9QcmludFVuZm9ybWF0dGVkKGNKU09OICppdGVtKTsKKy8qIFJlbmRlciBhIGNKU09OIGVudGl0eSB0byB0ZXh0IHVzaW5nIGEgYnVmZmVyZWQgc3RyYXRlZ3kuIHByZWJ1ZmZlciBpcyBhIGd1ZXNzCisgKiBhdCB0aGUgZmluYWwgc2l6ZS4gZ3Vlc3Npbmcgd2VsbCByZWR1Y2VzIHJlYWxsb2NhdGlvbi4gZm10PTAgZ2l2ZXMKKyAqIHVuZm9ybWF0dGVkLCA9MSBnaXZlcyBmb3JtYXR0ZWQgKi8KK2V4dGVybiBjaGFyICpjSlNPTl9QcmludEJ1ZmZlcmVkKGNKU09OICppdGVtLCBpbnQgcHJlYnVmZmVyLCBpbnQgZm10KTsKKy8qIERlbGV0ZSBhIGNKU09OIGVudGl0eSBhbmQgYWxsIHN1YmVudGl0aWVzLiAqLworZXh0ZXJuIHZvaWQgY0pTT05fRGVsZXRlKGNKU09OICpjKTsKKy8qIERlbGV0ZSBhbiBpdGVtIGFsbG9jYXRlZCBpbnNpZGUgdGhlIEpTT04gcGFyc2VyKi8KK2V4dGVybiB2b2lkIGNKU09OX0ZyZWUodm9pZCAqcCk7CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhbiBhcnJheSAob3Igb2JqZWN0KS4gKi8KK2V4dGVybiBpbnQgY0pTT05fR2V0QXJyYXlTaXplKGNKU09OICphcnJheSk7CisvKiBSZXRyaWV2ZSBpdGVtIG51bWJlciAiaXRlbSIgZnJvbSBhcnJheSAiYXJyYXkiLiBSZXR1cm5zIE5VTEwgaWYgdW5zdWNjZXNzZnVsLgorICovCitleHRlcm4gY0pTT04gKmNKU09OX0dldEFycmF5SXRlbShjSlNPTiAqYXJyYXksIGludCBpdGVtKTsKKy8qIEdldCBpdGVtICJzdHJpbmciIGZyb20gb2JqZWN0LiBDYXNlIGluc2Vuc2l0aXZlLiAqLworZXh0ZXJuIGNKU09OICpjSlNPTl9HZXRPYmplY3RJdGVtKGNKU09OICpvYmplY3QsIGNvbnN0IGNoYXIgKnN0cmluZyk7CisKKy8qIEZvciBhbmFseXNpbmcgZmFpbGVkIHBhcnNlcy4gVGhpcyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcGFyc2UgZXJyb3IuCisgKiBZb3UnbGwgcHJvYmFibHkgbmVlZCB0byBsb29rIGEgZmV3IGNoYXJzIGJhY2sgdG8gbWFrZSBzZW5zZSBvZiBpdC4gRGVmaW5lZAorICogd2hlbiBjSlNPTl9QYXJzZSgpIHJldHVybnMgMC4gMCB3aGVuIGNKU09OX1BhcnNlKCkgc3VjY2VlZHMuICovCitleHRlcm4gY29uc3QgY2hhciAqY0pTT05fR2V0RXJyb3JQdHIodm9pZCk7CisKKy8qIFRoZXNlIGNhbGxzIGNyZWF0ZSBhIGNKU09OIGl0ZW0gb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuICovCitleHRlcm4gY0pTT04gKmNKU09OX0NyZWF0ZU51bGwodm9pZCk7CitleHRlcm4gY0pTT04gKmNKU09OX0NyZWF0ZVRydWUodm9pZCk7CitleHRlcm4gY0pTT04gKmNKU09OX0NyZWF0ZUZhbHNlKHZvaWQpOworZXh0ZXJuIGNKU09OICpjSlNPTl9DcmVhdGVCb29sKGludCBiKTsKK2V4dGVybiBjSlNPTiAqY0pTT05fQ3JlYXRlTnVtYmVyKGRvdWJsZSBudW0pOworZXh0ZXJuIGNKU09OICpjSlNPTl9DcmVhdGVTdHJpbmcoY29uc3QgY2hhciAqc3RyaW5nKTsKK2V4dGVybiBjSlNPTiAqY0pTT05fQ3JlYXRlQXJyYXkodm9pZCk7CitleHRlcm4gY0pTT04gKmNKU09OX0NyZWF0ZU9iamVjdCh2b2lkKTsKKworLyogVGhlc2UgdXRpbGl0aWVzIGNyZWF0ZSBhbiBBcnJheSBvZiBjb3VudCBpdGVtcy4gKi8KK2V4dGVybiBjSlNPTiAqY0pTT05fQ3JlYXRlSW50QXJyYXkoY29uc3QgaW50ICpudW1iZXJzLCBpbnQgY291bnQpOworZXh0ZXJuIGNKU09OICpjSlNPTl9DcmVhdGVGbG9hdEFycmF5KGNvbnN0IGZsb2F0ICpudW1iZXJzLCBpbnQgY291bnQpOworZXh0ZXJuIGNKU09OICpjSlNPTl9DcmVhdGVEb3VibGVBcnJheShjb25zdCBkb3VibGUgKm51bWJlcnMsIGludCBjb3VudCk7CitleHRlcm4gY0pTT04gKmNKU09OX0NyZWF0ZVN0cmluZ0FycmF5KGNvbnN0IGNoYXIgKipzdHJpbmdzLCBpbnQgY291bnQpOworCisvKiBBcHBlbmQgaXRlbSB0byB0aGUgc3BlY2lmaWVkIGFycmF5L29iamVjdC4gKi8KK2V4dGVybiB2b2lkIGNKU09OX0FkZEl0ZW1Ub0FycmF5KGNKU09OICphcnJheSwgY0pTT04gKml0ZW0pOworZXh0ZXJuIHZvaWQgY0pTT05fQWRkSXRlbVRvT2JqZWN0KGNKU09OICpvYmplY3QsIGNvbnN0IGNoYXIgKnN0cmluZywgY0pTT04gKml0ZW0pOworZXh0ZXJuIHZvaWQgY0pTT05fQWRkSXRlbVRvT2JqZWN0Q1MoY0pTT04gKm9iamVjdCwgY29uc3QgY2hhciAqc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0pTT04gKml0ZW0pOyAvKiBVc2UgdGhpcyB3aGVuIHN0cmluZyBpcyBkZWZpbml0ZWx5IGNvbnN0IChpLmUuIGEgbGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXMgZ29vZCBhcyksIGFuZCB3aWxsIGRlZmluaXRlbHkgc3Vydml2ZSB0aGUgY0pTT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ICovCisvKiBBcHBlbmQgcmVmZXJlbmNlIHRvIGl0ZW0gdG8gdGhlIHNwZWNpZmllZCBhcnJheS9vYmplY3QuIFVzZSB0aGlzIHdoZW4geW91CisgKiB3YW50IHRvIGFkZCBhbiBleGlzdGluZyBjSlNPTiB0byBhIG5ldyBjSlNPTiwgYnV0IGRvbid0IHdhbnQgdG8gY29ycnVwdCB5b3VyCisgKiBleGlzdGluZyBjSlNPTi4gKi8KK2V4dGVybiB2b2lkIGNKU09OX0FkZEl0ZW1SZWZlcmVuY2VUb0FycmF5KGNKU09OICphcnJheSwgY0pTT04gKml0ZW0pOworZXh0ZXJuIHZvaWQgY0pTT05fQWRkSXRlbVJlZmVyZW5jZVRvT2JqZWN0KGNKU09OICpvYmplY3QsIGNvbnN0IGNoYXIgKnN0cmluZywgY0pTT04gKml0ZW0pOworCisvKiBSZW1vdmUvRGV0YXRjaCBpdGVtcyBmcm9tIEFycmF5cy9PYmplY3RzLiAqLworZXh0ZXJuIGNKU09OICpjSlNPTl9EZXRhY2hJdGVtRnJvbUFycmF5KGNKU09OICphcnJheSwgaW50IHdoaWNoKTsKK2V4dGVybiB2b2lkIGNKU09OX0RlbGV0ZUl0ZW1Gcm9tQXJyYXkoY0pTT04gKmFycmF5LCBpbnQgd2hpY2gpOworZXh0ZXJuIGNKU09OICpjSlNPTl9EZXRhY2hJdGVtRnJvbU9iamVjdChjSlNPTiAqb2JqZWN0LCBjb25zdCBjaGFyICpzdHJpbmcpOworZXh0ZXJuIHZvaWQgY0pTT05fRGVsZXRlSXRlbUZyb21PYmplY3QoY0pTT04gKm9iamVjdCwgY29uc3QgY2hhciAqc3RyaW5nKTsKKworLyogVXBkYXRlIGFycmF5IGl0ZW1zLiAqLworZXh0ZXJuIHZvaWQgY0pTT05fSW5zZXJ0SXRlbUluQXJyYXkoY0pTT04gKmFycmF5LCBpbnQgd2hpY2gsIGNKU09OICpuZXdpdGVtKTsgLyogU2hpZnRzIHByZS1leGlzdGluZyBpdGVtcyB0byB0aGUgcmlnaHQuICovCitleHRlcm4gdm9pZCBjSlNPTl9SZXBsYWNlSXRlbUluQXJyYXkoY0pTT04gKmFycmF5LCBpbnQgd2hpY2gsIGNKU09OICpuZXdpdGVtKTsKK2V4dGVybiB2b2lkIGNKU09OX1JlcGxhY2VJdGVtSW5PYmplY3QoY0pTT04gKm9iamVjdCwgY29uc3QgY2hhciAqc3RyaW5nLCBjSlNPTiAqbmV3aXRlbSk7CisKKy8qIER1cGxpY2F0ZSBhIGNKU09OIGl0ZW0gKi8KK2V4dGVybiBjSlNPTiAqY0pTT05fRHVwbGljYXRlKGNKU09OICppdGVtLCBpbnQgcmVjdXJzZSk7CisvKiBEdXBsaWNhdGUgd2lsbCBjcmVhdGUgYSBuZXcsIGlkZW50aWNhbCBjSlNPTiBpdGVtIHRvIHRoZSBvbmUgeW91IHBhc3MsIGluIG5ldworbWVtb3J5IHRoYXQgd2lsbAorbmVlZCB0byBiZSByZWxlYXNlZC4gV2l0aCByZWN1cnNlIT0wLCBpdCB3aWxsIGR1cGxpY2F0ZSBhbnkgY2hpbGRyZW4gY29ubmVjdGVkCit0byB0aGUgaXRlbS4KK1RoZSBpdGVtLT5uZXh0IGFuZCAtPnByZXYgcG9pbnRlcnMgYXJlIGFsd2F5cyB6ZXJvIG9uIHJldHVybiBmcm9tIER1cGxpY2F0ZS4gKi8KKworLyogUGFyc2VXaXRoT3B0cyBhbGxvd3MgeW91IHRvIHJlcXVpcmUgKGFuZCBjaGVjaykgdGhhdCB0aGUgSlNPTiBpcyBudWxsCisgKiB0ZXJtaW5hdGVkLCBhbmQgdG8gcmV0cmlldmUgdGhlIHBvaW50ZXIgdG8gdGhlIGZpbmFsIGJ5dGUgcGFyc2VkLiAqLworZXh0ZXJuIGNKU09OICpjSlNPTl9QYXJzZVdpdGhPcHRzKGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBjaGFyICoqcmV0dXJuX3BhcnNlX2VuZCwgaW50IHJlcXVpcmVfbnVsbF90ZXJtaW5hdGVkKTsKKworZXh0ZXJuIHZvaWQgY0pTT05fTWluaWZ5KGNoYXIgKmpzb24pOworCisvKiBNYWNyb3MgZm9yIGNyZWF0aW5nIHRoaW5ncyBxdWlja2x5LiAqLworI2RlZmluZSBjSlNPTl9BZGROdWxsVG9PYmplY3Qob2JqZWN0LCBuYW1lKSBjSlNPTl9BZGRJdGVtVG9PYmplY3Qob2JqZWN0LCBuYW1lLCBjSlNPTl9DcmVhdGVOdWxsKCkpCisjZGVmaW5lIGNKU09OX0FkZFRydWVUb09iamVjdChvYmplY3QsIG5hbWUpIGNKU09OX0FkZEl0ZW1Ub09iamVjdChvYmplY3QsIG5hbWUsIGNKU09OX0NyZWF0ZVRydWUoKSkKKyNkZWZpbmUgY0pTT05fQWRkRmFsc2VUb09iamVjdChvYmplY3QsIG5hbWUpIGNKU09OX0FkZEl0ZW1Ub09iamVjdChvYmplY3QsIG5hbWUsIGNKU09OX0NyZWF0ZUZhbHNlKCkpCisjZGVmaW5lIGNKU09OX0FkZEJvb2xUb09iamVjdChvYmplY3QsIG5hbWUsIGIpIGNKU09OX0FkZEl0ZW1Ub09iamVjdChvYmplY3QsIG5hbWUsIGNKU09OX0NyZWF0ZUJvb2woYikpCisjZGVmaW5lIGNKU09OX0FkZE51bWJlclRvT2JqZWN0KG9iamVjdCwgbmFtZSwgbikgY0pTT05fQWRkSXRlbVRvT2JqZWN0KG9iamVjdCwgbmFtZSwgY0pTT05fQ3JlYXRlTnVtYmVyKG4pKQorI2RlZmluZSBjSlNPTl9BZGRTdHJpbmdUb09iamVjdChvYmplY3QsIG5hbWUsIHMpIGNKU09OX0FkZEl0ZW1Ub09iamVjdChvYmplY3QsIG5hbWUsIGNKU09OX0NyZWF0ZVN0cmluZyhzKSkKKworLyogV2hlbiBhc3NpZ25pbmcgYW4gaW50ZWdlciB2YWx1ZSwgaXQgbmVlZHMgdG8gYmUgcHJvcGFnYXRlZCB0byB2YWx1ZWRvdWJsZQorICogdG9vLiAqLworI2RlZmluZSBjSlNPTl9TZXRJbnRWYWx1ZShvYmplY3QsIHZhbCkgKChvYmplY3QpID8gKG9iamVjdCktPnZhbHVlaW50ID0gKG9iamVjdCktPnZhbHVlZG91YmxlID0gKHZhbCkgOiAodmFsKSkKKyNkZWZpbmUgY0pTT05fU2V0TnVtYmVyVmFsdWUob2JqZWN0LCB2YWwpICgob2JqZWN0KSA/IChvYmplY3QpLT52YWx1ZWludCA9IChvYmplY3QpLT52YWx1ZWRvdWJsZSA9ICh2YWwpIDogKHZhbCkpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9kZWJ1Z191dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9kZWJ1Z191dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzAxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2RlYnVnX3V0aWxzLmMKQEAgLTAsMCArMSw5OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIFlvdW5nIDxtYXJreUBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaWZuZGVmIFdJTjMyCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZWxzZQorI2VuZGlmCisjaW5jbHVkZSAidmtfbG9hZGVyX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAiZGVidWdfdXRpbHMuaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19vYmplY3RfdHlwZXMuaCIKKworLy8gVktfRVhUX2RlYnVnX3JlcG9ydCByZWxhdGVkIGl0ZW1zCisKK1ZrUmVzdWx0IHV0aWxfQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlcihzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIpIHsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpwTmV3RGJnRnVuY05vZGUgPSBOVUxMOworCisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICB7CisjZWxzZQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcE5ld0RiZ0Z1bmNOb2RlID0gKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKilwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKHBBbGxvY2F0b3ItPnBVc2VyRGF0YSwgc2l6ZW9mKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCAqKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIHBOZXdEYmdGdW5jTm9kZSA9IChWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICopbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgc2l6ZW9mKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgfQorICAgIGlmICghcE5ld0RiZ0Z1bmNOb2RlKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChwTmV3RGJnRnVuY05vZGUsIDAsIHNpemVvZihWa0xheWVyRGJnRnVuY3Rpb25Ob2RlKSk7CisKKyAgICBwTmV3RGJnRnVuY05vZGUtPmlzX21lc3NlbmdlciA9IHRydWU7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5tZXNzZW5nZXIubWVzc2VuZ2VyID0gbWVzc2VuZ2VyOworICAgIHBOZXdEYmdGdW5jTm9kZS0+bWVzc2VuZ2VyLnBmblVzZXJDYWxsYmFjayA9IHBDcmVhdGVJbmZvLT5wZm5Vc2VyQ2FsbGJhY2s7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5tZXNzZW5nZXIubWVzc2FnZVNldmVyaXR5ID0gcENyZWF0ZUluZm8tPm1lc3NhZ2VTZXZlcml0eTsKKyAgICBwTmV3RGJnRnVuY05vZGUtPm1lc3Nlbmdlci5tZXNzYWdlVHlwZSA9IHBDcmVhdGVJbmZvLT5tZXNzYWdlVHlwZTsKKyAgICBwTmV3RGJnRnVuY05vZGUtPnBVc2VyRGF0YSA9IHBDcmVhdGVJbmZvLT5wVXNlckRhdGE7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5wTmV4dCA9IGluc3QtPkRiZ0Z1bmN0aW9uSGVhZDsKKyAgICBpbnN0LT5EYmdGdW5jdGlvbkhlYWQgPSBwTmV3RGJnRnVuY05vZGU7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorZGVidWdfdXRpbHNfQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVChWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKnBNZXNzZW5nZXIpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZsb2FkZXJfbG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gaW5zdC0+ZGlzcC0+bGF5ZXJfaW5zdF9kaXNwLkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTWVzc2VuZ2VyKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrQm9vbDMyIHV0aWxfU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZVNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICpwQ2FsbGJhY2tEYXRhKSB7CisgICAgVmtCb29sMzIgYmFpbCA9IGZhbHNlOworCisgICAgaWYgKE5VTEwgIT0gcENhbGxiYWNrRGF0YSkgeworICAgICAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpwVHJhdiA9IGluc3QtPkRiZ0Z1bmN0aW9uSGVhZDsKKyAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQ7CisgICAgICAgIFZrRGVidWdSZXBvcnRGbGFnc0VYVCBvYmplY3RfZmxhZ3MgPSAwOworICAgICAgICB1aW50NjRfdCBvYmplY3RfaGFuZGxlID0gMDsKKworICAgICAgICBkZWJ1Z191dGlsc19Bbm5vdEZsYWdzVG9SZXBvcnRGbGFncyhtZXNzYWdlU2V2ZXJpdHksIG1lc3NhZ2VUeXBlcywgJm9iamVjdF9mbGFncyk7CisgICAgICAgIGlmICgwIDwgcENhbGxiYWNrRGF0YS0+b2JqZWN0Q291bnQpIHsKKyAgICAgICAgICAgIGRlYnVnX3V0aWxzX0Fubm90T2JqZWN0VG9EZWJ1Z1JlcG9ydE9iamVjdChwQ2FsbGJhY2tEYXRhLT5wT2JqZWN0cywgJm9iamVjdF90eXBlLCAmb2JqZWN0X2hhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocFRyYXYpIHsKKyAgICAgICAgICAgIGlmIChwVHJhdi0+aXNfbWVzc2VuZ2VyICYmIChwVHJhdi0+bWVzc2VuZ2VyLm1lc3NhZ2VTZXZlcml0eSAmIG1lc3NhZ2VTZXZlcml0eSkgJiYKKyAgICAgICAgICAgICAgICAocFRyYXYtPm1lc3Nlbmdlci5tZXNzYWdlVHlwZSAmIG1lc3NhZ2VUeXBlcykpIHsKKyAgICAgICAgICAgICAgICBpZiAocFRyYXYtPm1lc3Nlbmdlci5wZm5Vc2VyQ2FsbGJhY2sobWVzc2FnZVNldmVyaXR5LCBtZXNzYWdlVHlwZXMsIHBDYWxsYmFja0RhdGEsIHBUcmF2LT5wVXNlckRhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgIGJhaWwgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcFRyYXYtPmlzX21lc3NlbmdlciAmJiBwVHJhdi0+cmVwb3J0Lm1zZ0ZsYWdzICYgb2JqZWN0X2ZsYWdzKSB7CisgICAgICAgICAgICAgICAgaWYgKHBUcmF2LT5yZXBvcnQucGZuTXNnQ2FsbGJhY2sob2JqZWN0X2ZsYWdzLCBvYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwgMCwgcENhbGxiYWNrRGF0YS0+bWVzc2FnZUlkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYWxsYmFja0RhdGEtPnBNZXNzYWdlSWROYW1lLCBwQ2FsbGJhY2tEYXRhLT5wTWVzc2FnZSwgcFRyYXYtPnBVc2VyRGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFpbCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwVHJhdiA9IHBUcmF2LT5wTmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiYWlsOworfQorCit2b2lkIHV0aWxfRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXIoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpwVHJhdiA9IGluc3QtPkRiZ0Z1bmN0aW9uSGVhZDsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpwUHJldiA9IHBUcmF2OworCisgICAgd2hpbGUgKHBUcmF2KSB7CisgICAgICAgIGlmIChwVHJhdi0+aXNfbWVzc2VuZ2VyICYmIHBUcmF2LT5tZXNzZW5nZXIubWVzc2VuZ2VyID09IG1lc3NlbmdlcikgeworICAgICAgICAgICAgcFByZXYtPnBOZXh0ID0gcFRyYXYtPnBOZXh0OworICAgICAgICAgICAgaWYgKGluc3QtPkRiZ0Z1bmN0aW9uSGVhZCA9PSBwVHJhdikgaW5zdC0+RGJnRnVuY3Rpb25IZWFkID0gcFRyYXYtPnBOZXh0OworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgICAgICAgICB7CisjZWxzZQorICAgICAgICAgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBBbGxvY2F0b3ItPnBmbkZyZWUocEFsbG9jYXRvci0+cFVzZXJEYXRhLCBwVHJhdik7CisgICAgICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBwVHJhdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwUHJldiA9IHBUcmF2OworICAgICAgICBwVHJhdiA9IHBUcmF2LT5wTmV4dDsKKyAgICB9Cit9CisKKy8vIFRoaXMgdXRpbGl0eSAodXNlZCBieSB2a0luc3RhbmNlQ3JlYXRlSW5mbygpLCBsb29rcyBhdCBhIHBOZXh0IGNoYWluLiAgSXQKKy8vIGNvdW50cyBhbnkgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBzdHJ1Y3RzIHRoYXQgaXQgZmluZHMuICBJdAorLy8gdGhlbiBhbGxvY2F0ZXMgYXJyYXkgdGhhdCBjYW4gaG9sZCB0aGF0IG1hbnkgc3RydWN0cywgYXMgd2VsbCBhcyB0aGF0IG1hbnkKKy8vIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCBoYW5kbGVzLiAgSXQgdGhlbiBjb3BpZXMgZWFjaAorLy8gVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCwgYW5kIGluaXRpYWxpemVzIGVhY2ggaGFuZGxlLgorVmtSZXN1bHQgdXRpbF9Db3B5RGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9zKGNvbnN0IHZvaWQgKnBDaGFpbiwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1fbWVzc2VuZ2VycywgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqKmluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqKm1lc3NlbmdlcnMpIHsKKyAgICB1aW50MzJfdCBuID0gKm51bV9tZXNzZW5nZXJzID0gMDsKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICpwSW5mb3MgPSBOVUxMOworICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqcE1lc3NlbmdlcnMgPSBOVUxMOworCisgICAgY29uc3Qgdm9pZCAqcE5leHQgPSBwQ2hhaW47CisgICAgd2hpbGUgKHBOZXh0KSB7CisgICAgICAgIC8vIDFzdCwgY291bnQgdGhlIG51bWJlciBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUOgorICAgICAgICBpZiAoKChWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICopcE5leHQpLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ1JFQVRFX0lORk9fRVhUKSB7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgICAgcE5leHQgPSAodm9pZCAqKSgoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqKXBOZXh0KS0+cE5leHQ7CisgICAgfQorICAgIGlmIChuID09IDApIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisvLyAybmQsIGFsbG9jYXRlIG1lbW9yeSBmb3IgZWFjaCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUOgorI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgeworI2Vsc2UKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKSB7CisgICAgICAgIHBJbmZvcyA9ICppbmZvcyA9ICgoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqKXBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24oCisgICAgICAgICAgICBwQWxsb2NhdG9yLT5wVXNlckRhdGEsIG4gKiBzaXplb2YoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCksIHNpemVvZih2b2lkICopLAorICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKSk7CisgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICBwSW5mb3MgPSAqaW5mb3MgPSAoKFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgKiltYWxsb2MobiAqIHNpemVvZihWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKSkpOworICAgIH0KKyAgICBpZiAoIXBJbmZvcykgeworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKy8vIDNyZCwgYWxsb2NhdGUgbWVtb3J5IGZvciBhIHVuaXF1ZSBoYW5kbGUgZm9yIGVhY2ggY2FsbGJhY2s6CisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICB7CisjZWxzZQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcE1lc3NlbmdlcnMgPSAqbWVzc2VuZ2VycyA9ICgoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICopcEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHBBbGxvY2F0b3ItPnBVc2VyRGF0YSwgbiAqIHNpemVvZihWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQpLCBzaXplb2Yodm9pZCAqKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKSk7CisgICAgICAgIGlmIChOVUxMID09IHBNZXNzZW5nZXJzKSB7CisgICAgICAgICAgICBwQWxsb2NhdG9yLT5wZm5GcmVlKHBBbGxvY2F0b3ItPnBVc2VyRGF0YSwgcEluZm9zKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIHBNZXNzZW5nZXJzID0gKm1lc3NlbmdlcnMgPSAoKFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqKW1hbGxvYyhuICogc2l6ZW9mKFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCkpKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcE1lc3NlbmdlcnMpIHsKKyAgICAgICAgICAgIGZyZWUocEluZm9zKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gNHRoLCBjb3B5IGVhY2ggVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBmb3IgdXNlIGJ5CisgICAgLy8gdmtEZXN0cm95SW5zdGFuY2UsIGFuZCBhc3NpZ24gYSB1bmlxdWUgaGFuZGxlIHRvIGVhY2ggbWVzc2VuZ2VyIChqdXN0CisgICAgLy8gdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3BpZWQgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCk6CisgICAgcE5leHQgPSBwQ2hhaW47CisgICAgd2hpbGUgKHBOZXh0KSB7CisgICAgICAgIGlmICgoKFZrSW5zdGFuY2VDcmVhdGVJbmZvICopcE5leHQpLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ1JFQVRFX0lORk9fRVhUKSB7CisgICAgICAgICAgICBtZW1jcHkocEluZm9zLCBwTmV4dCwgc2l6ZW9mKFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQpKTsKKyAgICAgICAgICAgICpwTWVzc2VuZ2VycysrID0gKFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCkodWludHB0cl90KXBJbmZvcysrOworICAgICAgICB9CisgICAgICAgIHBOZXh0ID0gKHZvaWQgKikoKFZrSW5zdGFuY2VDcmVhdGVJbmZvICopcE5leHQpLT5wTmV4dDsKKyAgICB9CisKKyAgICAqbnVtX21lc3NlbmdlcnMgPSBuOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIHV0aWxfRnJlZURlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvcyhjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgKmluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICptZXNzZW5nZXJzKSB7CisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICB7CisjZWxzZQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcEFsbG9jYXRvci0+cGZuRnJlZShwQWxsb2NhdG9yLT5wVXNlckRhdGEsIGluZm9zKTsKKyAgICAgICAgcEFsbG9jYXRvci0+cGZuRnJlZShwQWxsb2NhdG9yLT5wVXNlckRhdGEsIG1lc3NlbmdlcnMpOworICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgZnJlZShpbmZvcyk7CisgICAgICAgIGZyZWUobWVzc2VuZ2Vycyk7CisgICAgfQorfQorCitWa1Jlc3VsdCB1dGlsX0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJzKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX21lc3NlbmdlcnMsIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgKmluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKm1lc3NlbmdlcnMpIHsKKyAgICBWa1Jlc3VsdCBydG4gPSBWS19TVUNDRVNTOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fbWVzc2VuZ2VyczsgaSsrKSB7CisgICAgICAgIHJ0biA9IHV0aWxfQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlcihpbnN0LCAmaW5mb3NbaV0sIHBBbGxvY2F0b3IsIG1lc3NlbmdlcnNbaV0pOworICAgICAgICBpZiAocnRuICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICB1dGlsX0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyKGluc3QsIG1lc3NlbmdlcnNbal0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnRuOworfQorCit2b2lkIHV0aWxfRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJzKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX21lc3NlbmdlcnMsIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqbWVzc2VuZ2VycykgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fbWVzc2VuZ2VyczsgaSsrKSB7CisgICAgICAgIHV0aWxfRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXIoaW5zdCwgbWVzc2VuZ2Vyc1tpXSwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZGVidWdfdXRpbHNfU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZVNldmVyaXR5LCBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlcywKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgKnBDYWxsYmFja0RhdGEpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisKKyAgICBpbnN0LT5kaXNwLT5sYXllcl9pbnN0X2Rpc3AuU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoaW5zdGFuY2UsIG1lc3NhZ2VTZXZlcml0eSwgbWVzc2FnZVR5cGVzLCBwQ2FsbGJhY2tEYXRhKTsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGRlYnVnX3V0aWxzX0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworCisgICAgaW5zdC0+ZGlzcC0+bGF5ZXJfaW5zdF9kaXNwLkRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKGluc3RhbmNlLCBtZXNzZW5nZXIsIHBBbGxvY2F0b3IpOworCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IgQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlcgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVChWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKnBNZXNzZW5nZXIpIHsKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKmljZF9pbmZvID0gTlVMTDsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpbnN0YW5jZTsKKyAgICBWa1Jlc3VsdCByZXMgPSBWS19TVUNDRVNTOworICAgIHVpbnQzMl90IHN0b3JhZ2VfaWR4OworICAgIFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKnBOZXdEYmdGdW5jTm9kZSA9IE5VTEw7CisKKyNpZiAoREVCVUdfRElTQUJMRV9BUFBfQUxMT0NBVE9SUyA9PSAxKQorICAgIHsKKyNlbHNlCisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkgeworICAgICAgICBpY2RfaW5mbyA9ICgoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICopcEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbihwQWxsb2NhdG9yLT5wVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPnRvdGFsX2ljZF9jb3VudCAqIHNpemVvZihWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKSk7CisgICAgICAgIGlmIChpY2RfaW5mbykgeworICAgICAgICAgICAgbWVtc2V0KGljZF9pbmZvLCAwLCBpbnN0LT50b3RhbF9pY2RfY291bnQgKiBzaXplb2YoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIGljZF9pbmZvID0gY2FsbG9jKHNpemVvZihWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQpLCBpbnN0LT50b3RhbF9pY2RfY291bnQpOworICAgIH0KKyAgICBpZiAoIWljZF9pbmZvKSB7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc3RvcmFnZV9pZHggPSAwOworICAgIGZvciAoaWNkX3Rlcm0gPSBpbnN0LT5pY2RfdGVybXM7IGljZF90ZXJtOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0KSB7CisgICAgICAgIGlmICghaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoaWNkX3Rlcm0tPmluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgJmljZF9pbmZvW3N0b3JhZ2VfaWR4XSk7CisKKyAgICAgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBzdG9yYWdlX2lkeCsrOworICAgIH0KKworLy8gU2V0dXAgdGhlIGRlYnVnIHJlcG9ydCBjYWxsYmFjayBpbiB0aGUgdGVybWluYXRvciBzaW5jZSBhIGxheWVyIG1heSB3YW50CisvLyB0byBncmFiIHRoZSBpbmZvcm1hdGlvbiBpdHNlbGYgKFJlbmRlckRvYykgYW5kIHRoZW4gcmV0dXJuIGJhY2sgdG8gdGhlCisvLyB1c2VyIGNhbGxiYWNrIGEgc3ViLXNldCBvZiB0aGUgbWVzc2FnZXMuCisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMCkKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKSB7CisgICAgICAgIHBOZXdEYmdGdW5jTm9kZSA9IChWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICopcEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbihwQWxsb2NhdG9yLT5wVXNlckRhdGEsIHNpemVvZihWa0xheWVyRGJnRnVuY3Rpb25Ob2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQgKiksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgfSBlbHNlIHsKKyNlbHNlCisgICAgeworI2VuZGlmCisgICAgICAgIHBOZXdEYmdGdW5jTm9kZSA9IChWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICopbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgc2l6ZW9mKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgfQorICAgIGlmICghcE5ld0RiZ0Z1bmNOb2RlKSB7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIG1lbXNldChwTmV3RGJnRnVuY05vZGUsIDAsIHNpemVvZihWa0xheWVyRGJnRnVuY3Rpb25Ob2RlKSk7CisKKyAgICBwTmV3RGJnRnVuY05vZGUtPmlzX21lc3NlbmdlciA9IHRydWU7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5tZXNzZW5nZXIucGZuVXNlckNhbGxiYWNrID0gcENyZWF0ZUluZm8tPnBmblVzZXJDYWxsYmFjazsKKyAgICBwTmV3RGJnRnVuY05vZGUtPm1lc3Nlbmdlci5tZXNzYWdlU2V2ZXJpdHkgPSBwQ3JlYXRlSW5mby0+bWVzc2FnZVNldmVyaXR5OworICAgIHBOZXdEYmdGdW5jTm9kZS0+bWVzc2VuZ2VyLm1lc3NhZ2VUeXBlID0gcENyZWF0ZUluZm8tPm1lc3NhZ2VUeXBlOworICAgIHBOZXdEYmdGdW5jTm9kZS0+cFVzZXJEYXRhID0gcENyZWF0ZUluZm8tPnBVc2VyRGF0YTsKKyAgICBwTmV3RGJnRnVuY05vZGUtPnBOZXh0ID0gaW5zdC0+RGJnRnVuY3Rpb25IZWFkOworICAgIGluc3QtPkRiZ0Z1bmN0aW9uSGVhZCA9IHBOZXdEYmdGdW5jTm9kZTsKKworICAgICooVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICoqKXBNZXNzZW5nZXIgPSBpY2RfaW5mbzsKKyAgICBwTmV3RGJnRnVuY05vZGUtPm1lc3Nlbmdlci5tZXNzZW5nZXIgPSAqcE1lc3NlbmdlcjsKKworb3V0OgorCisgICAgLy8gUm9sbCBiYWNrIG9uIGVycm9ycworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICBzdG9yYWdlX2lkeCA9IDA7CisgICAgICAgIGZvciAoaWNkX3Rlcm0gPSBpbnN0LT5pY2RfdGVybXM7IGljZF90ZXJtOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGljZF9pbmZvICYmIGljZF9pbmZvW3N0b3JhZ2VfaWR4XSkgeworICAgICAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVChpY2RfdGVybS0+aW5zdGFuY2UsIGljZF9pbmZvW3N0b3JhZ2VfaWR4XSwgcEFsbG9jYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG9yYWdlX2lkeCsrOworICAgICAgICB9CisKKyNpZiAoREVCVUdfRElTQUJMRV9BUFBfQUxMT0NBVE9SUyA9PSAxKQorICAgICAgICB7CisjZWxzZQorICAgICAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwTmV3RGJnRnVuY05vZGUpIHsKKyAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLT5wZm5GcmVlKHBBbGxvY2F0b3ItPnBVc2VyRGF0YSwgcE5ld0RiZ0Z1bmNOb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF9pbmZvKSB7CisgICAgICAgICAgICAgICAgcEFsbG9jYXRvci0+cGZuRnJlZShwQWxsb2NhdG9yLT5wVXNlckRhdGEsIGljZF9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKE5VTEwgIT0gcE5ld0RiZ0Z1bmNOb2RlKSB7CisgICAgICAgICAgICAgICAgZnJlZShwTmV3RGJnRnVuY05vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE5VTEwgIT0gaWNkX2luZm8pIHsKKyAgICAgICAgICAgICAgICBmcmVlKGljZF9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGluc3RhbmNlIGNoYWluIHRlcm1pbmF0b3IgZnVuY3Rpb24gZm9yIERlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIHVpbnQzMl90IHN0b3JhZ2VfaWR4OworICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqaWNkX2luZm87CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm07CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpbnN0YW5jZTsKKyAgICBpY2RfaW5mbyA9ICooVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICoqKSZtZXNzZW5nZXI7CisgICAgc3RvcmFnZV9pZHggPSAwOworICAgIGZvciAoaWNkX3Rlcm0gPSBpbnN0LT5pY2RfdGVybXM7IGljZF90ZXJtOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0KSB7CisgICAgICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaWNkX2luZm9bc3RvcmFnZV9pZHhdKSB7CisgICAgICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoaWNkX3Rlcm0tPmluc3RhbmNlLCBpY2RfaW5mb1tzdG9yYWdlX2lkeF0sIHBBbGxvY2F0b3IpOworICAgICAgICB9CisgICAgICAgIHN0b3JhZ2VfaWR4Kys7CisgICAgfQorCisgICAgdXRpbF9EZXN0cm95RGVidWdVdGlsc01lc3NlbmdlcihpbnN0LCBtZXNzZW5nZXIsIHBBbGxvY2F0b3IpOworCisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICB7CisjZWxzZQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcEFsbG9jYXRvci0+cGZuRnJlZShwQWxsb2NhdG9yLT5wVXNlckRhdGEsIGljZF9pbmZvKTsKKyAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIGZyZWUoaWNkX2luZm8pOworICAgIH0KK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IgU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZVNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICpwQ2FsbGJhY2tEYXRhKSB7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZsb2FkZXJfbG9jayk7CisgICAgLy8gTk9URTogSnVzdCBtYWtlIHRoZSBjYWxsYmFjayBvdXJzZWx2ZXMgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmUgb3IgbW9yZSBJQ0RzIHRoYXQgc3VwcG9ydCB0aGlzIGV4dGVuc2lvbgorICAgIC8vICAgICAgIGFuZCBlYWNoIG9uZSB3aWxsIHRyaWdnZXIgdGhlIGNhbGxiYWNrIHRvIHRoZSB1c2VyLiAgVGhpcyB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgY2FsbGJhY2sgdHJpZ2dlcnMKKyAgICAvLyAgICAgICBwZXIgbWVzc2FnZS4gIEluc3RlYWQsIGlmIHdlIGdldCBhIG1lc3NhZ2VkIHVwIHRvIGhlcmUsIHRoZW4ganVzdCB0cmlnZ2VyIHRoZSBtZXNzYWdlIG91cnNlbHZlcyBhbmQKKyAgICAvLyAgICAgICByZXR1cm4uICBUaGlzIHdvdWxkIHN0aWxsIGFsbG93IHRoZSBJQ0RzIHRvIHRyaWdnZXIgdGhlaXIgb3duIG1lc3NhZ2VzLCBidXQgd29uJ3QgZ2V0IGFueSBleHRlcm5hbCBvbmVzLgorICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWluc3RhbmNlOworICAgIHV0aWxfU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoaW5zdCwgbWVzc2FnZVNldmVyaXR5LCBtZXNzYWdlVHlwZXMsIHBDYWxsYmFja0RhdGEpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZsb2FkZXJfbG9jayk7Cit9CisKKy8vIFZLX0VYVF9kZWJ1Z19yZXBvcnQgcmVsYXRlZCBpdGVtcworCitWa1Jlc3VsdCB1dGlsX0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2soc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2spIHsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpwTmV3RGJnRnVuY05vZGUgPSBOVUxMOworCisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICB7CisjZWxzZQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcE5ld0RiZ0Z1bmNOb2RlID0gKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKilwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKHBBbGxvY2F0b3ItPnBVc2VyRGF0YSwgc2l6ZW9mKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCAqKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIHBOZXdEYmdGdW5jTm9kZSA9IChWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICopbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgc2l6ZW9mKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgfQorICAgIGlmICghcE5ld0RiZ0Z1bmNOb2RlKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChwTmV3RGJnRnVuY05vZGUsIDAsIHNpemVvZihWa0xheWVyRGJnRnVuY3Rpb25Ob2RlKSk7CisKKyAgICBwTmV3RGJnRnVuY05vZGUtPmlzX21lc3NlbmdlciA9IGZhbHNlOworICAgIHBOZXdEYmdGdW5jTm9kZS0+cmVwb3J0Lm1zZ0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5yZXBvcnQucGZuTXNnQ2FsbGJhY2sgPSBwQ3JlYXRlSW5mby0+cGZuQ2FsbGJhY2s7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5yZXBvcnQubXNnRmxhZ3MgPSBwQ3JlYXRlSW5mby0+ZmxhZ3M7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5wVXNlckRhdGEgPSBwQ3JlYXRlSW5mby0+cFVzZXJEYXRhOworICAgIHBOZXdEYmdGdW5jTm9kZS0+cE5leHQgPSBpbnN0LT5EYmdGdW5jdGlvbkhlYWQ7CisgICAgaW5zdC0+RGJnRnVuY3Rpb25IZWFkID0gcE5ld0RiZ0Z1bmNOb2RlOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK2RlYnVnX3V0aWxzX0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICpwQ2FsbGJhY2spIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZsb2FkZXJfbG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gaW5zdC0+ZGlzcC0+bGF5ZXJfaW5zdF9kaXNwLkNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ2FsbGJhY2spOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZsb2FkZXJfbG9jayk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBoYW5kbGUgcmVwb3J0aW5nCitWa0Jvb2wzMiB1dGlsX0RlYnVnUmVwb3J0TWVzc2FnZShjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBWa0ZsYWdzIG1zZ0ZsYWdzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjT2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnQ29kZSwgY29uc3QgY2hhciAqcExheWVyUHJlZml4LCBjb25zdCBjaGFyICpwTXNnKSB7CisgICAgVmtCb29sMzIgYmFpbCA9IGZhbHNlOworICAgIFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKnBUcmF2ID0gaW5zdC0+RGJnRnVuY3Rpb25IZWFkOworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIHNldmVyaXR5OworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgdHlwZXM7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIGNhbGxiYWNrX2RhdGE7CisgICAgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgb2JqZWN0X25hbWU7CisKKyAgICBkZWJ1Z191dGlsc19SZXBvcnRGbGFnc1RvQW5ub3RGbGFncyhtc2dGbGFncywgZmFsc2UsICZzZXZlcml0eSwgJnR5cGVzKTsKKyAgICBkZWJ1Z191dGlsc19SZXBvcnRPYmplY3RUb0Fubm90T2JqZWN0KG9iamVjdFR5cGUsIHNyY09iamVjdCwgJm9iamVjdF9uYW1lKTsKKworICAgIGNhbGxiYWNrX2RhdGEuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQ7CisgICAgY2FsbGJhY2tfZGF0YS5wTmV4dCA9IE5VTEw7CisgICAgY2FsbGJhY2tfZGF0YS5mbGFncyA9IDA7CisgICAgY2FsbGJhY2tfZGF0YS5wTWVzc2FnZUlkTmFtZSA9IHBMYXllclByZWZpeDsKKyAgICBjYWxsYmFja19kYXRhLm1lc3NhZ2VJZE51bWJlciA9IG1zZ0NvZGU7CisgICAgY2FsbGJhY2tfZGF0YS5wTWVzc2FnZSA9IHBNc2c7CisgICAgY2FsbGJhY2tfZGF0YS5jbWRCdWZMYWJlbENvdW50ID0gMDsKKyAgICBjYWxsYmFja19kYXRhLnBDbWRCdWZMYWJlbHMgPSBOVUxMOworICAgIGNhbGxiYWNrX2RhdGEucXVldWVMYWJlbENvdW50ID0gMDsKKyAgICBjYWxsYmFja19kYXRhLnBRdWV1ZUxhYmVscyA9IE5VTEw7CisgICAgY2FsbGJhY2tfZGF0YS5vYmplY3RDb3VudCA9IDE7CisgICAgY2FsbGJhY2tfZGF0YS5wT2JqZWN0cyA9ICZvYmplY3RfbmFtZTsKKworICAgIHdoaWxlIChwVHJhdikgeworICAgICAgICBpZiAoIXBUcmF2LT5pc19tZXNzZW5nZXIgJiYgcFRyYXYtPnJlcG9ydC5tc2dGbGFncyAmIG1zZ0ZsYWdzKSB7CisgICAgICAgICAgICBpZiAocFRyYXYtPnJlcG9ydC5wZm5Nc2dDYWxsYmFjayhtc2dGbGFncywgb2JqZWN0VHlwZSwgc3JjT2JqZWN0LCBsb2NhdGlvbiwgbXNnQ29kZSwgcExheWVyUHJlZml4LCBwTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYXYtPnBVc2VyRGF0YSkpIHsKKyAgICAgICAgICAgICAgICBiYWlsID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFRyYXYtPmlzX21lc3NlbmdlciAmJiAocFRyYXYtPm1lc3Nlbmdlci5tZXNzYWdlU2V2ZXJpdHkgJiBzZXZlcml0eSkgJiYgKHBUcmF2LT5tZXNzZW5nZXIubWVzc2FnZVR5cGUgJiB0eXBlcykpIHsKKyAgICAgICAgICAgIGlmIChwVHJhdi0+bWVzc2VuZ2VyLnBmblVzZXJDYWxsYmFjayhzZXZlcml0eSwgdHlwZXMsICZjYWxsYmFja19kYXRhLCBwVHJhdi0+cFVzZXJEYXRhKSkgeworICAgICAgICAgICAgICAgIGJhaWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcFRyYXYgPSBwVHJhdi0+cE5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIGJhaWw7Cit9CisKK3ZvaWQgdXRpbF9EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFjayhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqcFRyYXYgPSBpbnN0LT5EYmdGdW5jdGlvbkhlYWQ7CisgICAgVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqcFByZXYgPSBwVHJhdjsKKworICAgIHdoaWxlIChwVHJhdikgeworICAgICAgICBpZiAoIXBUcmF2LT5pc19tZXNzZW5nZXIgJiYgcFRyYXYtPnJlcG9ydC5tc2dDYWxsYmFjayA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgcFByZXYtPnBOZXh0ID0gcFRyYXYtPnBOZXh0OworICAgICAgICAgICAgaWYgKGluc3QtPkRiZ0Z1bmN0aW9uSGVhZCA9PSBwVHJhdikgaW5zdC0+RGJnRnVuY3Rpb25IZWFkID0gcFRyYXYtPnBOZXh0OworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgICAgICAgICB7CisjZWxzZQorICAgICAgICAgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBBbGxvY2F0b3ItPnBmbkZyZWUocEFsbG9jYXRvci0+cFVzZXJEYXRhLCBwVHJhdik7CisgICAgICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBwVHJhdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwUHJldiA9IHBUcmF2OworICAgICAgICBwVHJhdiA9IHBUcmF2LT5wTmV4dDsKKyAgICB9Cit9CisKKy8vIFRoaXMgdXRpbGl0eSAodXNlZCBieSB2a0luc3RhbmNlQ3JlYXRlSW5mbygpLCBsb29rcyBhdCBhIHBOZXh0IGNoYWluLiAgSXQKKy8vIGNvdW50cyBhbnkgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBzdHJ1Y3RzIHRoYXQgaXQgZmluZHMuICBJdAorLy8gdGhlbiBhbGxvY2F0ZXMgYXJyYXkgdGhhdCBjYW4gaG9sZCB0aGF0IG1hbnkgc3RydWN0cywgYXMgd2VsbCBhcyB0aGF0IG1hbnkKKy8vIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBoYW5kbGVzLiAgSXQgdGhlbiBjb3BpZXMgZWFjaAorLy8gVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCwgYW5kIGluaXRpYWxpemVzIGVhY2ggaGFuZGxlLgorVmtSZXN1bHQgdXRpbF9Db3B5RGVidWdSZXBvcnRDcmVhdGVJbmZvcyhjb25zdCB2b2lkICpwQ2hhaW4sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgdWludDMyX3QgKm51bV9jYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKippbmZvcywgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICoqY2FsbGJhY2tzKSB7CisgICAgdWludDMyX3QgbiA9ICpudW1fY2FsbGJhY2tzID0gMDsKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICpwSW5mb3MgPSBOVUxMOworICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqcENhbGxiYWNrcyA9IE5VTEw7CisKKyAgICBjb25zdCB2b2lkICpwTmV4dCA9IHBDaGFpbjsKKyAgICB3aGlsZSAocE5leHQpIHsKKyAgICAgICAgLy8gMXN0LCBjb3VudCB0aGUgbnVtYmVyIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQ6CisgICAgICAgIGlmICgoKFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKilwTmV4dCktPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DUkVBVEVfSU5GT19FWFQpIHsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICBwTmV4dCA9ICh2b2lkICopKChWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICopcE5leHQpLT5wTmV4dDsKKyAgICB9CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKy8vIDJuZCwgYWxsb2NhdGUgbWVtb3J5IGZvciBlYWNoIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQ6CisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICB7CisjZWxzZQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcEluZm9zID0gKmluZm9zID0gKChWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICopcEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHBBbGxvY2F0b3ItPnBVc2VyRGF0YSwgbiAqIHNpemVvZihWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKSwgc2l6ZW9mKHZvaWQgKiksCisgICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpKTsKKyAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIHBJbmZvcyA9ICppbmZvcyA9ICgoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqKW1hbGxvYyhuICogc2l6ZW9mKFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQpKSk7CisgICAgfQorICAgIGlmICghcEluZm9zKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorLy8gM3JkLCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgdW5pcXVlIGhhbmRsZSBmb3IgZWFjaCBjYWxsYmFjazoKKyNpZiAoREVCVUdfRElTQUJMRV9BUFBfQUxMT0NBVE9SUyA9PSAxKQorICAgIHsKKyNlbHNlCisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkgeworICAgICAgICBwQ2FsbGJhY2tzID0gKmNhbGxiYWNrcyA9ICgoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICopcEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHBBbGxvY2F0b3ItPnBVc2VyRGF0YSwgbiAqIHNpemVvZihWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpLCBzaXplb2Yodm9pZCAqKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKSk7CisgICAgICAgIGlmICghcENhbGxiYWNrcykgeworICAgICAgICAgICAgcEFsbG9jYXRvci0+cGZuRnJlZShwQWxsb2NhdG9yLT5wVXNlckRhdGEsIHBJbmZvcyk7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICBwQ2FsbGJhY2tzID0gKmNhbGxiYWNrcyA9ICgoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICopbWFsbG9jKG4gKiBzaXplb2YoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSkpOworICAgICAgICBpZiAoIXBDYWxsYmFja3MpIHsKKyAgICAgICAgICAgIGZyZWUocEluZm9zKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gNHRoLCBjb3B5IGVhY2ggVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBmb3IgdXNlIGJ5CisgICAgLy8gdmtEZXN0cm95SW5zdGFuY2UsIGFuZCBhc3NpZ24gYSB1bmlxdWUgaGFuZGxlIHRvIGVhY2ggY2FsbGJhY2sgKGp1c3QKKyAgICAvLyB1c2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcGllZCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKToKKyAgICBwTmV4dCA9IHBDaGFpbjsKKyAgICB3aGlsZSAocE5leHQpIHsKKyAgICAgICAgaWYgKCgoVmtJbnN0YW5jZUNyZWF0ZUluZm8gKilwTmV4dCktPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DUkVBVEVfSU5GT19FWFQpIHsKKyAgICAgICAgICAgIG1lbWNweShwSW5mb3MsIHBOZXh0LCBzaXplb2YoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCkpOworICAgICAgICAgICAgKnBDYWxsYmFja3MrKyA9IChWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpKHVpbnRwdHJfdClwSW5mb3MrKzsKKyAgICAgICAgfQorICAgICAgICBwTmV4dCA9ICh2b2lkICopKChWa0luc3RhbmNlQ3JlYXRlSW5mbyAqKXBOZXh0KS0+cE5leHQ7CisgICAgfQorCisgICAgKm51bV9jYWxsYmFja3MgPSBuOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIHV0aWxfRnJlZURlYnVnUmVwb3J0Q3JlYXRlSW5mb3MoY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICppbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKmNhbGxiYWNrcykgeworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgeworI2Vsc2UKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKSB7CisgICAgICAgIHBBbGxvY2F0b3ItPnBmbkZyZWUocEFsbG9jYXRvci0+cFVzZXJEYXRhLCBpbmZvcyk7CisgICAgICAgIHBBbGxvY2F0b3ItPnBmbkZyZWUocEFsbG9jYXRvci0+cFVzZXJEYXRhLCBjYWxsYmFja3MpOworICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgZnJlZShpbmZvcyk7CisgICAgICAgIGZyZWUoY2FsbGJhY2tzKTsKKyAgICB9Cit9CisKK1ZrUmVzdWx0IHV0aWxfQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja3Moc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2FsbGJhY2tzLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICppbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICpjYWxsYmFja3MpIHsKKyAgICBWa1Jlc3VsdCBydG4gPSBWS19TVUNDRVNTOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fY2FsbGJhY2tzOyBpKyspIHsKKyAgICAgICAgcnRuID0gdXRpbF9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrKGluc3QsICZpbmZvc1tpXSwgcEFsbG9jYXRvciwgY2FsbGJhY2tzW2ldKTsKKyAgICAgICAgaWYgKHJ0biAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgdXRpbF9EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFjayhpbnN0LCBjYWxsYmFja3Nbal0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnRuOworfQorCit2b2lkIHV0aWxfRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tzKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgdWludDMyX3QgbnVtX2NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICpjYWxsYmFja3MpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX2NhbGxiYWNrczsgaSsrKSB7CisgICAgICAgIHV0aWxfRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2soaW5zdCwgY2FsbGJhY2tzW2ldLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBkZWJ1Z191dGlsc19EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworCisgICAgaW5zdC0+ZGlzcC0+bGF5ZXJfaW5zdF9kaXNwLkRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKGluc3RhbmNlLCBjYWxsYmFjaywgcEFsbG9jYXRvcik7CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZGVidWdfdXRpbHNfRGVidWdSZXBvcnRNZXNzYWdlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdSZXBvcnRGbGFnc0VYVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqVHlwZSwgdWludDY0X3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnQ29kZSwgY29uc3QgY2hhciAqcExheWVyUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwTXNnKSB7CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworCisgICAgaW5zdC0+ZGlzcC0+bGF5ZXJfaW5zdF9kaXNwLkRlYnVnUmVwb3J0TWVzc2FnZUVYVChpbnN0YW5jZSwgZmxhZ3MsIG9ialR5cGUsIG9iamVjdCwgbG9jYXRpb24sIG1zZ0NvZGUsIHBMYXllclByZWZpeCwgcE1zZyk7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGluc3RhbmNlIGNoYWluIHRlcm1pbmF0b3IgZnVuY3Rpb24KKy8vIGZvciBDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqcENhbGxiYWNrKSB7CisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICppY2RfaW5mbyA9IE5VTEw7CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm07CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopaW5zdGFuY2U7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICB1aW50MzJfdCBzdG9yYWdlX2lkeDsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpwTmV3RGJnRnVuY05vZGUgPSBOVUxMOworCisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICB7CisjZWxzZQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgaWNkX2luZm8gPSAoKFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqKXBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24ocEFsbG9jYXRvci0+cFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT50b3RhbF9pY2RfY291bnQgKiBzaXplb2YoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKiksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCkpOworICAgICAgICBpZiAoaWNkX2luZm8pIHsKKyAgICAgICAgICAgIG1lbXNldChpY2RfaW5mbywgMCwgaW5zdC0+dG90YWxfaWNkX2NvdW50ICogc2l6ZW9mKFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICBpY2RfaW5mbyA9IGNhbGxvYyhzaXplb2YoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSwgaW5zdC0+dG90YWxfaWNkX2NvdW50KTsKKyAgICB9CisgICAgaWYgKCFpY2RfaW5mbykgeworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHN0b3JhZ2VfaWR4ID0gMDsKKyAgICBmb3IgKGljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOyBpY2RfdGVybTsgaWNkX3Rlcm0gPSBpY2RfdGVybS0+bmV4dCkgeworICAgICAgICBpZiAoIWljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKGljZF90ZXJtLT5pbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsICZpY2RfaW5mb1tzdG9yYWdlX2lkeF0pOworCisgICAgICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RvcmFnZV9pZHgrKzsKKyAgICB9CisKKy8vIFNldHVwIHRoZSBkZWJ1ZyByZXBvcnQgY2FsbGJhY2sgaW4gdGhlIHRlcm1pbmF0b3Igc2luY2UgYSBsYXllciBtYXkgd2FudAorLy8gdG8gZ3JhYiB0aGUgaW5mb3JtYXRpb24gaXRzZWxmIChSZW5kZXJEb2MpIGFuZCB0aGVuIHJldHVybiBiYWNrIHRvIHRoZQorLy8gdXNlciBjYWxsYmFjayBhIHN1Yi1zZXQgb2YgdGhlIG1lc3NhZ2VzLgorI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDApCisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkgeworICAgICAgICBwTmV3RGJnRnVuY05vZGUgPSAoVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqKXBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24ocEFsbG9jYXRvci0+cFVzZXJEYXRhLCBzaXplb2YoVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50ICopLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIH0gZWxzZSB7CisjZWxzZQorICAgIHsKKyNlbmRpZgorICAgICAgICBwTmV3RGJnRnVuY05vZGUgPSAoVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqKWxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIHNpemVvZihWa0xheWVyRGJnRnVuY3Rpb25Ob2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIH0KKyAgICBpZiAoIXBOZXdEYmdGdW5jTm9kZSkgeworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBtZW1zZXQocE5ld0RiZ0Z1bmNOb2RlLCAwLCBzaXplb2YoVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSkpOworCisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5pc19tZXNzZW5nZXIgPSBmYWxzZTsKKyAgICBwTmV3RGJnRnVuY05vZGUtPnJlcG9ydC5wZm5Nc2dDYWxsYmFjayA9IHBDcmVhdGVJbmZvLT5wZm5DYWxsYmFjazsKKyAgICBwTmV3RGJnRnVuY05vZGUtPnJlcG9ydC5tc2dGbGFncyA9IHBDcmVhdGVJbmZvLT5mbGFnczsKKyAgICBwTmV3RGJnRnVuY05vZGUtPnBVc2VyRGF0YSA9IHBDcmVhdGVJbmZvLT5wVXNlckRhdGE7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5wTmV4dCA9IGluc3QtPkRiZ0Z1bmN0aW9uSGVhZDsKKyAgICBpbnN0LT5EYmdGdW5jdGlvbkhlYWQgPSBwTmV3RGJnRnVuY05vZGU7CisKKyAgICAqKFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqKilwQ2FsbGJhY2sgPSBpY2RfaW5mbzsKKyAgICBwTmV3RGJnRnVuY05vZGUtPnJlcG9ydC5tc2dDYWxsYmFjayA9ICpwQ2FsbGJhY2s7CisKK291dDoKKworICAgIC8vIFJvbGwgYmFjayBvbiBlcnJvcnMKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgc3RvcmFnZV9pZHggPSAwOworICAgICAgICBmb3IgKGljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOyBpY2RfdGVybTsgaWNkX3Rlcm0gPSBpY2RfdGVybS0+bmV4dCkgeworICAgICAgICAgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpY2RfaW5mbyAmJiBpY2RfaW5mb1tzdG9yYWdlX2lkeF0pIHsKKyAgICAgICAgICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoaWNkX3Rlcm0tPmluc3RhbmNlLCBpY2RfaW5mb1tzdG9yYWdlX2lkeF0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcmFnZV9pZHgrKzsKKyAgICAgICAgfQorCisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICAgICAgeworI2Vsc2UKKyAgICAgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gcE5ld0RiZ0Z1bmNOb2RlKSB7CisgICAgICAgICAgICAgICAgcEFsbG9jYXRvci0+cGZuRnJlZShwQWxsb2NhdG9yLT5wVXNlckRhdGEsIHBOZXdEYmdGdW5jTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2RfaW5mbykgeworICAgICAgICAgICAgICAgIHBBbGxvY2F0b3ItPnBmbkZyZWUocEFsbG9jYXRvci0+cFVzZXJEYXRhLCBpY2RfaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHBOZXdEYmdGdW5jTm9kZSkgeworICAgICAgICAgICAgICAgIGZyZWUocE5ld0RiZ0Z1bmNOb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF9pbmZvKSB7CisgICAgICAgICAgICAgICAgZnJlZShpY2RfaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBUaGlzIGlzIHRoZSBpbnN0YW5jZSBjaGFpbiB0ZXJtaW5hdG9yIGZ1bmN0aW9uIGZvciBEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFjaworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIHVpbnQzMl90IHN0b3JhZ2VfaWR4OworICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqaWNkX2luZm87CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm07CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpbnN0YW5jZTsKKyAgICBpY2RfaW5mbyA9ICooVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICoqKSZjYWxsYmFjazsKKyAgICBzdG9yYWdlX2lkeCA9IDA7CisgICAgZm9yIChpY2RfdGVybSA9IGluc3QtPmljZF90ZXJtczsgaWNkX3Rlcm07IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQpIHsKKyAgICAgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpY2RfaW5mb1tzdG9yYWdlX2lkeF0pIHsKKyAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChpY2RfdGVybS0+aW5zdGFuY2UsIGljZF9pbmZvW3N0b3JhZ2VfaWR4XSwgcEFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgc3RvcmFnZV9pZHgrKzsKKyAgICB9CisKKyAgICB1dGlsX0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrKGluc3QsIGNhbGxiYWNrLCBwQWxsb2NhdG9yKTsKKworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgeworI2Vsc2UKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKSB7CisgICAgICAgIHBBbGxvY2F0b3ItPnBmbkZyZWUocEFsbG9jYXRvci0+cFVzZXJEYXRhLCBpY2RfaW5mbyk7CisgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICBmcmVlKGljZF9pbmZvKTsKKyAgICB9Cit9CisKKy8vIFRoaXMgaXMgdGhlIGluc3RhbmNlIGNoYWluIHRlcm1pbmF0b3IgZnVuY3Rpb24gZm9yIERlYnVnUmVwb3J0TWVzc2FnZQorVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9EZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqVHlwZSwgdWludDY0X3Qgb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1zZ0NvZGUsIGNvbnN0IGNoYXIgKnBMYXllclByZWZpeCwgY29uc3QgY2hhciAqcE1zZykgeworICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtOworCisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopaW5zdGFuY2U7CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICBmb3IgKGljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOyBpY2RfdGVybTsgaWNkX3Rlcm0gPSBpY2RfdGVybS0+bmV4dCkgeworICAgICAgICBpZiAoaWNkX3Rlcm0tPmRpc3BhdGNoLkRlYnVnUmVwb3J0TWVzc2FnZUVYVCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guRGVidWdSZXBvcnRNZXNzYWdlRVhUKGljZF90ZXJtLT5pbnN0YW5jZSwgZmxhZ3MsIG9ialR5cGUsIG9iamVjdCwgbG9jYXRpb24sIG1zZ0NvZGUsIHBMYXllclByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCBhbGwgSUNEcyBoYXZlIHNlZW4gdGhlIG1lc3NhZ2UsIGNhbGwgdGhlIG5lY2Vzc2FyeSBjYWxsYmFja3MuICBJZ25vcmluZyAiYmFpbCIgcmV0dXJuIHZhbHVlCisgICAgLy8gYXMgdGhlcmUgaXMgbm90aGluZyB0byBiYWlsIGZyb20gYXQgdGhpcyBwb2ludC4KKworICAgIHV0aWxfRGVidWdSZXBvcnRNZXNzYWdlKGluc3QsIGZsYWdzLCBvYmpUeXBlLCBvYmplY3QsIGxvY2F0aW9uLCBtc2dDb2RlLCBwTGF5ZXJQcmVmaXgsIHBNc2cpOworCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKK30KKworLy8gR2VuZXJhbCB1dGlsaXRpZXMKKworc3RhdGljIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyBkZWJ1Z191dGlsc19leHRlbnNpb25faW5mb1tdID0geworICAgIHtWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FLCBWS19FWFRfREVCVUdfUkVQT1JUX1NQRUNfVkVSU0lPTn0sCisgICAge1ZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSwgVktfRVhUX0RFQlVHX1VUSUxTX1NQRUNfVkVSU0lPTn0sCit9OworCit2b2lkIGRlYnVnX3V0aWxzX0FkZEluc3RhbmNlRXh0ZW5zaW9ucyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2V4dGVuc2lvbl9saXN0ICpleHRfbGlzdCkgeworICAgIGxvYWRlcl9hZGRfdG9fZXh0X2xpc3QoaW5zdCwgZXh0X2xpc3QsIHNpemVvZihkZWJ1Z191dGlsc19leHRlbnNpb25faW5mbykgLyBzaXplb2YoVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3V0aWxzX2V4dGVuc2lvbl9pbmZvKTsKK30KKwordm9pZCBkZWJ1Z191dGlsc19DcmVhdGVJbnN0YW5jZShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UsIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbykgeworICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmV4dF9kZWJ1Z19yZXBvcnQgPSAwOworICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmV4dF9kZWJ1Z191dGlscyA9IDA7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfcmVwb3J0ID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19FWFRfREVCVUdfVVRJTFNfRVhURU5TSU9OX05BTUUpID09IDApIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmV4dF9kZWJ1Z191dGlscyA9IDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgZGVidWdfdXRpbHNfSW5zdGFuY2VHcGEoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICoqYWRkcikgeworICAgIGJvb2wgcmV0X3R5cGUgPSBmYWxzZTsKKworICAgICphZGRyID0gTlVMTDsKKworICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmV4dF9kZWJ1Z19yZXBvcnQgPT0gMSA/ICh2b2lkICopZGVidWdfdXRpbHNfQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCA6IE5VTEw7CisgICAgICAgIHJldF90eXBlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmV4dF9kZWJ1Z19yZXBvcnQgPT0gMSA/ICh2b2lkICopZGVidWdfdXRpbHNfRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgOiBOVUxMOworICAgICAgICByZXRfdHlwZSA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKCJ2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2RlYnVnX3JlcG9ydCA9PSAxID8gKHZvaWQgKilkZWJ1Z191dGlsc19EZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2RlYnVnX3V0aWxzID09IDEgPyAodm9pZCAqKWRlYnVnX3V0aWxzX0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgOiBOVUxMOworICAgICAgICByZXRfdHlwZSA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKCJ2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHMgPT0gMSA/ICh2b2lkICopZGVidWdfdXRpbHNfRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgOiBOVUxMOworICAgICAgICByZXRfdHlwZSA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKCJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHMgPT0gMSA/ICh2b2lkICopZGVidWdfdXRpbHNfU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQgOiBOVUxMOworICAgICAgICByZXRfdHlwZSA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHJldF90eXBlOworfQorCitib29sIGRlYnVnX3V0aWxzX1JlcG9ydEZsYWdzVG9Bbm5vdEZsYWdzKFZrRGVidWdSZXBvcnRGbGFnc0VYVCBkcl9mbGFncywgYm9vbCBkZWZhdWx0X2ZsYWdfaXNfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgKmRhX3NldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICpkYV90eXBlKSB7CisgICAgYm9vbCB0eXBlX3NldCA9IGZhbHNlOworICAgIGlmIChOVUxMID09IGRhX3NldmVyaXR5IHx8IE5VTEwgPT0gZGFfdHlwZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpkYV90eXBlID0gMDsKKyAgICAqZGFfc2V2ZXJpdHkgPSAwOworCisgICAgaWYgKChkcl9mbGFncyAmIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUKSAhPSAwKSB7CisgICAgICAgICpkYV9zZXZlcml0eSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUOworICAgICAgICAqZGFfdHlwZSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfR0VORVJBTF9CSVRfRVhUOworICAgICAgICB0eXBlX3NldCA9IHRydWU7CisgICAgfSBlbHNlIGlmICgoZHJfZmxhZ3MgJiAoVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCB8IFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQpKSAhPSAwKSB7CisgICAgICAgICpkYV9zZXZlcml0eSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUOworICAgIH0gZWxzZSBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRhX3NldmVyaXR5ID0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9FUlJPUl9CSVRfRVhUOworICAgIH0gZWxzZSBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRhX3NldmVyaXR5ID0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9WRVJCT1NFX0JJVF9FWFQ7CisgICAgICAgICpkYV90eXBlIHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9HRU5FUkFMX0JJVF9FWFQ7CisgICAgICAgIHR5cGVfc2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZGFfdHlwZSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfUEVSRk9STUFOQ0VfQklUX0VYVDsKKyAgICB9IGVsc2UgaWYgKCF0eXBlX3NldCkgeworICAgICAgICBpZiAoZGVmYXVsdF9mbGFnX2lzX3NwZWMpIHsKKyAgICAgICAgICAgICpkYV90eXBlIHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9WQUxJREFUSU9OX0JJVF9FWFQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGFfdHlwZSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfR0VORVJBTF9CSVRfRVhUOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZGVidWdfdXRpbHNfQW5ub3RGbGFnc1RvUmVwb3J0RmxhZ3MoVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgZGFfc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgZGFfdHlwZSwgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICpkcl9mbGFncykgeworICAgIGlmIChOVUxMID09IGRyX2ZsYWdzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqZHJfZmxhZ3MgPSAwOworCisgICAgaWYgKChkYV9zZXZlcml0eSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZHJfZmxhZ3MgfD0gVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQ7CisgICAgfSBlbHNlIGlmICgoZGFfc2V2ZXJpdHkgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1dBUk5JTkdfQklUX0VYVCkgIT0gMCkgeworICAgICAgICBpZiAoKGRhX3R5cGUgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfUEVSRk9STUFOQ0VfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAgICAgKmRyX2ZsYWdzIHw9IFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHJfZmxhZ3MgfD0gVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKGRhX3NldmVyaXR5ICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9JTkZPX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRyX2ZsYWdzIHw9IFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUOworICAgIH0gZWxzZSBpZiAoKGRhX3NldmVyaXR5ICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9WRVJCT1NFX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRyX2ZsYWdzIHw9IFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhUOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGRlYnVnX3V0aWxzX1JlcG9ydE9iamVjdFRvQW5ub3RPYmplY3QoVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgZHJfb2JqZWN0X3R5cGUsIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgKmRhX29iamVjdF9uYW1lX2luZm8pIHsKKyAgICBpZiAoTlVMTCA9PSBkYV9vYmplY3RfbmFtZV9pbmZvKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGFfb2JqZWN0X25hbWVfaW5mby0+c1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVDsKKyAgICBkYV9vYmplY3RfbmFtZV9pbmZvLT5wTmV4dCA9IE5VTEw7CisgICAgZGFfb2JqZWN0X25hbWVfaW5mby0+b2JqZWN0SGFuZGxlID0gKHVpbnQ2NF90KSh1aW50cHRyX3Qpb2JqZWN0X2hhbmRsZTsKKyAgICBkYV9vYmplY3RfbmFtZV9pbmZvLT5wT2JqZWN0TmFtZSA9IE5VTEw7CisgICAgZGFfb2JqZWN0X25hbWVfaW5mby0+b2JqZWN0VHlwZSA9IGNvbnZlcnREZWJ1Z1JlcG9ydE9iamVjdFRvQ29yZU9iamVjdChkcl9vYmplY3RfdHlwZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZGVidWdfdXRpbHNfQW5ub3RPYmplY3RUb0RlYnVnUmVwb3J0T2JqZWN0KGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUICpkYV9vYmplY3RfbmFtZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgKmRyX29iamVjdF90eXBlLCB1aW50NjRfdCAqZHJfb2JqZWN0X2hhbmRsZSkgeworICAgIGlmIChOVUxMID09IGRhX29iamVjdF9uYW1lX2luZm8gfHwgTlVMTCA9PSBkcl9vYmplY3RfdHlwZSB8fCBOVUxMID09IGRyX29iamVjdF9oYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqZHJfb2JqZWN0X3R5cGUgPSBjb252ZXJ0Q29yZU9iamVjdFRvRGVidWdSZXBvcnRPYmplY3QoZGFfb2JqZWN0X25hbWVfaW5mby0+b2JqZWN0VHlwZSk7CisgICAgKmRyX29iamVjdF9oYW5kbGUgPSBkYV9vYmplY3RfbmFtZV9pbmZvLT5vYmplY3RIYW5kbGU7CisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2RlYnVnX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2RlYnVnX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzYTZmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZGVidWdfdXRpbHMuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1hcmsgWW91bmcgPG1hcmt5a0BsdW5hcmcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAidmtfbG9hZGVyX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAibG9hZGVyLmgiCisKKy8vIEdlbmVyYWwgdXRpbGl0aWVzCisKK3ZvaWQgZGVidWdfdXRpbHNfQWRkSW5zdGFuY2VFeHRlbnNpb25zKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgKmV4dF9saXN0KTsKK3ZvaWQgZGVidWdfdXRpbHNfQ3JlYXRlSW5zdGFuY2Uoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlLCBjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pOworYm9vbCBkZWJ1Z191dGlsc19JbnN0YW5jZUdwYShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKiphZGRyKTsKK2Jvb2wgZGVidWdfdXRpbHNfUmVwb3J0RmxhZ3NUb0Fubm90RmxhZ3MoVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUIGRyX2ZsYWdzLCBib29sIGRlZmF1bHRfZmxhZ19pc19zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCAqZGFfc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgKmRhX3R5cGUpOworYm9vbCBkZWJ1Z191dGlsc19Bbm5vdEZsYWdzVG9SZXBvcnRGbGFncyhWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBkYV9zZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBkYV90eXBlLCBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgKmRyX2ZsYWdzKTsKK2Jvb2wgZGVidWdfdXRpbHNfUmVwb3J0T2JqZWN0VG9Bbm5vdE9iamVjdChWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBkcl9vYmplY3RfdHlwZSwgdWludDY0X3Qgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCAqZGFfb2JqZWN0X25hbWVfaW5mbyk7Citib29sIGRlYnVnX3V0aWxzX0Fubm90T2JqZWN0VG9EZWJ1Z1JlcG9ydE9iamVjdChjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCAqZGFfb2JqZWN0X25hbWVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUICpkcl9vYmplY3RfdHlwZSwgdWludDY0X3QgKmRyX29iamVjdF9oYW5kbGUpOworCisvLyBWS19FWFRfZGVidWdfdXRpbHMgcmVsYXRlZCBpdGVtcworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqcE1lc3Nlbmdlcik7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcik7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIG1lc3NhZ2VTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAqcENhbGxiYWNrRGF0YSk7CitWa1Jlc3VsdCB1dGlsX0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXIoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgbWVzc2VuZ2VyKTsKK1ZrUmVzdWx0IHV0aWxfQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlcnMoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1fbWVzc2VuZ2VycywgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqbWVzc2VuZ2Vycyk7CitWa0Jvb2wzMiB1dGlsX1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIG1lc3NhZ2VTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAqcENhbGxiYWNrRGF0YSk7CitWa1Jlc3VsdCB1dGlsX0NvcHlEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb3MoY29uc3Qgdm9pZCAqcENoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bV9tZXNzZW5nZXJzLCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICoqaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICoqbWVzc2VuZ2Vycyk7Cit2b2lkIHV0aWxfRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXIoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpOwordm9pZCB1dGlsX0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VycyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9tZXNzZW5nZXJzLCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKm1lc3NlbmdlcnMpOwordm9pZCB1dGlsX0ZyZWVEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb3MoY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICppbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqbWVzc2VuZ2Vycyk7CisKKy8vIFZLX0VYVF9kZWJ1Z19yZXBvcnQgcmVsYXRlZCBpdGVtcworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqcENhbGxiYWNrKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfRGVidWdSZXBvcnRNZXNzYWdlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdSZXBvcnRGbGFnc0VYVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9ialR5cGUsIHVpbnQ2NF90IG9iamVjdCwgc2l6ZV90IGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtc2dDb2RlLCBjb25zdCBjaGFyICpwTGF5ZXJQcmVmaXgsIGNvbnN0IGNoYXIgKnBNc2cpOworCitWa1Jlc3VsdCB1dGlsX0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2soc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2spOworVmtSZXN1bHQgdXRpbF9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrcyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9jYWxsYmFja3MsIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKmluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKmNhbGxiYWNrcyk7CitWa0Jvb2wzMiB1dGlsX0RlYnVnUmVwb3J0TWVzc2FnZShjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBWa0ZsYWdzIG1zZ0ZsYWdzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjT2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnQ29kZSwgY29uc3QgY2hhciAqcExheWVyUHJlZml4LCBjb25zdCBjaGFyICpwTXNnKTsKK1ZrUmVzdWx0IHV0aWxfQ29weURlYnVnUmVwb3J0Q3JlYXRlSW5mb3MoY29uc3Qgdm9pZCAqcENoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIHVpbnQzMl90ICpudW1fY2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICoqaW5mb3MsIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqKmNhbGxiYWNrcyk7Cit2b2lkIHV0aWxfRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2soc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcik7Cit2b2lkIHV0aWxfRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tzKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgdWludDMyX3QgbnVtX2NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICpjYWxsYmFja3MpOwordm9pZCB1dGlsX0ZyZWVEZWJ1Z1JlcG9ydENyZWF0ZUluZm9zKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICpjYWxsYmFja3MpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9kZXZfZXh0X3RyYW1wb2xpbmUuYyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZGV2X2V4dF90cmFtcG9saW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlZWUwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZGV2X2V4dF90cmFtcG9saW5lLmMKQEAgLTAsMCArMSw1MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IExlbm55IEtvbW93IDxsZW5ueUBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJsb2FkZXIuaCIKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX2NsYW5nX18pCisjcHJhZ21hIEdDQyBvcHRpbWl6ZSgzKSAgLy8gZm9yY2UgZ2NjIHRvIHVzZSB0YWlsLWNhbGxzCisjZW5kaWYKKworLy8gQ2xhbmctZm9ybWF0IGRvZXMgbm90IHVuZGVyc3RhbmQgbWFjcm9zLgorLy8gY2xhbmctZm9ybWF0IG9mZgorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ5KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTEoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTQoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTcoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxOShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjAoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIxKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjMoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDI0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyNShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjYoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDI3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyOChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjkoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDMwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQzMShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MzIoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDMzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQzNChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MzUoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDM2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQzNyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MzgoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDM5KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ0MChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NDEoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDQyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ0MyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NDQoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDQ1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ0NihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NDcoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDQ4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ0OShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NTAoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDUxKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ1MihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NTMoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDU0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ1NShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NTYoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDU3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ1OChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NTkoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDYwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ2MShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NjIoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDYzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ2NChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NjUoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDY2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ2NyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NjgoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDY5KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ3MChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NzEoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDcyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ3MyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NzQoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDc1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ3NihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0NzcoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDc4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ3OShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0ODAoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDgxKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ4MihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0ODMoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDg0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ4NShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0ODYoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDg3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ4OChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0ODkoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDkwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ5MShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0OTIoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDkzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ5NChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0OTUoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDk2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQ5NyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0OTgoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDk5KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMDAoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEwMShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTAyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMDMoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEwNChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTA1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMDYoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEwNyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTA4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMDkoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDExMChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTExKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMTIoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDExMyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTE0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMTUoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDExNihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTE3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMTgoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDExOShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTIwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMjEoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEyMihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTIzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMjQoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEyNShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTI2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMjcoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEyOChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTI5KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMzAoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEzMShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTMyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMzMoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEzNChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTM1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMzYoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDEzNyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTM4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxMzkoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE0MChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTQxKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNDIoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE0MyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTQ0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNDUoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE0NihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTQ3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNDgoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE0OShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTUwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNTEoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE1MihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTUzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNTQoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE1NShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTU2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNTcoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE1OChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTU5KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNjAoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE2MShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTYyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNjMoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE2NChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTY1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNjYoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE2NyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTY4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNjkoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE3MChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTcxKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNzIoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE3MyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTc0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNzUoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE3NihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTc3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxNzgoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE3OShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTgwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxODEoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE4MihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTgzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxODQoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE4NShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTg2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxODcoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE4OChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTg5KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxOTAoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE5MShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTkyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxOTMoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE5NChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTk1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxOTYoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDE5NyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MTk4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQxOTkoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIwMChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjAxKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMDIoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIwMyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjA0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMDUoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIwNihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjA3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMDgoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIwOShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjEwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMTEoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIxMihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjEzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMTQoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIxNShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjE2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMTcoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIxOChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjE5KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMjAoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIyMShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjIyKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMjMoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIyNChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjI1KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMjYoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIyNyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjI4KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMjkoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIzMChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjMxKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMzIoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIzMyhWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjM0KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMzUoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIzNihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjM3KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyMzgoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDIzOShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjQwKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyNDEoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDI0MihWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjQzKFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyNDQoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDI0NShWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjQ2KFZrRGV2aWNlIGRldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQyNDcoVmtEZXZpY2UgZGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrZGV2X2V4dDI0OChWa0RldmljZSBkZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtkZXZfZXh0MjQ5KFZrRGV2aWNlIGRldmljZSk7CisKK3ZvaWQgKmxvYWRlcl9nZXRfZGV2X2V4dF90cmFtcG9saW5lKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3dpdGNoIChpbmRleCkgeworI2RlZmluZSBDQVNFX0hBTkRMRShudW0pIGNhc2UgbnVtOiByZXR1cm4gdmtkZXZfZXh0IyNudW0KKyAgICAgICAgQ0FTRV9IQU5ETEUoMCk7CisgICAgICAgIENBU0VfSEFORExFKDEpOworICAgICAgICBDQVNFX0hBTkRMRSgyKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMyk7CisgICAgICAgIENBU0VfSEFORExFKDQpOworICAgICAgICBDQVNFX0hBTkRMRSg1KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNik7CisgICAgICAgIENBU0VfSEFORExFKDcpOworICAgICAgICBDQVNFX0hBTkRMRSg4KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoOSk7CisgICAgICAgIENBU0VfSEFORExFKDEwKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMTEpOworICAgICAgICBDQVNFX0hBTkRMRSgxMik7CisgICAgICAgIENBU0VfSEFORExFKDEzKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMTQpOworICAgICAgICBDQVNFX0hBTkRMRSgxNSk7CisgICAgICAgIENBU0VfSEFORExFKDE2KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMTcpOworICAgICAgICBDQVNFX0hBTkRMRSgxOCk7CisgICAgICAgIENBU0VfSEFORExFKDE5KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMjApOworICAgICAgICBDQVNFX0hBTkRMRSgyMSk7CisgICAgICAgIENBU0VfSEFORExFKDIyKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMjMpOworICAgICAgICBDQVNFX0hBTkRMRSgyNCk7CisgICAgICAgIENBU0VfSEFORExFKDI1KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMjYpOworICAgICAgICBDQVNFX0hBTkRMRSgyNyk7CisgICAgICAgIENBU0VfSEFORExFKDI4KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMjkpOworICAgICAgICBDQVNFX0hBTkRMRSgzMCk7CisgICAgICAgIENBU0VfSEFORExFKDMxKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMzIpOworICAgICAgICBDQVNFX0hBTkRMRSgzMyk7CisgICAgICAgIENBU0VfSEFORExFKDM0KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMzUpOworICAgICAgICBDQVNFX0hBTkRMRSgzNik7CisgICAgICAgIENBU0VfSEFORExFKDM3KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoMzgpOworICAgICAgICBDQVNFX0hBTkRMRSgzOSk7CisgICAgICAgIENBU0VfSEFORExFKDQwKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNDEpOworICAgICAgICBDQVNFX0hBTkRMRSg0Mik7CisgICAgICAgIENBU0VfSEFORExFKDQzKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNDQpOworICAgICAgICBDQVNFX0hBTkRMRSg0NSk7CisgICAgICAgIENBU0VfSEFORExFKDQ2KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNDcpOworICAgICAgICBDQVNFX0hBTkRMRSg0OCk7CisgICAgICAgIENBU0VfSEFORExFKDQ5KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNTApOworICAgICAgICBDQVNFX0hBTkRMRSg1MSk7CisgICAgICAgIENBU0VfSEFORExFKDUyKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNTMpOworICAgICAgICBDQVNFX0hBTkRMRSg1NCk7CisgICAgICAgIENBU0VfSEFORExFKDU1KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNTYpOworICAgICAgICBDQVNFX0hBTkRMRSg1Nyk7CisgICAgICAgIENBU0VfSEFORExFKDU4KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNTkpOworICAgICAgICBDQVNFX0hBTkRMRSg2MCk7CisgICAgICAgIENBU0VfSEFORExFKDYxKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNjIpOworICAgICAgICBDQVNFX0hBTkRMRSg2Myk7CisgICAgICAgIENBU0VfSEFORExFKDY0KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNjUpOworICAgICAgICBDQVNFX0hBTkRMRSg2Nik7CisgICAgICAgIENBU0VfSEFORExFKDY3KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNjgpOworICAgICAgICBDQVNFX0hBTkRMRSg2OSk7CisgICAgICAgIENBU0VfSEFORExFKDcwKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNzEpOworICAgICAgICBDQVNFX0hBTkRMRSg3Mik7CisgICAgICAgIENBU0VfSEFORExFKDczKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNzQpOworICAgICAgICBDQVNFX0hBTkRMRSg3NSk7CisgICAgICAgIENBU0VfSEFORExFKDc2KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoNzcpOworICAgICAgICBDQVNFX0hBTkRMRSg3OCk7CisgICAgICAgIENBU0VfSEFORExFKDc5KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoODApOworICAgICAgICBDQVNFX0hBTkRMRSg4MSk7CisgICAgICAgIENBU0VfSEFORExFKDgyKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoODMpOworICAgICAgICBDQVNFX0hBTkRMRSg4NCk7CisgICAgICAgIENBU0VfSEFORExFKDg1KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoODYpOworICAgICAgICBDQVNFX0hBTkRMRSg4Nyk7CisgICAgICAgIENBU0VfSEFORExFKDg4KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoODkpOworICAgICAgICBDQVNFX0hBTkRMRSg5MCk7CisgICAgICAgIENBU0VfSEFORExFKDkxKTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoOTIpOworICAgICAgICBDQVNFX0hBTkRMRSg5Myk7CisgICAgICAgIENBU0VfSEFORExFKDk0KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoOTUpOworICAgICAgICBDQVNFX0hBTkRMRSg5Nik7CisgICAgICAgIENBU0VfSEFORExFKDk3KTsKKyAgICAgICAgQ0FTRV9IQU5ETEUoOTgpOworICAgICAgICBDQVNFX0hBTkRMRSg5OSk7CisgICAgICAgIENBU0VfSEFORExFKDEwMCk7CisgICAgICAgIENBU0VfSEFORExFKDEwMSk7CisgICAgICAgIENBU0VfSEFORExFKDEwMik7CisgICAgICAgIENBU0VfSEFORExFKDEwMyk7CisgICAgICAgIENBU0VfSEFORExFKDEwNCk7CisgICAgICAgIENBU0VfSEFORExFKDEwNSk7CisgICAgICAgIENBU0VfSEFORExFKDEwNik7CisgICAgICAgIENBU0VfSEFORExFKDEwNyk7CisgICAgICAgIENBU0VfSEFORExFKDEwOCk7CisgICAgICAgIENBU0VfSEFORExFKDEwOSk7CisgICAgICAgIENBU0VfSEFORExFKDExMCk7CisgICAgICAgIENBU0VfSEFORExFKDExMSk7CisgICAgICAgIENBU0VfSEFORExFKDExMik7CisgICAgICAgIENBU0VfSEFORExFKDExMyk7CisgICAgICAgIENBU0VfSEFORExFKDExNCk7CisgICAgICAgIENBU0VfSEFORExFKDExNSk7CisgICAgICAgIENBU0VfSEFORExFKDExNik7CisgICAgICAgIENBU0VfSEFORExFKDExNyk7CisgICAgICAgIENBU0VfSEFORExFKDExOCk7CisgICAgICAgIENBU0VfSEFORExFKDExOSk7CisgICAgICAgIENBU0VfSEFORExFKDEyMCk7CisgICAgICAgIENBU0VfSEFORExFKDEyMSk7CisgICAgICAgIENBU0VfSEFORExFKDEyMik7CisgICAgICAgIENBU0VfSEFORExFKDEyMyk7CisgICAgICAgIENBU0VfSEFORExFKDEyNCk7CisgICAgICAgIENBU0VfSEFORExFKDEyNSk7CisgICAgICAgIENBU0VfSEFORExFKDEyNik7CisgICAgICAgIENBU0VfSEFORExFKDEyNyk7CisgICAgICAgIENBU0VfSEFORExFKDEyOCk7CisgICAgICAgIENBU0VfSEFORExFKDEyOSk7CisgICAgICAgIENBU0VfSEFORExFKDEzMCk7CisgICAgICAgIENBU0VfSEFORExFKDEzMSk7CisgICAgICAgIENBU0VfSEFORExFKDEzMik7CisgICAgICAgIENBU0VfSEFORExFKDEzMyk7CisgICAgICAgIENBU0VfSEFORExFKDEzNCk7CisgICAgICAgIENBU0VfSEFORExFKDEzNSk7CisgICAgICAgIENBU0VfSEFORExFKDEzNik7CisgICAgICAgIENBU0VfSEFORExFKDEzNyk7CisgICAgICAgIENBU0VfSEFORExFKDEzOCk7CisgICAgICAgIENBU0VfSEFORExFKDEzOSk7CisgICAgICAgIENBU0VfSEFORExFKDE0MCk7CisgICAgICAgIENBU0VfSEFORExFKDE0MSk7CisgICAgICAgIENBU0VfSEFORExFKDE0Mik7CisgICAgICAgIENBU0VfSEFORExFKDE0Myk7CisgICAgICAgIENBU0VfSEFORExFKDE0NCk7CisgICAgICAgIENBU0VfSEFORExFKDE0NSk7CisgICAgICAgIENBU0VfSEFORExFKDE0Nik7CisgICAgICAgIENBU0VfSEFORExFKDE0Nyk7CisgICAgICAgIENBU0VfSEFORExFKDE0OCk7CisgICAgICAgIENBU0VfSEFORExFKDE0OSk7CisgICAgICAgIENBU0VfSEFORExFKDE1MCk7CisgICAgICAgIENBU0VfSEFORExFKDE1MSk7CisgICAgICAgIENBU0VfSEFORExFKDE1Mik7CisgICAgICAgIENBU0VfSEFORExFKDE1Myk7CisgICAgICAgIENBU0VfSEFORExFKDE1NCk7CisgICAgICAgIENBU0VfSEFORExFKDE1NSk7CisgICAgICAgIENBU0VfSEFORExFKDE1Nik7CisgICAgICAgIENBU0VfSEFORExFKDE1Nyk7CisgICAgICAgIENBU0VfSEFORExFKDE1OCk7CisgICAgICAgIENBU0VfSEFORExFKDE1OSk7CisgICAgICAgIENBU0VfSEFORExFKDE2MCk7CisgICAgICAgIENBU0VfSEFORExFKDE2MSk7CisgICAgICAgIENBU0VfSEFORExFKDE2Mik7CisgICAgICAgIENBU0VfSEFORExFKDE2Myk7CisgICAgICAgIENBU0VfSEFORExFKDE2NCk7CisgICAgICAgIENBU0VfSEFORExFKDE2NSk7CisgICAgICAgIENBU0VfSEFORExFKDE2Nik7CisgICAgICAgIENBU0VfSEFORExFKDE2Nyk7CisgICAgICAgIENBU0VfSEFORExFKDE2OCk7CisgICAgICAgIENBU0VfSEFORExFKDE2OSk7CisgICAgICAgIENBU0VfSEFORExFKDE3MCk7CisgICAgICAgIENBU0VfSEFORExFKDE3MSk7CisgICAgICAgIENBU0VfSEFORExFKDE3Mik7CisgICAgICAgIENBU0VfSEFORExFKDE3Myk7CisgICAgICAgIENBU0VfSEFORExFKDE3NCk7CisgICAgICAgIENBU0VfSEFORExFKDE3NSk7CisgICAgICAgIENBU0VfSEFORExFKDE3Nik7CisgICAgICAgIENBU0VfSEFORExFKDE3Nyk7CisgICAgICAgIENBU0VfSEFORExFKDE3OCk7CisgICAgICAgIENBU0VfSEFORExFKDE3OSk7CisgICAgICAgIENBU0VfSEFORExFKDE4MCk7CisgICAgICAgIENBU0VfSEFORExFKDE4MSk7CisgICAgICAgIENBU0VfSEFORExFKDE4Mik7CisgICAgICAgIENBU0VfSEFORExFKDE4Myk7CisgICAgICAgIENBU0VfSEFORExFKDE4NCk7CisgICAgICAgIENBU0VfSEFORExFKDE4NSk7CisgICAgICAgIENBU0VfSEFORExFKDE4Nik7CisgICAgICAgIENBU0VfSEFORExFKDE4Nyk7CisgICAgICAgIENBU0VfSEFORExFKDE4OCk7CisgICAgICAgIENBU0VfSEFORExFKDE4OSk7CisgICAgICAgIENBU0VfSEFORExFKDE5MCk7CisgICAgICAgIENBU0VfSEFORExFKDE5MSk7CisgICAgICAgIENBU0VfSEFORExFKDE5Mik7CisgICAgICAgIENBU0VfSEFORExFKDE5Myk7CisgICAgICAgIENBU0VfSEFORExFKDE5NCk7CisgICAgICAgIENBU0VfSEFORExFKDE5NSk7CisgICAgICAgIENBU0VfSEFORExFKDE5Nik7CisgICAgICAgIENBU0VfSEFORExFKDE5Nyk7CisgICAgICAgIENBU0VfSEFORExFKDE5OCk7CisgICAgICAgIENBU0VfSEFORExFKDE5OSk7CisgICAgICAgIENBU0VfSEFORExFKDIwMCk7CisgICAgICAgIENBU0VfSEFORExFKDIwMSk7CisgICAgICAgIENBU0VfSEFORExFKDIwMik7CisgICAgICAgIENBU0VfSEFORExFKDIwMyk7CisgICAgICAgIENBU0VfSEFORExFKDIwNCk7CisgICAgICAgIENBU0VfSEFORExFKDIwNSk7CisgICAgICAgIENBU0VfSEFORExFKDIwNik7CisgICAgICAgIENBU0VfSEFORExFKDIwNyk7CisgICAgICAgIENBU0VfSEFORExFKDIwOCk7CisgICAgICAgIENBU0VfSEFORExFKDIwOSk7CisgICAgICAgIENBU0VfSEFORExFKDIxMCk7CisgICAgICAgIENBU0VfSEFORExFKDIxMSk7CisgICAgICAgIENBU0VfSEFORExFKDIxMik7CisgICAgICAgIENBU0VfSEFORExFKDIxMyk7CisgICAgICAgIENBU0VfSEFORExFKDIxNCk7CisgICAgICAgIENBU0VfSEFORExFKDIxNSk7CisgICAgICAgIENBU0VfSEFORExFKDIxNik7CisgICAgICAgIENBU0VfSEFORExFKDIxNyk7CisgICAgICAgIENBU0VfSEFORExFKDIxOCk7CisgICAgICAgIENBU0VfSEFORExFKDIxOSk7CisgICAgICAgIENBU0VfSEFORExFKDIyMCk7CisgICAgICAgIENBU0VfSEFORExFKDIyMSk7CisgICAgICAgIENBU0VfSEFORExFKDIyMik7CisgICAgICAgIENBU0VfSEFORExFKDIyMyk7CisgICAgICAgIENBU0VfSEFORExFKDIyNCk7CisgICAgICAgIENBU0VfSEFORExFKDIyNSk7CisgICAgICAgIENBU0VfSEFORExFKDIyNik7CisgICAgICAgIENBU0VfSEFORExFKDIyNyk7CisgICAgICAgIENBU0VfSEFORExFKDIyOCk7CisgICAgICAgIENBU0VfSEFORExFKDIyOSk7CisgICAgICAgIENBU0VfSEFORExFKDIzMCk7CisgICAgICAgIENBU0VfSEFORExFKDIzMSk7CisgICAgICAgIENBU0VfSEFORExFKDIzMik7CisgICAgICAgIENBU0VfSEFORExFKDIzMyk7CisgICAgICAgIENBU0VfSEFORExFKDIzNCk7CisgICAgICAgIENBU0VfSEFORExFKDIzNSk7CisgICAgICAgIENBU0VfSEFORExFKDIzNik7CisgICAgICAgIENBU0VfSEFORExFKDIzNyk7CisgICAgICAgIENBU0VfSEFORExFKDIzOCk7CisgICAgICAgIENBU0VfSEFORExFKDIzOSk7CisgICAgICAgIENBU0VfSEFORExFKDI0MCk7CisgICAgICAgIENBU0VfSEFORExFKDI0MSk7CisgICAgICAgIENBU0VfSEFORExFKDI0Mik7CisgICAgICAgIENBU0VfSEFORExFKDI0Myk7CisgICAgICAgIENBU0VfSEFORExFKDI0NCk7CisgICAgICAgIENBU0VfSEFORExFKDI0NSk7CisgICAgICAgIENBU0VfSEFORExFKDI0Nik7CisgICAgICAgIENBU0VfSEFORExFKDI0Nyk7CisgICAgICAgIENBU0VfSEFORExFKDI0OCk7CisgICAgICAgIENBU0VfSEFORExFKDI0OSk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2RpcmVudF9vbl93aW5kb3dzLmMgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2RpcmVudF9vbl93aW5kb3dzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzMThjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZGlyZW50X29uX3dpbmRvd3MuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKworICAgIEltcGxlbWVudGF0aW9uIG9mIFBPU0lYIGRpcmVjdG9yeSBicm93c2luZyBmdW5jdGlvbnMgYW5kIHR5cGVzIGZvciBXaW4zMi4KKworICAgIEF1dGhvcjogIEtldmxpbiBIZW5uZXkgKGtldmxpbkBhY20ub3JnLCBrZXZsaW5AY3VyYnJhbGFuLmNvbSkKKyAgICBIaXN0b3J5OiBDcmVhdGVkIE1hcmNoIDE5OTcuIFVwZGF0ZWQgSnVuZSAyMDAzIGFuZCBKdWx5IDIwMTIuCisgICAgUmlnaHRzOiAgU2VlIGVuZCBvZiBmaWxlLgorCisqLworI2luY2x1ZGUgImRpcmVudF9vbl93aW5kb3dzLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpby5oPiAvKiBfZmluZGZpcnN0IGFuZCBfZmluZG5leHQgc2V0IGVycm5vIGlmZiB0aGV5IHJldHVybiAtMSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInZrX2xvYWRlcl9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImxvYWRlci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgcHRyZGlmZl90IGhhbmRsZV90eXBlOyAvKiBDOTkncyBpbnRwdHJfdCBub3Qgc3VmZmljaWVudGx5IHBvcnRhYmxlICovCisKK3N0cnVjdCBESVIgeworICAgIGhhbmRsZV90eXBlIGhhbmRsZTsgLyogLTEgZm9yIGZhaWxlZCByZXdpbmQgKi8KKyAgICBzdHJ1Y3QgX2ZpbmRkYXRhX3QgaW5mbzsKKyAgICBzdHJ1Y3QgZGlyZW50IHJlc3VsdDsgLyogZF9uYW1lIG51bGwgaWZmIGZpcnN0IHRpbWUgKi8KKyAgICBjaGFyICpuYW1lOyAgICAgICAgICAgLyogbnVsbC10ZXJtaW5hdGVkIGNoYXIgc3RyaW5nICovCit9OworCitESVIgKm9wZW5kaXIoY29uc3QgY2hhciAqbmFtZSkgeworICAgIERJUiAqZGlyID0gMDsKKworICAgIGlmIChuYW1lICYmIG5hbWVbMF0pIHsKKyAgICAgICAgc2l6ZV90IGJhc2VfbGVuZ3RoID0gc3RybGVuKG5hbWUpOworICAgICAgICBjb25zdCBjaGFyICphbGwgPSAvKiBzZWFyY2ggcGF0dGVybiBtdXN0IGVuZCB3aXRoIHN1aXRhYmxlIHdpbGRjYXJkICovCisgICAgICAgICAgICBzdHJjaHIoIi9cXCIsIG5hbWVbYmFzZV9sZW5ndGggLSAxXSkgPyAiKiIgOiAiLyoiOworCisgICAgICAgIGlmICgoZGlyID0gKERJUiAqKWxvYWRlcl9pbnN0YW5jZV90bHNfaGVhcF9hbGxvYyhzaXplb2YgKmRpcikpICE9IDAgJiYKKyAgICAgICAgICAgIChkaXItPm5hbWUgPSAoY2hhciAqKWxvYWRlcl9pbnN0YW5jZV90bHNfaGVhcF9hbGxvYyhiYXNlX2xlbmd0aCArIHN0cmxlbihhbGwpICsgMSkpICE9IDApIHsKKyAgICAgICAgICAgIHN0cmNhdChzdHJjcHkoZGlyLT5uYW1lLCBuYW1lKSwgYWxsKTsKKworICAgICAgICAgICAgaWYgKChkaXItPmhhbmRsZSA9IChoYW5kbGVfdHlwZSlfZmluZGZpcnN0KGRpci0+bmFtZSwgJmRpci0+aW5mbykpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZGlyLT5yZXN1bHQuZF9uYW1lID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSAvKiByb2xsYmFjayAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV90bHNfaGVhcF9mcmVlKGRpci0+bmFtZSk7CisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX3Rsc19oZWFwX2ZyZWUoZGlyKTsKKyAgICAgICAgICAgICAgICBkaXIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgLyogcm9sbGJhY2sgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX3Rsc19oZWFwX2ZyZWUoZGlyKTsKKyAgICAgICAgICAgIGRpciA9IDA7CisgICAgICAgICAgICBlcnJubyA9IEVOT01FTTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiBkaXI7Cit9CisKK2ludCBjbG9zZWRpcihESVIgKmRpcikgeworICAgIGludCByZXN1bHQgPSAtMTsKKworICAgIGlmIChkaXIpIHsKKyAgICAgICAgaWYgKGRpci0+aGFuZGxlICE9IC0xKSB7CisgICAgICAgICAgICByZXN1bHQgPSBfZmluZGNsb3NlKGRpci0+aGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV90bHNfaGVhcF9mcmVlKGRpci0+bmFtZSk7CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV90bHNfaGVhcF9mcmVlKGRpcik7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSAtMSkgLyogbWFwIGFsbCBlcnJvcnMgdG8gRUJBREYgKi8KKyAgICB7CisgICAgICAgIGVycm5vID0gRUJBREY7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGRpcmVudCAqcmVhZGRpcihESVIgKmRpcikgeworICAgIHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IDA7CisKKyAgICBpZiAoZGlyICYmIGRpci0+aGFuZGxlICE9IC0xKSB7CisgICAgICAgIGlmICghZGlyLT5yZXN1bHQuZF9uYW1lIHx8IF9maW5kbmV4dChkaXItPmhhbmRsZSwgJmRpci0+aW5mbykgIT0gLTEpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICZkaXItPnJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdC0+ZF9uYW1lID0gZGlyLT5pbmZvLm5hbWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlcnJubyA9IEVCQURGOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgcmV3aW5kZGlyKERJUiAqZGlyKSB7CisgICAgaWYgKGRpciAmJiBkaXItPmhhbmRsZSAhPSAtMSkgeworICAgICAgICBfZmluZGNsb3NlKGRpci0+aGFuZGxlKTsKKyAgICAgICAgZGlyLT5oYW5kbGUgPSAoaGFuZGxlX3R5cGUpX2ZpbmRmaXJzdChkaXItPm5hbWUsICZkaXItPmluZm8pOworICAgICAgICBkaXItPnJlc3VsdC5kX25hbWUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGVycm5vID0gRUJBREY7CisgICAgfQorfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKgorCisgICAgQ29weXJpZ2h0IEtldmxpbiBIZW5uZXksIDE5OTcsIDIwMDMsIDIwMTIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUgTHVuYXJHLCBJbmMuCisgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgICAgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgICAgdGhhdCB0aGlzIGNvcHlyaWdodCBhbmQgcGVybWlzc2lvbnMgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICAgIGRlcml2YXRpdmVzLgorCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBzdXBwbGllZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisgICAgQnV0IHRoYXQgc2FpZCwgaWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcyBwbGVhc2UgZ2V0IGluIHRvdWNoLgorCisqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9kaXJlbnRfb25fd2luZG93cy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9kaXJlbnRfb25fd2luZG93cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDBmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2RpcmVudF9vbl93aW5kb3dzLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBESVJFTlRfSU5DTFVERUQKKyNkZWZpbmUgRElSRU5UX0lOQ0xVREVECisKKy8qCisKKyAgICBEZWNsYXJhdGlvbiBvZiBQT1NJWCBkaXJlY3RvcnkgYnJvd3NpbmcgZnVuY3Rpb25zIGFuZCB0eXBlcyBmb3IgV2luMzIuCisKKyAgICBBdXRob3I6ICBLZXZsaW4gSGVubmV5IChrZXZsaW5AYWNtLm9yZywga2V2bGluQGN1cmJyYWxhbi5jb20pCisgICAgSGlzdG9yeTogQ3JlYXRlZCBNYXJjaCAxOTk3LiBVcGRhdGVkIEp1bmUgMjAwMy4KKyAgICBSaWdodHM6ICBTZWUgZW5kIG9mIGZpbGUuCisKKyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgRElSIERJUjsKKworc3RydWN0IGRpcmVudCB7CisgICAgY2hhciAqZF9uYW1lOworfTsKKworRElSICpvcGVuZGlyKGNvbnN0IGNoYXIgKik7CitpbnQgY2xvc2VkaXIoRElSICopOworc3RydWN0IGRpcmVudCAqcmVhZGRpcihESVIgKik7Cit2b2lkIHJld2luZGRpcihESVIgKik7CisKKy8qCisKKyAgICBDb3B5cmlnaHQgS2V2bGluIEhlbm5leSwgMTk5NywgMjAwMy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICAgIENvcHlyaWdodCAoYykgMjAxNSBWYWx2ZSBDb3Jwb3JhdGlvbgorICAgIENvcHlyaWdodCAoYykgMjAxNSBMdW5hckcsIEluYy4KKworICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICAgIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICAgIHRoYXQgdGhpcyBjb3B5cmlnaHQgYW5kIHBlcm1pc3Npb25zIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAgICBkZXJpdmF0aXZlcy4KKworICAgIFRoaXMgc29mdHdhcmUgaXMgc3VwcGxpZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworICAgIEJ1dCB0aGF0IHNhaWQsIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgcGxlYXNlIGdldCBpbiB0b3VjaC4KKworKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2R4Z2lfbG9hZGVyLmMgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2R4Z2lfbG9hZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhM2ZhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZHhnaV9sb2FkZXIuYwpAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSAiZHhnaV9sb2FkZXIuaCIKKworI2luY2x1ZGUgPHN0cnNhZmUuaD4KKworc3RhdGljIEhNT0RVTEUgbG9hZF9keGdpX21vZHVsZSgpIHsKKyAgICBUQ0hBUiBzeXN0ZW1QYXRoW01BWF9QQVRIXSA9ICIiOworICAgIEdldFN5c3RlbURpcmVjdG9yeShzeXN0ZW1QYXRoLCBNQVhfUEFUSCk7CisgICAgU3RyaW5nQ2NoQ2F0KHN5c3RlbVBhdGgsIE1BWF9QQVRILCBURVhUKCJcXGR4Z2kuZGxsIikpOworCisgICAgcmV0dXJuIExvYWRMaWJyYXJ5KHN5c3RlbVBhdGgpOworfQorCit0eXBlZGVmIEhSRVNVTFQgKEFQSUVOVFJZICpQRk5fQ3JlYXRlRFhHSUZhY3RvcnkxKShSRUZJSUQgcmlpZCwgdm9pZCAqKnBwRmFjdG9yeSk7CisKK0hSRVNVTFQgZHluX0NyZWF0ZURYR0lGYWN0b3J5MShSRUZJSUQgcmlpZCwgdm9pZCAqKnBwRmFjdG9yeSkgeworICAgIFBGTl9DcmVhdGVEWEdJRmFjdG9yeTEgZnBDcmVhdGVEWEdJRmFjdG9yeTEgPQorICAgICAgICAoUEZOX0NyZWF0ZURYR0lGYWN0b3J5MSlHZXRQcm9jQWRkcmVzcyhsb2FkX2R4Z2lfbW9kdWxlKCksICJDcmVhdGVEWEdJRmFjdG9yeTEiKTsKKworICAgIGlmIChmcENyZWF0ZURYR0lGYWN0b3J5MSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gZnBDcmVhdGVEWEdJRmFjdG9yeTEocmlpZCwgcHBGYWN0b3J5KTsKKworICAgIHJldHVybiBEWEdJX0VSUk9SX05PVF9GT1VORDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2R4Z2lfbG9hZGVyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2R4Z2lfbG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkYWYwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZHhnaV9sb2FkZXIuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgRFhHSV9MT0FERVJfSAorI2RlZmluZSBEWEdJX0xPQURFUl9ICisKKyNpbmNsdWRlIDxkeGdpMV8yLmg+CisKK0hSRVNVTFQgZHluX0NyZWF0ZURYR0lGYWN0b3J5MShSRUZJSUQgcmlpZCwgdm9pZCAqKnBwRmFjdG9yeSk7CisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZXh0ZW5zaW9uX21hbnVhbC5jIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9leHRlbnNpb25fbWFudWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwNDk2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZXh0ZW5zaW9uX21hbnVhbC5jCkBAIC0wLDAgKzEsNDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBZb3VuZyA8bWFya3lAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTGVubnkgS29tb3cgPGxlbm55QGx1bmFyZy5jb20+CisgKi8KKworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJsb2FkZXIuaCIKKyNpbmNsdWRlICJ2a19sb2FkZXJfZXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgPHZ1bGthbi92a19pY2QuaD4KKyNpbmNsdWRlICJ3c2kuaCIKKyNpbmNsdWRlICJkZWJ1Z191dGlscy5oIgorCisvLyAtLS0tIE1hbnVhbGx5IGFkZGVkIHRyYW1wb2xpbmUvdGVybWluYXRvciBmdW5jdGlvbnMKKworLy8gVGhlc2UgZnVuY3Rpb25zLCBmb3Igd2hhdGV2ZXIgcmVhc29uLCByZXF1aXJlIG1vcmUgY29tcGxleCBjaGFuZ2VzIHRoYW4KKy8vIGNhbiBlYXNpbHkgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisKKy8vIC0tLS0gVktfS0hSX2RldmljZV9ncm91cCBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAqcFN1cmZhY2VJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiAqcFN1cmZhY2VDYXBhYmlsaXRpZXMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUih1bndyYXBwZWRfcGh5c19kZXYsIHBTdXJmYWNlSW5mbywgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgKnBTdXJmYWNlSW5mbywKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSICpwU3VyZmFjZUNhcGFiaWxpdGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKworICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHBTdXJmYWNlSW5mby0+c3VyZmFjZSk7CisgICAgdWludDhfdCBpY2RfaW5kZXggPSBwaHlzX2Rldl90ZXJtLT5pY2RfaW5kZXg7CisKKyAgICBpZiAoaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgIT0gTlVMTCkgeworICAgICAgICBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKnBOZXh0ID0gKFZrQmFzZU91dFN0cnVjdHVyZSAqKXBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5wTmV4dDsKKyAgICAgICAgd2hpbGUgKHBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICgoaW50KXBOZXh0LT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfS0hSKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IGFsbCBJQ0RzIG1heSBiZSBzdXBwb3J0aW5nIFZLX0tIUl9zdXJmYWNlX3Byb3RlY3RlZF9jYXBhYmlsaXRpZXMKKyAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUi5zdXBwb3J0c1Byb3RlY3RlZCB0byBmYWxzZSBhbmQKKyAgICAgICAgICAgICAgICAvLyBpZiBhbiBJQ0Qgc3VwcG9ydHMgcHJvdGVjdGVkIHN1cmZhY2VzLCBpdCB3aWxsIHJlc2V0IGl0IHRvIHRydWUgYWNjb3JkaW5nbHkuCisgICAgICAgICAgICAgICAgKChWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgKilwTmV4dCktPnN1cHBvcnRzUHJvdGVjdGVkID0gVktfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTmV4dCA9IChWa0Jhc2VPdXRTdHJ1Y3R1cmUgKilwTmV4dC0+cE5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXNzIHRoZSBjYWxsIHRvIHRoZSBkcml2ZXIsIHBvc3NpYmx5IHVud3JhcHBpbmcgdGhlIElDRCBzdXJmYWNlCisgICAgICAgIGlmIChpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMgIT0gTlVMTCAmJiAodm9pZCAqKWljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgaW5mb19jb3B5ID0gKnBTdXJmYWNlSW5mbzsKKyAgICAgICAgICAgIGluZm9fY29weS5zdXJmYWNlID0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07CisgICAgICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsICZpbmZvX2NvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwU3VyZmFjZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW11bGF0ZSB0aGUgY2FsbAorICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSOiBFbXVsYXRpbmcgY2FsbCBpbiBJQ0QgXCIlc1wiIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIiLAorICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5zY2FubmVkX2ljZC0+bGliX25hbWUpOworCisgICAgICAgIGlmIChwU3VyZmFjZUluZm8tPnBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFI6IEVtdWxhdGlvbiBmb3VuZCB1bnJlY29nbml6ZWQgc3RydWN0dXJlIHR5cGUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAicFN1cmZhY2VJbmZvLT5wTmV4dCAtIHRoaXMgc3RydWN0IHdpbGwgYmUgaWdub3JlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgdG8gdGhlIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgc3RydWN0CisgICAgICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlID0gcFN1cmZhY2VJbmZvLT5zdXJmYWNlOworICAgICAgICBpZiAoaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzICE9IE5VTEwgJiYgKHZvaWQgKilpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07CisgICAgICAgIH0KKyAgICAgICAgVmtSZXN1bHQgcmVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihwaHlzX2Rldl90ZXJtLT5waHlzX2Rldiwgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFN1cmZhY2VDYXBhYmlsaXRpZXMtPnN1cmZhY2VDYXBhYmlsaXRpZXMpOworCisgICAgICAgIGlmIChwU3VyZmFjZUNhcGFiaWxpdGllcy0+cE5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUjogRW11bGF0aW9uIGZvdW5kIHVucmVjb2duaXplZCBzdHJ1Y3R1cmUgdHlwZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJwU3VyZmFjZUNhcGFiaWxpdGllcy0+cE5leHQgLSB0aGlzIHN0cnVjdCB3aWxsIGJlIGlnbm9yZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KK30KKworLy8gLS0tLSBWS19OVl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVR5cGUgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nIHRpbGluZywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VDcmVhdGVGbGFncyBmbGFncywKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgZXh0ZXJuYWxIYW5kbGVUeXBlLAorICAgIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViAqcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKAorICAgICAgICB1bndyYXBwZWRfcGh5c19kZXYsIGZvcm1hdCwgdHlwZSwgdGlsaW5nLCB1c2FnZSwgZmxhZ3MsCisgICAgICAgIGV4dGVybmFsSGFuZGxlVHlwZSwgcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCit0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VUeXBlIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGV4dGVybmFsSGFuZGxlVHlwZSwKKyAgICBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgKnBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPQorICAgICAgICAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKworICAgIGlmICghaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVikgeworICAgICAgICBpZiAoZXh0ZXJuYWxIYW5kbGVUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfRk9STUFUX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcykgeworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgfQorCisgICAgICAgIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcy0+ZXh0ZXJuYWxNZW1vcnlGZWF0dXJlcyA9IDA7CisgICAgICAgIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcy0+ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgPSAwOworICAgICAgICBwRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMtPmNvbXBhdGlibGVIYW5kbGVUeXBlcyA9IDA7CisKKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICAgICAgICAgIHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBmb3JtYXQsIHR5cGUsIHRpbGluZywgdXNhZ2UsIGZsYWdzLAorICAgICAgICAgICAgJnBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcy0+aW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVigKKyAgICAgICAgcGh5c19kZXZfdGVybS0+cGh5c19kZXYsIGZvcm1hdCwgdHlwZSwgdGlsaW5nLCB1c2FnZSwgZmxhZ3MsCisgICAgICAgIGV4dGVybmFsSGFuZGxlVHlwZSwgcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAqcFN1cmZhY2VJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU3VyZmFjZUZvcm1hdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUZvcm1hdDJLSFIgKnBTdXJmYWNlRm9ybWF0cykgeworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUih1bndyYXBwZWRfcGh5c19kZXYsIHBTdXJmYWNlSW5mbywgcFN1cmZhY2VGb3JtYXRDb3VudCwgcFN1cmZhY2VGb3JtYXRzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgKnBTdXJmYWNlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU3VyZmFjZUZvcm1hdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlRm9ybWF0MktIUiAqcFN1cmZhY2VGb3JtYXRzKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworCisgICAgVmtJY2RTdXJmYWNlICppY2Rfc3VyZmFjZSA9IChWa0ljZFN1cmZhY2UgKikocFN1cmZhY2VJbmZvLT5zdXJmYWNlKTsKKyAgICB1aW50OF90IGljZF9pbmRleCA9IHBoeXNfZGV2X3Rlcm0tPmljZF9pbmRleDsKKworICAgIGlmIChpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIgIT0gTlVMTCkgeworICAgICAgICAvLyBQYXNzIHRoZSBjYWxsIHRvIHRoZSBkcml2ZXIsIHBvc3NpYmx5IHVud3JhcHBpbmcgdGhlIElDRCBzdXJmYWNlCisgICAgICAgIGlmIChpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMgIT0gTlVMTCAmJiAodm9pZCAqKWljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgaW5mb19jb3B5ID0gKnBTdXJmYWNlSW5mbzsKKyAgICAgICAgICAgIGluZm9fY29weS5zdXJmYWNlID0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07CisgICAgICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCAmaW5mb19jb3B5LCBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcFN1cmZhY2VJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW11bGF0ZSB0aGUgY2FsbAorICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUjogRW11bGF0aW5nIGNhbGwgaW4gSUNEIFwiJXNcIiB1c2luZyB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIiLAorICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5zY2FubmVkX2ljZC0+bGliX25hbWUpOworCisgICAgICAgIGlmIChwU3VyZmFjZUluZm8tPnBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSOiBFbXVsYXRpb24gZm91bmQgdW5yZWNvZ25pemVkIHN0cnVjdHVyZSB0eXBlIGluIHBTdXJmYWNlSW5mby0+cE5leHQgIgorICAgICAgICAgICAgICAgICAgICAgICAiLSB0aGlzIHN0cnVjdCB3aWxsIGJlIGlnbm9yZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlID0gcFN1cmZhY2VJbmZvLT5zdXJmYWNlOworICAgICAgICBpZiAoaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzICE9IE5VTEwgJiYgKHZvaWQgKilpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07CisgICAgICAgIH0KKworICAgICAgICBpZiAoKnBTdXJmYWNlRm9ybWF0Q291bnQgPT0gMCB8fCBwU3VyZmFjZUZvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gV3JpdGUgdG8gcFN1cmZhY2VGb3JtYXRDb3VudAorICAgICAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBzdXJmYWNlLCBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQWxsb2NhdGUgYSB0ZW1wb3JhcnkgYXJyYXkgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCBmdW5jdGlvbgorICAgICAgICAgICAgVmtTdXJmYWNlRm9ybWF0S0hSICpmb3JtYXRzID0gbG9hZGVyX3N0YWNrX2FsbG9jKCpwU3VyZmFjZUZvcm1hdENvdW50ICogc2l6ZW9mKFZrU3VyZmFjZUZvcm1hdEtIUikpOworICAgICAgICAgICAgaWYgKGZvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZrUmVzdWx0IHJlcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwgZm9ybWF0cyk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKnBTdXJmYWNlRm9ybWF0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1tpXS5zdXJmYWNlRm9ybWF0ID0gZm9ybWF0c1tpXTsKKyAgICAgICAgICAgICAgICBpZiAocFN1cmZhY2VGb3JtYXRzW2ldLnBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUjogRW11bGF0aW9uIGZvdW5kIHVucmVjb2duaXplZCBzdHJ1Y3R1cmUgdHlwZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBTdXJmYWNlRm9ybWF0c1slZF0ucE5leHQgLSB0aGlzIHN0cnVjdCB3aWxsIGJlIGlnbm9yZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0gVktfRVhUX2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCAqcFN1cmZhY2VDYXBhYmlsaXRpZXMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCh1bndyYXBwZWRfcGh5c19kZXYsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCAqcFN1cmZhY2VDYXBhYmlsaXRpZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisKKyAgICBWa0ljZFN1cmZhY2UgKmljZF9zdXJmYWNlID0gKFZrSWNkU3VyZmFjZSAqKShzdXJmYWNlKTsKKyAgICB1aW50OF90IGljZF9pbmRleCA9IHBoeXNfZGV2X3Rlcm0tPmljZF9pbmRleDsKKworICAgIC8vIFVud3JhcCB0aGUgc3VyZmFjZSBpZiBuZWVkZWQKKyAgICBWa1N1cmZhY2VLSFIgdW53cmFwcGVkX3N1cmZhY2UgPSBzdXJmYWNlOworICAgIGlmIChpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMgIT0gTlVMTCAmJiAodm9pZCAqKWljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdICE9IE5VTEwpIHsKKyAgICAgICAgdW53cmFwcGVkX3N1cmZhY2UgPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XTsKKyAgICB9CisKKyAgICBpZiAoaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgIT0gTlVMTCkgeworICAgICAgICAvLyBQYXNzIHRoZSBjYWxsIHRvIHRoZSBkcml2ZXIKKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCB1bndyYXBwZWRfc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBFbXVsYXRlIHRoZSBjYWxsCisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ6IEVtdWxhdGluZyBjYWxsIGluIElDRCBcIiVzXCIgdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiIsCisgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIHN1cmZhY2VfY2FwczsKKyAgICAgICAgVmtSZXN1bHQgcmVzID0KKyAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHVud3JhcHBlZF9zdXJmYWNlLCAmc3VyZmFjZV9jYXBzKTsKKyAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPm1pbkltYWdlQ291bnQgPSBzdXJmYWNlX2NhcHMubWluSW1hZ2VDb3VudDsKKyAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPm1heEltYWdlQ291bnQgPSBzdXJmYWNlX2NhcHMubWF4SW1hZ2VDb3VudDsKKyAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRFeHRlbnQgPSBzdXJmYWNlX2NhcHMuY3VycmVudEV4dGVudDsKKyAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPm1pbkltYWdlRXh0ZW50ID0gc3VyZmFjZV9jYXBzLm1pbkltYWdlRXh0ZW50OworICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWF4SW1hZ2VFeHRlbnQgPSBzdXJmYWNlX2NhcHMubWF4SW1hZ2VFeHRlbnQ7CisgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUFycmF5TGF5ZXJzID0gc3VyZmFjZV9jYXBzLm1heEltYWdlQXJyYXlMYXllcnM7CisgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXBwb3J0ZWRUcmFuc2Zvcm1zID0gc3VyZmFjZV9jYXBzLnN1cHBvcnRlZFRyYW5zZm9ybXM7CisgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5jdXJyZW50VHJhbnNmb3JtID0gc3VyZmFjZV9jYXBzLmN1cnJlbnRUcmFuc2Zvcm07CisgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSA9IHN1cmZhY2VfY2Fwcy5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYTsKKyAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPnN1cHBvcnRlZFVzYWdlRmxhZ3MgPSBzdXJmYWNlX2NhcHMuc3VwcG9ydGVkVXNhZ2VGbGFnczsKKyAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPnN1cHBvcnRlZFN1cmZhY2VDb3VudGVycyA9IDA7CisKKyAgICAgICAgaWYgKHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5wTmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUOiBFbXVsYXRpb24gZm91bmQgdW5yZWNvZ25pemVkIHN0cnVjdHVyZSB0eXBlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgInBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5wTmV4dCAtIHRoaXMgc3RydWN0IHdpbGwgYmUgaWdub3JlZCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9Cit9CisKKy8vIC0tLS0gVktfRVhUX2RpcmVjdF9tb2RlX2Rpc3BsYXkgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlbGVhc2VEaXNwbGF5RVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5KSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPlJlbGVhc2VEaXNwbGF5RVhUKHVud3JhcHBlZF9waHlzX2RldiwgZGlzcGxheSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX1JlbGVhc2VEaXNwbGF5RVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5KSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworCisgICAgaWYgKGljZF90ZXJtLT5kaXNwYXRjaC5SZWxlYXNlRGlzcGxheUVYVCA9PSBOVUxMKSB7CisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgXCIlc1wiIGFzc29jaWF0ZWQgd2l0aCBWa1BoeXNpY2FsRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdmtSZWxlYXNlRGlzcGxheUVYVCAtIENvbnNlcXVlbnRseSwgdGhlIGNhbGwgaXMgIgorICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBhY3F1aXJlIGEgZGlzcGxheSBvbiB0aGlzIGRldmljZSIsCisgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisgICAgfQorICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guUmVsZWFzZURpc3BsYXlFWFQocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIGRpc3BsYXkpOworfQorCisvLyAtLS0tIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVYbGliRGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5ICpkcHksIFZrRGlzcGxheUtIUiBkaXNwbGF5KSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkFjcXVpcmVYbGliRGlzcGxheUVYVCh1bndyYXBwZWRfcGh5c19kZXYsIGRweSwgZGlzcGxheSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0FjcXVpcmVYbGliRGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5ICpkcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5S0hSIGRpc3BsYXkpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisKKyAgICBpZiAoaWNkX3Rlcm0tPmRpc3BhdGNoLkFjcXVpcmVYbGliRGlzcGxheUVYVCAhPSBOVUxMKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGNhbGwgdG8gdGhlIGRyaXZlcgorICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkFjcXVpcmVYbGliRGlzcGxheUVYVChwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgZHB5LCBkaXNwbGF5KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBFbXVsYXRlIHRoZSBjYWxsCisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJ2a0FjcXVpcmVYTGliRGlzcGxheUVYVDogRW11bGF0aW5nIGNhbGwgaW4gSUNEIFwiJXNcIiBieSByZXR1cm5pbmcgZXJyb3IiLCBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmxpYl9uYW1lKTsKKworICAgICAgICAvLyBGYWlsIGZvciB0aGUgdW5zdXBwb3J0ZWQgY29tbWFuZAorICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFJhbmRST3V0cHV0RGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5ICpkcHksIFJST3V0cHV0IHJyT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlLSFIgKnBEaXNwbGF5KSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFJhbmRST3V0cHV0RGlzcGxheUVYVCh1bndyYXBwZWRfcGh5c19kZXYsIGRweSwgcnJPdXRwdXQsIHBEaXNwbGF5KTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIERpc3BsYXkgKmRweSwgUlJPdXRwdXQgcnJPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5S0hSICpwRGlzcGxheSkgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKworICAgIGlmIChpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUICE9IE5VTEwpIHsKKyAgICAgICAgLy8gUGFzcyB0aGUgY2FsbCB0byB0aGUgZHJpdmVyCisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBkcHksIHJyT3V0cHV0LCBwRGlzcGxheSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW11bGF0ZSB0aGUgY2FsbAorICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQ6IEVtdWxhdGluZyBjYWxsIGluIElDRCBcIiVzXCIgYnkgcmV0dXJuaW5nIG51bGwgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgLy8gUmV0dXJuIGEgbnVsbCBoYW5kbGUgdG8gaW5kaWNhdGUgdGhpcyBjYW4ndCBiZSBkb25lCisgICAgICAgICpwRGlzcGxheSA9IFZLX05VTExfSEFORExFOworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9Cit9CisKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykgeworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKHVud3JhcHBlZF9waHlzX2RldiwgcFN1cmZhY2VJbmZvLCBwUHJlc2VudE1vZGVDb3VudCwgcFByZXNlbnRNb2Rlcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCkgeworICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiSUNEIGFzc29jaWF0ZWQgd2l0aCBWa1BoeXNpY2FsRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIpOworICAgIH0KKyAgICBWa0ljZFN1cmZhY2UgKmljZF9zdXJmYWNlID0gKFZrSWNkU3VyZmFjZSAqKShwU3VyZmFjZUluZm8tPnN1cmZhY2UpOworICAgIHVpbnQ4X3QgaWNkX2luZGV4ID0gcGh5c19kZXZfdGVybS0+aWNkX2luZGV4OworICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyAmJiBOVUxMICE9ICh2b2lkICopaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF0pIHsKKyAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBzdXJmYWNlX2luZm9fY29weSA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IHBTdXJmYWNlSW5mby0+c1R5cGUsCisgICAgICAgICAgICAucE5leHQgPSBwU3VyZmFjZUluZm8tPnBOZXh0LAorICAgICAgICAgICAgLnN1cmZhY2UgPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XSwKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCAmc3VyZmFjZV9pbmZvX2NvcHksIHBQcmVzZW50TW9kZUNvdW50LCBwUHJlc2VudE1vZGVzKTsKKyAgICB9CisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwU3VyZmFjZUluZm8sIHBQcmVzZW50TW9kZUNvdW50LCBwUHJlc2VudE1vZGVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChkZXZpY2UsIHBTdXJmYWNlSW5mbywgcE1vZGVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcykgeworICAgIHVpbnQzMl90IGljZF9pbmRleCA9IDA7CisgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGxvYWRlcl9nZXRfaWNkX2FuZF9kZXZpY2UoZGV2aWNlLCAmZGV2LCAmaWNkX2luZGV4KTsKKyAgICBpZiAoTlVMTCAhPSBpY2RfdGVybSAmJiBOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKSB7CisgICAgICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHVpbnRwdHJfdClwU3VyZmFjZUluZm8tPnN1cmZhY2U7CisgICAgICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyAmJiAoVmtTdXJmYWNlS0hSKU5VTEwgIT0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF0pIHsKKyAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgc3VyZmFjZV9pbmZvX2NvcHkgPSB7CisgICAgICAgICAgICAgICAgLnNUeXBlID0gcFN1cmZhY2VJbmZvLT5zVHlwZSwKKyAgICAgICAgICAgICAgICAucE5leHQgPSBwU3VyZmFjZUluZm8tPnBOZXh0LAorICAgICAgICAgICAgICAgIC5zdXJmYWNlID0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF0sCisgICAgICAgICAgICB9OworICAgICAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKGRldmljZSwgJnN1cmZhY2VfaW5mb19jb3B5LCBwTW9kZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChkZXZpY2UsIHBTdXJmYWNlSW5mbywgcE1vZGVzKTsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9leHRlbnNpb25fbWFudWFsLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2V4dGVuc2lvbl9tYW51YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdiOTEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9leHRlbnNpb25fbWFudWFsLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIFlvdW5nIDxtYXJreUBsdW5hcmcuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCisvLyAtLS0tIE1hbnVhbGx5IGFkZGVkIHRyYW1wb2xpbmUvdGVybWluYXRvciBmdW5jdGlvbnMKKworLy8gVGhlc2UgZnVuY3Rpb25zLCBmb3Igd2hhdGV2ZXIgcmVhc29uLCByZXF1aXJlIG1vcmUgY29tcGxleCBjaGFuZ2VzIHRoYW4KKy8vIGNhbiBlYXNpbHkgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVR5cGUgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nIHRpbGluZywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VDcmVhdGVGbGFncyBmbGFncywKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgZXh0ZXJuYWxIYW5kbGVUeXBlLAorICAgIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViAqcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCit0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VUeXBlIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGV4dGVybmFsSGFuZGxlVHlwZSwKKyAgICBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgKnBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUZvcm1hdDJLSFIqIHBTdXJmYWNlRm9ybWF0cyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUZvcm1hdDJLSFIqIHBTdXJmYWNlRm9ybWF0cyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWxlYXNlRGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX1JlbGVhc2VEaXNwbGF5RVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5KTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlWGxpYkRpc3BsYXlFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgRGlzcGxheSogZHB5LCBWa0Rpc3BsYXlLSFIgZGlzcGxheSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0FjcXVpcmVYbGliRGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5KiBkcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5S0hSIGRpc3BsYXkpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIERpc3BsYXkqIGRweSwgUlJPdXRwdXQgcnJPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheUtIUiogcERpc3BsYXkpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgRGlzcGxheSogZHB5LCBSUk91dHB1dCByck91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlLSFIqIHBEaXNwbGF5KTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2Rlcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2Rlcyk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2Rlcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9nZW5lcmF0ZWQvLmNsYW5nLWZvcm1hdCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZ2VuZXJhdGVkLy5jbGFuZy1mb3JtYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiOTgzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZ2VuZXJhdGVkLy5jbGFuZy1mb3JtYXQKQEAgLTAsMCArMSw1IEBACistLS0KKyMgRGlzYWJsZSBjbGFuZy1mb3JtYXQgZm9yIGdlbmVyYXRlZCBjb2RlCitEaXNhYmxlRm9ybWF0OiB0cnVlCitTb3J0SW5jbHVkZXM6IGZhbHNlCisuLi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZ2VuZXJhdGVkL3ZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9nZW5lcmF0ZWQvdmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhOWJkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZ2VuZXJhdGVkL3ZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oCkBAIC0wLDAgKzEsNzY5IEBACisjcHJhZ21hIG9uY2UKKy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqCisvLyBTZWUgZGlzcGF0Y2hfaGVscGVyX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKi8KKworI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKyNpbmNsdWRlIDx2dWxrYW4vdmtfbGF5ZXIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ2a19sYXllcl9kaXNwYXRjaF90YWJsZS5oIgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDcmVhdGVTd2FwY2hhaW5LSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWluKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJEZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRTd2FwY2hhaW5JbWFnZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90KiBwU3dhcGNoYWluSW1hZ2VDb3VudCwgVmtJbWFnZSogcFN3YXBjaGFpbkltYWdlcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkFjcXVpcmVOZXh0SW1hZ2VLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQ2NF90IHRpbWVvdXQsIFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgVmtGZW5jZSBmZW5jZSwgdWludDMyX3QqIHBJbWFnZUluZGV4KSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViUXVldWVQcmVzZW50S0hSKFZrUXVldWUgcXVldWUsIGNvbnN0IFZrUHJlc2VudEluZm9LSFIqIHBQcmVzZW50SW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUihWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiBwTW9kZXMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJBY3F1aXJlTmV4dEltYWdlMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqIHBBY3F1aXJlSW5mbywgdWludDMyX3QqIHBJbWFnZUluZGV4KSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50LCBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N3YXBjaGFpbktIUiogcFN3YXBjaGFpbnMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgaGVhcEluZGV4LCB1aW50MzJfdCBsb2NhbERldmljZUluZGV4LCB1aW50MzJfdCByZW1vdGVEZXZpY2VJbmRleCwgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiBwUGVlck1lbW9yeUZlYXR1cmVzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRTZXREZXZpY2VNYXNrS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBkZXZpY2VNYXNrKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREaXNwYXRjaEJhc2VLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YlRyaW1Db21tYW5kUG9vbEtIUihWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MpIHsgIH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIEhBTkRMRSBoYW5kbGUsIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldE1lbW9yeUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBpbnQgZmQsIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5RmRQcm9wZXJ0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHBHZXRXaW4zMkhhbmRsZUluZm8sIEhBTkRMRSogcEhhbmRsZSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJJbXBvcnRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0U2VtYXBob3JlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yV3JpdGVzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCBjb25zdCB2b2lkKiBwRGF0YSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IHZvaWQqIHBEYXRhKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlUmVuZGVyUGFzczJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzKiBwUmVuZGVyUGFzcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kQmVnaW5SZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgIHBSZW5kZXJQYXNzQmVnaW4sIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICBwU3VicGFzc0JlZ2luSW5mbykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kTmV4dFN1YnBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgcFN1YnBhc3NCZWdpbkluZm8sIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICBwU3VicGFzc0VuZEluZm8pIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEVuZFJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0U3dhcGNoYWluU3RhdHVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldEZlbmNlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBwR2V0V2luMzJIYW5kbGVJbmZvLCBIQU5ETEUqIHBIYW5kbGUpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViSW1wb3J0RmVuY2VGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqIHBJbXBvcnRGZW5jZUZkSW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldEZlbmNlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiBwR2V0RmRJbmZvLCBpbnQqIHBGZCkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqIHBJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihWa0RldmljZSBkZXZpY2UpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiBwWWNiY3JDb252ZXJzaW9uKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkJpbmRCdWZmZXJNZW1vcnkyS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkJpbmRJbWFnZU1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHBTdXBwb3J0KSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREcmF3SW5kaXJlY3RDb3VudEtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCB1aW50NjRfdCogcFZhbHVlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViV2FpdFNlbWFwaG9yZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiBwV2FpdEluZm8sIHVpbnQ2NF90IHRpbWVvdXQpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJTaWduYWxTZW1hcGhvcmVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqIHBTaWduYWxJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICBwUGlwZWxpbmVJbmZvLCB1aW50MzJfdCogcEV4ZWN1dGFibGVDb3VudCwgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogIHBFeGVjdXRhYmxlSW5mbywgdWludDMyX3QqIHBTdGF0aXN0aWNDb3VudCwgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqIHBTdGF0aXN0aWNzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogIHBFeGVjdXRhYmxlSW5mbywgdWludDMyX3QqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogcFRhZ0luZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqIHBOYW1lSW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRGVidWdNYXJrZXJCZWdpbkVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqIHBNYXJrZXJJbmZvKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREZWJ1Z01hcmtlckVuZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiBwTWFya2VySW5mbykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwT2Zmc2V0cywgY29uc3QgVmtEZXZpY2VTaXplKiBwU2l6ZXMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgdWludDMyX3QgY291bnRlckJ1ZmZlckNvdW50LCBjb25zdCBWa0J1ZmZlciogcENvdW50ZXJCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBDb3VudGVyQnVmZmVyT2Zmc2V0cykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgdWludDMyX3QgY291bnRlckJ1ZmZlckNvdW50LCBjb25zdCBWa0J1ZmZlciogcENvdW50ZXJCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBDb3VudGVyQnVmZmVyT2Zmc2V0cykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksIFZrUXVlcnlDb250cm9sRmxhZ3MgZmxhZ3MsIHVpbnQzMl90IGluZGV4KSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRFbmRRdWVyeUluZGV4ZWRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksIHVpbnQzMl90IGluZGV4KSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIFZrQnVmZmVyIGNvdW50ZXJCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudGVyQnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBjb3VudGVyT2Zmc2V0LCB1aW50MzJfdCB2ZXJ0ZXhTdHJpZGUpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldEltYWdlVmlld0hhbmRsZU5WWChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCogcEluZm8pIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZERyYXdJbmRpcmVjdENvdW50QU1EKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRTaGFkZXJJbmZvQU1EKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHNoYWRlclN0YWdlLCBWa1NoYWRlckluZm9UeXBlQU1EIGluZm9UeXBlLCBzaXplX3QqIHBJbmZvU2l6ZSwgdm9pZCogcEluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0TWVtb3J5V2luMzJIYW5kbGVOVihWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGhhbmRsZVR5cGUsIEhBTkRMRSogcEhhbmRsZSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQqIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqIHBQcm9jZXNzQ29tbWFuZHNJbmZvKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqIHBSZXNlcnZlU3BhY2VJbmZvKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkRlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKFZrRGV2aWNlIGRldmljZSwgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkNyZWF0ZU9iamVjdFRhYmxlTlZYKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrT2JqZWN0VGFibGVOVlgqIHBPYmplY3RUYWJsZSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViRGVzdHJveU9iamVjdFRhYmxlTlZYKFZrRGV2aWNlIGRldmljZSwgVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViUmVnaXN0ZXJPYmplY3RzTlZYKFZrRGV2aWNlIGRldmljZSwgVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgdWludDMyX3Qgb2JqZWN0Q291bnQsIGNvbnN0IFZrT2JqZWN0VGFibGVFbnRyeU5WWCogY29uc3QqICAgIHBwT2JqZWN0VGFibGVFbnRyaWVzLCBjb25zdCB1aW50MzJfdCogcE9iamVjdEluZGljZXMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJVbnJlZ2lzdGVyT2JqZWN0c05WWChWa0RldmljZSBkZXZpY2UsIFZrT2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIHVpbnQzMl90IG9iamVjdENvdW50LCBjb25zdCBWa09iamVjdEVudHJ5VHlwZU5WWCogcE9iamVjdEVudHJ5VHlwZXMsIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0SW5kaWNlcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogcFZpZXdwb3J0V1NjYWxpbmdzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViRGlzcGxheVBvd2VyQ29udHJvbEVYVChWa0RldmljZSBkZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqIHBEaXNwbGF5UG93ZXJJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViUmVnaXN0ZXJEZXZpY2VFdmVudEVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiBwRGV2aWNlRXZlbnRJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YlJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKFZrRGV2aWNlIGRldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IFZrRGlzcGxheUV2ZW50SW5mb0VYVCogcERpc3BsYXlFdmVudEluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtGZW5jZSogcEZlbmNlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0U3dhcGNoYWluQ291bnRlckVYVChWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUIGNvdW50ZXIsIHVpbnQ2NF90KiBwQ291bnRlclZhbHVlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUqIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90KiBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsIFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSogcFByZXNlbnRhdGlvblRpbWluZ3MpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgdWludDMyX3QgZGlzY2FyZFJlY3RhbmdsZUNvdW50LCBjb25zdCBWa1JlY3QyRCogcERpc2NhcmRSZWN0YW5nbGVzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJTZXRIZHJNZXRhZGF0YUVYVChWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50LCBjb25zdCBWa1N3YXBjaGFpbktIUiogcFN3YXBjaGFpbnMsIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqIHBNZXRhZGF0YSkgeyAgfTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKFZrRGV2aWNlIGRldmljZSwgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyLCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKiBwUHJvcGVydGllcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlcioqIHBCdWZmZXIpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFNldFNhbXBsZUxvY2F0aW9uc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiBwU2FtcGxlTG9jYXRpb25zSW5mbykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogcFByb3BlcnRpZXMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiBwVmFsaWRhdGlvbkNhY2hlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKFZrRGV2aWNlIGRldmljZSwgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCBkc3RDYWNoZSwgdWludDMyX3Qgc3JjQ2FjaGVDb3VudCwgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqIHBTcmNDYWNoZXMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKFZrRGV2aWNlIGRldmljZSwgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2VWaWV3IGltYWdlVmlldywgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogcFNoYWRpbmdSYXRlUGFsZXR0ZXMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgc2FtcGxlT3JkZXJUeXBlLCB1aW50MzJfdCBjdXN0b21TYW1wbGVPcmRlckNvdW50LCBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqIHBDdXN0b21TYW1wbGVPcmRlcnMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBwQWNjZWxlcmF0aW9uU3RydWN0dXJlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtEZXZpY2UgZGV2aWNlLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBwQmluZEluZm9zKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogcEluZm8sIFZrQnVmZmVyIGluc3RhbmNlRGF0YSwgVmtEZXZpY2VTaXplIGluc3RhbmNlT2Zmc2V0LCBWa0Jvb2wzMiB1cGRhdGUsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywgVmtCdWZmZXIgc2NyYXRjaCwgVmtEZXZpY2VTaXplIHNjcmF0Y2hPZmZzZXQpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgbW9kZSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kVHJhY2VSYXlzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVmtEZXZpY2VTaXplIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIFZrQnVmZmVyIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLCBWa0J1ZmZlciBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGRlcHRoKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwgdWludDMyX3QgZmlyc3RHcm91cCwgdWludDMyX3QgZ3JvdXBDb3VudCwgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCogcERhdGEpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCBWa1F1ZXJ5VHlwZSBxdWVyeVR5cGUsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkNvbXBpbGVEZWZlcnJlZE5WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwgdWludDMyX3Qgc2hhZGVyKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKFZrRGV2aWNlIGRldmljZSwgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBjb25zdCB2b2lkKiBwSG9zdFBvaW50ZXIsIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCB1aW50MzJfdCBtYXJrZXIpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVChWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHRpbWVzdGFtcENvdW50LCBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiBwVGltZXN0YW1wSW5mb3MsIHVpbnQ2NF90KiBwVGltZXN0YW1wcywgdWludDY0X3QqIHBNYXhEZXZpYXRpb24pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZERyYXdNZXNoVGFza3NOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdGFza0NvdW50LCB1aW50MzJfdCBmaXJzdFRhc2spIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgdWludDMyX3QgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcEV4Y2x1c2l2ZVNjaXNzb3JzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRTZXRDaGVja3BvaW50TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IHZvaWQqIHBDaGVja3BvaW50TWFya2VyKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3QqIHBDaGVja3BvaW50RGF0YUNvdW50LCBWa0NoZWNrcG9pbnREYXRhTlYqIHBDaGVja3BvaW50RGF0YSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqIHBJbml0aWFsaXplSW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTChWa0RldmljZSBkZXZpY2UpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiBwTWFya2VySW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkNtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwqIHBNYXJrZXJJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqIHBPdmVycmlkZUluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHBBY3F1aXJlSW5mbywgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogcENvbmZpZ3VyYXRpb24pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoVmtEZXZpY2UgZGV2aWNlLCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbmZpZ3VyYXRpb24pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKFZrUXVldWUgcXVldWUsIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uZmlndXJhdGlvbikgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoVmtEZXZpY2UgZGV2aWNlLCBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIHBhcmFtZXRlciwgVmtQZXJmb3JtYW5jZVZhbHVlSU5URUwqIHBWYWx1ZSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViU2V0TG9jYWxEaW1taW5nQU1EKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcENoYWluLCBWa0Jvb2wzMiBsb2NhbERpbW1pbmdFbmFibGUpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvRVhUKiBwSW5mbykgeyAgfTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbikgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFNldExpbmVTdGlwcGxlRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBsaW5lU3RpcHBsZUZhY3RvciwgdWludDE2X3QgbGluZVN0aXBwbGVQYXR0ZXJuKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJSZXNldFF1ZXJ5UG9vbEVYVChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkgeyAgfTsKKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXllcl9pbml0X2RldmljZV9kaXNwYXRjaF90YWJsZShWa0RldmljZSBkZXZpY2UsIFZrTGF5ZXJEaXNwYXRjaFRhYmxlICp0YWJsZSwgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZ3BhKSB7CisgICAgbWVtc2V0KHRhYmxlLCAwLCBzaXplb2YoKnRhYmxlKSk7CisgICAgLy8gRGV2aWNlIGZ1bmN0aW9uIHBvaW50ZXJzCisgICAgdGFibGUtPkdldERldmljZVByb2NBZGRyID0gZ3BhOworICAgIHRhYmxlLT5EZXN0cm95RGV2aWNlID0gKFBGTl92a0Rlc3Ryb3lEZXZpY2UpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lEZXZpY2UiKTsKKyAgICB0YWJsZS0+R2V0RGV2aWNlUXVldWUgPSAoUEZOX3ZrR2V0RGV2aWNlUXVldWUpIGdwYShkZXZpY2UsICJ2a0dldERldmljZVF1ZXVlIik7CisgICAgdGFibGUtPlF1ZXVlU3VibWl0ID0gKFBGTl92a1F1ZXVlU3VibWl0KSBncGEoZGV2aWNlLCAidmtRdWV1ZVN1Ym1pdCIpOworICAgIHRhYmxlLT5RdWV1ZVdhaXRJZGxlID0gKFBGTl92a1F1ZXVlV2FpdElkbGUpIGdwYShkZXZpY2UsICJ2a1F1ZXVlV2FpdElkbGUiKTsKKyAgICB0YWJsZS0+RGV2aWNlV2FpdElkbGUgPSAoUEZOX3ZrRGV2aWNlV2FpdElkbGUpIGdwYShkZXZpY2UsICJ2a0RldmljZVdhaXRJZGxlIik7CisgICAgdGFibGUtPkFsbG9jYXRlTWVtb3J5ID0gKFBGTl92a0FsbG9jYXRlTWVtb3J5KSBncGEoZGV2aWNlLCAidmtBbGxvY2F0ZU1lbW9yeSIpOworICAgIHRhYmxlLT5GcmVlTWVtb3J5ID0gKFBGTl92a0ZyZWVNZW1vcnkpIGdwYShkZXZpY2UsICJ2a0ZyZWVNZW1vcnkiKTsKKyAgICB0YWJsZS0+TWFwTWVtb3J5ID0gKFBGTl92a01hcE1lbW9yeSkgZ3BhKGRldmljZSwgInZrTWFwTWVtb3J5Iik7CisgICAgdGFibGUtPlVubWFwTWVtb3J5ID0gKFBGTl92a1VubWFwTWVtb3J5KSBncGEoZGV2aWNlLCAidmtVbm1hcE1lbW9yeSIpOworICAgIHRhYmxlLT5GbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyA9IChQRk5fdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcykgZ3BhKGRldmljZSwgInZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiKTsKKyAgICB0YWJsZS0+SW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyA9IChQRk5fdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKSBncGEoZGV2aWNlLCAidmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIik7CisgICAgdGFibGUtPkdldERldmljZU1lbW9yeUNvbW1pdG1lbnQgPSAoUEZOX3ZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCkgZ3BhKGRldmljZSwgInZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCIpOworICAgIHRhYmxlLT5CaW5kQnVmZmVyTWVtb3J5ID0gKFBGTl92a0JpbmRCdWZmZXJNZW1vcnkpIGdwYShkZXZpY2UsICJ2a0JpbmRCdWZmZXJNZW1vcnkiKTsKKyAgICB0YWJsZS0+QmluZEltYWdlTWVtb3J5ID0gKFBGTl92a0JpbmRJbWFnZU1lbW9yeSkgZ3BhKGRldmljZSwgInZrQmluZEltYWdlTWVtb3J5Iik7CisgICAgdGFibGUtPkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyA9IChQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMpIGdwYShkZXZpY2UsICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyIpOworICAgIHRhYmxlLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyA9IChQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cykgZ3BhKGRldmljZSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMiKTsKKyAgICB0YWJsZS0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgPSAoUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIGdwYShkZXZpY2UsICJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzIik7CisgICAgdGFibGUtPlF1ZXVlQmluZFNwYXJzZSA9IChQRk5fdmtRdWV1ZUJpbmRTcGFyc2UpIGdwYShkZXZpY2UsICJ2a1F1ZXVlQmluZFNwYXJzZSIpOworICAgIHRhYmxlLT5DcmVhdGVGZW5jZSA9IChQRk5fdmtDcmVhdGVGZW5jZSkgZ3BhKGRldmljZSwgInZrQ3JlYXRlRmVuY2UiKTsKKyAgICB0YWJsZS0+RGVzdHJveUZlbmNlID0gKFBGTl92a0Rlc3Ryb3lGZW5jZSkgZ3BhKGRldmljZSwgInZrRGVzdHJveUZlbmNlIik7CisgICAgdGFibGUtPlJlc2V0RmVuY2VzID0gKFBGTl92a1Jlc2V0RmVuY2VzKSBncGEoZGV2aWNlLCAidmtSZXNldEZlbmNlcyIpOworICAgIHRhYmxlLT5HZXRGZW5jZVN0YXR1cyA9IChQRk5fdmtHZXRGZW5jZVN0YXR1cykgZ3BhKGRldmljZSwgInZrR2V0RmVuY2VTdGF0dXMiKTsKKyAgICB0YWJsZS0+V2FpdEZvckZlbmNlcyA9IChQRk5fdmtXYWl0Rm9yRmVuY2VzKSBncGEoZGV2aWNlLCAidmtXYWl0Rm9yRmVuY2VzIik7CisgICAgdGFibGUtPkNyZWF0ZVNlbWFwaG9yZSA9IChQRk5fdmtDcmVhdGVTZW1hcGhvcmUpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZVNlbWFwaG9yZSIpOworICAgIHRhYmxlLT5EZXN0cm95U2VtYXBob3JlID0gKFBGTl92a0Rlc3Ryb3lTZW1hcGhvcmUpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lTZW1hcGhvcmUiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRXZlbnQgPSAoUEZOX3ZrQ3JlYXRlRXZlbnQpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZUV2ZW50Iik7CisgICAgdGFibGUtPkRlc3Ryb3lFdmVudCA9IChQRk5fdmtEZXN0cm95RXZlbnQpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lFdmVudCIpOworICAgIHRhYmxlLT5HZXRFdmVudFN0YXR1cyA9IChQRk5fdmtHZXRFdmVudFN0YXR1cykgZ3BhKGRldmljZSwgInZrR2V0RXZlbnRTdGF0dXMiKTsKKyAgICB0YWJsZS0+U2V0RXZlbnQgPSAoUEZOX3ZrU2V0RXZlbnQpIGdwYShkZXZpY2UsICJ2a1NldEV2ZW50Iik7CisgICAgdGFibGUtPlJlc2V0RXZlbnQgPSAoUEZOX3ZrUmVzZXRFdmVudCkgZ3BhKGRldmljZSwgInZrUmVzZXRFdmVudCIpOworICAgIHRhYmxlLT5DcmVhdGVRdWVyeVBvb2wgPSAoUEZOX3ZrQ3JlYXRlUXVlcnlQb29sKSBncGEoZGV2aWNlLCAidmtDcmVhdGVRdWVyeVBvb2wiKTsKKyAgICB0YWJsZS0+RGVzdHJveVF1ZXJ5UG9vbCA9IChQRk5fdmtEZXN0cm95UXVlcnlQb29sKSBncGEoZGV2aWNlLCAidmtEZXN0cm95UXVlcnlQb29sIik7CisgICAgdGFibGUtPkdldFF1ZXJ5UG9vbFJlc3VsdHMgPSAoUEZOX3ZrR2V0UXVlcnlQb29sUmVzdWx0cykgZ3BhKGRldmljZSwgInZrR2V0UXVlcnlQb29sUmVzdWx0cyIpOworICAgIHRhYmxlLT5DcmVhdGVCdWZmZXIgPSAoUEZOX3ZrQ3JlYXRlQnVmZmVyKSBncGEoZGV2aWNlLCAidmtDcmVhdGVCdWZmZXIiKTsKKyAgICB0YWJsZS0+RGVzdHJveUJ1ZmZlciA9IChQRk5fdmtEZXN0cm95QnVmZmVyKSBncGEoZGV2aWNlLCAidmtEZXN0cm95QnVmZmVyIik7CisgICAgdGFibGUtPkNyZWF0ZUJ1ZmZlclZpZXcgPSAoUEZOX3ZrQ3JlYXRlQnVmZmVyVmlldykgZ3BhKGRldmljZSwgInZrQ3JlYXRlQnVmZmVyVmlldyIpOworICAgIHRhYmxlLT5EZXN0cm95QnVmZmVyVmlldyA9IChQRk5fdmtEZXN0cm95QnVmZmVyVmlldykgZ3BhKGRldmljZSwgInZrRGVzdHJveUJ1ZmZlclZpZXciKTsKKyAgICB0YWJsZS0+Q3JlYXRlSW1hZ2UgPSAoUEZOX3ZrQ3JlYXRlSW1hZ2UpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZUltYWdlIik7CisgICAgdGFibGUtPkRlc3Ryb3lJbWFnZSA9IChQRk5fdmtEZXN0cm95SW1hZ2UpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lJbWFnZSIpOworICAgIHRhYmxlLT5HZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0ID0gKFBGTl92a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQpIGdwYShkZXZpY2UsICJ2a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQiKTsKKyAgICB0YWJsZS0+Q3JlYXRlSW1hZ2VWaWV3ID0gKFBGTl92a0NyZWF0ZUltYWdlVmlldykgZ3BhKGRldmljZSwgInZrQ3JlYXRlSW1hZ2VWaWV3Iik7CisgICAgdGFibGUtPkRlc3Ryb3lJbWFnZVZpZXcgPSAoUEZOX3ZrRGVzdHJveUltYWdlVmlldykgZ3BhKGRldmljZSwgInZrRGVzdHJveUltYWdlVmlldyIpOworICAgIHRhYmxlLT5DcmVhdGVTaGFkZXJNb2R1bGUgPSAoUEZOX3ZrQ3JlYXRlU2hhZGVyTW9kdWxlKSBncGEoZGV2aWNlLCAidmtDcmVhdGVTaGFkZXJNb2R1bGUiKTsKKyAgICB0YWJsZS0+RGVzdHJveVNoYWRlck1vZHVsZSA9IChQRk5fdmtEZXN0cm95U2hhZGVyTW9kdWxlKSBncGEoZGV2aWNlLCAidmtEZXN0cm95U2hhZGVyTW9kdWxlIik7CisgICAgdGFibGUtPkNyZWF0ZVBpcGVsaW5lQ2FjaGUgPSAoUEZOX3ZrQ3JlYXRlUGlwZWxpbmVDYWNoZSkgZ3BhKGRldmljZSwgInZrQ3JlYXRlUGlwZWxpbmVDYWNoZSIpOworICAgIHRhYmxlLT5EZXN0cm95UGlwZWxpbmVDYWNoZSA9IChQRk5fdmtEZXN0cm95UGlwZWxpbmVDYWNoZSkgZ3BhKGRldmljZSwgInZrRGVzdHJveVBpcGVsaW5lQ2FjaGUiKTsKKyAgICB0YWJsZS0+R2V0UGlwZWxpbmVDYWNoZURhdGEgPSAoUEZOX3ZrR2V0UGlwZWxpbmVDYWNoZURhdGEpIGdwYShkZXZpY2UsICJ2a0dldFBpcGVsaW5lQ2FjaGVEYXRhIik7CisgICAgdGFibGUtPk1lcmdlUGlwZWxpbmVDYWNoZXMgPSAoUEZOX3ZrTWVyZ2VQaXBlbGluZUNhY2hlcykgZ3BhKGRldmljZSwgInZrTWVyZ2VQaXBlbGluZUNhY2hlcyIpOworICAgIHRhYmxlLT5DcmVhdGVHcmFwaGljc1BpcGVsaW5lcyA9IChQRk5fdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcykgZ3BhKGRldmljZSwgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiKTsKKyAgICB0YWJsZS0+Q3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyA9IChQRk5fdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKSBncGEoZGV2aWNlLCAidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIik7CisgICAgdGFibGUtPkRlc3Ryb3lQaXBlbGluZSA9IChQRk5fdmtEZXN0cm95UGlwZWxpbmUpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lQaXBlbGluZSIpOworICAgIHRhYmxlLT5DcmVhdGVQaXBlbGluZUxheW91dCA9IChQRk5fdmtDcmVhdGVQaXBlbGluZUxheW91dCkgZ3BhKGRldmljZSwgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiKTsKKyAgICB0YWJsZS0+RGVzdHJveVBpcGVsaW5lTGF5b3V0ID0gKFBGTl92a0Rlc3Ryb3lQaXBlbGluZUxheW91dCkgZ3BhKGRldmljZSwgInZrRGVzdHJveVBpcGVsaW5lTGF5b3V0Iik7CisgICAgdGFibGUtPkNyZWF0ZVNhbXBsZXIgPSAoUEZOX3ZrQ3JlYXRlU2FtcGxlcikgZ3BhKGRldmljZSwgInZrQ3JlYXRlU2FtcGxlciIpOworICAgIHRhYmxlLT5EZXN0cm95U2FtcGxlciA9IChQRk5fdmtEZXN0cm95U2FtcGxlcikgZ3BhKGRldmljZSwgInZrRGVzdHJveVNhbXBsZXIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRGVzY3JpcHRvclNldExheW91dCA9IChQRk5fdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KSBncGEoZGV2aWNlLCAidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0Iik7CisgICAgdGFibGUtPkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0ID0gKFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KSBncGEoZGV2aWNlLCAidmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCIpOworICAgIHRhYmxlLT5DcmVhdGVEZXNjcmlwdG9yUG9vbCA9IChQRk5fdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCkgZ3BhKGRldmljZSwgInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JQb29sID0gKFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCkgZ3BhKGRldmljZSwgInZrRGVzdHJveURlc2NyaXB0b3JQb29sIik7CisgICAgdGFibGUtPlJlc2V0RGVzY3JpcHRvclBvb2wgPSAoUEZOX3ZrUmVzZXREZXNjcmlwdG9yUG9vbCkgZ3BhKGRldmljZSwgInZrUmVzZXREZXNjcmlwdG9yUG9vbCIpOworICAgIHRhYmxlLT5BbGxvY2F0ZURlc2NyaXB0b3JTZXRzID0gKFBGTl92a0FsbG9jYXRlRGVzY3JpcHRvclNldHMpIGdwYShkZXZpY2UsICJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiKTsKKyAgICB0YWJsZS0+RnJlZURlc2NyaXB0b3JTZXRzID0gKFBGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cykgZ3BhKGRldmljZSwgInZrRnJlZURlc2NyaXB0b3JTZXRzIik7CisgICAgdGFibGUtPlVwZGF0ZURlc2NyaXB0b3JTZXRzID0gKFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRzKSBncGEoZGV2aWNlLCAidmtVcGRhdGVEZXNjcmlwdG9yU2V0cyIpOworICAgIHRhYmxlLT5DcmVhdGVGcmFtZWJ1ZmZlciA9IChQRk5fdmtDcmVhdGVGcmFtZWJ1ZmZlcikgZ3BhKGRldmljZSwgInZrQ3JlYXRlRnJhbWVidWZmZXIiKTsKKyAgICB0YWJsZS0+RGVzdHJveUZyYW1lYnVmZmVyID0gKFBGTl92a0Rlc3Ryb3lGcmFtZWJ1ZmZlcikgZ3BhKGRldmljZSwgInZrRGVzdHJveUZyYW1lYnVmZmVyIik7CisgICAgdGFibGUtPkNyZWF0ZVJlbmRlclBhc3MgPSAoUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzcykgZ3BhKGRldmljZSwgInZrQ3JlYXRlUmVuZGVyUGFzcyIpOworICAgIHRhYmxlLT5EZXN0cm95UmVuZGVyUGFzcyA9IChQRk5fdmtEZXN0cm95UmVuZGVyUGFzcykgZ3BhKGRldmljZSwgInZrRGVzdHJveVJlbmRlclBhc3MiKTsKKyAgICB0YWJsZS0+R2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5ID0gKFBGTl92a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSkgZ3BhKGRldmljZSwgInZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5Iik7CisgICAgdGFibGUtPkNyZWF0ZUNvbW1hbmRQb29sID0gKFBGTl92a0NyZWF0ZUNvbW1hbmRQb29sKSBncGEoZGV2aWNlLCAidmtDcmVhdGVDb21tYW5kUG9vbCIpOworICAgIHRhYmxlLT5EZXN0cm95Q29tbWFuZFBvb2wgPSAoUEZOX3ZrRGVzdHJveUNvbW1hbmRQb29sKSBncGEoZGV2aWNlLCAidmtEZXN0cm95Q29tbWFuZFBvb2wiKTsKKyAgICB0YWJsZS0+UmVzZXRDb21tYW5kUG9vbCA9IChQRk5fdmtSZXNldENvbW1hbmRQb29sKSBncGEoZGV2aWNlLCAidmtSZXNldENvbW1hbmRQb29sIik7CisgICAgdGFibGUtPkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMgPSAoUEZOX3ZrQWxsb2NhdGVDb21tYW5kQnVmZmVycykgZ3BhKGRldmljZSwgInZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyIpOworICAgIHRhYmxlLT5GcmVlQ29tbWFuZEJ1ZmZlcnMgPSAoUEZOX3ZrRnJlZUNvbW1hbmRCdWZmZXJzKSBncGEoZGV2aWNlLCAidmtGcmVlQ29tbWFuZEJ1ZmZlcnMiKTsKKyAgICB0YWJsZS0+QmVnaW5Db21tYW5kQnVmZmVyID0gKFBGTl92a0JlZ2luQ29tbWFuZEJ1ZmZlcikgZ3BhKGRldmljZSwgInZrQmVnaW5Db21tYW5kQnVmZmVyIik7CisgICAgdGFibGUtPkVuZENvbW1hbmRCdWZmZXIgPSAoUEZOX3ZrRW5kQ29tbWFuZEJ1ZmZlcikgZ3BhKGRldmljZSwgInZrRW5kQ29tbWFuZEJ1ZmZlciIpOworICAgIHRhYmxlLT5SZXNldENvbW1hbmRCdWZmZXIgPSAoUEZOX3ZrUmVzZXRDb21tYW5kQnVmZmVyKSBncGEoZGV2aWNlLCAidmtSZXNldENvbW1hbmRCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kQmluZFBpcGVsaW5lID0gKFBGTl92a0NtZEJpbmRQaXBlbGluZSkgZ3BhKGRldmljZSwgInZrQ21kQmluZFBpcGVsaW5lIik7CisgICAgdGFibGUtPkNtZFNldFZpZXdwb3J0ID0gKFBGTl92a0NtZFNldFZpZXdwb3J0KSBncGEoZGV2aWNlLCAidmtDbWRTZXRWaWV3cG9ydCIpOworICAgIHRhYmxlLT5DbWRTZXRTY2lzc29yID0gKFBGTl92a0NtZFNldFNjaXNzb3IpIGdwYShkZXZpY2UsICJ2a0NtZFNldFNjaXNzb3IiKTsKKyAgICB0YWJsZS0+Q21kU2V0TGluZVdpZHRoID0gKFBGTl92a0NtZFNldExpbmVXaWR0aCkgZ3BhKGRldmljZSwgInZrQ21kU2V0TGluZVdpZHRoIik7CisgICAgdGFibGUtPkNtZFNldERlcHRoQmlhcyA9IChQRk5fdmtDbWRTZXREZXB0aEJpYXMpIGdwYShkZXZpY2UsICJ2a0NtZFNldERlcHRoQmlhcyIpOworICAgIHRhYmxlLT5DbWRTZXRCbGVuZENvbnN0YW50cyA9IChQRk5fdmtDbWRTZXRCbGVuZENvbnN0YW50cykgZ3BhKGRldmljZSwgInZrQ21kU2V0QmxlbmRDb25zdGFudHMiKTsKKyAgICB0YWJsZS0+Q21kU2V0RGVwdGhCb3VuZHMgPSAoUEZOX3ZrQ21kU2V0RGVwdGhCb3VuZHMpIGdwYShkZXZpY2UsICJ2a0NtZFNldERlcHRoQm91bmRzIik7CisgICAgdGFibGUtPkNtZFNldFN0ZW5jaWxDb21wYXJlTWFzayA9IChQRk5fdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2spIGdwYShkZXZpY2UsICJ2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayIpOworICAgIHRhYmxlLT5DbWRTZXRTdGVuY2lsV3JpdGVNYXNrID0gKFBGTl92a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2spIGdwYShkZXZpY2UsICJ2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2siKTsKKyAgICB0YWJsZS0+Q21kU2V0U3RlbmNpbFJlZmVyZW5jZSA9IChQRk5fdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKSBncGEoZGV2aWNlLCAidmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIik7CisgICAgdGFibGUtPkNtZEJpbmREZXNjcmlwdG9yU2V0cyA9IChQRk5fdmtDbWRCaW5kRGVzY3JpcHRvclNldHMpIGdwYShkZXZpY2UsICJ2a0NtZEJpbmREZXNjcmlwdG9yU2V0cyIpOworICAgIHRhYmxlLT5DbWRCaW5kSW5kZXhCdWZmZXIgPSAoUEZOX3ZrQ21kQmluZEluZGV4QnVmZmVyKSBncGEoZGV2aWNlLCAidmtDbWRCaW5kSW5kZXhCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kQmluZFZlcnRleEJ1ZmZlcnMgPSAoUEZOX3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnMpIGdwYShkZXZpY2UsICJ2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzIik7CisgICAgdGFibGUtPkNtZERyYXcgPSAoUEZOX3ZrQ21kRHJhdykgZ3BhKGRldmljZSwgInZrQ21kRHJhdyIpOworICAgIHRhYmxlLT5DbWREcmF3SW5kZXhlZCA9IChQRk5fdmtDbWREcmF3SW5kZXhlZCkgZ3BhKGRldmljZSwgInZrQ21kRHJhd0luZGV4ZWQiKTsKKyAgICB0YWJsZS0+Q21kRHJhd0luZGlyZWN0ID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdCkgZ3BhKGRldmljZSwgInZrQ21kRHJhd0luZGlyZWN0Iik7CisgICAgdGFibGUtPkNtZERyYXdJbmRleGVkSW5kaXJlY3QgPSAoUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCkgZ3BhKGRldmljZSwgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCIpOworICAgIHRhYmxlLT5DbWREaXNwYXRjaCA9IChQRk5fdmtDbWREaXNwYXRjaCkgZ3BhKGRldmljZSwgInZrQ21kRGlzcGF0Y2giKTsKKyAgICB0YWJsZS0+Q21kRGlzcGF0Y2hJbmRpcmVjdCA9IChQRk5fdmtDbWREaXNwYXRjaEluZGlyZWN0KSBncGEoZGV2aWNlLCAidmtDbWREaXNwYXRjaEluZGlyZWN0Iik7CisgICAgdGFibGUtPkNtZENvcHlCdWZmZXIgPSAoUEZOX3ZrQ21kQ29weUJ1ZmZlcikgZ3BhKGRldmljZSwgInZrQ21kQ29weUJ1ZmZlciIpOworICAgIHRhYmxlLT5DbWRDb3B5SW1hZ2UgPSAoUEZOX3ZrQ21kQ29weUltYWdlKSBncGEoZGV2aWNlLCAidmtDbWRDb3B5SW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQmxpdEltYWdlID0gKFBGTl92a0NtZEJsaXRJbWFnZSkgZ3BhKGRldmljZSwgInZrQ21kQmxpdEltYWdlIik7CisgICAgdGFibGUtPkNtZENvcHlCdWZmZXJUb0ltYWdlID0gKFBGTl92a0NtZENvcHlCdWZmZXJUb0ltYWdlKSBncGEoZGV2aWNlLCAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSIpOworICAgIHRhYmxlLT5DbWRDb3B5SW1hZ2VUb0J1ZmZlciA9IChQRk5fdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcikgZ3BhKGRldmljZSwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kVXBkYXRlQnVmZmVyID0gKFBGTl92a0NtZFVwZGF0ZUJ1ZmZlcikgZ3BhKGRldmljZSwgInZrQ21kVXBkYXRlQnVmZmVyIik7CisgICAgdGFibGUtPkNtZEZpbGxCdWZmZXIgPSAoUEZOX3ZrQ21kRmlsbEJ1ZmZlcikgZ3BhKGRldmljZSwgInZrQ21kRmlsbEJ1ZmZlciIpOworICAgIHRhYmxlLT5DbWRDbGVhckNvbG9ySW1hZ2UgPSAoUEZOX3ZrQ21kQ2xlYXJDb2xvckltYWdlKSBncGEoZGV2aWNlLCAidmtDbWRDbGVhckNvbG9ySW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSA9IChQRk5fdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKSBncGEoZGV2aWNlLCAidmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlIik7CisgICAgdGFibGUtPkNtZENsZWFyQXR0YWNobWVudHMgPSAoUEZOX3ZrQ21kQ2xlYXJBdHRhY2htZW50cykgZ3BhKGRldmljZSwgInZrQ21kQ2xlYXJBdHRhY2htZW50cyIpOworICAgIHRhYmxlLT5DbWRSZXNvbHZlSW1hZ2UgPSAoUEZOX3ZrQ21kUmVzb2x2ZUltYWdlKSBncGEoZGV2aWNlLCAidmtDbWRSZXNvbHZlSW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kU2V0RXZlbnQgPSAoUEZOX3ZrQ21kU2V0RXZlbnQpIGdwYShkZXZpY2UsICJ2a0NtZFNldEV2ZW50Iik7CisgICAgdGFibGUtPkNtZFJlc2V0RXZlbnQgPSAoUEZOX3ZrQ21kUmVzZXRFdmVudCkgZ3BhKGRldmljZSwgInZrQ21kUmVzZXRFdmVudCIpOworICAgIHRhYmxlLT5DbWRXYWl0RXZlbnRzID0gKFBGTl92a0NtZFdhaXRFdmVudHMpIGdwYShkZXZpY2UsICJ2a0NtZFdhaXRFdmVudHMiKTsKKyAgICB0YWJsZS0+Q21kUGlwZWxpbmVCYXJyaWVyID0gKFBGTl92a0NtZFBpcGVsaW5lQmFycmllcikgZ3BhKGRldmljZSwgInZrQ21kUGlwZWxpbmVCYXJyaWVyIik7CisgICAgdGFibGUtPkNtZEJlZ2luUXVlcnkgPSAoUEZOX3ZrQ21kQmVnaW5RdWVyeSkgZ3BhKGRldmljZSwgInZrQ21kQmVnaW5RdWVyeSIpOworICAgIHRhYmxlLT5DbWRFbmRRdWVyeSA9IChQRk5fdmtDbWRFbmRRdWVyeSkgZ3BhKGRldmljZSwgInZrQ21kRW5kUXVlcnkiKTsKKyAgICB0YWJsZS0+Q21kUmVzZXRRdWVyeVBvb2wgPSAoUEZOX3ZrQ21kUmVzZXRRdWVyeVBvb2wpIGdwYShkZXZpY2UsICJ2a0NtZFJlc2V0UXVlcnlQb29sIik7CisgICAgdGFibGUtPkNtZFdyaXRlVGltZXN0YW1wID0gKFBGTl92a0NtZFdyaXRlVGltZXN0YW1wKSBncGEoZGV2aWNlLCAidmtDbWRXcml0ZVRpbWVzdGFtcCIpOworICAgIHRhYmxlLT5DbWRDb3B5UXVlcnlQb29sUmVzdWx0cyA9IChQRk5fdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cykgZ3BhKGRldmljZSwgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMiKTsKKyAgICB0YWJsZS0+Q21kUHVzaENvbnN0YW50cyA9IChQRk5fdmtDbWRQdXNoQ29uc3RhbnRzKSBncGEoZGV2aWNlLCAidmtDbWRQdXNoQ29uc3RhbnRzIik7CisgICAgdGFibGUtPkNtZEJlZ2luUmVuZGVyUGFzcyA9IChQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MpIGdwYShkZXZpY2UsICJ2a0NtZEJlZ2luUmVuZGVyUGFzcyIpOworICAgIHRhYmxlLT5DbWROZXh0U3VicGFzcyA9IChQRk5fdmtDbWROZXh0U3VicGFzcykgZ3BhKGRldmljZSwgInZrQ21kTmV4dFN1YnBhc3MiKTsKKyAgICB0YWJsZS0+Q21kRW5kUmVuZGVyUGFzcyA9IChQRk5fdmtDbWRFbmRSZW5kZXJQYXNzKSBncGEoZGV2aWNlLCAidmtDbWRFbmRSZW5kZXJQYXNzIik7CisgICAgdGFibGUtPkNtZEV4ZWN1dGVDb21tYW5kcyA9IChQRk5fdmtDbWRFeGVjdXRlQ29tbWFuZHMpIGdwYShkZXZpY2UsICJ2a0NtZEV4ZWN1dGVDb21tYW5kcyIpOworICAgIHRhYmxlLT5CaW5kQnVmZmVyTWVtb3J5MiA9IChQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MikgZ3BhKGRldmljZSwgInZrQmluZEJ1ZmZlck1lbW9yeTIiKTsKKyAgICB0YWJsZS0+QmluZEltYWdlTWVtb3J5MiA9IChQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyKSBncGEoZGV2aWNlLCAidmtCaW5kSW1hZ2VNZW1vcnkyIik7CisgICAgdGFibGUtPkdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzID0gKFBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKSBncGEoZGV2aWNlLCAidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIpOworICAgIHRhYmxlLT5DbWRTZXREZXZpY2VNYXNrID0gKFBGTl92a0NtZFNldERldmljZU1hc2spIGdwYShkZXZpY2UsICJ2a0NtZFNldERldmljZU1hc2siKTsKKyAgICB0YWJsZS0+Q21kRGlzcGF0Y2hCYXNlID0gKFBGTl92a0NtZERpc3BhdGNoQmFzZSkgZ3BhKGRldmljZSwgInZrQ21kRGlzcGF0Y2hCYXNlIik7CisgICAgdGFibGUtPkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiA9IChQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIpIGdwYShkZXZpY2UsICJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiIpOworICAgIHRhYmxlLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIpIGdwYShkZXZpY2UsICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIiKTsKKyAgICB0YWJsZS0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMikgZ3BhKGRldmljZSwgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIik7CisgICAgdGFibGUtPlRyaW1Db21tYW5kUG9vbCA9IChQRk5fdmtUcmltQ29tbWFuZFBvb2wpIGdwYShkZXZpY2UsICJ2a1RyaW1Db21tYW5kUG9vbCIpOworICAgIHRhYmxlLT5HZXREZXZpY2VRdWV1ZTIgPSAoUEZOX3ZrR2V0RGV2aWNlUXVldWUyKSBncGEoZGV2aWNlLCAidmtHZXREZXZpY2VRdWV1ZTIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiA9IChQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKSBncGEoZGV2aWNlLCAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIik7CisgICAgdGFibGUtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gKFBGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKSBncGEoZGV2aWNlLCAidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiIpOworICAgIHRhYmxlLT5DcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBncGEoZGV2aWNlLCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBncGEoZGV2aWNlLCAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIik7CisgICAgdGFibGUtPlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUgPSAoUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSkgZ3BhKGRldmljZSwgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSIpOworICAgIHRhYmxlLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCA9IChQRk5fdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCkgZ3BhKGRldmljZSwgInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiKTsKKyAgICB0YWJsZS0+Q3JlYXRlU3dhcGNoYWluS0hSID0gKFBGTl92a0NyZWF0ZVN3YXBjaGFpbktIUikgZ3BhKGRldmljZSwgInZrQ3JlYXRlU3dhcGNoYWluS0hSIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVTd2FwY2hhaW5LSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q3JlYXRlU3dhcGNoYWluS0hSID0gKFBGTl92a0NyZWF0ZVN3YXBjaGFpbktIUilTdHViQ3JlYXRlU3dhcGNoYWluS0hSOyB9CisgICAgdGFibGUtPkRlc3Ryb3lTd2FwY2hhaW5LSFIgPSAoUEZOX3ZrRGVzdHJveVN3YXBjaGFpbktIUikgZ3BhKGRldmljZSwgInZrRGVzdHJveVN3YXBjaGFpbktIUiIpOworICAgIGlmICh0YWJsZS0+RGVzdHJveVN3YXBjaGFpbktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5EZXN0cm95U3dhcGNoYWluS0hSID0gKFBGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFIpU3R1YkRlc3Ryb3lTd2FwY2hhaW5LSFI7IH0KKyAgICB0YWJsZS0+R2V0U3dhcGNoYWluSW1hZ2VzS0hSID0gKFBGTl92a0dldFN3YXBjaGFpbkltYWdlc0tIUikgZ3BhKGRldmljZSwgInZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRTd2FwY2hhaW5JbWFnZXNLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0U3dhcGNoYWluSW1hZ2VzS0hSID0gKFBGTl92a0dldFN3YXBjaGFpbkltYWdlc0tIUilTdHViR2V0U3dhcGNoYWluSW1hZ2VzS0hSOyB9CisgICAgdGFibGUtPkFjcXVpcmVOZXh0SW1hZ2VLSFIgPSAoUEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUikgZ3BhKGRldmljZSwgInZrQWNxdWlyZU5leHRJbWFnZUtIUiIpOworICAgIGlmICh0YWJsZS0+QWNxdWlyZU5leHRJbWFnZUtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5BY3F1aXJlTmV4dEltYWdlS0hSID0gKFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIpU3R1YkFjcXVpcmVOZXh0SW1hZ2VLSFI7IH0KKyAgICB0YWJsZS0+UXVldWVQcmVzZW50S0hSID0gKFBGTl92a1F1ZXVlUHJlc2VudEtIUikgZ3BhKGRldmljZSwgInZrUXVldWVQcmVzZW50S0hSIik7CisgICAgaWYgKHRhYmxlLT5RdWV1ZVByZXNlbnRLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+UXVldWVQcmVzZW50S0hSID0gKFBGTl92a1F1ZXVlUHJlc2VudEtIUilTdHViUXVldWVQcmVzZW50S0hSOyB9CisgICAgdGFibGUtPkdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9IChQRk5fdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIpIGdwYShkZXZpY2UsICJ2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiIpOworICAgIGlmICh0YWJsZS0+R2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9IChQRk5fdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIpU3R1YkdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUjsgfQorICAgIHRhYmxlLT5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKSBncGEoZGV2aWNlLCAidmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKVN0dWJHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFI7IH0KKyAgICB0YWJsZS0+QWNxdWlyZU5leHRJbWFnZTJLSFIgPSAoUEZOX3ZrQWNxdWlyZU5leHRJbWFnZTJLSFIpIGdwYShkZXZpY2UsICJ2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIik7CisgICAgaWYgKHRhYmxlLT5BY3F1aXJlTmV4dEltYWdlMktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5BY3F1aXJlTmV4dEltYWdlMktIUiA9IChQRk5fdmtBY3F1aXJlTmV4dEltYWdlMktIUilTdHViQWNxdWlyZU5leHRJbWFnZTJLSFI7IH0KKyAgICB0YWJsZS0+Q3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiA9IChQRk5fdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKSBncGEoZGV2aWNlLCAidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIgPSAoUEZOX3ZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUilTdHViQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUjsgfQorICAgIHRhYmxlLT5HZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiA9IChQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUikgZ3BhKGRldmljZSwgInZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSID0gKFBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKVN0dWJHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUjsgfQorICAgIHRhYmxlLT5DbWRTZXREZXZpY2VNYXNrS0hSID0gKFBGTl92a0NtZFNldERldmljZU1hc2tLSFIpIGdwYShkZXZpY2UsICJ2a0NtZFNldERldmljZU1hc2tLSFIiKTsKKyAgICBpZiAodGFibGUtPkNtZFNldERldmljZU1hc2tLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kU2V0RGV2aWNlTWFza0tIUiA9IChQRk5fdmtDbWRTZXREZXZpY2VNYXNrS0hSKVN0dWJDbWRTZXREZXZpY2VNYXNrS0hSOyB9CisgICAgdGFibGUtPkNtZERpc3BhdGNoQmFzZUtIUiA9IChQRk5fdmtDbWREaXNwYXRjaEJhc2VLSFIpIGdwYShkZXZpY2UsICJ2a0NtZERpc3BhdGNoQmFzZUtIUiIpOworICAgIGlmICh0YWJsZS0+Q21kRGlzcGF0Y2hCYXNlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNtZERpc3BhdGNoQmFzZUtIUiA9IChQRk5fdmtDbWREaXNwYXRjaEJhc2VLSFIpU3R1YkNtZERpc3BhdGNoQmFzZUtIUjsgfQorICAgIHRhYmxlLT5UcmltQ29tbWFuZFBvb2xLSFIgPSAoUEZOX3ZrVHJpbUNvbW1hbmRQb29sS0hSKSBncGEoZGV2aWNlLCAidmtUcmltQ29tbWFuZFBvb2xLSFIiKTsKKyAgICBpZiAodGFibGUtPlRyaW1Db21tYW5kUG9vbEtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5UcmltQ29tbWFuZFBvb2xLSFIgPSAoUEZOX3ZrVHJpbUNvbW1hbmRQb29sS0hSKVN0dWJUcmltQ29tbWFuZFBvb2xLSFI7IH0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlS0hSID0gKFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSKSBncGEoZGV2aWNlLCAidmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiIpOworICAgIGlmICh0YWJsZS0+R2V0TWVtb3J5V2luMzJIYW5kbGVLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0TWVtb3J5V2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIpU3R1YkdldE1lbW9yeVdpbjMySGFuZGxlS0hSOyB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUikgZ3BhKGRldmljZSwgInZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUilTdHViR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSOyB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5HZXRNZW1vcnlGZEtIUiA9IChQRk5fdmtHZXRNZW1vcnlGZEtIUikgZ3BhKGRldmljZSwgInZrR2V0TWVtb3J5RmRLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldE1lbW9yeUZkS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldE1lbW9yeUZkS0hSID0gKFBGTl92a0dldE1lbW9yeUZkS0hSKVN0dWJHZXRNZW1vcnlGZEtIUjsgfQorICAgIHRhYmxlLT5HZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKSBncGEoZGV2aWNlLCAidmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldE1lbW9yeUZkUHJvcGVydGllc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKVN0dWJHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFI7IH0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSID0gKFBGTl92a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKSBncGEoZGV2aWNlLCAidmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIpOworICAgIGlmICh0YWJsZS0+SW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+SW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIpU3R1YkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSOyB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIpIGdwYShkZXZpY2UsICJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiA9IChQRk5fdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUilTdHViR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFI7IH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkltcG9ydFNlbWFwaG9yZUZkS0hSID0gKFBGTl92a0ltcG9ydFNlbWFwaG9yZUZkS0hSKSBncGEoZGV2aWNlLCAidmtJbXBvcnRTZW1hcGhvcmVGZEtIUiIpOworICAgIGlmICh0YWJsZS0+SW1wb3J0U2VtYXBob3JlRmRLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+SW1wb3J0U2VtYXBob3JlRmRLSFIgPSAoUEZOX3ZrSW1wb3J0U2VtYXBob3JlRmRLSFIpU3R1YkltcG9ydFNlbWFwaG9yZUZkS0hSOyB9CisgICAgdGFibGUtPkdldFNlbWFwaG9yZUZkS0hSID0gKFBGTl92a0dldFNlbWFwaG9yZUZkS0hSKSBncGEoZGV2aWNlLCAidmtHZXRTZW1hcGhvcmVGZEtIUiIpOworICAgIGlmICh0YWJsZS0+R2V0U2VtYXBob3JlRmRLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0U2VtYXBob3JlRmRLSFIgPSAoUEZOX3ZrR2V0U2VtYXBob3JlRmRLSFIpU3R1YkdldFNlbWFwaG9yZUZkS0hSOyB9CisgICAgdGFibGUtPkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSID0gKFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKSBncGEoZGV2aWNlLCAidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIpOworICAgIGlmICh0YWJsZS0+Q21kUHVzaERlc2NyaXB0b3JTZXRLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kUHVzaERlc2NyaXB0b3JTZXRLSFIgPSAoUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIpU3R1YkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSOyB9CisgICAgdGFibGUtPkNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0gKFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKSBncGEoZGV2aWNlLCAidmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIpOworICAgIGlmICh0YWJsZS0+Q21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPSAoUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIpU3R1YkNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSOyB9CisgICAgdGFibGUtPkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IChQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIpOworICAgIGlmICh0YWJsZS0+Q3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IChQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIpU3R1YkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUjsgfQorICAgIHRhYmxlLT5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSID0gKFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IChQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKVN0dWJEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSOyB9CisgICAgdGFibGUtPlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPSAoUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUikgZ3BhKGRldmljZSwgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIpOworICAgIGlmICh0YWJsZS0+VXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0gKFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIpU3R1YlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFI7IH0KKyAgICB0YWJsZS0+Q3JlYXRlUmVuZGVyUGFzczJLSFIgPSAoUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzczJLSFIpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVSZW5kZXJQYXNzMktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5DcmVhdGVSZW5kZXJQYXNzMktIUiA9IChQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUilTdHViQ3JlYXRlUmVuZGVyUGFzczJLSFI7IH0KKyAgICB0YWJsZS0+Q21kQmVnaW5SZW5kZXJQYXNzMktIUiA9IChQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKSBncGEoZGV2aWNlLCAidmtDbWRCZWdpblJlbmRlclBhc3MyS0hSIik7CisgICAgaWYgKHRhYmxlLT5DbWRCZWdpblJlbmRlclBhc3MyS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEJlZ2luUmVuZGVyUGFzczJLSFIgPSAoUEZOX3ZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUilTdHViQ21kQmVnaW5SZW5kZXJQYXNzMktIUjsgfQorICAgIHRhYmxlLT5DbWROZXh0U3VicGFzczJLSFIgPSAoUEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSKSBncGEoZGV2aWNlLCAidmtDbWROZXh0U3VicGFzczJLSFIiKTsKKyAgICBpZiAodGFibGUtPkNtZE5leHRTdWJwYXNzMktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWROZXh0U3VicGFzczJLSFIgPSAoUEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSKVN0dWJDbWROZXh0U3VicGFzczJLSFI7IH0KKyAgICB0YWJsZS0+Q21kRW5kUmVuZGVyUGFzczJLSFIgPSAoUEZOX3ZrQ21kRW5kUmVuZGVyUGFzczJLSFIpIGdwYShkZXZpY2UsICJ2a0NtZEVuZFJlbmRlclBhc3MyS0hSIik7CisgICAgaWYgKHRhYmxlLT5DbWRFbmRSZW5kZXJQYXNzMktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRFbmRSZW5kZXJQYXNzMktIUiA9IChQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUilTdHViQ21kRW5kUmVuZGVyUGFzczJLSFI7IH0KKyAgICB0YWJsZS0+R2V0U3dhcGNoYWluU3RhdHVzS0hSID0gKFBGTl92a0dldFN3YXBjaGFpblN0YXR1c0tIUikgZ3BhKGRldmljZSwgInZrR2V0U3dhcGNoYWluU3RhdHVzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRTd2FwY2hhaW5TdGF0dXNLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0U3dhcGNoYWluU3RhdHVzS0hSID0gKFBGTl92a0dldFN3YXBjaGFpblN0YXR1c0tIUilTdHViR2V0U3dhcGNoYWluU3RhdHVzS0hSOyB9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5JbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSID0gKFBGTl92a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIpIGdwYShkZXZpY2UsICJ2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIiKTsKKyAgICBpZiAodGFibGUtPkltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+SW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiA9IChQRk5fdmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKVN0dWJJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSOyB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0RmVuY2VXaW4zMkhhbmRsZUtIUiA9IChQRk5fdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSKSBncGEoZGV2aWNlLCAidmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRGZW5jZVdpbjMySGFuZGxlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldEZlbmNlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUilTdHViR2V0RmVuY2VXaW4zMkhhbmRsZUtIUjsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+SW1wb3J0RmVuY2VGZEtIUiA9IChQRk5fdmtJbXBvcnRGZW5jZUZkS0hSKSBncGEoZGV2aWNlLCAidmtJbXBvcnRGZW5jZUZkS0hSIik7CisgICAgaWYgKHRhYmxlLT5JbXBvcnRGZW5jZUZkS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkltcG9ydEZlbmNlRmRLSFIgPSAoUEZOX3ZrSW1wb3J0RmVuY2VGZEtIUilTdHViSW1wb3J0RmVuY2VGZEtIUjsgfQorICAgIHRhYmxlLT5HZXRGZW5jZUZkS0hSID0gKFBGTl92a0dldEZlbmNlRmRLSFIpIGdwYShkZXZpY2UsICJ2a0dldEZlbmNlRmRLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldEZlbmNlRmRLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0RmVuY2VGZEtIUiA9IChQRk5fdmtHZXRGZW5jZUZkS0hSKVN0dWJHZXRGZW5jZUZkS0hSOyB9CisgICAgdGFibGUtPkFjcXVpcmVQcm9maWxpbmdMb2NrS0hSID0gKFBGTl92a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKSBncGEoZGV2aWNlLCAidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIpOworICAgIGlmICh0YWJsZS0+QWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+QWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgPSAoUEZOX3ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIpU3R1YkFjcXVpcmVQcm9maWxpbmdMb2NrS0hSOyB9CisgICAgdGFibGUtPlJlbGVhc2VQcm9maWxpbmdMb2NrS0hSID0gKFBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKSBncGEoZGV2aWNlLCAidmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiIpOworICAgIGlmICh0YWJsZS0+UmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+UmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIgPSAoUEZOX3ZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIpU3R1YlJlbGVhc2VQcm9maWxpbmdMb2NrS0hSOyB9CisgICAgdGFibGUtPkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IChQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIpIGdwYShkZXZpY2UsICJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIpOworICAgIGlmICh0YWJsZS0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IChQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIpU3R1YkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsgfQorICAgIHRhYmxlLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSID0gKFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIpIGdwYShkZXZpY2UsICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IChQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKVN0dWJHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSOyB9CisgICAgdGFibGUtPkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IChQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIpIGdwYShkZXZpY2UsICJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIpOworICAgIGlmICh0YWJsZS0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IChQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIpU3R1YkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsgfQorICAgIHRhYmxlLT5DcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gKFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKTsKKyAgICBpZiAodGFibGUtPkNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiA9IChQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKVN0dWJDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSOyB9CisgICAgdGFibGUtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gKFBGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKSBncGEoZGV2aWNlLCAidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIpOworICAgIGlmICh0YWJsZS0+RGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+RGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPSAoUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIpU3R1YkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSOyB9CisgICAgdGFibGUtPkJpbmRCdWZmZXJNZW1vcnkyS0hSID0gKFBGTl92a0JpbmRCdWZmZXJNZW1vcnkyS0hSKSBncGEoZGV2aWNlLCAidmtCaW5kQnVmZmVyTWVtb3J5MktIUiIpOworICAgIGlmICh0YWJsZS0+QmluZEJ1ZmZlck1lbW9yeTJLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+QmluZEJ1ZmZlck1lbW9yeTJLSFIgPSAoUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTJLSFIpU3R1YkJpbmRCdWZmZXJNZW1vcnkyS0hSOyB9CisgICAgdGFibGUtPkJpbmRJbWFnZU1lbW9yeTJLSFIgPSAoUEZOX3ZrQmluZEltYWdlTWVtb3J5MktIUikgZ3BhKGRldmljZSwgInZrQmluZEltYWdlTWVtb3J5MktIUiIpOworICAgIGlmICh0YWJsZS0+QmluZEltYWdlTWVtb3J5MktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5CaW5kSW1hZ2VNZW1vcnkyS0hSID0gKFBGTl92a0JpbmRJbWFnZU1lbW9yeTJLSFIpU3R1YkJpbmRJbWFnZU1lbW9yeTJLSFI7IH0KKyAgICB0YWJsZS0+R2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIpIGdwYShkZXZpY2UsICJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiA9IChQRk5fdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUilTdHViR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFI7IH0KKyAgICB0YWJsZS0+Q21kRHJhd0luZGlyZWN0Q291bnRLSFIgPSAoUEZOX3ZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIpIGdwYShkZXZpY2UsICJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSIik7CisgICAgaWYgKHRhYmxlLT5DbWREcmF3SW5kaXJlY3RDb3VudEtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWREcmF3SW5kaXJlY3RDb3VudEtIUiA9IChQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUilTdHViQ21kRHJhd0luZGlyZWN0Q291bnRLSFI7IH0KKyAgICB0YWJsZS0+Q21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSID0gKFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUikgZ3BhKGRldmljZSwgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSIik7CisgICAgaWYgKHRhYmxlLT5DbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSID0gKFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUilTdHViQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSOyB9CisgICAgdGFibGUtPkdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiA9IChQRk5fdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIpIGdwYShkZXZpY2UsICJ2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiIpOworICAgIGlmICh0YWJsZS0+R2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiA9IChQRk5fdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIpU3R1YkdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUjsgfQorICAgIHRhYmxlLT5XYWl0U2VtYXBob3Jlc0tIUiA9IChQRk5fdmtXYWl0U2VtYXBob3Jlc0tIUikgZ3BhKGRldmljZSwgInZrV2FpdFNlbWFwaG9yZXNLSFIiKTsKKyAgICBpZiAodGFibGUtPldhaXRTZW1hcGhvcmVzS0hSID09IG51bGxwdHIpIHsgdGFibGUtPldhaXRTZW1hcGhvcmVzS0hSID0gKFBGTl92a1dhaXRTZW1hcGhvcmVzS0hSKVN0dWJXYWl0U2VtYXBob3Jlc0tIUjsgfQorICAgIHRhYmxlLT5TaWduYWxTZW1hcGhvcmVLSFIgPSAoUEZOX3ZrU2lnbmFsU2VtYXBob3JlS0hSKSBncGEoZGV2aWNlLCAidmtTaWduYWxTZW1hcGhvcmVLSFIiKTsKKyAgICBpZiAodGFibGUtPlNpZ25hbFNlbWFwaG9yZUtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5TaWduYWxTZW1hcGhvcmVLSFIgPSAoUEZOX3ZrU2lnbmFsU2VtYXBob3JlS0hSKVN0dWJTaWduYWxTZW1hcGhvcmVLSFI7IH0KKyAgICB0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKSBncGEoZGV2aWNlLCAidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUilTdHViR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjsgfQorICAgIHRhYmxlLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSID0gKFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIpIGdwYShkZXZpY2UsICJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiA9IChQRk5fdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKVN0dWJHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSOyB9CisgICAgdGFibGUtPkdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSID0gKFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKSBncGEoZGV2aWNlLCAidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIpOworICAgIGlmICh0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgPSAoUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIpU3R1YkdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSOyB9CisgICAgdGFibGUtPkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUID0gKFBGTl92a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKSBncGEoZGV2aWNlLCAidmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCIpOworICAgIGlmICh0YWJsZS0+RGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+RGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQgPSAoUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQpU3R1YkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUOyB9CisgICAgdGFibGUtPkRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCA9IChQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQpIGdwYShkZXZpY2UsICJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCIpOworICAgIGlmICh0YWJsZS0+RGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCA9IChQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQpU3R1YkRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVDsgfQorICAgIHRhYmxlLT5DbWREZWJ1Z01hcmtlckJlZ2luRVhUID0gKFBGTl92a0NtZERlYnVnTWFya2VyQmVnaW5FWFQpIGdwYShkZXZpY2UsICJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZERlYnVnTWFya2VyQmVnaW5FWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRGVidWdNYXJrZXJCZWdpbkVYVCA9IChQRk5fdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUKVN0dWJDbWREZWJ1Z01hcmtlckJlZ2luRVhUOyB9CisgICAgdGFibGUtPkNtZERlYnVnTWFya2VyRW5kRVhUID0gKFBGTl92a0NtZERlYnVnTWFya2VyRW5kRVhUKSBncGEoZGV2aWNlLCAidmtDbWREZWJ1Z01hcmtlckVuZEVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kRGVidWdNYXJrZXJFbmRFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRGVidWdNYXJrZXJFbmRFWFQgPSAoUEZOX3ZrQ21kRGVidWdNYXJrZXJFbmRFWFQpU3R1YkNtZERlYnVnTWFya2VyRW5kRVhUOyB9CisgICAgdGFibGUtPkNtZERlYnVnTWFya2VySW5zZXJ0RVhUID0gKFBGTl92a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUKSBncGEoZGV2aWNlLCAidmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kRGVidWdNYXJrZXJJbnNlcnRFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRGVidWdNYXJrZXJJbnNlcnRFWFQgPSAoUEZOX3ZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQpU3R1YkNtZERlYnVnTWFya2VySW5zZXJ0RVhUOyB9CisgICAgdGFibGUtPkNtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQgPSAoUEZOX3ZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCkgZ3BhKGRldmljZSwgInZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCIpOworICAgIGlmICh0YWJsZS0+Q21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUID0gKFBGTl92a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQpU3R1YkNtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQ7IH0KKyAgICB0YWJsZS0+Q21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCA9IChQRk5fdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKSBncGEoZGV2aWNlLCAidmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUIik7CisgICAgaWYgKHRhYmxlLT5DbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQgPSAoUEZOX3ZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVClTdHViQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVDsgfQorICAgIHRhYmxlLT5DbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCA9IChQRk5fdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCkgZ3BhKGRldmljZSwgInZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUID0gKFBGTl92a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKVN0dWJDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVDsgfQorICAgIHRhYmxlLT5DbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCA9IChQRk5fdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCkgZ3BhKGRldmljZSwgInZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEJlZ2luUXVlcnlJbmRleGVkRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEJlZ2luUXVlcnlJbmRleGVkRVhUID0gKFBGTl92a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUKVN0dWJDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVDsgfQorICAgIHRhYmxlLT5DbWRFbmRRdWVyeUluZGV4ZWRFWFQgPSAoUEZOX3ZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKSBncGEoZGV2aWNlLCAidmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEVuZFF1ZXJ5SW5kZXhlZEVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRFbmRRdWVyeUluZGV4ZWRFWFQgPSAoUEZOX3ZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKVN0dWJDbWRFbmRRdWVyeUluZGV4ZWRFWFQ7IH0KKyAgICB0YWJsZS0+Q21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCkgZ3BhKGRldmljZSwgInZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUIik7CisgICAgaWYgKHRhYmxlLT5DbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVClTdHViQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUOyB9CisgICAgdGFibGUtPkdldEltYWdlVmlld0hhbmRsZU5WWCA9IChQRk5fdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgpIGdwYShkZXZpY2UsICJ2a0dldEltYWdlVmlld0hhbmRsZU5WWCIpOworICAgIGlmICh0YWJsZS0+R2V0SW1hZ2VWaWV3SGFuZGxlTlZYID09IG51bGxwdHIpIHsgdGFibGUtPkdldEltYWdlVmlld0hhbmRsZU5WWCA9IChQRk5fdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgpU3R1YkdldEltYWdlVmlld0hhbmRsZU5WWDsgfQorICAgIHRhYmxlLT5DbWREcmF3SW5kaXJlY3RDb3VudEFNRCA9IChQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCkgZ3BhKGRldmljZSwgInZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQiKTsKKyAgICBpZiAodGFibGUtPkNtZERyYXdJbmRpcmVjdENvdW50QU1EID09IG51bGxwdHIpIHsgdGFibGUtPkNtZERyYXdJbmRpcmVjdENvdW50QU1EID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdENvdW50QU1EKVN0dWJDbWREcmF3SW5kaXJlY3RDb3VudEFNRDsgfQorICAgIHRhYmxlLT5DbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQgPSAoUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKSBncGEoZGV2aWNlLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiKTsKKyAgICBpZiAodGFibGUtPkNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQgPSAoUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKVN0dWJDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQ7IH0KKyAgICB0YWJsZS0+R2V0U2hhZGVySW5mb0FNRCA9IChQRk5fdmtHZXRTaGFkZXJJbmZvQU1EKSBncGEoZGV2aWNlLCAidmtHZXRTaGFkZXJJbmZvQU1EIik7CisgICAgaWYgKHRhYmxlLT5HZXRTaGFkZXJJbmZvQU1EID09IG51bGxwdHIpIHsgdGFibGUtPkdldFNoYWRlckluZm9BTUQgPSAoUEZOX3ZrR2V0U2hhZGVySW5mb0FNRClTdHViR2V0U2hhZGVySW5mb0FNRDsgfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0TWVtb3J5V2luMzJIYW5kbGVOViA9IChQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKSBncGEoZGV2aWNlLCAidmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WIik7CisgICAgaWYgKHRhYmxlLT5HZXRNZW1vcnlXaW4zMkhhbmRsZU5WID09IG51bGxwdHIpIHsgdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlTlYgPSAoUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVilTdHViR2V0TWVtb3J5V2luMzJIYW5kbGVOVjsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+Q21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IChQRk5fdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKSBncGEoZGV2aWNlLCAidmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIik7CisgICAgaWYgKHRhYmxlLT5DbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgPSAoUEZOX3ZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVClTdHViQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVDsgfQorICAgIHRhYmxlLT5DbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IChQRk5fdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCkgZ3BhKGRldmljZSwgInZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUID0gKFBGTl92a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKVN0dWJDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVDsgfQorICAgIHRhYmxlLT5DbWRQcm9jZXNzQ29tbWFuZHNOVlggPSAoUEZOX3ZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKSBncGEoZGV2aWNlLCAidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiKTsKKyAgICBpZiAodGFibGUtPkNtZFByb2Nlc3NDb21tYW5kc05WWCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRQcm9jZXNzQ29tbWFuZHNOVlggPSAoUEZOX3ZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKVN0dWJDbWRQcm9jZXNzQ29tbWFuZHNOVlg7IH0KKyAgICB0YWJsZS0+Q21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlggPSAoUEZOX3ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgpIGdwYShkZXZpY2UsICJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIik7CisgICAgaWYgKHRhYmxlLT5DbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCA9IChQRk5fdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWClTdHViQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlg7IH0KKyAgICB0YWJsZS0+Q3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IChQRk5fdmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKSBncGEoZGV2aWNlLCAidmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggPSAoUEZOX3ZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWClTdHViQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsgfQorICAgIHRhYmxlLT5EZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IChQRk5fdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCkgZ3BhKGRldmljZSwgInZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID09IG51bGxwdHIpIHsgdGFibGUtPkRlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID0gKFBGTl92a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKVN0dWJEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsgfQorICAgIHRhYmxlLT5DcmVhdGVPYmplY3RUYWJsZU5WWCA9IChQRk5fdmtDcmVhdGVPYmplY3RUYWJsZU5WWCkgZ3BhKGRldmljZSwgInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiKTsKKyAgICBpZiAodGFibGUtPkNyZWF0ZU9iamVjdFRhYmxlTlZYID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZU9iamVjdFRhYmxlTlZYID0gKFBGTl92a0NyZWF0ZU9iamVjdFRhYmxlTlZYKVN0dWJDcmVhdGVPYmplY3RUYWJsZU5WWDsgfQorICAgIHRhYmxlLT5EZXN0cm95T2JqZWN0VGFibGVOVlggPSAoUEZOX3ZrRGVzdHJveU9iamVjdFRhYmxlTlZYKSBncGEoZGV2aWNlLCAidmtEZXN0cm95T2JqZWN0VGFibGVOVlgiKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lPYmplY3RUYWJsZU5WWCA9PSBudWxscHRyKSB7IHRhYmxlLT5EZXN0cm95T2JqZWN0VGFibGVOVlggPSAoUEZOX3ZrRGVzdHJveU9iamVjdFRhYmxlTlZYKVN0dWJEZXN0cm95T2JqZWN0VGFibGVOVlg7IH0KKyAgICB0YWJsZS0+UmVnaXN0ZXJPYmplY3RzTlZYID0gKFBGTl92a1JlZ2lzdGVyT2JqZWN0c05WWCkgZ3BhKGRldmljZSwgInZrUmVnaXN0ZXJPYmplY3RzTlZYIik7CisgICAgaWYgKHRhYmxlLT5SZWdpc3Rlck9iamVjdHNOVlggPT0gbnVsbHB0cikgeyB0YWJsZS0+UmVnaXN0ZXJPYmplY3RzTlZYID0gKFBGTl92a1JlZ2lzdGVyT2JqZWN0c05WWClTdHViUmVnaXN0ZXJPYmplY3RzTlZYOyB9CisgICAgdGFibGUtPlVucmVnaXN0ZXJPYmplY3RzTlZYID0gKFBGTl92a1VucmVnaXN0ZXJPYmplY3RzTlZYKSBncGEoZGV2aWNlLCAidmtVbnJlZ2lzdGVyT2JqZWN0c05WWCIpOworICAgIGlmICh0YWJsZS0+VW5yZWdpc3Rlck9iamVjdHNOVlggPT0gbnVsbHB0cikgeyB0YWJsZS0+VW5yZWdpc3Rlck9iamVjdHNOVlggPSAoUEZOX3ZrVW5yZWdpc3Rlck9iamVjdHNOVlgpU3R1YlVucmVnaXN0ZXJPYmplY3RzTlZYOyB9CisgICAgdGFibGUtPkNtZFNldFZpZXdwb3J0V1NjYWxpbmdOViA9IChQRk5fdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYpIGdwYShkZXZpY2UsICJ2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0Vmlld3BvcnRXU2NhbGluZ05WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldFZpZXdwb3J0V1NjYWxpbmdOViA9IChQRk5fdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYpU3R1YkNtZFNldFZpZXdwb3J0V1NjYWxpbmdOVjsgfQorICAgIHRhYmxlLT5EaXNwbGF5UG93ZXJDb250cm9sRVhUID0gKFBGTl92a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQpIGdwYShkZXZpY2UsICJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiKTsKKyAgICBpZiAodGFibGUtPkRpc3BsYXlQb3dlckNvbnRyb2xFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+RGlzcGxheVBvd2VyQ29udHJvbEVYVCA9IChQRk5fdmtEaXNwbGF5UG93ZXJDb250cm9sRVhUKVN0dWJEaXNwbGF5UG93ZXJDb250cm9sRVhUOyB9CisgICAgdGFibGUtPlJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQgPSAoUEZOX3ZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCkgZ3BhKGRldmljZSwgInZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIpOworICAgIGlmICh0YWJsZS0+UmVnaXN0ZXJEZXZpY2VFdmVudEVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5SZWdpc3RlckRldmljZUV2ZW50RVhUID0gKFBGTl92a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQpU3R1YlJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQ7IH0KKyAgICB0YWJsZS0+UmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQgPSAoUEZOX3ZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQpIGdwYShkZXZpY2UsICJ2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIik7CisgICAgaWYgKHRhYmxlLT5SZWdpc3RlckRpc3BsYXlFdmVudEVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5SZWdpc3RlckRpc3BsYXlFdmVudEVYVCA9IChQRk5fdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVClTdHViUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQ7IH0KKyAgICB0YWJsZS0+R2V0U3dhcGNoYWluQ291bnRlckVYVCA9IChQRk5fdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUKSBncGEoZGV2aWNlLCAidmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIik7CisgICAgaWYgKHRhYmxlLT5HZXRTd2FwY2hhaW5Db3VudGVyRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkdldFN3YXBjaGFpbkNvdW50ZXJFWFQgPSAoUEZOX3ZrR2V0U3dhcGNoYWluQ291bnRlckVYVClTdHViR2V0U3dhcGNoYWluQ291bnRlckVYVDsgfQorICAgIHRhYmxlLT5HZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSA9IChQRk5fdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSkgZ3BhKGRldmljZSwgInZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUiKTsKKyAgICBpZiAodGFibGUtPkdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFID09IG51bGxwdHIpIHsgdGFibGUtPkdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFID0gKFBGTl92a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKVN0dWJHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRTsgfQorICAgIHRhYmxlLT5HZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFID0gKFBGTl92a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUpIGdwYShkZXZpY2UsICJ2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiKTsKKyAgICBpZiAodGFibGUtPkdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSA9IChQRk5fdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKVN0dWJHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFOyB9CisgICAgdGFibGUtPkNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQgPSAoUEZOX3ZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCkgZ3BhKGRldmljZSwgInZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUID0gKFBGTl92a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQpU3R1YkNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQ7IH0KKyAgICB0YWJsZS0+U2V0SGRyTWV0YWRhdGFFWFQgPSAoUEZOX3ZrU2V0SGRyTWV0YWRhdGFFWFQpIGdwYShkZXZpY2UsICJ2a1NldEhkck1ldGFkYXRhRVhUIik7CisgICAgaWYgKHRhYmxlLT5TZXRIZHJNZXRhZGF0YUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5TZXRIZHJNZXRhZGF0YUVYVCA9IChQRk5fdmtTZXRIZHJNZXRhZGF0YUVYVClTdHViU2V0SGRyTWV0YWRhdGFFWFQ7IH0KKyAgICB0YWJsZS0+U2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgPSAoUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQpIGdwYShkZXZpY2UsICJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIik7CisgICAgdGFibGUtPlNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQgPSAoUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCkgZ3BhKGRldmljZSwgInZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCIpOworICAgIHRhYmxlLT5RdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQpIGdwYShkZXZpY2UsICJ2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiKTsKKyAgICB0YWJsZS0+UXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQpIGdwYShkZXZpY2UsICJ2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUIik7CisgICAgdGFibGUtPlF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKSBncGEoZGV2aWNlLCAidmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgIHRhYmxlLT5DbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCA9IChQRk5fdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCkgZ3BhKGRldmljZSwgInZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiKTsKKyAgICB0YWJsZS0+Q21kRW5kRGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCkgZ3BhKGRldmljZSwgInZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUIik7CisgICAgdGFibGUtPkNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCA9IChQRk5fdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQpIGdwYShkZXZpY2UsICJ2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIpOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHRhYmxlLT5HZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCA9IChQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCkgZ3BhKGRldmljZSwgInZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiKTsKKyAgICBpZiAodGFibGUtPkdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEID09IG51bGxwdHIpIHsgdGFibGUtPkdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEID0gKFBGTl92a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKVN0dWJHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRDsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHRhYmxlLT5HZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEID0gKFBGTl92a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQpIGdwYShkZXZpY2UsICJ2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQiKTsKKyAgICBpZiAodGFibGUtPkdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCA9IChQRk5fdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKVN0dWJHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEOyB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgdGFibGUtPkNtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCA9IChQRk5fdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQpIGdwYShkZXZpY2UsICJ2a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0U2FtcGxlTG9jYXRpb25zRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCA9IChQRk5fdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQpU3R1YkNtZFNldFNhbXBsZUxvY2F0aW9uc0VYVDsgfQorICAgIHRhYmxlLT5HZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCA9IChQRk5fdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCkgZ3BhKGRldmljZSwgInZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiKTsKKyAgICBpZiAodGFibGUtPkdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUID0gKFBGTl92a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKVN0dWJHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVDsgfQorICAgIHRhYmxlLT5DcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQgPSAoUEZOX3ZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKSBncGEoZGV2aWNlLCAidmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQiKTsKKyAgICBpZiAodGFibGUtPkNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQgPSAoUEZOX3ZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKVN0dWJDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQ7IH0KKyAgICB0YWJsZS0+RGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCA9IChQRk5fdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKSBncGEoZGV2aWNlLCAidmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUIik7CisgICAgaWYgKHRhYmxlLT5EZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQgPSAoUEZOX3ZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVClTdHViRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVDsgfQorICAgIHRhYmxlLT5NZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQgPSAoUEZOX3ZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKSBncGEoZGV2aWNlLCAidmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQiKTsKKyAgICBpZiAodGFibGUtPk1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5NZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQgPSAoUEZOX3ZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKVN0dWJNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQ7IH0KKyAgICB0YWJsZS0+R2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCA9IChQRk5fdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKSBncGEoZGV2aWNlLCAidmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIik7CisgICAgaWYgKHRhYmxlLT5HZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQgPSAoUEZOX3ZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVClTdHViR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVDsgfQorICAgIHRhYmxlLT5DbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WID0gKFBGTl92a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYpIGdwYShkZXZpY2UsICJ2a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYiKTsKKyAgICBpZiAodGFibGUtPkNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViA9IChQRk5fdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKVN0dWJDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WOyB9CisgICAgdGFibGUtPkNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYgPSAoUEZOX3ZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVikgZ3BhKGRldmljZSwgInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WID0gKFBGTl92a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYpU3R1YkNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlY7IH0KKyAgICB0YWJsZS0+Q21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViA9IChQRk5fdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKSBncGEoZGV2aWNlLCAidmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WIik7CisgICAgaWYgKHRhYmxlLT5DbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYgPSAoUEZOX3ZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVilTdHViQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVjsgfQorICAgIHRhYmxlLT5DcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IChQRk5fdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikgZ3BhKGRldmljZSwgInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKTsKKyAgICBpZiAodGFibGUtPkNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKVN0dWJDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsgfQorICAgIHRhYmxlLT5EZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSAoUEZOX3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKSBncGEoZGV2aWNlLCAidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9PSBudWxscHRyKSB7IHRhYmxlLT5EZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSAoUEZOX3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKVN0dWJEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7IH0KKyAgICB0YWJsZS0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgPSAoUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYpIGdwYShkZXZpY2UsICJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WIik7CisgICAgaWYgKHRhYmxlLT5HZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViA9IChQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVilTdHViR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY7IH0KKyAgICB0YWJsZS0+QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WID0gKFBGTl92a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVikgZ3BhKGRldmljZSwgInZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIik7CisgICAgaWYgKHRhYmxlLT5CaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WID0gKFBGTl92a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVilTdHViQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WOyB9CisgICAgdGFibGUtPkNtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSAoUEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikgZ3BhKGRldmljZSwgInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpOworICAgIGlmICh0YWJsZS0+Q21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpU3R1YkNtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7IH0KKyAgICB0YWJsZS0+Q21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikgZ3BhKGRldmljZSwgInZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIik7CisgICAgaWYgKHRhYmxlLT5DbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVilTdHViQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOyB9CisgICAgdGFibGUtPkNtZFRyYWNlUmF5c05WID0gKFBGTl92a0NtZFRyYWNlUmF5c05WKSBncGEoZGV2aWNlLCAidmtDbWRUcmFjZVJheXNOViIpOworICAgIGlmICh0YWJsZS0+Q21kVHJhY2VSYXlzTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kVHJhY2VSYXlzTlYgPSAoUEZOX3ZrQ21kVHJhY2VSYXlzTlYpU3R1YkNtZFRyYWNlUmF5c05WOyB9CisgICAgdGFibGUtPkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViA9IChQRk5fdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIpOworICAgIGlmICh0YWJsZS0+Q3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViA9IChQRk5fdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYpU3R1YkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVjsgfQorICAgIHRhYmxlLT5HZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYgPSAoUEZOX3ZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKSBncGEoZGV2aWNlLCAidmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYiKTsKKyAgICBpZiAodGFibGUtPkdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYgPSAoUEZOX3ZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKVN0dWJHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlY7IH0KKyAgICB0YWJsZS0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYgPSAoUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYpIGdwYShkZXZpY2UsICJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIik7CisgICAgaWYgKHRhYmxlLT5HZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViA9IChQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVilTdHViR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlY7IH0KKyAgICB0YWJsZS0+Q21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WID0gKFBGTl92a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVikgZ3BhKGRldmljZSwgInZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIik7CisgICAgaWYgKHRhYmxlLT5DbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WID0gKFBGTl92a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVilTdHViQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WOyB9CisgICAgdGFibGUtPkNvbXBpbGVEZWZlcnJlZE5WID0gKFBGTl92a0NvbXBpbGVEZWZlcnJlZE5WKSBncGEoZGV2aWNlLCAidmtDb21waWxlRGVmZXJyZWROViIpOworICAgIGlmICh0YWJsZS0+Q29tcGlsZURlZmVycmVkTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q29tcGlsZURlZmVycmVkTlYgPSAoUEZOX3ZrQ29tcGlsZURlZmVycmVkTlYpU3R1YkNvbXBpbGVEZWZlcnJlZE5WOyB9CisgICAgdGFibGUtPkdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCA9IChQRk5fdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQpIGdwYShkZXZpY2UsICJ2a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCIpOworICAgIGlmICh0YWJsZS0+R2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCA9IChQRk5fdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQpU3R1YkdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDsgfQorICAgIHRhYmxlLT5DbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCA9IChQRk5fdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCkgZ3BhKGRldmljZSwgInZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQiKTsKKyAgICBpZiAodGFibGUtPkNtZFdyaXRlQnVmZmVyTWFya2VyQU1EID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFdyaXRlQnVmZmVyTWFya2VyQU1EID0gKFBGTl92a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EKVN0dWJDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRDsgfQorICAgIHRhYmxlLT5HZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCA9IChQRk5fdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCkgZ3BhKGRldmljZSwgInZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQiKTsKKyAgICBpZiAodGFibGUtPkdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUID0gKFBGTl92a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKVN0dWJHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVDsgfQorICAgIHRhYmxlLT5DbWREcmF3TWVzaFRhc2tzTlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc05WKSBncGEoZGV2aWNlLCAidmtDbWREcmF3TWVzaFRhc2tzTlYiKTsKKyAgICBpZiAodGFibGUtPkNtZERyYXdNZXNoVGFza3NOViA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWREcmF3TWVzaFRhc2tzTlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc05WKVN0dWJDbWREcmF3TWVzaFRhc2tzTlY7IH0KKyAgICB0YWJsZS0+Q21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYpIGdwYShkZXZpY2UsICJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WIik7CisgICAgaWYgKHRhYmxlLT5DbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViA9IChQRk5fdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVilTdHViQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlY7IH0KKyAgICB0YWJsZS0+Q21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViA9IChQRk5fdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKSBncGEoZGV2aWNlLCAidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIik7CisgICAgaWYgKHRhYmxlLT5DbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVilTdHViQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVjsgfQorICAgIHRhYmxlLT5DbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYgPSAoUEZOX3ZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKSBncGEoZGV2aWNlLCAidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYiKTsKKyAgICBpZiAodGFibGUtPkNtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYgPSAoUEZOX3ZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKVN0dWJDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlY7IH0KKyAgICB0YWJsZS0+Q21kU2V0Q2hlY2twb2ludE5WID0gKFBGTl92a0NtZFNldENoZWNrcG9pbnROVikgZ3BhKGRldmljZSwgInZrQ21kU2V0Q2hlY2twb2ludE5WIik7CisgICAgaWYgKHRhYmxlLT5DbWRTZXRDaGVja3BvaW50TlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kU2V0Q2hlY2twb2ludE5WID0gKFBGTl92a0NtZFNldENoZWNrcG9pbnROVilTdHViQ21kU2V0Q2hlY2twb2ludE5WOyB9CisgICAgdGFibGUtPkdldFF1ZXVlQ2hlY2twb2ludERhdGFOViA9IChQRk5fdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYpIGdwYShkZXZpY2UsICJ2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViIpOworICAgIGlmICh0YWJsZS0+R2V0UXVldWVDaGVja3BvaW50RGF0YU5WID09IG51bGxwdHIpIHsgdGFibGUtPkdldFF1ZXVlQ2hlY2twb2ludERhdGFOViA9IChQRk5fdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYpU3R1YkdldFF1ZXVlQ2hlY2twb2ludERhdGFOVjsgfQorICAgIHRhYmxlLT5Jbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IChQRk5fdmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCkgZ3BhKGRldmljZSwgInZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwiKTsKKyAgICBpZiAodGFibGUtPkluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMID09IG51bGxwdHIpIHsgdGFibGUtPkluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMID0gKFBGTl92a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKVN0dWJJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTDsgfQorICAgIHRhYmxlLT5VbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMID0gKFBGTl92a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwpIGdwYShkZXZpY2UsICJ2a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwiKTsKKyAgICBpZiAodGFibGUtPlVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwgPT0gbnVsbHB0cikgeyB0YWJsZS0+VW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IChQRk5fdmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKVN0dWJVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMOyB9CisgICAgdGFibGUtPkNtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwgPSAoUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCkgZ3BhKGRldmljZSwgInZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMID0gKFBGTl92a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwpU3R1YkNtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUw7IH0KKyAgICB0YWJsZS0+Q21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCA9IChQRk5fdmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKSBncGEoZGV2aWNlLCAidmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMIik7CisgICAgaWYgKHRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwgPSAoUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTClTdHViQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTDsgfQorICAgIHRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwgPSAoUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKSBncGEoZGV2aWNlLCAidmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwiKTsKKyAgICBpZiAodGFibGUtPkNtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwgPSAoUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKVN0dWJDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUw7IH0KKyAgICB0YWJsZS0+QWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID0gKFBGTl92a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCkgZ3BhKGRldmljZSwgInZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIik7CisgICAgaWYgKHRhYmxlLT5BY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPT0gbnVsbHB0cikgeyB0YWJsZS0+QWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID0gKFBGTl92a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTClTdHViQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOyB9CisgICAgdGFibGUtPlJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IChQRk5fdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpIGdwYShkZXZpY2UsICJ2a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIpOworICAgIGlmICh0YWJsZS0+UmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID09IG51bGxwdHIpIHsgdGFibGUtPlJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IChQRk5fdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpU3R1YlJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsgfQorICAgIHRhYmxlLT5RdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID0gKFBGTl92a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpIGdwYShkZXZpY2UsICJ2a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiKTsKKyAgICBpZiAodGFibGUtPlF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPT0gbnVsbHB0cikgeyB0YWJsZS0+UXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IChQRk5fdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKVN0dWJRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOyB9CisgICAgdGFibGUtPkdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwgPSAoUEZOX3ZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCkgZ3BhKGRldmljZSwgInZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIpOworICAgIGlmICh0YWJsZS0+R2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMID0gKFBGTl92a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwpU3R1YkdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUw7IH0KKyAgICB0YWJsZS0+U2V0TG9jYWxEaW1taW5nQU1EID0gKFBGTl92a1NldExvY2FsRGltbWluZ0FNRCkgZ3BhKGRldmljZSwgInZrU2V0TG9jYWxEaW1taW5nQU1EIik7CisgICAgaWYgKHRhYmxlLT5TZXRMb2NhbERpbW1pbmdBTUQgPT0gbnVsbHB0cikgeyB0YWJsZS0+U2V0TG9jYWxEaW1taW5nQU1EID0gKFBGTl92a1NldExvY2FsRGltbWluZ0FNRClTdHViU2V0TG9jYWxEaW1taW5nQU1EOyB9CisgICAgdGFibGUtPkdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQgPSAoUEZOX3ZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCkgZ3BhKGRldmljZSwgInZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIpOworICAgIGlmICh0YWJsZS0+R2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUID0gKFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQpU3R1YkdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQ7IH0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCA9IChQRk5fdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQpIGdwYShkZXZpY2UsICJ2a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIpOworICAgIGlmICh0YWJsZS0+QWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCA9IChQRk5fdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQpU3R1YkFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVDsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCA9IChQRk5fdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQpIGdwYShkZXZpY2UsICJ2a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIpOworICAgIGlmICh0YWJsZS0+UmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUID09IG51bGxwdHIpIHsgdGFibGUtPlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCA9IChQRk5fdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQpU3R1YlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVDsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCkgZ3BhKGRldmljZSwgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIpOworICAgIGlmICh0YWJsZS0+R2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUID0gKFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQpU3R1YkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQ7IH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkNtZFNldExpbmVTdGlwcGxlRVhUID0gKFBGTl92a0NtZFNldExpbmVTdGlwcGxlRVhUKSBncGEoZGV2aWNlLCAidmtDbWRTZXRMaW5lU3RpcHBsZUVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0TGluZVN0aXBwbGVFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kU2V0TGluZVN0aXBwbGVFWFQgPSAoUEZOX3ZrQ21kU2V0TGluZVN0aXBwbGVFWFQpU3R1YkNtZFNldExpbmVTdGlwcGxlRVhUOyB9CisgICAgdGFibGUtPlJlc2V0UXVlcnlQb29sRVhUID0gKFBGTl92a1Jlc2V0UXVlcnlQb29sRVhUKSBncGEoZGV2aWNlLCAidmtSZXNldFF1ZXJ5UG9vbEVYVCIpOworICAgIGlmICh0YWJsZS0+UmVzZXRRdWVyeVBvb2xFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+UmVzZXRRdWVyeVBvb2xFWFQgPSAoUEZOX3ZrUmVzZXRRdWVyeVBvb2xFWFQpU3R1YlJlc2V0UXVlcnlQb29sRVhUOyB9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGxheWVyX2luaXRfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqdGFibGUsIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ3BhKSB7CisgICAgbWVtc2V0KHRhYmxlLCAwLCBzaXplb2YoKnRhYmxlKSk7CisgICAgLy8gSW5zdGFuY2UgZnVuY3Rpb24gcG9pbnRlcnMKKyAgICB0YWJsZS0+RGVzdHJveUluc3RhbmNlID0gKFBGTl92a0Rlc3Ryb3lJbnN0YW5jZSkgZ3BhKGluc3RhbmNlLCAidmtEZXN0cm95SW5zdGFuY2UiKTsKKyAgICB0YWJsZS0+RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzID0gKFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcykgZ3BhKGluc3RhbmNlLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcykgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcykgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcykgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0SW5zdGFuY2VQcm9jQWRkciA9IGdwYTsKKyAgICB0YWJsZS0+RW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyA9IChQRk5fdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKSBncGEoaW5zdGFuY2UsICJ2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+RW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzID0gKFBGTl92a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcykgZ3BhKGluc3RhbmNlLCAidmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgPSAoUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMpIGdwYShpbnN0YW5jZSwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+RGVzdHJveVN1cmZhY2VLSFIgPSAoUEZOX3ZrRGVzdHJveVN1cmZhY2VLSFIpIGdwYShpbnN0YW5jZSwgInZrRGVzdHJveVN1cmZhY2VLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIgPSAoUEZOX3ZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRGlzcGxheU1vZGVLSFIgPSAoUEZOX3ZrQ3JlYXRlRGlzcGxheU1vZGVLSFIpIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlRGlzcGxheU1vZGVLSFIiKTsKKyAgICB0YWJsZS0+R2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSID0gKFBGTl92a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICB0YWJsZS0+Q3JlYXRlWGxpYlN1cmZhY2VLSFIgPSAoUEZOX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIpIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIHRhYmxlLT5DcmVhdGVYY2JTdXJmYWNlS0hSID0gKFBGTl92a0NyZWF0ZVhjYlN1cmZhY2VLSFIpIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlWGNiU3VyZmFjZUtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIHRhYmxlLT5DcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUikgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHRhYmxlLT5DcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUikgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+Q3JlYXRlV2luMzJTdXJmYWNlS0hSID0gKFBGTl92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUikgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIgPSAoUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIpIGdwYShpbnN0YW5jZSwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIiKTsKKyAgICB0YWJsZS0+RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiA9IChQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiA9IChQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCA9IChQRk5fdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPSAoUEZOX3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpIGdwYShpbnN0YW5jZSwgInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKTsKKyAgICB0YWJsZS0+RGVidWdSZXBvcnRNZXNzYWdlRVhUID0gKFBGTl92a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCkgZ3BhKGluc3RhbmNlLCAidmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQiKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgdGFibGUtPkNyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQID0gKFBGTl92a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViIpOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIHRhYmxlLT5DcmVhdGVWaVN1cmZhY2VOTiA9IChQRk5fdmtDcmVhdGVWaVN1cmZhY2VOTikgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVWaVN1cmZhY2VOTiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCkgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCIpOworICAgIHRhYmxlLT5SZWxlYXNlRGlzcGxheUVYVCA9IChQRk5fdmtSZWxlYXNlRGlzcGxheUVYVCkgZ3BhKGluc3RhbmNlLCAidmtSZWxlYXNlRGlzcGxheUVYVCIpOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICB0YWJsZS0+QWNxdWlyZVhsaWJEaXNwbGF5RVhUID0gKFBGTl92a0FjcXVpcmVYbGliRGlzcGxheUVYVCkgZ3BhKGluc3RhbmNlLCAidmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgIHRhYmxlLT5HZXRSYW5kUk91dHB1dERpc3BsYXlFWFQgPSAoUEZOX3ZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKSBncGEoaW5zdGFuY2UsICJ2a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQiKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgIHRhYmxlLT5DcmVhdGVJT1NTdXJmYWNlTVZLID0gKFBGTl92a0NyZWF0ZUlPU1N1cmZhY2VNVkspIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlSU9TU3VyZmFjZU1WSyIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIHRhYmxlLT5DcmVhdGVNYWNPU1N1cmZhY2VNVksgPSAoUEZOX3ZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyAgICB0YWJsZS0+Q3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCA9IChQRk5fdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgPSAoUEZOX3ZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQpIGdwYShpbnN0YW5jZSwgInZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiKTsKKyAgICB0YWJsZS0+U3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQgPSAoUEZOX3ZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQpIGdwYShpbnN0YW5jZSwgInZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQiKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorICAgIHRhYmxlLT5DcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSA9IChQRk5fdmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSkgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgIHRhYmxlLT5DcmVhdGVNZXRhbFN1cmZhY2VFWFQgPSAoUEZOX3ZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYiKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCkgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5DcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQgPSAoUEZOX3ZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9nZW5lcmF0ZWQvdmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZ2VuZXJhdGVkL3ZrX2xheWVyX2Rpc3BhdGNoX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMmFjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZ2VuZXJhdGVkL3ZrX2xheWVyX2Rpc3BhdGNoX3RhYmxlLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqCisvLyBTZWUgbG9hZGVyX2V4dGVuc2lvbl9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMKKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBZb3VuZyA8bWFya3lAbHVuYXJnLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKwordHlwZWRlZiBQRk5fdmtWb2lkRnVuY3Rpb24gKFZLQVBJX1BUUiAqUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBOYW1lKTsKKworLy8gSW5zdGFuY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZV8geworICAgIC8vIE1hbnVhbGx5IGFkZCBpbiBHZXRQaHlzaWNhbERldmljZVByb2NBZGRyIGVudHJ5CisgICAgUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcjsKKworICAgIC8vIC0tLS0gQ29yZSAxXzAgY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBDcmVhdGVJbnN0YW5jZTsKKyAgICBQRk5fdmtEZXN0cm95SW5zdGFuY2UgRGVzdHJveUluc3RhbmNlOworICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyBFbnVtZXJhdGVQaHlzaWNhbERldmljZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgR2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVEZXZpY2UgQ3JlYXRlRGV2aWNlOworICAgIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXM7CisgICAgUEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyBFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworICAgIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzOworICAgIFBGTl92a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyBFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisKKyAgICAvLyAtLS0tIENvcmUgMV8xIGNvbW1hbmRzCisgICAgUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIEVudW1lcmF0ZUluc3RhbmNlVmVyc2lvbjsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSIERlc3Ryb3lTdXJmYWNlS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfc3dhcGNoYWluIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFI7CisgICAgUEZOX3ZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIgR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFI7CisgICAgUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIEdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUjsKKyAgICBQRk5fdmtDcmVhdGVEaXNwbGF5TW9kZUtIUiBDcmVhdGVEaXNwbGF5TW9kZUtIUjsKKyAgICBQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSOworICAgIFBGTl92a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIgQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX3hsaWJfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBQRk5fdmtDcmVhdGVYbGliU3VyZmFjZUtIUiBDcmVhdGVYbGliU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl94Y2Jfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIFBGTl92a0NyZWF0ZVhjYlN1cmZhY2VLSFIgQ3JlYXRlWGNiU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfd2F5bGFuZF9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIFBGTl92a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2FuZHJvaWRfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBQRk5fdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiBDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX3dpbjMyX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiBDcmVhdGVXaW4zMlN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiBFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI7CisgICAgUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiBHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjsKKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX3JlcG9ydCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIENyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisgICAgUEZOX3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisgICAgUEZOX3ZrRGVidWdSZXBvcnRNZXNzYWdlRVhUIERlYnVnUmVwb3J0TWVzc2FnZUVYVDsKKworICAgIC8vIC0tLS0gVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgIFBGTl92a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIENyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKworICAgIC8vIC0tLS0gVktfTlZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WOworCisgICAgLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIFBGTl92a0NyZWF0ZVZpU3VyZmFjZU5OIENyZWF0ZVZpU3VyZmFjZU5OOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCisgICAgLy8gLS0tLSBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCBHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWDsKKworICAgIC8vIC0tLS0gVktfRVhUX2RpcmVjdF9tb2RlX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrUmVsZWFzZURpc3BsYXlFWFQgUmVsZWFzZURpc3BsYXlFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgUEZOX3ZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIEFjcXVpcmVYbGliRGlzcGxheUVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgIFBGTl92a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCBHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQ7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCisgICAgLy8gLS0tLSBWS19FWFRfZGlzcGxheV9zdXJmYWNlX2NvdW50ZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUOworCisgICAgLy8gLS0tLSBWS19NVktfaW9zX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyAgICBQRk5fdmtDcmVhdGVJT1NTdXJmYWNlTVZLIENyZWF0ZUlPU1N1cmZhY2VNVks7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworICAgIC8vIC0tLS0gVktfTVZLX21hY29zX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIFBGTl92a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyBDcmVhdGVNYWNPU1N1cmZhY2VNVks7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCisgICAgLy8gLS0tLSBWS19FWFRfZGVidWdfdXRpbHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCBDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgIFBGTl92a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIERlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgIFBGTl92a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIFN1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCBHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCBHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVDsKKworICAgIC8vIC0tLS0gVktfRlVDSFNJQV9pbWFnZXBpcGVfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorICAgIFBGTl92a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBIENyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKKyAgICAvLyAtLS0tIFZLX0VYVF9tZXRhbF9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyAgICBQRk5fdmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQgQ3JlYXRlTWV0YWxTdXJmYWNlRVhUOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworICAgIC8vIC0tLS0gVktfTlZfY29vcGVyYXRpdmVfbWF0cml4IGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVjsKKworICAgIC8vIC0tLS0gVktfTlZfY292ZXJhZ2VfcmVkdWN0aW9uX21vZGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WIEdldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVjsKKworICAgIC8vIC0tLS0gVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX2hlYWRsZXNzX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIENyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVDsKK30gVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZTsKKworLy8gRGV2aWNlIGZ1bmN0aW9uIHBvaW50ZXIgZGlzcGF0Y2ggdGFibGUKK3R5cGVkZWYgc3RydWN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlXyB7CisKKyAgICAvLyAtLS0tIENvcmUgMV8wIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgR2V0RGV2aWNlUHJvY0FkZHI7CisgICAgUEZOX3ZrRGVzdHJveURldmljZSBEZXN0cm95RGV2aWNlOworICAgIFBGTl92a0dldERldmljZVF1ZXVlIEdldERldmljZVF1ZXVlOworICAgIFBGTl92a1F1ZXVlU3VibWl0IFF1ZXVlU3VibWl0OworICAgIFBGTl92a1F1ZXVlV2FpdElkbGUgUXVldWVXYWl0SWRsZTsKKyAgICBQRk5fdmtEZXZpY2VXYWl0SWRsZSBEZXZpY2VXYWl0SWRsZTsKKyAgICBQRk5fdmtBbGxvY2F0ZU1lbW9yeSBBbGxvY2F0ZU1lbW9yeTsKKyAgICBQRk5fdmtGcmVlTWVtb3J5IEZyZWVNZW1vcnk7CisgICAgUEZOX3ZrTWFwTWVtb3J5IE1hcE1lbW9yeTsKKyAgICBQRk5fdmtVbm1hcE1lbW9yeSBVbm1hcE1lbW9yeTsKKyAgICBQRk5fdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyBGbHVzaE1hcHBlZE1lbW9yeVJhbmdlczsKKyAgICBQRk5fdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXM7CisgICAgUEZOX3ZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCBHZXREZXZpY2VNZW1vcnlDb21taXRtZW50OworICAgIFBGTl92a0JpbmRCdWZmZXJNZW1vcnkgQmluZEJ1ZmZlck1lbW9yeTsKKyAgICBQRk5fdmtCaW5kSW1hZ2VNZW1vcnkgQmluZEltYWdlTWVtb3J5OworICAgIFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHM7CisgICAgUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM7CisgICAgUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHM7CisgICAgUEZOX3ZrUXVldWVCaW5kU3BhcnNlIFF1ZXVlQmluZFNwYXJzZTsKKyAgICBQRk5fdmtDcmVhdGVGZW5jZSBDcmVhdGVGZW5jZTsKKyAgICBQRk5fdmtEZXN0cm95RmVuY2UgRGVzdHJveUZlbmNlOworICAgIFBGTl92a1Jlc2V0RmVuY2VzIFJlc2V0RmVuY2VzOworICAgIFBGTl92a0dldEZlbmNlU3RhdHVzIEdldEZlbmNlU3RhdHVzOworICAgIFBGTl92a1dhaXRGb3JGZW5jZXMgV2FpdEZvckZlbmNlczsKKyAgICBQRk5fdmtDcmVhdGVTZW1hcGhvcmUgQ3JlYXRlU2VtYXBob3JlOworICAgIFBGTl92a0Rlc3Ryb3lTZW1hcGhvcmUgRGVzdHJveVNlbWFwaG9yZTsKKyAgICBQRk5fdmtDcmVhdGVFdmVudCBDcmVhdGVFdmVudDsKKyAgICBQRk5fdmtEZXN0cm95RXZlbnQgRGVzdHJveUV2ZW50OworICAgIFBGTl92a0dldEV2ZW50U3RhdHVzIEdldEV2ZW50U3RhdHVzOworICAgIFBGTl92a1NldEV2ZW50IFNldEV2ZW50OworICAgIFBGTl92a1Jlc2V0RXZlbnQgUmVzZXRFdmVudDsKKyAgICBQRk5fdmtDcmVhdGVRdWVyeVBvb2wgQ3JlYXRlUXVlcnlQb29sOworICAgIFBGTl92a0Rlc3Ryb3lRdWVyeVBvb2wgRGVzdHJveVF1ZXJ5UG9vbDsKKyAgICBQRk5fdmtHZXRRdWVyeVBvb2xSZXN1bHRzIEdldFF1ZXJ5UG9vbFJlc3VsdHM7CisgICAgUEZOX3ZrQ3JlYXRlQnVmZmVyIENyZWF0ZUJ1ZmZlcjsKKyAgICBQRk5fdmtEZXN0cm95QnVmZmVyIERlc3Ryb3lCdWZmZXI7CisgICAgUEZOX3ZrQ3JlYXRlQnVmZmVyVmlldyBDcmVhdGVCdWZmZXJWaWV3OworICAgIFBGTl92a0Rlc3Ryb3lCdWZmZXJWaWV3IERlc3Ryb3lCdWZmZXJWaWV3OworICAgIFBGTl92a0NyZWF0ZUltYWdlIENyZWF0ZUltYWdlOworICAgIFBGTl92a0Rlc3Ryb3lJbWFnZSBEZXN0cm95SW1hZ2U7CisgICAgUEZOX3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCBHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0OworICAgIFBGTl92a0NyZWF0ZUltYWdlVmlldyBDcmVhdGVJbWFnZVZpZXc7CisgICAgUEZOX3ZrRGVzdHJveUltYWdlVmlldyBEZXN0cm95SW1hZ2VWaWV3OworICAgIFBGTl92a0NyZWF0ZVNoYWRlck1vZHVsZSBDcmVhdGVTaGFkZXJNb2R1bGU7CisgICAgUEZOX3ZrRGVzdHJveVNoYWRlck1vZHVsZSBEZXN0cm95U2hhZGVyTW9kdWxlOworICAgIFBGTl92a0NyZWF0ZVBpcGVsaW5lQ2FjaGUgQ3JlYXRlUGlwZWxpbmVDYWNoZTsKKyAgICBQRk5fdmtEZXN0cm95UGlwZWxpbmVDYWNoZSBEZXN0cm95UGlwZWxpbmVDYWNoZTsKKyAgICBQRk5fdmtHZXRQaXBlbGluZUNhY2hlRGF0YSBHZXRQaXBlbGluZUNhY2hlRGF0YTsKKyAgICBQRk5fdmtNZXJnZVBpcGVsaW5lQ2FjaGVzIE1lcmdlUGlwZWxpbmVDYWNoZXM7CisgICAgUEZOX3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM7CisgICAgUEZOX3ZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyBDcmVhdGVDb21wdXRlUGlwZWxpbmVzOworICAgIFBGTl92a0Rlc3Ryb3lQaXBlbGluZSBEZXN0cm95UGlwZWxpbmU7CisgICAgUEZOX3ZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQgQ3JlYXRlUGlwZWxpbmVMYXlvdXQ7CisgICAgUEZOX3ZrRGVzdHJveVBpcGVsaW5lTGF5b3V0IERlc3Ryb3lQaXBlbGluZUxheW91dDsKKyAgICBQRk5fdmtDcmVhdGVTYW1wbGVyIENyZWF0ZVNhbXBsZXI7CisgICAgUEZOX3ZrRGVzdHJveVNhbXBsZXIgRGVzdHJveVNhbXBsZXI7CisgICAgUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCBDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0OworICAgIFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0IERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0OworICAgIFBGTl92a0NyZWF0ZURlc2NyaXB0b3JQb29sIENyZWF0ZURlc2NyaXB0b3JQb29sOworICAgIFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCBEZXN0cm95RGVzY3JpcHRvclBvb2w7CisgICAgUEZOX3ZrUmVzZXREZXNjcmlwdG9yUG9vbCBSZXNldERlc2NyaXB0b3JQb29sOworICAgIFBGTl92a0FsbG9jYXRlRGVzY3JpcHRvclNldHMgQWxsb2NhdGVEZXNjcmlwdG9yU2V0czsKKyAgICBQRk5fdmtGcmVlRGVzY3JpcHRvclNldHMgRnJlZURlc2NyaXB0b3JTZXRzOworICAgIFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRzIFVwZGF0ZURlc2NyaXB0b3JTZXRzOworICAgIFBGTl92a0NyZWF0ZUZyYW1lYnVmZmVyIENyZWF0ZUZyYW1lYnVmZmVyOworICAgIFBGTl92a0Rlc3Ryb3lGcmFtZWJ1ZmZlciBEZXN0cm95RnJhbWVidWZmZXI7CisgICAgUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzcyBDcmVhdGVSZW5kZXJQYXNzOworICAgIFBGTl92a0Rlc3Ryb3lSZW5kZXJQYXNzIERlc3Ryb3lSZW5kZXJQYXNzOworICAgIFBGTl92a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSBHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHk7CisgICAgUEZOX3ZrQ3JlYXRlQ29tbWFuZFBvb2wgQ3JlYXRlQ29tbWFuZFBvb2w7CisgICAgUEZOX3ZrRGVzdHJveUNvbW1hbmRQb29sIERlc3Ryb3lDb21tYW5kUG9vbDsKKyAgICBQRk5fdmtSZXNldENvbW1hbmRQb29sIFJlc2V0Q29tbWFuZFBvb2w7CisgICAgUEZOX3ZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyBBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzOworICAgIFBGTl92a0ZyZWVDb21tYW5kQnVmZmVycyBGcmVlQ29tbWFuZEJ1ZmZlcnM7CisgICAgUEZOX3ZrQmVnaW5Db21tYW5kQnVmZmVyIEJlZ2luQ29tbWFuZEJ1ZmZlcjsKKyAgICBQRk5fdmtFbmRDb21tYW5kQnVmZmVyIEVuZENvbW1hbmRCdWZmZXI7CisgICAgUEZOX3ZrUmVzZXRDb21tYW5kQnVmZmVyIFJlc2V0Q29tbWFuZEJ1ZmZlcjsKKyAgICBQRk5fdmtDbWRCaW5kUGlwZWxpbmUgQ21kQmluZFBpcGVsaW5lOworICAgIFBGTl92a0NtZFNldFZpZXdwb3J0IENtZFNldFZpZXdwb3J0OworICAgIFBGTl92a0NtZFNldFNjaXNzb3IgQ21kU2V0U2Npc3NvcjsKKyAgICBQRk5fdmtDbWRTZXRMaW5lV2lkdGggQ21kU2V0TGluZVdpZHRoOworICAgIFBGTl92a0NtZFNldERlcHRoQmlhcyBDbWRTZXREZXB0aEJpYXM7CisgICAgUEZOX3ZrQ21kU2V0QmxlbmRDb25zdGFudHMgQ21kU2V0QmxlbmRDb25zdGFudHM7CisgICAgUEZOX3ZrQ21kU2V0RGVwdGhCb3VuZHMgQ21kU2V0RGVwdGhCb3VuZHM7CisgICAgUEZOX3ZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrIENtZFNldFN0ZW5jaWxDb21wYXJlTWFzazsKKyAgICBQRk5fdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrIENtZFNldFN0ZW5jaWxXcml0ZU1hc2s7CisgICAgUEZOX3ZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSBDbWRTZXRTdGVuY2lsUmVmZXJlbmNlOworICAgIFBGTl92a0NtZEJpbmREZXNjcmlwdG9yU2V0cyBDbWRCaW5kRGVzY3JpcHRvclNldHM7CisgICAgUEZOX3ZrQ21kQmluZEluZGV4QnVmZmVyIENtZEJpbmRJbmRleEJ1ZmZlcjsKKyAgICBQRk5fdmtDbWRCaW5kVmVydGV4QnVmZmVycyBDbWRCaW5kVmVydGV4QnVmZmVyczsKKyAgICBQRk5fdmtDbWREcmF3IENtZERyYXc7CisgICAgUEZOX3ZrQ21kRHJhd0luZGV4ZWQgQ21kRHJhd0luZGV4ZWQ7CisgICAgUEZOX3ZrQ21kRHJhd0luZGlyZWN0IENtZERyYXdJbmRpcmVjdDsKKyAgICBQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0IENtZERyYXdJbmRleGVkSW5kaXJlY3Q7CisgICAgUEZOX3ZrQ21kRGlzcGF0Y2ggQ21kRGlzcGF0Y2g7CisgICAgUEZOX3ZrQ21kRGlzcGF0Y2hJbmRpcmVjdCBDbWREaXNwYXRjaEluZGlyZWN0OworICAgIFBGTl92a0NtZENvcHlCdWZmZXIgQ21kQ29weUJ1ZmZlcjsKKyAgICBQRk5fdmtDbWRDb3B5SW1hZ2UgQ21kQ29weUltYWdlOworICAgIFBGTl92a0NtZEJsaXRJbWFnZSBDbWRCbGl0SW1hZ2U7CisgICAgUEZOX3ZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UgQ21kQ29weUJ1ZmZlclRvSW1hZ2U7CisgICAgUEZOX3ZrQ21kQ29weUltYWdlVG9CdWZmZXIgQ21kQ29weUltYWdlVG9CdWZmZXI7CisgICAgUEZOX3ZrQ21kVXBkYXRlQnVmZmVyIENtZFVwZGF0ZUJ1ZmZlcjsKKyAgICBQRk5fdmtDbWRGaWxsQnVmZmVyIENtZEZpbGxCdWZmZXI7CisgICAgUEZOX3ZrQ21kQ2xlYXJDb2xvckltYWdlIENtZENsZWFyQ29sb3JJbWFnZTsKKyAgICBQRk5fdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlIENtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2U7CisgICAgUEZOX3ZrQ21kQ2xlYXJBdHRhY2htZW50cyBDbWRDbGVhckF0dGFjaG1lbnRzOworICAgIFBGTl92a0NtZFJlc29sdmVJbWFnZSBDbWRSZXNvbHZlSW1hZ2U7CisgICAgUEZOX3ZrQ21kU2V0RXZlbnQgQ21kU2V0RXZlbnQ7CisgICAgUEZOX3ZrQ21kUmVzZXRFdmVudCBDbWRSZXNldEV2ZW50OworICAgIFBGTl92a0NtZFdhaXRFdmVudHMgQ21kV2FpdEV2ZW50czsKKyAgICBQRk5fdmtDbWRQaXBlbGluZUJhcnJpZXIgQ21kUGlwZWxpbmVCYXJyaWVyOworICAgIFBGTl92a0NtZEJlZ2luUXVlcnkgQ21kQmVnaW5RdWVyeTsKKyAgICBQRk5fdmtDbWRFbmRRdWVyeSBDbWRFbmRRdWVyeTsKKyAgICBQRk5fdmtDbWRSZXNldFF1ZXJ5UG9vbCBDbWRSZXNldFF1ZXJ5UG9vbDsKKyAgICBQRk5fdmtDbWRXcml0ZVRpbWVzdGFtcCBDbWRXcml0ZVRpbWVzdGFtcDsKKyAgICBQRk5fdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyBDbWRDb3B5UXVlcnlQb29sUmVzdWx0czsKKyAgICBQRk5fdmtDbWRQdXNoQ29uc3RhbnRzIENtZFB1c2hDb25zdGFudHM7CisgICAgUEZOX3ZrQ21kQmVnaW5SZW5kZXJQYXNzIENtZEJlZ2luUmVuZGVyUGFzczsKKyAgICBQRk5fdmtDbWROZXh0U3VicGFzcyBDbWROZXh0U3VicGFzczsKKyAgICBQRk5fdmtDbWRFbmRSZW5kZXJQYXNzIENtZEVuZFJlbmRlclBhc3M7CisgICAgUEZOX3ZrQ21kRXhlY3V0ZUNvbW1hbmRzIENtZEV4ZWN1dGVDb21tYW5kczsKKworICAgIC8vIC0tLS0gQ29yZSAxXzEgY29tbWFuZHMKKyAgICBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MiBCaW5kQnVmZmVyTWVtb3J5MjsKKyAgICBQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyIEJpbmRJbWFnZU1lbW9yeTI7CisgICAgUEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMgR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXM7CisgICAgUEZOX3ZrQ21kU2V0RGV2aWNlTWFzayBDbWRTZXREZXZpY2VNYXNrOworICAgIFBGTl92a0NtZERpc3BhdGNoQmFzZSBDbWREaXNwYXRjaEJhc2U7CisgICAgUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjsKKyAgICBQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czI7CisgICAgUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMjsKKyAgICBQRk5fdmtUcmltQ29tbWFuZFBvb2wgVHJpbUNvbW1hbmRQb29sOworICAgIFBGTl92a0dldERldmljZVF1ZXVlMiBHZXREZXZpY2VRdWV1ZTI7CisgICAgUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiBDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICAgIFBGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uIERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICAgIFBGTl92a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7CisgICAgUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlOworICAgIFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUgVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZTsKKyAgICBQRk5fdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydDsKKworICAgIC8vIC0tLS0gVktfS0hSX3N3YXBjaGFpbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVTd2FwY2hhaW5LSFIgQ3JlYXRlU3dhcGNoYWluS0hSOworICAgIFBGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFIgRGVzdHJveVN3YXBjaGFpbktIUjsKKyAgICBQRk5fdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIgR2V0U3dhcGNoYWluSW1hZ2VzS0hSOworICAgIFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIgQWNxdWlyZU5leHRJbWFnZUtIUjsKKyAgICBQRk5fdmtRdWV1ZVByZXNlbnRLSFIgUXVldWVQcmVzZW50S0hSOworICAgIFBGTl92a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiBHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI7CisgICAgUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUjsKKyAgICBQRk5fdmtBY3F1aXJlTmV4dEltYWdlMktIUiBBY3F1aXJlTmV4dEltYWdlMktIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2Rpc3BsYXlfc3dhcGNoYWluIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIgQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2RldmljZV9ncm91cCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiBHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUjsKKyAgICBQRk5fdmtDbWRTZXREZXZpY2VNYXNrS0hSIENtZFNldERldmljZU1hc2tLSFI7CisgICAgUEZOX3ZrQ21kRGlzcGF0Y2hCYXNlS0hSIENtZERpc3BhdGNoQmFzZUtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX21haW50ZW5hbmNlMSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtUcmltQ29tbWFuZFBvb2xLSFIgVHJpbUNvbW1hbmRQb29sS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiBHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiBHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldE1lbW9yeUZkS0hSIEdldE1lbW9yeUZkS0hSOworICAgIFBGTl92a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUiBHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0ltcG9ydFNlbWFwaG9yZUZkS0hSIEltcG9ydFNlbWFwaG9yZUZkS0hSOworICAgIFBGTl92a0dldFNlbWFwaG9yZUZkS0hSIEdldFNlbWFwaG9yZUZkS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfcHVzaF9kZXNjcmlwdG9yIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSOworICAgIFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSIENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUjsKKyAgICBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFI7CisgICAgUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiBVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZVJlbmRlclBhc3MyS0hSIENyZWF0ZVJlbmRlclBhc3MyS0hSOworICAgIFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIgQ21kQmVnaW5SZW5kZXJQYXNzMktIUjsKKyAgICBQRk5fdmtDbWROZXh0U3VicGFzczJLSFIgQ21kTmV4dFN1YnBhc3MyS0hSOworICAgIFBGTl92a0NtZEVuZFJlbmRlclBhc3MyS0hSIENtZEVuZFJlbmRlclBhc3MyS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFN3YXBjaGFpblN0YXR1c0tIUiBHZXRTd2FwY2hhaW5TdGF0dXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV93aW4zMiBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiBJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiBHZXRGZW5jZVdpbjMySGFuZGxlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0ltcG9ydEZlbmNlRmRLSFIgSW1wb3J0RmVuY2VGZEtIUjsKKyAgICBQRk5fdmtHZXRGZW5jZUZkS0hSIEdldEZlbmNlRmRLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9wZXJmb3JtYW5jZV9xdWVyeSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiBBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUjsKKyAgICBQRk5fdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiBSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSOworICAgIFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIgR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKKyAgICBQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUjsKKyAgICBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiBEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2JpbmRfbWVtb3J5MiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MktIUiBCaW5kQnVmZmVyTWVtb3J5MktIUjsKKyAgICBQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyS0hSIEJpbmRJbWFnZU1lbW9yeTJLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9tYWludGVuYW5jZTMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIgR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50IGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NtZERyYXdJbmRpcmVjdENvdW50S0hSIENtZERyYXdJbmRpcmVjdENvdW50S0hSOworICAgIFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiBDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSIEdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUjsKKyAgICBQRk5fdmtXYWl0U2VtYXBob3Jlc0tIUiBXYWl0U2VtYXBob3Jlc0tIUjsKKyAgICBQRk5fdmtTaWduYWxTZW1hcGhvcmVLSFIgU2lnbmFsU2VtYXBob3JlS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjsKKyAgICBQRk5fdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIEdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFI7CisgICAgUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z19tYXJrZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQgRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQ7CisgICAgUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIERlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVDsKKyAgICBQRk5fdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUIENtZERlYnVnTWFya2VyQmVnaW5FWFQ7CisgICAgUEZOX3ZrQ21kRGVidWdNYXJrZXJFbmRFWFQgQ21kRGVidWdNYXJrZXJFbmRFWFQ7CisgICAgUEZOX3ZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQgQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCBDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUOworICAgIFBGTl92a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQgQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVDsKKyAgICBQRk5fdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCBDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVDsKKyAgICBQRk5fdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCBDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVDsKKyAgICBQRk5fdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQgQ21kRW5kUXVlcnlJbmRleGVkRVhUOworICAgIFBGTl92a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCBDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQ7CisKKyAgICAvLyAtLS0tIFZLX05WWF9pbWFnZV92aWV3X2hhbmRsZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlggR2V0SW1hZ2VWaWV3SGFuZGxlTlZYOworCisgICAgLy8gLS0tLSBWS19BTURfZHJhd19pbmRpcmVjdF9jb3VudCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCBDbWREcmF3SW5kaXJlY3RDb3VudEFNRDsKKyAgICBQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EOworCisgICAgLy8gLS0tLSBWS19BTURfc2hhZGVyX2luZm8gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0U2hhZGVySW5mb0FNRCBHZXRTaGFkZXJJbmZvQU1EOworCisgICAgLy8gLS0tLSBWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlTlYgR2V0TWVtb3J5V2luMzJIYW5kbGVOVjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0VYVF9jb25kaXRpb25hbF9yZW5kZXJpbmcgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCBDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUOworICAgIFBGTl92a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIENtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUOworCisgICAgLy8gLS0tLSBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRQcm9jZXNzQ29tbWFuZHNOVlggQ21kUHJvY2Vzc0NvbW1hbmRzTlZYOworICAgIFBGTl92a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIENtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYOworICAgIFBGTl92a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKyAgICBQRk5fdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKyAgICBQRk5fdmtDcmVhdGVPYmplY3RUYWJsZU5WWCBDcmVhdGVPYmplY3RUYWJsZU5WWDsKKyAgICBQRk5fdmtEZXN0cm95T2JqZWN0VGFibGVOVlggRGVzdHJveU9iamVjdFRhYmxlTlZYOworICAgIFBGTl92a1JlZ2lzdGVyT2JqZWN0c05WWCBSZWdpc3Rlck9iamVjdHNOVlg7CisgICAgUEZOX3ZrVW5yZWdpc3Rlck9iamVjdHNOVlggVW5yZWdpc3Rlck9iamVjdHNOVlg7CisKKyAgICAvLyAtLS0tIFZLX05WX2NsaXBfc3BhY2Vfd19zY2FsaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViBDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlY7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNwbGF5X2NvbnRyb2wgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCBEaXNwbGF5UG93ZXJDb250cm9sRVhUOworICAgIFBGTl92a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQgUmVnaXN0ZXJEZXZpY2VFdmVudEVYVDsKKyAgICBQRk5fdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCBSZWdpc3RlckRpc3BsYXlFdmVudEVYVDsKKyAgICBQRk5fdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIEdldFN3YXBjaGFpbkNvdW50ZXJFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0dPT0dMRV9kaXNwbGF5X3RpbWluZyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSBHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRTsKKyAgICBQRk5fdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFIEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEU7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNjYXJkX3JlY3RhbmdsZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCBDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfaGRyX21ldGFkYXRhIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a1NldEhkck1ldGFkYXRhRVhUIFNldEhkck1ldGFkYXRhRVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfZGVidWdfdXRpbHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQ7CisgICAgUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCBTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUOworICAgIFBGTl92a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVDsKKyAgICBQRk5fdmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCBRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVDsKKyAgICBQRk5fdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCBRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVDsKKyAgICBQRk5fdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCBDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVDsKKyAgICBQRk5fdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUOworICAgIFBGTl92a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCBDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIFBGTl92a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIEdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIFBGTl92a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQgR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUIENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF92YWxpZGF0aW9uX2NhY2hlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCBDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQ7CisgICAgUEZOX3ZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCBEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUOworICAgIFBGTl92a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCBNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQ7CisgICAgUEZOX3ZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCBHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUOworCisgICAgLy8gLS0tLSBWS19OVl9zaGFkaW5nX3JhdGVfaW1hZ2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViBDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WOworICAgIFBGTl92a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYgQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVjsKKyAgICBQRk5fdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WIENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlY7CisKKyAgICAvLyAtLS0tIFZLX05WX3JheV90cmFjaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgIFBGTl92a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7CisgICAgUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY7CisgICAgUEZOX3ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVjsKKyAgICBQRk5fdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7CisgICAgUEZOX3ZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICBQRk5fdmtDbWRUcmFjZVJheXNOViBDbWRUcmFjZVJheXNOVjsKKyAgICBQRk5fdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYgQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WOworICAgIFBGTl92a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViBHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlY7CisgICAgUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYgR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlY7CisgICAgUEZOX3ZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIENtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVjsKKyAgICBQRk5fdmtDb21waWxlRGVmZXJyZWROViBDb21waWxlRGVmZXJyZWROVjsKKworICAgIC8vIC0tLS0gVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0IGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCBHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0FNRF9idWZmZXJfbWFya2VyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EIENtZFdyaXRlQnVmZmVyTWFya2VyQU1EOworCisgICAgLy8gLS0tLSBWS19FWFRfY2FsaWJyYXRlZF90aW1lc3RhbXBzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUIEdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUOworCisgICAgLy8gLS0tLSBWS19OVl9tZXNoX3NoYWRlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWREcmF3TWVzaFRhc2tzTlYgQ21kRHJhd01lc2hUYXNrc05WOworICAgIFBGTl92a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WIENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WOworICAgIFBGTl92a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYgQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVjsKKworICAgIC8vIC0tLS0gVktfTlZfc2Npc3Nvcl9leGNsdXNpdmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WIENtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjsKKworICAgIC8vIC0tLS0gVktfTlZfZGV2aWNlX2RpYWdub3N0aWNfY2hlY2twb2ludHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kU2V0Q2hlY2twb2ludE5WIENtZFNldENoZWNrcG9pbnROVjsKKyAgICBQRk5fdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYgR2V0UXVldWVDaGVja3BvaW50RGF0YU5WOworCisgICAgLy8gLS0tLSBWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCBJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTDsKKyAgICBQRk5fdmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIFVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUw7CisgICAgUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCBDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMOworICAgIFBGTl92a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwgQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTDsKKyAgICBQRk5fdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwgQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMOworICAgIFBGTl92a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw7CisgICAgUEZOX3ZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsKKyAgICBQRk5fdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIFF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw7CisgICAgUEZOX3ZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCBHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMOworCisgICAgLy8gLS0tLSBWS19BTURfZGlzcGxheV9uYXRpdmVfaGRyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a1NldExvY2FsRGltbWluZ0FNRCBTZXRMb2NhbERpbW1pbmdBTUQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCBHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIFJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0VYVF9saW5lX3Jhc3Rlcml6YXRpb24gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kU2V0TGluZVN0aXBwbGVFWFQgQ21kU2V0TGluZVN0aXBwbGVFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9ob3N0X3F1ZXJ5X3Jlc2V0IGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a1Jlc2V0UXVlcnlQb29sRVhUIFJlc2V0UXVlcnlQb29sRVhUOworfSBWa0xheWVyRGlzcGF0Y2hUYWJsZTsKKworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2dlbmVyYXRlZC92a19sb2FkZXJfZXh0ZW5zaW9ucy5jIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9nZW5lcmF0ZWQvdmtfbG9hZGVyX2V4dGVuc2lvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmUwMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9nZW5lcmF0ZWQvdmtfbG9hZGVyX2V4dGVuc2lvbnMuYwpAQCAtMCwwICsxLDQ1NTYgQEAKKy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqCisvLyBTZWUgbG9hZGVyX2V4dGVuc2lvbl9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMKKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBZb3VuZyA8bWFya3lAbHVuYXJnLmNvbT4KKyAqLworCisjaWZuZGVmIF9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInZrX2xvYWRlcl9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImxvYWRlci5oIgorI2luY2x1ZGUgInZrX2xvYWRlcl9leHRlbnNpb25zLmgiCisjaW5jbHVkZSA8dnVsa2FuL3ZrX2ljZC5oPgorI2luY2x1ZGUgIndzaS5oIgorI2luY2x1ZGUgImRlYnVnX3V0aWxzLmgiCisjaW5jbHVkZSAiZXh0ZW5zaW9uX21hbnVhbC5oIgorCisvLyBEZXZpY2UgZXh0ZW5zaW9uIGVycm9yIGZ1bmN0aW9uCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtEZXZFeHRFcnJvcihWa0RldmljZSBkZXYpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZm91bmRfZGV2OworICAgIC8vIFRoZSBkZXZpY2UgZ29pbmcgaW4gaXMgYSB0cmFtcG9saW5lIGRldmljZQorICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gbG9hZGVyX2dldF9pY2RfYW5kX2RldmljZShkZXYsICZmb3VuZF9kZXYsIE5VTEwpOworCisgICAgaWYgKGljZF90ZXJtKQorICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiQmFkIGRlc3RpbmF0aW9uIGluIGxvYWRlciB0cmFtcG9saW5lIGRpc3BhdGNoLCIKKyAgICAgICAgICAgICAgICAgICAiQXJlIGxheWVycyBhbmQgZXh0ZW5zaW9ucyB0aGF0IHlvdSBhcmUgY2FsbGluZyBlbmFibGVkPyIpOworICAgIHJldHVybiBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQ7Cit9CisKK1ZLQVBJX0FUVFIgYm9vbCBWS0FQSV9DQUxMIGxvYWRlcl9pY2RfaW5pdF9lbnRyaWVzKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtLCBWa0luc3RhbmNlIGluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwX2dpcGEpIHsKKworI2RlZmluZSBMT09LVVBfR0lQQShmdW5jLCByZXF1aXJlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5mdW5jID0gKFBGTl92ayMjZnVuYylmcF9naXBhKGluc3QsICJ2ayIgI2Z1bmMpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWljZF90ZXJtLT5kaXNwYXRjaC5mdW5jICYmIHJlcXVpcmVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxvYWRlcl9sb2coKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLCBcCisgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzX2Vycm9yKCJ2ayIgI2Z1bmMpKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworCisgICAgLy8gLS0tLSBDb3JlIDFfMAorICAgIExPT0tVUF9HSVBBKERlc3Ryb3lJbnN0YW5jZSwgdHJ1ZSk7CisgICAgTE9PS1VQX0dJUEEoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzLCB0cnVlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzLCB0cnVlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMsIHRydWUpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCB0cnVlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMsIHRydWUpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLCB0cnVlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMsIHRydWUpOworICAgIExPT0tVUF9HSVBBKEdldERldmljZVByb2NBZGRyLCB0cnVlKTsKKyAgICBMT09LVVBfR0lQQShDcmVhdGVEZXZpY2UsIHRydWUpOworICAgIExPT0tVUF9HSVBBKEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMsIHRydWUpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCB0cnVlKTsKKworICAgIC8vIC0tLS0gQ29yZSAxXzEKKyAgICBMT09LVVBfR0lQQShFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcywgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfS0hSX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoRGVzdHJveVN1cmZhY2VLSFIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiwgZmFsc2UpOworCisgICAgLy8gLS0tLSBWS19LSFJfc3dhcGNoYWluIGV4dGVuc2lvbiBjb21tYW5kcworICAgIExPT0tVUF9HSVBBKENyZWF0ZVN3YXBjaGFpbktIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfS0hSX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlRGlzcGxheU1vZGVLSFIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSLCBmYWxzZSk7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kaXNwbGF5X3N3YXBjaGFpbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBMT09LVVBfR0lQQShDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLCBmYWxzZSk7CisKKyAgICAvLyAtLS0tIFZLX0tIUl94bGliX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlWGxpYlN1cmZhY2VLSFIsIGZhbHNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSLCBmYWxzZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl94Y2Jfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIExPT0tVUF9HSVBBKENyZWF0ZVhjYlN1cmZhY2VLSFIsIGZhbHNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSLCBmYWxzZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX3dheWxhbmRfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICBMT09LVVBfR0lQQShDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiwgZmFsc2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIsIGZhbHNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2FuZHJvaWRfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBMT09LVVBfR0lQQShDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiwgZmFsc2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfd2luMzJfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlV2luMzJTdXJmYWNlS0hSLCBmYWxzZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiwgZmFsc2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBMT09LVVBfR0lQQShFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiwgZmFsc2UpOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiwgZmFsc2UpOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiwgZmFsc2UpOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIExPT0tVUF9HSVBBKEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiwgZmFsc2UpOworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfS0hSX2dldF9kaXNwbGF5X3Byb3BlcnRpZXMyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSLCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSLCBmYWxzZSk7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z19yZXBvcnQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKERlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoRGVidWdSZXBvcnRNZXNzYWdlRVhULCBmYWxzZSk7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z19tYXJrZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgIExPT0tVUF9HSVBBKENyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQLCBmYWxzZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCisgICAgLy8gLS0tLSBWS19OVl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViwgZmFsc2UpOworCisgICAgLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIExPT0tVUF9HSVBBKENyZWF0ZVZpU3VyZmFjZU5OLCBmYWxzZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKKyAgICAvLyAtLS0tIFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIExPT0tVUF9HSVBBKEdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYLCBmYWxzZSk7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXJlY3RfbW9kZV9kaXNwbGF5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIExPT0tVUF9HSVBBKFJlbGVhc2VEaXNwbGF5RVhULCBmYWxzZSk7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgTE9PS1VQX0dJUEEoQWNxdWlyZVhsaWJEaXNwbGF5RVhULCBmYWxzZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICBMT09LVVBfR0lQQShHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQsIGZhbHNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULCBmYWxzZSk7CisKKyAgICAvLyAtLS0tIFZLX01WS19pb3Nfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgIExPT0tVUF9HSVBBKENyZWF0ZUlPU1N1cmZhY2VNVkssIGZhbHNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisgICAgLy8gLS0tLSBWS19NVktfbWFjb3Nfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlTWFjT1NTdXJmYWNlTVZLLCBmYWxzZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCisgICAgLy8gLS0tLSBWS19FWFRfZGVidWdfdXRpbHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQsIGZhbHNlKTsKKyAgICBMT09LVVBfR0lQQShTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhULCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCwgZmFsc2UpOworICAgIExPT0tVUF9HSVBBKERlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULCBmYWxzZSk7CisgICAgTE9PS1VQX0dJUEEoU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCwgZmFsc2UpOworCisgICAgLy8gLS0tLSBWS19GVUNIU0lBX2ltYWdlcGlwZV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEsIGZhbHNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisgICAgLy8gLS0tLSBWS19FWFRfbWV0YWxfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlTWV0YWxTdXJmYWNlRVhULCBmYWxzZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCisgICAgLy8gLS0tLSBWS19OVl9jb29wZXJhdGl2ZV9tYXRyaXggZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViwgZmFsc2UpOworCisgICAgLy8gLS0tLSBWS19OVl9jb3ZlcmFnZV9yZWR1Y3Rpb25fbW9kZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBMT09LVVBfR0lQQShHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYsIGZhbHNlKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgTE9PS1VQX0dJUEEoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCwgZmFsc2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgTE9PS1VQX0dJUEEoR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCwgZmFsc2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX2hlYWRsZXNzX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgTE9PS1VQX0dJUEEoQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhULCBmYWxzZSk7CisKKyN1bmRlZiBMT09LVVBfR0lQQQorCisgICAgcmV0dXJuIHRydWU7Cit9OworCisvLyBJbml0IERldmljZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlIHdpdGggY29yZSBjb21tYW5kcworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgbG9hZGVyX2luaXRfZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKHN0cnVjdCBsb2FkZXJfZGV2X2Rpc3BhdGNoX3RhYmxlICpkZXZfdGFibGUsIFBGTl92a0dldERldmljZVByb2NBZGRyIGdwYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZSBkZXYpIHsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqdGFibGUgPSAmZGV2X3RhYmxlLT5jb3JlX2Rpc3BhdGNoOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1VOS05PV05fRVhUUzsgaSsrKSBkZXZfdGFibGUtPmV4dF9kaXNwYXRjaC5kZXZfZXh0W2ldID0gKFBGTl92a0RldkV4dCl2a0RldkV4dEVycm9yOworCisgICAgLy8gLS0tLSBDb3JlIDFfMCBjb21tYW5kcworICAgIHRhYmxlLT5HZXREZXZpY2VQcm9jQWRkciA9IGdwYTsKKyAgICB0YWJsZS0+RGVzdHJveURldmljZSA9IChQRk5fdmtEZXN0cm95RGV2aWNlKWdwYShkZXYsICJ2a0Rlc3Ryb3lEZXZpY2UiKTsKKyAgICB0YWJsZS0+R2V0RGV2aWNlUXVldWUgPSAoUEZOX3ZrR2V0RGV2aWNlUXVldWUpZ3BhKGRldiwgInZrR2V0RGV2aWNlUXVldWUiKTsKKyAgICB0YWJsZS0+UXVldWVTdWJtaXQgPSAoUEZOX3ZrUXVldWVTdWJtaXQpZ3BhKGRldiwgInZrUXVldWVTdWJtaXQiKTsKKyAgICB0YWJsZS0+UXVldWVXYWl0SWRsZSA9IChQRk5fdmtRdWV1ZVdhaXRJZGxlKWdwYShkZXYsICJ2a1F1ZXVlV2FpdElkbGUiKTsKKyAgICB0YWJsZS0+RGV2aWNlV2FpdElkbGUgPSAoUEZOX3ZrRGV2aWNlV2FpdElkbGUpZ3BhKGRldiwgInZrRGV2aWNlV2FpdElkbGUiKTsKKyAgICB0YWJsZS0+QWxsb2NhdGVNZW1vcnkgPSAoUEZOX3ZrQWxsb2NhdGVNZW1vcnkpZ3BhKGRldiwgInZrQWxsb2NhdGVNZW1vcnkiKTsKKyAgICB0YWJsZS0+RnJlZU1lbW9yeSA9IChQRk5fdmtGcmVlTWVtb3J5KWdwYShkZXYsICJ2a0ZyZWVNZW1vcnkiKTsKKyAgICB0YWJsZS0+TWFwTWVtb3J5ID0gKFBGTl92a01hcE1lbW9yeSlncGEoZGV2LCAidmtNYXBNZW1vcnkiKTsKKyAgICB0YWJsZS0+VW5tYXBNZW1vcnkgPSAoUEZOX3ZrVW5tYXBNZW1vcnkpZ3BhKGRldiwgInZrVW5tYXBNZW1vcnkiKTsKKyAgICB0YWJsZS0+Rmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgPSAoUEZOX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMpZ3BhKGRldiwgInZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiKTsKKyAgICB0YWJsZS0+SW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyA9IChQRk5fdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKWdwYShkZXYsICJ2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMiKTsKKyAgICB0YWJsZS0+R2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCA9IChQRk5fdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KWdwYShkZXYsICJ2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQiKTsKKyAgICB0YWJsZS0+QmluZEJ1ZmZlck1lbW9yeSA9IChQRk5fdmtCaW5kQnVmZmVyTWVtb3J5KWdwYShkZXYsICJ2a0JpbmRCdWZmZXJNZW1vcnkiKTsKKyAgICB0YWJsZS0+QmluZEltYWdlTWVtb3J5ID0gKFBGTl92a0JpbmRJbWFnZU1lbW9yeSlncGEoZGV2LCAidmtCaW5kSW1hZ2VNZW1vcnkiKTsKKyAgICB0YWJsZS0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzID0gKFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cylncGEoZGV2LCAidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMiKTsKKyAgICB0YWJsZS0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgPSAoUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMpZ3BhKGRldiwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMiKTsKKyAgICB0YWJsZS0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgPSAoUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpZ3BhKGRldiwgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiKTsKKyAgICB0YWJsZS0+UXVldWVCaW5kU3BhcnNlID0gKFBGTl92a1F1ZXVlQmluZFNwYXJzZSlncGEoZGV2LCAidmtRdWV1ZUJpbmRTcGFyc2UiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRmVuY2UgPSAoUEZOX3ZrQ3JlYXRlRmVuY2UpZ3BhKGRldiwgInZrQ3JlYXRlRmVuY2UiKTsKKyAgICB0YWJsZS0+RGVzdHJveUZlbmNlID0gKFBGTl92a0Rlc3Ryb3lGZW5jZSlncGEoZGV2LCAidmtEZXN0cm95RmVuY2UiKTsKKyAgICB0YWJsZS0+UmVzZXRGZW5jZXMgPSAoUEZOX3ZrUmVzZXRGZW5jZXMpZ3BhKGRldiwgInZrUmVzZXRGZW5jZXMiKTsKKyAgICB0YWJsZS0+R2V0RmVuY2VTdGF0dXMgPSAoUEZOX3ZrR2V0RmVuY2VTdGF0dXMpZ3BhKGRldiwgInZrR2V0RmVuY2VTdGF0dXMiKTsKKyAgICB0YWJsZS0+V2FpdEZvckZlbmNlcyA9IChQRk5fdmtXYWl0Rm9yRmVuY2VzKWdwYShkZXYsICJ2a1dhaXRGb3JGZW5jZXMiKTsKKyAgICB0YWJsZS0+Q3JlYXRlU2VtYXBob3JlID0gKFBGTl92a0NyZWF0ZVNlbWFwaG9yZSlncGEoZGV2LCAidmtDcmVhdGVTZW1hcGhvcmUiKTsKKyAgICB0YWJsZS0+RGVzdHJveVNlbWFwaG9yZSA9IChQRk5fdmtEZXN0cm95U2VtYXBob3JlKWdwYShkZXYsICJ2a0Rlc3Ryb3lTZW1hcGhvcmUiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRXZlbnQgPSAoUEZOX3ZrQ3JlYXRlRXZlbnQpZ3BhKGRldiwgInZrQ3JlYXRlRXZlbnQiKTsKKyAgICB0YWJsZS0+RGVzdHJveUV2ZW50ID0gKFBGTl92a0Rlc3Ryb3lFdmVudClncGEoZGV2LCAidmtEZXN0cm95RXZlbnQiKTsKKyAgICB0YWJsZS0+R2V0RXZlbnRTdGF0dXMgPSAoUEZOX3ZrR2V0RXZlbnRTdGF0dXMpZ3BhKGRldiwgInZrR2V0RXZlbnRTdGF0dXMiKTsKKyAgICB0YWJsZS0+U2V0RXZlbnQgPSAoUEZOX3ZrU2V0RXZlbnQpZ3BhKGRldiwgInZrU2V0RXZlbnQiKTsKKyAgICB0YWJsZS0+UmVzZXRFdmVudCA9IChQRk5fdmtSZXNldEV2ZW50KWdwYShkZXYsICJ2a1Jlc2V0RXZlbnQiKTsKKyAgICB0YWJsZS0+Q3JlYXRlUXVlcnlQb29sID0gKFBGTl92a0NyZWF0ZVF1ZXJ5UG9vbClncGEoZGV2LCAidmtDcmVhdGVRdWVyeVBvb2wiKTsKKyAgICB0YWJsZS0+RGVzdHJveVF1ZXJ5UG9vbCA9IChQRk5fdmtEZXN0cm95UXVlcnlQb29sKWdwYShkZXYsICJ2a0Rlc3Ryb3lRdWVyeVBvb2wiKTsKKyAgICB0YWJsZS0+R2V0UXVlcnlQb29sUmVzdWx0cyA9IChQRk5fdmtHZXRRdWVyeVBvb2xSZXN1bHRzKWdwYShkZXYsICJ2a0dldFF1ZXJ5UG9vbFJlc3VsdHMiKTsKKyAgICB0YWJsZS0+Q3JlYXRlQnVmZmVyID0gKFBGTl92a0NyZWF0ZUJ1ZmZlcilncGEoZGV2LCAidmtDcmVhdGVCdWZmZXIiKTsKKyAgICB0YWJsZS0+RGVzdHJveUJ1ZmZlciA9IChQRk5fdmtEZXN0cm95QnVmZmVyKWdwYShkZXYsICJ2a0Rlc3Ryb3lCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlQnVmZmVyVmlldyA9IChQRk5fdmtDcmVhdGVCdWZmZXJWaWV3KWdwYShkZXYsICJ2a0NyZWF0ZUJ1ZmZlclZpZXciKTsKKyAgICB0YWJsZS0+RGVzdHJveUJ1ZmZlclZpZXcgPSAoUEZOX3ZrRGVzdHJveUJ1ZmZlclZpZXcpZ3BhKGRldiwgInZrRGVzdHJveUJ1ZmZlclZpZXciKTsKKyAgICB0YWJsZS0+Q3JlYXRlSW1hZ2UgPSAoUEZOX3ZrQ3JlYXRlSW1hZ2UpZ3BhKGRldiwgInZrQ3JlYXRlSW1hZ2UiKTsKKyAgICB0YWJsZS0+RGVzdHJveUltYWdlID0gKFBGTl92a0Rlc3Ryb3lJbWFnZSlncGEoZGV2LCAidmtEZXN0cm95SW1hZ2UiKTsKKyAgICB0YWJsZS0+R2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCA9IChQRk5fdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KWdwYShkZXYsICJ2a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQiKTsKKyAgICB0YWJsZS0+Q3JlYXRlSW1hZ2VWaWV3ID0gKFBGTl92a0NyZWF0ZUltYWdlVmlldylncGEoZGV2LCAidmtDcmVhdGVJbWFnZVZpZXciKTsKKyAgICB0YWJsZS0+RGVzdHJveUltYWdlVmlldyA9IChQRk5fdmtEZXN0cm95SW1hZ2VWaWV3KWdwYShkZXYsICJ2a0Rlc3Ryb3lJbWFnZVZpZXciKTsKKyAgICB0YWJsZS0+Q3JlYXRlU2hhZGVyTW9kdWxlID0gKFBGTl92a0NyZWF0ZVNoYWRlck1vZHVsZSlncGEoZGV2LCAidmtDcmVhdGVTaGFkZXJNb2R1bGUiKTsKKyAgICB0YWJsZS0+RGVzdHJveVNoYWRlck1vZHVsZSA9IChQRk5fdmtEZXN0cm95U2hhZGVyTW9kdWxlKWdwYShkZXYsICJ2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUiKTsKKyAgICB0YWJsZS0+Q3JlYXRlUGlwZWxpbmVDYWNoZSA9IChQRk5fdmtDcmVhdGVQaXBlbGluZUNhY2hlKWdwYShkZXYsICJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiKTsKKyAgICB0YWJsZS0+RGVzdHJveVBpcGVsaW5lQ2FjaGUgPSAoUEZOX3ZrRGVzdHJveVBpcGVsaW5lQ2FjaGUpZ3BhKGRldiwgInZrRGVzdHJveVBpcGVsaW5lQ2FjaGUiKTsKKyAgICB0YWJsZS0+R2V0UGlwZWxpbmVDYWNoZURhdGEgPSAoUEZOX3ZrR2V0UGlwZWxpbmVDYWNoZURhdGEpZ3BhKGRldiwgInZrR2V0UGlwZWxpbmVDYWNoZURhdGEiKTsKKyAgICB0YWJsZS0+TWVyZ2VQaXBlbGluZUNhY2hlcyA9IChQRk5fdmtNZXJnZVBpcGVsaW5lQ2FjaGVzKWdwYShkZXYsICJ2a01lcmdlUGlwZWxpbmVDYWNoZXMiKTsKKyAgICB0YWJsZS0+Q3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgPSAoUEZOX3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMpZ3BhKGRldiwgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiKTsKKyAgICB0YWJsZS0+Q3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyA9IChQRk5fdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKWdwYShkZXYsICJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiKTsKKyAgICB0YWJsZS0+RGVzdHJveVBpcGVsaW5lID0gKFBGTl92a0Rlc3Ryb3lQaXBlbGluZSlncGEoZGV2LCAidmtEZXN0cm95UGlwZWxpbmUiKTsKKyAgICB0YWJsZS0+Q3JlYXRlUGlwZWxpbmVMYXlvdXQgPSAoUEZOX3ZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQpZ3BhKGRldiwgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiKTsKKyAgICB0YWJsZS0+RGVzdHJveVBpcGVsaW5lTGF5b3V0ID0gKFBGTl92a0Rlc3Ryb3lQaXBlbGluZUxheW91dClncGEoZGV2LCAidmtEZXN0cm95UGlwZWxpbmVMYXlvdXQiKTsKKyAgICB0YWJsZS0+Q3JlYXRlU2FtcGxlciA9IChQRk5fdmtDcmVhdGVTYW1wbGVyKWdwYShkZXYsICJ2a0NyZWF0ZVNhbXBsZXIiKTsKKyAgICB0YWJsZS0+RGVzdHJveVNhbXBsZXIgPSAoUEZOX3ZrRGVzdHJveVNhbXBsZXIpZ3BhKGRldiwgInZrRGVzdHJveVNhbXBsZXIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRGVzY3JpcHRvclNldExheW91dCA9IChQRk5fdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KWdwYShkZXYsICJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQgPSAoUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQpZ3BhKGRldiwgInZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRGVzY3JpcHRvclBvb2wgPSAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclBvb2wpZ3BhKGRldiwgInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JQb29sID0gKFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbClncGEoZGV2LCAidmtEZXN0cm95RGVzY3JpcHRvclBvb2wiKTsKKyAgICB0YWJsZS0+UmVzZXREZXNjcmlwdG9yUG9vbCA9IChQRk5fdmtSZXNldERlc2NyaXB0b3JQb29sKWdwYShkZXYsICJ2a1Jlc2V0RGVzY3JpcHRvclBvb2wiKTsKKyAgICB0YWJsZS0+QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyA9IChQRk5fdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKWdwYShkZXYsICJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiKTsKKyAgICB0YWJsZS0+RnJlZURlc2NyaXB0b3JTZXRzID0gKFBGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cylncGEoZGV2LCAidmtGcmVlRGVzY3JpcHRvclNldHMiKTsKKyAgICB0YWJsZS0+VXBkYXRlRGVzY3JpcHRvclNldHMgPSAoUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldHMpZ3BhKGRldiwgInZrVXBkYXRlRGVzY3JpcHRvclNldHMiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRnJhbWVidWZmZXIgPSAoUEZOX3ZrQ3JlYXRlRnJhbWVidWZmZXIpZ3BhKGRldiwgInZrQ3JlYXRlRnJhbWVidWZmZXIiKTsKKyAgICB0YWJsZS0+RGVzdHJveUZyYW1lYnVmZmVyID0gKFBGTl92a0Rlc3Ryb3lGcmFtZWJ1ZmZlcilncGEoZGV2LCAidmtEZXN0cm95RnJhbWVidWZmZXIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlUmVuZGVyUGFzcyA9IChQRk5fdmtDcmVhdGVSZW5kZXJQYXNzKWdwYShkZXYsICJ2a0NyZWF0ZVJlbmRlclBhc3MiKTsKKyAgICB0YWJsZS0+RGVzdHJveVJlbmRlclBhc3MgPSAoUEZOX3ZrRGVzdHJveVJlbmRlclBhc3MpZ3BhKGRldiwgInZrRGVzdHJveVJlbmRlclBhc3MiKTsKKyAgICB0YWJsZS0+R2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5ID0gKFBGTl92a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSlncGEoZGV2LCAidmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiKTsKKyAgICB0YWJsZS0+Q3JlYXRlQ29tbWFuZFBvb2wgPSAoUEZOX3ZrQ3JlYXRlQ29tbWFuZFBvb2wpZ3BhKGRldiwgInZrQ3JlYXRlQ29tbWFuZFBvb2wiKTsKKyAgICB0YWJsZS0+RGVzdHJveUNvbW1hbmRQb29sID0gKFBGTl92a0Rlc3Ryb3lDb21tYW5kUG9vbClncGEoZGV2LCAidmtEZXN0cm95Q29tbWFuZFBvb2wiKTsKKyAgICB0YWJsZS0+UmVzZXRDb21tYW5kUG9vbCA9IChQRk5fdmtSZXNldENvbW1hbmRQb29sKWdwYShkZXYsICJ2a1Jlc2V0Q29tbWFuZFBvb2wiKTsKKyAgICB0YWJsZS0+QWxsb2NhdGVDb21tYW5kQnVmZmVycyA9IChQRk5fdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKWdwYShkZXYsICJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiKTsKKyAgICB0YWJsZS0+RnJlZUNvbW1hbmRCdWZmZXJzID0gKFBGTl92a0ZyZWVDb21tYW5kQnVmZmVycylncGEoZGV2LCAidmtGcmVlQ29tbWFuZEJ1ZmZlcnMiKTsKKyAgICB0YWJsZS0+QmVnaW5Db21tYW5kQnVmZmVyID0gKFBGTl92a0JlZ2luQ29tbWFuZEJ1ZmZlcilncGEoZGV2LCAidmtCZWdpbkNvbW1hbmRCdWZmZXIiKTsKKyAgICB0YWJsZS0+RW5kQ29tbWFuZEJ1ZmZlciA9IChQRk5fdmtFbmRDb21tYW5kQnVmZmVyKWdwYShkZXYsICJ2a0VuZENvbW1hbmRCdWZmZXIiKTsKKyAgICB0YWJsZS0+UmVzZXRDb21tYW5kQnVmZmVyID0gKFBGTl92a1Jlc2V0Q29tbWFuZEJ1ZmZlcilncGEoZGV2LCAidmtSZXNldENvbW1hbmRCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kQmluZFBpcGVsaW5lID0gKFBGTl92a0NtZEJpbmRQaXBlbGluZSlncGEoZGV2LCAidmtDbWRCaW5kUGlwZWxpbmUiKTsKKyAgICB0YWJsZS0+Q21kU2V0Vmlld3BvcnQgPSAoUEZOX3ZrQ21kU2V0Vmlld3BvcnQpZ3BhKGRldiwgInZrQ21kU2V0Vmlld3BvcnQiKTsKKyAgICB0YWJsZS0+Q21kU2V0U2Npc3NvciA9IChQRk5fdmtDbWRTZXRTY2lzc29yKWdwYShkZXYsICJ2a0NtZFNldFNjaXNzb3IiKTsKKyAgICB0YWJsZS0+Q21kU2V0TGluZVdpZHRoID0gKFBGTl92a0NtZFNldExpbmVXaWR0aClncGEoZGV2LCAidmtDbWRTZXRMaW5lV2lkdGgiKTsKKyAgICB0YWJsZS0+Q21kU2V0RGVwdGhCaWFzID0gKFBGTl92a0NtZFNldERlcHRoQmlhcylncGEoZGV2LCAidmtDbWRTZXREZXB0aEJpYXMiKTsKKyAgICB0YWJsZS0+Q21kU2V0QmxlbmRDb25zdGFudHMgPSAoUEZOX3ZrQ21kU2V0QmxlbmRDb25zdGFudHMpZ3BhKGRldiwgInZrQ21kU2V0QmxlbmRDb25zdGFudHMiKTsKKyAgICB0YWJsZS0+Q21kU2V0RGVwdGhCb3VuZHMgPSAoUEZOX3ZrQ21kU2V0RGVwdGhCb3VuZHMpZ3BhKGRldiwgInZrQ21kU2V0RGVwdGhCb3VuZHMiKTsKKyAgICB0YWJsZS0+Q21kU2V0U3RlbmNpbENvbXBhcmVNYXNrID0gKFBGTl92a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzaylncGEoZGV2LCAidmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2siKTsKKyAgICB0YWJsZS0+Q21kU2V0U3RlbmNpbFdyaXRlTWFzayA9IChQRk5fdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKWdwYShkZXYsICJ2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2siKTsKKyAgICB0YWJsZS0+Q21kU2V0U3RlbmNpbFJlZmVyZW5jZSA9IChQRk5fdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKWdwYShkZXYsICJ2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UiKTsKKyAgICB0YWJsZS0+Q21kQmluZERlc2NyaXB0b3JTZXRzID0gKFBGTl92a0NtZEJpbmREZXNjcmlwdG9yU2V0cylncGEoZGV2LCAidmtDbWRCaW5kRGVzY3JpcHRvclNldHMiKTsKKyAgICB0YWJsZS0+Q21kQmluZEluZGV4QnVmZmVyID0gKFBGTl92a0NtZEJpbmRJbmRleEJ1ZmZlcilncGEoZGV2LCAidmtDbWRCaW5kSW5kZXhCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kQmluZFZlcnRleEJ1ZmZlcnMgPSAoUEZOX3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnMpZ3BhKGRldiwgInZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiKTsKKyAgICB0YWJsZS0+Q21kRHJhdyA9IChQRk5fdmtDbWREcmF3KWdwYShkZXYsICJ2a0NtZERyYXciKTsKKyAgICB0YWJsZS0+Q21kRHJhd0luZGV4ZWQgPSAoUEZOX3ZrQ21kRHJhd0luZGV4ZWQpZ3BhKGRldiwgInZrQ21kRHJhd0luZGV4ZWQiKTsKKyAgICB0YWJsZS0+Q21kRHJhd0luZGlyZWN0ID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdClncGEoZGV2LCAidmtDbWREcmF3SW5kaXJlY3QiKTsKKyAgICB0YWJsZS0+Q21kRHJhd0luZGV4ZWRJbmRpcmVjdCA9IChQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KWdwYShkZXYsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QiKTsKKyAgICB0YWJsZS0+Q21kRGlzcGF0Y2ggPSAoUEZOX3ZrQ21kRGlzcGF0Y2gpZ3BhKGRldiwgInZrQ21kRGlzcGF0Y2giKTsKKyAgICB0YWJsZS0+Q21kRGlzcGF0Y2hJbmRpcmVjdCA9IChQRk5fdmtDbWREaXNwYXRjaEluZGlyZWN0KWdwYShkZXYsICJ2a0NtZERpc3BhdGNoSW5kaXJlY3QiKTsKKyAgICB0YWJsZS0+Q21kQ29weUJ1ZmZlciA9IChQRk5fdmtDbWRDb3B5QnVmZmVyKWdwYShkZXYsICJ2a0NtZENvcHlCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kQ29weUltYWdlID0gKFBGTl92a0NtZENvcHlJbWFnZSlncGEoZGV2LCAidmtDbWRDb3B5SW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQmxpdEltYWdlID0gKFBGTl92a0NtZEJsaXRJbWFnZSlncGEoZGV2LCAidmtDbWRCbGl0SW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQ29weUJ1ZmZlclRvSW1hZ2UgPSAoUEZOX3ZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UpZ3BhKGRldiwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQ29weUltYWdlVG9CdWZmZXIgPSAoUEZOX3ZrQ21kQ29weUltYWdlVG9CdWZmZXIpZ3BhKGRldiwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kVXBkYXRlQnVmZmVyID0gKFBGTl92a0NtZFVwZGF0ZUJ1ZmZlcilncGEoZGV2LCAidmtDbWRVcGRhdGVCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kRmlsbEJ1ZmZlciA9IChQRk5fdmtDbWRGaWxsQnVmZmVyKWdwYShkZXYsICJ2a0NtZEZpbGxCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kQ2xlYXJDb2xvckltYWdlID0gKFBGTl92a0NtZENsZWFyQ29sb3JJbWFnZSlncGEoZGV2LCAidmtDbWRDbGVhckNvbG9ySW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSA9IChQRk5fdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKWdwYShkZXYsICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQ2xlYXJBdHRhY2htZW50cyA9IChQRk5fdmtDbWRDbGVhckF0dGFjaG1lbnRzKWdwYShkZXYsICJ2a0NtZENsZWFyQXR0YWNobWVudHMiKTsKKyAgICB0YWJsZS0+Q21kUmVzb2x2ZUltYWdlID0gKFBGTl92a0NtZFJlc29sdmVJbWFnZSlncGEoZGV2LCAidmtDbWRSZXNvbHZlSW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kU2V0RXZlbnQgPSAoUEZOX3ZrQ21kU2V0RXZlbnQpZ3BhKGRldiwgInZrQ21kU2V0RXZlbnQiKTsKKyAgICB0YWJsZS0+Q21kUmVzZXRFdmVudCA9IChQRk5fdmtDbWRSZXNldEV2ZW50KWdwYShkZXYsICJ2a0NtZFJlc2V0RXZlbnQiKTsKKyAgICB0YWJsZS0+Q21kV2FpdEV2ZW50cyA9IChQRk5fdmtDbWRXYWl0RXZlbnRzKWdwYShkZXYsICJ2a0NtZFdhaXRFdmVudHMiKTsKKyAgICB0YWJsZS0+Q21kUGlwZWxpbmVCYXJyaWVyID0gKFBGTl92a0NtZFBpcGVsaW5lQmFycmllcilncGEoZGV2LCAidmtDbWRQaXBlbGluZUJhcnJpZXIiKTsKKyAgICB0YWJsZS0+Q21kQmVnaW5RdWVyeSA9IChQRk5fdmtDbWRCZWdpblF1ZXJ5KWdwYShkZXYsICJ2a0NtZEJlZ2luUXVlcnkiKTsKKyAgICB0YWJsZS0+Q21kRW5kUXVlcnkgPSAoUEZOX3ZrQ21kRW5kUXVlcnkpZ3BhKGRldiwgInZrQ21kRW5kUXVlcnkiKTsKKyAgICB0YWJsZS0+Q21kUmVzZXRRdWVyeVBvb2wgPSAoUEZOX3ZrQ21kUmVzZXRRdWVyeVBvb2wpZ3BhKGRldiwgInZrQ21kUmVzZXRRdWVyeVBvb2wiKTsKKyAgICB0YWJsZS0+Q21kV3JpdGVUaW1lc3RhbXAgPSAoUEZOX3ZrQ21kV3JpdGVUaW1lc3RhbXApZ3BhKGRldiwgInZrQ21kV3JpdGVUaW1lc3RhbXAiKTsKKyAgICB0YWJsZS0+Q21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMgPSAoUEZOX3ZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMpZ3BhKGRldiwgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMiKTsKKyAgICB0YWJsZS0+Q21kUHVzaENvbnN0YW50cyA9IChQRk5fdmtDbWRQdXNoQ29uc3RhbnRzKWdwYShkZXYsICJ2a0NtZFB1c2hDb25zdGFudHMiKTsKKyAgICB0YWJsZS0+Q21kQmVnaW5SZW5kZXJQYXNzID0gKFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzcylncGEoZGV2LCAidmtDbWRCZWdpblJlbmRlclBhc3MiKTsKKyAgICB0YWJsZS0+Q21kTmV4dFN1YnBhc3MgPSAoUEZOX3ZrQ21kTmV4dFN1YnBhc3MpZ3BhKGRldiwgInZrQ21kTmV4dFN1YnBhc3MiKTsKKyAgICB0YWJsZS0+Q21kRW5kUmVuZGVyUGFzcyA9IChQRk5fdmtDbWRFbmRSZW5kZXJQYXNzKWdwYShkZXYsICJ2a0NtZEVuZFJlbmRlclBhc3MiKTsKKyAgICB0YWJsZS0+Q21kRXhlY3V0ZUNvbW1hbmRzID0gKFBGTl92a0NtZEV4ZWN1dGVDb21tYW5kcylncGEoZGV2LCAidmtDbWRFeGVjdXRlQ29tbWFuZHMiKTsKKworICAgIC8vIC0tLS0gQ29yZSAxXzEgY29tbWFuZHMKKyAgICB0YWJsZS0+QmluZEJ1ZmZlck1lbW9yeTIgPSAoUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTIpZ3BhKGRldiwgInZrQmluZEJ1ZmZlck1lbW9yeTIiKTsKKyAgICB0YWJsZS0+QmluZEltYWdlTWVtb3J5MiA9IChQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyKWdwYShkZXYsICJ2a0JpbmRJbWFnZU1lbW9yeTIiKTsKKyAgICB0YWJsZS0+R2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMpZ3BhKGRldiwgInZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMiKTsKKyAgICB0YWJsZS0+Q21kU2V0RGV2aWNlTWFzayA9IChQRk5fdmtDbWRTZXREZXZpY2VNYXNrKWdwYShkZXYsICJ2a0NtZFNldERldmljZU1hc2siKTsKKyAgICB0YWJsZS0+Q21kRGlzcGF0Y2hCYXNlID0gKFBGTl92a0NtZERpc3BhdGNoQmFzZSlncGEoZGV2LCAidmtDbWREaXNwYXRjaEJhc2UiKTsKKyAgICB0YWJsZS0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMilncGEoZGV2LCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIiKTsKKyAgICB0YWJsZS0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiA9IChQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKWdwYShkZXYsICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIiKTsKKyAgICB0YWJsZS0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMilncGEoZGV2LCAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiKTsKKyAgICB0YWJsZS0+VHJpbUNvbW1hbmRQb29sID0gKFBGTl92a1RyaW1Db21tYW5kUG9vbClncGEoZGV2LCAidmtUcmltQ29tbWFuZFBvb2wiKTsKKyAgICB0YWJsZS0+R2V0RGV2aWNlUXVldWUyID0gKFBGTl92a0dldERldmljZVF1ZXVlMilncGEoZGV2LCAidmtHZXREZXZpY2VRdWV1ZTIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiA9IChQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKWdwYShkZXYsICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKTsKKyAgICB0YWJsZS0+RGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24gPSAoUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24pZ3BhKGRldiwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKTsKKyAgICB0YWJsZS0+Q3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gKFBGTl92a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSlncGEoZGV2LCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKWdwYShkZXYsICJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiKTsKKyAgICB0YWJsZS0+VXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSA9IChQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKWdwYShkZXYsICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUiKTsKKyAgICB0YWJsZS0+R2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgPSAoUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQpZ3BhKGRldiwgInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiKTsKK30KKworLy8gSW5pdCBEZXZpY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGV4dGVuc2lvbiBjb21tYW5kcworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgbG9hZGVyX2luaXRfZGV2aWNlX2V4dGVuc2lvbl9kaXNwYXRjaF90YWJsZShzdHJ1Y3QgbG9hZGVyX2Rldl9kaXNwYXRjaF90YWJsZSAqZGV2X3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGdpcGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGdkcGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UgaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2UgZGV2KSB7CisgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnRhYmxlID0gJmRldl90YWJsZS0+Y29yZV9kaXNwYXRjaDsKKworICAgIC8vIC0tLS0gVktfS0hSX3N3YXBjaGFpbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+Q3JlYXRlU3dhcGNoYWluS0hSID0gKFBGTl92a0NyZWF0ZVN3YXBjaGFpbktIUilnZHBhKGRldiwgInZrQ3JlYXRlU3dhcGNoYWluS0hSIik7CisgICAgdGFibGUtPkRlc3Ryb3lTd2FwY2hhaW5LSFIgPSAoUEZOX3ZrRGVzdHJveVN3YXBjaGFpbktIUilnZHBhKGRldiwgInZrRGVzdHJveVN3YXBjaGFpbktIUiIpOworICAgIHRhYmxlLT5HZXRTd2FwY2hhaW5JbWFnZXNLSFIgPSAoUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKWdkcGEoZGV2LCAidmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIiKTsKKyAgICB0YWJsZS0+QWNxdWlyZU5leHRJbWFnZUtIUiA9IChQRk5fdmtBY3F1aXJlTmV4dEltYWdlS0hSKWdkcGEoZGV2LCAidmtBY3F1aXJlTmV4dEltYWdlS0hSIik7CisgICAgdGFibGUtPlF1ZXVlUHJlc2VudEtIUiA9IChQRk5fdmtRdWV1ZVByZXNlbnRLSFIpZ2RwYShkZXYsICJ2a1F1ZXVlUHJlc2VudEtIUiIpOworICAgIHRhYmxlLT5HZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKWdkcGEoZGV2LCAidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSID0gKFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUilnZHBhKGRldiwgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIik7CisgICAgdGFibGUtPkFjcXVpcmVOZXh0SW1hZ2UyS0hSID0gKFBGTl92a0FjcXVpcmVOZXh0SW1hZ2UyS0hSKWdkcGEoZGV2LCAidmtBY3F1aXJlTmV4dEltYWdlMktIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIgPSAoUEZOX3ZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUilnZHBhKGRldiwgInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiA9IChQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUilnZHBhKGRldiwgInZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIiKTsKKyAgICB0YWJsZS0+Q21kU2V0RGV2aWNlTWFza0tIUiA9IChQRk5fdmtDbWRTZXREZXZpY2VNYXNrS0hSKWdkcGEoZGV2LCAidmtDbWRTZXREZXZpY2VNYXNrS0hSIik7CisgICAgdGFibGUtPkNtZERpc3BhdGNoQmFzZUtIUiA9IChQRk5fdmtDbWREaXNwYXRjaEJhc2VLSFIpZ2RwYShkZXYsICJ2a0NtZERpc3BhdGNoQmFzZUtIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfbWFpbnRlbmFuY2UxIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5UcmltQ29tbWFuZFBvb2xLSFIgPSAoUEZOX3ZrVHJpbUNvbW1hbmRQb29sS0hSKWdkcGEoZGV2LCAidmtUcmltQ29tbWFuZFBvb2xLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX21lbW9yeV93aW4zMiBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlS0hSID0gKFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSKWdkcGEoZGV2LCAidmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIpZ2RwYShkZXYsICJ2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0TWVtb3J5RmRLSFIgPSAoUEZOX3ZrR2V0TWVtb3J5RmRLSFIpZ2RwYShkZXYsICJ2a0dldE1lbW9yeUZkS0hSIik7CisgICAgdGFibGUtPkdldE1lbW9yeUZkUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIpZ2RwYShkZXYsICJ2a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+SW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIpZ2RwYShkZXYsICJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIpZ2RwYShkZXYsICJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5JbXBvcnRTZW1hcGhvcmVGZEtIUiA9IChQRk5fdmtJbXBvcnRTZW1hcGhvcmVGZEtIUilnZHBhKGRldiwgInZrSW1wb3J0U2VtYXBob3JlRmRLSFIiKTsKKyAgICB0YWJsZS0+R2V0U2VtYXBob3JlRmRLSFIgPSAoUEZOX3ZrR2V0U2VtYXBob3JlRmRLSFIpZ2RwYShkZXYsICJ2a0dldFNlbWFwaG9yZUZkS0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSID0gKFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKWdkcGEoZGV2LCAidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIpOworICAgIHRhYmxlLT5DbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiA9IChQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUilnZHBhKGRldiwgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPSAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKWdkcGEoZGV2LCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IChQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKWdkcGEoZGV2LCAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIik7CisgICAgdGFibGUtPlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPSAoUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUilnZHBhKGRldiwgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DcmVhdGVSZW5kZXJQYXNzMktIUiA9IChQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUilnZHBhKGRldiwgInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiKTsKKyAgICB0YWJsZS0+Q21kQmVnaW5SZW5kZXJQYXNzMktIUiA9IChQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKWdkcGEoZGV2LCAidmtDbWRCZWdpblJlbmRlclBhc3MyS0hSIik7CisgICAgdGFibGUtPkNtZE5leHRTdWJwYXNzMktIUiA9IChQRk5fdmtDbWROZXh0U3VicGFzczJLSFIpZ2RwYShkZXYsICJ2a0NtZE5leHRTdWJwYXNzMktIUiIpOworICAgIHRhYmxlLT5DbWRFbmRSZW5kZXJQYXNzMktIUiA9IChQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUilnZHBhKGRldiwgInZrQ21kRW5kUmVuZGVyUGFzczJLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0U3dhcGNoYWluU3RhdHVzS0hSID0gKFBGTl92a0dldFN3YXBjaGFpblN0YXR1c0tIUilnZHBhKGRldiwgInZrR2V0U3dhcGNoYWluU3RhdHVzS0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV93aW4zMiBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUilnZHBhKGRldiwgInZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldEZlbmNlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUilnZHBhKGRldiwgInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5JbXBvcnRGZW5jZUZkS0hSID0gKFBGTl92a0ltcG9ydEZlbmNlRmRLSFIpZ2RwYShkZXYsICJ2a0ltcG9ydEZlbmNlRmRLSFIiKTsKKyAgICB0YWJsZS0+R2V0RmVuY2VGZEtIUiA9IChQRk5fdmtHZXRGZW5jZUZkS0hSKWdkcGEoZGV2LCAidmtHZXRGZW5jZUZkS0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9wZXJmb3JtYW5jZV9xdWVyeSBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+QWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgPSAoUEZOX3ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIpZ2RwYShkZXYsICJ2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSIik7CisgICAgdGFibGUtPlJlbGVhc2VQcm9maWxpbmdMb2NrS0hSID0gKFBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKWdkcGEoZGV2LCAidmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSAoUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKWdkcGEoZGV2LCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiKTsKKyAgICB0YWJsZS0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IChQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKWdkcGEoZGV2LCAidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIik7CisgICAgdGFibGUtPkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IChQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIpZ2RwYShkZXYsICJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gKFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIpZ2RwYShkZXYsICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKTsKKyAgICB0YWJsZS0+RGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPSAoUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIpZ2RwYShkZXYsICJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9iaW5kX21lbW9yeTIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkJpbmRCdWZmZXJNZW1vcnkyS0hSID0gKFBGTl92a0JpbmRCdWZmZXJNZW1vcnkyS0hSKWdkcGEoZGV2LCAidmtCaW5kQnVmZmVyTWVtb3J5MktIUiIpOworICAgIHRhYmxlLT5CaW5kSW1hZ2VNZW1vcnkyS0hSID0gKFBGTl92a0JpbmRJbWFnZU1lbW9yeTJLSFIpZ2RwYShkZXYsICJ2a0JpbmRJbWFnZU1lbW9yeTJLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX21haW50ZW5hbmNlMyBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIpZ2RwYShkZXYsICJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50IGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWREcmF3SW5kaXJlY3RDb3VudEtIUiA9IChQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUilnZHBhKGRldiwgInZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIiKTsKKyAgICB0YWJsZS0+Q21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSID0gKFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUilnZHBhKGRldiwgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiA9IChQRk5fdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIpZ2RwYShkZXYsICJ2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiIpOworICAgIHRhYmxlLT5XYWl0U2VtYXBob3Jlc0tIUiA9IChQRk5fdmtXYWl0U2VtYXBob3Jlc0tIUilnZHBhKGRldiwgInZrV2FpdFNlbWFwaG9yZXNLSFIiKTsKKyAgICB0YWJsZS0+U2lnbmFsU2VtYXBob3JlS0hSID0gKFBGTl92a1NpZ25hbFNlbWFwaG9yZUtIUilnZHBhKGRldiwgInZrU2lnbmFsU2VtYXBob3JlS0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUilnZHBhKGRldiwgInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiIpOworICAgIHRhYmxlLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSID0gKFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIpZ2RwYShkZXYsICJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgPSAoUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIpZ2RwYShkZXYsICJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z19tYXJrZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUID0gKFBGTl92a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKWdkcGEoZGV2LCAidmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCIpOworICAgIHRhYmxlLT5EZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQgPSAoUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKWdkcGEoZGV2LCAidmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiKTsKKyAgICB0YWJsZS0+Q21kRGVidWdNYXJrZXJCZWdpbkVYVCA9IChQRk5fdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUKWdkcGEoZGV2LCAidmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUIik7CisgICAgdGFibGUtPkNtZERlYnVnTWFya2VyRW5kRVhUID0gKFBGTl92a0NtZERlYnVnTWFya2VyRW5kRVhUKWdkcGEoZGV2LCAidmtDbWREZWJ1Z01hcmtlckVuZEVYVCIpOworICAgIHRhYmxlLT5DbWREZWJ1Z01hcmtlckluc2VydEVYVCA9IChQRk5fdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVClnZHBhKGRldiwgInZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjayBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+Q21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCA9IChQRk5fdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKWdkcGEoZGV2LCAidmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUIik7CisgICAgdGFibGUtPkNtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQgPSAoUEZOX3ZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVClnZHBhKGRldiwgInZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCIpOworICAgIHRhYmxlLT5DbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCA9IChQRk5fdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVClnZHBhKGRldiwgInZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQiKTsKKyAgICB0YWJsZS0+Q21kQmVnaW5RdWVyeUluZGV4ZWRFWFQgPSAoUEZOX3ZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQpZ2RwYShkZXYsICJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIik7CisgICAgdGFibGUtPkNtZEVuZFF1ZXJ5SW5kZXhlZEVYVCA9IChQRk5fdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQpZ2RwYShkZXYsICJ2a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVCIpOworICAgIHRhYmxlLT5DbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQgPSAoUEZOX3ZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKWdkcGEoZGV2LCAidmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQiKTsKKworICAgIC8vIC0tLS0gVktfTlZYX2ltYWdlX3ZpZXdfaGFuZGxlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXRJbWFnZVZpZXdIYW5kbGVOVlggPSAoUEZOX3ZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKWdkcGEoZGV2LCAidmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgiKTsKKworICAgIC8vIC0tLS0gVktfQU1EX2RyYXdfaW5kaXJlY3RfY291bnQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkNtZERyYXdJbmRpcmVjdENvdW50QU1EID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdENvdW50QU1EKWdkcGEoZGV2LCAidmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCIpOworICAgIHRhYmxlLT5DbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQgPSAoUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKWdkcGEoZGV2LCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiKTsKKworICAgIC8vIC0tLS0gVktfQU1EX3NoYWRlcl9pbmZvIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXRTaGFkZXJJbmZvQU1EID0gKFBGTl92a0dldFNoYWRlckluZm9BTUQpZ2RwYShkZXYsICJ2a0dldFNoYWRlckluZm9BTUQiKTsKKworICAgIC8vIC0tLS0gVktfTlZfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0TWVtb3J5V2luMzJIYW5kbGVOViA9IChQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKWdkcGEoZGV2LCAidmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19FWFRfY29uZGl0aW9uYWxfcmVuZGVyaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUID0gKFBGTl92a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQpZ2RwYShkZXYsICJ2a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiKTsKKyAgICB0YWJsZS0+Q21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgPSAoUEZOX3ZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQpZ2RwYShkZXYsICJ2a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWRQcm9jZXNzQ29tbWFuZHNOVlggPSAoUEZOX3ZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKWdkcGEoZGV2LCAidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiKTsKKyAgICB0YWJsZS0+Q21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlggPSAoUEZOX3ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgpZ2RwYShkZXYsICJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIik7CisgICAgdGFibGUtPkNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggPSAoUEZOX3ZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWClnZHBhKGRldiwgInZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIpOworICAgIHRhYmxlLT5EZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IChQRk5fdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWClnZHBhKGRldiwgInZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiKTsKKyAgICB0YWJsZS0+Q3JlYXRlT2JqZWN0VGFibGVOVlggPSAoUEZOX3ZrQ3JlYXRlT2JqZWN0VGFibGVOVlgpZ2RwYShkZXYsICJ2a0NyZWF0ZU9iamVjdFRhYmxlTlZYIik7CisgICAgdGFibGUtPkRlc3Ryb3lPYmplY3RUYWJsZU5WWCA9IChQRk5fdmtEZXN0cm95T2JqZWN0VGFibGVOVlgpZ2RwYShkZXYsICJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCIpOworICAgIHRhYmxlLT5SZWdpc3Rlck9iamVjdHNOVlggPSAoUEZOX3ZrUmVnaXN0ZXJPYmplY3RzTlZYKWdkcGEoZGV2LCAidmtSZWdpc3Rlck9iamVjdHNOVlgiKTsKKyAgICB0YWJsZS0+VW5yZWdpc3Rlck9iamVjdHNOVlggPSAoUEZOX3ZrVW5yZWdpc3Rlck9iamVjdHNOVlgpZ2RwYShkZXYsICJ2a1VucmVnaXN0ZXJPYmplY3RzTlZYIik7CisKKyAgICAvLyAtLS0tIFZLX05WX2NsaXBfc3BhY2Vfd19zY2FsaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYgPSAoUEZOX3ZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKWdkcGEoZGV2LCAidmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2Rpc3BsYXlfY29udHJvbCBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+RGlzcGxheVBvd2VyQ29udHJvbEVYVCA9IChQRk5fdmtEaXNwbGF5UG93ZXJDb250cm9sRVhUKWdkcGEoZGV2LCAidmtEaXNwbGF5UG93ZXJDb250cm9sRVhUIik7CisgICAgdGFibGUtPlJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQgPSAoUEZOX3ZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVClnZHBhKGRldiwgInZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIpOworICAgIHRhYmxlLT5SZWdpc3RlckRpc3BsYXlFdmVudEVYVCA9IChQRk5fdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVClnZHBhKGRldiwgInZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQiKTsKKyAgICB0YWJsZS0+R2V0U3dhcGNoYWluQ291bnRlckVYVCA9IChQRk5fdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUKWdkcGEoZGV2LCAidmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX0dPT0dMRV9kaXNwbGF5X3RpbWluZyBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUgPSAoUEZOX3ZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUpZ2RwYShkZXYsICJ2a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIik7CisgICAgdGFibGUtPkdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgPSAoUEZOX3ZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSlnZHBhKGRldiwgInZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSIpOworCisgICAgLy8gLS0tLSBWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUID0gKFBGTl92a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQpZ2RwYShkZXYsICJ2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2hkcl9tZXRhZGF0YSBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+U2V0SGRyTWV0YWRhdGFFWFQgPSAoUEZOX3ZrU2V0SGRyTWV0YWRhdGFFWFQpZ2RwYShkZXYsICJ2a1NldEhkck1ldGFkYXRhRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z191dGlscyBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+U2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgPSAoUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQpZ2lwYShpbnN0LCAidmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCIpOworICAgIHRhYmxlLT5TZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUID0gKFBGTl92a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQpZ2lwYShpbnN0LCAidmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUIik7CisgICAgdGFibGUtPlF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVClnaXBhKGluc3QsICJ2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiKTsKKyAgICB0YWJsZS0+UXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQpZ2lwYShpbnN0LCAidmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgIHRhYmxlLT5RdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCA9IChQRk5fdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVClnaXBhKGluc3QsICJ2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIik7CisgICAgdGFibGUtPkNtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKWdpcGEoaW5zdCwgInZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiKTsKKyAgICB0YWJsZS0+Q21kRW5kRGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVClnaXBhKGluc3QsICJ2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgIHRhYmxlLT5DbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKWdpcGEoaW5zdCwgInZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHRhYmxlLT5HZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCA9IChQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRClnZHBhKGRldiwgInZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICB0YWJsZS0+R2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCA9IChQRk5fdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKWdkcGEoZGV2LCAidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyAgICAvLyAtLS0tIFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQgPSAoUEZOX3ZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKWdkcGEoZGV2LCAidmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUID0gKFBGTl92a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKWdkcGEoZGV2LCAidmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCIpOworCisgICAgLy8gLS0tLSBWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+Q3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUID0gKFBGTl92a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVClnZHBhKGRldiwgInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIik7CisgICAgdGFibGUtPkRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQgPSAoUEZOX3ZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVClnZHBhKGRldiwgInZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCIpOworICAgIHRhYmxlLT5NZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQgPSAoUEZOX3ZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKWdkcGEoZGV2LCAidmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQiKTsKKyAgICB0YWJsZS0+R2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCA9IChQRk5fdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKWdkcGEoZGV2LCAidmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+Q21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViA9IChQRk5fdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKWdkcGEoZGV2LCAidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIik7CisgICAgdGFibGUtPkNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYgPSAoUEZOX3ZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVilnZHBhKGRldiwgInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViIpOworICAgIHRhYmxlLT5DbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WID0gKFBGTl92a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYpZ2RwYShkZXYsICJ2a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYiKTsKKworICAgIC8vIC0tLS0gVktfTlZfcmF5X3RyYWNpbmcgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKWdkcGEoZGV2LCAidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpOworICAgIHRhYmxlLT5EZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSAoUEZOX3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKWdkcGEoZGV2LCAidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKTsKKyAgICB0YWJsZS0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgPSAoUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYpZ2RwYShkZXYsICJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WIik7CisgICAgdGFibGUtPkJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViA9IChQRk5fdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYpZ2RwYShkZXYsICJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIpOworICAgIHRhYmxlLT5DbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpZ2RwYShkZXYsICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKTsKKyAgICB0YWJsZS0+Q21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVilnZHBhKGRldiwgInZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIik7CisgICAgdGFibGUtPkNtZFRyYWNlUmF5c05WID0gKFBGTl92a0NtZFRyYWNlUmF5c05WKWdkcGEoZGV2LCAidmtDbWRUcmFjZVJheXNOViIpOworICAgIHRhYmxlLT5DcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYgPSAoUEZOX3ZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKWdkcGEoZGV2LCAidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiKTsKKyAgICB0YWJsZS0+R2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WID0gKFBGTl92a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVilnZHBhKGRldiwgInZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIik7CisgICAgdGFibGUtPkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WID0gKFBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKWdkcGEoZGV2LCAidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIpOworICAgIHRhYmxlLT5DbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYgPSAoUEZOX3ZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKWdkcGEoZGV2LCAidmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYiKTsKKyAgICB0YWJsZS0+Q29tcGlsZURlZmVycmVkTlYgPSAoUEZOX3ZrQ29tcGlsZURlZmVycmVkTlYpZ2RwYShkZXYsICJ2a0NvbXBpbGVEZWZlcnJlZE5WIik7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9leHRlcm5hbF9tZW1vcnlfaG9zdCBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUID0gKFBGTl92a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVClnZHBhKGRldiwgInZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX0FNRF9idWZmZXJfbWFya2VyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCA9IChQRk5fdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRClnZHBhKGRldiwgInZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQgPSAoUEZOX3ZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQpZ2RwYShkZXYsICJ2a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX05WX21lc2hfc2hhZGVyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWREcmF3TWVzaFRhc2tzTlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc05WKWdkcGEoZGV2LCAidmtDbWREcmF3TWVzaFRhc2tzTlYiKTsKKyAgICB0YWJsZS0+Q21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYpZ2RwYShkZXYsICJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WIik7CisgICAgdGFibGUtPkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVilnZHBhKGRldiwgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViIpOworCisgICAgLy8gLS0tLSBWS19OVl9zY2lzc29yX2V4Y2x1c2l2ZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+Q21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WID0gKFBGTl92a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVilnZHBhKGRldiwgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WIik7CisKKyAgICAvLyAtLS0tIFZLX05WX2RldmljZV9kaWFnbm9zdGljX2NoZWNrcG9pbnRzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5DbWRTZXRDaGVja3BvaW50TlYgPSAoUEZOX3ZrQ21kU2V0Q2hlY2twb2ludE5WKWdkcGEoZGV2LCAidmtDbWRTZXRDaGVja3BvaW50TlYiKTsKKyAgICB0YWJsZS0+R2V0UXVldWVDaGVja3BvaW50RGF0YU5WID0gKFBGTl92a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOVilnZHBhKGRldiwgInZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WIik7CisKKyAgICAvLyAtLS0tIFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5Jbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IChQRk5fdmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTClnZHBhKGRldiwgInZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwiKTsKKyAgICB0YWJsZS0+VW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IChQRk5fdmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKWdkcGEoZGV2LCAidmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIik7CisgICAgdGFibGUtPkNtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwgPSAoUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTClnZHBhKGRldiwgInZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCIpOworICAgIHRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMID0gKFBGTl92a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwpZ2RwYShkZXYsICJ2a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwiKTsKKyAgICB0YWJsZS0+Q21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMID0gKFBGTl92a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTClnZHBhKGRldiwgInZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMIik7CisgICAgdGFibGUtPkFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IChQRk5fdmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpZ2RwYShkZXYsICJ2a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIpOworICAgIHRhYmxlLT5SZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSAoUEZOX3ZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKWdkcGEoZGV2LCAidmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiKTsKKyAgICB0YWJsZS0+UXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IChQRk5fdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKWdkcGEoZGV2LCAidmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIik7CisgICAgdGFibGUtPkdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwgPSAoUEZOX3ZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTClnZHBhKGRldiwgInZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIpOworCisgICAgLy8gLS0tLSBWS19BTURfZGlzcGxheV9uYXRpdmVfaGRyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5TZXRMb2NhbERpbW1pbmdBTUQgPSAoUEZOX3ZrU2V0TG9jYWxEaW1taW5nQU1EKWdkcGEoZGV2LCAidmtTZXRMb2NhbERpbW1pbmdBTUQiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCA9IChQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKWdkcGEoZGV2LCAidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5BY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgPSAoUEZOX3ZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKWdkcGEoZGV2LCAidmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5SZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgPSAoUEZOX3ZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKWdkcGEoZGV2LCAidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUID0gKFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQpZ2RwYShkZXYsICJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0VYVF9saW5lX3Jhc3Rlcml6YXRpb24gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkNtZFNldExpbmVTdGlwcGxlRVhUID0gKFBGTl92a0NtZFNldExpbmVTdGlwcGxlRVhUKWdkcGEoZGV2LCAidmtDbWRTZXRMaW5lU3RpcHBsZUVYVCIpOworCisgICAgLy8gLS0tLSBWS19FWFRfaG9zdF9xdWVyeV9yZXNldCBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+UmVzZXRRdWVyeVBvb2xFWFQgPSAoUEZOX3ZrUmVzZXRRdWVyeVBvb2xFWFQpZ2RwYShkZXYsICJ2a1Jlc2V0UXVlcnlQb29sRVhUIik7Cit9CisKKy8vIEluaXQgSW5zdGFuY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGNvcmUgY29tbWFuZHMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9pbml0X2luc3RhbmNlX2NvcmVfZGlzcGF0Y2hfdGFibGUoVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqdGFibGUsIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ3BhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luc3RhbmNlIGluc3QpIHsKKworICAgIC8vIC0tLS0gQ29yZSAxXzAgY29tbWFuZHMKKyAgICB0YWJsZS0+RGVzdHJveUluc3RhbmNlID0gKFBGTl92a0Rlc3Ryb3lJbnN0YW5jZSlncGEoaW5zdCwgInZrRGVzdHJveUluc3RhbmNlIik7CisgICAgdGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyA9IChQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMpZ3BhKGluc3QsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcylncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIpOworICAgIHRhYmxlLT5HZXRJbnN0YW5jZVByb2NBZGRyID0gZ3BhOworICAgIHRhYmxlLT5FbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzID0gKFBGTl92a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMpZ3BhKGluc3QsICJ2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+RW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzID0gKFBGTl92a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcylncGEoaW5zdCwgInZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIpOworCisgICAgLy8gLS0tLSBDb3JlIDFfMSBjb21tYW5kcworICAgIHRhYmxlLT5FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyA9IChQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcylncGEoaW5zdCwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIik7Cit9CisKKy8vIEluaXQgSW5zdGFuY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGNvcmUgY29tbWFuZHMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9pbml0X2luc3RhbmNlX2V4dGVuc2lvbl9kaXNwYXRjaF90YWJsZShWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICp0YWJsZSwgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBncGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luc3RhbmNlIGluc3QpIHsKKworICAgIC8vIC0tLS0gVktfS0hSX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkRlc3Ryb3lTdXJmYWNlS0hSID0gKFBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSKWdwYShpbnN0LCAidmtEZXN0cm95U3VyZmFjZUtIUiIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX3N3YXBjaGFpbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kaXNwbGF5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIik7CisgICAgdGFibGUtPkdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSID0gKFBGTl92a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKWdwYShpbnN0LCAidmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiIpOworICAgIHRhYmxlLT5HZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKWdwYShpbnN0LCAidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlRGlzcGxheU1vZGVLSFIgPSAoUEZOX3ZrQ3JlYXRlRGlzcGxheU1vZGVLSFIpZ3BhKGluc3QsICJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIik7CisgICAgdGFibGUtPkdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiA9IChQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIpZ3BhKGluc3QsICJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiIpOworICAgIHRhYmxlLT5DcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSID0gKFBGTl92a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIpZ3BhKGluc3QsICJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX3hsaWJfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICB0YWJsZS0+Q3JlYXRlWGxpYlN1cmZhY2VLSFIgPSAoUEZOX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIpZ3BhKGluc3QsICJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfeGNiX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICB0YWJsZS0+Q3JlYXRlWGNiU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSKWdwYShpbnN0LCAidmtDcmVhdGVYY2JTdXJmYWNlS0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfd2F5bGFuZF9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIHRhYmxlLT5DcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUilncGEoaW5zdCwgInZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl9hbmRyb2lkX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgdGFibGUtPkNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSID0gKFBGTl92a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKWdwYShpbnN0LCAidmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfd2luMzJfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkNyZWF0ZVdpbjMyU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIpZ3BhKGluc3QsICJ2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiA9IChQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUilncGEoaW5zdCwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIik7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiIpOworCisgICAgLy8gLS0tLSBWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIgPSAoUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUilncGEoaW5zdCwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiIpOworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIiKTsKKworICAgIC8vIC0tLS0gVktfS0hSX2dldF9kaXNwbGF5X3Byb3BlcnRpZXMyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUilncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIiKTsKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgPSAoUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUilncGEoaW5zdCwgInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiIpOworICAgIHRhYmxlLT5HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSID0gKFBGTl92a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIpZ3BhKGluc3QsICJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX3JlcG9ydCBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+Q3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCA9IChQRk5fdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKWdwYShpbnN0LCAidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIik7CisgICAgdGFibGUtPkRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUID0gKFBGTl92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKWdwYShpbnN0LCAidmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCIpOworICAgIHRhYmxlLT5EZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQgPSAoUEZOX3ZrRGVidWdSZXBvcnRNZXNzYWdlRVhUKWdwYShpbnN0LCAidmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQiKTsKKworICAgIC8vIC0tLS0gVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgIHRhYmxlLT5DcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCA9IChQRk5fdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUClncGEoaW5zdCwgInZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisKKyAgICAvLyAtLS0tIFZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViIpOworCisgICAgLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIHRhYmxlLT5DcmVhdGVWaVN1cmZhY2VOTiA9IChQRk5fdmtDcmVhdGVWaVN1cmZhY2VOTilncGEoaW5zdCwgInZrQ3JlYXRlVmlTdXJmYWNlTk4iKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fVklfTk4KKworICAgIC8vIC0tLS0gVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCIpOworCisgICAgLy8gLS0tLSBWS19FWFRfZGlyZWN0X21vZGVfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+UmVsZWFzZURpc3BsYXlFWFQgPSAoUEZOX3ZrUmVsZWFzZURpc3BsYXlFWFQpZ3BhKGluc3QsICJ2a1JlbGVhc2VEaXNwbGF5RVhUIik7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgdGFibGUtPkFjcXVpcmVYbGliRGlzcGxheUVYVCA9IChQRk5fdmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQpZ3BhKGluc3QsICJ2a0FjcXVpcmVYbGliRGlzcGxheUVYVCIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgdGFibGUtPkdldFJhbmRST3V0cHV0RGlzcGxheUVYVCA9IChQRk5fdmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQpZ3BhKGluc3QsICJ2a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworICAgIC8vIC0tLS0gVktfRVhUX2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQiKTsKKworICAgIC8vIC0tLS0gVktfTVZLX2lvc19zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisgICAgdGFibGUtPkNyZWF0ZUlPU1N1cmZhY2VNVksgPSAoUEZOX3ZrQ3JlYXRlSU9TU3VyZmFjZU1WSylncGEoaW5zdCwgInZrQ3JlYXRlSU9TU3VyZmFjZU1WSyIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKKyAgICAvLyAtLS0tIFZLX01WS19tYWNvc19zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyAgICB0YWJsZS0+Q3JlYXRlTWFjT1NTdXJmYWNlTVZLID0gKFBGTl92a0NyZWF0ZU1hY09TU3VyZmFjZU1WSylncGEoaW5zdCwgInZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCisgICAgLy8gLS0tLSBWS19FWFRfZGVidWdfdXRpbHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgPSAoUEZOX3ZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVClncGEoaW5zdCwgInZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIpOworICAgIHRhYmxlLT5EZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCA9IChQRk5fdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVClncGEoaW5zdCwgInZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiKTsKKyAgICB0YWJsZS0+U3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQgPSAoUEZOX3ZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQpZ3BhKGluc3QsICJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVClncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQpZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUIik7CisKKyAgICAvLyAtLS0tIFZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICB0YWJsZS0+Q3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEgPSAoUEZOX3ZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEpZ3BhKGluc3QsICJ2a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKworICAgIC8vIC0tLS0gVktfRVhUX21ldGFsX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgIHRhYmxlLT5DcmVhdGVNZXRhbFN1cmZhY2VFWFQgPSAoUEZOX3ZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKWdwYShpbnN0LCAidmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKKyAgICAvLyAtLS0tIFZLX05WX2Nvb3BlcmF0aXZlX21hdHJpeCBleHRlbnNpb24gY29tbWFuZHMKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIik7CisKKyAgICAvLyAtLS0tIFZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKWdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYiKTsKKworICAgIC8vIC0tLS0gVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVClncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX2hlYWRsZXNzX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgdGFibGUtPkNyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCA9IChQRk5fdmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQpZ3BhKGluc3QsICJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCIpOworfQorCisvLyBEZXZpY2UgY29tbWFuZCBsb29rdXAgZnVuY3Rpb24KK1ZLQVBJX0FUVFIgdm9pZCogVktBUElfQ0FMTCBsb2FkZXJfbG9va3VwX2RldmljZV9kaXNwYXRjaF90YWJsZShjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqdGFibGUsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpZiAoIW5hbWUgfHwgbmFtZVswXSAhPSAndicgfHwgbmFtZVsxXSAhPSAnaycpIHJldHVybiBOVUxMOworCisgICAgbmFtZSArPSAyOworCisgICAgLy8gLS0tLSBDb3JlIDFfMCBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXREZXZpY2VQcm9jQWRkciIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0RGV2aWNlUHJvY0FkZHI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lEZXZpY2UiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lEZXZpY2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldERldmljZVF1ZXVlIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXREZXZpY2VRdWV1ZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUXVldWVTdWJtaXQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlF1ZXVlU3VibWl0OworICAgIGlmICghc3RyY21wKG5hbWUsICJRdWV1ZVdhaXRJZGxlIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5RdWV1ZVdhaXRJZGxlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXZpY2VXYWl0SWRsZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGV2aWNlV2FpdElkbGU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkFsbG9jYXRlTWVtb3J5IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5BbGxvY2F0ZU1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRnJlZU1lbW9yeSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RnJlZU1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWFwTWVtb3J5IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5NYXBNZW1vcnk7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlVubWFwTWVtb3J5IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5Vbm1hcE1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzOworICAgIGlmICghc3RyY21wKG5hbWUsICJJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5JbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXREZXZpY2VNZW1vcnlDb21taXRtZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJCaW5kQnVmZmVyTWVtb3J5IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5CaW5kQnVmZmVyTWVtb3J5OworICAgIGlmICghc3RyY21wKG5hbWUsICJCaW5kSW1hZ2VNZW1vcnkiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkJpbmRJbWFnZU1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJRdWV1ZUJpbmRTcGFyc2UiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlF1ZXVlQmluZFNwYXJzZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlRmVuY2UiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZUZlbmNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95RmVuY2UiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lGZW5jZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXRGZW5jZXMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlJlc2V0RmVuY2VzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRGZW5jZVN0YXR1cyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0RmVuY2VTdGF0dXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIldhaXRGb3JGZW5jZXMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPldhaXRGb3JGZW5jZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVNlbWFwaG9yZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlU2VtYXBob3JlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95U2VtYXBob3JlIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95U2VtYXBob3JlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVFdmVudCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlRXZlbnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lFdmVudCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveUV2ZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRFdmVudFN0YXR1cyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0RXZlbnRTdGF0dXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNldEV2ZW50IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5TZXRFdmVudDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXRFdmVudCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+UmVzZXRFdmVudDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlUXVlcnlQb29sIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVRdWVyeVBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lRdWVyeVBvb2wiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lRdWVyeVBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFF1ZXJ5UG9vbFJlc3VsdHMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFF1ZXJ5UG9vbFJlc3VsdHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUJ1ZmZlciIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlQnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95QnVmZmVyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95QnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVCdWZmZXJWaWV3IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVCdWZmZXJWaWV3OworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95QnVmZmVyVmlldyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveUJ1ZmZlclZpZXc7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUltYWdlIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveUltYWdlIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95SW1hZ2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUltYWdlVmlldyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlSW1hZ2VWaWV3OworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95SW1hZ2VWaWV3IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95SW1hZ2VWaWV3OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVTaGFkZXJNb2R1bGUiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZVNoYWRlck1vZHVsZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVNoYWRlck1vZHVsZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveVNoYWRlck1vZHVsZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlUGlwZWxpbmVDYWNoZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlUGlwZWxpbmVDYWNoZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVBpcGVsaW5lQ2FjaGUiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lQaXBlbGluZUNhY2hlOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaXBlbGluZUNhY2hlRGF0YSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGlwZWxpbmVDYWNoZURhdGE7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lcmdlUGlwZWxpbmVDYWNoZXMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPk1lcmdlUGlwZWxpbmVDYWNoZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVHcmFwaGljc1BpcGVsaW5lczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlQ29tcHV0ZVBpcGVsaW5lczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVBpcGVsaW5lIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95UGlwZWxpbmU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVBpcGVsaW5lTGF5b3V0IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVQaXBlbGluZUxheW91dDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVBpcGVsaW5lTGF5b3V0IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95UGlwZWxpbmVMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVNhbXBsZXIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZVNhbXBsZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lTYW1wbGVyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95U2FtcGxlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlRGVzY3JpcHRvclNldExheW91dDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVEZXNjcmlwdG9yUG9vbCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlRGVzY3JpcHRvclBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lEZXNjcmlwdG9yUG9vbCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJSZXNldERlc2NyaXB0b3JQb29sIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5SZXNldERlc2NyaXB0b3JQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJBbGxvY2F0ZURlc2NyaXB0b3JTZXRzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5BbGxvY2F0ZURlc2NyaXB0b3JTZXRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJGcmVlRGVzY3JpcHRvclNldHMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkZyZWVEZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiVXBkYXRlRGVzY3JpcHRvclNldHMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlVwZGF0ZURlc2NyaXB0b3JTZXRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVGcmFtZWJ1ZmZlciIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlRnJhbWVidWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lGcmFtZWJ1ZmZlciIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveUZyYW1lYnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVSZW5kZXJQYXNzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVSZW5kZXJQYXNzOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95UmVuZGVyUGFzcyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveVJlbmRlclBhc3M7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFJlbmRlckFyZWFHcmFudWxhcml0eSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVDb21tYW5kUG9vbCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlQ29tbWFuZFBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lDb21tYW5kUG9vbCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveUNvbW1hbmRQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJSZXNldENvbW1hbmRQb29sIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5SZXNldENvbW1hbmRQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5BbGxvY2F0ZUNvbW1hbmRCdWZmZXJzOworICAgIGlmICghc3RyY21wKG5hbWUsICJGcmVlQ29tbWFuZEJ1ZmZlcnMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkZyZWVDb21tYW5kQnVmZmVyczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQmVnaW5Db21tYW5kQnVmZmVyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5CZWdpbkNvbW1hbmRCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVuZENvbW1hbmRCdWZmZXIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkVuZENvbW1hbmRCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlJlc2V0Q29tbWFuZEJ1ZmZlciIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+UmVzZXRDb21tYW5kQnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCaW5kUGlwZWxpbmUiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEJpbmRQaXBlbGluZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0Vmlld3BvcnQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldFZpZXdwb3J0OworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRTY2lzc29yIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRTZXRTY2lzc29yOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRMaW5lV2lkdGgiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldExpbmVXaWR0aDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0RGVwdGhCaWFzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRTZXREZXB0aEJpYXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldEJsZW5kQ29uc3RhbnRzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRTZXRCbGVuZENvbnN0YW50czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0RGVwdGhCb3VuZHMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldERlcHRoQm91bmRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2siKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldFN0ZW5jaWxDb21wYXJlTWFzazsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0U3RlbmNpbFdyaXRlTWFzayIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kU2V0U3RlbmNpbFdyaXRlTWFzazsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kU2V0U3RlbmNpbFJlZmVyZW5jZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZERlc2NyaXB0b3JTZXRzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRCaW5kRGVzY3JpcHRvclNldHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEJpbmRJbmRleEJ1ZmZlciIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQmluZEluZGV4QnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCaW5kVmVydGV4QnVmZmVycyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQmluZFZlcnRleEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXciKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZERyYXc7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdJbmRleGVkIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWREcmF3SW5kZXhlZDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRHJhd0luZGlyZWN0IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWREcmF3SW5kaXJlY3Q7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdJbmRleGVkSW5kaXJlY3QiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZERyYXdJbmRleGVkSW5kaXJlY3Q7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERpc3BhdGNoIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWREaXNwYXRjaDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRGlzcGF0Y2hJbmRpcmVjdCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kRGlzcGF0Y2hJbmRpcmVjdDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ29weUJ1ZmZlciIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQ29weUJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ29weUltYWdlIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRDb3B5SW1hZ2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEJsaXRJbWFnZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQmxpdEltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDb3B5QnVmZmVyVG9JbWFnZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQ29weUJ1ZmZlclRvSW1hZ2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZENvcHlJbWFnZVRvQnVmZmVyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRDb3B5SW1hZ2VUb0J1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kVXBkYXRlQnVmZmVyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRVcGRhdGVCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEZpbGxCdWZmZXIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEZpbGxCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZENsZWFyQ29sb3JJbWFnZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQ2xlYXJDb2xvckltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDbGVhckF0dGFjaG1lbnRzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRDbGVhckF0dGFjaG1lbnRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRSZXNvbHZlSW1hZ2UiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFJlc29sdmVJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0RXZlbnQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldEV2ZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRSZXNldEV2ZW50IikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRSZXNldEV2ZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRXYWl0RXZlbnRzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRXYWl0RXZlbnRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRQaXBlbGluZUJhcnJpZXIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFBpcGVsaW5lQmFycmllcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmVnaW5RdWVyeSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQmVnaW5RdWVyeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRW5kUXVlcnkiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEVuZFF1ZXJ5OworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRSZXNldFF1ZXJ5UG9vbCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kUmVzZXRRdWVyeVBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFdyaXRlVGltZXN0YW1wIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRXcml0ZVRpbWVzdGFtcDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZENvcHlRdWVyeVBvb2xSZXN1bHRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRQdXNoQ29uc3RhbnRzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRQdXNoQ29uc3RhbnRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCZWdpblJlbmRlclBhc3MiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEJlZ2luUmVuZGVyUGFzczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kTmV4dFN1YnBhc3MiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZE5leHRTdWJwYXNzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRFbmRSZW5kZXJQYXNzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRFbmRSZW5kZXJQYXNzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRFeGVjdXRlQ29tbWFuZHMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEV4ZWN1dGVDb21tYW5kczsKKworICAgIC8vIC0tLS0gQ29yZSAxXzEgY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQmluZEJ1ZmZlck1lbW9yeTIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkJpbmRCdWZmZXJNZW1vcnkyOworICAgIGlmICghc3RyY21wKG5hbWUsICJCaW5kSW1hZ2VNZW1vcnkyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5CaW5kSW1hZ2VNZW1vcnkyOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldERldmljZU1hc2siKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldERldmljZU1hc2s7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERpc3BhdGNoQmFzZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kRGlzcGF0Y2hCYXNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlRyaW1Db21tYW5kUG9vbCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+VHJpbUNvbW1hbmRQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXREZXZpY2VRdWV1ZTIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldERldmljZVF1ZXVlMjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+VXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0OworCisgICAgLy8gLS0tLSBWS19LSFJfc3dhcGNoYWluIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVTd2FwY2hhaW5LSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZVN3YXBjaGFpbktIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVN3YXBjaGFpbktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveVN3YXBjaGFpbktIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0U3dhcGNoYWluSW1hZ2VzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRTd2FwY2hhaW5JbWFnZXNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkFjcXVpcmVOZXh0SW1hZ2VLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkFjcXVpcmVOZXh0SW1hZ2VLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlF1ZXVlUHJlc2VudEtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+UXVldWVQcmVzZW50S0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkFjcXVpcmVOZXh0SW1hZ2UyS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5BY3F1aXJlTmV4dEltYWdlMktIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2Rpc3BsYXlfc3dhcGNoYWluIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldERldmljZU1hc2tLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldERldmljZU1hc2tLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERpc3BhdGNoQmFzZUtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kRGlzcGF0Y2hCYXNlS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfbWFpbnRlbmFuY2UxIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJUcmltQ29tbWFuZFBvb2xLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlRyaW1Db21tYW5kUG9vbEtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX21lbW9yeV93aW4zMiBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldE1lbW9yeVdpbjMySGFuZGxlS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRNZW1vcnlXaW4zMkhhbmRsZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldE1lbW9yeUZkS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRNZW1vcnlGZEtIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRNZW1vcnlGZFByb3BlcnRpZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKG5hbWUsICJJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+SW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW1wb3J0U2VtYXBob3JlRmRLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkltcG9ydFNlbWFwaG9yZUZkS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRTZW1hcGhvcmVGZEtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0U2VtYXBob3JlRmRLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRQdXNoRGVzY3JpcHRvclNldEtIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVSZW5kZXJQYXNzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlUmVuZGVyUGFzczJLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEJlZ2luUmVuZGVyUGFzczJLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEJlZ2luUmVuZGVyUGFzczJLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZE5leHRTdWJwYXNzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kTmV4dFN1YnBhc3MyS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRFbmRSZW5kZXJQYXNzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kRW5kUmVuZGVyUGFzczJLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFN3YXBjaGFpblN0YXR1c0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0U3dhcGNoYWluU3RhdHVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKG5hbWUsICJJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5JbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEZlbmNlV2luMzJIYW5kbGVLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldEZlbmNlV2luMzJIYW5kbGVLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfZmQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkltcG9ydEZlbmNlRmRLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkltcG9ydEZlbmNlRmRLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEZlbmNlRmRLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldEZlbmNlRmRLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9wZXJmb3JtYW5jZV9xdWVyeSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkFjcXVpcmVQcm9maWxpbmdMb2NrS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+UmVsZWFzZVByb2ZpbGluZ0xvY2tLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfYmluZF9tZW1vcnkyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJCaW5kQnVmZmVyTWVtb3J5MktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+QmluZEJ1ZmZlck1lbW9yeTJLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkJpbmRJbWFnZU1lbW9yeTJLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkJpbmRJbWFnZU1lbW9yeTJLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9tYWludGVuYW5jZTMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdJbmRpcmVjdENvdW50S0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWREcmF3SW5kaXJlY3RDb3VudEtIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJXYWl0U2VtYXBob3Jlc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+V2FpdFNlbWFwaG9yZXNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNpZ25hbFNlbWFwaG9yZUtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+U2lnbmFsU2VtYXBob3JlS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z19tYXJrZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERlYnVnTWFya2VyQmVnaW5FWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZERlYnVnTWFya2VyQmVnaW5FWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERlYnVnTWFya2VyRW5kRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWREZWJ1Z01hcmtlckVuZEVYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZERlYnVnTWFya2VySW5zZXJ0RVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEJlZ2luUXVlcnlJbmRleGVkRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRW5kUXVlcnlJbmRleGVkRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRFbmRRdWVyeUluZGV4ZWRFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUOworCisgICAgLy8gLS0tLSBWS19OVlhfaW1hZ2Vfdmlld19oYW5kbGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEltYWdlVmlld0hhbmRsZU5WWCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0SW1hZ2VWaWV3SGFuZGxlTlZYOworCisgICAgLy8gLS0tLSBWS19BTURfZHJhd19pbmRpcmVjdF9jb3VudCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRHJhd0luZGlyZWN0Q291bnRBTUQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZERyYXdJbmRpcmVjdENvdW50QU1EOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRDsKKworICAgIC8vIC0tLS0gVktfQU1EX3NoYWRlcl9pbmZvIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRTaGFkZXJJbmZvQU1EIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRTaGFkZXJJbmZvQU1EOworCisgICAgLy8gLS0tLSBWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRNZW1vcnlXaW4zMkhhbmRsZU5WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRNZW1vcnlXaW4zMkhhbmRsZU5WOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUOworCisgICAgLy8gLS0tLSBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRQcm9jZXNzQ29tbWFuZHNOVlg7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVPYmplY3RUYWJsZU5WWCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlT2JqZWN0VGFibGVOVlg7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lPYmplY3RUYWJsZU5WWCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveU9iamVjdFRhYmxlTlZYOworICAgIGlmICghc3RyY21wKG5hbWUsICJSZWdpc3Rlck9iamVjdHNOVlgiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlJlZ2lzdGVyT2JqZWN0c05WWDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiVW5yZWdpc3Rlck9iamVjdHNOVlgiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlVucmVnaXN0ZXJPYmplY3RzTlZYOworCisgICAgLy8gLS0tLSBWS19OVl9jbGlwX3NwYWNlX3dfc2NhbGluZyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlY7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNwbGF5X2NvbnRyb2wgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRpc3BsYXlQb3dlckNvbnRyb2xFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRpc3BsYXlQb3dlckNvbnRyb2xFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5SZWdpc3RlckRpc3BsYXlFdmVudEVYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0U3dhcGNoYWluQ291bnRlckVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0U3dhcGNoYWluQ291bnRlckVYVDsKKworICAgIC8vIC0tLS0gVktfR09PR0xFX2Rpc3BsYXlfdGltaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEU7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNjYXJkX3JlY3RhbmdsZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9oZHJfbWV0YWRhdGEgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNldEhkck1ldGFkYXRhRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5TZXRIZHJNZXRhZGF0YUVYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX3V0aWxzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+U2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5RdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kRW5kRGVidWdVdGlsc0xhYmVsRVhUOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVDsKKworICAgIC8vIC0tLS0gVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kU2V0U2FtcGxlTG9jYXRpb25zRVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+TWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUOworCisgICAgLy8gLS0tLSBWS19OVl9zaGFkaW5nX3JhdGVfaW1hZ2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlY7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlY7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlY7CisKKyAgICAvLyAtLS0tIFZLX05WX3JheV90cmFjaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kVHJhY2VSYXlzTlYiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFRyYWNlUmF5c05WOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlY7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlY7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNvbXBpbGVEZWZlcnJlZE5WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5Db21waWxlRGVmZXJyZWROVjsKKworICAgIC8vIC0tLS0gVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0IGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDsKKworICAgIC8vIC0tLS0gVktfQU1EX2J1ZmZlcl9tYXJrZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFdyaXRlQnVmZmVyTWFya2VyQU1EIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRXcml0ZUJ1ZmZlck1hcmtlckFNRDsKKworICAgIC8vIC0tLS0gVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUOworCisgICAgLy8gLS0tLSBWS19OVl9tZXNoX3NoYWRlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRHJhd01lc2hUYXNrc05WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWREcmF3TWVzaFRhc2tzTlY7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVjsKKworICAgIC8vIC0tLS0gVktfTlZfc2Npc3Nvcl9leGNsdXNpdmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WOworCisgICAgLy8gLS0tLSBWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0Q2hlY2twb2ludE5WIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRTZXRDaGVja3BvaW50TlY7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFF1ZXVlQ2hlY2twb2ludERhdGFOViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UXVldWVDaGVja3BvaW50RGF0YU5WOworCisgICAgLy8gLS0tLSBWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMOworICAgIGlmICghc3RyY21wKG5hbWUsICJVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5VbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5BY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+UmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworICAgIGlmICghc3RyY21wKG5hbWUsICJRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5RdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMOworCisgICAgLy8gLS0tLSBWS19BTURfZGlzcGxheV9uYXRpdmVfaGRyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJTZXRMb2NhbERpbW1pbmdBTUQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlNldExvY2FsRGltbWluZ0FNRDsKKworICAgIC8vIC0tLS0gVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+QWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+UmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQ7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19FWFRfbGluZV9yYXN0ZXJpemF0aW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRMaW5lU3RpcHBsZUVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q21kU2V0TGluZVN0aXBwbGVFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9ob3N0X3F1ZXJ5X3Jlc2V0IGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJSZXNldFF1ZXJ5UG9vbEVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+UmVzZXRRdWVyeVBvb2xFWFQ7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gSW5zdGFuY2UgY29tbWFuZCBsb29rdXAgZnVuY3Rpb24KK1ZLQVBJX0FUVFIgdm9pZCogVktBUElfQ0FMTCBsb2FkZXJfbG9va3VwX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnRhYmxlLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpmb3VuZF9uYW1lKSB7CisgICAgaWYgKCFuYW1lIHx8IG5hbWVbMF0gIT0gJ3YnIHx8IG5hbWVbMV0gIT0gJ2snKSB7CisgICAgICAgICpmb3VuZF9uYW1lID0gZmFsc2U7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgICpmb3VuZF9uYW1lID0gdHJ1ZTsKKyAgICBuYW1lICs9IDI7CisKKyAgICAvLyAtLS0tIENvcmUgMV8wIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lJbnN0YW5jZSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RGVzdHJveUluc3RhbmNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEluc3RhbmNlUHJvY0FkZHIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisKKyAgICAvLyAtLS0tIENvcmUgMV8xIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczsKKworICAgIC8vIC0tLS0gVktfS0hSX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lTdXJmYWNlS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5EZXN0cm95U3VyZmFjZUtIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfc3dhcGNoYWluIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZURpc3BsYXlNb2RlS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVEaXNwbGF5TW9kZUtIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl94bGliX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVhsaWJTdXJmYWNlS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVYbGliU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX3hjYl9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVhjYlN1cmZhY2VLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZVhjYlN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfd2F5bGFuZF9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlV2F5bGFuZFN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl9hbmRyb2lkX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5DcmVhdGVBbmRyb2lkU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX3dpbjMyX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVXaW4zMlN1cmZhY2VLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZVdpbjMyU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9wZXJmb3JtYW5jZV9xdWVyeSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjsKKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX3JlcG9ydCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlYnVnUmVwb3J0TWVzc2FnZUVYVDsKKworICAgIC8vIC0tLS0gVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1A7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCisgICAgLy8gLS0tLSBWS19OVl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVjsKKworICAgIC8vIC0tLS0gVktfTk5fdmlfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlVmlTdXJmYWNlTk4iKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZVZpU3VyZmFjZU5OOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCisgICAgLy8gLS0tLSBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYOworCisgICAgLy8gLS0tLSBWS19FWFRfZGlyZWN0X21vZGVfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVsZWFzZURpc3BsYXlFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPlJlbGVhc2VEaXNwbGF5RVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfYWNxdWlyZV94bGliX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgIGlmICghc3RyY21wKG5hbWUsICJBY3F1aXJlWGxpYkRpc3BsYXlFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkFjcXVpcmVYbGliRGlzcGxheUVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkdldFJhbmRST3V0cHV0RGlzcGxheUVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVDsKKworICAgIC8vIC0tLS0gVktfTVZLX2lvc19zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUlPU1N1cmZhY2VNVksiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZUlPU1N1cmZhY2VNVks7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworICAgIC8vIC0tLS0gVktfTVZLX21hY29zX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVNYWNPU1N1cmZhY2VNVksiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZU1hY09TU3VyZmFjZU1WSzsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z191dGlscyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgIGlmICghc3RyY21wKG5hbWUsICJTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+U3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUIikpIHJldHVybiAodm9pZCAqKXRhYmxlLT5HZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVDsKKworICAgIC8vIC0tLS0gVktfRlVDSFNJQV9pbWFnZXBpcGVfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+Q3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUE7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKworICAgIC8vIC0tLS0gVktfRVhUX21ldGFsX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVNZXRhbFN1cmZhY2VFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZU1ldGFsU3VyZmFjZUVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKKyAgICAvLyAtLS0tIFZLX05WX2Nvb3BlcmF0aXZlX21hdHJpeCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVjsKKworICAgIC8vIC0tLS0gVktfTlZfY292ZXJhZ2VfcmVkdWN0aW9uX21vZGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WOworCisgICAgLy8gLS0tLSBWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0VYVF9oZWFkbGVzc19zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQiKSkgcmV0dXJuICh2b2lkICopdGFibGUtPkNyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVDsKKworICAgICpmb3VuZF9uYW1lID0gZmFsc2U7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIGRpc3AtPkdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKGRldmljZSwgaGVhcEluZGV4LCBsb2NhbERldmljZUluZGV4LCByZW1vdGVEZXZpY2VJbmRleCwgcFBlZXJNZW1vcnlGZWF0dXJlcyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldERldmljZU1hc2tLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzaykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRTZXREZXZpY2VNYXNrS0hSKGNvbW1hbmRCdWZmZXIsIGRldmljZU1hc2spOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZERpc3BhdGNoQmFzZUtIUihjb21tYW5kQnVmZmVyLCBiYXNlR3JvdXBYLCBiYXNlR3JvdXBZLCBiYXNlR3JvdXBaLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaKTsKK30KKworCisvLyAtLS0tIFZLX0tIUl9tYWludGVuYW5jZTEgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVHJpbUNvbW1hbmRQb29sS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIGRpc3AtPlRyaW1Db21tYW5kUG9vbEtIUihkZXZpY2UsIGNvbW1hbmRQb29sLCBmbGFncyk7Cit9CisKKworLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRNZW1vcnlXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBHZXRXaW4zMkhhbmRsZUluZm8sIHBIYW5kbGUpOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoZGV2aWNlLCBoYW5kbGVUeXBlLCBoYW5kbGUsIHBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMpOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRNZW1vcnlGZEtIUihkZXZpY2UsIHBHZXRGZEluZm8sIHBGZCk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsCisgICAgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICBwTWVtb3J5RmRQcm9wZXJ0aWVzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldE1lbW9yeUZkUHJvcGVydGllc0tIUihkZXZpY2UsIGhhbmRsZVR5cGUsIGZkLCBwTWVtb3J5RmRQcm9wZXJ0aWVzKTsKK30KKworCisvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+SW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvKTsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBHZXRXaW4zMkhhbmRsZUluZm8sIHBIYW5kbGUpOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfZmQgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5JbXBvcnRTZW1hcGhvcmVGZEtIUihkZXZpY2UsIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8pOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFNlbWFwaG9yZUZkS0hSKGRldmljZSwgcEdldEZkSW5mbywgcEZkKTsKK30KKworCisvLyAtLS0tIFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIHNldCwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoY29tbWFuZEJ1ZmZlciwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBsYXlvdXQsIHNldCwgcERhdGEpOworfQorCisKKy8vIC0tLS0gVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIGRpc3AtPlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yU2V0LCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBEYXRhKTsKK30KKworCisvLyAtLS0tIFZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlUmVuZGVyUGFzczJLSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFJlbmRlclBhc3MpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpblJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRCZWdpblJlbmRlclBhc3MyS0hSKGNvbW1hbmRCdWZmZXIsIHBSZW5kZXJQYXNzQmVnaW4sIHBTdWJwYXNzQmVnaW5JbmZvKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kTmV4dFN1YnBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZE5leHRTdWJwYXNzMktIUihjb21tYW5kQnVmZmVyLCBwU3VicGFzc0JlZ2luSW5mbywgcFN1YnBhc3NFbmRJbmZvKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZEVuZFJlbmRlclBhc3MyS0hSKGNvbW1hbmRCdWZmZXIsIHBTdWJwYXNzRW5kSW5mbyk7Cit9CisKKworLy8gLS0tLSBWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTd2FwY2hhaW5TdGF0dXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0U3dhcGNoYWluU3RhdHVzS0hSKGRldmljZSwgc3dhcGNoYWluKTsKK30KKworCisvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV93aW4zMiBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogICAgICBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+SW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbyk7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRGZW5jZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSk7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKy8vIC0tLS0gVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBJbXBvcnRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqICAgICAgICAgICAgICAgcEltcG9ydEZlbmNlRmRJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkltcG9ydEZlbmNlRmRLSFIoZGV2aWNlLCBwSW1wb3J0RmVuY2VGZEluZm8pOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0RmVuY2VGZEtIUihkZXZpY2UsIHBHZXRGZEluZm8sIHBGZCk7Cit9CisKKworLy8gLS0tLSBWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckNvdW50LAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJzLAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqICAgICAgICAgcENvdW50ZXJEZXNjcmlwdGlvbnMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUih1bndyYXBwZWRfcGh5c19kZXYsIHF1ZXVlRmFtaWx5SW5kZXgsIHBDb3VudGVyQ291bnQsIHBDb3VudGVycywgcENvdW50ZXJEZXNjcmlwdGlvbnMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9FbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJDb3VudCwKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogICAgICAgICAgICAgICAgICAgIHBDb3VudGVycywKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiAgICAgICAgIHBDb3VudGVyRGVzY3JpcHRpb25zKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5kaXNwYXRjaC5FbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKSB7CisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgYXNzb2NpYXRlZCB3aXRoIFZrUGh5c2ljYWxEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSIik7CisgICAgfQorICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcXVldWVGYW1pbHlJbmRleCwgcENvdW50ZXJDb3VudCwgcENvdW50ZXJzLCBwQ291bnRlckRlc2NyaXB0aW9ucyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqICBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtUGFzc2VzKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sIHBOdW1QYXNzZXMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqICBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtUGFzc2VzKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUikgeworICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiSUNEIGFzc29jaWF0ZWQgd2l0aCBWa1BoeXNpY2FsRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiKTsKKyAgICB9CisgICAgaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sIHBOdW1QYXNzZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqICAgICAgICBwSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5BY3F1aXJlUHJvZmlsaW5nTG9ja0tIUihkZXZpY2UsIHBJbmZvKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5SZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihkZXZpY2UpOworfQorCisKKy8vIC0tLS0gVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIGRpc3AtPkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihkZXZpY2UsIHBJbmZvLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKKworLy8gLS0tLSBWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5DcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBZY2JjckNvbnZlcnNpb24pOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5EZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihkZXZpY2UsIHljYmNyQ29udmVyc2lvbiwgcEFsbG9jYXRvcik7Cit9CisKKworLy8gLS0tLSBWS19LSFJfYmluZF9tZW1vcnkyIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQnVmZmVyTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkJpbmRCdWZmZXJNZW1vcnkyS0hSKGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kSW1hZ2VNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+QmluZEltYWdlTWVtb3J5MktIUihkZXZpY2UsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MpOworfQorCisKKy8vIC0tLS0gVktfS0hSX21haW50ZW5hbmNlMyBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqICAgICAgICAgICAgICAgcFN1cHBvcnQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwU3VwcG9ydCk7Cit9CisKKworLy8gLS0tLSBWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZERyYXdJbmRpcmVjdENvdW50S0hSKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKK30KKworCisvLyAtLS0tIFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoZGV2aWNlLCBzZW1hcGhvcmUsIHBWYWx1ZSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBXYWl0U2VtYXBob3Jlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiAgICAgICAgICAgICAgIHBXYWl0SW5mbywKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+V2FpdFNlbWFwaG9yZXNLSFIoZGV2aWNlLCBwV2FpdEluZm8sIHRpbWVvdXQpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2lnbmFsU2VtYXBob3JlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogICAgICAgICAgICAgcFNpZ25hbEluZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+U2lnbmFsU2VtYXBob3JlS0hSKGRldmljZSwgcFNpZ25hbEluZm8pOworfQorCisKKy8vIC0tLS0gVktfS0hSX3BpcGVsaW5lX2V4ZWN1dGFibGVfcHJvcGVydGllcyBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiogICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXhlY3V0YWJsZUNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogICAgICAgICAgcFByb3BlcnRpZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihkZXZpY2UsIHBQaXBlbGluZUluZm8sIHBFeGVjdXRhYmxlQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdGlzdGljQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqICAgICAgICAgICBwU3RhdGlzdGljcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKGRldmljZSwgcEV4ZWN1dGFibGVJbmZvLCBwU3RhdGlzdGljQ291bnQsIHBTdGF0aXN0aWNzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogICAgICAgICAgcEV4ZWN1dGFibGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUihkZXZpY2UsIHBFeGVjdXRhYmxlSW5mbywgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgcEludGVybmFsUmVwcmVzZW50YXRpb25zKTsKK30KKworCisvLyAtLS0tIFZLX0VYVF9kZWJ1Z19tYXJrZXIgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgcFRhZ0luZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCBsb2NhbF90YWdfaW5mbzsKKyAgICBtZW1jcHkoJmxvY2FsX3RhZ19pbmZvLCBwVGFnSW5mbywgc2l6ZW9mKFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKSk7CisgICAgLy8gSWYgdGhpcyBpcyBhIHBoeXNpY2FsIGRldmljZSwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuCisgICAgaWYgKHBUYWdJbmZvLT5vYmplY3RUeXBlID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhUKSB7CisgICAgICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICpwaHlzX2Rldl90cmFtcCA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqKSh1aW50cHRyX3QpcFRhZ0luZm8tPm9iamVjdDsKKyAgICAgICAgbG9jYWxfdGFnX2luZm8ub2JqZWN0ID0gKHVpbnQ2NF90KSh1aW50cHRyX3QpcGh5c19kZXZfdHJhbXAtPnBoeXNfZGV2OworICAgIH0KKyAgICByZXR1cm4gZGlzcC0+RGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoZGV2aWNlLCAmbG9jYWxfdGFnX2luZm8pOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9EZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogICAgICAgIHBUYWdJbmZvKSB7CisgICAgdWludDMyX3QgaWNkX2luZGV4ID0gMDsKKyAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2OworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gbG9hZGVyX2dldF9pY2RfYW5kX2RldmljZShkZXZpY2UsICZkZXYsICZpY2RfaW5kZXgpOworICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKSB7CisgICAgICAgIFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUIGxvY2FsX3RhZ19pbmZvOworICAgICAgICBtZW1jcHkoJmxvY2FsX3RhZ19pbmZvLCBwVGFnSW5mbywgc2l6ZW9mKFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKSk7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwaHlzaWNhbCBkZXZpY2UsIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLgorICAgICAgICBpZiAocFRhZ0luZm8tPm9iamVjdFR5cGUgPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQpIHsKKyAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKSh1aW50cHRyX3QpcFRhZ0luZm8tPm9iamVjdDsKKyAgICAgICAgICAgIGxvY2FsX3RhZ19pbmZvLm9iamVjdCA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2OworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgS0hSX3N1cmZhY2UsIGFuZCB0aGUgSUNEIGhhcyBjcmVhdGVkIGl0cyBvd24sIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLgorICAgICAgICB9IGVsc2UgaWYgKHBUYWdJbmZvLT5vYmplY3RUeXBlID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZVN3YXBjaGFpbktIUikgeworICAgICAgICAgICAgICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHVpbnRwdHJfdClwVGFnSW5mby0+b2JqZWN0OworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcykgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF90YWdfaW5mby5vYmplY3QgPSAodWludDY0X3QpaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoZGV2aWNlLCAmbG9jYWxfdGFnX2luZm8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqICAgICAgIHBOYW1lSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBsb2NhbF9uYW1lX2luZm87CisgICAgbWVtY3B5KCZsb2NhbF9uYW1lX2luZm8sIHBOYW1lSW5mbywgc2l6ZW9mKFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCkpOworICAgIC8vIElmIHRoaXMgaXMgYSBwaHlzaWNhbCBkZXZpY2UsIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLgorICAgIGlmIChwTmFtZUluZm8tPm9iamVjdFR5cGUgPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQpIHsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKnBoeXNfZGV2X3RyYW1wID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICopKHVpbnRwdHJfdClwTmFtZUluZm8tPm9iamVjdDsKKyAgICAgICAgbG9jYWxfbmFtZV9pbmZvLm9iamVjdCA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3RyYW1wLT5waHlzX2RldjsKKyAgICB9CisgICAgcmV0dXJuIGRpc3AtPkRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVChkZXZpY2UsICZsb2NhbF9uYW1lX2luZm8pOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9EZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiAgICAgICBwTmFtZUluZm8pIHsKKyAgICB1aW50MzJfdCBpY2RfaW5kZXggPSAwOworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXY7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBsb2FkZXJfZ2V0X2ljZF9hbmRfZGV2aWNlKGRldmljZSwgJmRldiwgJmljZF9pbmRleCk7CisgICAgaWYgKE5VTEwgIT0gaWNkX3Rlcm0gJiYgTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKSB7CisgICAgICAgIFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBsb2NhbF9uYW1lX2luZm87CisgICAgICAgIG1lbWNweSgmbG9jYWxfbmFtZV9pbmZvLCBwTmFtZUluZm8sIHNpemVvZihWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQpKTsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHBoeXNpY2FsIGRldmljZSwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuCisgICAgICAgIGlmIChwTmFtZUluZm8tPm9iamVjdFR5cGUgPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQpIHsKKyAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKSh1aW50cHRyX3QpcE5hbWVJbmZvLT5vYmplY3Q7CisgICAgICAgICAgICBsb2NhbF9uYW1lX2luZm8ub2JqZWN0ID0gKHVpbnQ2NF90KSh1aW50cHRyX3QpcGh5c19kZXZfdGVybS0+cGh5c19kZXY7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBLSFJfc3VyZmFjZSwgYW5kIHRoZSBJQ0QgaGFzIGNyZWF0ZWQgaXRzIG93biwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuCisgICAgICAgIH0gZWxzZSBpZiAocE5hbWVJbmZvLT5vYmplY3RUeXBlID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZVN3YXBjaGFpbktIUikgeworICAgICAgICAgICAgICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHVpbnRwdHJfdClwTmFtZUluZm8tPm9iamVjdDsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfbmFtZV9pbmZvLm9iamVjdCA9ICh1aW50NjRfdClpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5EZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoZGV2aWNlLCAmbG9jYWxfbmFtZV9pbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERlYnVnTWFya2VyQmVnaW5FWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kRGVidWdNYXJrZXJCZWdpbkVYVChjb21tYW5kQnVmZmVyLCBwTWFya2VySW5mbyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERlYnVnTWFya2VyRW5kRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWREZWJ1Z01hcmtlckVuZEVYVChjb21tYW5kQnVmZmVyKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kRGVidWdNYXJrZXJJbnNlcnRFWFQoY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8pOworfQorCisKKy8vIC0tLS0gVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjayBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwU2l6ZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVChjb21tYW5kQnVmZmVyLCBmaXJzdEJpbmRpbmcsIGJpbmRpbmdDb3VudCwgcEJ1ZmZlcnMsIHBPZmZzZXRzLCBwU2l6ZXMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q291bnRlckJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVyT2Zmc2V0cykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKGNvbW1hbmRCdWZmZXIsIGZpcnN0Q291bnRlckJ1ZmZlciwgY291bnRlckJ1ZmZlckNvdW50LCBwQ291bnRlckJ1ZmZlcnMsIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q291bnRlckJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVyT2Zmc2V0cykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVChjb21tYW5kQnVmZmVyLCBmaXJzdENvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJDb3VudCwgcENvdW50ZXJCdWZmZXJzLCBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgZmxhZ3MsIGluZGV4KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kRW5kUXVlcnlJbmRleGVkRVhUKGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnksIGluZGV4KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4U3RyaWRlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVChjb21tYW5kQnVmZmVyLCBpbnN0YW5jZUNvdW50LCBmaXJzdEluc3RhbmNlLCBjb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyT2Zmc2V0LCBjb3VudGVyT2Zmc2V0LCB2ZXJ0ZXhTdHJpZGUpOworfQorCisKKy8vIC0tLS0gVktfTlZYX2ltYWdlX3ZpZXdfaGFuZGxlIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdWludDMyX3QgVktBUElfQ0FMTCBHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRJbWFnZVZpZXdIYW5kbGVOVlgoZGV2aWNlLCBwSW5mbyk7Cit9CisKKworLy8gLS0tLSBWS19BTURfZHJhd19pbmRpcmVjdF9jb3VudCBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZERyYXdJbmRpcmVjdENvdW50QU1EKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKK30KKworCisvLyAtLS0tIFZLX0FNRF9zaGFkZXJfaW5mbyBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0U2hhZGVySW5mb0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3RhZ2UsCisgICAgVmtTaGFkZXJJbmZvVHlwZUFNRCAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvVHlwZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFNoYWRlckluZm9BTUQoZGV2aWNlLCBwaXBlbGluZSwgc2hhZGVyU3RhZ2UsIGluZm9UeXBlLCBwSW5mb1NpemUsIHBJbmZvKTsKK30KKworCisvLyAtLS0tIFZLX0dHUF9zdHJlYW1fZGVzY3JpcHRvcl9zdXJmYWNlIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyNlcnJvcigiTm90IGltcGxlbWVudGVkLiBMaWtlbHkgbmVlZHMgdG8gYmUgbWFudWFsbHkgZ2VuZXJhdGVkISIpOworICAgIHJldHVybiBkaXNwLT5DcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyNlcnJvcigiTm90IGltcGxlbWVudGVkLiBMaWtlbHkgbmVlZHMgdG8gYmUgbWFudWFsbHkgZ2VuZXJhdGVkISIpOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCisvLyAtLS0tIFZLX05WX2V4dGVybmFsX21lbW9yeV93aW4zMiBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRNZW1vcnlXaW4zMkhhbmRsZU5WKGRldmljZSwgbWVtb3J5LCBoYW5kbGVUeXBlLCBwSGFuZGxlKTsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyNlcnJvcigiTm90IGltcGxlbWVudGVkLiBMaWtlbHkgbmVlZHMgdG8gYmUgbWFudWFsbHkgZ2VuZXJhdGVkISIpOworICAgIHJldHVybiBkaXNwLT5DcmVhdGVWaVN1cmZhY2VOTihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlVmlTdXJmYWNlTk4oCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisjZXJyb3IoIk5vdCBpbXBsZW1lbnRlZC4gTGlrZWx5IG5lZWRzIHRvIGJlIG1hbnVhbGx5IGdlbmVyYXRlZCEiKTsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCisvLyAtLS0tIFZLX0VYVF9jb25kaXRpb25hbF9yZW5kZXJpbmcgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogICBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKGNvbW1hbmRCdWZmZXIsIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKGNvbW1hbmRCdWZmZXIpOworfQorCisKKy8vIC0tLS0gVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqICAgICAgICAgIHBQcm9jZXNzQ29tbWFuZHNJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZFByb2Nlc3NDb21tYW5kc05WWChjb21tYW5kQnVmZmVyLCBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogIHBSZXNlcnZlU3BhY2VJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKGNvbW1hbmRCdWZmZXIsIHBSZXNlcnZlU3BhY2VJbmZvKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogICAgICAgICAgICAgICAgcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW5kaXJlY3RDb21tYW5kc0xheW91dCk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAgICAgICAgICAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5EZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChkZXZpY2UsIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIHBBbGxvY2F0b3IpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlT2JqZWN0VGFibGVOVlgoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE9iamVjdFRhYmxlKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgZGlzcC0+RGVzdHJveU9iamVjdFRhYmxlTlZYKGRldmljZSwgb2JqZWN0VGFibGUsIHBBbGxvY2F0b3IpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVnaXN0ZXJPYmplY3RzTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RDb3VudCwKKyAgICBjb25zdCBWa09iamVjdFRhYmxlRW50cnlOVlgqIGNvbnN0KiAgICAgICAgIHBwT2JqZWN0VGFibGVFbnRyaWVzLAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdEluZGljZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+UmVnaXN0ZXJPYmplY3RzTlZYKGRldmljZSwgb2JqZWN0VGFibGUsIG9iamVjdENvdW50LCBwcE9iamVjdFRhYmxlRW50cmllcywgcE9iamVjdEluZGljZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5VbnJlZ2lzdGVyT2JqZWN0c05WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBvYmplY3RDb3VudCwgcE9iamVjdEVudHJ5VHlwZXMsIHBPYmplY3RJbmRpY2VzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqICAgICAgIHBGZWF0dXJlcywKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiAgICAgICAgIHBMaW1pdHMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwLT5HZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCh1bndyYXBwZWRfcGh5c19kZXYsIHBGZWF0dXJlcywgcExpbWl0cyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqICAgICAgIHBGZWF0dXJlcywKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiAgICAgICAgIHBMaW1pdHMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKSB7CisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgYXNzb2NpYXRlZCB3aXRoIFZrUGh5c2ljYWxEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCIpOworICAgIH0KKyAgICBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBGZWF0dXJlcywgcExpbWl0cyk7Cit9CisKKworLy8gLS0tLSBWS19OVl9jbGlwX3NwYWNlX3dfc2NhbGluZyBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqICAgICAgICAgICAgICAgICBwVmlld3BvcnRXU2NhbGluZ3MpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKGNvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBWaWV3cG9ydFdTY2FsaW5ncyk7Cit9CisKKworLy8gLS0tLSBWS19FWFRfZGlzcGxheV9jb250cm9sIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBEaXNwbGF5UG93ZXJDb250cm9sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5UG93ZXJJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkRpc3BsYXlQb3dlckNvbnRyb2xFWFQoZGV2aWNlLCBkaXNwbGF5LCBwRGlzcGxheVBvd2VySW5mbyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWdpc3RlckRldmljZUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICAgcERldmljZUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+UmVnaXN0ZXJEZXZpY2VFdmVudEVYVChkZXZpY2UsIHBEZXZpY2VFdmVudEluZm8sIHBBbGxvY2F0b3IsIHBGZW5jZSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWdpc3RlckRpc3BsYXlFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+UmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoZGV2aWNlLCBkaXNwbGF5LCBwRGlzcGxheUV2ZW50SW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFN3YXBjaGFpbkNvdW50ZXJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUICAgICAgICAgICAgICAgICBjb3VudGVyLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJWYWx1ZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRTd2FwY2hhaW5Db3VudGVyRVhUKGRldmljZSwgc3dhcGNoYWluLCBjb3VudGVyLCBwQ291bnRlclZhbHVlKTsKK30KKworCisvLyAtLS0tIFZLX0dPT0dMRV9kaXNwbGF5X3RpbWluZyBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogICAgICAgICAgICAgICBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoZGV2aWNlLCBzd2FwY2hhaW4sIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LAorICAgIFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSogICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ3MpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRShkZXZpY2UsIHN3YXBjaGFpbiwgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LCBwUHJlc2VudGF0aW9uVGltaW5ncyk7Cit9CisKKworLy8gLS0tLSBWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc2NhcmRSZWN0YW5nbGVzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoY29tbWFuZEJ1ZmZlciwgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLCBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsIHBEaXNjYXJkUmVjdGFuZ2xlcyk7Cit9CisKKworLy8gLS0tLSBWS19FWFRfaGRyX21ldGFkYXRhIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFNldEhkck1ldGFkYXRhRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWlucywKKyAgICBjb25zdCBWa0hkck1ldGFkYXRhRVhUKiAgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIGRpc3AtPlNldEhkck1ldGFkYXRhRVhUKGRldmljZSwgc3dhcGNoYWluQ291bnQsIHBTd2FwY2hhaW5zLCBwTWV0YWRhdGEpOworfQorCisKKy8vIC0tLS0gVktfRVhUX2RlYnVnX3V0aWxzIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogICAgICAgIHBOYW1lSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIGxvY2FsX25hbWVfaW5mbzsKKyAgICBtZW1jcHkoJmxvY2FsX25hbWVfaW5mbywgcE5hbWVJbmZvLCBzaXplb2YoVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQpKTsKKyAgICAvLyBJZiB0aGlzIGlzIGEgcGh5c2ljYWwgZGV2aWNlLCB3ZSBoYXZlIHRvIHJlcGxhY2UgaXQgd2l0aCB0aGUgcHJvcGVyIG9uZSBmb3IgdGhlIG5leHQgY2FsbC4KKyAgICBpZiAocE5hbWVJbmZvLT5vYmplY3RUeXBlID09IFZLX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRSkgeworICAgICAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqcGh5c19kZXZfdHJhbXAgPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKikodWludHB0cl90KXBOYW1lSW5mby0+b2JqZWN0SGFuZGxlOworICAgICAgICBsb2NhbF9uYW1lX2luZm8ub2JqZWN0SGFuZGxlID0gKHVpbnQ2NF90KSh1aW50cHRyX3QpcGh5c19kZXZfdHJhbXAtPnBoeXNfZGV2OworICAgIH0KKyAgICBpZiAoZGlzcC0+U2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZGlzcC0+U2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoZGV2aWNlLCAmbG9jYWxfbmFtZV9pbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKiAgICAgICAgcE5hbWVJbmZvKSB7CisgICAgdWludDMyX3QgaWNkX2luZGV4ID0gMDsKKyAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2OworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gbG9hZGVyX2dldF9pY2RfYW5kX2RldmljZShkZXZpY2UsICZkZXYsICZpY2RfaW5kZXgpOworICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLlNldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKSB7CisgICAgICAgIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIGxvY2FsX25hbWVfaW5mbzsKKyAgICAgICAgbWVtY3B5KCZsb2NhbF9uYW1lX2luZm8sIHBOYW1lSW5mbywgc2l6ZW9mKFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKSk7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwaHlzaWNhbCBkZXZpY2UsIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLgorICAgICAgICBpZiAocE5hbWVJbmZvLT5vYmplY3RUeXBlID09IFZLX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRSkgeworICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopKHVpbnRwdHJfdClwTmFtZUluZm8tPm9iamVjdEhhbmRsZTsKKyAgICAgICAgICAgIGxvY2FsX25hbWVfaW5mby5vYmplY3RIYW5kbGUgPSAodWludDY0X3QpKHVpbnRwdHJfdClwaHlzX2Rldl90ZXJtLT5waHlzX2RldjsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEtIUl9zdXJmYWNlLCBhbmQgdGhlIElDRCBoYXMgY3JlYXRlZCBpdHMgb3duLCB3ZSBoYXZlIHRvIHJlcGxhY2UgaXQgd2l0aCB0aGUgcHJvcGVyIG9uZSBmb3IgdGhlIG5leHQgY2FsbC4KKyAgICAgICAgfSBlbHNlIGlmIChwTmFtZUluZm8tPm9iamVjdFR5cGUgPT0gVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFIpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZVN3YXBjaGFpbktIUikgeworICAgICAgICAgICAgICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHVpbnRwdHJfdClwTmFtZUluZm8tPm9iamVjdEhhbmRsZTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfbmFtZV9pbmZvLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdClpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UsICZsb2NhbF9uYW1lX2luZm8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogICAgICAgICBwVGFnSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgbG9jYWxfdGFnX2luZm87CisgICAgbWVtY3B5KCZsb2NhbF90YWdfaW5mbywgcFRhZ0luZm8sIHNpemVvZihWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKSk7CisgICAgLy8gSWYgdGhpcyBpcyBhIHBoeXNpY2FsIGRldmljZSwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuCisgICAgaWYgKHBUYWdJbmZvLT5vYmplY3RUeXBlID09IFZLX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRSkgeworICAgICAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqcGh5c19kZXZfdHJhbXAgPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKikodWludHB0cl90KXBUYWdJbmZvLT5vYmplY3RIYW5kbGU7CisgICAgICAgIGxvY2FsX3RhZ19pbmZvLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3RyYW1wLT5waHlzX2RldjsKKyAgICB9CisgICAgaWYgKGRpc3AtPlNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZGlzcC0+U2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVChkZXZpY2UsICZsb2NhbF90YWdfaW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9TZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQqICAgICAgICAgcFRhZ0luZm8pIHsKKyAgICB1aW50MzJfdCBpY2RfaW5kZXggPSAwOworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXY7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBsb2FkZXJfZ2V0X2ljZF9hbmRfZGV2aWNlKGRldmljZSwgJmRldiwgJmljZF9pbmRleCk7CisgICAgaWYgKE5VTEwgIT0gaWNkX3Rlcm0gJiYgTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCkgeworICAgICAgICBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIGxvY2FsX3RhZ19pbmZvOworICAgICAgICBtZW1jcHkoJmxvY2FsX3RhZ19pbmZvLCBwVGFnSW5mbywgc2l6ZW9mKFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQpKTsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHBoeXNpY2FsIGRldmljZSwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuCisgICAgICAgIGlmIChwVGFnSW5mby0+b2JqZWN0VHlwZSA9PSBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKSh1aW50cHRyX3QpcFRhZ0luZm8tPm9iamVjdEhhbmRsZTsKKyAgICAgICAgICAgIGxvY2FsX3RhZ19pbmZvLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2OworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgS0hSX3N1cmZhY2UsIGFuZCB0aGUgSUNEIGhhcyBjcmVhdGVkIGl0cyBvd24sIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLgorICAgICAgICB9IGVsc2UgaWYgKHBUYWdJbmZvLT5vYmplY3RUeXBlID09IFZLX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2RfdGVybSAmJiBOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVTd2FwY2hhaW5LSFIpIHsKKyAgICAgICAgICAgICAgICBWa0ljZFN1cmZhY2UgKmljZF9zdXJmYWNlID0gKFZrSWNkU3VyZmFjZSAqKSh1aW50cHRyX3QpcFRhZ0luZm8tPm9iamVjdEhhbmRsZTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGFnX2luZm8ub2JqZWN0SGFuZGxlID0gKHVpbnQ2NF90KWljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLlNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoZGV2aWNlLCAmbG9jYWxfdGFnX2luZm8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChxdWV1ZSk7CisgICAgaWYgKGRpc3AtPlF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgIT0gTlVMTCkgeworICAgIGRpc3AtPlF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQocXVldWUsIHBMYWJlbEluZm8pOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChxdWV1ZSk7CisgICAgaWYgKGRpc3AtPlF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUICE9IE5VTEwpIHsKKyAgICBkaXNwLT5RdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVChxdWV1ZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChxdWV1ZSk7CisgICAgaWYgKGRpc3AtPlF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUICE9IE5VTEwpIHsKKyAgICBkaXNwLT5RdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVChxdWV1ZSwgcExhYmVsSW5mbyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGlmIChkaXNwLT5DbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCAhPSBOVUxMKSB7CisgICAgZGlzcC0+Q21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoY29tbWFuZEJ1ZmZlciwgcExhYmVsSW5mbyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGlmIChkaXNwLT5DbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgIT0gTlVMTCkgeworICAgIGRpc3AtPkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGlmIChkaXNwLT5DbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgIT0gTlVMTCkgeworICAgIGRpc3AtPkNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyLCBwTGFiZWxJbmZvKTsKKyAgICB9Cit9CisKKworLy8gLS0tLSBWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogICBwUHJvcGVydGllcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRChkZXZpY2UsIGJ1ZmZlciwgcFByb3BlcnRpZXMpOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRChkZXZpY2UsIHBJbmZvLCBwQnVmZmVyKTsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisvLyAtLS0tIFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiAgICAgICAgICAgICBwU2FtcGxlTG9jYXRpb25zSW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoY29tbWFuZEJ1ZmZlciwgcFNhbXBsZUxvY2F0aW9uc0luZm8pOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogICAgICAgICAgICAgICAgIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwLT5HZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCh1bndyYXBwZWRfcGh5c19kZXYsIHNhbXBsZXMsIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLAorICAgIFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKiAgICAgICAgICAgICAgICAgcE11bHRpc2FtcGxlUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIklDRCBhc3NvY2lhdGVkIHdpdGggVmtQaHlzaWNhbERldmljZSBkb2VzIG5vdCBzdXBwb3J0IEdldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIik7CisgICAgfQorICAgIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVChwaHlzX2Rldl90ZXJtLT5waHlzX2Rldiwgc2FtcGxlcywgcE11bHRpc2FtcGxlUHJvcGVydGllcyk7Cit9CisKKworLy8gLS0tLSBWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllciBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKGRldmljZSwgaW1hZ2UsIHBQcm9wZXJ0aWVzKTsKK30KKworCisvLyAtLS0tIFZLX0VYVF92YWxpZGF0aW9uX2NhY2hlIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICAgICAgICBwVmFsaWRhdGlvbkNhY2hlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmFsaWRhdGlvbkNhY2hlKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5EZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKGRldmljZSwgdmFsaWRhdGlvbkNhY2hlLCBwQWxsb2NhdG9yKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIE1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIGRzdENhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQ2FjaGVDb3VudCwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgIHBTcmNDYWNoZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+TWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKGRldmljZSwgZHN0Q2FjaGUsIHNyY0NhY2hlQ291bnQsIHBTcmNDYWNoZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoZGV2aWNlLCB2YWxpZGF0aW9uQ2FjaGUsIHBEYXRhU2l6ZSwgcERhdGEpOworfQorCisKKy8vIC0tLS0gVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVihjb21tYW5kQnVmZmVyLCBpbWFnZVZpZXcsIGltYWdlTGF5b3V0KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKiAgICAgICAgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoY29tbWFuZEJ1ZmZlciwgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRDb3VudCwgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WICAgICAgICAgICAgICAgICAgIHNhbXBsZU9yZGVyVHlwZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsCisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoY29tbWFuZEJ1ZmZlciwgc2FtcGxlT3JkZXJUeXBlLCBjdXN0b21TYW1wbGVPcmRlckNvdW50LCBwQ3VzdG9tU2FtcGxlT3JkZXJzKTsKK30KKworCisvLyAtLS0tIFZLX05WX3JheV90cmFjaW5nIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEFjY2VsZXJhdGlvblN0cnVjdHVyZSk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5EZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoZGV2aWNlLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIHBBbGxvY2F0b3IpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgZGlzcC0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5CaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqICAgICAgICBwSW5mbywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlT2Zmc2V0LAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hPZmZzZXQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kQnVmZmVyLCBwSW5mbywgaW5zdGFuY2VEYXRhLCBpbnN0YW5jZU9mZnNldCwgdXBkYXRlLCBkc3QsIHNyYywgc2NyYXRjaCwgc2NyYXRjaE9mZnNldCk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WICAgICAgICAgICBtb2RlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kQnVmZmVyLCBkc3QsIHNyYywgbW9kZSk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFRyYWNlUmF5c05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZFRyYWNlUmF5c05WKGNvbW1hbmRCdWZmZXIsIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLCBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwgd2lkdGgsIGhlaWdodCwgZGVwdGgpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RHcm91cCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVihkZXZpY2UsIHBpcGVsaW5lLCBmaXJzdEdyb3VwLCBncm91cENvdW50LCBkYXRhU2l6ZSwgcERhdGEpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKGRldmljZSwgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBkYXRhU2l6ZSwgcERhdGEpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywKKyAgICBWa1F1ZXJ5VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnkpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKGNvbW1hbmRCdWZmZXIsIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LCBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywgcXVlcnlUeXBlLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnkpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5Db21waWxlRGVmZXJyZWROVihkZXZpY2UsIHBpcGVsaW5lLCBzaGFkZXIpOworfQorCisKKy8vIC0tLS0gVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0IGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhvc3RQb2ludGVyLAorICAgIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiAgICAgICAgICAgcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoZGV2aWNlLCBoYW5kbGVUeXBlLCBwSG9zdFBvaW50ZXIsIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMpOworfQorCisKKy8vIC0tLS0gVktfQU1EX2J1ZmZlcl9tYXJrZXIgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRXcml0ZUJ1ZmZlck1hcmtlckFNRChjb21tYW5kQnVmZmVyLCBwaXBlbGluZVN0YWdlLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgbWFya2VyKTsKK30KKworCisvLyAtLS0tIFZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbkNvdW50LAorICAgIFZrVGltZURvbWFpbkVYVCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEb21haW5zKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKHVud3JhcHBlZF9waHlzX2RldiwgcFRpbWVEb21haW5Db3VudCwgcFRpbWVEb21haW5zKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWluQ291bnQsCisgICAgVmtUaW1lRG9tYWluRVhUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbnMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKSB7CisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgYXNzb2NpYXRlZCB3aXRoIFZrUGh5c2ljYWxEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCIpOworICAgIH0KKyAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwVGltZURvbWFpbkNvdW50LCBwVGltZURvbWFpbnMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVChkZXZpY2UsIHRpbWVzdGFtcENvdW50LCBwVGltZXN0YW1wSW5mb3MsIHBUaW1lc3RhbXBzLCBwTWF4RGV2aWF0aW9uKTsKK30KKworCisvLyAtLS0tIFZLX05WX21lc2hfc2hhZGVyIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kRHJhd01lc2hUYXNrc05WKGNvbW1hbmRCdWZmZXIsIHRhc2tDb3VudCwgZmlyc3RUYXNrKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKK30KKworCisvLyAtLS0tIFZLX05WX3NjaXNzb3JfZXhjbHVzaXZlIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpdmVTY2lzc29yQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXhjbHVzaXZlU2Npc3NvcnMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisgICAgZGlzcC0+Q21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKGNvbW1hbmRCdWZmZXIsIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBwRXhjbHVzaXZlU2Npc3NvcnMpOworfQorCisKKy8vIC0tLS0gVktfTlZfZGV2aWNlX2RpYWdub3N0aWNfY2hlY2twb2ludHMgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0Q2hlY2twb2ludE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50TWFya2VyKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIGRpc3AtPkNtZFNldENoZWNrcG9pbnROVihjb21tYW5kQnVmZmVyLCBwQ2hlY2twb2ludE1hcmtlcik7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFF1ZXVlQ2hlY2twb2ludERhdGFOVigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhQ291bnQsCisgICAgVmtDaGVja3BvaW50RGF0YU5WKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGEpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2gocXVldWUpOworICAgIGRpc3AtPkdldFF1ZXVlQ2hlY2twb2ludERhdGFOVihxdWV1ZSwgcENoZWNrcG9pbnREYXRhQ291bnQsIHBDaGVja3BvaW50RGF0YSk7Cit9CisKKworLy8gLS0tLSBWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqICBwSW5pdGlhbGl6ZUluZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+SW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoZGV2aWNlLCBwSW5pdGlhbGl6ZUluZm8pOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgZGlzcC0+VW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTChkZXZpY2UpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogICAgICAgICBwTWFya2VySW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICByZXR1cm4gZGlzcC0+Q21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTChjb21tYW5kQnVmZmVyLCBwTWFya2VySW5mbyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiAgIHBNYXJrZXJJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIHJldHVybiBkaXNwLT5DbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiAgICAgICBwT3ZlcnJpZGVJbmZvKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworICAgIHJldHVybiBkaXNwLT5DbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwoY29tbWFuZEJ1ZmZlciwgcE92ZXJyaWRlSW5mbyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5BY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoZGV2aWNlLCBwQWNxdWlyZUluZm8sIHBDb25maWd1cmF0aW9uKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+UmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKGRldmljZSwgY29uZmlndXJhdGlvbik7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAgICAgICAgICAgICBjb25maWd1cmF0aW9uKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKHF1ZXVlKTsKKyAgICByZXR1cm4gZGlzcC0+UXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChxdWV1ZSwgY29uZmlndXJhdGlvbik7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgICAgICAgICAgICAgcGFyYW1ldGVyLAorICAgIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiAgICAgICAgICAgICAgICAgICAgcFZhbHVlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoZGV2aWNlLCBwYXJhbWV0ZXIsIHBWYWx1ZSk7Cit9CisKKworLy8gLS0tLSBWS19BTURfZGlzcGxheV9uYXRpdmVfaGRyIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIGRpc3AtPlNldExvY2FsRGltbWluZ0FNRChkZXZpY2UsIHN3YXBDaGFpbiwgbG9jYWxEaW1taW5nRW5hYmxlKTsKK30KKworCisvLyAtLS0tIFZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisjZXJyb3IoIk5vdCBpbXBsZW1lbnRlZC4gTGlrZWx5IG5lZWRzIHRvIGJlIG1hbnVhbGx5IGdlbmVyYXRlZCEiKTsKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgeworI2Vycm9yKCJOb3QgaW1wbGVtZW50ZWQuIExpa2VseSBuZWVkcyB0byBiZSBtYW51YWxseSBnZW5lcmF0ZWQhIik7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisvLyAtLS0tIFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworVktBUElfQVRUUiBWa0RldmljZUFkZHJlc3MgVktBUElfQ0FMTCBHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9FWFQqICAgICAgICAgcEluZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChkZXZpY2UsIHBJbmZvKTsKK30KKworCisvLyAtLS0tIFZLX05WX2Nvb3BlcmF0aXZlX21hdHJpeCBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKHVud3JhcHBlZF9waHlzX2RldiwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVikgeworICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiSUNEIGFzc29jaWF0ZWQgd2l0aCBWa1BoeXNpY2FsRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViIpOworICAgIH0KKyAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7Cit9CisKKworLy8gLS0tLSBWS19OVl9jb3ZlcmFnZV9yZWR1Y3Rpb25fbW9kZSBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tYmluYXRpb25Db3VudCwKKyAgICBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogICAgIHBDb21iaW5hdGlvbnMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKHVud3JhcHBlZF9waHlzX2RldiwgcENvbWJpbmF0aW9uQ291bnQsIHBDb21iaW5hdGlvbnMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21iaW5hdGlvbkNvdW50LAorICAgIFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKiAgICAgcENvbWJpbmF0aW9ucykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKSB7CisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgYXNzb2NpYXRlZCB3aXRoIFZrUGh5c2ljYWxEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYiKTsKKyAgICB9CisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBDb21iaW5hdGlvbkNvdW50LCBwQ29tYmluYXRpb25zKTsKK30KKworCisvLyAtLS0tIFZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+QWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKGRldmljZSwgc3dhcGNoYWluKTsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbik7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKy8vIC0tLS0gVktfRVhUX2xpbmVfcmFzdGVyaXphdGlvbiBleHRlbnNpb24gdHJhbXBvbGluZS90ZXJtaW5hdG9ycworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRMaW5lU3RpcHBsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZUZhY3RvciwKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlUGF0dGVybikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRTZXRMaW5lU3RpcHBsZUVYVChjb21tYW5kQnVmZmVyLCBsaW5lU3RpcHBsZUZhY3RvciwgbGluZVN0aXBwbGVQYXR0ZXJuKTsKK30KKworCisvLyAtLS0tIFZLX0VYVF9ob3N0X3F1ZXJ5X3Jlc2V0IGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFJlc2V0UXVlcnlQb29sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5SZXNldFF1ZXJ5UG9vbEVYVChkZXZpY2UsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCk7Cit9CisKKy8vIEdQQSBoZWxwZXJzIGZvciBleHRlbnNpb25zCitib29sIGV4dGVuc2lvbl9pbnN0YW5jZV9ncGEoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICoqYWRkcikgeworICAgICphZGRyID0gTlVMTDsKKworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMgorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKil2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIKKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIKKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIKKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgPyAodm9pZCAqKXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMgorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKil2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMgorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kZXZpY2VfZ3JvdXAgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWRTZXREZXZpY2VNYXNrS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZFNldERldmljZU1hc2tLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWREaXNwYXRjaEJhc2VLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kRGlzcGF0Y2hCYXNlS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9tYWludGVuYW5jZTEgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrVHJpbUNvbW1hbmRQb29sS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKVRyaW1Db21tYW5kUG9vbEtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2RldmljZV9ncm91cF9jcmVhdGlvbiA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgPyAodm9pZCAqKXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMKKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKCJ2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldE1lbW9yeVdpbjMySGFuZGxlS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0dldE1lbW9yeUZkS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldE1lbW9yeUZkS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldE1lbW9yeUZkUHJvcGVydGllc0tIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKCJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtJbXBvcnRTZW1hcGhvcmVGZEtIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilJbXBvcnRTZW1hcGhvcmVGZEtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFNlbWFwaG9yZUZkS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFNlbWFwaG9yZUZkS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kUHVzaERlc2NyaXB0b3JTZXRLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNyZWF0ZVJlbmRlclBhc3MyS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWRCZWdpblJlbmRlclBhc3MyS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kTmV4dFN1YnBhc3MyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZE5leHRTdWJwYXNzMktIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZEVuZFJlbmRlclBhc3MyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZEVuZFJlbmRlclBhc3MyS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0U3dhcGNoYWluU3RhdHVzS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFN3YXBjaGFpblN0YXR1c0tIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX2ZlbmNlX3dpbjMyIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBpZiAoIXN0cmNtcCgidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGlmICghc3RyY21wKCJ2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0RmVuY2VXaW4zMkhhbmRsZUtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0ltcG9ydEZlbmNlRmRLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopSW1wb3J0RmVuY2VGZEtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldEZlbmNlRmRLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0RmVuY2VGZEtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKVJlbGVhc2VQcm9maWxpbmdMb2NrS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgPyAodm9pZCAqKUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIKKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUgorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfYmluZF9tZW1vcnkyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0JpbmRCdWZmZXJNZW1vcnkyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUJpbmRCdWZmZXJNZW1vcnkyS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQmluZEltYWdlTWVtb3J5MktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilCaW5kSW1hZ2VNZW1vcnkyS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl9tYWludGVuYW5jZTMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kRHJhd0luZGlyZWN0Q291bnRLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a1dhaXRTZW1hcGhvcmVzS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKVdhaXRTZW1hcGhvcmVzS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrU2lnbmFsU2VtYXBob3JlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKVNpZ25hbFNlbWFwaG9yZUtIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfcGlwZWxpbmVfZXhlY3V0YWJsZV9wcm9wZXJ0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z19tYXJrZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWREZWJ1Z01hcmtlckJlZ2luRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kRGVidWdNYXJrZXJFbmRFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kRGVidWdNYXJrZXJFbmRFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWREZWJ1Z01hcmtlckluc2VydEVYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kRW5kUXVlcnlJbmRleGVkRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19OVlhfaW1hZ2Vfdmlld19oYW5kbGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldEltYWdlVmlld0hhbmRsZU5WWDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19BTURfZHJhd19pbmRpcmVjdF9jb3VudCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWREcmF3SW5kaXJlY3RDb3VudEFNRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfQU1EX3NoYWRlcl9pbmZvIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0dldFNoYWRlckluZm9BTUQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0U2hhZGVySW5mb0FNRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19HR1Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5nZ3Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgPyAodm9pZCAqKUNyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisKKyAgICAvLyAtLS0tIFZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMubnZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgPyAodm9pZCAqKUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVgorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX05WX2V4dGVybmFsX21lbW9yeV93aW4zMiBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaWYgKCFzdHJjbXAoInZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRNZW1vcnlXaW4zMkhhbmRsZU5WOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMubm5fdmlfc3VyZmFjZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgPyAodm9pZCAqKUNyZWF0ZVZpU3VyZmFjZU5OCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fVklfTk4KKworICAgIC8vIC0tLS0gVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kUHJvY2Vzc0NvbW1hbmRzTlZYOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlg7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZU9iamVjdFRhYmxlTlZYIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNyZWF0ZU9iamVjdFRhYmxlTlZYOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrRGVzdHJveU9iamVjdFRhYmxlTlZYIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKURlc3Ryb3lPYmplY3RUYWJsZU5WWDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a1JlZ2lzdGVyT2JqZWN0c05WWCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilSZWdpc3Rlck9iamVjdHNOVlg7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtVbnJlZ2lzdGVyT2JqZWN0c05WWCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilVbnJlZ2lzdGVyT2JqZWN0c05WWDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX05WX2NsaXBfc3BhY2Vfd19zY2FsaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfRVhUX2RpcmVjdF9tb2RlX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrUmVsZWFzZURpc3BsYXlFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGlyZWN0X21vZGVfZGlzcGxheSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgPyAodm9pZCAqKVJlbGVhc2VEaXNwbGF5RVhUCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfRVhUX2FjcXVpcmVfeGxpYl9kaXNwbGF5IGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICBpZiAoIXN0cmNtcCgidmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfYWNxdWlyZV94bGliX2Rpc3BsYXkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKilBY3F1aXJlWGxpYkRpc3BsYXlFWFQKKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgaWYgKCFzdHJjbXAoInZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2FjcXVpcmVfeGxpYl9kaXNwbGF5ID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVAorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNwbGF5X2NvbnRyb2wgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilEaXNwbGF5UG93ZXJDb250cm9sRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilSZWdpc3RlckRldmljZUV2ZW50RVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFN3YXBjaGFpbkNvdW50ZXJFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfR09PR0xFX2Rpc3BsYXlfdGltaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNjYXJkX3JlY3RhbmdsZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0VYVF9oZHJfbWV0YWRhdGEgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrU2V0SGRyTWV0YWRhdGFFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopU2V0SGRyTWV0YWRhdGFFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX3V0aWxzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2RlYnVnX3V0aWxzID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQKKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKilTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2RlYnVnX3V0aWxzID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVAorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKilRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVAorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKilRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVAorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKilDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVAorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2RlYnVnX3V0aWxzID09IDEpCisgICAgICAgICAgICAgICAgICAgICA/ICh2b2lkICopQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IChwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKilDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQKKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIGlmICghc3RyY21wKCJ2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisgICAgLy8gLS0tLSBWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfRVhUX2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19OVl9yYXlfdHJhY2luZyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kVHJhY2VSYXlzTlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kVHJhY2VSYXlzTlY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NvbXBpbGVEZWZlcnJlZE5WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNvbXBpbGVEZWZlcnJlZE5WOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0VYVF9leHRlcm5hbF9tZW1vcnlfaG9zdCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0FNRF9idWZmZXJfbWFya2VyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZFdyaXRlQnVmZmVyTWFya2VyQU1EOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19OVl9tZXNoX3NoYWRlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtDbWREcmF3TWVzaFRhc2tzTlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kRHJhd01lc2hUYXNrc05WOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfTlZfc2Npc3Nvcl9leGNsdXNpdmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUNtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtDbWRTZXRDaGVja3BvaW50TlYiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kU2V0Q2hlY2twb2ludE5WOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldFF1ZXVlQ2hlY2twb2ludERhdGFOVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoIXN0cmNtcCgidmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKVJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19BTURfZGlzcGxheV9uYXRpdmVfaGRyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a1NldExvY2FsRGltbWluZ0FNRCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilTZXRMb2NhbERpbW1pbmdBTUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfRlVDSFNJQV9pbWFnZXBpcGVfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZnVjaHNpYV9pbWFnZXBpcGVfc3VyZmFjZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgPyAodm9pZCAqKUNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBCisgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisgICAgLy8gLS0tLSBWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLSBWS19OVl9jb29wZXJhdGl2ZV9tYXRyaXggZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tIFZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBpZiAoIXN0cmNtcCgidmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBpZiAoIXN0cmNtcCgidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBpZiAoIXN0cmNtcCgidmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKUdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0VYVF9saW5lX3Jhc3Rlcml6YXRpb24gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrQ21kU2V0TGluZVN0aXBwbGVFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopQ21kU2V0TGluZVN0aXBwbGVFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIC0tLS0gVktfRVhUX2hvc3RfcXVlcnlfcmVzZXQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKCFzdHJjbXAoInZrUmVzZXRRdWVyeVBvb2xFWFQiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopUmVzZXRRdWVyeVBvb2xFWFQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBxdWVyeSBlbmFibGVkIGV4dGVuc2lvbnMgZHVyaW5nIGEgdmtDcmVhdGVJbnN0YW5jZSBjYWxsCit2b2lkIGV4dGVuc2lvbnNfY3JlYXRlX2luc3RhbmNlKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSwgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICAgICAgaWYgKDAgPT0gc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIgPSAxOworCisgICAgLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24gPSAxOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgPSAxOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMgPSAxOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMgPSAxOworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyID0gMTsKKworICAgIC8vIC0tLS0gVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfR0dQX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5nZ3Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSA9IDE7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCisgICAgLy8gLS0tLSBWS19OVl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfTlZfRVhURVJOQUxfTUVNT1JZX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLm52X2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgPSAxOworCisgICAgLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfTk5fVklfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLm5uX3ZpX3N1cmZhY2UgPSAxOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCisgICAgLy8gLS0tLSBWS19FWFRfZGlyZWN0X21vZGVfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0VYVF9ESVJFQ1RfTU9ERV9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2RpcmVjdF9tb2RlX2Rpc3BsYXkgPSAxOworCisgICAgLy8gLS0tLSBWS19FWFRfYWNxdWlyZV94bGliX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfRVhUX0FDUVVJUkVfWExJQl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuZXh0X2FjcXVpcmVfeGxpYl9kaXNwbGF5ID0gMTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0VYVF9ESVNQTEFZX1NVUkZBQ0VfQ09VTlRFUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmV4dF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciA9IDE7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z191dGlscyBleHRlbnNpb24gY29tbWFuZHMKKyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmV4dF9kZWJ1Z191dGlscyA9IDE7CisKKyAgICAvLyAtLS0tIFZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0ZVQ0hTSUFfSU1BR0VQSVBFX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5mdWNoc2lhX2ltYWdlcGlwZV9zdXJmYWNlID0gMTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorICAgICAgICB9CisgICAgfQorfQorCisvLyBTb21lIGRldmljZSBjb21tYW5kcyBzdGlsbCBuZWVkIGEgdGVybWluYXRvciBiZWNhdXNlIHRoZSBsb2FkZXIgbmVlZHMgdG8gdW53cmFwIHNvbWV0aGluZyBhYm91dCB0aGVtLgorLy8gSW4gbWFueSBjYXNlcywgdGhlIGl0ZW0gbmVlZGluZyB1bndyYXBwaW5nIGlzIGEgVmtQaHlzaWNhbERldmljZSBvciBWa1N1cmZhY2VLSFIgb2JqZWN0LiAgQnV0IHRoZXJlIG1heSBiZSBvdGhlciBpdGVtcworLy8gaW4gdGhlIGZ1dHVyZS4KK1BGTl92a1ZvaWRGdW5jdGlvbiBnZXRfZXh0ZW5zaW9uX2RldmljZV9wcm9jX3Rlcm1pbmF0b3Ioc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcE5hbWUpIHsKKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gYWRkciA9IE5VTEw7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9zd2FwY2hhaW4gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKGRldi0+ZXh0ZW5zaW9ucy5raHJfc3dhcGNoYWluX2VuYWJsZWQpIHsKKyAgICAgICAgaWYoIXN0cmNtcChwTmFtZSwgInZrQ3JlYXRlU3dhcGNoYWluS0hSIikpIHsKKyAgICAgICAgICAgIGFkZHIgPSAoUEZOX3ZrVm9pZEZ1bmN0aW9uKXRlcm1pbmF0b3JfQ3JlYXRlU3dhcGNoYWluS0hSOworICAgICAgICB9IGVsc2UgaWYoIXN0cmNtcChwTmFtZSwgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIikpIHsKKyAgICAgICAgICAgIGFkZHIgPSAoUEZOX3ZrVm9pZEZ1bmN0aW9uKXRlcm1pbmF0b3JfR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLSBWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKGRldi0+ZXh0ZW5zaW9ucy5raHJfZGlzcGxheV9zd2FwY2hhaW5fZW5hYmxlZCkgeworICAgICAgICBpZighc3RyY21wKHBOYW1lLCAidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIikpIHsKKyAgICAgICAgICAgIGFkZHIgPSAoUEZOX3ZrVm9pZEZ1bmN0aW9uKXRlcm1pbmF0b3JfQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX21hcmtlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBpZiAoZGV2LT5leHRlbnNpb25zLmV4dF9kZWJ1Z19tYXJrZXJfZW5hYmxlZCkgeworICAgICAgICBpZighc3RyY21wKHBOYW1lLCAidmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCIpKSB7CisgICAgICAgICAgICBhZGRyID0gKFBGTl92a1ZvaWRGdW5jdGlvbil0ZXJtaW5hdG9yX0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUOworICAgICAgICB9IGVsc2UgaWYoIXN0cmNtcChwTmFtZSwgInZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIikpIHsKKyAgICAgICAgICAgIGFkZHIgPSAoUEZOX3ZrVm9pZEZ1bmN0aW9uKXRlcm1pbmF0b3JfRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLSBWS19FWFRfZGVidWdfdXRpbHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgaWYgKGRldi0+ZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHNfZW5hYmxlZCkgeworICAgICAgICBpZighc3RyY21wKHBOYW1lLCAidmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCIpKSB7CisgICAgICAgICAgICBhZGRyID0gKFBGTl92a1ZvaWRGdW5jdGlvbil0ZXJtaW5hdG9yX1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUOworICAgICAgICB9IGVsc2UgaWYoIXN0cmNtcChwTmFtZSwgInZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCIpKSB7CisgICAgICAgICAgICBhZGRyID0gKFBGTl92a1ZvaWRGdW5jdGlvbil0ZXJtaW5hdG9yX1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQ7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIGlmIChkZXYtPmV4dGVuc2lvbnMuZXh0X2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZV9lbmFibGVkICYmIGRldi0+ZXh0ZW5zaW9ucy5raHJfZGV2aWNlX2dyb3VwX2VuYWJsZWQpIHsKKyAgICAgICAgaWYoIXN0cmNtcChwTmFtZSwgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIpKSB7CisgICAgICAgICAgICBhZGRyID0gKFBGTl92a1ZvaWRGdW5jdGlvbil0ZXJtaW5hdG9yX0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gTm9uZQorICAgIHJldHVybiBhZGRyOworfQorCisvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBsb2FkZXIncyBpbnN0YW5jZSBkaXNwYXRjaCB0YWJsZSwgd2hpY2ggY29udGFpbnMKKy8vIGRlZmF1bHQgZnVuY3Rpb25zIGlmIG5vIGluc3RhbmNlIGxheWVycyBhcmUgYWN0aXZhdGVkLiAgVGhpcyBjb250YWlucworLy8gcG9pbnRlcnMgdG8gInRlcm1pbmF0b3IgZnVuY3Rpb25zIi4KK2NvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgaW5zdGFuY2VfZGlzcCA9IHsKKworICAgIC8vIC0tLS0gQ29yZSAxXzAgY29tbWFuZHMKKyAgICAuRGVzdHJveUluc3RhbmNlID0gdGVybWluYXRvcl9EZXN0cm95SW5zdGFuY2UsCisgICAgLkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyA9IHRlcm1pbmF0b3JfRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzLAorICAgIC5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzLAorICAgIC5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcywKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLAorICAgIC5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcywKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLAorICAgIC5HZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcywKKyAgICAuR2V0SW5zdGFuY2VQcm9jQWRkciA9IHZrR2V0SW5zdGFuY2VQcm9jQWRkciwKKyAgICAuRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyA9IHRlcm1pbmF0b3JfRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcywKKyAgICAuRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzID0gdGVybWluYXRvcl9FbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMsCisgICAgLkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcywKKworICAgIC8vIC0tLS0gQ29yZSAxXzEgY29tbWFuZHMKKyAgICAuRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgPSB0ZXJtaW5hdG9yX0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzLAorICAgIC5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsCisgICAgLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsCisgICAgLkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIsCisgICAgLkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLAorICAgIC5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiwKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiwKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIsCisgICAgLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcywKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcywKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLAorCisgICAgLy8gLS0tLSBWS19LSFJfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICAuRGVzdHJveVN1cmZhY2VLSFIgPSB0ZXJtaW5hdG9yX0Rlc3Ryb3lTdXJmYWNlS0hSLAorICAgIC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLAorICAgIC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiwKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiwKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIsCisKKyAgICAvLyAtLS0tIFZLX0tIUl9zd2FwY2hhaW4gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgLkdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIsCisKKyAgICAvLyAtLS0tIFZLX0tIUl9kaXNwbGF5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSLAorICAgIC5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiwKKyAgICAuR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIgPSB0ZXJtaW5hdG9yX0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSLAorICAgIC5HZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgPSB0ZXJtaW5hdG9yX0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiwKKyAgICAuQ3JlYXRlRGlzcGxheU1vZGVLSFIgPSB0ZXJtaW5hdG9yX0NyZWF0ZURpc3BsYXlNb2RlS0hSLAorICAgIC5HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgPSB0ZXJtaW5hdG9yX0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiwKKyAgICAuQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiA9IHRlcm1pbmF0b3JfQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiwKKworICAgIC8vIC0tLS0gVktfS0hSX3hsaWJfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICAuQ3JlYXRlWGxpYlN1cmZhY2VLSFIgPSB0ZXJtaW5hdG9yX0NyZWF0ZVhsaWJTdXJmYWNlS0hSLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIC5HZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfeGNiX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICAuQ3JlYXRlWGNiU3VyZmFjZUtIUiA9IHRlcm1pbmF0b3JfQ3JlYXRlWGNiU3VyZmFjZUtIUiwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgLkdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl93YXlsYW5kX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgLkNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSID0gdGVybWluYXRvcl9DcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2FuZHJvaWRfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICAuQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIgPSB0ZXJtaW5hdG9yX0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfd2luMzJfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgLkNyZWF0ZVdpbjMyU3VyZmFjZUtIUiA9IHRlcm1pbmF0b3JfQ3JlYXRlV2luMzJTdXJmYWNlS0hSLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgLkdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIsCisgICAgLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIsCisgICAgLkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIsCisgICAgLkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLAorICAgIC5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiwKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiwKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIsCisKKyAgICAvLyAtLS0tIFZLX0tIUl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgLkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSID0gdGVybWluYXRvcl9FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcywKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcywKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcywKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcywKKworICAgIC8vIC0tLS0gVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5FbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSID0gdGVybWluYXRvcl9FbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSLAorICAgIC5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIsCisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXMyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLAorICAgIC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIsCisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSLAorICAgIC5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLAorICAgIC5HZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSID0gdGVybWluYXRvcl9HZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLAorICAgIC5HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSID0gdGVybWluYXRvcl9HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSLAorCisgICAgLy8gLS0tLSBWS19FWFRfZGVidWdfcmVwb3J0IGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUID0gdGVybWluYXRvcl9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULAorICAgIC5EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCA9IHRlcm1pbmF0b3JfRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQsCisgICAgLkRlYnVnUmVwb3J0TWVzc2FnZUVYVCA9IHRlcm1pbmF0b3JfRGVidWdSZXBvcnRNZXNzYWdlRVhULAorCisgICAgLy8gLS0tLSBWS19HR1Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgLkNyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQID0gdGVybWluYXRvcl9DcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisKKyAgICAvLyAtLS0tIFZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLAorCisgICAgLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIC5DcmVhdGVWaVN1cmZhY2VOTiA9IHRlcm1pbmF0b3JfQ3JlYXRlVmlTdXJmYWNlTk4sCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKKyAgICAvLyAtLS0tIFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5HZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCA9IHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgsCisKKyAgICAvLyAtLS0tIFZLX0VYVF9kaXJlY3RfbW9kZV9kaXNwbGF5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5SZWxlYXNlRGlzcGxheUVYVCA9IHRlcm1pbmF0b3JfUmVsZWFzZURpc3BsYXlFWFQsCisKKyAgICAvLyAtLS0tIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgLkFjcXVpcmVYbGliRGlzcGxheUVYVCA9IHRlcm1pbmF0b3JfQWNxdWlyZVhsaWJEaXNwbGF5RVhULAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgLkdldFJhbmRST3V0cHV0RGlzcGxheUVYVCA9IHRlcm1pbmF0b3JfR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworICAgIC8vIC0tLS0gVktfRVhUX2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULAorCisgICAgLy8gLS0tLSBWS19NVktfaW9zX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyAgICAuQ3JlYXRlSU9TU3VyZmFjZU1WSyA9IHRlcm1pbmF0b3JfQ3JlYXRlSU9TU3VyZmFjZU1WSywKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisgICAgLy8gLS0tLSBWS19NVktfbWFjb3Nfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgLkNyZWF0ZU1hY09TU3VyZmFjZU1WSyA9IHRlcm1pbmF0b3JfQ3JlYXRlTWFjT1NTdXJmYWNlTVZLLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX3V0aWxzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5DcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0gdGVybWluYXRvcl9DcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULAorICAgIC5EZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCA9IHRlcm1pbmF0b3JfRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQsCisgICAgLlN1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUID0gdGVybWluYXRvcl9TdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCwKKworICAgIC8vIC0tLS0gVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgLkdldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCwKKworICAgIC8vIC0tLS0gVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQgPSB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhULAorCisgICAgLy8gLS0tLSBWS19GVUNIU0lBX2ltYWdlcGlwZV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisgICAgLkNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBID0gdGVybWluYXRvcl9DcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisgICAgLy8gLS0tLSBWS19FWFRfbWV0YWxfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgLkNyZWF0ZU1ldGFsU3VyZmFjZUVYVCA9IHRlcm1pbmF0b3JfQ3JlYXRlTWV0YWxTdXJmYWNlRVhULAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworICAgIC8vIC0tLS0gVktfTlZfY29vcGVyYXRpdmVfbWF0cml4IGV4dGVuc2lvbiBjb21tYW5kcworICAgIC5HZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLAorCisgICAgLy8gLS0tLSBWS19OVl9jb3ZlcmFnZV9yZWR1Y3Rpb25fbW9kZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICAuR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYsCisKKyAgICAvLyAtLS0tIFZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUID0gdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhULAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX2hlYWRsZXNzX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgLkNyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCA9IHRlcm1pbmF0b3JfQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhULAorfTsKKworLy8gQSBudWxsLXRlcm1pbmF0ZWQgbGlzdCBvZiBhbGwgb2YgdGhlIGluc3RhbmNlIGV4dGVuc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBsb2FkZXIuCisvLyBJZiBhbiBpbnN0YW5jZSBleHRlbnNpb24gbmFtZSBpcyBub3QgaW4gdGhpcyBsaXN0LCBidXQgaXQgaXMgZXhwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlCisvLyBJQ0RzIGRldGVjdGVkIGJ5IHRoZSBsb2FkZXIsIHRoZW4gdGhlIGV4dGVuc2lvbiBuYW1lIG5vdCBpbiB0aGUgbGlzdCB3aWxsIGJlIGZpbHRlcmVkIG91dAorLy8gYmVmb3JlIHBhc3NpbmcgdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byB0aGUgYXBwbGljYXRpb24uCitjb25zdCBjaGFyICpjb25zdCBMT0FERVJfSU5TVEFOQ0VfRVhURU5TSU9OU1tdID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUsCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9YTElCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfS0hSX1hDQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfRVhURVJOQUxfRkVOQ0VfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfR0VUX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfRElTUExBWV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVF9ERUJVR19SRVBPUlRfRVhURU5TSU9OX05BTUUsCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19HR1BfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05WX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVF9WQUxJREFUSU9OX0ZMQUdTX0VYVEVOU0lPTl9OQU1FLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OTl9WSV9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19FWFRfRElSRUNUX01PREVfRElTUExBWV9FWFRFTlNJT05fTkFNRSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVF9BQ1FVSVJFX1hMSUJfRElTUExBWV9FWFRFTlNJT05fTkFNRSwKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVF9ESVNQTEFZX1NVUkZBQ0VfQ09VTlRFUl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRVhUX1NXQVBDSEFJTl9DT0xPUl9TUEFDRV9FWFRFTlNJT05fTkFNRSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19NVktfSU9TX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX01WS19NQUNPU19TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZVQ0hTSUFfSU1BR0VQSVBFX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVF9NRVRBTF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRVhUX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVF9IRUFETEVTU19TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH07CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZ2VuZXJhdGVkL3ZrX2xvYWRlcl9leHRlbnNpb25zLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2dlbmVyYXRlZC92a19sb2FkZXJfZXh0ZW5zaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDQ1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2dlbmVyYXRlZC92a19sb2FkZXJfZXh0ZW5zaW9ucy5oCkBAIC0wLDAgKzEsNDQ4IEBACisvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKgorLy8gU2VlIGxvYWRlcl9leHRlbnNpb25fZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1hcmsgWW91bmcgPG1hcmt5QGx1bmFyZy5jb20+CisgKi8KKworI3ByYWdtYSBvbmNlCisKKy8vIFN0cnVjdHVyZXMgZGVmaW5lZCBleHRlcm5hbGx5LCBidXQgdXNlZCBoZXJlCitzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlOworc3RydWN0IGxvYWRlcl9kZXZpY2U7CitzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtOworc3RydWN0IGxvYWRlcl9kZXZfZGlzcGF0Y2hfdGFibGU7CisKKy8vIERldmljZSBleHRlbnNpb24gZXJyb3IgZnVuY3Rpb24KK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0RldkV4dEVycm9yKFZrRGV2aWNlIGRldik7CisKKy8vIEV4dGVuc2lvbiBpbnRlcmNlcHRpb24gZm9yIHZrR2V0SW5zdGFuY2VQcm9jQWRkciBmdW5jdGlvbiwgc28gd2UgY2FuIHJldHVybgorLy8gdGhlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIGZvciBhbnkgaW5zdGFuY2UgZXh0ZW5zaW9ucyB3ZSBrbm93IGFib3V0LgorYm9vbCBleHRlbnNpb25faW5zdGFuY2VfZ3BhKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqKmFkZHIpOworCisvLyBFeHRlbnNpb24gaW50ZXJjZXB0aW9uIGZvciB2a0NyZWF0ZUluc3RhbmNlIGZ1bmN0aW9uLCBzbyB3ZSBjYW4gcHJvcGVybHkKKy8vIGRldGVjdCBhbmQgZW5hYmxlIGFueSBpbnN0YW5jZSBleHRlbnNpb24gaW5mb3JtYXRpb24gZm9yIGV4dGVuc2lvbnMgd2Uga25vdworLy8gYWJvdXQuCit2b2lkIGV4dGVuc2lvbnNfY3JlYXRlX2luc3RhbmNlKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSwgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKTsKKworLy8gRXh0ZW5zaW9uIGludGVyY2VwdGlvbiBmb3IgdmtHZXREZXZpY2VQcm9jQWRkciBmdW5jdGlvbiwgc28gd2UgY2FuIHJldHVybgorLy8gYW4gYXBwcm9wcmlhdGUgdGVybWluYXRvciBpZiB0aGlzIGlzIG9uZSBvZiB0aG9zZSBmZXcgZGV2aWNlIGNvbW1hbmRzIHJlcXVpcmluZworLy8gYSB0ZXJtaW5hdG9yLgorUEZOX3ZrVm9pZEZ1bmN0aW9uIGdldF9leHRlbnNpb25fZGV2aWNlX3Byb2NfdGVybWluYXRvcihzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpwTmFtZSk7CisKKy8vIERpc3BhdGNoIHRhYmxlIHByb3Blcmx5IGZpbGxlZCBpbiB3aXRoIGFwcHJvcHJpYXRlIHRlcm1pbmF0b3JzIGZvciB0aGUKKy8vIHN1cHBvcnRlZCBleHRlbnNpb25zLgorZXh0ZXJuIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgaW5zdGFuY2VfZGlzcDsKKworLy8gQXJyYXkgb2YgZXh0ZW5zaW9uIHN0cmluZ3MgZm9yIGluc3RhbmNlIGV4dGVuc2lvbnMgd2Ugc3VwcG9ydC4KK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBMT0FERVJfSU5TVEFOQ0VfRVhURU5TSU9OU1tdOworCitWS0FQSV9BVFRSIGJvb2wgVktBUElfQ0FMTCBsb2FkZXJfaWNkX2luaXRfZW50cmllcyhzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSwgVmtJbnN0YW5jZSBpbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcF9naXBhKTsKKworLy8gSW5pdCBEZXZpY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGNvcmUgY29tbWFuZHMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9pbml0X2RldmljZV9kaXNwYXRjaF90YWJsZShzdHJ1Y3QgbG9hZGVyX2Rldl9kaXNwYXRjaF90YWJsZSAqZGV2X3RhYmxlLCBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBncGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2UgZGV2KTsKKworLy8gSW5pdCBEZXZpY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGV4dGVuc2lvbiBjb21tYW5kcworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgbG9hZGVyX2luaXRfZGV2aWNlX2V4dGVuc2lvbl9kaXNwYXRjaF90YWJsZShzdHJ1Y3QgbG9hZGVyX2Rldl9kaXNwYXRjaF90YWJsZSAqZGV2X3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGdpcGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGdkcGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UgaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2UgZGV2KTsKKworLy8gSW5pdCBJbnN0YW5jZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlIHdpdGggY29yZSBjb21tYW5kcworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgbG9hZGVyX2luaXRfaW5zdGFuY2VfY29yZV9kaXNwYXRjaF90YWJsZShWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICp0YWJsZSwgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBncGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UgaW5zdCk7CisKKy8vIEluaXQgSW5zdGFuY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGNvcmUgY29tbWFuZHMKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9pbml0X2luc3RhbmNlX2V4dGVuc2lvbl9kaXNwYXRjaF90YWJsZShWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICp0YWJsZSwgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBncGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbnN0YW5jZSBpbnN0KTsKKworLy8gRGV2aWNlIGNvbW1hbmQgbG9va3VwIGZ1bmN0aW9uCitWS0FQSV9BVFRSIHZvaWQqIFZLQVBJX0NBTEwgbG9hZGVyX2xvb2t1cF9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKnRhYmxlLCBjb25zdCBjaGFyICpuYW1lKTsKKworLy8gSW5zdGFuY2UgY29tbWFuZCBsb29rdXAgZnVuY3Rpb24KK1ZLQVBJX0FUVFIgdm9pZCogVktBUElfQ0FMTCBsb2FkZXJfbG9va3VwX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnRhYmxlLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZm91bmRfbmFtZSk7CisKK1ZLQVBJX0FUVFIgYm9vbCBWS0FQSV9DQUxMIGxvYWRlcl9pY2RfaW5pdF9lbnRyaWVzKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtLCBWa0luc3RhbmNlIGluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwX2dpcGEpOworCisvLyBMb2FkZXIgY29yZSBpbnN0YW5jZSB0ZXJtaW5hdG9ycworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbnN0YW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9EZXN0cm95SW5zdGFuY2UoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZXMpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqICAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcyk7CitWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlRGV2aWNlKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcygKKyAgICBjb25zdCBWa0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc0NoYWluKiBjaGFpbiwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllck5hbWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllck5hbWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKAorICAgIGNvbnN0IFZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNDaGFpbiogY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtMYXllclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9FbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24oCisgICAgY29uc3QgVmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb25DaGFpbiogY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXBpVmVyc2lvbik7CitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogICAgcEV4dGVybmFsRmVuY2VJbmZvLAorICAgIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyk7CisKKy8vIElDRCBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlCitzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtX2Rpc3BhdGNoIHsKKworICAgIC8vIC0tLS0gQ29yZSAxXzAgY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBDcmVhdGVJbnN0YW5jZTsKKyAgICBQRk5fdmtEZXN0cm95SW5zdGFuY2UgRGVzdHJveUluc3RhbmNlOworICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyBFbnVtZXJhdGVQaHlzaWNhbERldmljZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIEdldERldmljZVByb2NBZGRyOworICAgIFBGTl92a0NyZWF0ZURldmljZSBDcmVhdGVEZXZpY2U7CisgICAgUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllczsKKyAgICBQRk5fdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXM7CisgICAgUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMgRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisKKyAgICAvLyAtLS0tIENvcmUgMV8xIGNvbW1hbmRzCisgICAgUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIEVudW1lcmF0ZUluc3RhbmNlVmVyc2lvbjsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSIERlc3Ryb3lTdXJmYWNlS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfc3dhcGNoYWluIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZVN3YXBjaGFpbktIUiBDcmVhdGVTd2FwY2hhaW5LSFI7CisgICAgUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSIEdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kaXNwbGF5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSOworICAgIFBGTl92a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSOworICAgIFBGTl92a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiBHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFI7CisgICAgUEZOX3ZrQ3JlYXRlRGlzcGxheU1vZGVLSFIgQ3JlYXRlRGlzcGxheU1vZGVLSFI7CisgICAgUEZOX3ZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUjsKKyAgICBQRk5fdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIENyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kaXNwbGF5X3N3YXBjaGFpbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIENyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl94bGliX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgUEZOX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIgQ3JlYXRlWGxpYlN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfeGNiX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICBQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSIENyZWF0ZVhjYlN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX3dheWxhbmRfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICBQRk5fdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiBDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl9hbmRyb2lkX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgUEZOX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIgQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl93aW4zMl9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIgQ3JlYXRlV2luMzJTdXJmYWNlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIgRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFI7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z19yZXBvcnQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCBDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgIFBGTl92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIERlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgIFBGTl92a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCBEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z19tYXJrZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQgRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQ7CisgICAgUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIERlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVDsKKworICAgIC8vIC0tLS0gVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgIFBGTl92a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIENyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKworICAgIC8vIC0tLS0gVktfTlZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WOworCisgICAgLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIFBGTl92a0NyZWF0ZVZpU3VyZmFjZU5OIENyZWF0ZVZpU3VyZmFjZU5OOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCisgICAgLy8gLS0tLSBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCBHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWDsKKworICAgIC8vIC0tLS0gVktfRVhUX2RpcmVjdF9tb2RlX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrUmVsZWFzZURpc3BsYXlFWFQgUmVsZWFzZURpc3BsYXlFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgUEZOX3ZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIEFjcXVpcmVYbGliRGlzcGxheUVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgIFBGTl92a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCBHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQ7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCisgICAgLy8gLS0tLSBWS19FWFRfZGlzcGxheV9zdXJmYWNlX2NvdW50ZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUOworCisgICAgLy8gLS0tLSBWS19NVktfaW9zX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyAgICBQRk5fdmtDcmVhdGVJT1NTdXJmYWNlTVZLIENyZWF0ZUlPU1N1cmZhY2VNVks7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworICAgIC8vIC0tLS0gVktfTVZLX21hY29zX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIFBGTl92a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyBDcmVhdGVNYWNPU1N1cmZhY2VNVks7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCisgICAgLy8gLS0tLSBWS19FWFRfZGVidWdfdXRpbHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQ7CisgICAgUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCBTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUOworICAgIFBGTl92a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICBQRk5fdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCBEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICBQRk5fdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCBTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQgR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICBQRk5fdmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSBDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisgICAgLy8gLS0tLSBWS19FWFRfbWV0YWxfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgUEZOX3ZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIENyZWF0ZU1ldGFsU3VyZmFjZUVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKKyAgICAvLyAtLS0tIFZLX05WX2Nvb3BlcmF0aXZlX21hdHJpeCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIEdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY7CisKKyAgICAvLyAtLS0tIFZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViBHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlY7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0VYVF9oZWFkbGVzc19zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCBDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQ7Cit9OworCit1bmlvbiBsb2FkZXJfaW5zdGFuY2VfZXh0ZW5zaW9uX2VuYWJsZXMgeworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3Qga2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIgOiAxOworICAgICAgICB1aW50OF90IGtocl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24gOiAxOworICAgICAgICB1aW50OF90IGtocl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIDogMTsKKyAgICAgICAgdWludDhfdCBraHJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcyA6IDE7CisgICAgICAgIHVpbnQ4X3Qga2hyX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcyA6IDE7CisgICAgICAgIHVpbnQ4X3Qga2hyX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIgOiAxOworICAgICAgICB1aW50OF90IGV4dF9kZWJ1Z19yZXBvcnQgOiAxOworICAgICAgICB1aW50OF90IGdncF9zdHJlYW1fZGVzY3JpcHRvcl9zdXJmYWNlIDogMTsKKyAgICAgICAgdWludDhfdCBudl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIDogMTsKKyAgICAgICAgdWludDhfdCBubl92aV9zdXJmYWNlIDogMTsKKyAgICAgICAgdWludDhfdCBleHRfZGlyZWN0X21vZGVfZGlzcGxheSA6IDE7CisgICAgICAgIHVpbnQ4X3QgZXh0X2FjcXVpcmVfeGxpYl9kaXNwbGF5IDogMTsKKyAgICAgICAgdWludDhfdCBleHRfZGlzcGxheV9zdXJmYWNlX2NvdW50ZXIgOiAxOworICAgICAgICB1aW50OF90IGV4dF9kZWJ1Z191dGlscyA6IDE7CisgICAgICAgIHVpbnQ4X3QgZnVjaHNpYV9pbWFnZXBpcGVfc3VyZmFjZSA6IDE7CisgICAgfTsKKyAgICB1aW50NjRfdCBwYWRkaW5nWzRdOworfTsKKworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2dlbmVyYXRlZC92a19vYmplY3RfdHlwZXMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvZ2VuZXJhdGVkL3ZrX29iamVjdF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGY3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2dlbmVyYXRlZC92a19vYmplY3RfdHlwZXMuaApAQCAtMCwwICsxLDM4MyBAQAorLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKioKKy8vIFNlZSBoZWxwZXJfZmlsZV9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlnb0Bnb29nbGUuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmb3JiZXNAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogSm9obiBadWxhdWY8anp1bGF1ZkBsdW5hcmcuY29tPgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCisvLyBPYmplY3QgVHlwZSBlbnVtIGZvciB2YWxpZGF0aW9uIGxheWVyIGludGVybmFsIG9iamVjdCBoYW5kbGluZwordHlwZWRlZiBlbnVtIFZ1bGthbk9iamVjdFR5cGUgeworICAgIGtWdWxrYW5PYmplY3RUeXBlVW5rbm93biA9IDAsCisgICAga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSA9IDEsCisgICAga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSA9IDIsCisgICAga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UgPSAzLAorICAgIGtWdWxrYW5PYmplY3RUeXBlUXVldWUgPSA0LAorICAgIGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlID0gNSwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIgPSA2LAorICAgIGtWdWxrYW5PYmplY3RUeXBlRmVuY2UgPSA3LAorICAgIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5ID0gOCwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciA9IDksCisgICAga1Z1bGthbk9iamVjdFR5cGVJbWFnZSA9IDEwLAorICAgIGtWdWxrYW5PYmplY3RUeXBlRXZlbnQgPSAxMSwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVF1ZXJ5UG9vbCA9IDEyLAorICAgIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldyA9IDEzLAorICAgIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2VWaWV3ID0gMTQsCisgICAga1Z1bGthbk9iamVjdFR5cGVTaGFkZXJNb2R1bGUgPSAxNSwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lQ2FjaGUgPSAxNiwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0ID0gMTcsCisgICAga1Z1bGthbk9iamVjdFR5cGVSZW5kZXJQYXNzID0gMTgsCisgICAga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZSA9IDE5LAorICAgIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldExheW91dCA9IDIwLAorICAgIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlciA9IDIxLAorICAgIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wgPSAyMiwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQgPSAyMywKKyAgICBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyID0gMjQsCisgICAga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kUG9vbCA9IDI1LAorICAgIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlclljYmNyQ29udmVyc2lvbiA9IDI2LAorICAgIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gMjcsCisgICAga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSID0gMjgsCisgICAga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIgPSAyOSwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlLSFIgPSAzMCwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlNb2RlS0hSID0gMzEsCisgICAga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUID0gMzIsCisgICAga1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWCA9IDMzLAorICAgIGtWdWxrYW5PYmplY3RUeXBlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IDM0LAorICAgIGtWdWxrYW5PYmplY3RUeXBlRGVidWdVdGlsc01lc3NlbmdlckVYVCA9IDM1LAorICAgIGtWdWxrYW5PYmplY3RUeXBlVmFsaWRhdGlvbkNhY2hlRVhUID0gMzYsCisgICAga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IDM3LAorICAgIGtWdWxrYW5PYmplY3RUeXBlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSAzOCwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZU1heCA9IDM5LAorICAgIC8vIEFsaWFzZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsdHkgb2YgInByb21vdGVkIiB0eXBlcworICAgIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSID0ga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0ga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLAorfSBWdWxrYW5PYmplY3RUeXBlOworCisvLyBBcnJheSBvZiBvYmplY3QgbmFtZSBzdHJpbmdzIGZvciBPQkpFQ1RfVFlQRSBlbnVtIGNvbnZlcnNpb24KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb2JqZWN0X3N0cmluZ1trVnVsa2FuT2JqZWN0VHlwZU1heF0gPSB7CisgICAgIlVua25vd24iLAorICAgICJJbnN0YW5jZSIsCisgICAgIlBoeXNpY2FsRGV2aWNlIiwKKyAgICAiRGV2aWNlIiwKKyAgICAiUXVldWUiLAorICAgICJTZW1hcGhvcmUiLAorICAgICJDb21tYW5kQnVmZmVyIiwKKyAgICAiRmVuY2UiLAorICAgICJEZXZpY2VNZW1vcnkiLAorICAgICJCdWZmZXIiLAorICAgICJJbWFnZSIsCisgICAgIkV2ZW50IiwKKyAgICAiUXVlcnlQb29sIiwKKyAgICAiQnVmZmVyVmlldyIsCisgICAgIkltYWdlVmlldyIsCisgICAgIlNoYWRlck1vZHVsZSIsCisgICAgIlBpcGVsaW5lQ2FjaGUiLAorICAgICJQaXBlbGluZUxheW91dCIsCisgICAgIlJlbmRlclBhc3MiLAorICAgICJQaXBlbGluZSIsCisgICAgIkRlc2NyaXB0b3JTZXRMYXlvdXQiLAorICAgICJTYW1wbGVyIiwKKyAgICAiRGVzY3JpcHRvclBvb2wiLAorICAgICJEZXNjcmlwdG9yU2V0IiwKKyAgICAiRnJhbWVidWZmZXIiLAorICAgICJDb21tYW5kUG9vbCIsCisgICAgIlNhbXBsZXJZY2JjckNvbnZlcnNpb24iLAorICAgICJEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLAorICAgICJTdXJmYWNlS0hSIiwKKyAgICAiU3dhcGNoYWluS0hSIiwKKyAgICAiRGlzcGxheUtIUiIsCisgICAgIkRpc3BsYXlNb2RlS0hSIiwKKyAgICAiRGVidWdSZXBvcnRDYWxsYmFja0VYVCIsCisgICAgIk9iamVjdFRhYmxlTlZYIiwKKyAgICAiSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsCisgICAgIkRlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLAorICAgICJWYWxpZGF0aW9uQ2FjaGVFWFQiLAorICAgICJBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsCisgICAgIlBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIiwKK307CisKKy8vIEhlbHBlciBhcnJheSB0byBnZXQgVnVsa2FuIFZLX0VYVF9kZWJ1Z19yZXBvcnQgb2JqZWN0IHR5cGUgZW51bSBmcm9tIHRoZSBpbnRlcm5hbCBsYXllcnMgdmVyc2lvbgorY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgZ2V0X2RlYnVnX3JlcG9ydF9lbnVtW10gPSB7CisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAvLyBrVnVsa2FuT2JqZWN0VHlwZVVua25vd24KKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFVUVfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUXVldWUKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZQorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5CisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRVZFTlRfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRXZlbnQKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVdfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldworICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUltYWdlVmlldworICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVNoYWRlck1vZHVsZQorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRV9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUNhY2hlCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVF9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUxheW91dAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVSZW5kZXJQYXNzCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0TGF5b3V0CisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlcgorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVGcmFtZWJ1ZmZlcgorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0xfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZFBvb2wKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXJZY2JjckNvbnZlcnNpb24KKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9LSFJfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUgorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlNb2RlS0hSCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVidWdSZXBvcnRDYWxsYmFja0VYVAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZU9iamVjdFRhYmxlTlZYCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlhfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFRfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlVmFsaWRhdGlvbkNhY2hlRVhUCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlZfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTAorfTsKKworLy8gSGVscGVyIGFycmF5IHRvIGdldCBPZmZpY2lhbCBWdWxrYW4gVmtPYmplY3RUeXBlIGVudW0gZnJvbSB0aGUgaW50ZXJuYWwgbGF5ZXJzIHZlcnNpb24KK2NvbnN0IFZrT2JqZWN0VHlwZSBnZXRfb2JqZWN0X3R5cGVfZW51bVtdID0geworICAgIFZLX09CSkVDVF9UWVBFX1VOS05PV04sIC8vIGtWdWxrYW5PYmplY3RUeXBlVW5rbm93bgorICAgIFZLX09CSkVDVF9UWVBFX0lOU1RBTkNFLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UKKyAgICBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0UsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZQorICAgIFZLX09CSkVDVF9UWVBFX0RFVklDRSwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURldmljZQorICAgIFZLX09CSkVDVF9UWVBFX1FVRVVFLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUXVldWUKKyAgICBWS19PQkpFQ1RfVFlQRV9TRU1BUEhPUkUsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUKKyAgICBWS19PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUiwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIKKyAgICBWS19PQkpFQ1RfVFlQRV9GRU5DRSwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlCisgICAgVktfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWSwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeQorICAgIFZLX09CSkVDVF9UWVBFX0JVRkZFUiwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcgorICAgIFZLX09CSkVDVF9UWVBFX0lNQUdFLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UKKyAgICBWS19PQkpFQ1RfVFlQRV9FVkVOVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUV2ZW50CisgICAgVktfT0JKRUNUX1RZUEVfUVVFUllfUE9PTCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVF1ZXJ5UG9vbAorICAgIFZLX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldworICAgIFZLX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVcsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVJbWFnZVZpZXcKKyAgICBWS19PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlU2hhZGVyTW9kdWxlCisgICAgVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEUsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUNhY2hlCisgICAgVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQKKyAgICBWS19PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTUywgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MKKyAgICBWS19PQkpFQ1RfVFlQRV9QSVBFTElORSwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lCisgICAgVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldExheW91dAorICAgIFZLX09CSkVDVF9UWVBFX1NBTVBMRVIsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyCisgICAgVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wKKyAgICBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQKKyAgICBWS19PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUiwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyCisgICAgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZFBvb2wKKyAgICBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT04sICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uCisgICAgVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEUsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUKKyAgICBWS19PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUiwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIKKyAgICBWS19PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSCisgICAgVktfT0JKRUNUX1RZUEVfRElTUExBWV9LSFIsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5S0hSCisgICAgVktfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUiwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlNb2RlS0hSCisgICAgVktfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQKKyAgICBWS19PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlT2JqZWN0VGFibGVOVlgKKyAgICBWS19PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWAorICAgIFZLX09CSkVDVF9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUCisgICAgVktfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVWYWxpZGF0aW9uQ2FjaGVFWFQKKyAgICBWS19PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYKKyAgICBWS19PQkpFQ1RfVFlQRV9QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX0lOVEVMLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwKK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdG8gVmtPYmplY3RUeXBlCitzdGF0aWMgaW5saW5lIFZrT2JqZWN0VHlwZSBjb252ZXJ0RGVidWdSZXBvcnRPYmplY3RUb0NvcmVPYmplY3QoVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgZGVidWdfcmVwb3J0X29iail7CisgICAgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9VTktOT1dOOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX1VOS05PV047CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTlNUQU5DRV9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX0lOU1RBTkNFOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfREVWSUNFOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFVUVfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9RVUVVRTsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX1NFTUFQSE9SRTsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVI7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GRU5DRV9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX0ZFTkNFOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUlk7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9CVUZGRVI7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX0lNQUdFOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRVZFTlRfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9FVkVOVDsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9RVUVSWV9QT09MOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVdfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9CVUZGRVJfVklFVzsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEU7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRV9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTUzsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfUElQRUxJTkU7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVQ7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfU0FNUExFUjsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTDsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURTsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFI7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUjsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfRElTUExBWV9LSFI7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUjsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfRVhUOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfS0hSX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfS0hSOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWF9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlg7CisgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYX0VYVCkgeworICAgICAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWDsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9LSFJfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fS0hSOworICAgIH0gZWxzZSBpZiAoZGVidWdfcmVwb3J0X29iaiA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFRfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVDsKKyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlZfRVhUKSB7CisgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WOworICAgIH0KKyAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfVU5LTk9XTjsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB0byBWa09iamVjdFR5cGUKK3N0YXRpYyBpbmxpbmUgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgY29udmVydENvcmVPYmplY3RUb0RlYnVnUmVwb3J0T2JqZWN0KFZrT2JqZWN0VHlwZSBjb3JlX3JlcG9ydF9vYmopeworICAgIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9JTlNUQU5DRSkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lOU1RBTkNFX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0UpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX0RFVklDRSkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfUVVFVUUpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfU0VNQVBIT1JFKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUikgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9GRU5DRSkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfQlVGRkVSKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9JTUFHRSkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9FVkVOVCkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VWRU5UX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9RVUVSWV9QT09MKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVcpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfVklFV19FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfSU1BR0VfVklFVykgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEUpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRSkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVCkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfU0FNUExFUikgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTCkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVIpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT04pIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFJfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFIpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUikgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUl9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0VYVCkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0tIUikgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0tIUl9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWCkgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlhfRVhUOworICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlgpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYX0VYVDsKKyAgICB9IGVsc2UgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fS0hSKSB7CisgICAgICAgIHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0tIUl9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVF9FWFQ7CisgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gVktfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVikgeworICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlZfRVhUOworICAgIH0KKyAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9ncGFfaGVscGVyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2dwYV9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg4OThiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9ncGFfaGVscGVyLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkZWJ1Z191dGlscy5oIgorI2luY2x1ZGUgIndzaS5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgKnRyYW1wb2xpbmVHZXRQcm9jQWRkcihzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIC8vIERvbid0IGluY2x1ZGUgb3IgY2hlY2sgZ2xvYmFsIGZ1bmN0aW9ucworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXRJbnN0YW5jZVByb2NBZGRyIikpIHJldHVybiB2a0dldEluc3RhbmNlUHJvY0FkZHI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0Rlc3Ryb3lJbnN0YW5jZSIpKSByZXR1cm4gdmtEZXN0cm95SW5zdGFuY2U7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIpKSByZXR1cm4gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMiKSkgcmV0dXJuIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIikpIHJldHVybiB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiKSkgcmV0dXJuIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIikpIHJldHVybiB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMiKSkgcmV0dXJuIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyIpKSByZXR1cm4gdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIikpIHJldHVybiB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIikpIHJldHVybiB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyIpKSByZXR1cm4gdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVEZXZpY2UiKSkgcmV0dXJuIHZrQ3JlYXRlRGV2aWNlOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXREZXZpY2VQcm9jQWRkciIpKSByZXR1cm4gdmtHZXREZXZpY2VQcm9jQWRkcjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveURldmljZSIpKSByZXR1cm4gdmtEZXN0cm95RGV2aWNlOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXREZXZpY2VRdWV1ZSIpKSByZXR1cm4gdmtHZXREZXZpY2VRdWV1ZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrUXVldWVTdWJtaXQiKSkgcmV0dXJuIHZrUXVldWVTdWJtaXQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a1F1ZXVlV2FpdElkbGUiKSkgcmV0dXJuIHZrUXVldWVXYWl0SWRsZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGV2aWNlV2FpdElkbGUiKSkgcmV0dXJuIHZrRGV2aWNlV2FpdElkbGU7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0FsbG9jYXRlTWVtb3J5IikpIHJldHVybiB2a0FsbG9jYXRlTWVtb3J5OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtGcmVlTWVtb3J5IikpIHJldHVybiB2a0ZyZWVNZW1vcnk7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a01hcE1lbW9yeSIpKSByZXR1cm4gdmtNYXBNZW1vcnk7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a1VubWFwTWVtb3J5IikpIHJldHVybiB2a1VubWFwTWVtb3J5OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyIpKSByZXR1cm4gdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIpKSByZXR1cm4gdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IikpIHJldHVybiB2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzIikpIHJldHVybiB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyIpKSByZXR1cm4gdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIikpIHJldHVybiB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQmluZEltYWdlTWVtb3J5IikpIHJldHVybiB2a0JpbmRJbWFnZU1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQmluZEJ1ZmZlck1lbW9yeSIpKSByZXR1cm4gdmtCaW5kQnVmZmVyTWVtb3J5OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtRdWV1ZUJpbmRTcGFyc2UiKSkgcmV0dXJuIHZrUXVldWVCaW5kU3BhcnNlOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVGZW5jZSIpKSByZXR1cm4gdmtDcmVhdGVGZW5jZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveUZlbmNlIikpIHJldHVybiB2a0Rlc3Ryb3lGZW5jZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0RmVuY2VTdGF0dXMiKSkgcmV0dXJuIHZrR2V0RmVuY2VTdGF0dXM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a1Jlc2V0RmVuY2VzIikpIHJldHVybiB2a1Jlc2V0RmVuY2VzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtXYWl0Rm9yRmVuY2VzIikpIHJldHVybiB2a1dhaXRGb3JGZW5jZXM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZVNlbWFwaG9yZSIpKSByZXR1cm4gdmtDcmVhdGVTZW1hcGhvcmU7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0Rlc3Ryb3lTZW1hcGhvcmUiKSkgcmV0dXJuIHZrRGVzdHJveVNlbWFwaG9yZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ3JlYXRlRXZlbnQiKSkgcmV0dXJuIHZrQ3JlYXRlRXZlbnQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0Rlc3Ryb3lFdmVudCIpKSByZXR1cm4gdmtEZXN0cm95RXZlbnQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldEV2ZW50U3RhdHVzIikpIHJldHVybiB2a0dldEV2ZW50U3RhdHVzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtTZXRFdmVudCIpKSByZXR1cm4gdmtTZXRFdmVudDsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrUmVzZXRFdmVudCIpKSByZXR1cm4gdmtSZXNldEV2ZW50OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVRdWVyeVBvb2wiKSkgcmV0dXJuIHZrQ3JlYXRlUXVlcnlQb29sOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtEZXN0cm95UXVlcnlQb29sIikpIHJldHVybiB2a0Rlc3Ryb3lRdWVyeVBvb2w7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldFF1ZXJ5UG9vbFJlc3VsdHMiKSkgcmV0dXJuIHZrR2V0UXVlcnlQb29sUmVzdWx0czsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ3JlYXRlQnVmZmVyIikpIHJldHVybiB2a0NyZWF0ZUJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveUJ1ZmZlciIpKSByZXR1cm4gdmtEZXN0cm95QnVmZmVyOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVCdWZmZXJWaWV3IikpIHJldHVybiB2a0NyZWF0ZUJ1ZmZlclZpZXc7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0Rlc3Ryb3lCdWZmZXJWaWV3IikpIHJldHVybiB2a0Rlc3Ryb3lCdWZmZXJWaWV3OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVJbWFnZSIpKSByZXR1cm4gdmtDcmVhdGVJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveUltYWdlIikpIHJldHVybiB2a0Rlc3Ryb3lJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIpKSByZXR1cm4gdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVJbWFnZVZpZXciKSkgcmV0dXJuIHZrQ3JlYXRlSW1hZ2VWaWV3OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtEZXN0cm95SW1hZ2VWaWV3IikpIHJldHVybiB2a0Rlc3Ryb3lJbWFnZVZpZXc7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIpKSByZXR1cm4gdmtDcmVhdGVTaGFkZXJNb2R1bGU7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUiKSkgcmV0dXJuIHZrRGVzdHJveVNoYWRlck1vZHVsZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ3JlYXRlUGlwZWxpbmVDYWNoZSIpKSByZXR1cm4gdmtDcmVhdGVQaXBlbGluZUNhY2hlOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtEZXN0cm95UGlwZWxpbmVDYWNoZSIpKSByZXR1cm4gdmtEZXN0cm95UGlwZWxpbmVDYWNoZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0UGlwZWxpbmVDYWNoZURhdGEiKSkgcmV0dXJuIHZrR2V0UGlwZWxpbmVDYWNoZURhdGE7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a01lcmdlUGlwZWxpbmVDYWNoZXMiKSkgcmV0dXJuIHZrTWVyZ2VQaXBlbGluZUNhY2hlczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiKSkgcmV0dXJuIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiKSkgcmV0dXJuIHZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveVBpcGVsaW5lIikpIHJldHVybiB2a0Rlc3Ryb3lQaXBlbGluZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiKSkgcmV0dXJuIHZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0Rlc3Ryb3lQaXBlbGluZUxheW91dCIpKSByZXR1cm4gdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZVNhbXBsZXIiKSkgcmV0dXJuIHZrQ3JlYXRlU2FtcGxlcjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveVNhbXBsZXIiKSkgcmV0dXJuIHZrRGVzdHJveVNhbXBsZXI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiKSkgcmV0dXJuIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dDsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiKSkgcmV0dXJuIHZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZURlc2NyaXB0b3JQb29sIikpIHJldHVybiB2a0NyZWF0ZURlc2NyaXB0b3JQb29sOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtEZXN0cm95RGVzY3JpcHRvclBvb2wiKSkgcmV0dXJuIHZrRGVzdHJveURlc2NyaXB0b3JQb29sOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtSZXNldERlc2NyaXB0b3JQb29sIikpIHJldHVybiB2a1Jlc2V0RGVzY3JpcHRvclBvb2w7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiKSkgcmV0dXJuIHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRnJlZURlc2NyaXB0b3JTZXRzIikpIHJldHVybiB2a0ZyZWVEZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrVXBkYXRlRGVzY3JpcHRvclNldHMiKSkgcmV0dXJuIHZrVXBkYXRlRGVzY3JpcHRvclNldHM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZUZyYW1lYnVmZmVyIikpIHJldHVybiB2a0NyZWF0ZUZyYW1lYnVmZmVyOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtEZXN0cm95RnJhbWVidWZmZXIiKSkgcmV0dXJuIHZrRGVzdHJveUZyYW1lYnVmZmVyOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVSZW5kZXJQYXNzIikpIHJldHVybiB2a0NyZWF0ZVJlbmRlclBhc3M7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0Rlc3Ryb3lSZW5kZXJQYXNzIikpIHJldHVybiB2a0Rlc3Ryb3lSZW5kZXJQYXNzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiKSkgcmV0dXJuIHZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVDb21tYW5kUG9vbCIpKSByZXR1cm4gdmtDcmVhdGVDb21tYW5kUG9vbDsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveUNvbW1hbmRQb29sIikpIHJldHVybiB2a0Rlc3Ryb3lDb21tYW5kUG9vbDsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrUmVzZXRDb21tYW5kUG9vbCIpKSByZXR1cm4gdmtSZXNldENvbW1hbmRQb29sOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzIikpIHJldHVybiB2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0ZyZWVDb21tYW5kQnVmZmVycyIpKSByZXR1cm4gdmtGcmVlQ29tbWFuZEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0JlZ2luQ29tbWFuZEJ1ZmZlciIpKSByZXR1cm4gdmtCZWdpbkNvbW1hbmRCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0VuZENvbW1hbmRCdWZmZXIiKSkgcmV0dXJuIHZrRW5kQ29tbWFuZEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrUmVzZXRDb21tYW5kQnVmZmVyIikpIHJldHVybiB2a1Jlc2V0Q29tbWFuZEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kQmluZFBpcGVsaW5lIikpIHJldHVybiB2a0NtZEJpbmRQaXBlbGluZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kQmluZERlc2NyaXB0b3JTZXRzIikpIHJldHVybiB2a0NtZEJpbmREZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiKSkgcmV0dXJuIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZEJpbmRJbmRleEJ1ZmZlciIpKSByZXR1cm4gdmtDbWRCaW5kSW5kZXhCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFNldFZpZXdwb3J0IikpIHJldHVybiB2a0NtZFNldFZpZXdwb3J0OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRTZXRTY2lzc29yIikpIHJldHVybiB2a0NtZFNldFNjaXNzb3I7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFNldExpbmVXaWR0aCIpKSByZXR1cm4gdmtDbWRTZXRMaW5lV2lkdGg7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFNldERlcHRoQmlhcyIpKSByZXR1cm4gdmtDbWRTZXREZXB0aEJpYXM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFNldEJsZW5kQ29uc3RhbnRzIikpIHJldHVybiB2a0NtZFNldEJsZW5kQ29uc3RhbnRzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRTZXREZXB0aEJvdW5kcyIpKSByZXR1cm4gdmtDbWRTZXREZXB0aEJvdW5kczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrIikpIHJldHVybiB2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzazsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayIpKSByZXR1cm4gdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIikpIHJldHVybiB2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2U7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZERyYXciKSkgcmV0dXJuIHZrQ21kRHJhdzsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kRHJhd0luZGV4ZWQiKSkgcmV0dXJuIHZrQ21kRHJhd0luZGV4ZWQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZERyYXdJbmRpcmVjdCIpKSByZXR1cm4gdmtDbWREcmF3SW5kaXJlY3Q7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QiKSkgcmV0dXJuIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdDsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kRGlzcGF0Y2giKSkgcmV0dXJuIHZrQ21kRGlzcGF0Y2g7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZERpc3BhdGNoSW5kaXJlY3QiKSkgcmV0dXJuIHZrQ21kRGlzcGF0Y2hJbmRpcmVjdDsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kQ29weUJ1ZmZlciIpKSByZXR1cm4gdmtDbWRDb3B5QnVmZmVyOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRDb3B5SW1hZ2UiKSkgcmV0dXJuIHZrQ21kQ29weUltYWdlOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRCbGl0SW1hZ2UiKSkgcmV0dXJuIHZrQ21kQmxpdEltYWdlOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSIpKSByZXR1cm4gdmtDbWRDb3B5QnVmZmVyVG9JbWFnZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIiKSkgcmV0dXJuIHZrQ21kQ29weUltYWdlVG9CdWZmZXI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFVwZGF0ZUJ1ZmZlciIpKSByZXR1cm4gdmtDbWRVcGRhdGVCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZEZpbGxCdWZmZXIiKSkgcmV0dXJuIHZrQ21kRmlsbEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kQ2xlYXJDb2xvckltYWdlIikpIHJldHVybiB2a0NtZENsZWFyQ29sb3JJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIpKSByZXR1cm4gdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRDbGVhckF0dGFjaG1lbnRzIikpIHJldHVybiB2a0NtZENsZWFyQXR0YWNobWVudHM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFJlc29sdmVJbWFnZSIpKSByZXR1cm4gdmtDbWRSZXNvbHZlSW1hZ2U7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFNldEV2ZW50IikpIHJldHVybiB2a0NtZFNldEV2ZW50OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRSZXNldEV2ZW50IikpIHJldHVybiB2a0NtZFJlc2V0RXZlbnQ7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFdhaXRFdmVudHMiKSkgcmV0dXJuIHZrQ21kV2FpdEV2ZW50czsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kUGlwZWxpbmVCYXJyaWVyIikpIHJldHVybiB2a0NtZFBpcGVsaW5lQmFycmllcjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kQmVnaW5RdWVyeSIpKSByZXR1cm4gdmtDbWRCZWdpblF1ZXJ5OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRFbmRRdWVyeSIpKSByZXR1cm4gdmtDbWRFbmRRdWVyeTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kUmVzZXRRdWVyeVBvb2wiKSkgcmV0dXJuIHZrQ21kUmVzZXRRdWVyeVBvb2w7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZFdyaXRlVGltZXN0YW1wIikpIHJldHVybiB2a0NtZFdyaXRlVGltZXN0YW1wOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIpKSByZXR1cm4gdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0czsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kUHVzaENvbnN0YW50cyIpKSByZXR1cm4gdmtDbWRQdXNoQ29uc3RhbnRzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRCZWdpblJlbmRlclBhc3MiKSkgcmV0dXJuIHZrQ21kQmVnaW5SZW5kZXJQYXNzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWROZXh0U3VicGFzcyIpKSByZXR1cm4gdmtDbWROZXh0U3VicGFzczsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ21kRW5kUmVuZGVyUGFzcyIpKSByZXR1cm4gdmtDbWRFbmRSZW5kZXJQYXNzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRFeGVjdXRlQ29tbWFuZHMiKSkgcmV0dXJuIHZrQ21kRXhlY3V0ZUNvbW1hbmRzOworCisgICAgLy8gQ29yZSAxLjEgZnVuY3Rpb25zCisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzIikpIHJldHVybiB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiIpKSByZXR1cm4gdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiIpKSByZXR1cm4gdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyIikpIHJldHVybiB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIpKSByZXR1cm4gdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiIpKSByZXR1cm4gdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIiKSkgcmV0dXJuIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIikpCisgICAgICAgIHJldHVybiB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiKSkgcmV0dXJuIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIikpIHJldHVybiB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIikpIHJldHVybiB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0JpbmRCdWZmZXJNZW1vcnkyIikpIHJldHVybiB2a0JpbmRCdWZmZXJNZW1vcnkyOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtCaW5kSW1hZ2VNZW1vcnkyIikpIHJldHVybiB2a0JpbmRJbWFnZU1lbW9yeTI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzIikpIHJldHVybiB2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDbWRTZXREZXZpY2VNYXNrIikpIHJldHVybiB2a0NtZFNldERldmljZU1hc2s7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NtZERpc3BhdGNoQmFzZSIpKSByZXR1cm4gdmtDbWREaXNwYXRjaEJhc2U7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiIpKSByZXR1cm4gdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a1RyaW1Db21tYW5kUG9vbCIpKSByZXR1cm4gdmtUcmltQ29tbWFuZFBvb2w7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldERldmljZVF1ZXVlMiIpKSByZXR1cm4gdmtHZXREZXZpY2VRdWV1ZTI7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKSkgcmV0dXJuIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKSkgcmV0dXJuIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb247CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IikpIHJldHVybiB2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0OworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiKSkgcmV0dXJuIHZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIikpIHJldHVybiB2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUiKSkgcmV0dXJuIHZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIikpIHJldHVybiB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMjsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiIpKSByZXR1cm4gdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyOworCisgICAgLy8gSW5zdGFuY2UgZXh0ZW5zaW9ucworICAgIHZvaWQgKmFkZHI7CisgICAgaWYgKGRlYnVnX3V0aWxzX0luc3RhbmNlR3BhKGluc3QsIGZ1bmNOYW1lLCAmYWRkcikpIHJldHVybiBhZGRyOworCisgICAgaWYgKHdzaV9zd2FwY2hhaW5faW5zdGFuY2VfZ3BhKGluc3QsIGZ1bmNOYW1lLCAmYWRkcikpIHJldHVybiBhZGRyOworCisgICAgaWYgKGV4dGVuc2lvbl9pbnN0YW5jZV9ncGEoaW5zdCwgZnVuY05hbWUsICZhZGRyKSkgcmV0dXJuIGFkZHI7CisKKyAgICAvLyBVbmtub3duIHBoeXNpY2FsIGRldmljZSBleHRlbnNpb25zCisgICAgaWYgKGxvYWRlcl9waHlzX2Rldl9leHRfZ3BhKGluc3QsIGZ1bmNOYW1lLCB0cnVlLCAmYWRkciwgTlVMTCkpIHJldHVybiBhZGRyOworCisgICAgLy8gVW5rbm93biBkZXZpY2UgZXh0ZW5zaW9ucworICAgIGFkZHIgPSBsb2FkZXJfZGV2X2V4dF9ncGEoaW5zdCwgZnVuY05hbWUpOworICAgIHJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmdsb2JhbEdldFByb2NBZGRyKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpZiAoIW5hbWUgfHwgbmFtZVswXSAhPSAndicgfHwgbmFtZVsxXSAhPSAnaycpIHJldHVybiBOVUxMOworCisgICAgbmFtZSArPSAyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVJbnN0YW5jZSIpKSByZXR1cm4gdmtDcmVhdGVJbnN0YW5jZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIikpIHJldHVybiB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMiKSkgcmV0dXJuIHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiIpKSByZXR1cm4gdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb247CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpsb2FkZXJfbm9uX3Bhc3N0aHJvdWdoX2dkcGEoY29uc3QgY2hhciAqbmFtZSkgeworICAgIGlmICghbmFtZSB8fCBuYW1lWzBdICE9ICd2JyB8fCBuYW1lWzFdICE9ICdrJykgcmV0dXJuIE5VTEw7CisKKyAgICBuYW1lICs9IDI7CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0RGV2aWNlUHJvY0FkZHIiKSkgcmV0dXJuIHZrR2V0RGV2aWNlUHJvY0FkZHI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lEZXZpY2UiKSkgcmV0dXJuIHZrRGVzdHJveURldmljZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0RGV2aWNlUXVldWUiKSkgcmV0dXJuIHZrR2V0RGV2aWNlUXVldWU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldERldmljZVF1ZXVlMiIpKSByZXR1cm4gdmtHZXREZXZpY2VRdWV1ZTI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiKSkgcmV0dXJuIHZrQWxsb2NhdGVDb21tYW5kQnVmZmVyczsKKworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvZnVuY3Rpb25fZGV2aWNlX2NoYWluLnBuZyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2Z1bmN0aW9uX2RldmljZV9jaGFpbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiYTdhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2Z1bmN0aW9uX2RldmljZV9jaGFpbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvZnVuY3Rpb25fZGV2aWNlX2NoYWluX3doaXRlLnBuZyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2Z1bmN0aW9uX2RldmljZV9jaGFpbl93aGl0ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxMDdhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2Z1bmN0aW9uX2RldmljZV9jaGFpbl93aGl0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvZnVuY3Rpb25faW5zdGFuY2VfY2hhaW4ucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvZnVuY3Rpb25faW5zdGFuY2VfY2hhaW4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OWZkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2ltYWdlcy9mdW5jdGlvbl9pbnN0YW5jZV9jaGFpbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvZnVuY3Rpb25faW5zdGFuY2VfY2hhaW5fd2hpdGUucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvZnVuY3Rpb25faW5zdGFuY2VfY2hhaW5fd2hpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzA1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2ltYWdlcy9mdW5jdGlvbl9pbnN0YW5jZV9jaGFpbl93aGl0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvaGlnaF9sZXZlbF9sb2FkZXIucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvaGlnaF9sZXZlbF9sb2FkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWFiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2ltYWdlcy9oaWdoX2xldmVsX2xvYWRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvaGlnaF9sZXZlbF9sb2FkZXJfd2hpdGUucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvaGlnaF9sZXZlbF9sb2FkZXJfd2hpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4M2NhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2ltYWdlcy9oaWdoX2xldmVsX2xvYWRlcl93aGl0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9hcHAucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9hcHAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGZjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2ltYWdlcy9sb2FkZXJfZGV2aWNlX2NoYWluX2FwcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9hcHBfd2hpdGUucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9hcHBfd2hpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDI4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2ltYWdlcy9sb2FkZXJfZGV2aWNlX2NoYWluX2FwcF93aGl0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9sb2FkZXIucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9sb2FkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjZhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2ltYWdlcy9sb2FkZXJfZGV2aWNlX2NoYWluX2xvYWRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9sb2FkZXJfd2hpdGUucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2RldmljZV9jaGFpbl9sb2FkZXJfd2hpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5M2E1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2ltYWdlcy9sb2FkZXJfZGV2aWNlX2NoYWluX2xvYWRlcl93aGl0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2luc3RhbmNlX2NoYWluLnBuZyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2xvYWRlcl9pbnN0YW5jZV9jaGFpbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjMDZkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2xvYWRlcl9pbnN0YW5jZV9jaGFpbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2luc3RhbmNlX2NoYWluX3doaXRlLnBuZyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2xvYWRlcl9pbnN0YW5jZV9jaGFpbl93aGl0ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzYzA2NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2xvYWRlcl9pbnN0YW5jZV9jaGFpbl93aGl0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2xheWVyX29yZGVyLnBuZyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2xvYWRlcl9sYXllcl9vcmRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiOWVhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2xvYWRlcl9sYXllcl9vcmRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9pbWFnZXMvbG9hZGVyX2xheWVyX29yZGVyX3doaXRlLnBuZyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2xvYWRlcl9sYXllcl9vcmRlcl93aGl0ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyNWRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvaW1hZ2VzL2xvYWRlcl9sYXllcl9vcmRlcl93aGl0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9sb2FkZXIuYXBzIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9sb2FkZXIuYXBzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYTdmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2xvYWRlci5hcHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9sb2FkZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvbG9hZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwODRjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvbG9hZGVyLmMKQEAgLTAsMCArMSw4MTM4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IE1hcmsgWW91bmcgPG1hcmt5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IExlbm55IEtvbW93IDxsZW5ueUBsdW5hcmcuY29tPgorICoKKyAqLworCisvLyBUaGlzIG5lZWRzIHRvIGJlIGRlZmluZWQgZmlyc3QsIG9yIGVsc2Ugd2UnbGwgZ2V0IHJlZGVmaW5pdGlvbnMgb24gTlRTVEFUVVMgdmFsdWVzCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFVNREZfVVNJTkdfTlRTVEFUVVMKKyNpbmNsdWRlIDxudHN0YXR1cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNlbmRpZgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKy8vIFRpbWUgcmVsYXRlZCBmdW5jdGlvbnMKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBkZWZpbmVkKF9XSU4zMikKKyNpbmNsdWRlICJkaXJlbnRfb25fd2luZG93cy5oIgorI2Vsc2UgIC8vIF9XSU4zMgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2VuZGlmICAvLyBfV0lOMzIKKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJsb2FkZXIuaCIKKyNpbmNsdWRlICJncGFfaGVscGVyLmgiCisjaW5jbHVkZSAiZGVidWdfdXRpbHMuaCIKKyNpbmNsdWRlICJ3c2kuaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfaWNkLmgiCisjaW5jbHVkZSAiY0pTT04uaCIKKyNpbmNsdWRlICJtdXJtdXJoYXNoLmgiCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyNpbmNsdWRlIDxjZmdtZ3IzMi5oPgorI2luY2x1ZGUgPGluaXRndWlkLmg+CisjaW5jbHVkZSA8ZGV2cGtleS5oPgorI2luY2x1ZGUgPHdpbnRlcm5sLmg+CisjaW5jbHVkZSAiYWRhcHRlcnMuaCIKKyNpbmNsdWRlICJkeGdpX2xvYWRlci5oIgorI2VuZGlmCisKKy8vIFRoaXMgaXMgYSBDTWFrZSBnZW5lcmF0ZWQgZmlsZSB3aXRoICNkZWZpbmVzIGZvciBhbnkgZnVuY3Rpb25zL2luY2x1ZGVzCisvLyB0aGF0IGl0IGZvdW5kIHByZXNlbnQuICBUaGlzIGlzIGN1cnJlbnRseSBuZWNlc3NhcnkgdG8gcHJvcGVybHkgZGV0ZXJtaW5lCisvLyBpZiBzZWN1cmVfZ2V0ZW52IG9yIF9fc2VjdXJlX2dldGVudiBhcmUgcHJlc2VudAorI2lmICFkZWZpbmVkKFZVTEtBTl9OT05fQ01BS0VfQlVJTEQpCisjaW5jbHVkZSAibG9hZGVyX2NtYWtlX2NvbmZpZy5oIgorI2VuZGlmICAvLyAhZGVmaW5lZChWVUxLQU5fTk9OX0NNQUtFX0JVSUxEKQorCisvLyBHZW5lcmF0ZWQgZmlsZSBjb250YWluaW5nIGFsbCB0aGUgZXh0ZW5zaW9uIGRhdGEKKyNpbmNsdWRlICJ2a19sb2FkZXJfZXh0ZW5zaW9ucy5jIgorCisvLyBPdmVycmlkZSBsYXllciBpbmZvcm1hdGlvbgorI2RlZmluZSBWS19PVkVSUklERV9MQVlFUl9OQU1FICJWS19MQVlFUl9MVU5BUkdfb3ZlcnJpZGUiCisKK3N0cnVjdCBsb2FkZXJfc3RydWN0IGxvYWRlciA9IHswfTsKKy8vIFRMUyBmb3IgaW5zdGFuY2UgZm9yIGFsbG9jL2ZyZWUgY2FsbGJhY2tzCitUSFJFQURfTE9DQUxfREVDTCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICp0bHNfaW5zdGFuY2U7CisKK3N0YXRpYyBzaXplX3QgbG9hZGVyX3BsYXRmb3JtX2NvbWJpbmVfcGF0aChjaGFyICpkZXN0LCBzaXplX3QgbGVuLCAuLi4pOworCitzdHJ1Y3QgbG9hZGVyX3BoeXNfZGV2X3Blcl9pY2QgeworICAgIHVpbnQzMl90IGNvdW50OworICAgIFZrUGh5c2ljYWxEZXZpY2UgKnBoeXNfZGV2czsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICp0aGlzX2ljZF90ZXJtOworfTsKKworZW51bSBsb2FkZXJfZGVidWcgeworICAgIExPQURFUl9JTkZPX0JJVCA9IDB4MDEsCisgICAgTE9BREVSX1dBUk5fQklUID0gMHgwMiwKKyAgICBMT0FERVJfUEVSRl9CSVQgPSAweDA0LAorICAgIExPQURFUl9FUlJPUl9CSVQgPSAweDA4LAorICAgIExPQURFUl9ERUJVR19CSVQgPSAweDEwLAorfTsKKwordWludDMyX3QgZ19sb2FkZXJfZGVidWcgPSAwOwordWludDMyX3QgZ19sb2FkZXJfbG9nX21zZ3MgPSAwOworCitlbnVtIGxvYWRlcl9kYXRhX2ZpbGVzX3R5cGUgeworICAgIExPQURFUl9EQVRBX0ZJTEVfTUFOSUZFU1RfSUNEID0gMCwKKyAgICBMT0FERVJfREFUQV9GSUxFX01BTklGRVNUX0xBWUVSLAorICAgIExPQURFUl9EQVRBX0ZJTEVfTlVNX1RZUEVTICAvLyBOb3QgYSByZWFsIGZpZWxkLCB1c2VkIGZvciBwb3NzaWJsZSBsb29wIHRlcm1pbmF0b3IKK307CisKKy8vIHRocmVhZCBzYWZldHkgbG9jayBmb3IgYWNjZXNzaW5nIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgc3VjaCBhcyAibG9hZGVyIgorLy8gYWxsIGVudHJ5cG9pbnRzIG9uIHRoZSBpbnN0YW5jZSBjaGFpbiBuZWVkIHRvIGJlIGxvY2tlZCBleGNlcHQgR1BBCisvLyBhZGRpdGlvbmFsbHkgQ3JlYXRlRGV2aWNlIGFuZCBEZXN0cm95RGV2aWNlIG5lZWRzIHRvIGJlIGxvY2tlZAorbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCBsb2FkZXJfbG9jazsKK2xvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggbG9hZGVyX2pzb25fbG9jazsKKworTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFX0RFQ0xBUkFUSU9OKG9uY2VfaW5pdCk7CisKKy8vIFRoaXMgbG9hZGVyIHN1cHBvcnRzIFZ1bGthbiBBUEkgdmVyc2lvbiAxLjEKK3VpbnQzMl90IGxvYWRlcl9tYWpvcl92ZXJzaW9uID0gMTsKK3VpbnQzMl90IGxvYWRlcl9taW5vcl92ZXJzaW9uID0gMTsKKwordm9pZCAqbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdGFuY2UsIHNpemVfdCBzaXplLCBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBhbGxvY19zY29wZSkgeworICAgIHZvaWQgKnBNZW1vcnkgPSBOVUxMOworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgeworI2Vsc2UKKyAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UtPmFsbG9jX2NhbGxiYWNrcy5wZm5BbGxvY2F0aW9uKSB7CisgICAgICAgIC8vIFRoZXNlIGFyZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBzbyBpdCdzIGJlc3QgdG8gYWxpZ24gZXZlcnl0aGluZyB0bworICAgICAgICAvLyB0aGUgbGFyZ2VzdCB1bml0IHNpemUgd2hpY2ggaXMgdGhlIHNpemUgb2YgYSB1aW50NjRfdC4KKyAgICAgICAgcE1lbW9yeSA9IGluc3RhbmNlLT5hbGxvY19jYWxsYmFja3MucGZuQWxsb2NhdGlvbihpbnN0YW5jZS0+YWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSwgc2l6ZSwgc2l6ZW9mKHVpbnQ2NF90KSwgYWxsb2Nfc2NvcGUpOworICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgcE1lbW9yeSA9IG1hbGxvYyhzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gcE1lbW9yeTsKK30KKwordm9pZCBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3RhbmNlLCB2b2lkICpwTWVtb3J5KSB7CisgICAgaWYgKHBNZW1vcnkgIT0gTlVMTCkgeworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgICAgIHsKKyNlbHNlCisgICAgICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS0+YWxsb2NfY2FsbGJhY2tzLnBmbkZyZWUpIHsKKyAgICAgICAgICAgIGluc3RhbmNlLT5hbGxvY19jYWxsYmFja3MucGZuRnJlZShpbnN0YW5jZS0+YWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSwgcE1lbW9yeSk7CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgIGZyZWUocE1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgKmxvYWRlcl9pbnN0YW5jZV9oZWFwX3JlYWxsb2MoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdGFuY2UsIHZvaWQgKnBNZW1vcnksIHNpemVfdCBvcmlnX3NpemUsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBhbGxvY19zY29wZSkgeworICAgIHZvaWQgKnBOZXdNZW0gPSBOVUxMOworICAgIGlmIChwTWVtb3J5ID09IE5VTEwgfHwgb3JpZ19zaXplID09IDApIHsKKyAgICAgICAgcE5ld01lbSA9IGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3RhbmNlLCBzaXplLCBhbGxvY19zY29wZSk7CisgICAgfSBlbHNlIGlmIChzaXplID09IDApIHsKKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0YW5jZSwgcE1lbW9yeSk7CisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyNlbHNlCisgICAgfSBlbHNlIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS0+YWxsb2NfY2FsbGJhY2tzLnBmblJlYWxsb2NhdGlvbikgeworICAgICAgICAvLyBUaGVzZSBhcmUgaW50ZXJuYWwgc3RydWN0dXJlcywgc28gaXQncyBiZXN0IHRvIGFsaWduIGV2ZXJ5dGhpbmcgdG8KKyAgICAgICAgLy8gdGhlIGxhcmdlc3QgdW5pdCBzaXplIHdoaWNoIGlzIHRoZSBzaXplIG9mIGEgdWludDY0X3QuCisgICAgICAgIHBOZXdNZW0gPSBpbnN0YW5jZS0+YWxsb2NfY2FsbGJhY2tzLnBmblJlYWxsb2NhdGlvbihpbnN0YW5jZS0+YWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSwgcE1lbW9yeSwgc2l6ZSwgc2l6ZW9mKHVpbnQ2NF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3Njb3BlKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHBOZXdNZW0gPSByZWFsbG9jKHBNZW1vcnksIHNpemUpOworICAgIH0KKyAgICByZXR1cm4gcE5ld01lbTsKK30KKwordm9pZCAqbG9hZGVyX2luc3RhbmNlX3Rsc19oZWFwX2FsbG9jKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKHRsc19pbnN0YW5jZSwgc2l6ZSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCk7Cit9CisKK3ZvaWQgbG9hZGVyX2luc3RhbmNlX3Rsc19oZWFwX2ZyZWUodm9pZCAqcE1lbW9yeSkgeyBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKHRsc19pbnN0YW5jZSwgcE1lbW9yeSk7IH0KKwordm9pZCAqbG9hZGVyX2RldmljZV9oZWFwX2FsbG9jKGNvbnN0IHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXZpY2UsIHNpemVfdCBzaXplLCBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBhbGxvY19zY29wZSkgeworICAgIHZvaWQgKnBNZW1vcnkgPSBOVUxMOworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgeworI2Vsc2UKKyAgICBpZiAoZGV2aWNlICYmIGRldmljZS0+YWxsb2NfY2FsbGJhY2tzLnBmbkFsbG9jYXRpb24pIHsKKyAgICAgICAgLy8gVGhlc2UgYXJlIGludGVybmFsIHN0cnVjdHVyZXMsIHNvIGl0J3MgYmVzdCB0byBhbGlnbiBldmVyeXRoaW5nIHRvCisgICAgICAgIC8vIHRoZSBsYXJnZXN0IHVuaXQgc2l6ZSB3aGljaCBpcyB0aGUgc2l6ZSBvZiBhIHVpbnQ2NF90LgorICAgICAgICBwTWVtb3J5ID0gZGV2aWNlLT5hbGxvY19jYWxsYmFja3MucGZuQWxsb2NhdGlvbihkZXZpY2UtPmFsbG9jX2NhbGxiYWNrcy5wVXNlckRhdGEsIHNpemUsIHNpemVvZih1aW50NjRfdCksIGFsbG9jX3Njb3BlKTsKKyAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIHBNZW1vcnkgPSBtYWxsb2Moc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBwTWVtb3J5OworfQorCit2b2lkIGxvYWRlcl9kZXZpY2VfaGVhcF9mcmVlKGNvbnN0IHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXZpY2UsIHZvaWQgKnBNZW1vcnkpIHsKKyAgICBpZiAocE1lbW9yeSAhPSBOVUxMKSB7CisjaWYgKERFQlVHX0RJU0FCTEVfQVBQX0FMTE9DQVRPUlMgPT0gMSkKKyAgICAgICAgeworI2Vsc2UKKyAgICAgICAgaWYgKGRldmljZSAmJiBkZXZpY2UtPmFsbG9jX2NhbGxiYWNrcy5wZm5GcmVlKSB7CisgICAgICAgICAgICBkZXZpY2UtPmFsbG9jX2NhbGxiYWNrcy5wZm5GcmVlKGRldmljZS0+YWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSwgcE1lbW9yeSk7CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgIGZyZWUocE1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgKmxvYWRlcl9kZXZpY2VfaGVhcF9yZWFsbG9jKGNvbnN0IHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXZpY2UsIHZvaWQgKnBNZW1vcnksIHNpemVfdCBvcmlnX3NpemUsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUgYWxsb2Nfc2NvcGUpIHsKKyAgICB2b2lkICpwTmV3TWVtID0gTlVMTDsKKyAgICBpZiAocE1lbW9yeSA9PSBOVUxMIHx8IG9yaWdfc2l6ZSA9PSAwKSB7CisgICAgICAgIHBOZXdNZW0gPSBsb2FkZXJfZGV2aWNlX2hlYXBfYWxsb2MoZGV2aWNlLCBzaXplLCBhbGxvY19zY29wZSk7CisgICAgfSBlbHNlIGlmIChzaXplID09IDApIHsKKyAgICAgICAgbG9hZGVyX2RldmljZV9oZWFwX2ZyZWUoZGV2aWNlLCBwTWVtb3J5KTsKKyNpZiAoREVCVUdfRElTQUJMRV9BUFBfQUxMT0NBVE9SUyA9PSAxKQorI2Vsc2UKKyAgICB9IGVsc2UgaWYgKGRldmljZSAmJiBkZXZpY2UtPmFsbG9jX2NhbGxiYWNrcy5wZm5SZWFsbG9jYXRpb24pIHsKKyAgICAgICAgLy8gVGhlc2UgYXJlIGludGVybmFsIHN0cnVjdHVyZXMsIHNvIGl0J3MgYmVzdCB0byBhbGlnbiBldmVyeXRoaW5nIHRvCisgICAgICAgIC8vIHRoZSBsYXJnZXN0IHVuaXQgc2l6ZSB3aGljaCBpcyB0aGUgc2l6ZSBvZiBhIHVpbnQ2NF90LgorICAgICAgICBwTmV3TWVtID0gZGV2aWNlLT5hbGxvY19jYWxsYmFja3MucGZuUmVhbGxvY2F0aW9uKGRldmljZS0+YWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSwgcE1lbW9yeSwgc2l6ZSwgc2l6ZW9mKHVpbnQ2NF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zY29wZSk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBwTmV3TWVtID0gcmVhbGxvYyhwTWVtb3J5LCBzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHBOZXdNZW07Cit9CisKKy8vIEVudmlyb25tZW50IHZhcmlhYmxlcworI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKworc3RhdGljIGlubGluZSBib29sIElzSGlnaEludGVncml0eSgpIHsKKyAgICByZXR1cm4gZ2V0ZXVpZCgpICE9IGdldHVpZCgpIHx8IGdldGVnaWQoKSAhPSBnZXRnaWQoKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpsb2FkZXJfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QpIHsKKyAgICAvLyBObyBhbGxvY2F0aW9uIG9mIG1lbW9yeSBuZWNlc3NhcnkgZm9yIExpbnV4LCBidXQgd2Ugc2hvdWxkIGF0IGxlYXN0IHRvdWNoCisgICAgLy8gdGhlIGluc3QgcG9pbnRlciB0byBnZXQgcmlkIG9mIGNvbXBpbGVyIHdhcm5pbmdzLgorICAgICh2b2lkKWluc3Q7CisgICAgcmV0dXJuIGdldGVudihuYW1lKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpsb2FkZXJfc2VjdXJlX2dldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0KSB7CisjaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgLy8gQXBwbGUgZG9lcyBub3QgYXBwZWFyIHRvIGhhdmUgYSBzZWN1cmUgZ2V0ZW52IGltcGxlbWVudGF0aW9uLgorICAgIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBzZWN1cmUgZ2V0ZW52IGFuZCBnZXRlbnYgaXMgdGhhdCBzZWN1cmUgZ2V0ZW52CisgICAgLy8gcmV0dXJucyBOVUxMIGlmIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHJ1biB3aXRoIGVsZXZhdGVkIHByaXZpbGVnZXMgYnkgYSBub3JtYWwgdXNlci4KKyAgICAvLyBUaGUgaWRlYSBpcyB0byBwcmV2ZW50IHRoZSByZWFkaW5nIG9mIG1hbGljaW91cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYnkgYSBwcm9jZXNzCisgICAgLy8gdGhhdCBjYW4gZG8gZGFtYWdlLgorICAgIC8vIFRoaXMgYWxnb3JpdGhtIGlzIGRlcml2ZWQgZnJvbSBnbGliYyBjb2RlIHRoYXQgc2V0cyBhbiBpbnRlcm5hbAorICAgIC8vIHZhcmlhYmxlIChfX2xpYmNfZW5hYmxlX3NlY3VyZSkgaWYgdGhlIHByb2Nlc3MgaXMgcnVubmluZyB1bmRlciBzZXR1aWQgb3Igc2V0Z2lkLgorICAgIHJldHVybiBJc0hpZ2hJbnRlZ3JpdHkoKSA/IE5VTEwgOiBsb2FkZXJfZ2V0ZW52KG5hbWUsIGluc3QpOworI2Vsc2UKKy8vIExpbnV4CisjaWYgZGVmaW5lZChIQVZFX1NFQ1VSRV9HRVRFTlYpICYmICFkZWZpbmVkKFVTRV9VTlNBRkVfRklMRV9TRUFSQ0gpCisgICAgKHZvaWQpaW5zdDsKKyAgICByZXR1cm4gc2VjdXJlX2dldGVudihuYW1lKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9fX1NFQ1VSRV9HRVRFTlYpICYmICFkZWZpbmVkKFVTRV9VTlNBRkVfRklMRV9TRUFSQ0gpCisgICAgKHZvaWQpaW5zdDsKKyAgICByZXR1cm4gX19zZWN1cmVfZ2V0ZW52KG5hbWUpOworI2Vsc2UKKyAgICByZXR1cm4gbG9hZGVyX2dldGVudihuYW1lLCBpbnN0KTsKKyNlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkZXJfZnJlZV9nZXRlbnYoY2hhciAqdmFsLCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0KSB7CisgICAgLy8gTm8gZnJlZWluZyBvZiBtZW1vcnkgbmVjZXNzYXJ5IGZvciBMaW51eCwgYnV0IHdlIHNob3VsZCBhdCBsZWFzdCB0b3VjaAorICAgIC8vIHRoZSB2YWwgYW5kIGluc3QgcG9pbnRlcnMgdG8gZ2V0IHJpZCBvZiBjb21waWxlciB3YXJuaW5ncy4KKyAgICAodm9pZCl2YWw7CisgICAgKHZvaWQpaW5zdDsKK30KKworI2VsaWYgZGVmaW5lZChXSU4zMikKKworc3RhdGljIGlubGluZSBib29sIElzSGlnaEludGVncml0eSgpIHsKKyAgICBIQU5ETEUgcHJvY2Vzc190b2tlbjsKKyAgICBpZiAoT3BlblByb2Nlc3NUb2tlbihHZXRDdXJyZW50UHJvY2VzcygpLCBUT0tFTl9RVUVSWSB8IFRPS0VOX1FVRVJZX1NPVVJDRSwgJnByb2Nlc3NfdG9rZW4pKSB7CisgICAgICAgIC8vIE1heGltdW0gcG9zc2libGUgc2l6ZSBvZiBTSURfQU5EX0FUVFJJQlVURVMgaXMgbWF4aW11bSBzaXplIG9mIGEgU0lEICsgc2l6ZSBvZiBhdHRyaWJ1dGVzIERXT1JELgorICAgICAgICB1aW50OF90IG1hbmRhdG9yeV9sYWJlbF9idWZmZXJbU0VDVVJJVFlfTUFYX1NJRF9TSVpFICsgc2l6ZW9mKERXT1JEKV07CisgICAgICAgIERXT1JEIGJ1ZmZlcl9zaXplOworICAgICAgICBpZiAoR2V0VG9rZW5JbmZvcm1hdGlvbihwcm9jZXNzX3Rva2VuLCBUb2tlbkludGVncml0eUxldmVsLCBtYW5kYXRvcnlfbGFiZWxfYnVmZmVyLCBzaXplb2YobWFuZGF0b3J5X2xhYmVsX2J1ZmZlciksCisgICAgICAgICAgICAmYnVmZmVyX3NpemUpICE9IDApIHsKKyAgICAgICAgICAgIGNvbnN0IFRPS0VOX01BTkRBVE9SWV9MQUJFTCAqbWFuZGF0b3J5X2xhYmVsID0gKGNvbnN0IFRPS0VOX01BTkRBVE9SWV9MQUJFTCAqKW1hbmRhdG9yeV9sYWJlbF9idWZmZXI7CisgICAgICAgICAgICBjb25zdCBEV09SRCBzdWJfYXV0aG9yaXR5X2NvdW50ID0gKkdldFNpZFN1YkF1dGhvcml0eUNvdW50KG1hbmRhdG9yeV9sYWJlbC0+TGFiZWwuU2lkKTsKKyAgICAgICAgICAgIGNvbnN0IERXT1JEIGludGVncml0eV9sZXZlbCA9ICpHZXRTaWRTdWJBdXRob3JpdHkobWFuZGF0b3J5X2xhYmVsLT5MYWJlbC5TaWQsIHN1Yl9hdXRob3JpdHlfY291bnQgLSAxKTsKKworICAgICAgICAgICAgQ2xvc2VIYW5kbGUocHJvY2Vzc190b2tlbik7CisgICAgICAgICAgICByZXR1cm4gaW50ZWdyaXR5X2xldmVsID4gU0VDVVJJVFlfTUFOREFUT1JZX01FRElVTV9SSUQ7CisgICAgICAgIH0KKworICAgICAgICBDbG9zZUhhbmRsZShwcm9jZXNzX3Rva2VuKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqbG9hZGVyX2dldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0KSB7CisgICAgY2hhciAqcmV0VmFsOworICAgIERXT1JEIHZhbFNpemU7CisKKyAgICB2YWxTaXplID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEobmFtZSwgTlVMTCwgMCk7CisKKyAgICAvLyB2YWxTaXplIERPRVMgaW5jbHVkZSB0aGUgbnVsbCB0ZXJtaW5hdG9yLCBzbyBmb3IgYW55IHNldCB2YXJpYWJsZQorICAgIC8vIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IDEuIElmIGl0J3MgMCwgdGhlIHZhcmlhYmxlIHdhc24ndCBzZXQuCisgICAgaWYgKHZhbFNpemUgPT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBBbGxvY2F0ZSB0aGUgc3BhY2UgbmVjZXNzYXJ5IGZvciB0aGUgcmVnaXN0cnkgZW50cnkKKyAgICBpZiAoTlVMTCAhPSBpbnN0ICYmIE5VTEwgIT0gaW5zdC0+YWxsb2NfY2FsbGJhY2tzLnBmbkFsbG9jYXRpb24pIHsKKyAgICAgICAgcmV0VmFsID0gKGNoYXIgKilpbnN0LT5hbGxvY19jYWxsYmFja3MucGZuQWxsb2NhdGlvbihpbnN0LT5hbGxvY19jYWxsYmFja3MucFVzZXJEYXRhLCB2YWxTaXplLCBzaXplb2YoY2hhciAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DT01NQU5EKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXRWYWwgPSAoY2hhciAqKW1hbGxvYyh2YWxTaXplKTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCAhPSByZXRWYWwpIHsKKyAgICAgICAgR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEobmFtZSwgcmV0VmFsLCB2YWxTaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmxvYWRlcl9zZWN1cmVfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QpIHsKKyNpZiAhZGVmaW5lZChVU0VfVU5TQUZFX0ZJTEVfU0VBUkNIKQorICAgIGlmIChJc0hpZ2hJbnRlZ3JpdHkoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBsb2FkZXJfZ2V0ZW52KG5hbWUsIGluc3QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZGVyX2ZyZWVfZ2V0ZW52KGNoYXIgKnZhbCwgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCkgeworICAgIGlmIChOVUxMICE9IGluc3QgJiYgTlVMTCAhPSBpbnN0LT5hbGxvY19jYWxsYmFja3MucGZuRnJlZSkgeworICAgICAgICBpbnN0LT5hbGxvY19jYWxsYmFja3MucGZuRnJlZShpbnN0LT5hbGxvY19jYWxsYmFja3MucFVzZXJEYXRhLCB2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZyZWUoKHZvaWQgKil2YWwpOworICAgIH0KK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBjaGFyICpsb2FkZXJfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QpIHsKKyAgICAvLyBzdHViIGZ1bmMKKyAgICAodm9pZClpbnN0OworICAgICh2b2lkKW5hbWU7CisgICAgcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZGVyX2ZyZWVfZ2V0ZW52KGNoYXIgKnZhbCwgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCkgeworICAgIC8vIHN0dWIgZnVuYworICAgICh2b2lkKXZhbDsKKyAgICAodm9pZClpbnN0OworfQorCisjZW5kaWYKKwordm9pZCBsb2FkZXJfbG9nKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIFZrRmxhZ3MgbXNnX3R5cGUsIGludDMyX3QgbXNnX2NvZGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgICAgY2hhciBtc2dbNTEyXTsKKyAgICBjaGFyIGNtZF9saW5lX21zZ1s1MTJdOworICAgIHNpemVfdCBjbWRfbGluZV9zaXplID0gc2l6ZW9mKGNtZF9saW5lX21zZyk7CisgICAgdmFfbGlzdCBhcDsKKyAgICBpbnQgcmV0OworCisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgcmV0ID0gdnNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksIGZvcm1hdCwgYXApOworICAgIGlmICgocmV0ID49IChpbnQpc2l6ZW9mKG1zZykpIHx8IHJldCA8IDApIHsKKyAgICAgICAgbXNnW3NpemVvZihtc2cpIC0gMV0gPSAnXDAnOworICAgIH0KKyAgICB2YV9lbmQoYXApOworCisgICAgaWYgKGluc3QpIHsKKyAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgc2V2ZXJpdHkgPSAwOworICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIHR5cGU7CisgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCBjYWxsYmFja19kYXRhOworICAgICAgICBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBvYmplY3RfbmFtZTsKKworICAgICAgICBpZiAoKG1zZ190eXBlICYgTE9BREVSX0lORk9fQklUKSAhPSAwKSB7CisgICAgICAgICAgICBzZXZlcml0eSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUOworICAgICAgICB9IGVsc2UgaWYgKChtc2dfdHlwZSAmIExPQURFUl9XQVJOX0JJVCkgIT0gMCkgeworICAgICAgICAgICAgc2V2ZXJpdHkgPSBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1dBUk5JTkdfQklUX0VYVDsKKyAgICAgICAgfSBlbHNlIGlmICgobXNnX3R5cGUgJiBMT0FERVJfRVJST1JfQklUKSAhPSAwKSB7CisgICAgICAgICAgICBzZXZlcml0eSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVDsKKyAgICAgICAgfSBlbHNlIGlmICgobXNnX3R5cGUgJiBMT0FERVJfREVCVUdfQklUKSAhPSAwKSB7CisgICAgICAgICAgICBzZXZlcml0eSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtc2dfdHlwZSAmIExPQURFUl9QRVJGX0JJVCkgIT0gMCkgeworICAgICAgICAgICAgdHlwZSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9QRVJGT1JNQU5DRV9CSVRfRVhUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHlwZSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9HRU5FUkFMX0JJVF9FWFQ7CisgICAgICAgIH0KKworICAgICAgICBjYWxsYmFja19kYXRhLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NBTExCQUNLX0RBVEFfRVhUOworICAgICAgICBjYWxsYmFja19kYXRhLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgY2FsbGJhY2tfZGF0YS5mbGFncyA9IDA7CisgICAgICAgIGNhbGxiYWNrX2RhdGEucE1lc3NhZ2VJZE5hbWUgPSAiTG9hZGVyIE1lc3NhZ2UiOworICAgICAgICBjYWxsYmFja19kYXRhLm1lc3NhZ2VJZE51bWJlciA9IDA7CisgICAgICAgIGNhbGxiYWNrX2RhdGEucE1lc3NhZ2UgPSBtc2c7CisgICAgICAgIGNhbGxiYWNrX2RhdGEucXVldWVMYWJlbENvdW50ID0gMDsKKyAgICAgICAgY2FsbGJhY2tfZGF0YS5wUXVldWVMYWJlbHMgPSBOVUxMOworICAgICAgICBjYWxsYmFja19kYXRhLmNtZEJ1ZkxhYmVsQ291bnQgPSAwOworICAgICAgICBjYWxsYmFja19kYXRhLnBDbWRCdWZMYWJlbHMgPSBOVUxMOworICAgICAgICBjYWxsYmFja19kYXRhLm9iamVjdENvdW50ID0gMTsKKyAgICAgICAgY2FsbGJhY2tfZGF0YS5wT2JqZWN0cyA9ICZvYmplY3RfbmFtZTsKKyAgICAgICAgb2JqZWN0X25hbWUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVDsKKyAgICAgICAgb2JqZWN0X25hbWUucE5leHQgPSBOVUxMOworICAgICAgICBvYmplY3RfbmFtZS5vYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfSU5TVEFOQ0U7CisgICAgICAgIG9iamVjdF9uYW1lLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdCkodWludHB0cl90KWluc3Q7CisgICAgICAgIG9iamVjdF9uYW1lLnBPYmplY3ROYW1lID0gTlVMTDsKKworICAgICAgICB1dGlsX1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKGluc3QsIHNldmVyaXR5LCB0eXBlLCAmY2FsbGJhY2tfZGF0YSk7CisgICAgfQorCisgICAgaWYgKCEobXNnX3R5cGUgJiBnX2xvYWRlcl9sb2dfbXNncykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNtZF9saW5lX21zZ1swXSA9ICdcMCc7CisgICAgY21kX2xpbmVfc2l6ZSAtPSAxOworICAgIHNpemVfdCBvcmlnaW5hbF9zaXplID0gY21kX2xpbmVfc2l6ZTsKKworICAgIGlmICgobXNnX3R5cGUgJiBMT0FERVJfSU5GT19CSVQpICE9IDApIHsKKyAgICAgICAgc3RybmNhdChjbWRfbGluZV9tc2csICJJTkZPIiwgY21kX2xpbmVfc2l6ZSk7CisgICAgICAgIGNtZF9saW5lX3NpemUgLT0gNDsKKyAgICB9CisgICAgaWYgKChtc2dfdHlwZSAmIExPQURFUl9XQVJOX0JJVCkgIT0gMCkgeworICAgICAgICBpZiAoY21kX2xpbmVfc2l6ZSAhPSBvcmlnaW5hbF9zaXplKSB7CisgICAgICAgICAgICBzdHJuY2F0KGNtZF9saW5lX21zZywgIiB8ICIsIGNtZF9saW5lX3NpemUpOworICAgICAgICAgICAgY21kX2xpbmVfc2l6ZSAtPSAzOworICAgICAgICB9CisgICAgICAgIHN0cm5jYXQoY21kX2xpbmVfbXNnLCAiV0FSTklORyIsIGNtZF9saW5lX3NpemUpOworICAgICAgICBjbWRfbGluZV9zaXplIC09IDc7CisgICAgfQorICAgIGlmICgobXNnX3R5cGUgJiBMT0FERVJfUEVSRl9CSVQpICE9IDApIHsKKyAgICAgICAgaWYgKGNtZF9saW5lX3NpemUgIT0gb3JpZ2luYWxfc2l6ZSkgeworICAgICAgICAgICAgc3RybmNhdChjbWRfbGluZV9tc2csICIgfCAiLCBjbWRfbGluZV9zaXplKTsKKyAgICAgICAgICAgIGNtZF9saW5lX3NpemUgLT0gMzsKKyAgICAgICAgfQorICAgICAgICBzdHJuY2F0KGNtZF9saW5lX21zZywgIlBFUkYiLCBjbWRfbGluZV9zaXplKTsKKyAgICAgICAgY21kX2xpbmVfc2l6ZSAtPSA0OworICAgIH0KKyAgICBpZiAoKG1zZ190eXBlICYgTE9BREVSX0VSUk9SX0JJVCkgIT0gMCkgeworICAgICAgICBpZiAoY21kX2xpbmVfc2l6ZSAhPSBvcmlnaW5hbF9zaXplKSB7CisgICAgICAgICAgICBzdHJuY2F0KGNtZF9saW5lX21zZywgIiB8ICIsIGNtZF9saW5lX3NpemUpOworICAgICAgICAgICAgY21kX2xpbmVfc2l6ZSAtPSAzOworICAgICAgICB9CisgICAgICAgIHN0cm5jYXQoY21kX2xpbmVfbXNnLCAiRVJST1IiLCBjbWRfbGluZV9zaXplKTsKKyAgICAgICAgY21kX2xpbmVfc2l6ZSAtPSA1OworICAgIH0KKyAgICBpZiAoKG1zZ190eXBlICYgTE9BREVSX0RFQlVHX0JJVCkgIT0gMCkgeworICAgICAgICBpZiAoY21kX2xpbmVfc2l6ZSAhPSBvcmlnaW5hbF9zaXplKSB7CisgICAgICAgICAgICBzdHJuY2F0KGNtZF9saW5lX21zZywgIiB8ICIsIGNtZF9saW5lX3NpemUpOworICAgICAgICAgICAgY21kX2xpbmVfc2l6ZSAtPSAzOworICAgICAgICB9CisgICAgICAgIHN0cm5jYXQoY21kX2xpbmVfbXNnLCAiREVCVUciLCBjbWRfbGluZV9zaXplKTsKKyAgICAgICAgY21kX2xpbmVfc2l6ZSAtPSA1OworICAgIH0KKyAgICBpZiAoY21kX2xpbmVfc2l6ZSAhPSBvcmlnaW5hbF9zaXplKSB7CisgICAgICAgIHN0cm5jYXQoY21kX2xpbmVfbXNnLCAiOiAiLCBjbWRfbGluZV9zaXplKTsKKyAgICAgICAgY21kX2xpbmVfc2l6ZSAtPSAyOworICAgIH0KKworICAgIGlmICgwIDwgY21kX2xpbmVfc2l6ZSkgeworICAgICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyB0b28gbG9uZywgdHJpbSBpdCBkb3duCisgICAgICAgIGlmIChzdHJsZW4obXNnKSA+IGNtZF9saW5lX3NpemUpIHsKKyAgICAgICAgICAgIG1zZ1tjbWRfbGluZV9zaXplIC0gMV0gPSAnXDAnOworICAgICAgICB9CisgICAgICAgIHN0cm5jYXQoY21kX2xpbmVfbXNnLCBtc2csIGNtZF9saW5lX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNob3VsZG4ndCBnZXQgaGVyZSwgYnV0IGNoZWNrIHRvIG1ha2Ugc3VyZSBpZiB3ZSd2ZSBhbHJlYWR5IG92ZXJydW4KKyAgICAgICAgLy8gdGhlIHN0cmluZyBib3VuZGFyeQorICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgIH0KKworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgT3V0cHV0RGVidWdTdHJpbmcoY21kX2xpbmVfbXNnKTsKKyAgICBPdXRwdXREZWJ1Z1N0cmluZygiXG4iKTsKKyNlbmRpZgorCisgICAgZnB1dHMoY21kX2xpbmVfbXNnLCBzdGRlcnIpOworICAgIGZwdXRjKCdcbicsIHN0ZGVycik7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1NldEluc3RhbmNlRGlzcGF0Y2goVmtJbnN0YW5jZSBpbnN0YW5jZSwgdm9pZCAqb2JqZWN0KSB7CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmICghaW5zdCkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJ2a1NldEluc3RhbmNlRGlzcGF0Y2g6IENhbiBub3QgcmV0cmlldmUgSW5zdGFuY2UgIgorICAgICAgICAgICAgICAgICAgICJkaXNwYXRjaCB0YWJsZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgbG9hZGVyX3NldF9kaXNwYXRjaChvYmplY3QsIGluc3QtPmRpc3ApOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtTZXREZXZpY2VEaXNwYXRjaChWa0RldmljZSBkZXZpY2UsIHZvaWQgKm9iamVjdCkgeworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXY7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBsb2FkZXJfZ2V0X2ljZF9hbmRfZGV2aWNlKGRldmljZSwgJmRldiwgTlVMTCk7CisKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybSkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKyAgICBsb2FkZXJfc2V0X2Rpc3BhdGNoKG9iamVjdCwgJmRldi0+bG9hZGVyX2Rpc3BhdGNoKTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworI2lmIGRlZmluZWQoX1dJTjMyKQorCisvLyBBcHBlbmQgdGhlIEpTT04gcGF0aCBkYXRhIHRvIHRoZSBsaXN0IGFuZCBhbGxvY2F0ZS9ncm93IHRoZSBsaXN0IGlmIGl0J3Mgbm90IGxhcmdlIGVub3VnaC4KKy8vIEZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBmaWxlbmFtZSB3YXMgYXBwZW5kZWQgdG8gcmVnX2RhdGEgbGlzdC4KKy8vIENhbGxlciBzaG91bGQgZnJlZSByZWdfZGF0YS4KK3N0YXRpYyBib29sIGxvYWRlckFkZEpzb25FbnRyeShjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipyZWdfZGF0YSwgICAgLy8gbGlzdCBvZiBKU09OIGZpbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERXT1JEIHRvdGFsX3NpemUsICAvLyBzaXplIG9mIHJlZ19kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGtleV9uYW1lLCAgICAvLyBrZXkgbmFtZSAtIHVzZWQgZm9yIGRlYnVnIHByaW50cyAtIGkuZS4gVnVsa2FuRHJpdmVyTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGtleV90eXBlLCAgICAgLy8ga2V5IGRhdGEgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGpzb25fcGF0aCwgICAgLy8gSlNPTiBzdHJpbmcgdG8gYWRkIHRvIHRoZSBsaXN0IHJlZ19kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQganNvbl9zaXplLCAgICAvLyBzaXplIGluIGJ5dGVzIG9mIGpzb25fcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0ICpyZXN1bHQpIHsKKyAgICAvLyBDaGVjayBmb3IgYW5kIGlnbm9yZSBkdXBsaWNhdGVzLgorICAgIGlmICgqcmVnX2RhdGEgJiYgc3Ryc3RyKCpyZWdfZGF0YSwganNvbl9wYXRoKSkgeworICAgICAgICAvLyBTdWNjZXNzLiBUaGUganNvbl9wYXRoIGlzIGFscmVhZHkgaW4gdGhlIGxpc3QuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChOVUxMID09ICpyZWdfZGF0YSkgeworICAgICAgICAqcmVnX2RhdGEgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCAqdG90YWxfc2l6ZSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICBpZiAoTlVMTCA9PSAqcmVnX2RhdGEpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJBZGRKc29uRW50cnk6IEZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgcmVnaXN0cnkgZGF0YSBmb3Iga2V5ICVzIiwganNvbl9wYXRoKTsKKyAgICAgICAgICAgICpyZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKnJlZ19kYXRhWzBdID0gJ1wwJzsKKyAgICB9IGVsc2UgaWYgKHN0cmxlbigqcmVnX2RhdGEpICsganNvbl9zaXplICsgMSA+ICp0b3RhbF9zaXplKSB7CisgICAgICAgIHZvaWQgKm5ld19wdHIgPQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfcmVhbGxvYyhpbnN0LCAqcmVnX2RhdGEsICp0b3RhbF9zaXplLCAqdG90YWxfc2l6ZSAqIDIsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gbmV3X3B0cikgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlckFkZEpzb25FbnRyeTogRmFpbGVkIHRvIHJlYWxsb2NhdGUgc3BhY2UgZm9yIHJlZ2lzdHJ5IHZhbHVlIG9mIHNpemUgJWQgZm9yIGtleSAlcyIsICp0b3RhbF9zaXplICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAganNvbl9wYXRoKTsKKyAgICAgICAgICAgICpyZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKnJlZ19kYXRhID0gbmV3X3B0cjsKKyAgICAgICAgKnRvdGFsX3NpemUgKj0gMjsKKyAgICB9CisKKyAgICBmb3IgKGNoYXIgKmN1cnJfZmlsZW5hbWUgPSBqc29uX3BhdGg7IGN1cnJfZmlsZW5hbWVbMF0gIT0gJ1wwJzsgY3Vycl9maWxlbmFtZSArPSBzdHJsZW4oY3Vycl9maWxlbmFtZSkgKyAxKSB7CisgICAgICAgIGlmIChzdHJsZW4oKnJlZ19kYXRhKSA9PSAwKSB7CisgICAgICAgICAgICAodm9pZClzbnByaW50ZigqcmVnX2RhdGEsIGpzb25fc2l6ZSArIDEsICIlcyIsIGN1cnJfZmlsZW5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKHZvaWQpc25wcmludGYoKnJlZ19kYXRhICsgc3RybGVuKCpyZWdfZGF0YSksIGpzb25fc2l6ZSArIDIsICIlYyVzIiwgUEFUSF9TRVBBUkFUT1IsIGN1cnJfZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsICIlczogTG9jYXRlZCBqc29uIGZpbGUgXCIlc1wiIGZyb20gUG5QIHJlZ2lzdHJ5OiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICBjdXJyX2ZpbGVuYW1lLCBrZXlfbmFtZSk7CisKKyAgICAgICAgaWYgKGtleV90eXBlID09IFJFR19TWikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZpbmQgdGhlIGxpc3Qgb2YgcmVnaXN0cnkgZmlsZXMgKG5hbWVzIFZ1bGthbkRyaXZlck5hbWUvVnVsa2FuRHJpdmVyTmFtZVdvdykgaW4gaGtyLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIGZpbGVuYW1lIGluIGdpdmVuIGRldmljZSBoYW5kbGUsIGZpbGVuYW1lIGlzIHRoZW4gYWRkZWQgdG8gcmV0dXJuIGxpc3QKKy8vIGZ1bmN0aW9uIHJldHVybiB0cnVlIGlmIGZpbGVuYW1lIHdhcyBhcHBlbmRlZCB0byByZWdfZGF0YSBsaXN0CisvLyBJZiBlcnJvciBvY2N1cmVzIHJlc3VsdCBpcyB1cGRhdGVkIHdpdGggZmFpbHVyZSByZWFzb24KK2Jvb2wgbG9hZGVyR2V0RGV2aWNlUmVnaXN0cnlFbnRyeShjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjaGFyICoqcmVnX2RhdGEsIFBEV09SRCB0b3RhbF9zaXplLCBERVZJTlNUIGRldl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgdmFsdWVfbmFtZSwgVmtSZXN1bHQgKnJlc3VsdCkgeworICAgIEhLRVkgaGtyS2V5ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgRFdPUkQgcmVxdWlyZWRTaXplLCBkYXRhX3R5cGU7CisgICAgY2hhciAqbWFuaWZlc3RfcGF0aCA9IE5VTEw7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisgICAgaWYgKE5VTEwgPT0gdG90YWxfc2l6ZSB8fCBOVUxMID09IHJlZ19kYXRhKSB7CisgICAgICAgICpyZXN1bHQgPSBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDT05GSUdSRVQgc3RhdHVzID0gQ01fT3Blbl9EZXZOb2RlX0tleShkZXZfaWQsIEtFWV9RVUVSWV9WQUxVRSwgMCwgUmVnRGlzcG9zaXRpb25fT3BlbkV4aXN0aW5nLCAmaGtyS2V5LCBDTV9SRUdJU1RSWV9TT0ZUV0FSRSk7CisgICAgaWYgKHN0YXR1cyAhPSBDUl9TVUNDRVNTKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJsb2FkZXJHZXREZXZpY2VSZWdpc3RyeUVudHJ5OiBGYWlsZWQgdG8gb3BlbiByZWdpc3RyeSBrZXkgZm9yIERldmljZUlEKCVkKSIsIGRldl9pZCk7CisgICAgICAgICpyZXN1bHQgPSBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBxdWVyeSB2YWx1ZQorICAgIExTVEFUVVMgcmV0ID0gUmVnUXVlcnlWYWx1ZUV4KAorICAgICAgICBoa3JLZXksCisgICAgICAgIHZhbHVlX25hbWUsCisgICAgICAgIE5VTEwsCisgICAgICAgIE5VTEwsCisgICAgICAgIE5VTEwsCisgICAgICAgICZyZXF1aXJlZFNpemUpOworCisgICAgaWYgKHJldCAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIGlmIChyZXQgPT0gRVJST1JfRklMRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgImxvYWRlckdldERldmljZVJlZ2lzdHJ5RW50cnk6IERldmljZSBJRCglZCkgRG9lcyBub3QgY29udGFpbiBhIHZhbHVlIGZvciBcIiVzXCIiLCBkZXZfaWQsIHZhbHVlX25hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAibG9hZGVyR2V0RGV2aWNlUmVnaXN0cnlFbnRyeTogRGV2aWNlSUQoJWQpIEZhaWxlZCB0byBvYnRhaW4gJXMgc2l6ZSIsIGRldl9pZCwgdmFsdWVfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgbWFuaWZlc3RfcGF0aCA9IGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIHJlcXVpcmVkU2l6ZSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgIGlmIChtYW5pZmVzdF9wYXRoID09IE5VTEwpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAibG9hZGVyR2V0RGV2aWNlUmVnaXN0cnlFbnRyeTogRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBEcml2ZXJOYW1lLiIpOworICAgICAgICAqcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICByZXQgPSBSZWdRdWVyeVZhbHVlRXgoCisgICAgICAgIGhrcktleSwKKyAgICAgICAgdmFsdWVfbmFtZSwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgJmRhdGFfdHlwZSwKKyAgICAgICAgKEJZVEUgKiltYW5pZmVzdF9wYXRoLAorICAgICAgICAmcmVxdWlyZWRTaXplCisgICAgKTsKKworICAgIGlmIChyZXQgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgImxvYWRlckdldERldmljZVJlZ2lzdHJ5RW50cnk6IERldmljZUlEKCVkKSBGYWlsZWQgdG8gb2J0YWluICVzIiwgdmFsdWVfbmFtZSk7CisKKyAgICAgICAgKnJlc3VsdCA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKGRhdGFfdHlwZSAhPSBSRUdfU1ogJiYgZGF0YV90eXBlICE9IFJFR19NVUxUSV9TWikgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgImxvYWRlckdldERldmljZVJlZ2lzdHJ5RW50cnk6IEludmFsaWQgJXMgZGF0YSB0eXBlLiBFeHBlY3RlZCBSRUdfU1ogb3IgUkVHX01VTFRJX1NaLiIsIHZhbHVlX25hbWUpOworICAgICAgICAqcmVzdWx0ID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBmb3VuZCA9IGxvYWRlckFkZEpzb25FbnRyeShpbnN0LCByZWdfZGF0YSwgdG90YWxfc2l6ZSwgdmFsdWVfbmFtZSwgZGF0YV90eXBlLCBtYW5pZmVzdF9wYXRoLCByZXF1aXJlZFNpemUsIHJlc3VsdCk7CisKK291dDoKKyAgICBpZiAobWFuaWZlc3RfcGF0aCAhPSBOVUxMKSB7CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgbWFuaWZlc3RfcGF0aCk7CisgICAgfQorICAgIFJlZ0Nsb3NlS2V5KGhrcktleSk7CisgICAgcmV0dXJuIGZvdW5kOworfQorCisvLyBGaW5kIHRoZSBsaXN0IG9mIHJlZ2lzdHJ5IGZpbGVzIChuYW1lcyBWdWxrYW5Ecml2ZXJOYW1lL1Z1bGthbkRyaXZlck5hbWVXb3cpIGluIGhrciAuCisvLworLy8gVGhpcyBmdW5jdGlvbiBsb29rcyBmb3IgZGlzcGxheSBkZXZpY2VzIGFuZCBjaGlsZGlzaCBzb2Z0d2FyZSBjb21wb25lbnRzCisvLyBmb3IgYSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFyZSBhZGRlZCB0byBhIHJldHVybmVkIGxpc3QgKGZ1bmN0aW9uIHJldHVybgorLy8gdmFsdWUpLgorLy8gRnVuY3Rpb24gcmV0dXJuIGlzIGEgc3RyaW5nIHdpdGggYSAnOycgIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGVuYW1lcy4KKy8vIEZ1bmN0aW9uIHJldHVybiBpcyBOVUxMIGlmIG5vIHZhbGlkIG5hbWUvdmFsdWUgcGFpcnMgIGFyZSBmb3VuZCBpbiB0aGUga2V5LAorLy8gb3IgdGhlIGtleSBpcyBub3QgZm91bmQuCisvLworLy8gKnJlZ19kYXRhIGNvbnRhaW5zIGEgc3RyaW5nIGxpc3Qgb2YgZmlsZW5hbWVzIGFzIHBvaW50ZXIuCisvLyBXaGVuIGRvbmUgdXNpbmcgdGhlIHJldHVybmVkIHN0cmluZyBsaXN0LCB0aGUgY2FsbGVyIHNob3VsZCBmcmVlIHRoZSBwb2ludGVyLgorVmtSZXN1bHQgbG9hZGVyR2V0RGV2aWNlUmVnaXN0cnlGaWxlcyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjaGFyICoqcmVnX2RhdGEsIFBEV09SRCByZWdfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgdmFsdWVfbmFtZSkgeworICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90ICpzb2Z0d2FyZUNvbXBvbmVudEdVSUQgPSBMIns1YzRjMzMzMi0zNDRkLTQ4M2MtODczOS0yNTllOTM0YzljYzh9IjsKKyAgICBzdGF0aWMgY29uc3Qgd2NoYXJfdCAqZGlzcGxheUdVSUQgPSBMIns0ZDM2ZTk2OC1lMzI1LTExY2UtYmZjMS0wODAwMmJlMTAzMTh9IjsKKyAgICBjb25zdCBVTE9ORyBmbGFncyA9IENNX0dFVElETElTVF9GSUxURVJfQ0xBU1MgfCBDTV9HRVRJRExJU1RfRklMVEVSX1BSRVNFTlQ7CisKKyAgICB3Y2hhcl90IGNoaWxkR3VpZFtNQVhfR1VJRF9TVFJJTkdfTEVOICsgMl07ICAvLyArMiBmb3IgYnJhY2tldHMge30KKyAgICBVTE9ORyBjaGlsZEd1aWRTaXplID0gc2l6ZW9mKGNoaWxkR3VpZCk7CisKKyAgICBERVZJTlNUIGRldklEID0gMCwgY2hpbGRJRCA9IDA7CisgICAgd2NoYXJfdCAqcERldmljZU5hbWVzID0gTlVMTDsKKyAgICBVTE9ORyBkZXZpY2VOYW1lc1NpemUgPSAwOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisgICAgaWYgKE5VTEwgPT0gcmVnX2RhdGEpIHsKKyAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIGlmIGFmdGVyIG9idGFpbmluZyB0aGUgRGV2aWNlTmFtZVNpemUsIG5ldyBkZXZpY2UgaXMgYWRkZWQgc3RhcnQgb3ZlcgorICAgIGRvIHsKKyAgICAgICAgQ01fR2V0X0RldmljZV9JRF9MaXN0X1NpemVXKCZkZXZpY2VOYW1lc1NpemUsIGRpc3BsYXlHVUlELCBmbGFncyk7CisKKyAgICAgICAgaWYgKHBEZXZpY2VOYW1lcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIHBEZXZpY2VOYW1lcyk7CisgICAgICAgIH0KKworICAgICAgICBwRGV2aWNlTmFtZXMgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBkZXZpY2VOYW1lc1NpemUgKiBzaXplb2Yod2NoYXJfdCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgaWYgKHBEZXZpY2VOYW1lcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyR2V0RGV2aWNlUmVnaXN0cnlGaWxlczogRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBkaXNwbGF5IGRldmljZSBuYW1lcy4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChDTV9HZXRfRGV2aWNlX0lEX0xpc3RXKGRpc3BsYXlHVUlELCBwRGV2aWNlTmFtZXMsIGRldmljZU5hbWVzU2l6ZSwgZmxhZ3MpID09IENSX0JVRkZFUl9TTUFMTCk7CisKKyAgICBpZiAocERldmljZU5hbWVzKSB7CisgICAgICAgIGZvciAod2NoYXJfdCAqZGV2aWNlTmFtZSA9IHBEZXZpY2VOYW1lczsgKmRldmljZU5hbWU7IGRldmljZU5hbWUgKz0gd2NzbGVuKGRldmljZU5hbWUpICsgMSkgeworICAgICAgICAgICAgQ09ORklHUkVUIHN0YXR1cyA9IENNX0xvY2F0ZV9EZXZOb2RlVygmZGV2SUQsIGRldmljZU5hbWUsIENNX0xPQ0FURV9ERVZOT0RFX05PUk1BTCk7CisgICAgICAgICAgICBpZiAoQ1JfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLCAibG9hZGVyR2V0RGV2aWNlUmVnaXN0cnlGaWxlczogZmFpbGVkIHRvIG9wZW4gRGV2Tm9kZSAlbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVTE9ORyB1bFN0YXR1cywgdWxQcm9ibGVtOworICAgICAgICAgICAgc3RhdHVzID0gQ01fR2V0X0Rldk5vZGVfU3RhdHVzKCZ1bFN0YXR1cywgJnVsUHJvYmxlbSwgZGV2SUQsIDApOworCisgICAgICAgICAgICBpZiAoQ1JfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwgImxvYWRlckdldERldmljZVJlZ2lzdHJ5RmlsZXM6IGZhaWxlZCB0byBwcm9iZSBkZXZpY2Ugc3RhdHVzICVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgodWxTdGF0dXMgJiBETl9IQVNfUFJPQkxFTSkgJiYgKHVsUHJvYmxlbSA9PSBDTV9QUk9CX05FRURfUkVTVEFSVCB8fCB1bFByb2JsZW0gPT0gRE5fTkVFRF9SRVNUQVJUKSkgeworICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyR2V0RGV2aWNlUmVnaXN0cnlGaWxlczogZGV2aWNlICVscyBpcyBwZW5kaW5nIHJlYm9vdCwgc2tpcHBpbmcgLi4uIiwgZGV2aWNlTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsICJsb2FkZXJHZXREZXZpY2VSZWdpc3RyeUZpbGVzOiBvcGVuaW5nIGRldmljZSAlbHMiLCBkZXZpY2VOYW1lKTsKKworICAgICAgICAgICAgaWYgKGxvYWRlckdldERldmljZVJlZ2lzdHJ5RW50cnkoaW5zdCwgcmVnX2RhdGEsIHJlZ19kYXRhX3NpemUsIGRldklELCB2YWx1ZV9uYW1lLCAmcmVzdWx0KSkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gQ01fR2V0X0NoaWxkKCZjaGlsZElELCBkZXZJRCwgMCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IENSX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlckdldERldmljZVJlZ2lzdHJ5RmlsZXM6IHVuYWJsZSB0byBvcGVuIGNoaWxkLWRldmljZSBlcnJvcjolZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB3Y2hhcl90IGJ1ZmZlcltNQVhfREVWSUNFX0lEX0xFTl07CisgICAgICAgICAgICAgICAgQ01fR2V0X0RldmljZV9JRFcoY2hpbGRJRCwgYnVmZmVyLCBNQVhfREVWSUNFX0lEX0xFTiwgMCk7CisKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlckdldERldmljZVJlZ2lzdHJ5RmlsZXM6IE9wZW5pbmcgY2hpbGQgZGV2aWNlICVkIC0gJWxzIiwgY2hpbGRJRCwgYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IENNX0dldF9EZXZOb2RlX1JlZ2lzdHJ5X1Byb3BlcnR5VyhjaGlsZElELCBDTV9EUlBfQ0xBU1NHVUlELCBOVUxMLCAmY2hpbGRHdWlkLCAmY2hpbGRHdWlkU2l6ZSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDUl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlckdldERldmljZVJlZ2lzdHJ5RmlsZXM6IHVuYWJsZSB0byBvYnRhaW4gR1VJRCBmb3I6JWQgZXJyb3I6JWQiLCBjaGlsZElELCBzdGF0dXMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHdjc2NtcChjaGlsZEd1aWQsIHNvZnR3YXJlQ29tcG9uZW50R1VJRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJHZXREZXZpY2VSZWdpc3RyeUZpbGVzOiBHVUlEIGZvciAlZCBpcyBub3QgU29mdHdhcmVDb21wb25lbnQgc2tpcHBpbmciLCBjaGlsZElEKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxvYWRlckdldERldmljZVJlZ2lzdHJ5RW50cnkoaW5zdCwgcmVnX2RhdGEsIHJlZ19kYXRhX3NpemUsIGNoaWxkSUQsIHZhbHVlX25hbWUsICZyZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBjaGVjayBuZXh0LWRpc3BsYXktZGV2aWNlCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IHdoaWxlIChDTV9HZXRfU2libGluZygmY2hpbGRJRCwgY2hpbGRJRCwgMCkgPT0gQ1JfU1VDQ0VTUyk7CisgICAgICAgIH0KKworICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIHBEZXZpY2VOYW1lcyk7CisgICAgfQorCisgICAgaWYgKCFmb3VuZCAmJiByZXN1bHQgIT0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZKSB7CisgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgY2hhciAqbG9hZGVyX2dldF9uZXh0X3BhdGgoY2hhciAqcGF0aCk7CisKKy8vIEZpbmQgdGhlIGxpc3Qgb2YgcmVnaXN0cnkgZmlsZXMgKG5hbWVzIHdpdGhpbiBhIGtleSkgaW4ga2V5ICJsb2NhdGlvbiIuCisvLworLy8gVGhpcyBmdW5jdGlvbiBsb29rcyBpbiB0aGUgcmVnaXN0cnkgKGhpdmUgPSBERUZBVUxUX1ZLX1JFR0lTVFJZX0hJVkUpIGtleSBhcworLy8gZ2l2ZW4gaW4gImxvY2F0aW9uIgorLy8gZm9yIGEgbGlzdCBvciBuYW1lL3ZhbHVlcyB3aGljaCBhcmUgYWRkZWQgdG8gYSByZXR1cm5lZCBsaXN0IChmdW5jdGlvbiByZXR1cm4KKy8vIHZhbHVlKS4KKy8vIFRoZSBEV09SRCB2YWx1ZXMgd2l0aGluIHRoZSBrZXkgbXVzdCBiZSAwIG9yIHRoZXkgYXJlIHNraXBwZWQuCisvLyBGdW5jdGlvbiByZXR1cm4gaXMgYSBzdHJpbmcgd2l0aCBhICc7JyAgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZW5hbWVzLgorLy8gRnVuY3Rpb24gcmV0dXJuIGlzIE5VTEwgaWYgbm8gdmFsaWQgbmFtZS92YWx1ZSBwYWlycyAgYXJlIGZvdW5kIGluIHRoZSBrZXksCisvLyBvciB0aGUga2V5IGlzIG5vdCBmb3VuZC4KKy8vCisvLyAqcmVnX2RhdGEgY29udGFpbnMgYSBzdHJpbmcgbGlzdCBvZiBmaWxlbmFtZXMgYXMgcG9pbnRlci4KKy8vIFdoZW4gZG9uZSB1c2luZyB0aGUgcmV0dXJuZWQgc3RyaW5nIGxpc3QsIHRoZSBjYWxsZXIgc2hvdWxkIGZyZWUgdGhlIHBvaW50ZXIuCitWa1Jlc3VsdCBsb2FkZXJHZXRSZWdpc3RyeUZpbGVzKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNoYXIgKmxvY2F0aW9uLCBib29sIHVzZV9zZWNvbmRhcnlfaGl2ZSwgY2hhciAqKnJlZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRFdPUkQgcmVnX2RhdGFfc2l6ZSkgeworICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhbGwgb2YgdGhlIGFsbG93ZWQgSUNEcy4gVGhpcyBhbGxvd3MgdXMgdG8gdmVyaWZ5IHRoYXQgYSBkZXZpY2UgaXMgYWN0dWFsbHkgcHJlc2VudCBmcm9tIHRoZSB2ZW5kb3IKKyAgICAvLyBzcGVjaWZpZWQuIFRoaXMgZG9lcyBkaXNhbGxvdyBvdGhlciB2ZW5kb3JzLCBidXQgYW55IG5ldyBkcml2ZXIgc2hvdWxkIHVzZSB0aGUgZGV2aWNlLXNwZWNpZmljIHJlZ2lzdHJpZXMgYW55d2F5LgorICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICAgICAgaW50IHZlbmRvcl9pZDsKKyAgICB9IGtub3duX2RyaXZlcnNbXSA9IHsKKyNpZiBkZWZpbmVkKF9XSU42NCkKKyAgICAgICAgeworICAgICAgICAgICAgLmZpbGVuYW1lID0gImlndms2NC5qc29uIiwKKyAgICAgICAgICAgIC52ZW5kb3JfaWQgPSAweDgwODYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC5maWxlbmFtZSA9ICJudi12azY0Lmpzb24iLAorICAgICAgICAgICAgLnZlbmRvcl9pZCA9IDB4MTBkZSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLmZpbGVuYW1lID0gImFtZC12dWxrYW42NC5qc29uIiwKKyAgICAgICAgICAgIC52ZW5kb3JfaWQgPSAweDEwMDIsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC5maWxlbmFtZSA9ICJhbWR2bGs2NC5qc29uIiwKKyAgICAgICAgICAgIC52ZW5kb3JfaWQgPSAweDEwMDIsCisgICAgICAgIH0sCisjZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAuZmlsZW5hbWUgPSAiaWd2azMyLmpzb24iLAorICAgICAgICAgICAgLnZlbmRvcl9pZCA9IDB4ODA4NiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLmZpbGVuYW1lID0gIm52LXZrMzIuanNvbiIsCisgICAgICAgICAgICAudmVuZG9yX2lkID0gMHgxMGRlLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAuZmlsZW5hbWUgPSAiYW1kLXZ1bGthbjMyLmpzb24iLAorICAgICAgICAgICAgLnZlbmRvcl9pZCA9IDB4MTAwMiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLmZpbGVuYW1lID0gImFtZHZsazMyLmpzb24iLAorICAgICAgICAgICAgLnZlbmRvcl9pZCA9IDB4MTAwMiwKKyAgICAgICAgfSwKKyNlbmRpZgorICAgIH07CisKKyAgICBMT05HIHJ0bl92YWx1ZTsKKyAgICBIS0VZIGhpdmUgPSBERUZBVUxUX1ZLX1JFR0lTVFJZX0hJVkUsIGtleTsKKyAgICBEV09SRCBhY2Nlc3NfZmxhZ3M7CisgICAgY2hhciBuYW1lWzIwNDhdOworICAgIGNoYXIgKmxvYyA9IGxvY2F0aW9uOworICAgIGNoYXIgKm5leHQ7CisgICAgRFdPUkQgaWR4OworICAgIERXT1JEIG5hbWVfc2l6ZSA9IHNpemVvZihuYW1lKTsKKyAgICBEV09SRCB2YWx1ZTsKKyAgICBEV09SRCB2YWx1ZV9zaXplID0gc2l6ZW9mKHZhbHVlKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBWS19TVUNDRVNTOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBJRFhHSUZhY3RvcnkxICpkeGdpX2ZhY3RvcnkgPSBOVUxMOworICAgIGJvb2wgaXNfZHJpdmVyID0gIXN0cmNtcChsb2NhdGlvbiwgVktfRFJJVkVSU19JTkZPX1JFR0lTVFJZX0xPQyk7CisKKyAgICBpZiAoTlVMTCA9PSByZWdfZGF0YSkgeworICAgICAgICByZXN1bHQgPSBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChpc19kcml2ZXIpIHsKKyAgICAgICAgSFJFU1VMVCBocmVzID0gZHluX0NyZWF0ZURYR0lGYWN0b3J5MSgmSUlEX0lEWEdJRmFjdG9yeTEsICZkeGdpX2ZhY3RvcnkpOworICAgICAgICBpZiAoaHJlcyAhPSBTX09LKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgICAgIGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgImxvYWRlckdldFJlZ2lzdHJ5RmlsZXM6IEZhaWxlZCB0byBjcmVhdGUgZHhnaSBmYWN0b3J5IGZvciBJQ0QgcmVnaXN0cnkgdmVyaWZpY2F0aW9uLiBObyBJQ0RzIHdpbGwgYmUgYWRkZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgImxlZ2FjeSByZWdpc3RyeSBsb2NhdGlvbnMiKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKCpsb2MpIHsKKyAgICAgICAgbmV4dCA9IGxvYWRlcl9nZXRfbmV4dF9wYXRoKGxvYyk7CisgICAgICAgIGFjY2Vzc19mbGFncyA9IEtFWV9RVUVSWV9WQUxVRTsKKyAgICAgICAgcnRuX3ZhbHVlID0gUmVnT3BlbktleUV4KGhpdmUsIGxvYywgMCwgYWNjZXNzX2ZsYWdzLCAma2V5KTsKKyAgICAgICAgaWYgKEVSUk9SX1NVQ0NFU1MgPT0gcnRuX3ZhbHVlKSB7CisgICAgICAgICAgICBpZHggPSAwOworICAgICAgICAgICAgd2hpbGUgKChydG5fdmFsdWUgPSBSZWdFbnVtVmFsdWUoa2V5LCBpZHgrKywgbmFtZSwgJm5hbWVfc2l6ZSwgTlVMTCwgTlVMTCwgKExQQllURSkmdmFsdWUsICZ2YWx1ZV9zaXplKSkgPT0KKyAgICAgICAgICAgICAgICAgICBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlX3NpemUgPT0gc2l6ZW9mKHZhbHVlKSAmJiB2YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09ICpyZWdfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ19kYXRhID0gbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgKnJlZ19kYXRhX3NpemUsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09ICpyZWdfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyR2V0UmVnaXN0cnlGaWxlczogRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciByZWdpc3RyeSBkYXRhIGZvciBrZXkgJXMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdDbG9zZUtleShrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICpyZWdfZGF0YVswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybGVuKCpyZWdfZGF0YSkgKyBuYW1lX3NpemUgKyAxID4gKnJlZ19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5ld19wdHIgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9yZWFsbG9jKGluc3QsICpyZWdfZGF0YSwgKnJlZ19kYXRhX3NpemUsICpyZWdfZGF0YV9zaXplICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09IG5ld19wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlckdldFJlZ2lzdHJ5RmlsZXM6IEZhaWxlZCB0byByZWFsbG9jYXRlIHNwYWNlIGZvciByZWdpc3RyeSB2YWx1ZSBvZiBzaXplICVkIGZvciBrZXkgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnX2RhdGFfc2l6ZSAqIDIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ19kYXRhID0gbmV3X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZWdfZGF0YV9zaXplICo9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBub3cgZm91bmQgYSBqc29uIGZpbGUuIElmIHRoaXMgaXMgYW4gSUNELCB3ZSBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGFjdHVhbGx5IGEgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGlzIElDRAorICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsICJMb2NhdGVkIGpzb24gZmlsZSBcIiVzXCIgZnJvbSByZWdpc3RyeSBcIiVzXFwlc1wiIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpdmUgPT0gREVGQVVMVF9WS19SRUdJU1RSWV9ISVZFID8gREVGQVVMVF9WS19SRUdJU1RSWV9ISVZFX1NUUiA6IFNFQ09OREFSWV9WS19SRUdJU1RSWV9ISVZFX1NUUiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZHJpdmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoa25vd25fZHJpdmVycykgLyBzaXplb2Yoa25vd25fZHJpdmVyc1swXSk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUgKyBzdHJsZW4obmFtZSkgLSBzdHJsZW4oa25vd25fZHJpdmVyc1tpXS5maWxlbmFtZSksIGtub3duX2RyaXZlcnNbaV0uZmlsZW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IHNpemVvZihrbm93bl9kcml2ZXJzKSAvIHNpemVvZihrbm93bl9kcml2ZXJzWzBdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHJpdmVyICVzIGlzIG5vdCByZWNvZ25pemVkIGFzIGEga25vd24gZHJpdmVyLiBJdCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgYWN0aXZlIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmRfZ3B1ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURYR0lBZGFwdGVyMSAqYWRhcHRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFU1VMVCBocmVzID0gZHhnaV9mYWN0b3J5LT5scFZ0YmwtPkVudW1BZGFwdGVyczEoZHhnaV9mYWN0b3J5LCBqLCAmYWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVzID09IERYR0lfRVJST1JfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChocmVzICE9IFNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBlbnVtZXJhdGUgRFhHSSBhZGFwdGVycyBhdCBpbmRleCAlZC4gQXMgYSByZXN1bHQsIGRyaXZlcnMgbWF5IGJlIHNraXBwZWQiLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhHSV9BREFQVEVSX0RFU0MxIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVzID0gYWRhcHRlci0+bHBWdGJsLT5HZXREZXNjMShhZGFwdGVyLCAmZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHJlcyAhPSBTX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IERYR0kgYWRhcHRlciBpbmZvcm1hdGlvbiBhdCBpbmRleCAlZC4gQXMgYSByZXN1bHQsIGRyaXZlcnMgbWF5IGJlIHNraXBwZWQiLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLlZlbmRvcklkID09IGtub3duX2RyaXZlcnNbaV0udmVuZG9yX2lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9ncHUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kX2dwdSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEcm9wcGluZyBkcml2ZXIgJXMgYXMgbm8gY29ycmVzcG9uZHVpbmcgRFhHSSBhZGFwdGVyIHdhcyBmb3VuZCIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCpyZWdfZGF0YSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpc3QgaXMgZW10cHkuIEFkZCB0aGUgZmlyc3QgZW50cnkuCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClzbnByaW50ZigqcmVnX2RhdGEsIG5hbWVfc2l6ZSArIDEsICIlcyIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcmVnX2RhdGEgdmFyaWFibGUgY29udGFpbnMgb3RoZXIgSlNPTiBwYXRocywgbGlrZWx5IGZyb20gdGhlIFBOUC9kZXZpY2Ugc2VjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHJlZ2lzdHJ5IHRoYXQgd2Ugd2FudCB0byBoYXZlIHByZWNlbmRlbmNlIG92ZXIgdGhpcyBub24tZGV2aWNlIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIHJlZ2lzdHJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG8gbWFrZSBzdXJlIHdlIGF2b2lkIGVudW1lcmF0aW5nIG9sZCBKU09OIGZpbGVzL2RyaXZlcnMgdGhhdCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBub24tZGV2aWNlIHNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmVhIG9mIHRoZSByZWdpc3RyeSB3aGVuIGEgbmV3ZXIgZGV2aWNlIHNwZWNpZmljIEpTT04gZmlsZSBpcyBwcmVzZW50LCBkbyBhIGNoZWNrIGJlZm9yZSBhZGRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaWxlIG5hbWUsIHdpdGhvdXQgcGF0aCwgb2YgdGhlIEpTT04gZmlsZSBmb3VuZCBpbiB0aGUgbm9uLWRldmljZSBzcGVjaWZpYyByZWdpc3RyeSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzYW1lIEpTT04gZmlsZSBuYW1lIGlzIGFscmVhZHkgZm91bmQgaW4gdGhlIGxpc3QsIGRvbid0IGFkZCBpdCBhZ2Fpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmREdXBsaWNhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBMYXN0U2xhc2hOYW1lID0gc3RycmNocihuYW1lLCAnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTGFzdFNsYXNoTmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm91bmRNYXRjaCA9IHN0cnN0cigqcmVnX2RhdGEsIHBMYXN0U2xhc2hOYW1lICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kTWF0Y2ggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZER1cGxpY2F0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmREdXBsaWNhdGUgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBlbnRyeSB0byB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClzbnByaW50ZigqcmVnX2RhdGEgKyBzdHJsZW4oKnJlZ19kYXRhKSwgbmFtZV9zaXplICsgMiwgIiVjJXMiLCBQQVRIX1NFUEFSQVRPUiwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGFkZGluZyBvZiBqc29uIGZpbGUgXCIlc1wiIGZyb20gcmVnaXN0cnkgXCIlc1xcJXNcIiB0byB0aGUgbGlzdCBkdWUgdG8gZHVwbGljYXRpb24iLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXZlID09IERFRkFVTFRfVktfUkVHSVNUUllfSElWRSA/IERFRkFVTFRfVktfUkVHSVNUUllfSElWRV9TVFIgOiBTRUNPTkRBUllfVktfUkVHSVNUUllfSElWRV9TVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lX3NpemUgPSBzaXplb2YobmFtZSk7CisgICAgICAgICAgICAgICAgdmFsdWVfc2l6ZSA9IHNpemVvZih2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWdDbG9zZUtleShrZXkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWR2YW5jZSB0aGUgbG9jYXRpb24gLSBpZiB0aGUgbmV4dCBsb2NhdGlvbiBpcyBpbiB0aGUgc2Vjb25kYXJ5IGhpdmUsIHRoZW4gcmVzZXQgdGhlIGxvY2F0aW9ucyBhbmQgYWR2YW5jZSB0aGUgaGl2ZQorICAgICAgICBpZiAodXNlX3NlY29uZGFyeV9oaXZlICYmIChoaXZlID09IERFRkFVTFRfVktfUkVHSVNUUllfSElWRSkgJiYgKCpuZXh0ID09ICdcMCcpKSB7CisgICAgICAgICAgICBsb2MgPSBsb2NhdGlvbjsKKyAgICAgICAgICAgIGhpdmUgPSBTRUNPTkRBUllfVktfUkVHSVNUUllfSElWRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvYyA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kICYmIHJlc3VsdCAhPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkpIHsKKyAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKworb3V0OgorICAgIGlmIChpc19kcml2ZXIgJiYgZHhnaV9mYWN0b3J5ICE9IE5VTEwpIHsKKyAgICAgICAgZHhnaV9mYWN0b3J5LT5scFZ0YmwtPlJlbGVhc2UoZHhnaV9mYWN0b3J5KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYgIC8vIFdJTjMyCisKKy8vIENvbWJpbmUgcGF0aCBlbGVtZW50cywgc2VwYXJhdGluZyBlYWNoIGVsZW1lbnQgd2l0aCB0aGUgcGxhdGZvcm0tc3BlY2lmaWMKKy8vIGRpcmVjdG9yeSBzZXBhcmF0b3IsIGFuZCBzYXZlIHRoZSBjb21iaW5lZCBzdHJpbmcgdG8gYSBkZXN0aW5hdGlvbiBidWZmZXIsCisvLyBub3QgZXhjZWVkaW5nIHRoZSBnaXZlbiBsZW5ndGguIFBhdGggZWxlbWVudHMgYXJlIGdpdmVuIGFzIHZhcmlhYmxlIGFyZ3MsCisvLyB3aXRoIGEgTlVMTCBlbGVtZW50IHRlcm1pbmF0aW5nIHRoZSBsaXN0LgorLy8KKy8vIFxyZXR1cm5zIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGNvbWJpbmVkIHN0cmluZywgbm90IGluY2x1ZGluZyBhbiBBU0NJSQorLy8gTlVMIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gVGhpcyBsZW5ndGggbWF5IGV4Y2VlZCB0aGUgYXZhaWxhYmxlIHN0b3JhZ2U6CisvLyBpbiB0aGlzIGNhc2UsIHRoZSB3cml0dGVuIHN0cmluZyB3aWxsIGJlIHRydW5jYXRlZCB0byBhdm9pZCBhIGJ1ZmZlcgorLy8gb3ZlcnJ1biwgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN0b3JhZ2UKKy8vIHNpemUuIEEgTlVMTCBhcmd1bWVudCBtYXkgYmUgcHJvdmlkZWQgYXMgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpbiBvcmRlcgorLy8gdG8gZGV0ZXJtaW5lIHRoZSByZXF1aXJlZCBzdHJpbmcgbGVuZ3RoIHdpdGhvdXQgYWN0dWFsbHkgd3JpdGluZyBhIHN0cmluZy4KK3N0YXRpYyBzaXplX3QgbG9hZGVyX3BsYXRmb3JtX2NvbWJpbmVfcGF0aChjaGFyICpkZXN0LCBzaXplX3QgbGVuLCAuLi4pIHsKKyAgICBzaXplX3QgcmVxdWlyZWRfbGVuID0gMDsKKyAgICB2YV9saXN0IGFwOworICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudDsKKworICAgIHZhX3N0YXJ0KGFwLCBsZW4pOworCisgICAgd2hpbGUgKChjb21wb25lbnQgPSB2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKikpKSB7CisgICAgICAgIGlmIChyZXF1aXJlZF9sZW4gPiAwKSB7CisgICAgICAgICAgICAvLyBUaGlzIHBhdGggZWxlbWVudCBpcyBub3QgdGhlIGZpcnN0IG5vbi1lbXB0eSBlbGVtZW50OyBwcmVwZW5kCisgICAgICAgICAgICAvLyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgaWYgc3BhY2UgYWxsb3dzCisgICAgICAgICAgICBpZiAoZGVzdCAmJiByZXF1aXJlZF9sZW4gKyAxIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpc25wcmludGYoZGVzdCArIHJlcXVpcmVkX2xlbiwgbGVuIC0gcmVxdWlyZWRfbGVuLCAiJWMiLCBESVJFQ1RPUllfU1lNQk9MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVpcmVkX2xlbisrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3QgJiYgcmVxdWlyZWRfbGVuIDwgbGVuKSB7CisgICAgICAgICAgICBzdHJuY3B5KGRlc3QgKyByZXF1aXJlZF9sZW4sIGNvbXBvbmVudCwgbGVuIC0gcmVxdWlyZWRfbGVuKTsKKyAgICAgICAgfQorICAgICAgICByZXF1aXJlZF9sZW4gKz0gc3RybGVuKGNvbXBvbmVudCk7CisgICAgfQorCisgICAgdmFfZW5kKGFwKTsKKworICAgIC8vIHN0cm5jcHkoMykgd29uJ3QgYWRkIGEgTlVMIHRlcm1pbmF0aW5nIGJ5dGUgaW4gdGhlIGV2ZW50IG9mIHRydW5jYXRpb24uCisgICAgaWYgKGRlc3QgJiYgcmVxdWlyZWRfbGVuID49IGxlbikgeworICAgICAgICBkZXN0W2xlbiAtIDFdID0gJ1wwJzsKKyAgICB9CisKKyAgICByZXR1cm4gcmVxdWlyZWRfbGVuOworfQorCisvLyBHaXZlbiBzdHJpbmcgb2YgdGhyZWUgcGFydCBmb3JtICJtYWoubWluLnBhdCIgY29udmVydCB0byBhIHZ1bGthbiB2ZXJzaW9uIG51bWJlci4KK3N0YXRpYyB1aW50MzJfdCBsb2FkZXJfbWFrZV92ZXJzaW9uKGNoYXIgKnZlcnNfc3RyKSB7CisgICAgdWludDMyX3QgdmVycyA9IDAsIG1ham9yID0gMCwgbWlub3IgPSAwLCBwYXRjaCA9IDA7CisgICAgY2hhciAqdmVyc190b2s7CisKKyAgICBpZiAoIXZlcnNfc3RyKSB7CisgICAgICAgIHJldHVybiB2ZXJzOworICAgIH0KKworICAgIHZlcnNfdG9rID0gc3RydG9rKHZlcnNfc3RyLCAiLlwiXG5cciIpOworICAgIGlmIChOVUxMICE9IHZlcnNfdG9rKSB7CisgICAgICAgIG1ham9yID0gKHVpbnQxNl90KWF0b2kodmVyc190b2spOworICAgICAgICB2ZXJzX3RvayA9IHN0cnRvayhOVUxMLCAiLlwiXG5cciIpOworICAgICAgICBpZiAoTlVMTCAhPSB2ZXJzX3RvaykgeworICAgICAgICAgICAgbWlub3IgPSAodWludDE2X3QpYXRvaSh2ZXJzX3Rvayk7CisgICAgICAgICAgICB2ZXJzX3RvayA9IHN0cnRvayhOVUxMLCAiLlwiXG5cciIpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gdmVyc190b2spIHsKKyAgICAgICAgICAgICAgICBwYXRjaCA9ICh1aW50MTZfdClhdG9pKHZlcnNfdG9rKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBWS19NQUtFX1ZFUlNJT04obWFqb3IsIG1pbm9yLCBwYXRjaCk7Cit9CisKK2Jvb2wgY29tcGFyZV92a19leHRlbnNpb25fcHJvcGVydGllcyhjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKm9wMSwgY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpvcDIpIHsKKyAgICByZXR1cm4gc3RyY21wKG9wMS0+ZXh0ZW5zaW9uTmFtZSwgb3AyLT5leHRlbnNpb25OYW1lKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOworfQorCisvLyBTZWFyY2ggdGhlIGdpdmVuIGV4dF9hcnJheSBmb3IgYW4gZXh0ZW5zaW9uIG1hdGNoaW5nIHRoZSBnaXZlbiB2a19leHRfcHJvcAorYm9vbCBoYXNfdmtfZXh0ZW5zaW9uX3Byb3BlcnR5X2FycmF5KGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqdmtfZXh0X3Byb3AsIGNvbnN0IHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqZXh0X2FycmF5KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGNvbXBhcmVfdmtfZXh0ZW5zaW9uX3Byb3BlcnRpZXModmtfZXh0X3Byb3AsICZleHRfYXJyYXlbaV0pKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBTZWFyY2ggdGhlIGdpdmVuIGV4dF9saXN0IGZvciBhbiBleHRlbnNpb24gbWF0Y2hpbmcgdGhlIGdpdmVuIHZrX2V4dF9wcm9wCitib29sIGhhc192a19leHRlbnNpb25fcHJvcGVydHkoY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICp2a19leHRfcHJvcCwgY29uc3Qgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqZXh0X2xpc3QpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZXh0X2xpc3QtPmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGNvbXBhcmVfdmtfZXh0ZW5zaW9uX3Byb3BlcnRpZXMoJmV4dF9saXN0LT5saXN0W2ldLCB2a19leHRfcHJvcCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFNlYXJjaCB0aGUgZ2l2ZW4gZXh0X2xpc3QgZm9yIGEgZGV2aWNlIGV4dGVuc2lvbiBtYXRjaGluZyB0aGUgZ2l2ZW4gZXh0X3Byb3AKK2Jvb2wgaGFzX3ZrX2Rldl9leHRfcHJvcGVydHkoY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpleHRfcHJvcCwgY29uc3Qgc3RydWN0IGxvYWRlcl9kZXZpY2VfZXh0ZW5zaW9uX2xpc3QgKmV4dF9saXN0KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGV4dF9saXN0LT5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChjb21wYXJlX3ZrX2V4dGVuc2lvbl9wcm9wZXJ0aWVzKCZleHRfbGlzdC0+bGlzdFtpXS5wcm9wcywgZXh0X3Byb3ApKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBHZXQgdGhlIG5leHQgdW51c2VkIGxheWVyIHByb3BlcnR5IGluIHRoZSBsaXN0LiBJbml0IHRoZSBwcm9wZXJ0eSB0byB6ZXJvLgorc3RhdGljIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqbG9hZGVyR2V0TmV4dExheWVyUHJvcGVydHlTbG90KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsYXllcl9saXN0KSB7CisgICAgaWYgKGxheWVyX2xpc3QtPmNhcGFjaXR5ID09IDApIHsKKyAgICAgICAgbGF5ZXJfbGlzdC0+bGlzdCA9CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBzaXplb2Yoc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzKSAqIDY0LCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgICAgIGlmIChsYXllcl9saXN0LT5saXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJHZXROZXh0TGF5ZXJQcm9wZXJ0eVNsb3Q6IE91dCBvZiBtZW1vcnkgY2FuICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhZGQgYW55IGxheWVyIHByb3BlcnRpZXMgdG8gbGlzdCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGxheWVyX2xpc3QtPmxpc3QsIDAsIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMpICogNjQpOworICAgICAgICBsYXllcl9saXN0LT5jYXBhY2l0eSA9IHNpemVvZihzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMpICogNjQ7CisgICAgfQorCisgICAgLy8gRW5zdXJlIGVub3VnaCByb29tIHRvIGFkZCBhbiBlbnRyeQorICAgIGlmICgobGF5ZXJfbGlzdC0+Y291bnQgKyAxKSAqIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMpID4gbGF5ZXJfbGlzdC0+Y2FwYWNpdHkpIHsKKyAgICAgICAgdm9pZCAqbmV3X3B0ciA9IGxvYWRlcl9pbnN0YW5jZV9oZWFwX3JlYWxsb2MoaW5zdCwgbGF5ZXJfbGlzdC0+bGlzdCwgbGF5ZXJfbGlzdC0+Y2FwYWNpdHksIGxheWVyX2xpc3QtPmNhcGFjaXR5ICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICBpZiAoTlVMTCA9PSBuZXdfcHRyKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLCAibG9hZGVyR2V0TmV4dExheWVyUHJvcGVydHlTbG90OiByZWFsbG9jIGZhaWxlZCBmb3IgbGF5ZXIgbGlzdCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbGF5ZXJfbGlzdC0+bGlzdCA9IG5ld19wdHI7CisgICAgICAgIG1lbXNldCgodWludDhfdCAqKWxheWVyX2xpc3QtPmxpc3QgKyBsYXllcl9saXN0LT5jYXBhY2l0eSwgMCwgbGF5ZXJfbGlzdC0+Y2FwYWNpdHkpOworICAgICAgICBsYXllcl9saXN0LT5jYXBhY2l0eSAqPSAyOworICAgIH0KKworICAgIGxheWVyX2xpc3QtPmNvdW50Kys7CisgICAgcmV0dXJuICYobGF5ZXJfbGlzdC0+bGlzdFtsYXllcl9saXN0LT5jb3VudCAtIDFdKTsKK30KKworLy8gU2VhcmNoIHRoZSBnaXZlbiBsYXllciBsaXN0IGZvciBhIGxheWVyIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiBsYXllciBuYW1lCitzdGF0aWMgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpsb2FkZXJGaW5kTGF5ZXJQcm9wZXJ0eShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmxheWVyX2xpc3QpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5ZXJfbGlzdC0+Y291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0xheWVyUHJvcGVydGllcyAqaXRlbSA9ICZsYXllcl9saXN0LT5saXN0W2ldLmluZm87CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgaXRlbS0+bGF5ZXJOYW1lKSA9PSAwKSByZXR1cm4gJmxheWVyX2xpc3QtPmxpc3RbaV07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvLyBTZWFyY2ggdGhlIGdpdmVuIGxheWVyIGxpc3QgZm9yIGEgbGF5ZXIgbWF0Y2hpbmcgdGhlIGdpdmVuIGxheWVyIG5hbWUKK3N0YXRpYyBib29sIGxvYWRlckZpbmRMYXllck5hbWVJbkxpc3QoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsYXllcl9saXN0KSB7CisgICAgaWYgKE5VTEwgPT0gbGF5ZXJfbGlzdCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChOVUxMICE9IGxvYWRlckZpbmRMYXllclByb3BlcnR5KG5hbWUsIGxheWVyX2xpc3QpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFNlYXJjaCB0aGUgZ2l2ZW4gbWV0YS1sYXllcidzIGNvbXBvbmVudCBsaXN0IGZvciBhIGxheWVyIG1hdGNoaW5nIHRoZSBnaXZlbiBsYXllciBuYW1lCitzdGF0aWMgYm9vbCBsb2FkZXJGaW5kTGF5ZXJOYW1lSW5NZXRhTGF5ZXIoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgY2hhciAqbGF5ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmxheWVyX2xpc3QsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqbWV0YV9sYXllcl9wcm9wcykgeworICAgIGZvciAodWludDMyX3QgY29tcF9sYXllciA9IDA7IGNvbXBfbGF5ZXIgPCBtZXRhX2xheWVyX3Byb3BzLT5udW1fY29tcG9uZW50X2xheWVyczsgY29tcF9sYXllcisrKSB7CisgICAgICAgIGlmICghc3RyY21wKG1ldGFfbGF5ZXJfcHJvcHMtPmNvbXBvbmVudF9sYXllcl9uYW1lc1tjb21wX2xheWVyXSwgbGF5ZXJfbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqY29tcF9sYXllcl9wcm9wcyA9CisgICAgICAgICAgICBsb2FkZXJGaW5kTGF5ZXJQcm9wZXJ0eShtZXRhX2xheWVyX3Byb3BzLT5jb21wb25lbnRfbGF5ZXJfbmFtZXNbY29tcF9sYXllcl0sIGxheWVyX2xpc3QpOworICAgICAgICBpZiAoY29tcF9sYXllcl9wcm9wcy0+dHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19NRVRBX0xBWUVSKSB7CisgICAgICAgICAgICByZXR1cm4gbG9hZGVyRmluZExheWVyTmFtZUluTWV0YUxheWVyKGluc3QsIGxheWVyX25hbWUsIGxheWVyX2xpc3QsIGNvbXBfbGF5ZXJfcHJvcHMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gU2VhcmNoIHRoZSBvdmVycmlkZSBsYXllcidzIGJsYWNrbGlzdCBmb3IgYSBsYXllciBtYXRjaGluZyB0aGUgZ2l2ZW4gbGF5ZXIgbmFtZQorc3RhdGljIGJvb2wgbG9hZGVyRmluZExheWVyTmFtZUluQmxhY2tsaXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IGNoYXIgKmxheWVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsYXllcl9saXN0LCBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKm1ldGFfbGF5ZXJfcHJvcHMpIHsKKyAgICBmb3IgKHVpbnQzMl90IGJsYWNrX2xheWVyID0gMDsgYmxhY2tfbGF5ZXIgPCBtZXRhX2xheWVyX3Byb3BzLT5udW1fYmxhY2tsaXN0X2xheWVyczsgKytibGFja19sYXllcikgeworICAgICAgICBpZiAoIXN0cmNtcChtZXRhX2xheWVyX3Byb3BzLT5ibGFja2xpc3RfbGF5ZXJfbmFtZXNbYmxhY2tfbGF5ZXJdLCBsYXllcl9uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZW1vdmUgYWxsIGxheWVyIHByb3BlcnRpZXMgZW50cmllcyBmcm9tIHRoZSBsaXN0Cit2b2lkIGxvYWRlckRlbGV0ZUxheWVyTGlzdEFuZFByb3BlcnRpZXMoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsYXllcl9saXN0KSB7CisgICAgdWludDMyX3QgaSwgaiwgazsKKyAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZV9leHRlbnNpb25fbGlzdCAqZGV2X2V4dF9saXN0OworICAgIHN0cnVjdCBsb2FkZXJfZGV2X2V4dF9wcm9wcyAqZXh0X3Byb3BzOworICAgIGlmICghbGF5ZXJfbGlzdCkgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IGxheWVyX2xpc3QtPmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gbGF5ZXJfbGlzdC0+bGlzdFtpXS5ibGFja2xpc3RfbGF5ZXJfbmFtZXMpIHsKKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgbGF5ZXJfbGlzdC0+bGlzdFtpXS5ibGFja2xpc3RfbGF5ZXJfbmFtZXMpOworICAgICAgICAgICAgbGF5ZXJfbGlzdC0+bGlzdFtpXS5ibGFja2xpc3RfbGF5ZXJfbmFtZXMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChOVUxMICE9IGxheWVyX2xpc3QtPmxpc3RbaV0uY29tcG9uZW50X2xheWVyX25hbWVzKSB7CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGxheWVyX2xpc3QtPmxpc3RbaV0uY29tcG9uZW50X2xheWVyX25hbWVzKTsKKyAgICAgICAgICAgIGxheWVyX2xpc3QtPmxpc3RbaV0uY29tcG9uZW50X2xheWVyX25hbWVzID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoTlVMTCAhPSBsYXllcl9saXN0LT5saXN0W2ldLm92ZXJyaWRlX3BhdGhzKSB7CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGxheWVyX2xpc3QtPmxpc3RbaV0ub3ZlcnJpZGVfcGF0aHMpOworICAgICAgICAgICAgbGF5ZXJfbGlzdC0+bGlzdFtpXS5vdmVycmlkZV9wYXRocyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfZ2VuZXJpY19saXN0KGluc3QsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKSZsYXllcl9saXN0LT5saXN0W2ldLmluc3RhbmNlX2V4dGVuc2lvbl9saXN0KTsKKyAgICAgICAgZGV2X2V4dF9saXN0ID0gJmxheWVyX2xpc3QtPmxpc3RbaV0uZGV2aWNlX2V4dGVuc2lvbl9saXN0OworICAgICAgICBpZiAoZGV2X2V4dF9saXN0LT5jYXBhY2l0eSA+IDAgJiYgTlVMTCAhPSBkZXZfZXh0X2xpc3QtPmxpc3QpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZXZfZXh0X2xpc3QtPmNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBleHRfcHJvcHMgPSAmZGV2X2V4dF9saXN0LT5saXN0W2pdOworICAgICAgICAgICAgICAgIGlmIChleHRfcHJvcHMtPmVudHJ5cG9pbnRfY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBleHRfcHJvcHMtPmVudHJ5cG9pbnRfY291bnQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBleHRfcHJvcHMtPmVudHJ5cG9pbnRzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGV4dF9wcm9wcy0+ZW50cnlwb2ludHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2FkZXJfZGVzdHJveV9nZW5lcmljX2xpc3QoaW5zdCwgKHN0cnVjdCBsb2FkZXJfZ2VuZXJpY19saXN0ICopZGV2X2V4dF9saXN0KTsKKyAgICB9CisgICAgbGF5ZXJfbGlzdC0+Y291bnQgPSAwOworCisgICAgaWYgKGxheWVyX2xpc3QtPmNhcGFjaXR5ID4gMCkgeworICAgICAgICBsYXllcl9saXN0LT5jYXBhY2l0eSA9IDA7CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgbGF5ZXJfbGlzdC0+bGlzdCk7CisgICAgfQorfQorCisvLyBSZW1vdmUgYWxsIGxheWVycyBpbiB0aGUgbGF5ZXIgbGlzdCB0aGF0IGFyZSBibGFja2xpc3RlZCBieSB0aGUgb3ZlcnJpZGUgbGF5ZXIuCisvLyBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBhbiBvdmVycmlkZSBsYXllciBpcyBmb3VuZCBhbmQgbm90IGV4cGlyZWQuCit2b2lkIGxvYWRlclJlbW92ZUxheWVyc0luQmxhY2tsaXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqbGF5ZXJfbGlzdCkgeworICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqb3ZlcnJpZGVfcHJvcCA9IGxvYWRlckZpbmRMYXllclByb3BlcnR5KFZLX09WRVJSSURFX0xBWUVSX05BTUUsIGxheWVyX2xpc3QpOworICAgIGlmIChOVUxMID09IG92ZXJyaWRlX3Byb3ApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IChpbnQzMl90KShsYXllcl9saXN0LT5jb3VudCk7IGorKykgeworICAgICAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgY3VyX2xheWVyX3Byb3AgPSBsYXllcl9saXN0LT5saXN0W2pdOworICAgICAgICBjb25zdCBjaGFyICpjdXJfbGF5ZXJfbmFtZSA9ICZjdXJfbGF5ZXJfcHJvcC5pbmZvLmxheWVyTmFtZVswXTsKKworICAgICAgICAvLyBTa2lwIHRoZSBvdmVycmlkZSBsYXllciBpdHNlbGYuCisgICAgICAgIGlmICghc3RyY21wKFZLX09WRVJSSURFX0xBWUVSX05BTUUsIGN1cl9sYXllcl9uYW1lKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBmb3VuZCBpbiB0aGUgb3ZlcnJpZGUgbGF5ZXIncyBibGFja2xpc3QsIHJlbW92ZSBpdAorICAgICAgICBpZiAobG9hZGVyRmluZExheWVyTmFtZUluQmxhY2tsaXN0KGluc3QsIGN1cl9sYXllcl9uYW1lLCBsYXllcl9saXN0LCBvdmVycmlkZV9wcm9wKSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlclJlbW92ZUxheWVyc0luQmxhY2tsaXN0OiBPdmVycmlkZSBsYXllciBpcyBhY3RpdmUgYW5kIGxheWVyICVzIGlzIGluIHRoZSBibGFja2xpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICIgaW5zaWRlIG9mIGl0LiBSZW1vdmluZyB0aGF0IGxheWVyIGZyb20gY3VycmVudCBsYXllciBsaXN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sYXllcl9uYW1lKTsKKworICAgICAgICAgICAgaWYgKGN1cl9sYXllcl9wcm9wLnR5cGVfZmxhZ3MgJiBWS19MQVlFUl9UWVBFX0ZMQUdfTUVUQV9MQVlFUikgeworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgY29tcG9uZW50IGxheWVycworICAgICAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgY3VyX2xheWVyX3Byb3AuY29tcG9uZW50X2xheWVyX25hbWVzKTsKKyAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGN1cl9sYXllcl9wcm9wLm92ZXJyaWRlX3BhdGhzKTsKKyAgICAgICAgICAgICAgICAvLyBOZXZlciBuZWVkIHRvIGZyZWUgdGhlIGJsYWNrbGlzdCwgc2luY2UgaXQgY2FuIG9ubHkgZXhpc3QgaW4gdGhlIG92ZXJyaWRlIGxheWVyCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCBpbnZhbGlkIG1ldGEtbGF5ZXIgZnJvbSB0aGUgbGF5ZXIgbGlzdC4gIFVzZSBtZW1tb3ZlIHNpbmNlIHdlIGFyZQorICAgICAgICAgICAgLy8gb3ZlcmxhcHBpbmcgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLgorICAgICAgICAgICAgbWVtbW92ZSgmbGF5ZXJfbGlzdC0+bGlzdFtqXSwgJmxheWVyX2xpc3QtPmxpc3RbaiArIDFdLAorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzKSAqIChsYXllcl9saXN0LT5jb3VudCAtIDEgLSBqKSk7CisKKyAgICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgY291bnQgKGJlY2F1c2Ugd2Ugbm93IGhhdmUgb25lIGxlc3MpIGFuZCBkZWNyZW1lbnQgdGhlIGxvb3AgaW5kZXggc2luY2Ugd2UgbmVlZCB0bworICAgICAgICAgICAgLy8gcmUtY2hlY2sgdGhpcyBpbmRleC4KKyAgICAgICAgICAgIGxheWVyX2xpc3QtPmNvdW50LS07CisgICAgICAgICAgICBqLS07CisKKyAgICAgICAgICAgIC8vIFJlLWRvIHRoZSBxdWVyeSBmb3IgdGhlIG92ZXJyaWRlIGxheWVyCisgICAgICAgICAgICBvdmVycmlkZV9wcm9wID0gbG9hZGVyRmluZExheWVyUHJvcGVydHkoVktfT1ZFUlJJREVfTEFZRVJfTkFNRSwgbGF5ZXJfbGlzdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFJlbW92ZSBhbGwgbGF5ZXJzIGluIHRoZSBsYXllciBsaXN0IHRoYXQgYXJlIG5vdCBmb3VuZCBpbnNpZGUgYW55IGltcGxpY2l0IG1ldGEtbGF5ZXJzLgordm9pZCBsb2FkZXJSZW1vdmVMYXllcnNOb3RJbkltcGxpY2l0TWV0YUxheWVycyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmxheWVyX2xpc3QpIHsKKyAgICBpbnQzMl90IGk7CisgICAgaW50MzJfdCBqOworICAgIGludDMyX3QgbGF5ZXJfY291bnQgPSAoaW50MzJfdCkobGF5ZXJfbGlzdC0+Y291bnQpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxheWVyX2NvdW50OyBpKyspIHsKKyAgICAgICAgbGF5ZXJfbGlzdC0+bGlzdFtpXS5rZWVwID0gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGxheWVyX2NvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzIGN1cl9sYXllcl9wcm9wID0gbGF5ZXJfbGlzdC0+bGlzdFtpXTsKKworICAgICAgICBpZiAoMCA9PSAoY3VyX2xheWVyX3Byb3AudHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19FWFBMSUNJVF9MQVlFUikpIHsKKyAgICAgICAgICAgIGN1cl9sYXllcl9wcm9wLmtlZXAgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyX2xheWVyX3Byb3AudHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19NRVRBX0xBWUVSKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGF5ZXJfY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyBsYXllcl90b19jaGVjayA9IGxheWVyX2xpc3QtPmxpc3Rbal07CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBqKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZvciBhbGwgbGF5ZXJzIGZvdW5kIGluIHRoaXMgbWV0YSBsYXllciwgd2Ugd2FudCB0byBrZWVwIHRoZW0gYXMgd2VsbC4KKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyRmluZExheWVyTmFtZUluTWV0YUxheWVyKGluc3QsIGxheWVyX3RvX2NoZWNrLmluZm8ubGF5ZXJOYW1lLCBsYXllcl9saXN0LCAmY3VyX2xheWVyX3Byb3ApKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cl9sYXllcl9wcm9wLmtlZXAgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlbW92ZSBhbnkgbGF5ZXJzIHdlIGRvbid0IHdhbnQgdG8ga2VlcCAoRG9uJ3QgdXNlIGxheWVyX2NvdW50IGhlcmUgYXMgd2UgbmVlZCBpdCB0byBiZQorICAgIC8vIGR5bmFtaWNhbGx5IHVwZGF0ZWQgaWYgd2UgZGVsZXRlIGEgbGF5ZXIgcHJvcGVydHkgaW4gdGhlIGxpc3QpLgorICAgIGZvciAoaSA9IDA7IGkgPCAoaW50MzJfdCkobGF5ZXJfbGlzdC0+Y291bnQpOyBpKyspIHsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzIGN1cl9sYXllcl9wcm9wID0gbGF5ZXJfbGlzdC0+bGlzdFtpXTsKKyAgICAgICAgaWYgKCFjdXJfbGF5ZXJfcHJvcC5rZWVwKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyUmVtb3ZlTGF5ZXJzTm90SW5JbXBsaWNpdE1ldGFMYXllcnMgOiBJbXBsaWNpdCBtZXRhLWxheWVycyBhcmUgYWN0aXZlLCBhbmQgbGF5ZXIgJXMgaXMgbm90IGxpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICIgaW5zaWRlIG9mIGFueS4gIFNvIHJlbW92aW5nIGxheWVyIGZyb20gY3VycmVudCBsYXllciBsaXN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sYXllcl9wcm9wLmluZm8ubGF5ZXJOYW1lKTsKKworICAgICAgICAgICAgaWYgKGN1cl9sYXllcl9wcm9wLnR5cGVfZmxhZ3MgJiBWS19MQVlFUl9UWVBFX0ZMQUdfTUVUQV9MQVlFUikgeworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgY29tcG9uZW50IGxheWVycworICAgICAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgY3VyX2xheWVyX3Byb3AuY29tcG9uZW50X2xheWVyX25hbWVzKTsKKyAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGN1cl9sYXllcl9wcm9wLm92ZXJyaWRlX3BhdGhzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IGludmFsaWQgbWV0YS1sYXllciBmcm9tIHRoZSBsYXllciBsaXN0LiAgVXNlIG1lbW1vdmUgc2luY2Ugd2UgYXJlCisgICAgICAgICAgICAvLyBvdmVybGFwcGluZyB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuCisgICAgICAgICAgICBtZW1tb3ZlKCZsYXllcl9saXN0LT5saXN0W2ldLCAmbGF5ZXJfbGlzdC0+bGlzdFtpICsgMV0sCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMpICogKGxheWVyX2xpc3QtPmNvdW50IC0gMSAtIGkpKTsKKworICAgICAgICAgICAgLy8gRGVjcmVtZW50IHRoZSBjb3VudCAoYmVjYXVzZSB3ZSBub3cgaGF2ZSBvbmUgbGVzcykgYW5kIGRlY3JlbWVudCB0aGUgbG9vcCBpbmRleCBzaW5jZSB3ZSBuZWVkIHRvCisgICAgICAgICAgICAvLyByZS1jaGVjayB0aGlzIGluZGV4LgorICAgICAgICAgICAgbGF5ZXJfbGlzdC0+Y291bnQtLTsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIFZrUmVzdWx0IGxvYWRlcl9hZGRfaW5zdGFuY2VfZXh0ZW5zaW9ucyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgZnBfZ2V0X3Byb3BzLCBjb25zdCBjaGFyICpsaWJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqZXh0X2xpc3QpIHsKKyAgICB1aW50MzJfdCBpLCBjb3VudCA9IDA7CisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpleHRfcHJvcHM7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKworICAgIGlmICghZnBfZ2V0X3Byb3BzKSB7CisgICAgICAgIC8vIE5vIEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBkZWZpbmVkCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHJlcyA9IGZwX2dldF9wcm9wcyhOVUxMLCAmY291bnQsIE5VTEwpOworICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJsb2FkZXJfYWRkX2luc3RhbmNlX2V4dGVuc2lvbnM6IEVycm9yIGdldHRpbmcgSW5zdGFuY2UgIgorICAgICAgICAgICAgICAgICAgICJleHRlbnNpb24gY291bnQgZnJvbSAlcyIsCisgICAgICAgICAgICAgICAgICAgbGliX25hbWUpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAvLyBObyBFeHRlbnNpb25Qcm9wZXJ0aWVzIHRvIHJlcG9ydAorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBleHRfcHJvcHMgPSBsb2FkZXJfc3RhY2tfYWxsb2MoY291bnQgKiBzaXplb2YoVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKSk7CisgICAgaWYgKE5VTEwgPT0gZXh0X3Byb3BzKSB7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcmVzID0gZnBfZ2V0X3Byb3BzKE5VTEwsICZjb3VudCwgZXh0X3Byb3BzKTsKKyAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAibG9hZGVyX2FkZF9pbnN0YW5jZV9leHRlbnNpb25zOiBFcnJvciBnZXR0aW5nIEluc3RhbmNlICIKKyAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9ucyBmcm9tICVzIiwKKyAgICAgICAgICAgICAgICAgICBsaWJfbmFtZSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGNoYXIgc3BlY192ZXJzaW9uWzY0XTsKKworICAgICAgICBib29sIGV4dF91bnN1cHBvcnRlZCA9IHdzaV91bnN1cHBvcnRlZF9pbnN0YW5jZV9leHRlbnNpb24oJmV4dF9wcm9wc1tpXSk7CisgICAgICAgIGlmICghZXh0X3Vuc3VwcG9ydGVkKSB7CisgICAgICAgICAgICAodm9pZClzbnByaW50ZihzcGVjX3ZlcnNpb24sIHNpemVvZihzcGVjX3ZlcnNpb24pLCAiJWQuJWQuJWQiLCBWS19WRVJTSU9OX01BSk9SKGV4dF9wcm9wc1tpXS5zcGVjVmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19WRVJTSU9OX01JTk9SKGV4dF9wcm9wc1tpXS5zcGVjVmVyc2lvbiksIFZLX1ZFUlNJT05fUEFUQ0goZXh0X3Byb3BzW2ldLnNwZWNWZXJzaW9uKSk7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCAwLCAiSW5zdGFuY2UgRXh0ZW5zaW9uOiAlcyAoJXMpIHZlcnNpb24gJXMiLCBleHRfcHJvcHNbaV0uZXh0ZW5zaW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGliX25hbWUsIHNwZWNfdmVyc2lvbik7CisKKyAgICAgICAgICAgIHJlcyA9IGxvYWRlcl9hZGRfdG9fZXh0X2xpc3QoaW5zdCwgZXh0X2xpc3QsIDEsICZleHRfcHJvcHNbaV0pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJfYWRkX2luc3RhbmNlX2V4dGVuc2lvbnM6IEZhaWxlZCB0byBhZGQgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIEluc3RhbmNlIGV4dGVuc2lvbiBsaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYl9uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworb3V0OgorICAgIHJldHVybiByZXM7Cit9CisKKy8vIEluaXRpYWxpemUgZXh0X2xpc3Qgd2l0aCB0aGUgcGh5c2ljYWwgZGV2aWNlIGV4dGVuc2lvbnMuCisvLyBUaGUgZXh0ZW5zaW9uIHByb3BlcnRpZXMgYXJlIHBhc3NlZCBhcyBpbnB1dHMgaW4gY291bnQgYW5kIGV4dF9wcm9wcy4KK3N0YXRpYyBWa1Jlc3VsdCBsb2FkZXJfaW5pdF9kZXZpY2VfZXh0ZW5zaW9ucyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKmV4dF9wcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2V4dGVuc2lvbl9saXN0ICpleHRfbGlzdCkgeworICAgIFZrUmVzdWx0IHJlczsKKyAgICB1aW50MzJfdCBpOworCisgICAgcmVzID0gbG9hZGVyX2luaXRfZ2VuZXJpY19saXN0KGluc3QsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKWV4dF9saXN0LCBzaXplb2YoVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgY2hhciBzcGVjX3ZlcnNpb25bNjRdOworICAgICAgICAodm9pZClzbnByaW50ZihzcGVjX3ZlcnNpb24sIHNpemVvZihzcGVjX3ZlcnNpb24pLCAiJWQuJWQuJWQiLCBWS19WRVJTSU9OX01BSk9SKGV4dF9wcm9wc1tpXS5zcGVjVmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgIFZLX1ZFUlNJT05fTUlOT1IoZXh0X3Byb3BzW2ldLnNwZWNWZXJzaW9uKSwgVktfVkVSU0lPTl9QQVRDSChleHRfcHJvcHNbaV0uc3BlY1ZlcnNpb24pKTsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVCwgMCwgIkRldmljZSBFeHRlbnNpb246ICVzICglcykgdmVyc2lvbiAlcyIsIGV4dF9wcm9wc1tpXS5leHRlbnNpb25OYW1lLAorICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSwgc3BlY192ZXJzaW9uKTsKKyAgICAgICAgcmVzID0gbG9hZGVyX2FkZF90b19leHRfbGlzdChpbnN0LCBleHRfbGlzdCwgMSwgJmV4dF9wcm9wc1tpXSk7CisgICAgICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVmtSZXN1bHQgbG9hZGVyX2FkZF9kZXZpY2VfZXh0ZW5zaW9ucyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk5fdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIGZwRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbF9kZXZpY2UsIGNvbnN0IGNoYXIgKmxpYl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2V4dGVuc2lvbl9saXN0ICpleHRfbGlzdCkgeworICAgIHVpbnQzMl90IGksIGNvdW50OworICAgIFZrUmVzdWx0IHJlczsKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKmV4dF9wcm9wczsKKworICAgIHJlcyA9IGZwRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhwaHlzaWNhbF9kZXZpY2UsIE5VTEwsICZjb3VudCwgTlVMTCk7CisgICAgaWYgKHJlcyA9PSBWS19TVUNDRVNTICYmIGNvdW50ID4gMCkgeworICAgICAgICBleHRfcHJvcHMgPSBsb2FkZXJfc3RhY2tfYWxsb2MoY291bnQgKiBzaXplb2YoVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKSk7CisgICAgICAgIGlmICghZXh0X3Byb3BzKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2FkZF9kZXZpY2VfZXh0ZW5zaW9uczogRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIgorICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBkZXZpY2UgZXh0ZW5zaW9uIHByb3BlcnRpZXMuIik7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJlcyA9IGZwRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhwaHlzaWNhbF9kZXZpY2UsIE5VTEwsICZjb3VudCwgZXh0X3Byb3BzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIHNwZWNfdmVyc2lvbls2NF07CisgICAgICAgICAgICAodm9pZClzbnByaW50ZihzcGVjX3ZlcnNpb24sIHNpemVvZihzcGVjX3ZlcnNpb24pLCAiJWQuJWQuJWQiLCBWS19WRVJTSU9OX01BSk9SKGV4dF9wcm9wc1tpXS5zcGVjVmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19WRVJTSU9OX01JTk9SKGV4dF9wcm9wc1tpXS5zcGVjVmVyc2lvbiksIFZLX1ZFUlNJT05fUEFUQ0goZXh0X3Byb3BzW2ldLnNwZWNWZXJzaW9uKSk7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCAwLCAiRGV2aWNlIEV4dGVuc2lvbjogJXMgKCVzKSB2ZXJzaW9uICVzIiwgZXh0X3Byb3BzW2ldLmV4dGVuc2lvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGxpYl9uYW1lLCBzcGVjX3ZlcnNpb24pOworICAgICAgICAgICAgcmVzID0gbG9hZGVyX2FkZF90b19leHRfbGlzdChpbnN0LCBleHRfbGlzdCwgMSwgJmV4dF9wcm9wc1tpXSk7CisgICAgICAgICAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAibG9hZGVyX2FkZF9kZXZpY2VfZXh0ZW5zaW9uczogRXJyb3IgZ2V0dGluZyBwaHlzaWNhbCAiCisgICAgICAgICAgICAgICAgICAgImRldmljZSBleHRlbnNpb24gaW5mbyBjb3VudCBmcm9tIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICAgICAgIGxpYl9uYW1lKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVmtSZXN1bHQgbG9hZGVyX2luaXRfZ2VuZXJpY19saXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZ2VuZXJpY19saXN0ICpsaXN0X2luZm8sIHNpemVfdCBlbGVtZW50X3NpemUpIHsKKyAgICBzaXplX3QgY2FwYWNpdHkgPSAzMiAqIGVsZW1lbnRfc2l6ZTsKKyAgICBsaXN0X2luZm8tPmNvdW50ID0gMDsKKyAgICBsaXN0X2luZm8tPmNhcGFjaXR5ID0gMDsKKyAgICBsaXN0X2luZm8tPmxpc3QgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBjYXBhY2l0eSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgIGlmIChsaXN0X2luZm8tPmxpc3QgPT0gTlVMTCkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJsb2FkZXJfaW5pdF9nZW5lcmljX2xpc3Q6IEZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSAiCisgICAgICAgICAgICAgICAgICAgImZvciBnZW5lcmljIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KGxpc3RfaW5mby0+bGlzdCwgMCwgY2FwYWNpdHkpOworICAgIGxpc3RfaW5mby0+Y2FwYWNpdHkgPSBjYXBhY2l0eTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBsb2FkZXJfZGVzdHJveV9nZW5lcmljX2xpc3QoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKmxpc3QpIHsKKyAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGxpc3QtPmxpc3QpOworICAgIGxpc3QtPmNvdW50ID0gMDsKKyAgICBsaXN0LT5jYXBhY2l0eSA9IDA7Cit9CisKKy8vIEFwcGVuZCBub24tZHVwbGljYXRlIGV4dGVuc2lvbiBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gcHJvcHMgdG8gdGhlIGdpdmVuIGV4dF9saXN0LgorLy8gUmV0dXJuIC0gVmtfU1VDQ0VTUyBvbiBzdWNjZXNzCitWa1Jlc3VsdCBsb2FkZXJfYWRkX3RvX2V4dF9saXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgKmV4dF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9wX2xpc3RfY291bnQsIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcHJvcHMpIHsKKyAgICB1aW50MzJfdCBpOworICAgIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqY3VyX2V4dDsKKworICAgIGlmIChleHRfbGlzdC0+bGlzdCA9PSBOVUxMIHx8IGV4dF9saXN0LT5jYXBhY2l0eSA9PSAwKSB7CisgICAgICAgIFZrUmVzdWx0IHJlcyA9IGxvYWRlcl9pbml0X2dlbmVyaWNfbGlzdChpbnN0LCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKilleHRfbGlzdCwgc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykpOworICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcF9saXN0X2NvdW50OyBpKyspIHsKKyAgICAgICAgY3VyX2V4dCA9ICZwcm9wc1tpXTsKKworICAgICAgICAvLyBsb29rIGZvciBkdXBsaWNhdGVzCisgICAgICAgIGlmIChoYXNfdmtfZXh0ZW5zaW9uX3Byb3BlcnR5KGN1cl9leHQsIGV4dF9saXN0KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgdG8gbGlzdCBhdCBlbmQKKyAgICAgICAgLy8gY2hlY2sgZm9yIGVub3VnaCBjYXBhY2l0eQorICAgICAgICBpZiAoZXh0X2xpc3QtPmNvdW50ICogc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykgPj0gZXh0X2xpc3QtPmNhcGFjaXR5KSB7CisgICAgICAgICAgICB2b2lkICpuZXdfcHRyID0gbG9hZGVyX2luc3RhbmNlX2hlYXBfcmVhbGxvYyhpbnN0LCBleHRfbGlzdC0+bGlzdCwgZXh0X2xpc3QtPmNhcGFjaXR5LCBleHRfbGlzdC0+Y2FwYWNpdHkgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICAgICAgaWYgKG5ld19wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2FkZF90b19leHRfbGlzdDogRmFpbGVkIHRvIHJlYWxsb2NhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYWNlIGZvciBleHRlbnNpb24gbGlzdCIpOworICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHRfbGlzdC0+bGlzdCA9IG5ld19wdHI7CisKKyAgICAgICAgICAgIC8vIGRvdWJsZSBjYXBhY2l0eQorICAgICAgICAgICAgZXh0X2xpc3QtPmNhcGFjaXR5ICo9IDI7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoJmV4dF9saXN0LT5saXN0W2V4dF9saXN0LT5jb3VudF0sIGN1cl9leHQsIHNpemVvZihWa0V4dGVuc2lvblByb3BlcnRpZXMpKTsKKyAgICAgICAgZXh0X2xpc3QtPmNvdW50Kys7CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisvLyBBcHBlbmQgb25lIGV4dGVuc2lvbiBwcm9wZXJ0eSBkZWZpbmVkIGluIHByb3BzIHdpdGggZW50cnlwb2ludHMgZGVmaW5lZCBpbiBlbnRyaWVzIHRvIHRoZSBnaXZlbgorLy8gZXh0X2xpc3QuIERvIG5vdCBhcHBlbmQgaWYgYSBkdXBsaWNhdGUuCisvLyBSZXR1cm4gLSBWa19TVUNDRVNTIG9uIHN1Y2Nlc3MKK1ZrUmVzdWx0IGxvYWRlcl9hZGRfdG9fZGV2X2V4dF9saXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZGV2aWNlX2V4dGVuc2lvbl9saXN0ICpleHRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcHJvcHMsIHVpbnQzMl90IGVudHJ5X2NvdW50LCBjaGFyICoqZW50cnlzKSB7CisgICAgdWludDMyX3QgaWR4OworICAgIGlmIChleHRfbGlzdC0+bGlzdCA9PSBOVUxMIHx8IGV4dF9saXN0LT5jYXBhY2l0eSA9PSAwKSB7CisgICAgICAgIFZrUmVzdWx0IHJlcyA9IGxvYWRlcl9pbml0X2dlbmVyaWNfbGlzdChpbnN0LCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKilleHRfbGlzdCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfZGV2X2V4dF9wcm9wcykpOworICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsb29rIGZvciBkdXBsaWNhdGVzCisgICAgaWYgKGhhc192a19kZXZfZXh0X3Byb3BlcnR5KHByb3BzLCBleHRfbGlzdCkpIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWR4ID0gZXh0X2xpc3QtPmNvdW50OworICAgIC8vIGFkZCB0byBsaXN0IGF0IGVuZAorICAgIC8vIGNoZWNrIGZvciBlbm91Z2ggY2FwYWNpdHkKKyAgICBpZiAoaWR4ICogc2l6ZW9mKHN0cnVjdCBsb2FkZXJfZGV2X2V4dF9wcm9wcykgPj0gZXh0X2xpc3QtPmNhcGFjaXR5KSB7CisgICAgICAgIHZvaWQgKm5ld19wdHIgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9yZWFsbG9jKGluc3QsIGV4dF9saXN0LT5saXN0LCBleHRfbGlzdC0+Y2FwYWNpdHksIGV4dF9saXN0LT5jYXBhY2l0eSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKworICAgICAgICBpZiAoTlVMTCA9PSBuZXdfcHRyKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2FkZF90b19kZXZfZXh0X2xpc3Q6IEZhaWxlZCB0byByZWFsbG9jYXRlIHNwYWNlIGZvciBkZXZpY2UgZXh0ZW5zaW9uIGxpc3QiKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgZXh0X2xpc3QtPmxpc3QgPSBuZXdfcHRyOworCisgICAgICAgIC8vIGRvdWJsZSBjYXBhY2l0eQorICAgICAgICBleHRfbGlzdC0+Y2FwYWNpdHkgKj0gMjsKKyAgICB9CisKKyAgICBtZW1jcHkoJmV4dF9saXN0LT5saXN0W2lkeF0ucHJvcHMsIHByb3BzLCBzaXplb2YoKnByb3BzKSk7CisgICAgZXh0X2xpc3QtPmxpc3RbaWR4XS5lbnRyeXBvaW50X2NvdW50ID0gZW50cnlfY291bnQ7CisgICAgaWYgKGVudHJ5X2NvdW50ID09IDApIHsKKyAgICAgICAgZXh0X2xpc3QtPmxpc3RbaWR4XS5lbnRyeXBvaW50cyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXh0X2xpc3QtPmxpc3RbaWR4XS5lbnRyeXBvaW50cyA9CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBzaXplb2YoY2hhciAqKSAqIGVudHJ5X2NvdW50LCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgICAgIGlmIChleHRfbGlzdC0+bGlzdFtpZHhdLmVudHJ5cG9pbnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJfYWRkX3RvX2Rldl9leHRfbGlzdDogRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZvciBkZXZpY2UgZXh0ZW5zaW9uIGVudHJ5cG9pbnQgbGlzdCBpbiBsaXN0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWR4KTsKKyAgICAgICAgICAgIGV4dF9saXN0LT5saXN0W2lkeF0uZW50cnlwb2ludF9jb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbnRyeV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBleHRfbGlzdC0+bGlzdFtpZHhdLmVudHJ5cG9pbnRzW2ldID0KKyAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBzdHJsZW4oZW50cnlzW2ldKSArIDEsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgICAgIGlmIChleHRfbGlzdC0+bGlzdFtpZHhdLmVudHJ5cG9pbnRzW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgZXh0X2xpc3QtPmxpc3RbaWR4XS5lbnRyeXBvaW50c1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgZXh0X2xpc3QtPmxpc3RbaWR4XS5lbnRyeXBvaW50cyk7CisgICAgICAgICAgICAgICAgZXh0X2xpc3QtPmxpc3RbaWR4XS5lbnRyeXBvaW50X2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBleHRfbGlzdC0+bGlzdFtpZHhdLmVudHJ5cG9pbnRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9hZGRfdG9fZGV2X2V4dF9saXN0OiBGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBkZXZpY2UgZXh0ZW5zaW9uIGVudHJ5cG9pbnQgJWQgbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY3B5KGV4dF9saXN0LT5saXN0W2lkeF0uZW50cnlwb2ludHNbaV0sIGVudHJ5c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZXh0X2xpc3QtPmNvdW50Kys7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworLy8gUHJvdG90eXBlcyBuZWVkZWQuCitib29sIGxvYWRlckFkZE1ldGFMYXllcihjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKnByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKnRhcmdldF9saXN0LCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmV4cGFuZGVkX3RhcmdldF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpzb3VyY2VfbGlzdCk7CisKKy8vIE1hbmFnZSBsaXN0cyBvZiBWa0xheWVyUHJvcGVydGllcworc3RhdGljIGJvb2wgbG9hZGVySW5pdExheWVyTGlzdChjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmxpc3QpIHsKKyAgICBsaXN0LT5jYXBhY2l0eSA9IDMyICogc2l6ZW9mKHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyk7CisgICAgbGlzdC0+bGlzdCA9IGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIGxpc3QtPmNhcGFjaXR5LCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgaWYgKGxpc3QtPmxpc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbXNldChsaXN0LT5saXN0LCAwLCBsaXN0LT5jYXBhY2l0eSk7CisgICAgbGlzdC0+Y291bnQgPSAwOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBTZWFyY2ggdGhlIGdpdmVuIGxheWVyIGxpc3QgZm9yIGEgbGlzdCBtYXRjaGluZyB0aGUgZ2l2ZW4gVmtMYXllclByb3BlcnRpZXMKK2Jvb2wgbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoY29uc3QgVmtMYXllclByb3BlcnRpZXMgKnZrX2xheWVyX3Byb3AsIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqbGlzdCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsaXN0LT5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAodmtfbGF5ZXJfcHJvcC0+bGF5ZXJOYW1lLCBsaXN0LT5saXN0W2ldLmluZm8ubGF5ZXJOYW1lKSA9PSAwKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGxvYWRlckRlc3Ryb3lMYXllckxpc3QoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmxheWVyX2xpc3QpIHsKKyAgICBpZiAoZGV2aWNlKSB7CisgICAgICAgIGxvYWRlcl9kZXZpY2VfaGVhcF9mcmVlKGRldmljZSwgbGF5ZXJfbGlzdC0+bGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBsYXllcl9saXN0LT5saXN0KTsKKyAgICB9CisgICAgbGF5ZXJfbGlzdC0+Y291bnQgPSAwOworICAgIGxheWVyX2xpc3QtPmNhcGFjaXR5ID0gMDsKK30KKworLy8gQXBwZW5kIG5vbi1kdXBsaWNhdGUgbGF5ZXIgcHJvcGVydGllcyBkZWZpbmVkIGluIHByb3BfbGlzdCB0byB0aGUgZ2l2ZW4gbGF5ZXJfaW5mbyBsaXN0CitWa1Jlc3VsdCBsb2FkZXJBZGRMYXllclByb3BlcnRpZXNUb0xpc3QoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByb3BfbGlzdF9jb3VudCwgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wcykgeworICAgIHVpbnQzMl90IGk7CisgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpsYXllcjsKKworICAgIGlmIChsaXN0LT5saXN0ID09IE5VTEwgfHwgbGlzdC0+Y2FwYWNpdHkgPT0gMCkgeworICAgICAgICBpZiAoIWxvYWRlckluaXRMYXllckxpc3QoaW5zdCwgbGlzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGlzdC0+bGlzdCA9PSBOVUxMKSByZXR1cm4gVktfU1VDQ0VTUzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wX2xpc3RfY291bnQ7IGkrKykgeworICAgICAgICBsYXllciA9IChzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKikmcHJvcHNbaV07CisKKyAgICAgICAgLy8gTG9vayBmb3IgZHVwbGljYXRlcywgYW5kIHNraXAKKyAgICAgICAgaWYgKGxvYWRlckxpc3RIYXNMYXllclByb3BlcnR5KCZsYXllci0+aW5mbywgbGlzdCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGVub3VnaCBjYXBhY2l0eQorICAgICAgICBpZiAoKChsaXN0LT5jb3VudCArIDEpICogc2l6ZW9mKHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcykpID49IGxpc3QtPmNhcGFjaXR5KSB7CisgICAgICAgICAgICBzaXplX3QgbmV3X2NhcGFjaXR5ID0gbGlzdC0+Y2FwYWNpdHkgKiAyOworICAgICAgICAgICAgdm9pZCAqbmV3X3B0ciA9CisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfcmVhbGxvYyhpbnN0LCBsaXN0LT5saXN0LCBsaXN0LT5jYXBhY2l0eSwgbmV3X2NhcGFjaXR5LCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgICAgICAgICBpZiAoTlVMTCA9PSBuZXdfcHRyKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJBZGRMYXllclByb3BlcnRpZXNUb0xpc3Q6IFJlYWxsb2MgZmFpbGVkIGZvciB3aGVuIGF0dGVtcHRpbmcgdG8gYWRkIG5ldyBsYXllciIpOworICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0LT5saXN0ID0gbmV3X3B0cjsKKyAgICAgICAgICAgIGxpc3QtPmNhcGFjaXR5ID0gbmV3X2NhcGFjaXR5OworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCZsaXN0LT5saXN0W2xpc3QtPmNvdW50XSwgbGF5ZXIsIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgbGlzdC0+Y291bnQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworLy8gU2VhcmNoIHRoZSBnaXZlbiBzZWFyY2hfbGlzdCBmb3IgYW55IGxheWVycyBpbiB0aGUgcHJvcHMgbGlzdC4gIEFkZCB0aGVzZSB0byB0aGUKKy8vIG91dHB1dCBsYXllcl9saXN0LiAgRG9uJ3QgYWRkIGR1cGxpY2F0ZXMgdG8gdGhlIG91dHB1dCBsYXllcl9saXN0Lgorc3RhdGljIFZrUmVzdWx0IGxvYWRlckFkZExheWVyTmFtZXNUb0xpc3QoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpvdXRwdXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqZXhwYW5kZWRfb3V0cHV0X2xpc3QsIHVpbnQzMl90IG5hbWVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAqbmFtZXMsIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqc291cmNlX2xpc3QpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKmxheWVyX3Byb3A7CisgICAgVmtSZXN1bHQgZXJyID0gVktfU1VDQ0VTUzsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuYW1lX2NvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqc291cmNlX25hbWUgPSBuYW1lc1tpXTsKKyAgICAgICAgbGF5ZXJfcHJvcCA9IGxvYWRlckZpbmRMYXllclByb3BlcnR5KHNvdXJjZV9uYW1lLCBzb3VyY2VfbGlzdCk7CisgICAgICAgIGlmIChOVUxMID09IGxheWVyX3Byb3ApIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsICJsb2FkZXJBZGRMYXllck5hbWVzVG9MaXN0OiBVbmFibGUgdG8gZmluZCBsYXllciAlcyIsIHNvdXJjZV9uYW1lKTsKKyAgICAgICAgICAgIGVyciA9IFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBub3QgYSBtZXRhLWxheWVyLCBzaW1wbHkgYWRkIGl0LgorICAgICAgICBpZiAoMCA9PSAobGF5ZXJfcHJvcC0+dHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19NRVRBX0xBWUVSKSkgeworICAgICAgICAgICAgaWYgKCFsb2FkZXJMaXN0SGFzTGF5ZXJQcm9wZXJ0eSgmbGF5ZXJfcHJvcC0+aW5mbywgb3V0cHV0X2xpc3QpKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyQWRkTGF5ZXJQcm9wZXJ0aWVzVG9MaXN0KGluc3QsIG91dHB1dF9saXN0LCAxLCBsYXllcl9wcm9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJmxheWVyX3Byb3AtPmluZm8sIGV4cGFuZGVkX291dHB1dF9saXN0KSkgeworICAgICAgICAgICAgICAgIGxvYWRlckFkZExheWVyUHJvcGVydGllc1RvTGlzdChpbnN0LCBleHBhbmRlZF9vdXRwdXRfbGlzdCwgMSwgbGF5ZXJfcHJvcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWxvYWRlckxpc3RIYXNMYXllclByb3BlcnR5KCZsYXllcl9wcm9wLT5pbmZvLCBvdXRwdXRfbGlzdCkgfHwKKyAgICAgICAgICAgICAgICAhbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJmxheWVyX3Byb3AtPmluZm8sIGV4cGFuZGVkX291dHB1dF9saXN0KSkgeworICAgICAgICAgICAgICAgIGxvYWRlckFkZE1ldGFMYXllcihpbnN0LCBsYXllcl9wcm9wLCBvdXRwdXRfbGlzdCwgZXhwYW5kZWRfb3V0cHV0X2xpc3QsIHNvdXJjZV9saXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrRXhwaXJhdGlvbihjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKnByb3ApIHsKKyAgICB0aW1lX3QgY3VycmVudCA9IHRpbWUoTlVMTCk7CisgICAgc3RydWN0IHRtIHRtX2N1cnJlbnQgPSAqbG9jYWx0aW1lKCZjdXJyZW50KTsKKworICAgIHN0cnVjdCB0bSB0bV9leHBpcmF0aW9uID0geworICAgICAgICAudG1fc2VjID0gMCwKKyAgICAgICAgLnRtX21pbiA9IHByb3AtPmV4cGlyYXRpb24ubWludXRlLAorICAgICAgICAudG1faG91ciA9IHByb3AtPmV4cGlyYXRpb24uaG91ciwKKyAgICAgICAgLnRtX21kYXkgPSBwcm9wLT5leHBpcmF0aW9uLmRheSwKKyAgICAgICAgLnRtX21vbiA9IHByb3AtPmV4cGlyYXRpb24ubW9udGggLSAxLAorICAgICAgICAudG1feWVhciA9IHByb3AtPmV4cGlyYXRpb24ueWVhciAtIDE5MDAsCisgICAgICAgIC50bV9pc2RzdCA9IHRtX2N1cnJlbnQudG1faXNkc3QsCisgICAgICAgIC8vIHdkYXkgYW5kIHlkYXkgYXJlIGlnbm9yZWQgYnkgbWt0aW1lCisgICAgfTsKKyAgICB0aW1lX3QgZXhwaXJhdGlvbiA9IG1rdGltZSgmdG1fZXhwaXJhdGlvbik7CisKKyAgICByZXR1cm4gY3VycmVudCA8IGV4cGlyYXRpb247Cit9CisKKy8vIERldGVybWluZSBpZiB0aGUgcHJvdmlkZWQgaW1wbGljaXQgbGF5ZXIgc2hvdWxkIGJlIGVuYWJsZWQgYnkgcXVlcnlpbmcgdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50YWwgdmFyaWFibGVzLgorLy8gRm9yIGFuIGltcGxpY2l0IGxheWVyLCBhdCBsZWFzdCBhIGRpc2FibGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQuCitib29sIGxvYWRlckltcGxpY2l0TGF5ZXJJc0VuYWJsZWQoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wKSB7CisgICAgYm9vbCBlbmFibGUgPSBmYWxzZTsKKyAgICBjaGFyICplbnZfdmFsdWUgPSBOVUxMOworCisgICAgLy8gSWYgbm8gZW5hYmxlX2Vudmlyb25tZW50IHZhcmlhYmxlIGlzIHNwZWNpZmllZCwgdGhpcyBpbXBsaWNpdCBsYXllciBpcyBhbHdheXMgYmUgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgIGlmIChwcm9wLT5lbmFibGVfZW52X3Zhci5uYW1lWzBdID09IDApIHsKKyAgICAgICAgZW5hYmxlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIG9ubHkgZW5hYmxlIHRoaXMgbGF5ZXIgaWYgdGhlIGVuYWJsZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBkZWZpbmVkCisgICAgICAgIGVudl92YWx1ZSA9IGxvYWRlcl9nZXRlbnYocHJvcC0+ZW5hYmxlX2Vudl92YXIubmFtZSwgaW5zdCk7CisgICAgICAgIGlmIChlbnZfdmFsdWUgJiYgIXN0cmNtcChwcm9wLT5lbmFibGVfZW52X3Zhci52YWx1ZSwgZW52X3ZhbHVlKSkgeworICAgICAgICAgICAgZW5hYmxlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBsb2FkZXJfZnJlZV9nZXRlbnYoZW52X3ZhbHVlLCBpbnN0KTsKKyAgICB9CisKKyAgICAvLyBUaGUgZGlzYWJsZV9lbnZpcm9ubWVudCBoYXMgcHJpb3JpdHkgb3ZlciBldmVyeXRoaW5nIGVsc2UuICBJZiBpdCBpcyBkZWZpbmVkLCB0aGUgbGF5ZXIgaXMgYWx3YXlzCisgICAgLy8gZGlzYWJsZWQuCisgICAgZW52X3ZhbHVlID0gbG9hZGVyX2dldGVudihwcm9wLT5kaXNhYmxlX2Vudl92YXIubmFtZSwgaW5zdCk7CisgICAgaWYgKGVudl92YWx1ZSkgeworICAgICAgICBlbmFibGUgPSBmYWxzZTsKKyAgICB9CisgICAgbG9hZGVyX2ZyZWVfZ2V0ZW52KGVudl92YWx1ZSwgaW5zdCk7CisKKyAgICAvLyBJZiB0aGlzIGxheWVyIGhhcyBhbiBleHBpcmF0aW9uLCBjaGVjayBpdCB0byBkZXRlcm1pbmUgaWYgdGhpcyBsYXllciBoYXMgZXhwaXJlZC4KKyAgICBpZiAocHJvcC0+aGFzX2V4cGlyYXRpb24pIHsKKyAgICAgICAgZW5hYmxlID0gY2hlY2tFeHBpcmF0aW9uKGluc3QsIHByb3ApOworICAgIH0KKworICAgIC8vIEVuYWJsZSB0aGlzIGxheWVyIGlmIGl0IGlzIGluY2x1ZGVkIGluIHRoZSBvdmVycmlkZSBsYXllcgorICAgIGlmIChpbnN0ICE9IE5VTEwgJiYgaW5zdC0+b3ZlcnJpZGVfbGF5ZXJfcHJlc2VudCkgeworICAgICAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKm92ZXJyaWRlID0gTlVMTDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluc3QtPmluc3RhbmNlX2xheWVyX2xpc3QuY291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmNtcChpbnN0LT5pbnN0YW5jZV9sYXllcl9saXN0Lmxpc3RbaV0uaW5mby5sYXllck5hbWUsIFZLX09WRVJSSURFX0xBWUVSX05BTUUpID09IDApIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZSA9ICZpbnN0LT5pbnN0YW5jZV9sYXllcl9saXN0Lmxpc3RbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG92ZXJyaWRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBvdmVycmlkZS0+bnVtX2NvbXBvbmVudF9sYXllcnM7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAob3ZlcnJpZGUtPmNvbXBvbmVudF9sYXllcl9uYW1lc1tpXSwgcHJvcC0+aW5mby5sYXllck5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVuYWJsZTsKK30KKworLy8gQ2hlY2sgdGhlIGluZGl2aWR1YWwgaW1wbGljaXQgbGF5ZXIgZm9yIHRoZSBlbmFibGUvZGlzYWJsZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXR0aW5ncy4gIE9ubHkgYWRkIGl0IGFmdGVyCisvLyBldmVyeSBjaGVjayBoYXMgcGFzc2VkIGluZGljYXRpbmcgaXQgc2hvdWxkIGJlIHVzZWQuCitzdGF0aWMgdm9pZCBsb2FkZXJBZGRJbXBsaWNpdExheWVyKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICp0YXJnZXRfbGlzdCwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpleHBhbmRlZF90YXJnZXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpzb3VyY2VfbGlzdCkgeworICAgIGJvb2wgZW5hYmxlID0gbG9hZGVySW1wbGljaXRMYXllcklzRW5hYmxlZChpbnN0LCBwcm9wKTsKKworICAgIC8vIElmIHRoZSBpbXBsaWNpdCBsYXllciBpcyBzdXBwb3NlZCB0byBiZSBlbmFibGUsIG1ha2Ugc3VyZSB0aGUgbGF5ZXIgc3VwcG9ydHMgYXQgbGVhc3QgdGhlIHNhbWUgQVBJIHZlcnNpb24KKyAgICAvLyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBhc2tpbmcgKGkuZS4gbGF5ZXIncyBBUEkgPj0gYXBwJ3MgQVBJKS4gIElmIGl0J3Mgbm90LCBkaXNhYmxlIHRoaXMgbGF5ZXIuCisgICAgaWYgKGVuYWJsZSkgeworICAgICAgICB1aW50MTZfdCBsYXllcl9hcGlfbWFqb3JfdmVyc2lvbiA9IFZLX1ZFUlNJT05fTUFKT1IocHJvcC0+aW5mby5zcGVjVmVyc2lvbik7CisgICAgICAgIHVpbnQxNl90IGxheWVyX2FwaV9taW5vcl92ZXJzaW9uID0gVktfVkVSU0lPTl9NSU5PUihwcm9wLT5pbmZvLnNwZWNWZXJzaW9uKTsKKyAgICAgICAgaWYgKGluc3QtPmFwcF9hcGlfbWFqb3JfdmVyc2lvbiA+IGxheWVyX2FwaV9tYWpvcl92ZXJzaW9uIHx8CisgICAgICAgICAgICAoaW5zdC0+YXBwX2FwaV9tYWpvcl92ZXJzaW9uID09IGxheWVyX2FwaV9tYWpvcl92ZXJzaW9uICYmIGluc3QtPmFwcF9hcGlfbWlub3JfdmVyc2lvbiA+IGxheWVyX2FwaV9taW5vcl92ZXJzaW9uKSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9hZGRfaW1wbGljaXRfbGF5ZXI6IERpc2FibGluZyBpbXBsaWNpdCBsYXllciAlcyBmb3IgdXNpbmcgYW4gb2xkIEFQSSB2ZXJzaW9uICVkLiVkIHZlcnN1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbiByZXF1ZXN0ZWQgJWQuJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5pbmZvLmxheWVyTmFtZSwgbGF5ZXJfYXBpX21ham9yX3ZlcnNpb24sIGxheWVyX2FwaV9taW5vcl92ZXJzaW9uLCBpbnN0LT5hcHBfYXBpX21ham9yX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPmFwcF9hcGlfbWlub3JfdmVyc2lvbik7CisgICAgICAgICAgICBlbmFibGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgaWYgKDAgPT0gKHByb3AtPnR5cGVfZmxhZ3MgJiBWS19MQVlFUl9UWVBFX0ZMQUdfTUVUQV9MQVlFUikpIHsKKyAgICAgICAgICAgIGlmICghbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJnByb3AtPmluZm8sIHRhcmdldF9saXN0KSkgeworICAgICAgICAgICAgICAgIGxvYWRlckFkZExheWVyUHJvcGVydGllc1RvTGlzdChpbnN0LCB0YXJnZXRfbGlzdCwgMSwgcHJvcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBleHBhbmRlZF90YXJnZXRfbGlzdCAmJiAhbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJnByb3AtPmluZm8sIGV4cGFuZGVkX3RhcmdldF9saXN0KSkgeworICAgICAgICAgICAgICAgIGxvYWRlckFkZExheWVyUHJvcGVydGllc1RvTGlzdChpbnN0LCBleHBhbmRlZF90YXJnZXRfbGlzdCwgMSwgcHJvcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWxvYWRlckxpc3RIYXNMYXllclByb3BlcnR5KCZwcm9wLT5pbmZvLCB0YXJnZXRfbGlzdCkgfHwKKyAgICAgICAgICAgICAgICAoTlVMTCAhPSBleHBhbmRlZF90YXJnZXRfbGlzdCAmJiAhbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJnByb3AtPmluZm8sIGV4cGFuZGVkX3RhcmdldF9saXN0KSkpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJBZGRNZXRhTGF5ZXIoaW5zdCwgcHJvcCwgdGFyZ2V0X2xpc3QsIGV4cGFuZGVkX3RhcmdldF9saXN0LCBzb3VyY2VfbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEFkZCB0aGUgY29tcG9uZW50IGxheWVycyBvZiBhIG1ldGEtbGF5ZXIgdG8gdGhlIGFjdGl2ZSBsaXN0IG9mIGxheWVycworYm9vbCBsb2FkZXJBZGRNZXRhTGF5ZXIoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICp0YXJnZXRfbGlzdCwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpleHBhbmRlZF90YXJnZXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqc291cmNlX2xpc3QpIHsKKyAgICBib29sIGZvdW5kID0gdHJ1ZTsKKworICAgIC8vIElmIHRoZSBtZXRhLWxheWVyIGlzbid0IHByZXNlbnQgaW4gdGhlIHVuZXhwYW5kZWQgbGlzdCwgYWRkIGl0LgorICAgIGlmICghbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJnByb3AtPmluZm8sIHRhcmdldF9saXN0KSkgeworICAgICAgICBsb2FkZXJBZGRMYXllclByb3BlcnRpZXNUb0xpc3QoaW5zdCwgdGFyZ2V0X2xpc3QsIDEsIHByb3ApOworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gYWRkIGFsbCB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnQgbGF5ZXJzCisgICAgZm9yICh1aW50MzJfdCBjb21wX2xheWVyID0gMDsgY29tcF9sYXllciA8IHByb3AtPm51bV9jb21wb25lbnRfbGF5ZXJzOyBjb21wX2xheWVyKyspIHsKKyAgICAgICAgYm9vbCBmb3VuZF9jb21wID0gZmFsc2U7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqc2VhcmNoX3Byb3AgPQorICAgICAgICAgICAgbG9hZGVyRmluZExheWVyUHJvcGVydHkocHJvcC0+Y29tcG9uZW50X2xheWVyX25hbWVzW2NvbXBfbGF5ZXJdLCBzb3VyY2VfbGlzdCk7CisgICAgICAgIGlmIChzZWFyY2hfcHJvcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3VuZF9jb21wID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGNvbXBvbmVudCBsYXllciBpcyBpdHNlbGYgYW4gaW1wbGljaXQgbGF5ZXIsIHdlIG5lZWQgdG8gZG8gdGhlIGltcGxpY2l0IGxheWVyIGVuYWJsZQorICAgICAgICAgICAgLy8gY2hlY2tzCisgICAgICAgICAgICBpZiAoMCA9PSAoc2VhcmNoX3Byb3AtPnR5cGVfZmxhZ3MgJiBWS19MQVlFUl9UWVBFX0ZMQUdfRVhQTElDSVRfTEFZRVIpKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyQWRkSW1wbGljaXRMYXllcihpbnN0LCBzZWFyY2hfcHJvcCwgdGFyZ2V0X2xpc3QsIGV4cGFuZGVkX3RhcmdldF9saXN0LCBzb3VyY2VfbGlzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgwICE9IChzZWFyY2hfcHJvcC0+dHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19NRVRBX0xBWUVSKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGxvYWRlckFkZE1ldGFMYXllcihpbnN0LCBzZWFyY2hfcHJvcCwgdGFyZ2V0X2xpc3QsIGV4cGFuZGVkX3RhcmdldF9saXN0LCBzb3VyY2VfbGlzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBqdXN0IG1ha2Ugc3VyZSBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIGVpdGhlciBsaXN0IGJlZm9yZSB3ZSBhZGQgaXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2FkZXJMaXN0SGFzTGF5ZXJQcm9wZXJ0eSgmc2VhcmNoX3Byb3AtPmluZm8sIHRhcmdldF9saXN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyQWRkTGF5ZXJQcm9wZXJ0aWVzVG9MaXN0KGluc3QsIHRhcmdldF9saXN0LCAxLCBzZWFyY2hfcHJvcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gZXhwYW5kZWRfdGFyZ2V0X2xpc3QgJiYgIWxvYWRlckxpc3RIYXNMYXllclByb3BlcnR5KCZzZWFyY2hfcHJvcC0+aW5mbywgZXhwYW5kZWRfdGFyZ2V0X2xpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJBZGRMYXllclByb3BlcnRpZXNUb0xpc3QoaW5zdCwgZXhwYW5kZWRfdGFyZ2V0X2xpc3QsIDEsIHNlYXJjaF9wcm9wKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kX2NvbXApIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlckFkZE1ldGFMYXllcjogRmFpbGVkIHRvIGZpbmQgbGF5ZXIgbmFtZSAlcyBjb21wb25lbnQgbGF5ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAiJXMgdG8gYWN0aXZhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfcHJvcC0+aW5mby5sYXllck5hbWUsIHByb3AtPmNvbXBvbmVudF9sYXllcl9uYW1lc1tjb21wX2xheWVyXSk7CisgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWRkIHRoaXMgbGF5ZXIgdG8gdGhlIG92ZXJhbGwgdGFyZ2V0IGxpc3QgKG5vdCB0aGUgZXhwYW5kZWQgb25lKQorICAgIGlmIChmb3VuZCAmJiAhbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJnByb3AtPmluZm8sIHRhcmdldF9saXN0KSkgeworICAgICAgICBsb2FkZXJBZGRMYXllclByb3BlcnRpZXNUb0xpc3QoaW5zdCwgdGFyZ2V0X2xpc3QsIDEsIHByb3ApOworICAgIH0KKworICAgIHJldHVybiBmb3VuZDsKK30KKworLy8gU2VhcmNoIHRoZSBzb3VyY2VfbGlzdCBmb3IgYW55IGxheWVyIHdpdGggYSBuYW1lIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSBhbmQgYSB0eXBlCisvLyB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHR5cGUuICBBZGQgYWxsIG1hdGNoaW5nIGxheWVycyB0byB0aGUgdGFyZ2V0X2xpc3QuCisvLyBEbyBub3QgYWRkIGlmIGZvdW5kIGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzIGlzIGFscmVhZHkgb24gdGhlIHRhcmdldF9saXN0Lgordm9pZCBsb2FkZXJBZGRMYXllck5hbWVUb0xpc3QoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZW51bSBsYXllcl90eXBlX2ZsYWdzIHR5cGVfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKnNvdXJjZV9saXN0LCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKnRhcmdldF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpleHBhbmRlZF90YXJnZXRfbGlzdCkgeworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc291cmNlX2xpc3QtPmNvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpzb3VyY2VfcHJvcCA9ICZzb3VyY2VfbGlzdC0+bGlzdFtpXTsKKyAgICAgICAgaWYgKDAgPT0gc3RyY21wKHNvdXJjZV9wcm9wLT5pbmZvLmxheWVyTmFtZSwgbmFtZSkgJiYgKHNvdXJjZV9wcm9wLT50eXBlX2ZsYWdzICYgdHlwZV9mbGFncykgPT0gdHlwZV9mbGFncykgeworICAgICAgICAgICAgLy8gSWYgbm90IGEgbWV0YS1sYXllciwgc2ltcGx5IGFkZCBpdC4KKyAgICAgICAgICAgIGlmICgwID09IChzb3VyY2VfcHJvcC0+dHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19NRVRBX0xBWUVSKSkgeworICAgICAgICAgICAgICAgIGlmICghbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJnNvdXJjZV9wcm9wLT5pbmZvLCB0YXJnZXRfbGlzdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgVktfU1VDQ0VTUyA9PSBsb2FkZXJBZGRMYXllclByb3BlcnRpZXNUb0xpc3QoaW5zdCwgdGFyZ2V0X2xpc3QsIDEsIHNvdXJjZV9wcm9wKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbG9hZGVyTGlzdEhhc0xheWVyUHJvcGVydHkoJnNvdXJjZV9wcm9wLT5pbmZvLCBleHBhbmRlZF90YXJnZXRfbGlzdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgVktfU1VDQ0VTUyA9PSBsb2FkZXJBZGRMYXllclByb3BlcnRpZXNUb0xpc3QoaW5zdCwgZXhwYW5kZWRfdGFyZ2V0X2xpc3QsIDEsIHNvdXJjZV9wcm9wKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IGxvYWRlckFkZE1ldGFMYXllcihpbnN0LCBzb3VyY2VfcHJvcCwgdGFyZ2V0X2xpc3QsIGV4cGFuZGVkX3RhcmdldF9saXN0LCBzb3VyY2VfbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsICJsb2FkZXJBZGRMYXllck5hbWVUb0xpc3Q6IEZhaWxlZCB0byBmaW5kIGxheWVyIG5hbWUgJXMgdG8gYWN0aXZhdGUiLAorICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIH0KK30KKworc3RhdGljIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqZ2V0X2V4dGVuc2lvbl9wcm9wZXJ0eShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2V4dGVuc2lvbl9saXN0ICpsaXN0KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxpc3QtPmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBsaXN0LT5saXN0W2ldLmV4dGVuc2lvbk5hbWUpID09IDApIHJldHVybiAmbGlzdC0+bGlzdFtpXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBWa0V4dGVuc2lvblByb3BlcnRpZXMgKmdldF9kZXZfZXh0ZW5zaW9uX3Byb3BlcnR5KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBsb2FkZXJfZGV2aWNlX2V4dGVuc2lvbl9saXN0ICpsaXN0KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxpc3QtPmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBsaXN0LT5saXN0W2ldLnByb3BzLmV4dGVuc2lvbk5hbWUpID09IDApIHJldHVybiAmbGlzdC0+bGlzdFtpXS5wcm9wczsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEZvciBJbnN0YW5jZSBleHRlbnNpb25zIGltcGxlbWVudGVkIHdpdGhpbiB0aGUgbG9hZGVyIChpLmUuIERFQlVHX1JFUE9SVAorLy8gdGhlIGV4dGVuc2lvbiBtdXN0IHByb3ZpZGUgdHdvIGVudHJ5IHBvaW50cyBmb3IgdGhlIGxvYWRlciB0byB1c2U6CisvLyAtICJ0cmFtcG9saW5lIiBlbnRyeSBwb2ludCAtIHRoaXMgaXMgdGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkgR2V0UHJvY0FkZHIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdpbGwgYWx3YXlzIGRvIHdoYXQncyBuZWNlc3NhcnkgdG8gc3VwcG9ydCBhCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBjYWxsLgorLy8gLSAidGVybWluYXRvciIgZnVuY3Rpb24gICAgLSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcHV0IGF0IHRoZSBlbmQgb2YgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGNoYWluIGFuZCB3aWxsIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBsb2dpYworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjYWxsIC8gcHJvY2VzcyB0aGUgZXh0ZW5zaW9uIGZvciB0aGUgYXBwcm9wcmlhdGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNEcyB0aGF0IGFyZSBhdmFpbGFibGUuCisvLyBUaGVyZSBpcyBubyBnZW5lcmljIG1lY2hhbmlzbSBmb3IgaW5jbHVkaW5nIHRoZXNlIGZ1bmN0aW9ucywgdGhlIHJlZmVyZW5jZXMKKy8vIG11c3QgYmUgcGxhY2VkIGludG8gdGhlIGFwcHJvcHJpYXRlIGxvYWRlciBlbnRyeSBwb2ludHMuCisvLyBHZXRJbnN0YW5jZVByb2NBZGRyOiBjYWxsIGV4dGVuc2lvbiBHZXRJbnN0YW5jZVByb2NBZGRyIHRvIGNoZWNrIGZvciBHZXRQcm9jQWRkcgorLy8gcmVxdWVzdHMKKy8vIGxvYWRlcl9jb2FsZXNjZV9leHRlbnNpb25zKHZvaWQpIC0gYWRkIGV4dGVuc2lvbiByZWNvcmRzIHRvIHRoZSBsaXN0IG9mIGdsb2JhbAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gYXZhaWxhYmxlIHRvIHRoZSBhcHAuCisvLyBpbnN0YW5jZV9kaXNwICAgICAgICAgICAgICAgICAgICAtIGFkZCBmdW5jdGlvbiBwb2ludGVyIGZvciB0ZXJtaW5hdG9yIGZ1bmN0aW9uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoaXMgYXJyYXkuCisvLyBUaGUgZXh0ZW5zaW9uIGl0c2VsZiBzaG91bGQgYmUgaW4gYSBzZXBhcmF0ZSBmaWxlIHRoYXQgd2lsbCBiZSBsaW5rZWQgZGlyZWN0bHkKKy8vIHdpdGggdGhlIGxvYWRlci4KK1ZrUmVzdWx0IGxvYWRlcl9nZXRfaWNkX2xvYWRlcl9pbnN0YW5jZV9leHRlbnNpb25zKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfaWNkX3RyYW1wX2xpc3QgKmljZF90cmFtcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqaW5zdF9leHRzKSB7CisgICAgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCBpY2RfZXh0czsKKyAgICBWa1Jlc3VsdCByZXMgPSBWS19TVUNDRVNTOworICAgIGNoYXIgKmVudl92YWx1ZTsKKyAgICBib29sIGZpbHRlcl9leHRlbnNpb25zID0gdHJ1ZTsKKworICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQsIDAsICJCdWlsZCBJQ0QgaW5zdGFuY2UgZXh0ZW5zaW9uIGxpc3QiKTsKKworICAgIC8vIENoZWNrIGlmIGEgdXNlciB3YW50cyB0byBkaXNhYmxlIHRoZSBpbnN0YW5jZSBleHRlbnNpb24gZmlsdGVyaW5nIGJlaGF2aW9yCisgICAgZW52X3ZhbHVlID0gbG9hZGVyX2dldGVudigiVktfTE9BREVSX0RJU0FCTEVfSU5TVF9FWFRfRklMVEVSIiwgaW5zdCk7CisgICAgaWYgKE5VTEwgIT0gZW52X3ZhbHVlICYmIGF0b2koZW52X3ZhbHVlKSAhPSAwKSB7CisgICAgICAgIGZpbHRlcl9leHRlbnNpb25zID0gZmFsc2U7CisgICAgfQorICAgIGxvYWRlcl9mcmVlX2dldGVudihlbnZfdmFsdWUsIGluc3QpOworCisgICAgLy8gdHJhdmVyc2Ugc2Nhbm5lZCBpY2QgbGlzdCBhZGRpbmcgbm9uLWR1cGxpY2F0ZSBleHRlbnNpb25zIHRvIHRoZSBsaXN0CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGljZF90cmFtcF9saXN0LT5jb3VudDsgaSsrKSB7CisgICAgICAgIHJlcyA9IGxvYWRlcl9pbml0X2dlbmVyaWNfbGlzdChpbnN0LCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKikmaWNkX2V4dHMsIHNpemVvZihWa0V4dGVuc2lvblByb3BlcnRpZXMpKTsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBsb2FkZXJfYWRkX2luc3RhbmNlX2V4dGVuc2lvbnMoaW5zdCwgaWNkX3RyYW1wX2xpc3QtPnNjYW5uZWRfbGlzdFtpXS5FbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2RfdHJhbXBfbGlzdC0+c2Nhbm5lZF9saXN0W2ldLmxpYl9uYW1lLCAmaWNkX2V4dHMpOworICAgICAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXMpIHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJfZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgZXh0ZW5zaW9ucyBub3QgcmVjb2duaXplZCBieSB0aGUgbG9hZGVyCisgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgKGludDMyX3QpaWNkX2V4dHMuY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaWYgdGhlIGV4dGVuc2lvbiBpcyBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgayA9IDA7IExPQURFUl9JTlNUQU5DRV9FWFRFTlNJT05TW2tdICE9IE5VTEw7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChpY2RfZXh0cy5saXN0W2pdLmV4dGVuc2lvbk5hbWUsIExPQURFUl9JTlNUQU5DRV9FWFRFTlNJT05TW2tdKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXNuJ3QgaW4gdGhlIGxpc3QsIHJlbW92ZSBpdAorICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGsgPSBqICsgMTsgayA8IGljZF9leHRzLmNvdW50OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2RfZXh0cy5saXN0W2sgLSAxXSA9IGljZF9leHRzLmxpc3Rba107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAtLWljZF9leHRzLmNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgLS1qOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSBsb2FkZXJfYWRkX3RvX2V4dF9saXN0KGluc3QsIGluc3RfZXh0cywgaWNkX2V4dHMuY291bnQsIGljZF9leHRzLmxpc3QpOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9kZXN0cm95X2dlbmVyaWNfbGlzdChpbnN0LCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKikmaWNkX2V4dHMpOworICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIFRyYXZlcnNlIGxvYWRlcidzIGV4dGVuc2lvbnMsIGFkZGluZyBub24tZHVwbGljYXRlIGV4dGVuc2lvbnMgdG8gdGhlIGxpc3QKKyAgICBkZWJ1Z191dGlsc19BZGRJbnN0YW5jZUV4dGVuc2lvbnMoaW5zdCwgaW5zdF9leHRzKTsKKworb3V0OgorICAgIHJldHVybiByZXM7Cit9CisKK3N0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmxvYWRlcl9nZXRfaWNkX2FuZF9kZXZpY2UoY29uc3QgVmtEZXZpY2UgZGV2aWNlLCBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqKmZvdW5kX2RldiwgdWludDMyX3QgKmljZF9pbmRleCkgeworICAgICpmb3VuZF9kZXYgPSBOVUxMOworICAgIGZvciAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGxvYWRlci5pbnN0YW5jZXM7IGluc3Q7IGluc3QgPSBpbnN0LT5uZXh0KSB7CisgICAgICAgIHVpbnQzMl90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGluc3QtPmljZF90ZXJtczsgaWNkX3Rlcm07IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQpIHsKKyAgICAgICAgICAgIGZvciAoc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldiA9IGljZF90ZXJtLT5sb2dpY2FsX2RldmljZV9saXN0OyBkZXY7IGRldiA9IGRldi0+bmV4dCkKKyAgICAgICAgICAgICAgICAvLyBWYWx1ZSBjb21wYXJpc29uIG9mIGRldmljZSBwcmV2ZW50cyBvYmplY3Qgd3JhcHBpbmcgYnkgbGF5ZXJzCisgICAgICAgICAgICAgICAgaWYgKGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2LT5pY2RfZGV2aWNlKSA9PSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRldi0+Y2hhaW5fZGV2aWNlICE9IFZLX05VTExfSEFORExFICYmCisgICAgICAgICAgICAgICAgICAgICBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldi0+Y2hhaW5fZGV2aWNlKSA9PSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICpmb3VuZF9kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKmljZF9pbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpY2RfdGVybTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIGxvYWRlcl9kZXN0cm95X2xvZ2ljYWxfZGV2aWNlKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGlmIChwQWxsb2NhdG9yKSB7CisgICAgICAgIGRldi0+YWxsb2NfY2FsbGJhY2tzID0gKnBBbGxvY2F0b3I7CisgICAgfQorICAgIGlmIChOVUxMICE9IGRldi0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QubGlzdCkgeworICAgICAgICBsb2FkZXJEZWFjdGl2YXRlTGF5ZXJzKGluc3QsIGRldiwgJmRldi0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBkZXYtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5saXN0KSB7CisgICAgICAgIGxvYWRlckRlc3Ryb3lMYXllckxpc3QoaW5zdCwgZGV2LCAmZGV2LT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QpOworICAgIH0KKyAgICBsb2FkZXJfZGV2aWNlX2hlYXBfZnJlZShkZXYsIGRldik7Cit9CisKK3N0cnVjdCBsb2FkZXJfZGV2aWNlICpsb2FkZXJfY3JlYXRlX2xvZ2ljYWxfZGV2aWNlKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpuZXdfZGV2OworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgeworI2Vsc2UKKyAgICBpZiAocEFsbG9jYXRvcikgeworICAgICAgICBuZXdfZGV2ID0gKHN0cnVjdCBsb2FkZXJfZGV2aWNlICopcEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbihwQWxsb2NhdG9yLT5wVXNlckRhdGEsIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2RldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQgKiksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0RFVklDRSk7CisgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICBuZXdfZGV2ID0gKHN0cnVjdCBsb2FkZXJfZGV2aWNlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9hZGVyX2RldmljZSkpOworICAgIH0KKworICAgIGlmICghbmV3X2RldikgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJsb2FkZXJfY3JlYXRlX2xvZ2ljYWxfZGV2aWNlOiBGYWlsZWQgdG8gYWxsb2Mgc3RydWN0ICIKKyAgICAgICAgICAgICAgICAgICAibG9hZGVyX2RldmljZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQobmV3X2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfZGV2aWNlKSk7CisgICAgaWYgKHBBbGxvY2F0b3IpIHsKKyAgICAgICAgbmV3X2Rldi0+YWxsb2NfY2FsbGJhY2tzID0gKnBBbGxvY2F0b3I7CisgICAgfQorCisgICAgcmV0dXJuIG5ld19kZXY7Cit9CisKK3ZvaWQgbG9hZGVyX2FkZF9sb2dpY2FsX2RldmljZShjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSwgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldikgeworICAgIGRldi0+bmV4dCA9IGljZF90ZXJtLT5sb2dpY2FsX2RldmljZV9saXN0OworICAgIGljZF90ZXJtLT5sb2dpY2FsX2RldmljZV9saXN0ID0gZGV2OworfQorCit2b2lkIGxvYWRlcl9yZW1vdmVfbG9naWNhbF9kZXZpY2UoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmZvdW5kX2RldiwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldiwgKnByZXZfZGV2OworCisgICAgaWYgKCFpY2RfdGVybSB8fCAhZm91bmRfZGV2KSByZXR1cm47CisKKyAgICBwcmV2X2RldiA9IE5VTEw7CisgICAgZGV2ID0gaWNkX3Rlcm0tPmxvZ2ljYWxfZGV2aWNlX2xpc3Q7CisgICAgd2hpbGUgKGRldiAmJiBkZXYgIT0gZm91bmRfZGV2KSB7CisgICAgICAgIHByZXZfZGV2ID0gZGV2OworICAgICAgICBkZXYgPSBkZXYtPm5leHQ7CisgICAgfQorCisgICAgaWYgKHByZXZfZGV2KQorICAgICAgICBwcmV2X2Rldi0+bmV4dCA9IGZvdW5kX2Rldi0+bmV4dDsKKyAgICBlbHNlCisgICAgICAgIGljZF90ZXJtLT5sb2dpY2FsX2RldmljZV9saXN0ID0gZm91bmRfZGV2LT5uZXh0OworICAgIGxvYWRlcl9kZXN0cm95X2xvZ2ljYWxfZGV2aWNlKGluc3QsIGZvdW5kX2RldiwgcEFsbG9jYXRvcik7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRlcl9pY2RfZGVzdHJveShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdCwgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgcHRyX2luc3QtPnRvdGFsX2ljZF9jb3VudC0tOworICAgIGZvciAoc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldiA9IGljZF90ZXJtLT5sb2dpY2FsX2RldmljZV9saXN0OyBkZXY7KSB7CisgICAgICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpuZXh0X2RldiA9IGRldi0+bmV4dDsKKyAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfbG9naWNhbF9kZXZpY2UocHRyX2luc3QsIGRldiwgcEFsbG9jYXRvcik7CisgICAgICAgIGRldiA9IG5leHRfZGV2OworICAgIH0KKworICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3QsIGljZF90ZXJtKTsKK30KKworc3RhdGljIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmxvYWRlcl9pY2RfY3JlYXRlKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybTsKKworICAgIGljZF90ZXJtID0gbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0pLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgaWYgKCFpY2RfdGVybSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQoaWNkX3Rlcm0sIDAsIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtKSk7CisKKyAgICByZXR1cm4gaWNkX3Rlcm07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICpsb2FkZXJfaWNkX2FkZChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdCwgY29uc3Qgc3RydWN0IGxvYWRlcl9zY2FubmVkX2ljZCAqc2Nhbm5lZF9pY2QpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybTsKKworICAgIGljZF90ZXJtID0gbG9hZGVyX2ljZF9jcmVhdGUocHRyX2luc3QpOworICAgIGlmICghaWNkX3Rlcm0pIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkID0gc2Nhbm5lZF9pY2Q7CisgICAgaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UgPSBwdHJfaW5zdDsKKworICAgIC8vIFByZXBlbmQgdG8gdGhlIGxpc3QKKyAgICBpY2RfdGVybS0+bmV4dCA9IHB0cl9pbnN0LT5pY2RfdGVybXM7CisgICAgcHRyX2luc3QtPmljZF90ZXJtcyA9IGljZF90ZXJtOworICAgIHB0cl9pbnN0LT50b3RhbF9pY2RfY291bnQrKzsKKworICAgIHJldHVybiBpY2RfdGVybTsKK30KKworLy8gRGV0ZXJtaW5lIHRoZSBJQ0QgaW50ZXJmYWNlIHZlcnNpb24gdG8gdXNlLgorLy8gICAgIEBwYXJhbSBpY2QKKy8vICAgICBAcGFyYW0gcFZlcnNpb24gT3V0cHV0IHBhcmFtZXRlciBpbmRpY2F0aW5nIHdoaWNoIHZlcnNpb24gdG8gdXNlIG9yIDAgaWYKKy8vICAgICAgICAgICAgdGhlIG5lZ290aWF0aW9uIEFQSSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBJQ0QKKy8vICAgICBAcmV0dXJuICBib29sIGluZGljYXRpbmcgdHJ1ZSBpZiB0aGUgc2VsZWN0ZWQgaW50ZXJmYWNlIHZlcnNpb24gaXMgc3VwcG9ydGVkCisvLyAgICAgICAgICAgIGJ5IHRoZSBsb2FkZXIsIGZhbHNlIGluZGljYXRlcyB0aGUgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkCitib29sIGxvYWRlcl9nZXRfaWNkX2ludGVyZmFjZV92ZXJzaW9uKFBGTl92a05lZ290aWF0ZUxvYWRlcklDREludGVyZmFjZVZlcnNpb24gZnBfbmVnb3RpYXRlX2ljZF92ZXJzaW9uLCB1aW50MzJfdCAqcFZlcnNpb24pIHsKKyAgICBpZiAoZnBfbmVnb3RpYXRlX2ljZF92ZXJzaW9uID09IE5VTEwpIHsKKyAgICAgICAgLy8gSUNEIGRvZXMgbm90IHN1cHBvcnQgdGhlIG5lZ290aWF0aW9uIEFQSSwgaXQgc3VwcG9ydHMgdmVyc2lvbiAwIG9yIDEKKyAgICAgICAgLy8gY2FsbGluZyBjb2RlIG11c3QgZGV0ZXJtaW5lIGlmIGl0IGlzIHZlcnNpb24gMCBvciAxCisgICAgICAgICpwVmVyc2lvbiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSUNEIHN1cHBvcnRzIHRoZSBuZWdvdGlhdGlvbiBBUEksIHNvIGNhbGwgaXQgd2l0aCB0aGUgbG9hZGVyJ3MKKyAgICAgICAgLy8gbGF0ZXN0IHZlcnNpb24gc3VwcG9ydGVkCisgICAgICAgICpwVmVyc2lvbiA9IENVUlJFTlRfTE9BREVSX0lDRF9JTlRFUkZBQ0VfVkVSU0lPTjsKKyAgICAgICAgVmtSZXN1bHQgcmVzdWx0ID0gZnBfbmVnb3RpYXRlX2ljZF92ZXJzaW9uKHBWZXJzaW9uKTsKKworICAgICAgICBpZiAocmVzdWx0ID09IFZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVIpIHsKKyAgICAgICAgICAgIC8vIElDRCBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGxvYWRlcidzIGxhdGVzdCBpbnRlcmZhY2UgdmVyc2lvbiBzbworICAgICAgICAgICAgLy8gZmFpbCBsb2FkaW5nIHRoZSBJQ0QKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIE1JTl9TVVBQT1JURURfTE9BREVSX0lDRF9JTlRFUkZBQ0VfVkVSU0lPTiA+IDAKKyAgICBpZiAoKnBWZXJzaW9uIDwgTUlOX1NVUFBPUlRFRF9MT0FERVJfSUNEX0lOVEVSRkFDRV9WRVJTSU9OKSB7CisgICAgICAgIC8vIExvYWRlciBubyBsb25nZXIgc3VwcG9ydHMgdGhlIElDRCdzIGxhdGVzdCBpbnRlcmZhY2UgdmVyc2lvbiBzbyBmYWlsCisgICAgICAgIC8vIGxvYWRpbmcgdGhlIElDRAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgbG9hZGVyX3NjYW5uZWRfaWNkX2NsZWFyKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfaWNkX3RyYW1wX2xpc3QgKmljZF90cmFtcF9saXN0KSB7CisgICAgaWYgKDAgIT0gaWNkX3RyYW1wX2xpc3QtPmNhcGFjaXR5KSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpY2RfdHJhbXBfbGlzdC0+Y291bnQ7IGkrKykgeworICAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtX2Nsb3NlX2xpYnJhcnkoaWNkX3RyYW1wX2xpc3QtPnNjYW5uZWRfbGlzdFtpXS5oYW5kbGUpOworICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBpY2RfdHJhbXBfbGlzdC0+c2Nhbm5lZF9saXN0W2ldLmxpYl9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGljZF90cmFtcF9saXN0LT5zY2FubmVkX2xpc3QpOworICAgICAgICBpY2RfdHJhbXBfbGlzdC0+Y2FwYWNpdHkgPSAwOworICAgICAgICBpY2RfdHJhbXBfbGlzdC0+Y291bnQgPSAwOworICAgICAgICBpY2RfdHJhbXBfbGlzdC0+c2Nhbm5lZF9saXN0ID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBsb2FkZXJfc2Nhbm5lZF9pY2RfaW5pdChjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2ljZF90cmFtcF9saXN0ICppY2RfdHJhbXBfbGlzdCkgeworICAgIFZrUmVzdWx0IGVyciA9IFZLX1NVQ0NFU1M7CisgICAgbG9hZGVyX3NjYW5uZWRfaWNkX2NsZWFyKGluc3QsIGljZF90cmFtcF9saXN0KTsKKyAgICBpY2RfdHJhbXBfbGlzdC0+Y2FwYWNpdHkgPSA4ICogc2l6ZW9mKHN0cnVjdCBsb2FkZXJfc2Nhbm5lZF9pY2QpOworICAgIGljZF90cmFtcF9saXN0LT5zY2FubmVkX2xpc3QgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBpY2RfdHJhbXBfbGlzdC0+Y2FwYWNpdHksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICBpZiAoTlVMTCA9PSBpY2RfdHJhbXBfbGlzdC0+c2Nhbm5lZF9saXN0KSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgImxvYWRlcl9zY2FubmVkX2ljZF9pbml0OiBSZWFsbG9jIGZhaWxlZCBmb3IgbGF5ZXIgbGlzdCB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGluZyB0byBhZGQgbmV3IGxheWVyIik7CisgICAgICAgIGVyciA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIFZrUmVzdWx0IGxvYWRlcl9zY2FubmVkX2ljZF9hZGQoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9pY2RfdHJhbXBfbGlzdCAqaWNkX3RyYW1wX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgdWludDMyX3QgYXBpX3ZlcnNpb24pIHsKKyAgICBsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGhhbmRsZTsKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBmcF9jcmVhdGVfaW5zdDsKKyAgICBQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgZnBfZ2V0X2luc3RfZXh0X3Byb3BzOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBfZ2V0X3Byb2NfYWRkcjsKKyAgICBQRk5fR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciBmcF9nZXRfcGh5c19kZXZfcHJvY19hZGRyID0gTlVMTDsKKyAgICBQRk5fdmtOZWdvdGlhdGVMb2FkZXJJQ0RJbnRlcmZhY2VWZXJzaW9uIGZwX25lZ290aWF0ZV9pY2RfdmVyc2lvbjsKKyAgICBzdHJ1Y3QgbG9hZGVyX3NjYW5uZWRfaWNkICpuZXdfc2Nhbm5lZF9pY2Q7CisgICAgdWludDMyX3QgaW50ZXJmYWNlX3ZlcnM7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKworICAgIC8vIFRPRE8gaW1wbGVtZW50IHNtYXJ0ZXIgb3BlbmluZy9jbG9zaW5nIG9mIGxpYnJhcmllcy4gRm9yIG5vdyB0aGlzCisgICAgLy8gZnVuY3Rpb24gbGVhdmVzIGxpYnJhcmllcyBvcGVuIGFuZCB0aGUgc2Nhbm5lZF9pY2RfY2xlYXIgY2xvc2VzIHRoZW0KKyAgICBoYW5kbGUgPSBsb2FkZXJfcGxhdGZvcm1fb3Blbl9saWJyYXJ5KGZpbGVuYW1lKTsKKyAgICBpZiAoTlVMTCA9PSBoYW5kbGUpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwgbG9hZGVyX3BsYXRmb3JtX29wZW5fbGlicmFyeV9lcnJvcihmaWxlbmFtZSkpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBHZXQgYW5kIHNldHRsZSBvbiBhbiBJQ0QgaW50ZXJmYWNlIHZlcnNpb24KKyAgICBmcF9uZWdvdGlhdGVfaWNkX3ZlcnNpb24gPSBsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhoYW5kbGUsICJ2a19pY2ROZWdvdGlhdGVMb2FkZXJJQ0RJbnRlcmZhY2VWZXJzaW9uIik7CisKKyAgICBpZiAoIWxvYWRlcl9nZXRfaWNkX2ludGVyZmFjZV92ZXJzaW9uKGZwX25lZ290aWF0ZV9pY2RfdmVyc2lvbiwgJmludGVyZmFjZV92ZXJzKSkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJsb2FkZXJfc2Nhbm5lZF9pY2RfYWRkOiBJQ0QgJXMgZG9lc24ndCBzdXBwb3J0IGludGVyZmFjZSIKKyAgICAgICAgICAgICAgICAgICAiIHZlcnNpb24gY29tcGF0aWJsZSB3aXRoIGxvYWRlciwgc2tpcCB0aGlzIElDRC4iLAorICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZnBfZ2V0X3Byb2NfYWRkciA9IGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGhhbmRsZSwgInZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHIiKTsKKyAgICBpZiAoTlVMTCA9PSBmcF9nZXRfcHJvY19hZGRyKSB7CisgICAgICAgIGFzc2VydChpbnRlcmZhY2VfdmVycyA9PSAwKTsKKyAgICAgICAgLy8gVXNlIGRlcHJlY2F0ZWQgaW50ZXJmYWNlIGZyb20gdmVyc2lvbiAwCisgICAgICAgIGZwX2dldF9wcm9jX2FkZHIgPSBsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhoYW5kbGUsICJ2a0dldEluc3RhbmNlUHJvY0FkZHIiKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gZnBfZ2V0X3Byb2NfYWRkcikgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9zY2FubmVkX2ljZF9hZGQ6IEF0dGVtcHQgdG8gcmV0cmlldmUgZWl0aGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlwndmtHZXRJbnN0YW5jZVByb2NBZGRyXCcgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAiXCd2a19pY2RHZXRJbnN0YW5jZVByb2NBZGRyXCcgZnJvbSBJQ0QgJXMgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX3NjYW5uZWRfaWNkX2FkZDogVXNpbmcgZGVwcmVjYXRlZCBJQ0QgIgorICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIG9mIFwndmtHZXRJbnN0YW5jZVByb2NBZGRyXCcgaW5zdGVhZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICJcJ3ZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHJcJyBmb3IgSUNEICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIGZwX2NyZWF0ZV9pbnN0ID0gbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MoaGFuZGxlLCAidmtDcmVhdGVJbnN0YW5jZSIpOworICAgICAgICBpZiAoTlVMTCA9PSBmcF9jcmVhdGVfaW5zdCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9zY2FubmVkX2ljZF9hZGQ6ICBGYWlsZWQgcXVlcnlpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAiXCd2a0NyZWF0ZUluc3RhbmNlXCcgdmlhIGRsc3ltL2xvYWRsaWJyYXJ5IGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICJJQ0QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBmcF9nZXRfaW5zdF9leHRfcHJvcHMgPSBsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhoYW5kbGUsICJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyIpOworICAgICAgICBpZiAoTlVMTCA9PSBmcF9nZXRfaW5zdF9leHRfcHJvcHMpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJfc2Nhbm5lZF9pY2RfYWRkOiBDb3VsZCBub3QgZ2V0IFwndmtFbnVtZXJhdGUiCisgICAgICAgICAgICAgICAgICAgICAgICJJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNcJyB2aWEgZGxzeW0vbG9hZGxpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAiZm9yIElDRCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIG5ld2VyIGludGVyZmFjZSB2ZXJzaW9uIDEgb3IgbGF0ZXIKKyAgICAgICAgaWYgKGludGVyZmFjZV92ZXJzID09IDApIHsKKyAgICAgICAgICAgIGludGVyZmFjZV92ZXJzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZwX2NyZWF0ZV9pbnN0ID0gKFBGTl92a0NyZWF0ZUluc3RhbmNlKWZwX2dldF9wcm9jX2FkZHIoTlVMTCwgInZrQ3JlYXRlSW5zdGFuY2UiKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gZnBfY3JlYXRlX2luc3QpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJfc2Nhbm5lZF9pY2RfYWRkOiBDb3VsZCBub3QgZ2V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlwndmtDcmVhdGVJbnN0YW5jZVwnIHZpYSBcJ3ZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHJcJyIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgSUNEICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgZnBfZ2V0X2luc3RfZXh0X3Byb3BzID0KKyAgICAgICAgICAgIChQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMpZnBfZ2V0X3Byb2NfYWRkcihOVUxMLCAidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMiKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gZnBfZ2V0X2luc3RfZXh0X3Byb3BzKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX3NjYW5uZWRfaWNkX2FkZDogQ291bGQgbm90IGdldCBcJ3ZrRW51bWVyYXRlIgorICAgICAgICAgICAgICAgICAgICAgICAiSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzXCcgdmlhICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlwndmtfaWNkR2V0SW5zdGFuY2VQcm9jQWRkclwnIGZvciBJQ0QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBmcF9nZXRfcGh5c19kZXZfcHJvY19hZGRyID0gbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MoaGFuZGxlLCAidmtfaWNkR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciIpOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBlbm91Z2ggY2FwYWNpdHkKKyAgICBpZiAoKGljZF90cmFtcF9saXN0LT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgbG9hZGVyX3NjYW5uZWRfaWNkKSkgPj0gaWNkX3RyYW1wX2xpc3QtPmNhcGFjaXR5KSB7CisgICAgICAgIHZvaWQgKm5ld19wdHIgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9yZWFsbG9jKGluc3QsIGljZF90cmFtcF9saXN0LT5zY2FubmVkX2xpc3QsIGljZF90cmFtcF9saXN0LT5jYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNkX3RyYW1wX2xpc3QtPmNhcGFjaXR5ICogMiwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICBpZiAoTlVMTCA9PSBuZXdfcHRyKSB7CisgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX3NjYW5uZWRfaWNkX2FkZDogUmVhbGxvYyBmYWlsZWQgb24gaWNkIGxpYnJhcnkgbGlzdCBmb3IgSUNEICVzIiwgZmlsZW5hbWUpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaWNkX3RyYW1wX2xpc3QtPnNjYW5uZWRfbGlzdCA9IG5ld19wdHI7CisKKyAgICAgICAgLy8gZG91YmxlIGNhcGFjaXR5CisgICAgICAgIGljZF90cmFtcF9saXN0LT5jYXBhY2l0eSAqPSAyOworICAgIH0KKworICAgIG5ld19zY2FubmVkX2ljZCA9ICYoaWNkX3RyYW1wX2xpc3QtPnNjYW5uZWRfbGlzdFtpY2RfdHJhbXBfbGlzdC0+Y291bnRdKTsKKyAgICBuZXdfc2Nhbm5lZF9pY2QtPmhhbmRsZSA9IGhhbmRsZTsKKyAgICBuZXdfc2Nhbm5lZF9pY2QtPmFwaV92ZXJzaW9uID0gYXBpX3ZlcnNpb247CisgICAgbmV3X3NjYW5uZWRfaWNkLT5HZXRJbnN0YW5jZVByb2NBZGRyID0gZnBfZ2V0X3Byb2NfYWRkcjsKKyAgICBuZXdfc2Nhbm5lZF9pY2QtPkdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgPSBmcF9nZXRfcGh5c19kZXZfcHJvY19hZGRyOworICAgIG5ld19zY2FubmVkX2ljZC0+RW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzID0gZnBfZ2V0X2luc3RfZXh0X3Byb3BzOworICAgIG5ld19zY2FubmVkX2ljZC0+Q3JlYXRlSW5zdGFuY2UgPSBmcF9jcmVhdGVfaW5zdDsKKyAgICBuZXdfc2Nhbm5lZF9pY2QtPmludGVyZmFjZV92ZXJzaW9uID0gaW50ZXJmYWNlX3ZlcnM7CisKKyAgICBuZXdfc2Nhbm5lZF9pY2QtPmxpYl9uYW1lID0gKGNoYXIgKilsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBzdHJsZW4oZmlsZW5hbWUpICsgMSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgIGlmIChOVUxMID09IG5ld19zY2FubmVkX2ljZC0+bGliX25hbWUpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwgImxvYWRlcl9zY2FubmVkX2ljZF9hZGQ6IE91dCBvZiBtZW1vcnkgY2FuJ3QgYWRkIElDRCAlcyIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgc3RyY3B5KG5ld19zY2FubmVkX2ljZC0+bGliX25hbWUsIGZpbGVuYW1lKTsKKyAgICBpY2RfdHJhbXBfbGlzdC0+Y291bnQrKzsKKworb3V0OgorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgbG9hZGVyX2RlYnVnX2luaXQodm9pZCkgeworICAgIGNoYXIgKmVudiwgKm9yaWc7CisKKyAgICBpZiAoZ19sb2FkZXJfZGVidWcgPiAwKSByZXR1cm47CisKKyAgICBnX2xvYWRlcl9kZWJ1ZyA9IDA7CisKKyAgICAvLyBQYXJzZSBjb21tYS1zZXBhcmF0ZWQgZGVidWcgb3B0aW9ucworICAgIG9yaWcgPSBlbnYgPSBsb2FkZXJfZ2V0ZW52KCJWS19MT0FERVJfREVCVUciLCBOVUxMKTsKKyAgICB3aGlsZSAoZW52KSB7CisgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoZW52LCAnLCcpOworICAgICAgICBzaXplX3QgbGVuOworCisgICAgICAgIGlmIChwKQorICAgICAgICAgICAgbGVuID0gcCAtIGVudjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVuID0gc3RybGVuKGVudik7CisKKyAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGVudiwgImFsbCIsIGxlbikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdfbG9hZGVyX2RlYnVnID0gfjB1OworICAgICAgICAgICAgICAgIGdfbG9hZGVyX2xvZ19tc2dzID0gfjB1OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKGVudiwgIndhcm4iLCBsZW4pID09IDApIHsKKyAgICAgICAgICAgICAgICBnX2xvYWRlcl9kZWJ1ZyB8PSBMT0FERVJfV0FSTl9CSVQ7CisgICAgICAgICAgICAgICAgZ19sb2FkZXJfbG9nX21zZ3MgfD0gVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChlbnYsICJpbmZvIiwgbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ19sb2FkZXJfZGVidWcgfD0gTE9BREVSX0lORk9fQklUOworICAgICAgICAgICAgICAgIGdfbG9hZGVyX2xvZ19tc2dzIHw9IFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKGVudiwgInBlcmYiLCBsZW4pID09IDApIHsKKyAgICAgICAgICAgICAgICBnX2xvYWRlcl9kZWJ1ZyB8PSBMT0FERVJfUEVSRl9CSVQ7CisgICAgICAgICAgICAgICAgZ19sb2FkZXJfbG9nX21zZ3MgfD0gVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChlbnYsICJlcnJvciIsIGxlbikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdfbG9hZGVyX2RlYnVnIHw9IExPQURFUl9FUlJPUl9CSVQ7CisgICAgICAgICAgICAgICAgZ19sb2FkZXJfbG9nX21zZ3MgfD0gVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoZW52LCAiZGVidWciLCBsZW4pID09IDApIHsKKyAgICAgICAgICAgICAgICBnX2xvYWRlcl9kZWJ1ZyB8PSBMT0FERVJfREVCVUdfQklUOworICAgICAgICAgICAgICAgIGdfbG9hZGVyX2xvZ19tc2dzIHw9IFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwKSBicmVhazsKKworICAgICAgICBlbnYgPSBwICsgMTsKKyAgICB9CisKKyAgICBsb2FkZXJfZnJlZV9nZXRlbnYob3JpZywgTlVMTCk7Cit9CisKK3ZvaWQgbG9hZGVyX2luaXRpYWxpemUodm9pZCkgeworICAgIC8vIGluaXRpYWxpemUgbXV0ZXhzCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jcmVhdGVfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZV9tdXRleCgmbG9hZGVyX2pzb25fbG9jayk7CisKKyAgICAvLyBpbml0aWFsaXplIGxvZ2dpbmcKKyAgICBsb2FkZXJfZGVidWdfaW5pdCgpOworCisgICAgLy8gaW5pdGlhbCBjSlNPTiB0byB1c2UgYWxsb2MgY2FsbGJhY2tzCisgICAgY0pTT05fSG9va3MgYWxsb2NfZm5zID0geworICAgICAgICAubWFsbG9jX2ZuID0gbG9hZGVyX2luc3RhbmNlX3Rsc19oZWFwX2FsbG9jLCAuZnJlZV9mbiA9IGxvYWRlcl9pbnN0YW5jZV90bHNfaGVhcF9mcmVlLAorICAgIH07CisgICAgY0pTT05fSW5pdEhvb2tzKCZhbGxvY19mbnMpOworCisjaWYgZGVmaW5lZChfV0lOMzIpCisgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgbmV3ZXIgQVBJcyBhcmUgYXZhaWxhYmxlIHJpZ2h0IGF3YXkKKyAgICAvLyBhbmQgbm90IGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRoYXQgaGFzIGJlZW4gc3RhdGljYWxseSBsaW5rZWQKKyAgICBMb2FkTGlicmFyeSgiZ2RpMzIuZGxsIik7CisjZW5kaWYKK30KKworc3RydWN0IGxvYWRlcl9kYXRhX2ZpbGVzIHsKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICB1aW50MzJfdCBhbGxvY19jb3VudDsKKyAgICBjaGFyICoqZmlsZW5hbWVfbGlzdDsKK307CisKK3ZvaWQgbG9hZGVyX3JlbGVhc2UoKSB7CisgICAgLy8gcmVsZWFzZSBtdXRleHMKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2RlbGV0ZV9tdXRleCgmbG9hZGVyX2xvY2spOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfZGVsZXRlX211dGV4KCZsb2FkZXJfanNvbl9sb2NrKTsKK30KKworLy8gR2V0IG5leHQgZmlsZSBvciBkaXJuYW1lIGdpdmVuIGEgc3RyaW5nIGxpc3Qgb3IgcmVnaXN0cnkga2V5IHBhdGgKKy8vCisvLyBccmV0dXJucworLy8gQSBwb2ludGVyIHRvIGZpcnN0IGNoYXIgaW4gdGhlIG5leHQgcGF0aC4KKy8vIFRoZSBuZXh0IHBhdGggKG9yIE5VTEwpIGluIHRoZSBsaXN0IGlzIHJldHVybmVkIGluIG5leHRfcGF0aC4KKy8vIE5vdGU6IGlucHV0IHN0cmluZyBpcyBtb2RpZmllZCBpbiBzb21lIGNhc2VzLiBQQVNTIElOIEEgQ09QWSEKK3N0YXRpYyBjaGFyICpsb2FkZXJfZ2V0X25leHRfcGF0aChjaGFyICpwYXRoKSB7CisgICAgdWludDMyX3QgbGVuOworICAgIGNoYXIgKm5leHQ7CisKKyAgICBpZiAocGF0aCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBuZXh0ID0gc3RyY2hyKHBhdGgsIFBBVEhfU0VQQVJBVE9SKTsKKyAgICBpZiAobmV4dCA9PSBOVUxMKSB7CisgICAgICAgIGxlbiA9ICh1aW50MzJfdClzdHJsZW4ocGF0aCk7CisgICAgICAgIG5leHQgPSBwYXRoICsgbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgICpuZXh0ID0gJ1wwJzsKKyAgICAgICAgbmV4dCsrOworICAgIH0KKworICAgIHJldHVybiBuZXh0OworfQorCisvLyBHaXZlbiBhIHBhdGggd2hpY2ggaXMgYWJzb2x1dGUgb3IgcmVsYXRpdmUsIGV4cGFuZCB0aGUgcGF0aCBpZiByZWxhdGl2ZSBvcgorLy8gbGVhdmUgdGhlIHBhdGggdW5tb2RpZmllZCBpZiBhYnNvbHV0ZS4gVGhlIGJhc2UgcGF0aCB0byBwcmVwZW5kIHRvIHJlbGF0aXZlCisvLyBwYXRocyBpcyBnaXZlbiBpbiByZWxfYmFzZS4KKy8vCisvLyBAcmV0dXJuIC0gQSBzdHJpbmcgaW4gb3V0X2Z1bGxwYXRoIG9mIHRoZSBmdWxsIGFic29sdXRlIHBhdGgKK3N0YXRpYyB2b2lkIGxvYWRlcl9leHBhbmRfcGF0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpyZWxfYmFzZSwgc2l6ZV90IG91dF9zaXplLCBjaGFyICpvdXRfZnVsbHBhdGgpIHsKKyAgICBpZiAobG9hZGVyX3BsYXRmb3JtX2lzX3BhdGhfYWJzb2x1dGUocGF0aCkpIHsKKyAgICAgICAgLy8gZG8gbm90IHByZXBlbmQgYSBiYXNlIHRvIGFuIGFic29sdXRlIHBhdGgKKyAgICAgICAgcmVsX2Jhc2UgPSAiIjsKKyAgICB9CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fY29tYmluZV9wYXRoKG91dF9mdWxscGF0aCwgb3V0X3NpemUsIHJlbF9iYXNlLCBwYXRoLCBOVUxMKTsKK30KKworLy8gR2l2ZW4gYSBmaWxlbmFtZSAoZmlsZSkgIGFuZCBhIGxpc3Qgb2YgcGF0aHMgKGRpciksIHRyeSB0byBmaW5kIGFuIGV4aXN0aW5nCisvLyBmaWxlIGluIHRoZSBwYXRocy4gIElmIGZpbGVuYW1lIGFscmVhZHkgaXMgYSBwYXRoIHRoZW4gbm8gc2VhcmNoaW5nIGluIHRoZSBnaXZlbiBwYXRocy4KKy8vCisvLyBAcmV0dXJuIC0gQSBzdHJpbmcgaW4gb3V0X2Z1bGxwYXRoIG9mIGVpdGhlciB0aGUgZnVsbCBwYXRoIG9yIGZpbGUuCitzdGF0aWMgdm9pZCBsb2FkZXJfZ2V0X2Z1bGxwYXRoKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmRpcnMsIHNpemVfdCBvdXRfc2l6ZSwgY2hhciAqb3V0X2Z1bGxwYXRoKSB7CisgICAgaWYgKCFsb2FkZXJfcGxhdGZvcm1faXNfcGF0aChmaWxlKSAmJiAqZGlycykgeworICAgICAgICBjaGFyICpkaXJzX2NvcHksICpkaXIsICpuZXh0X2RpcjsKKworICAgICAgICBkaXJzX2NvcHkgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc3RybGVuKGRpcnMpICsgMSk7CisgICAgICAgIHN0cmNweShkaXJzX2NvcHksIGRpcnMpOworCisgICAgICAgIC8vIGZpbmQgaWYgZmlsZSBleGlzdHMgYWZ0ZXIgcHJlcGVuZGluZyBwYXRocyBpbiBnaXZlbiBsaXN0CisgICAgICAgIGZvciAoZGlyID0gZGlyc19jb3B5OyAqZGlyICYmIChuZXh0X2RpciA9IGxvYWRlcl9nZXRfbmV4dF9wYXRoKGRpcikpOyBkaXIgPSBuZXh0X2RpcikgeworICAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtX2NvbWJpbmVfcGF0aChvdXRfZnVsbHBhdGgsIG91dF9zaXplLCBkaXIsIGZpbGUsIE5VTEwpOworICAgICAgICAgICAgaWYgKGxvYWRlcl9wbGF0Zm9ybV9maWxlX2V4aXN0cyhvdXRfZnVsbHBhdGgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKHZvaWQpc25wcmludGYob3V0X2Z1bGxwYXRoLCBvdXRfc2l6ZSwgIiVzIiwgZmlsZSk7Cit9CisKKy8vIFJlYWQgYSBKU09OIGZpbGUgaW50byBhIGJ1ZmZlci4KKy8vCisvLyBAcmV0dXJuIC0gIEEgcG9pbnRlciB0byBhIGNKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIEpTT04gcGFyc2UgdHJlZS4KKy8vICAgICAgICAgICAgVGhpcyByZXR1cm5lZCBidWZmZXIgc2hvdWxkIGJlIGZyZWVkIGJ5IGNhbGxlci4KK3N0YXRpYyBWa1Jlc3VsdCBsb2FkZXJfZ2V0X2pzb24oY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNKU09OICoqanNvbikgeworICAgIEZJTEUgKmZpbGUgPSBOVUxMOworICAgIGNoYXIgKmpzb25fYnVmOworICAgIHNpemVfdCBsZW47CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKworICAgIGlmIChOVUxMID09IGpzb24pIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwgImxvYWRlcl9nZXRfanNvbjogUmVjZWl2ZWQgaW52YWxpZCBKU09OIGZpbGUiKTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAqanNvbiA9IE5VTEw7CisKKyAgICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOworICAgIGlmICghZmlsZSkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLCAibG9hZGVyX2dldF9qc29uOiBGYWlsZWQgdG8gb3BlbiBKU09OIGZpbGUgJXMiLCBmaWxlbmFtZSk7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGZzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKKyAgICBsZW4gPSBmdGVsbChmaWxlKTsKKyAgICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7CisgICAganNvbl9idWYgPSAoY2hhciAqKWxvYWRlcl9zdGFja19hbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAoanNvbl9idWYgPT0gTlVMTCkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJsb2FkZXJfZ2V0X2pzb246IEZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICJKU09OIGZpbGUgJXMgYnVmZmVyIG9mIGxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxlbik7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmIChmcmVhZChqc29uX2J1Ziwgc2l6ZW9mKGNoYXIpLCBsZW4sIGZpbGUpICE9IGxlbikgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLCAibG9hZGVyX2dldF9qc29uOiBGYWlsZWQgdG8gcmVhZCBKU09OIGZpbGUgJXMuIiwgZmlsZW5hbWUpOworICAgICAgICByZXMgPSBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBqc29uX2J1ZltsZW5dID0gJ1wwJzsKKworICAgIC8vIFBhcnNlIHRleHQgZnJvbSBmaWxlCisgICAgKmpzb24gPSBjSlNPTl9QYXJzZShqc29uX2J1Zik7CisgICAgaWYgKCpqc29uID09IE5VTEwpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAibG9hZGVyX2dldF9qc29uOiBGYWlsZWQgdG8gcGFyc2UgSlNPTiBmaWxlICVzLCAiCisgICAgICAgICAgICAgICAgICAgInRoaXMgaXMgdXN1YWxseSBiZWNhdXNlIHNvbWV0aGluZyByYW4gb3V0IG9mICIKKyAgICAgICAgICAgICAgICAgICAibWVtb3J5LiIsCisgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworb3V0OgorICAgIGlmIChOVUxMICE9IGZpbGUpIHsKKyAgICAgICAgZmNsb3NlKGZpbGUpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK2NvbnN0IGNoYXIgKnN0ZF92YWxpZGF0aW9uX3N0ciA9ICJWS19MQVlFUl9MVU5BUkdfc3RhbmRhcmRfdmFsaWRhdGlvbiI7CisKKy8vIEFkZHMgdGhlIGxlZ2FjeSBWS19MQVlFUl9MVU5BUkdfc3RhbmRhcmRfdmFsaWRhdGlvbiBhcyBhIG1ldGEtbGF5ZXIgaWYgaXQKKy8vIGZhaWxzIHRvIGZpbmQgaXQgaW4gdGhlIGxpc3QgYWxyZWFkeS4gIFRoaXMgaXMgdXN1YWxseSBhbiBpbmRpY2F0aW9uIHRoYXQgYQorLy8gbmV3ZXIgbG9hZGVyIGlzIGJlaW5nIHVzZWQgd2l0aCBhbiBvbGRlciBsYXllciBzZXQuCitzdGF0aWMgYm9vbCBsb2FkZXJBZGRMZWdhY3lTdGFuZGFyZFZhbGlkYXRpb25MYXllcihjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsYXllcl9pbnN0YW5jZV9saXN0KSB7CisgICAgdWludDMyX3QgaTsKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqcHJvcHMgPSBsb2FkZXJHZXROZXh0TGF5ZXJQcm9wZXJ0eVNsb3QoaW5zdCwgbGF5ZXJfaW5zdGFuY2VfbGlzdCk7CisgICAgY29uc3QgY2hhciBzdGRfdmFsaWRhdGlvbl9uYW1lc1s2XVtWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRV0gPSB7CisgICAgICAgICJWS19MQVlFUl9HT09HTEVfdGhyZWFkaW5nIiwgIlZLX0xBWUVSX0xVTkFSR19wYXJhbWV0ZXJfdmFsaWRhdGlvbiIsICJWS19MQVlFUl9MVU5BUkdfb2JqZWN0X3RyYWNrZXIiLAorICAgICAgICAiVktfTEFZRVJfTFVOQVJHX2NvcmVfdmFsaWRhdGlvbiIsICJWS19MQVlFUl9HT09HTEVfdW5pcXVlX29iamVjdHMifTsKKyAgICB1aW50MzJfdCBsYXllcl9jb3VudCA9IHNpemVvZihzdGRfdmFsaWRhdGlvbl9uYW1lcykgLyBzaXplb2Yoc3RkX3ZhbGlkYXRpb25fbmFtZXNbMF0pOworCisgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICJBZGRpbmcgVktfTEFZRVJfTFVOQVJHX3N0YW5kYXJkX3ZhbGlkYXRpb24gdXNpbmcgdGhlIGxvYWRlciBsZWdhY3kgcGF0aC4gIFRoaXMgaXMiCisgICAgICAgICAgICAgICAiIG5vdCBhbiBlcnJvci4iKTsKKworICAgIGlmIChOVUxMID09IHByb3BzKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIG1lbXNldChwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcykpOworICAgIHByb3BzLT50eXBlX2ZsYWdzID0gVktfTEFZRVJfVFlQRV9GTEFHX0lOU1RBTkNFX0xBWUVSIHwgVktfTEFZRVJfVFlQRV9GTEFHX0VYUExJQ0lUX0xBWUVSIHwgVktfTEFZRVJfVFlQRV9GTEFHX01FVEFfTEFZRVI7CisgICAgc3RybmNweShwcm9wcy0+aW5mby5kZXNjcmlwdGlvbiwgIkx1bmFyRyBTdGFuZGFyZCBWYWxpZGF0aW9uIExheWVyIiwgc2l6ZW9mKHByb3BzLT5pbmZvLmRlc2NyaXB0aW9uKSk7CisgICAgcHJvcHMtPmluZm8uaW1wbGVtZW50YXRpb25WZXJzaW9uID0gMTsKKyAgICBzdHJuY3B5KHByb3BzLT5pbmZvLmxheWVyTmFtZSwgc3RkX3ZhbGlkYXRpb25fc3RyLCBzaXplb2YocHJvcHMtPmluZm8ubGF5ZXJOYW1lKSk7CisgICAgcHJvcHMtPmluZm8uc3BlY1ZlcnNpb24gPSBWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pOworCisgICAgcHJvcHMtPmNvbXBvbmVudF9sYXllcl9uYW1lcyA9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIHNpemVvZihjaGFyW01BWF9TVFJJTkdfU0laRV0pICogbGF5ZXJfY291bnQsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICBpZiAoTlVMTCA9PSBwcm9wcy0+Y29tcG9uZW50X2xheWVyX25hbWVzKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgbGVnYWN5IFZLX0xBWUVSX0xVTkFSR19zdGFuZGFyZF92YWxpZGF0aW9uIgorICAgICAgICAgICAgICAgICAgICIgbWV0YS1sYXllciBjb21wb25lbnRfbGF5ZXJzIGluZm9ybWF0aW9uLiIpOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGF5ZXJfY291bnQ7IGkrKykgeworICAgICAgICBzdHJuY3B5KHByb3BzLT5jb21wb25lbnRfbGF5ZXJfbmFtZXNbaV0sIHN0ZF92YWxpZGF0aW9uX25hbWVzW2ldLCBNQVhfU1RSSU5HX1NJWkUgLSAxKTsKKyAgICAgICAgcHJvcHMtPmNvbXBvbmVudF9sYXllcl9uYW1lc1tpXVtNQVhfU1RSSU5HX1NJWkUgLSAxXSA9ICdcMCc7CisgICAgfQorCitvdXQ6CisKKyAgICBpZiAoIXN1Y2Nlc3MgJiYgTlVMTCAhPSBwcm9wcyAmJiBOVUxMICE9IHByb3BzLT5jb21wb25lbnRfbGF5ZXJfbmFtZXMpIHsKKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBwcm9wcy0+Y29tcG9uZW50X2xheWVyX25hbWVzKTsKKyAgICAgICAgcHJvcHMtPmNvbXBvbmVudF9sYXllcl9uYW1lcyA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8vIFZlcmlmeSB0aGF0IGFsbCBjb21wb25lbnQgbGF5ZXJzIGluIGEgbWV0YS1sYXllciBhcmUgdmFsaWQuCitzdGF0aWMgYm9vbCB2ZXJpZnlNZXRhTGF5ZXJDb21wb25lbnRMYXllcnMoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqaW5zdGFuY2VfbGF5ZXJzKSB7CisgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKyAgICBjb25zdCB1aW50MzJfdCBleHBlY3RlZF9tYWpvciA9IFZLX1ZFUlNJT05fTUFKT1IocHJvcC0+aW5mby5zcGVjVmVyc2lvbik7CisgICAgY29uc3QgdWludDMyX3QgZXhwZWN0ZWRfbWlub3IgPSBWS19WRVJTSU9OX01JTk9SKHByb3AtPmluZm8uc3BlY1ZlcnNpb24pOworCisgICAgZm9yICh1aW50MzJfdCBjb21wX2xheWVyID0gMDsgY29tcF9sYXllciA8IHByb3AtPm51bV9jb21wb25lbnRfbGF5ZXJzOyBjb21wX2xheWVyKyspIHsKKyAgICAgICAgaWYgKCFsb2FkZXJGaW5kTGF5ZXJOYW1lSW5MaXN0KHByb3AtPmNvbXBvbmVudF9sYXllcl9uYW1lc1tjb21wX2xheWVyXSwgaW5zdGFuY2VfbGF5ZXJzKSkgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gaW5zdCkgeworICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlNZXRhTGF5ZXJDb21wb25lbnRMYXllcnM6IE1ldGEtbGF5ZXIgJXMgY2FuJ3QgZmluZCBjb21wb25lbnQgbGF5ZXIgJXMgYXQgaW5kZXggJWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgU2tpcHBpbmcgdGhpcyBsYXllci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aW5mby5sYXllck5hbWUsIHByb3AtPmNvbXBvbmVudF9sYXllcl9uYW1lc1tjb21wX2xheWVyXSwgY29tcF9sYXllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqY29tcF9wcm9wID0KKyAgICAgICAgICAgICAgICBsb2FkZXJGaW5kTGF5ZXJQcm9wZXJ0eShwcm9wLT5jb21wb25lbnRfbGF5ZXJfbmFtZXNbY29tcF9sYXllcl0sIGluc3RhbmNlX2xheWVycyk7CisgICAgICAgICAgICBpZiAoY29tcF9wcm9wID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBpbnN0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyaWZ5TWV0YUxheWVyQ29tcG9uZW50TGF5ZXJzOiBNZXRhLWxheWVyICVzIGNhbid0IGZpbmQgcHJvcGVydHkgZm9yIGNvbXBvbmVudCBsYXllciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGF0IGluZGV4ICVkLiAgU2tpcHBpbmcgdGhpcyBsYXllci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPmluZm8ubGF5ZXJOYW1lLCBwcm9wLT5jb21wb25lbnRfbGF5ZXJfbmFtZXNbY29tcF9sYXllcl0sIGNvbXBfbGF5ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoZSB2ZXJzaW9uIG9mIGVhY2ggbGF5ZXIsIHRoZXkgbmVlZCB0byBhdCBsZWFzdCBtYXRjaCBNQUpPUiBhbmQgTUlOT1IKKyAgICAgICAgICAgIHVpbnQzMl90IGN1cl9tYWpvciA9IFZLX1ZFUlNJT05fTUFKT1IoY29tcF9wcm9wLT5pbmZvLnNwZWNWZXJzaW9uKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGN1cl9taW5vciA9IFZLX1ZFUlNJT05fTUlOT1IoY29tcF9wcm9wLT5pbmZvLnNwZWNWZXJzaW9uKTsKKyAgICAgICAgICAgIGlmIChjdXJfbWFqb3IgIT0gZXhwZWN0ZWRfbWFqb3IgfHwgY3VyX21pbm9yICE9IGV4cGVjdGVkX21pbm9yKSB7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gaW5zdCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeU1ldGFMYXllckNvbXBvbmVudExheWVyczogTWV0YS1sYXllciB1c2VzIEFQSSB2ZXJzaW9uICVkLiVkLCBidXQgY29tcG9uZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF5ZXIgJWQgdXNlcyBBUEkgdmVyc2lvbiAlZC4lZC4gIFNraXBwaW5nIHRoaXMgbGF5ZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9tYWpvciwgZXhwZWN0ZWRfbWlub3IsIGNvbXBfbGF5ZXIsIGN1cl9tYWpvciwgY3VyX21pbm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGxheWVyIGlzbid0IHVzaW5nIGl0J3Mgb3duIG5hbWUKKyAgICAgICAgICAgIGlmICghc3RyY21wKHByb3AtPmluZm8ubGF5ZXJOYW1lLCBwcm9wLT5jb21wb25lbnRfbGF5ZXJfbmFtZXNbY29tcF9sYXllcl0pKSB7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gaW5zdCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeU1ldGFMYXllckNvbXBvbmVudExheWVyczogTWV0YS1sYXllciAlcyBsaXN0cyBpdHNlbGYgaW4gaXRzIGNvbXBvbmVudCBsYXllciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgYXQgaW5kZXggJWQuICBTa2lwcGluZyB0aGlzIGxheWVyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aW5mby5sYXllck5hbWUsIGNvbXBfbGF5ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tcF9wcm9wLT50eXBlX2ZsYWdzICYgVktfTEFZRVJfVFlQRV9GTEFHX01FVEFfTEFZRVIpIHsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBpbnN0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeU1ldGFMYXllckNvbXBvbmVudExheWVyczogQWRkaW5nIG1ldGEtbGF5ZXIgJXMgd2hpY2ggYWxzbyBjb250YWlucyBtZXRhLWxheWVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5pbmZvLmxheWVyTmFtZSwgY29tcF9wcm9wLT5pbmZvLmxheWVyTmFtZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGlmIHRoZSBsYXllciBpcyB1c2luZyBhIG1ldGEtbGF5ZXIgaW4gaXRzIGNvbXBvbmVudCBsaXN0IHRoYXQgd2UgYWxzbyB2ZXJpZnkgdGhhdC4KKyAgICAgICAgICAgICAgICBpZiAoIXZlcmlmeU1ldGFMYXllckNvbXBvbmVudExheWVycyhpbnN0LCBjb21wX3Byb3AsIGluc3RhbmNlX2xheWVycykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gaW5zdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0YS1sYXllciAlcyBjb21wb25lbnQgbGF5ZXIgJXMgY2FuIG5vdCBmaW5kIGFsbCBjb21wb25lbnQgbGF5ZXJzLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgU2tpcHBpbmcgdGhpcyBsYXllci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5pbmZvLmxheWVyTmFtZSwgcHJvcC0+Y29tcG9uZW50X2xheWVyX25hbWVzW2NvbXBfbGF5ZXJdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGFueSBpbnN0YW5jZSBhbmQgZGV2aWNlIGV4dGVuc2lvbnMgZnJvbSBjb21wb25lbnQgbGF5ZXJzIHRvIHRoaXMgbGF5ZXIKKyAgICAgICAgICAgIC8vIGxpc3QsIHNvIHRoYXQgYW55b25lIHF1ZXJ5aW5nIGV4dGVuc2lvbnMgd2lsbCBvbmx5IG5lZWQgdG8gbG9vayBhdCB0aGUgbWV0YS1sYXllcgorICAgICAgICAgICAgZm9yICh1aW50MzJfdCBleHQgPSAwOyBleHQgPCBjb21wX3Byb3AtPmluc3RhbmNlX2V4dGVuc2lvbl9saXN0LmNvdW50OyBleHQrKykgeworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGluc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0YS1sYXllciAlcyBjb21wb25lbnQgbGF5ZXIgJXMgYWRkaW5nIGluc3RhbmNlIGV4dGVuc2lvbiAlcyIsIHByb3AtPmluZm8ubGF5ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPmNvbXBvbmVudF9sYXllcl9uYW1lc1tjb21wX2xheWVyXSwgY29tcF9wcm9wLT5pbnN0YW5jZV9leHRlbnNpb25fbGlzdC5saXN0W2V4dF0uZXh0ZW5zaW9uTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghaGFzX3ZrX2V4dGVuc2lvbl9wcm9wZXJ0eSgmY29tcF9wcm9wLT5pbnN0YW5jZV9leHRlbnNpb25fbGlzdC5saXN0W2V4dF0sICZwcm9wLT5pbnN0YW5jZV9leHRlbnNpb25fbGlzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2FkZF90b19leHRfbGlzdChpbnN0LCAmcHJvcC0+aW5zdGFuY2VfZXh0ZW5zaW9uX2xpc3QsIDEsICZjb21wX3Byb3AtPmluc3RhbmNlX2V4dGVuc2lvbl9saXN0Lmxpc3RbZXh0XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGV4dCA9IDA7IGV4dCA8IGNvbXBfcHJvcC0+ZGV2aWNlX2V4dGVuc2lvbl9saXN0LmNvdW50OyBleHQrKykgeworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGluc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0YS1sYXllciAlcyBjb21wb25lbnQgbGF5ZXIgJXMgYWRkaW5nIGRldmljZSBleHRlbnNpb24gJXMiLCBwcm9wLT5pbmZvLmxheWVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5jb21wb25lbnRfbGF5ZXJfbmFtZXNbY29tcF9sYXllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9wcm9wLT5kZXZpY2VfZXh0ZW5zaW9uX2xpc3QubGlzdFtleHRdLnByb3BzLmV4dGVuc2lvbk5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWhhc192a19kZXZfZXh0X3Byb3BlcnR5KCZjb21wX3Byb3AtPmRldmljZV9leHRlbnNpb25fbGlzdC5saXN0W2V4dF0ucHJvcHMsICZwcm9wLT5kZXZpY2VfZXh0ZW5zaW9uX2xpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9hZGRfdG9fZGV2X2V4dF9saXN0KGluc3QsICZwcm9wLT5kZXZpY2VfZXh0ZW5zaW9uX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wX3Byb3AtPmRldmljZV9leHRlbnNpb25fbGlzdC5saXN0W2V4dF0ucHJvcHMsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLCAiTWV0YS1sYXllciAlcyBhbGwgJWQgY29tcG9uZW50IGxheWVycyBhcHBlYXIgdG8gYmUgdmFsaWQuIiwKKyAgICAgICAgICAgICAgICAgICBwcm9wLT5pbmZvLmxheWVyTmFtZSwgcHJvcC0+bnVtX2NvbXBvbmVudF9sYXllcnMpOworICAgIH0KKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworLy8gVmVyaWZ5IHRoYXQgYWxsIG1ldGEtbGF5ZXJzIGluIGEgbGF5ZXIgbGlzdCBhcmUgdmFsaWQuCitzdGF0aWMgdm9pZCBWZXJpZnlBbGxNZXRhTGF5ZXJzKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqaW5zdGFuY2VfbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpvdmVycmlkZV9sYXllcl9wcmVzZW50KSB7CisgICAgKm92ZXJyaWRlX2xheWVyX3ByZXNlbnQgPSBmYWxzZTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaW50MzJfdClpbnN0YW5jZV9sYXllcnMtPmNvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wID0gJmluc3RhbmNlX2xheWVycy0+bGlzdFtpXTsKKworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbWV0YS1sYXllciwgbWFrZSBzdXJlIGl0IGlzIHZhbGlkCisgICAgICAgIGlmICgocHJvcC0+dHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19NRVRBX0xBWUVSKSAmJiAhdmVyaWZ5TWV0YUxheWVyQ29tcG9uZW50TGF5ZXJzKGluc3QsIHByb3AsIGluc3RhbmNlX2xheWVycykpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGluc3QpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbW92aW5nIG1ldGEtbGF5ZXIgJXMgZnJvbSBpbnN0YW5jZSBsYXllciBsaXN0IHNpbmNlIGl0IGFwcGVhcnMgaW52YWxpZC4iLCBwcm9wLT5pbmZvLmxheWVyTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgY29tcG9uZW50IGxheWVycworICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBwcm9wLT5jb21wb25lbnRfbGF5ZXJfbmFtZXMpOworICAgICAgICAgICAgaWYgKHByb3AtPmJsYWNrbGlzdF9sYXllcl9uYW1lcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBwcm9wLT5ibGFja2xpc3RfbGF5ZXJfbmFtZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGN1cnJlbnQgaW52YWxpZCBtZXRhLWxheWVyIGZyb20gdGhlIGxheWVyIGxpc3QuICBVc2UgbWVtbW92ZSBzaW5jZSB3ZSBhcmUKKyAgICAgICAgICAgIC8vIG92ZXJsYXBwaW5nIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3Nlcy4KKyAgICAgICAgICAgIG1lbW1vdmUoJmluc3RhbmNlX2xheWVycy0+bGlzdFtpXSwgJmluc3RhbmNlX2xheWVycy0+bGlzdFtpICsgMV0sCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMpICogKGluc3RhbmNlX2xheWVycy0+Y291bnQgLSAxIC0gaSkpOworCisgICAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIGNvdW50IChiZWNhdXNlIHdlIG5vdyBoYXZlIG9uZSBsZXNzKSBhbmQgZGVjcmVtZW50IHRoZSBsb29wIGluZGV4IHNpbmNlIHdlIG5lZWQgdG8KKyAgICAgICAgICAgIC8vIHJlLWNoZWNrIHRoaXMgaW5kZXguCisgICAgICAgICAgICBpbnN0YW5jZV9sYXllcnMtPmNvdW50LS07CisgICAgICAgICAgICBpLS07CisgICAgICAgIH0gZWxzZSBpZiAocHJvcC0+aXNfb3ZlcnJpZGUgJiYgbG9hZGVySW1wbGljaXRMYXllcklzRW5hYmxlZChpbnN0LCBwcm9wKSkgeworICAgICAgICAgICAgKm92ZXJyaWRlX2xheWVyX3ByZXNlbnQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBqc29uIGZpbGUgdmVyc2lvbgorLy8gaW4gYSBtb3JlIG1hbmFnZWFibGUgd2F5LgordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IG1ham9yOworICAgIHVpbnQxNl90IG1pbm9yOworICAgIHVpbnQxNl90IHBhdGNoOworfSBsYXllcl9qc29uX3ZlcnNpb247CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBsYXllcl9qc29uX3N1cHBvcnRzX3ByZV9pbnN0YW5jZV90YWcoY29uc3QgbGF5ZXJfanNvbl92ZXJzaW9uICpsYXllcl9qc29uKSB7CisgICAgLy8gU3VwcG9ydGVkIHZlcnNpb25zIHN0YXJ0ZWQgaW4gMS4xLjIsIHNvIGFueXRoaW5nIG5ld2VyCisgICAgcmV0dXJuIGxheWVyX2pzb24tPm1ham9yID4gMSB8fCBsYXllcl9qc29uLT5taW5vciA+IDEgfHwgKGxheWVyX2pzb24tPm1pbm9yID09IDEgJiYgbGF5ZXJfanNvbi0+cGF0Y2ggPiAxKTsKK30KKworc3RhdGljIFZrUmVzdWx0IGxvYWRlclJlYWRMYXllckpzb24oY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsYXllcl9pbnN0YW5jZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0pTT04gKmxheWVyX25vZGUsIGxheWVyX2pzb25fdmVyc2lvbiB2ZXJzaW9uLCBjSlNPTiAqaXRlbSwgY0pTT04gKmRpc2FibGVfZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ltcGxpY2l0LCBjaGFyICpmaWxlbmFtZSkgeworICAgIGNoYXIgKnRlbXA7CisgICAgY2hhciAqbmFtZSwgKnR5cGUsICpsaWJyYXJ5X3BhdGhfc3RyLCAqYXBpX3ZlcnNpb247CisgICAgY2hhciAqaW1wbGVtZW50YXRpb25fdmVyc2lvbiwgKmRlc2NyaXB0aW9uOworICAgIGNKU09OICpleHRfaXRlbTsKKyAgICBjSlNPTiAqbGlicmFyeV9wYXRoOworICAgIGNKU09OICpjb21wb25lbnRfbGF5ZXJzOworICAgIGNKU09OICpvdmVycmlkZV9wYXRoczsKKyAgICBjSlNPTiAqYmxhY2tsaXN0ZWRfbGF5ZXJzOworICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyBleHRfcHJvcDsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wcyA9IE5VTEw7CisgICAgaW50IGksIGo7CisKKy8vIFRoZSBmb2xsb3dpbmcgYXJlIHJlcXVpcmVkIGluIHRoZSAibGF5ZXIiIG9iamVjdDoKKy8vIChyZXF1aXJlZCkgIm5hbWUiCisvLyAocmVxdWlyZWQpICJ0eXBlIgorLy8gKHJlcXVpcmVkKSAibGlicmFyeV9wYXRoIgorLy8gKHJlcXVpcmVkKSAiYXBpX3ZlcnNpb24iCisvLyAocmVxdWlyZWQpICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIgorLy8gKHJlcXVpcmVkKSAiZGVzY3JpcHRpb24iCisvLyAocmVxdWlyZWQgZm9yIGltcGxpY2l0IGxheWVycykgImRpc2FibGVfZW52aXJvbm1lbnQiCisjZGVmaW5lIEdFVF9KU09OX09CSkVDVChub2RlLCB2YXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhciA9IGNKU09OX0dldE9iamVjdEl0ZW0obm9kZSwgI3Zhcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh2YXIgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsYXllcl9ub2RlID0gbGF5ZXJfbm9kZS0+bmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICJEaWRuJ3QgZmluZCByZXF1aXJlZCBsYXllciBvYmplY3QgJXMgaW4gbWFuaWZlc3QgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICJKU09OIGZpbGUsIHNraXBwaW5nIHRoaXMgbGF5ZXIiLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICN2YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnb3RvIG91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2RlZmluZSBHRVRfSlNPTl9JVEVNKG5vZGUsIHZhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGl0ZW0gPSBjSlNPTl9HZXRPYmplY3RJdGVtKG5vZGUsICN2YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxheWVyX25vZGUgPSBsYXllcl9ub2RlLT5uZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAiRGlkbid0IGZpbmQgcmVxdWlyZWQgbGF5ZXIgdmFsdWUgJXMgaW4gbWFuaWZlc3QgSlNPTiAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgImZpbGUsIHNraXBwaW5nIHRoaXMgbGF5ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICN2YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXAgPSBjSlNPTl9QcmludChpdGVtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxheWVyX25vZGUgPSBsYXllcl9ub2RlLT5uZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAiUHJvYmxlbSBhY2Nlc3NpbmcgbGF5ZXIgdmFsdWUgJXMgaW4gbWFuaWZlc3QgSlNPTiAiICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgImZpbGUsIHNraXBwaW5nIHRoaXMgbGF5ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICN2YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdvdG8gb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wW3N0cmxlbih0ZW1wKSAtIDFdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmFyID0gbG9hZGVyX3N0YWNrX2FsbG9jKHN0cmxlbih0ZW1wKSArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweSh2YXIsICZ0ZW1wWzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjSlNPTl9GcmVlKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgR0VUX0pTT05fSVRFTShsYXllcl9ub2RlLCBuYW1lKQorICAgIEdFVF9KU09OX0lURU0obGF5ZXJfbm9kZSwgdHlwZSkKKyAgICBHRVRfSlNPTl9JVEVNKGxheWVyX25vZGUsIGFwaV92ZXJzaW9uKQorICAgIEdFVF9KU09OX0lURU0obGF5ZXJfbm9kZSwgaW1wbGVtZW50YXRpb25fdmVyc2lvbikKKyAgICBHRVRfSlNPTl9JVEVNKGxheWVyX25vZGUsIGRlc2NyaXB0aW9uKQorCisgICAgLy8gQWRkIGxpc3QgZW50cnkKKyAgICBpZiAoIXN0cmNtcCh0eXBlLCAiREVWSUNFIikpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLCAiRGV2aWNlIGxheWVycyBhcmUgZGVwcmVjYXRlZCBza2lwcGluZyB0aGlzIGxheWVyIik7CisgICAgICAgIGxheWVyX25vZGUgPSBsYXllcl9ub2RlLT5uZXh0OworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBBbGxvdyBlaXRoZXIgR0xPQkFMIG9yIElOU1RBTkNFIHR5cGUgaW50ZXJjaGFuZ2VhYmx5IHRvIGhhbmRsZQorICAgIC8vIGxheWVycyB0aGF0IG11c3Qgd29yayB3aXRoIG9sZGVyIGxvYWRlcnMKKyAgICBpZiAoIXN0cmNtcCh0eXBlLCAiSU5TVEFOQ0UiKSB8fCAhc3RyY21wKHR5cGUsICJHTE9CQUwiKSkgeworICAgICAgICBpZiAobGF5ZXJfaW5zdGFuY2VfbGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBsYXllcl9ub2RlID0gbGF5ZXJfbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIHByb3BzID0gbG9hZGVyR2V0TmV4dExheWVyUHJvcGVydHlTbG90KGluc3QsIGxheWVyX2luc3RhbmNlX2xpc3QpOworICAgICAgICBpZiAoTlVMTCA9PSBwcm9wcykgeworICAgICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSB0cmlnZ2VyZWQgaW4gbG9hZGVyR2V0TmV4dExheWVyUHJvcGVydHlTbG90LgorICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgcHJvcHMtPnR5cGVfZmxhZ3MgPSBWS19MQVlFUl9UWVBFX0ZMQUdfSU5TVEFOQ0VfTEFZRVI7CisgICAgICAgIGlmICghaXNfaW1wbGljaXQpIHsKKyAgICAgICAgICAgIHByb3BzLT50eXBlX2ZsYWdzIHw9IFZLX0xBWUVSX1RZUEVfRkxBR19FWFBMSUNJVF9MQVlFUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGxheWVyX25vZGUgPSBsYXllcl9ub2RlLT5uZXh0OworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBFeHBpcmF0aW9uIGRhdGUgZm9yIG92ZXJyaWRlIGxheWVyLiAgRmllbGQgc3RhcnRlIHdpdGggSlNPTiBmaWxlIDEuMS4yIGFuZAorICAgIC8vIGlzIGNvbXBsZXRlbHkgb3B0aW9uYWwuICBTbywgbm8gY2hlY2sgcHV0IGluIHBsYWNlLgorICAgIGlmICghc3RyY21wKG5hbWUsIFZLX09WRVJSSURFX0xBWUVSX05BTUUpKSB7CisgICAgICAgIGNKU09OICpleHBpcmF0aW9uOworCisgICAgICAgIGlmICh2ZXJzaW9uLm1ham9yIDwgMSAmJiB2ZXJzaW9uLm1pbm9yIDwgMSAmJiB2ZXJzaW9uLnBhdGNoIDwgMikgeworICAgICAgICAgICAgbG9hZGVyX2xvZygKKyAgICAgICAgICAgICAgICBpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICJPdmVycmlkZSBsYXllciBleHBpcmF0aW9uIGRhdGUgbm90IGFkZGVkIHVudGlsIHZlcnNpb24gMS4xLjIuICBQbGVhc2UgdXBkYXRlIEpTT04gZmlsZSB2ZXJzaW9uIGFwcHJvcHJpYXRlbHkuIik7CisgICAgICAgIH0KKworICAgICAgICBwcm9wcy0+aXNfb3ZlcnJpZGUgPSB0cnVlOworICAgICAgICBleHBpcmF0aW9uID0gY0pTT05fR2V0T2JqZWN0SXRlbShsYXllcl9ub2RlLCAiZXhwaXJhdGlvbl9kYXRlIik7CisgICAgICAgIGlmIChOVUxMICE9IGV4cGlyYXRpb24pIHsKKyAgICAgICAgICAgIGNoYXIgZGF0ZV9jb3B5WzMyXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgY3VyX2l0ZW0gPSAwOworCisgICAgICAgICAgICAvLyBHZXQgdGhlIHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgaXRlbQorICAgICAgICAgICAgdGVtcCA9IGNKU09OX1ByaW50KGV4cGlyYXRpb24pOworICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ibGVtIGFjY2Vzc2luZyBsYXllciB2YWx1ZSAnZXhwaXJhdGlvbl9kYXRlJyBpbiBtYW5pZmVzdCBKU09OIGZpbGUsIHNraXBwaW5nIHRoaXMgbGF5ZXIiKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wW3N0cmxlbih0ZW1wKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgIHN0cmNweShkYXRlX2NvcHksICZ0ZW1wWzFdKTsKKyAgICAgICAgICAgIGNKU09OX0ZyZWUodGVtcCk7CisKKyAgICAgICAgICAgIGlmIChzdHJsZW4oZGF0ZV9jb3B5KSA9PSAxNikgeworICAgICAgICAgICAgICAgIGNoYXIgKmN1cl9zdGFydCA9ICZkYXRlX2NvcHlbMF07CisgICAgICAgICAgICAgICAgY2hhciAqbmV4dF9kYXNoID0gc3RyY2hyKGRhdGVfY29weSwgJy0nKTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBuZXh0X2Rhc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN1cl9pdGVtIDwgNSAmJiBzdHJsZW4oY3VyX3N0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfZGFzaCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRfZGFzaCA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cl9pdGVtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAgLy8gWWVhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy0+ZXhwaXJhdGlvbi55ZWFyID0gYXRvaShjdXJfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICAvLyBNb250aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy0+ZXhwaXJhdGlvbi5tb250aCA9IGF0b2koY3VyX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgLy8gRGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLT5leHBpcmF0aW9uLmRheSA9IGF0b2koY3VyX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAgLy8gSG91cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy0+ZXhwaXJhdGlvbi5ob3VyID0gYXRvaShjdXJfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAvLyBNaW51dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMtPmV4cGlyYXRpb24ubWludXRlID0gYXRvaShjdXJfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy0+aGFzX2V4cGlyYXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfZGFzaCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3N0YXJ0ID0gbmV4dF9kYXNoICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2Rhc2ggPSBzdHJjaHIoY3VyX3N0YXJ0LCAnLScpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2l0ZW0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIExpYnJhcnkgcGF0aCBubyBsb25nZXIgcmVxdWlyZWQgdW5sZXNzIGNvbXBvbmVudF9sYXllcnMgaXMgYWxzbyBub3QgZGVmaW5lZAorICAgIGxpYnJhcnlfcGF0aCA9IGNKU09OX0dldE9iamVjdEl0ZW0obGF5ZXJfbm9kZSwgImxpYnJhcnlfcGF0aCIpOworICAgIGNvbXBvbmVudF9sYXllcnMgPSBjSlNPTl9HZXRPYmplY3RJdGVtKGxheWVyX25vZGUsICJjb21wb25lbnRfbGF5ZXJzIik7CisgICAgaWYgKE5VTEwgIT0gbGlicmFyeV9wYXRoKSB7CisgICAgICAgIGlmIChOVUxMICE9IGNvbXBvbmVudF9sYXllcnMpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkluZGljYXRpbmcgbWV0YS1sYXllci1zcGVjaWZpYyBjb21wb25lbnRfbGF5ZXJzLCBidXQgYWxzbyAiCisgICAgICAgICAgICAgICAgICAgICAgICJkZWZpbmluZyBsYXllciBsaWJyYXJ5IHBhdGguICBCb3RoIGFyZSBub3QgY29tcGF0aWJsZSwgc28gIgorICAgICAgICAgICAgICAgICAgICAgICAic2tpcHBpbmcgdGhpcyBsYXllciIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgcHJvcHMtPm51bV9jb21wb25lbnRfbGF5ZXJzID0gMDsKKyAgICAgICAgcHJvcHMtPmNvbXBvbmVudF9sYXllcl9uYW1lcyA9IE5VTEw7CisKKyAgICAgICAgdGVtcCA9IGNKU09OX1ByaW50KGxpYnJhcnlfcGF0aCk7CisgICAgICAgIGlmIChOVUxMID09IHRlbXApIHsKKyAgICAgICAgICAgIGxheWVyX25vZGUgPSBsYXllcl9ub2RlLT5uZXh0OworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiUHJvYmxlbSBhY2Nlc3NpbmcgbGF5ZXIgdmFsdWUgbGlicmFyeV9wYXRoIGluIG1hbmlmZXN0IEpTT04gIgorICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSwgc2tpcHBpbmcgdGhpcyBsYXllciIpOworICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgdGVtcFtzdHJsZW4odGVtcCkgLSAxXSA9ICdcMCc7CisgICAgICAgIGxpYnJhcnlfcGF0aF9zdHIgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc3RybGVuKHRlbXApICsgMSk7CisgICAgICAgIHN0cmNweShsaWJyYXJ5X3BhdGhfc3RyLCAmdGVtcFsxXSk7CisgICAgICAgIGNKU09OX0ZyZWUodGVtcCk7CisKKyAgICAgICAgY2hhciAqZnVsbHBhdGggPSBwcm9wcy0+bGliX25hbWU7CisgICAgICAgIGNoYXIgKnJlbF9iYXNlOworICAgICAgICBpZiAoTlVMTCAhPSBsaWJyYXJ5X3BhdGhfc3RyKSB7CisgICAgICAgICAgICBpZiAobG9hZGVyX3BsYXRmb3JtX2lzX3BhdGgobGlicmFyeV9wYXRoX3N0cikpIHsKKyAgICAgICAgICAgICAgICAvLyBBIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgKKyAgICAgICAgICAgICAgICBjaGFyICpuYW1lX2NvcHkgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc3RybGVuKGZpbGVuYW1lKSArIDEpOworICAgICAgICAgICAgICAgIHN0cmNweShuYW1lX2NvcHksIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICByZWxfYmFzZSA9IGxvYWRlcl9wbGF0Zm9ybV9kaXJuYW1lKG5hbWVfY29weSk7CisgICAgICAgICAgICAgICAgbG9hZGVyX2V4cGFuZF9wYXRoKGxpYnJhcnlfcGF0aF9zdHIsIHJlbF9iYXNlLCBNQVhfU1RSSU5HX1NJWkUsIGZ1bGxwYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisvLyBBIGZpbGVuYW1lIHdoaWNoIGlzIGFzc3VtZWQgaW4gYSBzeXN0ZW0gZGlyZWN0b3J5CisjaWYgZGVmaW5lZChERUZBVUxUX1ZLX0xBWUVSU19QQVRIKQorICAgICAgICAgICAgICAgIGxvYWRlcl9nZXRfZnVsbHBhdGgobGlicmFyeV9wYXRoX3N0ciwgREVGQVVMVF9WS19MQVlFUlNfUEFUSCwgTUFYX1NUUklOR19TSVpFLCBmdWxscGF0aCk7CisjZWxzZQorICAgICAgICAgICAgICAgIGxvYWRlcl9nZXRfZnVsbHBhdGgobGlicmFyeV9wYXRoX3N0ciwgIiIsIE1BWF9TVFJJTkdfU0laRSwgZnVsbHBhdGgpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKE5VTEwgIT0gY29tcG9uZW50X2xheWVycykgeworICAgICAgICBpZiAodmVyc2lvbi5tYWpvciA9PSAxICYmICh2ZXJzaW9uLm1pbm9yIDwgMSB8fCB2ZXJzaW9uLnBhdGNoIDwgMSkpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkluZGljYXRpbmcgbWV0YS1sYXllci1zcGVjaWZpYyBjb21wb25lbnRfbGF5ZXJzLCBidXQgdXNpbmcgb2xkZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiBmaWxlIHZlcnNpb24uIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gY0pTT05fR2V0QXJyYXlTaXplKGNvbXBvbmVudF9sYXllcnMpOworICAgICAgICBwcm9wcy0+bnVtX2NvbXBvbmVudF9sYXllcnMgPSBjb3VudDsKKworICAgICAgICAvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIGxheWVyIG5hbWVzCisgICAgICAgIHByb3BzLT5jb21wb25lbnRfbGF5ZXJfbmFtZXMgPQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgc2l6ZW9mKGNoYXJbTUFYX1NUUklOR19TSVpFXSkgKiBjb3VudCwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICBpZiAoTlVMTCA9PSBwcm9wcy0+Y29tcG9uZW50X2xheWVyX25hbWVzKSB7CisgICAgICAgICAgICByZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgdGhlIGNvbXBvbmVudCBsYXllcnMgaW50byB0aGUgYXJyYXkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGNKU09OICpjb21wX2xheWVyID0gY0pTT05fR2V0QXJyYXlJdGVtKGNvbXBvbmVudF9sYXllcnMsIGkpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gY29tcF9sYXllcikgeworICAgICAgICAgICAgICAgIHRlbXAgPSBjSlNPTl9QcmludChjb21wX2xheWVyKTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSB0ZW1wKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlbXBbc3RybGVuKHRlbXApIC0gMV0gPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvcHMtPmNvbXBvbmVudF9sYXllcl9uYW1lc1tpXSwgdGVtcCArIDEsIE1BWF9TVFJJTkdfU0laRSAtIDEpOworICAgICAgICAgICAgICAgIHByb3BzLT5jb21wb25lbnRfbGF5ZXJfbmFtZXNbaV1bTUFYX1NUUklOR19TSVpFIC0gMV0gPSAnXDAnOworICAgICAgICAgICAgICAgIGNKU09OX0ZyZWUodGVtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIG5vdywgb2ZmaWNpYWxseSwgYSBtZXRhLWxheWVyCisgICAgICAgIHByb3BzLT50eXBlX2ZsYWdzIHw9IFZLX0xBWUVSX1RZUEVfRkxBR19NRVRBX0xBWUVSOworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLCAiRW5jb3VudGVyZWQgbWV0YS1sYXllciAlcyIsIG5hbWUpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdXAgb3RoZXIgdGhpbmdzIHNvIHdlIGhlYWQgZG93biB0aGUgY29ycmVjdCBicmFuY2hlcyBiZWxvdworICAgICAgICBsaWJyYXJ5X3BhdGhfc3RyID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIkxheWVyIG1pc3NpbmcgYm90aCBsaWJyYXJ5X3BhdGggYW5kIGNvbXBvbmVudF9sYXllcnMgZmllbGRzLiAgT25lIG9yIHRoZSAiCisgICAgICAgICAgICAgICAgICAgIm90aGVyIE1VU1QgYmUgZGVmaW5lZC4gIFNraXBwaW5nIHRoaXMgbGF5ZXIiKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcHJvcHMtPm51bV9ibGFja2xpc3RfbGF5ZXJzID0gMDsKKyAgICBwcm9wcy0+YmxhY2tsaXN0X2xheWVyX25hbWVzID0gTlVMTDsKKyAgICBibGFja2xpc3RlZF9sYXllcnMgPSBjSlNPTl9HZXRPYmplY3RJdGVtKGxheWVyX25vZGUsICJibGFja2xpc3RlZF9sYXllcnMiKTsKKyAgICBpZiAoYmxhY2tsaXN0ZWRfbGF5ZXJzICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBWS19PVkVSUklERV9MQVlFUl9OQU1FKSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiTGF5ZXIgJXMgY29udGFpbnMgYSBibGFja2xpc3QsIGJ1dCBhIGJsYWNrbGlzdCBjYW4gb25seSBiZSBwcm92aWRlZCBieSB0aGUgb3ZlcnJpZGUgbWV0YWxheWVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGJsYWNrbGlzdCB3aWxsIGJlIGlnbm9yZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9wcy0+bnVtX2JsYWNrbGlzdF9sYXllcnMgPSBjSlNPTl9HZXRBcnJheVNpemUoYmxhY2tsaXN0ZWRfbGF5ZXJzKTsKKworICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIGJsYWNrbGlzdCBhcnJheQorICAgICAgICAgICAgcHJvcHMtPmJsYWNrbGlzdF9sYXllcl9uYW1lcyA9IGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKAorICAgICAgICAgICAgICAgIGluc3QsIHNpemVvZihjaGFyW01BWF9TVFJJTkdfU0laRV0pICogcHJvcHMtPm51bV9ibGFja2xpc3RfbGF5ZXJzLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgICAgICAgICBpZiAocHJvcHMtPmJsYWNrbGlzdF9sYXllcl9uYW1lcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb3B5IHRoZSBibGFja2xpc3RlZCBsYXllcnMgaW50byB0aGUgYXJyYXkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KXByb3BzLT5udW1fYmxhY2tsaXN0X2xheWVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgY0pTT04gKmJsYWNrX2xheWVyID0gY0pTT05fR2V0QXJyYXlJdGVtKGJsYWNrbGlzdGVkX2xheWVycywgaSk7CisgICAgICAgICAgICAgICAgaWYgKGJsYWNrX2xheWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlbXAgPSBjSlNPTl9QcmludChibGFja19sYXllcik7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZW1wW3N0cmxlbih0ZW1wKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KHByb3BzLT5ibGFja2xpc3RfbGF5ZXJfbmFtZXNbaV0sIHRlbXAgKyAxLCBNQVhfU1RSSU5HX1NJWkUgLSAxKTsKKyAgICAgICAgICAgICAgICBwcm9wcy0+YmxhY2tsaXN0X2xheWVyX25hbWVzW2ldW01BWF9TVFJJTkdfU0laRSAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBjSlNPTl9GcmVlKHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgb3ZlcnJpZGVfcGF0aHMgPSBjSlNPTl9HZXRPYmplY3RJdGVtKGxheWVyX25vZGUsICJvdmVycmlkZV9wYXRocyIpOworICAgIGlmIChOVUxMICE9IG92ZXJyaWRlX3BhdGhzKSB7CisgICAgICAgIGlmICh2ZXJzaW9uLm1ham9yID09IDEgJiYgKHZlcnNpb24ubWlub3IgPCAxIHx8IHZlcnNpb24ucGF0Y2ggPCAxKSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiSW5kaWNhdGluZyBtZXRhLWxheWVyLXNwZWNpZmljIG92ZXJyaWRlIHBhdGhzLCBidXQgdXNpbmcgb2xkZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiBmaWxlIHZlcnNpb24uIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gY0pTT05fR2V0QXJyYXlTaXplKG92ZXJyaWRlX3BhdGhzKTsKKyAgICAgICAgcHJvcHMtPm51bV9vdmVycmlkZV9wYXRocyA9IGNvdW50OworCisgICAgICAgIC8vIEFsbG9jYXRlIGJ1ZmZlciBmb3Igb3ZlcnJpZGUgcGF0aHMKKyAgICAgICAgcHJvcHMtPm92ZXJyaWRlX3BhdGhzID0KKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIHNpemVvZihjaGFyW01BWF9TVFJJTkdfU0laRV0pICogY291bnQsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcHJvcHMtPm92ZXJyaWRlX3BhdGhzKSB7CisgICAgICAgICAgICByZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgdGhlIG92ZXJyaWRlIHBhdGhzIGludG8gdGhlIGFycmF5CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjSlNPTiAqb3ZlcnJpZGVfcGF0aCA9IGNKU09OX0dldEFycmF5SXRlbShvdmVycmlkZV9wYXRocywgaSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBvdmVycmlkZV9wYXRoKSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IGNKU09OX1ByaW50KG92ZXJyaWRlX3BhdGgpOworICAgICAgICAgICAgICAgIGlmIChOVUxMID09IHRlbXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVtcFtzdHJsZW4odGVtcCkgLSAxXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgc3RybmNweShwcm9wcy0+b3ZlcnJpZGVfcGF0aHNbaV0sIHRlbXAgKyAxLCBNQVhfU1RSSU5HX1NJWkUgLSAxKTsKKyAgICAgICAgICAgICAgICBwcm9wcy0+b3ZlcnJpZGVfcGF0aHNbaV1bTUFYX1NUUklOR19TSVpFIC0gMV0gPSAnXDAnOworICAgICAgICAgICAgICAgIGNKU09OX0ZyZWUodGVtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfaW1wbGljaXQpIHsKKyAgICAgICAgR0VUX0pTT05fT0JKRUNUKGxheWVyX25vZGUsIGRpc2FibGVfZW52aXJvbm1lbnQpCisgICAgfQorI3VuZGVmIEdFVF9KU09OX0lURU0KKyN1bmRlZiBHRVRfSlNPTl9PQkpFQ1QKKworICAgIHN0cm5jcHkocHJvcHMtPmluZm8ubGF5ZXJOYW1lLCBuYW1lLCBzaXplb2YocHJvcHMtPmluZm8ubGF5ZXJOYW1lKSk7CisgICAgcHJvcHMtPmluZm8ubGF5ZXJOYW1lW3NpemVvZihwcm9wcy0+aW5mby5sYXllck5hbWUpIC0gMV0gPSAnXDAnOworICAgIHByb3BzLT5pbmZvLnNwZWNWZXJzaW9uID0gbG9hZGVyX21ha2VfdmVyc2lvbihhcGlfdmVyc2lvbik7CisgICAgcHJvcHMtPmluZm8uaW1wbGVtZW50YXRpb25WZXJzaW9uID0gYXRvaShpbXBsZW1lbnRhdGlvbl92ZXJzaW9uKTsKKyAgICBzdHJuY3B5KChjaGFyICopcHJvcHMtPmluZm8uZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uLCBzaXplb2YocHJvcHMtPmluZm8uZGVzY3JpcHRpb24pKTsKKyAgICBwcm9wcy0+aW5mby5kZXNjcmlwdGlvbltzaXplb2YocHJvcHMtPmluZm8uZGVzY3JpcHRpb24pIC0gMV0gPSAnXDAnOworICAgIGlmIChpc19pbXBsaWNpdCkgeworICAgICAgICBpZiAoIWRpc2FibGVfZW52aXJvbm1lbnQgfHwgIWRpc2FibGVfZW52aXJvbm1lbnQtPmNoaWxkKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJEaWRuJ3QgZmluZCByZXF1aXJlZCBsYXllciBjaGlsZCB2YWx1ZSBkaXNhYmxlX2Vudmlyb25tZW50IgorICAgICAgICAgICAgICAgICAgICAgICAiaW4gbWFuaWZlc3QgSlNPTiBmaWxlLCBza2lwcGluZyB0aGlzIGxheWVyIik7CisgICAgICAgICAgICBsYXllcl9ub2RlID0gbGF5ZXJfbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkocHJvcHMtPmRpc2FibGVfZW52X3Zhci5uYW1lLCBkaXNhYmxlX2Vudmlyb25tZW50LT5jaGlsZC0+c3RyaW5nLCBzaXplb2YocHJvcHMtPmRpc2FibGVfZW52X3Zhci5uYW1lKSk7CisgICAgICAgIHByb3BzLT5kaXNhYmxlX2Vudl92YXIubmFtZVtzaXplb2YocHJvcHMtPmRpc2FibGVfZW52X3Zhci5uYW1lKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgc3RybmNweShwcm9wcy0+ZGlzYWJsZV9lbnZfdmFyLnZhbHVlLCBkaXNhYmxlX2Vudmlyb25tZW50LT5jaGlsZC0+dmFsdWVzdHJpbmcsIHNpemVvZihwcm9wcy0+ZGlzYWJsZV9lbnZfdmFyLnZhbHVlKSk7CisgICAgICAgIHByb3BzLT5kaXNhYmxlX2Vudl92YXIudmFsdWVbc2l6ZW9mKHByb3BzLT5kaXNhYmxlX2Vudl92YXIudmFsdWUpIC0gMV0gPSAnXDAnOworICAgIH0KKworLy8gTm93IGdldCBhbGwgb3B0aW9uYWwgaXRlbXMgYW5kIG9iamVjdHMgYW5kIHB1dCBpbiBsaXN0OgorLy8gZnVuY3Rpb25zCisvLyBpbnN0YW5jZV9leHRlbnNpb25zCisvLyBkZXZpY2VfZXh0ZW5zaW9ucworLy8gZW5hYmxlX2Vudmlyb25tZW50IChpbXBsaWNpdCBsYXllcnMgb25seSkKKyNkZWZpbmUgR0VUX0pTT05fT0JKRUNUKG5vZGUsIHZhcikgXAorICAgIHsgdmFyID0gY0pTT05fR2V0T2JqZWN0SXRlbShub2RlLCAjdmFyKTsgfQorI2RlZmluZSBHRVRfSlNPTl9JVEVNKG5vZGUsIHZhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpdGVtID0gY0pTT05fR2V0T2JqZWN0SXRlbShub2RlLCAjdmFyKTsgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaXRlbSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcCA9IGNKU09OX1ByaW50KGl0ZW0pOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRlbXBbc3RybGVuKHRlbXApIC0gMV0gPSAnXDAnOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHZhciA9IGxvYWRlcl9zdGFja19hbGxvYyhzdHJsZW4odGVtcCkgKyAxKTsgXAorICAgICAgICAgICAgICAgIHN0cmNweSh2YXIsICZ0ZW1wWzFdKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNKU09OX0ZyZWUodGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgIGNKU09OICppbnN0YW5jZV9leHRlbnNpb25zLCAqZGV2aWNlX2V4dGVuc2lvbnMsICpmdW5jdGlvbnMsICplbmFibGVfZW52aXJvbm1lbnQ7CisgICAgY0pTT04gKmVudHJ5cG9pbnRzID0gTlVMTDsKKyAgICBjaGFyICp2a0dldEluc3RhbmNlUHJvY0FkZHIgPSBOVUxMOworICAgIGNoYXIgKnZrR2V0RGV2aWNlUHJvY0FkZHIgPSBOVUxMOworICAgIGNoYXIgKnZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uID0gTlVMTDsKKyAgICBjaGFyICpzcGVjX3ZlcnNpb24gPSBOVUxMOworICAgIGNoYXIgKiplbnRyeV9hcnJheSA9IE5VTEw7CisKKyAgICAvLyBMYXllciBpbnRlcmZhY2UgZnVuY3Rpb25zCisgICAgLy8gICAgdmtHZXRJbnN0YW5jZVByb2NBZGRyCisgICAgLy8gICAgdmtHZXREZXZpY2VQcm9jQWRkcgorICAgIC8vICAgIHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uIChzdGFydGluZyB3aXRoIEpTT04gZmlsZSAxLjEuMCkKKyAgICBHRVRfSlNPTl9PQkpFQ1QobGF5ZXJfbm9kZSwgZnVuY3Rpb25zKQorICAgIGlmIChmdW5jdGlvbnMgIT0gTlVMTCkgeworICAgICAgICBpZiAodmVyc2lvbi5tYWpvciA+IDEgfHwgdmVyc2lvbi5taW5vciA+PSAxKSB7CisgICAgICAgICAgICBHRVRfSlNPTl9JVEVNKGZ1bmN0aW9ucywgdmtOZWdvdGlhdGVMb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24pCisgICAgICAgICAgICBpZiAodmtOZWdvdGlhdGVMb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBzdHJuY3B5KHByb3BzLT5mdW5jdGlvbnMuc3RyX25lZ290aWF0ZV9pbnRlcmZhY2UsIHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHByb3BzLT5mdW5jdGlvbnMuc3RyX25lZ290aWF0ZV9pbnRlcmZhY2UpKTsKKyAgICAgICAgICAgIHByb3BzLT5mdW5jdGlvbnMuc3RyX25lZ290aWF0ZV9pbnRlcmZhY2Vbc2l6ZW9mKHByb3BzLT5mdW5jdGlvbnMuc3RyX25lZ290aWF0ZV9pbnRlcmZhY2UpIC0gMV0gPSAnXDAnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvcHMtPmZ1bmN0aW9ucy5zdHJfbmVnb3RpYXRlX2ludGVyZmFjZVswXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgICAgR0VUX0pTT05fSVRFTShmdW5jdGlvbnMsIHZrR2V0SW5zdGFuY2VQcm9jQWRkcikKKyAgICAgICAgR0VUX0pTT05fSVRFTShmdW5jdGlvbnMsIHZrR2V0RGV2aWNlUHJvY0FkZHIpCisgICAgICAgIGlmICh2a0dldEluc3RhbmNlUHJvY0FkZHIgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RybmNweShwcm9wcy0+ZnVuY3Rpb25zLnN0cl9naXBhLCB2a0dldEluc3RhbmNlUHJvY0FkZHIsIHNpemVvZihwcm9wcy0+ZnVuY3Rpb25zLnN0cl9naXBhKSk7CisgICAgICAgICAgICBpZiAodmVyc2lvbi5tYWpvciA+IDEgfHwgdmVyc2lvbi5taW5vciA+PSAxKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXllciBcIiVzXCIgdXNpbmcgZGVwcmVjYXRlZCBcJ3ZrR2V0SW5zdGFuY2VQcm9jQWRkclwnIHRhZyB3aGljaCB3YXMgZGVwcmVjYXRlZCBzdGFydGluZyB3aXRoIEpTT04gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgdmVyc2lvbiAxLjEuMC4gVGhlIG5ldyB2a05lZ290aWF0ZUxheWVySW50ZXJmYWNlVmVyc2lvbiBmdW5jdGlvbiBpcyBwcmVmZXJyZWQsIHRob3VnaCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkgcmVhc29ucyBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGNvbnRpbnVlIHVzaW5nIHRoZSBkZXByZWNhdGVkIHRhZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJvcHMtPmZ1bmN0aW9ucy5zdHJfZ2lwYVtzaXplb2YocHJvcHMtPmZ1bmN0aW9ucy5zdHJfZ2lwYSkgLSAxXSA9ICdcMCc7CisgICAgICAgIGlmICh2a0dldERldmljZVByb2NBZGRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0cm5jcHkocHJvcHMtPmZ1bmN0aW9ucy5zdHJfZ2RwYSwgdmtHZXREZXZpY2VQcm9jQWRkciwgc2l6ZW9mKHByb3BzLT5mdW5jdGlvbnMuc3RyX2dkcGEpKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uLm1ham9yID4gMSB8fCB2ZXJzaW9uLm1pbm9yID49IDEpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxheWVyIFwiJXNcIiB1c2luZyBkZXByZWNhdGVkIFwndmtHZXREZXZpY2VQcm9jQWRkclwnIHRhZyB3aGljaCB3YXMgZGVwcmVjYXRlZCBzdGFydGluZyB3aXRoIEpTT04gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgdmVyc2lvbiAxLjEuMC4gVGhlIG5ldyB2a05lZ290aWF0ZUxheWVySW50ZXJmYWNlVmVyc2lvbiBmdW5jdGlvbiBpcyBwcmVmZXJyZWQsIHRob3VnaCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkgcmVhc29ucyBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGNvbnRpbnVlIHVzaW5nIHRoZSBkZXByZWNhdGVkIHRhZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJvcHMtPmZ1bmN0aW9ucy5zdHJfZ2RwYVtzaXplb2YocHJvcHMtPmZ1bmN0aW9ucy5zdHJfZ2RwYSkgLSAxXSA9ICdcMCc7CisgICAgfQorCisgICAgLy8gaW5zdGFuY2VfZXh0ZW5zaW9ucworICAgIC8vICAgYXJyYXkgb2YgeworICAgIC8vICAgICBuYW1lCisgICAgLy8gICAgIHNwZWNfdmVyc2lvbgorICAgIC8vICAgfQorICAgIEdFVF9KU09OX09CSkVDVChsYXllcl9ub2RlLCBpbnN0YW5jZV9leHRlbnNpb25zKQorICAgIGlmIChpbnN0YW5jZV9leHRlbnNpb25zICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGNvdW50ID0gY0pTT05fR2V0QXJyYXlTaXplKGluc3RhbmNlX2V4dGVuc2lvbnMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZXh0X2l0ZW0gPSBjSlNPTl9HZXRBcnJheUl0ZW0oaW5zdGFuY2VfZXh0ZW5zaW9ucywgaSk7CisgICAgICAgICAgICBHRVRfSlNPTl9JVEVNKGV4dF9pdGVtLCBuYW1lKQorICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0cm5jcHkoZXh0X3Byb3AuZXh0ZW5zaW9uTmFtZSwgbmFtZSwgc2l6ZW9mKGV4dF9wcm9wLmV4dGVuc2lvbk5hbWUpKTsKKyAgICAgICAgICAgICAgICBleHRfcHJvcC5leHRlbnNpb25OYW1lW3NpemVvZihleHRfcHJvcC5leHRlbnNpb25OYW1lKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEdFVF9KU09OX0lURU0oZXh0X2l0ZW0sIHNwZWNfdmVyc2lvbikKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHNwZWNfdmVyc2lvbikgeworICAgICAgICAgICAgICAgIGV4dF9wcm9wLnNwZWNWZXJzaW9uID0gYXRvaShzcGVjX3ZlcnNpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRfcHJvcC5zcGVjVmVyc2lvbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIGV4dF91bnN1cHBvcnRlZCA9IHdzaV91bnN1cHBvcnRlZF9pbnN0YW5jZV9leHRlbnNpb24oJmV4dF9wcm9wKTsKKyAgICAgICAgICAgIGlmICghZXh0X3Vuc3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2FkZF90b19leHRfbGlzdChpbnN0LCAmcHJvcHMtPmluc3RhbmNlX2V4dGVuc2lvbl9saXN0LCAxLCAmZXh0X3Byb3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGV2aWNlX2V4dGVuc2lvbnMKKyAgICAvLyAgIGFycmF5IG9mIHsKKyAgICAvLyAgICAgbmFtZQorICAgIC8vICAgICBzcGVjX3ZlcnNpb24KKyAgICAvLyAgICAgZW50cnlwb2ludHMKKyAgICAvLyAgIH0KKyAgICBHRVRfSlNPTl9PQkpFQ1QobGF5ZXJfbm9kZSwgZGV2aWNlX2V4dGVuc2lvbnMpCisgICAgaWYgKGRldmljZV9leHRlbnNpb25zICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGNvdW50ID0gY0pTT05fR2V0QXJyYXlTaXplKGRldmljZV9leHRlbnNpb25zKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGV4dF9pdGVtID0gY0pTT05fR2V0QXJyYXlJdGVtKGRldmljZV9leHRlbnNpb25zLCBpKTsKKyAgICAgICAgICAgIEdFVF9KU09OX0lURU0oZXh0X2l0ZW0sIG5hbWUpCisgICAgICAgICAgICBHRVRfSlNPTl9JVEVNKGV4dF9pdGVtLCBzcGVjX3ZlcnNpb24pCisgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RybmNweShleHRfcHJvcC5leHRlbnNpb25OYW1lLCBuYW1lLCBzaXplb2YoZXh0X3Byb3AuZXh0ZW5zaW9uTmFtZSkpOworICAgICAgICAgICAgICAgIGV4dF9wcm9wLmV4dGVuc2lvbk5hbWVbc2l6ZW9mKGV4dF9wcm9wLmV4dGVuc2lvbk5hbWUpIC0gMV0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE5VTEwgIT0gc3BlY192ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgZXh0X3Byb3Auc3BlY1ZlcnNpb24gPSBhdG9pKHNwZWNfdmVyc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4dF9wcm9wLnNwZWNWZXJzaW9uID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGVudHJ5cG9pbnRzID0gY0pTT05fR2V0T2JqZWN0SXRlbShleHRfaXRlbSwgImVudHJ5cG9pbnRzIik7CisgICAgICAgICAgICBHRVRfSlNPTl9PQkpFQ1QoZXh0X2l0ZW0sIGVudHJ5cG9pbnRzKQorICAgICAgICAgICAgaW50IGVudHJ5X2NvdW50OworICAgICAgICAgICAgaWYgKGVudHJ5cG9pbnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfYWRkX3RvX2Rldl9leHRfbGlzdChpbnN0LCAmcHJvcHMtPmRldmljZV9leHRlbnNpb25fbGlzdCwgJmV4dF9wcm9wLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudHJ5X2NvdW50ID0gY0pTT05fR2V0QXJyYXlTaXplKGVudHJ5cG9pbnRzKTsKKyAgICAgICAgICAgIGlmIChlbnRyeV9jb3VudCkgeworICAgICAgICAgICAgICAgIGVudHJ5X2FycmF5ID0gKGNoYXIgKiopbG9hZGVyX3N0YWNrX2FsbG9jKHNpemVvZihjaGFyICopICogZW50cnlfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGVudHJ5X2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBleHRfaXRlbSA9IGNKU09OX0dldEFycmF5SXRlbShlbnRyeXBvaW50cywgaik7CisgICAgICAgICAgICAgICAgaWYgKGV4dF9pdGVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGNKU09OX1ByaW50KGV4dF9pdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gdGVtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfYXJyYXlbal0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGVtcFtzdHJsZW4odGVtcCkgLSAxXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5X2FycmF5W2pdID0gbG9hZGVyX3N0YWNrX2FsbG9jKHN0cmxlbih0ZW1wKSArIDEpOworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoZW50cnlfYXJyYXlbal0sICZ0ZW1wWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgY0pTT05fRnJlZSh0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXJfYWRkX3RvX2Rldl9leHRfbGlzdChpbnN0LCAmcHJvcHMtPmRldmljZV9leHRlbnNpb25fbGlzdCwgJmV4dF9wcm9wLCBlbnRyeV9jb3VudCwgZW50cnlfYXJyYXkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpc19pbXBsaWNpdCkgeworICAgICAgICBHRVRfSlNPTl9PQkpFQ1QobGF5ZXJfbm9kZSwgZW5hYmxlX2Vudmlyb25tZW50KQorCisgICAgICAgIC8vIGVuYWJsZV9lbnZpcm9ubWVudCBpcyBvcHRpb25hbAorICAgICAgICBpZiAoZW5hYmxlX2Vudmlyb25tZW50KSB7CisgICAgICAgICAgICBzdHJuY3B5KHByb3BzLT5lbmFibGVfZW52X3Zhci5uYW1lLCBlbmFibGVfZW52aXJvbm1lbnQtPmNoaWxkLT5zdHJpbmcsIHNpemVvZihwcm9wcy0+ZW5hYmxlX2Vudl92YXIubmFtZSkpOworICAgICAgICAgICAgcHJvcHMtPmVuYWJsZV9lbnZfdmFyLm5hbWVbc2l6ZW9mKHByb3BzLT5lbmFibGVfZW52X3Zhci5uYW1lKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgIHN0cm5jcHkocHJvcHMtPmVuYWJsZV9lbnZfdmFyLnZhbHVlLCBlbmFibGVfZW52aXJvbm1lbnQtPmNoaWxkLT52YWx1ZXN0cmluZywgc2l6ZW9mKHByb3BzLT5lbmFibGVfZW52X3Zhci52YWx1ZSkpOworICAgICAgICAgICAgcHJvcHMtPmVuYWJsZV9lbnZfdmFyLnZhbHVlW3NpemVvZihwcm9wcy0+ZW5hYmxlX2Vudl92YXIudmFsdWUpIC0gMV0gPSAnXDAnOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZCBpbiB0aGUgcHJlLWluc3RhbmNlIHN0dWZmCisgICAgY0pTT04gKnByZV9pbnN0YW5jZSA9IGNKU09OX0dldE9iamVjdEl0ZW0obGF5ZXJfbm9kZSwgInByZV9pbnN0YW5jZV9mdW5jdGlvbnMiKTsKKyAgICBpZiAocHJlX2luc3RhbmNlKSB7CisgICAgICAgIGlmICghbGF5ZXJfanNvbl9zdXBwb3J0c19wcmVfaW5zdGFuY2VfdGFnKCZ2ZXJzaW9uKSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHByZV9pbnN0YW5jZV9mdW5jdGlvbnMgc2VjdGlvbiBpbiBsYXllciBmcm9tIFwiJXNcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBzZWN0aW9uIGlzIG9ubHkgdmFsaWQgaW4gbWFuaWZlc3QgdmVyc2lvbiAxLjEuMiBvciBsYXRlci4gVGhlIHNlY3Rpb24gd2lsbCBiZSBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKCFpc19pbXBsaWNpdCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgcHJlX2luc3RhbmNlX2Z1bmN0aW9ucyBzZWN0aW9uIGluIGV4cGxpY2l0IGxheWVyIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAiXCIlc1wiLiBUaGlzIHNlY3Rpb24gaXMgb25seSB2YWxpZCBpbiBpbXBsaWNpdCBsYXllcnMuIFRoZSBzZWN0aW9uIHdpbGwgYmUgaWdub3JlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNKU09OICppbnN0X2V4dF9qc29uID0gY0pTT05fR2V0T2JqZWN0SXRlbShwcmVfaW5zdGFuY2UsICJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyIpOworICAgICAgICAgICAgaWYgKGluc3RfZXh0X2pzb24pIHsKKyAgICAgICAgICAgICAgICBjaGFyICppbnN0X2V4dF9uYW1lID0gY0pTT05fUHJpbnQoaW5zdF9leHRfanNvbik7CisgICAgICAgICAgICAgICAgaWYgKGluc3RfZXh0X25hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKGluc3RfZXh0X25hbWUpID49IE1BWF9TVFJJTkdfU0laRSA/IE1BWF9TVFJJTkdfU0laRSAtIDMgOiBzdHJsZW4oaW5zdF9leHRfbmFtZSkgLSAyOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvcHMtPnByZV9pbnN0YW5jZV9mdW5jdGlvbnMuZW51bWVyYXRlX2luc3RhbmNlX2V4dGVuc2lvbl9wcm9wZXJ0aWVzLCBpbnN0X2V4dF9uYW1lICsgMSwgbGVuKTsKKyAgICAgICAgICAgICAgICBwcm9wcy0+cHJlX2luc3RhbmNlX2Z1bmN0aW9ucy5lbnVtZXJhdGVfaW5zdGFuY2VfZXh0ZW5zaW9uX3Byb3BlcnRpZXNbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgY0pTT05fRnJlZShpbnN0X2V4dF9uYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY0pTT04gKmluc3RfbGF5ZXJfanNvbiA9IGNKU09OX0dldE9iamVjdEl0ZW0ocHJlX2luc3RhbmNlLCAidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIpOworICAgICAgICAgICAgaWYgKGluc3RfbGF5ZXJfanNvbikgeworICAgICAgICAgICAgICAgIGNoYXIgKmluc3RfbGF5ZXJfbmFtZSA9IGNKU09OX1ByaW50KGluc3RfbGF5ZXJfanNvbik7CisgICAgICAgICAgICAgICAgaWYgKGluc3RfbGF5ZXJfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oaW5zdF9sYXllcl9uYW1lKSA+PSBNQVhfU1RSSU5HX1NJWkUgPyBNQVhfU1RSSU5HX1NJWkUgLSAzIDogc3RybGVuKGluc3RfbGF5ZXJfbmFtZSkgLSAyOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvcHMtPnByZV9pbnN0YW5jZV9mdW5jdGlvbnMuZW51bWVyYXRlX2luc3RhbmNlX2xheWVyX3Byb3BlcnRpZXMsIGluc3RfbGF5ZXJfbmFtZSArIDEsIGxlbik7CisgICAgICAgICAgICAgICAgcHJvcHMtPnByZV9pbnN0YW5jZV9mdW5jdGlvbnMuZW51bWVyYXRlX2luc3RhbmNlX2xheWVyX3Byb3BlcnRpZXNbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgY0pTT05fRnJlZShpbnN0X2xheWVyX25hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjSlNPTiAqaW5zdF92ZXJzaW9uX2pzb24gPSBjSlNPTl9HZXRPYmplY3RJdGVtKHByZV9pbnN0YW5jZSwgInZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIik7CisgICAgICAgICAgICBpZiAoaW5zdF92ZXJzaW9uX2pzb24pIHsKKyAgICAgICAgICAgICAgICBjaGFyICppbnN0X3ZlcnNpb25fbmFtZSA9IGNKU09OX1ByaW50KGluc3RfdmVyc2lvbl9qc29uKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdF92ZXJzaW9uX2pzb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihpbnN0X3ZlcnNpb25fbmFtZSkgPj0gTUFYX1NUUklOR19TSVpFID8gTUFYX1NUUklOR19TSVpFIC0gMyA6IHN0cmxlbihpbnN0X3ZlcnNpb25fbmFtZSkgLSAyOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvcHMtPnByZV9pbnN0YW5jZV9mdW5jdGlvbnMuZW51bWVyYXRlX2luc3RhbmNlX3ZlcnNpb24sIGluc3RfdmVyc2lvbl9uYW1lICsgMSwgbGVuKTsKKyAgICAgICAgICAgICAgICBwcm9wcy0+cHJlX2luc3RhbmNlX2Z1bmN0aW9ucy5lbnVtZXJhdGVfaW5zdGFuY2VfdmVyc2lvbltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBjSlNPTl9GcmVlKGluc3RfdmVyc2lvbl9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IFZLX1NVQ0NFU1M7CisKK291dDoKKyN1bmRlZiBHRVRfSlNPTl9JVEVNCisjdW5kZWYgR0VUX0pTT05fT0JKRUNUCisKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQgJiYgTlVMTCAhPSBwcm9wcykgeworICAgICAgICBpZiAoTlVMTCAhPSBwcm9wcy0+YmxhY2tsaXN0X2xheWVyX25hbWVzKSB7CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIHByb3BzLT5ibGFja2xpc3RfbGF5ZXJfbmFtZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChOVUxMICE9IHByb3BzLT5jb21wb25lbnRfbGF5ZXJfbmFtZXMpIHsKKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgcHJvcHMtPmNvbXBvbmVudF9sYXllcl9uYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE5VTEwgIT0gcHJvcHMtPm92ZXJyaWRlX3BhdGhzKSB7CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIHByb3BzLT5vdmVycmlkZV9wYXRocyk7CisgICAgICAgIH0KKyAgICAgICAgcHJvcHMtPm51bV9ibGFja2xpc3RfbGF5ZXJzID0gMDsKKyAgICAgICAgcHJvcHMtPmJsYWNrbGlzdF9sYXllcl9uYW1lcyA9IE5VTEw7CisgICAgICAgIHByb3BzLT5udW1fY29tcG9uZW50X2xheWVycyA9IDA7CisgICAgICAgIHByb3BzLT5jb21wb25lbnRfbGF5ZXJfbmFtZXMgPSBOVUxMOworICAgICAgICBwcm9wcy0+bnVtX292ZXJyaWRlX3BhdGhzID0gMDsKKyAgICAgICAgcHJvcHMtPm92ZXJyaWRlX3BhdGhzID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZExheWVySnNvblZlcnNpb24oY29uc3QgbGF5ZXJfanNvbl92ZXJzaW9uICpsYXllcl9qc29uKSB7CisgICAgLy8gU3VwcG9ydGVkIHZlcnNpb25zIGFyZTogMS4wLjAsIDEuMC4xLCBhbmQgMS4xLjAgLSAxLjEuMi4KKyAgICBpZiAoKGxheWVyX2pzb24tPm1ham9yID09IDEgJiYgbGF5ZXJfanNvbi0+bWlub3IgPT0gMSAmJiBsYXllcl9qc29uLT5wYXRjaCA8IDMpIHx8CisgICAgICAgIChsYXllcl9qc29uLT5tYWpvciA9PSAxICYmIGxheWVyX2pzb24tPm1pbm9yID09IDAgJiYgbGF5ZXJfanNvbi0+cGF0Y2ggPCAyKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbGF5ZXJKc29uU3VwcG9ydHNNdWx0aXBsZUxheWVycyhjb25zdCBsYXllcl9qc29uX3ZlcnNpb24gKmxheWVyX2pzb24pIHsKKyAgICAvLyBTdXBwb3J0ZWQgdmVyc2lvbnMgc3RhcnRlZCBpbiAxLjAuMSwgc28gYW55dGhpbmcgbmV3ZXIKKyAgICBpZiAoKGxheWVyX2pzb24tPm1ham9yID4gMSB8fCBsYXllcl9qc29uLT5taW5vciA+IDAgfHwgbGF5ZXJfanNvbi0+cGF0Y2ggPiAxKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBHaXZlbiBhIGNKU09OIHN0cnVjdCAoanNvbikgb2YgdGhlIHRvcCBsZXZlbCBKU09OIG9iamVjdCBmcm9tIGxheWVyIG1hbmlmZXN0CisvLyBmaWxlLCBhZGQgZW50cnkgdG8gdGhlIGxheWVyX2xpc3QuIEZpbGwgb3V0IHRoZSBsYXllcl9wcm9wZXJ0aWVzIGluIHRoaXMgbGlzdAorLy8gZW50cnkgZnJvbSB0aGUgaW5wdXQgY0pTT04gb2JqZWN0LgorLy8KKy8vIFxyZXR1cm5zCisvLyB2b2lkCisvLyBsYXllcl9saXN0IGhhcyBhIG5ldyBlbnRyeSBhbmQgaW5pdGlhbGl6ZWQgYWNjb3JkaW5nbHkuCisvLyBJZiB0aGUganNvbiBpbnB1dCBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbGwgdGhlIHJlcXVpcmVkIGZpZWxkcyBubyBlbnRyeQorLy8gaXMgYWRkZWQgdG8gdGhlIGxpc3QuCitzdGF0aWMgVmtSZXN1bHQgbG9hZGVyQWRkTGF5ZXJQcm9wZXJ0aWVzKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqbGF5ZXJfaW5zdGFuY2VfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0pTT04gKmpzb24sIGJvb2wgaXNfaW1wbGljaXQsIGNoYXIgKmZpbGVuYW1lKSB7CisgICAgLy8gVGhlIGZvbGxvd2luZyBGaWVsZHMgaW4gbGF5ZXIgbWFuaWZlc3QgZmlsZSB0aGF0IGFyZSByZXF1aXJlZDoKKyAgICAvLyAgIC0gImZpbGVfZm9ybWF0X3ZlcnNpb24iCisgICAgLy8gICAtIElmIG1vcmUgdGhhbiBvbmUgImxheWVyIiBvYmplY3QgYXJlIHVzZWQsIHRoZW4gdGhlICJsYXllcnMiIGFycmF5IGlzCisgICAgLy8gICAgIHJlcXVpcmVkCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIGNKU09OICppdGVtLCAqbGF5ZXJzX25vZGUsICpsYXllcl9ub2RlOworICAgIGxheWVyX2pzb25fdmVyc2lvbiBqc29uX3ZlcnNpb24gPSB7MCwgMCwgMH07CisgICAgY2hhciAqdmVyc190b2s7CisgICAgY0pTT04gKmRpc2FibGVfZW52aXJvbm1lbnQgPSBOVUxMOworICAgIGl0ZW0gPSBjSlNPTl9HZXRPYmplY3RJdGVtKGpzb24sICJmaWxlX2Zvcm1hdF92ZXJzaW9uIik7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgY2hhciAqZmlsZV92ZXJzID0gY0pTT05fUHJpbnRVbmZvcm1hdHRlZChpdGVtKTsKKyAgICBpZiAoTlVMTCA9PSBmaWxlX3ZlcnMpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsICJGb3VuZCBtYW5pZmVzdCBmaWxlICVzLCB2ZXJzaW9uICVzIiwgZmlsZW5hbWUsIGZpbGVfdmVycyk7CisgICAgLy8gR2V0IHRoZSBtYWpvci9taW5vci9hbmQgcGF0Y2ggYXMgaW50ZWdlcnMgZm9yIGVhc2llciBjb21wYXJpc29uCisgICAgdmVyc190b2sgPSBzdHJ0b2soZmlsZV92ZXJzLCAiLlwiXG5cciIpOworICAgIGlmIChOVUxMICE9IHZlcnNfdG9rKSB7CisgICAgICAgIGpzb25fdmVyc2lvbi5tYWpvciA9ICh1aW50MTZfdClhdG9pKHZlcnNfdG9rKTsKKyAgICAgICAgdmVyc190b2sgPSBzdHJ0b2soTlVMTCwgIi5cIlxuXHIiKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gdmVyc190b2spIHsKKyAgICAgICAgICAgIGpzb25fdmVyc2lvbi5taW5vciA9ICh1aW50MTZfdClhdG9pKHZlcnNfdG9rKTsKKyAgICAgICAgICAgIHZlcnNfdG9rID0gc3RydG9rKE5VTEwsICIuXCJcblxyIik7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSB2ZXJzX3RvaykgeworICAgICAgICAgICAgICAgIGpzb25fdmVyc2lvbi5wYXRjaCA9ICh1aW50MTZfdClhdG9pKHZlcnNfdG9rKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghaXNWYWxpZExheWVySnNvblZlcnNpb24oJmpzb25fdmVyc2lvbikpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJsb2FkZXJBZGRMYXllclByb3BlcnRpZXM6ICVzIGludmFsaWQgbGF5ZXIgbWFuaWZlc3QgZmlsZSB2ZXJzaW9uICVkLiVkLiVkLiAgTWF5IGNhdXNlIGVycm9ycy4iLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICBqc29uX3ZlcnNpb24ubWFqb3IsIGpzb25fdmVyc2lvbi5taW5vciwganNvbl92ZXJzaW9uLnBhdGNoKTsKKyAgICB9CisgICAgY0pTT05fRnJlZShmaWxlX3ZlcnMpOworCisgICAgLy8gSWYgImxheWVycyIgaXMgcHJlc2VudCwgcmVhZCBpbiB0aGUgYXJyYXkgb2YgbGF5ZXIgb2JqZWN0cworICAgIGxheWVyc19ub2RlID0gY0pTT05fR2V0T2JqZWN0SXRlbShqc29uLCAibGF5ZXJzIik7CisgICAgaWYgKGxheWVyc19ub2RlICE9IE5VTEwpIHsKKyAgICAgICAgaW50IG51bUl0ZW1zID0gY0pTT05fR2V0QXJyYXlTaXplKGxheWVyc19ub2RlKTsKKyAgICAgICAgaWYgKCFsYXllckpzb25TdXBwb3J0c011bHRpcGxlTGF5ZXJzKCZqc29uX3ZlcnNpb24pKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgICAgIGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgImxvYWRlckFkZExheWVyUHJvcGVydGllczogXCdsYXllcnNcJyB0YWcgbm90IHN1cHBvcnRlZCB1bnRpbCBmaWxlIHZlcnNpb24gMS4wLjEsIGJ1dCAlcyBpcyByZXBvcnRpbmcgdmVyc2lvbiAlcyIsCisgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZpbGVfdmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgY3VyTGF5ZXIgPSAwOyBjdXJMYXllciA8IG51bUl0ZW1zOyBjdXJMYXllcisrKSB7CisgICAgICAgICAgICBsYXllcl9ub2RlID0gY0pTT05fR2V0QXJyYXlJdGVtKGxheWVyc19ub2RlLCBjdXJMYXllcik7CisgICAgICAgICAgICBpZiAobGF5ZXJfbm9kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlckFkZExheWVyUHJvcGVydGllczogQ2FuIG5vdCBmaW5kICdsYXllcnMnIGFycmF5IGVsZW1lbnQgJWQgb2JqZWN0IGluIG1hbmlmZXN0IEpTT04gZmlsZSAlcy4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyB0aGlzIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGF5ZXIsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IGxvYWRlclJlYWRMYXllckpzb24oaW5zdCwgbGF5ZXJfaW5zdGFuY2VfbGlzdCwgbGF5ZXJfbm9kZSwganNvbl92ZXJzaW9uLCBpdGVtLCBkaXNhYmxlX2Vudmlyb25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19pbXBsaWNpdCwgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB0cnkgdG8gcmVhZCBpbiBpbmRpdmlkdWFsIGxheWVycworICAgICAgICBsYXllcl9ub2RlID0gY0pTT05fR2V0T2JqZWN0SXRlbShqc29uLCAibGF5ZXIiKTsKKyAgICAgICAgaWYgKGxheWVyX25vZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyQWRkTGF5ZXJQcm9wZXJ0aWVzOiBDYW4gbm90IGZpbmQgJ2xheWVyJyBvYmplY3QgaW4gbWFuaWZlc3QgSlNPTiBmaWxlICVzLiAgU2tpcHBpbmcgdGhpcyBmaWxlLiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgImxheWVyIiBvYmplY3RzIGluIHRoZSBmaWxlIHRvIGdldCBhIGNvdW50IG9mIHRoZW0KKyAgICAgICAgLy8gZmlyc3QuCisgICAgICAgIHVpbnQxNl90IGxheWVyX2NvdW50ID0gMDsKKyAgICAgICAgY0pTT04gKnRlbXBOb2RlID0gbGF5ZXJfbm9kZTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdGVtcE5vZGUgPSB0ZW1wTm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGxheWVyX2NvdW50Kys7CisgICAgICAgIH0gd2hpbGUgKHRlbXBOb2RlICE9IE5VTEwpOworCisgICAgICAgIC8vIFRocm93IGEgd2FybmluZyBpZiB3ZSBlbmNvdW50ZXIgbXVsdGlwbGUgImxheWVyIiBvYmplY3RzIGluIGZpbGUKKyAgICAgICAgLy8gdmVyc2lvbnMgbmV3ZXIgdGhhbiAxLjAuMC4gIEhhdmluZyBtdWx0aXBsZSBvYmplY3RzIHdpdGggdGhlIHNhbWUKKyAgICAgICAgLy8gbmFtZSBhdCB0aGUgc2FtZSBsZXZlbCBpcyBhY3R1YWxseSBhIEpTT04gc3RhbmRhcmQgdmlvbGF0aW9uLgorICAgICAgICBpZiAobGF5ZXJfY291bnQgPiAxICYmIGxheWVySnNvblN1cHBvcnRzTXVsdGlwbGVMYXllcnMoJmpzb25fdmVyc2lvbikpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJBZGRMYXllclByb3BlcnRpZXM6IE11bHRpcGxlICdsYXllcicgbm9kZXMgYXJlIGRlcHJlY2F0ZWQgc3RhcnRpbmcgaW4gZmlsZSB2ZXJzaW9uIFwiMS4wLjFcIi4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSB1c2UgJ2xheWVycycgOiBbXSBhcnJheSBpbnN0ZWFkIGluICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsb2FkZXJSZWFkTGF5ZXJKc29uKGluc3QsIGxheWVyX2luc3RhbmNlX2xpc3QsIGxheWVyX25vZGUsIGpzb25fdmVyc2lvbiwgaXRlbSwgZGlzYWJsZV9lbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2ltcGxpY2l0LCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgbGF5ZXJfbm9kZSA9IGxheWVyX25vZGUtPm5leHQ7CisgICAgICAgICAgICB9IHdoaWxlIChsYXllcl9ub2RlICE9IE5VTEwpOworICAgICAgICB9CisgICAgfQorCitvdXQ6CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBEZXRlcm1pbmVEYXRhRmlsZVBhdGhTaXplKGNvbnN0IGNoYXIgKmN1cl9wYXRoLCBzaXplX3QgcmVsYXRpdmVfcGF0aF9zaXplKSB7CisgICAgc2l6ZV90IHBhdGhfc2l6ZSA9IDA7CisKKyAgICBpZiAoTlVMTCAhPSBjdXJfcGF0aCkgeworICAgICAgICAvLyBGb3IgZWFjaCBmb2xkZXIgaW4gY3VyX3BhdGgsIChkZXRlY3RlZCBieSBmaW5kaW5nIGFkZGl0aW9uYWwKKyAgICAgICAgLy8gcGF0aCBzZXBhcmF0b3JzIGluIHRoZSBzdHJpbmcpIHdlIG5lZWQgdG8gYWRkIHRoZSByZWxhdGl2ZSBwYXRoIG9uCisgICAgICAgIC8vIHRoZSBlbmQuICBQbHVzLCBsZWF2ZSBhbiBhZGRpdGlvbmFsIHR3byBzbG90cyBvbiB0aGUgZW5kIHRvIGFkZCBhbgorICAgICAgICAvLyBhZGRpdGlvbmFsIGRpcmVjdG9yeSBzbGFzaCBhbmQgcGF0aCBzZXBhcmF0b3IgaWYgbmVlZGVkCisgICAgICAgIHBhdGhfc2l6ZSArPSBzdHJsZW4oY3VyX3BhdGgpICsgcmVsYXRpdmVfcGF0aF9zaXplICsgMjsKKyAgICAgICAgZm9yIChjb25zdCBjaGFyICp4ID0gY3VyX3BhdGg7ICp4OyArK3gpIHsKKyAgICAgICAgICAgIGlmICgqeCA9PSBQQVRIX1NFUEFSQVRPUikgeworICAgICAgICAgICAgICAgIHBhdGhfc2l6ZSArPSByZWxhdGl2ZV9wYXRoX3NpemUgKyAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhdGhfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIENvcHlEYXRhRmlsZVBhdGgoY29uc3QgY2hhciAqY3VyX3BhdGgsIGNvbnN0IGNoYXIgKnJlbGF0aXZlX3BhdGgsIHNpemVfdCByZWxhdGl2ZV9wYXRoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3V0cHV0X3BhdGgpIHsKKyAgICBpZiAoTlVMTCAhPSBjdXJfcGF0aCkgeworICAgICAgICB1aW50MzJfdCBzdGFydCA9IDA7CisgICAgICAgIHVpbnQzMl90IHN0b3AgPSAwOworICAgICAgICBjaGFyICpjdXJfd3JpdGUgPSAqb3V0cHV0X3BhdGg7CisKKyAgICAgICAgd2hpbGUgKGN1cl9wYXRoW3N0YXJ0XSAhPSAnXDAnKSB7CisgICAgICAgICAgICB3aGlsZSAoY3VyX3BhdGhbc3RhcnRdID09IFBBVEhfU0VQQVJBVE9SKSB7CisgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3AgPSBzdGFydDsKKyAgICAgICAgICAgIHdoaWxlIChjdXJfcGF0aFtzdG9wXSAhPSBQQVRIX1NFUEFSQVRPUiAmJiBjdXJfcGF0aFtzdG9wXSAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgc3RvcCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHMgPSBzdG9wIC0gc3RhcnQ7CisgICAgICAgICAgICBpZiAocykgeworICAgICAgICAgICAgICAgIG1lbWNweShjdXJfd3JpdGUsICZjdXJfcGF0aFtzdGFydF0sIHMpOworICAgICAgICAgICAgICAgIGN1cl93cml0ZSArPSBzOworCisgICAgICAgICAgICAgICAgLy8gSWYgbGFzdCBzeW1ib2wgd3JpdHRlbiB3YXMgbm90IGEgZGlyZWN0b3J5IHN5bWJvbCwgYWRkIGl0LgorICAgICAgICAgICAgICAgIGlmICgqKGN1cl93cml0ZSAtIDEpICE9IERJUkVDVE9SWV9TWU1CT0wpIHsKKyAgICAgICAgICAgICAgICAgICAgKmN1cl93cml0ZSsrID0gRElSRUNUT1JZX1NZTUJPTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmVfcGF0aF9zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY3VyX3dyaXRlLCByZWxhdGl2ZV9wYXRoLCByZWxhdGl2ZV9wYXRoX3NpemUpOworICAgICAgICAgICAgICAgICAgICBjdXJfd3JpdGUgKz0gcmVsYXRpdmVfcGF0aF9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY3VyX3dyaXRlKysgPSBQQVRIX1NFUEFSQVRPUjsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHN0b3A7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKm91dHB1dF9wYXRoID0gY3VyX3dyaXRlOworICAgIH0KK30KKworLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIGluIHRoZSBkYXRhIGZpbGUgbGlzdC4gIElmIG5vdCwgYWRkIHNvbWUuCitzdGF0aWMgaW5saW5lIFZrUmVzdWx0IENoZWNrQW5kQWRqdXN0RGF0YUZpbGVMaXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZGF0YV9maWxlcyAqb3V0X2ZpbGVzKSB7CisgICAgaWYgKG91dF9maWxlcy0+Y291bnQgPT0gMCkgeworICAgICAgICBvdXRfZmlsZXMtPmZpbGVuYW1lX2xpc3QgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCA2NCAqIHNpemVvZihjaGFyICopLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DT01NQU5EKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gb3V0X2ZpbGVzLT5maWxlbmFtZV9saXN0KSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2tBbmRBZGp1c3REYXRhRmlsZUxpc3Q6IEZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgbWFuaWZlc3QgZmlsZSBuYW1lIGxpc3QiKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgb3V0X2ZpbGVzLT5hbGxvY19jb3VudCA9IDY0OworICAgIH0gZWxzZSBpZiAob3V0X2ZpbGVzLT5jb3VudCA9PSBvdXRfZmlsZXMtPmFsbG9jX2NvdW50KSB7CisgICAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IG91dF9maWxlcy0+YWxsb2NfY291bnQgKiBzaXplb2YoY2hhciAqKSAqIDI7CisgICAgICAgIHZvaWQgKm5ld19wdHIgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9yZWFsbG9jKGluc3QsIG91dF9maWxlcy0+ZmlsZW5hbWVfbGlzdCwgb3V0X2ZpbGVzLT5hbGxvY19jb3VudCAqIHNpemVvZihjaGFyICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2l6ZSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCk7CisgICAgICAgIGlmIChOVUxMID09IG5ld19wdHIpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJDaGVja0FuZEFkanVzdERhdGFGaWxlTGlzdDogRmFpbGVkIHRvIHJlYWxsb2NhdGUgc3BhY2UgZm9yIG1hbmlmZXN0IGZpbGUgbmFtZSBsaXN0Iik7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG91dF9maWxlcy0+ZmlsZW5hbWVfbGlzdCA9IG5ld19wdHI7CisgICAgICAgIG91dF9maWxlcy0+YWxsb2NfY291bnQgKj0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworLy8gSWYgdGhlIGZpbGUgZm91bmQgaXMgYSBtYW5pZmVzdCBmaWxlIG5hbWUsIGFkZCBpdCB0byB0aGUgb3V0X2ZpbGVzIG1hbmlmZXN0IGxpc3QuCitzdGF0aWMgVmtSZXN1bHQgQWRkSWZNYW5pZmVzdEZpbGUoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgY2hhciAqZmlsZV9uYW1lLCBzdHJ1Y3QgbG9hZGVyX2RhdGFfZmlsZXMgKm91dF9maWxlcykgeworICAgIFZrUmVzdWx0IHZrX3Jlc3VsdCA9IFZLX1NVQ0NFU1M7CisKKyAgICBpZiAoTlVMTCA9PSBmaWxlX25hbWUgfHwgTlVMTCA9PSBvdXRfZmlsZXMpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwgIkFkZElmTWFuZmlzdEZpbGU6IFJlY2VpdmVkIE5VTEwgcG9pbnRlciIpOworICAgICAgICB2a19yZXN1bHQgPSBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIExvb2sgZm9yIGZpbGVzIGVuZGluZyB3aXRoICIuanNvbiIgc3VmZml4CisgICAgc2l6ZV90IG5hbWVfbGVuID0gc3RybGVuKGZpbGVfbmFtZSk7CisgICAgY29uc3QgY2hhciAqbmFtZV9zdWZmaXggPSBmaWxlX25hbWUgKyBuYW1lX2xlbiAtIDU7CisgICAgaWYgKChuYW1lX2xlbiA8IDUpIHx8IDAgIT0gc3RybmNtcChuYW1lX3N1ZmZpeCwgIi5qc29uIiwgNSkpIHsKKyAgICAgICAgLy8gVXNlIGluY29tcGxldGUgdG8gaW5kaWNhdGUgaW52YWxpZCBuYW1lLCBidXQgdG8ga2VlcCBnb2luZy4KKyAgICAgICAgdmtfcmVzdWx0ID0gVktfSU5DT01QTEVURTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLy8gQ2hlY2sgYW5kIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBtYW5pZmVzdCBsaXN0IGlmIG5lY2Vzc2FyeQorICAgIHZrX3Jlc3VsdCA9IENoZWNrQW5kQWRqdXN0RGF0YUZpbGVMaXN0KGluc3QsIG91dF9maWxlcyk7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdmtfcmVzdWx0KSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIG91dF9maWxlcy0+ZmlsZW5hbWVfbGlzdFtvdXRfZmlsZXMtPmNvdW50XSA9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIHN0cmxlbihmaWxlX25hbWUpICsgMSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCk7CisgICAgaWYgKG91dF9maWxlcy0+ZmlsZW5hbWVfbGlzdFtvdXRfZmlsZXMtPmNvdW50XSA9PSBOVUxMKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsICJBZGRJZk1hbmZpc3RGaWxlOiBGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIG1hbmlmZXN0IGZpbGUgJWQgbGlzdCIsCisgICAgICAgICAgICAgICAgICAgb3V0X2ZpbGVzLT5jb3VudCk7CisgICAgICAgIHZrX3Jlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc3RyY3B5KG91dF9maWxlcy0+ZmlsZW5hbWVfbGlzdFtvdXRfZmlsZXMtPmNvdW50KytdLCBmaWxlX25hbWUpOworCitvdXQ6CisKKyAgICByZXR1cm4gdmtfcmVzdWx0OworfQorCitzdGF0aWMgVmtSZXN1bHQgQWRkRGF0YUZpbGVzSW5QYXRoKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNoYXIgKnNlYXJjaF9wYXRoLCBib29sIGlzX2RpcmVjdG9yeV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2RhdGFfZmlsZXMgKm91dF9maWxlcykgeworICAgIFZrUmVzdWx0IHZrX3Jlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgRElSICpkaXJfc3RyZWFtID0gTlVMTDsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkaXJfZW50cnk7CisgICAgY2hhciAqY3VyX2ZpbGU7CisgICAgY2hhciAqbmV4dF9maWxlOworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciBmdWxsX3BhdGhbMjA0OF07CisjaWZuZGVmIF9XSU4zMgorICAgIGNoYXIgdGVtcF9wYXRoWzIwNDhdOworI2VuZGlmCisKKyAgICAvLyBOb3csIHBhcnNlIHRoZSBwYXRocworICAgIG5leHRfZmlsZSA9IHNlYXJjaF9wYXRoOworICAgIHdoaWxlIChOVUxMICE9IG5leHRfZmlsZSAmJiAqbmV4dF9maWxlICE9ICdcMCcpIHsKKyAgICAgICAgbmFtZSA9IE5VTEw7CisgICAgICAgIGN1cl9maWxlID0gbmV4dF9maWxlOworICAgICAgICBuZXh0X2ZpbGUgPSBsb2FkZXJfZ2V0X25leHRfcGF0aChjdXJfZmlsZSk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5hbWUgaW4gdGhlIGxpc3QgYW5kIHZlcmlmeSBpdCdzIHZhbGlkCisgICAgICAgIGlmIChpc19kaXJlY3RvcnlfbGlzdCkgeworICAgICAgICAgICAgZGlyX3N0cmVhbSA9IG9wZW5kaXIoY3VyX2ZpbGUpOworICAgICAgICAgICAgaWYgKE5VTEwgPT0gZGlyX3N0cmVhbSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICBkaXJfZW50cnkgPSByZWFkZGlyKGRpcl9zdHJlYW0pOworICAgICAgICAgICAgICAgIGlmIChOVUxMID09IGRpcl9lbnRyeSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuYW1lID0gJihkaXJfZW50cnktPmRfbmFtZVswXSk7CisgICAgICAgICAgICAgICAgbG9hZGVyX2dldF9mdWxscGF0aChuYW1lLCBjdXJfZmlsZSwgc2l6ZW9mKGZ1bGxfcGF0aCksIGZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IGZ1bGxfcGF0aDsKKworICAgICAgICAgICAgICAgIFZrUmVzdWx0IGxvY2FsX3JlczsKKyAgICAgICAgICAgICAgICBsb2NhbF9yZXMgPSBBZGRJZk1hbmlmZXN0RmlsZShpbnN0LCBuYW1lLCBvdXRfZmlsZXMpOworCisgICAgICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBtZWFucyB0aGlzIHdhcyBub3QgYSB2YWxpZCBkYXRhIGZpbGUuCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3JlcyA9PSBWS19JTkNPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxfcmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgdmtfcmVzdWx0ID0gbG9jYWxfcmVzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9zZWRpcihkaXJfc3RyZWFtKTsKKyAgICAgICAgICAgIGlmICh2a19yZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgbmFtZSA9IGN1cl9maWxlOworI2Vsc2UKKyAgICAgICAgICAgIC8vIE9ubHkgTGludXggaGFzIHJlbGF0aXZlIHBhdGhzLCBtYWtlIGEgY29weSBvZiBsb2NhdGlvbiBzbyBpdCBpc24ndCBtb2RpZmllZAorICAgICAgICAgICAgc2l6ZV90IHN0cl9sZW47CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBuZXh0X2ZpbGUpIHsKKyAgICAgICAgICAgICAgICBzdHJfbGVuID0gbmV4dF9maWxlIC0gY3VyX2ZpbGUgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJfbGVuID0gc3RybGVuKGN1cl9maWxlKSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyX2xlbiA+IHNpemVvZih0ZW1wX3BhdGgpKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVCwgMCwgIkFkZERhdGFGaWxlc0luUGF0aDogUGF0aCB0byAlcyB0b28gbG9uZ1xuIiwgY3VyX2ZpbGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY3B5KHRlbXBfcGF0aCwgY3VyX2ZpbGUpOworICAgICAgICAgICAgbmFtZSA9IHRlbXBfcGF0aDsKKyNlbmRpZgorICAgICAgICAgICAgbG9hZGVyX2dldF9mdWxscGF0aChjdXJfZmlsZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfcGF0aCksIGZ1bGxfcGF0aCk7CisgICAgICAgICAgICBuYW1lID0gZnVsbF9wYXRoOworCisgICAgICAgICAgICBWa1Jlc3VsdCBsb2NhbF9yZXM7CisgICAgICAgICAgICBsb2NhbF9yZXMgPSBBZGRJZk1hbmlmZXN0RmlsZShpbnN0LCBuYW1lLCBvdXRfZmlsZXMpOworCisgICAgICAgICAgICAvLyBJbmNvbXBsZXRlIG1lYW5zIHRoaXMgd2FzIG5vdCBhIHZhbGlkIGRhdGEgZmlsZS4KKyAgICAgICAgICAgIGlmIChsb2NhbF9yZXMgPT0gVktfSU5DT01QTEVURSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbF9yZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHZrX3Jlc3VsdCA9IGxvY2FsX3JlczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworb3V0OgorCisgICAgcmV0dXJuIHZrX3Jlc3VsdDsKK30KKworLy8gTG9vayBmb3IgZGF0YSBmaWxlcyBpbiB0aGUgcHJvdmlkZWQgcGF0aHMsIGJ1dCBmaXJzdCBjaGVjayB0aGUgZW52aXJvbm1lbnQgb3ZlcnJpZGUgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCB1c2UgdGhhdAorLy8gaW5zdGVhZC4KK3N0YXRpYyBWa1Jlc3VsdCBSZWFkRGF0YUZpbGVzSW5TZWFyY2hQYXRocyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBlbnVtIGxvYWRlcl9kYXRhX2ZpbGVzX3R5cGUgZGF0YV9maWxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW52X292ZXJyaWRlLCBjb25zdCBjaGFyICpwYXRoX292ZXJyaWRlLCBjb25zdCBjaGFyICpyZWxhdGl2ZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpvdmVycmlkZV9hY3RpdmUsIHN0cnVjdCBsb2FkZXJfZGF0YV9maWxlcyAqb3V0X2ZpbGVzKSB7CisgICAgVmtSZXN1bHQgdmtfcmVzdWx0ID0gVktfU1VDQ0VTUzsKKyAgICBib29sIGlzX2RpcmVjdG9yeV9saXN0ID0gdHJ1ZTsKKyAgICBib29sIGlzX2ljZCA9IChkYXRhX2ZpbGVfdHlwZSA9PSBMT0FERVJfREFUQV9GSUxFX01BTklGRVNUX0lDRCk7CisgICAgY2hhciAqb3ZlcnJpZGVfZW52ID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpvdmVycmlkZV9wYXRoID0gTlVMTDsKKyAgICBzaXplX3Qgc2VhcmNoX3BhdGhfc2l6ZSA9IDA7CisgICAgY2hhciAqc2VhcmNoX3BhdGggPSBOVUxMOworICAgIGNoYXIgKmN1cl9wYXRoX3B0ciA9IE5VTEw7CisgICAgc2l6ZV90IHJlbF9zaXplID0gMDsKKyNpZm5kZWYgX1dJTjMyCisgICAgYm9vbCB4ZGdjb25maWdfYWxsb2MgPSB0cnVlOworICAgIGJvb2wgeGRnZGF0YV9hbGxvYyA9IHRydWU7CisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKyAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggc3BhY2UgaXMgbmVlZGVkIHRvIGdlbmVyYXRlIHRoZSBmdWxsIHNlYXJjaCBwYXRoCisgICAgLy8gZm9yIHRoZSBjdXJyZW50IG1hbmlmZXN0IGZpbGVzLgorICAgIGNoYXIgKnhkZ2NvbmZkaXJzID0gbG9hZGVyX3NlY3VyZV9nZXRlbnYoIlhER19DT05GSUdfRElSUyIsIGluc3QpOworICAgIGNoYXIgKnhkZ2RhdGFkaXJzID0gbG9hZGVyX3NlY3VyZV9nZXRlbnYoIlhER19EQVRBX0RJUlMiLCBpbnN0KTsKKyAgICBjaGFyICp4ZGdkYXRhaG9tZSA9IGxvYWRlcl9zZWN1cmVfZ2V0ZW52KCJYREdfREFUQV9IT01FIiwgaW5zdCk7CisgICAgY2hhciAqaG9tZSA9IE5VTEw7CisgICAgY2hhciogaG9tZV9yb290ID0gTlVMTDsKKworICAgIGlmICh4ZGdjb25mZGlycyA9PSBOVUxMKSB7CisgICAgICAgIHhkZ2NvbmZpZ19hbGxvYyA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoeGRnZGF0YWRpcnMgPT0gTlVMTCkgeworICAgICAgICB4ZGdkYXRhX2FsbG9jID0gZmFsc2U7CisgICAgfQorICAgIGlmICh4ZGdjb25mZGlycyA9PSBOVUxMIHx8IHhkZ2NvbmZkaXJzWzBdID09ICdcMCcpIHsKKyAgICAgICAgeGRnY29uZmRpcnMgPSBGQUxMQkFDS19DT05GSUdfRElSUzsKKyAgICB9CisgICAgaWYgKHhkZ2RhdGFkaXJzID09IE5VTEwgfHwgeGRnZGF0YWRpcnNbMF0gPT0gJ1wwJykgeworICAgICAgICB4ZGdkYXRhZGlycyA9IEZBTExCQUNLX0RBVEFfRElSUzsKKyAgICB9CisKKyAgICAvLyBPbmx5IHVzZSBIT01FIGlmIFhER19EQVRBX0hPTUUgaXMgbm90IHByZXNlbnQgb24gdGhlIHN5c3RlbQorICAgIGlmIChOVUxMID09IHhkZ2RhdGFob21lKSB7CisgICAgICAgIGhvbWUgPSBsb2FkZXJfc2VjdXJlX2dldGVudigiSE9NRSIsIGluc3QpOworICAgICAgICBpZiAoaG9tZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBob21lX3Jvb3QgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBzdHJsZW4oaG9tZSkgKyAxNCwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCk7CisgICAgICAgICAgICBpZiAoaG9tZV9yb290ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB2a19yZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJjcHkoaG9tZV9yb290LCBob21lKTsKKyAgICAgICAgICAgIHN0cmNhdChob21lX3Jvb3QsICIvLmxvY2FsL3NoYXJlIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChwYXRoX292ZXJyaWRlICE9IE5VTEwpIHsKKyAgICAgICAgb3ZlcnJpZGVfcGF0aCA9IHBhdGhfb3ZlcnJpZGU7CisgICAgfSBlbHNlIGlmIChlbnZfb3ZlcnJpZGUgIT0gTlVMTCkgeworI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgaWYgKGdldGV1aWQoKSAhPSBnZXR1aWQoKSB8fCBnZXRlZ2lkKCkgIT0gZ2V0Z2lkKCkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGFsbG93IHNldHVpZCBhcHBzIHRvIHVzZSB0aGUgZW52IHZhcjoKKyAgICAgICAgICAgIGVudl9vdmVycmlkZSA9IE5VTEw7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIG92ZXJyaWRlX2VudiA9IGxvYWRlcl9zZWN1cmVfZ2V0ZW52KGVudl9vdmVycmlkZSwgaW5zdCk7CisKKyAgICAgICAgICAgIC8vIFRoZSBJQ0Qgb3ZlcnJpZGUgaXMgYWN0dWFsbHkgYSBzcGVjaWZpYyBsaXN0IG9mIGZpbGVuYW1lcywgbm90IGRpcmVjdG9yaWVzCisgICAgICAgICAgICBpZiAoaXNfaWNkICYmIE5VTEwgIT0gb3ZlcnJpZGVfZW52KSB7CisgICAgICAgICAgICAgICAgaXNfZGlyZWN0b3J5X2xpc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG92ZXJyaWRlX3BhdGggPSBvdmVycmlkZV9lbnY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBZGQgdHdvIGJ5IGRlZmF1bHQgZm9yIE5VTEwgdGVybWluYXRvciBhbmQgb25lIHBhdGggc2VwYXJhdG9yIG9uIGVuZCAoanVzdCBpbiBjYXNlKQorICAgIHNlYXJjaF9wYXRoX3NpemUgPSAyOworCisgICAgLy8gSWYgdGhlcmUncyBhbiBvdmVycmlkZSwgdXNlIHRoYXQgKGFuZCB0aGUgbG9jYWwgZm9sZGVyIGlmIHJlcXVpcmVkKSBhbmQgbm90aGluZyBlbHNlCisgICAgaWYgKE5VTEwgIT0gb3ZlcnJpZGVfcGF0aCkgeworICAgICAgICAvLyBMb2NhbCBmb2xkZXIgYW5kIG51bGwgdGVybWluYXRvcgorICAgICAgICBzZWFyY2hfcGF0aF9zaXplICs9IHN0cmxlbihvdmVycmlkZV9wYXRoKSArIDE7CisgICAgfSBlbHNlIGlmIChOVUxMID09IHJlbGF0aXZlX2xvY2F0aW9uKSB7CisgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gb3ZlcnJpZGUsIGFuZCBubyByZWxhdGl2ZSBsb2NhdGlvbiwgYmFpbCBvdXQuICBUaGlzIGlzIHVzdWFsbHkKKyAgICAgICAgLy8gdGhlIGNhc2Ugd2hlbiB3ZSdyZSBvbiBXaW5kb3dzIGFuZCB0aGUgZGVmYXVsdCBwYXRoIGlzIHRvIHVzZSB0aGUgcmVnaXN0cnkuCisgICAgICAgIGdvdG8gb3V0OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFkZCB0aGUgZ2VuZXJhbCBzZWFyY2ggZm9sZGVycyAod2l0aCB0aGUgYXBwcm9wcmlhdGUgcmVsYXRpdmUgZm9sZGVyIGFkZGVkKQorICAgICAgICByZWxfc2l6ZSA9IHN0cmxlbihyZWxhdGl2ZV9sb2NhdGlvbik7CisgICAgICAgIGlmIChyZWxfc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfSBlbHNlIHsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAgICAgICAgIHNlYXJjaF9wYXRoX3NpemUgKz0gTUFYUEFUSExFTjsKKyNlbmRpZgorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgICAgIHNlYXJjaF9wYXRoX3NpemUgKz0gRGV0ZXJtaW5lRGF0YUZpbGVQYXRoU2l6ZSh4ZGdjb25mZGlycywgcmVsX3NpemUpOworICAgICAgICAgICAgc2VhcmNoX3BhdGhfc2l6ZSArPSBEZXRlcm1pbmVEYXRhRmlsZVBhdGhTaXplKHhkZ2RhdGFkaXJzLCByZWxfc2l6ZSk7CisgICAgICAgICAgICBzZWFyY2hfcGF0aF9zaXplICs9IERldGVybWluZURhdGFGaWxlUGF0aFNpemUoU1lTQ09ORkRJUiwgcmVsX3NpemUpOworI2lmIGRlZmluZWQoRVhUUkFTWVNDT05GRElSKQorICAgICAgICAgICAgc2VhcmNoX3BhdGhfc2l6ZSArPSBEZXRlcm1pbmVEYXRhRmlsZVBhdGhTaXplKEVYVFJBU1lTQ09ORkRJUiwgcmVsX3NpemUpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoaXNfZGlyZWN0b3J5X2xpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoIUlzSGlnaEludGVncml0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9wYXRoX3NpemUgKz0gRGV0ZXJtaW5lRGF0YUZpbGVQYXRoU2l6ZSh4ZGdkYXRhaG9tZSwgcmVsX3NpemUpOworICAgICAgICAgICAgICAgICAgICBzZWFyY2hfcGF0aF9zaXplICs9IERldGVybWluZURhdGFGaWxlUGF0aFNpemUoaG9tZV9yb290LCByZWxfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSB0aGUgcmVxdWlyZWQgc3BhY2UKKyAgICBzZWFyY2hfcGF0aCA9IGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIHNlYXJjaF9wYXRoX3NpemUsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0NPTU1BTkQpOworICAgIGlmIChOVUxMID09IHNlYXJjaF9wYXRoKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIlJlYWREYXRhRmlsZXNJblNlYXJjaFBhdGhzOiBGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHNlYXJjaCBwYXRoIG9mIGxlbmd0aCAlZCIsICh1aW50MzJfdClzZWFyY2hfcGF0aF9zaXplKTsKKyAgICAgICAgdmtfcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBjdXJfcGF0aF9wdHIgPSBzZWFyY2hfcGF0aDsKKworICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIHBhdGhzIHRvIHRoZSBsaXN0CisgICAgaWYgKE5VTEwgIT0gb3ZlcnJpZGVfcGF0aCkgeworICAgICAgICBzdHJjcHkoY3VyX3BhdGhfcHRyLCBvdmVycmlkZV9wYXRoKTsKKyAgICB9IGVsc2UgeworI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgaWYgKHJlbF9zaXplID4gMCkgeworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICAgICAgICAgICAgLy8gQWRkIHRoZSBidW5kbGUncyBSZXNvdXJjZXMgZGlyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlYXJjaCBwYXRoLgorICAgICAgICAgICAgLy8gTG9va3MgZm9yIG1hbmlmZXN0cyBpbiB0aGUgYnVuZGxlIGZpcnN0LCBiZWZvcmUgYW55IHN5c3RlbSBkaXJlY3Rvcmllcy4KKyAgICAgICAgICAgIENGQnVuZGxlUmVmIG1haW5fYnVuZGxlID0gQ0ZCdW5kbGVHZXRNYWluQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBtYWluX2J1bmRsZSkgeworICAgICAgICAgICAgICAgIENGVVJMUmVmIHJlZiA9IENGQnVuZGxlQ29weVJlc291cmNlc0RpcmVjdG9yeVVSTChtYWluX2J1bmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gcmVmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihyZWYsIFRSVUUsIChVSW50OCAqKWN1cl9wYXRoX3B0ciwgc2VhcmNoX3BhdGhfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9wYXRoX3B0ciArPSBzdHJsZW4oY3VyX3BhdGhfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjdXJfcGF0aF9wdHIrKyA9IERJUkVDVE9SWV9TWU1CT0w7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY3VyX3BhdGhfcHRyLCByZWxhdGl2ZV9sb2NhdGlvbiwgcmVsX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3BhdGhfcHRyICs9IHJlbF9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgKmN1cl9wYXRoX3B0cisrID0gUEFUSF9TRVBBUkFUT1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ0ZSZWxlYXNlKHJlZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBDb3B5RGF0YUZpbGVQYXRoKHhkZ2NvbmZkaXJzLCByZWxhdGl2ZV9sb2NhdGlvbiwgcmVsX3NpemUsICZjdXJfcGF0aF9wdHIpOworICAgICAgICAgICAgQ29weURhdGFGaWxlUGF0aChTWVNDT05GRElSLCByZWxhdGl2ZV9sb2NhdGlvbiwgcmVsX3NpemUsICZjdXJfcGF0aF9wdHIpOworI2lmIGRlZmluZWQoRVhUUkFTWVNDT05GRElSKQorICAgICAgICAgICAgQ29weURhdGFGaWxlUGF0aChFWFRSQVNZU0NPTkZESVIsIHJlbGF0aXZlX2xvY2F0aW9uLCByZWxfc2l6ZSwgJmN1cl9wYXRoX3B0cik7CisjZW5kaWYKKyAgICAgICAgICAgIENvcHlEYXRhRmlsZVBhdGgoeGRnZGF0YWRpcnMsIHJlbGF0aXZlX2xvY2F0aW9uLCByZWxfc2l6ZSwgJmN1cl9wYXRoX3B0cik7CisgICAgICAgICAgICBpZiAoaXNfZGlyZWN0b3J5X2xpc3QpIHsKKyAgICAgICAgICAgICAgICBDb3B5RGF0YUZpbGVQYXRoKHhkZ2RhdGFob21lLCByZWxhdGl2ZV9sb2NhdGlvbiwgcmVsX3NpemUsICZjdXJfcGF0aF9wdHIpOworICAgICAgICAgICAgICAgIENvcHlEYXRhRmlsZVBhdGgoaG9tZV9yb290LCByZWxhdGl2ZV9sb2NhdGlvbiwgcmVsX3NpemUsICZjdXJfcGF0aF9wdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yCisgICAgICAgIC0tY3VyX3BhdGhfcHRyOworCisgICAgICAgIGFzc2VydChjdXJfcGF0aF9wdHIgLSBzZWFyY2hfcGF0aCA8IChwdHJkaWZmX3Qpc2VhcmNoX3BhdGhfc2l6ZSk7CisgICAgICAgICpjdXJfcGF0aF9wdHIgPSAnXDAnOworI2VuZGlmCisgICAgfQorCisgICAgLy8gUHJpbnQgb3V0IHRoZSBwYXRocyBiZWluZyBzZWFyY2hlZCBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZAorICAgIGlmIChzZWFyY2hfcGF0aF9zaXplID4gMCkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJSZWFkRGF0YUZpbGVzSW5TZWFyY2hQYXRoczogU2VhcmNoaW5nIHRoZSBmb2xsb3dpbmcgcGF0aHMgZm9yIG1hbmlmZXN0IGZpbGVzOiAlc1xuIiwgc2VhcmNoX3BhdGgpOworICAgIH0KKworICAgIC8vIE5vdywgcGFyc2UgdGhlIHBhdGhzIGFuZCBhZGQgYW55IG1hbmlmZXN0IGZpbGVzIGZvdW5kIGluIHRoZW0uCisgICAgdmtfcmVzdWx0ID0gQWRkRGF0YUZpbGVzSW5QYXRoKGluc3QsIHNlYXJjaF9wYXRoLCBpc19kaXJlY3RvcnlfbGlzdCwgb3V0X2ZpbGVzKTsKKworICAgIGlmIChOVUxMICE9IG92ZXJyaWRlX3BhdGgpIHsKKyAgICAgICAgKm92ZXJyaWRlX2FjdGl2ZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm92ZXJyaWRlX2FjdGl2ZSA9IGZhbHNlOworICAgIH0KKworb3V0OgorCisgICAgaWYgKE5VTEwgIT0gb3ZlcnJpZGVfZW52KSB7CisgICAgICAgIGxvYWRlcl9mcmVlX2dldGVudihvdmVycmlkZV9lbnYsIGluc3QpOworICAgIH0KKyNpZm5kZWYgX1dJTjMyCisgICAgaWYgKHhkZ2NvbmZpZ19hbGxvYykgeworICAgICAgICBsb2FkZXJfZnJlZV9nZXRlbnYoeGRnY29uZmRpcnMsIGluc3QpOworICAgIH0KKyAgICBpZiAoeGRnZGF0YV9hbGxvYykgeworICAgICAgICBsb2FkZXJfZnJlZV9nZXRlbnYoeGRnZGF0YWRpcnMsIGluc3QpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSB4ZGdkYXRhaG9tZSkgeworICAgICAgICBsb2FkZXJfZnJlZV9nZXRlbnYoeGRnZGF0YWhvbWUsIGluc3QpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBob21lKSB7CisgICAgICAgIGxvYWRlcl9mcmVlX2dldGVudihob21lLCBpbnN0KTsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gaG9tZV9yb290KSB7CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgaG9tZV9yb290KTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChOVUxMICE9IHNlYXJjaF9wYXRoKSB7CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgc2VhcmNoX3BhdGgpOworICAgIH0KKworICAgIHJldHVybiB2a19yZXN1bHQ7Cit9CisKKyNpZmRlZiBfV0lOMzIKKy8vIFJlYWQgbWFuaWZlc3QgSlNPTiBmaWxlcyB1aW5nIHRoZSBXaW5kb3dzIGRyaXZlciBpbnRlcmZhY2UKK3N0YXRpYyBWa1Jlc3VsdCBSZWFkTWFuaWZlc3RzRnJvbUQzREFkYXB0ZXJzKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNoYXIgKipyZWdfZGF0YSwgUERXT1JEIHJlZ19kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90ICp2YWx1ZV9uYW1lKSB7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfSU5DT01QTEVURTsKKyAgICBMb2FkZXJFbnVtQWRhcHRlcnMyIGFkYXB0ZXJzID0gey5hZGFwdGVyX2NvdW50ID0gMCwgLmFkYXB0ZXJzID0gTlVMTH07CisgICAgTG9hZGVyUXVlcnlSZWdpc3RyeUluZm8gKmZ1bGxfaW5mbyA9IE5VTEw7CisgICAgc2l6ZV90IGZ1bGxfaW5mb19zaXplID0gMDsKKyAgICBjaGFyICpqc29uX3BhdGggPSBOVUxMOworICAgIHNpemVfdCBqc29uX3BhdGhfc2l6ZSA9IDA7CisKKyAgICBQRk5fTG9hZGVyRW51bUFkYXB0ZXJzMiBmcExvYWRlckVudW1BZGFwdGVyczIgPQorICAgICAgICAoUEZOX0xvYWRlckVudW1BZGFwdGVyczIpR2V0UHJvY0FkZHJlc3MoR2V0TW9kdWxlSGFuZGxlKCJnZGkzMi5kbGwiKSwgIkQzREtNVEVudW1BZGFwdGVyczIiKTsKKyAgICBQRk5fTG9hZGVyUXVlcnlBZGFwdGVySW5mbyBmcExvYWRlclF1ZXJ5QWRhcHRlckluZm8gPQorICAgICAgICAoUEZOX0xvYWRlclF1ZXJ5QWRhcHRlckluZm8pR2V0UHJvY0FkZHJlc3MoR2V0TW9kdWxlSGFuZGxlKCJnZGkzMi5kbGwiKSwgIkQzREtNVFF1ZXJ5QWRhcHRlckluZm8iKTsKKyAgICBpZiAoZnBMb2FkZXJFbnVtQWRhcHRlcnMyID09IE5VTEwgfHwgZnBMb2FkZXJRdWVyeUFkYXB0ZXJJbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBHZXQgYWxsIG9mIHRoZSBhZGFwdGVycworICAgIE5UU1RBVFVTIHN0YXR1cyA9IGZwTG9hZGVyRW51bUFkYXB0ZXJzMigmYWRhcHRlcnMpOworICAgIGlmIChzdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MgJiYgYWRhcHRlcnMuYWRhcHRlcl9jb3VudCA+IDApIHsKKyAgICAgICAgYWRhcHRlcnMuYWRhcHRlcnMgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBzaXplb2YoKmFkYXB0ZXJzLmFkYXB0ZXJzKSAqIGFkYXB0ZXJzLmFkYXB0ZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCk7CisgICAgICAgIGlmIChhZGFwdGVycy5hZGFwdGVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBmcExvYWRlckVudW1BZGFwdGVyczIoJmFkYXB0ZXJzKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBJZiB0aGF0IHdvcmtlZCwgd2UgbmVlZCB0byBnZXQgdGhlIG1hbmlmZXN0IGZpbGUocykgZm9yIGVhY2ggYWRhcHRlcgorICAgIGZvciAoVUxPTkcgaSA9IDA7IGkgPCBhZGFwdGVycy5hZGFwdGVyX2NvdW50OyArK2kpIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0IHF1ZXJ5IHNob3VsZCBqdXN0IGNoZWNrIGlmIHRoZSBmaWVsZCBleGlzdHMgYW5kIGhvdyBiaWcgaXQgaXMKKyAgICAgICAgTG9hZGVyUXVlcnlSZWdpc3RyeUluZm8gZmlsZW5hbWVfaW5mbyA9IHsKKyAgICAgICAgICAgIC5xdWVyeV90eXBlID0gTE9BREVSX1FVRVJZX1JFR0lTVFJZX0FEQVBURVJfS0VZLAorICAgICAgICAgICAgLnF1ZXJ5X2ZsYWdzID0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGVfcGF0aCA9IHRydWUsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC52YWx1ZV90eXBlID0gUkVHX01VTFRJX1NaLAorICAgICAgICAgICAgLnBoeXNpY2FsX2FkYXB0ZXJfaW5kZXggPSAwLAorICAgICAgICB9OworICAgICAgICB3Y3NuY3B5KGZpbGVuYW1lX2luZm8udmFsdWVfbmFtZSwgdmFsdWVfbmFtZSwgc2l6ZW9mKGZpbGVuYW1lX2luZm8udmFsdWVfbmFtZSkgLyBzaXplb2YoRFdPUkQpKTsKKyAgICAgICAgTG9hZGVyUXVlcnlBZGFwdGVySW5mbyBxdWVyeV9pbmZvID0geworICAgICAgICAgICAgLmhhbmRsZSA9IGFkYXB0ZXJzLmFkYXB0ZXJzW2ldLmhhbmRsZSwKKyAgICAgICAgICAgIC50eXBlID0gTE9BREVSX1FVRVJZX1RZUEVfUkVHSVNUUlksCisgICAgICAgICAgICAucHJpdmF0ZV9kYXRhID0gJmZpbGVuYW1lX2luZm8sCisgICAgICAgICAgICAucHJpdmF0ZV9kYXRhX3NpemUgPSBzaXplb2YoZmlsZW5hbWVfaW5mbyksCisgICAgICAgIH07CisgICAgICAgIHN0YXR1cyA9IGZwTG9hZGVyUXVlcnlBZGFwdGVySW5mbygmcXVlcnlfaW5mbyk7CisKKyAgICAgICAgLy8gVGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCB0aGUgdHlwZSBkaWRuJ3QgbWF0Y2gsIHNvIHdlJ2xsIHRyeSBhIFJFR19TWgorICAgICAgICBpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBmaWxlbmFtZV9pbmZvLnZhbHVlX3R5cGUgPSBSRUdfU1o7CisgICAgICAgICAgICBzdGF0dXMgPSBmcExvYWRlclF1ZXJ5QWRhcHRlckluZm8oJnF1ZXJ5X2luZm8pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUyB8fCBmaWxlbmFtZV9pbmZvLnN0YXR1cyAhPSBMT0FERVJfUVVFUllfUkVHSVNUUllfU1RBVFVTX0JVRkZFUl9PVkVSRkxPVykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoc3RhdHVzID09IFNUQVRVU19TVUNDRVNTICYmCisgICAgICAgICAgICAgICAoKExvYWRlclF1ZXJ5UmVnaXN0cnlJbmZvICopcXVlcnlfaW5mby5wcml2YXRlX2RhdGEpLT5zdGF0dXMgPT0gTE9BREVSX1FVRVJZX1JFR0lTVFJZX1NUQVRVU19CVUZGRVJfT1ZFUkZMT1cpIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZHNfY29weSA9IChmdWxsX2luZm8gPT0gTlVMTCk7CisgICAgICAgICAgICBzaXplX3QgZnVsbF9zaXplID0gc2l6ZW9mKExvYWRlclF1ZXJ5UmVnaXN0cnlJbmZvKSArIGZpbGVuYW1lX2luZm8ub3V0cHV0X3ZhbHVlX3NpemU7CisgICAgICAgICAgICB2b2lkICpidWZmZXIgPQorICAgICAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX3JlYWxsb2MoaW5zdCwgZnVsbF9pbmZvLCBmdWxsX2luZm9fc2l6ZSwgZnVsbF9zaXplLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DT01NQU5EKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ1bGxfaW5mbyA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIGZ1bGxfaW5mb19zaXplID0gZnVsbF9zaXplOworCisgICAgICAgICAgICBpZiAobmVlZHNfY29weSkgeworICAgICAgICAgICAgICAgIG1lbWNweShmdWxsX2luZm8sICZmaWxlbmFtZV9pbmZvLCBzaXplb2YoTG9hZGVyUXVlcnlSZWdpc3RyeUluZm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXJ5X2luZm8ucHJpdmF0ZV9kYXRhID0gZnVsbF9pbmZvOworICAgICAgICAgICAgcXVlcnlfaW5mby5wcml2YXRlX2RhdGFfc2l6ZSA9IChVSU5UKWZ1bGxfaW5mb19zaXplOworICAgICAgICAgICAgc3RhdHVzID0gZnBMb2FkZXJRdWVyeUFkYXB0ZXJJbmZvKCZxdWVyeV9pbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MgfHwgZnVsbF9pbmZvLT5zdGF0dXMgIT0gTE9BREVSX1FVRVJZX1JFR0lTVFJZX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgdGhlIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZworICAgICAgICB2b2lkICpidWZmZXIgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9yZWFsbG9jKGluc3QsIGpzb25fcGF0aCwganNvbl9wYXRoX3NpemUsIGZ1bGxfaW5mby0+b3V0cHV0X3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCk7CisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAganNvbl9wYXRoID0gYnVmZmVyOworICAgICAgICBqc29uX3BhdGhfc2l6ZSA9IGZ1bGxfaW5mby0+b3V0cHV0X3ZhbHVlX3NpemU7CisKKyAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggY29tcG9uZW50IHN0cmluZworICAgICAgICBmb3IgKGNvbnN0IHdjaGFyX3QgKmN1cnJfcGF0aCA9IGZ1bGxfaW5mby0+b3V0cHV0X3N0cmluZzsgY3Vycl9wYXRoWzBdICE9ICdcMCc7IGN1cnJfcGF0aCArPSB3Y3NsZW4oY3Vycl9wYXRoKSArIDEpIHsKKyAgICAgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgY3Vycl9wYXRoLCAtMSwganNvbl9wYXRoLCAoaW50KWpzb25fcGF0aF9zaXplLCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgLy8gQWRkIHRoZSBzdHJpbmcgdG8gdGhlIG91dHB1dCBsaXN0CisgICAgICAgICAgICByZXN1bHQgPSBWS19TVUNDRVNTOworICAgICAgICAgICAgbG9hZGVyQWRkSnNvbkVudHJ5KGluc3QsIHJlZ19kYXRhLCByZWdfZGF0YV9zaXplLCAoTFBDVFNUUilMIkVudW1BZGFwdGVycyIsIFJFR19TWiwganNvbl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClzdHJsZW4oanNvbl9wYXRoKSArIDEsICZyZXN1bHQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdHJpbmcgYW5kIG5vdCBhIG11bHRpLXN0cmluZywgd2UgZG9uJ3Qgd2FudCB0byBnbyB0aHJvdWdodCB0aGUgbG9vcCBtb3JlIHRoYW4gb25jZQorICAgICAgICAgICAgaWYgKGZ1bGxfaW5mby0+dmFsdWVfdHlwZSA9PSBSRUdfU1opIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworb3V0OgorICAgIGlmIChqc29uX3BhdGggIT0gTlVMTCkgeworICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGpzb25fcGF0aCk7CisgICAgfQorICAgIGlmIChmdWxsX2luZm8gIT0gTlVMTCkgeworICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGZ1bGxfaW5mbyk7CisgICAgfQorICAgIGlmIChhZGFwdGVycy5hZGFwdGVycyAhPSBOVUxMKSB7CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgYWRhcHRlcnMuYWRhcHRlcnMpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIExvb2sgZm9yIGRhdGEgZmlsZXMgaW4gdGhlIHJlZ2lzdHJ5Lgorc3RhdGljIFZrUmVzdWx0IFJlYWREYXRhRmlsZXNJblJlZ2lzdHJ5KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGVudW0gbG9hZGVyX2RhdGFfZmlsZXNfdHlwZSBkYXRhX2ZpbGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhcm5faWZfbm90X3ByZXNlbnQsIGNoYXIgKnJlZ2lzdHJ5X2xvY2F0aW9uLCBzdHJ1Y3QgbG9hZGVyX2RhdGFfZmlsZXMgKm91dF9maWxlcykgeworICAgIFZrUmVzdWx0IHZrX3Jlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgYm9vbCBpc19pY2QgPSAoZGF0YV9maWxlX3R5cGUgPT0gTE9BREVSX0RBVEFfRklMRV9NQU5JRkVTVF9JQ0QpOworICAgIGNoYXIgKnNlYXJjaF9wYXRoID0gTlVMTDsKKworICAgIC8vIFRoZXNlIGNhbGxzIGxvb2sgYXQgdGhlIFBOUC9EZXZpY2Ugc2VjdGlvbiBvZiB0aGUgcmVnaXN0cnkuCisgICAgVmtSZXN1bHQgcmVnSEtSX3Jlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgRFdPUkQgcmVnX3NpemUgPSA0MDk2OworICAgIGlmICghc3RybmNtcChyZWdpc3RyeV9sb2NhdGlvbiwgVktfRFJJVkVSU19JTkZPX1JFR0lTVFJZX0xPQywgc2l6ZW9mKFZLX0RSSVZFUlNfSU5GT19SRUdJU1RSWV9MT0MpKSkgeworICAgICAgICAvLyBJZiB3ZSdyZSBsb29raW5nIGZvciBkcml2ZXJzIHdlIG5lZWQgdG8gdHJ5IGVudW1lcmF0aW5nIGFkYXB0ZXJzCisgICAgICAgIHJlZ0hLUl9yZXN1bHQgPSBSZWFkTWFuaWZlc3RzRnJvbUQzREFkYXB0ZXJzKGluc3QsICZzZWFyY2hfcGF0aCwgJnJlZ19zaXplLCBMb2FkZXJQbnBEcml2ZXJSZWdpc3RyeVdpZGUoKSk7CisgICAgICAgIGlmIChyZWdIS1JfcmVzdWx0ID09IFZLX0lOQ09NUExFVEUpIHsKKyAgICAgICAgICAgIHJlZ0hLUl9yZXN1bHQgPSBsb2FkZXJHZXREZXZpY2VSZWdpc3RyeUZpbGVzKGluc3QsICZzZWFyY2hfcGF0aCwgJnJlZ19zaXplLCBMb2FkZXJQbnBEcml2ZXJSZWdpc3RyeSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAocmVnaXN0cnlfbG9jYXRpb24sIFZLX0VMQVlFUlNfSU5GT19SRUdJU1RSWV9MT0MsIHNpemVvZihWS19FTEFZRVJTX0lORk9fUkVHSVNUUllfTE9DKSkpIHsKKyAgICAgICAgcmVnSEtSX3Jlc3VsdCA9IFJlYWRNYW5pZmVzdHNGcm9tRDNEQWRhcHRlcnMoaW5zdCwgJnNlYXJjaF9wYXRoLCAmcmVnX3NpemUsIExvYWRlclBucEVMYXllclJlZ2lzdHJ5V2lkZSgpKTsKKyAgICAgICAgaWYgKHJlZ0hLUl9yZXN1bHQgPT0gVktfSU5DT01QTEVURSkgeworICAgICAgICAgICAgcmVnSEtSX3Jlc3VsdCA9IGxvYWRlckdldERldmljZVJlZ2lzdHJ5RmlsZXMoaW5zdCwgJnNlYXJjaF9wYXRoLCAmcmVnX3NpemUsIExvYWRlclBucEVMYXllclJlZ2lzdHJ5KCkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RybmNtcChyZWdpc3RyeV9sb2NhdGlvbiwgVktfSUxBWUVSU19JTkZPX1JFR0lTVFJZX0xPQywgc2l6ZW9mKFZLX0lMQVlFUlNfSU5GT19SRUdJU1RSWV9MT0MpKSkgeworICAgICAgICByZWdIS1JfcmVzdWx0ID0gUmVhZE1hbmlmZXN0c0Zyb21EM0RBZGFwdGVycyhpbnN0LCAmc2VhcmNoX3BhdGgsICZyZWdfc2l6ZSwgTG9hZGVyUG5wSUxheWVyUmVnaXN0cnlXaWRlKCkpOworICAgICAgICBpZiAocmVnSEtSX3Jlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSB7CisgICAgICAgICAgICByZWdIS1JfcmVzdWx0ID0gbG9hZGVyR2V0RGV2aWNlUmVnaXN0cnlGaWxlcyhpbnN0LCAmc2VhcmNoX3BhdGgsICZyZWdfc2l6ZSwgTG9hZGVyUG5wSUxheWVyUmVnaXN0cnkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGNhbGwgbG9va3MgaW50byB0aGUgS2hyb25vcyBub24tZGV2aWNlIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIHJlZ2lzdHJ5LgorICAgIGJvb2wgdXNlX3NlY29uZGFyeV9oaXZlID0gKGRhdGFfZmlsZV90eXBlID09IExPQURFUl9EQVRBX0ZJTEVfTUFOSUZFU1RfTEFZRVIpICYmICghSXNIaWdoSW50ZWdyaXR5KCkpOworICAgIFZrUmVzdWx0IHJlZ19yZXN1bHQgPSBsb2FkZXJHZXRSZWdpc3RyeUZpbGVzKGluc3QsIHJlZ2lzdHJ5X2xvY2F0aW9uLCB1c2Vfc2Vjb25kYXJ5X2hpdmUsICZzZWFyY2hfcGF0aCwgJnJlZ19zaXplKTsKKworICAgIGlmICgoVktfU1VDQ0VTUyAhPSByZWdfcmVzdWx0ICYmIFZLX1NVQ0NFU1MgIT0gcmVnSEtSX3Jlc3VsdCkgfHwgTlVMTCA9PSBzZWFyY2hfcGF0aCkgeworICAgICAgICBpZiAoZGF0YV9maWxlX3R5cGUgPT0gTE9BREVSX0RBVEFfRklMRV9NQU5JRkVTVF9JQ0QpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coCisgICAgICAgICAgICAgICAgaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgIlJlYWREYXRhRmlsZXNJblJlZ2lzdHJ5OiBSZWdpc3RyeSBsb29rdXAgZmFpbGVkIHRvIGdldCBJQ0QgbWFuaWZlc3QgZmlsZXMuICBQb3NzaWJseSBtaXNzaW5nIFZ1bGthbiBkcml2ZXI/Iik7CisgICAgICAgICAgICBpZiAoVktfU1VDQ0VTUyA9PSByZWdfcmVzdWx0IHx8IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSA9PSByZWdfcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgdmtfcmVzdWx0ID0gcmVnX3Jlc3VsdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmtfcmVzdWx0ID0gcmVnSEtSX3Jlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh3YXJuX2lmX25vdF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGFfZmlsZV90eXBlID09IExPQURFUl9EQVRBX0ZJTEVfTUFOSUZFU1RfTEFZRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IGEgd2FybmluZyBmb3IgbGF5ZXJzCisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhZERhdGFGaWxlc0luUmVnaXN0cnk6IFJlZ2lzdHJ5IGxvb2t1cCBmYWlsZWQgdG8gZ2V0IGxheWVyIG1hbmlmZXN0IGZpbGVzLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBhIHdhcm5pbmcgZm9yIGdlbmVyYWwgZGF0YSBmaWxlcworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWREYXRhRmlsZXNJblJlZ2lzdHJ5OiBSZWdpc3RyeSBsb29rdXAgZmFpbGVkIHRvIGdldCBkYXRhIGZpbGVzLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWdfcmVzdWx0ID09IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSkgeworICAgICAgICAgICAgICAgIHZrX3Jlc3VsdCA9IHJlZ19yZXN1bHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFJldHVybiBzdWNjZXNzIGZvciBub3cgc2luY2UgaXQncyBub3QgY3JpdGljYWwgZm9yIGxheWVycworICAgICAgICAgICAgICAgIHZrX3Jlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLy8gTm93LCBwYXJzZSB0aGUgcGF0aHMgYW5kIGFkZCBhbnkgbWFuaWZlc3QgZmlsZXMgZm91bmQgaW4gdGhlbS4KKyAgICB2a19yZXN1bHQgPSBBZGREYXRhRmlsZXNJblBhdGgoaW5zdCwgc2VhcmNoX3BhdGgsIGZhbHNlLCBvdXRfZmlsZXMpOworCitvdXQ6CisKKyAgICBpZiAoTlVMTCAhPSBzZWFyY2hfcGF0aCkgeworICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIHNlYXJjaF9wYXRoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmtfcmVzdWx0OworfQorI2VuZGlmICAvLyBfV0lOMzIKKworLy8gRmluZCB0aGUgVnVsa2FuIGxpYnJhcnkgbWFuaWZlc3QgZmlsZXMuCisvLworLy8gVGhpcyBmdW5jdGlvbiBzY2FucyB0aGUgImxvY2F0aW9uIiBvciAiZW52X292ZXJyaWRlIiBkaXJlY3Rvcmllcy9maWxlcworLy8gZm9yIGEgbGlzdCBvZiBKU09OIG1hbmlmZXN0IGZpbGVzLiAgSWYgZW52X292ZXJyaWRlIGlzIG5vbi1OVUxMCisvLyBhbmQgaGFzIGEgdmFsaWQgdmFsdWUuIFRoZW4gdGhlIGxvY2F0aW9uIGlzIGlnbm9yZWQuICBPdGhlcndpc2UKKy8vIGxvY2F0aW9uIGlzIHVzZWQgdG8gbG9vayBmb3IgbWFuaWZlc3QgZmlsZXMuIFRoZSBsb2NhdGlvbgorLy8gaXMgaW50ZXJwcmV0ZWQgYXMgIFJlZ2lzdHJ5IHBhdGggb24gV2luZG93cyBhbmQgYSBkaXJlY3RvcnkgcGF0aChzKQorLy8gb24gTGludXguICJob21lX2xvY2F0aW9uIiBpcyBhbiBhZGRpdGlvbmFsIGRpcmVjdG9yeSBpbiB0aGUgdXNlcnMgaG9tZQorLy8gZGlyZWN0b3J5IHRvIGxvb2sgYXQuIEl0IGlzIGV4cGFuZGVkIGludG8gdGhlIGRpciBwYXRoCisvLyAkWERHX0RBVEFfSE9NRS9ob21lX2xvY2F0aW9uIG9yICRIT01FLy5sb2NhbC9zaGFyZS9ob21lX2xvY2F0aW9uIGRlcGVuZGluZworLy8gb24gZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGlzICJob21lX2xvY2F0aW9uIiBpcyBvbmx5IHVzZWQgb24gTGludXguCisvLworLy8gXHJldHVybnMKKy8vIFZLUmVzdWx0CisvLyBBIHN0cmluZyBsaXN0IG9mIG1hbmlmZXN0IGZpbGVzIHRvIGJlIG9wZW5lZCBpbiBvdXRfZmlsZXMgcGFyYW0uCisvLyBMaXN0IGhhcyBhIHBvaW50ZXIgdG8gc3RyaW5nIGZvciBlYWNoIG1hbmlmZXN0IGZpbGVuYW1lLgorLy8gV2hlbiBkb25lIHVzaW5nIHRoZSBsaXN0IGluIG91dF9maWxlcywgcG9pbnRlcnMgc2hvdWxkIGJlIGZyZWVkLgorLy8gTG9jYXRpb24gb3Igb3ZlcnJpZGUgIHN0cmluZyBsaXN0cyBjYW4gYmUgZWl0aGVyIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGFzCisvLyBmb2xsb3dzOgorLy8gICAgICAgICAgICB8IGxvY2F0aW9uIHwgb3ZlcnJpZGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXaW4gSUNEICAgIHwgZmlsZXMgICAgfCBmaWxlcworLy8gV2luIExheWVyICB8IGZpbGVzICAgIHwgZGlycworLy8gTGludXggSUNEICB8IGRpcnMgICAgIHwgZmlsZXMKKy8vIExpbnV4IExheWVyfCBkaXJzICAgICB8IGRpcnMKK3N0YXRpYyBWa1Jlc3VsdCBsb2FkZXJHZXREYXRhRmlsZXMoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgZW51bSBsb2FkZXJfZGF0YV9maWxlc190eXBlIGRhdGFfZmlsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhcm5faWZfbm90X3ByZXNlbnQsIGNvbnN0IGNoYXIgKmVudl9vdmVycmlkZSwgY29uc3QgY2hhciAqcGF0aF9vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcmVnaXN0cnlfbG9jYXRpb24sIGNvbnN0IGNoYXIgKnJlbGF0aXZlX2xvY2F0aW9uLCBzdHJ1Y3QgbG9hZGVyX2RhdGFfZmlsZXMgKm91dF9maWxlcykgeworICAgIFZrUmVzdWx0IHJlcyA9IFZLX1NVQ0NFU1M7CisgICAgYm9vbCBvdmVycmlkZV9hY3RpdmUgPSBmYWxzZTsKKworICAgIC8vIEZyZWUgYW5kIGluaXQgdGhlIG91dF9maWxlcyBpbmZvcm1hdGlvbiBzbyB0aGVyZSdzIG5vIGZhbHNlIGRhdGEgbGVmdCBmcm9tIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgorICAgIGlmIChvdXRfZmlsZXMtPmZpbGVuYW1lX2xpc3QgIT0gTlVMTCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgb3V0X2ZpbGVzLT5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBvdXRfZmlsZXMtPmZpbGVuYW1lX2xpc3RbaV0pIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIG91dF9maWxlcy0+ZmlsZW5hbWVfbGlzdFtpXSk7CisgICAgICAgICAgICAgICAgb3V0X2ZpbGVzLT5maWxlbmFtZV9saXN0W2ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIG91dF9maWxlcy0+ZmlsZW5hbWVfbGlzdCk7CisgICAgfQorICAgIG91dF9maWxlcy0+Y291bnQgPSAwOworICAgIG91dF9maWxlcy0+YWxsb2NfY291bnQgPSAwOworICAgIG91dF9maWxlcy0+ZmlsZW5hbWVfbGlzdCA9IE5VTEw7CisKKyAgICByZXMgPSBSZWFkRGF0YUZpbGVzSW5TZWFyY2hQYXRocyhpbnN0LCBkYXRhX2ZpbGVfdHlwZSwgZW52X292ZXJyaWRlLCBwYXRoX292ZXJyaWRlLCByZWxhdGl2ZV9sb2NhdGlvbiwgJm92ZXJyaWRlX2FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZmlsZXMpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyNpZmRlZiBfV0lOMzIKKyAgICAvLyBSZWFkIHRoZSByZWdpc3RyeSBpZiB0aGUgb3ZlcnJpZGUgd2Fzbid0IGFjdGl2ZS4KKyAgICBpZiAoIW92ZXJyaWRlX2FjdGl2ZSkgeworICAgICAgICByZXMgPSBSZWFkRGF0YUZpbGVzSW5SZWdpc3RyeShpbnN0LCBkYXRhX2ZpbGVfdHlwZSwgd2Fybl9pZl9ub3RfcHJlc2VudCwgcmVnaXN0cnlfbG9jYXRpb24sIG91dF9maWxlcyk7CisgICAgICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworb3V0OgorCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzICYmIE5VTEwgIT0gb3V0X2ZpbGVzLT5maWxlbmFtZV9saXN0KSB7CisgICAgICAgIGZvciAodWludDMyX3QgcmVtb3ZlID0gMDsgcmVtb3ZlIDwgb3V0X2ZpbGVzLT5jb3VudDsgcmVtb3ZlKyspIHsKKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgb3V0X2ZpbGVzLT5maWxlbmFtZV9saXN0W3JlbW92ZV0pOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgb3V0X2ZpbGVzLT5maWxlbmFtZV9saXN0KTsKKyAgICAgICAgb3V0X2ZpbGVzLT5jb3VudCA9IDA7CisgICAgICAgIG91dF9maWxlcy0+YWxsb2NfY291bnQgPSAwOworICAgICAgICBvdXRfZmlsZXMtPmZpbGVuYW1lX2xpc3QgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgbG9hZGVyX2luaXRfaWNkX2xpYl9saXN0KCkge30KKwordm9pZCBsb2FkZXJfZGVzdHJveV9pY2RfbGliX2xpc3QoKSB7fQorCisvLyBUcnkgdG8gZmluZCB0aGUgVnVsa2FuIElDRCBkcml2ZXIocykuCisvLworLy8gVGhpcyBmdW5jdGlvbiBzY2FucyB0aGUgZGVmYXVsdCBzeXN0ZW0gbG9hZGVyIHBhdGgocykgb3IgcGF0aAorLy8gc3BlY2lmaWVkIGJ5IHRoZSBcYyBWS19JQ0RfRklMRU5BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlIGluCisvLyBvcmRlciB0byBmaW5kIGxvYWRhYmxlIFZLIElDRHMgbWFuaWZlc3QgZmlsZXMuIEZyb20gdGhlc2UKKy8vIG1hbmlmZXN0IGZpbGVzIGl0IGZpbmRzIHRoZSBJQ0QgbGlicmFyaWVzLgorLy8KKy8vIFxyZXR1cm5zCisvLyBWdWxrYW4gcmVzdWx0CisvLyAob24gcmVzdWx0ID09IFZLX1NVQ0NFU1MpIGEgbGlzdCBvZiBpY2RzIHRoYXQgd2VyZSBkaXNjb3ZlcmVkCitWa1Jlc3VsdCBsb2FkZXJfaWNkX3NjYW4oY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9pY2RfdHJhbXBfbGlzdCAqaWNkX3RyYW1wX2xpc3QpIHsKKyAgICBjaGFyICpmaWxlX3N0cjsKKyAgICB1aW50MTZfdCBmaWxlX21ham9yX3ZlcnMgPSAwOworICAgIHVpbnQxNl90IGZpbGVfbWlub3JfdmVycyA9IDA7CisgICAgdWludDE2X3QgZmlsZV9wYXRjaF92ZXJzID0gMDsKKyAgICBjaGFyICp2ZXJzX3RvazsKKyAgICBzdHJ1Y3QgbG9hZGVyX2RhdGFfZmlsZXMgbWFuaWZlc3RfZmlsZXM7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICBib29sIGxvY2tlZE11dGV4ID0gZmFsc2U7CisgICAgY0pTT04gKmpzb24gPSBOVUxMOworICAgIHVpbnQzMl90IG51bV9nb29kX2ljZHMgPSAwOworCisgICAgbWVtc2V0KCZtYW5pZmVzdF9maWxlcywgMCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfZGF0YV9maWxlcykpOworCisgICAgcmVzID0gbG9hZGVyX3NjYW5uZWRfaWNkX2luaXQoaW5zdCwgaWNkX3RyYW1wX2xpc3QpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBHZXQgYSBsaXN0IG9mIG1hbmlmZXN0IGZpbGVzIGZvciBJQ0RzCisgICAgcmVzID0gbG9hZGVyR2V0RGF0YUZpbGVzKGluc3QsIExPQURFUl9EQVRBX0ZJTEVfTUFOSUZFU1RfSUNELCB0cnVlLCAiVktfSUNEX0ZJTEVOQU1FUyIsIE5VTEwsIFZLX0RSSVZFUlNfSU5GT19SRUdJU1RSWV9MT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RSSVZFUlNfSU5GT19SRUxBVElWRV9ESVIsICZtYW5pZmVzdF9maWxlcyk7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzIHx8IG1hbmlmZXN0X2ZpbGVzLmNvdW50ID09IDApIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZsb2FkZXJfanNvbl9sb2NrKTsKKyAgICBsb2NrZWRNdXRleCA9IHRydWU7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1hbmlmZXN0X2ZpbGVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgZmlsZV9zdHIgPSBtYW5pZmVzdF9maWxlcy5maWxlbmFtZV9saXN0W2ldOworICAgICAgICBpZiAoZmlsZV9zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBWa1Jlc3VsdCB0ZW1wX3JlcyA9IGxvYWRlcl9nZXRfanNvbihpbnN0LCBmaWxlX3N0ciwgJmpzb24pOworICAgICAgICBpZiAoTlVMTCA9PSBqc29uIHx8IHRlbXBfcmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGpzb24pIHsKKyAgICAgICAgICAgICAgICBjSlNPTl9EZWxldGUoanNvbik7CisgICAgICAgICAgICAgICAganNvbiA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZm91bmQgYW4gSUNELCBjb3B5IHRoaXMgcmVzdWx0IHRvCisgICAgICAgICAgICAvLyB0aGUgcmV0dXJuZWQgcmVzdWx0LgorICAgICAgICAgICAgaWYgKG51bV9nb29kX2ljZHMgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlcyA9IHRlbXBfcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRlbXBfcmVzID09IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXMgPSB0ZW1wX3JlczsKKworICAgICAgICBjSlNPTiAqaXRlbSwgKml0ZW1JQ0Q7CisgICAgICAgIGl0ZW0gPSBjSlNPTl9HZXRPYmplY3RJdGVtKGpzb24sICJmaWxlX2Zvcm1hdF92ZXJzaW9uIik7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChudW1fZ29vZF9pY2RzID09IDApIHsKKyAgICAgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJfaWNkX3NjYW46IElDRCBKU09OICVzIGRvZXMgbm90IGhhdmUgYSIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBcJ2ZpbGVfZm9ybWF0X3ZlcnNpb25cJyBmaWVsZC4gU2tpcHBpbmcgSUNEIEpTT04uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zdHIpOworICAgICAgICAgICAgY0pTT05fRGVsZXRlKGpzb24pOworICAgICAgICAgICAganNvbiA9IE5VTEw7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgKmZpbGVfdmVycyA9IGNKU09OX1ByaW50KGl0ZW0pOworICAgICAgICBpZiAoTlVMTCA9PSBmaWxlX3ZlcnMpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgcmVhc29uIHRoZSBwcmludCBjYW4gZmFpbCBpcyBpZiB0aGVyZSB3YXMgYW4gYWxsb2NhdGlvbiBpc3N1ZQorICAgICAgICAgICAgaWYgKG51bV9nb29kX2ljZHMgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9pY2Rfc2NhbjogRmFpbGVkIHJldHJpZXZpbmcgSUNEIEpTT04gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICIgXCdmaWxlX2Zvcm1hdF92ZXJzaW9uXCcgZmllbGQuICBTa2lwcGluZyBJQ0QgSlNPTiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc3RyKTsKKyAgICAgICAgICAgIGNKU09OX0RlbGV0ZShqc29uKTsKKyAgICAgICAgICAgIGpzb24gPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwgIkZvdW5kIElDRCBtYW5pZmVzdCBmaWxlICVzLCB2ZXJzaW9uICVzIiwgZmlsZV9zdHIsIGZpbGVfdmVycyk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBtYWpvci9taW5vci9hbmQgcGF0Y2ggYXMgaW50ZWdlcnMgZm9yIGVhc2llciBjb21wYXJpc29uCisgICAgICAgIHZlcnNfdG9rID0gc3RydG9rKGZpbGVfdmVycywgIi5cIlxuXHIiKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gdmVyc190b2spIHsKKyAgICAgICAgICAgIGZpbGVfbWFqb3JfdmVycyA9ICh1aW50MTZfdClhdG9pKHZlcnNfdG9rKTsKKyAgICAgICAgICAgIHZlcnNfdG9rID0gc3RydG9rKE5VTEwsICIuXCJcblxyIik7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSB2ZXJzX3RvaykgeworICAgICAgICAgICAgICAgIGZpbGVfbWlub3JfdmVycyA9ICh1aW50MTZfdClhdG9pKHZlcnNfdG9rKTsKKyAgICAgICAgICAgICAgICB2ZXJzX3RvayA9IHN0cnRvayhOVUxMLCAiLlwiXG5cciIpOworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHZlcnNfdG9rKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVfcGF0Y2hfdmVycyA9ICh1aW50MTZfdClhdG9pKHZlcnNfdG9rKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsZV9tYWpvcl92ZXJzICE9IDEgfHwgZmlsZV9taW5vcl92ZXJzICE9IDAgfHwgZmlsZV9wYXRjaF92ZXJzID4gMSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2ljZF9zY2FuOiBVbmV4cGVjdGVkIG1hbmlmZXN0IGZpbGUgdmVyc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICIoZXhwZWN0ZWQgMS4wLjAgb3IgMS4wLjEpLCBtYXkgY2F1c2UgZXJyb3JzIik7CisgICAgICAgIH0KKyAgICAgICAgY0pTT05fRnJlZShmaWxlX3ZlcnMpOworCisgICAgICAgIGl0ZW1JQ0QgPSBjSlNPTl9HZXRPYmplY3RJdGVtKGpzb24sICJJQ0QiKTsKKyAgICAgICAgaWYgKGl0ZW1JQ0QgIT0gTlVMTCkgeworICAgICAgICAgICAgaXRlbSA9IGNKU09OX0dldE9iamVjdEl0ZW0oaXRlbUlDRCwgImxpYnJhcnlfcGF0aCIpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNoYXIgKnRlbXAgPSBjSlNPTl9QcmludChpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRlbXAgfHwgc3RybGVuKHRlbXApID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9nb29kX2ljZHMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2ljZF9zY2FuOiBGYWlsZWQgcmV0cmlldmluZyBJQ0QgSlNPTiAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFwnbGlicmFyeV9wYXRoXCcgZmllbGQuICBTa2lwcGluZyBJQ0QgSlNPTi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgY0pTT05fRnJlZSh0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgY0pTT05fRGVsZXRlKGpzb24pOworICAgICAgICAgICAgICAgICAgICBqc29uID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHN0cmlwIG91dCBleHRyYSBxdW90ZXMKKyAgICAgICAgICAgICAgICB0ZW1wW3N0cmxlbih0ZW1wKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBjaGFyICpsaWJyYXJ5X3BhdGggPSBsb2FkZXJfc3RhY2tfYWxsb2Moc3RybGVuKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gbGlicmFyeV9wYXRoKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9pY2Rfc2NhbjogRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklDRCBKU09OICVzIFwnbGlicmFyeV9wYXRoXCcgdmFsdWUuICBTa2lwcGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklDRCBKU09OLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zdHIpOworICAgICAgICAgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGNKU09OX0ZyZWUodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGNKU09OX0RlbGV0ZShqc29uKTsKKyAgICAgICAgICAgICAgICAgICAganNvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJjcHkobGlicmFyeV9wYXRoLCAmdGVtcFsxXSk7CisgICAgICAgICAgICAgICAgY0pTT05fRnJlZSh0ZW1wKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGxpYnJhcnlfcGF0aCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9pY2Rfc2NhbjogSUNEIEpTT04gJXMgXCdsaWJyYXJ5X3BhdGhcJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZpZWxkIGlzIGVtcHR5LiAgU2tpcHBpbmcgSUNEIEpTT04uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3N0cik7CisgICAgICAgICAgICAgICAgICAgIGNKU09OX0RlbGV0ZShqc29uKTsKKyAgICAgICAgICAgICAgICAgICAganNvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFyIGZ1bGxwYXRoW01BWF9TVFJJTkdfU0laRV07CisgICAgICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSBwYXRocyBiZWluZyBzZWFyY2hlZCBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQsIDAsICJTZWFyY2hpbmcgZm9yIElDRCBkcml2ZXJzIG5hbWVkICVzIiwgbGlicmFyeV9wYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyX3BsYXRmb3JtX2lzX3BhdGgobGlicmFyeV9wYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZV9jb3B5ID0gbG9hZGVyX3N0YWNrX2FsbG9jKHN0cmxlbihmaWxlX3N0cikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcmVsX2Jhc2U7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShuYW1lX2NvcHksIGZpbGVfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVsX2Jhc2UgPSBsb2FkZXJfcGxhdGZvcm1fZGlybmFtZShuYW1lX2NvcHkpOworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfZXhwYW5kX3BhdGgobGlicmFyeV9wYXRoLCByZWxfYmFzZSwgc2l6ZW9mKGZ1bGxwYXRoKSwgZnVsbHBhdGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisvLyBhIGZpbGVuYW1lIHdoaWNoIGlzIGFzc3VtZWQgaW4gYSBzeXN0ZW0gZGlyZWN0b3J5CisjaWYgZGVmaW5lZChERUZBVUxUX1ZLX0RSSVZFUlNfUEFUSCkKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2dldF9mdWxscGF0aChsaWJyYXJ5X3BhdGgsIERFRkFVTFRfVktfRFJJVkVSU19QQVRILCBzaXplb2YoZnVsbHBhdGgpLCBmdWxscGF0aCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2dldF9mdWxscGF0aChsaWJyYXJ5X3BhdGgsICIiLCBzaXplb2YoZnVsbHBhdGgpLCBmdWxscGF0aCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZXJzID0gMDsKKyAgICAgICAgICAgICAgICBpdGVtID0gY0pTT05fR2V0T2JqZWN0SXRlbShpdGVtSUNELCAiYXBpX3ZlcnNpb24iKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBjSlNPTl9QcmludChpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gdGVtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2ljZF9zY2FuOiBGYWlsZWQgcmV0cmlldmluZyBJQ0QgSlNPTiAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcJ2FwaV92ZXJzaW9uXCcgZmllbGQuICBTa2lwcGluZyBJQ0QgSlNPTi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3N0cik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVhc29uIHRoZSBwcmludCBjYW4gZmFpbCBpcyBpZiB0aGVyZSB3YXMgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRpb24gaXNzdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1fZ29vZF9pY2RzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNKU09OX0ZyZWUodGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjSlNPTl9EZWxldGUoanNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZlcnMgPSBsb2FkZXJfbWFrZV92ZXJzaW9uKHRlbXApOworICAgICAgICAgICAgICAgICAgICBjSlNPTl9GcmVlKHRlbXApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2ljZF9zY2FuOiBJQ0QgSlNPTiAlcyBkb2VzIG5vdCBoYXZlIGFuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXCdhcGlfdmVyc2lvblwnIGZpZWxkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zdHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlcyA9IGxvYWRlcl9zY2FubmVkX2ljZF9hZGQoaW5zdCwgaWNkX3RyYW1wX2xpc3QsIGZ1bGxwYXRoLCB2ZXJzKTsKKyAgICAgICAgICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2ljZF9zY2FuOiBGYWlsZWQgdG8gYWRkIElDRCBKU09OICVzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBTa2lwcGluZyBJQ0QgSlNPTi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgY0pTT05fRGVsZXRlKGpzb24pOworICAgICAgICAgICAgICAgICAgICBqc29uID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG51bV9nb29kX2ljZHMrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9pY2Rfc2NhbjogRmFpbGVkIHRvIGZpbmQgXCdsaWJyYXJ5X3BhdGhcJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IGluIElDRCBKU09OIGZpbGUgJXMuICBTa2lwcGluZyBJQ0QgSlNPTi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2ljZF9zY2FuOiBDYW4gbm90IGZpbmQgXCdJQ0RcJyBvYmplY3QgaW4gSUNEIEpTT04gIgorICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSAlcy4gIFNraXBwaW5nIElDRCBKU09OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zdHIpOworICAgICAgICB9CisKKyAgICAgICAgY0pTT05fRGVsZXRlKGpzb24pOworICAgICAgICBqc29uID0gTlVMTDsKKyAgICB9CisKK291dDoKKworICAgIGlmIChOVUxMICE9IGpzb24pIHsKKyAgICAgICAgY0pTT05fRGVsZXRlKGpzb24pOworICAgIH0KKworICAgIGlmIChOVUxMICE9IG1hbmlmZXN0X2ZpbGVzLmZpbGVuYW1lX2xpc3QpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1hbmlmZXN0X2ZpbGVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IG1hbmlmZXN0X2ZpbGVzLmZpbGVuYW1lX2xpc3RbaV0pIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIG1hbmlmZXN0X2ZpbGVzLmZpbGVuYW1lX2xpc3RbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgbWFuaWZlc3RfZmlsZXMuZmlsZW5hbWVfbGlzdCk7CisgICAgfQorICAgIGlmIChsb2NrZWRNdXRleCkgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2pzb25fbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBsb2FkZXJTY2FuRm9yTGF5ZXJzKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqaW5zdGFuY2VfbGF5ZXJzKSB7CisgICAgY2hhciAqZmlsZV9zdHI7CisgICAgc3RydWN0IGxvYWRlcl9kYXRhX2ZpbGVzIG1hbmlmZXN0X2ZpbGVzOworICAgIGNKU09OICpqc29uOworICAgIGJvb2wgb3ZlcnJpZGVfbGF5ZXJfdmFsaWQgPSBmYWxzZTsKKyAgICBjaGFyICpvdmVycmlkZV9wYXRocyA9IE5VTEw7CisgICAgdWludDMyX3QgdG90YWxfY291bnQgPSAwOworCisgICAgbWVtc2V0KCZtYW5pZmVzdF9maWxlcywgMCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfZGF0YV9maWxlcykpOworCisgICAgLy8gQ2xlYW51cCBhbnkgcHJldmlvdXNseSBzY2FubmVkIGxpYnJhcmllcworICAgIGxvYWRlckRlbGV0ZUxheWVyTGlzdEFuZFByb3BlcnRpZXMoaW5zdCwgaW5zdGFuY2VfbGF5ZXJzKTsKKworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmbG9hZGVyX2pzb25fbG9jayk7CisKKyAgICAvLyBHZXQgYSBsaXN0IG9mIG1hbmlmZXN0IGZpbGVzIGZvciBhbnkgaW1wbGljaXQgbGF5ZXJzCisgICAgLy8gUGFzcyBOVUxMIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZSAtIGltcGxpY2l0IGxheWVycyBhcmUgbm90IG92ZXJyaWRkZW4gYnkgTEFZRVJTX1BBVEhfRU5WCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gbG9hZGVyR2V0RGF0YUZpbGVzKGluc3QsIExPQURFUl9EQVRBX0ZJTEVfTUFOSUZFU1RfTEFZRVIsIGZhbHNlLCBOVUxMLCBOVUxMLCBWS19JTEFZRVJTX0lORk9fUkVHSVNUUllfTE9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTEFZRVJTX0lORk9fUkVMQVRJVkVfRElSLCAmbWFuaWZlc3RfZmlsZXMpKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChtYW5pZmVzdF9maWxlcy5jb3VudCAhPSAwKSB7CisgICAgICAgIHRvdGFsX2NvdW50ICs9IG1hbmlmZXN0X2ZpbGVzLmNvdW50OworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWFuaWZlc3RfZmlsZXMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmlsZV9zdHIgPSBtYW5pZmVzdF9maWxlcy5maWxlbmFtZV9saXN0W2ldOworICAgICAgICAgICAgaWYgKGZpbGVfc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUGFyc2UgZmlsZSBpbnRvIEpTT04gc3RydWN0CisgICAgICAgICAgICBWa1Jlc3VsdCByZXMgPSBsb2FkZXJfZ2V0X2pzb24oaW5zdCwgZmlsZV9zdHIsICZqc29uKTsKKyAgICAgICAgICAgIGlmIChWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkgPT0gcmVzKSB7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzIHx8IE5VTEwgPT0ganNvbikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWa1Jlc3VsdCBsb2NhbF9yZXMgPSBsb2FkZXJBZGRMYXllclByb3BlcnRpZXMoaW5zdCwgaW5zdGFuY2VfbGF5ZXJzLCBqc29uLCB0cnVlLCBmaWxlX3N0cik7CisgICAgICAgICAgICBjSlNPTl9EZWxldGUoanNvbik7CisKKyAgICAgICAgICAgIGlmIChWS19TVUNDRVNTICE9IGxvY2FsX3JlcykgeworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBvdmVycmlkZSBsYXllciBpcyBwcmVzZW50LCBhbmQgdXNlIGl0J3Mgb3ZlcnJpZGUgcGF0aHMuCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGludDMyX3QpaW5zdGFuY2VfbGF5ZXJzLT5jb3VudDsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqcHJvcCA9ICZpbnN0YW5jZV9sYXllcnMtPmxpc3RbaV07CisgICAgICAgIGlmIChwcm9wLT5pc19vdmVycmlkZSAmJiBsb2FkZXJJbXBsaWNpdExheWVySXNFbmFibGVkKGluc3QsIHByb3ApICYmIHByb3AtPm51bV9vdmVycmlkZV9wYXRocyA+IDApIHsKKyAgICAgICAgICAgIGNoYXIgKmN1cl93cml0ZV9wdHIgPSBOVUxMOworICAgICAgICAgICAgc2l6ZV90IG92ZXJyaWRlX3BhdGhfc2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgcHJvcC0+bnVtX292ZXJyaWRlX3BhdGhzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZV9wYXRoX3NpemUgKz0gRGV0ZXJtaW5lRGF0YUZpbGVQYXRoU2l6ZShwcm9wLT5vdmVycmlkZV9wYXRoc1tqXSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdmVycmlkZV9wYXRocyA9IGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIG92ZXJyaWRlX3BhdGhfc2l6ZSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCk7CisgICAgICAgICAgICBpZiAob3ZlcnJpZGVfcGF0aHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyX3dyaXRlX3B0ciA9ICZvdmVycmlkZV9wYXRoc1swXTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwcm9wLT5udW1fb3ZlcnJpZGVfcGF0aHM7IGorKykgeworICAgICAgICAgICAgICAgIENvcHlEYXRhRmlsZVBhdGgocHJvcC0+b3ZlcnJpZGVfcGF0aHNbal0sIE5VTEwsIDAsICZjdXJfd3JpdGVfcHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBwYXRoIHNlcGFyYXRvcgorICAgICAgICAgICAgLS1jdXJfd3JpdGVfcHRyOworICAgICAgICAgICAgYXNzZXJ0KGN1cl93cml0ZV9wdHIgLSBvdmVycmlkZV9wYXRocyA8IChwdHJkaWZmX3Qpb3ZlcnJpZGVfcGF0aF9zaXplKTsKKyAgICAgICAgICAgICpjdXJfd3JpdGVfcHRyID0gJ1wwJzsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coTlVMTCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwgImxvYWRlclNjYW5Gb3JMYXllcnM6IE92ZXJyaWRlIGxheWVyIGhhcyBvdmVycmlkZSBwYXRocyBzZXQgdG8gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9wYXRocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHZXQgYSBsaXN0IG9mIG1hbmlmZXN0IGZpbGVzIGZvciBleHBsaWNpdCBsYXllcnMKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSBsb2FkZXJHZXREYXRhRmlsZXMoaW5zdCwgTE9BREVSX0RBVEFfRklMRV9NQU5JRkVTVF9MQVlFUiwgdHJ1ZSwgIlZLX0xBWUVSX1BBVEgiLCBvdmVycmlkZV9wYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRUxBWUVSU19JTkZPX1JFR0lTVFJZX0xPQywgVktfRUxBWUVSU19JTkZPX1JFTEFUSVZFX0RJUiwgJm1hbmlmZXN0X2ZpbGVzKSkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgbGF5ZXIsIGlmIG5vdCwgZ28gYWhlYWQgYW5kIHJldHVybgorICAgIGlmIChtYW5pZmVzdF9maWxlcy5jb3VudCA9PSAwICYmIHRvdGFsX2NvdW50ID09IDApIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG90YWxfY291bnQgKz0gbWFuaWZlc3RfZmlsZXMuY291bnQ7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYW5pZmVzdF9maWxlcy5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaWxlX3N0ciA9IG1hbmlmZXN0X2ZpbGVzLmZpbGVuYW1lX2xpc3RbaV07CisgICAgICAgICAgICBpZiAoZmlsZV9zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQYXJzZSBmaWxlIGludG8gSlNPTiBzdHJ1Y3QKKyAgICAgICAgICAgIFZrUmVzdWx0IHJlcyA9IGxvYWRlcl9nZXRfanNvbihpbnN0LCBmaWxlX3N0ciwgJmpzb24pOworICAgICAgICAgICAgaWYgKFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSA9PSByZXMpIHsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoVktfU1VDQ0VTUyAhPSByZXMgfHwgTlVMTCA9PSBqc29uKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZrUmVzdWx0IGxvY2FsX3JlcyA9IGxvYWRlckFkZExheWVyUHJvcGVydGllcyhpbnN0LCBpbnN0YW5jZV9sYXllcnMsIGpzb24sIGZhbHNlLCBmaWxlX3N0cik7CisgICAgICAgICAgICBjSlNPTl9EZWxldGUoanNvbik7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBlcnJvciBpcyBhbnl0aGluZyBvdGhlciB0aGFuIG91dCBvZiBtZW1vcnkgd2Ugc3RpbGwgd2FudCB0byB0cnkgdG8gbG9hZCB0aGUgb3RoZXIgbGF5ZXJzCisgICAgICAgICAgICBpZiAoVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZID09IGxvY2FsX3JlcykgeworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2VlIGlmICJWS19MQVlFUl9MVU5BUkdfc3RhbmRhcmRfdmFsaWRhdGlvbiIgYWxyZWFkeSBpbiBsaXN0LgorICAgIGJvb2wgZm91bmRfc3RkX3ZhbCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnN0YW5jZV9sYXllcnMtPmNvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wcyA9ICZpbnN0YW5jZV9sYXllcnMtPmxpc3RbaV07CisgICAgICAgIGlmIChzdHJjbXAocHJvcHMtPmluZm8ubGF5ZXJOYW1lLCBzdGRfdmFsaWRhdGlvbl9zdHIpID09IDApIHsKKyAgICAgICAgICAgIGZvdW5kX3N0ZF92YWwgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCB0aGUgVktfTEFZRVJfTFVOQVJHX3N0YW5kYXJkX3ZhbGlkYXRpb24gbWV0YS1sYXllciBpbgorICAgIC8vIHRoZSBsaXN0LCB0aGVuIHdlIG5lZWQgdG8gYWRkIGl0IG1hbnVhbGx5LiAgVGhpcyBpcyBsaWtlbHkgYmVjYXVzZSB3ZSdyZQorICAgIC8vIGRlYWxpbmcgd2l0aCBhIG5ldyBsb2FkZXIsIGJ1dCBhbiBvbGQgbGF5ZXIgZm9sZGVyLgorICAgIGlmICghZm91bmRfc3RkX3ZhbCAmJiAhbG9hZGVyQWRkTGVnYWN5U3RhbmRhcmRWYWxpZGF0aW9uTGF5ZXIoaW5zdCwgaW5zdGFuY2VfbGF5ZXJzKSkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgYW55IG1ldGEtbGF5ZXJzIGluIHRoZSBsaXN0IGFyZSB2YWxpZCBhbmQgYWxsIHRoZSBjb21wb25lbnQgbGF5ZXJzIGFyZQorICAgIC8vIGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlIGF2YWlsYWJsZSBsYXllciBsaXN0CisgICAgVmVyaWZ5QWxsTWV0YUxheWVycyhpbnN0LCBpbnN0YW5jZV9sYXllcnMsICZvdmVycmlkZV9sYXllcl92YWxpZCk7CisKKyAgICBpZiAob3ZlcnJpZGVfbGF5ZXJfdmFsaWQpIHsKKyAgICAgICAgbG9hZGVyUmVtb3ZlTGF5ZXJzSW5CbGFja2xpc3QoaW5zdCwgaW5zdGFuY2VfbGF5ZXJzKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gaW5zdCkgeworICAgICAgICAgICAgaW5zdC0+b3ZlcnJpZGVfbGF5ZXJfcHJlc2VudCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKK291dDoKKworICAgIGlmIChOVUxMICE9IG92ZXJyaWRlX3BhdGhzKSB7CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgb3ZlcnJpZGVfcGF0aHMpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBtYW5pZmVzdF9maWxlcy5maWxlbmFtZV9saXN0KSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYW5pZmVzdF9maWxlcy5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBtYW5pZmVzdF9maWxlcy5maWxlbmFtZV9saXN0W2ldKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBtYW5pZmVzdF9maWxlcy5maWxlbmFtZV9saXN0W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIG1hbmlmZXN0X2ZpbGVzLmZpbGVuYW1lX2xpc3QpOworICAgIH0KKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2pzb25fbG9jayk7Cit9CisKK3ZvaWQgbG9hZGVyU2NhbkZvckltcGxpY2l0TGF5ZXJzKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqaW5zdGFuY2VfbGF5ZXJzKSB7CisgICAgY2hhciAqZmlsZV9zdHI7CisgICAgc3RydWN0IGxvYWRlcl9kYXRhX2ZpbGVzIG1hbmlmZXN0X2ZpbGVzOworICAgIGNKU09OICpqc29uOworICAgIGJvb2wgb3ZlcnJpZGVfbGF5ZXJfdmFsaWQgPSBmYWxzZTsKKyAgICBjaGFyICpvdmVycmlkZV9wYXRocyA9IE5VTEw7CisgICAgYm9vbCBpbXBsaWNpdF9tZXRhbGF5ZXJfcHJlc2VudCA9IGZhbHNlOworICAgIGJvb2wgaGF2ZV9qc29uX2xvY2sgPSBmYWxzZTsKKworICAgIC8vIEJlZm9yZSB3ZSBiZWdpbiBhbnl0aGluZywgaW5pdCBtYW5pZmVzdF9maWxlcyB0byBhdm9pZCBhIGRlbGV0ZSBvZiBnYXJiYWdlIG1lbW9yeSBpZgorICAgIC8vIGEgZmFpbHVyZSBvY2N1cnMgYmVmb3JlIGFsbG9jYXRpbmcgdGhlIG1hbmlmZXN0IGZpbGVuYW1lX2xpc3QuCisgICAgbWVtc2V0KCZtYW5pZmVzdF9maWxlcywgMCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfZGF0YV9maWxlcykpOworCisgICAgLy8gUGFzcyBOVUxMIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZSAtIGltcGxpY2l0IGxheWVycyBhcmUgbm90IG92ZXJyaWRkZW4gYnkgTEFZRVJTX1BBVEhfRU5WCisgICAgVmtSZXN1bHQgcmVzID0gbG9hZGVyR2V0RGF0YUZpbGVzKGluc3QsIExPQURFUl9EQVRBX0ZJTEVfTUFOSUZFU1RfTEFZRVIsIGZhbHNlLCBOVUxMLCBOVUxMLCBWS19JTEFZRVJTX0lORk9fUkVHSVNUUllfTE9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTEFZRVJTX0lORk9fUkVMQVRJVkVfRElSLCAmbWFuaWZlc3RfZmlsZXMpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcyB8fCBtYW5pZmVzdF9maWxlcy5jb3VudCA9PSAwKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIENsZWFudXAgYW55IHByZXZpb3VzbHkgc2Nhbm5lZCBsaWJyYXJpZXMKKyAgICBsb2FkZXJEZWxldGVMYXllckxpc3RBbmRQcm9wZXJ0aWVzKGluc3QsIGluc3RhbmNlX2xheWVycyk7CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9qc29uX2xvY2spOworICAgIGhhdmVfanNvbl9sb2NrID0gdHJ1ZTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYW5pZmVzdF9maWxlcy5jb3VudDsgaSsrKSB7CisgICAgICAgIGZpbGVfc3RyID0gbWFuaWZlc3RfZmlsZXMuZmlsZW5hbWVfbGlzdFtpXTsKKyAgICAgICAgaWYgKGZpbGVfc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gcGFyc2UgZmlsZSBpbnRvIEpTT04gc3RydWN0CisgICAgICAgIHJlcyA9IGxvYWRlcl9nZXRfanNvbihpbnN0LCBmaWxlX3N0ciwgJmpzb24pOworICAgICAgICBpZiAoVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZID09IHJlcykgeworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0gZWxzZSBpZiAoVktfU1VDQ0VTUyAhPSByZXMgfHwgTlVMTCA9PSBqc29uKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGxvYWRlckFkZExheWVyUHJvcGVydGllcyhpbnN0LCBpbnN0YW5jZV9sYXllcnMsIGpzb24sIHRydWUsIGZpbGVfc3RyKTsKKworICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGZpbGVfc3RyKTsKKyAgICAgICAgbWFuaWZlc3RfZmlsZXMuZmlsZW5hbWVfbGlzdFtpXSA9IE5VTEw7CisgICAgICAgIGNKU09OX0RlbGV0ZShqc29uKTsKKworICAgICAgICBpZiAoVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZID09IHJlcykgeworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgZWl0aGVyIHRoZSBvdmVycmlkZSBsYXllciBpcyBwcmVzZW50LCBvciBhbm90aGVyIGltcGxpY2l0IG1ldGEtbGF5ZXIuCisgICAgLy8gRWFjaCBvZiB0aGVzZSBtYXkgcmVxdWlyZSBleHBsaWNpdCBsYXllcnMgdG8gYmUgZW5hYmxlZCBhdCB0aGlzIHRpbWUuCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGludDMyX3QpaW5zdGFuY2VfbGF5ZXJzLT5jb3VudDsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqcHJvcCA9ICZpbnN0YW5jZV9sYXllcnMtPmxpc3RbaV07CisgICAgICAgIGlmIChwcm9wLT5pc19vdmVycmlkZSAmJiBsb2FkZXJJbXBsaWNpdExheWVySXNFbmFibGVkKGluc3QsIHByb3ApKSB7CisgICAgICAgICAgICBvdmVycmlkZV9sYXllcl92YWxpZCA9IHRydWU7CisgICAgICAgICAgICBpZiAocHJvcC0+bnVtX292ZXJyaWRlX3BhdGhzID4gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgKmN1cl93cml0ZV9wdHIgPSBOVUxMOworICAgICAgICAgICAgICAgIHNpemVfdCBvdmVycmlkZV9wYXRoX3NpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwcm9wLT5udW1fb3ZlcnJpZGVfcGF0aHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9wYXRoX3NpemUgKz0gRGV0ZXJtaW5lRGF0YUZpbGVQYXRoU2l6ZShwcm9wLT5vdmVycmlkZV9wYXRoc1tqXSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG92ZXJyaWRlX3BhdGhzID0gbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgb3ZlcnJpZGVfcGF0aF9zaXplLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DT01NQU5EKTsKKyAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGVfcGF0aHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VyX3dyaXRlX3B0ciA9ICZvdmVycmlkZV9wYXRoc1swXTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgcHJvcC0+bnVtX292ZXJyaWRlX3BhdGhzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ29weURhdGFGaWxlUGF0aChwcm9wLT5vdmVycmlkZV9wYXRoc1tqXSwgTlVMTCwgMCwgJmN1cl93cml0ZV9wdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAtLWN1cl93cml0ZV9wdHI7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGN1cl93cml0ZV9wdHIgLSBvdmVycmlkZV9wYXRocyA8IChwdHJkaWZmX3Qpb3ZlcnJpZGVfcGF0aF9zaXplKTsKKyAgICAgICAgICAgICAgICAqY3VyX3dyaXRlX3B0ciA9ICdcMCc7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhOVUxMLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlclNjYW5Gb3JJbXBsaWNpdExheWVyczogT3ZlcnJpZGUgbGF5ZXIgaGFzIG92ZXJyaWRlIHBhdGhzIHNldCB0byAlcyIsIG92ZXJyaWRlX3BhdGhzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghcHJvcC0+aXNfb3ZlcnJpZGUgJiYgcHJvcC0+dHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19NRVRBX0xBWUVSKSB7CisgICAgICAgICAgICBpbXBsaWNpdF9tZXRhbGF5ZXJfcHJlc2VudCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBlaXRoZXIgdGhlIG92ZXJyaWRlIGxheWVyIG9yIGFuIGltcGxpY2l0IG1ldGEtbGF5ZXIgYXJlIHByZXNlbnQsIHdlIG5lZWQgdG8gYWRkCisgICAgLy8gZXhwbGljaXQgbGF5ZXIgaW5mbyBhcyB3ZWxsLiAgTm90IHRvIHdvcnJ5LCB0aG91Z2gsIGFsbCBleHBsaWNpdCBsYXllcnMgbm90IGluY2x1ZGVkCisgICAgLy8gaW4gdGhlIG92ZXJyaWRlIGxheWVyIHdpbGwgYmUgcmVtb3ZlZCBiZWxvdyBpbiBsb2FkZXJSZW1vdmVMYXllcnNJbkJsYWNrbGlzdCgpLgorICAgIGlmIChvdmVycmlkZV9sYXllcl92YWxpZCB8fCBpbXBsaWNpdF9tZXRhbGF5ZXJfcHJlc2VudCkgeworICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSBsb2FkZXJHZXREYXRhRmlsZXMoaW5zdCwgTE9BREVSX0RBVEFfRklMRV9NQU5JRkVTVF9MQVlFUiwgdHJ1ZSwgIlZLX0xBWUVSX1BBVEgiLCBvdmVycmlkZV9wYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VMQVlFUlNfSU5GT19SRUdJU1RSWV9MT0MsIFZLX0VMQVlFUlNfSU5GT19SRUxBVElWRV9ESVIsICZtYW5pZmVzdF9maWxlcykpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1hbmlmZXN0X2ZpbGVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbGVfc3RyID0gbWFuaWZlc3RfZmlsZXMuZmlsZW5hbWVfbGlzdFtpXTsKKyAgICAgICAgICAgIGlmIChmaWxlX3N0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHBhcnNlIGZpbGUgaW50byBKU09OIHN0cnVjdAorICAgICAgICAgICAgcmVzID0gbG9hZGVyX2dldF9qc29uKGluc3QsIGZpbGVfc3RyLCAmanNvbik7CisgICAgICAgICAgICBpZiAoVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZID09IHJlcykgeworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfSBlbHNlIGlmIChWS19TVUNDRVNTICE9IHJlcyB8fCBOVUxMID09IGpzb24pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzID0gbG9hZGVyQWRkTGF5ZXJQcm9wZXJ0aWVzKGluc3QsIGluc3RhbmNlX2xheWVycywganNvbiwgdHJ1ZSwgZmlsZV9zdHIpOworCisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGZpbGVfc3RyKTsKKyAgICAgICAgICAgIGNKU09OX0RlbGV0ZShqc29uKTsKKworICAgICAgICAgICAgaWYgKFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSA9PSByZXMpIHsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZlcmlmeSBhbnkgbWV0YS1sYXllcnMgaW4gdGhlIGxpc3QgYXJlIHZhbGlkIGFuZCBhbGwgdGhlIGNvbXBvbmVudCBsYXllcnMgYXJlCisgICAgLy8gYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgYXZhaWxhYmxlIGxheWVyIGxpc3QKKyAgICBWZXJpZnlBbGxNZXRhTGF5ZXJzKGluc3QsIGluc3RhbmNlX2xheWVycywgJm92ZXJyaWRlX2xheWVyX3ZhbGlkKTsKKworICAgIGlmIChvdmVycmlkZV9sYXllcl92YWxpZCB8fCBpbXBsaWNpdF9tZXRhbGF5ZXJfcHJlc2VudCkgeworICAgICAgICBsb2FkZXJSZW1vdmVMYXllcnNOb3RJbkltcGxpY2l0TWV0YUxheWVycyhpbnN0LCBpbnN0YW5jZV9sYXllcnMpOworICAgICAgICBpZiAob3ZlcnJpZGVfbGF5ZXJfdmFsaWQgJiYgaW5zdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnN0LT5vdmVycmlkZV9sYXllcl9wcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworb3V0OgorCisgICAgaWYgKE5VTEwgIT0gb3ZlcnJpZGVfcGF0aHMpIHsKKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBvdmVycmlkZV9wYXRocyk7CisgICAgfQorICAgIGlmIChOVUxMICE9IG1hbmlmZXN0X2ZpbGVzLmZpbGVuYW1lX2xpc3QpIHsKKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBtYW5pZmVzdF9maWxlcy5maWxlbmFtZV9saXN0KTsKKyAgICB9CisKKyAgICBpZiAoaGF2ZV9qc29uX2xvY2spIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9qc29uX2xvY2spOworICAgIH0KK30KKworc3RhdGljIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgbG9hZGVyX2dwZHBhX2luc3RhbmNlX2ludGVybmFsKFZrSW5zdGFuY2UgaW5zdCwgY29uc3QgY2hhciAqcE5hbWUpIHsKKyAgICAvLyBpbnN0IGlzIG5vdCB3cmFwcGVkCisgICAgaWYgKGluc3QgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3BfdGFibGUgPSAqKFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKiopaW5zdDsKKyAgICB2b2lkICphZGRyOworCisgICAgaWYgKGRpc3BfdGFibGUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBib29sIGZvdW5kX25hbWU7CisgICAgYWRkciA9IGxvYWRlcl9sb29rdXBfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoZGlzcF90YWJsZSwgcE5hbWUsICZmb3VuZF9uYW1lKTsKKyAgICBpZiAoZm91bmRfbmFtZSkgeworICAgICAgICByZXR1cm4gYWRkcjsKKyAgICB9CisKKyAgICBpZiAobG9hZGVyX3BoeXNfZGV2X2V4dF9ncGEobG9hZGVyX2dldF9pbnN0YW5jZShpbnN0KSwgcE5hbWUsIHRydWUsIE5VTEwsICZhZGRyKSkgcmV0dXJuIGFkZHI7CisKKyAgICAvLyBEb24ndCBjYWxsIGRvd24gdGhlIGNoYWluLCB0aGlzIHdvdWxkIGJlIGFuIGluZmluaXRlIGxvb3AKKyAgICBsb2FkZXJfbG9nKE5VTEwsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsICJsb2FkZXJfZ3BkcGFfaW5zdGFuY2VfaW50ZXJuYWwoKSB1bnJlY29nbml6ZWQgbmFtZSAlcyIsIHBOYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgbG9hZGVyX2dwZHBhX2luc3RhbmNlX3Rlcm1pbmF0b3IoVmtJbnN0YW5jZSBpbnN0LCBjb25zdCBjaGFyICpwTmFtZSkgeworICAgIC8vIGluc3QgaXMgbm90IHdyYXBwZWQKKyAgICBpZiAoaW5zdCA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcF90YWJsZSA9ICooVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqKilpbnN0OworICAgIHZvaWQgKmFkZHI7CisKKyAgICBpZiAoZGlzcF90YWJsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGJvb2wgZm91bmRfbmFtZTsKKyAgICBhZGRyID0gbG9hZGVyX2xvb2t1cF9pbnN0YW5jZV9kaXNwYXRjaF90YWJsZShkaXNwX3RhYmxlLCBwTmFtZSwgJmZvdW5kX25hbWUpOworICAgIGlmIChmb3VuZF9uYW1lKSB7CisgICAgICAgIHJldHVybiBhZGRyOworICAgIH0KKworICAgIC8vIEdldCB0aGUgdGVybWluYXRvciwgYnV0IGRvbid0IHBlcmZvcm0gY2hlY2tpbmcgc2luY2UgaXQgc2hvdWxkIGFscmVhZHkKKyAgICAvLyBoYXZlIGJlZW4gc2V0dXAgaWYgd2UgZ2V0IGhlcmUuCisgICAgaWYgKGxvYWRlcl9waHlzX2Rldl9leHRfZ3BhKGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdCksIHBOYW1lLCBmYWxzZSwgTlVMTCwgJmFkZHIpKSB7CisgICAgICAgIHJldHVybiBhZGRyOworICAgIH0KKworICAgIC8vIERvbid0IGNhbGwgZG93biB0aGUgY2hhaW4sIHRoaXMgd291bGQgYmUgYW4gaW5maW5pdGUgbG9vcAorICAgIGxvYWRlcl9sb2coTlVMTCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwgImxvYWRlcl9ncGRwYV9pbnN0YW5jZV90ZXJtaW5hdG9yKCkgdW5yZWNvZ25pemVkIG5hbWUgJXMiLCBwTmFtZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIGxvYWRlcl9ncGFfaW5zdGFuY2VfaW50ZXJuYWwoVmtJbnN0YW5jZSBpbnN0LCBjb25zdCBjaGFyICpwTmFtZSkgeworICAgIGlmICghc3RyY21wKHBOYW1lLCAidmtHZXRJbnN0YW5jZVByb2NBZGRyIikpIHsKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbG9hZGVyX2dwYV9pbnN0YW5jZV9pbnRlcm5hbDsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJ2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIiKSkgeworICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbilsb2FkZXJfZ3BkcGFfaW5zdGFuY2VfdGVybWluYXRvcjsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJ2a0NyZWF0ZUluc3RhbmNlIikpIHsKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pdGVybWluYXRvcl9DcmVhdGVJbnN0YW5jZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJ2a0NyZWF0ZURldmljZSIpKSB7CisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKXRlcm1pbmF0b3JfQ3JlYXRlRGV2aWNlOworICAgIH0KKworICAgIC8vIGluc3QgaXMgbm90IHdyYXBwZWQKKyAgICBpZiAoaW5zdCA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcF90YWJsZSA9ICooVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqKilpbnN0OworICAgIHZvaWQgKmFkZHI7CisKKyAgICBpZiAoZGlzcF90YWJsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGJvb2wgZm91bmRfbmFtZTsKKyAgICBhZGRyID0gbG9hZGVyX2xvb2t1cF9pbnN0YW5jZV9kaXNwYXRjaF90YWJsZShkaXNwX3RhYmxlLCBwTmFtZSwgJmZvdW5kX25hbWUpOworICAgIGlmIChmb3VuZF9uYW1lKSB7CisgICAgICAgIHJldHVybiBhZGRyOworICAgIH0KKworICAgIC8vIERvbid0IGNhbGwgZG93biB0aGUgY2hhaW4sIHRoaXMgd291bGQgYmUgYW4gaW5maW5pdGUgbG9vcAorICAgIGxvYWRlcl9sb2coTlVMTCwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwgImxvYWRlcl9ncGFfaW5zdGFuY2VfaW50ZXJuYWwoKSB1bnJlY29nbml6ZWQgbmFtZSAlcyIsIHBOYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBsb2FkZXJfZ3BhX2RldmljZV9pbnRlcm5hbChWa0RldmljZSBkZXZpY2UsIGNvbnN0IGNoYXIgKnBOYW1lKSB7CisgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGxvYWRlcl9nZXRfaWNkX2FuZF9kZXZpY2UoZGV2aWNlLCAmZGV2LCBOVUxMKTsKKworICAgIC8vIFJldHVybiB0aGlzIGZ1bmN0aW9uIGlmIGEgbGF5ZXIgYWJvdmUgaGVyZSBpcyBhc2tpbmcgZm9yIHRoZSB2a0dldERldmljZVByb2NBZGRyLgorICAgIC8vIFRoaXMgaXMgc28gd2UgY2FuIHByb3Blcmx5IGludGVyY2VwdCBhbnkgZGV2aWNlIGNvbW1hbmRzIG5lZWRpbmcgYSB0ZXJtaW5hdG9yLgorICAgIGlmICghc3RyY21wKHBOYW1lLCAidmtHZXREZXZpY2VQcm9jQWRkciIpKSB7CisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKWxvYWRlcl9ncGFfZGV2aWNlX2ludGVybmFsOworICAgIH0KKworICAgIC8vIE5PVEU6IERldmljZSBGdW5jcyBuZWVkaW5nIFRyYW1wb2xpbmUvVGVybWluYXRvci4KKyAgICAvLyBPdmVycmlkZXMgZm9yIGRldmljZSBmdW5jdGlvbnMgbmVlZGluZyBhIHRyYW1wb2xpbmUgYW5kCisgICAgLy8gYSB0ZXJtaW5hdG9yIGJlY2F1c2UgY2VydGFpbiBkZXZpY2UgZW50cnktcG9pbnRzIHN0aWxsIG5lZWQgdG8gZ28KKyAgICAvLyB0aHJvdWdoIGEgdGVybWluYXRvciBiZWZvcmUgaGl0dGluZyB0aGUgSUNELiAgVGhpcyBjb3VsZCBiZSBmb3IKKyAgICAvLyBzZXZlcmFsIHJlYXNvbnMsIGJ1dCB0aGUgbWFpbiBvbmUgaXMgY3VycmVudGx5IHVud3JhcHBpbmcgYW4KKyAgICAvLyBvYmplY3QgYmVmb3JlIHBhc3NpbmcgdGhlIGFwcHJvcHJpYXRlIGluZm8gYWxvbmcgdG8gdGhlIElDRC4KKyAgICAvLyBUaGlzIGlzIHdoeSB3ZSBhbHNvIGhhdmUgdG8gb3ZlcnJpZGUgdGhlIGRpcmVjdCBJQ0QgY2FsbCB0bworICAgIC8vIHZrR2V0RGV2aWNlUHJvY0FkZHIgdG8gaW50ZXJjZXB0IHRob3NlIGNhbGxzLgorICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBhZGRyID0gZ2V0X2V4dGVuc2lvbl9kZXZpY2VfcHJvY190ZXJtaW5hdG9yKGRldiwgcE5hbWUpOworICAgIGlmIChOVUxMICE9IGFkZHIpIHsKKyAgICAgICAgcmV0dXJuIGFkZHI7CisgICAgfQorCisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIHBOYW1lKTsKK30KKworLy8gSW5pdGlhbGl6ZSBkZXZpY2VfZXh0IGRpc3BhdGNoIHRhYmxlIGVudHJ5IGFzIGZvbGxvd3M6CisvLyBJZiBkZXYgPT0gTlVMTCBmaW5kIGFsbCBsb2dpY2FsIGRldmljZXMgY3JlYXRlZCB3aXRoaW4gdGhpcyBpbnN0YW5jZSBhbmQKKy8vICBpbml0IHRoZSBlbnRyeSAoZ2l2ZW4gYnkgaWR4KSBpbiB0aGUgZXh0IGRpc3BhdGNoIHRhYmxlLgorLy8gSWYgZGV2ICE9IE5VTEwgb25seSBpbml0aWFsaXplIHRoZSBlbnRyeSBpbiB0aGUgZ2l2ZW4gZGV2J3MgZGlzcGF0Y2ggdGFibGUuCisvLyBUaGUgaW5pdGlhbGl6YXRpb24gdmFsdWUgaXMgZ290dGVuIGJ5IGNhbGxpbmcgZG93biB0aGUgZGV2aWNlIGNoYWluIHdpdGgKKy8vIEdEUEEuCisvLyBJZiBHRFBBIHJldHVybnMgTlVMTCB0aGVuIGRvbid0IGluaXRpYWxpemUgdGhlIGRpc3BhdGNoIHRhYmxlIGVudHJ5Lgorc3RhdGljIHZvaWQgbG9hZGVyX2luaXRfZGlzcGF0Y2hfZGV2X2V4dF9lbnRyeShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2LCB1aW50MzJfdCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKQorCit7CisgICAgdm9pZCAqZ2RwYV92YWx1ZTsKKyAgICBpZiAoZGV2ICE9IE5VTEwpIHsKKyAgICAgICAgZ2RwYV92YWx1ZSA9IGRldi0+bG9hZGVyX2Rpc3BhdGNoLmNvcmVfZGlzcGF0Y2guR2V0RGV2aWNlUHJvY0FkZHIoZGV2LT5jaGFpbl9kZXZpY2UsIGZ1bmNOYW1lKTsKKyAgICAgICAgaWYgKGdkcGFfdmFsdWUgIT0gTlVMTCkgZGV2LT5sb2FkZXJfZGlzcGF0Y2guZXh0X2Rpc3BhdGNoLmRldl9leHRbaWR4XSA9IChQRk5fdmtEZXZFeHQpZ2RwYV92YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0KSB7CisgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqbGRldiA9IGljZF90ZXJtLT5sb2dpY2FsX2RldmljZV9saXN0OworICAgICAgICAgICAgd2hpbGUgKGxkZXYpIHsKKyAgICAgICAgICAgICAgICBnZHBhX3ZhbHVlID0gbGRldi0+bG9hZGVyX2Rpc3BhdGNoLmNvcmVfZGlzcGF0Y2guR2V0RGV2aWNlUHJvY0FkZHIobGRldi0+Y2hhaW5fZGV2aWNlLCBmdW5jTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGdkcGFfdmFsdWUgIT0gTlVMTCkgbGRldi0+bG9hZGVyX2Rpc3BhdGNoLmV4dF9kaXNwYXRjaC5kZXZfZXh0W2lkeF0gPSAoUEZOX3ZrRGV2RXh0KWdkcGFfdmFsdWU7CisgICAgICAgICAgICAgICAgbGRldiA9IGxkZXYtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEZpbmQgYWxsIGRldiBleHRlbnNpb24gaW4gdGhlIGhhc2ggdGFibGUgIGFuZCBpbml0aWFsaXplIHRoZSBkaXNwYXRjaCB0YWJsZQorLy8gZm9yIGRldiAgZm9yIGVhY2ggb2YgdGhvc2UgZXh0ZW5zaW9uIGVudHJ5cG9pbnRzIGZvdW5kIGluIGhhc2ggdGFibGUuCit2b2lkIGxvYWRlcl9pbml0X2Rpc3BhdGNoX2Rldl9leHQoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldikgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1VOS05PV05fRVhUUzsgaSsrKSB7CisgICAgICAgIGlmIChpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFtpXS5mdW5jX25hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIGxvYWRlcl9pbml0X2Rpc3BhdGNoX2Rldl9leHRfZW50cnkoaW5zdCwgZGV2LCBpLCBpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFtpXS5mdW5jX25hbWUpOworICAgIH0KK30KKworc3RhdGljIGJvb2wgbG9hZGVyX2NoZWNrX2ljZHNfZm9yX2Rldl9leHRfYWRkcmVzcyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtOworICAgIGljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOworICAgIHdoaWxlIChOVUxMICE9IGljZF90ZXJtKSB7CisgICAgICAgIGlmIChpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPkdldEluc3RhbmNlUHJvY0FkZHIoaWNkX3Rlcm0tPmluc3RhbmNlLCBmdW5jTmFtZSkpCisgICAgICAgICAgICAvLyB0aGlzIGljZCBzdXBwb3J0cyBmdW5jTmFtZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBsb2FkZXJfY2hlY2tfbGF5ZXJfbGlzdF9mb3JfZGV2X2V4dF9hZGRyZXNzKGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqY29uc3QgbGF5ZXJzLCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbGF5ZXJzLgorICAgIGZvciAodWludDMyX3QgbGF5ZXIgPSAwOyBsYXllciA8IGxheWVycy0+Y291bnQ7ICsrbGF5ZXIpIHsKKyAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBleHRlbnNpb25zLgorICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2RldmljZV9leHRlbnNpb25fbGlzdCAqY29uc3QgZXh0ZW5zaW9ucyA9ICYobGF5ZXJzLT5saXN0W2xheWVyXS5kZXZpY2VfZXh0ZW5zaW9uX2xpc3QpOworICAgICAgICBmb3IgKHVpbnQzMl90IGV4dGVuc2lvbiA9IDA7IGV4dGVuc2lvbiA8IGV4dGVuc2lvbnMtPmNvdW50OyArK2V4dGVuc2lvbikgeworICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBlbnRyeSBwb2ludHMuCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2Rldl9leHRfcHJvcHMgKmNvbnN0IHByb3BlcnR5ID0gJihleHRlbnNpb25zLT5saXN0W2V4dGVuc2lvbl0pOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBlbnRyeSA9IDA7IGVudHJ5IDwgcHJvcGVydHktPmVudHJ5cG9pbnRfY291bnQ7ICsrZW50cnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHByb3BlcnR5LT5lbnRyeXBvaW50c1tlbnRyeV0sIGZ1bmNOYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgbG9hZGVyX2ZyZWVfZGV2X2V4dF90YWJsZShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVU5LTk9XTl9FWFRTOyBpKyspIHsKKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFtpXS5mdW5jX25hbWUpOworICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGluc3QtPmRldl9leHRfZGlzcF9oYXNoW2ldLmxpc3QuaW5kZXgpOworICAgIH0KKyAgICBtZW1zZXQoaW5zdC0+ZGV2X2V4dF9kaXNwX2hhc2gsIDAsIHNpemVvZihpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaCkpOworfQorCitzdGF0aWMgYm9vbCBsb2FkZXJfYWRkX2Rldl9leHRfdGFibGUoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgdWludDMyX3QgKnB0cl9pZHgsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKSB7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBpZHggPSAqcHRyX2lkeDsKKyAgICBzdHJ1Y3QgbG9hZGVyX2Rpc3BhdGNoX2hhc2hfbGlzdCAqbGlzdCA9ICZpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFtpZHhdLmxpc3Q7CisKKyAgICBpZiAoIWluc3QtPmRldl9leHRfZGlzcF9oYXNoW2lkeF0uZnVuY19uYW1lKSB7CisgICAgICAgIC8vIG5vIGVudHJ5IGhlcmUgYXQgdGhpcyBpZHgsIHNvIHVzZSBpdAorICAgICAgICBhc3NlcnQobGlzdC0+Y2FwYWNpdHkgPT0gMCk7CisgICAgICAgIGluc3QtPmRldl9leHRfZGlzcF9oYXNoW2lkeF0uZnVuY19uYW1lID0KKyAgICAgICAgICAgIChjaGFyICopbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgc3RybGVuKGZ1bmNOYW1lKSArIDEsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgaWYgKGluc3QtPmRldl9leHRfZGlzcF9oYXNoW2lkeF0uZnVuY19uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJfYWRkX2Rldl9leHRfdGFibGU6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGZ1bmNfbmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdHJuY3B5KGluc3QtPmRldl9leHRfZGlzcF9oYXNoW2lkeF0uZnVuY19uYW1lLCBmdW5jTmFtZSwgc3RybGVuKGZ1bmNOYW1lKSArIDEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgZW5vdWdoIGNhcGFjaXR5CisgICAgaWYgKGxpc3QtPmNhcGFjaXR5ID09IDApIHsKKyAgICAgICAgbGlzdC0+aW5kZXggPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCA4ICogc2l6ZW9mKCoobGlzdC0+aW5kZXgpKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICBpZiAobGlzdC0+aW5kZXggPT0gTlVMTCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9hZGRfZGV2X2V4dF90YWJsZTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbGlzdCBpbmRleCBvZiBmdW5jdGlvbiAlcyIsIGZ1bmNOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBsaXN0LT5jYXBhY2l0eSA9IDggKiBzaXplb2YoKihsaXN0LT5pbmRleCkpOworICAgIH0gZWxzZSBpZiAobGlzdC0+Y2FwYWNpdHkgPCAobGlzdC0+Y291bnQgKyAxKSAqIHNpemVvZigqKGxpc3QtPmluZGV4KSkpIHsKKyAgICAgICAgdm9pZCAqbmV3X3B0ciA9IGxvYWRlcl9pbnN0YW5jZV9oZWFwX3JlYWxsb2MoaW5zdCwgbGlzdC0+aW5kZXgsIGxpc3QtPmNhcGFjaXR5LCBsaXN0LT5jYXBhY2l0eSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gbmV3X3B0cikgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9hZGRfZGV2X2V4dF90YWJsZTogRmFpbGVkIHRvIHJlYWxsb2NhdGUgbWVtb3J5IGZvciBsaXN0IGluZGV4IG9mIGZ1bmN0aW9uICVzIiwgZnVuY05hbWUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGxpc3QtPmluZGV4ID0gbmV3X3B0cjsKKyAgICAgICAgbGlzdC0+Y2FwYWNpdHkgKj0gMjsKKyAgICB9CisKKyAgICAvLyBmaW5kIGFuIHVudXNlZCBpbmRleCBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgdXNlIGl0CisgICAgaSA9IChpZHggKyAxKSAlIE1BWF9OVU1fVU5LTk9XTl9FWFRTOworICAgIGRvIHsKKyAgICAgICAgaWYgKCFpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFtpXS5mdW5jX25hbWUpIHsKKyAgICAgICAgICAgIGFzc2VydChpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFtpXS5saXN0LmNhcGFjaXR5ID09IDApOworICAgICAgICAgICAgaW5zdC0+ZGV2X2V4dF9kaXNwX2hhc2hbaV0uZnVuY19uYW1lID0KKyAgICAgICAgICAgICAgICAoY2hhciAqKWxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKGluc3QsIHN0cmxlbihmdW5jTmFtZSkgKyAxLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgICAgICAgICBpZiAoaW5zdC0+ZGV2X2V4dF9kaXNwX2hhc2hbaV0uZnVuY19uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9hZGRfZGV2X2V4dF90YWJsZTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGZ1bmNfbmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jTmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybmNweShpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFtpXS5mdW5jX25hbWUsIGZ1bmNOYW1lLCBzdHJsZW4oZnVuY05hbWUpICsgMSk7CisgICAgICAgICAgICBsaXN0LT5pbmRleFtsaXN0LT5jb3VudF0gPSBpOworICAgICAgICAgICAgbGlzdC0+Y291bnQrKzsKKyAgICAgICAgICAgICpwdHJfaWR4ID0gaTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGkgPSAoaSArIDEpICUgTUFYX05VTV9VTktOT1dOX0VYVFM7CisgICAgfSB3aGlsZSAoaSAhPSBpZHgpOworCisgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICJsb2FkZXJfYWRkX2Rldl9leHRfdGFibGU6ICBDb3VsZCBub3QgaW5zZXJ0IGludG8gaGFzaCB0YWJsZTsgaXMgIgorICAgICAgICAgICAgICAgIml0IGZ1bGw/Iik7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGxvYWRlcl9uYW1lX2luX2Rldl9leHRfdGFibGUoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgdWludDMyX3QgKmlkeCwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICB1aW50MzJfdCBhbHRfaWR4OworICAgIGlmIChpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFsqaWR4XS5mdW5jX25hbWUgJiYgIXN0cmNtcChpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFsqaWR4XS5mdW5jX25hbWUsIGZ1bmNOYW1lKSkgcmV0dXJuIHRydWU7CisKKyAgICAvLyBmdW5jTmFtZSB3YXNuJ3QgYXQgdGhlIHByaW1hcnkgc3BvdCBpbiB0aGUgaGFzaCB0YWJsZQorICAgIC8vIHNlYXJjaCB0aGUgbGlzdCBvZiBzZWNvbmRhcnkgbG9jYXRpb25zIChzaGFsbG93IHNlYXJjaCwgbm90IGRlZXAgc2VhcmNoKQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnN0LT5kZXZfZXh0X2Rpc3BfaGFzaFsqaWR4XS5saXN0LmNvdW50OyBpKyspIHsKKyAgICAgICAgYWx0X2lkeCA9IGluc3QtPmRldl9leHRfZGlzcF9oYXNoWyppZHhdLmxpc3QuaW5kZXhbaV07CisgICAgICAgIGlmICghc3RyY21wKGluc3QtPmRldl9leHRfZGlzcF9oYXNoWyppZHhdLmZ1bmNfbmFtZSwgZnVuY05hbWUpKSB7CisgICAgICAgICAgICAqaWR4ID0gYWx0X2lkeDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZ2VuZXJpYyB0cmFtcG9saW5lIGNvZGUgYWRkcmVzcyBmb3IgdW5rbm93biBlbnRyeQorLy8gcG9pbnRzLgorLy8gUHJlc3VtYWJseSwgdGhlc2UgdW5rbm93biBlbnRyeSBwb2ludHMgKGFzIGdpdmVuIGJ5IGZ1bmNOYW1lKSBhcmUgZGV2aWNlCisvLyBleHRlbnNpb24gZW50cnlwb2ludHMuICBBIGhhc2ggdGFibGUgaXMgdXNlZCB0byBrZWVwIGEgbGlzdCBvZiB1bmtub3duIGVudHJ5CisvLyBwb2ludHMgYW5kIHRoZWlyIG1hcHBpbmcgdG8gdGhlIGRldmljZSBleHRlbnNpb24gZGlzcGF0Y2ggdGFibGUKKy8vIChzdHJ1Y3QgbG9hZGVyX2Rldl9leHRfZGlzcGF0Y2hfdGFibGUpLgorLy8gXHJldHVybnMKKy8vIEZvciBhIGdpdmVuIGVudHJ5IHBvaW50IHN0cmluZyAoZnVuY05hbWUpLCBpZiBhbiBleGlzdGluZyBtYXBwaW5nIGlzIGZvdW5kCisvLyB0aGUKKy8vIHRyYW1wb2xpbmUgYWRkcmVzcyBmb3IgdGhhdCBtYXBwaW5nIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoaXMgdW5rbm93bgorLy8gZW50cnkgcG9pbnQKKy8vIGhhcyBub3QgYmVlbiBzZWVuIHlldC4gTmV4dCBjaGVjayBpZiBhIGxheWVyIG9yIElDRCBzdXBwb3J0cyBpdC4gIElmIHNvIHRoZW4KKy8vIGEKKy8vIG5ldyBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBpcyBpbml0aWFsaXplZCBhbmQgdGhhdCB0cmFtcG9saW5lIGFkZHJlc3MgZm9yCisvLyB0aGUgbmV3IGVudHJ5IGlzIHJldHVybmVkLiBOdWxsIGlzIHJldHVybmVkIGlmIHRoZSBoYXNoIHRhYmxlIGlzIGZ1bGwgb3IKKy8vIGlmIG5vIGRpc2NvdmVyZWQgbGF5ZXIgb3IgSUNEIHJldHVybnMgYSBub24tTlVMTCBHZXRQcm9jQWRkciBmb3IgaXQuCit2b2lkICpsb2FkZXJfZGV2X2V4dF9ncGEoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICB1aW50MzJfdCBpZHg7CisgICAgdWludDMyX3Qgc2VlZCA9IDA7CisKKyAgICBpZHggPSBtdXJtdXJoYXNoKGZ1bmNOYW1lLCBzdHJsZW4oZnVuY05hbWUpLCBzZWVkKSAlIE1BWF9OVU1fVU5LTk9XTl9FWFRTOworCisgICAgaWYgKGxvYWRlcl9uYW1lX2luX2Rldl9leHRfdGFibGUoaW5zdCwgJmlkeCwgZnVuY05hbWUpKQorICAgICAgICAvLyBmb3VuZCBmdW5jTmFtZSBhbHJlYWR5IGluIGhhc2gKKyAgICAgICAgcmV0dXJuIGxvYWRlcl9nZXRfZGV2X2V4dF90cmFtcG9saW5lKGlkeCk7CisKKyAgICAvLyBDaGVjayBpZiBmdW5jTmFtZSBpcyBzdXBwb3J0ZWQgaW4gZWl0aGVyIElDRHMgb3IgYSBsYXllciBsaWJyYXJ5CisgICAgaWYgKCFsb2FkZXJfY2hlY2tfaWNkc19mb3JfZGV2X2V4dF9hZGRyZXNzKGluc3QsIGZ1bmNOYW1lKSAmJgorICAgICAgICAhbG9hZGVyX2NoZWNrX2xheWVyX2xpc3RfZm9yX2Rldl9leHRfYWRkcmVzcygmaW5zdC0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0LCBmdW5jTmFtZSkpIHsKKyAgICAgICAgLy8gaWYgc3VwcG9ydCBmb3VuZCBpbiBsYXllcnMgY29udGludWUgb24KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGxvYWRlcl9hZGRfZGV2X2V4dF90YWJsZShpbnN0LCAmaWR4LCBmdW5jTmFtZSkpIHsKKyAgICAgICAgLy8gc3VjY2Vzc2Z1bGx5IGFkZGVkIG5ldyB0YWJsZSBlbnRyeQorICAgICAgICAvLyBpbml0IGFueSBkZXYgZGlzcGF0Y2ggdGFibGUgZW50cmllcyBhcyBuZWVkZWQKKyAgICAgICAgbG9hZGVyX2luaXRfZGlzcGF0Y2hfZGV2X2V4dF9lbnRyeShpbnN0LCBOVUxMLCBpZHgsIGZ1bmNOYW1lKTsKKyAgICAgICAgcmV0dXJuIGxvYWRlcl9nZXRfZGV2X2V4dF90cmFtcG9saW5lKGlkeCk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIGxvYWRlcl9jaGVja19pY2RzX2Zvcl9waHlzX2Rldl9leHRfYWRkcmVzcyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtOworICAgIGljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOworICAgIHdoaWxlIChOVUxMICE9IGljZF90ZXJtKSB7CisgICAgICAgIGlmIChpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmludGVyZmFjZV92ZXJzaW9uID49IE1JTl9QSFlTX0RFVl9FWFRFTlNJT05fSUNEX0lOVEVSRkFDRV9WRVJTSU9OICYmCisgICAgICAgICAgICBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPkdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIoaWNkX3Rlcm0tPmluc3RhbmNlLCBmdW5jTmFtZSkpCisgICAgICAgICAgICAvLyB0aGlzIGljZCBzdXBwb3J0cyBmdW5jTmFtZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBsb2FkZXJfY2hlY2tfbGF5ZXJfbGlzdF9mb3JfcGh5c19kZXZfZXh0X2FkZHJlc3Moc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKmxheWVyX3Byb3BfbGlzdCA9IGluc3QtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3Q7CisgICAgZm9yICh1aW50MzJfdCBsYXllciA9IDA7IGxheWVyIDwgaW5zdC0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QuY291bnQ7ICsrbGF5ZXIpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBsYXllciBzdXBwb3J0cyB0aGUgdmtfbGF5ZXJHZXRQaHlzaWNhbERldmljZVByb2NBZGRyLCB0aGVuIGNhbGwKKyAgICAgICAgLy8gaXQgYW5kIHNlZSBpZiBpdCByZXR1cm5zIGEgdmFsaWQgcG9pbnRlciBmb3IgdGhpcyBmdW5jdGlvbiBuYW1lLgorICAgICAgICBpZiAobGF5ZXJfcHJvcF9saXN0W2xheWVyXS5pbnRlcmZhY2VfdmVyc2lvbiA+IDEpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfZnVuY3Rpb25zICpjb25zdCBmdW5jdGlvbnMgPSAmKGxheWVyX3Byb3BfbGlzdFtsYXllcl0uZnVuY3Rpb25zKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGZ1bmN0aW9ucy0+Z2V0X3BoeXNpY2FsX2RldmljZV9wcm9jX2FkZHIgJiYKKyAgICAgICAgICAgICAgICBOVUxMICE9IGZ1bmN0aW9ucy0+Z2V0X3BoeXNpY2FsX2RldmljZV9wcm9jX2FkZHIoKFZrSW5zdGFuY2UpaW5zdC0+aW5zdGFuY2UsIGZ1bmNOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBsb2FkZXJfZnJlZV9waHlzX2Rldl9leHRfdGFibGUoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1VOS05PV05fRVhUUzsgaSsrKSB7CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgaW5zdC0+cGh5c19kZXZfZXh0X2Rpc3BfaGFzaFtpXS5mdW5jX25hbWUpOworICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGluc3QtPnBoeXNfZGV2X2V4dF9kaXNwX2hhc2hbaV0ubGlzdC5pbmRleCk7CisgICAgfQorICAgIG1lbXNldChpbnN0LT5waHlzX2Rldl9leHRfZGlzcF9oYXNoLCAwLCBzaXplb2YoaW5zdC0+cGh5c19kZXZfZXh0X2Rpc3BfaGFzaCkpOworfQorCitzdGF0aWMgYm9vbCBsb2FkZXJfYWRkX3BoeXNfZGV2X2V4dF90YWJsZShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCB1aW50MzJfdCAqcHRyX2lkeCwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQzMl90IGlkeCA9ICpwdHJfaWR4OworICAgIHN0cnVjdCBsb2FkZXJfZGlzcGF0Y2hfaGFzaF9saXN0ICpsaXN0ID0gJmluc3QtPnBoeXNfZGV2X2V4dF9kaXNwX2hhc2hbaWR4XS5saXN0OworCisgICAgaWYgKCFpbnN0LT5waHlzX2Rldl9leHRfZGlzcF9oYXNoW2lkeF0uZnVuY19uYW1lKSB7CisgICAgICAgIC8vIG5vIGVudHJ5IGhlcmUgYXQgdGhpcyBpZHgsIHNvIHVzZSBpdAorICAgICAgICBhc3NlcnQobGlzdC0+Y2FwYWNpdHkgPT0gMCk7CisgICAgICAgIGluc3QtPnBoeXNfZGV2X2V4dF9kaXNwX2hhc2hbaWR4XS5mdW5jX25hbWUgPQorICAgICAgICAgICAgKGNoYXIgKilsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBzdHJsZW4oZnVuY05hbWUpICsgMSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICBpZiAoaW5zdC0+cGh5c19kZXZfZXh0X2Rpc3BfaGFzaFtpZHhdLmZ1bmNfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2FkZF9waHlzX2Rldl9leHRfdGFibGUoKSBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZ1bmNfbmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoaW5zdC0+cGh5c19kZXZfZXh0X2Rpc3BfaGFzaFtpZHhdLmZ1bmNfbmFtZSwgZnVuY05hbWUsIHN0cmxlbihmdW5jTmFtZSkgKyAxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGVub3VnaCBjYXBhY2l0eQorICAgIGlmIChsaXN0LT5jYXBhY2l0eSA9PSAwKSB7CisgICAgICAgIGxpc3QtPmluZGV4ID0gbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgOCAqIHNpemVvZigqKGxpc3QtPmluZGV4KSksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgaWYgKGxpc3QtPmluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsICJsb2FkZXJfYWRkX3BoeXNfZGV2X2V4dF90YWJsZSgpIGNhbid0IGFsbG9jYXRlIGxpc3QgbWVtb3J5Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbGlzdC0+Y2FwYWNpdHkgPSA4ICogc2l6ZW9mKCoobGlzdC0+aW5kZXgpKTsKKyAgICB9IGVsc2UgaWYgKGxpc3QtPmNhcGFjaXR5IDwgKGxpc3QtPmNvdW50ICsgMSkgKiBzaXplb2YoKihsaXN0LT5pbmRleCkpKSB7CisgICAgICAgIHZvaWQgKm5ld19wdHIgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9yZWFsbG9jKGluc3QsIGxpc3QtPmluZGV4LCBsaXN0LT5jYXBhY2l0eSwgbGlzdC0+Y2FwYWNpdHkgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgICAgIGlmIChOVUxMID09IG5ld19wdHIpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsICJsb2FkZXJfYWRkX3BoeXNfZGV2X2V4dF90YWJsZSgpIGNhbid0IHJlYWxsb2NhdGUgbGlzdCBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBsaXN0LT5pbmRleCA9IG5ld19wdHI7CisgICAgICAgIGxpc3QtPmNhcGFjaXR5ICo9IDI7CisgICAgfQorCisgICAgLy8gZmluZCBhbiB1bnVzZWQgaW5kZXggaW4gdGhlIGhhc2ggdGFibGUgYW5kIHVzZSBpdAorICAgIGkgPSAoaWR4ICsgMSkgJSBNQVhfTlVNX1VOS05PV05fRVhUUzsKKyAgICBkbyB7CisgICAgICAgIGlmICghaW5zdC0+cGh5c19kZXZfZXh0X2Rpc3BfaGFzaFtpXS5mdW5jX25hbWUpIHsKKyAgICAgICAgICAgIGFzc2VydChpbnN0LT5waHlzX2Rldl9leHRfZGlzcF9oYXNoW2ldLmxpc3QuY2FwYWNpdHkgPT0gMCk7CisgICAgICAgICAgICBpbnN0LT5waHlzX2Rldl9leHRfZGlzcF9oYXNoW2ldLmZ1bmNfbmFtZSA9CisgICAgICAgICAgICAgICAgKGNoYXIgKilsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0LCBzdHJsZW4oZnVuY05hbWUpICsgMSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICAgICAgaWYgKGluc3QtPnBoeXNfZGV2X2V4dF9kaXNwX2hhc2hbaV0uZnVuY19uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9hZGRfZGV2X2V4dF90YWJsZSgpIGNhbid0IHJlYWxsb2NhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmNfbmFtZSBtZW1vcnkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJuY3B5KGluc3QtPnBoeXNfZGV2X2V4dF9kaXNwX2hhc2hbaV0uZnVuY19uYW1lLCBmdW5jTmFtZSwgc3RybGVuKGZ1bmNOYW1lKSArIDEpOworICAgICAgICAgICAgbGlzdC0+aW5kZXhbbGlzdC0+Y291bnRdID0gaTsKKyAgICAgICAgICAgIGxpc3QtPmNvdW50Kys7CisgICAgICAgICAgICAqcHRyX2lkeCA9IGk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpID0gKGkgKyAxKSAlIE1BWF9OVU1fVU5LTk9XTl9FWFRTOworICAgIH0gd2hpbGUgKGkgIT0gaWR4KTsKKworICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAibG9hZGVyX2FkZF9waHlzX2Rldl9leHRfdGFibGUoKSBjb3VsZG4ndCBpbnNlcnQgaW50byBoYXNoIHRhYmxlOyBpcyAiCisgICAgICAgICAgICAgICAiaXQgZnVsbD8iKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGxvYWRlcl9uYW1lX2luX3BoeXNfZGV2X2V4dF90YWJsZShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCB1aW50MzJfdCAqaWR4LCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIHVpbnQzMl90IGFsdF9pZHg7CisgICAgaWYgKGluc3QtPnBoeXNfZGV2X2V4dF9kaXNwX2hhc2hbKmlkeF0uZnVuY19uYW1lICYmICFzdHJjbXAoaW5zdC0+cGh5c19kZXZfZXh0X2Rpc3BfaGFzaFsqaWR4XS5mdW5jX25hbWUsIGZ1bmNOYW1lKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBmdW5jTmFtZSB3YXNuJ3QgYXQgdGhlIHByaW1hcnkgc3BvdCBpbiB0aGUgaGFzaCB0YWJsZQorICAgIC8vIHNlYXJjaCB0aGUgbGlzdCBvZiBzZWNvbmRhcnkgbG9jYXRpb25zIChzaGFsbG93IHNlYXJjaCwgbm90IGRlZXAgc2VhcmNoKQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnN0LT5waHlzX2Rldl9leHRfZGlzcF9oYXNoWyppZHhdLmxpc3QuY291bnQ7IGkrKykgeworICAgICAgICBhbHRfaWR4ID0gaW5zdC0+cGh5c19kZXZfZXh0X2Rpc3BfaGFzaFsqaWR4XS5saXN0LmluZGV4W2ldOworICAgICAgICBpZiAoIXN0cmNtcChpbnN0LT5waHlzX2Rldl9leHRfZGlzcF9oYXNoWyppZHhdLmZ1bmNfbmFtZSwgZnVuY05hbWUpKSB7CisgICAgICAgICAgICAqaWR4ID0gYWx0X2lkeDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBnZW5lcmljIHRyYW1wb2xpbmUgYW5kL29yIHRlcm1pbmF0b3IgZnVuY3Rpb24KKy8vIGFkZHJlc3MgZm9yIGFueSB1bmtub3duIHBoeXNpY2FsIGRldmljZSBleHRlbnNpb24gY29tbWFuZHMuICBBIGhhc2gKKy8vIHRhYmxlIGlzIHVzZWQgdG8ga2VlcCBhIGxpc3Qgb2YgdW5rbm93biBlbnRyeSBwb2ludHMgYW5kIHRoZWlyCisvLyBtYXBwaW5nIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UgZXh0ZW5zaW9uIGRpc3BhdGNoIHRhYmxlIChzdHJ1Y3QKKy8vIGxvYWRlcl9waHlzX2Rldl9leHRfZGlzcGF0Y2hfdGFibGUpLgorLy8gRm9yIGEgZ2l2ZW4gZW50cnkgcG9pbnQgc3RyaW5nIChmdW5jTmFtZSksIGlmIGFuIGV4aXN0aW5nIG1hcHBpbmcgaXMKKy8vIGZvdW5kLCB0aGVuIHRoZSB0cmFtcG9saW5lIGFkZHJlc3MgZm9yIHRoYXQgbWFwcGluZyBpcyByZXR1cm5lZCBpbgorLy8gdHJhbXBfYWRkciAoaWYgaXQgaXMgbm90IE5VTEwpIGFuZCB0aGUgdGVybWluYXRvciBhZGRyZXNzIGZvciB0aGF0CisvLyBtYXBwaW5nIGlzIHJldHVybmVkIGluIHRlcm1fYWRkciAoaWYgaXQgaXMgbm90IE5VTEwpLiBPdGhlcndpc2UsCisvLyB0aGlzIHVua25vd24gZW50cnkgcG9pbnQgaGFzIG5vdCBiZWVuIHNlZW4geWV0LgorLy8gSWYgaXQgaGFzIG5vdCBiZWVuIHNlZW4gYmVmb3JlLCBhbmQgcGVyZm9ybV9jaGVja2luZyBpcyAndHJ1ZScsCisvLyBjaGVjayBpZiBhIGxheWVyIG9yIGFuZCBJQ0Qgc3VwcG9ydHMgaXQuICBJZiBzbyB0aGVuIGEgbmV3IGVudHJ5IGluCisvLyB0aGUgaGFzaCB0YWJsZSBpcyBpbml0aWFsaXplZCBhbmQgdGhlIHRyYW1wb2xpbmUgYW5kL29yIHRlcm1pbmF0b3IKKy8vIGFkZHJlc3NlcyBhcmUgcmV0dXJuZWQuCisvLyBOdWxsIGlzIHJldHVybmVkIGlmIHRoZSBoYXNoIHRhYmxlIGlzIGZ1bGwgb3IgaWYgbm8gZGlzY292ZXJlZCBsYXllciBvcgorLy8gSUNEIHJldHVybnMgYSBub24tTlVMTCBHZXRQcm9jQWRkciBmb3IgaXQuCitib29sIGxvYWRlcl9waHlzX2Rldl9leHRfZ3BhKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lLCBib29sIHBlcmZvcm1fY2hlY2tpbmcsIHZvaWQgKip0cmFtcF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqdGVybV9hZGRyKSB7CisgICAgdWludDMyX3QgaWR4OworICAgIHVpbnQzMl90IHNlZWQgPSAwOworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworCisgICAgaWYgKGluc3QgPT0gTlVMTCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoTlVMTCAhPSB0cmFtcF9hZGRyKSB7CisgICAgICAgICp0cmFtcF9hZGRyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gdGVybV9hZGRyKSB7CisgICAgICAgICp0ZXJtX2FkZHIgPSBOVUxMOworICAgIH0KKworICAgIC8vIFdlIHNob3VsZCBhbHdheXMgY2hlY2sgdG8gc2VlIGlmIGFueSBJQ0Qgc3VwcG9ydHMgaXQuCisgICAgaWYgKCFsb2FkZXJfY2hlY2tfaWNkc19mb3JfcGh5c19kZXZfZXh0X2FkZHJlc3MoaW5zdCwgZnVuY05hbWUpKSB7CisgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBjaGVja2luZyBsYXllcnMsIG9yIHdlIGFyZSBhbmQgaXQncyBub3QgaW4gYSBsYXllciwganVzdAorICAgICAgICAvLyByZXR1cm4KKyAgICAgICAgaWYgKCFwZXJmb3JtX2NoZWNraW5nIHx8ICFsb2FkZXJfY2hlY2tfbGF5ZXJfbGlzdF9mb3JfcGh5c19kZXZfZXh0X2FkZHJlc3MoaW5zdCwgZnVuY05hbWUpKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlkeCA9IG11cm11cmhhc2goZnVuY05hbWUsIHN0cmxlbihmdW5jTmFtZSksIHNlZWQpICUgTUFYX05VTV9VTktOT1dOX0VYVFM7CisgICAgaWYgKHBlcmZvcm1fY2hlY2tpbmcgJiYgIWxvYWRlcl9uYW1lX2luX3BoeXNfZGV2X2V4dF90YWJsZShpbnN0LCAmaWR4LCBmdW5jTmFtZSkpIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgYm9vbCBhZGRlZCA9IGZhbHNlOworCisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgZmlyc3Qgb25lIHRvIGdldCBpbmRleCBpbiBJbnN0YW5jZS4gIE90aGVycyB3aWxsIHVzZQorICAgICAgICAvLyB0aGUgc2FtZSBpbmRleC4KKyAgICAgICAgaWYgKCFhZGRlZCAmJiBsb2FkZXJfYWRkX3BoeXNfZGV2X2V4dF90YWJsZShpbnN0LCAmaWR4LCBmdW5jTmFtZSkpIHsKKyAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHVwIHRoZSBJQ0QgZnVuY3Rpb24gcG9pbnRlcnMKKyAgICAgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBpbnN0LT5pY2RfdGVybXM7CisgICAgICAgIHdoaWxlIChOVUxMICE9IGljZF90ZXJtKSB7CisgICAgICAgICAgICBpZiAoTUlOX1BIWVNfREVWX0VYVEVOU0lPTl9JQ0RfSU5URVJGQUNFX1ZFUlNJT04gPD0gaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5pbnRlcmZhY2VfdmVyc2lvbiAmJgorICAgICAgICAgICAgICAgIE5VTEwgIT0gaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyKSB7CisgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnBoeXNfZGV2X2V4dFtpZHhdID0KKyAgICAgICAgICAgICAgICAgICAgKFBGTl9QaHlzRGV2RXh0KWljZF90ZXJtLT5zY2FubmVkX2ljZC0+R2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcihpY2RfdGVybS0+aW5zdGFuY2UsIGZ1bmNOYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGluc3RhbmNlIGRpc3BhdGNoIHRvIHBvaW50IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIGxvYWRlcidzIHRlcm1pbmF0b3Igbm93IHNpbmNlIHdlIGNhbiBhdCBsZWFzdCBoYW5kbGUgaXQKKyAgICAgICAgICAgICAgICAvLyBpbiBvbmUgSUNELgorICAgICAgICAgICAgICAgIGluc3QtPmRpc3AtPnBoeXNfZGV2X2V4dFtpZHhdID0gbG9hZGVyX2dldF9waHlzX2Rldl9leHRfdGVybWluKGlkeCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGljZF90ZXJtLT5waHlzX2Rldl9leHRbaWR4XSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3csIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxheWVyIGF0dGFjaGVkIGFuZCBxdWVyeSB1c2luZyBpdCB0byBnZXQKKyAgICAgICAgLy8gdGhlIGZpcnN0IGVudHJ5IHBvaW50LgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdC0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QuY291bnQ7IGkrKykgeworICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpsYXllcl9wcm9wID0gJmluc3QtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3RbaV07CisgICAgICAgICAgICBpZiAobGF5ZXJfcHJvcC0+aW50ZXJmYWNlX3ZlcnNpb24gPiAxICYmIE5VTEwgIT0gbGF5ZXJfcHJvcC0+ZnVuY3Rpb25zLmdldF9waHlzaWNhbF9kZXZpY2VfcHJvY19hZGRyKSB7CisgICAgICAgICAgICAgICAgaW5zdC0+ZGlzcC0+cGh5c19kZXZfZXh0W2lkeF0gPQorICAgICAgICAgICAgICAgICAgICAoUEZOX1BoeXNEZXZFeHQpbGF5ZXJfcHJvcC0+ZnVuY3Rpb25zLmdldF9waHlzaWNhbF9kZXZpY2VfcHJvY19hZGRyKChWa0luc3RhbmNlKWluc3QtPmluc3RhbmNlLCBmdW5jTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gaW5zdC0+ZGlzcC0+cGh5c19kZXZfZXh0W2lkeF0pIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKE5VTEwgIT0gdHJhbXBfYWRkcikgeworICAgICAgICAqdHJhbXBfYWRkciA9IGxvYWRlcl9nZXRfcGh5c19kZXZfZXh0X3RyYW1wKGlkeCk7CisgICAgfQorCisgICAgaWYgKE5VTEwgIT0gdGVybV9hZGRyKSB7CisgICAgICAgICp0ZXJtX2FkZHIgPSBsb2FkZXJfZ2V0X3BoeXNfZGV2X2V4dF90ZXJtaW4oaWR4KTsKKyAgICB9CisKKyAgICBzdWNjZXNzID0gdHJ1ZTsKKworb3V0OgorICAgIHJldHVybiBzdWNjZXNzOworfQorCitzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpsb2FkZXJfZ2V0X2luc3RhbmNlKGNvbnN0IFZrSW5zdGFuY2UgaW5zdGFuY2UpIHsKKyAgICAvLyBsb29rIHVwIHRoZSBsb2FkZXJfaW5zdGFuY2UgaW4gb3VyIGxpc3QgYnkgY29tcGFyaW5nIGRpc3BhdGNoIHRhYmxlcywgYXMKKyAgICAvLyB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhlIGluc3RhbmNlIGlzIHN0aWxsIGEgbG9hZGVyX2luc3RhbmNlKiBhZnRlciBhbnkKKyAgICAvLyBsYXllcnMgd2hpY2ggd3JhcCB0aGUgaW5zdGFuY2Ugb2JqZWN0LgorICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlID0gTlVMTDsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChpbnN0YW5jZSk7CisgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gbG9hZGVyLmluc3RhbmNlczsgaW5zdDsgaW5zdCA9IGluc3QtPm5leHQpIHsKKyAgICAgICAgaWYgKCZpbnN0LT5kaXNwLT5sYXllcl9pbnN0X2Rpc3AgPT0gZGlzcCkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlID0gaW5zdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwdHJfaW5zdGFuY2U7Cit9CisKK3N0YXRpYyBsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGxvYWRlck9wZW5MYXllckZpbGUoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgY2hhciAqY2hhaW5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wKSB7CisgICAgaWYgKChwcm9wLT5saWJfaGFuZGxlID0gbG9hZGVyX3BsYXRmb3JtX29wZW5fbGlicmFyeShwcm9wLT5saWJfbmFtZSkpID09IE5VTEwpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwgbG9hZGVyX3BsYXRmb3JtX29wZW5fbGlicmFyeV9lcnJvcihwcm9wLT5saWJfbmFtZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQsIDAsICJMb2FkaW5nIGxheWVyIGxpYnJhcnkgJXMiLCBwcm9wLT5saWJfbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHByb3AtPmxpYl9oYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRlckNsb3NlTGF5ZXJGaWxlKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqcHJvcCkgeworICAgIGlmIChwcm9wLT5saWJfaGFuZGxlKSB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV9jbG9zZV9saWJyYXJ5KHByb3AtPmxpYl9oYW5kbGUpOworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCAwLCAiVW5sb2FkaW5nIGxheWVyIGxpYnJhcnkgJXMiLCBwcm9wLT5saWJfbmFtZSk7CisgICAgICAgIHByb3AtPmxpYl9oYW5kbGUgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBsb2FkZXJEZWFjdGl2YXRlTGF5ZXJzKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmxpc3QpIHsKKyAgICAvLyBEZWxldGUgaW5zdGFuY2UgbGlzdCBvZiBlbmFibGVkIGxheWVycyBhbmQgY2xvc2UgYW55IGxheWVyIGxpYnJhcmllcworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsaXN0LT5jb3VudDsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqbGF5ZXJfcHJvcCA9ICZsaXN0LT5saXN0W2ldOworCisgICAgICAgIGxvYWRlckNsb3NlTGF5ZXJGaWxlKGluc3RhbmNlLCBsYXllcl9wcm9wKTsKKyAgICB9CisgICAgbG9hZGVyRGVzdHJveUxheWVyTGlzdChpbnN0YW5jZSwgZGV2aWNlLCBsaXN0KTsKK30KKworLy8gR28gdGhyb3VnaCB0aGUgc2VhcmNoX2xpc3QgYW5kIGZpbmQgYW55IGxheWVycyB3aGljaCBtYXRjaCB0eXBlLiBJZiBsYXllcgorLy8gdHlwZSBtYXRjaCBpcyBmb3VuZCBpbiB0aGVuIGFkZCBpdCB0byBleHRfbGlzdC4KK3N0YXRpYyB2b2lkIGxvYWRlckFkZEltcGxpY2l0TGF5ZXJzKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqdGFyZ2V0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmV4cGFuZGVkX3RhcmdldF9saXN0LCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKnNvdXJjZV9saXN0KSB7CisgICAgZm9yICh1aW50MzJfdCBzcmNfbGF5ZXIgPSAwOyBzcmNfbGF5ZXIgPCBzb3VyY2VfbGlzdC0+Y291bnQ7IHNyY19sYXllcisrKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqcHJvcCA9ICZzb3VyY2VfbGlzdC0+bGlzdFtzcmNfbGF5ZXJdOworICAgICAgICBpZiAoMCA9PSAocHJvcC0+dHlwZV9mbGFncyAmIFZLX0xBWUVSX1RZUEVfRkxBR19FWFBMSUNJVF9MQVlFUikpIHsKKyAgICAgICAgICAgIGxvYWRlckFkZEltcGxpY2l0TGF5ZXIoaW5zdCwgcHJvcCwgdGFyZ2V0X2xpc3QsIGV4cGFuZGVkX3RhcmdldF9saXN0LCBzb3VyY2VfbGlzdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEdldCB0aGUgbGF5ZXIgbmFtZShzKSBmcm9tIHRoZSBlbnZfbmFtZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gSWYgbGF5ZXIgaXMgZm91bmQgaW4KKy8vIHNlYXJjaF9saXN0IHRoZW4gYWRkIGl0IHRvIGxheWVyX2xpc3QuICBCdXQgb25seSBhZGQgaXQgdG8gbGF5ZXJfbGlzdCBpZiB0eXBlX2ZsYWdzIG1hdGNoZXMuCitzdGF0aWMgdm9pZCBsb2FkZXJBZGRFbnZpcm9ubWVudExheWVycyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBlbnVtIGxheWVyX3R5cGVfZmxhZ3MgdHlwZV9mbGFncywgY29uc3QgY2hhciAqZW52X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKnRhcmdldF9saXN0LCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmV4cGFuZGVkX3RhcmdldF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpzb3VyY2VfbGlzdCkgeworICAgIGNoYXIgKm5leHQsICpuYW1lOworICAgIGNoYXIgKmxheWVyX2VudiA9IGxvYWRlcl9nZXRlbnYoZW52X25hbWUsIGluc3QpOworICAgIGlmIChsYXllcl9lbnYgPT0gTlVMTCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgbmFtZSA9IGxvYWRlcl9zdGFja19hbGxvYyhzdHJsZW4obGF5ZXJfZW52KSArIDEpOworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHN0cmNweShuYW1lLCBsYXllcl9lbnYpOworCisgICAgd2hpbGUgKG5hbWUgJiYgKm5hbWUpIHsKKyAgICAgICAgbmV4dCA9IGxvYWRlcl9nZXRfbmV4dF9wYXRoKG5hbWUpOworICAgICAgICBsb2FkZXJBZGRMYXllck5hbWVUb0xpc3QoaW5zdCwgbmFtZSwgdHlwZV9mbGFncywgc291cmNlX2xpc3QsIHRhcmdldF9saXN0LCBleHBhbmRlZF90YXJnZXRfbGlzdCk7CisgICAgICAgIG5hbWUgPSBuZXh0OworICAgIH0KKworb3V0OgorCisgICAgaWYgKGxheWVyX2VudiAhPSBOVUxMKSB7CisgICAgICAgIGxvYWRlcl9mcmVlX2dldGVudihsYXllcl9lbnYsIGluc3QpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworVmtSZXN1bHQgbG9hZGVyRW5hYmxlSW5zdGFuY2VMYXllcnMoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICppbnN0YW5jZV9sYXllcnMpIHsKKyAgICBWa1Jlc3VsdCBlcnIgPSBWS19TVUNDRVNTOworICAgIHVpbnQxNl90IGxheWVyX2FwaV9tYWpvcl92ZXJzaW9uOworICAgIHVpbnQxNl90IGxheWVyX2FwaV9taW5vcl92ZXJzaW9uOworICAgIHVpbnQzMl90IGk7CisgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wOworCisgICAgYXNzZXJ0KGluc3QgJiYgIkNhbm5vdCBoYXZlIG51bGwgaW5zdGFuY2UiKTsKKworICAgIGlmICghbG9hZGVySW5pdExheWVyTGlzdChpbnN0LCAmaW5zdC0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0KSkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJsb2FkZXJFbmFibGVJbnN0YW5jZUxheWVyczogRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwbGljYXRpb24gdmVyc2lvbiBvZiB0aGUgbGF5ZXIgbGlzdCIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKworICAgIGlmICghbG9hZGVySW5pdExheWVyTGlzdChpbnN0LCAmaW5zdC0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QpKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgImxvYWRlckVuYWJsZUluc3RhbmNlTGF5ZXJzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBleHBhbmRlZCB2ZXJzaW9uIG9mIHRoZSBsYXllciBsaXN0Iik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorCisgICAgLy8gQWRkIGFueSBpbXBsaWNpdCBsYXllcnMgZmlyc3QKKyAgICBsb2FkZXJBZGRJbXBsaWNpdExheWVycyhpbnN0LCAmaW5zdC0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0LCAmaW5zdC0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QsIGluc3RhbmNlX2xheWVycyk7CisKKyAgICAvLyBBZGQgYW55IGxheWVycyBzcGVjaWZpZWQgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlIG5leHQKKyAgICBsb2FkZXJBZGRFbnZpcm9ubWVudExheWVycyhpbnN0LCBWS19MQVlFUl9UWVBFX0ZMQUdfRVhQTElDSVRfTEFZRVIsICJWS19JTlNUQU5DRV9MQVlFUlMiLCAmaW5zdC0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdCwgaW5zdGFuY2VfbGF5ZXJzKTsKKworICAgIC8vIEFkZCBsYXllcnMgc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbgorICAgIGVyciA9IGxvYWRlckFkZExheWVyTmFtZXNUb0xpc3QoaW5zdCwgJmluc3QtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdCwgJmluc3QtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPmVuYWJsZWRMYXllckNvdW50LCBwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcywgaW5zdGFuY2VfbGF5ZXJzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpbnN0LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jb3VudDsgaSsrKSB7CisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBsYXllciBhcGkgdmVyc2lvbiBpcyBhdCBsZWFzdCB0aGF0IG9mIHRoZSBhcHBsaWNhdGlvbidzIHJlcXVlc3QsIGlmIG5vdCwgdGhyb3cgYSB3YXJuaW5nIHNpbmNlCisgICAgICAgIC8vIHVuZGVmaW5lZCBiZWhhdmlvciBjb3VsZCBvY2N1ci4KKyAgICAgICAgcHJvcCA9IGluc3QtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3QgKyBpOworICAgICAgICBsYXllcl9hcGlfbWFqb3JfdmVyc2lvbiA9IFZLX1ZFUlNJT05fTUFKT1IocHJvcC0+aW5mby5zcGVjVmVyc2lvbik7CisgICAgICAgIGxheWVyX2FwaV9taW5vcl92ZXJzaW9uID0gVktfVkVSU0lPTl9NSU5PUihwcm9wLT5pbmZvLnNwZWNWZXJzaW9uKTsKKyAgICAgICAgaWYgKGluc3QtPmFwcF9hcGlfbWFqb3JfdmVyc2lvbiA+IGxheWVyX2FwaV9tYWpvcl92ZXJzaW9uIHx8CisgICAgICAgICAgICAoaW5zdC0+YXBwX2FwaV9tYWpvcl92ZXJzaW9uID09IGxheWVyX2FwaV9tYWpvcl92ZXJzaW9uICYmIGluc3QtPmFwcF9hcGlfbWlub3JfdmVyc2lvbiA+IGxheWVyX2FwaV9taW5vcl92ZXJzaW9uKSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2FkZF90b19sYXllcl9saXN0OiBFeHBsaWNpdCBsYXllciAlcyBpcyB1c2luZyBhbiBvbGQgQVBJIHZlcnNpb24gJSIgUFJJdTE2ICIuJSIgUFJJdTE2CisgICAgICAgICAgICAgICAgICAgICAgICIgdmVyc3VzIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCAlIiBQUkl1MTYgIi4lIiBQUkl1MTYsCisgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPmluZm8ubGF5ZXJOYW1lLCBsYXllcl9hcGlfbWFqb3JfdmVyc2lvbiwgbGF5ZXJfYXBpX21pbm9yX3ZlcnNpb24sIGluc3QtPmFwcF9hcGlfbWFqb3JfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+YXBwX2FwaV9taW5vcl92ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8vIERldGVybWluZSB0aGUgbGF5ZXIgaW50ZXJmYWNlIHZlcnNpb24gdG8gdXNlLgorYm9vbCBsb2FkZXJHZXRMYXllckludGVyZmFjZVZlcnNpb24oUEZOX3ZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uIGZwX25lZ290aWF0ZV9sYXllcl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtOZWdvdGlhdGVMYXllckludGVyZmFjZSAqaW50ZXJmYWNlX3N0cnVjdCkgeworICAgIG1lbXNldChpbnRlcmZhY2Vfc3RydWN0LCAwLCBzaXplb2YoVmtOZWdvdGlhdGVMYXllckludGVyZmFjZSkpOworICAgIGludGVyZmFjZV9zdHJ1Y3QtPnNUeXBlID0gTEFZRVJfTkVHT1RJQVRFX0lOVEVSRkFDRV9TVFJVQ1Q7CisgICAgaW50ZXJmYWNlX3N0cnVjdC0+bG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uID0gMTsKKyAgICBpbnRlcmZhY2Vfc3RydWN0LT5wTmV4dCA9IE5VTEw7CisKKyAgICBpZiAoZnBfbmVnb3RpYXRlX2xheWVyX3ZlcnNpb24gIT0gTlVMTCkgeworICAgICAgICAvLyBMYXllciBzdXBwb3J0cyB0aGUgbmVnb3RpYXRpb24gQVBJLCBzbyBjYWxsIGl0IHdpdGggdGhlIGxvYWRlcidzCisgICAgICAgIC8vIGxhdGVzdCB2ZXJzaW9uIHN1cHBvcnRlZAorICAgICAgICBpbnRlcmZhY2Vfc3RydWN0LT5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24gPSBDVVJSRU5UX0xPQURFUl9MQVlFUl9JTlRFUkZBQ0VfVkVSU0lPTjsKKyAgICAgICAgVmtSZXN1bHQgcmVzdWx0ID0gZnBfbmVnb3RpYXRlX2xheWVyX3ZlcnNpb24oaW50ZXJmYWNlX3N0cnVjdCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICAvLyBMYXllciBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGxvYWRlcidzIGxhdGVzdCBpbnRlcmZhY2UgdmVyc2lvbiBzbworICAgICAgICAgICAgLy8gZmFpbCBsb2FkaW5nIHRoZSBMYXllcgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGludGVyZmFjZV9zdHJ1Y3QtPmxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbiA8IE1JTl9TVVBQT1JURURfTE9BREVSX0xBWUVSX0lOVEVSRkFDRV9WRVJTSU9OKSB7CisgICAgICAgIC8vIExvYWRlciBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGxheWVyJ3MgbGF0ZXN0IGludGVyZmFjZSB2ZXJzaW9uIHNvCisgICAgICAgIC8vIGZhaWwgbG9hZGluZyB0aGUgbGF5ZXIKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgbG9hZGVyX2xheWVyX2NyZWF0ZV9kZXZpY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBsYXllckdJUEEsIFBGTl92a0dldERldmljZVByb2NBZGRyICpuZXh0R0RQQSkgeworICAgIFZrUmVzdWx0IHJlczsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIGludGVybmFsX2RldmljZSA9IFZLX05VTExfSEFORExFOworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXYgPSBOVUxMOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QgPSBOVUxMOworCisgICAgYXNzZXJ0KHBDcmVhdGVJbmZvLT5xdWV1ZUNyZWF0ZUluZm9Db3VudCA+PSAxKTsKKworICAgIGlmIChpbnN0YW5jZSAhPSBOVUxMKSB7CisgICAgICAgIGluc3QgPSBsb2FkZXJfZ2V0X2luc3RhbmNlKGluc3RhbmNlKTsKKyAgICAgICAgaW50ZXJuYWxfZGV2aWNlID0gcGh5c2ljYWxEZXZpY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKnBoeXNfZGV2ID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICopcGh5c2ljYWxEZXZpY2U7CisgICAgICAgIGludGVybmFsX2RldmljZSA9IHBoeXNfZGV2LT5waHlzX2RldjsKKyAgICAgICAgaW5zdCA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopcGh5c19kZXYtPnRoaXNfaW5zdGFuY2U7CisgICAgfQorCisgICAgLy8gR2V0IHRoZSBwaHlzaWNhbCBkZXZpY2UgKElDRCkgZXh0ZW5zaW9ucworICAgIHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgaWNkX2V4dHM7CisgICAgaWNkX2V4dHMubGlzdCA9IE5VTEw7CisgICAgcmVzID0gbG9hZGVyX2luaXRfZ2VuZXJpY19saXN0KGluc3QsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKSZpY2RfZXh0cywgc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLCAidmtDcmVhdGVEZXZpY2U6ICBGYWlsZWQgdG8gY3JlYXRlIElDRCBleHRlbnNpb24gbGlzdCIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBQRk5fdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIGVudW1EZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzID0gTlVMTDsKKyAgICBpZiAobGF5ZXJHSVBBICE9IE5VTEwpIHsKKyAgICAgICAgZW51bURldmljZUV4dGVuc2lvblByb3BlcnRpZXMgPQorICAgICAgICAgICAgKFBGTl92a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMpbGF5ZXJHSVBBKGluc3RhbmNlLCAidmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW51bURldmljZUV4dGVuc2lvblByb3BlcnRpZXMgPSBpbnN0LT5kaXNwLT5sYXllcl9pbnN0X2Rpc3AuRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllczsKKyAgICB9CisgICAgcmVzID0gbG9hZGVyX2FkZF9kZXZpY2VfZXh0ZW5zaW9ucyhpbnN0LCBlbnVtRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcywgaW50ZXJuYWxfZGV2aWNlLCAiVW5rbm93biIsICZpY2RfZXh0cyk7CisgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsICJ2a0NyZWF0ZURldmljZTogIEZhaWxlZCB0byBhZGQgZXh0ZW5zaW9ucyB0byBsaXN0Iik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSByZXF1ZXN0ZWQgZXh0ZW5zaW9ucyB0byBiZSBlbmFibGVkIGFyZSBzdXBwb3J0ZWQKKyAgICByZXMgPSBsb2FkZXJfdmFsaWRhdGVfZGV2aWNlX2V4dGVuc2lvbnMoaW5zdCwgJmluc3QtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0LCAmaWNkX2V4dHMsIHBDcmVhdGVJbmZvKTsKKyAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwgInZrQ3JlYXRlRGV2aWNlOiAgRmFpbGVkIHRvIHZhbGlkYXRlIGV4dGVuc2lvbnMgaW4gbGlzdCIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBkZXYgPSBsb2FkZXJfY3JlYXRlX2xvZ2ljYWxfZGV2aWNlKGluc3QsIHBBbGxvY2F0b3IpOworICAgIGlmIChkZXYgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGFwcGxpY2F0aW9uIGVuYWJsZWQgaW5zdGFuY2UgbGF5ZXIgbGlzdCBpbnRvIHRoZSBkZXZpY2UKKyAgICBpZiAoTlVMTCAhPSBpbnN0LT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QubGlzdCkgeworICAgICAgICBkZXYtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jYXBhY2l0eSA9IGluc3QtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jYXBhY2l0eTsKKyAgICAgICAgZGV2LT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QuY291bnQgPSBpbnN0LT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QuY291bnQ7CisgICAgICAgIGRldi0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3QgPQorICAgICAgICAgICAgbG9hZGVyX2RldmljZV9oZWFwX2FsbG9jKGRldiwgaW5zdC0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0LmNhcGFjaXR5LCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9ERVZJQ0UpOworICAgICAgICBpZiAoZGV2LT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QubGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXZpY2U6ICBGYWlsZWQgdG8gYWxsb2NhdGUgYXBwbGljYXRpb24gYWN0aXZhdGVkIGxheWVyIGxpc3Qgb2Ygc2l6ZSAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QuY2FwYWNpdHkpOworICAgICAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGRldi0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3QsIGluc3QtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5saXN0LAorICAgICAgICAgICAgICAgc2l6ZW9mKCpkZXYtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5saXN0KSAqIGRldi0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0LmNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXYtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jYXBhY2l0eSA9IDA7CisgICAgICAgIGRldi0+YXBwX2FjdGl2YXRlZF9sYXllcl9saXN0LmNvdW50ID0gMDsKKyAgICAgICAgZGV2LT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QubGlzdCA9IE5VTEw7CisgICAgfQorCisgICAgLy8gQ29weSB0aGUgZXhwYW5kZWQgZW5hYmxlZCBpbnN0YW5jZSBsYXllciBsaXN0IGludG8gdGhlIGRldmljZQorICAgIGlmIChOVUxMICE9IGluc3QtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3QpIHsKKyAgICAgICAgZGV2LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jYXBhY2l0eSA9IGluc3QtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0LmNhcGFjaXR5OworICAgICAgICBkZXYtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0LmNvdW50ID0gaW5zdC0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QuY291bnQ7CisgICAgICAgIGRldi0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QubGlzdCA9CisgICAgICAgICAgICBsb2FkZXJfZGV2aWNlX2hlYXBfYWxsb2MoZGV2LCBpbnN0LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jYXBhY2l0eSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfREVWSUNFKTsKKyAgICAgICAgaWYgKGRldi0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QubGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXZpY2U6ICBGYWlsZWQgdG8gYWxsb2NhdGUgZXhwYW5kZWQgYWN0aXZhdGVkIGxheWVyIGxpc3Qgb2Ygc2l6ZSAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jYXBhY2l0eSk7CisgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZGV2LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5saXN0LCBpbnN0LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5saXN0LAorICAgICAgICAgICAgICAgc2l6ZW9mKCpkZXYtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3QpICogZGV2LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jYXBhY2l0eSA9IDA7CisgICAgICAgIGRldi0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QuY291bnQgPSAwOworICAgICAgICBkZXYtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3QgPSBOVUxMOworICAgIH0KKworICAgIHJlcyA9IGxvYWRlcl9jcmVhdGVfZGV2aWNlX2NoYWluKGludGVybmFsX2RldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIGluc3QsIGRldiwgbGF5ZXJHSVBBLCBuZXh0R0RQQSk7CisgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsICJ2a0NyZWF0ZURldmljZTogIEZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGNoYWluLiIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAqcERldmljZSA9IGRldi0+Y2hhaW5fZGV2aWNlOworCisgICAgLy8gSW5pdGlhbGl6ZSBhbnkgZGV2aWNlIGV4dGVuc2lvbiBkaXNwYXRjaCBlbnRyeSdzIGZyb20gdGhlIGluc3RhbmNlIGxpc3QKKyAgICBsb2FkZXJfaW5pdF9kaXNwYXRjaF9kZXZfZXh0KGluc3QsIGRldik7CisKKyAgICAvLyBJbml0aWFsaXplIFdTSSBkZXZpY2UgZXh0ZW5zaW9ucyBhcyBwYXJ0IG9mIGNvcmUgZGlzcGF0Y2ggc2luY2UgbG9hZGVyCisgICAgLy8gaGFzIGRlZGljYXRlZCB0cmFtcG9saW5lIGNvZGUgZm9yIHRoZXNlCisgICAgbG9hZGVyX2luaXRfZGV2aWNlX2V4dGVuc2lvbl9kaXNwYXRjaF90YWJsZSgmZGV2LT5sb2FkZXJfZGlzcGF0Y2gsIGluc3QtPmRpc3AtPmxheWVyX2luc3RfZGlzcC5HZXRJbnN0YW5jZVByb2NBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5sb2FkZXJfZGlzcGF0Y2guY29yZV9kaXNwYXRjaC5HZXREZXZpY2VQcm9jQWRkciwgaW5zdC0+aW5zdGFuY2UsICpwRGV2aWNlKTsKKworb3V0OgorCisgICAgLy8gRmFpbHVyZSBjbGVhbnVwCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgIGlmIChOVUxMICE9IGRldikgeworICAgICAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfbG9naWNhbF9kZXZpY2UoaW5zdCwgZGV2LCBwQWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChOVUxMICE9IGljZF9leHRzLmxpc3QpIHsKKyAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfZ2VuZXJpY19saXN0KGluc3QsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKSZpY2RfZXh0cyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9sYXllcl9kZXN0cm95X2RldmljZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk5fdmtEZXN0cm95RGV2aWNlIGRlc3Ryb3lGdW5jdGlvbikgeworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXY7CisKKyAgICBpZiAoZGV2aWNlID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGxvYWRlcl9nZXRfaWNkX2FuZF9kZXZpY2UoZGV2aWNlLCAmZGV2LCBOVUxMKTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisKKyAgICBkZXN0cm95RnVuY3Rpb24oZGV2aWNlLCBwQWxsb2NhdG9yKTsKKyAgICBkZXYtPmNoYWluX2RldmljZSA9IE5VTEw7CisgICAgZGV2LT5pY2RfZGV2aWNlID0gTlVMTDsKKyAgICBsb2FkZXJfcmVtb3ZlX2xvZ2ljYWxfZGV2aWNlKGluc3QsIGljZF90ZXJtLCBkZXYsIHBBbGxvY2F0b3IpOworfQorCisvLyBHaXZlbiB0aGUgbGlzdCBvZiBsYXllcnMgdG8gYWN0aXZhdGUgaW4gdGhlIGxvYWRlcl9pbnN0YW5jZQorLy8gc3RydWN0dXJlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWRkIGEgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbworLy8gc3RydWN0dXJlIHRvIHRoZSBWa0luc3RhbmNlQ3JlYXRlSW5mby5wTmV4dCBwb2ludGVyLgorLy8gRWFjaCBhY3RpdmF0ZWQgbGF5ZXIgd2lsbCBoYXZlIGl0J3Mgb3duIFZrTGF5ZXJJbnN0YW5jZUxpbmsKKy8vIHN0cnVjdHVyZSB0aGF0IHRlbGxzIHRoZSBsYXllciB3aGF0IEdldCpQcm9jQWRkciB0byBjYWxsIHRvCisvLyBnZXQgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIG5leHQgbGF5ZXIgZG93bi4KKy8vIE9uY2UgdGhlIGNoYWluIGluZm8gaGFzIGJlZW4gY3JlYXRlZCB0aGlzIGZ1bmN0aW9uIHdpbGwKKy8vIGV4ZWN1dGUgdGhlIENyZWF0ZUluc3RhbmNlIGNhbGwgY2hhaW4uIEVhY2ggbGF5ZXIgd2lsbAorLy8gdGhlbiBoYXZlIGFuIG9wcG9ydHVuaXR5IGluIGl0J3MgQ3JlYXRlSW5zdGFuY2UgZnVuY3Rpb24KKy8vIHRvIHNldHVwIGl0J3MgZGlzcGF0Y2ggdGFibGUgd2hlbiB0aGUgbG93ZXIgbGF5ZXIgcmV0dXJucworLy8gc3VjY2Vzc2Z1bGx5LgorLy8gRWFjaCBsYXllciBjYW4gd3JhcCBvciBub3Qtd3JhcCB0aGUgcmV0dXJuZWQgVmtJbnN0YW5jZSBvYmplY3QKKy8vIGFzIGl0IHNlZXMgZml0LgorLy8gVGhlIGluc3RhbmNlIGNoYWluIGlzIHRlcm1pbmF0ZWQgYnkgYSBsb2FkZXIgZnVuY3Rpb24KKy8vIHRoYXQgd2lsbCBjYWxsIENyZWF0ZUluc3RhbmNlIG9uIGFsbCBhdmFpbGFibGUgSUNEJ3MgYW5kCisvLyBjYWNoZSB0aG9zZSBWa0luc3RhbmNlIG9iamVjdHMgZm9yIGZ1dHVyZSB1c2UuCitWa1Jlc3VsdCBsb2FkZXJfY3JlYXRlX2luc3RhbmNlX2NoYWluKGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBWa0luc3RhbmNlICpjcmVhdGVkX2luc3RhbmNlKSB7CisgICAgdWludDMyX3QgYWN0aXZhdGVkX2xheWVycyA9IDA7CisgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyBjaGFpbl9pbmZvOworICAgIFZrTGF5ZXJJbnN0YW5jZUxpbmsgKmxheWVyX2luc3RhbmNlX2xpbmtfaW5mbyA9IE5VTEw7CisgICAgVmtJbnN0YW5jZUNyZWF0ZUluZm8gbG9hZGVyX2NyZWF0ZV9pbmZvOworICAgIFZrUmVzdWx0IHJlczsKKworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgbmV4dF9naXBhID0gbG9hZGVyX2dwYV9pbnN0YW5jZV9pbnRlcm5hbDsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGN1cl9naXBhID0gbG9hZGVyX2dwYV9pbnN0YW5jZV9pbnRlcm5hbDsKKyAgICBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBjdXJfZ2RwYSA9IGxvYWRlcl9ncGFfZGV2aWNlX2ludGVybmFsOworICAgIFBGTl9HZXRQaHlzaWNhbERldmljZVByb2NBZGRyIG5leHRfZ3BkcGEgPSBsb2FkZXJfZ3BkcGFfaW5zdGFuY2VfaW50ZXJuYWw7CisgICAgUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgY3VyX2dwZHBhID0gbG9hZGVyX2dwZHBhX2luc3RhbmNlX2ludGVybmFsOworCisgICAgbWVtY3B5KCZsb2FkZXJfY3JlYXRlX2luZm8sIHBDcmVhdGVJbmZvLCBzaXplb2YoVmtJbnN0YW5jZUNyZWF0ZUluZm8pKTsKKworICAgIGlmIChpbnN0LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jb3VudCA+IDApIHsKKyAgICAgICAgY2hhaW5faW5mby51LnBMYXllckluZm8gPSBOVUxMOworICAgICAgICBjaGFpbl9pbmZvLnBOZXh0ID0gcENyZWF0ZUluZm8tPnBOZXh0OworICAgICAgICBjaGFpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPOworICAgICAgICBjaGFpbl9pbmZvLmZ1bmN0aW9uID0gVktfTEFZRVJfTElOS19JTkZPOworICAgICAgICBsb2FkZXJfY3JlYXRlX2luZm8ucE5leHQgPSAmY2hhaW5faW5mbzsKKworICAgICAgICBsYXllcl9pbnN0YW5jZV9saW5rX2luZm8gPSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKFZrTGF5ZXJJbnN0YW5jZUxpbmspICogaW5zdC0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QuY291bnQpOworICAgICAgICBpZiAoIWxheWVyX2luc3RhbmNlX2xpbmtfaW5mbykgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl9jcmVhdGVfaW5zdGFuY2VfY2hhaW46IEZhaWxlZCB0byBhbGxvYyBJbnN0YW5jZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBvYmplY3RzIGZvciBsYXllciIpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBpbnN0YW5jZSBjaGFpbiBvZiBlbmFibGVkIGxheWVycworICAgICAgICBmb3IgKGludDMyX3QgaSA9IGluc3QtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0LmNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqbGF5ZXJfcHJvcCA9ICZpbnN0LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5saXN0W2ldOworICAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsaWJfaGFuZGxlOworCisgICAgICAgICAgICBsaWJfaGFuZGxlID0gbG9hZGVyT3BlbkxheWVyRmlsZShpbnN0LCAiaW5zdGFuY2UiLCBsYXllcl9wcm9wKTsKKyAgICAgICAgICAgIGlmICghbGliX2hhbmRsZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTlVMTCA9PSBsYXllcl9wcm9wLT5mdW5jdGlvbnMubmVnb3RpYXRlX2xheWVyX2ludGVyZmFjZSkgeworICAgICAgICAgICAgICAgIFBGTl92a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbiBuZWdvdGlhdGVfaW50ZXJmYWNlID0gTlVMTDsKKyAgICAgICAgICAgICAgICBib29sIGZ1bmN0aW9uc19pbl9pbnRlcmZhY2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5zdHJfbmVnb3RpYXRlX2ludGVyZmFjZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBuZWdvdGlhdGVfaW50ZXJmYWNlID0gKFBGTl92a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbilsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYl9oYW5kbGUsICJ2a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5lZ290aWF0ZV9pbnRlcmZhY2UgPSAoUEZOX3ZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uKWxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgbGliX2hhbmRsZSwgbGF5ZXJfcHJvcC0+ZnVuY3Rpb25zLnN0cl9uZWdvdGlhdGVfaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjYW4gbmVnb3RpYXRlIGFuIGludGVyZmFjZSB2ZXJzaW9uLCB0aGVuIHdlIGNhbiBhbHNvCisgICAgICAgICAgICAgICAgLy8gZ2V0IGV2ZXJ5dGhpbmcgd2UgbmVlZCBmcm9tIHRoZSBvbmUgZnVuY3Rpb24gY2FsbCwgc28gdHJ5CisgICAgICAgICAgICAgICAgLy8gdGhhdCBmaXJzdCwgYW5kIHNlZSBpZiB3ZSBjYW4gZ2V0IGFsbCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMKKyAgICAgICAgICAgICAgICAvLyBuZWNlc3NhcnkgZnJvbSB0aGF0IG9uZSBjYWxsLgorICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IG5lZ290aWF0ZV9pbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbGF5ZXJfcHJvcC0+ZnVuY3Rpb25zLm5lZ290aWF0ZV9sYXllcl9pbnRlcmZhY2UgPSBuZWdvdGlhdGVfaW50ZXJmYWNlOworCisgICAgICAgICAgICAgICAgICAgIFZrTmVnb3RpYXRlTGF5ZXJJbnRlcmZhY2UgaW50ZXJmYWNlX3N0cnVjdDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyR2V0TGF5ZXJJbnRlcmZhY2VWZXJzaW9uKG5lZ290aWF0ZV9pbnRlcmZhY2UsICZpbnRlcmZhY2Vfc3RydWN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR28gYWhlYWQgYW5kIHNldCB0aGUgcHJvcGVydGllcyB2ZXJzaW9uIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX3Byb3AtPmludGVyZmFjZV92ZXJzaW9uID0gaW50ZXJmYWNlX3N0cnVjdC5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb247CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbnRlcmZhY2UgaXMgMiBvciBuZXdlciwgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciBmdW5jdGlvbiwgc28gZ3JhYiBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgb3RoZXIgbmVjZXNzYXJ5IGZ1bmN0aW9ucywgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2Vfc3RydWN0LmxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbiA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZ2lwYSA9IGludGVyZmFjZV9zdHJ1Y3QucGZuR2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZ2RwYSA9IGludGVyZmFjZV9zdHJ1Y3QucGZuR2V0RGV2aWNlUHJvY0FkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2dwZHBhID0gaW50ZXJmYWNlX3N0cnVjdC5wZm5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfZ2lwYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIHNldCB0aGUgZnVuY3Rpb25zLCBzbyBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZG8gdGhlIHVubmVjZXNzYXJ5IGNhbGxzIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnNfaW5faW50ZXJmYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWZ1bmN0aW9uc19pbl9pbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJfZ2lwYSA9IGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5nZXRfaW5zdGFuY2VfcHJvY19hZGRyKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5zdHJfZ2lwYSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9naXBhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIpbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobGliX2hhbmRsZSwgInZrR2V0SW5zdGFuY2VQcm9jQWRkciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5nZXRfaW5zdGFuY2VfcHJvY19hZGRyID0gY3VyX2dpcGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9naXBhID0gKFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIpbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5zdHJfZ2lwYSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09IGN1cl9naXBhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJfY3JlYXRlX2luc3RhbmNlX2NoYWluOiBGYWlsZWQgdG8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZpbmQgXCd2a0dldEluc3RhbmNlUHJvY0FkZHJcJyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF5ZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfcHJvcC0+bGliX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXllcl9pbnN0YW5jZV9saW5rX2luZm9bYWN0aXZhdGVkX2xheWVyc10ucE5leHQgPSBjaGFpbl9pbmZvLnUucExheWVySW5mbzsKKyAgICAgICAgICAgIGxheWVyX2luc3RhbmNlX2xpbmtfaW5mb1thY3RpdmF0ZWRfbGF5ZXJzXS5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkciA9IG5leHRfZ2lwYTsKKyAgICAgICAgICAgIGxheWVyX2luc3RhbmNlX2xpbmtfaW5mb1thY3RpdmF0ZWRfbGF5ZXJzXS5wZm5OZXh0R2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciA9IG5leHRfZ3BkcGE7CisgICAgICAgICAgICBuZXh0X2dpcGEgPSBjdXJfZ2lwYTsKKyAgICAgICAgICAgIGlmIChsYXllcl9wcm9wLT5pbnRlcmZhY2VfdmVyc2lvbiA+IDEgJiYgY3VyX2dwZHBhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsYXllcl9wcm9wLT5mdW5jdGlvbnMuZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9jX2FkZHIgPSBjdXJfZ3BkcGE7CisgICAgICAgICAgICAgICAgbmV4dF9ncGRwYSA9IGN1cl9ncGRwYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXllcl9wcm9wLT5pbnRlcmZhY2VfdmVyc2lvbiA+IDEgJiYgY3VyX2dpcGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5nZXRfaW5zdGFuY2VfcHJvY19hZGRyID0gY3VyX2dpcGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGF5ZXJfcHJvcC0+aW50ZXJmYWNlX3ZlcnNpb24gPiAxICYmIGN1cl9nZHBhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsYXllcl9wcm9wLT5mdW5jdGlvbnMuZ2V0X2RldmljZV9wcm9jX2FkZHIgPSBjdXJfZ2RwYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hhaW5faW5mby51LnBMYXllckluZm8gPSAmbGF5ZXJfaW5zdGFuY2VfbGlua19pbmZvW2FjdGl2YXRlZF9sYXllcnNdOworCisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLCAiSW5zZXJ0IGluc3RhbmNlIGxheWVyICVzICglcykiLCBsYXllcl9wcm9wLT5pbmZvLmxheWVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfcHJvcC0+bGliX25hbWUpOworCisgICAgICAgICAgICBhY3RpdmF0ZWRfbGF5ZXJzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBmcENyZWF0ZUluc3RhbmNlID0gKFBGTl92a0NyZWF0ZUluc3RhbmNlKW5leHRfZ2lwYSgqY3JlYXRlZF9pbnN0YW5jZSwgInZrQ3JlYXRlSW5zdGFuY2UiKTsKKyAgICBpZiAoZnBDcmVhdGVJbnN0YW5jZSkgeworICAgICAgICBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvX2Rpc3A7CisKKyAgICAgICAgY3JlYXRlX2luZm9fZGlzcC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgY3JlYXRlX2luZm9fZGlzcC5mdW5jdGlvbiA9IFZLX0xPQURFUl9EQVRBX0NBTExCQUNLOworCisgICAgICAgIGNyZWF0ZV9pbmZvX2Rpc3AudS5wZm5TZXRJbnN0YW5jZUxvYWRlckRhdGEgPSB2a1NldEluc3RhbmNlRGlzcGF0Y2g7CisKKyAgICAgICAgY3JlYXRlX2luZm9fZGlzcC5wTmV4dCA9IGxvYWRlcl9jcmVhdGVfaW5mby5wTmV4dDsKKyAgICAgICAgbG9hZGVyX2NyZWF0ZV9pbmZvLnBOZXh0ID0gJmNyZWF0ZV9pbmZvX2Rpc3A7CisKKyAgICAgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyBjcmVhdGVfaW5mb19kaXNwMjsKKworICAgICAgICBjcmVhdGVfaW5mb19kaXNwMi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgY3JlYXRlX2luZm9fZGlzcDIuZnVuY3Rpb24gPSBWS19MT0FERVJfTEFZRVJfQ1JFQVRFX0RFVklDRV9DQUxMQkFDSzsKKworICAgICAgICBjcmVhdGVfaW5mb19kaXNwMi51LmxheWVyRGV2aWNlLnBmbkxheWVyQ3JlYXRlRGV2aWNlID0gbG9hZGVyX2xheWVyX2NyZWF0ZV9kZXZpY2U7CisgICAgICAgIGNyZWF0ZV9pbmZvX2Rpc3AyLnUubGF5ZXJEZXZpY2UucGZuTGF5ZXJEZXN0cm95RGV2aWNlID0gbG9hZGVyX2xheWVyX2Rlc3Ryb3lfZGV2aWNlOworCisgICAgICAgIGNyZWF0ZV9pbmZvX2Rpc3AyLnBOZXh0ID0gbG9hZGVyX2NyZWF0ZV9pbmZvLnBOZXh0OworICAgICAgICBsb2FkZXJfY3JlYXRlX2luZm8ucE5leHQgPSAmY3JlYXRlX2luZm9fZGlzcDI7CisKKyAgICAgICAgcmVzID0gZnBDcmVhdGVJbnN0YW5jZSgmbG9hZGVyX2NyZWF0ZV9pbmZvLCBwQWxsb2NhdG9yLCBjcmVhdGVkX2luc3RhbmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJsb2FkZXJfY3JlYXRlX2luc3RhbmNlX2NoYWluOiBGYWlsZWQgdG8gZmluZCAiCisgICAgICAgICAgICAgICAgICAgIlwndmtDcmVhdGVJbnN0YW5jZVwnIik7CisgICAgICAgIC8vIENvdWxkbid0IGZpbmQgQ3JlYXRlSW5zdGFuY2UgZnVuY3Rpb24hCisgICAgICAgIHJlcyA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICBpZiAocmVzID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgbG9hZGVyX2luaXRfaW5zdGFuY2VfY29yZV9kaXNwYXRjaF90YWJsZSgmaW5zdC0+ZGlzcC0+bGF5ZXJfaW5zdF9kaXNwLCBuZXh0X2dpcGEsICpjcmVhdGVkX2luc3RhbmNlKTsKKyAgICAgICAgaW5zdC0+aW5zdGFuY2UgPSAqY3JlYXRlZF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIGxvYWRlckFjdGl2YXRlSW5zdGFuY2VMYXllckV4dGVuc2lvbnMoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgVmtJbnN0YW5jZSBjcmVhdGVkX2luc3QpIHsKKyAgICBsb2FkZXJfaW5pdF9pbnN0YW5jZV9leHRlbnNpb25fZGlzcGF0Y2hfdGFibGUoJmluc3QtPmRpc3AtPmxheWVyX2luc3RfZGlzcCwgaW5zdC0+ZGlzcC0+bGF5ZXJfaW5zdF9kaXNwLkdldEluc3RhbmNlUHJvY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRfaW5zdCk7Cit9CisKK1ZrUmVzdWx0IGxvYWRlcl9jcmVhdGVfZGV2aWNlX2NoYWluKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2UgcGQsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2LCBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGNhbGxpbmdMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0dldERldmljZVByb2NBZGRyICpsYXllck5leHRHRFBBKSB7CisgICAgdWludDMyX3QgYWN0aXZhdGVkX2xheWVycyA9IDA7CisgICAgVmtMYXllckRldmljZUxpbmsgKmxheWVyX2RldmljZV9saW5rX2luZm87CisgICAgVmtMYXllckRldmljZUNyZWF0ZUluZm8gY2hhaW5faW5mbzsKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gbG9hZGVyX2NyZWF0ZV9pbmZvOworICAgIFZrUmVzdWx0IHJlczsKKworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGZwR0RQQSA9IE5VTEwsIG5leHRHRFBBID0gbG9hZGVyX2dwYV9kZXZpY2VfaW50ZXJuYWw7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcEdJUEEgPSBOVUxMLCBuZXh0R0lQQSA9IGxvYWRlcl9ncGFfaW5zdGFuY2VfaW50ZXJuYWw7CisKKyAgICBtZW1jcHkoJmxvYWRlcl9jcmVhdGVfaW5mbywgcENyZWF0ZUluZm8sIHNpemVvZihWa0RldmljZUNyZWF0ZUluZm8pKTsKKworICAgIC8vIEJlZm9yZSB3ZSBjb250aW51ZSwgd2UgbmVlZCB0byBmaW5kIG91dCBpZiB0aGUgS0hSX2RldmljZV9ncm91cCBleHRlbnNpb24gaXMgaW4gdGhlIGVuYWJsZWQgbGlzdC4gIElmIGl0IGlzLCB3ZSB0aGVuCisgICAgLy8gbmVlZCB0byBsb29rIGZvciB0aGUgY29ycmVzcG9uZGluZyBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mb0tIUiBzdHJ1Y3QgaW4gdGhlIGRldmljZSBsaXN0LiAgVGhpcyBpcyBiZWNhdXNlIHdlCisgICAgLy8gbmVlZCB0byByZXBsYWNlIGFsbCB0aGUgaW5jb21pbmcgcGh5c2ljYWwgZGV2aWNlIHZhbHVlcyAod2hpY2ggYXJlIHJlYWxseSBsb2FkZXIgdHJhbXBvbGluZSBwaHlzaWNhbCBkZXZpY2UgdmFsdWVzKQorICAgIC8vIHdpdGggdGhlIGxheWVyL0lDRCB2ZXJzaW9uLgorICAgIHsKKyAgICAgICAgVmtCYXNlT3V0U3RydWN0dXJlICpwTmV4dCA9IChWa0Jhc2VPdXRTdHJ1Y3R1cmUgKilsb2FkZXJfY3JlYXRlX2luZm8ucE5leHQ7CisgICAgICAgIFZrQmFzZU91dFN0cnVjdHVyZSAqcFByZXYgPSAoVmtCYXNlT3V0U3RydWN0dXJlICopJmxvYWRlcl9jcmVhdGVfaW5mbzsKKyAgICAgICAgd2hpbGUgKE5VTEwgIT0gcE5leHQpIHsKKyAgICAgICAgICAgIGlmIChWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPID09IHBOZXh0LT5zVHlwZSkgeworICAgICAgICAgICAgICAgIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvS0hSICpjdXJfc3RydWN0ID0gKFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvS0hSICopcE5leHQ7CisgICAgICAgICAgICAgICAgaWYgKDAgPCBjdXJfc3RydWN0LT5waHlzaWNhbERldmljZUNvdW50ICYmIE5VTEwgIT0gY3VyX3N0cnVjdC0+cFBoeXNpY2FsRGV2aWNlcykgeworICAgICAgICAgICAgICAgICAgICBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mb0tIUiAqdGVtcF9zdHJ1Y3QgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvS0hSKSk7CisgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UgKnBoeXNfZGV2X2FycmF5ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gdGVtcF9zdHJ1Y3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfc3RydWN0LCBjdXJfc3RydWN0LCBzaXplb2YoVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm9LSFIpKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfYXJyYXkgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpICogY3VyX3N0cnVjdC0+cGh5c2ljYWxEZXZpY2VDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09IHBoeXNfZGV2X2FycmF5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQmVmb3JlIGNhbGxpbmcgZG93biwgcmVwbGFjZSB0aGUgaW5jb21pbmcgcGh5c2ljYWwgZGV2aWNlIHZhbHVlcyAod2hpY2ggYXJlIHJlYWxseSBsb2FkZXIgdHJhbXBvbGluZQorICAgICAgICAgICAgICAgICAgICAvLyBwaHlzaWNhbCBkZXZpY2VzKSB3aXRoIHRoZSBuZXh0IGxheWVyIChvciBwb3NzaWJseSBldmVuIHRoZSB0ZXJtaW5hdG9yKSBwaHlzaWNhbCBkZXZpY2UgdmFsdWVzLgorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqY3VyX3RyYW1wOworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHBoeXNfZGV2ID0gMDsgcGh5c19kZXYgPCBjdXJfc3RydWN0LT5waHlzaWNhbERldmljZUNvdW50OyBwaHlzX2RldisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdHJhbXAgPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKiljdXJfc3RydWN0LT5wUGh5c2ljYWxEZXZpY2VzW3BoeXNfZGV2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X2FycmF5W3BoeXNfZGV2XSA9IGN1cl90cmFtcC0+cGh5c19kZXY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGVtcF9zdHJ1Y3QtPnBQaHlzaWNhbERldmljZXMgPSBwaHlzX2Rldl9hcnJheTsKKworICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgc3RydWN0IGluIHRoZSBwTmV4dCBjaGFpbiB3aXRoIHRoaXMgb25lLgorICAgICAgICAgICAgICAgICAgICBwUHJldi0+cE5leHQgPSAoVmtCYXNlT3V0U3RydWN0dXJlICopdGVtcF9zdHJ1Y3Q7CisgICAgICAgICAgICAgICAgICAgIHBOZXh0ID0gKFZrQmFzZU91dFN0cnVjdHVyZSAqKXRlbXBfc3RydWN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFByZXYgPSBwTmV4dDsKKyAgICAgICAgICAgIHBOZXh0ID0gcE5leHQtPnBOZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgbGF5ZXJfZGV2aWNlX2xpbmtfaW5mbyA9IGxvYWRlcl9zdGFja19hbGxvYyhzaXplb2YoVmtMYXllckRldmljZUxpbmspICogZGV2LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jb3VudCk7CisgICAgaWYgKCFsYXllcl9kZXZpY2VfbGlua19pbmZvKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgImxvYWRlcl9jcmVhdGVfZGV2aWNlX2NoYWluOiBGYWlsZWQgdG8gYWxsb2MgRGV2aWNlIG9iamVjdHMiCisgICAgICAgICAgICAgICAgICAgIiBmb3IgbGF5ZXIuICBTa2lwcGluZyBMYXllci4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jb3VudCA+IDApIHsKKyAgICAgICAgY2hhaW5faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9ERVZJQ0VfQ1JFQVRFX0lORk87CisgICAgICAgIGNoYWluX2luZm8uZnVuY3Rpb24gPSBWS19MQVlFUl9MSU5LX0lORk87CisgICAgICAgIGNoYWluX2luZm8udS5wTGF5ZXJJbmZvID0gTlVMTDsKKyAgICAgICAgY2hhaW5faW5mby5wTmV4dCA9IGxvYWRlcl9jcmVhdGVfaW5mby5wTmV4dDsKKyAgICAgICAgbG9hZGVyX2NyZWF0ZV9pbmZvLnBOZXh0ID0gJmNoYWluX2luZm87CisKKyAgICAgICAgYm9vbCBkb25lID0gZmFsc2U7CisKKyAgICAgICAgLy8gQ3JlYXRlIGluc3RhbmNlIGNoYWluIG9mIGVuYWJsZWQgbGF5ZXJzCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gZGV2LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKmxheWVyX3Byb3AgPSAmZGV2LT5leHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5saXN0W2ldOworICAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsaWJfaGFuZGxlOworCisgICAgICAgICAgICBsaWJfaGFuZGxlID0gbG9hZGVyT3BlbkxheWVyRmlsZShpbnN0LCAiZGV2aWNlIiwgbGF5ZXJfcHJvcCk7CisgICAgICAgICAgICBpZiAoIWxpYl9oYW5kbGUgfHwgZG9uZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgR2V0KlByb2NBZGRyIHBvaW50ZXJzIHdpbGwgYWxyZWFkeSBiZSBmaWxsZWQgaW4gaWYgdGhleSB3ZXJlIHJlY2VpdmVkIGZyb20gZWl0aGVyIHRoZSBqc29uIGZpbGUgb3IgdGhlCisgICAgICAgICAgICAvLyB2ZXJzaW9uIG5lZ290aWF0aW9uCisgICAgICAgICAgICBpZiAoKGZwR0lQQSA9IGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5nZXRfaW5zdGFuY2VfcHJvY19hZGRyKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmxlbihsYXllcl9wcm9wLT5mdW5jdGlvbnMuc3RyX2dpcGEpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZnBHSVBBID0gKFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIpbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobGliX2hhbmRsZSwgInZrR2V0SW5zdGFuY2VQcm9jQWRkciIpOworICAgICAgICAgICAgICAgICAgICBsYXllcl9wcm9wLT5mdW5jdGlvbnMuZ2V0X2luc3RhbmNlX3Byb2NfYWRkciA9IGZwR0lQQTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZnBHSVBBID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyKWxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxpYl9oYW5kbGUsIGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5zdHJfZ2lwYSk7CisgICAgICAgICAgICAgICAgaWYgKCFmcEdJUEEpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX2NyZWF0ZV9kZXZpY2VfY2hhaW46IEZhaWxlZCB0byBmaW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCd2a0dldEluc3RhbmNlUHJvY0FkZHJcJyBpbiBsYXllciAlcy4gIFNraXBwaW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbGF5ZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9wcm9wLT5saWJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZwR0lQQSA9PSBjYWxsaW5nTGF5ZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAobGF5ZXJOZXh0R0RQQSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICpsYXllck5leHRHRFBBID0gbmV4dEdEUEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZwR0RQQSA9IGxheWVyX3Byb3AtPmZ1bmN0aW9ucy5nZXRfZGV2aWNlX3Byb2NfYWRkcikgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJsZW4obGF5ZXJfcHJvcC0+ZnVuY3Rpb25zLnN0cl9nZHBhKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZwR0RQQSA9IChQRk5fdmtHZXREZXZpY2VQcm9jQWRkcilsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsaWJfaGFuZGxlLCAidmtHZXREZXZpY2VQcm9jQWRkciIpOworICAgICAgICAgICAgICAgICAgICBsYXllcl9wcm9wLT5mdW5jdGlvbnMuZ2V0X2RldmljZV9wcm9jX2FkZHIgPSBmcEdEUEE7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZwR0RQQSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIpbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobGliX2hhbmRsZSwgbGF5ZXJfcHJvcC0+ZnVuY3Rpb25zLnN0cl9nZHBhKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZwR0RQQSkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLCAiRmFpbGVkIHRvIGZpbmQgdmtHZXREZXZpY2VQcm9jQWRkciBpbiBsYXllciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfcHJvcC0+bGliX25hbWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxheWVyX2RldmljZV9saW5rX2luZm9bYWN0aXZhdGVkX2xheWVyc10ucE5leHQgPSBjaGFpbl9pbmZvLnUucExheWVySW5mbzsKKyAgICAgICAgICAgIGxheWVyX2RldmljZV9saW5rX2luZm9bYWN0aXZhdGVkX2xheWVyc10ucGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHIgPSBuZXh0R0lQQTsKKyAgICAgICAgICAgIGxheWVyX2RldmljZV9saW5rX2luZm9bYWN0aXZhdGVkX2xheWVyc10ucGZuTmV4dEdldERldmljZVByb2NBZGRyID0gbmV4dEdEUEE7CisgICAgICAgICAgICBjaGFpbl9pbmZvLnUucExheWVySW5mbyA9ICZsYXllcl9kZXZpY2VfbGlua19pbmZvW2FjdGl2YXRlZF9sYXllcnNdOworICAgICAgICAgICAgbmV4dEdJUEEgPSBmcEdJUEE7CisgICAgICAgICAgICBuZXh0R0RQQSA9IGZwR0RQQTsKKworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwgIkluc2VydGVkIGRldmljZSBsYXllciAlcyAoJXMpIiwgbGF5ZXJfcHJvcC0+aW5mby5sYXllck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX3Byb3AtPmxpYl9uYW1lKTsKKworICAgICAgICAgICAgYWN0aXZhdGVkX2xheWVycysrOworICAgICAgICB9CisgICAgfQorCisgICAgVmtEZXZpY2UgY3JlYXRlZF9kZXZpY2UgPSAoVmtEZXZpY2UpZGV2OworICAgIFBGTl92a0NyZWF0ZURldmljZSBmcENyZWF0ZURldmljZSA9IChQRk5fdmtDcmVhdGVEZXZpY2UpbmV4dEdJUEEoaW5zdC0+aW5zdGFuY2UsICJ2a0NyZWF0ZURldmljZSIpOworICAgIGlmIChmcENyZWF0ZURldmljZSkgeworICAgICAgICBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyBjcmVhdGVfaW5mb19kaXNwOworCisgICAgICAgIGNyZWF0ZV9pbmZvX2Rpc3Auc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfREVWSUNFX0NSRUFURV9JTkZPOworICAgICAgICBjcmVhdGVfaW5mb19kaXNwLmZ1bmN0aW9uID0gVktfTE9BREVSX0RBVEFfQ0FMTEJBQ0s7CisKKyAgICAgICAgY3JlYXRlX2luZm9fZGlzcC51LnBmblNldERldmljZUxvYWRlckRhdGEgPSB2a1NldERldmljZURpc3BhdGNoOworCisgICAgICAgIGNyZWF0ZV9pbmZvX2Rpc3AucE5leHQgPSBsb2FkZXJfY3JlYXRlX2luZm8ucE5leHQ7CisgICAgICAgIGxvYWRlcl9jcmVhdGVfaW5mby5wTmV4dCA9ICZjcmVhdGVfaW5mb19kaXNwOworICAgICAgICByZXMgPSBmcENyZWF0ZURldmljZShwZCwgJmxvYWRlcl9jcmVhdGVfaW5mbywgcEFsbG9jYXRvciwgJmNyZWF0ZWRfZGV2aWNlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGRldi0+Y2hhaW5fZGV2aWNlID0gY3JlYXRlZF9kZXZpY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAibG9hZGVyX2NyZWF0ZV9kZXZpY2VfY2hhaW46IEZhaWxlZCB0byBmaW5kIFwndmtDcmVhdGVEZXZpY2VcJyAiCisgICAgICAgICAgICAgICAgICAgImluIGxheWVycyBvciBJQ0QiKTsKKyAgICAgICAgLy8gQ291bGRuJ3QgZmluZCBDcmVhdGVEZXZpY2UgZnVuY3Rpb24hCisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBkZXZpY2UgZGlzcGF0Y2ggdGFibGUKKyAgICBsb2FkZXJfaW5pdF9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoJmRldi0+bG9hZGVyX2Rpc3BhdGNoLCBuZXh0R0RQQSwgZGV2LT5jaGFpbl9kZXZpY2UpOworCisgICAgcmV0dXJuIHJlczsKK30KKworVmtSZXN1bHQgbG9hZGVyVmFsaWRhdGVMYXllcnMoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgdWludDMyX3QgbGF5ZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAqcHBFbmFibGVkTGF5ZXJOYW1lcywgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsaXN0KSB7CisgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheWVyX2NvdW50OyBpKyspIHsKKyAgICAgICAgVmtTdHJpbmdFcnJvckZsYWdzIHJlc3VsdCA9IHZrX3N0cmluZ192YWxpZGF0ZShNYXhMb2FkZXJTdHJpbmdMZW5ndGgsIHBwRW5hYmxlZExheWVyTmFtZXNbaV0pOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NUUklOR19FUlJPUl9OT05FKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyVmFsaWRhdGVMYXllcnM6IERldmljZSBwcEVuYWJsZWRMYXllck5hbWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNvbnRhaW5zIHN0cmluZyB0aGF0IGlzIHRvbyBsb25nIG9yIGlzIGJhZGx5IGZvcm1lZCIpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UOworICAgICAgICB9CisKKyAgICAgICAgcHJvcCA9IGxvYWRlckZpbmRMYXllclByb3BlcnR5KHBwRW5hYmxlZExheWVyTmFtZXNbaV0sIGxpc3QpOworICAgICAgICBpZiAoTlVMTCA9PSBwcm9wKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyVmFsaWRhdGVMYXllcnM6IExheWVyICVkIGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsYXllcnMiLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVmtSZXN1bHQgbG9hZGVyX3ZhbGlkYXRlX2luc3RhbmNlX2V4dGVuc2lvbnMoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3Qgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqaWNkX2V4dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmluc3RhbmNlX2xheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbykgeworICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqZXh0ZW5zaW9uX3Byb3A7CisgICAgY2hhciAqZW52X3ZhbHVlOworICAgIGJvb2wgY2hlY2tfaWZfa25vd24gPSB0cnVlOworICAgIFZrUmVzdWx0IHJlcyA9IFZLX1NVQ0NFU1M7CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgYWN0aXZlX2xheWVyczsKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgZXhwYW5kZWRfbGF5ZXJzOworICAgIG1lbXNldCgmYWN0aXZlX2xheWVycywgMCwgc2l6ZW9mKGFjdGl2ZV9sYXllcnMpKTsKKyAgICBtZW1zZXQoJmV4cGFuZGVkX2xheWVycywgMCwgc2l6ZW9mKGV4cGFuZGVkX2xheWVycykpOworICAgIGlmICghbG9hZGVySW5pdExheWVyTGlzdChpbnN0LCAmYWN0aXZlX2xheWVycykpIHsKKyAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKCFsb2FkZXJJbml0TGF5ZXJMaXN0KGluc3QsICZleHBhbmRlZF9sYXllcnMpKSB7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIGxpc3RzIG9mIGFjdGl2ZSBsYXllcnMgKGluY2x1ZGluZyBtZXRhbGF5ZXJzKSBhbmQgZXhwYW5kZWQgbGF5ZXJzICh3aXRoIG1ldGFsYXllcnMgcmVzb2x2ZWQgdG8gdGhlaXIgY29tcG9uZW50cykKKyAgICBsb2FkZXJBZGRJbXBsaWNpdExheWVycyhpbnN0LCAmYWN0aXZlX2xheWVycywgJmV4cGFuZGVkX2xheWVycywgaW5zdGFuY2VfbGF5ZXJzKTsKKyAgICBsb2FkZXJBZGRFbnZpcm9ubWVudExheWVycyhpbnN0LCBWS19MQVlFUl9UWVBFX0ZMQUdfRVhQTElDSVRfTEFZRVIsIEVOQUJMRURfTEFZRVJTX0VOViwgJmFjdGl2ZV9sYXllcnMsICZleHBhbmRlZF9sYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VfbGF5ZXJzKTsKKyAgICByZXMgPSBsb2FkZXJBZGRMYXllck5hbWVzVG9MaXN0KGluc3QsICZhY3RpdmVfbGF5ZXJzLCAmZXhwYW5kZWRfbGF5ZXJzLCBwQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcywgaW5zdGFuY2VfbGF5ZXJzKTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworICAgICAgICBWa1N0cmluZ0Vycm9yRmxhZ3MgcmVzdWx0ID0gdmtfc3RyaW5nX3ZhbGlkYXRlKE1heExvYWRlclN0cmluZ0xlbmd0aCwgcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVFJJTkdfRVJST1JfTk9ORSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl92YWxpZGF0ZV9pbnN0YW5jZV9leHRlbnNpb25zOiBJbnN0YW5jZSBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyBjb250YWlucyAiCisgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdGhhdCBpcyB0b28gbG9uZyBvciBpcyBiYWRseSBmb3JtZWQiKTsKKyAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYSB1c2VyIHdhbnRzIHRvIGRpc2FibGUgdGhlIGluc3RhbmNlIGV4dGVuc2lvbiBmaWx0ZXJpbmcgYmVoYXZpb3IKKyAgICAgICAgZW52X3ZhbHVlID0gbG9hZGVyX2dldGVudigiVktfTE9BREVSX0RJU0FCTEVfSU5TVF9FWFRfRklMVEVSIiwgaW5zdCk7CisgICAgICAgIGlmIChOVUxMICE9IGVudl92YWx1ZSAmJiBhdG9pKGVudl92YWx1ZSkgIT0gMCkgeworICAgICAgICAgICAgY2hlY2tfaWZfa25vd24gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBsb2FkZXJfZnJlZV9nZXRlbnYoZW52X3ZhbHVlLCBpbnN0KTsKKworICAgICAgICBpZiAoY2hlY2tfaWZfa25vd24pIHsKKyAgICAgICAgICAgIC8vIFNlZSBpZiB0aGUgZXh0ZW5zaW9uIGlzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBleHRlbnNpb25zCisgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBMT0FERVJfSU5TVEFOQ0VfRVhURU5TSU9OU1tqXSAhPSBOVUxMOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgTE9BREVSX0lOU1RBTkNFX0VYVEVOU0lPTlNbal0pID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIGl0IGlzbid0IGluIHRoZSBsaXN0LCByZXR1cm4gYW4gZXJyb3IKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlcl92YWxpZGF0ZV9pbnN0YW5jZV9leHRlbnNpb25zOiBFeHRlbnNpb24gJXMgbm90IGZvdW5kIGluIGxpc3Qgb2Yga25vd24gaW5zdGFuY2UgZXh0ZW5zaW9ucy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQ7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBleHRlbnNpb25fcHJvcCA9IGdldF9leHRlbnNpb25fcHJvcGVydHkocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBpY2RfZXh0cyk7CisKKyAgICAgICAgaWYgKGV4dGVuc2lvbl9wcm9wKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGV4dGVuc2lvbl9wcm9wID0gTlVMTDsKKworICAgICAgICAvLyBOb3QgaW4gZ2xvYmFsIGxpc3QsIHNlYXJjaCBsYXllciBleHRlbnNpb24gbGlzdHMKKyAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpsYXllcl9wcm9wID0gTlVMTDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgTlVMTCA9PSBleHRlbnNpb25fcHJvcCAmJiBqIDwgZXhwYW5kZWRfbGF5ZXJzLmNvdW50OyArK2opIHsKKyAgICAgICAgICAgIGV4dGVuc2lvbl9wcm9wID0KKyAgICAgICAgICAgICAgICBnZXRfZXh0ZW5zaW9uX3Byb3BlcnR5KHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgJmV4cGFuZGVkX2xheWVycy5saXN0W2pdLmluc3RhbmNlX2V4dGVuc2lvbl9saXN0KTsKKyAgICAgICAgICAgIGlmIChleHRlbnNpb25fcHJvcCkgeworICAgICAgICAgICAgICAgIC8vIEZvdW5kIHRoZSBleHRlbnNpb24gaW4gb25lIG9mIHRoZSBsYXllcnMgZW5hYmxlZCBieSB0aGUgYXBwLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXllcl9wcm9wID0gbG9hZGVyRmluZExheWVyUHJvcGVydHkoZXhwYW5kZWRfbGF5ZXJzLmxpc3Rbal0uaW5mby5sYXllck5hbWUsIGluc3RhbmNlX2xheWVycyk7CisgICAgICAgICAgICBpZiAoTlVMTCA9PSBsYXllcl9wcm9wKSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIE5PVCBnZXQgaGVyZSwgbG9hZGVyVmFsaWRhdGVMYXllcnMgc2hvdWxkIGhhdmUgYWxyZWFkeSBmaWx0ZXJlZCB0aGlzIGNhc2Ugb3V0LgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFleHRlbnNpb25fcHJvcCkgeworICAgICAgICAgICAgLy8gRGlkbid0IGZpbmQgZXh0ZW5zaW9uIG5hbWUgaW4gYW55IG9mIHRoZSBnbG9iYWwgbGF5ZXJzLCBlcnJvciBvdXQKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXJfdmFsaWRhdGVfaW5zdGFuY2VfZXh0ZW5zaW9uczogSW5zdGFuY2UgZXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQgYnkgYXZhaWxhYmxlIElDRHMgb3IgZW5hYmxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJsYXllcnMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCitvdXQ6CisgICAgbG9hZGVyRGVzdHJveUxheWVyTGlzdChpbnN0LCBOVUxMLCAmYWN0aXZlX2xheWVycyk7CisgICAgbG9hZGVyRGVzdHJveUxheWVyTGlzdChpbnN0LCBOVUxMLCAmZXhwYW5kZWRfbGF5ZXJzKTsKKyAgICByZXR1cm4gcmVzOworfQorCitWa1Jlc3VsdCBsb2FkZXJfdmFsaWRhdGVfZGV2aWNlX2V4dGVuc2lvbnMoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqdGhpc19pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmFjdGl2YXRlZF9kZXZpY2VfbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgKmljZF9leHRzLCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKSB7CisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpleHRlbnNpb25fcHJvcDsKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgKmxheWVyX3Byb3A7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgIFZrU3RyaW5nRXJyb3JGbGFncyByZXN1bHQgPSB2a19zdHJpbmdfdmFsaWRhdGUoTWF4TG9hZGVyU3RyaW5nTGVuZ3RoLCBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NUUklOR19FUlJPUl9OT05FKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKHRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX3ZhbGlkYXRlX2RldmljZV9leHRlbnNpb25zOiBEZXZpY2UgcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgY29udGFpbnMgIgorICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIHRoYXQgaXMgdG9vIGxvbmcgb3IgaXMgYmFkbHkgZm9ybWVkIik7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqZXh0ZW5zaW9uX25hbWUgPSBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV07CisgICAgICAgIGV4dGVuc2lvbl9wcm9wID0gZ2V0X2V4dGVuc2lvbl9wcm9wZXJ0eShleHRlbnNpb25fbmFtZSwgaWNkX2V4dHMpOworCisgICAgICAgIGlmIChleHRlbnNpb25fcHJvcCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3QgaW4gZ2xvYmFsIGxpc3QsIHNlYXJjaCBhY3RpdmF0ZWQgbGF5ZXIgZXh0ZW5zaW9uIGxpc3RzCisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBhY3RpdmF0ZWRfZGV2aWNlX2xheWVycy0+Y291bnQ7IGorKykgeworICAgICAgICAgICAgbGF5ZXJfcHJvcCA9ICZhY3RpdmF0ZWRfZGV2aWNlX2xheWVycy0+bGlzdFtqXTsKKworICAgICAgICAgICAgZXh0ZW5zaW9uX3Byb3AgPSBnZXRfZGV2X2V4dGVuc2lvbl9wcm9wZXJ0eShleHRlbnNpb25fbmFtZSwgJmxheWVyX3Byb3AtPmRldmljZV9leHRlbnNpb25fbGlzdCk7CisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uX3Byb3ApIHsKKyAgICAgICAgICAgICAgICAvLyBGb3VuZCB0aGUgZXh0ZW5zaW9uIGluIG9uZSBvZiB0aGUgbGF5ZXJzIGVuYWJsZWQgYnkgdGhlIGFwcC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZXh0ZW5zaW9uX3Byb3ApIHsKKyAgICAgICAgICAgIC8vIERpZG4ndCBmaW5kIGV4dGVuc2lvbiBuYW1lIGluIGFueSBvZiB0aGUgZGV2aWNlIGxheWVycywgZXJyb3Igb3V0CisgICAgICAgICAgICBsb2FkZXJfbG9nKHRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyX3ZhbGlkYXRlX2RldmljZV9leHRlbnNpb25zOiBEZXZpY2UgZXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQgYnkgc2VsZWN0ZWQgcGh5c2ljYWwgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm9yIGVuYWJsZWQgbGF5ZXJzLiIsCisgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisvLyBUZXJtaW5hdG9yIGZ1bmN0aW9ucyBmb3IgdGhlIEluc3RhbmNlIGNoYWluCisvLyBBbGwgbmFtZWQgdGVybWluYXRvcl88VnVsYWtuIEFQSSBuYW1lPgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0luc3RhbmNlICpwSW5zdGFuY2UpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybTsKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnByb3A7CisgICAgY2hhciAqKmZpbHRlcmVkX2V4dGVuc2lvbl9uYW1lcyA9IE5VTEw7CisgICAgVmtJbnN0YW5jZUNyZWF0ZUluZm8gaWNkX2NyZWF0ZV9pbmZvOworICAgIFZrUmVzdWx0IHJlcyA9IFZLX1NVQ0NFU1M7CisgICAgYm9vbCBvbmVfaWNkX3N1Y2Nlc3NmdWwgPSBmYWxzZTsKKworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopKnBJbnN0YW5jZTsKKyAgICBtZW1jcHkoJmljZF9jcmVhdGVfaW5mbywgcENyZWF0ZUluZm8sIHNpemVvZihpY2RfY3JlYXRlX2luZm8pKTsKKworICAgIGljZF9jcmVhdGVfaW5mby5lbmFibGVkTGF5ZXJDb3VudCA9IDA7CisgICAgaWNkX2NyZWF0ZV9pbmZvLnBwRW5hYmxlZExheWVyTmFtZXMgPSBOVUxMOworCisgICAgLy8gTk9URTogTmVlZCB0byBmaWx0ZXIgdGhlIGV4dGVuc2lvbnMgdG8gb25seSB0aG9zZSBzdXBwb3J0ZWQgYnkgdGhlIElDRC4KKyAgICAvLyAgICAgICBObyBJQ0Qgd2lsbCBhZHZlcnRpc2Ugc3VwcG9ydCBmb3IgbGF5ZXJzLiBBbiBJQ0QgbGlicmFyeSBjb3VsZAorICAgIC8vICAgICAgIHN1cHBvcnQgYSBsYXllciwgYnV0IGl0IHdvdWxkIGJlIGluZGVwZW5kZW50IG9mIHRoZSBhY3R1YWwgSUNELAorICAgIC8vICAgICAgIGp1c3QgaW4gdGhlIHNhbWUgbGlicmFyeS4KKyAgICBmaWx0ZXJlZF9leHRlbnNpb25fbmFtZXMgPSBsb2FkZXJfc3RhY2tfYWxsb2MocENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudCAqIHNpemVvZihjaGFyICopKTsKKyAgICBpZiAoIWZpbHRlcmVkX2V4dGVuc2lvbl9uYW1lcykgeworICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgInRlcm1pbmF0b3JfQ3JlYXRlSW5zdGFuY2U6IEZhaWxlZCBjcmVhdGUgZXh0ZW5zaW9uIG5hbWUgYXJyYXkgZm9yICVkIGV4dGVuc2lvbnMiLAorICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQpOworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpY2RfY3JlYXRlX2luZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSAoY29uc3QgY2hhciAqY29uc3QgKilmaWx0ZXJlZF9leHRlbnNpb25fbmFtZXM7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcHRyX2luc3RhbmNlLT5pY2RfdHJhbXBfbGlzdC5jb3VudDsgaSsrKSB7CisgICAgICAgIGljZF90ZXJtID0gbG9hZGVyX2ljZF9hZGQocHRyX2luc3RhbmNlLCAmcHRyX2luc3RhbmNlLT5pY2RfdHJhbXBfbGlzdC5zY2FubmVkX2xpc3RbaV0pOworICAgICAgICBpZiAoTlVMTCA9PSBpY2RfdGVybSkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidGVybWluYXRvcl9DcmVhdGVJbnN0YW5jZTogRmFpbGVkIHRvIGFkZCBJQ0QgJWQgdG8gSUNEIHRyYW1wb2xpbmUgbGlzdC4iLCBpKTsKKyAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgYW55IGVycm9yIGhhcHBlbnMgYWZ0ZXIgaGVyZSwgd2UgbmVlZCB0byByZW1vdmUgdGhlIElDRCBmcm9tIHRoZSBsaXN0LAorICAgICAgICAvLyBiZWNhdXNlIHdlJ3ZlIGFscmVhZHkgYWRkZWQgaXQsIGJ1dCBoYXZlbid0IHZhbGlkYXRlZCBpdAorCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIHJlc2V0IHRoZSBwQXBwbGljYXRpb25JbmZvIHNvIHdlIGRvbid0IGdldCBhbiBvbGQgcG9pbnRlcgorICAgICAgICBpY2RfY3JlYXRlX2luZm8ucEFwcGxpY2F0aW9uSW5mbyA9IHBDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvOworICAgICAgICBpY2RfY3JlYXRlX2luZm8uZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gMDsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCBpY2RfZXh0czsKKworICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQsIDAsICJCdWlsZCBJQ0QgaW5zdGFuY2UgZXh0ZW5zaW9uIGxpc3QiKTsKKyAgICAgICAgLy8gdHJhdmVyc2Ugc2Nhbm5lZCBpY2QgbGlzdCBhZGRpbmcgbm9uLWR1cGxpY2F0ZSBleHRlbnNpb25zIHRvIHRoZSBsaXN0CisgICAgICAgIHJlcyA9IGxvYWRlcl9pbml0X2dlbmVyaWNfbGlzdChwdHJfaW5zdGFuY2UsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKSZpY2RfZXh0cywgc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykpOworICAgICAgICBpZiAoVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZID09IHJlcykgeworICAgICAgICAgICAgLy8gSWYgb3V0IG9mIG1lbW9yeSwgYmFpbCBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9IGVsc2UgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkIHdpdGggdGhpcyBJQ0QsIHNvIGZyZWUgaXQgYW5kIHRyeSB0aGUKKyAgICAgICAgICAgIC8vIG5leHQuCisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPmljZF90ZXJtcyA9IGljZF90ZXJtLT5uZXh0OworICAgICAgICAgICAgaWNkX3Rlcm0tPm5leHQgPSBOVUxMOworICAgICAgICAgICAgbG9hZGVyX2ljZF9kZXN0cm95KHB0cl9pbnN0YW5jZSwgaWNkX3Rlcm0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByZXMgPSBsb2FkZXJfYWRkX2luc3RhbmNlX2V4dGVuc2lvbnMocHRyX2luc3RhbmNlLCBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPkVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5zY2FubmVkX2ljZC0+bGliX25hbWUsICZpY2RfZXh0cyk7CisgICAgICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfZ2VuZXJpY19saXN0KHB0cl9pbnN0YW5jZSwgKHN0cnVjdCBsb2FkZXJfZ2VuZXJpY19saXN0ICopJmljZF9leHRzKTsKKyAgICAgICAgICAgIGlmIChWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkgPT0gcmVzKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgb3V0IG9mIG1lbW9yeSwgYmFpbCBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZCB3aXRoIHRoaXMgSUNELCBzbyBmcmVlIGl0IGFuZCB0cnkgdGhlIG5leHQuCisgICAgICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5pY2RfdGVybXMgPSBpY2RfdGVybS0+bmV4dDsKKyAgICAgICAgICAgICAgICBpY2RfdGVybS0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgbG9hZGVyX2ljZF9kZXN0cm95KHB0cl9pbnN0YW5jZSwgaWNkX3Rlcm0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGorKykgeworICAgICAgICAgICAgcHJvcCA9IGdldF9leHRlbnNpb25fcHJvcGVydHkocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2pdLCAmaWNkX2V4dHMpOworICAgICAgICAgICAgaWYgKHByb3ApIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZF9leHRlbnNpb25fbmFtZXNbaWNkX2NyZWF0ZV9pbmZvLmVuYWJsZWRFeHRlbnNpb25Db3VudF0gPSAoY2hhciAqKXBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tqXTsKKyAgICAgICAgICAgICAgICBpY2RfY3JlYXRlX2luZm8uZW5hYmxlZEV4dGVuc2lvbkNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb2FkZXJfZGVzdHJveV9nZW5lcmljX2xpc3QocHRyX2luc3RhbmNlLCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKikmaWNkX2V4dHMpOworCisgICAgICAgIC8vIEdldCB0aGUgZHJpdmVyIHZlcnNpb24gZnJvbSB2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbgorICAgICAgICB1aW50MzJfdCBpY2RfdmVyc2lvbiA9IFZLX0FQSV9WRVJTSU9OXzFfMDsKKyAgICAgICAgVmtSZXN1bHQgaWNkX3Jlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgICAgIGlmIChpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmFwaV92ZXJzaW9uID49IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICAgICAgUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIGljZF9lbnVtZXJhdGVfaW5zdGFuY2VfdmVyc2lvbiA9IChQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24pCisgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5HZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiIpOworICAgICAgICAgICAgaWYgKGljZF9lbnVtZXJhdGVfaW5zdGFuY2VfdmVyc2lvbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWNkX3Jlc3VsdCA9IGljZF9lbnVtZXJhdGVfaW5zdGFuY2VfdmVyc2lvbigmaWNkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIGlmIChpY2RfcmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWNkX3ZlcnNpb24gPSBWS19BUElfVkVSU0lPTl8xXzA7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVCwgMCwgInRlcm1pbmF0b3JfQ3JlYXRlSW5zdGFuY2U6IElDRCBcIiVzXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgInZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIHJldHVybmVkIGVycm9yLiBUaGUgSUNEIHdpbGwgYmUgdHJlYXRlZCBhcyBhIDEuMCBJQ0QiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlLCBzdWJzdGl0dXRpbmcgdGhlIHZlcnNpb24gdG8gMS4wIGlmIG5lY2Vzc2FyeQorICAgICAgICBWa0FwcGxpY2F0aW9uSW5mbyBpY2RfYXBwX2luZm87CisgICAgICAgIHVpbnQzMl90IGljZF92ZXJzaW9uX25vcGF0Y2ggPSBWS19NQUtFX1ZFUlNJT04oVktfVkVSU0lPTl9NQUpPUihpY2RfdmVyc2lvbiksIFZLX1ZFUlNJT05fTUlOT1IoaWNkX3ZlcnNpb24pLCAwKTsKKyAgICAgICAgdWludDMyX3QgcmVxdWVzdGVkX3ZlcnNpb24gPSBwQ3JlYXRlSW5mbyA9PSBOVUxMIHx8IHBDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvID09IE5VTEwgPyBWS19BUElfVkVSU0lPTl8xXzAgOiBwQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mby0+YXBpVmVyc2lvbjsKKyAgICAgICAgaWYgKChyZXF1ZXN0ZWRfdmVyc2lvbiAhPSAwKSAmJiAoaWNkX3ZlcnNpb25fbm9wYXRjaCA9PSBWS19BUElfVkVSU0lPTl8xXzApKSB7CisgICAgICAgICAgICBpZiAoaWNkX2NyZWF0ZV9pbmZvLnBBcHBsaWNhdGlvbkluZm8gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1lbXNldCgmaWNkX2FwcF9pbmZvLCAwLCBzaXplb2YoaWNkX2FwcF9pbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmaWNkX2FwcF9pbmZvLCBpY2RfY3JlYXRlX2luZm8ucEFwcGxpY2F0aW9uSW5mbywgc2l6ZW9mKGljZF9hcHBfaW5mbykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWNkX2FwcF9pbmZvLmFwaVZlcnNpb24gPSBpY2RfdmVyc2lvbjsKKyAgICAgICAgICAgIGljZF9jcmVhdGVfaW5mby5wQXBwbGljYXRpb25JbmZvID0gJmljZF9hcHBfaW5mbzsKKyAgICAgICAgfQorICAgICAgICBpY2RfcmVzdWx0ID0gcHRyX2luc3RhbmNlLT5pY2RfdHJhbXBfbGlzdC5zY2FubmVkX2xpc3RbaV0uQ3JlYXRlSW5zdGFuY2UoJmljZF9jcmVhdGVfaW5mbywgcEFsbG9jYXRvciwgJihpY2RfdGVybS0+aW5zdGFuY2UpKTsKKyAgICAgICAgaWYgKFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSA9PSBpY2RfcmVzdWx0KSB7CisgICAgICAgICAgICAvLyBJZiBvdXQgb2YgbWVtb3J5LCBiYWlsIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0gZWxzZSBpZiAoVktfU1VDQ0VTUyAhPSBpY2RfcmVzdWx0KSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInRlcm1pbmF0b3JfQ3JlYXRlSW5zdGFuY2U6IEZhaWxlZCB0byBDcmVhdGVJbnN0YW5jZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJJQ0QgJWQuICBTa2lwcGluZyBJQ0QuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPmljZF90ZXJtcyA9IGljZF90ZXJtLT5uZXh0OworICAgICAgICAgICAgaWNkX3Rlcm0tPm5leHQgPSBOVUxMOworICAgICAgICAgICAgbG9hZGVyX2ljZF9kZXN0cm95KHB0cl9pbnN0YW5jZSwgaWNkX3Rlcm0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxvYWRlcl9pY2RfaW5pdF9lbnRyaWVzKGljZF90ZXJtLCBpY2RfdGVybS0+aW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5pY2RfdHJhbXBfbGlzdC5zY2FubmVkX2xpc3RbaV0uR2V0SW5zdGFuY2VQcm9jQWRkcikpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidGVybWluYXRvcl9DcmVhdGVJbnN0YW5jZTogRmFpbGVkIHRvIENyZWF0ZUluc3RhbmNlIGFuZCBmaW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgImVudHJ5cG9pbnRzIHdpdGggSUNELiAgU2tpcHBpbmcgSUNELiIpOworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5pY2RfdGVybXMgPSBpY2RfdGVybS0+bmV4dDsKKyAgICAgICAgICAgIGljZF90ZXJtLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIGxvYWRlcl9pY2RfZGVzdHJveShwdHJfaW5zdGFuY2UsIGljZF90ZXJtLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgbWFkZSBpdCB0aGlzIGZhciwgYXQgbGVhc3Qgb25lIElDRCB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICBvbmVfaWNkX3N1Y2Nlc3NmdWwgPSB0cnVlOworICAgIH0KKworICAgIC8vIElmIG5vIElDRHMgd2VyZSBhZGRlZCB0byBpbnN0YW5jZSBsaXN0IGFuZCByZXMgaXMgdW5jaGFuZ2VkIGZyb20gaXQncyBpbml0aWFsIHZhbHVlLCB0aGUgbG9hZGVyIHdhcyB1bmFibGUgdG8KKyAgICAvLyBmaW5kIGEgc3VpdGFibGUgSUNELgorICAgIGlmIChWS19TVUNDRVNTID09IHJlcyAmJiAocHRyX2luc3RhbmNlLT5pY2RfdGVybXMgPT0gTlVMTCB8fCAhb25lX2ljZF9zdWNjZXNzZnVsKSkgeworICAgICAgICByZXMgPSBWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSOworICAgIH0KKworb3V0OgorCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgIHdoaWxlIChOVUxMICE9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zKSB7CisgICAgICAgICAgICBpY2RfdGVybSA9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zOworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5pY2RfdGVybXMgPSBpY2RfdGVybS0+bmV4dDsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtLT5pbnN0YW5jZSkgeworICAgICAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95SW5zdGFuY2UoaWNkX3Rlcm0tPmluc3RhbmNlLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlcl9pY2RfZGVzdHJveShwdHJfaW5zdGFuY2UsIGljZF90ZXJtLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfRGVzdHJveUluc3RhbmNlKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IGxvYWRlcl9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKE5VTEwgPT0gcHRyX2luc3RhbmNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm1zID0gcHRyX2luc3RhbmNlLT5pY2RfdGVybXM7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqbmV4dF9pY2RfdGVybTsKKworICAgIC8vIFJlbW92ZSB0aGlzIGluc3RhbmNlIGZyb20gdGhlIGxpc3Qgb2YgaW5zdGFuY2VzOgorICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnByZXYgPSBOVUxMOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKm5leHQgPSBsb2FkZXIuaW5zdGFuY2VzOworICAgIHdoaWxlIChuZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG5leHQgPT0gcHRyX2luc3RhbmNlKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBpbnN0YW5jZSBmcm9tIHRoZSBsaXN0OgorICAgICAgICAgICAgaWYgKHByZXYpCisgICAgICAgICAgICAgICAgcHJldi0+bmV4dCA9IG5leHQtPm5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9hZGVyLmluc3RhbmNlcyA9IG5leHQtPm5leHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgbmV4dCA9IG5leHQtPm5leHQ7CisgICAgfQorCisgICAgd2hpbGUgKE5VTEwgIT0gaWNkX3Rlcm1zKSB7CisgICAgICAgIGlmIChpY2RfdGVybXMtPmluc3RhbmNlKSB7CisgICAgICAgICAgICBpY2RfdGVybXMtPmRpc3BhdGNoLkRlc3Ryb3lJbnN0YW5jZShpY2RfdGVybXMtPmluc3RhbmNlLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBuZXh0X2ljZF90ZXJtID0gaWNkX3Rlcm1zLT5uZXh0OworICAgICAgICBpY2RfdGVybXMtPmluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIGxvYWRlcl9pY2RfZGVzdHJveShwdHJfaW5zdGFuY2UsIGljZF90ZXJtcywgcEFsbG9jYXRvcik7CisKKyAgICAgICAgaWNkX3Rlcm1zID0gbmV4dF9pY2RfdGVybTsKKyAgICB9CisKKyAgICBsb2FkZXJEZWxldGVMYXllckxpc3RBbmRQcm9wZXJ0aWVzKHB0cl9pbnN0YW5jZSwgJnB0cl9pbnN0YW5jZS0+aW5zdGFuY2VfbGF5ZXJfbGlzdCk7CisgICAgbG9hZGVyX3NjYW5uZWRfaWNkX2NsZWFyKHB0cl9pbnN0YW5jZSwgJnB0cl9pbnN0YW5jZS0+aWNkX3RyYW1wX2xpc3QpOworICAgIGxvYWRlcl9kZXN0cm95X2dlbmVyaWNfbGlzdChwdHJfaW5zdGFuY2UsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKSZwdHJfaW5zdGFuY2UtPmV4dF9saXN0KTsKKyAgICBpZiAoTlVMTCAhPSBwdHJfaW5zdGFuY2UtPnBoeXNfZGV2c190ZXJtKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwdHJfaW5zdGFuY2UtPnBoeXNfZGV2X2NvdW50X3Rlcm07IGkrKykgeworICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIHB0cl9pbnN0YW5jZS0+cGh5c19kZXZzX3Rlcm1baV0pOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwdHJfaW5zdGFuY2UtPnBoeXNfZGV2c190ZXJtKTsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gcHRyX2luc3RhbmNlLT5waHlzX2Rldl9ncm91cHNfdGVybSkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcHRyX2luc3RhbmNlLT5waHlzX2Rldl9ncm91cF9jb3VudF90ZXJtOyBpKyspIHsKKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwdHJfaW5zdGFuY2UtPnBoeXNfZGV2X2dyb3Vwc190ZXJtW2ldKTsKKyAgICAgICAgfQorICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKHB0cl9pbnN0YW5jZSwgcHRyX2luc3RhbmNlLT5waHlzX2Rldl9ncm91cHNfdGVybSk7CisgICAgfQorICAgIGxvYWRlcl9mcmVlX2Rldl9leHRfdGFibGUocHRyX2luc3RhbmNlKTsKKyAgICBsb2FkZXJfZnJlZV9waHlzX2Rldl9leHRfdGFibGUocHRyX2luc3RhbmNlKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RldmljZSAqcERldmljZSkgeworICAgIFZrUmVzdWx0IHJlcyA9IFZLX1NVQ0NFU1M7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybTsKKyAgICBwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2ID0gKHN0cnVjdCBsb2FkZXJfZGV2aWNlICopKnBEZXZpY2U7CisgICAgUEZOX3ZrQ3JlYXRlRGV2aWNlIGZwQ3JlYXRlRGV2aWNlID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZURldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2V4dGVuc2lvbl9saXN0IGljZF9leHRzOworCisgICAgVmtCYXNlT3V0U3RydWN0dXJlICpjYWxsZXJfZGdjaV9jb250YWluZXIgPSBOVUxMOworICAgIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvS0hSICpjYWxsZXJfZGdjaSA9IE5VTEw7CisKKyAgICBkZXYtPnBoeXNfZGV2X3Rlcm0gPSBwaHlzX2Rldl90ZXJtOworCisgICAgaWNkX2V4dHMubGlzdCA9IE5VTEw7CisKKyAgICBpZiAoZnBDcmVhdGVEZXZpY2UgPT0gTlVMTCkgeworICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidGVybWluYXRvcl9DcmVhdGVEZXZpY2U6IE5vIHZrQ3JlYXRlRGV2aWNlIGNvbW1hbmQgZXhwb3NlZCAiCisgICAgICAgICAgICAgICAgICAgImJ5IElDRCAlcyIsCisgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgVmtEZXZpY2VDcmVhdGVJbmZvIGxvY2FsQ3JlYXRlSW5mbzsKKyAgICBtZW1jcHkoJmxvY2FsQ3JlYXRlSW5mbywgcENyZWF0ZUluZm8sIHNpemVvZihsb2NhbENyZWF0ZUluZm8pKTsKKworICAgIC8vIE5PVEU6IE5lZWQgdG8gZmlsdGVyIHRoZSBleHRlbnNpb25zIHRvIG9ubHkgdGhvc2Ugc3VwcG9ydGVkIGJ5IHRoZSBJQ0QuCisgICAgLy8gICAgICAgTm8gSUNEIHdpbGwgYWR2ZXJ0aXNlIHN1cHBvcnQgZm9yIGxheWVycy4gQW4gSUNEIGxpYnJhcnkgY291bGQgc3VwcG9ydCBhIGxheWVyLAorICAgIC8vICAgICAgIGJ1dCBpdCB3b3VsZCBiZSBpbmRlcGVuZGVudCBvZiB0aGUgYWN0dWFsIElDRCwganVzdCBpbiB0aGUgc2FtZSBsaWJyYXJ5LgorICAgIGNoYXIgKipmaWx0ZXJlZF9leHRlbnNpb25fbmFtZXMgPSBOVUxMOworICAgIGlmICgwIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudCkgeworICAgICAgICBmaWx0ZXJlZF9leHRlbnNpb25fbmFtZXMgPSBsb2FkZXJfc3RhY2tfYWxsb2MocENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudCAqIHNpemVvZihjaGFyICopKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gZmlsdGVyZWRfZXh0ZW5zaW9uX25hbWVzKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInRlcm1pbmF0b3JfQ3JlYXRlRGV2aWNlOiBGYWlsZWQgdG8gY3JlYXRlIGV4dGVuc2lvbiBuYW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgInN0b3JhZ2UgZm9yICVkIGV4dGVuc2lvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb2NhbENyZWF0ZUluZm8uZW5hYmxlZExheWVyQ291bnQgPSAwOworICAgIGxvY2FsQ3JlYXRlSW5mby5wcEVuYWJsZWRMYXllck5hbWVzID0gTlVMTDsKKworICAgIGxvY2FsQ3JlYXRlSW5mby5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSAwOworICAgIGxvY2FsQ3JlYXRlSW5mby5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IChjb25zdCBjaGFyICpjb25zdCAqKWZpbHRlcmVkX2V4dGVuc2lvbl9uYW1lczsKKworICAgIC8vIEdldCB0aGUgcGh5c2ljYWwgZGV2aWNlIChJQ0QpIGV4dGVuc2lvbnMKKyAgICByZXMgPSBsb2FkZXJfaW5pdF9nZW5lcmljX2xpc3QoaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKSZpY2RfZXh0cywgc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICByZXMgPSBsb2FkZXJfYWRkX2RldmljZV9leHRlbnNpb25zKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBpY2RfdGVybS0+ZGlzcGF0Y2guRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmxpYl9uYW1lLCAmaWNkX2V4dHMpOworICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbl9uYW1lID0gcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldOworICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnByb3AgPSBnZXRfZXh0ZW5zaW9uX3Byb3BlcnR5KGV4dGVuc2lvbl9uYW1lLCAmaWNkX2V4dHMpOworICAgICAgICBpZiAocHJvcCkgeworICAgICAgICAgICAgZmlsdGVyZWRfZXh0ZW5zaW9uX25hbWVzW2xvY2FsQ3JlYXRlSW5mby5lbmFibGVkRXh0ZW5zaW9uQ291bnRdID0gKGNoYXIgKilleHRlbnNpb25fbmFtZTsKKyAgICAgICAgICAgIGxvY2FsQ3JlYXRlSW5mby5lbmFibGVkRXh0ZW5zaW9uQ291bnQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXZpY2UgZXh0ZW5zaW9uICVzIG5vdCBhdmFpbGFibGUgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgImRldmljZXMgYXNzb2NpYXRlZCB3aXRoIElDRCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9uYW1lLCBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmxpYl9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEJlZm9yZSB3ZSBjb250aW51ZSwgSWYgS0hYX2RldmljZV9ncm91cCBpcyB0aGUgbGlzdCBvZiBlbmFibGVkIGFuZCB2aWFibGUgZXh0ZW5zaW9ucywgdGhlbiB3ZSB0aGVuIG5lZWQgdG8gbG9vayBmb3IgdGhlCisgICAgLy8gY29ycmVzcG9uZGluZyBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBzdHJ1Y3QgaW4gdGhlIGRldmljZSBsaXN0IGFuZCByZXBsYWNlIGFsbCB0aGUgcGh5c2ljYWwgZGV2aWNlIHZhbHVlcyAod2hpY2gKKyAgICAvLyBhcmUgcmVhbGx5IGxvYWRlciBwaHlzaWNhbCBkZXZpY2UgdGVybWluYXRvciB2YWx1ZXMpIHdpdGggdGhlIElDRCB2ZXJzaW9ucy4KKyAgICAvL2lmIChpY2RfdGVybS0+dGhpc19pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24gPT0gMSkgeworICAgIHsKKyAgICAgICAgVmtCYXNlT3V0U3RydWN0dXJlICpwTmV4dCA9IChWa0Jhc2VPdXRTdHJ1Y3R1cmUgKilsb2NhbENyZWF0ZUluZm8ucE5leHQ7CisgICAgICAgIFZrQmFzZU91dFN0cnVjdHVyZSAqcFByZXYgPSAoVmtCYXNlT3V0U3RydWN0dXJlICopJmxvY2FsQ3JlYXRlSW5mbzsKKyAgICAgICAgd2hpbGUgKE5VTEwgIT0gcE5leHQpIHsKKyAgICAgICAgICAgIGlmIChWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPID09IHBOZXh0LT5zVHlwZSkgeworICAgICAgICAgICAgICAgIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvICpjdXJfc3RydWN0ID0gKFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvICopcE5leHQ7CisgICAgICAgICAgICAgICAgaWYgKDAgPCBjdXJfc3RydWN0LT5waHlzaWNhbERldmljZUNvdW50ICYmIE5VTEwgIT0gY3VyX3N0cnVjdC0+cFBoeXNpY2FsRGV2aWNlcykgeworICAgICAgICAgICAgICAgICAgICBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyAqdGVtcF9zdHJ1Y3QgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UgKnBoeXNfZGV2X2FycmF5ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gdGVtcF9zdHJ1Y3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfc3RydWN0LCBjdXJfc3RydWN0LCBzaXplb2YoVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfYXJyYXkgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpICogY3VyX3N0cnVjdC0+cGh5c2ljYWxEZXZpY2VDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09IHBoeXNfZGV2X2FycmF5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQmVmb3JlIGNhbGxpbmcgZG93biwgcmVwbGFjZSB0aGUgaW5jb21pbmcgcGh5c2ljYWwgZGV2aWNlIHZhbHVlcyAod2hpY2ggYXJlIHJlYWxseSBsb2FkZXIgdGVybWluYXRvcgorICAgICAgICAgICAgICAgICAgICAvLyBwaHlzaWNhbCBkZXZpY2VzKSB3aXRoIHRoZSBJQ0RzIHBoeXNpY2FsIGRldmljZSB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKmN1cl90ZXJtOworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHBoeXNfZGV2ID0gMDsgcGh5c19kZXYgPCBjdXJfc3RydWN0LT5waHlzaWNhbERldmljZUNvdW50OyBwaHlzX2RldisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopY3VyX3N0cnVjdC0+cFBoeXNpY2FsRGV2aWNlc1twaHlzX2Rldl07CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9hcnJheVtwaHlzX2Rldl0gPSBjdXJfdGVybS0+cGh5c19kZXY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGVtcF9zdHJ1Y3QtPnBQaHlzaWNhbERldmljZXMgPSBwaHlzX2Rldl9hcnJheTsKKworICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHBvaW50ZXJzIHRvIHJlc3RvcmUgcE5leHQgY2hhaW4gYmVmb3JlIHJldHVybmluZworICAgICAgICAgICAgICAgICAgICBjYWxsZXJfZGdjaV9jb250YWluZXIgPSBwUHJldjsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGVyX2RnY2kgPSBjdXJfc3RydWN0OworCisgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG9sZCBzdHJ1Y3QgaW4gdGhlIHBOZXh0IGNoYWluIHdpdGggdGhpcyBvbmUuCisgICAgICAgICAgICAgICAgICAgIHBQcmV2LT5wTmV4dCA9IChWa0Jhc2VPdXRTdHJ1Y3R1cmUgKil0ZW1wX3N0cnVjdDsKKyAgICAgICAgICAgICAgICAgICAgcE5leHQgPSAoVmtCYXNlT3V0U3RydWN0dXJlICopdGVtcF9zdHJ1Y3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwUHJldiA9IHBOZXh0OworICAgICAgICAgICAgcE5leHQgPSBwTmV4dC0+cE5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIYW5kbGUgbG9hZGVyIGVtdWxhdGlvbiBmb3Igc3RydWN0cyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBJQ0Q6CisgICAgLy8gUHJlc2VudGx5LCB0aGUgZW11bGF0aW9uIGxlYXZlcyB0aGUgcE5leHQgY2hhaW4gYWxvbmUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgSUNEIHdpbGwgcmVjZWl2ZSBpdGVtcyBpbiB0aGUgY2hhaW4gd2hpY2gKKyAgICAvLyBhcmUgbm90IHJlY29nbml6ZWQgYnkgdGhlIElDRC4gSWYgdGhpcyBjYXVzZXMgdGhlIElDRCB0byBmYWlsLCB0aGVuIHRoZSBpdGVtcyB3b3VsZCBoYXZlIHRvIGJlIHJlbW92ZWQgaGVyZS4gVGhlIGN1cnJlbnQKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZW1vdmUgdGhlbSBiZWNhdXNlIGNvcHlpbmcgdGhlIHBOZXh0IGNoYWluIHdvdWxkIGJlIGltcG9zc2libGUgaWYgdGhlIGxvYWRlciBkb2VzIG5vdCByZWNvZ25pemUKKyAgICAvLyB0aGUgYW55IG9mIHRoZSBzdHJ1Y3QgdHlwZXMsIGFzIHRoZSBsb2FkZXIgd291bGQgbm90IGtub3cgdGhlIHNpemUgdG8gYWxsb2NhdGUgYW5kIGNvcHkuCisgICAgLy9pZiAoaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyID09IE5VTEwgJiYgaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID09IE5VTEwpIHsKKyAgICB7CisgICAgICAgIGNvbnN0IHZvaWQgKnBOZXh0ID0gbG9jYWxDcmVhdGVJbmZvLnBOZXh0OworICAgICAgICB3aGlsZSAocE5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgc3dpdGNoICgqKFZrU3RydWN0dXJlVHlwZSAqKXBOZXh0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjogeworICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICpmZWF0dXJlcyA9IHBOZXh0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPT0gTlVMTCAmJiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRGV2aWNlOiBFbXVsYXRpbmcgaGFuZGxpbmcgb2YgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBpbiBwTmV4dCBjaGFpbiBmb3IgSUNEIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpY2RfdGVybS0+dGhpc19pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxDcmVhdGVJbmZvLnBFbmFibGVkRmVhdHVyZXMgPSAmZmVhdHVyZXMtPmZlYXR1cmVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmUgdGhpcyBpdGVtIGluIHRoZSBwTmV4dCBjaGFpbiBmb3Igbm93CisKKyAgICAgICAgICAgICAgICAgICAgcE5leHQgPSBmZWF0dXJlcy0+cE5leHQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTzogeworICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mb0tIUiAqZ3JvdXBfaW5mbyA9IHBOZXh0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChpY2RfdGVybS0+ZGlzcGF0Y2guRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgPT0gTlVMTCAmJiBpY2RfdGVybS0+ZGlzcGF0Y2guRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRGV2aWNlOiBFbXVsYXRpbmcgaGFuZGxpbmcgb2YgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyBpbiBwTmV4dCBjaGFpbiBmb3IgSUNEIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBncm91cCBtdXN0IGNvbnRhaW4gb25seSB0aGlzIG9uZSBkZXZpY2UsIHNpbmNlIHBoeXNpY2FsIGRldmljZSBncm91cHMgYXJlbid0IGFjdHVhbGx5IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwX2luZm8tPnBoeXNpY2FsRGV2aWNlQ291bnQgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXZpY2U6IEVtdWxhdGlvbiBmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBmcm9tIGRldmljZSBncm91cCBpbmZvIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUgYmVjYXVzZSB3ZSdyZSBsZWF2aW5nIHRoZSBpdGVtIGluIHRoZSBwTmV4dCBjaGFpbiBhbmQgYmVjYXVzZSB0aGUgc3BlYyBzdGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgcGh5c2ljYWxEZXZpY2UgYXJndW1lbnQgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgZGV2aWNlIGdyb3VwLCBhbmQgd2UndmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgaXQgaXMKKworICAgICAgICAgICAgICAgICAgICBwTmV4dCA9IGdyb3VwX2luZm8tPnBOZXh0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBNdWx0aXZpZXcgcHJvcGVydGllcyBhcmUgYWxzbyBhbGxvd2VkLCBidXQgc2luY2UgVktfS0hYX211bHRpdmlldyBpcyBhIGRldmljZSBleHRlbnNpb24sIHdlJ2xsIGp1c3QgbGV0IHRoZSBJQ0QKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdGhhdCBlcnJvciB3aGVuIHRoZSB1c2VyIGVuYWJsZXMgdGhlIGV4dGVuc2lvbiBoZXJlCisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Jhc2VJblN0cnVjdHVyZSAqaGVhZGVyID0gcE5leHQ7CisgICAgICAgICAgICAgICAgICAgIHBOZXh0ID0gaGVhZGVyLT5wTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRXZlcnkgZXh0ZW5zaW9uIHRoYXQgaGFzIGEgbG9hZGVyLWRlZmluZWQgdGVybWluYXRvciBuZWVkcyB0byBiZSBtYXJrZWQgYXMgZW5hYmxlZCBvciBkaXNhYmxlZCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvcgorICAgIC8vIG5vdCB0byByZXR1cm4gdGhhdCB0ZXJtaW5hdG9yIHdoZW4gdmtHZXREZXZpY2VQcm9jQWRkciBpcyBjYWxsZWQKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbG9jYWxDcmVhdGVJbmZvLmVuYWJsZWRFeHRlbnNpb25Db3VudDsgKytpKSB7CisgICAgICAgIGlmICghc3RyY21wKGxvY2FsQ3JlYXRlSW5mby5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIGRldi0+ZXh0ZW5zaW9ucy5raHJfc3dhcGNoYWluX2VuYWJsZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobG9jYWxDcmVhdGVJbmZvLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19LSFJfRElTUExBWV9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBkZXYtPmV4dGVuc2lvbnMua2hyX2Rpc3BsYXlfc3dhcGNoYWluX2VuYWJsZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobG9jYWxDcmVhdGVJbmZvLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19LSFJfREVWSUNFX0dST1VQX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgZGV2LT5leHRlbnNpb25zLmtocl9kZXZpY2VfZ3JvdXBfZW5hYmxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChsb2NhbENyZWF0ZUluZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0VYVF9ERUJVR19NQVJLRVJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBkZXYtPmV4dGVuc2lvbnMuZXh0X2RlYnVnX21hcmtlcl9lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGxvY2FsQ3JlYXRlSW5mby5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgIlZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUiKSkgeworICAgICAgICAgICAgZGV2LT5leHRlbnNpb25zLmV4dF9mdWxsX3NjcmVlbl9leGNsdXNpdmVfZW5hYmxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZGV2LT5leHRlbnNpb25zLmV4dF9kZWJ1Z191dGlsc19lbmFibGVkID0gaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5leHRfZGVidWdfdXRpbHM7CisKKyAgICBpZiAoIWRldi0+ZXh0ZW5zaW9ucy5raHJfZGV2aWNlX2dyb3VwX2VuYWJsZWQpIHsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgcHJvcGVydGllczsKKyAgICAgICAgaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgJnByb3BlcnRpZXMpOworICAgICAgICBpZiAocHJvcGVydGllcy5hcGlWZXJzaW9uID49IFZLX01BS0VfVkVSU0lPTigxLCAxLCAwKSkgeworICAgICAgICAgICAgZGV2LT5leHRlbnNpb25zLmtocl9kZXZpY2VfZ3JvdXBfZW5hYmxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBmcENyZWF0ZURldmljZShwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgJmxvY2FsQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgJmRldi0+aWNkX2RldmljZSk7CisgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJ0ZXJtaW5hdG9yX0NyZWF0ZURldmljZTogRmFpbGVkIGluIElDRCAlcyB2a0NyZWF0ZURldmljZSIKKyAgICAgICAgICAgICAgICAgICAiY2FsbCIsCisgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgICpwRGV2aWNlID0gZGV2LT5pY2RfZGV2aWNlOworICAgIGxvYWRlcl9hZGRfbG9naWNhbF9kZXZpY2UoaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIGljZF90ZXJtLCBkZXYpOworCisgICAgLy8gSW5pdCBkaXNwYXRjaCBwb2ludGVyIGluIG5ldyBkZXZpY2Ugb2JqZWN0CisgICAgbG9hZGVyX2luaXRfZGlzcGF0Y2goKnBEZXZpY2UsICZkZXYtPmxvYWRlcl9kaXNwYXRjaCk7CisKK291dDoKKyAgICBpZiAoTlVMTCAhPSBpY2RfZXh0cy5saXN0KSB7CisgICAgICAgIGxvYWRlcl9kZXN0cm95X2dlbmVyaWNfbGlzdChpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgKHN0cnVjdCBsb2FkZXJfZ2VuZXJpY19saXN0ICopJmljZF9leHRzKTsKKyAgICB9CisKKyAgICAvLyBSZXN0b3JlIHBOZXh0IHBvaW50ZXIgdG8gb2xkIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvS0hYCisgICAgLy8gaW4gdGhlIGNoYWluIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IGZvciB0aGUgY2FsbGVyLgorICAgIGlmIChjYWxsZXJfZGdjaV9jb250YWluZXIgIT0gTlVMTCkgeworICAgICAgICBjYWxsZXJfZGdjaV9jb250YWluZXItPnBOZXh0ID0gKFZrQmFzZU91dFN0cnVjdHVyZSAqKWNhbGxlcl9kZ2NpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK1ZrUmVzdWx0IHNldHVwTG9hZGVyVHJhbXBQaHlzRGV2cyhWa0luc3RhbmNlIGluc3RhbmNlKSB7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICBWa1BoeXNpY2FsRGV2aWNlICpsb2NhbF9waHlzX2RldnMgPSBOVUxMOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3Q7CisgICAgdWludDMyX3QgdG90YWxfY291bnQgPSAwOworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICoqbmV3X3BoeXNfZGV2cyA9IE5VTEw7CisKKyAgICBpbnN0ID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKE5VTEwgPT0gaW5zdCkgeworICAgICAgICByZXMgPSBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIFF1ZXJ5IGhvdyBtYW55IEdQVXMgdGhlcmUKKyAgICByZXMgPSBpbnN0LT5kaXNwLT5sYXllcl9pbnN0X2Rpc3AuRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmdG90YWxfY291bnQsIE5VTEwpOworICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJzZXR1cExvYWRlclRyYW1wUGh5c0RldnM6ICBGYWlsZWQgZHVyaW5nIGRpc3BhdGNoIGNhbGwgIgorICAgICAgICAgICAgICAgICAgICJvZiBcJ3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzXCcgdG8gbG93ZXIgbGF5ZXJzIG9yICIKKyAgICAgICAgICAgICAgICAgICAibG9hZGVyIHRvIGdldCBjb3VudC4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLy8gUmVhbGx5IHVzZSB3aGF0IHRoZSB0b3RhbCBHUFUgY291bnQgaXMgc2luY2UgT3B0aW11cyBhbmQgb3RoZXIgbGF5ZXJzIG1heSBtZXNzCisgICAgLy8gdGhlIGNvdW50IHVwLgorICAgIHRvdGFsX2NvdW50ID0gaW5zdC0+dG90YWxfZ3B1X2NvdW50OworCisgICAgLy8gQ3JlYXRlIGFuIGFycmF5IGZvciB0aGUgbmV3IHBoeXNpY2FsIGRldmljZXMsIHdoaWNoIHdpbGwgYmUgc3RvcmVkCisgICAgLy8gaW4gdGhlIGluc3RhbmNlIGZvciB0aGUgdHJhbXBvbGluZSBjb2RlLgorICAgIG5ld19waHlzX2RldnMgPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKiopbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoCisgICAgICAgIGluc3QsIHRvdGFsX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICopLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgaWYgKE5VTEwgPT0gbmV3X3BoeXNfZGV2cykgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJzZXR1cExvYWRlclRyYW1wUGh5c0RldnM6ICBGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHBoeXNpY2FsIGRldmljZSIKKyAgICAgICAgICAgICAgICAgICAiIGFycmF5IG9mIHNpemUgJWQiLAorICAgICAgICAgICAgICAgICAgIHRvdGFsX2NvdW50KTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgbWVtc2V0KG5ld19waHlzX2RldnMsIDAsIHRvdGFsX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICopKTsKKworICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBhcnJheSAob24gdGhlIHN0YWNrKSB0byBrZWVwIHRyYWNrIG9mIHRoZQorICAgIC8vIHJldHVybmVkIFZrUGh5c2ljYWxEZXZpY2UgdmFsdWVzLgorICAgIGxvY2FsX3BoeXNfZGV2cyA9IGxvYWRlcl9zdGFja19hbGxvYyhzaXplb2YoVmtQaHlzaWNhbERldmljZSkgKiB0b3RhbF9jb3VudCk7CisgICAgaWYgKE5VTEwgPT0gbG9jYWxfcGh5c19kZXZzKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgInNldHVwTG9hZGVyVHJhbXBQaHlzRGV2czogIEZhaWxlZCB0byBhbGxvY2F0ZSBsb2NhbCAiCisgICAgICAgICAgICAgICAgICAgInBoeXNpY2FsIGRldmljZSBhcnJheSBvZiBzaXplICVkIiwKKyAgICAgICAgICAgICAgICAgICB0b3RhbF9jb3VudCk7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIG1lbXNldChsb2NhbF9waHlzX2RldnMsIDAsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlKSAqIHRvdGFsX2NvdW50KTsKKworICAgIHJlcyA9IGluc3QtPmRpc3AtPmxheWVyX2luc3RfZGlzcC5FbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZ0b3RhbF9jb3VudCwgbG9jYWxfcGh5c19kZXZzKTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAic2V0dXBMb2FkZXJUcmFtcFBoeXNEZXZzOiAgRmFpbGVkIGR1cmluZyBkaXNwYXRjaCBjYWxsICIKKyAgICAgICAgICAgICAgICAgICAib2YgXCd2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlc1wnIHRvIGxvd2VyIGxheWVycyBvciAiCisgICAgICAgICAgICAgICAgICAgImxvYWRlciB0byBnZXQgY29udGVudC4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLy8gQ29weSBvciBjcmVhdGUgZXZlcnl0aGluZyB0byBmaWxsIHRoZSBuZXcgYXJyYXkgb2YgcGh5c2ljYWwgZGV2aWNlcworICAgIGZvciAodWludDMyX3QgbmV3X2lkeCA9IDA7IG5ld19pZHggPCB0b3RhbF9jb3VudDsgbmV3X2lkeCsrKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcGh5c2ljYWwgZGV2aWNlIGlzIGFscmVhZHkgaW4gdGhlIG9sZCBidWZmZXIKKyAgICAgICAgZm9yICh1aW50MzJfdCBvbGRfaWR4ID0gMDsgb2xkX2lkeCA8IGluc3QtPnBoeXNfZGV2X2NvdW50X3RyYW1wOyBvbGRfaWR4KyspIHsKKyAgICAgICAgICAgIGlmIChsb2NhbF9waHlzX2RldnNbbmV3X2lkeF0gPT0gaW5zdC0+cGh5c19kZXZzX3RyYW1wW29sZF9pZHhdLT5waHlzX2RldikgeworICAgICAgICAgICAgICAgIG5ld19waHlzX2RldnNbbmV3X2lkeF0gPSBpbnN0LT5waHlzX2RldnNfdHJhbXBbb2xkX2lkeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIHBoeXNpY2FsIGRldmljZSBpc24ndCBpbiB0aGUgb2xkIGJ1ZmZlciwgY3JlYXRlIGl0CisgICAgICAgIGlmIChOVUxMID09IG5ld19waHlzX2RldnNbbmV3X2lkeF0pIHsKKyAgICAgICAgICAgIG5ld19waHlzX2RldnNbbmV3X2lkeF0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKilsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYygKKyAgICAgICAgICAgICAgICBpbnN0LCBzaXplb2Yoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXApLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgICAgICAgICBpZiAoTlVMTCA9PSBuZXdfcGh5c19kZXZzW25ld19pZHhdKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXR1cExvYWRlclRyYW1wUGh5c0RldnM6ICBGYWlsZWQgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBoeXNpY2FsIGRldmljZSB0cmFtcG9saW5lIG9iamVjdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfaWR4KTsKKyAgICAgICAgICAgICAgICB0b3RhbF9jb3VudCA9IG5ld19pZHg7CisgICAgICAgICAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBuZXcgcGh5c2ljYWxEZXZpY2Ugb2JqZWN0CisgICAgICAgICAgICBsb2FkZXJfc2V0X2Rpc3BhdGNoKCh2b2lkICopbmV3X3BoeXNfZGV2c1tuZXdfaWR4XSwgaW5zdC0+ZGlzcCk7CisgICAgICAgICAgICBuZXdfcGh5c19kZXZzW25ld19pZHhdLT50aGlzX2luc3RhbmNlID0gaW5zdDsKKyAgICAgICAgICAgIG5ld19waHlzX2RldnNbbmV3X2lkeF0tPnBoeXNfZGV2ID0gbG9jYWxfcGh5c19kZXZzW25ld19pZHhdOworICAgICAgICB9CisgICAgfQorCitvdXQ6CisKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gbmV3X3BoeXNfZGV2cykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHRvdGFsX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIG5ld19waHlzX2RldnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBuZXdfcGh5c19kZXZzKTsKKyAgICAgICAgfQorICAgICAgICB0b3RhbF9jb3VudCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRnJlZSBldmVyeXRoaW5nIHRoYXQgZGlkbid0IGNhcnJ5IG92ZXIgdG8gdGhlIG5ldyBhcnJheSBvZgorICAgICAgICAvLyBwaHlzaWNhbCBkZXZpY2VzCisgICAgICAgIGlmIChOVUxMICE9IGluc3QtPnBoeXNfZGV2c190cmFtcCkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluc3QtPnBoeXNfZGV2X2NvdW50X3RyYW1wOyBpKyspIHsKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHRvdGFsX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc3QtPnBoeXNfZGV2c190cmFtcFtpXSA9PSBuZXdfcGh5c19kZXZzW2pdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgaW5zdC0+cGh5c19kZXZzX3RyYW1wW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGluc3QtPnBoeXNfZGV2c190cmFtcCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTd2FwIGluIHRoZSBuZXcgcGh5c2ljYWwgZGV2aWNlIGxpc3QKKyAgICAgICAgaW5zdC0+cGh5c19kZXZfY291bnRfdHJhbXAgPSB0b3RhbF9jb3VudDsKKyAgICAgICAgaW5zdC0+cGh5c19kZXZzX3RyYW1wID0gbmV3X3BoeXNfZGV2czsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitWa1Jlc3VsdCBzZXR1cExvYWRlclRlcm1QaHlzRGV2cyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0KSB7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNfZGV2X3Blcl9pY2QgKmljZF9waHlzX2Rldl9hcnJheSA9IE5VTEw7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKm5ld19waHlzX2RldnMgPSBOVUxMOworCisgICAgaW5zdC0+dG90YWxfZ3B1X2NvdW50ID0gMDsKKworICAgIC8vIEFsbG9jYXRlIHNvbWV0aGluZyB0byBzdG9yZSB0aGUgcGh5c2ljYWwgZGV2aWNlIGNoYXJhY3RlcmlzdGljcworICAgIC8vIHRoYXQgd2UgcmVhZCBmcm9tIGVhY2ggSUNELgorICAgIGljZF9waHlzX2Rldl9hcnJheSA9CisgICAgICAgIChzdHJ1Y3QgbG9hZGVyX3BoeXNfZGV2X3Blcl9pY2QgKilsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2FkZXJfcGh5c19kZXZfcGVyX2ljZCkgKiBpbnN0LT50b3RhbF9pY2RfY291bnQpOworICAgIGlmIChOVUxMID09IGljZF9waHlzX2Rldl9hcnJheSkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJzZXR1cExvYWRlclRlcm1QaHlzRGV2czogIEZhaWxlZCB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgIgorICAgICAgICAgICAgICAgICAgICJJQ0QgUGh5c2ljYWwgZGV2aWNlIGluZm8gYXJyYXkgb2Ygc2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgaW5zdC0+dG90YWxfZ3B1X2NvdW50KTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgbWVtc2V0KGljZF9waHlzX2Rldl9hcnJheSwgMCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfcGh5c19kZXZfcGVyX2ljZCkgKiBpbnN0LT50b3RhbF9pY2RfY291bnQpOworICAgIGljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOworCisgICAgLy8gRm9yIGVhY2ggSUNELCBxdWVyeSB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZXMsIGFuZCB0aGVuIGdldCBhbgorICAgIC8vIGludGVybmFsIHZhbHVlIGZvciB0aG9zZSBwaHlzaWNhbCBkZXZpY2VzLgorICAgIGZvciAodWludDMyX3QgaWNkX2lkeCA9IDA7IE5VTEwgIT0gaWNkX3Rlcm07IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQsIGljZF9pZHgrKykgeworICAgICAgICByZXMgPSBpY2RfdGVybS0+ZGlzcGF0Y2guRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGljZF90ZXJtLT5pbnN0YW5jZSwgJmljZF9waHlzX2Rldl9hcnJheVtpY2RfaWR4XS5jb3VudCwgTlVMTCk7CisgICAgICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInNldHVwTG9hZGVyVGVybVBoeXNEZXZzOiAgQ2FsbCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICJJQ0QgJWQncyBcJ3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzXCcgZmFpbGVkIHdpdGgiCisgICAgICAgICAgICAgICAgICAgICAgICIgZXJyb3IgMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWNkX2lkeCwgcmVzKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgaWNkX3BoeXNfZGV2X2FycmF5W2ljZF9pZHhdLnBoeXNfZGV2cyA9CisgICAgICAgICAgICAoVmtQaHlzaWNhbERldmljZSAqKWxvYWRlcl9zdGFja19hbGxvYyhpY2RfcGh5c19kZXZfYXJyYXlbaWNkX2lkeF0uY291bnQgKiBzaXplb2YoVmtQaHlzaWNhbERldmljZSkpOworICAgICAgICBpZiAoTlVMTCA9PSBpY2RfcGh5c19kZXZfYXJyYXlbaWNkX2lkeF0ucGh5c19kZXZzKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAic2V0dXBMb2FkZXJUZXJtUGh5c0RldnM6ICBGYWlsZWQgdG8gYWxsb2NhdGUgdGVtcG9yYXJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIklDRCBQaHlzaWNhbCBkZXZpY2UgYXJyYXkgZm9yIElDRCAlZCBvZiBzaXplICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWNkX2lkeCwgaW5zdC0+dG90YWxfZ3B1X2NvdW50KTsKKyAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpY2RfdGVybS0+aW5zdGFuY2UsICYoaWNkX3BoeXNfZGV2X2FycmF5W2ljZF9pZHhdLmNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2RfcGh5c19kZXZfYXJyYXlbaWNkX2lkeF0ucGh5c19kZXZzKTsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBpbnN0LT50b3RhbF9ncHVfY291bnQgKz0gaWNkX3BoeXNfZGV2X2FycmF5W2ljZF9pZHhdLmNvdW50OworICAgICAgICBpY2RfcGh5c19kZXZfYXJyYXlbaWNkX2lkeF0udGhpc19pY2RfdGVybSA9IGljZF90ZXJtOworICAgIH0KKworICAgIGlmICgwID09IGluc3QtPnRvdGFsX2dwdV9jb3VudCkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJzZXR1cExvYWRlclRlcm1QaHlzRGV2czogIEZhaWxlZCB0byBkZXRlY3QgYW55IHZhbGlkIgorICAgICAgICAgICAgICAgICAgICIgR1BVcyBpbiB0aGUgY3VycmVudCBjb25maWciKTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBuZXdfcGh5c19kZXZzID0gbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKikgKiBpbnN0LT50b3RhbF9ncHVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICBpZiAoTlVMTCA9PSBuZXdfcGh5c19kZXZzKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgInNldHVwTG9hZGVyVGVybVBoeXNEZXZzOiAgRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBwaHlzaWNhbCIKKyAgICAgICAgICAgICAgICAgICAiIGRldmljZSBhcnJheSBvZiBzaXplICVkIiwKKyAgICAgICAgICAgICAgICAgICBpbnN0LT50b3RhbF9ncHVfY291bnQpOworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBtZW1zZXQobmV3X3BoeXNfZGV2cywgMCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKikgKiBpbnN0LT50b3RhbF9ncHVfY291bnQpOworCisgICAgLy8gQ29weSBvciBjcmVhdGUgZXZlcnl0aGluZyB0byBmaWxsIHRoZSBuZXcgYXJyYXkgb2YgcGh5c2ljYWwgZGV2aWNlcworICAgIHVpbnQzMl90IGlkeCA9IDA7CisgICAgZm9yICh1aW50MzJfdCBpY2RfaWR4ID0gMDsgaWNkX2lkeCA8IGluc3QtPnRvdGFsX2ljZF9jb3VudDsgaWNkX2lkeCsrKSB7CisgICAgICAgIGZvciAodWludDMyX3QgcGRfaWR4ID0gMDsgcGRfaWR4IDwgaWNkX3BoeXNfZGV2X2FycmF5W2ljZF9pZHhdLmNvdW50OyBwZF9pZHgrKykgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBwaHlzaWNhbCBkZXZpY2UgaXMgYWxyZWFkeSBpbiB0aGUgb2xkIGJ1ZmZlcgorICAgICAgICAgICAgaWYgKE5VTEwgIT0gaW5zdC0+cGh5c19kZXZzX3Rlcm0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IG9sZF9pZHggPSAwOyBvbGRfaWR4IDwgaW5zdC0+cGh5c19kZXZfY291bnRfdGVybTsgb2xkX2lkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpY2RfcGh5c19kZXZfYXJyYXlbaWNkX2lkeF0ucGh5c19kZXZzW3BkX2lkeF0gPT0gaW5zdC0+cGh5c19kZXZzX3Rlcm1bb2xkX2lkeF0tPnBoeXNfZGV2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcGh5c19kZXZzW2lkeF0gPSBpbnN0LT5waHlzX2RldnNfdGVybVtvbGRfaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgdGhpcyBwaHlzaWNhbCBkZXZpY2UgaXNuJ3QgaW4gdGhlIG9sZCBidWZmZXIsIHRoZW4gd2UKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gY3JlYXRlIGl0LgorICAgICAgICAgICAgaWYgKE5VTEwgPT0gbmV3X3BoeXNfZGV2c1tpZHhdKSB7CisgICAgICAgICAgICAgICAgbmV3X3BoeXNfZGV2c1tpZHhdID0gbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdCwgc2l6ZW9mKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBuZXdfcGh5c19kZXZzW2lkeF0pIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0dXBMb2FkZXJUZXJtUGh5c0RldnM6ICBGYWlsZWQgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaHlzaWNhbCBkZXZpY2UgdGVybWluYXRvciBvYmplY3QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCk7CisgICAgICAgICAgICAgICAgICAgIGluc3QtPnRvdGFsX2dwdV9jb3VudCA9IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsb2FkZXJfc2V0X2Rpc3BhdGNoKCh2b2lkICopbmV3X3BoeXNfZGV2c1tpZHhdLCBpbnN0LT5kaXNwKTsKKyAgICAgICAgICAgICAgICBuZXdfcGh5c19kZXZzW2lkeF0tPnRoaXNfaWNkX3Rlcm0gPSBpY2RfcGh5c19kZXZfYXJyYXlbaWNkX2lkeF0udGhpc19pY2RfdGVybTsKKyAgICAgICAgICAgICAgICBuZXdfcGh5c19kZXZzW2lkeF0tPmljZF9pbmRleCA9ICh1aW50OF90KShpY2RfaWR4KTsKKyAgICAgICAgICAgICAgICBuZXdfcGh5c19kZXZzW2lkeF0tPnBoeXNfZGV2ID0gaWNkX3BoeXNfZGV2X2FycmF5W2ljZF9pZHhdLnBoeXNfZGV2c1twZF9pZHhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICB9CisKK291dDoKKworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICBpZiAoTlVMTCAhPSBuZXdfcGh5c19kZXZzKSB7CisgICAgICAgICAgICAvLyBXZSd2ZSBlbmNvdW50ZXJlZCBhbiBlcnJvciwgc28gd2Ugc2hvdWxkIGZyZWUgdGhlIG5ldyBidWZmZXJzLgorICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluc3QtPnRvdGFsX2dwdV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBuZXdfcGh5c19kZXZzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgbmV3X3BoeXNfZGV2cyk7CisgICAgICAgIH0KKyAgICAgICAgaW5zdC0+dG90YWxfZ3B1X2NvdW50ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGcmVlIGV2ZXJ5dGhpbmcgdGhhdCBkaWRuJ3QgY2Fycnkgb3ZlciB0byB0aGUgbmV3IGFycmF5IG9mCisgICAgICAgIC8vIHBoeXNpY2FsIGRldmljZXMuICBFdmVyeXRoaW5nIGVsc2Ugd2lsbCBoYXZlIGJlZW4gY29waWVkIG92ZXIKKyAgICAgICAgLy8gdG8gdGhlIG5ldyBhcnJheS4KKyAgICAgICAgaWYgKE5VTEwgIT0gaW5zdC0+cGh5c19kZXZzX3Rlcm0pIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgY3VyX3BkID0gMDsgY3VyX3BkIDwgaW5zdC0+cGh5c19kZXZfY291bnRfdGVybTsgY3VyX3BkKyspIHsKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBuZXdfcGRfaWR4ID0gMDsgbmV3X3BkX2lkeCA8IGluc3QtPnRvdGFsX2dwdV9jb3VudDsgbmV3X3BkX2lkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0LT5waHlzX2RldnNfdGVybVtjdXJfcGRdID09IG5ld19waHlzX2RldnNbbmV3X3BkX2lkeF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBpbnN0LT5waHlzX2RldnNfdGVybVtjdXJfcGRdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGluc3QtPnBoeXNfZGV2c190ZXJtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN3YXAgb3V0IG9sZCBhbmQgbmV3IGRldmljZXMgbGlzdAorICAgICAgICBpbnN0LT5waHlzX2Rldl9jb3VudF90ZXJtID0gaW5zdC0+dG90YWxfZ3B1X2NvdW50OworICAgICAgICBpbnN0LT5waHlzX2RldnNfdGVybSA9IG5ld19waHlzX2RldnM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKFZrSW5zdGFuY2UgaW5zdGFuY2UsIHVpbnQzMl90ICpwUGh5c2ljYWxEZXZpY2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlICpwUGh5c2ljYWxEZXZpY2VzKSB7CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopaW5zdGFuY2U7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKworICAgIC8vIEFsd2F5cyBjYWxsIHRoZSBzZXR1cCBsb2FkZXIgdGVybWluYXRvciBwaHlzaWNhbCBkZXZpY2VzIGJlY2F1c2UgdGhleSBtYXkKKyAgICAvLyBoYXZlIGNoYW5nZWQgYXQgYW55IHBvaW50LgorICAgIHJlcyA9IHNldHVwTG9hZGVyVGVybVBoeXNEZXZzKGluc3QpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3B5X2NvdW50ID0gaW5zdC0+dG90YWxfZ3B1X2NvdW50OworICAgIGlmIChOVUxMICE9IHBQaHlzaWNhbERldmljZXMpIHsKKyAgICAgICAgaWYgKGNvcHlfY291bnQgPiAqcFBoeXNpY2FsRGV2aWNlQ291bnQpIHsKKyAgICAgICAgICAgIGNvcHlfY291bnQgPSAqcFBoeXNpY2FsRGV2aWNlQ291bnQ7CisgICAgICAgICAgICByZXMgPSBWS19JTkNPTVBMRVRFOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvcHlfY291bnQ7IGkrKykgeworICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlc1tpXSA9IChWa1BoeXNpY2FsRGV2aWNlKWluc3QtPnBoeXNfZGV2c190ZXJtW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgKnBQaHlzaWNhbERldmljZUNvdW50ID0gY29weV9jb3VudDsKKworb3V0OgorCisgICAgcmV0dXJuIHJlczsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBpZiAoTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKSB7CisgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBpZiAoTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHsKKyAgICAgICAgaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIGlmIChOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMpIHsKKyAgICAgICAgaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcFByb3BlcnRpZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpwRmVhdHVyZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgaWYgKE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMpIHsKKyAgICAgICAgaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBGZWF0dXJlcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdFByb3BlcnRpZXMgKnBGb3JtYXRJbmZvKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIGlmIChOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMpIHsKKyAgICAgICAgaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgZm9ybWF0LCBwRm9ybWF0SW5mbyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlVHlwZSB0eXBlLCBWa0ltYWdlVGlsaW5nIHRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyAqcEltYWdlRm9ybWF0UHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIkVuY291bnRlcmVkIHRoZSB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyAiCisgICAgICAgICAgICAgICAgICAgInRlcm1pbmF0b3IuICBUaGlzIG1lYW5zIGEgbGF5ZXIgaW1wcm9wZXJseSBjb250aW51ZWQuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIGZvcm1hdCwgdHlwZSwgdGlsaW5nLCB1c2FnZSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VUeXBlIHR5cGUsIFZrU2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZSwgVmtJbWFnZVRpbGluZyB0aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTnVtUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIGlmIChOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcykgeworICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIGZvcm1hdCwgdHlwZSwgc2FtcGxlcywgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsIHBOdW1Qcm9wZXJ0aWVzLCBwUHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9FbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm07CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgaW1wbGljaXRfbGF5ZXJfbGlzdCA9IHswfTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2V4dGVuc2lvbl9saXN0IGFsbF9leHRzID0gezB9OworICAgIHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgaWNkX2V4dHMgPSB7MH07CisKKyAgICAvLyBBbnkgbGF5ZXIgb3IgdHJhbXBvbGluZSB3cmFwcGluZyBzaG91bGQgYmUgcmVtb3ZlZCBhdCB0aGlzIHBvaW50IGluIHRpbWUgY2FuIGp1c3QgY2FzdCB0byB0aGUgZXhwZWN0ZWQKKyAgICAvLyB0eXBlIGZvciBWa1BoeXNpY2FsRGV2aWNlLgorICAgIHBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworCisgICAgLy8gaWYgd2UgZ290IGhlcmUgd2l0aCBhIG5vbi1lbXB0eSBwTGF5ZXJOYW1lLCBsb29rIHVwIHRoZSBleHRlbnNpb25zCisgICAgLy8gZnJvbSB0aGUganNvbgorICAgIGlmIChwTGF5ZXJOYW1lICE9IE5VTEwgJiYgc3RybGVuKHBMYXllck5hbWUpID4gMCkgeworICAgICAgICB1aW50MzJfdCBjb3VudDsKKyAgICAgICAgdWludDMyX3QgY29weV9zaXplOworICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybS0+dGhpc19pbnN0YW5jZTsKKyAgICAgICAgc3RydWN0IGxvYWRlcl9kZXZpY2VfZXh0ZW5zaW9uX2xpc3QgKmRldl9leHRfbGlzdCA9IE5VTEw7CisgICAgICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlX2V4dGVuc2lvbl9saXN0IGxvY2FsX2V4dF9saXN0OworICAgICAgICBtZW1zZXQoJmxvY2FsX2V4dF9saXN0LCAwLCBzaXplb2YobG9jYWxfZXh0X2xpc3QpKTsKKyAgICAgICAgaWYgKHZrX3N0cmluZ192YWxpZGF0ZShNYXhMb2FkZXJTdHJpbmdMZW5ndGgsIHBMYXllck5hbWUpID09IFZLX1NUUklOR19FUlJPUl9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5zdC0+aW5zdGFuY2VfbGF5ZXJfbGlzdC5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wcyA9ICZpbnN0LT5pbnN0YW5jZV9sYXllcl9saXN0Lmxpc3RbaV07CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwcm9wcy0+aW5mby5sYXllck5hbWUsIHBMYXllck5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2X2V4dF9saXN0ID0gJnByb3BzLT5kZXZpY2VfZXh0ZW5zaW9uX2xpc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb3VudCA9IChkZXZfZXh0X2xpc3QgPT0gTlVMTCkgPyAwIDogZGV2X2V4dF9saXN0LT5jb3VudDsKKyAgICAgICAgICAgIGlmIChwUHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnBQcm9wZXJ0eUNvdW50ID0gY291bnQ7CisgICAgICAgICAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfZ2VuZXJpY19saXN0KGluc3QsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKSZsb2NhbF9leHRfbGlzdCk7CisgICAgICAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29weV9zaXplID0gKnBQcm9wZXJ0eUNvdW50IDwgY291bnQgPyAqcFByb3BlcnR5Q291bnQgOiBjb3VudDsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3B5X3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgIG1lbWNweSgmcFByb3BlcnRpZXNbaV0sICZkZXZfZXh0X2xpc3QtPmxpc3RbaV0ucHJvcHMsIHNpemVvZihWa0V4dGVuc2lvblByb3BlcnRpZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwUHJvcGVydHlDb3VudCA9IGNvcHlfc2l6ZTsKKworICAgICAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfZ2VuZXJpY19saXN0KGluc3QsIChzdHJ1Y3QgbG9hZGVyX2dlbmVyaWNfbGlzdCAqKSZsb2NhbF9leHRfbGlzdCk7CisgICAgICAgICAgICBpZiAoY29weV9zaXplIDwgY291bnQpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworICAgICAgICAgICAgICAgIHJldHVybiBWS19JTkNPTVBMRVRFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllczogIHBMYXllck5hbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAiaXMgdG9vIGxvbmcgb3IgaXMgYmFkbHkgZm9ybWVkIik7CisgICAgICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIC8vIFRoaXMgY2FzZSBpcyBkdXJpbmcgdGhlIGNhbGwgZG93biB0aGUgaW5zdGFuY2UgY2hhaW4gd2l0aCBwTGF5ZXJOYW1lID09IE5VTEwKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgdWludDMyX3QgaWNkX2V4dF9jb3VudCA9ICpwUHJvcGVydHlDb3VudDsKKyAgICBWa1Jlc3VsdCByZXM7CisKKyAgICAvLyBHZXQgdGhlIGF2YWlsYWJsZSBkZXZpY2UgZXh0ZW5zaW9ucworICAgIHJlcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5FbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBOVUxMLCAmaWNkX2V4dF9jb3VudCwgcFByb3BlcnRpZXMpOworICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoIWxvYWRlckluaXRMYXllckxpc3QoaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsICZpbXBsaWNpdF9sYXllcl9saXN0KSkgeworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGxvYWRlckFkZEltcGxpY2l0TGF5ZXJzKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCAmaW1wbGljaXRfbGF5ZXJfbGlzdCwgTlVMTCwgJmljZF90ZXJtLT50aGlzX2luc3RhbmNlLT5pbnN0YW5jZV9sYXllcl9saXN0KTsKKyAgICAvLyBXZSBuZWVkIHRvIGRldGVybWluZSB3aGljaCBpbXBsaWNpdCBsYXllcnMgYXJlIGFjdGl2ZSwgYW5kIHRoZW4gYWRkIHRoZWlyIGV4dGVuc2lvbnMuIFRoaXMgY2FuJ3QgYmUgY2FjaGVkIGFzCisgICAgLy8gaXQgZGVwZW5kcyBvbiByZXN1bHRzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyAod2hpY2ggY2FuIGNoYW5nZSkuCisgICAgaWYgKHBQcm9wZXJ0aWVzICE9IE5VTEwpIHsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBkZXZfZXh0ZW5zaW9uIGxpc3Qgd2l0aGluIHRoZSBwaHlzaWNhbERldmljZSBvYmplY3QKKyAgICAgICAgcmVzID0gbG9hZGVyX2luaXRfZGV2aWNlX2V4dGVuc2lvbnMoaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIHBoeXNfZGV2X3Rlcm0sIGljZF9leHRfY291bnQsIHBQcm9wZXJ0aWVzLCAmaWNkX2V4dHMpOworICAgICAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBkZXRlcm1pbmUgd2hpY2ggaW1wbGljaXQgbGF5ZXJzIGFyZSBhY3RpdmUsIGFuZCB0aGVuIGFkZCB0aGVpciBleHRlbnNpb25zLiBUaGlzIGNhbid0IGJlIGNhY2hlZCBhcworICAgICAgICAvLyBpdCBkZXBlbmRzIG9uIHJlc3VsdHMgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzICh3aGljaCBjYW4gY2hhbmdlKS4KKyAgICAgICAgcmVzID0gbG9hZGVyX2FkZF90b19leHRfbGlzdChpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgJmFsbF9leHRzLCBpY2RfZXh0cy5jb3VudCwgaWNkX2V4dHMubGlzdCk7CisgICAgICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICBsb2FkZXJBZGRJbXBsaWNpdExheWVycyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgJmltcGxpY2l0X2xheWVyX2xpc3QsIE5VTEwsICZpY2RfdGVybS0+dGhpc19pbnN0YW5jZS0+aW5zdGFuY2VfbGF5ZXJfbGlzdCk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltcGxpY2l0X2xheWVyX2xpc3QuY291bnQ7IGkrKykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGltcGxpY2l0X2xheWVyX2xpc3QubGlzdFtpXS5kZXZpY2VfZXh0ZW5zaW9uX2xpc3QuY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIHJlcyA9IGxvYWRlcl9hZGRfdG9fZXh0X2xpc3QoaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsICZhbGxfZXh0cywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbXBsaWNpdF9sYXllcl9saXN0Lmxpc3RbaV0uZGV2aWNlX2V4dGVuc2lvbl9saXN0Lmxpc3Rbal0ucHJvcHMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgPSAqcFByb3BlcnR5Q291bnQ7CisgICAgICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcHJvcHMgPSBwUHJvcGVydGllczsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYWxsX2V4dHMuY291bnQgJiYgaSA8IGNhcGFjaXR5OyBpKyspIHsKKyAgICAgICAgICAgIHByb3BzW2ldID0gYWxsX2V4dHMubGlzdFtpXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdhc24ndCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBleHRlbnNpb25zLCB3ZSBkaWQgcGFydGlhbCBjb3B5IG5vdyByZXR1cm4gVktfSU5DT01QTEVURQorICAgICAgICBpZiAoY2FwYWNpdHkgPCBhbGxfZXh0cy5jb3VudCkgeworICAgICAgICAgICAgcmVzID0gVktfSU5DT01QTEVURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwUHJvcGVydHlDb3VudCA9IGFsbF9leHRzLmNvdW50OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIGNvdW50OyBuZWVkIHRvIGFkZCBpbiB0aGUgY291bnQgb2YgaW1wbGljaXQgbGF5ZXIgZXh0ZW5zaW9ucworICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBkdXBsaWNhdGVzIGJlaW5nIGFkZGVkIGluIHRoZSBjb3VudAorICAgICAgICAqcFByb3BlcnR5Q291bnQgPSBpY2RfZXh0X2NvdW50OworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbXBsaWNpdF9sYXllcl9saXN0LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpwUHJvcGVydHlDb3VudCArPSBpbXBsaWNpdF9sYXllcl9saXN0Lmxpc3RbaV0uZGV2aWNlX2V4dGVuc2lvbl9saXN0LmNvdW50OworICAgICAgICB9CisgICAgICAgIHJlcyA9IFZLX1NVQ0NFU1M7CisgICAgfQorCitvdXQ6CisKKyAgICBpZiAoTlVMTCAhPSBpbXBsaWNpdF9sYXllcl9saXN0Lmxpc3QpIHsKKyAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfZ2VuZXJpY19saXN0KGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKikmaW1wbGljaXRfbGF5ZXJfbGlzdCk7CisgICAgfQorICAgIGlmIChOVUxMICE9IGFsbF9leHRzLmxpc3QpIHsKKyAgICAgICAgbG9hZGVyX2Rlc3Ryb3lfZ2VuZXJpY19saXN0KGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKikmYWxsX2V4dHMpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBpY2RfZXh0cy5saXN0KSB7CisgICAgICAgIGxvYWRlcl9kZXN0cm95X2dlbmVyaWNfbGlzdChpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgKHN0cnVjdCBsb2FkZXJfZ2VuZXJpY19saXN0ICopJmljZF9leHRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9FbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICJFbmNvdW50ZXJlZCB0aGUgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMgIgorICAgICAgICAgICAgICAgInRlcm1pbmF0b3IuICBUaGlzIG1lYW5zIGEgbGF5ZXIgaW1wcm9wZXJseSBjb250aW51ZWQuIik7CisgICAgLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlIHRoaXMgY2FsbCBpc24ndCBkaXNwYXRjaGVkIGRvd24gdGhlIGNoYWluCisgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKK30KKworVmtTdHJpbmdFcnJvckZsYWdzIHZrX3N0cmluZ192YWxpZGF0ZShjb25zdCBpbnQgbWF4X2xlbmd0aCwgY29uc3QgY2hhciAqdXRmOCkgeworICAgIFZrU3RyaW5nRXJyb3JGbGFncyByZXN1bHQgPSBWS19TVFJJTkdfRVJST1JfTk9ORTsKKyAgICBpbnQgbnVtX2NoYXJfYnl0ZXMgPSAwOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8PSBtYXhfbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKHV0ZjhbaV0gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSBtYXhfbGVuZ3RoKSB7CisgICAgICAgICAgICByZXN1bHQgfD0gVktfU1RSSU5HX0VSUk9SX0xFTkdUSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKCh1dGY4W2ldID49IDB4MjApICYmICh1dGY4W2ldIDwgMHg3ZikpIHsKKyAgICAgICAgICAgIG51bV9jaGFyX2J5dGVzID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICgodXRmOFtpXSAmIFVURjhfT05FX0JZVEVfTUFTSykgPT0gVVRGOF9PTkVfQllURV9DT0RFKSB7CisgICAgICAgICAgICBudW1fY2hhcl9ieXRlcyA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoKHV0ZjhbaV0gJiBVVEY4X1RXT19CWVRFX01BU0spID09IFVURjhfVFdPX0JZVEVfQ09ERSkgeworICAgICAgICAgICAgbnVtX2NoYXJfYnl0ZXMgPSAyOworICAgICAgICB9IGVsc2UgaWYgKCh1dGY4W2ldICYgVVRGOF9USFJFRV9CWVRFX01BU0spID09IFVURjhfVEhSRUVfQllURV9DT0RFKSB7CisgICAgICAgICAgICBudW1fY2hhcl9ieXRlcyA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBWS19TVFJJTkdfRVJST1JfQkFEX0RBVEE7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZm9sbG93aW5nIG51bV9jaGFyX2J5dGVzIG9mIGRhdGEKKyAgICAgICAgZm9yIChqID0gMDsgKGogPCBudW1fY2hhcl9ieXRlcykgJiYgKGkgPCBtYXhfbGVuZ3RoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoKytpID09IG1heF9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gVktfU1RSSU5HX0VSUk9SX0xFTkdUSDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgodXRmOFtpXSAmIFVURjhfREFUQV9CWVRFX01BU0spICE9IFVURjhfREFUQV9CWVRFX0NPREUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gVktfU1RSSU5HX0VSUk9SX0JBRF9EQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAordGVybWluYXRvcl9FbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24oY29uc3QgVmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb25DaGFpbiAqY2hhaW4sIHVpbnQzMl90KiBwQXBpVmVyc2lvbikgeworICAgIC8vIE5PVEU6IFRoZSBWdWxrYW4gV0cgZG9lc24ndCB3YW50IHVzIGNoZWNraW5nIHBBcGlWZXJzaW9uIGZvciBOVUxMLCBidXQgaW5zdGVhZAorICAgIC8vIHByZWZlcnMgdXMgY3Jhc2hpbmcuCisgICAgKnBBcGlWZXJzaW9uID0gVktfTUFLRV9WRVJTSU9OKGxvYWRlcl9tYWpvcl92ZXJzaW9uLCBsb2FkZXJfbWlub3JfdmVyc2lvbiwgVktfSEVBREVSX1ZFUlNJT04pOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3Rlcm1pbmF0b3JfRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGNvbnN0IFZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzQ2hhaW4gKmNoYWluLCBjb25zdCBjaGFyICpwTGF5ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqZ2xvYmFsX2V4dF9saXN0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgaW5zdGFuY2VfbGF5ZXJzOworICAgIHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgbG9jYWxfZXh0X2xpc3Q7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdHJhbXBfbGlzdCBpY2RfdHJhbXBfbGlzdDsKKyAgICB1aW50MzJfdCBjb3B5X3NpemU7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKworICAgIC8vIHRsc19pbnN0YW5jZSA9IE5VTEw7CisgICAgbWVtc2V0KCZsb2NhbF9leHRfbGlzdCwgMCwgc2l6ZW9mKGxvY2FsX2V4dF9saXN0KSk7CisgICAgbWVtc2V0KCZpbnN0YW5jZV9sYXllcnMsIDAsIHNpemVvZihpbnN0YW5jZV9sYXllcnMpKTsKKworICAgIC8vIEdldCBsYXllciBsaWJyYXJpZXMgaWYgbmVlZGVkCisgICAgaWYgKHBMYXllck5hbWUgJiYgc3RybGVuKHBMYXllck5hbWUpICE9IDApIHsKKyAgICAgICAgaWYgKHZrX3N0cmluZ192YWxpZGF0ZShNYXhMb2FkZXJTdHJpbmdMZW5ndGgsIHBMYXllck5hbWUpICE9IFZLX1NUUklOR19FUlJPUl9OT05FKSB7CisgICAgICAgICAgICBhc3NlcnQoVktfRkFMU0UgJiYKKyAgICAgICAgICAgICAgICAgICAidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXM6ICAiCisgICAgICAgICAgICAgICAgICAgInBMYXllck5hbWUgaXMgdG9vIGxvbmcgb3IgaXMgYmFkbHkgZm9ybWVkIik7CisgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQ7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWRlclNjYW5Gb3JMYXllcnMoTlVMTCwgJmluc3RhbmNlX2xheWVycyk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnN0YW5jZV9sYXllcnMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wcyA9ICZpbnN0YW5jZV9sYXllcnMubGlzdFtpXTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAocHJvcHMtPmluZm8ubGF5ZXJOYW1lLCBwTGF5ZXJOYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ2xvYmFsX2V4dF9saXN0ID0gJnByb3BzLT5pbnN0YW5jZV9leHRlbnNpb25fbGlzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNjYW4vZGlzY292ZXIgYWxsIElDRCBsaWJyYXJpZXMKKyAgICAgICAgbWVtc2V0KCZpY2RfdHJhbXBfbGlzdCwgMCwgc2l6ZW9mKGljZF90cmFtcF9saXN0KSk7CisgICAgICAgIHJlcyA9IGxvYWRlcl9pY2Rfc2NhbihOVUxMLCAmaWNkX3RyYW1wX2xpc3QpOworICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIC8vIEdldCBleHRlbnNpb25zIGZyb20gYWxsIElDRCdzLCBtZXJnZSBzbyBubyBkdXBsaWNhdGVzCisgICAgICAgIHJlcyA9IGxvYWRlcl9nZXRfaWNkX2xvYWRlcl9pbnN0YW5jZV9leHRlbnNpb25zKE5VTEwsICZpY2RfdHJhbXBfbGlzdCwgJmxvY2FsX2V4dF9saXN0KTsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBsb2FkZXJfc2Nhbm5lZF9pY2RfY2xlYXIoTlVMTCwgJmljZF90cmFtcF9saXN0KTsKKworICAgICAgICAvLyBBcHBlbmQgZW5hYmxlZCBpbXBsaWNpdCBsYXllcnMuCisgICAgICAgIGxvYWRlclNjYW5Gb3JJbXBsaWNpdExheWVycyhOVUxMLCAmaW5zdGFuY2VfbGF5ZXJzKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluc3RhbmNlX2xheWVycy5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWxvYWRlckltcGxpY2l0TGF5ZXJJc0VuYWJsZWQoTlVMTCwgJmluc3RhbmNlX2xheWVycy5saXN0W2ldKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqZXh0X2xpc3QgPSAmaW5zdGFuY2VfbGF5ZXJzLmxpc3RbaV0uaW5zdGFuY2VfZXh0ZW5zaW9uX2xpc3Q7CisgICAgICAgICAgICBsb2FkZXJfYWRkX3RvX2V4dF9saXN0KE5VTEwsICZsb2NhbF9leHRfbGlzdCwgZXh0X2xpc3QtPmNvdW50LCBleHRfbGlzdC0+bGlzdCk7CisgICAgICAgIH0KKworICAgICAgICBnbG9iYWxfZXh0X2xpc3QgPSAmbG9jYWxfZXh0X2xpc3Q7CisgICAgfQorCisgICAgaWYgKGdsb2JhbF9leHRfbGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAocFByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICAqcFByb3BlcnR5Q291bnQgPSBnbG9iYWxfZXh0X2xpc3QtPmNvdW50OworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBjb3B5X3NpemUgPSAqcFByb3BlcnR5Q291bnQgPCBnbG9iYWxfZXh0X2xpc3QtPmNvdW50ID8gKnBQcm9wZXJ0eUNvdW50IDogZ2xvYmFsX2V4dF9saXN0LT5jb3VudDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29weV9zaXplOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KCZwUHJvcGVydGllc1tpXSwgJmdsb2JhbF9leHRfbGlzdC0+bGlzdFtpXSwgc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykpOworICAgIH0KKyAgICAqcFByb3BlcnR5Q291bnQgPSBjb3B5X3NpemU7CisKKyAgICBpZiAoY29weV9zaXplIDwgZ2xvYmFsX2V4dF9saXN0LT5jb3VudCkgeworICAgICAgICByZXMgPSBWS19JTkNPTVBMRVRFOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKK291dDoKKworICAgIGxvYWRlcl9kZXN0cm95X2dlbmVyaWNfbGlzdChOVUxMLCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKikmbG9jYWxfZXh0X2xpc3QpOworICAgIGxvYWRlckRlbGV0ZUxheWVyTGlzdEFuZFByb3BlcnRpZXMoTlVMTCwgJmluc3RhbmNlX2xheWVycyk7CisgICAgcmV0dXJuIHJlczsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoY29uc3QgVmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllc0NoYWluICpjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIFZrUmVzdWx0IHJlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0IGluc3RhbmNlX2xheWVyX2xpc3Q7CisgICAgdGxzX2luc3RhbmNlID0gTlVMTDsKKworICAgIExPQURFUl9QTEFURk9STV9USFJFQURfT05DRSgmb25jZV9pbml0LCBsb2FkZXJfaW5pdGlhbGl6ZSk7CisKKyAgICB1aW50MzJfdCBjb3B5X3NpemU7CisKKyAgICAvLyBHZXQgbGF5ZXIgbGlicmFyaWVzCisgICAgbWVtc2V0KCZpbnN0YW5jZV9sYXllcl9saXN0LCAwLCBzaXplb2YoaW5zdGFuY2VfbGF5ZXJfbGlzdCkpOworICAgIGxvYWRlclNjYW5Gb3JMYXllcnMoTlVMTCwgJmluc3RhbmNlX2xheWVyX2xpc3QpOworCisgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgKnBQcm9wZXJ0eUNvdW50ID0gaW5zdGFuY2VfbGF5ZXJfbGlzdC5jb3VudDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgY29weV9zaXplID0gKCpwUHJvcGVydHlDb3VudCA8IGluc3RhbmNlX2xheWVyX2xpc3QuY291bnQpID8gKnBQcm9wZXJ0eUNvdW50IDogaW5zdGFuY2VfbGF5ZXJfbGlzdC5jb3VudDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29weV9zaXplOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KCZwUHJvcGVydGllc1tpXSwgJmluc3RhbmNlX2xheWVyX2xpc3QubGlzdFtpXS5pbmZvLCBzaXplb2YoVmtMYXllclByb3BlcnRpZXMpKTsKKyAgICB9CisKKyAgICAqcFByb3BlcnR5Q291bnQgPSBjb3B5X3NpemU7CisKKyAgICBpZiAoY29weV9zaXplIDwgaW5zdGFuY2VfbGF5ZXJfbGlzdC5jb3VudCkgeworICAgICAgICByZXN1bHQgPSBWS19JTkNPTVBMRVRFOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKK291dDoKKworICAgIGxvYWRlckRlbGV0ZUxheWVyTGlzdEFuZFByb3BlcnRpZXMoTlVMTCwgJmluc3RhbmNlX2xheWVyX2xpc3QpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChMT0FERVJfRFlOQU1JQ19MSUIpCitCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBoaW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpIHsKKyAgICBzd2l0Y2ggKHJlYXNvbikgeworICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKyAgICAgICAgICAgIGxvYWRlcl9pbml0aWFsaXplKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisgICAgICAgICAgICBpZiAoTlVMTCA9PSByZXNlcnZlZCkgeworICAgICAgICAgICAgICAgIGxvYWRlcl9yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbGlmICFkZWZpbmVkKF9XSU4zMikKK19fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBsb2FkZXJfaW5pdF9saWJyYXJ5KCkgeyBsb2FkZXJfaW5pdGlhbGl6ZSgpOyB9CisKK19fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSB2b2lkIGxvYWRlcl9mcmVlX2xpYnJhcnkoKSB7IGxvYWRlcl9yZWxlYXNlKCk7IH0KKyNlbmRpZgorCisvLyAtLS0tIFZ1bGthbiBDb3JlIDEuMSB0ZXJtaW5hdG9ycworCitWa1Jlc3VsdCBzZXR1cExvYWRlclRlcm1QaHlzRGV2R3JvdXBzKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QpIHsKKyAgICBWa1Jlc3VsdCByZXMgPSBWS19TVUNDRVNTOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtOworICAgIHVpbnQzMl90IHRvdGFsX2NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBjdXJfaWNkX2dyb3VwX2NvdW50ID0gMDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSICoqbmV3X3BoeXNfZGV2X2dyb3VwcyA9IE5VTEw7CisgICAgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUiAqbG9jYWxfcGh5c19kZXZfZ3JvdXBzID0gTlVMTDsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyBmcEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzID0gTlVMTDsKKworICAgIGlmICgwID09IGluc3QtPnBoeXNfZGV2X2NvdW50X3Rlcm0pIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJzZXR1cExvYWRlclRlcm1QaHlzRGV2R3JvdXBzOiAgTG9hZGVyIGZhaWxlZCB0byBzZXR1cCBwaHlzaWNhbCAiCisgICAgICAgICAgICAiZGV2aWNlIHRlcm1pbmF0b3IgaW5mbyBiZWZvcmUgY2FsbGluZyBcJ0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzXCcuIik7CisgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLy8gRm9yIGVhY2ggSUNELCBxdWVyeSB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZSBncm91cHMsIGFuZCB0aGVuIGdldCBhbgorICAgIC8vIGludGVybmFsIHZhbHVlIGZvciB0aG9zZSBwaHlzaWNhbCBkZXZpY2VzLgorICAgIGljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOworICAgIGZvciAodWludDMyX3QgaWNkX2lkeCA9IDA7IE5VTEwgIT0gaWNkX3Rlcm07IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQsIGljZF9pZHgrKykgeworICAgICAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdXNlIHRvIGNhbGwgaW50byB0aGUgSUNELiBUaGlzIGNvdWxkIGJlIHRoZSBjb3JlIG9yIEtIUiB2ZXJzaW9uCisgICAgICAgIGlmIChpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2RldmljZV9ncm91cF9jcmVhdGlvbikgeworICAgICAgICAgICAgZnBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgPSBpY2RfdGVybS0+ZGlzcGF0Y2guRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHM7CisgICAgICAgIH0KKworICAgICAgICBjdXJfaWNkX2dyb3VwX2NvdW50ID0gMDsKKyAgICAgICAgaWYgKE5VTEwgPT0gZnBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcykgeworICAgICAgICAgICAgLy8gVHJlYXQgZWFjaCBJQ0QncyBHUFUgYXMgaXQncyBvd24gZ3JvdXAgaWYgdGhlIGV4dGVuc2lvbiBpc24ndCBzdXBwb3J0ZWQKKyAgICAgICAgICAgIHJlcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5FbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaWNkX3Rlcm0tPmluc3RhbmNlLCAmY3VyX2ljZF9ncm91cF9jb3VudCwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAic2V0dXBMb2FkZXJUZXJtUGh5c0Rldkdyb3VwczogIEZhaWxlZCBkdXJpbmcgZGlzcGF0Y2ggY2FsbCBvZiAiCisgICAgICAgICAgICAgICAgICAgICJcJ0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlc1wnIHRvIElDRCAlZCB0byBnZXQgcGxhaW4gcGh5cyBkZXYgY291bnQuIiwKKyAgICAgICAgICAgICAgICAgICAgaWNkX2lkeCk7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBRdWVyeSB0aGUgYWN0dWFsIGdyb3VwIGluZm8KKyAgICAgICAgICAgIHJlcyA9IGZwRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoaWNkX3Rlcm0tPmluc3RhbmNlLCAmY3VyX2ljZF9ncm91cF9jb3VudCwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAic2V0dXBMb2FkZXJUZXJtUGh5c0Rldkdyb3VwczogIEZhaWxlZCBkdXJpbmcgZGlzcGF0Y2ggY2FsbCBvZiAiCisgICAgICAgICAgICAgICAgICAgICJcJ0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzXCcgdG8gSUNEICVkIHRvIGdldCBjb3VudC4iLAorICAgICAgICAgICAgICAgICAgICBpY2RfaWR4KTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b3RhbF9jb3VudCArPSBjdXJfaWNkX2dyb3VwX2NvdW50OworICAgIH0KKworICAgIC8vIENyZWF0ZSBhbiBhcnJheSBmb3IgdGhlIG5ldyBwaHlzaWNhbCBkZXZpY2UgZ3JvdXBzLCB3aGljaCB3aWxsIGJlIHN0b3JlZAorICAgIC8vIGluIHRoZSBpbnN0YW5jZSBmb3IgdGhlIFRlcm1pbmF0b3IgY29kZS4KKyAgICBuZXdfcGh5c19kZXZfZ3JvdXBzID0gKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgKiopbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoCisgICAgICAgIGluc3QsIHRvdGFsX2NvdW50ICogc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgKiksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICBpZiAoTlVMTCA9PSBuZXdfcGh5c19kZXZfZ3JvdXBzKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAic2V0dXBMb2FkZXJUZXJtUGh5c0Rldkdyb3VwczogIEZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgcGh5c2ljYWwgZGV2aWNlIgorICAgICAgICAgICAgIiBncm91cCBhcnJheSBvZiBzaXplICVkIiwKKyAgICAgICAgICAgIHRvdGFsX2NvdW50KTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgbWVtc2V0KG5ld19waHlzX2Rldl9ncm91cHMsIDAsIHRvdGFsX2NvdW50ICogc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgKikpOworCisgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGFycmF5IChvbiB0aGUgc3RhY2spIHRvIGtlZXAgdHJhY2sgb2YgdGhlCisgICAgLy8gcmV0dXJuZWQgVmtQaHlzaWNhbERldmljZSB2YWx1ZXMuCisgICAgbG9jYWxfcGh5c19kZXZfZ3JvdXBzID0gbG9hZGVyX3N0YWNrX2FsbG9jKHNpemVvZihWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSAqIHRvdGFsX2NvdW50KTsKKyAgICBpZiAoTlVMTCA9PSBsb2NhbF9waHlzX2Rldl9ncm91cHMpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJzZXR1cExvYWRlclRlcm1QaHlzRGV2R3JvdXBzOiAgRmFpbGVkIHRvIGFsbG9jYXRlIGxvY2FsICIKKyAgICAgICAgICAgICJwaHlzaWNhbCBkZXZpY2UgZ3JvdXAgYXJyYXkgb2Ygc2l6ZSAlZCIsCisgICAgICAgICAgICB0b3RhbF9jb3VudCk7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIC8vIEluaXRpYWxpemUgdGhlIG1lbW9yeSB0byBzb21ldGhpbmcgdmFsaWQKKyAgICBtZW1zZXQobG9jYWxfcGh5c19kZXZfZ3JvdXBzLCAwLCBzaXplb2YoVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykgKiB0b3RhbF9jb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBncm91cCA9IDA7IGdyb3VwIDwgdG90YWxfY291bnQ7IGdyb3VwKyspIHsKKyAgICAgICAgbG9jYWxfcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTX0tIUjsKKyAgICAgICAgbG9jYWxfcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5wTmV4dCA9IE5VTEw7CisgICAgICAgIGxvY2FsX3BoeXNfZGV2X2dyb3Vwc1tncm91cF0uc3Vic2V0QWxsb2NhdGlvbiA9IGZhbHNlOworICAgIH0KKworICAgIGN1cl9pY2RfZ3JvdXBfY291bnQgPSAwOworICAgIGljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOworICAgIGZvciAodWludDMyX3QgaWNkX2lkeCA9IDA7IE5VTEwgIT0gaWNkX3Rlcm07IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQsIGljZF9pZHgrKykgeworICAgICAgICB1aW50MzJfdCBjb3VudF90aGlzX3RpbWUgPSB0b3RhbF9jb3VudCAtIGN1cl9pY2RfZ3JvdXBfY291bnQ7CisKKyAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIHVzZSB0byBjYWxsIGludG8gdGhlIElDRC4gVGhpcyBjb3VsZCBiZSB0aGUgY29yZSBvciBLSFIgdmVyc2lvbgorICAgICAgICBpZiAoaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24pIHsKKyAgICAgICAgICAgIGZwRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgPSBpY2RfdGVybS0+ZGlzcGF0Y2guRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5VTEwgPT0gZnBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcykgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZSogcGh5c19kZXZfYXJyYXkgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpICogY291bnRfdGhpc190aW1lKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IHBoeXNfZGV2X2FycmF5KSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgInNldHVwTG9hZGVyVGVybVBoeXNEZXZHcm91cHM6ICBGYWlsZWQgdG8gYWxsb2NhdGUgbG9jYWwgIgorICAgICAgICAgICAgICAgICAgICAicGh5c2ljYWwgZGV2aWNlIGFycmF5IG9mIHNpemUgJWQiLAorICAgICAgICAgICAgICAgICAgICBjb3VudF90aGlzX3RpbWUpOworICAgICAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpY2RfdGVybS0+aW5zdGFuY2UsICZjb3VudF90aGlzX3RpbWUsIHBoeXNfZGV2X2FycmF5KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICJzZXR1cExvYWRlclRlcm1QaHlzRGV2R3JvdXBzOiAgRmFpbGVkIGR1cmluZyBkaXNwYXRjaCBjYWxsIG9mICIKKyAgICAgICAgICAgICAgICAgICAgIlwnRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzXCcgdG8gSUNEICVkIHRvIGdldCBwbGFpbiBwaHlzIGRldiBjb3VudC4iLAorICAgICAgICAgICAgICAgICAgICBpY2RfaWR4KTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGVhY2ggR1BVIGFzIGl0J3Mgb3duIGdyb3VwCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGl2X2dwdSA9IDA7IGluZGl2X2dwdSA8IGNvdW50X3RoaXNfdGltZTsgaW5kaXZfZ3B1KyspIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9waHlzX2Rldl9ncm91cHNbaW5kaXZfZ3B1ICsgY3VyX2ljZF9ncm91cF9jb3VudF0ucGh5c2ljYWxEZXZpY2VDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgbG9jYWxfcGh5c19kZXZfZ3JvdXBzW2luZGl2X2dwdSArIGN1cl9pY2RfZ3JvdXBfY291bnRdLnBoeXNpY2FsRGV2aWNlc1swXSA9IHBoeXNfZGV2X2FycmF5W2luZGl2X2dwdV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IGZwRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoaWNkX3Rlcm0tPmluc3RhbmNlLCAmY291bnRfdGhpc190aW1lLCAmbG9jYWxfcGh5c19kZXZfZ3JvdXBzW2N1cl9pY2RfZ3JvdXBfY291bnRdKTsKKyAgICAgICAgICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgeworICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICJzZXR1cExvYWRlclRlcm1QaHlzRGV2R3JvdXBzOiAgRmFpbGVkIGR1cmluZyBkaXNwYXRjaCBjYWxsIG9mICIKKyAgICAgICAgICAgICAgICAgICAgIlwnRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNcJyB0byBJQ0QgJWQgdG8gZ2V0IGNvbnRlbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgaWNkX2lkeCk7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjdXJfaWNkX2dyb3VwX2NvdW50ICs9IGNvdW50X3RoaXNfdGltZTsKKyAgICB9CisKKyAgICAvLyBSZXBsYWNlIGFsbCB0aGUgcGh5c2ljYWwgZGV2aWNlIElEcyB3aXRoIHRoZSBwcm9wZXIgbG9hZGVyIHZhbHVlcworICAgIGZvciAodWludDMyX3QgZ3JvdXAgPSAwOyBncm91cCA8IHRvdGFsX2NvdW50OyBncm91cCsrKSB7CisgICAgICAgIGZvciAodWludDMyX3QgZ3JvdXBfZ3B1ID0gMDsgZ3JvdXBfZ3B1IDwgbG9jYWxfcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5waHlzaWNhbERldmljZUNvdW50OyBncm91cF9ncHUrKykgeworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB0ZXJtX2dwdSA9IDA7IHRlcm1fZ3B1IDwgaW5zdC0+cGh5c19kZXZfY291bnRfdGVybTsgdGVybV9ncHUrKykgeworICAgICAgICAgICAgICAgIGlmIChsb2NhbF9waHlzX2Rldl9ncm91cHNbZ3JvdXBdLnBoeXNpY2FsRGV2aWNlc1tncm91cF9ncHVdID09IGluc3QtPnBoeXNfZGV2c190ZXJtW3Rlcm1fZ3B1XS0+cGh5c19kZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5waHlzaWNhbERldmljZXNbZ3JvdXBfZ3B1XSA9IChWa1BoeXNpY2FsRGV2aWNlKWluc3QtPnBoeXNfZGV2c190ZXJtW3Rlcm1fZ3B1XTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgInNldHVwTG9hZGVyVGVybVBoeXNEZXZHcm91cHM6ICBGYWlsZWQgdG8gZmluZCBHUFUgJWQgaW4gZ3JvdXAgJWQiCisgICAgICAgICAgICAgICAgICAgICIgcmV0dXJuZWQgYnkgXCdFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc1wnIGluIGxpc3QgcmV0dXJuZWQiCisgICAgICAgICAgICAgICAgICAgICIgYnkgXCdFbnVtZXJhdGVQaHlzaWNhbERldmljZXNcJyIsIGdyb3VwX2dwdSwgZ3JvdXApOworICAgICAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvcHkgb3IgY3JlYXRlIGV2ZXJ5dGhpbmcgdG8gZmlsbCB0aGUgbmV3IGFycmF5IG9mIHBoeXNpY2FsIGRldmljZSBncm91cHMKKyAgICBmb3IgKHVpbnQzMl90IG5ld19pZHggPSAwOyBuZXdfaWR4IDwgdG90YWxfY291bnQ7IG5ld19pZHgrKykgeworICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHBoeXNpY2FsIGRldmljZSBncm91cCB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzIGlzIGFscmVhZHkgaW4gdGhlIG9sZCBidWZmZXIKKyAgICAgICAgZm9yICh1aW50MzJfdCBvbGRfaWR4ID0gMDsgb2xkX2lkeCA8IGluc3QtPnBoeXNfZGV2X2dyb3VwX2NvdW50X3Rlcm07IG9sZF9pZHgrKykgeworICAgICAgICAgICAgaWYgKGxvY2FsX3BoeXNfZGV2X2dyb3Vwc1tuZXdfaWR4XS5waHlzaWNhbERldmljZUNvdW50ID09IGluc3QtPnBoeXNfZGV2X2dyb3Vwc190ZXJtW29sZF9pZHhdLT5waHlzaWNhbERldmljZUNvdW50KSB7CisgICAgICAgICAgICAgICAgYm9vbCBmb3VuZF9hbGxfZ3B1cyA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBvbGRfZ3B1ID0gMDsgb2xkX2dwdSA8IGluc3QtPnBoeXNfZGV2X2dyb3Vwc190ZXJtW29sZF9pZHhdLT5waHlzaWNhbERldmljZUNvdW50OyBvbGRfZ3B1KyspIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZF9ncHUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBuZXdfZ3B1ID0gMDsgbmV3X2dwdSA8IGxvY2FsX3BoeXNfZGV2X2dyb3Vwc1tuZXdfaWR4XS5waHlzaWNhbERldmljZUNvdW50OyBuZXdfZ3B1KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbF9waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0ucGh5c2ljYWxEZXZpY2VzW25ld19ncHVdID09IGluc3QtPnBoeXNfZGV2X2dyb3Vwc190ZXJtW29sZF9pZHhdLT5waHlzaWNhbERldmljZXNbb2xkX2dwdV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9ncHUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZF9ncHUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2FsbF9ncHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kX2FsbF9ncHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0gPSBpbnN0LT5waHlzX2Rldl9ncm91cHNfdGVybVtvbGRfaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhpcyBwaHlzaWNhbCBkZXZpY2UgZ3JvdXAgaXNuJ3QgaW4gdGhlIG9sZCBidWZmZXIsIGNyZWF0ZSBpdAorICAgICAgICBpZiAoTlVMTCA9PSBuZXdfcGh5c19kZXZfZ3JvdXBzW25ld19pZHhdKSB7CisgICAgICAgICAgICBuZXdfcGh5c19kZXZfZ3JvdXBzW25ld19pZHhdID0gKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIgKilsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYygKKyAgICAgICAgICAgICAgICBpbnN0LCBzaXplb2YoVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUiksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IG5ld19waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0pIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAic2V0dXBMb2FkZXJUZXJtUGh5c0Rldkdyb3VwczogIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAgICAgICAgICJwaHlzaWNhbCBkZXZpY2UgZ3JvdXAgVGVybWluYXRvciBvYmplY3QgJWQiLAorICAgICAgICAgICAgICAgICAgICBuZXdfaWR4KTsKKyAgICAgICAgICAgICAgICB0b3RhbF9jb3VudCA9IG5ld19pZHg7CisgICAgICAgICAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KG5ld19waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0sICZsb2NhbF9waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIpKTsKKyAgICAgICAgfQorICAgIH0KKworb3V0OgorCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgIGlmIChOVUxMICE9IG5ld19waHlzX2Rldl9ncm91cHMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0b3RhbF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBuZXdfcGh5c19kZXZfZ3JvdXBzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgbmV3X3BoeXNfZGV2X2dyb3Vwcyk7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxfY291bnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZyZWUgZXZlcnl0aGluZyB0aGF0IGRpZG4ndCBjYXJyeSBvdmVyIHRvIHRoZSBuZXcgYXJyYXkgb2YKKyAgICAgICAgLy8gcGh5c2ljYWwgZGV2aWNlIGdyb3VwcworICAgICAgICBpZiAoTlVMTCAhPSBpbnN0LT5waHlzX2Rldl9ncm91cHNfdGVybSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluc3QtPnBoeXNfZGV2X2dyb3VwX2NvdW50X3Rlcm07IGkrKykgeworICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgdG90YWxfY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdC0+cGh5c19kZXZfZ3JvdXBzX3Rlcm1baV0gPT0gbmV3X3BoeXNfZGV2X2dyb3Vwc1tqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGluc3QtPnBoeXNfZGV2X2dyb3Vwc190ZXJtW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGluc3QtPnBoeXNfZGV2X2dyb3Vwc190ZXJtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN3YXAgaW4gdGhlIG5ldyBwaHlzaWNhbCBkZXZpY2UgZ3JvdXAgbGlzdAorICAgICAgICBpbnN0LT5waHlzX2Rldl9ncm91cF9jb3VudF90ZXJtID0gdG90YWxfY291bnQ7CisgICAgICAgIGluc3QtPnBoeXNfZGV2X2dyb3Vwc190ZXJtID0gbmV3X3BoeXNfZGV2X2dyb3VwczsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCAqcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICpwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpbnN0YW5jZTsKKyAgICBWa1Jlc3VsdCByZXMgPSBWS19TVUNDRVNTOworCisgICAgLy8gQWx3YXlzIGNhbGwgdGhlIHNldHVwIGxvYWRlciB0ZXJtaW5hdG9yIHBoeXNpY2FsIGRldmljZSBncm91cHMgYmVjYXVzZSB0aGV5IG1heQorICAgIC8vIGhhdmUgY2hhbmdlZCBhdCBhbnkgcG9pbnQuCisgICAgcmVzID0gc2V0dXBMb2FkZXJUZXJtUGh5c0Rldkdyb3VwcyhpbnN0KTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgdWludDMyX3QgY29weV9jb3VudCA9IGluc3QtPnBoeXNfZGV2X2dyb3VwX2NvdW50X3Rlcm07CisgICAgaWYgKE5VTEwgIT0gcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSB7CisgICAgICAgIGlmIChjb3B5X2NvdW50ID4gKnBQaHlzaWNhbERldmljZUdyb3VwQ291bnQpIHsKKyAgICAgICAgICAgIGNvcHlfY291bnQgPSAqcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudDsKKyAgICAgICAgICAgIHJlcyA9IFZLX0lOQ09NUExFVEU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29weV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoJnBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc1tpXSwgaW5zdC0+cGh5c19kZXZfZ3JvdXBzX3Rlcm1baV0sCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50ID0gY29weV9jb3VudDsKKworb3V0OgorCisgICAgcmV0dXJuIHJlczsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyICpwRmVhdHVyZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGljZF90ZXJtLT50aGlzX2luc3RhbmNlOworCisgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIHVzZSB0byBjYWxsIGludG8gdGhlIElDRC4gVGhpcyBjb3VsZCBiZSB0aGUgY29yZSBvciBLSFIgdmVyc2lvbgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIGZwR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPSBOVUxMOworICAgIGlmIChpbnN0ICE9IE5VTEwgJiYgaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiA9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMjsKKyAgICB9CisKKyAgICBpZiAoZnBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiAhPSBOVUxMIHx8ICFpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIHsKKyAgICAgICAgLy8gUGFzcyB0aGUgY2FsbCB0byB0aGUgZHJpdmVyCisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBGZWF0dXJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW11bGF0ZSB0aGUgY2FsbAorICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMjogRW11bGF0aW5nIGNhbGwgaW4gSUNEIFwiJXNcIiB1c2luZyB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMiLAorICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5zY2FubmVkX2ljZC0+bGliX25hbWUpOworCisgICAgICAgIC8vIFdyaXRlIHRvIHRoZSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHN0cnVjdAorICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgJnBGZWF0dXJlcy0+ZmVhdHVyZXMpOworCisgICAgICAgIGNvbnN0IFZrQmFzZUluU3RydWN0dXJlICpwTmV4dCA9IHBGZWF0dXJlcy0+cE5leHQ7CisgICAgICAgIHdoaWxlIChwTmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBOZXh0LT5zVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFUzogeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBjaGVjayBpZiBWS19LSFJfbXVsdGl2aWV3IGlzIGVuYWJsZWQgYmVjYXVzZSBpdCdzIGEgZGV2aWNlIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSB0byB0aGUgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzS0hSIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXNLSFIgKm11bHRpdmlld19mZWF0dXJlcyA9IChWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXNLSFIgKilwTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGl2aWV3X2ZlYXR1cmVzLT5tdWx0aXZpZXcgPSBWS19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGl2aWV3X2ZlYXR1cmVzLT5tdWx0aXZpZXdHZW9tZXRyeVNoYWRlciA9IFZLX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBtdWx0aXZpZXdfZmVhdHVyZXMtPm11bHRpdmlld1Rlc3NlbGxhdGlvblNoYWRlciA9IFZLX0ZBTFNFOworCisgICAgICAgICAgICAgICAgICAgIHBOZXh0ID0gbXVsdGl2aWV3X2ZlYXR1cmVzLT5wTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMjogRW11bGF0aW9uIGZvdW5kIHVucmVjb2duaXplZCBzdHJ1Y3R1cmUgdHlwZSBpbiBwRmVhdHVyZXMtPnBOZXh0IC0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHN0cnVjdCB3aWxsIGJlIGlnbm9yZWQiKTsKKworICAgICAgICAgICAgICAgICAgICBwTmV4dCA9IHBOZXh0LT5wTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgKnBQcm9wZXJ0aWVzKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QgPSBpY2RfdGVybS0+dGhpc19pbnN0YW5jZTsKKworICAgIC8vIEdldCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byB1c2UgdG8gY2FsbCBpbnRvIHRoZSBJQ0QuIFRoaXMgY291bGQgYmUgdGhlIGNvcmUgb3IgS0hSIHZlcnNpb24KKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIGZwR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiA9IE5VTEw7CisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CisgICAgfQorCisgICAgaWYgKGZwR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiAhPSBOVUxMIHx8ICFpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIHsKKyAgICAgICAgLy8gUGFzcyB0aGUgY2FsbCB0byB0aGUgZHJpdmVyCisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcFByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVtdWxhdGUgdGhlIGNhbGwKKyAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMjogRW11bGF0aW5nIGNhbGwgaW4gSUNEIFwiJXNcIiB1c2luZyB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyIsCisgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgLy8gV3JpdGUgdG8gdGhlIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiBzdHJ1Y3QKKyAgICAgICAgaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgJnBQcm9wZXJ0aWVzLT5wcm9wZXJ0aWVzKTsKKworICAgICAgICBjb25zdCBWa0Jhc2VJblN0cnVjdHVyZSAqcE5leHQgPSBwUHJvcGVydGllcy0+cE5leHQ7CisgICAgICAgIHdoaWxlIChwTmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBOZXh0LT5zVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVM6IHsKKyAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllc0tIUiAqaWRfcHJvcGVydGllcyA9IChWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzS0hSICopcE5leHQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIiBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChpY2RfdGVybS0+dGhpc19pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyOiBFbXVsYXRpb24gY2Fubm90IGdlbmVyYXRlIHVuaXF1ZSBJRHMgZm9yIHN0cnVjdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzIC0gc2V0dGluZyBJRHMgdG8gemVybyBpbnN0ZWFkIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRvIHRoZSBWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzS0hSIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGlkX3Byb3BlcnRpZXMtPmRldmljZVVVSUQsIDAsIFZLX1VVSURfU0laRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoaWRfcHJvcGVydGllcy0+ZHJpdmVyVVVJRCwgMCwgVktfVVVJRF9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkX3Byb3BlcnRpZXMtPmRldmljZUxVSURWYWxpZCA9IFZLX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcE5leHQgPSBpZF9wcm9wZXJ0aWVzLT5wTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSOiBFbXVsYXRpb24gZm91bmQgdW5yZWNvZ25pemVkIHN0cnVjdHVyZSB0eXBlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicFByb3BlcnRpZXMtPnBOZXh0IC0gdGhpcyBzdHJ1Y3Qgd2lsbCBiZSBpZ25vcmVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgcE5leHQgPSBwTmV4dC0+cE5leHQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdFByb3BlcnRpZXMyICpwRm9ybWF0UHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisKKyAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdXNlIHRvIGNhbGwgaW50byB0aGUgSUNELiBUaGlzIGNvdWxkIGJlIHRoZSBjb3JlIG9yIEtIUiB2ZXJzaW9uCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiBmcEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIgPSBOVUxMOworICAgIGlmIChpbnN0ICE9IE5VTEwgJiYgaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiA9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiA9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyOworICAgIH0KKworICAgIGlmIChmcEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIgIT0gTlVMTCB8fCAhaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGNhbGwgdG8gdGhlIGRyaXZlcgorICAgICAgICBmcEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVtdWxhdGUgdGhlIGNhbGwKKyAgICAgICAgbG9hZGVyX2xvZygKKyAgICAgICAgICAgIGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczI6IEVtdWxhdGluZyBjYWxsIGluIElDRCBcIiVzXCIgdXNpbmcgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiLAorICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgLy8gV3JpdGUgdG8gdGhlIFZrRm9ybWF0UHJvcGVydGllczIgc3RydWN0CisgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIGZvcm1hdCwgJnBGb3JtYXRQcm9wZXJ0aWVzLT5mb3JtYXRQcm9wZXJ0aWVzKTsKKworICAgICAgICBpZiAocEZvcm1hdFByb3BlcnRpZXMtPnBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczI6IEVtdWxhdGlvbiBmb3VuZCB1bnJlY29nbml6ZWQgc3RydWN0dXJlIHR5cGUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAicEZvcm1hdFByb3BlcnRpZXMtPnBOZXh0IC0gdGhpcyBzdHJ1Y3Qgd2lsbCBiZSBpZ25vcmVkIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMktIUiAqcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgKnBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGljZF90ZXJtLT50aGlzX2luc3RhbmNlOworCisgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIHVzZSB0byBjYWxsIGludG8gdGhlIElDRC4gVGhpcyBjb3VsZCBiZSB0aGUgY29yZSBvciBLSFIgdmVyc2lvbgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBmcEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiA9IE5VTEw7CisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgICB9CisKKyAgICBpZiAoZnBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgIT0gTlVMTCB8fCAhaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGNhbGwgdG8gdGhlIGRyaXZlcgorICAgICAgICByZXR1cm4gZnBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVtdWxhdGUgdGhlIGNhbGwKKyAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOiBFbXVsYXRpbmcgY2FsbCBpbiBJQ0QgXCIlc1wiIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyIsCisgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSBpbmZvIGluICBlaXRoZXIgcE5leHQsIHRoZW4gdGhpcyBpcyB1bnN1cHBvcnRlZAorICAgICAgICBpZiAocEltYWdlRm9ybWF0SW5mby0+cE5leHQgIT0gTlVMTCB8fCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLT5wTmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfRk9STUFUX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSB0byB0aGUgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIHN0cnVjdAorICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgICAgICAgICAgcGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBJbWFnZUZvcm1hdEluZm8tPmZvcm1hdCwgcEltYWdlRm9ybWF0SW5mby0+dHlwZSwgcEltYWdlRm9ybWF0SW5mby0+dGlsaW5nLAorICAgICAgICAgICAgcEltYWdlRm9ybWF0SW5mby0+dXNhZ2UsIHBJbWFnZUZvcm1hdEluZm8tPmZsYWdzLCAmcEltYWdlRm9ybWF0UHJvcGVydGllcy0+aW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgKnBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGljZF90ZXJtLT50aGlzX2luc3RhbmNlOworCisgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIHVzZSB0byBjYWxsIGludG8gdGhlIElDRC4gVGhpcyBjb3VsZCBiZSB0aGUgY29yZSBvciBLSFIgdmVyc2lvbgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiBmcEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiA9IE5VTEw7CisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIgPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKKyAgICB9CisKKyAgICBpZiAoZnBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIgIT0gTlVMTCB8fCAhaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGNhbGwgdG8gdGhlIGRyaXZlcgorICAgICAgICBmcEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW11bGF0ZSB0aGUgY2FsbAorICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczI6IEVtdWxhdGluZyBjYWxsIGluIElDRCBcIiVzXCIgdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIiwKKyAgICAgICAgICAgICAgICAgICBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmxpYl9uYW1lKTsKKworICAgICAgICBpZiAocFF1ZXVlRmFtaWx5UHJvcGVydGllcyA9PSBOVUxMIHx8ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRvIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQKKyAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgTlVMTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBhcnJheSBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb2xkIGZ1bmN0aW9uCisgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAqcHJvcGVydGllcyA9IGxvYWRlcl9zdGFja19hbGxvYygqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCAqIHNpemVvZihWa1F1ZXVlRmFtaWx5UHJvcGVydGllcykpOworICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgICAgICAgICBpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjogT3V0IG9mIG1lbW9yeSAtIEZhaWxlZCB0byBhbGxvY2F0ZSBhcnJheSBmb3IgbG9hZGVyIGVtdWxhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdG8gdGhlIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiBzdHJ1Y3QKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnBRdWV1ZUZhbWlseVByb3BlcnRpZXNbaV0ucXVldWVGYW1pbHlQcm9wZXJ0aWVzLCAmcHJvcGVydGllc1tpXSwgc2l6ZW9mKFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocFF1ZXVlRmFtaWx5UHJvcGVydGllc1tpXS5wTmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyOiBFbXVsYXRpb24gZm91bmQgdW5yZWNvZ25pemVkIHN0cnVjdHVyZSB0eXBlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicFF1ZXVlRmFtaWx5UHJvcGVydGllc1slZF0ucE5leHQgLSB0aGlzIHN0cnVjdCB3aWxsIGJlIGlnbm9yZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiAqcE1lbW9yeVByb3BlcnRpZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IGljZF90ZXJtLT50aGlzX2luc3RhbmNlOworCisgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIHVzZSB0byBjYWxsIGludG8gdGhlIElDRC4gVGhpcyBjb3VsZCBiZSB0aGUgY29yZSBvciBLSFIgdmVyc2lvbgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgZnBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyID0gTlVMTDsKKyAgICBpZiAoaW5zdCAhPSBOVUxMICYmIGluc3QtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikgeworICAgICAgICBmcEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUjsKKyAgICB9IGVsc2UgeworICAgICAgICBmcEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjsKKyAgICB9CisKKyAgICBpZiAoZnBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyICE9IE5VTEwgfHwgIWluc3QtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikgeworICAgICAgICAvLyBQYXNzIHRoZSBjYWxsIHRvIHRoZSBkcml2ZXIKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwTWVtb3J5UHJvcGVydGllcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW11bGF0ZSB0aGUgY2FsbAorICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjogRW11bGF0aW5nIGNhbGwgaW4gSUNEIFwiJXNcIiB1c2luZyB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIsCisgICAgICAgICAgICBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmxpYl9uYW1lKTsKKworICAgICAgICAvLyBXcml0ZSB0byB0aGUgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIHN0cnVjdAorICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCAmcE1lbW9yeVByb3BlcnRpZXMtPm1lbW9yeVByb3BlcnRpZXMpOworCisgICAgICAgIGlmIChwTWVtb3J5UHJvcGVydGllcy0+cE5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjogRW11bGF0aW9uIGZvdW5kIHVucmVjb2duaXplZCBzdHJ1Y3R1cmUgdHlwZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJwTWVtb3J5UHJvcGVydGllcy0+cE5leHQgLSB0aGlzIHN0cnVjdCB3aWxsIGJlIGlnbm9yZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzJLSFIgKnBGb3JtYXRJbmZvLCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSICpwUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisKKyAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdXNlIHRvIGNhbGwgaW50byB0aGUgSUNELiBUaGlzIGNvdWxkIGJlIHRoZSBjb3JlIG9yIEtIUiB2ZXJzaW9uCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIGZwR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyID0gTlVMTDsKKyAgICBpZiAoaW5zdCAhPSBOVUxMICYmIGluc3QtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikgeworICAgICAgICBmcEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiA9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworICAgIH0KKworICAgIGlmIChmcEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAhPSBOVUxMIHx8ICFpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIHsKKyAgICAgICAgLy8gUGFzcyB0aGUgY2FsbCB0byB0aGUgZHJpdmVyCisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwRm9ybWF0SW5mbywgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBFbXVsYXRlIHRoZSBjYWxsCisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjogRW11bGF0aW5nIGNhbGwgaW4gSUNEIFwiJXNcIiB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiLAorICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5zY2FubmVkX2ljZC0+bGliX25hbWUpOworCisgICAgICAgIGlmIChwRm9ybWF0SW5mby0+cE5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOiBFbXVsYXRpb24gZm91bmQgdW5yZWNvZ25pemVkIHN0cnVjdHVyZSB0eXBlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgInBGb3JtYXRJbmZvLT5wTmV4dCAtIHRoaXMgc3RydWN0IHdpbGwgYmUgaWdub3JlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwgfHwgKnBQcm9wZXJ0eUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRvIHBQcm9wZXJ0eUNvdW50CisgICAgICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgcGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBGb3JtYXRJbmZvLT5mb3JtYXQsIHBGb3JtYXRJbmZvLT50eXBlLCBwRm9ybWF0SW5mby0+c2FtcGxlcywgcEZvcm1hdEluZm8tPnVzYWdlLAorICAgICAgICAgICAgICAgIHBGb3JtYXRJbmZvLT50aWxpbmcsIHBQcm9wZXJ0eUNvdW50LCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGFycmF5IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvbGQgZnVuY3Rpb24KKyAgICAgICAgICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICpwcm9wZXJ0aWVzID0KKyAgICAgICAgICAgICAgICBsb2FkZXJfc3RhY2tfYWxsb2MoKnBQcm9wZXJ0eUNvdW50ICogc2l6ZW9mKFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMpKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqcFByb3BlcnR5Q291bnQgPSAwOworICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOiBPdXQgb2YgbWVtb3J5IC0gRmFpbGVkIHRvIGFsbG9jYXRlIGFycmF5IGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyIGVtdWxhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICAgICAgICAgICAgICBwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcEZvcm1hdEluZm8tPmZvcm1hdCwgcEZvcm1hdEluZm8tPnR5cGUsIHBGb3JtYXRJbmZvLT5zYW1wbGVzLCBwRm9ybWF0SW5mby0+dXNhZ2UsCisgICAgICAgICAgICAgICAgcEZvcm1hdEluZm8tPnRpbGluZywgcFByb3BlcnR5Q291bnQsIHByb3BlcnRpZXMpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICpwUHJvcGVydHlDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdG8gdGhlIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiBzdHJ1Y3QKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnBQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMsICZwcm9wZXJ0aWVzW2ldLCBzaXplb2YoVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMpKTsKKworICAgICAgICAgICAgICAgIGlmIChwUHJvcGVydGllc1tpXS5wTmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOiBFbXVsYXRpb24gZm91bmQgdW5yZWNvZ25pemVkIHN0cnVjdHVyZSB0eXBlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicFByb3BlcnRpZXNbJWRdLnBOZXh0IC0gdGhpcyBzdHJ1Y3Qgd2lsbCBiZSBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyAqcEV4dGVybmFsQnVmZmVySW5mbywKKyAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyAqcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisKKyAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdXNlIHRvIGNhbGwgaW50byB0aGUgSUNELiBUaGlzIGNvdWxkIGJlIHRoZSBjb3JlIG9yIEtIUiB2ZXJzaW9uCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgZnBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyA9IE5VTEw7CisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUjsKKyAgICB9IGVsc2UgeworICAgICAgICBmcEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzOworICAgIH0KKworICAgIGlmIChmcEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIHx8ICFpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgLy8gUGFzcyB0aGUgY2FsbCB0byB0aGUgZHJpdmVyCisgICAgICAgIGZwR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBFeHRlcm5hbEJ1ZmZlckluZm8sIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVtdWxhdGUgdGhlIGNhbGwKKyAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM6IEVtdWxhdGluZyBjYWxsIGluIElDRCBcIiVzXCIiLCBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmxpYl9uYW1lKTsKKworICAgICAgICBpZiAocEV4dGVybmFsQnVmZmVySW5mby0+cE5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM6IEVtdWxhdGlvbiBmb3VuZCB1bnJlY29nbml6ZWQgc3RydWN0dXJlIHR5cGUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAicEV4dGVybmFsQnVmZmVySW5mby0+cE5leHQgLSB0aGlzIHN0cnVjdCB3aWxsIGJlIGlnbm9yZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgaW4gZXZlcnl0aGluZyBiZWluZyB1bnN1cHBvcnRlZAorICAgICAgICBtZW1zZXQoJnBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtPmV4dGVybmFsTWVtb3J5UHJvcGVydGllcywgMCwgc2l6ZW9mKFZrRXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzS0hSKSk7CisKKyAgICAgICAgaWYgKHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtPnBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzOiBFbXVsYXRpb24gZm91bmQgdW5yZWNvZ25pemVkIHN0cnVjdHVyZSB0eXBlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgInBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtPnBOZXh0IC0gdGhpcyBzdHJ1Y3Qgd2lsbCBiZSBpZ25vcmVkIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyAqcEV4dGVybmFsU2VtYXBob3JlSW5mbywKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyAqcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisKKyAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdXNlIHRvIGNhbGwgaW50byB0aGUgSUNELiBUaGlzIGNvdWxkIGJlIHRoZSBjb3JlIG9yIEtIUiB2ZXJzaW9uCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgZnBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyA9IE5VTEw7CisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUjsKKyAgICB9IGVsc2UgeworICAgICAgICBmcEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzOworICAgIH0KKworICAgIGlmIChmcEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzICE9IE5VTEwgfHwgIWluc3QtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcykgeworICAgICAgICAvLyBQYXNzIHRoZSBjYWxsIHRvIHRoZSBkcml2ZXIKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyhwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcEV4dGVybmFsU2VtYXBob3JlSW5mbywgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW11bGF0ZSB0aGUgY2FsbAorICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczogRW11bGF0aW5nIGNhbGwgaW4gSUNEIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgaWYgKHBFeHRlcm5hbFNlbWFwaG9yZUluZm8tPnBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzOiBFbXVsYXRpb24gZm91bmQgdW5yZWNvZ25pemVkIHN0cnVjdHVyZSB0eXBlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgInBFeHRlcm5hbFNlbWFwaG9yZUluZm8tPnBOZXh0IC0gdGhpcyBzdHJ1Y3Qgd2lsbCBiZSBpZ25vcmVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxsIGluIGV2ZXJ5dGhpbmcgYmVpbmcgdW5zdXBwb3J0ZWQKKyAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy0+ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgPSAwOworICAgICAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLT5jb21wYXRpYmxlSGFuZGxlVHlwZXMgPSAwOworICAgICAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLT5leHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVzID0gMDsKKworICAgICAgICBpZiAocEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy0+cE5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM6IEVtdWxhdGlvbiBmb3VuZCB1bnJlY29nbml6ZWQgc3RydWN0dXJlIHR5cGUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAicEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy0+cE5leHQgLSB0aGlzIHN0cnVjdCB3aWxsIGJlIGlnbm9yZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyAqcEV4dGVybmFsRmVuY2VJbmZvLAorICAgIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgKnBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisKKyAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdXNlIHRvIGNhbGwgaW50byB0aGUgSUNELiBUaGlzIGNvdWxkIGJlIHRoZSBjb3JlIG9yIEtIUiB2ZXJzaW9uCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyBmcEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgPSBOVUxMOworICAgIGlmIChpbnN0ICE9IE5VTEwgJiYgaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM7CisgICAgfQorCisgICAgaWYgKGZwR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyAhPSBOVUxMIHx8ICFpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcykgeworICAgICAgICAvLyBQYXNzIHRoZSBjYWxsIHRvIHRoZSBkcml2ZXIKKyAgICAgICAgZnBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwRXh0ZXJuYWxGZW5jZUluZm8sIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW11bGF0ZSB0aGUgY2FsbAorICAgICAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOiBFbXVsYXRpbmcgY2FsbCBpbiBJQ0QgXCIlc1wiIiwgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAgICAgaWYgKHBFeHRlcm5hbEZlbmNlSW5mby0+cE5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllczogRW11bGF0aW9uIGZvdW5kIHVucmVjb2duaXplZCBzdHJ1Y3R1cmUgdHlwZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJwRXh0ZXJuYWxGZW5jZUluZm8tPnBOZXh0IC0gdGhpcyBzdHJ1Y3Qgd2lsbCBiZSBpZ25vcmVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxsIGluIGV2ZXJ5dGhpbmcgYmVpbmcgdW5zdXBwb3J0ZWQKKyAgICAgICAgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLT5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyA9IDA7CisgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcy0+Y29tcGF0aWJsZUhhbmRsZVR5cGVzID0gMDsKKyAgICAgICAgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLT5leHRlcm5hbEZlbmNlRmVhdHVyZXMgPSAwOworCisgICAgICAgIGlmIChwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtPnBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM6IEVtdWxhdGlvbiBmb3VuZCB1bnJlY29nbml6ZWQgc3RydWN0dXJlIHR5cGUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAicEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLT5wTmV4dCAtIHRoaXMgc3RydWN0IHdpbGwgYmUgaWdub3JlZCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9sb2FkZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvbG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2YjRjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvbG9hZGVyLmgKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogTGVubnkgS29tb3cgPGxlbm55QGx1bmFyZy5jb20+CisgKgorICovCisKKyNpZm5kZWYgTE9BREVSX0gKKyNkZWZpbmUgTE9BREVSX0gKKworI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2a19sb2FkZXJfbGF5ZXIuaCIKKyNpbmNsdWRlIDx2dWxrYW4vdmtfbGF5ZXIuaD4KKyNpbmNsdWRlIDx2dWxrYW4vdmtfaWNkLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAidmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCIKKyNpbmNsdWRlICJ2a19sb2FkZXJfZXh0ZW5zaW9ucy5oIgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBMT0FERVJfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKQorI2RlZmluZSBMT0FERVJfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxzZQorI2RlZmluZSBMT0FERVJfRVhQT1JUCisjZW5kaWYKKworLy8gQSBkZWJ1ZyBvcHRpb24gdG8gZGlzYWJsZSBhbGxvY2F0b3JzIGF0IGNvbXBpbGUgdGltZSB0byBpbnZlc3RpZ2F0ZSBmdXR1cmUgaXNzdWVzLgorI2RlZmluZSBERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTIDAKKworI2RlZmluZSBNQVhfU1RSSU5HX1NJWkUgMTAyNAorCisvLyBUaGlzIGlzIGRlZmluZWQgaW4gdmtfbGF5ZXIuaCwgYnV0IGlmIHRoZXJlJ3MgcHJvYmxlbXMgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGRlZmluZQorLy8gaGVyZS4KKyNpZm5kZWYgTUFYX05VTV9VTktOT1dOX0VYVFMKKyNkZWZpbmUgTUFYX05VTV9VTktOT1dOX0VYVFMgMjUwCisjZW5kaWYKKworZW51bSBsYXllcl90eXBlX2ZsYWdzIHsKKyAgICBWS19MQVlFUl9UWVBFX0ZMQUdfSU5TVEFOQ0VfTEFZRVIgPSAweDEsICAvLyBJZiBub3Qgc2V0LCBpbmRpY2F0ZXMgRGV2aWNlIGxheWVyCisgICAgVktfTEFZRVJfVFlQRV9GTEFHX0VYUExJQ0lUX0xBWUVSID0gMHgyLCAgLy8gSWYgbm90IHNldCwgaW5kaWNhdGVzIEltcGxpY2l0IGxheWVyCisgICAgVktfTEFZRVJfVFlQRV9GTEFHX01FVEFfTEFZRVIgPSAweDQsICAgICAgLy8gSWYgbm90IHNldCwgaW5kaWNhdGVzIHN0YW5kYXJkIGxheWVyCit9OworCit0eXBlZGVmIGVudW0gVmtTdHJpbmdFcnJvckZsYWdCaXRzIHsKKyAgICBWS19TVFJJTkdfRVJST1JfTk9ORSA9IDB4MDAwMDAwMDAsCisgICAgVktfU1RSSU5HX0VSUk9SX0xFTkdUSCA9IDB4MDAwMDAwMDEsCisgICAgVktfU1RSSU5HX0VSUk9SX0JBRF9EQVRBID0gMHgwMDAwMDAwMiwKK30gVmtTdHJpbmdFcnJvckZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrU3RyaW5nRXJyb3JGbGFnczsKKworc3RhdGljIGNvbnN0IGludCBNYXhMb2FkZXJTdHJpbmdMZW5ndGggPSAyNTY7CitzdGF0aWMgY29uc3QgY2hhciBVVEY4X09ORV9CWVRFX0NPREUgPSAweEMwOworc3RhdGljIGNvbnN0IGNoYXIgVVRGOF9PTkVfQllURV9NQVNLID0gMHhFMDsKK3N0YXRpYyBjb25zdCBjaGFyIFVURjhfVFdPX0JZVEVfQ09ERSA9IDB4RTA7CitzdGF0aWMgY29uc3QgY2hhciBVVEY4X1RXT19CWVRFX01BU0sgPSAweEYwOworc3RhdGljIGNvbnN0IGNoYXIgVVRGOF9USFJFRV9CWVRFX0NPREUgPSAweEYwOworc3RhdGljIGNvbnN0IGNoYXIgVVRGOF9USFJFRV9CWVRFX01BU0sgPSAweEY4Oworc3RhdGljIGNvbnN0IGNoYXIgVVRGOF9EQVRBX0JZVEVfQ09ERSA9IDB4ODA7CitzdGF0aWMgY29uc3QgY2hhciBVVEY4X0RBVEFfQllURV9NQVNLID0gMHhDMDsKKworLy8gZm9ybSBvZiBhbGwgZHluYW1pYyBsaXN0cy9hcnJheXMKKy8vIG9ubHkgdGhlIGxpc3QgZWxlbWVudCBzaG91bGQgYmUgY2hhbmdlZAorc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgeworICAgIHNpemVfdCBjYXBhY2l0eTsKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICB2b2lkICpsaXN0OworfTsKKworc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCB7CisgICAgc2l6ZV90IGNhcGFjaXR5OworICAgIHVpbnQzMl90IGNvdW50OworICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqbGlzdDsKK307CisKK3N0cnVjdCBsb2FkZXJfZGV2X2V4dF9wcm9wcyB7CisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIHByb3BzOworICAgIHVpbnQzMl90IGVudHJ5cG9pbnRfY291bnQ7CisgICAgY2hhciAqKmVudHJ5cG9pbnRzOworfTsKKworc3RydWN0IGxvYWRlcl9kZXZpY2VfZXh0ZW5zaW9uX2xpc3QgeworICAgIHNpemVfdCBjYXBhY2l0eTsKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICBzdHJ1Y3QgbG9hZGVyX2Rldl9leHRfcHJvcHMgKmxpc3Q7Cit9OworCitzdHJ1Y3QgbG9hZGVyX25hbWVfdmFsdWUgeworICAgIGNoYXIgbmFtZVtNQVhfU1RSSU5HX1NJWkVdOworICAgIGNoYXIgdmFsdWVbTUFYX1NUUklOR19TSVpFXTsKK307CisKK3N0cnVjdCBsb2FkZXJfbGF5ZXJfZnVuY3Rpb25zIHsKKyAgICBjaGFyIHN0cl9naXBhW01BWF9TVFJJTkdfU0laRV07CisgICAgY2hhciBzdHJfZ2RwYVtNQVhfU1RSSU5HX1NJWkVdOworICAgIGNoYXIgc3RyX25lZ290aWF0ZV9pbnRlcmZhY2VbTUFYX1NUUklOR19TSVpFXTsKKyAgICBQRk5fdmtOZWdvdGlhdGVMb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24gbmVnb3RpYXRlX2xheWVyX2ludGVyZmFjZTsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGdldF9pbnN0YW5jZV9wcm9jX2FkZHI7CisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZ2V0X2RldmljZV9wcm9jX2FkZHI7CisgICAgUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9jX2FkZHI7Cit9OworCitzdHJ1Y3QgbG9hZGVyX292ZXJyaWRlX2V4cGlyYXRpb24geworICAgIHVpbnQxNl90IHllYXI7CisgICAgdWludDhfdCBtb250aDsKKyAgICB1aW50OF90IGRheTsKKyAgICB1aW50OF90IGhvdXI7CisgICAgdWludDhfdCBtaW51dGU7Cit9OworCitzdHJ1Y3QgbG9hZGVyX2xheWVyX3Byb3BlcnRpZXMgeworICAgIFZrTGF5ZXJQcm9wZXJ0aWVzIGluZm87CisgICAgZW51bSBsYXllcl90eXBlX2ZsYWdzIHR5cGVfZmxhZ3M7CisgICAgdWludDMyX3QgaW50ZXJmYWNlX3ZlcnNpb247ICAvLyBQRk5fdmtOZWdvdGlhdGVMb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24KKyAgICBjaGFyIGxpYl9uYW1lW01BWF9TVFJJTkdfU0laRV07CisgICAgbG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsaWJfaGFuZGxlOworICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfZnVuY3Rpb25zIGZ1bmN0aW9uczsKKyAgICBzdHJ1Y3QgbG9hZGVyX2V4dGVuc2lvbl9saXN0IGluc3RhbmNlX2V4dGVuc2lvbl9saXN0OworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlX2V4dGVuc2lvbl9saXN0IGRldmljZV9leHRlbnNpb25fbGlzdDsKKyAgICBzdHJ1Y3QgbG9hZGVyX25hbWVfdmFsdWUgZGlzYWJsZV9lbnZfdmFyOworICAgIHN0cnVjdCBsb2FkZXJfbmFtZV92YWx1ZSBlbmFibGVfZW52X3ZhcjsKKyAgICB1aW50MzJfdCBudW1fY29tcG9uZW50X2xheWVyczsKKyAgICBjaGFyICgqY29tcG9uZW50X2xheWVyX25hbWVzKVtNQVhfU1RSSU5HX1NJWkVdOworICAgIHN0cnVjdCB7CisgICAgICAgIGNoYXIgZW51bWVyYXRlX2luc3RhbmNlX2V4dGVuc2lvbl9wcm9wZXJ0aWVzW01BWF9TVFJJTkdfU0laRV07CisgICAgICAgIGNoYXIgZW51bWVyYXRlX2luc3RhbmNlX2xheWVyX3Byb3BlcnRpZXNbTUFYX1NUUklOR19TSVpFXTsKKyAgICAgICAgY2hhciBlbnVtZXJhdGVfaW5zdGFuY2VfdmVyc2lvbltNQVhfU1RSSU5HX1NJWkVdOworICAgIH0gcHJlX2luc3RhbmNlX2Z1bmN0aW9uczsKKyAgICB1aW50MzJfdCBudW1fb3ZlcnJpZGVfcGF0aHM7CisgICAgY2hhciAoKm92ZXJyaWRlX3BhdGhzKVtNQVhfU1RSSU5HX1NJWkVdOworICAgIGJvb2wgaXNfb3ZlcnJpZGU7CisgICAgYm9vbCBoYXNfZXhwaXJhdGlvbjsKKyAgICBzdHJ1Y3QgbG9hZGVyX292ZXJyaWRlX2V4cGlyYXRpb24gZXhwaXJhdGlvbjsKKyAgICBib29sIGtlZXA7CisgICAgdWludDMyX3QgbnVtX2JsYWNrbGlzdF9sYXllcnM7CisgICAgY2hhciAoKmJsYWNrbGlzdF9sYXllcl9uYW1lcylbTUFYX1NUUklOR19TSVpFXTsKK307CisKK3N0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCB7CisgICAgc2l6ZV90IGNhcGFjaXR5OworICAgIHVpbnQzMl90IGNvdW50OworICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfcHJvcGVydGllcyAqbGlzdDsKK307CisKK3N0cnVjdCBsb2FkZXJfZGlzcGF0Y2hfaGFzaF9saXN0IHsKKyAgICBzaXplX3QgY2FwYWNpdHk7CisgICAgdWludDMyX3QgY291bnQ7CisgICAgdWludDMyX3QgKmluZGV4OyAgLy8gaW5kZXggaW50byB0aGUgZGV2X2V4dCBkaXNwYXRjaCB0YWJsZQorfTsKKworLy8gbG9hZGVyX2Rpc3BhdGNoX2hhc2hfZW50cnkgYW5kIGxvYWRlcl9kZXZfZXh0X2Rpc3BhdGNoX3RhYmxlLmRldl9leHQgaGF2ZQorLy8gb25lIHRvIG9uZSBjb3JyZXNwb25kZW5jZTsgb25lIGxvYWRlcl9kaXNwYXRjaF9oYXNoX2VudHJ5IGZvciBvbmUgZGV2X2V4dAorLy8gZGlzcGF0Y2ggZW50cnkuCisvLyBBbHNvIGhhdmUgYSBvbmUgdG8gb25lIGNvcnJlc3BvbmRlbmNlIHdpdGggZnVuY3Rpb25zIGluIGRldl9leHRfdHJhbXBvbGluZS5jCitzdHJ1Y3QgbG9hZGVyX2Rpc3BhdGNoX2hhc2hfZW50cnkgeworICAgIGNoYXIgKmZ1bmNfbmFtZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2Rpc3BhdGNoX2hhc2hfbGlzdCBsaXN0OyAgLy8gdG8gaGFuZGxlIGhhc2hpbmcgY29sbGlzaW9ucworfTsKKwordHlwZWRlZiBWa1Jlc3VsdChWS0FQSV9QVFIgKlBGTl92a0RldkV4dCkoVmtEZXZpY2UgZGV2aWNlKTsKK3N0cnVjdCBsb2FkZXJfZGV2X2V4dF9kaXNwYXRjaF90YWJsZSB7CisgICAgUEZOX3ZrRGV2RXh0IGRldl9leHRbTUFYX05VTV9VTktOT1dOX0VYVFNdOworfTsKKworc3RydWN0IGxvYWRlcl9kZXZfZGlzcGF0Y2hfdGFibGUgeworICAgIFZrTGF5ZXJEaXNwYXRjaFRhYmxlIGNvcmVfZGlzcGF0Y2g7CisgICAgc3RydWN0IGxvYWRlcl9kZXZfZXh0X2Rpc3BhdGNoX3RhYmxlIGV4dF9kaXNwYXRjaDsKK307CisKKy8vIHBlciBDcmVhdGVEZXZpY2Ugc3RydWN0dXJlCitzdHJ1Y3QgbG9hZGVyX2RldmljZSB7CisgICAgc3RydWN0IGxvYWRlcl9kZXZfZGlzcGF0Y2hfdGFibGUgbG9hZGVyX2Rpc3BhdGNoOworICAgIFZrRGV2aWNlIGNoYWluX2RldmljZTsgIC8vIGRldmljZSBvYmplY3QgZnJvbSB0aGUgZGlzcGF0Y2ggY2hhaW4KKyAgICBWa0RldmljZSBpY2RfZGV2aWNlOyAgICAvLyBkZXZpY2Ugb2JqZWN0IGZyb20gdGhlIGljZAorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm07CisKKyAgICAvLyBMaXN0IG9mIGFjdGl2YXRlZCBsYXllcnMuCisgICAgLy8gIGFwcF8gICAgICBpcyB0aGUgdmVyc2lvbiBiYXNlZCBvbiBleGFjdGx5IHdoYXQgdGhlIGFwcGxpY2F0aW9uIGFza2VkIGZvci4KKyAgICAvLyAgICAgICAgICAgIFRoaXMgaXMgd2hhdCBtdXN0IGJlIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBvbiBFbnVtZXJhdGUgY2FsbHMuCisgICAgLy8gIGV4cGFuZGVkXyBpcyB0aGUgdmVyc2lvbiBiYXNlZCBvbiBleHBhbmRpbmcgbWV0YS1sYXllcnMgaW50byB0aGVpcgorICAgIC8vICAgICAgICAgICAgaW5kaXZpZHVhbCBjb21wb25lbnQgbGF5ZXJzLiAgVGhpcyBpcyB3aGF0IGlzIHVzZWQgaW50ZXJuYWxseS4KKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgYXBwX2FjdGl2YXRlZF9sYXllcl9saXN0OworICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCBleHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdDsKKworICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY19jYWxsYmFja3M7CisKKyAgICAvLyBMaXN0IG9mIGFjdGl2YXRlZCBkZXZpY2UgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgdGVybWluYXRvcnMgaW1wbGVtZW50ZWQgaW4gdGhlIGxvYWRlcgorICAgIHN0cnVjdCB7CisgICAgICAgIGJvb2wga2hyX3N3YXBjaGFpbl9lbmFibGVkOworICAgICAgICBib29sIGtocl9kaXNwbGF5X3N3YXBjaGFpbl9lbmFibGVkOworICAgICAgICBib29sIGtocl9kZXZpY2VfZ3JvdXBfZW5hYmxlZDsKKyAgICAgICAgYm9vbCBleHRfZGVidWdfbWFya2VyX2VuYWJsZWQ7CisgICAgICAgIGJvb2wgZXh0X2RlYnVnX3V0aWxzX2VuYWJsZWQ7CisgICAgICAgIGJvb2wgZXh0X2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZV9lbmFibGVkOworICAgIH0gZXh0ZW5zaW9uczsKKworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpuZXh0OworfTsKKworLy8gUGVyIElDRCBpbmZvcm1hdGlvbgorCisvLyBQZXIgSUNEIHN0cnVjdHVyZQorc3RydWN0IGxvYWRlcl9pY2RfdGVybSB7CisgICAgLy8gcG9pbnRlcnMgdG8gZmluZCBvdGhlciBzdHJ1Y3RzCisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9zY2FubmVkX2ljZCAqc2Nhbm5lZF9pY2Q7CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqdGhpc19pbnN0YW5jZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqbG9naWNhbF9kZXZpY2VfbGlzdDsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlOyAgLy8gaW5zdGFuY2Ugb2JqZWN0IGZyb20gdGhlIGljZAorICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm1fZGlzcGF0Y2ggZGlzcGF0Y2g7CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICpuZXh0OworCisgICAgUEZOX1BoeXNEZXZFeHQgcGh5c19kZXZfZXh0W01BWF9OVU1fVU5LTk9XTl9FWFRTXTsKK307CisKKy8vIFBlciBJQ0QgbGlicmFyeSBzdHJ1Y3R1cmUKK3N0cnVjdCBsb2FkZXJfaWNkX3RyYW1wX2xpc3QgeworICAgIHNpemVfdCBjYXBhY2l0eTsKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICBzdHJ1Y3QgbG9hZGVyX3NjYW5uZWRfaWNkICpzY2FubmVkX2xpc3Q7Cit9OworCitzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlIHsKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlIGxheWVyX2luc3RfZGlzcDsgIC8vIG11c3QgYmUgZmlyc3QgZW50cnkgaW4gc3RydWN0dXJlCisKKyAgICAvLyBQaHlzaWNhbCBkZXZpY2UgZnVuY3Rpb25zIHVua25vd24gdG8gdGhlIGxvYWRlcgorICAgIFBGTl9QaHlzRGV2RXh0IHBoeXNfZGV2X2V4dFtNQVhfTlVNX1VOS05PV05fRVhUU107Cit9OworCisvLyBQZXIgaW5zdGFuY2Ugc3RydWN0dXJlCitzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlICpkaXNwOyAgLy8gbXVzdCBiZSBmaXJzdCBlbnRyeSBpbiBzdHJ1Y3R1cmUKKworICAgIC8vIFZ1bGthbiBBUEkgdmVyc2lvbiB0aGUgYXBwIGlzIGludGVuZGluZyB0byB1c2UuCisgICAgdWludDE2X3QgYXBwX2FwaV9tYWpvcl92ZXJzaW9uOworICAgIHVpbnQxNl90IGFwcF9hcGlfbWlub3JfdmVyc2lvbjsKKworICAgIC8vIFdlIG5lZWQgdG8gbWFudWFsbHkgdHJhY2sgcGh5c2ljYWwgZGV2aWNlcyBvdmVyIHRpbWUuICBJZiB0aGUgdXNlcgorICAgIC8vIHJlLXF1ZXJpZXMgdGhlIGluZm9ybWF0aW9uLCB3ZSBkb24ndCB3YW50IHRvIGRlbGV0ZSBvbGQgZGF0YSBvcgorICAgIC8vIGNyZWF0ZSBuZXcgZGF0YSB1bmxlc3MgbmVjZXNzYXJ5LgorICAgIHVpbnQzMl90IHRvdGFsX2dwdV9jb3VudDsKKyAgICB1aW50MzJfdCBwaHlzX2Rldl9jb3VudF90ZXJtOworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKipwaHlzX2RldnNfdGVybTsKKyAgICB1aW50MzJfdCBwaHlzX2Rldl9jb3VudF90cmFtcDsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqKnBoeXNfZGV2c190cmFtcDsKKworICAgIC8vIFdlIGFsc28gbmVlZCB0byBtYW51YWxseSB0cmFjayBwaHlzaWNhbCBkZXZpY2UgZ3JvdXBzLCBidXQgd2UgZG9uJ3QgbmVlZAorICAgIC8vIGxvYWRlciBzcGVjaWZpYyBzdHJ1Y3R1cmVzIHNpbmNlIHdlIGhhdmUgdGhhdCBjb250ZW50IGluIHRoZSBwaHlzaWNhbAorICAgIC8vIGRldmljZSBzdG9yZWQgaW50ZXJuYWwgdG8gdGhlIHB1YmxpYyBzdHJ1Y3R1cmVzLgorICAgIHVpbnQzMl90IHBoeXNfZGV2X2dyb3VwX2NvdW50X3Rlcm07CisgICAgc3RydWN0IFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgKipwaHlzX2Rldl9ncm91cHNfdGVybTsKKyAgICB1aW50MzJfdCBwaHlzX2Rldl9ncm91cF9jb3VudF90cmFtcDsKKyAgICBzdHJ1Y3QgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyAqKnBoeXNfZGV2X2dyb3Vwc190cmFtcDsKKworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKm5leHQ7CisKKyAgICB1aW50MzJfdCB0b3RhbF9pY2RfY291bnQ7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm1zOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3RyYW1wX2xpc3QgaWNkX3RyYW1wX2xpc3Q7CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2Rpc3BhdGNoX2hhc2hfZW50cnkgZGV2X2V4dF9kaXNwX2hhc2hbTUFYX05VTV9VTktOT1dOX0VYVFNdOworICAgIHN0cnVjdCBsb2FkZXJfZGlzcGF0Y2hfaGFzaF9lbnRyeSBwaHlzX2Rldl9leHRfZGlzcF9oYXNoW01BWF9OVU1fVU5LTk9XTl9FWFRTXTsKKworICAgIHN0cnVjdCBsb2FkZXJfbXNnX2NhbGxiYWNrX21hcF9lbnRyeSAqaWNkX21zZ19jYWxsYmFja19tYXA7CisKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgaW5zdGFuY2VfbGF5ZXJfbGlzdDsKKyAgICBib29sIG92ZXJyaWRlX2xheWVyX3ByZXNlbnQ7CisKKyAgICAvLyBMaXN0IG9mIGFjdGl2YXRlZCBsYXllcnMuCisgICAgLy8gIGFwcF8gICAgICBpcyB0aGUgdmVyc2lvbiBiYXNlZCBvbiBleGFjdGx5IHdoYXQgdGhlIGFwcGxpY2F0aW9uIGFza2VkIGZvci4KKyAgICAvLyAgICAgICAgICAgIFRoaXMgaXMgd2hhdCBtdXN0IGJlIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBvbiBFbnVtZXJhdGUgY2FsbHMuCisgICAgLy8gIGV4cGFuZGVkXyBpcyB0aGUgdmVyc2lvbiBiYXNlZCBvbiBleHBhbmRpbmcgbWV0YS1sYXllcnMgaW50byB0aGVpcgorICAgIC8vICAgICAgICAgICAgaW5kaXZpZHVhbCBjb21wb25lbnQgbGF5ZXJzLiAgVGhpcyBpcyB3aGF0IGlzIHVzZWQgaW50ZXJuYWxseS4KKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgYXBwX2FjdGl2YXRlZF9sYXllcl9saXN0OworICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCBleHBhbmRlZF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdDsKKworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2U7ICAvLyBsYXllcnMvSUNEIGluc3RhbmNlIHJldHVybmVkIHRvIHRyYW1wb2xpbmUKKworICAgIHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgZXh0X2xpc3Q7ICAvLyBpY2RzIGFuZCBsb2FkZXJzIGV4dGVuc2lvbnMKKyAgICB1bmlvbiBsb2FkZXJfaW5zdGFuY2VfZXh0ZW5zaW9uX2VuYWJsZXMgZW5hYmxlZF9rbm93bl9leHRlbnNpb25zOworCisgICAgVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqRGJnRnVuY3Rpb25IZWFkOworICAgIHVpbnQzMl90IG51bV90bXBfcmVwb3J0X2NhbGxiYWNrczsKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICp0bXBfcmVwb3J0X2NyZWF0ZV9pbmZvczsKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKnRtcF9yZXBvcnRfY2FsbGJhY2tzOworICAgIHVpbnQzMl90IG51bV90bXBfbWVzc2VuZ2VyczsKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICp0bXBfbWVzc2VuZ2VyX2NyZWF0ZV9pbmZvczsKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKnRtcF9tZXNzZW5nZXJzOworCisgICAgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIGFsbG9jX2NhbGxiYWNrczsKKworICAgIGJvb2wgd3NpX3N1cmZhY2VfZW5hYmxlZDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgYm9vbCB3c2lfd2luMzJfc3VyZmFjZV9lbmFibGVkOworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgYm9vbCB3c2lfd2F5bGFuZF9zdXJmYWNlX2VuYWJsZWQ7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIGJvb2wgd3NpX3hjYl9zdXJmYWNlX2VuYWJsZWQ7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBib29sIHdzaV94bGliX3N1cmZhY2VfZW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIGJvb2wgd3NpX2FuZHJvaWRfc3VyZmFjZV9lbmFibGVkOworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIGJvb2wgd3NpX21hY29zX3N1cmZhY2VfZW5hYmxlZDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisgICAgYm9vbCB3c2lfaW9zX3N1cmZhY2VfZW5hYmxlZDsKKyNlbmRpZgorICAgIGJvb2wgd3NpX2hlYWRsZXNzX3N1cmZhY2VfZW5hYmxlZDsKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQpCisgICAgYm9vbCB3c2lfbWV0YWxfc3VyZmFjZV9lbmFibGVkOworI2VuZGlmCisgICAgYm9vbCB3c2lfZGlzcGxheV9lbmFibGVkOworICAgIGJvb2wgd3NpX2Rpc3BsYXlfcHJvcHMyX2VuYWJsZWQ7Cit9OworCisvLyBWa1BoeXNpY2FsRGV2aWNlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IGJ5IGxvYWRlci4gIEZpcnN0bHksIHRlcm1pbmF0b3IKKy8vIGNvZGUgbXVzdCBiZSBhYmxlIHRvIGdldCB0aGUgc3RydWN0IGxvYWRlcl9pY2RfdGVybSB0byBjYWxsIGludG8gdGhlIHByb3BlcgorLy8gZHJpdmVyICAobXVsdGlwbGUgSUNEL2dwdSBjYXNlKS4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHdyYXBwaW5nIHRoZQorLy8gY3JlYXRlZCBWa1BoeXNpY2FsRGV2aWNlIGluIGxvYWRlciB0ZXJtaW5hdGVfRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCkuCisvLyBTZWNvbmRseSwgdGhlIGxvYWRlciBtdXN0IGJlIGFibGUgdG8gaGFuZGxlIHdyYXBwZWQgYnkgbGF5ZXIgVmtQaHlzaWNhbERldmljZQorLy8gaW4gdHJhbXBvbGluZSBjb2RlLiAgVGhpcyBpbXBsaWVzLCB0aGF0IHRoZSBsb2FkZXIgdHJhbXBvbGluZSBjb2RlIG11c3QgYWxzbworLy8gd3JhcCB0aGUgVmtQaHlzaWNhbERldmljZSBvYmplY3QgaW4gdHJhbXBvbGluZSBjb2RlLiAgVGh1cywgbG9hZGVyIGhhcyB0bworLy8gd3JhcCB0aGUgVmtQaHlzaWNhbERldmljZSBjcmVhdGVkIG9iamVjdCB0d2ljZS4gSW4gdHJhbXBvbGluZSBjb2RlIGl0IGNhbid0CisvLyByZWx5IG9uIHRoZSB0ZXJtaW5hdG9yIG9iamVjdCB3cmFwcGluZyBzaW5jZSBhIGxheWVyIG1heSBhbHNvIHdyYXAuIFNpbmNlCisvLyB0cmFtcG9saW5lIGNvZGUgd3JhcHMgdGhlIFZrUGh5c2ljYWxEZXZpY2UgdGhpcyBtZWFucyBhbGwgbG9hZGVyIHRyYW1wb2xpbmUKKy8vIGNvZGUgdGhhdCBwYXNzZXMgYSBWa1BoeXNpY2FsRGV2aWNlIHNob3VsZCB1bndyYXAgaXQuCisKKy8vIFBlciBlbnVtZXJhdGVkIFBoeXNpY2FsRGV2aWNlIHN0cnVjdHVyZSwgdXNlZCB0byB3cmFwIGluIHRyYW1wb2xpbmUgY29kZSBhbmQKKy8vIGFsc28gc2FtZSBzdHJ1Y3R1cmUgdXNlZCB0byB3cmFwIGluIHRlcm1pbmF0b3IgY29kZQorc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgeworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUgKmRpc3A7ICAvLyBtdXN0IGJlIGZpcnN0IGVudHJ5IGluIHN0cnVjdHVyZQorICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnRoaXNfaW5zdGFuY2U7CisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzX2RldjsgIC8vIG9iamVjdCBmcm9tIGxheWVycy9sb2FkZXIgdGVybWluYXRvcgorfTsKKworLy8gUGVyIGVudW1lcmF0ZWQgUGh5c2ljYWxEZXZpY2Ugc3RydWN0dXJlLCB1c2VkIHRvIHdyYXAgaW4gdGVybWluYXRvciBjb2RlCitzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlICpkaXNwOyAgLy8gbXVzdCBiZSBmaXJzdCBlbnRyeSBpbiBzdHJ1Y3R1cmUKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICp0aGlzX2ljZF90ZXJtOworICAgIHVpbnQ4X3QgaWNkX2luZGV4OworICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c19kZXY7ICAvLyBvYmplY3QgZnJvbSBJQ0QKK307CisKK3N0cnVjdCBsb2FkZXJfc3RydWN0IHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0YW5jZXM7Cit9OworCitzdHJ1Y3QgbG9hZGVyX3NjYW5uZWRfaWNkIHsKKyAgICBjaGFyICpsaWJfbmFtZTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGhhbmRsZTsKKyAgICB1aW50MzJfdCBhcGlfdmVyc2lvbjsKKyAgICB1aW50MzJfdCBpbnRlcmZhY2VfdmVyc2lvbjsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIEdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBDcmVhdGVJbnN0YW5jZTsKKyAgICBQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpsb2FkZXJfaW5zdGFuY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSkgeyByZXR1cm4gKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpbnN0YW5jZTsgfQorCitzdGF0aWMgaW5saW5lIFZrUGh5c2ljYWxEZXZpY2UgbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSkgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICpwaHlzX2RldiA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqKXBoeXNpY2FsRGV2aWNlOworICAgIHJldHVybiBwaHlzX2Rldi0+cGh5c19kZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkZXJfc2V0X2Rpc3BhdGNoKHZvaWQgKm9iaiwgY29uc3Qgdm9pZCAqZGF0YSkgeyAqKChjb25zdCB2b2lkICoqKW9iaikgPSBkYXRhOyB9CisKK3N0YXRpYyBpbmxpbmUgVmtMYXllckRpc3BhdGNoVGFibGUgKmxvYWRlcl9nZXRfZGlzcGF0Y2goY29uc3Qgdm9pZCAqb2JqKSB7IHJldHVybiAqKChWa0xheWVyRGlzcGF0Y2hUYWJsZSAqKilvYmopOyB9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxvYWRlcl9kZXZfZGlzcGF0Y2hfdGFibGUgKmxvYWRlcl9nZXRfZGV2X2Rpc3BhdGNoKGNvbnN0IHZvaWQgKm9iaikgeworICAgIHJldHVybiAqKChzdHJ1Y3QgbG9hZGVyX2Rldl9kaXNwYXRjaF90YWJsZSAqKilvYmopOworfQorCitzdGF0aWMgaW5saW5lIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2goY29uc3Qgdm9pZCAqb2JqKSB7CisgICAgcmV0dXJuICooKFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKiopb2JqKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlICpsb2FkZXJfZ2V0X2luc3RhbmNlX2Rpc3BhdGNoKGNvbnN0IHZvaWQgKm9iaikgeworICAgIHJldHVybiAqKChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlICoqKW9iaik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkZXJfaW5pdF9kaXNwYXRjaCh2b2lkICpvYmosIGNvbnN0IHZvaWQgKmRhdGEpIHsKKyNpZmRlZiBERUJVRworICAgIGFzc2VydCh2YWxpZF9sb2FkZXJfbWFnaWNfdmFsdWUob2JqKSAmJgorICAgICAgICAgICAiSW5jb21wYXRpYmxlIElDRCwgZmlyc3QgZHdvcmQgbXVzdCBiZSBpbml0aWFsaXplZCB0byAiCisgICAgICAgICAgICJJQ0RfTE9BREVSX01BR0lDLiBTZWUgbG9hZGVyL1JFQURNRS5tZCBmb3IgZGV0YWlscy4iKTsKKyNlbmRpZgorCisgICAgbG9hZGVyX3NldF9kaXNwYXRjaChvYmosIGRhdGEpOworfQorCisvLyBHbG9iYWwgdmFyaWFibGVzIHVzZWQgYWNyb3NzIGZpbGVzCitleHRlcm4gc3RydWN0IGxvYWRlcl9zdHJ1Y3QgbG9hZGVyOworZXh0ZXJuIFRIUkVBRF9MT0NBTF9ERUNMIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnRsc19pbnN0YW5jZTsKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoTE9BREVSX0RZTkFNSUNfTElCKQorZXh0ZXJuIExPQURFUl9QTEFURk9STV9USFJFQURfT05DRV9ERUZJTklUSU9OKG9uY2VfaW5pdCk7CisjZW5kaWYKK2V4dGVybiBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4IGxvYWRlcl9sb2NrOworZXh0ZXJuIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggbG9hZGVyX2pzb25fbG9jazsKKworc3RydWN0IGxvYWRlcl9tc2dfY2FsbGJhY2tfbWFwX2VudHJ5IHsKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgaWNkX29iajsKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgbG9hZGVyX29iajsKK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiBkZWZpbml0aW9ucwordm9pZCAqbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdGFuY2UsIHNpemVfdCBzaXplLCBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBhbGxvY2F0aW9uU2NvcGUpOwordm9pZCBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3RhbmNlLCB2b2lkICpwTWVtb3J5KTsKK3ZvaWQgKmxvYWRlcl9pbnN0YW5jZV9oZWFwX3JlYWxsb2MoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdGFuY2UsIHZvaWQgKnBNZW1vcnksIHNpemVfdCBvcmlnX3NpemUsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBhbGxvY19zY29wZSk7Cit2b2lkICpsb2FkZXJfaW5zdGFuY2VfdGxzX2hlYXBfYWxsb2Moc2l6ZV90IHNpemUpOwordm9pZCBsb2FkZXJfaW5zdGFuY2VfdGxzX2hlYXBfZnJlZSh2b2lkICpwTWVtb3J5KTsKK3ZvaWQgKmxvYWRlcl9kZXZpY2VfaGVhcF9hbGxvYyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2aWNlLCBzaXplX3Qgc2l6ZSwgVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUgYWxsb2NhdGlvblNjb3BlKTsKK3ZvaWQgbG9hZGVyX2RldmljZV9oZWFwX2ZyZWUoY29uc3Qgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldmljZSwgdm9pZCAqcE1lbW9yeSk7Cit2b2lkICpsb2FkZXJfZGV2aWNlX2hlYXBfcmVhbGxvYyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2aWNlLCB2b2lkICpwTWVtb3J5LCBzaXplX3Qgb3JpZ19zaXplLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlIGFsbG9jX3Njb3BlKTsKKwordm9pZCBsb2FkZXJfbG9nKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIFZrRmxhZ3MgbXNnX3R5cGUsIGludDMyX3QgbXNnX2NvZGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKworYm9vbCBjb21wYXJlX3ZrX2V4dGVuc2lvbl9wcm9wZXJ0aWVzKGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqb3AxLCBjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKm9wMik7CisKK1ZrUmVzdWx0IGxvYWRlclZhbGlkYXRlTGF5ZXJzKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IHVpbnQzMl90IGxheWVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKnBwRW5hYmxlZExheWVyTmFtZXMsIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqbGlzdCk7CisKK1ZrUmVzdWx0IGxvYWRlcl92YWxpZGF0ZV9pbnN0YW5jZV9leHRlbnNpb25zKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgKmljZF9leHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICppbnN0YW5jZV9sYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbyk7CisKK3ZvaWQgbG9hZGVyX2luaXRpYWxpemUodm9pZCk7Citib29sIGhhc192a19leHRlbnNpb25fcHJvcGVydHlfYXJyYXkoY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICp2a19leHRfcHJvcCwgY29uc3QgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpleHRfYXJyYXkpOworYm9vbCBoYXNfdmtfZXh0ZW5zaW9uX3Byb3BlcnR5KGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqdmtfZXh0X3Byb3AsIGNvbnN0IHN0cnVjdCBsb2FkZXJfZXh0ZW5zaW9uX2xpc3QgKmV4dF9saXN0KTsKKworVmtSZXN1bHQgbG9hZGVyX2FkZF90b19leHRfbGlzdChjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2V4dGVuc2lvbl9saXN0ICpleHRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJvcF9saXN0X2NvdW50LCBjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnByb3BzKTsKK1ZrUmVzdWx0IGxvYWRlcl9hZGRfdG9fZGV2X2V4dF9saXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZGV2aWNlX2V4dGVuc2lvbl9saXN0ICpleHRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcHJvcHMsIHVpbnQzMl90IGVudHJ5X2NvdW50LCBjaGFyICoqZW50cnlzKTsKK1ZrUmVzdWx0IGxvYWRlcl9hZGRfZGV2aWNlX2V4dGVuc2lvbnMoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyBmcEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxfZGV2aWNlLCBjb25zdCBjaGFyICpsaWJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqZXh0X2xpc3QpOworVmtSZXN1bHQgbG9hZGVyX2luaXRfZ2VuZXJpY19saXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZ2VuZXJpY19saXN0ICpsaXN0X2luZm8sIHNpemVfdCBlbGVtZW50X3NpemUpOwordm9pZCBsb2FkZXJfZGVzdHJveV9nZW5lcmljX2xpc3QoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKmxpc3QpOwordm9pZCBsb2FkZXJEZXN0cm95TGF5ZXJMaXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqbGF5ZXJfbGlzdCk7Cit2b2lkIGxvYWRlckRlbGV0ZUxheWVyTGlzdEFuZFByb3BlcnRpZXMoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsYXllcl9saXN0KTsKK3ZvaWQgbG9hZGVyQWRkTGF5ZXJOYW1lVG9MaXN0KGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGVudW0gbGF5ZXJfdHlwZV9mbGFncyB0eXBlX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpzb3VyY2VfbGlzdCwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICp0YXJnZXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqZXhwYW5kZWRfdGFyZ2V0X2xpc3QpOwordm9pZCBsb2FkZXJfc2Nhbm5lZF9pY2RfY2xlYXIoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9pY2RfdHJhbXBfbGlzdCAqaWNkX3RyYW1wX2xpc3QpOworVmtSZXN1bHQgbG9hZGVyX2ljZF9zY2FuKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfaWNkX3RyYW1wX2xpc3QgKmljZF90cmFtcF9saXN0KTsKK3ZvaWQgbG9hZGVyU2NhbkZvckxheWVycyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmluc3RhbmNlX2xheWVycyk7Cit2b2lkIGxvYWRlclNjYW5Gb3JJbXBsaWNpdExheWVycyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmluc3RhbmNlX2xheWVycyk7Citib29sIGxvYWRlckltcGxpY2l0TGF5ZXJJc0VuYWJsZWQoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3Qgc3RydWN0IGxvYWRlcl9sYXllcl9wcm9wZXJ0aWVzICpwcm9wKTsKK1ZrUmVzdWx0IGxvYWRlcl9nZXRfaWNkX2xvYWRlcl9pbnN0YW5jZV9leHRlbnNpb25zKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIHN0cnVjdCBsb2FkZXJfaWNkX3RyYW1wX2xpc3QgKmljZF90cmFtcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqaW5zdF9leHRzKTsKK3N0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmxvYWRlcl9nZXRfaWNkX2FuZF9kZXZpY2UoY29uc3QgVmtEZXZpY2UgZGV2aWNlLCBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqKmZvdW5kX2RldiwgdWludDMyX3QgKmljZF9pbmRleCk7Cit2b2lkIGxvYWRlcl9pbml0X2Rpc3BhdGNoX2Rldl9leHQoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldik7Cit2b2lkICpsb2FkZXJfZGV2X2V4dF9ncGEoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgY29uc3QgY2hhciAqZnVuY05hbWUpOwordm9pZCAqbG9hZGVyX2dldF9kZXZfZXh0X3RyYW1wb2xpbmUodWludDMyX3QgaW5kZXgpOworYm9vbCBsb2FkZXJfcGh5c19kZXZfZXh0X2dwYShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBjaGFyICpmdW5jTmFtZSwgYm9vbCBwZXJmb3JtX2NoZWNraW5nLCB2b2lkICoqdHJhbXBfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnRlcm1fYWRkcik7Cit2b2lkICpsb2FkZXJfZ2V0X3BoeXNfZGV2X2V4dF90cmFtcCh1aW50MzJfdCBpbmRleCk7Cit2b2lkICpsb2FkZXJfZ2V0X3BoeXNfZGV2X2V4dF90ZXJtaW4odWludDMyX3QgaW5kZXgpOworc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqbG9hZGVyX2dldF9pbnN0YW5jZShjb25zdCBWa0luc3RhbmNlIGluc3RhbmNlKTsKK3ZvaWQgbG9hZGVyRGVhY3RpdmF0ZUxheWVycyhjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICpsaXN0KTsKK3N0cnVjdCBsb2FkZXJfZGV2aWNlICpsb2FkZXJfY3JlYXRlX2xvZ2ljYWxfZGV2aWNlKGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcik7Cit2b2lkIGxvYWRlcl9hZGRfbG9naWNhbF9kZXZpY2UoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmZvdW5kX2Rldik7Cit2b2lkIGxvYWRlcl9yZW1vdmVfbG9naWNhbF9kZXZpY2UoY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmZvdW5kX2RldiwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKTsKKy8vIE5PVEU6IE91dHNpZGUgb2YgbG9hZGVyLCB0aGlzIGVudHJ5LXBvaW50IGlzIG9ubHkgcHJvdmlkZWQgZm9yIGVycm9yCisvLyBjbGVhbnVwLgordm9pZCBsb2FkZXJfZGVzdHJveV9sb2dpY2FsX2RldmljZShjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpOworCitWa1Jlc3VsdCBsb2FkZXJFbmFibGVJbnN0YW5jZUxheWVycyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LCBjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmluc3RhbmNlX2xheWVycyk7CisKK1ZrUmVzdWx0IGxvYWRlcl9jcmVhdGVfaW5zdGFuY2VfY2hhaW4oY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QsIFZrSW5zdGFuY2UgKmNyZWF0ZWRfaW5zdGFuY2UpOworCit2b2lkIGxvYWRlckFjdGl2YXRlSW5zdGFuY2VMYXllckV4dGVuc2lvbnMoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCwgVmtJbnN0YW5jZSBjcmVhdGVkX2luc3QpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgbG9hZGVyX2xheWVyX2NyZWF0ZV9kZXZpY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBsYXllckdJUEEsIFBGTl92a0dldERldmljZVByb2NBZGRyICpuZXh0R0RQQSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBsb2FkZXJfbGF5ZXJfZGVzdHJveV9kZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZOX3ZrRGVzdHJveURldmljZSBkZXN0cm95RnVuY3Rpb24pOworCitWa1Jlc3VsdCBsb2FkZXJfY3JlYXRlX2RldmljZV9jaGFpbihjb25zdCBWa1BoeXNpY2FsRGV2aWNlIHBkLCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldiwgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBjYWxsaW5nTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciAqbGF5ZXJOZXh0R0RQQSk7CisKK1ZrUmVzdWx0IGxvYWRlcl92YWxpZGF0ZV9kZXZpY2VfZXh0ZW5zaW9ucyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICp0aGlzX2luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCAqYWN0aXZhdGVkX2RldmljZV9sYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9leHRlbnNpb25fbGlzdCAqaWNkX2V4dHMsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pOworCitWa1Jlc3VsdCBzZXR1cExvYWRlclRyYW1wUGh5c0RldnMoVmtJbnN0YW5jZSBpbnN0YW5jZSk7CitWa1Jlc3VsdCBzZXR1cExvYWRlclRlcm1QaHlzRGV2cyhzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0KTsKKworVmtTdHJpbmdFcnJvckZsYWdzIHZrX3N0cmluZ192YWxpZGF0ZShjb25zdCBpbnQgbWF4X2xlbmd0aCwgY29uc3QgY2hhciAqY2hhcl9hcnJheSk7CisKKyNlbmRpZiAgLy8gTE9BREVSX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvbG9hZGVyLnJjIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9sb2FkZXIucmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjcwNTEyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvbG9hZGVyLnJjCkBAIC0wLDAgKzEsOTggQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisvLyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorLy8gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTkgTHVuYXJHLCBJbmMuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworLy8gQXV0aG9yOiBEYXZpZCBQaW5lZG8gPGRhdmlkQGx1bmFyZy5jb20+CisvLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdGFydCBjdXN0b21pemUgc2VjdGlvbgorLy8gRWRpdCB0aGlzIHNlY3Rpb24gZm9yIHlvdXIgYnVpbGQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBWRVJTSU9OX01BSk9SICAgICAgICAgICAgICAgMQorI2RlZmluZSBWRVJTSU9OX01JTk9SICAgICAgICAgICAgICAgMAorI2RlZmluZSBWRVJTSU9OX1BBVENIICAgICAgICAgICAgICAgMTExMQorI2RlZmluZSBWRVJTSU9OX0JVSUxETk8gICAgICAgICAgICAgMjIyMgorCisjZGVmaW5lIFZFUlNJT05fQlVJTERfREVTQ1JJUFRJT04gICAiRGV2IEJ1aWxkIgorCisvLyBBbGwgYnVpbGRzIGV4Y2VwdCByZWxlYXNlIGJ1aWxkcyBzaG91bGQgc2V0IHRoaXMgdG8gMC4KKy8vIFJlbGVhc2UgYnVpbGRzIHNob3VsZCBzZXQgdGhpcyB0byAxLgorI2RlZmluZSBWRVJTSU9OX0lTX1JFTEVBU0VCVUlMRCAgICAgICAgMAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVuZCBvZiBjdXN0b21pemUgc2VjdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSAid2lucmVzLmgiCisKKyNkZWZpbmUgVkVSX0ZJTEVfVkVSU0lPTiAgICAgICAgICAgIFZFUlNJT05fTUFKT1IsIFZFUlNJT05fTUlOT1IsIFZFUlNJT05fUEFUQ0gsIFZFUlNJT05fQlVJTEROTworCisjZGVmaW5lIFNUUklOR0laRTIocykgI3MKKyNkZWZpbmUgU1RSSU5HSVpFKHMpIFNUUklOR0laRTIocykKKworI2lmIFZFUlNJT05fSVNfUkVMRUFTRUJVSUxEPT0xCisgICAjZGVmaW5lIFZFUl9GSUxFX0RFU0NSSVBUSU9OX1NUUiAgICAiVnVsa2FuIExvYWRlciIKKyAgICNkZWZpbmUgVkVSX0ZJTEVfVkVSU0lPTl9TVFIgICAgICAgIFNUUklOR0laRShWRVJTSU9OX01BSk9SKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iIFNUUklOR0laRShWRVJTSU9OX01JTk9SKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIgU1RSSU5HSVpFKFZFUlNJT05fUEFUQ0gpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiBTVFJJTkdJWkUoVkVSU0lPTl9CVUlMRE5PKQorI2Vsc2UKKyAgICNkZWZpbmUgVkVSX0ZJTEVfREVTQ1JJUFRJT05fU1RSICAgICJWdWxrYW4gTG9hZGVyIC0gIiBWRVJTSU9OX0JVSUxEX0RFU0NSSVBUSU9OCisgICAjZGVmaW5lIFZFUl9GSUxFX1ZFUlNJT05fU1RSICAgICAgICBTVFJJTkdJWkUoVkVSU0lPTl9NQUpPUikgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiBTVFJJTkdJWkUoVkVSU0lPTl9NSU5PUikgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iIFNUUklOR0laRShWRVJTSU9OX1BBVENIKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIgU1RSSU5HSVpFKFZFUlNJT05fQlVJTEROTykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iIFZFUlNJT05fQlVJTERfREVTQ1JJUFRJT04KKyNlbmRpZgorCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIFZFUl9GSUxFX1ZFUlNJT04KKyBQUk9EVUNUVkVSU0lPTiBWRVJfRklMRV9WRVJTSU9OCisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyBWU19GRl9ERUJVRworI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisKKyBGSUxFT1MgMHgwMDAwMEwKKyBGSUxFVFlQRSBWRlRfRExMCisgRklMRVNVQlRZUEUgMHgwTAorQkVHSU4KKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIjA0MDkwMDAwIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsIFZFUl9GSUxFX0RFU0NSSVBUSU9OX1NUUgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgVkVSX0ZJTEVfVkVSU0lPTl9TVFIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOSIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJWdWxrYW4gUnVudGltZSIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIFZFUl9GSUxFX1ZFUlNJT05fU1RSCisgICAgICAgIEVORAorICAgIEVORAorICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMDAwMAorICAgIEVORAorRU5ECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2xvYWRlcl9jbWFrZV9jb25maWcuaC5pbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvbG9hZGVyX2NtYWtlX2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmM0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL2xvYWRlcl9jbWFrZV9jb25maWcuaC5pbgpAQCAtMCwwICsxLDIgQEAKKyNjbWFrZWRlZmluZSBIQVZFX1NFQ1VSRV9HRVRFTlYKKyNjbWFrZWRlZmluZSBIQVZFX19fU0VDVVJFX0dFVEVOVgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9tdXJtdXJoYXNoLmMgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL211cm11cmhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGYwZDVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9tdXJtdXJoYXNoLmMKQEAgLTAsMCArMSw5OCBAQAorCisvKioKKyAqIGBtdXJtdXJoYXNoLmgnIC0gbXVybXVyaGFzaAorICoKKyAqIGNvcHlyaWdodCAoYykgMjAxNCBqb3NlcGggd2VybGUgPGpvc2VwaC53ZXJsZUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIk1hdGVyaWFscyIpLCB0bworICogZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisgKgorICogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgTUFURVJJQUxTIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibXVybXVyaGFzaC5oIgorCit1aW50MzJfdCBtdXJtdXJoYXNoKGNvbnN0IGNoYXIgKmtleSwgc2l6ZV90IGxlbiwgdWludDMyX3Qgc2VlZCkgeworICAgIHVpbnQzMl90IGMxID0gMHhjYzllMmQ1MTsKKyAgICB1aW50MzJfdCBjMiA9IDB4MWI4NzM1OTM7CisgICAgdWludDMyX3QgcjEgPSAxNTsKKyAgICB1aW50MzJfdCByMiA9IDEzOworICAgIHVpbnQzMl90IG0gPSA1OworICAgIHVpbnQzMl90IG4gPSAweGU2NTQ2YjY0OworICAgIHVpbnQzMl90IGggPSAwOworICAgIHVpbnQzMl90IGsgPSAwOworICAgIHVpbnQ4X3QgKmQgPSAodWludDhfdCAqKWtleTsgIC8vIDMyIGJpdCBleHRyYWN0IGZyb20gYGtleScKKyAgICBjb25zdCB1aW50MzJfdCAqY2h1bmtzID0gTlVMTDsKKyAgICBjb25zdCB1aW50OF90ICp0YWlsID0gTlVMTDsgIC8vIHRhaWwgLSBsYXN0IDggYnl0ZXMKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGwgPSAoaW50KWxlbiAvIDQ7ICAvLyBjaHVuayBsZW5ndGgKKworICAgIGggPSBzZWVkOworCisgICAgY2h1bmtzID0gKGNvbnN0IHVpbnQzMl90ICopKGQgKyBsICogNCk7ICAvLyBib2R5CisgICAgdGFpbCA9IChjb25zdCB1aW50OF90ICopKGQgKyBsICogNCk7ICAgICAvLyBsYXN0IDggYnl0ZSBjaHVuayBvZiBga2V5JworCisgICAgLy8gZm9yIGVhY2ggNCBieXRlIGNodW5rIG9mIGBrZXknCisgICAgZm9yIChpID0gLWw7IGkgIT0gMDsgKytpKSB7CisgICAgICAgIC8vIG5leHQgNCBieXRlIGNodW5rIG9mIGBrZXknCisgICAgICAgIGsgPSBjaHVua3NbaV07CisKKyAgICAgICAgLy8gZW5jb2RlIG5leHQgNCBieXRlIGNodW5rIG9mIGBrZXknCisgICAgICAgIGsgKj0gYzE7CisgICAgICAgIGsgPSAoayA8PCByMSkgfCAoayA+PiAoMzIgLSByMSkpOworICAgICAgICBrICo9IGMyOworCisgICAgICAgIC8vIGFwcGVuZCB0byBoYXNoCisgICAgICAgIGggXj0gazsKKyAgICAgICAgaCA9IChoIDw8IHIyKSB8IChoID4+ICgzMiAtIHIyKSk7CisgICAgICAgIGggPSBoICogbSArIG47CisgICAgfQorCisgICAgayA9IDA7CisKKyAgICAvLyByZW1haW5kZXIKKyAgICBzd2l0Y2ggKGxlbiAmIDMpIHsgIC8vIGBsZW4gJSA0JworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBrIF49ICh0YWlsWzJdIDw8IDE2KTsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBrIF49ICh0YWlsWzFdIDw8IDgpOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGsgXj0gdGFpbFswXTsKKyAgICAgICAgICAgIGsgKj0gYzE7CisgICAgICAgICAgICBrID0gKGsgPDwgcjEpIHwgKGsgPj4gKDMyIC0gcjEpKTsKKyAgICAgICAgICAgIGsgKj0gYzI7CisgICAgICAgICAgICBoIF49IGs7CisgICAgfQorCisgICAgaCBePSBsZW47CisKKyAgICBoIF49IChoID4+IDE2KTsKKyAgICBoICo9IDB4ODVlYmNhNmI7CisgICAgaCBePSAoaCA+PiAxMyk7CisgICAgaCAqPSAweGMyYjJhZTM1OworICAgIGggXj0gKGggPj4gMTYpOworCisgICAgcmV0dXJuIGg7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL211cm11cmhhc2guaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvbXVybXVyaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTUzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL211cm11cmhhc2guaApAQCAtMCwwICsxLDUyIEBACisKKy8qKgorICogYG11cm11cmhhc2guaCcgLSBtdXJtdXJoYXNoCisgKgorICogY29weXJpZ2h0IChjKSAyMDE0IGpvc2VwaCB3ZXJsZSA8am9zZXBoLndlcmxlQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiTWF0ZXJpYWxzIiksIHRvCisgKiBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyAqCisgKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBNQVRFUklBTFMgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KKyAqLworCisjaWZuZGVmIE1VUk1VUkhBU0hfSAorI2RlZmluZSBNVVJNVVJIQVNIX0ggMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgTVVSTVVSSEFTSF9WRVJTSU9OICIwLjAuMyIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFJldHVybnMgYSBtdXJtdXIgaGFzaCBvZiBga2V5JyBiYXNlZCBvbiBgc2VlZCcKKyAqIHVzaW5nIHRoZSBNdXJtdXJIYXNoMyBhbGdvcml0aG0KKyAqLworCit1aW50MzJfdCBtdXJtdXJoYXNoKGNvbnN0IGNoYXIgKmtleSwgc2l6ZV90IGxlbiwgdWludDMyX3Qgc2VlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci9waHlzX2Rldl9leHQuYyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvcGh5c19kZXZfZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMGVmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvcGh5c19kZXZfZXh0LmMKQEAgLTAsMCArMSwxMDU2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0xNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMTcgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNi0xNyBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgWW91bmcgPG1hcmt5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IExlbm55IEtvbW93IDxsZW5ueUBsdW5hcmcuY29tPgorICoKKyAqLworCisvLyBUaGlzIGNvZGUgaXMgdXNlZCB0byBlbmFibGUgZ2VuZXJpYyBpbnN0YW5jZSBleHRlbnNpb25zIHdoaWNoIHVzZSBhIHBoeXNpY2FsIGRldmljZQorLy8gYXMgdGhlIGZpcnN0IHBhcmFtZXRlci4gIElmIHRoZSBleHRlbnNpb24gaXMgYWxyZWFkeSBrbm93biBieSB0aGUgbG9hZGVyLCBpdCB3aWxsCisvLyBub3QgdXNlIHRoaXMgY29kZSwgYnV0IGluc3RlYWQgdXNlIHRoZSBtb3JlIGRpcmVjdCByb3V0ZS4gIEhvd2V2ZXIsIGlmIGl0IGlzCisvLyB1bmtub3duIHRvIHRoZSBsb2FkZXIsIGl0IHdpbGwgdXNlIHRoaXMgY29kZS4gIFRlY2huaWNhbGx5LCB0aGlzIGlzIG5vdCB0cmFtcG9saW5lCisvLyBjb2RlIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gb3B0aW1pemUgaXQgb3V0LgorCisjaW5jbHVkZSAidmtfbG9hZGVyX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAibG9hZGVyLmgiCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX2NsYW5nX18pCisjcHJhZ21hIEdDQyBvcHRpbWl6ZSgzKSAgLy8gZm9yY2UgZ2NjIHRvIHVzZSB0YWlsLWNhbGxzCisjZW5kaWYKKworLy8gRGVjbGFyYXRpb25zIGZvciB0aGUgdHJhbXBvbGluZQorVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxOShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDI0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyNShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDI3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyOChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDMwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAzMShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMzIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDMzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAzNChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMzUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDM2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAzNyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMzgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDM5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA0MChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNDEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDQyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA0MyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNDQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDQ1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA0NihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNDcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDQ4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA0OShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNTAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDUxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA1MihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNTMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDU0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA1NShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNTYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDU3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA1OChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNTkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDYwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA2MShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNjIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDYzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA2NChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNjUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDY2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA2NyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNjgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDY5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA3MChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNzEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDcyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA3MyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNzQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDc1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA3NihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wNzcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDc4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA3OShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wODAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDgxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA4MihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wODMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDg0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA4NShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wODYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDg3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA4OChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wODkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDkwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA5MShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wOTIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDkzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA5NChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wOTUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDk2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXA5NyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wOTgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDk5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMDAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEwMShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTAyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMDMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEwNChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTA1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMDYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEwNyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTA4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMDkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDExMChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTExKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMTIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDExMyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTE0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMTUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDExNihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTE3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMTgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDExOShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTIwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMjEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEyMihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTIzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMjQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEyNShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTI2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMjcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEyOChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTI5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMzAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEzMShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTMyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMzMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEzNChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTM1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMzYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDEzNyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTM4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxMzkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE0MChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTQxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNDIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE0MyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTQ0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNDUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE0NihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTQ3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNDgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE0OShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTUwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNTEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE1MihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTUzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNTQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE1NShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTU2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNTcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE1OChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTU5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNjAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE2MShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTYyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNjMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE2NChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTY1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNjYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE2NyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTY4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNjkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE3MChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTcxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNzIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE3MyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTc0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNzUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE3NihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTc3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxNzgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE3OShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTgwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxODEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE4MihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTgzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxODQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE4NShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTg2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxODcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE4OChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTg5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxOTAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE5MShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTkyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxOTMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE5NChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTk1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxOTYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDE5NyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMTk4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAxOTkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIwMChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjAxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMDIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIwMyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjA0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMDUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIwNihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjA3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMDgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIwOShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjEwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMTEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIxMihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjEzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMTQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIxNShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjE2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMTcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIxOChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjE5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMjAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIyMShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjIyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMjMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIyNChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjI1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMjYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIyNyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjI4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMjkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIzMChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjMxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMzIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIzMyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjM0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMzUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIzNihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjM3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyMzgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDIzOShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjQwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyNDEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDI0MihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjQzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyNDQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDI0NShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjQ2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAyNDcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUcmFtcDI0OChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRyYW1wMjQ5KFZrUGh5c2ljYWxEZXZpY2UpOworCisvLyBEaXNhYmxlIGNsYW5nLWZvcm1hdCBmb3IgbGlzdHMgb2YgbWFjcm9zCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW40KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW43KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluOChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjExKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMTIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjE0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMTUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjE3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMTgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjIwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMjEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjIzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMjQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjI2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMjcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yOChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjI5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMzAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4zMShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjMyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMzMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4zNChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjM1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMzYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4zNyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjM4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluMzkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW40MChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjQxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNDIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW40MyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjQ0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNDUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW40NihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjQ3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNDgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW40OShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjUwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNTEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW41MihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjUzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNTQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW41NShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjU2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNTcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW41OChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjU5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNjAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW42MShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjYyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNjMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW42NChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjY1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNjYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW42NyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjY4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNjkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW43MChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjcxKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNzIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW43MyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjc0KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNzUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW43NihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjc3KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluNzgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW43OShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjgwKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluODEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW44MihWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjgzKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluODQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW44NShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjg2KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluODcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW44OChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjg5KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluOTAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW45MShWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjkyKFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluOTMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW45NChWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjk1KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluOTYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW45NyhWa1BoeXNpY2FsRGV2aWNlKTsKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbjk4KFZrUGh5c2ljYWxEZXZpY2UpOworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VGVybWluOTkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMDkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMTkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMjkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xMzkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNDkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNTkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNjkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xNzkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xODkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4xOTkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMDkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMTkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMjkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yMzkoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDAoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDEoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDIoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDMoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDQoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDUoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDYoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDcoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDgoVmtQaHlzaWNhbERldmljZSk7CitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1BoeXNEZXZFeHRUZXJtaW4yNDkoVmtQaHlzaWNhbERldmljZSk7CisKKwordm9pZCAqbG9hZGVyX2dldF9waHlzX2Rldl9leHRfdHJhbXAodWludDMyX3QgaW5kZXgpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisjZGVmaW5lIFRSQU1QX0NBU0VfSEFORExFKG51bSkgY2FzZSBudW06IHJldHVybiB2a1BoeXNEZXZFeHRUcmFtcCMjbnVtCisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMik7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg0KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg3KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoOCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDExKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMTIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMyk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDE0KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMTUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNik7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDE3KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMTgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDIwKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMjEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMik7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDIzKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMjQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDI2KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMjcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyOCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDI5KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMzApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgzMSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDMyKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMzMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgzNCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDM1KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMzYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgzNyk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDM4KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoMzkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg0MCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDQxKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNDIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg0Myk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDQ0KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNDUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg0Nik7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDQ3KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNDgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg0OSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDUwKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNTEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg1Mik7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDUzKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNTQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg1NSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDU2KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNTcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg1OCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDU5KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNjApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg2MSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDYyKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNjMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg2NCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDY1KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNjYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg2Nyk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDY4KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNjkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg3MCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDcxKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNzIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg3Myk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDc0KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNzUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg3Nik7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDc3KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoNzgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg3OSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDgwKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoODEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg4Mik7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDgzKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoODQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg4NSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDg2KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoODcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg4OCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDg5KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoOTApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg5MSk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDkyKTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoOTMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg5NCk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDk1KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoOTYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSg5Nyk7CisgICAgICAgIFRSQU1QX0NBU0VfSEFORExFKDk4KTsKKyAgICAgICAgVFJBTVBfQ0FTRV9IQU5ETEUoOTkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMDkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMTkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMjkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxMzkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNDkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNTkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNjkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxNzkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxODkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgxOTkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMDkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMTkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMjkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyMzkpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDApOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDEpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDIpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDMpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDQpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDUpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDYpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDcpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDgpOworICAgICAgICBUUkFNUF9DQVNFX0hBTkRMRSgyNDkpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCAqbG9hZGVyX2dldF9waHlzX2Rldl9leHRfdGVybWluKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3dpdGNoIChpbmRleCkgeworI2RlZmluZSBURVJNX0NBU0VfSEFORExFKG51bSkgY2FzZSBudW06IHJldHVybiB2a1BoeXNEZXZFeHRUZXJtaW4jI251bQorICAgICAgICBURVJNX0NBU0VfSEFORExFKDApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDkpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEwKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEzKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE2KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE5KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIyKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDI1KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyNik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDI4KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyOSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMzApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDMxKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgzMik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMzMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDM0KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgzNSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMzYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDM3KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgzOCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMzkpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDQwKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg0MSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNDIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDQzKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg0NCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNDUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDQ2KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg0Nyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNDgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDQ5KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg1MCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNTEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDUyKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg1Myk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNTQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDU1KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg1Nik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNTcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDU4KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg1OSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNjApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDYxKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg2Mik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNjMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDY0KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg2NSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNjYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDY3KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg2OCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNjkpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDcwKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg3MSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNzIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDczKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg3NCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNzUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDc2KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg3Nyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoNzgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDc5KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg4MCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoODEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDgyKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg4Myk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoODQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDg1KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg4Nik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoODcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDg4KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg4OSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoOTApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDkxKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg5Mik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoOTMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDk0KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg5NSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoOTYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDk3KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSg5OCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoOTkpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEwMCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTAxKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMDIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEwMyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTA0KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMDUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEwNik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTA3KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMDgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEwOSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTEwKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMTEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDExMik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTEzKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMTQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDExNSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTE2KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMTcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDExOCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTE5KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMjApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEyMSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTIyKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMjMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEyNCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTI1KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMjYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEyNyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTI4KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMjkpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEzMCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTMxKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMzIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEzMyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTM0KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMzUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEzNik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTM3KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxMzgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDEzOSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTQwKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNDEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE0Mik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTQzKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNDQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE0NSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTQ2KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNDcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE0OCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTQ5KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNTApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE1MSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTUyKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNTMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE1NCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTU1KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNTYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE1Nyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTU4KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNTkpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE2MCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTYxKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNjIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE2Myk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTY0KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNjUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE2Nik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTY3KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNjgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE2OSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTcwKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNzEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE3Mik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTczKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNzQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE3NSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTc2KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxNzcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE3OCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTc5KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxODApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE4MSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTgyKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxODMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE4NCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTg1KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxODYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE4Nyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTg4KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxODkpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE5MCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTkxKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxOTIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE5Myk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTk0KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxOTUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE5Nik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMTk3KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgxOTgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDE5OSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjAwKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMDEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIwMik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjAzKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMDQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIwNSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjA2KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMDcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIwOCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjA5KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMTApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIxMSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjEyKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMTMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIxNCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjE1KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMTYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIxNyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjE4KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMTkpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIyMCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjIxKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMjIpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIyMyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjI0KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMjUpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIyNik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjI3KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMjgpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIyOSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjMwKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMzEpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIzMik7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjMzKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMzQpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIzNSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjM2KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyMzcpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDIzOCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjM5KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyNDApOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDI0MSk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjQyKTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyNDMpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDI0NCk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjQ1KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyNDYpOworICAgICAgICBURVJNX0NBU0VfSEFORExFKDI0Nyk7CisgICAgICAgIFRFUk1fQ0FTRV9IQU5ETEUoMjQ4KTsKKyAgICAgICAgVEVSTV9DQVNFX0hBTkRMRSgyNDkpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvdHJhbXBvbGluZS5jIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci90cmFtcG9saW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlZWE5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvdHJhbXBvbGluZS5jCkBAIC0wLDAgKzEsMjQ4MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKi8KKworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJsb2FkZXIuaCIKKyNpbmNsdWRlICJkZWJ1Z191dGlscy5oIgorI2luY2x1ZGUgIndzaS5oIgorI2luY2x1ZGUgInZrX2xvYWRlcl9leHRlbnNpb25zLmgiCisjaW5jbHVkZSAiZ3BhX2hlbHBlci5oIgorCisKKy8vIFRyYW1wb2xpbmUgZW50cnlwb2ludHMgYXJlIGluIHRoaXMgZmlsZSBmb3IgY29yZSBWdWxrYW4gY29tbWFuZHMKKworLy8gR2V0IGFuIGluc3RhbmNlIGxldmVsIG9yIGdsb2JhbCBsZXZlbCBlbnRyeSBwb2ludCBhZGRyZXNzLgorLy8gQHBhcmFtIGluc3RhbmNlCisvLyBAcGFyYW0gcE5hbWUKKy8vIEByZXR1cm4KKy8vICAgIElmIGluc3RhbmNlID09IE5VTEwgcmV0dXJucyBhIGdsb2JhbCBsZXZlbCBmdW5jdGlvbnMgb25seQorLy8gICAgSWYgaW5zdGFuY2UgaXMgdmFsaWQgcmV0dXJucyBhIHRyYW1wb2xpbmUgZW50cnkgcG9pbnQgZm9yIGFsbCBkaXNwYXRjaGFibGUgVnVsa2FuCisvLyAgICBmdW5jdGlvbnMgYm90aCBjb3JlIGFuZCBleHRlbnNpb25zLgorTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHZrR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyICpwTmFtZSkgeworICAgIHZvaWQgKmFkZHI7CisKKyAgICBhZGRyID0gZ2xvYmFsR2V0UHJvY0FkZHIocE5hbWUpOworICAgIGlmIChpbnN0YW5jZSA9PSBWS19OVUxMX0hBTkRMRSB8fCBhZGRyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGFkZHI7CisgICAgfQorCisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKHB0cl9pbnN0YW5jZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvLyBSZXR1cm4gdHJhbXBvbGluZSBjb2RlIGZvciBub24tZ2xvYmFsIGVudHJ5cG9pbnRzIGluY2x1ZGluZyBhbnkgZXh0ZW5zaW9ucy4KKyAgICAvLyBEZXZpY2UgZXh0ZW5zaW9ucyBhcmUgcmV0dXJuZWQgaWYgYSBsYXllciBvciBJQ0Qgc3VwcG9ydHMgdGhlIGV4dGVuc2lvbi4KKyAgICAvLyBJbnN0YW5jZSBleHRlbnNpb25zIGFyZSByZXR1cm5lZCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgYW5kIHRoZQorICAgIC8vIGxvYWRlciBvciBzb21lb25lIGVsc2Ugc3VwcG9ydHMgdGhlIGV4dGVuc2lvbgorICAgIHJldHVybiB0cmFtcG9saW5lR2V0UHJvY0FkZHIocHRyX2luc3RhbmNlLCBwTmFtZSk7Cit9CisKKy8vIEdldCBhIGRldmljZSBsZXZlbCBvciBnbG9iYWwgbGV2ZWwgZW50cnkgcG9pbnQgYWRkcmVzcy4KKy8vIEBwYXJhbSBkZXZpY2UKKy8vIEBwYXJhbSBwTmFtZQorLy8gQHJldHVybgorLy8gICAgSWYgZGV2aWNlIGlzIHZhbGlkLCByZXR1cm5zIGEgZGV2aWNlIHJlbGF0aXZlIGVudHJ5IHBvaW50IGZvciBkZXZpY2UgbGV2ZWwKKy8vICAgIGVudHJ5IHBvaW50cyBib3RoIGNvcmUgYW5kIGV4dGVuc2lvbnMuCisvLyAgICBEZXZpY2UgcmVsYXRpdmUgbWVhbnMgY2FsbCBkb3duIHRoZSBkZXZpY2UgY2hhaW4uCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VQcm9jQWRkcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IGNoYXIgKnBOYW1lKSB7CisgICAgdm9pZCAqYWRkcjsKKworICAgIC8vIEZvciBlbnRyeXBvaW50cyB0aGF0IGxvYWRlciBtdXN0IGhhbmRsZSAoaWUgbm9uLWRpc3BhdGNoYWJsZSBvciBjcmVhdGUgb2JqZWN0KQorICAgIC8vIG1ha2Ugc3VyZSB0aGUgbG9hZGVyIGVudHJ5cG9pbnQgaXMgcmV0dXJuZWQKKyAgICBhZGRyID0gbG9hZGVyX25vbl9wYXNzdGhyb3VnaF9nZHBhKHBOYW1lKTsKKyAgICBpZiAoYWRkcikgeworICAgICAgICByZXR1cm4gYWRkcjsKKyAgICB9CisKKyAgICAvLyBBbHRob3VnaCBDcmVhdGVEZXZpY2UgaXMgb24gZGV2aWNlIGNoYWluIGl0J3MgZGlzcGF0Y2hhYmxlIG9iamVjdCBpc24ndAorICAgIC8vIGEgVmtEZXZpY2Ugb3IgY2hpbGQgb2YgVmtEZXZpY2Ugc28gcmV0dXJuIE5VTEwuCisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJDcmVhdGVEZXZpY2UiKSkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBSZXR1cm4gdGhlIGRpc3BhdGNoIHRhYmxlIGVudHJ5cG9pbnQgZm9yIHRoZSBmYXN0ZXN0IGNhc2UKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcF90YWJsZSA9ICooVmtMYXllckRpc3BhdGNoVGFibGUgKiopZGV2aWNlOworICAgIGlmIChkaXNwX3RhYmxlID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgYWRkciA9IGxvYWRlcl9sb29rdXBfZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRpc3BfdGFibGUsIHBOYW1lKTsKKyAgICBpZiAoYWRkcikgcmV0dXJuIGFkZHI7CisKKyAgICBpZiAoZGlzcF90YWJsZS0+R2V0RGV2aWNlUHJvY0FkZHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGRpc3BfdGFibGUtPkdldERldmljZVByb2NBZGRyKGRldmljZSwgcE5hbWUpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHRsc19pbnN0YW5jZSA9IE5VTEw7CisgICAgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFKCZvbmNlX2luaXQsIGxvYWRlcl9pbml0aWFsaXplKTsKKworICAgIC8vIFdlIGtub3cgd2UgbmVlZCB0byBjYWxsIGF0IGxlYXN0IHRoZSB0ZXJtaW5hdG9yCisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICBWa0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc0NoYWluIGNoYWluX3RhaWwgPSB7CisgICAgICAgIC5oZWFkZXIgPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC50eXBlID0gVktfQ0hBSU5fVFlQRV9FTlVNRVJBVEVfSU5TVEFOQ0VfRVhURU5TSU9OX1BST1BFUlRJRVMsCisgICAgICAgICAgICAgICAgLnZlcnNpb24gPSBWS19DVVJSRU5UX0NIQUlOX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgLnNpemUgPSBzaXplb2YoY2hhaW5fdGFpbCksCisgICAgICAgICAgICB9LAorICAgICAgICAucGZuTmV4dExheWVyID0gJnRlcm1pbmF0b3JfRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLAorICAgICAgICAucE5leHRMaW5rID0gTlVMTCwKKyAgICB9OworICAgIFZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzQ2hhaW4gKmNoYWluX2hlYWQgPSAmY2hhaW5fdGFpbDsKKworICAgIC8vIEdldCB0aGUgaW1wbGljaXQgbGF5ZXJzCisgICAgc3RydWN0IGxvYWRlcl9sYXllcl9saXN0IGxheWVyczsKKyAgICBtZW1zZXQoJmxheWVycywgMCwgc2l6ZW9mKGxheWVycykpOworICAgIGxvYWRlclNjYW5Gb3JJbXBsaWNpdExheWVycyhOVUxMLCAmbGF5ZXJzKTsKKworICAgIC8vIFdlJ2xsIG5lZWQgdG8gc2F2ZSB0aGUgZGwgaGFuZGxlcyBzbyB3ZSBjYW4gY2xvc2UgdGhlbSBsYXRlcgorICAgIGxvYWRlcl9wbGF0Zm9ybV9kbF9oYW5kbGUgKmxpYnMgPSBtYWxsb2Moc2l6ZW9mKGxvYWRlcl9wbGF0Zm9ybV9kbF9oYW5kbGUpICogbGF5ZXJzLmNvdW50KTsKKyAgICBpZiAobGlicyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorICAgIHNpemVfdCBsaWJfY291bnQgPSAwOworCisgICAgLy8gUHJlcGVuZCBsYXllcnMgb250byB0aGUgY2hhaW4gaWYgdGhleSBpbXBsbWVudCB0aGlzIGVudHJ5IHBvaW50CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheWVycy5jb3VudDsgKytpKSB7CisgICAgICAgIGlmICghbG9hZGVySW1wbGljaXRMYXllcklzRW5hYmxlZChOVUxMLCBsYXllcnMubGlzdCArIGkpIHx8CisgICAgICAgICAgICBsYXllcnMubGlzdFtpXS5wcmVfaW5zdGFuY2VfZnVuY3Rpb25zLmVudW1lcmF0ZV9pbnN0YW5jZV9leHRlbnNpb25fcHJvcGVydGllc1swXSA9PSAnXDAnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV9kbF9oYW5kbGUgbGF5ZXJfbGliID0gbG9hZGVyX3BsYXRmb3JtX29wZW5fbGlicmFyeShsYXllcnMubGlzdFtpXS5saWJfbmFtZSk7CisgICAgICAgIGxpYnNbbGliX2NvdW50KytdID0gbGF5ZXJfbGliOworICAgICAgICB2b2lkICpwZm4gPSBsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsYXllcl9saWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVycy5saXN0W2ldLnByZV9pbnN0YW5jZV9mdW5jdGlvbnMuZW51bWVyYXRlX2luc3RhbmNlX2V4dGVuc2lvbl9wcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHBmbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKE5VTEwsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogVW5hYmxlIHRvIHJlc29sdmUgc3ltYm9sIFwiJXNcIiBpbiBpbXBsaWNpdCBsYXllciBsaWJyYXJ5IFwiJXNcIiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzLmxpc3RbaV0ucHJlX2luc3RhbmNlX2Z1bmN0aW9ucy5lbnVtZXJhdGVfaW5zdGFuY2VfZXh0ZW5zaW9uX3Byb3BlcnRpZXMsIGxheWVycy5saXN0W2ldLmxpYl9uYW1lKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgVmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNDaGFpbiAqY2hhaW5fbGluayA9IG1hbGxvYyhzaXplb2YoVmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNDaGFpbikpOworICAgICAgICBpZiAoY2hhaW5fbGluayA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNoYWluX2xpbmstPmhlYWRlci50eXBlID0gVktfQ0hBSU5fVFlQRV9FTlVNRVJBVEVfSU5TVEFOQ0VfRVhURU5TSU9OX1BST1BFUlRJRVM7CisgICAgICAgIGNoYWluX2xpbmstPmhlYWRlci52ZXJzaW9uID0gVktfQ1VSUkVOVF9DSEFJTl9WRVJTSU9OOworICAgICAgICBjaGFpbl9saW5rLT5oZWFkZXIuc2l6ZSA9IHNpemVvZigqY2hhaW5fbGluayk7CisgICAgICAgIGNoYWluX2xpbmstPnBmbk5leHRMYXllciA9IHBmbjsKKyAgICAgICAgY2hhaW5fbGluay0+cE5leHRMaW5rID0gY2hhaW5faGVhZDsKKworICAgICAgICBjaGFpbl9oZWFkID0gY2hhaW5fbGluazsKKyAgICB9CisKKyAgICAvLyBDYWxsIGRvd24gdGhlIGNoYWluCisgICAgaWYgKHJlcyA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIHJlcyA9IGNoYWluX2hlYWQtPnBmbk5leHRMYXllcihjaGFpbl9oZWFkLT5wTmV4dExpbmssIHBMYXllck5hbWUsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorCisgICAgLy8gRnJlZSB1cCB0aGUgbGF5ZXJzCisgICAgbG9hZGVyRGVsZXRlTGF5ZXJMaXN0QW5kUHJvcGVydGllcyhOVUxMLCAmbGF5ZXJzKTsKKworICAgIC8vIFRlYXIgZG93biB0aGUgY2hhaW4KKyAgICB3aGlsZSAoY2hhaW5faGVhZCAhPSAmY2hhaW5fdGFpbCkgeworICAgICAgICBWa0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc0NoYWluICpob2xkZXIgPSBjaGFpbl9oZWFkOworICAgICAgICBjaGFpbl9oZWFkID0gKFZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzQ2hhaW4gKiljaGFpbl9oZWFkLT5wTmV4dExpbms7CisgICAgICAgIGZyZWUoaG9sZGVyKTsKKyAgICB9CisKKyAgICAvLyBDbG9zZSB0aGUgZGwgaGFuZGxlcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGliX2NvdW50OyArK2kpIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX2Nsb3NlX2xpYnJhcnkobGlic1tpXSk7CisgICAgfQorICAgIGZyZWUobGlicyk7CisKKyAgICByZXR1cm4gcmVzOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgdGxzX2luc3RhbmNlID0gTlVMTDsKKyAgICBMT0FERVJfUExBVEZPUk1fVEhSRUFEX09OQ0UoJm9uY2VfaW5pdCwgbG9hZGVyX2luaXRpYWxpemUpOworCisgICAgLy8gV2Uga25vdyB3ZSBuZWVkIHRvIGNhbGwgYXQgbGVhc3QgdGhlIHRlcm1pbmF0b3IKKyAgICBWa1Jlc3VsdCByZXMgPSBWS19TVUNDRVNTOworICAgIFZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNDaGFpbiBjaGFpbl90YWlsID0geworICAgICAgICAuaGVhZGVyID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudHlwZSA9IFZLX0NIQUlOX1RZUEVfRU5VTUVSQVRFX0lOU1RBTkNFX0xBWUVSX1BST1BFUlRJRVMsCisgICAgICAgICAgICAgICAgLnZlcnNpb24gPSBWS19DVVJSRU5UX0NIQUlOX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgLnNpemUgPSBzaXplb2YoY2hhaW5fdGFpbCksCisgICAgICAgICAgICB9LAorICAgICAgICAucGZuTmV4dExheWVyID0gJnRlcm1pbmF0b3JfRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMsCisgICAgICAgIC5wTmV4dExpbmsgPSBOVUxMLAorICAgIH07CisgICAgVmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllc0NoYWluICpjaGFpbl9oZWFkID0gJmNoYWluX3RhaWw7CisKKyAgICAvLyBHZXQgdGhlIGltcGxpY2l0IGxheWVycworICAgIHN0cnVjdCBsb2FkZXJfbGF5ZXJfbGlzdCBsYXllcnM7CisgICAgbWVtc2V0KCZsYXllcnMsIDAsIHNpemVvZihsYXllcnMpKTsKKyAgICBsb2FkZXJTY2FuRm9ySW1wbGljaXRMYXllcnMoTlVMTCwgJmxheWVycyk7CisKKyAgICAvLyBXZSdsbCBuZWVkIHRvIHNhdmUgdGhlIGRsIGhhbmRsZXMgc28gd2UgY2FuIGNsb3NlIHRoZW0gbGF0ZXIKKyAgICBsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlICpsaWJzID0gbWFsbG9jKHNpemVvZihsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlKSAqIGxheWVycy5jb3VudCk7CisgICAgaWYgKGxpYnMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKyAgICBzaXplX3QgbGliX2NvdW50ID0gMDsKKworICAgIC8vIFByZXBlbmQgbGF5ZXJzIG9udG8gdGhlIGNoYWluIGlmIHRoZXkgaW1wbG1lbnQgdGhpcyBlbnRyeSBwb2ludAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXllcnMuY291bnQ7ICsraSkgeworICAgICAgICBpZiAoIWxvYWRlckltcGxpY2l0TGF5ZXJJc0VuYWJsZWQoTlVMTCwgbGF5ZXJzLmxpc3QgKyBpKSB8fAorICAgICAgICAgICAgbGF5ZXJzLmxpc3RbaV0ucHJlX2luc3RhbmNlX2Z1bmN0aW9ucy5lbnVtZXJhdGVfaW5zdGFuY2VfbGF5ZXJfcHJvcGVydGllc1swXSA9PSAnXDAnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV9kbF9oYW5kbGUgbGF5ZXJfbGliID0gbG9hZGVyX3BsYXRmb3JtX29wZW5fbGlicmFyeShsYXllcnMubGlzdFtpXS5saWJfbmFtZSk7CisgICAgICAgIGxpYnNbbGliX2NvdW50KytdID0gbGF5ZXJfbGliOworICAgICAgICB2b2lkICpwZm4gPQorICAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobGF5ZXJfbGliLCBsYXllcnMubGlzdFtpXS5wcmVfaW5zdGFuY2VfZnVuY3Rpb25zLmVudW1lcmF0ZV9pbnN0YW5jZV9sYXllcl9wcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHBmbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKE5VTEwsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogVW5hYmxlIHRvIHJlc29sdmUgc3ltYm9sIFwiJXNcIiBpbiBpbXBsaWNpdCBsYXllciBsaWJyYXJ5IFwiJXNcIiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzLmxpc3RbaV0ucHJlX2luc3RhbmNlX2Z1bmN0aW9ucy5lbnVtZXJhdGVfaW5zdGFuY2VfbGF5ZXJfcHJvcGVydGllcywgbGF5ZXJzLmxpc3RbaV0ubGliX25hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBWa0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzQ2hhaW4gKmNoYWluX2xpbmsgPSBtYWxsb2Moc2l6ZW9mKFZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNDaGFpbikpOworICAgICAgICBpZiAoY2hhaW5fbGluayA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNoYWluX2xpbmstPmhlYWRlci50eXBlID0gVktfQ0hBSU5fVFlQRV9FTlVNRVJBVEVfSU5TVEFOQ0VfTEFZRVJfUFJPUEVSVElFUzsKKyAgICAgICAgY2hhaW5fbGluay0+aGVhZGVyLnZlcnNpb24gPSBWS19DVVJSRU5UX0NIQUlOX1ZFUlNJT047CisgICAgICAgIGNoYWluX2xpbmstPmhlYWRlci5zaXplID0gc2l6ZW9mKCpjaGFpbl9saW5rKTsKKyAgICAgICAgY2hhaW5fbGluay0+cGZuTmV4dExheWVyID0gcGZuOworICAgICAgICBjaGFpbl9saW5rLT5wTmV4dExpbmsgPSBjaGFpbl9oZWFkOworCisgICAgICAgIGNoYWluX2hlYWQgPSBjaGFpbl9saW5rOworICAgIH0KKworICAgIC8vIENhbGwgZG93biB0aGUgY2hhaW4KKyAgICBpZiAocmVzID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgcmVzID0gY2hhaW5faGVhZC0+cGZuTmV4dExheWVyKGNoYWluX2hlYWQtPnBOZXh0TGluaywgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICAvLyBGcmVlIHVwIHRoZSBsYXllcnMKKyAgICBsb2FkZXJEZWxldGVMYXllckxpc3RBbmRQcm9wZXJ0aWVzKE5VTEwsICZsYXllcnMpOworCisgICAgLy8gVGVhciBkb3duIHRoZSBjaGFpbgorICAgIHdoaWxlIChjaGFpbl9oZWFkICE9ICZjaGFpbl90YWlsKSB7CisgICAgICAgIFZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNDaGFpbiAqaG9sZGVyID0gY2hhaW5faGVhZDsKKyAgICAgICAgY2hhaW5faGVhZCA9IChWa0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzQ2hhaW4gKiljaGFpbl9oZWFkLT5wTmV4dExpbms7CisgICAgICAgIGZyZWUoaG9sZGVyKTsKKyAgICB9CisKKyAgICAvLyBDbG9zZSB0aGUgZGwgaGFuZGxlcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGliX2NvdW50OyArK2kpIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX2Nsb3NlX2xpYnJhcnkobGlic1tpXSk7CisgICAgfQorICAgIGZyZWUobGlicyk7CisKKyAgICByZXR1cm4gcmVzOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbih1aW50MzJfdCogcEFwaVZlcnNpb24pIHsKKworICAgIHRsc19pbnN0YW5jZSA9IE5VTEw7CisgICAgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFKCZvbmNlX2luaXQsIGxvYWRlcl9pbml0aWFsaXplKTsKKworICAgIC8vIFdlIGtub3cgd2UgbmVlZCB0byBjYWxsIGF0IGxlYXN0IHRoZSB0ZXJtaW5hdG9yCisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICBWa0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbkNoYWluIGNoYWluX3RhaWwgPSB7CisgICAgICAgIC5oZWFkZXIgPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC50eXBlID0gVktfQ0hBSU5fVFlQRV9FTlVNRVJBVEVfSU5TVEFOQ0VfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAudmVyc2lvbiA9IFZLX0NVUlJFTlRfQ0hBSU5fVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAuc2l6ZSA9IHNpemVvZihjaGFpbl90YWlsKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIC5wZm5OZXh0TGF5ZXIgPSAmdGVybWluYXRvcl9FbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24sCisgICAgICAgIC5wTmV4dExpbmsgPSBOVUxMLAorICAgIH07CisgICAgVmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb25DaGFpbiAqY2hhaW5faGVhZCA9ICZjaGFpbl90YWlsOworCisgICAgLy8gR2V0IHRoZSBpbXBsaWNpdCBsYXllcnMKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgbGF5ZXJzOworICAgIG1lbXNldCgmbGF5ZXJzLCAwLCBzaXplb2YobGF5ZXJzKSk7CisgICAgbG9hZGVyU2NhbkZvckltcGxpY2l0TGF5ZXJzKE5VTEwsICZsYXllcnMpOworCisgICAgLy8gV2UnbGwgbmVlZCB0byBzYXZlIHRoZSBkbCBoYW5kbGVzIHNvIHdlIGNhbiBjbG9zZSB0aGVtIGxhdGVyCisgICAgbG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSAqbGlicyA9IG1hbGxvYyhzaXplb2YobG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSkgKiBsYXllcnMuY291bnQpOworICAgIGlmIChsaWJzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisgICAgc2l6ZV90IGxpYl9jb3VudCA9IDA7CisKKyAgICAvLyBQcmVwZW5kIGxheWVycyBvbnRvIHRoZSBjaGFpbiBpZiB0aGV5IGltcGxtZW50IHRoaXMgZW50cnkgcG9pbnQKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5ZXJzLmNvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKCFsb2FkZXJJbXBsaWNpdExheWVySXNFbmFibGVkKE5VTEwsIGxheWVycy5saXN0ICsgaSkgfHwKKyAgICAgICAgICAgIGxheWVycy5saXN0W2ldLnByZV9pbnN0YW5jZV9mdW5jdGlvbnMuZW51bWVyYXRlX2luc3RhbmNlX3ZlcnNpb25bMF0gPT0gJ1wwJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGxheWVyX2xpYiA9IGxvYWRlcl9wbGF0Zm9ybV9vcGVuX2xpYnJhcnkobGF5ZXJzLmxpc3RbaV0ubGliX25hbWUpOworICAgICAgICBsaWJzW2xpYl9jb3VudCsrXSA9IGxheWVyX2xpYjsKKyAgICAgICAgdm9pZCAqcGZuID0gbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobGF5ZXJfbGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMubGlzdFtpXS5wcmVfaW5zdGFuY2VfZnVuY3Rpb25zLmVudW1lcmF0ZV9pbnN0YW5jZV92ZXJzaW9uKTsKKyAgICAgICAgaWYgKHBmbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKE5VTEwsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogVW5hYmxlIHRvIHJlc29sdmUgc3ltYm9sIFwiJXNcIiBpbiBpbXBsaWNpdCBsYXllciBsaWJyYXJ5IFwiJXNcIiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzLmxpc3RbaV0ucHJlX2luc3RhbmNlX2Z1bmN0aW9ucy5lbnVtZXJhdGVfaW5zdGFuY2VfdmVyc2lvbiwgbGF5ZXJzLmxpc3RbaV0ubGliX25hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBWa0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbkNoYWluICpjaGFpbl9saW5rID0gbWFsbG9jKHNpemVvZihWa0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbkNoYWluKSk7CisgICAgICAgIGlmIChjaGFpbl9saW5rID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2hhaW5fbGluay0+aGVhZGVyLnR5cGUgPSBWS19DSEFJTl9UWVBFX0VOVU1FUkFURV9JTlNUQU5DRV9WRVJTSU9OOworICAgICAgICBjaGFpbl9saW5rLT5oZWFkZXIudmVyc2lvbiA9IFZLX0NVUlJFTlRfQ0hBSU5fVkVSU0lPTjsKKyAgICAgICAgY2hhaW5fbGluay0+aGVhZGVyLnNpemUgPSBzaXplb2YoKmNoYWluX2xpbmspOworICAgICAgICBjaGFpbl9saW5rLT5wZm5OZXh0TGF5ZXIgPSBwZm47CisgICAgICAgIGNoYWluX2xpbmstPnBOZXh0TGluayA9IGNoYWluX2hlYWQ7CisKKyAgICAgICAgY2hhaW5faGVhZCA9IGNoYWluX2xpbms7CisgICAgfQorCisgICAgLy8gQ2FsbCBkb3duIHRoZSBjaGFpbgorICAgIGlmIChyZXMgPT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXMgPSBjaGFpbl9oZWFkLT5wZm5OZXh0TGF5ZXIoY2hhaW5faGVhZC0+cE5leHRMaW5rLCBwQXBpVmVyc2lvbik7CisgICAgfQorCisgICAgLy8gRnJlZSB1cCB0aGUgbGF5ZXJzCisgICAgbG9hZGVyRGVsZXRlTGF5ZXJMaXN0QW5kUHJvcGVydGllcyhOVUxMLCAmbGF5ZXJzKTsKKworICAgIC8vIFRlYXIgZG93biB0aGUgY2hhaW4KKyAgICB3aGlsZSAoY2hhaW5faGVhZCAhPSAmY2hhaW5fdGFpbCkgeworICAgICAgICBWa0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbkNoYWluICpob2xkZXIgPSBjaGFpbl9oZWFkOworICAgICAgICBjaGFpbl9oZWFkID0gKFZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uQ2hhaW4gKiljaGFpbl9oZWFkLT5wTmV4dExpbms7CisgICAgICAgIGZyZWUoaG9sZGVyKTsKKyAgICB9CisKKyAgICAvLyBDbG9zZSB0aGUgZGwgaGFuZGxlcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGliX2NvdW50OyArK2kpIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX2Nsb3NlX2xpYnJhcnkobGlic1tpXSk7CisgICAgfQorICAgIGZyZWUobGlicyk7CisKKyAgICByZXR1cm4gcmVzOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUluc3RhbmNlKGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0luc3RhbmNlICpwSW5zdGFuY2UpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSBOVUxMOworICAgIFZrSW5zdGFuY2UgY3JlYXRlZF9pbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIGJvb2wgbG9hZGVyTG9ja2VkID0gZmFsc2U7CisgICAgVmtSZXN1bHQgcmVzID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworCisgICAgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFKCZvbmNlX2luaXQsIGxvYWRlcl9pbml0aWFsaXplKTsKKworI2lmIChERUJVR19ESVNBQkxFX0FQUF9BTExPQ0FUT1JTID09IDEpCisgICAgeworI2Vsc2UKKyAgICBpZiAocEFsbG9jYXRvcikgeworICAgICAgICBwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKXBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24ocEFsbG9jYXRvci0+cFVzZXJEYXRhLCBzaXplb2Yoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50ICopLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICBwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSkpOworICAgIH0KKworICAgIFZrSW5zdGFuY2VDcmVhdGVJbmZvIGljaSA9ICpwQ3JlYXRlSW5mbzsKKworICAgIGlmIChwdHJfaW5zdGFuY2UgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHRsc19pbnN0YW5jZSA9IHB0cl9pbnN0YW5jZTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICBsb2FkZXJMb2NrZWQgPSB0cnVlOworICAgIG1lbXNldChwdHJfaW5zdGFuY2UsIDAsIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlKSk7CisgICAgaWYgKHBBbGxvY2F0b3IpIHsKKyAgICAgICAgcHRyX2luc3RhbmNlLT5hbGxvY19jYWxsYmFja3MgPSAqcEFsbG9jYXRvcjsKKyAgICB9CisKKyAgICAvLyBTYXZlIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uCisgICAgaWYgKE5VTEwgPT0gcENyZWF0ZUluZm8gfHwgTlVMTCA9PSBwQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mbyB8fCAwID09IHBDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvLT5hcGlWZXJzaW9uKQoreworICAgICAgICBwdHJfaW5zdGFuY2UtPmFwcF9hcGlfbWFqb3JfdmVyc2lvbiA9IDE7CisgICAgICAgIHB0cl9pbnN0YW5jZS0+YXBwX2FwaV9taW5vcl92ZXJzaW9uID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBwdHJfaW5zdGFuY2UtPmFwcF9hcGlfbWFqb3JfdmVyc2lvbiA9IFZLX1ZFUlNJT05fTUFKT1IocENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8tPmFwaVZlcnNpb24pOworICAgICAgICBwdHJfaW5zdGFuY2UtPmFwcF9hcGlfbWlub3JfdmVyc2lvbiA9IFZLX1ZFUlNJT05fTUlOT1IocENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8tPmFwaVZlcnNpb24pOworICAgIH0KKworICAgIC8vIExvb2sgZm9yIG9uZSBvciBtb3JlIFZLX0VYVF9kZWJ1Z19yZXBvcnQgb3IgVktfRVhUX2RlYnVnX3V0aWxzIGNyZWF0ZSBpbmZvIHN0cnVjdHVyZXMKKyAgICAvLyBhbmQgc2V0dXAgYSBjYWxsYmFjayhzKSBmb3IgZWFjaCBvbmUgZm91bmQuCisgICAgcHRyX2luc3RhbmNlLT5udW1fdG1wX3JlcG9ydF9jYWxsYmFja3MgPSAwOworICAgIHB0cl9pbnN0YW5jZS0+dG1wX3JlcG9ydF9jcmVhdGVfaW5mb3MgPSBOVUxMOworICAgIHB0cl9pbnN0YW5jZS0+dG1wX3JlcG9ydF9jYWxsYmFja3MgPSBOVUxMOworICAgIHB0cl9pbnN0YW5jZS0+bnVtX3RtcF9tZXNzZW5nZXJzID0gMDsKKyAgICBwdHJfaW5zdGFuY2UtPnRtcF9tZXNzZW5nZXJfY3JlYXRlX2luZm9zID0gTlVMTDsKKyAgICBwdHJfaW5zdGFuY2UtPnRtcF9tZXNzZW5nZXJzID0gTlVMTDsKKworICAgIC8vIEhhbmRsZSBjYXNlcyBvZiBWS19FWFRfZGVidWdfdXRpbHMKKyAgICBpZiAodXRpbF9Db3B5RGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9zKHBDcmVhdGVJbmZvLT5wTmV4dCwgcEFsbG9jYXRvciwgJnB0cl9pbnN0YW5jZS0+bnVtX3RtcF9tZXNzZW5nZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cl9pbnN0YW5jZS0+dG1wX21lc3Nlbmdlcl9jcmVhdGVfaW5mb3MsICZwdHJfaW5zdGFuY2UtPnRtcF9tZXNzZW5nZXJzKSkgeworICAgICAgICAvLyBPbmUgb3IgbW9yZSB3ZXJlIGZvdW5kLCBidXQgYWxsb2NhdGlvbiBmYWlsZWQuICBUaGVyZWZvcmUsIGNsZWFuIHVwIGFuZCBmYWlsIHRoaXMgZnVuY3Rpb246CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfSBlbHNlIGlmIChwdHJfaW5zdGFuY2UtPm51bV90bXBfbWVzc2VuZ2VycyA+IDApIHsKKyAgICAgICAgLy8gU2V0dXAgdGhlIHRlbXBvcmFyeSBtZXNzZW5nZXIocykgaGVyZSB0byBjYXRjaCBlYXJseSBpc3N1ZXM6CisgICAgICAgIGlmICh1dGlsX0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJzKHB0cl9pbnN0YW5jZSwgcEFsbG9jYXRvciwgcHRyX2luc3RhbmNlLT5udW1fdG1wX21lc3NlbmdlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+dG1wX21lc3Nlbmdlcl9jcmVhdGVfaW5mb3MsIHB0cl9pbnN0YW5jZS0+dG1wX21lc3NlbmdlcnMpKSB7CisgICAgICAgICAgICAvLyBGYWlsdXJlIG9mIHNldHRpbmcgdXAgb25lIG9yIG1vcmUgb2YgdGhlIG1lc3Nlbmdlci4gIFRoZXJlZm9yZSwgY2xlYW4gdXAgYW5kIGZhaWwgdGhpcyBmdW5jdGlvbjoKKyAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNhc2VzIG9mIFZLX0VYVF9kZWJ1Z19yZXBvcnQKKyAgICBpZiAodXRpbF9Db3B5RGVidWdSZXBvcnRDcmVhdGVJbmZvcyhwQ3JlYXRlSW5mby0+cE5leHQsIHBBbGxvY2F0b3IsICZwdHJfaW5zdGFuY2UtPm51bV90bXBfcmVwb3J0X2NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyX2luc3RhbmNlLT50bXBfcmVwb3J0X2NyZWF0ZV9pbmZvcywgJnB0cl9pbnN0YW5jZS0+dG1wX3JlcG9ydF9jYWxsYmFja3MpKSB7CisgICAgICAgIC8vIE9uZSBvciBtb3JlIHdlcmUgZm91bmQsIGJ1dCBhbGxvY2F0aW9uIGZhaWxlZC4gIFRoZXJlZm9yZSwgY2xlYW4gdXAgYW5kIGZhaWwgdGhpcyBmdW5jdGlvbjoKKyAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9IGVsc2UgaWYgKHB0cl9pbnN0YW5jZS0+bnVtX3RtcF9yZXBvcnRfY2FsbGJhY2tzID4gMCkgeworICAgICAgICAvLyBTZXR1cCB0aGUgdGVtcG9yYXJ5IGNhbGxiYWNrKHMpIGhlcmUgdG8gY2F0Y2ggZWFybHkgaXNzdWVzOgorICAgICAgICBpZiAodXRpbF9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrcyhwdHJfaW5zdGFuY2UsIHBBbGxvY2F0b3IsIHB0cl9pbnN0YW5jZS0+bnVtX3RtcF9yZXBvcnRfY2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPnRtcF9yZXBvcnRfY3JlYXRlX2luZm9zLCBwdHJfaW5zdGFuY2UtPnRtcF9yZXBvcnRfY2FsbGJhY2tzKSkgeworICAgICAgICAgICAgLy8gRmFpbHVyZSBvZiBzZXR0aW5nIHVwIG9uZSBvciBtb3JlIG9mIHRoZSBjYWxsYmFjay4gIFRoZXJlZm9yZSwgY2xlYW4gdXAgYW5kIGZhaWwgdGhpcyBmdW5jdGlvbjoKKyAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRHVlIHRvIGltcGxpY2l0IGxheWVycyBuZWVkIHRvIGdldCBsYXllciBsaXN0IGV2ZW4gaWYKKyAgICAvLyBlbmFibGVkTGF5ZXJDb3VudCA9PSAwIGFuZCBWS19JTlNUQU5DRV9MQVlFUlMgaXMgdW5zZXQuIEZvciBub3cgYWx3YXlzCisgICAgLy8gZ2V0IGxheWVyIGxpc3QgdmlhIGxvYWRlclNjYW5Gb3JMYXllcnMoKS4KKyAgICBtZW1zZXQoJnB0cl9pbnN0YW5jZS0+aW5zdGFuY2VfbGF5ZXJfbGlzdCwgMCwgc2l6ZW9mKHB0cl9pbnN0YW5jZS0+aW5zdGFuY2VfbGF5ZXJfbGlzdCkpOworICAgIGxvYWRlclNjYW5Gb3JMYXllcnMocHRyX2luc3RhbmNlLCAmcHRyX2luc3RhbmNlLT5pbnN0YW5jZV9sYXllcl9saXN0KTsKKworICAgIC8vIFZhbGlkYXRlIHRoZSBhcHAgcmVxdWVzdGVkIGxheWVycyB0byBiZSBlbmFibGVkCisgICAgaWYgKHBDcmVhdGVJbmZvLT5lbmFibGVkTGF5ZXJDb3VudCA+IDApIHsKKyAgICAgICAgcmVzID0gbG9hZGVyVmFsaWRhdGVMYXllcnMocHRyX2luc3RhbmNlLCBwQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQsIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyX2luc3RhbmNlLT5pbnN0YW5jZV9sYXllcl9saXN0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNjYW4vZGlzY292ZXIgYWxsIElDRCBsaWJyYXJpZXMKKyAgICBtZW1zZXQoJnB0cl9pbnN0YW5jZS0+aWNkX3RyYW1wX2xpc3QsIDAsIHNpemVvZihwdHJfaW5zdGFuY2UtPmljZF90cmFtcF9saXN0KSk7CisgICAgcmVzID0gbG9hZGVyX2ljZF9zY2FuKHB0cl9pbnN0YW5jZSwgJnB0cl9pbnN0YW5jZS0+aWNkX3RyYW1wX2xpc3QpOworICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBHZXQgZXh0ZW5zaW9ucyBmcm9tIGFsbCBJQ0QncywgbWVyZ2Ugc28gbm8gZHVwbGljYXRlcywgdGhlbiB2YWxpZGF0ZQorICAgIHJlcyA9IGxvYWRlcl9nZXRfaWNkX2xvYWRlcl9pbnN0YW5jZV9leHRlbnNpb25zKHB0cl9pbnN0YW5jZSwgJnB0cl9pbnN0YW5jZS0+aWNkX3RyYW1wX2xpc3QsICZwdHJfaW5zdGFuY2UtPmV4dF9saXN0KTsKKyAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJlcyA9IGxvYWRlcl92YWxpZGF0ZV9pbnN0YW5jZV9leHRlbnNpb25zKHB0cl9pbnN0YW5jZSwgJnB0cl9pbnN0YW5jZS0+ZXh0X2xpc3QsICZwdHJfaW5zdGFuY2UtPmluc3RhbmNlX2xheWVyX2xpc3QsICZpY2kpOworICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBwdHJfaW5zdGFuY2UtPmRpc3AgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhwdHJfaW5zdGFuY2UsIHNpemVvZihzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgaWYgKHB0cl9pbnN0YW5jZS0+ZGlzcCA9PSBOVUxMKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZTogIEZhaWxlZCB0byBhbGxvY2F0ZSBMb2FkZXIncyBmdWxsIEluc3RhbmNlIGRpc3BhdGNoIHRhYmxlLiIpOworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBtZW1jcHkoJnB0cl9pbnN0YW5jZS0+ZGlzcC0+bGF5ZXJfaW5zdF9kaXNwLCAmaW5zdGFuY2VfZGlzcCwgc2l6ZW9mKGluc3RhbmNlX2Rpc3ApKTsKKworICAgIHB0cl9pbnN0YW5jZS0+bmV4dCA9IGxvYWRlci5pbnN0YW5jZXM7CisgICAgbG9hZGVyLmluc3RhbmNlcyA9IHB0cl9pbnN0YW5jZTsKKworICAgIC8vIEFjdGl2YXRlIGFueSBsYXllcnMgb24gaW5zdGFuY2UgY2hhaW4KKyAgICByZXMgPSBsb2FkZXJFbmFibGVJbnN0YW5jZUxheWVycyhwdHJfaW5zdGFuY2UsICZpY2ksICZwdHJfaW5zdGFuY2UtPmluc3RhbmNlX2xheWVyX2xpc3QpOworICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBjcmVhdGVkX2luc3RhbmNlID0gKFZrSW5zdGFuY2UpcHRyX2luc3RhbmNlOworICAgIHJlcyA9IGxvYWRlcl9jcmVhdGVfaW5zdGFuY2VfY2hhaW4oJmljaSwgcEFsbG9jYXRvciwgcHRyX2luc3RhbmNlLCAmY3JlYXRlZF9pbnN0YW5jZSk7CisKKyAgICBpZiAocmVzID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgbWVtc2V0KHB0cl9pbnN0YW5jZS0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLnBhZGRpbmcsIDAsIHNpemVvZih1aW50NjRfdCkgKiA0KTsKKworICAgICAgICB3c2lfY3JlYXRlX2luc3RhbmNlKHB0cl9pbnN0YW5jZSwgJmljaSk7CisgICAgICAgIGRlYnVnX3V0aWxzX0NyZWF0ZUluc3RhbmNlKHB0cl9pbnN0YW5jZSwgJmljaSk7CisgICAgICAgIGV4dGVuc2lvbnNfY3JlYXRlX2luc3RhbmNlKHB0cl9pbnN0YW5jZSwgJmljaSk7CisKKyAgICAgICAgKnBJbnN0YW5jZSA9IGNyZWF0ZWRfaW5zdGFuY2U7CisKKyAgICAgICAgLy8gRmluYWxseSBoYXZlIHRoZSBsYXllcnMgaW4gcGxhY2UgYW5kIGV2ZXJ5b25lIGhhcyBzZWVuCisgICAgICAgIC8vIHRoZSBDcmVhdGVJbnN0YW5jZSBjb21tYW5kIGdvIGJ5LiBUaGlzIGFsbG93cyB0aGUgbGF5ZXIncworICAgICAgICAvLyBHZXRJbnN0YW5jZVByb2NBZGRyIGZ1bmN0aW9ucyB0byByZXR1cm4gdmFsaWQgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICAgICAgICAvLyBpZiBlbmFibGVkLgorICAgICAgICBsb2FkZXJBY3RpdmF0ZUluc3RhbmNlTGF5ZXJFeHRlbnNpb25zKHB0cl9pbnN0YW5jZSwgKnBJbnN0YW5jZSk7CisgICAgfQorCitvdXQ6CisKKyAgICBpZiAoTlVMTCAhPSBwdHJfaW5zdGFuY2UpIHsKKyAgICAgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwdHJfaW5zdGFuY2UtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIuaW5zdGFuY2VzID0gcHRyX2luc3RhbmNlLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE5VTEwgIT0gcHRyX2luc3RhbmNlLT5kaXNwKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIHB0cl9pbnN0YW5jZS0+ZGlzcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHRyX2luc3RhbmNlLT5udW1fdG1wX3JlcG9ydF9jYWxsYmFja3MgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBWS19FWFRfZGVidWdfcmVwb3J0IGl0ZW1zCisgICAgICAgICAgICAgICAgdXRpbF9EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja3MocHRyX2luc3RhbmNlLCBwQWxsb2NhdG9yLCBwdHJfaW5zdGFuY2UtPm51bV90bXBfcmVwb3J0X2NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPnRtcF9yZXBvcnRfY2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICB1dGlsX0ZyZWVEZWJ1Z1JlcG9ydENyZWF0ZUluZm9zKHBBbGxvY2F0b3IsIHB0cl9pbnN0YW5jZS0+dG1wX3JlcG9ydF9jcmVhdGVfaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPnRtcF9yZXBvcnRfY2FsbGJhY2tzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHJfaW5zdGFuY2UtPm51bV90bXBfbWVzc2VuZ2VycyA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGVtcG9yYXJ5IFZLX0VYVF9kZWJ1Z191dGlscyBpdGVtcworICAgICAgICAgICAgICAgIHV0aWxfRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJzKHB0cl9pbnN0YW5jZSwgcEFsbG9jYXRvciwgcHRyX2luc3RhbmNlLT5udW1fdG1wX21lc3NlbmdlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2luc3RhbmNlLT50bXBfbWVzc2VuZ2Vycyk7CisgICAgICAgICAgICAgICAgdXRpbF9GcmVlRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9zKHBBbGxvY2F0b3IsIHB0cl9pbnN0YW5jZS0+dG1wX21lc3Nlbmdlcl9jcmVhdGVfaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+dG1wX21lc3NlbmdlcnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwdHJfaW5zdGFuY2UtPmV4cGFuZGVkX2FjdGl2YXRlZF9sYXllcl9saXN0Lmxpc3QpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJEZWFjdGl2YXRlTGF5ZXJzKHB0cl9pbnN0YW5jZSwgTlVMTCwgJnB0cl9pbnN0YW5jZS0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE5VTEwgIT0gcHRyX2luc3RhbmNlLT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QubGlzdCkgeworICAgICAgICAgICAgICAgIGxvYWRlckRlc3Ryb3lMYXllckxpc3QocHRyX2luc3RhbmNlLCBOVUxMLCAmcHRyX2luc3RhbmNlLT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2FkZXJEZWxldGVMYXllckxpc3RBbmRQcm9wZXJ0aWVzKHB0cl9pbnN0YW5jZSwgJnB0cl9pbnN0YW5jZS0+aW5zdGFuY2VfbGF5ZXJfbGlzdCk7CisgICAgICAgICAgICBsb2FkZXJfc2Nhbm5lZF9pY2RfY2xlYXIocHRyX2luc3RhbmNlLCAmcHRyX2luc3RhbmNlLT5pY2RfdHJhbXBfbGlzdCk7CisgICAgICAgICAgICBsb2FkZXJfZGVzdHJveV9nZW5lcmljX2xpc3QocHRyX2luc3RhbmNlLCAoc3RydWN0IGxvYWRlcl9nZW5lcmljX2xpc3QgKikmcHRyX2luc3RhbmNlLT5leHRfbGlzdCk7CisKKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwdHJfaW5zdGFuY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBWS19FWFRfZGVidWdfcmVwb3J0IG9yIFZLX0VYVF9kZWJ1Z191dGlscyBpdGVtcworICAgICAgICAgICAgdXRpbF9EZXN0cm95RGVidWdVdGlsc01lc3NlbmdlcnMocHRyX2luc3RhbmNlLCBwQWxsb2NhdG9yLCBwdHJfaW5zdGFuY2UtPm51bV90bXBfbWVzc2VuZ2VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+dG1wX21lc3NlbmdlcnMpOworICAgICAgICAgICAgdXRpbF9EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja3MocHRyX2luc3RhbmNlLCBwQWxsb2NhdG9yLCBwdHJfaW5zdGFuY2UtPm51bV90bXBfcmVwb3J0X2NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+dG1wX3JlcG9ydF9jYWxsYmFja3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvYWRlckxvY2tlZCkgeworICAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95SW5zdGFuY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSBOVUxMOworICAgIGJvb2wgY2FsbGJhY2tfc2V0dXAgPSBmYWxzZTsKKyAgICBib29sIG1lc3Nlbmdlcl9zZXR1cCA9IGZhbHNlOworCisgICAgaWYgKGluc3RhbmNlID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChpbnN0YW5jZSk7CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKworICAgIHB0cl9pbnN0YW5jZSA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworCisgICAgaWYgKHBBbGxvY2F0b3IpIHsKKyAgICAgICAgcHRyX2luc3RhbmNlLT5hbGxvY19jYWxsYmFja3MgPSAqcEFsbG9jYXRvcjsKKyAgICB9CisKKyAgICBpZiAocHRyX2luc3RhbmNlLT5udW1fdG1wX21lc3NlbmdlcnMgPiAwKSB7CisgICAgICAgIC8vIFNldHVwIHRoZSB0ZW1wb3JhcnkgVktfRVhUX2RlYnVnX3V0aWxzIG1lc3NlbmdlcihzKSBoZXJlIHRvIGNhdGNoIGNsZWFudXAgaXNzdWVzOgorICAgICAgICBpZiAoIXV0aWxfQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlcnMocHRyX2luc3RhbmNlLCBwQWxsb2NhdG9yLCBwdHJfaW5zdGFuY2UtPm51bV90bXBfbWVzc2VuZ2VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+dG1wX21lc3Nlbmdlcl9jcmVhdGVfaW5mb3MsIHB0cl9pbnN0YW5jZS0+dG1wX21lc3NlbmdlcnMpKSB7CisgICAgICAgICAgICBtZXNzZW5nZXJfc2V0dXAgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHB0cl9pbnN0YW5jZS0+bnVtX3RtcF9yZXBvcnRfY2FsbGJhY2tzID4gMCkgeworICAgICAgICAvLyBTZXR1cCB0aGUgdGVtcG9yYXJ5IFZLX0VYVF9kZWJ1Z19yZXBvcnQgY2FsbGJhY2socykgaGVyZSB0byBjYXRjaCBjbGVhbnVwIGlzc3VlczoKKyAgICAgICAgaWYgKCF1dGlsX0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tzKHB0cl9pbnN0YW5jZSwgcEFsbG9jYXRvciwgcHRyX2luc3RhbmNlLT5udW1fdG1wX3JlcG9ydF9jYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPnRtcF9yZXBvcnRfY3JlYXRlX2luZm9zLCBwdHJfaW5zdGFuY2UtPnRtcF9yZXBvcnRfY2FsbGJhY2tzKSkgeworICAgICAgICAgICAgY2FsbGJhY2tfc2V0dXAgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgZGlzcC0+RGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBwQWxsb2NhdG9yKTsKKworICAgIGlmIChOVUxMICE9IHB0cl9pbnN0YW5jZS0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QubGlzdCkgeworICAgICAgICBsb2FkZXJEZWFjdGl2YXRlTGF5ZXJzKHB0cl9pbnN0YW5jZSwgTlVMTCwgJnB0cl9pbnN0YW5jZS0+ZXhwYW5kZWRfYWN0aXZhdGVkX2xheWVyX2xpc3QpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBwdHJfaW5zdGFuY2UtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5saXN0KSB7CisgICAgICAgIGxvYWRlckRlc3Ryb3lMYXllckxpc3QocHRyX2luc3RhbmNlLCBOVUxMLCAmcHRyX2luc3RhbmNlLT5hcHBfYWN0aXZhdGVkX2xheWVyX2xpc3QpOworICAgIH0KKworICAgIGlmIChwdHJfaW5zdGFuY2UtPnBoeXNfZGV2c190cmFtcCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcHRyX2luc3RhbmNlLT5waHlzX2Rldl9jb3VudF90cmFtcDsgaSsrKSB7CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKHB0cl9pbnN0YW5jZSwgcHRyX2luc3RhbmNlLT5waHlzX2RldnNfdHJhbXBbaV0pOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwdHJfaW5zdGFuY2UtPnBoeXNfZGV2c190cmFtcCk7CisgICAgfQorCisgICAgaWYgKHB0cl9pbnN0YW5jZS0+cGh5c19kZXZfZ3JvdXBzX3RyYW1wKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwdHJfaW5zdGFuY2UtPnBoeXNfZGV2X2dyb3VwX2NvdW50X3RyYW1wOyBpKyspIHsKKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwdHJfaW5zdGFuY2UtPnBoeXNfZGV2X2dyb3Vwc190cmFtcFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIHB0cl9pbnN0YW5jZS0+cGh5c19kZXZfZ3JvdXBzX3RyYW1wKTsKKyAgICB9CisKKyAgICBpZiAobWVzc2VuZ2VyX3NldHVwKSB7CisgICAgICAgIHV0aWxfRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJzKHB0cl9pbnN0YW5jZSwgcEFsbG9jYXRvciwgcHRyX2luc3RhbmNlLT5udW1fdG1wX21lc3NlbmdlcnMsIHB0cl9pbnN0YW5jZS0+dG1wX21lc3NlbmdlcnMpOworICAgICAgICB1dGlsX0ZyZWVEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb3MocEFsbG9jYXRvciwgcHRyX2luc3RhbmNlLT50bXBfbWVzc2VuZ2VyX2NyZWF0ZV9pbmZvcywgcHRyX2luc3RhbmNlLT50bXBfbWVzc2VuZ2Vycyk7CisgICAgfQorCisgICAgaWYgKGNhbGxiYWNrX3NldHVwKSB7CisgICAgICAgIHV0aWxfRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tzKHB0cl9pbnN0YW5jZSwgcEFsbG9jYXRvciwgcHRyX2luc3RhbmNlLT5udW1fdG1wX3JlcG9ydF9jYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+dG1wX3JlcG9ydF9jYWxsYmFja3MpOworICAgICAgICB1dGlsX0ZyZWVEZWJ1Z1JlcG9ydENyZWF0ZUluZm9zKHBBbGxvY2F0b3IsIHB0cl9pbnN0YW5jZS0+dG1wX3JlcG9ydF9jcmVhdGVfaW5mb3MsIHB0cl9pbnN0YW5jZS0+dG1wX3JlcG9ydF9jYWxsYmFja3MpOworICAgIH0KKyAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKHB0cl9pbnN0YW5jZSwgcHRyX2luc3RhbmNlLT5kaXNwKTsKKyAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKHB0cl9pbnN0YW5jZSwgcHRyX2luc3RhbmNlKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCAqcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlICpwUGh5c2ljYWxEZXZpY2VzKSB7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICB1aW50MzJfdCBpOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3Q7CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKworICAgIGluc3QgPSBsb2FkZXJfZ2V0X2luc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAoTlVMTCA9PSBpbnN0KSB7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gcFBoeXNpY2FsRGV2aWNlQ291bnQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXM6IFJlY2VpdmVkIE5VTEwgcG9pbnRlciBmb3IgcGh5c2ljYWwgZGV2aWNlIGNvdW50IHJldHVybiB2YWx1ZS4iKTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBTZXR1cCB0aGUgdHJhbXBvbGluZSBsb2FkZXIgcGh5c2ljYWwgZGV2aWNlcy4gIFRoaXMgd2lsbCBhY3R1YWxseQorICAgIC8vIGNhbGwgZG93biBhbmQgc2V0dXAgdGhlIHRlcm1pbmF0b3IgbG9hZGVyIHBoeXNpY2FsIGRldmljZXMgZHVyaW5nIHRoZQorICAgIC8vIHByb2Nlc3MuCisgICAgVmtSZXN1bHQgc2V0dXBfcmVzID0gc2V0dXBMb2FkZXJUcmFtcFBoeXNEZXZzKGluc3RhbmNlKTsKKyAgICBpZiAoc2V0dXBfcmVzICE9IFZLX1NVQ0NFU1MgJiYgc2V0dXBfcmVzICE9IFZLX0lOQ09NUExFVEUpIHsKKyAgICAgICAgcmVzID0gc2V0dXBfcmVzOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBjb3VudCA9IGluc3QtPnBoeXNfZGV2X2NvdW50X3RyYW1wOworCisgICAgLy8gV3JhcCB0aGUgUGh5c0RldiBvYmplY3QgZm9yIGxvYWRlciB1c2FnZSwgcmV0dXJuIHdyYXBwZWQgb2JqZWN0cworICAgIGlmIChOVUxMICE9IHBQaHlzaWNhbERldmljZXMpIHsKKyAgICAgICAgaWYgKGluc3QtPnBoeXNfZGV2X2NvdW50X3RyYW1wID4gKnBQaHlzaWNhbERldmljZUNvdW50KSB7CisgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXM6IFRyaW1taW5nIGRldmljZSBjb3VudCBkb3duIgorICAgICAgICAgICAgICAgICAgICAgICAiIGJ5IGFwcGxpY2F0aW9uIHJlcXVlc3QgZnJvbSAlZCB0byAlZCBwaHlzaWNhbCBkZXZpY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+cGh5c19kZXZfY291bnRfdHJhbXAsICpwUGh5c2ljYWxEZXZpY2VDb3VudCk7CisgICAgICAgICAgICBjb3VudCA9ICpwUGh5c2ljYWxEZXZpY2VDb3VudDsKKyAgICAgICAgICAgIHJlcyA9IFZLX0lOQ09NUExFVEU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHBQaHlzaWNhbERldmljZXNbaV0gPSAoVmtQaHlzaWNhbERldmljZSlpbnN0LT5waHlzX2RldnNfdHJhbXBbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcFBoeXNpY2FsRGV2aWNlQ291bnQgPSBjb3VudDsKKworb3V0OgorCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICByZXR1cm4gcmVzOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpwRmVhdHVyZXMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwLT5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKHVud3JhcHBlZF9waHlzX2RldiwgcEZlYXR1cmVzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0UHJvcGVydGllcyAqcEZvcm1hdEluZm8pIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BkID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwLT5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXModW53cmFwcGVkX3BkLCBmb3JtYXQsIHBGb3JtYXRJbmZvKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VUeXBlIHR5cGUsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICpwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKHVud3JhcHBlZF9waHlzX2RldiwgZm9ybWF0LCB0eXBlLCB0aWxpbmcsIHVzYWdlLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKHVud3JhcHBlZF9waHlzX2RldiwgcFByb3BlcnRpZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAqcFF1ZXVlUHJvcGVydGllcykgeworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHVud3JhcHBlZF9waHlzX2RldiwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcFF1ZXVlUHJvcGVydGllcyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgKnBNZW1vcnlQcm9wZXJ0aWVzKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKHVud3JhcHBlZF9waHlzX2RldiwgcE1lbW9yeVByb3BlcnRpZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RldmljZSAqcERldmljZSkgeworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworICAgIFZrUmVzdWx0IHJlcyA9IGxvYWRlcl9sYXllcl9jcmVhdGVfZGV2aWNlKE5VTEwsIHBoeXNpY2FsRGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSwgTlVMTCwgTlVMTCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICByZXR1cm4gcmVzOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURldmljZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgaWYgKGRldmljZSA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKworICAgIGxvYWRlcl9sYXllcl9kZXN0cm95X2RldmljZShkZXZpY2UsIHBBbGxvY2F0b3IsIGRpc3AtPkRlc3Ryb3lEZXZpY2UpOworCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICBWa1Jlc3VsdCByZXMgPSBWS19TVUNDRVNTOworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICpwaHlzX2RldjsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIHBoeXNfZGV2ID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICopcGh5c2ljYWxEZXZpY2U7CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKworICAgIC8vIGFsd2F5cyBwYXNzIHRoaXMgY2FsbCBkb3duIHRoZSBpbnN0YW5jZSBjaGFpbiB3aGljaCB3aWxsIHRlcm1pbmF0ZQorICAgIC8vIGluIHRoZSBJQ0QuIFRoaXMgYWxsb3dzIGxheWVycyB0byBmaWx0ZXIgdGhlIGV4dGVuc2lvbnMgY29taW5nIGJhY2sKKyAgICAvLyB1cCB0aGUgY2hhaW4uIEluIHRoZSB0ZXJtaW5hdG9yIHdlIGxvb2sgdXAgbGF5ZXIgZXh0ZW5zaW9ucyBmcm9tIHRoZQorICAgIC8vIG1hbmlmZXN0IGZpbGUgaWYgaXQgd2Fzbid0IHByb3ZpZGVkIGJ5IHRoZSBsYXllciBpdHNlbGYuCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIHJlcyA9IGRpc3AtPkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMocGh5c19kZXYtPnBoeXNfZGV2LCBwTGF5ZXJOYW1lLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICByZXR1cm4gcmVzOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgdWludDMyX3QgY29weV9zaXplOworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICpwaHlzX2RldjsKKyAgICBzdHJ1Y3QgbG9hZGVyX2xheWVyX2xpc3QgKmVuYWJsZWRfbGF5ZXJzLCBsYXllcnNfbGlzdDsKKyAgICBtZW1zZXQoJmxheWVyc19saXN0LCAwLCBzaXplb2YobGF5ZXJzX2xpc3QpKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKworICAgIC8vIERvbid0IGRpc3BhdGNoIHRoaXMgY2FsbCBkb3duIHRoZSBpbnN0YW5jZSBjaGFpbiwgd2FudCBhbGwgZGV2aWNlIGxheWVycworICAgIC8vIGVudW1lcmF0ZWQgYW5kIGluc3RhbmNlIGNoYWluIG1heSBub3QgY29udGFpbiBhbGwgZGV2aWNlIGxheWVycworICAgIC8vIFRPRE8gcmUtZXZhbHVhdGUgdGhlIGFib3ZlIHN0YXRlbWVudCB3ZSBtYXliZSBhYmxlIHRvIHN0YXJ0IGNhbGxpbmcKKyAgICAvLyBkb3duIHRoZSBjaGFpbgorCisgICAgcGh5c19kZXYgPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKilwaHlzaWNhbERldmljZTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gcGh5c19kZXYtPnRoaXNfaW5zdGFuY2U7CisKKyAgICB1aW50MzJfdCBjb3VudCA9IGluc3QtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdC5jb3VudDsKKyAgICBpZiAoY291bnQgPT0gMCB8fCBwUHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgICpwUHJvcGVydHlDb3VudCA9IGNvdW50OworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisgICAgZW5hYmxlZF9sYXllcnMgPSAoc3RydWN0IGxvYWRlcl9sYXllcl9saXN0ICopJmluc3QtPmFwcF9hY3RpdmF0ZWRfbGF5ZXJfbGlzdDsKKworICAgIGNvcHlfc2l6ZSA9ICgqcFByb3BlcnR5Q291bnQgPCBjb3VudCkgPyAqcFByb3BlcnR5Q291bnQgOiBjb3VudDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29weV9zaXplOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KCZwUHJvcGVydGllc1tpXSwgJihlbmFibGVkX2xheWVycy0+bGlzdFtpXS5pbmZvKSwgc2l6ZW9mKFZrTGF5ZXJQcm9wZXJ0aWVzKSk7CisgICAgfQorICAgICpwUHJvcGVydHlDb3VudCA9IGNvcHlfc2l6ZTsKKworICAgIGlmIChjb3B5X3NpemUgPCBjb3VudCkgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworICAgICAgICByZXR1cm4gVktfSU5DT01QTEVURTsKKyAgICB9CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmbG9hZGVyX2xvY2spOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlUXVldWUoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBxdWV1ZU5vZGVJbmRleCwgdWludDMyX3QgcXVldWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlICpwUXVldWUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5HZXREZXZpY2VRdWV1ZShkZXZpY2UsIHF1ZXVlTm9kZUluZGV4LCBxdWV1ZUluZGV4LCBwUXVldWUpOworICAgIGxvYWRlcl9zZXRfZGlzcGF0Y2goKnBRdWV1ZSwgZGlzcCk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyAqcFN1Ym1pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmVuY2UgZmVuY2UpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKHF1ZXVlKTsKKworICAgIHJldHVybiBkaXNwLT5RdWV1ZVN1Ym1pdChxdWV1ZSwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBmZW5jZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVXYWl0SWRsZShWa1F1ZXVlIHF1ZXVlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChxdWV1ZSk7CisKKyAgICByZXR1cm4gZGlzcC0+UXVldWVXYWl0SWRsZShxdWV1ZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRGV2aWNlV2FpdElkbGUoVmtEZXZpY2UgZGV2aWNlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPkRldmljZVdhaXRJZGxlKGRldmljZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWxsb2NhdGVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RldmljZU1lbW9yeSAqcE1lbW9yeSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5BbGxvY2F0ZU1lbW9yeShkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZW1vcnkpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRnJlZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIGRpc3AtPkZyZWVNZW1vcnkoZGV2aWNlLCBtZW0sIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a01hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBzaXplLCBWa0ZsYWdzIGZsYWdzLCB2b2lkICoqcHBEYXRhKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPk1hcE1lbW9yeShkZXZpY2UsIG1lbSwgb2Zmc2V0LCBzaXplLCBmbGFncywgcHBEYXRhKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1VubWFwTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+VW5tYXBNZW1vcnkoZGV2aWNlLCBtZW0pOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSAqcE1lbW9yeVJhbmdlcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5GbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UgKnBNZW1vcnlSYW5nZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+SW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudChWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSAqcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5HZXREZXZpY2VNZW1vcnlDb21taXRtZW50KGRldmljZSwgbWVtb3J5LCBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQmluZEJ1ZmZlck1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VNZW1vcnkgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+QmluZEJ1ZmZlck1lbW9yeShkZXZpY2UsIGJ1ZmZlciwgbWVtLCBvZmZzZXQpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0JpbmRJbWFnZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+QmluZEltYWdlTWVtb3J5KGRldmljZSwgaW1hZ2UsIG1lbSwgb2Zmc2V0KTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgKnBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBidWZmZXIsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzICpwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBpbWFnZSwgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwKK3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCB1aW50MzJfdCAqcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgKnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGltYWdlLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VUeXBlIHR5cGUsIFZrU2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLCBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZSwKKyAgICBWa0ltYWdlVGlsaW5nIHRpbGluZywgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKworICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKHVud3JhcHBlZF9waHlzX2RldiwgZm9ybWF0LCB0eXBlLCBzYW1wbGVzLCB1c2FnZSwgdGlsaW5nLCBwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVCaW5kU3BhcnNlKFZrUXVldWUgcXVldWUsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvICpwQmluZEluZm8sIFZrRmVuY2UgZmVuY2UpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKHF1ZXVlKTsKKworICAgIHJldHVybiBkaXNwLT5RdWV1ZUJpbmRTcGFyc2UocXVldWUsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mbywgZmVuY2UpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUZlbmNlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRmVuY2UgKnBGZW5jZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVGZW5jZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUZlbmNlKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveUZlbmNlKGRldmljZSwgZmVuY2UsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0RmVuY2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVmtGZW5jZSAqcEZlbmNlcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5SZXNldEZlbmNlcyhkZXZpY2UsIGZlbmNlQ291bnQsIHBGZW5jZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldEZlbmNlU3RhdHVzKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5HZXRGZW5jZVN0YXR1cyhkZXZpY2UsIGZlbmNlKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtXYWl0Rm9yRmVuY2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVmtGZW5jZSAqcEZlbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Jvb2wzMiB3YWl0QWxsLCB1aW50NjRfdCB0aW1lb3V0KSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPldhaXRGb3JGZW5jZXMoZGV2aWNlLCBmZW5jZUNvdW50LCBwRmVuY2VzLCB3YWl0QWxsLCB0aW1lb3V0KTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVTZW1hcGhvcmUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1NlbWFwaG9yZSAqcFNlbWFwaG9yZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVTZW1hcGhvcmUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNlbWFwaG9yZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveVNlbWFwaG9yZShkZXZpY2UsIHNlbWFwaG9yZSwgcEFsbG9jYXRvcik7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRXZlbnQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtFdmVudCAqcEV2ZW50KSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPkNyZWF0ZUV2ZW50KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBFdmVudCk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RXZlbnQoVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5EZXN0cm95RXZlbnQoZGV2aWNlLCBldmVudCwgcEFsbG9jYXRvcik7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0RXZlbnRTdGF0dXMoVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50KSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPkdldEV2ZW50U3RhdHVzKGRldmljZSwgZXZlbnQpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1NldEV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5TZXRFdmVudChkZXZpY2UsIGV2ZW50KTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldEV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5SZXNldEV2ZW50KGRldmljZSwgZXZlbnQpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVF1ZXJ5UG9vbChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUXVlcnlQb29sICpwUXVlcnlQb29sKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPkNyZWF0ZVF1ZXJ5UG9vbChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUXVlcnlQb29sKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lRdWVyeVBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5EZXN0cm95UXVlcnlQb29sKGRldmljZSwgcXVlcnlQb29sLCBwQWxsb2NhdG9yKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRRdWVyeVBvb2xSZXN1bHRzKFZrRGV2aWNlIGRldmljZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXJ5Q291bnQsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHN0cmlkZSwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPkdldFF1ZXJ5UG9vbFJlc3VsdHMoZGV2aWNlLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIGRhdGFTaXplLCBwRGF0YSwgc3RyaWRlLCBmbGFncyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtCdWZmZXIgKnBCdWZmZXIpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIGRpc3AtPkRlc3Ryb3lCdWZmZXIoZGV2aWNlLCBidWZmZXIsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrQnVmZmVyVmlldyAqcFZpZXcpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlQnVmZmVyVmlldyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmlldyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95QnVmZmVyVmlldyhWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyVmlldyBidWZmZXJWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIGRpc3AtPkRlc3Ryb3lCdWZmZXJWaWV3KGRldmljZSwgYnVmZmVyVmlldywgcEFsbG9jYXRvcik7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtJbWFnZSAqcEltYWdlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPkNyZWF0ZUltYWdlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbWFnZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95SW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5EZXN0cm95SW1hZ2UoZGV2aWNlLCBpbWFnZSwgcEFsbG9jYXRvcik7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSAqcFN1YnJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdWJyZXNvdXJjZUxheW91dCAqcExheW91dCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIGRpc3AtPkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoZGV2aWNlLCBpbWFnZSwgcFN1YnJlc291cmNlLCBwTGF5b3V0KTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVJbWFnZVZpZXcoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0ltYWdlVmlldyAqcFZpZXcpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlSW1hZ2VWaWV3KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWaWV3KTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lJbWFnZVZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5EZXN0cm95SW1hZ2VWaWV3KGRldmljZSwgaW1hZ2VWaWV3LCBwQWxsb2NhdG9yKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVTaGFkZXJNb2R1bGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTaGFkZXJNb2R1bGUgKnBTaGFkZXIpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXIpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIFZrU2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIGRpc3AtPkRlc3Ryb3lTaGFkZXJNb2R1bGUoZGV2aWNlLCBzaGFkZXJNb2R1bGUsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZUNhY2hlICpwUGlwZWxpbmVDYWNoZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVQaXBlbGluZUNhY2hlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUNhY2hlKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveVBpcGVsaW5lQ2FjaGUoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwQWxsb2NhdG9yKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaXBlbGluZUNhY2hlRGF0YShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBEYXRhU2l6ZSwgdm9pZCAqcERhdGEpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+R2V0UGlwZWxpbmVDYWNoZURhdGEoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwRGF0YVNpemUsIHBEYXRhKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtNZXJnZVBpcGVsaW5lQ2FjaGVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIGRzdENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY0NhY2hlQ291bnQsIGNvbnN0IFZrUGlwZWxpbmVDYWNoZSAqcFNyY0NhY2hlcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5NZXJnZVBpcGVsaW5lQ2FjaGVzKGRldmljZSwgZHN0Q2FjaGUsIHNyY0NhY2hlQ291bnQsIHBTcmNDYWNoZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZSAqcFBpcGVsaW5lcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVBpcGVsaW5lKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveVBpcGVsaW5lKGRldmljZSwgcGlwZWxpbmUsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVMYXlvdXQgKnBQaXBlbGluZUxheW91dCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVQaXBlbGluZUxheW91dChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVMYXlvdXQpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcGlwZWxpbmVMYXlvdXQsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVNhbXBsZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU2FtcGxlciAqcFNhbXBsZXIpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlU2FtcGxlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2FtcGxlcik7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U2FtcGxlcihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlciBzYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIGRpc3AtPkRlc3Ryb3lTYW1wbGVyKGRldmljZSwgc2FtcGxlciwgcEFsbG9jYXRvcik7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dChWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dCAqcFNldExheW91dCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTZXRMYXlvdXQpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY3JpcHRvclNldExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5EZXN0cm95RGVzY3JpcHRvclNldExheW91dChkZXZpY2UsIGRlc2NyaXB0b3JTZXRMYXlvdXQsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclBvb2wgKnBEZXNjcmlwdG9yUG9vbCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVEZXNjcmlwdG9yUG9vbChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRGVzY3JpcHRvclBvb2wpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveURlc2NyaXB0b3JQb29sKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0RGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPlJlc2V0RGVzY3JpcHRvclBvb2woZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgZmxhZ3MpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5BbGxvY2F0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgcEFsbG9jYXRlSW5mbywgcERlc2NyaXB0b3JTZXRzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtGcmVlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvclNldHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXR1cm4gZGlzcC0+RnJlZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIGRlc2NyaXB0b3JTZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yV3JpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlc2NyaXB0b3JDb3B5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5VcGRhdGVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIGRlc2NyaXB0b3JXcml0ZUNvdW50LCBwRGVzY3JpcHRvcldyaXRlcywgZGVzY3JpcHRvckNvcHlDb3VudCwgcERlc2NyaXB0b3JDb3BpZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUZyYW1lYnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRnJhbWVidWZmZXIgKnBGcmFtZWJ1ZmZlcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRnJhbWVidWZmZXIpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUZyYW1lYnVmZmVyKFZrRGV2aWNlIGRldmljZSwgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveUZyYW1lYnVmZmVyKGRldmljZSwgZnJhbWVidWZmZXIsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZW5kZXJQYXNzICpwUmVuZGVyUGFzcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVSZW5kZXJQYXNzKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveVJlbmRlclBhc3MoZGV2aWNlLCByZW5kZXJQYXNzLCBwQWxsb2NhdG9yKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFJlbmRlckFyZWFHcmFudWxhcml0eShWa0RldmljZSBkZXZpY2UsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVudDJEICpwR3JhbnVsYXJpdHkpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICBkaXNwLT5HZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoZGV2aWNlLCByZW5kZXJQYXNzLCBwR3JhbnVsYXJpdHkpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQ29tbWFuZFBvb2wgKnBDb21tYW5kUG9vbCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKworICAgIHJldHVybiBkaXNwLT5DcmVhdGVDb21tYW5kUG9vbChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ29tbWFuZFBvb2wpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RGVzdHJveUNvbW1hbmRQb29sKGRldmljZSwgY29tbWFuZFBvb2wsIHBBbGxvY2F0b3IpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0Q29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdzIGZsYWdzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgcmV0dXJuIGRpc3AtPlJlc2V0Q29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUmVzdWx0IHJlczsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisKKyAgICByZXMgPSBkaXNwLT5BbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgcEFsbG9jYXRlSW5mbywgcENvbW1hbmRCdWZmZXJzKTsKKyAgICBpZiAocmVzID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBBbGxvY2F0ZUluZm8tPmNvbW1hbmRCdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocENvbW1hbmRCdWZmZXJzW2ldKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2luaXRfZGlzcGF0Y2gocENvbW1hbmRCdWZmZXJzW2ldLCBkaXNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtGcmVlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworCisgICAgZGlzcC0+RnJlZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgY29tbWFuZFBvb2wsIGNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gKnBCZWdpbkluZm8pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgcmV0dXJuIGRpc3AtPkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBwQmVnaW5JbmZvKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbmRDb21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIHJldHVybiBkaXNwLT5FbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0Q29tbWFuZEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncyBmbGFncykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICByZXR1cm4gZGlzcC0+UmVzZXRDb21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGZsYWdzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRQaXBlbGluZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZSBwaXBlbGluZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRCaW5kUGlwZWxpbmUoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIHBpcGVsaW5lKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFZpZXdwb3J0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnQgKnBWaWV3cG9ydHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kU2V0Vmlld3BvcnQoY29tbWFuZEJ1ZmZlciwgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRDb3VudCwgcFZpZXdwb3J0cyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRTY2lzc29yKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFNjaXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2lzc29yQ291bnQsIGNvbnN0IFZrUmVjdDJEICpwU2Npc3NvcnMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kU2V0U2Npc3Nvcihjb21tYW5kQnVmZmVyLCBmaXJzdFNjaXNzb3IsIHNjaXNzb3JDb3VudCwgcFNjaXNzb3JzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldExpbmVXaWR0aChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbGluZVdpZHRoKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZFNldExpbmVXaWR0aChjb21tYW5kQnVmZmVyLCBsaW5lV2lkdGgpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0RGVwdGhCaWFzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVwdGhCaWFzQ2xhbXAsIGZsb2F0IGRlcHRoQmlhc1Nsb3BlRmFjdG9yKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZFNldERlcHRoQmlhcyhjb21tYW5kQnVmZmVyLCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZGVwdGhCaWFzQ2xhbXAsIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldEJsZW5kQ29uc3RhbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBmbG9hdCBibGVuZENvbnN0YW50c1s0XSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRTZXRCbGVuZENvbnN0YW50cyhjb21tYW5kQnVmZmVyLCBibGVuZENvbnN0YW50cyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXREZXB0aEJvdW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbWluRGVwdGhCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4RGVwdGhCb3VuZHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kU2V0RGVwdGhCb3VuZHMoY29tbWFuZEJ1ZmZlciwgbWluRGVwdGhCb3VuZHMsIG1heERlcHRoQm91bmRzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb21wYXJlTWFzaykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIGNvbXBhcmVNYXNrKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlTWFzaykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRTZXRTdGVuY2lsV3JpdGVNYXNrKGNvbW1hbmRCdWZmZXIsIGZhY2VNYXNrLCB3cml0ZU1hc2spOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVmZXJlbmNlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZFNldFN0ZW5jaWxSZWZlcmVuY2UoY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIHJlZmVyZW5jZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHluYW1pY09mZnNldENvdW50LCBjb25zdCB1aW50MzJfdCAqcER5bmFtaWNPZmZzZXRzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZEJpbmREZXNjcmlwdG9yU2V0cyhjb21tYW5kQnVmZmVyLCBwaXBlbGluZUJpbmRQb2ludCwgbGF5b3V0LCBmaXJzdFNldCwgZGVzY3JpcHRvclNldENvdW50LCBwRGVzY3JpcHRvclNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNPZmZzZXRDb3VudCwgcER5bmFtaWNPZmZzZXRzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRJbmRleEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luZGV4VHlwZSBpbmRleFR5cGUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kQmluZEluZGV4QnVmZmVyKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBpbmRleFR5cGUpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0QmluZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyICpwQnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgKnBPZmZzZXRzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZEJpbmRWZXJ0ZXhCdWZmZXJzKGNvbW1hbmRCdWZmZXIsIGZpcnN0QmluZGluZywgYmluZGluZ0NvdW50LCBwQnVmZmVycywgcE9mZnNldHMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRHJhdyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdmVydGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdFZlcnRleCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWREcmF3KGNvbW1hbmRCdWZmZXIsIHZlcnRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleCwgZmlyc3RJbnN0YW5jZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kZXhlZChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgaW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluc3RhbmNlKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZERyYXdJbmRleGVkKGNvbW1hbmRCdWZmZXIsIGluZGV4Q291bnQsIGluc3RhbmNlQ291bnQsIGZpcnN0SW5kZXgsIHZlcnRleE9mZnNldCwgZmlyc3RJbnN0YW5jZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kRHJhd0luZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWREcmF3SW5kZXhlZEluZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREaXNwYXRjaChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWREaXNwYXRjaChjb21tYW5kQnVmZmVyLCB4LCB5LCB6KTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERpc3BhdGNoSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kRGlzcGF0Y2hJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5QnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBzcmNCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckNvcHkgKnBSZWdpb25zKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZENvcHlCdWZmZXIoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RCdWZmZXIsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlQ29weSAqcFJlZ2lvbnMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kQ29weUltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmxpdEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUJsaXQgKnBSZWdpb25zLCBWa0ZpbHRlciBmaWx0ZXIpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kQmxpdEltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMsIGZpbHRlcik7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0ltYWdlIGRzdEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5ICpwUmVnaW9ucykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRDb3B5QnVmZmVyVG9JbWFnZShjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENvcHlJbWFnZVRvQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkgKnBSZWdpb25zKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZENvcHlJbWFnZVRvQnVmZmVyKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0QnVmZmVyLCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kVXBkYXRlQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBkYXRhU2l6ZSwgY29uc3Qgdm9pZCAqcERhdGEpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kVXBkYXRlQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBkYXRhU2l6ZSwgcERhdGEpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRmlsbEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHNpemUsIHVpbnQzMl90IGRhdGEpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kRmlsbEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckNvbG9ySW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlICpwQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZENsZWFyQ29sb3JJbWFnZShjb21tYW5kQnVmZmVyLCBpbWFnZSwgaW1hZ2VMYXlvdXQsIHBDb2xvciwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSAqcERlcHRoU3RlbmNpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoY29tbWFuZEJ1ZmZlciwgaW1hZ2UsIGltYWdlTGF5b3V0LCBwRGVwdGhTdGVuY2lsLCByYW5nZUNvdW50LCBwUmFuZ2VzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENsZWFyQXR0YWNobWVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50ICpwQXR0YWNobWVudHMsIHVpbnQzMl90IHJlY3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJSZWN0ICpwUmVjdHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kQ2xlYXJBdHRhY2htZW50cyhjb21tYW5kQnVmZmVyLCBhdHRhY2htZW50Q291bnQsIHBBdHRhY2htZW50cywgcmVjdENvdW50LCBwUmVjdHMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUmVzb2x2ZUltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVJlc29sdmUgKnBSZWdpb25zKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZFJlc29sdmVJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzaykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRTZXRFdmVudChjb21tYW5kQnVmZmVyLCBldmVudCwgc3RhZ2VNYXNrKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFJlc2V0RXZlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kUmVzZXRFdmVudChjb21tYW5kQnVmZmVyLCBldmVudCwgc3RhZ2VNYXNrKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFdhaXRFdmVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZrRXZlbnQgKnBFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzb3VyY2VTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyICpwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKnBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbW9yeUJhcnJpZXJzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZFdhaXRFdmVudHMoY29tbWFuZEJ1ZmZlciwgZXZlbnRDb3VudCwgcEV2ZW50cywgc291cmNlU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRQaXBlbGluZUJhcnJpZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBWa0RlcGVuZGVuY3lGbGFncyBkZXBlbmRlbmN5RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyICpwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyICpwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciAqcEltYWdlTWVtb3J5QmFycmllcnMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRCdWZmZXIsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBkZXBlbmRlbmN5RmxhZ3MsIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJlZ2luUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmxhZ3MgZmxhZ3MpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kQmVnaW5RdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHNsb3QsIGZsYWdzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZFF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHNsb3QpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kRW5kUXVlcnkoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBzbG90KTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFJlc2V0UXVlcnlQb29sKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRSZXNldFF1ZXJ5UG9vbChjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kV3JpdGVUaW1lc3RhbXAoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBzbG90KSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZFdyaXRlVGltZXN0YW1wKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lU3RhZ2UsIHF1ZXJ5UG9vbCwgc2xvdCk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc3RyaWRlLCBWa0ZsYWdzIGZsYWdzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZENvcHlRdWVyeVBvb2xSZXN1bHRzKGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIHN0cmlkZSwgZmxhZ3MpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUHVzaENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFncywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcFZhbHVlcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRQdXNoQ29uc3RhbnRzKGNvbW1hbmRCdWZmZXIsIGxheW91dCwgc3RhZ2VGbGFncywgb2Zmc2V0LCBzaXplLCBwVmFsdWVzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJlZ2luUmVuZGVyUGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworCisgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goY29tbWFuZEJ1ZmZlcik7CisKKyAgICBkaXNwLT5DbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgY29udGVudHMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kTmV4dFN1YnBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3A7CisKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKworICAgIGRpc3AtPkNtZE5leHRTdWJwYXNzKGNvbW1hbmRCdWZmZXIsIGNvbnRlbnRzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZFJlbmRlclBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kRW5kUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEV4ZWN1dGVDb21tYW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgY29tbWFuZEJ1ZmZlcnNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyICpwQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGNvbW1hbmRCdWZmZXIpOworCisgICAgZGlzcC0+Q21kRXhlY3V0ZUNvbW1hbmRzKGNvbW1hbmRCdWZmZXIsIGNvbW1hbmRCdWZmZXJzQ291bnQsIHBDb21tYW5kQnVmZmVycyk7Cit9CisKKy8vIC0tLS0gVnVsa2FuIGNvcmUgMS4xIHRyYW1wb2xpbmVzCisKK1ZrUmVzdWx0IHNldHVwTG9hZGVyVHJhbXBQaHlzRGV2R3JvdXBzKFZrSW5zdGFuY2UgaW5zdGFuY2UpIHsKKyAgICBWa1Jlc3VsdCByZXMgPSBWS19TVUNDRVNTOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3Q7CisgICAgdWludDMyX3QgdG90YWxfY291bnQgPSAwOworICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIgKipuZXdfcGh5c19kZXZfZ3JvdXBzID0gTlVMTDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSICpsb2NhbF9waHlzX2Rldl9ncm91cHMgPSBOVUxMOworICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzIGZwRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgPSBOVUxMOworCisgICAgaW5zdCA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChOVUxMID09IGluc3QpIHsKKyAgICAgICAgcmVzID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdXNlIHRvIGNhbGwgaW50byB0aGUgSUNELiBUaGlzIGNvdWxkIGJlIHRoZSBjb3JlIG9yIEtIUiB2ZXJzaW9uCisgICAgaWYgKGluc3QtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uKSB7CisgICAgICAgIGZwRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgPSBpbnN0LT5kaXNwLT5sYXllcl9pbnN0X2Rpc3AuRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyA9IGluc3QtPmRpc3AtPmxheWVyX2luc3RfZGlzcC5FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwczsKKyAgICB9CisKKyAgICAvLyBTZXR1cCB0aGUgdHJhbXBvbGluZSBsb2FkZXIgcGh5c2ljYWwgZGV2aWNlcy4gIFRoaXMgd2lsbCBhY3R1YWxseQorICAgIC8vIGNhbGwgZG93biBhbmQgc2V0dXAgdGhlIHRlcm1pbmF0b3IgbG9hZGVyIHBoeXNpY2FsIGRldmljZXMgZHVyaW5nIHRoZQorICAgIC8vIHByb2Nlc3MuCisgICAgVmtSZXN1bHQgc2V0dXBfcmVzID0gc2V0dXBMb2FkZXJUcmFtcFBoeXNEZXZzKGluc3RhbmNlKTsKKyAgICBpZiAoc2V0dXBfcmVzICE9IFZLX1NVQ0NFU1MgJiYgc2V0dXBfcmVzICE9IFZLX0lOQ09NUExFVEUpIHsKKyAgICAgICAgcmVzID0gc2V0dXBfcmVzOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBRdWVyeSBob3cgbWFueSBwaHlzaWNhbCBkZXZpY2UgZ3JvdXBzIHRoZXJlCisgICAgcmVzID0gZnBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyhpbnN0YW5jZSwgJnRvdGFsX2NvdW50LCBOVUxMKTsKKyAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJzZXR1cExvYWRlclRyYW1wUGh5c0Rldkdyb3VwczogIEZhaWxlZCBkdXJpbmcgZGlzcGF0Y2ggY2FsbCBvZiAiCisgICAgICAgICAgICAiXCdFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUlwnIHRvIGxvd2VyIGxheWVycyBvciAiCisgICAgICAgICAgICAibG9hZGVyIHRvIGdldCBjb3VudC4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGFuIGFycmF5IGZvciB0aGUgbmV3IHBoeXNpY2FsIGRldmljZSBncm91cHMsIHdoaWNoIHdpbGwgYmUgc3RvcmVkCisgICAgLy8gaW4gdGhlIGluc3RhbmNlIGZvciB0aGUgdHJhbXBvbGluZSBjb2RlLgorICAgIG5ld19waHlzX2Rldl9ncm91cHMgPSAoVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUiAqKilsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYygKKyAgICAgICAgaW5zdCwgdG90YWxfY291bnQgKiBzaXplb2YoVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUiAqKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgIGlmIChOVUxMID09IG5ld19waHlzX2Rldl9ncm91cHMpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJzZXR1cExvYWRlclRyYW1wUGh5c0Rldkdyb3VwczogIEZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgcGh5c2ljYWwgZGV2aWNlIgorICAgICAgICAgICAgIiBncm91cCBhcnJheSBvZiBzaXplICVkIiwKKyAgICAgICAgICAgIHRvdGFsX2NvdW50KTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgbWVtc2V0KG5ld19waHlzX2Rldl9ncm91cHMsIDAsIHRvdGFsX2NvdW50ICogc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIgKikpOworCisgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGFycmF5IChvbiB0aGUgc3RhY2spIHRvIGtlZXAgdHJhY2sgb2YgdGhlCisgICAgLy8gcmV0dXJuZWQgVmtQaHlzaWNhbERldmljZSB2YWx1ZXMuCisgICAgbG9jYWxfcGh5c19kZXZfZ3JvdXBzID0gbG9hZGVyX3N0YWNrX2FsbG9jKHNpemVvZihWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSKSAqIHRvdGFsX2NvdW50KTsKKyAgICBpZiAoTlVMTCA9PSBsb2NhbF9waHlzX2Rldl9ncm91cHMpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJzZXR1cExvYWRlclRyYW1wUGh5c0Rldkdyb3VwczogIEZhaWxlZCB0byBhbGxvY2F0ZSBsb2NhbCAiCisgICAgICAgICAgICAicGh5c2ljYWwgZGV2aWNlIGdyb3VwIGFycmF5IG9mIHNpemUgJWQiLAorICAgICAgICAgICAgdG90YWxfY291bnQpOworICAgICAgICByZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICAvLyBJbml0aWFsaXplIHRoZSBtZW1vcnkgdG8gc29tZXRoaW5nIHZhbGlkCisgICAgbWVtc2V0KGxvY2FsX3BoeXNfZGV2X2dyb3VwcywgMCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIpICogdG90YWxfY291bnQpOworICAgIGZvciAodWludDMyX3QgZ3JvdXAgPSAwOyBncm91cCA8IHRvdGFsX2NvdW50OyBncm91cCsrKSB7CisgICAgICAgIGxvY2FsX3BoeXNfZGV2X2dyb3Vwc1tncm91cF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfR1JPVVBfUFJPUEVSVElFU19LSFI7CisgICAgICAgIGxvY2FsX3BoeXNfZGV2X2dyb3Vwc1tncm91cF0ucE5leHQgPSBOVUxMOworICAgICAgICBsb2NhbF9waHlzX2Rldl9ncm91cHNbZ3JvdXBdLnN1YnNldEFsbG9jYXRpb24gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDYWxsIGRvd24gYW5kIGdldCB0aGUgY29udGVudAorICAgIGZwRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoaW5zdGFuY2UsICZ0b3RhbF9jb3VudCwgbG9jYWxfcGh5c19kZXZfZ3JvdXBzKTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhpbnN0LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJzZXR1cExvYWRlclRyYW1wUGh5c0Rldkdyb3VwczogIEZhaWxlZCBkdXJpbmcgZGlzcGF0Y2ggY2FsbCBvZiAiCisgICAgICAgICAgICAiXCdFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUlwnIHRvIGxvd2VyIGxheWVycyBvciAiCisgICAgICAgICAgICAibG9hZGVyIHRvIGdldCBjb250ZW50LiIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBSZXBsYWNlIGFsbCB0aGUgcGh5c2ljYWwgZGV2aWNlIElEcyB3aXRoIHRoZSBwcm9wZXIgbG9hZGVyIHZhbHVlcworICAgIGZvciAodWludDMyX3QgZ3JvdXAgPSAwOyBncm91cCA8IHRvdGFsX2NvdW50OyBncm91cCsrKSB7CisgICAgICAgIGZvciAodWludDMyX3QgZ3JvdXBfZ3B1ID0gMDsgZ3JvdXBfZ3B1IDwgbG9jYWxfcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5waHlzaWNhbERldmljZUNvdW50OyBncm91cF9ncHUrKykgeworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB0cmFtcF9ncHUgPSAwOyB0cmFtcF9ncHUgPCBpbnN0LT5waHlzX2Rldl9jb3VudF90cmFtcDsgdHJhbXBfZ3B1KyspIHsKKyAgICAgICAgICAgICAgICBpZiAobG9jYWxfcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5waHlzaWNhbERldmljZXNbZ3JvdXBfZ3B1XSA9PSBpbnN0LT5waHlzX2RldnNfdHJhbXBbdHJhbXBfZ3B1XS0+cGh5c19kZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5waHlzaWNhbERldmljZXNbZ3JvdXBfZ3B1XSA9IChWa1BoeXNpY2FsRGV2aWNlKWluc3QtPnBoeXNfZGV2c190cmFtcFt0cmFtcF9ncHVdOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAic2V0dXBMb2FkZXJUcmFtcFBoeXNEZXZHcm91cHM6ICBGYWlsZWQgdG8gZmluZCBHUFUgJWQgaW4gZ3JvdXAgJWQiCisgICAgICAgICAgICAgICAgICAgICIgcmV0dXJuZWQgYnkgXCdFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUlwnIGluIGxpc3QgcmV0dXJuZWQiCisgICAgICAgICAgICAgICAgICAgICIgYnkgXCdFbnVtZXJhdGVQaHlzaWNhbERldmljZXNcJyIsIGdyb3VwX2dwdSwgZ3JvdXApOworICAgICAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvcHkgb3IgY3JlYXRlIGV2ZXJ5dGhpbmcgdG8gZmlsbCB0aGUgbmV3IGFycmF5IG9mIHBoeXNpY2FsIGRldmljZSBncm91cHMKKyAgICBmb3IgKHVpbnQzMl90IG5ld19pZHggPSAwOyBuZXdfaWR4IDwgdG90YWxfY291bnQ7IG5ld19pZHgrKykgeworICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHBoeXNpY2FsIGRldmljZSBncm91cCB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzIGlzIGFscmVhZHkgaW4gdGhlIG9sZCBidWZmZXIKKyAgICAgICAgZm9yICh1aW50MzJfdCBvbGRfaWR4ID0gMDsgb2xkX2lkeCA8IGluc3QtPnBoeXNfZGV2X2dyb3VwX2NvdW50X3RyYW1wOyBvbGRfaWR4KyspIHsKKyAgICAgICAgICAgIGlmIChsb2NhbF9waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0ucGh5c2ljYWxEZXZpY2VDb3VudCA9PSBpbnN0LT5waHlzX2Rldl9ncm91cHNfdHJhbXBbb2xkX2lkeF0tPnBoeXNpY2FsRGV2aWNlQ291bnQpIHsKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kX2FsbF9ncHVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IG9sZF9ncHUgPSAwOyBvbGRfZ3B1IDwgaW5zdC0+cGh5c19kZXZfZ3JvdXBzX3RyYW1wW29sZF9pZHhdLT5waHlzaWNhbERldmljZUNvdW50OyBvbGRfZ3B1KyspIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZF9ncHUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBuZXdfZ3B1ID0gMDsgbmV3X2dwdSA8IGxvY2FsX3BoeXNfZGV2X2dyb3Vwc1tuZXdfaWR4XS5waHlzaWNhbERldmljZUNvdW50OyBuZXdfZ3B1KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbF9waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0ucGh5c2ljYWxEZXZpY2VzW25ld19ncHVdID09IGluc3QtPnBoeXNfZGV2X2dyb3Vwc190cmFtcFtvbGRfaWR4XS0+cGh5c2ljYWxEZXZpY2VzW29sZF9ncHVdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfZ3B1ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRfZ3B1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9hbGxfZ3B1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZF9hbGxfZ3B1cykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdfcGh5c19kZXZfZ3JvdXBzW25ld19pZHhdID0gaW5zdC0+cGh5c19kZXZfZ3JvdXBzX3RyYW1wW29sZF9pZHhdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIHBoeXNpY2FsIGRldmljZSBncm91cCBpc24ndCBpbiB0aGUgb2xkIGJ1ZmZlciwgY3JlYXRlIGl0CisgICAgICAgIGlmIChOVUxMID09IG5ld19waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0pIHsKKyAgICAgICAgICAgIG5ld19waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0gPSAoVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUiAqKWxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKAorICAgICAgICAgICAgICAgIGluc3QsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgICAgICAgICAgaWYgKE5VTEwgPT0gbmV3X3BoeXNfZGV2X2dyb3Vwc1tuZXdfaWR4XSkgeworICAgICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICJzZXR1cExvYWRlclRyYW1wUGh5c0Rldkdyb3VwczogIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAgICAgICAgICJwaHlzaWNhbCBkZXZpY2UgZ3JvdXAgdHJhbXBvbGluZSBvYmplY3QgJWQiLAorICAgICAgICAgICAgICAgICAgICBuZXdfaWR4KTsKKyAgICAgICAgICAgICAgICB0b3RhbF9jb3VudCA9IG5ld19pZHg7CisgICAgICAgICAgICAgICAgcmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KG5ld19waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0sICZsb2NhbF9waHlzX2Rldl9ncm91cHNbbmV3X2lkeF0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIpKTsKKyAgICAgICAgfQorICAgIH0KKworb3V0OgorCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSB7CisgICAgICAgIGlmIChOVUxMICE9IG5ld19waHlzX2Rldl9ncm91cHMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0b3RhbF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBuZXdfcGh5c19kZXZfZ3JvdXBzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgbmV3X3BoeXNfZGV2X2dyb3Vwcyk7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxfY291bnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZyZWUgZXZlcnl0aGluZyB0aGF0IGRpZG4ndCBjYXJyeSBvdmVyIHRvIHRoZSBuZXcgYXJyYXkgb2YKKyAgICAgICAgLy8gcGh5c2ljYWwgZGV2aWNlIGdyb3VwcworICAgICAgICBpZiAoTlVMTCAhPSBpbnN0LT5waHlzX2Rldl9ncm91cHNfdHJhbXApIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnN0LT5waHlzX2Rldl9ncm91cF9jb3VudF90cmFtcDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCB0b3RhbF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0LT5waHlzX2Rldl9ncm91cHNfdHJhbXBbaV0gPT0gbmV3X3BoeXNfZGV2X2dyb3Vwc1tqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIGluc3QtPnBoeXNfZGV2X2dyb3Vwc190cmFtcFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBpbnN0LT5waHlzX2Rldl9ncm91cHNfdHJhbXApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3dhcCBpbiB0aGUgbmV3IHBoeXNpY2FsIGRldmljZSBncm91cCBsaXN0CisgICAgICAgIGluc3QtPnBoeXNfZGV2X2dyb3VwX2NvdW50X3RyYW1wID0gdG90YWxfY291bnQ7CisgICAgICAgIGluc3QtPnBoeXNfZGV2X2dyb3Vwc190cmFtcCA9IG5ld19waHlzX2Rldl9ncm91cHM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCAqcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICpwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpIHsKKyAgICBWa1Jlc3VsdCByZXMgPSBWS19TVUNDRVNTOworICAgIHVpbnQzMl90IGNvdW50OworICAgIHVpbnQzMl90IGk7CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9IE5VTEw7CisKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKworICAgIGluc3QgPSBsb2FkZXJfZ2V0X2luc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAoTlVMTCA9PSBpbnN0KSB7CisgICAgICAgIHJlcyA9IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCkgeworICAgICAgICBsb2FkZXJfbG9nKGluc3QsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSOiBSZWNlaXZlZCBOVUxMIHBvaW50ZXIgZm9yIHBoeXNpY2FsICIKKyAgICAgICAgICAgICAgICAgICAiZGV2aWNlIGdyb3VwIGNvdW50IHJldHVybiB2YWx1ZS4iKTsKKyAgICAgICAgcmVzID0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCBzZXR1cF9yZXMgPSBzZXR1cExvYWRlclRyYW1wUGh5c0Rldkdyb3VwcyhpbnN0YW5jZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gc2V0dXBfcmVzKSB7CisgICAgICAgIHJlcyA9IHNldHVwX3JlczsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgY291bnQgPSBpbnN0LT5waHlzX2Rldl9ncm91cF9jb3VudF90cmFtcDsKKworICAgIC8vIFdyYXAgdGhlIFBoeXNEZXYgb2JqZWN0IGZvciBsb2FkZXIgdXNhZ2UsIHJldHVybiB3cmFwcGVkIG9iamVjdHMKKyAgICBpZiAoTlVMTCAhPSBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpIHsKKyAgICAgICAgaWYgKGluc3QtPnBoeXNfZGV2X2dyb3VwX2NvdW50X3RyYW1wID4gKnBQaHlzaWNhbERldmljZUdyb3VwQ291bnQpIHsKKyAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSOiBUcmltbWluZyBkZXZpY2UgZ3JvdXAgY291bnQgZG93biIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBieSBhcHBsaWNhdGlvbiByZXF1ZXN0IGZyb20gJWQgdG8gJWQgcGh5c2ljYWwgZGV2aWNlIGdyb3VwcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPnBoeXNfZGV2X2dyb3VwX2NvdW50X3RyYW1wLCAqcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCk7CisgICAgICAgICAgICBjb3VudCA9ICpwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50OworICAgICAgICAgICAgcmVzID0gVktfSU5DT01QTEVURTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KCZwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNbaV0sIGluc3QtPnBoeXNfZGV2X2dyb3Vwc190cmFtcFtpXSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUikpOworICAgICAgICB9CisgICAgfQorCisgICAgKnBQaHlzaWNhbERldmljZUdyb3VwQ291bnQgPSBjb3VudDsKKworb3V0OgorCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmxvYWRlcl9sb2NrKTsKKyAgICByZXR1cm4gcmVzOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiAqcEZlYXR1cmVzKSB7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QgPSAoKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wKikgcGh5c2ljYWxEZXZpY2UpLT50aGlzX2luc3RhbmNlOworCisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIHsKKyAgICAgICAgZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBwRmVhdHVyZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKHVud3JhcHBlZF9waHlzX2RldiwgcEZlYXR1cmVzKTsKKyAgICB9Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiAqcFByb3BlcnRpZXMpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9ICgoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAqKSBwaHlzaWNhbERldmljZSktPnRoaXNfaW5zdGFuY2U7CisKKyAgICBpZiAoaW5zdCAhPSBOVUxMICYmIGluc3QtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikgeworICAgICAgICBkaXNwLT5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKHVud3JhcHBlZF9waHlzX2RldiwgcFByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIodW53cmFwcGVkX3BoeXNfZGV2LCBwUHJvcGVydGllcyk7CisgICAgfQorfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0UHJvcGVydGllczIgKnBGb3JtYXRQcm9wZXJ0aWVzKSB7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QgPSAoKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wKikgcGh5c2ljYWxEZXZpY2UpLT50aGlzX2luc3RhbmNlOworCisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIpIHsKKyAgICAgICAgZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUih1bndyYXBwZWRfcGh5c19kZXYsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIodW53cmFwcGVkX3BoeXNfZGV2LCBmb3JtYXQsIHBGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yICpwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAqcEltYWdlRm9ybWF0UHJvcGVydGllcykgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCopIHBoeXNpY2FsRGV2aWNlKS0+dGhpc19pbnN0YW5jZTsKKyAgICAKKyAgICBpZiAoaW5zdCAhPSBOVUxMICYmIGluc3QtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMikgeworICAgICAgICByZXR1cm4gZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKHVud3JhcHBlZF9waHlzX2RldiwgcEltYWdlRm9ybWF0SW5mbywgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMih1bndyYXBwZWRfcGh5c19kZXYsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIH0KK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiAqcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCopIHBoeXNpY2FsRGV2aWNlKS0+dGhpc19pbnN0YW5jZTsKKworICAgIGlmIChpbnN0ICE9IE5VTEwgJiYgaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUih1bndyYXBwZWRfcGh5c19kZXYsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMih1bndyYXBwZWRfcGh5c19kZXYsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIH0KK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyICpwTWVtb3J5UHJvcGVydGllcykgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCopIHBoeXNpY2FsRGV2aWNlKS0+dGhpc19pbnN0YW5jZTsKKworICAgIGlmIChpbnN0ICE9IE5VTEwgJiYgaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBwTWVtb3J5UHJvcGVydGllcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMih1bndyYXBwZWRfcGh5c19kZXYsIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgKnBGb3JtYXRJbmZvLCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyICpwUHJvcGVydGllcykgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCopIHBoeXNpY2FsRGV2aWNlKS0+dGhpc19pbnN0YW5jZTsKKworICAgIGlmIChpbnN0ICE9IE5VTEwgJiYgaW5zdC0+ZW5hYmxlZF9rbm93bl9leHRlbnNpb25zLmtocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyKSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUih1bndyYXBwZWRfcGh5c19kZXYsIHBGb3JtYXRJbmZvLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMih1bndyYXBwZWRfcGh5c19kZXYsIHBGb3JtYXRJbmZvLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIH0KK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gKnBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgKnBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgY29uc3Qgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdCA9ICgoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAqKSBwaHlzaWNhbERldmljZSktPnRoaXNfaW5zdGFuY2U7CisKKyAgICBpZiAoaW5zdCAhPSBOVUxMICYmIGluc3QtPmVuYWJsZWRfa25vd25fZXh0ZW5zaW9ucy5raHJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyl7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKHVud3JhcHBlZF9waHlzX2RldiwgcEV4dGVybmFsQnVmZmVySW5mbywgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXModW53cmFwcGVkX3BoeXNfZGV2LCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvS0hSICpwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzICpwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKSB7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QgPSAoKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wKikgcGh5c2ljYWxEZXZpY2UpLT50aGlzX2luc3RhbmNlOworCisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNwLT5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyh1bndyYXBwZWRfcGh5c19kZXYsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworICAgIH0KK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvICpwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyAqcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKSB7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKmluc3QgPSAoKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wKikgcGh5c2ljYWxEZXZpY2UpLT50aGlzX2luc3RhbmNlOworCisgICAgaWYgKGluc3QgIT0gTlVMTCAmJiBpbnN0LT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMua2hyX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcykgeworICAgICAgICBkaXNwLT5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKHVud3JhcHBlZF9waHlzX2RldiwgcEV4dGVybmFsRmVuY2VJbmZvLCBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXModW53cmFwcGVkX3BoeXNfZGV2LCBwRXh0ZXJuYWxGZW5jZUluZm8sIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisgICAgfQorfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0JpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+QmluZEJ1ZmZlck1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+QmluZEltYWdlTWVtb3J5MihkZXZpY2UsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERldmljZUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGV2aWNlSW5kZXgsCisgICAgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiAgICAgICAgICAgICAgICAgICBwUGVlck1lbW9yeUZlYXR1cmVzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgZGlzcC0+R2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoZGV2aWNlLCBoZWFwSW5kZXgsIGxvY2FsRGV2aWNlSW5kZXgsIHJlbW90ZURldmljZUluZGV4LCBwUGVlck1lbW9yeUZlYXR1cmVzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldERldmljZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzaykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWRTZXREZXZpY2VNYXNrKGNvbW1hbmRCdWZmZXIsIGRldmljZU1hc2spOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRGlzcGF0Y2hCYXNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWiwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChjb21tYW5kQnVmZmVyKTsKKyAgICBkaXNwLT5DbWREaXNwYXRjaEJhc2UoY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgZGlzcC0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgZGlzcC0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKGRldmljZSwgcEluZm8sIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1RyaW1Db21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5UcmltQ29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlUXVldWUyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXZpY2VRdWV1ZUluZm8yICpwUXVldWVJbmZvLCBWa1F1ZXVlICpwUXVldWUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5HZXREZXZpY2VRdWV1ZTIoZGV2aWNlLCBwUXVldWVJbmZvLCBwUXVldWUpOworICAgIGlmICgqcFF1ZXVlICE9IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgbG9hZGVyX3NldF9kaXNwYXRjaCgqcFF1ZXVlLCBkaXNwKTsKKyAgICB9Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24pIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwWWNiY3JDb252ZXJzaW9uKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIGRpc3AtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKGRldmljZSwgeWNiY3JDb252ZXJzaW9uLCBwQWxsb2NhdG9yKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIGRpc3AtPkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KGRldmljZSwgcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+Q3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICBkaXNwLT5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBEYXRhKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgZGlzcC0+VXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShkZXZpY2UsIGRlc2NyaXB0b3JTZXQsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcERhdGEpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci91bmtub3duX2V4dF9jaGFpbi5jIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci91bmtub3duX2V4dF9jaGFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODU2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3Vua25vd25fZXh0X2NoYWluLmMKQEAgLTAsMCArMSw4MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE3IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yIEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTGVubnkgS29tb3cgPGxlbm55QGx1bmFyZy5jb20+CisgKi8KKworIC8vIFRoaXMgY29kZSBpcyB1c2VkIHRvIHBhc3Mgb24gcGh5c2ljYWwgZGV2aWNlIGV4dGVuc2lvbnMgdGhyb3VnaCB0aGUgY2FsbCBjaGFpbi4gSXQgbXVzdCBkbyB0aGlzIHdpdGhvdXQgY3JlYXRpbmcgYSBzdGFjayBmcmFtZSwKKyAvLyBiZWNhdXNlIHRoZSBhY3R1YWwgcGFyYW1ldGVycyBvZiB0aGUgY2FsbCBhcmUgbm90IGtub3duLiBTaW5jZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGtub3duIHRvIGJlIGEgVmtQaHlzaWNhbERldmljZSwgaXQgY2FuCisvLyB1bndyYXAgdGhlIHBoeXNpY2FsIGRldmljZSwgb3ZlcndyaXRpbmcgdGhlIHdyYXBwZWQgZGV2aWNlLCBhbmQgdGhlbiBqdW1wIHRvIHRoZSBuZXh0IGZ1bmN0aW9uIGluIHRoZSBjYWxsIGNoYWluLiBUaGlzIGNvZGUKKy8vIGF0dGVtcHRzIHRvIGFjY29tcGxpc2ggdGhpcyBieSByZWx5aW5nIG9uIHRhaWwtY2FsbCBvcHRpbWl6YXRpb25zLCBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyB3aWxsIHdvcmsuIEFzIGEgcmVzdWx0LAorLy8gdGhpcyBjb2RlIGlzIG9ubHkgY29tcGlsZWQgb24gc3lzdGVtcyB3aGVyZSBhbiBhc3NlbWJseSBhbHRlcm5hdGl2ZSBoYXMgbm90IGJlZW4gd3JpdHRlbi4KKworICNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyAjaW5jbHVkZSAibG9hZGVyLmgiCisKKyAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19jbGFuZ19fKQorICNwcmFnbWEgR0NDIG9wdGltaXplKDMpICAvLyBmb3JjZSBnY2MgdG8gdXNlIHRhaWwtY2FsbHMKKyAjZW5kaWYKKworIC8vIFRyYW1wb2xpbmUgZnVuY3Rpb24gbWFjcm8gZm9yIHVua25vd24gcGh5c2ljYWwgZGV2aWNlIGV4dGVuc2lvbiBjb21tYW5kLgorICNkZWZpbmUgUGh5c0RldkV4dFRyYW1wKG51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtQaHlzRGV2RXh0VHJhbXAjI251bShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsX2RldmljZSkgeyBcCisgICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlICpkaXNwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfZGlzcGF0Y2gocGh5c2ljYWxfZGV2aWNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGRpc3AtPnBoeXNfZGV2X2V4dFtudW1dKGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsX2RldmljZSkpOyAgICAgICAgICBcCisgICAgIH0KKworLy8gVGVybWluYXRvciBmdW5jdGlvbiBtYWNybyBmb3IgdW5rbm93biBwaHlzaWNhbCBkZXZpY2UgZXh0ZW5zaW9uIGNvbW1hbmQuCisjZGVmaW5lIFBoeXNEZXZFeHRUZXJtaW4obnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrUGh5c0RldkV4dFRlcm1pbiMjbnVtKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxfZGV2aWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsX2RldmljZTsgICAgXAorICAgICAgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpY2RfdGVybS0+dGhpc19pbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5waHlzX2Rldl9leHRbbnVtXSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsICJFeHRlbnNpb24gJXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBwaHlzaWNhbCBkZXZpY2UiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5waHlzX2Rldl9leHRfZGlzcF9oYXNoW251bV0uZnVuY19uYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgaWNkX3Rlcm0tPnBoeXNfZGV2X2V4dFtudW1dKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyBUcmFtcG9saW5lIGZ1bmN0aW9uIG1hY3JvIGZvciB1bmtub3duIHBoeXNpY2FsIGRldmljZSBleHRlbnNpb24gY29tbWFuZC4KKyNkZWZpbmUgRGV2RXh0VHJhbXAobnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a2Rldl9leHQjI251bShWa0RldmljZSBkZXZpY2UpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbG9hZGVyX2Rldl9kaXNwYXRjaF90YWJsZSAqZGlzcDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZGlzcCA9IGxvYWRlcl9nZXRfZGV2X2Rpc3BhdGNoKGRldmljZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGRpc3AtPmV4dF9kaXNwYXRjaC5kZXZfZXh0W251bV0oZGV2aWNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0KKworCisvLyBJbnN0YW50aWF0aW9ucyBvZiB0aGUgdHJhbXBvbGluZQorUGh5c0RldkV4dFRyYW1wKDApCitQaHlzRGV2RXh0VHJhbXAoMSkKK1BoeXNEZXZFeHRUcmFtcCgyKQorUGh5c0RldkV4dFRyYW1wKDMpCitQaHlzRGV2RXh0VHJhbXAoNCkKK1BoeXNEZXZFeHRUcmFtcCg1KQorUGh5c0RldkV4dFRyYW1wKDYpCitQaHlzRGV2RXh0VHJhbXAoNykKK1BoeXNEZXZFeHRUcmFtcCg4KQorUGh5c0RldkV4dFRyYW1wKDkpCitQaHlzRGV2RXh0VHJhbXAoMTApCitQaHlzRGV2RXh0VHJhbXAoMTEpCitQaHlzRGV2RXh0VHJhbXAoMTIpCitQaHlzRGV2RXh0VHJhbXAoMTMpCitQaHlzRGV2RXh0VHJhbXAoMTQpCitQaHlzRGV2RXh0VHJhbXAoMTUpCitQaHlzRGV2RXh0VHJhbXAoMTYpCitQaHlzRGV2RXh0VHJhbXAoMTcpCitQaHlzRGV2RXh0VHJhbXAoMTgpCitQaHlzRGV2RXh0VHJhbXAoMTkpCitQaHlzRGV2RXh0VHJhbXAoMjApCitQaHlzRGV2RXh0VHJhbXAoMjEpCitQaHlzRGV2RXh0VHJhbXAoMjIpCitQaHlzRGV2RXh0VHJhbXAoMjMpCitQaHlzRGV2RXh0VHJhbXAoMjQpCitQaHlzRGV2RXh0VHJhbXAoMjUpCitQaHlzRGV2RXh0VHJhbXAoMjYpCitQaHlzRGV2RXh0VHJhbXAoMjcpCitQaHlzRGV2RXh0VHJhbXAoMjgpCitQaHlzRGV2RXh0VHJhbXAoMjkpCitQaHlzRGV2RXh0VHJhbXAoMzApCitQaHlzRGV2RXh0VHJhbXAoMzEpCitQaHlzRGV2RXh0VHJhbXAoMzIpCitQaHlzRGV2RXh0VHJhbXAoMzMpCitQaHlzRGV2RXh0VHJhbXAoMzQpCitQaHlzRGV2RXh0VHJhbXAoMzUpCitQaHlzRGV2RXh0VHJhbXAoMzYpCitQaHlzRGV2RXh0VHJhbXAoMzcpCitQaHlzRGV2RXh0VHJhbXAoMzgpCitQaHlzRGV2RXh0VHJhbXAoMzkpCitQaHlzRGV2RXh0VHJhbXAoNDApCitQaHlzRGV2RXh0VHJhbXAoNDEpCitQaHlzRGV2RXh0VHJhbXAoNDIpCitQaHlzRGV2RXh0VHJhbXAoNDMpCitQaHlzRGV2RXh0VHJhbXAoNDQpCitQaHlzRGV2RXh0VHJhbXAoNDUpCitQaHlzRGV2RXh0VHJhbXAoNDYpCitQaHlzRGV2RXh0VHJhbXAoNDcpCitQaHlzRGV2RXh0VHJhbXAoNDgpCitQaHlzRGV2RXh0VHJhbXAoNDkpCitQaHlzRGV2RXh0VHJhbXAoNTApCitQaHlzRGV2RXh0VHJhbXAoNTEpCitQaHlzRGV2RXh0VHJhbXAoNTIpCitQaHlzRGV2RXh0VHJhbXAoNTMpCitQaHlzRGV2RXh0VHJhbXAoNTQpCitQaHlzRGV2RXh0VHJhbXAoNTUpCitQaHlzRGV2RXh0VHJhbXAoNTYpCitQaHlzRGV2RXh0VHJhbXAoNTcpCitQaHlzRGV2RXh0VHJhbXAoNTgpCitQaHlzRGV2RXh0VHJhbXAoNTkpCitQaHlzRGV2RXh0VHJhbXAoNjApCitQaHlzRGV2RXh0VHJhbXAoNjEpCitQaHlzRGV2RXh0VHJhbXAoNjIpCitQaHlzRGV2RXh0VHJhbXAoNjMpCitQaHlzRGV2RXh0VHJhbXAoNjQpCitQaHlzRGV2RXh0VHJhbXAoNjUpCitQaHlzRGV2RXh0VHJhbXAoNjYpCitQaHlzRGV2RXh0VHJhbXAoNjcpCitQaHlzRGV2RXh0VHJhbXAoNjgpCitQaHlzRGV2RXh0VHJhbXAoNjkpCitQaHlzRGV2RXh0VHJhbXAoNzApCitQaHlzRGV2RXh0VHJhbXAoNzEpCitQaHlzRGV2RXh0VHJhbXAoNzIpCitQaHlzRGV2RXh0VHJhbXAoNzMpCitQaHlzRGV2RXh0VHJhbXAoNzQpCitQaHlzRGV2RXh0VHJhbXAoNzUpCitQaHlzRGV2RXh0VHJhbXAoNzYpCitQaHlzRGV2RXh0VHJhbXAoNzcpCitQaHlzRGV2RXh0VHJhbXAoNzgpCitQaHlzRGV2RXh0VHJhbXAoNzkpCitQaHlzRGV2RXh0VHJhbXAoODApCitQaHlzRGV2RXh0VHJhbXAoODEpCitQaHlzRGV2RXh0VHJhbXAoODIpCitQaHlzRGV2RXh0VHJhbXAoODMpCitQaHlzRGV2RXh0VHJhbXAoODQpCitQaHlzRGV2RXh0VHJhbXAoODUpCitQaHlzRGV2RXh0VHJhbXAoODYpCitQaHlzRGV2RXh0VHJhbXAoODcpCitQaHlzRGV2RXh0VHJhbXAoODgpCitQaHlzRGV2RXh0VHJhbXAoODkpCitQaHlzRGV2RXh0VHJhbXAoOTApCitQaHlzRGV2RXh0VHJhbXAoOTEpCitQaHlzRGV2RXh0VHJhbXAoOTIpCitQaHlzRGV2RXh0VHJhbXAoOTMpCitQaHlzRGV2RXh0VHJhbXAoOTQpCitQaHlzRGV2RXh0VHJhbXAoOTUpCitQaHlzRGV2RXh0VHJhbXAoOTYpCitQaHlzRGV2RXh0VHJhbXAoOTcpCitQaHlzRGV2RXh0VHJhbXAoOTgpCitQaHlzRGV2RXh0VHJhbXAoOTkpCitQaHlzRGV2RXh0VHJhbXAoMTAwKQorUGh5c0RldkV4dFRyYW1wKDEwMSkKK1BoeXNEZXZFeHRUcmFtcCgxMDIpCitQaHlzRGV2RXh0VHJhbXAoMTAzKQorUGh5c0RldkV4dFRyYW1wKDEwNCkKK1BoeXNEZXZFeHRUcmFtcCgxMDUpCitQaHlzRGV2RXh0VHJhbXAoMTA2KQorUGh5c0RldkV4dFRyYW1wKDEwNykKK1BoeXNEZXZFeHRUcmFtcCgxMDgpCitQaHlzRGV2RXh0VHJhbXAoMTA5KQorUGh5c0RldkV4dFRyYW1wKDExMCkKK1BoeXNEZXZFeHRUcmFtcCgxMTEpCitQaHlzRGV2RXh0VHJhbXAoMTEyKQorUGh5c0RldkV4dFRyYW1wKDExMykKK1BoeXNEZXZFeHRUcmFtcCgxMTQpCitQaHlzRGV2RXh0VHJhbXAoMTE1KQorUGh5c0RldkV4dFRyYW1wKDExNikKK1BoeXNEZXZFeHRUcmFtcCgxMTcpCitQaHlzRGV2RXh0VHJhbXAoMTE4KQorUGh5c0RldkV4dFRyYW1wKDExOSkKK1BoeXNEZXZFeHRUcmFtcCgxMjApCitQaHlzRGV2RXh0VHJhbXAoMTIxKQorUGh5c0RldkV4dFRyYW1wKDEyMikKK1BoeXNEZXZFeHRUcmFtcCgxMjMpCitQaHlzRGV2RXh0VHJhbXAoMTI0KQorUGh5c0RldkV4dFRyYW1wKDEyNSkKK1BoeXNEZXZFeHRUcmFtcCgxMjYpCitQaHlzRGV2RXh0VHJhbXAoMTI3KQorUGh5c0RldkV4dFRyYW1wKDEyOCkKK1BoeXNEZXZFeHRUcmFtcCgxMjkpCitQaHlzRGV2RXh0VHJhbXAoMTMwKQorUGh5c0RldkV4dFRyYW1wKDEzMSkKK1BoeXNEZXZFeHRUcmFtcCgxMzIpCitQaHlzRGV2RXh0VHJhbXAoMTMzKQorUGh5c0RldkV4dFRyYW1wKDEzNCkKK1BoeXNEZXZFeHRUcmFtcCgxMzUpCitQaHlzRGV2RXh0VHJhbXAoMTM2KQorUGh5c0RldkV4dFRyYW1wKDEzNykKK1BoeXNEZXZFeHRUcmFtcCgxMzgpCitQaHlzRGV2RXh0VHJhbXAoMTM5KQorUGh5c0RldkV4dFRyYW1wKDE0MCkKK1BoeXNEZXZFeHRUcmFtcCgxNDEpCitQaHlzRGV2RXh0VHJhbXAoMTQyKQorUGh5c0RldkV4dFRyYW1wKDE0MykKK1BoeXNEZXZFeHRUcmFtcCgxNDQpCitQaHlzRGV2RXh0VHJhbXAoMTQ1KQorUGh5c0RldkV4dFRyYW1wKDE0NikKK1BoeXNEZXZFeHRUcmFtcCgxNDcpCitQaHlzRGV2RXh0VHJhbXAoMTQ4KQorUGh5c0RldkV4dFRyYW1wKDE0OSkKK1BoeXNEZXZFeHRUcmFtcCgxNTApCitQaHlzRGV2RXh0VHJhbXAoMTUxKQorUGh5c0RldkV4dFRyYW1wKDE1MikKK1BoeXNEZXZFeHRUcmFtcCgxNTMpCitQaHlzRGV2RXh0VHJhbXAoMTU0KQorUGh5c0RldkV4dFRyYW1wKDE1NSkKK1BoeXNEZXZFeHRUcmFtcCgxNTYpCitQaHlzRGV2RXh0VHJhbXAoMTU3KQorUGh5c0RldkV4dFRyYW1wKDE1OCkKK1BoeXNEZXZFeHRUcmFtcCgxNTkpCitQaHlzRGV2RXh0VHJhbXAoMTYwKQorUGh5c0RldkV4dFRyYW1wKDE2MSkKK1BoeXNEZXZFeHRUcmFtcCgxNjIpCitQaHlzRGV2RXh0VHJhbXAoMTYzKQorUGh5c0RldkV4dFRyYW1wKDE2NCkKK1BoeXNEZXZFeHRUcmFtcCgxNjUpCitQaHlzRGV2RXh0VHJhbXAoMTY2KQorUGh5c0RldkV4dFRyYW1wKDE2NykKK1BoeXNEZXZFeHRUcmFtcCgxNjgpCitQaHlzRGV2RXh0VHJhbXAoMTY5KQorUGh5c0RldkV4dFRyYW1wKDE3MCkKK1BoeXNEZXZFeHRUcmFtcCgxNzEpCitQaHlzRGV2RXh0VHJhbXAoMTcyKQorUGh5c0RldkV4dFRyYW1wKDE3MykKK1BoeXNEZXZFeHRUcmFtcCgxNzQpCitQaHlzRGV2RXh0VHJhbXAoMTc1KQorUGh5c0RldkV4dFRyYW1wKDE3NikKK1BoeXNEZXZFeHRUcmFtcCgxNzcpCitQaHlzRGV2RXh0VHJhbXAoMTc4KQorUGh5c0RldkV4dFRyYW1wKDE3OSkKK1BoeXNEZXZFeHRUcmFtcCgxODApCitQaHlzRGV2RXh0VHJhbXAoMTgxKQorUGh5c0RldkV4dFRyYW1wKDE4MikKK1BoeXNEZXZFeHRUcmFtcCgxODMpCitQaHlzRGV2RXh0VHJhbXAoMTg0KQorUGh5c0RldkV4dFRyYW1wKDE4NSkKK1BoeXNEZXZFeHRUcmFtcCgxODYpCitQaHlzRGV2RXh0VHJhbXAoMTg3KQorUGh5c0RldkV4dFRyYW1wKDE4OCkKK1BoeXNEZXZFeHRUcmFtcCgxODkpCitQaHlzRGV2RXh0VHJhbXAoMTkwKQorUGh5c0RldkV4dFRyYW1wKDE5MSkKK1BoeXNEZXZFeHRUcmFtcCgxOTIpCitQaHlzRGV2RXh0VHJhbXAoMTkzKQorUGh5c0RldkV4dFRyYW1wKDE5NCkKK1BoeXNEZXZFeHRUcmFtcCgxOTUpCitQaHlzRGV2RXh0VHJhbXAoMTk2KQorUGh5c0RldkV4dFRyYW1wKDE5NykKK1BoeXNEZXZFeHRUcmFtcCgxOTgpCitQaHlzRGV2RXh0VHJhbXAoMTk5KQorUGh5c0RldkV4dFRyYW1wKDIwMCkKK1BoeXNEZXZFeHRUcmFtcCgyMDEpCitQaHlzRGV2RXh0VHJhbXAoMjAyKQorUGh5c0RldkV4dFRyYW1wKDIwMykKK1BoeXNEZXZFeHRUcmFtcCgyMDQpCitQaHlzRGV2RXh0VHJhbXAoMjA1KQorUGh5c0RldkV4dFRyYW1wKDIwNikKK1BoeXNEZXZFeHRUcmFtcCgyMDcpCitQaHlzRGV2RXh0VHJhbXAoMjA4KQorUGh5c0RldkV4dFRyYW1wKDIwOSkKK1BoeXNEZXZFeHRUcmFtcCgyMTApCitQaHlzRGV2RXh0VHJhbXAoMjExKQorUGh5c0RldkV4dFRyYW1wKDIxMikKK1BoeXNEZXZFeHRUcmFtcCgyMTMpCitQaHlzRGV2RXh0VHJhbXAoMjE0KQorUGh5c0RldkV4dFRyYW1wKDIxNSkKK1BoeXNEZXZFeHRUcmFtcCgyMTYpCitQaHlzRGV2RXh0VHJhbXAoMjE3KQorUGh5c0RldkV4dFRyYW1wKDIxOCkKK1BoeXNEZXZFeHRUcmFtcCgyMTkpCitQaHlzRGV2RXh0VHJhbXAoMjIwKQorUGh5c0RldkV4dFRyYW1wKDIyMSkKK1BoeXNEZXZFeHRUcmFtcCgyMjIpCitQaHlzRGV2RXh0VHJhbXAoMjIzKQorUGh5c0RldkV4dFRyYW1wKDIyNCkKK1BoeXNEZXZFeHRUcmFtcCgyMjUpCitQaHlzRGV2RXh0VHJhbXAoMjI2KQorUGh5c0RldkV4dFRyYW1wKDIyNykKK1BoeXNEZXZFeHRUcmFtcCgyMjgpCitQaHlzRGV2RXh0VHJhbXAoMjI5KQorUGh5c0RldkV4dFRyYW1wKDIzMCkKK1BoeXNEZXZFeHRUcmFtcCgyMzEpCitQaHlzRGV2RXh0VHJhbXAoMjMyKQorUGh5c0RldkV4dFRyYW1wKDIzMykKK1BoeXNEZXZFeHRUcmFtcCgyMzQpCitQaHlzRGV2RXh0VHJhbXAoMjM1KQorUGh5c0RldkV4dFRyYW1wKDIzNikKK1BoeXNEZXZFeHRUcmFtcCgyMzcpCitQaHlzRGV2RXh0VHJhbXAoMjM4KQorUGh5c0RldkV4dFRyYW1wKDIzOSkKK1BoeXNEZXZFeHRUcmFtcCgyNDApCitQaHlzRGV2RXh0VHJhbXAoMjQxKQorUGh5c0RldkV4dFRyYW1wKDI0MikKK1BoeXNEZXZFeHRUcmFtcCgyNDMpCitQaHlzRGV2RXh0VHJhbXAoMjQ0KQorUGh5c0RldkV4dFRyYW1wKDI0NSkKK1BoeXNEZXZFeHRUcmFtcCgyNDYpCitQaHlzRGV2RXh0VHJhbXAoMjQ3KQorUGh5c0RldkV4dFRyYW1wKDI0OCkKK1BoeXNEZXZFeHRUcmFtcCgyNDkpCisKKy8vIEluc3RhbnRpYXRpb25zIG9mIHRoZSB0ZXJtaW5hdG9yCitQaHlzRGV2RXh0VGVybWluKDApCitQaHlzRGV2RXh0VGVybWluKDEpCitQaHlzRGV2RXh0VGVybWluKDIpCitQaHlzRGV2RXh0VGVybWluKDMpCitQaHlzRGV2RXh0VGVybWluKDQpCitQaHlzRGV2RXh0VGVybWluKDUpCitQaHlzRGV2RXh0VGVybWluKDYpCitQaHlzRGV2RXh0VGVybWluKDcpCitQaHlzRGV2RXh0VGVybWluKDgpCitQaHlzRGV2RXh0VGVybWluKDkpCitQaHlzRGV2RXh0VGVybWluKDEwKQorUGh5c0RldkV4dFRlcm1pbigxMSkKK1BoeXNEZXZFeHRUZXJtaW4oMTIpCitQaHlzRGV2RXh0VGVybWluKDEzKQorUGh5c0RldkV4dFRlcm1pbigxNCkKK1BoeXNEZXZFeHRUZXJtaW4oMTUpCitQaHlzRGV2RXh0VGVybWluKDE2KQorUGh5c0RldkV4dFRlcm1pbigxNykKK1BoeXNEZXZFeHRUZXJtaW4oMTgpCitQaHlzRGV2RXh0VGVybWluKDE5KQorUGh5c0RldkV4dFRlcm1pbigyMCkKK1BoeXNEZXZFeHRUZXJtaW4oMjEpCitQaHlzRGV2RXh0VGVybWluKDIyKQorUGh5c0RldkV4dFRlcm1pbigyMykKK1BoeXNEZXZFeHRUZXJtaW4oMjQpCitQaHlzRGV2RXh0VGVybWluKDI1KQorUGh5c0RldkV4dFRlcm1pbigyNikKK1BoeXNEZXZFeHRUZXJtaW4oMjcpCitQaHlzRGV2RXh0VGVybWluKDI4KQorUGh5c0RldkV4dFRlcm1pbigyOSkKK1BoeXNEZXZFeHRUZXJtaW4oMzApCitQaHlzRGV2RXh0VGVybWluKDMxKQorUGh5c0RldkV4dFRlcm1pbigzMikKK1BoeXNEZXZFeHRUZXJtaW4oMzMpCitQaHlzRGV2RXh0VGVybWluKDM0KQorUGh5c0RldkV4dFRlcm1pbigzNSkKK1BoeXNEZXZFeHRUZXJtaW4oMzYpCitQaHlzRGV2RXh0VGVybWluKDM3KQorUGh5c0RldkV4dFRlcm1pbigzOCkKK1BoeXNEZXZFeHRUZXJtaW4oMzkpCitQaHlzRGV2RXh0VGVybWluKDQwKQorUGh5c0RldkV4dFRlcm1pbig0MSkKK1BoeXNEZXZFeHRUZXJtaW4oNDIpCitQaHlzRGV2RXh0VGVybWluKDQzKQorUGh5c0RldkV4dFRlcm1pbig0NCkKK1BoeXNEZXZFeHRUZXJtaW4oNDUpCitQaHlzRGV2RXh0VGVybWluKDQ2KQorUGh5c0RldkV4dFRlcm1pbig0NykKK1BoeXNEZXZFeHRUZXJtaW4oNDgpCitQaHlzRGV2RXh0VGVybWluKDQ5KQorUGh5c0RldkV4dFRlcm1pbig1MCkKK1BoeXNEZXZFeHRUZXJtaW4oNTEpCitQaHlzRGV2RXh0VGVybWluKDUyKQorUGh5c0RldkV4dFRlcm1pbig1MykKK1BoeXNEZXZFeHRUZXJtaW4oNTQpCitQaHlzRGV2RXh0VGVybWluKDU1KQorUGh5c0RldkV4dFRlcm1pbig1NikKK1BoeXNEZXZFeHRUZXJtaW4oNTcpCitQaHlzRGV2RXh0VGVybWluKDU4KQorUGh5c0RldkV4dFRlcm1pbig1OSkKK1BoeXNEZXZFeHRUZXJtaW4oNjApCitQaHlzRGV2RXh0VGVybWluKDYxKQorUGh5c0RldkV4dFRlcm1pbig2MikKK1BoeXNEZXZFeHRUZXJtaW4oNjMpCitQaHlzRGV2RXh0VGVybWluKDY0KQorUGh5c0RldkV4dFRlcm1pbig2NSkKK1BoeXNEZXZFeHRUZXJtaW4oNjYpCitQaHlzRGV2RXh0VGVybWluKDY3KQorUGh5c0RldkV4dFRlcm1pbig2OCkKK1BoeXNEZXZFeHRUZXJtaW4oNjkpCitQaHlzRGV2RXh0VGVybWluKDcwKQorUGh5c0RldkV4dFRlcm1pbig3MSkKK1BoeXNEZXZFeHRUZXJtaW4oNzIpCitQaHlzRGV2RXh0VGVybWluKDczKQorUGh5c0RldkV4dFRlcm1pbig3NCkKK1BoeXNEZXZFeHRUZXJtaW4oNzUpCitQaHlzRGV2RXh0VGVybWluKDc2KQorUGh5c0RldkV4dFRlcm1pbig3NykKK1BoeXNEZXZFeHRUZXJtaW4oNzgpCitQaHlzRGV2RXh0VGVybWluKDc5KQorUGh5c0RldkV4dFRlcm1pbig4MCkKK1BoeXNEZXZFeHRUZXJtaW4oODEpCitQaHlzRGV2RXh0VGVybWluKDgyKQorUGh5c0RldkV4dFRlcm1pbig4MykKK1BoeXNEZXZFeHRUZXJtaW4oODQpCitQaHlzRGV2RXh0VGVybWluKDg1KQorUGh5c0RldkV4dFRlcm1pbig4NikKK1BoeXNEZXZFeHRUZXJtaW4oODcpCitQaHlzRGV2RXh0VGVybWluKDg4KQorUGh5c0RldkV4dFRlcm1pbig4OSkKK1BoeXNEZXZFeHRUZXJtaW4oOTApCitQaHlzRGV2RXh0VGVybWluKDkxKQorUGh5c0RldkV4dFRlcm1pbig5MikKK1BoeXNEZXZFeHRUZXJtaW4oOTMpCitQaHlzRGV2RXh0VGVybWluKDk0KQorUGh5c0RldkV4dFRlcm1pbig5NSkKK1BoeXNEZXZFeHRUZXJtaW4oOTYpCitQaHlzRGV2RXh0VGVybWluKDk3KQorUGh5c0RldkV4dFRlcm1pbig5OCkKK1BoeXNEZXZFeHRUZXJtaW4oOTkpCitQaHlzRGV2RXh0VGVybWluKDEwMCkKK1BoeXNEZXZFeHRUZXJtaW4oMTAxKQorUGh5c0RldkV4dFRlcm1pbigxMDIpCitQaHlzRGV2RXh0VGVybWluKDEwMykKK1BoeXNEZXZFeHRUZXJtaW4oMTA0KQorUGh5c0RldkV4dFRlcm1pbigxMDUpCitQaHlzRGV2RXh0VGVybWluKDEwNikKK1BoeXNEZXZFeHRUZXJtaW4oMTA3KQorUGh5c0RldkV4dFRlcm1pbigxMDgpCitQaHlzRGV2RXh0VGVybWluKDEwOSkKK1BoeXNEZXZFeHRUZXJtaW4oMTEwKQorUGh5c0RldkV4dFRlcm1pbigxMTEpCitQaHlzRGV2RXh0VGVybWluKDExMikKK1BoeXNEZXZFeHRUZXJtaW4oMTEzKQorUGh5c0RldkV4dFRlcm1pbigxMTQpCitQaHlzRGV2RXh0VGVybWluKDExNSkKK1BoeXNEZXZFeHRUZXJtaW4oMTE2KQorUGh5c0RldkV4dFRlcm1pbigxMTcpCitQaHlzRGV2RXh0VGVybWluKDExOCkKK1BoeXNEZXZFeHRUZXJtaW4oMTE5KQorUGh5c0RldkV4dFRlcm1pbigxMjApCitQaHlzRGV2RXh0VGVybWluKDEyMSkKK1BoeXNEZXZFeHRUZXJtaW4oMTIyKQorUGh5c0RldkV4dFRlcm1pbigxMjMpCitQaHlzRGV2RXh0VGVybWluKDEyNCkKK1BoeXNEZXZFeHRUZXJtaW4oMTI1KQorUGh5c0RldkV4dFRlcm1pbigxMjYpCitQaHlzRGV2RXh0VGVybWluKDEyNykKK1BoeXNEZXZFeHRUZXJtaW4oMTI4KQorUGh5c0RldkV4dFRlcm1pbigxMjkpCitQaHlzRGV2RXh0VGVybWluKDEzMCkKK1BoeXNEZXZFeHRUZXJtaW4oMTMxKQorUGh5c0RldkV4dFRlcm1pbigxMzIpCitQaHlzRGV2RXh0VGVybWluKDEzMykKK1BoeXNEZXZFeHRUZXJtaW4oMTM0KQorUGh5c0RldkV4dFRlcm1pbigxMzUpCitQaHlzRGV2RXh0VGVybWluKDEzNikKK1BoeXNEZXZFeHRUZXJtaW4oMTM3KQorUGh5c0RldkV4dFRlcm1pbigxMzgpCitQaHlzRGV2RXh0VGVybWluKDEzOSkKK1BoeXNEZXZFeHRUZXJtaW4oMTQwKQorUGh5c0RldkV4dFRlcm1pbigxNDEpCitQaHlzRGV2RXh0VGVybWluKDE0MikKK1BoeXNEZXZFeHRUZXJtaW4oMTQzKQorUGh5c0RldkV4dFRlcm1pbigxNDQpCitQaHlzRGV2RXh0VGVybWluKDE0NSkKK1BoeXNEZXZFeHRUZXJtaW4oMTQ2KQorUGh5c0RldkV4dFRlcm1pbigxNDcpCitQaHlzRGV2RXh0VGVybWluKDE0OCkKK1BoeXNEZXZFeHRUZXJtaW4oMTQ5KQorUGh5c0RldkV4dFRlcm1pbigxNTApCitQaHlzRGV2RXh0VGVybWluKDE1MSkKK1BoeXNEZXZFeHRUZXJtaW4oMTUyKQorUGh5c0RldkV4dFRlcm1pbigxNTMpCitQaHlzRGV2RXh0VGVybWluKDE1NCkKK1BoeXNEZXZFeHRUZXJtaW4oMTU1KQorUGh5c0RldkV4dFRlcm1pbigxNTYpCitQaHlzRGV2RXh0VGVybWluKDE1NykKK1BoeXNEZXZFeHRUZXJtaW4oMTU4KQorUGh5c0RldkV4dFRlcm1pbigxNTkpCitQaHlzRGV2RXh0VGVybWluKDE2MCkKK1BoeXNEZXZFeHRUZXJtaW4oMTYxKQorUGh5c0RldkV4dFRlcm1pbigxNjIpCitQaHlzRGV2RXh0VGVybWluKDE2MykKK1BoeXNEZXZFeHRUZXJtaW4oMTY0KQorUGh5c0RldkV4dFRlcm1pbigxNjUpCitQaHlzRGV2RXh0VGVybWluKDE2NikKK1BoeXNEZXZFeHRUZXJtaW4oMTY3KQorUGh5c0RldkV4dFRlcm1pbigxNjgpCitQaHlzRGV2RXh0VGVybWluKDE2OSkKK1BoeXNEZXZFeHRUZXJtaW4oMTcwKQorUGh5c0RldkV4dFRlcm1pbigxNzEpCitQaHlzRGV2RXh0VGVybWluKDE3MikKK1BoeXNEZXZFeHRUZXJtaW4oMTczKQorUGh5c0RldkV4dFRlcm1pbigxNzQpCitQaHlzRGV2RXh0VGVybWluKDE3NSkKK1BoeXNEZXZFeHRUZXJtaW4oMTc2KQorUGh5c0RldkV4dFRlcm1pbigxNzcpCitQaHlzRGV2RXh0VGVybWluKDE3OCkKK1BoeXNEZXZFeHRUZXJtaW4oMTc5KQorUGh5c0RldkV4dFRlcm1pbigxODApCitQaHlzRGV2RXh0VGVybWluKDE4MSkKK1BoeXNEZXZFeHRUZXJtaW4oMTgyKQorUGh5c0RldkV4dFRlcm1pbigxODMpCitQaHlzRGV2RXh0VGVybWluKDE4NCkKK1BoeXNEZXZFeHRUZXJtaW4oMTg1KQorUGh5c0RldkV4dFRlcm1pbigxODYpCitQaHlzRGV2RXh0VGVybWluKDE4NykKK1BoeXNEZXZFeHRUZXJtaW4oMTg4KQorUGh5c0RldkV4dFRlcm1pbigxODkpCitQaHlzRGV2RXh0VGVybWluKDE5MCkKK1BoeXNEZXZFeHRUZXJtaW4oMTkxKQorUGh5c0RldkV4dFRlcm1pbigxOTIpCitQaHlzRGV2RXh0VGVybWluKDE5MykKK1BoeXNEZXZFeHRUZXJtaW4oMTk0KQorUGh5c0RldkV4dFRlcm1pbigxOTUpCitQaHlzRGV2RXh0VGVybWluKDE5NikKK1BoeXNEZXZFeHRUZXJtaW4oMTk3KQorUGh5c0RldkV4dFRlcm1pbigxOTgpCitQaHlzRGV2RXh0VGVybWluKDE5OSkKK1BoeXNEZXZFeHRUZXJtaW4oMjAwKQorUGh5c0RldkV4dFRlcm1pbigyMDEpCitQaHlzRGV2RXh0VGVybWluKDIwMikKK1BoeXNEZXZFeHRUZXJtaW4oMjAzKQorUGh5c0RldkV4dFRlcm1pbigyMDQpCitQaHlzRGV2RXh0VGVybWluKDIwNSkKK1BoeXNEZXZFeHRUZXJtaW4oMjA2KQorUGh5c0RldkV4dFRlcm1pbigyMDcpCitQaHlzRGV2RXh0VGVybWluKDIwOCkKK1BoeXNEZXZFeHRUZXJtaW4oMjA5KQorUGh5c0RldkV4dFRlcm1pbigyMTApCitQaHlzRGV2RXh0VGVybWluKDIxMSkKK1BoeXNEZXZFeHRUZXJtaW4oMjEyKQorUGh5c0RldkV4dFRlcm1pbigyMTMpCitQaHlzRGV2RXh0VGVybWluKDIxNCkKK1BoeXNEZXZFeHRUZXJtaW4oMjE1KQorUGh5c0RldkV4dFRlcm1pbigyMTYpCitQaHlzRGV2RXh0VGVybWluKDIxNykKK1BoeXNEZXZFeHRUZXJtaW4oMjE4KQorUGh5c0RldkV4dFRlcm1pbigyMTkpCitQaHlzRGV2RXh0VGVybWluKDIyMCkKK1BoeXNEZXZFeHRUZXJtaW4oMjIxKQorUGh5c0RldkV4dFRlcm1pbigyMjIpCitQaHlzRGV2RXh0VGVybWluKDIyMykKK1BoeXNEZXZFeHRUZXJtaW4oMjI0KQorUGh5c0RldkV4dFRlcm1pbigyMjUpCitQaHlzRGV2RXh0VGVybWluKDIyNikKK1BoeXNEZXZFeHRUZXJtaW4oMjI3KQorUGh5c0RldkV4dFRlcm1pbigyMjgpCitQaHlzRGV2RXh0VGVybWluKDIyOSkKK1BoeXNEZXZFeHRUZXJtaW4oMjMwKQorUGh5c0RldkV4dFRlcm1pbigyMzEpCitQaHlzRGV2RXh0VGVybWluKDIzMikKK1BoeXNEZXZFeHRUZXJtaW4oMjMzKQorUGh5c0RldkV4dFRlcm1pbigyMzQpCitQaHlzRGV2RXh0VGVybWluKDIzNSkKK1BoeXNEZXZFeHRUZXJtaW4oMjM2KQorUGh5c0RldkV4dFRlcm1pbigyMzcpCitQaHlzRGV2RXh0VGVybWluKDIzOCkKK1BoeXNEZXZFeHRUZXJtaW4oMjM5KQorUGh5c0RldkV4dFRlcm1pbigyNDApCitQaHlzRGV2RXh0VGVybWluKDI0MSkKK1BoeXNEZXZFeHRUZXJtaW4oMjQyKQorUGh5c0RldkV4dFRlcm1pbigyNDMpCitQaHlzRGV2RXh0VGVybWluKDI0NCkKK1BoeXNEZXZFeHRUZXJtaW4oMjQ1KQorUGh5c0RldkV4dFRlcm1pbigyNDYpCitQaHlzRGV2RXh0VGVybWluKDI0NykKK1BoeXNEZXZFeHRUZXJtaW4oMjQ4KQorUGh5c0RldkV4dFRlcm1pbigyNDkpCisKKy8vIEluc3RhbnRpYXRpb25zIG9mIHRoZSBkZXZpY2UgdHJhbXBvbGluZQorRGV2RXh0VHJhbXAoMCkKK0RldkV4dFRyYW1wKDEpCitEZXZFeHRUcmFtcCgyKQorRGV2RXh0VHJhbXAoMykKK0RldkV4dFRyYW1wKDQpCitEZXZFeHRUcmFtcCg1KQorRGV2RXh0VHJhbXAoNikKK0RldkV4dFRyYW1wKDcpCitEZXZFeHRUcmFtcCg4KQorRGV2RXh0VHJhbXAoOSkKK0RldkV4dFRyYW1wKDEwKQorRGV2RXh0VHJhbXAoMTEpCitEZXZFeHRUcmFtcCgxMikKK0RldkV4dFRyYW1wKDEzKQorRGV2RXh0VHJhbXAoMTQpCitEZXZFeHRUcmFtcCgxNSkKK0RldkV4dFRyYW1wKDE2KQorRGV2RXh0VHJhbXAoMTcpCitEZXZFeHRUcmFtcCgxOCkKK0RldkV4dFRyYW1wKDE5KQorRGV2RXh0VHJhbXAoMjApCitEZXZFeHRUcmFtcCgyMSkKK0RldkV4dFRyYW1wKDIyKQorRGV2RXh0VHJhbXAoMjMpCitEZXZFeHRUcmFtcCgyNCkKK0RldkV4dFRyYW1wKDI1KQorRGV2RXh0VHJhbXAoMjYpCitEZXZFeHRUcmFtcCgyNykKK0RldkV4dFRyYW1wKDI4KQorRGV2RXh0VHJhbXAoMjkpCitEZXZFeHRUcmFtcCgzMCkKK0RldkV4dFRyYW1wKDMxKQorRGV2RXh0VHJhbXAoMzIpCitEZXZFeHRUcmFtcCgzMykKK0RldkV4dFRyYW1wKDM0KQorRGV2RXh0VHJhbXAoMzUpCitEZXZFeHRUcmFtcCgzNikKK0RldkV4dFRyYW1wKDM3KQorRGV2RXh0VHJhbXAoMzgpCitEZXZFeHRUcmFtcCgzOSkKK0RldkV4dFRyYW1wKDQwKQorRGV2RXh0VHJhbXAoNDEpCitEZXZFeHRUcmFtcCg0MikKK0RldkV4dFRyYW1wKDQzKQorRGV2RXh0VHJhbXAoNDQpCitEZXZFeHRUcmFtcCg0NSkKK0RldkV4dFRyYW1wKDQ2KQorRGV2RXh0VHJhbXAoNDcpCitEZXZFeHRUcmFtcCg0OCkKK0RldkV4dFRyYW1wKDQ5KQorRGV2RXh0VHJhbXAoNTApCitEZXZFeHRUcmFtcCg1MSkKK0RldkV4dFRyYW1wKDUyKQorRGV2RXh0VHJhbXAoNTMpCitEZXZFeHRUcmFtcCg1NCkKK0RldkV4dFRyYW1wKDU1KQorRGV2RXh0VHJhbXAoNTYpCitEZXZFeHRUcmFtcCg1NykKK0RldkV4dFRyYW1wKDU4KQorRGV2RXh0VHJhbXAoNTkpCitEZXZFeHRUcmFtcCg2MCkKK0RldkV4dFRyYW1wKDYxKQorRGV2RXh0VHJhbXAoNjIpCitEZXZFeHRUcmFtcCg2MykKK0RldkV4dFRyYW1wKDY0KQorRGV2RXh0VHJhbXAoNjUpCitEZXZFeHRUcmFtcCg2NikKK0RldkV4dFRyYW1wKDY3KQorRGV2RXh0VHJhbXAoNjgpCitEZXZFeHRUcmFtcCg2OSkKK0RldkV4dFRyYW1wKDcwKQorRGV2RXh0VHJhbXAoNzEpCitEZXZFeHRUcmFtcCg3MikKK0RldkV4dFRyYW1wKDczKQorRGV2RXh0VHJhbXAoNzQpCitEZXZFeHRUcmFtcCg3NSkKK0RldkV4dFRyYW1wKDc2KQorRGV2RXh0VHJhbXAoNzcpCitEZXZFeHRUcmFtcCg3OCkKK0RldkV4dFRyYW1wKDc5KQorRGV2RXh0VHJhbXAoODApCitEZXZFeHRUcmFtcCg4MSkKK0RldkV4dFRyYW1wKDgyKQorRGV2RXh0VHJhbXAoODMpCitEZXZFeHRUcmFtcCg4NCkKK0RldkV4dFRyYW1wKDg1KQorRGV2RXh0VHJhbXAoODYpCitEZXZFeHRUcmFtcCg4NykKK0RldkV4dFRyYW1wKDg4KQorRGV2RXh0VHJhbXAoODkpCitEZXZFeHRUcmFtcCg5MCkKK0RldkV4dFRyYW1wKDkxKQorRGV2RXh0VHJhbXAoOTIpCitEZXZFeHRUcmFtcCg5MykKK0RldkV4dFRyYW1wKDk0KQorRGV2RXh0VHJhbXAoOTUpCitEZXZFeHRUcmFtcCg5NikKK0RldkV4dFRyYW1wKDk3KQorRGV2RXh0VHJhbXAoOTgpCitEZXZFeHRUcmFtcCg5OSkKK0RldkV4dFRyYW1wKDEwMCkKK0RldkV4dFRyYW1wKDEwMSkKK0RldkV4dFRyYW1wKDEwMikKK0RldkV4dFRyYW1wKDEwMykKK0RldkV4dFRyYW1wKDEwNCkKK0RldkV4dFRyYW1wKDEwNSkKK0RldkV4dFRyYW1wKDEwNikKK0RldkV4dFRyYW1wKDEwNykKK0RldkV4dFRyYW1wKDEwOCkKK0RldkV4dFRyYW1wKDEwOSkKK0RldkV4dFRyYW1wKDExMCkKK0RldkV4dFRyYW1wKDExMSkKK0RldkV4dFRyYW1wKDExMikKK0RldkV4dFRyYW1wKDExMykKK0RldkV4dFRyYW1wKDExNCkKK0RldkV4dFRyYW1wKDExNSkKK0RldkV4dFRyYW1wKDExNikKK0RldkV4dFRyYW1wKDExNykKK0RldkV4dFRyYW1wKDExOCkKK0RldkV4dFRyYW1wKDExOSkKK0RldkV4dFRyYW1wKDEyMCkKK0RldkV4dFRyYW1wKDEyMSkKK0RldkV4dFRyYW1wKDEyMikKK0RldkV4dFRyYW1wKDEyMykKK0RldkV4dFRyYW1wKDEyNCkKK0RldkV4dFRyYW1wKDEyNSkKK0RldkV4dFRyYW1wKDEyNikKK0RldkV4dFRyYW1wKDEyNykKK0RldkV4dFRyYW1wKDEyOCkKK0RldkV4dFRyYW1wKDEyOSkKK0RldkV4dFRyYW1wKDEzMCkKK0RldkV4dFRyYW1wKDEzMSkKK0RldkV4dFRyYW1wKDEzMikKK0RldkV4dFRyYW1wKDEzMykKK0RldkV4dFRyYW1wKDEzNCkKK0RldkV4dFRyYW1wKDEzNSkKK0RldkV4dFRyYW1wKDEzNikKK0RldkV4dFRyYW1wKDEzNykKK0RldkV4dFRyYW1wKDEzOCkKK0RldkV4dFRyYW1wKDEzOSkKK0RldkV4dFRyYW1wKDE0MCkKK0RldkV4dFRyYW1wKDE0MSkKK0RldkV4dFRyYW1wKDE0MikKK0RldkV4dFRyYW1wKDE0MykKK0RldkV4dFRyYW1wKDE0NCkKK0RldkV4dFRyYW1wKDE0NSkKK0RldkV4dFRyYW1wKDE0NikKK0RldkV4dFRyYW1wKDE0NykKK0RldkV4dFRyYW1wKDE0OCkKK0RldkV4dFRyYW1wKDE0OSkKK0RldkV4dFRyYW1wKDE1MCkKK0RldkV4dFRyYW1wKDE1MSkKK0RldkV4dFRyYW1wKDE1MikKK0RldkV4dFRyYW1wKDE1MykKK0RldkV4dFRyYW1wKDE1NCkKK0RldkV4dFRyYW1wKDE1NSkKK0RldkV4dFRyYW1wKDE1NikKK0RldkV4dFRyYW1wKDE1NykKK0RldkV4dFRyYW1wKDE1OCkKK0RldkV4dFRyYW1wKDE1OSkKK0RldkV4dFRyYW1wKDE2MCkKK0RldkV4dFRyYW1wKDE2MSkKK0RldkV4dFRyYW1wKDE2MikKK0RldkV4dFRyYW1wKDE2MykKK0RldkV4dFRyYW1wKDE2NCkKK0RldkV4dFRyYW1wKDE2NSkKK0RldkV4dFRyYW1wKDE2NikKK0RldkV4dFRyYW1wKDE2NykKK0RldkV4dFRyYW1wKDE2OCkKK0RldkV4dFRyYW1wKDE2OSkKK0RldkV4dFRyYW1wKDE3MCkKK0RldkV4dFRyYW1wKDE3MSkKK0RldkV4dFRyYW1wKDE3MikKK0RldkV4dFRyYW1wKDE3MykKK0RldkV4dFRyYW1wKDE3NCkKK0RldkV4dFRyYW1wKDE3NSkKK0RldkV4dFRyYW1wKDE3NikKK0RldkV4dFRyYW1wKDE3NykKK0RldkV4dFRyYW1wKDE3OCkKK0RldkV4dFRyYW1wKDE3OSkKK0RldkV4dFRyYW1wKDE4MCkKK0RldkV4dFRyYW1wKDE4MSkKK0RldkV4dFRyYW1wKDE4MikKK0RldkV4dFRyYW1wKDE4MykKK0RldkV4dFRyYW1wKDE4NCkKK0RldkV4dFRyYW1wKDE4NSkKK0RldkV4dFRyYW1wKDE4NikKK0RldkV4dFRyYW1wKDE4NykKK0RldkV4dFRyYW1wKDE4OCkKK0RldkV4dFRyYW1wKDE4OSkKK0RldkV4dFRyYW1wKDE5MCkKK0RldkV4dFRyYW1wKDE5MSkKK0RldkV4dFRyYW1wKDE5MikKK0RldkV4dFRyYW1wKDE5MykKK0RldkV4dFRyYW1wKDE5NCkKK0RldkV4dFRyYW1wKDE5NSkKK0RldkV4dFRyYW1wKDE5NikKK0RldkV4dFRyYW1wKDE5NykKK0RldkV4dFRyYW1wKDE5OCkKK0RldkV4dFRyYW1wKDE5OSkKK0RldkV4dFRyYW1wKDIwMCkKK0RldkV4dFRyYW1wKDIwMSkKK0RldkV4dFRyYW1wKDIwMikKK0RldkV4dFRyYW1wKDIwMykKK0RldkV4dFRyYW1wKDIwNCkKK0RldkV4dFRyYW1wKDIwNSkKK0RldkV4dFRyYW1wKDIwNikKK0RldkV4dFRyYW1wKDIwNykKK0RldkV4dFRyYW1wKDIwOCkKK0RldkV4dFRyYW1wKDIwOSkKK0RldkV4dFRyYW1wKDIxMCkKK0RldkV4dFRyYW1wKDIxMSkKK0RldkV4dFRyYW1wKDIxMikKK0RldkV4dFRyYW1wKDIxMykKK0RldkV4dFRyYW1wKDIxNCkKK0RldkV4dFRyYW1wKDIxNSkKK0RldkV4dFRyYW1wKDIxNikKK0RldkV4dFRyYW1wKDIxNykKK0RldkV4dFRyYW1wKDIxOCkKK0RldkV4dFRyYW1wKDIxOSkKK0RldkV4dFRyYW1wKDIyMCkKK0RldkV4dFRyYW1wKDIyMSkKK0RldkV4dFRyYW1wKDIyMikKK0RldkV4dFRyYW1wKDIyMykKK0RldkV4dFRyYW1wKDIyNCkKK0RldkV4dFRyYW1wKDIyNSkKK0RldkV4dFRyYW1wKDIyNikKK0RldkV4dFRyYW1wKDIyNykKK0RldkV4dFRyYW1wKDIyOCkKK0RldkV4dFRyYW1wKDIyOSkKK0RldkV4dFRyYW1wKDIzMCkKK0RldkV4dFRyYW1wKDIzMSkKK0RldkV4dFRyYW1wKDIzMikKK0RldkV4dFRyYW1wKDIzMykKK0RldkV4dFRyYW1wKDIzNCkKK0RldkV4dFRyYW1wKDIzNSkKK0RldkV4dFRyYW1wKDIzNikKK0RldkV4dFRyYW1wKDIzNykKK0RldkV4dFRyYW1wKDIzOCkKK0RldkV4dFRyYW1wKDIzOSkKK0RldkV4dFRyYW1wKDI0MCkKK0RldkV4dFRyYW1wKDI0MSkKK0RldkV4dFRyYW1wKDI0MikKK0RldkV4dFRyYW1wKDI0MykKK0RldkV4dFRyYW1wKDI0NCkKK0RldkV4dFRyYW1wKDI0NSkKK0RldkV4dFRyYW1wKDI0NikKK0RldkV4dFRyYW1wKDI0NykKK0RldkV4dFRyYW1wKDI0OCkKK0RldkV4dFRyYW1wKDI0OSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvdW5rbm93bl9leHRfY2hhaW5fZ2FzLlMgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3Vua25vd25fZXh0X2NoYWluX2dhcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDdlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3Vua25vd25fZXh0X2NoYWluX2dhcy5TCkBAIC0wLDAgKzEsODg1IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogTGVubnkgS29tb3cgPGxlbm55QGx1bmFyZy5jb20+CisjCisKKyMgVGhpcyBjb2RlIGlzIHVzZWQgdG8gcGFzcyBvbiBkZXZpY2UgKGluY2x1ZGluZyBwaHlzaWNhbCBkZXZpY2UpIGV4dGVuc2lvbnMgdGhyb3VnaCB0aGUgY2FsbCBjaGFpbi4gSXQgbXVzdCBkbyB0aGlzIHdpdGhvdXQKKyMgY3JlYXRpbmcgYSBzdGFjayBmcmFtZSwgYmVjYXVzZSB0aGUgYWN0dWFsIHBhcmFtZXRlcnMgb2YgdGhlIGNhbGwgYXJlIG5vdCBrbm93bi4gU2luY2UgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBrbm93biB0byBiZSBhCisjIFZrUGh5c2ljYWxEZXZpY2Ugb3IgYSBkaXNwYXRjaGFibGUgb2JqZWN0IGl0IGNhbiB1bndyYXAgdGhlIG9iamVjdCwgcG9zc2libHkgb3ZlcndyaXRpbmcgdGhlIHdyYXBwZWQgcGh5c2ljYWwgZGV2aWNlLCBhbmQgdGhlbgorIyBqdW1wIHRvIHRoZSBuZXh0IGZ1bmN0aW9uIGluIHRoZSBjYWxsIGNoYWluCisKKyNpZmRlZiBIQVZFX0NFVF9ICisjaW5jbHVkZSA8Y2V0Lmg+CisjZWxzZQorI2RlZmluZSBfQ0VUX0VOREJSCisjZW5kaWYKKworLmludGVsX3N5bnRheCBub3ByZWZpeAorLmluY2x1ZGUgImdlbl9kZWZpbmVzLmFzbSIKKworLmlmZGVmIFg4Nl82NAorCisubWFjcm8gUGh5c0RldkV4dFRyYW1wIG51bQorLmdsb2JhbCB2a1BoeXNEZXZFeHRUcmFtcFxudW0KK3ZrUGh5c0RldkV4dFRyYW1wXG51bToKKyAgICBfQ0VUX0VOREJSCisgICAgbW92ICAgICByYXgsIFtyZGldCisgICAgbW92ICAgICByZGksIFtyZGkgKyBQSFlTX0RFVl9PRkZTRVRfUEhZU19ERVZfVFJBTVBdCisgICAgam1wICAgICBbcmF4ICsgKFBIWVNfREVWX09GRlNFVF9JTlNUX0RJU1BBVENIICsgKFBUUl9TSVpFICogXG51bSkpXQorLmVuZG0KKworLm1hY3JvIFBoeXNEZXZFeHRUZXJtaW4gbnVtCisuZ2xvYmFsIHZrUGh5c0RldkV4dFRlcm1pblxudW0KK3ZrUGh5c0RldkV4dFRlcm1pblxudW06CisgICAgX0NFVF9FTkRCUgorICAgIG1vdiAgICAgcmF4LCBbcmRpICsgSUNEX1RFUk1fT0ZGU0VUX1BIWVNfREVWX1RFUk1dICAgICAgICAgICAgICAgICAgICAgICAgICAjIFN0b3JlIHRoZSBsb2FkZXJfaWNkX3Rlcm0qIGluIHJheAorICAgIGNtcCAgICAgcXdvcmQgcHRyIFtyYXggKyAoRElTUEFUQ0hfT0ZGU0VUX0lDRF9URVJNICsgKFBUUl9TSVpFICogXG51bSkpXSwgMCAjIENoZWNrIGlmIHRoZSBuZXh0IGZ1bmN0aW9uIGluIHRoZSBjaGFpbiBpcyBOVUxMCisgICAgamUgICAgICB0ZXJtaW5FcnJvclxudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgR28gdG8gdGhlIGVycm9yIHNlY3Rpb24gaWYgaXQgaXMgTlVMTAorICAgIG1vdiAgICAgcmRpLCBbcmRpICsgUEhZU19ERVZfT0ZGU0VUX1BIWVNfREVWX1RFUk1dICAgICAgICAgICAgICAgICAgICAgICAgICAjIExvYWQgdGhlIHVud3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIGludG8gdGhlIGZpcnN0IGFyZworICAgIGptcCAgICAgW3JheCArIChESVNQQVRDSF9PRkZTRVRfSUNEX1RFUk0gKyAoUFRSX1NJWkUgKiBcbnVtKSldICAgICAgICAgICAgICAjIEp1bXAgdG8gdGhlIG5leHQgZnVuY3Rpb24gaW4gdGhlIGNoYWluCit0ZXJtaW5FcnJvclxudW06CisgICAgc3ViICAgICByc3AsIDU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBzdGFjayBmcmFtZQorICAgIG1vdiAgICAgcmRpLCBbcmF4ICsgSU5TVEFOQ0VfT0ZGU0VUX0lDRF9URVJNXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIExvYWQgdGhlIGxvYWRlcl9pbnN0YW5jZSBpbnRvIHJkaSAoZmlyc3QgYXJnKQorICAgIG1vdiAgICAgcjgsIFtyZGkgKyAoSEFTSF9PRkZTRVRfSU5TVEFOQ0UgKyAoSEFTSF9TSVpFICogXG51bSkgKyBGVU5DX05BTUVfT0ZGU0VUX0hBU0gpXSAjIExvYWQgdGhlIGZ1bmMgbmFtZSBpbnRvIHI4IChmaWZ0aCBhcmcpCisgICAgbGVhICAgICByY3gsIHRlcm1pbl9lcnJvcl9zdHJpbmdAR09UUENSRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTG9hZCB0aGUgZXJyb3Igc3RyaW5nIGludG8gcmN4IChmb3VydGggYXJnKQorICAgIHhvciAgICAgZWR4LCBlZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCByZHggdG8gemVybyAodGhpcmQgYXJnKQorICAgIGxlYSAgICAgZXNpLCBbcmR4ICsgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFRdICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdyaXRlIHRoZSBlcnJvciBsb2dnaW5nIGJpdCB0byByc2kgKHNlY29uZCBhcmcpCisgICAgY2FsbCAgICBsb2FkZXJfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTG9nIHRoZSBlcnJvciBtZXNzYWdlIGJlZm9yZSB3ZSBjcmFzaAorICAgIGFkZCAgICAgcnNwLCA1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENsZWFuIHVwIHRoZSBzdGFjayBmcmFtZQorICAgIG1vdiAgICAgcmF4LCAwCisgICAgam1wICAgICByYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ3Jhc2ggaW50ZW50aW9uYWxseSBieSBqdW1waW5nIHRvIGFkZHJlc3MgemVybworLmVuZG0KKworLm1hY3JvIERldkV4dFRyYW1wIG51bQorLmdsb2JhbCB2a2Rldl9leHRcbnVtCit2a2Rldl9leHRcbnVtOgorICAgIF9DRVRfRU5EQlIKKyAgICBtb3YgICAgIHJheCwgW3JkaV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEZXJlZmVyZW5jZSB0aGUgaGFuZGxlIHRvIGdldCB0aGUgZGlzcGF0Y2ggdGFibGUKKyAgICBqbXAgICAgIFtyYXggKyAoRVhUX09GRlNFVF9ERVZJQ0VfRElTUEFUQ0ggKyAoUFRSX1NJWkUgKiBcbnVtKSldICAgICAgICAgICAgIyBKdW1wIHRvIHRoZSBhcHByb3ByaWF0ZSBjYWxsIGNoYWluCisuZW5kbQorCisuZWxzZQorCisubWFjcm8gUGh5c0RldkV4dFRyYW1wIG51bQorLmdsb2JhbCB2a1BoeXNEZXZFeHRUcmFtcFxudW0KK3ZrUGh5c0RldkV4dFRyYW1wXG51bToKKyAgICBfQ0VUX0VOREJSCisgICAgbW92ICAgICBlYXgsIFtlc3AgKyA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTG9hZCB0aGUgd3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIGludG8gZWF4CisgICAgbW92ICAgICBlY3gsIFtlYXggKyBQSFlTX0RFVl9PRkZTRVRfUEhZU19ERVZfVFJBTVBdICMgTG9hZCB0aGUgdW53cmFwcGVkIFZrUGh5c2ljYWxEZXZpY2UgaW50byBlY3gKKyAgICBtb3YgICAgIFtlc3AgKyA0XSwgZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPdmVyd3JpdGUgdGhlIHdyYXBwZWQgVmtQaHlzaWNhbERldmljZSB3aXRoIHRoZSB1bndyYXBwZWQgb25lIChvbiB0aGUgc3RhY2spCisgICAgbW92ICAgICBlYXgsIFtlYXhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVyZWZlcmVuY2UgdGhlIHdyYXBwZWQgVmtQaHlzaWNhbERldmljZSB0byBnZXQgdGhlIGRpc3BhdGNoIHRhYmxlIGluIGVheAorICAgIGptcCAgICAgW2VheCArIChQSFlTX0RFVl9PRkZTRVRfSU5TVF9ESVNQQVRDSCArIChQVFJfU0laRSAqIFxudW0pKV0gIyBEZXJlZmVyZW5jZSB0aGUgd3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIHRvIGdldCB0aGUgZGlzcGF0Y2ggdGFibGUgaW4gZWF4CisuZW5kbQorCisubWFjcm8gUGh5c0RldkV4dFRlcm1pbiBudW0KKy5nbG9iYWwgdmtQaHlzRGV2RXh0VGVybWluXG51bQordmtQaHlzRGV2RXh0VGVybWluXG51bToKKyAgICBfQ0VUX0VOREJSCisgICAgbW92ICAgICBlY3gsIFtlc3AgKyA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTW92ZSB0aGUgd3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIGludG8gZWN4CisgICAgbW92ICAgICBlYXgsIFtlY3ggKyBJQ0RfVEVSTV9PRkZTRVRfUEhZU19ERVZfVEVSTV0gICAgICAgICAgICAgICAgICAgICAgICAgICMgU3RvcmUgdGhlIGxvYWRlcl9pY2RfdGVybSogaW4gZWF4CisgICAgY21wICAgICBkd29yZCBwdHIgW2VheCArIChESVNQQVRDSF9PRkZTRVRfSUNEX1RFUk0gKyAoUFRSX1NJWkUgKiBcbnVtKSldLCAwICMgQ2hlY2sgaWYgdGhlIG5leHQgZnVuY3Rpb24gaW4gdGhlIGNoYWluIGlzIE5VTEwKKyAgICBqZSAgICAgIHRlcm1pbkVycm9yXG51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHbyB0byB0aGUgZXJyb3Igc2VjdGlvbiBpZiBpdCBpcyBOVUxMCisgICAgbW92ICAgICBlY3gsIFtlY3ggKyBQSFlTX0RFVl9PRkZTRVRfUEhZU19ERVZfVEVSTV0gICAgICAgICAgICAgICAgICAgICAgICAgICMgVW53cmFwIHRoZSBWa1BoeXNpY2FsRGV2aWNlIGluIGVjeAorICAgIG1vdiAgICAgW2VzcCArIDRdLCBlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENvcHkgdGhlIHVud3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIGludG8gdGhlIGZpcnN0IGFyZworICAgIGptcCAgICAgW2VheCArIChESVNQQVRDSF9PRkZTRVRfSUNEX1RFUk0gKyAoUFRSX1NJWkUgKiBcbnVtKSldICAgICAgICAgICAgICAjIEp1bXAgdG8gdGhlIG5leHQgZnVuY3Rpb24gaW4gdGhlIGNoYWluCit0ZXJtaW5FcnJvclxudW06CisgICAgbW92ICAgICBlYXgsIFtlYXggKyBJTlNUQU5DRV9PRkZTRVRfSUNEX1RFUk1dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTG9hZCB0aGUgbG9hZGVyX2luc3RhbmNlIGludG8gZWF4CisgICAgcHVzaCAgICBbZWF4ICsgKEhBU0hfT0ZGU0VUX0lOU1RBTkNFICsgKEhBU0hfU0laRSAqIFxudW0pICsgRlVOQ19OQU1FX09GRlNFVF9IQVNIKV0gIyBQdXNoIHRoZSBmdW5jIG5hbWUgKGZpZnRoIGFyZykKKyAgICBwdXNoICAgIG9mZnNldCB0ZXJtaW5fZXJyb3Jfc3RyaW5nQEdPVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQdXNoIHRoZSBlcnJvciBzdHJpbmcgKGZvdXJ0aCBhcmcpCisgICAgcHVzaCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUHVzaCB6ZXJvICh0aGlyZCBhcmcpCisgICAgcHVzaCAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUHVzaCB0aGUgZXJyb3IgbG9nZ2luZyBiaXQgKHNlY29uZCBhcmcpCisgICAgcHVzaCAgICBlYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUHVzaCB0aGUgbG9hZGVyX2luc3RhbmNlIChmaXJzdCBhcmcpCisgICAgY2FsbCAgICBsb2FkZXJfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTG9nIHRoZSBlcnJvciBtZXNzYWdlIGJlZm9yZSB3ZSBjcmFzaAorICAgIGFkZCAgICAgZXNwLCAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENsZWFuIHVwIHRoZSBhcmdzCisgICAgbW92ICAgICBlYXgsIDAKKyAgICBqbXAgICAgIGVheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDcmFzaCBpbnRlbnRpb25hbGx5IGJ5IGp1bXBpbmcgdG8gYWRkcmVzcyB6ZXJvCisuZW5kbQorCisubWFjcm8gRGV2RXh0VHJhbXAgbnVtCisuZ2xvYmFsIHZrZGV2X2V4dFxudW0KK3ZrZGV2X2V4dFxudW06CisgICAgX0NFVF9FTkRCUgorICAgIG1vdiAgICAgZWF4LCBbZXNwICsgNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIERlcmVmZXJlbmNlIHRoZSBoYW5kbGUgdG8gZ2V0IHRoZSBkaXNwYXRjaCB0YWJsZQorICAgIGptcCAgICAgW2VheCArIChFWFRfT0ZGU0VUX0RFVklDRV9ESVNQQVRDSCArIChQVFJfU0laRSAqIFxudW0pKV0gICAgICAgICAgICAjIEp1bXAgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGwgY2hhaW4KKy5lbmRtCisKKy5lbmRpZgorCisjaWYgZGVmaW5lZChfX0VMRl9fKQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLCVwcm9nYml0cworI2VuZGlmCisKKy5kYXRhCisKK3Rlcm1pbl9lcnJvcl9zdHJpbmc6Cisuc3RyaW5nICJFeHRlbnNpb24gJXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBwaHlzaWNhbCBkZXZpY2UiCisKKy50ZXh0CisKKyAgICBQaHlzRGV2RXh0VHJhbXAgMAorICAgIFBoeXNEZXZFeHRUcmFtcCAxCisgICAgUGh5c0RldkV4dFRyYW1wIDIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMworICAgIFBoeXNEZXZFeHRUcmFtcCA0CisgICAgUGh5c0RldkV4dFRyYW1wIDUKKyAgICBQaHlzRGV2RXh0VHJhbXAgNgorICAgIFBoeXNEZXZFeHRUcmFtcCA3CisgICAgUGh5c0RldkV4dFRyYW1wIDgKKyAgICBQaHlzRGV2RXh0VHJhbXAgOQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMgorICAgIFBoeXNEZXZFeHRUcmFtcCAxMworICAgIFBoeXNEZXZFeHRUcmFtcCAxNAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNgorICAgIFBoeXNEZXZFeHRUcmFtcCAxNworICAgIFBoeXNEZXZFeHRUcmFtcCAxOAorICAgIFBoeXNEZXZFeHRUcmFtcCAxOQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMgorICAgIFBoeXNEZXZFeHRUcmFtcCAyMworICAgIFBoeXNEZXZFeHRUcmFtcCAyNAorICAgIFBoeXNEZXZFeHRUcmFtcCAyNQorICAgIFBoeXNEZXZFeHRUcmFtcCAyNgorICAgIFBoeXNEZXZFeHRUcmFtcCAyNworICAgIFBoeXNEZXZFeHRUcmFtcCAyOAorICAgIFBoeXNEZXZFeHRUcmFtcCAyOQorICAgIFBoeXNEZXZFeHRUcmFtcCAzMAorICAgIFBoeXNEZXZFeHRUcmFtcCAzMQorICAgIFBoeXNEZXZFeHRUcmFtcCAzMgorICAgIFBoeXNEZXZFeHRUcmFtcCAzMworICAgIFBoeXNEZXZFeHRUcmFtcCAzNAorICAgIFBoeXNEZXZFeHRUcmFtcCAzNQorICAgIFBoeXNEZXZFeHRUcmFtcCAzNgorICAgIFBoeXNEZXZFeHRUcmFtcCAzNworICAgIFBoeXNEZXZFeHRUcmFtcCAzOAorICAgIFBoeXNEZXZFeHRUcmFtcCAzOQorICAgIFBoeXNEZXZFeHRUcmFtcCA0MAorICAgIFBoeXNEZXZFeHRUcmFtcCA0MQorICAgIFBoeXNEZXZFeHRUcmFtcCA0MgorICAgIFBoeXNEZXZFeHRUcmFtcCA0MworICAgIFBoeXNEZXZFeHRUcmFtcCA0NAorICAgIFBoeXNEZXZFeHRUcmFtcCA0NQorICAgIFBoeXNEZXZFeHRUcmFtcCA0NgorICAgIFBoeXNEZXZFeHRUcmFtcCA0NworICAgIFBoeXNEZXZFeHRUcmFtcCA0OAorICAgIFBoeXNEZXZFeHRUcmFtcCA0OQorICAgIFBoeXNEZXZFeHRUcmFtcCA1MAorICAgIFBoeXNEZXZFeHRUcmFtcCA1MQorICAgIFBoeXNEZXZFeHRUcmFtcCA1MgorICAgIFBoeXNEZXZFeHRUcmFtcCA1MworICAgIFBoeXNEZXZFeHRUcmFtcCA1NAorICAgIFBoeXNEZXZFeHRUcmFtcCA1NQorICAgIFBoeXNEZXZFeHRUcmFtcCA1NgorICAgIFBoeXNEZXZFeHRUcmFtcCA1NworICAgIFBoeXNEZXZFeHRUcmFtcCA1OAorICAgIFBoeXNEZXZFeHRUcmFtcCA1OQorICAgIFBoeXNEZXZFeHRUcmFtcCA2MAorICAgIFBoeXNEZXZFeHRUcmFtcCA2MQorICAgIFBoeXNEZXZFeHRUcmFtcCA2MgorICAgIFBoeXNEZXZFeHRUcmFtcCA2MworICAgIFBoeXNEZXZFeHRUcmFtcCA2NAorICAgIFBoeXNEZXZFeHRUcmFtcCA2NQorICAgIFBoeXNEZXZFeHRUcmFtcCA2NgorICAgIFBoeXNEZXZFeHRUcmFtcCA2NworICAgIFBoeXNEZXZFeHRUcmFtcCA2OAorICAgIFBoeXNEZXZFeHRUcmFtcCA2OQorICAgIFBoeXNEZXZFeHRUcmFtcCA3MAorICAgIFBoeXNEZXZFeHRUcmFtcCA3MQorICAgIFBoeXNEZXZFeHRUcmFtcCA3MgorICAgIFBoeXNEZXZFeHRUcmFtcCA3MworICAgIFBoeXNEZXZFeHRUcmFtcCA3NAorICAgIFBoeXNEZXZFeHRUcmFtcCA3NQorICAgIFBoeXNEZXZFeHRUcmFtcCA3NgorICAgIFBoeXNEZXZFeHRUcmFtcCA3NworICAgIFBoeXNEZXZFeHRUcmFtcCA3OAorICAgIFBoeXNEZXZFeHRUcmFtcCA3OQorICAgIFBoeXNEZXZFeHRUcmFtcCA4MAorICAgIFBoeXNEZXZFeHRUcmFtcCA4MQorICAgIFBoeXNEZXZFeHRUcmFtcCA4MgorICAgIFBoeXNEZXZFeHRUcmFtcCA4MworICAgIFBoeXNEZXZFeHRUcmFtcCA4NAorICAgIFBoeXNEZXZFeHRUcmFtcCA4NQorICAgIFBoeXNEZXZFeHRUcmFtcCA4NgorICAgIFBoeXNEZXZFeHRUcmFtcCA4NworICAgIFBoeXNEZXZFeHRUcmFtcCA4OAorICAgIFBoeXNEZXZFeHRUcmFtcCA4OQorICAgIFBoeXNEZXZFeHRUcmFtcCA5MAorICAgIFBoeXNEZXZFeHRUcmFtcCA5MQorICAgIFBoeXNEZXZFeHRUcmFtcCA5MgorICAgIFBoeXNEZXZFeHRUcmFtcCA5MworICAgIFBoeXNEZXZFeHRUcmFtcCA5NAorICAgIFBoeXNEZXZFeHRUcmFtcCA5NQorICAgIFBoeXNEZXZFeHRUcmFtcCA5NgorICAgIFBoeXNEZXZFeHRUcmFtcCA5NworICAgIFBoeXNEZXZFeHRUcmFtcCA5OAorICAgIFBoeXNEZXZFeHRUcmFtcCA5OQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMDAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTAxCisgICAgUGh5c0RldkV4dFRyYW1wIDEwMgorICAgIFBoeXNEZXZFeHRUcmFtcCAxMDMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTA0CisgICAgUGh5c0RldkV4dFRyYW1wIDEwNQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMDYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTA3CisgICAgUGh5c0RldkV4dFRyYW1wIDEwOAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMDkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTEwCisgICAgUGh5c0RldkV4dFRyYW1wIDExMQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMTIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTEzCisgICAgUGh5c0RldkV4dFRyYW1wIDExNAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMTUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTE2CisgICAgUGh5c0RldkV4dFRyYW1wIDExNworICAgIFBoeXNEZXZFeHRUcmFtcCAxMTgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTE5CisgICAgUGh5c0RldkV4dFRyYW1wIDEyMAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMjEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTIyCisgICAgUGh5c0RldkV4dFRyYW1wIDEyMworICAgIFBoeXNEZXZFeHRUcmFtcCAxMjQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTI1CisgICAgUGh5c0RldkV4dFRyYW1wIDEyNgorICAgIFBoeXNEZXZFeHRUcmFtcCAxMjcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTI4CisgICAgUGh5c0RldkV4dFRyYW1wIDEyOQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMzAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTMxCisgICAgUGh5c0RldkV4dFRyYW1wIDEzMgorICAgIFBoeXNEZXZFeHRUcmFtcCAxMzMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTM0CisgICAgUGh5c0RldkV4dFRyYW1wIDEzNQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMzYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTM3CisgICAgUGh5c0RldkV4dFRyYW1wIDEzOAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMzkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTQwCisgICAgUGh5c0RldkV4dFRyYW1wIDE0MQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNDIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTQzCisgICAgUGh5c0RldkV4dFRyYW1wIDE0NAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNDUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTQ2CisgICAgUGh5c0RldkV4dFRyYW1wIDE0NworICAgIFBoeXNEZXZFeHRUcmFtcCAxNDgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTQ5CisgICAgUGh5c0RldkV4dFRyYW1wIDE1MAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNTEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTUyCisgICAgUGh5c0RldkV4dFRyYW1wIDE1MworICAgIFBoeXNEZXZFeHRUcmFtcCAxNTQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTU1CisgICAgUGh5c0RldkV4dFRyYW1wIDE1NgorICAgIFBoeXNEZXZFeHRUcmFtcCAxNTcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTU4CisgICAgUGh5c0RldkV4dFRyYW1wIDE1OQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNjAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTYxCisgICAgUGh5c0RldkV4dFRyYW1wIDE2MgorICAgIFBoeXNEZXZFeHRUcmFtcCAxNjMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTY0CisgICAgUGh5c0RldkV4dFRyYW1wIDE2NQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNjYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTY3CisgICAgUGh5c0RldkV4dFRyYW1wIDE2OAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNjkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTcwCisgICAgUGh5c0RldkV4dFRyYW1wIDE3MQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNzIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTczCisgICAgUGh5c0RldkV4dFRyYW1wIDE3NAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNzUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTc2CisgICAgUGh5c0RldkV4dFRyYW1wIDE3NworICAgIFBoeXNEZXZFeHRUcmFtcCAxNzgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTc5CisgICAgUGh5c0RldkV4dFRyYW1wIDE4MAorICAgIFBoeXNEZXZFeHRUcmFtcCAxODEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTgyCisgICAgUGh5c0RldkV4dFRyYW1wIDE4MworICAgIFBoeXNEZXZFeHRUcmFtcCAxODQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTg1CisgICAgUGh5c0RldkV4dFRyYW1wIDE4NgorICAgIFBoeXNEZXZFeHRUcmFtcCAxODcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTg4CisgICAgUGh5c0RldkV4dFRyYW1wIDE4OQorICAgIFBoeXNEZXZFeHRUcmFtcCAxOTAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTkxCisgICAgUGh5c0RldkV4dFRyYW1wIDE5MgorICAgIFBoeXNEZXZFeHRUcmFtcCAxOTMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTk0CisgICAgUGh5c0RldkV4dFRyYW1wIDE5NQorICAgIFBoeXNEZXZFeHRUcmFtcCAxOTYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTk3CisgICAgUGh5c0RldkV4dFRyYW1wIDE5OAorICAgIFBoeXNEZXZFeHRUcmFtcCAxOTkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjAwCisgICAgUGh5c0RldkV4dFRyYW1wIDIwMQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMDIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjAzCisgICAgUGh5c0RldkV4dFRyYW1wIDIwNAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMDUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjA2CisgICAgUGh5c0RldkV4dFRyYW1wIDIwNworICAgIFBoeXNEZXZFeHRUcmFtcCAyMDgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjA5CisgICAgUGh5c0RldkV4dFRyYW1wIDIxMAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMTEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjEyCisgICAgUGh5c0RldkV4dFRyYW1wIDIxMworICAgIFBoeXNEZXZFeHRUcmFtcCAyMTQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjE1CisgICAgUGh5c0RldkV4dFRyYW1wIDIxNgorICAgIFBoeXNEZXZFeHRUcmFtcCAyMTcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjE4CisgICAgUGh5c0RldkV4dFRyYW1wIDIxOQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMjAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjIxCisgICAgUGh5c0RldkV4dFRyYW1wIDIyMgorICAgIFBoeXNEZXZFeHRUcmFtcCAyMjMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjI0CisgICAgUGh5c0RldkV4dFRyYW1wIDIyNQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMjYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjI3CisgICAgUGh5c0RldkV4dFRyYW1wIDIyOAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMjkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjMwCisgICAgUGh5c0RldkV4dFRyYW1wIDIzMQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMzIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjMzCisgICAgUGh5c0RldkV4dFRyYW1wIDIzNAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMzUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjM2CisgICAgUGh5c0RldkV4dFRyYW1wIDIzNworICAgIFBoeXNEZXZFeHRUcmFtcCAyMzgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjM5CisgICAgUGh5c0RldkV4dFRyYW1wIDI0MAorICAgIFBoeXNEZXZFeHRUcmFtcCAyNDEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjQyCisgICAgUGh5c0RldkV4dFRyYW1wIDI0MworICAgIFBoeXNEZXZFeHRUcmFtcCAyNDQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjQ1CisgICAgUGh5c0RldkV4dFRyYW1wIDI0NgorICAgIFBoeXNEZXZFeHRUcmFtcCAyNDcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjQ4CisgICAgUGh5c0RldkV4dFRyYW1wIDI0OQorCisgICAgUGh5c0RldkV4dFRlcm1pbiAwCisgICAgUGh5c0RldkV4dFRlcm1pbiAxCisgICAgUGh5c0RldkV4dFRlcm1pbiAyCisgICAgUGh5c0RldkV4dFRlcm1pbiAzCisgICAgUGh5c0RldkV4dFRlcm1pbiA0CisgICAgUGh5c0RldkV4dFRlcm1pbiA1CisgICAgUGh5c0RldkV4dFRlcm1pbiA2CisgICAgUGh5c0RldkV4dFRlcm1pbiA3CisgICAgUGh5c0RldkV4dFRlcm1pbiA4CisgICAgUGh5c0RldkV4dFRlcm1pbiA5CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTEKKyAgICBQaHlzRGV2RXh0VGVybWluIDEyCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTQKKyAgICBQaHlzRGV2RXh0VGVybWluIDE1CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTcKKyAgICBQaHlzRGV2RXh0VGVybWluIDE4CisgICAgUGh5c0RldkV4dFRlcm1pbiAxOQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjAKKyAgICBQaHlzRGV2RXh0VGVybWluIDIxCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjMKKyAgICBQaHlzRGV2RXh0VGVybWluIDI0CisgICAgUGh5c0RldkV4dFRlcm1pbiAyNQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjYKKyAgICBQaHlzRGV2RXh0VGVybWluIDI3CisgICAgUGh5c0RldkV4dFRlcm1pbiAyOAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjkKKyAgICBQaHlzRGV2RXh0VGVybWluIDMwCisgICAgUGh5c0RldkV4dFRlcm1pbiAzMQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMzIKKyAgICBQaHlzRGV2RXh0VGVybWluIDMzCisgICAgUGh5c0RldkV4dFRlcm1pbiAzNAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMzUKKyAgICBQaHlzRGV2RXh0VGVybWluIDM2CisgICAgUGh5c0RldkV4dFRlcm1pbiAzNworICAgIFBoeXNEZXZFeHRUZXJtaW4gMzgKKyAgICBQaHlzRGV2RXh0VGVybWluIDM5CisgICAgUGh5c0RldkV4dFRlcm1pbiA0MAorICAgIFBoeXNEZXZFeHRUZXJtaW4gNDEKKyAgICBQaHlzRGV2RXh0VGVybWluIDQyCisgICAgUGh5c0RldkV4dFRlcm1pbiA0MworICAgIFBoeXNEZXZFeHRUZXJtaW4gNDQKKyAgICBQaHlzRGV2RXh0VGVybWluIDQ1CisgICAgUGh5c0RldkV4dFRlcm1pbiA0NgorICAgIFBoeXNEZXZFeHRUZXJtaW4gNDcKKyAgICBQaHlzRGV2RXh0VGVybWluIDQ4CisgICAgUGh5c0RldkV4dFRlcm1pbiA0OQorICAgIFBoeXNEZXZFeHRUZXJtaW4gNTAKKyAgICBQaHlzRGV2RXh0VGVybWluIDUxCisgICAgUGh5c0RldkV4dFRlcm1pbiA1MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gNTMKKyAgICBQaHlzRGV2RXh0VGVybWluIDU0CisgICAgUGh5c0RldkV4dFRlcm1pbiA1NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gNTYKKyAgICBQaHlzRGV2RXh0VGVybWluIDU3CisgICAgUGh5c0RldkV4dFRlcm1pbiA1OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gNTkKKyAgICBQaHlzRGV2RXh0VGVybWluIDYwCisgICAgUGh5c0RldkV4dFRlcm1pbiA2MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gNjIKKyAgICBQaHlzRGV2RXh0VGVybWluIDYzCisgICAgUGh5c0RldkV4dFRlcm1pbiA2NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gNjUKKyAgICBQaHlzRGV2RXh0VGVybWluIDY2CisgICAgUGh5c0RldkV4dFRlcm1pbiA2NworICAgIFBoeXNEZXZFeHRUZXJtaW4gNjgKKyAgICBQaHlzRGV2RXh0VGVybWluIDY5CisgICAgUGh5c0RldkV4dFRlcm1pbiA3MAorICAgIFBoeXNEZXZFeHRUZXJtaW4gNzEKKyAgICBQaHlzRGV2RXh0VGVybWluIDcyCisgICAgUGh5c0RldkV4dFRlcm1pbiA3MworICAgIFBoeXNEZXZFeHRUZXJtaW4gNzQKKyAgICBQaHlzRGV2RXh0VGVybWluIDc1CisgICAgUGh5c0RldkV4dFRlcm1pbiA3NgorICAgIFBoeXNEZXZFeHRUZXJtaW4gNzcKKyAgICBQaHlzRGV2RXh0VGVybWluIDc4CisgICAgUGh5c0RldkV4dFRlcm1pbiA3OQorICAgIFBoeXNEZXZFeHRUZXJtaW4gODAKKyAgICBQaHlzRGV2RXh0VGVybWluIDgxCisgICAgUGh5c0RldkV4dFRlcm1pbiA4MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gODMKKyAgICBQaHlzRGV2RXh0VGVybWluIDg0CisgICAgUGh5c0RldkV4dFRlcm1pbiA4NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gODYKKyAgICBQaHlzRGV2RXh0VGVybWluIDg3CisgICAgUGh5c0RldkV4dFRlcm1pbiA4OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gODkKKyAgICBQaHlzRGV2RXh0VGVybWluIDkwCisgICAgUGh5c0RldkV4dFRlcm1pbiA5MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gOTIKKyAgICBQaHlzRGV2RXh0VGVybWluIDkzCisgICAgUGh5c0RldkV4dFRlcm1pbiA5NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gOTUKKyAgICBQaHlzRGV2RXh0VGVybWluIDk2CisgICAgUGh5c0RldkV4dFRlcm1pbiA5NworICAgIFBoeXNEZXZFeHRUZXJtaW4gOTgKKyAgICBQaHlzRGV2RXh0VGVybWluIDk5CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMDAKKyAgICBQaHlzRGV2RXh0VGVybWluIDEwMQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTAyCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMDMKKyAgICBQaHlzRGV2RXh0VGVybWluIDEwNAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTA1CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMDYKKyAgICBQaHlzRGV2RXh0VGVybWluIDEwNworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTA4CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMDkKKyAgICBQaHlzRGV2RXh0VGVybWluIDExMAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTExCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMTIKKyAgICBQaHlzRGV2RXh0VGVybWluIDExMworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTE0CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMTUKKyAgICBQaHlzRGV2RXh0VGVybWluIDExNgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTE3CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMTgKKyAgICBQaHlzRGV2RXh0VGVybWluIDExOQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTIwCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMjEKKyAgICBQaHlzRGV2RXh0VGVybWluIDEyMgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTIzCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMjQKKyAgICBQaHlzRGV2RXh0VGVybWluIDEyNQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTI2CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMjcKKyAgICBQaHlzRGV2RXh0VGVybWluIDEyOAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTI5CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMzAKKyAgICBQaHlzRGV2RXh0VGVybWluIDEzMQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTMyCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMzMKKyAgICBQaHlzRGV2RXh0VGVybWluIDEzNAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTM1CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMzYKKyAgICBQaHlzRGV2RXh0VGVybWluIDEzNworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTM4CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMzkKKyAgICBQaHlzRGV2RXh0VGVybWluIDE0MAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTQxCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNDIKKyAgICBQaHlzRGV2RXh0VGVybWluIDE0MworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTQ0CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNDUKKyAgICBQaHlzRGV2RXh0VGVybWluIDE0NgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTQ3CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNDgKKyAgICBQaHlzRGV2RXh0VGVybWluIDE0OQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTUwCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNTEKKyAgICBQaHlzRGV2RXh0VGVybWluIDE1MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTUzCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNTQKKyAgICBQaHlzRGV2RXh0VGVybWluIDE1NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTU2CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNTcKKyAgICBQaHlzRGV2RXh0VGVybWluIDE1OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTU5CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNjAKKyAgICBQaHlzRGV2RXh0VGVybWluIDE2MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTYyCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNjMKKyAgICBQaHlzRGV2RXh0VGVybWluIDE2NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTY1CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNjYKKyAgICBQaHlzRGV2RXh0VGVybWluIDE2NworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTY4CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNjkKKyAgICBQaHlzRGV2RXh0VGVybWluIDE3MAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTcxCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNzIKKyAgICBQaHlzRGV2RXh0VGVybWluIDE3MworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTc0CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNzUKKyAgICBQaHlzRGV2RXh0VGVybWluIDE3NgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTc3CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNzgKKyAgICBQaHlzRGV2RXh0VGVybWluIDE3OQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTgwCisgICAgUGh5c0RldkV4dFRlcm1pbiAxODEKKyAgICBQaHlzRGV2RXh0VGVybWluIDE4MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTgzCisgICAgUGh5c0RldkV4dFRlcm1pbiAxODQKKyAgICBQaHlzRGV2RXh0VGVybWluIDE4NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTg2CisgICAgUGh5c0RldkV4dFRlcm1pbiAxODcKKyAgICBQaHlzRGV2RXh0VGVybWluIDE4OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTg5CisgICAgUGh5c0RldkV4dFRlcm1pbiAxOTAKKyAgICBQaHlzRGV2RXh0VGVybWluIDE5MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTkyCisgICAgUGh5c0RldkV4dFRlcm1pbiAxOTMKKyAgICBQaHlzRGV2RXh0VGVybWluIDE5NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTk1CisgICAgUGh5c0RldkV4dFRlcm1pbiAxOTYKKyAgICBQaHlzRGV2RXh0VGVybWluIDE5NworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTk4CisgICAgUGh5c0RldkV4dFRlcm1pbiAxOTkKKyAgICBQaHlzRGV2RXh0VGVybWluIDIwMAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjAxCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMDIKKyAgICBQaHlzRGV2RXh0VGVybWluIDIwMworICAgIFBoeXNEZXZFeHRUZXJtaW4gMjA0CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMDUKKyAgICBQaHlzRGV2RXh0VGVybWluIDIwNgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjA3CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMDgKKyAgICBQaHlzRGV2RXh0VGVybWluIDIwOQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjEwCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMTEKKyAgICBQaHlzRGV2RXh0VGVybWluIDIxMgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjEzCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMTQKKyAgICBQaHlzRGV2RXh0VGVybWluIDIxNQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjE2CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMTcKKyAgICBQaHlzRGV2RXh0VGVybWluIDIxOAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjE5CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMjAKKyAgICBQaHlzRGV2RXh0VGVybWluIDIyMQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjIyCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMjMKKyAgICBQaHlzRGV2RXh0VGVybWluIDIyNAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjI1CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMjYKKyAgICBQaHlzRGV2RXh0VGVybWluIDIyNworICAgIFBoeXNEZXZFeHRUZXJtaW4gMjI4CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMjkKKyAgICBQaHlzRGV2RXh0VGVybWluIDIzMAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjMxCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMzIKKyAgICBQaHlzRGV2RXh0VGVybWluIDIzMworICAgIFBoeXNEZXZFeHRUZXJtaW4gMjM0CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMzUKKyAgICBQaHlzRGV2RXh0VGVybWluIDIzNgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjM3CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMzgKKyAgICBQaHlzRGV2RXh0VGVybWluIDIzOQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjQwCisgICAgUGh5c0RldkV4dFRlcm1pbiAyNDEKKyAgICBQaHlzRGV2RXh0VGVybWluIDI0MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjQzCisgICAgUGh5c0RldkV4dFRlcm1pbiAyNDQKKyAgICBQaHlzRGV2RXh0VGVybWluIDI0NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjQ2CisgICAgUGh5c0RldkV4dFRlcm1pbiAyNDcKKyAgICBQaHlzRGV2RXh0VGVybWluIDI0OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjQ5CisKKyAgICBEZXZFeHRUcmFtcCAwCisgICAgRGV2RXh0VHJhbXAgMQorICAgIERldkV4dFRyYW1wIDIKKyAgICBEZXZFeHRUcmFtcCAzCisgICAgRGV2RXh0VHJhbXAgNAorICAgIERldkV4dFRyYW1wIDUKKyAgICBEZXZFeHRUcmFtcCA2CisgICAgRGV2RXh0VHJhbXAgNworICAgIERldkV4dFRyYW1wIDgKKyAgICBEZXZFeHRUcmFtcCA5CisgICAgRGV2RXh0VHJhbXAgMTAKKyAgICBEZXZFeHRUcmFtcCAxMQorICAgIERldkV4dFRyYW1wIDEyCisgICAgRGV2RXh0VHJhbXAgMTMKKyAgICBEZXZFeHRUcmFtcCAxNAorICAgIERldkV4dFRyYW1wIDE1CisgICAgRGV2RXh0VHJhbXAgMTYKKyAgICBEZXZFeHRUcmFtcCAxNworICAgIERldkV4dFRyYW1wIDE4CisgICAgRGV2RXh0VHJhbXAgMTkKKyAgICBEZXZFeHRUcmFtcCAyMAorICAgIERldkV4dFRyYW1wIDIxCisgICAgRGV2RXh0VHJhbXAgMjIKKyAgICBEZXZFeHRUcmFtcCAyMworICAgIERldkV4dFRyYW1wIDI0CisgICAgRGV2RXh0VHJhbXAgMjUKKyAgICBEZXZFeHRUcmFtcCAyNgorICAgIERldkV4dFRyYW1wIDI3CisgICAgRGV2RXh0VHJhbXAgMjgKKyAgICBEZXZFeHRUcmFtcCAyOQorICAgIERldkV4dFRyYW1wIDMwCisgICAgRGV2RXh0VHJhbXAgMzEKKyAgICBEZXZFeHRUcmFtcCAzMgorICAgIERldkV4dFRyYW1wIDMzCisgICAgRGV2RXh0VHJhbXAgMzQKKyAgICBEZXZFeHRUcmFtcCAzNQorICAgIERldkV4dFRyYW1wIDM2CisgICAgRGV2RXh0VHJhbXAgMzcKKyAgICBEZXZFeHRUcmFtcCAzOAorICAgIERldkV4dFRyYW1wIDM5CisgICAgRGV2RXh0VHJhbXAgNDAKKyAgICBEZXZFeHRUcmFtcCA0MQorICAgIERldkV4dFRyYW1wIDQyCisgICAgRGV2RXh0VHJhbXAgNDMKKyAgICBEZXZFeHRUcmFtcCA0NAorICAgIERldkV4dFRyYW1wIDQ1CisgICAgRGV2RXh0VHJhbXAgNDYKKyAgICBEZXZFeHRUcmFtcCA0NworICAgIERldkV4dFRyYW1wIDQ4CisgICAgRGV2RXh0VHJhbXAgNDkKKyAgICBEZXZFeHRUcmFtcCA1MAorICAgIERldkV4dFRyYW1wIDUxCisgICAgRGV2RXh0VHJhbXAgNTIKKyAgICBEZXZFeHRUcmFtcCA1MworICAgIERldkV4dFRyYW1wIDU0CisgICAgRGV2RXh0VHJhbXAgNTUKKyAgICBEZXZFeHRUcmFtcCA1NgorICAgIERldkV4dFRyYW1wIDU3CisgICAgRGV2RXh0VHJhbXAgNTgKKyAgICBEZXZFeHRUcmFtcCA1OQorICAgIERldkV4dFRyYW1wIDYwCisgICAgRGV2RXh0VHJhbXAgNjEKKyAgICBEZXZFeHRUcmFtcCA2MgorICAgIERldkV4dFRyYW1wIDYzCisgICAgRGV2RXh0VHJhbXAgNjQKKyAgICBEZXZFeHRUcmFtcCA2NQorICAgIERldkV4dFRyYW1wIDY2CisgICAgRGV2RXh0VHJhbXAgNjcKKyAgICBEZXZFeHRUcmFtcCA2OAorICAgIERldkV4dFRyYW1wIDY5CisgICAgRGV2RXh0VHJhbXAgNzAKKyAgICBEZXZFeHRUcmFtcCA3MQorICAgIERldkV4dFRyYW1wIDcyCisgICAgRGV2RXh0VHJhbXAgNzMKKyAgICBEZXZFeHRUcmFtcCA3NAorICAgIERldkV4dFRyYW1wIDc1CisgICAgRGV2RXh0VHJhbXAgNzYKKyAgICBEZXZFeHRUcmFtcCA3NworICAgIERldkV4dFRyYW1wIDc4CisgICAgRGV2RXh0VHJhbXAgNzkKKyAgICBEZXZFeHRUcmFtcCA4MAorICAgIERldkV4dFRyYW1wIDgxCisgICAgRGV2RXh0VHJhbXAgODIKKyAgICBEZXZFeHRUcmFtcCA4MworICAgIERldkV4dFRyYW1wIDg0CisgICAgRGV2RXh0VHJhbXAgODUKKyAgICBEZXZFeHRUcmFtcCA4NgorICAgIERldkV4dFRyYW1wIDg3CisgICAgRGV2RXh0VHJhbXAgODgKKyAgICBEZXZFeHRUcmFtcCA4OQorICAgIERldkV4dFRyYW1wIDkwCisgICAgRGV2RXh0VHJhbXAgOTEKKyAgICBEZXZFeHRUcmFtcCA5MgorICAgIERldkV4dFRyYW1wIDkzCisgICAgRGV2RXh0VHJhbXAgOTQKKyAgICBEZXZFeHRUcmFtcCA5NQorICAgIERldkV4dFRyYW1wIDk2CisgICAgRGV2RXh0VHJhbXAgOTcKKyAgICBEZXZFeHRUcmFtcCA5OAorICAgIERldkV4dFRyYW1wIDk5CisgICAgRGV2RXh0VHJhbXAgMTAwCisgICAgRGV2RXh0VHJhbXAgMTAxCisgICAgRGV2RXh0VHJhbXAgMTAyCisgICAgRGV2RXh0VHJhbXAgMTAzCisgICAgRGV2RXh0VHJhbXAgMTA0CisgICAgRGV2RXh0VHJhbXAgMTA1CisgICAgRGV2RXh0VHJhbXAgMTA2CisgICAgRGV2RXh0VHJhbXAgMTA3CisgICAgRGV2RXh0VHJhbXAgMTA4CisgICAgRGV2RXh0VHJhbXAgMTA5CisgICAgRGV2RXh0VHJhbXAgMTEwCisgICAgRGV2RXh0VHJhbXAgMTExCisgICAgRGV2RXh0VHJhbXAgMTEyCisgICAgRGV2RXh0VHJhbXAgMTEzCisgICAgRGV2RXh0VHJhbXAgMTE0CisgICAgRGV2RXh0VHJhbXAgMTE1CisgICAgRGV2RXh0VHJhbXAgMTE2CisgICAgRGV2RXh0VHJhbXAgMTE3CisgICAgRGV2RXh0VHJhbXAgMTE4CisgICAgRGV2RXh0VHJhbXAgMTE5CisgICAgRGV2RXh0VHJhbXAgMTIwCisgICAgRGV2RXh0VHJhbXAgMTIxCisgICAgRGV2RXh0VHJhbXAgMTIyCisgICAgRGV2RXh0VHJhbXAgMTIzCisgICAgRGV2RXh0VHJhbXAgMTI0CisgICAgRGV2RXh0VHJhbXAgMTI1CisgICAgRGV2RXh0VHJhbXAgMTI2CisgICAgRGV2RXh0VHJhbXAgMTI3CisgICAgRGV2RXh0VHJhbXAgMTI4CisgICAgRGV2RXh0VHJhbXAgMTI5CisgICAgRGV2RXh0VHJhbXAgMTMwCisgICAgRGV2RXh0VHJhbXAgMTMxCisgICAgRGV2RXh0VHJhbXAgMTMyCisgICAgRGV2RXh0VHJhbXAgMTMzCisgICAgRGV2RXh0VHJhbXAgMTM0CisgICAgRGV2RXh0VHJhbXAgMTM1CisgICAgRGV2RXh0VHJhbXAgMTM2CisgICAgRGV2RXh0VHJhbXAgMTM3CisgICAgRGV2RXh0VHJhbXAgMTM4CisgICAgRGV2RXh0VHJhbXAgMTM5CisgICAgRGV2RXh0VHJhbXAgMTQwCisgICAgRGV2RXh0VHJhbXAgMTQxCisgICAgRGV2RXh0VHJhbXAgMTQyCisgICAgRGV2RXh0VHJhbXAgMTQzCisgICAgRGV2RXh0VHJhbXAgMTQ0CisgICAgRGV2RXh0VHJhbXAgMTQ1CisgICAgRGV2RXh0VHJhbXAgMTQ2CisgICAgRGV2RXh0VHJhbXAgMTQ3CisgICAgRGV2RXh0VHJhbXAgMTQ4CisgICAgRGV2RXh0VHJhbXAgMTQ5CisgICAgRGV2RXh0VHJhbXAgMTUwCisgICAgRGV2RXh0VHJhbXAgMTUxCisgICAgRGV2RXh0VHJhbXAgMTUyCisgICAgRGV2RXh0VHJhbXAgMTUzCisgICAgRGV2RXh0VHJhbXAgMTU0CisgICAgRGV2RXh0VHJhbXAgMTU1CisgICAgRGV2RXh0VHJhbXAgMTU2CisgICAgRGV2RXh0VHJhbXAgMTU3CisgICAgRGV2RXh0VHJhbXAgMTU4CisgICAgRGV2RXh0VHJhbXAgMTU5CisgICAgRGV2RXh0VHJhbXAgMTYwCisgICAgRGV2RXh0VHJhbXAgMTYxCisgICAgRGV2RXh0VHJhbXAgMTYyCisgICAgRGV2RXh0VHJhbXAgMTYzCisgICAgRGV2RXh0VHJhbXAgMTY0CisgICAgRGV2RXh0VHJhbXAgMTY1CisgICAgRGV2RXh0VHJhbXAgMTY2CisgICAgRGV2RXh0VHJhbXAgMTY3CisgICAgRGV2RXh0VHJhbXAgMTY4CisgICAgRGV2RXh0VHJhbXAgMTY5CisgICAgRGV2RXh0VHJhbXAgMTcwCisgICAgRGV2RXh0VHJhbXAgMTcxCisgICAgRGV2RXh0VHJhbXAgMTcyCisgICAgRGV2RXh0VHJhbXAgMTczCisgICAgRGV2RXh0VHJhbXAgMTc0CisgICAgRGV2RXh0VHJhbXAgMTc1CisgICAgRGV2RXh0VHJhbXAgMTc2CisgICAgRGV2RXh0VHJhbXAgMTc3CisgICAgRGV2RXh0VHJhbXAgMTc4CisgICAgRGV2RXh0VHJhbXAgMTc5CisgICAgRGV2RXh0VHJhbXAgMTgwCisgICAgRGV2RXh0VHJhbXAgMTgxCisgICAgRGV2RXh0VHJhbXAgMTgyCisgICAgRGV2RXh0VHJhbXAgMTgzCisgICAgRGV2RXh0VHJhbXAgMTg0CisgICAgRGV2RXh0VHJhbXAgMTg1CisgICAgRGV2RXh0VHJhbXAgMTg2CisgICAgRGV2RXh0VHJhbXAgMTg3CisgICAgRGV2RXh0VHJhbXAgMTg4CisgICAgRGV2RXh0VHJhbXAgMTg5CisgICAgRGV2RXh0VHJhbXAgMTkwCisgICAgRGV2RXh0VHJhbXAgMTkxCisgICAgRGV2RXh0VHJhbXAgMTkyCisgICAgRGV2RXh0VHJhbXAgMTkzCisgICAgRGV2RXh0VHJhbXAgMTk0CisgICAgRGV2RXh0VHJhbXAgMTk1CisgICAgRGV2RXh0VHJhbXAgMTk2CisgICAgRGV2RXh0VHJhbXAgMTk3CisgICAgRGV2RXh0VHJhbXAgMTk4CisgICAgRGV2RXh0VHJhbXAgMTk5CisgICAgRGV2RXh0VHJhbXAgMjAwCisgICAgRGV2RXh0VHJhbXAgMjAxCisgICAgRGV2RXh0VHJhbXAgMjAyCisgICAgRGV2RXh0VHJhbXAgMjAzCisgICAgRGV2RXh0VHJhbXAgMjA0CisgICAgRGV2RXh0VHJhbXAgMjA1CisgICAgRGV2RXh0VHJhbXAgMjA2CisgICAgRGV2RXh0VHJhbXAgMjA3CisgICAgRGV2RXh0VHJhbXAgMjA4CisgICAgRGV2RXh0VHJhbXAgMjA5CisgICAgRGV2RXh0VHJhbXAgMjEwCisgICAgRGV2RXh0VHJhbXAgMjExCisgICAgRGV2RXh0VHJhbXAgMjEyCisgICAgRGV2RXh0VHJhbXAgMjEzCisgICAgRGV2RXh0VHJhbXAgMjE0CisgICAgRGV2RXh0VHJhbXAgMjE1CisgICAgRGV2RXh0VHJhbXAgMjE2CisgICAgRGV2RXh0VHJhbXAgMjE3CisgICAgRGV2RXh0VHJhbXAgMjE4CisgICAgRGV2RXh0VHJhbXAgMjE5CisgICAgRGV2RXh0VHJhbXAgMjIwCisgICAgRGV2RXh0VHJhbXAgMjIxCisgICAgRGV2RXh0VHJhbXAgMjIyCisgICAgRGV2RXh0VHJhbXAgMjIzCisgICAgRGV2RXh0VHJhbXAgMjI0CisgICAgRGV2RXh0VHJhbXAgMjI1CisgICAgRGV2RXh0VHJhbXAgMjI2CisgICAgRGV2RXh0VHJhbXAgMjI3CisgICAgRGV2RXh0VHJhbXAgMjI4CisgICAgRGV2RXh0VHJhbXAgMjI5CisgICAgRGV2RXh0VHJhbXAgMjMwCisgICAgRGV2RXh0VHJhbXAgMjMxCisgICAgRGV2RXh0VHJhbXAgMjMyCisgICAgRGV2RXh0VHJhbXAgMjMzCisgICAgRGV2RXh0VHJhbXAgMjM0CisgICAgRGV2RXh0VHJhbXAgMjM1CisgICAgRGV2RXh0VHJhbXAgMjM2CisgICAgRGV2RXh0VHJhbXAgMjM3CisgICAgRGV2RXh0VHJhbXAgMjM4CisgICAgRGV2RXh0VHJhbXAgMjM5CisgICAgRGV2RXh0VHJhbXAgMjQwCisgICAgRGV2RXh0VHJhbXAgMjQxCisgICAgRGV2RXh0VHJhbXAgMjQyCisgICAgRGV2RXh0VHJhbXAgMjQzCisgICAgRGV2RXh0VHJhbXAgMjQ0CisgICAgRGV2RXh0VHJhbXAgMjQ1CisgICAgRGV2RXh0VHJhbXAgMjQ2CisgICAgRGV2RXh0VHJhbXAgMjQ3CisgICAgRGV2RXh0VHJhbXAgMjQ4CisgICAgRGV2RXh0VHJhbXAgMjQ5CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3Vua25vd25fZXh0X2NoYWluX21hc20uYXNtIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci91bmtub3duX2V4dF9jaGFpbl9tYXNtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGJjN2MyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci91bmtub3duX2V4dF9jaGFpbl9tYXNtLmFzbQpAQCAtMCwwICsxLDg4MyBAQAorOworOyBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorOyBDb3B5cmlnaHQgKGMpIDIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKzsgQ29weXJpZ2h0IChjKSAyMDE3IEx1bmFyRywgSW5jLgorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOworOyBBdXRob3I6IExlbm55IEtvbW93IDxsZW5ueUBsdW5hcmcuY29tPgorOworCis7IFRoaXMgY29kZSBpcyB1c2VkIHRvIHBhc3Mgb24gZGV2aWNlIChpbmNsdWRpbmcgcGh5c2ljYWwgZGV2aWNlKSBleHRlbnNpb25zIHRocm91Z2ggdGhlIGNhbGwgY2hhaW4uIEl0IG11c3QgZG8gdGhpcyB3aXRob3V0Cis7IGNyZWF0aW5nIGEgc3RhY2sgZnJhbWUsIGJlY2F1c2UgdGhlIGFjdHVhbCBwYXJhbWV0ZXJzIG9mIHRoZSBjYWxsIGFyZSBub3Qga25vd24uIFNpbmNlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMga25vd24gdG8gYmUgYQorOyBWa1BoeXNpY2FsRGV2aWNlIG9yIGEgZGlzcGF0Y2hhYmxlIG9iamVjdCBpdCBjYW4gdW53cmFwIHRoZSBvYmplY3QsIHBvc3NpYmx5IG92ZXJ3cml0aW5nIHRoZSB3cmFwcGVkIHBoeXNpY2FsIGRldmljZSwgYW5kIHRoZW4KKzsganVtcCB0byB0aGUgbmV4dCBmdW5jdGlvbiBpbiB0aGUgY2FsbCBjaGFpbgorCis7IENvZGVnZW4gZGVmaW5lcyBhIG51bWJlciBvZiB2YWx1ZXMsIGNoaWVmbHkgb2Zmc2V0cyBvZiBtZW1iZXJzIHdpdGhpbiBzdHJ1Y3RzIGFuZCBzaXplcyBvZiBkYXRhIHR5cGVzIHdpdGhpbiBnZW5fZGVmaW5lcy5hc20uCis7IFN0cnVjdCBtZW1iZXIgb2Zmc2V0cyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybWF0ICJYWF9PRkZTRVRfWVkiIHdoZXJlIFhYIGluZGljYXRlcyB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0IGFuZCBZWSBpbmRpY2F0ZXMKKzsgdGhlIHN0cnVjdCB0eXBlIHRoYXQgaXQgaXMgYSBtZW1iZXIgb2YuIERhdGEgdHlwZSBzaXplcyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybWF0ICJYWF9TSVpFIiB3aGVyZSBYWCBpbmRpY2F0ZXMgdGhlIGRhdGEgdHlwZS4KK0lOQ0xVREUgZ2VuX2RlZmluZXMuYXNtCisKKzsgNjQtYml0IHZhbHVlcyBhbmQgbWFjcm8KK0lGREVGIHJheAorCitQaHlzRGV2RXh0VHJhbXAgbWFjcm8gbnVtOnJlcQorcHVibGljIHZrUGh5c0RldkV4dFRyYW1wJm51bSYKK3ZrUGh5c0RldkV4dFRyYW1wJm51bSY6CisgICAgbW92ICAgICByYXgsIHF3b3JkIHB0ciBbcmN4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IERlcmVmZXJlbmNlIHRoZSB3cmFwcGVkIFZrUGh5c2ljYWxEZXZpY2UgdG8gZ2V0IHRoZSBkaXNwYXRjaCB0YWJsZSBpbiByYXgKKyAgICBtb3YgICAgIHJjeCwgcXdvcmQgcHRyIFtyY3ggKyBQSFlTX0RFVl9PRkZTRVRfUEhZU19ERVZfVFJBTVBdICAgOyBMb2FkIHRoZSB1bndyYXBwZWQgVmtQaHlzaWNhbERldmljZSBpbnRvIHJjeAorICAgIGptcCAgICAgcXdvcmQgcHRyIFtyYXggKyAoUEhZU19ERVZfT0ZGU0VUX0lOU1RfRElTUEFUQ0ggKyAoUFRSX1NJWkUgKiBudW0pKV0gOyBKdW1wIHRvIHRoZSBuZXh0IGZ1bmN0aW9uIGluIHRoZSBjaGFpbiwgcHJlc2VydmluZyB0aGUgYXJncyBpbiBvdGhlciByZWdpc3RlcnMKK2VuZG0KKworUGh5c0RldkV4dFRlcm1pbiBtYWNybyBudW0KK3B1YmxpYyB2a1BoeXNEZXZFeHRUZXJtaW4mbnVtJgordmtQaHlzRGV2RXh0VGVybWluJm51bSY6CisgICAgbW92ICAgICByYXgsIHF3b3JkIHB0ciBbcmN4ICsgSUNEX1RFUk1fT0ZGU0VUX1BIWVNfREVWX1RFUk1dICAgICAgICAgICAgICAgIDsgU3RvcmUgdGhlIGxvYWRlcl9pY2RfdGVybSogaW4gcmF4CisgICAgY21wICAgICBxd29yZCBwdHIgW3JheCArIChESVNQQVRDSF9PRkZTRVRfSUNEX1RFUk0gKyAoUFRSX1NJWkUgKiBudW0pKV0sIDAgIDsgQ2hlY2sgaWYgdGhlIG5leHQgZnVuY3Rpb24gaW4gdGhlIGNoYWluIGlzIE5VTEwKKyAgICBqZSAgICAgIHRlcm1pbkVycm9yJm51bSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBHbyB0byB0aGUgZXJyb3Igc2VjdGlvbiBpZiBpdCBpcyBOVUxMCisgICAgbW92ICAgICByY3gsIHF3b3JkIHB0ciBbcmN4ICsgUEhZU19ERVZfT0ZGU0VUX1BIWVNfREVWX1RFUk1dICAgICAgICAgICAgICAgIDsgTG9hZCB0aGUgdW53cmFwcGVkIFZrUGh5c2ljYWxEZXZpY2UgaW50byB0aGUgZmlyc3QgYXJnCisgICAgam1wICAgICBxd29yZCBwdHIgW3JheCArIChESVNQQVRDSF9PRkZTRVRfSUNEX1RFUk0gKyAoUFRSX1NJWkUgKiBudW0pKV0gICAgIDsgSnVtcCB0byB0aGUgbmV4dCBmdW5jdGlvbiBpbiB0aGUgY2hhaW4KK3Rlcm1pbkVycm9yJm51bSY6CisgICAgc3ViICAgICByc3AsIDU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ3JlYXRlIHRoZSBzdGFjayBmcmFtZQorICAgIG1vdiAgICAgcmN4LCBxd29yZCBwdHIgW3JheCArIElOU1RBTkNFX09GRlNFVF9JQ0RfVEVSTV0gICAgICAgICAgICAgICAgICAgICA7IExvYWQgdGhlIGxvYWRlcl9pbnN0YW5jZSBpbnRvIHJjeCAoZmlyc3QgYXJnKQorICAgIG1vdiAgICAgcmF4LCBxd29yZCBwdHIgW3JjeCArIChIQVNIX09GRlNFVF9JTlNUQU5DRSArIChIQVNIX1NJWkUgKiBudW0pICsgRlVOQ19OQU1FX09GRlNFVF9IQVNIKV0gOyBMb2FkIHRoZSBmdW5jIG5hbWUgaW50byByYXgKKyAgICBsZWEgICAgIHI5LCB0ZXJtaW5fZXJyb3Jfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb2FkIHRoZSBlcnJvciBzdHJpbmcgaW50byByOSAoZm91cnRoIGFyZykKKyAgICB4b3IgICAgIHI4ZCwgcjhkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTZXQgcjggdG8gemVybyAodGhpcmQgYXJnKQorICAgIG1vdiAgICAgcXdvcmQgcHRyIFtyc3AgKyAzMl0sIHJheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IE1vdmUgdGhlIGZ1bmMgbmFtZSBvbnRvIHRoZSBzdGFjayAoZmlmdGggYXJnKQorICAgIGxlYSAgICAgZWR4LCBbcjggKyBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7IFdyaXRlIHRoZSBlcnJvciBsb2dnaW5nIGJpdCB0byByZHggKHNlY29uZCBhcmcpCisgICAgY2FsbCAgICBsb2FkZXJfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9nIHRoZSBlcnJvciBtZXNzYWdlIGJlZm9yZSB3ZSBjcmFzaAorICAgIGFkZCAgICAgcnNwLCA1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFuIHVwIHRoZSBzdGFjayBmcmFtZQorICAgIG1vdiAgICAgcmF4LCAwCisgICAgam1wICAgICByYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ3Jhc2ggaW50ZW50aW9uYWxseSBieSBqdW1waW5nIHRvIGFkZHJlc3MgemVybworZW5kbQorCitEZXZFeHRUcmFtcCBtYWNybyBudW0KK3B1YmxpYyB2a2Rldl9leHQmbnVtJgordmtkZXZfZXh0Jm51bSY6CisgICAgbW92ICAgICByYXgsIHF3b3JkIHB0ciBbcmN4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBEZXJlZmVyZW5jZSB0aGUgaGFuZGxlIHRvIGdldCB0aGUgZGlzcGF0Y2ggdGFibGUKKyAgICBqbXAgICAgIHF3b3JkIHB0ciBbcmF4ICsgKEVYVF9PRkZTRVRfREVWSUNFX0RJU1BBVENIICsgKFBUUl9TSVpFICogbnVtKSldICA7IEp1bXAgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGwgY2hhaW4KK2VuZG0KKworOyAzMi1iaXQgdmFsdWVzIGFuZCBtYWNybworRUxTRQorCitQaHlzRGV2RXh0VHJhbXAgbWFjcm8gbnVtCitwdWJsaWMgX3ZrUGh5c0RldkV4dFRyYW1wJm51bSZANAorX3ZrUGh5c0RldkV4dFRyYW1wJm51bSZANDoKKyAgICBtb3YgICAgIGVheCwgZHdvcmQgcHRyIFtlc3AgKyA0XSAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9hZCB0aGUgd3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIGludG8gZWF4CisgICAgbW92ICAgICBlY3gsIFtlYXggKyBQSFlTX0RFVl9PRkZTRVRfUEhZU19ERVZfVFJBTVBdICAgICA7IExvYWQgdGhlIHVud3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIGludG8gZWN4CisgICAgbW92ICAgICBbZXNwICsgNF0sIGVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IE92ZXJ3cml0ZSB0aGUgd3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIHdpdGggdGhlIHVud3JhcHBlZCBvbmUgKG9uIHRoZSBzdGFjaykKKyAgICBtb3YgICAgIGVheCwgW2VheF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgRGVyZWZlcmVuY2UgdGhlIHdyYXBwZWQgVmtQaHlzaWNhbERldmljZSB0byBnZXQgdGhlIGRpc3BhdGNoIHRhYmxlIGluIGVheAorICAgIGptcCAgICAgZHdvcmQgcHRyIFtlYXggKyAoUEhZU19ERVZfT0ZGU0VUX0lOU1RfRElTUEFUQ0ggKyAoUFRSX1NJWkUgKiBudW0pKV0gOyBKdW1wIHRvIHRoZSBuZXh0IGZ1bmN0aW9uIGluIHRoZSBjaGFpbiwgcHJlc2VydmluZyB0aGUgYXJncyBvbiB0aGUgc3RhY2sKK2VuZG0KKworUGh5c0RldkV4dFRlcm1pbiBtYWNybyBudW0KK3B1YmxpYyBfdmtQaHlzRGV2RXh0VGVybWluJm51bSZANAorX3ZrUGh5c0RldkV4dFRlcm1pbiZudW0mQDQ6CisgICAgbW92ICAgICBlY3gsIGR3b3JkIHB0ciBbZXNwICsgNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTW92ZSB0aGUgd3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIGludG8gZWN4CisgICAgbW92ICAgICBlYXgsIGR3b3JkIHB0ciBbZWN4ICsgSUNEX1RFUk1fT0ZGU0VUX1BIWVNfREVWX1RFUk1dICAgICAgICAgICAgICAgIDsgU3RvcmUgdGhlIGxvYWRlcl9pY2RfdGVybSogaW4gZWF4CisgICAgY21wICAgICBkd29yZCBwdHIgW2VheCArIChESVNQQVRDSF9PRkZTRVRfSUNEX1RFUk0gKyAoUFRSX1NJWkUgKiBudW0pKV0sIDAgIDsgQ2hlY2sgaWYgdGhlIG5leHQgZnVuY3Rpb24gaW4gdGhlIGNoYWluIGlzIE5VTEwKKyAgICBqZSAgICAgIHRlcm1pbkVycm9yJm51bSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBHbyB0byB0aGUgZXJyb3Igc2VjdGlvbiBpZiBpdCBpcyBOVUxMCisgICAgbW92ICAgICBlY3gsIGR3b3JkIHB0ciBbZWN4ICsgUEhZU19ERVZfT0ZGU0VUX1BIWVNfREVWX1RFUk1dICAgICAgICAgICAgICAgIDsgVW53cmFwIHRoZSBWa1BoeXNpY2FsRGV2aWNlIGluIGVjeAorICAgIG1vdiAgICAgZHdvcmQgcHRyIFtlc3AgKyA0XSwgZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENvcHkgdGhlIHVud3JhcHBlZCBWa1BoeXNpY2FsRGV2aWNlIGludG8gdGhlIGZpcnN0IGFyZworICAgIGptcCAgICAgZHdvcmQgcHRyIFtlYXggKyAoRElTUEFUQ0hfT0ZGU0VUX0lDRF9URVJNICsgKFBUUl9TSVpFICogbnVtKSldICAgICA7IEp1bXAgdG8gdGhlIG5leHQgZnVuY3Rpb24gaW4gdGhlIGNoYWluCit0ZXJtaW5FcnJvciZudW0mOgorICAgIG1vdiAgICAgZWF4LCBkd29yZCBwdHIgW2VheCArIElOU1RBTkNFX09GRlNFVF9JQ0RfVEVSTV0gICAgICAgICAgICAgICAgICAgICA7IExvYWQgdGhlIGxvYWRlcl9pbnN0YW5jZSBpbnRvIGVheAorICAgIHB1c2ggICAgZHdvcmQgcHRyIFtlYXggKyAoSEFTSF9PRkZTRVRfSU5TVEFOQ0UgKyAoSEFTSF9TSVpFICogbnVtKSArIEZVTkNfTkFNRV9PRkZTRVRfSEFTSCldIDsgUHVzaCB0aGUgZnVuYyBuYW1lIChmaWZ0aCBhcmcpCisgICAgcHVzaCAgICBvZmZzZXQgdGVybWluX2Vycm9yX3N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUHVzaCB0aGUgZXJyb3Igc3RyaW5nIChmb3VydGggYXJnKQorICAgIHB1c2ggICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFB1c2ggemVybyAodGhpcmQgYXJnKQorICAgIHB1c2ggICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFB1c2ggdGhlIGVycm9yIGxvZ2dpbmcgYml0IChzZWNvbmQgYXJnKQorICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFB1c2ggdGhlIGxvYWRlcl9pbnN0YW5jZSAoZmlyc3QgYXJnKQorICAgIGNhbGwgICAgX2xvYWRlcl9sb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IExvZyB0aGUgZXJyb3IgbWVzc2FnZSBiZWZvcmUgd2UgY3Jhc2gKKyAgICBhZGQgICAgIGVzcCwgMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhbiB1cCB0aGUgYXJncworICAgIG1vdiAgICAgZWF4LCAwCisgICAgam1wICAgICBlYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ3Jhc2ggaW50ZW50aW9uYWxseSBieSBqdW1waW5nIHRvIGFkZHJlc3MgemVybworZW5kbQorCitEZXZFeHRUcmFtcCBtYWNybyBudW0KK3B1YmxpYyBfdmtkZXZfZXh0Jm51bSZANAorX3ZrZGV2X2V4dCZudW0mQDQ6CisgICAgbW92ICAgICBlYXgsIGR3b3JkIHB0ciBbZXNwICsgNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBEZXJlZmVyZW5jZSB0aGUgaGFuZGxlIHRvIGdldCB0aGUgZGlzcGF0Y2ggdGFibGUKKyAgICBqbXAgICAgIGR3b3JkIHB0ciBbZWF4ICsgKEVYVF9PRkZTRVRfREVWSUNFX0RJU1BBVENIICsgKFBUUl9TSVpFICogbnVtKSldICA7IEp1bXAgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGwgY2hhaW4KK2VuZG0KKworOyBUaGlzIGlzIGFsc28gbmVlZGVkIGZvciAzMi1iaXQgb25seQorLm1vZGVsIGZsYXQKKworRU5ESUYKKworLmNvbnN0CisgICAgdGVybWluX2Vycm9yX3N0cmluZyBkYiAnRXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgcGh5c2ljYWwgZGV2aWNlJywgMAorCisuY29kZQorCitJRkRFRiByYXgKK2V4dHJuIGxvYWRlcl9sb2c6bmVhcgorRUxTRQorZXh0cm4gX2xvYWRlcl9sb2c6bmVhcgorRU5ESUYKKworICAgIFBoeXNEZXZFeHRUcmFtcCAwCisgICAgUGh5c0RldkV4dFRyYW1wIDEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMgorICAgIFBoeXNEZXZFeHRUcmFtcCAzCisgICAgUGh5c0RldkV4dFRyYW1wIDQKKyAgICBQaHlzRGV2RXh0VHJhbXAgNQorICAgIFBoeXNEZXZFeHRUcmFtcCA2CisgICAgUGh5c0RldkV4dFRyYW1wIDcKKyAgICBQaHlzRGV2RXh0VHJhbXAgOAorICAgIFBoeXNEZXZFeHRUcmFtcCA5CisgICAgUGh5c0RldkV4dFRyYW1wIDEwCisgICAgUGh5c0RldkV4dFRyYW1wIDExCisgICAgUGh5c0RldkV4dFRyYW1wIDEyCisgICAgUGh5c0RldkV4dFRyYW1wIDEzCisgICAgUGh5c0RldkV4dFRyYW1wIDE0CisgICAgUGh5c0RldkV4dFRyYW1wIDE1CisgICAgUGh5c0RldkV4dFRyYW1wIDE2CisgICAgUGh5c0RldkV4dFRyYW1wIDE3CisgICAgUGh5c0RldkV4dFRyYW1wIDE4CisgICAgUGh5c0RldkV4dFRyYW1wIDE5CisgICAgUGh5c0RldkV4dFRyYW1wIDIwCisgICAgUGh5c0RldkV4dFRyYW1wIDIxCisgICAgUGh5c0RldkV4dFRyYW1wIDIyCisgICAgUGh5c0RldkV4dFRyYW1wIDIzCisgICAgUGh5c0RldkV4dFRyYW1wIDI0CisgICAgUGh5c0RldkV4dFRyYW1wIDI1CisgICAgUGh5c0RldkV4dFRyYW1wIDI2CisgICAgUGh5c0RldkV4dFRyYW1wIDI3CisgICAgUGh5c0RldkV4dFRyYW1wIDI4CisgICAgUGh5c0RldkV4dFRyYW1wIDI5CisgICAgUGh5c0RldkV4dFRyYW1wIDMwCisgICAgUGh5c0RldkV4dFRyYW1wIDMxCisgICAgUGh5c0RldkV4dFRyYW1wIDMyCisgICAgUGh5c0RldkV4dFRyYW1wIDMzCisgICAgUGh5c0RldkV4dFRyYW1wIDM0CisgICAgUGh5c0RldkV4dFRyYW1wIDM1CisgICAgUGh5c0RldkV4dFRyYW1wIDM2CisgICAgUGh5c0RldkV4dFRyYW1wIDM3CisgICAgUGh5c0RldkV4dFRyYW1wIDM4CisgICAgUGh5c0RldkV4dFRyYW1wIDM5CisgICAgUGh5c0RldkV4dFRyYW1wIDQwCisgICAgUGh5c0RldkV4dFRyYW1wIDQxCisgICAgUGh5c0RldkV4dFRyYW1wIDQyCisgICAgUGh5c0RldkV4dFRyYW1wIDQzCisgICAgUGh5c0RldkV4dFRyYW1wIDQ0CisgICAgUGh5c0RldkV4dFRyYW1wIDQ1CisgICAgUGh5c0RldkV4dFRyYW1wIDQ2CisgICAgUGh5c0RldkV4dFRyYW1wIDQ3CisgICAgUGh5c0RldkV4dFRyYW1wIDQ4CisgICAgUGh5c0RldkV4dFRyYW1wIDQ5CisgICAgUGh5c0RldkV4dFRyYW1wIDUwCisgICAgUGh5c0RldkV4dFRyYW1wIDUxCisgICAgUGh5c0RldkV4dFRyYW1wIDUyCisgICAgUGh5c0RldkV4dFRyYW1wIDUzCisgICAgUGh5c0RldkV4dFRyYW1wIDU0CisgICAgUGh5c0RldkV4dFRyYW1wIDU1CisgICAgUGh5c0RldkV4dFRyYW1wIDU2CisgICAgUGh5c0RldkV4dFRyYW1wIDU3CisgICAgUGh5c0RldkV4dFRyYW1wIDU4CisgICAgUGh5c0RldkV4dFRyYW1wIDU5CisgICAgUGh5c0RldkV4dFRyYW1wIDYwCisgICAgUGh5c0RldkV4dFRyYW1wIDYxCisgICAgUGh5c0RldkV4dFRyYW1wIDYyCisgICAgUGh5c0RldkV4dFRyYW1wIDYzCisgICAgUGh5c0RldkV4dFRyYW1wIDY0CisgICAgUGh5c0RldkV4dFRyYW1wIDY1CisgICAgUGh5c0RldkV4dFRyYW1wIDY2CisgICAgUGh5c0RldkV4dFRyYW1wIDY3CisgICAgUGh5c0RldkV4dFRyYW1wIDY4CisgICAgUGh5c0RldkV4dFRyYW1wIDY5CisgICAgUGh5c0RldkV4dFRyYW1wIDcwCisgICAgUGh5c0RldkV4dFRyYW1wIDcxCisgICAgUGh5c0RldkV4dFRyYW1wIDcyCisgICAgUGh5c0RldkV4dFRyYW1wIDczCisgICAgUGh5c0RldkV4dFRyYW1wIDc0CisgICAgUGh5c0RldkV4dFRyYW1wIDc1CisgICAgUGh5c0RldkV4dFRyYW1wIDc2CisgICAgUGh5c0RldkV4dFRyYW1wIDc3CisgICAgUGh5c0RldkV4dFRyYW1wIDc4CisgICAgUGh5c0RldkV4dFRyYW1wIDc5CisgICAgUGh5c0RldkV4dFRyYW1wIDgwCisgICAgUGh5c0RldkV4dFRyYW1wIDgxCisgICAgUGh5c0RldkV4dFRyYW1wIDgyCisgICAgUGh5c0RldkV4dFRyYW1wIDgzCisgICAgUGh5c0RldkV4dFRyYW1wIDg0CisgICAgUGh5c0RldkV4dFRyYW1wIDg1CisgICAgUGh5c0RldkV4dFRyYW1wIDg2CisgICAgUGh5c0RldkV4dFRyYW1wIDg3CisgICAgUGh5c0RldkV4dFRyYW1wIDg4CisgICAgUGh5c0RldkV4dFRyYW1wIDg5CisgICAgUGh5c0RldkV4dFRyYW1wIDkwCisgICAgUGh5c0RldkV4dFRyYW1wIDkxCisgICAgUGh5c0RldkV4dFRyYW1wIDkyCisgICAgUGh5c0RldkV4dFRyYW1wIDkzCisgICAgUGh5c0RldkV4dFRyYW1wIDk0CisgICAgUGh5c0RldkV4dFRyYW1wIDk1CisgICAgUGh5c0RldkV4dFRyYW1wIDk2CisgICAgUGh5c0RldkV4dFRyYW1wIDk3CisgICAgUGh5c0RldkV4dFRyYW1wIDk4CisgICAgUGh5c0RldkV4dFRyYW1wIDk5CisgICAgUGh5c0RldkV4dFRyYW1wIDEwMAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMDEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTAyCisgICAgUGh5c0RldkV4dFRyYW1wIDEwMworICAgIFBoeXNEZXZFeHRUcmFtcCAxMDQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTA1CisgICAgUGh5c0RldkV4dFRyYW1wIDEwNgorICAgIFBoeXNEZXZFeHRUcmFtcCAxMDcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTA4CisgICAgUGh5c0RldkV4dFRyYW1wIDEwOQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMTAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTExCisgICAgUGh5c0RldkV4dFRyYW1wIDExMgorICAgIFBoeXNEZXZFeHRUcmFtcCAxMTMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTE0CisgICAgUGh5c0RldkV4dFRyYW1wIDExNQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMTYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTE3CisgICAgUGh5c0RldkV4dFRyYW1wIDExOAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMTkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTIwCisgICAgUGh5c0RldkV4dFRyYW1wIDEyMQorICAgIFBoeXNEZXZFeHRUcmFtcCAxMjIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTIzCisgICAgUGh5c0RldkV4dFRyYW1wIDEyNAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMjUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTI2CisgICAgUGh5c0RldkV4dFRyYW1wIDEyNworICAgIFBoeXNEZXZFeHRUcmFtcCAxMjgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTI5CisgICAgUGh5c0RldkV4dFRyYW1wIDEzMAorICAgIFBoeXNEZXZFeHRUcmFtcCAxMzEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTMyCisgICAgUGh5c0RldkV4dFRyYW1wIDEzMworICAgIFBoeXNEZXZFeHRUcmFtcCAxMzQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTM1CisgICAgUGh5c0RldkV4dFRyYW1wIDEzNgorICAgIFBoeXNEZXZFeHRUcmFtcCAxMzcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTM4CisgICAgUGh5c0RldkV4dFRyYW1wIDEzOQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNDAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTQxCisgICAgUGh5c0RldkV4dFRyYW1wIDE0MgorICAgIFBoeXNEZXZFeHRUcmFtcCAxNDMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTQ0CisgICAgUGh5c0RldkV4dFRyYW1wIDE0NQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNDYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTQ3CisgICAgUGh5c0RldkV4dFRyYW1wIDE0OAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNDkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTUwCisgICAgUGh5c0RldkV4dFRyYW1wIDE1MQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNTIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTUzCisgICAgUGh5c0RldkV4dFRyYW1wIDE1NAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNTUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTU2CisgICAgUGh5c0RldkV4dFRyYW1wIDE1NworICAgIFBoeXNEZXZFeHRUcmFtcCAxNTgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTU5CisgICAgUGh5c0RldkV4dFRyYW1wIDE2MAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNjEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTYyCisgICAgUGh5c0RldkV4dFRyYW1wIDE2MworICAgIFBoeXNEZXZFeHRUcmFtcCAxNjQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTY1CisgICAgUGh5c0RldkV4dFRyYW1wIDE2NgorICAgIFBoeXNEZXZFeHRUcmFtcCAxNjcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTY4CisgICAgUGh5c0RldkV4dFRyYW1wIDE2OQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNzAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTcxCisgICAgUGh5c0RldkV4dFRyYW1wIDE3MgorICAgIFBoeXNEZXZFeHRUcmFtcCAxNzMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTc0CisgICAgUGh5c0RldkV4dFRyYW1wIDE3NQorICAgIFBoeXNEZXZFeHRUcmFtcCAxNzYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTc3CisgICAgUGh5c0RldkV4dFRyYW1wIDE3OAorICAgIFBoeXNEZXZFeHRUcmFtcCAxNzkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTgwCisgICAgUGh5c0RldkV4dFRyYW1wIDE4MQorICAgIFBoeXNEZXZFeHRUcmFtcCAxODIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTgzCisgICAgUGh5c0RldkV4dFRyYW1wIDE4NAorICAgIFBoeXNEZXZFeHRUcmFtcCAxODUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTg2CisgICAgUGh5c0RldkV4dFRyYW1wIDE4NworICAgIFBoeXNEZXZFeHRUcmFtcCAxODgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTg5CisgICAgUGh5c0RldkV4dFRyYW1wIDE5MAorICAgIFBoeXNEZXZFeHRUcmFtcCAxOTEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTkyCisgICAgUGh5c0RldkV4dFRyYW1wIDE5MworICAgIFBoeXNEZXZFeHRUcmFtcCAxOTQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTk1CisgICAgUGh5c0RldkV4dFRyYW1wIDE5NgorICAgIFBoeXNEZXZFeHRUcmFtcCAxOTcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMTk4CisgICAgUGh5c0RldkV4dFRyYW1wIDE5OQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMDAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjAxCisgICAgUGh5c0RldkV4dFRyYW1wIDIwMgorICAgIFBoeXNEZXZFeHRUcmFtcCAyMDMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjA0CisgICAgUGh5c0RldkV4dFRyYW1wIDIwNQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMDYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjA3CisgICAgUGh5c0RldkV4dFRyYW1wIDIwOAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMDkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjEwCisgICAgUGh5c0RldkV4dFRyYW1wIDIxMQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMTIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjEzCisgICAgUGh5c0RldkV4dFRyYW1wIDIxNAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMTUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjE2CisgICAgUGh5c0RldkV4dFRyYW1wIDIxNworICAgIFBoeXNEZXZFeHRUcmFtcCAyMTgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjE5CisgICAgUGh5c0RldkV4dFRyYW1wIDIyMAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMjEKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjIyCisgICAgUGh5c0RldkV4dFRyYW1wIDIyMworICAgIFBoeXNEZXZFeHRUcmFtcCAyMjQKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjI1CisgICAgUGh5c0RldkV4dFRyYW1wIDIyNgorICAgIFBoeXNEZXZFeHRUcmFtcCAyMjcKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjI4CisgICAgUGh5c0RldkV4dFRyYW1wIDIyOQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMzAKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjMxCisgICAgUGh5c0RldkV4dFRyYW1wIDIzMgorICAgIFBoeXNEZXZFeHRUcmFtcCAyMzMKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjM0CisgICAgUGh5c0RldkV4dFRyYW1wIDIzNQorICAgIFBoeXNEZXZFeHRUcmFtcCAyMzYKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjM3CisgICAgUGh5c0RldkV4dFRyYW1wIDIzOAorICAgIFBoeXNEZXZFeHRUcmFtcCAyMzkKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjQwCisgICAgUGh5c0RldkV4dFRyYW1wIDI0MQorICAgIFBoeXNEZXZFeHRUcmFtcCAyNDIKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjQzCisgICAgUGh5c0RldkV4dFRyYW1wIDI0NAorICAgIFBoeXNEZXZFeHRUcmFtcCAyNDUKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjQ2CisgICAgUGh5c0RldkV4dFRyYW1wIDI0NworICAgIFBoeXNEZXZFeHRUcmFtcCAyNDgKKyAgICBQaHlzRGV2RXh0VHJhbXAgMjQ5CisKKyAgICBQaHlzRGV2RXh0VGVybWluIDAKKyAgICBQaHlzRGV2RXh0VGVybWluIDEKKyAgICBQaHlzRGV2RXh0VGVybWluIDIKKyAgICBQaHlzRGV2RXh0VGVybWluIDMKKyAgICBQaHlzRGV2RXh0VGVybWluIDQKKyAgICBQaHlzRGV2RXh0VGVybWluIDUKKyAgICBQaHlzRGV2RXh0VGVybWluIDYKKyAgICBQaHlzRGV2RXh0VGVybWluIDcKKyAgICBQaHlzRGV2RXh0VGVybWluIDgKKyAgICBQaHlzRGV2RXh0VGVybWluIDkKKyAgICBQaHlzRGV2RXh0VGVybWluIDEwCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTIKKyAgICBQaHlzRGV2RXh0VGVybWluIDEzCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTUKKyAgICBQaHlzRGV2RXh0VGVybWluIDE2CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTgKKyAgICBQaHlzRGV2RXh0VGVybWluIDE5CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjEKKyAgICBQaHlzRGV2RXh0VGVybWluIDIyCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMworICAgIFBoeXNEZXZFeHRUZXJtaW4gMjQKKyAgICBQaHlzRGV2RXh0VGVybWluIDI1CisgICAgUGh5c0RldkV4dFRlcm1pbiAyNgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjcKKyAgICBQaHlzRGV2RXh0VGVybWluIDI4CisgICAgUGh5c0RldkV4dFRlcm1pbiAyOQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMzAKKyAgICBQaHlzRGV2RXh0VGVybWluIDMxCisgICAgUGh5c0RldkV4dFRlcm1pbiAzMgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMzMKKyAgICBQaHlzRGV2RXh0VGVybWluIDM0CisgICAgUGh5c0RldkV4dFRlcm1pbiAzNQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMzYKKyAgICBQaHlzRGV2RXh0VGVybWluIDM3CisgICAgUGh5c0RldkV4dFRlcm1pbiAzOAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMzkKKyAgICBQaHlzRGV2RXh0VGVybWluIDQwCisgICAgUGh5c0RldkV4dFRlcm1pbiA0MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gNDIKKyAgICBQaHlzRGV2RXh0VGVybWluIDQzCisgICAgUGh5c0RldkV4dFRlcm1pbiA0NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gNDUKKyAgICBQaHlzRGV2RXh0VGVybWluIDQ2CisgICAgUGh5c0RldkV4dFRlcm1pbiA0NworICAgIFBoeXNEZXZFeHRUZXJtaW4gNDgKKyAgICBQaHlzRGV2RXh0VGVybWluIDQ5CisgICAgUGh5c0RldkV4dFRlcm1pbiA1MAorICAgIFBoeXNEZXZFeHRUZXJtaW4gNTEKKyAgICBQaHlzRGV2RXh0VGVybWluIDUyCisgICAgUGh5c0RldkV4dFRlcm1pbiA1MworICAgIFBoeXNEZXZFeHRUZXJtaW4gNTQKKyAgICBQaHlzRGV2RXh0VGVybWluIDU1CisgICAgUGh5c0RldkV4dFRlcm1pbiA1NgorICAgIFBoeXNEZXZFeHRUZXJtaW4gNTcKKyAgICBQaHlzRGV2RXh0VGVybWluIDU4CisgICAgUGh5c0RldkV4dFRlcm1pbiA1OQorICAgIFBoeXNEZXZFeHRUZXJtaW4gNjAKKyAgICBQaHlzRGV2RXh0VGVybWluIDYxCisgICAgUGh5c0RldkV4dFRlcm1pbiA2MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gNjMKKyAgICBQaHlzRGV2RXh0VGVybWluIDY0CisgICAgUGh5c0RldkV4dFRlcm1pbiA2NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gNjYKKyAgICBQaHlzRGV2RXh0VGVybWluIDY3CisgICAgUGh5c0RldkV4dFRlcm1pbiA2OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gNjkKKyAgICBQaHlzRGV2RXh0VGVybWluIDcwCisgICAgUGh5c0RldkV4dFRlcm1pbiA3MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gNzIKKyAgICBQaHlzRGV2RXh0VGVybWluIDczCisgICAgUGh5c0RldkV4dFRlcm1pbiA3NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gNzUKKyAgICBQaHlzRGV2RXh0VGVybWluIDc2CisgICAgUGh5c0RldkV4dFRlcm1pbiA3NworICAgIFBoeXNEZXZFeHRUZXJtaW4gNzgKKyAgICBQaHlzRGV2RXh0VGVybWluIDc5CisgICAgUGh5c0RldkV4dFRlcm1pbiA4MAorICAgIFBoeXNEZXZFeHRUZXJtaW4gODEKKyAgICBQaHlzRGV2RXh0VGVybWluIDgyCisgICAgUGh5c0RldkV4dFRlcm1pbiA4MworICAgIFBoeXNEZXZFeHRUZXJtaW4gODQKKyAgICBQaHlzRGV2RXh0VGVybWluIDg1CisgICAgUGh5c0RldkV4dFRlcm1pbiA4NgorICAgIFBoeXNEZXZFeHRUZXJtaW4gODcKKyAgICBQaHlzRGV2RXh0VGVybWluIDg4CisgICAgUGh5c0RldkV4dFRlcm1pbiA4OQorICAgIFBoeXNEZXZFeHRUZXJtaW4gOTAKKyAgICBQaHlzRGV2RXh0VGVybWluIDkxCisgICAgUGh5c0RldkV4dFRlcm1pbiA5MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gOTMKKyAgICBQaHlzRGV2RXh0VGVybWluIDk0CisgICAgUGh5c0RldkV4dFRlcm1pbiA5NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gOTYKKyAgICBQaHlzRGV2RXh0VGVybWluIDk3CisgICAgUGh5c0RldkV4dFRlcm1pbiA5OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gOTkKKyAgICBQaHlzRGV2RXh0VGVybWluIDEwMAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTAxCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMDIKKyAgICBQaHlzRGV2RXh0VGVybWluIDEwMworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTA0CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMDUKKyAgICBQaHlzRGV2RXh0VGVybWluIDEwNgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTA3CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMDgKKyAgICBQaHlzRGV2RXh0VGVybWluIDEwOQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTEwCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMTEKKyAgICBQaHlzRGV2RXh0VGVybWluIDExMgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTEzCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMTQKKyAgICBQaHlzRGV2RXh0VGVybWluIDExNQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTE2CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMTcKKyAgICBQaHlzRGV2RXh0VGVybWluIDExOAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTE5CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMjAKKyAgICBQaHlzRGV2RXh0VGVybWluIDEyMQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTIyCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMjMKKyAgICBQaHlzRGV2RXh0VGVybWluIDEyNAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTI1CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMjYKKyAgICBQaHlzRGV2RXh0VGVybWluIDEyNworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTI4CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMjkKKyAgICBQaHlzRGV2RXh0VGVybWluIDEzMAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTMxCisgICAgUGh5c0RldkV4dFRlcm1pbiAxMzIKKyAgICBQaHlzRGV2RXh0VGVybWluIDEzMworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTM0CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMzUKKyAgICBQaHlzRGV2RXh0VGVybWluIDEzNgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTM3CisgICAgUGh5c0RldkV4dFRlcm1pbiAxMzgKKyAgICBQaHlzRGV2RXh0VGVybWluIDEzOQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTQwCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNDEKKyAgICBQaHlzRGV2RXh0VGVybWluIDE0MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTQzCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNDQKKyAgICBQaHlzRGV2RXh0VGVybWluIDE0NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTQ2CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNDcKKyAgICBQaHlzRGV2RXh0VGVybWluIDE0OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTQ5CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNTAKKyAgICBQaHlzRGV2RXh0VGVybWluIDE1MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTUyCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNTMKKyAgICBQaHlzRGV2RXh0VGVybWluIDE1NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTU1CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNTYKKyAgICBQaHlzRGV2RXh0VGVybWluIDE1NworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTU4CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNTkKKyAgICBQaHlzRGV2RXh0VGVybWluIDE2MAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTYxCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNjIKKyAgICBQaHlzRGV2RXh0VGVybWluIDE2MworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTY0CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNjUKKyAgICBQaHlzRGV2RXh0VGVybWluIDE2NgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTY3CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNjgKKyAgICBQaHlzRGV2RXh0VGVybWluIDE2OQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTcwCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNzEKKyAgICBQaHlzRGV2RXh0VGVybWluIDE3MgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTczCisgICAgUGh5c0RldkV4dFRlcm1pbiAxNzQKKyAgICBQaHlzRGV2RXh0VGVybWluIDE3NQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTc2CisgICAgUGh5c0RldkV4dFRlcm1pbiAxNzcKKyAgICBQaHlzRGV2RXh0VGVybWluIDE3OAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTc5CisgICAgUGh5c0RldkV4dFRlcm1pbiAxODAKKyAgICBQaHlzRGV2RXh0VGVybWluIDE4MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTgyCisgICAgUGh5c0RldkV4dFRlcm1pbiAxODMKKyAgICBQaHlzRGV2RXh0VGVybWluIDE4NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTg1CisgICAgUGh5c0RldkV4dFRlcm1pbiAxODYKKyAgICBQaHlzRGV2RXh0VGVybWluIDE4NworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTg4CisgICAgUGh5c0RldkV4dFRlcm1pbiAxODkKKyAgICBQaHlzRGV2RXh0VGVybWluIDE5MAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTkxCisgICAgUGh5c0RldkV4dFRlcm1pbiAxOTIKKyAgICBQaHlzRGV2RXh0VGVybWluIDE5MworICAgIFBoeXNEZXZFeHRUZXJtaW4gMTk0CisgICAgUGh5c0RldkV4dFRlcm1pbiAxOTUKKyAgICBQaHlzRGV2RXh0VGVybWluIDE5NgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMTk3CisgICAgUGh5c0RldkV4dFRlcm1pbiAxOTgKKyAgICBQaHlzRGV2RXh0VGVybWluIDE5OQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjAwCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMDEKKyAgICBQaHlzRGV2RXh0VGVybWluIDIwMgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjAzCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMDQKKyAgICBQaHlzRGV2RXh0VGVybWluIDIwNQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjA2CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMDcKKyAgICBQaHlzRGV2RXh0VGVybWluIDIwOAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjA5CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMTAKKyAgICBQaHlzRGV2RXh0VGVybWluIDIxMQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjEyCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMTMKKyAgICBQaHlzRGV2RXh0VGVybWluIDIxNAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjE1CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMTYKKyAgICBQaHlzRGV2RXh0VGVybWluIDIxNworICAgIFBoeXNEZXZFeHRUZXJtaW4gMjE4CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMTkKKyAgICBQaHlzRGV2RXh0VGVybWluIDIyMAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjIxCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMjIKKyAgICBQaHlzRGV2RXh0VGVybWluIDIyMworICAgIFBoeXNEZXZFeHRUZXJtaW4gMjI0CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMjUKKyAgICBQaHlzRGV2RXh0VGVybWluIDIyNgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjI3CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMjgKKyAgICBQaHlzRGV2RXh0VGVybWluIDIyOQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjMwCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMzEKKyAgICBQaHlzRGV2RXh0VGVybWluIDIzMgorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjMzCisgICAgUGh5c0RldkV4dFRlcm1pbiAyMzQKKyAgICBQaHlzRGV2RXh0VGVybWluIDIzNQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjM2CisgICAgUGh5c0RldkV4dFRlcm1pbiAyMzcKKyAgICBQaHlzRGV2RXh0VGVybWluIDIzOAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjM5CisgICAgUGh5c0RldkV4dFRlcm1pbiAyNDAKKyAgICBQaHlzRGV2RXh0VGVybWluIDI0MQorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjQyCisgICAgUGh5c0RldkV4dFRlcm1pbiAyNDMKKyAgICBQaHlzRGV2RXh0VGVybWluIDI0NAorICAgIFBoeXNEZXZFeHRUZXJtaW4gMjQ1CisgICAgUGh5c0RldkV4dFRlcm1pbiAyNDYKKyAgICBQaHlzRGV2RXh0VGVybWluIDI0NworICAgIFBoeXNEZXZFeHRUZXJtaW4gMjQ4CisgICAgUGh5c0RldkV4dFRlcm1pbiAyNDkKKworICAgIERldkV4dFRyYW1wIDAKKyAgICBEZXZFeHRUcmFtcCAxCisgICAgRGV2RXh0VHJhbXAgMgorICAgIERldkV4dFRyYW1wIDMKKyAgICBEZXZFeHRUcmFtcCA0CisgICAgRGV2RXh0VHJhbXAgNQorICAgIERldkV4dFRyYW1wIDYKKyAgICBEZXZFeHRUcmFtcCA3CisgICAgRGV2RXh0VHJhbXAgOAorICAgIERldkV4dFRyYW1wIDkKKyAgICBEZXZFeHRUcmFtcCAxMAorICAgIERldkV4dFRyYW1wIDExCisgICAgRGV2RXh0VHJhbXAgMTIKKyAgICBEZXZFeHRUcmFtcCAxMworICAgIERldkV4dFRyYW1wIDE0CisgICAgRGV2RXh0VHJhbXAgMTUKKyAgICBEZXZFeHRUcmFtcCAxNgorICAgIERldkV4dFRyYW1wIDE3CisgICAgRGV2RXh0VHJhbXAgMTgKKyAgICBEZXZFeHRUcmFtcCAxOQorICAgIERldkV4dFRyYW1wIDIwCisgICAgRGV2RXh0VHJhbXAgMjEKKyAgICBEZXZFeHRUcmFtcCAyMgorICAgIERldkV4dFRyYW1wIDIzCisgICAgRGV2RXh0VHJhbXAgMjQKKyAgICBEZXZFeHRUcmFtcCAyNQorICAgIERldkV4dFRyYW1wIDI2CisgICAgRGV2RXh0VHJhbXAgMjcKKyAgICBEZXZFeHRUcmFtcCAyOAorICAgIERldkV4dFRyYW1wIDI5CisgICAgRGV2RXh0VHJhbXAgMzAKKyAgICBEZXZFeHRUcmFtcCAzMQorICAgIERldkV4dFRyYW1wIDMyCisgICAgRGV2RXh0VHJhbXAgMzMKKyAgICBEZXZFeHRUcmFtcCAzNAorICAgIERldkV4dFRyYW1wIDM1CisgICAgRGV2RXh0VHJhbXAgMzYKKyAgICBEZXZFeHRUcmFtcCAzNworICAgIERldkV4dFRyYW1wIDM4CisgICAgRGV2RXh0VHJhbXAgMzkKKyAgICBEZXZFeHRUcmFtcCA0MAorICAgIERldkV4dFRyYW1wIDQxCisgICAgRGV2RXh0VHJhbXAgNDIKKyAgICBEZXZFeHRUcmFtcCA0MworICAgIERldkV4dFRyYW1wIDQ0CisgICAgRGV2RXh0VHJhbXAgNDUKKyAgICBEZXZFeHRUcmFtcCA0NgorICAgIERldkV4dFRyYW1wIDQ3CisgICAgRGV2RXh0VHJhbXAgNDgKKyAgICBEZXZFeHRUcmFtcCA0OQorICAgIERldkV4dFRyYW1wIDUwCisgICAgRGV2RXh0VHJhbXAgNTEKKyAgICBEZXZFeHRUcmFtcCA1MgorICAgIERldkV4dFRyYW1wIDUzCisgICAgRGV2RXh0VHJhbXAgNTQKKyAgICBEZXZFeHRUcmFtcCA1NQorICAgIERldkV4dFRyYW1wIDU2CisgICAgRGV2RXh0VHJhbXAgNTcKKyAgICBEZXZFeHRUcmFtcCA1OAorICAgIERldkV4dFRyYW1wIDU5CisgICAgRGV2RXh0VHJhbXAgNjAKKyAgICBEZXZFeHRUcmFtcCA2MQorICAgIERldkV4dFRyYW1wIDYyCisgICAgRGV2RXh0VHJhbXAgNjMKKyAgICBEZXZFeHRUcmFtcCA2NAorICAgIERldkV4dFRyYW1wIDY1CisgICAgRGV2RXh0VHJhbXAgNjYKKyAgICBEZXZFeHRUcmFtcCA2NworICAgIERldkV4dFRyYW1wIDY4CisgICAgRGV2RXh0VHJhbXAgNjkKKyAgICBEZXZFeHRUcmFtcCA3MAorICAgIERldkV4dFRyYW1wIDcxCisgICAgRGV2RXh0VHJhbXAgNzIKKyAgICBEZXZFeHRUcmFtcCA3MworICAgIERldkV4dFRyYW1wIDc0CisgICAgRGV2RXh0VHJhbXAgNzUKKyAgICBEZXZFeHRUcmFtcCA3NgorICAgIERldkV4dFRyYW1wIDc3CisgICAgRGV2RXh0VHJhbXAgNzgKKyAgICBEZXZFeHRUcmFtcCA3OQorICAgIERldkV4dFRyYW1wIDgwCisgICAgRGV2RXh0VHJhbXAgODEKKyAgICBEZXZFeHRUcmFtcCA4MgorICAgIERldkV4dFRyYW1wIDgzCisgICAgRGV2RXh0VHJhbXAgODQKKyAgICBEZXZFeHRUcmFtcCA4NQorICAgIERldkV4dFRyYW1wIDg2CisgICAgRGV2RXh0VHJhbXAgODcKKyAgICBEZXZFeHRUcmFtcCA4OAorICAgIERldkV4dFRyYW1wIDg5CisgICAgRGV2RXh0VHJhbXAgOTAKKyAgICBEZXZFeHRUcmFtcCA5MQorICAgIERldkV4dFRyYW1wIDkyCisgICAgRGV2RXh0VHJhbXAgOTMKKyAgICBEZXZFeHRUcmFtcCA5NAorICAgIERldkV4dFRyYW1wIDk1CisgICAgRGV2RXh0VHJhbXAgOTYKKyAgICBEZXZFeHRUcmFtcCA5NworICAgIERldkV4dFRyYW1wIDk4CisgICAgRGV2RXh0VHJhbXAgOTkKKyAgICBEZXZFeHRUcmFtcCAxMDAKKyAgICBEZXZFeHRUcmFtcCAxMDEKKyAgICBEZXZFeHRUcmFtcCAxMDIKKyAgICBEZXZFeHRUcmFtcCAxMDMKKyAgICBEZXZFeHRUcmFtcCAxMDQKKyAgICBEZXZFeHRUcmFtcCAxMDUKKyAgICBEZXZFeHRUcmFtcCAxMDYKKyAgICBEZXZFeHRUcmFtcCAxMDcKKyAgICBEZXZFeHRUcmFtcCAxMDgKKyAgICBEZXZFeHRUcmFtcCAxMDkKKyAgICBEZXZFeHRUcmFtcCAxMTAKKyAgICBEZXZFeHRUcmFtcCAxMTEKKyAgICBEZXZFeHRUcmFtcCAxMTIKKyAgICBEZXZFeHRUcmFtcCAxMTMKKyAgICBEZXZFeHRUcmFtcCAxMTQKKyAgICBEZXZFeHRUcmFtcCAxMTUKKyAgICBEZXZFeHRUcmFtcCAxMTYKKyAgICBEZXZFeHRUcmFtcCAxMTcKKyAgICBEZXZFeHRUcmFtcCAxMTgKKyAgICBEZXZFeHRUcmFtcCAxMTkKKyAgICBEZXZFeHRUcmFtcCAxMjAKKyAgICBEZXZFeHRUcmFtcCAxMjEKKyAgICBEZXZFeHRUcmFtcCAxMjIKKyAgICBEZXZFeHRUcmFtcCAxMjMKKyAgICBEZXZFeHRUcmFtcCAxMjQKKyAgICBEZXZFeHRUcmFtcCAxMjUKKyAgICBEZXZFeHRUcmFtcCAxMjYKKyAgICBEZXZFeHRUcmFtcCAxMjcKKyAgICBEZXZFeHRUcmFtcCAxMjgKKyAgICBEZXZFeHRUcmFtcCAxMjkKKyAgICBEZXZFeHRUcmFtcCAxMzAKKyAgICBEZXZFeHRUcmFtcCAxMzEKKyAgICBEZXZFeHRUcmFtcCAxMzIKKyAgICBEZXZFeHRUcmFtcCAxMzMKKyAgICBEZXZFeHRUcmFtcCAxMzQKKyAgICBEZXZFeHRUcmFtcCAxMzUKKyAgICBEZXZFeHRUcmFtcCAxMzYKKyAgICBEZXZFeHRUcmFtcCAxMzcKKyAgICBEZXZFeHRUcmFtcCAxMzgKKyAgICBEZXZFeHRUcmFtcCAxMzkKKyAgICBEZXZFeHRUcmFtcCAxNDAKKyAgICBEZXZFeHRUcmFtcCAxNDEKKyAgICBEZXZFeHRUcmFtcCAxNDIKKyAgICBEZXZFeHRUcmFtcCAxNDMKKyAgICBEZXZFeHRUcmFtcCAxNDQKKyAgICBEZXZFeHRUcmFtcCAxNDUKKyAgICBEZXZFeHRUcmFtcCAxNDYKKyAgICBEZXZFeHRUcmFtcCAxNDcKKyAgICBEZXZFeHRUcmFtcCAxNDgKKyAgICBEZXZFeHRUcmFtcCAxNDkKKyAgICBEZXZFeHRUcmFtcCAxNTAKKyAgICBEZXZFeHRUcmFtcCAxNTEKKyAgICBEZXZFeHRUcmFtcCAxNTIKKyAgICBEZXZFeHRUcmFtcCAxNTMKKyAgICBEZXZFeHRUcmFtcCAxNTQKKyAgICBEZXZFeHRUcmFtcCAxNTUKKyAgICBEZXZFeHRUcmFtcCAxNTYKKyAgICBEZXZFeHRUcmFtcCAxNTcKKyAgICBEZXZFeHRUcmFtcCAxNTgKKyAgICBEZXZFeHRUcmFtcCAxNTkKKyAgICBEZXZFeHRUcmFtcCAxNjAKKyAgICBEZXZFeHRUcmFtcCAxNjEKKyAgICBEZXZFeHRUcmFtcCAxNjIKKyAgICBEZXZFeHRUcmFtcCAxNjMKKyAgICBEZXZFeHRUcmFtcCAxNjQKKyAgICBEZXZFeHRUcmFtcCAxNjUKKyAgICBEZXZFeHRUcmFtcCAxNjYKKyAgICBEZXZFeHRUcmFtcCAxNjcKKyAgICBEZXZFeHRUcmFtcCAxNjgKKyAgICBEZXZFeHRUcmFtcCAxNjkKKyAgICBEZXZFeHRUcmFtcCAxNzAKKyAgICBEZXZFeHRUcmFtcCAxNzEKKyAgICBEZXZFeHRUcmFtcCAxNzIKKyAgICBEZXZFeHRUcmFtcCAxNzMKKyAgICBEZXZFeHRUcmFtcCAxNzQKKyAgICBEZXZFeHRUcmFtcCAxNzUKKyAgICBEZXZFeHRUcmFtcCAxNzYKKyAgICBEZXZFeHRUcmFtcCAxNzcKKyAgICBEZXZFeHRUcmFtcCAxNzgKKyAgICBEZXZFeHRUcmFtcCAxNzkKKyAgICBEZXZFeHRUcmFtcCAxODAKKyAgICBEZXZFeHRUcmFtcCAxODEKKyAgICBEZXZFeHRUcmFtcCAxODIKKyAgICBEZXZFeHRUcmFtcCAxODMKKyAgICBEZXZFeHRUcmFtcCAxODQKKyAgICBEZXZFeHRUcmFtcCAxODUKKyAgICBEZXZFeHRUcmFtcCAxODYKKyAgICBEZXZFeHRUcmFtcCAxODcKKyAgICBEZXZFeHRUcmFtcCAxODgKKyAgICBEZXZFeHRUcmFtcCAxODkKKyAgICBEZXZFeHRUcmFtcCAxOTAKKyAgICBEZXZFeHRUcmFtcCAxOTEKKyAgICBEZXZFeHRUcmFtcCAxOTIKKyAgICBEZXZFeHRUcmFtcCAxOTMKKyAgICBEZXZFeHRUcmFtcCAxOTQKKyAgICBEZXZFeHRUcmFtcCAxOTUKKyAgICBEZXZFeHRUcmFtcCAxOTYKKyAgICBEZXZFeHRUcmFtcCAxOTcKKyAgICBEZXZFeHRUcmFtcCAxOTgKKyAgICBEZXZFeHRUcmFtcCAxOTkKKyAgICBEZXZFeHRUcmFtcCAyMDAKKyAgICBEZXZFeHRUcmFtcCAyMDEKKyAgICBEZXZFeHRUcmFtcCAyMDIKKyAgICBEZXZFeHRUcmFtcCAyMDMKKyAgICBEZXZFeHRUcmFtcCAyMDQKKyAgICBEZXZFeHRUcmFtcCAyMDUKKyAgICBEZXZFeHRUcmFtcCAyMDYKKyAgICBEZXZFeHRUcmFtcCAyMDcKKyAgICBEZXZFeHRUcmFtcCAyMDgKKyAgICBEZXZFeHRUcmFtcCAyMDkKKyAgICBEZXZFeHRUcmFtcCAyMTAKKyAgICBEZXZFeHRUcmFtcCAyMTEKKyAgICBEZXZFeHRUcmFtcCAyMTIKKyAgICBEZXZFeHRUcmFtcCAyMTMKKyAgICBEZXZFeHRUcmFtcCAyMTQKKyAgICBEZXZFeHRUcmFtcCAyMTUKKyAgICBEZXZFeHRUcmFtcCAyMTYKKyAgICBEZXZFeHRUcmFtcCAyMTcKKyAgICBEZXZFeHRUcmFtcCAyMTgKKyAgICBEZXZFeHRUcmFtcCAyMTkKKyAgICBEZXZFeHRUcmFtcCAyMjAKKyAgICBEZXZFeHRUcmFtcCAyMjEKKyAgICBEZXZFeHRUcmFtcCAyMjIKKyAgICBEZXZFeHRUcmFtcCAyMjMKKyAgICBEZXZFeHRUcmFtcCAyMjQKKyAgICBEZXZFeHRUcmFtcCAyMjUKKyAgICBEZXZFeHRUcmFtcCAyMjYKKyAgICBEZXZFeHRUcmFtcCAyMjcKKyAgICBEZXZFeHRUcmFtcCAyMjgKKyAgICBEZXZFeHRUcmFtcCAyMjkKKyAgICBEZXZFeHRUcmFtcCAyMzAKKyAgICBEZXZFeHRUcmFtcCAyMzEKKyAgICBEZXZFeHRUcmFtcCAyMzIKKyAgICBEZXZFeHRUcmFtcCAyMzMKKyAgICBEZXZFeHRUcmFtcCAyMzQKKyAgICBEZXZFeHRUcmFtcCAyMzUKKyAgICBEZXZFeHRUcmFtcCAyMzYKKyAgICBEZXZFeHRUcmFtcCAyMzcKKyAgICBEZXZFeHRUcmFtcCAyMzgKKyAgICBEZXZFeHRUcmFtcCAyMzkKKyAgICBEZXZFeHRUcmFtcCAyNDAKKyAgICBEZXZFeHRUcmFtcCAyNDEKKyAgICBEZXZFeHRUcmFtcCAyNDIKKyAgICBEZXZFeHRUcmFtcCAyNDMKKyAgICBEZXZFeHRUcmFtcCAyNDQKKyAgICBEZXZFeHRUcmFtcCAyNDUKKyAgICBEZXZFeHRUcmFtcCAyNDYKKyAgICBEZXZFeHRUcmFtcCAyNDcKKyAgICBEZXZFeHRUcmFtcCAyNDgKKyAgICBEZXZFeHRUcmFtcCAyNDkKKworZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3ZrX2xvYWRlcl9sYXllci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci92a19sb2FkZXJfbGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmNmNWIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci92a19sb2FkZXJfbGF5ZXIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKiBDb3B5cmlnaHQgKGMpIDIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyogQ29weXJpZ2h0IChjKSAyMDE2IEx1bmFyRywgSW5jLgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyoKKyovCisjcHJhZ21hIG9uY2UKKworLy8gTGlua2VkIGxpc3Qgbm9kZSBmb3IgdHJlZSBvZiBkZWJ1ZyBjYWxsYmFja3MKK3R5cGVkZWYgc3RydWN0IFZrRGVidWdSZXBvcnRDb250ZW50IHsKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgbXNnQ2FsbGJhY2s7CisgICAgUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBwZm5Nc2dDYWxsYmFjazsKKyAgICBWa0ZsYWdzIG1zZ0ZsYWdzOworfSBWa0RlYnVnUmVwb3J0Q29udGVudDsKKwordHlwZWRlZiBzdHJ1Y3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ29udGVudCB7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlcjsKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCBtZXNzYWdlU2V2ZXJpdHk7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlVHlwZTsKKyAgICBQRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFQgcGZuVXNlckNhbGxiYWNrOworfSBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDb250ZW50OworCit0eXBlZGVmIHN0cnVjdCBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlXyB7CisgICAgYm9vbCBpc19tZXNzZW5nZXI7CisgICAgdW5pb24geworICAgICAgICBWa0RlYnVnUmVwb3J0Q29udGVudCByZXBvcnQ7CisgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckNvbnRlbnQgbWVzc2VuZ2VyOworICAgIH07CisgICAgdm9pZCAqcFVzZXJEYXRhOworICAgIHN0cnVjdCBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlXyAqcE5leHQ7Cit9IFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGU7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3ZrX2xvYWRlcl9wbGF0Zm9ybS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci92a19sb2FkZXJfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmZkYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci92a19sb2FkZXJfcGxhdGZvcm0uaApAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBJYW4gRWxsaW90IDxpYW5AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBMZW5ueSBLb21vdyA8bGVubnlAbHVuYXJnLmNvbT4KKyAqCisgKi8KKyNwcmFnbWEgb25jZQorCisjaWYgZGVmaW5lZChfV0lOMzIpCisvLyBXaW5Tb2NrMi5oIG11c3QgYmUgaW5jbHVkZWQgKkJFRk9SRSogd2luZG93cy5oCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbmRpZiAgLy8gX1dJTjMyCisKKyNpbmNsdWRlICJ2dWxrYW4vdmtfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfc2RrX3BsYXRmb3JtLmgiCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisvKiBMaW51eC1zcGVjaWZpYyBjb21tb24gY29kZTogKi8KKworLy8gSGVhZGVyczoKKy8vI2lmbmRlZiBfR05VX1NPVVJDRQorLy8jZGVmaW5lIF9HTlVfU09VUkNFIDEKKy8vI2VuZGlmCisvLyBUQkQ6IEFyZSB0aGUgY29udGVudHMgb2YgdGhlIGZvbGxvd2luZyBmaWxlIHVzZWQ/CisjaW5jbHVkZSA8dW5pc3RkLmg+CisvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGZpbGUgaXMgZm9yIGR5bmFtaWMgbG9hZGluZzoKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisKKy8vIFZLIExpYnJhcnkgRmlsZW5hbWVzLCBQYXRocywgZXRjLjoKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCisjZGVmaW5lIERJUkVDVE9SWV9TWU1CT0wgJy8nCisKKyNkZWZpbmUgVlVMS0FOX0RJUiAidnVsa2FuLyIKKyNkZWZpbmUgVlVMS0FOX0lDRENPTkZfRElSICJpY2QuZCIKKyNkZWZpbmUgVlVMS0FOX0lDRF9ESVIgImljZCIKKyNkZWZpbmUgVlVMS0FOX1NFVFRJTkdTQ09ORl9ESVIgInNldHRpbmdzLmQiCisjZGVmaW5lIFZVTEtBTl9FTEFZRVJDT05GX0RJUiAiZXhwbGljaXRfbGF5ZXIuZCIKKyNkZWZpbmUgVlVMS0FOX0lMQVlFUkNPTkZfRElSICJpbXBsaWNpdF9sYXllci5kIgorI2RlZmluZSBWVUxLQU5fTEFZRVJfRElSICJsYXllciIKKworI2RlZmluZSBWS19EUklWRVJTX0lORk9fUkVMQVRJVkVfRElSIFZVTEtBTl9ESVIgVlVMS0FOX0lDRENPTkZfRElSCisjZGVmaW5lIFZLX1NFVFRJTkdTX0lORk9fUkVMQVRJVkVfRElSIFZVTEtBTl9ESVIgVlVMS0FOX1NFVFRJTkdTQ09ORl9ESVIKKyNkZWZpbmUgVktfRUxBWUVSU19JTkZPX1JFTEFUSVZFX0RJUiBWVUxLQU5fRElSIFZVTEtBTl9FTEFZRVJDT05GX0RJUgorI2RlZmluZSBWS19JTEFZRVJTX0lORk9fUkVMQVRJVkVfRElSIFZVTEtBTl9ESVIgVlVMS0FOX0lMQVlFUkNPTkZfRElSCisKKyNkZWZpbmUgVktfRFJJVkVSU19JTkZPX1JFR0lTVFJZX0xPQyAiIgorI2RlZmluZSBWS19TRVRUSU5HU19JTkZPX1JFR0lTVFJZX0xPQyAiIgorI2RlZmluZSBWS19FTEFZRVJTX0lORk9fUkVHSVNUUllfTE9DICIiCisjZGVmaW5lIFZLX0lMQVlFUlNfSU5GT19SRUdJU1RSWV9MT0MgIiIKKworI2lmICFkZWZpbmVkKERFRkFVTFRfVktfTEFZRVJTX1BBVEgpCisjZGVmaW5lIERFRkFVTFRfVktfTEFZRVJTX1BBVEggIiIKKyNlbmRpZgorI2lmICFkZWZpbmVkKExBWUVSU19TT1VSQ0VfUEFUSCkKKyNkZWZpbmUgTEFZRVJTX1NPVVJDRV9QQVRIIE5VTEwKKyNlbmRpZgorI2RlZmluZSBMQVlFUlNfUEFUSF9FTlYgIlZLX0xBWUVSX1BBVEgiCisjZGVmaW5lIEVOQUJMRURfTEFZRVJTX0VOViAiVktfSU5TVEFOQ0VfTEFZRVJTIgorCisvLyBDOTk6CisjZGVmaW5lIFBSSU5URl9TSVpFX1RfU1BFQ0lGSUVSICIlenUiCisKKy8vIEZpbGUgSU8KK3N0YXRpYyBpbmxpbmUgYm9vbCBsb2FkZXJfcGxhdGZvcm1fZmlsZV9leGlzdHMoY29uc3QgY2hhciAqcGF0aCkgeworICAgIGlmIChhY2Nlc3MocGF0aCwgRl9PSykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbG9hZGVyX3BsYXRmb3JtX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqcGF0aCkgeworICAgIGlmIChwYXRoWzBdID09ICcvJykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqbG9hZGVyX3BsYXRmb3JtX2Rpcm5hbWUoY2hhciAqcGF0aCkgeyByZXR1cm4gZGlybmFtZShwYXRoKTsgfQorCisvLyBEeW5hbWljIExvYWRpbmcgb2YgbGlicmFyaWVzOgordHlwZWRlZiB2b2lkICpsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlOworc3RhdGljIGlubGluZSBsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGxvYWRlcl9wbGF0Zm9ybV9vcGVuX2xpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgIC8vIFdoZW4gbG9hZGluZyB0aGUgbGlicmFyeSwgd2UgdXNlIFJUTERfTEFaWSBzbyB0aGF0IG5vdCBhbGwgc3ltYm9scyBoYXZlIHRvIGJlCisgICAgLy8gcmVzb2x2ZWQgYXQgdGhpcyB0aW1lICh3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZSkuIE5vdGUgdGhhdCBpZiBub3QgYWxsIHN5bWJvbHMKKyAgICAvLyBjYW4gYmUgcmVzb2x2ZWQsIHRoaXMgY291bGQgY2F1c2UgY3Jhc2hlcyBsYXRlci4gVXNlIHRoZSBMRF9CSU5EX05PVyBlbnZpcm9ubWVudAorICAgIC8vIHZhcmlhYmxlIHRvIGZvcmNlIGFsbCBzeW1ib2xzIHRvIGJlIHJlc29sdmVkIGhlcmUuCisgICAgcmV0dXJuIGRsb3BlbihsaWJQYXRoLCBSVExEX0xBWlkgfCBSVExEX0xPQ0FMKTsKK30KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqbG9hZGVyX3BsYXRmb3JtX29wZW5fbGlicmFyeV9lcnJvcihjb25zdCBjaGFyICpsaWJQYXRoKSB7IHJldHVybiBkbGVycm9yKCk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkZXJfcGxhdGZvcm1fY2xvc2VfbGlicmFyeShsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGxpYnJhcnkpIHsgZGxjbG9zZShsaWJyYXJ5KTsgfQorc3RhdGljIGlubGluZSB2b2lkICpsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGxpYnJhcnksIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBhc3NlcnQobGlicmFyeSk7CisgICAgYXNzZXJ0KG5hbWUpOworICAgIHJldHVybiBkbHN5bShsaWJyYXJ5LCBuYW1lKTsKK30KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3NfZXJyb3IoY29uc3QgY2hhciAqbmFtZSkgeyByZXR1cm4gZGxlcnJvcigpOyB9CisKKy8vIFRocmVhZHM6Cit0eXBlZGVmIHB0aHJlYWRfdCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkOworI2RlZmluZSBUSFJFQURfTE9DQUxfREVDTCBfX3RocmVhZAorCisvLyBUaGUgb25jZSBpbml0IGZ1bmN0aW9uYWxpdHkgaXMgbm90IHVzZWQgb24gTGludXgKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFX0RFQ0xBUkFUSU9OKHZhcikKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFX0RFRklOSVRJT04odmFyKQorI2RlZmluZSBMT0FERVJfUExBVEZPUk1fVEhSRUFEX09OQ0UoY3RsLCBmdW5jKQorCisvLyBUaHJlYWQgSURzOgordHlwZWRlZiBwdGhyZWFkX3QgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pZDsKK3N0YXRpYyBpbmxpbmUgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pZCBsb2FkZXJfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpIHsgcmV0dXJuIHB0aHJlYWRfc2VsZigpOyB9CisKKy8vIFRocmVhZCBtdXRleDoKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXg7CitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jcmVhdGVfbXV0ZXgobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IHB0aHJlYWRfbXV0ZXhfaW5pdChwTXV0ZXgsIE5VTEwpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBwdGhyZWFkX211dGV4X2xvY2socE11dGV4KTsgfQorc3RhdGljIGlubGluZSB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBwdGhyZWFkX211dGV4X3VubG9jayhwTXV0ZXgpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9kZWxldGVfbXV0ZXgobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IHB0aHJlYWRfbXV0ZXhfZGVzdHJveShwTXV0ZXgpOyB9Cit0eXBlZGVmIHB0aHJlYWRfY29uZF90IGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY29uZDsKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2luaXRfY29uZChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NvbmQgKnBDb25kKSB7IHB0aHJlYWRfY29uZF9pbml0KHBDb25kLCBOVUxMKTsgfQorc3RhdGljIGlubGluZSB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY29uZF93YWl0KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY29uZCAqcENvbmQsIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeworICAgIHB0aHJlYWRfY29uZF93YWl0KHBDb25kLCBwTXV0ZXgpOworfQorc3RhdGljIGlubGluZSB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY29uZF9icm9hZGNhc3QobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCkgeyBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KHBDb25kKTsgfQorCisjZGVmaW5lIGxvYWRlcl9zdGFja19hbGxvYyhzaXplKSBhbGxvY2Eoc2l6ZSkKKworI2VsaWYgZGVmaW5lZChfV0lOMzIpICAvLyBkZWZpbmVkKF9fbGludXhfXykKKy8qIFdpbmRvd3Mtc3BlY2lmaWMgY29tbW9uIGNvZGU6ICovCisvLyBXaW5CYXNlLmggZGVmaW5lcyBDcmVhdGVTZW1hcGhvcmUgYW5kIHN5bmNoYXBpLmggZGVmaW5lcyBDcmVhdGVFdmVudAorLy8gIHVuZGVmaW5lIHRoZW0gdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggVmtMYXllckRpc3BhdGNoVGFibGUgc3RydWN0IG1lbWJlcnMuCisjaWZkZWYgQ3JlYXRlU2VtYXBob3JlCisjdW5kZWYgQ3JlYXRlU2VtYXBob3JlCisjZW5kaWYKKyNpZmRlZiBDcmVhdGVFdmVudAorI3VuZGVmIENyZWF0ZUV2ZW50CisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHNobHdhcGkuaD4KKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKKworLy8gVksgTGlicmFyeSBGaWxlbmFtZXMsIFBhdGhzLCBldGMuOgorI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAnOycKKyNkZWZpbmUgRElSRUNUT1JZX1NZTUJPTCAnXFwnCisjZGVmaW5lIERFRkFVTFRfVktfUkVHSVNUUllfSElWRSBIS0VZX0xPQ0FMX01BQ0hJTkUKKyNkZWZpbmUgREVGQVVMVF9WS19SRUdJU1RSWV9ISVZFX1NUUiAiSEtFWV9MT0NBTF9NQUNISU5FIgorI2RlZmluZSBTRUNPTkRBUllfVktfUkVHSVNUUllfSElWRSBIS0VZX0NVUlJFTlRfVVNFUgorI2RlZmluZSBTRUNPTkRBUllfVktfUkVHSVNUUllfSElWRV9TVFIgIkhLRVlfQ1VSUkVOVF9VU0VSIgorCisjZGVmaW5lIFZLX0RSSVZFUlNfSU5GT19SRUxBVElWRV9ESVIgIiIKKyNkZWZpbmUgVktfU0VUVElOR1NfSU5GT19SRUxBVElWRV9ESVIgIiIKKyNkZWZpbmUgVktfRUxBWUVSU19JTkZPX1JFTEFUSVZFX0RJUiAiIgorI2RlZmluZSBWS19JTEFZRVJTX0lORk9fUkVMQVRJVkVfRElSICIiCisKKyNpZmRlZiBfV0lONjQKKyNkZWZpbmUgSEtSX1ZLX0RSSVZFUl9OQU1FIEFQSV9OQU1FICJEcml2ZXJOYW1lIgorI2Vsc2UKKyNkZWZpbmUgSEtSX1ZLX0RSSVZFUl9OQU1FIEFQSV9OQU1FICJEcml2ZXJOYW1lV293IgorI2VuZGlmCisjZGVmaW5lIFZLX0RSSVZFUlNfSU5GT19SRUdJU1RSWV9MT0MgIlNPRlRXQVJFXFxLaHJvbm9zXFwiIEFQSV9OQU1FICJcXERyaXZlcnMiCisjZGVmaW5lIFZLX1NFVFRJTkdTX0lORk9fUkVHSVNUUllfTE9DICJTT0ZUV0FSRVxcS2hyb25vc1xcIiBBUElfTkFNRSAiXFxTZXR0aW5ncyIKKyNkZWZpbmUgVktfRUxBWUVSU19JTkZPX1JFR0lTVFJZX0xPQyAiU09GVFdBUkVcXEtocm9ub3NcXCIgQVBJX05BTUUgIlxcRXhwbGljaXRMYXllcnMiCisjZGVmaW5lIFZLX0lMQVlFUlNfSU5GT19SRUdJU1RSWV9MT0MgIlNPRlRXQVJFXFxLaHJvbm9zXFwiIEFQSV9OQU1FICJcXEltcGxpY2l0TGF5ZXJzIgorCisjaWYgIWRlZmluZWQoREVGQVVMVF9WS19MQVlFUlNfUEFUSCkKKyNkZWZpbmUgREVGQVVMVF9WS19MQVlFUlNfUEFUSCAiIgorI2VuZGlmCisjaWYgIWRlZmluZWQoTEFZRVJTX1NPVVJDRV9QQVRIKQorI2RlZmluZSBMQVlFUlNfU09VUkNFX1BBVEggTlVMTAorI2VuZGlmCisjZGVmaW5lIExBWUVSU19QQVRIX0VOViAiVktfTEFZRVJfUEFUSCIKKyNkZWZpbmUgRU5BQkxFRF9MQVlFUlNfRU5WICJWS19JTlNUQU5DRV9MQVlFUlMiCisKKyNkZWZpbmUgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIgIiVJdSIKKworI2lmIGRlZmluZWQoX1dJTjMyKQorLy8gR2V0IHRoZSBrZXkgZm9yIHRoZSBwbHVnIG4gcGxheSBkcml2ZXIgcmVnaXN0cnkKKy8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBzaG91bGQgTk9UIGJlIGZyZWVkCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKkxvYWRlclBucERyaXZlclJlZ2lzdHJ5KCkgeworICAgIEJPT0wgaXNfd293OworICAgIElzV293NjRQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksICZpc193b3cpOworICAgIHJldHVybiBpc193b3cgPyAiVnVsa2FuRHJpdmVyTmFtZVdvdyIgOiAiVnVsa2FuRHJpdmVyTmFtZSI7Cit9CitzdGF0aWMgaW5saW5lIGNvbnN0IHdjaGFyX3QgKkxvYWRlclBucERyaXZlclJlZ2lzdHJ5V2lkZSgpIHsKKyAgICBCT09MIGlzX3dvdzsKKyAgICBJc1dvdzY0UHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAmaXNfd293KTsKKyAgICByZXR1cm4gaXNfd293ID8gTCJWdWxrYW5Ecml2ZXJOYW1lV293IiA6IEwiVnVsa2FuRHJpdmVyTmFtZSI7Cit9CisKKy8vIEdldCB0aGUga2V5IGZvciB0aGUgcGx1ZyAnbiBwbGF5IGV4cGxpY2l0IGxheWVyIHJlZ2lzdHJ5CisvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gc2hvdWxkIE5PVCBiZSBmcmVlZAorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpMb2FkZXJQbnBFTGF5ZXJSZWdpc3RyeSgpIHsKKyAgICBCT09MIGlzX3dvdzsKKyAgICBJc1dvdzY0UHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAmaXNfd293KTsKKyAgICByZXR1cm4gaXNfd293ID8gIlZ1bGthbkV4cGxpY2l0TGF5ZXJzV293IiA6ICJWdWxrYW5FeHBsaWNpdExheWVycyI7Cit9CitzdGF0aWMgaW5saW5lIGNvbnN0IHdjaGFyX3QgKkxvYWRlclBucEVMYXllclJlZ2lzdHJ5V2lkZSgpIHsKKyAgICBCT09MIGlzX3dvdzsKKyAgICBJc1dvdzY0UHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAmaXNfd293KTsKKyAgICByZXR1cm4gaXNfd293ID8gTCJWdWxrYW5FeHBsaWNpdExheWVyc1dvdyIgOiBMIlZ1bGthbkV4cGxpY2l0TGF5ZXJzIjsKK30KKworLy8gR2V0IHRoZSBrZXkgZm9yIHRoZSBwbHVnICduIHBsYXkgaW1wbGljaXQgbGF5ZXIgcmVnaXN0cnkKKy8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBzaG91bGQgTk9UIGJlIGZyZWVkCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKkxvYWRlclBucElMYXllclJlZ2lzdHJ5KCkgeworICAgIEJPT0wgaXNfd293OworICAgIElzV293NjRQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksICZpc193b3cpOworICAgIHJldHVybiBpc193b3cgPyAiVnVsa2FuSW1wbGljaXRMYXllcnNXb3ciIDogIlZ1bGthbkltcGxpY2l0TGF5ZXJzIjsKK30KK3N0YXRpYyBpbmxpbmUgY29uc3Qgd2NoYXJfdCAqTG9hZGVyUG5wSUxheWVyUmVnaXN0cnlXaWRlKCkgeworICAgIEJPT0wgaXNfd293OworICAgIElzV293NjRQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksICZpc193b3cpOworICAgIHJldHVybiBpc193b3cgPyBMIlZ1bGthbkltcGxpY2l0TGF5ZXJzV293IiA6IEwiVnVsa2FuSW1wbGljaXRMYXllcnMiOworfQorI2VuZGlmCisKKy8vIEZpbGUgSU8KK3N0YXRpYyBib29sIGxvYWRlcl9wbGF0Zm9ybV9maWxlX2V4aXN0cyhjb25zdCBjaGFyICpwYXRoKSB7CisgICAgaWYgKChfYWNjZXNzKHBhdGgsIDApKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGxvYWRlcl9wbGF0Zm9ybV9pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBpZiAoIXBhdGggfHwgISpwYXRoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCpwYXRoID09IERJUkVDVE9SWV9TWU1CT0wgfHwgcGF0aFsxXSA9PSAnOicpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gV0lOMzIgcnVudGltZSBkb2Vzbid0IGhhdmUgZGlybmFtZSgpLgorc3RhdGljIGlubGluZSBjaGFyICpsb2FkZXJfcGxhdGZvcm1fZGlybmFtZShjaGFyICpwYXRoKSB7CisgICAgY2hhciAqY3VycmVudCwgKm5leHQ7CisKKyAgICAvLyBUT0RPL1RCRDogRG8gd2UgbmVlZCB0byBkZWFsIHdpdGggdGhlIFdpbmRvd3MncyAiOiIgY2hhcmFjdGVyPworCisgICAgZm9yIChjdXJyZW50ID0gcGF0aDsgKmN1cnJlbnQgIT0gJ1wwJzsgY3VycmVudCA9IG5leHQpIHsKKyAgICAgICAgbmV4dCA9IHN0cmNocihjdXJyZW50LCBESVJFQ1RPUllfU1lNQk9MKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gcGF0aCkgKihjdXJyZW50IC0gMSkgPSAnXDAnOworICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQb2ludCBvbmUgY2hhcmFjdGVyIHBhc3QgdGhlIERJUkVDVE9SWV9TWU1CT0w6CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBhdGg7Cit9CisKKy8vIFdJTjMyIHJ1bnRpbWUgZG9lc24ndCBoYXZlIGJhc2VuYW1lKCkuCisvLyBNaWNyb3NvZnQgYWxzbyBkb2Vzbid0IGhhdmUgYmFzZW5hbWUoKS4gIFBhdGhzIGFyZSBkaWZmZXJlbnQgb24gV2luZG93cywgYW5kCisvLyBzbyB0aGlzIGlzIGp1c3QgYSB0ZW1wb3Jhcnkgc29sdXRpb24gaW4gb3JkZXIgdG8gZ2V0IHVzIGNvbXBpbGluZywgc28gdGhhdCB3ZQorLy8gY2FuIHRlc3Qgc29tZSBzY2VuYXJpb3MsIGFuZCBkZXZlbG9wIHRoZSBjb3JyZWN0IHNvbHV0aW9uIGZvciBXaW5kb3dzLgorLy8gVE9ETzogRGV2ZWxvcCBhIGJldHRlciwgcGVybWFuZW50IHNvbHV0aW9uIGZvciBXaW5kb3dzLCB0byByZXBsYWNlIHRoaXMKKy8vIHRlbXBvcmFyeSBjb2RlOgorc3RhdGljIGNoYXIgKmxvYWRlcl9wbGF0Zm9ybV9iYXNlbmFtZShjaGFyICpwYXRobmFtZSkgeworICAgIGNoYXIgKmN1cnJlbnQsICpuZXh0OworCisgICAgLy8gVE9ETy9UQkQ6IERvIHdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBXaW5kb3dzJ3MgIjoiIGNoYXJhY3Rlcj8KKworICAgIGZvciAoY3VycmVudCA9IHBhdGhuYW1lOyAqY3VycmVudCAhPSAnXDAnOyBjdXJyZW50ID0gbmV4dCkgeworICAgICAgICBuZXh0ID0gc3RyY2hyKGN1cnJlbnQsIERJUkVDVE9SWV9TWU1CT0wpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBObyBtb3JlIERJUkVDVE9SWV9TWU1CT0wncyBzbyByZXR1cm4gcDoKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUG9pbnQgb25lIGNoYXJhY3RlciBwYXN0IHRoZSBESVJFQ1RPUllfU1lNQk9MOgorICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgfQorICAgIC8vIFdlIHNob3VsZG4ndCBnZXQgdG8gaGVyZSwgYnV0IHRoaXMgbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5OgorICAgIHJldHVybiBjdXJyZW50OworfQorCisvLyBEeW5hbWljIExvYWRpbmc6Cit0eXBlZGVmIEhNT0RVTEUgbG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZTsKK3N0YXRpYyBsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGxvYWRlcl9wbGF0Zm9ybV9vcGVuX2xpYnJhcnkoY29uc3QgY2hhciAqbGliX3BhdGgpIHsKKyAgICAvLyBUcnkgbG9hZGluZyB0aGUgbGlicmFyeSB0aGUgb3JpZ2luYWwgd2F5IGZpcnN0LgorICAgIGxvYWRlcl9wbGF0Zm9ybV9kbF9oYW5kbGUgbGliX2hhbmRsZSA9IExvYWRMaWJyYXJ5KGxpYl9wYXRoKTsKKyAgICBpZiAobGliX2hhbmRsZSA9PSBOVUxMICYmIEdldExhc3RFcnJvcigpID09IEVSUk9SX01PRF9OT1RfRk9VTkQpIHsKKyAgICAgICAgLy8gSWYgdGhhdCBmYWlsZWQsIHRoZW4gdHJ5IGxvYWRpbmcgaXQgd2l0aCBicm9hZGVyIHNlYXJjaCBmb2xkZXJzLgorICAgICAgICBsaWJfaGFuZGxlID0gTG9hZExpYnJhcnlFeChsaWJfcGF0aCwgTlVMTCwgTE9BRF9MSUJSQVJZX1NFQVJDSF9ERUZBVUxUX0RJUlMgfCBMT0FEX0xJQlJBUllfU0VBUkNIX0RMTF9MT0FEX0RJUik7CisgICAgfQorICAgIHJldHVybiBsaWJfaGFuZGxlOworfQorc3RhdGljIGNoYXIgKmxvYWRlcl9wbGF0Zm9ybV9vcGVuX2xpYnJhcnlfZXJyb3IoY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgIHN0YXRpYyBjaGFyIGVycm9yTXNnWzE2NF07CisgICAgKHZvaWQpc25wcmludGYoZXJyb3JNc2csIDE2MywgIkZhaWxlZCB0byBvcGVuIGR5bmFtaWMgbGlicmFyeSBcIiVzXCIgd2l0aCBlcnJvciAlbHUiLCBsaWJQYXRoLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIGVycm9yTXNnOworfQorc3RhdGljIHZvaWQgbG9hZGVyX3BsYXRmb3JtX2Nsb3NlX2xpYnJhcnkobG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsaWJyYXJ5KSB7IEZyZWVMaWJyYXJ5KGxpYnJhcnkpOyB9CitzdGF0aWMgdm9pZCAqbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsaWJyYXJ5LCBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgYXNzZXJ0KGxpYnJhcnkpOworICAgIGFzc2VydChuYW1lKTsKKyAgICByZXR1cm4gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhsaWJyYXJ5LCBuYW1lKTsKK30KK3N0YXRpYyBjaGFyICpsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzc19lcnJvcihjb25zdCBjaGFyICpuYW1lKSB7CisgICAgc3RhdGljIGNoYXIgZXJyb3JNc2dbMTIwXTsKKyAgICAodm9pZClzbnByaW50ZihlcnJvck1zZywgMTE5LCAiRmFpbGVkIHRvIGZpbmQgZnVuY3Rpb24gXCIlc1wiIGluIGR5bmFtaWMgbGlicmFyeSIsIG5hbWUpOworICAgIHJldHVybiBlcnJvck1zZzsKK30KKworLy8gVGhyZWFkczoKK3R5cGVkZWYgSEFORExFIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWQ7CisKKy8vIF9fZGVjbHNwZWModGhyZWFkKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IE1pbkdXIGNvbXBpbGVyIChpZ25vcmVkIHdpdGggd2FybmluZyBvcgorLy8gICAgICAgICAgICAgICAgICAgIGNhdXNlIGVyb3JyIGRlcGVuZGluZyBvbiBjb21waWxlciBzd2l0Y2hlcykKKy8vCisvLyBfX3RocmVhZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCisvLworLy8gX19NSU5HVzMyX18gZGVmaW5lZCBmb3IgYm90aCAzMiBhbmQgNjQgYml0IE1pbkdXIGNvbXBpbGVycywgc28gaXQgaXMgZW5vdWdoIHRvCisvLyBkZXRlY3QgYW55ICgzMiBvciA2NCkgZmxhd29yIG9mIE1pbkdXIGNvbXBpbGVyLgorLy8KKy8vIEBub3RlIF9fR05VQ19fIGNvdWxkIGJlIHVzZWQgYXMgYSBtb3JlIGdlbmVyaWMgd2F5IHRvIGRldGVjdCBfYW55XworLy8gICAgICAgR0NDWy1jb21waXRpYmxlXSBjb21waWxlciBvbiBXaW5kb3dzLCBidXQgdGhpcyBmaXggd2FzIHRlc3RlZAorLy8gICAgICAgb25seSB3aXRoIE1pbkdXLCBzbyBrZWVwIGl0IGV4cGxpY2l0IGF0IHRoZSBtb21lbnQuCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyNkZWZpbmUgVEhSRUFEX0xPQ0FMX0RFQ0wgX190aHJlYWQKKyNlbHNlCisjZGVmaW5lIFRIUkVBRF9MT0NBTF9ERUNMIF9fZGVjbHNwZWModGhyZWFkKQorI2VuZGlmCisKKy8vIFRoZSBvbmNlIGluaXQgZnVuY3Rpb25hbGl0eSBpcyBub3QgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgRExMIG9uIFdpbmRvd3MuIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgdG8gY2xlYW4gdXAgdGhlCisvLyByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGFueXRoaW5nIGFsbG9jYXRlZCBieSBvbmNlIGluaXQuIFRoaXMgaXNuJ3QgYSBwcm9ibGVtIGZvciBzdGF0aWMgbGlicmFyaWVzLCBidXQgaXQgaXMgZm9yIGR5bmFtaWMKKy8vIG9uZXMuIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIHVzZSBEbGxNYWluKCkgaW5zdGVhZCB0byBhbGxvdyBwcm9wZXJseSBjbGVhbmluZyB1cCByZXNvdXJjZXMuCisjaWYgZGVmaW5lZChMT0FERVJfRFlOQU1JQ19MSUIpCisjZGVmaW5lIExPQURFUl9QTEFURk9STV9USFJFQURfT05DRV9ERUNMQVJBVElPTih2YXIpCisjZGVmaW5lIExPQURFUl9QTEFURk9STV9USFJFQURfT05DRV9ERUZJTklUSU9OKHZhcikKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFKGN0bCwgZnVuYykKKyNlbHNlCisjZGVmaW5lIExPQURFUl9QTEFURk9STV9USFJFQURfT05DRV9ERUNMQVJBVElPTih2YXIpIElOSVRfT05DRSB2YXIgPSBJTklUX09OQ0VfU1RBVElDX0lOSVQ7CisjZGVmaW5lIExPQURFUl9QTEFURk9STV9USFJFQURfT05DRV9ERUZJTklUSU9OKHZhcikgSU5JVF9PTkNFIHZhcjsKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFKGN0bCwgZnVuYykgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9vbmNlX2ZuKGN0bCwgZnVuYykKK3N0YXRpYyBCT09MIENBTExCQUNLIEluaXRGdW5jV3JhcHBlcihQSU5JVF9PTkNFIEluaXRPbmNlLCBQVk9JRCBQYXJhbWV0ZXIsIFBWT0lEICpDb250ZXh0KSB7CisgICAgdm9pZCAoKmZ1bmMpKHZvaWQpID0gKHZvaWQgKCopKHZvaWQpKVBhcmFtZXRlcjsKKyAgICBmdW5jKCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CitzdGF0aWMgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX29uY2VfZm4odm9pZCAqY3RsLCB2b2lkICgqZnVuYykodm9pZCkpIHsKKyAgICBhc3NlcnQoZnVuYyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoY3RsICE9IE5VTEwpOworICAgIEluaXRPbmNlRXhlY3V0ZU9uY2UoKFBJTklUX09OQ0UpY3RsLCBJbml0RnVuY1dyYXBwZXIsICh2b2lkICopZnVuYywgTlVMTCk7Cit9CisjZW5kaWYKKworLy8gVGhyZWFkIElEczoKK3R5cGVkZWYgRFdPUkQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pZDsKK3N0YXRpYyBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2lkIGxvYWRlcl9wbGF0Zm9ybV9nZXRfdGhyZWFkX2lkKCkgeyByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCk7IH0KKworLy8gVGhyZWFkIG11dGV4OgordHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXg7CitzdGF0aWMgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZV9tdXRleChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihwTXV0ZXgpOyB9CitzdGF0aWMgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IEVudGVyQ3JpdGljYWxTZWN0aW9uKHBNdXRleCk7IH0KK3N0YXRpYyB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBMZWF2ZUNyaXRpY2FsU2VjdGlvbihwTXV0ZXgpOyB9CitzdGF0aWMgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2RlbGV0ZV9tdXRleChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKHBNdXRleCk7IH0KK3R5cGVkZWYgQ09ORElUSU9OX1ZBUklBQkxFIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY29uZDsKK3N0YXRpYyB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaW5pdF9jb25kKGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY29uZCAqcENvbmQpIHsgSW5pdGlhbGl6ZUNvbmRpdGlvblZhcmlhYmxlKHBDb25kKTsgfQorc3RhdGljIHZvaWQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jb25kX3dhaXQobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCwgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7CisgICAgU2xlZXBDb25kaXRpb25WYXJpYWJsZUNTKHBDb25kLCBwTXV0ZXgsIElORklOSVRFKTsKK30KK3N0YXRpYyB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY29uZF9icm9hZGNhc3QobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCkgeyBXYWtlQWxsQ29uZGl0aW9uVmFyaWFibGUocENvbmQpOyB9CisKKyNkZWZpbmUgbG9hZGVyX3N0YWNrX2FsbG9jKHNpemUpIF9hbGxvY2Eoc2l6ZSkKKyNlbHNlICAvLyBkZWZpbmVkKF9XSU4zMikKKworI2Vycm9yIFRoZSAibG9hZGVyX3BsYXRmb3JtLmgiIGZpbGUgbXVzdCBiZSBtb2RpZmllZCBmb3IgdGhpcyBPUy4KKworLy8gTk9URTogSW4gb3JkZXIgdG8gc3VwcG9ydCBhbm90aGVyIE9TLCBhbiAjZWxpZiBuZWVkcyB0byBiZSBhZGRlZCAoYWJvdmUgdGhlCisvLyAiI2Vsc2UgLy8gZGVmaW5lZChfV0lOMzIpIikgZm9yIHRoYXQgT1MsIGFuZCBPUy1zcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGUKKy8vIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtdXN0IGJlIGNyZWF0ZWQuCisKKy8vIE5PVEU6IE90aGVyIE9TLXNwZWNpZmljIGNoYW5nZXMgYXJlIGFsc28gbmVlZGVkIGZvciB0aGlzIE9TLiAgU2VhcmNoIGZvcgorLy8gZmlsZXMgd2l0aCAiV0lOMzIiIGluIGl0LCBhcyBhIHF1aWNrIHdheSB0byBmaW5kIGZpbGVzIHRoYXQgbXVzdCBiZSBjaGFuZ2VkLgorCisjZW5kaWYgIC8vIGRlZmluZWQoX1dJTjMyKQorCisvLyByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBhcHBlYXJzIHRvIGJlIGEgcmVsYXRpdmUgb3IgYWJzb2x1dGUKKy8vIHBhdGgsIGFzIG9wcG9zZWQgdG8gYSBiYXJlIGZpbGVuYW1lLgorc3RhdGljIGlubGluZSBib29sIGxvYWRlcl9wbGF0Zm9ybV9pc19wYXRoKGNvbnN0IGNoYXIgKnBhdGgpIHsgcmV0dXJuIHN0cmNocihwYXRoLCBESVJFQ1RPUllfU1lNQk9MKSAhPSBOVUxMOyB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3Z1bGthbi0xLmRlZiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvdnVsa2FuLTEuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNmY1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3Z1bGthbi0xLmRlZgpAQCAtMCwwICsxLDIyMSBAQAorCis7Ozs7IEJlZ2luIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OworOworOyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCis7IENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCis7IENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOworOyAgQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorOworOzs7OyAgRW5kIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKworTElCUkFSWSB2dWxrYW4tMS5kbGwKK0VYUE9SVFMKKyAgIHZrQ3JlYXRlSW5zdGFuY2UKKyAgIHZrRGVzdHJveUluc3RhbmNlCisgICB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcworICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzCisgICB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcworICAgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcworICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMKKyAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMKKyAgIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzCisgICB2a0dldEluc3RhbmNlUHJvY0FkZHIKKyAgIHZrR2V0RGV2aWNlUHJvY0FkZHIKKyAgIHZrQ3JlYXRlRGV2aWNlCisgICB2a0Rlc3Ryb3lEZXZpY2UKKyAgIHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzCisgICB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMKKyAgIHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMKKyAgIHZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzCisgICB2a0dldERldmljZVF1ZXVlCisgICB2a1F1ZXVlU3VibWl0CisgICB2a1F1ZXVlV2FpdElkbGUKKyAgIHZrRGV2aWNlV2FpdElkbGUKKyAgIHZrQWxsb2NhdGVNZW1vcnkKKyAgIHZrRnJlZU1lbW9yeQorICAgdmtNYXBNZW1vcnkKKyAgIHZrVW5tYXBNZW1vcnkKKyAgIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMKKyAgIHZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcworICAgdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50CisgICB2a0JpbmRCdWZmZXJNZW1vcnkKKyAgIHZrQmluZEltYWdlTWVtb3J5CisgICB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cworICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cworICAgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cworICAgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcworICAgdmtRdWV1ZUJpbmRTcGFyc2UKKyAgIHZrQ3JlYXRlRmVuY2UKKyAgIHZrRGVzdHJveUZlbmNlCisgICB2a1Jlc2V0RmVuY2VzCisgICB2a0dldEZlbmNlU3RhdHVzCisgICB2a1dhaXRGb3JGZW5jZXMKKyAgIHZrQ3JlYXRlU2VtYXBob3JlCisgICB2a0Rlc3Ryb3lTZW1hcGhvcmUKKyAgIHZrQ3JlYXRlRXZlbnQKKyAgIHZrRGVzdHJveUV2ZW50CisgICB2a0dldEV2ZW50U3RhdHVzCisgICB2a1NldEV2ZW50CisgICB2a1Jlc2V0RXZlbnQKKyAgIHZrQ3JlYXRlUXVlcnlQb29sCisgICB2a0Rlc3Ryb3lRdWVyeVBvb2wKKyAgIHZrR2V0UXVlcnlQb29sUmVzdWx0cworICAgdmtDcmVhdGVCdWZmZXIKKyAgIHZrRGVzdHJveUJ1ZmZlcgorICAgdmtDcmVhdGVCdWZmZXJWaWV3CisgICB2a0Rlc3Ryb3lCdWZmZXJWaWV3CisgICB2a0NyZWF0ZUltYWdlCisgICB2a0Rlc3Ryb3lJbWFnZQorICAgdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0CisgICB2a0NyZWF0ZUltYWdlVmlldworICAgdmtEZXN0cm95SW1hZ2VWaWV3CisgICB2a0NyZWF0ZVNoYWRlck1vZHVsZQorICAgdmtEZXN0cm95U2hhZGVyTW9kdWxlCisgICB2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUKKyAgIHZrRGVzdHJveVBpcGVsaW5lQ2FjaGUKKyAgIHZrR2V0UGlwZWxpbmVDYWNoZURhdGEKKyAgIHZrTWVyZ2VQaXBlbGluZUNhY2hlcworICAgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcworICAgdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzCisgICB2a0Rlc3Ryb3lQaXBlbGluZQorICAgdmtDcmVhdGVQaXBlbGluZUxheW91dAorICAgdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQKKyAgIHZrQ3JlYXRlU2FtcGxlcgorICAgdmtEZXN0cm95U2FtcGxlcgorICAgdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0CisgICB2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0CisgICB2a0NyZWF0ZURlc2NyaXB0b3JQb29sCisgICB2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbAorICAgdmtSZXNldERlc2NyaXB0b3JQb29sCisgICB2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMKKyAgIHZrRnJlZURlc2NyaXB0b3JTZXRzCisgICB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzCisgICB2a0NyZWF0ZUZyYW1lYnVmZmVyCisgICB2a0Rlc3Ryb3lGcmFtZWJ1ZmZlcgorICAgdmtDcmVhdGVSZW5kZXJQYXNzCisgICB2a0Rlc3Ryb3lSZW5kZXJQYXNzCisgICB2a0dldFJlbmRlckFyZWFHcmFudWxhcml0eQorICAgdmtDcmVhdGVDb21tYW5kUG9vbAorICAgdmtEZXN0cm95Q29tbWFuZFBvb2wKKyAgIHZrUmVzZXRDb21tYW5kUG9vbAorICAgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzCisgICB2a0ZyZWVDb21tYW5kQnVmZmVycworICAgdmtCZWdpbkNvbW1hbmRCdWZmZXIKKyAgIHZrRW5kQ29tbWFuZEJ1ZmZlcgorICAgdmtSZXNldENvbW1hbmRCdWZmZXIKKyAgIHZrQ21kQmluZFBpcGVsaW5lCisgICB2a0NtZFNldFZpZXdwb3J0CisgICB2a0NtZFNldFNjaXNzb3IKKyAgIHZrQ21kU2V0TGluZVdpZHRoCisgICB2a0NtZFNldERlcHRoQmlhcworICAgdmtDbWRTZXRCbGVuZENvbnN0YW50cworICAgdmtDbWRTZXREZXB0aEJvdW5kcworICAgdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2sKKyAgIHZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzaworICAgdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlCisgICB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cworICAgdmtDbWRCaW5kSW5kZXhCdWZmZXIKKyAgIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnMKKyAgIHZrQ21kRHJhdworICAgdmtDbWREcmF3SW5kZXhlZAorICAgdmtDbWREcmF3SW5kaXJlY3QKKyAgIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdAorICAgdmtDbWREaXNwYXRjaAorICAgdmtDbWREaXNwYXRjaEluZGlyZWN0CisgICB2a0NtZENvcHlCdWZmZXIKKyAgIHZrQ21kQ29weUltYWdlCisgICB2a0NtZEJsaXRJbWFnZQorICAgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZQorICAgdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcgorICAgdmtDbWRVcGRhdGVCdWZmZXIKKyAgIHZrQ21kRmlsbEJ1ZmZlcgorICAgdmtDbWRDbGVhckNvbG9ySW1hZ2UKKyAgIHZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZQorICAgdmtDbWRDbGVhckF0dGFjaG1lbnRzCisgICB2a0NtZFJlc29sdmVJbWFnZQorICAgdmtDbWRTZXRFdmVudAorICAgdmtDbWRSZXNldEV2ZW50CisgICB2a0NtZFdhaXRFdmVudHMKKyAgIHZrQ21kUGlwZWxpbmVCYXJyaWVyCisgICB2a0NtZEJlZ2luUXVlcnkKKyAgIHZrQ21kRW5kUXVlcnkKKyAgIHZrQ21kUmVzZXRRdWVyeVBvb2wKKyAgIHZrQ21kV3JpdGVUaW1lc3RhbXAKKyAgIHZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMKKyAgIHZrQ21kUHVzaENvbnN0YW50cworICAgdmtDbWRCZWdpblJlbmRlclBhc3MKKyAgIHZrQ21kTmV4dFN1YnBhc3MKKyAgIHZrQ21kRW5kUmVuZGVyUGFzcworICAgdmtDbWRFeGVjdXRlQ29tbWFuZHMKKyAgIHZrRGVzdHJveVN1cmZhY2VLSFIKKyAgIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUgorICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIKKyAgIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUgorICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIKKyAgIHZrQ3JlYXRlU3dhcGNoYWluS0hSCisgICB2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIKKyAgIHZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSCisgICB2a0FjcXVpcmVOZXh0SW1hZ2VLSFIKKyAgIHZrUXVldWVQcmVzZW50S0hSCisgICB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIKKyAgIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSCisgICB2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSCisgICB2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUgorICAgdmtDcmVhdGVEaXNwbGF5TW9kZUtIUgorICAgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIKKyAgIHZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUgorICAgdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSCisgICB2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUgorICAgdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUgorCisgICB2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbgorICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcworICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMgorICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyCisgICB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIKKyAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyCisgICB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIKKyAgIHZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyCisgICB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzCisgICB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzCisgICB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMKKyAgIHZrQmluZEJ1ZmZlck1lbW9yeTIKKyAgIHZrQmluZEltYWdlTWVtb3J5MgorICAgdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcworICAgdmtDbWRTZXREZXZpY2VNYXNrCisgICB2a0NtZERpc3BhdGNoQmFzZQorICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIKKyAgIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMgorICAgdmtUcmltQ29tbWFuZFBvb2wKKyAgIHZrR2V0RGV2aWNlUXVldWUyCisgICB2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24KKyAgIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24KKyAgIHZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQKKyAgIHZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSCisgICB2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUgorICAgdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSCisgICB2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSCisgICB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZQorICAgdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlCisgICB2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUKKworICAgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUgorICAgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSCisgICB2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIKKyAgIHZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUgorCisgICB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMgorICAgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvdnVsa2FuLnBjLmluIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci92dWxrYW4ucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlNWFlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvdnVsa2FuLnBjLmluCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD1AQ01BS0VfSU5TVEFMTF9QUkVGSVhACitleGVjX3ByZWZpeD1AQ01BS0VfSU5TVEFMTF9QUkVGSVhACitsaWJkaXI9JHtleGVjX3ByZWZpeH0vQENNQUtFX0lOU1RBTExfTElCRElSQAoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBAQ01BS0VfUFJPSkVDVF9OQU1FQAorRGVzY3JpcHRpb246IFZ1bGthbiBMb2FkZXIKK1ZlcnNpb246IEBWS19BUElfVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdnVsa2FuCitMaWJzLnByaXZhdGU6IEBQUklWQVRFX0xJQlNACitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3dzaS5jIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci93c2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ4ZTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL2xvYWRlci93c2kuYwpAQCAtMCwwICsxLDIwMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIDIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBJYW4gRWxsaW90dCA8aWFuQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSWFuIEVsbGlvdHQgPGlhbmVsbGlvdHRAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBMZW5ueSBLb21vdyA8bGVubnlAbHVuYXJnLmNvbT4KKyAqLworCisjaWZuZGVmIF9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInZrX2xvYWRlcl9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImxvYWRlci5oIgorI2luY2x1ZGUgIndzaS5oIgorI2luY2x1ZGUgPHZ1bGthbi92a19pY2QuaD4KKworLy8gVGhlIGZpcnN0IElDRC9Mb2FkZXIgaW50ZXJmYWNlIHRoYXQgc3VwcG9ydCBxdWVyeWluZyB0aGUgU3VyZmFjZUtIUiBmcm9tCisvLyB0aGUgSUNEcy4KKyNkZWZpbmUgSUNEX1ZFUl9TVVBQT1JUU19JQ0RfU1VSRkFDRV9LSFIgMworCit2b2lkIHdzaV9jcmVhdGVfaW5zdGFuY2Uoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlLCBjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pIHsKKyAgICBwdHJfaW5zdGFuY2UtPndzaV9zdXJmYWNlX2VuYWJsZWQgPSBmYWxzZTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBwdHJfaW5zdGFuY2UtPndzaV93aW4zMl9zdXJmYWNlX2VuYWJsZWQgPSBmYWxzZTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIHB0cl9pbnN0YW5jZS0+d3NpX3dheWxhbmRfc3VyZmFjZV9lbmFibGVkID0gZmFsc2U7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgcHRyX2luc3RhbmNlLT53c2lfeGNiX3N1cmZhY2VfZW5hYmxlZCA9IGZhbHNlOworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIHB0cl9pbnN0YW5jZS0+d3NpX3hsaWJfc3VyZmFjZV9lbmFibGVkID0gZmFsc2U7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHB0cl9pbnN0YW5jZS0+d3NpX2FuZHJvaWRfc3VyZmFjZV9lbmFibGVkID0gZmFsc2U7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyAgICBwdHJfaW5zdGFuY2UtPndzaV9tYWNvc19zdXJmYWNlX2VuYWJsZWQgPSBmYWxzZTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisgICAgcHRyX2luc3RhbmNlLT53c2lfaW9zX3N1cmZhY2VfZW5hYmxlZCA9IGZhbHNlOworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgIHB0cl9pbnN0YW5jZS0+d3NpX2Rpc3BsYXlfZW5hYmxlZCA9IGZhbHNlOworICAgIHB0cl9pbnN0YW5jZS0+d3NpX2Rpc3BsYXlfcHJvcHMyX2VuYWJsZWQgPSBmYWxzZTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgcHRyX2luc3RhbmNlLT53c2lfbWV0YWxfc3VyZmFjZV9lbmFibGVkID0gZmFsc2U7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpID09IDApIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+d3NpX3N1cmZhY2VfZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgaWYgKHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0tIUl9XSU4zMl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPndzaV93aW4zMl9zdXJmYWNlX2VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgICAgICBpZiAoc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfS0hSX1dBWUxBTkRfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkgPT0gMCkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT53c2lfd2F5bGFuZF9zdXJmYWNlX2VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICAgICAgaWYgKHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkgPT0gMCkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT53c2lfeGNiX3N1cmZhY2VfZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgICAgICBpZiAoc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfS0hSX1hMSUJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkgPT0gMCkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT53c2lfeGxpYl9zdXJmYWNlX2VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgICAgIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19LSFJfQU5EUk9JRF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPndzaV9hbmRyb2lkX3N1cmZhY2VfZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgICAgIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19NVktfTUFDT1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkgPT0gMCkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT53c2lfbWFjb3Nfc3VyZmFjZV9lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgICAgICBpZiAoc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfTVZLX0lPU19TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPndzaV9pb3Nfc3VyZmFjZV9lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisgICAgICAgIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19FWFRfSEVBRExFU1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkgPT0gMCkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT53c2lfaGVhZGxlc3Nfc3VyZmFjZV9lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKQorICAgICAgICBpZiAoc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwgVktfRVhUX01FVEFMX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpID09IDApIHsKKyAgICAgICAgICAgIHB0cl9pbnN0YW5jZS0+d3NpX21ldGFsX3N1cmZhY2VfZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19LSFJfRElTUExBWV9FWFRFTlNJT05fTkFNRSkgPT0gMCkgeworICAgICAgICAgICAgcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19LSFJfR0VUX0RJU1BMQVlfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBwdHJfaW5zdGFuY2UtPndzaV9kaXNwbGF5X3Byb3BzMl9lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorfQorCisvLyBMaW51eCBXU0kgc3VyZmFjZSBleHRlbnNpb25zIGFyZSBub3QgYWx3YXlzIGNvbXBpbGVkIGludG8gdGhlIGxvYWRlci4gKEFzc3VtZQorLy8gZm9yIFdpbmRvd3MgdGhlIEtIUl93aW4zMl9zdXJmYWNlIGlzIGFsd2F5cyBjb21waWxlZCBpbnRvIGxvYWRlcikuIEEgZ2l2ZW4KKy8vIExpbnV4IGJ1aWxkIGVudmlyb25tZW50IG1pZ2h0IG5vdCBoYXZlIHRoZSBoZWFkZXJzIHJlcXVpcmVkIGZvciBidWlsZGluZyBvbmUKKy8vIG9mIHRoZSB0aHJlZSBleHRlbnNpb25zICAoWGxpYiwgWGNiLCBXYXlsYW5kKS4gIFRodXMsIG5lZWQgdG8gY2hlY2sgaWYKKy8vIHRoZSBidWlsdCBsb2FkZXIgYWN0dWFsbHkgc3VwcG9ydHMgdGhlIHBhcnRpY3VsYXIgTGludXggc3VyZmFjZSBleHRlbnNpb24uCisvLyBJZiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBidWlsdCBsb2FkZXIgaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YKKy8vIGVudW1lcmF0ZWQgaW5zdGFuY2UgZXh0ZW5zaW9ucy4gIFRoaXMgc29sdmVzIHRoZSBpc3N1ZSB3aGVyZSBhbiBJQ0Qgb3IgbGF5ZXIKKy8vIGFkdmVydGlzZXMgc3VwcG9ydCBmb3IgYSBnaXZlbiBMaW51eCBzdXJmYWNlIGV4dGVuc2lvbiBidXQgdGhlIGxvYWRlciB3YXMgbm90CisvLyBidWlsdCB0byBzdXBwb3J0IHRoZSBleHRlbnNpb24uCitib29sIHdzaV91bnN1cHBvcnRlZF9pbnN0YW5jZV9leHRlbnNpb24oY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpleHRfcHJvcCkgeworI2lmbmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICBpZiAoIXN0cmNtcChleHRfcHJvcC0+ZXh0ZW5zaW9uTmFtZSwgIlZLX0tIUl93YXlsYW5kX3N1cmZhY2UiKSkgcmV0dXJuIHRydWU7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmbmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIGlmICghc3RyY21wKGV4dF9wcm9wLT5leHRlbnNpb25OYW1lLCAiVktfS0hSX3hjYl9zdXJmYWNlIikpIHJldHVybiB0cnVlOworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmbmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBpZiAoIXN0cmNtcChleHRfcHJvcC0+ZXh0ZW5zaW9uTmFtZSwgIlZLX0tIUl94bGliX3N1cmZhY2UiKSkgcmV0dXJuIHRydWU7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19LSFJfc3VyZmFjZSBleHRlbnNpb246CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgRGVzdHJveVN1cmZhY2VLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKGluc3RhbmNlKTsKKyAgICBkaXNwLT5EZXN0cm95U3VyZmFjZUtIUihpbnN0YW5jZSwgc3VyZmFjZSwgcEFsbG9jYXRvcik7Cit9CisKKy8vIFRPRE8gcHJvYmFibHkgbmVlZCB0byBsb2NrIGFyb3VuZCBhbGwgdGhlIGxvYWRlcl9nZXRfaW5zdGFuY2UoKSBjYWxscy4KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IgRGVzdHJveVN1cmZhY2VLSFIKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfRGVzdHJveVN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworCisgICAgVmtJY2RTdXJmYWNlICppY2Rfc3VyZmFjZSA9IChWa0ljZFN1cmZhY2UgKikodWludHB0cl90KXN1cmZhY2U7CisgICAgaWYgKE5VTEwgIT0gaWNkX3N1cmZhY2UpIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzKSB7CisgICAgICAgICAgICB1aW50MzJfdCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwdHJfaW5zdGFuY2UtPmljZF90ZXJtczsgaWNkX3Rlcm0gIT0gTlVMTDsgaWNkX3Rlcm0gPSBpY2RfdGVybS0+bmV4dCwgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGljZF90ZXJtLT5zY2FubmVkX2ljZC0+aW50ZXJmYWNlX3ZlcnNpb24gPj0gSUNEX1ZFUl9TVVBQT1JUU19JQ0RfU1VSRkFDRV9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkRlc3Ryb3lTdXJmYWNlS0hSICYmIChWa1N1cmZhY2VLSFIpTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUihpY2RfdGVybS0+aW5zdGFuY2UsIGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSwgcEFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaV0gPSAoVmtTdXJmYWNlS0hSKU5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhbF9pY2Rfc3VyZmFjZSBmb3IgYW55IElDRCBub3Qgc3VwcG9ydGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVyIGludGVyZmFjZSB2ZXJzaW9uIHNob3VsZCBiZSBOVUxMLiAgSWYgbm90LCB0aGVuCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcm9ibGVtLgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoKFZrU3VyZmFjZUtIUilOVUxMID09IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyk7CisgICAgICAgIH0KKworICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKHB0cl9pbnN0YW5jZSwgKHZvaWQgKikodWludHB0cl90KXN1cmZhY2UpOworICAgIH0KK30KKworLy8gVGhpcyBpcyB0aGUgdHJhbXBvbGluZSBlbnRyeXBvaW50IGZvciBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Jvb2wzMiAqcFN1cHBvcnRlZCkgeworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIFZrUmVzdWx0IHJlcyA9IGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBxdWV1ZUZhbWlseUluZGV4LCBzdXJmYWNlLCBwU3VwcG9ydGVkKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBUaGlzIGlzIHRoZSBpbnN0YW5jZSBjaGFpbiB0ZXJtaW5hdG9yIGZ1bmN0aW9uIGZvcgorLy8gR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCb29sMzIgKnBTdXBwb3J0ZWQpIHsKKyAgICAvLyBGaXJzdCwgY2hlY2sgdG8gZW5zdXJlIHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gd2FzIGVuYWJsZWQ6CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisgICAgaWYgKCFwdHJfaW5zdGFuY2UtPndzaV9zdXJmYWNlX2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19LSFJfc3VyZmFjZSBleHRlbnNpb24gbm90IGVuYWJsZWQuICB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChOVUxMID09IHBTdXBwb3J0ZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJOVUxMIHBvaW50ZXIgcGFzc2VkIGludG8gdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIGZvciBwU3VwcG9ydGVkIVxuIik7CisgICAgICAgIGFzc2VydChmYWxzZSAmJiAiR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjogRXJyb3IsIG51bGwgcFN1cHBvcnRlZCIpOworICAgIH0KKyAgICAqcFN1cHBvcnRlZCA9IGZhbHNlOworCisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgZm9yIHNlbGVjdGVkIHBoeXNpY2FsIGRldmljZSBpcyBub3QgZXhwb3J0aW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiFcbiIpOworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgImxvYWRlcjogbnVsbCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIElDRCBwb2ludGVyIik7CisgICAgfQorCisgICAgVmtJY2RTdXJmYWNlICppY2Rfc3VyZmFjZSA9IChWa0ljZFN1cmZhY2UgKikodWludHB0cl90KXN1cmZhY2U7CisgICAgaWYgKE5VTEwgIT0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzICYmIChWa1N1cmZhY2VLSFIpTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbcGh5c19kZXZfdGVybS0+aWNkX2luZGV4XSkgeworICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIoCisgICAgICAgICAgICBwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcXVldWVGYW1pbHlJbmRleCwgaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW3BoeXNfZGV2X3Rlcm0tPmljZF9pbmRleF0sIHBTdXBwb3J0ZWQpOworICAgIH0KKworICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcXVldWVGYW1pbHlJbmRleCwgc3VyZmFjZSwgcFN1cHBvcnRlZCk7Cit9CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICpwU3VyZmFjZUNhcGFiaWxpdGllcykgeworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIFZrUmVzdWx0IHJlcyA9IGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUih1bndyYXBwZWRfcGh5c19kZXYsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBUaGlzIGlzIHRoZSBpbnN0YW5jZSBjaGFpbiB0ZXJtaW5hdG9yIGZ1bmN0aW9uIGZvcgorLy8gR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgKnBTdXJmYWNlQ2FwYWJpbGl0aWVzKSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWljZF90ZXJtLT50aGlzX2luc3RhbmNlOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfc3VyZmFjZV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfS0hSX3N1cmZhY2UgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChOVUxMID09IHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiTlVMTCBwb2ludGVyIHBhc3NlZCBpbnRvIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIGZvciBwU3VyZmFjZUNhcGFiaWxpdGllcyFcbiIpOworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgIkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUjogRXJyb3IsIG51bGwgcFN1cmZhY2VDYXBhYmlsaXRpZXMiKTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiSUNEIGZvciBzZWxlY3RlZCBwaHlzaWNhbCBkZXZpY2UgaXMgbm90IGV4cG9ydGluZyB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiFcbiIpOworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgImxvYWRlcjogbnVsbCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgSUNEIHBvaW50ZXIiKTsKKyAgICB9CisKKyAgICBWa0ljZFN1cmZhY2UgKmljZF9zdXJmYWNlID0gKFZrSWNkU3VyZmFjZSAqKSh1aW50cHRyX3Qpc3VyZmFjZTsKKyAgICBpZiAoTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMgJiYgKFZrU3VyZmFjZUtIUilOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1twaHlzX2Rldl90ZXJtLT5pY2RfaW5kZXhdKSB7CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgICAgICAgICAgcGh5c19kZXZfdGVybS0+cGh5c19kZXYsIGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1twaHlzX2Rldl90ZXJtLT5pY2RfaW5kZXhdLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisgICAgfQorCisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKK30KKworLy8gVGhpcyBpcyB0aGUgdHJhbXBvbGluZSBlbnRyeXBvaW50IGZvciBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VGb3JtYXRLSFIgKnBTdXJmYWNlRm9ybWF0cykgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIFZrUmVzdWx0IHJlcyA9IGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBzdXJmYWNlLCBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGluc3RhbmNlIGNoYWluIHRlcm1pbmF0b3IgZnVuY3Rpb24gZm9yCisvLyBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlRm9ybWF0S0hSICpwU3VyZmFjZUZvcm1hdHMpIHsKKyAgICAvLyBGaXJzdCwgY2hlY2sgdG8gZW5zdXJlIHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gd2FzIGVuYWJsZWQ6CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisgICAgaWYgKCFwdHJfaW5zdGFuY2UtPndzaV9zdXJmYWNlX2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19LSFJfc3VyZmFjZSBleHRlbnNpb24gbm90IGVuYWJsZWQuICB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChOVUxMID09IHBTdXJmYWNlRm9ybWF0Q291bnQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJOVUxMIHBvaW50ZXIgcGFzc2VkIGludG8gdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIGZvciBwU3VyZmFjZUZvcm1hdENvdW50IVxuIik7CisgICAgICAgIGFzc2VydChmYWxzZSAmJiAiR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUig6IEVycm9yLCBudWxsIHBTdXJmYWNlRm9ybWF0Q291bnQiKTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUikgeworICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIklDRCBmb3Igc2VsZWN0ZWQgcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBleHBvcnRpbmcgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIhXG4iKTsKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJsb2FkZXI6IG51bGwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiBJQ0QgcG9pbnRlciIpOworICAgIH0KKworICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHVpbnRwdHJfdClzdXJmYWNlOworICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyAmJiAoVmtTdXJmYWNlS0hSKU5VTEwgIT0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW3BoeXNfZGV2X3Rlcm0tPmljZF9pbmRleF0pIHsKKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW3BoeXNfZGV2X3Rlcm0tPmljZF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMpOworICAgIH0KKworICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihwaHlzX2Rldl90ZXJtLT5waHlzX2Rldiwgc3VyZmFjZSwgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKTsKK30KKworLy8gVGhpcyBpcyB0aGUgdHJhbXBvbGluZSBlbnRyeXBvaW50IGZvciBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJlc2VudE1vZGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUHJlc2VudE1vZGVLSFIgKnBQcmVzZW50TW9kZXMpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBWa1Jlc3VsdCByZXMgPSBkaXNwLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBzdXJmYWNlLCBwUHJlc2VudE1vZGVDb3VudCwgcFByZXNlbnRNb2Rlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IKKy8vIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90ICpwUHJlc2VudE1vZGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1ByZXNlbnRNb2RlS0hSICpwUHJlc2VudE1vZGVzKSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWljZF90ZXJtLT50aGlzX2luc3RhbmNlOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfc3VyZmFjZV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfS0hSX3N1cmZhY2UgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChOVUxMID09IHBQcmVzZW50TW9kZUNvdW50KSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiTlVMTCBwb2ludGVyIHBhc3NlZCBpbnRvIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSIGZvciBwUHJlc2VudE1vZGVDb3VudCFcbiIpOworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgIkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUig6IEVycm9yLCBudWxsIHBQcmVzZW50TW9kZUNvdW50Iik7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUikgeworICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIklDRCBmb3Igc2VsZWN0ZWQgcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBleHBvcnRpbmcgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIhXG4iKTsKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJsb2FkZXI6IG51bGwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSIElDRCBwb2ludGVyIik7CisgICAgfQorCisgICAgVmtJY2RTdXJmYWNlICppY2Rfc3VyZmFjZSA9IChWa0ljZFN1cmZhY2UgKikodWludHB0cl90KXN1cmZhY2U7CisgICAgaWYgKE5VTEwgIT0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzICYmIChWa1N1cmZhY2VLSFIpTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbcGh5c19kZXZfdGVybS0+aWNkX2luZGV4XSkgeworICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICAgICAgICAgIHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbcGh5c19kZXZfdGVybS0+aWNkX2luZGV4XSwgcFByZXNlbnRNb2RlQ291bnQsIHBQcmVzZW50TW9kZXMpOworICAgIH0KKworICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBzdXJmYWNlLCBwUHJlc2VudE1vZGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKTsKK30KKworLy8gRnVuY3Rpb25zIGZvciB0aGUgVktfS0hSX3N3YXBjaGFpbiBleHRlbnNpb246CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgQ3JlYXRlU3dhcGNoYWluS0hSCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N3YXBjaGFpbktIUiAqcFN3YXBjaGFpbikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkNyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlU3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSICpwU3dhcGNoYWluKSB7CisgICAgdWludDMyX3QgaWNkX2luZGV4ID0gMDsKKyAgICBzdHJ1Y3QgbG9hZGVyX2RldmljZSAqZGV2OworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gbG9hZGVyX2dldF9pY2RfYW5kX2RldmljZShkZXZpY2UsICZkZXYsICZpY2RfaW5kZXgpOworICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZVN3YXBjaGFpbktIUikgeworICAgICAgICBWa0ljZFN1cmZhY2UgKmljZF9zdXJmYWNlID0gKFZrSWNkU3VyZmFjZSAqKSh1aW50cHRyX3QpcENyZWF0ZUluZm8tPnN1cmZhY2U7CisgICAgICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcykgeworICAgICAgICAgICAgaWYgKChWa1N1cmZhY2VLSFIpTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBJQ0QsIGFuZCB0aGVyZSBpcyBhbiBJQ0QgS0hSIHN1cmZhY2UKKyAgICAgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQsIHNvIGNvcHkgdGhlIENyZWF0ZUluZm8gc3RydWN0CisgICAgICAgICAgICAgICAgLy8gYW5kIHBvaW50IGl0IGF0IHRoZSBJQ0QncyBzdXJmYWNlLgorICAgICAgICAgICAgICAgIFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUNvcHkgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUikpOworICAgICAgICAgICAgICAgIGlmIChOVUxMID09IHBDcmVhdGVDb3B5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweShwQ3JlYXRlQ29weSwgcENyZWF0ZUluZm8sIHNpemVvZihWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIpKTsKKyAgICAgICAgICAgICAgICBwQ3JlYXRlQ29weS0+c3VyZmFjZSA9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdOworICAgICAgICAgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlU3dhcGNoYWluS0hSKGRldmljZSwgcENyZWF0ZUNvcHksIHBBbGxvY2F0b3IsIHBTd2FwY2hhaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlU3dhcGNoYWluS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTd2FwY2hhaW4pOworICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworLy8gVGhpcyBpcyB0aGUgdHJhbXBvbGluZSBlbnRyeXBvaW50IGZvciBEZXN0cm95U3dhcGNoYWluS0hSCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgZGlzcC0+RGVzdHJveVN3YXBjaGFpbktIUihkZXZpY2UsIHN3YXBjaGFpbiwgcEFsbG9jYXRvcik7Cit9CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgR2V0U3dhcGNoYWluSW1hZ2VzS0hSCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU3dhcGNoYWluSW1hZ2VDb3VudCwgVmtJbWFnZSAqcFN3YXBjaGFpbkltYWdlcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldFN3YXBjaGFpbkltYWdlc0tIUihkZXZpY2UsIHN3YXBjaGFpbiwgcFN3YXBjaGFpbkltYWdlQ291bnQsIHBTd2FwY2hhaW5JbWFnZXMpOworfQorCisvLyBUaGlzIGlzIHRoZSB0cmFtcG9saW5lIGVudHJ5cG9pbnQgZm9yIEFjcXVpcmVOZXh0SW1hZ2VLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWNxdWlyZU5leHRJbWFnZUtIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDY0X3QgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIFZrRmVuY2UgZmVuY2UsIHVpbnQzMl90ICpwSW1hZ2VJbmRleCkgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkFjcXVpcmVOZXh0SW1hZ2VLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHRpbWVvdXQsIHNlbWFwaG9yZSwgZmVuY2UsIHBJbWFnZUluZGV4KTsKK30KKworLy8gVGhpcyBpcyB0aGUgdHJhbXBvbGluZSBlbnRyeXBvaW50IGZvciBRdWV1ZVByZXNlbnRLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVQcmVzZW50S0hSKFZrUXVldWUgcXVldWUsIGNvbnN0IFZrUHJlc2VudEluZm9LSFIgKnBQcmVzZW50SW5mbykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKHF1ZXVlKTsKKyAgICByZXR1cm4gZGlzcC0+UXVldWVQcmVzZW50S0hSKHF1ZXVlLCBwUHJlc2VudEluZm8pOworfQorCitzdGF0aWMgVmtJY2RTdXJmYWNlICpBbGxvY2F0ZUljZFN1cmZhY2VTdHJ1Y3Qoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqaW5zdGFuY2UsIHNpemVfdCBiYXNlX3NpemUsIHNpemVfdCBwbGF0Zm9ybV9zaXplKSB7CisgICAgLy8gTmV4dCwgaWYgc28sIHByb2NlZWQgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbjoKKyAgICBWa0ljZFN1cmZhY2UgKnBJY2RTdXJmYWNlID0gbG9hZGVyX2luc3RhbmNlX2hlYXBfYWxsb2MoaW5zdGFuY2UsIHNpemVvZihWa0ljZFN1cmZhY2UpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmIChwSWNkU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFNldHVwIHRoZSBuZXcgc2l6ZXMgYW5kIG9mZnNldHMgc28gd2UgY2FuIGdyb3cgdGhlIHN0cnVjdHVyZXMgaW4gdGhlCisgICAgICAgIC8vIGZ1dHVyZSB3aXRob3V0IGhhdmluZyBwcm9ibGVtcworICAgICAgICBwSWNkU3VyZmFjZS0+YmFzZV9zaXplID0gKHVpbnQzMl90KWJhc2Vfc2l6ZTsKKyAgICAgICAgcEljZFN1cmZhY2UtPnBsYXRmb3JtX3NpemUgPSAodWludDMyX3QpcGxhdGZvcm1fc2l6ZTsKKyAgICAgICAgcEljZFN1cmZhY2UtPm5vbl9wbGF0Zm9ybV9vZmZzZXQgPSAodWludDMyX3QpKCh1aW50OF90ICopKCZwSWNkU3VyZmFjZS0+YmFzZV9zaXplKSAtICh1aW50OF90ICopcEljZFN1cmZhY2UpOworICAgICAgICBwSWNkU3VyZmFjZS0+ZW50aXJlX3NpemUgPSBzaXplb2YoVmtJY2RTdXJmYWNlKTsKKworICAgICAgICBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMgPSBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhpbnN0YW5jZSwgc2l6ZW9mKFZrU3VyZmFjZUtIUikgKiBpbnN0YW5jZS0+dG90YWxfaWNkX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgICAgICBpZiAocEljZFN1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdGFuY2UsIHBJY2RTdXJmYWNlKTsKKyAgICAgICAgICAgIHBJY2RTdXJmYWNlID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldChwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMsIDAsIHNpemVvZihWa1N1cmZhY2VLSFIpICogaW5zdGFuY2UtPnRvdGFsX2ljZF9jb3VudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBJY2RTdXJmYWNlOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19LSFJfd2luMzJfc3VyZmFjZSBleHRlbnNpb246CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgQ3JlYXRlV2luMzJTdXJmYWNlS0hSCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKGluc3RhbmNlKTsKKyAgICBWa1Jlc3VsdCByZXM7CisKKyAgICByZXMgPSBkaXNwLT5DcmVhdGVXaW4zMlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IgQ3JlYXRlV2luMzJTdXJmYWNlS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVXaW4zMlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBWa1Jlc3VsdCB2a1JlcyA9IFZLX1NVQ0NFU1M7CisgICAgVmtJY2RTdXJmYWNlICpwSWNkU3VyZmFjZSA9IE5VTEw7CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICAvLyBJbml0aWFsaXplIHBTdXJmYWNlIHRvIE5VTEwganVzdCB0byBiZSBzYWZlLgorICAgICpwU3VyZmFjZSA9IFZLX05VTExfSEFORExFOworICAgIC8vIEZpcnN0LCBjaGVjayB0byBlbnN1cmUgdGhlIGFwcHJvcHJpYXRlIGV4dGVuc2lvbiB3YXMgZW5hYmxlZDoKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSBsb2FkZXJfZ2V0X2luc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAoIXB0cl9pbnN0YW5jZS0+d3NpX3dpbjMyX3N1cmZhY2VfZW5hYmxlZCkgeworICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIlZLX0tIUl93aW4zMl9zdXJmYWNlIGV4dGVuc2lvbiBub3QgZW5hYmxlZC4gIHZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIG5vdCBleGVjdXRlZCFcbiIpOworICAgICAgICB2a1JlcyA9IFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLy8gTmV4dCwgaWYgc28sIHByb2NlZWQgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbjoKKyAgICBwSWNkU3VyZmFjZSA9IEFsbG9jYXRlSWNkU3VyZmFjZVN0cnVjdChwdHJfaW5zdGFuY2UsIHNpemVvZihwSWNkU3VyZmFjZS0+d2luX3N1cmYuYmFzZSksIHNpemVvZihwSWNkU3VyZmFjZS0+d2luX3N1cmYpKTsKKyAgICBpZiAocEljZFN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICB2a1JlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcEljZFN1cmZhY2UtPndpbl9zdXJmLmJhc2UucGxhdGZvcm0gPSBWS19JQ0RfV1NJX1BMQVRGT1JNX1dJTjMyOworICAgIHBJY2RTdXJmYWNlLT53aW5fc3VyZi5oaW5zdGFuY2UgPSBwQ3JlYXRlSW5mby0+aGluc3RhbmNlOworICAgIHBJY2RTdXJmYWNlLT53aW5fc3VyZi5od25kID0gcENyZWF0ZUluZm8tPmh3bmQ7CisKKyAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBJQ0QgYW5kIGRldGVybWluZSBpZiB0aGV5IG5lZWQgdG8gY3JlYXRlIGEgc3VyZmFjZQorICAgIGZvciAoc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwdHJfaW5zdGFuY2UtPmljZF90ZXJtczsgaWNkX3Rlcm0gIT0gTlVMTDsgaWNkX3Rlcm0gPSBpY2RfdGVybS0+bmV4dCwgaSsrKSB7CisgICAgICAgIGlmIChpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmludGVyZmFjZV92ZXJzaW9uID49IElDRF9WRVJfU1VQUE9SVFNfSUNEX1NVUkZBQ0VfS0hSKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlV2luMzJTdXJmYWNlS0hSKSB7CisgICAgICAgICAgICAgICAgdmtSZXMgPSBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlV2luMzJTdXJmYWNlS0hSKGljZF90ZXJtLT5pbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaV0pOworICAgICAgICAgICAgICAgIGlmIChWS19TVUNDRVNTICE9IHZrUmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpKHBJY2RTdXJmYWNlKTsKKworb3V0OgorCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdmtSZXMgJiYgTlVMTCAhPSBwSWNkU3VyZmFjZSkgeworICAgICAgICBpZiAoTlVMTCAhPSBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0LCBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKFZrU3VyZmFjZUtIUilOVUxMICE9IHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSAmJiBOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUikgeworICAgICAgICAgICAgICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guRGVzdHJveVN1cmZhY2VLSFIoaWNkX3Rlcm0tPmluc3RhbmNlLCBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaV0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwSWNkU3VyZmFjZSk7CisgICAgfQorCisgICAgcmV0dXJuIHZrUmVzOworfQorCisvLyBUaGlzIGlzIHRoZSB0cmFtcG9saW5lIGVudHJ5cG9pbnQgZm9yCisvLyBHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUgorTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4KSB7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgVmtCb29sMzIgcmVzID0gZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBxdWV1ZUZhbWlseUluZGV4KTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBUaGlzIGlzIHRoZSBpbnN0YW5jZSBjaGFpbiB0ZXJtaW5hdG9yIGZ1bmN0aW9uIGZvcgorLy8gR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIKK1ZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4KSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWljZF90ZXJtLT50aGlzX2luc3RhbmNlOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfd2luMzJfc3VyZmFjZV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfS0hSX3dpbjMyX3N1cmZhY2UgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiSUNEIGZvciBzZWxlY3RlZCBwaHlzaWNhbCBkZXZpY2UgaXMgbm90IGV4cG9ydGluZyB2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIVxuIik7CisgICAgICAgIGFzc2VydChmYWxzZSAmJiAibG9hZGVyOiBudWxsIEdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIElDRCBwb2ludGVyIik7CisgICAgfQorCisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcXVldWVGYW1pbHlJbmRleCk7Cit9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCisvLyBUaGlzIGlzIHRoZSB0cmFtcG9saW5lIGVudHJ5cG9pbnQgZm9yIENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChpbnN0YW5jZSk7CisgICAgVmtSZXN1bHQgcmVzOworCisgICAgcmVzID0gZGlzcC0+Q3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IgQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBWa1Jlc3VsdCB2a1JlcyA9IFZLX1NVQ0NFU1M7CisgICAgVmtJY2RTdXJmYWNlICpwSWNkU3VyZmFjZSA9IE5VTEw7CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICAvLyBGaXJzdCwgY2hlY2sgdG8gZW5zdXJlIHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gd2FzIGVuYWJsZWQ6CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKCFwdHJfaW5zdGFuY2UtPndzaV93YXlsYW5kX3N1cmZhY2VfZW5hYmxlZCkgeworICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIlZLX0tIUl93YXlsYW5kX3N1cmZhY2UgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgdmtSZXMgPSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIE5leHQsIGlmIHNvLCBwcm9jZWVkIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb246CisgICAgcEljZFN1cmZhY2UgPSBBbGxvY2F0ZUljZFN1cmZhY2VTdHJ1Y3QocHRyX2luc3RhbmNlLCBzaXplb2YocEljZFN1cmZhY2UtPndheWxhbmRfc3VyZi5iYXNlKSwgc2l6ZW9mKHBJY2RTdXJmYWNlLT53YXlsYW5kX3N1cmYpKTsKKyAgICBpZiAocEljZFN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICB2a1JlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcEljZFN1cmZhY2UtPndheWxhbmRfc3VyZi5iYXNlLnBsYXRmb3JtID0gVktfSUNEX1dTSV9QTEFURk9STV9XQVlMQU5EOworICAgIHBJY2RTdXJmYWNlLT53YXlsYW5kX3N1cmYuZGlzcGxheSA9IHBDcmVhdGVJbmZvLT5kaXNwbGF5OworICAgIHBJY2RTdXJmYWNlLT53YXlsYW5kX3N1cmYuc3VyZmFjZSA9IHBDcmVhdGVJbmZvLT5zdXJmYWNlOworCisgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggSUNEIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBuZWVkIHRvIGNyZWF0ZSBhIHN1cmZhY2UKKyAgICBmb3IgKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcHRyX2luc3RhbmNlLT5pY2RfdGVybXM7IGljZF90ZXJtICE9IE5VTEw7IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQsIGkrKykgeworICAgICAgICBpZiAoaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5pbnRlcmZhY2VfdmVyc2lvbiA+PSBJQ0RfVkVSX1NVUFBPUlRTX0lDRF9TVVJGQUNFX0tIUikgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKSB7CisgICAgICAgICAgICAgICAgdmtSZXMgPSBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoaWNkX3Rlcm0tPmluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEljZFN1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSB2a1JlcykgeworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcFN1cmZhY2UgPSAoVmtTdXJmYWNlS0hSKXBJY2RTdXJmYWNlOworCitvdXQ6CisKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSB2a1JlcyAmJiBOVUxMICE9IHBJY2RTdXJmYWNlKSB7CisgICAgICAgIGlmIChOVUxMICE9IHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcykgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBmb3IgKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcHRyX2luc3RhbmNlLT5pY2RfdGVybXM7IGljZF90ZXJtICE9IE5VTEw7IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQsIGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoVmtTdXJmYWNlS0hSKU5VTEwgIT0gcEljZFN1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ldICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkRlc3Ryb3lTdXJmYWNlS0hSKSB7CisgICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUihpY2RfdGVybS0+aW5zdGFuY2UsIHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSwgcEFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIHBJY2RTdXJmYWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmtSZXM7Cit9CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IKKy8vIEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdsX2Rpc3BsYXkgKmRpc3BsYXkpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBWa0Jvb2wzMiByZXMgPSBkaXNwLT5HZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKHVud3JhcHBlZF9waHlzX2RldiwgcXVldWVGYW1pbHlJbmRleCwgZGlzcGxheSk7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IKKy8vIEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIKK1ZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdsX2Rpc3BsYXkgKmRpc3BsYXkpIHsKKyAgICAvLyBGaXJzdCwgY2hlY2sgdG8gZW5zdXJlIHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gd2FzIGVuYWJsZWQ6CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisgICAgaWYgKCFwdHJfaW5zdGFuY2UtPndzaV93YXlsYW5kX3N1cmZhY2VfZW5hYmxlZCkgeworICAgICAgICBsb2FkZXJfbG9nKAorICAgICAgICAgICAgcHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICJWS19LSFJfd2F5bGFuZF9zdXJmYWNlIGV4dGVuc2lvbiBub3QgZW5hYmxlZC4gIHZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgZm9yIHNlbGVjdGVkIHBoeXNpY2FsIGRldmljZSBpcyBub3QgZXhwb3J0aW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiFcbiIpOworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgImxvYWRlcjogbnVsbCBHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIElDRCBwb2ludGVyIik7CisgICAgfQorCisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBxdWV1ZUZhbWlseUluZGV4LCBkaXNwbGF5KTsKK30KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCisvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19LSFJfeGNiX3N1cmZhY2UgZXh0ZW5zaW9uOgorCisvLyBUaGlzIGlzIHRoZSB0cmFtcG9saW5lIGVudHJ5cG9pbnQgZm9yIENyZWF0ZVhjYlN1cmZhY2VLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlWGNiU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChpbnN0YW5jZSk7CisgICAgVmtSZXN1bHQgcmVzOworCisgICAgcmVzID0gZGlzcC0+Q3JlYXRlWGNiU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBUaGlzIGlzIHRoZSBpbnN0YW5jZSBjaGFpbiB0ZXJtaW5hdG9yIGZ1bmN0aW9uIGZvciBDcmVhdGVYY2JTdXJmYWNlS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVYY2JTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBWa1Jlc3VsdCB2a1JlcyA9IFZLX1NVQ0NFU1M7CisgICAgVmtJY2RTdXJmYWNlICpwSWNkU3VyZmFjZSA9IE5VTEw7CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICAvLyBGaXJzdCwgY2hlY2sgdG8gZW5zdXJlIHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gd2FzIGVuYWJsZWQ6CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKCFwdHJfaW5zdGFuY2UtPndzaV94Y2Jfc3VyZmFjZV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfS0hSX3hjYl9zdXJmYWNlIGV4dGVuc2lvbiBub3QgZW5hYmxlZC4gIHZrQ3JlYXRlWGNiU3VyZmFjZUtIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgdmtSZXMgPSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIE5leHQsIGlmIHNvLCBwcm9jZWVkIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb246CisgICAgcEljZFN1cmZhY2UgPSBBbGxvY2F0ZUljZFN1cmZhY2VTdHJ1Y3QocHRyX2luc3RhbmNlLCBzaXplb2YocEljZFN1cmZhY2UtPnhjYl9zdXJmLmJhc2UpLCBzaXplb2YocEljZFN1cmZhY2UtPnhjYl9zdXJmKSk7CisgICAgaWYgKHBJY2RTdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgdmtSZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHBJY2RTdXJmYWNlLT54Y2Jfc3VyZi5iYXNlLnBsYXRmb3JtID0gVktfSUNEX1dTSV9QTEFURk9STV9YQ0I7CisgICAgcEljZFN1cmZhY2UtPnhjYl9zdXJmLmNvbm5lY3Rpb24gPSBwQ3JlYXRlSW5mby0+Y29ubmVjdGlvbjsKKyAgICBwSWNkU3VyZmFjZS0+eGNiX3N1cmYud2luZG93ID0gcENyZWF0ZUluZm8tPndpbmRvdzsKKworICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIElDRCBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgbmVlZCB0byBjcmVhdGUgYSBzdXJmYWNlCisgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0LCBpKyspIHsKKyAgICAgICAgaWYgKGljZF90ZXJtLT5zY2FubmVkX2ljZC0+aW50ZXJmYWNlX3ZlcnNpb24gPj0gSUNEX1ZFUl9TVVBQT1JUU19JQ0RfU1VSRkFDRV9LSFIpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVYY2JTdXJmYWNlS0hSKSB7CisgICAgICAgICAgICAgICAgdmtSZXMgPSBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlWGNiU3VyZmFjZUtIUihpY2RfdGVybS0+aW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdmtSZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnBTdXJmYWNlID0gKFZrU3VyZmFjZUtIUilwSWNkU3VyZmFjZTsKKworb3V0OgorCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdmtSZXMgJiYgTlVMTCAhPSBwSWNkU3VyZmFjZSkgeworICAgICAgICBpZiAoTlVMTCAhPSBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0LCBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKFZrU3VyZmFjZUtIUilOVUxMICE9IHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSAmJiBOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUikgeworICAgICAgICAgICAgICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guRGVzdHJveVN1cmZhY2VLSFIoaWNkX3Rlcm0tPmluc3RhbmNlLCBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaV0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwSWNkU3VyZmFjZSk7CisgICAgfQorCisgICAgcmV0dXJuIHZrUmVzOworfQorCisvLyBUaGlzIGlzIHRoZSB0cmFtcG9saW5lIGVudHJ5cG9pbnQgZm9yCisvLyBHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZCkgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIFZrQm9vbDMyIHJlcyA9IGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUih1bndyYXBwZWRfcGh5c19kZXYsIHF1ZXVlRmFtaWx5SW5kZXgsIGNvbm5lY3Rpb24sIHZpc3VhbF9pZCk7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IKKy8vIEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUgorVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZCkgeworICAgIC8vIEZpcnN0LCBjaGVjayB0byBlbnN1cmUgdGhlIGFwcHJvcHJpYXRlIGV4dGVuc2lvbiB3YXMgZW5hYmxlZDoKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlID0gKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpY2RfdGVybS0+dGhpc19pbnN0YW5jZTsKKyAgICBpZiAoIXB0cl9pbnN0YW5jZS0+d3NpX3hjYl9zdXJmYWNlX2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19LSFJfeGNiX3N1cmZhY2UgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgZm9yIHNlbGVjdGVkIHBoeXNpY2FsIGRldmljZSBpcyBub3QgZXhwb3J0aW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIVxuIik7CisgICAgICAgIGFzc2VydChmYWxzZSAmJiAibG9hZGVyOiBudWxsIEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBJQ0QgcG9pbnRlciIpOworICAgIH0KKworICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBxdWV1ZUZhbWlseUluZGV4LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbF9pZCk7Cit9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworLy8gRnVuY3Rpb25zIGZvciB0aGUgVktfS0hSX3hsaWJfc3VyZmFjZSBleHRlbnNpb246CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgQ3JlYXRlWGxpYlN1cmZhY2VLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKGluc3RhbmNlKTsKKyAgICBWa1Jlc3VsdCByZXM7CisKKyAgICByZXMgPSBkaXNwLT5DcmVhdGVYbGliU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBUaGlzIGlzIHRoZSBpbnN0YW5jZSBjaGFpbiB0ZXJtaW5hdG9yIGZ1bmN0aW9uIGZvciBDcmVhdGVYbGliU3VyZmFjZUtIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlWGxpYlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKSB7CisgICAgVmtSZXN1bHQgdmtSZXMgPSBWS19TVUNDRVNTOworICAgIFZrSWNkU3VyZmFjZSAqcEljZFN1cmZhY2UgPSBOVUxMOworICAgIHVpbnQzMl90IGkgPSAwOworCisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfeGxpYl9zdXJmYWNlX2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19LSFJfeGxpYl9zdXJmYWNlIGV4dGVuc2lvbiBub3QgZW5hYmxlZC4gIHZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHZrUmVzID0gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBOZXh0LCBpZiBzbywgcHJvY2VlZCB3aXRoIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uOgorICAgIHBJY2RTdXJmYWNlID0gQWxsb2NhdGVJY2RTdXJmYWNlU3RydWN0KHB0cl9pbnN0YW5jZSwgc2l6ZW9mKHBJY2RTdXJmYWNlLT54bGliX3N1cmYuYmFzZSksIHNpemVvZihwSWNkU3VyZmFjZS0+eGxpYl9zdXJmKSk7CisgICAgaWYgKHBJY2RTdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgdmtSZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHBJY2RTdXJmYWNlLT54bGliX3N1cmYuYmFzZS5wbGF0Zm9ybSA9IFZLX0lDRF9XU0lfUExBVEZPUk1fWExJQjsKKyAgICBwSWNkU3VyZmFjZS0+eGxpYl9zdXJmLmRweSA9IHBDcmVhdGVJbmZvLT5kcHk7CisgICAgcEljZFN1cmZhY2UtPnhsaWJfc3VyZi53aW5kb3cgPSBwQ3JlYXRlSW5mby0+d2luZG93OworCisgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggSUNEIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBuZWVkIHRvIGNyZWF0ZSBhIHN1cmZhY2UKKyAgICBmb3IgKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcHRyX2luc3RhbmNlLT5pY2RfdGVybXM7IGljZF90ZXJtICE9IE5VTEw7IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQsIGkrKykgeworICAgICAgICBpZiAoaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5pbnRlcmZhY2VfdmVyc2lvbiA+PSBJQ0RfVkVSX1NVUFBPUlRTX0lDRF9TVVJGQUNFX0tIUikgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZVhsaWJTdXJmYWNlS0hSKSB7CisgICAgICAgICAgICAgICAgdmtSZXMgPSBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlWGxpYlN1cmZhY2VLSFIoaWNkX3Rlcm0tPmluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEljZFN1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSB2a1JlcykgeworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcFN1cmZhY2UgPSAoVmtTdXJmYWNlS0hSKXBJY2RTdXJmYWNlOworCitvdXQ6CisKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSB2a1JlcyAmJiBOVUxMICE9IHBJY2RTdXJmYWNlKSB7CisgICAgICAgIGlmIChOVUxMICE9IHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcykgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBmb3IgKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcHRyX2luc3RhbmNlLT5pY2RfdGVybXM7IGljZF90ZXJtICE9IE5VTEw7IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQsIGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoVmtTdXJmYWNlS0hSKU5VTEwgIT0gcEljZFN1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ldICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkRlc3Ryb3lTdXJmYWNlS0hSKSB7CisgICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUihpY2RfdGVybS0+aW5zdGFuY2UsIHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSwgcEFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIHBJY2RTdXJmYWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmtSZXM7Cit9CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IKKy8vIEdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIERpc3BsYXkgKmRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXN1YWxJRCB2aXN1YWxJRCkgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIFZrQm9vbDMyIHJlcyA9IGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBxdWV1ZUZhbWlseUluZGV4LCBkcHksIHZpc3VhbElEKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBUaGlzIGlzIHRoZSBpbnN0YW5jZSBjaGFpbiB0ZXJtaW5hdG9yIGZ1bmN0aW9uIGZvcgorLy8gR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUgorVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBEaXNwbGF5ICpkcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpc3VhbElEIHZpc3VhbElEKSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWljZF90ZXJtLT50aGlzX2luc3RhbmNlOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfeGxpYl9zdXJmYWNlX2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19LSFJfeGxpYl9zdXJmYWNlIGV4dGVuc2lvbiBub3QgZW5hYmxlZC4gIHZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgZm9yIHNlbGVjdGVkIHBoeXNpY2FsIGRldmljZSBpcyBub3QgZXhwb3J0aW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiFcbiIpOworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgImxvYWRlcjogbnVsbCBHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIElDRCBwb2ludGVyIik7CisgICAgfQorCisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBxdWV1ZUZhbWlseUluZGV4LCBkcHksIHZpc3VhbElEKTsKK30KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworLy8gRnVuY3Rpb25zIGZvciB0aGUgVktfS0hSX2FuZHJvaWRfc3VyZmFjZSBleHRlbnNpb246CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgQU5hdGl2ZVdpbmRvdyAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKGluc3RhbmNlKTsKKyAgICBWa1Jlc3VsdCByZXM7CisKKyAgICByZXMgPSBkaXNwLT5DcmVhdGVBbmRyb2lkU3VyZmFjZUtIUihpbnN0YW5jZSwgd2luZG93LCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IgQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFdpbmRvdyB3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICAvLyBGaXJzdCwgY2hlY2sgdG8gZW5zdXJlIHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gd2FzIGVuYWJsZWQ6CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKCFwdHJfaW5zdGFuY2UtPndzaV9kaXNwbGF5X2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19LSFJfZGlzcGxheSBleHRlbnNpb24gbm90IGVuYWJsZWQuICB2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIG5vdCBleGVjdXRlZCFcbiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UOworICAgIH0KKworICAgIC8vIE5leHQsIGlmIHNvLCBwcm9jZWVkIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb246CisgICAgVmtJY2RTdXJmYWNlQW5kcm9pZCAqcEljZFN1cmZhY2UgPQorICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9hbGxvYyhwdHJfaW5zdGFuY2UsIHNpemVvZihWa0ljZFN1cmZhY2VBbmRyb2lkKSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICBpZiAocEljZFN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKworICAgIHBJY2RTdXJmYWNlLT5iYXNlLnBsYXRmb3JtID0gVktfSUNEX1dTSV9QTEFURk9STV9BTkRST0lEOworICAgIHBJY2RTdXJmYWNlLT53aW5kb3cgPSB3aW5kb3c7CisKKyAgICAqcFN1cmZhY2UgPSAoVmtTdXJmYWNlS0hSKXBJY2RTdXJmYWNlOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKy8vIEZ1bmN0aW9ucyBmb3IgdGhlIFZLX0VYVF9oZWFkbGVzc19zdXJmYWNlIGV4dGVuc2lvbjoKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChpbnN0YW5jZSk7CisgICAgVmtSZXN1bHQgcmVzOworCisgICAgcmVzID0gZGlzcC0+Q3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIHJldHVybiByZXM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVChWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgVmtJY2RTdXJmYWNlICpwSWNkU3VyZmFjZSA9IE5VTEw7CisgICAgVmtSZXN1bHQgdmtSZXMgPSBWS19TVUNDRVNTOworICAgIHVpbnQzMl90IGkgPSAwOworCisgICAgaWYgKCFpbnN0LT53c2lfaGVhZGxlc3Nfc3VyZmFjZV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIlZLX0VYVF9oZWFkbGVzc19zdXJmYWNlIGV4dGVuc2lvbiBub3QgZW5hYmxlZC4gICIKKyAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIC8vIE5leHQsIGlmIHNvLCBwcm9jZWVkIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb246CisgICAgcEljZFN1cmZhY2UgPSBBbGxvY2F0ZUljZFN1cmZhY2VTdHJ1Y3QoaW5zdCwgc2l6ZW9mKHBJY2RTdXJmYWNlLT5oZWFkbGVzc19zdXJmLmJhc2UpLCBzaXplb2YocEljZFN1cmZhY2UtPmhlYWRsZXNzX3N1cmYpKTsKKyAgICBpZiAocEljZFN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICB2a1JlcyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcEljZFN1cmZhY2UtPmhlYWRsZXNzX3N1cmYuYmFzZS5wbGF0Zm9ybSA9IFZLX0lDRF9XU0lfUExBVEZPUk1fSEVBRExFU1M7CisgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggSUNEIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBuZWVkIHRvIGNyZWF0ZSBhIHN1cmZhY2UKKyAgICBmb3IgKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gaW5zdC0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0LCBpKyspIHsKKyAgICAgICAgaWYgKGljZF90ZXJtLT5zY2FubmVkX2ljZC0+aW50ZXJmYWNlX3ZlcnNpb24gPj0gSUNEX1ZFUl9TVVBQT1JUU19JQ0RfU1VSRkFDRV9LSFIpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQpIHsKKyAgICAgICAgICAgICAgICB2a1JlcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoaWNkX3Rlcm0tPmluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdmtSZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnBTdXJmYWNlID0gKFZrU3VyZmFjZUtIUilwSWNkU3VyZmFjZTsKKworb3V0OgorCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdmtSZXMgJiYgTlVMTCAhPSBwSWNkU3VyZmFjZSkgeworICAgICAgICBpZiAoTlVMTCAhPSBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGluc3QtPmljZF90ZXJtczsgaWNkX3Rlcm0gIT0gTlVMTDsgaWNkX3Rlcm0gPSBpY2RfdGVybS0+bmV4dCwgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChWa1N1cmZhY2VLSFIpTlVMTCAhPSBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaV0gJiYgTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guRGVzdHJveVN1cmZhY2VLSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWNkX3Rlcm0tPmRpc3BhdGNoLkRlc3Ryb3lTdXJmYWNlS0hSKGljZF90ZXJtLT5pbnN0YW5jZSwgcEljZFN1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ldLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXJfaW5zdGFuY2VfaGVhcF9mcmVlKGluc3QsIHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBwSWNkU3VyZmFjZSk7CisgICAgfQorCisgICAgcmV0dXJuIHZrUmVzOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCisvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19NVktfbWFjb3Nfc3VyZmFjZSBleHRlbnNpb246CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgQ3JlYXRlTWFjT1NTdXJmYWNlTVZLCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyhWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKGluc3RhbmNlKTsKKyAgICBWa1Jlc3VsdCByZXM7CisKKyAgICByZXMgPSBkaXNwLT5DcmVhdGVNYWNPU1N1cmZhY2VNVksoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gVGhpcyBpcyB0aGUgaW5zdGFuY2UgY2hhaW4gdGVybWluYXRvciBmdW5jdGlvbiBmb3IgQ3JlYXRlTWFjT1NTdXJmYWNlS0hSCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVNYWNPU1N1cmZhY2VNVksoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBWa1Jlc3VsdCB2a1JlcyA9IFZLX1NVQ0NFU1M7CisgICAgVmtJY2RTdXJmYWNlICpwSWNkU3VyZmFjZSA9IE5VTEw7CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICAvLyBGaXJzdCwgY2hlY2sgdG8gZW5zdXJlIHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gd2FzIGVuYWJsZWQ6CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKCFwdHJfaW5zdGFuY2UtPndzaV9tYWNvc19zdXJmYWNlX2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19NVktfbWFjb3Nfc3VyZmFjZSBleHRlbnNpb24gbm90IGVuYWJsZWQuICB2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgdmtSZXMgPSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIE5leHQsIGlmIHNvLCBwcm9jZWVkIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb246CisgICAgcEljZFN1cmZhY2UgPSBBbGxvY2F0ZUljZFN1cmZhY2VTdHJ1Y3QocHRyX2luc3RhbmNlLCBzaXplb2YocEljZFN1cmZhY2UtPm1hY29zX3N1cmYuYmFzZSksIHNpemVvZihwSWNkU3VyZmFjZS0+bWFjb3Nfc3VyZikpOworICAgIGlmIChwSWNkU3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHZrUmVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBwSWNkU3VyZmFjZS0+bWFjb3Nfc3VyZi5iYXNlLnBsYXRmb3JtID0gVktfSUNEX1dTSV9QTEFURk9STV9NQUNPUzsKKyAgICBwSWNkU3VyZmFjZS0+bWFjb3Nfc3VyZi5wVmlldyA9IHBDcmVhdGVJbmZvLT5wVmlldzsKKworICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIElDRCBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgbmVlZCB0byBjcmVhdGUgYSBzdXJmYWNlCisgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0LCBpKyspIHsKKyAgICAgICAgaWYgKGljZF90ZXJtLT5zY2FubmVkX2ljZC0+aW50ZXJmYWNlX3ZlcnNpb24gPj0gSUNEX1ZFUl9TVVBQT1JUU19JQ0RfU1VSRkFDRV9LSFIpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVNYWNPU1N1cmZhY2VNVkspIHsKKyAgICAgICAgICAgICAgICB2a1JlcyA9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVNYWNPU1N1cmZhY2VNVksoaWNkX3Rlcm0tPmluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdmtSZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnBTdXJmYWNlID0gKFZrU3VyZmFjZUtIUilwSWNkU3VyZmFjZTsKKworb3V0OgorCisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdmtSZXMgJiYgTlVMTCAhPSBwSWNkU3VyZmFjZSkgeworICAgICAgICBpZiAoTlVMTCAhPSBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0LCBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKFZrU3VyZmFjZUtIUilOVUxMICE9IHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSAmJiBOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUikgeworICAgICAgICAgICAgICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guRGVzdHJveVN1cmZhY2VLSFIoaWNkX3Rlcm0tPmluc3RhbmNlLCBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaV0sIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUocHRyX2luc3RhbmNlLCBwSWNkU3VyZmFjZSk7CisgICAgfQorCisgICAgcmV0dXJuIHZrUmVzOworfQorCisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKKy8vIEZ1bmN0aW9ucyBmb3IgdGhlIFZLX01WS19pb3Nfc3VyZmFjZSBleHRlbnNpb246CisKKy8vIFRoaXMgaXMgdGhlIHRyYW1wb2xpbmUgZW50cnlwb2ludCBmb3IgQ3JlYXRlSU9TU3VyZmFjZU1WSworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVJT1NTdXJmYWNlTVZLKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKGluc3RhbmNlKTsKKyAgICBWa1Jlc3VsdCByZXM7CisKKyAgICByZXMgPSBkaXNwLT5DcmVhdGVJT1NTdXJmYWNlTVZLKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIHJldHVybiByZXM7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGluc3RhbmNlIGNoYWluIHRlcm1pbmF0b3IgZnVuY3Rpb24gZm9yIENyZWF0ZUlPU1N1cmZhY2VLSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZUlPU1N1cmZhY2VNVksoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSICpwU3VyZmFjZSkgeworICAgIC8vIEZpcnN0LCBjaGVjayB0byBlbnN1cmUgdGhlIGFwcHJvcHJpYXRlIGV4dGVuc2lvbiB3YXMgZW5hYmxlZDoKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSBsb2FkZXJfZ2V0X2luc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAoIXB0cl9pbnN0YW5jZS0+d3NpX2lvc19zdXJmYWNlX2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19NVktfaW9zX3N1cmZhY2UgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtDcmVhdGVJT1NTdXJmYWNlTVZLIG5vdCBleGVjdXRlZCFcbiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UOworICAgIH0KKworICAgIC8vIE5leHQsIGlmIHNvLCBwcm9jZWVkIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb246CisgICAgVmtJY2RTdXJmYWNlSU9TICpwSWNkU3VyZmFjZSA9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2FsbG9jKHB0cl9pbnN0YW5jZSwgc2l6ZW9mKFZrSWNkU3VyZmFjZUlPUyksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgaWYgKHBJY2RTdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisKKyAgICBwSWNkU3VyZmFjZS0+YmFzZS5wbGF0Zm9ybSA9IFZLX0lDRF9XU0lfUExBVEZPUk1fSU9TOworICAgIHBJY2RTdXJmYWNlLT5wVmlldyA9IHBDcmVhdGVJbmZvLT5wVmlldzsKKworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpcEljZFN1cmZhY2U7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVChWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChpbnN0YW5jZSk7CisgICAgcmV0dXJuIGRpc3AtPkNyZWF0ZU1ldGFsU3VyZmFjZUVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKSB7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfU1VDQ0VTUzsKKyAgICBWa0ljZFN1cmZhY2UgKmljZF9zdXJmYWNlID0gTlVMTDsKKyAgICB1aW50MzJfdCBpOworCisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IGxvYWRlcl9nZXRfaW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfbWV0YWxfc3VyZmFjZV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfRVhUX21ldGFsX3N1cmZhY2UgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiB2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCB3aWxsIG5vdCBiZSBleGVjdXRlZC5cbiIpOworICAgIH0KKworICAgIC8vIE5leHQsIGlmIHNvLCBwcm9jZWVkIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb246CisgICAgaWNkX3N1cmZhY2UgPSBBbGxvY2F0ZUljZFN1cmZhY2VTdHJ1Y3QocHRyX2luc3RhbmNlLCBzaXplb2YoaWNkX3N1cmZhY2UtPm1ldGFsX3N1cmYuYmFzZSksIHNpemVvZihpY2Rfc3VyZmFjZS0+bWV0YWxfc3VyZikpOworICAgIGlmIChpY2Rfc3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWNkX3N1cmZhY2UtPm1ldGFsX3N1cmYuYmFzZS5wbGF0Zm9ybSA9IFZLX0lDRF9XU0lfUExBVEZPUk1fTUVUQUw7CisgICAgaWNkX3N1cmZhY2UtPm1ldGFsX3N1cmYucExheWVyID0gcENyZWF0ZUluZm8tPnBMYXllcjsKKworICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIElDRCBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgbmVlZCB0byBjcmVhdGUgYSBzdXJmYWNlCisgICAgaSA9IDA7CisgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0LCArK2kpIHsKKyAgICAgICAgaWYgKGljZF90ZXJtLT5zY2FubmVkX2ljZC0+aW50ZXJmYWNlX3ZlcnNpb24gPj0gSUNEX1ZFUl9TVVBQT1JUU19JQ0RfU1VSRkFDRV9LSFIpIHsKKyAgICAgICAgICAgIGlmIChpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlTWV0YWxTdXJmYWNlRVhUICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKGljZF90ZXJtLT5pbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpaWNkX3N1cmZhY2U7CisKK291dDoKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MgJiYgaWNkX3N1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICBpZiAoaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHB0cl9pbnN0YW5jZS0+aWNkX3Rlcm1zOyBpY2RfdGVybSAhPSBOVUxMOyBpY2RfdGVybSA9IGljZF90ZXJtLT5uZXh0LCArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ldID09IFZLX05VTExfSEFORExFICYmIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUihpY2RfdGVybS0+aW5zdGFuY2UsIGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSwgcEFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShwdHJfaW5zdGFuY2UsIGljZF9zdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCisKKy8vIEZ1bmN0aW9ucyBmb3IgdGhlIFZLX0tIUl9kaXNwbGF5IGluc3RhbmNlIGV4dGVuc2lvbjoKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcykgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIFZrUmVzdWx0IHJlcyA9IGRpc3AtPkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcykgeworICAgIC8vIEZpcnN0LCBjaGVjayB0byBlbnN1cmUgdGhlIGFwcHJvcHJpYXRlIGV4dGVuc2lvbiB3YXMgZW5hYmxlZDoKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisgICAgc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqcHRyX2luc3RhbmNlID0gKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKilpY2RfdGVybS0+dGhpc19pbnN0YW5jZTsKKyAgICBpZiAoIXB0cl9pbnN0YW5jZS0+d3NpX2Rpc3BsYXlfZW5hYmxlZCkgeworICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIlZLX0tIUl9kaXNwbGF5IGV4dGVuc2lvbiBub3QgZW5hYmxlZC4gIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgZm9yIHNlbGVjdGVkIHBoeXNpY2FsIGRldmljZSBpcyBub3QgZXhwb3J0aW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiFcbiIpOworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgImxvYWRlcjogbnVsbCBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIElDRCBwb2ludGVyIik7CisgICAgfQorCisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBWa1Jlc3VsdCByZXMgPSBkaXNwLT5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgKnBQcm9wZXJ0aWVzKSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWljZF90ZXJtLT50aGlzX2luc3RhbmNlOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfS0hSX2Rpc3BsYXkgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgZm9yIHNlbGVjdGVkIHBoeXNpY2FsIGRldmljZSBpcyBub3QgZXhwb3J0aW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIVxuIik7CisgICAgICAgIGFzc2VydChmYWxzZSAmJiAibG9hZGVyOiBudWxsIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBJQ0QgcG9pbnRlciIpOworICAgIH0KKworICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lSW5kZXgsIHVpbnQzMl90ICpwRGlzcGxheUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlLSFIgKnBEaXNwbGF5cykgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIFZrUmVzdWx0IHJlcyA9IGRpc3AtPkdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKHVud3JhcHBlZF9waHlzX2RldiwgcGxhbmVJbmRleCwgcERpc3BsYXlDb3VudCwgcERpc3BsYXlzKTsKKyAgICByZXR1cm4gcmVzOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBwbGFuZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEaXNwbGF5Q291bnQsIFZrRGlzcGxheUtIUiAqcERpc3BsYXlzKSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWljZF90ZXJtLT50aGlzX2luc3RhbmNlOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfS0hSX2Rpc3BsYXkgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiSUNEIGZvciBzZWxlY3RlZCBwaHlzaWNhbCBkZXZpY2UgaXMgbm90IGV4cG9ydGluZyB2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIVxuIik7CisgICAgICAgIGFzc2VydChmYWxzZSAmJiAibG9hZGVyOiBudWxsIEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIElDRCBwb2ludGVyIik7CisgICAgfQorCisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcGxhbmVJbmRleCwgcERpc3BsYXlDb3VudCwgcERpc3BsYXlzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBWa1Jlc3VsdCByZXMgPSBkaXNwLT5HZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgKnBQcm9wZXJ0aWVzKSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWljZF90ZXJtLT50aGlzX2luc3RhbmNlOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfS0hSX2Rpc3BsYXkgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgbm90IGV4ZWN1dGVkIVxuIik7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5kaXNwYXRjaC5HZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgZm9yIHNlbGVjdGVkIHBoeXNpY2FsIGRldmljZSBpcyBub3QgZXhwb3J0aW5nIHZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIVxuIik7CisgICAgICAgIGFzc2VydChmYWxzZSAmJiAibG9hZGVyOiBudWxsIEdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiBJQ0QgcG9pbnRlciIpOworICAgIH0KKworICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURpc3BsYXlNb2RlS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5TW9kZUtIUiAqcE1vZGUpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBWa1Jlc3VsdCByZXMgPSBkaXNwLT5DcmVhdGVEaXNwbGF5TW9kZUtIUih1bndyYXBwZWRfcGh5c19kZXYsIGRpc3BsYXksIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTW9kZSk7CisgICAgcmV0dXJuIHJlczsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlRGlzcGxheU1vZGVLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRGlzcGxheU1vZGVLSFIgKnBNb2RlKSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHRvIGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHdhcyBlbmFibGVkOgorICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UgPSAoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWljZF90ZXJtLT50aGlzX2luc3RhbmNlOworICAgIGlmICghcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2cocHRyX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAiVktfS0hSX2Rpc3BsYXkgZXh0ZW5zaW9uIG5vdCBlbmFibGVkLiAgdmtDcmVhdGVEaXNwbGF5TW9kZUtIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVDsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlRGlzcGxheU1vZGVLSFIpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgZm9yIHNlbGVjdGVkIHBoeXNpY2FsIGRldmljZSBpcyBub3QgZXhwb3J0aW5nIHZrQ3JlYXRlRGlzcGxheU1vZGVLSFIhXG4iKTsKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJsb2FkZXI6IG51bGwgQ3JlYXRlRGlzcGxheU1vZGVLSFIgSUNEIHBvaW50ZXIiKTsKKyAgICB9CisKKyAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZURpc3BsYXlNb2RlS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBkaXNwbGF5LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1vZGUpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5TW9kZUtIUiBtb2RlLCB1aW50MzJfdCBwbGFuZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgKnBDYXBhYmlsaXRpZXMpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBWa1Jlc3VsdCByZXMgPSBkaXNwLT5HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBtb2RlLCBwbGFuZUluZGV4LCBwQ2FwYWJpbGl0aWVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5TW9kZUtIUiBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgKnBDYXBhYmlsaXRpZXMpIHsKKyAgICAvLyBGaXJzdCwgY2hlY2sgdG8gZW5zdXJlIHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gd2FzIGVuYWJsZWQ6CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSA9IChzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICopaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2U7CisgICAgaWYgKCFwdHJfaW5zdGFuY2UtPndzaV9kaXNwbGF5X2VuYWJsZWQpIHsKKyAgICAgICAgbG9hZGVyX2xvZyhwdHJfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJWS19LSFJfZGlzcGxheSBleHRlbnNpb24gbm90IGVuYWJsZWQuICB2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUikgeworICAgICAgICBsb2FkZXJfbG9nKHB0cl9pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIklDRCBmb3Igc2VsZWN0ZWQgcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBleHBvcnRpbmcgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIhXG4iKTsKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJsb2FkZXI6IG51bGwgR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIElDRCBwb2ludGVyIik7CisgICAgfQorCisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIG1vZGUsIHBsYW5lSW5kZXgsIHBDYXBhYmlsaXRpZXMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKGluc3RhbmNlKTsKKyAgICBWa1Jlc3VsdCByZXM7CisKKyAgICByZXMgPSBkaXNwLT5DcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIHJldHVybiByZXM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICppbnN0ID0gbG9hZGVyX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CisgICAgVmtJY2RTdXJmYWNlICpwSWNkU3VyZmFjZSA9IE5VTEw7CisgICAgVmtSZXN1bHQgdmtSZXMgPSBWS19TVUNDRVNTOworICAgIHVpbnQzMl90IGkgPSAwOworCisgICAgaWYgKCFpbnN0LT53c2lfZGlzcGxheV9lbmFibGVkKSB7CisgICAgICAgIGxvYWRlcl9sb2coaW5zdCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIlZLX0tIUl9zdXJmYWNlIGV4dGVuc2lvbiBub3QgZW5hYmxlZC4gIHZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiBub3QgZXhlY3V0ZWQhXG4iKTsKKyAgICAgICAgdmtSZXMgPSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8vIE5leHQsIGlmIHNvLCBwcm9jZWVkIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb246CisgICAgcEljZFN1cmZhY2UgPSBBbGxvY2F0ZUljZFN1cmZhY2VTdHJ1Y3QoaW5zdCwgc2l6ZW9mKHBJY2RTdXJmYWNlLT5kaXNwbGF5X3N1cmYuYmFzZSksIHNpemVvZihwSWNkU3VyZmFjZS0+ZGlzcGxheV9zdXJmKSk7CisgICAgaWYgKHBJY2RTdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgdmtSZXMgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHBJY2RTdXJmYWNlLT5kaXNwbGF5X3N1cmYuYmFzZS5wbGF0Zm9ybSA9IFZLX0lDRF9XU0lfUExBVEZPUk1fRElTUExBWTsKKyAgICBwSWNkU3VyZmFjZS0+ZGlzcGxheV9zdXJmLmRpc3BsYXlNb2RlID0gcENyZWF0ZUluZm8tPmRpc3BsYXlNb2RlOworICAgIHBJY2RTdXJmYWNlLT5kaXNwbGF5X3N1cmYucGxhbmVJbmRleCA9IHBDcmVhdGVJbmZvLT5wbGFuZUluZGV4OworICAgIHBJY2RTdXJmYWNlLT5kaXNwbGF5X3N1cmYucGxhbmVTdGFja0luZGV4ID0gcENyZWF0ZUluZm8tPnBsYW5lU3RhY2tJbmRleDsKKyAgICBwSWNkU3VyZmFjZS0+ZGlzcGxheV9zdXJmLnRyYW5zZm9ybSA9IHBDcmVhdGVJbmZvLT50cmFuc2Zvcm07CisgICAgcEljZFN1cmZhY2UtPmRpc3BsYXlfc3VyZi5nbG9iYWxBbHBoYSA9IHBDcmVhdGVJbmZvLT5nbG9iYWxBbHBoYTsKKyAgICBwSWNkU3VyZmFjZS0+ZGlzcGxheV9zdXJmLmFscGhhTW9kZSA9IHBDcmVhdGVJbmZvLT5hbHBoYU1vZGU7CisgICAgcEljZFN1cmZhY2UtPmRpc3BsYXlfc3VyZi5pbWFnZUV4dGVudCA9IHBDcmVhdGVJbmZvLT5pbWFnZUV4dGVudDsKKworICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIElDRCBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgbmVlZCB0byBjcmVhdGUgYSBzdXJmYWNlCisgICAgZm9yIChzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGluc3QtPmljZF90ZXJtczsgaWNkX3Rlcm0gIT0gTlVMTDsgaWNkX3Rlcm0gPSBpY2RfdGVybS0+bmV4dCwgaSsrKSB7CisgICAgICAgIGlmIChpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmludGVyZmFjZV92ZXJzaW9uID49IElDRF9WRVJfU1VQUE9SVFNfSUNEX1NVUkZBQ0VfS0hSKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUikgeworICAgICAgICAgICAgICAgIHZrUmVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoaWNkX3Rlcm0tPmluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaV0pOworICAgICAgICAgICAgICAgIGlmIChWS19TVUNDRVNTICE9IHZrUmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpcEljZFN1cmZhY2U7CisKK291dDoKKworICAgIGlmIChWS19TVUNDRVNTICE9IHZrUmVzICYmIE5VTEwgIT0gcEljZFN1cmZhY2UpIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gcEljZFN1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzKSB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGZvciAoc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBpbnN0LT5pY2RfdGVybXM7IGljZF90ZXJtICE9IE5VTEw7IGljZF90ZXJtID0gaWNkX3Rlcm0tPm5leHQsIGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoVmtTdXJmYWNlS0hSKU5VTEwgIT0gcEljZFN1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ldICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkRlc3Ryb3lTdXJmYWNlS0hSKSB7CisgICAgICAgICAgICAgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5EZXN0cm95U3VyZmFjZUtIUihpY2RfdGVybS0+aW5zdGFuY2UsIHBJY2RTdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpXSwgcEFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyX2luc3RhbmNlX2hlYXBfZnJlZShpbnN0LCBwSWNkU3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpOworICAgICAgICB9CisgICAgICAgIGxvYWRlcl9pbnN0YW5jZV9oZWFwX2ZyZWUoaW5zdCwgcEljZFN1cmZhY2UpOworICAgIH0KKworICAgIHJldHVybiB2a1JlczsKK30KKworLy8gRVhUX2Rpc3BsYXlfc3dhcGNoYWluIEV4dGVuc2lvbiBjb21tYW5kCisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N3YXBjaGFpbktIUiAqcFN3YXBjaGFpbnMpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5DcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKGRldmljZSwgc3dhcGNoYWluQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFN3YXBjaGFpbnMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3Qgc3dhcGNoYWluQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3dhcGNoYWluS0hSICpwU3dhcGNoYWlucykgeworICAgIHVpbnQzMl90IGljZF9pbmRleCA9IDA7CisgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGxvYWRlcl9nZXRfaWNkX2FuZF9kZXZpY2UoZGV2aWNlLCAmZGV2LCAmaWNkX2luZGV4KTsKKyAgICBpZiAoTlVMTCAhPSBpY2RfdGVybSAmJiBOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKSB7CisgICAgICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHVpbnRwdHJfdClwQ3JlYXRlSW5mb3MtPnN1cmZhY2U7CisgICAgICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcykgeworICAgICAgICAgICAgaWYgKChWa1N1cmZhY2VLSFIpTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBJQ0QsIGFuZCB0aGVyZSBpcyBhbiBJQ0QgS0hSIHN1cmZhY2UKKyAgICAgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQsIHNvIGNvcHkgdGhlIENyZWF0ZUluZm8gc3RydWN0CisgICAgICAgICAgICAgICAgLy8gYW5kIHBvaW50IGl0IGF0IHRoZSBJQ0QncyBzdXJmYWNlLgorICAgICAgICAgICAgICAgIFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUNvcHkgPSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZW9mKFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUikgKiBzd2FwY2hhaW5Db3VudCk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gcENyZWF0ZUNvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KHBDcmVhdGVDb3B5LCBwQ3JlYXRlSW5mb3MsIHNpemVvZihWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIpICogc3dhcGNoYWluQ291bnQpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgc2MgPSAwOyBzYyA8IHN3YXBjaGFpbkNvdW50OyBzYysrKSB7CisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVDb3B5W3NjXS5zdXJmYWNlID0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUihkZXZpY2UsIHN3YXBjaGFpbkNvdW50LCBwQ3JlYXRlQ29weSwgcEFsbG9jYXRvciwgcFN3YXBjaGFpbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUihkZXZpY2UsIHN3YXBjaGFpbkNvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBTd2FwY2hhaW5zKTsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiAgICAgICAgcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcykgeworICAgIGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpkaXNwID0gbG9hZGVyX2dldF9kaXNwYXRjaChkZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoZGV2aWNlLCBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKTsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKSB7CisgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKGRldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihkZXZpY2UsIHN1cmZhY2UsIHBNb2Rlcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpIHsKKyAgICB1aW50MzJfdCBpY2RfaW5kZXggPSAwOworICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXY7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBsb2FkZXJfZ2V0X2ljZF9hbmRfZGV2aWNlKGRldmljZSwgJmRldiwgJmljZF9pbmRleCk7CisgICAgaWYgKE5VTEwgIT0gaWNkX3Rlcm0gJiYgTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKSB7CisgICAgICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHVpbnRwdHJfdClzdXJmYWNlOworICAgICAgICBpZiAoTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMgJiYgKFZrU3VyZmFjZUtIUilOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdKSB7CisgICAgICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihkZXZpY2UsIGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdLCBwTW9kZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKGRldmljZSwgc3VyZmFjZSwgcE1vZGVzKTsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK0xPQURFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0Q291bnQsCisgICAgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUih1bndyYXBwZWRfcGh5c19kZXYsIHN1cmZhY2UsIHBSZWN0Q291bnQsIHBSZWN0cyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKSB7CisgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICJJQ0QgYXNzb2NpYXRlZCB3aXRoIFZrUGh5c2ljYWxEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hYIik7CisgICAgfQorICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKHN1cmZhY2UpOworICAgIHVpbnQ4X3QgaWNkX2luZGV4ID0gcGh5c19kZXZfdGVybS0+aWNkX2luZGV4OworICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyAmJiBOVUxMICE9ICh2b2lkICopaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF0pIHsKKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XSwgcFJlY3RDb3VudCwgcFJlY3RzKTsKKyAgICB9CisgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBzdXJmYWNlLCBwUmVjdENvdW50LCBwUmVjdHMpOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqICAgICAgICAgICAgcEFjcXVpcmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgpIHsKKyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goZGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+QWNxdWlyZU5leHRJbWFnZTJLSFIoZGV2aWNlLCBwQWNxdWlyZUluZm8sIHBJbWFnZUluZGV4KTsKK30KKworLy8gLS0tLSBWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIgZXh0ZW5zaW9uIHRyYW1wb2xpbmUvdGVybWluYXRvcnMKKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSICpwUHJvcGVydGllcykgeworICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7CisgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZShwaHlzaWNhbERldmljZSk7CisgICAgZGlzcCA9IGxvYWRlcl9nZXRfaW5zdGFuY2VfbGF5ZXJfZGlzcGF0Y2gocGh5c2ljYWxEZXZpY2UpOworICAgIHJldHVybiBkaXNwLT5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUih1bndyYXBwZWRfcGh5c19kZXYsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisKKyAgICAvLyBJZiB0aGUgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBkcml2ZXIsIGp1c3QgY2FsbCBpbnRvIGl0CisgICAgaWYgKGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSB0byBlbXVsYXRlIHRoZSBmdW5jdGlvbi4KKyAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSOiBFbXVsYXRpbmcgY2FsbCBpbiBJQ0QgXCIlc1wiIiwgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAvLyBJZiB0aGUgaWNkIGRvZXNuJ3Qgc3VwcG9ydCBWS19LSFJfZGlzcGxheSwgdGhlbiBubyBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUKKyAgICBpZiAoaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIgPT0gTlVMTCkgeworICAgICAgICAqcFByb3BlcnR5Q291bnQgPSAwOworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBhcmVuJ3Qgd3JpdGluZyB0byBwUHJvcGVydGllcywgdGhlbiBlbXVsYXRpb24gaXMgc3RyYWlnaHRmb3J3YXJkCisgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwgfHwgKnBQcm9wZXJ0eUNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwUHJvcGVydHlDb3VudCwgTlVMTCk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZG8gaGF2ZSB0byB3cml0ZSB0byBwUHJvcGVydGllcywgdGhlbiB3ZSBuZWVkIHRvIHdyaXRlIHRvIGEgdGVtcG9yYXJ5IGFycmF5IG9mIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgYW5kIGNvcHkgaXQKKyAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSICpwcm9wZXJ0aWVzID0gbG9hZGVyX3N0YWNrX2FsbG9jKCpwUHJvcGVydHlDb3VudCAqIHNpemVvZihWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKSk7CisgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXMgPSBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcFByb3BlcnR5Q291bnQsIHByb3BlcnRpZXMpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFByb3BlcnR5Q291bnQ7ICsraSkgeworICAgICAgICBtZW1jcHkoJnBQcm9wZXJ0aWVzW2ldLmRpc3BsYXlQcm9wZXJ0aWVzLCAmcHJvcGVydGllc1tpXSwgc2l6ZW9mKFZrRGlzcGxheVByb3BlcnRpZXNLSFIpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUih1bndyYXBwZWRfcGh5c19kZXYsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSICpwUHJvcGVydGllcykgeworICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKXBoeXNpY2FsRGV2aWNlOworICAgIHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtID0gcGh5c19kZXZfdGVybS0+dGhpc19pY2RfdGVybTsKKworICAgIC8vIElmIHRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGRyaXZlciwganVzdCBjYWxsIGludG8gaXQKKyAgICBpZiAoaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIocGh5c19kZXZfdGVybS0+cGh5c19kZXYsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSB0byBlbXVsYXRlIHRoZSBmdW5jdGlvbi4KKyAgICBsb2FkZXJfbG9nKGljZF90ZXJtLT50aGlzX2luc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI6IEVtdWxhdGluZyBjYWxsIGluIElDRCBcIiVzXCIiLCBpY2RfdGVybS0+c2Nhbm5lZF9pY2QtPmxpYl9uYW1lKTsKKworICAgIC8vIElmIHRoZSBpY2QgZG9lc24ndCBzdXBwb3J0IFZLX0tIUl9kaXNwbGF5LCB0aGVuIG5vIHByb3BlcnRpZXMgYXJlIGF2YWlsYWJsZQorICAgIGlmIChpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSID09IE5VTEwpIHsKKyAgICAgICAgKnBQcm9wZXJ0eUNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgLy8gSWYgd2UgYXJlbid0IHdyaXRpbmcgdG8gcFByb3BlcnRpZXMsIHRoZW4gZW11bGF0aW9uIGlzIHN0cmFpZ2h0Zm9yd2FyZAorICAgIGlmIChwUHJvcGVydGllcyA9PSBOVUxMIHx8ICpwUHJvcGVydHlDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwUHJvcGVydHlDb3VudCwgTlVMTCk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZG8gaGF2ZSB0byB3cml0ZSB0byBwUHJvcGVydGllcywgdGhlbiB3ZSBuZWVkIHRvIHdyaXRlIHRvIGEgdGVtcG9yYXJ5IGFycmF5IG9mIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBhbmQgY29weSBpdAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiAqcHJvcGVydGllcyA9IGxvYWRlcl9zdGFja19hbGxvYygqcFByb3BlcnR5Q291bnQgKiBzaXplb2YoVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKSk7CisgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXMgPQorICAgICAgICBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBwUHJvcGVydHlDb3VudCwgcHJvcGVydGllcyk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICpwUHJvcGVydHlDb3VudDsgKytpKSB7CisgICAgICAgIG1lbWNweSgmcFByb3BlcnRpZXNbaV0uZGlzcGxheVBsYW5lUHJvcGVydGllcywgJnByb3BlcnRpZXNbaV0sIHNpemVvZihWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworTE9BREVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgKnBQcm9wZXJ0aWVzKSB7CisgICAgY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHVud3JhcHBlZF9waHlzX2RldiA9IGxvYWRlcl91bndyYXBfcGh5c2ljYWxfZGV2aWNlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBkaXNwID0gbG9hZGVyX2dldF9pbnN0YW5jZV9sYXllcl9kaXNwYXRjaChwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIGRpc3AtPkdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIodW53cmFwcGVkX3BoeXNfZGV2LCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpIHsKKyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKilwaHlzaWNhbERldmljZTsKKyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IHBoeXNfZGV2X3Rlcm0tPnRoaXNfaWNkX3Rlcm07CisKKyAgICAvLyBJZiB0aGUgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBkcml2ZXIsIGp1c3QgY2FsbCBpbnRvIGl0CisgICAgaWYgKGljZF90ZXJtLT5kaXNwYXRjaC5HZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGljZF90ZXJtLT5kaXNwYXRjaC5HZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKHBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2LCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgdG8gZW11bGF0ZSB0aGUgZnVuY3Rpb24uCisgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSOiBFbXVsYXRpbmcgY2FsbCBpbiBJQ0QgXCIlc1wiIiwgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAvLyBJZiB0aGUgaWNkIGRvZXNuJ3Qgc3VwcG9ydCBWS19LSFJfZGlzcGxheSwgdGhlbiBubyBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUKKyAgICBpZiAoaWNkX3Rlcm0tPmRpc3BhdGNoLkdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiA9PSBOVUxMKSB7CisgICAgICAgICpwUHJvcGVydHlDb3VudCA9IDA7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZW4ndCB3cml0aW5nIHRvIHBQcm9wZXJ0aWVzLCB0aGVuIGVtdWxhdGlvbiBpcyBzdHJhaWdodGZvcndhcmQKKyAgICBpZiAocFByb3BlcnRpZXMgPT0gTlVMTCB8fCAqcFByb3BlcnR5Q291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgZGlzcGxheSwgcFByb3BlcnR5Q291bnQsIE5VTEwpOworICAgIH0KKworICAgIC8vIElmIHdlIGRvIGhhdmUgdG8gd3JpdGUgdG8gcFByb3BlcnRpZXMsIHRoZW4gd2UgbmVlZCB0byB3cml0ZSB0byBhIHRlbXBvcmFyeSBhcnJheSBvZiBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiBhbmQgY29weSBpdAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSICpwcm9wZXJ0aWVzID0gbG9hZGVyX3N0YWNrX2FsbG9jKCpwUHJvcGVydHlDb3VudCAqIHNpemVvZihWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUikpOworICAgIGlmIChwcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzID0gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgZGlzcGxheSwgcFByb3BlcnR5Q291bnQsIHByb3BlcnRpZXMpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFByb3BlcnR5Q291bnQ7ICsraSkgeworICAgICAgICBtZW1jcHkoJnBQcm9wZXJ0aWVzW2ldLmRpc3BsYXlNb2RlUHJvcGVydGllcywgJnByb3BlcnRpZXNbaV0sIHNpemVvZihWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUikpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitMT0FERVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSICpwRGlzcGxheVBsYW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgKnBDYXBhYmlsaXRpZXMpIHsKKyAgICBjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpkaXNwOworICAgIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwcGVkX3BoeXNfZGV2ID0gbG9hZGVyX3Vud3JhcF9waHlzaWNhbF9kZXZpY2UocGh5c2ljYWxEZXZpY2UpOworICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKHBoeXNpY2FsRGV2aWNlKTsKKyAgICByZXR1cm4gZGlzcC0+R2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUih1bndyYXBwZWRfcGh5c19kZXYsIHBEaXNwbGF5UGxhbmVJbmZvLCBwQ2FwYWJpbGl0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSICpwRGlzcGxheVBsYW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSICpwQ2FwYWJpbGl0aWVzKSB7CisgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopcGh5c2ljYWxEZXZpY2U7CisgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtOworCisgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGlzIGFiYWlsYWJsZSBpbiB0aGUgZHJpdmVyLCBqdXN0IGNhbGwgaW50byBpdAorICAgIGlmIChpY2RfdGVybS0+ZGlzcGF0Y2guR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBpY2RfdGVybS0+ZGlzcGF0Y2guR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcERpc3BsYXlQbGFuZUluZm8sIHBDYXBhYmlsaXRpZXMpOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgdG8gZW11bGF0ZSB0aGUgZnVuY3Rpb24uCisgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSOiBFbXVsYXRpbmcgY2FsbCBpbiBJQ0QgXCIlc1wiIiwgaWNkX3Rlcm0tPnNjYW5uZWRfaWNkLT5saWJfbmFtZSk7CisKKyAgICAvLyBKdXN0IGNhbGwgaW50byB0aGUgb2xkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uLgorICAgIC8vIElmIHRoZSBpY2QgZG9lc24ndCBzdXBwb3J0IFZLX0tIUl9kaXNwbGF5LCB0aGVyZSBhcmUgemVybyBwbGFuZXMgYW5kIHRoaXMgY2FsbCBpcyBpbnZhbGlkIChhbmQgd2lsbCBjcmFzaCkKKyAgICByZXR1cm4gaWNkX3Rlcm0tPmRpc3BhdGNoLkdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUihwaHlzX2Rldl90ZXJtLT5waHlzX2RldiwgcERpc3BsYXlQbGFuZUluZm8tPm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlQbGFuZUluZm8tPnBsYW5lSW5kZXgsICZwQ2FwYWJpbGl0aWVzLT5jYXBhYmlsaXRpZXMpOworfQorCitib29sIHdzaV9zd2FwY2hhaW5faW5zdGFuY2VfZ3BhKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqKmFkZHIpIHsKKyAgICAqYWRkciA9IE5VTEw7CisKKyAgICAvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19LSFJfc3VyZmFjZSBleHRlbnNpb246CisgICAgaWYgKCFzdHJjbXAoInZrRGVzdHJveVN1cmZhY2VLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IHB0cl9pbnN0YW5jZS0+d3NpX3N1cmZhY2VfZW5hYmxlZCA/ICh2b2lkICopdmtEZXN0cm95U3VyZmFjZUtIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9zdXJmYWNlX2VuYWJsZWQgPyAodm9pZCAqKXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IHB0cl9pbnN0YW5jZS0+d3NpX3N1cmZhY2VfZW5hYmxlZCA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfc3VyZmFjZV9lbmFibGVkID8gKHZvaWQgKil2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9zdXJmYWNlX2VuYWJsZWQgPyAodm9pZCAqKXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoInZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9zdXJmYWNlX2VuYWJsZWQgPyAodm9pZCAqKXZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9zdXJmYWNlX2VuYWJsZWQgPyAodm9pZCAqKXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfc3VyZmFjZV9lbmFibGVkID8gKHZvaWQgKil2a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19LSFJfc3dhcGNoYWluIGV4dGVuc2lvbjoKKworICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBkZXZpY2UgZXh0ZW5zaW9uLCBhbmQgaXRzIGZ1bmN0aW9ucyBhcmUgc3RhdGljYWxseQorICAgIC8vIGV4cG9ydGVkIGZyb20gdGhlIGxvYWRlci4gIFBlciBLaHJvbm9zIGRlY2lzaW9ucywgdGhlIGxvYWRlcidzIEdJUEEKKyAgICAvLyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgdHJhbXBvbGluZSBmdW5jdGlvbiBmb3Igc3VjaCBkZXZpY2UtZXh0ZW5zaW9uCisgICAgLy8gZnVuY3Rpb25zLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBoYXMgYmVlbiBlbmFibGVkLgorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKil2a0NyZWF0ZVN3YXBjaGFpbktIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopdmtEZXN0cm95U3dhcGNoYWluS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKXZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrQWNxdWlyZU5leHRJbWFnZUtIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKil2a0FjcXVpcmVOZXh0SW1hZ2VLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtRdWV1ZVByZXNlbnRLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9ICh2b2lkICopdmtRdWV1ZVByZXNlbnRLSFI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtBY3F1aXJlTmV4dEltYWdlMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gKHZvaWQgKil2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19LSFJfd2luMzJfc3VyZmFjZSBleHRlbnNpb246CisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV93aW4zMl9zdXJmYWNlX2VuYWJsZWQgPyAodm9pZCAqKXZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV93aW4zMl9zdXJmYWNlX2VuYWJsZWQgPyAodm9pZCAqKXZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworICAgIC8vIEZ1bmN0aW9ucyBmb3IgdGhlIFZLX0tIUl93YXlsYW5kX3N1cmZhY2UgZXh0ZW5zaW9uOgorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV93YXlsYW5kX3N1cmZhY2VfZW5hYmxlZCA/ICh2b2lkICopdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV93YXlsYW5kX3N1cmZhY2VfZW5hYmxlZCA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCisgICAgLy8gRnVuY3Rpb25zIGZvciB0aGUgVktfS0hSX3hjYl9zdXJmYWNlIGV4dGVuc2lvbjoKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVYY2JTdXJmYWNlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV94Y2Jfc3VyZmFjZV9lbmFibGVkID8gKHZvaWQgKil2a0NyZWF0ZVhjYlN1cmZhY2VLSFIgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV94Y2Jfc3VyZmFjZV9lbmFibGVkID8gKHZvaWQgKil2a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworICAgIC8vIEZ1bmN0aW9ucyBmb3IgdGhlIFZLX0tIUl94bGliX3N1cmZhY2UgZXh0ZW5zaW9uOgorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV94bGliX3N1cmZhY2VfZW5hYmxlZCA/ICh2b2lkICopdmtDcmVhdGVYbGliU3VyZmFjZUtIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV94bGliX3N1cmZhY2VfZW5hYmxlZCA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICAgIC8vIEZ1bmN0aW9ucyBmb3IgdGhlIFZLX0tIUl9hbmRyb2lkX3N1cmZhY2UgZXh0ZW5zaW9uOgorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9hbmRyb2lkX3N1cmZhY2VfZW5hYmxlZCA/ICh2b2lkICopdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKKyAgICAvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19NVktfbWFjb3Nfc3VyZmFjZSBleHRlbnNpb246CisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9tYWNvc19zdXJmYWNlX2VuYWJsZWQgPyAodm9pZCAqKXZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworICAgIC8vIEZ1bmN0aW9ucyBmb3IgdGhlIFZLX01WS19pb3Nfc3VyZmFjZSBleHRlbnNpb246CisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlSU9TU3VyZmFjZU1WSyIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfaW9zX3N1cmZhY2VfZW5hYmxlZCA/ICh2b2lkICopdmtDcmVhdGVJT1NTdXJmYWNlTVZLIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisgICAgLy8gRnVuY3Rpb25zIGZvciB0aGUgVktfRVhUX2hlYWRsZXNzX3N1cmZhY2UgZXh0ZW5zaW9uOgorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfaGVhZGxlc3Nfc3VyZmFjZV9lbmFibGVkID8gKHZvaWQgKil2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKKyAgICAvLyBGdW5jdGlvbnMgZm9yIHRoZSBWS19NVktfbWFjb3Nfc3VyZmFjZSBleHRlbnNpb246CisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9tZXRhbF9zdXJmYWNlX2VuYWJsZWQgPyAodm9pZCAqKXZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworICAgIC8vIEZ1bmN0aW9ucyBmb3IgVktfS0hSX2Rpc3BsYXkgZXh0ZW5zaW9uOgorICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IHB0cl9pbnN0YW5jZS0+d3NpX2Rpc3BsYXlfZW5hYmxlZCA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkID8gKHZvaWQgKil2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkID8gKHZvaWQgKil2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkID8gKHZvaWQgKil2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVEaXNwbGF5TW9kZUtIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkID8gKHZvaWQgKil2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9lbmFibGVkID8gKHZvaWQgKil2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9kaXNwbGF5X2VuYWJsZWQgPyAodm9pZCAqKXZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZ1bmN0aW9ucyBmb3IgS0hSX2Rpc3BsYXlfc3dhcGNoYWluIGV4dGVuc2lvbjoKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSAodm9pZCAqKXZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRnVuY3Rpb25zIGZvciBLSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9wcm9wczJfZW5hYmxlZCA/ICh2b2lkICopdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIiwgbmFtZSkpIHsKKyAgICAgICAgKmFkZHIgPSBwdHJfaW5zdGFuY2UtPndzaV9kaXNwbGF5X3Byb3BzMl9lbmFibGVkID8gKHZvaWQgKil2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgOiBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiIsIG5hbWUpKSB7CisgICAgICAgICphZGRyID0gcHRyX2luc3RhbmNlLT53c2lfZGlzcGxheV9wcm9wczJfZW5hYmxlZCA/ICh2b2lkICopdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIDogTlVMTDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghc3RyY21wKCJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiLCBuYW1lKSkgeworICAgICAgICAqYWRkciA9IHB0cl9pbnN0YW5jZS0+d3NpX2Rpc3BsYXlfcHJvcHMyX2VuYWJsZWQgPyAodm9pZCAqKXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiA6IE5VTEw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9sb2FkZXIvd3NpLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3dzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDRlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvbG9hZGVyL3dzaS5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSWFuIEVsbGlvdHQgPGlhbkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIFdTSV9ICisjZGVmaW5lIFdTSV9ICisKKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJsb2FkZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuaW9uIHsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICAgICAgVmtJY2RTdXJmYWNlV2F5bGFuZCB3YXlsYW5kX3N1cmY7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgVmtJY2RTdXJmYWNlV2luMzIgd2luX3N1cmY7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgICAgICBWa0ljZFN1cmZhY2VYY2IgeGNiX3N1cmY7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgICAgIFZrSWNkU3VyZmFjZVhsaWIgeGxpYl9zdXJmOworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgICAgIFZrSWNkU3VyZmFjZU1hY09TIG1hY29zX3N1cmY7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgICAgIFZrSWNkU3VyZmFjZU1ldGFsIG1ldGFsX3N1cmY7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgICAgICBWa0ljZFN1cmZhY2VEaXNwbGF5IGRpc3BsYXlfc3VyZjsKKyAgICAgICAgVmtJY2RTdXJmYWNlSGVhZGxlc3MgaGVhZGxlc3Nfc3VyZjsKKyAgICB9OworICAgIHVpbnQzMl90IGJhc2Vfc2l6ZTsgICAgICAgICAgICAvLyBTaXplIG9mIFZrSWNkU3VyZmFjZUJhc2UKKyAgICB1aW50MzJfdCBwbGF0Zm9ybV9zaXplOyAgICAgICAgLy8gU2l6ZSBvZiBjb3JyZXNwb25kaW5nIFZrSWNkU3VyZmFjZVhYWAorICAgIHVpbnQzMl90IG5vbl9wbGF0Zm9ybV9vZmZzZXQ7ICAvLyBTdGFydCBvZmZzZXQgdG8gYmFzZV9zaXplCisgICAgdWludDMyX3QgZW50aXJlX3NpemU7ICAgICAgICAgIC8vIFNpemUgb2YgZW50aXJlIFZrSWNkU3VyZmFjZQorICAgIFZrU3VyZmFjZUtIUiAqcmVhbF9pY2Rfc3VyZmFjZXM7Cit9IFZrSWNkU3VyZmFjZTsKKworYm9vbCB3c2lfc3dhcGNoYWluX2luc3RhbmNlX2dwYShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKiphZGRyKTsKKwordm9pZCB3c2lfY3JlYXRlX2luc3RhbmNlKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSwgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKTsKK2Jvb2wgd3NpX3Vuc3VwcG9ydGVkX2luc3RhbmNlX2V4dGVuc2lvbihjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKmV4dF9wcm9wKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVTd2FwY2hhaW5LSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIgKnBTd2FwY2hhaW4pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0Rlc3Ryb3lTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Jvb2wzMiAqcFN1cHBvcnRlZCk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiAqcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlRm9ybWF0S0hSICpwU3VyZmFjZUZvcm1hdHMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgdWludDMyX3QgKnBQcmVzZW50TW9kZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUHJlc2VudE1vZGVLSFIgKnBQcmVzZW50TW9kZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZVdpbjMyU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSICpwU3VyZmFjZSk7CitWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCk7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpOworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xfZGlzcGxheSAqZGlzcGxheSk7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlWGNiU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKTsKKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZCk7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0NyZWF0ZVhsaWJTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSICpwU3VyZmFjZSk7CitWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIERpc3BsYXkgKmRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsSUQgdmlzdWFsSUQpOworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKTsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVJT1NTdXJmYWNlTVZLKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpOworI2VuZGlmCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKQorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKTsKKyNlbmRpZgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgKnBQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgKnBQcm9wZXJ0aWVzKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHBsYW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcERpc3BsYXlDb3VudCwgVmtEaXNwbGF5S0hSICpwRGlzcGxheXMpOworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMpOworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlRGlzcGxheU1vZGVLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRGlzcGxheU1vZGVLSFIgKnBNb2RlKTsKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlNb2RlS0hSIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxhbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiAqcENhcGFiaWxpdGllcyk7CitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9DcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHRlcm1pbmF0b3JfQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N3YXBjaGFpbktIUiAqcFN3YXBjaGFpbnMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFJlY3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZWN0MkQqIHBSZWN0cyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB0ZXJtaW5hdG9yX0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdGVybWluYXRvcl9HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIgKnBEaXNwbGF5UGxhbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgKnBDYXBhYmlsaXRpZXMpOworCisjZW5kaWYgLy8gV1NJX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9zY3JpcHRzL2NoZWNrX2NvZGVfZm9ybWF0LnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvY2hlY2tfY29kZV9mb3JtYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGRlNDM3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9zY3JpcHRzL2NoZWNrX2NvZGVfZm9ybWF0LnNoCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoYykgMjAxNyBHb29nbGUgSW5jLgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIFNjcmlwdCB0byBkZXRlcm1pbmUgaWYgc291cmNlIGNvZGUgaW4gUHVsbCBSZXF1ZXN0IGlzIHByb3Blcmx5IGZvcm1hdHRlZC4KKyMgRXhpdHMgd2l0aCBub24gMCBleGl0IGNvZGUgaWYgZm9ybWF0dGluZyBpcyBuZWVkZWQuCisjCisjIFRoaXMgc2NyaXB0IGFzc3VtZXMgdG8gYmUgaW52b2tlZCBhdCB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeS4KKworUkVEPSdcMDMzWzA7MzFtJworR1JFRU49J1wwMzNbMDszMm0nCitOQz0nXDAzM1swbScgIyBObyBDb2xvcgorCitGSUxFU19UT19DSEVDSz0kKGdpdCBkaWZmIC0tbmFtZS1vbmx5IG1hc3RlciB8IGdyZXAgLXYgLUUgIl5pbmNsdWRlL3Z1bGthbiIgfCBncmVwIC1FICIuKlwuKGNwcHxjY3xjXCtcK3xjeHh8Y3xofGhwcCkkIikKKworaWYgWyAteiAiJHtGSUxFU19UT19DSEVDS30iIF07IHRoZW4KKyAgZWNobyAtZSAiJHtHUkVFTn1ObyBzb3VyY2UgY29kZSB0byBjaGVjayBmb3IgZm9ybWF0dGluZy4ke05DfSIKKyAgZXhpdCAwCitmaQorCitGT1JNQVRfRElGRj0kKGdpdCBkaWZmIC1VMCBtYXN0ZXIgLS0gJHtGSUxFU19UT19DSEVDS30gfCBweXRob24gLi9zY3JpcHRzL2NsYW5nLWZvcm1hdC1kaWZmLnB5IC1wMSAtc3R5bGU9ZmlsZSkKKworaWYgWyAteiAiJHtGT1JNQVRfRElGRn0iIF07IHRoZW4KKyAgZWNobyAtZSAiJHtHUkVFTn1BbGwgc291cmNlIGNvZGUgaW4gUFIgcHJvcGVybHkgZm9ybWF0dGVkLiR7TkN9IgorICBleGl0IDAKK2Vsc2UKKyAgZWNobyAtZSAiJHtSRUR9Rm91bmQgZm9ybWF0dGluZyBlcnJvcnMhJHtOQ30iCisgIGVjaG8gIiR7Rk9STUFUX0RJRkZ9IgorICBleGl0IDEKK2ZpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9jaGVja19jb21taXRfbWVzc2FnZV9mb3JtYXQuc2ggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9jaGVja19jb21taXRfbWVzc2FnZV9mb3JtYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjk2NjYzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9zY3JpcHRzL2NoZWNrX2NvbW1pdF9tZXNzYWdlX2Zvcm1hdC5zaApAQCAtMCwwICsxLDEwMiBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxOCBMdW5hckcsIEluYy4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBDaGVja3MgY29tbWl0IG1lc3NhZ2VzIGFnYWluc3QgcHJvamVjdCBzdGFuZGFyZHMgaW4gQ09OVFJJQlVUSU5HLm1kIGRvY3VtZW50CisjIFNjcmlwdCB0byBkZXRlcm1pbmUgaWYgY29tbWl0IG1lc3NhZ2VzIGluIFB1bGwgUmVxdWVzdCBhcmUgcHJvcGVybHkgZm9ybWF0dGVkLgorIyBFeGl0cyB3aXRoIG5vbiAwIGV4aXQgY29kZSBpZiByZWZvcm1hdHRpbmcgaXMgbmVlZGVkLgorCisjIERpc2FibGUgc3Vic2hlbGxzCitzaG9wdCAtcyBsYXN0cGlwZQorCitSRUQ9J1wwMzNbMDszMW0nCitHUkVFTj0nXDAzM1swOzMybScKK05DPSdcMDMzWzBtJyAjIE5vIENvbG9yCisKKyMgVFJBVklTX0NPTU1JVF9SQU5HRSBjb250YWlucyByYW5nZSBvZiBjb21taXRzIGZvciB0aGlzIFBSCisKKyMgR2V0IHVzZXItc3VwcGxpZWQgY29tbWl0IG1lc3NhZ2UgdGV4dCBmb3IgYXBwbGljYWJsZSBjb21taXRzIGFuZCBpbnNlcnQKKyMgYSB1bmlxdWUgc2VwYXJhdG9yIHN0cmluZyBpZGVudGlmaWVyLiBUaGUgZ2l0IGNvbW1hbmQgcmV0dXJucyBPTkxZIHRoZQorIyBzdWJqZWN0IGxpbmUgYW5kIGJvZHkgZm9yIGVhY2ggb2YgdGhlIGNvbW1pdHMuCitDT01NSVRfVEVYVD0kKGdpdCBsb2cgJHtUUkFWSVNfQ09NTUlUX1JBTkdFfSAtLXByZXR0eT1mb3JtYXQ6IlhYWE5FV0xJTkVYWFgiJW4lQikKKworIyBCYWlsIGlmIHRoZXJlIGFyZSBub25lCitpZiBbIC16ICIke0NPTU1JVF9URVhUfSIgXTsgdGhlbgorICBlY2hvIC1lICIke0dSRUVOfU5vIGNvbW1pdCBtZXNzZ2FnZXMgdG8gY2hlY2sgZm9yIGZvcm1hdHRpbmcuJHtOQ30iCisgIGV4aXQgMAorZWxpZiAhIGVjaG8gJFRSQVZJU19DT01NSVRfUkFOR0UgfCBncmVwIC1xICJcLlwuXC4iOyB0aGVuCisgIGVjaG8gLWUgIiR7R1JFRU59Tm8gY29tbWl0IG1lc3NnYWdlcyB0byBjaGVjayBmb3IgZm9ybWF0dGluZy4ke05DfSIKKyAgZXhpdCAwCitmaQorCisjIFByb2Nlc3MgY29tbWl0IG1lc3NhZ2VzCitzdWNjZXNzPTEKK2N1cnJlbnRfbGluZT0wCitwcmV2bGluZT0iIgorCisjIFByb2Nlc3MgZWFjaCBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZSBvdXRwdXQsIHJlc2V0dGluZyBjb3VudGVyIG9uIHNlcGFyYXRvcgorcHJpbnRmICVzICIkQ09NTUlUX1RFWFQiIHwgd2hpbGUgSUZTPScnIHJlYWQgLXIgbGluZTsgZG8KKyAgIyBlY2hvICJDb3VudCA9ICRjdXJyZW50X2xpbmUgPExpbmU+ID0gJGxpbmUiCisgIGN1cnJlbnRfbGluZT0kKChjdXJyZW50X2xpbmUrMSkpCisgIGlmIFsgIiRsaW5lIiA9ICJYWFhORVdMSU5FWFhYIiBdOyB0aGVuCisgICAgY3VycmVudF9saW5lPTAKKyAgZmkKKyAgY2hhcnM9JHsjbGluZX0KKyAgaWYgWyAkY3VycmVudF9saW5lIC1lcSAxIF07IHRoZW4KKyAgICAjIFN1YmplY3QgbGluZSBzaG91bGQgYmUgNTAgY2hhcnMgb3IgbGVzcyAoYnV0IGdpdmUgc29tZSBzbGFjayBoZXJlKQorICAgIGlmIFsgJGNoYXJzIC1ndCA1NCBdOyB0aGVuCisgICAgICBlY2hvICJUaGUgZm9sbG93aW5nIHN1YmplY3QgbGluZSBleGNlZWRzIDUwIGNoYXJhY3RlcnMgaW4gbGVuZ3RoLiIKKyAgICAgIGVjaG8gIiAgICAgJyRsaW5lJyIKKyAgICAgIHN1Y2Nlc3M9MAorICAgIGZpCisgICAgaT0kKCgkY2hhcnMtMSkpCisgICAgbGFzdF9jaGFyPSR7bGluZTokaToxfQorICAgICMgT3V0cHV0IGVycm9yIGlmIGxhc3QgY2hhciBvZiBzdWJqZWN0IGxpbmUgaXMgbm90IGFscGhhLW51bWVyaWMKKyAgICBpZiBbWyAhICRsYXN0X2NoYXIgPX4gWzAtOWEtekEtWl0gXV07IHRoZW4KKyAgICAgIGVjaG8gIkZvciB0aGUgZm9sbG93aW5nIGNvbW1pdCwgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdWJqZWN0IGxpbmUgbXVzdCBub3QgYmUgbm9uLWFscGhhbnVtZXJpYy4iCisgICAgICBlY2hvICIgICAgICckbGluZSciCisgICAgICBzdWNjZXNzPTAKKyAgICBmaQorICAgICMgQ2hlY2tpbmcgaWYgc3ViamVjdCBsaW5lIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnbW9kdWxlOiAnCisgICAgcHJlZml4PSQoZWNobyAkbGluZSB8IGN1dCAtZjEgLWQgIiAiKQorICAgIGlmIFsgIiR7cHJlZml4OiAtMX0iICE9ICI6IiBdOyB0aGVuCisgICAgICBlY2hvICJUaGUgZm9sbG93aW5nIHN1YmplY3QgbGluZSBtdXN0IHN0YXJ0IHdpdGggYSBzaW5nbGUgd29yZCBzcGVjaWZ5aW5nIHRoZSBmdW5jdGlvbmFsIGFyZWEgb2YgdGhlIGNoYW5nZSwgZm9sbG93ZWQgYnkgYSBjb2xvbiBhbmQgc3BhY2UuIEkuZS4sICdsYXllcnM6IFN1YmplY3QgbGluZSBoZXJlJyIKKyAgICAgIGVjaG8gIiAgICAgJyRsaW5lJyIKKyAgICAgIHN1Y2Nlc3M9MAorICAgIGZpCisgIGVsaWYgWyAkY3VycmVudF9saW5lIC1lcSAyIF07IHRoZW4KKyAgICAjIENvbW1pdCBtZXNzYWdlIG11c3QgaGF2ZSBhIGJsYW5rIGxpbmUgYmV0d2VlbiBzdWJqZWN0IGFuZCBib2R5CisgICAgaWYgWyAkY2hhcnMgLW5lIDAgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIGZvbGxvd2luZyBzdWJqZWN0IGxpbmUgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUuIgorICAgICAgZWNobyAiICAgICAnJHByZXZsaW5lJyIKKyAgICAgIHN1Y2Nlc3M9MAorICAgIGZpCisgIGVsc2UKKyAgICAjIExpbmVzIGluIGEgY29tbWl0IG1lc3NhZ2UgYm9keSBtdXN0IGJlIGxlc3MgdGhhbiA3MiBjaGFyYWN0ZXJzIGluIGxlbmd0aCAoYnV0IGdpdmUgc29tZSBzbGFjaykKKyAgICBpZiBbICRjaGFycyAtZ3QgNzYgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIGZvbGxvd2luZyBjb21taXQgbWVzc2FnZSBib2R5IGxpbmUgZXhjZWVkcyB0aGUgNzIgY2hhcmFjdGVyIGxpbWl0LiIKKyAgICAgIGVjaG8gIickbGluZVwnIgorICAgICAgc3VjY2Vzcz0wCisgICAgZmkKKyAgZmkKKyAgcHJldmxpbmU9JGxpbmUKK2RvbmUKKworaWYgWyAkc3VjY2VzcyAtZXEgMSBdOyB0aGVuCisgIGVjaG8gLWUgIiR7R1JFRU59QWxsIGNvbW1pdCBtZXNzYWdlcyBpbiBwdWxsIHJlcXVlc3QgYXJlIHByb3Blcmx5IGZvcm1hdHRlZC4ke05DfSIKKyAgZXhpdCAwCitlbHNlCisgIGV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9zY3JpcHRzL2NvbW1vbl9jb2RlZ2VuLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvY29tbW9uX2NvZGVnZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2ZWJhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9zY3JpcHRzL2NvbW1vbl9jb2RlZ2VuLnB5CkBAIC0wLDAgKzEsNzQgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMyAtaQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKworaW1wb3J0IG9zCisKKyMgQ29weXJpZ2h0IHRleHQgcHJlZml4aW5nIGFsbCBoZWFkZXJzIChsaXN0IG9mIHN0cmluZ3MpLgorcHJlZml4U3RyaW5ncyA9IFsKKyAgICAnLyonLAorICAgICcqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuJywKKyAgICAnKiogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgVmFsdmUgQ29ycG9yYXRpb24nLAorICAgICcqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgMjAxOSBMdW5hckcsIEluYy4nLAorICAgICcqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgMjAxOSBHb29nbGUgSW5jLicsCisgICAgJyoqJywKKyAgICAnKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7JywKKyAgICAnKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLicsCisgICAgJyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCcsCisgICAgJyoqJywKKyAgICAnKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcsCisgICAgJyoqJywKKyAgICAnKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZScsCisgICAgJyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsJywKKyAgICAnKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuJywKKyAgICAnKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCcsCisgICAgJyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLicsCisgICAgJyovJywKKyAgICAnJworXQorCisKK3BsYXRmb3JtX2RpY3QgPSB7CisgICAgJ2FuZHJvaWQnIDogJ1ZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUicsCisgICAgJ2Z1Y2hzaWEnIDogJ1ZLX1VTRV9QTEFURk9STV9GVUNIU0lBJywKKyAgICAnZ2dwJzogJ1ZLX1VTRV9QTEFURk9STV9HR1AnLAorICAgICdpb3MnIDogJ1ZLX1VTRV9QTEFURk9STV9JT1NfTVZLJywKKyAgICAnbWFjb3MnIDogJ1ZLX1VTRV9QTEFURk9STV9NQUNPU19NVksnLAorICAgICdtZXRhbCcgOiAnVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCcsCisgICAgJ3ZpJyA6ICdWS19VU0VfUExBVEZPUk1fVklfTk4nLAorICAgICd3YXlsYW5kJyA6ICdWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFInLAorICAgICd3aW4zMicgOiAnVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUicsCisgICAgJ3hjYicgOiAnVktfVVNFX1BMQVRGT1JNX1hDQl9LSFInLAorICAgICd4bGliJyA6ICdWS19VU0VfUExBVEZPUk1fWExJQl9LSFInLAorICAgICd4bGliX3hyYW5kcicgOiAnVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVCcsCit9CisKKyMKKyMgUmV0dXJuIGFwcHJvcHJpYXRlIGZlYXR1cmUgcHJvdGVjdCBzdHJpbmcgZnJvbSAncGxhdGZvcm0nIHRhZyBvbiBmZWF0dXJlCitkZWYgR2V0RmVhdHVyZVByb3RlY3QoaW50ZXJmYWNlKToKKyAgICAiIiJHZXQgcGxhdGZvcm0gcHJvdGVjdGlvbiBzdHJpbmciIiIKKyAgICBwbGF0Zm9ybSA9IGludGVyZmFjZS5nZXQoJ3BsYXRmb3JtJykKKyAgICBwcm90ZWN0ID0gTm9uZQorICAgIGlmIHBsYXRmb3JtIGlzIG5vdCBOb25lOgorICAgICAgICBwcm90ZWN0ID0gcGxhdGZvcm1fZGljdFtwbGF0Zm9ybV0KKyAgICByZXR1cm4gcHJvdGVjdAorCisjIGhlbHBlciB0byBkZWZpbmUgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdAorZGVmIHJlcG9fcmVsYXRpdmUocGF0aCk6CisgICAgcmV0dXJuIG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uJywgcGF0aCkpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9kaXNwYXRjaF90YWJsZV9oZWxwZXJfZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvZGlzcGF0Y2hfdGFibGVfaGVscGVyX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGE2NjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvZGlzcGF0Y2hfdGFibGVfaGVscGVyX2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDI0MCBAQAorIyEvdXNyL2Jpbi9weXRob24zIC1pCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorCitpbXBvcnQgb3MscmUsc3lzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIGV0cmVlCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgKgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorZnJvbSBjb21tb25fY29kZWdlbiBpbXBvcnQgKgorCisjCisjIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zIC0gc3ViY2xhc3Mgb2YgR2VuZXJhdG9yT3B0aW9ucy4KK2NsYXNzIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zKEdlbmVyYXRvck9wdGlvbnMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBjb252ZW50aW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gJy4nLAorICAgICAgICAgICAgICAgICBhcGluYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZW1pdHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgc29ydFByb2NlZHVyZSA9IHJlZ1NvcnRGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgcHJlZml4VGV4dCA9ICIiLAorICAgICAgICAgICAgICAgICBnZW5GdW5jUG9pbnRlcnMgPSBUcnVlLAorICAgICAgICAgICAgICAgICBhcGljYWxsID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5ID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5cCA9ICcnLAorICAgICAgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgPSBUcnVlKToKKyAgICAgICAgR2VuZXJhdG9yT3B0aW9ucy5fX2luaXRfXyhzZWxmLCBjb252ZW50aW9ucywgZmlsZW5hbWUsIGRpcmVjdG9yeSwgYXBpbmFtZSwgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucywgZW1pdHZlcnNpb25zLCBkZWZhdWx0RXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zLCByZW1vdmVFeHRlbnNpb25zLCBlbWl0RXh0ZW5zaW9ucywgc29ydFByb2NlZHVyZSkKKyAgICAgICAgc2VsZi5wcmVmaXhUZXh0ICAgICAgPSBwcmVmaXhUZXh0CisgICAgICAgIHNlbGYuZ2VuRnVuY1BvaW50ZXJzID0gZ2VuRnVuY1BvaW50ZXJzCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gTm9uZQorICAgICAgICBzZWxmLmFwaWNhbGwgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgPSBhcGllbnRyeQorICAgICAgICBzZWxmLmFwaWVudHJ5cCAgICAgICA9IGFwaWVudHJ5cAorICAgICAgICBzZWxmLmFsaWduRnVuY1BhcmFtICA9IGFsaWduRnVuY1BhcmFtCisjCisjIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3IgLSBzdWJjbGFzcyBvZiBPdXRwdXRHZW5lcmF0b3IuCisjIEdlbmVyYXRlcyBkaXNwYXRjaCB0YWJsZSBoZWxwZXIgaGVhZGVyIGZpbGVzIGZvciBMVkwKK2NsYXNzIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3IoT3V0cHV0R2VuZXJhdG9yKToKKyAgICAiIiJHZW5lcmF0ZSBkaXNwYXRjaCB0YWJsZSBoZWxwZXIgaGVhZGVyIGJhc2VkIG9uIFhNTCBlbGVtZW50IGF0dHJpYnV0ZXMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgZXJyRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIHdhcm5GaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgZGlhZ0ZpbGUgPSBzeXMuc3Rkb3V0KToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkKKyAgICAgICAgIyBJbnRlcm5hbCBzdGF0ZSAtIGFjY3VtdWxhdG9ycyBmb3IgZGlmZmVyZW50IGlubmVyIGJsb2NrIHRleHQKKyAgICAgICAgc2VsZi5pbnN0YW5jZV9kaXNwYXRjaF9saXN0ID0gW10gICAgICAjIExpc3Qgb2YgZW50cmllcyBmb3IgaW5zdGFuY2UgZGlzcGF0Y2ggbGlzdAorICAgICAgICBzZWxmLmRldmljZV9kaXNwYXRjaF9saXN0ID0gW10gICAgICAgICMgTGlzdCBvZiBlbnRyaWVzIGZvciBkZXZpY2UgZGlzcGF0Y2ggbGlzdAorICAgICAgICBzZWxmLmRldl9leHRfc3R1Yl9saXN0ID0gW10gICAgICAgICAgICMgTGlzdCBvZiBzdHViIGZ1bmN0aW9ucyBmb3IgZGV2aWNlIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5kZXZpY2VfZXh0ZW5zaW9uX2xpc3QgPSBbXSAgICAgICAjIExpc3Qgb2YgZGV2aWNlIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5leHRlbnNpb25fdHlwZSA9ICcnCisgICAgIworICAgICMgQ2FsbGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bgorICAgIGRlZiBiZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cykKKyAgICAgICAgd3JpdGUoIiNwcmFnbWEgb25jZSIsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAjIFVzZXItc3VwcGxpZWQgcHJlZml4IHRleHQsIGlmIGFueSAobGlzdCBvZiBzdHJpbmdzKQorICAgICAgICBpZiAoZ2VuT3B0cy5wcmVmaXhUZXh0KToKKyAgICAgICAgICAgIGZvciBzIGluIGdlbk9wdHMucHJlZml4VGV4dDoKKyAgICAgICAgICAgICAgICB3cml0ZShzLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgIyBGaWxlIENvbW1lbnQKKyAgICAgICAgZmlsZV9jb21tZW50ID0gJy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqXG4nCisgICAgICAgIGZpbGVfY29tbWVudCArPSAnLy8gU2VlIGRpc3BhdGNoX2hlbHBlcl9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnNcbicKKyAgICAgICAgd3JpdGUoZmlsZV9jb21tZW50LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgIyBDb3B5cmlnaHQgTm90aWNlCisgICAgICAgIGNvcHlyaWdodCA9ICAnLypcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb25cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpO1xuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKi9cbicKKworICAgICAgICBwcmVhbWJsZSA9ICcnCisgICAgICAgIHByZWFtYmxlICs9ICcjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPlxuJworICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgPHZ1bGthbi92a19sYXllci5oPlxuJworICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgPHN0cmluZy5oPlxuJworICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgInZrX2xheWVyX2Rpc3BhdGNoX3RhYmxlLmgiXG4nCisKKyAgICAgICAgd3JpdGUoY29weXJpZ2h0LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUocHJlYW1ibGUsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICMKKyAgICAjIFdyaXRlIGdlbmVyYXRlIGFuZCB3cml0ZSBkaXNwYXRjaCB0YWJsZXMgdG8gb3V0cHV0IGZpbGUKKyAgICBkZWYgZW5kRmlsZShzZWxmKToKKyAgICAgICAgZGV2aWNlX3RhYmxlID0gJycKKyAgICAgICAgaW5zdGFuY2VfdGFibGUgPSAnJworCisgICAgICAgIGRldmljZV90YWJsZSArPSBzZWxmLk91dHB1dERpc3BhdGNoVGFibGVIZWxwZXIoJ2RldmljZScpCisgICAgICAgIGluc3RhbmNlX3RhYmxlICs9IHNlbGYuT3V0cHV0RGlzcGF0Y2hUYWJsZUhlbHBlcignaW5zdGFuY2UnKQorCisgICAgICAgIGZvciBzdHViIGluIHNlbGYuZGV2X2V4dF9zdHViX2xpc3Q6CisgICAgICAgICAgICB3cml0ZShzdHViLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUoIlxuXG4iLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUoZGV2aWNlX3RhYmxlLCBmaWxlPXNlbGYub3V0RmlsZSk7CisgICAgICAgIHdyaXRlKCJcbiIsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICB3cml0ZShpbnN0YW5jZV90YWJsZSwgZmlsZT1zZWxmLm91dEZpbGUpOworCisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorICAgICMKKyAgICAjIFByb2Nlc3NpbmcgYXQgYmVnaW5uaW5nIG9mIGVhY2ggZmVhdHVyZSBvciBleHRlbnNpb24KKyAgICBkZWYgYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KQorICAgICAgICBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgPSBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpCisgICAgICAgIHNlbGYuZXh0ZW5zaW9uX3R5cGUgPSBpbnRlcmZhY2UuZ2V0KCd0eXBlJykKKworICAgICMKKyAgICAjIFByb2Nlc3MgY29tbWFuZHMsIGFkZGluZyB0byBhcHByb3ByaWF0ZSBkaXNwYXRjaCB0YWJsZXMKKyAgICBkZWYgZ2VuQ21kKHNlbGYsIGNtZGluZm8sIG5hbWUsIGFsaWFzKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlbkNtZChzZWxmLCBjbWRpbmZvLCBuYW1lLCBhbGlhcykKKworICAgICAgICBhdm9pZF9lbnRyaWVzID0gWyd2a0NyZWF0ZUluc3RhbmNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndmtDcmVhdGVEZXZpY2UnXQorICAgICAgICAjIEdldCBmaXJzdCBwYXJhbSB0eXBlCisgICAgICAgIHBhcmFtcyA9IGNtZGluZm8uZWxlbS5maW5kYWxsKCdwYXJhbScpCisgICAgICAgIGluZm8gPSBzZWxmLmdldFR5cGVOYW1lVHVwbGUocGFyYW1zWzBdKQorCisgICAgICAgIGlmIG5hbWUgbm90IGluIGF2b2lkX2VudHJpZXM6CisgICAgICAgICAgICBzZWxmLkFkZENvbW1hbmRUb0Rpc3BhdGNoTGlzdChuYW1lLCBpbmZvWzBdLCBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsIGNtZGluZm8pCisKKyAgICAjCisgICAgIyBEZXRlcm1pbmUgaWYgdGhpcyBBUEkgc2hvdWxkIGJlIGlnbm9yZWQgb3IgYWRkZWQgdG8gdGhlIGluc3RhbmNlIG9yIGRldmljZSBkaXNwYXRjaCB0YWJsZQorICAgIGRlZiBBZGRDb21tYW5kVG9EaXNwYXRjaExpc3Qoc2VsZiwgbmFtZSwgaGFuZGxlX3R5cGUsIHByb3RlY3QsIGNtZGluZm8pOgorICAgICAgICBoYW5kbGUgPSBzZWxmLnJlZ2lzdHJ5LnRyZWUuZmluZCgidHlwZXMvdHlwZS9bbmFtZT0nIiArIGhhbmRsZV90eXBlICsgIiddW0BjYXRlZ29yeT0naGFuZGxlJ10iKQorICAgICAgICBpZiBoYW5kbGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBoYW5kbGVfdHlwZSAhPSAnVmtJbnN0YW5jZScgYW5kIGhhbmRsZV90eXBlICE9ICdWa1BoeXNpY2FsRGV2aWNlJyBhbmQgbmFtZSAhPSAndmtHZXRJbnN0YW5jZVByb2NBZGRyJzoKKyAgICAgICAgICAgIHNlbGYuZGV2aWNlX2Rpc3BhdGNoX2xpc3QuYXBwZW5kKChuYW1lLCBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QpKQorICAgICAgICAgICAgaWYgIlZLX1ZFUlNJT04iIG5vdCBpbiBzZWxmLmZlYXR1cmVOYW1lIGFuZCBzZWxmLmV4dGVuc2lvbl90eXBlID09ICdkZXZpY2UnOgorICAgICAgICAgICAgICAgIHNlbGYuZGV2aWNlX2V4dGVuc2lvbl9saXN0LmFwcGVuZChuYW1lKQorICAgICAgICAgICAgICAgICMgQnVpbGQgdXAgc3R1YiBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHJldHVybl90eXBlID0gJycKKyAgICAgICAgICAgICAgICBkZWNsID0gc2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSlbMV0KKyAgICAgICAgICAgICAgICBpZiAndHlwZWRlZiBWa1Jlc3VsdCcgaW4gZGVjbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgPSAncmV0dXJuIFZLX1NVQ0NFU1M7JworICAgICAgICAgICAgICAgIGRlY2wgPSBkZWNsLnNwbGl0KCcqUEZOX3ZrJylbMV0KKyAgICAgICAgICAgICAgICBkZWNsID0gZGVjbC5yZXBsYWNlKCcpKCcsICcoJykKKyAgICAgICAgICAgICAgICBpZiByZXR1cm5fdHlwZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgZGVjbCA9ICdzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YicgKyBkZWNsCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVjbCA9ICdzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWInICsgZGVjbAorICAgICAgICAgICAgICAgIGZ1bmNfYm9keSA9ICcgeyAnICsgcmV0dXJuX3R5cGUgKyAnIH07JworICAgICAgICAgICAgICAgIGRlY2wgPSBkZWNsLnJlcGxhY2UgKCc7JywgZnVuY19ib2R5KQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXZfZXh0X3N0dWJfbGlzdC5hcHBlbmQoJyNpZmRlZiAlcycgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QpCisgICAgICAgICAgICAgICAgc2VsZi5kZXZfZXh0X3N0dWJfbGlzdC5hcHBlbmQoZGVjbCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGV2X2V4dF9zdHViX2xpc3QuYXBwZW5kKCcjZW5kaWYgLy8gJXMnICUgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pbnN0YW5jZV9kaXNwYXRjaF9saXN0LmFwcGVuZCgobmFtZSwgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0KSkKKyAgICAgICAgcmV0dXJuCisgICAgIworICAgICMgUmV0cmlldmUgdGhlIHR5cGUgYW5kIG5hbWUgZm9yIGEgcGFyYW1ldGVyCisgICAgZGVmIGdldFR5cGVOYW1lVHVwbGUoc2VsZiwgcGFyYW0pOgorICAgICAgICB0eXBlID0gJycKKyAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gJ3R5cGUnOgorICAgICAgICAgICAgICAgIHR5cGUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgICAgIGVsaWYgZWxlbS50YWcgPT0gJ25hbWUnOgorICAgICAgICAgICAgICAgIG5hbWUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgcmV0dXJuICh0eXBlLCBuYW1lKQorICAgICMKKyAgICAjIENyZWF0ZSBhIGRpc3BhdGNoIHRhYmxlIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxpc3QgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZworICAgIGRlZiBPdXRwdXREaXNwYXRjaFRhYmxlSGVscGVyKHNlbGYsIHRhYmxlX3R5cGUpOgorICAgICAgICBlbnRyaWVzID0gW10KKyAgICAgICAgdGFibGUgPSAnJworICAgICAgICBpZiB0YWJsZV90eXBlID09ICdkZXZpY2UnOgorICAgICAgICAgICAgZW50cmllcyA9IHNlbGYuZGV2aWNlX2Rpc3BhdGNoX2xpc3QKKyAgICAgICAgICAgIHRhYmxlICs9ICdzdGF0aWMgaW5saW5lIHZvaWQgbGF5ZXJfaW5pdF9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoVmtEZXZpY2UgZGV2aWNlLCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqdGFibGUsIFBGTl92a0dldERldmljZVByb2NBZGRyIGdwYSkge1xuJworICAgICAgICAgICAgdGFibGUgKz0gJyAgICBtZW1zZXQodGFibGUsIDAsIHNpemVvZigqdGFibGUpKTtcbicKKyAgICAgICAgICAgIHRhYmxlICs9ICcgICAgLy8gRGV2aWNlIGZ1bmN0aW9uIHBvaW50ZXJzXG4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnRyaWVzID0gc2VsZi5pbnN0YW5jZV9kaXNwYXRjaF9saXN0CisgICAgICAgICAgICB0YWJsZSArPSAnc3RhdGljIGlubGluZSB2b2lkIGxheWVyX2luaXRfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqdGFibGUsIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ3BhKSB7XG4nCisgICAgICAgICAgICB0YWJsZSArPSAnICAgIG1lbXNldCh0YWJsZSwgMCwgc2l6ZW9mKCp0YWJsZSkpO1xuJworICAgICAgICAgICAgdGFibGUgKz0gJyAgICAvLyBJbnN0YW5jZSBmdW5jdGlvbiBwb2ludGVyc1xuJworCisgICAgICAgIGZvciBpdGVtIGluIGVudHJpZXM6CisgICAgICAgICAgICAjIFJlbW92ZSAndmsnIGZyb20gcHJvdG8gbmFtZQorICAgICAgICAgICAgYmFzZV9uYW1lID0gaXRlbVswXVsyOl0KKworICAgICAgICAgICAgaWYgaXRlbVsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgaXRlbVsxXQorCisgICAgICAgICAgICAjIElmIHdlJ3JlIGxvb2tpbmcgZm9yIHRoZSBwcm9jIHdlIGFyZSBwYXNzaW5nIGluLCBqdXN0IHBvaW50IHRoZSB0YWJsZSB0byBpdC4gIFRoaXMgZml4ZXMgdGhlIGlzc3VlIHdoZXJlCisgICAgICAgICAgICAjIGEgbGF5ZXIgb3ZlcnJpZGVzIHRoZSBmdW5jdGlvbiBuYW1lIGZvciB0aGUgbG9hZGVyLgorICAgICAgICAgICAgaWYgKHRhYmxlX3R5cGUgPT0gJ2RldmljZScgYW5kIGJhc2VfbmFtZSA9PSAnR2V0RGV2aWNlUHJvY0FkZHInKToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnICAgIHRhYmxlLT5HZXREZXZpY2VQcm9jQWRkciA9IGdwYTtcbicKKyAgICAgICAgICAgIGVsaWYgKHRhYmxlX3R5cGUgIT0gJ2RldmljZScgYW5kIGJhc2VfbmFtZSA9PSAnR2V0SW5zdGFuY2VQcm9jQWRkcicpOgorICAgICAgICAgICAgICAgIHRhYmxlICs9ICcgICAgdGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIgPSBncGE7XG4nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRhYmxlICs9ICcgICAgdGFibGUtPiVzID0gKFBGTl8lcykgZ3BhKCVzLCAiJXMiKTtcbicgJSAoYmFzZV9uYW1lLCBpdGVtWzBdLCB0YWJsZV90eXBlLCBpdGVtWzBdKQorICAgICAgICAgICAgaWYgaXRlbVswXSBpbiBzZWxmLmRldmljZV9leHRlbnNpb25fbGlzdDoKKyAgICAgICAgICAgICAgICBzdHViX2NoZWNrID0gJyAgICBpZiAodGFibGUtPiVzID09IG51bGxwdHIpIHsgdGFibGUtPiVzID0gKFBGTl8lcylTdHViJXM7IH1cbicgJSAoYmFzZV9uYW1lLCBiYXNlX25hbWUsIGl0ZW1bMF0sIGJhc2VfbmFtZSkKKyAgICAgICAgICAgICAgICB0YWJsZSArPSBzdHViX2NoZWNrCisgICAgICAgICAgICBpZiBpdGVtWzFdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBpdGVtWzFdCisKKyAgICAgICAgdGFibGUgKz0gJ30nCisgICAgICAgIHJldHVybiB0YWJsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvZ2VuZXJhdGVfc291cmNlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvZ2VuZXJhdGVfc291cmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxMjc0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkKQEAgLTAsMCArMSwxMTMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMgQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxOSBMdW5hckcsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogTWlrZSBTY2h1Y2hhcmR0IDxtaWtlc0BsdW5hcmcuY29tPgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBjb21tb25fY29kZWdlbgoraW1wb3J0IGZpbGVjbXAKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQorCisjIGZpbGVzIHRvIGV4Y2x1ZGUgZnJvbSAtLXZlcmlmeSBjaGVjawordmVyaWZ5X2V4Y2x1ZGUgPSBbJy5jbGFuZy1mb3JtYXQnXQorCitkZWYgbWFpbihhcmd2KToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0nR2VuZXJhdGUgc291cmNlIGNvZGUgZm9yIHRoaXMgcmVwb3NpdG9yeScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgncmVnaXN0cnknLCBtZXRhdmFyPSdSRUdJU1RSWV9QQVRIJywgaGVscD0ncGF0aCB0byB0aGUgVnVsa2FuLUhlYWRlcnMgcmVnaXN0cnkgZGlyZWN0b3J5JykKKyAgICBncm91cCA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKCkKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1pJywgJy0taW5jcmVtZW50YWwnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdvbmx5IHVwZGF0ZSByZXBvIGZpbGVzIHRoYXQgY2hhbmdlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy12JywgJy0tdmVyaWZ5JywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0ndmVyaWZ5IHJlcG8gZmlsZXMgbWF0Y2ggZ2VuZXJhdG9yIG91dHB1dCcpCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCisKKyAgICBnZW5fY21kcyA9IFtbY29tbW9uX2NvZGVnZW4ucmVwb19yZWxhdGl2ZSgnc2NyaXB0cy9sb2FkZXJfZ2VudmsucHknKSwKKyAgICAgICAgICAgICAgICAgJy1yZWdpc3RyeScsIG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oYXJncy5yZWdpc3RyeSwgICd2ay54bWwnKSksCisgICAgICAgICAgICAgICAgICctcXVpZXQnLAorICAgICAgICAgICAgICAgICBmaWxlbmFtZV0gZm9yIGZpbGVuYW1lIGluIFsndmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a19sb2FkZXJfZXh0ZW5zaW9ucy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrX2xvYWRlcl9leHRlbnNpb25zLmMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtfb2JqZWN0X3R5cGVzLmgnXV0KKworICAgIHJlcG9fZGlyID0gY29tbW9uX2NvZGVnZW4ucmVwb19yZWxhdGl2ZSgnbG9hZGVyL2dlbmVyYXRlZCcpCisKKyAgICAjIGdldCBkaXJlY3Rvcnkgd2hlcmUgZ2VuZXJhdG9ycyB3aWxsIHJ1bgorICAgIGlmIGFyZ3MudmVyaWZ5IG9yIGFyZ3MuaW5jcmVtZW50YWw6CisgICAgICAgICMgZ2VuZXJhdGUgaW4gdGVtcCBkaXJlY3Rvcnkgc28gd2UgY2FuIGNvbXBhcmUgb3IgY29weSBsYXRlcgorICAgICAgICB0ZW1wX29iaiA9IHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeShwcmVmaXg9J1Z1bGthbkxvYWRlcl9nZW5lcmF0ZWRfc291cmNlXycpCisgICAgICAgIHRlbXBfZGlyID0gdGVtcF9vYmoubmFtZQorICAgICAgICBnZW5fZGlyID0gdGVtcF9kaXIKKyAgICBlbHNlOgorICAgICAgICAjIGdlbmVyYXRlIGRpcmVjdGx5IGluIHRoZSByZXBvCisgICAgICAgIGdlbl9kaXIgPSByZXBvX2RpcgorCisgICAgIyBydW4gZWFjaCBjb2RlIGdlbmVyYXRvcgorICAgIGZvciBjbWQgaW4gZ2VuX2NtZHM6CisgICAgICAgIHByaW50KCcgJy5qb2luKGNtZCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbc3lzLmV4ZWN1dGFibGVdICsgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGdlbmVyYXRvciBvdXRwdXQsIHZrX3ZhbGlkYXRpb25fc3RhdHMucHkgaXMgZXNwZWNpYWxseSBub2lzeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkPWdlbl9kaXIpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHByaW50KCdFUlJPUjonLCBzdHIoZSkpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgIyBvcHRpb25hbCBwb3N0LWdlbmVyYXRpb24gc3RlcHMKKyAgICBpZiBhcmdzLnZlcmlmeToKKyAgICAgICAgIyBjb21wYXJlIGNvbnRlbnRzIG9mIHRlbXAgZGlyIGFuZCByZXBvCisgICAgICAgIHRlbXBfZmlsZXMgPSBzZXQob3MubGlzdGRpcih0ZW1wX2RpcikpCisgICAgICAgIHJlcG9fZmlsZXMgPSBzZXQob3MubGlzdGRpcihyZXBvX2RpcikpCisgICAgICAgIGZpbGVzX21hdGNoID0gVHJ1ZQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gc29ydGVkKCh0ZW1wX2ZpbGVzIHwgcmVwb19maWxlcykgLSBzZXQodmVyaWZ5X2V4Y2x1ZGUpKToKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lIG5vdCBpbiByZXBvX2ZpbGVzOgorICAgICAgICAgICAgICAgIHByaW50KCdFUlJPUjogTWlzc2luZyByZXBvIGZpbGUnLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBmaWxlc19tYXRjaCA9IEZhbHNlCisgICAgICAgICAgICBlbGlmIGZpbGVuYW1lIG5vdCBpbiB0ZW1wX2ZpbGVzOgorICAgICAgICAgICAgICAgIHByaW50KCdFUlJPUjogTWlzc2luZyBnZW5lcmF0b3IgZm9yJywgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZmlsZXNfbWF0Y2ggPSBGYWxzZQorICAgICAgICAgICAgZWxpZiBub3QgZmlsZWNtcC5jbXAob3MucGF0aC5qb2luKHRlbXBfZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHJlcG9fZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGxvdz1GYWxzZSk6CisgICAgICAgICAgICAgICAgcHJpbnQoJ0VSUk9SOiBSZXBvIGZpbGVzIGRvIG5vdCBtYXRjaCBnZW5lcmF0b3Igb3V0cHV0IGZvcicsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGZpbGVzX21hdGNoID0gRmFsc2UKKworICAgICAgICAjIHJldHVybiBjb2RlIGZvciB0ZXN0IHNjcmlwdHMKKyAgICAgICAgaWYgZmlsZXNfbWF0Y2g6CisgICAgICAgICAgICBwcmludCgnU1VDQ0VTUzogUmVwbyBmaWxlcyBtYXRjaCBnZW5lcmF0b3Igb3V0cHV0JykKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiAxCisKKyAgICBlbGlmIGFyZ3MuaW5jcmVtZW50YWw6CisgICAgICAgICMgY29weSBtaXNzaW5nIG9yIGRpZmZlcmluZyBmaWxlcyBmcm9tIHRlbXAgZGlyZWN0b3J5IHRvIHJlcG8KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIodGVtcF9kaXIpOgorICAgICAgICAgICAgdGVtcF9maWxlbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICByZXBvX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHJlcG9fZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZXBvX2ZpbGVuYW1lKSBvciBcCisgICAgICAgICAgICAgICBub3QgZmlsZWNtcC5jbXAodGVtcF9maWxlbmFtZSwgcmVwb19maWxlbmFtZSwgc2hhbGxvdz1GYWxzZSk6CisgICAgICAgICAgICAgICAgcHJpbnQoJ3VwZGF0ZScsIHJlcG9fZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHRlbXBfZmlsZW5hbWUsIHJlcG9fZmlsZW5hbWUpCisKKyAgICByZXR1cm4gMAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvaGVscGVyX2ZpbGVfZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvaGVscGVyX2ZpbGVfZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDQ1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9oZWxwZXJfZmlsZV9nZW5lcmF0b3IucHkKQEAgLTAsMCArMSw1MTMgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMyAtaQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyMgQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisjIEF1dGhvcjogSm9obiBadWxhdWYgPGp6dWxhdWZAbHVuYXJnLmNvbT4KKworaW1wb3J0IG9zLHJlLHN5cworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBldHJlZQorZnJvbSBnZW5lcmF0b3IgaW1wb3J0ICoKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKK2Zyb20gY29tbW9uX2NvZGVnZW4gaW1wb3J0ICoKKworIworIyBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucyAtIHN1YmNsYXNzIG9mIEdlbmVyYXRvck9wdGlvbnMuCitjbGFzcyBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucyhHZW5lcmF0b3JPcHRpb25zKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgY29udmVudGlvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9ICcuJywKKyAgICAgICAgICAgICAgICAgYXBpbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBOb25lLAorICAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHNvcnRQcm9jZWR1cmUgPSByZWdTb3J0RmVhdHVyZXMsCisgICAgICAgICAgICAgICAgIHByZWZpeFRleHQgPSAiIiwKKyAgICAgICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdEZpbGUgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0RmVhdHVyZSA9IFRydWUsCisgICAgICAgICAgICAgICAgIGFwaWNhbGwgPSAnJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnkgPSAnJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnlwID0gJycsCisgICAgICAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICAgbGlicmFyeV9uYW1lID0gJycsCisgICAgICAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgPSBUcnVlLAorICAgICAgICAgICAgICAgICBoZWxwZXJfZmlsZV90eXBlID0gJycpOgorICAgICAgICBHZW5lcmF0b3JPcHRpb25zLl9faW5pdF9fKHNlbGYsIGNvbnZlbnRpb25zLCBmaWxlbmFtZSwgZGlyZWN0b3J5LCBhcGluYW1lLCBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zLCBlbWl0dmVyc2lvbnMsIGRlZmF1bHRFeHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMsIHJlbW92ZUV4dGVuc2lvbnMsIGVtaXRFeHRlbnNpb25zLCBzb3J0UHJvY2VkdXJlKQorICAgICAgICBzZWxmLnByZWZpeFRleHQgICAgICAgPSBwcmVmaXhUZXh0CisgICAgICAgIHNlbGYuZ2VuRnVuY1BvaW50ZXJzICA9IGdlbkZ1bmNQb2ludGVycworICAgICAgICBzZWxmLnByb3RlY3RGaWxlICAgICAgPSBwcm90ZWN0RmlsZQorICAgICAgICBzZWxmLnByb3RlY3RGZWF0dXJlICAgPSBwcm90ZWN0RmVhdHVyZQorICAgICAgICBzZWxmLmFwaWNhbGwgICAgICAgICAgPSBhcGljYWxsCisgICAgICAgIHNlbGYuYXBpZW50cnkgICAgICAgICA9IGFwaWVudHJ5CisgICAgICAgIHNlbGYuYXBpZW50cnlwICAgICAgICA9IGFwaWVudHJ5cAorICAgICAgICBzZWxmLmFsaWduRnVuY1BhcmFtICAgPSBhbGlnbkZ1bmNQYXJhbQorICAgICAgICBzZWxmLmxpYnJhcnlfbmFtZSAgICAgPSBsaWJyYXJ5X25hbWUKKyAgICAgICAgc2VsZi5oZWxwZXJfZmlsZV90eXBlID0gaGVscGVyX2ZpbGVfdHlwZQorIworIyBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yIC0gc3ViY2xhc3Mgb2YgT3V0cHV0R2VuZXJhdG9yLiBPdXRwdXRzIFZ1bGthbiBoZWxwZXIgZmlsZXMKK2NsYXNzIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3IoT3V0cHV0R2VuZXJhdG9yKToKKyAgICAiIiJHZW5lcmF0ZSBoZWxwZXIgZmlsZSBiYXNlZCBvbiBYTUwgZWxlbWVudCBhdHRyaWJ1dGVzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGVyckZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICB3YXJuRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIGRpYWdGaWxlID0gc3lzLnN0ZG91dCk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5fX2luaXRfXyhzZWxmLCBlcnJGaWxlLCB3YXJuRmlsZSwgZGlhZ0ZpbGUpCisgICAgICAgICMgSW50ZXJuYWwgc3RhdGUgLSBhY2N1bXVsYXRvcnMgZm9yIGRpZmZlcmVudCBpbm5lciBibG9jayB0ZXh0CisgICAgICAgIHNlbGYuZW51bV9vdXRwdXQgPSAnJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJpbmcgYnVpbHQgdXAgb2YgZW51bSBzdHJpbmcgcm91dGluZXMKKyAgICAgICAgIyBJbnRlcm5hbCBzdGF0ZSAtIGFjY3VtdWxhdG9ycyBmb3IgZGlmZmVyZW50IGlubmVyIGJsb2NrIHRleHQKKyAgICAgICAgc2VsZi5zdHJ1Y3ROYW1lcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIExpc3Qgb2YgVnVsa2FuIHN0cnVjdCB0eXBlbmFtZXMKKyAgICAgICAgc2VsZi5zdHJ1Y3RUeXBlcyA9IGRpY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hcCBvZiBWdWxrYW4gc3RydWN0IHR5cGVuYW1lIHRvIHJlcXVpcmVkIFZrU3RydWN0dXJlVHlwZQorICAgICAgICBzZWxmLnN0cnVjdE1lbWJlcnMgPSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTGlzdCBvZiBTdHJ1Y3RNZW1iZXJEYXRhIHJlY29yZHMgZm9yIGFsbCBWdWxrYW4gc3RydWN0cworICAgICAgICBzZWxmLm9iamVjdF90eXBlcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTGlzdCBvZiBhbGwgaGFuZGxlIHR5cGVzCisgICAgICAgIHNlbGYub2JqZWN0X3R5cGVfYWxpYXNlcyA9IFtdICAgICAgICAgICAgICAgICAgICAgIyBBbGlhc2VzIHRvIGhhbmRsZXMgdHlwZXMgKGZvciBoYW5kbGVzIHRoYXQgd2VyZSBleHRlbnNpb25zKQorICAgICAgICBzZWxmLmRlYnVnX3JlcG9ydF9vYmplY3RfdHlwZXMgPSBbXSAgICAgICAgICAgICAgICMgSGFuZHkgY29weSBvZiBkZWJ1Z19yZXBvcnRfb2JqZWN0X3R5cGUgZW51bSBkYXRhCisgICAgICAgIHNlbGYuY29yZV9vYmplY3RfdHlwZXMgPSBbXSAgICAgICAgICAgICAgICAgICAgICAgIyBIYW5keSBjb3B5IG9mIGNvcmVfb2JqZWN0X3R5cGUgZW51bSBkYXRhCisgICAgICAgIHNlbGYuZGV2aWNlX2V4dGVuc2lvbl9pbmZvID0gZGljdCgpICAgICAgICAgICAgICAgIyBEaWN0IG9mIGRldmljZSBleHRlbnNpb24gbmFtZSBkZWZpbmVzIGFuZCBpZmRlZiB2YWx1ZXMKKyAgICAgICAgc2VsZi5pbnN0YW5jZV9leHRlbnNpb25faW5mbyA9IGRpY3QoKSAgICAgICAgICAgICAjIERpY3Qgb2YgaW5zdGFuY2UgZXh0ZW5zaW9uIG5hbWUgZGVmaW5lcyBhbmQgaWZkZWYgdmFsdWVzCisKKyAgICAgICAgIyBOYW1lZCB0dXBsZXMgdG8gc3RvcmUgc3RydWN0IGFuZCBjb21tYW5kIGRhdGEKKyAgICAgICAgc2VsZi5TdHJ1Y3RUeXBlID0gbmFtZWR0dXBsZSgnU3RydWN0VHlwZScsIFsnbmFtZScsICd2YWx1ZSddKQorICAgICAgICBzZWxmLkNvbW1hbmRQYXJhbSA9IG5hbWVkdHVwbGUoJ0NvbW1hbmRQYXJhbScsIFsndHlwZScsICduYW1lJywgJ2lzcG9pbnRlcicsICdpc3N0YXRpY2FycmF5JywgJ2lzY29uc3QnLCAnaXNjb3VudCcsICdsZW4nLCAnZXh0c3RydWN0cycsICdjZGVjbCddKQorICAgICAgICBzZWxmLlN0cnVjdE1lbWJlckRhdGEgPSBuYW1lZHR1cGxlKCdTdHJ1Y3RNZW1iZXJEYXRhJywgWyduYW1lJywgJ21lbWJlcnMnLCAnaWZkZWZfcHJvdGVjdCddKQorCisgICAgICAgIHNlbGYuY3VzdG9tX2NvbnN0cnVjdF9wYXJhbXMgPSB7CisgICAgICAgICAgICAjIHNhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBuZWVkcyB0byBrbm93IGlmIHN1YnBhc3MgaGFzIGNvbG9yIGFuZFxvciBkZXB0aFxzdGVuY2lsIGF0dGFjaG1lbnRzIHRvIHVzZSBpdHMgcG9pbnRlcnMKKyAgICAgICAgICAgICdWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvJyA6CisgICAgICAgICAgICAgICAgJywgY29uc3QgYm9vbCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQsIGNvbnN0IGJvb2wgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCcsCisgICAgICAgICAgICAjIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIG5lZWRzIHRvIGtub3cgaWYgdmlld3BvcnQgYW5kIHNjaXNzb3IgaXMgZHluYW1pYyB0byB1c2UgaXRzIHBvaW50ZXJzCisgICAgICAgICAgICAnVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvJyA6CisgICAgICAgICAgICAgICAgJywgY29uc3QgYm9vbCBpc19keW5hbWljX3ZpZXdwb3J0cywgY29uc3QgYm9vbCBpc19keW5hbWljX3NjaXNzb3JzJywKKyAgICAgICAgfQorICAgICMKKyAgICAjIENhbGxlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBydW4KKyAgICBkZWYgYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpCisgICAgICAgICMgVXNlci1zdXBwbGllZCBwcmVmaXggdGV4dCwgaWYgYW55IChsaXN0IG9mIHN0cmluZ3MpCisgICAgICAgIHNlbGYuaGVscGVyX2ZpbGVfdHlwZSA9IGdlbk9wdHMuaGVscGVyX2ZpbGVfdHlwZQorICAgICAgICBzZWxmLmxpYnJhcnlfbmFtZSA9IGdlbk9wdHMubGlicmFyeV9uYW1lCisgICAgICAgICMgRmlsZSBDb21tZW50CisgICAgICAgIGZpbGVfY29tbWVudCA9ICcvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKlxuJworICAgICAgICBmaWxlX2NvbW1lbnQgKz0gJy8vIFNlZSBoZWxwZXJfZmlsZV9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnNcbicKKyAgICAgICAgd3JpdGUoZmlsZV9jb21tZW50LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgIyBDb3B5cmlnaHQgTm90aWNlCisgICAgICAgIGNvcHlyaWdodCA9ICcnCisgICAgICAgIGNvcHlyaWdodCArPSAnXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgR29vZ2xlIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpO1xuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlnb0Bnb29nbGUuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZvcmJlc0Bnb29nbGUuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogSm9obiBadWxhdWY8anp1bGF1ZkBsdW5hcmcuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4nCisgICAgICAgIHdyaXRlKGNvcHlyaWdodCwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgIworICAgICMgV3JpdGUgZ2VuZXJhdGVkIGZpbGUgY29udGVudCB0byBvdXRwdXQgZmlsZQorICAgIGRlZiBlbmRGaWxlKHNlbGYpOgorICAgICAgICBkZXN0X2ZpbGUgPSAnJworICAgICAgICBkZXN0X2ZpbGUgKz0gc2VsZi5PdXRwdXREZXN0RmlsZSgpCisgICAgICAgICMgUmVtb3ZlIGJsYW5rIGxpbmVzIGF0IEVPRgorICAgICAgICBpZiBkZXN0X2ZpbGUuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICBkZXN0X2ZpbGUgPSBkZXN0X2ZpbGVbOi0xXQorICAgICAgICB3cml0ZShkZXN0X2ZpbGUsIGZpbGU9c2VsZi5vdXRGaWxlKTsKKyAgICAgICAgIyBGaW5pc2ggcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5lbmRGaWxlKHNlbGYpCisgICAgIworICAgICMgT3ZlcnJpZGUgcGFyZW50IGNsYXNzIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBiZWdpbm5pbmcgb2YgYW4gZXh0ZW5zaW9uCisgICAgZGVmIGJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpOgorICAgICAgICAjIFN0YXJ0IHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCkKKyAgICAgICAgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0ID0gR2V0RmVhdHVyZVByb3RlY3QoaW50ZXJmYWNlKQorCisgICAgICAgIGlmIHNlbGYuZmVhdHVyZU5hbWUgPT0gJ1ZLX1ZFUlNJT05fMV8wJyBvciBzZWxmLmZlYXR1cmVOYW1lID09ICdWS19WRVJTSU9OXzFfMSc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbmFtZSA9IHNlbGYuZmVhdHVyZU5hbWUKKyAgICAgICAgbmFtZUVsZW0gPSBpbnRlcmZhY2VbMF1bMV0KKyAgICAgICAgbmFtZV9kZWZpbmUgPSBuYW1lRWxlbS5nZXQoJ25hbWUnKQorICAgICAgICBpZiAnRVhURU5TSU9OX05BTUUnIG5vdCBpbiBuYW1lX2RlZmluZToKKyAgICAgICAgICAgIHByaW50KCJFcnJvciBpbiB2ay54bWwgZmlsZSAtLSBleHRlbnNpb24gbmFtZSBpcyBub3QgYXZhaWxhYmxlIikKKyAgICAgICAgcmVxdWlyZXMgPSBpbnRlcmZhY2UuZ2V0KCdyZXF1aXJlcycpCisgICAgICAgIGlmIHJlcXVpcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVxdWlyZWRfZXh0ZW5zaW9ucyA9IHJlcXVpcmVzLnNwbGl0KCcsJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcXVpcmVkX2V4dGVuc2lvbnMgPSBsaXN0KCkKKyAgICAgICAgaW5mbyA9IHsgJ2RlZmluZSc6IG5hbWVfZGVmaW5lLCAnaWZkZWYnOnNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwgJ3JlcXMnOnJlcXVpcmVkX2V4dGVuc2lvbnMgfQorICAgICAgICBpZiBpbnRlcmZhY2UuZ2V0KCd0eXBlJykgPT0gJ2luc3RhbmNlJzoKKyAgICAgICAgICAgIHNlbGYuaW5zdGFuY2VfZXh0ZW5zaW9uX2luZm9bbmFtZV0gPSBpbmZvCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRldmljZV9leHRlbnNpb25faW5mb1tuYW1lXSA9IGluZm8KKworICAgICMKKyAgICAjIE92ZXJyaWRlIHBhcmVudCBjbGFzcyB0byBiZSBub3RpZmllZCBvZiB0aGUgZW5kIG9mIGFuIGV4dGVuc2lvbgorICAgIGRlZiBlbmRGZWF0dXJlKHNlbGYpOgorICAgICAgICAjIEZpbmlzaCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmVuZEZlYXR1cmUoc2VsZikKKyAgICAjCisgICAgIyBHcmFiIGdyb3VwIChlLmcuIEMgImVudW0iIHR5cGUpIGluZm8gdG8gb3V0cHV0IGZvciBlbnVtLXN0cmluZyBjb252ZXJzaW9uIGhlbHBlcgorICAgIGRlZiBnZW5Hcm91cChzZWxmLCBncm91cGluZm8sIGdyb3VwTmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuR3JvdXAoc2VsZiwgZ3JvdXBpbmZvLCBncm91cE5hbWUsIGFsaWFzKQorICAgICAgICBncm91cEVsZW0gPSBncm91cGluZm8uZWxlbQorICAgICAgICAjIEZvciBlbnVtX3N0cmluZ19oZWFkZXIKKyAgICAgICAgaWYgc2VsZi5oZWxwZXJfZmlsZV90eXBlID09ICdlbnVtX3N0cmluZ19oZWFkZXInOgorICAgICAgICAgICAgdmFsdWVfc2V0ID0gc2V0KCkKKyAgICAgICAgICAgIGZvciBlbGVtIGluIGdyb3VwRWxlbS5maW5kYWxsKCdlbnVtJyk6CisgICAgICAgICAgICAgICAgaWYgZWxlbS5nZXQoJ3N1cHBvcnRlZCcpICE9ICdkaXNhYmxlZCcgYW5kIGVsZW0uZ2V0KCdhbGlhcycpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX3NldC5hZGQoZWxlbS5nZXQoJ25hbWUnKSkKKyAgICAgICAgICAgIHNlbGYuZW51bV9vdXRwdXQgKz0gc2VsZi5HZW5lcmF0ZUVudW1TdHJpbmdDb252ZXJzaW9uKGdyb3VwTmFtZSwgdmFsdWVfc2V0KQorICAgICAgICBlbGlmIHNlbGYuaGVscGVyX2ZpbGVfdHlwZSA9PSAnb2JqZWN0X3R5cGVzX2hlYWRlcic6CisgICAgICAgICAgICBpZiBncm91cE5hbWUgPT0gJ1ZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUJzoKKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBncm91cEVsZW0uZmluZGFsbCgnZW51bScpOgorICAgICAgICAgICAgICAgICAgICBpZiBlbGVtLmdldCgnc3VwcG9ydGVkJykgIT0gJ2Rpc2FibGVkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fbmFtZSA9IGVsZW0uZ2V0KCduYW1lJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlcy5hcHBlbmQoaXRlbV9uYW1lKQorICAgICAgICAgICAgZWxpZiBncm91cE5hbWUgPT0gJ1ZrT2JqZWN0VHlwZSc6CisgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gZ3JvdXBFbGVtLmZpbmRhbGwoJ2VudW0nKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZWxlbS5nZXQoJ3N1cHBvcnRlZCcpICE9ICdkaXNhYmxlZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX25hbWUgPSBlbGVtLmdldCgnbmFtZScpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvcmVfb2JqZWN0X3R5cGVzLmFwcGVuZChpdGVtX25hbWUpCisKKyAgICAjCisgICAgIyBDYWxsZWQgZm9yIGVhY2ggdHlwZSAtLSBpZiB0aGUgdHlwZSBpcyBhIHN0cnVjdC91bmlvbiwgZ3JhYiB0aGUgbWV0YWRhdGEKKyAgICBkZWYgZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgIHR5cGVFbGVtID0gdHlwZWluZm8uZWxlbQorICAgICAgICAjIElmIHRoZSB0eXBlIGlzIGEgc3RydWN0IHR5cGUsIHRyYXZlcnNlIHRoZSBpbWJlZGRlZCA8bWVtYmVyPiB0YWdzIGdlbmVyYXRpbmcgYSBzdHJ1Y3R1cmUuCisgICAgICAgICMgT3RoZXJ3aXNlLCBlbWl0IHRoZSB0YWcgdGV4dC4KKyAgICAgICAgY2F0ZWdvcnkgPSB0eXBlRWxlbS5nZXQoJ2NhdGVnb3J5JykKKyAgICAgICAgaWYgY2F0ZWdvcnkgPT0gJ2hhbmRsZSc6CisgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICBzZWxmLm9iamVjdF90eXBlX2FsaWFzZXMuYXBwZW5kKChuYW1lLGFsaWFzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vYmplY3RfdHlwZXMuYXBwZW5kKG5hbWUpCisgICAgICAgIGVsaWYgKGNhdGVnb3J5ID09ICdzdHJ1Y3QnIG9yIGNhdGVnb3J5ID09ICd1bmlvbicpOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3ROYW1lcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIHNlbGYuZ2VuU3RydWN0KHR5cGVpbmZvLCBuYW1lLCBhbGlhcykKKyAgICAjCisgICAgIyBHZW5lcmF0ZSBhIFZrU3RydWN0dXJlVHlwZSBiYXNlZCBvbiBhIHN0cnVjdHVyZSB0eXBlbmFtZQorICAgIGRlZiBnZW5Wa1N0cnVjdHVyZVR5cGUoc2VsZiwgdHlwZW5hbWUpOgorICAgICAgICAjIEFkZCB1bmRlcnNjb3JlIGJldHdlZW4gbG93ZXJjYXNlIHRoZW4gdXBwZXJjYXNlCisgICAgICAgIHZhbHVlID0gcmUuc3ViKCcoW2EtejAtOV0pKFtBLVpdKScsIHInXDFfXDInLCB0eXBlbmFtZSkKKyAgICAgICAgIyBDaGFuZ2UgdG8gdXBwZXJjYXNlCisgICAgICAgIHZhbHVlID0gdmFsdWUudXBwZXIoKQorICAgICAgICAjIEFkZCBTVFJVQ1RVUkVfVFlQRV8KKyAgICAgICAgcmV0dXJuIHJlLnN1YignVktfJywgJ1ZLX1NUUlVDVFVSRV9UWVBFXycsIHZhbHVlKQorICAgICMKKyAgICAjIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGEgcG9pbnRlcgorICAgIGRlZiBwYXJhbUlzUG9pbnRlcihzZWxmLCBwYXJhbSk6CisgICAgICAgIGlzcG9pbnRlciA9IEZhbHNlCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgKChlbGVtLnRhZyBpcyBub3QgJ3R5cGUnKSBhbmQgKGVsZW0udGFpbCBpcyBub3QgTm9uZSkpIGFuZCAnKicgaW4gZWxlbS50YWlsOgorICAgICAgICAgICAgICAgIGlzcG9pbnRlciA9IFRydWUKKyAgICAgICAgcmV0dXJuIGlzcG9pbnRlcgorICAgICMKKyAgICAjIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGEgc3RhdGljIGFycmF5CisgICAgZGVmIHBhcmFtSXNTdGF0aWNBcnJheShzZWxmLCBwYXJhbSk6CisgICAgICAgIGlzc3RhdGljYXJyYXkgPSAwCisgICAgICAgIHBhcmFtbmFtZSA9IHBhcmFtLmZpbmQoJ25hbWUnKQorICAgICAgICBpZiAocGFyYW1uYW1lLnRhaWwgaXMgbm90IE5vbmUpIGFuZCAoJ1snIGluIHBhcmFtbmFtZS50YWlsKToKKyAgICAgICAgICAgIGlzc3RhdGljYXJyYXkgPSBwYXJhbW5hbWUudGFpbC5jb3VudCgnWycpCisgICAgICAgIHJldHVybiBpc3N0YXRpY2FycmF5CisgICAgIworICAgICMgUmV0cmlldmUgdGhlIHR5cGUgYW5kIG5hbWUgZm9yIGEgcGFyYW1ldGVyCisgICAgZGVmIGdldFR5cGVOYW1lVHVwbGUoc2VsZiwgcGFyYW0pOgorICAgICAgICB0eXBlID0gJycKKyAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gJ3R5cGUnOgorICAgICAgICAgICAgICAgIHR5cGUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgICAgIGVsaWYgZWxlbS50YWcgPT0gJ25hbWUnOgorICAgICAgICAgICAgICAgIG5hbWUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgcmV0dXJuICh0eXBlLCBuYW1lKQorICAgICMgRXh0cmFjdCBsZW5ndGggdmFsdWVzIGZyb20gbGF0ZXhtYXRoLiAgQ3VycmVudGx5IGFuIGluZmxleGlibGUgc29sdXRpb24gdGhhdCBsb29rcyBmb3Igc3BlY2lmaWMKKyAgICAjIHBhdHRlcm5zIHRoYXQgYXJlIGZvdW5kIGluIHZrLnhtbC4gIFdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIHdoZW4gbmV3IHBhdHRlcm5zIGFyZSBpbnRyb2R1Y2VkLgorICAgIGRlZiBwYXJzZUxhdGVYTWF0aChzZWxmLCBzb3VyY2UpOgorICAgICAgICBuYW1lID0gJ0VSUk9SJworICAgICAgICBkZWNvcmF0ZWROYW1lID0gJ0VSUk9SJworICAgICAgICBpZiAnbWF0aGl0JyBpbiBzb3VyY2U6CisgICAgICAgICAgICAjIE1hdGNoZXMgZXhwcmVzc2lvbnMgc2ltaWxhciB0byAnbGF0ZXhtYXRoOltcbGNlaWx7XG1hdGhpdHtyYXN0ZXJpemF0aW9uU2FtcGxlc30gXG92ZXIgMzJ9XHJjZWlsXScKKyAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gocidsYXRleG1hdGhccypcOlxzKlxbXHMqXFxsKFx3Kylccypce1xzKlxcbWF0aGl0XHMqXHtccyooXHcrKVxzKlx9XHMqXFxvdmVyXHMqKFxkKylccypcfVxzKlxccihcdyspXHMqXF0nLCBzb3VyY2UpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2ggb3IgbWF0Y2guZ3JvdXAoMSkgIT0gbWF0Y2guZ3JvdXAoNCk6CisgICAgICAgICAgICAgICAgcmFpc2UgJ1VucmVjb2duaXplZCBsYXRleG1hdGggZXhwcmVzc2lvbicKKyAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgIyBOZWVkIHRvIGFkZCAxIGZvciBjZWlsaW5nIGZ1bmN0aW9uOyBvdGhlcndpc2UsIHRoZSBhbGxvY2F0ZWQgcGFja2V0CisgICAgICAgICAgICAjIHNpemUgd2lsbCBiZSBsZXNzIHRoYW4gbmVlZGVkIGR1cmluZyBjYXB0dXJlIGZvciBzb21lIHRpdGxlIHdoaWNoIHVzZQorICAgICAgICAgICAgIyB0aGlzIGluIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby4gYmFzZWQgb24gY2VpbGluZyBmdW5jdGlvbgorICAgICAgICAgICAgIyBkZWZpbml0aW9uLGl0IGlzICd7MH0lezF9P3swfS97MX0gKyAxOnswfS97MX0nLmZvcm1hdCgqbWF0Y2guZ3JvdXAoMiwgMykpLAorICAgICAgICAgICAgIyBpdHMgdmFsdWUgPD0gJ3t9L3t9ICsgMScuCisgICAgICAgICAgICBpZiBtYXRjaC5ncm91cCgxKSA9PSAnY2VpbCc6CisgICAgICAgICAgICAgICAgZGVjb3JhdGVkTmFtZSA9ICd7fS97fSArIDEnLmZvcm1hdCgqbWF0Y2guZ3JvdXAoMiwgMykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlY29yYXRlZE5hbWUgPSAne30ve30nLmZvcm1hdCgqbWF0Y2guZ3JvdXAoMiwgMykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE1hdGNoZXMgZXhwcmVzc2lvbnMgc2ltaWxhciB0byAnbGF0ZXhtYXRoIDogW2RhdGFTaXplIFxvdmVyIDRdJworICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyJ2xhdGV4bWF0aFxzKlw6XHMqXFtccyooXFx0ZXh0cm1ceyk/KFx3KylcfT9ccypcXG92ZXJccyooXGQrKVxzKlxdJywgc291cmNlKQorICAgICAgICAgICAgbmFtZSA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBkZWNvcmF0ZWROYW1lID0gJ3t9L3t9Jy5mb3JtYXQoKm1hdGNoLmdyb3VwKDIsIDMpKQorICAgICAgICByZXR1cm4gbmFtZSwgZGVjb3JhdGVkTmFtZQorICAgICMKKyAgICAjIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgbGVuIHRhZworICAgIGRlZiBnZXRMZW4oc2VsZiwgcGFyYW0pOgorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIGxlbiA9IHBhcmFtLmF0dHJpYi5nZXQoJ2xlbicpCisgICAgICAgIGlmIGxlbiBhbmQgbGVuICE9ICdudWxsLXRlcm1pbmF0ZWQnOgorICAgICAgICAgICAgIyBGb3Igc3RyaW5nIGFycmF5cywgJ2xlbicgY2FuIGxvb2sgbGlrZSAnY291bnQsbnVsbC10ZXJtaW5hdGVkJywgaW5kaWNhdGluZyB0aGF0IHdlCisgICAgICAgICAgICAjIGhhdmUgYSBudWxsIHRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncy4gIFdlIHN0cmlwIHRoZSBudWxsLXRlcm1pbmF0ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICMgJ2xlbicgZmllbGQgYW5kIG9ubHkgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgc3RyaW5nIGNvdW50CisgICAgICAgICAgICBpZiAnbnVsbC10ZXJtaW5hdGVkJyBpbiBsZW46CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuLnNwbGl0KCcsJylbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuCisgICAgICAgICAgICBpZiAnbGF0ZXhtYXRoJyBpbiBsZW46CisgICAgICAgICAgICAgICAgcGFyYW1fdHlwZSwgcGFyYW1fbmFtZSA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShwYXJhbSkKKyAgICAgICAgICAgICAgICBsZW5fbmFtZSwgcmVzdWx0ID0gc2VsZi5wYXJzZUxhdGVYTWF0aChsZW4pCisgICAgICAgICAgICAjIFNwZWMgaGFzIG5vdyBub3RhdGlvbiBmb3IgbGVuIGF0dHJpYnV0ZXMsIHVzaW5nIDo6IGluc3RlYWQgb2YgcGxhdGZvcm0gc3BlY2lmaWMgcG9pbnRlciBzeW1ib2wKKyAgICAgICAgICAgIHJlc3VsdCA9IHN0cihyZXN1bHQpLnJlcGxhY2UoJzo6JywgJy0+JykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICMKKyAgICAjIENoZWNrIGlmIGEgc3RydWN0dXJlIGlzIG9yIGNvbnRhaW5zIGEgZGlzcGF0Y2hhYmxlIChkaXNwYXRjaGFibGUgPSBUcnVlKSBvcgorICAgICMgbm9uLWRpc3BhdGNoYWJsZSAoZGlzcGF0Y2hhYmxlID0gRmFsc2UpIGhhbmRsZQorICAgIGRlZiBUeXBlQ29udGFpbnNPYmplY3RIYW5kbGUoc2VsZiwgaGFuZGxlX3R5cGUsIGRpc3BhdGNoYWJsZSk6CisgICAgICAgIGlmIGRpc3BhdGNoYWJsZToKKyAgICAgICAgICAgIHR5cGVfa2V5ID0gJ1ZLX0RFRklORV9IQU5ETEUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0eXBlX2tleSA9ICdWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUnCisgICAgICAgIGhhbmRsZSA9IHNlbGYucmVnaXN0cnkudHJlZS5maW5kKCJ0eXBlcy90eXBlL1tuYW1lPSciICsgaGFuZGxlX3R5cGUgKyAiJ11bQGNhdGVnb3J5PSdoYW5kbGUnXSIpCisgICAgICAgIGlmIGhhbmRsZSBpcyBub3QgTm9uZSBhbmQgaGFuZGxlLmZpbmQoJ3R5cGUnKS50ZXh0ID09IHR5cGVfa2V5OgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBpZiBoYW5kbGVfdHlwZSBpcyBhIHN0cnVjdCwgc2VhcmNoIGl0cyBtZW1iZXJzCisgICAgICAgIGlmIGhhbmRsZV90eXBlIGluIHNlbGYuc3RydWN0TmFtZXM6CisgICAgICAgICAgICBtZW1iZXJfaW5kZXggPSBuZXh0KChpIGZvciBpLCB2IGluIGVudW1lcmF0ZShzZWxmLnN0cnVjdE1lbWJlcnMpIGlmIHZbMF0gPT0gaGFuZGxlX3R5cGUpLCBOb25lKQorICAgICAgICAgICAgaWYgbWVtYmVyX2luZGV4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuc3RydWN0TWVtYmVyc1ttZW1iZXJfaW5kZXhdLm1lbWJlcnM6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYucmVnaXN0cnkudHJlZS5maW5kKCJ0eXBlcy90eXBlL1tuYW1lPSciICsgaXRlbS50eXBlICsgIiddW0BjYXRlZ29yeT0naGFuZGxlJ10iKQorICAgICAgICAgICAgICAgICAgICBpZiBoYW5kbGUgaXMgbm90IE5vbmUgYW5kIGhhbmRsZS5maW5kKCd0eXBlJykudGV4dCA9PSB0eXBlX2tleToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgICMKKyAgICAjIEdlbmVyYXRlIGxvY2FsIHJlYWR5LWFjY2VzcyBkYXRhIGRlc2NyaWJpbmcgVnVsa2FuIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyBmcm9tIHRoZSBYTUwgbWV0YWRhdGEKKyAgICBkZWYgZ2VuU3RydWN0KHNlbGYsIHR5cGVpbmZvLCB0eXBlTmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuU3RydWN0KHNlbGYsIHR5cGVpbmZvLCB0eXBlTmFtZSwgYWxpYXMpCisgICAgICAgIG1lbWJlcnMgPSB0eXBlaW5mby5lbGVtLmZpbmRhbGwoJy4vL21lbWJlcicpCisgICAgICAgICMgSXRlcmF0ZSBvdmVyIG1lbWJlcnMgb25jZSB0byBnZXQgbGVuZ3RoIHBhcmFtZXRlcnMgZm9yIGFycmF5cworICAgICAgICBsZW5zID0gc2V0KCkKKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgbGVuID0gc2VsZi5nZXRMZW4obWVtYmVyKQorICAgICAgICAgICAgaWYgbGVuOgorICAgICAgICAgICAgICAgIGxlbnMuYWRkKGxlbikKKyAgICAgICAgIyBHZW5lcmF0ZSBtZW1iZXIgaW5mbworICAgICAgICBtZW1iZXJzSW5mbyA9IFtdCisgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgICMgR2V0IHRoZSBtZW1iZXIncyB0eXBlIGFuZCBuYW1lCisgICAgICAgICAgICBpbmZvID0gc2VsZi5nZXRUeXBlTmFtZVR1cGxlKG1lbWJlcikKKyAgICAgICAgICAgIHR5cGUgPSBpbmZvWzBdCisgICAgICAgICAgICBuYW1lID0gaW5mb1sxXQorICAgICAgICAgICAgY2RlY2wgPSBzZWxmLm1ha2VDUGFyYW1EZWNsKG1lbWJlciwgMSkKKyAgICAgICAgICAgICMgUHJvY2VzcyBWa1N0cnVjdHVyZVR5cGUKKyAgICAgICAgICAgIGlmIHR5cGUgPT0gJ1ZrU3RydWN0dXJlVHlwZSc6CisgICAgICAgICAgICAgICAgIyBFeHRyYWN0IHRoZSByZXF1aXJlZCBzdHJ1Y3QgdHlwZSB2YWx1ZSBmcm9tIHRoZSBjb21tZW50cworICAgICAgICAgICAgICAgICMgZW1iZWRkZWQgaW4gdGhlIG9yaWdpbmFsIHRleHQgZGVmaW5pbmcgdGhlICd0eXBlaW5mbycgZWxlbWVudAorICAgICAgICAgICAgICAgIHJhd1htbCA9IGV0cmVlLnRvc3RyaW5nKHR5cGVpbmZvLmVsZW0pLmRlY29kZSgnYXNjaWknKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlLnNlYXJjaChyJ1ZLX1NUUlVDVFVSRV9UWVBFX1x3KycsIHJhd1htbCkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0Lmdyb3VwKDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmdlblZrU3RydWN0dXJlVHlwZSh0eXBlTmFtZSkKKyAgICAgICAgICAgICAgICAjIFN0b3JlIHRoZSByZXF1aXJlZCB0eXBlIHZhbHVlCisgICAgICAgICAgICAgICAgc2VsZi5zdHJ1Y3RUeXBlc1t0eXBlTmFtZV0gPSBzZWxmLlN0cnVjdFR5cGUobmFtZT1uYW1lLCB2YWx1ZT12YWx1ZSkKKyAgICAgICAgICAgICMgU3RvcmUgcG9pbnRlci9hcnJheS9zdHJpbmcgaW5mbworICAgICAgICAgICAgaXNzdGF0aWNhcnJheSA9IHNlbGYucGFyYW1Jc1N0YXRpY0FycmF5KG1lbWJlcikKKyAgICAgICAgICAgIG1lbWJlcnNJbmZvLmFwcGVuZChzZWxmLkNvbW1hbmRQYXJhbSh0eXBlPXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcG9pbnRlcj1zZWxmLnBhcmFtSXNQb2ludGVyKG1lbWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdGF0aWNhcnJheT1pc3N0YXRpY2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY29uc3Q9VHJ1ZSBpZiAnY29uc3QnIGluIGNkZWNsIGVsc2UgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNjb3VudD1UcnVlIGlmIG5hbWUgaW4gbGVucyBlbHNlIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbj1zZWxmLmdldExlbihtZW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHN0cnVjdHM9c2VsZi5yZWdpc3RyeS52YWxpZGV4dGVuc2lvbnN0cnVjdHNbdHlwZU5hbWVdIGlmIG5hbWUgPT0gJ3BOZXh0JyBlbHNlIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9Y2RlY2wpKQorICAgICAgICBzZWxmLnN0cnVjdE1lbWJlcnMuYXBwZW5kKHNlbGYuU3RydWN0TWVtYmVyRGF0YShuYW1lPXR5cGVOYW1lLCBtZW1iZXJzPW1lbWJlcnNJbmZvLCBpZmRlZl9wcm90ZWN0PXNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCkpCisgICAgIworICAgICMgRW51bV9zdHJpbmdfaGVhZGVyOiBDcmVhdGUgYSByb3V0aW5lIHRvIGNvbnZlcnQgYW4gZW51bWVyYXRlZCB2YWx1ZSBpbnRvIGEgc3RyaW5nCisgICAgZGVmIEdlbmVyYXRlRW51bVN0cmluZ0NvbnZlcnNpb24oc2VsZiwgZ3JvdXBOYW1lLCB2YWx1ZV9saXN0KToKKyAgICAgICAgb3V0c3RyaW5nID0gJ1xuJworICAgICAgICBvdXRzdHJpbmcgKz0gJ3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nXyVzKCVzIGlucHV0X3ZhbHVlKVxuJyAlIChncm91cE5hbWUsIGdyb3VwTmFtZSkKKyAgICAgICAgb3V0c3RyaW5nICs9ICd7XG4nCisgICAgICAgIG91dHN0cmluZyArPSAnICAgIHN3aXRjaCAoKCVzKWlucHV0X3ZhbHVlKVxuJyAlIGdyb3VwTmFtZQorICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICB7XG4nCisgICAgICAgIGZvciBpdGVtIGluIHZhbHVlX2xpc3Q6CisgICAgICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICAgICAgY2FzZSAlczpcbicgJSBpdGVtCisgICAgICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICAgICAgICAgIHJldHVybiAiJXMiO1xuJyAlIGl0ZW0KKyAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgICAgIGRlZmF1bHQ6XG4nCisgICAgICAgIG91dHN0cmluZyArPSAnICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgJXMiO1xuJyAlIGdyb3VwTmFtZQorICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICB9XG4nCisgICAgICAgIG91dHN0cmluZyArPSAnfVxuJworICAgICAgICByZXR1cm4gb3V0c3RyaW5nCisgICAgIworICAgICMgQ29tYmluZSBvYmplY3QgdHlwZXMgaGVscGVyIGhlYWRlciBmaWxlIHByZWFtYmxlIHdpdGggYm9keSB0ZXh0IGFuZCByZXR1cm4KKyAgICBkZWYgR2VuZXJhdGVPYmplY3RUeXBlc0hlbHBlckhlYWRlcihzZWxmKToKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlbHBlcl9oZWFkZXIgPSAnXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWxwZXJfaGVhZGVyICs9ICcjcHJhZ21hIG9uY2VcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlbHBlcl9oZWFkZXIgKz0gJ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVscGVyX2hlYWRlciArPSAnI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD5cblxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVscGVyX2hlYWRlciArPSBzZWxmLkdlbmVyYXRlT2JqZWN0VHlwZXNIZWFkZXIoKQorICAgICAgICByZXR1cm4gb2JqZWN0X3R5cGVzX2hlbHBlcl9oZWFkZXIKKyAgICAjCisgICAgIyBPYmplY3QgdHlwZXMgaGVhZGVyOiBjcmVhdGUgb2JqZWN0IGVudW0gdHlwZSBoZWFkZXIgZmlsZQorICAgIGRlZiBHZW5lcmF0ZU9iamVjdFR5cGVzSGVhZGVyKHNlbGYpOgorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyID0gJycKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnLy8gT2JqZWN0IFR5cGUgZW51bSBmb3IgdmFsaWRhdGlvbiBsYXllciBpbnRlcm5hbCBvYmplY3QgaGFuZGxpbmdcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAndHlwZWRlZiBlbnVtIFZ1bGthbk9iamVjdFR5cGUge1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAga1Z1bGthbk9iamVjdFR5cGVVbmtub3duID0gMCxcbicKKyAgICAgICAgZW51bV9udW0gPSAxCisgICAgICAgIHR5cGVfbGlzdCA9IFtdOworICAgICAgICBlbnVtX2VudHJ5X21hcCA9IHt9CisKKyAgICAgICAgIyBPdXRwdXQgZW51bSBkZWZpbml0aW9uIGFzIGVhY2ggaGFuZGxlIGlzIHByb2Nlc3NlZCwgc2F2aW5nIHRoZSBuYW1lcyB0byB1c2UgZm9yIHRoZSBjb252ZXJzaW9uIHJvdXRpbmUKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5vYmplY3RfdHlwZXM6CisgICAgICAgICAgICBmaXh1cF9uYW1lID0gaXRlbVsyOl0KKyAgICAgICAgICAgIGVudW1fZW50cnkgPSAna1Z1bGthbk9iamVjdFR5cGUlcycgJSBmaXh1cF9uYW1lCisgICAgICAgICAgICBlbnVtX2VudHJ5X21hcFtpdGVtXSA9IGVudW1fZW50cnkKKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAnICsgZW51bV9lbnRyeQorICAgICAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnID0gJWQsXG4nICUgZW51bV9udW0KKyAgICAgICAgICAgIGVudW1fbnVtICs9IDEKKyAgICAgICAgICAgIHR5cGVfbGlzdC5hcHBlbmQoZW51bV9lbnRyeSkKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgIGtWdWxrYW5PYmplY3RUeXBlTWF4ID0gJWQsXG4nICUgZW51bV9udW0KKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgIC8vIEFsaWFzZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsdHkgb2YgInByb21vdGVkIiB0eXBlc1xuJworICAgICAgICBmb3IgKG5hbWUsIGFsaWFzKSBpbiBzZWxmLm9iamVjdF90eXBlX2FsaWFzZXM6CisgICAgICAgICAgICBmaXh1cF9uYW1lID0gbmFtZVsyOl0KKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICBrVnVsa2FuT2JqZWN0VHlwZXt9ID0ge30sXG4nLmZvcm1hdChmaXh1cF9uYW1lLCBlbnVtX2VudHJ5X21hcFthbGlhc10pCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ30gVnVsa2FuT2JqZWN0VHlwZTtcblxuJworCisgICAgICAgICMgT3V0cHV0IG5hbWUgc3RyaW5nIGhlbHBlcgorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcvLyBBcnJheSBvZiBvYmplY3QgbmFtZSBzdHJpbmdzIGZvciBPQkpFQ1RfVFlQRSBlbnVtIGNvbnZlcnNpb25cbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvYmplY3Rfc3RyaW5nW2tWdWxrYW5PYmplY3RUeXBlTWF4XSA9IHtcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgICJVbmtub3duIixcbicKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5vYmplY3RfdHlwZXM6CisgICAgICAgICAgICBmaXh1cF9uYW1lID0gaXRlbVsyOl0KKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAiJXMiLFxuJyAlIGZpeHVwX25hbWUKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnfTtcbicKKworICAgICAgICAjIEtleSBjcmVhdGlvbiBoZWxwZXIgZm9yIG1hcCBjb21wcmVoZW5zaW9ucyB0aGF0IGNvbnZlcnQgYmV0d2VlbiBrPE5hbWU+IGFuZCBWSzxOYW1lPiBzeW1ib2xzCisgICAgICAgIGRlZiB0b19rZXkocmVnZXgsIHJhd19rZXkpOiByZXR1cm4gcmUuc2VhcmNoKHJlZ2V4LCByYXdfa2V5KS5ncm91cCgxKS5sb3dlcigpLnJlcGxhY2UoIl8iLCIiKQorCisgICAgICAgICMgT3V0cHV0IGEgY29udmVyc2lvbiByb3V0aW5lIGZyb20gdGhlIGxheWVyIG9iamVjdCBkZWZpbml0aW9ucyB0byB0aGUgZGVidWcgcmVwb3J0IGRlZmluaXRpb25zCisgICAgICAgICMgQXMgdGhlIFZLX0RFQlVHX1JFUE9SVCB0eXBlcyBhcmUgbm90IGJlaW5nIHVwZGF0ZWQsIHNwZWNpZnkgVU5LTk9XTiBmb3IgdW5tYXRjaGVkIHR5cGVzCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcvLyBIZWxwZXIgYXJyYXkgdG8gZ2V0IFZ1bGthbiBWS19FWFRfZGVidWdfcmVwb3J0IG9iamVjdCB0eXBlIGVudW0gZnJvbSB0aGUgaW50ZXJuYWwgbGF5ZXJzIHZlcnNpb25cbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgZ2V0X2RlYnVnX3JlcG9ydF9lbnVtW10gPSB7XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIC8vIGtWdWxrYW5PYmplY3RUeXBlVW5rbm93blxuJworCisgICAgICAgIGRiZ19yZSA9ICdeVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFXyguKilfRVhUJCcKKyAgICAgICAgZGJnX21hcCA9IHt0b19rZXkoZGJnX3JlLCBkYmcpIDogZGJnIGZvciBkYmcgaW4gc2VsZi5kZWJ1Z19yZXBvcnRfb2JqZWN0X3R5cGVzfQorICAgICAgICBkYmdfZGVmYXVsdCA9ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQnCisgICAgICAgIGZvciBvYmplY3RfdHlwZSBpbiB0eXBlX2xpc3Q6CisgICAgICAgICAgICB2a19vYmplY3RfdHlwZSA9IGRiZ19tYXAuZ2V0KG9iamVjdF90eXBlLnJlcGxhY2UoImtWdWxrYW5PYmplY3RUeXBlIiwgIiIpLmxvd2VyKCksIGRiZ19kZWZhdWx0KQorICAgICAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgICVzLCAgIC8vICVzXG4nICUgKHZrX29iamVjdF90eXBlLCBvYmplY3RfdHlwZSkKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnfTtcbicKKworICAgICAgICAjIE91dHB1dCBhIGNvbnZlcnNpb24gcm91dGluZSBmcm9tIHRoZSBsYXllciBvYmplY3QgZGVmaW5pdGlvbnMgdG8gdGhlIGNvcmUgb2JqZWN0IHR5cGUgZGVmaW5pdGlvbnMKKyAgICAgICAgIyBUaGlzIHdpbGwgaW50ZW50aW9uYWxseSAqZmFpbCogZm9yIHVubWF0Y2hlZCB0eXBlcyBhcyB0aGUgVktfT0JKRUNUX1RZUEUgbGlzdCBzaG91bGQgbWF0Y2ggdGhlIGtWdWxrYW5PYmplY3RUeXBlIGxpc3QKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJy8vIEhlbHBlciBhcnJheSB0byBnZXQgT2ZmaWNpYWwgVnVsa2FuIFZrT2JqZWN0VHlwZSBlbnVtIGZyb20gdGhlIGludGVybmFsIGxheWVycyB2ZXJzaW9uXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ2NvbnN0IFZrT2JqZWN0VHlwZSBnZXRfb2JqZWN0X3R5cGVfZW51bVtdID0ge1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgVktfT0JKRUNUX1RZUEVfVU5LTk9XTiwgLy8ga1Z1bGthbk9iamVjdFR5cGVVbmtub3duXG4nCisKKyAgICAgICAgdmtvX3JlID0gJ15WS19PQkpFQ1RfVFlQRV8oLiopJworICAgICAgICB2a29fbWFwID0ge3RvX2tleSh2a29fcmUsIHZrbykgOiB2a28gZm9yIHZrbyBpbiBzZWxmLmNvcmVfb2JqZWN0X3R5cGVzfQorICAgICAgICBmb3Igb2JqZWN0X3R5cGUgaW4gdHlwZV9saXN0OgorICAgICAgICAgICAgdmtfb2JqZWN0X3R5cGUgPSB2a29fbWFwW29iamVjdF90eXBlLnJlcGxhY2UoImtWdWxrYW5PYmplY3RUeXBlIiwgIiIpLmxvd2VyKCldCisgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgJXMsICAgLy8gJXNcbicgJSAodmtfb2JqZWN0X3R5cGUsIG9iamVjdF90eXBlKQorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICd9O1xuJworCisgICAgICAgICMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIHRvIFZrT2JqZWN0VHlwZQorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICdcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB0byBWa09iamVjdFR5cGVcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnc3RhdGljIGlubGluZSBWa09iamVjdFR5cGUgY29udmVydERlYnVnUmVwb3J0T2JqZWN0VG9Db3JlT2JqZWN0KFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGRlYnVnX3JlcG9ydF9vYmope1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUKSB7XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX1VOS05PV047XG4nCisgICAgICAgIGZvciBjb3JlX29iamVjdF90eXBlIGluIHNlbGYuY29yZV9vYmplY3RfdHlwZXM6CisgICAgICAgICAgICBjb3JlX3RhcmdldF90eXBlID0gY29yZV9vYmplY3RfdHlwZS5yZXBsYWNlKCJWS19PQkpFQ1RfVFlQRV8iLCAiIikubG93ZXIoKQorICAgICAgICAgICAgY29yZV90YXJnZXRfdHlwZSA9IGNvcmVfdGFyZ2V0X3R5cGUucmVwbGFjZSgiXyIsICIiKQorICAgICAgICAgICAgZm9yIGRyX29iamVjdF90eXBlIGluIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlczoKKyAgICAgICAgICAgICAgICBkcl90YXJnZXRfdHlwZSA9IGRyX29iamVjdF90eXBlLnJlcGxhY2UoIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV8iLCAiIikubG93ZXIoKQorICAgICAgICAgICAgICAgIGRyX3RhcmdldF90eXBlID0gZHJfdGFyZ2V0X3R5cGVbOi00XQorICAgICAgICAgICAgICAgIGRyX3RhcmdldF90eXBlID0gZHJfdGFyZ2V0X3R5cGUucmVwbGFjZSgiXyIsICIiKQorICAgICAgICAgICAgICAgIGlmIGNvcmVfdGFyZ2V0X3R5cGUgPT0gZHJfdGFyZ2V0X3R5cGU6CisgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICB9IGVsc2UgaWYgKGRlYnVnX3JlcG9ydF9vYmogPT0gJXMpIHtcbicgJSBkcl9vYmplY3RfdHlwZQorICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgICAgIHJldHVybiAlcztcbicgJSBjb3JlX29iamVjdF90eXBlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICB9XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICByZXR1cm4gVktfT0JKRUNUX1RZUEVfVU5LTk9XTjtcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnfVxuJworCisgICAgICAgICMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIFZrT2JqZWN0VHlwZSB0byBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVAorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICdcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB0byBWa09iamVjdFR5cGVcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnc3RhdGljIGlubGluZSBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBjb252ZXJ0Q29yZU9iamVjdFRvRGVidWdSZXBvcnRPYmplY3QoVmtPYmplY3RUeXBlIGNvcmVfcmVwb3J0X29iail7XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICBpZiAoY29yZV9yZXBvcnRfb2JqID09IFZLX09CSkVDVF9UWVBFX1VOS05PV04pIHtcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgICAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUO1xuJworICAgICAgICBmb3IgY29yZV9vYmplY3RfdHlwZSBpbiBzZWxmLmNvcmVfb2JqZWN0X3R5cGVzOgorICAgICAgICAgICAgY29yZV90YXJnZXRfdHlwZSA9IGNvcmVfb2JqZWN0X3R5cGUucmVwbGFjZSgiVktfT0JKRUNUX1RZUEVfIiwgIiIpLmxvd2VyKCkKKyAgICAgICAgICAgIGNvcmVfdGFyZ2V0X3R5cGUgPSBjb3JlX3RhcmdldF90eXBlLnJlcGxhY2UoIl8iLCAiIikKKyAgICAgICAgICAgIGZvciBkcl9vYmplY3RfdHlwZSBpbiBzZWxmLmRlYnVnX3JlcG9ydF9vYmplY3RfdHlwZXM6CisgICAgICAgICAgICAgICAgZHJfdGFyZ2V0X3R5cGUgPSBkcl9vYmplY3RfdHlwZS5yZXBsYWNlKCJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfIiwgIiIpLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBkcl90YXJnZXRfdHlwZSA9IGRyX3RhcmdldF90eXBlWzotNF0KKyAgICAgICAgICAgICAgICBkcl90YXJnZXRfdHlwZSA9IGRyX3RhcmdldF90eXBlLnJlcGxhY2UoIl8iLCAiIikKKyAgICAgICAgICAgICAgICBpZiBjb3JlX3RhcmdldF90eXBlID09IGRyX3RhcmdldF90eXBlOgorICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgfSBlbHNlIGlmIChjb3JlX3JlcG9ydF9vYmogPT0gJXMpIHtcbicgJSBjb3JlX29iamVjdF90eXBlCisgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAgICAgcmV0dXJuICVzO1xuJyAlIGRyX29iamVjdF90eXBlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICB9XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUO1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICd9XG4nCisgICAgICAgIHJldHVybiBvYmplY3RfdHlwZXNfaGVhZGVyCisKKyAgICAjCisgICAgIyBDcmVhdGUgYSBoZWxwZXIgZmlsZSBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nCisgICAgZGVmIE91dHB1dERlc3RGaWxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPT0gJ29iamVjdF90eXBlc19oZWFkZXInOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2VuZXJhdGVPYmplY3RUeXBlc0hlbHBlckhlYWRlcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ0JhZCBIZWxwZXIgRmlsZSBHZW5lcmF0b3IgT3B0aW9uICVzJyAlIHNlbGYuaGVscGVyX2ZpbGVfdHlwZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMva25vd25fZ29vZC5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMva25vd25fZ29vZC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTY4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9rbm93bl9nb29kLmpzb24KQEAgLTAsMCArMSwxNSBAQAoreworICAicmVwb3MiIDogWworICAgIHsKKyAgICAgICJuYW1lIiA6ICJWdWxrYW4tSGVhZGVycyIsCisgICAgICAidXJsIiA6ICJodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1IZWFkZXJzLmdpdCIsCisgICAgICAic3ViX2RpciIgOiAiVnVsa2FuLUhlYWRlcnMiLAorICAgICAgImJ1aWxkX2RpciIgOiAiVnVsa2FuLUhlYWRlcnMvYnVpbGQiLAorICAgICAgImluc3RhbGxfZGlyIiA6ICJWdWxrYW4tSGVhZGVycy9idWlsZC9pbnN0YWxsIiwKKyAgICAgICJjb21taXQiIDogInYxLjEuMTI4IgorICAgIH0KKyAgXSwKKyAgImluc3RhbGxfbmFtZXMiIDogeworICAgICAgIlZ1bGthbi1IZWFkZXJzIiA6ICJWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUiIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9sb2FkZXJfZXh0ZW5zaW9uX2dlbmVyYXRvci5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy9zY3JpcHRzL2xvYWRlcl9leHRlbnNpb25fZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2ExNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9sb2FkZXJfZXh0ZW5zaW9uX2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDE1NzIgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMyAtaQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IE1hcmsgWW91bmcgPG1hcmt5QGx1bmFyZy5jb20+CisjIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorCitpbXBvcnQgb3MscmUsc3lzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIGV0cmVlCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgKgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorZnJvbSBjb21tb25fY29kZWdlbiBpbXBvcnQgKgorCisKK1dTSV9FWFRfTkFNRVMgPSBbJ1ZLX0tIUl9zdXJmYWNlJywKKyAgICAgICAgICAgICAgICAgJ1ZLX0tIUl9kaXNwbGF5JywKKyAgICAgICAgICAgICAgICAgJ1ZLX0tIUl94bGliX3N1cmZhY2UnLAorICAgICAgICAgICAgICAgICAnVktfS0hSX3hjYl9zdXJmYWNlJywKKyAgICAgICAgICAgICAgICAgJ1ZLX0tIUl93YXlsYW5kX3N1cmZhY2UnLAorICAgICAgICAgICAgICAgICAnVktfS0hSX3dpbjMyX3N1cmZhY2UnLAorICAgICAgICAgICAgICAgICAnVktfS0hSX2FuZHJvaWRfc3VyZmFjZScsCisgICAgICAgICAgICAgICAgICdWS19NVktfbWFjb3Nfc3VyZmFjZScsCisgICAgICAgICAgICAgICAgICdWS19NVktfaW9zX3N1cmZhY2UnLAorICAgICAgICAgICAgICAgICAnVktfRVhUX2hlYWRsZXNzX3N1cmZhY2UnLAorICAgICAgICAgICAgICAgICAnVktfRVhUX21ldGFsX3N1cmZhY2UnLAorICAgICAgICAgICAgICAgICAnVktfS0hSX3N3YXBjaGFpbicsCisgICAgICAgICAgICAgICAgICdWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4nLAorICAgICAgICAgICAgICAgICAnVktfS0hSX2dldF9kaXNwbGF5X3Byb3BlcnRpZXMyJ10KKworQUREX0lOU1RfQ01EUyA9IFsndmtDcmVhdGVJbnN0YW5jZScsCisgICAgICAgICAgICAgICAgICd2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsCisgICAgICAgICAgICAgICAgICd2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uJ10KKworQVZPSURfRVhUX05BTUVTID0gWydWS19FWFRfZGVidWdfcmVwb3J0J10KKworTlVMTF9DSEVDS19FWFRfTkFNRVM9IFsnVktfRVhUX2RlYnVnX3V0aWxzJ10KKworQVZPSURfQ01EX05BTUVTID0gWyd2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQnLAorICAgICAgICAgICAgICAgICAgICd2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUJywKKyAgICAgICAgICAgICAgICAgICAndmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCddCisKK0RFVklDRV9DTURTX05FRURfVEVSTSA9IFsndmtHZXREZXZpY2VQcm9jQWRkcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrQ3JlYXRlU3dhcGNoYWluS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICd2a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICd2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUJ10KKworQUxJQVNFRF9DTURTID0geworICAgICd2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSJzogICAgICAgICAgICAgICAgICAgJ3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMnLAorICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSJzogICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczInLAorICAgICd2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFInOiAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMicsCisgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUic6ICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyJywKKyAgICAndmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFInOiAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMicsCisgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSJzogICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczInLAorICAgICd2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFInOiAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMicsCisgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSJzogICAndmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczInLAorICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSJzogICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMnLAorICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSJzogICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMnLAorICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFInOiAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcycsCit9CisKK1BSRV9JTlNUQU5DRV9GVU5DVElPTlMgPSBbJ3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24nXQorCisjCisjIExvYWRlckV4dGVuc2lvbkdlbmVyYXRvck9wdGlvbnMgLSBzdWJjbGFzcyBvZiBHZW5lcmF0b3JPcHRpb25zLgorY2xhc3MgTG9hZGVyRXh0ZW5zaW9uR2VuZXJhdG9yT3B0aW9ucyhHZW5lcmF0b3JPcHRpb25zKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgY29udmVudGlvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9ICcuJywKKyAgICAgICAgICAgICAgICAgYXBpbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBOb25lLAorICAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHNvcnRQcm9jZWR1cmUgPSByZWdTb3J0RmVhdHVyZXMsCisgICAgICAgICAgICAgICAgIHByZWZpeFRleHQgPSAiIiwKKyAgICAgICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdEZpbGUgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0RmVhdHVyZSA9IFRydWUsCisgICAgICAgICAgICAgICAgIGFwaWNhbGwgPSAnJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnkgPSAnJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnlwID0gJycsCisgICAgICAgICAgICAgICAgIGluZGVudEZ1bmNQcm90byA9IFRydWUsCisgICAgICAgICAgICAgICAgIGluZGVudEZ1bmNQb2ludGVyID0gRmFsc2UsCisgICAgICAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IFRydWUpOgorICAgICAgICBHZW5lcmF0b3JPcHRpb25zLl9faW5pdF9fKHNlbGYsIGNvbnZlbnRpb25zLCBmaWxlbmFtZSwgZGlyZWN0b3J5LCBhcGluYW1lLCBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zLCBlbWl0dmVyc2lvbnMsIGRlZmF1bHRFeHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMsIHJlbW92ZUV4dGVuc2lvbnMsIGVtaXRFeHRlbnNpb25zLCBzb3J0UHJvY2VkdXJlKQorICAgICAgICBzZWxmLnByZWZpeFRleHQgICAgICA9IHByZWZpeFRleHQKKyAgICAgICAgc2VsZi5wcmVmaXhUZXh0ICAgICAgPSBOb25lCisgICAgICAgIHNlbGYuYXBpY2FsbCAgICAgICAgID0gYXBpY2FsbAorICAgICAgICBzZWxmLmFwaWVudHJ5ICAgICAgICA9IGFwaWVudHJ5CisgICAgICAgIHNlbGYuYXBpZW50cnlwICAgICAgID0gYXBpZW50cnlwCisgICAgICAgIHNlbGYuYWxpZ25GdW5jUGFyYW0gID0gYWxpZ25GdW5jUGFyYW0KKyAgICAgICAgc2VsZi5leHBhbmRFbnVtZXJhbnRzID0gZXhwYW5kRW51bWVyYW50cworCisjCisjIExvYWRlckV4dGVuc2lvbk91dHB1dEdlbmVyYXRvciAtIHN1YmNsYXNzIG9mIE91dHB1dEdlbmVyYXRvci4KKyMgR2VuZXJhdGVzIGRpc3BhdGNoIHRhYmxlIGhlbHBlciBoZWFkZXIgZmlsZXMgZm9yIExWTAorY2xhc3MgTG9hZGVyRXh0ZW5zaW9uT3V0cHV0R2VuZXJhdG9yKE91dHB1dEdlbmVyYXRvcik6CisgICAgIiIiR2VuZXJhdGUgZGlzcGF0Y2ggdGFibGUgaGVscGVyIGhlYWRlciBiYXNlZCBvbiBYTUwgZWxlbWVudCBhdHRyaWJ1dGVzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGVyckZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICB3YXJuRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIGRpYWdGaWxlID0gc3lzLnN0ZG91dCk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5fX2luaXRfXyhzZWxmLCBlcnJGaWxlLCB3YXJuRmlsZSwgZGlhZ0ZpbGUpCisKKyAgICAgICAgIyBJbnRlcm5hbCBzdGF0ZSAtIGFjY3VtdWxhdG9ycyBmb3IgZGlmZmVyZW50IGlubmVyIGJsb2NrIHRleHQKKyAgICAgICAgc2VsZi5leHRfaW5zdGFuY2VfZGlzcGF0Y2hfbGlzdCA9IFtdICAjIExpc3Qgb2YgZXh0ZW5zaW9uIGVudHJpZXMgZm9yIGluc3RhbmNlIGRpc3BhdGNoIGxpc3QKKyAgICAgICAgc2VsZi5leHRfZGV2aWNlX2Rpc3BhdGNoX2xpc3QgPSBbXSAgICAjIExpc3Qgb2YgZXh0ZW5zaW9uIGVudHJpZXMgZm9yIGRldmljZSBkaXNwYXRjaCBsaXN0CisgICAgICAgIHNlbGYuY29yZV9jb21tYW5kcyA9IFtdICAgICAgICAgICAgICAgIyBMaXN0IG9mIENvbW1hbmREYXRhIHJlY29yZHMgZm9yIGNvcmUgVnVsa2FuIGNvbW1hbmRzCisgICAgICAgIHNlbGYuZXh0X2NvbW1hbmRzID0gW10gICAgICAgICAgICAgICAgIyBMaXN0IG9mIENvbW1hbmREYXRhIHJlY29yZHMgZm9yIGV4dGVuc2lvbiBWdWxrYW4gY29tbWFuZHMKKyAgICAgICAgc2VsZi5Db21tYW5kUGFyYW0gPSBuYW1lZHR1cGxlKCdDb21tYW5kUGFyYW0nLCBbJ3R5cGUnLCAnbmFtZScsICdjZGVjbCddKQorICAgICAgICBzZWxmLkNvbW1hbmREYXRhID0gbmFtZWR0dXBsZSgnQ29tbWFuZERhdGEnLCBbJ25hbWUnLCAnZXh0X25hbWUnLCAnZXh0X3R5cGUnLCAncmVxdWlyZScsICdwcm90ZWN0JywgJ3JldHVybl90eXBlJywgJ2hhbmRsZV90eXBlJywgJ3BhcmFtcycsICdjZGVjbCddKQorICAgICAgICBzZWxmLmluc3RhbmNlRXh0ZW5zaW9ucyA9IFtdCisgICAgICAgIHNlbGYuRXh0ZW5zaW9uRGF0YSA9IG5hbWVkdHVwbGUoJ0V4dGVuc2lvbkRhdGEnLCBbJ25hbWUnLCAndHlwZScsICdwcm90ZWN0JywgJ2RlZmluZScsICdudW1fY29tbWFuZHMnXSkKKworICAgICMKKyAgICAjIENhbGxlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBydW4KKyAgICBkZWYgYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpCisKKyAgICAgICAgIyBVc2VyLXN1cHBsaWVkIHByZWZpeCB0ZXh0LCBpZiBhbnkgKGxpc3Qgb2Ygc3RyaW5ncykKKyAgICAgICAgaWYgKGdlbk9wdHMucHJlZml4VGV4dCk6CisgICAgICAgICAgICBmb3IgcyBpbiBnZW5PcHRzLnByZWZpeFRleHQ6CisgICAgICAgICAgICAgICAgd3JpdGUocywgZmlsZT1zZWxmLm91dEZpbGUpCisKKyAgICAgICAgIyBGaWxlIENvbW1lbnQKKyAgICAgICAgZmlsZV9jb21tZW50ID0gJy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqXG4nCisgICAgICAgIGZpbGVfY29tbWVudCArPSAnLy8gU2VlIGxvYWRlcl9leHRlbnNpb25fZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zXG4nCisgICAgICAgIHdyaXRlKGZpbGVfY29tbWVudCwgZmlsZT1zZWxmLm91dEZpbGUpCisKKyAgICAgICAgIyBDb3B5cmlnaHQgTm90aWNlCisgICAgICAgIGNvcHlyaWdodCA9ICAnLypcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb25cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpO1xuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogTWFyayBZb3VuZyA8bWFya3lAbHVuYXJnLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKi9cbicKKworICAgICAgICBwcmVhbWJsZSA9ICcnCisKKyAgICAgICAgaWYgc2VsZi5nZW5PcHRzLmZpbGVuYW1lID09ICd2a19sb2FkZXJfZXh0ZW5zaW9ucy5oJzoKKyAgICAgICAgICAgIHByZWFtYmxlICs9ICcjcHJhZ21hIG9uY2VcbicKKworICAgICAgICBlbGlmIHNlbGYuZ2VuT3B0cy5maWxlbmFtZSA9PSAndmtfbG9hZGVyX2V4dGVuc2lvbnMuYyc6CisgICAgICAgICAgICBwcmVhbWJsZSArPSAnI2lmbmRlZiBfR05VX1NPVVJDRVxuJworICAgICAgICAgICAgcHJlYW1ibGUgKz0gJyNkZWZpbmUgX0dOVV9TT1VSQ0VcbicKKyAgICAgICAgICAgIHByZWFtYmxlICs9ICcjZW5kaWZcbicKKyAgICAgICAgICAgIHByZWFtYmxlICs9ICcjaW5jbHVkZSA8c3RkaW8uaD5cbicKKyAgICAgICAgICAgIHByZWFtYmxlICs9ICcjaW5jbHVkZSA8c3RkbGliLmg+XG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgPHN0cmluZy5oPlxuJworICAgICAgICAgICAgcHJlYW1ibGUgKz0gJyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCJcbicKKyAgICAgICAgICAgIHByZWFtYmxlICs9ICcjaW5jbHVkZSAibG9hZGVyLmgiXG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgInZrX2xvYWRlcl9leHRlbnNpb25zLmgiXG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgPHZ1bGthbi92a19pY2QuaD5cbicKKyAgICAgICAgICAgIHByZWFtYmxlICs9ICcjaW5jbHVkZSAid3NpLmgiXG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgImRlYnVnX3V0aWxzLmgiXG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgImV4dGVuc2lvbl9tYW51YWwuaCJcbicKKworICAgICAgICBlbGlmIHNlbGYuZ2VuT3B0cy5maWxlbmFtZSA9PSAndmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCc6CisgICAgICAgICAgICBwcmVhbWJsZSArPSAnI3ByYWdtYSBvbmNlXG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAnXG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAndHlwZWRlZiBQRk5fdmtWb2lkRnVuY3Rpb24gKFZLQVBJX1BUUiAqUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBOYW1lKTtcbicKKworICAgICAgICB3cml0ZShjb3B5cmlnaHQsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICB3cml0ZShwcmVhbWJsZSwgZmlsZT1zZWxmLm91dEZpbGUpCisKKyAgICAjCisgICAgIyBXcml0ZSBnZW5lcmF0ZSBhbmQgd3JpdGUgZGlzcGF0Y2ggdGFibGVzIHRvIG91dHB1dCBmaWxlCisgICAgZGVmIGVuZEZpbGUoc2VsZik6CisgICAgICAgIGZpbGVfZGF0YSA9ICcnCisKKyAgICAgICAgaWYgc2VsZi5nZW5PcHRzLmZpbGVuYW1lID09ICd2a19sb2FkZXJfZXh0ZW5zaW9ucy5oJzoKKyAgICAgICAgICAgIGZpbGVfZGF0YSArPSBzZWxmLk91dHB1dFByb3RvdHlwZXNJbkhlYWRlcigpCisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRMb2FkZXJUZXJtaW5hdG9ycygpCisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRJY2REaXNwYXRjaFRhYmxlKCkKKyAgICAgICAgICAgIGZpbGVfZGF0YSArPSBzZWxmLk91dHB1dEljZEV4dGVuc2lvbkVuYWJsZVVuaW9uKCkKKworICAgICAgICBlbGlmIHNlbGYuZ2VuT3B0cy5maWxlbmFtZSA9PSAndmtfbG9hZGVyX2V4dGVuc2lvbnMuYyc6CisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRVdGlsaXRpZXNJblNvdXJjZSgpCisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRJY2REaXNwYXRjaFRhYmxlSW5pdCgpCisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRMb2FkZXJEaXNwYXRjaFRhYmxlcygpCisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRMb2FkZXJMb29rdXBGdW5jKCkKKyAgICAgICAgICAgIGZpbGVfZGF0YSArPSBzZWxmLkNyZWF0ZVRyYW1wVGVybUZ1bmNzKCkKKyAgICAgICAgICAgIGZpbGVfZGF0YSArPSBzZWxmLkluc3RFeHRlbnNpb25HUEEoKQorICAgICAgICAgICAgZmlsZV9kYXRhICs9IHNlbGYuSW5zdGFudEV4dGVuc2lvbkNyZWF0ZSgpCisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5EZXZpY2VFeHRlbnNpb25HZXRUZXJtaW5hdG9yKCkKKyAgICAgICAgICAgIGZpbGVfZGF0YSArPSBzZWxmLkluaXRJbnN0TG9hZGVyRXh0ZW5zaW9uRGlzcGF0Y2hUYWJsZSgpCisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRJbnN0YW50RXh0ZW5zaW9uV2hpdGVsaXN0QXJyYXkoKQorCisgICAgICAgIGVsaWYgc2VsZi5nZW5PcHRzLmZpbGVuYW1lID09ICd2a19sYXllcl9kaXNwYXRjaF90YWJsZS5oJzoKKyAgICAgICAgICAgIGZpbGVfZGF0YSArPSBzZWxmLk91dHB1dExheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlKCkKKyAgICAgICAgICAgIGZpbGVfZGF0YSArPSBzZWxmLk91dHB1dExheWVyRGV2aWNlRGlzcGF0Y2hUYWJsZSgpCisKKyAgICAgICAgd3JpdGUoZmlsZV9kYXRhLCBmaWxlPXNlbGYub3V0RmlsZSk7CisKKyAgICAgICAgIyBGaW5pc2ggcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5lbmRGaWxlKHNlbGYpCisKKyAgICBkZWYgYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCk6CisgICAgICAgICMgU3RhcnQgcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KQorICAgICAgICBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgPSBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpCisKKyAgICAgICAgZW51bXMgPSBpbnRlcmZhY2VbMF0uZmluZGFsbCgnZW51bScpCisgICAgICAgIHNlbGYuY3VycmVudEV4dGVuc2lvbiA9ICcnCisgICAgICAgIHNlbGYubmFtZV9kZWZpbml0aW9uID0gJycKKworICAgICAgICBmb3IgaXRlbSBpbiBlbnVtczoKKyAgICAgICAgICAgIG5hbWVfZGVmaW5pdGlvbiA9IGl0ZW0uZ2V0KCduYW1lJykKKyAgICAgICAgICAgIGlmICdFWFRFTlNJT05fTkFNRScgaW4gbmFtZV9kZWZpbml0aW9uOgorICAgICAgICAgICAgICAgIHNlbGYubmFtZV9kZWZpbml0aW9uID0gbmFtZV9kZWZpbml0aW9uCisKKyAgICAgICAgc2VsZi50eXBlID0gaW50ZXJmYWNlLmdldCgndHlwZScpCisgICAgICAgIHNlbGYubnVtX2NvbW1hbmRzID0gMAorICAgICAgICBuYW1lID0gaW50ZXJmYWNlLmdldCgnbmFtZScpCisgICAgICAgIHNlbGYuY3VycmVudEV4dGVuc2lvbiA9IG5hbWUgCisKKyAgICAjCisgICAgIyBQcm9jZXNzIGNvbW1hbmRzLCBhZGRpbmcgdG8gYXBwcm9wcmlhdGUgZGlzcGF0Y2ggdGFibGVzCisgICAgZGVmIGdlbkNtZChzZWxmLCBjbWRpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpCisKKyAgICAgICAgIyBHZXQgZmlyc3QgcGFyYW0gdHlwZQorICAgICAgICBwYXJhbXMgPSBjbWRpbmZvLmVsZW0uZmluZGFsbCgncGFyYW0nKQorICAgICAgICBpbmZvID0gc2VsZi5nZXRUeXBlTmFtZVR1cGxlKHBhcmFtc1swXSkKKworICAgICAgICBzZWxmLm51bV9jb21tYW5kcyArPSAxCisKKyAgICAgICAgaWYgJ2FuZHJvaWQnIG5vdCBpbiBuYW1lOgorICAgICAgICAgICAgc2VsZi5BZGRDb21tYW5kVG9EaXNwYXRjaExpc3Qoc2VsZi5jdXJyZW50RXh0ZW5zaW9uLCBzZWxmLnR5cGUsIG5hbWUsIGNtZGluZm8sIGluZm9bMF0pCisKKyAgICBkZWYgZW5kRmVhdHVyZShzZWxmKToKKworICAgICAgICBpZiAnYW5kcm9pZCcgbm90IGluIHNlbGYuY3VycmVudEV4dGVuc2lvbjoKKyAgICAgICAgICAgIHNlbGYuaW5zdGFuY2VFeHRlbnNpb25zLmFwcGVuZChzZWxmLkV4dGVuc2lvbkRhdGEobmFtZT1zZWxmLmN1cnJlbnRFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9c2VsZi50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0PXNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lPXNlbGYubmFtZV9kZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29tbWFuZHM9c2VsZi5udW1fY29tbWFuZHMpKQorCisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmVhdHVyZShzZWxmKQorCisgICAgIworICAgICMgUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBsZW4gdGFnCisgICAgZGVmIGdldExlbihzZWxmLCBwYXJhbSk6CisgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgbGVuID0gcGFyYW0uYXR0cmliLmdldCgnbGVuJykKKyAgICAgICAgaWYgbGVuIGFuZCBsZW4gIT0gJ251bGwtdGVybWluYXRlZCc6CisgICAgICAgICAgICAjIEZvciBzdHJpbmcgYXJyYXlzLCAnbGVuJyBjYW4gbG9vayBsaWtlICdjb3VudCxudWxsLXRlcm1pbmF0ZWQnLAorICAgICAgICAgICAgIyBpbmRpY2F0aW5nIHRoYXQgd2UgaGF2ZSBhIG51bGwgdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzLiAgV2UKKyAgICAgICAgICAgICMgc3RyaXAgdGhlIG51bGwtdGVybWluYXRlZCBmcm9tIHRoZSAnbGVuJyBmaWVsZCBhbmQgb25seSByZXR1cm4KKyAgICAgICAgICAgICMgdGhlIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBzdHJpbmcgY291bnQKKyAgICAgICAgICAgIGlmICdudWxsLXRlcm1pbmF0ZWQnIGluIGxlbjoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsZW4uc3BsaXQoJywnKVswXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsZW4KKyAgICAgICAgICAgIHJlc3VsdCA9IHN0cihyZXN1bHQpLnJlcGxhY2UoJzo6JywgJy0+JykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgIworICAgICMgRGV0ZXJtaW5lIGlmIHRoaXMgQVBJIHNob3VsZCBiZSBpZ25vcmVkIG9yIGFkZGVkIHRvIHRoZSBpbnN0YW5jZSBvciBkZXZpY2UgZGlzcGF0Y2ggdGFibGUKKyAgICBkZWYgQWRkQ29tbWFuZFRvRGlzcGF0Y2hMaXN0KHNlbGYsIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fdHlwZSwgbmFtZSwgY21kaW5mbywgaGFuZGxlX3R5cGUpOgorICAgICAgICBoYW5kbGUgPSBzZWxmLnJlZ2lzdHJ5LnRyZWUuZmluZCgidHlwZXMvdHlwZS9bbmFtZT0nIiArIGhhbmRsZV90eXBlICsgIiddW0BjYXRlZ29yeT0naGFuZGxlJ10iKQorCisgICAgICAgIHJldHVybl90eXBlID0gIGNtZGluZm8uZWxlbS5maW5kKCdwcm90by90eXBlJykKKyAgICAgICAgaWYgKHJldHVybl90eXBlIGlzIG5vdCBOb25lIGFuZCByZXR1cm5fdHlwZS50ZXh0ID09ICd2b2lkJyk6CisgICAgICAgICAgIHJldHVybl90eXBlID0gTm9uZQorCisgICAgICAgIHJlcXVpcmUgPSBOb25lCisgICAgICAgIGlmIG5hbWUgPT0gJ3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCc6CisgICAgICAgICAgICByZXF1aXJlX25vZGUgPSBzZWxmLnJlZ2lzdHJ5LnRyZWUuZmluZCgiLi9leHRlbnNpb25zL2V4dGVuc2lvbltAbmFtZT0ne30nXS9yZXF1aXJlL2NvbW1hbmRbQG5hbWU9J3t9J10vLi4iLmZvcm1hdChleHRlbnNpb25fbmFtZSwgbmFtZSkpCisgICAgICAgICAgICBpZiAnZXh0ZW5zaW9uJyBpbiByZXF1aXJlX25vZGUuYXR0cmliOgorICAgICAgICAgICAgICAgIHJlcXVpcmUgPSByZXF1aXJlX25vZGUuYXR0cmliWydleHRlbnNpb24nXQorCisgICAgICAgIGNtZF9wYXJhbXMgPSBbXQorCisgICAgICAgICMgR2VuZXJhdGUgYSBsaXN0IG9mIGNvbW1hbmRzIGZvciB1c2UgaW4gcHJpbnRpbmcgdGhlIG5lY2Vzc2FyeQorICAgICAgICAjIGNvcmUgaW5zdGFuY2UgdGVybWluYXRvciBwcm90b3R5cGVzCisgICAgICAgIHBhcmFtcyA9IGNtZGluZm8uZWxlbS5maW5kYWxsKCdwYXJhbScpCisgICAgICAgIGxlbnMgPSBzZXQoKQorICAgICAgICBmb3IgcGFyYW0gaW4gcGFyYW1zOgorICAgICAgICAgICAgbGVuID0gc2VsZi5nZXRMZW4ocGFyYW0pCisgICAgICAgICAgICBpZiBsZW46CisgICAgICAgICAgICAgICAgbGVucy5hZGQobGVuKQorICAgICAgICBwYXJhbXNJbmZvID0gW10KKyAgICAgICAgZm9yIHBhcmFtIGluIHBhcmFtczoKKyAgICAgICAgICAgIHBhcmFtSW5mbyA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShwYXJhbSkKKyAgICAgICAgICAgIHBhcmFtX3R5cGUgPSBwYXJhbUluZm9bMF0KKyAgICAgICAgICAgIHBhcmFtX25hbWUgPSBwYXJhbUluZm9bMV0KKyAgICAgICAgICAgIHBhcmFtX2NkZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbChwYXJhbSwgMCkKKyAgICAgICAgICAgIGNtZF9wYXJhbXMuYXBwZW5kKHNlbGYuQ29tbWFuZFBhcmFtKHR5cGU9cGFyYW1fdHlwZSwgbmFtZT1wYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9cGFyYW1fY2RlY2wpKQorCisgICAgICAgIGlmIGhhbmRsZSBpcyBub3QgTm9uZSBhbmQgaGFuZGxlX3R5cGUgIT0gJ1ZrSW5zdGFuY2UnIGFuZCBoYW5kbGVfdHlwZSAhPSAnVmtQaHlzaWNhbERldmljZSc6CisgICAgICAgICAgICAjIFRoZSBDb3JlIFZ1bGthbiBjb2RlIHdpbGwgYmUgd3JhcHBlZCBpbiBhIGZlYXR1cmUgY2FsbGVkIFZLX1ZFUlNJT05fI18jCisgICAgICAgICAgICAjIEZvciBleGFtcGxlOiBWS19WRVJTSU9OXzFfMCB3cmFwcyB0aGUgY29yZSAxLjAgVnVsa2FuIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgICAgIGlmICdWS19WRVJTSU9OXycgaW4gZXh0ZW5zaW9uX25hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5jb3JlX2NvbW1hbmRzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5Db21tYW5kRGF0YShuYW1lPW5hbWUsIGV4dF9uYW1lPWV4dGVuc2lvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF90eXBlPSdkZXZpY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmU9cmVxdWlyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0PXNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fdHlwZSA9IHJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90eXBlID0gaGFuZGxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gY21kX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGVjbD1zZWxmLm1ha2VDRGVjbHMoY21kaW5mby5lbGVtKVswXSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZXh0X2RldmljZV9kaXNwYXRjaF9saXN0LmFwcGVuZCgobmFtZSwgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmV4dF9jb21tYW5kcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuQ29tbWFuZERhdGEobmFtZT1uYW1lLCBleHRfbmFtZT1leHRlbnNpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfdHlwZT1leHRlbnNpb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlPXJlcXVpcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdD1zZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfdHlwZSA9IGhhbmRsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGNtZF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9c2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSlbMF0pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGUgQ29yZSBWdWxrYW4gY29kZSB3aWxsIGJlIHdyYXBwZWQgaW4gYSBmZWF0dXJlIGNhbGxlZCBWS19WRVJTSU9OXyNfIworICAgICAgICAgICAgIyBGb3IgZXhhbXBsZTogVktfVkVSU0lPTl8xXzAgd3JhcHMgdGhlIGNvcmUgMS4wIFZ1bGthbiBmdW5jdGlvbmFsaXR5CisgICAgICAgICAgICBpZiAnVktfVkVSU0lPTl8nIGluIGV4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuY29yZV9jb21tYW5kcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuQ29tbWFuZERhdGEobmFtZT1uYW1lLCBleHRfbmFtZT1leHRlbnNpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfdHlwZT0naW5zdGFuY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmU9cmVxdWlyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0PXNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fdHlwZSA9IHJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90eXBlID0gaGFuZGxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gY21kX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGVjbD1zZWxmLm1ha2VDRGVjbHMoY21kaW5mby5lbGVtKVswXSkpCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5leHRfaW5zdGFuY2VfZGlzcGF0Y2hfbGlzdC5hcHBlbmQoKG5hbWUsIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCkpCisgICAgICAgICAgICAgICAgc2VsZi5leHRfY29tbWFuZHMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICBzZWxmLkNvbW1hbmREYXRhKG5hbWU9bmFtZSwgZXh0X25hbWU9ZXh0ZW5zaW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X3R5cGU9ZXh0ZW5zaW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZT1yZXF1aXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3Q9c2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl90eXBlID0gcmV0dXJuX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3R5cGUgPSBoYW5kbGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBjbWRfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkZWNsPXNlbGYubWFrZUNEZWNscyhjbWRpbmZvLmVsZW0pWzBdKSkKKworICAgICMKKyAgICAjIFJldHJpZXZlIHRoZSB0eXBlIGFuZCBuYW1lIGZvciBhIHBhcmFtZXRlcgorICAgIGRlZiBnZXRUeXBlTmFtZVR1cGxlKHNlbGYsIHBhcmFtKToKKyAgICAgICAgdHlwZSA9ICcnCisgICAgICAgIG5hbWUgPSAnJworICAgICAgICBmb3IgZWxlbSBpbiBwYXJhbToKKyAgICAgICAgICAgIGlmIGVsZW0udGFnID09ICd0eXBlJzoKKyAgICAgICAgICAgICAgICB0eXBlID0gbm9uZVN0cihlbGVtLnRleHQpCisgICAgICAgICAgICBlbGlmIGVsZW0udGFnID09ICduYW1lJzoKKyAgICAgICAgICAgICAgICBuYW1lID0gbm9uZVN0cihlbGVtLnRleHQpCisgICAgICAgIHJldHVybiAodHlwZSwgbmFtZSkKKworICAgIGRlZiBPdXRwdXRQcm90b3R5cGVzSW5IZWFkZXIoc2VsZik6CisgICAgICAgIHByb3RvcyA9ICcnCisgICAgICAgIHByb3RvcyArPSAnLy8gU3RydWN0dXJlcyBkZWZpbmVkIGV4dGVybmFsbHksIGJ1dCB1c2VkIGhlcmVcbicKKyAgICAgICAgcHJvdG9zICs9ICdzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlO1xuJworICAgICAgICBwcm90b3MgKz0gJ3N0cnVjdCBsb2FkZXJfZGV2aWNlO1xuJworICAgICAgICBwcm90b3MgKz0gJ3N0cnVjdCBsb2FkZXJfaWNkX3Rlcm07XG4nCisgICAgICAgIHByb3RvcyArPSAnc3RydWN0IGxvYWRlcl9kZXZfZGlzcGF0Y2hfdGFibGU7XG4nCisgICAgICAgIHByb3RvcyArPSAnXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gRGV2aWNlIGV4dGVuc2lvbiBlcnJvciBmdW5jdGlvblxuJworICAgICAgICBwcm90b3MgKz0gJ1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0RldkV4dEVycm9yKFZrRGV2aWNlIGRldik7XG4nCisgICAgICAgIHByb3RvcyArPSAnXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gRXh0ZW5zaW9uIGludGVyY2VwdGlvbiBmb3IgdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZ1bmN0aW9uLCBzbyB3ZSBjYW4gcmV0dXJuXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gdGhlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIGZvciBhbnkgaW5zdGFuY2UgZXh0ZW5zaW9ucyB3ZSBrbm93IGFib3V0LlxuJworICAgICAgICBwcm90b3MgKz0gJ2Jvb2wgZXh0ZW5zaW9uX2luc3RhbmNlX2dwYShzdHJ1Y3QgbG9hZGVyX2luc3RhbmNlICpwdHJfaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKiphZGRyKTtcbicKKyAgICAgICAgcHJvdG9zICs9ICdcbicKKyAgICAgICAgcHJvdG9zICs9ICcvLyBFeHRlbnNpb24gaW50ZXJjZXB0aW9uIGZvciB2a0NyZWF0ZUluc3RhbmNlIGZ1bmN0aW9uLCBzbyB3ZSBjYW4gcHJvcGVybHlcbicKKyAgICAgICAgcHJvdG9zICs9ICcvLyBkZXRlY3QgYW5kIGVuYWJsZSBhbnkgaW5zdGFuY2UgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGZvciBleHRlbnNpb25zIHdlIGtub3dcbicKKyAgICAgICAgcHJvdG9zICs9ICcvLyBhYm91dC5cbicKKyAgICAgICAgcHJvdG9zICs9ICd2b2lkIGV4dGVuc2lvbnNfY3JlYXRlX2luc3RhbmNlKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSwgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKTtcbicKKyAgICAgICAgcHJvdG9zICs9ICdcbicKKyAgICAgICAgcHJvdG9zICs9ICcvLyBFeHRlbnNpb24gaW50ZXJjZXB0aW9uIGZvciB2a0dldERldmljZVByb2NBZGRyIGZ1bmN0aW9uLCBzbyB3ZSBjYW4gcmV0dXJuXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gYW4gYXBwcm9wcmlhdGUgdGVybWluYXRvciBpZiB0aGlzIGlzIG9uZSBvZiB0aG9zZSBmZXcgZGV2aWNlIGNvbW1hbmRzIHJlcXVpcmluZ1xuJworICAgICAgICBwcm90b3MgKz0gJy8vIGEgdGVybWluYXRvci5cbicKKyAgICAgICAgcHJvdG9zICs9ICdQRk5fdmtWb2lkRnVuY3Rpb24gZ2V0X2V4dGVuc2lvbl9kZXZpY2VfcHJvY190ZXJtaW5hdG9yKHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnBOYW1lKTtcbicKKyAgICAgICAgcHJvdG9zICs9ICdcbicKKyAgICAgICAgcHJvdG9zICs9ICcvLyBEaXNwYXRjaCB0YWJsZSBwcm9wZXJseSBmaWxsZWQgaW4gd2l0aCBhcHByb3ByaWF0ZSB0ZXJtaW5hdG9ycyBmb3IgdGhlXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gc3VwcG9ydGVkIGV4dGVuc2lvbnMuXG4nCisgICAgICAgIHByb3RvcyArPSAnZXh0ZXJuIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgaW5zdGFuY2VfZGlzcDtcbicKKyAgICAgICAgcHJvdG9zICs9ICdcbicKKyAgICAgICAgcHJvdG9zICs9ICcvLyBBcnJheSBvZiBleHRlbnNpb24gc3RyaW5ncyBmb3IgaW5zdGFuY2UgZXh0ZW5zaW9ucyB3ZSBzdXBwb3J0LlxuJworICAgICAgICBwcm90b3MgKz0gJ2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBMT0FERVJfSU5TVEFOQ0VfRVhURU5TSU9OU1tdO1xuJworICAgICAgICBwcm90b3MgKz0gJ1xuJworICAgICAgICBwcm90b3MgKz0gJ1ZLQVBJX0FUVFIgYm9vbCBWS0FQSV9DQUxMIGxvYWRlcl9pY2RfaW5pdF9lbnRyaWVzKHN0cnVjdCBsb2FkZXJfaWNkX3Rlcm0gKmljZF90ZXJtLCBWa0luc3RhbmNlIGluc3QsXG4nCisgICAgICAgIHByb3RvcyArPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcF9naXBhKTtcbicKKyAgICAgICAgcHJvdG9zICs9ICdcbicKKyAgICAgICAgcHJvdG9zICs9ICcvLyBJbml0IERldmljZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlIHdpdGggY29yZSBjb21tYW5kc1xuJworICAgICAgICBwcm90b3MgKz0gJ1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9pbml0X2RldmljZV9kaXNwYXRjaF90YWJsZShzdHJ1Y3QgbG9hZGVyX2Rldl9kaXNwYXRjaF90YWJsZSAqZGV2X3RhYmxlLCBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBncGEsXG4nCisgICAgICAgIHByb3RvcyArPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlIGRldik7XG4nCisgICAgICAgIHByb3RvcyArPSAnXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gSW5pdCBEZXZpY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGV4dGVuc2lvbiBjb21tYW5kc1xuJworICAgICAgICBwcm90b3MgKz0gJ1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9pbml0X2RldmljZV9leHRlbnNpb25fZGlzcGF0Y2hfdGFibGUoc3RydWN0IGxvYWRlcl9kZXZfZGlzcGF0Y2hfdGFibGUgKmRldl90YWJsZSxcbicKKyAgICAgICAgcHJvdG9zICs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ2lwYSxcbicKKyAgICAgICAgcHJvdG9zICs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGdkcGEsXG4nCisgICAgICAgIHByb3RvcyArPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luc3RhbmNlIGluc3QsXG4nCisgICAgICAgIHByb3RvcyArPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZSBkZXYpO1xuJworICAgICAgICBwcm90b3MgKz0gJ1xuJworICAgICAgICBwcm90b3MgKz0gJy8vIEluaXQgSW5zdGFuY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGNvcmUgY29tbWFuZHNcbicKKyAgICAgICAgcHJvdG9zICs9ICdWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBsb2FkZXJfaW5pdF9pbnN0YW5jZV9jb3JlX2Rpc3BhdGNoX3RhYmxlKFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnRhYmxlLCBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGdwYSxcbicKKyAgICAgICAgcHJvdG9zICs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UgaW5zdCk7XG4nCisgICAgICAgIHByb3RvcyArPSAnXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gSW5pdCBJbnN0YW5jZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlIHdpdGggY29yZSBjb21tYW5kc1xuJworICAgICAgICBwcm90b3MgKz0gJ1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9pbml0X2luc3RhbmNlX2V4dGVuc2lvbl9kaXNwYXRjaF90YWJsZShWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICp0YWJsZSwgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBncGEsXG4nCisgICAgICAgIHByb3RvcyArPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UgaW5zdCk7XG4nCisgICAgICAgIHByb3RvcyArPSAnXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gRGV2aWNlIGNvbW1hbmQgbG9va3VwIGZ1bmN0aW9uXG4nCisgICAgICAgIHByb3RvcyArPSAnVktBUElfQVRUUiB2b2lkKiBWS0FQSV9DQUxMIGxvYWRlcl9sb29rdXBfZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbnN0IFZrTGF5ZXJEaXNwYXRjaFRhYmxlICp0YWJsZSwgY29uc3QgY2hhciAqbmFtZSk7XG4nCisgICAgICAgIHByb3RvcyArPSAnXG4nCisgICAgICAgIHByb3RvcyArPSAnLy8gSW5zdGFuY2UgY29tbWFuZCBsb29rdXAgZnVuY3Rpb25cbicKKyAgICAgICAgcHJvdG9zICs9ICdWS0FQSV9BVFRSIHZvaWQqIFZLQVBJX0NBTEwgbG9hZGVyX2xvb2t1cF9pbnN0YW5jZV9kaXNwYXRjaF90YWJsZShjb25zdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICp0YWJsZSwgY29uc3QgY2hhciAqbmFtZSxcbicKKyAgICAgICAgcHJvdG9zICs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpmb3VuZF9uYW1lKTtcbicKKyAgICAgICAgcHJvdG9zICs9ICdcbicKKyAgICAgICAgcHJvdG9zICs9ICdWS0FQSV9BVFRSIGJvb2wgVktBUElfQ0FMTCBsb2FkZXJfaWNkX2luaXRfZW50cmllcyhzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSwgVmtJbnN0YW5jZSBpbnN0LFxuJworICAgICAgICBwcm90b3MgKz0gJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBfZ2lwYSk7XG4nCisgICAgICAgIHByb3RvcyArPSAnXG4nCisgICAgICAgIHJldHVybiBwcm90b3MKKworICAgIGRlZiBPdXRwdXRVdGlsaXRpZXNJblNvdXJjZShzZWxmKToKKyAgICAgICAgcHJvdG9zID0gJycKKyAgICAgICAgcHJvdG9zICs9ICcvLyBEZXZpY2UgZXh0ZW5zaW9uIGVycm9yIGZ1bmN0aW9uXG4nCisgICAgICAgIHByb3RvcyArPSAnVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRGV2RXh0RXJyb3IoVmtEZXZpY2UgZGV2KSB7XG4nCisgICAgICAgIHByb3RvcyArPSAnICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpmb3VuZF9kZXY7XG4nCisgICAgICAgIHByb3RvcyArPSAnICAgIC8vIFRoZSBkZXZpY2UgZ29pbmcgaW4gaXMgYSB0cmFtcG9saW5lIGRldmljZVxuJworICAgICAgICBwcm90b3MgKz0gJyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGxvYWRlcl9nZXRfaWNkX2FuZF9kZXZpY2UoZGV2LCAmZm91bmRfZGV2LCBOVUxMKTtcbicKKyAgICAgICAgcHJvdG9zICs9ICdcbicKKyAgICAgICAgcHJvdG9zICs9ICcgICAgaWYgKGljZF90ZXJtKVxuJworICAgICAgICBwcm90b3MgKz0gJyAgICAgICAgbG9hZGVyX2xvZyhpY2RfdGVybS0+dGhpc19pbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsXG4nCisgICAgICAgIHByb3RvcyArPSAnICAgICAgICAgICAgICAgICAgICJCYWQgZGVzdGluYXRpb24gaW4gbG9hZGVyIHRyYW1wb2xpbmUgZGlzcGF0Y2gsIlxuJworICAgICAgICBwcm90b3MgKz0gJyAgICAgICAgICAgICAgICAgICAiQXJlIGxheWVycyBhbmQgZXh0ZW5zaW9ucyB0aGF0IHlvdSBhcmUgY2FsbGluZyBlbmFibGVkPyIpO1xuJworICAgICAgICBwcm90b3MgKz0gJyAgICByZXR1cm4gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UO1xuJworICAgICAgICBwcm90b3MgKz0gJ31cblxuJworICAgICAgICByZXR1cm4gcHJvdG9zCisKKyAgICAjCisgICAgIyBDcmVhdGUgYSBsYXllciBpbnN0YW5jZSBkaXNwYXRjaCB0YWJsZSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcKKyAgICBkZWYgT3V0cHV0TGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUoc2VsZik6CisgICAgICAgIGNvbW1hbmRzID0gW10KKyAgICAgICAgdGFibGUgPSAnJworICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSAnJworCisgICAgICAgIHRhYmxlICs9ICcvLyBJbnN0YW5jZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlXG4nCisgICAgICAgIHRhYmxlICs9ICd0eXBlZGVmIHN0cnVjdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlXyB7XG4nCisKKyAgICAgICAgIyBGaXJzdCBhZGQgaW4gYW4gZW50cnkgZm9yIEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIuICBUaGlzIHdpbGwgbm90CisgICAgICAgICMgZXZlciBzaG93IHVwIGluIHRoZSBYTUwgb3IgaGVhZGVyLCBzbyB3ZSBoYXZlIHRvIG1hbnVhbGx5IGFkZCBpdC4KKyAgICAgICAgdGFibGUgKz0gJyAgICAvLyBNYW51YWxseSBhZGQgaW4gR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciBlbnRyeVxuJworICAgICAgICB0YWJsZSArPSAnICAgIFBGTl9HZXRQaHlzaWNhbERldmljZVByb2NBZGRyIEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHI7XG4nCisKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMCwgMik6CisgICAgICAgICAgICBpZiB4ID09IDA6CisgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmNvcmVfY29tbWFuZHMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmV4dF9jb21tYW5kcworCisgICAgICAgICAgICBmb3IgY3VyX2NtZCBpbiBjb21tYW5kczoKKyAgICAgICAgICAgICAgICBpc19pbnN0X2hhbmRsZV90eXBlID0gY3VyX2NtZC5uYW1lIGluIEFERF9JTlNUX0NNRFMgb3IgY3VyX2NtZC5oYW5kbGVfdHlwZSA9PSAnVmtJbnN0YW5jZScgb3IgY3VyX2NtZC5oYW5kbGVfdHlwZSA9PSAnVmtQaHlzaWNhbERldmljZScKKyAgICAgICAgICAgICAgICBpZiBpc19pbnN0X2hhbmRsZV90eXBlOgorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQuZXh0X25hbWUgIT0gY3VyX2V4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ1ZLX1ZFUlNJT05fJyBpbiBjdXJfY21kLmV4dF9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICdcbiAgICAvLyAtLS0tIENvcmUgJXMgY29tbWFuZHNcbicgJSBjdXJfY21kLmV4dF9uYW1lWzExOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJ1xuICAgIC8vIC0tLS0gJXMgZXh0ZW5zaW9uIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gY3VyX2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9IGN1cl9jbWQubmFtZVsyOl0KKworICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJyAgICBQRk5fJXMgJXM7XG4nICUgKGN1cl9jbWQubmFtZSwgYmFzZV9uYW1lKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBjdXJfY21kLnByb3RlY3QKKworICAgICAgICB0YWJsZSArPSAnfSBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlO1xuXG4nCisgICAgICAgIHJldHVybiB0YWJsZQorCisgICAgIworICAgICMgQ3JlYXRlIGEgbGF5ZXIgZGV2aWNlIGRpc3BhdGNoIHRhYmxlIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxpc3QgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZworICAgIGRlZiBPdXRwdXRMYXllckRldmljZURpc3BhdGNoVGFibGUoc2VsZik6CisgICAgICAgIGNvbW1hbmRzID0gW10KKyAgICAgICAgdGFibGUgPSAnJworICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSAnJworCisgICAgICAgIHRhYmxlICs9ICcvLyBEZXZpY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZVxuJworICAgICAgICB0YWJsZSArPSAndHlwZWRlZiBzdHJ1Y3QgVmtMYXllckRpc3BhdGNoVGFibGVfIHtcbicKKworICAgICAgICBmb3IgeCBpbiByYW5nZSgwLCAyKToKKyAgICAgICAgICAgIGlmIHggPT0gMDoKKyAgICAgICAgICAgICAgICBjb21tYW5kcyA9IHNlbGYuY29yZV9jb21tYW5kcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb21tYW5kcyA9IHNlbGYuZXh0X2NvbW1hbmRzCisKKyAgICAgICAgICAgIGZvciBjdXJfY21kIGluIGNvbW1hbmRzOgorICAgICAgICAgICAgICAgIGlzX2luc3RfaGFuZGxlX3R5cGUgPSBjdXJfY21kLm5hbWUgaW4gQUREX0lOU1RfQ01EUyBvciBjdXJfY21kLmhhbmRsZV90eXBlID09ICdWa0luc3RhbmNlJyBvciBjdXJfY21kLmhhbmRsZV90eXBlID09ICdWa1BoeXNpY2FsRGV2aWNlJworICAgICAgICAgICAgICAgIGlmIG5vdCBpc19pbnN0X2hhbmRsZV90eXBlOgorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQuZXh0X25hbWUgIT0gY3VyX2V4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ1ZLX1ZFUlNJT05fJyBpbiBjdXJfY21kLmV4dF9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICdcbiAgICAvLyAtLS0tIENvcmUgJXMgY29tbWFuZHNcbicgJSBjdXJfY21kLmV4dF9uYW1lWzExOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJ1xuICAgIC8vIC0tLS0gJXMgZXh0ZW5zaW9uIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gY3VyX2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9IGN1cl9jbWQubmFtZVsyOl0KKworICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJyAgICBQRk5fJXMgJXM7XG4nICUgKGN1cl9jbWQubmFtZSwgYmFzZV9uYW1lKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBjdXJfY21kLnByb3RlY3QKKworICAgICAgICB0YWJsZSArPSAnfSBWa0xheWVyRGlzcGF0Y2hUYWJsZTtcblxuJworICAgICAgICByZXR1cm4gdGFibGUKKworICAgICMKKyAgICAjIENyZWF0ZSBhIGRpc3BhdGNoIHRhYmxlIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxpc3QgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZworICAgIGRlZiBPdXRwdXRJY2REaXNwYXRjaFRhYmxlKHNlbGYpOgorICAgICAgICBjb21tYW5kcyA9IFtdCisgICAgICAgIHRhYmxlID0gJycKKyAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gJycKKworICAgICAgICB0YWJsZSArPSAnLy8gSUNEIGZ1bmN0aW9uIHBvaW50ZXIgZGlzcGF0Y2ggdGFibGVcbicKKyAgICAgICAgdGFibGUgKz0gJ3N0cnVjdCBsb2FkZXJfaWNkX3Rlcm1fZGlzcGF0Y2gge1xuJworCisgICAgICAgIGZvciB4IGluIHJhbmdlKDAsIDIpOgorICAgICAgICAgICAgaWYgeCA9PSAwOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gc2VsZi5jb3JlX2NvbW1hbmRzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gc2VsZi5leHRfY29tbWFuZHMKKworICAgICAgICAgICAgZm9yIGN1cl9jbWQgaW4gY29tbWFuZHM6CisgICAgICAgICAgICAgICAgaXNfaW5zdF9oYW5kbGVfdHlwZSA9IGN1cl9jbWQubmFtZSBpbiBBRERfSU5TVF9DTURTIG9yIGN1cl9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrSW5zdGFuY2UnIG9yIGN1cl9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnCisgICAgICAgICAgICAgICAgaWYgKChpc19pbnN0X2hhbmRsZV90eXBlIG9yIGN1cl9jbWQubmFtZSBpbiBERVZJQ0VfQ01EU19ORUVEX1RFUk0pIGFuZAorICAgICAgICAgICAgICAgICAgICAoY3VyX2NtZC5uYW1lICE9ICd2a0dldEluc3RhbmNlUHJvY0FkZHInIGFuZCBjdXJfY21kLm5hbWUgIT0gJ3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzJykpOgorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQuZXh0X25hbWUgIT0gY3VyX2V4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ1ZLX1ZFUlNJT05fJyBpbiBjdXJfY21kLmV4dF9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICdcbiAgICAvLyAtLS0tIENvcmUgJXMgY29tbWFuZHNcbicgJSBjdXJfY21kLmV4dF9uYW1lWzExOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJ1xuICAgIC8vIC0tLS0gJXMgZXh0ZW5zaW9uIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gY3VyX2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9IGN1cl9jbWQubmFtZVsyOl0KKworICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJyAgICBQRk5fJXMgJXM7XG4nICUgKGN1cl9jbWQubmFtZSwgYmFzZV9uYW1lKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBjdXJfY21kLnByb3RlY3QKKworICAgICAgICB0YWJsZSArPSAnfTtcblxuJworICAgICAgICByZXR1cm4gdGFibGUKKworICAgICMKKyAgICAjIEluaXQgYSBkaXNwYXRjaCB0YWJsZSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcKKyAgICBkZWYgT3V0cHV0SWNkRGlzcGF0Y2hUYWJsZUluaXQoc2VsZik6CisgICAgICAgIGNvbW1hbmRzID0gW10KKyAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gJycKKworICAgICAgICB0YWJsZSA9ICcnCisgICAgICAgIHRhYmxlICs9ICdWS0FQSV9BVFRSIGJvb2wgVktBUElfQ0FMTCBsb2FkZXJfaWNkX2luaXRfZW50cmllcyhzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSwgVmtJbnN0YW5jZSBpbnN0LFxuJworICAgICAgICB0YWJsZSArPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcF9naXBhKSB7XG4nCisgICAgICAgIHRhYmxlICs9ICdcbicKKyAgICAgICAgdGFibGUgKz0gJyNkZWZpbmUgTE9PS1VQX0dJUEEoZnVuYywgcmVxdWlyZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuJworICAgICAgICB0YWJsZSArPSAnICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4nCisgICAgICAgIHRhYmxlICs9ICcgICAgICAgIGljZF90ZXJtLT5kaXNwYXRjaC5mdW5jID0gKFBGTl92ayMjZnVuYylmcF9naXBhKGluc3QsICJ2ayIgI2Z1bmMpOyAgICAgICAgICAgICAgICAgXFxcbicKKyAgICAgICAgdGFibGUgKz0gJyAgICAgICAgaWYgKCFpY2RfdGVybS0+ZGlzcGF0Y2guZnVuYyAmJiByZXF1aXJlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuJworICAgICAgICB0YWJsZSArPSAnICAgICAgICAgICAgbG9hZGVyX2xvZygoc3RydWN0IGxvYWRlcl9pbnN0YW5jZSAqKWluc3QsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsIFxcXG4nCisgICAgICAgIHRhYmxlICs9ICcgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzX2Vycm9yKCJ2ayIgI2Z1bmMpKTsgICAgICAgICAgICAgICAgXFxcbicKKyAgICAgICAgdGFibGUgKz0gJyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuJworICAgICAgICB0YWJsZSArPSAnICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4nCisgICAgICAgIHRhYmxlICs9ICcgICAgfSB3aGlsZSAoMClcbicKKyAgICAgICAgdGFibGUgKz0gJ1xuJworCisgICAgICAgIHNraXBfZ2lwYV9jb21tYW5kcyA9IFsndmtHZXRJbnN0YW5jZVByb2NBZGRyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtDcmVhdGVJbnN0YW5jZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorCisgICAgICAgIGZvciB4IGluIHJhbmdlKDAsIDIpOgorICAgICAgICAgICAgaWYgeCA9PSAwOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gc2VsZi5jb3JlX2NvbW1hbmRzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gc2VsZi5leHRfY29tbWFuZHMKKworICAgICAgICAgICAgcmVxdWlyZWQgPSBGYWxzZQorICAgICAgICAgICAgZm9yIGN1cl9jbWQgaW4gY29tbWFuZHM6CisgICAgICAgICAgICAgICAgaXNfaW5zdF9oYW5kbGVfdHlwZSA9IGN1cl9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrSW5zdGFuY2UnIG9yIGN1cl9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnCisgICAgICAgICAgICAgICAgaWYgKChpc19pbnN0X2hhbmRsZV90eXBlIG9yIGN1cl9jbWQubmFtZSBpbiBERVZJQ0VfQ01EU19ORUVEX1RFUk0pIGFuZCAoY3VyX2NtZC5uYW1lIG5vdCBpbiBza2lwX2dpcGFfY29tbWFuZHMpKToKKworICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLmV4dF9uYW1lICE9IGN1cl9leHRlbnNpb25fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICdWS19WRVJTSU9OXycgaW4gY3VyX2NtZC5leHRfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArPSAnXG4gICAgLy8gLS0tLSBDb3JlICVzXG4nICUgY3VyX2NtZC5leHRfbmFtZVsxMTpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSBjdXJfY21kLmV4dF9uYW1lID09ICdWS19WRVJTSU9OXzFfMCcKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJ1xuICAgIC8vIC0tLS0gJXMgZXh0ZW5zaW9uIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9leHRlbnNpb25fbmFtZSA9IGN1cl9jbWQuZXh0X25hbWUKKworICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZSAndmsnIGZyb20gcHJvdG8gbmFtZQorICAgICAgICAgICAgICAgICAgICBiYXNlX25hbWUgPSBjdXJfY21kLm5hbWVbMjpdCisKKyAgICAgICAgICAgICAgICAgICAgaWYgY3VyX2NtZC5wcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJyNpZmRlZiAlc1xuJyAlIGN1cl9jbWQucHJvdGVjdAorCisgICAgICAgICAgICAgICAgICAgICMgVGhlIENvcmUgVnVsa2FuIGNvZGUgd2lsbCBiZSB3cmFwcGVkIGluIGEgZmVhdHVyZSBjYWxsZWQgVktfVkVSU0lPTl8jXyMKKyAgICAgICAgICAgICAgICAgICAgIyBGb3IgZXhhbXBsZTogVktfVkVSU0lPTl8xXzAgd3JhcHMgdGhlIGNvcmUgMS4wIFZ1bGthbiBmdW5jdGlvbmFsaXR5CisgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICcgICAgTE9PS1VQX0dJUEEoJXMsICVzKTtcbicgJSAoYmFzZV9uYW1lLCAndHJ1ZScgaWYgcmVxdWlyZWQgZWxzZSAnZmFsc2UnKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBjdXJfY21kLnByb3RlY3QKKworICAgICAgICB0YWJsZSArPSAnXG4nCisgICAgICAgIHRhYmxlICs9ICcjdW5kZWYgTE9PS1VQX0dJUEFcbicKKyAgICAgICAgdGFibGUgKz0gJ1xuJworICAgICAgICB0YWJsZSArPSAnICAgIHJldHVybiB0cnVlO1xuJworICAgICAgICB0YWJsZSArPSAnfTtcblxuJworICAgICAgICByZXR1cm4gdGFibGUKKworICAgICMKKyAgICAjIENyZWF0ZSB0aGUgZXh0ZW5zaW9uIGVuYWJsZSB1bmlvbgorICAgIGRlZiBPdXRwdXRJY2RFeHRlbnNpb25FbmFibGVVbmlvbihzZWxmKToKKyAgICAgICAgZXh0ZW5zaW9ucyA9IHNlbGYuaW5zdGFuY2VFeHRlbnNpb25zCisKKyAgICAgICAgdW5pb24gPSAnJworICAgICAgICB1bmlvbiArPSAndW5pb24gbG9hZGVyX2luc3RhbmNlX2V4dGVuc2lvbl9lbmFibGVzIHtcbicKKyAgICAgICAgdW5pb24gKz0gJyAgICBzdHJ1Y3Qge1xuJworICAgICAgICBmb3IgZXh0IGluIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBpZiAoJ1ZLX1ZFUlNJT05fJyBpbiBleHQubmFtZSBvciBleHQubmFtZSBpbiBXU0lfRVhUX05BTUVTIG9yCisgICAgICAgICAgICAgICAgZXh0LnR5cGUgPT0gJ2RldmljZScgb3IgZXh0Lm51bV9jb21tYW5kcyA9PSAwKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB1bmlvbiArPSAnICAgICAgICB1aW50OF90ICVzIDogMTtcbicgJSBleHQubmFtZVszOl0ubG93ZXIoKQorCisgICAgICAgIHVuaW9uICs9ICcgICAgfTtcbicKKyAgICAgICAgdW5pb24gKz0gJyAgICB1aW50NjRfdCBwYWRkaW5nWzRdO1xuJworICAgICAgICB1bmlvbiArPSAnfTtcblxuJworICAgICAgICByZXR1cm4gdW5pb24KKworICAgICMKKyAgICAjIENyZWF0ZXMgdGhlIHByb3RvdHlwZXMgZm9yIHRoZSBsb2FkZXIncyBjb3JlIGluc3RhbmNlIGNvbW1hbmQgdGVybWluYXRvcnMKKyAgICBkZWYgT3V0cHV0TG9hZGVyVGVybWluYXRvcnMoc2VsZik6CisgICAgICAgIHRlcm1pbmF0b3JzID0gJycKKyAgICAgICAgdGVybWluYXRvcnMgKz0gJy8vIExvYWRlciBjb3JlIGluc3RhbmNlIHRlcm1pbmF0b3JzXG4nCisKKyAgICAgICAgZm9yIGN1cl9jbWQgaW4gc2VsZi5jb3JlX2NvbW1hbmRzOgorICAgICAgICAgICAgaXNfaW5zdF9oYW5kbGVfdHlwZSA9IGN1cl9jbWQubmFtZSBpbiBBRERfSU5TVF9DTURTIG9yIGN1cl9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrSW5zdGFuY2UnIG9yIGN1cl9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnCisgICAgICAgICAgICBpZiBpc19pbnN0X2hhbmRsZV90eXBlOgorICAgICAgICAgICAgICAgIG1vZF9zdHJpbmcgPSAnJworICAgICAgICAgICAgICAgIG5ld190ZXJtaW5hdG9yID0gY3VyX2NtZC5jZGVjbAorICAgICAgICAgICAgICAgIG1vZF9zdHJpbmcgPSBuZXdfdGVybWluYXRvci5yZXBsYWNlKCJWS0FQSV9DQUxMIHZrIiwgIlZLQVBJX0NBTEwgdGVybWluYXRvcl8iKQorCisgICAgICAgICAgICAgICAgaWYgY3VyX2NtZC5uYW1lIGluIFBSRV9JTlNUQU5DRV9GVU5DVElPTlM6CisgICAgICAgICAgICAgICAgICAgIG1vZF9zdHJpbmcgPSBtb2Rfc3RyaW5nLnJlcGxhY2UoY3VyX2NtZC5uYW1lWzI6XSArICcoXG4nLCBjdXJfY21kLm5hbWVbMjpdICsgJyhcbiAgICBjb25zdCBWaycgKyBjdXJfY21kLm5hbWVbMjpdICsgJ0NoYWluKiBjaGFpbixcbicpCisKKyAgICAgICAgICAgICAgICBpZiAoY3VyX2NtZC5wcm90ZWN0IGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgdGVybWluYXRvcnMgKz0gJyNpZmRlZiAlc1xuJyAlIGN1cl9jbWQucHJvdGVjdAorCisgICAgICAgICAgICAgICAgdGVybWluYXRvcnMgKz0gbW9kX3N0cmluZworICAgICAgICAgICAgICAgIHRlcm1pbmF0b3JzICs9ICdcbicKKworICAgICAgICAgICAgICAgIGlmIChjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdG9ycyArPSAnI2VuZGlmIC8vICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgdGVybWluYXRvcnMgKz0gJ1xuJworICAgICAgICByZXR1cm4gdGVybWluYXRvcnMKKworICAgICMKKyAgICAjIENyZWF0ZXMgY29kZSB0byBpbml0aWFsaXplIHRoZSB2YXJpb3VzIGRpc3BhdGNoIHRhYmxlcworICAgIGRlZiBPdXRwdXRMb2FkZXJEaXNwYXRjaFRhYmxlcyhzZWxmKToKKyAgICAgICAgY29tbWFuZHMgPSBbXQorICAgICAgICB0YWJsZXMgPSAnJworICAgICAgICBncGFfcGFyYW0gPSAnJworICAgICAgICBjdXJfdHlwZSA9ICcnCisgICAgICAgIGN1cl9leHRlbnNpb25fbmFtZSA9ICcnCisKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMCwgNCk6CisgICAgICAgICAgICBpZiB4ID09IDA6CisgICAgICAgICAgICAgICAgY3VyX3R5cGUgPSAnZGV2aWNlJworICAgICAgICAgICAgICAgIGdwYV9wYXJhbSA9ICdkZXYnCisgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmNvcmVfY29tbWFuZHMKKworICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnLy8gSW5pdCBEZXZpY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZSB3aXRoIGNvcmUgY29tbWFuZHNcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJ1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGxvYWRlcl9pbml0X2RldmljZV9kaXNwYXRjaF90YWJsZShzdHJ1Y3QgbG9hZGVyX2Rldl9kaXNwYXRjaF90YWJsZSAqZGV2X3RhYmxlLCBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBncGEsXG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2UgZGV2KSB7XG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnRhYmxlID0gJmRldl90YWJsZS0+Y29yZV9kaXNwYXRjaDtcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTUFYX05VTV9VTktOT1dOX0VYVFM7IGkrKykgZGV2X3RhYmxlLT5leHRfZGlzcGF0Y2guZGV2X2V4dFtpXSA9IChQRk5fdmtEZXZFeHQpdmtEZXZFeHRFcnJvcjtcbicKKworICAgICAgICAgICAgZWxpZiB4ID09IDE6CisgICAgICAgICAgICAgICAgY3VyX3R5cGUgPSAnZGV2aWNlJworICAgICAgICAgICAgICAgIGdwYV9wYXJhbSA9ICdkZXYnCisgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmV4dF9jb21tYW5kcworCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcvLyBJbml0IERldmljZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlIHdpdGggZXh0ZW5zaW9uIGNvbW1hbmRzXG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICdWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBsb2FkZXJfaW5pdF9kZXZpY2VfZXh0ZW5zaW9uX2Rpc3BhdGNoX3RhYmxlKHN0cnVjdCBsb2FkZXJfZGV2X2Rpc3BhdGNoX3RhYmxlICpkZXZfdGFibGUsXG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ2lwYSxcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZ2RwYSxcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbnN0YW5jZSBpbnN0LFxuJworICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZSBkZXYpIHtcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqdGFibGUgPSAmZGV2X3RhYmxlLT5jb3JlX2Rpc3BhdGNoO1xuJworCisgICAgICAgICAgICBlbGlmIHggPT0gMjoKKyAgICAgICAgICAgICAgICBjdXJfdHlwZSA9ICdpbnN0YW5jZScKKyAgICAgICAgICAgICAgICBncGFfcGFyYW0gPSAnaW5zdCcKKyAgICAgICAgICAgICAgICBjb21tYW5kcyA9IHNlbGYuY29yZV9jb21tYW5kcworCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcvLyBJbml0IEluc3RhbmNlIGZ1bmN0aW9uIHBvaW50ZXIgZGlzcGF0Y2ggdGFibGUgd2l0aCBjb3JlIGNvbW1hbmRzXG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICdWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBsb2FkZXJfaW5pdF9pbnN0YW5jZV9jb3JlX2Rpc3BhdGNoX3RhYmxlKFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnRhYmxlLCBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGdwYSxcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbnN0YW5jZSBpbnN0KSB7XG4nCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3VyX3R5cGUgPSAnaW5zdGFuY2UnCisgICAgICAgICAgICAgICAgZ3BhX3BhcmFtID0gJ2luc3QnCisgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmV4dF9jb21tYW5kcworCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcvLyBJbml0IEluc3RhbmNlIGZ1bmN0aW9uIHBvaW50ZXIgZGlzcGF0Y2ggdGFibGUgd2l0aCBjb3JlIGNvbW1hbmRzXG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICdWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBsb2FkZXJfaW5pdF9pbnN0YW5jZV9leHRlbnNpb25fZGlzcGF0Y2hfdGFibGUoVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqdGFibGUsIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ3BhLFxuJworICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbnN0YW5jZSBpbnN0KSB7XG4nCisKKyAgICAgICAgICAgIGZvciBjdXJfY21kIGluIGNvbW1hbmRzOgorICAgICAgICAgICAgICAgIGlzX2luc3RfaGFuZGxlX3R5cGUgPSBjdXJfY21kLmhhbmRsZV90eXBlID09ICdWa0luc3RhbmNlJyBvciBjdXJfY21kLmhhbmRsZV90eXBlID09ICdWa1BoeXNpY2FsRGV2aWNlJworICAgICAgICAgICAgICAgIGlmICgoY3VyX3R5cGUgPT0gJ2luc3RhbmNlJyBhbmQgaXNfaW5zdF9oYW5kbGVfdHlwZSkgb3IgKGN1cl90eXBlID09ICdkZXZpY2UnIGFuZCBub3QgaXNfaW5zdF9oYW5kbGVfdHlwZSkpOgorICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLmV4dF9uYW1lICE9IGN1cl9leHRlbnNpb25fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICdWS19WRVJTSU9OXycgaW4gY3VyX2NtZC5leHRfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJ1xuICAgIC8vIC0tLS0gQ29yZSAlcyBjb21tYW5kc1xuJyAlIGN1cl9jbWQuZXh0X25hbWVbMTE6XQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJ1xuICAgIC8vIC0tLS0gJXMgZXh0ZW5zaW9uIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gY3VyX2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9IGN1cl9jbWQubmFtZVsyOl0KKworICAgICAgICAgICAgICAgICAgICAjIE5hbWVzIHRvIHNraXAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VfbmFtZSA9PSAnQ3JlYXRlSW5zdGFuY2UnIG9yIGJhc2VfbmFtZSA9PSAnQ3JlYXRlRGV2aWNlJyBvcgorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9uYW1lID09ICdFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMnIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX25hbWUgPT0gJ0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJyBvcgorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9uYW1lID09ICdFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgY3VyX2NtZC5wcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzICs9ICcjaWZkZWYgJXNcbicgJSBjdXJfY21kLnByb3RlY3QKKworICAgICAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIGxvb2tpbmcgZm9yIHRoZSBwcm9jIHdlIGFyZSBwYXNzaW5nIGluLCBqdXN0IHBvaW50IHRoZSB0YWJsZSB0byBpdC4gIFRoaXMgZml4ZXMgdGhlIGlzc3VlIHdoZXJlCisgICAgICAgICAgICAgICAgICAgICMgYSBsYXllciBvdmVycmlkZXMgdGhlIGZ1bmN0aW9uIG5hbWUgZm9yIHRoZSBsb2FkZXIuCisgICAgICAgICAgICAgICAgICAgIGlmIHggPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJhc2VfbmFtZSA9PSAnR2V0RGV2aWNlUHJvY0FkZHInOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnICAgIHRhYmxlLT5HZXREZXZpY2VQcm9jQWRkciA9IGdkcGE7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGN1cl9jbWQuZXh0X3R5cGUgPT0gJ2luc3RhbmNlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICB0YWJsZS0+JXMgPSAoUEZOXyVzKWdpcGEoaW5zdCwgIiVzIik7XG4nICUgKGJhc2VfbmFtZSwgY3VyX2NtZC5uYW1lLCBjdXJfY21kLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnICAgIHRhYmxlLT4lcyA9IChQRk5fJXMpZ2RwYShkZXYsICIlcyIpO1xuJyAlIChiYXNlX25hbWUsIGN1cl9jbWQubmFtZSwgY3VyX2NtZC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBlbGlmICh4IDwgMSBhbmQgYmFzZV9uYW1lID09ICdHZXREZXZpY2VQcm9jQWRkcicpOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzICs9ICcgICAgdGFibGUtPkdldERldmljZVByb2NBZGRyID0gZ3BhO1xuJworICAgICAgICAgICAgICAgICAgICBlbGlmICh4ID4gMSBhbmQgYmFzZV9uYW1lID09ICdHZXRJbnN0YW5jZVByb2NBZGRyJyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICB0YWJsZS0+R2V0SW5zdGFuY2VQcm9jQWRkciA9IGdwYTtcbicKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnICAgIHRhYmxlLT4lcyA9IChQRk5fJXMpZ3BhKCVzLCAiJXMiKTtcbicgJSAoYmFzZV9uYW1lLCBjdXJfY21kLm5hbWUsIGdwYV9wYXJhbSwgY3VyX2NtZC5uYW1lKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnI2VuZGlmIC8vICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgICAgIHRhYmxlcyArPSAnfVxuXG4nCisgICAgICAgIHJldHVybiB0YWJsZXMKKworICAgICMKKyAgICAjIENyZWF0ZSBhIGxvb2t1cCB0YWJsZSBmdW5jdGlvbiBmcm9tIHRoZSBhcHByb3ByaWF0ZSBsaXN0IG9mIGVudHJ5cG9pbnRzIGFuZAorICAgICMgcmV0dXJuIGl0IGFzIGEgc3RyaW5nCisgICAgZGVmIE91dHB1dExvYWRlckxvb2t1cEZ1bmMoc2VsZik6CisgICAgICAgIGNvbW1hbmRzID0gW10KKyAgICAgICAgdGFibGVzID0gJycKKyAgICAgICAgY3VyX3R5cGUgPSAnJworICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSAnJworCisgICAgICAgIGZvciB4IGluIHJhbmdlKDAsIDIpOgorICAgICAgICAgICAgaWYgeCA9PSAwOgorICAgICAgICAgICAgICAgIGN1cl90eXBlID0gJ2RldmljZScKKworICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnLy8gRGV2aWNlIGNvbW1hbmQgbG9va3VwIGZ1bmN0aW9uXG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICdWS0FQSV9BVFRSIHZvaWQqIFZLQVBJX0NBTEwgbG9hZGVyX2xvb2t1cF9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKnRhYmxlLCBjb25zdCBjaGFyICpuYW1lKSB7XG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcgICAgaWYgKCFuYW1lIHx8IG5hbWVbMF0gIT0gXCd2XCcgfHwgbmFtZVsxXSAhPSBcJ2tcJykgcmV0dXJuIE5VTEw7XG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICdcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICBuYW1lICs9IDI7XG4nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN1cl90eXBlID0gJ2luc3RhbmNlJworCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcvLyBJbnN0YW5jZSBjb21tYW5kIGxvb2t1cCBmdW5jdGlvblxuJworICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnVktBUElfQVRUUiB2b2lkKiBWS0FQSV9DQUxMIGxvYWRlcl9sb29rdXBfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqdGFibGUsIGNvbnN0IGNoYXIgKm5hbWUsXG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmZvdW5kX25hbWUpIHtcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICBpZiAoIW5hbWUgfHwgbmFtZVswXSAhPSBcJ3ZcJyB8fCBuYW1lWzFdICE9IFwna1wnKSB7XG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcgICAgICAgICpmb3VuZF9uYW1lID0gZmFsc2U7XG4nCisgICAgICAgICAgICAgICAgdGFibGVzICs9ICcgICAgICAgIHJldHVybiBOVUxMO1xuJworICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJ1xuJworICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnICAgICpmb3VuZF9uYW1lID0gdHJ1ZTtcbicKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICBuYW1lICs9IDI7XG4nCisKKyAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKDAsIDIpOgorICAgICAgICAgICAgICAgIGlmIHkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmNvcmVfY29tbWFuZHMKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyA9IHNlbGYuZXh0X2NvbW1hbmRzCisKKyAgICAgICAgICAgICAgICBmb3IgY3VyX2NtZCBpbiBjb21tYW5kczoKKyAgICAgICAgICAgICAgICAgICAgaXNfaW5zdF9oYW5kbGVfdHlwZSA9IGN1cl9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrSW5zdGFuY2UnIG9yIGN1cl9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnCisgICAgICAgICAgICAgICAgICAgIGlmICgoY3VyX3R5cGUgPT0gJ2luc3RhbmNlJyBhbmQgaXNfaW5zdF9oYW5kbGVfdHlwZSkgb3IgKGN1cl90eXBlID09ICdkZXZpY2UnIGFuZCBub3QgaXNfaW5zdF9oYW5kbGVfdHlwZSkpOgorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLmV4dF9uYW1lICE9IGN1cl9leHRlbnNpb25fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAnVktfVkVSU0lPTl8nIGluIGN1cl9jbWQuZXh0X25hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnXG4gICAgLy8gLS0tLSBDb3JlICVzIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZVsxMTpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzICs9ICdcbiAgICAvLyAtLS0tICVzIGV4dGVuc2lvbiBjb21tYW5kc1xuJyAlIGN1cl9jbWQuZXh0X25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSBjdXJfY21kLmV4dF9uYW1lCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX25hbWUgPSBjdXJfY21kLm5hbWVbMjpdCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlX25hbWUgPT0gJ0NyZWF0ZUluc3RhbmNlJyBvciBiYXNlX25hbWUgPT0gJ0NyZWF0ZURldmljZScgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX25hbWUgPT0gJ0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX25hbWUgPT0gJ0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJyBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9PSAnRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgY3VyX2NtZC5wcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnI2lmZGVmICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyArPSAnICAgIGlmICghc3RyY21wKG5hbWUsICIlcyIpKSByZXR1cm4gKHZvaWQgKil0YWJsZS0+JXM7XG4nICUgKGJhc2VfbmFtZSwgYmFzZV9uYW1lKQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzICs9ICcjZW5kaWYgLy8gJXNcbicgJSBjdXJfY21kLnByb3RlY3QKKworICAgICAgICAgICAgdGFibGVzICs9ICdcbicKKyAgICAgICAgICAgIGlmIHggPT0gMToKKyAgICAgICAgICAgICAgICB0YWJsZXMgKz0gJyAgICAqZm91bmRfbmFtZSA9IGZhbHNlO1xuJworICAgICAgICAgICAgdGFibGVzICs9ICcgICAgcmV0dXJuIE5VTEw7XG4nCisgICAgICAgICAgICB0YWJsZXMgKz0gJ31cblxuJworICAgICAgICByZXR1cm4gdGFibGVzCisKKyAgICAjCisgICAgIyBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIHRyYW1wb2xpbmUgKGFuZCBwb3NzaWJseSB0ZXJtaW5hdG9yKSBmdW5jdGlub3MKKyAgICBkZWYgQ3JlYXRlVHJhbXBUZXJtRnVuY3Moc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBbXQorICAgICAgICBmdW5jcyA9ICcnCisgICAgICAgIGN1cl9leHRlbnNpb25fbmFtZSA9ICcnCisKKyAgICAgICAgIyBTb21lIGV4dGVuc2lvbnMgaGF2ZSB0byBiZSBtYW51YWxseSBhZGRlZC4gIFNraXAgdGhvc2UgaW4gdGhlIGF1dG9tYXRpYworICAgICAgICAjIGdlbmVyYXRpb24uICBUaGV5IHdpbGwgYmUgbWFudWFsbHkgYWRkZWQgbGF0ZXIuCisgICAgICAgIG1hbnVhbF9leHRfY29tbWFuZHMgPSBbJ3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtSZWxlYXNlRGlzcGxheUVYVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQnXQorCisgICAgICAgIGZvciBleHRfY21kIGluIHNlbGYuZXh0X2NvbW1hbmRzOgorICAgICAgICAgICAgaWYgKGV4dF9jbWQuZXh0X25hbWUgaW4gV1NJX0VYVF9OQU1FUyBvcgorICAgICAgICAgICAgICAgIGV4dF9jbWQuZXh0X25hbWUgaW4gQVZPSURfRVhUX05BTUVTIG9yCisgICAgICAgICAgICAgICAgZXh0X2NtZC5uYW1lIGluIEFWT0lEX0NNRF9OQU1FUyBvcgorICAgICAgICAgICAgICAgIGV4dF9jbWQubmFtZSBpbiBtYW51YWxfZXh0X2NvbW1hbmRzKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBleHRfY21kLmV4dF9uYW1lICE9IGN1cl9leHRlbnNpb25fbmFtZToKKyAgICAgICAgICAgICAgICBpZiAnVktfVkVSU0lPTl8nIGluIGV4dF9jbWQuZXh0X25hbWU6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICdcbi8vIC0tLS0gQ29yZSAlcyB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzXG5cbicgJSBleHRfY21kLmV4dF9uYW1lWzExOl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnXG4vLyAtLS0tICVzIGV4dGVuc2lvbiB0cmFtcG9saW5lL3Rlcm1pbmF0b3JzXG5cbicgJSBleHRfY21kLmV4dF9uYW1lCisgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gZXh0X2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICBpZiBleHRfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyNpZmRlZiAlc1xuJyAlIGV4dF9jbWQucHJvdGVjdAorCisgICAgICAgICAgICBmdW5jX2hlYWRlciA9IGV4dF9jbWQuY2RlY2wucmVwbGFjZSgiOyIsICIge1xuIikKKyAgICAgICAgICAgIHRyYW1wX2hlYWRlciA9IGZ1bmNfaGVhZGVyLnJlcGxhY2UoIlZLQVBJX0NBTEwgdmsiLCAiVktBUElfQ0FMTCAiKQorICAgICAgICAgICAgcmV0dXJuX3ByZWZpeCA9ICcgICAgJworICAgICAgICAgICAgYmFzZV9uYW1lID0gZXh0X2NtZC5uYW1lWzI6XQorICAgICAgICAgICAgaGFzX3N1cmZhY2UgPSAwCisgICAgICAgICAgICB1cGRhdGVfc3RydWN0dXJlX3N1cmZhY2UgPSAwCisgICAgICAgICAgICB1cGRhdGVfc3RydWN0dXJlX3N0cmluZyA9ICcnCisgICAgICAgICAgICByZXF1aXJlc190ZXJtaW5hdG9yID0gMAorICAgICAgICAgICAgc3VyZmFjZV92YXJfbmFtZSA9ICcnCisgICAgICAgICAgICBwaHlzX2Rldl92YXJfbmFtZSA9ICcnCisgICAgICAgICAgICBoYXNfcmV0dXJuX3R5cGUgPSBGYWxzZQorICAgICAgICAgICAgYWx3YXlzX3VzZV9wYXJhbV9uYW1lID0gVHJ1ZQorICAgICAgICAgICAgc3VyZmFjZV90eXBlX3RvX3JlcGxhY2UgPSAnJworICAgICAgICAgICAgc3VyZmFjZV9uYW1lX3JlcGxhY2VtZW50ID0gJycKKyAgICAgICAgICAgIHBoeXNkZXZfdHlwZV90b19yZXBsYWNlID0gJycKKyAgICAgICAgICAgIHBoeXNkZXZfbmFtZV9yZXBsYWNlbWVudCA9ICcnCisKKyAgICAgICAgICAgIGZvciBwYXJhbSBpbiBleHRfY21kLnBhcmFtczoKKyAgICAgICAgICAgICAgICBpZiBwYXJhbS50eXBlID09ICdWa1N1cmZhY2VLSFInOgorICAgICAgICAgICAgICAgICAgICBoYXNfc3VyZmFjZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgc3VyZmFjZV92YXJfbmFtZSA9IHBhcmFtLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfdGVybWluYXRvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgYWx3YXlzX3VzZV9wYXJhbV9uYW1lID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgc3VyZmFjZV90eXBlX3RvX3JlcGxhY2UgPSAnVmtTdXJmYWNlS0hSJworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlX25hbWVfcmVwbGFjZW1lbnQgPSAnaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF0nCisgICAgICAgICAgICAgICAgaWYgcGFyYW0udHlwZSA9PSAnVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUic6CisgICAgICAgICAgICAgICAgICAgIGhhc19zdXJmYWNlID0gMQorICAgICAgICAgICAgICAgICAgICBzdXJmYWNlX3Zhcl9uYW1lID0gcGFyYW0ubmFtZSArICctPnN1cmZhY2UnCisgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzX3Rlcm1pbmF0b3IgPSAxCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zdHJ1Y3R1cmVfc3VyZmFjZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3N0cnVjdHVyZV9zdHJpbmcgPSAnICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIGluZm9fY29weSA9ICpwU3VyZmFjZUluZm87XG4nCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zdHJ1Y3R1cmVfc3RyaW5nICs9ICcgICAgICAgIGluZm9fY29weS5zdXJmYWNlID0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07XG4nCisgICAgICAgICAgICAgICAgICAgIGFsd2F5c191c2VfcGFyYW1fbmFtZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfdHlwZV90b19yZXBsYWNlID0gJ1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFInCisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfbmFtZV9yZXBsYWNlbWVudCA9ICcmaW5mb19jb3B5JworICAgICAgICAgICAgICAgIGlmIHBhcmFtLnR5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnOgorICAgICAgICAgICAgICAgICAgICByZXF1aXJlc190ZXJtaW5hdG9yID0gMQorICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl92YXJfbmFtZSA9IHBhcmFtLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgYWx3YXlzX3VzZV9wYXJhbV9uYW1lID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgcGh5c2Rldl90eXBlX3RvX3JlcGxhY2UgPSAnVmtQaHlzaWNhbERldmljZScKKyAgICAgICAgICAgICAgICAgICAgcGh5c2Rldl9uYW1lX3JlcGxhY2VtZW50ID0gJ3BoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2JworCisgICAgICAgICAgICBpZiAoZXh0X2NtZC5yZXR1cm5fdHlwZSBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuX3ByZWZpeCArPSAncmV0dXJuICcKKyAgICAgICAgICAgICAgICBoYXNfcmV0dXJuX3R5cGUgPSBUcnVlCisKKyAgICAgICAgICAgIGlmIChleHRfY21kLmhhbmRsZV90eXBlID09ICdWa0luc3RhbmNlJyBvciBleHRfY21kLmhhbmRsZV90eXBlID09ICdWa1BoeXNpY2FsRGV2aWNlJyBvcgorICAgICAgICAgICAgICAgICdEZWJ1Z01hcmtlclNldE9iamVjdCcgaW4gZXh0X2NtZC5uYW1lIG9yICdTZXREZWJ1Z1V0aWxzT2JqZWN0JyBpbiBleHRfY21kLm5hbWUgb3IKKyAgICAgICAgICAgICAgICBleHRfY21kLm5hbWUgaW4gREVWSUNFX0NNRFNfTkVFRF9URVJNKToKKyAgICAgICAgICAgICAgICByZXF1aXJlc190ZXJtaW5hdG9yID0gMQorCisgICAgICAgICAgICBpZiByZXF1aXJlc190ZXJtaW5hdG9yID09IDE6CisgICAgICAgICAgICAgICAgdGVybV9oZWFkZXIgPSB0cmFtcF9oZWFkZXIucmVwbGFjZSgiVktBUElfQ0FMTCAiLCAiVktBUElfQ0FMTCB0ZXJtaW5hdG9yXyIpCisKKyAgICAgICAgICAgICAgICBmdW5jcyArPSB0cmFtcF9oZWFkZXIKKworICAgICAgICAgICAgICAgIGlmIGV4dF9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnOgorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIGNvbnN0IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmRpc3A7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgVmtQaHlzaWNhbERldmljZSB1bndyYXBwZWRfcGh5c19kZXYgPSBsb2FkZXJfdW53cmFwX3BoeXNpY2FsX2RldmljZSglcyk7XG4nICUgKHBoeXNfZGV2X3Zhcl9uYW1lKQorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIGRpc3AgPSBsb2FkZXJfZ2V0X2luc3RhbmNlX2xheWVyX2Rpc3BhdGNoKCVzKTtcbicgJSAocGh5c19kZXZfdmFyX25hbWUpCisgICAgICAgICAgICAgICAgZWxpZiBleHRfY21kLmhhbmRsZV90eXBlID09ICdWa0luc3RhbmNlJzoKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyNlcnJvcigiTm90IGltcGxlbWVudGVkLiBMaWtlbHkgbmVlZHMgdG8gYmUgbWFudWFsbHkgZ2VuZXJhdGVkISIpO1xuJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgY29uc3QgVmtMYXllckRpc3BhdGNoVGFibGUgKmRpc3AgPSBsb2FkZXJfZ2V0X2Rpc3BhdGNoKCcKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gZXh0X2NtZC5wYXJhbXNbMF0ubmFtZQorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnKTtcbicKKworICAgICAgICAgICAgICAgIGlmICdEZWJ1Z01hcmtlclNldE9iamVjdE5hbWUnIGluIGV4dF9jbWQubmFtZToKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgbG9jYWxfbmFtZV9pbmZvO1xuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIG1lbWNweSgmbG9jYWxfbmFtZV9pbmZvLCBwTmFtZUluZm8sIHNpemVvZihWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQpKTtcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAvLyBJZiB0aGlzIGlzIGEgcGh5c2ljYWwgZGV2aWNlLCB3ZSBoYXZlIHRvIHJlcGxhY2UgaXQgd2l0aCB0aGUgcHJvcGVyIG9uZSBmb3IgdGhlIG5leHQgY2FsbC5cbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICBpZiAocE5hbWVJbmZvLT5vYmplY3RUeXBlID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhUKSB7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICpwaHlzX2Rldl90cmFtcCA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqKSh1aW50cHRyX3QpcE5hbWVJbmZvLT5vYmplY3Q7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIGxvY2FsX25hbWVfaW5mby5vYmplY3QgPSAodWludDY0X3QpKHVpbnRwdHJfdClwaHlzX2Rldl90cmFtcC0+cGh5c19kZXY7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgfVxuJworICAgICAgICAgICAgICAgIGVsaWYgJ0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnJyBpbiBleHRfY21kLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgbG9jYWxfdGFnX2luZm87XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgbWVtY3B5KCZsb2NhbF90YWdfaW5mbywgcFRhZ0luZm8sIHNpemVvZihWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCkpO1xuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIC8vIElmIHRoaXMgaXMgYSBwaHlzaWNhbCBkZXZpY2UsIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLlxuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIGlmIChwVGFnSW5mby0+b2JqZWN0VHlwZSA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVCkge1xuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqcGh5c19kZXZfdHJhbXAgPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKikodWludHB0cl90KXBUYWdJbmZvLT5vYmplY3Q7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIGxvY2FsX3RhZ19pbmZvLm9iamVjdCA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3RyYW1wLT5waHlzX2RldjtcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB9XG4nCisgICAgICAgICAgICAgICAgZWxpZiAnU2V0RGVidWdVdGlsc09iamVjdE5hbWUnIGluIGV4dF9jbWQubmFtZToKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBsb2NhbF9uYW1lX2luZm87XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgbWVtY3B5KCZsb2NhbF9uYW1lX2luZm8sIHBOYW1lSW5mbywgc2l6ZW9mKFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKSk7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgLy8gSWYgdGhpcyBpcyBhIHBoeXNpY2FsIGRldmljZSwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuXG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgaWYgKHBOYW1lSW5mby0+b2JqZWN0VHlwZSA9PSBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0UpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKnBoeXNfZGV2X3RyYW1wID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3RyYW1wICopKHVpbnRwdHJfdClwTmFtZUluZm8tPm9iamVjdEhhbmRsZTtcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgbG9jYWxfbmFtZV9pbmZvLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3RyYW1wLT5waHlzX2RldjtcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB9XG4nCisgICAgICAgICAgICAgICAgZWxpZiAnU2V0RGVidWdVdGlsc09iamVjdFRhZycgaW4gZXh0X2NtZC5uYW1lOgorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgbG9jYWxfdGFnX2luZm87XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgbWVtY3B5KCZsb2NhbF90YWdfaW5mbywgcFRhZ0luZm8sIHNpemVvZihWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKSk7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgLy8gSWYgdGhpcyBpcyBhIHBoeXNpY2FsIGRldmljZSwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuXG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgaWYgKHBUYWdJbmZvLT5vYmplY3RUeXBlID09IFZLX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRSkge1xuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90cmFtcCAqcGh5c19kZXZfdHJhbXAgPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdHJhbXAgKikodWludHB0cl90KXBUYWdJbmZvLT5vYmplY3RIYW5kbGU7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIGxvY2FsX3RhZ19pbmZvLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3RyYW1wLT5waHlzX2RldjtcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB9XG4nCisKKyAgICAgICAgICAgICAgICBpZiBleHRfY21kLmV4dF9uYW1lIGluIE5VTExfQ0hFQ0tfRVhUX05BTUVTOgorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIGlmIChkaXNwLT4nICsgYmFzZV9uYW1lICsgJyAhPSBOVUxMKSB7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgJworICAgICAgICAgICAgICAgIGZ1bmNzICs9IHJldHVybl9wcmVmaXgKKyAgICAgICAgICAgICAgICBmdW5jcyArPSAnZGlzcC0+JworICAgICAgICAgICAgICAgIGZ1bmNzICs9IGJhc2VfbmFtZQorICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcoJworICAgICAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgICAgIGZvciBwYXJhbSBpbiBleHRfY21kLnBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcsICcKKworICAgICAgICAgICAgICAgICAgICBpZiBwYXJhbS50eXBlID09ICdWa1BoeXNpY2FsRGV2aWNlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICd1bndyYXBwZWRfcGh5c19kZXYnCisgICAgICAgICAgICAgICAgICAgIGVsaWYgKCdEZWJ1Z01hcmtlclNldE9iamVjdCcgaW4gZXh0X2NtZC5uYW1lIG9yICdTZXREZWJ1Z1V0aWxzT2JqZWN0JyBpbiBleHRfY21kLm5hbWUpIGFuZCBwYXJhbS5uYW1lID09ICdwTmFtZUluZm8nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcmbG9jYWxfbmFtZV9pbmZvJworICAgICAgICAgICAgICAgICAgICBlbGlmICgnRGVidWdNYXJrZXJTZXRPYmplY3QnIGluIGV4dF9jbWQubmFtZSBvciAnU2V0RGVidWdVdGlsc09iamVjdCcgaW4gZXh0X2NtZC5uYW1lKSBhbmQgcGFyYW0ubmFtZSA9PSAncFRhZ0luZm8nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcmbG9jYWxfdGFnX2luZm8nCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSBwYXJhbS5uYW1lCisKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcpO1xuJworICAgICAgICAgICAgICAgIGlmIGV4dF9jbWQuZXh0X25hbWUgaW4gTlVMTF9DSEVDS19FWFRfTkFNRVM6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dF9jbWQucmV0dXJuX3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIH0gZWxzZSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICByZXR1cm4gVktfU1VDQ0VTUztcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB9XG4nCisgICAgICAgICAgICAgICAgZnVuY3MgKz0gJ31cblxuJworCisgICAgICAgICAgICAgICAgZnVuY3MgKz0gdGVybV9oZWFkZXIKKyAgICAgICAgICAgICAgICBpZiBleHRfY21kLmhhbmRsZV90eXBlID09ICdWa1BoeXNpY2FsRGV2aWNlJzoKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKiklcztcbicgJSAocGh5c19kZXZfdmFyX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBwaHlzX2Rldl90ZXJtLT50aGlzX2ljZF90ZXJtO1xuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIGlmIChOVUxMID09IGljZF90ZXJtLT5kaXNwYXRjaC4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9IGJhc2VfbmFtZQorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnKSB7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIGxvYWRlcl9sb2coaWNkX3Rlcm0tPnRoaXNfaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAwLFxuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgICAgICAgICJJQ0QgYXNzb2NpYXRlZCB3aXRoIFZrUGh5c2ljYWxEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCAnCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9IGJhc2VfbmFtZQorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnIik7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgfVxuJworCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc19zdXJmYWNlID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIFZrSWNkU3VyZmFjZSAqaWNkX3N1cmZhY2UgPSAoVmtJY2RTdXJmYWNlICopKCVzKTtcbicgJSAoc3VyZmFjZV92YXJfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgdWludDhfdCBpY2RfaW5kZXggPSBwaHlzX2Rldl90ZXJtLT5pY2RfaW5kZXg7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcyAmJiBOVUxMICE9ICh2b2lkICopaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF0pIHtcbicKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGVyZSdzIGEgc3RydWN0dXJlIHdpdGggYSBzdXJmYWNlLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdHMgaW50ZXJuYWxzIHdpdGggdGhlIGNvcnJlY3Qgc3VyZmFjZSBmb3IgdGhlIElDRAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdXBkYXRlX3N0cnVjdHVyZV9zdXJmYWNlID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gdXBkYXRlX3N0cnVjdHVyZV9zdHJpbmcKKworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAnICsgcmV0dXJuX3ByZWZpeCArICdpY2RfdGVybS0+ZGlzcGF0Y2guJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gYmFzZV9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnKCcKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBhcmFtIGluIGV4dF9jbWQucGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvdW50ICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcsICcKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBhbHdheXNfdXNlX3BhcmFtX25hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN1cmZhY2VfdHlwZV90b19yZXBsYWNlIGFuZCBzdXJmYWNlX3R5cGVfdG9fcmVwbGFjZSA9PSBwYXJhbS50eXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gc3VyZmFjZV9uYW1lX3JlcGxhY2VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgcGh5c2Rldl90eXBlX3RvX3JlcGxhY2UgYW5kIHBoeXNkZXZfdHlwZV90b19yZXBsYWNlID09IHBhcmFtLnR5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSBwaHlzZGV2X25hbWVfcmVwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9IHBhcmFtLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSBwYXJhbS5uYW1lCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBoYXNfcmV0dXJuX3R5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgcmV0dXJuO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB9XG4nCisKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gcmV0dXJuX3ByZWZpeAorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnaWNkX3Rlcm0tPmRpc3BhdGNoLicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gYmFzZV9uYW1lCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcoJworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgZm9yIHBhcmFtIGluIGV4dF9jbWQucGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnLCAnCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhcmFtLnR5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICdwaHlzX2Rldl90ZXJtLT5waHlzX2RldicKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gcGFyYW0ubmFtZQorCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcpO1xuJworCisgICAgICAgICAgICAgICAgZWxpZiBoYXNfc3VyZmFjZSA9PSAxIGFuZCBub3QgKGV4dF9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnIG9yIGV4dF9jbWQuaGFuZGxlX3R5cGUgPT0gJ1ZrSW5zdGFuY2UnKToKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB1aW50MzJfdCBpY2RfaW5kZXggPSAwO1xuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIHN0cnVjdCBsb2FkZXJfZGV2aWNlICpkZXY7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgc3RydWN0IGxvYWRlcl9pY2RfdGVybSAqaWNkX3Rlcm0gPSBsb2FkZXJfZ2V0X2ljZF9hbmRfZGV2aWNlKGRldmljZSwgJmRldiwgJmljZF9pbmRleCk7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgaWYgKE5VTEwgIT0gaWNkX3Rlcm0gJiYgTlVMTCAhPSBpY2RfdGVybS0+ZGlzcGF0Y2guJXMpIHtcbicgJSBiYXNlX25hbWUKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgVmtJY2RTdXJmYWNlICppY2Rfc3VyZmFjZSA9IChWa0ljZFN1cmZhY2UgKikodWludHB0cl90KSVzO1xuJyAlIChzdXJmYWNlX3Zhcl9uYW1lKQorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICBpZiAoTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMgJiYgKFZrU3VyZmFjZUtIUilOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdKSB7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICVzaWNkX3Rlcm0tPmRpc3BhdGNoLiVzKCcgJSAocmV0dXJuX3ByZWZpeCwgYmFzZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgZm9yIHBhcmFtIGluIGV4dF9jbWQucGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnLCAnCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhcmFtLnR5cGUgPT0gJ1ZrU3VyZmFjZUtIUic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJ2ljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdJworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSBwYXJhbS5uYW1lCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyk7XG4nCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBoYXNfcmV0dXJuX3R5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgICAgIHJldHVybjtcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICVzaWNkX3Rlcm0tPmRpc3BhdGNoLiVzKCcgJSAocmV0dXJuX3ByZWZpeCwgYmFzZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgZm9yIHBhcmFtIGluIGV4dF9jbWQucGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnLCAnCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSBwYXJhbS5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcpO1xuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzX3JldHVybl90eXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICByZXR1cm4gVktfU1VDQ0VTUztcbicKKworICAgICAgICAgICAgICAgIGVsaWYgZXh0X2NtZC5oYW5kbGVfdHlwZSA9PSAnVmtJbnN0YW5jZSc6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcjZXJyb3IoIk5vdCBpbXBsZW1lbnRlZC4gTGlrZWx5IG5lZWRzIHRvIGJlIG1hbnVhbGx5IGdlbmVyYXRlZCEiKTtcbicKKyAgICAgICAgICAgICAgICBlbGlmICdEZWJ1Z1V0aWxzTGFiZWwnIGluIGV4dF9jbWQubmFtZToKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSBleHRfY21kLnBhcmFtc1swXS5uYW1lCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcpO1xuJworICAgICAgICAgICAgICAgICAgICBpZiBleHRfY21kLmV4dF9uYW1lIGluIE5VTExfQ0hFQ0tfRVhUX05BTUVTOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICBpZiAoZGlzcC0+JyArIGJhc2VfbmFtZSArICcgIT0gTlVMTCkge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAnCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgJworICAgICAgICAgICAgICAgICAgICBpZiBoYXNfcmV0dXJuX3R5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAncmV0dXJuICcKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJ2Rpc3AtPicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gYmFzZV9uYW1lCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcoJworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgZm9yIHBhcmFtIGluIGV4dF9jbWQucGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnLCAnCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSBwYXJhbS5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcpO1xuJworICAgICAgICAgICAgICAgICAgICBpZiBleHRfY21kLmV4dF9uYW1lIGluIE5VTExfQ0hFQ0tfRVhUX05BTUVTOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB9XG4nCisgICAgICAgICAgICAgICAgZWxpZiAnRGVidWdNYXJrZXJTZXRPYmplY3QnIGluIGV4dF9jbWQubmFtZSBvciAnU2V0RGVidWdVdGlsc09iamVjdCcgaW4gZXh0X2NtZC5uYW1lOgorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIHVpbnQzMl90IGljZF9pbmRleCA9IDA7XG4nCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldjtcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICBzdHJ1Y3QgbG9hZGVyX2ljZF90ZXJtICppY2RfdGVybSA9IGxvYWRlcl9nZXRfaWNkX2FuZF9kZXZpY2UoJXMsICZkZXYsICZpY2RfaW5kZXgpO1xuJyAlIChleHRfY21kLnBhcmFtc1swXS5uYW1lKQorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gYmFzZV9uYW1lCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgaWYgJ0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZScgaW4gZXh0X2NtZC5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUIGxvY2FsX25hbWVfaW5mbztcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIG1lbWNweSgmbG9jYWxfbmFtZV9pbmZvLCBwTmFtZUluZm8sIHNpemVvZihWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQpKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwaHlzaWNhbCBkZXZpY2UsIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgaWYgKHBOYW1lSW5mby0+b2JqZWN0VHlwZSA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVCkge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgIHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKnBoeXNfZGV2X3Rlcm0gPSAoc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqKSh1aW50cHRyX3QpcE5hbWVJbmZvLT5vYmplY3Q7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgbG9jYWxfbmFtZV9pbmZvLm9iamVjdCA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2O1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEtIUl9zdXJmYWNlLCBhbmQgdGhlIElDRCBoYXMgY3JlYXRlZCBpdHMgb3duLCB3ZSBoYXZlIHRvIHJlcGxhY2UgaXQgd2l0aCB0aGUgcHJvcGVyIG9uZSBmb3IgdGhlIG5leHQgY2FsbC5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIH0gZWxzZSBpZiAocE5hbWVJbmZvLT5vYmplY3RUeXBlID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2RfdGVybSAmJiBOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVTd2FwY2hhaW5LSFIpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICAgICAgVmtJY2RTdXJmYWNlICppY2Rfc3VyZmFjZSA9IChWa0ljZFN1cmZhY2UgKikodWludHB0cl90KXBOYW1lSW5mby0+b2JqZWN0O1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXMpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICAgICAgICAgIGxvY2FsX25hbWVfaW5mby5vYmplY3QgPSAodWludDY0X3QpaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgIGVsaWYgJ0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnJyBpbiBleHRfY21kLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCBsb2NhbF90YWdfaW5mbztcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIG1lbWNweSgmbG9jYWxfdGFnX2luZm8sIHBUYWdJbmZvLCBzaXplb2YoVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQpKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwaHlzaWNhbCBkZXZpY2UsIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgaWYgKHBUYWdJbmZvLT5vYmplY3RUeXBlID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhUKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopKHVpbnRwdHJfdClwVGFnSW5mby0+b2JqZWN0O1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgIGxvY2FsX3RhZ19pbmZvLm9iamVjdCA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2O1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEtIUl9zdXJmYWNlLCBhbmQgdGhlIElDRCBoYXMgY3JlYXRlZCBpdHMgb3duLCB3ZSBoYXZlIHRvIHJlcGxhY2UgaXQgd2l0aCB0aGUgcHJvcGVyIG9uZSBmb3IgdGhlIG5leHQgY2FsbC5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIH0gZWxzZSBpZiAocFRhZ0luZm8tPm9iamVjdFR5cGUgPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSX0VYVCkge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZVN3YXBjaGFpbktIUikge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgICAgICBWa0ljZFN1cmZhY2UgKmljZF9zdXJmYWNlID0gKFZrSWNkU3VyZmFjZSAqKSh1aW50cHRyX3QpcFRhZ0luZm8tPm9iamVjdDtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgICAgICAgICBsb2NhbF90YWdfaW5mby5vYmplY3QgPSAodWludDY0X3QpaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF07XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgIGVsaWYgJ1NldERlYnVnVXRpbHNPYmplY3ROYW1lJyBpbiBleHRfY21kLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBsb2NhbF9uYW1lX2luZm87XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICBtZW1jcHkoJmxvY2FsX25hbWVfaW5mbywgcE5hbWVJbmZvLCBzaXplb2YoVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQpKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwaHlzaWNhbCBkZXZpY2UsIHdlIGhhdmUgdG8gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm9wZXIgb25lIGZvciB0aGUgbmV4dCBjYWxsLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgaWYgKHBOYW1lSW5mby0+b2JqZWN0VHlwZSA9PSBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0UpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICBzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICpwaHlzX2Rldl90ZXJtID0gKHN0cnVjdCBsb2FkZXJfcGh5c2ljYWxfZGV2aWNlX3Rlcm0gKikodWludHB0cl90KXBOYW1lSW5mby0+b2JqZWN0SGFuZGxlO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgIGxvY2FsX25hbWVfaW5mby5vYmplY3RIYW5kbGUgPSAodWludDY0X3QpKHVpbnRwdHJfdClwaHlzX2Rldl90ZXJtLT5waHlzX2RldjtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIC8vIElmIHRoaXMgaXMgYSBLSFJfc3VyZmFjZSwgYW5kIHRoZSBJQ0QgaGFzIGNyZWF0ZWQgaXRzIG93biwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICB9IGVsc2UgaWYgKHBOYW1lSW5mby0+b2JqZWN0VHlwZSA9PSBWS19PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUikge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF90ZXJtICYmIE5VTEwgIT0gaWNkX3Rlcm0tPmRpc3BhdGNoLkNyZWF0ZVN3YXBjaGFpbktIUikge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgICAgICBWa0ljZFN1cmZhY2UgKmljZF9zdXJmYWNlID0gKFZrSWNkU3VyZmFjZSAqKSh1aW50cHRyX3QpcE5hbWVJbmZvLT5vYmplY3RIYW5kbGU7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcykge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgICAgICAgICAgbG9jYWxfbmFtZV9pbmZvLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdClpY2Rfc3VyZmFjZS0+cmVhbF9pY2Rfc3VyZmFjZXNbaWNkX2luZGV4XTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAnU2V0RGVidWdVdGlsc09iamVjdFRhZycgaW4gZXh0X2NtZC5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCBsb2NhbF90YWdfaW5mbztcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIG1lbWNweSgmbG9jYWxfdGFnX2luZm8sIHBUYWdJbmZvLCBzaXplb2YoVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCkpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHBoeXNpY2FsIGRldmljZSwgd2UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggdGhlIHByb3BlciBvbmUgZm9yIHRoZSBuZXh0IGNhbGwuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICBpZiAocFRhZ0luZm8tPm9iamVjdFR5cGUgPT0gVktfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgc3RydWN0IGxvYWRlcl9waHlzaWNhbF9kZXZpY2VfdGVybSAqcGh5c19kZXZfdGVybSA9IChzdHJ1Y3QgbG9hZGVyX3BoeXNpY2FsX2RldmljZV90ZXJtICopKHVpbnRwdHJfdClwVGFnSW5mby0+b2JqZWN0SGFuZGxlO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgIGxvY2FsX3RhZ19pbmZvLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdCkodWludHB0cl90KXBoeXNfZGV2X3Rlcm0tPnBoeXNfZGV2O1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEtIUl9zdXJmYWNlLCBhbmQgdGhlIElDRCBoYXMgY3JlYXRlZCBpdHMgb3duLCB3ZSBoYXZlIHRvIHJlcGxhY2UgaXQgd2l0aCB0aGUgcHJvcGVyIG9uZSBmb3IgdGhlIG5leHQgY2FsbC5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgIH0gZWxzZSBpZiAocFRhZ0luZm8tPm9iamVjdFR5cGUgPT0gVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFIpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICBpZiAoTlVMTCAhPSBpY2RfdGVybSAmJiBOVUxMICE9IGljZF90ZXJtLT5kaXNwYXRjaC5DcmVhdGVTd2FwY2hhaW5LSFIpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgICAgICAgICAgICAgVmtJY2RTdXJmYWNlICppY2Rfc3VyZmFjZSA9IChWa0ljZFN1cmZhY2UgKikodWludHB0cl90KXBUYWdJbmZvLT5vYmplY3RIYW5kbGU7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlcykge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGFnX2luZm8ub2JqZWN0SGFuZGxlID0gKHVpbnQ2NF90KWljZF9zdXJmYWNlLT5yZWFsX2ljZF9zdXJmYWNlc1tpY2RfaW5kZXhdO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc19yZXR1cm5fdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICdyZXR1cm4gJworICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnaWNkX3Rlcm0tPmRpc3BhdGNoLicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gYmFzZV9uYW1lCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcoJworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgZm9yIHBhcmFtIGluIGV4dF9jbWQucGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnLCAnCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhcmFtLnR5cGUgPT0gJ1ZrUGh5c2ljYWxEZXZpY2UnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICdwaHlzX2Rldl90ZXJtLT5waHlzX2RldicKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgcGFyYW0udHlwZSA9PSAnVmtTdXJmYWNlS0hSJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnaWNkX3N1cmZhY2UtPnJlYWxfaWNkX3N1cmZhY2VzW2ljZF9pbmRleF0nCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmICgnRGVidWdNYXJrZXJTZXRPYmplY3QnIGluIGV4dF9jbWQubmFtZSBvciAnU2V0RGVidWdVdGlsc09iamVjdCcgaW4gZXh0X2NtZC5uYW1lKSBhbmQgcGFyYW0ubmFtZSA9PSAncE5hbWVJbmZvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnJmxvY2FsX25hbWVfaW5mbycKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgKCdEZWJ1Z01hcmtlclNldE9iamVjdCcgaW4gZXh0X2NtZC5uYW1lIG9yICdTZXREZWJ1Z1V0aWxzT2JqZWN0JyBpbiBleHRfY21kLm5hbWUpIGFuZCBwYXJhbS5uYW1lID09ICdwVGFnSW5mbyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyZsb2NhbF90YWdfaW5mbycKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gcGFyYW0ubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMQorCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcpO1xuJworICAgICAgICAgICAgICAgICAgICBpZiBoYXNfcmV0dXJuX3R5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIH0gZWxzZSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICByZXR1cm4gVktfU1VDQ0VTUztcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB9XG4nCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnI2Vycm9yKCJVbmtub3duIGVycm9yIHBhdGghIik7XG4nCisKKyAgICAgICAgICAgICAgICBmdW5jcyArPSAnfVxuXG4nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmNzICs9IHRyYW1wX2hlYWRlcgorCisgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICBjb25zdCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcCA9IGxvYWRlcl9nZXRfZGlzcGF0Y2goJworICAgICAgICAgICAgICAgIGZ1bmNzICs9IGV4dF9jbWQucGFyYW1zWzBdLm5hbWUKKyAgICAgICAgICAgICAgICBmdW5jcyArPSAnKTtcbicKKworICAgICAgICAgICAgICAgIGlmIGV4dF9jbWQuZXh0X25hbWUgaW4gTlVMTF9DSEVDS19FWFRfTkFNRVM6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcgICAgaWYgKGRpc3AtPicgKyBiYXNlX25hbWUgKyAnICE9IE5VTEwpIHtcbicKKyAgICAgICAgICAgICAgICBmdW5jcyArPSByZXR1cm5fcHJlZml4CisgICAgICAgICAgICAgICAgZnVuY3MgKz0gJ2Rpc3AtPicKKyAgICAgICAgICAgICAgICBmdW5jcyArPSBiYXNlX25hbWUKKyAgICAgICAgICAgICAgICBmdW5jcyArPSAnKCcKKyAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgICAgICBmb3IgcGFyYW0gaW4gZXh0X2NtZC5wYXJhbXM6CisgICAgICAgICAgICAgICAgICAgIGlmIGNvdW50ICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnLCAnCisgICAgICAgICAgICAgICAgICAgIGZ1bmNzICs9IHBhcmFtLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgIGZ1bmNzICs9ICcpO1xuJworICAgICAgICAgICAgICAgIGlmIGV4dF9jbWQuZXh0X25hbWUgaW4gTlVMTF9DSEVDS19FWFRfTkFNRVM6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dF9jbWQucmV0dXJuX3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgIH0gZWxzZSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcyArPSAnICAgICAgICByZXR1cm4gVktfU1VDQ0VTUztcbicKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyAgICB9XG4nCisgICAgICAgICAgICAgICAgZnVuY3MgKz0gJ31cblxuJworCisgICAgICAgICAgICBpZiBleHRfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZnVuY3MgKz0gJyNlbmRpZiAvLyAlc1xuJyAlIGV4dF9jbWQucHJvdGVjdAorCisgICAgICAgIHJldHVybiBmdW5jcworCisKKyAgICAjCisgICAgIyBDcmVhdGUgYSBmdW5jdGlvbiBmb3IgdGhlIGV4dGVuc2lvbiBHUEEgY2FsbAorICAgIGRlZiBJbnN0RXh0ZW5zaW9uR1BBKHNlbGYpOgorICAgICAgICBlbnRyaWVzID0gW10KKyAgICAgICAgZ3BhX2Z1bmMgPSAnJworICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSAnJworCisgICAgICAgIGdwYV9mdW5jICs9ICcvLyBHUEEgaGVscGVycyBmb3IgZXh0ZW5zaW9uc1xuJworICAgICAgICBncGFfZnVuYyArPSAnYm9vbCBleHRlbnNpb25faW5zdGFuY2VfZ3BhKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqKmFkZHIpIHtcbicKKyAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICAqYWRkciA9IE5VTEw7XG5cbicKKworICAgICAgICBmb3IgY3VyX2NtZCBpbiBzZWxmLmV4dF9jb21tYW5kczoKKyAgICAgICAgICAgIGlmICgnVktfVkVSU0lPTl8nIGluIGN1cl9jbWQuZXh0X25hbWUgb3IKKyAgICAgICAgICAgICAgICBjdXJfY21kLmV4dF9uYW1lIGluIFdTSV9FWFRfTkFNRVMgb3IKKyAgICAgICAgICAgICAgICBjdXJfY21kLmV4dF9uYW1lIGluIEFWT0lEX0VYVF9OQU1FUyBvcgorICAgICAgICAgICAgICAgIGN1cl9jbWQubmFtZSBpbiBBVk9JRF9DTURfTkFNRVMgKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjdXJfY21kLmV4dF9uYW1lICE9IGN1cl9leHRlbnNpb25fbmFtZToKKyAgICAgICAgICAgICAgICBncGFfZnVuYyArPSAnXG4gICAgLy8gLS0tLSAlcyBleHRlbnNpb24gY29tbWFuZHNcbicgJSBjdXJfY21kLmV4dF9uYW1lCisgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gY3VyX2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyNpZmRlZiAlc1xuJyAlIGN1cl9jbWQucHJvdGVjdAorCisgICAgICAgICAgICAjYmFzZV9uYW1lID0gY3VyX2NtZC5uYW1lWzI6XQorICAgICAgICAgICAgYmFzZV9uYW1lID0gQUxJQVNFRF9DTURTW2N1cl9jbWQubmFtZV0gaWYgY3VyX2NtZC5uYW1lIGluIEFMSUFTRURfQ01EUyBlbHNlIGN1cl9jbWQubmFtZVsyOl0KKworICAgICAgICAgICAgaWYgKGN1cl9jbWQuZXh0X3R5cGUgPT0gJ2luc3RhbmNlJyk6CisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICBpZiAoIXN0cmNtcCgiJXMiLCBuYW1lKSkge1xuJyAlIChjdXJfY21kLm5hbWUpCisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICAgICAgKmFkZHIgPSAocHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuJworICAgICAgICAgICAgICAgIGdwYV9mdW5jICs9IGN1cl9jbWQuZXh0X25hbWVbMzpdLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBncGFfZnVuYyArPSAnID09IDEpXG4nCisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICAgICAgICAgICAgICAgICAgID8gKHZvaWQgKiklc1xuJyAlIChiYXNlX25hbWUpCisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDtcbicKKyAgICAgICAgICAgICAgICBncGFfZnVuYyArPSAnICAgICAgICByZXR1cm4gdHJ1ZTtcbicKKyAgICAgICAgICAgICAgICBncGFfZnVuYyArPSAnICAgIH1cbicKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICBpZiAoIXN0cmNtcCgiJXMiLCBuYW1lKSkge1xuJyAlIChjdXJfY21kLm5hbWUpCisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICAgICAgKmFkZHIgPSAodm9pZCAqKSVzO1xuJyAlIChiYXNlX25hbWUpCisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICAgICAgcmV0dXJuIHRydWU7XG4nCisgICAgICAgICAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICB9XG4nCisKKyAgICAgICAgICAgIGlmIGN1cl9jbWQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBncGFfZnVuYyArPSAnI2VuZGlmIC8vICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgZ3BhX2Z1bmMgKz0gJyAgICByZXR1cm4gZmFsc2U7XG4nCisgICAgICAgIGdwYV9mdW5jICs9ICd9XG5cbicKKworICAgICAgICByZXR1cm4gZ3BhX2Z1bmMKKworICAgICMKKyAgICAjIENyZWF0ZSB0aGUgZXh0ZW5zaW9uIG5hbWUgaW5pdCBmdW5jdGlvbgorICAgIGRlZiBJbnN0YW50RXh0ZW5zaW9uQ3JlYXRlKHNlbGYpOgorICAgICAgICBlbnRyaWVzID0gW10KKyAgICAgICAgZW50cmllcyA9IHNlbGYuaW5zdGFuY2VFeHRlbnNpb25zCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSAnJworCisgICAgICAgIGNyZWF0ZV9mdW5jID0gJycKKyAgICAgICAgY3JlYXRlX2Z1bmMgKz0gJy8vIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBxdWVyeSBlbmFibGVkIGV4dGVuc2lvbnMgZHVyaW5nIGEgdmtDcmVhdGVJbnN0YW5jZSBjYWxsXG4nCisgICAgICAgIGNyZWF0ZV9mdW5jICs9ICd2b2lkIGV4dGVuc2lvbnNfY3JlYXRlX2luc3RhbmNlKHN0cnVjdCBsb2FkZXJfaW5zdGFuY2UgKnB0cl9pbnN0YW5jZSwgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKSB7XG4nCisgICAgICAgIGNyZWF0ZV9mdW5jICs9ICcgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykge1xuJworICAgICAgICBmb3IgZXh0IGluIGVudHJpZXM6CisgICAgICAgICAgICBpZiAoJ1ZLX1ZFUlNJT05fJyBpbiBleHQubmFtZSBvciBleHQubmFtZSBpbiBXU0lfRVhUX05BTUVTIG9yCisgICAgICAgICAgICAgICAgZXh0Lm5hbWUgaW4gQVZPSURfRVhUX05BTUVTIG9yIGV4dC5uYW1lIGluIEFWT0lEX0NNRF9OQU1FUyBvcgorICAgICAgICAgICAgICAgIGV4dC50eXBlID09ICdkZXZpY2UnIG9yIGV4dC5udW1fY29tbWFuZHMgPT0gMCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgZXh0Lm5hbWUgIT0gY3VyX2V4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgIGNyZWF0ZV9mdW5jICs9ICdcbiAgICAvLyAtLS0tICVzIGV4dGVuc2lvbiBjb21tYW5kc1xuJyAlIGV4dC5uYW1lCisgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gZXh0Lm5hbWUKKworICAgICAgICAgICAgaWYgZXh0LnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY3JlYXRlX2Z1bmMgKz0gJyNpZmRlZiAlc1xuJyAlIGV4dC5wcm90ZWN0CisgICAgICAgICAgICBpZiBjb3VudCA9PSAwOgorICAgICAgICAgICAgICAgIGNyZWF0ZV9mdW5jICs9ICcgICAgICAgIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sICcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3JlYXRlX2Z1bmMgKz0gJyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sICcKKworICAgICAgICAgICAgY3JlYXRlX2Z1bmMgKz0gZXh0LmRlZmluZSArICcpKSB7XG4nCisgICAgICAgICAgICBjcmVhdGVfZnVuYyArPSAnICAgICAgICAgICAgcHRyX2luc3RhbmNlLT5lbmFibGVkX2tub3duX2V4dGVuc2lvbnMuJworICAgICAgICAgICAgY3JlYXRlX2Z1bmMgKz0gZXh0Lm5hbWVbMzpdLmxvd2VyKCkKKyAgICAgICAgICAgIGNyZWF0ZV9mdW5jICs9ICcgPSAxO1xuJworCisgICAgICAgICAgICBpZiBleHQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjcmVhdGVfZnVuYyArPSAnI2VuZGlmIC8vICVzXG4nICUgZXh0LnByb3RlY3QKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKworICAgICAgICBjcmVhdGVfZnVuYyArPSAnICAgICAgICB9XG4nCisgICAgICAgIGNyZWF0ZV9mdW5jICs9ICcgICAgfVxuJworICAgICAgICBjcmVhdGVfZnVuYyArPSAnfVxuXG4nCisgICAgICAgIHJldHVybiBjcmVhdGVfZnVuYworCisgICAgIworICAgICMgQ3JlYXRlIGNvZGUgdG8gaW5pdGlhbGl6ZSBhIGRpc3BhdGNoIHRhYmxlIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxpc3Qgb2YKKyAgICAjIGV4dGVuc2lvbiBlbnRyeXBvaW50cyBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nCisgICAgZGVmIERldmljZUV4dGVuc2lvbkdldFRlcm1pbmF0b3Ioc2VsZik6CisgICAgICAgIHRlcm1fZnVuYyA9ICcnCisgICAgICAgIGN1cl9leHRlbnNpb25fbmFtZSA9ICcnCisKKyAgICAgICAgdGVybV9mdW5jICs9ICcvLyBTb21lIGRldmljZSBjb21tYW5kcyBzdGlsbCBuZWVkIGEgdGVybWluYXRvciBiZWNhdXNlIHRoZSBsb2FkZXIgbmVlZHMgdG8gdW53cmFwIHNvbWV0aGluZyBhYm91dCB0aGVtLlxuJworICAgICAgICB0ZXJtX2Z1bmMgKz0gJy8vIEluIG1hbnkgY2FzZXMsIHRoZSBpdGVtIG5lZWRpbmcgdW53cmFwcGluZyBpcyBhIFZrUGh5c2ljYWxEZXZpY2Ugb3IgVmtTdXJmYWNlS0hSIG9iamVjdC4gIEJ1dCB0aGVyZSBtYXkgYmUgb3RoZXIgaXRlbXNcbicKKyAgICAgICAgdGVybV9mdW5jICs9ICcvLyBpbiB0aGUgZnV0dXJlLlxuJworICAgICAgICB0ZXJtX2Z1bmMgKz0gJ1BGTl92a1ZvaWRGdW5jdGlvbiBnZXRfZXh0ZW5zaW9uX2RldmljZV9wcm9jX3Rlcm1pbmF0b3Ioc3RydWN0IGxvYWRlcl9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcE5hbWUpIHtcbicKKyAgICAgICAgdGVybV9mdW5jICs9ICcgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIGFkZHIgPSBOVUxMO1xuJworCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBpc19leHRlbnNpb24gPSBGYWxzZQorICAgICAgICBsYXN0X3Byb3RlY3QgPSBOb25lCisgICAgICAgIGZvciBleHRfY21kIGluIHNlbGYuZXh0X2NvbW1hbmRzOgorICAgICAgICAgICAgaWYgZXh0X2NtZC5uYW1lIGluIERFVklDRV9DTURTX05FRURfVEVSTToKKyAgICAgICAgICAgICAgICBpZiBleHRfY21kLmV4dF9uYW1lICE9IGN1cl9leHRlbnNpb25fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdGVybV9mdW5jICs9ICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNfZXh0ZW5zaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVybV9mdW5jICs9ICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uID0gRmFsc2UKKworICAgICAgICAgICAgICAgICAgICBpZiAnVktfVkVSU0lPTl8nIGluIGV4dF9jbWQuZXh0X25hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtX2Z1bmMgKz0gJ1xuICAgIC8vIC0tLS0gQ29yZSAlcyBjb21tYW5kc1xuJyAlIGV4dF9jbWQuZXh0X25hbWVbMTE6XQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wcm90ZWN0ID0gZXh0X2NtZC5wcm90ZWN0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHRfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybV9mdW5jICs9ICcjaWZkZWYgJXNcbicgJSBleHRfY21kLnByb3RlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1fZnVuYyArPSAnXG4gICAgLy8gLS0tLSAlcyBleHRlbnNpb24gY29tbWFuZHNcbicgJSBleHRfY21kLmV4dF9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHRfY21kLnJlcXVpcmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybV9mdW5jICs9ICcgICAgaWYgKGRldi0+ZXh0ZW5zaW9ucy4lc19lbmFibGVkICYmIGRldi0+ZXh0ZW5zaW9ucy4lc19lbmFibGVkKSB7XG4nICUgKGV4dF9jbWQuZXh0X25hbWVbMzpdLmxvd2VyKCksIGV4dF9jbWQucmVxdWlyZVszOl0ubG93ZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybV9mdW5jICs9ICcgICAgaWYgKGRldi0+ZXh0ZW5zaW9ucy4lc19lbmFibGVkKSB7XG4nICUgZXh0X2NtZC5leHRfbmFtZVszOl0ubG93ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSBleHRfY21kLmV4dF9uYW1lCisKKyAgICAgICAgICAgICAgICBpZiBjb3VudCA9PSAwOgorICAgICAgICAgICAgICAgICAgICB0ZXJtX2Z1bmMgKz0gJyAgICAgICAgaWYnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGVybV9mdW5jICs9ICcgICAgICAgIH0gZWxzZSBpZicKKworICAgICAgICAgICAgICAgIHRlcm1fZnVuYyArPSAnKCFzdHJjbXAocE5hbWUsICIlcyIpKSB7XG4nICUgKGV4dF9jbWQubmFtZSkKKyAgICAgICAgICAgICAgICB0ZXJtX2Z1bmMgKz0gJyAgICAgICAgICAgIGFkZHIgPSAoUEZOX3ZrVm9pZEZ1bmN0aW9uKXRlcm1pbmF0b3JfJXM7XG4nICUgKGV4dF9jbWQubmFtZVsyOl0pCisKKworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKworICAgICAgICBpZiBjb3VudCA+IDA6CisgICAgICAgICAgICB0ZXJtX2Z1bmMgKz0gJyAgICAgICAgfVxuJworICAgICAgICBpZiBpc19leHRlbnNpb246CisgICAgICAgICAgICB0ZXJtX2Z1bmMgKz0gJyAgICB9XG4nCisgICAgICAgICAgICBpZiBsYXN0X3Byb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdGVybV9mdW5jICs9ICcjZW5kaWYgLy8gJXNcbicgJSBleHRfY21kLnByb3RlY3QKKworICAgICAgICB0ZXJtX2Z1bmMgKz0gJyAgICByZXR1cm4gYWRkcjtcbicKKyAgICAgICAgdGVybV9mdW5jICs9ICd9XG5cbicKKworICAgICAgICByZXR1cm4gdGVybV9mdW5jCisKKyAgICAjCisgICAgIyBDcmVhdGUgY29kZSB0byBpbml0aWFsaXplIGEgZGlzcGF0Y2ggdGFibGUgZnJvbSB0aGUgYXBwcm9wcmlhdGUgbGlzdCBvZgorICAgICMgY29yZSBhbmQgZXh0ZW5zaW9uIGVudHJ5cG9pbnRzIGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcKKyAgICBkZWYgSW5pdEluc3RMb2FkZXJFeHRlbnNpb25EaXNwYXRjaFRhYmxlKHNlbGYpOgorICAgICAgICBjb21tYW5kcyA9IFtdCisgICAgICAgIHRhYmxlID0gJycKKyAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gJycKKworICAgICAgICB0YWJsZSArPSAnLy8gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgbG9hZGVyXCdzIGluc3RhbmNlIGRpc3BhdGNoIHRhYmxlLCB3aGljaCBjb250YWluc1xuJworICAgICAgICB0YWJsZSArPSAnLy8gZGVmYXVsdCBmdW5jdGlvbnMgaWYgbm8gaW5zdGFuY2UgbGF5ZXJzIGFyZSBhY3RpdmF0ZWQuICBUaGlzIGNvbnRhaW5zXG4nCisgICAgICAgIHRhYmxlICs9ICcvLyBwb2ludGVycyB0byAidGVybWluYXRvciBmdW5jdGlvbnMiLlxuJworICAgICAgICB0YWJsZSArPSAnY29uc3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSBpbnN0YW5jZV9kaXNwID0ge1xuJworCisgICAgICAgIGZvciB4IGluIHJhbmdlKDAsIDIpOgorICAgICAgICAgICAgaWYgeCA9PSAwOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gc2VsZi5jb3JlX2NvbW1hbmRzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gc2VsZi5leHRfY29tbWFuZHMKKworICAgICAgICAgICAgZm9yIGN1cl9jbWQgaW4gY29tbWFuZHM6CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgY3VyX2NtZC5oYW5kbGVfdHlwZSA9PSAnVmtJbnN0YW5jZScgb3IgY3VyX2NtZC5oYW5kbGVfdHlwZSA9PSAnVmtQaHlzaWNhbERldmljZSc6CisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQuZXh0X25hbWUgIT0gY3VyX2V4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ1ZLX1ZFUlNJT05fJyBpbiBjdXJfY21kLmV4dF9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICdcbiAgICAvLyAtLS0tIENvcmUgJXMgY29tbWFuZHNcbicgJSBjdXJfY21kLmV4dF9uYW1lWzExOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJ1xuICAgIC8vIC0tLS0gJXMgZXh0ZW5zaW9uIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gY3VyX2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9IGN1cl9jbWQubmFtZVsyOl0KKyAgICAgICAgICAgICAgICAgICAgYWxpYXNlZF9uYW1lID0gQUxJQVNFRF9DTURTW2N1cl9jbWQubmFtZV1bMjpdIGlmIGN1cl9jbWQubmFtZSBpbiBBTElBU0VEX0NNRFMgZWxzZSBiYXNlX25hbWUKKworICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZV9uYW1lID09ICdDcmVhdGVJbnN0YW5jZScgb3IgYmFzZV9uYW1lID09ICdDcmVhdGVEZXZpY2UnIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX25hbWUgPT0gJ0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9PSAnRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX25hbWUgPT0gJ0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbicpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgICAgICAgICAgICAgaWYgYmFzZV9uYW1lID09ICdHZXRJbnN0YW5jZVByb2NBZGRyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICcgICAgLiVzID0gJXMsXG4nICUgKGJhc2VfbmFtZSwgY3VyX2NtZC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJyAgICAuJXMgPSB0ZXJtaW5hdG9yXyVzLFxuJyAlIChiYXNlX25hbWUsIGFsaWFzZWRfbmFtZSkKKworICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2VuZGlmIC8vICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisgICAgICAgIHRhYmxlICs9ICd9O1xuXG4nCisKKyAgICAgICAgcmV0dXJuIHRhYmxlCisKKyAgICAjCisgICAgIyBDcmVhdGUgdGhlIGV4dGVuc2lvbiBuYW1lIHdoaXRlbGlzdCBhcnJheQorICAgIGRlZiBPdXRwdXRJbnN0YW50RXh0ZW5zaW9uV2hpdGVsaXN0QXJyYXkoc2VsZik6CisgICAgICAgIGV4dGVuc2lvbnMgPSBzZWxmLmluc3RhbmNlRXh0ZW5zaW9ucworCisgICAgICAgIHRhYmxlID0gJycKKyAgICAgICAgdGFibGUgKz0gJy8vIEEgbnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgYWxsIG9mIHRoZSBpbnN0YW5jZSBleHRlbnNpb25zIHN1cHBvcnRlZCBieSB0aGUgbG9hZGVyLlxuJworICAgICAgICB0YWJsZSArPSAnLy8gSWYgYW4gaW5zdGFuY2UgZXh0ZW5zaW9uIG5hbWUgaXMgbm90IGluIHRoaXMgbGlzdCwgYnV0IGl0IGlzIGV4cG9ydGVkIGJ5IG9uZSBvciBtb3JlIG9mIHRoZVxuJworICAgICAgICB0YWJsZSArPSAnLy8gSUNEcyBkZXRlY3RlZCBieSB0aGUgbG9hZGVyLCB0aGVuIHRoZSBleHRlbnNpb24gbmFtZSBub3QgaW4gdGhlIGxpc3Qgd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbicKKyAgICAgICAgdGFibGUgKz0gJy8vIGJlZm9yZSBwYXNzaW5nIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgdG8gdGhlIGFwcGxpY2F0aW9uLlxuJworICAgICAgICB0YWJsZSArPSAnY29uc3QgY2hhciAqY29uc3QgTE9BREVSX0lOU1RBTkNFX0VYVEVOU0lPTlNbXSA9IHtcbicKKyAgICAgICAgZm9yIGV4dCBpbiBleHRlbnNpb25zOgorICAgICAgICAgICAgaWYgZXh0LnR5cGUgPT0gJ2RldmljZScgb3IgJ1ZLX1ZFUlNJT05fJyBpbiBleHQubmFtZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBleHQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgZXh0LnByb3RlY3QKKyAgICAgICAgICAgIHRhYmxlICs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgIHRhYmxlICs9IGV4dC5kZWZpbmUgKyAnLFxuJworCisgICAgICAgICAgICBpZiBleHQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2VuZGlmIC8vICVzXG4nICUgZXh0LnByb3RlY3QKKyAgICAgICAgdGFibGUgKz0gJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCB9O1xuJworICAgICAgICByZXR1cm4gdGFibGUKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvbG9hZGVyX2dlbnZrLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvbG9hZGVyX2dlbnZrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTdhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy9sb2FkZXJfZ2VudmsucHkKQEAgLTAsMCArMSw0MDAgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMworIworIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBhcmdwYXJzZSwgY1Byb2ZpbGUsIHBkYiwgc3RyaW5nLCBzeXMsIHRpbWUsIG9zCisKKyMgU2ltcGxlIHRpbWVyIGZ1bmN0aW9ucworc3RhcnRUaW1lID0gTm9uZQorCitkZWYgc3RhcnRUaW1lcih0aW1laXQpOgorICAgIGdsb2JhbCBzdGFydFRpbWUKKyAgICBpZiB0aW1laXQ6CisgICAgICAgIHN0YXJ0VGltZSA9IHRpbWUucHJvY2Vzc190aW1lKCkKKworZGVmIGVuZFRpbWVyKHRpbWVpdCwgbXNnKToKKyAgICBnbG9iYWwgc3RhcnRUaW1lCisgICAgaWYgdGltZWl0OgorICAgICAgICBlbmRUaW1lID0gdGltZS5wcm9jZXNzX3RpbWUoKQorICAgICAgICB3cml0ZShtc2csIGVuZFRpbWUgLSBzdGFydFRpbWUsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgc3RhcnRUaW1lID0gTm9uZQorCisjIFR1cm4gYSBsaXN0IG9mIHN0cmluZ3MgaW50byBhIHJlZ2V4cCBzdHJpbmcgbWF0Y2hpbmcgZXhhY3RseSB0aG9zZSBzdHJpbmdzCitkZWYgbWFrZVJFc3RyaW5nKGxpc3QsIGRlZmF1bHQgPSBOb25lKToKKyAgICBpZiBsZW4obGlzdCkgPiAwIG9yIGRlZmF1bHQgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuICdeKCcgKyAnfCcuam9pbihsaXN0KSArICcpJCcKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisjIFJldHVybnMgYSBkaXJlY3Rvcnkgb2YgWyBnZW5lcmF0b3IgZnVuY3Rpb24sIGdlbmVyYXRvciBvcHRpb25zIF0gaW5kZXhlZAorIyBieSBzcGVjaWZpZWQgc2hvcnQgbmFtZXMuIFRoZSBnZW5lcmF0b3Igb3B0aW9ucyBpbmNvcnBvcmF0ZSB0aGUgZm9sbG93aW5nCisjIHBhcmFtZXRlcnM6CisjCisjIGFyZ3MgaXMgYW4gcGFyc2VkIGFyZ3VtZW50IG9iamVjdDsgc2VlIGJlbG93IGZvciB0aGUgZmllbGRzIHRoYXQgYXJlIHVzZWQuCitkZWYgbWFrZUdlbk9wdHMoYXJncyk6CisgICAgZ2xvYmFsIGdlbk9wdHMKKyAgICBnZW5PcHRzID0ge30KKworICAgICMgRGVmYXVsdCBjbGFzcyBvZiBleHRlbnNpb25zIHRvIGluY2x1ZGUsIG9yIE5vbmUKKyAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9IGFyZ3MuZGVmYXVsdEV4dGVuc2lvbnMKKworICAgICMgQWRkaXRpb25hbCBleHRlbnNpb25zIHRvIGluY2x1ZGUgKGxpc3Qgb2YgZXh0ZW5zaW9ucykKKyAgICBleHRlbnNpb25zID0gYXJncy5leHRlbnNpb24KKworICAgICMgRXh0ZW5zaW9ucyB0byByZW1vdmUgKGxpc3Qgb2YgZXh0ZW5zaW9ucykKKyAgICByZW1vdmVFeHRlbnNpb25zID0gYXJncy5yZW1vdmVFeHRlbnNpb25zCisKKyAgICAjIEV4dGVuc2lvbnMgdG8gZW1pdCAobGlzdCBvZiBleHRlbnNpb25zKQorICAgIGVtaXRFeHRlbnNpb25zID0gYXJncy5lbWl0RXh0ZW5zaW9ucworCisgICAgIyBGZWF0dXJlcyB0byBpbmNsdWRlIChsaXN0IG9mIGZlYXR1cmVzKQorICAgIGZlYXR1cmVzID0gYXJncy5mZWF0dXJlCisKKyAgICAjIFdoZXRoZXIgdG8gZGlzYWJsZSBpbmNsdXNpb24gcHJvdGVjdCBpbiBoZWFkZXJzCisgICAgcHJvdGVjdCA9IGFyZ3MucHJvdGVjdAorCisgICAgIyBPdXRwdXQgdGFyZ2V0IGRpcmVjdG9yeQorICAgIGRpcmVjdG9yeSA9IGFyZ3MuZGlyZWN0b3J5CisKKyAgICAjIERlc2NyaXB0aXZlIG5hbWVzIGZvciB2YXJpb3VzIHJlZ2V4cCBwYXR0ZXJucyB1c2VkIHRvIHNlbGVjdAorICAgICMgdmVyc2lvbnMgYW5kIGV4dGVuc2lvbnMKKyAgICBhbGxGZWF0dXJlcyAgICAgPSBhbGxFeHRlbnNpb25zID0gJy4qJworICAgIG5vRmVhdHVyZXMgICAgICA9IG5vRXh0ZW5zaW9ucyA9IE5vbmUKKworICAgICMgVHVybiBsaXN0cyBvZiBuYW1lcy9wYXR0ZXJucyBpbnRvIG1hdGNoaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMKKyAgICBhZGRFeHRlbnNpb25zUGF0ICAgICA9IG1ha2VSRXN0cmluZyhleHRlbnNpb25zLCBOb25lKQorICAgIHJlbW92ZUV4dGVuc2lvbnNQYXQgID0gbWFrZVJFc3RyaW5nKHJlbW92ZUV4dGVuc2lvbnMsIE5vbmUpCisgICAgZW1pdEV4dGVuc2lvbnNQYXQgICAgPSBtYWtlUkVzdHJpbmcoZW1pdEV4dGVuc2lvbnMsIGFsbEV4dGVuc2lvbnMpCisgICAgZmVhdHVyZXNQYXQgICAgICAgICAgPSBtYWtlUkVzdHJpbmcoZmVhdHVyZXMsIGFsbEZlYXR1cmVzKQorCisgICAgIyBDb3B5cmlnaHQgdGV4dCBwcmVmaXhpbmcgYWxsIGhlYWRlcnMgKGxpc3Qgb2Ygc3RyaW5ncykuCisgICAgcHJlZml4U3RyaW5ncyA9IFsKKyAgICAgICAgJy8qJywKKyAgICAgICAgJyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4nLAorICAgICAgICAnKionLAorICAgICAgICAnKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7JywKKyAgICAgICAgJyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4nLAorICAgICAgICAnKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JywKKyAgICAgICAgJyoqJywKKyAgICAgICAgJyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnLAorICAgICAgICAnKionLAorICAgICAgICAnKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZScsCisgICAgICAgICcqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCcsCisgICAgICAgICcqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4nLAorICAgICAgICAnKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCcsCisgICAgICAgICcqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4nLAorICAgICAgICAnKi8nLAorICAgICAgICAnJworICAgIF0KKworICAgICMgVGV4dCBzcGVjaWZpYyB0byBWdWxrYW4gaGVhZGVycworICAgIHZrUHJlZml4U3RyaW5ncyA9IFsKKyAgICAgICAgJy8qJywKKyAgICAgICAgJyoqIFRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBLaHJvbm9zIFZ1bGthbiBYTUwgQVBJIFJlZ2lzdHJ5LicsCisgICAgICAgICcqKicsCisgICAgICAgICcqLycsCisgICAgICAgICcnCisgICAgXQorCisgICAgIyBEZWZhdWx0cyBmb3IgZ2VuZXJhdGluZyByZS1pbmNsdXNpb24gcHJvdGVjdGlvbiB3cmFwcGVycyAob3Igbm90KQorICAgIHByb3RlY3RGZWF0dXJlID0gcHJvdGVjdAorCisgICAgIyBBbiBBUEkgc3R5bGUgY29udmVudGlvbnMgb2JqZWN0CisgICAgY29udmVudGlvbnMgPSBWdWxrYW5Db252ZW50aW9ucygpCisKKyAgICAjIExvYWRlciBHZW5lcmF0b3JzCisgICAgIyBPcHRpb25zIGZvciBkaXNwYXRjaCB0YWJsZSBoZWxwZXIgZ2VuZXJhdG9yCisgICAgZ2VuT3B0c1sndmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgnXSA9IFsKKyAgICAgICAgICBEaXNwYXRjaFRhYmxlSGVscGVyT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3ZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIExheWVyIGRpc3BhdGNoIHRhYmxlIGdlbmVyYXRvcgorICAgIGdlbk9wdHNbJ3ZrX2xheWVyX2Rpc3BhdGNoX3RhYmxlLmgnXSA9IFsKKyAgICAgICAgICBMb2FkZXJFeHRlbnNpb25PdXRwdXRHZW5lcmF0b3IsCisgICAgICAgICAgTG9hZGVyRXh0ZW5zaW9uR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICd2a19sYXllcl9kaXNwYXRjaF90YWJsZS5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIGxvYWRlciBleHRlbnNpb24gc291cmNlIGdlbmVyYXRvcgorICAgIGdlbk9wdHNbJ3ZrX2xvYWRlcl9leHRlbnNpb25zLmgnXSA9IFsKKyAgICAgICAgICBMb2FkZXJFeHRlbnNpb25PdXRwdXRHZW5lcmF0b3IsCisgICAgICAgICAgTG9hZGVyRXh0ZW5zaW9uR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICd2a19sb2FkZXJfZXh0ZW5zaW9ucy5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIGxvYWRlciBleHRlbnNpb24gc291cmNlIGdlbmVyYXRvcgorICAgIGdlbk9wdHNbJ3ZrX2xvYWRlcl9leHRlbnNpb25zLmMnXSA9IFsKKyAgICAgICAgICBMb2FkZXJFeHRlbnNpb25PdXRwdXRHZW5lcmF0b3IsCisgICAgICAgICAgTG9hZGVyRXh0ZW5zaW9uR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICd2a19sb2FkZXJfZXh0ZW5zaW9ucy5jJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIEhlbHBlciBmaWxlIGdlbmVyYXRvciBvcHRpb25zIGZvciB2a19vYmplY3RfdHlwZXMuaAorICAgIGdlbk9wdHNbJ3ZrX29iamVjdF90eXBlcy5oJ10gPSBbCisgICAgICAgICAgSGVscGVyRmlsZU91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICd2a19vYmplY3RfdHlwZXMuaCcsCisgICAgICAgICAgICBkaXJlY3RvcnkgICAgICAgICA9IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWUgICAgICAgICAgID0gJ3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlICAgICAgICAgICA9IE5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucyAgICAgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gJ3Z1bGthbicsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IGFkZEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IHJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBwcmVmaXhTdHJpbmdzICsgdmtQcmVmaXhTdHJpbmdzLAorICAgICAgICAgICAgYXBpY2FsbCAgICAgICAgICAgPSAnVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnVktBUElfQ0FMTCAnLAorICAgICAgICAgICAgYXBpZW50cnlwICAgICAgICAgPSAnVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gICAgPSA0OCwKKyAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgID0gRmFsc2UsCisgICAgICAgICAgICBoZWxwZXJfZmlsZV90eXBlICA9ICdvYmplY3RfdHlwZXNfaGVhZGVyJykKKyAgICAgICAgXQorCisjIEdlbmVyYXRlIGEgdGFyZ2V0IGJhc2VkIG9uIHRoZSBvcHRpb25zIGluIHRoZSBtYXRjaGluZyBnZW5PcHRze30gb2JqZWN0LgorIyBUaGlzIGlzIGVuY2Fwc3VsYXRlZCBpbiBhIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBwcm9maWxlZCBhbmQvb3IgdGltZWQuCisjIFRoZSBhcmdzIHBhcmFtZXRlciBpcyBhbiBwYXJzZWQgYXJndW1lbnQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZworIyBmaWVsZHMgdGhhdCBhcmUgdXNlZDoKKyMgICB0YXJnZXQgLSB0YXJnZXQgdG8gZ2VuZXJhdGUKKyMgICBkaXJlY3RvcnkgLSBkaXJlY3RvcnkgdG8gZ2VuZXJhdGUgaXQgaW4KKyMgICBwcm90ZWN0IC0gVHJ1ZSBpZiByZS1pbmNsdXNpb24gd3JhcHBlcnMgc2hvdWxkIGJlIGNyZWF0ZWQKKyMgICBleHRlbnNpb25zIC0gbGlzdCBvZiBhZGRpdGlvbmFsIGV4dGVuc2lvbnMgdG8gaW5jbHVkZSBpbiBnZW5lcmF0ZWQKKyMgICBpbnRlcmZhY2VzCitkZWYgZ2VuVGFyZ2V0KGFyZ3MpOgorICAgIGdsb2JhbCBnZW5PcHRzCisKKyAgICAjIENyZWF0ZSBnZW5lcmF0b3Igb3B0aW9ucyB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICAgbWFrZUdlbk9wdHMoYXJncykKKworICAgIGlmIChhcmdzLnRhcmdldCBpbiBnZW5PcHRzLmtleXMoKSk6CisgICAgICAgIGNyZWF0ZUdlbmVyYXRvciA9IGdlbk9wdHNbYXJncy50YXJnZXRdWzBdCisgICAgICAgIG9wdGlvbnMgPSBnZW5PcHRzW2FyZ3MudGFyZ2V0XVsxXQorCisgICAgICAgIGlmIG5vdCBhcmdzLnF1aWV0OgorICAgICAgICAgICAgd3JpdGUoJyogQnVpbGRpbmcnLCBvcHRpb25zLmZpbGVuYW1lLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLnZlcnNpb25zICAgICAgICAgID0nLCBvcHRpb25zLnZlcnNpb25zLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLmVtaXR2ZXJzaW9ucyAgICAgID0nLCBvcHRpb25zLmVtaXR2ZXJzaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5kZWZhdWx0RXh0ZW5zaW9ucyA9Jywgb3B0aW9ucy5kZWZhdWx0RXh0ZW5zaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5hZGRFeHRlbnNpb25zICAgICA9Jywgb3B0aW9ucy5hZGRFeHRlbnNpb25zLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLnJlbW92ZUV4dGVuc2lvbnMgID0nLCBvcHRpb25zLnJlbW92ZUV4dGVuc2lvbnMsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHdyaXRlKCcqIG9wdGlvbnMuZW1pdEV4dGVuc2lvbnMgICAgPScsIG9wdGlvbnMuZW1pdEV4dGVuc2lvbnMsIGZpbGU9c3lzLnN0ZGVycikKKworICAgICAgICBzdGFydFRpbWVyKGFyZ3MudGltZSkKKyAgICAgICAgZ2VuID0gY3JlYXRlR2VuZXJhdG9yKGVyckZpbGU9ZXJyV2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5GaWxlPWVycldhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnRmlsZT1kaWFnKQorICAgICAgICByZWcuc2V0R2VuZXJhdG9yKGdlbikKKyAgICAgICAgcmVnLmFwaUdlbihvcHRpb25zKQorCisgICAgICAgIGlmIG5vdCBhcmdzLnF1aWV0OgorICAgICAgICAgICAgd3JpdGUoJyogR2VuZXJhdGVkJywgb3B0aW9ucy5maWxlbmFtZSwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBlbmRUaW1lcihhcmdzLnRpbWUsICcqIFRpbWUgdG8gZ2VuZXJhdGUgJyArIG9wdGlvbnMuZmlsZW5hbWUgKyAnID0nKQorICAgIGVsc2U6CisgICAgICAgIHdyaXRlKCdObyBnZW5lcmF0b3Igb3B0aW9ucyBmb3IgdW5rbm93biB0YXJnZXQ6JywKKyAgICAgICAgICAgICAgYXJncy50YXJnZXQsIGZpbGU9c3lzLnN0ZGVycikKKworIyAtZmVhdHVyZSBuYW1lCisjIC1leHRlbnNpb24gbmFtZQorIyBGb3IgYm90aCwgIm5hbWUiIG1heSBiZSBhIHNpbmdsZSBuYW1lLCBvciBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0CisjIG9mIG5hbWVzLCBvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWRlZmF1bHRFeHRlbnNpb25zJywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSd2dWxrYW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhIHNpbmdsZSBjbGFzcyBvZiBleHRlbnNpb25zIHRvIGFkZCB0byB0YXJnZXRzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZXh0ZW5zaW9uJywgYWN0aW9uPSdhcHBlbmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYW4gZXh0ZW5zaW9uIG9yIGV4dGVuc2lvbnMgdG8gYWRkIHRvIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1yZW1vdmVFeHRlbnNpb25zJywgYWN0aW9uPSdhcHBlbmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYW4gZXh0ZW5zaW9uIG9yIGV4dGVuc2lvbnMgdG8gcmVtb3ZlIGZyb20gdGFyZ2V0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWVtaXRFeHRlbnNpb25zJywgYWN0aW9uPSdhcHBlbmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYW4gZXh0ZW5zaW9uIG9yIGV4dGVuc2lvbnMgdG8gZW1pdCBpbiB0YXJnZXRzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZmVhdHVyZScsIGFjdGlvbj0nYXBwZW5kJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGEgY29yZSBBUEkgZmVhdHVyZSBuYW1lIG9yIG5hbWVzIHRvIGFkZCB0byB0YXJnZXRzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZGVidWcnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIGRlYnVnZ2luZycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWR1bXAnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIGR1bXAgdG8gc3RkZXJyJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZGlhZ2ZpbGUnLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1dyaXRlIGRpYWdub3N0aWNzIHRvIHNwZWNpZmllZCBmaWxlJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZXJyZmlsZScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nV3JpdGUgZXJyb3JzIGFuZCB3YXJuaW5ncyB0byBzcGVjaWZpZWQgZmlsZSBpbnN0ZWFkIG9mIHN0ZGVycicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLW5vcHJvdGVjdCcsIGRlc3Q9J3Byb3RlY3QnLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0Rpc2FibGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gaW4gb3V0cHV0IGhlYWRlcnMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1wcm9maWxlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0VuYWJsZSBwcm9maWxpbmcnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1yZWdpc3RyeScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ndmsueG1sJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1VzZSBzcGVjaWZpZWQgcmVnaXN0cnkgZmlsZSBpbnN0ZWFkIG9mIHZrLnhtbCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXRpbWUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIHRpbWluZycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXZhbGlkYXRlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0VuYWJsZSBncm91cCB2YWxpZGF0aW9uJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctbycsIGFjdGlvbj0nc3RvcmUnLCBkZXN0PSdkaXJlY3RvcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nLicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdDcmVhdGUgdGFyZ2V0IGFuZCByZWxhdGVkIGZpbGVzIGluIHNwZWNpZmllZCBkaXJlY3RvcnknKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3RhcmdldCcsIG1ldGF2YXI9J3RhcmdldCcsIG5hcmdzPSc/JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgdGFyZ2V0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcXVpZXQnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTdXBwcmVzcyBzY3JpcHQgb3V0cHV0IGR1cmluZyBub3JtYWwgZXhlY3V0aW9uLicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywgZGVzdD0ncXVpZXQnLCBkZWZhdWx0PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgc2NyaXB0IG91dHB1dCBkdXJpbmcgbm9ybWFsIGV4ZWN1dGlvbi4nKQorCisgICAgIyBUaGlzIGFyZ3VtZW50IHRlbGxzIHVzIHdoZXJlIHRvIGxvYWQgdGhlIHNjcmlwdCBmcm9tIHRoZSBWdWxrYW4tSGVhZGVycyByZWdpc3RyeQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1zY3JpcHRzJywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdGaW5kIGFkZGl0aW9uYWwgc2NyaXB0cyBpbiB0aGlzIGRpcmVjdG9yeScpCisKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgIyBkZWZhdWx0IHNjcmlwdHMgcGF0aCB0byBiZSBzYW1lIGFzIHJlZ2lzdHJ5CisgICAgaWYgbm90IGFyZ3Muc2NyaXB0czoKKyAgICAgICAgYXJncy5zY3JpcHRzID0gb3MucGF0aC5kaXJuYW1lKGFyZ3MucmVnaXN0cnkpCisgICAgICAgIHByaW50KGFyZ3Muc2NyaXB0cykKKworICAgIHNjcmlwdHNfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCisgICAgcmVnaXN0cnlfZGlyID0gb3MucGF0aC5qb2luKHNjcmlwdHNfZGlyLCBhcmdzLnNjcmlwdHMpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHJlZ2lzdHJ5X2RpcikKKworICAgICMgVGhlIGltcG9ydHMgbmVlZCB0byBiZSBkb25lIGhlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBwaWNrZWQgdXAgZnJvbSBWdWxrYW4tSGVhZGVycworICAgIGZyb20gcmVnIGltcG9ydCAqCisgICAgZnJvbSBnZW5lcmF0b3IgaW1wb3J0IHdyaXRlCisgICAgZnJvbSBjZ2VuZXJhdG9yIGltcG9ydCBDR2VuZXJhdG9yT3B0aW9ucywgQ091dHB1dEdlbmVyYXRvcgorCisgICAgZnJvbSBkaXNwYXRjaF90YWJsZV9oZWxwZXJfZ2VuZXJhdG9yIGltcG9ydCBEaXNwYXRjaFRhYmxlSGVscGVyT3V0cHV0R2VuZXJhdG9yLCBEaXNwYXRjaFRhYmxlSGVscGVyT3V0cHV0R2VuZXJhdG9yT3B0aW9ucworICAgIGZyb20gaGVscGVyX2ZpbGVfZ2VuZXJhdG9yIGltcG9ydCBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yLCBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucworICAgIGZyb20gbG9hZGVyX2V4dGVuc2lvbl9nZW5lcmF0b3IgaW1wb3J0IExvYWRlckV4dGVuc2lvbk91dHB1dEdlbmVyYXRvciwgTG9hZGVyRXh0ZW5zaW9uR2VuZXJhdG9yT3B0aW9ucworICAgICMgVGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIHZrY29udmVudGlvbnMgcHl0aG9uMiBjb21wYXRpYmlsaXR5CisgICAgaW1wb3J0IGFiYzsgYWJjLkFCQyA9IGFiYy5BQkNNZXRhKCdBQkMnLCAob2JqZWN0LCksIHt9KQorICAgIGZyb20gdmtjb252ZW50aW9ucyBpbXBvcnQgVnVsa2FuQ29udmVudGlvbnMKKworICAgICMgVGhpcyBzcGxpdHMgYXJndW1lbnRzIHdoaWNoIGFyZSBzcGFjZS1zZXBhcmF0ZWQgbGlzdHMKKyAgICBhcmdzLmZlYXR1cmUgPSBbbmFtZSBmb3IgYXJnIGluIGFyZ3MuZmVhdHVyZSBmb3IgbmFtZSBpbiBhcmcuc3BsaXQoKV0KKyAgICBhcmdzLmV4dGVuc2lvbiA9IFtuYW1lIGZvciBhcmcgaW4gYXJncy5leHRlbnNpb24gZm9yIG5hbWUgaW4gYXJnLnNwbGl0KCldCisKKyAgICAjIExvYWQgJiBwYXJzZSByZWdpc3RyeQorICAgIHJlZyA9IFJlZ2lzdHJ5KCkKKworICAgIHN0YXJ0VGltZXIoYXJncy50aW1lKQorICAgIHRyZWUgPSBldHJlZS5wYXJzZShhcmdzLnJlZ2lzdHJ5KQorICAgIGVuZFRpbWVyKGFyZ3MudGltZSwgJyogVGltZSB0byBtYWtlIEVsZW1lbnRUcmVlID0nKQorCisgICAgaWYgYXJncy5kZWJ1ZzoKKyAgICAgICAgcGRiLnJ1bigncmVnLmxvYWRFbGVtZW50VHJlZSh0cmVlKScpCisgICAgZWxzZToKKyAgICAgICAgc3RhcnRUaW1lcihhcmdzLnRpbWUpCisgICAgICAgIHJlZy5sb2FkRWxlbWVudFRyZWUodHJlZSkKKyAgICAgICAgZW5kVGltZXIoYXJncy50aW1lLCAnKiBUaW1lIHRvIHBhcnNlIEVsZW1lbnRUcmVlID0nKQorCisgICAgaWYgKGFyZ3MudmFsaWRhdGUpOgorICAgICAgICByZWcudmFsaWRhdGVHcm91cHMoKQorCisgICAgaWYgKGFyZ3MuZHVtcCk6CisgICAgICAgIHdyaXRlKCcqIER1bXBpbmcgcmVnaXN0cnkgdG8gcmVnZHVtcC50eHQnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJlZy5kdW1wUmVnKGZpbGVoYW5kbGUgPSBvcGVuKCdyZWdkdW1wLnR4dCcsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykpCisKKyAgICAjIGNyZWF0ZSBlcnJvci93YXJuaW5nICYgZGlhZ25vc3RpYyBmaWxlcworICAgIGlmIChhcmdzLmVycmZpbGUpOgorICAgICAgICBlcnJXYXJuID0gb3BlbihhcmdzLmVycmZpbGUsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICBlbHNlOgorICAgICAgICBlcnJXYXJuID0gc3lzLnN0ZGVycgorCisgICAgaWYgKGFyZ3MuZGlhZ2ZpbGUpOgorICAgICAgICBkaWFnID0gb3BlbihhcmdzLmRpYWdmaWxlLCAndycsIGVuY29kaW5nPSd1dGYtOCcpCisgICAgZWxzZToKKyAgICAgICAgZGlhZyA9IE5vbmUKKworICAgIGlmIChhcmdzLmRlYnVnKToKKyAgICAgICAgcGRiLnJ1bignZ2VuVGFyZ2V0KGFyZ3MpJykKKyAgICBlbGlmIChhcmdzLnByb2ZpbGUpOgorICAgICAgICBpbXBvcnQgY1Byb2ZpbGUsIHBzdGF0cworICAgICAgICBjUHJvZmlsZS5ydW4oJ2dlblRhcmdldChhcmdzKScsICdwcm9maWxlLnR4dCcpCisgICAgICAgIHAgPSBwc3RhdHMuU3RhdHMoJ3Byb2ZpbGUudHh0JykKKyAgICAgICAgcC5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cygndGltZScpLnByaW50X3N0YXRzKDUwKQorICAgIGVsc2U6CisgICAgICAgIGdlblRhcmdldChhcmdzKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvdXBkYXRlX2RlcHMucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvc2NyaXB0cy91cGRhdGVfZGVwcy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMWZlMzZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3NjcmlwdHMvdXBkYXRlX2RlcHMucHkKQEAgLTAsMCArMSw2NzkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAyMDE3IFRoZSBHbHNsYW5nIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBzY3JpcHQgd2FzIGhlYXZpbHkgbGV2ZXJhZ2VkIGZyb20gS2hyb25vc0dyb3VwL2dsc2xhbmcKKyMgdXBkYXRlX2dsc2xhbmdfc291cmNlcy5weS4KKyIiInVwZGF0ZV9kZXBzLnB5CisKK0dldCBhbmQgYnVpbGQgZGVwZW5kZW50IHJlcG9zaXRvcmllcyB1c2luZyBrbm93bi1nb29kIGNvbW1pdHMuCisKK1B1cnBvc2UKKy0tLS0tLS0KKworVGhpcyBwcm9ncmFtIGlzIGludGVuZGVkIHRvIGFzc2lzdCBhIGRldmVsb3BlciBvZiB0aGlzIHJlcG9zaXRvcnkKKyh0aGUgImhvbWUiIHJlcG9zaXRvcnkpIGJ5IGdhdGhlcmluZyBhbmQgYnVpbGRpbmcgdGhlIHJlcG9zaXRvcmllcyB0aGF0Cit0aGlzIGhvbWUgcmVwb3NpdG9yeSBkZXBlbmQgb24uICBJdCBhbHNvIGNoZWNrcyBvdXQgZWFjaCBkZXBlbmRlbnQKK3JlcG9zaXRvcnkgYXQgYSAia25vd24tZ29vZCIgY29tbWl0IGluIG9yZGVyIHRvIHByb3ZpZGUgc3RhYmlsaXR5IGluCit0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcy4KKworUHl0aG9uIENvbXBhdGliaWxpdHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB3aXRoIFB5dGhvbiAyLjcgYW5kIFB5dGhvbiAzLgorCitLbm93bi1Hb29kIEpTT04gRGF0YWJhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHByb2dyYW0gZXhwZWN0cyB0byBmaW5kIGEgZmlsZSBuYW1lZCAia25vd24tZ29vZC5qc29uIiBpbiB0aGUKK3NhbWUgZGlyZWN0b3J5IGFzIHRoZSBwcm9ncmFtIGZpbGUuICBUaGlzIEpTT04gZmlsZSBpcyB0YWlsb3JlZCBmb3IKK3RoZSBuZWVkcyBvZiB0aGUgaG9tZSByZXBvc2l0b3J5IGJ5IGluY2x1ZGluZyBpdHMgZGVwZW5kZW50IHJlcG9zaXRvcmllcy4KKworUHJvZ3JhbSBPcHRpb25zCistLS0tLS0tLS0tLS0tLS0KKworU2VlIHRoZSBoZWxwIHRleHQgKHVwZGF0ZV9kZXBzLnB5IC0taGVscCkgZm9yIGEgY29tcGxldGUgbGlzdCBvZiBvcHRpb25zLgorCitQcm9ncmFtIE9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHByb2dyYW0gdXNlcyB0aGUgdXNlcidzIGN1cnJlbnQgZGlyZWN0b3J5IGF0IHRoZSB0aW1lIG9mIHByb2dyYW0KK2ludm9jYXRpb24gYXMgdGhlIGxvY2F0aW9uIGZvciBmZXRjaGluZyBhbmQgYnVpbGRpbmcgdGhlIGRlcGVuZGVudAorcmVwb3NpdG9yaWVzLiAgVGhlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgdGhlICItLWRpciIgb3B0aW9uLgorCitGb3IgZXhhbXBsZSwgYSBkaXJlY3RvcnkgbmFtZWQgImJ1aWxkIiBpbiB0aGUgcmVwb3NpdG9yeSdzIHJvb3QgZGlyZWN0b3J5CitpcyBhIGdvb2QgcGxhY2UgdG8gcHV0IHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzIGJlY2F1c2UgdGhhdCBkaXJlY3RvcnkKK2lzIG5vdCB0cmFja2VkIGJ5IEdpdC4gKFNlZSB0aGUgLmdpdGlnbm9yZSBmaWxlLikgIFRoZSAiZXh0ZXJuYWwiIGRpcmVjdG9yeQorbWF5IGFsc28gYmUgYSBzdWl0YWJsZSBsb2NhdGlvbi4KK0EgdXNlciBjYW4gaXNzdWU6CisKKyQgY2QgTXktUmVwbworJCBta2RpciBidWlsZAorJCBjZCBidWlsZAorJCAuLi9zY3JpcHRzL3VwZGF0ZV9kZXBzLnB5CisKK29yLCB0byBkbyB0aGUgc2FtZSB0aGluZywgYnV0IHVzaW5nIHRoZSAtLWRpciBvcHRpb246CisKKyQgY2QgTXktUmVwbworJCBta2RpciBidWlsZAorJCBzY3JpcHRzL3VwZGF0ZV9kZXBzLnB5IC0tZGlyPWJ1aWxkCisKK1dpdGggdGhlc2UgY29tbWFuZHMsIHRoZSAiYnVpbGQiIGRpcmVjdG9yeSBpcyBjb25zaWRlcmVkIHRoZSAidG9wIgorZGlyZWN0b3J5IHdoZXJlIHRoZSBwcm9ncmFtIGNsb25lcyB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcy4gIFRoZQorSlNPTiBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJ1aWxkIGFuZCBpbnN0YWxsIHdvcmtpbmcgZGlyZWN0b3JpZXMgdG8gYmUKK3dpdGhpbiB0aGlzICJ0b3AiIGRpcmVjdG9yeS4KKworTm90ZSB0aGF0IHRoZSAiZGlyIiBvcHRpb24gY2FuIGFsc28gc3BlY2lmeSBhbiBhYnNvbHV0ZSBwYXRoOgorCiskIGNkIE15LVJlcG8KKyQgc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLWRpcj0vdG1wL2RlcHMKKworVGhlICJ0b3AiIGRpciBpcyB0aGVuIC90bXAvZGVwcyAoTGludXggZmlsZXN5c3RlbSBleGFtcGxlKSBhbmQgaXMKK3doZXJlIHRoaXMgcHJvZ3JhbSB3aWxsIGNsb25lIGFuZCBidWlsZCB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcy4KKworSGVscGVyIENNYWtlIENvbmZpZyBGaWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB0aGUgcHJvZ3JhbSBmaW5pc2hlcyBidWlsZGluZyB0aGUgZGVwZW5kZW5jaWVzLCBpdCB3cml0ZXMgYSBmaWxlCituYW1lZCAiaGVscGVyLmNtYWtlIiB0byB0aGUgInRvcCIgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgQ01ha2UgY29tbWFuZHMKK2ZvciBzZXR0aW5nIENNYWtlIHZhcmlhYmxlcyBmb3IgbG9jYXRpbmcgdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMuCitUaGlzIGhlbHBlciBmaWxlIGNhbiBiZSB1c2VkIHRvIHNldCB1cCB0aGUgQ01ha2UgYnVpbGQgZmlsZXMgZm9yIHRoaXMKKyJob21lIiByZXBvc2l0b3J5LgorCitBIGNvbXBsZXRlIHNlcXVlbmNlIG1pZ2h0IGxvb2sgbGlrZToKKworJCBnaXQgY2xvbmUgZ2l0QGdpdGh1Yi5jb206TXktR3JvdXAvTXktUmVwby5naXQKKyQgY2QgTXktUmVwbworJCBta2RpciBidWlsZAorJCBjZCBidWlsZAorJCAuLi9zY3JpcHRzL3VwZGF0ZV9kZXBzLnB5CiskIGNtYWtlIC1DIGhlbHBlci5jbWFrZSAuLgorJCBjbWFrZSAtLWJ1aWxkIC4KKworSlNPTiBGaWxlIFNjaGVtYQorLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSdzIG5vIGZvcm1hbCBzY2hlbWEgZm9yIHRoZSAia25vd24tZ29vZCIgSlNPTiBmaWxlLCBidXQgaGVyZSBpcworYSBkZXNjcmlwdGlvbiBvZiBpdHMgZWxlbWVudHMuICBBbGwgZWxlbWVudHMgYXJlIHJlcXVpcmVkIGV4Y2VwdCB0aG9zZQorbWFya2VkIGFzIG9wdGlvbmFsLiAgUGxlYXNlIHNlZSB0aGUgImtub3duX2dvb2QuanNvbiIgZmlsZSBmb3IKK2V4YW1wbGVzIG9mIGFsbCBvZiB0aGVzZSBlbGVtZW50cy4KKworLSBuYW1lCisKK1RoZSBuYW1lIG9mIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yeS4gIFRoaXMgZmllbGQgY2FuIGJlIHJlZmVyZW5jZWQKK2J5IHRoZSAiZGVwcy5yZXBvX25hbWUiIHN0cnVjdHVyZSB0byByZWNvcmQgYSBkZXBlbmRlbmN5LgorCistIHVybAorCitTcGVjaWZpZXMgdGhlIFVSTCBvZiB0aGUgcmVwb3NpdG9yeS4KK0V4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLUxvYWRlci5naXQKKworLSBzdWJfZGlyCisKK1RoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHByb2dyYW0gY2xvbmVzIHRoZSByZXBvc2l0b3J5LCByZWxhdGl2ZSB0bwordGhlICJ0b3AiIGRpcmVjdG9yeS4KKworLSBidWlsZF9kaXIKKworVGhlIGRpcmVjdG9yeSB1c2VkIHRvIGJ1aWxkIHRoZSByZXBvc2l0b3J5LCByZWxhdGl2ZSB0byB0aGUgInRvcCIKK2RpcmVjdG9yeS4KKworLSBpbnN0YWxsX2RpcgorCitUaGUgZGlyZWN0b3J5IHVzZWQgdG8gc3RvcmUgdGhlIGluc3RhbGxlZCBidWlsZCBhcnRpZmFjdHMsIHJlbGF0aXZlCit0byB0aGUgInRvcCIgZGlyZWN0b3J5LgorCistIGNvbW1pdAorCitUaGUgY29tbWl0IHVzZWQgdG8gY2hlY2tvdXQgdGhlIHJlcG9zaXRvcnkuICBUaGlzIGNhbiBiZSBhIFNIQS0xCitvYmplY3QgbmFtZSBvciBhIHJlZm5hbWUgdXNlZCB3aXRoIHRoZSByZW1vdGUgbmFtZSAib3JpZ2luIi4KK0ZvciBleGFtcGxlLCB0aGlzIGZpZWxkIGNhbiBiZSBzZXQgdG8gIm9yaWdpbi9zZGstMS4xLjc3IiB0bworc2VsZWN0IHRoZSBlbmQgb2YgdGhlIHNkay0xLjEuNzcgYnJhbmNoLgorCistIGRlcHMgKG9wdGlvbmFsKQorCitBbiBhcnJheSBvZiBwYWlycyBjb25zaXN0aW5nIG9mIGEgQ01ha2UgdmFyaWFibGUgbmFtZSBhbmQgYQorcmVwb3NpdG9yeSBuYW1lIHRvIHNwZWNpZnkgYSBkZXBlbmRlbnQgcmVwbyBhbmQgYSAibGluayIgdG8KK3RoYXQgcmVwbydzIGluc3RhbGwgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGU6CisKKyJkZXBzIiA6IFsKKyAgICB7CisgICAgICAgICJ2YXJfbmFtZSIgOiAiVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVIiLAorICAgICAgICAicmVwb19uYW1lIiA6ICJWdWxrYW4tSGVhZGVycyIKKyAgICB9CitdCisKK3doaWNoIHJlcHJlc2VudHMgdGhhdCB0aGlzIHJlcG9zaXRvcnkgZGVwZW5kcyBvbiB0aGUgVnVsa2FuLUhlYWRlcnMKK3JlcG9zaXRvcnkgYW5kIHVzZXMgdGhlIFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSIENNYWtlIHZhcmlhYmxlIHRvCitzcGVjaWZ5IHRoZSBsb2NhdGlvbiB3aGVyZSBpdCBleHBlY3RzIHRvIGZpbmQgdGhlIFZ1bGthbi1IZWFkZXJzIGluc3RhbGwKK2RpcmVjdG9yeS4KK05vdGUgdGhhdCB0aGUgInJlcG9fbmFtZSIgZWxlbWVudCBtdXN0IG1hdGNoIHRoZSAibmFtZSIgZWxlbWVudCBvZiBzb21lCitvdGhlciByZXBvc2l0b3J5IGluIHRoZSBKU09OIGZpbGUuCisKKy0gcHJlYnVpbGQgKG9wdGlvbmFsKQorLSBwcmVidWlsZF9saW51eCAob3B0aW9uYWwpICAoRm9yIExpbnV4IGFuZCBNYWNPUykKKy0gcHJlYnVpbGRfd2luZG93cyAob3B0aW9uYWwpCisKK0EgbGlzdCBvZiBjb21tYW5kcyB0byBleGVjdXRlIGJlZm9yZSBidWlsZGluZyBhIGRlcGVuZGVudCByZXBvc2l0b3J5LgorVGhpcyBpcyB1c2VmdWwgZm9yIHJlcG9zaXRvcmllcyB0aGF0IHJlcXVpcmUgdGhlIGV4ZWN1dGlvbiBvZiBzb21lCitzb3J0IG9mICJ1cGRhdGUiIHNjcmlwdCBvciBuZWVkIHRvIGNsb25lIGFuIGF1eGlsbGFyeSByZXBvc2l0b3J5IGxpa2UKK2dvb2dsZXRlc3QuCisKK1RoZSBjb21tYW5kcyBsaXN0ZWQgaW4gInByZWJ1aWxkIiBhcmUgZXhlY3V0ZWQgZmlyc3QsIGFuZCB0aGVuIHRoZQorY29tbWFuZHMgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybSBhcmUgZXhlY3V0ZWQuCisKKy0gY3VzdG9tX2J1aWxkIChvcHRpb25hbCkKKworQSBsaXN0IG9mIGNvbW1hbmRzIHRvIGV4ZWN1dGUgYXMgYSBjdXN0b20gYnVpbGQgaW5zdGVhZCBvZiB1c2luZwordGhlIGJ1aWx0IGluIENNYWtlIHdheSBvZiBidWlsZGluZy4gUmVxdWlyZXMgImJ1aWxkX3N0ZXAiIHRvIGJlCitzZXQgdG8gImN1c3RvbSIKKworWW91IGNhbiBpbnNlcnQgdGhlIGZvbGxvd2luZyBrZXl3b3JkcyBpbnRvIHRoZSBjb21tYW5kcyBsaXN0ZWQgaW4KKyJjdXN0b21fYnVpbGQiIGlmIHRoZXkgcmVxdWlyZSBydW50aW1lIGluZm9ybWF0aW9uIChsaWtlIHdoZXRoZXIgdGhlCitidWlsZCBjb25maWcgaXMgIkRlYnVnIiBvciAiUmVsZWFzZSIpLgorCitLZXl3b3JkczoKK3swfSByZWZlcmVuY2UgdG8gYSBkaWN0aW9uYXJ5IG9mIHJlcG9zIGFuZCB0aGVpciBhdHRyaWJ1dGVzCit7MX0gcmVmZXJlbmNlIHRvIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHNldCBiZWZvcmUgc3RhcnQKK3syfSByZWZlcmVuY2UgdG8gdGhlIENPTkZJR19NQVAgdmFsdWUgb2YgY29uZmlnLgorCitFeGFtcGxlOgorezJ9IHJldHVybnMgdGhlIENPTkZJR19NQVAgdmFsdWUgb2YgY29uZmlnIGUuZy4gZGVidWcgLT4gRGVidWcKK3sxfS5jb25maWcgcmV0dXJucyB0aGUgY29uZmlnIHZhcmlhYmxlIHNldCB3aGVuIHlvdSByYW4gdXBkYXRlX2RlcC5weQorezB9W1Z1bGthbi1IZWFkZXJzXVtyZXBvX3Jvb3RdIHJldHVybnMgdGhlIHJlcG9fcm9vdCB2YXJpYWJsZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBWdWxrYW4tSGVhZGVycyBHb29kUmVwbyBvYmplY3QuCisKKy0gY21ha2Vfb3B0aW9ucyAob3B0aW9uYWwpCisKK0EgbGlzdCBvZiBvcHRpb25zIHRvIHBhc3MgdG8gQ01ha2UgZHVyaW5nIHRoZSBnZW5lcmF0aW9uIHBoYXNlLgorCistIGNpX29ubHkgKG9wdGlvbmFsKQorCitBIGxpc3Qgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdoZXJlIG9uZSBtdXN0IGJlIHNldCB0byAidHJ1ZSIKKyhjYXNlLWluc2Vuc2l0aXZlKSBpbiBvcmRlciBmb3IgdGhpcyByZXBvIHRvIGJlIGZldGNoZWQgYW5kIGJ1aWx0LgorVGhpcyBsaXN0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgcmVwb3MgdGhhdCBzaG91bGQgYmUgYnVpbHQgb25seSBpbiBDSS4KK1R5cGljYWxseSwgdGhpcyBsaXN0IG1pZ2h0IGNvbnRhaW4gIlRSQVZJUyIgYW5kL29yICJBUFBWRVlPUiIgYmVjYXVzZQorZWFjaCBvZiB0aGVzZSBDSSBzeXN0ZW1zIHNldHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBpdHMgb3duCituYW1lIHRvICJ0cnVlIi4gIE5vdGUgdGhhdCB0aGlzIGNvdWxkIGFsc28gYmUgKGFiKXVzZWQgdG8gY29udHJvbAordGhlIHByb2Nlc3Npbmcgb2YgdGhlIHJlcG8gd2l0aCBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGUuICBUaGUgZGVmYXVsdAoraXMgYW4gZW1wdHkgbGlzdCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVwbyBpcyBhbHdheXMgcHJvY2Vzc2VkLgorCistIGJ1aWxkX3N0ZXAgKG9wdGlvbmFsKQorCitTcGVjaWZpZXMgaWYgdGhlIGRlcGVuZGVudCByZXBvc2l0b3J5IHNob3VsZCBiZSBidWlsdCBvciBub3QuIFRoaXMgY2FuCitoYXZlIGEgdmFsdWUgb2YgJ2J1aWxkJywgJ2N1c3RvbScsICBvciAnc2tpcCcuIFRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzIGFyZQorYnVpbHQgYnkgZGVmYXVsdC4KKworLSBidWlsZF9wbGF0Zm9ybXMgKG9wdGlvbmFsKQorCitBIGxpc3Qgb2YgcGxhdGZvcm1zIHRoZSByZXBvc2l0b3J5IHdpbGwgYmUgYnVpbHQgb24uCitMZWdhbCBvcHRpb25zIGluY2x1ZGU6Cisid2luZG93cyIKKyJsaW51eCIKKyJkYXJ3aW4iCisKK0J1aWxkcyBvbiBhbGwgcGxhdGZvcm1zIGJ5IGRlZmF1bHQuCisKK05vdGUKKy0tLS0KKworVGhlICJzdWJfZGlyIiwgImJ1aWxkX2RpciIsIGFuZCAiaW5zdGFsbF9kaXIiIGVsZW1lbnRzIGFyZSBhbGwgcmVsYXRpdmUKK3RvIHRoZSBlZmZlY3RpdmUgInRvcCIgZGlyZWN0b3J5LiAgU3BlY2lmeWluZyBhYnNvbHV0ZSBwYXRocyBpcyBub3QKK3N1cHBvcnRlZC4gIEhvd2V2ZXIsIHRoZSAidG9wIiBkaXJlY3Rvcnkgc3BlY2lmaWVkIHdpdGggdGhlICItLWRpciIKK29wdGlvbiBjYW4gYmUgYSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoLgorCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBqc29uCitpbXBvcnQgZGlzdHV0aWxzLmRpcl91dGlsCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IHNobGV4CitpbXBvcnQgc2h1dGlsCisKK0tOT1dOX0dPT0RfRklMRV9OQU1FID0gJ2tub3duX2dvb2QuanNvbicKKworQ09ORklHX01BUCA9IHsKKyAgICAnZGVidWcnOiAnRGVidWcnLAorICAgICdyZWxlYXNlJzogJ1JlbGVhc2UnLAorICAgICdyZWx3aXRoZGViaW5mbyc6ICdSZWxXaXRoRGViSW5mbycsCisgICAgJ21pbnNpemVyZWwnOiAnTWluU2l6ZVJlbCcKK30KKworVkVSQk9TRSA9IEZhbHNlCisKK0RFVk5VTEwgPSBvcGVuKG9zLmRldm51bGwsICd3YicpCisKKworZGVmIGNvbW1hbmRfb3V0cHV0KGNtZCwgZGlyZWN0b3J5LCBmYWlsX29rPUZhbHNlKToKKyAgICAiIiJSdW5zIGEgY29tbWFuZCBpbiBhIGRpcmVjdG9yeSBhbmQgcmV0dXJucyBpdHMgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbS4KKworICAgIENhcHR1cmVzIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYW5kIHByaW50cyBpdCBpZiBlcnJvci4KKworICAgIFJhaXNlcyBhIFJ1bnRpbWVFcnJvciBpZiB0aGUgY29tbWFuZCBmYWlscyB0byBsYXVuY2ggb3Igb3RoZXJ3aXNlIGZhaWxzLgorICAgICIiIgorICAgIGlmIFZFUkJPU0U6CisgICAgICAgIHByaW50KCdJbiB7ZH06IHtjbWR9Jy5mb3JtYXQoZD1kaXJlY3RvcnksIGNtZD1jbWQpKQorICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICBjbWQsIGN3ZD1kaXJlY3RvcnksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgKHN0ZG91dCwgc3RkZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorICAgIGlmIHAucmV0dXJuY29kZSAhPSAwOgorICAgICAgICBwcmludCgnKioqIEVycm9yICoqKlxuc3RkZXJyIGNvbnRlbnRzOlxue30nLmZvcm1hdChzdGRlcnIpKQorICAgICAgICBpZiBub3QgZmFpbF9vazoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignRmFpbGVkIHRvIHJ1biB7fSBpbiB7fScuZm9ybWF0KGNtZCwgZGlyZWN0b3J5KSkKKyAgICBpZiBWRVJCT1NFOgorICAgICAgICBwcmludChzdGRvdXQpCisgICAgcmV0dXJuIHN0ZG91dAorCitjbGFzcyBHb29kUmVwbyhvYmplY3QpOgorICAgICIiIlJlcHJlc2VudHMgYSByZXBvc2l0b3J5IGF0IGEga25vd24tZ29vZCBjb21taXQuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwganNvbiwgYXJncyk6CisgICAgICAgICIiIkluaXRpYWxpemVzIHRoaXMgZ29vZCByZXBvIG9iamVjdC4KKworICAgICAgICBBcmdzOgorICAgICAgICAnanNvbic6ICBBIGZ1bGx5IHBvcHVsYXRlZCBKU09OIG9iamVjdCBkZXNjcmliaW5nIHRoZSByZXBvLgorICAgICAgICAnYXJncyc6ICBSZXN1bHRzIGZyb20gQXJndW1lbnRQYXJzZXIKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2pzb24gPSBqc29uCisgICAgICAgIHNlbGYuX2FyZ3MgPSBhcmdzCisgICAgICAgICMgUmVxdWlyZWQgSlNPTiBlbGVtZW50cworICAgICAgICBzZWxmLm5hbWUgPSBqc29uWyduYW1lJ10KKyAgICAgICAgc2VsZi51cmwgPSBqc29uWyd1cmwnXQorICAgICAgICBzZWxmLnN1Yl9kaXIgPSBqc29uWydzdWJfZGlyJ10KKyAgICAgICAgc2VsZi5jb21taXQgPSBqc29uWydjb21taXQnXQorICAgICAgICAjIE9wdGlvbmFsIEpTT04gZWxlbWVudHMKKyAgICAgICAgc2VsZi5idWlsZF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCisgICAgICAgIGlmIGpzb24uZ2V0KCdidWlsZF9kaXInKToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZGlyID0gb3MucGF0aC5ub3JtcGF0aChqc29uWydidWlsZF9kaXInXSkKKyAgICAgICAgaWYganNvbi5nZXQoJ2luc3RhbGxfZGlyJyk6CisgICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gb3MucGF0aC5ub3JtcGF0aChqc29uWydpbnN0YWxsX2RpciddKQorICAgICAgICBzZWxmLmRlcHMgPSBqc29uWydkZXBzJ10gaWYgKCdkZXBzJyBpbiBqc29uKSBlbHNlIFtdCisgICAgICAgIHNlbGYucHJlYnVpbGQgPSBqc29uWydwcmVidWlsZCddIGlmICgncHJlYnVpbGQnIGluIGpzb24pIGVsc2UgW10KKyAgICAgICAgc2VsZi5wcmVidWlsZF9saW51eCA9IGpzb25bJ3ByZWJ1aWxkX2xpbnV4J10gaWYgKAorICAgICAgICAgICAgJ3ByZWJ1aWxkX2xpbnV4JyBpbiBqc29uKSBlbHNlIFtdCisgICAgICAgIHNlbGYucHJlYnVpbGRfd2luZG93cyA9IGpzb25bJ3ByZWJ1aWxkX3dpbmRvd3MnXSBpZiAoCisgICAgICAgICAgICAncHJlYnVpbGRfd2luZG93cycgaW4ganNvbikgZWxzZSBbXQorICAgICAgICBzZWxmLmN1c3RvbV9idWlsZCA9IGpzb25bJ2N1c3RvbV9idWlsZCddIGlmICgnY3VzdG9tX2J1aWxkJyBpbiBqc29uKSBlbHNlIFtdCisgICAgICAgIHNlbGYuY21ha2Vfb3B0aW9ucyA9IGpzb25bJ2NtYWtlX29wdGlvbnMnXSBpZiAoCisgICAgICAgICAgICAnY21ha2Vfb3B0aW9ucycgaW4ganNvbikgZWxzZSBbXQorICAgICAgICBzZWxmLmNpX29ubHkgPSBqc29uWydjaV9vbmx5J10gaWYgKCdjaV9vbmx5JyBpbiBqc29uKSBlbHNlIFtdCisgICAgICAgIHNlbGYuYnVpbGRfc3RlcCA9IGpzb25bJ2J1aWxkX3N0ZXAnXSBpZiAoJ2J1aWxkX3N0ZXAnIGluIGpzb24pIGVsc2UgJ2J1aWxkJworICAgICAgICBzZWxmLmJ1aWxkX3BsYXRmb3JtcyA9IGpzb25bJ2J1aWxkX3BsYXRmb3JtcyddIGlmICgnYnVpbGRfcGxhdGZvcm1zJyBpbiBqc29uKSBlbHNlIFtdCisgICAgICAgICMgQWJzb2x1dGUgcGF0aHMgZm9yIGEgcmVwbydzIGRpcmVjdG9yaWVzCisgICAgICAgIGRpcl90b3AgPSBvcy5wYXRoLmFic3BhdGgoYXJncy5kaXIpCisgICAgICAgIHNlbGYucmVwb19kaXIgPSBvcy5wYXRoLmpvaW4oZGlyX3RvcCwgc2VsZi5zdWJfZGlyKQorICAgICAgICBpZiBzZWxmLmJ1aWxkX2RpcjoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZGlyID0gb3MucGF0aC5qb2luKGRpcl90b3AsIHNlbGYuYnVpbGRfZGlyKQorICAgICAgICBpZiBzZWxmLmluc3RhbGxfZGlyOgorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IG9zLnBhdGguam9pbihkaXJfdG9wLCBzZWxmLmluc3RhbGxfZGlyKQorCSAgICAjIENoZWNrIGlmIHBsYXRmb3JtIGlzIG9uZSB0byBidWlsZCBvbgorICAgICAgICBzZWxmLm9uX2J1aWxkX3BsYXRmb3JtID0gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5idWlsZF9wbGF0Zm9ybXMgPT0gW10gb3IgcGxhdGZvcm0uc3lzdGVtKCkubG93ZXIoKSBpbiBzZWxmLmJ1aWxkX3BsYXRmb3JtczoKKyAgICAgICAgICAgIHNlbGYub25fYnVpbGRfcGxhdGZvcm0gPSBUcnVlCisKKyAgICBkZWYgQ2xvbmUoc2VsZik6CisgICAgICAgIGRpc3R1dGlscy5kaXJfdXRpbC5ta3BhdGgoc2VsZi5yZXBvX2RpcikKKyAgICAgICAgY29tbWFuZF9vdXRwdXQoWydnaXQnLCAnY2xvbmUnLCBzZWxmLnVybCwgJy4nXSwgc2VsZi5yZXBvX2RpcikKKworICAgIGRlZiBGZXRjaChzZWxmKToKKyAgICAgICAgY29tbWFuZF9vdXRwdXQoWydnaXQnLCAnZmV0Y2gnLCAnb3JpZ2luJ10sIHNlbGYucmVwb19kaXIpCisKKyAgICBkZWYgQ2hlY2tvdXQoc2VsZik6CisgICAgICAgIHByaW50KCdDaGVja2luZyBvdXQge259IGluIHtkfScuZm9ybWF0KG49c2VsZi5uYW1lLCBkPXNlbGYucmVwb19kaXIpKQorICAgICAgICBpZiBzZWxmLl9hcmdzLmRvX2NsZWFuX3JlcG86CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYucmVwb19kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLnJlcG9fZGlyLCAnLmdpdCcpKToKKyAgICAgICAgICAgIHNlbGYuQ2xvbmUoKQorICAgICAgICBzZWxmLkZldGNoKCkKKyAgICAgICAgaWYgbGVuKHNlbGYuX2FyZ3MucmVmKToKKyAgICAgICAgICAgIGNvbW1hbmRfb3V0cHV0KFsnZ2l0JywgJ2NoZWNrb3V0Jywgc2VsZi5fYXJncy5yZWZdLCBzZWxmLnJlcG9fZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tbWFuZF9vdXRwdXQoWydnaXQnLCAnY2hlY2tvdXQnLCBzZWxmLmNvbW1pdF0sIHNlbGYucmVwb19kaXIpCisgICAgICAgIHByaW50KGNvbW1hbmRfb3V0cHV0KFsnZ2l0JywgJ3N0YXR1cyddLCBzZWxmLnJlcG9fZGlyKSkKKworICAgIGRlZiBDdXN0b21QcmVQcm9jZXNzKHNlbGYsIGNtZF9zdHIsIHJlcG9fZGljdCk6CisgICAgICAgIHJldHVybiBjbWRfc3RyLmZvcm1hdChyZXBvX2RpY3QsIHNlbGYuX2FyZ3MsIENPTkZJR19NQVBbc2VsZi5fYXJncy5jb25maWddKQorCisgICAgZGVmIFByZUJ1aWxkKHNlbGYpOgorICAgICAgICAiIiJFeGVjdXRlIGFueSBwcmVidWlsZCBzdGVwcyBmcm9tIHRoZSByZXBvIHJvb3QiIiIKKyAgICAgICAgZm9yIHAgaW4gc2VsZi5wcmVidWlsZDoKKyAgICAgICAgICAgIGNvbW1hbmRfb3V0cHV0KHNobGV4LnNwbGl0KHApLCBzZWxmLnJlcG9fZGlyKQorICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnTGludXgnIG9yIHBsYXRmb3JtLnN5c3RlbSgpID09ICdEYXJ3aW4nOgorICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5wcmVidWlsZF9saW51eDoKKyAgICAgICAgICAgICAgICBjb21tYW5kX291dHB1dChzaGxleC5zcGxpdChwKSwgc2VsZi5yZXBvX2RpcikKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5wcmVidWlsZF93aW5kb3dzOgorICAgICAgICAgICAgICAgIGNvbW1hbmRfb3V0cHV0KHNobGV4LnNwbGl0KHApLCBzZWxmLnJlcG9fZGlyKQorCisgICAgZGVmIEN1c3RvbUJ1aWxkKHNlbGYsIHJlcG9fZGljdCk6CisgICAgICAgICIiIkV4ZWN1dGUgYW55IGN1c3RvbV9idWlsZCBzdGVwcyBmcm9tIHRoZSByZXBvIHJvb3QiIiIKKyAgICAgICAgZm9yIHAgaW4gc2VsZi5jdXN0b21fYnVpbGQ6CisgICAgICAgICAgICBjbWQgPSBzZWxmLkN1c3RvbVByZVByb2Nlc3MocCwgcmVwb19kaWN0KQorICAgICAgICAgICAgY29tbWFuZF9vdXRwdXQoc2hsZXguc3BsaXQoY21kKSwgc2VsZi5yZXBvX2RpcikKKworICAgIGRlZiBDTWFrZUNvbmZpZyhzZWxmLCByZXBvcyk6CisgICAgICAgICIiIkJ1aWxkIENNYWtlIGNvbW1hbmQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHBoYXNlIGFuZCBleGVjdXRlIGl0IiIiCisgICAgICAgIGlmIHNlbGYuX2FyZ3MuZG9fY2xlYW5fYnVpbGQ6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuYnVpbGRfZGlyKQorICAgICAgICBpZiBzZWxmLl9hcmdzLmRvX2NsZWFuX2luc3RhbGw6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuaW5zdGFsbF9kaXIpCisKKyAgICAgICAgIyBDcmVhdGUgYW5kIGNoYW5nZSB0byBidWlsZCBkaXJlY3RvcnkKKyAgICAgICAgZGlzdHV0aWxzLmRpcl91dGlsLm1rcGF0aChzZWxmLmJ1aWxkX2RpcikKKyAgICAgICAgb3MuY2hkaXIoc2VsZi5idWlsZF9kaXIpCisKKyAgICAgICAgY21ha2VfY21kID0gWworICAgICAgICAgICAgJ2NtYWtlJywgc2VsZi5yZXBvX2RpciwKKyAgICAgICAgICAgICctRENNQUtFX0lOU1RBTExfUFJFRklYPScgKyBzZWxmLmluc3RhbGxfZGlyCisgICAgICAgIF0KKworICAgICAgICAjIEZvciBlYWNoIHJlcG8gdGhpcyByZXBvIGRlcGVuZHMgb24sIGdlbmVyYXRlIGEgQ01ha2UgdmFyaWFibGUKKyAgICAgICAgIyBkZWZpbml0aW9ucyBmb3IgIi4uLklOU1RBTExfRElSIiB0aGF0IHBvaW50cyB0byB0aGF0IGRlcGVuZGVudAorICAgICAgICAjIHJlcG8ncyBpbnN0YWxsIGRpci4KKyAgICAgICAgZm9yIGQgaW4gc2VsZi5kZXBzOgorICAgICAgICAgICAgZGVwX2NvbW1pdCA9IFtyIGZvciByIGluIHJlcG9zIGlmIHIubmFtZSA9PSBkWydyZXBvX25hbWUnXV0KKyAgICAgICAgICAgIGlmIGxlbihkZXBfY29tbWl0KToKKyAgICAgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCctRHt2YXJfbmFtZX09e2luc3RhbGxfZGlyfScuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZT1kWyd2YXJfbmFtZSddLAorICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX2Rpcj1kZXBfY29tbWl0WzBdLmluc3RhbGxfZGlyKSkKKworICAgICAgICAjIEFkZCBhbnkgQ01ha2Ugb3B0aW9ucworICAgICAgICBmb3Igb3B0aW9uIGluIHNlbGYuY21ha2Vfb3B0aW9uczoKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQob3B0aW9uKQorCisgICAgICAgICMgU2V0IGJ1aWxkIGNvbmZpZyBmb3Igc2luZ2xlLWNvbmZpZ3VyYXRpb24gZ2VuZXJhdG9ycworICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnTGludXgnIG9yIHBsYXRmb3JtLnN5c3RlbSgpID09ICdEYXJ3aW4nOgorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnLURDTUFLRV9CVUlMRF9UWVBFPXtjb25maWd9Jy5mb3JtYXQoCisgICAgICAgICAgICAgICAgY29uZmlnPUNPTkZJR19NQVBbc2VsZi5fYXJncy5jb25maWddKSkKKworICAgICAgICAjIFVzZSB0aGUgQ01ha2UgLUEgb3B0aW9uIHRvIHNlbGVjdCB0aGUgcGxhdGZvcm0gYXJjaGl0ZWN0dXJlCisgICAgICAgICMgd2l0aG91dCBuZWVkaW5nIGEgVmlzdWFsIFN0dWRpbyBnZW5lcmF0b3IuCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIGlmIHNlbGYuX2FyZ3MuYXJjaCA9PSAnNjQnIG9yIHNlbGYuX2FyZ3MuYXJjaCA9PSAneDY0JyBvciBzZWxmLl9hcmdzLmFyY2ggPT0gJ3dpbjY0JzoKKyAgICAgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCctQScpCisgICAgICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgneDY0JykKKworICAgICAgICAjIEFwcGx5IGEgZ2VuZXJhdG9yLCBpZiBvbmUgaXMgc3BlY2lmaWVkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzdXBwbHkKKyAgICAgICAgIyBhIHNwZWNpZmljIGdlbmVyYXRvciBmb3IgdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgdG8gbWF0Y2gKKyAgICAgICAgIyB0aGF0IG9mIHRoZSBtYWluIHJlcG9zaXRvcnkuCisgICAgICAgIGlmIHNlbGYuX2FyZ3MuZ2VuZXJhdG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY21ha2VfY21kLmV4dGVuZChbJy1HJywgc2VsZi5fYXJncy5nZW5lcmF0b3JdKQorCisgICAgICAgIGlmIFZFUkJPU0U6CisgICAgICAgICAgICBwcmludCgiQ01ha2UgY29tbWFuZDogIiArICIgIi5qb2luKGNtYWtlX2NtZCkpCisKKyAgICAgICAgcmV0X2NvZGUgPSBzdWJwcm9jZXNzLmNhbGwoY21ha2VfY21kKQorICAgICAgICBpZiByZXRfY29kZSAhPSAwOgorICAgICAgICAgICAgc3lzLmV4aXQocmV0X2NvZGUpCisKKyAgICBkZWYgQ01ha2VCdWlsZChzZWxmKToKKyAgICAgICAgIiIiQnVpbGQgQ01ha2UgY29tbWFuZCBmb3IgdGhlIGJ1aWxkIHBoYXNlIGFuZCBleGVjdXRlIGl0IiIiCisgICAgICAgIGNtYWtlX2NtZCA9IFsnY21ha2UnLCAnLS1idWlsZCcsIHNlbGYuYnVpbGRfZGlyLCAnLS10YXJnZXQnLCAnaW5zdGFsbCddCisgICAgICAgIGlmIHNlbGYuX2FyZ3MuZG9fY2xlYW46CisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCctLWNsZWFuLWZpcnN0JykKKworICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCctLWNvbmZpZycpCisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKENPTkZJR19NQVBbc2VsZi5fYXJncy5jb25maWddKQorCisgICAgICAgICMgU3BlZWQgdXAgdGhlIGJ1aWxkLgorICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnTGludXgnIG9yIHBsYXRmb3JtLnN5c3RlbSgpID09ICdEYXJ3aW4nOgorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnLS0nKQorICAgICAgICAgICAgbnVtX21ha2Vfam9icyA9IG11bHRpcHJvY2Vzc2luZy5jcHVfY291bnQoKQorICAgICAgICAgICAgZW52X21ha2Vfam9icyA9IG9zLmVudmlyb24uZ2V0KCdNQUtFX0pPQlMnLCBOb25lKQorICAgICAgICAgICAgaWYgZW52X21ha2Vfam9icyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG51bV9tYWtlX2pvYnMgPSBtaW4obnVtX21ha2Vfam9icywgaW50KGVudl9tYWtlX2pvYnMpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCgnd2FybmluZzogZW52aXJvbm1lbnQgdmFyaWFibGUgTUFLRV9KT0JTIGhhcyBub24tbnVtZXJpYyB2YWx1ZSAie30iLiAgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNpbmcge30gKENQVSBjb3VudCkgaW5zdGVhZC4nLmZvcm1hdChlbnZfbWFrZV9qb2JzLCBudW1fbWFrZV9qb2JzKSkKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy1qe30nLmZvcm1hdChudW1fbWFrZV9qb2JzKSkKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnLS0nKQorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnL21heGNwdWNvdW50JykKKworICAgICAgICBpZiBWRVJCT1NFOgorICAgICAgICAgICAgcHJpbnQoIkNNYWtlIGNvbW1hbmQ6ICIgKyAiICIuam9pbihjbWFrZV9jbWQpKQorCisgICAgICAgIHJldF9jb2RlID0gc3VicHJvY2Vzcy5jYWxsKGNtYWtlX2NtZCkKKyAgICAgICAgaWYgcmV0X2NvZGUgIT0gMDoKKyAgICAgICAgICAgIHN5cy5leGl0KHJldF9jb2RlKQorCisgICAgZGVmIEJ1aWxkKHNlbGYsIHJlcG9zLCByZXBvX2RpY3QpOgorICAgICAgICAiIiJCdWlsZCB0aGUgZGVwZW5kZW50IHJlcG8iIiIKKyAgICAgICAgcHJpbnQoJ0J1aWxkaW5nIHtufSBpbiB7ZH0nLmZvcm1hdChuPXNlbGYubmFtZSwgZD1zZWxmLnJlcG9fZGlyKSkKKyAgICAgICAgcHJpbnQoJ0J1aWxkIGRpciA9IHtifScuZm9ybWF0KGI9c2VsZi5idWlsZF9kaXIpKQorICAgICAgICBwcmludCgnSW5zdGFsbCBkaXIgPSB7aX1cbicuZm9ybWF0KGk9c2VsZi5pbnN0YWxsX2RpcikpCisKKyAgICAgICAgIyBSdW4gYW55IHByZWJ1aWxkIGNvbW1hbmRzCisgICAgICAgIHNlbGYuUHJlQnVpbGQoKQorCisgICAgICAgIGlmIHNlbGYuYnVpbGRfc3RlcCA9PSAnY3VzdG9tJzoKKyAgICAgICAgICAgIHNlbGYuQ3VzdG9tQnVpbGQocmVwb19kaWN0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBCdWlsZCBhbmQgZXhlY3V0ZSBDTWFrZSBjb21tYW5kIGZvciBjcmVhdGluZyBidWlsZCBmaWxlcworICAgICAgICBzZWxmLkNNYWtlQ29uZmlnKHJlcG9zKQorCisgICAgICAgICMgQnVpbGQgYW5kIGV4ZWN1dGUgQ01ha2UgY29tbWFuZCBmb3IgdGhlIGJ1aWxkCisgICAgICAgIHNlbGYuQ01ha2VCdWlsZCgpCisKKworZGVmIEdldEdvb2RSZXBvcyhhcmdzKToKKyAgICAiIiJSZXR1cm5zIHRoZSBsYXRlc3QgbGlzdCBvZiBHb29kUmVwbyBvYmplY3RzLgorCisgICAgVGhlIGtub3duLWdvb2QgZmlsZSBpcyBleHBlY3RlZCB0byBiZSBpbiB0aGUgc2FtZQorICAgIGRpcmVjdG9yeSBhcyB0aGlzIHNjcmlwdCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSB0aGUgJ2tub3duX2dvb2RfZGlyJworICAgIHBhcmFtZXRlci4KKyAgICAiIiIKKyAgICBpZiBhcmdzLmtub3duX2dvb2RfZGlyOgorICAgICAgICBrbm93bl9nb29kX2ZpbGUgPSBvcy5wYXRoLmpvaW4oIG9zLnBhdGguYWJzcGF0aChhcmdzLmtub3duX2dvb2RfZGlyKSwKKyAgICAgICAgICAgIEtOT1dOX0dPT0RfRklMRV9OQU1FKQorICAgIGVsc2U6CisgICAgICAgIGtub3duX2dvb2RfZmlsZSA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgS05PV05fR09PRF9GSUxFX05BTUUpCisgICAgd2l0aCBvcGVuKGtub3duX2dvb2RfZmlsZSkgYXMga25vd25fZ29vZDoKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgIEdvb2RSZXBvKHJlcG8sIGFyZ3MpCisgICAgICAgICAgICBmb3IgcmVwbyBpbiBqc29uLmxvYWRzKGtub3duX2dvb2QucmVhZCgpKVsncmVwb3MnXQorICAgICAgICBdCisKKworZGVmIEdldEluc3RhbGxOYW1lcyhhcmdzKToKKyAgICAiIiJSZXR1cm5zIHRoZSBpbnN0YWxsIG5hbWVzIGxpc3QuCisKKyAgICBUaGUga25vd24tZ29vZCBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBzYW1lCisgICAgZGlyZWN0b3J5IGFzIHRoaXMgc2NyaXB0IHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSAna25vd25fZ29vZF9kaXInCisgICAgcGFyYW1ldGVyLgorICAgICIiIgorICAgIGlmIGFyZ3Mua25vd25fZ29vZF9kaXI6CisgICAgICAgIGtub3duX2dvb2RfZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgoYXJncy5rbm93bl9nb29kX2RpciksCisgICAgICAgICAgICBLTk9XTl9HT09EX0ZJTEVfTkFNRSkKKyAgICBlbHNlOgorICAgICAgICBrbm93bl9nb29kX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksIEtOT1dOX0dPT0RfRklMRV9OQU1FKQorICAgIHdpdGggb3Blbihrbm93bl9nb29kX2ZpbGUpIGFzIGtub3duX2dvb2Q6CisgICAgICAgIGluc3RhbGxfaW5mbyA9IGpzb24ubG9hZHMoa25vd25fZ29vZC5yZWFkKCkpCisgICAgICAgIGlmIGluc3RhbGxfaW5mby5nZXQoJ2luc3RhbGxfbmFtZXMnKToKKyAgICAgICAgICAgIHJldHVybiBpbnN0YWxsX2luZm9bJ2luc3RhbGxfbmFtZXMnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworCitkZWYgQ3JlYXRlSGVscGVyKGFyZ3MsIHJlcG9zLCBmaWxlbmFtZSk6CisgICAgIiIiQ3JlYXRlIGEgQ01ha2UgY29uZmlnIGhlbHBlciBmaWxlLgorCisgICAgVGhlIGhlbHBlciBmaWxlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCAnY21ha2UgLUMgPGZpbGU+JworICAgIHRvIGJ1aWxkIHRoaXMgaG9tZSByZXBvIHVzaW5nIHRoZSBkZXBlbmRlbmNpZXMgYnVpbHQgYnkgdGhpcyBzY3JpcHQuCisKKyAgICBUaGUgaW5zdGFsbF9uYW1lcyBkaWN0aW9uYXJ5IHJlcHJlc2VudHMgdGhlIENNYWtlIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZQorICAgIGhvbWUgcmVwbyB0byBsb2NhdGUgdGhlIGluc3RhbGwgZGlycyBvZiB0aGUgZGVwZW5kZW50IHJlcG9zLgorICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgYmFrZWQgaW50byB0aGUgQ01ha2UgZmlsZXMgb2YgdGhlIGhvbWUgcmVwbyBhbmQgc28KKyAgICB0aGlzIGRpY3Rpb25hcnkgaXMga2VwdCB3aXRoIHRoZSByZXBvIHZpYSB0aGUganNvbiBmaWxlLgorICAgICIiIgorICAgIGRlZiBlc2NhcGUocGF0aCk6CisgICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJ1xcJywgJ1xcXFwnKQorICAgIGluc3RhbGxfbmFtZXMgPSBHZXRJbnN0YWxsTmFtZXMoYXJncykKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgaGVscGVyX2ZpbGU6CisgICAgICAgIGZvciByZXBvIGluIHJlcG9zOgorICAgICAgICAgICAgaWYgaW5zdGFsbF9uYW1lcyBhbmQgcmVwby5uYW1lIGluIGluc3RhbGxfbmFtZXMgYW5kIHJlcG8ub25fYnVpbGRfcGxhdGZvcm06CisgICAgICAgICAgICAgICAgaGVscGVyX2ZpbGUud3JpdGUoJ3NldCh7dmFyfSAie2Rpcn0iIENBQ0hFIFNUUklORyAiIiBGT1JDRSlcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXI9aW5zdGFsbF9uYW1lc1tyZXBvLm5hbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9ZXNjYXBlKHJlcG8uaW5zdGFsbF9kaXIpKSkKKworCitkZWYgbWFpbigpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAorICAgICAgICBkZXNjcmlwdGlvbj0nR2V0IGFuZCBidWlsZCBkZXBlbmRlbnQgcmVwb3MgYXQga25vd24tZ29vZCBjb21taXRzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1rbm93bl9nb29kX2RpcicsCisgICAgICAgIGRlc3Q9J2tub3duX2dvb2RfZGlyJywKKyAgICAgICAgaGVscD0iU3BlY2lmeSBkaXJlY3RvcnkgZm9yIGtub3duX2dvb2QuanNvbiBmaWxlLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tZGlyJywKKyAgICAgICAgZGVzdD0nZGlyJywKKyAgICAgICAgZGVmYXVsdD0nLicsCisgICAgICAgIGhlbHA9IlNldCB0YXJnZXQgZGlyZWN0b3J5IGZvciByZXBvc2l0b3J5IHJvb3RzLiBEZWZhdWx0IGlzIFwnLlwnLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tcmVmJywKKyAgICAgICAgZGVzdD0ncmVmJywKKyAgICAgICAgZGVmYXVsdD0nJywKKyAgICAgICAgaGVscD0iT3ZlcnJpZGUgJ2NvbW1pdCcgd2l0aCBnaXQgcmVmZXJlbmNlLiBFLmcuLCAnb3JpZ2luL21hc3RlciciKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLW5vLWJ1aWxkJywKKyAgICAgICAgZGVzdD0nZG9fYnVpbGQnLAorICAgICAgICBhY3Rpb249J3N0b3JlX2ZhbHNlJywKKyAgICAgICAgaGVscD0KKyAgICAgICAgIkNsb25lL3VwZGF0ZSByZXBvc2l0b3JpZXMgYW5kIGdlbmVyYXRlIGJ1aWxkIGZpbGVzIHdpdGhvdXQgcGVyZm9ybWluZyBjb21waWxhdGlvbiIsCisgICAgICAgIGRlZmF1bHQ9VHJ1ZSkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1jbGVhbicsCisgICAgICAgIGRlc3Q9J2RvX2NsZWFuJywKKyAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgaGVscD0iQ2xlYW4gZmlsZXMgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVyIGFuZCBsaW5rZXIgYmVmb3JlIGJ1aWxkaW5nIiwKKyAgICAgICAgZGVmYXVsdD1GYWxzZSkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1jbGVhbi1yZXBvJywKKyAgICAgICAgZGVzdD0nZG9fY2xlYW5fcmVwbycsCisgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgIGhlbHA9IkRlbGV0ZSByZXBvc2l0b3J5IGRpcmVjdG9yeSBiZWZvcmUgYnVpbGRpbmciLAorICAgICAgICBkZWZhdWx0PUZhbHNlKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWNsZWFuLWJ1aWxkJywKKyAgICAgICAgZGVzdD0nZG9fY2xlYW5fYnVpbGQnLAorICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICBoZWxwPSJEZWxldGUgYnVpbGQgZGlyZWN0b3J5IGJlZm9yZSBidWlsZGluZyIsCisgICAgICAgIGRlZmF1bHQ9RmFsc2UpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tY2xlYW4taW5zdGFsbCcsCisgICAgICAgIGRlc3Q9J2RvX2NsZWFuX2luc3RhbGwnLAorICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICBoZWxwPSJEZWxldGUgaW5zdGFsbCBkaXJlY3RvcnkgYmVmb3JlIGJ1aWxkaW5nIiwKKyAgICAgICAgZGVmYXVsdD1GYWxzZSkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1hcmNoJywKKyAgICAgICAgZGVzdD0nYXJjaCcsCisgICAgICAgIGNob2ljZXM9WyczMicsICc2NCcsICd4ODYnLCAneDY0JywgJ3dpbjMyJywgJ3dpbjY0J10sCisgICAgICAgIHR5cGU9c3RyLmxvd2VyLAorICAgICAgICBoZWxwPSJTZXQgYnVpbGQgZmlsZXMgYXJjaGl0ZWN0dXJlIChXaW5kb3dzKSIsCisgICAgICAgIGRlZmF1bHQ9JzY0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1jb25maWcnLAorICAgICAgICBkZXN0PSdjb25maWcnLAorICAgICAgICBjaG9pY2VzPVsnZGVidWcnLCAncmVsZWFzZScsICdyZWx3aXRoZGViaW5mbycsICdtaW5zaXplcmVsJ10sCisgICAgICAgIHR5cGU9c3RyLmxvd2VyLAorICAgICAgICBoZWxwPSJTZXQgYnVpbGQgZmlsZXMgY29uZmlndXJhdGlvbiIsCisgICAgICAgIGRlZmF1bHQ9J2RlYnVnJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1nZW5lcmF0b3InLAorICAgICAgICBkZXN0PSdnZW5lcmF0b3InLAorICAgICAgICBoZWxwPSJTZXQgdGhlIENNYWtlIGdlbmVyYXRvciIsCisgICAgICAgIGRlZmF1bHQ9Tm9uZSkKKworICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAgc2F2ZV9jd2QgPSBvcy5nZXRjd2QoKQorCisgICAgIyBDcmVhdGUgd29ya2luZyAidG9wIiBkaXJlY3RvcnkgaWYgbmVlZGVkCisgICAgZGlzdHV0aWxzLmRpcl91dGlsLm1rcGF0aChhcmdzLmRpcikKKyAgICBhYnNfdG9wX2RpciA9IG9zLnBhdGguYWJzcGF0aChhcmdzLmRpcikKKworICAgIHJlcG9zID0gR2V0R29vZFJlcG9zKGFyZ3MpCisgICAgcmVwb19kaWN0ID0ge30KKworICAgIHByaW50KCdTdGFydGluZyBidWlsZHMgaW4ge2R9Jy5mb3JtYXQoZD1hYnNfdG9wX2RpcikpCisgICAgZm9yIHJlcG8gaW4gcmVwb3M6CisgICAgICAgICMgSWYgdGhlIHJlcG8gaGFzIGEgcGxhdGZvcm0gd2hpdGVsaXN0LCBza2lwIHRoZSByZXBvCisgICAgICAgICMgdW5sZXNzIHdlIGFyZSBidWlsZGluZyBvbiBhIHdoaXRlbGlzdGVkIHBsYXRmb3JtLgorICAgICAgICBpZiBub3QgcmVwby5vbl9idWlsZF9wbGF0Zm9ybToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZmllbGRfbGlzdCA9ICgndXJsJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3ViX2RpcicsCisgICAgICAgICAgICAgICAgICAgICAgJ2NvbW1pdCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX2RpcicsCisgICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbGxfZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAnZGVwcycsCisgICAgICAgICAgICAgICAgICAgICAgJ3ByZWJ1aWxkJywKKyAgICAgICAgICAgICAgICAgICAgICAncHJlYnVpbGRfbGludXgnLAorICAgICAgICAgICAgICAgICAgICAgICdwcmVidWlsZF93aW5kb3dzJywKKyAgICAgICAgICAgICAgICAgICAgICAnY3VzdG9tX2J1aWxkJywKKyAgICAgICAgICAgICAgICAgICAgICAnY21ha2Vfb3B0aW9ucycsCisgICAgICAgICAgICAgICAgICAgICAgJ2NpX29ubHknLAorICAgICAgICAgICAgICAgICAgICAgICdidWlsZF9zdGVwJywKKyAgICAgICAgICAgICAgICAgICAgICAnYnVpbGRfcGxhdGZvcm1zJywKKyAgICAgICAgICAgICAgICAgICAgICAncmVwb19kaXInLAorICAgICAgICAgICAgICAgICAgICAgICdvbl9idWlsZF9wbGF0Zm9ybScpCisgICAgICAgIHJlcG9fZGljdFtyZXBvLm5hbWVdID0ge2ZpZWxkOiBnZXRhdHRyKHJlcG8sIGZpZWxkKSBmb3IgZmllbGQgaW4gZmllbGRfbGlzdH0KKworICAgICAgICAjIElmIHRoZSByZXBvIGhhcyBhIENJIHdoaXRlbGlzdCwgc2tpcCB0aGUgcmVwbyB1bmxlc3MKKyAgICAgICAgIyBvbmUgb2YgdGhlIENJJ3MgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIHRydWUuCisgICAgICAgIGlmIGxlbihyZXBvLmNpX29ubHkpOgorICAgICAgICAgICAgZG9fYnVpbGQgPSBGYWxzZQorICAgICAgICAgICAgZm9yIGVudiBpbiByZXBvLmNpX29ubHk6CisgICAgICAgICAgICAgICAgaWYgbm90IGVudiBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG9zLmVudmlyb25bZW52XS5sb3dlcigpID09ICd0cnVlJzoKKyAgICAgICAgICAgICAgICAgICAgZG9fYnVpbGQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3QgZG9fYnVpbGQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAjIENsb25lL3VwZGF0ZSB0aGUgcmVwb3NpdG9yeQorICAgICAgICByZXBvLkNoZWNrb3V0KCkKKworICAgICAgICAjIEJ1aWxkIHRoZSByZXBvc2l0b3J5CisgICAgICAgIGlmIGFyZ3MuZG9fYnVpbGQgYW5kIHJlcG8uYnVpbGRfc3RlcCAhPSAnc2tpcCc6CisgICAgICAgICAgICByZXBvLkJ1aWxkKHJlcG9zLCByZXBvX2RpY3QpCisKKyAgICAjIE5lZWQgdG8gcmVzdG9yZSBvcmlnaW5hbCBjd2QgaW4gb3JkZXIgZm9yIENyZWF0ZUhlbHBlciB0byBmaW5kIGpzb24gZmlsZQorICAgIG9zLmNoZGlyKHNhdmVfY3dkKQorICAgIENyZWF0ZUhlbHBlcihhcmdzLCByZXBvcywgb3MucGF0aC5qb2luKGFic190b3BfZGlyLCAnaGVscGVyLmNtYWtlJykpCisKKyAgICBzeXMuZXhpdCgwKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvQ01ha2VMaXN0cy50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3YmMxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzNiBAQAorIyB+fn4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIH5+fgorCithZGRfZXhlY3V0YWJsZSh2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyBsb2FkZXJfdmFsaWRhdGlvbl90ZXN0cy5jcHApCithZGRfdGVzdChOQU1FIHZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIENPTU1BTkQgdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyBQUk9QRVJUSUVTIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWT0xIikKK2lmKFVOSVgpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLVduby1zaWduLWNvbXBhcmUiKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgICB0YXJnZXRfY29tcGlsZV9vcHRpb25zKHZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIFBVQkxJQyAke01TVkNfTE9BREVSX0NPTVBJTEVfT1BUSU9OU30pCisKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSIC1EV0lOMzJfTEVBTl9BTkRfTUVBTikKKyAgICAjIFdvcmthcm91bmQgZm9yIFRSMSBkZXByZWNhdGlvbiBpbiBWaXN1YWwgU3R1ZGlvIDE1LjUgdW50aWwgR29vZ2xlIFRlc3QgaXMgdXBkYXRlZAorICAgIGFkZF9kZWZpbml0aW9ucygtRF9TSUxFTkNFX1RSMV9OQU1FU1BBQ0VfREVQUkVDQVRJT05fV0FSTklORykKK2Vsc2VpZihBTkRST0lEKQorICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUikKK2Vsc2VpZihBUFBMRSkKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLKQorZWxzZWlmKFVOSVggQU5EIE5PVCBBUFBMRSkgIyBpLmUuOiBMaW51eAorICAgIGlmKEJVSUxEX1dTSV9YQ0JfU1VQUE9SVCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisgICAgZW5kaWYoKQorCisgICAgaWYoQlVJTERfV1NJX1hMSUJfU1VQUE9SVCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgIGVuZGlmKCkKKworICAgIGlmKEJVSUxEX1dTSV9XQVlMQU5EX1NVUFBPUlQpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJVbnN1cHBvcnRlZCBQbGF0Zm9ybSEiKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAtRF9VU0VfTUFUSF9ERUZJTkVTIikKKworICAgICMgSWYgTVNWQywgZGlzYWJsZSBzb21lIHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaCB3YXJuaW5ncy4KKyAgICBpZihNU1ZDKQorICAgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gL3dkNDI2NyIpCisgICAgZW5kaWYoKQorCitlbHNlKCkKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXN0ZD1jKysxMSIpCitlbmRpZigpCisKK3NldChMSUJHTE1fSU5DTFVERV9ESVIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYnMpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2V4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICR7R1RFU1RfU09VUkNFX0RJUn0vZ29vZ2xldGVzdC9pbmNsdWRlCisgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9CSU5BUllfRElSfSkKKworaWYoVU5JWCkKKyAgICAjIGV4dHJhIHNldHVwIGZvciBvdXQtb2YtdHJlZSBidWlsZHMKKyAgICBpZihOT1QgKENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiBTVFJFUVVBTCBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVIpKQorICAgICAgICBhZGRfY3VzdG9tX3RhcmdldChiaW5hcnktZGlyLXN5bWxpbmtzIEFMTAorICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3J1bl93cmFwX29iamVjdHNfdGVzdHMuc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fd3JhcF9vYmplY3RzX3Rlc3RzLnNoCisgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjcmVhdGVfc3ltbGluayAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcnVuX2xvYWRlcl90ZXN0cy5zaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sb2FkZXJfdGVzdHMuc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNyZWF0ZV9zeW1saW5rICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9ydW5fZXh0cmFfbG9hZGVyX3Rlc3RzLnNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2V4dHJhX2xvYWRlcl90ZXN0cy5zaAorICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3J1bl9hbGxfdGVzdHMuc2ggcnVuX2FsbF90ZXN0cy5zaAorICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJCQVRJTSkKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICBpZihOT1QgKENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiBTVFJFUVVBTCBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVIpKQorICAgICAgICBmaWxlKFRPX05BVElWRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9fcnVuX2FsbF90ZXN0cy5wczEgUlVOX0FMTCkKKyAgICAgICAgYWRkX2N1c3RvbV90YXJnZXQoYmluYXJ5LWRpci1zeW1saW5rcyBBTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICR7UlVOX0FMTH0gcnVuX2FsbF90ZXN0cy5wczEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0pCisgICAgICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhiaW5hcnktZGlyLXN5bWxpbmtzIFBST1BFUlRJRVMgRk9MREVSICR7TE9BREVSX0hFTFBFUl9GT0xERVJ9KQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoVEFSR0VUIHZ1bGthbikKKyAgICBzZXQoTE9BREVSX0xJQiB2dWxrYW4pCitlbHNlaWYoV0lOMzIgQU5EIE5PVCAkRU5We1ZVTEtBTl9TREt9IEVRVUFMICIiKQorICAgIGlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICAgICAgc2V0KExPQURFUl9MSUIgIiRFTlZ7VlVMS0FOX1NES30vTGliL3Z1bGthbi0xLmxpYiIpCisgICAgZWxzZSgpCisgICAgICAgIHNldChMT0FERVJfTElCICIkRU5We1ZVTEtBTl9TREt9L0xpYjMyL3Z1bGthbi0xLmxpYiIpCisgICAgZW5kaWYoKQorZWxzZSgpCisgICAgc2V0KExPQURFUl9MSUIgdnVsa2FuKQorZW5kaWYoKQorCit0YXJnZXRfbGlua19saWJyYXJpZXModmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgIiR7TE9BREVSX0xJQn0iIGd0ZXN0IGd0ZXN0X21haW4pCitpZihCVUlMRF9MT0FERVIgQU5EIEVOQUJMRV9TVEFUSUNfTE9BREVSKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyBQUk9QRVJUSUVTIExJTktfRkxBR1MgIi9pZ25vcmU6NDA5OCIpCitlbmRpZigpCisKKyMgQ29weSBsb2FkZXIgYW5kIGdvb2dsZXRlc3QgKGd0ZXN0KSBsaWJzIHRvIHRlc3QgZGlyIHNvIHRoZSB0ZXN0IGV4ZWN1dGFibGUgY2FuIGZpbmQgdGhlbS4KK2lmKFdJTjMyKQorICAgIGZpbGUoQ09QWSB2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cy52Y3hwcm9qLnVzZXIgREVTVElOQVRJT04gIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCisgICAgaWYoQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIl5WaXN1YWwgU3R1ZGlvLioiKQorICAgICAgICBmaWxlKFRPX05BVElWRV9QQVRIICR7UFJPSkVDVF9CSU5BUllfRElSfS9leHRlcm5hbC9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvJDxDT05GSUc+L2d0ZXN0X21haW4kPCQ8Q09ORklHOkRlYnVnPjpkPi5kbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9DT1BZX1NSQzEpCisgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2V4dGVybmFsL2dvb2dsZXRlc3QvZ29vZ2xldGVzdC8kPENPTkZJRz4vZ3Rlc3QkPCQ8Q09ORklHOkRlYnVnPjpkPi5kbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9DT1BZX1NSQzIpCisgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyQ8Q09ORklHPiBHVEVTVF9DT1BZX0RFU1QpCisgICAgZWxzZSgpCisgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2V4dGVybmFsL2dvb2dsZXRlc3QvZ29vZ2VsdGVzdC9ndGVzdF9tYWluLmRsbCBHVEVTVF9DT1BZX1NSQzEpCisgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2V4dGVybmFsL2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9ndGVzdC5kbGwgR1RFU1RfQ09QWV9TUkMyKQorICAgICAgICBmaWxlKFRPX05BVElWRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSBHVEVTVF9DT1BZX0RFU1QpCisgICAgZW5kaWYoKQorICAgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgUE9TVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EIHhjb3B5IC9ZIC9JICR7R1RFU1RfQ09QWV9TUkMxfSAke0dURVNUX0NPUFlfREVTVH0KKyAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCB4Y29weSAvWSAvSSAke0dURVNUX0NPUFlfU1JDMn0gJHtHVEVTVF9DT1BZX0RFU1R9KQorICAgICMgQ29weSB0aGUgbG9hZGVyIHNoYXJlZCBsaWIgKGlmIGJ1aWx0KSB0byB0aGUgdGVzdCBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgc28gdGhlIHRlc3QgYXBwIGZpbmRzIGl0LgorICAgIGlmKChOT1QgRU5BQkxFX1NUQVRJQ19MT0FERVIpIEFORCBUQVJHRVQgdnVsa2FuKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIHZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIFBPU1RfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICQ8VEFSR0VUX0ZJTEU6dnVsa2FuPiAkPFRBUkdFVF9GSUxFX0RJUjp2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cz4pCisgICAgZW5kaWYoKQorZW5kaWYoKQorCithZGRfc3ViZGlyZWN0b3J5KGxheWVycykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZmIwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQgQEAKKworIyBMb2FkZXIgVGVzdHMKKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSB0ZXN0IHN1aXRlIGZvciB0aGUgVnVsa2FuIGxvYWRlci4KK1RoZXNlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZSAmbWRhc2g7IHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHN1cHBsZW1lbnRlZCB3aXRoIG90aGVyIHRlc3RzLCBzdWNoIGFzIENUUy4KKworIyMgUnVubmluZyBUZXN0cworCitUbyBydW4gdGhlIHRlc3RzLCB5b3VyIGVudmlyb25tZW50IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgdGVzdCBsYXllcnMgd2lsbCBiZSBmb3VuZC4KK1RoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB0aGUgYFZLX0xBWUVSX1BBVEhgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50IGF0IHRoZSBidWlsdCBsYXllcnMuCitEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIGJ1aWxkIHRvb2wgeW91IHVzZSwgdGhpcyBsb2NhdGlvbiB3aWxsIGVpdGhlciBiZSBgJHtDTUFLRV9CSU5BUllfRElSfS90ZXN0cy9sYXllcnNgIG9yIGAke0NNQUtFX0JJTkFSWV9ESVJ9L3Rlc3RzL2xheWVycy8ke0NPTkZJR1VSQVRJT059YC4KK1doZW4gdXNpbmcgVmlzdWFsIFN0dWRpbywgYSB0aGUgZ2VuZXJhdGVkIHByb2plY3Qgd2lsbCBhbHJlYWR5IGJlIHNldCB1cCB0byBzZXQgdGhlIGVudmlyb25tZW50IGFzIG5lZWRlZC4KK1J1bm5pbmcgdGhlIHRlc3RzIHRocm91Z2ggdGhlIGBydW5fbG9hZGVyX3Rlc3RzLnNoYCBzY3JpcHQgb24gTGludXggd2lsbCBhbHNvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQgcHJvcGVybHkuCitXaXRoIGFueSBvdGhlciB0b29sY2hhaW4sIHRoZSB1c2VyIHdpbGwgaGF2ZSB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50IG1hbnVhbGx5LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL19ydW5fYWxsX3Rlc3RzLnBzMSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9fcnVuX2FsbF90ZXN0cy5wczEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzYmM5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9fcnVuX2FsbF90ZXN0cy5wczEKQEAgLTAsMCArMSwzMCBAQAorIyBCZSBzdXJlIHRvIHJ1biAiU2V0LUV4ZWN1dGlvblBvbGljeSBSZW1vdGVTaWduZWQiIGJlZm9yZSBydW5uaW5nIHBvd2Vyc2hlbGwgc2NyaXB0cworCisjIFVzZSBUZXN0RXhjZXB0aW9ucyB0byBmaWx0ZXIgb3V0IHRlc3RzIHdpdGgga25vd24gcHJvYmxlbXMsIHNlcGFyYXRlZCBieSBhIGNvbG9uCisjIGkuZS4gcnVuX2FsbF90ZXN0cy5wczEgLVRlc3RFeGNlcHRpb25zIFZrTGF5ZXJUZXN0LlJlcXVpcmVkUGFyYW1ldGVyOlZrTGF5ZXJUZXN0LlVucmVjb2duaXplZFZhbHVlCisKKyMgVG8gdHJpZ2dlciBEZWJ1ZyB0ZXN0cywgc3BlY2lmeSB0aGUgcGFyYW1ldGVyIHdpdGggYSBoeXBoZW4KKyMgaS5lICBydW5fYWxsX3Rlc3RzLnBzMSAtRGVidWcKKworUGFyYW0oCisgICAgW3N3aXRjaF0kRGVidWcsCisgICAgW3N0cmluZ10kTG9hZGVyVGVzdEV4Y2VwdGlvbnMsCisgICAgW3N0cmluZ10kVGVzdEV4Y2VwdGlvbnMKKykKKworaWYgKCREZWJ1ZykgeworICAgICRkUGF0aCA9ICJEZWJ1ZyIKK30gZWxzZSB7CisgICAgJGRQYXRoID0gIlJlbGVhc2UiCit9CisKKyRBYm92ZURpciA9IChHZXQtSXRlbSAtUGF0aCAiLi4iIC1WZXJib3NlKS5GdWxsTmFtZQorV3JpdGUtSG9zdCAiVXNpbmcgVnVsa2FuIHJ1bi10aW1lPSRBYm92ZURpclxsb2FkZXJcJGRQYXRoIgorU2V0LUl0ZW0gLXBhdGggZW52OlBhdGggLXZhbHVlICgiJEFib3ZlRGlyXGxvYWRlclwkZFBhdGg7IiArICRlbnY6UGF0aCkKKworJiAkZFBhdGhcdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgLS1ndGVzdF9maWx0ZXI9LSRMb2FkZXJUZXN0RXhjZXB0aW9ucworaWYgKCRsYXN0ZXhpdGNvZGUgLW5lIDApIHsKKyAgIGV4aXQgMQorfQorCitleGl0ICRsYXN0ZXhpdGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvQ01ha2VMaXN0cy50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYTVlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTYgQEAKKyMgfn5+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyB+fn4KKworc2V0KENNQUtFX0lOU1RBTExfUlBBVEggL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS92dWxrYW4vbGF5ZXI6L3Vzci9saWIvaTM4Ni1saW51eC1nbnUvdnVsa2FuL2xheWVyKQorCitpZihXSU4zMikKKyAgICBtYWNybyhBZGRWa0xheWVyIHRhcmdldCkKKyAgICAgICAgZmlsZShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vVmtMYXllcl8ke3RhcmdldH0uZGVmIERFRl9GSUxFKQorICAgICAgICBhZGRfY3VzdG9tX3RhcmdldChjb3B5LSR7dGFyZ2V0fS1kZWYtZmlsZSBBTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICR7REVGX0ZJTEV9IFZrTGF5ZXJfJHt0YXJnZXR9LmRlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJCQVRJTSkKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGNvcHktJHt0YXJnZXR9LWRlZi1maWxlIFBST1BFUlRJRVMgRk9MREVSICR7TE9BREVSX0hFTFBFUl9GT0xERVJ9KQorICAgICAgICBhZGRfbGlicmFyeShWa0xheWVyXyR7dGFyZ2V0fSBTSEFSRUQgJHtBUkdOfSBWa0xheWVyXyR7dGFyZ2V0fS5kZWYpCisgICAgICAgIHRhcmdldF9jb21waWxlX29wdGlvbnMoVmtMYXllcl8ke3RhcmdldH0gUFVCTElDICR7TVNWQ19MT0FERVJfQ09NUElMRV9PUFRJT05TfSkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFZ1bGthbjo6SGVhZGVycykKKyAgICBlbmRtYWNybygpCitlbHNlaWYoQVBQTEUpCisgICAgbWFjcm8oQWRkVmtMYXllciB0YXJnZXQpCisgICAgICAgIGFkZF9saWJyYXJ5KFZrTGF5ZXJfJHt0YXJnZXR9IFNIQVJFRCAke0FSR059KQorICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoVmtMYXllcl8ke3RhcmdldH0gUFJPUEVSVElFUyBMSU5LX0ZMQUdTICItV2wiKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoVmtMYXllcl8ke3RhcmdldH0gVnVsa2FuOjpIZWFkZXJzKQorICAgIGVuZG1hY3JvKCkKK2Vsc2UoVU5JWCBBTkQgTk9UIEFQUExFKSAjIGkuZS46IExpbnV4CisgICAgbWFjcm8oQWRkVmtMYXllciB0YXJnZXQpCisgICAgICAgIGFkZF9saWJyYXJ5KFZrTGF5ZXJfJHt0YXJnZXR9IFNIQVJFRCAke0FSR059KQorICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoVmtMYXllcl8ke3RhcmdldH0gUFJPUEVSVElFUyBMSU5LX0ZMQUdTICItV2wsLUJzeW1ib2xpYyIpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyXyR7dGFyZ2V0fSBWdWxrYW46OkhlYWRlcnMpCisgICAgZW5kbWFjcm8oKQorZW5kaWYoKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vbG9hZGVyCisgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi9sb2FkZXIvZ2VuZXJhdGVkKQorCitpZihXSU4zMikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgIHNldChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ19GTEFHU19SRUxFQVNFfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHICIke0NNQUtFX0NYWF9GTEFHU19ERUJVR30gLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAvYmlnb2JqIikKKyAgICBzZXQoQ01BS0VfQ19GTEFHU19ERUJVRyAiJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC9iaWdvYmoiKQorZWxzZSgpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1XcG9pbnRlci1hcml0aCAtV25vLXVudXNlZC1mdW5jdGlvbiIpCisgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLVdwb2ludGVyLWFyaXRoIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIikKK2VuZGlmKCkKKworQWRkVmtMYXllcih3cmFwX29iamVjdHMgd3JhcF9vYmplY3RzLmNwcCB2a19sYXllcl90YWJsZS5jcHAgdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcCkKKworQWRkVmtMYXllcih0ZXN0IHRlc3QuY3BwIHZrX2xheWVyX3RhYmxlLmNwcCB2a19sYXllcl9leHRlbnNpb25fdXRpbHMuY3BwKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIG91dHB1dCBmaWxlIG5lZWRzIFVuaXggIi8iIHNlcGFyYXRvcnMgb3IgV2luZG93cyAiXCIgc2VwYXJhdG9ycyBPbiB0b3Agb2YgdGhhdCwgV2luZG93cyBzZXBhcmF0b3JzIGFjdHVhbGx5IG5lZWQgdG8gYmUgZG91YmxlZAorIyBiZWNhdXNlIHRoZSBqc29uIGZvcm1hdCB1c2VzIGJhY2tzbGFzaCBlc2NhcGVzCitmaWxlKFRPX05BVElWRV9QQVRIICIuLyIgUkVMQVRJVkVfUEFUSF9QUkVGSVgpCitzdHJpbmcoUkVQTEFDRSAiXFwiCisgICAgICAgICAgICAgICAiXFxcXCIKKyAgICAgICAgICAgICAgIFJFTEFUSVZFX1BBVEhfUFJFRklYCisgICAgICAgICAgICAgICAiJHtSRUxBVElWRV9QQVRIX1BSRUZJWH0iKQorCisjIFJ1biBlYWNoIC5qc29uLmluIGZpbGUgdGhyb3VnaCB0aGUgZ2VuZXJhdG9yIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBnZW5lcmF0b3IuY21ha2Ugc2NyaXB0IHNvIHRoYXQgdGhlIGdlbmVyYXRvciBjYW4gYmUgcnVuIGF0CisjIGNvbXBpbGUgdGltZSwgaW5zdGVhZCBvZiBjb25maWd1cmUgdGltZSBSdW5uaW5nIGF0IGNvbXBpbGUgdGltZSBsZXRzIHVzIHVzZSBjbWFrZSBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKFRBUkdFVF9GSUxFX05BTUUgYW5kCisjIFRBUkdFVF9GSUxFX0RJUiwgc3BlY2lmaWNhbGx5KQorZmlsZShXUklURSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbmVyYXRvci5jbWFrZSIgImNvbmZpZ3VyZV9maWxlKFwiXCR7SU5QVVRfRklMRX1cIiBcIlwke09VVFBVVF9GSUxFfVwiKSIpCisKK2ZvcmVhY2goVEFSR0VUX05BTUUgVmtMYXllcl93cmFwX29iamVjdHMgVmtMYXllcl90ZXN0IFZrTGF5ZXJfbWV0YSBWa0xheWVyX21ldGFfcmV2KQorICAgIHNldChDT05GSUdfREVGSU5FUyAtRElOUFVUX0ZJTEU9IiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9qc29uLyR7VEFSR0VUX05BTUV9Lmpzb24uaW4iCisgICAgICAgIC1EVktfVkVSU0lPTj0iJHtWdWxrYW5IZWFkZXJzX1ZFUlNJT05fTUFKT1J9LiR7VnVsa2FuSGVhZGVyc19WRVJTSU9OX01JTk9SfS4ke1Z1bGthbkhlYWRlcnNfVkVSU0lPTl9QQVRDSH0iKQorCisgICAgIyBBcHBlbmQgZnVydGhlciBjb25maWcgcGFyYW1ldGVycywgZGVwZW5kaW5nIG9uIHdoaWNoIGxheWVyLgorICAgIGlmKFRBUkdFVCAke1RBUkdFVF9OQU1FfSkKKyAgICAgICAgIyBUaGlzIGpzb24gZmlsZSBjb3JyZXNwb25kcyB0byBhbiBhY3R1YWwgdGFyZ2V0IChub3QgYSBtZXRhbGF5ZXIpOyBxdWVyeSBwcm9wZXJ0aWVzIGZyb20gdGhhdCB0YXJnZXQuCisgICAgICAgIHNldChDT05GSUdfREVGSU5FUworICAgICAgICAgICAgJHtDT05GSUdfREVGSU5FU30KKyAgICAgICAgICAgIC1ET1VUUFVUX0ZJTEU9IiQ8VEFSR0VUX0ZJTEVfRElSOiR7VEFSR0VUX05BTUV9Pi8ke1RBUkdFVF9OQU1FfS5qc29uIgorICAgICAgICAgICAgLURSRUxBVElWRV9MQVlFUl9CSU5BUlk9IiR7UkVMQVRJVkVfUEFUSF9QUkVGSVh9JDxUQVJHRVRfRklMRV9OQU1FOiR7VEFSR0VUX05BTUV9PiIpCisgICAgZWxzZSgpCisgICAgICAgICMgVGhpcyBqc29uIGZpbGUgaXMgYSBtZXRhbGF5ZXIuICBRdWVyeSBwcm9wZXJ0aWVzIGZyb20gdGhlIFZrTGF5ZXJfdGVzdCBsYXllcjsgdGhlcmUgaXMgbm8gbGF5ZXIgYmluYXJ5IGZpbGUuCisgICAgICAgIHNldChDT05GSUdfREVGSU5FUyAke0NPTkZJR19ERUZJTkVTfSAtRE9VVFBVVF9GSUxFPSIkPFRBUkdFVF9GSUxFX0RJUjpWa0xheWVyX3Rlc3Q+LyR7VEFSR0VUX05BTUV9Lmpzb24iKQorICAgIGVuZGlmKCkKKworICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7VEFSR0VUX05BTUV9LWpzb24gQUxMCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9ICR7Q09ORklHX0RFRklORVN9IC1QICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuZXJhdG9yLmNtYWtlIikKK2VuZGZvcmVhY2goKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy9Wa0xheWVyX3Rlc3QuZGVmIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy9Wa0xheWVyX3Rlc3QuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjQwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL1ZrTGF5ZXJfdGVzdC5kZWYKQEAgLTAsMCArMSwzMSBAQAorOyBUSElTIEZJTEUgSVMgR0VORVJBVEVELiAgRE8gTk9UIEVESVQuCisKKzs7OzsgQmVnaW4gQ29weXJpZ2h0IE5vdGljZSA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Cis7IFZ1bGthbgorOworOyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCis7IENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCis7IENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOworOyAgQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorOzs7OyAgRW5kIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKworOyBUaGUgZm9sbG93aW5nIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MsIGZvciBleHBvcnRpbmcgc3ltYm9scyBmcm9tIHRoZSBETEwKKworTElCUkFSWSBWa0xheWVyX3Rlc3QKK0VYUE9SVFMKK3ZrR2V0SW5zdGFuY2VQcm9jQWRkcgordmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcwordmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvVmtMYXllcl93cmFwX29iamVjdHMuZGVmIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy9Wa0xheWVyX3dyYXBfb2JqZWN0cy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkNGZhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvVmtMYXllcl93cmFwX29iamVjdHMuZGVmCkBAIC0wLDAgKzEsMzIgQEAKKzsgVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gIERPIE5PVCBFRElULgorCis7Ozs7IEJlZ2luIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OworOyBWdWxrYW4KKzsKKzsgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorOyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorOyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKzsgIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKzs7OzsgIEVuZCBDb3B5cmlnaHQgTm90aWNlIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CisKKzsgVGhlIGZvbGxvd2luZyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzLCBmb3IgZXhwb3J0aW5nIHN5bWJvbHMgZnJvbSB0aGUgRExMCisKK0xJQlJBUlkgVmtMYXllcl93cmFwX29iamVjdHMKK0VYUE9SVFMKK3ZrR2V0SW5zdGFuY2VQcm9jQWRkcgordmtHZXREZXZpY2VQcm9jQWRkcgordmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcwordmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvanNvbi9Wa0xheWVyX21ldGEuanNvbi5pbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvanNvbi9Wa0xheWVyX21ldGEuanNvbi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTExYmNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy9qc29uL1ZrTGF5ZXJfbWV0YS5qc29uLmluCkBAIC0wLDAgKzEsMTQgQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4xLjEiLAorICAgICJsYXllciIgOiB7CisgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19tZXRhIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImFwaV92ZXJzaW9uIjogIkBWS19WRVJTSU9OQCIsCisgICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogIjEiLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiTHVuYXJHIFRlc3QgTWV0YWxheWVyIiwKKyAgICAgICAgImNvbXBvbmVudF9sYXllcnMiOiBbCisgICAgICAgICAgICAiVktfTEFZRVJfTFVOQVJHX3dyYXBfb2JqZWN0cyIsCisgICAgICAgICAgICAiVktfTEFZRVJfTFVOQVJHX3Rlc3QiCisgICAgICAgIF0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL2pzb24vVmtMYXllcl9tZXRhX3Jldi5qc29uLmluIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy9qc29uL1ZrTGF5ZXJfbWV0YV9yZXYuanNvbi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjk1YmZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy9qc29uL1ZrTGF5ZXJfbWV0YV9yZXYuanNvbi5pbgpAQCAtMCwwICsxLDE0IEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMS4xIiwKKyAgICAibGF5ZXIiIDogeworICAgICAgICAibmFtZSI6ICJWS19MQVlFUl9MVU5BUkdfbWV0YV9yZXYiLAorICAgICAgICAidHlwZSI6ICJHTE9CQUwiLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiQFZLX1ZFUlNJT05AIiwKKyAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiAiMSIsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMdW5hckcgVGVzdCBNZXRhbGF5ZXIgKFJldmVyc2VkKSIsCisgICAgICAgICJjb21wb25lbnRfbGF5ZXJzIjogWworICAgICAgICAgICAgIlZLX0xBWUVSX0xVTkFSR190ZXN0IiwKKyAgICAgICAgICAgICJWS19MQVlFUl9MVU5BUkdfd3JhcF9vYmplY3RzIgorICAgICAgICBdCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy9qc29uL1ZrTGF5ZXJfdGVzdC5qc29uLmluIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy9qc29uL1ZrTGF5ZXJfdGVzdC5qc29uLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NGI1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL2pzb24vVmtMYXllcl90ZXN0Lmpzb24uaW4KQEAgLTAsMCArMSwxNyBAQAoreworICAgICJmaWxlX2Zvcm1hdF92ZXJzaW9uIiA6ICIxLjAuMCIsCisgICAgImxheWVyIiA6IHsKKyAgICAgICAgIm5hbWUiOiAiVktfTEFZRVJfTFVOQVJHX3Rlc3QiLAorICAgICAgICAidHlwZSI6ICJHTE9CQUwiLAorICAgICAgICAibGlicmFyeV9wYXRoIjogIkBSRUxBVElWRV9MQVlFUl9CSU5BUllAIiwKKyAgICAgICAgImFwaV92ZXJzaW9uIjogIkBWS19WRVJTSU9OQCIsCisgICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogIjEiLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiTHVuYXJHIFRlc3QgTGF5ZXIiLAorICAgICAgICAiZW5hYmxlX2Vudmlyb25tZW50IjogeworICAgICAgICAgICAgIkVOQUJMRV9MQVlFUl9URVNUXzEiOiAiZW5hYmxlIgorICAgICAgICB9LAorICAgICAgICAiZGlzYWJsZV9lbnZpcm9ubWVudCI6IHsKKyAgICAgICAgICAgICJESVNBQkxFX0xBWUVSX1RFU1RfMSI6ICIiCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL2pzb24vVmtMYXllcl93cmFwX29iamVjdHMuanNvbi5pbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvanNvbi9Wa0xheWVyX3dyYXBfb2JqZWN0cy5qc29uLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzE1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL2pzb24vVmtMYXllcl93cmFwX29iamVjdHMuanNvbi5pbgpAQCAtMCwwICsxLDExIEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMC4wIiwKKyAgICAibGF5ZXIiIDogeworICAgICAgICAibmFtZSI6ICJWS19MQVlFUl9MVU5BUkdfd3JhcF9vYmplY3RzIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICJAUkVMQVRJVkVfTEFZRVJfQklOQVJZQCIsCisgICAgICAgICJhcGlfdmVyc2lvbiI6ICJAVktfVkVSU0lPTkAiLAorICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIxIiwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBEaXNwYXRjaGFibGUgT2JqZWN0IFdyYXBwaW5nIExheWVyIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdGVzdC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTQ3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSmVyZW15IEhheWVzIDxqZXJlbXlAbHVuYXJnLmNvbT4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oIgorI2luY2x1ZGUgInZrX2xheWVyX2RhdGEuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9leHRlbnNpb25fdXRpbHMuaCIKKworbmFtZXNwYWNlIHRlc3QKK3sKKworc3RydWN0IGxheWVyX2RhdGEgeworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2U7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGU7CisKKyAgICBsYXllcl9kYXRhKCkgOiBpbnN0YW5jZShWS19OVUxMX0hBTkRMRSksIGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKG51bGxwdHIpIHt9OworfTsKKworc3RhdGljIHVpbnQzMl90IGxvYWRlcl9sYXllcl9pZl92ZXJzaW9uID0gQ1VSUkVOVF9MT0FERVJfTEFZRVJfSU5URVJGQUNFX1ZFUlNJT047CisKK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBsYXllcl9kYXRhICo+IGxheWVyX2RhdGFfbWFwOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisJCVZrSW5zdGFuY2UqIHBJbnN0YW5jZSkKK3sKKyAgICBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisgICAgYXNzZXJ0KGNoYWluX2luZm8gIT0gbnVsbHB0cik7CisKKyAgICBhc3NlcnQoY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvICE9IG51bGxwdHIpOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBHZXRJbnN0YW5jZVByb2NBZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBhc3NlcnQoZnBHZXRJbnN0YW5jZVByb2NBZGRyICE9IG51bGxwdHIpOworCisgICAgUEZOX3ZrQ3JlYXRlSW5zdGFuY2UgZnBDcmVhdGVJbnN0YW5jZSA9IChQRk5fdmtDcmVhdGVJbnN0YW5jZSkgZnBHZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0NyZWF0ZUluc3RhbmNlIik7CisgICAgaWYgKGZwQ3JlYXRlSW5zdGFuY2UgPT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBmcENyZWF0ZUluc3RhbmNlKHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqY3JlYXRlX2Rldl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xPQURFUl9MQVlFUl9DUkVBVEVfREVWSUNFX0NBTExCQUNLKTsKKyAgICBhc3NlcnQoY3JlYXRlX2Rldl9pbmZvICE9IG51bGxwdHIpOworICAgIGF1dG8gbGF5ZXJfY3JlYXRlX2RldmljZSA9IGNyZWF0ZV9kZXZfaW5mby0+dS5sYXllckRldmljZS5wZm5MYXllckNyZWF0ZURldmljZTsKKyAgICBhdXRvIGxheWVyX2Rlc3Ryb3lfZGV2aWNlID0gY3JlYXRlX2Rldl9pbmZvLT51LmxheWVyRGV2aWNlLnBmbkxheWVyRGVzdHJveURldmljZTsKKworICAgIGxheWVyX2RhdGEgKmluc3RhbmNlX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleSgqcEluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGluc3RhbmNlX2RhdGEtPmluc3RhbmNlID0gKnBJbnN0YW5jZTsKKyAgICBpbnN0YW5jZV9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZSA9IG5ldyBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlOworICAgIGxheWVyX2luaXRfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoKnBJbnN0YW5jZSwgaW5zdGFuY2VfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUsIGZwR2V0SW5zdGFuY2VQcm9jQWRkcik7CisKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaW5zdGFuY2VfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygqcEluc3RhbmNlLCAmY291bnQsIG51bGxwdHIpOworICAgIHN0ZDo6dmVjdG9yPFZrUGh5c2ljYWxEZXZpY2U+IGRldmljZXMoY291bnQpOworICAgIGluc3RhbmNlX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLT5FbnVtZXJhdGVQaHlzaWNhbERldmljZXMoKnBJbnN0YW5jZSwgJmNvdW50LCBkZXZpY2VzLmRhdGEoKSk7CisgICAgVmtEZXZpY2UgZGV2aWNlOworICAgIGF1dG8gZGV2aWNlX2NyZWF0ZV9pbmZvID0gVmtEZXZpY2VDcmVhdGVJbmZveworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8sICAvLyBzVHlwZQorICAgICAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwTmV4dAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGFncworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZUNyZWF0ZUluZm9Db3VudAorICAgICAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwUXVldWVDcmVhdGVJbmZvcworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGVkTGF5ZXJDb3VudAorICAgICAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcEVuYWJsZWRMYXllck5hbWVzCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWRFeHRlbnNpb25Db3VudAorICAgICAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcworICAgICAgICBudWxscHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwRW5hYmxlZEZlYXR1cmVzCisgICAgfTsKKyAgICBhdXRvIGRldmljZVF1ZXVlID0gVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm97fTsKKyAgICBkZXZpY2VRdWV1ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTzsKKyAgICBmbG9hdCBwcmlvcyA9IDE7CisgICAgZGV2aWNlUXVldWUucXVldWVGYW1pbHlJbmRleCA9IDA7CisgICAgZGV2aWNlUXVldWUucXVldWVDb3VudCA9IDE7CisgICAgZGV2aWNlUXVldWUucFF1ZXVlUHJpb3JpdGllcyA9ICZwcmlvczsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucFF1ZXVlQ3JlYXRlSW5mb3MgPSAmZGV2aWNlUXVldWU7CisgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMTsKKworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIG5ld0dEUEEgPSBudWxscHRyOworICAgIGxheWVyX2NyZWF0ZV9kZXZpY2UoKnBJbnN0YW5jZSwgZGV2aWNlc1swXSwgJmRldmljZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmRldmljZSwgdmtHZXRJbnN0YW5jZVByb2NBZGRyLCAmbmV3R0RQQSk7CisgICAgYXNzZXJ0KG5ld0dEUEEgIT0gbnVsbHB0cik7CisgICAgUEZOX3ZrRGVzdHJveURldmljZSBkZXN0cm95ID0gKFBGTl92a0Rlc3Ryb3lEZXZpY2UpbmV3R0RQQShkZXZpY2UsICJ2a0Rlc3Ryb3lEZXZpY2UiKTsKKyAgICBsYXllcl9kZXN0cm95X2RldmljZShkZXZpY2UsIG51bGxwdHIsIGRlc3Ryb3kpOworCisgICAgc3RkOjpjb3V0IDw8ICJWS19MQVlFUl9MVU5BUkdfdGVzdDogZGV2aWNlIGNvdW50ICIgPDwgY291bnQgPDwgJ1xuJzsKKworICAgIC8vIE1hcmtlciBmb3IgdGVzdGluZy4KKyAgICBzdGQ6OmNvdXQgPDwgIlZLX0xBWUVSX0xVTkFSR190ZXN0OiBDcmVhdGVJbnN0YW5jZSIgPDwgJ1xuJzsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lJbnN0YW5jZShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpCit7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpOworICAgIGxheWVyX2RhdGEgKmluc3RhbmNlX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoa2V5LCBsYXllcl9kYXRhX21hcCk7CisgICAgaW5zdGFuY2VfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUtPkRlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgcEFsbG9jYXRvcik7CisKKyAgICBkZWxldGUgaW5zdGFuY2VfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgbGF5ZXJfZGF0YV9tYXAuZXJhc2Uoa2V5KTsKKworICAgIC8vIE1hcmtlciBmb3IgdGVzdGluZy4KKyAgICBzdGQ6OmNvdXQgPDwgIlZLX0xBWUVSX0xVTkFSR190ZXN0OiBEZXN0cm95SW5zdGFuY2UiIDw8ICdcbic7Cit9CisKK1ZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyKiBmdW5jTmFtZSkKK3sKKyAgICAvLyBSZXR1cm4gdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnRlcmNlcHRlZCBieSB0aGlzIGxheWVyLgorICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBwcm9jOworICAgIH0gY29yZV9pbnN0YW5jZV9jb21tYW5kc1tdID0KKyAgICB7CisgICAgICAgIHsgInZrR2V0SW5zdGFuY2VQcm9jQWRkciIsIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihHZXRJbnN0YW5jZVByb2NBZGRyKSB9LAorICAgICAgICB7ICJ2a0NyZWF0ZUluc3RhbmNlIiwgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KENyZWF0ZUluc3RhbmNlKSB9LAorICAgICAgICB7ICJ2a0Rlc3Ryb3lJbnN0YW5jZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihEZXN0cm95SW5zdGFuY2UpIH0KKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvcmVfaW5zdGFuY2VfY29tbWFuZHMpOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXN0cmNtcChjb3JlX2luc3RhbmNlX2NvbW1hbmRzW2ldLm5hbWUsIGZ1bmNOYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvcmVfaW5zdGFuY2VfY29tbWFuZHNbaV0ucHJvYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE9ubHkgY2FsbCBkb3duIHRoZSBjaGFpbiBmb3IgVnVsa2FuIGNvbW1hbmRzIHRoYXQgdGhpcyBsYXllciBkb2VzIG5vdCBpbnRlcmNlcHQuCisgICAgbGF5ZXJfZGF0YSAqaW5zdGFuY2VfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnBUYWJsZSA9IGluc3RhbmNlX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlOworICAgIGlmIChwVGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIgPT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBwVGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKSB7CisgICAgYXNzZXJ0KGluc3RhbmNlKTsKKworICAgIGxheWVyX2RhdGEgKmluc3RhbmNlX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpwVGFibGUgPSBpbnN0YW5jZV9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZTsKKyAgICBpZiAocFRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyID09IG51bGxwdHIpCisgICAgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gcFRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyKGluc3RhbmNlLCBmdW5jTmFtZSk7Cit9CisKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIGZ1bmNOYW1lKQoreworICAgIHJldHVybiB0ZXN0OjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCBmdW5jTmFtZSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykKK3sKKyAgICByZXR1cm4gVktfRVJST1JfTEFZRVJfTk9UX1BSRVNFTlQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LCBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpCit7CisgICAgcmV0dXJuIFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gdGVzdDo6R2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uKFZrTmVnb3RpYXRlTGF5ZXJJbnRlcmZhY2UgKnBWZXJzaW9uU3RydWN0KSB7CisgICAgYXNzZXJ0KHBWZXJzaW9uU3RydWN0ICE9IE5VTEwpOworICAgIGFzc2VydChwVmVyc2lvblN0cnVjdC0+c1R5cGUgPT0gTEFZRVJfTkVHT1RJQVRFX0lOVEVSRkFDRV9TVFJVQ1QpOworCisgICAgLy8gRmlsbCBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaWYgb3VyIHZlcnNpb24gaXMgYXQgbGVhc3QgY2FwYWJsZSBvZiBoYXZpbmcgdGhlIHN0cnVjdHVyZSBjb250YWluIHRoZW0uCisgICAgaWYgKHBWZXJzaW9uU3RydWN0LT5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24gPj0gMikgeworICAgICAgICBwVmVyc2lvblN0cnVjdC0+cGZuR2V0SW5zdGFuY2VQcm9jQWRkciA9IHZrR2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICAgICAgcFZlcnNpb25TdHJ1Y3QtPnBmbkdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgPSB2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHI7CisgICAgfQorCisgICAgaWYgKHBWZXJzaW9uU3RydWN0LT5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24gPCBDVVJSRU5UX0xPQURFUl9MQVlFUl9JTlRFUkZBQ0VfVkVSU0lPTikgeworICAgICAgICB0ZXN0Ojpsb2FkZXJfbGF5ZXJfaWZfdmVyc2lvbiA9IHBWZXJzaW9uU3RydWN0LT5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb247CisgICAgfSBlbHNlIGlmIChwVmVyc2lvblN0cnVjdC0+bG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uID4gQ1VSUkVOVF9MT0FERVJfTEFZRVJfSU5URVJGQUNFX1ZFUlNJT04pIHsKKyAgICAgICAgcFZlcnNpb25TdHJ1Y3QtPmxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbiA9IENVUlJFTlRfTE9BREVSX0xBWUVSX0lOVEVSRkFDRV9WRVJTSU9OOworICAgIH0KKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy92a19mb3JtYXRfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfZm9ybWF0X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2ZjllYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfZm9ybWF0X3V0aWxzLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAidnVsa2FuL3Z1bGthbi5oIgorCisjaWYgIWRlZmluZWQoVktfTEFZRVJfRVhQT1JUKQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKKyNkZWZpbmUgVktfTEFZRVJfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKQorI2RlZmluZSBWS19MQVlFUl9FWFBPUlQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbHNlCisjZGVmaW5lIFZLX0xBWUVSX0VYUE9SVAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFZLX01VTFRJUExBTkVfRk9STUFUX01BWF9QTEFORVMgMworCit0eXBlZGVmIGVudW0gVmtGb3JtYXRDb21wYXRpYmlsaXR5Q2xhc3MgeworICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX05PTkVfQklUID0gMCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184X0JJVCA9IDEsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUID0gMiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18yNF9CSVQgPSAzLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVCA9IDQsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNDhfQklUID0gNSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NF9CSVQgPSA2LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzk2X0JJVCA9IDcsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTI4X0JJVCA9IDgsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTkyX0JJVCA9IDksCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMjU2X0JJVCA9IDEwLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDMV9SR0JfQklUID0gMTEsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkMxX1JHQkFfQklUID0gMTIsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkMyX0JJVCA9IDEzLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDM19CSVQgPSAxNCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19CQzRfQklUID0gMTUsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkM1X0JJVCA9IDE2LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDNkhfQklUID0gMTcsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkM3X0JJVCA9IDE4LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VUQzJfUkdCX0JJVCA9IDE5LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VUQzJfUkdCQV9CSVQgPSAyMCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FVEMyX0VBQ19SR0JBX0JJVCA9IDIxLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VBQ19SX0JJVCA9IDIyLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VBQ19SR19CSVQgPSAyMywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzRYNF9CSVQgPSAyNCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzVYNF9CSVQgPSAyNSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzVYNV9CSVQgPSAyNiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzZYNV9CSVQgPSAyNywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzZYNl9CSVQgPSAyOCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzhYNV9CSVQgPSAyOSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzhYNl9CSVQgPSAyMCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzhYOF9CSVQgPSAzMSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzEwWDVfQklUID0gMzIsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ18xMFg2X0JJVCA9IDMzLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0FTVENfMTBYOF9CSVQgPSAzNCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzEwWDEwX0JJVCA9IDM1LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0FTVENfMTJYMTBfQklUID0gMzYsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ18xMlgxMl9CSVQgPSAzNywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19EMTZfQklUID0gMzgsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfRDI0X0JJVCA9IDM5LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0QzMl9CSVQgPSAzMCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19TOF9CSVQgPSA0MSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19EMTZTOF9CSVQgPSA0MiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19EMjRTOF9CSVQgPSA0MywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19EMzJTOF9CSVQgPSA0NCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19QVlJUQzFfMkJQUF9CSVQgPSA0NSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19QVlJUQzFfNEJQUF9CSVQgPSA0NiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19QVlJUQzJfMkJQUF9CSVQgPSA0NywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19QVlJUQzJfNEJQUF9CSVQgPSA0OCwKKyAgICAvKiBLSFJfc2FtcGxlcl9ZQ2JDcl9jb252ZXJzaW9uICovCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJCSVRfRzhCOEc4UjggPSA0OSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMkJJVF9COEc4UjhHOCA9IDUwLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX1IxMEcxMEIxMEExMCA9IDUxLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0cxMEIxMEcxMFIxMCA9IDUyLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0IxMEcxMFIxMEcxMCA9IDUzLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX1IxMkcxMkIxMkExMiA9IDU0LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0cxMkIxMkcxMlIxMiA9IDU1LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0IxMkcxMlIxMkcxMiA9IDU2LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0cxNkIxNkcxNlIxNiA9IDU3LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0IxNkcxNlIxNkcxNiA9IDU4LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhCSVRfM1BMQU5FXzQyMCA9IDU5LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhCSVRfMlBMQU5FXzQyMCA9IDYwLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhCSVRfM1BMQU5FXzQyMiA9IDYxLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhCSVRfMlBMQU5FXzQyMiA9IDYyLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhCSVRfM1BMQU5FXzQ0NCA9IDYzLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEwQklUXzNQTEFORV80MjAgPSA2NCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMEJJVF8yUExBTkVfNDIwID0gNjUsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTBCSVRfM1BMQU5FXzQyMiA9IDY2LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEwQklUXzJQTEFORV80MjIgPSA2NywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMEJJVF8zUExBTkVfNDQ0ID0gNjgsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTJCSVRfM1BMQU5FXzQyMCA9IDY5LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEyQklUXzJQTEFORV80MjAgPSA3MCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMkJJVF8zUExBTkVfNDIyID0gNzEsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTJCSVRfMlBMQU5FXzQyMiA9IDcyLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEyQklUXzNQTEFORV80NDQgPSA3MywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNkJJVF8zUExBTkVfNDIwID0gNzQsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZCSVRfMlBMQU5FXzQyMCA9IDc1LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2QklUXzNQTEFORV80MjIgPSA3NiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNkJJVF8yUExBTkVfNDIyID0gNzcsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZCSVRfM1BMQU5FXzQ0NCA9IDc4LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX01BWF9FTlVNID0gNzkKK30gVmtGb3JtYXRDb21wYXRpYmlsaXR5Q2xhc3M7CisKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzRGVwdGhPclN0ZW5jaWwoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzRGVwdGhBbmRTdGVuY2lsKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc0RlcHRoT25seShWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNTdGVuY2lsT25seShWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNDb21wcmVzc2VkX0VUQzJfRUFDKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc0NvbXByZXNzZWRfQVNUQ19MRFIoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzQ29tcHJlc3NlZF9CQyhWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNDb21wcmVzc2VkX1BWUlRDKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NpbmdsZVBsYW5lXzQyMihWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNOb3JtKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1VOb3JtKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NOb3JtKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc0ludChWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNTSW50KFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1VJbnQoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzRmxvYXQoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzU1JHQihWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNVU2NhbGVkKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NTY2FsZWQoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzQ29tcHJlc3NlZChWa0Zvcm1hdCBmb3JtYXQpOworCitWS19MQVlFUl9FWFBPUlQgdWludDMyX3QgRm9ybWF0UGxhbmVDb3VudChWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIHVpbnQzMl90IEZvcm1hdENoYW5uZWxDb3VudChWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIFZrRXh0ZW50M0QgRm9ybWF0Q29tcHJlc3NlZFRleGVsQmxvY2tFeHRlbnQoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBzaXplX3QgRm9ybWF0U2l6ZShWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIFZrRm9ybWF0Q29tcGF0aWJpbGl0eUNsYXNzIEZvcm1hdENvbXBhdGliaWxpdHlDbGFzcyhWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIFZrRGV2aWNlU2l6ZSBTYWZlTW9kdWxvKFZrRGV2aWNlU2l6ZSBkaXZpZGVuZCwgVmtEZXZpY2VTaXplIGRpdmlzb3IpOworVktfTEFZRVJfRVhQT1JUIFZrRm9ybWF0IEZpbmRNdWx0aXBsYW5lQ29tcGF0aWJsZUZvcm1hdChWa0Zvcm1hdCBmbXQsIHVpbnQzMl90IHBsYW5lKTsKKworc3RhdGljIGlubGluZSBib29sIEZvcm1hdElzVW5kZWYoVmtGb3JtYXQgZm9ybWF0KSB7IHJldHVybiAoZm9ybWF0ID09IFZLX0ZPUk1BVF9VTkRFRklORUQpOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgRm9ybWF0SGFzRGVwdGgoVmtGb3JtYXQgZm9ybWF0KSB7IHJldHVybiAoRm9ybWF0SXNEZXB0aE9ubHkoZm9ybWF0KSB8fCBGb3JtYXRJc0RlcHRoQW5kU3RlbmNpbChmb3JtYXQpKTsgfQorc3RhdGljIGlubGluZSBib29sIEZvcm1hdEhhc1N0ZW5jaWwoVmtGb3JtYXQgZm9ybWF0KSB7IHJldHVybiAoRm9ybWF0SXNTdGVuY2lsT25seShmb3JtYXQpIHx8IEZvcm1hdElzRGVwdGhBbmRTdGVuY2lsKGZvcm1hdCkpOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgRm9ybWF0SXNNdWx0aXBsYW5lKFZrRm9ybWF0IGZvcm1hdCkgeyByZXR1cm4gKChGb3JtYXRQbGFuZUNvdW50KGZvcm1hdCkpID4gMXUpOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgRm9ybWF0SXNDb2xvcihWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICByZXR1cm4gIShGb3JtYXRJc1VuZGVmKGZvcm1hdCkgfHwgRm9ybWF0SXNEZXB0aE9yU3RlbmNpbChmb3JtYXQpIHx8IEZvcm1hdElzTXVsdGlwbGFuZShmb3JtYXQpKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfbGF5ZXJfY29uZmlnLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjlkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX2NvbmZpZy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAidnVsa2FuL3Z1bGthbi5oIgorI2luY2x1ZGUgInZ1bGthbi92a19sYXllci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIERlZmluaXRpb25zIGZvciBEZWJ1ZyBBY3Rpb25zCit0eXBlZGVmIGVudW0gVmtMYXllckRiZ0FjdGlvbkJpdHMgeworICAgIFZLX0RCR19MQVlFUl9BQ1RJT05fSUdOT1JFID0gMHgwMDAwMDAwMCwKKyAgICBWS19EQkdfTEFZRVJfQUNUSU9OX0NBTExCQUNLID0gMHgwMDAwMDAwMSwKKyAgICBWS19EQkdfTEFZRVJfQUNUSU9OX0xPR19NU0cgPSAweDAwMDAwMDAyLAorICAgIFZLX0RCR19MQVlFUl9BQ1RJT05fQlJFQUsgPSAweDAwMDAwMDA0LAorICAgIFZLX0RCR19MQVlFUl9BQ1RJT05fREVCVUdfT1VUUFVUID0gMHgwMDAwMDAwOCwKKyAgICBWS19EQkdfTEFZRVJfQUNUSU9OX0RFRkFVTFQgPSAweDQwMDAwMDAwLAorfSBWa0xheWVyRGJnQWN0aW9uQml0czsKK3R5cGVkZWYgVmtGbGFncyBWa0xheWVyRGJnQWN0aW9uRmxhZ3M7CisKK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgVmtGbGFncz4gZGVidWdfYWN0aW9uc19vcHRpb25fZGVmaW5pdGlvbnMgPSB7CisgICAge3N0ZDo6c3RyaW5nKCJWS19EQkdfTEFZRVJfQUNUSU9OX0lHTk9SRSIpLCBWS19EQkdfTEFZRVJfQUNUSU9OX0lHTk9SRX0sCisgICAge3N0ZDo6c3RyaW5nKCJWS19EQkdfTEFZRVJfQUNUSU9OX0NBTExCQUNLIiksIFZLX0RCR19MQVlFUl9BQ1RJT05fQ0FMTEJBQ0t9LAorICAgIHtzdGQ6OnN0cmluZygiVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHIiksIFZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TR30sCisgICAge3N0ZDo6c3RyaW5nKCJWS19EQkdfTEFZRVJfQUNUSU9OX0JSRUFLIiksIFZLX0RCR19MQVlFUl9BQ1RJT05fQlJFQUt9LAorI2lmIGRlZmluZWQoV0lOMzIpCisgICAge3N0ZDo6c3RyaW5nKCJWS19EQkdfTEFZRVJfQUNUSU9OX0RFQlVHX09VVFBVVCIpLCBWS19EQkdfTEFZRVJfQUNUSU9OX0RFQlVHX09VVFBVVH0sCisjZW5kaWYKKyAgICB7c3RkOjpzdHJpbmcoIlZLX0RCR19MQVlFUl9BQ1RJT05fREVGQVVMVCIpLCBWS19EQkdfTEFZRVJfQUNUSU9OX0RFRkFVTFR9fTsKKworY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBWa0ZsYWdzPiByZXBvcnRfZmxhZ3Nfb3B0aW9uX2RlZmluaXRpb25zID0geworICAgIHtzdGQ6OnN0cmluZygid2FybiIpLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUfSwKKyAgICB7c3RkOjpzdHJpbmcoImluZm8iKSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFR9LAorICAgIHtzdGQ6OnN0cmluZygicGVyZiIpLCBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhUfSwKKyAgICB7c3RkOjpzdHJpbmcoImVycm9yIiksIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUfSwKKyAgICB7c3RkOjpzdHJpbmcoImRlYnVnIiksIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhUfX07CisKK1ZLX0xBWUVSX0VYUE9SVCBjb25zdCBjaGFyICpnZXRMYXllck9wdGlvbihjb25zdCBjaGFyICpfb3B0aW9uKTsKK1ZLX0xBWUVSX0VYUE9SVCBGSUxFICpnZXRMYXllckxvZ091dHB1dChjb25zdCBjaGFyICpfb3B0aW9uLCBjb25zdCBjaGFyICpsYXllck5hbWUpOworVktfTEFZRVJfRVhQT1JUIFZrRmxhZ3MgR2V0TGF5ZXJPcHRpb25GbGFncyhzdGQ6OnN0cmluZyBfb3B0aW9uLCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFZrRmxhZ3M+IGNvbnN0ICZlbnVtX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9wdGlvbl9kZWZhdWx0KTsKKworVktfTEFZRVJfRVhQT1JUIHZvaWQgc2V0TGF5ZXJPcHRpb24oY29uc3QgY2hhciAqX29wdGlvbiwgY29uc3QgY2hhciAqX3ZhbCk7CitWS19MQVlFUl9FWFBPUlQgdm9pZCBQcmludE1lc3NhZ2VGbGFncyhWa0ZsYWdzIHZrX2ZsYWdzLCBjaGFyICptc2dfZmxhZ3MpOworVktfTEFZRVJfRVhQT1JUIHZvaWQgUHJpbnRNZXNzYWdlU2V2ZXJpdHkoVmtGbGFncyB2a19mbGFncywgY2hhciAqbXNnX2ZsYWdzKTsKK1ZLX0xBWUVSX0VYUE9SVCB2b2lkIFByaW50TWVzc2FnZVR5cGUoVmtGbGFncyB2a19mbGFncywgY2hhciAqbXNnX2ZsYWdzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfbGF5ZXJfZGF0YS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy92a19sYXllcl9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2ZDJmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfbGF5ZXJfZGF0YS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqLworCisjaWZuZGVmIExBWUVSX0RBVEFfSAorI2RlZmluZSBMQVlFUl9EQVRBX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJ2a19sYXllcl90YWJsZS5oIgorCisvLyBGb3IgdGhlIGdpdmVuIGRhdGEga2V5LCBsb29rIHVwIHRoZSBsYXllcl9kYXRhIGluc3RhbmNlIGZyb20gZ2l2ZW4gbGF5ZXJfZGF0YV9tYXAKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQVRBX1Q+CitEQVRBX1QgKkdldExheWVyRGF0YVB0cih2b2lkICpkYXRhX2tleSwgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQgKiwgREFUQV9UICo+ICZsYXllcl9kYXRhX21hcCkgeworICAgIERBVEFfVCAqZGVidWdfZGF0YTsKKyAgICB0eXBlbmFtZSBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBEQVRBX1QgKj46OmNvbnN0X2l0ZXJhdG9yIGdvdDsKKworICAgIC8qIFRPRE86IFdlIHByb2JhYmx5IHNob3VsZCBsb2NrIGhlcmUsIG9yIGhhdmUgY2FsbGVyIGxvY2sgKi8KKyAgICBnb3QgPSBsYXllcl9kYXRhX21hcC5maW5kKGRhdGFfa2V5KTsKKworICAgIGlmIChnb3QgPT0gbGF5ZXJfZGF0YV9tYXAuZW5kKCkpIHsKKyAgICAgICAgZGVidWdfZGF0YSA9IG5ldyBEQVRBX1Q7CisgICAgICAgIGxheWVyX2RhdGFfbWFwWyh2b2lkICopZGF0YV9rZXldID0gZGVidWdfZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1Z19kYXRhID0gZ290LT5zZWNvbmQ7CisgICAgfQorCisgICAgcmV0dXJuIGRlYnVnX2RhdGE7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQVRBX1Q+Cit2b2lkIEZyZWVMYXllckRhdGFQdHIodm9pZCAqZGF0YV9rZXksIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIERBVEFfVCAqPiAmbGF5ZXJfZGF0YV9tYXApIHsKKyAgICBhdXRvIGdvdCA9IGxheWVyX2RhdGFfbWFwLmZpbmQoZGF0YV9rZXkpOworICAgIGFzc2VydChnb3QgIT0gbGF5ZXJfZGF0YV9tYXAuZW5kKCkpOworCisgICAgZGVsZXRlIGdvdC0+c2Vjb25kOworICAgIGxheWVyX2RhdGFfbWFwLmVyYXNlKGdvdCk7Cit9CisKKyNlbmRpZiAgLy8gTEFZRVJfREFUQV9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX2V4dGVuc2lvbl91dGlscy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX2V4dGVuc2lvbl91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxZTM5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcApAQCAtMCwwICsxLDY2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmgiCisKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBsYXllcnMKKyAqLworCitWS19MQVlFUl9FWFBPUlQgVmtSZXN1bHQgdXRpbF9HZXRFeHRlbnNpb25Qcm9wZXJ0aWVzKGNvbnN0IHVpbnQzMl90IGNvdW50LCBjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKmxheWVyX2V4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICB1aW50MzJfdCBjb3B5X3NpemU7CisKKyAgICBpZiAocFByb3BlcnRpZXMgPT0gTlVMTCB8fCBsYXllcl9leHRlbnNpb25zID09IE5VTEwpIHsKKyAgICAgICAgKnBDb3VudCA9IGNvdW50OworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBjb3B5X3NpemUgPSAqcENvdW50IDwgY291bnQgPyAqcENvdW50IDogY291bnQ7CisgICAgbWVtY3B5KHBQcm9wZXJ0aWVzLCBsYXllcl9leHRlbnNpb25zLCBjb3B5X3NpemUgKiBzaXplb2YoVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKSk7CisgICAgKnBDb3VudCA9IGNvcHlfc2l6ZTsKKyAgICBpZiAoY29weV9zaXplIDwgY291bnQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0lOQ09NUExFVEU7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWa1Jlc3VsdCB1dGlsX0dldExheWVyUHJvcGVydGllcyhjb25zdCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtMYXllclByb3BlcnRpZXMgKmxheWVyX3Byb3BlcnRpZXMsIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgdWludDMyX3QgY29weV9zaXplOworCisgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwgfHwgbGF5ZXJfcHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgICpwQ291bnQgPSBjb3VudDsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgY29weV9zaXplID0gKnBDb3VudCA8IGNvdW50ID8gKnBDb3VudCA6IGNvdW50OworICAgIG1lbWNweShwUHJvcGVydGllcywgbGF5ZXJfcHJvcGVydGllcywgY29weV9zaXplICogc2l6ZW9mKFZrTGF5ZXJQcm9wZXJ0aWVzKSk7CisgICAgKnBDb3VudCA9IGNvcHlfc2l6ZTsKKyAgICBpZiAoY29weV9zaXplIDwgY291bnQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0lOQ09NUExFVEU7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX2V4dGVuc2lvbl91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy92a19sYXllcl9leHRlbnNpb25fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTUxYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy92a19sYXllcl9leHRlbnNpb25fdXRpbHMuaApAQCAtMCwwICsxLDQwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisKKyNpZm5kZWYgTEFZRVJfRVhURU5TSU9OX1VUSUxTX0gKKyNkZWZpbmUgTEFZRVJfRVhURU5TSU9OX1VUSUxTX0gKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYVswXSkpCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGdlbmVyYXRlZCBsYXllcnMKKyAqLworZXh0ZXJuICJDIiB7CisKK1ZLX0xBWUVSX0VYUE9SVCBWa1Jlc3VsdCB1dGlsX0dldEV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgdWludDMyX3QgY291bnQsIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqbGF5ZXJfZXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcyk7CisKK1ZLX0xBWUVSX0VYUE9SVCBWa1Jlc3VsdCB1dGlsX0dldExheWVyUHJvcGVydGllcyhjb25zdCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtMYXllclByb3BlcnRpZXMgKmxheWVyX3Byb3BlcnRpZXMsIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKTsKKworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmICAvLyBMQVlFUl9FWFRFTlNJT05fVVRJTFNfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy92a19sYXllcl9sb2dnaW5nLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI2NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy92a19sYXllcl9sb2dnaW5nLmgKQEAgLTAsMCArMSwxMTIwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBZb3VuZyA8bWFya3lAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBMQVlFUl9MT0dHSU5HX0gKKyNkZWZpbmUgTEFZRVJfTE9HR0lOR19ICisKKyNpbmNsdWRlICJ2a19sb2FkZXJfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9jb25maWcuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9kYXRhLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfdGFibGUuaCIKKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19vYmplY3RfdHlwZXMuaCIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxjaW50dHlwZXM+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIFRPRE86IENvdWxkIGJlIGF1dG9nZW5lcmF0ZWQgZm9yIHRoZSBzcGVjaWZpYyBoYW5kbGVzIGZvciBleHRyYSB0eXBlIHNhZmV0eS4uLgordGVtcGxhdGUgPHR5cGVuYW1lIEhBTkRMRV9UPgorc3RhdGljIGlubGluZSB1aW50NjRfdCBIYW5kbGVUb1VpbnQ2NChIQU5ETEVfVCAqaCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ2NF90PihoKTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBIYW5kbGVUb1VpbnQ2NCh1aW50NjRfdCBoKSB7IHJldHVybiBoOyB9CisKKy8vIERhdGEgd2Ugc3RvcmUgcGVyIGxhYmVsIGZvciBsb2dnaW5nCit0eXBlZGVmIHN0cnVjdCBfTG9nZ2luZ0xhYmVsRGF0YSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBmbG9hdCBjb2xvcls0XTsKK30gTG9nZ2luZ0xhYmVsRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgX2RlYnVnX3JlcG9ydF9kYXRhIHsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpkZWJ1Z19jYWxsYmFja19saXN0OworICAgIFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKmRlZmF1bHRfZGVidWdfY2FsbGJhY2tfbGlzdDsKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCBhY3RpdmVfc2V2ZXJpdGllczsKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIGFjdGl2ZV90eXBlczsKKyAgICBib29sIGdfREVCVUdfUkVQT1JUOworICAgIGJvb2wgZ19ERUJVR19VVElMUzsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6c3RyaW5nPiAqZGVidWdPYmplY3ROYW1lTWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgc3RkOjpzdHJpbmc+ICpkZWJ1Z1V0aWxzT2JqZWN0TmFtZU1hcDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtRdWV1ZSwgc3RkOjp2ZWN0b3I8TG9nZ2luZ0xhYmVsRGF0YT4+ICpkZWJ1Z1V0aWxzUXVldWVMYWJlbHM7CisgICAgYm9vbCBxdWV1ZUxhYmVsSGFzSW5zZXJ0OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa0NvbW1hbmRCdWZmZXIsIHN0ZDo6dmVjdG9yPExvZ2dpbmdMYWJlbERhdGE+PiAqZGVidWdVdGlsc0NtZEJ1ZkxhYmVsczsKKyAgICBib29sIGNtZEJ1ZkxhYmVsSGFzSW5zZXJ0OworfSBkZWJ1Z19yZXBvcnRfZGF0YTsKKwordGVtcGxhdGUgZGVidWdfcmVwb3J0X2RhdGEgKkdldExheWVyRGF0YVB0cjxkZWJ1Z19yZXBvcnRfZGF0YT4odm9pZCAqZGF0YV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBkZWJ1Z19yZXBvcnRfZGF0YSAqPiAmZGF0YV9tYXApOworCitzdGF0aWMgaW5saW5lIHZvaWQgRGVidWdSZXBvcnRGbGFnc1RvQW5ub3RGbGFncyhWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgZHJfZmxhZ3MsIGJvb2wgZGVmYXVsdF9mbGFnX2lzX3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCAqZGFfc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICpkYV90eXBlKSB7CisgICAgLy8gQWxsIGxheWVyIHdhcm5pbmdzIGFyZSBzcGVjIHdhcm5pbmdzIGN1cnJlbnRseS4gIEF0IGxlYXN0IGFzIGZhciBhcyBhbnl0aGluZyBub3Qgc3BlY2lmaWNhbGx5CisgICAgLy8gY2FsbGVkIG91dC4gIEluIHRoZSBmdXR1cmUsIHdlJ2xsIGxhYmVsIHRoaW5ncyB1c2luZyB0aGUgbmV3IHNwbGl0IHNldmVyaXR5IGFuZCB0eXBlIHZhbHVlcy4KKyAgICAqZGFfdHlwZSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9WQUxJREFUSU9OX0JJVF9FWFQ7CisgICAgKmRhX3NldmVyaXR5ID0gMDsKKyAgICBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRhX3NldmVyaXR5IHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfVkVSQk9TRV9CSVRfRVhUOworICAgICAgICAqZGFfdHlwZSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfR0VORVJBTF9CSVRfRVhUOworICAgIH0KKyAgICBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRhX3NldmVyaXR5IHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUOworICAgICAgICAqZGFfdHlwZSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfR0VORVJBTF9CSVRfRVhUOworICAgIH0KKyAgICBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZGFfc2V2ZXJpdHkgfD0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9XQVJOSU5HX0JJVF9FWFQ7CisgICAgICAgICpkYV90eXBlIHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9QRVJGT1JNQU5DRV9CSVRfRVhUOworICAgIH0KKyAgICBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZGFfc2V2ZXJpdHkgfD0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9XQVJOSU5HX0JJVF9FWFQ7CisgICAgfQorICAgIGlmICgoZHJfZmxhZ3MgJiBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZGFfc2V2ZXJpdHkgfD0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9FUlJPUl9CSVRfRVhUOworICAgIH0KK30KKworLy8gRm9yd2FyZCBEZWNsYXJhdGlvbnMKK3N0YXRpYyBpbmxpbmUgYm9vbCBkZWJ1Z19sb2dfbXNnKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhLCBWa0ZsYWdzIG1zZ19mbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzcmNfb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnX2NvZGUsIGNvbnN0IGNoYXIgKmxheWVyX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKnRleHRfdnVpZCA9IE5VTEwpOworCisvLyBBZGQgYSBkZWJ1ZyBtZXNzYWdlIGNhbGxiYWNrIG5vZGUgc3RydWN0dXJlIHRvIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgbGlua2VkIGxpc3QKK3N0YXRpYyBpbmxpbmUgdm9pZCBBZGREZWJ1Z0NhbGxiYWNrTm9kZShkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqKmxpc3RfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpuZXdfbm9kZSkgeworICAgIG5ld19ub2RlLT5wTmV4dCA9ICpsaXN0X2hlYWQ7CisgICAgKmxpc3RfaGVhZCA9IG5ld19ub2RlOworfQorCisvLyBSZW1vdmUgc3BlY2lmaWVkIGRlYnVnIG1lc3NlbmdlciBub2RlIHN0cnVjdHVyZSBmcm9tIHRoZSBzcGVjaWZpZWQgbGlua2VkIGxpc3QKK3N0YXRpYyBpbmxpbmUgdm9pZCBSZW1vdmVEZWJ1Z1V0aWxzTWVzc2VuZ2VyKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhLCBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICoqbGlzdF9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlcikgeworICAgIFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKmN1cl9jYWxsYmFjayA9ICpsaXN0X2hlYWQ7CisgICAgVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqcHJldl9jYWxsYmFjayA9IGN1cl9jYWxsYmFjazsKKyAgICBib29sIG1hdGNoZWQgPSBmYWxzZTsKKyAgICBWa0ZsYWdzIGxvY2FsX3NldmVyaXRpZXMgPSAwOworICAgIFZrRmxhZ3MgbG9jYWxfdHlwZXMgPSAwOworCisgICAgd2hpbGUgKGN1cl9jYWxsYmFjaykgeworICAgICAgICBpZiAoY3VyX2NhbGxiYWNrLT5pc19tZXNzZW5nZXIgJiYgY3VyX2NhbGxiYWNrLT5tZXNzZW5nZXIubWVzc2VuZ2VyID09IG1lc3NlbmdlcikgeworICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7CisgICAgICAgICAgICBwcmV2X2NhbGxiYWNrLT5wTmV4dCA9IGN1cl9jYWxsYmFjay0+cE5leHQ7CisgICAgICAgICAgICBpZiAoKmxpc3RfaGVhZCA9PSBjdXJfY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAqbGlzdF9oZWFkID0gY3VyX2NhbGxiYWNrLT5wTmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnX2xvZ19tc2coZGVidWdfZGF0YSwgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGN1cl9jYWxsYmFjay0+bWVzc2VuZ2VyLm1lc3NlbmdlciksIDAsIDAsICJEZWJ1Z1V0aWxzTWVzc2VuZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlc3Ryb3llZCBtZXNzZW5nZXJcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgICAgbG9jYWxfc2V2ZXJpdGllcyB8PSBjdXJfY2FsbGJhY2stPm1lc3Nlbmdlci5tZXNzYWdlU2V2ZXJpdHk7CisgICAgICAgICAgICBsb2NhbF90eXBlcyB8PSBjdXJfY2FsbGJhY2stPm1lc3Nlbmdlci5tZXNzYWdlVHlwZTsKKyAgICAgICAgfQorICAgICAgICBwcmV2X2NhbGxiYWNrID0gY3VyX2NhbGxiYWNrOworICAgICAgICBjdXJfY2FsbGJhY2sgPSBjdXJfY2FsbGJhY2stPnBOZXh0OworICAgICAgICBpZiAobWF0Y2hlZCkgeworICAgICAgICAgICAgZnJlZShwcmV2X2NhbGxiYWNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1Z19kYXRhLT5hY3RpdmVfc2V2ZXJpdGllcyA9IGxvY2FsX3NldmVyaXRpZXM7CisgICAgZGVidWdfZGF0YS0+YWN0aXZlX3R5cGVzID0gbG9jYWxfdHlwZXM7Cit9CisKKy8vIFJlbW92ZSBzcGVjaWZpZWQgZGVidWcgbWVzc2FnZSBjYWxsYmFjayBub2RlIHN0cnVjdHVyZSBmcm9tIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgbGlua2VkIGxpc3QKK3N0YXRpYyBpbmxpbmUgdm9pZCBSZW1vdmVEZWJ1Z1V0aWxzTWVzc2FnZUNhbGxiYWNrKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhLCBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICoqbGlzdF9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrKSB7CisgICAgVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqY3VyX2NhbGxiYWNrID0gKmxpc3RfaGVhZDsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpwcmV2X2NhbGxiYWNrID0gY3VyX2NhbGxiYWNrOworICAgIGJvb2wgbWF0Y2hlZCA9IGZhbHNlOworICAgIFZrRmxhZ3MgbG9jYWxfc2V2ZXJpdGllcyA9IDA7CisgICAgVmtGbGFncyBsb2NhbF90eXBlcyA9IDA7CisKKyAgICB3aGlsZSAoY3VyX2NhbGxiYWNrKSB7CisgICAgICAgIGlmICghY3VyX2NhbGxiYWNrLT5pc19tZXNzZW5nZXIgJiYgY3VyX2NhbGxiYWNrLT5yZXBvcnQubXNnQ2FsbGJhY2sgPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlOworICAgICAgICAgICAgcHJldl9jYWxsYmFjay0+cE5leHQgPSBjdXJfY2FsbGJhY2stPnBOZXh0OworICAgICAgICAgICAgaWYgKCpsaXN0X2hlYWQgPT0gY3VyX2NhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgKmxpc3RfaGVhZCA9IGN1cl9jYWxsYmFjay0+cE5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWJ1Z19sb2dfbXNnKGRlYnVnX2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihjdXJfY2FsbGJhY2stPnJlcG9ydC5tc2dDYWxsYmFjayksIDAsIDAsICJEZWJ1Z1JlcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXN0cm95ZWQgY2FsbGJhY2tcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgICAgVmtGbGFncyB0aGlzX3NldmVyaXRpZXMgPSAwOworICAgICAgICAgICAgVmtGbGFncyB0aGlzX3R5cGVzID0gMDsKKyAgICAgICAgICAgIERlYnVnUmVwb3J0RmxhZ3NUb0Fubm90RmxhZ3MoY3VyX2NhbGxiYWNrLT5yZXBvcnQubXNnRmxhZ3MsIHRydWUsICZ0aGlzX3NldmVyaXRpZXMsICZ0aGlzX3R5cGVzKTsKKyAgICAgICAgICAgIGxvY2FsX3NldmVyaXRpZXMgfD0gdGhpc19zZXZlcml0aWVzOworICAgICAgICAgICAgbG9jYWxfdHlwZXMgfD0gdGhpc190eXBlczsKKyAgICAgICAgfQorICAgICAgICBwcmV2X2NhbGxiYWNrID0gY3VyX2NhbGxiYWNrOworICAgICAgICBjdXJfY2FsbGJhY2sgPSBjdXJfY2FsbGJhY2stPnBOZXh0OworICAgICAgICBpZiAobWF0Y2hlZCkgeworICAgICAgICAgICAgZnJlZShwcmV2X2NhbGxiYWNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1Z19kYXRhLT5hY3RpdmVfc2V2ZXJpdGllcyA9IGxvY2FsX3NldmVyaXRpZXM7CisgICAgZGVidWdfZGF0YS0+YWN0aXZlX3R5cGVzID0gbG9jYWxfdHlwZXM7Cit9CisKKy8vIFJlbW92ZXMgYWxsIGRlYnVnIGNhbGxiYWNrIGZ1bmN0aW9uIG5vZGVzIGZyb20gdGhlIHNwZWNpZmllZCBjYWxsYmFjayBsaW5rZWQgbGlzdHMgYW5kIGZyZWVzIHRoZWlyIHJlc291cmNlcworc3RhdGljIGlubGluZSB2b2lkIFJlbW92ZUFsbE1lc3NhZ2VDYWxsYmFja3MoZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsIFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKipsaXN0X2hlYWQpIHsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpjdXJyZW50X2NhbGxiYWNrID0gKmxpc3RfaGVhZDsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpwcmV2X2NhbGxiYWNrID0gY3VycmVudF9jYWxsYmFjazsKKworICAgIHdoaWxlIChjdXJyZW50X2NhbGxiYWNrKSB7CisgICAgICAgIHByZXZfY2FsbGJhY2sgPSBjdXJyZW50X2NhbGxiYWNrLT5wTmV4dDsKKyAgICAgICAgaWYgKCFjdXJyZW50X2NhbGxiYWNrLT5pc19tZXNzZW5nZXIpIHsKKyAgICAgICAgICAgIGRlYnVnX2xvZ19tc2coZGVidWdfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpY3VycmVudF9jYWxsYmFjay0+cmVwb3J0Lm1zZ0NhbGxiYWNrLCAwLCAwLCAiRGVidWdSZXBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVidWcgUmVwb3J0IGNhbGxiYWNrcyBub3QgcmVtb3ZlZCBiZWZvcmUgRGVzdHJveUluc3RhbmNlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1Z19sb2dfbXNnKGRlYnVnX2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KWN1cnJlbnRfY2FsbGJhY2stPm1lc3Nlbmdlci5tZXNzZW5nZXIsIDAsIDAsICJNZXNzZW5nZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVidWcgbWVzc2VuZ2VycyBub3QgcmVtb3ZlZCBiZWZvcmUgRGVzdHJveUluc3RhbmNlIik7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShjdXJyZW50X2NhbGxiYWNrKTsKKyAgICAgICAgY3VycmVudF9jYWxsYmFjayA9IHByZXZfY2FsbGJhY2s7CisgICAgfQorICAgICpsaXN0X2hlYWQgPSBOVUxMOworfQorCisvLyBOb3RlIHRoYXQgdGV4dF92dWlkIGlzIGEgZGVmYXVsdCBwYXJhbWV0ZXIsIGFuZCBpcyBvcHRpb25hbC4gIFNlZSB0aGUgYWJvdmUgZm9yd2FyZCBkZWNsYXJhdGlvbgorc3RhdGljIGlubGluZSBib29sIGRlYnVnX2xvZ19tc2coY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsIFZrRmxhZ3MgbXNnX2ZsYWdzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNyY19vYmplY3QsIHNpemVfdCBsb2NhdGlvbiwgaW50MzJfdCBtc2dfY29kZSwgY29uc3QgY2hhciAqbGF5ZXJfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgY2hhciAqdGV4dF92dWlkKSB7CisgICAgYm9vbCBiYWlsID0gZmFsc2U7CisgICAgVmtMYXllckRiZ0Z1bmN0aW9uTm9kZSAqbGF5ZXJfZGJnX25vZGUgPSBOVUxMOworCisgICAgaWYgKGRlYnVnX2RhdGEtPmRlYnVnX2NhbGxiYWNrX2xpc3QgIT0gTlVMTCkgeworICAgICAgICBsYXllcl9kYmdfbm9kZSA9IGRlYnVnX2RhdGEtPmRlYnVnX2NhbGxiYWNrX2xpc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGF5ZXJfZGJnX25vZGUgPSBkZWJ1Z19kYXRhLT5kZWZhdWx0X2RlYnVnX2NhbGxiYWNrX2xpc3Q7CisgICAgfQorCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ3NFWFQgc2V2ZXJpdHk7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCB0eXBlczsKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgY2FsbGJhY2tfZGF0YTsKKyAgICBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBvYmplY3RfbmFtZV9pbmZvOworCisgICAgLy8gQ29udmVydCB0aGUgaW5mbyB0byB0aGUgVktfRVhUX2RlYnVnX3V0aWxzIGZvcm0gaW4gY2FzZSB3ZSBuZWVkIGl0LgorICAgIERlYnVnUmVwb3J0RmxhZ3NUb0Fubm90RmxhZ3MobXNnX2ZsYWdzLCB0cnVlLCAmc2V2ZXJpdHksICZ0eXBlcyk7CisgICAgb2JqZWN0X25hbWVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9OQU1FX0lORk9fRVhUOworICAgIG9iamVjdF9uYW1lX2luZm8ucE5leHQgPSBOVUxMOworICAgIG9iamVjdF9uYW1lX2luZm8ub2JqZWN0VHlwZSA9IGNvbnZlcnREZWJ1Z1JlcG9ydE9iamVjdFRvQ29yZU9iamVjdChvYmplY3RfdHlwZSk7CisgICAgb2JqZWN0X25hbWVfaW5mby5vYmplY3RIYW5kbGUgPSAodWludDY0X3QpKHVpbnRwdHJfdClzcmNfb2JqZWN0OworICAgIG9iamVjdF9uYW1lX2luZm8ucE9iamVjdE5hbWUgPSBOVUxMOworCisgICAgY2FsbGJhY2tfZGF0YS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DQUxMQkFDS19EQVRBX0VYVDsKKyAgICBjYWxsYmFja19kYXRhLnBOZXh0ID0gTlVMTDsKKyAgICBjYWxsYmFja19kYXRhLmZsYWdzID0gMDsKKyAgICBjYWxsYmFja19kYXRhLnBNZXNzYWdlSWROYW1lID0gdGV4dF92dWlkOworICAgIGNhbGxiYWNrX2RhdGEubWVzc2FnZUlkTnVtYmVyID0gbXNnX2NvZGU7CisgICAgY2FsbGJhY2tfZGF0YS5wTWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgY2FsbGJhY2tfZGF0YS5xdWV1ZUxhYmVsQ291bnQgPSAwOworICAgIGNhbGxiYWNrX2RhdGEucFF1ZXVlTGFiZWxzID0gTlVMTDsKKyAgICBjYWxsYmFja19kYXRhLmNtZEJ1ZkxhYmVsQ291bnQgPSAwOworICAgIGNhbGxiYWNrX2RhdGEucENtZEJ1ZkxhYmVscyA9IE5VTEw7CisgICAgY2FsbGJhY2tfZGF0YS5vYmplY3RDb3VudCA9IDE7CisgICAgY2FsbGJhY2tfZGF0YS5wT2JqZWN0cyA9ICZvYmplY3RfbmFtZV9pbmZvOworCisgICAgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgKnF1ZXVlX2xhYmVscyA9IG51bGxwdHI7CisgICAgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgKmNtZF9idWZfbGFiZWxzID0gbnVsbHB0cjsKKyAgICBzdGQ6OnN0cmluZyBuZXdfZGVidWdfcmVwb3J0X21lc3NhZ2UgPSAiIjsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisgICAgaWYgKDAgIT0gc3JjX29iamVjdCkgeworICAgICAgICBvc3MgPDwgIk9iamVjdDogMHgiIDw8IHN0ZDo6aGV4IDw8IHNyY19vYmplY3Q7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBxdWV1ZSwgYWRkIGFueSBxdWV1ZSBsYWJlbHMgdG8gdGhlIGNhbGxiYWNrIGRhdGEuCisgICAgICAgIGlmIChWS19PQkpFQ1RfVFlQRV9RVUVVRSA9PSBvYmplY3RfbmFtZV9pbmZvLm9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIGF1dG8gbGFiZWxfaXRlciA9IGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNRdWV1ZUxhYmVscy0+ZmluZChyZWludGVycHJldF9jYXN0PFZrUXVldWU+KHNyY19vYmplY3QpKTsKKyAgICAgICAgICAgIGlmIChsYWJlbF9pdGVyICE9IGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNRdWV1ZUxhYmVscy0+ZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZV9sYWJlbHMgPSBuZXcgVmtEZWJ1Z1V0aWxzTGFiZWxFWFRbbGFiZWxfaXRlci0+c2Vjb25kLnNpemUoKV07CisgICAgICAgICAgICAgICAgaWYgKG51bGxwdHIgIT0gcXVldWVfbGFiZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlY29yZCB0aGUgbGFiZWxzLCBidXQgcmVjb3JkIHRoZW0gaW4gcmV2ZXJzZSBvcmRlciBzaW5jZSB3ZSB3YW50IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudCBhdCB0aGUgdG9wLgorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbF9zaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGxhYmVsX2l0ZXItPnNlY29uZC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXN0X2luZGV4ID0gbGFiZWxfc2l6ZSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgbGFiZWwgPSAwOyBsYWJlbCA8IGxhYmVsX3NpemU7ICsrbGFiZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX2xhYmVsc1tsYXN0X2luZGV4IC0gbGFiZWxdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTEFCRUxfRVhUOworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfbGFiZWxzW2xhc3RfaW5kZXggLSBsYWJlbF0ucE5leHQgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfbGFiZWxzW2xhc3RfaW5kZXggLSBsYWJlbF0ucExhYmVsTmFtZSA9IGxhYmVsX2l0ZXItPnNlY29uZFtsYWJlbF0ubmFtZS5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfbGFiZWxzW2xhc3RfaW5kZXggLSBsYWJlbF0uY29sb3JbMF0gPSBsYWJlbF9pdGVyLT5zZWNvbmRbbGFiZWxdLmNvbG9yWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfbGFiZWxzW2xhc3RfaW5kZXggLSBsYWJlbF0uY29sb3JbMV0gPSBsYWJlbF9pdGVyLT5zZWNvbmRbbGFiZWxdLmNvbG9yWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfbGFiZWxzW2xhc3RfaW5kZXggLSBsYWJlbF0uY29sb3JbMl0gPSBsYWJlbF9pdGVyLT5zZWNvbmRbbGFiZWxdLmNvbG9yWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfbGFiZWxzW2xhc3RfaW5kZXggLSBsYWJlbF0uY29sb3JbM10gPSBsYWJlbF9pdGVyLT5zZWNvbmRbbGFiZWxdLmNvbG9yWzNdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEucXVldWVMYWJlbENvdW50ID0gbGFiZWxfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfZGF0YS5wUXVldWVMYWJlbHMgPSBxdWV1ZV9sYWJlbHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbW1hbmQgYnVmZmVyLCBhZGQgYW55IGNvbW1hbmQgYnVmZmVyIGxhYmVscyB0byB0aGUgY2FsbGJhY2sgZGF0YS4KKyAgICAgICAgfSBlbHNlIGlmIChWS19PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUiA9PSBvYmplY3RfbmFtZV9pbmZvLm9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIGF1dG8gbGFiZWxfaXRlciA9IGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNDbWRCdWZMYWJlbHMtPmZpbmQocmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRCdWZmZXI+KHNyY19vYmplY3QpKTsKKyAgICAgICAgICAgIGlmIChsYWJlbF9pdGVyICE9IGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNDbWRCdWZMYWJlbHMtPmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY21kX2J1Zl9sYWJlbHMgPSBuZXcgVmtEZWJ1Z1V0aWxzTGFiZWxFWFRbbGFiZWxfaXRlci0+c2Vjb25kLnNpemUoKV07CisgICAgICAgICAgICAgICAgaWYgKG51bGxwdHIgIT0gY21kX2J1Zl9sYWJlbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBsYWJlbHMsIGJ1dCByZWNvcmQgdGhlbSBpbiByZXZlcnNlIG9yZGVyIHNpbmNlIHdlIHdhbnQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50IGF0IHRoZSB0b3AuCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsX3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obGFiZWxfaXRlci0+c2Vjb25kLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhc3RfaW5kZXggPSBsYWJlbF9zaXplIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBsYWJlbCA9IDA7IGxhYmVsIDwgbGFiZWxfc2l6ZTsgKytsYWJlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY21kX2J1Zl9sYWJlbHNbbGFzdF9pbmRleCAtIGxhYmVsXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX0xBQkVMX0VYVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9idWZfbGFiZWxzW2xhc3RfaW5kZXggLSBsYWJlbF0ucE5leHQgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgY21kX2J1Zl9sYWJlbHNbbGFzdF9pbmRleCAtIGxhYmVsXS5wTGFiZWxOYW1lID0gbGFiZWxfaXRlci0+c2Vjb25kW2xhYmVsXS5uYW1lLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfYnVmX2xhYmVsc1tsYXN0X2luZGV4IC0gbGFiZWxdLmNvbG9yWzBdID0gbGFiZWxfaXRlci0+c2Vjb25kW2xhYmVsXS5jb2xvclswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9idWZfbGFiZWxzW2xhc3RfaW5kZXggLSBsYWJlbF0uY29sb3JbMV0gPSBsYWJlbF9pdGVyLT5zZWNvbmRbbGFiZWxdLmNvbG9yWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgY21kX2J1Zl9sYWJlbHNbbGFzdF9pbmRleCAtIGxhYmVsXS5jb2xvclsyXSA9IGxhYmVsX2l0ZXItPnNlY29uZFtsYWJlbF0uY29sb3JbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfYnVmX2xhYmVsc1tsYXN0X2luZGV4IC0gbGFiZWxdLmNvbG9yWzNdID0gbGFiZWxfaXRlci0+c2Vjb25kW2xhYmVsXS5jb2xvclszXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhLmNtZEJ1ZkxhYmVsQ291bnQgPSBsYWJlbF9zaXplOworICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhLnBDbWRCdWZMYWJlbHMgPSBjbWRfYnVmX2xhYmVsczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTG9vayBmb3IgYW55IGRlYnVnIHV0aWxzIG9yIG1hcmtlciBuYW1lcyB0byB1c2UgZm9yIHRoaXMgb2JqZWN0CisgICAgICAgIG9iamVjdF9uYW1lX2luZm8ucE9iamVjdE5hbWUgPSBOVUxMOworICAgICAgICBhdXRvIHV0aWxzX25hbWVfaXRlciA9IGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNPYmplY3ROYW1lTWFwLT5maW5kKHNyY19vYmplY3QpOworICAgICAgICBpZiAodXRpbHNfbmFtZV9pdGVyICE9IGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNPYmplY3ROYW1lTWFwLT5lbmQoKSkgeworICAgICAgICAgICAgb2JqZWN0X25hbWVfaW5mby5wT2JqZWN0TmFtZSA9IHV0aWxzX25hbWVfaXRlci0+c2Vjb25kLmNfc3RyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdXRvIG1hcmtlcl9uYW1lX2l0ZXIgPSBkZWJ1Z19kYXRhLT5kZWJ1Z09iamVjdE5hbWVNYXAtPmZpbmQoc3JjX29iamVjdCk7CisgICAgICAgICAgICBpZiAobWFya2VyX25hbWVfaXRlciAhPSBkZWJ1Z19kYXRhLT5kZWJ1Z09iamVjdE5hbWVNYXAtPmVuZCgpKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0X25hbWVfaW5mby5wT2JqZWN0TmFtZSA9IG1hcmtlcl9uYW1lX2l0ZXItPnNlY29uZC5jX3N0cigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChOVUxMICE9IG9iamVjdF9uYW1lX2luZm8ucE9iamVjdE5hbWUpIHsKKyAgICAgICAgICAgIG9zcyA8PCAiIChOYW1lID0gIiA8PCBvYmplY3RfbmFtZV9pbmZvLnBPYmplY3ROYW1lIDw8ICIgOiBUeXBlID0gIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9zcyA8PCAiIChUeXBlID0gIjsKKyAgICAgICAgfQorICAgICAgICBvc3MgPDwgc3RkOjp0b19zdHJpbmcob2JqZWN0X3R5cGUpIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgICBvc3MgPDwgIk9iamVjdDogVktfTlVMTF9IQU5ETEUgKFR5cGUgPSAiIDw8IHN0ZDo6dG9fc3RyaW5nKG9iamVjdF90eXBlKSA8PCAiKSI7CisgICAgfQorICAgIG5ld19kZWJ1Z19yZXBvcnRfbWVzc2FnZSArPSBvc3Muc3RyKCk7CisgICAgbmV3X2RlYnVnX3JlcG9ydF9tZXNzYWdlICs9ICIgfCAiOworICAgIG5ld19kZWJ1Z19yZXBvcnRfbWVzc2FnZSArPSBtZXNzYWdlOworCisgICAgd2hpbGUgKGxheWVyX2RiZ19ub2RlKSB7CisgICAgICAgIC8vIElmIHRoZSBhcHAgdXNlcyB0aGUgVktfRVhUX2RlYnVnX3JlcG9ydCBleHRlbnNpb24sIGNhbGwgYWxsIG9mIHRob3NlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLgorICAgICAgICBpZiAoIWxheWVyX2RiZ19ub2RlLT5pc19tZXNzZW5nZXIgJiYgKGxheWVyX2RiZ19ub2RlLT5yZXBvcnQubXNnRmxhZ3MgJiBtc2dfZmxhZ3MpKSB7CisgICAgICAgICAgICBpZiAodGV4dF92dWlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBhIHRleHQgdnVpZCBpcyBzdXBwbGllZCBmb3IgdGhlIG9sZCBkZWJ1ZyByZXBvcnQgZXh0ZW5zaW9uLCBwcmVwZW5kIGl0IHRvIHRoZSBtZXNzYWdlIHN0cmluZworICAgICAgICAgICAgICAgIG5ld19kZWJ1Z19yZXBvcnRfbWVzc2FnZS5pbnNlcnQoMCwgIiBdICIpOworICAgICAgICAgICAgICAgIG5ld19kZWJ1Z19yZXBvcnRfbWVzc2FnZS5pbnNlcnQoMCwgdGV4dF92dWlkKTsKKyAgICAgICAgICAgICAgICBuZXdfZGVidWdfcmVwb3J0X21lc3NhZ2UuaW5zZXJ0KDAsICIgWyAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheWVyX2RiZ19ub2RlLT5yZXBvcnQucGZuTXNnQ2FsbGJhY2sobXNnX2ZsYWdzLCBvYmplY3RfdHlwZSwgc3JjX29iamVjdCwgbG9jYXRpb24sIG1zZ19jb2RlLCBsYXllcl9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfZGVidWdfcmVwb3J0X21lc3NhZ2UuY19zdHIoKSwgbGF5ZXJfZGJnX25vZGUtPnBVc2VyRGF0YSkpIHsKKyAgICAgICAgICAgICAgICBiYWlsID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHRoZSBhcHAgdXNlcyB0aGUgVktfRVhUX2RlYnVnX3V0aWxzIGV4dGVuc2lvbiwgY2FsbCBhbGwgb2YgdGhvc2UgcmVnaXN0ZXJlZCBjYWxsYmFja3MuCisgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJfZGJnX25vZGUtPmlzX21lc3NlbmdlciAmJiAobGF5ZXJfZGJnX25vZGUtPm1lc3Nlbmdlci5tZXNzYWdlU2V2ZXJpdHkgJiBzZXZlcml0eSkgJiYKKyAgICAgICAgICAgICAgICAgICAobGF5ZXJfZGJnX25vZGUtPm1lc3Nlbmdlci5tZXNzYWdlVHlwZSAmIHR5cGVzKSkgeworICAgICAgICAgICAgaWYgKGxheWVyX2RiZ19ub2RlLT5tZXNzZW5nZXIucGZuVXNlckNhbGxiYWNrKHN0YXRpY19jYXN0PFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUPihzZXZlcml0eSksIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFja19kYXRhLCBsYXllcl9kYmdfbm9kZS0+cFVzZXJEYXRhKSkgeworICAgICAgICAgICAgICAgIGJhaWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxheWVyX2RiZ19ub2RlID0gbGF5ZXJfZGJnX25vZGUtPnBOZXh0OworICAgIH0KKworICAgIGlmIChudWxscHRyICE9IHF1ZXVlX2xhYmVscykgeworICAgICAgICBkZWxldGVbXSBxdWV1ZV9sYWJlbHM7CisgICAgfQorICAgIGlmIChudWxscHRyICE9IGNtZF9idWZfbGFiZWxzKSB7CisgICAgICAgIGRlbGV0ZVtdIGNtZF9idWZfbGFiZWxzOworICAgIH0KKworICAgIHJldHVybiBiYWlsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRGVidWdBbm5vdEZsYWdzVG9SZXBvcnRGbGFncyhWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBkYV9zZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgZGFfdHlwZSwgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICpkcl9mbGFncykgeworICAgICpkcl9mbGFncyA9IDA7CisKKyAgICBpZiAoKGRhX3NldmVyaXR5ICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9FUlJPUl9CSVRfRVhUKSAhPSAwKSB7CisgICAgICAgICpkcl9mbGFncyB8PSBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVDsKKyAgICB9IGVsc2UgaWYgKChkYV9zZXZlcml0eSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUKSAhPSAwKSB7CisgICAgICAgIGlmICgoZGFfdHlwZSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9QRVJGT1JNQU5DRV9CSVRfRVhUKSAhPSAwKSB7CisgICAgICAgICAgICAqZHJfZmxhZ3MgfD0gVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkcl9mbGFncyB8PSBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgoZGFfc2V2ZXJpdHkgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0lORk9fQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZHJfZmxhZ3MgfD0gVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQ7CisgICAgfSBlbHNlIGlmICgoZGFfc2V2ZXJpdHkgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1ZFUkJPU0VfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZHJfZmxhZ3MgfD0gVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQ7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZGVidWdfbWVzc2VuZ2VyX2xvZ19tc2coY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZV9zZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgKmNhbGxiYWNrX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICptZXNzZW5nZXIpIHsKKyAgICBib29sIGJhaWwgPSBmYWxzZTsKKyAgICBWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICpsYXllcl9kYmdfbm9kZSA9IE5VTEw7CisKKyAgICBpZiAoZGVidWdfZGF0YS0+ZGVidWdfY2FsbGJhY2tfbGlzdCAhPSBOVUxMKSB7CisgICAgICAgIGxheWVyX2RiZ19ub2RlID0gZGVidWdfZGF0YS0+ZGVidWdfY2FsbGJhY2tfbGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgICBsYXllcl9kYmdfbm9kZSA9IGRlYnVnX2RhdGEtPmRlZmF1bHRfZGVidWdfY2FsbGJhY2tfbGlzdDsKKyAgICB9CisKKyAgICBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgb2JqZWN0X2ZsYWdzID0gMDsKKworICAgIERlYnVnQW5ub3RGbGFnc1RvUmVwb3J0RmxhZ3MobWVzc2FnZV9zZXZlcml0eSwgbWVzc2FnZV90eXBlLCAmb2JqZWN0X2ZsYWdzKTsKKworICAgIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIG9iamVjdF9uYW1lX2luZm87CisgICAgb2JqZWN0X25hbWVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9OQU1FX0lORk9fRVhUOworICAgIG9iamVjdF9uYW1lX2luZm8ucE5leHQgPSBOVUxMOworICAgIG9iamVjdF9uYW1lX2luZm8ub2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9FWFQ7CisgICAgb2JqZWN0X25hbWVfaW5mby5vYmplY3RIYW5kbGUgPSBIYW5kbGVUb1VpbnQ2NCgqbWVzc2VuZ2VyKTsKKyAgICBvYmplY3RfbmFtZV9pbmZvLnBPYmplY3ROYW1lID0gTlVMTDsKKyAgICBjYWxsYmFja19kYXRhLT5wT2JqZWN0cyA9ICZvYmplY3RfbmFtZV9pbmZvOworICAgIGNhbGxiYWNrX2RhdGEtPm9iamVjdENvdW50ID0gMTsKKworICAgIHdoaWxlIChsYXllcl9kYmdfbm9kZSkgeworICAgICAgICBpZiAobGF5ZXJfZGJnX25vZGUtPmlzX21lc3NlbmdlciAmJiAobGF5ZXJfZGJnX25vZGUtPm1lc3Nlbmdlci5tZXNzYWdlU2V2ZXJpdHkgJiBtZXNzYWdlX3NldmVyaXR5KSAmJgorICAgICAgICAgICAgKGxheWVyX2RiZ19ub2RlLT5tZXNzZW5nZXIubWVzc2FnZVR5cGUgJiBtZXNzYWdlX3R5cGUpKSB7CisgICAgICAgICAgICBhdXRvIGl0ID0gZGVidWdfZGF0YS0+ZGVidWdVdGlsc09iamVjdE5hbWVNYXAtPmZpbmQob2JqZWN0X25hbWVfaW5mby5vYmplY3RIYW5kbGUpOworICAgICAgICAgICAgaWYgKGl0ICE9IGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNPYmplY3ROYW1lTWFwLT5lbmQoKSkgeworICAgICAgICAgICAgICAgIG9iamVjdF9uYW1lX2luZm8ucE9iamVjdE5hbWUgPSBpdC0+c2Vjb25kLmNfc3RyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGF5ZXJfZGJnX25vZGUtPm1lc3Nlbmdlci5wZm5Vc2VyQ2FsbGJhY2sobWVzc2FnZV9zZXZlcml0eSwgbWVzc2FnZV90eXBlLCBjYWxsYmFja19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2RiZ19ub2RlLT5wVXNlckRhdGEpKSB7CisgICAgICAgICAgICAgICAgYmFpbCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIWxheWVyX2RiZ19ub2RlLT5pc19tZXNzZW5nZXIgJiYgbGF5ZXJfZGJnX25vZGUtPnJlcG9ydC5tc2dGbGFncyAmIG9iamVjdF9mbGFncykgeworICAgICAgICAgICAgYXV0byBpdCA9IGRlYnVnX2RhdGEtPmRlYnVnT2JqZWN0TmFtZU1hcC0+ZmluZChjYWxsYmFja19kYXRhLT5wT2JqZWN0c1swXS5vYmplY3RIYW5kbGUpOworICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUgPSBjb252ZXJ0Q29yZU9iamVjdFRvRGVidWdSZXBvcnRPYmplY3QoY2FsbGJhY2tfZGF0YS0+cE9iamVjdHNbMF0ub2JqZWN0VHlwZSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gZGVidWdfZGF0YS0+ZGVidWdPYmplY3ROYW1lTWFwLT5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXllcl9kYmdfbm9kZS0+cmVwb3J0LnBmbk1zZ0NhbGxiYWNrKG9iamVjdF9mbGFncywgb2JqZWN0X3R5cGUsIGNhbGxiYWNrX2RhdGEtPnBPYmplY3RzWzBdLm9iamVjdEhhbmRsZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhLT5tZXNzYWdlSWROdW1iZXIsIGNhbGxiYWNrX2RhdGEtPnBNZXNzYWdlSWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEtPnBNZXNzYWdlLCBsYXllcl9kYmdfbm9kZS0+cFVzZXJEYXRhKSkgeworICAgICAgICAgICAgICAgICAgICBiYWlsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5ld01zZyA9ICJTcmNPYmplY3QgbmFtZSA9ICI7CisgICAgICAgICAgICAgICAgbmV3TXNnLmFwcGVuZChpdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG5ld01zZy5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBuZXdNc2cuYXBwZW5kKGNhbGxiYWNrX2RhdGEtPnBNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAobGF5ZXJfZGJnX25vZGUtPnJlcG9ydC5wZm5Nc2dDYWxsYmFjayhvYmplY3RfZmxhZ3MsIG9iamVjdF90eXBlLCBjYWxsYmFja19kYXRhLT5wT2JqZWN0c1swXS5vYmplY3RIYW5kbGUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfZGF0YS0+bWVzc2FnZUlkTnVtYmVyLCBjYWxsYmFja19kYXRhLT5wTWVzc2FnZUlkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNc2cuY19zdHIoKSwgbGF5ZXJfZGJnX25vZGUtPnBVc2VyRGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFpbCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxheWVyX2RiZ19ub2RlID0gbGF5ZXJfZGJnX25vZGUtPnBOZXh0OworICAgIH0KKworICAgIHJldHVybiBiYWlsOworfQorCitzdGF0aWMgaW5saW5lIGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z191dGlsc19jcmVhdGVfaW5zdGFuY2UoCisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqdGFibGUsIFZrSW5zdGFuY2UgaW5zdCwgdWludDMyX3QgZXh0ZW5zaW9uX2NvdW50LAorICAgIGNvbnN0IGNoYXIgKmNvbnN0ICplbmFibGVkX2V4dGVuc2lvbnMpICAvLyBsYXllciBvciBleHRlbnNpb24gbmFtZSB0byBiZSBlbmFibGVkCit7CisgICAgZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEgPSAoZGVidWdfcmVwb3J0X2RhdGEgKiltYWxsb2Moc2l6ZW9mKGRlYnVnX3JlcG9ydF9kYXRhKSk7CisgICAgaWYgKCFkZWJ1Z19kYXRhKSByZXR1cm4gTlVMTDsKKworICAgIG1lbXNldChkZWJ1Z19kYXRhLCAwLCBzaXplb2YoZGVidWdfcmVwb3J0X2RhdGEpKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50OyBpKyspIHsKKyAgICAgICAgLy8gVE9ETzogQ2hlY2sgb3RoZXIgcHJvcGVydHkgZmllbGRzCisgICAgICAgIGlmIChzdHJjbXAoZW5hYmxlZF9leHRlbnNpb25zW2ldLCBWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1Z19kYXRhLT5nX0RFQlVHX1JFUE9SVCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGVuYWJsZWRfZXh0ZW5zaW9uc1tpXSwgVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1Z19kYXRhLT5nX0RFQlVHX1VUSUxTID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1Z19kYXRhLT5kZWJ1Z09iamVjdE5hbWVNYXAgPSBuZXcgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz47CisgICAgZGVidWdfZGF0YS0+ZGVidWdVdGlsc09iamVjdE5hbWVNYXAgPSBuZXcgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz47CisgICAgZGVidWdfZGF0YS0+ZGVidWdVdGlsc1F1ZXVlTGFiZWxzID0gbmV3IHN0ZDo6dW5vcmRlcmVkX21hcDxWa1F1ZXVlLCBzdGQ6OnZlY3RvcjxMb2dnaW5nTGFiZWxEYXRhPj47CisgICAgZGVidWdfZGF0YS0+ZGVidWdVdGlsc0NtZEJ1ZkxhYmVscyA9IG5ldyBzdGQ6OnVub3JkZXJlZF9tYXA8VmtDb21tYW5kQnVmZmVyLCBzdGQ6OnZlY3RvcjxMb2dnaW5nTGFiZWxEYXRhPj47CisgICAgZGVidWdfZGF0YS0+cXVldWVMYWJlbEhhc0luc2VydCA9IGZhbHNlOworICAgIGRlYnVnX2RhdGEtPmNtZEJ1ZkxhYmVsSGFzSW5zZXJ0ID0gZmFsc2U7CisgICAgcmV0dXJuIGRlYnVnX2RhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXllcl9kZWJ1Z191dGlsc19kZXN0cm95X2luc3RhbmNlKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhKSB7CisgICAgaWYgKGRlYnVnX2RhdGEpIHsKKyAgICAgICAgUmVtb3ZlQWxsTWVzc2FnZUNhbGxiYWNrcyhkZWJ1Z19kYXRhLCAmZGVidWdfZGF0YS0+ZGVmYXVsdF9kZWJ1Z19jYWxsYmFja19saXN0KTsKKyAgICAgICAgUmVtb3ZlQWxsTWVzc2FnZUNhbGxiYWNrcyhkZWJ1Z19kYXRhLCAmZGVidWdfZGF0YS0+ZGVidWdfY2FsbGJhY2tfbGlzdCk7CisgICAgICAgIGRlbGV0ZSBkZWJ1Z19kYXRhLT5kZWJ1Z09iamVjdE5hbWVNYXA7CisgICAgICAgIGRlbGV0ZSBkZWJ1Z19kYXRhLT5kZWJ1Z1V0aWxzT2JqZWN0TmFtZU1hcDsKKyAgICAgICAgZGVsZXRlIGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNRdWV1ZUxhYmVsczsKKyAgICAgICAgZGVsZXRlIGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNDbWRCdWZMYWJlbHM7CisgICAgICAgIGZyZWUoZGVidWdfZGF0YSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGRlYnVnX3JlcG9ydF9kYXRhICpsYXllcl9kZWJ1Z191dGlsc19jcmVhdGVfZGV2aWNlKGRlYnVnX3JlcG9ydF9kYXRhICppbnN0YW5jZV9kZWJ1Z19kYXRhLCBWa0RldmljZSBkZXZpY2UpIHsKKyAgICAvLyBERUJVR19SRVBPUlQgc2hhcmVzIGRhdGEgYmV0d2VlbiBJbnN0YW5jZSBhbmQgRGV2aWNlLAorICAgIC8vIHNvIGp1c3QgcmV0dXJuIGluc3RhbmNlJ3MgZGF0YSBwb2ludGVyCisgICAgcmV0dXJuIGluc3RhbmNlX2RlYnVnX2RhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXllcl9kZWJ1Z191dGlsc19kZXN0cm95X2RldmljZShWa0RldmljZSBkZXZpY2UpIHsKKyAgICAvLyBOb3RoaW5nIHRvIGRvIHNpbmNlIHdlJ3JlIHVzaW5nIGluc3RhbmNlIGRhdGEgcmVjb3JkCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXllcl9kZXN0cm95X21lc3Nlbmdlcl9jYWxsYmFjayhkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKmFsbG9jYXRvcikgeworICAgIFJlbW92ZURlYnVnVXRpbHNNZXNzZW5nZXIoZGVidWdfZGF0YSwgJmRlYnVnX2RhdGEtPmRlYnVnX2NhbGxiYWNrX2xpc3QsIG1lc3Nlbmdlcik7CisgICAgUmVtb3ZlRGVidWdVdGlsc01lc3NlbmdlcihkZWJ1Z19kYXRhLCAmZGVidWdfZGF0YS0+ZGVmYXVsdF9kZWJ1Z19jYWxsYmFja19saXN0LCBtZXNzZW5nZXIpOworfQorCitzdGF0aWMgaW5saW5lIFZrUmVzdWx0IGxheWVyX2NyZWF0ZV9tZXNzZW5nZXJfY2FsbGJhY2soZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsIGJvb2wgZGVmYXVsdF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKm1lc3NlbmdlcikgeworICAgIFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKnBOZXdEYmdGdW5jTm9kZSA9IChWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICopbWFsbG9jKHNpemVvZihWa0xheWVyRGJnRnVuY3Rpb25Ob2RlKSk7CisgICAgaWYgKCFwTmV3RGJnRnVuY05vZGUpIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgbWVtc2V0KHBOZXdEYmdGdW5jTm9kZSwgMCwgc2l6ZW9mKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUpKTsKKyAgICBwTmV3RGJnRnVuY05vZGUtPmlzX21lc3NlbmdlciA9IHRydWU7CisKKyAgICAvLyBIYW5kbGUgb2YgMCBpcyBsb2dnaW5nX2NhbGxiYWNrIHNvIHVzZSBhbGxvY2F0ZWQgTm9kZSBhZGRyZXNzIGFzIHVuaXF1ZSBoYW5kbGUKKyAgICBpZiAoISgqbWVzc2VuZ2VyKSkgKm1lc3NlbmdlciA9IChWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQpcE5ld0RiZ0Z1bmNOb2RlOworICAgIHBOZXdEYmdGdW5jTm9kZS0+bWVzc2VuZ2VyLm1lc3NlbmdlciA9ICptZXNzZW5nZXI7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5tZXNzZW5nZXIucGZuVXNlckNhbGxiYWNrID0gY3JlYXRlX2luZm8tPnBmblVzZXJDYWxsYmFjazsKKyAgICBwTmV3RGJnRnVuY05vZGUtPm1lc3Nlbmdlci5tZXNzYWdlU2V2ZXJpdHkgPSBjcmVhdGVfaW5mby0+bWVzc2FnZVNldmVyaXR5OworICAgIHBOZXdEYmdGdW5jTm9kZS0+bWVzc2VuZ2VyLm1lc3NhZ2VUeXBlID0gY3JlYXRlX2luZm8tPm1lc3NhZ2VUeXBlOworICAgIHBOZXdEYmdGdW5jTm9kZS0+cFVzZXJEYXRhID0gY3JlYXRlX2luZm8tPnBVc2VyRGF0YTsKKworICAgIGRlYnVnX2RhdGEtPmFjdGl2ZV9zZXZlcml0aWVzIHw9IGNyZWF0ZV9pbmZvLT5tZXNzYWdlU2V2ZXJpdHk7CisgICAgZGVidWdfZGF0YS0+YWN0aXZlX3R5cGVzIHw9IGNyZWF0ZV9pbmZvLT5tZXNzYWdlVHlwZTsKKyAgICBpZiAoZGVmYXVsdF9jYWxsYmFjaykgeworICAgICAgICBBZGREZWJ1Z0NhbGxiYWNrTm9kZShkZWJ1Z19kYXRhLCAmZGVidWdfZGF0YS0+ZGVmYXVsdF9kZWJ1Z19jYWxsYmFja19saXN0LCBwTmV3RGJnRnVuY05vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFkZERlYnVnQ2FsbGJhY2tOb2RlKGRlYnVnX2RhdGEsICZkZWJ1Z19kYXRhLT5kZWJ1Z19jYWxsYmFja19saXN0LCBwTmV3RGJnRnVuY05vZGUpOworICAgIH0KKworICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCBjYWxsYmFja19kYXRhID0ge307CisgICAgY2FsbGJhY2tfZGF0YS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DQUxMQkFDS19EQVRBX0VYVDsKKyAgICBjYWxsYmFja19kYXRhLnBOZXh0ID0gTlVMTDsKKyAgICBjYWxsYmFja19kYXRhLmZsYWdzID0gMDsKKyAgICBjYWxsYmFja19kYXRhLnBNZXNzYWdlSWROYW1lID0gIkxheWVyIEludGVybmFsIE1lc3NhZ2UiOworICAgIGNhbGxiYWNrX2RhdGEubWVzc2FnZUlkTnVtYmVyID0gMDsKKyAgICBjYWxsYmFja19kYXRhLnBNZXNzYWdlID0gIkFkZGVkIG1lc3NlbmdlciI7CisgICAgY2FsbGJhY2tfZGF0YS5xdWV1ZUxhYmVsQ291bnQgPSAwOworICAgIGNhbGxiYWNrX2RhdGEucFF1ZXVlTGFiZWxzID0gTlVMTDsKKyAgICBjYWxsYmFja19kYXRhLmNtZEJ1ZkxhYmVsQ291bnQgPSAwOworICAgIGNhbGxiYWNrX2RhdGEucENtZEJ1ZkxhYmVscyA9IE5VTEw7CisgICAgY2FsbGJhY2tfZGF0YS5vYmplY3RDb3VudCA9IDA7CisgICAgY2FsbGJhY2tfZGF0YS5wT2JqZWN0cyA9IE5VTEw7CisgICAgZGVidWdfbWVzc2VuZ2VyX2xvZ19tc2coZGVidWdfZGF0YSwgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9WRVJCT1NFX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX0dFTkVSQUxfQklUX0VYVCwgJmNhbGxiYWNrX2RhdGEsIG1lc3Nlbmdlcik7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXllcl9kZXN0cm95X3JlcG9ydF9jYWxsYmFjayhkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqYWxsb2NhdG9yKSB7CisgICAgUmVtb3ZlRGVidWdVdGlsc01lc3NhZ2VDYWxsYmFjayhkZWJ1Z19kYXRhLCAmZGVidWdfZGF0YS0+ZGVidWdfY2FsbGJhY2tfbGlzdCwgY2FsbGJhY2spOworICAgIFJlbW92ZURlYnVnVXRpbHNNZXNzYWdlQ2FsbGJhY2soZGVidWdfZGF0YSwgJmRlYnVnX2RhdGEtPmRlZmF1bHRfZGVidWdfY2FsbGJhY2tfbGlzdCwgY2FsbGJhY2spOworfQorCitzdGF0aWMgaW5saW5lIFZrUmVzdWx0IGxheWVyX2NyZWF0ZV9yZXBvcnRfY2FsbGJhY2soZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsIGJvb2wgZGVmYXVsdF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKmFsbG9jYXRvciwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICpjYWxsYmFjaykgeworICAgIFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUgKnBOZXdEYmdGdW5jTm9kZSA9IChWa0xheWVyRGJnRnVuY3Rpb25Ob2RlICopbWFsbG9jKHNpemVvZihWa0xheWVyRGJnRnVuY3Rpb25Ob2RlKSk7CisgICAgaWYgKCFwTmV3RGJnRnVuY05vZGUpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KHBOZXdEYmdGdW5jTm9kZSwgMCwgc2l6ZW9mKFZrTGF5ZXJEYmdGdW5jdGlvbk5vZGUpKTsKKyAgICBwTmV3RGJnRnVuY05vZGUtPmlzX21lc3NlbmdlciA9IGZhbHNlOworCisgICAgLy8gSGFuZGxlIG9mIDAgaXMgbG9nZ2luZ19jYWxsYmFjayBzbyB1c2UgYWxsb2NhdGVkIE5vZGUgYWRkcmVzcyBhcyB1bmlxdWUgaGFuZGxlCisgICAgaWYgKCEoKmNhbGxiYWNrKSkgKmNhbGxiYWNrID0gKFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVClwTmV3RGJnRnVuY05vZGU7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5yZXBvcnQubXNnQ2FsbGJhY2sgPSAqY2FsbGJhY2s7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5yZXBvcnQucGZuTXNnQ2FsbGJhY2sgPSBjcmVhdGVfaW5mby0+cGZuQ2FsbGJhY2s7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5yZXBvcnQubXNnRmxhZ3MgPSBjcmVhdGVfaW5mby0+ZmxhZ3M7CisgICAgcE5ld0RiZ0Z1bmNOb2RlLT5wVXNlckRhdGEgPSBjcmVhdGVfaW5mby0+cFVzZXJEYXRhOworCisgICAgVmtGbGFncyBsb2NhbF9zZXZlcml0eSA9IDA7CisgICAgVmtGbGFncyBsb2NhbF90eXBlID0gMDsKKyAgICBEZWJ1Z1JlcG9ydEZsYWdzVG9Bbm5vdEZsYWdzKGNyZWF0ZV9pbmZvLT5mbGFncywgdHJ1ZSwgJmxvY2FsX3NldmVyaXR5LCAmbG9jYWxfdHlwZSk7CisgICAgZGVidWdfZGF0YS0+YWN0aXZlX3NldmVyaXRpZXMgfD0gbG9jYWxfc2V2ZXJpdHk7CisgICAgZGVidWdfZGF0YS0+YWN0aXZlX3R5cGVzIHw9IGxvY2FsX3R5cGU7CisgICAgaWYgKGRlZmF1bHRfY2FsbGJhY2spIHsKKyAgICAgICAgQWRkRGVidWdDYWxsYmFja05vZGUoZGVidWdfZGF0YSwgJmRlYnVnX2RhdGEtPmRlZmF1bHRfZGVidWdfY2FsbGJhY2tfbGlzdCwgcE5ld0RiZ0Z1bmNOb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBZGREZWJ1Z0NhbGxiYWNrTm9kZShkZWJ1Z19kYXRhLCAmZGVidWdfZGF0YS0+ZGVidWdfY2FsbGJhY2tfbGlzdCwgcE5ld0RiZ0Z1bmNOb2RlKTsKKyAgICB9CisKKyAgICBkZWJ1Z19sb2dfbXNnKGRlYnVnX2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0VYVCwgKHVpbnQ2NF90KSpjYWxsYmFjaywgMCwKKyAgICAgICAgICAgICAgICAgIDAsICJEZWJ1Z1JlcG9ydCIsICJBZGRlZCBjYWxsYmFjayIpOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIFBGTl92a1ZvaWRGdW5jdGlvbiBkZWJ1Z191dGlsc19nZXRfaW5zdGFuY2VfcHJvY19hZGRyKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhLCBjb25zdCBjaGFyICpmdW5jX25hbWUpIHsKKyAgICBpZiAoIWRlYnVnX2RhdGEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkZWJ1Z19kYXRhLT5nX0RFQlVHX1JFUE9SVCkgeworICAgICAgICBpZiAoIXN0cmNtcChmdW5jX25hbWUsICJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKSkgeworICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY21wKGZ1bmNfbmFtZSwgInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKSkgeworICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNtcChmdW5jX25hbWUsICJ2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCIpKSB7CisgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbil2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVidWdfZGF0YS0+Z19ERUJVR19VVElMUykgeworICAgICAgICBpZiAoIXN0cmNtcChmdW5jX25hbWUsICJ2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiKSkgeworICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY21wKGZ1bmNfbmFtZSwgInZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiKSkgeworICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNtcChmdW5jX25hbWUsICJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIikpIHsKKyAgICAgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIFRoaXMgdXRpbGl0eSAoY2FsbGVkIGF0IHZrQ3JlYXRlSW5zdGFuY2UoKSB0aW1lKSwgbG9va3MgYXQgYSBwTmV4dCBjaGFpbi4KKy8vIEl0IGNvdW50cyBhbnkgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBzdHJ1Y3RzIHRoYXQgaXQgZmluZHMuICBJdAorLy8gdGhlbiBhbGxvY2F0ZXMgYW4gYXJyYXkgdGhhdCBjYW4gaG9sZCB0aGF0IG1hbnkgc3RydWN0cywgYXMgd2VsbCBhcyB0aGF0CisvLyBtYW55IFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBoYW5kbGVzLiAgSXQgdGhlbiBjb3BpZXMgZWFjaAorLy8gVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCwgYW5kIGluaXRpYWxpemVzIGVhY2ggaGFuZGxlLgorc3RhdGljIGlubGluZSBWa1Jlc3VsdCBsYXllcl9jb3B5X3RtcF9yZXBvcnRfY2FsbGJhY2tzKGNvbnN0IHZvaWQgKnBDaGFpbiwgdWludDMyX3QgKm51bV9jYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqKmluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqKmNhbGxiYWNrcykgeworICAgIHVpbnQzMl90IG4gPSAqbnVtX2NhbGxiYWNrcyA9IDA7CisKKyAgICBjb25zdCB2b2lkICpwTmV4dCA9IHBDaGFpbjsKKyAgICB3aGlsZSAocE5leHQpIHsKKyAgICAgICAgLy8gMXN0LCBjb3VudCB0aGUgbnVtYmVyIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQ6CisgICAgICAgIGlmICgoKFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKilwTmV4dCktPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DUkVBVEVfSU5GT19FWFQpIHsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICBwTmV4dCA9ICh2b2lkICopKChWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICopcE5leHQpLT5wTmV4dDsKKyAgICB9CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvLyAybmQsIGFsbG9jYXRlIG1lbW9yeSBmb3IgZWFjaCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUOgorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKnBJbmZvcyA9ICppbmZvcyA9CisgICAgICAgICgoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqKW1hbGxvYyhuICogc2l6ZW9mKFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQpKSk7CisgICAgaWYgKCFwSW5mb3MpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisgICAgLy8gM3JkLCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgdW5pcXVlIGhhbmRsZSBmb3IgZWFjaCBjYWxsYmFjazoKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKnBDYWxsYmFja3MgPSAqY2FsbGJhY2tzID0gKChWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKiltYWxsb2MobiAqIHNpemVvZihWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpKSk7CisgICAgaWYgKCFwQ2FsbGJhY2tzKSB7CisgICAgICAgIGZyZWUocEluZm9zKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisgICAgLy8gNHRoLCBjb3B5IGVhY2ggVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBmb3IgdXNlIGJ5CisgICAgLy8gdmtEZXN0cm95SW5zdGFuY2UsIGFuZCBhc3NpZ24gYSB1bmlxdWUgaGFuZGxlIHRvIGVhY2ggY2FsbGJhY2sgKGp1c3QKKyAgICAvLyB1c2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcGllZCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKToKKyAgICBwTmV4dCA9IHBDaGFpbjsKKyAgICB3aGlsZSAocE5leHQpIHsKKyAgICAgICAgaWYgKCgoVmtJbnN0YW5jZUNyZWF0ZUluZm8gKilwTmV4dCktPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DUkVBVEVfSU5GT19FWFQpIHsKKyAgICAgICAgICAgIG1lbWNweShwSW5mb3MsIHBOZXh0LCBzaXplb2YoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCkpOworICAgICAgICAgICAgKnBDYWxsYmFja3MrKyA9IChWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpcEluZm9zKys7CisgICAgICAgIH0KKyAgICAgICAgcE5leHQgPSAodm9pZCAqKSgoVmtJbnN0YW5jZUNyZWF0ZUluZm8gKilwTmV4dCktPnBOZXh0OworICAgIH0KKworICAgICpudW1fY2FsbGJhY2tzID0gbjsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworLy8gVGhpcyB1dGlsaXR5IGZyZWVzIHRoZSBhcnJheXMgYWxsb2NhdGVkIGJ5IGxheWVyX2NvcHlfdG1wX3JlcG9ydF9jYWxsYmFja3MoKQorc3RhdGljIGlubGluZSB2b2lkIGxheWVyX2ZyZWVfdG1wX3JlcG9ydF9jYWxsYmFja3MoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqaW5mb3MsIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqY2FsbGJhY2tzKSB7CisgICAgZnJlZShpbmZvcyk7CisgICAgZnJlZShjYWxsYmFja3MpOworfQorCisvLyBUaGlzIHV0aWxpdHkgZW5hYmxlcyBhbGwgb2YgdGhlIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgc3RydWN0cworLy8gdGhhdCB3ZXJlIGNvcGllZCBieSBsYXllcl9jb3B5X3RtcF9yZXBvcnRfY2FsbGJhY2tzKCkKK3N0YXRpYyBpbmxpbmUgVmtSZXN1bHQgbGF5ZXJfZW5hYmxlX3RtcF9yZXBvcnRfY2FsbGJhY2tzKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhLCB1aW50MzJfdCBudW1fY2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKmNhbGxiYWNrcykgeworICAgIFZrUmVzdWx0IHJ0biA9IFZLX1NVQ0NFU1M7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9jYWxsYmFja3M7IGkrKykgeworICAgICAgICBydG4gPSBsYXllcl9jcmVhdGVfcmVwb3J0X2NhbGxiYWNrKGRlYnVnX2RhdGEsIGZhbHNlLCAmaW5mb3NbaV0sIE5VTEwsICZjYWxsYmFja3NbaV0pOworICAgICAgICBpZiAocnRuICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBsYXllcl9kZXN0cm95X3JlcG9ydF9jYWxsYmFjayhkZWJ1Z19kYXRhLCBjYWxsYmFja3Nbal0sIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnRuOworfQorCisvLyBUaGlzIHV0aWxpdHkgZGlzYWJsZXMgYWxsIG9mIHRoZSBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIHN0cnVjdHMKKy8vIHRoYXQgd2VyZSBjb3BpZWQgYnkgbGF5ZXJfY29weV90bXBfcmVwb3J0X2NhbGxiYWNrcygpCitzdGF0aWMgaW5saW5lIHZvaWQgbGF5ZXJfZGlzYWJsZV90bXBfcmVwb3J0X2NhbGxiYWNrcyhkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgdWludDMyX3QgbnVtX2NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAqY2FsbGJhY2tzKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9jYWxsYmFja3M7IGkrKykgeworICAgICAgICBsYXllcl9kZXN0cm95X3JlcG9ydF9jYWxsYmFjayhkZWJ1Z19kYXRhLCBjYWxsYmFja3NbaV0sIE5VTEwpOworICAgIH0KK30KKworLy8gVGhpcyB1dGlsaXR5IChjYWxsZWQgYXQgdmtDcmVhdGVJbnN0YW5jZSgpIHRpbWUpLCBsb29rcyBhdCBhIHBOZXh0IGNoYWluLgorLy8gSXQgY291bnRzIGFueSBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIHN0cnVjdHMgdGhhdCBpdCBmaW5kcy4gIEl0CisvLyB0aGVuIGFsbG9jYXRlcyBhbiBhcnJheSB0aGF0IGNhbiBob2xkIHRoYXQgbWFueSBzdHJ1Y3RzLCBhcyB3ZWxsIGFzIHRoYXQKKy8vIG1hbnkgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIGhhbmRsZXMuICBJdCB0aGVuIGNvcGllcyBlYWNoCisvLyBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULCBhbmQgaW5pdGlhbGl6ZXMgZWFjaCBoYW5kbGUuCitzdGF0aWMgaW5saW5lIFZrUmVzdWx0IGxheWVyX2NvcHlfdG1wX2RlYnVnX21lc3NlbmdlcnMoY29uc3Qgdm9pZCAqcENoYWluLCB1aW50MzJfdCAqbnVtX21lc3NlbmdlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqKmluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqKm1lc3NlbmdlcnMpIHsKKyAgICB1aW50MzJfdCBuID0gKm51bV9tZXNzZW5nZXJzID0gMDsKKworICAgIGNvbnN0IHZvaWQgKnBOZXh0ID0gcENoYWluOworICAgIHdoaWxlIChwTmV4dCkgeworICAgICAgICAvLyAxc3QsIGNvdW50IHRoZSBudW1iZXIgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVDoKKyAgICAgICAgaWYgKCgoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqKXBOZXh0KS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVCkgeworICAgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIHBOZXh0ID0gKHZvaWQgKikoKFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgKilwTmV4dCktPnBOZXh0OworICAgIH0KKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIC8vIDJuZCwgYWxsb2NhdGUgbWVtb3J5IGZvciBlYWNoIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQ6CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqcEluZm9zID0gKmluZm9zID0KKyAgICAgICAgKChWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICopbWFsbG9jKG4gKiBzaXplb2YoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCkpKTsKKyAgICBpZiAoIXBJbmZvcykgeworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKyAgICAvLyAzcmQsIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSB1bmlxdWUgaGFuZGxlIGZvciBlYWNoIG1lc3NlbmdlcjoKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKnBNZXNzZW5nZXJzID0gKm1lc3NlbmdlcnMgPQorICAgICAgICAoKFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqKW1hbGxvYyhuICogc2l6ZW9mKFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCkpKTsKKyAgICBpZiAoIXBNZXNzZW5nZXJzKSB7CisgICAgICAgIGZyZWUocEluZm9zKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisgICAgLy8gNHRoLCBjb3B5IGVhY2ggVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBmb3IgdXNlIGJ5CisgICAgLy8gdmtEZXN0cm95SW5zdGFuY2UsIGFuZCBhc3NpZ24gYSB1bmlxdWUgaGFuZGxlIHRvIGVhY2ggY2FsbGJhY2sgKGp1c3QKKyAgICAvLyB1c2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcGllZCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKToKKyAgICBwTmV4dCA9IHBDaGFpbjsKKyAgICB3aGlsZSAocE5leHQpIHsKKyAgICAgICAgaWYgKCgoVmtJbnN0YW5jZUNyZWF0ZUluZm8gKilwTmV4dCktPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DUkVBVEVfSU5GT19FWFQpIHsKKyAgICAgICAgICAgIG1lbWNweShwSW5mb3MsIHBOZXh0LCBzaXplb2YoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCkpOworICAgICAgICAgICAgKnBNZXNzZW5nZXJzKysgPSAoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKXBJbmZvcysrOworICAgICAgICB9CisgICAgICAgIHBOZXh0ID0gKHZvaWQgKikoKFZrSW5zdGFuY2VDcmVhdGVJbmZvICopcE5leHQpLT5wTmV4dDsKKyAgICB9CisKKyAgICAqbnVtX21lc3NlbmdlcnMgPSBuOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisvLyBUaGlzIHV0aWxpdHkgZnJlZXMgdGhlIGFycmF5cyBhbGxvY2F0ZWQgYnkgbGF5ZXJfY29weV90bXBfZGVidWdfbWVzc2VuZ2VycygpCitzdGF0aWMgaW5saW5lIHZvaWQgbGF5ZXJfZnJlZV90bXBfZGVidWdfbWVzc2VuZ2VycyhWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICppbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqbWVzc2VuZ2VycykgeworICAgIGZyZWUoaW5mb3MpOworICAgIGZyZWUobWVzc2VuZ2Vycyk7Cit9CisKKy8vIFRoaXMgdXRpbGl0eSBlbmFibGVzIGFsbCBvZiB0aGUgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBzdHJ1Y3RzCisvLyB0aGF0IHdlcmUgY29waWVkIGJ5IGxheWVyX2NvcHlfdG1wX2RlYnVnX21lc3NlbmdlcnMoKQorc3RhdGljIGlubGluZSBWa1Jlc3VsdCBsYXllcl9lbmFibGVfdG1wX2RlYnVnX21lc3NlbmdlcnMoZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsIHVpbnQzMl90IG51bV9tZXNzZW5nZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKm1lc3NlbmdlcnMpIHsKKyAgICBWa1Jlc3VsdCBydG4gPSBWS19TVUNDRVNTOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fbWVzc2VuZ2VyczsgaSsrKSB7CisgICAgICAgIHJ0biA9IGxheWVyX2NyZWF0ZV9tZXNzZW5nZXJfY2FsbGJhY2soZGVidWdfZGF0YSwgZmFsc2UsICZpbmZvc1tpXSwgTlVMTCwgJm1lc3NlbmdlcnNbaV0pOworICAgICAgICBpZiAocnRuICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBsYXllcl9kZXN0cm95X21lc3Nlbmdlcl9jYWxsYmFjayhkZWJ1Z19kYXRhLCBtZXNzZW5nZXJzW2pdLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBydG47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ0bjsKK30KKworLy8gVGhpcyB1dGlsaXR5IGRpc2FibGVzIGFsbCBvZiB0aGUgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBzdHJ1Y3RzCisvLyB0aGF0IHdlcmUgY29waWVkIGJ5IGxheWVyX2NvcHlfdG1wX2RlYnVnX21lc3NlbmdlcnMoKQorc3RhdGljIGlubGluZSB2b2lkIGxheWVyX2Rpc2FibGVfdG1wX2RlYnVnX21lc3NlbmdlcnMoZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsIHVpbnQzMl90IG51bV9tZXNzZW5nZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICptZXNzZW5nZXJzKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9tZXNzZW5nZXJzOyBpKyspIHsKKyAgICAgICAgbGF5ZXJfZGVzdHJveV9tZXNzZW5nZXJfY2FsbGJhY2soZGVidWdfZGF0YSwgbWVzc2VuZ2Vyc1tpXSwgTlVMTCk7CisgICAgfQorfQorCisvLyBDaGVja3MgaWYgdGhlIG1lc3NhZ2Ugd2lsbCBnZXQgbG9nZ2VkLgorLy8gQWxsb3dzIGxheWVyIHRvIGRlZmVyIGNvbGxlY3RpbmcgJiBmb3JtYXRpbmcgZGF0YSBpZiB0aGUKKy8vIG1lc3NhZ2Ugd2lsbCBiZSBkaXNjYXJkZWQuCitzdGF0aWMgaW5saW5lIGJvb2wgd2lsbF9sb2dfbXNnKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhLCBWa0ZsYWdzIG1zZ19mbGFncykgeworICAgIFZrRmxhZ3MgbG9jYWxfc2V2ZXJpdHkgPSAwOworICAgIFZrRmxhZ3MgbG9jYWxfdHlwZSA9IDA7CisgICAgRGVidWdSZXBvcnRGbGFnc1RvQW5ub3RGbGFncyhtc2dfZmxhZ3MsIHRydWUsICZsb2NhbF9zZXZlcml0eSwgJmxvY2FsX3R5cGUpOworICAgIGlmICghZGVidWdfZGF0YSB8fCAhKGRlYnVnX2RhdGEtPmFjdGl2ZV9zZXZlcml0aWVzICYgbG9jYWxfc2V2ZXJpdHkpIHx8ICEoZGVidWdfZGF0YS0+YWN0aXZlX3R5cGVzICYgbG9jYWxfdHlwZSkpIHsKKyAgICAgICAgLy8gTWVzc2FnZSBpcyBub3Qgd2FudGVkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyNpZm5kZWYgV0lOMzIKK3N0YXRpYyBpbmxpbmUgaW50IHN0cmluZ19zcHJpbnRmKHN0ZDo6c3RyaW5nICpvdXRwdXQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCBzdHJpbmdfc3ByaW50ZihzdGQ6OnN0cmluZyAqb3V0cHV0LCBjb25zdCBjaGFyICpmbXQsIC4uLikgeworICAgIHN0ZDo6c3RyaW5nICZmb3JtYXR0ZWQgPSAqb3V0cHV0OworICAgIHZhX2xpc3QgYXJncHRyOworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKKyAgICBpbnQgcmVzZXJ2ZSA9IHZzbnByaW50ZihudWxscHRyLCAwLCBmbXQsIGFyZ3B0cik7CisgICAgdmFfZW5kKGFyZ3B0cik7CisgICAgZm9ybWF0dGVkLnJlc2VydmUocmVzZXJ2ZSArIDEpOworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKKyAgICBpbnQgcmVzdWx0ID0gdnNucHJpbnRmKChjaGFyICopZm9ybWF0dGVkLmRhdGEoKSwgZm9ybWF0dGVkLmNhcGFjaXR5KCksIGZtdCwgYXJncHRyKTsKKyAgICB2YV9lbmQoYXJncHRyKTsKKyAgICBhc3NlcnQocmVzdWx0ID09IHJlc2VydmUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBXSU4zMgorc3RhdGljIGlubGluZSBpbnQgdmFzcHJpbnRmKGNoYXIgKipzdHJwLCBjaGFyIGNvbnN0ICpmbXQsIHZhX2xpc3QgYXApIHsKKyAgICAqc3RycCA9IG51bGxwdHI7CisgICAgaW50IHNpemUgPSBfdnNjcHJpbnRmKGZtdCwgYXApOworICAgIGlmIChzaXplID49IDApIHsKKyAgICAgICAgKnN0cnAgPSAoY2hhciAqKW1hbGxvYyhzaXplICsgMSk7CisgICAgICAgIGlmICghKnN0cnApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBfdnNucHJpbnRmKCpzdHJwLCBzaXplICsgMSwgZm10LCBhcCk7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorI2VuZGlmCisKKy8vIE91dHB1dCBsb2cgbWVzc2FnZSB2aWEgREVCVUdfUkVQT1JULiBUYWtlcyBmb3JtYXQgYW5kIHZhcmlhYmxlIGFyZyBsaXN0IHNvIHRoYXQgb3V0cHV0IHN0cmluZyBpcyBvbmx5IGNvbXB1dGVkIGlmIGEgbWVzc2FnZQorLy8gbmVlZHMgdG8gYmUgbG9nZ2VkCisjaWZuZGVmIFdJTjMyCitzdGF0aWMgaW5saW5lIGJvb2wgbG9nX21zZyhjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtGbGFncyBtc2dfZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgaW50MzJfdCBtc2dfY29kZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDYsIDcpKSk7CitzdGF0aWMgaW5saW5lIGJvb2wgbG9nX21zZyhjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtGbGFncyBtc2dfZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgc3RkOjpzdHJpbmcgdnVpZF90ZXh0LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCA2LCA3KSkpOworI2VuZGlmCitzdGF0aWMgaW5saW5lIGJvb2wgbG9nX21zZyhjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtGbGFncyBtc2dfZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgaW50MzJfdCBtc2dfY29kZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKKyAgICBWa0ZsYWdzIGxvY2FsX3NldmVyaXR5ID0gMDsKKyAgICBWa0ZsYWdzIGxvY2FsX3R5cGUgPSAwOworICAgIERlYnVnUmVwb3J0RmxhZ3NUb0Fubm90RmxhZ3MobXNnX2ZsYWdzLCB0cnVlLCAmbG9jYWxfc2V2ZXJpdHksICZsb2NhbF90eXBlKTsKKyAgICBpZiAoIWRlYnVnX2RhdGEgfHwgIShkZWJ1Z19kYXRhLT5hY3RpdmVfc2V2ZXJpdGllcyAmIGxvY2FsX3NldmVyaXR5KSB8fCAhKGRlYnVnX2RhdGEtPmFjdGl2ZV90eXBlcyAmIGxvY2FsX3R5cGUpKSB7CisgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IHdhbnRlZAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmFfbGlzdCBhcmdwdHI7CisgICAgdmFfc3RhcnQoYXJncHRyLCBmb3JtYXQpOworICAgIGNoYXIgKnN0cjsKKyAgICBpZiAoLTEgPT0gdmFzcHJpbnRmKCZzdHIsIGZvcm1hdCwgYXJncHRyKSkgeworICAgICAgICAvLyBPbiBmYWlsdXJlLCBnbGliYyB2YXNwcmludGYgbGVhdmVzIHN0ciB1bmRlZmluZWQKKyAgICAgICAgc3RyID0gbnVsbHB0cjsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3B0cik7CisKKyAgICBzdGQ6OnN0cmluZyBzdHJfcGx1c19zcGVjX3RleHQoc3RyKTsKKworICAgIGJvb2wgcmVzdWx0ID0gZGVidWdfbG9nX21zZyhkZWJ1Z19kYXRhLCBtc2dfZmxhZ3MsIG9iamVjdF90eXBlLCBzcmNfb2JqZWN0LCAwLCBtc2dfY29kZSwgIlZhbGlkYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcGx1c19zcGVjX3RleHQuY19zdHIoKSA/IHN0cl9wbHVzX3NwZWNfdGV4dC5jX3N0cigpIDogIkFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgIGZyZWUoc3RyKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBPdmVybG9hZCBvZiBsb2dfbXNnIHRoYXQgdGFrZXMgYSBWVUlEIHN0cmluZyBpbiBwbGFjZSBvZiBhIG51bWVyaWNhbCBWVUlEIGFic3RyYWN0aW9uCitzdGF0aWMgaW5saW5lIGJvb2wgbG9nX21zZyhjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtGbGFncyBtc2dfZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgc3RkOjpzdHJpbmcgdnVpZF90ZXh0LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICAgIFZrRmxhZ3MgbG9jYWxfc2V2ZXJpdHkgPSAwOworICAgIFZrRmxhZ3MgbG9jYWxfdHlwZSA9IDA7CisgICAgRGVidWdSZXBvcnRGbGFnc1RvQW5ub3RGbGFncyhtc2dfZmxhZ3MsIHRydWUsICZsb2NhbF9zZXZlcml0eSwgJmxvY2FsX3R5cGUpOworICAgIGlmICghZGVidWdfZGF0YSB8fCAhKGRlYnVnX2RhdGEtPmFjdGl2ZV9zZXZlcml0aWVzICYgbG9jYWxfc2V2ZXJpdHkpIHx8ICEoZGVidWdfZGF0YS0+YWN0aXZlX3R5cGVzICYgbG9jYWxfdHlwZSkpIHsKKyAgICAgICAgLy8gTWVzc2FnZSBpcyBub3Qgd2FudGVkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2YV9saXN0IGFyZ3B0cjsKKyAgICB2YV9zdGFydChhcmdwdHIsIGZvcm1hdCk7CisgICAgY2hhciAqc3RyOworICAgIGlmICgtMSA9PSB2YXNwcmludGYoJnN0ciwgZm9ybWF0LCBhcmdwdHIpKSB7CisgICAgICAgIC8vIE9uIGZhaWx1cmUsIGdsaWJjIHZhc3ByaW50ZiBsZWF2ZXMgc3RyIHVuZGVmaW5lZAorICAgICAgICBzdHIgPSBudWxscHRyOworICAgIH0KKyAgICB2YV9lbmQoYXJncHRyKTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cl9wbHVzX3NwZWNfdGV4dChzdHIpOworCisgICAgLy8gQXBwZW5kIGxheWVyIHByZWZpeCB3aXRoIFZVSUQgc3RyaW5nLCBwYXNzIGluIFVOREVGSU5FRCBmb3IgbnVtZXJpY2FsIFZVSUQKKyAgICBzdGF0aWMgY29uc3QgaW50IFVOREVGSU5FRF9WVUlEID0gLTE7CisgICAgYm9vbCByZXN1bHQgPSBkZWJ1Z19sb2dfbXNnKGRlYnVnX2RhdGEsIG1zZ19mbGFncywgb2JqZWN0X3R5cGUsIHNyY19vYmplY3QsIDAsIFVOREVGSU5FRF9WVUlELCAiVmFsaWRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9wbHVzX3NwZWNfdGV4dC5jX3N0cigpID8gc3RyX3BsdXNfc3BlY190ZXh0LmNfc3RyKCkgOiAiQWxsb2NhdGlvbiBmYWlsdXJlIiwgdnVpZF90ZXh0LmNfc3RyKCkpOworCisgICAgZnJlZShzdHIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHJlcG9ydF9sb2dfY2FsbGJhY2soVmtGbGFncyBtc2dfZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9ial90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzcmNfb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxheWVyX3ByZWZpeCwgY29uc3QgY2hhciAqbWVzc2FnZSwgdm9pZCAqdXNlcl9kYXRhKSB7CisgICAgY2hhciBtc2dfZmxhZ19zdHJpbmdbMzBdOworCisgICAgUHJpbnRNZXNzYWdlRmxhZ3MobXNnX2ZsYWdzLCBtc2dfZmxhZ19zdHJpbmcpOworCisgICAgZnByaW50ZigoRklMRSAqKXVzZXJfZGF0YSwgIiVzKCVzKTogbXNnX2NvZGU6ICVkOiAlc1xuIiwgbGF5ZXJfcHJlZml4LCBtc2dfZmxhZ19zdHJpbmcsIG1zZ19jb2RlLCBtZXNzYWdlKTsKKyAgICBmZmx1c2goKEZJTEUgKil1c2VyX2RhdGEpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCByZXBvcnRfd2luMzJfZGVidWdfb3V0cHV0X21zZyhWa0ZsYWdzIG1zZ19mbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzcmNfb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXllcl9wcmVmaXgsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyNpZmRlZiBXSU4zMgorICAgIGNoYXIgbXNnX2ZsYWdfc3RyaW5nWzMwXTsKKyAgICBjaGFyIGJ1ZlsyMDQ4XTsKKworICAgIFByaW50TWVzc2FnZUZsYWdzKG1zZ19mbGFncywgbXNnX2ZsYWdfc3RyaW5nKTsKKyAgICBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsICIlcyAoJXMpOiBtc2dfY29kZTogJWQ6ICVzXG4iLCBsYXllcl9wcmVmaXgsIG1zZ19mbGFnX3N0cmluZywgbXNnX2NvZGUsIG1lc3NhZ2UpOworCisgICAgT3V0cHV0RGVidWdTdHJpbmcoYnVmKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBEZWJ1Z0JyZWFrQ2FsbGJhY2soVmtGbGFncyBtc2dGbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgc2l6ZV90IGxvY2F0aW9uLCBpbnQzMl90IG1zZ19jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxheWVyX3ByZWZpeCwgY29uc3QgY2hhciAqbWVzc2FnZSwgdm9pZCAqdXNlcl9kYXRhKSB7CisjaWZkZWYgV0lOMzIKKyAgICBEZWJ1Z0JyZWFrKCk7CisjZWxzZQorICAgIHJhaXNlKFNJR1RSQVApOworI2VuZGlmCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIG1lc3Nlbmdlcl9sb2dfY2FsbGJhY2soVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZV9zZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAqY2FsbGJhY2tfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgICAgY2hhciBtc2dfc2V2ZXJpdHlbMzBdOworICAgIGNoYXIgbXNnX3R5cGVbMzBdOworCisgICAgUHJpbnRNZXNzYWdlU2V2ZXJpdHkobWVzc2FnZV9zZXZlcml0eSwgbXNnX3NldmVyaXR5KTsKKyAgICBQcmludE1lc3NhZ2VUeXBlKG1lc3NhZ2VfdHlwZSwgbXNnX3R5cGUpOworCisgICAgZnByaW50ZigoRklMRSAqKXVzZXJfZGF0YSwgIiVzKCVzIC8gJXMpOiBtc2dOdW06ICVkIC0gJXNcbiIsIGNhbGxiYWNrX2RhdGEtPnBNZXNzYWdlSWROYW1lLCBtc2dfc2V2ZXJpdHksIG1zZ190eXBlLAorICAgICAgICAgICAgY2FsbGJhY2tfZGF0YS0+bWVzc2FnZUlkTnVtYmVyLCBjYWxsYmFja19kYXRhLT5wTWVzc2FnZSk7CisgICAgZnByaW50ZigoRklMRSAqKXVzZXJfZGF0YSwgIiAgICBPYmplY3RzOiAlZFxuIiwgY2FsbGJhY2tfZGF0YS0+b2JqZWN0Q291bnQpOworICAgIGZvciAodWludDMyX3Qgb2JqID0gMDsgb2JqIDwgY2FsbGJhY2tfZGF0YS0+b2JqZWN0Q291bnQ7ICsrb2JqKSB7CisgICAgICAgIGZwcmludGYoKEZJTEUgKil1c2VyX2RhdGEsICIgICAgICAgWyVkXSAweCUiIFBSSXg2NCAiLCB0eXBlOiAlZCwgbmFtZTogJXNcbiIsIG9iaiwKKyAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhLT5wT2JqZWN0c1tvYmpdLm9iamVjdEhhbmRsZSwgY2FsbGJhY2tfZGF0YS0+cE9iamVjdHNbb2JqXS5vYmplY3RUeXBlLAorICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEtPnBPYmplY3RzW29ial0ucE9iamVjdE5hbWUpOworICAgIH0KKyAgICBmZmx1c2goKEZJTEUgKil1c2VyX2RhdGEpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBtZXNzZW5nZXJfd2luMzJfZGVidWdfb3V0cHV0X21zZygKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBtZXNzYWdlX3NldmVyaXR5LCBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VfdHlwZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgKmNhbGxiYWNrX2RhdGEsIHZvaWQgKnVzZXJfZGF0YSkgeworI2lmZGVmIFdJTjMyCisgICAgY2hhciBidWZbMjA0OF07CisgICAgY2hhciBtc2dfc2V2ZXJpdHlbMzBdOworICAgIGNoYXIgbXNnX3R5cGVbMzBdOworCisgICAgUHJpbnRNZXNzYWdlU2V2ZXJpdHkobWVzc2FnZV9zZXZlcml0eSwgbXNnX3NldmVyaXR5KTsKKyAgICBQcmludE1lc3NhZ2VUeXBlKG1lc3NhZ2VfdHlwZSwgbXNnX3R5cGUpOworCisgICAgc2l6ZV90IGJ1ZmZlcl9zcGFjZSA9IHNpemVvZihidWYpIC0gMTsKKyAgICBzaXplX3QgcmVtYWluaW5nX3NwYWNlID0gYnVmZmVyX3NwYWNlOworICAgIF9zbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgIiVzKCVzIC8gJXMpOiBtc2dOdW06ICVkIC0gJXNcbiIsIGNhbGxiYWNrX2RhdGEtPnBNZXNzYWdlSWROYW1lLCBtc2dfc2V2ZXJpdHksIG1zZ190eXBlLAorICAgICAgICAgICAgICBjYWxsYmFja19kYXRhLT5tZXNzYWdlSWROdW1iZXIsIGNhbGxiYWNrX2RhdGEtPnBNZXNzYWdlKTsKKyAgICByZW1haW5pbmdfc3BhY2UgPSBidWZmZXJfc3BhY2UgLSBzdHJsZW4oYnVmKTsKKyAgICBfc25wcmludGYoYnVmLCByZW1haW5pbmdfc3BhY2UsICIgICAgT2JqZWN0czogJWRcbiIsIGNhbGxiYWNrX2RhdGEtPm9iamVjdENvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IG9iaiA9IDA7IG9iaiA8IGNhbGxiYWNrX2RhdGEtPm9iamVjdENvdW50OyArK29iaikgeworICAgICAgICByZW1haW5pbmdfc3BhY2UgPSBidWZmZXJfc3BhY2UgLSBzdHJsZW4oYnVmKTsKKyAgICAgICAgaWYgKHJlbWFpbmluZ19zcGFjZSA+IDApIHsKKyAgICAgICAgICAgIF9zbnByaW50ZihidWYsIHJlbWFpbmluZ19zcGFjZSwgIiAgICAgICBbJWRdIDB4JSIgUFJJeDY0ICIsIHR5cGU6ICVkLCBuYW1lOiAlc1xuIiwgb2JqLAorICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEtPnBPYmplY3RzW29ial0ub2JqZWN0SGFuZGxlLCBjYWxsYmFja19kYXRhLT5wT2JqZWN0c1tvYmpdLm9iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfZGF0YS0+cE9iamVjdHNbb2JqXS5wT2JqZWN0TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgT3V0cHV0RGVidWdTdHJpbmcoYnVmKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBUaGlzIHV0aWxpdHkgY29udmVydHMgZnJvbSB0aGUgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgc3RydWN0dXJlIGludG8gdGhlIGxvZ2dpbmcgdmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlLgorLy8gSW4gdGhlIGxvZ2dpbmcgdmVyc2lvbiwgd2Ugb25seSByZWNvcmQgd2hhdCB3ZSBhYnNvbHV0ZWx5IG5lZWQgdG8gY29udmV5IGJhY2sgdG8gdGhlIGNhbGxiYWNrcy4KK3N0YXRpYyBpbmxpbmUgdm9pZCBJbnNlcnRMYWJlbEludG9Mb2coY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgKnV0aWxzX2xhYmVsLCBzdGQ6OnZlY3RvcjxMb2dnaW5nTGFiZWxEYXRhPiAmbG9nX3ZlY3RvcikgeworICAgIExvZ2dpbmdMYWJlbERhdGEgbG9nX2xhYmVsX2RhdGEgPSB7fTsKKyAgICBsb2dfbGFiZWxfZGF0YS5uYW1lID0gdXRpbHNfbGFiZWwtPnBMYWJlbE5hbWU7CisgICAgbG9nX2xhYmVsX2RhdGEuY29sb3JbMF0gPSB1dGlsc19sYWJlbC0+Y29sb3JbMF07CisgICAgbG9nX2xhYmVsX2RhdGEuY29sb3JbMV0gPSB1dGlsc19sYWJlbC0+Y29sb3JbMV07CisgICAgbG9nX2xhYmVsX2RhdGEuY29sb3JbMl0gPSB1dGlsc19sYWJlbC0+Y29sb3JbMl07CisgICAgbG9nX2xhYmVsX2RhdGEuY29sb3JbM10gPSB1dGlsc19sYWJlbC0+Y29sb3JbM107CisgICAgbG9nX3ZlY3Rvci5wdXNoX2JhY2sobG9nX2xhYmVsX2RhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQmVnaW5RdWV1ZURlYnVnVXRpbHNMYWJlbChkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIFZrUXVldWUgcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAqbGFiZWxfaW5mbykgeworICAgIGlmIChudWxscHRyICE9IGxhYmVsX2luZm8gJiYgbnVsbHB0ciAhPSBsYWJlbF9pbmZvLT5wTGFiZWxOYW1lKSB7CisgICAgICAgIGF1dG8gbGFiZWxfaXRlciA9IHJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzUXVldWVMYWJlbHMtPmZpbmQocXVldWUpOworICAgICAgICBpZiAobGFiZWxfaXRlciA9PSByZXBvcnRfZGF0YS0+ZGVidWdVdGlsc1F1ZXVlTGFiZWxzLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TG9nZ2luZ0xhYmVsRGF0YT4gbmV3X3F1ZXVlX2xhYmVsczsKKyAgICAgICAgICAgIEluc2VydExhYmVsSW50b0xvZyhsYWJlbF9pbmZvLCBuZXdfcXVldWVfbGFiZWxzKTsKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzUXVldWVMYWJlbHMtPmluc2VydCh7cXVldWUsIG5ld19xdWV1ZV9sYWJlbHN9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IHRoaW5nIHdhcyBhIGxhYmVsIGluc2VydCwgd2UgbmVlZCB0byBwb3AgaXQgb2ZmIG9mIHRoZSBsYWJlbCB2ZWN0b3IgYmVmb3JlIGFueQorICAgICAgICAgICAgLy8gY2hhbmdlcy4gVGhpcyBpcyBiZWNhdXNlIGEgbGFiZWwgYWRkZWQgd2l0aCAidmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIgaXMgb25seSBhCisgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgbG9jYXRpb24gdGhhdCBleGlzdHMgdW50aWwgdGhlIG5leHQgb3BlcmF0aW9uIG9jY3Vycy4gIEluIHRoaXMgY2FzZSwgYSBuZXcKKyAgICAgICAgICAgIC8vICJ2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiIGhhcyBvY2N1cnJlZCBlcmFzaW5nIHRoZSBwcmV2aW91cyBpbnNlcnRlZCBsYWJlbC4KKyAgICAgICAgICAgIGlmIChyZXBvcnRfZGF0YS0+cXVldWVMYWJlbEhhc0luc2VydCkgeworICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5xdWV1ZUxhYmVsSGFzSW5zZXJ0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbGFiZWxfaXRlci0+c2Vjb25kLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbnNlcnRMYWJlbEludG9Mb2cobGFiZWxfaW5mbywgbGFiZWxfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIEVuZFF1ZXVlRGVidWdVdGlsc0xhYmVsKGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgVmtRdWV1ZSBxdWV1ZSkgeworICAgIGF1dG8gbGFiZWxfaXRlciA9IHJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzUXVldWVMYWJlbHMtPmZpbmQocXVldWUpOworICAgIGlmIChsYWJlbF9pdGVyICE9IHJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzUXVldWVMYWJlbHMtPmVuZCgpKSB7CisgICAgICAgIC8vIElmIHRoZSBsYXN0IHRoaW5nIHdhcyBhIGxhYmVsIGluc2VydCwgd2UgbmVlZCB0byBwb3AgaXQgb2ZmIG9mIHRoZSBsYWJlbCB2ZWN0b3IgYmVmb3JlIGFueQorICAgICAgICAvLyBjaGFuZ2VzLiBUaGlzIGlzIGJlY2F1c2UgYSBsYWJlbCBhZGRlZCB3aXRoICJ2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIiBpcyBvbmx5IGEKKyAgICAgICAgLy8gdGVtcG9yYXJ5IGxvY2F0aW9uIHRoYXQgZXhpc3RzIHVudGlsIHRoZSBuZXh0IG9wZXJhdGlvbiBvY2N1cnMuICBJbiB0aGlzIGNhc2UsIGEKKyAgICAgICAgLy8gInZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiIGhhcyBvY2N1cnJlZCBlcmFzaW5nIHRoZSBpbnNlcnRlZCBsYWJlbC4KKyAgICAgICAgaWYgKHJlcG9ydF9kYXRhLT5xdWV1ZUxhYmVsSGFzSW5zZXJ0KSB7CisgICAgICAgICAgICByZXBvcnRfZGF0YS0+cXVldWVMYWJlbEhhc0luc2VydCA9IGZhbHNlOworICAgICAgICAgICAgbGFiZWxfaXRlci0+c2Vjb25kLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IHBvcCB0aGUgbm9ybWFsIGl0ZW0KKyAgICAgICAgbGFiZWxfaXRlci0+c2Vjb25kLnBvcF9iYWNrKCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgSW5zZXJ0UXVldWVEZWJ1Z1V0aWxzTGFiZWwoZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBWa1F1ZXVlIHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUICpsYWJlbF9pbmZvKSB7CisgICAgaWYgKG51bGxwdHIgIT0gbGFiZWxfaW5mbyAmJiBudWxscHRyICE9IGxhYmVsX2luZm8tPnBMYWJlbE5hbWUpIHsKKyAgICAgICAgYXV0byBsYWJlbF9pdGVyID0gcmVwb3J0X2RhdGEtPmRlYnVnVXRpbHNRdWV1ZUxhYmVscy0+ZmluZChxdWV1ZSk7CisgICAgICAgIGlmIChsYWJlbF9pdGVyID09IHJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzUXVldWVMYWJlbHMtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMb2dnaW5nTGFiZWxEYXRhPiBuZXdfcXVldWVfbGFiZWxzOworICAgICAgICAgICAgSW5zZXJ0TGFiZWxJbnRvTG9nKGxhYmVsX2luZm8sIG5ld19xdWV1ZV9sYWJlbHMpOworICAgICAgICAgICAgcmVwb3J0X2RhdGEtPmRlYnVnVXRpbHNRdWV1ZUxhYmVscy0+aW5zZXJ0KHtxdWV1ZSwgbmV3X3F1ZXVlX2xhYmVsc30pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgdGhpbmcgd2FzIGEgbGFiZWwgaW5zZXJ0LCB3ZSBuZWVkIHRvIHBvcCBpdCBvZmYgb2YgdGhlIGxhYmVsIHZlY3RvciBiZWZvcmUgYW55CisgICAgICAgICAgICAvLyBjaGFuZ2VzLiBUaGlzIGlzIGJlY2F1c2UgYSBsYWJlbCBhZGRlZCB3aXRoICJ2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIiBpcyBvbmx5IGEKKyAgICAgICAgICAgIC8vIHRlbXBvcmFyeSBsb2NhdGlvbiB0aGF0IGV4aXN0cyB1bnRpbCB0aGUgbmV4dCBvcGVyYXRpb24gb2NjdXJzLiAgSW4gdGhpcyBjYXNlLCBhIG5ldworICAgICAgICAgICAgLy8gInZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiIGhhcyBvY2N1cnJlZCBlcmFzaW5nIHRoZSBwcmV2aW91cyBpbnNlcnRlZCBsYWJlbC4KKyAgICAgICAgICAgIGlmIChyZXBvcnRfZGF0YS0+cXVldWVMYWJlbEhhc0luc2VydCkgeworICAgICAgICAgICAgICAgIGxhYmVsX2l0ZXItPnNlY29uZC5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW5zZXJ0IHRoaXMgbmV3IGxhYmVsIGFuZCBtYXJrIGl0IGFzIG9uZSB0aGF0IGhhcyBiZWVuICJpbnNlcnRlZCIgc28gd2UgY2FuIHJlbW92ZSBpdCBvbgorICAgICAgICAgICAgLy8gdGhlIG5leHQgcXVldWUgbGFiZWwgb3BlcmF0aW9uLgorICAgICAgICAgICAgSW5zZXJ0TGFiZWxJbnRvTG9nKGxhYmVsX2luZm8sIGxhYmVsX2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgICByZXBvcnRfZGF0YS0+cXVldWVMYWJlbEhhc0luc2VydCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCZWdpbkNtZERlYnVnVXRpbHNMYWJlbChkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAqbGFiZWxfaW5mbykgeworICAgIGlmIChudWxscHRyICE9IGxhYmVsX2luZm8gJiYgbnVsbHB0ciAhPSBsYWJlbF9pbmZvLT5wTGFiZWxOYW1lKSB7CisgICAgICAgIGF1dG8gbGFiZWxfaXRlciA9IHJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzQ21kQnVmTGFiZWxzLT5maW5kKGNvbW1hbmRfYnVmZmVyKTsKKyAgICAgICAgaWYgKGxhYmVsX2l0ZXIgPT0gcmVwb3J0X2RhdGEtPmRlYnVnVXRpbHNDbWRCdWZMYWJlbHMtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMb2dnaW5nTGFiZWxEYXRhPiBuZXdfY21kYnVmX2xhYmVsczsKKyAgICAgICAgICAgIEluc2VydExhYmVsSW50b0xvZyhsYWJlbF9pbmZvLCBuZXdfY21kYnVmX2xhYmVscyk7CisgICAgICAgICAgICByZXBvcnRfZGF0YS0+ZGVidWdVdGlsc0NtZEJ1ZkxhYmVscy0+aW5zZXJ0KHtjb21tYW5kX2J1ZmZlciwgbmV3X2NtZGJ1Zl9sYWJlbHN9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IHRoaW5nIHdhcyBhIGxhYmVsIGluc2VydCwgd2UgbmVlZCB0byBwb3AgaXQgb2ZmIG9mIHRoZSBsYWJlbCB2ZWN0b3IgYmVmb3JlIGFueQorICAgICAgICAgICAgLy8gY2hhbmdlcy4gVGhpcyBpcyBiZWNhdXNlIGEgbGFiZWwgYWRkZWQgd2l0aCAidmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiIGlzIG9ubHkgYQorICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IGxvY2F0aW9uIHRoYXQgZXhpc3RzIHVudGlsIHRoZSBuZXh0IG9wZXJhdGlvbiBvY2N1cnMuICBJbiB0aGlzIGNhc2UsIGEKKyAgICAgICAgICAgIC8vICJ2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIiBoYXMgb2NjdXJyZWQgZXJhc2luZyB0aGUgaW5zZXJ0ZWQgbGFiZWwuCisgICAgICAgICAgICBpZiAocmVwb3J0X2RhdGEtPmNtZEJ1ZkxhYmVsSGFzSW5zZXJ0KSB7CisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPmNtZEJ1ZkxhYmVsSGFzSW5zZXJ0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbGFiZWxfaXRlci0+c2Vjb25kLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbnNlcnRMYWJlbEludG9Mb2cobGFiZWxfaW5mbywgbGFiZWxfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIEVuZENtZERlYnVnVXRpbHNMYWJlbChkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlcikgeworICAgIGF1dG8gbGFiZWxfaXRlciA9IHJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzQ21kQnVmTGFiZWxzLT5maW5kKGNvbW1hbmRfYnVmZmVyKTsKKyAgICBpZiAobGFiZWxfaXRlciAhPSByZXBvcnRfZGF0YS0+ZGVidWdVdGlsc0NtZEJ1ZkxhYmVscy0+ZW5kKCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGxhc3QgdGhpbmcgd2FzIGEgbGFiZWwgaW5zZXJ0LCB3ZSBuZWVkIHRvIHBvcCBpdCBvZmYgb2YgdGhlIGxhYmVsIHZlY3RvciBiZWZvcmUgYW55CisgICAgICAgIC8vIGNoYW5nZXMuIFRoaXMgaXMgYmVjYXVzZSBhIGxhYmVsIGFkZGVkIHdpdGggInZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIiBpcyBvbmx5IGEKKyAgICAgICAgLy8gdGVtcG9yYXJ5IGxvY2F0aW9uIHRoYXQgZXhpc3RzIHVudGlsIHRoZSBuZXh0IG9wZXJhdGlvbiBvY2N1cnMuICBJbiB0aGlzIGNhc2UsIGEKKyAgICAgICAgLy8gInZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUIiBoYXMgb2NjdXJyZWQgZXJhc2luZyB0aGUgaW5zZXJ0ZWQgbGFiZWwuCisgICAgICAgIGlmIChyZXBvcnRfZGF0YS0+Y21kQnVmTGFiZWxIYXNJbnNlcnQpIHsKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5jbWRCdWZMYWJlbEhhc0luc2VydCA9IGZhbHNlOworICAgICAgICAgICAgbGFiZWxfaXRlci0+c2Vjb25kLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IHBvcCB0aGUgbm9ybWFsIGl0ZW0KKyAgICAgICAgbGFiZWxfaXRlci0+c2Vjb25kLnBvcF9iYWNrKCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgSW5zZXJ0Q21kRGVidWdVdGlsc0xhYmVsKGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAqbGFiZWxfaW5mbykgeworICAgIGlmIChudWxscHRyICE9IGxhYmVsX2luZm8gJiYgbnVsbHB0ciAhPSBsYWJlbF9pbmZvLT5wTGFiZWxOYW1lKSB7CisgICAgICAgIGF1dG8gbGFiZWxfaXRlciA9IHJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzQ21kQnVmTGFiZWxzLT5maW5kKGNvbW1hbmRfYnVmZmVyKTsKKyAgICAgICAgaWYgKGxhYmVsX2l0ZXIgPT0gcmVwb3J0X2RhdGEtPmRlYnVnVXRpbHNDbWRCdWZMYWJlbHMtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMb2dnaW5nTGFiZWxEYXRhPiBuZXdfY21kYnVmX2xhYmVsczsKKyAgICAgICAgICAgIEluc2VydExhYmVsSW50b0xvZyhsYWJlbF9pbmZvLCBuZXdfY21kYnVmX2xhYmVscyk7CisgICAgICAgICAgICByZXBvcnRfZGF0YS0+ZGVidWdVdGlsc0NtZEJ1ZkxhYmVscy0+aW5zZXJ0KHtjb21tYW5kX2J1ZmZlciwgbmV3X2NtZGJ1Zl9sYWJlbHN9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IHRoaW5nIHdhcyBhIGxhYmVsIGluc2VydCwgd2UgbmVlZCB0byBwb3AgaXQgb2ZmIG9mIHRoZSBsYWJlbCB2ZWN0b3IgYmVmb3JlIGFueQorICAgICAgICAgICAgLy8gY2hhbmdlcy4gVGhpcyBpcyBiZWNhdXNlIGEgbGFiZWwgYWRkZWQgd2l0aCAidmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiIGlzIG9ubHkgYQorICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IGxvY2F0aW9uIHRoYXQgZXhpc3RzIHVudGlsIHRoZSBuZXh0IG9wZXJhdGlvbiBvY2N1cnMuICBJbiB0aGlzIGNhc2UsIGEgbmV3CisgICAgICAgICAgICAvLyAidmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiIGhhcyBvY2N1cnJlZCBlcmFzaW5nIHRoZSBwcmV2aW91cyBpbnNlcnRlZCBsYWJlbC4KKyAgICAgICAgICAgIGlmIChyZXBvcnRfZGF0YS0+Y21kQnVmTGFiZWxIYXNJbnNlcnQpIHsKKyAgICAgICAgICAgICAgICBsYWJlbF9pdGVyLT5zZWNvbmQucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEluc2VydCB0aGlzIG5ldyBsYWJlbCBhbmQgbWFyayBpdCBhcyBvbmUgdGhhdCBoYXMgYmVlbiAiaW5zZXJ0ZWQiIHNvIHdlIGNhbiByZW1vdmUgaXQgb24KKyAgICAgICAgICAgIC8vIHRoZSBuZXh0IGNvbW1hbmQgYnVmZmVyIGxhYmVsIG9wZXJhdGlvbi4KKyAgICAgICAgICAgIEluc2VydExhYmVsSW50b0xvZyhsYWJlbF9pbmZvLCBsYWJlbF9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgcmVwb3J0X2RhdGEtPmNtZEJ1ZkxhYmVsSGFzSW5zZXJ0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmICAvLyBMQVlFUl9MT0dHSU5HX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfbGF5ZXJfdGFibGUuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy92a19sYXllcl90YWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwMzNiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfbGF5ZXJfdGFibGUuY3BwCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBHb29nbGUsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbkBsdW5hcmcuY29tPgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJ2a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl90YWJsZS5oIgorc3RhdGljIGRldmljZV90YWJsZV9tYXAgdGFibGVNYXA7CitzdGF0aWMgaW5zdGFuY2VfdGFibGVfbWFwIHRhYmxlSW5zdGFuY2VNYXA7CisKKy8vIE1hcCBsb29rdXAgbXVzdCBiZSB0aHJlYWQgc2FmZQorVmtMYXllckRpc3BhdGNoVGFibGUgKmRldmljZV9kaXNwYXRjaF90YWJsZSh2b2lkICpvYmplY3QpIHsKKyAgICBkaXNwYXRjaF9rZXkga2V5ID0gZ2V0X2Rpc3BhdGNoX2tleShvYmplY3QpOworICAgIGRldmljZV90YWJsZV9tYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFibGVNYXAuZmluZCgodm9pZCAqKWtleSk7CisgICAgYXNzZXJ0KGl0ICE9IHRhYmxlTWFwLmVuZCgpICYmICJOb3QgYWJsZSB0byBmaW5kIGRldmljZSBkaXNwYXRjaCBlbnRyeSIpOworICAgIHJldHVybiBpdC0+c2Vjb25kOworfQorCitWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICppbnN0YW5jZV9kaXNwYXRjaF90YWJsZSh2b2lkICpvYmplY3QpIHsKKyAgICBkaXNwYXRjaF9rZXkga2V5ID0gZ2V0X2Rpc3BhdGNoX2tleShvYmplY3QpOworICAgIGluc3RhbmNlX3RhYmxlX21hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0YWJsZUluc3RhbmNlTWFwLmZpbmQoKHZvaWQgKilrZXkpOworICAgIGFzc2VydChpdCAhPSB0YWJsZUluc3RhbmNlTWFwLmVuZCgpICYmICJOb3QgYWJsZSB0byBmaW5kIGluc3RhbmNlIGRpc3BhdGNoIGVudHJ5Iik7CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK3ZvaWQgZGVzdHJveV9kaXNwYXRjaF90YWJsZShkZXZpY2VfdGFibGVfbWFwICZtYXAsIGRpc3BhdGNoX2tleSBrZXkpIHsKKyAgICBkZXZpY2VfdGFibGVfbWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5maW5kKCh2b2lkICopa2V5KTsKKyAgICBpZiAoaXQgIT0gbWFwLmVuZCgpKSB7CisgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgICAgICBtYXAuZXJhc2UoaXQpOworICAgIH0KK30KKwordm9pZCBkZXN0cm95X2Rpc3BhdGNoX3RhYmxlKGluc3RhbmNlX3RhYmxlX21hcCAmbWFwLCBkaXNwYXRjaF9rZXkga2V5KSB7CisgICAgaW5zdGFuY2VfdGFibGVfbWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5maW5kKCh2b2lkICopa2V5KTsKKyAgICBpZiAoaXQgIT0gbWFwLmVuZCgpKSB7CisgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgICAgICBtYXAuZXJhc2UoaXQpOworICAgIH0KK30KKwordm9pZCBkZXN0cm95X2RldmljZV9kaXNwYXRjaF90YWJsZShkaXNwYXRjaF9rZXkga2V5KSB7IGRlc3Ryb3lfZGlzcGF0Y2hfdGFibGUodGFibGVNYXAsIGtleSk7IH0KKwordm9pZCBkZXN0cm95X2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGRpc3BhdGNoX2tleSBrZXkpIHsgZGVzdHJveV9kaXNwYXRjaF90YWJsZSh0YWJsZUluc3RhbmNlTWFwLCBrZXkpOyB9CisKK1ZrTGF5ZXJEaXNwYXRjaFRhYmxlICpnZXRfZGlzcGF0Y2hfdGFibGUoZGV2aWNlX3RhYmxlX21hcCAmbWFwLCB2b2lkICpvYmplY3QpIHsKKyAgICBkaXNwYXRjaF9rZXkga2V5ID0gZ2V0X2Rpc3BhdGNoX2tleShvYmplY3QpOworICAgIGRldmljZV90YWJsZV9tYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFwLmZpbmQoKHZvaWQgKilrZXkpOworICAgIGFzc2VydChpdCAhPSBtYXAuZW5kKCkgJiYgIk5vdCBhYmxlIHRvIGZpbmQgZGV2aWNlIGRpc3BhdGNoIGVudHJ5Iik7CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK1ZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmdldF9kaXNwYXRjaF90YWJsZShpbnN0YW5jZV90YWJsZV9tYXAgJm1hcCwgdm9pZCAqb2JqZWN0KSB7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkob2JqZWN0KTsKKyAgICBpbnN0YW5jZV90YWJsZV9tYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFwLmZpbmQoKHZvaWQgKilrZXkpOworICAgIGFzc2VydChpdCAhPSBtYXAuZW5kKCkgJiYgIk5vdCBhYmxlIHRvIGZpbmQgaW5zdGFuY2UgZGlzcGF0Y2ggZW50cnkiKTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqZ2V0X2NoYWluX2luZm8oY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBWa0xheWVyRnVuY3Rpb24gZnVuYykgeworICAgIFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKmNoYWluX2luZm8gPSAoVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqKXBDcmVhdGVJbmZvLT5wTmV4dDsKKyAgICB3aGlsZSAoY2hhaW5faW5mbyAmJiAhKGNoYWluX2luZm8tPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTyAmJiBjaGFpbl9pbmZvLT5mdW5jdGlvbiA9PSBmdW5jKSkgeworICAgICAgICBjaGFpbl9pbmZvID0gKFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKiljaGFpbl9pbmZvLT5wTmV4dDsKKyAgICB9CisgICAgYXNzZXJ0KGNoYWluX2luZm8gIT0gTlVMTCk7CisgICAgcmV0dXJuIGNoYWluX2luZm87Cit9CisKK1ZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpnZXRfY2hhaW5faW5mbyhjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBWa0xheWVyRnVuY3Rpb24gZnVuYykgeworICAgIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gKFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICopcENyZWF0ZUluZm8tPnBOZXh0OworICAgIHdoaWxlIChjaGFpbl9pbmZvICYmICEoY2hhaW5faW5mby0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0RFVklDRV9DUkVBVEVfSU5GTyAmJiBjaGFpbl9pbmZvLT5mdW5jdGlvbiA9PSBmdW5jKSkgeworICAgICAgICBjaGFpbl9pbmZvID0gKFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICopY2hhaW5faW5mby0+cE5leHQ7CisgICAgfQorICAgIGFzc2VydChjaGFpbl9pbmZvICE9IE5VTEwpOworICAgIHJldHVybiBjaGFpbl9pbmZvOworfQorCisvKiBWYXJpb3VzIGRpc3BhdGNoYWJsZSBvYmplY3RzIHdpbGwgdXNlIHRoZSBzYW1lIHVuZGVybHlpbmcgZGlzcGF0Y2ggdGFibGUgaWYgdGhleQorICogYXJlIGNyZWF0ZWQgZnJvbSB0aGF0ICJwYXJlbnQiIG9iamVjdC4gVGh1cyB1c2UgcG9pbnRlciB0byBkaXNwYXRjaCB0YWJsZQorICogYXMgdGhlIGtleSB0byB0aGVzZSB0YWJsZSBtYXBzLgorICogICAgSW5zdGFuY2UgLT4gUGh5c2ljYWxEZXZpY2UKKyAqICAgIERldmljZSAtPiBDb21tYW5kQnVmZmVyIG9yIFF1ZXVlCisgKiBJZiB1c2UgdGhlIG9iamVjdCB0aGVtc2VsdmVzIGFzIGtleSB0byBtYXAgdGhlbiBpbXBsaWVzIENyZWF0ZSBlbnRyeXBvaW50cyBoYXZlIHRvIGJlIGludGVyY2VwdGVkCisgKiBhbmQgYSBuZXcga2V5IGluc2VydGVkIGludG8gbWFwICovCitWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICppbml0SW5zdGFuY2VUYWJsZShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGdwYSwgaW5zdGFuY2VfdGFibGVfbWFwICZtYXApIHsKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpwVGFibGU7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpOworICAgIGluc3RhbmNlX3RhYmxlX21hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXAuZmluZCgodm9pZCAqKWtleSk7CisKKyAgICBpZiAoaXQgPT0gbWFwLmVuZCgpKSB7CisgICAgICAgIHBUYWJsZSA9IG5ldyBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlOworICAgICAgICBtYXBbKHZvaWQgKilrZXldID0gcFRhYmxlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGxheWVyX2luaXRfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoaW5zdGFuY2UsIHBUYWJsZSwgZ3BhKTsKKworICAgIC8vIFNldHVwIGZ1bmMgcG9pbnRlcnMgdGhhdCBhcmUgcmVxdWlyZWQgYnV0IG5vdCBleHRlcm5hbGx5IGV4cG9zZWQuICBUaGVzZSB3b24ndCBiZSBhZGRlZCB0byB0aGUgaW5zdGFuY2UgZGlzcGF0Y2ggdGFibGUgYnkKKyAgICAvLyBkZWZhdWx0LgorICAgIHBUYWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciA9IChQRk5fR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcilncGEoaW5zdGFuY2UsICJ2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIiKTsKKworICAgIHJldHVybiBwVGFibGU7Cit9CisKK1ZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmluaXRJbnN0YW5jZVRhYmxlKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ3BhKSB7CisgICAgcmV0dXJuIGluaXRJbnN0YW5jZVRhYmxlKGluc3RhbmNlLCBncGEsIHRhYmxlSW5zdGFuY2VNYXApOworfQorCitWa0xheWVyRGlzcGF0Y2hUYWJsZSAqaW5pdERldmljZVRhYmxlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZ3BhLCBkZXZpY2VfdGFibGVfbWFwICZtYXApIHsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcFRhYmxlOworICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSk7CisgICAgZGV2aWNlX3RhYmxlX21hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXAuZmluZCgodm9pZCAqKWtleSk7CisKKyAgICBpZiAoaXQgPT0gbWFwLmVuZCgpKSB7CisgICAgICAgIHBUYWJsZSA9IG5ldyBWa0xheWVyRGlzcGF0Y2hUYWJsZTsKKyAgICAgICAgbWFwWyh2b2lkICopa2V5XSA9IHBUYWJsZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBsYXllcl9pbml0X2RldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UsIHBUYWJsZSwgZ3BhKTsKKworICAgIHJldHVybiBwVGFibGU7Cit9CisKK1ZrTGF5ZXJEaXNwYXRjaFRhYmxlICppbml0RGV2aWNlVGFibGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBncGEpIHsKKyAgICByZXR1cm4gaW5pdERldmljZVRhYmxlKGRldmljZSwgZ3BhLCB0YWJsZU1hcCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX3RhYmxlLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViOGY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfbGF5ZXJfdGFibGUuaApAQCAtMCwwICsxLDUxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5AbHVuYXJnLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInZ1bGthbi92a19sYXllci5oIgorI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIFZrTGF5ZXJEaXNwYXRjaFRhYmxlICo+IGRldmljZV90YWJsZV9tYXA7Cit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKj4gaW5zdGFuY2VfdGFibGVfbWFwOworVmtMYXllckRpc3BhdGNoVGFibGUgKmluaXREZXZpY2VUYWJsZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFBGTl92a0dldERldmljZVByb2NBZGRyIGdwYSwgZGV2aWNlX3RhYmxlX21hcCAmbWFwKTsKK1ZrTGF5ZXJEaXNwYXRjaFRhYmxlICppbml0RGV2aWNlVGFibGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBncGEpOworVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqaW5pdEluc3RhbmNlVGFibGUoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBncGEsIGluc3RhbmNlX3RhYmxlX21hcCAmbWFwKTsKK1ZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKmluaXRJbnN0YW5jZVRhYmxlKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ3BhKTsKKwordHlwZWRlZiB2b2lkICpkaXNwYXRjaF9rZXk7CisKK3N0YXRpYyBpbmxpbmUgZGlzcGF0Y2hfa2V5IGdldF9kaXNwYXRjaF9rZXkoY29uc3Qgdm9pZCAqb2JqZWN0KSB7IHJldHVybiAoZGlzcGF0Y2hfa2V5KSAqIChWa0xheWVyRGlzcGF0Y2hUYWJsZSAqKilvYmplY3Q7IH0KKworVmtMYXllckRpc3BhdGNoVGFibGUgKmRldmljZV9kaXNwYXRjaF90YWJsZSh2b2lkICpvYmplY3QpOworCitWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICppbnN0YW5jZV9kaXNwYXRjaF90YWJsZSh2b2lkICpvYmplY3QpOworCitWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZ2V0X2Rpc3BhdGNoX3RhYmxlKGRldmljZV90YWJsZV9tYXAgJm1hcCwgdm9pZCAqb2JqZWN0KTsKKworVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqZ2V0X2Rpc3BhdGNoX3RhYmxlKGluc3RhbmNlX3RhYmxlX21hcCAmbWFwLCB2b2lkICpvYmplY3QpOworCitWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICpnZXRfY2hhaW5faW5mbyhjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIFZrTGF5ZXJGdW5jdGlvbiBmdW5jKTsKK1ZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpnZXRfY2hhaW5faW5mbyhjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBWa0xheWVyRnVuY3Rpb24gZnVuYyk7CisKK3ZvaWQgZGVzdHJveV9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGlzcGF0Y2hfa2V5IGtleSk7Cit2b2lkIGRlc3Ryb3lfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoZGlzcGF0Y2hfa2V5IGtleSk7Cit2b2lkIGRlc3Ryb3lfZGlzcGF0Y2hfdGFibGUoZGV2aWNlX3RhYmxlX21hcCAmbWFwLCBkaXNwYXRjaF9rZXkga2V5KTsKK3ZvaWQgZGVzdHJveV9kaXNwYXRjaF90YWJsZShpbnN0YW5jZV90YWJsZV9tYXAgJm1hcCwgZGlzcGF0Y2hfa2V5IGtleSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2xheWVyX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhZDgxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvdmtfbGF5ZXJfdXRpbHMuaApAQCAtMCwwICsxLDEyNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKi8KKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAidmtfZm9ybWF0X3V0aWxzLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfbG9nZ2luZy5oIgorCisjaWZuZGVmIFdJTjMyCisjaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gRm9yIGZmcygpCisjZWxzZQorI2luY2x1ZGUgPGludHJpbi5oPiAgLy8gRm9yIF9fbHpjbnQoKQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworLy8gVHJhaXRzIG9iamVjdHMgdG8gYWxsb3cgc3RyaW5nX2pvaW4gdG8gb3BlcmF0ZSBvbiBjb2xsZWN0aW9ucyBvZiBjb25zdCBjaGFyICoKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmc+CitzdHJ1Y3QgU3RyaW5nSm9pblNpemVUcmFpdCB7CisgICAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0IFN0cmluZyAmc3RyKSB7IHJldHVybiBzdHIuc2l6ZSgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFN0cmluZ0pvaW5TaXplVHJhaXQ8Y29uc3QgY2hhciAqPiB7CisgICAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0IGNoYXIgKnN0cikgeworICAgICAgICBpZiAoIXN0cikgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBzdHJsZW4oc3RyKTsKKyAgICB9Cit9OworLy8gU2ltaWxhciB0byBwZXJsL3B5dGhvbiBqb2luCisvLyAgICAqIFN0cmluZyBtdXN0IHN1cHBvcnQgc2l6ZSwgcmVzZXJ2ZSwgYXBwZW5kLCBhbmQgYmUgZGVmYXVsdCBjb25zdHJ1Y3RhYmxlCisvLyAgICAqIFN0cmluZ0NvbGxlY3Rpb24gbXVzdCBzdXBwb3J0IHNpemUsIGNvbnN0IGZvcndhcmQgaXRlcmF0aW9uLCBhbmQgc3RvcmUKKy8vICAgICAgc3RyaW5ncyBjb21wYXRpYmxlIHdpdGggU3RyaW5nOjphcHBlbmQKKy8vICAgICogQWNjZXNzb3IgdHJhaXQgY2FuIGJlIHNldCBpZiBkZWZhdWx0IGFjY2Vzc29ycyAoY29tcGF0aWJsZSB3aXRoIHN0cmluZworLy8gICAgICBhbmQgY29uc3QgY2hhciAqKSBkb24ndCBzdXBwb3J0IHNpemUoU3RyaW5nQ29sbGVjdGlvbjo6dmFsdWVfdHlwZSAmKQorLy8KKy8vIFJldHVybiB0eXBlIGJhc2VkIG9uIHNlcCB0eXBlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nID0gc3RkOjpzdHJpbmcsIHR5cGVuYW1lIFN0cmluZ0NvbGxlY3Rpb24gPSBzdGQ6OnZlY3RvcjxTdHJpbmc+LAorICAgICAgICAgIHR5cGVuYW1lIEFjY2Vzc29yID0gU3RyaW5nSm9pblNpemVUcmFpdDx0eXBlbmFtZSBTdHJpbmdDb2xsZWN0aW9uOjp2YWx1ZV90eXBlPj4KK3N0YXRpYyBpbmxpbmUgU3RyaW5nIHN0cmluZ19qb2luKGNvbnN0IFN0cmluZyAmc2VwLCBjb25zdCBTdHJpbmdDb2xsZWN0aW9uICZzdHJpbmdzKSB7CisgICAgU3RyaW5nIGpvaW5lZDsKKyAgICBjb25zdCBzaXplX3QgY291bnQgPSBzdHJpbmdzLnNpemUoKTsKKyAgICBpZiAoIWNvdW50KSByZXR1cm4gam9pbmVkOworCisgICAgLy8gUHJlcmVzZXJ2ZWQgc3RvcmFnZSwgcy50LiB3ZSB3aWxsIGV4ZWN1dGUgaW4gbGluZWFyIHRpbWUgKGF2b2lkcyByZWFsbG9jYXRpb24gY29waWVzKQorICAgIHNpemVfdCByZXNlcnZlID0gKGNvdW50IC0gMSkgKiBzZXAuc2l6ZSgpOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyIDogc3RyaW5ncykgeworICAgICAgICByZXNlcnZlICs9IEFjY2Vzc29yOjpzaXplKHN0cik7ICAvLyBhYnN0cmFjdGVkIHRvIGFsbG93IGNvbnN0IGNoYXIgKiB0eXBlIGluIFN0cmluZ0NvbGxlY3Rpb24KKyAgICB9CisgICAgam9pbmVkLnJlc2VydmUocmVzZXJ2ZSArIDEpOworCisgICAgLy8gU2VwcyBvbmx5IG9jY3VyICpiZXR3ZWVuKiBzdHJpbmdzIGVudHJpZXMsIHNvIGZpcnN0IGlzIHNwZWNpYWwKKyAgICBhdXRvIGN1cnJlbnQgPSBzdHJpbmdzLmNiZWdpbigpOworICAgIGpvaW5lZC5hcHBlbmQoKmN1cnJlbnQpOworICAgICsrY3VycmVudDsKKyAgICBmb3IgKDsgY3VycmVudCAhPSBzdHJpbmdzLmNlbmQoKTsgKytjdXJyZW50KSB7CisgICAgICAgIGpvaW5lZC5hcHBlbmQoc2VwKTsKKyAgICAgICAgam9pbmVkLmFwcGVuZCgqY3VycmVudCk7CisgICAgfQorICAgIHJldHVybiBqb2luZWQ7Cit9CisKKy8vIFJlcXVpcmVzIFN0cmluZ0NvbGxlY3Rpb246OnZhbHVlX3R5cGUgaGFzIGEgY29uc3QgY2hhciAqIGNvbnN0cnVjdG9yIGFuZCBpcyBjb21wYXRpYmxlIHRoZSBzdHJpbmdfam9pbjo6U3RyaW5nIGFib3ZlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nQ29sbGVjdGlvbiA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiwgdHlwZW5hbWUgU2VwU3RyaW5nID0gc3RkOjpzdHJpbmc+CitzdGF0aWMgaW5saW5lIFNlcFN0cmluZyBzdHJpbmdfam9pbihjb25zdCBjaGFyICpzZXAsIGNvbnN0IFN0cmluZ0NvbGxlY3Rpb24gJnN0cmluZ3MpIHsKKyAgICByZXR1cm4gc3RyaW5nX2pvaW48U2VwU3RyaW5nLCBTdHJpbmdDb2xsZWN0aW9uPihTZXBTdHJpbmcoc2VwKSwgc3RyaW5ncyk7Cit9CisKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgVktfTEFZRVJfQVBJX1ZFUlNJT04gVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKQorCit0eXBlZGVmIGVudW0gVmtTdHJpbmdFcnJvckZsYWdCaXRzIHsKKyAgICBWS19TVFJJTkdfRVJST1JfTk9ORSA9IDB4MDAwMDAwMDAsCisgICAgVktfU1RSSU5HX0VSUk9SX0xFTkdUSCA9IDB4MDAwMDAwMDEsCisgICAgVktfU1RSSU5HX0VSUk9SX0JBRF9EQVRBID0gMHgwMDAwMDAwMiwKK30gVmtTdHJpbmdFcnJvckZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrU3RyaW5nRXJyb3JGbGFnczsKKworVktfTEFZRVJfRVhQT1JUIHZvaWQgbGF5ZXJfZGVidWdfcmVwb3J0X2FjdGlvbnMoZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPiAmbG9nZ2luZ19jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgY29uc3QgY2hhciAqbGF5ZXJfaWRlbnRpZmllcik7CisKK1ZLX0xBWUVSX0VYUE9SVCB2b2lkIGxheWVyX2RlYnVnX21lc3Nlbmdlcl9hY3Rpb25zKGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZrRGVidWdVdGlsc01lc3NlbmdlckVYVD4gJmxvZ2dpbmdfbWVzc2VuZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBjb25zdCBjaGFyICpsYXllcl9pZGVudGlmaWVyKTsKKworVktfTEFZRVJfRVhQT1JUIFZrU3RyaW5nRXJyb3JGbGFncyB2a19zdHJpbmdfdmFsaWRhdGUoY29uc3QgaW50IG1heF9sZW5ndGgsIGNvbnN0IGNoYXIgKmNoYXJfYXJyYXkpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgd2hpdGVfbGlzdChjb25zdCBjaGFyICppdGVtLCBjb25zdCBjaGFyICp3aGl0ZWxpc3QpOworCitzdGF0aWMgaW5saW5lIGludCB1X2ZmcyhpbnQgdmFsKSB7CisjaWZkZWYgV0lOMzIKKyAgICB1bnNpZ25lZCBsb25nIGJpdF9wb3MgPSAwOworICAgIGlmIChfQml0U2NhbkZvcndhcmQoJmJpdF9wb3MsIHZhbCkgIT0gMCkgeworICAgICAgICBiaXRfcG9zICs9IDE7CisgICAgfQorICAgIHJldHVybiBiaXRfcG9zOworI2Vsc2UKKyAgICByZXR1cm4gZmZzKHZhbCk7CisjZW5kaWYKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvd3JhcF9vYmplY3RzLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9sYXllcnMvd3JhcF9vYmplY3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2QwYTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy93cmFwX29iamVjdHMuY3BwCkBAIC0wLDAgKzEsMTYxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9leHRlbnNpb25fdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl91dGlscy5oIgorI2luY2x1ZGUgIndyYXBfb2JqZWN0cy5oIgorCituYW1lc3BhY2Ugd3JhcF9vYmplY3RzIHsKKworc3RhdGljIGNvbnN0IFZrTGF5ZXJQcm9wZXJ0aWVzIGdsb2JhbF9sYXllciA9IHsKKyAgICAiVktfTEFZRVJfTFVOQVJHX3dyYXBfb2JqZWN0cyIsIFZLX0xBWUVSX0FQSV9WRVJTSU9OLCAxLCAiTHVuYXJHIFRlc3QgTGF5ZXIiLAorfTsKKworc3RhdGljIHVpbnQzMl90IGxvYWRlcl9sYXllcl9pZl92ZXJzaW9uID0gQ1VSUkVOVF9MT0FERVJfTEFZRVJfSU5URVJGQUNFX1ZFUlNJT047CisKKy8vVE9ETyBBZGQgd3JhcHBpbmcgb2YgVmtkZXZpY2UsIFZrcXVldWUsIFZrY29tbWFuZEJ1ZmZlcgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbnN0YW5jZSogcEluc3RhbmNlKQoreworICAgIFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKmNoYWluX2luZm8gPSBnZXRfY2hhaW5faW5mbyhwQ3JlYXRlSW5mbywgVktfTEFZRVJfTElOS19JTkZPKTsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgUEZOX3ZrQ3JlYXRlSW5zdGFuY2UgZnBDcmVhdGVJbnN0YW5jZSA9IChQRk5fdmtDcmVhdGVJbnN0YW5jZSkgZnBHZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0NyZWF0ZUluc3RhbmNlIik7CisgICAgaWYgKGZwQ3JlYXRlSW5zdGFuY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBmcENyZWF0ZUluc3RhbmNlKHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBhdXRvIGluc3QgPSBuZXcgd3JhcHBlZF9pbnN0X29iajsKKyAgICBpZiAoIWluc3QpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgbWVtc2V0KGluc3QsIDAsIHNpemVvZigqaW5zdCkpOworICAgIGluc3QtPm9iaiA9ICgqcEluc3RhbmNlKTsKKyAgICAqcEluc3RhbmNlID0gcmVpbnRlcnByZXRfY2FzdDxWa0luc3RhbmNlPiAoaW5zdCk7CisgICAgLy8gc3RvcmUgdGhlIGxvYWRlciBjYWxsYmFjayBmb3IgaW5pdGlhbGl6aW5nIGNyZWF0ZWQgZGlzcGF0Y2hhYmxlIG9iamVjdHMKKyAgICBjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xPQURFUl9EQVRBX0NBTExCQUNLKTsKKyAgICBpZiAoY2hhaW5faW5mbykgeworICAgICAgICBpbnN0LT5wZm5faW5zdF9pbml0ID0gY2hhaW5faW5mby0+dS5wZm5TZXRJbnN0YW5jZUxvYWRlckRhdGE7CisgICAgICAgIHJlc3VsdCA9IGluc3QtPnBmbl9pbnN0X2luaXQoaW5zdC0+b2JqLCByZWludGVycHJldF9jYXN0PHZvaWQgKj4gKGluc3QpKTsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnN0LT5wZm5faW5zdF9pbml0ID0gTlVMTDsKKyAgICAgICAgaW5zdC0+bG9hZGVyX2Rpc3AgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8VmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqKj4gKCpwSW5zdGFuY2UpKTsKKyAgICB9CisgICAgbGF5ZXJfaW5pdF9pbnN0YW5jZV9kaXNwYXRjaF90YWJsZSgqcEluc3RhbmNlLCAmaW5zdC0+bGF5ZXJfZGlzcCwgZnBHZXRJbnN0YW5jZVByb2NBZGRyKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95SW5zdGFuY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKQoreworICAgIHdyYXBwZWRfaW5zdF9vYmogKmluc3Q7CisgICAgYXV0byB2a19pbnN0ID0gdW53cmFwX2luc3RhbmNlKGluc3RhbmNlLCAmaW5zdCk7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcERpc3AgID0gICZpbnN0LT5sYXllcl9kaXNwOworICAgIHBEaXNwLT5EZXN0cm95SW5zdGFuY2UodmtfaW5zdCwgcEFsbG9jYXRvcik7CisgICAgaWYgKGluc3QtPnB0cl9waHlzX2RldnMpCisgICAgICAgIGRlbGV0ZVtdIGluc3QtPnB0cl9waHlzX2RldnM7CisgICAgZGVsZXRlIGluc3Q7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCogcFBoeXNpY2FsRGV2aWNlQ291bnQsIFZrUGh5c2ljYWxEZXZpY2UqIHBQaHlzaWNhbERldmljZXMpCit7CisgICAgd3JhcHBlZF9pbnN0X29iaiAqaW5zdDsKKyAgICBhdXRvIHZrX2luc3QgPSB1bndyYXBfaW5zdGFuY2UoaW5zdGFuY2UsICZpbnN0KTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBpbnN0LT5sYXllcl9kaXNwLkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyh2a19pbnN0LCBwUGh5c2ljYWxEZXZpY2VDb3VudCwgcFBoeXNpY2FsRGV2aWNlcyk7CisKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBpZiAocFBoeXNpY2FsRGV2aWNlcyAhPSBOVUxMKSB7CisgICAgICAgIGFzc2VydChwUGh5c2ljYWxEZXZpY2VDb3VudCk7CisgICAgICAgIGF1dG8gcGh5c19kZXZzID0gbmV3IHdyYXBwZWRfcGh5c19kZXZfb2JqWypwUGh5c2ljYWxEZXZpY2VDb3VudF07CisgICAgICAgIGlmICghcGh5c19kZXZzKQorICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgaWYgKGluc3QtPnB0cl9waHlzX2RldnMpCisgICAgICAgICAgICBkZWxldGVbXSBpbnN0LT5wdHJfcGh5c19kZXZzOworICAgICAgICBpbnN0LT5wdHJfcGh5c19kZXZzID0gcGh5c19kZXZzOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKnBQaHlzaWNhbERldmljZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbnN0LT5wZm5faW5zdF9pbml0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwaHlzX2RldnNbaV0ubG9hZGVyX2Rpc3AgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8VmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqKj4gKHBQaHlzaWNhbERldmljZXNbaV0pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5zdC0+cGZuX2luc3RfaW5pdCh2a19pbnN0LCByZWludGVycHJldF9jYXN0PHZvaWQgKj4gKCZwaHlzX2RldnNbaV0pKTsKKyAgICAgICAgICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBoeXNfZGV2c1tpXS5vYmogPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4gKHBQaHlzaWNhbERldmljZXNbaV0pOworICAgICAgICAgICAgcGh5c19kZXZzW2ldLmluc3QgPSBpbnN0OworICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlc1tpXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZT4gKCZwaHlzX2RldnNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqIHBGZWF0dXJlcykKK3sKKyAgICB3cmFwcGVkX3BoeXNfZGV2X29iaiAqcGh5c19kZXY7CisgICAgYXV0byB2a19waHlzX2RldiA9IHVud3JhcF9waHlzX2RldihwaHlzaWNhbERldmljZSwgJnBoeXNfZGV2KTsKKyAgICBwaHlzX2Rldi0+aW5zdC0+bGF5ZXJfZGlzcC5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKHZrX3BoeXNfZGV2LCBwRmVhdHVyZXMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrRm9ybWF0UHJvcGVydGllcyogcEZvcm1hdFByb3BlcnRpZXMpCit7CisgICAgd3JhcHBlZF9waHlzX2Rldl9vYmogKnBoeXNfZGV2OworICAgIGF1dG8gdmtfcGh5c19kZXYgPSB1bndyYXBfcGh5c19kZXYocGh5c2ljYWxEZXZpY2UsICZwaHlzX2Rldik7CisgICAgcGh5c19kZXYtPmluc3QtPmxheWVyX2Rpc3AuR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHZrX3BoeXNfZGV2LCBmb3JtYXQsIHBGb3JtYXRQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa0ltYWdlVGlsaW5nIHRpbGluZywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VDcmVhdGVGbGFncyBmbGFncywgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpCit7CisgICAgd3JhcHBlZF9waHlzX2Rldl9vYmogKnBoeXNfZGV2OworICAgIGF1dG8gdmtfcGh5c19kZXYgPSB1bndyYXBfcGh5c19kZXYocGh5c2ljYWxEZXZpY2UsICZwaHlzX2Rldik7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gcGh5c19kZXYtPmluc3QtPmxheWVyX2Rpc3AuR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXModmtfcGh5c19kZXYsIGZvcm1hdCwgdHlwZSwgdGlsaW5nLCB1c2FnZSwgZmxhZ3MsIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykKK3sKKyAgICB3cmFwcGVkX3BoeXNfZGV2X29iaiAqcGh5c19kZXY7CisgICAgYXV0byB2a19waHlzX2RldiA9IHVud3JhcF9waHlzX2RldihwaHlzaWNhbERldmljZSwgJnBoeXNfZGV2KTsKKyAgICBwaHlzX2Rldi0+aW5zdC0+bGF5ZXJfZGlzcC5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXModmtfcGh5c19kZXYsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpCit7CisgICAgd3JhcHBlZF9waHlzX2Rldl9vYmogKnBoeXNfZGV2OworICAgIGF1dG8gdmtfcGh5c19kZXYgPSB1bndyYXBfcGh5c19kZXYocGh5c2ljYWxEZXZpY2UsICZwaHlzX2Rldik7CisgICAgcGh5c19kZXYtPmluc3QtPmxheWVyX2Rpc3AuR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXModmtfcGh5c19kZXYsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogcE1lbW9yeVByb3BlcnRpZXMpCit7CisgICAgd3JhcHBlZF9waHlzX2Rldl9vYmogKnBoeXNfZGV2OworICAgIGF1dG8gdmtfcGh5c19kZXYgPSB1bndyYXBfcGh5c19kZXYocGh5c2ljYWxEZXZpY2UsICZwaHlzX2Rldik7CisgICAgcGh5c19kZXYtPmluc3QtPmxheWVyX2Rpc3AuR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKHZrX3BoeXNfZGV2LCBwTWVtb3J5UHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlKiBwRGV2aWNlKQoreworICAgIHdyYXBwZWRfcGh5c19kZXZfb2JqICpwaHlzX2RldjsKKyAgICBhdXRvIHZrX3BoeXNfZGV2ID0gdW53cmFwX3BoeXNfZGV2KHBoeXNpY2FsRGV2aWNlLCAmcGh5c19kZXYpOworICAgIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcEdldEluc3RhbmNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGZwR2V0RGV2aWNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXREZXZpY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVEZXZpY2UgZnBDcmVhdGVEZXZpY2UgPSAoUEZOX3ZrQ3JlYXRlRGV2aWNlKWZwR2V0SW5zdGFuY2VQcm9jQWRkcihwaHlzX2Rldi0+aW5zdC0+b2JqLCAidmtDcmVhdGVEZXZpY2UiKTsKKyAgICBpZiAoZnBDcmVhdGVEZXZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBmcENyZWF0ZURldmljZSh2a19waHlzX2RldiwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXZpY2UpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBpbml0RGV2aWNlVGFibGUoKnBEZXZpY2UsIGZwR2V0RGV2aWNlUHJvY0FkZHIpOworCisjaWYgMCAvLyBUT0RPIGFkZCBvbmNlIGRldmljZSBpcyB3cmFwcGVkCisgICAgLy8gc3RvcmUgdGhlIGxvYWRlciBjYWxsYmFjayBmb3IgaW5pdGlhbGl6aW5nIGNyZWF0ZWQgZGlzcGF0Y2hhYmxlIG9iamVjdHMKKyAgICBjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xPQURFUl9EQVRBX0NBTExCQUNLKTsKKyAgICBpZiAoY2hhaW5faW5mbykgeworICAgICAgICBkZXYtPnBmbl9kZXZfaW5pdCA9IGNoYWluX2luZm8tPnUucGZuU2V0RGV2aWNlTG9hZGVyRGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXYtPnBmbl9kZXZfaW5pdCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKTsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgID0gIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpOworICAgIHBEaXNwLT5EZXN0cm95RGV2aWNlKGRldmljZSwgcEFsbG9jYXRvcik7CisgICAgZGVzdHJveV9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoa2V5KTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMpCit7CisgICAgd3JhcHBlZF9waHlzX2Rldl9vYmogKnBoeXNfZGV2OworICAgIGF1dG8gdmtfcGh5c19kZXYgPSB1bndyYXBfcGh5c19kZXYocGh5c2ljYWxEZXZpY2UsICZwaHlzX2Rldik7CisKKyAgICBpZiAocExheWVyTmFtZSAmJiAhc3RyY21wKHBMYXllck5hbWUsIGdsb2JhbF9sYXllci5sYXllck5hbWUpKQorICAgICAgICByZXR1cm4gdXRpbF9HZXRFeHRlbnNpb25Qcm9wZXJ0aWVzKDAsIG51bGxwdHIsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisKKyAgICByZXR1cm4gcGh5c19kZXYtPmluc3QtPmxheWVyX2Rpc3AuRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyh2a19waHlzX2RldiwgcExheWVyTmFtZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VRdWV1ZShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90IHF1ZXVlSW5kZXgsIFZrUXVldWUqIHBRdWV1ZSkKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+R2V0RGV2aWNlUXVldWUoZGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBxdWV1ZUluZGV4LCBwUXVldWUpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtRdWV1ZVN1Ym1pdChWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBzdWJtaXRDb3VudCwgY29uc3QgVmtTdWJtaXRJbmZvKiBwU3VibWl0cywgVmtGZW5jZSBmZW5jZSkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUocXVldWUpLT5RdWV1ZVN1Ym1pdChxdWV1ZSwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBmZW5jZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtRdWV1ZVdhaXRJZGxlKFZrUXVldWUgcXVldWUpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKHF1ZXVlKS0+UXVldWVXYWl0SWRsZShxdWV1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtEZXZpY2VXYWl0SWRsZShWa0RldmljZSBkZXZpY2UpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRldmljZVdhaXRJZGxlKGRldmljZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtBbGxvY2F0ZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlTWVtb3J5KiBwTWVtb3J5KQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5BbGxvY2F0ZU1lbW9yeShkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZW1vcnkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtGcmVlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkZyZWVNZW1vcnkoZGV2aWNlLCBtZW1vcnksIHBBbGxvY2F0b3IpOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a01hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsIFZrTWVtb3J5TWFwRmxhZ3MgZmxhZ3MsIHZvaWQqKiBwcERhdGEpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPk1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSwgb2Zmc2V0LCBzaXplLCBmbGFncywgcHBEYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1VubWFwTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5KQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5Vbm1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSk7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5GbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogcE1lbW9yeVJhbmdlcykKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+SW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUqIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5HZXREZXZpY2VNZW1vcnlDb21taXRtZW50KGRldmljZSwgbWVtb3J5LCBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcyk7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQmluZEJ1ZmZlck1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0KQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5CaW5kQnVmZmVyTWVtb3J5KGRldmljZSwgYnVmZmVyLCBtZW1vcnksIG1lbW9yeU9mZnNldCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCaW5kSW1hZ2VNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkJpbmRJbWFnZU1lbW9yeShkZXZpY2UsIGltYWdlLCBtZW1vcnksIG1lbW9yeU9mZnNldCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiBwTWVtb3J5UmVxdWlyZW1lbnRzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBidWZmZXIsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa01lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBpbWFnZSwgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyhWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBpbWFnZSwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykKK3sKKyAgICB3cmFwcGVkX3BoeXNfZGV2X29iaiAqcGh5c19kZXY7CisgICAgYXV0byB2a19waHlzX2RldiA9IHVud3JhcF9waHlzX2RldihwaHlzaWNhbERldmljZSwgJnBoeXNfZGV2KTsKKyAgICBwaHlzX2Rldi0+aW5zdC0+bGF5ZXJfZGlzcC5HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyh2a19waHlzX2RldiwgZm9ybWF0LCB0eXBlLCBzYW1wbGVzLCB1c2FnZSwgdGlsaW5nLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlQmluZFNwYXJzZShWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiBwQmluZEluZm8sIFZrRmVuY2UgZmVuY2UpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKHF1ZXVlKS0+UXVldWVCaW5kU3BhcnNlKHF1ZXVlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm8sIGZlbmNlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUZlbmNlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+Q3JlYXRlRmVuY2UoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUZlbmNlKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5EZXN0cm95RmVuY2UoZGV2aWNlLCBmZW5jZSwgcEFsbG9jYXRvcik7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUmVzZXRGZW5jZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlKiBwRmVuY2VzKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5SZXNldEZlbmNlcyhkZXZpY2UsIGZlbmNlQ291bnQsIHBGZW5jZXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldEZlbmNlU3RhdHVzKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+R2V0RmVuY2VTdGF0dXMoZGV2aWNlLCBmZW5jZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtXYWl0Rm9yRmVuY2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVmtGZW5jZSogcEZlbmNlcywgVmtCb29sMzIgd2FpdEFsbCwgdWludDY0X3QgdGltZW91dCkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+V2FpdEZvckZlbmNlcyhkZXZpY2UsIGZlbmNlQ291bnQsIHBGZW5jZXMsIHdhaXRBbGwsIHRpbWVvdXQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NlbWFwaG9yZSogcFNlbWFwaG9yZSkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+Q3JlYXRlU2VtYXBob3JlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTZW1hcGhvcmUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRlc3Ryb3lTZW1hcGhvcmUoZGV2aWNlLCBzZW1hcGhvcmUsIHBBbGxvY2F0b3IpOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUV2ZW50KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRXZlbnQqIHBFdmVudCkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+Q3JlYXRlRXZlbnQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEV2ZW50KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5EZXN0cm95RXZlbnQoZGV2aWNlLCBldmVudCwgcEFsbG9jYXRvcik7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0RXZlbnRTdGF0dXMoVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50KQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5HZXRFdmVudFN0YXR1cyhkZXZpY2UsIGV2ZW50KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1NldEV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+U2V0RXZlbnQoZGV2aWNlLCBldmVudCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldEV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+UmVzZXRFdmVudChkZXZpY2UsIGV2ZW50KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVF1ZXJ5UG9vbChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtRdWVyeVBvb2wqIHBRdWVyeVBvb2wpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkNyZWF0ZVF1ZXJ5UG9vbChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUXVlcnlQb29sKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lRdWVyeVBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+RGVzdHJveVF1ZXJ5UG9vbChkZXZpY2UsIHF1ZXJ5UG9vbCwgcEFsbG9jYXRvcik7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UXVlcnlQb29sUmVzdWx0cyhWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSwgVmtEZXZpY2VTaXplIHN0cmlkZSwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5HZXRRdWVyeVBvb2xSZXN1bHRzKGRldmljZSwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBkYXRhU2l6ZSwgcERhdGEsIHN0cmlkZSwgZmxhZ3MpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0J1ZmZlciogcEJ1ZmZlcikKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+Q3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95QnVmZmVyKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRlc3Ryb3lCdWZmZXIoZGV2aWNlLCBidWZmZXIsIHBBbGxvY2F0b3IpOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0J1ZmZlclZpZXcqIHBWaWV3KQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5DcmVhdGVCdWZmZXJWaWV3KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWaWV3KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlclZpZXcgYnVmZmVyVmlldywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5EZXN0cm95QnVmZmVyVmlldyhkZXZpY2UsIGJ1ZmZlclZpZXcsIHBBbGxvY2F0b3IpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVJbWFnZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ltYWdlKiBwSW1hZ2UpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkNyZWF0ZUltYWdlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbWFnZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lJbWFnZShWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+RGVzdHJveUltYWdlKGRldmljZSwgaW1hZ2UsIHBBbGxvY2F0b3IpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSogcFN1YnJlc291cmNlLCBWa1N1YnJlc291cmNlTGF5b3V0KiBwTGF5b3V0KQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5HZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KGRldmljZSwgaW1hZ2UsIHBTdWJyZXNvdXJjZSwgcExheW91dCk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUltYWdlVmlldyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbWFnZVZpZXcqIHBWaWV3KQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5DcmVhdGVJbWFnZVZpZXcoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFZpZXcpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUltYWdlVmlldyhWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2VWaWV3IGltYWdlVmlldywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5EZXN0cm95SW1hZ2VWaWV3KGRldmljZSwgaW1hZ2VWaWV3LCBwQWxsb2NhdG9yKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2hhZGVyTW9kdWxlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+Q3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U2hhZGVyTW9kdWxlKFZrRGV2aWNlIGRldmljZSwgVmtTaGFkZXJNb2R1bGUgc2hhZGVyTW9kdWxlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRlc3Ryb3lTaGFkZXJNb2R1bGUoZGV2aWNlLCBzaGFkZXJNb2R1bGUsIHBBbGxvY2F0b3IpOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lQ2FjaGUqIHBQaXBlbGluZUNhY2hlKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5DcmVhdGVQaXBlbGluZUNhY2hlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUNhY2hlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+RGVzdHJveVBpcGVsaW5lQ2FjaGUoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwQWxsb2NhdG9yKTsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaXBlbGluZUNhY2hlRGF0YShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkdldFBpcGVsaW5lQ2FjaGVEYXRhKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgcERhdGFTaXplLCBwRGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtNZXJnZVBpcGVsaW5lQ2FjaGVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIGRzdENhY2hlLCB1aW50MzJfdCBzcmNDYWNoZUNvdW50LCBjb25zdCBWa1BpcGVsaW5lQ2FjaGUqIHBTcmNDYWNoZXMpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPk1lcmdlUGlwZWxpbmVDYWNoZXMoZGV2aWNlLCBkc3RDYWNoZSwgc3JjQ2FjaGVDb3VudCwgcFNyY0NhY2hlcyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5DcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5DcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95UGlwZWxpbmUoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRlc3Ryb3lQaXBlbGluZShkZXZpY2UsIHBpcGVsaW5lLCBwQWxsb2NhdG9yKTsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lTGF5b3V0KiBwUGlwZWxpbmVMYXlvdXQpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkNyZWF0ZVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUxheW91dCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+RGVzdHJveVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcGlwZWxpbmVMYXlvdXQsIHBBbGxvY2F0b3IpOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVNhbXBsZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXIqIHBTYW1wbGVyKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5DcmVhdGVTYW1wbGVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTYW1wbGVyKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVNhbXBsZXIoVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXIgc2FtcGxlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5EZXN0cm95U2FtcGxlcihkZXZpY2UsIHNhbXBsZXIsIHBBbGxvY2F0b3IpOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqIHBTZXRMYXlvdXQpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNldExheW91dCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRlc2NyaXB0b3JTZXRMYXlvdXQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoZGV2aWNlLCBkZXNjcmlwdG9yU2V0TGF5b3V0LCBwQWxsb2NhdG9yKTsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JQb29sKiBwRGVzY3JpcHRvclBvb2wpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkNyZWF0ZURlc2NyaXB0b3JQb29sKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXNjcmlwdG9yUG9vbCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRlc3Ryb3lEZXNjcmlwdG9yUG9vbChkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBwQWxsb2NhdG9yKTsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldERlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgZmxhZ3MpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPlJlc2V0RGVzY3JpcHRvclBvb2woZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgZmxhZ3MpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRnJlZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cykKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+RnJlZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIGRlc2NyaXB0b3JTZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yV3JpdGVzLCB1aW50MzJfdCBkZXNjcmlwdG9yQ29weUNvdW50LCBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvckNvcGllcykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+VXBkYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcERlc2NyaXB0b3JXcml0ZXMsIGRlc2NyaXB0b3JDb3B5Q291bnQsIHBEZXNjcmlwdG9yQ29waWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtGcmFtZWJ1ZmZlciogcEZyYW1lYnVmZmVyKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5DcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRnJhbWVidWZmZXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRlc3Ryb3lGcmFtZWJ1ZmZlcihkZXZpY2UsIGZyYW1lYnVmZmVyLCBwQWxsb2NhdG9yKTsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzKiBwUmVuZGVyUGFzcykKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+Q3JlYXRlUmVuZGVyUGFzcyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUmVuZGVyUGFzcyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95UmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRlc3Ryb3lSZW5kZXJQYXNzKGRldmljZSwgcmVuZGVyUGFzcywgcEFsbG9jYXRvcik7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgVmtFeHRlbnQyRCogcEdyYW51bGFyaXR5KQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5HZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoZGV2aWNlLCByZW5kZXJQYXNzLCBwR3JhbnVsYXJpdHkpOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQ29tbWFuZFBvb2wqIHBDb21tYW5kUG9vbCkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+Q3JlYXRlQ29tbWFuZFBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcENvbW1hbmRQb29sKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5EZXN0cm95Q29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgcEFsbG9jYXRvcik7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0Q29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyBmbGFncykKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+UmVzZXRDb21tYW5kUG9vbChkZXZpY2UsIGNvbW1hbmRQb29sLCBmbGFncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwQ29tbWFuZEJ1ZmZlcnMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRnJlZUNvbW1hbmRCdWZmZXJzKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+RnJlZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgY29tbWFuZFBvb2wsIGNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzKTsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogcEJlZ2luSW5mbykKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBwQmVnaW5JbmZvKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VuZENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5FbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUmVzZXRDb21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+UmVzZXRDb21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGZsYWdzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRQaXBlbGluZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZSBwaXBlbGluZSkKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZEJpbmRQaXBlbGluZShjb21tYW5kQnVmZmVyLCBwaXBlbGluZUJpbmRQb2ludCwgcGlwZWxpbmUpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0Vmlld3BvcnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnQqIHBWaWV3cG9ydHMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRTZXRWaWV3cG9ydChjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRzKTsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFNjaXNzb3IoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0U2Npc3NvciwgdWludDMyX3Qgc2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcFNjaXNzb3JzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kU2V0U2Npc3Nvcihjb21tYW5kQnVmZmVyLCBmaXJzdFNjaXNzb3IsIHNjaXNzb3JDb3VudCwgcFNjaXNzb3JzKTsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldExpbmVXaWR0aChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbGluZVdpZHRoKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kU2V0TGluZVdpZHRoKGNvbW1hbmRCdWZmZXIsIGxpbmVXaWR0aCk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXREZXB0aEJpYXMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBmbG9hdCBkZXB0aEJpYXNDbGFtcCwgZmxvYXQgZGVwdGhCaWFzU2xvcGVGYWN0b3IpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRTZXREZXB0aEJpYXMoY29tbWFuZEJ1ZmZlciwgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsIGRlcHRoQmlhc0NsYW1wLCBkZXB0aEJpYXNTbG9wZUZhY3Rvcik7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRCbGVuZENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgZmxvYXQgYmxlbmRDb25zdGFudHNbNF0pCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRTZXRCbGVuZENvbnN0YW50cyhjb21tYW5kQnVmZmVyLCBibGVuZENvbnN0YW50cyk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXREZXB0aEJvdW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbWluRGVwdGhCb3VuZHMsIGZsb2F0IG1heERlcHRoQm91bmRzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kU2V0RGVwdGhCb3VuZHMoY29tbWFuZEJ1ZmZlciwgbWluRGVwdGhCb3VuZHMsIG1heERlcHRoQm91bmRzKTsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCBjb21wYXJlTWFzaykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhjb21tYW5kQnVmZmVyLCBmYWNlTWFzaywgY29tcGFyZU1hc2spOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCB3cml0ZU1hc2spCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRTZXRTdGVuY2lsV3JpdGVNYXNrKGNvbW1hbmRCdWZmZXIsIGZhY2VNYXNrLCB3cml0ZU1hc2spOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCByZWZlcmVuY2UpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRTZXRTdGVuY2lsUmVmZXJlbmNlKGNvbW1hbmRCdWZmZXIsIGZhY2VNYXNrLCByZWZlcmVuY2UpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3QgZmlyc3RTZXQsIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIHVpbnQzMl90IGR5bmFtaWNPZmZzZXRDb3VudCwgY29uc3QgdWludDMyX3QqIHBEeW5hbWljT2Zmc2V0cykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZEJpbmREZXNjcmlwdG9yU2V0cyhjb21tYW5kQnVmZmVyLCBwaXBlbGluZUJpbmRQb2ludCwgbGF5b3V0LCBmaXJzdFNldCwgZGVzY3JpcHRvclNldENvdW50LCBwRGVzY3JpcHRvclNldHMsIGR5bmFtaWNPZmZzZXRDb3VudCwgcER5bmFtaWNPZmZzZXRzKTsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRJbmRleEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0luZGV4VHlwZSBpbmRleFR5cGUpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRCaW5kSW5kZXhCdWZmZXIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGluZGV4VHlwZSk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCaW5kVmVydGV4QnVmZmVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwT2Zmc2V0cykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZEJpbmRWZXJ0ZXhCdWZmZXJzKGNvbW1hbmRCdWZmZXIsIGZpcnN0QmluZGluZywgYmluZGluZ0NvdW50LCBwQnVmZmVycywgcE9mZnNldHMpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRHJhdyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdmVydGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kRHJhdyhjb21tYW5kQnVmZmVyLCB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RWZXJ0ZXgsIGZpcnN0SW5zdGFuY2UpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRHJhd0luZGV4ZWQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGluZGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0SW5kZXgsIGludDMyX3QgdmVydGV4T2Zmc2V0LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kRHJhd0luZGV4ZWQoY29tbWFuZEJ1ZmZlciwgaW5kZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RJbmRleCwgdmVydGV4T2Zmc2V0LCBmaXJzdEluc3RhbmNlKTsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXdJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZERyYXdJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZERyYXdJbmRleGVkSW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlKTsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERpc3BhdGNoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kRGlzcGF0Y2goY29tbWFuZEJ1ZmZlciwgeCwgeSwgeik7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREaXNwYXRjaEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWREaXNwYXRjaEluZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0KTsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENvcHlCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJDb3B5KiBwUmVnaW9ucykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZENvcHlCdWZmZXIoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RCdWZmZXIsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSogcFJlZ2lvbnMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRDb3B5SW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCbGl0SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQmxpdCogcFJlZ2lvbnMsIFZrRmlsdGVyIGZpbHRlcikKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZEJsaXRJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zLCBmaWx0ZXIpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZENvcHlCdWZmZXJUb0ltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0J1ZmZlciwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENvcHlJbWFnZVRvQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0J1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogcFJlZ2lvbnMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRDb3B5SW1hZ2VUb0J1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFVwZGF0ZUJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgZGF0YVNpemUsIGNvbnN0IHVpbnQzMl90KiBwRGF0YSkKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZFVwZGF0ZUJ1ZmZlcihjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgZGF0YVNpemUsIHBEYXRhKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRGaWxsQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBkYXRhKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kRmlsbEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckNvbG9ySW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiBwQ29sb3IsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kQ2xlYXJDb2xvckltYWdlKGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcENvbG9yLCByYW5nZUNvdW50LCBwUmFuZ2VzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShjb21tYW5kQnVmZmVyLCBpbWFnZSwgaW1hZ2VMYXlvdXQsIHBEZXB0aFN0ZW5jaWwsIHJhbmdlQ291bnQsIHBSYW5nZXMpOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ2xlYXJBdHRhY2htZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYXR0YWNobWVudENvdW50LCBjb25zdCBWa0NsZWFyQXR0YWNobWVudCogcEF0dGFjaG1lbnRzLCB1aW50MzJfdCByZWN0Q291bnQsIGNvbnN0IFZrQ2xlYXJSZWN0KiBwUmVjdHMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRDbGVhckF0dGFjaG1lbnRzKGNvbW1hbmRCdWZmZXIsIGF0dGFjaG1lbnRDb3VudCwgcEF0dGFjaG1lbnRzLCByZWN0Q291bnQsIHBSZWN0cyk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNvbHZlSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlUmVzb2x2ZSogcFJlZ2lvbnMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRSZXNvbHZlSW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kU2V0RXZlbnQoY29tbWFuZEJ1ZmZlciwgZXZlbnQsIHN0YWdlTWFzayk7Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRSZXNldEV2ZW50KGNvbW1hbmRCdWZmZXIsIGV2ZW50LCBzdGFnZU1hc2spOworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kV2FpdEV2ZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZXZlbnRDb3VudCwgY29uc3QgVmtFdmVudCogcEV2ZW50cywgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRXYWl0RXZlbnRzKGNvbW1hbmRCdWZmZXIsIGV2ZW50Q291bnQsIHBFdmVudHMsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUGlwZWxpbmVCYXJyaWVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgVmtEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzLCB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciogcE1lbW9yeUJhcnJpZXJzLCB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbW9yeUJhcnJpZXJzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRCdWZmZXIsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBkZXBlbmRlbmN5RmxhZ3MsIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCZWdpblF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kQmVnaW5RdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5LCBmbGFncyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRW5kUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRFbmRRdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNldFF1ZXJ5UG9vbChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50KQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kUmVzZXRRdWVyeVBvb2woY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRXcml0ZVRpbWVzdGFtcChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSkKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZFdyaXRlVGltZXN0YW1wKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lU3RhZ2UsIHF1ZXJ5UG9vbCwgcXVlcnkpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIHN0cmlkZSwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc3RyaWRlLCBmbGFncyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUHVzaENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIFZrU2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUsIGNvbnN0IHZvaWQqIHBWYWx1ZXMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRQdXNoQ29uc3RhbnRzKGNvbW1hbmRCdWZmZXIsIGxheW91dCwgc3RhZ2VGbGFncywgb2Zmc2V0LCBzaXplLCBwVmFsdWVzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCZWdpblJlbmRlclBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgY29udGVudHMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZE5leHRTdWJwYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoY29tbWFuZEJ1ZmZlciktPkNtZE5leHRTdWJwYXNzKGNvbW1hbmRCdWZmZXIsIGNvbnRlbnRzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKQoreworICAgIGRldmljZV9kaXNwYXRjaF90YWJsZShjb21tYW5kQnVmZmVyKS0+Q21kRW5kUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRFeGVjdXRlQ29tbWFuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwgY29uc3QgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMpCit7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGNvbW1hbmRCdWZmZXIpLT5DbWRFeGVjdXRlQ29tbWFuZHMoY29tbWFuZEJ1ZmZlciwgY29tbWFuZEJ1ZmZlckNvdW50LCBwQ29tbWFuZEJ1ZmZlcnMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgd3JhcHBlZF9pbnN0X29iaiAqaW5zdDsKKyAgICBhdXRvIHZrX2luc3QgPSB1bndyYXBfaW5zdGFuY2UoaW5zdGFuY2UsICZpbnN0KTsKKyAgICBpbnN0LT5sYXllcl9kaXNwLkRlc3Ryb3lTdXJmYWNlS0hSKHZrX2luc3QsIHN1cmZhY2UsIHBBbGxvY2F0b3IpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa0Jvb2wzMiogcFN1cHBvcnRlZCkKK3sKKyAgICB3cmFwcGVkX3BoeXNfZGV2X29iaiAqcGh5c19kZXY7CisgICAgYXV0byB2a19waHlzX2RldiA9IHVud3JhcF9waHlzX2RldihwaHlzaWNhbERldmljZSwgJnBoeXNfZGV2KTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBwaHlzX2Rldi0+aW5zdC0+bGF5ZXJfZGlzcC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKHZrX3BoeXNfZGV2LCBxdWV1ZUZhbWlseUluZGV4LCBzdXJmYWNlLCBwU3VwcG9ydGVkKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcykKK3sKKyAgICB3cmFwcGVkX3BoeXNfZGV2X29iaiAqcGh5c19kZXY7CisgICAgYXV0byB2a19waHlzX2RldiA9IHVud3JhcF9waHlzX2RldihwaHlzaWNhbERldmljZSwgJnBoeXNfZGV2KTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBwaHlzX2Rldi0+aW5zdC0+bGF5ZXJfZGlzcC5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIodmtfcGh5c19kZXYsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVmtTdXJmYWNlRm9ybWF0S0hSKiBwU3VyZmFjZUZvcm1hdHMpCit7CisgICAgd3JhcHBlZF9waHlzX2Rldl9vYmogKnBoeXNfZGV2OworICAgIGF1dG8gdmtfcGh5c19kZXYgPSB1bndyYXBfcGh5c19kZXYocGh5c2ljYWxEZXZpY2UsICZwaHlzX2Rldik7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gcGh5c19kZXYtPmluc3QtPmxheWVyX2Rpc3AuR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUih2a19waHlzX2Rldiwgc3VyZmFjZSwgcFN1cmZhY2VGb3JtYXRDb3VudCwgcFN1cmZhY2VGb3JtYXRzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgdWludDMyX3QqIHBQcmVzZW50TW9kZUNvdW50LCBWa1ByZXNlbnRNb2RlS0hSKiBwUHJlc2VudE1vZGVzKQoreworICAgIHdyYXBwZWRfcGh5c19kZXZfb2JqICpwaHlzX2RldjsKKyAgICBhdXRvIHZrX3BoeXNfZGV2ID0gdW53cmFwX3BoeXNfZGV2KHBoeXNpY2FsRGV2aWNlLCAmcGh5c19kZXYpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHBoeXNfZGV2LT5pbnN0LT5sYXllcl9kaXNwLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUih2a19waHlzX2Rldiwgc3VyZmFjZSwgcFByZXNlbnRNb2RlQ291bnQsIHBQcmVzZW50TW9kZXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW4pCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkNyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikKK3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+RGVzdHJveVN3YXBjaGFpbktIUihkZXZpY2UsIHN3YXBjaGFpbiwgcEFsbG9jYXRvcik7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBWa0ltYWdlKiBwU3dhcGNoYWluSW1hZ2VzKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5HZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBwU3dhcGNoYWluSW1hZ2VzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtBY3F1aXJlTmV4dEltYWdlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIFZrRmVuY2UgZmVuY2UsIHVpbnQzMl90KiBwSW1hZ2VJbmRleCkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+QWNxdWlyZU5leHRJbWFnZUtIUihkZXZpY2UsIHN3YXBjaGFpbiwgdGltZW91dCwgc2VtYXBob3JlLCBmZW5jZSwgcEltYWdlSW5kZXgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlUHJlc2VudEtIUihWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiBwUHJlc2VudEluZm8pCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKHF1ZXVlKS0+UXVldWVQcmVzZW50S0hSKHF1ZXVlLCBwUHJlc2VudEluZm8pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAordmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSICpwU3VyZmFjZSkgeworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICB3cmFwcGVkX2luc3Rfb2JqICppbnN0OworICAgIGF1dG8gdmtfaW5zdCA9IHVud3JhcF9pbnN0YW5jZShpbnN0YW5jZSwgJmluc3QpOworICAgIHJlc3VsdCA9IGluc3QtPmxheWVyX2Rpc3AuQ3JlYXRlV2luMzJTdXJmYWNlS0hSKHZrX2luc3QsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMCit2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgpIHsKKyAgICBWa0Jvb2wzMiByZXN1bHQ7CisgICAgd3JhcHBlZF9waHlzX2Rldl9vYmogKnBoeXNfZGV2OworICAgIGF1dG8gdmtfcGh5c19kZXYgPSB1bndyYXBfcGh5c19kZXYocGh5c2ljYWxEZXZpY2UsICZwaHlzX2Rldik7CisgICAgcmVzdWx0ID0gcGh5c19kZXYtPmluc3QtPmxheWVyX2Rpc3AuR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIodmtfcGh5c19kZXYsIHF1ZXVlRmFtaWx5SW5kZXgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlWGNiU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKQoreworICAgIHdyYXBwZWRfaW5zdF9vYmogKmluc3Q7CisgICAgYXV0byB2a19pbnN0ID0gdW53cmFwX2luc3RhbmNlKGluc3RhbmNlLCAmaW5zdCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gaW5zdC0+bGF5ZXJfZGlzcC5DcmVhdGVYY2JTdXJmYWNlS0hSKHZrX2luc3QsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHhjYl9jb25uZWN0aW9uX3QqIGNvbm5lY3Rpb24sIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZCkKK3sKKyAgICB3cmFwcGVkX3BoeXNfZGV2X29iaiAqcGh5c19kZXY7CisgICAgYXV0byB2a19waHlzX2RldiA9IHVud3JhcF9waHlzX2RldihwaHlzaWNhbERldmljZSwgJnBoeXNfZGV2KTsKKyAgICBWa0Jvb2wzMiByZXN1bHQgPSBwaHlzX2Rldi0+aW5zdC0+bGF5ZXJfZGlzcC5HZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIodmtfcGh5c19kZXYsIHF1ZXVlRmFtaWx5SW5kZXgsIGNvbm5lY3Rpb24sIHZpc3VhbF9pZCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKQoreworICAgIHdyYXBwZWRfaW5zdF9vYmogKmluc3Q7CisgICAgYXV0byB2a19pbnN0ID0gdW53cmFwX2luc3RhbmNlKGluc3RhbmNlLCAmaW5zdCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gaW5zdC0+bGF5ZXJfZGlzcC5DcmVhdGVYbGliU3VyZmFjZUtIUih2a19pbnN0LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGxheSogZHB5LCBWaXN1YWxJRCB2aXN1YWxJRCkKK3sKKyAgICB3cmFwcGVkX3BoeXNfZGV2X29iaiAqcGh5c19kZXY7CisgICAgYXV0byB2a19waHlzX2RldiA9IHVud3JhcF9waHlzX2RldihwaHlzaWNhbERldmljZSwgJnBoeXNfZGV2KTsKKyAgICBWa0Jvb2wzMiByZXN1bHQgPSBwaHlzX2Rldi0+aW5zdC0+bGF5ZXJfZGlzcC5HZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHZrX3BoeXNfZGV2LCBxdWV1ZUZhbWlseUluZGV4LCBkcHksIHZpc3VhbElEKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkKK3sKKyAgICB3cmFwcGVkX2luc3Rfb2JqICppbnN0OworICAgIGF1dG8gdmtfaW5zdCA9IHVud3JhcF9pbnN0YW5jZShpbnN0YW5jZSwgJmluc3QpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGluc3QtPmxheWVyX2Rpc3AuQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIodmtfaW5zdCwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHN0cnVjdCB3bF9kaXNwbGF5KiBkaXNwbGF5KQoreworICAgIHdyYXBwZWRfcGh5c19kZXZfb2JqICpwaHlzX2RldjsKKyAgICBhdXRvIHZrX3BoeXNfZGV2ID0gdW53cmFwX3BoeXNfZGV2KHBoeXNpY2FsRGV2aWNlLCAmcGh5c19kZXYpOworICAgIFZrQm9vbDMyIHJlc3VsdCA9IHBoeXNfZGV2LT5pbnN0LT5sYXllcl9kaXNwLkdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIodmtfcGh5c19kZXYsIHF1ZXVlRmFtaWx5SW5kZXgsIGRpc3BsYXkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKnBNc2dDYWxsYmFjaykgeworICAgIHdyYXBwZWRfaW5zdF9vYmogKmluc3Q7CisgICAgYXV0byB2a19pbnN0ID0gdW53cmFwX2luc3RhbmNlKGluc3RhbmNlLCAmaW5zdCk7CisKKyAgICBWa1Jlc3VsdCByZXMgPSBpbnN0LT5sYXllcl9kaXNwLkNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQodmtfaW5zdCwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBNc2dDYWxsYmFjayk7CisgICAgcmV0dXJuIHJlczsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwKK3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBtc2dDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIHdyYXBwZWRfaW5zdF9vYmogKmluc3Q7CisgICAgYXV0byB2a19pbnN0ID0gdW53cmFwX2luc3RhbmNlKGluc3RhbmNlLCAmaW5zdCk7CisgICAgaW5zdC0+bGF5ZXJfZGlzcC5EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCh2a19pbnN0LCBtc2dDYWxsYmFjaywgcEFsbG9jYXRvcik7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMCit2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9ialR5cGUsIHVpbnQ2NF90IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnQ29kZSwgY29uc3QgY2hhciAqcExheWVyUHJlZml4LCBjb25zdCBjaGFyICpwTXNnKSB7CisgICAgd3JhcHBlZF9pbnN0X29iaiAqaW5zdDsKKyAgICBhdXRvIHZrX2luc3QgPSB1bndyYXBfaW5zdGFuY2UoaW5zdGFuY2UsICZpbnN0KTsKKyAgICBpbnN0LT5sYXllcl9kaXNwLkRlYnVnUmVwb3J0TWVzc2FnZUVYVCh2a19pbnN0LCBmbGFncywgb2JqVHlwZSwgb2JqZWN0LCBsb2NhdGlvbiwgbXNnQ29kZSwgcExheWVyUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1zZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgUEZOX3ZrVm9pZEZ1bmN0aW9uIGxheWVyX2ludGVyY2VwdF9wcm9jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKCFuYW1lIHx8IG5hbWVbMF0gIT0gJ3YnIHx8IG5hbWVbMV0gIT0gJ2snKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5hbWUgKz0gMjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlSW5zdGFuY2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlSW5zdGFuY2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lJbnN0YW5jZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtEZXN0cm95SW5zdGFuY2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVEZXZpY2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlRGV2aWNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95RGV2aWNlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lEZXZpY2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldERldmljZVF1ZXVlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldERldmljZVF1ZXVlOworICAgIGlmICghc3RyY21wKG5hbWUsICJRdWV1ZVN1Ym1pdCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtRdWV1ZVN1Ym1pdDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUXVldWVXYWl0SWRsZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtRdWV1ZVdhaXRJZGxlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXZpY2VXYWl0SWRsZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtEZXZpY2VXYWl0SWRsZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQWxsb2NhdGVNZW1vcnkiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQWxsb2NhdGVNZW1vcnk7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkZyZWVNZW1vcnkiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrRnJlZU1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWFwTWVtb3J5IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a01hcE1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiVW5tYXBNZW1vcnkiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrVW5tYXBNZW1vcnk7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzOworICAgIGlmICghc3RyY21wKG5hbWUsICJJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldERldmljZU1lbW9yeUNvbW1pdG1lbnQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQmluZEJ1ZmZlck1lbW9yeSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtCaW5kQnVmZmVyTWVtb3J5OworICAgIGlmICghc3RyY21wKG5hbWUsICJCaW5kSW1hZ2VNZW1vcnkiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQmluZEltYWdlTWVtb3J5OworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJRdWV1ZUJpbmRTcGFyc2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrUXVldWVCaW5kU3BhcnNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVGZW5jZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDcmVhdGVGZW5jZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveUZlbmNlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lGZW5jZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXRGZW5jZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrUmVzZXRGZW5jZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEZlbmNlU3RhdHVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldEZlbmNlU3RhdHVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJXYWl0Rm9yRmVuY2VzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a1dhaXRGb3JGZW5jZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVNlbWFwaG9yZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDcmVhdGVTZW1hcGhvcmU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lTZW1hcGhvcmUiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrRGVzdHJveVNlbWFwaG9yZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlRXZlbnQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlRXZlbnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lFdmVudCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtEZXN0cm95RXZlbnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEV2ZW50U3RhdHVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldEV2ZW50U3RhdHVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJTZXRFdmVudCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtTZXRFdmVudDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXRFdmVudCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtSZXNldEV2ZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVRdWVyeVBvb2wiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlUXVlcnlQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95UXVlcnlQb29sIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lRdWVyeVBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFF1ZXJ5UG9vbFJlc3VsdHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UXVlcnlQb29sUmVzdWx0czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlQnVmZmVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NyZWF0ZUJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveUJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtEZXN0cm95QnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVCdWZmZXJWaWV3IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NyZWF0ZUJ1ZmZlclZpZXc7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lCdWZmZXJWaWV3IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lCdWZmZXJWaWV3OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVJbWFnZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDcmVhdGVJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveUltYWdlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVJbWFnZVZpZXciKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlSW1hZ2VWaWV3OworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95SW1hZ2VWaWV3IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lJbWFnZVZpZXc7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVNoYWRlck1vZHVsZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDcmVhdGVTaGFkZXJNb2R1bGU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lTaGFkZXJNb2R1bGUiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrRGVzdHJveVNoYWRlck1vZHVsZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlUGlwZWxpbmVDYWNoZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDcmVhdGVQaXBlbGluZUNhY2hlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95UGlwZWxpbmVDYWNoZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtEZXN0cm95UGlwZWxpbmVDYWNoZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGlwZWxpbmVDYWNoZURhdGEiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UGlwZWxpbmVDYWNoZURhdGE7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lcmdlUGlwZWxpbmVDYWNoZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrTWVyZ2VQaXBlbGluZUNhY2hlczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUNvbXB1dGVQaXBlbGluZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVBpcGVsaW5lIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lQaXBlbGluZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlUGlwZWxpbmVMYXlvdXQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lQaXBlbGluZUxheW91dCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVNhbXBsZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlU2FtcGxlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVNhbXBsZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrRGVzdHJveVNhbXBsZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZURlc2NyaXB0b3JQb29sIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NyZWF0ZURlc2NyaXB0b3JQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95RGVzY3JpcHRvclBvb2wiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrRGVzdHJveURlc2NyaXB0b3JQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJSZXNldERlc2NyaXB0b3JQb29sIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a1Jlc2V0RGVzY3JpcHRvclBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkFsbG9jYXRlRGVzY3JpcHRvclNldHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRnJlZURlc2NyaXB0b3JTZXRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0ZyZWVEZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiVXBkYXRlRGVzY3JpcHRvclNldHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrVXBkYXRlRGVzY3JpcHRvclNldHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUZyYW1lYnVmZmVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NyZWF0ZUZyYW1lYnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95RnJhbWVidWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrRGVzdHJveUZyYW1lYnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVSZW5kZXJQYXNzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NyZWF0ZVJlbmRlclBhc3M7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lSZW5kZXJQYXNzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lSZW5kZXJQYXNzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVDb21tYW5kUG9vbCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDcmVhdGVDb21tYW5kUG9vbDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveUNvbW1hbmRQb29sIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0Rlc3Ryb3lDb21tYW5kUG9vbDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXRDb21tYW5kUG9vbCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtSZXNldENvbW1hbmRQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkZyZWVDb21tYW5kQnVmZmVycyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtGcmVlQ29tbWFuZEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkJlZ2luQ29tbWFuZEJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtCZWdpbkNvbW1hbmRCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVuZENvbW1hbmRCdWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrRW5kQ29tbWFuZEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXRDb21tYW5kQnVmZmVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a1Jlc2V0Q29tbWFuZEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZFBpcGVsaW5lIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZEJpbmRQaXBlbGluZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0Vmlld3BvcnQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kU2V0Vmlld3BvcnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldFNjaXNzb3IiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kU2V0U2Npc3NvcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0TGluZVdpZHRoIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZFNldExpbmVXaWR0aDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0RGVwdGhCaWFzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZFNldERlcHRoQmlhczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0QmxlbmRDb25zdGFudHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kU2V0QmxlbmRDb25zdGFudHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldERlcHRoQm91bmRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZFNldERlcHRoQm91bmRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2siKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRTdGVuY2lsV3JpdGVNYXNrIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2s7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldFN0ZW5jaWxSZWZlcmVuY2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZERlc2NyaXB0b3JTZXRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZEluZGV4QnVmZmVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZEJpbmRJbmRleEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZFZlcnRleEJ1ZmZlcnMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXciKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kRHJhdzsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRHJhd0luZGV4ZWQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kRHJhd0luZGV4ZWQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdJbmRpcmVjdCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWREcmF3SW5kaXJlY3Q7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdJbmRleGVkSW5kaXJlY3QiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRGlzcGF0Y2giKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kRGlzcGF0Y2g7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERpc3BhdGNoSW5kaXJlY3QiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kRGlzcGF0Y2hJbmRpcmVjdDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ29weUJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRDb3B5QnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDb3B5SW1hZ2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kQ29weUltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCbGl0SW1hZ2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kQmxpdEltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDb3B5QnVmZmVyVG9JbWFnZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ29weUltYWdlVG9CdWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kQ29weUltYWdlVG9CdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFVwZGF0ZUJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRVcGRhdGVCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEZpbGxCdWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kRmlsbEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ2xlYXJDb2xvckltYWdlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZENsZWFyQ29sb3JJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDbGVhckF0dGFjaG1lbnRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZENsZWFyQXR0YWNobWVudHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFJlc29sdmVJbWFnZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRSZXNvbHZlSW1hZ2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldEV2ZW50IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZFNldEV2ZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRSZXNldEV2ZW50IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZFJlc2V0RXZlbnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFdhaXRFdmVudHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kV2FpdEV2ZW50czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kUGlwZWxpbmVCYXJyaWVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZFBpcGVsaW5lQmFycmllcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmVnaW5RdWVyeSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRCZWdpblF1ZXJ5OworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRFbmRRdWVyeSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRFbmRRdWVyeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kUmVzZXRRdWVyeVBvb2wiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kUmVzZXRRdWVyeVBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFdyaXRlVGltZXN0YW1wIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NtZFdyaXRlVGltZXN0YW1wOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kUHVzaENvbnN0YW50cyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRQdXNoQ29uc3RhbnRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCZWdpblJlbmRlclBhc3MiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kQmVnaW5SZW5kZXJQYXNzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWROZXh0U3VicGFzcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWROZXh0U3VicGFzczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRW5kUmVuZGVyUGFzcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDbWRFbmRSZW5kZXJQYXNzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRFeGVjdXRlQ29tbWFuZHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ21kRXhlY3V0ZUNvbW1hbmRzOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgUEZOX3ZrVm9pZEZ1bmN0aW9uIGxheWVyX2ludGVyY2VwdF9pbnN0YW5jZV9wcm9jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKCFuYW1lIHx8IG5hbWVbMF0gIT0gJ3YnIHx8IG5hbWVbMV0gIT0gJ2snKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5hbWUgKz0gMjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0SW5zdGFuY2VQcm9jQWRkciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbil2a0dldEluc3RhbmNlUHJvY0FkZHI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lJbnN0YW5jZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtEZXN0cm95SW5zdGFuY2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbil2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXM7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlUHJvY0FkZHIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBjaGFyKiBmdW5jTmFtZSkKK3sKKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gYWRkcjsKKworCisgICAgaWYgKCFzdHJjbXAoInZrR2V0RGV2aWNlUHJvY0FkZHIiLCBmdW5jTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0RGV2aWNlUHJvY0FkZHI7CisgICAgfQorCisgICAgYWRkciA9IGxheWVyX2ludGVyY2VwdF9wcm9jKGZ1bmNOYW1lKTsKKyAgICBpZiAoYWRkcikKKyAgICAgICAgcmV0dXJuIGFkZHI7CisgICAgaWYgKGRldmljZSA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtDcmVhdGVTd2FwY2hhaW5LSFIpOworICAgIGlmICghc3RyY21wKCJ2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtEZXN0cm95U3dhcGNoYWluS0hSKTsKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIpOworICAgIGlmICghc3RyY21wKCJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtBY3F1aXJlTmV4dEltYWdlS0hSKTsKKyAgICBpZiAoIXN0cmNtcCgidmtRdWV1ZVByZXNlbnRLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtRdWV1ZVByZXNlbnRLSFIpOworCisgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnBEaXNwID0gIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpOworICAgIGlmIChwRGlzcC0+R2V0RGV2aWNlUHJvY0FkZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBwRGlzcC0+R2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlLCBmdW5jTmFtZSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHZrR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyKiBmdW5jTmFtZSkKK3sKKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gYWRkcjsKKworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtDcmVhdGVJbnN0YW5jZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDcmVhdGVJbnN0YW5jZTsKKyAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgInZrQ3JlYXRlRGV2aWNlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NyZWF0ZURldmljZTsKKworICAgIGlmIChpbnN0YW5jZSA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBhZGRyID0gbGF5ZXJfaW50ZXJjZXB0X2luc3RhbmNlX3Byb2MoZnVuY05hbWUpOworICAgIGlmIChhZGRyKQorICAgICAgICByZXR1cm4gYWRkcjsKKworICAgIHdyYXBwZWRfaW5zdF9vYmogKmluc3Q7CisgICAgKHZvaWQpdW53cmFwX2luc3RhbmNlKGluc3RhbmNlLCAmaW5zdCk7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSogcFRhYmxlID0gJmluc3QtPmxheWVyX2Rpc3A7CisKKyAgICAvLyBFWFRfZGVidWdfcmVwb3J0CisgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsICJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbil2a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCAidmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQ7CisKKyAgICAvL0tIUl9zdXJmYWNlCisgICAgaWYgKCFzdHJjbXAoInZrRGVzdHJveVN1cmZhY2VLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtEZXN0cm95U3VyZmFjZUtIUik7CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIpOworICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUik7CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIpOworICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUik7CisKKyAgICAvLyBLSFJfWFhYX3N1cmZhY2UKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtDcmVhdGVYY2JTdXJmYWNlS0hSKTsKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtDcmVhdGVYbGliU3VyZmFjZUtIUik7CisgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIiwgZnVuY05hbWUpKQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KHZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIpOworICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgZnVuY05hbWUpKQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KHZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKTsKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICBpZiAocFRhYmxlLT5HZXRJbnN0YW5jZVByb2NBZGRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBwVGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKSB7CisgICAgYXNzZXJ0KGluc3RhbmNlKTsKKworICAgIHdyYXBwZWRfaW5zdF9vYmogKmluc3Q7CisgICAgKHZvaWQpdW53cmFwX2luc3RhbmNlKGluc3RhbmNlLCAmaW5zdCk7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSogcFRhYmxlID0gJmluc3QtPmxheWVyX2Rpc3A7CisKKyAgICBpZiAocFRhYmxlLT5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBwVGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2Ugd3JhcF9vYmplY3RzCisKKy8vIGxvYWRlci1sYXllciBpbnRlcmZhY2UgdjAsIGp1c3Qgd3JhcHBlcnMgc2luY2UgdGhlcmUgaXMgb25seSBhIGxheWVyCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciogZnVuY05hbWUpIHsKKyAgICByZXR1cm4gd3JhcF9vYmplY3RzOjp2a0dldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VQcm9jQWRkcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IGNoYXIqIGZ1bmNOYW1lKSB7CisgICAgcmV0dXJuIHdyYXBfb2JqZWN0czo6dmtHZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIGZ1bmNOYW1lKTsKK30KK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwQ291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICBhc3NlcnQoMCk7IC8vIFRPRE8gcmV0dXJuIHdyYXBfb2JqZWN0czo6RW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKHBMYXllck5hbWUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCit2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKHVpbnQzMl90ICpwQ291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIGFzc2VydCgwKTsgLy8gVE9ETyByZXR1cm4gd3JhcF9vYmplY3RzOjpFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyhwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAordmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBDb3VudCwgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgLy8gdGhlIGxheWVyIGNvbW1hbmQgaGFuZGxlcyBWS19OVUxMX0hBTkRMRSBqdXN0IGZpbmUgaW50ZXJuYWxseQorICAgIGFzc2VydChwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSk7CisgICAgYXNzZXJ0KDApOyAvLyBUT0RPIHJldHVybiB3cmFwX29iamVjdHM6OkVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyhWS19OVUxMX0hBTkRMRSwgcENvdW50LCBwUHJvcGVydGllcyk7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgLy8gdGhlIGxheWVyIGNvbW1hbmQgaGFuZGxlcyBWS19OVUxMX0hBTkRMRSBqdXN0IGZpbmUgaW50ZXJuYWxseQorICAgIGFzc2VydChwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSk7CisgICAgcmV0dXJuIHdyYXBfb2JqZWN0czo6dmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKFZLX05VTExfSEFORExFLCBwTGF5ZXJOYW1lLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtfbGF5ZXJHZXRQaHlzaWNhbERldmljZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKSB7CisgICAgcmV0dXJuIHdyYXBfb2JqZWN0czo6R2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uKFZrTmVnb3RpYXRlTGF5ZXJJbnRlcmZhY2UgKnBWZXJzaW9uU3RydWN0KSB7CisgICAgYXNzZXJ0KHBWZXJzaW9uU3RydWN0ICE9IE5VTEwpOworICAgIGFzc2VydChwVmVyc2lvblN0cnVjdC0+c1R5cGUgPT0gTEFZRVJfTkVHT1RJQVRFX0lOVEVSRkFDRV9TVFJVQ1QpOworCisgICAgLy8gRmlsbCBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaWYgb3VyIHZlcnNpb24gaXMgYXQgbGVhc3QgY2FwYWJsZSBvZiBoYXZpbmcgdGhlIHN0cnVjdHVyZSBjb250YWluIHRoZW0uCisgICAgaWYgKHBWZXJzaW9uU3RydWN0LT5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24gPj0gMikgeworICAgICAgICBwVmVyc2lvblN0cnVjdC0+cGZuR2V0SW5zdGFuY2VQcm9jQWRkciA9IHZrR2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICAgICAgcFZlcnNpb25TdHJ1Y3QtPnBmbkdldERldmljZVByb2NBZGRyID0gdmtHZXREZXZpY2VQcm9jQWRkcjsKKyAgICAgICAgcFZlcnNpb25TdHJ1Y3QtPnBmbkdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgPSB2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHI7CisgICAgfQorCisgICAgaWYgKHBWZXJzaW9uU3RydWN0LT5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24gPCBDVVJSRU5UX0xPQURFUl9MQVlFUl9JTlRFUkZBQ0VfVkVSU0lPTikgeworICAgICAgICB3cmFwX29iamVjdHM6OmxvYWRlcl9sYXllcl9pZl92ZXJzaW9uID0gcFZlcnNpb25TdHJ1Y3QtPmxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbjsKKyAgICB9IGVsc2UgaWYgKHBWZXJzaW9uU3RydWN0LT5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24gPiBDVVJSRU5UX0xPQURFUl9MQVlFUl9JTlRFUkZBQ0VfVkVSU0lPTikgeworICAgICAgICBwVmVyc2lvblN0cnVjdC0+bG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uID0gQ1VSUkVOVF9MT0FERVJfTEFZRVJfSU5URVJGQUNFX1ZFUlNJT047CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbGF5ZXJzL3dyYXBfb2JqZWN0cy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy93cmFwX29iamVjdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQyMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xheWVycy93cmFwX29iamVjdHMuaApAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKworc3RydWN0IHdyYXBwZWRfcGh5c19kZXZfb2JqIHsKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpsb2FkZXJfZGlzcDsKKyAgICBzdHJ1Y3Qgd3JhcHBlZF9pbnN0X29iaiAqaW5zdDsgIC8vIHBhcmVudCBpbnN0YW5jZSBvYmplY3QKKyAgICB2b2lkICpvYmo7Cit9OworCitzdHJ1Y3Qgd3JhcHBlZF9pbnN0X29iaiB7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqbG9hZGVyX2Rpc3A7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSBsYXllcl9kaXNwOyAgICAvL3RoaXMgbGF5ZXIncyBkaXNwYXRjaCB0YWJsZQorICAgIFBGTl92a1NldEluc3RhbmNlTG9hZGVyRGF0YSBwZm5faW5zdF9pbml0OworICAgIHN0cnVjdCB3cmFwcGVkX3BoeXNfZGV2X29iaiAqcHRyX3BoeXNfZGV2czsgLy8gYW55IGVudW1lcmF0ZWQgcGh5cyBkZXZzCisgICAgVmtJbnN0YW5jZSBvYmo7Cit9OworCitzdHJ1Y3Qgd3JhcHBlZF9kZXZfb2JqIHsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGlzcDsKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpsYXllcl9kaXNwOyAgLy8gVE9ETyB1c2UgdGhpcworICAgIFBGTl92a1NldERldmljZUxvYWRlckRhdGEgcGZuX2Rldl9pbml0OyAgLy9UT0RPIHVzZSB0aGlzCisgICAgdm9pZCAqb2JqOworfTsKKworc3RhdGljIGlubGluZSBWa0luc3RhbmNlIHVud3JhcF9pbnN0YW5jZShjb25zdCBWa0luc3RhbmNlIGluc3RhbmNlLCAgd3JhcHBlZF9pbnN0X29iaiAqKmluc3QpIHsKKyAgICppbnN0ID0gcmVpbnRlcnByZXRfY2FzdDx3cmFwcGVkX2luc3Rfb2JqICo+IChpbnN0YW5jZSk7CisgICByZXR1cm4gKCppbnN0KS0+b2JqOworfQorCitzdGF0aWMgaW5saW5lIFZrUGh5c2ljYWxEZXZpY2UgdW53cmFwX3BoeXNfZGV2KGNvbnN0IFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxfZGV2aWNlLCAgd3JhcHBlZF9waHlzX2Rldl9vYmogKipwaHlzX2RldikgeworICAgKnBoeXNfZGV2ID0gcmVpbnRlcnByZXRfY2FzdDx3cmFwcGVkX3BoeXNfZGV2X29iaiAqPiAocGh5c2ljYWxfZGV2aWNlKTsKKyAgIHJldHVybiByZWludGVycHJldF9jYXN0IDxWa1BoeXNpY2FsRGV2aWNlPiAoKCpwaHlzX2RldiktPm9iaik7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kZXZpY2VfcmVnaXN0ZXJfZXh0ZW5zaW9ucyhjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBWa0RldmljZSBkZXZpY2UpIHsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKTsKKyAgICBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBncGEgPSBwRGlzcC0+R2V0RGV2aWNlUHJvY0FkZHI7CisgICAgcERpc3AtPkNyZWF0ZVN3YXBjaGFpbktIUiA9IChQRk5fdmtDcmVhdGVTd2FwY2hhaW5LSFIpZ3BhKGRldmljZSwgInZrQ3JlYXRlU3dhcGNoYWluS0hSIik7CisgICAgcERpc3AtPkRlc3Ryb3lTd2FwY2hhaW5LSFIgPSAoUEZOX3ZrRGVzdHJveVN3YXBjaGFpbktIUilncGEoZGV2aWNlLCAidmtEZXN0cm95U3dhcGNoYWluS0hSIik7CisgICAgcERpc3AtPkdldFN3YXBjaGFpbkltYWdlc0tIUiA9IChQRk5fdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIpZ3BhKGRldmljZSwgInZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIik7CisgICAgcERpc3AtPkFjcXVpcmVOZXh0SW1hZ2VLSFIgPSAoUEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUilncGEoZGV2aWNlLCAidmtBY3F1aXJlTmV4dEltYWdlS0hSIik7CisgICAgcERpc3AtPlF1ZXVlUHJlc2VudEtIUiA9IChQRk5fdmtRdWV1ZVByZXNlbnRLSFIpZ3BhKGRldmljZSwgInZrUXVldWVQcmVzZW50S0hSIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRjNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzLmNwcApAQCAtMCwwICsxLDE3NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIk1hdGVyaWFscyIpLCB0bworICogZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisgKgorICogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgTUFURVJJQUxTIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisgKgorICogQXV0aG9yOiBKZXJlbXkgSGF5ZXMgPGplcmVteUBsdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIFlvdW5nIDxtYXJreUBsdW5hckcuY29tPgorICovCisKKy8vIEZvbGxvd2luZyBpdGVtcyBhcmUgbmVlZGVkIGZvciBDKysgdG8gd29yayB3aXRoIFBSSXhMRUFTVDY0CisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPiAgLy8gRm9yIFVJTlQzMl9NQVgKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRlc3RfY29tbW9uLmgiCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCituYW1lc3BhY2UgVksgeworCitzdHJ1Y3QgSW5zdGFuY2VDcmVhdGVJbmZvIHsKKyAgICBJbnN0YW5jZUNyZWF0ZUluZm8oKQorICAgICAgICA6IGluZm8gIC8vIE1TVkMgY2FuJ3QgaGFuZGxlIGxpc3QgaW5pdGlhbGl6YXRpb24sIHRodXMgZXhwbGljaXQgY29uc3RydWN0aW9uIGhlcmVpbi4KKyAgICAgICAgICAoVmtJbnN0YW5jZUNyZWF0ZUluZm97CisgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPLCAgLy8gc1R5cGUKKyAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwTmV4dAorICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWdzCisgICAgICAgICAgICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcEFwcGxpY2F0aW9uSW5mbworICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWRMYXllckNvdW50CisgICAgICAgICAgICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHBFbmFibGVkTGF5ZXJOYW1lcworICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWRFeHRlbnNpb25Db3VudAorICAgICAgICAgICAgICBudWxscHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzCisgICAgICAgICAgfSkge30KKworICAgIEluc3RhbmNlQ3JlYXRlSW5mbyAmc1R5cGUoVmtTdHJ1Y3R1cmVUeXBlIGNvbnN0ICZzVHlwZSkgeworICAgICAgICBpbmZvLnNUeXBlID0gc1R5cGU7CisKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluc3RhbmNlQ3JlYXRlSW5mbyAmcE5leHQodm9pZCBjb25zdCAqY29uc3QgcE5leHQpIHsKKyAgICAgICAgaW5mby5wTmV4dCA9IHBOZXh0OworCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbnN0YW5jZUNyZWF0ZUluZm8gJmZsYWdzKFZrSW5zdGFuY2VDcmVhdGVGbGFncyBjb25zdCAmZmxhZ3MpIHsKKyAgICAgICAgaW5mby5mbGFncyA9IGZsYWdzOworCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbnN0YW5jZUNyZWF0ZUluZm8gJnBBcHBsaWNhdGlvbkluZm8oVmtBcHBsaWNhdGlvbkluZm8gY29uc3QgKmNvbnN0IHBBcHBsaWNhdGlvbkluZm8pIHsKKyAgICAgICAgaW5mby5wQXBwbGljYXRpb25JbmZvID0gcEFwcGxpY2F0aW9uSW5mbzsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5zdGFuY2VDcmVhdGVJbmZvICZlbmFibGVkTGF5ZXJDb3VudCh1aW50MzJfdCBjb25zdCAmZW5hYmxlZExheWVyQ291bnQpIHsKKyAgICAgICAgaW5mby5lbmFibGVkTGF5ZXJDb3VudCA9IGVuYWJsZWRMYXllckNvdW50OworCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbnN0YW5jZUNyZWF0ZUluZm8gJnBwRW5hYmxlZExheWVyTmFtZXMoY2hhciBjb25zdCAqY29uc3QgKmNvbnN0IHBwRW5hYmxlZExheWVyTmFtZXMpIHsKKyAgICAgICAgaW5mby5wcEVuYWJsZWRMYXllck5hbWVzID0gcHBFbmFibGVkTGF5ZXJOYW1lczsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5zdGFuY2VDcmVhdGVJbmZvICZlbmFibGVkRXh0ZW5zaW9uQ291bnQodWludDMyX3QgY29uc3QgJmVuYWJsZWRFeHRlbnNpb25Db3VudCkgeworICAgICAgICBpbmZvLmVuYWJsZWRFeHRlbnNpb25Db3VudCA9IGVuYWJsZWRFeHRlbnNpb25Db3VudDsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSW5zdGFuY2VDcmVhdGVJbmZvICZwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyhjaGFyIGNvbnN0ICpjb25zdCAqY29uc3QgcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpIHsKKyAgICAgICAgaW5mby5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBWa0luc3RhbmNlQ3JlYXRlSW5mbyBjb25zdCAqKCkgY29uc3QgeyByZXR1cm4gJmluZm87IH0KKworICAgIG9wZXJhdG9yIFZrSW5zdGFuY2VDcmVhdGVJbmZvICooKSB7IHJldHVybiAmaW5mbzsgfQorCisgICAgVmtJbnN0YW5jZUNyZWF0ZUluZm8gaW5mbzsKK307CisKK3N0cnVjdCBEZXZpY2VRdWV1ZUNyZWF0ZUluZm8geworICAgIERldmljZVF1ZXVlQ3JlYXRlSW5mbygpCisgICAgICAgIDogaW5mbyAgLy8gTVNWQyBjYW4ndCBoYW5kbGUgbGlzdCBpbml0aWFsaXphdGlvbiwgdGh1cyBleHBsaWNpdCBjb25zdHJ1Y3Rpb24gaGVyZWluLgorICAgICAgICAgIChWa0RldmljZVF1ZXVlQ3JlYXRlSW5mb3sKKyAgICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPLCAgLy8gc1R5cGUKKyAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcE5leHQKKyAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVGYW1pbHlJbmRleAorICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZUNvdW50CisgICAgICAgICAgICAgIG51bGxwdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBRdWV1ZVByaW9yaXRpZXMKKyAgICAgICAgICB9KSB7fQorCisgICAgRGV2aWNlUXVldWVDcmVhdGVJbmZvICZzVHlwZShWa1N0cnVjdHVyZVR5cGUgY29uc3QgJnNUeXBlKSB7CisgICAgICAgIGluZm8uc1R5cGUgPSBzVHlwZTsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVDcmVhdGVJbmZvICZwTmV4dCh2b2lkIGNvbnN0ICpjb25zdCBwTmV4dCkgeworICAgICAgICBpbmZvLnBOZXh0ID0gcE5leHQ7CisKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZVF1ZXVlQ3JlYXRlSW5mbyAmZmxhZ3MoVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzIGNvbnN0ICZmbGFncykgeworICAgICAgICBpbmZvLmZsYWdzID0gZmxhZ3M7CisKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIERldmljZVF1ZXVlQ3JlYXRlSW5mbyAmcXVldWVGYW1pbHlJbmRleCh1aW50MzJfdCBjb25zdCAmcXVldWVGYW1pbHlJbmRleCkgeworICAgICAgICBpbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseUluZGV4OworCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gJnF1ZXVlQ291bnQodWludDMyX3QgY29uc3QgJnF1ZXVlQ291bnQpIHsKKyAgICAgICAgaW5mby5xdWV1ZUNvdW50ID0gcXVldWVDb3VudDsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlUXVldWVDcmVhdGVJbmZvICZwUXVldWVQcmlvcml0aWVzKGZsb2F0IGNvbnN0ICpjb25zdCBwUXVldWVQcmlvcml0aWVzKSB7CisgICAgICAgIGluZm8ucFF1ZXVlUHJpb3JpdGllcyA9IHBRdWV1ZVByaW9yaXRpZXM7CisKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKCkgeyByZXR1cm4gaW5mbzsgfQorCisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gaW5mbzsKK307CisKK3N0cnVjdCBEZXZpY2VDcmVhdGVJbmZvIHsKKyAgICBEZXZpY2VDcmVhdGVJbmZvKCkKKyAgICAgICAgOiBpbmZvICAvLyBNU1ZDIGNhbid0IGhhbmRsZSBsaXN0IGluaXRpYWxpemF0aW9uLCB0aHVzIGV4cGxpY2l0IGNvbnN0cnVjdGlvbiBoZXJlaW4uCisgICAgICAgICAgKFZrRGV2aWNlQ3JlYXRlSW5mb3sKKyAgICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0NSRUFURV9JTkZPLCAgLy8gc1R5cGUKKyAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcE5leHQKKyAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVDcmVhdGVJbmZvQ291bnQKKyAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcFF1ZXVlQ3JlYXRlSW5mb3MKKyAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZExheWVyQ291bnQKKyAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHBFbmFibGVkTGF5ZXJOYW1lcworICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGVkRXh0ZW5zaW9uQ291bnQKKyAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMKKyAgICAgICAgICAgICAgbnVsbHB0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcEVuYWJsZWRGZWF0dXJlcworICAgICAgICAgIH0pIHt9CisKKyAgICBEZXZpY2VDcmVhdGVJbmZvICZzVHlwZShWa1N0cnVjdHVyZVR5cGUgY29uc3QgJnNUeXBlKSB7CisgICAgICAgIGluZm8uc1R5cGUgPSBzVHlwZTsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmcE5leHQodm9pZCBjb25zdCAqY29uc3QgcE5leHQpIHsKKyAgICAgICAgaW5mby5wTmV4dCA9IHBOZXh0OworCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VDcmVhdGVJbmZvICZmbGFncyhWa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ3MgY29uc3QgJmZsYWdzKSB7CisgICAgICAgIGluZm8uZmxhZ3MgPSBmbGFnczsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmcXVldWVDcmVhdGVJbmZvQ291bnQodWludDMyX3QgY29uc3QgJnF1ZXVlQ3JlYXRlSW5mb0NvdW50KSB7CisgICAgICAgIGluZm8ucXVldWVDcmVhdGVJbmZvQ291bnQgPSBxdWV1ZUNyZWF0ZUluZm9Db3VudDsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmcFF1ZXVlQ3JlYXRlSW5mb3MoVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gY29uc3QgKmNvbnN0IHBRdWV1ZUNyZWF0ZUluZm9zKSB7CisgICAgICAgIGluZm8ucFF1ZXVlQ3JlYXRlSW5mb3MgPSBwUXVldWVDcmVhdGVJbmZvczsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmZW5hYmxlZExheWVyQ291bnQodWludDMyX3QgY29uc3QgJmVuYWJsZWRMYXllckNvdW50KSB7CisgICAgICAgIGluZm8uZW5hYmxlZExheWVyQ291bnQgPSBlbmFibGVkTGF5ZXJDb3VudDsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmcHBFbmFibGVkTGF5ZXJOYW1lcyhjaGFyIGNvbnN0ICpjb25zdCAqY29uc3QgcHBFbmFibGVkTGF5ZXJOYW1lcykgeworICAgICAgICBpbmZvLnBwRW5hYmxlZExheWVyTmFtZXMgPSBwcEVuYWJsZWRMYXllck5hbWVzOworCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBEZXZpY2VDcmVhdGVJbmZvICZlbmFibGVkRXh0ZW5zaW9uQ291bnQodWludDMyX3QgY29uc3QgJmVuYWJsZWRFeHRlbnNpb25Db3VudCkgeworICAgICAgICBpbmZvLmVuYWJsZWRFeHRlbnNpb25Db3VudCA9IGVuYWJsZWRFeHRlbnNpb25Db3VudDsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMoY2hhciBjb25zdCAqY29uc3QgKmNvbnN0IHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKSB7CisgICAgICAgIGluZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBwcEVuYWJsZWRFeHRlbnNpb25OYW1lczsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRGV2aWNlQ3JlYXRlSW5mbyAmcEVuYWJsZWRGZWF0dXJlcyhWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgY29uc3QgKmNvbnN0IHBFbmFibGVkRmVhdHVyZXMpIHsKKyAgICAgICAgaW5mby5wRW5hYmxlZEZlYXR1cmVzID0gcEVuYWJsZWRGZWF0dXJlczsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVmtEZXZpY2VDcmVhdGVJbmZvIGNvbnN0ICooKSBjb25zdCB7IHJldHVybiAmaW5mbzsgfQorCisgICAgb3BlcmF0b3IgVmtEZXZpY2VDcmVhdGVJbmZvICooKSB7IHJldHVybiAmaW5mbzsgfQorCisgICAgVmtEZXZpY2VDcmVhdGVJbmZvIGluZm87Cit9OworfSAgLy8gbmFtZXNwYWNlIFZLCisKK3N0cnVjdCBDb21tYW5kTGluZSA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IGFyZ3VtZW50cy5hc3NpZ24oYXJndiwgYXJndiArIGFyZ2MpOyB9OworCisgICAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpe307CisgICAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpe307CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3VtZW50czsKK307CitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmU6OmFyZ3VtZW50czsKKworc3RydWN0IEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIDogcHVibGljIENvbW1hbmRMaW5lIHt9Oworc3RydWN0IEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyA6IHB1YmxpYyBDb21tYW5kTGluZSB7fTsKK3N0cnVjdCBJbXBsaWNpdExheWVyIDogcHVibGljIENvbW1hbmRMaW5lIHt9OworCisvLyBBbGxvY2F0aW9uIHRyYWNraW5nIHV0aWxpdGllcworc3RydWN0IEFsbG9jVHJhY2sgeworICAgIGJvb2wgYWN0aXZlOworICAgIGJvb2wgd2FzX2FsbG9jYXRlZDsKKyAgICB2b2lkICphbGlnbmVkX3N0YXJ0X2FkZHI7CisgICAgY2hhciAqYWN0dWFsX3N0YXJ0X2FkZHI7CisgICAgc2l6ZV90IHJlcXVlc3RlZF9zaXplX2J5dGVzOworICAgIHNpemVfdCBhY3R1YWxfc2l6ZV9ieXRlczsKKyAgICBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBhbGxvY19zY29wZTsKKyAgICB1aW50NjRfdCB1c2VyX2RhdGE7CisKKyAgICBBbGxvY1RyYWNrKCkKKyAgICAgICAgOiBhY3RpdmUoZmFsc2UpLAorICAgICAgICAgIHdhc19hbGxvY2F0ZWQoZmFsc2UpLAorICAgICAgICAgIGFsaWduZWRfc3RhcnRfYWRkcihudWxscHRyKSwKKyAgICAgICAgICBhY3R1YWxfc3RhcnRfYWRkcihudWxscHRyKSwKKyAgICAgICAgICByZXF1ZXN0ZWRfc2l6ZV9ieXRlcygwKSwKKyAgICAgICAgICBhY3R1YWxfc2l6ZV9ieXRlcygwKSwKKyAgICAgICAgICBhbGxvY19zY29wZShWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DT01NQU5EKSwKKyAgICAgICAgICB1c2VyX2RhdGEoMCkge30KK307CisKKy8vIEdsb2JhbCB2ZWN0b3IgdG8gdHJhY2sgYWxsb2NhdGlvbnMuICBUaGlzIHdpbGwgYmUgcmVzaXplZCBiZWZvcmUgZWFjaCB0ZXN0IGFuZCBlbXB0aWVkIGFmdGVyLgorLy8gSG93ZXZlciwgd2UgaGF2ZSB0byBnbG9iYWxseSBkZWZpbmUgaXQgc28gdGhlIGFsbG9jYXRpb24gY2FsbGJhY2sgZnVuY3Rpb25zIHdvcmsgcHJvcGVybHkuCitzdGQ6OnZlY3RvcjxBbGxvY1RyYWNrPiBnX2FsbG9jYXRlZF92ZWN0b3I7Citib29sIGdfaW50ZW50aW9uYWxfZmFpbF9lbmFibGVkID0gZmFsc2U7Cit1aW50MzJfdCBnX2ludGVuaW9uYWxfZmFpbF9pbmRleCA9IDA7Cit1aW50MzJfdCBnX2ludGVuaW9uYWxfZmFpbF9jb3VudCA9IDA7CisKK3ZvaWQgRnJlZUFsbG9jVHJhY2tlcigpIHsgZ19hbGxvY2F0ZWRfdmVjdG9yLmNsZWFyKCk7IH0KKwordm9pZCBJbml0QWxsb2NUcmFja2VyKHNpemVfdCBzaXplLCB1aW50MzJfdCBpbnRlbnRpb25hbF9mYWlsX2luZGV4ID0gVUlOVDMyX01BWCkgeworICAgIGlmIChnX2FsbG9jYXRlZF92ZWN0b3Iuc2l6ZSgpID4gMCkgeworICAgICAgICBGcmVlQWxsb2NUcmFja2VyKCk7CisgICAgfQorICAgIGdfYWxsb2NhdGVkX3ZlY3Rvci5yZXNpemUoc2l6ZSk7CisgICAgaWYgKGludGVudGlvbmFsX2ZhaWxfaW5kZXggIT0gVUlOVDMyX01BWCkgeworICAgICAgICBnX2ludGVudGlvbmFsX2ZhaWxfZW5hYmxlZCA9IHRydWU7CisgICAgICAgIGdfaW50ZW5pb25hbF9mYWlsX2luZGV4ID0gaW50ZW50aW9uYWxfZmFpbF9pbmRleDsKKyAgICAgICAgZ19pbnRlbmlvbmFsX2ZhaWxfY291bnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGdfaW50ZW50aW9uYWxfZmFpbF9lbmFibGVkID0gZmFsc2U7CisgICAgICAgIGdfaW50ZW5pb25hbF9mYWlsX2luZGV4ID0gMDsKKyAgICAgICAgZ19pbnRlbmlvbmFsX2ZhaWxfY291bnQgPSAwOworICAgIH0KK30KKworYm9vbCBJc0FsbG9jVHJhY2tlckVtcHR5KCkgeworICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CisgICAgYm9vbCB3YXNfYWxsb2NhdGVkID0gZmFsc2U7CisgICAgY2hhciBwcmludF9jb21tYW5kWzEwMjRdOworICAgIHNwcmludGYocHJpbnRfY29tbWFuZCwgIlx0JSUwNGRcdCUlcCAoJSVwKSA6IDB4JSUlcyAoMHglJSVzKSA6IHNjb3BlICUlZCA6IHVzZXJfZGF0YSAweCUlJXNcbiIsIFBSSXhMRUFTVDY0LCBQUkl4TEVBU1Q2NCwKKyAgICAgICAgICAgIFBSSXhMRUFTVDY0KTsKKyAgICBmb3IgKHVpbnQzMl90IGlpaSA9IDA7IGlpaSA8IGdfYWxsb2NhdGVkX3ZlY3Rvci5zaXplKCk7IGlpaSsrKSB7CisgICAgICAgIGlmIChnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5hY3RpdmUpIHsKKyAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogQWxsb2NhdGlvbnMgc3RpbGwgcmVtYWluIVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYocHJpbnRfY29tbWFuZCwgaWlpLCBnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5hbGlnbmVkX3N0YXJ0X2FkZHIsIGdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLmFjdHVhbF9zdGFydF9hZGRyLAorICAgICAgICAgICAgICAgICAgIGdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLnJlcXVlc3RlZF9zaXplX2J5dGVzLCBnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5hY3R1YWxfc2l6ZV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICBnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5hbGxvY19zY29wZSwgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0udXNlcl9kYXRhKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICghd2FzX2FsbG9jYXRlZCAmJiBnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS53YXNfYWxsb2NhdGVkKSB7CisgICAgICAgICAgICB3YXNfYWxsb2NhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWdfaW50ZW50aW9uYWxfZmFpbF9lbmFibGVkICYmICF3YXNfYWxsb2NhdGVkKSB7CisgICAgICAgIHByaW50ZigiTm8gYWxsb2NhdGlvbnMgZXZlciBnZW5lcmF0ZWQhIik7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCAqVktBUElfQ0FMTCBBbGxvY0NhbGxiYWNrRnVuYyh2b2lkICpwVXNlckRhdGEsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlIGFsbG9jYXRpb25TY29wZSkgeworICAgIGlmIChnX2ludGVudGlvbmFsX2ZhaWxfZW5hYmxlZCkgeworICAgICAgICBpZiAoKytnX2ludGVuaW9uYWxfZmFpbF9jb3VudCA+PSBnX2ludGVuaW9uYWxfZmFpbF9pbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpaWkgPSAwOyBpaWkgPCBnX2FsbG9jYXRlZF92ZWN0b3Iuc2l6ZSgpOyBpaWkrKykgeworICAgICAgICBpZiAoIWdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLmFjdGl2ZSkgeworICAgICAgICAgICAgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0ucmVxdWVzdGVkX3NpemVfYnl0ZXMgPSBzaXplOworICAgICAgICAgICAgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0uYWN0dWFsX3NpemVfYnl0ZXMgPSBzaXplICsgKGFsaWdubWVudCAtIDEpOworICAgICAgICAgICAgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0uYWxpZ25lZF9zdGFydF9hZGRyID0gTlVMTDsKKyAgICAgICAgICAgIGdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLmFjdHVhbF9zdGFydF9hZGRyID0gbmV3IGNoYXJbZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0uYWN0dWFsX3NpemVfYnl0ZXNdOworICAgICAgICAgICAgaWYgKGdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLmFjdHVhbF9zdGFydF9hZGRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBhZGRyID0gKHVpbnQ2NF90KWdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLmFjdHVhbF9zdGFydF9hZGRyOworICAgICAgICAgICAgICAgIGFkZHIgKz0gKGFsaWdubWVudCAtIDEpOworICAgICAgICAgICAgICAgIGFkZHIgJj0gfihhbGlnbm1lbnQgLSAxKTsKKyAgICAgICAgICAgICAgICBnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5hbGlnbmVkX3N0YXJ0X2FkZHIgPSAodm9pZCAqKWFkZHI7CisgICAgICAgICAgICAgICAgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0uYWxsb2Nfc2NvcGUgPSBhbGxvY2F0aW9uU2NvcGU7CisgICAgICAgICAgICAgICAgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0udXNlcl9kYXRhID0gKHVpbnQ2NF90KXBVc2VyRGF0YTsKKyAgICAgICAgICAgICAgICBnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5hY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLndhc19hbGxvY2F0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLmFsaWduZWRfc3RhcnRfYWRkcjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRnJlZUNhbGxiYWNrRnVuYyh2b2lkICpwVXNlckRhdGEsIHZvaWQgKnBNZW1vcnkpIHsKKyAgICBmb3IgKHVpbnQzMl90IGlpaSA9IDA7IGlpaSA8IGdfYWxsb2NhdGVkX3ZlY3Rvci5zaXplKCk7IGlpaSsrKSB7CisgICAgICAgIGlmIChnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5hY3RpdmUgJiYgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0uYWxpZ25lZF9zdGFydF9hZGRyID09IHBNZW1vcnkpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLmFjdHVhbF9zdGFydF9hZGRyOworICAgICAgICAgICAgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0uYWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkICpWS0FQSV9DQUxMIFJlYWxsb2NDYWxsYmFja0Z1bmModm9pZCAqcFVzZXJEYXRhLCB2b2lkICpwT3JpZ2luYWwsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUgYWxsb2NhdGlvblNjb3BlKSB7CisgICAgaWYgKHBPcmlnaW5hbCAhPSBOVUxMKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaWlpID0gMDsgaWlpIDwgZ19hbGxvY2F0ZWRfdmVjdG9yLnNpemUoKTsgaWlpKyspIHsKKyAgICAgICAgICAgIGlmIChnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5hY3RpdmUgJiYgZ19hbGxvY2F0ZWRfdmVjdG9yW2lpaV0uYWxpZ25lZF9zdGFydF9hZGRyID09IHBPcmlnaW5hbCkgeworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgRnJlZUNhbGxiYWNrRnVuYyhwVXNlckRhdGEsIHBPcmlnaW5hbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8IGdfYWxsb2NhdGVkX3ZlY3RvcltpaWldLnJlcXVlc3RlZF9zaXplX2J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwT3JpZ2luYWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqcE5ldyA9IEFsbG9jQ2FsbGJhY2tGdW5jKHBVc2VyRGF0YSwgc2l6ZSwgYWxpZ25tZW50LCBhbGxvY2F0aW9uU2NvcGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocE5ldyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY29weV9zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5yZXF1ZXN0ZWRfc2l6ZV9ieXRlcyA8IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X3NpemUgPSBnX2FsbG9jYXRlZF92ZWN0b3JbaWlpXS5yZXF1ZXN0ZWRfc2l6ZV9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwTmV3LCBwT3JpZ2luYWwsIGNvcHlfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGcmVlQ2FsbGJhY2tGdW5jKHBVc2VyRGF0YSwgcE9yaWdpbmFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcE5ldzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFsbG9jQ2FsbGJhY2tGdW5jKHBVc2VyRGF0YSwgc2l6ZSwgYWxpZ25tZW50LCBhbGxvY2F0aW9uU2NvcGUpOworICAgIH0KK30KKwordm9pZCB0ZXN0X2NyZWF0ZV9kZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbCkgeworICAgIHVpbnQzMl90IGZhbWlseUNvdW50ID0gMDsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzaWNhbCwgJmZhbWlseUNvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfR1QoZmFtaWx5Q291bnQsIDB1KTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllc1tdPiBmYW1pbHkobmV3IFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzW2ZhbWlseUNvdW50XSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzaWNhbCwgJmZhbWlseUNvdW50LCBmYW1pbHkuZ2V0KCkpOworICAgIEFTU0VSVF9HVChmYW1pbHlDb3VudCwgMHUpOworCisgICAgZm9yICh1aW50MzJfdCBxID0gMDsgcSA8IGZhbWlseUNvdW50OyArK3EpIHsKKyAgICAgICAgaWYgKH5mYW1pbHlbcV0ucXVldWVGbGFncyAmIFZLX1FVRVVFX0dSQVBISUNTX0JJVCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBjb25zdCBwcmlvcml0aWVzW10gPSB7MC4wZn07ICAvLyBUZW1wb3JhcnkgcmVxdWlyZWQgZHVlIHRvIE1TVkMgYnVnLgorICAgICAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCBxdWV1ZUluZm9bMV17CisgICAgICAgICAgICBWSzo6RGV2aWNlUXVldWVDcmVhdGVJbmZvKCkucXVldWVGYW1pbHlJbmRleChxKS5xdWV1ZUNvdW50KDEpLnBRdWV1ZVByaW9yaXRpZXMocHJpb3JpdGllcyl9OworCisgICAgICAgIGF1dG8gY29uc3QgZGV2aWNlSW5mbyA9IFZLOjpEZXZpY2VDcmVhdGVJbmZvKCkucXVldWVDcmVhdGVJbmZvQ291bnQoMSkucFF1ZXVlQ3JlYXRlSW5mb3MocXVldWVJbmZvKTsKKworICAgICAgICBWa0RldmljZSBkZXZpY2U7CisgICAgICAgIHJlc3VsdCA9IHZrQ3JlYXRlRGV2aWNlKHBoeXNpY2FsLCBkZXZpY2VJbmZvLCBudWxscHRyLCAmZGV2aWNlKTsKKyAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICAgICAgdmtEZXN0cm95RGV2aWNlKGRldmljZSwgbnVsbHB0cik7CisgICAgfQorfQorCisvLyBUZXN0IGdyb3VwczoKKy8vIExYID0gbHVuYXIgZXhjaGFuZ2UKKy8vIExWTEdIID0gbG9hZGVyIGFuZCB2YWxpZGF0aW9uIGdpdGh1YgorLy8gTFZMR0wgPSBsb2RhZXIgYW5kIHZhbGlkYXRpb24gZ2l0bGFiCisKK1RFU1QoTFg0MzUsIEluc3RhbmNlQ3JlYXRlSW5mb0NvbnN0KSB7CisgICAgVmtJbnN0YW5jZUNyZWF0ZUluZm8gY29uc3QgaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZSgmaW5mbywgVktfTlVMTF9IQU5ETEUsICZpbnN0YW5jZSk7CisgICAgRVhQRUNUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgbnVsbHB0cik7Cit9CisKK1RFU1QoTFg0NzUsIERlc3Ryb3lJbnN0YW5jZU51bGxIYW5kbGUpIHsgdmtEZXN0cm95SW5zdGFuY2UoVktfTlVMTF9IQU5ETEUsIG51bGxwdHIpOyB9CisKK1RFU1QoTFg0NzUsIERlc3Ryb3lEZXZpY2VOdWxsSGFuZGxlKSB7IHZrRGVzdHJveURldmljZShWS19OVUxMX0hBTkRMRSwgbnVsbHB0cik7IH0KKworVEVTVChDcmVhdGVJbnN0YW5jZSwgRXh0ZW5zaW9uTm90UHJlc2VudCkgeworICAgIGNoYXIgY29uc3QgKmNvbnN0IG5hbWVzW10gPSB7Ik5vdFByZXNlbnQifTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgYXV0byBjb25zdCBpbmZvID0gVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpLmVuYWJsZWRFeHRlbnNpb25Db3VudCgxKS5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyhuYW1lcyk7CisKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShpbmZvLCBWS19OVUxMX0hBTkRMRSwgJmluc3RhbmNlKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQpOworCisgICAgLy8gSXQncyBub3QgbmVjZXNzYXJ5IHRvIGRlc3Ryb3kgdGhlIGluc3RhbmNlIGJlY2F1c2UgaXQgd2lsbCBub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCit9CisKK1RFU1QoQ3JlYXRlSW5zdGFuY2UsIExheWVyTm90UHJlc2VudCkgeworICAgIGNoYXIgY29uc3QgKmNvbnN0IG5hbWVzW10gPSB7Ik5vdFByZXNlbnQifTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgYXV0byBjb25zdCBpbmZvID0gVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpLmVuYWJsZWRMYXllckNvdW50KDEpLnBwRW5hYmxlZExheWVyTmFtZXMobmFtZXMpOworCisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoaW5mbywgVktfTlVMTF9IQU5ETEUsICZpbnN0YW5jZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfRVJST1JfTEFZRVJfTk9UX1BSRVNFTlQpOworCisgICAgLy8gSXQncyBub3QgbmVjZXNzYXJ5IHRvIGRlc3Ryb3kgdGhlIGluc3RhbmNlIGJlY2F1c2UgaXQgd2lsbCBub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCit9CisKKy8vIFVzZWQgYnkgcnVuX2xvYWRlcl90ZXN0cy5zaCB0byB0ZXN0IGZvciBsYXllciBpbnNlcnRpb24uCitURVNUKENyZWF0ZUluc3RhbmNlLCBMYXllclByZXNlbnQpIHsKKyAgICBjaGFyIGNvbnN0ICpjb25zdCBuYW1lczFbXSA9IHsiVktfTEFZRVJfTFVOQVJHX3Rlc3QifTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgY2hhciBjb25zdCAqY29uc3QgbmFtZXMyW10gPSB7IlZLX0xBWUVSX0xVTkFSR19tZXRhIn07ICAvLyBUZW1wb3JhcnkgcmVxdWlyZWQgZHVlIHRvIE1TVkMgYnVnLgorICAgIGNoYXIgY29uc3QgKmNvbnN0IG5hbWVzM1tdID0geyJWS19MQVlFUl9MVU5BUkdfbWV0YV9yZXYifTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgYXV0byBjb25zdCBpbmZvMSA9IFZLOjpJbnN0YW5jZUNyZWF0ZUluZm8oKS5lbmFibGVkTGF5ZXJDb3VudCgxKS5wcEVuYWJsZWRMYXllck5hbWVzKG5hbWVzMSk7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoaW5mbzEsIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKKworICAgIGZvciAoYXV0byBuYW1lcyA6IHtuYW1lczIsIG5hbWVzM30pIHsKKyAgICAgICAgYXV0byBjb25zdCBpbmZvMiA9IFZLOjpJbnN0YW5jZUNyZWF0ZUluZm8oKS5lbmFibGVkTGF5ZXJDb3VudCgxKS5wcEVuYWJsZWRMYXllck5hbWVzKG5hbWVzKTsKKyAgICAgICAgaW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShpbmZvMiwgVktfTlVMTF9IQU5ETEUsICZpbnN0YW5jZSk7CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgICAgIHVpbnQzMl90IGRldmljZUNvdW50OworICAgICAgICB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJmRldmljZUNvdW50LCBudWxscHRyKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VmtQaHlzaWNhbERldmljZT4gZGV2cyhkZXZpY2VDb3VudCk7CisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmZGV2aWNlQ291bnQsIGRldnMuZGF0YSgpKTsKKyAgICAgICAgdGVzdF9jcmVhdGVfZGV2aWNlKGRldnNbMF0pOworCisgICAgICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKKyAgICB9Cit9CisKKy8vIFVzZWQgYnkgcnVuX2xvYWRlcl90ZXN0cy5zaCB0byB0ZXN0IHRoYXQgY2FsbGluZyB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyB3aXRob3V0IGZpcnN0IHF1ZXJ5aW5nCisvLyB0aGUgY291bnQsIHdvcmtzLgorVEVTVChFbnVtZXJhdGVQaHlzaWNhbERldmljZXMsIE9uZUNhbGwpIHsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCksIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgdWludDMyX3QgcGh5c2ljYWxDb3VudCA9IDUwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbChuZXcgVmtQaHlzaWNhbERldmljZVtwaHlzaWNhbENvdW50XSk7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBwaHlzaWNhbC5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKK30KKworLy8gVXNlZCBieSBydW5fbG9hZGVyX3Rlc3RzLnNoIHRvIHRlc3QgZm9yIHRoZSBleHBlY3RlZCB1c2FnZSBvZiB0aGUgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgY2FsbC4KK1RFU1QoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzLCBUd29DYWxsKSB7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpLCBWS19OVUxMX0hBTkRMRSwgJmluc3RhbmNlKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHVpbnQzMl90IHBoeXNpY2FsQ291bnQgPSAwOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1BoeXNpY2FsRGV2aWNlW10+IHBoeXNpY2FsKG5ldyBWa1BoeXNpY2FsRGV2aWNlW3BoeXNpY2FsQ291bnRdKTsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIHBoeXNpY2FsLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOworfQorCisvLyBVc2VkIGJ5IHJ1bl9sb2FkZXJfdGVzdHMuc2ggdG8gdGVzdCB0aGF0IGNhbGxpbmcgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgd2l0aG91dCBmaXJzdCBxdWVyeWluZworLy8gdGhlIGNvdW50LCBtYXRjaGVzIHRoZSBjb3VudCBmcm9tIHRoZSBzdGFuZGFyZCBjYWxsLgorVEVTVChFbnVtZXJhdGVQaHlzaWNhbERldmljZXMsIE1hdGNoT25lQW5kVHdvQ2FsbE51bWJlcnMpIHsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlX29uZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpLCBWS19OVUxMX0hBTkRMRSwgJmluc3RhbmNlX29uZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICB1aW50MzJfdCBwaHlzaWNhbENvdW50X29uZSA9IDUwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbF9vbmUobmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF9vbmVdKTsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZV9vbmUsICZwaHlzaWNhbENvdW50X29uZSwgcGh5c2ljYWxfb25lLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudF9vbmUsIDB1KTsKKworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2VfdHdvID0gVktfTlVMTF9IQU5ETEU7CisgICAgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCksIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2VfdHdvKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHVpbnQzMl90IHBoeXNpY2FsQ291bnRfdHdvID0gMDsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZV90d28sICZwaHlzaWNhbENvdW50X3R3bywgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnRfdHdvLCAwdSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbF90d28obmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF90d29dKTsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZV90d28sICZwaHlzaWNhbENvdW50X3R3bywgcGh5c2ljYWxfdHdvLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudF90d28sIDB1KTsKKworICAgIEFTU0VSVF9FUShwaHlzaWNhbENvdW50X29uZSwgcGh5c2ljYWxDb3VudF90d28pOworCisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2Vfb25lLCBudWxscHRyKTsKKyAgICB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZV90d28sIG51bGxwdHIpOworfQorCisvLyBVc2VkIGJ5IHJ1bl9sb2FkZXJfdGVzdHMuc2ggdG8gdGVzdCBmb3IgdGhlIGV4cGVjdGVkIHVzYWdlIG9mIHRoZSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcworLy8gY2FsbCBpZiBub3QgZW5vdWdoIG51bWJlcnMgYXJlIHByb3ZpZGVkIGZvciB0aGUgZmluYWwgbGlzdC4KK1RFU1QoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzLCBUd29DYWxsSW5jb21wbGV0ZSkgeworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKFZLOjpJbnN0YW5jZUNyZWF0ZUluZm8oKSwgVktfTlVMTF9IQU5ETEUsICZpbnN0YW5jZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICB1aW50MzJfdCBwaHlzaWNhbENvdW50ID0gMDsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbChuZXcgVmtQaHlzaWNhbERldmljZVtwaHlzaWNhbENvdW50XSk7CisKKyAgICAvLyBSZW1vdmUgb25lIGZyb20gdGhlIHBoeXNpY2FsIGRldmljZSBjb3VudCBzbyB3ZSBjYW4gZ2V0IHRoZSBWS19JTkNPTVBMRVRFIG1lc3NhZ2UKKyAgICBwaHlzaWNhbENvdW50IC09IDE7CisKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIHBoeXNpY2FsLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19JTkNPTVBMRVRFKTsKKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKK30KKworLy8gVGVzdCB0byBtYWtlIHN1cmUgdGhhdCBsYXllcnMgZW5hYmxlZCBpbiB0aGUgaW5zdGFuY2Ugc2hvdyB1cCBpbiB0aGUgbGlzdCBvZiBkZXZpY2UgbGF5ZXJzLgorVEVTVChFbnVtZXJhdGVEZXZpY2VMYXllcnMsIExheWVyc01hdGNoKSB7CisgICAgY2hhciBjb25zdCAqY29uc3QgbmFtZXMxW10gPSB7IlZLX0xBWUVSX0xVTkFSR19tZXRhIn07CisgICAgY2hhciBjb25zdCAqY29uc3QgbmFtZXMyWzJdID0geyJWS19MQVlFUl9MVU5BUkdfdGVzdCIsICJWS19MQVlFUl9MVU5BUkdfd3JhcF9vYmplY3RzIn07CisgICAgYXV0byBjb25zdCBpbmZvMSA9IFZLOjpJbnN0YW5jZUNyZWF0ZUluZm8oKS5lbmFibGVkTGF5ZXJDb3VudCgxKS5wcEVuYWJsZWRMYXllck5hbWVzKG5hbWVzMSk7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoaW5mbzEsIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgdWludDMyX3QgcGh5c2ljYWxDb3VudCA9IDA7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFZrUGh5c2ljYWxEZXZpY2VbXT4gcGh5c2ljYWwobmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF0pOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgcGh5c2ljYWwuZ2V0KCkpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisgICAgdWludDMyX3QgY291bnQgPSAyNDsKKyAgICBWa0xheWVyUHJvcGVydGllcyBsYXllcl9wcm9wc1syNF07CisgICAgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMocGh5c2ljYWxbMF0sICZjb3VudCwgbGF5ZXJfcHJvcHMpOworICAgIEFTU0VSVF9HRShjb3VudCwgMXUpOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGlpaSA9IDA7IGlpaSA8IGNvdW50OyBpaWkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChsYXllcl9wcm9wc1tpaWldLmxheWVyTmFtZSwgbmFtZXMxWzBdKSkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBU1NFUlRfRVEoY291bnQsIDApOworICAgIH0KKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKKworICAgIGF1dG8gY29uc3QgaW5mbzIgPSBWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCkuZW5hYmxlZExheWVyQ291bnQoMikucHBFbmFibGVkTGF5ZXJOYW1lcyhuYW1lczIpOworICAgIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShpbmZvMiwgVktfTlVMTF9IQU5ETEUsICZpbnN0YW5jZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICBwaHlzaWNhbENvdW50ID0gMDsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbDIobmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF0pOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgcGh5c2ljYWwyLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgY291bnQgPSAyNDsKKyAgICB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyhwaHlzaWNhbDJbMF0sICZjb3VudCwgbGF5ZXJfcHJvcHMpOworICAgIEFTU0VSVF9HRShjb3VudCwgMnUpOworICAgIGZvciAodWludDMyX3QgampqID0gMDsgampqIDwgMjsgampqKyspIHsKKyAgICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpaWkgPSAwOyBpaWkgPCBjb3VudDsgaWlpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGxheWVyX3Byb3BzW2lpaV0ubGF5ZXJOYW1lLCBuYW1lczJbampqXSkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQVNTRVJUX0VRKGNvdW50LCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKK30KKworVEVTVChDcmVhdGVEZXZpY2UsIEV4dGVuc2lvbk5vdFByZXNlbnQpIHsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCksIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgdWludDMyX3QgcGh5c2ljYWxDb3VudCA9IDA7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFZrUGh5c2ljYWxEZXZpY2VbXT4gcGh5c2ljYWwobmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF0pOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgcGh5c2ljYWwuZ2V0KCkpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgcGh5c2ljYWxDb3VudDsgKytwKSB7CisgICAgICAgIHVpbnQzMl90IGZhbWlseUNvdW50ID0gMDsKKyAgICAgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzaWNhbFtwXSwgJmZhbWlseUNvdW50LCBudWxscHRyKTsKKyAgICAgICAgQVNTRVJUX0dUKGZhbWlseUNvdW50LCAwdSk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzW10+IGZhbWlseShuZXcgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXNbZmFtaWx5Q291bnRdKTsKKyAgICAgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzaWNhbFtwXSwgJmZhbWlseUNvdW50LCBmYW1pbHkuZ2V0KCkpOworICAgICAgICBBU1NFUlRfR1QoZmFtaWx5Q291bnQsIDB1KTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IHEgPSAwOyBxIDwgZmFtaWx5Q291bnQ7ICsrcSkgeworICAgICAgICAgICAgaWYgKH5mYW1pbHlbcV0ucXVldWVGbGFncyAmIFZLX1FVRVVFX0dSQVBISUNTX0JJVCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmbG9hdCBjb25zdCBwcmlvcml0aWVzW10gPSB7MC4wZn07ICAvLyBUZW1wb3JhcnkgcmVxdWlyZWQgZHVlIHRvIE1TVkMgYnVnLgorICAgICAgICAgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gY29uc3QgcXVldWVJbmZvWzFdeworICAgICAgICAgICAgICAgIFZLOjpEZXZpY2VRdWV1ZUNyZWF0ZUluZm8oKS5xdWV1ZUZhbWlseUluZGV4KHEpLnF1ZXVlQ291bnQoMSkucFF1ZXVlUHJpb3JpdGllcyhwcmlvcml0aWVzKX07CisKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKmNvbnN0IG5hbWVzW10gPSB7Ik5vdFByZXNlbnQifTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgICAgICAgICBhdXRvIGNvbnN0IGRldmljZUluZm8gPSBWSzo6RGV2aWNlQ3JlYXRlSW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXVlQ3JlYXRlSW5mb0NvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBRdWV1ZUNyZWF0ZUluZm9zKHF1ZXVlSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5hYmxlZEV4dGVuc2lvbkNvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKG5hbWVzKTsKKworICAgICAgICAgICAgVmtEZXZpY2UgZGV2aWNlOworICAgICAgICAgICAgcmVzdWx0ID0gdmtDcmVhdGVEZXZpY2UocGh5c2ljYWxbcF0sIGRldmljZUluZm8sIG51bGxwdHIsICZkZXZpY2UpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UKTsKKworICAgICAgICAgICAgLy8gSXQncyBub3QgbmVjZXNzYXJ5IHRvIGRlc3Ryb3kgdGhlIGRldmljZSBiZWNhdXNlIGl0IHdpbGwgbm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICB9CisgICAgfQorCisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOworfQorCisvLyBMWDUzNSAvIE1JLTc2OiBEZXZpY2UgbGF5ZXJzIGFyZSBkZXByZWNhdGVkLgorLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGV5IGFyZSBhbGxvd2VkLCBidXQgbXVzdCBiZSBpZ25vcmVkLgorLy8gRW5zdXJlIHRoYXQgbm8gZXJyb3JzIG9jY3VyIGlmIGEgYm9ndXMgZGV2aWNlIGxheWVyIGxpc3QgaXMgcGFzc2VkIHRvIHZrQ3JlYXRlRGV2aWNlLgorVEVTVChDcmVhdGVEZXZpY2UsIExheWVyc05vdFByZXNlbnQpIHsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCksIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgdWludDMyX3QgcGh5c2ljYWxDb3VudCA9IDA7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFZrUGh5c2ljYWxEZXZpY2VbXT4gcGh5c2ljYWwobmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF0pOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgcGh5c2ljYWwuZ2V0KCkpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgcGh5c2ljYWxDb3VudDsgKytwKSB7CisgICAgICAgIHVpbnQzMl90IGZhbWlseUNvdW50ID0gMDsKKyAgICAgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzaWNhbFtwXSwgJmZhbWlseUNvdW50LCBudWxscHRyKTsKKyAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgICAgIEFTU0VSVF9HVChmYW1pbHlDb3VudCwgMHUpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllc1tdPiBmYW1pbHkobmV3IFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzW2ZhbWlseUNvdW50XSk7CisgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5c2ljYWxbcF0sICZmYW1pbHlDb3VudCwgZmFtaWx5LmdldCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgICAgIEFTU0VSVF9HVChmYW1pbHlDb3VudCwgMHUpOworCisgICAgICAgIGZvciAodWludDMyX3QgcSA9IDA7IHEgPCBmYW1pbHlDb3VudDsgKytxKSB7CisgICAgICAgICAgICBpZiAofmZhbWlseVtxXS5xdWV1ZUZsYWdzICYgVktfUVVFVUVfR1JBUEhJQ1NfQklUKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsb2F0IGNvbnN0IHByaW9yaXRpZXNbXSA9IHswLjBmfTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgICAgICAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCBxdWV1ZUluZm9bMV17CisgICAgICAgICAgICAgICAgVks6OkRldmljZVF1ZXVlQ3JlYXRlSW5mbygpLnF1ZXVlRmFtaWx5SW5kZXgocSkucXVldWVDb3VudCgxKS5wUXVldWVQcmlvcml0aWVzKHByaW9yaXRpZXMpfTsKKworICAgICAgICAgICAgY2hhciBjb25zdCAqY29uc3QgbmFtZXNbXSA9IHsiTm90UHJlc2VudCJ9OyAgLy8gVGVtcG9yYXJ5IHJlcXVpcmVkIGR1ZSB0byBNU1ZDIGJ1Zy4KKyAgICAgICAgICAgIGF1dG8gY29uc3QgZGV2aWNlSW5mbyA9IFZLOjpEZXZpY2VDcmVhdGVJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVldWVDcmVhdGVJbmZvQ291bnQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucFF1ZXVlQ3JlYXRlSW5mb3MocXVldWVJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmFibGVkTGF5ZXJDb3VudCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcEVuYWJsZWRMYXllck5hbWVzKG5hbWVzKTsKKworICAgICAgICAgICAgVmtEZXZpY2UgZGV2aWNlOworICAgICAgICAgICAgcmVzdWx0ID0gdmtDcmVhdGVEZXZpY2UocGh5c2ljYWxbcF0sIGRldmljZUluZm8sIG51bGxwdHIsICZkZXZpY2UpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICAgICAgICAgIHZrRGVzdHJveURldmljZShkZXZpY2UsIG51bGxwdHIpOworICAgICAgICB9CisgICAgfQorCisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOworfQorCitURVNUX0YoRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMsIFByb3BlcnR5Q291bnRMZXNzVGhhbkF2YWlsYWJsZSkgeworICAgIHVpbnQzMl90IGNvdW50ID0gMHU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygmY291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgLy8gV2UgbmVlZCBhdGxlYXN0IHR3byBmb3IgdGhlIHRlc3QgdG8gYmUgcmVsZXZhbnQuCisgICAgaWYgKGNvdW50IDwgMnUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa0xheWVyUHJvcGVydGllc1tdPiBwcm9wZXJ0aWVzKG5ldyBWa0xheWVyUHJvcGVydGllc1tjb3VudF0pOworICAgIGNvdW50ID0gMTsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKCZjb3VudCwgcHJvcGVydGllcy5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfSU5DT01QTEVURSk7Cit9CisKK1RFU1QoRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzLCBQcm9wZXJ0eUNvdW50TGVzc1RoYW5BdmFpbGFibGUpIHsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCksIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgdWludDMyX3QgcGh5c2ljYWxDb3VudCA9IDA7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFZrUGh5c2ljYWxEZXZpY2VbXT4gcGh5c2ljYWwobmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF0pOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgcGh5c2ljYWwuZ2V0KCkpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgcGh5c2ljYWxDb3VudDsgKytwKSB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMHU7CisgICAgICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKHBoeXNpY2FsW3BdLCAmY291bnQsIG51bGxwdHIpOworICAgICAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgICAgICAvLyBXZSBuZWVkIGF0bGVhc3QgdHdvIGZvciB0aGUgdGVzdCB0byBiZSByZWxldmFudC4KKyAgICAgICAgaWYgKGNvdW50IDwgMnUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFZrTGF5ZXJQcm9wZXJ0aWVzW10+IHByb3BlcnRpZXMobmV3IFZrTGF5ZXJQcm9wZXJ0aWVzW2NvdW50XSk7CisgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMocGh5c2ljYWxbcF0sICZjb3VudCwgcHJvcGVydGllcy5nZXQoKSk7CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX0lOQ09NUExFVEUpOworICAgIH0KKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKK30KKworVEVTVF9GKEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzLCBDb3VudCkgeworICAgIHVpbnQzMl90IGNvdW50ID0gMHU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygmY291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgaWYgKHN0ZDo6ZmluZChhcmd1bWVudHMuYmVnaW4oKSwgYXJndW1lbnRzLmVuZCgpLCAiY291bnQiKSAhPSBhcmd1bWVudHMuZW5kKCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJjb3VudD0iIDw8IGNvdW50IDw8ICdcbic7CisgICAgfQorfQorCitURVNUX0YoRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMsIE9uZVBhc3MpIHsKKyAgICAvLyBDb3VudCByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LgorICAgIGlmIChzdGQ6OmZpbmQoYXJndW1lbnRzLmJlZ2luKCksIGFyZ3VtZW50cy5lbmQoKSwgImNvdW50IikgPT0gYXJndW1lbnRzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3VudCA9IHN0ZDo6c3RvdWwoYXJndW1lbnRzWzJdKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa0xheWVyUHJvcGVydGllc1tdPiBwcm9wZXJ0aWVzKG5ldyBWa0xheWVyUHJvcGVydGllc1tjb3VudF0pOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoJmNvdW50LCBwcm9wZXJ0aWVzLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIGlmIChzdGQ6OmZpbmQoYXJndW1lbnRzLmJlZ2luKCksIGFyZ3VtZW50cy5lbmQoKSwgInByb3BlcnRpZXMiKSAhPSBhcmd1bWVudHMuZW5kKCkpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IGNvdW50OyArK3ApIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAicHJvcGVydGllc1siIDw8IHAgPDwgIl0gPSIgPDwgJyAnIDw8IHByb3BlcnRpZXNbcF0ubGF5ZXJOYW1lIDw8ICcgJyA8PCBwcm9wZXJ0aWVzW3BdLnNwZWNWZXJzaW9uIDw8ICcgJworICAgICAgICAgICAgICAgICAgICAgIDw8IHByb3BlcnRpZXNbcF0uaW1wbGVtZW50YXRpb25WZXJzaW9uIDw8ICcgJyA8PCBwcm9wZXJ0aWVzW3BdLmRlc2NyaXB0aW9uIDw8ICdcbic7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcywgVHdvUGFzcykgeworICAgIHVpbnQzMl90IGNvdW50ID0gMHU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygmY291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFZrTGF5ZXJQcm9wZXJ0aWVzW10+IHByb3BlcnRpZXMobmV3IFZrTGF5ZXJQcm9wZXJ0aWVzW2NvdW50XSk7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygmY291bnQsIHByb3BlcnRpZXMuZ2V0KCkpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgaWYgKHN0ZDo6ZmluZChhcmd1bWVudHMuYmVnaW4oKSwgYXJndW1lbnRzLmVuZCgpLCAicHJvcGVydGllcyIpICE9IGFyZ3VtZW50cy5lbmQoKSkgeworICAgICAgICBmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgY291bnQ7ICsrcCkgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJwcm9wZXJ0aWVzWyIgPDwgcCA8PCAiXSA9IiA8PCAnICcgPDwgcHJvcGVydGllc1twXS5sYXllck5hbWUgPDwgJyAnIDw8IHByb3BlcnRpZXNbcF0uc3BlY1ZlcnNpb24gPDwgJyAnCisgICAgICAgICAgICAgICAgICAgICAgPDwgcHJvcGVydGllc1twXS5pbXBsZW1lbnRhdGlvblZlcnNpb24gPDwgJyAnIDw8IHByb3BlcnRpZXNbcF0uZGVzY3JpcHRpb24gPDwgJ1xuJzsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcywgUHJvcGVydHlDb3VudExlc3NUaGFuQXZhaWxhYmxlKSB7CisgICAgdWludDMyX3QgY291bnQgPSAwdTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhudWxscHRyLCAmY291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgLy8gV2UgbmVlZCBhdGxlYXN0IHR3byBmb3IgdGhlIHRlc3QgdG8gYmUgcmVsZXZhbnQuCisgICAgaWYgKGNvdW50IDwgMnUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa0V4dGVuc2lvblByb3BlcnRpZXNbXT4gcHJvcGVydGllcyhuZXcgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzW2NvdW50XSk7CisgICAgY291bnQgPSAxOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIsICZjb3VudCwgcHJvcGVydGllcy5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfSU5DT01QTEVURSk7Cit9CisKK1RFU1QoRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcywgUHJvcGVydHlDb3VudExlc3NUaGFuQXZhaWxhYmxlKSB7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpLCBWS19OVUxMX0hBTkRMRSwgJmluc3RhbmNlKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHVpbnQzMl90IHBoeXNpY2FsQ291bnQgPSAwOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1BoeXNpY2FsRGV2aWNlW10+IHBoeXNpY2FsKG5ldyBWa1BoeXNpY2FsRGV2aWNlW3BoeXNpY2FsQ291bnRdKTsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIHBoeXNpY2FsLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IHBoeXNpY2FsQ291bnQ7ICsrcCkgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDB1OworICAgICAgICByZXN1bHQgPSB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMocGh5c2ljYWxbcF0sIG51bGxwdHIsICZjb3VudCwgbnVsbHB0cik7CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgICAgIC8vIFdlIG5lZWQgYXRsZWFzdCB0d28gZm9yIHRoZSB0ZXN0IHRvIGJlIHJlbGV2YW50LgorICAgICAgICBpZiAoY291bnQgPCAydSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzW10+IHByb3BlcnRpZXMobmV3IFZrRXh0ZW5zaW9uUHJvcGVydGllc1tjb3VudF0pOworICAgICAgICBjb3VudCA9IDE7CisgICAgICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhwaHlzaWNhbFtwXSwgbnVsbHB0ciwgJmNvdW50LCBwcm9wZXJ0aWVzLmdldCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfSU5DT01QTEVURSk7CisgICAgfQorCisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOworfQorCitURVNUX0YoRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLCBDb3VudCkgeworICAgIHVpbnQzMl90IGNvdW50ID0gMHU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMobnVsbHB0ciwgJmNvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIGlmIChzdGQ6OmZpbmQoYXJndW1lbnRzLmJlZ2luKCksIGFyZ3VtZW50cy5lbmQoKSwgImNvdW50IikgIT0gYXJndW1lbnRzLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiY291bnQ9IiA8PCBjb3VudCA8PCAnXG4nOworICAgIH0KK30KKworVEVTVF9GKEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcywgT25lUGFzcykgeworICAgIC8vIENvdW50IHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuCisgICAgaWYgKHN0ZDo6ZmluZChhcmd1bWVudHMuYmVnaW4oKSwgYXJndW1lbnRzLmVuZCgpLCAiY291bnQiKSA9PSBhcmd1bWVudHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IGNvdW50ID0gc3RkOjpzdG91bChhcmd1bWVudHNbMl0pOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFZrRXh0ZW5zaW9uUHJvcGVydGllc1tdPiBwcm9wZXJ0aWVzKG5ldyBWa0V4dGVuc2lvblByb3BlcnRpZXNbY291bnRdKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhudWxscHRyLCAmY291bnQsIHByb3BlcnRpZXMuZ2V0KCkpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgaWYgKHN0ZDo6ZmluZChhcmd1bWVudHMuYmVnaW4oKSwgYXJndW1lbnRzLmVuZCgpLCAicHJvcGVydGllcyIpICE9IGFyZ3VtZW50cy5lbmQoKSkgeworICAgICAgICBmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgY291bnQ7ICsrcCkgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJwcm9wZXJ0aWVzWyIgPDwgcCA8PCAiXSA9IiA8PCAnICcgPDwgcHJvcGVydGllc1twXS5leHRlbnNpb25OYW1lIDw8ICcgJyA8PCBwcm9wZXJ0aWVzW3BdLnNwZWNWZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcywgVHdvUGFzcykgeworICAgIHVpbnQzMl90IGNvdW50ID0gMHU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMobnVsbHB0ciwgJmNvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa0V4dGVuc2lvblByb3BlcnRpZXNbXT4gcHJvcGVydGllcyhuZXcgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzW2NvdW50XSk7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMobnVsbHB0ciwgJmNvdW50LCBwcm9wZXJ0aWVzLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIGlmIChzdGQ6OmZpbmQoYXJndW1lbnRzLmJlZ2luKCksIGFyZ3VtZW50cy5lbmQoKSwgInByb3BlcnRpZXMiKSAhPSBhcmd1bWVudHMuZW5kKCkpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IGNvdW50OyArK3ApIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAicHJvcGVydGllc1siIDw8IHAgPDwgIl0gPSIgPDwgJyAnIDw8IHByb3BlcnRpZXNbcF0uZXh0ZW5zaW9uTmFtZSA8PCAnICcgPDwgcHJvcGVydGllc1twXS5zcGVjVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgIDw8ICdcbic7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMsIEluc3RhbmNlRXh0ZW5zaW9uRW51bWVyYXRlZCkgeworICAgIHVpbnQzMl90IGNvdW50ID0gMHU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMobnVsbHB0ciwgJmNvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa0V4dGVuc2lvblByb3BlcnRpZXNbXT4gcHJvcGVydGllcyhuZXcgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzW2NvdW50XSk7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMobnVsbHB0ciwgJmNvdW50LCBwcm9wZXJ0aWVzLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIEFTU0VSVF9ORShzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgICAmcHJvcGVydGllc1swXSwgJnByb3BlcnRpZXNbY291bnRdLAorICAgICAgICAgICAgICAgICAgW10oVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIGNvbnN0ICZwcm9wZXJ0aWVzKSB7IHJldHVybiBzdHJjbXAocHJvcGVydGllcy5leHRlbnNpb25OYW1lLCAiVktfS0hSX3N1cmZhY2UiKSA9PSAwOyB9KSwKKyAgICAgICAgICAgICAgJnByb3BlcnRpZXNbY291bnRdKTsKK30KKworVEVTVChFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLCBEZXZpY2VFeHRlbnNpb25FbnVtZXJhdGVkKSB7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpLCBWS19OVUxMX0hBTkRMRSwgJmluc3RhbmNlKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHVpbnQzMl90IHBoeXNpY2FsQ291bnQgPSAwOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1BoeXNpY2FsRGV2aWNlW10+IHBoeXNpY2FsKG5ldyBWa1BoeXNpY2FsRGV2aWNlW3BoeXNpY2FsQ291bnRdKTsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIHBoeXNpY2FsLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IHBoeXNpY2FsQ291bnQ7ICsrcCkgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDB1OworICAgICAgICByZXN1bHQgPSB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMocGh5c2ljYWxbcF0sIG51bGxwdHIsICZjb3VudCwgbnVsbHB0cik7CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxWa0V4dGVuc2lvblByb3BlcnRpZXNbXT4gcHJvcGVydGllcyhuZXcgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzW2NvdW50XSk7CisgICAgICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhwaHlzaWNhbFtwXSwgbnVsbHB0ciwgJmNvdW50LCBwcm9wZXJ0aWVzLmdldCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICAgICAgQVNTRVJUX05FKHN0ZDo6ZmluZF9pZigmcHJvcGVydGllc1swXSwgJnByb3BlcnRpZXNbY291bnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKFZrRXh0ZW5zaW9uUHJvcGVydGllcyBjb25zdCAmcHJvcGVydGllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyY21wKHByb3BlcnRpZXMuZXh0ZW5zaW9uTmFtZSwgIlZLX0tIUl9zd2FwY2hhaW4iKSA9PSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgJnByb3BlcnRpZXNbY291bnRdKTsKKyAgICB9CisKKyAgICB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihJbXBsaWNpdExheWVyLCBQcmVzZW50KSB7CisgICAgYXV0byBjb25zdCBpbmZvID0gVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpOworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKGluZm8sIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOworfQorCitURVNUKFdyYXBPYmplY3RzLCBJbnNlcnQpIHsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCksIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgdWludDMyX3QgcGh5c2ljYWxDb3VudCA9IDA7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFZrUGh5c2ljYWxEZXZpY2VbXT4gcGh5c2ljYWwobmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF0pOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgcGh5c2ljYWwuZ2V0KCkpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgcGh5c2ljYWxDb3VudDsgKytwKSB7CisgICAgICAgIHRlc3RfY3JlYXRlX2RldmljZShwaHlzaWNhbFtwXSk7CisgICAgfQorCisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOworfQorCisvLyBUZXN0IG1ha2luZyBzdXJlIHRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHRvIGFsbG9jYXRlIGFuZCBjbGVhbnVwIGV2ZXJ5dGhpbmcgZHVyaW5nCisvLyBhIENyZWF0ZUluc3RhbmNlL0Rlc3Ryb3lJbnN0YW5jZSBjYWxsIHBhaXIuCitURVNUKEFsbG9jYXRpb24sIEluc3RhbmNlKSB7CisgICAgYXV0byBjb25zdCBpbmZvID0gVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpOworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0FsbG9jYXRpb25DYWxsYmFja3MgYWxsb2NfY2FsbGJhY2tzID0ge307CisgICAgYWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSA9ICh2b2lkICopMHgwMDAwMDAwMTsKKyAgICBhbGxvY19jYWxsYmFja3MucGZuQWxsb2NhdGlvbiA9IEFsbG9jQ2FsbGJhY2tGdW5jOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5SZWFsbG9jYXRpb24gPSBSZWFsbG9jQ2FsbGJhY2tGdW5jOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5GcmVlID0gRnJlZUNhbGxiYWNrRnVuYzsKKworICAgIEluaXRBbGxvY1RyYWNrZXIoMjA0OCk7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKGluZm8sICZhbGxvY19jYWxsYmFja3MsICZpbnN0YW5jZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICBhbGxvY19jYWxsYmFja3MucFVzZXJEYXRhID0gKHZvaWQgKikweDAwMDAwMDAyOworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCAmYWxsb2NfY2FsbGJhY2tzKTsKKworICAgIC8vIE1ha2Ugc3VyZSBldmVyeXRoaW5nJ3MgYmVlbiBmcmVlZAorICAgIEFTU0VSVF9FUSh0cnVlLCBJc0FsbG9jVHJhY2tlckVtcHR5KCkpOworICAgIEZyZWVBbGxvY1RyYWNrZXIoKTsKK30KKworLy8gVGVzdCBtYWtpbmcgc3VyZSB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB0byBhbGxvY2F0ZSBhbmQgY2xlYW51cCBldmVyeXRoaW5nIGR1cmluZworLy8gYSBDcmVhdGVJbnN0YW5jZS9EZXN0cm95SW5zdGFuY2UgY2FsbCBwYWlyIHdpdGggYSBjYWxsIHRvIEdldEluc3RhbmNlUHJvY0FkZHIuCitURVNUKEFsbG9jYXRpb24sIEdldEluc3RhbmNlUHJvY0FkZHIpIHsKKyAgICBhdXRvIGNvbnN0IGluZm8gPSBWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCk7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY19jYWxsYmFja3MgPSB7fTsKKyAgICBhbGxvY19jYWxsYmFja3MucFVzZXJEYXRhID0gKHZvaWQgKikweDAwMDAwMDEwOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5BbGxvY2F0aW9uID0gQWxsb2NDYWxsYmFja0Z1bmM7CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmblJlYWxsb2NhdGlvbiA9IFJlYWxsb2NDYWxsYmFja0Z1bmM7CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmbkZyZWUgPSBGcmVlQ2FsbGJhY2tGdW5jOworCisgICAgSW5pdEFsbG9jVHJhY2tlcigyMDQ4KTsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoaW5mbywgJmFsbG9jX2NhbGxiYWNrcywgJmluc3RhbmNlKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHZvaWQgKnBmbkNyZWF0ZURldmljZSA9ICh2b2lkICopdmtHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCAidmtDcmVhdGVEZXZpY2UiKTsKKyAgICB2b2lkICpwZm5EZXN0cm95RGV2aWNlID0gKHZvaWQgKil2a0dldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsICJ2a0Rlc3Ryb3lEZXZpY2UiKTsKKyAgICBBU1NFUlRfVFJVRShwZm5DcmVhdGVEZXZpY2UgIT0gTlVMTCAmJiBwZm5EZXN0cm95RGV2aWNlICE9IE5VTEwpOworCisgICAgYWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSA9ICh2b2lkICopMHgwMDAwMDAxMTsKKyAgICB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgJmFsbG9jX2NhbGxiYWNrcyk7CisKKyAgICAvLyBNYWtlIHN1cmUgZXZlcnl0aGluZydzIGJlZW4gZnJlZWQKKyAgICBBU1NFUlRfRVEodHJ1ZSwgSXNBbGxvY1RyYWNrZXJFbXB0eSgpKTsKKyAgICBGcmVlQWxsb2NUcmFja2VyKCk7Cit9CisKKy8vIFRlc3QgbWFraW5nIHN1cmUgdGhlIGFsbG9jYXRpb24gZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8gYWxsb2NhdGUgYW5kIGNsZWFudXAgZXZlcnl0aGluZyBkdXJpbmcKKy8vIGEgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgY2FsbCBwYWlyLgorVEVTVChBbGxvY2F0aW9uLCBFbnVtZXJhdGVQaHlzaWNhbERldmljZXMpIHsKKyAgICBhdXRvIGNvbnN0IGluZm8gPSBWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCk7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY19jYWxsYmFja3MgPSB7fTsKKyAgICBhbGxvY19jYWxsYmFja3MucFVzZXJEYXRhID0gKHZvaWQgKikweDAwMDAwMDIxOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5BbGxvY2F0aW9uID0gQWxsb2NDYWxsYmFja0Z1bmM7CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmblJlYWxsb2NhdGlvbiA9IFJlYWxsb2NDYWxsYmFja0Z1bmM7CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmbkZyZWUgPSBGcmVlQ2FsbGJhY2tGdW5jOworCisgICAgSW5pdEFsbG9jVHJhY2tlcigyMDQ4KTsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoaW5mbywgJmFsbG9jX2NhbGxiYWNrcywgJmluc3RhbmNlKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHVpbnQzMl90IHBoeXNpY2FsQ291bnQgPSAwOworICAgIGFsbG9jX2NhbGxiYWNrcy5wVXNlckRhdGEgPSAodm9pZCAqKTB4MDAwMDAwMjI7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFZrUGh5c2ljYWxEZXZpY2VbXT4gcGh5c2ljYWwobmV3IFZrUGh5c2ljYWxEZXZpY2VbcGh5c2ljYWxDb3VudF0pOworICAgIGFsbG9jX2NhbGxiYWNrcy5wVXNlckRhdGEgPSAodm9pZCAqKTB4MDAwMDAwMjM7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBwaHlzaWNhbC5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIGFsbG9jX2NhbGxiYWNrcy5wVXNlckRhdGEgPSAodm9pZCAqKTB4MDAwMDAwMjQ7CisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsICZhbGxvY19jYWxsYmFja3MpOworCisgICAgLy8gTWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBiZWVuIGZyZWVkCisgICAgQVNTRVJUX0VRKHRydWUsIElzQWxsb2NUcmFja2VyRW1wdHkoKSk7CisgICAgRnJlZUFsbG9jVHJhY2tlcigpOworfQorCisvLyBUZXN0IG1ha2luZyBzdXJlIHRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHRvIGFsbG9jYXRlIGFuZCBjbGVhbnVwIGV2ZXJ5dGhpbmcgZnJvbQorLy8gdmtDcmVhdGVJbnN0YW5jZSwgdG8gdmtDcmVhdGVEZXZpY2NlLCBhbmQgdGhlbiB0aHJvdWdoIHRoZWlyIGRlc3RydWN0b3JzLiAgV2l0aCBzcGVjaWFsCisvLyBhbGxvY2F0b3JzIHVzZWQgb24gYm90aCB0aGUgaW5zdGFuY2UgYW5kIGRldmljZS4KK1RFU1QoQWxsb2NhdGlvbiwgSW5zdGFuY2VBbmREZXZpY2UpIHsKKyAgICBhdXRvIGNvbnN0IGluZm8gPSBWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCk7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY19jYWxsYmFja3MgPSB7fTsKKyAgICBhbGxvY19jYWxsYmFja3MucFVzZXJEYXRhID0gKHZvaWQgKikweDAwMDAwMDMxOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5BbGxvY2F0aW9uID0gQWxsb2NDYWxsYmFja0Z1bmM7CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmblJlYWxsb2NhdGlvbiA9IFJlYWxsb2NDYWxsYmFja0Z1bmM7CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmbkZyZWUgPSBGcmVlQ2FsbGJhY2tGdW5jOworCisgICAgSW5pdEFsbG9jVHJhY2tlcigyMDQ4KTsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoaW5mbywgJmFsbG9jX2NhbGxiYWNrcywgJmluc3RhbmNlKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgIHVpbnQzMl90IHBoeXNpY2FsQ291bnQgPSAwOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c2ljYWxDb3VudCwgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1BoeXNpY2FsRGV2aWNlW10+IHBoeXNpY2FsKG5ldyBWa1BoeXNpY2FsRGV2aWNlW3BoeXNpY2FsQ291bnRdKTsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIHBoeXNpY2FsLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c2ljYWxDb3VudCwgMHUpOworCisgICAgZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IHBoeXNpY2FsQ291bnQ7ICsrcCkgeworICAgICAgICB1aW50MzJfdCBmYW1pbHlDb3VudCA9IDA7CisgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5c2ljYWxbcF0sICZmYW1pbHlDb3VudCwgbnVsbHB0cik7CisgICAgICAgIEFTU0VSVF9HVChmYW1pbHlDb3VudCwgMHUpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllc1tdPiBmYW1pbHkobmV3IFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzW2ZhbWlseUNvdW50XSk7CisgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5c2ljYWxbcF0sICZmYW1pbHlDb3VudCwgZmFtaWx5LmdldCgpKTsKKyAgICAgICAgQVNTRVJUX0dUKGZhbWlseUNvdW50LCAwdSk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBxID0gMDsgcSA8IGZhbWlseUNvdW50OyArK3EpIHsKKyAgICAgICAgICAgIGlmICh+ZmFtaWx5W3FdLnF1ZXVlRmxhZ3MgJiBWS19RVUVVRV9HUkFQSElDU19CSVQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmxvYXQgY29uc3QgcHJpb3JpdGllc1tdID0gezAuMGZ9OyAgLy8gVGVtcG9yYXJ5IHJlcXVpcmVkIGR1ZSB0byBNU1ZDIGJ1Zy4KKyAgICAgICAgICAgIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIGNvbnN0IHF1ZXVlSW5mb1sxXXsKKyAgICAgICAgICAgICAgICBWSzo6RGV2aWNlUXVldWVDcmVhdGVJbmZvKCkucXVldWVGYW1pbHlJbmRleChxKS5xdWV1ZUNvdW50KDEpLnBRdWV1ZVByaW9yaXRpZXMocHJpb3JpdGllcyl9OworCisgICAgICAgICAgICBhdXRvIGNvbnN0IGRldmljZUluZm8gPSBWSzo6RGV2aWNlQ3JlYXRlSW5mbygpLnF1ZXVlQ3JlYXRlSW5mb0NvdW50KDEpLnBRdWV1ZUNyZWF0ZUluZm9zKHF1ZXVlSW5mbyk7CisKKyAgICAgICAgICAgIFZrRGV2aWNlIGRldmljZTsKKyAgICAgICAgICAgIGFsbG9jX2NhbGxiYWNrcy5wVXNlckRhdGEgPSAodm9pZCAqKTB4MDAwMDAwMzI7CisgICAgICAgICAgICByZXN1bHQgPSB2a0NyZWF0ZURldmljZShwaHlzaWNhbFtwXSwgZGV2aWNlSW5mbywgJmFsbG9jX2NhbGxiYWNrcywgJmRldmljZSk7CisgICAgICAgICAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgICAgICAgICAgYWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSA9ICh2b2lkICopMHgwMDAwMDAzMzsKKyAgICAgICAgICAgIHZrRGVzdHJveURldmljZShkZXZpY2UsICZhbGxvY19jYWxsYmFja3MpOworICAgICAgICB9CisgICAgfQorCisgICAgYWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSA9ICh2b2lkICopMHgwMDAwMDAzNDsKKyAgICB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgJmFsbG9jX2NhbGxiYWNrcyk7CisKKyAgICAvLyBNYWtlIHN1cmUgZXZlcnl0aGluZydzIGJlZW4gZnJlZWQKKyAgICBBU1NFUlRfRVEodHJ1ZSwgSXNBbGxvY1RyYWNrZXJFbXB0eSgpKTsKKyAgICBGcmVlQWxsb2NUcmFja2VyKCk7Cit9CisKKy8vIFRlc3QgbWFraW5nIHN1cmUgdGhlIGFsbG9jYXRpb24gZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8gYWxsb2NhdGUgYW5kIGNsZWFudXAgZXZlcnl0aGluZyBmcm9tCisvLyB2a0NyZWF0ZUluc3RhbmNlLCB0byB2a0NyZWF0ZURldmljY2UsIGFuZCB0aGVuIHRocm91Z2ggdGhlaXIgZGVzdHJ1Y3RvcnMuICBXaXRoIHNwZWNpYWwKKy8vIGFsbG9jYXRvcnMgdXNlZCBvbiBvbmx5IHRoZSBpbnN0YW5jZSBhbmQgbm90IHRoZSBkZXZpY2UuCitURVNUKEFsbG9jYXRpb24sIEluc3RhbmNlQnV0Tm90RGV2aWNlKSB7CisgICAgYXV0byBjb25zdCBpbmZvID0gVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpOworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0FsbG9jYXRpb25DYWxsYmFja3MgYWxsb2NfY2FsbGJhY2tzID0ge307CisgICAgYWxsb2NfY2FsbGJhY2tzLnBVc2VyRGF0YSA9ICh2b2lkICopMHgwMDAwMDA0MTsKKyAgICBhbGxvY19jYWxsYmFja3MucGZuQWxsb2NhdGlvbiA9IEFsbG9jQ2FsbGJhY2tGdW5jOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5SZWFsbG9jYXRpb24gPSBSZWFsbG9jQ2FsbGJhY2tGdW5jOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5GcmVlID0gRnJlZUNhbGxiYWNrRnVuYzsKKworICAgIEluaXRBbGxvY1RyYWNrZXIoMjA0OCk7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKGluZm8sICZhbGxvY19jYWxsYmFja3MsICZpbnN0YW5jZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICB1aW50MzJfdCBwaHlzaWNhbENvdW50ID0gMDsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbChuZXcgVmtQaHlzaWNhbERldmljZVtwaHlzaWNhbENvdW50XSk7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBwaHlzaWNhbC5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIGZvciAodWludDMyX3QgcCA9IDA7IHAgPCBwaHlzaWNhbENvdW50OyArK3ApIHsKKyAgICAgICAgdWludDMyX3QgZmFtaWx5Q291bnQgPSAwOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsW3BdLCAmZmFtaWx5Q291bnQsIG51bGxwdHIpOworICAgICAgICBBU1NFUlRfR1QoZmFtaWx5Q291bnQsIDB1KTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXNbXT4gZmFtaWx5KG5ldyBWa1F1ZXVlRmFtaWx5UHJvcGVydGllc1tmYW1pbHlDb3VudF0pOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsW3BdLCAmZmFtaWx5Q291bnQsIGZhbWlseS5nZXQoKSk7CisgICAgICAgIEFTU0VSVF9HVChmYW1pbHlDb3VudCwgMHUpOworCisgICAgICAgIGZvciAodWludDMyX3QgcSA9IDA7IHEgPCBmYW1pbHlDb3VudDsgKytxKSB7CisgICAgICAgICAgICBpZiAofmZhbWlseVtxXS5xdWV1ZUZsYWdzICYgVktfUVVFVUVfR1JBUEhJQ1NfQklUKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsb2F0IGNvbnN0IHByaW9yaXRpZXNbXSA9IHswLjBmfTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgICAgICAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCBxdWV1ZUluZm9bMV17CisgICAgICAgICAgICAgICAgVks6OkRldmljZVF1ZXVlQ3JlYXRlSW5mbygpLnF1ZXVlRmFtaWx5SW5kZXgocSkucXVldWVDb3VudCgxKS5wUXVldWVQcmlvcml0aWVzKHByaW9yaXRpZXMpfTsKKworICAgICAgICAgICAgYXV0byBjb25zdCBkZXZpY2VJbmZvID0gVks6OkRldmljZUNyZWF0ZUluZm8oKS5xdWV1ZUNyZWF0ZUluZm9Db3VudCgxKS5wUXVldWVDcmVhdGVJbmZvcyhxdWV1ZUluZm8pOworCisgICAgICAgICAgICBWa0RldmljZSBkZXZpY2U7CisgICAgICAgICAgICByZXN1bHQgPSB2a0NyZWF0ZURldmljZShwaHlzaWNhbFtwXSwgZGV2aWNlSW5mbywgTlVMTCwgJmRldmljZSk7CisgICAgICAgICAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKworICAgICAgICAgICAgdmtEZXN0cm95RGV2aWNlKGRldmljZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhbGxvY19jYWxsYmFja3MucFVzZXJEYXRhID0gKHZvaWQgKikweDAwMDAwMDQyOworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCAmYWxsb2NfY2FsbGJhY2tzKTsKKworICAgIC8vIE1ha2Ugc3VyZSBldmVyeXRoaW5nJ3MgYmVlbiBmcmVlZAorICAgIEFTU0VSVF9FUSh0cnVlLCBJc0FsbG9jVHJhY2tlckVtcHR5KCkpOworICAgIEZyZWVBbGxvY1RyYWNrZXIoKTsKK30KKworLy8gVGVzdCBtYWtpbmcgc3VyZSB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB0byBhbGxvY2F0ZSBhbmQgY2xlYW51cCBldmVyeXRoaW5nIGZyb20KKy8vIHZrQ3JlYXRlSW5zdGFuY2UsIHRvIHZrQ3JlYXRlRGV2aWNjZSwgYW5kIHRoZW4gdGhyb3VnaCB0aGVpciBkZXN0cnVjdG9ycy4gIFdpdGggc3BlY2lhbAorLy8gYWxsb2NhdG9ycyB1c2VkIG9uIG9ubHkgdGhlIGRldmljZSBhbmQgbm90IHRoZSBpbnN0YW5jZS4KK1RFU1QoQWxsb2NhdGlvbiwgRGV2aWNlQnV0Tm90SW5zdGFuY2UpIHsKKyAgICBhdXRvIGNvbnN0IGluZm8gPSBWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCk7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY19jYWxsYmFja3MgPSB7fTsKKyAgICBhbGxvY19jYWxsYmFja3MucGZuQWxsb2NhdGlvbiA9IEFsbG9jQ2FsbGJhY2tGdW5jOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5SZWFsbG9jYXRpb24gPSBSZWFsbG9jQ2FsbGJhY2tGdW5jOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5GcmVlID0gRnJlZUNhbGxiYWNrRnVuYzsKKworICAgIEluaXRBbGxvY1RyYWNrZXIoMjA0OCk7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKGluZm8sIE5VTEwsICZpbnN0YW5jZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICB1aW50MzJfdCBwaHlzaWNhbENvdW50ID0gMDsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbChuZXcgVmtQaHlzaWNhbERldmljZVtwaHlzaWNhbENvdW50XSk7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBwaHlzaWNhbC5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIGZvciAodWludDMyX3QgcCA9IDA7IHAgPCBwaHlzaWNhbENvdW50OyArK3ApIHsKKyAgICAgICAgdWludDMyX3QgZmFtaWx5Q291bnQgPSAwOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsW3BdLCAmZmFtaWx5Q291bnQsIG51bGxwdHIpOworICAgICAgICBBU1NFUlRfR1QoZmFtaWx5Q291bnQsIDB1KTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXNbXT4gZmFtaWx5KG5ldyBWa1F1ZXVlRmFtaWx5UHJvcGVydGllc1tmYW1pbHlDb3VudF0pOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsW3BdLCAmZmFtaWx5Q291bnQsIGZhbWlseS5nZXQoKSk7CisgICAgICAgIEFTU0VSVF9HVChmYW1pbHlDb3VudCwgMHUpOworCisgICAgICAgIGZvciAodWludDMyX3QgcSA9IDA7IHEgPCBmYW1pbHlDb3VudDsgKytxKSB7CisgICAgICAgICAgICBpZiAofmZhbWlseVtxXS5xdWV1ZUZsYWdzICYgVktfUVVFVUVfR1JBUEhJQ1NfQklUKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsb2F0IGNvbnN0IHByaW9yaXRpZXNbXSA9IHswLjBmfTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgICAgICAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCBxdWV1ZUluZm9bMV17CisgICAgICAgICAgICAgICAgVks6OkRldmljZVF1ZXVlQ3JlYXRlSW5mbygpLnF1ZXVlRmFtaWx5SW5kZXgocSkucXVldWVDb3VudCgxKS5wUXVldWVQcmlvcml0aWVzKHByaW9yaXRpZXMpfTsKKworICAgICAgICAgICAgYXV0byBjb25zdCBkZXZpY2VJbmZvID0gVks6OkRldmljZUNyZWF0ZUluZm8oKS5xdWV1ZUNyZWF0ZUluZm9Db3VudCgxKS5wUXVldWVDcmVhdGVJbmZvcyhxdWV1ZUluZm8pOworCisgICAgICAgICAgICBWa0RldmljZSBkZXZpY2U7CisgICAgICAgICAgICBhbGxvY19jYWxsYmFja3MucFVzZXJEYXRhID0gKHZvaWQgKikweDAwMDAwMDUxOworICAgICAgICAgICAgcmVzdWx0ID0gdmtDcmVhdGVEZXZpY2UocGh5c2ljYWxbcF0sIGRldmljZUluZm8sICZhbGxvY19jYWxsYmFja3MsICZkZXZpY2UpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICAgICAgICAgIGFsbG9jX2NhbGxiYWNrcy5wVXNlckRhdGEgPSAodm9pZCAqKTB4MDAwMDAwNTI7CisgICAgICAgICAgICB2a0Rlc3Ryb3lEZXZpY2UoZGV2aWNlLCAmYWxsb2NfY2FsbGJhY2tzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBOVUxMKTsKKworICAgIC8vIE1ha2Ugc3VyZSBldmVyeXRoaW5nJ3MgYmVlbiBmcmVlZAorICAgIEFTU0VSVF9FUSh0cnVlLCBJc0FsbG9jVHJhY2tlckVtcHR5KCkpOworICAgIEZyZWVBbGxvY1RyYWNrZXIoKTsKK30KKworLy8gVGVzdCBmYWlsdXJlIGR1cmluZyB2a0NyZWF0ZUluc3RhbmNlIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWFrIG1lbW9yeSBpZgorLy8gb25lIG9mIHRoZSBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbnMgdHJpZ2dlci4KK1RFU1QoQWxsb2NhdGlvbiwgQ3JlYXRlSW5zdGFuY2VJbnRlbnRpb25hbEFsbG9jRmFpbCkgeworICAgIGF1dG8gY29uc3QgaW5mbyA9IFZLOjpJbnN0YW5jZUNyZWF0ZUluZm8oKTsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIGFsbG9jX2NhbGxiYWNrcyA9IHt9OworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5BbGxvY2F0aW9uID0gQWxsb2NDYWxsYmFja0Z1bmM7CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmblJlYWxsb2NhdGlvbiA9IFJlYWxsb2NDYWxsYmFja0Z1bmM7CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmbkZyZWUgPSBGcmVlQ2FsbGJhY2tGdW5jOworCisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHVpbnQzMl90IGZhaWxfaW5kZXggPSAxOworICAgIGRvIHsKKyAgICAgICAgSW5pdEFsbG9jVHJhY2tlcig5OTk5LCBmYWlsX2luZGV4KTsKKworICAgICAgICByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKGluZm8sICZhbGxvY19jYWxsYmFja3MsICZpbnN0YW5jZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZKSB7CisgICAgICAgICAgICBpZiAoIUlzQWxsb2NUcmFja2VyRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIG9uIGluZGV4ICIgPDwgZmFpbF9pbmRleCA8PCAnXG4nOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUSh0cnVlLCBJc0FsbG9jVHJhY2tlckVtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWxfaW5kZXgrKzsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IG92ZXJydW4gdGhlIG1lbW9yeQorICAgICAgICBBU1NFUlRfTFQoZmFpbF9pbmRleCwgOTk5OXUpOworCisgICAgICAgIEZyZWVBbGxvY1RyYWNrZXIoKTsKKyAgICB9IHdoaWxlIChyZXN1bHQgPT0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZKTsKKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCAmYWxsb2NfY2FsbGJhY2tzKTsKK30KKworLy8gVGVzdCBmYWlsdXJlIGR1cmluZyB2a0NyZWF0ZURldmljZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgbGVhayBtZW1vcnkgaWYKKy8vIG9uZSBvZiB0aGUgb3V0LW9mLW1lbW9yeSBjb25kaXRpb25zIHRyaWdnZXIuCitURVNUKEFsbG9jYXRpb24sIENyZWF0ZURldmljZUludGVudGlvbmFsQWxsb2NGYWlsKSB7CisgICAgYXV0byBjb25zdCBpbmZvID0gVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpOworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0RldmljZSBkZXZpY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0FsbG9jYXRpb25DYWxsYmFja3MgYWxsb2NfY2FsbGJhY2tzID0ge307CisgICAgYWxsb2NfY2FsbGJhY2tzLnBmbkFsbG9jYXRpb24gPSBBbGxvY0NhbGxiYWNrRnVuYzsKKyAgICBhbGxvY19jYWxsYmFja3MucGZuUmVhbGxvY2F0aW9uID0gUmVhbGxvY0NhbGxiYWNrRnVuYzsKKyAgICBhbGxvY19jYWxsYmFja3MucGZuRnJlZSA9IEZyZWVDYWxsYmFja0Z1bmM7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKGluZm8sIE5VTEwsICZpbnN0YW5jZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICB1aW50MzJfdCBwaHlzaWNhbENvdW50ID0gMDsKKyAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIG51bGxwdHIpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworICAgIEFTU0VSVF9HVChwaHlzaWNhbENvdW50LCAwdSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbChuZXcgVmtQaHlzaWNhbERldmljZVtwaHlzaWNhbENvdW50XSk7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBwaHlzaWNhbC5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNpY2FsQ291bnQsIDB1KTsKKworICAgIGZvciAodWludDMyX3QgcCA9IDA7IHAgPCBwaHlzaWNhbENvdW50OyArK3ApIHsKKyAgICAgICAgdWludDMyX3QgZmFtaWx5Q291bnQgPSAwOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsW3BdLCAmZmFtaWx5Q291bnQsIG51bGxwdHIpOworICAgICAgICBBU1NFUlRfR1QoZmFtaWx5Q291bnQsIDB1KTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXNbXT4gZmFtaWx5KG5ldyBWa1F1ZXVlRmFtaWx5UHJvcGVydGllc1tmYW1pbHlDb3VudF0pOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsW3BdLCAmZmFtaWx5Q291bnQsIGZhbWlseS5nZXQoKSk7CisgICAgICAgIEFTU0VSVF9HVChmYW1pbHlDb3VudCwgMHUpOworCisgICAgICAgIGZvciAodWludDMyX3QgcSA9IDA7IHEgPCBmYW1pbHlDb3VudDsgKytxKSB7CisgICAgICAgICAgICBpZiAofmZhbWlseVtxXS5xdWV1ZUZsYWdzICYgVktfUVVFVUVfR1JBUEhJQ1NfQklUKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsb2F0IGNvbnN0IHByaW9yaXRpZXNbXSA9IHswLjBmfTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgICAgICAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCBxdWV1ZUluZm9bMV17CisgICAgICAgICAgICAgICAgVks6OkRldmljZVF1ZXVlQ3JlYXRlSW5mbygpLnF1ZXVlRmFtaWx5SW5kZXgocSkucXVldWVDb3VudCgxKS5wUXVldWVQcmlvcml0aWVzKHByaW9yaXRpZXMpfTsKKworICAgICAgICAgICAgYXV0byBjb25zdCBkZXZpY2VJbmZvID0gVks6OkRldmljZUNyZWF0ZUluZm8oKS5xdWV1ZUNyZWF0ZUluZm9Db3VudCgxKS5wUXVldWVDcmVhdGVJbmZvcyhxdWV1ZUluZm8pOworCisgICAgICAgICAgICB1aW50MzJfdCBmYWlsX2luZGV4ID0gMTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBJbml0QWxsb2NUcmFja2VyKDk5OTksIGZhaWxfaW5kZXgpOworCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmtDcmVhdGVEZXZpY2UocGh5c2ljYWxbcF0sIGRldmljZUluZm8sICZhbGxvY19jYWxsYmFja3MsICZkZXZpY2UpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghSXNBbGxvY1RyYWNrZXJFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCBvbiBpbmRleCAiIDw8IGZhaWxfaW5kZXggPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSh0cnVlLCBJc0FsbG9jVHJhY2tlckVtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZhaWxfaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcnJ1biB0aGUgbWVtb3J5CisgICAgICAgICAgICAgICAgQVNTRVJUX0xUKGZhaWxfaW5kZXgsIDk5OTl1KTsKKworICAgICAgICAgICAgICAgIEZyZWVBbGxvY1RyYWNrZXIoKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdCA9PSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkpOworICAgICAgICAgICAgdmtEZXN0cm95RGV2aWNlKGRldmljZSwgJmFsbG9jX2NhbGxiYWNrcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBOVUxMKTsKK30KKworLy8gVGVzdCBmYWlsdXJlIGR1cmluZyB2a0NyZWF0ZUluc3RhbmNlIGFuZCB2a0NyZWF0ZURldmljZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QKKy8vIGxlYWsgbWVtb3J5IGlmIG9uZSBvZiB0aGUgb3V0LW9mLW1lbW9yeSBjb25kaXRpb25zIHRyaWdnZXIuCitURVNUKEFsbG9jYXRpb24sIENyZWF0ZUluc3RhbmNlRGV2aWNlSW50ZW50aW9uYWxBbGxvY0ZhaWwpIHsKKyAgICBhdXRvIGNvbnN0IGluZm8gPSBWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCk7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIFZrRGV2aWNlIGRldmljZSA9IFZLX05VTExfSEFORExFOworICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY19jYWxsYmFja3MgPSB7fTsKKyAgICBhbGxvY19jYWxsYmFja3MucGZuQWxsb2NhdGlvbiA9IEFsbG9jQ2FsbGJhY2tGdW5jOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5SZWFsbG9jYXRpb24gPSBSZWFsbG9jQ2FsbGJhY2tGdW5jOworICAgIGFsbG9jX2NhbGxiYWNrcy5wZm5GcmVlID0gRnJlZUNhbGxiYWNrRnVuYzsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB1aW50MzJfdCBmYWlsX2luZGV4ID0gMDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbENvdW50ID0gMDsKKyAgICB3aGlsZSAocmVzdWx0ID09IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSkgeworICAgICAgICBJbml0QWxsb2NUcmFja2VyKDk5OTksICsrZmFpbF9pbmRleCk7CisgICAgICAgIEFTU0VSVF9MVChmYWlsX2luZGV4LCA5OTk5dSk7CisKKyAgICAgICAgcmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZShpbmZvLCAmYWxsb2NfY2FsbGJhY2tzLCAmaW5zdGFuY2UpOworICAgICAgICBpZiAocmVzdWx0ID09IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSkgeworICAgICAgICAgICAgaWYgKCFJc0FsbG9jVHJhY2tlckVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCBvbiBpbmRleCAiIDw8IGZhaWxfaW5kZXggPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEodHJ1ZSwgSXNBbGxvY1RyYWNrZXJFbXB0eSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZyZWVBbGxvY1RyYWNrZXIoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgICAgIHBoeXNpY2FsQ291bnQgPSAwOworICAgICAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJnBoeXNpY2FsQ291bnQsIG51bGxwdHIpOworICAgICAgICBpZiAocmVzdWx0ID09IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSkgeworICAgICAgICAgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsICZhbGxvY19jYWxsYmFja3MpOworICAgICAgICAgICAgaWYgKCFJc0FsbG9jVHJhY2tlckVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCBvbiBpbmRleCAiIDw8IGZhaWxfaW5kZXggPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEodHJ1ZSwgSXNBbGxvY1RyYWNrZXJFbXB0eSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZyZWVBbGxvY1RyYWNrZXIoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX1NVQ0NFU1MpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1BoeXNpY2FsRGV2aWNlW10+IHBoeXNpY2FsKG5ldyBWa1BoeXNpY2FsRGV2aWNlW3BoeXNpY2FsQ291bnRdKTsKKyAgICAgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzaWNhbENvdW50LCBwaHlzaWNhbC5nZXQoKSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZKSB7CisgICAgICAgICAgICB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgJmFsbG9jX2NhbGxiYWNrcyk7CisgICAgICAgICAgICBpZiAoIUlzQWxsb2NUcmFja2VyRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIG9uIGluZGV4ICIgPDwgZmFpbF9pbmRleCA8PCAnXG4nOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUSh0cnVlLCBJc0FsbG9jVHJhY2tlckVtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRnJlZUFsbG9jVHJhY2tlcigpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisKKyAgICAgICAgdWludDMyX3QgZmFtaWx5Q291bnQgPSAwOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsWzBdLCAmZmFtaWx5Q291bnQsIG51bGxwdHIpOworICAgICAgICBBU1NFUlRfR1QoZmFtaWx5Q291bnQsIDB1KTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXNbXT4gZmFtaWx5KG5ldyBWa1F1ZXVlRmFtaWx5UHJvcGVydGllc1tmYW1pbHlDb3VudF0pOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsWzBdLCAmZmFtaWx5Q291bnQsIGZhbWlseS5nZXQoKSk7CisgICAgICAgIEFTU0VSVF9HVChmYW1pbHlDb3VudCwgMHUpOworCisgICAgICAgIHVpbnQzMl90IHF1ZXVlX2luZGV4ID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBxID0gMDsgcSA8IGZhbWlseUNvdW50OyArK3EpIHsKKyAgICAgICAgICAgIGlmIChmYW1pbHlbcV0ucXVldWVGbGFncyAmIFZLX1FVRVVFX0dSQVBISUNTX0JJVCkgeworICAgICAgICAgICAgICAgIHF1ZXVlX2luZGV4ID0gcTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGNvbnN0IHByaW9yaXRpZXNbXSA9IHswLjBmfTsgIC8vIFRlbXBvcmFyeSByZXF1aXJlZCBkdWUgdG8gTVNWQyBidWcuCisgICAgICAgIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIGNvbnN0IHF1ZXVlSW5mb1sxXXsKKyAgICAgICAgICAgIFZLOjpEZXZpY2VRdWV1ZUNyZWF0ZUluZm8oKS5xdWV1ZUZhbWlseUluZGV4KHF1ZXVlX2luZGV4KS5xdWV1ZUNvdW50KDEpLnBRdWV1ZVByaW9yaXRpZXMocHJpb3JpdGllcyl9OworCisgICAgICAgIGF1dG8gY29uc3QgZGV2aWNlSW5mbyA9IFZLOjpEZXZpY2VDcmVhdGVJbmZvKCkucXVldWVDcmVhdGVJbmZvQ291bnQoMSkucFF1ZXVlQ3JlYXRlSW5mb3MocXVldWVJbmZvKTsKKworICAgICAgICByZXN1bHQgPSB2a0NyZWF0ZURldmljZShwaHlzaWNhbFswXSwgZGV2aWNlSW5mbywgJmFsbG9jX2NhbGxiYWNrcywgJmRldmljZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZKSB7CisgICAgICAgICAgICB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgJmFsbG9jX2NhbGxiYWNrcyk7CisgICAgICAgICAgICBpZiAoIUlzQWxsb2NUcmFja2VyRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIG9uIGluZGV4ICIgPDwgZmFpbF9pbmRleCA8PCAnXG4nOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUSh0cnVlLCBJc0FsbG9jVHJhY2tlckVtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRnJlZUFsbG9jVHJhY2tlcigpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdmtEZXN0cm95RGV2aWNlKGRldmljZSwgJmFsbG9jX2NhbGxiYWNrcyk7CisgICAgICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCAmYWxsb2NfY2FsbGJhY2tzKTsKKyAgICAgICAgRnJlZUFsbG9jVHJhY2tlcigpOworICAgIH0KK30KKworLy8gVXNlZCBieSBydW5fbG9hZGVyX3Rlc3RzLnNoIHRvIHRlc3QgdGhhdCBjYWxsaW5nIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIgd2l0aG91dCBmaXJzdCBxdWVyeWluZworLy8gdGhlIGNvdW50LCB3b3Jrcy4gIEFuZCwgdGhhdCBpdCBhbHNvIHJldHVybnMgb25seSBwaHlzaWNhbCBkZXZpY2VzIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBzdGFuZGFyZAorLy8gZW51bWVyYXRlIGNhbGwKK1RFU1QoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIsIE9uZUNhbGwpIHsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgY2hhciBjb25zdCAqY29uc3QgbmFtZXNbXSA9IHtWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FfTsKKyAgICBhdXRvIGNvbnN0IGluZm8gPSBWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCkuZW5hYmxlZEV4dGVuc2lvbkNvdW50KDEpLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKG5hbWVzKTsKKyAgICB1aW50MzJfdCBncm91cDsKKyAgICB1aW50MzJfdCBkZXY7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFZrUGh5c2ljYWxEZXZpY2UsIGJvb2w+PiBwaHlzX2Rldl9ub3JtYWxfZm91bmQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFZrUGh5c2ljYWxEZXZpY2UsIGJvb2w+PiBwaHlzX2Rldl9ncm91cF9mb3VuZDsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoaW5mbywgVktfTlVMTF9IQU5ETEUsICZpbnN0YW5jZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgLy8gRXh0ZW5zaW9uIGlzbid0IHByZXNlbnQsIGp1c3Qgc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UKTsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJTa2lwcGluZyBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiA6IE9uZUNhbGwgZHVlIHRvIEluc3RhbmNlIGxhY2tpbmcgc3VwcG9ydCIKKyAgICAgICAgICAgICAgICAgIDw8ICIgZm9yICIgPDwgVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSA8PCAiIGV4dGVuc2lvblxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IHBoeXNfZGV2X2NvdW50ID0gNTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1BoeXNpY2FsRGV2aWNlW10+IHBoeXNfZGV2cyhuZXcgVmtQaHlzaWNhbERldmljZVtwaHlzX2Rldl9jb3VudF0pOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCAmcGh5c19kZXZfY291bnQsIHBoeXNfZGV2cy5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKHBoeXNfZGV2X2NvdW50LCAwdSk7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBub3JtYWwgcGh5c2ljYWwgZGV2aWNlIGJvb2xlYW4gcGFpciBhcnJheQorICAgIGZvciAoZGV2ID0gMDsgZGV2IDwgcGh5c19kZXZfY291bnQ7IGRldisrKSB7CisgICAgICAgIHBoeXNfZGV2X25vcm1hbF9mb3VuZC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIocGh5c19kZXZzW2Rldl0sIGZhbHNlKSk7CisgICAgfQorCisgICAgLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgbmV3IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIgY2FsbAorICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIHBfdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiA9CisgICAgICAgIChQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUil2a0dldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIik7CisKKyAgICAvLyBTZXR1cCB0aGUgZ3JvdXAgaW5mb3JtYXRpb24gaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBjYWxsCisgICAgdWludDMyX3QgZ3JvdXBfY291bnQgPSAzMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUltdPiBwaHlzX2Rldl9ncm91cHMobmV3IFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFJbZ3JvdXBfY291bnRdKTsKKyAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBncm91cF9jb3VudDsgZ3JvdXArKykgeworICAgICAgICBwaHlzX2Rldl9ncm91cHNbZ3JvdXBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0dST1VQX1BST1BFUlRJRVNfS0hSOworICAgICAgICBwaHlzX2Rldl9ncm91cHNbZ3JvdXBdLnBOZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5waHlzaWNhbERldmljZUNvdW50ID0gMDsKKyAgICAgICAgbWVtc2V0KHBoeXNfZGV2X2dyb3Vwc1tncm91cF0ucGh5c2ljYWxEZXZpY2VzLCAwLCBzaXplb2YoVmtQaHlzaWNhbERldmljZSkgKiBWS19NQVhfREVWSUNFX0dST1VQX1NJWkVfS0hSKTsKKyAgICAgICAgcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5zdWJzZXRBbGxvY2F0aW9uID0gVktfRkFMU0U7CisgICAgfQorCisgICAgcmVzdWx0ID0gcF92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKGluc3RhbmNlLCAmZ3JvdXBfY291bnQsIHBoeXNfZGV2X2dyb3Vwcy5nZXQoKSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKGdyb3VwX2NvdW50LCAwdSk7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBncm91cCBwaHlzaWNhbCBkZXZpY2UgYm9vbGVhbiBwYWlyIGFycmF5CisgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgZ3JvdXBfY291bnQ7IGdyb3VwKyspIHsKKyAgICAgICAgZm9yIChkZXYgPSAwOyBkZXYgPCBwaHlzX2Rldl9ncm91cHNbZ3JvdXBdLnBoeXNpY2FsRGV2aWNlQ291bnQ7IGRldisrKSB7CisgICAgICAgICAgICBwaHlzX2Rldl9ncm91cF9mb3VuZC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIocGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5waHlzaWNhbERldmljZXNbZGV2XSwgZmFsc2UpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdywgbWFrZSBzdXJlIHdlIGNhbiBmaW5kIGVhY2ggbm9ybWFsIGFuZCBncm91cCBpdGVtIGluIHRoZSBvdGhlciBsaXN0CisgICAgZm9yIChkZXYgPSAwOyBkZXYgPCBwaHlzX2Rldl9jb3VudDsgZGV2KyspIHsKKyAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgcGh5c19kZXZfZ3JvdXBfZm91bmQuc2l6ZSgpOyBncm91cCsrKSB7CisgICAgICAgICAgICBpZiAocGh5c19kZXZfbm9ybWFsX2ZvdW5kW2Rldl0uZmlyc3QgPT0gcGh5c19kZXZfZ3JvdXBfZm91bmRbZ3JvdXBdLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgcGh5c19kZXZfbm9ybWFsX2ZvdW5kW2Rldl0uc2Vjb25kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwaHlzX2Rldl9ncm91cF9mb3VuZFtncm91cF0uc2Vjb25kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoZGV2ID0gMDsgZGV2IDwgcGh5c19kZXZfY291bnQ7IGRldisrKSB7CisgICAgICAgIEFTU0VSVF9FUShwaHlzX2Rldl9ub3JtYWxfZm91bmRbZGV2XS5zZWNvbmQsIHRydWUpOworICAgIH0KKyAgICBmb3IgKGRldiA9IDA7IGRldiA8IHBoeXNfZGV2X2dyb3VwX2ZvdW5kLnNpemUoKTsgZGV2KyspIHsKKyAgICAgICAgQVNTRVJUX0VRKHBoeXNfZGV2X2dyb3VwX2ZvdW5kW2Rldl0uc2Vjb25kLCB0cnVlKTsKKyAgICB9CisKKyAgICB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgbnVsbHB0cik7Cit9CisKKy8vIFVzZWQgYnkgcnVuX2xvYWRlcl90ZXN0cy5zaCB0byB0ZXN0IGZvciB0aGUgZXhwZWN0ZWQgdXNhZ2Ugb2YgdGhlCisvLyB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIGNhbGwgaW4gYSB0d28gY2FsbCBmYXNpb24gKG9uY2Ugd2l0aCBOVUxMIGRhdGEKKy8vIHRvIGdldCBjb3VudCwgYW5kIHRoZW4gYWdhaW4gd2l0aCBkYXRhKS4KK1RFU1QoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIsIFR3b0NhbGwpIHsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgY2hhciBjb25zdCAqY29uc3QgbmFtZXNbXSA9IHtWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FfTsKKyAgICBhdXRvIGNvbnN0IGluZm8gPSBWSzo6SW5zdGFuY2VDcmVhdGVJbmZvKCkuZW5hYmxlZEV4dGVuc2lvbkNvdW50KDEpLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKG5hbWVzKTsKKyAgICB1aW50MzJfdCBncm91cDsKKyAgICB1aW50MzJfdCBncm91cF9jb3VudDsKKyAgICB1aW50MzJfdCBkZXY7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFZrUGh5c2ljYWxEZXZpY2UsIGJvb2w+PiBwaHlzX2Rldl9ub3JtYWxfZm91bmQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFZrUGh5c2ljYWxEZXZpY2UsIGJvb2w+PiBwaHlzX2Rldl9ncm91cF9mb3VuZDsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQ3JlYXRlSW5zdGFuY2UoaW5mbywgVktfTlVMTF9IQU5ETEUsICZpbnN0YW5jZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgLy8gRXh0ZW5zaW9uIGlzbid0IHByZXNlbnQsIGp1c3Qgc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UKTsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJTa2lwcGluZyBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiA6IFR3b0NhbGwgZHVlIHRvIEluc3RhbmNlIGxhY2tpbmcgc3VwcG9ydCIKKyAgICAgICAgICAgICAgICAgIDw8ICIgZm9yICIgPDwgVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSA8PCAiIGV4dGVuc2lvblxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIG5ldyB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIGNhbGwKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiBwX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIgPQorICAgICAgICAoUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIpdmtHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiIpOworCisgICAgLy8gU2V0dXAgdGhlIGdyb3VwIGluZm9ybWF0aW9uIGluIHByZXBhcmF0aW9uIGZvciB0aGUgY2FsbAorICAgIHVpbnQzMl90IGFycmF5X2dyb3VwX2NvdW50ID0gMzA7CisgICAgc3RkOjp1bmlxdWVfcHRyPFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFJbXT4gcGh5c19kZXZfZ3JvdXBzKAorICAgICAgICBuZXcgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUlthcnJheV9ncm91cF9jb3VudF0pOworICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IGFycmF5X2dyb3VwX2NvdW50OyBncm91cCsrKSB7CisgICAgICAgIHBoeXNfZGV2X2dyb3Vwc1tncm91cF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfR1JPVVBfUFJPUEVSVElFU19LSFI7CisgICAgICAgIHBoeXNfZGV2X2dyb3Vwc1tncm91cF0ucE5leHQgPSBudWxscHRyOworICAgICAgICBwaHlzX2Rldl9ncm91cHNbZ3JvdXBdLnBoeXNpY2FsRGV2aWNlQ291bnQgPSAwOworICAgICAgICBtZW1zZXQocGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5waHlzaWNhbERldmljZXMsIDAsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlKSAqIFZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRV9LSFIpOworICAgICAgICBwaHlzX2Rldl9ncm91cHNbZ3JvdXBdLnN1YnNldEFsbG9jYXRpb24gPSBWS19GQUxTRTsKKyAgICB9CisKKyAgICByZXN1bHQgPSBwX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoaW5zdGFuY2UsICZncm91cF9jb3VudCwgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgVktfU1VDQ0VTUyk7CisgICAgQVNTRVJUX0dUKGdyb3VwX2NvdW50LCAwdSk7CisgICAgQVNTRVJUX0xUKGdyb3VwX2NvdW50LCBhcnJheV9ncm91cF9jb3VudCk7CisKKyAgICByZXN1bHQgPSBwX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoaW5zdGFuY2UsICZncm91cF9jb3VudCwgcGh5c19kZXZfZ3JvdXBzLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QoZ3JvdXBfY291bnQsIDB1KTsKKyAgICBBU1NFUlRfTFQoZ3JvdXBfY291bnQsIGFycmF5X2dyb3VwX2NvdW50KTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIGdyb3VwIHBoeXNpY2FsIGRldmljZSBib29sZWFuIHBhaXIgYXJyYXkKKyAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBncm91cF9jb3VudDsgZ3JvdXArKykgeworICAgICAgICBmb3IgKGRldiA9IDA7IGRldiA8IHBoeXNfZGV2X2dyb3Vwc1tncm91cF0ucGh5c2ljYWxEZXZpY2VDb3VudDsgZGV2KyspIHsKKyAgICAgICAgICAgIHBoeXNfZGV2X2dyb3VwX2ZvdW5kLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihwaHlzX2Rldl9ncm91cHNbZ3JvdXBdLnBoeXNpY2FsRGV2aWNlc1tkZXZdLCBmYWxzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDMyX3QgcGh5c19kZXZfY291bnQgPSA1MDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPFZrUGh5c2ljYWxEZXZpY2VbXT4gcGh5c19kZXZzKG5ldyBWa1BoeXNpY2FsRGV2aWNlW3BoeXNfZGV2X2NvdW50XSk7CisgICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZwaHlzX2Rldl9jb3VudCwgcGh5c19kZXZzLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QocGh5c19kZXZfY291bnQsIDB1KTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIG5vcm1hbCBwaHlzaWNhbCBkZXZpY2UgYm9vbGVhbiBwYWlyIGFycmF5CisgICAgZm9yIChkZXYgPSAwOyBkZXYgPCBwaHlzX2Rldl9jb3VudDsgZGV2KyspIHsKKyAgICAgICAgcGh5c19kZXZfbm9ybWFsX2ZvdW5kLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihwaHlzX2RldnNbZGV2XSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICAvLyBOb3csIG1ha2Ugc3VyZSB3ZSBjYW4gZmluZCBlYWNoIG5vcm1hbCBhbmQgZ3JvdXAgaXRlbSBpbiB0aGUgb3RoZXIgbGlzdAorICAgIGZvciAoZGV2ID0gMDsgZGV2IDwgcGh5c19kZXZfY291bnQ7IGRldisrKSB7CisgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHBoeXNfZGV2X2dyb3VwX2ZvdW5kLnNpemUoKTsgZ3JvdXArKykgeworICAgICAgICAgICAgaWYgKHBoeXNfZGV2X25vcm1hbF9mb3VuZFtkZXZdLmZpcnN0ID09IHBoeXNfZGV2X2dyb3VwX2ZvdW5kW2dyb3VwXS5maXJzdCkgeworICAgICAgICAgICAgICAgIHBoeXNfZGV2X25vcm1hbF9mb3VuZFtkZXZdLnNlY29uZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcGh5c19kZXZfZ3JvdXBfZm91bmRbZ3JvdXBdLnNlY29uZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGRldiA9IDA7IGRldiA8IHBoeXNfZGV2X2NvdW50OyBkZXYrKykgeworICAgICAgICBBU1NFUlRfRVEocGh5c19kZXZfbm9ybWFsX2ZvdW5kW2Rldl0uc2Vjb25kLCB0cnVlKTsKKyAgICB9CisgICAgZm9yIChkZXYgPSAwOyBkZXYgPCBwaHlzX2Rldl9ncm91cF9mb3VuZC5zaXplKCk7IGRldisrKSB7CisgICAgICAgIEFTU0VSVF9FUShwaHlzX2Rldl9ncm91cF9mb3VuZFtkZXZdLnNlY29uZCwgdHJ1ZSk7CisgICAgfQorCisgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOworfQorCisvLyBVc2VkIGJ5IHJ1bl9sb2FkZXJfdGVzdHMuc2ggdG8gdGVzdCBmb3IgdGhlIGV4cGVjdGVkIHVzYWdlIG9mIHRoZSBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUgorLy8gY2FsbCBpZiBub3QgZW5vdWdoIG51bWJlcnMgYXJlIHByb3ZpZGVkIGZvciB0aGUgZmluYWwgbGlzdC4KK1RFU1QoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIsIFR3b0NhbGxJbmNvbXBsZXRlKSB7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICAgIGNoYXIgY29uc3QgKmNvbnN0IG5hbWVzW10gPSB7VktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRX07CisgICAgYXV0byBjb25zdCBpbmZvID0gVks6Okluc3RhbmNlQ3JlYXRlSW5mbygpLmVuYWJsZWRFeHRlbnNpb25Db3VudCgxKS5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyhuYW1lcyk7CisgICAgdWludDMyX3QgZ3JvdXA7CisgICAgdWludDMyX3QgZ3JvdXBfY291bnQ7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKGluZm8sIFZLX05VTExfSEFORExFLCAmaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UKSB7CisgICAgICAgIC8vIEV4dGVuc2lvbiBpc24ndCBwcmVzZW50LCBqdXN0IHNraXAgdGhpcyB0ZXN0CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVCk7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiU2tpcHBpbmcgRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIgOiBUd29DYWxsSW5jb21wbGV0ZSBkdWUgdG8gSW5zdGFuY2UgbGFja2luZyBzdXBwb3J0IgorICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgIiA8PCBWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FIDw8ICIgZXh0ZW5zaW9uXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgbmV3IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIgY2FsbAorICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIHBfdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiA9CisgICAgICAgIChQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUil2a0dldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIik7CisKKyAgICAvLyBTZXR1cCB0aGUgZ3JvdXAgaW5mb3JtYXRpb24gaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBjYWxsCisgICAgdWludDMyX3QgYXJyYXlfZ3JvdXBfY291bnQgPSAzMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllc0tIUltdPiBwaHlzX2Rldl9ncm91cHMoCisgICAgICAgIG5ldyBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSW2FycmF5X2dyb3VwX2NvdW50XSk7CisgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgYXJyYXlfZ3JvdXBfY291bnQ7IGdyb3VwKyspIHsKKyAgICAgICAgcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTX0tIUjsKKyAgICAgICAgcGh5c19kZXZfZ3JvdXBzW2dyb3VwXS5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgIHBoeXNfZGV2X2dyb3Vwc1tncm91cF0ucGh5c2ljYWxEZXZpY2VDb3VudCA9IDA7CisgICAgICAgIG1lbXNldChwaHlzX2Rldl9ncm91cHNbZ3JvdXBdLnBoeXNpY2FsRGV2aWNlcywgMCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpICogVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFX0tIUik7CisgICAgICAgIHBoeXNfZGV2X2dyb3Vwc1tncm91cF0uc3Vic2V0QWxsb2NhdGlvbiA9IFZLX0ZBTFNFOworICAgIH0KKworICAgIHJlc3VsdCA9IHBfdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUihpbnN0YW5jZSwgJmdyb3VwX2NvdW50LCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19TVUNDRVNTKTsKKyAgICBBU1NFUlRfR1QoZ3JvdXBfY291bnQsIDB1KTsKKyAgICBBU1NFUlRfTFQoZ3JvdXBfY291bnQsIGFycmF5X2dyb3VwX2NvdW50KTsKKworICAgIGdyb3VwX2NvdW50IC09IDE7CisKKyAgICByZXN1bHQgPSBwX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoaW5zdGFuY2UsICZncm91cF9jb3VudCwgcGh5c19kZXZfZ3JvdXBzLmdldCgpKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBWS19JTkNPTVBMRVRFKTsKKworICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgaW50IHJlc3VsdDsKKworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgICAgaWYgKGFyZ2MgPiAwKSB7CisgICAgICAgIENvbW1hbmRMaW5lOjpJbml0aWFsaXplKGFyZ2MsIGFyZ3YpOworICAgIH0KKworICAgIHJlc3VsdCA9IFJVTl9BTExfVEVTVFMoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvcnVuX2FsbF90ZXN0cy5zaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9ydW5fYWxsX3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyYmI3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvcnVuX2FsbF90ZXN0cy5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vYmFzaAorIworIyBSdW4gYWxsIHRoZSByZWdyZXNzaW9uIHRlc3RzCitjZCAkKGRpcm5hbWUgIiQwIikKKworIyBIYWx0IG9uIGVycm9yCitzZXQgLWUKKworIyBWZXJpZnkgdGhhdCB0aGUgbG9hZGVyIGlzIHdvcmtpbmcKKy4vcnVuX2xvYWRlcl90ZXN0cy5zaAorLi9ydW5fZXh0cmFfbG9hZGVyX3Rlc3RzLnNoCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9ydW5fZXh0cmFfbG9hZGVyX3Rlc3RzLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL3J1bl9leHRyYV9sb2FkZXJfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODZkMWY1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9ydW5fZXh0cmFfbG9hZGVyX3Rlc3RzLnNoCkBAIC0wLDAgKzEsMTExIEBACisjIS9iaW4vYmFzaAorCitwdXNoZCAkKGRpcm5hbWUgIiQwIikgPiAvZGV2L251bGwKKworUnVuSW1wbGljaXRMYXllclRlc3QoKQoreworICAgICMgQ2hlY2sgZm9yIGxvY2FsIGltcGxpY2l0IGRpcmVjdG9yeS4KKyAgICA6ICIke0hPTUU6P30iCisgICAgbG9jYWwgaW1wbGljaXREaXJlY3Rvcnk9IiRIT01FLy5sb2NhbC9zaGFyZS92dWxrYW4vaW1wbGljaXRfbGF5ZXIuZCIKKyAgICBpZiBbICEgLWQgIiRpbXBsaWNpdERpcmVjdG9yeSIgXQorICAgIHRoZW4KKyAgICAgICAgbWtkaXIgLXAgIiRpbXBsaWNpdERpcmVjdG9yeSIKKyAgICBmaQorCisgICAgIyBDaGVjayBmb3IgdGhlIHNoYXJlZCBvYmplY3QuCisgICAgbG9jYWwgc2hhcmVkT2JqZWN0PSJsaWJWa0xheWVyX3Rlc3Quc28iCisgICAgbG9jYWwgbGF5ZXJEaXJlY3Rvcnk9Ii4vbGF5ZXJzIgorICAgIGlmIFsgISAtZiAiJGxheWVyRGlyZWN0b3J5LyRzaGFyZWRPYmplY3QiIF0KKyAgICB0aGVuCisgICAgICAgIGVjaG8gIlRoZSBmaWxlLCAkbGF5ZXJEaXJlY3RvcnkvJHNoYXJlZE9iamVjdCwgY2FuIG5vdCBiZSBmb3VuZC4iID4mMgorICAgICAgICByZXR1cm4gMQorICAgIGZpCisKKyAgICAjIENoZWNrIGZvciB0aGUganNvbiB3aGljaCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvcHRpb25hbCBlbmFibGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgbG9jYWwganNvbj0iVmtMYXllcl90ZXN0Lmpzb24iCisgICAgaWYgWyAhIC1mICIkbGF5ZXJEaXJlY3RvcnkvJGpzb24iIF0KKyAgICB0aGVuCisgICAgICAgIGVjaG8gIlRoZSBmaWxlLCAkbGF5ZXJEaXJlY3RvcnkvJGpzb24sIGNhbiBub3QgYmUgZm91bmQuIiA+JjIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorCisgICAgIyBDb3B5IHRoZSB0ZXN0IGxheWVyIGludG8gdGhlIGltcGxpY2l0IGRpcmVjdG9yeS4KKyAgICBpZiAhIGNwICIkbGF5ZXJEaXJlY3RvcnkvJHNoYXJlZE9iamVjdCIgIiRpbXBsaWNpdERpcmVjdG9yeS8iIHx8ICEgY3AgIiRsYXllckRpcmVjdG9yeS8kanNvbiIgIiRpbXBsaWNpdERpcmVjdG9yeS8iCisgICAgdGhlbgorICAgICAgICBlY2hvICJ1bmFibGUgdG8gaW5zdGFsbCB0ZXN0IGxheWVyIiA+JjIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorCisgICAgIyBUZXN0IHdpdGhvdXQgc2V0dGluZyBlbmFibGUgZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZSBsb2FkZXIgc2hvdWxkIG5vdCBsb2FkIHRoZSBsYXllci4KKyAgICBvdXRwdXQ9JChHVEVTVF9GSUxURVI9SW1wbGljaXRMYXllci5QcmVzZW50IFwKKyAgICAgICAgLi92a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyAyPiYxKQorICAgIGlmIGVjaG8gIiRvdXRwdXQiIHwgZ3JlcCAtcSAiVktfTEFZRVJfTFVOQVJHX3Rlc3Q6IENyZWF0ZUluc3RhbmNlIgorICAgIHRoZW4KKyAgICAgICBlY2hvICJ0ZXN0IGxheWVyIGRldGVjdGVkIGJ1dCBlbmFibGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIG5vdCBzZXQiID4mMgorICAgICAgIHJldHVybiAxCisgICAgZmkKKworICAgICMgVGVzdCBlbmFibGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBnb29kIHZhbHVlLiBUaGUgbG9hZGVyIHNob3VsZCBsb2FkIHRoZSBsYXllci4KKyAgICBvdXRwdXQ9JChFTkFCTEVfTEFZRVJfVEVTVF8xPWVuYWJsZSBcCisgICAgICAgIEdURVNUX0ZJTFRFUj1JbXBsaWNpdExheWVyLlByZXNlbnQgXAorICAgICAgICAuL3ZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIDI+JjEpCisgICAgaWYgISBlY2hvICIkb3V0cHV0IiB8IGdyZXAgLXEgIlZLX0xBWUVSX0xVTkFSR190ZXN0OiBDcmVhdGVJbnN0YW5jZSIKKyAgICB0aGVuCisgICAgICAgZWNobyAidGVzdCBsYXllciBub3QgZGV0ZWN0ZWQiID4mMgorICAgICAgIHJldHVybiAxCisgICAgZmkKKworICAgICMgVGVzdCBlbmFibGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBiYWQgdmFsdWUuIFRoZSBsb2FkZXIgc2hvdWxkIG5vdCBsb2FkIHRoZSBsYXllci4KKyAgICBvdXRwdXQ9JChFTkFCTEVfTEFZRVJfVEVTVF8xPXdyb25nIFwKKyAgICAgICAgR1RFU1RfRklMVEVSPUltcGxpY2l0TGF5ZXIuUHJlc2VudCBcCisgICAgICAgIC4vdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgMj4mMSkKKyAgICBpZiBlY2hvICIkb3V0cHV0IiB8IGdyZXAgLXEgIlZLX0xBWUVSX0xVTkFSR190ZXN0OiBDcmVhdGVJbnN0YW5jZSIKKyAgICB0aGVuCisgICAgICAgZWNobyAidGVzdCBsYXllciBkZXRlY3RlZCBidXQgZW5hYmxlIGVudmlyb25tZW50IHZhcmlhYmxlIHdhcyBzZXQgdG8gd3JvbmcgdmFsdWUiID4mMgorICAgICAgIHJldHVybiAxCisgICAgZmkKKworICAgICMgVGVzdCBkaXNhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlLiBUaGUgbG9hZGVyIHNob3VsZCBub3QgbG9hZCB0aGUgbGF5ZXIuCisgICAgb3V0cHV0PSQoRElTQUJMRV9MQVlFUl9URVNUXzE9dmFsdWUgXAorICAgICAgICBHVEVTVF9GSUxURVI9SW1wbGljaXRMYXllci5QcmVzZW50IFwKKyAgICAgICAgLi92a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyAyPiYxKQorICAgIGlmIGVjaG8gIiRvdXRwdXQiIHwgZ3JlcCAtcSAiVktfTEFZRVJfTFVOQVJHX3Rlc3Q6IENyZWF0ZUluc3RhbmNlIgorICAgIHRoZW4KKyAgICAgICBlY2hvICJ0ZXN0IGxheWVyIGRldGVjdGVkIGJ1dCBkaXNhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlIHdhcyBzZXQiID4mMgorICAgICAgIHJldHVybiAxCisgICAgZmkKKworICAgICMgUmVtb3ZlIHRoZSBlbmFibGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgaWYgISBzZWQgLWkgJy9lbmFibGVfZW52aXJvbm1lbnRcfEVOQUJMRV9MQVlFUl9URVNUXzFcfH0sL2QnICIkaW1wbGljaXREaXJlY3RvcnkvJGpzb24iCisgICAgdGhlbgorICAgICAgICBlY2hvICJ1bmFibGUgdG8gcmVtb3ZlIGVuYWJsZSBlbnZpcm9ubWVudCB2YXJpYWJsZSIgPiYyCisgICAgICAgIHJldHVybiAxCisgICAgZmkKKworICAgICMgVGVzdCB3aXRob3V0IHNldHRpbmcgZW5hYmxlIGVudmlyb25tZW50IHZhcmlhYmxlLiBUaGUgbG9hZGVyIHNob3VsZCBsb2FkIHRoZSBsYXllci4KKyAgICBvdXRwdXQ9JChHVEVTVF9GSUxURVI9SW1wbGljaXRMYXllci5QcmVzZW50IFwKKyAgICAgICAgLi92a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyAyPiYxKQorICAgIGlmICEgZWNobyAiJG91dHB1dCIgfCBncmVwIC1xICJWS19MQVlFUl9MVU5BUkdfdGVzdDogQ3JlYXRlSW5zdGFuY2UiCisgICAgdGhlbgorICAgICAgIGVjaG8gInRlc3QgbGF5ZXIgbm90IGRldGVjdGVkIiA+JjIKKyAgICAgICByZXR1cm4gMQorICAgIGZpCisKKyAgICAjIFJlbW92ZSB0aGUgdGVzdCBsYXllci4KKyAgICBpZiAhIHJtICIkaW1wbGljaXREaXJlY3RvcnkvJHNoYXJlZE9iamVjdCIgfHwgISBybSAiJGltcGxpY2l0RGlyZWN0b3J5LyRqc29uIgorICAgIHRoZW4KKyAgICAgICAgZWNobyAidW5hYmxlIHRvIHVuaW5zdGFsbCB0ZXN0IGxheWVyIiA+JjIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorCisgICAgZWNobyAiSW1wbGljaXRMYXllciB0ZXN0IFBBU1NFRCIKK30KKworIyBQcmV2ZW50IHRoZSBpbXBsaWNpdCBsYXllciB0ZXN0IGZyb20gcnVubmluZyBjb25jdXJyZW50bHkgd2l0aCBpdHNlbGYgaW4gYW5vdGhlciBwcm9jZXNzLgorIyBpLmUuIGZsb2NrIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBzdWJzaGVsbCB3aXRoIGFuIGF1dG9tYXRpYyBmaWxlIGRlc2NyaXB0b3IuCitmaWxlbmFtZT0kezAjIyovfQorKAorICAgIGZsb2NrICIkZmlsZWRlc2MiICYmICEgUnVuSW1wbGljaXRMYXllclRlc3QgJiYgZWNobyAiSW1wbGljaXRMYXllciB0ZXN0IEZBSUxFRCIgPiYyICYmIGV4aXQgMQorKXtmaWxlZGVzY30+Ii90bXAvJGZpbGVuYW1lLmxvY2tmaWxlIgorCitwb3BkID4gL2Rldi9udWxsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvcnVuX2xvYWRlcl90ZXN0cy5zaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9ydW5fbG9hZGVyX3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyOWQxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvcnVuX2xvYWRlcl90ZXN0cy5zaApAQCAtMCwwICsxLDE0NiBAQAorIyEvYmluL2Jhc2gKKworcHVzaGQgJChkaXJuYW1lICIkMCIpID4gL2Rldi9udWxsCisKK1J1bkVudmlyb25tZW50VmFyaWFibGVQYXRoc1Rlc3QoKQoreworICAgICMgQ2hlY2sgZm9yIHByb3BlciBoYW5kbGluZyBvZiBwYXRocyBzcGVjaWZpZWQgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworICAgICMgU2V0IHVwIGEgbGF5ZXIgcGF0aCB0aGF0IGluY2x1ZGVzIGRlZmF1bHQgYW5kIHVzZXItc3BlY2lmaWVkIGxvY2F0aW9ucywKKyAgICAjIHNvIHRoYXQgdGhlIHRlc3QgYXBwIGNhbiBmaW5kIHRoZW0uICBJbmNsdWRlIHNvbWUgYmFkbHkgc3BlY2lmaWVkIGVsZW1lbnRzIGFzIHdlbGwuCisgICAgdmtfbGF5ZXJfcGF0aD0iJFZLX0xBWUVSX1BBVEgiCisgICAgdmtfbGF5ZXJfcGF0aCs9IjovdXNyL2xvY2FsL2V0Yy92dWxrYW4vaW1wbGljaXRfbGF5ZXIuZDovdXNyL2xvY2FsL3NoYXJlL3Z1bGthbi9pbXBsaWNpdF9sYXllci5kIgorICAgIHZrX2xheWVyX3BhdGgrPSI6L3RtcC9jYXJvbDo6OiIKKyAgICB2a19sYXllcl9wYXRoKz0iOi9ldGMvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQ6L3Vzci9zaGFyZS92dWxrYW4vaW1wbGljaXRfbGF5ZXIuZDokSE9NRS8ubG9jYWwvc2hhcmUvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQiCisgICAgdmtfbGF5ZXJfcGF0aCs9Ijo6Ojo6L3RhbmR5OiIKKworICAgICMgU2V0IHZhcnMgdG8gaW5jbHVkZSBzb21lICJjaGFsbGVuZ2luZyIgcGF0aHMgYW5kIHJ1biB0aGUgdGVzdC4KKyAgICBvdXRwdXQ9JChWS19MT0FERVJfREVCVUc9YWxsIFwKKyAgICAgICBYREdfQ09ORklHX0RJUlM9IjovdG1wL2dvb2Jlcjo6Ojo6L3RtcC9nb29iZXIyLzovdG1wL2dvb2JlcjMvd2l0aCBzcGFjZXM6OjoiIFwKKyAgICAgICBYREdfREFUQV9ESVJTPSI6Ojo6L3RtcC9nb29iZXI0Ojo6OjovdG1wL2dvb2JlcjU6L3RtcC9nb29iZXI2L3dpdGggc3BhY2VzOjo6Oi90bXAvZ29vYmVyNzoiIFwKKyAgICAgICBWS19MQVlFUl9QQVRIPSR7dmtfbGF5ZXJfcGF0aH0gXAorICAgICAgIEdURVNUX0ZJTFRFUj1DcmVhdGVJbnN0YW5jZS5MYXllclByZXNlbnQgXAorICAgICAgIC4vdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgMj4mMSkKKworICAgICMgSGVyZSBpcyBhIHBhdGggd2UgZXhwZWN0IHRvIGZpbmQuICBUaGUgbG9hZGVyIGNvbnN0cnVjdHMgdGhlc2UgZnJvbSB0aGUgWERHKiBlbnYgdmFycy4KKyAgICByaWdodF9wYXRoPSIvdG1wL2dvb2Jlci92dWxrYW4vaWNkLmQ6L3RtcC9nb29iZXIyL3Z1bGthbi9pY2QuZDovdG1wL2dvb2JlcjMvd2l0aCBzcGFjZXMvdnVsa2FuL2ljZC5kIgorICAgICMgVGhlcmUgYXJlIG90aGVyIHBhdGhzIHRoYXQgY29tZSBmcm9tIFNZU0NPTkZJRyBzZXR0aW5ncyBlc3RhYmxpc2hlZCBhdCBidWlsZCB0aW1lLgorICAgICMgU28gd2UgY2FuJ3QgcmVhbGx5IGd1ZXNzIGF0IHdoYXQgdGhvc2UgYXJlIGhlcmUuCisgICAgcmlnaHRfcGF0aCs9Ii4qIgorICAgICMgQWxzbyBleHBlY3QgdG8gZmluZCB0aGVzZSwgc2luY2Ugd2UgYWRkZWQgdGhlbS4KKyAgICByaWdodF9wYXRoKz0iL3RtcC9nb29iZXI0L3Z1bGthbi9pY2QuZDovdG1wL2dvb2JlcjUvdnVsa2FuL2ljZC5kOi90bXAvZ29vYmVyNi93aXRoIHNwYWNlcy92dWxrYW4vaWNkLmQ6L3RtcC9nb29iZXI3L3Z1bGthbi9pY2QuZCIKKyAgICBlY2hvICIkb3V0cHV0IiB8IGdyZXAgLXEgIiRyaWdodF9wYXRoIgorICAgIGVjPSQ/CisgICAgaWYgWyAkZWMgLWVxIDEgXQorICAgIHRoZW4KKyAgICAgICBlY2hvICJFbnZpcm9ubWVudCBWYXJpYWJsZSBQYXRoIHRlc3QgRkFJTEVEIC0gSUNEIHBhdGggaW5jb3JyZWN0IiA+JjIKKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgICMgQ2hhbmdlIHRoZSBzdHJpbmcgdG8gaW1wbGljaXQgbGF5ZXJzLgorICAgIHJpZ2h0X3BhdGg9JHtyaWdodF9wYXRoLy9pY2QuZC9pbXBsaWNpdF9sYXllci5kfQorICAgIGVjaG8gIiRvdXRwdXQiIHwgZ3JlcCAtcSAiJHJpZ2h0X3BhdGgiCisgICAgZWM9JD8KKyAgICBpZiBbICRlYyAtZXEgMSBdCisgICAgdGhlbgorICAgICAgIGVjaG8gIkVudmlyb25tZW50IFZhcmlhYmxlIFBhdGggdGVzdCBGQUlMRUQgLSBJbXBsaWNpdCBsYXllciBwYXRoIGluY29ycmVjdCIgPiYyCisgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICAjIFNhZGx5LCB0aGUgbG9hZGVyIGRvZXMgbm90IGNsZWFuIHVwIHRoaXMgcGF0aCBhbmQganVzdCBzdHVtYmxlcyB0aHJvdWdoIGl0LgorICAgICMgU28ganVzdCBtYWtlIHN1cmUgaXQgaXMgdGhlIHNhbWUuCisgICAgcmlnaHRfcGF0aD0iJHt2a19sYXllcl9wYXRofSIKKyAgICBlY2hvICIkb3V0cHV0IiB8IGdyZXAgLXEgIiRyaWdodF9wYXRoIgorICAgIGVjPSQ/CisgICAgaWYgWyAkZWMgLWVxIDEgXQorICAgIHRoZW4KKyAgICAgICBlY2hvICJFbnZpcm9ubWVudCBWYXJpYWJsZSBQYXRoIHRlc3QgRkFJTEVEIC0gVktfTEFZRVJfUEFUSCBpbmNvcnJlY3QiID4mMgorICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgZWNobyAiRW52aXJvbm1lbnQgVmFyaWFibGUgUGF0aCB0ZXN0IFBBU1NFRCIKK30KKworUnVuQ3JlYXRlSW5zdGFuY2VUZXN0KCkKK3sKKyAgICAjIENoZWNrIGZvciBsYXllciBpbnNlcnRpb24gdmlhIENyZWF0ZUluc3RhbmNlLgorICAgIG91dHB1dD0kKFZLX0xPQURFUl9ERUJVRz1hbGwgXAorICAgICAgIEdURVNUX0ZJTFRFUj1DcmVhdGVJbnN0YW5jZS5MYXllclByZXNlbnQgXAorICAgICAgIC4vdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgMj4mMSkKKworICAgIGVjaG8gIiRvdXRwdXQiIHwgZ3JlcCAtcSAiSW5zZXJ0IGluc3RhbmNlIGxheWVyIFZLX0xBWUVSX0xVTkFSR190ZXN0IgorICAgIGVjPSQ/CisKKyAgICBpZiBbICRlYyAtZXEgMSBdCisgICAgdGhlbgorICAgICAgIGVjaG8gIkNyZWF0ZUluc3RhbmNlIGluc2VydGlvbiB0ZXN0IEZBSUxFRCAtIHRlc3QgbGF5ZXIgbm90IGRldGVjdGVkIGluIGluc3RhbmNlIGxheWVycyIgPiYyCisgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICBlY2hvICJDcmVhdGVJbnN0YW5jZSBJbnNlcnRpb24gdGVzdCBQQVNTRUQiCit9CisKK1J1bkVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzVGVzdCgpCit7CisgICAgY291bnQ9JChHVEVTVF9GSUxURVI9RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMuQ291bnQgXAorICAgICAgICAuL3ZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIGNvdW50IDI+JjEgfAorICAgICAgICBncmVwIC1vICdjb3VudD1bMC05XVwrJyB8IHNlZCAncy9eLio9Ly8nKQorCisgICAgaWYgWyAiJGNvdW50IiAtZ3QgMSBdCisgICAgdGhlbgorICAgICAgICBkaWZmIFwKKyAgICAgICAgICAgIDwoR1RFU1RfUFJJTlRfVElNRT0wIFwKKyAgICAgICAgICAgICAgICBHVEVTVF9GSUxURVI9RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMuT25lUGFzcyBcCisgICAgICAgICAgICAgICAgLi92a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyBjb3VudCAiJGNvdW50IiBwcm9wZXJ0aWVzIDI+JjEgfAorICAgICAgICAgICAgICAgIGdyZXAgJ3Byb3BlcnRpZXMnKSBcCisgICAgICAgICAgICA8KEdURVNUX1BSSU5UX1RJTUU9MCBcCisgICAgICAgICAgICAgICAgR1RFU1RfRklMVEVSPUVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzLlR3b1Bhc3MgXAorICAgICAgICAgICAgICAgIC4vdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgcHJvcGVydGllcyAyPiYxIHwKKyAgICAgICAgICAgICAgICBncmVwICdwcm9wZXJ0aWVzJykKKyAgICBmaQorICAgIGVjPSQ/CisKKyAgICBpZiBbICRlYyAtZXEgMSBdCisgICAgdGhlbgorICAgICAgICBlY2hvICJFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyBPbmVQYXNzIHZzIFR3b1Bhc3MgdGVzdCBGQUlMRUQgLSBwcm9wZXJ0aWVzIGRvIG5vdCBtYXRjaCIgPiYyCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgZWNobyAiRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMgT25lUGFzcyB2cyBUd29QYXNzIHRlc3QgUEFTU0VEIgorfQorCitSdW5FbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNUZXN0KCkKK3sKKyAgICBjb3VudD0kKEdURVNUX0ZJTFRFUj1FbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMuQ291bnQgXAorICAgICAgICAuL3ZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIGNvdW50IDI+JjEgfAorICAgICAgICBncmVwIC1vICdjb3VudD1bMC05XVwrJyB8IHNlZCAncy9eLio9Ly8nKQorCisgICAgaWYgWyAiJGNvdW50IiAtZ3QgMSBdCisgICAgdGhlbgorICAgICAgICBkaWZmIFwKKyAgICAgICAgICAgIDwoR1RFU1RfUFJJTlRfVElNRT0wIFwKKyAgICAgICAgICAgICAgICBHVEVTVF9GSUxURVI9RW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLk9uZVBhc3MgXAorICAgICAgICAgICAgICAgIC4vdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgY291bnQgIiRjb3VudCIgcHJvcGVydGllcyAyPiYxIHwKKyAgICAgICAgICAgICAgICBncmVwICdwcm9wZXJ0aWVzJykgXAorICAgICAgICAgICAgPChHVEVTVF9QUklOVF9USU1FPTAgXAorICAgICAgICAgICAgICAgIEdURVNUX0ZJTFRFUj1FbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMuVHdvUGFzcyBcCisgICAgICAgICAgICAgICAgLi92a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyBwcm9wZXJ0aWVzIDI+JjEgfAorICAgICAgICAgICAgICAgIGdyZXAgJ3Byb3BlcnRpZXMnKQorICAgIGZpCisgICAgZWM9JD8KKworICAgIGlmIFsgJGVjIC1lcSAxIF0KKyAgICB0aGVuCisgICAgICAgIGVjaG8gIkVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBPbmVQYXNzIHZzIFR3b1Bhc3MgdGVzdCBGQUlMRUQgLSBwcm9wZXJ0aWVzIGRvIG5vdCBtYXRjaCIgPiYyCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgZWNobyAiRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIE9uZVBhc3MgdnMgVHdvUGFzcyB0ZXN0IFBBU1NFRCIKK30KKworVktfTEFZRVJfUEFUSD0iJFBXRC9sYXllcnMiCisuL3ZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzCisKK1J1bkVudmlyb25tZW50VmFyaWFibGVQYXRoc1Rlc3QKK1J1bkNyZWF0ZUluc3RhbmNlVGVzdAorUnVuRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXNUZXN0CitSdW5FbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXNUZXN0CisKKyMgVGVzdCB0aGUgd3JhcCBvYmplY3RzIGxheWVyLgorLi9ydW5fd3JhcF9vYmplY3RzX3Rlc3RzLnNoIHx8IGV4aXQgMQorCitwb3BkID4gL2Rldi9udWxsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvcnVuX3dyYXBfb2JqZWN0c190ZXN0cy5zaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy9ydW5fd3JhcF9vYmplY3RzX3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzNzg3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvcnVuX3dyYXBfb2JqZWN0c190ZXN0cy5zaApAQCAtMCwwICsxLDEyMSBAQAorIyEvYmluL2Jhc2gKKworIyBOb3RlIHRoYXQgdGhlIFZhbGlkYXRpb24gTGF5ZXJzIG11c3QgYmUgaW5zdGFsbGVkIGluIHRoZSBkZWZhdWx0IHN5c3RlbQorIyBwYXRocyBhbmQvb3IgVktfTEFZRVJfUEFUSCBtdXN0IHBvaW50IHRvIFZhbGlkYXRpb24gTGF5ZXJzIHRvIHJ1biB0aGlzIHRlc3QuCisKK3B1c2hkICQoZGlybmFtZSAiJDAiKSA+IC9kZXYvbnVsbAorCit2a19sYXllcl9wYXRoPSRWS19MQVlFUl9QQVRIOmBwd2RgL2xheWVycworbGRfbGlicmFyeV9wYXRoPSRMRF9MSUJSQVJZX1BBVEg6YHB3ZGAvbGF5ZXJzCisKKyMgQ2hlY2sgZm9yIGluc2VydGlvbiBvZiB3cmFwLW9iamVjdHMgbGF5ZXIuCitvdXRwdXQ9JChWS19MQVlFUl9QQVRIPSR2a19sYXllcl9wYXRoIFwKKyAgIExEX0xJQlJBUllfUEFUSD0kbGRfbGlicmFyeV9wYXRoIFwKKyAgIFZLX0lOU1RBTkNFX0xBWUVSUz1WS19MQVlFUl9MVU5BUkdfd3JhcF9vYmplY3RzIFwKKyAgIFZLX0xPQURFUl9ERUJVRz1hbGwgXAorICAgR1RFU1RfRklMVEVSPVdyYXBPYmplY3RzLkluc2VydCBcCisgICAuL3ZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIDI+JjEpCisKK2VjaG8gIiRvdXRwdXQiIHwgZ3JlcCAtcSAiSW5zZXJ0IGluc3RhbmNlIGxheWVyIFZLX0xBWUVSX0xVTkFSR193cmFwX29iamVjdHMiCitlYz0kPworCitpZiBbICRlYyAtZXEgMSBdCit0aGVuCisgICBlY2hvICJJbnNlcnRpb24gdGVzdCBGQUlMRUQgLSB3cmFwLW9iamVjdHMgbm90IGRldGVjdGVkIGluIGluc3RhbmNlIGxheWVycyIgPiYyCisgICBleGl0IDEKK2ZpCisKK2VjaG8gIiRvdXRwdXQiIHwgZ3JlcCAtcSAiSW5zZXJ0ZWQgZGV2aWNlIGxheWVyIFZLX0xBWUVSX0xVTkFSR193cmFwX29iamVjdHMiCitlYz0kPworCitpZiBbICRlYyAtZXEgMSBdCit0aGVuCisgICBlY2hvICJJbnNlcnRpb24gdGVzdCBGQUlMRUQgLSB3cmFwLW9iamVjdHMgbm90IGRldGVjdGVkIGluIGRldmljZSBsYXllcnMiID4mMgorICAgZXhpdCAxCitmaQorZWNobyAiSW5zZXJ0aW9uIHRlc3QgUEFTU0VEIgorCisjIENoZWNrIGZvciBpbnNlcnRpb24gb2Ygd3JhcC1vYmplY3RzIGxheWVyIGluIGZyb250Lgorb3V0cHV0PSQoVktfTEFZRVJfUEFUSD0kdmtfbGF5ZXJfcGF0aCBcCisgICBMRF9MSUJSQVJZX1BBVEg9JGxkX2xpYnJhcnlfcGF0aCBcCisgICBWS19JTlNUQU5DRV9MQVlFUlM9VktfTEFZRVJfTFVOQVJHX3BhcmFtZXRlcl92YWxpZGF0aW9uOlZLX0xBWUVSX0xVTkFSR193cmFwX29iamVjdHMgXAorICAgVktfTE9BREVSX0RFQlVHPWFsbCBcCisgICBHVEVTVF9GSUxURVI9V3JhcE9iamVjdHMuSW5zZXJ0IFwKKyAgIC4vdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgMj4mMSkKKworZWNobyAiJG91dHB1dCIgfCBncmVwIC1xICJJbnNlcnQgaW5zdGFuY2UgbGF5ZXIgVktfTEFZRVJfTFVOQVJHX3dyYXBfb2JqZWN0cyIKK2VjPSQ/CisKK2lmIFsgJGVjIC1lcSAxIF0KK3RoZW4KKyAgIGVjaG8gIkZyb250IGluc2VydGlvbiB0ZXN0IEZBSUxFRCAtIHdyYXAtb2JqZWN0cyBub3QgZGV0ZWN0ZWQgaW4gaW5zdGFuY2UgbGF5ZXJzIiA+JjIKKyAgIGV4aXQgMQorZmkKKworZWNobyAiJG91dHB1dCIgfCBncmVwIC1xICJJbnNlcnRlZCBkZXZpY2UgbGF5ZXIgVktfTEFZRVJfTFVOQVJHX3dyYXBfb2JqZWN0cyIKK2VjPSQ/CisKK2lmIFsgJGVjIC1lcSAxIF0KK3RoZW4KKyAgIGVjaG8gIkZyb250IGluc2VydGlvbiB0ZXN0IEZBSUxFRCAtIHdyYXAtb2JqZWN0cyBub3QgZGV0ZWN0ZWQgaW4gZGV2aWNlIGxheWVycyIgPiYyCisgICBleGl0IDEKK2ZpCitlY2hvICJGcm9udCBpbnNlcnRpb24gdGVzdCBQQVNTRUQiCisKKyMgQ2hlY2sgZm9yIGluc2VydGlvbiBvZiB3cmFwLW9iamVjdHMgbGF5ZXIgaW4gYmFjay4KK291dHB1dD0kKFZLX0xBWUVSX1BBVEg9JHZrX2xheWVyX3BhdGggXAorICAgTERfTElCUkFSWV9QQVRIPSRsZF9saWJyYXJ5X3BhdGggXAorICAgVktfSU5TVEFOQ0VfTEFZRVJTPVZLX0xBWUVSX0xVTkFSR193cmFwX29iamVjdHM6VktfTEFZRVJfTFVOQVJHX3BhcmFtZXRlcl92YWxpZGF0aW9uIFwKKyAgIFZLX0xPQURFUl9ERUJVRz1hbGwgXAorICAgR1RFU1RfRklMVEVSPVdyYXBPYmplY3RzLkluc2VydCBcCisgICAuL3ZrX2xvYWRlcl92YWxpZGF0aW9uX3Rlc3RzIDI+JjEpCisKK2VjaG8gIiRvdXRwdXQiIHwgZ3JlcCAtcSAiSW5zZXJ0IGluc3RhbmNlIGxheWVyIFZLX0xBWUVSX0xVTkFSR193cmFwX29iamVjdHMiCitlYz0kPworCitpZiBbICRlYyAtZXEgMSBdCit0aGVuCisgICBlY2hvICJCYWNrIGluc2VydGlvbiB0ZXN0IEZBSUxFRCAtIHdyYXAtb2JqZWN0cyBub3QgZGV0ZWN0ZWQgaW4gaW5zdGFuY2UgbGF5ZXJzIiA+JjIKKyAgIGV4aXQgMQorZmkKKworZWNobyAiJG91dHB1dCIgfCBncmVwIC1xICJJbnNlcnRlZCBkZXZpY2UgbGF5ZXIgVktfTEFZRVJfTFVOQVJHX3dyYXBfb2JqZWN0cyIKK2VjPSQ/CisKK2lmIFsgJGVjIC1lcSAxIF0KK3RoZW4KKyAgIGVjaG8gIkJhY2sgaW5zZXJ0aW9uIHRlc3QgRkFJTEVEIC0gd3JhcC1vYmplY3RzIG5vdCBkZXRlY3RlZCBpbiBkZXZpY2UgbGF5ZXJzIiA+JjIKKyAgIGV4aXQgMQorZmkKK2VjaG8gIkJhY2sgaW5zZXJ0aW9uIHRlc3QgUEFTU0VEIgorCisjIENoZWNrIGZvciBpbnNlcnRpb24gb2Ygd3JhcC1vYmplY3RzIGxheWVyIGluIG1pZGRsZS4KK291dHB1dD0kKFZLX0xBWUVSX1BBVEg9JHZrX2xheWVyX3BhdGggXAorICAgTERfTElCUkFSWV9QQVRIPSRsZF9saWJyYXJ5X3BhdGggXAorICAgVktfSU5TVEFOQ0VfTEFZRVJTPVZLX0xBWUVSX0xVTkFSR19jb3JlX3ZhbGlkYXRpb246VktfTEFZRVJfTFVOQVJHX3dyYXBfb2JqZWN0czpWS19MQVlFUl9MVU5BUkdfcGFyYW1ldGVyX3ZhbGlkYXRpb24gXAorICAgVktfTE9BREVSX0RFQlVHPWFsbCBcCisgICBHVEVTVF9GSUxURVI9V3JhcE9iamVjdHMuSW5zZXJ0IFwKKyAgIC4vdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgMj4mMSkKKworZWNobyAiJG91dHB1dCIgfCBncmVwIC1xICJJbnNlcnQgaW5zdGFuY2UgbGF5ZXIgVktfTEFZRVJfTFVOQVJHX3dyYXBfb2JqZWN0cyIKK2VjPSQ/CisKK2lmIFsgJGVjIC1lcSAxIF0KK3RoZW4KKyAgIGVjaG8gIk1pZGRsZSBpbnNlcnRpb24gdGVzdCBGQUlMRUQgLSB3cmFwLW9iamVjdHMgbm90IGRldGVjdGVkIGluIGluc3RhbmNlIGxheWVycyIgPiYyCisgICBleGl0IDEKK2ZpCisKK2VjaG8gIiRvdXRwdXQiIHwgZ3JlcCAtcSAiSW5zZXJ0ZWQgZGV2aWNlIGxheWVyIFZLX0xBWUVSX0xVTkFSR193cmFwX29iamVjdHMiCitlYz0kPworCitpZiBbICRlYyAtZXEgMSBdCit0aGVuCisgICBlY2hvICJNaWRkbGUgaW5zZXJ0aW9uIHRlc3QgRkFJTEVEIC0gd3JhcC1vYmplY3RzIG5vdCBkZXRlY3RlZCBpbiBkZXZpY2UgbGF5ZXJzIiA+JjIKKyAgIGV4aXQgMQorZmkKK2VjaG8gIk1pZGRsZSBpbnNlcnRpb24gdGVzdCBQQVNTRUQiCisKK3BvcGQgPiAvZGV2L251bGwKKworZXhpdCAwCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvdGVzdF9jb21tb24uaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjM2Y2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBNaWtlIFN0cm95YW4gPG1pa2VATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqLworCisjaWZuZGVmIFRFU1RfQ09NTU9OX0gKKyNkZWZpbmUgVEVTVF9DT01NT05fSAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgTk9NSU5NQVgKKy8vIFdpblNvY2syLmggbXVzdCBiZSBpbmNsdWRlZCAqQkVGT1JFKiB3aW5kb3dzLmgKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx2dWxrYW4vdmtfc2RrX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKy8qCisgICAgd2FybmluZ3MgNDI1MSBhbmQgNDI3NSBoYXZlIHRvIGRvIHdpdGggcG90ZW50aWFsIGRsbC1pbnRlcmZhY2UgbWlzbWF0Y2gKKyAgICBiZXR3ZWVuIGxpYnJhcnkgKGd0ZXN0KSBhbmQgdXNlcnMuIFNpbmNlIHdlIGJ1aWxkIHRoZSBndGVzdCBsaWJyYXJ5CisgICAgYXMgcGFydCBvZiB0aGUgdGVzdCBidWlsZCB3ZSBrbm93IHRoYXQgdGhlIGRsbC1pbnRlcmZhY2Ugd2lsbCBtYXRjaCBhbmQKKyAgICBjYW4gZGlzYWJsZSB0aGVzZSB3YXJuaW5ncy4KKyAqLworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MjUxKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0Mjc1KQorI2VuZGlmCisKKy8vIEdUZXN0IGFuZCBYbGliIGNvbGxpZGUgZHVlIHRvIHJlZGVmaW5pdGlvbnMgb2YgIk5vbmUiIGFuZCAiQm9vbCIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNwcmFnbWEgcHVzaF9tYWNybygiTm9uZSIpCisjcHJhZ21hIHB1c2hfbWFjcm8oIkJvb2wiKQorI3VuZGVmIE5vbmUKKyN1bmRlZiBCb29sCisjZW5kaWYKKworLy8gVXNlIHRoZSBOREsncyBoZWFkZXIgb24gQW5kcm9pZAorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFJlZGVmaW5lIFhsaWIgZGVmaW5pdGlvbnMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNwcmFnbWEgcG9wX21hY3JvKCJCb29sIikKKyNwcmFnbWEgcG9wX21hY3JvKCJOb25lIikKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKyNkZWZpbmUgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKSBBU1NFUlRfRVEoVktfU1VDQ0VTUywgZXJyKSA8PCB2a19yZXN1bHRfc3RyaW5nKGVycikKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp2a19yZXN1bHRfc3RyaW5nKFZrUmVzdWx0IGVycikgeworICAgIHN3aXRjaCAoZXJyKSB7CisjZGVmaW5lIFNUUihyKSBcCisgICAgY2FzZSByOiAgICBcCisgICAgICAgIHJldHVybiAjcgorICAgICAgICBTVFIoVktfU1VDQ0VTUyk7CisgICAgICAgIFNUUihWS19OT1RfUkVBRFkpOworICAgICAgICBTVFIoVktfVElNRU9VVCk7CisgICAgICAgIFNUUihWS19FVkVOVF9TRVQpOworICAgICAgICBTVFIoVktfRVZFTlRfUkVTRVQpOworICAgICAgICBTVFIoVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEKTsKKyAgICAgICAgU1RSKFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSk7CisgICAgICAgIFNUUihWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSk7CisgICAgICAgIFNUUihWS19FUlJPUl9ERVZJQ0VfTE9TVCk7CisgICAgICAgIFNUUihWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQpOworICAgICAgICBTVFIoVktfRVJST1JfTEFZRVJfTk9UX1BSRVNFTlQpOworICAgICAgICBTVFIoVktfRVJST1JfTUVNT1JZX01BUF9GQUlMRUQpOworICAgICAgICBTVFIoVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUik7CisjdW5kZWYgU1RSCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVOS05PV05fUkVTVUxUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZXN0X2Vycm9yX2NhbGxiYWNrKGNvbnN0IGNoYXIgKmV4cHIsIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbikgeworICAgIEFERF9GQUlMVVJFX0FUKGZpbGUsIGxpbmUpIDw8ICJBc3NlcnRpb246IGAiIDw8IGV4cHIgPDwgIiciOworfQorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorICAgIC8qIExpbnV4LXNwZWNpZmljIGNvbW1vbiBjb2RlOiAqLworCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisvLyBUaHJlYWRzOgordHlwZWRlZiBwdGhyZWFkX3QgdGVzdF9wbGF0Zm9ybV90aHJlYWQ7CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZSh0ZXN0X3BsYXRmb3JtX3RocmVhZCAqdGhyZWFkLCB2b2lkICooKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEpIHsKKyAgICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkX2F0dHIpOworICAgIHJldHVybiBwdGhyZWFkX2NyZWF0ZSh0aHJlYWQsICZ0aHJlYWRfYXR0ciwgZnVuYywgZGF0YSk7Cit9CitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9qb2luKHRlc3RfcGxhdGZvcm1fdGhyZWFkIHRocmVhZCwgdm9pZCAqKnJldHZhbCkgeyByZXR1cm4gcHRocmVhZF9qb2luKHRocmVhZCwgcmV0dmFsKTsgfQorCisvLyBUaHJlYWQgSURzOgordHlwZWRlZiBwdGhyZWFkX3QgdGVzdF9wbGF0Zm9ybV90aHJlYWRfaWQ7CitzdGF0aWMgaW5saW5lIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2lkIHRlc3RfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpIHsgcmV0dXJuIHB0aHJlYWRfc2VsZigpOyB9CisKKy8vIFRocmVhZCBtdXRleDoKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IHRlc3RfcGxhdGZvcm1fdGhyZWFkX211dGV4Oworc3RhdGljIGlubGluZSB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZV9tdXRleCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IHB0aHJlYWRfbXV0ZXhfaW5pdChwTXV0ZXgsIE5VTEwpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IHB0aHJlYWRfbXV0ZXhfbG9jayhwTXV0ZXgpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KHRlc3RfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgcHRocmVhZF9tdXRleF91bmxvY2socE11dGV4KTsgfQorc3RhdGljIGlubGluZSB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2RlbGV0ZV9tdXRleCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IHB0aHJlYWRfbXV0ZXhfZGVzdHJveShwTXV0ZXgpOyB9Cit0eXBlZGVmIHB0aHJlYWRfY29uZF90IHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NvbmQ7CitzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfaW5pdF9jb25kKHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NvbmQgKnBDb25kKSB7IHB0aHJlYWRfY29uZF9pbml0KHBDb25kLCBOVUxMKTsgfQorc3RhdGljIGlubGluZSB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NvbmRfd2FpdCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCwgdGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeworICAgIHB0aHJlYWRfY29uZF93YWl0KHBDb25kLCBwTXV0ZXgpOworfQorc3RhdGljIGlubGluZSB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NvbmRfYnJvYWRjYXN0KHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NvbmQgKnBDb25kKSB7IHB0aHJlYWRfY29uZF9icm9hZGNhc3QocENvbmQpOyB9CisKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSAgLy8gZGVmaW5lZChfX2xpbnV4X18pCisvLyBUaHJlYWRzOgordHlwZWRlZiBIQU5ETEUgdGVzdF9wbGF0Zm9ybV90aHJlYWQ7CitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9jcmVhdGUodGVzdF9wbGF0Zm9ybV90aHJlYWQgKnRocmVhZCwgdm9pZCAqKCpmdW5jKSh2b2lkICopLCB2b2lkICpkYXRhKSB7CisgICAgRFdPUkQgdGhyZWFkSUQ7CisgICAgKnRocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLCAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgLy8gdXNlIGRlZmF1bHQgc3RhY2sgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsICAgICAgICAvLyB0aHJlYWQgZnVuY3Rpb24gYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBjcmVhdGlvbiBmbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocmVhZElEKTsgIC8vIHJldHVybnMgdGhyZWFkIGlkZW50aWZpZXIKKyAgICByZXR1cm4gKCp0aHJlYWQgIT0gTlVMTCk7Cit9CitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9qb2luKHRlc3RfcGxhdGZvcm1fdGhyZWFkIHRocmVhZCwgdm9pZCAqKnJldHZhbCkgeworICAgIHJldHVybiBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZCwgSU5GSU5JVEUpOworfQorCisvLyBUaHJlYWQgSURzOgordHlwZWRlZiBEV09SRCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9pZDsKK3N0YXRpYyB0ZXN0X3BsYXRmb3JtX3RocmVhZF9pZCB0ZXN0X3BsYXRmb3JtX2dldF90aHJlYWRfaWQoKSB7IHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsgfQorCisvLyBUaHJlYWQgbXV0ZXg6Cit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gdGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXg7CitzdGF0aWMgdm9pZCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9jcmVhdGVfbXV0ZXgodGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKHBNdXRleCk7IH0KK3N0YXRpYyB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgodGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBFbnRlckNyaXRpY2FsU2VjdGlvbihwTXV0ZXgpOyB9CitzdGF0aWMgdm9pZCB0ZXN0X3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgodGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBMZWF2ZUNyaXRpY2FsU2VjdGlvbihwTXV0ZXgpOyB9CitzdGF0aWMgdm9pZCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9kZWxldGVfbXV0ZXgodGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBEZWxldGVDcml0aWNhbFNlY3Rpb24ocE11dGV4KTsgfQordHlwZWRlZiBDT05ESVRJT05fVkFSSUFCTEUgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZDsKK3N0YXRpYyB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2luaXRfY29uZCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCkgeyBJbml0aWFsaXplQ29uZGl0aW9uVmFyaWFibGUocENvbmQpOyB9CitzdGF0aWMgdm9pZCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9jb25kX3dhaXQodGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZCAqcENvbmQsIHRlc3RfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsKKyAgICBTbGVlcENvbmRpdGlvblZhcmlhYmxlQ1MocENvbmQsIHBNdXRleCwgSU5GSU5JVEUpOworfQorc3RhdGljIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZF9icm9hZGNhc3QodGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZCAqcENvbmQpIHsgV2FrZUFsbENvbmRpdGlvblZhcmlhYmxlKHBDb25kKTsgfQorI2Vsc2UgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVkKF9XSU4zMikKKworI2Vycm9yIFRoZSAidGVzdF9jb21tb24uaCIgZmlsZSBtdXN0IGJlIG1vZGlmaWVkIGZvciB0aGlzIE9TLgorCisgICAgLy8gTk9URTogSW4gb3JkZXIgdG8gc3VwcG9ydCBhbm90aGVyIE9TLCBhbiAjZWxpZiBuZWVkcyB0byBiZSBhZGRlZCAoYWJvdmUgdGhlCisgICAgLy8gIiNlbHNlIC8vIGRlZmluZWQoX1dJTjMyKSIpIGZvciB0aGF0IE9TLCBhbmQgT1Mtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlCisgICAgLy8gY29udGVudHMgb2YgdGhpcyBmaWxlIG11c3QgYmUgY3JlYXRlZC4KKworICAgIC8vIE5PVEU6IE90aGVyIE9TLXNwZWNpZmljIGNoYW5nZXMgYXJlIGFsc28gbmVlZGVkIGZvciB0aGlzIE9TLiAgU2VhcmNoIGZvcgorICAgIC8vIGZpbGVzIHdpdGggIldJTjMyIiBpbiBpdCwgYXMgYSBxdWljayB3YXkgdG8gZmluZCBmaWxlcyB0aGF0IG11c3QgYmUgY2hhbmdlZC4KKworI2VuZGlmICAvLyBkZWZpbmVkKF9XSU4zMikKKworI2VuZGlmICAvLyBURVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvdmtfbGF5ZXJfc2V0dGluZ3MudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL3ZrX2xheWVyX3NldHRpbmdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDhkYWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi1sb2FkZXIvc3JjL3Rlc3RzL3ZrX2xheWVyX3NldHRpbmdzLnR4dApAQCAtMCwwICsxLDggQEAKK2x1bmFyZ19jb3JlX3ZhbGlkYXRpb24ucmVwb3J0X2ZsYWdzID0gZXJyb3IKK2x1bmFyZ19jb3JlX3ZhbGlkYXRpb24uZGVidWdfYWN0aW9uID0gVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHCitsdW5hcmdfb2JqZWN0X3RyYWNrZXIucmVwb3J0X2ZsYWdzID0gZXJyb3IKK2x1bmFyZ19vYmplY3RfdHJhY2tlci5kZWJ1Z19hY3Rpb24gPSBWS19EQkdfTEFZRVJfQUNUSU9OX0xPR19NU0cKK2x1bmFyZ19wYXJhbWV0ZXJfdmFsaWRhdGlvbi5yZXBvcnRfZmxhZ3MgPSBlcnJvcgorbHVuYXJnX3BhcmFtZXRlcl92YWxpZGF0aW9uLmRlYnVnX2FjdGlvbiA9IFZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TRworZ29vZ2xlX3RocmVhZGluZy5yZXBvcnRfZmxhZ3MgPSBlcnJvcgorZ29vZ2xlX3RocmVhZGluZy5kZWJ1Z19hY3Rpb24gPSBWS19EQkdfTEFZRVJfQUNUSU9OX0xPR19NU0cKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tbG9hZGVyL3NyYy90ZXN0cy92a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cy52Y3hwcm9qLnVzZXIgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMudmN4cHJvai51c2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOWY5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLWxvYWRlci9zcmMvdGVzdHMvdmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMudmN4cHJvai51c2VyCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjEyLjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbFdpdGhEZWJJbmZvfHg2NCciPgorICAgIDxMb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+VktfTEFZRVJfUEFUSD0kKFByb2plY3REaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxMb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+VktfTEFZRVJfUEFUSD0kKFByb2plY3REaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPExvY2FsRGVidWdnZXJFbnZpcm9ubWVudD5WS19MQVlFUl9QQVRIPSQoUHJvamVjdERpcilcbGF5ZXJzXCQoQ29uZmlndXJhdGlvbik8L0xvY2FsRGVidWdnZXJFbnZpcm9ubWVudD4KKyAgICA8RGVidWdnZXJGbGF2b3I+V2luZG93c0xvY2FsRGVidWdnZXI8L0RlYnVnZ2VyRmxhdm9yPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nTWluU2l6ZVJlbHx4NjQnIj4KKyAgICA8TG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PlZLX0xBWUVSX1BBVEg9JChQcm9qZWN0RGlyKVxsYXllcnNcJChDb25maWd1cmF0aW9uKTwvTG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PgorICAgIDxEZWJ1Z2dlckZsYXZvcj5XaW5kb3dzTG9jYWxEZWJ1Z2dlcjwvRGVidWdnZXJGbGF2b3I+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxXaXRoRGViSW5mb3xXaW4zMiciPgorICAgIDxMb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+VktfTEFZRVJfUEFUSD0kKFByb2plY3REaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExvY2FsRGVidWdnZXJFbnZpcm9ubWVudD5WS19MQVlFUl9QQVRIPSQoUHJvamVjdERpcilcbGF5ZXJzXCQoQ29uZmlndXJhdGlvbik8L0xvY2FsRGVidWdnZXJFbnZpcm9ubWVudD4KKyAgICA8RGVidWdnZXJGbGF2b3I+V2luZG93c0xvY2FsRGVidWdnZXI8L0RlYnVnZ2VyRmxhdm9yPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nTWluU2l6ZVJlbHxXaW4zMiciPgorICAgIDxMb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+VktfTEFZRVJfUEFUSD0kKFByb2plY3REaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8TG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PlZLX0xBWUVSX1BBVEg9JChQcm9qZWN0RGlyKVxsYXllcnNcJChDb25maWd1cmF0aW9uKTwvTG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PgorICAgIDxEZWJ1Z2dlckZsYXZvcj5XaW5kb3dzTG9jYWxEZWJ1Z2dlcjwvRGVidWdnZXJGbGF2b3I+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjLy5hcHB2ZXlvci55bWwgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy8uYXBwdmV5b3IueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODA4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy8uYXBwdmV5b3IueW1sCkBAIC0wLDAgKzEsNzMgQEAKKyMgV2luZG93cyBCdWlsZCBDb25maWd1cmF0aW9uIGZvciBBcHBWZXlvcgorIyBodHRwOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2FwcHZleW9yLXltbAorIworCisjIFRoaXMgdmVyc2lvbiBzdGFydHMgYSBzZXBhcnRlIGpvYiBmb3IgZWFjaCBwbGF0Zm9ybSBjb25maWcKKyMgaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGUgQXBwVmV5b3IgbGltaXQgb2YgNjAgbWlucyBwZXIgam9iLgorCisjIGJ1aWxkIHZlcnNpb24gZm9ybWF0Cit2ZXJzaW9uOiAie2J1aWxkfSIKKworIyBGcmVlIGFjY291bnRzIGhhdmUgYSBtYXggb2YgMSwgYnV0IGFzayBhbnl3YXkuCittYXhfam9iczogNAorCitvczoKKyAgLSBWaXN1YWwgU3R1ZGlvIDIwMTUKKworaW5pdDoKKyAgLSBnaXQgY29uZmlnIC0tZ2xvYmFsIGNvcmUuYXV0b2NybGYgdHJ1ZQorCitlbnZpcm9ubWVudDoKKyAgUFlUSE9OX1BBVEg6ICJDOi9QeXRob24zNSIKKyAgUFlUSE9OX1BBQ0tBR0VfUEFUSDogIkM6L1B5dGhvbjM1L1NjcmlwdHMiCisgIENNQUtFX1VSTDogImh0dHA6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLXdpbjY0LXg2NC56aXAiCisKK2JyYW5jaGVzOgorICBvbmx5OgorICAgIC0gbWFzdGVyCisKKyMgSW5zdGFsbCBkZXNpcmVkIENNYWtlIHZlcnNpb24gMy4xMC4yIGJlZm9yZSBhbnkgb3RoZXIgYnVpbGRpbmcKK2luc3RhbGw6CisgIC0gYXBwdmV5b3IgRG93bmxvYWRGaWxlICVDTUFLRV9VUkwlIC1GaWxlTmFtZSBjbWFrZS56aXAKKyAgLSA3eiB4IGNtYWtlLnppcCAtb0M6XGNtYWtlID4gbnVsCisgIC0gc2V0IHBhdGg9QzpcY21ha2VcYmluOyVwYXRoJQorICAtIGNtYWtlIC0tdmVyc2lvbgorCitiZWZvcmVfYnVpbGQ6CisgIC0gIlNFVCBQQVRIPUM6XFxQeXRob24zNTtDOlxcUHl0aG9uMzVcXFNjcmlwdHM7JVBBVEglIgorICAtIGVjaG8gU3RhcnRpbmcgYnVpbGQgZm9yICVBUFBWRVlPUl9SRVBPX05BTUUlIGluICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgICMgQnVpbGQgZGVwZW5kZW5jaWVzCisgIC0gcHl0aG9uICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlL3NjcmlwdHMvdXBkYXRlX2RlcHMucHkgLS1hcmNoPSVQTEFURk9STSUgLS1jb25maWc9JUNPTkZJR1VSQVRJT04lIC0tZGlyPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlL2V4dGVybmFsCisgICMgVmVyaWZ5IGNvbnNpc3RlbmN5IGJldHdlZW4gc291cmNlIGZpbGUgZ2VuZXJhdG9ycyBhbmQgb3V0cHV0CisgIC0gZWNobyBWZXJpZnlpbmcgY29uc2lzdGVuY3kgYmV0d2VlbiBzb3VyY2UgZmlsZSBnZW5lcmF0b3JzIGFuZCBvdXRwdXQKKyAgLSBweXRob24gJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUvc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkgLS12ZXJpZnkgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUvZXh0ZXJuYWwvVnVsa2FuLUhlYWRlcnMvcmVnaXN0cnkKKyAgIyBHZW5lcmF0ZSBidWlsZCBmaWxlcyB1c2luZyBDTWFrZSBmb3IgdGhlIGJ1aWxkIHN0ZXAuCisgIC0gZWNobyBHZW5lcmF0aW5nIFZ1bGthbi1Ub29scyBDTWFrZSBmaWxlcyBmb3IgJVBMQVRGT1JNJSAlQ09ORklHVVJBVElPTiUKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIG1rZGlyIGJ1aWxkCisgIC0gY2QgYnVpbGQKKyAgLSBjbWFrZSAtQSAlUExBVEZPUk0lIC1DICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlL2V4dGVybmFsL2hlbHBlci5jbWFrZSAuLgorICAtIGVjaG8gQnVpbGRpbmcgcGxhdGZvcm09JVBMQVRGT1JNJSBjb25maWd1cmF0aW9uPSVDT05GSUdVUkFUSU9OJQorCitwbGF0Zm9ybToKKyAgLSBXaW4zMgorICAtIHg2NAorCitjb25maWd1cmF0aW9uOgorICAtIFJlbGVhc2UKKyAgLSBEZWJ1ZworCisjIEJ1aWxkIG9ubHkgeDY0IFJlbGVhc2UgYW5kIFdpbjMyKHg4NikgRGVidWcgdG8gcmVkdWNlIGJ1aWxkIHRpbWUuCisjIFRoaXMgc2hvdWxkIHN0aWxsIHByb3ZpZGUgYWRlcXVhdGUgMzItYml0IHZzIDY0LWJpdCBhbmQKKyMgUmVsZWFzZSB2cyBEZWJ1ZyBjb3ZlcmFnZS4KK21hdHJpeDoKKyAgZXhjbHVkZToKKyAgICAtIGNvbmZpZ3VyYXRpb246IFJlbGVhc2UKKyAgICAgIHBsYXRmb3JtOiBXaW4zMgorICAgIC0gY29uZmlndXJhdGlvbjogRGVidWcKKyAgICAgIHBsYXRmb3JtOiB4NjQKKworYnVpbGQ6CisgIHBhcmFsbGVsOiB0cnVlICAgICAgICAgICAgICAgICAgIyBlbmFibGUgTVNCdWlsZCBwYXJhbGxlbCBidWlsZHMKKyAgcHJvamVjdDogYnVpbGQvVnVsa2FuLVRvb2xzLnNsbiAjIHBhdGggdG8gVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBvciBwcm9qZWN0CisgIHZlcmJvc2l0eTogcXVpZXQgICAgICAgICAgICAgICAgIyBxdWlldHxtaW5pbWFsfG5vcm1hbHxkZXRhaWxlZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvLmNsYW5nLWZvcm1hdCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjLy5jbGFuZy1mb3JtYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmNGQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjLy5jbGFuZy1mb3JtYXQKQEAgLTAsMCArMSw3IEBACistLS0KKyMgVXNlIGRlZmF1bHRzIGZyb20gdGhlIEdvb2dsZSBzdHlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKK0Jhc2VkT25TdHlsZTogR29vZ2xlCitJbmRlbnRXaWR0aDogNAorQ29sdW1uTGltaXQ6IDEzMgorU29ydEluY2x1ZGVzOiBmYWxzZQorLi4uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy8uY21ha2UtZm9ybWF0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvLmNtYWtlLWZvcm1hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2QyZjk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvLmNtYWtlLWZvcm1hdC5weQpAQCAtMCwwICsxLDM0IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIGNtYWtlLWZvcm1hdCAodjAuNC4xLCBjaXJjYSBKdWwgMjAxOCkKKyMgaHR0cHM6Ly9naXRodWIuY29tL2NoZXNoaXJla293L2NtYWtlX2Zvcm1hdAorCisjIEhvdyB3aWRlIHRvIGFsbG93IGZvcm1hdHRlZCBjbWFrZSBmaWxlcworbGluZV93aWR0aCA9IDEzMgorCisjIEhvdyBtYW55IHNwYWNlcyB0byB0YWIgZm9yIGluZGVudAordGFiX3NpemUgPSA0CisKKyMgSWYgYXJnbGlzdHMgYXJlIGxvbmdlciB0aGFuIHRoaXMsIGJyZWFrIHRoZW0gYWx3YXlzCittYXhfc3ViYXJnc19wZXJfbGluZSA9IDMKKworIyBJZiB0cnVlLCBzZXBhcmF0ZSBmbG93IGNvbnRyb2wgbmFtZXMgZnJvbSB0aGVpciBwYXJlbnRoZXNlcyB3aXRoIGEgc3BhY2UKK3NlcGFyYXRlX2N0cmxfbmFtZV93aXRoX3NwYWNlID0gRmFsc2UKKworIyBJZiB0cnVlLCBzZXBhcmF0ZSBmdW5jdGlvbiBuYW1lcyBmcm9tIHBhcmVudGhlc2VzIHdpdGggYSBzcGFjZQorc2VwYXJhdGVfZm5fbmFtZV93aXRoX3NwYWNlID0gRmFsc2UKKworIyBJZiBhIHN0YXRlbWVudCBpcyB3cmFwcGVkIHRvIG1vcmUgdGhhbiBvbmUgbGluZSwgdGhhbiBkYW5nbGUgdGhlIGNsb3NpbmcKKyMgcGFyZW50aGVzaXMgb24gaXQncyBvd24gbGluZQorZGFuZ2xlX3BhcmVucyA9IEZhbHNlCisKKyMgV2hhdCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBidWxsZXRlZCBsaXN0cworYnVsbGV0X2NoYXIgPSB1JyonCisKKyMgV2hhdCBjaGFyYWN0ZXIgdG8gdXNlIGFzIHB1bmN0dWF0aW9uIGFmdGVyIG51bWVyYWxzIGluIGFuIGVudW1lcmF0ZWQgbGlzdAorZW51bV9jaGFyID0gdScuJworCisjIFdoYXQgc3R5bGUgbGluZSBlbmRpbmdzIHRvIHVzZSBpbiB0aGUgb3V0cHV0LgorbGluZV9lbmRpbmcgPSB1J3VuaXgnCisKKyMgRm9ybWF0IGNvbW1hbmQgbmFtZXMgY29uc2lzdGVudGx5IGFzICdsb3dlcicgb3IgJ3VwcGVyJyBjYXNlCitjb21tYW5kX2Nhc2UgPSB1J2xvd2VyJworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy8uZ24gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy8uZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5MDI1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjLy5nbgpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoQykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2J1aWxkY29uZmlnID0gIi8vYnVpbGQvY29uZmlnL0JVSUxEQ09ORklHLmduIgorc2Vjb25kYXJ5X3NvdXJjZSA9ICIvL2J1aWxkLWduL3NlY29uZGFyeS8iCisKK2RlZmF1bHRfYXJncyA9IHsKKyAgICBjbGFuZ191c2VfY2hyb21lX3BsdWdpbnMgPSBmYWxzZQorICAgIHVzZV9jdXN0b21fbGliY3h4ID0gZmFsc2UKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvLnRyYXZpcy55bWwgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTI0YTU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvLnRyYXZpcy55bWwKQEAgLTAsMCArMSwxNTYgQEAKKyMgQnVpbGQgQ29uZmlndXJhdGlvbiBmb3IgVHJhdmlzIENJCisjIGh0dHBzOi8vdHJhdmlzLWNpLm9yZworCitkaXN0OiB4ZW5pYWwKK3N1ZG86IHJlcXVpcmVkCitsYW5ndWFnZTogY3BwCisKK21hdHJpeDoKKyAgIyBTaG93IGZpbmFsIHN0YXR1cyBpbW1lZGlhdGVseSBpZiBhIHRlc3QgZmFpbHMuCisgIGZhc3RfZmluaXNoOiB0cnVlCisgIGFsbG93X2ZhaWx1cmVzOgorICAgIC0gZW52OiBDSEVDS19DT01NSVRfRk9STUFUPU9OCisgICAgLSBlbnY6IFZVTEtBTl9CVUlMRF9UQVJHRVQ9R04KKyAgaW5jbHVkZToKKyAgICAjIEFuZHJvaWQgYnVpbGQuCisgICAgLSBvczogbGludXgKKyAgICAgIGNvbXBpbGVyOiBnY2MKKyAgICAgIGVudjogVlVMS0FOX0JVSUxEX1RBUkdFVD1BTkRST0lEIEFORFJPSURfVEFSR0VUPWFuZHJvaWQtMjMgQU5EUk9JRF9BQkk9YXJtZWFiaS12N2EKKyAgICAjIEFuZHJvaWQgNjQtYml0IGJ1aWxkLgorICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogZ2NjCisgICAgICBlbnY6IFZVTEtBTl9CVUlMRF9UQVJHRVQ9QU5EUk9JRCBBTkRST0lEX1RBUkdFVD1hbmRyb2lkLTIzIEFORFJPSURfQUJJPWFybTY0LXY4YQorICAgICMgTGludXggR0NDIGRlYnVnIGJ1aWxkLgorICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogZ2NjCisgICAgICBlbnY6IFZVTEtBTl9CVUlMRF9UQVJHRVQ9TElOVVgKKyAgICAjIExpbnV4IGNsYW5nIGRlYnVnIGJ1aWxkLgorICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogY2xhbmcKKyAgICAgIGVudjogVlVMS0FOX0JVSUxEX1RBUkdFVD1MSU5VWAorICAgICMgTGludXggR04gZGVidWcgYnVpbGQKKyAgICAtIG9zOiBsaW51eAorICAgICAgZW52OiBWVUxLQU5fQlVJTERfVEFSR0VUPUdOCisgICAgIyBDaGVjayBmb3IgcHJvcGVyIGNsYW5nIGZvcm1hdHRpbmcgaW4gdGhlIHB1bGwgcmVxdWVzdC4KKyAgICAtIGVudjogQ0hFQ0tfRk9STUFUPU9OCisgICAgIyBDaGVjayBmb3IgcHJvcGVyIGNvbW1pdCBtZXNzYWdlIGZvcm1hdHRpbmcgZm9yIGNvbW1pdHMgaW4gUFIKKyAgICAtIGVudjogQ0hFQ0tfQ09NTUlUX0ZPUk1BVD1PTgorCitjYWNoZTogY2NhY2hlCisKKyMgVXNlIHNldCAtZSBzbyB0aGF0IHRoZSBidWlsZCBmYWlscyB3aGVuIGEgY29tbWFuZCBmYWlscy4KKyMgVGhlIGRlZmF1bHQgYWN0aW9uIGZvciBUcmF2aXMtQ0kgaXMgdG8gY29udGludWUgcnVubmluZyBldmVuIGlmIGEgY29tbWFuZCBmYWlscy4KKyMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90cmF2aXMtY2kvdHJhdmlzLWNpL2lzc3Vlcy8xMDY2LgorIyBVc2UgdGhlIFlBTUwgYmxvY2sgc2NhbGFyIGhlYWRlciAofCkgdG8gYWxsb3cgZWFzaWVyIG11bHRpbGluZSBzY3JpcHQgY29kaW5nLgorCitiZWZvcmVfaW5zdGFsbDoKKyAgLSBzZXQgLWUKKyAgLSBDTUFLRV9WRVJTSU9OPTMuMTAuMgorICAtIHwKKyAgICBpZiBbWyAiJHtUUkFWSVNfT1NfTkFNRX0iID09ICJsaW51eCIgXV07IHRoZW4KKyAgICAgIENNQUtFX1VSTD0iaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdiR7Q01BS0VfVkVSU0lPTiUuKn0vY21ha2UtJHtDTUFLRV9WRVJTSU9OfS1MaW51eC14ODZfNjQudGFyLmd6IgorICAgICAgZWNobyBDTUFLRV9VUkw9JHtDTUFLRV9VUkx9CisgICAgICBta2RpciBjbWFrZS0ke0NNQUtFX1ZFUlNJT059ICYmIHRyYXZpc19yZXRyeSB3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgLU8gLSAke0NNQUtFX1VSTH0gfCB0YXIgLS1zdHJpcC1jb21wb25lbnRzPTEgLXh6IC1DIGNtYWtlLSR7Q01BS0VfVkVSU0lPTn0KKyAgICAgIGV4cG9ydCBQQVRIPSR7UFdEfS9jbWFrZS0ke0NNQUtFX1ZFUlNJT059L2Jpbjoke1BBVEh9CisgICAgZWxzZQorICAgICAgYnJldyBpbnN0YWxsIGNtYWtlIHx8IGJyZXcgdXBncmFkZSBjbWFrZQorICAgIGZpCisgICAgY21ha2UgLS12ZXJzaW9uCisgIC0gfAorICAgIGlmIFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkxJTlVYIiBdXSB8fCBbWyAiJFZVTEtBTl9CVUlMRF9UQVJHRVQiID09ICJHTiIgXV07IHRoZW4KKyAgICAgICMgSW5zdGFsbCB0aGUgYXBwcm9wcmlhdGUgTGludXggcGFja2FnZXMuCisgICAgICBzdWRvIGFwdC1nZXQgLXFxIHVwZGF0ZQorICAgICAgc3VkbyBhcHQtZ2V0IC15IGluc3RhbGwgbGlieGtiY29tbW9uLWRldiBsaWJ3YXlsYW5kLWRldiBsaWJtaXJjbGllbnQtZGV2IGxpYnhyYW5kci1kZXYgbGlieDExLXhjYi1kZXYgcHl0aG9uLXBhdGhsaWIKKyAgICBmaQorICAtIHwKKyAgICBpZiBbWyAiJFZVTEtBTl9CVUlMRF9UQVJHRVQiID09ICJBTkRST0lEIiBdXTsgdGhlbgorICAgICAgIyBJbnN0YWxsIHRoZSBBbmRyb2lkIE5ESy4KKyAgICAgIGV4cG9ydCBBUkNIPWB1bmFtZSAtbWAKKyAgICAgIHdnZXQgaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9yZXBvc2l0b3J5L2FuZHJvaWQtbmRrLXIxNWMtbGludXgtJHtBUkNIfS56aXAKKyAgICAgIHVuemlwIC11IC1xIGFuZHJvaWQtbmRrLXIxNWMtbGludXgtJHtBUkNIfS56aXAKKyAgICAgIGV4cG9ydCBBTkRST0lEX05ES19IT01FPWBwd2RgL2FuZHJvaWQtbmRrLXIxNWMKKyAgICAgIGV4cG9ydCBKQVZBX0hPTUU9Ii91c3IvbGliL2p2bS9qYXZhLTgtb3JhY2xlIgorICAgICAgZXhwb3J0IFBBVEg9IiRBTkRST0lEX05ES19IT01FOiRQQVRIIgorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkQ0hFQ0tfRk9STUFUIiA9PSAiT04iICYmICIkVFJBVklTX1BVTExfUkVRVUVTVCIgIT0gImZhbHNlIiBdXTsgdGhlbgorICAgICAgIyBJbnN0YWxsIHRoZSBjbGFuZyBmb3JtYXQgZGlmZiB0b29sLCBidXQgb25seSBmb3IgcHVsbCByZXF1ZXN0cy4KKyAgICAgIGN1cmwgLUwgaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3QvY2ZlL3RydW5rL3Rvb2xzL2NsYW5nLWZvcm1hdC9jbGFuZy1mb3JtYXQtZGlmZi5weSAtbyBzY3JpcHRzL2NsYW5nLWZvcm1hdC1kaWZmLnB5OworICAgIGZpCisgICMgTWlzYyBzZXR1cAorICAtIHwKKyAgLSBleHBvcnQgY29yZV9jb3VudD0kKG5wcm9jIHx8IGVjaG8gNCkgJiYgZWNobyBjb3JlX2NvdW50ID0gJGNvcmVfY291bnQKKyAgLSBzZXQgK2UKKworc2NyaXB0OgorICAtIHNldCAtZQorICAtIHwKKyAgICBpZiBbWyAiJFZVTEtBTl9CVUlMRF9UQVJHRVQiID09ICJMSU5VWCIgXV07IHRoZW4KKyAgICAgICMgQnVpbGQgVnVsa2FuLVRvb2xzIGRlcGVuZGVuY2llcworICAgICAgY2QgJHtUUkFWSVNfQlVJTERfRElSfQorICAgICAgcHl0aG9uICR7VFJBVklTX0JVSUxEX0RJUn0vc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLWNvbmZpZz1EZWJ1ZyAtLWRpcj0ke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsCisgICAgICAjIFZlcmlmeSBjb25zaXN0ZW5jeSBiZXR3ZWVuIHNvdXJjZSBmaWxlIGdlbmVyYXRvcnMgYW5kIG91dHB1dAorICAgICAgZWNobyBWZXJpZnlpbmcgY29uc2lzdGVuY3kgYmV0d2VlbiBzb3VyY2UgZmlsZSBnZW5lcmF0b3JzIGFuZCBvdXRwdXQKKyAgICAgIHB5dGhvbjMgJHtUUkFWSVNfQlVJTERfRElSfS9zY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weSAtLXZlcmlmeSAke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsL1Z1bGthbi1IZWFkZXJzL3JlZ2lzdHJ5CisgICAgICAjIEJ1aWxkIFZ1bGthbi1Ub29scworICAgICAgbWtkaXIgYnVpbGQKKyAgICAgIGNkIGJ1aWxkCisgICAgICBjbWFrZSAtQyR7VFJBVklTX0JVSUxEX0RJUn0vZXh0ZXJuYWwvaGVscGVyLmNtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAuLgorICAgICAgbWFrZSAtaiAkY29yZV9jb3VudAorICAgICAgY2QgJHtUUkFWSVNfQlVJTERfRElSfQorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkxJTlVYIiBdXTsgdGhlbgorICAgICAgIyBSdW4gdnVsa2FuaW5mbyBhcyBhIHRlc3QKKyAgICAgIGNkICR7VFJBVklTX0JVSUxEX0RJUn0KKyAgICAgIGNkIGJ1aWxkL3Z1bGthbmluZm8KKyAgICAgIGxkZCB2dWxrYW5pbmZvCisgICAgICBWS19JQ0RfRklMRU5BTUVTPS4uL2ljZC9Wa0lDRF9tb2NrX2ljZC5qc29uIC4vdnVsa2FuaW5mbworICAgICAgY2QgJHtUUkFWSVNfQlVJTERfRElSfQorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkFORFJPSUQiIF1dOyB0aGVuCisgICAgICBwdXNoZCAke1RSQVZJU19CVUlMRF9ESVJ9L2J1aWxkLWFuZHJvaWQKKyAgICAgIC4vdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5zaCAgLS1hYmkgJEFORFJPSURfQUJJIC0tbm8tYnVpbGQKKyAgICAgIHBvcGQKKyAgICAgIHB1c2hkICR7VFJBVklTX0JVSUxEX0RJUn0vY3ViZS9hbmRyb2lkCisgICAgICBVU0VfQ0NBQ0hFPTEgTkRLX0NDQUNIRT1jY2FjaGUgbmRrLWJ1aWxkIEFQUF9BQkk9JEFORFJPSURfQUJJIC1qICRjb3JlX2NvdW50CisgICAgICBwb3BkCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRWVUxLQU5fQlVJTERfVEFSR0VUIiA9PSAiR04iIF1dOyB0aGVuCisgICAgICBnaXQgY2xvbmUgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3Rvb2xzL2RlcG90X3Rvb2xzLmdpdCBkZXBvdF90b29scworICAgICAgZXhwb3J0IFBBVEg9JFBBVEg6JFBXRC9kZXBvdF90b29scworICAgICAgLi9idWlsZC1nbi91cGRhdGVfZGVwcy5zaAorICAgICAgZ24gZ2VuIG91dC9EZWJ1ZworICAgICAgbmluamEgLUMgb3V0L0RlYnVnCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRDSEVDS19GT1JNQVQiID09ICJPTiIgXV07IHRoZW4KKyAgICAgIGlmIFtbICIkVFJBVklTX1BVTExfUkVRVUVTVCIgIT0gImZhbHNlIiBdXTsgdGhlbgorICAgICAgICAjIFJ1biB0aGUgY2xhbmcgZm9ybWF0IGNoZWNrIG9ubHkgZm9yIHB1bGwgcmVxdWVzdCBidWlsZHMgYmVjYXVzZSB0aGUKKyAgICAgICAgIyBtYXN0ZXIgYnJhbmNoIGlzIG5lZWRlZCB0byBkbyB0aGUgZ2l0IGRpZmYuCisgICAgICAgIGVjaG8gIkNoZWNraW5nIGNsYW5nLWZvcm1hdCBiZXR3ZWVuIFRSQVZJU19CUkFOQ0g9JFRSQVZJU19CUkFOQ0ggYW5kIFRSQVZJU19QVUxMX1JFUVVFU1RfQlJBTkNIPSRUUkFWSVNfUFVMTF9SRVFVRVNUX0JSQU5DSCIKKyAgICAgICAgLi9zY3JpcHRzL2NoZWNrX2NvZGVfZm9ybWF0LnNoCisgICAgICBlbHNlCisgICAgICAgIGVjaG8gIlNraXBwaW5nIGNsYW5nLWZvcm1hdCBjaGVjayBzaW5jZSB0aGlzIGlzIG5vdCBhIHB1bGwgcmVxdWVzdC4iCisgICAgICBmaQorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkQ0hFQ0tfQ09NTUlUX0ZPUk1BVCIgPT0gIk9OIiBdXTsgdGhlbgorICAgICAgaWYgW1sgIiRUUkFWSVNfUFVMTF9SRVFVRVNUIiAhPSAiZmFsc2UiIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIkNoZWNraW5nIGNvbW1pdCBtZXNzYWdlIGZvcm1hdHM6ICBTZWUgQ09OVFJJQlVUSU5HLm1kIgorICAgICAgICAuL3NjcmlwdHMvY2hlY2tfY29tbWl0X21lc3NhZ2VfZm9ybWF0LnNoCisgICAgICBmaQorICAgIGZpCisgIC0gc2V0ICtlCisKK25vdGlmaWNhdGlvbnM6CisgIGVtYWlsOgorICAgIHJlY2lwaWVudHM6CisgICAgICAtIGNub3J0aHJvcEBnb29nbGUuY29tCisgICAgICAtIHRvYmluZUBnb29nbGUuY29tCisgICAgICAtIGNocmlzZm9yYmVzQGdvb2dsZS5jb20KKyAgICAgIC0gc2hhbm5vbkBsdW5hcmcuY29tCisgICAgb25fc3VjY2VzczogY2hhbmdlCisgICAgb25fZmFpbHVyZTogYWx3YXlzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9CVUlMRC5nbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL0JVSUxELmduCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTI5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9CVUlMRC5nbgpAQCAtMCwwICsxLDk3IEBACisjIENvcHlyaWdodCAoQykgMjAxOC0yMDE5IFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuCisjIENvcHlyaWdodCAoQykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCgiLy9idWlsZF9vdmVycmlkZXMvdnVsa2FuX3Rvb2xzLmduaSIpCisKKyMgVnVsa2FuLXRvb2xzIGlzbid0IHBvcnRlZCB0byBGdWNoc2lhIHlldC4KKyMgVE9ETyhzcGFuZyk6IFBvcnQgbW9jayBJQ0QgdG8gRnVjaHNpYS4KK2Fzc2VydCghaXNfZnVjaHNpYSkKKwordnVsa2FuX3VuZGVmaW5lX2NvbmZpZ3MgPSBbXQoraWYgKGlzX3dpbikgeworICB2dWxrYW5fdW5kZWZpbmVfY29uZmlncyArPSBbCisgICAgIi8vYnVpbGQvY29uZmlnL3dpbjpub21pbm1heCIsCisgICAgIi8vYnVpbGQvY29uZmlnL3dpbjp1bmljb2RlIiwKKyAgXQorfQorCityYXdfdnVsa2FuX2ljZF9kaXIgPSByZWJhc2VfcGF0aCgiaWNkIiwgcm9vdF9idWlsZF9kaXIpCisKK3Z1bGthbl9kYXRhX2RpciA9ICIkcm9vdF9vdXRfZGlyLyR2dWxrYW5fZGF0YV9zdWJkaXIiCityYXdfdnVsa2FuX2RhdGFfZGlyID0gcmViYXNlX3BhdGgodnVsa2FuX2RhdGFfZGlyLCByb290X2J1aWxkX2RpcikKKworY29uZmlnKCJ2dWxrYW5faW50ZXJuYWxfY29uZmlnIikgeworICBkZWZpbmVzID0gWyAiVlVMS0FOX05PTl9DTUFLRV9CVUlMRCIgXQorICBpZiAoaXNfY2xhbmcgfHwgIWlzX3dpbikgeworICAgIGNmbGFncyA9IFsgIi1Xbm8tdW51c2VkLWZ1bmN0aW9uIiBdCisgIH0KKyAgaWYgKGlzX2xpbnV4KSB7CisgICAgZGVmaW5lcyArPSBbCisgICAgICAiU1lTQ09ORkRJUj1cIi9ldGNcIiIsCisgICAgICAiRkFMTEJBQ0tfQ09ORklHX0RJUlM9XCIvZXRjL3hkZ1wiIiwKKyAgICAgICJGQUxMQkFDS19EQVRBX0RJUlM9XCIvdXNyL2xvY2FsL3NoYXJlOi91c3Ivc2hhcmVcIiIsCisgICAgXQorICB9Cit9CisKK2lmICghaXNfYW5kcm9pZCkgeworICAjIFZ1bGthbiBNb2NrIElDRAorICAjIC0tLS0tLS0tLS0tLS0tLQorICBzaGFyZWRfbGlicmFyeSgiVmtJQ0RfbW9ja19pY2QiKSB7CisgICAgY29uZmlncyAtPSB2dWxrYW5fdW5kZWZpbmVfY29uZmlncworICAgIHB1YmxpY19kZXBzID0gWworICAgICAgIiR2dWxrYW5faGVhZGVyc19kaXI6dnVsa2FuX2hlYWRlcnMiLAorICAgIF0KKyAgICBkYXRhX2RlcHMgPSBbCisgICAgICAiOnZ1bGthbl9nZW5faWNkX2pzb25fZmlsZSIsCisgICAgXQorICAgIHNvdXJjZXMgPSBbCisgICAgICAiaWNkL2dlbmVyYXRlZC9tb2NrX2ljZC5jcHAiLAorICAgICAgImljZC9nZW5lcmF0ZWQvbW9ja19pY2QuaCIsCisgICAgXQorICAgIGlmIChpc193aW4pIHsKKyAgICAgIHNvdXJjZXMgKz0gWyAiaWNkL1ZrSUNEX21vY2tfaWNkLmRlZiIgXQorICAgIH0KKyAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiIF0KKyAgfQorCisgIGFjdGlvbigidnVsa2FuX2dlbl9pY2RfanNvbl9maWxlIikgeworICAgIHNjcmlwdCA9ICJidWlsZC1nbi9nZW5lcmF0ZV92dWxrYW5fbGF5ZXJzX2pzb24ucHkiCisgICAgc291cmNlcyA9IFsKKyAgICAgICIkdnVsa2FuX2hlYWRlcnNfZGlyL2luY2x1ZGUvdnVsa2FuL3Z1bGthbl9jb3JlLmgiLAorICAgIF0KKyAgICBhcmdzID0gWyAiLS1pY2QiIF0KKyAgICBpZiAoaXNfd2luKSB7CisgICAgICBzb3VyY2VzICs9IFsgImljZC93aW5kb3dzL1ZrSUNEX21vY2tfaWNkLmpzb24iIF0KKyAgICAgIGFyZ3MgKz0gWyAiJHJhd192dWxrYW5faWNkX2Rpci93aW5kb3dzIiBdCisgICAgfQorICAgIGlmIChpc19saW51eCkgeworICAgICAgc291cmNlcyArPSBbICJpY2QvbGludXgvVmtJQ0RfbW9ja19pY2QuanNvbiIgXQorICAgICAgYXJncyArPSBbICIkcmF3X3Z1bGthbl9pY2RfZGlyL2xpbnV4IiBdCisgICAgfQorICAgIGlmIChpc19tYWMpIHsKKyAgICAgIHNvdXJjZXMgKz0gWyAiaWNkL21hY29zL1ZrSUNEX21vY2tfaWNkLmpzb24iIF0KKyAgICAgIGFyZ3MgKz0gWyAiJHJhd192dWxrYW5faWNkX2Rpci9tYWNvcyIgXQorICAgIH0KKworICAgICMgVGhlIGxheWVyIEpTT04gZmlsZXMgYXJlIHBhcnQgb2YgdGhlIG5lY2Vzc2FyeSBkYXRhIGRlcHMuCisgICAgb3V0cHV0cyA9IFsKKyAgICAgICIkdnVsa2FuX2RhdGFfZGlyL1ZrSUNEX21vY2tfaWNkLmpzb24iLAorICAgIF0KKyAgICBkYXRhID0gb3V0cHV0cworICAgIGFyZ3MgKz0gWyByYXdfdnVsa2FuX2RhdGFfZGlyIF0gKyByZWJhc2VfcGF0aChzb3VyY2VzLCByb290X2J1aWxkX2RpcikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvQlVJTEQubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9CVUlMRC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjMzYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvQlVJTEQubWQKQEAgLTAsMCArMSw4NjkgQEAKKyMgQnVpbGQgSW5zdHJ1Y3Rpb25zCisKK0luc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgdGhpcyByZXBvc2l0b3J5IG9uIExpbnV4LCBXaW5kb3dzLCBBbmRyb2lkLCBhbmQgTWFjT1MuCisKKyMjIEluZGV4CisKKzEuIFtDb250cmlidXRpbmddKCNjb250cmlidXRpbmctdG8tdGhlLXJlcG9zaXRvcnkpCisxLiBbUmVwb3NpdG9yeSBDb250ZW50XSgjcmVwb3NpdG9yeS1jb250ZW50KQorMS4gW1JlcG9zaXRvcnkgU2V0LVVwXSgjcmVwb3NpdG9yeS1zZXQtdXApCisxLiBbV2luZG93cyBCdWlsZF0oI2J1aWxkaW5nLW9uLXdpbmRvd3MpCisxLiBbTGludXggQnVpbGRdKCNidWlsZGluZy1vbi1saW51eCkKKzEuIFtBbmRyb2lkIEJ1aWxkXSgjYnVpbGRpbmctb24tYW5kcm9pZCkKKzEuIFtNYWNPUyBidWlsZF0oI2J1aWxkaW5nLW9uLW1hY29zKQorCisjIyBDb250cmlidXRpbmcgdG8gdGhlIFJlcG9zaXRvcnkKKworSWYgeW91IGludGVuZCB0byBjb250cmlidXRlLCB0aGUgcHJlZmVycmVkIHdvcmsgZmxvdyBpcyBmb3IgeW91IHRvIGRldmVsb3AKK3lvdXIgY29udHJpYnV0aW9uIGluIGEgZm9yayBvZiB0aGlzIHJlcG9zaXRvcnkgaW4geW91ciBHaXRIdWIgYWNjb3VudCBhbmQgdGhlbgorc3VibWl0IGEgcHVsbCByZXF1ZXN0LiBQbGVhc2Ugc2VlIHRoZSBbQ09OVFJJQlVUSU5HLm1kXShDT05UUklCVVRJTkcubWQpIGZpbGUKK2luIHRoaXMgcmVwb3NpdG9yeSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIyBSZXBvc2l0b3J5IENvbnRlbnQKKworVGhpcyByZXBvc2l0b3J5IGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBuZWNlc3NhcnkgdG8gYnVpbGQgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOgorCistIHZ1bGthbmluZm8KKy0gdmtjdWJlIGFuZCB2a2N1YmVwcCBkZW1vcworLSBtb2NrIElDRAorCisjIyMgSW5zdGFsbGVkIEZpbGVzCisKK1RoZSBgaW5zdGFsbGAgdGFyZ2V0IGluc3RhbGxzIHRoZSBmb2xsb3dpbmcgZmlsZXMgdW5kZXIgdGhlIGRpcmVjdG9yeQoraW5kaWNhdGVkIGJ5ICppbnN0YWxsX2Rpcio6CisKKy0gKmluc3RhbGxfZGlyKmAvYmluYCA6IFRoZSB2dWxrYW5pbmZvLCB2a2N1YmUgYW5kIHZrY3ViZXBwIGV4ZWN1dGFibGVzCistICppbnN0YWxsX2RpcipgL2xpYmAgOiBUaGUgbW9jayBJQ0QgbGlicmFyeSBhbmQgSlNPTiAoV2luZG93cykgKElmIElOU1RBTExfSUNEPU9OKQorLSAqaW5zdGFsbF9kaXIqYC9zaGFyZS92dWxrYW4vaWNkLmRgIDogbW9jayBJQ0QgSlNPTiAoTGludXgvTWFjT1MpIChJZiBJTlNUQUxMX0lDRD1PTikKKworVGhlIGB1bmluc3RhbGxgIHRhcmdldCBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlIGFib3ZlIGZpbGVzIGZyb20gdGhlIGluc3RhbGwKK2RpcmVjdG9yeS4KKworIyMgUmVwb3NpdG9yeSBTZXQtVXAKKworIyMjIERpc3BsYXkgRHJpdmVycworCitUaGlzIHJlcG9zaXRvcnkgZG9lcyBub3QgY29udGFpbiBhIFZ1bGthbi1jYXBhYmxlIGRyaXZlci4gWW91IHdpbGwgbmVlZCB0bworb2J0YWluIGFuZCBpbnN0YWxsIGEgVnVsa2FuIGRyaXZlciBmcm9tIHlvdXIgZ3JhcGhpY3MgaGFyZHdhcmUgdmVuZG9yIG9yIGZyb20KK3NvbWUgb3RoZXIgc3VpdGFibGUgc291cmNlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIFZ1bGthbiBhcHBsaWNhdGlvbnMuCisKKyMjIyBEb3dubG9hZCB0aGUgUmVwb3NpdG9yeQorCitUbyBjcmVhdGUgeW91ciBsb2NhbCBnaXQgcmVwb3NpdG9yeToKKworICAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Ub29scy5naXQKKworIyMjIFJlcG9zaXRvcnkgRGVwZW5kZW5jaWVzCisKK1RoaXMgcmVwb3NpdG9yeSBhdHRlbXB0cyB0byByZXNvbHZlIHNvbWUgb2YgaXRzIGRlcGVuZGVuY2llcyBieSB1c2luZworY29tcG9uZW50cyBmb3VuZCBmcm9tIHRoZSBmb2xsb3dpbmcgcGxhY2VzLCBpbiB0aGlzIG9yZGVyOgorCisxLiBDTWFrZSBvciBFbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZXMgKGUuZy4sIC1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVIpCisxLiBMdW5hckcgVnVsa2FuIFNESywgbG9jYXRlZCBieSB0aGUgYFZVTEtBTl9TREtgIGVudmlyb25tZW50IHZhcmlhYmxlCisxLiBTeXN0ZW0taW5zdGFsbGVkIHBhY2thZ2VzLCBtb3N0bHkgYXBwbGljYWJsZSBvbiBMaW51eAorCitEZXBlbmRlbmNpZXMgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgYnkgdGhlIFNESyBvciBpbnN0YWxsZWQgcGFja2FnZXMgbXVzdCBiZQorcmVzb2x2ZWQgd2l0aCB0aGUgImluc3RhbGwgZGlyZWN0b3J5IiBvdmVycmlkZSBhbmQgYXJlIGxpc3RlZCBiZWxvdy4gVGhlCisiaW5zdGFsbCBkaXJlY3RvcnkiIG92ZXJyaWRlIGNhbiBhbHNvIGJlIHVzZWQgdG8gZm9yY2UgdGhlIHVzZSBvZiBhIHNwZWNpZmljCit2ZXJzaW9uIG9mIHRoYXQgZGVwZW5kZW5jeS4KKworIyMjIyBWdWxrYW4tSGVhZGVycworCitUaGlzIHJlcG9zaXRvcnkgaGFzIGEgcmVxdWlyZWQgZGVwZW5kZW5jeSBvbiB0aGUKK1tWdWxrYW4gSGVhZGVycyByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1IZWFkZXJzKS4KK1lvdSBtdXN0IGNsb25lIHRoZSBoZWFkZXJzIHJlcG9zaXRvcnkgYW5kIGJ1aWxkIGl0cyBgaW5zdGFsbGAgdGFyZ2V0IGJlZm9yZQorYnVpbGRpbmcgdGhpcyByZXBvc2l0b3J5LiBUaGUgVnVsa2FuLUhlYWRlcnMgcmVwb3NpdG9yeSBpcyByZXF1aXJlZCBiZWNhdXNlIGl0Citjb250YWlucyB0aGUgVnVsa2FuIEFQSSBkZWZpbml0aW9uIGZpbGVzIChyZWdpc3RyeSkgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYnVpbGQKK3RoZSBtb2NrIElDRC4gWW91IG11c3QgYWxzbyB0YWtlIG5vdGUgb2YgdGhlIGhlYWRlcnMgaW5zdGFsbCBkaXJlY3RvcnkgYW5kCitwYXNzIGl0IG9uIHRoZSBDTWFrZSBjb21tYW5kIGxpbmUgZm9yIGJ1aWxkaW5nIHRoaXMgcmVwb3NpdG9yeSwgYXMgZGVzY3JpYmVkCitiZWxvdy4KKworTm90ZSB0aGF0IHRoaXMgZGVwZW5kZW5jeSBjYW4gYmUgaWdub3JlZCBpZiBub3QgYnVpbGRpbmcgdGhlIG1vY2sgSUNECisoQ01ha2Ugb3B0aW9uOiBgLURCVUlMRF9JQ0Q9T0ZGYCkuCisKKyMjIyMgZ2xzbGFuZworCitUaGlzIHJlcG9zaXRvcnkgaGFzIGEgcmVxdWlyZWQgZGVwZW5kZW5jeSBvbiB0aGUgYGdsc2xhbmdWYWxpZGF0b3JgIChzaGFkZXIKK2NvbXBpbGVyKSBmb3IgY29tcGlsaW5nIHRoZSBzaGFkZXIgcHJvZ3JhbXMgZm9yIHRoZSB2a2N1YmUgZGVtb3MuCisKK1RoZSBDTWFrZSBjb2RlIGluIHRoaXMgcmVwb3NpdG9yeSBkb3dubG9hZHMgcmVsZWFzZSBiaW5hcmllcyBvZiBnbHNsYW5nIGlmIGEKK2J1aWxkIGdsc2xhbmcgcmVwb3NpdG9yeSBpcyBub3QgcHJvdmlkZWQuIFRoZSBnbHNsYW5nVmFsaWRhdG9yIGlzIG9idGFpbmVkCitmcm9tIHRoaXMgc2V0IG9mIHJlbGVhc2UgYmluYXJpZXMuCisKK0lmIHlvdSBkb24ndCB3aXNoIHRoZSBDTWFrZSBjb2RlIHRvIGRvd25sb2FkIHRoZXNlIGJpbmFyaWVzLCB0aGVuIHlvdSBtdXN0CitjbG9uZSB0aGUgW2dsc2xhbmcgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbHNsYW5nKSBhbmQKK2J1aWxkIGl0cyBgaW5zdGFsbGAgdGFyZ2V0LiBGb2xsb3cgdGhlIGJ1aWxkIGluc3RydWN0aW9ucyBpbiB0aGUgZ2xzbGFuZworW1JFQURNRS5tZF0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbHNsYW5nL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCkKK2ZpbGUuIEVuc3VyZSB0aGF0IHRoZSBgdXBkYXRlX2dsc2xhbmdfc291cmNlcy5weWAgc2NyaXB0IGhhcyBiZWVuIHJ1biBhcyBwYXJ0CitvZiBidWlsZGluZyBnbHNsYW5nLiBZb3UgbXVzdCBhbHNvIHRha2Ugbm90ZSBvZiB0aGUgZ2xzbGFuZyBpbnN0YWxsIGRpcmVjdG9yeQorYW5kIHBhc3MgaXQgb24gdGhlIENNYWtlIGNvbW1hbmQgbGluZSBmb3IgYnVpbGRpbmcgdGhpcyByZXBvc2l0b3J5LCBhcworZGVzY3JpYmVkIGJlbG93LgorCitOb3RlIHRoYXQgdGhpcyBkZXBlbmRlbmN5IGNhbiBiZSBpZ25vcmVkIGlmIG5vdCBidWlsZGluZyB0aGUgdmtjdWJlIGRlbW8KKyhDTWFrZSBvcHRpb246IGAtREJVSUxEX0NVQkU9T0ZGYCkuCisKKyMjIyBCdWlsZCBhbmQgSW5zdGFsbCBEaXJlY3RvcmllcworCitBIGNvbW1vbiBjb252ZW50aW9uIGlzIHRvIHBsYWNlIHRoZSBidWlsZCBkaXJlY3RvcnkgaW4gdGhlIHRvcCBkaXJlY3Rvcnkgb2YKK3RoZSByZXBvc2l0b3J5IHdpdGggYSBuYW1lIG9mIGBidWlsZGAgYW5kIHBsYWNlIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBhcyBhCitjaGlsZCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5IHdpdGggdGhlIG5hbWUgYGluc3RhbGxgLiBUaGUgcmVtYWluZGVyIG9mIHRoZXNlCitpbnN0cnVjdGlvbnMgZm9sbG93IHRoaXMgY29udmVudGlvbiwgYWx0aG91Z2ggeW91IGNhbiB1c2UgYW55IG5hbWUgZm9yIHRoZXNlCitkaXJlY3RvcmllcyBhbmQgcGxhY2UgdGhlbSBpbiBhbnkgbG9jYXRpb24uCisKKyMjIyBCdWlsZGluZyBEZXBlbmRlbnQgUmVwb3NpdG9yaWVzIHdpdGggS25vd24tR29vZCBSZXZpc2lvbnMKKworVGhlcmUgaXMgYSBQeXRob24gdXRpbGl0eSBzY3JpcHQsIGBzY3JpcHRzL3VwZGF0ZV9kZXBzLnB5YCwgdGhhdCB5b3UgY2FuIHVzZSB0bworZ2F0aGVyIGFuZCBidWlsZCB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcyBtZW50aW9uZWQgYWJvdmUuIFRoaXMgc2NyaXB0IHVzZXMKK2luZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgYHNjcmlwdHMva25vd25fZ29vZC5qc29uYCBmaWxlIHRvIGNoZWNrIG91dCBkZXBlbmRlbnQKK3JlcG9zaXRvcnkgcmV2aXNpb25zIHRoYXQgYXJlIGtub3duIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcmV2aXNpb24gb2YgdGhpcworcmVwb3NpdG9yeSB0aGF0IHlvdSBjdXJyZW50bHkgaGF2ZSBjaGVja2VkIG91dC4gQXMgc3VjaCwgdGhpcyBzY3JpcHQgaXMgdXNlZnVsCithcyBhIHF1aWNrLXN0YXJ0IHRvb2wgZm9yIGNvbW1vbiB1c2UgY2FzZXMgYW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbnMuCisKK0ZvciBhbGwgcGxhdGZvcm1zLCBzdGFydCB3aXRoOgorCisgICAgZ2l0IGNsb25lIGdpdEBnaXRodWIuY29tOktocm9ub3NHcm91cC9WdWxrYW4tVG9vbHMuZ2l0CisgICAgY2QgVnVsa2FuLVRvb2xzCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorCitGb3IgNjQtYml0IExpbnV4IGFuZCBNYWNPUywgY29udGludWUgd2l0aDoKKworICAgIC4uL3NjcmlwdHMvdXBkYXRlX2RlcHMucHkKKyAgICBjbWFrZSAtQyBoZWxwZXIuY21ha2UgLi4KKyAgICBjbWFrZSAtLWJ1aWxkIC4KKworRm9yIDY0LWJpdCBXaW5kb3dzLCBjb250aW51ZSB3aXRoOgorCisgICAgLi5cc2NyaXB0c1x1cGRhdGVfZGVwcy5weSAtLWFyY2ggeDY0CisgICAgY21ha2UgLUEgeDY0IC1DIGhlbHBlci5jbWFrZSAuLgorICAgIGNtYWtlIC0tYnVpbGQgLgorCitGb3IgMzItYml0IFdpbmRvd3MsIGNvbnRpbnVlIHdpdGg6CisKKyAgICAuLlxzY3JpcHRzXHVwZGF0ZV9kZXBzLnB5IC0tYXJjaCBXaW4zMgorICAgIGNtYWtlIC1BIFdpbjMyIC1DIGhlbHBlci5jbWFrZSAuLgorICAgIGNtYWtlIC0tYnVpbGQgLgorCitQbGVhc2Ugc2VlIHRoZSBtb3JlIGRldGFpbGVkIGJ1aWxkIGluZm9ybWF0aW9uIGxhdGVyIGluIHRoaXMgZmlsZSBpZiB5b3UgaGF2ZQorc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgdGhlc2UgY29tcG9uZW50cy4KKworIyMjIyBOb3RlcworCistIFlvdSBtYXkgbmVlZCB0byBhZGp1c3Qgc29tZSBvZiB0aGUgQ01ha2Ugb3B0aW9ucyBiYXNlZCBvbiB5b3VyIHBsYXRmb3JtLiBTZWUKKyAgdGhlIHBsYXRmb3JtLXNwZWNpZmljIHNlY3Rpb25zIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuCistIFRoZSBgdXBkYXRlX2RlcHMucHlgIHNjcmlwdCBmZXRjaGVzIGFuZCBidWlsZHMgdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgaW4KKyAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoZW4gaXQgaXMgaW52b2tlZC4gSW4gdGhpcyBjYXNlLCB0aGV5IGFyZSBidWlsdCBpbgorICB0aGUgYGJ1aWxkYCBkaXJlY3RvcnkuCistIFRoZSBgYnVpbGRgIGRpcmVjdG9yeSBpcyBhbHNvIGJlaW5nIHVzZWQgdG8gYnVpbGQgdGhpcworICAoVnVsa2FuLVRvb2xzKSByZXBvc2l0b3J5LiBCdXQgdGhlcmUgc2hvdWxkbid0IGJlIGFueSBjb25mbGljdHMKKyAgaW5zaWRlIHRoZSBgYnVpbGRgIGRpcmVjdG9yeSBiZXR3ZWVuIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzIGFuZCB0aGUKKyAgYnVpbGQgZmlsZXMgZm9yIHRoaXMgcmVwb3NpdG9yeS4KKy0gVGhlIGAtLWRpcmAgb3B0aW9uIGZvciBgdXBkYXRlX2RlcHMucHlgIGNhbiBiZSB1c2VkIHRvIHJlbG9jYXRlIHRoZQorICBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzIHRvIGFub3RoZXIgYXJiaXRyYXJ5IGRpcmVjdG9yeSB1c2luZyBhbiBhYnNvbHV0ZSBvcgorICByZWxhdGl2ZSBwYXRoLgorLSBUaGUgYHVwZGF0ZV9kZXBzLnB5YCBzY3JpcHQgZ2VuZXJhdGVzIGEgZmlsZSBuYW1lZCBgaGVscGVyLmNtYWtlYCBhbmQgcGxhY2VzCisgIGl0IGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcyAoYGJ1aWxkYCBpbiB0aGlzCisgIGNhc2UpLiBUaGlzIGZpbGUgY29udGFpbnMgQ01ha2UgY29tbWFuZHMgdG8gc2V0IHRoZSBDTWFrZSBgKl9JTlNUQUxMX0RJUmAKKyAgdmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlIGluc3RhbGwgYXJ0aWZhY3RzIG9mIHRoZSBkZXBlbmRlbnQKKyAgcmVwb3NpdG9yaWVzLiBZb3UgY2FuIHVzZSB0aGlzIGZpbGUgd2l0aCB0aGUgYGNtYWtlIC1DYCBvcHRpb24gdG8gc2V0IHRoZXNlCisgIHZhcmlhYmxlcyB3aGVuIHlvdSBnZW5lcmF0ZSB5b3VyIGJ1aWxkIGZpbGVzIHdpdGggQ01ha2UuIFRoaXMgbGV0cyB5b3UgYXZvaWQKKyAgZW50ZXJpbmcgc2V2ZXJhbCBgKl9JTlNUQUxMX0RJUmAgdmFyaWFibGUgc2V0dGluZ3Mgb24gdGhlIENNYWtlIGNvbW1hbmQgbGluZS4KKy0gSWYgdXNpbmcgIk1JTkdXIiAoR2l0IEZvciBXaW5kb3dzKSwgeW91IG1heSB3aXNoIHRvIHJ1bgorICBgd2lucHR5IHVwZGF0ZV9kZXBzLnB5YCBpbiBvcmRlciB0byBhdm9pZCBidWZmZXJpbmcgYWxsIG9mIHRoZSBzY3JpcHQncworICAicHJpbnQiIG91dHB1dCB1bnRpbCB0aGUgZW5kIGFuZCB0byByZXRhaW4gdGhlIGFiaWxpdHkgdG8gaW50ZXJydXB0IHNjcmlwdAorICBleGVjdXRpb24uCistIFBsZWFzZSB1c2UgYHVwZGF0ZV9kZXBzLnB5IC0taGVscGAgdG8gbGlzdCBhZGRpdGlvbmFsIG9wdGlvbnMgYW5kIHJlYWQgdGhlCisgIGludGVybmFsIGRvY3VtZW50YXRpb24gaW4gYHVwZGF0ZV9kZXBzLnB5YCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworIyMjIEdlbmVyYXRlZCBzb3VyY2UgY29kZQorCitUaGlzIHJlcG9zaXRvcnkgY29udGFpbnMgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGluIHRoZSBgaWNkL2dlbmVyYXRlZGAKK2RpcmVjdG9yeSB3aGljaCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgbW9kaWZpZWQgZGlyZWN0bHkuIEluc3RlYWQsIGNoYW5nZXMgc2hvdWxkIGJlCittYWRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGdlbmVyYXRvciBpbiB0aGUgYHNjcmlwdHNgIGRpcmVjdG9yeS4gVGhlIHNvdXJjZSBmaWxlcyBjYW4KK3RoZW4gYmUgcmVnZW5lcmF0ZWQgdXNpbmcgYHNjcmlwdHMvZ2VuZXJhdGVfc291cmNlLnB5YDoKKworICAgIHB5dGhvbjMgc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkgUEFUSF9UT19WVUxLQU5fSEVBREVSU19SRUdJU1RSWV9ESVIKKworQSBoZWxwZXIgQ01ha2UgdGFyZ2V0IGBWdWxrYW5Ub29sc19nZW5lcmF0ZWRfc291cmNlYCBpcyBhbHNvIHByb3ZpZGVkIHRvIHNpbXBsaWZ5Cit0aGUgaW52b2NhdGlvbiBvZiBgc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHlgIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeToKKworICAgIGNtYWtlIC0tYnVpbGQgLiAtLXRhcmdldCBWdWxrYW5Ub29sc19nZW5lcmF0ZWRfc291cmNlCisKKyMjIyBCdWlsZCBPcHRpb25zCisKK1doZW4gZ2VuZXJhdGluZyBuYXRpdmUgcGxhdGZvcm0gYnVpbGQgZmlsZXMgdGhyb3VnaCBDTWFrZSwgc2V2ZXJhbCBvcHRpb25zIGNhbgorYmUgc3BlY2lmaWVkIHRvIGN1c3RvbWl6ZSB0aGUgYnVpbGQuIFNvbWUgb2YgdGhlIG9wdGlvbnMgYXJlIGJpbmFyeSBvbi9vZmYKK29wdGlvbnMsIHdoaWxlIG90aGVycyB0YWtlIGEgc3RyaW5nIGFzIGlucHV0LiBUaGUgZm9sbG93aW5nIGlzIGEgdGFibGUgb2YgYWxsCitvbi9vZmYgb3B0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoaXMgcmVwb3NpdG9yeToKKworfCBPcHRpb24gfCBQbGF0Zm9ybSB8IERlZmF1bHQgfCBEZXNjcmlwdGlvbiB8Cit8IC0tLS0tLSB8IC0tLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwKK3wgQlVJTERfQ1VCRSB8IEFsbCB8IGBPTmAgfCBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgdmtjdWJlIGRlbW8gaXMgYnVpbHQuIHwKK3wgQlVJTERfVlVMS0FOSU5GTyB8IEFsbCB8IGBPTmAgfCBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgdnVsa2FuaW5mbyB1dGlsaXR5IGlzIGJ1aWx0LiB8Cit8IEJVSUxEX0lDRCB8IEFsbCB8IGBPTmAgfCBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgbW9jayBJQ0QgaXMgYnVpbHQuIHwKK3wgSU5TVEFMTF9JQ0QgfCBBbGwgfCBgT0ZGYCB8IENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBtb2NrIElDRCBpcyBpbnN0YWxsZWQgYXMgcGFydCBvZiB0aGUgaW5zdGFsbCB0YXJnZXQuIHwKK3wgQlVJTERfV1NJX1hDQl9TVVBQT1JUIHwgTGludXggfCBgT05gIHwgQnVpbGQgdGhlIGNvbXBvbmVudHMgd2l0aCBYQ0Igc3VwcG9ydC4gfAorfCBCVUlMRF9XU0lfWExJQl9TVVBQT1JUIHwgTGludXggfCBgT05gIHwgQnVpbGQgdGhlIGNvbXBvbmVudHMgd2l0aCBYbGliIHN1cHBvcnQuIHwKK3wgQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCB8IExpbnV4IHwgYE9OYCB8IEJ1aWxkIHRoZSBjb21wb25lbnRzIHdpdGggV2F5bGFuZCBzdXBwb3J0LiB8Cit8IFVTRV9DQ0FDSEUgfCBMaW51eCB8IGBPRkZgIHwgRW5hYmxlIGNhY2hpbmcgd2l0aCB0aGUgQ0NhY2hlIHByb2dyYW0uIHwKKworVGhlIGZvbGxvd2luZyBpcyBhIHRhYmxlIG9mIGFsbCBzdHJpbmcgb3B0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoaXMgcmVwb3NpdG9yeToKKworfCBPcHRpb24gfCBQbGF0Zm9ybSB8IERlZmF1bHQgfCBEZXNjcmlwdGlvbiB8Cit8IC0tLS0tLSB8IC0tLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwKK3wgQ01BS0VfT1NYX0RFUExPWU1FTlRfVEFSR0VUIHwgTWFjT1MgfCBgMTAuMTJgIHwgVGhlIG1pbmltdW0gdmVyc2lvbiBvZiBNYWNPUyBmb3IgbG9hZGVyIGRlcGxveW1lbnQuIHwKKworVGhlc2UgdmFyaWFibGVzIHNob3VsZCBiZSBzZXQgdXNpbmcgdGhlIGAtRGAgb3B0aW9uIHdoZW4gaW52b2tpbmcgQ01ha2UgdG8KK2dlbmVyYXRlIHRoZSBuYXRpdmUgcGxhdGZvcm0gZmlsZXMuCisKKyMjIEJ1aWxkaW5nIE9uIFdpbmRvd3MKKworIyMjIFdpbmRvd3MgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgUmVxdWlyZW1lbnRzCisKKy0gV2luZG93cworICAtIEFueSBQZXJzb25hbCBDb21wdXRlciB2ZXJzaW9uIHN1cHBvcnRlZCBieSBNaWNyb3NvZnQKKy0gTWljcm9zb2Z0IFtWaXN1YWwgU3R1ZGlvXShodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tLykKKyAgLSBWZXJzaW9ucworICAgIC0gWzIwMTMgKHVwZGF0ZSA0KV0oaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy9vbGRlci1kb3dubG9hZHMvKQorICAgIC0gWzIwMTVdKGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvb2xkZXItZG93bmxvYWRzLykKKyAgICAtIFsyMDE3XShodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL2Rvd25sb2Fkcy8pCisgIC0gVGhlIENvbW11bml0eSBFZGl0aW9uIG9mIGVhY2ggb2YgdGhlIGFib3ZlIHZlcnNpb25zIGlzIHN1ZmZpY2llbnQsIGFzCisgICAgd2VsbCBhcyBhbnkgbW9yZSBjYXBhYmxlIGVkaXRpb24uCistIFtDTWFrZSAzLjEwLjJdKGh0dHBzOi8vY21ha2Uub3JnL2ZpbGVzL3YzLjEwL2NtYWtlLTMuMTAuMi13aW42NC14NjQuemlwKSBpcyByZWNvbW1lbmRlZC4KKyAgLSBVc2UgdGhlIGluc3RhbGxlciBvcHRpb24gdG8gYWRkIENNYWtlIHRvIHRoZSBzeXN0ZW0gUEFUSAorLSBHaXQgQ2xpZW50IFN1cHBvcnQKKyAgLSBbR2l0IGZvciBXaW5kb3dzXShodHRwOi8vZ2l0LXNjbS5jb20vZG93bmxvYWQvd2luKSBpcyBhIHBvcHVsYXIgc29sdXRpb24KKyAgICBmb3IgV2luZG93cworICAtIFNvbWUgSURFcyAoZS5nLiwgW1Zpc3VhbCBTdHVkaW9dKGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vKSwKKyAgICBbR2l0SHViIERlc2t0b3BdKGh0dHBzOi8vZGVza3RvcC5naXRodWIuY29tLykpIGhhdmUgaW50ZWdyYXRlZAorICAgIEdpdCBjbGllbnQgc3VwcG9ydAorCisjIyMgV2luZG93cyBCdWlsZCAtIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvCisKK1RoZSBnZW5lcmFsIGFwcHJvYWNoIGlzIHRvIHJ1biBDTWFrZSB0byBnZW5lcmF0ZSB0aGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0CitmaWxlcy4gVGhlbiBlaXRoZXIgcnVuIENNYWtlIHdpdGggdGhlIGAtLWJ1aWxkYCBvcHRpb24gdG8gYnVpbGQgZnJvbSB0aGUKK2NvbW1hbmQgbGluZSBvciB1c2UgdGhlIFZpc3VhbCBTdHVkaW8gSURFIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBzb2x1dGlvbiBhbmQKK3dvcmsgd2l0aCB0aGUgc29sdXRpb24gaW50ZXJhY3RpdmVseS4KKworIyMjIyBXaW5kb3dzIFF1aWNrIFN0YXJ0CisKKyAgICBjZCBWdWxrYW4tVG9vbHMKKyAgICBta2RpciBidWlsZAorICAgIGNkIGJ1aWxkCisgICAgY21ha2UgLUEgeDY0IC1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpcgorICAgIGNtYWtlIC0tYnVpbGQgLgorCitUaGUgYWJvdmUgY29tbWFuZHMgaW5zdHJ1Y3QgQ01ha2UgdG8gZmluZCBhbmQgdXNlIHRoZSBkZWZhdWx0IFZpc3VhbCBTdHVkaW8KK2luc3RhbGxhdGlvbiB0byBnZW5lcmF0ZSBhIFZpc3VhbCBTdHVkaW8gc29sdXRpb24gYW5kIHByb2plY3RzIGZvciB0aGUgeDY0CithcmNoaXRlY3R1cmUuIFRoZSBzZWNvbmQgQ01ha2UgY29tbWFuZCBidWlsZHMgdGhlIERlYnVnIChkZWZhdWx0KQorY29uZmlndXJhdGlvbiBvZiB0aGUgc29sdXRpb24uCisKK1NlZSBiZWxvdyBmb3IgdGhlIGRldGFpbHMuCisKKyMjIyMgVXNlIGBDTWFrZWAgdG8gQ3JlYXRlIHRoZSBWaXN1YWwgU3R1ZGlvIFByb2plY3QgRmlsZXMKKworQ2hhbmdlIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIHRvcCBvZiB0aGUgY2xvbmVkIHJlcG9zaXRvcnkgZGlyZWN0b3J5LAorY3JlYXRlIGEgYnVpbGQgZGlyZWN0b3J5IGFuZCBnZW5lcmF0ZSB0aGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGVzOgorCisgICAgY2QgVnVsa2FuLVRvb2xzCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorICAgIGNtYWtlIC1BIHg2NCAtRFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIKKworPiBOb3RlOiBUaGUgYC4uYCBwYXJhbWV0ZXIgdGVsbHMgYGNtYWtlYCB0aGUgbG9jYXRpb24gb2YgdGhlIHRvcCBvZiB0aGUKKz4gcmVwb3NpdG9yeS4gSWYgeW91IHBsYWNlIHlvdXIgYnVpbGQgZGlyZWN0b3J5IHNvbWVwbGFjZSBlbHNlLCB5b3UnbGwgbmVlZCB0bworPiBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0b3AgZGlmZmVyZW50bHkuCisKK1RoZSBgLUFgIG9wdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBlaXRoZXIgdGhlICJXaW4zMiIgb3IgIng2NCIgYXJjaGl0ZWN0dXJlLgorCitJZiBhIGdlbmVyYXRvciBmb3IgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIFZpc3VhbCBTdHVkaW8gaXMgcmVxdWlyZWQsIHlvdSBjYW4KK3NwZWNpZnkgaXQgZm9yIFZpc3VhbCBTdHVkaW8gMjAxNSwgZm9yIGV4YW1wbGUsIHdpdGg6CisKKyAgICA2NC1iaXQ6IC1HICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisgICAgMzItYml0OiAtRyAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IgorCitTZWUgdGhpcyBbbGlzdF0oI2NtYWtlLXZpc3VhbC1zdHVkaW8tZ2VuZXJhdG9ycykgb2Ygb3RoZXIgcG9zc2libGUgZ2VuZXJhdG9ycworZm9yIFZpc3VhbCBTdHVkaW8uCisKK1doZW4gZ2VuZXJhdGluZyB0aGUgcHJvamVjdCBmaWxlcywgdGhlIGFic29sdXRlIHBhdGggdG8gYSBWdWxrYW4tSGVhZGVycworaW5zdGFsbCBkaXJlY3RvcnkgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIHRoZQorYFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIHRoZQorYFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSYCBDTWFrZSB2YXJpYWJsZSB3aXRoIHRoZSBgLURgIENNYWtlIG9wdGlvbi4gSW4KK2VpdGhlciBjYXNlLCB0aGUgdmFyaWFibGUgc2hvdWxkIHBvaW50IHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEKK1Z1bGthbi1IZWFkZXJzIHJlcG9zaXRvcnkgYnVpbHQgd2l0aCB0aGUgaW5zdGFsbCB0YXJnZXQuCisKK1RoZSBhYm92ZSBzdGVwcyBjcmVhdGUgYSBXaW5kb3dzIHNvbHV0aW9uIGZpbGUgbmFtZWQKK2BWdWxrYW4tVG9vbHMuc2xuYCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorCitBdCB0aGlzIHBvaW50LCB5b3UgY2FuIGJ1aWxkIHRoZSBzb2x1dGlvbiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3Igb3BlbiB0aGUKK2dlbmVyYXRlZCBzb2x1dGlvbiB3aXRoIFZpc3VhbCBTdHVkaW8uCisKKyMjIyMgQnVpbGQgdGhlIFNvbHV0aW9uIEZyb20gdGhlIENvbW1hbmQgTGluZQorCitXaGlsZSBzdGlsbCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5OgorCisgICAgY21ha2UgLS1idWlsZCAuCisKK3RvIGJ1aWxkIHRoZSBEZWJ1ZyBjb25maWd1cmF0aW9uICh0aGUgZGVmYXVsdCksIG9yOgorCisgICAgY21ha2UgLS1idWlsZCAuIC0tY29uZmlnIFJlbGVhc2UKKwordG8gbWFrZSBhIFJlbGVhc2UgYnVpbGQuCisKKyMjIyMgQnVpbGQgdGhlIFNvbHV0aW9uIFdpdGggVmlzdWFsIFN0dWRpbworCitMYXVuY2ggVmlzdWFsIFN0dWRpbyBhbmQgb3BlbiB0aGUgIlZ1bGthbi1Ub29scy5zbG4iIHNvbHV0aW9uIGZpbGUgaW4gdGhlCitidWlsZCBmb2xkZXIuIFlvdSBtYXkgc2VsZWN0ICJEZWJ1ZyIgb3IgIlJlbGVhc2UiIGZyb20gdGhlIFNvbHV0aW9uCitDb25maWd1cmF0aW9ucyBkcm9wLWRvd24gbGlzdC4gU3RhcnQgYSBidWlsZCBieSBzZWxlY3RpbmcgdGhlIEJ1aWxkLT5CdWlsZAorU29sdXRpb24gbWVudSBpdGVtLgorCisjIyMjIFdpbmRvd3MgSW5zdGFsbCBUYXJnZXQKKworVGhlIENNYWtlIHByb2plY3QgYWxzbyBnZW5lcmF0ZXMgYW4gImluc3RhbGwiIHRhcmdldCB0aGF0IHlvdSBjYW4gdXNlIHRvIGNvcHkKK3RoZSBwcmltYXJ5IGJ1aWxkIGFydGlmYWN0cyB0byBhIHNwZWNpZmljIGxvY2F0aW9uIHVzaW5nIGEgImJpbiwgaW5jbHVkZSwgbGliIgorc3R5bGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBjb2xsZWN0aW5nIHRoZSBhcnRpZmFjdHMgYW5kCitwcm92aWRpbmcgdGhlbSB0byBhbm90aGVyIHByb2plY3QgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlbS4KKworVGhlIGRlZmF1bHQgbG9jYXRpb24gaXMgYCRDTUFLRV9CSU5BUllfRElSXGluc3RhbGxgLCBidXQgY2FuIGJlIGNoYW5nZWQgd2l0aAordGhlIGBDTUFLRV9JTlNUQUxMX1BSRUZJWGAgdmFyaWFibGUgd2hlbiBmaXJzdCBnZW5lcmF0aW5nIHRoZSBwcm9qZWN0IGJ1aWxkCitmaWxlcyB3aXRoIENNYWtlLgorCitZb3UgY2FuIGJ1aWxkIHRoZSBpbnN0YWxsIHRhcmdldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aDoKKworICAgIGNtYWtlIC0tYnVpbGQgLiAtLWNvbmZpZyBSZWxlYXNlIC0tdGFyZ2V0IGluc3RhbGwKKworb3IgYnVpbGQgdGhlIGBJTlNUQUxMYCB0YXJnZXQgZnJvbSB0aGUgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBleHBsb3Jlci4KKworIyMjIyBVc2luZyBhIExvYWRlciBCdWlsdCBmcm9tIGEgUmVwb3NpdG9yeQorCitJZiB5b3UgZG8gbmVlZCB0byBidWlsZCBhbmQgdXNlIHlvdXIgb3duIGxvYWRlciwgYnVpbGQgdGhlIFZ1bGthbi1Mb2FkZXIKK3JlcG9zaXRvcnkgd2l0aCB0aGUgaW5zdGFsbCB0YXJnZXQgYW5kIG1vZGlmeSB5b3VyIENNYWtlIGludm9jYXRpb24gdG8gYWRkIHRoZQorbG9jYXRpb24gb2YgdGhlIGxvYWRlcidzIGluc3RhbGwgZGlyZWN0b3J5OgorCisgICAgY21ha2UgLUEgeDY0IC1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpciBcCisgICAgICAgICAgICAgICAgIC1EVlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIC4uCisKKyMjIyMgVXNpbmcgZ2xzbGFuZyBCdWlsdCBmcm9tIGEgUmVwb3NpdG9yeQorCitJZiB5b3UgZG8gbmVlZCB0byBidWlsZCBhbmQgdXNlIHlvdXIgb3duIGdsc2xhbmcsIGJ1aWxkIHRoZSBnbHNsYW5nIHJlcG9zaXRvcnkKK3dpdGggdGhlIGluc3RhbGwgdGFyZ2V0IGFuZCBtb2RpZnkgeW91ciBDTWFrZSBpbnZvY2F0aW9uIHRvIGFkZCB0aGUgbG9jYXRpb24KK29mIHRoZSBnbHNsYW5nJ3MgaW5zdGFsbCBkaXJlY3Rvcnk6CisKKyAgICBjbWFrZSAtQSB4NjQgLURWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIFwKKyAgICAgICAgICAgICAgICAgLURHTFNMQU5HX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIgLi4KKworIyMjIFdpbmRvd3MgTm90ZXMKKworIyMjIyBDTWFrZSBWaXN1YWwgU3R1ZGlvIEdlbmVyYXRvcnMKKworVGhlIGNob3NlbiBnZW5lcmF0b3Igc2hvdWxkIG1hdGNoIG9uZSBvZiB0aGUgVmlzdWFsIFN0dWRpbyB2ZXJzaW9ucyB0aGF0IHlvdQoraGF2ZSBpbnN0YWxsZWQuIEdlbmVyYXRvciBzdHJpbmdzIHRoYXQgY29ycmVzcG9uZCB0byB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvCitpbmNsdWRlOgorCit8IEJ1aWxkIFBsYXRmb3JtICAgICAgICAgICAgICAgfCA2NC1iaXQgR2VuZXJhdG9yICAgICAgICAgICAgICB8IDMyLWJpdCBHZW5lcmF0b3IgICAgICAgIHwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDEzIHwgIlZpc3VhbCBTdHVkaW8gMTIgMjAxMyBXaW42NCIgfCAiVmlzdWFsIFN0dWRpbyAxMiAyMDEzIiB8Cit8IE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTUgfCAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFdpbjY0IiB8ICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUiIHwKK3wgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxNyB8ICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgV2luNjQiIHwgIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyIgfAorCisjIyBCdWlsZGluZyBPbiBMaW51eAorCisjIyMgTGludXggQnVpbGQgUmVxdWlyZW1lbnRzCisKK1RoaXMgcmVwb3NpdG9yeSBoYXMgYmVlbiBidWlsdCBhbmQgdGVzdGVkIG9uIHRoZSB0d28gbW9zdCByZWNlbnQgVWJ1bnR1IExUUwordmVyc2lvbnMuIEN1cnJlbnRseSwgdGhlIG9sZGVzdCBzdXBwb3J0ZWQgdmVyc2lvbiBpcyBVYnVudHUgMTYuMDQsIG1lYW5pbmcKK3RoYXQgdGhlIG1pbmltdW0gb2ZmaWNpYWxseSBzdXBwb3J0ZWQgQysrMTEgY29tcGlsZXIgdmVyc2lvbiBpcyBHQ0MgNS40LjAsCithbHRob3VnaCBlYXJsaWVyIHZlcnNpb25zIG1heSB3b3JrLiBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIHRvIGFkYXB0IHRoaXMKK3JlcG9zaXRvcnkgdG8gb3RoZXIgTGludXggZGlzdHJpYnV0aW9ucy4KKworW0NNYWtlIDMuMTAuMl0oaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLUxpbnV4LXg4Nl82NC50YXIuZ3opIGlzIHJlY29tbWVuZGVkLgorCisjIyMjIFJlcXVpcmVkIFBhY2thZ2UgTGlzdAorCisgICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgZ2l0IGNtYWtlIGJ1aWxkLWVzc2VudGlhbCBsaWJ4MTEteGNiLWRldiBcCisgICAgICAgIGxpYnhrYmNvbW1vbi1kZXYgbGlid2F5bGFuZC1kZXYgbGlieHJhbmRyLWRldgorCisjIyMgTGludXggQnVpbGQKKworVGhlIGdlbmVyYWwgYXBwcm9hY2ggaXMgdG8gcnVuIENNYWtlIHRvIGdlbmVyYXRlIG1ha2UgZmlsZXMuIFRoZW4gZWl0aGVyIHJ1bgorQ01ha2Ugd2l0aCB0aGUgYC0tYnVpbGRgIG9wdGlvbiBvciBgbWFrZWAgdG8gYnVpbGQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCisjIyMjIExpbnV4IFF1aWNrIFN0YXJ0CisKKyAgICBjZCBWdWxrYW4tVG9vbHMKKyAgICBta2RpciBidWlsZAorICAgIGNkIGJ1aWxkCisgICAgY21ha2UgLURWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIC4uCisgICAgbWFrZQorCitTZWUgYmVsb3cgZm9yIHRoZSBkZXRhaWxzLgorCisjIyMjIFVzZSBDTWFrZSB0byBDcmVhdGUgdGhlIE1ha2UgRmlsZXMKKworQ2hhbmdlIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIHRvcCBvZiB0aGUgY2xvbmVkIHJlcG9zaXRvcnkgZGlyZWN0b3J5LAorY3JlYXRlIGEgYnVpbGQgZGlyZWN0b3J5IGFuZCBnZW5lcmF0ZSB0aGUgbWFrZSBmaWxlcy4KKworICAgIGNkIFZ1bGthbi1Ub29scworICAgIG1rZGlyIGJ1aWxkCisgICAgY2QgYnVpbGQKKyAgICBjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgXAorICAgICAgICAgIC1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpciBcCisgICAgICAgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD1pbnN0YWxsIC4uCisKKz4gTm90ZTogVGhlIGAuLmAgcGFyYW1ldGVyIHRlbGxzIGBjbWFrZWAgdGhlIGxvY2F0aW9uIG9mIHRoZSB0b3Agb2YgdGhlCis+IHJlcG9zaXRvcnkuIElmIHlvdSBwbGFjZSB5b3VyIGBidWlsZGAgZGlyZWN0b3J5IHNvbWVwbGFjZSBlbHNlLCB5b3UnbGwgbmVlZAorPiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0b3AgZGlmZmVyZW50bHkuCisKK1VzZSBgLURDTUFLRV9CVUlMRF9UWVBFYCB0byBzcGVjaWZ5IGEgRGVidWcgb3IgUmVsZWFzZSBidWlsZC4KKworV2hlbiBnZW5lcmF0aW5nIHRoZSBwcm9qZWN0IGZpbGVzLCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIFZ1bGthbi1IZWFkZXJzCitpbnN0YWxsIGRpcmVjdG9yeSBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgdGhlCitgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJgIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgdGhlCitgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJgIENNYWtlIHZhcmlhYmxlIHdpdGggdGhlIGAtRGAgQ01ha2Ugb3B0aW9uLiBJbgorZWl0aGVyIGNhc2UsIHRoZSB2YXJpYWJsZSBzaG91bGQgcG9pbnQgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYQorVnVsa2FuLUhlYWRlcnMgcmVwb3NpdG9yeSBidWlsdCB3aXRoIHRoZSBpbnN0YWxsIHRhcmdldC4KKworPiBOb3RlOiBGb3IgTGludXgsIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBgQ01BS0VfSU5TVEFMTF9QUkVGSVhgIGlzCis+IGAvdXNyL2xvY2FsYCwgd2hpY2ggd291bGQgYmUgdXNlZCBpZiB5b3UgZG8gbm90IHNwZWNpZnkKKz4gYENNQUtFX0lOU1RBTExfUFJFRklYYC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG5lZWQgdG8gdXNlIGBzdWRvYCB0byBpbnN0YWxsCis+IHRvIHN5c3RlbSBkaXJlY3RvcmllcyBsYXRlciB3aGVuIHlvdSBydW4gYG1ha2UgaW5zdGFsbGAuCisKKyMjIyMgQnVpbGQgdGhlIFByb2plY3QKKworWW91IGNhbiBqdXN0IHJ1biBgbWFrZWAgdG8gYmVnaW4gdGhlIGJ1aWxkLgorCitUbyBzcGVlZCB1cCB0aGUgYnVpbGQgb24gYSBtdWx0aS1jb3JlIG1hY2hpbmUsIHVzZSB0aGUgYC1qYCBvcHRpb24gZm9yIGBtYWtlYAordG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvcmVzIHRvIHVzZSBmb3IgdGhlIGJ1aWxkLiBGb3IgZXhhbXBsZToKKworICAgIG1ha2UgLWo0CisKK1lvdSBjYW4gYWxzbyB1c2UKKworICAgIGNtYWtlIC0tYnVpbGQgLgorCitJZiB5b3VyIGJ1aWxkIHN5c3RlbSBzdXBwb3J0cyBjY2FjaGUsIHlvdSBjYW4gZW5hYmxlIHRoYXQgdmlhIENNYWtlIG9wdGlvbiBgLURVU0VfQ0NBQ0hFPU9uYAorCisjIyMgTGludXggTm90ZXMKKworIyMjIyBXU0kgU3VwcG9ydCBCdWlsZCBPcHRpb25zCisKK0J5IGRlZmF1bHQsIHRoZSByZXBvc2l0b3J5IGNvbXBvbmVudHMgYXJlIGJ1aWx0IHdpdGggc3VwcG9ydCBmb3IgdGhlCitWdWxrYW4tZGVmaW5lZCBXU0kgZGlzcGxheSBzZXJ2ZXJzOiBYY2IsIFhsaWIsIGFuZCBXYXlsYW5kLiBJdCBpcyByZWNvbW1lbmRlZAordG8gYnVpbGQgdGhlIHJlcG9zaXRvcnkgY29tcG9uZW50cyB3aXRoIHN1cHBvcnQgZm9yIHRoZXNlIGRpc3BsYXkgc2VydmVycyB0bworbWF4aW1pemUgdGhlaXIgdXNhYmlsaXR5IGFjcm9zcyBMaW51eCBwbGF0Zm9ybXMuIElmIGl0IGlzIG5lY2Vzc2FyeSB0byBidWlsZAordGhlc2UgbW9kdWxlcyB3aXRob3V0IHN1cHBvcnQgZm9yIG9uZSBvZiB0aGUgZGlzcGxheSBzZXJ2ZXJzLCB0aGUgYXBwcm9wcmlhdGUKK0NNYWtlIG9wdGlvbiBvZiB0aGUgZm9ybSBgQlVJTERfV1NJX3h4eF9TVVBQT1JUYCBjYW4gYmUgc2V0IHRvIGBPRkZgLgorCitOb3RlIHZ1bGthbmluZm8gY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgWGNiIGFuZCBYbGliIFdTSSBkaXNwbGF5IHNlcnZlcnMuIFNlZQordGhlIENNYWtlTGlzdHMudHh0IGZpbGUgaW4gYFZ1bGthbi1Ub29scy92dWxrYW5pbmZvYCBmb3IgbW9yZSBpbmZvLgorCitZb3UgY2FuIHNlbGVjdCB3aGljaCBXU0kgc3Vic3lzdGVtIGlzIHVzZWQgdG8gZXhlY3V0ZSB0aGUgdmtjdWJlIGFwcGxpY2F0aW9ucwordXNpbmcgYSBDTWFrZSBvcHRpb24gY2FsbGVkIERFTU9TX1dTSV9TRUxFQ1RJT04uIFN1cHBvcnRlZCBvcHRpb25zIGFyZSBYQ0IKKyhkZWZhdWx0KSwgWExJQiwgYW5kIFdBWUxBTkQuIE5vdGUgdGhhdCB5b3UgbXVzdCBidWlsZCB1c2luZyB0aGUgY29ycmVzcG9uZGluZworQlVJTERfV1NJXypfU1VQUE9SVCBlbmFibGVkIGF0IHRoZSBiYXNlIHJlcG9zaXRvcnkgbGV2ZWwuIEZvciBpbnN0YW5jZSwKK2NyZWF0aW5nIGEgYnVpbGQgdGhhdCB3aWxsIHVzZSBYbGliIHdoZW4gcnVubmluZyB0aGUgdmtjdWJlIGRlbW9zLCB5b3VyIENNYWtlCitjb21tYW5kIGxpbmUgbWlnaHQgbG9vayBsaWtlOgorCisgICAgY21ha2UgLURDTUFLRV9CVUlMRF9UWVBFPURlYnVnIC1EREVNT1NfV1NJX1NFTEVDVElPTj1YTElCIC4uCisKKyMjIyMgTGludXggSW5zdGFsbCB0byBTeXN0ZW0gRGlyZWN0b3JpZXMKKworSW5zdGFsbGluZyB0aGUgZmlsZXMgcmVzdWx0aW5nIGZyb20geW91ciBidWlsZCB0byB0aGUgc3lzdGVtcyBkaXJlY3RvcmllcyBpcworb3B0aW9uYWwgc2luY2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiB1c3VhbGx5IGJlIHVzZWQgaW5zdGVhZCB0byBsb2NhdGUgdGhlCitiaW5hcmllcy4gVGhlcmUgYXJlIGFsc28gcmlza3Mgd2l0aCBpbnRlcmZlcmluZyB3aXRoIGJpbmFyaWVzIGluc3RhbGxlZCBieQorcGFja2FnZXMuIElmIHlvdSBhcmUgY2VydGFpbiB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGluc3RhbGwgeW91ciBiaW5hcmllcyB0bworc3lzdGVtIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHByb2NlZWQgd2l0aCB0aGVzZSBpbnN0cnVjdGlvbnMuCisKK0Fzc3VtaW5nIHRoYXQgeW91J3ZlIGJ1aWx0IHRoZSBjb2RlIGFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgdGhlIGN1cnJlbnQKK2RpcmVjdG9yeSBpcyBzdGlsbCBgYnVpbGRgLCB5b3UgY2FuIGV4ZWN1dGU6CisKKyAgICBzdWRvIG1ha2UgaW5zdGFsbAorCitUaGlzIGNvbW1hbmQgaW5zdGFsbHMgZmlsZXMgdG8gYC91c3IvbG9jYWxgIGlmIG5vIGBDTUFLRV9JTlNUQUxMX1BSRUZJWGAgaXMKK3NwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBidWlsZCBmaWxlcyB3aXRoIENNYWtlLgorCitZb3UgbWF5IG5lZWQgdG8gcnVuIGBsZGNvbmZpZ2AgaW4gb3JkZXIgdG8gcmVmcmVzaCB0aGUgc3lzdGVtIGxvYWRlciBzZWFyY2gKK2NhY2hlIG9uIHNvbWUgTGludXggc3lzdGVtcy4KKworWW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZSB0aGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIGJ5IHNldHRpbmcgYWRkaXRpb25hbAorQ01ha2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZWlyIGRlZmF1bHRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdvdWxkIGxpa2UgdG8KK2luc3RhbGwgdG8gYC90bXAvYnVpbGRgIGluc3RlYWQgb2YgYC91c3IvbG9jYWxgLCBvbiB5b3VyIENNYWtlIGNvbW1hbmQgbGluZQorc3BlY2lmeToKKworICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9L3RtcC9idWlsZAorCitUaGVuIHJ1biBgbWFrZSBpbnN0YWxsYCBhcyBiZWZvcmUuIFRoZSBpbnN0YWxsIHN0ZXAgcGxhY2VzIHRoZSBmaWxlcyBpbgorYC90bXAvYnVpbGRgLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGNvbGxlY3RpbmcgdGhlIGFydGlmYWN0cyBhbmQgcHJvdmlkaW5nCit0aGVtIHRvIGFub3RoZXIgcHJvamVjdCB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGVtLgorCitOb3RlOiBUaGUgTW9jayBJQ0QgaXMgbm90IGluc3RhbGxlZCBieSBkZWZhdWx0IHNpbmNlIGl0IGlzIGEgIm51bGwiIGRyaXZlcgordGhhdCBkb2VzIG5vdCByZW5kZXIgYW55dGhpbmcgYW5kIGlzIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuIEluc3RhbGxpbmcgaXQKK3RvIHN5c3RlbSBkaXJlY3RvcmllcyBtYXkgY2F1c2Ugc29tZSBhcHBsaWNhdGlvbnMgdG8gZGlzY292ZXIgYW5kIHVzZSB0aGlzCitkcml2ZXIgaW5zdGVhZCBvZiBvdGhlciBmdWxsIGRyaXZlcnMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uIElmIHlvdSByZWFsbHkKK3dhbnQgdG8gaW5zdGFsbCB0aGlzIG51bGwgZHJpdmVyLCB1c2U6CisKKyAgICAtRElOU1RBTExfSUNEPU9OCisKK1NlZSB0aGUgQ01ha2UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIHRoZXNlIHZhcmlhYmxlcyB0bworZnVydGhlciBjdXN0b21pemUgeW91ciBpbnN0YWxsYXRpb24uCisKK0Fsc28gc2VlIHRoZSBgTG9hZGVyQW5kTGF5ZXJJbnRlcmZhY2VgIGRvY3VtZW50IGluIHRoZSBgbG9hZGVyYCBmb2xkZXIgb2YgdGhlCitWdWxrYW4tTG9hZGVyIHJlcG9zaXRvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbG9hZGVyIGFuZCBsYXllcgorb3BlcmF0aW9uLgorCisjIyMjIExpbnV4IFVuaW5zdGFsbAorCitUbyB1bmluc3RhbGwgdGhlIGZpbGVzIGZyb20gdGhlIHN5c3RlbSBkaXJlY3RvcmllcywgeW91IGNhbiBleGVjdXRlOgorCisgICAgc3VkbyBtYWtlIHVuaW5zdGFsbAorCisjIyMgTGludXggVGVzdHMKKworQWZ0ZXIgbWFraW5nIGFueSBjaGFuZ2VzIHRvIHRoZSByZXBvc2l0b3J5LCB5b3Ugc2hvdWxkIHBlcmZvcm0gc29tZSBxdWljaworc2FuaXR5IHRlc3RzLCBzdWNoIGFzIHJ1bm5pbmcgdGhlIHZrY3ViZSBkZW1vIHdpdGggdmFsaWRhdGlvbiBlbmFibGVkLgorCitUbyBydW4gdGhlICoqdmtjdWJlIGFwcGxpY2F0aW9uKiogd2l0aCB2YWxpZGF0aW9uLCBpbiBhIHRlcm1pbmFsIGNoYW5nZSB0byB0aGUKK2BidWlsZC9jdWJlYCBkaXJlY3RvcnkgYW5kIHJ1bjoKKworICAgIFZLX0xBWUVSX1BBVEg9Li4vcGF0aC90by92YWxpZGF0aW9uL2xheWVycyAuL3ZrY3ViZSAtLXZhbGlkYXRlCisKK0lmIHlvdSBoYXZlIGFuIFNESyBpbnN0YWxsZWQgYW5kIGhhdmUgcnVuIHRoZSBzZXR1cCBzY3JpcHQgdG8gc2V0IHRoZQorYFZVTEtBTl9TREtgIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdCBtYXkgYmUgdW5uZWNlc3NhcnkgdG8gc3BlY2lmeSBhCitgVktfTEFZRVJfUEFUSGAuCisKKyMjIyMgTGludXggMzItYml0IHN1cHBvcnQKKworVXNhZ2Ugb2YgdGhlIGNvbnRlbnRzIG9mIHRoaXMgcmVwb3NpdG9yeSBpbiAzMi1iaXQgTGludXggZW52aXJvbm1lbnRzIGlzIG5vdAorb2ZmaWNpYWxseSBzdXBwb3J0ZWQuIEhvd2V2ZXIsIHNpbmNlIHRoaXMgcmVwb3NpdG9yeSBpcyBzdXBwb3J0ZWQgb24gMzItYml0CitXaW5kb3dzLCB0aGVzZSBtb2R1bGVzIHNob3VsZCBnZW5lcmFsbHkgd29yayBvbiAzMi1iaXQgTGludXguCisKK0hlcmUgYXJlIHNvbWUgbm90ZXMgZm9yIGJ1aWxkaW5nIDMyLWJpdCB0YXJnZXRzIG9uIGEgNjQtYml0IFVidW50dSAicmVmZXJlbmNlIgorcGxhdGZvcm06CisKK0lmIG5vdCBhbHJlYWR5IGluc3RhbGxlZCwgaW5zdGFsbCB0aGUgZm9sbG93aW5nIDMyLWJpdCBkZXZlbG9wbWVudCBsaWJyYXJpZXM6CisKK2BnY2MtbXVsdGlsaWIgZysrLW11bHRpbGliIGxpYngxMS1kZXY6aTM4NmAKKworVGhpcyBsaXN0IG1heSB2YXJ5IGRlcGVuZGluZyBvbiB5b3VyIGRpc3RyaWJ1dGlvbiBhbmQgd2hpY2ggd2luZG93aW5nIHN5c3RlbXMKK3lvdSBhcmUgYnVpbGRpbmcgZm9yLgorCitTZXQgdXAgeW91ciBlbnZpcm9ubWVudCBmb3IgYnVpbGRpbmcgMzItYml0IHRhcmdldHM6CisKKyAgICBleHBvcnQgQVNGTEFHUz0tLTMyCisgICAgZXhwb3J0IENGTEFHUz0tbTMyCisgICAgZXhwb3J0IENYWEZMQUdTPS1tMzIKKyAgICBleHBvcnQgUEtHX0NPTkZJR19MSUJESVI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUKKworQWdhaW4sIHlvdXIgUEtHX0NPTkZJRyBjb25maWd1cmF0aW9uIG1heSBiZSBkaWZmZXJlbnQsIGRlcGVuZGluZyBvbiB5b3VyCitkaXN0cmlidXRpb24uCisKK0ZpbmFsbHksIHJlYnVpbGQgdGhlIHJlcG9zaXRvcnkgdXNpbmcgYGNtYWtlYCBhbmQgYG1ha2VgLCBhcyBleHBsYWluZWQgYWJvdmUuCisKKyMjIEJ1aWxkaW5nIE9uIEFuZHJvaWQKKworSW5zdGFsbCB0aGUgcmVxdWlyZWQgdG9vbHMgZm9yIExpbnV4IGFuZCBXaW5kb3dzIGNvdmVyZWQgYWJvdmUsIHRoZW4gYWRkIHRoZQorZm9sbG93aW5nLgorCisjIyMgQW5kcm9pZCBCdWlsZCBSZXF1aXJlbWVudHMKKworLSBJbnN0YWxsIFtBbmRyb2lkIFN0dWRpbyAyLjNdKGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9pbmRleC5odG1sKSBvciBsYXRlci4KKy0gRnJvbSB0aGUgIldlbGNvbWUgdG8gQW5kcm9pZCBTdHVkaW8iIHNwbGFzaCBzY3JlZW4sIGFkZCB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHMgdXNpbmcKKyAgQ29uZmlndXJlID4gU0RLIE1hbmFnZXI6CisgIC0gU0RLIFBsYXRmb3JtcyA+IEFuZHJvaWQgNi4wIGFuZCBuZXdlcgorICAtIFNESyBUb29scyA+IEFuZHJvaWQgU0RLIEJ1aWxkLVRvb2xzCisgIC0gU0RLIFRvb2xzID4gQW5kcm9pZCBTREsgUGxhdGZvcm0tVG9vbHMKKyAgLSBTREsgVG9vbHMgPiBBbmRyb2lkIFNESyBUb29scworICAtIFNESyBUb29scyA+IE5ESworCisjIyMjIEFkZCBBbmRyb2lkIHNwZWNpZmljcyB0byBlbnZpcm9ubWVudAorCitGb3IgZWFjaCBvZiB0aGUgYmVsb3csIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGJ1aWxkLXRvb2xzCit2ZXJzaW9uLCBhcyBBbmRyb2lkIFN0dWRpbyB3aWxsIHJvbGwgaXQgZm9yd2FyZCBmYWlybHkgcmVndWxhcmx5LgorCitPbiBMaW51eDoKKworICAgIGV4cG9ydCBBTkRST0lEX1NES19IT01FPSRIT01FL0FuZHJvaWQvc2RrCisgICAgZXhwb3J0IEFORFJPSURfTkRLX0hPTUU9JEhPTUUvQW5kcm9pZC9zZGsvbmRrLWJ1bmRsZQorICAgIGV4cG9ydCBQQVRIPSRBTkRST0lEX1NES19IT01FOiRQQVRICisgICAgZXhwb3J0IFBBVEg9JEFORFJPSURfTkRLX0hPTUU6JFBBVEgKKyAgICBleHBvcnQgUEFUSD0kQU5EUk9JRF9TREtfSE9NRS9idWlsZC10b29scy8yMy4wLjM6JFBBVEgKKworT24gV2luZG93czoKKworICAgIHNldCBBTkRST0lEX1NES19IT01FPSVMT0NBTEFQUERBVEElXEFuZHJvaWRcc2RrCisgICAgc2V0IEFORFJPSURfTkRLX0hPTUU9JUxPQ0FMQVBQREFUQSVcQW5kcm9pZFxzZGtcbmRrLWJ1bmRsZQorICAgIHNldCBQQVRIPSVMT0NBTEFQUERBVEElXEFuZHJvaWRcc2RrXG5kay1idW5kbGU7JVBBVEglCisKK09uIE9TWDoKKworICAgIGV4cG9ydCBBTkRST0lEX1NES19IT01FPSRIT01FL0xpYnJhcnkvQW5kcm9pZC9zZGsKKyAgICBleHBvcnQgQU5EUk9JRF9OREtfSE9NRT0kSE9NRS9MaWJyYXJ5L0FuZHJvaWQvc2RrL25kay1idW5kbGUKKyAgICBleHBvcnQgUEFUSD0kQU5EUk9JRF9OREtfUEFUSDokUEFUSAorICAgIGV4cG9ydCBQQVRIPSRBTkRST0lEX1NES19IT01FL2J1aWxkLXRvb2xzLzIzLjAuMzokUEFUSAorCitOb3RlOiBJZiBgamFyc2lnbmVyYCBpcyBtaXNzaW5nIGZyb20geW91ciBwbGF0Zm9ybSwgeW91IGNhbiBmaW5kIGl0IGluIHRoZQorQW5kcm9pZCBTdHVkaW8gaW5zdGFsbCBvciBpbiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiBJZiB5b3UgZG8gbm90IGhhdmUgSmF2YSwKK3lvdSBjYW4gZ2V0IGl0IHdpdGggc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBvcGVuamRrLTgtamRrCisKKyMjIyMgQWRkaXRpb25hbCBPU1ggU3lzdGVtIFJlcXVpcmVtZW50cworCitUZXN0ZWQgb24gT1NYIHZlcnNpb24gMTAuMTMuMworCitTZXR1cCBIb21lYnJldyBhbmQgY29tcG9uZW50cworCistIEZvbGxvdyBpbnN0cnVjdGlvbnMgb24gW2JyZXcuc2hdKGh0dHA6Ly9icmV3LnNoKSB0byBnZXQgSG9tZWJyZXcgaW5zdGFsbGVkLgorCisgICAgICAvdXNyL2Jpbi9ydWJ5IC1lICIkKGN1cmwgLWZzU0wgXAorICAgICAgICAgIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Ib21lYnJldy9pbnN0YWxsL21hc3Rlci9pbnN0YWxsKSIKKworLSBFbnN1cmUgSG9tZWJyZXcgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB5b3VyIFBBVEg6CisKKyAgICAgIGV4cG9ydCBQQVRIPS91c3IvbG9jYWwvYmluOiRQQVRICisKKy0gQWRkIHBhY2thZ2VzIHdpdGggdGhlIGZvbGxvd2luZzoKKworICAgICAgYnJldyBpbnN0YWxsIHB5dGhvbgorCisjIyMgQW5kcm9pZCBCdWlsZAorCitUaGVyZSBhcmUgdHdvIG9wdGlvbnMgZm9yIGJ1aWxkaW5nIHRoZSBBbmRyb2lkIHRvb2xzLiBFaXRoZXIgdXNpbmcgdGhlIFNQSVJWCit0b29scyBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSBBbmRyb2lkIE5ESywgb3IgdXNpbmcgdXBzdHJlYW0gc291cmNlcy4gVG8gYnVpbGQKK3dpdGggU1BJUlYgdG9vbHMgZnJvbSB0aGUgTkRLLCByZW1vdmUgdGhlIGJ1aWxkLWFuZHJvaWQvdGhpcmRfcGFydHkgZGlyZWN0b3J5CitjcmVhdGVkIGJ5IHJ1bm5pbmcgdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5zaCwgKG9yIGF2b2lkIHJ1bm5pbmcKK3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2gpLiBVc2UgdGhlIGZvbGxvd2luZyBzY3JpcHQgdG8gYnVpbGQKK2V2ZXJ5dGhpbmcgaW4gdGhlIHJlcG9zaXRvcnkgZm9yIEFuZHJvaWQsIGluY2x1ZGluZyB2YWxpZGF0aW9uIGxheWVycywgdGVzdHMsCitkZW1vcywgYW5kIEFQSyBwYWNrYWdpbmc6IFRoaXMgc2NyaXB0IGRvZXMgcmV0cmlldmUgYW5kIHVzZSB0aGUgdXBzdHJlYW0gU1BSSVYKK3Rvb2xzLgorCisgICAgY2QgYnVpbGQtYW5kcm9pZAorICAgIC4vYnVpbGRfYWxsLnNoCisKK1Rlc3QgYW5kIGFwcGxpY2F0aW9uIEFQS3MgY2FuIGJlIGluc3RhbGxlZCBvbiBwcm9kdWN0aW9uIGRldmljZXMgd2l0aDoKKworICAgIC4vaW5zdGFsbF9hbGwuc2ggWy1zIDxzZXJpYWwgbnVtYmVyPl0KKworTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBlcXVpdmFsZW50IHNjcmlwdHMgb24gV2luZG93cyB5ZXQsIHRoYXQgd29yayBuZWVkcyB0bworYmUgY29tcGxldGVkLiBUaGUgZm9sbG93aW5nIHBlciBwbGF0Zm9ybSBjb21tYW5kcyBjYW4gYmUgdXNlZCBmb3IgbGF5ZXIgb25seQorYnVpbGRzOgorCisjIyMjIExpbnV4IGFuZCBPU1gKKworRm9sbG93IHRoZSBzZXR1cCBzdGVwcyBmb3IgTGludXggb3IgT1NYIGFib3ZlLCB0aGVuIGZyb20geW91ciB0ZXJtaW5hbDoKKworICAgIGNkIGJ1aWxkLWFuZHJvaWQKKyAgICAuL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2ggLS1uby1idWlsZAorICAgIC4vYW5kcm9pZC1nZW5lcmF0ZS5zaAorICAgIG5kay1idWlsZCAtajQKKworIyMjIyBXaW5kb3dzCisKK0ZvbGxvdyB0aGUgc2V0dXAgc3RlcHMgZm9yIFdpbmRvd3MgYWJvdmUsIHRoZW4gZnJvbSBEZXZlbG9wZXIgQ29tbWFuZCBQcm9tcHQKK2ZvciBWUzIwMTM6CisKKyAgICBjZCBidWlsZC1hbmRyb2lkCisgICAgdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5iYXQKKyAgICBhbmRyb2lkLWdlbmVyYXRlLmJhdAorICAgIG5kay1idWlsZAorCisjIyMgQW5kcm9pZCBUZXN0cyBhbmQgRGVtb3MKKworQWZ0ZXIgbWFraW5nIGFueSBjaGFuZ2VzIHRvIHRoZSByZXBvc2l0b3J5IHlvdSBzaG91bGQgcGVyZm9ybSBzb21lIHF1aWNrCitzYW5pdHkgdGVzdHMsIGluY2x1ZGluZyB0aGUgbGF5ZXIgdmFsaWRhdGlvbiB0ZXN0cyBhbmQgdGhlIHZrY3ViZSAKK2RlbW8gd2l0aCB2YWxpZGF0aW9uIGVuYWJsZWQuCisKKyMjIyMgUnVuIExheWVyIFZhbGlkYXRpb24gVGVzdHMKKworVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQsIGluc3RhbGwsIGFuZCBydW4gdGhlIGxheWVyIHZhbGlkYXRpb24gdGVzdHMKK2ZvciBBbmRyb2lkOgorCisgICAgY2QgYnVpbGQtYW5kcm9pZAorICAgIC4vYnVpbGRfYWxsLnNoCisgICAgYWRiIGluc3RhbGwgLXIgYmluL1Z1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzLmFwaworICAgIGFkYiBzaGVsbCBhbSBzdGFydCBjb20uZXhhbXBsZS5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy9hbmRyb2lkLmFwcC5OYXRpdmVBY3Rpdml0eQorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgdGVzdF9BUEsgc2NyaXB0IHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgbGF5ZXIKK3ZhbGlkYXRpb24gdGVzdHM6CisKKyAgICB0ZXN0X0FQSy5zaCAtcyA8c2VyaWFsIG51bWJlcj4gLXAgPHBsYXRmb3JtIG5hbWU+IC1mIDxndGVzdF9maWx0ZXI+CisKKyMjIyMgUnVuIHZrY3ViZSB3aXRoIFZhbGlkYXRpb24KKworVE9ETzogVGhpcyBtdXN0IGJlIHJld29ya2VkIHRvIHB1bGwgaW4gbGF5ZXJzIGZyb20gdGhlIFZhbGlkYXRpb25MYXllcnMgcmVwbworCitVc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCwgaW5zdGFsbCwgYW5kIHJ1biB2a2N1YmUgZm9yIEFuZHJvaWQ6CisKKyAgICBjZCBidWlsZC1hbmRyb2lkCisgICAgLi9idWlsZF9hbGwuc2gKKyAgICBhZGIgaW5zdGFsbCAtciAuLi9kZW1vcy9hbmRyb2lkL2N1YmUvYmluL3ZrY3ViZS5hcGsKKyAgICBhZGIgc2hlbGwgYW0gc3RhcnQgY29tLmV4YW1wbGUuQ3ViZS9hbmRyb2lkLmFwcC5OYXRpdmVBY3Rpdml0eQorCitUbyBidWlsZCwgaW5zdGFsbCwgYW5kIHJ1biBDdWJlIHdpdGggdmFsaWRhdGlvbiBsYXllcnMsCitmaXJzdCBidWlsZCBsYXllcnMgdXNpbmcgc3RlcHMgYWJvdmUsIHRoZW4gcnVuOgorCisgICAgY2QgYnVpbGQtYW5kcm9pZAorICAgIC4vYnVpbGRfYWxsLnNoCisgICAgYWRiIGluc3RhbGwgLXIgLi4vZGVtb3MvYW5kcm9pZC9jdWJlLXdpdGgtbGF5ZXJzL2Jpbi9jdWJlLXdpdGgtbGF5ZXJzLmFwaworCisjIyMjIyBSdW4gd2l0aG91dCB2YWxpZGF0aW9uIGVuYWJsZWQKKworICAgIGFkYiBzaGVsbCBhbSBzdGFydCBjb20uZXhhbXBsZS5DdWJlV2l0aExheWVycy9hbmRyb2lkLmFwcC5OYXRpdmVBY3Rpdml0eQorCisjIyMjIyBSdW4gd2l0aCB2YWxpZGF0aW9uIGVuYWJsZWQKKworICAgIGFkYiBzaGVsbCBhbSBzdGFydCAtYSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiAtYyBhbmRyb2lkLWludGVudC5jYXRlZ29yeS5MQVVOQ0ggLW4gY29tLmV4YW1wbGUuQ3ViZVdpdGhMYXllcnMvYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkgLS1lcyBhcmdzICItLXZhbGlkYXRlIgorCisjIyBCdWlsZGluZyBvbiBNYWNPUworCisjIyMgTWFjT1MgQnVpbGQgUmVxdWlyZW1lbnRzCisKK1Rlc3RlZCBvbiBPU1ggdmVyc2lvbiAxMC4xMi42CisKKy0gW0NNYWtlIDMuMTAuMl0oaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLURhcndpbi14ODZfNjQudGFyLmd6KSBpcyByZWNvbW1lbmRlZC4KKworU2V0dXAgSG9tZWJyZXcgYW5kIGNvbXBvbmVudHMKKworLSBGb2xsb3cgaW5zdHJ1Y3Rpb25zIG9uIFticmV3LnNoXShodHRwOi8vYnJldy5zaCkgdG8gZ2V0IEhvbWVicmV3IGluc3RhbGxlZC4KKworICAgICAgL3Vzci9iaW4vcnVieSAtZSAiJChjdXJsIC1mc1NMIFwKKyAgICAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSG9tZWJyZXcvaW5zdGFsbC9tYXN0ZXIvaW5zdGFsbCkiCisKKy0gRW5zdXJlIEhvbWVicmV3IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgeW91ciBQQVRIOgorCisgICAgICBleHBvcnQgUEFUSD0vdXNyL2xvY2FsL2JpbjokUEFUSAorCistIEFkZCBwYWNrYWdlcyB3aXRoIHRoZSBmb2xsb3dpbmcgKG1heSBuZWVkIHJlZmluZW1lbnQpCisKKyAgICAgIGJyZXcgaW5zdGFsbCBweXRob24gcHl0aG9uMyBnaXQKKworIyMjIENsb25lIHRoZSBSZXBvc2l0b3J5CisKK0Nsb25lIHRoZSBWdWxrYW4tVG9vbHMgcmVwb3NpdG9yeSBhcyBkZWZpbmVkIGFib3ZlIGluIHRoZSBbRG93bmxvYWQgdGhlIFJlcG9zaXRvcnldKCNkb3dubG9hZC10aGUtcmVwb3NpdG9yeSkKK3NlY3Rpb24uCisKKyMjIyBHZXQgdGhlIEV4dGVybmFsIExpYnJhcmllcworCitbTW9sdGVuVktdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvTW9sdGVuVkspIExpYnJhcnkKKworLSBCdWlsZGluZyB0aGUgdmtjdWJlIGFuZCB2dWxrYW5pbmZvIGFwcGxpY2F0aW9ucyByZXF1aXJlIGxpbmtpbmcgdG8gdGhlCisgIE1vbHRlblZLIExpYnJhcnkgKGxpYk1vbHRlblZLLmR5bGliKQorICAtIFRoZSBmb2xsb3dpbmcgb3B0aW9uIHNob3VsZCBiZSB1c2VkIG9uIHRoZSBjbWFrZSBjb21tYW5kIGxpbmUgdG8gc3BlY2lmeSBhCisgICAgdnVsa2FuIGxvYWRlciBsaWJyYXJ5OiBNT0xURU5WS19SRVBPX1JPT1Q9L2Fic29sdXRlX3BhdGhfdG8vTW9sdGVuVksKKyAgICBtYWtpbmcgc3VyZSB0byBzcGVjaWZ5IGFuIGFic29sdXRlIHBhdGgsIGxpa2Ugc286IGNtYWtlCisgICAgLURNT0xURU5WS19SRVBPX1JPT1Q9L2Fic29sdXRlX3BhdGhfdG8vTW9sdGVuVksgLi4uLgorCitWdWxrYW4gTG9hZGVyIExpYnJhcnkKKworLSBCdWlsZGluZyB0aGUgdmtjdWJlIGFuZCB2dWxrYW5pbmZvIGFwcGxpY2F0aW9ucyByZXF1aXJlIGxpbmtpbmcgdG8gdGhlIFZ1bGthbgorICBMb2FkZXIgTGlicmFyeSAobGlidnVsa2FuLjEuZHlsaWIpCisgIC0gVGhlIGZvbGxvd2luZyBvcHRpb24gc2hvdWxkIGJlIHVzZWQgb24gdGhlIGNtYWtlIGNvbW1hbmQgbGluZSB0byBzcGVjaWZ5IGEKKyAgICB2dWxrYW4gbG9hZGVyIGxpYnJhcnk6CisgICAgVlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUj0vYWJzb2x1dGVfcGF0aF90by9WdWxrYW4tTG9hZGVyX2luc3RhbGxfZGlyCisgICAgbWFraW5nIHN1cmUgdG8gc3BlY2lmeSBhbiBhYnNvbHV0ZSBwYXRoLgorCisjIyMgTWFjT1MgYnVpbGQKKworIyMjIyBDTWFrZSBHZW5lcmF0b3JzCisKK1RoaXMgcmVwb3NpdG9yeSB1c2VzIENNYWtlIHRvIGdlbmVyYXRlIGJ1aWxkIG9yIHByb2plY3QgZmlsZXMgdGhhdCBhcmUgdGhlbgordXNlZCB0byBidWlsZCB0aGUgcmVwb3NpdG9yeS4gVGhlIENNYWtlIGdlbmVyYXRvcnMgZXhwbGljaXRseSBzdXBwb3J0ZWQgaW4KK3RoaXMgcmVwb3NpdG9yeSBhcmU6CisKKy0gVW5peCBNYWtlZmlsZXMKKy0gWGNvZGUKKworIyMjIyBCdWlsZGluZyB3aXRoIHRoZSBVbml4IE1ha2VmaWxlcyBHZW5lcmF0b3IKKworVGhpcyBnZW5lcmF0b3IgaXMgdGhlIGRlZmF1bHQgZ2VuZXJhdG9yLCBzbyBhbGwgdGhhdCBpcyBuZWVkZWQgZm9yIGEgZGVidWcKK2J1aWxkIGlzOgorCisgICAgICAgIG1rZGlyIGJ1aWxkCisgICAgICAgIGNkIGJ1aWxkCisgICAgICAgIGNtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyBcCisgICAgICAgICAgICAgIC1EVlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUj0vYWJzb2x1dGVfcGF0aF90by9WdWxrYW4tTG9hZGVyX2luc3RhbGxfZGlyIFwKKyAgICAgICAgICAgICAgLURNT0xURU5WS19SRVBPX1JPT1Q9L2Fic29sdXRlX3BhdGhfdG8vTW9sdGVuVksgXAorICAgICAgICAgICAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPWluc3RhbGwgLi4KKyAgICAgICAgbWFrZQorCitUbyBzcGVlZCB1cCB0aGUgYnVpbGQgb24gYSBtdWx0aS1jb3JlIG1hY2hpbmUsIHVzZSB0aGUgYC1qYCBvcHRpb24gZm9yIGBtYWtlYAordG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvcmVzIHRvIHVzZSBmb3IgdGhlIGJ1aWxkLiBGb3IgZXhhbXBsZToKKworICAgIG1ha2UgLWo0CisKK1lvdSBjYW4gbm93IHJ1biB0aGUgZGVtbyBhcHBsaWNhdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lOgorCisgICAgb3BlbiBjdWJlL3ZrY3ViZS5hcHAKKyAgICBvcGVuIGN1YmUvdmtjdWJlcHAuYXBwCisgICAgb3BlbiB2dWxrYW5pbmZvL3Z1bGthbmluZm8uYXBwCisKK09yIHlvdSBjYW4gbG9jYXRlIHRoZW0gZnJvbSBgRmluZGVyYCBhbmQgbGF1bmNoIHRoZW0gZnJvbSB0aGVyZS4KKworIyMjIyMgVGhlIEluc3RhbGwgVGFyZ2V0IGFuZCBSUEFUSAorCitUaGUgYXBwbGljYXRpb25zIHlvdSBqdXN0IGJ1aWx0IGFyZSAiYnVuZGxlZCBhcHBsaWNhdGlvbnMiLCBidXQgdGhlCitleGVjdXRhYmxlcyBhcmUgdXNpbmcgdGhlIGBSUEFUSGAgbWVjaGFuaXNtIHRvIGxvY2F0ZSBydW50aW1lIGRlcGVuZGVuY2llcwordGhhdCBhcmUgc3RpbGwgaW4geW91ciBidWlsZCB0cmVlLgorCitUbyBzZWUgdGhpcywgcnVuIHRoaXMgY29tbWFuZCBmcm9tIHlvdXIgYGJ1aWxkYCBkaXJlY3Rvcnk6CisKKyAgICBvdG9vbCAtbCBjdWJlL2N1YmUuYXBwL0NvbnRlbnRzL01hY09TL3ZrY3ViZQorCithbmQgbm90ZSB0aGF0IHRoZSBgdmtjdWJlYCBleGVjdXRhYmxlIGNvbnRhaW5zIGxvYWRlciBjb21tYW5kczoKKworLSBgTENfTE9BRF9EWUxJQmAgdG8gbG9hZCBgbGlidnVsa2FuLjEuZHlsaWJgIHZpYSBhbiBgQHJwYXRoYAorLSBgTENfUlBBVEhgIHRoYXQgY29udGFpbnMgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgYnVpbGQgbG9jYXRpb24gb2YgdGhlIFZ1bGthbiBsb2FkZXIKKworVGhpcyBtYWtlcyB0aGUgYnVuZGxlZCBhcHBsaWNhdGlvbiAibm9uLXRyYW5zcG9ydGFibGUiLCBtZWFuaW5nIHRoYXQgaXQgd29uJ3QKK3J1biB1bmxlc3MgdGhlIFZ1bGthbiBsb2FkZXIgaXMgb24gdGhhdCBzcGVjaWZpYyBhYnNvbHV0ZSBwYXRoLiBUaGlzIGlzIHVzZWZ1bAorZm9yIGRlYnVnZ2luZyB0aGUgbG9hZGVyIG9yIG90aGVyIGNvbXBvbmVudHMgYnVpbHQgaW4gdGhpcyByZXBvc2l0b3J5LCBidXQgbm90CitpZiB5b3Ugd2FudCB0byBtb3ZlIHRoZSBhcHBsaWNhdGlvbiB0byBhbm90aGVyIG1hY2hpbmUgb3IgcmVtb3ZlIHlvdXIgYnVpbGQKK3RyZWUuCisKK1RvIGFkZHJlc3MgdGhpcyBwcm9ibGVtLCBydW46CisKKyAgICBtYWtlIGluc3RhbGwKKworVGhpcyBzdGVwIGNvcGllcyB0aGUgYnVuZGxlZCBhcHBsaWNhdGlvbnMgdG8gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieQorQ01BS0VfSU5TVEFMTF9QUkVGSVggYW5kICJjbGVhbnMgdXAiIHRoZSBgUlBBVEhgIHRvIHJlbW92ZSBhbnkgZXh0ZXJuYWwKK3JlZmVyZW5jZXMgYW5kIHBlcmZvcm1zIG90aGVyIGJ1bmRsZSBmaXgtdXBzLiBBZnRlciBydW5uaW5nIGBtYWtlIGluc3RhbGxgLAorcnVuIHRoZSBgb3Rvb2xgIGNvbW1hbmQgYWdhaW4gZnJvbSB0aGUgYGJ1aWxkL2luc3RhbGxgIGRpcmVjdG9yeSBhbmQgbm90ZToKKworLSBgTENfTE9BRF9EWUxJQmAgaXMgbm93IGBAZXhlY3V0YWJsZV9wYXRoLy4uL01hY09TL2xpYnZ1bGthbi4xLmR5bGliYAorLSBgTENfUlBBVEhgIGlzIG5vIGxvbmdlciBwcmVzZW50CisKK1RoZSAiYnVuZGxlIGZpeC11cCIgb3BlcmF0aW9uIGFsc28gcHV0cyBhIGNvcHkgb2YgdGhlIFZ1bGthbiBsb2FkZXIgaW50byB0aGUKK2J1bmRsZSwgbWFraW5nIHRoZSBidW5kbGUgY29tcGxldGVseSBzZWxmLWNvbnRhaW5lZCBhbmQgc2VsZi1yZWZlcmVuY2luZy4KKworIyMjIyMgVGhlIE5vbi1idW5kbGVkIHZ1bGthbmluZm8gQXBwbGljYXRpb24KKworVGhlcmUgaXMgYWxzbyBhIG5vbi1idW5kbGVkIHZlcnNpb24gb2YgdGhlIGB2dWxrYW5pbmZvYCBhcHBsaWNhdGlvbiB0aGF0IHlvdQorY2FuIHJ1biBmcm9tIHRoZSBjb21tYW5kIGxpbmU6CisKKyAgICB2dWxrYW5pbmZvL3Z1bGthbmluZm8KKworSWYgeW91IHJ1biB0aGlzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeSwgdnVsa2FuaW5mbydzIFJQQVRIIGlzIGFscmVhZHkKK3NldCB0byBwb2ludCB0byB0aGUgVnVsa2FuIGxvYWRlciBpbiB0aGUgYnVpbGQgdHJlZSwgc28gaXQgaGFzIG5vIHRyb3VibGUKK2ZpbmRpbmcgaXQuIEJ1dCB0aGUgbG9hZGVyIHdpbGwgbm90IGZpbmQgdGhlIE1vbHRlblZLIGRyaXZlciBhbmQgeW91J2xsIHNlZSBhCittZXNzYWdlIGFib3V0IGFuIGluY29tcGF0aWJsZSBkcml2ZXIuIFRvIHJlbWVkeSB0aGlzOgorCisgICAgVktfSUNEX0ZJTEVOQU1FUz08cGF0aC10bz4vTW9sdGVuVksvUGFja2FnZS9MYXRlc3QvTW9sdGVuVksvbWFjT1MvTW9sdGVuVktfaWNkLmpzb24gdnVsa2FuaW5mby92dWxrYW5pbmZvCisKK0lmIHlvdSBydW4gYHZ1bGthbmluZm9gIGZyb20gdGhlIGluc3RhbGwgZGlyZWN0b3J5LCB0aGUgYFJQQVRIYCBpbiB0aGUKK2B2dWxrYW5pbmZvYCBhcHBsaWNhdGlvbiBnb3QgcmVtb3ZlZCBhbmQgdGhlIE9TIG5lZWRzIGV4dHJhIGhlbHAgdG8gbG9jYXRlCit0aGUgVnVsa2FuIGxvYWRlcjoKKworICAgIERZTERfTElCUkFSWV9QQVRIPTxwYXRoLXRvPi9WdWxrYW4tTG9hZGVyL2xvYWRlciBWS19JQ0RfRklMRU5BTUVTPTxwYXRoLXRvPi9Nb2x0ZW5WSy9QYWNrYWdlL0xhdGVzdC9Nb2x0ZW5WSy9tYWNPUy9Nb2x0ZW5WS19pY2QuanNvbiB2dWxrYW5pbmZvL3Z1bGthbmluZm8KKworIyMjIyBCdWlsZGluZyB3aXRoIHRoZSBYY29kZSBHZW5lcmF0b3IKKworVG8gY3JlYXRlIGFuZCBvcGVuIGFuIFhjb2RlIHByb2plY3Q6CisKKyAgICAgICAgbWtkaXIgYnVpbGQteGNvZGUKKyAgICAgICAgY2QgYnVpbGQteGNvZGUKKyAgICAgICAgY21ha2UgLURWVUxLQU5fTE9BREVSX0lOU1RBTExfRElSPS9hYnNvbHV0ZV9wYXRoX3RvL1Z1bGthbi1Mb2FkZXJfaW5zdGFsbF9kaXIgLURNT0xURU5WS19SRVBPX1JPT1Q9L2Fic29sdXRlX3BhdGhfdG8vTW9sdGVuVksgLUdYY29kZSAuLgorICAgICAgICBvcGVuIFZVTEtBTi54Y29kZXByb2oKKworV2l0aGluIFhjb2RlLCB5b3UgY2FuIHNlbGVjdCBEZWJ1ZyBvciBSZWxlYXNlIGJ1aWxkcyBpbiB0aGUgcHJvamVjdCdzIEJ1aWxkCitTZXR0aW5ncy4gWW91IGNhbiBhbHNvIHNlbGVjdCBpbmRpdmlkdWFsIHNjaGVtZXMgZm9yIHdvcmtpbmcgd2l0aCBzcGVjaWZpYworYXBwbGljYXRpb25zIGxpa2UgYHZrY3ViZWAuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzk5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE3MSBAQAorIyB+fn4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIH5+fgorCisjIENNYWtlIHByb2plY3QgaW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBjb250YWlucyBwcmUtcHJvamVjdCgpIGluaXRpYWxpemF0aW9uLCBhbmQgZW5kcyB3aXRoIHRoZSBwcm9qZWN0KCkgY29tbWFuZC4KKworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMTAuMikKKworIyBBcHBsZTogTXVzdCBiZSBzZXQgYmVmb3JlIGVuYWJsZV9sYW5ndWFnZSgpIG9yIHByb2plY3QoKSBhcyBpdCBtYXkgaW5mbHVlbmNlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRvb2xjaGFpbiBhbmQgZmxhZ3MuCitzZXQoQ01BS0VfT1NYX0RFUExPWU1FTlRfVEFSR0VUICIxMC4xMiIgQ0FDSEUgU1RSSU5HICJNaW5pbXVtIE9TIFggZGVwbG95bWVudCB2ZXJzaW9uIikKKworcHJvamVjdChWdWxrYW4tVG9vbHMpCisKKyMgZmluZF9wYWNrYWdlKCksIGluY2x1ZGUoKSBhbmQgZ2xvYmFsIHByb2plY3Qgc2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCAzIFFVSUVUKQorCisjIFVzZXItaW50ZXJmYWNlIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpYWJsZXMgdGhhdCBhZmZlY3QgZGV2ZWxvcG1lbnQgR1VJcyAoZS5nLiBDTWFrZSBHVUkgYW5kIElERXMpLCBzdWNoIGFzIG9wdGlvbigpLCBmb2xkZXJzLCBhbmQgdmFyaWFibGVzCisjIHdpdGggdGhlIENBQ0hFIHByb3BlcnR5LgorCitzZXQoQ01BS0VfTU9EVUxFX1BBVEggJHtDTUFLRV9NT0RVTEVfUEFUSH0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZSIpCisKK29wdGlvbihCVUlMRF9DVUJFICJCdWlsZCBjdWJlIiBPTikKK29wdGlvbihCVUlMRF9WVUxLQU5JTkZPICJCdWlsZCB2dWxrYW5pbmZvIiBPTikKK29wdGlvbihCVUlMRF9JQ0QgIkJ1aWxkIGljZCIgT04pCisjIEluc3RhbGxpbmcgdGhlIE1vY2sgSUNEIHRvIHN5c3RlbSBkaXJlY3RvcmllcyBpcyBwcm9iYWJseSBub3QgZGVzaXJlZCBzaW5jZSB0aGlzIElDRCBpcyBub3QgYSB2ZXJ5IGNvbXBsZXRlIGltcGxlbWVudGF0aW9uLgorIyBSZXF1aXJlIHRoZSB1c2VyIHRvIGFzayB0aGF0IGl0IGJlIGluc3RhbGxlZCBpZiB0aGV5IHJlYWxseSB3YW50IGl0Lgorb3B0aW9uKElOU1RBTExfSUNEICJJbnN0YWxsIGljZCIgT0ZGKQorCisjIEVuYWJsZSBJREUgR1VJIGZvbGRlcnMKK3NldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgVVNFX0ZPTERFUlMgT04pCisjICJIZWxwZXIiIHRhcmdldHMgdGhhdCBkb24ndCBoYXZlIGludGVyZXN0aW5nIHNvdXJjZSBjb2RlIHNob3VsZCBzZXQgdGhlaXIgRk9MREVSIHByb3BlcnR5IHRvIHRoaXMKK3NldChUT09MU19IRUxQRVJfRk9MREVSICJIZWxwZXIgVGFyZ2V0cyIpCisKK29wdGlvbihVU0VfQ0NBQ0hFICJVc2UgY2NhY2hlIiBPRkYpCitpZihVU0VfQ0NBQ0hFKQorICAgIGZpbmRfcHJvZ3JhbShDQ0FDSEVfRk9VTkQgY2NhY2hlKQorICAgIGlmKENDQUNIRV9GT1VORCkKKyAgICAgICAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBSVUxFX0xBVU5DSF9DT01QSUxFIGNjYWNoZSkKKyAgICBlbmRpZigpCitlbmRpZigpCisKKyMgfn5+CisjIEZpbmQgVnVsa2FuIEhlYWRlcnMgYW5kIExvYWRlcgorIyBTZWFyY2ggb3JkZXI6CisjICBVc2VyLXN1cHBsaWVkIENNQUtFX1BSRUZJWF9QQVRIIGNvbnRhaW5pbmcgcGF0aHMgdG8gdGhlIGhlYWRlciBhbmQvb3IgbG9hZGVyIGluc3RhbGwgZGlycworIyAgQ01ha2Ugb3B0aW9ucyBWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUiBhbmQvb3IgVlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUgorIyAgRW52IHZhcnMgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVIgYW5kL29yIFZVTEtBTl9MT0FERVJfSU5TVEFMTF9ESVIKKyMgIElmIG9uIE1hY09TCisjICAgQ01ha2Ugb3B0aW9uIE1PVExFTlZLX1JFUE9fUk9PVAorIyAgIEVudiB2YXJzIE1PTFRFTlZLX1JFUE9fUk9PVAorIyAgRmFsbGJhY2sgdG8gRmluZFZ1bGthbiBvcGVyYXRpb24gdXNpbmcgU0RLIGluc3RhbGwgb3Igc3lzdGVtIGluc3RhbGxlZCBjb21wb25lbnRzLgorIyB+fn4KK3NldChWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUiAiSEVBREVSUy1OT1RGT1VORCIgQ0FDSEUgUEFUSCAiQWJzb2x1dGUgcGF0aCB0byBhIFZ1bGthbi1IZWFkZXJzIGluc3RhbGwgZGlyZWN0b3J5IikKK3NldChWVUxLQU5fTE9BREVSX0lOU1RBTExfRElSICJMT0FERVItTk9URk9VTkQiIENBQ0hFIFBBVEggIkFic29sdXRlIHBhdGggdG8gYSBWdWxrYW4tTG9hZGVyIGluc3RhbGwgZGlyZWN0b3J5IikKK2lmKFdJTjMyIEFORCAiJHtWVUxLQU5fTE9BREVSX0lOU1RBTExfRElSfSIgU1RSRVFVQUwgIkxPQURFUi1OT1RGT1VORCIpCisgICAgaWYoQ01BS0VfQ0xfNjQpCisgICAgICAgIHNldChWVUxLQU5fTE9BREVSX0lOU1RBTExfRElSICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXh0ZXJuYWwveDY0IikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KFZVTEtBTl9MT0FERVJfSU5TVEFMTF9ESVIgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leHRlcm5hbC94ODYiKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKK3NldChDTUFLRV9QUkVGSVhfUEFUSCAke0NNQUtFX1BSRUZJWF9QQVRIfTske1ZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSfTske1ZVTEtBTl9MT0FERVJfSU5TVEFMTF9ESVJ9OworICAgICRFTlZ7VlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJ9OyRFTlZ7VlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUn0pCisKK2lmKEFQUExFKQorICAgIHNldChNT0xURU5WS19SRVBPX1JPT1QgIk1PTFRFTlZLLU5PVEZPVU5EIiBDQUNIRSBQQVRIICJBYnNvbHV0ZSBwYXRoIHRvIGEgTW9sdGVuVksgcmVwbyBkaXJlY3RvcnkiKQorICAgIGlmKE5PVCBNT0xURU5WS19SRVBPX1JPT1QgQU5EIE5PVCBERUZJTkVEIEVOVntNT0xURU5WS19SRVBPX1JPT1R9KQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJNdXN0IGRlZmluZSBsb2NhdGlvbiBvZiBNb2x0ZW5WSyByZXBvIC0tIHNlZSBCVUlMRC5tZCIpCisgICAgZW5kaWYoKQorCisgICAgaWYoTk9UIE1PTFRFTlZLX1JFUE9fUk9PVCkKKyAgICAgICAgc2V0KE1PTFRFTlZLX1JFUE9fUk9PVCAkRU5We01PTFRFTlZLX1JFUE9fUk9PVH0pCisgICAgZW5kaWYoKQorICAgIG1lc3NhZ2UoU1RBVFVTICJVc2luZyBNb2x0ZW5WSyByZXBvIGxvY2F0aW9uIGF0ICR7TU9MVEVOVktfUkVQT19ST09UfSIpCitlbmRpZigpCittZXNzYWdlKFNUQVRVUyAiVXNpbmcgZmluZF9wYWNrYWdlIHRvIGxvY2F0ZSBWdWxrYW4iKQorZmluZF9wYWNrYWdlKFZ1bGthbikKK2ZpbmRfcGFja2FnZShWdWxrYW5IZWFkZXJzKQorZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChWdWxrYW5fTElCUkFSWV9ESVIgJHtWdWxrYW5fTElCUkFSWX0gRElSRUNUT1JZKQorbWVzc2FnZShTVEFUVVMgIlZ1bGthbiBGT1VORCA9ICR7VnVsa2FuX0ZPVU5EfSIpCittZXNzYWdlKFNUQVRVUyAiVnVsa2FuIExpYiBEaXIgPSAke1Z1bGthbl9MSUJSQVJZX0RJUn0iKQorbWVzc2FnZShTVEFUVVMgIlZ1bGthbiBMaWIgPSAke1Z1bGthbl9MSUJSQVJZfSIpCittZXNzYWdlKFNUQVRVUyAiVnVsa2FuIEhlYWRlcnMgSW5jbHVkZSA9ICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0iKQorbWVzc2FnZShTVEFUVVMgIlZ1bGthbiBIZWFkZXJzIFJlZ2lzdHJ5ID0gJHtWdWxrYW5SZWdpc3RyeV9ESVJ9IikKKworaW5jbHVkZShHTlVJbnN0YWxsRGlycykKKworaWYoV0lOMzIgQU5EIENNQUtFX0lOU1RBTExfUFJFRklYX0lOSVRJQUxJWkVEX1RPX0RFRkFVTFQpCisgICAgIyBXaW5kb3dzOiBpZiBpbnN0YWxsIGxvY2F0aW9ucyBub3Qgc2V0IGJ5IHVzZXIsIHNldCBpbnN0YWxsIHByZWZpeCB0byAiPGJ1aWxkX2Rpcj5caW5zdGFsbCIuCisgICAgc2V0KENNQUtFX0lOU1RBTExfUFJFRklYICIke0NNQUtFX0JJTkFSWV9ESVJ9L2luc3RhbGwiIENBQ0hFIFBBVEggImRlZmF1bHQgaW5zdGFsbCBwYXRoIiBGT1JDRSkKK2VuZGlmKCkKKworIyB1bmluc3RhbGwgdGFyZ2V0CitpZihOT1QgVEFSR0VUIHVuaW5zdGFsbCkKKyAgICBjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbiIKKyAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NtYWtlX3VuaW5zdGFsbC5jbWFrZSIKKyAgICAgICAgICAgICAgICAgICBJTU1FRElBVEUKKyAgICAgICAgICAgICAgICAgICBAT05MWSkKKworICAgIGFkZF9jdXN0b21fdGFyZ2V0KHVuaW5zdGFsbCBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLVAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NtYWtlX3VuaW5zdGFsbC5jbWFrZSkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXModW5pbnN0YWxsIFBST1BFUlRJRVMgRk9MREVSICR7VE9PTFNfSEVMUEVSX0ZPTERFUn0pCitlbmRpZigpCisKK2lmKEFQUExFKQorICAgICMgQ01ha2UgdmVyc2lvbnMgMyBvciBsYXRlciBuZWVkIENNQUtFX01BQ09TWF9SUEFUSCBkZWZpbmVkLiBUaGlzIGF2b2lkcyB0aGUgQ01QMDA0MiBwb2xpY3kgbWVzc2FnZS4KKyAgICBzZXQoQ01BS0VfTUFDT1NYX1JQQVRIIDEpCitlbmRpZigpCisKK2lmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIE9SIENNQUtFX0NfQ09NUElMRVJfSUQgTUFUQ0hFUyAiQ2xhbmciKQorICAgIHNldChDT01NT05fQ09NUElMRV9GTEFHUyAiLVdhbGwgLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyIpCisgICAgc2V0KENPTU1PTl9DT01QSUxFX0ZMQUdTICIke0NPTU1PTl9DT01QSUxFX0ZMQUdTfSAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWJ1aWx0aW4tbWVtY21wIikKKworICAgICMgRm9yIEdDQyB2ZXJzaW9uIDcuMSBvciBncmVhdGVyLCB3ZSBuZWVkIHRvIGRpc2FibGUgdGhlIGltcGxpY2l0IGZhbGx0aHJvdWdoIHdhcm5pbmcgc2luY2UgdGhlcmUncyBubyBjb25zaXN0ZW50IHdheSB0byBzYXRpc2Z5CisgICAgIyBhbGwgY29tcGlsZXJzIHVudGlsIHRoZXkgYWxsIGFjY2VwdCB0aGUgQysrMTcgc3RhbmRhcmQKKyAgICBpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgTk9UIChDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTiBMRVNTIDcuMSkpCisgICAgICAgIHNldChDT01NT05fQ09NUElMRV9GTEFHUyAiJHtDT01NT05fQ09NUElMRV9GTEFHU30gLVdpbXBsaWNpdC1mYWxsdGhyb3VnaD0wIikKKyAgICBlbmRpZigpCisKKyAgICBpZihBUFBMRSkKKyAgICAgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gJHtDT01NT05fQ09NUElMRV9GTEFHU30iKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtc3RkPWM5OSAke0NPTU1PTl9DT01QSUxFX0ZMQUdTfSIpCisgICAgZW5kaWYoKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke0NPTU1PTl9DT01QSUxFX0ZMQUdTfSAtc3RkPWMrKzExIC1mbm8tcnR0aSIpCisgICAgaWYoVU5JWCkKKyAgICAgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLWZ2aXNpYmlsaXR5PWhpZGRlbiIpCisgICAgICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtZnZpc2liaWxpdHk9aGlkZGVuIikKKyAgICBlbmRpZigpCitlbmRpZigpCisKKyMgT3B0aW9uYWwgY29kZWdlbiB0YXJnZXQKK2lmKFBZVEhPTklOVEVSUF9GT1VORCkKKyAgICBhZGRfY3VzdG9tX3RhcmdldChWdWxrYW5Ub29sc19nZW5lcmF0ZWRfc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1BST0pFQ1RfU09VUkNFX0RJUn0vc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7VnVsa2FuUmVnaXN0cnlfRElSfSAtLWluY3JlbWVudGFsCisgICAgICAgICAgICAgICAgICAgICAgKQorZWxzZSgpCisgICAgbWVzc2FnZSgiV0FSTklORzogVnVsa2FuVG9vbHNfZ2VuZXJhdGVkX3NvdXJjZSB0YXJnZXQgcmVxdWlyZXMgcHl0aG9uIDMiKQorZW5kaWYoKQorCitpZihBUFBMRSkKKyAgICBpbmNsdWRlKG1hY19jb21tb24uY21ha2UpCitlbmRpZigpCisKK2lmKEJVSUxEX0NVQkUpCisgICAgYWRkX3N1YmRpcmVjdG9yeShjdWJlKQorZW5kaWYoKQorCitpZihCVUlMRF9WVUxLQU5JTkZPKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodnVsa2FuaW5mbykKK2VuZGlmKCkKKworaWYoQlVJTERfSUNEKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoaWNkKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvQ09ERV9PRl9DT05EVUNULm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvQ09ERV9PRl9DT05EVUNULm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTYxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9DT0RFX09GX0NPTkRVQ1QubWQKQEAgLTAsMCArMSBAQAorQSByZW1pbmRlciB0aGF0IHRoaXMgaXNzdWUgdHJhY2tlciBpcyBtYW5hZ2VkIGJ5IHRoZSBLaHJvbm9zIEdyb3VwLiBJbnRlcmFjdGlvbnMgaGVyZSBzaG91bGQgZm9sbG93IHRoZSBLaHJvbm9zIENvZGUgb2YgQ29uZHVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvZGV2ZWxvcGVycy9jb2RlLW9mLWNvbmR1Y3QpLCB3aGljaCBwcm9oaWJpdHMgYWdncmVzc2l2ZSBvciBkZXJvZ2F0b3J5IGxhbmd1YWdlLiBQbGVhc2Uga2VlcCB0aGUgZGlzY3Vzc2lvbiBmcmllbmRseSBhbmQgY2l2aWwuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9DT05UUklCVVRJTkcubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlMDI2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDEzMCBAQAorIyBIb3cgdG8gQ29udHJpYnV0ZSB0byBWdWxrYW4gU291cmNlIFJlcG9zaXRvcmllcworCisjIyAqKlRoZSBSZXBvc2l0b3J5KioKKworVGhlIHNvdXJjZSBjb2RlIGZvciBUaGUgVnVsa2FuLVRvb2xzIGNvbXBvbmVudHMgaXMgc3BvbnNvcmVkIGJ5IEtocm9ub3MgYW5kIEx1bmFyRy4KKyogW0tocm9ub3MgVnVsa2FuLVRvb2xzXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Ub29scykKKworCitSZXBvc2l0b3J5IElzc3VlIGxhYmVsczoKKworKiBfQnVnXzogICAgICAgICAgVGhlc2UgaXNzdWVzIHJlZmVyIHRvIGludmFsaWQgb3IgYnJva2VuIGZ1bmN0aW9uYWxpdHkgYW5kIGFyZSB0aGUgaGlnaGVzdCBwcmlvcml0eS4KKyogX0VuaGFuY2VtZW50XzogIFRoZXNlIGlzc3VlcyByZWZlciB0byBpZGVhcyBmb3IgZXh0ZW5kaW5nIG9yIGltcHJvdmluZyB0b29scyBhbmQgdXRpbGl0aWVzCisKK0l0IGlzIHRoZSBtYWludGFpbmVycyBnb2FsIGZvciBhbGwgaXNzdWVzIHRvIGJlIGFzc2lnbmVkIHdpdGhpbiBvbmUgYnVzaW5lc3MgZGF5IG9mIHRoZWlyIHN1Ym1pc3Npb24uIElmIHlvdSBjaG9vc2UKK3RvIHdvcmsgb24gYW4gaXNzdWUgdGhhdCBpcyBhc3NpZ25lZCwgc2ltcGx5IGNvb3JkaW5hdGUgd2l0aCB0aGUgY3VycmVudCBhc3NpZ25lZS4KKworIyMjICoqSG93IHRvIFN1Ym1pdCBGaXhlcyoqCisKKyogKipFbnN1cmUgdGhhdCB0aGUgYnVnIHdhcyBub3QgYWxyZWFkeSByZXBvcnRlZCBvciBmaXhlZCoqIGJ5IHNlYXJjaGluZyBvbiBHaXRIdWIgdW5kZXIgSXNzdWVzCisgIGFuZCBQdWxsIFJlcXVlc3RzLgorKiBVc2UgdGhlIGV4aXN0aW5nIEdpdEh1YiBmb3JraW5nIGFuZCBwdWxsIHJlcXVlc3QgcHJvY2Vzcy4KKyAgVGhpcyB3aWxsIGludm9sdmUgW2ZvcmtpbmcgdGhlIHJlcG9zaXRvcnldKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2ZvcmstYS1yZXBvLyksCisgIGNyZWF0aW5nIGEgYnJhbmNoIHdpdGggeW91ciBjb21taXRzLCBhbmQgdGhlbiBbc3VibWl0dGluZyBhIHB1bGwgcmVxdWVzdF0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvdXNpbmctcHVsbC1yZXF1ZXN0cy8pLgorKiBQbGVhc2UgcmVhZCBhbmQgYWRoZXJlIHRvIHRoZSBzdHlsZSBhbmQgcHJvY2VzcyBbZ3VpZGVsaW5lcyBdKCNjb2RpbmctY29udmVudGlvbnMtYW5kLWZvcm1hdHRpbmcpIGVudW1lcmF0ZWQgYmVsb3cuCisqIFBsZWFzZSBiYXNlIHlvdXIgZml4ZXMgb24gdGhlIG1hc3RlciBicmFuY2guICBTREsgYnJhbmNoZXMgYXJlIGdlbmVyYWxseSBub3QgdXBkYXRlZCBleGNlcHQgZm9yIGNyaXRpY2FsIGZpeGVzIG5lZWRlZCB0byByZXBhaXIgYW4gU0RLIHJlbGVhc2UuCisqIFRoZSByZXN1bHRpbmcgUHVsbCBSZXF1ZXN0IHdpbGwgYmUgYXNzaWduZWQgdG8gYSByZXBvc2l0b3J5IG1haW50YWluZXIuIEl0IGlzIHRoZSBtYWludGFpbmVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoZSBQdWxsIFJlcXVlc3QKKyAgcGFzc2VzIHRoZSBHb29nbGUvTHVuYXJHIGludGVybmFsIENJIHByb2Nlc3Nlcy4gT25jZSB0aGUgUHVsbCBSZXF1ZXN0IGhhcyBiZWVuIGFwcHJvdmVkIGFuZCBpcyBwYXNzaW5nIGludGVybmFsIENJLCBhIHJlcG9zaXRvcnkgbWFpbnRhaW5lcgorICB3aWxsIG1lcmdlIHRoZSBQUi4KKworCisjIyMjICoqQ29kaW5nIENvbnZlbnRpb25zIGFuZCBGb3JtYXR0aW5nKioKKyogVXNlIHRoZSAqKltHb29nbGUgc3R5bGUgZ3VpZGVdKGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL2NwcGd1aWRlLmh0bWwpKiogZm9yIHNvdXJjZSBjb2RlIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorICAgICogVGhlIGNvbHVtbiBsaW1pdCBpcyAxMzIgKGFzIG9wcG9zZWQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgODApLiBUaGUgY2xhbmctZm9ybWF0IHRvb2wgd2lsbCBoYW5kbGUgdGhpcy4gU2VlIGJlbG93LgorICAgICogVGhlIGluZGVudCBpcyA0IHNwYWNlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDIgc3BhY2VzLiBBZ2FpbiwgdGhlIGNsYW5nLWZvcm1hdCB0b29sIHdpbGwgaGFuZGxlIHRoaXMuCisgICAgKiBJZiB5b3UgY2FuIGp1c3RpZnkgYSByZWFzb24gZm9yIHZpb2xhdGluZyBhIHJ1bGUgaW4gdGhlIGd1aWRlbGluZXMsIHRoZW4geW91IGFyZSBmcmVlIHRvIGRvIHNvLiBCZSBwcmVwYXJlZCB0byBkZWZlbmQgeW91cgorZGVjaXNpb24gZHVyaW5nIGNvZGUgcmV2aWV3LiBUaGlzIHNob3VsZCBiZSB1c2VkIHJlc3BvbnNpYmx5LiBBbiBleGFtcGxlIG9mIGEgYmFkIHJlYXNvbiBpcyAiSSBkb24ndCBsaWtlIHRoYXQgcnVsZS4iIEFuIGV4YW1wbGUgb2YKK2EgZ29vZCByZWFzb24gaXMgIlRoaXMgdmlvbGF0ZXMgdGhlIHN0eWxlIGd1aWRlLCBidXQgaXQgaW1wcm92ZXMgdHlwZSBzYWZldHkuIgorCisqIFJ1biAqKmNsYW5nLWZvcm1hdCoqIG9uIHlvdXIgY2hhbmdlcyB0byBtYWludGFpbiBjb25zaXN0ZW50IGZvcm1hdHRpbmcKKyAgICAqIFRoZXJlIGFyZSBgLmNsYW5nLWZvcm1hdGAgZmlsZXMgcHJlc2VudCBpbiB0aGUgcmVwb3NpdG9yeSB0byBkZWZpbmUgY2xhbmctZm9ybWF0IHNldHRpbmdzCisgICAgICB3aGljaCBhcmUgZm91bmQgYW5kIHVzZWQgYXV0b21hdGljYWxseSBieSBjbGFuZy1mb3JtYXQuCisJKiAqKmNsYW5nLWZvcm1hdCoqIGJpbmFyaWVzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgTExWTSBvcmdpbml6YXRpb24sIGhlcmU6IFtMTFZNXShodHRwczovL2NsYW5nLmxsdm0ub3JnLykuIE91ciBDSSBzeXN0ZW0gKFRyYXZpcy1DSSkKKwkgIGN1cnJlbnRseSB1c2VzIGNsYW5nLWZvcm1hdCB2ZXJzaW9uIDUuMC4wIHRvIGNoZWNrIHRoYXQgdGhlIGxpbmVzIG9mIGNvZGUgeW91IGhhdmUgY2hhbmdlZCBhcmUgZm9ybWF0dGVkIHByb3Blcmx5LiBJdCBpcworCSAgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBzYW1lIHZlcnNpb24gdG8gZm9ybWF0IHlvdXIgY29kZSBwcmlvciB0byBzdWJtaXNzaW9uLgorICAgICogQSBzYW1wbGUgZ2l0IHdvcmtmbG93IG1heSBsb29rIGxpa2U6CisKKz4gICAgICAgICMgTWFrZSBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UuCis+ICAgICAgICAkIGdpdCBhZGQgLXUgLgorPiAgICAgICAgJCBnaXQgY2xhbmctZm9ybWF0IC0tc3R5bGU9ZmlsZQorPiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgY2xhbmctZm9ybWF0IG1hZGUgYW55IGNoYW5nZXMgYW5kIGlmIHRoZXkgYXJlIE9LLgorPiAgICAgICAgJCBnaXQgYWRkIC11IC4KKz4gICAgICAgICQgZ2l0IGNvbW1pdAorCisqICoqQ29tbWl0IE1lc3NhZ2VzKioKKyAgICAqIExpbWl0IHRoZSBzdWJqZWN0IGxpbmUgdG8gNTAgY2hhcmFjdGVycyAtLSB0aGlzIGFsbG93cyB0aGUgaW5mb3JtYXRpb24gdG8gZGlzcGxheSBjb3JyZWN0bHkgaW4gZ2l0L0dpdGh1YiBsb2dzCisgICAgKiBCZWdpbiBzdWJqZWN0IGxpbmUgd2l0aCBhIG9uZS13b3JkIGNvbXBvbmVudCBkZXNjcmlwdGlvbiBmb2xsb3dlZCBieSBhIGNvbG9uIChlLmcuIGxvYWRlciwgbGF5ZXJzLCB0ZXN0cywgZXRjLikKKyAgICAqIFNlcGFyYXRlIHN1YmplY3QgZnJvbSBib2R5IHdpdGggYSBibGFuayBsaW5lCisgICAgKiBXcmFwIHRoZSBib2R5IGF0IDcyIGNoYXJhY3RlcnMKKyAgICAqIENhcGl0YWxpemUgdGhlIHN1YmplY3QgbGluZQorICAgICogRG8gbm90IGVuZCB0aGUgc3ViamVjdCBsaW5lIHdpdGggYSBwZXJpb2QKKyAgICAqIFVzZSB0aGUgYm9keSB0byBleHBsYWluIHdoYXQgYW5kIHdoeSB2cy4gaG93CisgICAgKiBVc2UgdGhlIGltcGVyYXRpdmUgbW9kZSBpbiB0aGUgc3ViamVjdCBsaW5lLiBUaGlzIGp1c3QgbWVhbnMgdG8gd3JpdGUgaXQgYXMgYSBjb21tYW5kIChlLmcuIEZpeCB0aGUgc3Byb2NrZXQpCisKK1N0cml2ZSBmb3IgY29tbWl0cyB0aGF0IGltcGxlbWVudCBhIHNpbmdsZSBvciByZWxhdGVkIHNldCBvZiBmdW5jdGlvbmFsaXR5LCB1c2luZyBhcyBtYW55IGNvbW1pdHMgYXMgaXMgbmVjZXNzYXJ5IChtb3JlIGlzIGJldHRlcikuCitUaGF0IHNhaWQsIHBsZWFzZSBlbnN1cmUgdGhhdCB0aGUgcmVwb3NpdG9yeSBjb21waWxlcyBhbmQgcGFzc2VzIHRlc3RzIHdpdGhvdXQgZXJyb3IgZm9yIGVhY2ggY29tbWl0IGluIHlvdXIgcHVsbCByZXF1ZXN0LiAgTm90ZQordGhhdCB0byBiZSBhY2NlcHRlZCBpbnRvIHRoZSByZXBvc2l0b3J5LCB0aGUgcHVsbCByZXF1ZXN0IG11c3QgW3Bhc3MgYWxsIHRlc3RzXSgjdGVzdGluZyB5b3VyIGNoYW5nZXMpIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zCistLSB0aGUgYXV0b21hdGljIEdpdGh1YiBUcmF2aXMgYW5kIEFwcFZleW9yIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gZmVhdHVyZXMgd2lsbCBhc3Npc3QgaW4gZW5mb3JjaW5nIHRoaXMgcmVxdWlyZW1lbnQuCisKKyMjIyMgR2VuZXJhdGVkIFNvdXJjZSBDb2RlCisKK1RoZSBgaWNkL2dlbmVyYXRlZGAgZGlyZWN0b3J5IGNvbnRhaW5zIHNvdXJjZSBjb2RlIHRoYXQgaXMgY3JlYXRlZCBieSBzZXZlcmFsCitnZW5lcmF0b3Igc2NyaXB0cyBpbiB0aGUgYHNjcmlwdHNgIGRpcmVjdG9yeS4gQWxsIGNoYW5nZXMgdG8gdGhlc2Ugc2NyaXB0cyBfbXVzdF8gYmUgc3VibWl0dGVkIHdpdGggdGhlCitjb3JyZXNwb25kaW5nIGdlbmVyYXRlZCBvdXRwdXQgdG8ga2VlcCB0aGUgcmVwb3NpdG9yeSBzZWxmLWNvbnNpc3RlbnQuIFRoaXMgcmVxdWlyZW1lbnQgaXMgZW5mb3JjZWQgYnkgYm90aAorVHJhdmlzIENJIGFuZCBBcHBWZXlvciB0ZXN0IGNvbmZpZ3VyYXRpb25zLiBSZWdlbmVyYXRlIHNvdXJjZSBmaWxlcyBhZnRlciBtb2RpZnlpbmcgYW55IG9mIHRoZSBnZW5lcmF0b3IKK3NjcmlwdHMgYW5kIGJlZm9yZSBidWlsZGluZyBhbmQgdGVzdGluZyB5b3VyIGNoYW5nZXMuIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4KK1tCVUlMRC5tZF0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tVG9vbHMvYmxvYi9tYXN0ZXIvQlVJTEQubWQjZ2VuZXJhdGVkLXNvdXJjZS1jb2RlKS4KKworIyMjIyAqKlRlc3RpbmcgWW91ciBDaGFuZ2VzKioKKyogUnVuIHRoZSByZXBvc2l0b3J5IGNvbXBvbmVudHMgd2l0aCB0aGUgVnVsa2FuIFZhbGlkYXRpb24gTGF5ZXJzIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBvZiB5b3VyIGNvbW1pdHMgdG8gY2hlY2sgZm9yIGFueSByZWdyZXNzaW9ucy4KKworICAoVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBmb3IgTGludXgpCisqIEluIHRoZSBgY3ViZWAgZGlyZWN0b3J5LCBydW46Cis+ICAgICAgICB2a2N1YmUKKz4gICAgICAgIHZrY3ViZSAtLXZhbGlkYXRlCisqIEluIHRoZSBgdnVsa2FuaW5mb2AgZGlyZWN0b3J5LCBydW46Cis+ICAgICAgICB2dWxrYW5pbmZvCisqIElmIHlvdSBhcmUgYWRkaW5nIG9yIGNoYW5naW5nIEpTT04gb3V0cHV0LCBwbGVhc2UgcmVhZAorICBbVmFsaWRhdGluZyB2dWxrYW5pbmZvIEpTT04gb3V0cHV0XShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Ub29scy9ibG9iL21hc3Rlci92dWxrYW5pbmZvL2pzb25fdmFsaWRhdGlvbl9wcm9jZXNzLm1kKS4KKyAgKipOb3RlOioqIFdoZW4gYWRkaW5nIG5ldyBvdXRwdXQgdG8gdnVsa2FuaW5mbywgZG8gTk9UIGFkZCBKU09OIG91dHB1dCB1bmxlc3MgdGhlIGZvcm1tYXR0aW5nIGlzIGRlZmluZWQgYnkgYSBzY2hlbWEuCisqIFJ1biB0ZXN0cyB0aGF0IGV4cGxpY2l0bHkgZXhlcmNpc2UgeW91ciBjaGFuZ2VzLgorKiBGZWVsIGZyZWUgdG8gc3ViamVjdCB5b3VyIGNvZGUgY2hhbmdlcyB0byBvdGhlciB0ZXN0cyBhcyB3ZWxsIQorCisjIyMjIENvZGluZyBDb252ZW50aW9ucyBmb3IgW0NNYWtlXShodHRwOi8vY21ha2Uub3JnKSBmaWxlcworCisqIFdoZW4gZWRpdGluZyBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBDTWFrZSwgZm9sbG93IHRoZSBzdHlsZSBjb252ZW50aW9ucyBvZiB0aGUgc3Vycm91bmRpbmcgY29kZS4KKyAgKiBUaGUgY29sdW1uIGxpbWl0IGlzIDEzMi4KKyAgKiBUaGUgaW5kZW50IGlzIDQgc3BhY2VzLgorICAqIENNYWtlIGZ1bmN0aW9ucyBhcmUgbG93ZXItY2FzZS4KKyAgKiBWYXJpYWJsZSBhbmQga2V5d29yZCBuYW1lcyBhcmUgdXBwZXItY2FzZS4KKyogVGhlIGZvcm1hdCBpcyBkZWZpbmVkIGJ5CisgIFtjbWFrZS1mb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaGVzaGlyZWtvdy9jbWFrZV9mb3JtYXQpCisgIHVzaW5nIHRoZSBgLmNtYWtlLWZvcm1hdC5weWAgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSB0byBkZWZpbmUgdGhlIHNldHRpbmdzLgorICBTZWUgdGhlIGNtYWtlLWZvcm1hdCBwYWdlIGZvciBpbmZvcm1hdGlvbiBhYm91dCBpdHMgc2ltcGxlIG1hcmt1cCBmb3IgY29tbWVudHMuCisqIERpc2FibGUgcmVmb3JtYXR0aW5nIG9mIGEgYmxvY2sgb2YgY29tbWVudCBsaW5lcyBieSBpbnNlcnRpbmcKKyAgYSBgIyB+fn5gIGNvbW1lbnQgbGluZSBiZWZvcmUgYW5kIGFmdGVyIHRoYXQgYmxvY2suCisqIERpc2FibGUgYW55IGZvcm1hdHRpbmcgb2YgYSBibG9jayBvZiBsaW5lcyBieSBzdXJyb3VuZGluZyB0aGF0IGJsb2NrIHdpdGgKKyAgYCMgY21ha2UtZm9ybWF0OiBvZmZgIGFuZCBgIyBjbWFrZS1mb3JtYXQ6IG9uYCBjb21tZW50IGxpbmVzLgorKiBUbyBpbnN0YWxsOiBgc3VkbyBwaXAgaW5zdGFsbCBjbWFrZV9mb3JtYXRgCisqIFRvIHJ1bjogYGNtYWtlLWZvcm1hdCAtLWluLXBsYWNlICRGSUxFTkFNRWAKKyogKipJTVBPUlRBTlQgKEp1bmUgMjAxOCkqKiBjbWFrZS1mb3JtYXQgdjAuMy42IGhhcyBhCisgIFtidWddKCBodHRwczovL2dpdGh1Yi5jb20vY2hlc2hpcmVrb3cvY21ha2VfZm9ybWF0L2lzc3Vlcy81MCkKKyAgdGhhdCBjYW4gY29ycnVwdCB0aGUgZm9ybWF0dGluZyBvZiBjb21tZW50IGxpbmVzIGluIENNYWtlIGZpbGVzLgorICBBIHdvcmthcm91bmQgaXMgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBfYmVmb3JlXyBydW5uaW5nIGNtYWtlLWZvcm1hdDoKKyAgYHNlZCAtLWluLXBsYWNlPScnICdzL14gICojLyMvJyAkRklMRU5BTUVgCisKKyMjIyAqKkNvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpKioKKworWW91IHdpbGwgYmUgcHJvbXB0ZWQgd2l0aCBhIG9uZS10aW1lICJjbGljay10aHJvdWdoIiBDTEEgZGlhbG9nIGFzIHBhcnQgb2Ygc3VibWl0dGluZyB5b3VyIHB1bGwgcmVxdWVzdAorb3Igb3RoZXIgY29udHJpYnV0aW9uIHRvIEdpdEh1Yi4KKworIyMjICoqTGljZW5zZSBhbmQgQ29weXJpZ2h0cyoqCisKK0FsbCBjb250cmlidXRpb25zIG1hZGUgdG8gdGhlIFZ1bGthbi1Ub29scyByZXBvc2l0b3J5IGFyZSBLaHJvbm9zIGJyYW5kZWQgYW5kIGFzIHN1Y2gsCithbnkgbmV3IGZpbGVzIG5lZWQgdG8gaGF2ZSB0aGUgS2hyb25vcyBsaWNlbnNlIChBcGFjaGUgMi4wIHN0eWxlKSBhbmQgY29weXJpZ2h0IGluY2x1ZGVkLgorUGxlYXNlIHNlZSBhbiBleGlzdGluZyBmaWxlIGluIHRoaXMgcmVwb3NpdG9yeSBmb3IgYW4gZXhhbXBsZS4KKworQWxsIGNvbnRyaWJ1dGlvbnMgbWFkZSB0byB0aGUgTHVuYXJHIHJlcG9zaXRvcmllcyBhcmUgdG8gYmUgbWFkZSB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlCithbmQgYW55IG5ldyBmaWxlcyBuZWVkIHRvIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBhbnkgYXBwbGljYWJsZSBjb3B5cmlnaHRzLgorCitZb3UgY2FuIGluY2x1ZGUgeW91ciBpbmRpdmlkdWFsIGNvcHlyaWdodCBhZnRlciBhbnkgZXhpc3RpbmcgY29weXJpZ2h0cy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL0dPVkVSTkFOQ0UubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9HT1ZFUk5BTkNFLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmMxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9HT1ZFUk5BTkNFLm1kCkBAIC0wLDAgKzEsNTEgQEAKKyMjIEtocm9ub3MgR3JvdXAgVnVsa2FuLVRvb2xzIFJlcG9zaXRvcnkgTWFuYWdlbWVudAorCisjICoqT3BlbiBTb3VyY2UgUHJvamVjdCCWIE9iamVjdGl2ZXMqKgorCisqIEFzc2lzdCBWdWxrYW4gVXNlcnMKKyAgLSBUaGUgZ29hbCBpcyBmb3IgdG9vbCBhbmQgdXRpbGl0eSBiZWhhdmlvciB0byBhc3Npc3QgaW4gdGhlIGRldmVsb3BtZW50IG9mIHZ1bGthbiBhcHBsaWNhdGlvbnMuCisgICAgLSBbQ29yZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4wL2h0bWwvdmtzcGVjLmh0bWwpCisgICAgLSBbSGVhZGVyIEZpbGVzXShodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vI2hlYWRlcnMpCisgICAgLSBbU0RLIFJlc291cmNlc10oaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbSkKKyogSVNWIEVuYWJsZW1lbnQKKyAgLSBVcGRhdGVzIG9mIHRvb2xzIGFuZCB1dGlsaXRpZXMgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBhIHRpbWVseSBmYXNoaW9uCisgIC0gRXZlcnkgZWZmb3J0IHdpbGwgYmUgbWFkZSB0byBiZSByZXNwb25zaXZlIHRvIElTViBpc3N1ZXMKKyogQ3Jvc3MgUGxhdGZvcm0gQ29tcGF0aWJpbGl0eQorICAtIEdvb2dsZSBhbmQgTHVuYXJHIGNvbGxhYm9yYXRpb246CisgICAgLSBHb29nbGU6IE1vbml0b3IgZm9yIEFuZHJvaWQKKyAgICAtIEx1bmFyRzogTW9uaXRvciBmb3IgZGVza3RvcCAoV2luZG93cywgTGludXgsIGFuZCBNYWNPUykKKyAgICAtIENvbnRpbnVvdXMgSW50ZWdyYXRpb246IEhXIHRlc3QgZmFybXMgb3BlcmF0ZWQgYnkgR29vZ2xlIGFuZCBMdW5hckcgbW9uaXRvciB2YXJpb3VzIGhhcmR3YXJlL3NvZnR3YXJlIHBsYXRmb3JtcworKiBSZXBvIFF1YWxpdHkKKyAgLSBSZXBvIHJlbWFpbnMgaW4gaGVhbHRoeSBzdGF0ZSB3aXRoIGFsbCB0ZXN0cyBwYXNzaW5nIGFuZCBnb29kLXF1YWxpdHksIGNvbnNpc3RlbnQgY29kZWJhc2UKKyAgLSBDb250aW51b3VzIEludGVncmF0aW9uOiBBbG9uZyB3aXRoIEdpdGh1YiwgSFcgdGVzdCBmYXJtcyBvcGVyYXRlZCBieSBHb29nbGUgYW5kIEx1bmFyRyBwZXJmb3JtIHByZS1jb21taXQgY2xvdWQgdGVzdGluZworb24gcHVsbC1yZXF1ZXN0cworCisjICoqUm9sZXMgYW5kIERlZmluaXRpb25zKioKKyogQ29udHJpYnV0b3IsIENvbW1lbnRlciwgVXNlcgorICAtIFN1Ym1pdHRpbmcgY29udHJpYnV0aW9ucywgY3JlYXRpbmcgaXNzdWVzLCBvciB1c2luZyB0aGUgY29udGVudHMgb2YgdGhlIHJlcG9zaXRvcnkKKyogQXBwcm92ZXIKKyAgLSBFeHBlcmllbmNlZCBwcm9qZWN0IG1lbWJlcnMgd2hvIGhhdmUgbWFkZSBzaWduaWZpY2FudCB0ZWNobmljYWwgY29udHJpYnV0aW9ucworICAtIFdyaXRlIGNvbnRyb2w6IEFwcHJvdmUgcHVsbC9tZXJnZSByZXF1ZXN0cyAodmVyaWZ5IHN1Ym1pc3Npb25zIHZzLiBhY2NlcHRhbmNlIGNyaXRlcmlhKQorKiBUZWNobmljYWwgUHJvamVjdCBMZWFkcworICAtIExlYWQgdGhlIHByb2plY3QgaW4gdGVybXMgb2YgdmVyc2lvbmluZywgcXVhbGl0eSBhc3N1cmFuY2UsIGFuZCBvdmVyYXJjaGluZyBvYmplY3RpdmVzCisgIC0gTW9uaXRvciBnaXRodWIgaXNzdWVzIGFuZCBkcml2ZSB0aW1lbHkgcmVzb2x1dGlvbgorICAtIERlc2lnbmF0ZSBuZXcgYXBwcm92ZXJzCisgIC0gRW5zdXJlIHByb2plY3QgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgUmVhZG1lLCBDb250cmlidXRpbmcgZG9jcywgd2lraSwgZXRjLiwga2VwdCB1cC10by1kYXRlCisgIC0gQWN0IGFzIGEgZmFjaWxpdGF0b3IgaW4gcmVzb2x2aW5nIHRlY2huaWNhbCBjb25mbGljdHMKKyAgLSBJcyBhIHBvaW50LW9mLWNvbnRhY3QgZm9yIHByb2plY3QtcmVsYXRlZCBxdWVzdGlvbnMKKworVGhlIHRlY2huaWNhbCBwcm9qZWN0IGxlYWRzIGZvciB0aGlzIHJlcG9zaXRvcnkgYXJlOgorKiAqKkplcmVteSBLbmlhZ2VyKiogW2plcmVteWtAbHVuYXJnLmNvbV0obWFpbHRvOmplcmVteWtAbHVuYXJnLmNvbSkKKworIyAqKkFjY2VwdGFuY2UgQ3JpdGVyaWEgYW5kIFByb2Nlc3MqKgorICAtIEFsbCBzb3VyY2UgY29kZSB0byBpbmNsdWRlIEtocm9ub3MgY29weXJpZ2h0IGFuZCBsaWNlbnNlIChBcGFjaGUgMi4wKS4KKyAgICAtIEFkZGl0aW9uYWwgY29weXJpZ2h0cyBvZiBjb250cmlidXRvcnMgYXBwZW5kZWQKKyAgLSBDb250cmlidXRpb25zIGFyZSB2aWEgcHVsbCByZXF1ZXN0cworICAgIC0gUHJvamVjdCBsZWFkcyB3aWxsIGFzc2lnbmluZyBhcHByb3ZlcnMgdG8gY29udHJpYnV0b3IgcHVsbCByZXF1ZXN0cworICAgIC0gQXBwcm92ZXJzIGNhbiBzZWxmLWFzc2lnbiB0aGVpciByZXZpZXdlcnMKKyAgICAtIEZvciBjb21wbGV4IG9yIGludmFzaXZlIGNvbnRyaWJ1dGlvbnMsIFByb2plY3QgTGVhZHMgbWF5IHJlcXVlc3QgYXBwcm92YWwgZnJvbSBzcGVjaWZpYyByZXZpZXdlcnMKKyAgICAtIEF0IGxlYXN0IG9uZSByZXZpZXcgYXBwcm92YWwgaXMgcmVxdWlyZWQgdG8gY29tcGxldGUgYSBwdWxsIHJlcXVlc3QKKyAgICAtIFRoZSBnb2FsIGlzIHRvIGJlIHJlc3BvbnNpdmUgdG8gY29udHJpYnV0b3JzIHdoaWxlIGVuc3VyaW5nIGFjY2VwdGFuY2UgY3JpdGVyaWEgaXMgbWV0IGFuZCB0byBmYWNpbGl0YXRlIHRoZWlyIHN1Ym1pc3Npb25zCisgICAgLSBBcHByb3ZhbCBpcyBkZXBlbmRlbnQgdXBvbiBhZGhlcmVuY2UgdG8gdGhlIGd1aWRlbGluZXMgaW4gW0NPTlRSSUJVVElORy5tZF0oQ09OVFJJQlVUSU5HLm1kKSwgYW5kIGFsaWdubWVudCB3aXRoCityZXBvc2l0b3J5IGdvYWxzIG9mIG1haW50YWluYWJpbGl0eSwgY29tcGxldGVuZXNzLCBhbmQgcXVhbGl0eQorICAgIC0gQ29uZmxpY3RzIG9yIHF1ZXN0aW9ucyB3aWxsIHVsdGltYXRlbHkgYmUgcmVzb2x2ZWQgYnkgdGhlIHByb2plY3QgbGVhZHMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL0xJQ0VOU0UudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDI4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9SRUFETUUubWQKQEAgLTAsMCArMSw1NCBAQAorIyBWdWxrYW4gRWNvc3lzdGVtIENvbXBvbmVudHMKKworVGhpcyBwcm9qZWN0IHByb3ZpZGVzIEtocm9ub3Mgb2ZmaWNpYWwgVnVsa2FuIFRvb2xzIGFuZCBVdGlsaXRpZXMgZm9yIFdpbmRvd3MsIExpbnV4LCBBbmRyb2lkLCBhbmQgTWFjT1MuCisKKyMjIENJIEJ1aWxkIFN0YXR1cworfCBQbGF0Zm9ybSB8IEJ1aWxkIFN0YXR1cyB8Cit8Oi0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnwKK3wgTGludXgvQW5kcm9pZCB8IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL0tocm9ub3NHcm91cC9WdWxrYW4tVG9vbHMuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvS2hyb25vc0dyb3VwL1Z1bGthbi1Ub29scykgfAorfCBXaW5kb3dzIHxbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvaHdjMWh5NDE3aGY0MnhuZj9zdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvS2hyb25vc3dlYm1hc3Rlci92dWxrYW4tdG9vbHMvYnJhbmNoL21hc3RlcikgfAorCisKKyMjIEludHJvZHVjdGlvbgorCitUaGlzIHByb2plY3QgcHJvdmlkZXMgVnVsa2FuIHRvb2xzIGFuZCB1dGlsaXRpZXMgdGhhdCBjYW4gYXNzaXN0IGRldmVsb3BtZW50IGJ5IGVuYWJsaW5nIGRldmVsb3BlcnMgdG8KK3ZlcmlmeSB0aGVpciBhcHBsaWNhdGlvbnMgY29ycmVjdCB1c2Ugb2YgdGhlIFZ1bGthbiBBUEkuCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeToKKy0gWypNb2NrIElDRCpdKGljZC8pCistIFsqVmtjdWJlIGFuZCBWa2N1YmUrKyBEZW1vKl0oY3ViZS8pCistIFsqVnVsa2FuSW5mbypdKHZ1bGthbmluZm8vKQorLSBbKldpbmRvd3MgUnVudGltZSpdKHdpbnJ0LykKKworIyMgQ29udGFjdCBJbmZvcm1hdGlvbgorKiBbVG9iaW4gRWhsaXNdKG1haWx0bzp0b2JpbmVAZ29vZ2xlLmNvbSkKKyogW01hcmsgTG9ib2R6aW5za2ldKG1haWx0bzptYXJrQGx1bmFyZy5jb20pCisKKyMjIEluZm9ybWF0aW9uIGZvciBEZXZlbG9waW5nIG9yIENvbnRyaWJ1dGluZzoKKworUGxlYXNlIHNlZSB0aGUgW0NPTlRSSUJVVElORy5tZF0oQ09OVFJJQlVUSU5HLm1kKSBmaWxlIGluIHRoaXMgcmVwb3NpdG9yeSBmb3IgbW9yZSBkZXRhaWxzLgorUGxlYXNlIHNlZSB0aGUgW0dPVkVSTkFOQ0UubWRdKEdPVkVSTkFOQ0UubWQpIGZpbGUgaW4gdGhpcyByZXBvc2l0b3J5IGZvciByZXBvc2l0b3J5IG1hbmFnZW1lbnQgZGV0YWlscy4KKworIyMgSG93IHRvIEJ1aWxkIGFuZCBSdW4KKworW0JVSUxELm1kXShCVUlMRC5tZCkKK0luY2x1ZGVzIGRpcmVjdGlvbnMgZm9yIGJ1aWxkaW5nIGFsbCBjb21wb25lbnRzIGFzIHdlbGwgYXMgcnVubmluZyB0aGUgdmtjdWJlIGRlbW8gYXBwbGljYXRpb25zLgorCisjIyBWZXJzaW9uIFRhZ2dpbmcgU2NoZW1lCisKK1VwZGF0ZXMgdG8gdGhlIGBWdWxrYW4tVG9vbHNgIHJlcG9zaXRvcnkgd2hpY2ggY29ycmVzcG9uZCB0byBhIG5ldyBWdWxrYW4gc3BlY2lmaWNhdGlvbiByZWxlYXNlIGFyZSB0YWdnZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IGB2PGBfYHZlcnNpb25gX2A+YCAoZS5nLiwgYHYxLjEuOTZgKS4KKworKipOb3RlKio6IE1hcmtlZCB2ZXJzaW9uIHJlbGVhc2VzIGhhdmUgdW5kZXJnb25lIHRob3JvdWdoIHRlc3RpbmcgYnV0IGRvIG5vdCBpbXBseSB0aGUgc2FtZSBxdWFsaXR5IGxldmVsIGFzIFNESyB0YWdzLiBTREsgdGFncyBmb2xsb3cgdGhlIGBzZGstPGBfYHZlcnNpb25gX2A+LjxgX2BwYXRjaGBfYD5gIGZvcm1hdCAoZS5nLiwgYHNkay0xLjEuOTIuMGApLgorCitUaGlzIHNjaGVtZSB3YXMgYWRvcHRlZCBmb2xsb3dpbmcgdGhlIDEuMS45NiBWdWxrYW4gc3BlY2lmaWNhdGlvbiByZWxlYXNlLgorCisjIyBMaWNlbnNlCitUaGlzIHdvcmsgaXMgcmVsZWFzZWQgYXMgb3BlbiBzb3VyY2UgdW5kZXIgYSBBcGFjaGUtc3R5bGUgbGljZW5zZSBmcm9tIEtocm9ub3MgaW5jbHVkaW5nIGEgS2hyb25vcyBjb3B5cmlnaHQuCisKK1NlZSBDT1BZUklHSFQudHh0IGZvciBhIGZ1bGwgbGlzdCBvZiBsaWNlbnNlcyB1c2VkIGluIHRoaXMgcmVwb3NpdG9yeS4KKworIyMgQWNrbm93bGVkZ2VtZW50cworV2hpbGUgdGhpcyBwcm9qZWN0IGhhcyBiZWVuIGRldmVsb3BlZCBwcmltYXJpbHkgYnkgTHVuYXJHLCBJbmMuLCB0aGVyZSBhcmUgbWFueSBvdGhlcgorY29tcGFuaWVzIGFuZCBpbmRpdmlkdWFscyBtYWtpbmcgdGhpcyBwb3NzaWJsZTogVmFsdmUgQ29ycG9yYXRpb24sIGZ1bmRpbmcKK3Byb2plY3QgZGV2ZWxvcG1lbnQ7IEdvb2dsZSBwcm92aWRpbmcgc2lnbmlmaWNhbnQgY29udHJpYnV0aW9ucyB0byB0aGUgdmFsaWRhdGlvbiBsYXllcnM7CitLaHJvbm9zIHByb3ZpZGluZyBvdmVyc2lnaHQgYW5kIGhvc3Rpbmcgb2YgdGhlIHByb2plY3QuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwYTVmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImNvbS5leGFtcGxlLlZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzIiBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIiBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgorCisgICAgPCEtLSBUaGlzIGlzIHRoZSBwbGF0Zm9ybSBBUEkgd2hlcmUgTmF0aXZlQWN0aXZpdHkgd2FzIGludHJvZHVjZWQuIC0tPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIzIiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjIzIi8+CisKKyAgICA8IS0tIFRoaXMgLmFwayBoYXMgbm8gSmF2YSBjb2RlIGl0c2VsZiwgc28gc2V0IGhhc0NvZGUgdG8gZmFsc2UuIC0tPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIiBhbmRyb2lkOmRlYnVnZ2FibGU9J2ZhbHNlJz4KKworICAgICAgICA8IS0tIFRoaXMgYWxsb3dzIHdyaXRpbmcgbG9nIGZpbGVzIHRvIHNkY2FyZCAtLT4KKyAgICAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIi8+CisKKyAgICAgICAgPCEtLSBPdXIgYWN0aXZpdHkgaXMgdGhlIGJ1aWx0LWluIE5hdGl2ZUFjdGl2aXR5IGZyYW1ld29yayBjbGFzcy4KKyAgICAgICAgICAgICBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIGludGVncmF0aW5nIHdpdGggb3VyIE5ESyBjb2RlLiAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPCEtLSBUZWxsIE5hdGl2ZUFjdGl2aXR5IHRoZSBuYW1lIG9mIG9yIC5zbyAtLT4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5saWJfbmFtZSIgYW5kcm9pZDp2YWx1ZT0iVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMiLz4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvYnVpbGRfYWxsLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9idWlsZF9hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWNjNDkxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvYnVpbGRfYWxsLnNoCkBAIC0wLDAgKzEsNzMgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaWYgWyAteiAiJHtBTkRST0lEX1NES19IT01FfSIgXTsKK3RoZW4gZWNobyAiUGxlYXNlIHNldCBBTkRST0lEX1NES19IT01FLCBleGl0aW5nIjsgZXhpdCAxOworZWxzZSBlY2hvICJBTkRST0lEX1NES19IT01FIGlzICR7QU5EUk9JRF9TREtfSE9NRX0iOworZmkKKworaWYgWyAteiAiJHtBTkRST0lEX05ES19IT01FfSIgXTsKK3RoZW4gZWNobyAiUGxlYXNlIHNldCBBTkRST0lEX05ES19IT01FLCBleGl0aW5nIjsgZXhpdCAxOworZWxzZSBlY2hvICJBTkRST0lEX05ES19IT01FIGlzICR7QU5EUk9JRF9OREtfSE9NRX0iOworZmkKKworaWYgW1sgJCh1bmFtZSkgPT0gIkxpbnV4IiBdXTsgdGhlbgorICAgIGNvcmVzPSQobnByb2MpIHx8IGVjaG8gNAorZWxpZiBbWyAkKHVuYW1lKSA9PSAiRGFyd2luIiBdXTsgdGhlbgorICAgIGNvcmVzPSQoc3lzY3RsIC1uIGh3Lm5jcHUpIHx8IGVjaG8gNAorZmkKKworZnVuY3Rpb24gZmluZHRvb2woKSB7CisgICAgaWYgW1sgISAkKHR5cGUgLXQgJDEpIF1dOyB0aGVuCisgICAgICAgIGVjaG8gQ29tbWFuZCAkMSBub3QgZm91bmQsIHNlZSAuLi9CVUlMRC5tZDsKKyAgICAgICAgZXhpdCAxOworICAgIGZpCit9CisKKyMgQ2hlY2sgZm9yIGRlcGVuZGVuY2llcworZmluZHRvb2wgYWFwdAorZmluZHRvb2wgemlwYWxpZ24KK2ZpbmR0b29sIGphcnNpZ25lcgorCitzZXQgLWV2CisKK0RFTU9fQlVJTERfRElSPSRQV0QvLi4vY3ViZS9hbmRyb2lkCitlY2hvIERFTU9fQlVJTERfRElSPSIke0RFTU9fQlVJTERfRElSfSIKKworZnVuY3Rpb24gY3JlYXRlX0FQSygpIHsKKyAgICBhYXB0IHBhY2thZ2UgLWYgLU0gQW5kcm9pZE1hbmlmZXN0LnhtbCAtSSAiJEFORFJPSURfU0RLX0hPTUUvcGxhdGZvcm1zL2FuZHJvaWQtMjMvYW5kcm9pZC5qYXIiIC1TIHJlcyAtRiBiaW4vJDEtdW5hbGlnbmVkLmFwayBiaW4vbGlicworICAgICMgdXBkYXRlIHRoaXMgbG9naWMgdG8gZGV0ZWN0IGlmIGtleSBpcyBhbHJlYWR5IHRoZXJlLiAgSWYgc28sIHVzZSBpdCwgb3RoZXJ3aXNlIGNyZWF0ZSBpdC4KKyAgICBqYXJzaWduZXIgLXZlcmJvc2UgLWtleXN0b3JlIH4vLmFuZHJvaWQvZGVidWcua2V5c3RvcmUgLXN0b3JlcGFzcyBhbmRyb2lkIC1rZXlwYXNzIGFuZHJvaWQgIGJpbi8kMS11bmFsaWduZWQuYXBrIGFuZHJvaWRkZWJ1Z2tleQorICAgIHppcGFsaWduIC1mIDQgYmluLyQxLXVuYWxpZ25lZC5hcGsgYmluLyQxLmFwaworfQorCisuL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2ggLS1uby1idWlsZAorCisjCisjIGJ1aWxkIHZrY3ViZSBBUEsKKyMKKygKK3B1c2hkICRERU1PX0JVSUxEX0RJUgorbmRrLWJ1aWxkIC1qICRjb3JlcworbWtkaXIgLXAgJERFTU9fQlVJTERfRElSL2N1YmUvYmluL2xpYnMvbGliCitjcCAtciAkREVNT19CVUlMRF9ESVIvbGlicy8qICRERU1PX0JVSUxEX0RJUi9jdWJlL2Jpbi9saWJzL2xpYi8KK2NkICRERU1PX0JVSUxEX0RJUi9jdWJlCitjcmVhdGVfQVBLIHZrY3ViZQorcG9wZAorKQorCitlY2hvIEJ1aWxkcyBzdWNjZWVkZWQKK2V4aXQgMApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk5NjZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9SRUFETUUubWQKQEAgLTAsMCArMSw0MyBAQAorQnVpbGQgVmFsaWRhdGlvbiBMYXllcnMgd2l0aCBBbmRyb2lkIENNYWtlIFBsdWdpbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorR3JhZGxlIHByb2plY3QgaW4gdGhpcyBkaXJlY3RvcnkgYnVpbGRzIGxheWVycyBpbnRvIEFBUi4KK1RoZSBwcm9qZWN0IGNvdWxkIGJlIGRpcmVjdGx5IGFkZGVkIGludG8gYXBwbGljYXRpb24ncyBncmFkbGUgcHJvamVjdHMuCitbQW5kcm9pZCBTdHVkaW8gMy4wLjArXShodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vaW5kZXguaHRtbCkKK0lTIHJlcXVpcmVkOiBlYXJsaWVyIHZlcnNpb25zIG9ubHkgcHVibGlzaCByZWxlYXNlIGxpYnMgYnkgZGVmYXVsdC4KKworUHJlLXJlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tLS0tLQorQnVpbGQgU2hhZGVyQyBiaW5hcnkKKy0gQnVpbGRpbmcgZnJvbSBHaXRodWIgUmVwbyBzb3VyY2UKKzEuIGNkIGFuZHJvaWQtYnVpbGQKKzIuIC4vdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5zaAorMy4gLi9hbmRyb2lkLWdlbmVyYXRlLnNoCisKK0V4dHJhIFN0ZXBzIGlmIGJ1aWxkaW5nIGZyb20gTkRLJ3Mgc291cmNlIHRyZWUKK2BgYAorICAgY2QgJHt5b3VyIEFORFJPSURfTkRLX1JPT1R9L3NvdXJjZXMvdGhpcmRfcGFydHkvc2hhZGVyYworICAgbmRrLWJ1aWxkICBBUFBfQUJJPWFsbCBBUFBfU1RMPWMrK19zdGF0aWMgTkRLX1RPT0xDSEFJTl9WRVJTSU9OPWNsYW5nIE5ES19QUk9KRUNUX1BBVEg9LiBBUFBfQlVJTERfU0NSSVBUPUFuZHJvaWQubWsgbGlic2hhZGVyY19jb21iaW5lZAorYGBgCisKK0FkZGluZyBsYXllciBtb2R1bGUgaW50byBBbmRyb2lkIFN0dWRpbyBhcHBsaWNhdGlvbiBwcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMS4gYXBwJ3Mgc2V0dGluZ3MuZ3JhZGxlLCBhZGQgCitgYGAKKyAgICBpbmNsdWRlICc6bGF5ZXJMaWInCisgICAgcHJvamVjdCgnOmxheWVyTGliJykucHJvamVjdERpciA9IG5ldyBGaWxlKCcvcGF0aC90by9jbWFrZS9sYXllcmxpYicpCitgYGAKKzIuIGFwcCdzIGJ1aWxkLmdyYWRsZToKK2BgYAorZGVwZW5kZW5jaWVzIHsKKyAgICAvLyBBbmRyb2lkIFN0dWRpbyAzLjAuMCsgaXMgcmVxdWlyZWQKKyAgICBpbXBsZW1lbnRhdGlvbiBwcm9qZWN0KCc6bGF5ZXJMaWInKQorfQorYGBgCitCVUlMRF9JTl9OREsgdmFyaWFibGUgaW4gbGF5ZXJsaWIvQ01ha2VMaXN0cy50eHQgY291bGQgZGV0ZWN0IHdoZXRoZXIgdGhlIHNvdXJjZSBpcworZnJvbSBOREsgb3IgZ2l0aHViIHJlcG8gY2xvbmUsIGFuZCB3b3VsZCBjb25maWd1cmUgdGhlIGZpbGUgcGF0aHMgYWNjb3JkaW5nbHkKKworVGVzdGVkCistLS0tLQorQnVpbGQgb24gTWFjIE9TLCB0ZXN0ZWQgb24gR29vZ2xlIFBpeGVsIFhMIHdpdGggQW5kcm9pZCBPcmVvLgorRXF1dmlsYWVudCBidWlsZCBzY3JpcHRzIGZvciBXaW5kb3dzIE9TIGFyZSBhdCB0aGUgc2FtZSBkaXJlY3RvcnkuCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvQ01ha2VMaXN0cy50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODFlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTIyIEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMy40LjEpCisKKyMgVmFsaWRhdGlvbiBsYXllcnMgY291bGQgYmUgYnVpbHQgd2l0aCBjb2RlIGZyb20KKyMgICAgZ2l0aHViIHJlcG8gICBPUgorIyAgICBuZGsncyBzbmFwc2hvdAorIyBUaGUgZmlsZSBzdHJ1Y3R1cmUgZm9yIGdsc2xhbmcgc3Bpci1WIGlzIGRpZmZlcmVudCwgYWRkaW5nIEJVSUxEX0lOX05ESyB2YXJpYWJsZQorc2V0KEJVSUxEX0lOX05ESyBPRkYpCitpZiAoQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIE1BVENIRVMgInNvdXJjZXMvdGhpcmRfcGFydHkvdnVsa2FuL3NyYyIpCisgICAgc2V0KEJVSUxEX0lOX05ESyBPTikKK2VuZGlmKCkKKworc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1zdGQ9YysrMTEgLVdhbGwgLVdlcnJvciBcCisgICAgICAgIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIC1Xbm8tdW51c2VkLWNvbnN0LXZhcmlhYmxlIFwKKyAgICAgICAgLVduby1jKys5OC1jb21wYXQtcGVkYW50aWMgLURWS19QUk9UT1RZUEVTIFwKKyAgICAgICAgLURWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIiKQorCitpZiAoQlVJTERfSU5fTkRLKQorICAgICMgTkRLIGRpcmVjdG9yeSBzdHJ1Y3R1cmU6CisgICAgIyAgJEFORFJPSURfTkRLL3NvdXJjZXMvdGhpcmRfcGFydHkvCisgICAgIyAgICAgICAgdnVsa2FuL3NyYworICAgICMgICAgICAgIHNoYWRlcmMvdGhpcmRfcGFydHkgKGZvciBnbHNsYW5nICYgc3BpcnYtdG9vbHMgKQorICAgICMgdGhpcyBidWlsZCB1c2VzIGNvbWJpbmVkIGxpYiBsaWJzaGFkZXJjLmEgZm9yIGxpYlNQSVJWLVRvb2xzLmEgcHVycG9zZQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoU1JDX0RJUgorICAgICAgICAiJHtBTkRST0lEX05ES30vc291cmNlcy90aGlyZF9wYXJ0eS92dWxrYW4vc3JjIiBBQlNPTFVURSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEVYVEVSTkFMX0RJUgorICAgICAgICAiJHtTUkNfRElSfS8uLi8uLi9zaGFkZXJjL3RoaXJkX3BhcnR5IiBBQlNPTFVURSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KFNQSVJWX0xJQgorICAgICAgICAiJHtTUkNfRElSfS8uLi8uLi9zaGFkZXJjL2xpYnMvJHtBTkRST0lEX1NUTH0vJHtBTkRST0lEX0FCSX0vbGlic2hhZGVyYy5hIgorICAgICAgICBBQlNPTFVURSkKK2Vsc2UgKCkKKyAgICAjIGdpdGh1YiBkaXJlY3Rvcnkgc3RydWN0dXJlOgorICAgICMgICAke1NSQ19ESVJ9CisgICAgIyAgICR7U1JDX0RJUn0vYnVpbGQtYW5kcm9pZC9leHRlcm5hbCAoZm9yIGdsc2xhbmcsIHNwaXJ2LXRvb2xzICYgc2hhZGVyYyApCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChTUkNfRElSICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4iICBBQlNPTFVURSkKKyAgICBzZXQoRVhURVJOQUxfRElSICIke1NSQ19ESVJ9L2J1aWxkLWFuZHJvaWQvdGhpcmRfcGFydHkvc2hhZGVyYy90aGlyZF9wYXJ0eSIpCisgICAgc2V0KFNQSVJWX0xJQgorICAgICAgICAiJHtTUkNfRElSfS9idWlsZC1hbmRyb2lkL3RoaXJkX3BhcnR5L3NoYWRlcmMvYW5kcm9pZF90ZXN0L29iai9sb2NhbC8ke0FORFJPSURfQUJJfS9saWJTUElSVi1Ub29scy5hIikKK2VuZGlmKCkKK3NldChDT01NT05fRElSICIke1NSQ19ESVJ9L2J1aWxkLWFuZHJvaWQvZ2VuZXJhdGVkIikKKworc2V0KENNQUtFX0NYWF9jbG9uZSAiJHtDTUFLRV9DWFhfRkxBR1N9IikKK3NldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtRFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiBcCisgICAgICAgIC1mdmlzaWJpbGl0eT1oaWRkZW4iKQoraW5jbHVkZV9kaXJlY3Rvcmllcygke1NSQ19ESVJ9L2luY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgJHtDT01NT05fRElSfS9pbmNsdWRlCisgICAgICAgICAgICAgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzCisgICAgICAgICAgICAgICAgICAgICR7U1JDX0RJUn0vbG9hZGVyKQorYWRkX2xpYnJhcnkobGF5ZXJfdXRpbHMgU1RBVElDCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL3ZrX2xheWVyX2NvbmZpZy5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy92a19sYXllcl91dGlscy5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvdmtfZm9ybWF0X3V0aWxzLmNwcCkKK3NldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX2Nsb25lfSIpCisKKyMgYXNzdW1lIHNoYWRlcmMgYWxyZWFkeSBidWlsdCBleHRlcm5hbGx5CithZGRfbGlicmFyeShTUElSVi1Ub29scy1wcmVidWlsdCBTVEFUSUMgSU1QT1JURUQpCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoU1BJUlYtVG9vbHMtcHJlYnVpbHQgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTgorICAgICR7U1BJUlZfTElCfSkKKworIyBidWlsZCBjb3JlX3ZhbGlkYXRpb24gbGF5ZXJzIHdoaWNoIGluY2x1ZGluZyBzaGFkZXIgdmFsaWRhdGlvbgorc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1EVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSIFwKKyAgICAgICAgICAgICAgICAgICAgIC1mdmlzaWJpbGl0eT1oaWRkZW4iKQorYWRkX2xpYnJhcnkoVmtMYXllcl9jb3JlX3ZhbGlkYXRpb24gU0hBUkVECisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbi5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvZGVzY3JpcHRvcl9zZXRzLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy9idWZmZXJfdmFsaWRhdGlvbi5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvc2hhZGVyX3ZhbGlkYXRpb24uY3BwCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL3ZrX2xheWVyX3RhYmxlLmNwcAorCSR7U1JDX0RJUn0vbGF5ZXJzL3h4aGFzaC5jKQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoVmtMYXllcl9jb3JlX3ZhbGlkYXRpb24gUFJJVkFURQorICAgICAgICAke1NSQ19ESVJ9L2luY2x1ZGUKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMKKyAgICAgICAgJHtDT01NT05fRElSfS9pbmNsdWRlCisgICAgICAgICR7U1JDX0RJUn0vbG9hZGVyCisgICAgICAgICR7RVhURVJOQUxfRElSfS9nbHNsYW5nCisgICAgICAgICR7RVhURVJOQUxfRElSfS9zcGlydi10b29scy9pbmNsdWRlKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFZrTGF5ZXJfY29yZV92YWxpZGF0aW9uIFBSSVZBVEUKKyAgICAgICAgbG9nIGxheWVyX3V0aWxzIFNQSVJWLVRvb2xzLXByZWJ1aWx0KQorCithZGRfbGlicmFyeShWa0xheWVyX3BhcmFtZXRlcl92YWxpZGF0aW9uIFNIQVJFRAorICAgICAgICAke0NPTU1PTl9ESVJ9L2luY2x1ZGUvcGFyYW1ldGVyX3ZhbGlkYXRpb24uY3BwCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL3BhcmFtZXRlcl92YWxpZGF0aW9uX3V0aWxzLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy92a19sYXllcl90YWJsZS5jcHApCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWa0xheWVyX3BhcmFtZXRlcl92YWxpZGF0aW9uIFBSSVZBVEUKKyAgICAgICAgJHtTUkNfRElSfS9pbmNsdWRlCisgICAgICAgICR7Q09NTU9OX0RJUn0vaW5jbHVkZQorICAgICAgICAke1NSQ19ESVJ9L2xheWVycworICAgICAgICAke1NSQ19ESVJ9L2xvYWRlcikKK3RhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyX3BhcmFtZXRlcl92YWxpZGF0aW9uIFBSSVZBVEUgbG9nIGxheWVyX3V0aWxzKQorCithZGRfbGlicmFyeShWa0xheWVyX29iamVjdF90cmFja2VyIFNIQVJFRAorICAgICAgICAke0NPTU1PTl9ESVJ9L2luY2x1ZGUvb2JqZWN0X3RyYWNrZXIuY3BwCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL29iamVjdF90cmFja2VyX3V0aWxzLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy92a19sYXllcl90YWJsZS5jcHApCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWa0xheWVyX29iamVjdF90cmFja2VyIFBSSVZBVEUKKyAgICAgICAgJHtTUkNfRElSfS9pbmNsdWRlCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzCisgICAgICAgICR7Q09NTU9OX0RJUn0vaW5jbHVkZQorICAgICAgICAke1NSQ19ESVJ9L2xvYWRlcikKK3RhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyX29iamVjdF90cmFja2VyIFBSSVZBVEUgbG9nIGxheWVyX3V0aWxzKQorCithZGRfbGlicmFyeShWa0xheWVyX3RocmVhZGluZyBTSEFSRUQKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvdGhyZWFkaW5nLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy92a19sYXllcl90YWJsZS5jcHApCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWa0xheWVyX3RocmVhZGluZyBQUklWQVRFCisgICAgICAgICR7U1JDX0RJUn0vaW5jbHVkZQorICAgICAgICAke1NSQ19ESVJ9L2xheWVycworICAgICAgICAke0NPTU1PTl9ESVJ9L2luY2x1ZGUKKyAgICAgICAgJHtTUkNfRElSfS9sb2FkZXIpCit0YXJnZXRfbGlua19saWJyYXJpZXMoVmtMYXllcl90aHJlYWRpbmcgUFJJVkFURSBsb2cgbGF5ZXJfdXRpbHMpCisKK2FkZF9saWJyYXJ5KFZrTGF5ZXJfdW5pcXVlX29iamVjdHMgU0hBUkVECisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL3VuaXF1ZV9vYmplY3RzLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy92a19sYXllcl90YWJsZS5jcHApCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWa0xheWVyX3VuaXF1ZV9vYmplY3RzIFBSSVZBVEUKKyAgICAgICAgJHtTUkNfRElSfS9pbmNsdWRlCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzCisgICAgICAgICR7Q09NTU9OX0RJUn0vaW5jbHVkZQorICAgICAgICAke1NSQ19ESVJ9L2xvYWRlcikKK3RhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyX3VuaXF1ZV9vYmplY3RzIFBSSVZBVEUgbG9nIGxheWVyX3V0aWxzKQorCitzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9jbG9uZX0iKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9idWlsZC5ncmFkbGUgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODlkMjMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSwzMiBAQAorYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQubGlicmFyeScKKworYW5kcm9pZCB7CisgICAgLyoKKyAgICAgKiBSZXF1aXJlZDogQW5kcm9pZCBTdHVkaW8gMy4wLjArIQorICAgICAqLworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDI1CisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgbWluU2RrVmVyc2lvbiAyNAorICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDI0CisgICAgICAgIHZlcnNpb25Db2RlIDEKKyAgICAgICAgdmVyc2lvbk5hbWUgIjEuMCIKKyAgICAgICAgbmRrLmFiaUZpbHRlcnMgJ2FybWVhYmktdjdhJywgJ2FybTY0LXY4YScsICd4ODYnLCAneDg2XzY0JworICAgICAgICBleHRlcm5hbE5hdGl2ZUJ1aWxkIHsKKyAgICAgICAgICAgIGNtYWtlLmFyZ3VtZW50cyAnLURBTkRST0lEX1RPT0xDSEFJTj1jbGFuZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1EQU5EUk9JRF9TVEw9YysrX3N0YXRpYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1EQU5EUk9JRF9QTEFURk9STT1hbmRyb2lkLTI0JworICAgICAgICB9CisgICAgfQorICAgIGV4dGVybmFsTmF0aXZlQnVpbGQgeworICAgICAgICBjbWFrZS5wYXRoICdDTWFrZUxpc3RzLnR4dCcKKyAgICB9CisgICAgYnVpbGRUeXBlcyB7CisgICAgICAgIHJlbGVhc2UgeworICAgICAgICAgICAgbWluaWZ5RW5hYmxlZCBmYWxzZQorICAgICAgICAgICAgcHJvZ3VhcmRGaWxlcyBnZXREZWZhdWx0UHJvZ3VhcmRGaWxlKCdwcm9ndWFyZC1hbmRyb2lkLnR4dCcpLAorICAgICAgICAgICAgICAgICAgICAncHJvZ3VhcmQtcnVsZXMucHJvJworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL3Byb2d1YXJkLXJ1bGVzLnBybyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvcHJvZ3VhcmQtcnVsZXMucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWZlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL3Byb2d1YXJkLXJ1bGVzLnBybwpAQCAtMCwwICsxLDE3IEBACisjIEFkZCBwcm9qZWN0IHNwZWNpZmljIFByb0d1YXJkIHJ1bGVzIGhlcmUuCisjIEJ5IGRlZmF1bHQsIHRoZSBmbGFncyBpbiB0aGlzIGZpbGUgYXJlIGFwcGVuZGVkIHRvIGZsYWdzIHNwZWNpZmllZAorIyBpbiAke0FORFJPSURfU0RLfS90b29scy9wcm9ndWFyZC9wcm9ndWFyZC1hbmRyb2lkLnR4dAorIyBZb3UgY2FuIGVkaXQgdGhlIGluY2x1ZGUgcGF0aCBhbmQgb3JkZXIgYnkgY2hhbmdpbmcgdGhlIHByb2d1YXJkRmlsZXMKKyMgZGlyZWN0aXZlIGluIGJ1aWxkLmdyYWRsZS4KKyMKKyMgRm9yIG1vcmUgZGV0YWlscywgc2VlCisjICAgaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL3Byb2d1YXJkLmh0bWwKKworIyBBZGQgYW55IHByb2plY3Qgc3BlY2lmaWMga2VlcCBvcHRpb25zIGhlcmU6CisKKyMgSWYgeW91ciBwcm9qZWN0IHVzZXMgV2ViVmlldyB3aXRoIEpTLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZworIyBhbmQgc3BlY2lmeSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gdGhlIEphdmFTY3JpcHQgaW50ZXJmYWNlCisjIGNsYXNzOgorIy1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzIGZxY24ub2YuamF2YXNjcmlwdC5pbnRlcmZhY2UuZm9yLndlYnZpZXcgeworIyAgIHB1YmxpYyAqOworI30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMzNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsOSBAQAorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5sYXllcmxpYiI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDphbGxvd0JhY2t1cD0idHJ1ZSIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIKKyAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1J0bD0idHJ1ZSI+CisKKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjgzODkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzIEBACis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPkxheWVyIExpYnJhcnk8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9nbHNsYW5nX3JldmlzaW9uX2FuZHJvaWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2dsc2xhbmdfcmV2aXNpb25fYW5kcm9pZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQzODkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9nbHNsYW5nX3JldmlzaW9uX2FuZHJvaWQKQEAgLTAsMCArMSBAQAorMjNlYTNkYjNlNWVhMTZiNDk2NGU5ZTNiNWZlZTg4YmZjMjY3ZmM1NwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9nbHNsYW5nX3VybF9hbmRyb2lkIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9nbHNsYW5nX3VybF9hbmRyb2lkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjEwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2dsc2xhbmdfdXJsX2FuZHJvaWQKQEAgLTAsMCArMSBAQAoraHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbHNsYW5nLmdpdApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9pbnN0YWxsX2FsbC5zaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvaW5zdGFsbF9hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjJlY2Q5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvaW5zdGFsbF9hbGwuc2gKQEAgLTAsMCArMSw3NiBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgLWUKKworIworIyBQYXJzZSBwYXJhbWV0ZXJzCisjCisKK2Z1bmN0aW9uIHByaW50VXNhZ2UgeworICAgZWNobyAiU3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlOiIKKyAgIGVjaG8gIiAgICAtc3wtLXNlcmlhbCA8dGFyZ2V0IGRldmljZSBzZXJpYWwgbnVtYmVyPiAob3B0aW9uYWwpIgorICAgZWNobworICAgZWNobyAiaS5lLiAkezAjIyovfSAtcyA8c2VyaWFsIG51bWJlcj4iCisgICBleGl0IDEKK30KKworaWYgW1sgJCgoJCMgJSAyKSkgLW5lIDAgXV0KK3RoZW4KKyAgICBlY2hvIFBhcmFtZXRlcnMgbXVzdCBiZSBwcm92aWRlZCBpbiBwYWlycy4KKyAgICBlY2hvIHBhcmFtZXRlciBjb3VudCA9ICQjCisgICAgZWNobworICAgIHByaW50VXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKK3doaWxlIFtbICQjIC1ndCAwIF1dCitkbworICAgIGNhc2UgJDEgaW4KKyAgICAgICAgLXN8LS1zZXJpYWwpCisgICAgICAgICAgICAjIGluY2x1ZGUgdGhlIGZsYWcsIGJlY2F1c2Ugd2UgbmVlZCB0byBsZWF2ZSBpdCBvZmYgaWYgbm90IHByb3ZpZGVkCisgICAgICAgICAgICBzZXJpYWw9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLSopCisgICAgICAgICAgICAjIHVua25vd24gb3B0aW9uCisgICAgICAgICAgICBlY2hvIFVua25vd24gb3B0aW9uOiAkMQorICAgICAgICAgICAgZWNobworICAgICAgICAgICAgcHJpbnRVc2FnZQorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworaWYgW1sgJHNlcmlhbCBdXTsgdGhlbgorICAgIGVjaG8gc2VyaWFsID0gIiR7c2VyaWFsfSIKKyAgICBzZXJpYWxGbGFnPSItcyAkc2VyaWFsIgorICAgIGlmIFtbICQoYWRiIGRldmljZXMpICE9ICoiJHNlcmlhbCIqIF1dCisgICAgdGhlbgorICAgICAgICBlY2hvIERldmljZSBub3QgZm91bmQ6ICIke3NlcmlhbH0iCisgICAgICAgIGVjaG8KKyAgICAgICAgcHJpbnRVc2FnZQorICAgICAgICBleGl0IDEKKyAgICBmaQorZWxzZQorICAgIGVjaG8gVXNpbmcgZGV2aWNlICQoYWRiIGdldC1zZXJpYWxubykKK2ZpCisKKyMgSW5zdGFsbCBldmVyeXRoaW5nIGJ1aWx0IGJ5IGJ1aWxkX2FsbC5zaAorZWNobyAiYWRiICRzZXJpYWxGbGFnIGluc3RhbGwgLXIgLi4vY3ViZS9hbmRyb2lkL2N1YmUvYmluL3ZrY3ViZS5hcGsiCithZGIgJHNlcmlhbEZsYWcgaW5zdGFsbCAtciAuLi9jdWJlL2FuZHJvaWQvY3ViZS9iaW4vdmtjdWJlLmFwaworCitleGl0ICQ/CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2puaS9BbmRyb2lkLm1rIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRmNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9qbmkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIwIEBACisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFZhbHZlIENvcnBvcmF0aW9uCisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitTUkNfRElSIDo9IC4uLy4uCisKKyQoY2FsbCBpbXBvcnQtbW9kdWxlLGFuZHJvaWQvbmF0aXZlX2FwcF9nbHVlKQorJChjYWxsIGltcG9ydC1tb2R1bGUsdGhpcmRfcGFydHkvc2hhZGVyYykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvam5pL0FwcGxpY2F0aW9uLm1rIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9qbmkvQXBwbGljYXRpb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwYTM1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvam5pL0FwcGxpY2F0aW9uLm1rCkBAIC0wLDAgKzEsMjAgQEAKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0FQUF9BQkkgOj0gYXJtZWFiaS12N2EgYXJtNjQtdjhhIHg4NiB4ODZfNjQKK0FQUF9QTEFURk9STSA6PSBhbmRyb2lkLTIyCitBUFBfU1RMIDo9IGMrK19zdGF0aWMKK05ES19UT09MQ0hBSU5fVkVSU0lPTiA6PSBjbGFuZworTkRLX01PRFVMRV9QQVRIIDo9IC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvam5pL3NoYWRlcmMvQXBwbGljYXRpb24ubWsgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2puaS9zaGFkZXJjL0FwcGxpY2F0aW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDc0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL2puaS9zaGFkZXJjL0FwcGxpY2F0aW9uLm1rCkBAIC0wLDAgKzEsNCBAQAorQVBQX0FCSSA6PSBhbGwKK0FQUF9CVUlMRF9TQ1JJUFQgOj0gQW5kcm9pZC5taworQVBQX1NUTCA6PSBjKytfc3RhdGljCitBUFBfUExBVEZPUk0gOj0gYW5kcm9pZC0yMwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjcxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0czwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc2hhZGVyY19yZXZpc2lvbl9hbmRyb2lkIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9zaGFkZXJjX3JldmlzaW9uX2FuZHJvaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1YmM4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc2hhZGVyY19yZXZpc2lvbl9hbmRyb2lkCkBAIC0wLDAgKzEgQEAKKzU2M2JjNmU4N2E0M2MzOGI1NDk1NDY5MzA3OTIyYzc2OGVkYmQxOTEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc2hhZGVyY191cmxfYW5kcm9pZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc2hhZGVyY191cmxfYW5kcm9pZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODhhMWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9zaGFkZXJjX3VybF9hbmRyb2lkCkBAIC0wLDAgKzEgQEAKK2h0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvc2hhZGVyYy5naXQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc3BpcnYtaGVhZGVyc19yZXZpc2lvbl9hbmRyb2lkIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9zcGlydi1oZWFkZXJzX3JldmlzaW9uX2FuZHJvaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjYzhlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc3BpcnYtaGVhZGVyc19yZXZpc2lvbl9hbmRyb2lkCkBAIC0wLDAgKzEgQEAKK2NlMzA5MjAzZDdlY2VhZjkwOGJlYTg4NjJjMjdmM2UwNzQ5ZjdkMDAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc3BpcnYtaGVhZGVyc191cmxfYW5kcm9pZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc3BpcnYtaGVhZGVyc191cmxfYW5kcm9pZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzcyMTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9zcGlydi1oZWFkZXJzX3VybF9hbmRyb2lkCkBAIC0wLDAgKzEgQEAKK2h0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvU1BJUlYtSGVhZGVycy5naXQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc3BpcnYtdG9vbHNfcmV2aXNpb25fYW5kcm9pZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc3BpcnYtdG9vbHNfcmV2aXNpb25fYW5kcm9pZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAzM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC9zcGlydi10b29sc19yZXZpc2lvbl9hbmRyb2lkCkBAIC0wLDAgKzEgQEAKKzVkNDQyZmFkMmYwMGZjY2E4MzU0YWFhYTliZmQzNmJlOGM0MThhMWIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvc3BpcnYtdG9vbHNfdXJsX2FuZHJvaWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL3NwaXJ2LXRvb2xzX3VybF9hbmRyb2lkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2NhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL3NwaXJ2LXRvb2xzX3VybF9hbmRyb2lkCkBAIC0wLDAgKzEgQEAKK2h0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvU1BJUlYtVG9vbHMuZ2l0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL3Rlc3RfQVBLLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC90ZXN0X0FQSy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MDFiMTZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC90ZXN0X0FQSy5zaApAQCAtMCwwICsxLDIzOSBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIFBhcnNlIHBhcmFtZXRlcnMKKyMKKworZnVuY3Rpb24gcHJpbnRVc2FnZSB7CisgICBlY2hvICJTdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmU6IgorICAgZWNobyAiICAgIC1wfC0tcGxhdGZvcm0gPHBsYXRmb3JtPiAob3B0aW9uYWwpIgorICAgZWNobyAiICAgIC1mfC0tZmlsdGVyIDxndGVzdCBmaWx0ZXIgbGlzdD4gKG9wdGlvbmFsKSIKKyAgIGVjaG8gIiAgICAtc3wtLXNlcmlhbCA8dGFyZ2V0IGRldmljZSBzZXJpYWwgbnVtYmVyPiAob3B0aW9uYWwpIgorICAgZWNobworICAgZWNobyAiaS5lLiAkezAjIyovfSAtcCA8cGxhdGZvcm0+IC1mIDx0ZXN0IGZpbHRlcj4gLXMgPHNlcmlhbCBudW1iZXI+IgorICAgZXhpdCAxCit9CisKK2lmIFtbICQoKCQjICUgMikpIC1uZSAwIF1dCit0aGVuCisgICAgZWNobyBQYXJhbWV0ZXJzIG11c3QgYmUgcHJvdmlkZWQgaW4gcGFpcnMuCisgICAgZWNobyBwYXJhbWV0ZXIgY291bnQgPSAkIworICAgIGVjaG8KKyAgICBwcmludFVzYWdlCisgICAgZXhpdCAxCitmaQorCit3aGlsZSBbWyAkIyAtZ3QgMCBdXQorZG8KKyAgICBjYXNlICQxIGluCisgICAgICAgIC1wfC0tcGxhdGZvcm0pCisgICAgICAgICAgICBwbGF0Zm9ybT0iJDIiCisgICAgICAgICAgICBzaGlmdCAyCisgICAgICAgICAgICA7OworICAgICAgICAtZnwtLWZpbHRlcikKKyAgICAgICAgICAgIGZpbHRlcj0iJDIiCisgICAgICAgICAgICBzaGlmdCAyCisgICAgICAgICAgICA7OworICAgICAgICAtc3wtLXNlcmlhbCkKKyAgICAgICAgICAgIHNlcmlhbD0iJDIiCisgICAgICAgICAgICBzaGlmdCAyCisgICAgICAgICAgICA7OworICAgICAgICAtKikKKyAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KKyAgICAgICAgICAgIGVjaG8gVW5rbm93biBvcHRpb246ICQxCisgICAgICAgICAgICBlY2hvCisgICAgICAgICAgICBwcmludFVzYWdlCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorCitpZiBbWyAkc2VyaWFsIF1dOyB0aGVuCisgICAgc2VyaWFsRmxhZz0iLXMgJHNlcmlhbCIKKyAgICBpZiBbWyAkKGFkYiBkZXZpY2VzKSAhPSAqIiRzZXJpYWwiKiBdXQorICAgIHRoZW4KKyAgICAgICAgZWNobyBEZXZpY2Ugbm90IGZvdW5kOiAiJHtzZXJpYWx9IgorICAgICAgICBlY2hvCisgICAgICAgIHByaW50VXNhZ2UKKyAgICAgICAgZXhpdCAxCisgICAgZmkKK2Vsc2UKKyAgICBlY2hvIFVzaW5nIGRldmljZSAkKGFkYiBnZXQtc2VyaWFsbm8pCitmaQorCitpZiBbWyAteiAkcGxhdGZvcm0gXV0KK3RoZW4KKyAgICBlY2hvIE5vIHBsYXRmb3JtIHNwZWNpZmllZC4KKyAgICBwbGF0Zm9ybT0iVW5zcGVjaWZpZWRQbGF0Zm9ybSIKK2ZpCisKK2lmIFtbIC16ICRmaWx0ZXIgXV0KK3RoZW4KKyAgICBlY2hvIE5vIGZpbHRlciBzcGVjaWZpZWQsIHJ1bm5pbmcgYWxsIHRlc3RzLgorICAgIGZpbHRlcj0iKiIKK2ZpCisKK2lmIFtbICRwbGF0Zm9ybSBdXTsgdGhlbiBlY2hvIHBsYXRmb3JtID0gIiR7cGxhdGZvcm19IjsgZmkKK2lmIFtbICRmaWx0ZXIgXV07IHRoZW4gZWNobyBmaWx0ZXIgPSAiJHtmaWx0ZXJ9IjsgZmkKK2lmIFtbICRzZXJpYWwgXV07IHRoZW4gZWNobyBzZXJpYWwgPSAiJHtzZXJpYWx9IjsgZmkKKworc2V0IC1ldgorCisjCisjIFN0YXJ0IHVwCisjCisKKyMgV2FrZSB1cCB0aGUgZGV2aWNlCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgaW5wdXQga2V5ZXZlbnQgIktFWUNPREVfTUVOVSIKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBpbnB1dCBrZXlldmVudCAiS0VZQ09ERV9IT01FIgorCisjIEdyYWIgb3VyIEFuZHJvaWQgdGVzdCBtdXRleAorIyBXYWl0IGZvciBhbnkgZXhpc3RpbmcgdGVzdCBydW5zIG9uIHRoZSBkZXZpY2VzCisKKyMgQmxvdyBhd2F5IHRoZSBsb2NrIGlmIHRlc3RzIHJ1biB0b28gbG9uZywgYXZvaWRpbmcgaW5maW5pdGUgbG9vcAorbG9ja19zZWNvbmRzPTEyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRHVyYXRpb24gaW4gc2Vjb25kcy4KK2xvY2tfZW5kX3RpbWU9JCgoICQoZGF0ZSArJXMpICsgbG9ja19zZWNvbmRzICkpICAjIENhbGN1bGF0ZSBlbmQgdGltZS4KKwordW50aWwgbWtkaXIgL3Zhci90bXAvVmtMYXllclZhbGlkYXRpb25UZXN0cy4kc2VyaWFsLmxvY2sKK2RvCisgICAgc2xlZXAgNQorICAgIGVjaG8gIldhaXRpbmcgZm9yIGV4aXN0aW5nIEFuZHJvaWQgdGVzdCB0byBjb21wbGV0ZSBvbiAkc2VyaWFsIgorCisgICAgaWYgWyAkKGRhdGUgKyVzKSAtZ3QgJGxvY2tfZW5kX3RpbWUgXQorICAgIHRoZW4KKyAgICAgICAgZWNobyAiTG9jayB0aW1lb3V0IHJlYWNoZWQ6ICRsb2NrX3NlY29uZHMgc2Vjb25kcyIKKyAgICAgICAgZWNobyAiRGVsZXRpbmcgL3Zhci90bXAvVmtMYXllclZhbGlkYXRpb25UZXN0cy4kc2VyaWFsLmxvY2siCisgICAgICAgIHJtIC1yIC92YXIvdG1wL1ZrTGF5ZXJWYWxpZGF0aW9uVGVzdHMuJHNlcmlhbC5sb2NrCisgICAgZmkKK2RvbmUKKworIyBDbGVhbiB1cCBvdXIgbG9jayBvbiBhbnkgZXhpdCBjb25kaXRpb24KK2Z1bmN0aW9uIGZpbmlzaCB7CisgICBybSAtciAvdmFyL3RtcC9Wa0xheWVyVmFsaWRhdGlvblRlc3RzLiRzZXJpYWwubG9jaworfQordHJhcCBmaW5pc2ggRVhJVAorCisjIENsZWFyIHRoZSBsb2cKK2FkYiAkc2VyaWFsRmxhZyBsb2djYXQgLWMKKworIyBFbnN1cmUgYW55IHByZXZpb3VzIGFjdGl2aXR5IGhhcyBzdG9wcGVkLCBvdGhlcndpc2UgaXQgd29uJ3QgcnVuIHRlc3RzCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgYW0gZm9yY2Utc3RvcCBjb20uZXhhbXBsZS5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cworCisjIFJlbW92ZSBhbnkgZXhpc3RpbmcgQVBLIHRoYXQgbWF5IGhhdmUgYmVlbiBpbnN0YWxsZWQgZnJvbSBhbm90aGVyIGhvc3QKKyMgRGlzYWJsZSBleGl0IG9uIGVycm9yIGluIGNhc2UgdGhlIEFQSyBpcyBub3QgcHJlc2VudAorc2V0ICtlCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgcG0gbGlzdCBwYWNrYWdlcyB8IGdyZXAgY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMKK2lmIFsgJD8gLWVxIDAgXQordGhlbgorICAgIGFkYiAkc2VyaWFsRmxhZyB1bmluc3RhbGwgY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMKK2ZpCisjIFJlLWVuYWJsZSBleGl0IG9uIGVycm9yCitzZXQgLWUKKworIyBJbnN0YWxsIHRoZSBjdXJyZW50IGJ1aWxkCithZGIgJHNlcmlhbEZsYWcgaW5zdGFsbCAtciBiaW4vVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMuYXBrCisKKyMgS2ljayBvZmYgdGhlIHRlc3RzIHdpdGgga25vd24gZXhwZWN0aW9uIGxpc3QKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBhbSBzdGFydCAtYSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiAtYyBhbmRyb2lkLWludGVudC5jYXRlZ29yeS5MQVVOQ0ggLW4gY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMvYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkgLS1lcyBhcmdzIC0tZ3Rlc3RfZmlsdGVyPSIke2ZpbHRlcn0iCisKKyMKKyMgU2NyYXBlIHRoZSBsb2cgdW50aWwgd2UgZ2V0IHBhc3MvZmFpbC9jcmFzaAorIworCisjIFRoZSBmb2xsb3dpbmcgbG9vcCB3aWxsIGdpdmUgdGVzdHMgMjAgbWludXRlcyB0byBwYXNzL2ZhaWwvY3Jhc2gKK3NlY29uZHM9MTIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEdXJhdGlvbiBpbiBzZWNvbmRzLgorZW5kVGltZT0kKCggJChkYXRlICslcykgKyBzZWNvbmRzICkpICAjIENhbGN1bGF0ZSBlbmQgdGltZS4KKworZXhpdENvZGU9LTE7CisKKyMgRGlzYWJsZSBleGl0IG9uIGVycm9yLCB3ZSBleHBlY3QgZ3JlcCB0byBmYWlsIG11bHRpcGxlIHRpbWVzIGluIHRoaXMgbG9vcAorc2V0ICtlCisKK3doaWxlIFsgJChkYXRlICslcykgLWx0ICRlbmRUaW1lIF07IGRvICAjIExvb3AgdW50aWwgaW50ZXJ2YWwgaGFzIGVsYXBzZWQuCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBwcmludGVkIGZyb20gYW5kcm9pZF9tYWluIG9uIHN1Y2Nlc3MKKyAgICBhZGIgJHNlcmlhbEZsYWcgbG9nY2F0IC1kIHwgZ3JlcCAiPT09PSBUZXN0cyBQQVNTRUQgPT09PSIKKyAgICBpZiBbICQ/IC1lcSAwIF0KKyAgICB0aGVuCisgICAgICAgIGVjaG8gVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMgUEFTU0VEIQorICAgICAgICBleGl0Q29kZT0wCisgICAgICAgIGJyZWFrCisgICAgZmkKKworICAgICMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIHByaW50ZWQgZnJvbSBhbmRyb2lkX21haW4gb24gZmFpbHVyZQorICAgIGFkYiAkc2VyaWFsRmxhZyBsb2djYXQgLWQgfCBncmVwICI9PT09IFRlc3RzIEZBSUxFRCA9PT09IgorICAgIGlmIFsgJD8gLWVxIDAgXQorICAgIHRoZW4KKyAgICAgICAgZWNobyBWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cyBGQUlMRUQhCisgICAgICAgIGV4aXRDb2RlPTEKKyAgICAgICAgYnJlYWsKKyAgICBmaQorCisgICAgIyBkZXZlbG9wZXIuYW5kcm9pZC5jb20gcmVjb21tZW5kcyBzZWFyY2hpbmcgZm9yIHRoZSBmb2xsb3dpbmcgc3RyaW5nIHRvIGRldGVjdCBuYXRpdmUgY3Jhc2gKKyAgICBhZGIgJHNlcmlhbEZsYWcgbG9nY2F0IC1kIHwgZ3JlcCAiXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIgorICAgIGlmIFsgJD8gLWVxIDAgXQorICAgIHRoZW4KKyAgICAgICAgZXhpdENvZGU9MgorICAgICAgICBlY2hvIFZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzIENSQVNIRUQhCisgICAgICAgIGJyZWFrCisgICAgZmkKKworICAgIHNsZWVwIDUKKworZG9uZQorCisjIFJlLWVuYWJsZSBleGl0IG9uIGVycm9yCitzZXQgLWUKKworaWYgWyAkZXhpdENvZGUgLWVxIC0xIF0KK3RoZW4KKyAgICBlY2hvICJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cyBoYXNuJ3QgY29tcGxldGVkIGluICRzZWNvbmRzIHNlY29uZHMuIFNjcmlwdCBleGl0aW5nLiIKK2ZpCisKKyMKKyMgQ2xlYW51cAorIworCisjIFJldHVybiB0byBob21lIHNjcmVlbiB0byBjbGVhciBhbnkgZXJyb3IgcG9wLXVwcworYWRiICRzZXJpYWxGbGFnIHNoZWxsIGlucHV0IGtleWV2ZW50ICJLRVlDT0RFX0hPTUUiCisKKyMgU3RvcCB0aGUgYWN0aXZpdHkKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBhbSBmb3JjZS1zdG9wIGNvbS5leGFtcGxlLlZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzCisKK3RvZGF5PSQoZGF0ZSArJVktJW0tJWQuJUg6JU06JVMpCitvdXRGaWxlPSJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy4kcGxhdGZvcm0uJHRvZGF5Lm91dC50eHQiCitlcnJGaWxlPSJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy4kcGxhdGZvcm0uJHRvZGF5LmVyci50eHQiCithZGIgJHNlcmlhbEZsYWcgcHVsbCAvc2RjYXJkL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy9maWxlcy9vdXQudHh0IFZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzLiRwbGF0Zm9ybS4kdG9kYXkub3V0LnR4dAorYWRiICRzZXJpYWxGbGFnIHB1bGwgL3NkY2FyZC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMvZmlsZXMvZXJyLnR4dCBWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy4kcGxhdGZvcm0uJHRvZGF5LmVyci50eHQKKworaWYgWyAtZiAkb3V0RmlsZSBdOyB0aGVuCisgICAgZWNobyAkb3V0RmlsZSBzaXplICQod2MgLWMgPCAkb3V0RmlsZSkKK2ZpCisKK2lmIFsgLWYgJGVyckZpbGUgXTsgdGhlbgorICAgIGVjaG8gJGVyckZpbGUgc2l6ZSAkKHdjIC1jIDwgJGVyckZpbGUpCitmaQorCitlY2hvCitlY2hvID09PT09IER1bXBpbmcgbG9nY2F0IG9mIFZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzID09PT09CitlY2hvIElmIHRoZSB0ZXN0IGlzIGNyYXNoaW5nLCBiZSBzdXJlIHRvIGluc3BlY3QgZnVsbCBsb2cgZm9yIGNvbXBsZXRlIHN0YWNrIHRyYWNlLgorZWNobyAiYWRiICRzZXJpYWxGbGFnIGxvZ2NhdCAtZCB8IGdyZXAgVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMiCitlY2hvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitlY2hvCithZGIgJHNlcmlhbEZsYWcgbG9nY2F0IC1kIHwgZ3JlcCBWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cworCitleGl0ICRleGl0Q29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC91cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLmJhdCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODA3MDIxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5iYXQKQEAgLTAsMCArMSwzMzUgQEAKK0BlY2hvIG9mZg0KK1JFTSBVcGRhdGUgc291cmNlIGZvciBnbHNsYW5nLCBzcGlydi10b29scywgc2hhZGVyYywgdnVsa2FuLWhlYWRlcnMNCisNCitSRU0NCitSRU0gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KK1JFTSBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24NCitSRU0NCitSRU0gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorUkVNIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitSRU0gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorUkVNDQorUkVNICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorUkVNDQorUkVNIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitSRU0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitSRU0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorUkVNIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitSRU0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorUkVNDQorDQorc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KK3NldCBlcnJvckNvZGU9MA0KK3NldCBBTkRST0lEX0JVSUxEX0RJUj0lfmRwMA0KK3NldCBCVUlMRF9ESVI9JUFORFJPSURfQlVJTERfRElSJQ0KK3NldCBCQVNFX0RJUj0lQlVJTERfRElSJVx0aGlyZF9wYXJ0eQ0KK3NldCBHTFNMQU5HX0RJUj0lQkFTRV9ESVIlXHNoYWRlcmNcdGhpcmRfcGFydHlcZ2xzbGFuZw0KK3NldCBTUElSVl9UT09MU19ESVI9JUJBU0VfRElSJVxzaGFkZXJjXHRoaXJkX3BhcnR5XHNwaXJ2LXRvb2xzDQorc2V0IFNQSVJWX0hFQURFUlNfRElSPSVCQVNFX0RJUiVcc2hhZGVyY1x0aGlyZF9wYXJ0eVxzcGlydi10b29sc1xleHRlcm5hbFxzcGlydi1oZWFkZXJzDQorc2V0IFNIQURFUkNfRElSPSVCQVNFX0RJUiVcc2hhZGVyYw0KK3NldCBWVUxLQU5fSEVBREVSU19ESVI9JUJBU0VfRElSJVxWdWxrYW4tSGVhZGVycw0KKw0KK2ZvciAlJVggaW4gKHdoZXJlLmV4ZSkgZG8gKHNldCBGT1VORD0lJX4kUEFUSDpYKQ0KK2lmIG5vdCBkZWZpbmVkIEZPVU5EICgNCisgICBlY2hvIERlcGVuZGVuY3kgY2hlY2sgZmFpbGVkOg0KKyAgIGVjaG8gICB3aGVyZS5leGUgbm90IGZvdW5kDQorICAgZWNobyAgIFRoaXMgc2NyaXB0IHJlcXVpcmVzIFdpbmRvd3MgVmlzdGEgb3IgbGF0ZXIsIHdoaWNoIGluY2x1ZGVzIHdoZXJlLmV4ZS4NCisgICBzZXQgZXJyb3JDb2RlPTENCispDQorDQord2hlcmUgL3EgZ2l0LmV4ZQ0KK2lmICVFUlJPUkxFVkVMJSBlcXUgMSAoDQorICAgZWNobyBEZXBlbmRlbmN5IGNoZWNrIGZhaWxlZDoNCisgICBlY2hvICAgZ2l0LmV4ZSBub3QgZm91bmQNCisgICBlY2hvICAgR2l0IGZvciBXaW5kb3dzIGNhbiBiZSBkb3dubG9hZGVkIGhlcmU6ICBodHRwczovL2dpdC1zY20uY29tL2Rvd25sb2FkL3dpbg0KKyAgIGVjaG8gICBJbnN0YWxsIGFuZCBlbnN1cmUgZ2l0LmV4ZSBtYWtlcyBpdCBpbnRvIHlvdXIgUEFUSA0KKyAgIHNldCBlcnJvckNvZGU9MQ0KKykNCisNCit3aGVyZSAvcSBuZGstYnVpbGQuY21kDQoraWYgJUVSUk9STEVWRUwlIGVxdSAxICgNCisgICBlY2hvIERlcGVuZGVuY3kgY2hlY2sgZmFpbGVkOg0KKyAgIGVjaG8gICBuZGstYnVpbGQuY21kIG5vdCBmb3VuZA0KKyAgIGVjaG8gICBBbmRyb2lkIE5ESyBjYW4gYmUgZG93bmxvYWRlZCBoZXJlOiAgaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9uZGsvZ3VpZGVzL3NldHVwLmh0bWwNCisgICBlY2hvICAgSW5zdGFsbCBhbmQgZW5zdXJlIG5kay1idWlsZC5jbWQgbWFrZXMgaXQgaW50byB5b3VyIFBBVEgNCisgICBzZXQgZXJyb3JDb2RlPTENCispDQorDQorUkVNIGVuc3VyZSB3aGVyZSBpcyB3b3JraW5nIHdpdGggYmVsb3cgZmFsc2UgdGVzdA0KK1JFTSB3aGVyZSAvcSBmb28NCitSRU0gaWYgJUVSUk9STEVWRUwlIGVxdSAxICgNCitSRU0gZWNobyBmb28NCitSRU0gKQ0KKw0KKzptYWluDQorDQoraWYgJWVycm9yQ29kZSUgbmVxIDAgKGdvdG86ZXJyb3IpDQorDQorUkVNIFJlYWQgdGhlIHRhcmdldCB2ZXJzaW9ucyBmcm9tIGV4dGVybmFsIGZpbGUsIHdoaWNoIGlzIHNoYXJlZCB3aXRoIExpbnV4IHNjcmlwdA0KKw0KK2lmIG5vdCBleGlzdCAlQU5EUk9JRF9CVUlMRF9ESVIlXGdsc2xhbmdfcmV2aXNpb25fYW5kcm9pZCAoDQorICAgZWNoby4NCisgICBlY2hvIE1pc3NpbmcgZ2xzbGFuZ19yZXZpc2lvbl9hbmRyb2lkIGZpbGUuIFBsYWNlIGl0IGluICVBTkRST0lEX0JVSUxEX0RJUiUNCisgICBnb3RvOmVycm9yDQorKQ0KKw0KK2lmIG5vdCBleGlzdCAlQU5EUk9JRF9CVUlMRF9ESVIlXHNwaXJ2LXRvb2xzX3JldmlzaW9uX2FuZHJvaWQgKA0KKyAgIGVjaG8uDQorICAgZWNobyBNaXNzaW5nIHNwaXJ2LXRvb2xzX3JldmlzaW9uX2FuZHJvaWQgZmlsZS4gUGxhY2UgaXQgaW4gJUFORFJPSURfQlVJTERfRElSJQ0KKyAgIHNldCBlcnJvckNvZGU9MQ0KKyAgIGdvdG86ZXJyb3INCispDQorDQoraWYgbm90IGV4aXN0ICVBTkRST0lEX0JVSUxEX0RJUiVcc3BpcnYtaGVhZGVyc19yZXZpc2lvbl9hbmRyb2lkICgNCisgICBlY2hvLg0KKyAgIGVjaG8gTWlzc2luZyBzcGlydi1oZWFkZXJzX3JldmlzaW9uX2FuZHJvaWQgZmlsZS4gUGxhY2UgaXQgaW4gJUFORFJPSURfQlVJTERfRElSJQ0KKyAgIHNldCBlcnJvckNvZGU9MQ0KKyAgIGdvdG86ZXJyb3INCispDQorDQoraWYgbm90IGV4aXN0ICVBTkRST0lEX0JVSUxEX0RJUiVcc2hhZGVyY19yZXZpc2lvbl9hbmRyb2lkICgNCisgICBlY2hvLg0KKyAgIGVjaG8gTWlzc2luZyBzaGFkZXJjX3JldmlzaW9uX2FuZHJvaWQgZmlsZS4gUGxhY2UgaXQgaW4gJUFORFJPSURfQlVJTERfRElSJQ0KKyAgIHNldCBlcnJvckNvZGU9MQ0KKyAgIGdvdG86ZXJyb3INCispDQorDQoraWYgbm90IGV4aXN0ICVBTkRST0lEX0JVSUxEX0RJUiVcdnVsa2FuLWhlYWRlcnNfcmV2aXNpb25fYW5kcm9pZCAoDQorICAgZWNoby4NCisgICBlY2hvIE1pc3NpbmcgdnVsa2FuLWhlYWRlcnNfcmV2aXNpb25fYW5kcm9pZCBmaWxlLiBQbGFjZSBpdCBpbiAlQU5EUk9JRF9CVUlMRF9ESVIlDQorICAgc2V0IGVycm9yQ29kZT0xDQorICAgZ290bzplcnJvcg0KKykNCisNCitzZXQgL3AgR0xTTEFOR19SRVZJU0lPTj0gPCBnbHNsYW5nX3JldmlzaW9uX2FuZHJvaWQNCitzZXQgL3AgU1BJUlZfVE9PTFNfUkVWSVNJT049IDwgc3BpcnYtdG9vbHNfcmV2aXNpb25fYW5kcm9pZA0KK3NldCAvcCBTUElSVl9IRUFERVJTX1JFVklTSU9OPSA8IHNwaXJ2LWhlYWRlcnNfcmV2aXNpb25fYW5kcm9pZA0KK3NldCAvcCBTSEFERVJDX1JFVklTSU9OPSA8IHNoYWRlcmNfcmV2aXNpb25fYW5kcm9pZA0KK3NldCAvcCBWVUxLQU5fSEVBREVSU19SRVZJU0lPTj0gPCB2dWxrYW4taGVhZGVyc19yZXZpc2lvbl9hbmRyb2lkDQorZWNobyBHTFNMQU5HX1JFVklTSU9OPSVHTFNMQU5HX1JFVklTSU9OJQ0KK2VjaG8gU1BJUlZfVE9PTFNfUkVWSVNJT049JVNQSVJWX1RPT0xTX1JFVklTSU9OJQ0KK2VjaG8gU1BJUlZfSEVBREVSU19SRVZJU0lPTj0lU1BJUlZfSEVBREVSU19SRVZJU0lPTiUNCitlY2hvIFNIQURFUkNfUkVWSVNJT049JVNIQURFUkNfUkVWSVNJT04lDQorZWNobyBWVUxLQU5fSEVBREVSU19SRVZJU0lPTj0lVlVMS0FOX0hFQURFUlNfUkVWSVNJT04lDQorDQorDQorZWNobyBDcmVhdGluZyBhbmQvb3IgdXBkYXRpbmcgZ2xzbGFuZywgc3BpcnYtdG9vbHMsIHNwaXJ2LWhlYWRlcnMsIHNoYWRlcmMsIHZ1bGthbi1oZWFkZXJzIGluICVCQVNFX0RJUiUNCisNCitzZXQgc3luYy1nbHNsYW5nPTANCitzZXQgc3luYy1zcGlydi10b29scz0wDQorc2V0IHN5bmMtc3BpcnYtaGVhZGVycz0wDQorc2V0IHN5bmMtc2hhZGVyYz0wDQorc2V0IHN5bmMtdnVsa2FuLWhlYWRlcnM9MQ0KK3NldCBidWlsZC1zaGFkZXJjPTANCisNCitpZiAlc3luYy1zaGFkZXJjJSBlcXUgMSAoDQorICAgaWYgbm90IGV4aXN0ICVTSEFERVJDX0RJUiUgKA0KKyAgICAgIGNhbGw6Y3JlYXRlX3NoYWRlcmMNCisgICApDQorICAgaWYgJWVycm9yQ29kZSUgbmVxIDAgKGdvdG86ZXJyb3IpDQorICAgY2FsbDp1cGRhdGVfc2hhZGVyYw0KKyAgIGlmICVlcnJvckNvZGUlIG5lcSAwIChnb3RvOmVycm9yKQ0KKykNCisNCitpZiAlc3luYy1nbHNsYW5nJSBlcXUgMSAoDQorICAgaWYgbm90IGV4aXN0ICVHTFNMQU5HX0RJUiUgKA0KKyAgICAgIGNhbGw6Y3JlYXRlX2dsc2xhbmcNCisgICApDQorICAgaWYgJWVycm9yQ29kZSUgbmVxIDAgKGdvdG86ZXJyb3IpDQorICAgY2FsbDp1cGRhdGVfZ2xzbGFuZw0KKyAgIGlmICVlcnJvckNvZGUlIG5lcSAwIChnb3RvOmVycm9yKQ0KKykNCisNCitpZiAlc3luYy1zcGlydi10b29scyUgZXF1IDEgKA0KKyAgIGlmICVFUlJPUkxFVkVMJSBuZXEgMCAoZ290bzplcnJvcikNCisgICBpZiBub3QgZXhpc3QgJVNQSVJWX1RPT0xTX0RJUiUgKA0KKyAgICAgIGNhbGw6Y3JlYXRlX3NwaXJ2LXRvb2xzDQorICAgKQ0KKyAgIGlmICVlcnJvckNvZGUlIG5lcSAwIChnb3RvOmVycm9yKQ0KKyAgIGNhbGw6dXBkYXRlX3NwaXJ2LXRvb2xzDQorICAgaWYgJWVycm9yQ29kZSUgbmVxIDAgKGdvdG86ZXJyb3IpDQorKQ0KKw0KK2lmICVzeW5jLXNwaXJ2LWhlYWRlcnMlIGVxdSAxICgNCisgICBpZiAlRVJST1JMRVZFTCUgbmVxIDAgKGdvdG86ZXJyb3IpDQorICAgaWYgbm90IGV4aXN0ICVTUElSVl9IRUFERVJTX0RJUiUgKA0KKyAgICAgIGNhbGw6Y3JlYXRlX3NwaXJ2LWhlYWRlcnMNCisgICApDQorICAgaWYgJWVycm9yQ29kZSUgbmVxIDAgKGdvdG86ZXJyb3IpDQorICAgY2FsbDp1cGRhdGVfc3BpcnYtaGVhZGVycw0KKyAgIGlmICVlcnJvckNvZGUlIG5lcSAwIChnb3RvOmVycm9yKQ0KKykNCisNCitpZiAlc3luYy12dWxrYW4taGVhZGVycyUgZXF1IDEgKA0KKyAgIGlmICVFUlJPUkxFVkVMJSBuZXEgMCAoZ290bzplcnJvcikNCisgICBpZiBub3QgZXhpc3QgJVZVTEtBTl9IRUFERVJTX0RJUiUgKA0KKyAgICAgIGNhbGw6Y3JlYXRlX3Z1bGthbi1oZWFkZXJzDQorICAgKQ0KKyAgIGlmICVlcnJvckNvZGUlIG5lcSAwIChnb3RvOmVycm9yKQ0KKyAgIGNhbGw6dXBkYXRlX3Z1bGthbi1oZWFkZXJzDQorICAgaWYgJWVycm9yQ29kZSUgbmVxIDAgKGdvdG86ZXJyb3IpDQorKQ0KKw0KK2lmICVidWlsZC1zaGFkZXJjJSBlcXUgMSAoDQorICAgY2FsbDpidWlsZF9zaGFkZXJjDQorICAgaWYgJWVycm9yQ29kZSUgbmVxIDAgKGdvdG86ZXJyb3IpDQorKQ0KKw0KK2VjaG8uDQorZWNobyBFeGl0aW5nDQorZ290bzpmaW5pc2gNCisNCis6ZXJyb3INCitlY2hvLg0KK2VjaG8gSGFsdGluZyBkdWUgdG8gZXJyb3INCitnb3RvOmZpbmlzaA0KKw0KKzpmaW5pc2gNCitpZiBub3QgIiVjZCVcIiA9PSAiJUJVSUxEX0RJUiUiICggY2QgJUJVSUxEX0RJUiUgKQ0KK2VuZGxvY2FsDQorUkVNIFRoaXMgbmVlZHMgYSBmaXggdG8gcmV0dXJuIGVycm9yLCBzb21ldGhpbmcgbGlrZSBleGl0ICVlcnJvckNvZGUlDQorUkVNIFJpZ2h0IG5vdyBpdCBpcyByZXR1cm5pbmcgMA0KK2dvdG86ZW9mDQorDQorDQorDQorUkVNIC8vID09PT09PT09IEZ1bmN0aW9ucyA9PT09PT09PSAvLw0KKw0KKzpjcmVhdGVfZ2xzbGFuZw0KKyAgIGVjaG8uDQorICAgZWNobyBDcmVhdGluZyBsb2NhbCBnbHNsYW5nIHJlcG9zaXRvcnkgJUdMU0xBTkdfRElSJQ0KKyAgIGlmIG5vdCBleGlzdCAiJUdMU0xBTkdfRElSJVwiIG1rZGlyICVHTFNMQU5HX0RJUiUNCisgICBjZCAlR0xTTEFOR19ESVIlDQorICAgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xzbGFuZy5naXQgLg0KKyAgIGdpdCBjaGVja291dCAlR0xTTEFOR19SRVZJU0lPTiUNCisgICBpZiBub3QgZXhpc3QgJUdMU0xBTkdfRElSJVxTUElSViAoDQorICAgICAgZWNobyBnbHNsYW5nIHNvdXJjZSBkb3dubG9hZCBmYWlsZWQhDQorICAgICAgc2V0IGVycm9yQ29kZT0xDQorICAgKQ0KK2dvdG86ZW9mDQorDQorOnVwZGF0ZV9nbHNsYW5nDQorICAgZWNoby4NCisgICBlY2hvIFVwZGF0aW5nICVHTFNMQU5HX0RJUiUNCisgICBjZCAlR0xTTEFOR19ESVIlDQorICAgZ2l0IGZldGNoIC0tYWxsDQorICAgZ2l0IGNoZWNrb3V0ICVHTFNMQU5HX1JFVklTSU9OJQ0KKyAgIGlmIG5vdCBleGlzdCAlR0xTTEFOR19ESVIlXFNQSVJWICgNCisgICAgICBlY2hvIGdsc2xhbmcgc291cmNlIHVwZGF0ZSBmYWlsZWQhDQorICAgICAgc2V0IGVycm9yQ29kZT0xDQorICAgKQ0KK2dvdG86ZW9mDQorDQorOmNyZWF0ZV9zcGlydi10b29scw0KKyAgIGVjaG8uDQorICAgZWNobyBDcmVhdGluZyBsb2NhbCBzcGlydi10b29scyByZXBvc2l0b3J5ICVTUElSVl9UT09MU19ESVIlDQorICAgaWYgbm90IGV4aXN0ICIlU1BJUlZfVE9PTFNfRElSJVwiIG1rZGlyICVTUElSVl9UT09MU19ESVIlDQorICAgY2QgJVNQSVJWX1RPT0xTX0RJUiUNCisgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9TUElSVi1Ub29scy5naXQgLg0KKyAgIGdpdCBjaGVja291dCAlU1BJUlZfVE9PTFNfUkVWSVNJT04lDQorICAgaWYgbm90IGV4aXN0ICVTUElSVl9UT09MU19ESVIlXHNvdXJjZSAoDQorICAgICAgZWNobyBzcGlydi10b29scyBzb3VyY2UgZG93bmxvYWQgZmFpbGVkIQ0KKyAgICAgIHNldCBlcnJvckNvZGU9MQ0KKyAgICkNCitnb3RvOmVvZg0KKw0KKzp1cGRhdGVfc3BpcnYtdG9vbHMNCisgICBlY2hvLg0KKyAgIGVjaG8gVXBkYXRpbmcgJVNQSVJWX1RPT0xTX0RJUiUNCisgICBjZCAlU1BJUlZfVE9PTFNfRElSJQ0KKyAgIGdpdCBmZXRjaCAtLWFsbA0KKyAgIGdpdCBjaGVja291dCAlU1BJUlZfVE9PTFNfUkVWSVNJT04lDQorICAgaWYgbm90IGV4aXN0ICVTUElSVl9UT09MU19ESVIlXHNvdXJjZSAoDQorICAgICAgZWNobyBzcGlydi10b29scyBzb3VyY2UgdXBkYXRlIGZhaWxlZCENCisgICAgICBzZXQgZXJyb3JDb2RlPTENCisgICApDQorZ290bzplb2YNCisNCis6Y3JlYXRlX3NwaXJ2LWhlYWRlcnMNCisgICBlY2hvLg0KKyAgIGVjaG8gQ3JlYXRpbmcgbG9jYWwgc3BpcnYtaGVhZGVycyByZXBvc2l0b3J5ICVTUElSVl9IRUFERVJTX0RJUiUNCisgICBpZiBub3QgZXhpc3QgIiVTUElSVl9IRUFERVJTX0RJUiVcIiBta2RpciAlU1BJUlZfSEVBREVSU19ESVIlDQorICAgY2QgJVNQSVJWX0hFQURFUlNfRElSJQ0KKyAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1NQSVJWLUhlYWRlcnMuZ2l0IC4NCisgICBnaXQgY2hlY2tvdXQgJVNQSVJWX0hFQURFUlNfUkVWSVNJT04lDQorICAgaWYgbm90IGV4aXN0ICVTUElSVl9IRUFERVJTX0RJUiVcaW5jbHVkZSAoDQorICAgICAgZWNobyBzcGlydi1oZWFkZXJzIHNvdXJjZSBkb3dubG9hZCBmYWlsZWQhDQorICAgICAgc2V0IGVycm9yQ29kZT0xDQorICAgKQ0KK2dvdG86ZW9mDQorDQorOnVwZGF0ZV9zcGlydi1oZWFkZXJzDQorICAgZWNoby4NCisgICBlY2hvIFVwZGF0aW5nICVTUElSVl9IRUFERVJTX0RJUiUNCisgICBjZCAlU1BJUlZfSEVBREVSU19ESVIlDQorICAgZ2l0IGZldGNoIC0tYWxsDQorICAgZ2l0IGNoZWNrb3V0ICVTUElSVl9IRUFERVJTX1JFVklTSU9OJQ0KKyAgIGlmIG5vdCBleGlzdCAlU1BJUlZfSEVBREVSU19ESVIlXGluY2x1ZGUgKA0KKyAgICAgIGVjaG8gc3BpcnYtaGVhZGVycyBzb3VyY2UgdXBkYXRlIGZhaWxlZCENCisgICAgICBzZXQgZXJyb3JDb2RlPTENCisgICApDQorZ290bzplb2YNCisNCis6Y3JlYXRlX3NoYWRlcmMNCisgICBlY2hvLg0KKyAgIGVjaG8gQ3JlYXRpbmcgbG9jYWwgc2hhZGVyYyByZXBvc2l0b3J5ICVTSEFERVJDX0RJUiUNCisgICBpZiBub3QgZXhpc3QgIiVTSEFERVJDX0RJUiVcIiBta2RpciAlU0hBREVSQ19ESVIlDQorICAgY2QgJVNIQURFUkNfRElSJQ0KKyAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3NoYWRlcmMuZ2l0IC4NCisgICBnaXQgY2hlY2tvdXQgJVNIQURFUkNfUkVWSVNJT04lDQorICAgaWYgbm90IGV4aXN0ICVTSEFERVJDX0RJUiVcbGlic2hhZGVyYyAoDQorICAgICAgZWNobyBzaGFkZXJjIHNvdXJjZSBkb3dubG9hZCBmYWlsZWQhDQorICAgICAgc2V0IGVycm9yQ29kZT0xDQorICAgKQ0KK2dvdG86ZW9mDQorDQorOnVwZGF0ZV9zaGFkZXJjDQorICAgZWNoby4NCisgICBlY2hvIFVwZGF0aW5nICVTSEFERVJDX0RJUiUNCisgICBjZCAlU0hBREVSQ19ESVIlDQorICAgZ2l0IGZldGNoIC0tYWxsDQorICAgZ2l0IGNoZWNrb3V0ICVTSEFERVJDX1JFVklTSU9OJQ0KKyAgIGlmIG5vdCBleGlzdCAlU0hBREVSQ19ESVIlXGxpYnNoYWRlcmMgKA0KKyAgICAgIGVjaG8gc2hhZGVyYyBzb3VyY2UgdXBkYXRlIGZhaWxlZCENCisgICAgICBzZXQgZXJyb3JDb2RlPTENCisgICApDQorZ290bzplb2YNCisNCis6YnVpbGRfc2hhZGVyYw0KKyAgIGVjaG8uDQorICAgZWNobyBCdWlsZGluZyAlU0hBREVSQ19ESVIlDQorICAgY2QgJVNIQURFUkNfRElSJVxhbmRyb2lkX3Rlc3QNCisgICBlY2hvIEJ1aWxkaW5nIHNoYWRlcmMgd2l0aCBBbmRyb2lkIE5ESw0KKyAgIGNhbGwgbmRrLWJ1aWxkIE5ES19BUFBMSUNBVElPTl9NSz0uLi8uLi8uLi9qbmkvc2hhZGVyYy9BcHBsaWNhdGlvbi5tayBUSElSRF9QQVJUWV9QQVRIPS4uL3RoaXJkX3BhcnR5IC1qIDQNCisgICBSRU0gQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBvbmUgbGliLCBldmVuIHRob3VnaCB3ZSBzaG91bGQgY2hlY2sgZm9yIGFsbCByZXN1bHRzDQorICAgaWYgbm90IGV4aXN0ICVTSEFERVJDX0RJUiVcYW5kcm9pZF90ZXN0XG9ialxsb2NhbFx4ODZcbGlic2hhZGVyYy5hICgNCisgICAgICBlY2hvLg0KKyAgICAgIGVjaG8gc2hhZGVyYyBidWlsZCBmYWlsZWQhDQorICAgICAgc2V0IGVycm9yQ29kZT0xDQorICAgKQ0KK2dvdG86ZW9mDQorDQorOmNyZWF0ZV92dWxrYW4taGVhZGVycw0KKyAgIGVjaG8uDQorICAgZWNobyBDcmVhdGluZyBsb2NhbCB2dWxrYW4taGVhZGVycyByZXBvc2l0b3J5ICVWVUxLQU5fSEVBREVSU19ESVIlDQorICAgaWYgbm90IGV4aXN0ICIlVlVMS0FOX0hFQURFUlNfRElSJVwiIG1rZGlyICVWVUxLQU5fSEVBREVSU19ESVIlDQorICAgY2QgJVZVTEtBTl9IRUFERVJTX0RJUiUNCisgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tSGVhZGVycy5naXQgLg0KKyAgIGdpdCBjaGVja291dCAlVlVMS0FOX0hFQURFUlNfUkVWSVNJT04lDQorICAgaWYgbm90IGV4aXN0ICVWVUxLQU5fSEVBREVSU19ESVIlXHJlZ2lzdHJ5ICgNCisgICAgICBlY2hvIHZ1bGthbi1oZWFkZXJzIHNvdXJjZSBkb3dubG9hZCBmYWlsZWQhDQorICAgICAgc2V0IGVycm9yQ29kZT0xDQorICAgKQ0KK2dvdG86ZW9mDQorDQorOnVwZGF0ZV92dWxrYW4taGVhZGVycw0KKyAgIGVjaG8uDQorICAgZWNobyBVcGRhdGluZyAlVlVMS0FOX0hFQURFUlNfRElSJQ0KKyAgIGNkICVWVUxLQU5fSEVBREVSU19ESVIlDQorICAgZ2l0IGZldGNoIC0tYWxsDQorICAgZ2l0IGNoZWNrb3V0ICVWVUxLQU5fSEVBREVSU19SRVZJU0lPTiUNCisgICBpZiBub3QgZXhpc3QgJVZVTEtBTl9IRUFERVJTX0RJUiVccmVnaXN0cnkgKA0KKyAgICAgIGVjaG8gdnVsa2FuLWhlYWRlcnMgc291cmNlIHVwZGF0ZSBmYWlsZWQhDQorICAgICAgc2V0IGVycm9yQ29kZT0xDQorICAgKQ0KK2dvdG86ZW9mDQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC91cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC91cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjMjBjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2gKQEAgLTAsMCArMSwyNjQgQEAKKyMhL2Jpbi9iYXNoCisjIFVwZGF0ZSBzb3VyY2UgZm9yIGdsc2xhbmcsIHNwaXJ2LXRvb2xzLCBzaGFkZXJjLCB2dWxrYW4taGVhZGVycworCisjIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFZhbHZlIENvcnBvcmF0aW9uCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgLWUKKworc3luY19nbHNsYW5nPTAKK3N5bmNfc3BpcnZfdG9vbHM9MAorc3luY19zcGlydl9oZWFkZXJzPTAKK3N5bmNfc2hhZGVyYz0wCitzeW5jX3Z1bGthbl9oZWFkZXJzPTEKKworQU5EUk9JREJVSUxERElSPSRQV0QKK0JVSUxERElSPSRBTkRST0lEQlVJTERESVIKK0JBU0VESVI9JEJVSUxERElSL3RoaXJkX3BhcnR5CisKK0dMU0xBTkdfUkVWSVNJT049JChjYXQgJEFORFJPSURCVUlMRERJUi9nbHNsYW5nX3JldmlzaW9uX2FuZHJvaWQpCitTUElSVl9UT09MU19SRVZJU0lPTj0kKGNhdCAkQU5EUk9JREJVSUxERElSL3NwaXJ2LXRvb2xzX3JldmlzaW9uX2FuZHJvaWQpCitTUElSVl9IRUFERVJTX1JFVklTSU9OPSQoY2F0ICRBTkRST0lEQlVJTERESVIvc3BpcnYtaGVhZGVyc19yZXZpc2lvbl9hbmRyb2lkKQorU0hBREVSQ19SRVZJU0lPTj0kKGNhdCAkQU5EUk9JREJVSUxERElSL3NoYWRlcmNfcmV2aXNpb25fYW5kcm9pZCkKK1ZVTEtBTl9IRUFERVJTX1JFVklTSU9OPSQoY2F0ICRBTkRST0lEQlVJTERESVIvdnVsa2FuLWhlYWRlcnNfcmV2aXNpb25fYW5kcm9pZCkKKworZWNobyAiR0xTTEFOR19SRVZJU0lPTj0kR0xTTEFOR19SRVZJU0lPTiIKK2VjaG8gIlNQSVJWX1RPT0xTX1JFVklTSU9OPSRTUElSVl9UT09MU19SRVZJU0lPTiIKK2VjaG8gIlNQSVJWX0hFQURFUlNfUkVWSVNJT049JFNQSVJWX0hFQURFUlNfUkVWSVNJT04iCitlY2hvICJTSEFERVJDX1JFVklTSU9OPSRTSEFERVJDX1JFVklTSU9OIgorZWNobyAiVlVMS0FOX0hFQURFUlNfUkVWSVNJT049JFZVTEtBTl9IRUFERVJTX1JFVklTSU9OIgorCitHTFNMQU5HX1VSTD0kKGNhdCAkQU5EUk9JREJVSUxERElSL2dsc2xhbmdfdXJsX2FuZHJvaWQpCitTUElSVl9UT09MU19VUkw9JChjYXQgJEFORFJPSURCVUlMRERJUi9zcGlydi10b29sc191cmxfYW5kcm9pZCkKK1NQSVJWX0hFQURFUlNfVVJMPSQoY2F0ICRBTkRST0lEQlVJTERESVIvc3BpcnYtaGVhZGVyc191cmxfYW5kcm9pZCkKK1NIQURFUkNfVVJMPSQoY2F0ICRBTkRST0lEQlVJTERESVIvc2hhZGVyY191cmxfYW5kcm9pZCkKK1ZVTEtBTl9IRUFERVJTX1VSTD0kKGNhdCAkQU5EUk9JREJVSUxERElSL3Z1bGthbi1oZWFkZXJzX3VybF9hbmRyb2lkKQorCitlY2hvICJHTFNMQU5HX1VSTD0kR0xTTEFOR19VUkwiCitlY2hvICJTUElSVl9UT09MX1VSTFNfPSRTUElSVl9UT09MU19VUkwiCitlY2hvICJTUElSVl9IRUFERVJTX1VSTD0kU1BJUlZfSEVBREVSU19VUkwiCitlY2hvICJTSEFERVJDX1VSTD0kU0hBREVSQ19VUkwiCitlY2hvICJWVUxLQU5fSEVBREVSU19VUkw9JFZVTEtBTl9IRUFERVJTX1VSTCIKKworaWYgW1sgJCh1bmFtZSkgPT0gIkxpbnV4IiBdXTsgdGhlbgorICAgIGNvcmVzPSIkKG5wcm9jIHx8IGVjaG8gNCkiCitlbGlmIFtbICQodW5hbWUpID09ICJEYXJ3aW4iIF1dOyB0aGVuCisgICAgY29yZXM9JChzeXNjdGwgLW4gaHcubmNwdSkKK2ZpCisKKyMKKyMgUGFyc2UgcGFyYW1ldGVycworIworCitmdW5jdGlvbiBwcmludFVzYWdlIHsKKyAgIGVjaG8gIlN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZToiCisgICBlY2hvICIgICAgLS1hYmkgPGFiaT4gKG9wdGlvbmFsKSIKKyAgIGVjaG8gIiAgICAtLW5vLWJ1aWxkIChvcHRpb25hbCkiCisgICBlY2hvCisgICBlY2hvICJpLmUuICR7MCMjKi99IC0tYWJpIGFybTY0LXY4YSBcXCIKKyAgIGV4aXQgMQorfQorCit3aGlsZSBbWyAkIyAtZ3QgMCBdXQorZG8KKyAgICBjYXNlICQxIGluCisgICAgICAgIC0tYWJpKQorICAgICAgICAgICAgYWJpPSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tbm8tYnVpbGQpCisgICAgICAgICAgICBub2J1aWxkPTEKKyAgICAgICAgICAgIHNoaWZ0IDEKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICAjIHVua25vd24gb3B0aW9uCisgICAgICAgICAgICBlY2hvIFVua25vd24gb3B0aW9uOiAkMQorICAgICAgICAgICAgZWNobworICAgICAgICAgICAgcHJpbnRVc2FnZQorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworZWNobyBhYmk9JGFiaQoraWYgW1sgLXogJGFiaSBdXQordGhlbgorICAgIGVjaG8gTm8gYWJpIHByb3ZpZGVkLCBzbyBidWlsZGluZyBmb3IgYWxsIHN1cHBvcnRlZCBhYmlzLgorZmkKKworZWNobyBuby1idWlsZD0kbm9idWlsZAoraWYgW1sgJG5vYnVpbGQgXV0KK3RoZW4KKyAgICBlY2hvIFNraXBwaW5nIGJ1aWxkLgorZmkKKworZnVuY3Rpb24gY3JlYXRlX2dsc2xhbmcgKCkgeworICAgcm0gLXJmICRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvZ2xzbGFuZworICAgZWNobyAiQ3JlYXRpbmcgbG9jYWwgZ2xzbGFuZyByZXBvc2l0b3J5ICgkQkFTRURJUi9nbHNsYW5nKS4iCisgICBta2RpciAtcCAkQkFTRURJUi9zaGFkZXJjL3RoaXJkX3BhcnR5L2dsc2xhbmcKKyAgIGNkICRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvZ2xzbGFuZworICAgZ2l0IGNsb25lICRHTFNMQU5HX1VSTCAuCisgICBnaXQgY2hlY2tvdXQgJEdMU0xBTkdfUkVWSVNJT04KK30KKworZnVuY3Rpb24gdXBkYXRlX2dsc2xhbmcgKCkgeworICAgZWNobyAiVXBkYXRpbmcgJEJBU0VESVIvc2hhZGVyYy90aGlyZF9wYXJ0eS9nbHNsYW5nIgorICAgY2QgJEJBU0VESVIvc2hhZGVyYy90aGlyZF9wYXJ0eS9nbHNsYW5nCisgICBpZiBbWyAkKGdpdCBjb25maWcgLS1nZXQgcmVtb3RlLm9yaWdpbi51cmwpICE9ICRHTFNMQU5HX1VSTCBdXTsgdGhlbgorICAgICAgZWNobyAiZ2xzbGFuZyBVUkwgbWlzbWF0Y2gsIHJlY3JlYXRpbmcgbG9jYWwgcmVwbyIKKyAgICAgIGNyZWF0ZV9nbHNsYW5nCisgICAgICByZXR1cm4KKyAgIGZpCisgICBnaXQgZmV0Y2ggLS1hbGwKKyAgIGdpdCBjaGVja291dCAkR0xTTEFOR19SRVZJU0lPTgorfQorCitmdW5jdGlvbiBjcmVhdGVfc3BpcnYtdG9vbHMgKCkgeworICAgcm0gLXJmICRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMKKyAgIGVjaG8gIkNyZWF0aW5nIGxvY2FsIHNwaXJ2LXRvb2xzIHJlcG9zaXRvcnkgKCRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMpLiIKKyAgIG1rZGlyIC1wICRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMKKyAgIGNkICRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMKKyAgIGdpdCBjbG9uZSAkU1BJUlZfVE9PTFNfVVJMIC4KKyAgIGdpdCBjaGVja291dCAkU1BJUlZfVE9PTFNfUkVWSVNJT04KK30KKworZnVuY3Rpb24gdXBkYXRlX3NwaXJ2LXRvb2xzICgpIHsKKyAgIGVjaG8gIlVwZGF0aW5nICRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMiCisgICBjZCAkQkFTRURJUi9zaGFkZXJjL3RoaXJkX3BhcnR5L3NwaXJ2LXRvb2xzCisgICBpZiBbWyAkKGdpdCBjb25maWcgLS1nZXQgcmVtb3RlLm9yaWdpbi51cmwpICE9ICRTUElSVl9UT09MU19VUkwgXV07IHRoZW4KKyAgICAgIGVjaG8gInNwaXJ2LXRvb2xzIFVSTCBtaXNtYXRjaCwgcmVjcmVhdGluZyBsb2NhbCByZXBvIgorICAgICAgY3JlYXRlX3NwaXJ2LXRvb2xzCisgICAgICByZXR1cm4KKyAgIGZpCisgICBnaXQgZmV0Y2ggLS1hbGwKKyAgIGdpdCBjaGVja291dCAkU1BJUlZfVE9PTFNfUkVWSVNJT04KK30KKworZnVuY3Rpb24gY3JlYXRlX3NwaXJ2LWhlYWRlcnMgKCkgeworICAgcm0gLXJmICRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMvZXh0ZXJuYWwvc3BpcnYtaGVhZGVycworICAgZWNobyAiQ3JlYXRpbmcgbG9jYWwgc3BpcnYtaGVhZGVycyByZXBvc2l0b3J5ICgkQkFTRURJUi9zaGFkZXJjL3RoaXJkX3BhcnR5L3NwaXJ2LXRvb2xzL2V4dGVybmFsL3NwaXJ2LWhlYWRlcnMpLiIKKyAgIG1rZGlyIC1wICRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMvZXh0ZXJuYWwvc3BpcnYtaGVhZGVycworICAgY2QgJEJBU0VESVIvc2hhZGVyYy90aGlyZF9wYXJ0eS9zcGlydi10b29scy9leHRlcm5hbC9zcGlydi1oZWFkZXJzCisgICBnaXQgY2xvbmUgJFNQSVJWX0hFQURFUlNfVVJMIC4KKyAgIGdpdCBjaGVja291dCAkU1BJUlZfSEVBREVSU19SRVZJU0lPTgorfQorCitmdW5jdGlvbiB1cGRhdGVfc3BpcnYtaGVhZGVycyAoKSB7CisgICBlY2hvICJVcGRhdGluZyAkQkFTRURJUi9zaGFkZXJjL3RoaXJkX3BhcnR5L3NwaXJ2LXRvb2xzL2V4dGVybmFsL3NwaXJ2LWhlYWRlcnMiCisgICBjZCAkQkFTRURJUi9zaGFkZXJjL3RoaXJkX3BhcnR5L3NwaXJ2LXRvb2xzL2V4dGVybmFsL3NwaXJ2LWhlYWRlcnMKKyAgIGlmIFtbICQoZ2l0IGNvbmZpZyAtLWdldCByZW1vdGUub3JpZ2luLnVybCkgIT0gJFNQSVJWX0hFQURFUlNfVVJMIF1dOyB0aGVuCisgICAgICBlY2hvICJzcGlydi1oZWFkZXJzIFVSTCBtaXNtYXRjaCwgcmVjcmVhdGluZyBsb2NhbCByZXBvIgorICAgICAgY3JlYXRlX3NwaXJ2LWhlYWRlcnMKKyAgICAgIHJldHVybgorICAgZmkKKyAgIGdpdCBmZXRjaCAtLWFsbAorICAgZ2l0IGNoZWNrb3V0ICRTUElSVl9IRUFERVJTX1JFVklTSU9OCit9CisKK2Z1bmN0aW9uIGNyZWF0ZV9zaGFkZXJjICgpIHsKKyAgIHJtIC1yZiAkQkFTRURJUi9zaGFkZXJjCisgICBlY2hvICJDcmVhdGluZyBsb2NhbCBzaGFkZXJjIHJlcG9zaXRvcnkgKCRCQVNFRElSL3NoYWRlcmMpLiIKKyAgIG1rZGlyIC1wICRCQVNFRElSL3NoYWRlcmMKKyAgIGNkICRCQVNFRElSL3NoYWRlcmMKKyAgIGdpdCBjbG9uZSAkU0hBREVSQ19VUkwgLgorICAgZ2l0IGNoZWNrb3V0ICRTSEFERVJDX1JFVklTSU9OCit9CisKK2Z1bmN0aW9uIHVwZGF0ZV9zaGFkZXJjICgpIHsKKyAgIGVjaG8gIlVwZGF0aW5nICRCQVNFRElSL3NoYWRlcmMiCisgICBjZCAkQkFTRURJUi9zaGFkZXJjCisgICBpZiBbWyAkKGdpdCBjb25maWcgLS1nZXQgcmVtb3RlLm9yaWdpbi51cmwpICE9ICRTSEFERVJDX1VSTCBdXTsgdGhlbgorICAgICAgZWNobyAic2hhZGVyYyBVUkwgbWlzbWF0Y2gsIHJlY3JlYXRpbmcgbG9jYWwgcmVwbyIKKyAgICAgIGNyZWF0ZV9zaGFkZXJjCisgICAgICByZXR1cm4KKyAgIGZpCisgICBnaXQgZmV0Y2ggLS1hbGwKKyAgIGdpdCBjaGVja291dCAkU0hBREVSQ19SRVZJU0lPTgorfQorCitmdW5jdGlvbiBidWlsZF9zaGFkZXJjICgpIHsKKyAgIGVjaG8gIkJ1aWxkaW5nICRCQVNFRElSL3NoYWRlcmMiCisgICBjZCAkQkFTRURJUi9zaGFkZXJjL2FuZHJvaWRfdGVzdAorICAgaWYgW1sgJGFiaSBdXTsgdGhlbgorICAgICAgbmRrLWJ1aWxkIE5ES19BUFBMSUNBVElPTl9NSz0uLi8uLi8uLi9qbmkvc2hhZGVyYy9BcHBsaWNhdGlvbi5tayBUSElSRF9QQVJUWV9QQVRIPS4uL3RoaXJkX3BhcnR5IEFQUF9BQkk9JGFiaSAtaiAkY29yZXM7CisgICBlbHNlCisgICAgICBuZGstYnVpbGQgTkRLX0FQUExJQ0FUSU9OX01LPS4uLy4uLy4uL2puaS9zaGFkZXJjL0FwcGxpY2F0aW9uLm1rIFRISVJEX1BBUlRZX1BBVEg9Li4vdGhpcmRfcGFydHkgLWogJGNvcmVzOworICAgZmkKK30KKworZnVuY3Rpb24gY3JlYXRlX3Z1bGthbi1oZWFkZXJzICgpIHsKKyAgIHJtIC1yZiAkQkFTRURJUi9WdWxrYW4tSGVhZGVycworICAgZWNobyAiQ3JlYXRpbmcgbG9jYWwgVnVsa2FuLUhlYWRlcnMgcmVwb3NpdG9yeSAoJEJBU0VESVIvVnVsa2FuLUhlYWRlcnMpLiIKKyAgIG1rZGlyIC1wICRCQVNFRElSL1Z1bGthbi1IZWFkZXJzCisgICBjZCAkQkFTRURJUi9WdWxrYW4tSGVhZGVycworICAgZ2l0IGNsb25lICRWVUxLQU5fSEVBREVSU19VUkwgLgorICAgZ2l0IGNoZWNrb3V0ICRWVUxLQU5fSEVBREVSU19SRVZJU0lPTgorfQorCitmdW5jdGlvbiB1cGRhdGVfdnVsa2FuLWhlYWRlcnMgKCkgeworICAgZWNobyAiVXBkYXRpbmcgJEJBU0VESVIvVnVsa2FuLUhlYWRlcnMiCisgICBjZCAkQkFTRURJUi9WdWxrYW4tSGVhZGVycworICAgaWYgW1sgJChnaXQgY29uZmlnIC0tZ2V0IHJlbW90ZS5vcmlnaW4udXJsKSAhPSAkVlVMS0FOX0hFQURFUlNfVVJMIF1dOyB0aGVuCisgICAgICBlY2hvICJWdWxrYW4tSGVhZGVycyBVUkwgbWlzbWF0Y2gsIHJlY3JlYXRpbmcgbG9jYWwgcmVwbyIKKyAgICAgIGNyZWF0ZV92dWxrYW4taGVhZGVycworICAgICAgcmV0dXJuCisgICBmaQorICAgZ2l0IGZldGNoIC0tYWxsCisgICBnaXQgY2hlY2tvdXQgJFZVTEtBTl9IRUFERVJTX1JFVklTSU9OCit9CisKK2lmIFsgJHN5bmNfc2hhZGVyYyAtZXEgMSBdOyB0aGVuCisgICAgaWYgWyAhIC1kICIkQkFTRURJUi9zaGFkZXJjIiAtbyAhIC1kICIkQkFTRURJUi9zaGFkZXJjLy5naXQiIF07IHRoZW4KKyAgICAgICAgY3JlYXRlX3NoYWRlcmMKKyAgICBmaQorICAgIHVwZGF0ZV9zaGFkZXJjCitmaQorCitpZiBbICRzeW5jX2dsc2xhbmcgLWVxIDEgXTsgdGhlbgorICAgIGlmIFsgISAtZCAiJEJBU0VESVIvc2hhZGVyYy90aGlyZF9wYXJ0eS9nbHNsYW5nIiAtbyAhIC1kICIkQkFTRURJUi9zaGFkZXJjL3RoaXJkX3BhcnR5L2dsc2xhbmcvLmdpdCIgLW8gLWQgIiRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvZ2xzbGFuZy8uc3ZuIiBdOyB0aGVuCisgICAgY3JlYXRlX2dsc2xhbmcKKyAgICBmaQorICAgIHVwZGF0ZV9nbHNsYW5nCitmaQorCitpZiBbICRzeW5jX3NwaXJ2X3Rvb2xzIC1lcSAxIF07IHRoZW4KKyAgICBpZiBbICEgLWQgIiRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMiIC1vICEgLWQgIiRCQVNFRElSL3NoYWRlcmMvdGhpcmRfcGFydHkvc3BpcnYtdG9vbHMvLmdpdCIgXTsgdGhlbgorICAgIGNyZWF0ZV9zcGlydi10b29scworICAgIGZpCisgICAgdXBkYXRlX3NwaXJ2LXRvb2xzCitmaQorCitpZiBbICRzeW5jX3NwaXJ2X2hlYWRlcnMgLWVxIDEgXTsgdGhlbgorICAgIGlmIFsgISAtZCAiJEJBU0VESVIvc2hhZGVyYy90aGlyZF9wYXJ0eS9zcGlydi10b29scy9leHRlcm5hbC9zcGlydi1oZWFkZXJzIiAtbyAhIC1kICIkQkFTRURJUi9zaGFkZXJjL3RoaXJkX3BhcnR5L3NwaXJ2LXRvb2xzL2V4dGVybmFsL3NwaXJ2LWhlYWRlcnMvLmdpdCIgXTsgdGhlbgorICAgIGNyZWF0ZV9zcGlydi1oZWFkZXJzCisgICAgZmkKKyAgICB1cGRhdGVfc3BpcnYtaGVhZGVycworZmkKKworaWYgWyAkc3luY192dWxrYW5faGVhZGVycyAtZXEgMSBdOyB0aGVuCisgICAgaWYgWyAhIC1kICIkQkFTRURJUi9WdWxrYW4tSGVhZGVycyIgLW8gISAtZCAiJEJBU0VESVIvVnVsa2FuLUhlYWRlcnMvLmdpdCIgXTsgdGhlbgorICAgIGNyZWF0ZV92dWxrYW4taGVhZGVycworICAgIGZpCisgICAgdXBkYXRlX3Z1bGthbi1oZWFkZXJzCitmaQorCitpZiBbWyAteiAkbm9idWlsZCBdXQordGhlbgorYnVpbGRfc2hhZGVyYworZmkKKworZWNobyAiIgorZWNobyAiJHswIyMqL30gZmluaXNoZWQuIgorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL3Z1bGthbi1oZWFkZXJzX3JldmlzaW9uX2FuZHJvaWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1hbmRyb2lkL3Z1bGthbi1oZWFkZXJzX3JldmlzaW9uX2FuZHJvaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3ODljMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvdnVsa2FuLWhlYWRlcnNfcmV2aXNpb25fYW5kcm9pZApAQCAtMCwwICsxIEBACit2MS4xLjEzMApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtYW5kcm9pZC92dWxrYW4taGVhZGVyc191cmxfYW5kcm9pZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvdnVsa2FuLWhlYWRlcnNfdXJsX2FuZHJvaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlOTg1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWFuZHJvaWQvdnVsa2FuLWhlYWRlcnNfdXJsX2FuZHJvaWQKQEAgLTAsMCArMSBAQAoraHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tSGVhZGVycy5naXQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWduL2dlbmVyYXRlX3Z1bGthbl9sYXllcnNfanNvbi5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWduL2dlbmVyYXRlX3Z1bGthbl9sYXllcnNfanNvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTk5Y2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtZ24vZ2VuZXJhdGVfdnVsa2FuX2xheWVyc19qc29uLnB5CkBAIC0wLDAgKzEsMTI2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIkdlbmVyYXRlIGNvcGllcyBvZiB0aGUgVnVsa2FuIGxheWVycyBKU09OIGZpbGVzLCB3aXRoIG5vIHBhdGhzLCBmb3JjaW5nCitWdWxrYW4gdG8gdXNlIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIHRvIGxvb2sgZm9yIGxheWVycy4iIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBnbG9iCitpbXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzeXMKKworCitkZWYgZ2xvYl9zbGFzaChkaXJuYW1lKToKKyAgICAiIiJMaWtlIHJlZ3VsYXIgZ2xvYiBidXQgcmVwbGFjZXMgXCB3aXRoIC8gaW4gcmV0dXJuZWQgcGF0aHMuIiIiCisgICAgcmV0dXJuIFtzLnJlcGxhY2UoJ1xcJywgJy8nKSBmb3IgcyBpbiBnbG9iLmdsb2IoZGlybmFtZSldCisKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0taWNkJywgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdzb3VyY2VfZGlyJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd0YXJnZXRfZGlyJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd2ZXJzaW9uX2hlYWRlcicsIGhlbHA9J3BhdGggdG8gdnVsa2FuX2NvcmUuaCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnanNvbl9maWxlcycsIG5hcmdzPScqJykKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgc291cmNlX2RpciA9IGFyZ3Muc291cmNlX2RpcgorICAgIHRhcmdldF9kaXIgPSBhcmdzLnRhcmdldF9kaXIKKworICAgIGpzb25fZmlsZXMgPSBbaiBmb3IgaiBpbiBhcmdzLmpzb25fZmlsZXMgaWYgai5lbmRzd2l0aCgnLmpzb24nKV0KKyAgICBqc29uX2luX2ZpbGVzID0gW2ogZm9yIGogaW4gYXJncy5qc29uX2ZpbGVzIGlmIGouZW5kc3dpdGgoJy5qc29uLmluJyldCisKKyAgICBkYXRhX2tleSA9ICdJQ0QnIGlmIGFyZ3MuaWNkIGVsc2UgJ2xheWVyJworCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoc291cmNlX2Rpcik6CisgICAgICAgIHByaW50KHNvdXJjZV9kaXIgKyAnIGlzIG5vdCBhIGRpcmVjdG9yeS4nLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiAxCisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModGFyZ2V0X2Rpcik6CisgICAgICAgIG9zLm1ha2VkaXJzKHRhcmdldF9kaXIpCisKKyAgICAjIENvcHkgdGhlICouanNvbiBmaWxlcyBmcm9tIHNvdXJjZSBkaXIgdG8gdGFyZ2V0IGRpcgorICAgIGlmIChzZXQoZ2xvYl9zbGFzaChvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgJyouanNvbicpKSkgIT0gc2V0KGpzb25fZmlsZXMpKToKKyAgICAgICAgcHJpbnQoZ2xvYi5nbG9iKG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCAnKi5qc29uJykpKQorICAgICAgICBwcmludCgnLmpzb24gbGlzdCBpbiBnbiBmaWxlIGlzIG91dC1vZi1kYXRlJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gMQorCisgICAgZm9yIGpzb25fZm5hbWUgaW4ganNvbl9maWxlczoKKyAgICAgICAgaWYgbm90IGpzb25fZm5hbWUuZW5kc3dpdGgoJy5qc29uJyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB3aXRoIG9wZW4oanNvbl9mbmFtZSkgYXMgaW5maWxlOgorICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZChpbmZpbGUpCisKKyAgICAgICAgIyBVcGRhdGUgdGhlIHBhdGguCisgICAgICAgIGlmIG5vdCBkYXRhX2tleSBpbiBkYXRhOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCAnJXMnIGtleSBpbiAlcyIgJSAoZGF0YV9rZXksIGpzb25fZm5hbWUpKQorCisgICAgICAgICMgVGhlIHN0YW5kYXJkIHZhbGlkYXRpb24gbGF5ZXIgaGFzIG5vIGxpYnJhcnkgcGF0aC4KKyAgICAgICAgaWYgJ2xpYnJhcnlfcGF0aCcgaW4gZGF0YVtkYXRhX2tleV06CisgICAgICAgICAgICBwcmV2X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGRhdGFbZGF0YV9rZXldWydsaWJyYXJ5X3BhdGgnXSkKKyAgICAgICAgICAgIGRhdGFbZGF0YV9rZXldWydsaWJyYXJ5X3BhdGgnXSA9IHByZXZfbmFtZQorCisgICAgICAgIHRhcmdldF9mbmFtZSA9IG9zLnBhdGguam9pbih0YXJnZXRfZGlyLCBvcy5wYXRoLmJhc2VuYW1lKGpzb25fZm5hbWUpKQorICAgICAgICB3aXRoIG9wZW4odGFyZ2V0X2ZuYW1lLCAnd2InKSBhcyBvdXRmaWxlOgorICAgICAgICAgICAganNvbi5kdW1wKGRhdGEsIG91dGZpbGUpCisKKyAgICAjIEdldCB0aGUgVnVsa2FuIHZlcnNpb24gZnJvbSB0aGUgdnVsa2FuX2NvcmUuaCBmaWxlCisgICAgdmtfaGVhZGVyX2ZpbGVuYW1lID0gYXJncy52ZXJzaW9uX2hlYWRlcgorICAgIHZrX3ZlcnNpb24gPSBOb25lCisgICAgd2l0aCBvcGVuKHZrX2hlYWRlcl9maWxlbmFtZSkgYXMgdmtfaGVhZGVyX2ZpbGU6CisgICAgICAgIGZvciBsaW5lIGluIHZrX2hlYWRlcl9maWxlOgorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCcjZGVmaW5lIFZLX0hFQURFUl9WRVJTSU9OJyk6CisgICAgICAgICAgICAgICAgdmtfdmVyc2lvbiA9IGxpbmUuc3BsaXQoKVstMV0KKyAgICAgICAgICAgICAgICBicmVhaworICAgIGlmIG5vdCB2a192ZXJzaW9uOgorICAgICAgICBwcmludCgnZmFpbGVkIHRvIGV4dHJhY3QgdmtfdmVyc2lvbicsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIDEKKworICAgICMgU2V0IGpzb24gZmlsZSBwcmVmaXggYW5kIHN1ZmZpeCBmb3IgZ2VuZXJhdGluZyBmaWxlcywgZGVmYXVsdCB0byBMaW51eC4KKyAgICByZWxhdGl2ZV9wYXRoX3ByZWZpeCA9ICcuLi9saWInCisgICAgZmlsZV90eXBlX3N1ZmZpeCA9ICcuc28nCisgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICByZWxhdGl2ZV9wYXRoX3ByZWZpeCA9IHInLi5cXCcgICMganNvbi1lc2NhcGVkLCBoZW5jZSB0d28gYmFja3NsYXNoZXMuCisgICAgICAgIGZpbGVfdHlwZV9zdWZmaXggPSAnLmRsbCcKKworICAgICMgRm9yIGVhY2ggKi5qc29uLmluIHRlbXBsYXRlIGZpbGVzIGluIHNvdXJjZSBkaXIgZ2VuZXJhdGUgYWN0dWFsIGpzb24gZmlsZQorICAgICMgaW4gdGFyZ2V0IGRpcgorICAgIGlmIChzZXQoZ2xvYl9zbGFzaChvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgJyouanNvbi5pbicpKSkgIT0KKyAgICAgICAgICAgIHNldChqc29uX2luX2ZpbGVzKSk6CisgICAgICAgIHByaW50KCcuanNvbi5pbiBsaXN0IGluIGduIGZpbGUgaXMgb3V0LW9mLWRhdGUnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiAxCisgICAgZm9yIGpzb25faW5fbmFtZSBpbiBqc29uX2luX2ZpbGVzOgorICAgICAgICBpZiBub3QganNvbl9pbl9uYW1lLmVuZHN3aXRoKCcuanNvbi5pbicpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAganNvbl9pbl9mbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoanNvbl9pbl9uYW1lKQorICAgICAgICBsYXllcl9uYW1lID0ganNvbl9pbl9mbmFtZVs6LWxlbignLmpzb24uaW4nKV0KKyAgICAgICAgbGF5ZXJfbGliX25hbWUgPSBsYXllcl9uYW1lICsgZmlsZV90eXBlX3N1ZmZpeAorICAgICAgICBqc29uX291dF9mbmFtZSA9IG9zLnBhdGguam9pbih0YXJnZXRfZGlyLCBqc29uX2luX2ZuYW1lWzotbGVuKCcuaW4nKV0pCisgICAgICAgIHdpdGggb3Blbihqc29uX291dF9mbmFtZSwndycpIGFzIGpzb25fb3V0X2ZpbGUsIFwKKyAgICAgICAgICAgICBvcGVuKGpzb25faW5fbmFtZSkgYXMgaW5maWxlOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gaW5maWxlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoJ0BSRUxBVElWRV9MQVlFUl9CSU5BUllAJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlX3BhdGhfcHJlZml4ICsgbGF5ZXJfbGliX25hbWUpCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnQFZLX1ZFUlNJT05AJywgJzEuMS4nICsgdmtfdmVyc2lvbikKKyAgICAgICAgICAgICAgICBqc29uX291dF9maWxlLndyaXRlKGxpbmUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtZ24vc2Vjb25kYXJ5L2J1aWxkX292ZXJyaWRlcy9idWlsZC5nbmkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL2J1aWxkLmduaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmMxMWZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtZ24vc2Vjb25kYXJ5L2J1aWxkX292ZXJyaWRlcy9idWlsZC5nbmkKQEAgLTAsMCArMSwxOCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTkgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitidWlsZF93aXRoX2Nocm9taXVtID0gZmFsc2UKK2lnbm9yZV9lbGYzMl9saW1pdGF0aW9ucyA9IHRydWUKK2xpbnV4X3VzZV9idW5kbGVkX2JpbnV0aWxzX292ZXJyaWRlID0gZmFsc2UKK3VzZV9zeXN0ZW1feGNvZGUgPSB0cnVlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL3Z1bGthbl90b29scy5nbmkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL3Z1bGthbl90b29scy5nbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4MDg0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2J1aWxkLWduL3NlY29uZGFyeS9idWlsZF9vdmVycmlkZXMvdnVsa2FuX3Rvb2xzLmduaQpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoYykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgUGF0aHMgdG8gdnVsa2FuIHRvb2xzIGRlcGVuZGVuY2llcwordnVsa2FuX2hlYWRlcnNfZGlyID0gIi8vZXh0ZXJuYWwvVnVsa2FuLUhlYWRlcnMiCisKKyMgU3ViZGlyZWN0b3JpZXMgZm9yIGdlbmVyYXRlZCBmaWxlcwordnVsa2FuX2RhdGFfc3ViZGlyID0gIiIKK3Z1bGthbl9nZW5fc3ViZGlyID0gIiIKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtZ24vdXBkYXRlX2RlcHMuc2ggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9idWlsZC1nbi91cGRhdGVfZGVwcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MWRhMmFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvYnVpbGQtZ24vdXBkYXRlX2RlcHMuc2gKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBFeGVjdXRlIGF0IHJlcG8gcm9vdAorY2QgIiQoZGlybmFtZSAkMCkvLi4iCisKKyMgVXNlIHVwZGF0ZV9kZXBzLnB5IHRvIHVwZGF0ZSBzb3VyY2UgZGVwZW5kZW5jaWVzIGZyb20gL3NjcmlwdHMva25vd25fZ29vZC5qc29uCitzY3JpcHRzL3VwZGF0ZV9kZXBzLnB5IC0tZGlyPSJleHRlcm5hbCIgLS1uby1idWlsZAorCisjIFVzZSBnY2xpZW50IHRvIHVwZGF0ZSB0b29sY2hhaW4gZGVwZW5kZW5jaWVzIGZyb20gL2J1aWxkLWduL0RFUFMgKGZyb20gY2hyb21pdW0pCitjYXQgPDwgRU9GID4+IC5nY2xpZW50Citzb2x1dGlvbnMgPSBbCisgIHsgIm5hbWUiICAgICAgICA6ICIuIiwKKyAgICAidXJsIiAgICAgICAgIDogImh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVRvb2xzIiwKKyAgICAiZGVwc19maWxlIiAgIDogImJ1aWxkLWduL0RFUFMiLAorICAgICJtYW5hZ2VkIiAgICAgOiBGYWxzZSwKKyAgICAiY3VzdG9tX2RlcHMiIDogeworICAgIH0sCisgICAgImN1c3RvbV92YXJzIjoge30sCisgIH0sCitdCitFT0YKK2djbGllbnQgc3luYworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9Db3B5cmlnaHRfY21ha2UudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY21ha2UvQ29weXJpZ2h0X2NtYWtlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNjNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY21ha2UvQ29weXJpZ2h0X2NtYWtlLnR4dApAQCAtMCwwICsxLDEyNiBAQAorQ01ha2UgLSBDcm9zcyBQbGF0Zm9ybSBNYWtlZmlsZSBHZW5lcmF0b3IKK0NvcHlyaWdodCAyMDAwLTIwMTggS2l0d2FyZSwgSW5jLiBhbmQgQ29udHJpYnV0b3JzCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisqIE5laXRoZXIgdGhlIG5hbWUgb2YgS2l0d2FyZSwgSW5jLiBub3IgdGhlIG5hbWVzIG9mIENvbnRyaWJ1dG9ycworICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhbmQgaW5zdGl0dXRpb25zIGFyZSBhbW9uZyB0aGUgQ29udHJpYnV0b3JzOgorCisqIEFhcm9uIEMuIE1lYWRvd3MgPGNtYWtlQHNoYWRvd2d1YXJkZGV2LmNvbT4KKyogQWRyaWFhbiBkZSBHcm9vdCA8Z3Jvb3RAa2RlLm9yZz4KKyogQWxla3NleSBBdmRlZXYgPHNvbG9AYWx0bGludXgucnU+CisqIEFsZXhhbmRlciBOZXVuZG9yZiA8bmV1bmRvcmZAa2RlLm9yZz4KKyogQWxleGFuZGVyIFNtb3JrYWxvdiA8YWxleGFuZGVyLnNtb3JrYWxvdkBpdHNlZXouY29tPgorKiBBbGV4ZXkgU29rb2xvdiA8c29rb2xvdkBnb29nbGUuY29tPgorKiBBbGV4IFR1cmJvdiA8aS56YXVmaUBnbWFpbC5jb20+CisqIEFuZHJlYXMgUGFrdWxhdCA8YXBha3VAZ214LmRlPgorKiBBbmRyZWFzIFNjaG5laWRlciA8YXNuQGNyeXB0b21pbGsub3JnPgorKiBBbmRyw6kgUmlnbGFuZCBCcm9kdGtvcmIgPEFuZHJlLkJyb2R0a29yYkBpZmkudWlvLm5vPgorKiBBeGVsIEh1ZWJsLCBIZWxtaG9sdHotWmVudHJ1bSBEcmVzZGVuIC0gUm9zc2VuZG9yZgorKiBCZW5qYW1pbiBFaWtlbAorKiBCam9lcm4gUmlja3MgPGJqb2Vybi5yaWNrc0BnbWFpbC5jb20+CisqIEJyYWQgSGFyZHMgPGJyYWRoQGtkZS5vcmc+CisqIENocmlzdG9waGVyIEhhcnZleQorKiBDaHJpc3RvcGggR3LDvG5pbmdlciA8Zm9zc0BncnVlbmluZ2VyLmRlPgorKiBDbGVtZW50IENyZXVzb3QgPGNyZXVzb3RAY3MueW9yay5hYy51az4KKyogRGFuaWVsIEJsZXplayA8YmxlemVrQGdtYWlsLmNvbT4KKyogRGFuaWVsIFBmZWlmZXIgPGRhbmllbEBwZmVpZmVyLW1haWwuZGU+CisqIEVucmljbyBTY2hvbHogPGVucmljby5zY2hvbHpAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KKyogRXJhbiBJZnJhaCA8ZXJhbi5pZnJhaEBnbWFpbC5jb20+CisqIEVzYmVuIE1vc2UgSGFuc2VuLCBBbmdlIE9wdGltaXphdGlvbiBBcFMKKyogR2VvZmZyZXkgVmlvbGEgPGdlb2ZmcmV5LnZpb2xhQGFzaXJvYm90cy5jb20+CisqIEdvb2dsZSBJbmMKKyogR3JlZ29yIEphc255CisqIEhlbGlvIENoaXNzaW5pIGRlIENhc3RybyA8aGVsaW9Aa2RlLm9yZz4KKyogSWx5YSBMYXZyZW5vdiA8aWx5YS5sYXZyZW5vdkBpdHNlZXouY29tPgorKiBJbnNpZ2h0IFNvZnR3YXJlIENvbnNvcnRpdW0gPGluc2lnaHRzb2Z0d2FyZWNvbnNvcnRpdW0ub3JnPgorKiBKYW4gV29ldHplbAorKiBLZWxseSBUaG9tcHNvbiA8a2d0QGxhbmwuZ292PgorKiBLb25zdGFudGluIFBvZHN2aXJvdiA8a29uc3RhbnRpbkBwb2Rzdmlyb3YucHJvPgorKiBNYXJpbyBCZW5zaSA8bWJlbnNpQGlwc3F1YWQubmV0PgorKiBNYXRoaWV1IE1hbGF0ZXJyZSA8bWF0aGlldS5tYWxhdGVycmVAZ21haWwuY29tPgorKiBNYXR0aGFldXMgRy4gQ2hhamRhcworKiBNYXR0aGlhcyBLcmV0eiA8a3JldHpAa2RlLm9yZz4KKyogTWF0dGhpYXMgTWFlbm5pY2ggPG1hdHRoaWFzQG1hZW5uaWNoLm5ldD4KKyogTWljaGFlbCBTdMO8cm1lcgorKiBNaWd1ZWwgQS4gRmlndWVyb2EtVmlsbGFudWV2YQorKiBNaWtlIEphY2tzb24KKyogTWlrZSBNY1F1YWlkIDxtaWtlQG1pa2VtY3F1YWlkLmNvbT4KKyogTmljb2xhcyBCb2NrIDxuaWNvbGFzYm9ja0BnbWFpbC5jb20+CisqIE5pY29sYXMgRGVzcHJlcyA8bmljb2xhcy5kZXNwcmVzQGdtYWlsLmNvbT4KKyogTmlraXRhIEtydXBlbidrbyA8a3JuZWtpdEBnbWFpbC5jb20+CisqIE5WSURJQSBDb3Jwb3JhdGlvbiA8d3d3Lm52aWRpYS5jb20+CisqIE9wZW5HYW1tYSBMdGQuIDxvcGVuZ2FtbWEuY29tPgorKiBQYXRyaWNrIFN0b3RrbyA8c3RvdGtvQGNzLnVuaS1ib25uLmRlPgorKiBQZXIgw5h5dmluZCBLYXJsc2VuIDxwZXJveXZpbmRAbWFuZHJpdmEub3JnPgorKiBQZXRlciBDb2xsaW5nYm91cm5lIDxwZXRlckBwY2MubWUudWs+CisqIFBldHIgR290dGhhcmQgPGdvdHRoYXJkQGhvbmV5d2VsbC5jb20+CisqIFBoaWxpcCBMb3dtYW4gPHBoaWxpcEB5aGJ0LmNvbT4KKyogUGhpbGlwcGUgUHJvdWx4IDxwcHJvdWx4QGVmZmljaW9zLmNvbT4KKyogUmFmZmkgRW5maWNpYXVkLCBNYXggUGxhbmNrIFNvY2lldHkKKyogUmF1bWZlbGQgPHJhdW1mZWxkLmNvbT4KKyogUm9nZXIgTGVpZ2ggPHJsZWlnaEBjb2RlbGlicmUubmV0PgorKiBSb2xmIEVpa2UgQmVlciA8ZWlrZUBzZi1tYWlsLmRlPgorKiBSb21hbiBEb25jaGVua28gPHJvbWFuLmRvbmNoZW5rb0BpdHNlZXouY29tPgorKiBSb21hbiBLaGFyaXRvbm92IDxyb21hbi5raGFyaXRvbm92QGl0c2Vlei5jb20+CisqIFJ1c2xhbiBCYXJhdG92CisqIFNlYmFzdGlhbiBIb2x0ZXJtYW5uIDxzZWJob2x0QHh3bXcub3JnPgorKiBTdGVwaGVuIEtlbGx5IDxzdGV2ZWlyZUBnbWFpbC5jb20+CisqIFN5bHZhaW4gSm91YmVydCA8am91YmVydC5zeUBnbWFpbC5jb20+CisqIFRob21hcyBTb25kZXJnYWFyZCA8dHNAbWVkaWNhbC1pbnNpZ2h0LmNvbT4KKyogVG9iaWFzIEh1bmdlciA8dG9iaWFzLmh1bmdlckBxdC5pbz4KKyogVG9kZCBHYW1ibGluIDx0Z2FtYmxpbkBsbG5sLmdvdj4KKyogVHJpc3RhbiBDYXJlbAorKiBVbml2ZXJzaXR5IG9mIER1bmRlZQorKiBWYWRpbSBaaHVrb3YKKyogV2lsbCBEaWNoYXJyeSA8d2RpY2hhcnJ5QHN0ZWxsYXJzY2llbmNlLmNvbT4KKworU2VlIHZlcnNpb24gY29udHJvbCBoaXN0b3J5IGZvciBkZXRhaWxzIG9mIGluZGl2aWR1YWwgY29udHJpYnV0aW9ucy4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UgYXBwbGllcyB0byBkaXN0cmlidXRpb25zIG9mCitDTWFrZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtLiAgVGhpcmQtcGFydHkgc29mdHdhcmUgcGFja2FnZXMgc3VwcGxpZWQKK3dpdGggQ01ha2UgdW5kZXIgY29tcGF0aWJsZSBsaWNlbnNlcyBwcm92aWRlIHRoZWlyIG93biBjb3B5cmlnaHQgbm90aWNlcworZG9jdW1lbnRlZCBpbiBjb3JyZXNwb25kaW5nIHN1YmRpcmVjdG9yaWVzIG9yIHNvdXJjZSBmaWxlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NNYWtlIHdhcyBpbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IEtpdHdhcmUgd2l0aCB0aGUgZm9sbG93aW5nIHNwb25zb3JzaGlwOgorCisgKiBOYXRpb25hbCBMaWJyYXJ5IG9mIE1lZGljaW5lIGF0IHRoZSBOYXRpb25hbCBJbnN0aXR1dGVzIG9mIEhlYWx0aAorICAgYXMgcGFydCBvZiB0aGUgSW5zaWdodCBTZWdtZW50YXRpb24gYW5kIFJlZ2lzdHJhdGlvbiBUb29sa2l0IChJVEspLgorCisgKiBVUyBOYXRpb25hbCBMYWJzIChMb3MgQWxhbW9zLCBMaXZlcm1vcmUsIFNhbmRpYSkgQVNDIFBhcmFsbGVsCisgICBWaXN1YWxpemF0aW9uIEluaXRpYXRpdmUuCisKKyAqIE5hdGlvbmFsIEFsbGlhbmNlIGZvciBNZWRpY2FsIEltYWdlIENvbXB1dGluZyAoTkFNSUMpIGlzIGZ1bmRlZCBieSB0aGUKKyAgIE5hdGlvbmFsIEluc3RpdHV0ZXMgb2YgSGVhbHRoIHRocm91Z2ggdGhlIE5JSCBSb2FkbWFwIGZvciBNZWRpY2FsIFJlc2VhcmNoLAorICAgR3JhbnQgVTU0IEVCMDA1MTQ5LgorCisgKiBLaXR3YXJlLCBJbmMuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9GaW5kVnVsa2FuLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY21ha2UvRmluZFZ1bGthbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjRjOGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY21ha2UvRmluZFZ1bGthbi5jbWFrZQpAQCAtMCwwICsxLDgwIEBACisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBPU0ktYXBwcm92ZWQgQlNEIDMtQ2xhdXNlIExpY2Vuc2UuICBTZWUgYWNjb21wYW55aW5nCisjIGZpbGUgQ29weXJpZ2h0LnR4dCBvciBodHRwczovL2NtYWtlLm9yZy9saWNlbnNpbmcgZm9yIGRldGFpbHMuCisKKyMucnN0OgorIyBGaW5kVnVsa2FuCisjIC0tLS0tLS0tLS0KKyMKKyMgVHJ5IHRvIGZpbmQgVnVsa2FuCisjCisjIElNUE9SVEVEIFRhcmdldHMKKyMgXl5eXl5eXl5eXl5eXl5eXgorIworIyBUaGlzIG1vZHVsZSBkZWZpbmVzIDpwcm9wX3RndDpgSU1QT1JURURgIHRhcmdldCBgYFZ1bGthbjo6VnVsa2FuYGAsIGlmCisjIFZ1bGthbiBoYXMgYmVlbiBmb3VuZC4KKyMKKyMgUmVzdWx0IFZhcmlhYmxlcworIyBeXl5eXl5eXl5eXl5eXl5eCisjCisjIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6OgorIworIyAgIFZ1bGthbl9GT1VORCAgICAgICAgICAtIFRydWUgaWYgVnVsa2FuIHdhcyBmb3VuZAorIyAgIFZ1bGthbl9JTkNMVURFX0RJUlMgICAtIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIFZ1bGthbgorIyAgIFZ1bGthbl9MSUJSQVJJRVMgICAgICAtIGxpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkgdG8gdXNlIFZ1bGthbgorIworIyBUaGUgbW9kdWxlIHdpbGwgYWxzbyBkZWZpbmUgdHdvIGNhY2hlIHZhcmlhYmxlczo6CisjCisjICAgVnVsa2FuX0lOQ0xVREVfRElSICAgIC0gdGhlIFZ1bGthbiBpbmNsdWRlIGRpcmVjdG9yeQorIyAgIFZ1bGthbl9MSUJSQVJZICAgICAgICAtIHRoZSBwYXRoIHRvIHRoZSBWdWxrYW4gbGlicmFyeQorIworCitpZihXSU4zMikKKyAgZmluZF9wYXRoKFZ1bGthbl9JTkNMVURFX0RJUgorICAgIE5BTUVTIHZ1bGthbi92dWxrYW4uaAorICAgIFBBVEhTCisgICAgICAiJEVOVntWVUxLQU5fU0RLfS9JbmNsdWRlIgorICAgICkKKworICBpZihDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgZmluZF9saWJyYXJ5KFZ1bGthbl9MSUJSQVJZCisgICAgICBOQU1FUyB2dWxrYW4tMQorICAgICAgUEFUSFMKKyAgICAgICAgIiRFTlZ7VlVMS0FOX1NES30vTGliIgorICAgICAgICAiJEVOVntWVUxLQU5fU0RLfS9CaW4iCisgICAgICAgICkKKyAgZWxzZWlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgNCkKKyAgICBmaW5kX2xpYnJhcnkoVnVsa2FuX0xJQlJBUlkKKyAgICAgIE5BTUVTIHZ1bGthbi0xCisgICAgICBQQVRIUworICAgICAgICAiJEVOVntWVUxLQU5fU0RLfS9MaWIzMiIKKyAgICAgICAgIiRFTlZ7VlVMS0FOX1NES30vQmluMzIiCisgICAgICAgIE5PX1NZU1RFTV9FTlZJUk9OTUVOVF9QQVRICisgICAgICAgICkKKyAgZW5kaWYoKQorZWxzZSgpCisgICAgZmluZF9wYXRoKFZ1bGthbl9JTkNMVURFX0RJUgorICAgICAgTkFNRVMgdnVsa2FuL3Z1bGthbi5oCisgICAgICBQQVRIUworICAgICAgICAiJEVOVntWVUxLQU5fU0RLfS9pbmNsdWRlIikKKyAgICBmaW5kX2xpYnJhcnkoVnVsa2FuX0xJQlJBUlkKKyAgICAgIE5BTUVTIHZ1bGthbgorICAgICAgUEFUSFMKKyAgICAgICAgIiRFTlZ7VlVMS0FOX1NES30vbGliIikKK2VuZGlmKCkKKworc2V0KFZ1bGthbl9MSUJSQVJJRVMgJHtWdWxrYW5fTElCUkFSWX0pCitzZXQoVnVsa2FuX0lOQ0xVREVfRElSUyAke1Z1bGthbl9JTkNMVURFX0RJUn0pCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoVnVsa2FuCisgIERFRkFVTFRfTVNHCisgIFZ1bGthbl9MSUJSQVJZIFZ1bGthbl9JTkNMVURFX0RJUikKKworbWFya19hc19hZHZhbmNlZChWdWxrYW5fSU5DTFVERV9ESVIgVnVsa2FuX0xJQlJBUlkpCisKK2lmKFZ1bGthbl9GT1VORCBBTkQgTk9UIFRBUkdFVCBWdWxrYW46OlZ1bGthbikKKyAgYWRkX2xpYnJhcnkoVnVsa2FuOjpWdWxrYW4gVU5LTk9XTiBJTVBPUlRFRCkKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZ1bGthbjo6VnVsa2FuIFBST1BFUlRJRVMKKyAgICBJTVBPUlRFRF9MT0NBVElPTiAiJHtWdWxrYW5fTElCUkFSSUVTfSIKKyAgICBJTlRFUkZBQ0VfSU5DTFVERV9ESVJFQ1RPUklFUyAiJHtWdWxrYW5fSU5DTFVERV9ESVJTfSIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9GaW5kVnVsa2FuSGVhZGVycy5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NtYWtlL0ZpbmRWdWxrYW5IZWFkZXJzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDU4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9GaW5kVnVsa2FuSGVhZGVycy5jbWFrZQpAQCAtMCwwICsxLDY5IEBACisjLnJzdDoKKyMgRmluZFZ1bGthbkhlYWRlcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgVHJ5IHRvIGZpbmQgVnVsa2FuIEhlYWRlcnMgYW5kIFJlZ2lzdHJ5LgorIworIyBUaGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHByb2plY3RzIHRoYXQgYnVpbGQgVnVsa2FuCisjICJzeXN0ZW0iIGNvbXBvbmVudHMgc3VjaCBhcyB0aGUgbG9hZGVyIGFuZCBsYXllcnMuCisjIFZ1bGthbiBhcHBsaWNhdGlvbnMgc2hvdWxkIGluc3RlYWQgdXNlIHRoZSBGaW5kVnVsa2FuIChvciBzaW1pbGFyKQorIyBmaW5kIG1vZHVsZSB0aGF0IGxvY2F0ZXMgdGhlIGhlYWRlcnMgYW5kIHRoZSBsb2FkZXIgbGlicmFyeS4KKyMKKyMgV2hlbiB1c2luZyB0aGlzIGZpbmQgbW9kdWxlIHRvIGxvY2F0ZSB0aGUgaGVhZGVycyBhbmQgcmVnaXN0cnkKKyMgaW4gYSBWdWxrYW4tSGVhZGVycyByZXBvc2l0b3J5LCB0aGUgVnVsa2FuLUhlYWRlcnMgcmVwb3NpdG9yeQorIyBzaG91bGQgYmUgYnVpbHQgd2l0aCAnaW5zdGFsbCcgdGFyZ2V0IGFuZCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50CisjIG9yIENNYWtlIHZhcmlhYmxlIHNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGluc3RhbGwgZGlyZWN0b3J5LgorIworIyAgICBWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUgorIworIyBJTVBPUlRFRCBUYXJnZXRzCisjIF5eXl5eXl5eXl5eXl5eXl4KKyMKKyMgVGhpcyBtb2R1bGUgZGVmaW5lcyBubyBJTVBPUlRFRCB0YXJnZXRzCisjCisjIFJlc3VsdCBWYXJpYWJsZXMKKyMgXl5eXl5eXl5eXl5eXl5eXgorIworIyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOjoKKyMKKyMgICBWdWxrYW5IZWFkZXJzX0ZPVU5EICAgICAgICAgIC0gVHJ1ZSBpZiBWdWxrYW5IZWFkZXJzIHdhcyBmb3VuZAorIyAgIFZ1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTICAgLSBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciBWdWxrYW5IZWFkZXJzCisjCisjICAgVnVsa2FuUmVnaXN0cnlfRk9VTkQgICAgICAgICAtIFRydWUgaWYgVnVsa2FuUmVnaXN0cnkgd2FzIGZvdW5kCisjICAgVnVsa2FuUmVnaXN0cnlfRElSUyAgICAgICAgICAtIGRpcmVjdG9yaWVzIGZvciBWdWxrYW5SZWdpc3RyeQorIworIyBUaGUgbW9kdWxlIHdpbGwgYWxzbyBkZWZpbmUgdHdvIGNhY2hlIHZhcmlhYmxlczo6CisjCisjICAgVnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUiAgICAtIHRoZSBWdWxrYW5IZWFkZXJzIGluY2x1ZGUgZGlyZWN0b3J5CisjICAgVnVsa2FuUmVnaXN0cnlfRElSICAgICAgICAgICAtIHRoZSBWdWxrYW5SZWdpc3RyeSBkaXJlY3RvcnkKKyMKKworIyBVc2UgSElOVFMgaW5zdGVhZCBvZiBQQVRIIHRvIHNlYXJjaCB0aGVzZSBsb2NhdGlvbnMgYmVmb3JlCisjIHNlYXJjaGluZyBzeXN0ZW0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGxpa2UgJFBBVEggdGhhdCBtYXkKKyMgY29udGFpbiBTREsgZGlyZWN0b3JpZXMuCitmaW5kX3BhdGgoVnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUgorICAgIE5BTUVTIHZ1bGthbi92dWxrYW4uaAorICAgIEhJTlRTCisgICAgICAgICR7VlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJ9L2luY2x1ZGUKKyAgICAgICAgIiRFTlZ7VlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJ9L2luY2x1ZGUiCisgICAgICAgICIkRU5We1ZVTEtBTl9TREt9L2luY2x1ZGUiKQorCitpZihWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSKQorICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChWVUxLQU5fUkVHSVNUUllfUEFUSF9ISU5UICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0gRElSRUNUT1JZKQorICAgZmluZF9wYXRoKFZ1bGthblJlZ2lzdHJ5X0RJUgorICAgICAgIE5BTUVTIHZrLnhtbAorICAgICAgIEhJTlRTICIke1ZVTEtBTl9SRUdJU1RSWV9QQVRIX0hJTlR9L3NoYXJlL3Z1bGthbi9yZWdpc3RyeSIpCitlbmRpZigpCisKK3NldChWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSUyAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJ9KQorc2V0KFZ1bGthblJlZ2lzdHJ5X0RJUlMgJHtWdWxrYW5SZWdpc3RyeV9ESVJ9KQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFZ1bGthbkhlYWRlcnMKKyAgICBERUZBVUxUX01TRworICAgIFZ1bGthbkhlYWRlcnNfSU5DTFVERV9ESVIpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoVnVsa2FuUmVnaXN0cnkKKyAgICBERUZBVUxUX01TRworICAgIFZ1bGthblJlZ2lzdHJ5X0RJUikKKworbWFya19hc19hZHZhbmNlZChWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSIFZ1bGthblJlZ2lzdHJ5X0RJUikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NtYWtlL0ZpbmRXYXlsYW5kLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY21ha2UvRmluZFdheWxhbmQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMjE4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NtYWtlL0ZpbmRXYXlsYW5kLmNtYWtlCkBAIC0wLDAgKzEsNjYgQEAKKyMgVHJ5IHRvIGZpbmQgV2F5bGFuZCBvbiBhIFVuaXggc3lzdGVtCisjCisjIFRoaXMgd2lsbCBkZWZpbmU6CisjCisjICAgV0FZTEFORF9GT1VORCAgICAgICAtIFRydWUgaWYgV2F5bGFuZCBpcyBmb3VuZAorIyAgIFdBWUxBTkRfTElCUkFSSUVTICAgLSBMaW5rIHRoZXNlIHRvIHVzZSBXYXlsYW5kCisjICAgV0FZTEFORF9JTkNMVURFX0RJUiAtIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBXYXlsYW5kCisjICAgV0FZTEFORF9ERUZJTklUSU9OUyAtIENvbXBpbGVyIGZsYWdzIGZvciB1c2luZyBXYXlsYW5kCisjCisjIEluIGFkZGl0aW9uIHRoZSBmb2xsb3dpbmcgbW9yZSBmaW5lIGdyYWluZWQgdmFyaWFibGVzIHdpbGwgYmUgZGVmaW5lZDoKKyMKKyMgICBXQVlMQU5EX0NMSUVOVF9GT1VORCAgV0FZTEFORF9DTElFTlRfSU5DTFVERV9ESVIgIFdBWUxBTkRfQ0xJRU5UX0xJQlJBUklFUworIyAgIFdBWUxBTkRfU0VSVkVSX0ZPVU5EICBXQVlMQU5EX1NFUlZFUl9JTkNMVURFX0RJUiAgV0FZTEFORF9TRVJWRVJfTElCUkFSSUVTCisjICAgV0FZTEFORF9FR0xfRk9VTkQgICAgIFdBWUxBTkRfRUdMX0lOQ0xVREVfRElSICAgICBXQVlMQU5EX0VHTF9MSUJSQVJJRVMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzIE1hcnRpbiBHcsOkw59saW4gPG1ncmFlc3NsaW5Aa2RlLm9yZz4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorIyBGb3IgZGV0YWlscyBzZWUgdGhlIGFjY29tcGFueWluZyBDT1BZSU5HLUNNQUtFLVNDUklQVFMgZmlsZS4KKworSUYgKE5PVCBXSU4zMikKKyAgSUYgKFdBWUxBTkRfSU5DTFVERV9ESVIgQU5EIFdBWUxBTkRfTElCUkFSSUVTKQorICAgICMgSW4gdGhlIGNhY2hlIGFscmVhZHkKKyAgICBTRVQoV0FZTEFORF9GSU5EX1FVSUVUTFkgVFJVRSkKKyAgRU5ESUYgKCkKKworICAjIFVzZSBwa2ctY29uZmlnIHRvIGdldCB0aGUgZGlyZWN0b3JpZXMgYW5kIHRoZW4gdXNlIHRoZXNlIHZhbHVlcworICAjIGluIHRoZSBGSU5EX1BBVEgoKSBhbmQgRklORF9MSUJSQVJZKCkgY2FsbHMKKyAgRklORF9QQUNLQUdFKFBrZ0NvbmZpZykKKyAgUEtHX0NIRUNLX01PRFVMRVMoUEtHX1dBWUxBTkQgUVVJRVQgd2F5bGFuZC1jbGllbnQgd2F5bGFuZC1zZXJ2ZXIgd2F5bGFuZC1lZ2wgd2F5bGFuZC1jdXJzb3IpCisKKyAgU0VUKFdBWUxBTkRfREVGSU5JVElPTlMgJHtQS0dfV0FZTEFORF9DRkxBR1N9KQorCisgIEZJTkRfUEFUSChXQVlMQU5EX0NMSUVOVF9JTkNMVURFX0RJUiAgTkFNRVMgd2F5bGFuZC1jbGllbnQuaCBISU5UUyAke1BLR19XQVlMQU5EX0lOQ0xVREVfRElSU30pCisgIEZJTkRfUEFUSChXQVlMQU5EX1NFUlZFUl9JTkNMVURFX0RJUiAgTkFNRVMgd2F5bGFuZC1zZXJ2ZXIuaCBISU5UUyAke1BLR19XQVlMQU5EX0lOQ0xVREVfRElSU30pCisgIEZJTkRfUEFUSChXQVlMQU5EX0VHTF9JTkNMVURFX0RJUiAgICAgTkFNRVMgd2F5bGFuZC1lZ2wuaCAgICBISU5UUyAke1BLR19XQVlMQU5EX0lOQ0xVREVfRElSU30pCisgIEZJTkRfUEFUSChXQVlMQU5EX0NVUlNPUl9JTkNMVURFX0RJUiAgTkFNRVMgd2F5bGFuZC1jdXJzb3IuaCBISU5UUyAke1BLR19XQVlMQU5EX0lOQ0xVREVfRElSU30pCisKKyAgRklORF9MSUJSQVJZKFdBWUxBTkRfQ0xJRU5UX0xJQlJBUklFUyBOQU1FUyB3YXlsYW5kLWNsaWVudCAgIEhJTlRTICR7UEtHX1dBWUxBTkRfTElCUkFSWV9ESVJTfSkKKyAgRklORF9MSUJSQVJZKFdBWUxBTkRfU0VSVkVSX0xJQlJBUklFUyBOQU1FUyB3YXlsYW5kLXNlcnZlciAgIEhJTlRTICR7UEtHX1dBWUxBTkRfTElCUkFSWV9ESVJTfSkKKyAgRklORF9MSUJSQVJZKFdBWUxBTkRfRUdMX0xJQlJBUklFUyAgICBOQU1FUyB3YXlsYW5kLWVnbCAgICAgIEhJTlRTICR7UEtHX1dBWUxBTkRfTElCUkFSWV9ESVJTfSkKKyAgRklORF9MSUJSQVJZKFdBWUxBTkRfQ1VSU09SX0xJQlJBUklFUyBOQU1FUyB3YXlsYW5kLWN1cnNvciAgIEhJTlRTICR7UEtHX1dBWUxBTkRfTElCUkFSWV9ESVJTfSkKKworICBzZXQoV0FZTEFORF9JTkNMVURFX0RJUiAke1dBWUxBTkRfQ0xJRU5UX0lOQ0xVREVfRElSfSAke1dBWUxBTkRfU0VSVkVSX0lOQ0xVREVfRElSfSAke1dBWUxBTkRfRUdMX0lOQ0xVREVfRElSfSAke1dBWUxBTkRfQ1VSU09SX0lOQ0xVREVfRElSfSkKKworICBzZXQoV0FZTEFORF9MSUJSQVJJRVMgJHtXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVN9ICR7V0FZTEFORF9TRVJWRVJfTElCUkFSSUVTfSAke1dBWUxBTkRfRUdMX0xJQlJBUklFU30gJHtXQVlMQU5EX0NVUlNPUl9MSUJSQVJJRVN9KQorCisgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgV0FZTEFORF9JTkNMVURFX0RJUikKKworICBpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCisgIEZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhXQVlMQU5EX0NMSUVOVCAgREVGQVVMVF9NU0cgIFdBWUxBTkRfQ0xJRU5UX0xJQlJBUklFUyAgV0FZTEFORF9DTElFTlRfSU5DTFVERV9ESVIpCisgIEZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhXQVlMQU5EX1NFUlZFUiAgREVGQVVMVF9NU0cgIFdBWUxBTkRfU0VSVkVSX0xJQlJBUklFUyAgV0FZTEFORF9TRVJWRVJfSU5DTFVERV9ESVIpCisgIEZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhXQVlMQU5EX0VHTCAgICAgREVGQVVMVF9NU0cgIFdBWUxBTkRfRUdMX0xJQlJBUklFUyAgICAgV0FZTEFORF9FR0xfSU5DTFVERV9ESVIpCisgIEZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhXQVlMQU5EX0NVUlNPUiAgREVGQVVMVF9NU0cgIFdBWUxBTkRfQ1VSU09SX0xJQlJBUklFUyAgV0FZTEFORF9DVVJTT1JfSU5DTFVERV9ESVIpCisgIEZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhXQVlMQU5EICAgICAgICAgREVGQVVMVF9NU0cgIFdBWUxBTkRfTElCUkFSSUVTICAgICAgICAgV0FZTEFORF9JTkNMVURFX0RJUikKKworICBNQVJLX0FTX0FEVkFOQ0VEKAorICAgICAgICBXQVlMQU5EX0lOQ0xVREVfRElSICAgICAgICAgV0FZTEFORF9MSUJSQVJJRVMKKyAgICAgICAgV0FZTEFORF9DTElFTlRfSU5DTFVERV9ESVIgIFdBWUxBTkRfQ0xJRU5UX0xJQlJBUklFUworICAgICAgICBXQVlMQU5EX1NFUlZFUl9JTkNMVURFX0RJUiAgV0FZTEFORF9TRVJWRVJfTElCUkFSSUVTCisgICAgICAgIFdBWUxBTkRfRUdMX0lOQ0xVREVfRElSICAgICBXQVlMQU5EX0VHTF9MSUJSQVJJRVMKKyAgICAgICAgV0FZTEFORF9DVVJTT1JfSU5DTFVERV9ESVIgIFdBWUxBTkRfQ1VSU09SX0xJQlJBUklFUworICApCisKK0VORElGICgpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9GaW5kWDExX1hDQi5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NtYWtlL0ZpbmRYMTFfWENCLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmJmODkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9GaW5kWDExX1hDQi5jbWFrZQpAQCAtMCwwICsxLDMyIEBACisjIC0gVHJ5IHRvIGZpbmQgbGliWDExLXhjYgorIyBPbmNlIGRvbmUgdGhpcyB3aWxsIGRlZmluZQorIworIyBYMTFfWENCX0ZPVU5EIC0gc3lzdGVtIGhhcyBsaWJYMTEteGNiCisjIFgxMV9YQ0JfTElCUkFSSUVTIC0gTGluayB0aGVzZSB0byB1c2UgbGliWDExLXhjYgorIyBYMTFfWENCX0lOQ0xVREVfRElSIC0gdGhlIGxpYlgxMS14Y2IgaW5jbHVkZSBkaXIKKyMgWDExX1hDQl9ERUZJTklUSU9OUyAtIGNvbXBpbGVyIHN3aXRjaGVzIHJlcXVpcmVkIGZvciB1c2luZyBsaWJYMTEteGNiCisKKyMgQ29weXJpZ2h0IChjKSAyMDExIEZyZWRyaWsgSMO2Z2x1bmQgPGZyZWRyaWtAa2RlLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDA4IEhlbGlvIENoaXNzaW5pIGRlIENhc3RybywgPGhlbGlvQGtkZS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAwNyBNYXR0aGlhcyBLcmV0eiwgPGtyZXR6QGtkZS5vcmc+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKK0lGIChOT1QgV0lOMzIpCisgICMgdXNlIHBrZy1jb25maWcgdG8gZ2V0IHRoZSBkaXJlY3RvcmllcyBhbmQgdGhlbiB1c2UgdGhlc2UgdmFsdWVzCisgICMgaW4gdGhlIEZJTkRfUEFUSCgpIGFuZCBGSU5EX0xJQlJBUlkoKSBjYWxscworICBGSU5EX1BBQ0tBR0UoUGtnQ29uZmlnKQorICBQS0dfQ0hFQ0tfTU9EVUxFUyhQS0dfWDExX1hDQiBRVUlFVCB4MTEteGNiKQorCisgIFNFVChYMTFfWENCX0RFRklOSVRJT05TICR7UEtHX1gxMV9YQ0JfQ0ZMQUdTfSkKKworICBGSU5EX1BBVEgoWDExX1hDQl9JTkNMVURFX0RJUiBOQU1FUyBYMTEvWGxpYi14Y2IuaCBISU5UUyAke1BLR19YMTFfWENCX0lOQ0xVREVfRElSU30pCisgIEZJTkRfTElCUkFSWShYMTFfWENCX0xJQlJBUklFUyBOQU1FUyBYMTEteGNiIEhJTlRTICR7UEtHX1gxMV9YQ0JfTElCUkFSWV9ESVJTfSkKKworICBpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoWDExX1hDQiBERUZBVUxUX01TRyBYMTFfWENCX0xJQlJBUklFUyBYMTFfWENCX0lOQ0xVREVfRElSKQorCisgIE1BUktfQVNfQURWQU5DRUQoWDExX1hDQl9JTkNMVURFX0RJUiBYMTFfWENCX0xJQlJBUklFUykKK0VORElGIChOT1QgV0lOMzIpCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NtYWtlL0ZpbmRYQ0IuY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9GaW5kWENCLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTE1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9GaW5kWENCLmNtYWtlCkBAIC0wLDAgKzEsNTEgQEAKKyMgLSBGaW5kWENCCisjCisjIENvcHlyaWdodCAoQykgMjAxNSBWYWx2ZSBDb3Jwb3JhdGlvbgorCitmaW5kX3BhY2thZ2UoUGtnQ29uZmlnKQorCitpZihOT1QgWENCX0ZJTkRfQ09NUE9ORU5UUykKKyAgICBzZXQoWENCX0ZJTkRfQ09NUE9ORU5UUyB4Y2IpCitlbmRpZigpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitzZXQoWENCX0ZPVU5EIHRydWUpCitzZXQoWENCX0lOQ0xVREVfRElSUyAiIikKK3NldChYQ0JfTElCUkFSSUVTICIiKQorZm9yZWFjaChjb21wICR7WENCX0ZJTkRfQ09NUE9ORU5UU30pCisgICAgIyBjb21wb25lbnQgbmFtZQorICAgIHN0cmluZyhUT1VQUEVSICR7Y29tcH0gY29tcG5hbWUpCisgICAgc3RyaW5nKFJFUExBQ0UgIi0iICJfIiBjb21wbmFtZSAke2NvbXBuYW1lfSkKKyAgICAjIGhlYWRlciBuYW1lCisgICAgc3RyaW5nKFJFUExBQ0UgInhjYi0iICIiIGhlYWRlcm5hbWUgeGNiLyR7Y29tcH0uaCkKKyAgICAjIGxpYnJhcnkgbmFtZQorICAgIHNldChsaWJuYW1lICR7Y29tcH0pCisKKyAgICBwa2dfY2hlY2tfbW9kdWxlcyhQQ18ke2NvbXB9IFFVSUVUICR7Y29tcH0pCisKKyAgICBmaW5kX3BhdGgoJHtjb21wbmFtZX1fSU5DTFVERV9ESVIgTkFNRVMgJHtoZWFkZXJuYW1lfQorICAgICAgICBISU5UUworICAgICAgICAke1BDXyR7Y29tcH1fSU5DTFVERURJUn0KKyAgICAgICAgJHtQQ18ke2NvbXB9X0lOQ0xVREVfRElSU30KKyAgICAgICAgKQorCisgICAgZmluZF9saWJyYXJ5KCR7Y29tcG5hbWV9X0xJQlJBUlkgTkFNRVMgJHtsaWJuYW1lfQorICAgICAgICBISU5UUworICAgICAgICAke1BDXyR7Y29tcH1fTElCRElSfQorICAgICAgICAke1BDXyR7Y29tcH1fTElCUkFSWV9ESVJTfQorICAgICAgICApCisKKyAgICBmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoJHtjb21wfQorICAgICAgICBGT1VORF9WQVIgJHtjb21wfV9GT1VORAorICAgICAgICBSRVFVSVJFRF9WQVJTICR7Y29tcG5hbWV9X0lOQ0xVREVfRElSICR7Y29tcG5hbWV9X0xJQlJBUlkpCisgICAgbWFya19hc19hZHZhbmNlZCgke2NvbXBuYW1lfV9JTkNMVURFX0RJUiAke2NvbXBuYW1lfV9MSUJSQVJZKQorCisgICAgbGlzdChBUFBFTkQgWENCX0lOQ0xVREVfRElSUyAkeyR7Y29tcG5hbWV9X0lOQ0xVREVfRElSfSkKKyAgICBsaXN0KEFQUEVORCBYQ0JfTElCUkFSSUVTICR7JHtjb21wbmFtZX1fTElCUkFSWX0pCisKKyAgICBpZihOT1QgJHtjb21wfV9GT1VORCkKKyAgICAgICAgc2V0KFhDQl9GT1VORCBmYWxzZSkKKyAgICBlbmRpZigpCitlbmRmb3JlYWNoKCkKKworbGlzdChSRU1PVkVfRFVQTElDQVRFUyBYQ0JfSU5DTFVERV9ESVJTKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY21ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY21ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzdlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jbWFrZS9jbWFrZV91bmluc3RhbGwuY21ha2UuaW4KQEAgLTAsMCArMSwyMSBAQAoraWYoTk9UIEVYSVNUUyAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgZmluZCBpbnN0YWxsIG1hbmlmZXN0OiBAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQC9pbnN0YWxsX21hbmlmZXN0LnR4dCIpCitlbmRpZihOT1QgRVhJU1RTICJAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQC9pbnN0YWxsX21hbmlmZXN0LnR4dCIpCisKK2ZpbGUoUkVBRCAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiIGZpbGVzKQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxuIiAiOyIgZmlsZXMgIiR7ZmlsZXN9IikKK2ZvcmVhY2goZmlsZSAke2ZpbGVzfSkKKyAgbWVzc2FnZShTVEFUVVMgIlVuaW5zdGFsbGluZyAkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgIGlmKElTX1NZTUxJTksgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IiBPUiBFWElTVFMgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IikKKyAgICBleGVjX3Byb2dyYW0oCisgICAgICAiQENNQUtFX0NPTU1BTkRAIiBBUkdTICItRSByZW1vdmUgXCIkRU5We0RFU1RESVJ9JHtmaWxlfVwiIgorICAgICAgT1VUUFVUX1ZBUklBQkxFIHJtX291dAorICAgICAgUkVUVVJOX1ZBTFVFIHJtX3JldHZhbAorICAgICAgKQorICAgIGlmKE5PVCAiJHtybV9yZXR2YWx9IiBTVFJFUVVBTCAwKQorICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiUHJvYmxlbSB3aGVuIHJlbW92aW5nICRFTlZ7REVTVERJUn0ke2ZpbGV9IikKKyAgICBlbmRpZihOT1QgIiR7cm1fcmV0dmFsfSIgU1RSRVFVQUwgMCkKKyAgZWxzZShJU19TWU1MSU5LICIkRU5We0RFU1RESVJ9JHtmaWxlfSIgT1IgRVhJU1RTICIkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgICAgbWVzc2FnZShTVEFUVVMgIkZpbGUgJEVOVntERVNURElSfSR7ZmlsZX0gZG9lcyBub3QgZXhpc3QuIikKKyAgZW5kaWYoSVNfU1lNTElOSyAiJEVOVntERVNURElSfSR7ZmlsZX0iIE9SIEVYSVNUUyAiJEVOVntERVNURElSfSR7ZmlsZX0iKQorZW5kZm9yZWFjaChmaWxlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY29tbW9uL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NvbW1vbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0OTZiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NvbW1vbi9SRUFETUUubWQKQEAgLTAsMCArMSwyOCBAQAorIyBHZW5lcmF0aW5nIHZ1bGthbl93cmFwcGVyCisKK1RoZSBzY3JpcHQgZm9yIGdlbmVyYXRpbmcgdGhlIHZ1bGthbl93cmFwcGVyIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgQG9sdmFmZmUgZm9yIEhvbG9ncmFtJ3MgZGlzcGF0Y2ggdGFibGU6CitodHRwczovL2dpdGh1Yi5jb20vTHVuYXJHL1Z1bGthblNhbXBsZXMvYmxvYi9tYXN0ZXIvU2FtcGxlLVByb2dyYW1zL0hvbG9ncmFtL2dlbmVyYXRlLWRpc3BhdGNoLXRhYmxlCisKK1RoZSB3cmFwcGVyIGlzIHVzZWQgdG8gc3VwcG9ydCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvIGxpbmsgZGlyZWN0bHkgYWdhaW5zdCBsaWJ2dWxrYW4uc28sIHdoaWNoIGlzIG5vdAorcHJlc2VudCBvbiBBbmRyb2lkIGJlZm9yZSA3LjAgKE5vdWdhdCkuCisKK1RoZSB3cmFwcGVyIG9ubHkgY29udGFpbnMgY29yZSBmdW5jdGlvbnMgYW5kIFdTSSBleHRlbnNpb25zLgorCitUbyByZWdlbmVyYXRlIHRoZSB3cmFwcGVyczoKKworICAgIGNkIHNjcmlwdHMKKyAgICBwdXNoZCAuLi9WdWxrYW4tSGVhZGVycy9pbmNsdWRlL3Z1bGthbgorICAgIC4uLy4uLy4uL3NjcmlwdHMvZ2VuZXJhdGVfdnVsa2FuX3dyYXBwZXIucHkgcGFyc2UgdnVsa2FuLmggPiBwYXJzZWRfaGVhZGVyCisKK0NvcHkgY29udGVudHMgb2YgcGFyc2VkX2hlYWRlciBpbnRvIGdlbmVyYXRlX3Z1bGthbl93cmFwcGVyLnB5IGJldHdlZW4gdGhlIHNlY3Rpb25zIHRoYXQgcmVhZDoKKworICAgICMgZ2VuZXJhdGVkIGJ5ICJnZW5lcmF0ZV92dWxrYW5fd3JhcHBlci5weSBwYXJzZSB2dWxrYW4uaCIKKyAgICAjIGVuZCBvZiBnZW5lcmF0ZWQgY29kZQorCitUaGVuIHJ1biB0aGUgc2NyaXB0OgorCisgICAgcG9wZAorICAgIC4vZ2VuZXJhdGVfdnVsa2FuX3dyYXBwZXIucHkgLi4vY29tbW9uL3Z1bGthbl93cmFwcGVyLmgKKyAgICAuL2dlbmVyYXRlX3Z1bGthbl93cmFwcGVyLnB5IC4uL2NvbW1vbi92dWxrYW5fd3JhcHBlci5jcHAKKyAgICBjbGFuZy1mb3JtYXQgLWkgdnVsa2FuX3dyYXBwZXIuaAorICAgIGNsYW5nLWZvcm1hdCAtaSB2dWxrYW5fd3JhcHBlci5jcHAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NvbW1vbi9hbmRyb2lkX3V0aWwuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY29tbW9uL2FuZHJvaWRfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczZThhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NvbW1vbi9hbmRyb2lkX3V0aWwuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgR29vZ2xlLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogUmVsaWNlbnNlZCBmcm9tIHRoZSBXVEZQTCAoaHR0cDovL3d3dy53dGZwbC5uZXQvZmFxLykuCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWRfdXRpbC5oIgorI2luY2x1ZGUgPGFuZHJvaWRfbmF0aXZlX2FwcF9nbHVlLmg+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworZXh0ZXJuICJDIiB7CisKKy8vIENvbnZlcnQgSW50ZW50cyB0byBhcmcgbGlzdCwgcmV0dXJuaW5nIGFyZ2MgYW5kIGFyZ3YKKy8vIE5vdGUgdGhhdCB0aGlzIEMgcm91dGluZSBtYWxsb2NzIG1lbW9yeSB0aGF0IHRoZSBjYWxsZXIgbXVzdCBmcmVlCitjaGFyICoqZ2V0X2FyZ3Moc3RydWN0IGFuZHJvaWRfYXBwICphcHAsIGNvbnN0IGNoYXIgKmludGVudF9leHRyYV9kYXRhX2tleSwgY29uc3QgY2hhciAqYXBwVGFnLCBpbnQgKmNvdW50KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3M7CisgICAgSmF2YVZNICZ2bSA9ICphcHAtPmFjdGl2aXR5LT52bTsKKyAgICBKTklFbnYgKnBfZW52OworICAgIGlmICh2bS5BdHRhY2hDdXJyZW50VGhyZWFkKCZwX2VudiwgbnVsbHB0cikgIT0gSk5JX09LKSByZXR1cm4gbnVsbHB0cjsKKworICAgIEpOSUVudiAmZW52ID0gKnBfZW52OworICAgIGpvYmplY3QgYWN0aXZpdHkgPSBhcHAtPmFjdGl2aXR5LT5jbGF6ejsKKyAgICBqbWV0aG9kSUQgZ2V0X2ludGVudF9tZXRob2QgPSBlbnYuR2V0TWV0aG9kSUQoZW52LkdldE9iamVjdENsYXNzKGFjdGl2aXR5KSwgImdldEludGVudCIsICIoKUxhbmRyb2lkL2NvbnRlbnQvSW50ZW50OyIpOworICAgIGpvYmplY3QgaW50ZW50ID0gZW52LkNhbGxPYmplY3RNZXRob2QoYWN0aXZpdHksIGdldF9pbnRlbnRfbWV0aG9kKTsKKyAgICBqbWV0aG9kSUQgZ2V0X3N0cmluZ19leHRyYV9tZXRob2QgPQorICAgICAgICBlbnYuR2V0TWV0aG9kSUQoZW52LkdldE9iamVjdENsYXNzKGludGVudCksICJnZXRTdHJpbmdFeHRyYSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIpOworICAgIGp2YWx1ZSBnZXRfc3RyaW5nX2V4dHJhX2FyZ3M7CisgICAgZ2V0X3N0cmluZ19leHRyYV9hcmdzLmwgPSBlbnYuTmV3U3RyaW5nVVRGKGludGVudF9leHRyYV9kYXRhX2tleSk7CisgICAganN0cmluZyBleHRyYV9zdHIgPSBzdGF0aWNfY2FzdDxqc3RyaW5nPihlbnYuQ2FsbE9iamVjdE1ldGhvZEEoaW50ZW50LCBnZXRfc3RyaW5nX2V4dHJhX21ldGhvZCwgJmdldF9zdHJpbmdfZXh0cmFfYXJncykpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc19zdHI7CisgICAgaWYgKGV4dHJhX3N0cikgeworICAgICAgICBjb25zdCBjaGFyICpleHRyYV91dGYgPSBlbnYuR2V0U3RyaW5nVVRGQ2hhcnMoZXh0cmFfc3RyLCBudWxscHRyKTsKKyAgICAgICAgYXJnc19zdHIgPSBleHRyYV91dGY7CisgICAgICAgIGVudi5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZXh0cmFfc3RyLCBleHRyYV91dGYpOworICAgICAgICBlbnYuRGVsZXRlTG9jYWxSZWYoZXh0cmFfc3RyKTsKKyAgICB9CisKKyAgICBlbnYuRGVsZXRlTG9jYWxSZWYoZ2V0X3N0cmluZ19leHRyYV9hcmdzLmwpOworICAgIGVudi5EZWxldGVMb2NhbFJlZihpbnRlbnQpOworICAgIHZtLkRldGFjaEN1cnJlbnRUaHJlYWQoKTsKKworICAgIC8vIHNwbGl0IGFyZ3Nfc3RyCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3MoYXJnc19zdHIpOworICAgIHN0ZDo6c3RyaW5nIGFyZzsKKyAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKHNzLCBhcmcsICcgJykpIHsKKyAgICAgICAgaWYgKCFhcmcuZW1wdHkoKSkgYXJncy5wdXNoX2JhY2soYXJnKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IG91ciBTVEwgcmVzdWx0cyB0byBDIGZyaWVuZGx5IGNvbnN0cnVjdHMKKyAgICBhc3NlcnQoY291bnQgIT0gbnVsbHB0cik7CisgICAgKmNvdW50ID0gYXJncy5zaXplKCkgKyAxOworICAgIGNoYXIgKip2ZWN0b3IgPSAoY2hhciAqKiltYWxsb2MoKmNvdW50ICogc2l6ZW9mKGNoYXIgKikpOworICAgIGNvbnN0IGNoYXIgKmFwcE5hbWUgPSBhcHBUYWcgPyBhcHBUYWcgOiAoY29uc3QgY2hhciAqKSJhcHBUYWciOworCisgICAgdmVjdG9yWzBdID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGFwcE5hbWUpICogc2l6ZW9mKGNoYXIpKTsKKyAgICBzdHJjcHkodmVjdG9yWzBdLCBhcHBOYW1lKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHZlY3RvcltpICsgMV0gPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oYXJnc1tpXS5jX3N0cigpKSAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmNweSh2ZWN0b3JbaSArIDFdLCBhcmdzW2ldLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiB2ZWN0b3I7Cit9CisKK30gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NvbW1vbi9hbmRyb2lkX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NvbW1vbi9hbmRyb2lkX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODk2NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY29tbW9uL2FuZHJvaWRfdXRpbC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgR29vZ2xlLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogUmVsaWNlbnNlZCBmcm9tIHRoZSBXVEZQTCAoaHR0cDovL3d3dy53dGZwbC5uZXQvZmFxLykuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VUSUxfSAorI2RlZmluZSBBTkRST0lEX1VUSUxfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2NoYXIgKipnZXRfYXJncyhzdHJ1Y3QgYW5kcm9pZF9hcHAgKmFwcCwgY29uc3QgY2hhciAqaW50ZW50X2V4dHJhX2RhdGFfa2V5LCBjb25zdCBjaGFyICphcHBUYWcsIGludCAqY291bnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NvbW1vbi92dWxrYW5fd3JhcHBlci5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jb21tb24vdnVsa2FuX3dyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWY1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jb21tb24vdnVsa2FuX3dyYXBwZXIuY3BwCkBAIC0wLDAgKzEsNzk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgInZ1bGthbl93cmFwcGVyLmgiCisjaW5jbHVkZSA8ZGxmY24uaD4KKworaW50IEluaXRWdWxrYW4odm9pZCkgeworICAgIHZvaWQqIGxpYnZ1bGthbiA9IGRsb3BlbigibGlidnVsa2FuLnNvIiwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAoIWxpYnZ1bGthbikgcmV0dXJuIDA7CisKKyAgICAvLyBWdWxrYW4gc3VwcG9ydGVkLCBzZXQgZnVuY3Rpb24gYWRkcmVzc2VzCisgICAgdmtDcmVhdGVJbnN0YW5jZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlSW5zdGFuY2U+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlSW5zdGFuY2UiKSk7CisgICAgdmtEZXN0cm95SW5zdGFuY2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lJbnN0YW5jZT4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95SW5zdGFuY2UiKSk7CisgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcz4oZGxzeW0obGlidnVsa2FuLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcz4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXM+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXM+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzPigKKyAgICAgICAgZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIpKTsKKyAgICB2a0dldEluc3RhbmNlUHJvY0FkZHIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0SW5zdGFuY2VQcm9jQWRkciIpKTsKKyAgICB2a0dldERldmljZVByb2NBZGRyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREZXZpY2VQcm9jQWRkcj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXREZXZpY2VQcm9jQWRkciIpKTsKKyAgICB2a0NyZWF0ZURldmljZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRGV2aWNlPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZURldmljZSIpKTsKKyAgICB2a0Rlc3Ryb3lEZXZpY2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lEZXZpY2U+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveURldmljZSIpKTsKKyAgICB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyIpKTsKKyAgICB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXM+KGRsc3ltKGxpYnZ1bGthbiwgInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyIpKTsKKyAgICB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcz4oZGxzeW0obGlidnVsa2FuLCAidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIpKTsKKyAgICB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyIpKTsKKyAgICB2a0dldERldmljZVF1ZXVlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREZXZpY2VRdWV1ZT4oZGxzeW0obGlidnVsa2FuLCAidmtHZXREZXZpY2VRdWV1ZSIpKTsKKyAgICB2a1F1ZXVlU3VibWl0ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtRdWV1ZVN1Ym1pdD4oZGxzeW0obGlidnVsa2FuLCAidmtRdWV1ZVN1Ym1pdCIpKTsKKyAgICB2a1F1ZXVlV2FpdElkbGUgPSByZWludGVycHJldF9jYXN0PFBGTl92a1F1ZXVlV2FpdElkbGU+KGRsc3ltKGxpYnZ1bGthbiwgInZrUXVldWVXYWl0SWRsZSIpKTsKKyAgICB2a0RldmljZVdhaXRJZGxlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXZpY2VXYWl0SWRsZT4oZGxzeW0obGlidnVsa2FuLCAidmtEZXZpY2VXYWl0SWRsZSIpKTsKKyAgICB2a0FsbG9jYXRlTWVtb3J5ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtBbGxvY2F0ZU1lbW9yeT4oZGxzeW0obGlidnVsa2FuLCAidmtBbGxvY2F0ZU1lbW9yeSIpKTsKKyAgICB2a0ZyZWVNZW1vcnkgPSByZWludGVycHJldF9jYXN0PFBGTl92a0ZyZWVNZW1vcnk+KGRsc3ltKGxpYnZ1bGthbiwgInZrRnJlZU1lbW9yeSIpKTsKKyAgICB2a01hcE1lbW9yeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrTWFwTWVtb3J5PihkbHN5bShsaWJ2dWxrYW4sICJ2a01hcE1lbW9yeSIpKTsKKyAgICB2a1VubWFwTWVtb3J5ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtVbm1hcE1lbW9yeT4oZGxzeW0obGlidnVsa2FuLCAidmtVbm1hcE1lbW9yeSIpKTsKKyAgICB2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcz4oZGxzeW0obGlidnVsa2FuLCAidmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyIpKTsKKyAgICB2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXM+KGRsc3ltKGxpYnZ1bGthbiwgInZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIpKTsKKyAgICB2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCIpKTsKKyAgICB2a0JpbmRCdWZmZXJNZW1vcnkgPSByZWludGVycHJldF9jYXN0PFBGTl92a0JpbmRCdWZmZXJNZW1vcnk+KGRsc3ltKGxpYnZ1bGthbiwgInZrQmluZEJ1ZmZlck1lbW9yeSIpKTsKKyAgICB2a0JpbmRJbWFnZU1lbW9yeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQmluZEltYWdlTWVtb3J5PihkbHN5bShsaWJ2dWxrYW4sICJ2a0JpbmRJbWFnZU1lbW9yeSIpKTsKKyAgICB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyIpKTsKKyAgICB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cz4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyIpKTsKKyAgICB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cz4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcz4oCisgICAgICAgIGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiKSk7CisgICAgdmtRdWV1ZUJpbmRTcGFyc2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a1F1ZXVlQmluZFNwYXJzZT4oZGxzeW0obGlidnVsa2FuLCAidmtRdWV1ZUJpbmRTcGFyc2UiKSk7CisgICAgdmtDcmVhdGVGZW5jZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRmVuY2U+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlRmVuY2UiKSk7CisgICAgdmtEZXN0cm95RmVuY2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lGZW5jZT4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95RmVuY2UiKSk7CisgICAgdmtSZXNldEZlbmNlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrUmVzZXRGZW5jZXM+KGRsc3ltKGxpYnZ1bGthbiwgInZrUmVzZXRGZW5jZXMiKSk7CisgICAgdmtHZXRGZW5jZVN0YXR1cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RmVuY2VTdGF0dXM+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0RmVuY2VTdGF0dXMiKSk7CisgICAgdmtXYWl0Rm9yRmVuY2VzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtXYWl0Rm9yRmVuY2VzPihkbHN5bShsaWJ2dWxrYW4sICJ2a1dhaXRGb3JGZW5jZXMiKSk7CisgICAgdmtDcmVhdGVTZW1hcGhvcmUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVNlbWFwaG9yZT4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVTZW1hcGhvcmUiKSk7CisgICAgdmtEZXN0cm95U2VtYXBob3JlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95U2VtYXBob3JlPihkbHN5bShsaWJ2dWxrYW4sICJ2a0Rlc3Ryb3lTZW1hcGhvcmUiKSk7CisgICAgdmtDcmVhdGVFdmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRXZlbnQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlRXZlbnQiKSk7CisgICAgdmtEZXN0cm95RXZlbnQgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lFdmVudD4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95RXZlbnQiKSk7CisgICAgdmtHZXRFdmVudFN0YXR1cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RXZlbnRTdGF0dXM+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0RXZlbnRTdGF0dXMiKSk7CisgICAgdmtTZXRFdmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrU2V0RXZlbnQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrU2V0RXZlbnQiKSk7CisgICAgdmtSZXNldEV2ZW50ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtSZXNldEV2ZW50PihkbHN5bShsaWJ2dWxrYW4sICJ2a1Jlc2V0RXZlbnQiKSk7CisgICAgdmtDcmVhdGVRdWVyeVBvb2wgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVF1ZXJ5UG9vbD4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVRdWVyeVBvb2wiKSk7CisgICAgdmtEZXN0cm95UXVlcnlQb29sID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95UXVlcnlQb29sPihkbHN5bShsaWJ2dWxrYW4sICJ2a0Rlc3Ryb3lRdWVyeVBvb2wiKSk7CisgICAgdmtHZXRRdWVyeVBvb2xSZXN1bHRzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRRdWVyeVBvb2xSZXN1bHRzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFF1ZXJ5UG9vbFJlc3VsdHMiKSk7CisgICAgdmtDcmVhdGVCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZUJ1ZmZlcj4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVCdWZmZXIiKSk7CisgICAgdmtEZXN0cm95QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95QnVmZmVyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0Rlc3Ryb3lCdWZmZXIiKSk7CisgICAgdmtDcmVhdGVCdWZmZXJWaWV3ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVCdWZmZXJWaWV3PihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZUJ1ZmZlclZpZXciKSk7CisgICAgdmtEZXN0cm95QnVmZmVyVmlldyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveUJ1ZmZlclZpZXc+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveUJ1ZmZlclZpZXciKSk7CisgICAgdmtDcmVhdGVJbWFnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlSW1hZ2U+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlSW1hZ2UiKSk7CisgICAgdmtEZXN0cm95SW1hZ2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lJbWFnZT4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95SW1hZ2UiKSk7CisgICAgdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0PihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQiKSk7CisgICAgdmtDcmVhdGVJbWFnZVZpZXcgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZUltYWdlVmlldz4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVJbWFnZVZpZXciKSk7CisgICAgdmtEZXN0cm95SW1hZ2VWaWV3ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95SW1hZ2VWaWV3PihkbHN5bShsaWJ2dWxrYW4sICJ2a0Rlc3Ryb3lJbWFnZVZpZXciKSk7CisgICAgdmtDcmVhdGVTaGFkZXJNb2R1bGUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVNoYWRlck1vZHVsZT4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVTaGFkZXJNb2R1bGUiKSk7CisgICAgdmtEZXN0cm95U2hhZGVyTW9kdWxlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95U2hhZGVyTW9kdWxlPihkbHN5bShsaWJ2dWxrYW4sICJ2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUiKSk7CisgICAgdmtDcmVhdGVQaXBlbGluZUNhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVQaXBlbGluZUNhY2hlPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiKSk7CisgICAgdmtEZXN0cm95UGlwZWxpbmVDYWNoZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVBpcGVsaW5lQ2FjaGU+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveVBpcGVsaW5lQ2FjaGUiKSk7CisgICAgdmtHZXRQaXBlbGluZUNhY2hlRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGlwZWxpbmVDYWNoZURhdGE+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGlwZWxpbmVDYWNoZURhdGEiKSk7CisgICAgdmtNZXJnZVBpcGVsaW5lQ2FjaGVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtNZXJnZVBpcGVsaW5lQ2FjaGVzPihkbHN5bShsaWJ2dWxrYW4sICJ2a01lcmdlUGlwZWxpbmVDYWNoZXMiKSk7CisgICAgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiKSk7CisgICAgdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiKSk7CisgICAgdmtEZXN0cm95UGlwZWxpbmUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lQaXBlbGluZT4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95UGlwZWxpbmUiKSk7CisgICAgdmtDcmVhdGVQaXBlbGluZUxheW91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiKSk7CisgICAgdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lQaXBlbGluZUxheW91dD4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95UGlwZWxpbmVMYXlvdXQiKSk7CisgICAgdmtDcmVhdGVTYW1wbGVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVTYW1wbGVyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZVNhbXBsZXIiKSk7CisgICAgdmtEZXN0cm95U2FtcGxlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVNhbXBsZXI+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveVNhbXBsZXIiKSk7CisgICAgdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0PihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiKSk7CisgICAgdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiKSk7CisgICAgdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclBvb2w+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiKSk7CisgICAgdmtEZXN0cm95RGVzY3JpcHRvclBvb2wgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbD4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95RGVzY3JpcHRvclBvb2wiKSk7CisgICAgdmtSZXNldERlc2NyaXB0b3JQb29sID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtSZXNldERlc2NyaXB0b3JQb29sPihkbHN5bShsaWJ2dWxrYW4sICJ2a1Jlc2V0RGVzY3JpcHRvclBvb2wiKSk7CisgICAgdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiKSk7CisgICAgdmtGcmVlRGVzY3JpcHRvclNldHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cz4oZGxzeW0obGlidnVsa2FuLCAidmtGcmVlRGVzY3JpcHRvclNldHMiKSk7CisgICAgdmtVcGRhdGVEZXNjcmlwdG9yU2V0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldHM+KGRsc3ltKGxpYnZ1bGthbiwgInZrVXBkYXRlRGVzY3JpcHRvclNldHMiKSk7CisgICAgdmtDcmVhdGVGcmFtZWJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRnJhbWVidWZmZXI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlRnJhbWVidWZmZXIiKSk7CisgICAgdmtEZXN0cm95RnJhbWVidWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lGcmFtZWJ1ZmZlcj4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95RnJhbWVidWZmZXIiKSk7CisgICAgdmtDcmVhdGVSZW5kZXJQYXNzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVSZW5kZXJQYXNzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZVJlbmRlclBhc3MiKSk7CisgICAgdmtEZXN0cm95UmVuZGVyUGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVJlbmRlclBhc3M+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveVJlbmRlclBhc3MiKSk7CisgICAgdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFJlbmRlckFyZWFHcmFudWxhcml0eT4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiKSk7CisgICAgdmtDcmVhdGVDb21tYW5kUG9vbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlQ29tbWFuZFBvb2w+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlQ29tbWFuZFBvb2wiKSk7CisgICAgdmtEZXN0cm95Q29tbWFuZFBvb2wgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lDb21tYW5kUG9vbD4oZGxzeW0obGlidnVsa2FuLCAidmtEZXN0cm95Q29tbWFuZFBvb2wiKSk7CisgICAgdmtSZXNldENvbW1hbmRQb29sID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtSZXNldENvbW1hbmRQb29sPihkbHN5bShsaWJ2dWxrYW4sICJ2a1Jlc2V0Q29tbWFuZFBvb2wiKSk7CisgICAgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiKSk7CisgICAgdmtGcmVlQ29tbWFuZEJ1ZmZlcnMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0ZyZWVDb21tYW5kQnVmZmVycz4oZGxzeW0obGlidnVsa2FuLCAidmtGcmVlQ29tbWFuZEJ1ZmZlcnMiKSk7CisgICAgdmtCZWdpbkNvbW1hbmRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0JlZ2luQ29tbWFuZEJ1ZmZlcj4oZGxzeW0obGlidnVsa2FuLCAidmtCZWdpbkNvbW1hbmRCdWZmZXIiKSk7CisgICAgdmtFbmRDb21tYW5kQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtFbmRDb21tYW5kQnVmZmVyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0VuZENvbW1hbmRCdWZmZXIiKSk7CisgICAgdmtSZXNldENvbW1hbmRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a1Jlc2V0Q29tbWFuZEJ1ZmZlcj4oZGxzeW0obGlidnVsa2FuLCAidmtSZXNldENvbW1hbmRCdWZmZXIiKSk7CisgICAgdmtDbWRCaW5kUGlwZWxpbmUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJpbmRQaXBlbGluZT4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRCaW5kUGlwZWxpbmUiKSk7CisgICAgdmtDbWRTZXRWaWV3cG9ydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0Vmlld3BvcnQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kU2V0Vmlld3BvcnQiKSk7CisgICAgdmtDbWRTZXRTY2lzc29yID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRTZXRTY2lzc29yPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZFNldFNjaXNzb3IiKSk7CisgICAgdmtDbWRTZXRMaW5lV2lkdGggPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFNldExpbmVXaWR0aD4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRTZXRMaW5lV2lkdGgiKSk7CisgICAgdmtDbWRTZXREZXB0aEJpYXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFNldERlcHRoQmlhcz4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRTZXREZXB0aEJpYXMiKSk7CisgICAgdmtDbWRTZXRCbGVuZENvbnN0YW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0QmxlbmRDb25zdGFudHM+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kU2V0QmxlbmRDb25zdGFudHMiKSk7CisgICAgdmtDbWRTZXREZXB0aEJvdW5kcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0RGVwdGhCb3VuZHM+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kU2V0RGVwdGhCb3VuZHMiKSk7CisgICAgdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2sgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzaz4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2siKSk7CisgICAgdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2siKSk7CisgICAgdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UiKSk7CisgICAgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJpbmREZXNjcmlwdG9yU2V0cz4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRCaW5kRGVzY3JpcHRvclNldHMiKSk7CisgICAgdmtDbWRCaW5kSW5kZXhCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJpbmRJbmRleEJ1ZmZlcj4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRCaW5kSW5kZXhCdWZmZXIiKSk7CisgICAgdmtDbWRCaW5kVmVydGV4QnVmZmVycyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnM+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiKSk7CisgICAgdmtDbWREcmF3ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWREcmF3PihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZERyYXciKSk7CisgICAgdmtDbWREcmF3SW5kZXhlZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kRHJhd0luZGV4ZWQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kRHJhd0luZGV4ZWQiKSk7CisgICAgdmtDbWREcmF3SW5kaXJlY3QgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERyYXdJbmRpcmVjdD4oZGxzeW0obGlidnVsa2FuLCAidmtDbWREcmF3SW5kaXJlY3QiKSk7CisgICAgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0PihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QiKSk7CisgICAgdmtDbWREaXNwYXRjaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kRGlzcGF0Y2g+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kRGlzcGF0Y2giKSk7CisgICAgdmtDbWREaXNwYXRjaEluZGlyZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWREaXNwYXRjaEluZGlyZWN0PihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZERpc3BhdGNoSW5kaXJlY3QiKSk7CisgICAgdmtDbWRDb3B5QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRDb3B5QnVmZmVyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZENvcHlCdWZmZXIiKSk7CisgICAgdmtDbWRDb3B5SW1hZ2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZENvcHlJbWFnZT4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRDb3B5SW1hZ2UiKSk7CisgICAgdmtDbWRCbGl0SW1hZ2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJsaXRJbWFnZT4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRCbGl0SW1hZ2UiKSk7CisgICAgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQ29weUJ1ZmZlclRvSW1hZ2U+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UiKSk7CisgICAgdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQ29weUltYWdlVG9CdWZmZXI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIiKSk7CisgICAgdmtDbWRVcGRhdGVCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFVwZGF0ZUJ1ZmZlcj4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRVcGRhdGVCdWZmZXIiKSk7CisgICAgdmtDbWRGaWxsQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRGaWxsQnVmZmVyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZEZpbGxCdWZmZXIiKSk7CisgICAgdmtDbWRDbGVhckNvbG9ySW1hZ2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZENsZWFyQ29sb3JJbWFnZT4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRDbGVhckNvbG9ySW1hZ2UiKSk7CisgICAgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiKSk7CisgICAgdmtDbWRDbGVhckF0dGFjaG1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRDbGVhckF0dGFjaG1lbnRzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZENsZWFyQXR0YWNobWVudHMiKSk7CisgICAgdmtDbWRSZXNvbHZlSW1hZ2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFJlc29sdmVJbWFnZT4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRSZXNvbHZlSW1hZ2UiKSk7CisgICAgdmtDbWRTZXRFdmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0RXZlbnQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kU2V0RXZlbnQiKSk7CisgICAgdmtDbWRSZXNldEV2ZW50ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRSZXNldEV2ZW50PihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZFJlc2V0RXZlbnQiKSk7CisgICAgdmtDbWRXYWl0RXZlbnRzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRXYWl0RXZlbnRzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZFdhaXRFdmVudHMiKSk7CisgICAgdmtDbWRQaXBlbGluZUJhcnJpZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFBpcGVsaW5lQmFycmllcj4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRQaXBlbGluZUJhcnJpZXIiKSk7CisgICAgdmtDbWRCZWdpblF1ZXJ5ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRCZWdpblF1ZXJ5PihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZEJlZ2luUXVlcnkiKSk7CisgICAgdmtDbWRFbmRRdWVyeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kRW5kUXVlcnk+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kRW5kUXVlcnkiKSk7CisgICAgdmtDbWRSZXNldFF1ZXJ5UG9vbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kUmVzZXRRdWVyeVBvb2w+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kUmVzZXRRdWVyeVBvb2wiKSk7CisgICAgdmtDbWRXcml0ZVRpbWVzdGFtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kV3JpdGVUaW1lc3RhbXA+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kV3JpdGVUaW1lc3RhbXAiKSk7CisgICAgdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHM+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMiKSk7CisgICAgdmtDbWRQdXNoQ29uc3RhbnRzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRQdXNoQ29uc3RhbnRzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZFB1c2hDb25zdGFudHMiKSk7CisgICAgdmtDbWRCZWdpblJlbmRlclBhc3MgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzcz4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRCZWdpblJlbmRlclBhc3MiKSk7CisgICAgdmtDbWROZXh0U3VicGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kTmV4dFN1YnBhc3M+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kTmV4dFN1YnBhc3MiKSk7CisgICAgdmtDbWRFbmRSZW5kZXJQYXNzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRFbmRSZW5kZXJQYXNzPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZEVuZFJlbmRlclBhc3MiKSk7CisgICAgdmtDbWRFeGVjdXRlQ29tbWFuZHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEV4ZWN1dGVDb21tYW5kcz4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRFeGVjdXRlQ29tbWFuZHMiKSk7CisgICAgdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24gPSByZWludGVycHJldF9jYXN0PFBGTl92a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbj4oZGxzeW0obGlidnVsa2FuLCAidmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24iKSk7CisgICAgdmtCaW5kQnVmZmVyTWVtb3J5MiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQmluZEJ1ZmZlck1lbW9yeTIiKSk7CisgICAgdmtCaW5kSW1hZ2VNZW1vcnkyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0JpbmRJbWFnZU1lbW9yeTIiKSk7CisgICAgdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXM+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMiKSk7CisgICAgdmtDbWRTZXREZXZpY2VNYXNrID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRTZXREZXZpY2VNYXNrPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZFNldERldmljZU1hc2siKSk7CisgICAgdmtDbWREaXNwYXRjaEJhc2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERpc3BhdGNoQmFzZT4oZGxzeW0obGlidnVsa2FuLCAidmtDbWREaXNwYXRjaEJhc2UiKSk7CisgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHM+KGRsc3ltKGxpYnZ1bGthbiwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMiKSk7CisgICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIiKSk7CisgICAgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIiKSk7CisgICAgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMj4oCisgICAgICAgIGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczI+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyPigKKyAgICAgICAgZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIiKSk7CisgICAgdmtUcmltQ29tbWFuZFBvb2wgPSByZWludGVycHJldF9jYXN0PFBGTl92a1RyaW1Db21tYW5kUG9vbD4oZGxzeW0obGlidnVsa2FuLCAidmtUcmltQ29tbWFuZFBvb2wiKSk7CisgICAgdmtHZXREZXZpY2VRdWV1ZTIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldERldmljZVF1ZXVlMj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXREZXZpY2VRdWV1ZTIiKSk7CisgICAgdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKSk7CisgICAgdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKSk7CisgICAgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZT4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiKSk7CisgICAgdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPihkbHN5bShsaWJ2dWxrYW4sICJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiKSk7CisgICAgdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlPihkbHN5bShsaWJ2dWxrYW4sICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcz4oCisgICAgICAgIGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcz4oCisgICAgICAgIGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiKSk7CisgICAgdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQ+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiKSk7CisgICAgdmtEZXN0cm95U3VyZmFjZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVN1cmZhY2VLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveVN1cmZhY2VLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUj4oCisgICAgICAgIGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFI+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIpKTsKKyAgICB2a0NyZWF0ZVN3YXBjaGFpbktIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlU3dhcGNoYWluS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIpKTsKKyAgICB2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveVN3YXBjaGFpbktIUiIpKTsKKyAgICB2a0dldFN3YXBjaGFpbkltYWdlc0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIpKTsKKyAgICB2a0FjcXVpcmVOZXh0SW1hZ2VLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQWNxdWlyZU5leHRJbWFnZUtIUiIpKTsKKyAgICB2a1F1ZXVlUHJlc2VudEtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrUXVldWVQcmVzZW50S0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a1F1ZXVlUHJlc2VudEtIUiIpKTsKKyAgICB2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiIpKTsKKyAgICB2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiIpKTsKKyAgICB2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtBY3F1aXJlTmV4dEltYWdlMktIUj4oZGxzeW0obGlidnVsa2FuLCAidmtBY3F1aXJlTmV4dEltYWdlMktIUiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSPigKKyAgICAgICAgZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIiKSk7CisgICAgdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIiKSk7CisgICAgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIiKSk7CisgICAgdmtDcmVhdGVEaXNwbGF5TW9kZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRGlzcGxheU1vZGVLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlRGlzcGxheU1vZGVLSFIiKSk7CisgICAgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIiKSk7CisgICAgdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiKSk7CisgICAgdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUj4oCisgICAgICAgIGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFI+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSPigKKyAgICAgICAgZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiKSk7CisgICAgdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIiKSk7CisgICAgdmtDbWRTZXREZXZpY2VNYXNrS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRTZXREZXZpY2VNYXNrS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZFNldERldmljZU1hc2tLSFIiKSk7CisgICAgdmtDbWREaXNwYXRjaEJhc2VLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERpc3BhdGNoQmFzZUtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDbWREaXNwYXRjaEJhc2VLSFIiKSk7CisgICAgdmtUcmltQ29tbWFuZFBvb2xLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a1RyaW1Db21tYW5kUG9vbEtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtUcmltQ29tbWFuZFBvb2xLSFIiKSk7CisgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFI+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSIikpOworICAgIHZrR2V0TWVtb3J5RmRLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldE1lbW9yeUZkS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldE1lbW9yeUZkS0hSIikpOworICAgIHZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSPigKKyAgICAgICAgZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiIpKTsKKyAgICB2a0ltcG9ydFNlbWFwaG9yZUZkS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtJbXBvcnRTZW1hcGhvcmVGZEtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtJbXBvcnRTZW1hcGhvcmVGZEtIUiIpKTsKKyAgICB2a0dldFNlbWFwaG9yZUZkS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRTZW1hcGhvcmVGZEtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRTZW1hcGhvcmVGZEtIUiIpKTsKKyAgICB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIpKTsKKyAgICB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIpKTsKKyAgICB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIpKTsKKyAgICB2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIpKTsKKyAgICB2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIpKTsKKyAgICB2a0NyZWF0ZVJlbmRlclBhc3MyS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIpKTsKKyAgICB2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzczJLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIpKTsKKyAgICB2a0NtZE5leHRTdWJwYXNzMktIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NtZE5leHRTdWJwYXNzMktIUiIpKTsKKyAgICB2a0NtZEVuZFJlbmRlclBhc3MyS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDbWRFbmRSZW5kZXJQYXNzMktIUiIpKTsKKyAgICB2a0dldFN3YXBjaGFpblN0YXR1c0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0U3dhcGNoYWluU3RhdHVzS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFN3YXBjaGFpblN0YXR1c0tIUiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFI+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIiKSk7CisgICAgdmtJbXBvcnRGZW5jZUZkS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtJbXBvcnRGZW5jZUZkS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0ltcG9ydEZlbmNlRmRLSFIiKSk7CisgICAgdmtHZXRGZW5jZUZkS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRGZW5jZUZkS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldEZlbmNlRmRLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSPigKKyAgICAgICAgZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIikpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSPigKKyAgICAgICAgZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiKSk7CisgICAgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIiKSk7CisgICAgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiKSk7CisgICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiKSk7CisgICAgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIiKSk7CisgICAgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiKSk7CisgICAgdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKSk7CisgICAgdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKSk7CisgICAgdmtCaW5kQnVmZmVyTWVtb3J5MktIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTJLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQmluZEJ1ZmZlck1lbW9yeTJLSFIiKSk7CisgICAgdmtCaW5kSW1hZ2VNZW1vcnkyS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0JpbmRJbWFnZU1lbW9yeTJLSFIiKSk7CisgICAgdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiKSk7CisgICAgdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIiKSk7CisgICAgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiKSk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICB2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiIpKTsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSPigKKyAgICAgICAgZGxzeW0obGlidnVsa2FuLCAidmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIikpOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFI+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIikpOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFI+KGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiKSk7CisgICAgdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUj4oZGxzeW0obGlidnVsa2FuLCAidmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiKSk7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIikpOworICAgIHZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIikpOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIiKSk7CisgICAgdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIiKSk7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgdmtDcmVhdGVYY2JTdXJmYWNlS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSPihkbHN5bShsaWJ2dWxrYW4sICJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiKSk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUj4oCisgICAgICAgIGRsc3ltKGxpYnZ1bGthbiwgInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIikpOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICB2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVYbGliU3VyZmFjZUtIUj4oZGxzeW0obGlidnVsa2FuLCAidmtDcmVhdGVYbGliU3VyZmFjZUtIUiIpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFI+KAorICAgICAgICBkbHN5bShsaWJ2dWxrYW4sICJ2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiKSk7CisjZW5kaWYKKyAgICByZXR1cm4gMTsKK30KKworLy8gTm8gVnVsa2FuIHN1cHBvcnQsIGRvIG5vdCBzZXQgZnVuY3Rpb24gYWRkcmVzc2VzCitQRk5fdmtDcmVhdGVJbnN0YW5jZSB2a0NyZWF0ZUluc3RhbmNlOworUEZOX3ZrRGVzdHJveUluc3RhbmNlIHZrRGVzdHJveUluc3RhbmNlOworUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXM7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXM7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczsKK1BGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgdmtHZXRJbnN0YW5jZVByb2NBZGRyOworUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgdmtHZXREZXZpY2VQcm9jQWRkcjsKK1BGTl92a0NyZWF0ZURldmljZSB2a0NyZWF0ZURldmljZTsKK1BGTl92a0Rlc3Ryb3lEZXZpY2UgdmtEZXN0cm95RGV2aWNlOworUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworUEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXM7CitQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzOworUEZOX3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIHZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzOworUEZOX3ZrR2V0RGV2aWNlUXVldWUgdmtHZXREZXZpY2VRdWV1ZTsKK1BGTl92a1F1ZXVlU3VibWl0IHZrUXVldWVTdWJtaXQ7CitQRk5fdmtRdWV1ZVdhaXRJZGxlIHZrUXVldWVXYWl0SWRsZTsKK1BGTl92a0RldmljZVdhaXRJZGxlIHZrRGV2aWNlV2FpdElkbGU7CitQRk5fdmtBbGxvY2F0ZU1lbW9yeSB2a0FsbG9jYXRlTWVtb3J5OworUEZOX3ZrRnJlZU1lbW9yeSB2a0ZyZWVNZW1vcnk7CitQRk5fdmtNYXBNZW1vcnkgdmtNYXBNZW1vcnk7CitQRk5fdmtVbm1hcE1lbW9yeSB2a1VubWFwTWVtb3J5OworUEZOX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlczsKK1BGTl92a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMgdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzOworUEZOX3ZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCB2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQ7CitQRk5fdmtCaW5kQnVmZmVyTWVtb3J5IHZrQmluZEJ1ZmZlck1lbW9yeTsKK1BGTl92a0JpbmRJbWFnZU1lbW9yeSB2a0JpbmRJbWFnZU1lbW9yeTsKK1BGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czsKK1BGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM7CitQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczsKK1BGTl92a1F1ZXVlQmluZFNwYXJzZSB2a1F1ZXVlQmluZFNwYXJzZTsKK1BGTl92a0NyZWF0ZUZlbmNlIHZrQ3JlYXRlRmVuY2U7CitQRk5fdmtEZXN0cm95RmVuY2UgdmtEZXN0cm95RmVuY2U7CitQRk5fdmtSZXNldEZlbmNlcyB2a1Jlc2V0RmVuY2VzOworUEZOX3ZrR2V0RmVuY2VTdGF0dXMgdmtHZXRGZW5jZVN0YXR1czsKK1BGTl92a1dhaXRGb3JGZW5jZXMgdmtXYWl0Rm9yRmVuY2VzOworUEZOX3ZrQ3JlYXRlU2VtYXBob3JlIHZrQ3JlYXRlU2VtYXBob3JlOworUEZOX3ZrRGVzdHJveVNlbWFwaG9yZSB2a0Rlc3Ryb3lTZW1hcGhvcmU7CitQRk5fdmtDcmVhdGVFdmVudCB2a0NyZWF0ZUV2ZW50OworUEZOX3ZrRGVzdHJveUV2ZW50IHZrRGVzdHJveUV2ZW50OworUEZOX3ZrR2V0RXZlbnRTdGF0dXMgdmtHZXRFdmVudFN0YXR1czsKK1BGTl92a1NldEV2ZW50IHZrU2V0RXZlbnQ7CitQRk5fdmtSZXNldEV2ZW50IHZrUmVzZXRFdmVudDsKK1BGTl92a0NyZWF0ZVF1ZXJ5UG9vbCB2a0NyZWF0ZVF1ZXJ5UG9vbDsKK1BGTl92a0Rlc3Ryb3lRdWVyeVBvb2wgdmtEZXN0cm95UXVlcnlQb29sOworUEZOX3ZrR2V0UXVlcnlQb29sUmVzdWx0cyB2a0dldFF1ZXJ5UG9vbFJlc3VsdHM7CitQRk5fdmtDcmVhdGVCdWZmZXIgdmtDcmVhdGVCdWZmZXI7CitQRk5fdmtEZXN0cm95QnVmZmVyIHZrRGVzdHJveUJ1ZmZlcjsKK1BGTl92a0NyZWF0ZUJ1ZmZlclZpZXcgdmtDcmVhdGVCdWZmZXJWaWV3OworUEZOX3ZrRGVzdHJveUJ1ZmZlclZpZXcgdmtEZXN0cm95QnVmZmVyVmlldzsKK1BGTl92a0NyZWF0ZUltYWdlIHZrQ3JlYXRlSW1hZ2U7CitQRk5fdmtEZXN0cm95SW1hZ2UgdmtEZXN0cm95SW1hZ2U7CitQRk5fdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0IHZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dDsKK1BGTl92a0NyZWF0ZUltYWdlVmlldyB2a0NyZWF0ZUltYWdlVmlldzsKK1BGTl92a0Rlc3Ryb3lJbWFnZVZpZXcgdmtEZXN0cm95SW1hZ2VWaWV3OworUEZOX3ZrQ3JlYXRlU2hhZGVyTW9kdWxlIHZrQ3JlYXRlU2hhZGVyTW9kdWxlOworUEZOX3ZrRGVzdHJveVNoYWRlck1vZHVsZSB2a0Rlc3Ryb3lTaGFkZXJNb2R1bGU7CitQRk5fdmtDcmVhdGVQaXBlbGluZUNhY2hlIHZrQ3JlYXRlUGlwZWxpbmVDYWNoZTsKK1BGTl92a0Rlc3Ryb3lQaXBlbGluZUNhY2hlIHZrRGVzdHJveVBpcGVsaW5lQ2FjaGU7CitQRk5fdmtHZXRQaXBlbGluZUNhY2hlRGF0YSB2a0dldFBpcGVsaW5lQ2FjaGVEYXRhOworUEZOX3ZrTWVyZ2VQaXBlbGluZUNhY2hlcyB2a01lcmdlUGlwZWxpbmVDYWNoZXM7CitQRk5fdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOworUEZOX3ZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyB2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXM7CitQRk5fdmtEZXN0cm95UGlwZWxpbmUgdmtEZXN0cm95UGlwZWxpbmU7CitQRk5fdmtDcmVhdGVQaXBlbGluZUxheW91dCB2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0OworUEZOX3ZrRGVzdHJveVBpcGVsaW5lTGF5b3V0IHZrRGVzdHJveVBpcGVsaW5lTGF5b3V0OworUEZOX3ZrQ3JlYXRlU2FtcGxlciB2a0NyZWF0ZVNhbXBsZXI7CitQRk5fdmtEZXN0cm95U2FtcGxlciB2a0Rlc3Ryb3lTYW1wbGVyOworUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCB2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQ7CitQRk5fdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCB2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0OworUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclBvb2wgdmtDcmVhdGVEZXNjcmlwdG9yUG9vbDsKK1BGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCB2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbDsKK1BGTl92a1Jlc2V0RGVzY3JpcHRvclBvb2wgdmtSZXNldERlc2NyaXB0b3JQb29sOworUEZOX3ZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyB2a0FsbG9jYXRlRGVzY3JpcHRvclNldHM7CitQRk5fdmtGcmVlRGVzY3JpcHRvclNldHMgdmtGcmVlRGVzY3JpcHRvclNldHM7CitQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0cyB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzOworUEZOX3ZrQ3JlYXRlRnJhbWVidWZmZXIgdmtDcmVhdGVGcmFtZWJ1ZmZlcjsKK1BGTl92a0Rlc3Ryb3lGcmFtZWJ1ZmZlciB2a0Rlc3Ryb3lGcmFtZWJ1ZmZlcjsKK1BGTl92a0NyZWF0ZVJlbmRlclBhc3MgdmtDcmVhdGVSZW5kZXJQYXNzOworUEZOX3ZrRGVzdHJveVJlbmRlclBhc3MgdmtEZXN0cm95UmVuZGVyUGFzczsKK1BGTl92a0dldFJlbmRlckFyZWFHcmFudWxhcml0eSB2a0dldFJlbmRlckFyZWFHcmFudWxhcml0eTsKK1BGTl92a0NyZWF0ZUNvbW1hbmRQb29sIHZrQ3JlYXRlQ29tbWFuZFBvb2w7CitQRk5fdmtEZXN0cm95Q29tbWFuZFBvb2wgdmtEZXN0cm95Q29tbWFuZFBvb2w7CitQRk5fdmtSZXNldENvbW1hbmRQb29sIHZrUmVzZXRDb21tYW5kUG9vbDsKK1BGTl92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzOworUEZOX3ZrRnJlZUNvbW1hbmRCdWZmZXJzIHZrRnJlZUNvbW1hbmRCdWZmZXJzOworUEZOX3ZrQmVnaW5Db21tYW5kQnVmZmVyIHZrQmVnaW5Db21tYW5kQnVmZmVyOworUEZOX3ZrRW5kQ29tbWFuZEJ1ZmZlciB2a0VuZENvbW1hbmRCdWZmZXI7CitQRk5fdmtSZXNldENvbW1hbmRCdWZmZXIgdmtSZXNldENvbW1hbmRCdWZmZXI7CitQRk5fdmtDbWRCaW5kUGlwZWxpbmUgdmtDbWRCaW5kUGlwZWxpbmU7CitQRk5fdmtDbWRTZXRWaWV3cG9ydCB2a0NtZFNldFZpZXdwb3J0OworUEZOX3ZrQ21kU2V0U2Npc3NvciB2a0NtZFNldFNjaXNzb3I7CitQRk5fdmtDbWRTZXRMaW5lV2lkdGggdmtDbWRTZXRMaW5lV2lkdGg7CitQRk5fdmtDbWRTZXREZXB0aEJpYXMgdmtDbWRTZXREZXB0aEJpYXM7CitQRk5fdmtDbWRTZXRCbGVuZENvbnN0YW50cyB2a0NtZFNldEJsZW5kQ29uc3RhbnRzOworUEZOX3ZrQ21kU2V0RGVwdGhCb3VuZHMgdmtDbWRTZXREZXB0aEJvdW5kczsKK1BGTl92a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayB2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzazsKK1BGTl92a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2sgdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrOworUEZOX3ZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSB2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2U7CitQRk5fdmtDbWRCaW5kRGVzY3JpcHRvclNldHMgdmtDbWRCaW5kRGVzY3JpcHRvclNldHM7CitQRk5fdmtDbWRCaW5kSW5kZXhCdWZmZXIgdmtDbWRCaW5kSW5kZXhCdWZmZXI7CitQRk5fdmtDbWRCaW5kVmVydGV4QnVmZmVycyB2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzOworUEZOX3ZrQ21kRHJhdyB2a0NtZERyYXc7CitQRk5fdmtDbWREcmF3SW5kZXhlZCB2a0NtZERyYXdJbmRleGVkOworUEZOX3ZrQ21kRHJhd0luZGlyZWN0IHZrQ21kRHJhd0luZGlyZWN0OworUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3Q7CitQRk5fdmtDbWREaXNwYXRjaCB2a0NtZERpc3BhdGNoOworUEZOX3ZrQ21kRGlzcGF0Y2hJbmRpcmVjdCB2a0NtZERpc3BhdGNoSW5kaXJlY3Q7CitQRk5fdmtDbWRDb3B5QnVmZmVyIHZrQ21kQ29weUJ1ZmZlcjsKK1BGTl92a0NtZENvcHlJbWFnZSB2a0NtZENvcHlJbWFnZTsKK1BGTl92a0NtZEJsaXRJbWFnZSB2a0NtZEJsaXRJbWFnZTsKK1BGTl92a0NtZENvcHlCdWZmZXJUb0ltYWdlIHZrQ21kQ29weUJ1ZmZlclRvSW1hZ2U7CitQRk5fdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciB2a0NtZENvcHlJbWFnZVRvQnVmZmVyOworUEZOX3ZrQ21kVXBkYXRlQnVmZmVyIHZrQ21kVXBkYXRlQnVmZmVyOworUEZOX3ZrQ21kRmlsbEJ1ZmZlciB2a0NtZEZpbGxCdWZmZXI7CitQRk5fdmtDbWRDbGVhckNvbG9ySW1hZ2UgdmtDbWRDbGVhckNvbG9ySW1hZ2U7CitQRk5fdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlIHZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZTsKK1BGTl92a0NtZENsZWFyQXR0YWNobWVudHMgdmtDbWRDbGVhckF0dGFjaG1lbnRzOworUEZOX3ZrQ21kUmVzb2x2ZUltYWdlIHZrQ21kUmVzb2x2ZUltYWdlOworUEZOX3ZrQ21kU2V0RXZlbnQgdmtDbWRTZXRFdmVudDsKK1BGTl92a0NtZFJlc2V0RXZlbnQgdmtDbWRSZXNldEV2ZW50OworUEZOX3ZrQ21kV2FpdEV2ZW50cyB2a0NtZFdhaXRFdmVudHM7CitQRk5fdmtDbWRQaXBlbGluZUJhcnJpZXIgdmtDbWRQaXBlbGluZUJhcnJpZXI7CitQRk5fdmtDbWRCZWdpblF1ZXJ5IHZrQ21kQmVnaW5RdWVyeTsKK1BGTl92a0NtZEVuZFF1ZXJ5IHZrQ21kRW5kUXVlcnk7CitQRk5fdmtDbWRSZXNldFF1ZXJ5UG9vbCB2a0NtZFJlc2V0UXVlcnlQb29sOworUEZOX3ZrQ21kV3JpdGVUaW1lc3RhbXAgdmtDbWRXcml0ZVRpbWVzdGFtcDsKK1BGTl92a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzIHZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHM7CitQRk5fdmtDbWRQdXNoQ29uc3RhbnRzIHZrQ21kUHVzaENvbnN0YW50czsKK1BGTl92a0NtZEJlZ2luUmVuZGVyUGFzcyB2a0NtZEJlZ2luUmVuZGVyUGFzczsKK1BGTl92a0NtZE5leHRTdWJwYXNzIHZrQ21kTmV4dFN1YnBhc3M7CitQRk5fdmtDbWRFbmRSZW5kZXJQYXNzIHZrQ21kRW5kUmVuZGVyUGFzczsKK1BGTl92a0NtZEV4ZWN1dGVDb21tYW5kcyB2a0NtZEV4ZWN1dGVDb21tYW5kczsKK1BGTl92a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiB2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbjsKK1BGTl92a0JpbmRCdWZmZXJNZW1vcnkyIHZrQmluZEJ1ZmZlck1lbW9yeTI7CitQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyIHZrQmluZEltYWdlTWVtb3J5MjsKK1BGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzIHZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXM7CitQRk5fdmtDbWRTZXREZXZpY2VNYXNrIHZrQ21kU2V0RGV2aWNlTWFzazsKK1BGTl92a0NtZERpc3BhdGNoQmFzZSB2a0NtZERpc3BhdGNoQmFzZTsKK1BGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHM7CitQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI7CitQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMjsKK1BGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI7CitQRk5fdmtUcmltQ29tbWFuZFBvb2wgdmtUcmltQ29tbWFuZFBvb2w7CitQRk5fdmtHZXREZXZpY2VRdWV1ZTIgdmtHZXREZXZpY2VRdWV1ZTI7CitQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKK1BGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb247CitQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7CitQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKK1BGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUgdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllczsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczsKK1BGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IHZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQ7CitQRk5fdmtEZXN0cm95U3VyZmFjZUtIUiB2a0Rlc3Ryb3lTdXJmYWNlS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUjsKK1BGTl92a0NyZWF0ZVN3YXBjaGFpbktIUiB2a0NyZWF0ZVN3YXBjaGFpbktIUjsKK1BGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFIgdmtEZXN0cm95U3dhcGNoYWluS0hSOworUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIHZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSOworUEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUiB2a0FjcXVpcmVOZXh0SW1hZ2VLSFI7CitQRk5fdmtRdWV1ZVByZXNlbnRLSFIgdmtRdWV1ZVByZXNlbnRLSFI7CitQRk5fdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI7CitQRk5fdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIgdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUjsKK1BGTl92a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIHZrQWNxdWlyZU5leHRJbWFnZTJLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUjsKK1BGTl92a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIHZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFI7CitQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFI7CitQRk5fdmtDcmVhdGVEaXNwbGF5TW9kZUtIUiB2a0NyZWF0ZURpc3BsYXlNb2RlS0hSOworUEZOX3ZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIHZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSOworUEZOX3ZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiB2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFI7CitQRk5fdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIHZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFI7CitQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiB2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSOworUEZOX3ZrQ21kU2V0RGV2aWNlTWFza0tIUiB2a0NtZFNldERldmljZU1hc2tLSFI7CitQRk5fdmtDbWREaXNwYXRjaEJhc2VLSFIgdmtDbWREaXNwYXRjaEJhc2VLSFI7CitQRk5fdmtUcmltQ29tbWFuZFBvb2xLSFIgdmtUcmltQ29tbWFuZFBvb2xLSFI7CitQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUjsKK1BGTl92a0dldE1lbW9yeUZkS0hSIHZrR2V0TWVtb3J5RmRLSFI7CitQRk5fdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIgdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSOworUEZOX3ZrSW1wb3J0U2VtYXBob3JlRmRLSFIgdmtJbXBvcnRTZW1hcGhvcmVGZEtIUjsKK1BGTl92a0dldFNlbWFwaG9yZUZkS0hSIHZrR2V0U2VtYXBob3JlRmRLSFI7CitQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSOworUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUjsKK1BGTl92a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUjsKK1BGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSOworUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiB2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFI7CitQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUiB2a0NyZWF0ZVJlbmRlclBhc3MyS0hSOworUEZOX3ZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiB2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFI7CitQRk5fdmtDbWROZXh0U3VicGFzczJLSFIgdmtDbWROZXh0U3VicGFzczJLSFI7CitQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUiB2a0NtZEVuZFJlbmRlclBhc3MyS0hSOworUEZOX3ZrR2V0U3dhcGNoYWluU3RhdHVzS0hSIHZrR2V0U3dhcGNoYWluU3RhdHVzS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFI7CitQRk5fdmtJbXBvcnRGZW5jZUZkS0hSIHZrSW1wb3J0RmVuY2VGZEtIUjsKK1BGTl92a0dldEZlbmNlRmRLSFIgdmtHZXRGZW5jZUZkS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSOworUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiB2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFI7CitQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIHZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjsKK1BGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKK1BGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSOworUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSOworUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiB2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFI7CitQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSOworUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTJLSFIgdmtCaW5kQnVmZmVyTWVtb3J5MktIUjsKK1BGTl92a0JpbmRJbWFnZU1lbW9yeTJLSFIgdmtCaW5kSW1hZ2VNZW1vcnkyS0hSOworUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIgdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUjsKK1BGTl92a0NtZERyYXdJbmRpcmVjdENvdW50S0hSIHZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFI7CitQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFI7CitQRk5fdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIHZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVDsKK1BGTl92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIHZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CitQRk5fdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQgdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQ7CitQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCB2a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUOworUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIHZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUOworUEZOX3ZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCB2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQ7CitQRk5fdmtDbWREZWJ1Z01hcmtlckVuZEVYVCB2a0NtZERlYnVnTWFya2VyRW5kRVhUOworUEZOX3ZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQgdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVDsKK1BGTl92a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQgdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUOworUEZOX3ZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCB2a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQ7CitQRk5fdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCB2a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUOworUEZOX3ZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQgdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVDsKK1BGTl92a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVCB2a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVDsKK1BGTl92a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCB2a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVDsKK1BGTl92a0NtZERyYXdJbmRpcmVjdENvdW50QU1EIHZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQ7CitQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQ7CitQRk5fdmtHZXRTaGFkZXJJbmZvQU1EIHZrR2V0U2hhZGVySW5mb0FNRDsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVjsKK1BGTl92a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUOworUEZOX3ZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVDsKK1BGTl92a0NtZFByb2Nlc3NDb21tYW5kc05WWCB2a0NtZFByb2Nlc3NDb21tYW5kc05WWDsKK1BGTl92a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIHZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlg7CitQRk5fdmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIHZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKK1BGTl92a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIHZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg7CitQRk5fdmtDcmVhdGVPYmplY3RUYWJsZU5WWCB2a0NyZWF0ZU9iamVjdFRhYmxlTlZYOworUEZOX3ZrRGVzdHJveU9iamVjdFRhYmxlTlZYIHZrRGVzdHJveU9iamVjdFRhYmxlTlZYOworUEZOX3ZrUmVnaXN0ZXJPYmplY3RzTlZYIHZrUmVnaXN0ZXJPYmplY3RzTlZYOworUEZOX3ZrVW5yZWdpc3Rlck9iamVjdHNOVlggdmtVbnJlZ2lzdGVyT2JqZWN0c05WWDsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYIHZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlg7CitQRk5fdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYgdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlY7CitQRk5fdmtSZWxlYXNlRGlzcGxheUVYVCB2a1JlbGVhc2VEaXNwbGF5RVhUOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ7CitQRk5fdmtEaXNwbGF5UG93ZXJDb250cm9sRVhUIHZrRGlzcGxheVBvd2VyQ29udHJvbEVYVDsKK1BGTl92a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQgdmtSZWdpc3RlckRldmljZUV2ZW50RVhUOworUEZOX3ZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQgdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVDsKK1BGTl92a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQgdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUOworUEZOX3ZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUgdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRTsKK1BGTl92a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFOworUEZOX3ZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCB2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQ7CitQRk5fdmtTZXRIZHJNZXRhZGF0YUVYVCB2a1NldEhkck1ldGFkYXRhRVhUOworUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVDsKK1BGTl92a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQgdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUOworUEZOX3ZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCB2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQ7CitQRk5fdmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCB2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUOworUEZOX3ZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVDsKK1BGTl92a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIHZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQ7CitQRk5fdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQ7CitQRk5fdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQ7CitQRk5fdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIHZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVDsKK1BGTl92a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIHZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQ7CitQRk5fdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCB2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUOworUEZOX3ZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUIHZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVDsKK1BGTl92a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIHZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ7CitQRk5fdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQgdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQ7CitQRk5fdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUIHZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVDsKK1BGTl92a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCB2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVDsKK1BGTl92a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQgdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUOworUEZOX3ZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViB2a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlY7CitQRk5fdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WIHZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVjsKK1BGTl92a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYgdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WOworUEZOX3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKK1BGTl92a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViB2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKK1BGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WIHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlY7CitQRk5fdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYgdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlY7CitQRk5fdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKK1BGTl92a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViB2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKK1BGTl92a0NtZFRyYWNlUmF5c05WIHZrQ21kVHJhY2VSYXlzTlY7CitQRk5fdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYgdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlY7CitQRk5fdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYgdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlY7CitQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WOworUEZOX3ZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIHZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WOworUEZOX3ZrQ29tcGlsZURlZmVycmVkTlYgdmtDb21waWxlRGVmZXJyZWROVjsKK1BGTl92a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCB2a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDsKK1BGTl92a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EIHZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQ7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCB2a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUOworUEZOX3ZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQgdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVDsKK1BGTl92a0NtZERyYXdNZXNoVGFza3NOViB2a0NtZERyYXdNZXNoVGFza3NOVjsKK1BGTl92a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WIHZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlY7CitQRk5fdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIHZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVjsKK1BGTl92a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViB2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjsKK1BGTl92a0NtZFNldENoZWNrcG9pbnROViB2a0NtZFNldENoZWNrcG9pbnROVjsKK1BGTl92a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViB2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOVjsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorUEZOX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIgdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUjsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCB2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEOworUEZOX3ZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCB2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQ7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCitQRk5fdmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSB2a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworUEZOX3ZrQ3JlYXRlSU9TU3VyZmFjZU1WSyB2a0NyZWF0ZUlPU1N1cmZhY2VNVks7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKK1BGTl92a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyB2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSzsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCitQRk5fdmtDcmVhdGVWaVN1cmZhY2VOTiB2a0NyZWF0ZVZpU3VyZmFjZU5OOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKK1BGTl92a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIHZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorUEZOX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIHZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIgdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIgdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUjsKK1BGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiB2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUjsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitQRk5fdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiB2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSOworUEZOX3ZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUjsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorUEZOX3ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiB2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFI7CitQRk5fdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSIHZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUjsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViB2a0dldE1lbW9yeVdpbjMySGFuZGxlTlY7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKK1BGTl92a0NyZWF0ZVhjYlN1cmZhY2VLSFIgdmtDcmVhdGVYY2JTdXJmYWNlS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKK1BGTl92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIHZrQ3JlYXRlWGxpYlN1cmZhY2VLSFI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorUEZOX3ZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIHZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUOworUEZOX3ZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUIHZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jb21tb24vdnVsa2FuX3dyYXBwZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2NvbW1vbi92dWxrYW5fd3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1N2U2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jb21tb24vdnVsa2FuX3dyYXBwZXIuaApAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuCisjaWZuZGVmIFZVTEtBTl9XUkFQUEVSX0gKKyNkZWZpbmUgVlVMS0FOX1dSQVBQRVJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgVktfTk9fUFJPVE9UWVBFUyAxCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCisvKiBJbml0aWFsaXplIHRoZSBWdWxrYW4gZnVuY3Rpb24gcG9pbnRlciB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhpcyBoZWFkZXIuCisgKiBSZXR1cm5zIDAgaWYgdnVsa2FuIGlzIG5vdCBhdmFpbGFibGUsIG5vbi16ZXJvIGlmIGl0IGlzIGF2YWlsYWJsZS4KKyAqLworaW50IEluaXRWdWxrYW4odm9pZCk7CisKKy8vIFZLX2NvcmVfMAorZXh0ZXJuIFBGTl92a0NyZWF0ZUluc3RhbmNlIHZrQ3JlYXRlSW5zdGFuY2U7CitleHRlcm4gUEZOX3ZrRGVzdHJveUluc3RhbmNlIHZrRGVzdHJveUluc3RhbmNlOworZXh0ZXJuIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlczsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciB2a0dldEluc3RhbmNlUHJvY0FkZHI7CitleHRlcm4gUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgdmtHZXREZXZpY2VQcm9jQWRkcjsKK2V4dGVybiBQRk5fdmtDcmVhdGVEZXZpY2UgdmtDcmVhdGVEZXZpY2U7CitleHRlcm4gUEZOX3ZrRGVzdHJveURldmljZSB2a0Rlc3Ryb3lEZXZpY2U7CitleHRlcm4gUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIHZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0dldERldmljZVF1ZXVlIHZrR2V0RGV2aWNlUXVldWU7CitleHRlcm4gUEZOX3ZrUXVldWVTdWJtaXQgdmtRdWV1ZVN1Ym1pdDsKK2V4dGVybiBQRk5fdmtRdWV1ZVdhaXRJZGxlIHZrUXVldWVXYWl0SWRsZTsKK2V4dGVybiBQRk5fdmtEZXZpY2VXYWl0SWRsZSB2a0RldmljZVdhaXRJZGxlOworZXh0ZXJuIFBGTl92a0FsbG9jYXRlTWVtb3J5IHZrQWxsb2NhdGVNZW1vcnk7CitleHRlcm4gUEZOX3ZrRnJlZU1lbW9yeSB2a0ZyZWVNZW1vcnk7CitleHRlcm4gUEZOX3ZrTWFwTWVtb3J5IHZrTWFwTWVtb3J5OworZXh0ZXJuIFBGTl92a1VubWFwTWVtb3J5IHZrVW5tYXBNZW1vcnk7CitleHRlcm4gUEZOX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlczsKK2V4dGVybiBQRk5fdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIHZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlczsKK2V4dGVybiBQRk5fdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IHZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudDsKK2V4dGVybiBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5IHZrQmluZEJ1ZmZlck1lbW9yeTsKK2V4dGVybiBQRk5fdmtCaW5kSW1hZ2VNZW1vcnkgdmtCaW5kSW1hZ2VNZW1vcnk7CitleHRlcm4gUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzOworZXh0ZXJuIFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM7CitleHRlcm4gUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a1F1ZXVlQmluZFNwYXJzZSB2a1F1ZXVlQmluZFNwYXJzZTsKK2V4dGVybiBQRk5fdmtDcmVhdGVGZW5jZSB2a0NyZWF0ZUZlbmNlOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lGZW5jZSB2a0Rlc3Ryb3lGZW5jZTsKK2V4dGVybiBQRk5fdmtSZXNldEZlbmNlcyB2a1Jlc2V0RmVuY2VzOworZXh0ZXJuIFBGTl92a0dldEZlbmNlU3RhdHVzIHZrR2V0RmVuY2VTdGF0dXM7CitleHRlcm4gUEZOX3ZrV2FpdEZvckZlbmNlcyB2a1dhaXRGb3JGZW5jZXM7CitleHRlcm4gUEZOX3ZrQ3JlYXRlU2VtYXBob3JlIHZrQ3JlYXRlU2VtYXBob3JlOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lTZW1hcGhvcmUgdmtEZXN0cm95U2VtYXBob3JlOworZXh0ZXJuIFBGTl92a0NyZWF0ZUV2ZW50IHZrQ3JlYXRlRXZlbnQ7CitleHRlcm4gUEZOX3ZrRGVzdHJveUV2ZW50IHZrRGVzdHJveUV2ZW50OworZXh0ZXJuIFBGTl92a0dldEV2ZW50U3RhdHVzIHZrR2V0RXZlbnRTdGF0dXM7CitleHRlcm4gUEZOX3ZrU2V0RXZlbnQgdmtTZXRFdmVudDsKK2V4dGVybiBQRk5fdmtSZXNldEV2ZW50IHZrUmVzZXRFdmVudDsKK2V4dGVybiBQRk5fdmtDcmVhdGVRdWVyeVBvb2wgdmtDcmVhdGVRdWVyeVBvb2w7CitleHRlcm4gUEZOX3ZrRGVzdHJveVF1ZXJ5UG9vbCB2a0Rlc3Ryb3lRdWVyeVBvb2w7CitleHRlcm4gUEZOX3ZrR2V0UXVlcnlQb29sUmVzdWx0cyB2a0dldFF1ZXJ5UG9vbFJlc3VsdHM7CitleHRlcm4gUEZOX3ZrQ3JlYXRlQnVmZmVyIHZrQ3JlYXRlQnVmZmVyOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lCdWZmZXIgdmtEZXN0cm95QnVmZmVyOworZXh0ZXJuIFBGTl92a0NyZWF0ZUJ1ZmZlclZpZXcgdmtDcmVhdGVCdWZmZXJWaWV3OworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lCdWZmZXJWaWV3IHZrRGVzdHJveUJ1ZmZlclZpZXc7CitleHRlcm4gUEZOX3ZrQ3JlYXRlSW1hZ2UgdmtDcmVhdGVJbWFnZTsKK2V4dGVybiBQRk5fdmtEZXN0cm95SW1hZ2UgdmtEZXN0cm95SW1hZ2U7CitleHRlcm4gUEZOX3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCB2a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQ7CitleHRlcm4gUEZOX3ZrQ3JlYXRlSW1hZ2VWaWV3IHZrQ3JlYXRlSW1hZ2VWaWV3OworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lJbWFnZVZpZXcgdmtEZXN0cm95SW1hZ2VWaWV3OworZXh0ZXJuIFBGTl92a0NyZWF0ZVNoYWRlck1vZHVsZSB2a0NyZWF0ZVNoYWRlck1vZHVsZTsKK2V4dGVybiBQRk5fdmtEZXN0cm95U2hhZGVyTW9kdWxlIHZrRGVzdHJveVNoYWRlck1vZHVsZTsKK2V4dGVybiBQRk5fdmtDcmVhdGVQaXBlbGluZUNhY2hlIHZrQ3JlYXRlUGlwZWxpbmVDYWNoZTsKK2V4dGVybiBQRk5fdmtEZXN0cm95UGlwZWxpbmVDYWNoZSB2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlOworZXh0ZXJuIFBGTl92a0dldFBpcGVsaW5lQ2FjaGVEYXRhIHZrR2V0UGlwZWxpbmVDYWNoZURhdGE7CitleHRlcm4gUEZOX3ZrTWVyZ2VQaXBlbGluZUNhY2hlcyB2a01lcmdlUGlwZWxpbmVDYWNoZXM7CitleHRlcm4gUEZOX3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczsKK2V4dGVybiBQRk5fdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIHZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lczsKK2V4dGVybiBQRk5fdmtEZXN0cm95UGlwZWxpbmUgdmtEZXN0cm95UGlwZWxpbmU7CitleHRlcm4gUEZOX3ZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQgdmtDcmVhdGVQaXBlbGluZUxheW91dDsKK2V4dGVybiBQRk5fdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQgdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQ7CitleHRlcm4gUEZOX3ZrQ3JlYXRlU2FtcGxlciB2a0NyZWF0ZVNhbXBsZXI7CitleHRlcm4gUEZOX3ZrRGVzdHJveVNhbXBsZXIgdmtEZXN0cm95U2FtcGxlcjsKK2V4dGVybiBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dDsKK2V4dGVybiBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCB2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0OworZXh0ZXJuIFBGTl92a0NyZWF0ZURlc2NyaXB0b3JQb29sIHZrQ3JlYXRlRGVzY3JpcHRvclBvb2w7CitleHRlcm4gUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JQb29sIHZrRGVzdHJveURlc2NyaXB0b3JQb29sOworZXh0ZXJuIFBGTl92a1Jlc2V0RGVzY3JpcHRvclBvb2wgdmtSZXNldERlc2NyaXB0b3JQb29sOworZXh0ZXJuIFBGTl92a0FsbG9jYXRlRGVzY3JpcHRvclNldHMgdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzOworZXh0ZXJuIFBGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cyB2a0ZyZWVEZXNjcmlwdG9yU2V0czsKK2V4dGVybiBQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0cyB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzOworZXh0ZXJuIFBGTl92a0NyZWF0ZUZyYW1lYnVmZmVyIHZrQ3JlYXRlRnJhbWVidWZmZXI7CitleHRlcm4gUEZOX3ZrRGVzdHJveUZyYW1lYnVmZmVyIHZrRGVzdHJveUZyYW1lYnVmZmVyOworZXh0ZXJuIFBGTl92a0NyZWF0ZVJlbmRlclBhc3MgdmtDcmVhdGVSZW5kZXJQYXNzOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lSZW5kZXJQYXNzIHZrRGVzdHJveVJlbmRlclBhc3M7CitleHRlcm4gUEZOX3ZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5IHZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5OworZXh0ZXJuIFBGTl92a0NyZWF0ZUNvbW1hbmRQb29sIHZrQ3JlYXRlQ29tbWFuZFBvb2w7CitleHRlcm4gUEZOX3ZrRGVzdHJveUNvbW1hbmRQb29sIHZrRGVzdHJveUNvbW1hbmRQb29sOworZXh0ZXJuIFBGTl92a1Jlc2V0Q29tbWFuZFBvb2wgdmtSZXNldENvbW1hbmRQb29sOworZXh0ZXJuIFBGTl92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzOworZXh0ZXJuIFBGTl92a0ZyZWVDb21tYW5kQnVmZmVycyB2a0ZyZWVDb21tYW5kQnVmZmVyczsKK2V4dGVybiBQRk5fdmtCZWdpbkNvbW1hbmRCdWZmZXIgdmtCZWdpbkNvbW1hbmRCdWZmZXI7CitleHRlcm4gUEZOX3ZrRW5kQ29tbWFuZEJ1ZmZlciB2a0VuZENvbW1hbmRCdWZmZXI7CitleHRlcm4gUEZOX3ZrUmVzZXRDb21tYW5kQnVmZmVyIHZrUmVzZXRDb21tYW5kQnVmZmVyOworZXh0ZXJuIFBGTl92a0NtZEJpbmRQaXBlbGluZSB2a0NtZEJpbmRQaXBlbGluZTsKK2V4dGVybiBQRk5fdmtDbWRTZXRWaWV3cG9ydCB2a0NtZFNldFZpZXdwb3J0OworZXh0ZXJuIFBGTl92a0NtZFNldFNjaXNzb3IgdmtDbWRTZXRTY2lzc29yOworZXh0ZXJuIFBGTl92a0NtZFNldExpbmVXaWR0aCB2a0NtZFNldExpbmVXaWR0aDsKK2V4dGVybiBQRk5fdmtDbWRTZXREZXB0aEJpYXMgdmtDbWRTZXREZXB0aEJpYXM7CitleHRlcm4gUEZOX3ZrQ21kU2V0QmxlbmRDb25zdGFudHMgdmtDbWRTZXRCbGVuZENvbnN0YW50czsKK2V4dGVybiBQRk5fdmtDbWRTZXREZXB0aEJvdW5kcyB2a0NtZFNldERlcHRoQm91bmRzOworZXh0ZXJuIFBGTl92a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayB2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzazsKK2V4dGVybiBQRk5fdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrIHZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzazsKK2V4dGVybiBQRk5fdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIHZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZTsKK2V4dGVybiBQRk5fdmtDbWRCaW5kRGVzY3JpcHRvclNldHMgdmtDbWRCaW5kRGVzY3JpcHRvclNldHM7CitleHRlcm4gUEZOX3ZrQ21kQmluZEluZGV4QnVmZmVyIHZrQ21kQmluZEluZGV4QnVmZmVyOworZXh0ZXJuIFBGTl92a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnM7CitleHRlcm4gUEZOX3ZrQ21kRHJhdyB2a0NtZERyYXc7CitleHRlcm4gUEZOX3ZrQ21kRHJhd0luZGV4ZWQgdmtDbWREcmF3SW5kZXhlZDsKK2V4dGVybiBQRk5fdmtDbWREcmF3SW5kaXJlY3QgdmtDbWREcmF3SW5kaXJlY3Q7CitleHRlcm4gUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3Q7CitleHRlcm4gUEZOX3ZrQ21kRGlzcGF0Y2ggdmtDbWREaXNwYXRjaDsKK2V4dGVybiBQRk5fdmtDbWREaXNwYXRjaEluZGlyZWN0IHZrQ21kRGlzcGF0Y2hJbmRpcmVjdDsKK2V4dGVybiBQRk5fdmtDbWRDb3B5QnVmZmVyIHZrQ21kQ29weUJ1ZmZlcjsKK2V4dGVybiBQRk5fdmtDbWRDb3B5SW1hZ2UgdmtDbWRDb3B5SW1hZ2U7CitleHRlcm4gUEZOX3ZrQ21kQmxpdEltYWdlIHZrQ21kQmxpdEltYWdlOworZXh0ZXJuIFBGTl92a0NtZENvcHlCdWZmZXJUb0ltYWdlIHZrQ21kQ29weUJ1ZmZlclRvSW1hZ2U7CitleHRlcm4gUEZOX3ZrQ21kQ29weUltYWdlVG9CdWZmZXIgdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcjsKK2V4dGVybiBQRk5fdmtDbWRVcGRhdGVCdWZmZXIgdmtDbWRVcGRhdGVCdWZmZXI7CitleHRlcm4gUEZOX3ZrQ21kRmlsbEJ1ZmZlciB2a0NtZEZpbGxCdWZmZXI7CitleHRlcm4gUEZOX3ZrQ21kQ2xlYXJDb2xvckltYWdlIHZrQ21kQ2xlYXJDb2xvckltYWdlOworZXh0ZXJuIFBGTl92a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlOworZXh0ZXJuIFBGTl92a0NtZENsZWFyQXR0YWNobWVudHMgdmtDbWRDbGVhckF0dGFjaG1lbnRzOworZXh0ZXJuIFBGTl92a0NtZFJlc29sdmVJbWFnZSB2a0NtZFJlc29sdmVJbWFnZTsKK2V4dGVybiBQRk5fdmtDbWRTZXRFdmVudCB2a0NtZFNldEV2ZW50OworZXh0ZXJuIFBGTl92a0NtZFJlc2V0RXZlbnQgdmtDbWRSZXNldEV2ZW50OworZXh0ZXJuIFBGTl92a0NtZFdhaXRFdmVudHMgdmtDbWRXYWl0RXZlbnRzOworZXh0ZXJuIFBGTl92a0NtZFBpcGVsaW5lQmFycmllciB2a0NtZFBpcGVsaW5lQmFycmllcjsKK2V4dGVybiBQRk5fdmtDbWRCZWdpblF1ZXJ5IHZrQ21kQmVnaW5RdWVyeTsKK2V4dGVybiBQRk5fdmtDbWRFbmRRdWVyeSB2a0NtZEVuZFF1ZXJ5OworZXh0ZXJuIFBGTl92a0NtZFJlc2V0UXVlcnlQb29sIHZrQ21kUmVzZXRRdWVyeVBvb2w7CitleHRlcm4gUEZOX3ZrQ21kV3JpdGVUaW1lc3RhbXAgdmtDbWRXcml0ZVRpbWVzdGFtcDsKK2V4dGVybiBQRk5fdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyB2a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzOworZXh0ZXJuIFBGTl92a0NtZFB1c2hDb25zdGFudHMgdmtDbWRQdXNoQ29uc3RhbnRzOworZXh0ZXJuIFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzcyB2a0NtZEJlZ2luUmVuZGVyUGFzczsKK2V4dGVybiBQRk5fdmtDbWROZXh0U3VicGFzcyB2a0NtZE5leHRTdWJwYXNzOworZXh0ZXJuIFBGTl92a0NtZEVuZFJlbmRlclBhc3MgdmtDbWRFbmRSZW5kZXJQYXNzOworZXh0ZXJuIFBGTl92a0NtZEV4ZWN1dGVDb21tYW5kcyB2a0NtZEV4ZWN1dGVDb21tYW5kczsKKworLy8gVktfY29yZV8xCitleHRlcm4gUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIHZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uOworZXh0ZXJuIFBGTl92a0JpbmRCdWZmZXJNZW1vcnkyIHZrQmluZEJ1ZmZlck1lbW9yeTI7CitleHRlcm4gUEZOX3ZrQmluZEltYWdlTWVtb3J5MiB2a0JpbmRJbWFnZU1lbW9yeTI7CitleHRlcm4gUEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMgdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlczsKK2V4dGVybiBQRk5fdmtDbWRTZXREZXZpY2VNYXNrIHZrQ21kU2V0RGV2aWNlTWFzazsKK2V4dGVybiBQRk5fdmtDbWREaXNwYXRjaEJhc2UgdmtDbWREaXNwYXRjaEJhc2U7CitleHRlcm4gUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwczsKK2V4dGVybiBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI7CitleHRlcm4gUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czI7CitleHRlcm4gUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI7CitleHRlcm4gUEZOX3ZrVHJpbUNvbW1hbmRQb29sIHZrVHJpbUNvbW1hbmRQb29sOworZXh0ZXJuIFBGTl92a0dldERldmljZVF1ZXVlMiB2a0dldERldmljZVF1ZXVlMjsKK2V4dGVybiBQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKK2V4dGVybiBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uOworZXh0ZXJuIFBGTl92a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKK2V4dGVybiBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKK2V4dGVybiBQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlIHZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZTsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydDsKKworLy8gVktfS0hSX3N1cmZhY2UKK2V4dGVybiBQRk5fdmtEZXN0cm95U3VyZmFjZUtIUiB2a0Rlc3Ryb3lTdXJmYWNlS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFI7CisKKy8vIFZLX0tIUl9zd2FwY2hhaW4KK2V4dGVybiBQRk5fdmtDcmVhdGVTd2FwY2hhaW5LSFIgdmtDcmVhdGVTd2FwY2hhaW5LSFI7CitleHRlcm4gUEZOX3ZrRGVzdHJveVN3YXBjaGFpbktIUiB2a0Rlc3Ryb3lTd2FwY2hhaW5LSFI7CitleHRlcm4gUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIHZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSOworZXh0ZXJuIFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIgdmtBY3F1aXJlTmV4dEltYWdlS0hSOworZXh0ZXJuIFBGTl92a1F1ZXVlUHJlc2VudEtIUiB2a1F1ZXVlUHJlc2VudEtIUjsKK2V4dGVybiBQRk5fdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI7CitleHRlcm4gUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIHZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSOworZXh0ZXJuIFBGTl92a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIHZrQWNxdWlyZU5leHRJbWFnZTJLSFI7CisKKy8vIFZLX0tIUl9kaXNwbGF5CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSOworZXh0ZXJuIFBGTl92a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIHZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFI7CitleHRlcm4gUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIHZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSOworZXh0ZXJuIFBGTl92a0NyZWF0ZURpc3BsYXlNb2RlS0hSIHZrQ3JlYXRlRGlzcGxheU1vZGVLSFI7CitleHRlcm4gUEZOX3ZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIHZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSOworZXh0ZXJuIFBGTl92a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIgdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSOworCisvLyBWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4KK2V4dGVybiBQRk5fdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIHZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUjsKKworLy8gVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UKKworLy8gVktfS0hSX211bHRpdmlldworCisvLyBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFI7CisKKy8vIFZLX0tIUl9kZXZpY2VfZ3JvdXAKK2V4dGVybiBQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiB2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSOworZXh0ZXJuIFBGTl92a0NtZFNldERldmljZU1hc2tLSFIgdmtDbWRTZXREZXZpY2VNYXNrS0hSOworZXh0ZXJuIFBGTl92a0NtZERpc3BhdGNoQmFzZUtIUiB2a0NtZERpc3BhdGNoQmFzZUtIUjsKKworLy8gVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMKKworLy8gVktfS0hSX21haW50ZW5hbmNlMQorZXh0ZXJuIFBGTl92a1RyaW1Db21tYW5kUG9vbEtIUiB2a1RyaW1Db21tYW5kUG9vbEtIUjsKKworLy8gVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbgorZXh0ZXJuIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFI7CisKKy8vIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzCitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUjsKKworLy8gVktfS0hSX2V4dGVybmFsX21lbW9yeQorCisvLyBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkCitleHRlcm4gUEZOX3ZrR2V0TWVtb3J5RmRLSFIgdmtHZXRNZW1vcnlGZEtIUjsKK2V4dGVybiBQRk5fdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIgdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFI7CisKKy8vIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzCitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUjsKKworLy8gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZQorCisvLyBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkCitleHRlcm4gUEZOX3ZrSW1wb3J0U2VtYXBob3JlRmRLSFIgdmtJbXBvcnRTZW1hcGhvcmVGZEtIUjsKK2V4dGVybiBQRk5fdmtHZXRTZW1hcGhvcmVGZEtIUiB2a0dldFNlbWFwaG9yZUZkS0hSOworCisvLyBWS19LSFJfcHVzaF9kZXNjcmlwdG9yCitleHRlcm4gUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUjsKK2V4dGVybiBQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSOworCisvLyBWS19LSFJfMTZiaXRfc3RvcmFnZQorCisvLyBWS19LSFJfaW5jcmVtZW50YWxfcHJlc2VudAorCisvLyBWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUKK2V4dGVybiBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFI7CitleHRlcm4gUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiB2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFI7CitleHRlcm4gUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiB2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFI7CisKKy8vIFZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIKK2V4dGVybiBQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUiB2a0NyZWF0ZVJlbmRlclBhc3MyS0hSOworZXh0ZXJuIFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIgdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSOworZXh0ZXJuIFBGTl92a0NtZE5leHRTdWJwYXNzMktIUiB2a0NtZE5leHRTdWJwYXNzMktIUjsKK2V4dGVybiBQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUiB2a0NtZEVuZFJlbmRlclBhc3MyS0hSOworCisvLyBWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlCitleHRlcm4gUEZOX3ZrR2V0U3dhcGNoYWluU3RhdHVzS0hSIHZrR2V0U3dhcGNoYWluU3RhdHVzS0hSOworCisvLyBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzCitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFI7CisKKy8vIFZLX0tIUl9leHRlcm5hbF9mZW5jZQorCisvLyBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfZmQKK2V4dGVybiBQRk5fdmtJbXBvcnRGZW5jZUZkS0hSIHZrSW1wb3J0RmVuY2VGZEtIUjsKK2V4dGVybiBQRk5fdmtHZXRGZW5jZUZkS0hSIHZrR2V0RmVuY2VGZEtIUjsKKworLy8gVktfS0hSX21haW50ZW5hbmNlMgorCisvLyBWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMgorZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFI7CisKKy8vIFZLX0tIUl92YXJpYWJsZV9wb2ludGVycworCisvLyBWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczIKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSOworZXh0ZXJuIFBGTl92a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSOworZXh0ZXJuIFBGTl92a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSOworCisvLyBWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24KKworLy8gVktfS0hSX3N0b3JhZ2VfYnVmZmVyX3N0b3JhZ2VfY2xhc3MKKworLy8gVktfS0hSX3JlbGF4ZWRfYmxvY2tfbGF5b3V0CisKKy8vIFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIKK2V4dGVybiBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFI7CitleHRlcm4gUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFI7CitleHRlcm4gUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSOworCisvLyBWS19LSFJfaW1hZ2VfZm9ybWF0X2xpc3QKKworLy8gVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbgorZXh0ZXJuIFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFI7CisKKy8vIFZLX0tIUl9iaW5kX21lbW9yeTIKK2V4dGVybiBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MktIUiB2a0JpbmRCdWZmZXJNZW1vcnkyS0hSOworZXh0ZXJuIFBGTl92a0JpbmRJbWFnZU1lbW9yeTJLSFIgdmtCaW5kSW1hZ2VNZW1vcnkyS0hSOworCisvLyBWS19LSFJfbWFpbnRlbmFuY2UzCitleHRlcm4gUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIgdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUjsKKworLy8gVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQKK2V4dGVybiBQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiB2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSOworZXh0ZXJuIFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUjsKKworLy8gVktfS0hSXzhiaXRfc3RvcmFnZQorCisvLyBWS19LSFJfc2hhZGVyX2F0b21pY19pbnQ2NAorCisvLyBWS19LSFJfZHJpdmVyX3Byb3BlcnRpZXMKKworLy8gVktfS0hSX3Z1bGthbl9tZW1vcnlfbW9kZWwKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorLy8gVktfS0hSX2FuZHJvaWRfc3VyZmFjZQorZXh0ZXJuIFBGTl92a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIHZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFI7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorLy8gVktfS0hSX3dheWxhbmRfc3VyZmFjZQorZXh0ZXJuIFBGTl92a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIHZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiB2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIFZLX0tIUl93aW4zMl9zdXJmYWNlCitleHRlcm4gUEZOX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIHZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIKK2V4dGVybiBQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiB2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSOworZXh0ZXJuIFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiB2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUjsKKyNlbmRpZgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gVktfS0hSX3dpbjMyX2tleWVkX211dGV4CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIFZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIKK2V4dGVybiBQRk5fdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiB2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSOworZXh0ZXJuIFBGTl92a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIHZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFI7CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIFZLX0tIUl9leHRlcm5hbF9mZW5jZV93aW4zMgorZXh0ZXJuIFBGTl92a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIgdmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSOworZXh0ZXJuIFBGTl92a0dldEZlbmNlV2luMzJIYW5kbGVLSFIgdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorLy8gVktfS0hSX3hjYl9zdXJmYWNlCitleHRlcm4gUEZOX3ZrQ3JlYXRlWGNiU3VyZmFjZUtIUiB2a0NyZWF0ZVhjYlN1cmZhY2VLSFI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSOworI2VuZGlmCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKy8vIFZLX0tIUl94bGliX3N1cmZhY2UKK2V4dGVybiBQRk5fdmtDcmVhdGVYbGliU3VyZmFjZUtIUiB2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLy8gVlVMS0FOX1dSQVBQRVJfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0MzBkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNTUgQEAKKyMgfn5+CisjIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIH5+fgorCitzZXQoQ1VCRV9JTkNMVURFX0RJUlMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLiAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJ9KQorCitzZXQoU0NSSVBUU19ESVIgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9zY3JpcHRzIikKKworaWYgKE5PVCBHTFNMQU5HX0lOU1RBTExfRElSIEFORCBERUZJTkVEIEVOVntHTFNMQU5HX0lOU1RBTExfRElSfSkKKyAgICBzZXQoR0xTTEFOR19JTlNUQUxMX0RJUiAkRU5We0dMU0xBTkdfSU5TVEFMTF9ESVJ9KQorZW5kaWYoKQorCitpZihHTFNMQU5HX0lOU1RBTExfRElSKQorICAgIG1lc3NhZ2UoU1RBVFVTICJVc2luZyBHTFNMQU5HX0lOU1RBTExfRElSIHRvIGxvb2sgZm9yIGdsc2xhbmdWYWxpZGF0b3IiKQorICAgIGZpbmRfcHJvZ3JhbShHTFNMQU5HX1ZBTElEQVRPUiBuYW1lcyBnbHNsYW5nVmFsaWRhdG9yIEhJTlRTICIke0dMU0xBTkdfSU5TVEFMTF9ESVJ9L2JpbiIpCitlbHNlKCkKKyAgICBzZXQoR0xTTEFOR19WQUxJREFUT1JfTkFNRSAiZ2xzbGFuZ1ZhbGlkYXRvciIpCisgICAgbWVzc2FnZShTVEFUVVMgIlVzaW5nIGNtYWtlIGZpbmRfcHJvZ3JhbSB0byBsb29rIGZvciBnbHNsYW5nVmFsaWRhdG9yIikKKyAgICBpZihXSU4zMikKKyAgICAgICAgZXhlY3V0ZV9wcm9jZXNzKAorICAgICAgICAgICAgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1NDUklQVFNfRElSfS9mZXRjaF9nbHNsYW5ndmFsaWRhdG9yLnB5IGdsc2xhbmctbWFzdGVyLXdpbmRvd3MteDY0LVJlbGVhc2UuemlwKQorICAgICAgICBzZXQoR0xTTEFOR19WQUxJREFUT1JfTkFNRSAiZ2xzbGFuZ1ZhbGlkYXRvci5leGUiKQorICAgIGVsc2VpZihBUFBMRSkKKyAgICAgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtTQ1JJUFRTX0RJUn0vZmV0Y2hfZ2xzbGFuZ3ZhbGlkYXRvci5weSBnbHNsYW5nLW1hc3Rlci1vc3gtUmVsZWFzZS56aXApCisgICAgZWxzZWlmKFVOSVggQU5EIE5PVCBBUFBMRSkgIyBpLmUuIExpbnV4CisgICAgICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7U0NSSVBUU19ESVJ9L2ZldGNoX2dsc2xhbmd2YWxpZGF0b3IucHkgZ2xzbGFuZy1tYXN0ZXItbGludXgtUmVsZWFzZS56aXApCisgICAgZW5kaWYoKQorICAgIGZpbmRfcHJvZ3JhbShHTFNMQU5HX1ZBTElEQVRPUiBOQU1FUyAke0dMU0xBTkdfVkFMSURBVE9SX05BTUV9IEhJTlRTICIke1BST0pFQ1RfU09VUkNFX0RJUn0vZ2xzbGFuZy9iaW4iKQorZW5kaWYoKQorCitpZihVTklYIEFORCBOT1QgQVBQTEUpICMgaS5lLiBMaW51eAorICAgIGluY2x1ZGUoRmluZFBrZ0NvbmZpZykKKyAgICBvcHRpb24oQlVJTERfV1NJX1hDQl9TVVBQT1JUICJCdWlsZCBYQ0IgV1NJIHN1cHBvcnQiIE9OKQorICAgIG9wdGlvbihCVUlMRF9XU0lfWExJQl9TVVBQT1JUICJCdWlsZCBYbGliIFdTSSBzdXBwb3J0IiBPTikKKyAgICBvcHRpb24oQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCAiQnVpbGQgV2F5bGFuZCBXU0kgc3VwcG9ydCIgT04pCisgICAgc2V0KENVQkVfV1NJX1NFTEVDVElPTiAiWENCIiBDQUNIRSBTVFJJTkcgIlNlbGVjdCBXU0kgdGFyZ2V0IGZvciB2a2N1YmUgKFhDQiwgWExJQiwgV0FZTEFORCwgRElTUExBWSkiKQorCisgICAgaWYoQlVJTERfV1NJX1hDQl9TVVBQT1JUKQorICAgICAgICBmaW5kX3BhY2thZ2UoWENCIFJFUVVJUkVEKQorICAgIGVuZGlmKCkKKworICAgIGlmKEJVSUxEX1dTSV9YTElCX1NVUFBPUlQpCisgICAgICAgIGZpbmRfcGFja2FnZShYMTEgUkVRVUlSRUQpCisgICAgZW5kaWYoKQorCisgICAgaWYoQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCkKKyAgICAgICAgZmluZF9wYWNrYWdlKFdheWxhbmQgUkVRVUlSRUQpCisgICAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtXQVlMQU5EX0NMSUVOVF9JTkNMVURFX0RJUn0pCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSIC1EV0lOMzJfTEVBTl9BTkRfTUVBTikKKyAgICBpZihOT1QgTVNWQ19WRVJTSU9OIExFU1MgMTkwMCkKKyAgICAgICAgIyBFbmFibGUgY29udHJvbCBmbG93IGd1YXJkCisgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJCdWlsZGluZyB2a2N1YmUgd2l0aCBjb250cm9sIGZsb3cgZ3VhcmQiKQorICAgICAgICBhZGRfY29tcGlsZV9vcHRpb25zKCIkPCQ8Q1hYX0NPTVBJTEVSX0lEOk1TVkM+Oi9ndWFyZDpjZj4iKQorICAgICAgICBzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSAvZ3VhcmQ6Y2YiKQorICAgICAgICBzZXQoQ01BS0VfRVhFX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSAvZ3VhcmQ6Y2YiKQorICAgIGVuZGlmKCkKK2Vsc2VpZihBTkRST0lEKQorICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUikKK2Vsc2VpZihBUFBMRSkKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKQorZWxzZWlmKFVOSVggQU5EIE5PVCBBUFBMRSkgIyBpLmUuIExpbnV4CisgICAgaWYoTk9UIENVQkVfV1NJX1NFTEVDVElPTikKKyAgICAgICAgc2V0KENVQkVfV1NJX1NFTEVDVElPTiAiWENCIikKKyAgICBlbmRpZigpCisKKyAgICBpZihDVUJFX1dTSV9TRUxFQ1RJT04gU1RSRVFVQUwgIlhDQiIpCisgICAgICAgIGlmKE5PVCBCVUlMRF9XU0lfWENCX1NVUFBPUlQpCisgICAgICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJTZWxlY3RlZCBYQ0IgZm9yIHZrY3ViZSBidWlsZCBidXQgbm90IGJ1aWxkaW5nIFhjYiBzdXBwb3J0IikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBzZXQoQ1VCRV9JTkNMVURFX0RJUlMgJHtYQ0JfSU5DTFVERV9ESVJTfSAke0NVQkVfSU5DTFVERV9ESVJTfSkKKyAgICAgICAgbGlua19saWJyYXJpZXMoJHtYQ0JfTElCUkFSSUVTfSkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisgICAgZWxzZWlmKENVQkVfV1NJX1NFTEVDVElPTiBTVFJFUVVBTCAiWExJQiIpCisgICAgICAgIGlmKE5PVCBCVUlMRF9XU0lfWExJQl9TVVBQT1JUKQorICAgICAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiU2VsZWN0ZWQgWExJQiBmb3IgdmtjdWJlIGJ1aWxkIGJ1dCBub3QgYnVpbGRpbmcgWGxpYiBzdXBwb3J0IikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBzZXQoQ1VCRV9JTkNMVURFX0RJUlMgJHtYMTFfSU5DTFVERV9ESVJ9ICR7Q1VCRV9JTkNMVURFX0RJUlN9KQorICAgICAgICBsaW5rX2xpYnJhcmllcygke1gxMV9MSUJSQVJJRVN9KQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpCisgICAgZWxzZWlmKENVQkVfV1NJX1NFTEVDVElPTiBTVFJFUVVBTCAiV0FZTEFORCIpCisgICAgICAgIGlmKE5PVCBCVUlMRF9XU0lfV0FZTEFORF9TVVBQT1JUKQorICAgICAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiU2VsZWN0ZWQgV2F5bGFuZCBmb3IgdmtjdWJlIGJ1aWxkIGJ1dCBub3QgYnVpbGRpbmcgV2F5bGFuZCBzdXBwb3J0IikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBzZXQoQ1VCRV9JTkNMVURFX0RJUlMgJHtXQVlMQU5EX0NMSUVOVF9JTkNMVURFX0RJUn0gJHtDVUJFX0lOQ0xVREVfRElSU30pCisgICAgICAgIGxpbmtfbGlicmFyaWVzKCR7V0FZTEFORF9DTElFTlRfTElCUkFSSUVTfSkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKQorICAgIGVsc2VpZihDVUJFX1dTSV9TRUxFQ1RJT04gU1RSRVFVQUwgIkRJU1BMQVkiKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fRElTUExBWV9LSFIpCisgICAgZWxzZSgpCisgICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVucmVjb2duaXplZCB2YWx1ZSBmb3IgQ1VCRV9XU0lfU0VMRUNUSU9OOiAke0NVQkVfV1NJX1NFTEVDVElPTn0iKQorICAgIGVuZGlmKCkKKworICAgIGxpbmtfbGlicmFyaWVzKCR7QVBJX0xPV0VSQ0FTRX0gbSkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuc3VwcG9ydGVkIFBsYXRmb3JtISIpCitlbmRpZigpCisKK3NldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IikKK3NldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSIpCisKK2lmKFdJTjMyKQorICAgICMgVXNlIHN0YXRpYyBNU1ZDUlQgbGlicmFyaWVzCisgICAgZm9yZWFjaChjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpbgorICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19ERUJVRworICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19NSU5TSVpFUkVMCisgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19ERUJVRworICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX01JTlNJWkVSRUwKKyAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFCisgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8pCisgICAgICAgIGlmKCR7Y29uZmlndXJhdGlvbn0gTUFUQ0hFUyAiL01EIikKKyAgICAgICAgICAgIHN0cmluZyhSRUdFWAorICAgICAgICAgICAgICAgICAgIFJFUExBQ0UgIi9NRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIvTVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbmZpZ3VyYXRpb259CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHske2NvbmZpZ3VyYXRpb259fSIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRmb3JlYWNoKCkKKworICAgIGZpbGUoQ09QWSBjdWJlLnZjeHByb2oudXNlciBERVNUSU5BVElPTiAke0NNQUtFX0JJTkFSWV9ESVJ9L2N1YmUpCitlbmRpZigpCisKK2FkZF9jdXN0b21fY29tbWFuZChDT01NRU5UICJDb21waWxpbmcgY3ViZSB2ZXJ0ZXggc2hhZGVyIgorICAgICAgICAgICAgICAgICAgIE9VVFBVVCBjdWJlLnZlcnQuaW5jCisgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0dMU0xBTkdfVkFMSURBVE9SfSAtViAteCAtbyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY3ViZS52ZXJ0LmluYworICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2N1YmUvY3ViZS52ZXJ0CisgICAgICAgICAgICAgICAgICAgTUFJTl9ERVBFTkRFTkNZICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jdWJlL2N1YmUudmVydAorICAgICAgICAgICAgICAgICAgIERFUEVORFMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2N1YmUvY3ViZS52ZXJ0ICR7R0xTTEFOR19WQUxJREFUT1J9KQorYWRkX2N1c3RvbV9jb21tYW5kKENPTU1FTlQgIkNvbXBpbGluZyBjdWJlIGZyYWdtZW50IHNoYWRlciIKKyAgICAgICAgICAgICAgICAgICBPVVRQVVQgY3ViZS5mcmFnLmluYworICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtHTFNMQU5HX1ZBTElEQVRPUn0gLVYgLXggLW8gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2N1YmUuZnJhZy5pbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jdWJlL2N1YmUuZnJhZworICAgICAgICAgICAgICAgICAgIE1BSU5fREVQRU5ERU5DWSAke1BST0pFQ1RfU09VUkNFX0RJUn0vY3ViZS9jdWJlLmZyYWcKKyAgICAgICAgICAgICAgICAgICBERVBFTkRTICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jdWJlL2N1YmUuZnJhZyAke0dMU0xBTkdfVkFMSURBVE9SfSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKworaWYoV0lOMzIpCisgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAtRF9VU0VfTUFUSF9ERUZJTkVTIikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAtRF9VU0VfTUFUSF9ERUZJTkVTIikKK2VuZGlmKCkKKworaW5jbHVkZV9kaXJlY3Rvcmllcygke0NVQkVfSU5DTFVERV9ESVJTfSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHZrY3ViZQorCitpZihBUFBMRSkKKyAgICBpbmNsdWRlKG1hY09TL2N1YmUvY3ViZS5jbWFrZSkKK2Vsc2VpZihOT1QgV0lOMzIpCisgICAgaWYoJHtDTUFLRV9TWVNURU1fUFJPQ0VTU09SfSBTVFJFUVVBTCAke0NNQUtFX0hPU1RfU1lTVEVNX1BST0NFU1NPUn0pCisgICAgICAgIGFkZF9leGVjdXRhYmxlKHZrY3ViZQorICAgICAgICAgICAgICAgICAgICAgICBjdWJlLmMKKyAgICAgICAgICAgICAgICAgICAgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2N1YmUvY3ViZS52ZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jdWJlL2N1YmUuZnJhZworICAgICAgICAgICAgICAgICAgICAgICBjdWJlLnZlcnQuaW5jCisgICAgICAgICAgICAgICAgICAgICAgIGN1YmUuZnJhZy5pbmMpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2a2N1YmUgVnVsa2FuOjpWdWxrYW4pCisgICAgICAgIENIRUNLX0xJQlJBUllfRVhJU1RTKCJydCIgY2xvY2tfZ2V0dGltZSAiIiBORUVEX1JUKQorICAgICAgICBpZiAoTkVFRF9SVCkKKyAgICAgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2a2N1YmUgcnQpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICBpZihDTUFLRV9DTF82NCkKKyAgICAgICAgc2V0KExJQl9ESVIgIldpbjY0IikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KExJQl9ESVIgIldpbjMyIikKKyAgICBlbmRpZigpCisKKyAgICBhZGRfZXhlY3V0YWJsZSh2a2N1YmUKKyAgICAgICAgICAgICAgICAgICBXSU4zMgorICAgICAgICAgICAgICAgICAgIGN1YmUuYworICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jdWJlL2N1YmUudmVydAorICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jdWJlL2N1YmUuZnJhZworICAgICAgICAgICAgICAgICAgIGN1YmUudmVydC5pbmMKKyAgICAgICAgICAgICAgICAgICBjdWJlLmZyYWcuaW5jKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2a2N1YmUgVnVsa2FuOjpWdWxrYW4pCitlbmRpZigpCisKK2lmKEFQUExFKQorICAgICMgS2VlcCBSUEFUSCBzbyBmaXh1cF9idW5kbGUgY2FuIHVzZSBpdCB0byBmaW5kIGxpYnJhcmllcworICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh2a2N1YmUgUFJPUEVSVElFUyBJTlNUQUxMX1JQQVRIX1VTRV9MSU5LX1BBVEggVFJVRSkKKyAgICBpbnN0YWxsKFRBUkdFVFMgdmtjdWJlIEJVTkRMRSBERVNUSU5BVElPTiAiY3ViZSIpCisgICAgIyBGaXggdXAgdGhlIGxpYnJhcnkgcmVmZXJlbmNlcyB0byBiZSBzZWxmLWNvbnRhaW5lZCB3aXRoaW4gdGhlIGJ1bmRsZS4KKyAgICBpbnN0YWxsKENPREUgIgorICAgICAgICBpbmNsdWRlKEJ1bmRsZVV0aWxpdGllcykKKyAgICAgICAgZml4dXBfYnVuZGxlKFwke0NNQUtFX0lOU1RBTExfUFJFRklYfS9jdWJlL3ZrY3ViZS5hcHAgXCJcIiBcIiR7VnVsa2FuX0xJQlJBUllfRElSfVwiKQorICAgICAgICAiKQorZWxzZSgpCisgICAgaW5zdGFsbChUQVJHRVRTIHZrY3ViZSBSVU5USU1FIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9CSU5ESVJ9KQorZW5kaWYoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdmtjdWJlcHAKKworaWYoQVBQTEUpCisgICAgaW5jbHVkZShtYWNPUy9jdWJlcHAvY3ViZXBwLmNtYWtlKQorZWxzZWlmKE5PVCBXSU4zMikKKyAgICBpZigke0NNQUtFX1NZU1RFTV9QUk9DRVNTT1J9IFNUUkVRVUFMICR7Q01BS0VfSE9TVF9TWVNURU1fUFJPQ0VTU09SfSkKKyAgICAgICAgYWRkX2V4ZWN1dGFibGUodmtjdWJlcHAKKyAgICAgICAgICAgICAgICAgICAgICAgY3ViZS5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2N1YmUvY3ViZS52ZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jdWJlL2N1YmUuZnJhZworICAgICAgICAgICAgICAgICAgICAgICBjdWJlLnZlcnQuaW5jCisgICAgICAgICAgICAgICAgICAgICAgIGN1YmUuZnJhZy5pbmMpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2a2N1YmVwcCBWdWxrYW46OlZ1bGthbikKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICBpZihDTUFLRV9DTF82NCkKKyAgICAgICAgc2V0KExJQl9ESVIgIldpbjY0IikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KExJQl9ESVIgIldpbjMyIikKKyAgICBlbmRpZigpCisKKyAgICBhZGRfZXhlY3V0YWJsZSh2a2N1YmVwcAorICAgICAgICAgICAgICAgICAgIFdJTjMyCisgICAgICAgICAgICAgICAgICAgY3ViZS5jcHAKKyAgICAgICAgICAgICAgICAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vY3ViZS9jdWJlLnZlcnQKKyAgICAgICAgICAgICAgICAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vY3ViZS9jdWJlLmZyYWcKKyAgICAgICAgICAgICAgICAgICBjdWJlLnZlcnQuaW5jCisgICAgICAgICAgICAgICAgICAgY3ViZS5mcmFnLmluYykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModmtjdWJlcHAgVnVsa2FuOjpWdWxrYW4pCitlbmRpZigpCisKK2lmKEFQUExFKQorICAgICMgS2VlcCBSUEFUSCBzbyBmaXh1cF9idW5kbGUgY2FuIHVzZSBpdCB0byBmaW5kIGxpYnJhcmllcworICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh2a2N1YmVwcCBQUk9QRVJUSUVTIElOU1RBTExfUlBBVEhfVVNFX0xJTktfUEFUSCBUUlVFKQorICAgIGluc3RhbGwoVEFSR0VUUyB2a2N1YmVwcCBCVU5ETEUgREVTVElOQVRJT04gImN1YmUiKQorICAgICMgRml4IHVwIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZXMgdG8gYmUgc2VsZi1jb250YWluZWQgd2l0aGluIHRoZSBidW5kbGUuCisgICAgaW5zdGFsbChDT0RFICIKKyAgICAgICAgaW5jbHVkZShCdW5kbGVVdGlsaXRpZXMpCisgICAgICAgIGZpeHVwX2J1bmRsZShcJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vY3ViZS92a2N1YmVwcC5hcHAgXCJcIiBcIiR7VnVsa2FuX0xJQlJBUllfRElSfVwiKQorICAgICAgICAiKQorZWxzZSgpCisgICAgaW5zdGFsbChUQVJHRVRTIHZrY3ViZXBwIFJVTlRJTUUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0JJTkRJUn0pCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvY3ViZS13aXRoLWxheWVycy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUtd2l0aC1sYXllcnMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIyMTZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUtd2l0aC1sYXllcnMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImNvbS5leGFtcGxlLlZrQ3ViZVdpdGhMYXllcnMiIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisKKyAgICA8IS0tIEFsbG93IHRoaXMgYXBwIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIChmb3IgdXNlIGJ5IHRyYWNpbmcgbGlicmFyaWVzKS4gLS0+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIi8+CisKKyAgICA8IS0tIFRoaXMgaXMgdGhlIHBsYXRmb3JtIEFQSSB3aGVyZSBOYXRpdmVBY3Rpdml0eSB3YXMgaW50cm9kdWNlZC4gLS0+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjMiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjMiLz4KKworICAgIDwhLS0gVGhpcyAuYXBrIGhhcyBubyBKYXZhIGNvZGUgaXRzZWxmLCBzbyBzZXQgaGFzQ29kZSB0byBmYWxzZS4gLS0+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIGFuZHJvaWQ6ZGVidWdnYWJsZT0ndHJ1ZSc+CisKKyAgICAgICAgPCEtLSBPdXIgYWN0aXZpdHkgaXMgdGhlIGJ1aWx0LWluIE5hdGl2ZUFjdGl2aXR5IGZyYW1ld29yayBjbGFzcy4KKyAgICAgICAgICAgICBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIGludGVncmF0aW5nIHdpdGggb3VyIE5ESyBjb2RlLiAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPCEtLSBUZWxsIE5hdGl2ZUFjdGl2aXR5IHRoZSBuYW1lIG9mIG9yIC5zbyAtLT4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5saWJfbmFtZSIgYW5kcm9pZDp2YWx1ZT0iVmtDdWJlIi8+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvY3ViZS13aXRoLWxheWVycy9jdXN0b21fcnVsZXMueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUtd2l0aC1sYXllcnMvY3VzdG9tX3J1bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E1OTMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUtd2l0aC1sYXllcnMvY3VzdG9tX3J1bGVzLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgbmFtZT0iTmF0aXZlQWN0aXZpdHkiIGRlZmF1bHQ9ImhlbHAiPgorCis8cHJvcGVydHkgbmFtZT0iY3ViZVdpdGhMYXllcnNEaXIiIGxvY2F0aW9uPSIuLi9saWJzLXdpdGgtbGF5ZXJzIiAvPgorPHByb3BlcnR5IG5hbWU9ImN1YmVEaXIiIGxvY2F0aW9uPSIuLi9saWJzIiAvPgorPHByb3BlcnR5IG5hbWU9ImxheWVyc0RpciIgbG9jYXRpb249Ii4uLy4uLy4uL2J1aWxkLWFuZHJvaWQvbGlicyIgLz4KKworPGVjaG8+VmtDdWJlV2l0aExheWVyczogQ3JlYXRpbmcgbGlicy13aXRoLWxheWVyczwvZWNobz4KKzxta2RpciBkaXI9IiR7Y3ViZVdpdGhMYXllcnNEaXJ9Ii8+CisKKzxlY2hvPlZrQ3ViZVdpdGhMYXllcnM6IENvcHlpbmcgbGlicyBmcm9tIGRlbW9zL2FuZHJvaWQ8L2VjaG8+Cis8Y29weSB0b2Rpcj0iJHtjdWJlV2l0aExheWVyc0Rpcn0iPgorPGZpbGVzZXQgZGlyPSIke2N1YmVEaXJ9Ii8+Cis8L2NvcHk+CisKKzxlY2hvPlZrQ3ViZVdpdGhMYXllcnM6IENvcHlpbmcgbGF5ZXJzIGZyb20gYnVpbGQtYW5kcm9pZDwvZWNobz4KKzxjb3B5IHRvZGlyPSIke2N1YmVXaXRoTGF5ZXJzRGlyfSI+Cis8ZmlsZXNldCBkaXI9IiR7bGF5ZXJzRGlyfSIvPgorPC9jb3B5PgorCis8IS0tIFBvaW50IG5kay1idWlsZCBhdCB0aGUgbGlicy13aXRoLWxheWVycyBjb21tb24gZGlyIC0tPgorPGVjaG8+VmtDdWJlV2l0aExheWVyczogT3ZlcnJpZGluZyBuYXRpdmUubGlicy5hYnNvbHV0ZS5kaXIgd2l0aCAke2N1YmVXaXRoTGF5ZXJzRGlyfTwvZWNobz4KKzxwcm9wZXJ0eSBuYW1lPSJuYXRpdmUubGlicy5hYnNvbHV0ZS5kaXIiIGxvY2F0aW9uPSIke2N1YmVXaXRoTGF5ZXJzRGlyfSIgLz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUtd2l0aC1sYXllcnMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9jdWJlLXdpdGgtbGF5ZXJzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkNzc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9jdWJlLXdpdGgtbGF5ZXJzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5Wa0N1YmVXaXRoTGF5ZXJzPC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9jdWJlL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmOTA4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9jdWJlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJjb20uZXhhbXBsZS5Wa0N1YmUiIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisKKyAgICA8IS0tIEFsbG93IHRoaXMgYXBwIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIChmb3IgdXNlIGJ5IHRyYWNpbmcgbGlicmFyaWVzKS4gLS0+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIi8+CisKKyAgICA8IS0tIFRoaXMgaXMgdGhlIHBsYXRmb3JtIEFQSSB3aGVyZSBOYXRpdmVBY3Rpdml0eSB3YXMgaW50cm9kdWNlZC4gLS0+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjMiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjMiLz4KKworICAgIDwhLS0gVGhpcyAuYXBrIGhhcyBubyBKYXZhIGNvZGUgaXRzZWxmLCBzbyBzZXQgaGFzQ29kZSB0byBmYWxzZS4gLS0+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIGFuZHJvaWQ6ZGVidWdnYWJsZT0ndHJ1ZSc+CisKKyAgICAgICAgPCEtLSBPdXIgYWN0aXZpdHkgaXMgdGhlIGJ1aWx0LWluIE5hdGl2ZUFjdGl2aXR5IGZyYW1ld29yayBjbGFzcy4KKyAgICAgICAgICAgICBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIGludGVncmF0aW5nIHdpdGggb3VyIE5ESyBjb2RlLiAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPCEtLSBUZWxsIE5hdGl2ZUFjdGl2aXR5IHRoZSBuYW1lIG9mIG9yIC5zbyAtLT4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5saWJfbmFtZSIgYW5kcm9pZDp2YWx1ZT0iVmtDdWJlIi8+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvY3ViZS9jdXN0b21fcnVsZXMueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUvY3VzdG9tX3J1bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWViMzFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUvY3VzdG9tX3J1bGVzLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJOYXRpdmVBY3Rpdml0eSIgZGVmYXVsdD0iaGVscCI+Cis8IS0tIFBvaW50IG5kay1idWlsZCBhdCB0aGUgbGlicyBjcmVhdGVkIGluIGNvbW1vbiBkaXIgLS0+Cis8ZWNobz52a2N1YmU6IE92ZXJyaWRpbmcgbmF0aXZlLmxpYnMuYWJzb2x1dGUuZGlyIHdpdGggLi4vbGliczwvZWNobz4KKzxwcm9wZXJ0eSBuYW1lPSJuYXRpdmUubGlicy5hYnNvbHV0ZS5kaXIiIGxvY2F0aW9uPSIuLi9saWJzIiAvPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2N1YmUvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9jdWJlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkZWFkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9jdWJlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5Wa0N1YmU8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvaW5jbHVkZS9jdWJlLmZyYWcuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9pbmNsdWRlL2N1YmUuZnJhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmZkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvaW5jbHVkZS9jdWJlLmZyYWcuaApAQCAtMCwwICsxLDczIEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZiAwCisuLi9jdWJlLmZyYWcKK1dhcm5pbmcsIHZlcnNpb24gNDAwIGlzIG5vdCB5ZXQgY29tcGxldGU7IG1vc3QgdmVyc2lvbi1zcGVjaWZpYyBmZWF0dXJlcyBhcmUgcHJlc2VudCwgYnV0IHNvbWUgYXJlIG1pc3NpbmcuCisKKworTGlua2VkIGZyYWdtZW50IHN0YWdlOgorCisKKy8vIE1vZHVsZSBWZXJzaW9uIDEwMDAwCisvLyBHZW5lcmF0ZWQgYnkgKG1hZ2ljIG51bWJlcik6IDgwMDAxCisvLyBJZCdzIGFyZSBib3VuZCBieSAyMQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5IFNoYWRlcgorICAgICAgICAgICAgICAgMTogICAgICAgICAgICAgRXh0SW5zdEltcG9ydCAgIkdMU0wuc3RkLjQ1MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeU1vZGVsIExvZ2ljYWwgR0xTTDQ1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnlQb2ludCBGcmFnbWVudCA0ICAibWFpbiIgOSAxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uTW9kZSA0IE9yaWdpblVwcGVyTGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIEdMU0wgNDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VFeHRlbnNpb24gICJHTF9BUkJfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VFeHRlbnNpb24gICJHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA0ICAibWFpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgOSAgInVGcmFnQ29sb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIDEzICAidGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAxNiAgInRleGNvb3JkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGUgOSh1RnJhZ0NvbG9yKSBMb2NhdGlvbiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZSAxMyh0ZXgpIERlc2NyaXB0b3JTZXQgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGUgMTModGV4KSBCaW5kaW5nIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlIDE2KHRleGNvb3JkKSBMb2NhdGlvbiAwCisgICAgICAgICAgICAgICAyOiAgICAgICAgICAgICBUeXBlVm9pZAorICAgICAgICAgICAgICAgMzogICAgICAgICAgICAgVHlwZUZ1bmN0aW9uIDIKKyAgICAgICAgICAgICAgIDY6ICAgICAgICAgICAgIFR5cGVGbG9hdCAzMgorICAgICAgICAgICAgICAgNzogICAgICAgICAgICAgVHlwZVZlY3RvciA2KGZsb2F0KSA0CisgICAgICAgICAgICAgICA4OiAgICAgICAgICAgICBUeXBlUG9pbnRlciBPdXRwdXQgNyhmdmVjNCkKKyAgIDkodUZyYWdDb2xvcik6ICAgICAgOChwdHIpIFZhcmlhYmxlIE91dHB1dAorICAgICAgICAgICAgICAxMDogICAgICAgICAgICAgVHlwZUltYWdlIDYoZmxvYXQpIDJEIHNhbXBsZWQgZm9ybWF0OlVua25vd24KKyAgICAgICAgICAgICAgMTE6ICAgICAgICAgICAgIFR5cGVTYW1wbGVkSW1hZ2UgMTAKKyAgICAgICAgICAgICAgMTI6ICAgICAgICAgICAgIFR5cGVQb2ludGVyIFVuaWZvcm1Db25zdGFudCAxMQorICAgICAgICAgMTModGV4KTogICAgIDEyKHB0cikgVmFyaWFibGUgVW5pZm9ybUNvbnN0YW50CisgICAgICAgICAgICAgIDE1OiAgICAgICAgICAgICBUeXBlUG9pbnRlciBJbnB1dCA3KGZ2ZWM0KQorICAgIDE2KHRleGNvb3JkKTogICAgIDE1KHB0cikgVmFyaWFibGUgSW5wdXQKKyAgICAgICAgICAgICAgMTc6ICAgICAgICAgICAgIFR5cGVWZWN0b3IgNihmbG9hdCkgMgorICAgICAgICAgNChtYWluKTogICAgICAgICAgIDIgRnVuY3Rpb24gTm9uZSAzCisgICAgICAgICAgICAgICA1OiAgICAgICAgICAgICBMYWJlbAorICAgICAgICAgICAgICAxNDogICAgICAgICAgMTEgTG9hZCAxMyh0ZXgpCisgICAgICAgICAgICAgIDE4OiAgICA3KGZ2ZWM0KSBMb2FkIDE2KHRleGNvb3JkKQorICAgICAgICAgICAgICAxOTogICAxNyhmdmVjMikgVmVjdG9yU2h1ZmZsZSAxOCAxOCAwIDEKKyAgICAgICAgICAgICAgMjA6ICAgIDcoZnZlYzQpIEltYWdlU2FtcGxlSW1wbGljaXRMb2QgMTQgMTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIDkodUZyYWdDb2xvcikgMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25FbmQKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDMyX3QgY3ViZV9mcmFnWzE2NF0gPSB7CisgICAgMHgwNzIzMDIwMywgMHgwMDAxMDAwMCwgMHgwMDA4MDAwMSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAwMCwgMHgwMDAyMDAxMSwgMHgwMDAwMDAwMSwgMHgwMDA2MDAwYiwgMHgwMDAwMDAwMSwgMHg0YzUzNGM0NywKKyAgICAweDY0NzQ3MzJlLCAweDMwMzUzNDJlLCAweDAwMDAwMDAwLCAweDAwMDMwMDBlLCAweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDcwMDBmLCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDZlNjk2MTZkLAorICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDksIDB4MDAwMDAwMTAsIDB4MDAwMzAwMTAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDcsIDB4MDAwMzAwMDMsIDB4MDAwMDAwMDIsIDB4MDAwMDAxOTAsIDB4MDAwOTAwMDQsCisgICAgMHg0MTVmNGM0NywgMHg3MzVmNDI1MiwgMHg3MjYxNzA2NSwgMHg1ZjY1NzQ2MSwgMHg2NDYxNjg3MywgMHg2ZjVmNzI2NSwgMHg2MzY1NmE2MiwgMHgwMDAwNzM3NCwgMHgwMDA5MDAwNCwgMHg0MTVmNGM0NywKKyAgICAweDczNWY0MjUyLCAweDY5NjQ2MTY4LCAweDZjNWY2NzZlLCAweDc1Njc2ZTYxLCAweDVmNjU2NzYxLCAweDcwMzAzMjM0LCAweDAwNmI2MzYxLCAweDAwMDQwMDA1LCAweDAwMDAwMDA0LCAweDZlNjk2MTZkLAorICAgIDB4MDAwMDAwMDAsIDB4MDAwNTAwMDUsIDB4MDAwMDAwMDksIDB4NjE3MjQ2NzUsIDB4NmM2ZjQzNjcsIDB4MDAwMDcyNmYsIDB4MDAwMzAwMDUsIDB4MDAwMDAwMGQsIDB4MDA3ODY1NzQsIDB4MDAwNTAwMDUsCisgICAgMHgwMDAwMDAxMCwgMHg2Mzc4NjU3NCwgMHg2NDcyNmY2ZiwgMHgwMDAwMDAwMCwgMHgwMDA0MDA0NywgMHgwMDAwMDAwOSwgMHgwMDAwMDAxZSwgMHgwMDAwMDAwMCwgMHgwMDA0MDA0NywgMHgwMDAwMDAwZCwKKyAgICAweDAwMDAwMDIyLCAweDAwMDAwMDAwLCAweDAwMDQwMDQ3LCAweDAwMDAwMDBkLCAweDAwMDAwMDIxLCAweDAwMDAwMDAxLCAweDAwMDQwMDQ3LCAweDAwMDAwMDEwLCAweDAwMDAwMDFlLCAweDAwMDAwMDAwLAorICAgIDB4MDAwMjAwMTMsIDB4MDAwMDAwMDIsIDB4MDAwMzAwMjEsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDIsIDB4MDAwMzAwMTYsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMjAsIDB4MDAwNDAwMTcsIDB4MDAwMDAwMDcsCisgICAgMHgwMDAwMDAwNiwgMHgwMDAwMDAwNCwgMHgwMDA0MDAyMCwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwMywgMHgwMDAwMDAwNywgMHgwMDA0MDAzYiwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwOSwgMHgwMDAwMDAwMywKKyAgICAweDAwMDkwMDE5LCAweDAwMDAwMDBhLCAweDAwMDAwMDA2LCAweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDMwMDFiLAorICAgIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGEsIDB4MDAwNDAwMjAsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGIsIDB4MDAwNDAwM2IsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsCisgICAgMHgwMDA0MDAyMCwgMHgwMDAwMDAwZiwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwNywgMHgwMDA0MDAzYiwgMHgwMDAwMDAwZiwgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMSwgMHgwMDA0MDAxNywgMHgwMDAwMDAxMSwKKyAgICAweDAwMDAwMDA2LCAweDAwMDAwMDAyLCAweDAwMDUwMDM2LCAweDAwMDAwMDAyLCAweDAwMDAwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAzLCAweDAwMDIwMGY4LCAweDAwMDAwMDA1LCAweDAwMDQwMDNkLAorICAgIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGQsIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMTAsIDB4MDAwNzAwNGYsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMTMsCisgICAgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgMHgwMDA1MDA1NywgMHgwMDAwMDAwNywgMHgwMDAwMDAxNCwgMHgwMDAwMDAwZSwgMHgwMDAwMDAxMywgMHgwMDAzMDAzZSwKKyAgICAweDAwMDAwMDA5LCAweDAwMDAwMDE0LCAweDAwMDEwMGZkLCAweDAwMDEwMDM4LAorfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9pbmNsdWRlL2N1YmUuZnJhZy5pbmMgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvaW5jbHVkZS9jdWJlLmZyYWcuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGFkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvaW5jbHVkZS9jdWJlLmZyYWcuaW5jCkBAIC0wLDAgKzEsMjIgQEAKKwkvLyBPdmVybG9hZDQwMC1QcmVjUXVhbC4yMDAwIDEyLUFwci0yMDE3CisJMHgwNzIzMDIwMywweDAwMDEwMDAwLDB4MDAwODAwMDIsMHgwMDAwMDAxNSwweDAwMDAwMDAwLDB4MDAwMjAwMTEsMHgwMDAwMDAwMSwweDAwMDYwMDBiLAorCTB4MDAwMDAwMDEsMHg0YzUzNGM0NywweDY0NzQ3MzJlLDB4MzAzNTM0MmUsMHgwMDAwMDAwMCwweDAwMDMwMDBlLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwKKwkweDAwMDcwMDBmLDB4MDAwMDAwMDQsMHgwMDAwMDAwNCwweDZlNjk2MTZkLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDEwLDB4MDAwMzAwMTAsCisJMHgwMDAwMDAwNCwweDAwMDAwMDA3LDB4MDAwMzAwMDMsMHgwMDAwMDAwMiwweDAwMDAwMTkwLDB4MDAwOTAwMDQsMHg0MTVmNGM0NywweDczNWY0MjUyLAorCTB4NzI2MTcwNjUsMHg1ZjY1NzQ2MSwweDY0NjE2ODczLDB4NmY1ZjcyNjUsMHg2MzY1NmE2MiwweDAwMDA3Mzc0LDB4MDAwOTAwMDQsMHg0MTVmNGM0NywKKwkweDczNWY0MjUyLDB4Njk2NDYxNjgsMHg2YzVmNjc2ZSwweDc1Njc2ZTYxLDB4NWY2NTY3NjEsMHg3MDMwMzIzNCwweDAwNmI2MzYxLDB4MDAwNDAwMDUsCisJMHgwMDAwMDAwNCwweDZlNjk2MTZkLDB4MDAwMDAwMDAsMHgwMDA1MDAwNSwweDAwMDAwMDA5LDB4NjE3MjQ2NzUsMHg2YzZmNDM2NywweDAwMDA3MjZmLAorCTB4MDAwMzAwMDUsMHgwMDAwMDAwZCwweDAwNzg2NTc0LDB4MDAwNTAwMDUsMHgwMDAwMDAxMCwweDYzNzg2NTc0LDB4NjQ3MjZmNmYsMHgwMDAwMDAwMCwKKwkweDAwMDQwMDQ3LDB4MDAwMDAwMDksMHgwMDAwMDAxZSwweDAwMDAwMDAwLDB4MDAwNDAwNDcsMHgwMDAwMDAwZCwweDAwMDAwMDIyLDB4MDAwMDAwMDAsCisJMHgwMDA0MDA0NywweDAwMDAwMDBkLDB4MDAwMDAwMjEsMHgwMDAwMDAwMSwweDAwMDQwMDQ3LDB4MDAwMDAwMTAsMHgwMDAwMDAxZSwweDAwMDAwMDAwLAorCTB4MDAwMjAwMTMsMHgwMDAwMDAwMiwweDAwMDMwMDIxLDB4MDAwMDAwMDMsMHgwMDAwMDAwMiwweDAwMDMwMDE2LDB4MDAwMDAwMDYsMHgwMDAwMDAyMCwKKwkweDAwMDQwMDE3LDB4MDAwMDAwMDcsMHgwMDAwMDAwNiwweDAwMDAwMDA0LDB4MDAwNDAwMjAsMHgwMDAwMDAwOCwweDAwMDAwMDAzLDB4MDAwMDAwMDcsCisJMHgwMDA0MDAzYiwweDAwMDAwMDA4LDB4MDAwMDAwMDksMHgwMDAwMDAwMywweDAwMDkwMDE5LDB4MDAwMDAwMGEsMHgwMDAwMDAwNiwweDAwMDAwMDAxLAorCTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweDAwMDMwMDFiLDB4MDAwMDAwMGIsMHgwMDAwMDAwYSwKKwkweDAwMDQwMDIwLDB4MDAwMDAwMGMsMHgwMDAwMDAwMCwweDAwMDAwMDBiLDB4MDAwNDAwM2IsMHgwMDAwMDAwYywweDAwMDAwMDBkLDB4MDAwMDAwMDAsCisJMHgwMDA0MDAyMCwweDAwMDAwMDBmLDB4MDAwMDAwMDEsMHgwMDAwMDAwNywweDAwMDQwMDNiLDB4MDAwMDAwMGYsMHgwMDAwMDAxMCwweDAwMDAwMDAxLAorCTB4MDAwNDAwMTcsMHgwMDAwMDAxMSwweDAwMDAwMDA2LDB4MDAwMDAwMDIsMHgwMDA1MDAzNiwweDAwMDAwMDAyLDB4MDAwMDAwMDQsMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAzLDB4MDAwMjAwZjgsMHgwMDAwMDAwNSwweDAwMDQwMDNkLDB4MDAwMDAwMGIsMHgwMDAwMDAwZSwweDAwMDAwMDBkLDB4MDAwNDAwM2QsCisJMHgwMDAwMDAwNywweDAwMDAwMDEyLDB4MDAwMDAwMTAsMHgwMDA3MDA0ZiwweDAwMDAwMDExLDB4MDAwMDAwMTMsMHgwMDAwMDAxMiwweDAwMDAwMDEyLAorCTB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDUwMDU3LDB4MDAwMDAwMDcsMHgwMDAwMDAxNCwweDAwMDAwMDBlLDB4MDAwMDAwMTMsMHgwMDAzMDAzZSwKKwkweDAwMDAwMDA5LDB4MDAwMDAwMTQsMHgwMDAxMDBmZCwweDAwMDEwMDM4CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvaW5jbHVkZS9jdWJlLnZlcnQuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9pbmNsdWRlL2N1YmUudmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzQ5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvaW5jbHVkZS9jdWJlLnZlcnQuaApAQCAtMCwwICsxLDE0OSBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgMAorLi4vY3ViZS52ZXJ0CitXYXJuaW5nLCB2ZXJzaW9uIDQwMCBpcyBub3QgeWV0IGNvbXBsZXRlOyBtb3N0IHZlcnNpb24tc3BlY2lmaWMgZmVhdHVyZXMgYXJlIHByZXNlbnQsIGJ1dCBzb21lIGFyZSBtaXNzaW5nLgorCisKK0xpbmtlZCB2ZXJ0ZXggc3RhZ2U6CisKKworLy8gTW9kdWxlIFZlcnNpb24gMTAwMDAKKy8vIEdlbmVyYXRlZCBieSAobWFnaWMgbnVtYmVyKTogODAwMDEKKy8vIElkJ3MgYXJlIGJvdW5kIGJ5IDU1CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHkgU2hhZGVyCisgICAgICAgICAgICAgICAxOiAgICAgICAgICAgICBFeHRJbnN0SW1wb3J0ICAiR0xTTC5zdGQuNDUwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5TW9kZWwgTG9naWNhbCBHTFNMNDUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeVBvaW50IFZlcnRleCA0ICAibWFpbiIgOSAyMSAyOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIEdMU0wgNDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VFeHRlbnNpb24gICJHTF9BUkJfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VFeHRlbnNpb24gICJHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA0ICAibWFpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgOSAgInRleGNvb3JkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAxNSAgImJ1ZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlck5hbWUgMTUoYnVmKSAwICAiTVZQIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyTmFtZSAxNShidWYpIDEgICJwb3NpdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlck5hbWUgMTUoYnVmKSAyICAiYXR0ciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgMTcgICJ1YnVmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAyMSAgImdsX1ZlcnRleEluZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAyNiAgImdsX1BlclZlcnRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlck5hbWUgMjYoZ2xfUGVyVmVydGV4KSAwICAiZ2xfUG9zaXRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIDI4ICAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGUgOSh0ZXhjb29yZCkgTG9jYXRpb24gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGUgMTMgQXJyYXlTdHJpZGUgMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlIDE0IEFycmF5U3RyaWRlIDE2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJEZWNvcmF0ZSAxNShidWYpIDAgQ29sTWFqb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlckRlY29yYXRlIDE1KGJ1ZikgMCBPZmZzZXQgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyRGVjb3JhdGUgMTUoYnVmKSAwIE1hdHJpeFN0cmlkZSAxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyRGVjb3JhdGUgMTUoYnVmKSAxIE9mZnNldCA2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyRGVjb3JhdGUgMTUoYnVmKSAyIE9mZnNldCA2NDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlIDE1KGJ1ZikgQmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlIDE3KHVidWYpIERlc2NyaXB0b3JTZXQgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGUgMTcodWJ1ZikgQmluZGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZSAyMShnbF9WZXJ0ZXhJbmRleCkgQnVpbHRJbiBWZXJ0ZXhJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyRGVjb3JhdGUgMjYoZ2xfUGVyVmVydGV4KSAwIEJ1aWx0SW4gUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlIDI2KGdsX1BlclZlcnRleCkgQmxvY2sKKyAgICAgICAgICAgICAgIDI6ICAgICAgICAgICAgIFR5cGVWb2lkCisgICAgICAgICAgICAgICAzOiAgICAgICAgICAgICBUeXBlRnVuY3Rpb24gMgorICAgICAgICAgICAgICAgNjogICAgICAgICAgICAgVHlwZUZsb2F0IDMyCisgICAgICAgICAgICAgICA3OiAgICAgICAgICAgICBUeXBlVmVjdG9yIDYoZmxvYXQpIDQKKyAgICAgICAgICAgICAgIDg6ICAgICAgICAgICAgIFR5cGVQb2ludGVyIE91dHB1dCA3KGZ2ZWM0KQorICAgICA5KHRleGNvb3JkKTogICAgICA4KHB0cikgVmFyaWFibGUgT3V0cHV0CisgICAgICAgICAgICAgIDEwOiAgICAgICAgICAgICBUeXBlTWF0cml4IDcoZnZlYzQpIDQKKyAgICAgICAgICAgICAgMTE6ICAgICAgICAgICAgIFR5cGVJbnQgMzIgMAorICAgICAgICAgICAgICAxMjogICAgIDExKGludCkgQ29uc3RhbnQgMzYKKyAgICAgICAgICAgICAgMTM6ICAgICAgICAgICAgIFR5cGVBcnJheSA3KGZ2ZWM0KSAxMgorICAgICAgICAgICAgICAxNDogICAgICAgICAgICAgVHlwZUFycmF5IDcoZnZlYzQpIDEyCisgICAgICAgICAxNShidWYpOiAgICAgICAgICAgICBUeXBlU3RydWN0IDEwIDEzIDE0CisgICAgICAgICAgICAgIDE2OiAgICAgICAgICAgICBUeXBlUG9pbnRlciBVbmlmb3JtIDE1KGJ1ZikKKyAgICAgICAgMTcodWJ1Zik6ICAgICAxNihwdHIpIFZhcmlhYmxlIFVuaWZvcm0KKyAgICAgICAgICAgICAgMTg6ICAgICAgICAgICAgIFR5cGVJbnQgMzIgMQorICAgICAgICAgICAgICAxOTogICAgIDE4KGludCkgQ29uc3RhbnQgMgorICAgICAgICAgICAgICAyMDogICAgICAgICAgICAgVHlwZVBvaW50ZXIgSW5wdXQgMTgoaW50KQorMjEoZ2xfVmVydGV4SW5kZXgpOiAgICAgMjAocHRyKSBWYXJpYWJsZSBJbnB1dAorICAgICAgICAgICAgICAyMzogICAgICAgICAgICAgVHlwZVBvaW50ZXIgVW5pZm9ybSA3KGZ2ZWM0KQorMjYoZ2xfUGVyVmVydGV4KTogICAgICAgICAgICAgVHlwZVN0cnVjdCA3KGZ2ZWM0KQorICAgICAgICAgICAgICAyNzogICAgICAgICAgICAgVHlwZVBvaW50ZXIgT3V0cHV0IDI2KGdsX1BlclZlcnRleCkKKyAgICAgICAgICAgICAgMjg6ICAgICAyNyhwdHIpIFZhcmlhYmxlIE91dHB1dAorICAgICAgICAgICAgICAyOTogICAgIDE4KGludCkgQ29uc3RhbnQgMAorICAgICAgICAgICAgICAzMDogICAgICAgICAgICAgVHlwZVBvaW50ZXIgVW5pZm9ybSAxMAorICAgICAgICAgICAgICAzMzogICAgIDE4KGludCkgQ29uc3RhbnQgMQorICAgICAgICAgICAgICAzOTogICAgIDExKGludCkgQ29uc3RhbnQgMQorICAgICAgICAgICAgICA0MDogICAgICAgICAgICAgVHlwZVBvaW50ZXIgT3V0cHV0IDYoZmxvYXQpCisgICAgICAgICAgICAgIDQ1OiAgICAgMTEoaW50KSBDb25zdGFudCAyCisgICAgICAgICAgICAgIDQ4OiAgICAgMTEoaW50KSBDb25zdGFudCAzCisgICAgICAgICAgICAgIDUyOiAgICA2KGZsb2F0KSBDb25zdGFudCAxMDczNzQxODI0CisgICAgICAgICA0KG1haW4pOiAgICAgICAgICAgMiBGdW5jdGlvbiBOb25lIDMKKyAgICAgICAgICAgICAgIDU6ICAgICAgICAgICAgIExhYmVsCisgICAgICAgICAgICAgIDIyOiAgICAgMTgoaW50KSBMb2FkIDIxKGdsX1ZlcnRleEluZGV4KQorICAgICAgICAgICAgICAyNDogICAgIDIzKHB0cikgQWNjZXNzQ2hhaW4gMTcodWJ1ZikgMTkgMjIKKyAgICAgICAgICAgICAgMjU6ICAgIDcoZnZlYzQpIExvYWQgMjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIDkodGV4Y29vcmQpIDI1CisgICAgICAgICAgICAgIDMxOiAgICAgMzAocHRyKSBBY2Nlc3NDaGFpbiAxNyh1YnVmKSAyOQorICAgICAgICAgICAgICAzMjogICAgICAgICAgMTAgTG9hZCAzMQorICAgICAgICAgICAgICAzNDogICAgIDE4KGludCkgTG9hZCAyMShnbF9WZXJ0ZXhJbmRleCkKKyAgICAgICAgICAgICAgMzU6ICAgICAyMyhwdHIpIEFjY2Vzc0NoYWluIDE3KHVidWYpIDMzIDM0CisgICAgICAgICAgICAgIDM2OiAgICA3KGZ2ZWM0KSBMb2FkIDM1CisgICAgICAgICAgICAgIDM3OiAgICA3KGZ2ZWM0KSBNYXRyaXhUaW1lc1ZlY3RvciAzMiAzNgorICAgICAgICAgICAgICAzODogICAgICA4KHB0cikgQWNjZXNzQ2hhaW4gMjggMjkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIDM4IDM3CisgICAgICAgICAgICAgIDQxOiAgICAgNDAocHRyKSBBY2Nlc3NDaGFpbiAyOCAyOSAzOQorICAgICAgICAgICAgICA0MjogICAgNihmbG9hdCkgTG9hZCA0MQorICAgICAgICAgICAgICA0MzogICAgNihmbG9hdCkgRk5lZ2F0ZSA0MgorICAgICAgICAgICAgICA0NDogICAgIDQwKHB0cikgQWNjZXNzQ2hhaW4gMjggMjkgMzkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIDQ0IDQzCisgICAgICAgICAgICAgIDQ2OiAgICAgNDAocHRyKSBBY2Nlc3NDaGFpbiAyOCAyOSA0NQorICAgICAgICAgICAgICA0NzogICAgNihmbG9hdCkgTG9hZCA0NgorICAgICAgICAgICAgICA0OTogICAgIDQwKHB0cikgQWNjZXNzQ2hhaW4gMjggMjkgNDgKKyAgICAgICAgICAgICAgNTA6ICAgIDYoZmxvYXQpIExvYWQgNDkKKyAgICAgICAgICAgICAgNTE6ICAgIDYoZmxvYXQpIEZBZGQgNDcgNTAKKyAgICAgICAgICAgICAgNTM6ICAgIDYoZmxvYXQpIEZEaXYgNTEgNTIKKyAgICAgICAgICAgICAgNTQ6ICAgICA0MChwdHIpIEFjY2Vzc0NoYWluIDI4IDI5IDQ1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZSA1NCA1MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkVuZAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjdWJlX3ZlcnRbMzk2XSA9IHsKKyAgICAweDA3MjMwMjAzLCAweDAwMDEwMDAwLCAweDAwMDgwMDAxLCAweDAwMDAwMDM3LCAweDAwMDAwMDAwLCAweDAwMDIwMDExLCAweDAwMDAwMDAxLCAweDAwMDYwMDBiLCAweDAwMDAwMDAxLCAweDRjNTM0YzQ3LAorICAgIDB4NjQ3NDczMmUsIDB4MzAzNTM0MmUsIDB4MDAwMDAwMDAsIDB4MDAwMzAwMGUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIDB4MDAwODAwMGYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDQsIDB4NmU2OTYxNmQsCisgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwOSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxYywgMHgwMDAzMDAwMywgMHgwMDAwMDAwMiwgMHgwMDAwMDE5MCwgMHgwMDA5MDAwNCwgMHg0MTVmNGM0NywgMHg3MzVmNDI1MiwKKyAgICAweDcyNjE3MDY1LCAweDVmNjU3NDYxLCAweDY0NjE2ODczLCAweDZmNWY3MjY1LCAweDYzNjU2YTYyLCAweDAwMDA3Mzc0LCAweDAwMDkwMDA0LCAweDQxNWY0YzQ3LCAweDczNWY0MjUyLCAweDY5NjQ2MTY4LAorICAgIDB4NmM1ZjY3NmUsIDB4NzU2NzZlNjEsIDB4NWY2NTY3NjEsIDB4NzAzMDMyMzQsIDB4MDA2YjYzNjEsIDB4MDAwNDAwMDUsIDB4MDAwMDAwMDQsIDB4NmU2OTYxNmQsIDB4MDAwMDAwMDAsIDB4MDAwNTAwMDUsCisgICAgMHgwMDAwMDAwOSwgMHg2Mzc4NjU3NCwgMHg2NDcyNmY2ZiwgMHgwMDAwMDAwMCwgMHgwMDAzMDAwNSwgMHgwMDAwMDAwZiwgMHgwMDY2NzU2MiwgMHgwMDA0MDAwNiwgMHgwMDAwMDAwZiwgMHgwMDAwMDAwMCwKKyAgICAweDAwNTA1NjRkLCAweDAwMDYwMDA2LCAweDAwMDAwMDBmLCAweDAwMDAwMDAxLCAweDY5NzM2ZjcwLCAweDZlNmY2OTc0LCAweDAwMDAwMDAwLCAweDAwMDUwMDA2LCAweDAwMDAwMDBmLCAweDAwMDAwMDAyLAorICAgIDB4NzI3NDc0NjEsIDB4MDAwMDAwMDAsIDB4MDAwNDAwMDUsIDB4MDAwMDAwMTEsIDB4NjY3NTYyNzUsIDB4MDAwMDAwMDAsIDB4MDAwNjAwMDUsIDB4MDAwMDAwMTUsIDB4NTY1ZjZjNjcsIDB4NjU3NDcyNjUsCisgICAgMHg2NDZlNDk3OCwgMHgwMDAwNzg2NSwgMHgwMDA2MDAwNSwgMHgwMDAwMDAxYSwgMHg1MDVmNmM2NywgMHg2NTU2NzI2NSwgMHg3ODY1NzQ3MiwgMHgwMDAwMDAwMCwgMHgwMDA2MDAwNiwgMHgwMDAwMDAxYSwKKyAgICAweDAwMDAwMDAwLCAweDUwNWY2YzY3LCAweDc0Njk3MzZmLCAweDAwNmU2ZjY5LCAweDAwMDMwMDA1LCAweDAwMDAwMDFjLCAweDAwMDAwMDAwLCAweDAwMDQwMDQ3LCAweDAwMDAwMDA5LCAweDAwMDAwMDFlLAorICAgIDB4MDAwMDAwMDAsIDB4MDAwNDAwNDcsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMTAsIDB4MDAwNDAwNDcsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMTAsIDB4MDAwNDAwNDgsCisgICAgMHgwMDAwMDAwZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNSwgMHgwMDA1MDA0OCwgMHgwMDAwMDAwZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAyMywgMHgwMDAwMDAwMCwgMHgwMDA1MDA0OCwgMHgwMDAwMDAwZiwKKyAgICAweDAwMDAwMDAwLCAweDAwMDAwMDA3LCAweDAwMDAwMDEwLCAweDAwMDUwMDQ4LCAweDAwMDAwMDBmLCAweDAwMDAwMDAxLCAweDAwMDAwMDIzLCAweDAwMDAwMDQwLCAweDAwMDUwMDQ4LCAweDAwMDAwMDBmLAorICAgIDB4MDAwMDAwMDIsIDB4MDAwMDAwMjMsIDB4MDAwMDAyODAsIDB4MDAwMzAwNDcsIDB4MDAwMDAwMGYsIDB4MDAwMDAwMDIsIDB4MDAwNDAwNDcsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMjIsIDB4MDAwMDAwMDAsCisgICAgMHgwMDA0MDA0NywgMHgwMDAwMDAxMSwgMHgwMDAwMDAyMSwgMHgwMDAwMDAwMCwgMHgwMDA0MDA0NywgMHgwMDAwMDAxNSwgMHgwMDAwMDAwYiwgMHgwMDAwMDAyYSwgMHgwMDA1MDA0OCwgMHgwMDAwMDAxYSwKKyAgICAweDAwMDAwMDAwLCAweDAwMDAwMDBiLCAweDAwMDAwMDAwLCAweDAwMDMwMDQ3LCAweDAwMDAwMDFhLCAweDAwMDAwMDAyLCAweDAwMDIwMDEzLCAweDAwMDAwMDAyLCAweDAwMDMwMDIxLCAweDAwMDAwMDAzLAorICAgIDB4MDAwMDAwMDIsIDB4MDAwMzAwMTYsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMjAsIDB4MDAwNDAwMTcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDQsIDB4MDAwNDAwMjAsIDB4MDAwMDAwMDgsCisgICAgMHgwMDAwMDAwMywgMHgwMDAwMDAwNywgMHgwMDA0MDAzYiwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwOSwgMHgwMDAwMDAwMywgMHgwMDA0MDAxOCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNCwKKyAgICAweDAwMDQwMDE1LCAweDAwMDAwMDBiLCAweDAwMDAwMDIwLCAweDAwMDAwMDAwLCAweDAwMDQwMDJiLCAweDAwMDAwMDBiLCAweDAwMDAwMDBjLCAweDAwMDAwMDI0LCAweDAwMDQwMDFjLCAweDAwMDAwMDBkLAorICAgIDB4MDAwMDAwMDcsIDB4MDAwMDAwMGMsIDB4MDAwNDAwMWMsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMGMsIDB4MDAwNTAwMWUsIDB4MDAwMDAwMGYsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMGQsCisgICAgMHgwMDAwMDAwZSwgMHgwMDA0MDAyMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwZiwgMHgwMDA0MDAzYiwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMSwgMHgwMDAwMDAwMiwgMHgwMDA0MDAxNSwKKyAgICAweDAwMDAwMDEyLCAweDAwMDAwMDIwLCAweDAwMDAwMDAxLCAweDAwMDQwMDJiLCAweDAwMDAwMDEyLCAweDAwMDAwMDEzLCAweDAwMDAwMDAyLCAweDAwMDQwMDIwLCAweDAwMDAwMDE0LCAweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMTIsIDB4MDAwNDAwM2IsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMDEsIDB4MDAwNDAwMjAsIDB4MDAwMDAwMTcsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDcsIDB4MDAwMzAwMWUsCisgICAgMHgwMDAwMDAxYSwgMHgwMDAwMDAwNywgMHgwMDA0MDAyMCwgMHgwMDAwMDAxYiwgMHgwMDAwMDAwMywgMHgwMDAwMDAxYSwgMHgwMDA0MDAzYiwgMHgwMDAwMDAxYiwgMHgwMDAwMDAxYywgMHgwMDAwMDAwMywKKyAgICAweDAwMDQwMDJiLCAweDAwMDAwMDEyLCAweDAwMDAwMDFkLCAweDAwMDAwMDAwLCAweDAwMDQwMDIwLCAweDAwMDAwMDFlLCAweDAwMDAwMDAyLCAweDAwMDAwMDBhLCAweDAwMDQwMDJiLCAweDAwMDAwMDEyLAorICAgIDB4MDAwMDAwMjEsIDB4MDAwMDAwMDEsIDB4MDAwNDAwMmIsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMjcsIDB4MDAwMDAwMDEsIDB4MDAwNDAwMjAsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDYsCisgICAgMHgwMDA0MDAyYiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAyZCwgMHgwMDAwMDAwMiwgMHgwMDA0MDAyYiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAzMCwgMHgwMDAwMDAwMywgMHgwMDA0MDAyYiwgMHgwMDAwMDAwNiwKKyAgICAweDAwMDAwMDM0LCAweDQwMDAwMDAwLCAweDAwMDUwMDM2LCAweDAwMDAwMDAyLCAweDAwMDAwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAzLCAweDAwMDIwMGY4LCAweDAwMDAwMDA1LCAweDAwMDQwMDNkLAorICAgIDB4MDAwMDAwMTIsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMTUsIDB4MDAwNjAwNDEsIDB4MDAwMDAwMTcsIDB4MDAwMDAwMTgsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMTYsIDB4MDAwNDAwM2QsCisgICAgMHgwMDAwMDAwNywgMHgwMDAwMDAxOSwgMHgwMDAwMDAxOCwgMHgwMDAzMDAzZSwgMHgwMDAwMDAwOSwgMHgwMDAwMDAxOSwgMHgwMDA1MDA0MSwgMHgwMDAwMDAxZSwgMHgwMDAwMDAxZiwgMHgwMDAwMDAxMSwKKyAgICAweDAwMDAwMDFkLCAweDAwMDQwMDNkLCAweDAwMDAwMDBhLCAweDAwMDAwMDIwLCAweDAwMDAwMDFmLCAweDAwMDQwMDNkLCAweDAwMDAwMDEyLCAweDAwMDAwMDIyLCAweDAwMDAwMDE1LCAweDAwMDYwMDQxLAorICAgIDB4MDAwMDAwMTcsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMjIsIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMjQsIDB4MDAwMDAwMjMsIDB4MDAwNTAwOTEsCisgICAgMHgwMDAwMDAwNywgMHgwMDAwMDAyNSwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyNCwgMHgwMDA1MDA0MSwgMHgwMDAwMDAwOCwgMHgwMDAwMDAyNiwgMHgwMDAwMDAxYywgMHgwMDAwMDAxZCwgMHgwMDAzMDAzZSwKKyAgICAweDAwMDAwMDI2LCAweDAwMDAwMDI1LCAweDAwMDYwMDQxLCAweDAwMDAwMDI4LCAweDAwMDAwMDI5LCAweDAwMDAwMDFjLCAweDAwMDAwMDFkLCAweDAwMDAwMDI3LCAweDAwMDQwMDNkLCAweDAwMDAwMDA2LAorICAgIDB4MDAwMDAwMmEsIDB4MDAwMDAwMjksIDB4MDAwNDAwN2YsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMmIsIDB4MDAwMDAwMmEsIDB4MDAwNjAwNDEsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMmMsIDB4MDAwMDAwMWMsCisgICAgMHgwMDAwMDAxZCwgMHgwMDAwMDAyNywgMHgwMDAzMDAzZSwgMHgwMDAwMDAyYywgMHgwMDAwMDAyYiwgMHgwMDA2MDA0MSwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyZSwgMHgwMDAwMDAxYywgMHgwMDAwMDAxZCwKKyAgICAweDAwMDAwMDJkLCAweDAwMDQwMDNkLCAweDAwMDAwMDA2LCAweDAwMDAwMDJmLCAweDAwMDAwMDJlLCAweDAwMDYwMDQxLCAweDAwMDAwMDI4LCAweDAwMDAwMDMxLCAweDAwMDAwMDFjLCAweDAwMDAwMDFkLAorICAgIDB4MDAwMDAwMzAsIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMzIsIDB4MDAwMDAwMzEsIDB4MDAwNTAwODEsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMzMsIDB4MDAwMDAwMmYsIDB4MDAwMDAwMzIsCisgICAgMHgwMDA1MDA4OCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzMywgMHgwMDAwMDAzNCwgMHgwMDA2MDA0MSwgMHgwMDAwMDAyOCwgMHgwMDAwMDAzNiwgMHgwMDAwMDAxYywgMHgwMDAwMDAxZCwKKyAgICAweDAwMDAwMDJkLCAweDAwMDMwMDNlLCAweDAwMDAwMDM2LCAweDAwMDAwMDM1LCAweDAwMDEwMGZkLCAweDAwMDEwMDM4LAorfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9pbmNsdWRlL2N1YmUudmVydC5pbmMgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvaW5jbHVkZS9jdWJlLnZlcnQuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZmMxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2FuZHJvaWQvaW5jbHVkZS9jdWJlLnZlcnQuaW5jCkBAIC0wLDAgKzEsNDUgQEAKKwkvLyBPdmVybG9hZDQwMC1QcmVjUXVhbC4yMDAwIDEyLUFwci0yMDE3CisJMHgwNzIzMDIwMywweDAwMDEwMDAwLDB4MDAwODAwMDIsMHgwMDAwMDAyOSwweDAwMDAwMDAwLDB4MDAwMjAwMTEsMHgwMDAwMDAwMSwweDAwMDYwMDBiLAorCTB4MDAwMDAwMDEsMHg0YzUzNGM0NywweDY0NzQ3MzJlLDB4MzAzNTM0MmUsMHgwMDAwMDAwMCwweDAwMDMwMDBlLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwKKwkweDAwMDgwMDBmLDB4MDAwMDAwMDAsMHgwMDAwMDAwNCwweDZlNjk2MTZkLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDE1LDB4MDAwMDAwMWUsCisJMHgwMDAzMDAwMywweDAwMDAwMDAyLDB4MDAwMDAxOTAsMHgwMDA5MDAwNCwweDQxNWY0YzQ3LDB4NzM1ZjQyNTIsMHg3MjYxNzA2NSwweDVmNjU3NDYxLAorCTB4NjQ2MTY4NzMsMHg2ZjVmNzI2NSwweDYzNjU2YTYyLDB4MDAwMDczNzQsMHgwMDA5MDAwNCwweDQxNWY0YzQ3LDB4NzM1ZjQyNTIsMHg2OTY0NjE2OCwKKwkweDZjNWY2NzZlLDB4NzU2NzZlNjEsMHg1ZjY1Njc2MSwweDcwMzAzMjM0LDB4MDA2YjYzNjEsMHgwMDA0MDAwNSwweDAwMDAwMDA0LDB4NmU2OTYxNmQsCisJMHgwMDAwMDAwMCwweDAwMDUwMDA1LDB4MDAwMDAwMDksMHg2Mzc4NjU3NCwweDY0NzI2ZjZmLDB4MDAwMDAwMDAsMHgwMDAzMDAwNSwweDAwMDAwMDBmLAorCTB4MDA2Njc1NjIsMHgwMDA0MDAwNiwweDAwMDAwMDBmLDB4MDAwMDAwMDAsMHgwMDUwNTY0ZCwweDAwMDYwMDA2LDB4MDAwMDAwMGYsMHgwMDAwMDAwMSwKKwkweDY5NzM2ZjcwLDB4NmU2ZjY5NzQsMHgwMDAwMDAwMCwweDAwMDUwMDA2LDB4MDAwMDAwMGYsMHgwMDAwMDAwMiwweDcyNzQ3NDYxLDB4MDAwMDAwMDAsCisJMHgwMDA0MDAwNSwweDAwMDAwMDExLDB4NjY3NTYyNzUsMHgwMDAwMDAwMCwweDAwMDYwMDA1LDB4MDAwMDAwMTUsMHg1NjVmNmM2NywweDY1NzQ3MjY1LAorCTB4NjQ2ZTQ5NzgsMHgwMDAwNzg2NSwweDAwMDYwMDA1LDB4MDAwMDAwMWMsMHg1MDVmNmM2NywweDY1NTY3MjY1LDB4Nzg2NTc0NzIsMHgwMDAwMDAwMCwKKwkweDAwMDYwMDA2LDB4MDAwMDAwMWMsMHgwMDAwMDAwMCwweDUwNWY2YzY3LDB4NzQ2OTczNmYsMHgwMDZlNmY2OSwweDAwMDcwMDA2LDB4MDAwMDAwMWMsCisJMHgwMDAwMDAwMSwweDUwNWY2YzY3LDB4NzQ2ZTY5NmYsMHg2NTdhNjk1MywweDAwMDAwMDAwLDB4MDAwNzAwMDYsMHgwMDAwMDAxYywweDAwMDAwMDAyLAorCTB4NDM1ZjZjNjcsMHg0NDcwNjk2YywweDYxNzQ3MzY5LDB4MDA2NTYzNmUsMHgwMDAzMDAwNSwweDAwMDAwMDFlLDB4MDAwMDAwMDAsMHgwMDA0MDA0NywKKwkweDAwMDAwMDA5LDB4MDAwMDAwMWUsMHgwMDAwMDAwMCwweDAwMDQwMDQ3LDB4MDAwMDAwMGQsMHgwMDAwMDAwNiwweDAwMDAwMDEwLDB4MDAwNDAwNDcsCisJMHgwMDAwMDAwZSwweDAwMDAwMDA2LDB4MDAwMDAwMTAsMHgwMDA0MDA0OCwweDAwMDAwMDBmLDB4MDAwMDAwMDAsMHgwMDAwMDAwNSwweDAwMDUwMDQ4LAorCTB4MDAwMDAwMGYsMHgwMDAwMDAwMCwweDAwMDAwMDIzLDB4MDAwMDAwMDAsMHgwMDA1MDA0OCwweDAwMDAwMDBmLDB4MDAwMDAwMDAsMHgwMDAwMDAwNywKKwkweDAwMDAwMDEwLDB4MDAwNTAwNDgsMHgwMDAwMDAwZiwweDAwMDAwMDAxLDB4MDAwMDAwMjMsMHgwMDAwMDA0MCwweDAwMDUwMDQ4LDB4MDAwMDAwMGYsCisJMHgwMDAwMDAwMiwweDAwMDAwMDIzLDB4MDAwMDAyODAsMHgwMDAzMDA0NywweDAwMDAwMDBmLDB4MDAwMDAwMDIsMHgwMDA0MDA0NywweDAwMDAwMDExLAorCTB4MDAwMDAwMjIsMHgwMDAwMDAwMCwweDAwMDQwMDQ3LDB4MDAwMDAwMTEsMHgwMDAwMDAyMSwweDAwMDAwMDAwLDB4MDAwNDAwNDcsMHgwMDAwMDAxNSwKKwkweDAwMDAwMDBiLDB4MDAwMDAwMmEsMHgwMDA1MDA0OCwweDAwMDAwMDFjLDB4MDAwMDAwMDAsMHgwMDAwMDAwYiwweDAwMDAwMDAwLDB4MDAwNTAwNDgsCisJMHgwMDAwMDAxYywweDAwMDAwMDAxLDB4MDAwMDAwMGIsMHgwMDAwMDAwMSwweDAwMDUwMDQ4LDB4MDAwMDAwMWMsMHgwMDAwMDAwMiwweDAwMDAwMDBiLAorCTB4MDAwMDAwMDMsMHgwMDAzMDA0NywweDAwMDAwMDFjLDB4MDAwMDAwMDIsMHgwMDAyMDAxMywweDAwMDAwMDAyLDB4MDAwMzAwMjEsMHgwMDAwMDAwMywKKwkweDAwMDAwMDAyLDB4MDAwMzAwMTYsMHgwMDAwMDAwNiwweDAwMDAwMDIwLDB4MDAwNDAwMTcsMHgwMDAwMDAwNywweDAwMDAwMDA2LDB4MDAwMDAwMDQsCisJMHgwMDA0MDAyMCwweDAwMDAwMDA4LDB4MDAwMDAwMDMsMHgwMDAwMDAwNywweDAwMDQwMDNiLDB4MDAwMDAwMDgsMHgwMDAwMDAwOSwweDAwMDAwMDAzLAorCTB4MDAwNDAwMTgsMHgwMDAwMDAwYSwweDAwMDAwMDA3LDB4MDAwMDAwMDQsMHgwMDA0MDAxNSwweDAwMDAwMDBiLDB4MDAwMDAwMjAsMHgwMDAwMDAwMCwKKwkweDAwMDQwMDJiLDB4MDAwMDAwMGIsMHgwMDAwMDAwYywweDAwMDAwMDI0LDB4MDAwNDAwMWMsMHgwMDAwMDAwZCwweDAwMDAwMDA3LDB4MDAwMDAwMGMsCisJMHgwMDA0MDAxYywweDAwMDAwMDBlLDB4MDAwMDAwMDcsMHgwMDAwMDAwYywweDAwMDUwMDFlLDB4MDAwMDAwMGYsMHgwMDAwMDAwYSwweDAwMDAwMDBkLAorCTB4MDAwMDAwMGUsMHgwMDA0MDAyMCwweDAwMDAwMDEwLDB4MDAwMDAwMDIsMHgwMDAwMDAwZiwweDAwMDQwMDNiLDB4MDAwMDAwMTAsMHgwMDAwMDAxMSwKKwkweDAwMDAwMDAyLDB4MDAwNDAwMTUsMHgwMDAwMDAxMiwweDAwMDAwMDIwLDB4MDAwMDAwMDEsMHgwMDA0MDAyYiwweDAwMDAwMDEyLDB4MDAwMDAwMTMsCisJMHgwMDAwMDAwMiwweDAwMDQwMDIwLDB4MDAwMDAwMTQsMHgwMDAwMDAwMSwweDAwMDAwMDEyLDB4MDAwNDAwM2IsMHgwMDAwMDAxNCwweDAwMDAwMDE1LAorCTB4MDAwMDAwMDEsMHgwMDA0MDAyMCwweDAwMDAwMDE3LDB4MDAwMDAwMDIsMHgwMDAwMDAwNywweDAwMDQwMDJiLDB4MDAwMDAwMGIsMHgwMDAwMDAxYSwKKwkweDAwMDAwMDAxLDB4MDAwNDAwMWMsMHgwMDAwMDAxYiwweDAwMDAwMDA2LDB4MDAwMDAwMWEsMHgwMDA1MDAxZSwweDAwMDAwMDFjLDB4MDAwMDAwMDcsCisJMHgwMDAwMDAwNiwweDAwMDAwMDFiLDB4MDAwNDAwMjAsMHgwMDAwMDAxZCwweDAwMDAwMDAzLDB4MDAwMDAwMWMsMHgwMDA0MDAzYiwweDAwMDAwMDFkLAorCTB4MDAwMDAwMWUsMHgwMDAwMDAwMywweDAwMDQwMDJiLDB4MDAwMDAwMTIsMHgwMDAwMDAxZiwweDAwMDAwMDAwLDB4MDAwNDAwMjAsMHgwMDAwMDAyMCwKKwkweDAwMDAwMDAyLDB4MDAwMDAwMGEsMHgwMDA0MDAyYiwweDAwMDAwMDEyLDB4MDAwMDAwMjMsMHgwMDAwMDAwMSwweDAwMDUwMDM2LDB4MDAwMDAwMDIsCisJMHgwMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDMsMHgwMDAyMDBmOCwweDAwMDAwMDA1LDB4MDAwNDAwM2QsMHgwMDAwMDAxMiwweDAwMDAwMDE2LAorCTB4MDAwMDAwMTUsMHgwMDA2MDA0MSwweDAwMDAwMDE3LDB4MDAwMDAwMTgsMHgwMDAwMDAxMSwweDAwMDAwMDEzLDB4MDAwMDAwMTYsMHgwMDA0MDAzZCwKKwkweDAwMDAwMDA3LDB4MDAwMDAwMTksMHgwMDAwMDAxOCwweDAwMDMwMDNlLDB4MDAwMDAwMDksMHgwMDAwMDAxOSwweDAwMDUwMDQxLDB4MDAwMDAwMjAsCisJMHgwMDAwMDAyMSwweDAwMDAwMDExLDB4MDAwMDAwMWYsMHgwMDA0MDAzZCwweDAwMDAwMDBhLDB4MDAwMDAwMjIsMHgwMDAwMDAyMSwweDAwMDQwMDNkLAorCTB4MDAwMDAwMTIsMHgwMDAwMDAyNCwweDAwMDAwMDE1LDB4MDAwNjAwNDEsMHgwMDAwMDAxNywweDAwMDAwMDI1LDB4MDAwMDAwMTEsMHgwMDAwMDAyMywKKwkweDAwMDAwMDI0LDB4MDAwNDAwM2QsMHgwMDAwMDAwNywweDAwMDAwMDI2LDB4MDAwMDAwMjUsMHgwMDA1MDA5MSwweDAwMDAwMDA3LDB4MDAwMDAwMjcsCisJMHgwMDAwMDAyMiwweDAwMDAwMDI2LDB4MDAwNTAwNDEsMHgwMDAwMDAwOCwweDAwMDAwMDI4LDB4MDAwMDAwMWUsMHgwMDAwMDAxZiwweDAwMDMwMDNlLAorCTB4MDAwMDAwMjgsMHgwMDAwMDAyNywweDAwMDEwMGZkLDB4MDAwMTAwMzgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9qbmkvQW5kcm9pZC5tayBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRiOTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2puaS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChhYnNwYXRoICQoY2FsbCBteS1kaXIpKQorU1JDX0RJUiA6PSAkKExPQ0FMX1BBVEgpLy4uLy4uLy4uCitERU1PX0RJUiA6PSAkKFNSQ19ESVIpL2N1YmUKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gVmtDdWJlCitMT0NBTF9TUkNfRklMRVMgKz0gJChERU1PX0RJUikvY3ViZS5jIFwKKyAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2NvbW1vbi92dWxrYW5fd3JhcHBlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvY29tbW9uL2FuZHJvaWRfdXRpbC5jcHAKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChTUkNfRElSKS9idWlsZC1hbmRyb2lkL3RoaXJkX3BhcnR5L1Z1bGthbi1IZWFkZXJzL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAkKERFTU9fRElSKS9hbmRyb2lkL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2xpYnMgXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2NvbW1vbiBcCisgICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvYnVpbGQtYW5kcm9pZC9nZW5lcmF0ZWQvaW5jbHVkZQorTE9DQUxfQ0ZMQUdTICs9IC1EVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSIC0taW5jbHVkZT0kKFNSQ19ESVIpL2NvbW1vbi92dWxrYW5fd3JhcHBlci5oCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTICs9IGFuZHJvaWRfbmF0aXZlX2FwcF9nbHVlCitMT0NBTF9MRExJQlMgICAgOj0gLWxsb2cgLWxhbmRyb2lkCitMT0NBTF9MREZMQUdTICAgOj0gLXUgQU5hdGl2ZUFjdGl2aXR5X29uQ3JlYXRlCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyQoY2FsbCBpbXBvcnQtbW9kdWxlLGFuZHJvaWQvbmF0aXZlX2FwcF9nbHVlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9hbmRyb2lkL2puaS9BcHBsaWNhdGlvbi5tayBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9qbmkvQXBwbGljYXRpb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkOTc1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvYW5kcm9pZC9qbmkvQXBwbGljYXRpb24ubWsKQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxNSBWYWx2ZSBDb3Jwb3JhdGlvbgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworQVBQX0FCSSA6PSBhcm1lYWJpLXY3YSBhcm02NC12OGEgeDg2IHg4Nl82NAorQVBQX1BMQVRGT1JNIDo9IGFuZHJvaWQtMjMKK0FQUF9TVEwgOj0gYysrX3N0YXRpYworQVBQX01PRFVMRVMgOj0gVmtDdWJlCitBUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMSAtZmV4Y2VwdGlvbnMgLVdhbGwgLVdlcnJvciAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtRFZLX05PX1BST1RPVFlFUyAtREdMTV9GT1JDRV9SQURJQU5TCitBUFBfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IgLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLURWS19OT19QUk9UT1RZRVMgLURHTE1fRk9SQ0VfUkFESUFOUworTkRLX1RPT0xDSEFJTl9WRVJTSU9OIDo9IGNsYW5nCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2N1YmUuYyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvY3ViZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjA5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2N1YmUuYwpAQCAtMCwwICsxLDQwMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBJYW4gRWxsaW90dCA8aWFuQEx1bmFyRy5jb20+CisgKiBBdXRob3I6IElhbiBFbGxpb3R0IDxpYW5lbGxpb3R0QGdvb2dsZS5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogR3dhbi1neWVvbmcgTXVuIDxlbG9uZ2J1Z0BnbWFpbC5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICogQXV0aG9yOiBCaWxsIEhvbGxpbmdzIDxiaWxsLmhvbGxpbmdzQGJyZW53aWxsLmNvbT4KKyAqLworCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpIHx8IGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNwcmFnbWEgY29tbWVudChsaW5rZXIsICIvc3Vic3lzdGVtOndpbmRvd3MiKQorI2RlZmluZSBBUFBfTkFNRV9TVFJfTEVOIDgwCisjZW5kaWYgIC8vIF9XSU4zMgorCisjaWZkZWYgQU5EUk9JRAorI2luY2x1ZGUgInZ1bGthbl93cmFwcGVyLmgiCisjZWxzZQorI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dnVsa2FuL3ZrX3Nka19wbGF0Zm9ybS5oPgorI2luY2x1ZGUgImxpbm1hdGguaCIKKyNpbmNsdWRlICJvYmplY3RfdHlwZV9zdHJpbmdfaGVscGVyLmgiCisKKyNpbmNsdWRlICJnZXR0aW1lLmgiCisjaW5jbHVkZSAiaW50dHlwZXMuaCIKKyNkZWZpbmUgTUlMTElPTiAxMDAwMDAwTAorI2RlZmluZSBCSUxMSU9OIDEwMDAwMDAwMDBMCisKKyNkZWZpbmUgREVNT19URVhUVVJFX0NPVU5UIDEKKyNkZWZpbmUgQVBQX1NIT1JUX05BTUUgInZrY3ViZSIKKyNkZWZpbmUgQVBQX0xPTkdfTkFNRSAiVnVsa2FuIEN1YmUiCisKKy8vIEFsbG93IGEgbWF4aW11bSBvZiB0d28gb3V0c3RhbmRpbmcgcHJlc2VudGF0aW9uIG9wZXJhdGlvbnMuCisjZGVmaW5lIEZSQU1FX0xBRyAyCisKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorCisjaWYgZGVmaW5lZChOREVCVUcpICYmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIFVfQVNTRVJUX09OTFkgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIFVfQVNTRVJUX09OTFkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBVTlVTRUQKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCitib29sIGluX2NhbGxiYWNrID0gZmFsc2U7CisjZGVmaW5lIEVSUl9FWElUKGVycl9tc2csIGVycl9jbGFzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghZGVtby0+c3VwcHJlc3NfcG9wdXBzKSBNZXNzYWdlQm94KE5VTEwsIGVycl9tc2csIGVycl9jbGFzcywgTUJfT0spOyBcCisgICAgICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKK3ZvaWQgRGJnTXNnKGNoYXIgKmZtdCwgLi4uKSB7CisgICAgdmFfbGlzdCB2YTsKKyAgICB2YV9zdGFydCh2YSwgZm10KTsKKyAgICB2cHJpbnRmKGZtdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKyNlbGlmIGRlZmluZWQgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2RlZmluZSBFUlJfRVhJVChlcnJfbXNnLCBlcnJfY2xhc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJWdWxrYW4gQ3ViZSIsIGVycl9tc2cpKTsgXAorICAgICAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2lmZGVmIFZBUkFSR1NfV09SS1NfT05fQU5EUk9JRAordm9pZCBEYmdNc2coY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKyAgICB2YV9saXN0IHZhOworICAgIHZhX3N0YXJ0KHZhLCBmbXQpOworICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIlZ1bGthbiBDdWJlIiwgZm10LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKK30KKyNlbHNlICAvLyBWQVJBUkdTX1dPUktTX09OX0FORFJPSUQKKyNkZWZpbmUgRGJnTXNnKGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIlZ1bGthbiBDdWJlIiwgZm10LCAjI19fVkFfQVJHU19fKSk7IFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmICAvLyBWQVJBUkdTX1dPUktTX09OX0FORFJPSUQKKyNlbHNlCisjZGVmaW5lIEVSUl9FWElUKGVycl9tc2csIGVycl9jbGFzcykgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRmKCIlc1xuIiwgZXJyX21zZyk7ICAgICBcCisgICAgICAgIGZmbHVzaChzdGRvdXQpOyAgICAgICAgICAgICAgXAorICAgICAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQordm9pZCBEYmdNc2coY2hhciAqZm10LCAuLi4pIHsKKyAgICB2YV9saXN0IHZhOworICAgIHZhX3N0YXJ0KHZhLCBmbXQpOworICAgIHZwcmludGYoZm10LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKK30KKyNlbmRpZgorCisjZGVmaW5lIEdFVF9JTlNUQU5DRV9QUk9DX0FERFIoaW5zdCwgZW50cnlwb2ludCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZW1vLT5mcCMjZW50cnlwb2ludCA9IChQRk5fdmsjI2VudHJ5cG9pbnQpdmtHZXRJbnN0YW5jZVByb2NBZGRyKGluc3QsICJ2ayIgI2VudHJ5cG9pbnQpOyAgICAgICAgICAgICBcCisgICAgICAgIGlmIChkZW1vLT5mcCMjZW50cnlwb2ludCA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEVSUl9FWElUKCJ2a0dldEluc3RhbmNlUHJvY0FkZHIgZmFpbGVkIHRvIGZpbmQgdmsiICNlbnRyeXBvaW50LCAidmtHZXRJbnN0YW5jZVByb2NBZGRyIEZhaWx1cmUiKTsgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitzdGF0aWMgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZ19nZHBhID0gTlVMTDsKKworI2RlZmluZSBHRVRfREVWSUNFX1BST0NfQUREUihkZXYsIGVudHJ5cG9pbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFnX2dkcGEpIGdfZ2RwYSA9IChQRk5fdmtHZXREZXZpY2VQcm9jQWRkcil2a0dldEluc3RhbmNlUHJvY0FkZHIoZGVtby0+aW5zdCwgInZrR2V0RGV2aWNlUHJvY0FkZHIiKTsgXAorICAgICAgICBkZW1vLT5mcCMjZW50cnlwb2ludCA9IChQRk5fdmsjI2VudHJ5cG9pbnQpZ19nZHBhKGRldiwgInZrIiAjZW50cnlwb2ludCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChkZW1vLT5mcCMjZW50cnlwb2ludCA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEVSUl9FWElUKCJ2a0dldERldmljZVByb2NBZGRyIGZhaWxlZCB0byBmaW5kIHZrIiAjZW50cnlwb2ludCwgInZrR2V0RGV2aWNlUHJvY0FkZHIgRmFpbHVyZSIpOyAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKgorICogc3RydWN0dXJlIHRvIHRyYWNrIGFsbCBvYmplY3RzIHJlbGF0ZWQgdG8gYSB0ZXh0dXJlLgorICovCitzdHJ1Y3QgdGV4dHVyZV9vYmplY3QgeworICAgIFZrU2FtcGxlciBzYW1wbGVyOworCisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dDsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYzsKKyAgICBWa0RldmljZU1lbW9yeSBtZW07CisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICBpbnQzMl90IHRleF93aWR0aCwgdGV4X2hlaWdodDsKK307CisKK3N0YXRpYyBjaGFyICp0ZXhfZmlsZXNbXSA9IHsibHVuYXJnLnBwbSJ9OworCitzdGF0aWMgaW50IHZhbGlkYXRpb25fZXJyb3IgPSAwOworCitzdHJ1Y3Qgdmt0ZXhjdWJlX3ZzX3VuaWZvcm0geworICAgIC8vIE11c3Qgc3RhcnQgd2l0aCBNVlAKKyAgICBmbG9hdCBtdnBbNF1bNF07CisgICAgZmxvYXQgcG9zaXRpb25bMTIgKiAzXVs0XTsKKyAgICBmbG9hdCBhdHRyWzEyICogM11bNF07Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXNoIGFuZCBWZXJ0ZXhGb3JtYXQgRGF0YQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2xhbmctZm9ybWF0IG9mZgorc3RhdGljIGNvbnN0IGZsb2F0IGdfdmVydGV4X2J1ZmZlcl9kYXRhW10gPSB7CisgICAgLTEuMGYsLTEuMGYsLTEuMGYsICAvLyAtWCBzaWRlCisgICAgLTEuMGYsLTEuMGYsIDEuMGYsCisgICAgLTEuMGYsIDEuMGYsIDEuMGYsCisgICAgLTEuMGYsIDEuMGYsIDEuMGYsCisgICAgLTEuMGYsIDEuMGYsLTEuMGYsCisgICAgLTEuMGYsLTEuMGYsLTEuMGYsCisKKyAgICAtMS4wZiwtMS4wZiwtMS4wZiwgIC8vIC1aIHNpZGUKKyAgICAgMS4wZiwgMS4wZiwtMS4wZiwKKyAgICAgMS4wZiwtMS4wZiwtMS4wZiwKKyAgICAtMS4wZiwtMS4wZiwtMS4wZiwKKyAgICAtMS4wZiwgMS4wZiwtMS4wZiwKKyAgICAgMS4wZiwgMS4wZiwtMS4wZiwKKworICAgIC0xLjBmLC0xLjBmLC0xLjBmLCAgLy8gLVkgc2lkZQorICAgICAxLjBmLC0xLjBmLC0xLjBmLAorICAgICAxLjBmLC0xLjBmLCAxLjBmLAorICAgIC0xLjBmLC0xLjBmLC0xLjBmLAorICAgICAxLjBmLC0xLjBmLCAxLjBmLAorICAgIC0xLjBmLC0xLjBmLCAxLjBmLAorCisgICAgLTEuMGYsIDEuMGYsLTEuMGYsICAvLyArWSBzaWRlCisgICAgLTEuMGYsIDEuMGYsIDEuMGYsCisgICAgIDEuMGYsIDEuMGYsIDEuMGYsCisgICAgLTEuMGYsIDEuMGYsLTEuMGYsCisgICAgIDEuMGYsIDEuMGYsIDEuMGYsCisgICAgIDEuMGYsIDEuMGYsLTEuMGYsCisKKyAgICAgMS4wZiwgMS4wZiwtMS4wZiwgIC8vICtYIHNpZGUKKyAgICAgMS4wZiwgMS4wZiwgMS4wZiwKKyAgICAgMS4wZiwtMS4wZiwgMS4wZiwKKyAgICAgMS4wZiwtMS4wZiwgMS4wZiwKKyAgICAgMS4wZiwtMS4wZiwtMS4wZiwKKyAgICAgMS4wZiwgMS4wZiwtMS4wZiwKKworICAgIC0xLjBmLCAxLjBmLCAxLjBmLCAgLy8gK1ogc2lkZQorICAgIC0xLjBmLC0xLjBmLCAxLjBmLAorICAgICAxLjBmLCAxLjBmLCAxLjBmLAorICAgIC0xLjBmLC0xLjBmLCAxLjBmLAorICAgICAxLjBmLC0xLjBmLCAxLjBmLAorICAgICAxLjBmLCAxLjBmLCAxLjBmLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGdfdXZfYnVmZmVyX2RhdGFbXSA9IHsKKyAgICAwLjBmLCAxLjBmLCAgLy8gLVggc2lkZQorICAgIDEuMGYsIDEuMGYsCisgICAgMS4wZiwgMC4wZiwKKyAgICAxLjBmLCAwLjBmLAorICAgIDAuMGYsIDAuMGYsCisgICAgMC4wZiwgMS4wZiwKKworICAgIDEuMGYsIDEuMGYsICAvLyAtWiBzaWRlCisgICAgMC4wZiwgMC4wZiwKKyAgICAwLjBmLCAxLjBmLAorICAgIDEuMGYsIDEuMGYsCisgICAgMS4wZiwgMC4wZiwKKyAgICAwLjBmLCAwLjBmLAorCisgICAgMS4wZiwgMC4wZiwgIC8vIC1ZIHNpZGUKKyAgICAxLjBmLCAxLjBmLAorICAgIDAuMGYsIDEuMGYsCisgICAgMS4wZiwgMC4wZiwKKyAgICAwLjBmLCAxLjBmLAorICAgIDAuMGYsIDAuMGYsCisKKyAgICAxLjBmLCAwLjBmLCAgLy8gK1kgc2lkZQorICAgIDAuMGYsIDAuMGYsCisgICAgMC4wZiwgMS4wZiwKKyAgICAxLjBmLCAwLjBmLAorICAgIDAuMGYsIDEuMGYsCisgICAgMS4wZiwgMS4wZiwKKworICAgIDEuMGYsIDAuMGYsICAvLyArWCBzaWRlCisgICAgMC4wZiwgMC4wZiwKKyAgICAwLjBmLCAxLjBmLAorICAgIDAuMGYsIDEuMGYsCisgICAgMS4wZiwgMS4wZiwKKyAgICAxLjBmLCAwLjBmLAorCisgICAgMC4wZiwgMC4wZiwgIC8vICtaIHNpZGUKKyAgICAwLjBmLCAxLjBmLAorICAgIDEuMGYsIDAuMGYsCisgICAgMC4wZiwgMS4wZiwKKyAgICAxLjBmLCAxLjBmLAorICAgIDEuMGYsIDAuMGYsCit9OworLy8gY2xhbmctZm9ybWF0IG9uCisKK3ZvaWQgZHVtcE1hdHJpeChjb25zdCBjaGFyICpub3RlLCBtYXQ0eDQgTVZQKSB7CisgICAgaW50IGk7CisKKyAgICBwcmludGYoIiVzOiBcbiIsIG5vdGUpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlZiwgJWYsICVmLCAlZlxuIiwgTVZQW2ldWzBdLCBNVlBbaV1bMV0sIE1WUFtpXVsyXSwgTVZQW2ldWzNdKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICAgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIGR1bXBWZWM0KGNvbnN0IGNoYXIgKm5vdGUsIHZlYzQgdmVjdG9yKSB7CisgICAgcHJpbnRmKCIlczogXG4iLCBub3RlKTsKKyAgICBwcmludGYoIiVmLCAlZiwgJWYsICVmXG4iLCB2ZWN0b3JbMF0sIHZlY3RvclsxXSwgdmVjdG9yWzJdLCB2ZWN0b3JbM10pOworICAgIHByaW50ZigiXG4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgVmtDb21tYW5kQnVmZmVyIGNtZDsKKyAgICBWa0NvbW1hbmRCdWZmZXIgZ3JhcGhpY3NfdG9fcHJlc2VudF9jbWQ7CisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICBWa0J1ZmZlciB1bmlmb3JtX2J1ZmZlcjsKKyAgICBWa0RldmljZU1lbW9yeSB1bmlmb3JtX21lbW9yeTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyOworICAgIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKK30gU3dhcGNoYWluSW1hZ2VSZXNvdXJjZXM7CisKK3N0cnVjdCBkZW1vIHsKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCisjZGVmaW5lIEFQUF9OQU1FX1NUUl9MRU4gODAKKyAgICBISU5TVEFOQ0UgY29ubmVjdGlvbjsgICAgICAgICAvLyBoSW5zdGFuY2UgLSBXaW5kb3dzIEluc3RhbmNlCisgICAgY2hhciBuYW1lW0FQUF9OQU1FX1NUUl9MRU5dOyAgLy8gTmFtZSB0byBwdXQgb24gdGhlIHdpbmRvdy9pY29uCisgICAgSFdORCB3aW5kb3c7ICAgICAgICAgICAgICAgICAgLy8gaFduZCAtIHdpbmRvdyBoYW5kbGUKKyAgICBQT0lOVCBtaW5zaXplOyAgICAgICAgICAgICAgICAvLyBtaW5pbXVtIHdpbmRvdyBzaXplCisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikKKyAgICBEaXNwbGF5ICpkaXNwbGF5OworICAgIFdpbmRvdyB4bGliX3dpbmRvdzsKKyAgICBBdG9tIHhsaWJfd21fZGVsZXRlX3dpbmRvdzsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisgICAgRGlzcGxheSAqZGlzcGxheTsKKyAgICB4Y2JfY29ubmVjdGlvbl90ICpjb25uZWN0aW9uOworICAgIHhjYl9zY3JlZW5fdCAqc2NyZWVuOworICAgIHhjYl93aW5kb3dfdCB4Y2Jfd2luZG93OworICAgIHhjYl9pbnRlcm5fYXRvbV9yZXBseV90ICphdG9tX3dtX2RlbGV0ZV93aW5kb3c7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyAgICBzdHJ1Y3Qgd2xfZGlzcGxheSAqZGlzcGxheTsKKyAgICBzdHJ1Y3Qgd2xfcmVnaXN0cnkgKnJlZ2lzdHJ5OworICAgIHN0cnVjdCB3bF9jb21wb3NpdG9yICpjb21wb3NpdG9yOworICAgIHN0cnVjdCB3bF9zdXJmYWNlICp3aW5kb3c7CisgICAgc3RydWN0IHdsX3NoZWxsICpzaGVsbDsKKyAgICBzdHJ1Y3Qgd2xfc2hlbGxfc3VyZmFjZSAqc2hlbGxfc3VyZmFjZTsKKyAgICBzdHJ1Y3Qgd2xfc2VhdCAqc2VhdDsKKyAgICBzdHJ1Y3Qgd2xfcG9pbnRlciAqcG9pbnRlcjsKKyAgICBzdHJ1Y3Qgd2xfa2V5Ym9hcmQgKmtleWJvYXJkOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIpCisgICAgc3RydWN0IEFOYXRpdmVXaW5kb3cgKndpbmRvdzsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKKyAgICB2b2lkICpjYU1ldGFsTGF5ZXI7CisjZW5kaWYKKyAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICBib29sIHByZXBhcmVkOworICAgIGJvb2wgdXNlX3N0YWdpbmdfYnVmZmVyOworICAgIGJvb2wgc2VwYXJhdGVfcHJlc2VudF9xdWV1ZTsKKyAgICBib29sIGlzX21pbmltaXplZDsKKworICAgIGJvb2wgVktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnRfZW5hYmxlZDsKKworICAgIGJvb2wgVktfR09PR0xFX2Rpc3BsYXlfdGltaW5nX2VuYWJsZWQ7CisgICAgYm9vbCBzeW5jZF93aXRoX2FjdHVhbF9wcmVzZW50czsKKyAgICB1aW50NjRfdCByZWZyZXNoX2R1cmF0aW9uOworICAgIHVpbnQ2NF90IHJlZnJlc2hfZHVyYXRpb25fbXVsdGlwbGllcjsKKyAgICB1aW50NjRfdCB0YXJnZXRfSVBEOyAgLy8gaW1hZ2UgcHJlc2VudCBkdXJhdGlvbiAoaW52ZXJzZSBvZiBmcmFtZSByYXRlKQorICAgIHVpbnQ2NF90IHByZXZfZGVzaXJlZF9wcmVzZW50X3RpbWU7CisgICAgdWludDMyX3QgbmV4dF9wcmVzZW50X2lkOworICAgIHVpbnQzMl90IGxhc3RfZWFybHlfaWQ7ICAvLyAwIGlmIG5vIGVhcmx5IGltYWdlcworICAgIHVpbnQzMl90IGxhc3RfbGF0ZV9pZDsgICAvLyAwIGlmIG5vIGxhdGUgaW1hZ2VzCisKKyAgICBWa0luc3RhbmNlIGluc3Q7CisgICAgVmtQaHlzaWNhbERldmljZSBncHU7CisgICAgVmtEZXZpY2UgZGV2aWNlOworICAgIFZrUXVldWUgZ3JhcGhpY3NfcXVldWU7CisgICAgVmtRdWV1ZSBwcmVzZW50X3F1ZXVlOworICAgIHVpbnQzMl90IGdyYXBoaWNzX3F1ZXVlX2ZhbWlseV9pbmRleDsKKyAgICB1aW50MzJfdCBwcmVzZW50X3F1ZXVlX2ZhbWlseV9pbmRleDsKKyAgICBWa1NlbWFwaG9yZSBpbWFnZV9hY3F1aXJlZF9zZW1hcGhvcmVzW0ZSQU1FX0xBR107CisgICAgVmtTZW1hcGhvcmUgZHJhd19jb21wbGV0ZV9zZW1hcGhvcmVzW0ZSQU1FX0xBR107CisgICAgVmtTZW1hcGhvcmUgaW1hZ2Vfb3duZXJzaGlwX3NlbWFwaG9yZXNbRlJBTUVfTEFHXTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBncHVfcHJvcHM7CisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgKnF1ZXVlX3Byb3BzOworICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIG1lbW9yeV9wcm9wZXJ0aWVzOworCisgICAgdWludDMyX3QgZW5hYmxlZF9leHRlbnNpb25fY291bnQ7CisgICAgdWludDMyX3QgZW5hYmxlZF9sYXllcl9jb3VudDsKKyAgICBjaGFyICpleHRlbnNpb25fbmFtZXNbNjRdOworICAgIGNoYXIgKmVuYWJsZWRfbGF5ZXJzWzY0XTsKKworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICBWa0NvbG9yU3BhY2VLSFIgY29sb3Jfc3BhY2U7CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIGZwR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgZnBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiBmcEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSIGZwR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworICAgIFBGTl92a0NyZWF0ZVN3YXBjaGFpbktIUiBmcENyZWF0ZVN3YXBjaGFpbktIUjsKKyAgICBQRk5fdmtEZXN0cm95U3dhcGNoYWluS0hSIGZwRGVzdHJveVN3YXBjaGFpbktIUjsKKyAgICBQRk5fdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIgZnBHZXRTd2FwY2hhaW5JbWFnZXNLSFI7CisgICAgUEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUiBmcEFjcXVpcmVOZXh0SW1hZ2VLSFI7CisgICAgUEZOX3ZrUXVldWVQcmVzZW50S0hSIGZwUXVldWVQcmVzZW50S0hSOworICAgIFBGTl92a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIGZwR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEU7CisgICAgUEZOX3ZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSBmcEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEU7CisgICAgdWludDMyX3Qgc3dhcGNoYWluSW1hZ2VDb3VudDsKKyAgICBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW47CisgICAgU3dhcGNoYWluSW1hZ2VSZXNvdXJjZXMgKnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXM7CisgICAgVmtQcmVzZW50TW9kZUtIUiBwcmVzZW50TW9kZTsKKyAgICBWa0ZlbmNlIGZlbmNlc1tGUkFNRV9MQUddOworICAgIGludCBmcmFtZV9pbmRleDsKKworICAgIFZrQ29tbWFuZFBvb2wgY21kX3Bvb2w7CisgICAgVmtDb21tYW5kUG9vbCBwcmVzZW50X2NtZF9wb29sOworCisgICAgc3RydWN0IHsKKyAgICAgICAgVmtGb3JtYXQgZm9ybWF0OworCisgICAgICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYzsKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgICAgICBWa0ltYWdlVmlldyB2aWV3OworICAgIH0gZGVwdGg7CisKKyAgICBzdHJ1Y3QgdGV4dHVyZV9vYmplY3QgdGV4dHVyZXNbREVNT19URVhUVVJFX0NPVU5UXTsKKyAgICBzdHJ1Y3QgdGV4dHVyZV9vYmplY3Qgc3RhZ2luZ190ZXh0dXJlOworCisgICAgVmtDb21tYW5kQnVmZmVyIGNtZDsgIC8vIEJ1ZmZlciBmb3IgaW5pdGlhbGl6YXRpb24gY29tbWFuZHMKKyAgICBWa1BpcGVsaW5lTGF5b3V0IHBpcGVsaW5lX2xheW91dDsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY19sYXlvdXQ7CisgICAgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGU7CisgICAgVmtSZW5kZXJQYXNzIHJlbmRlcl9wYXNzOworICAgIFZrUGlwZWxpbmUgcGlwZWxpbmU7CisKKyAgICBtYXQ0eDQgcHJvamVjdGlvbl9tYXRyaXg7CisgICAgbWF0NHg0IHZpZXdfbWF0cml4OworICAgIG1hdDR4NCBtb2RlbF9tYXRyaXg7CisKKyAgICBmbG9hdCBzcGluX2FuZ2xlOworICAgIGZsb2F0IHNwaW5faW5jcmVtZW50OworICAgIGJvb2wgcGF1c2U7CisKKyAgICBWa1NoYWRlck1vZHVsZSB2ZXJ0X3NoYWRlcl9tb2R1bGU7CisgICAgVmtTaGFkZXJNb2R1bGUgZnJhZ19zaGFkZXJfbW9kdWxlOworCisgICAgVmtEZXNjcmlwdG9yUG9vbCBkZXNjX3Bvb2w7CisKKyAgICBib29sIHF1aXQ7CisgICAgaW50MzJfdCBjdXJGcmFtZTsKKyAgICBpbnQzMl90IGZyYW1lQ291bnQ7CisgICAgYm9vbCB2YWxpZGF0ZTsKKyAgICBib29sIHZhbGlkYXRlX2NoZWNrc19kaXNhYmxlZDsKKyAgICBib29sIHVzZV9icmVhazsKKyAgICBib29sIHN1cHByZXNzX3BvcHVwczsKKworICAgIFBGTl92a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICBQRk5fdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCBEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICBQRk5fdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCBTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVDsKKyAgICBQRk5fdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCBDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVDsKKyAgICBQRk5fdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUOworICAgIFBGTl92a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCBDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQ7CisgICAgUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQ7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIGRiZ19tZXNzZW5nZXI7CisKKyAgICB1aW50MzJfdCBjdXJyZW50X2J1ZmZlcjsKKyAgICB1aW50MzJfdCBxdWV1ZV9mYW1pbHlfY291bnQ7Cit9OworCitWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgZGVidWdfbWVzc2VuZ2VyX2NhbGxiYWNrKFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIG1lc3NhZ2VTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICpwQ2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwVXNlckRhdGEpIHsKKyAgICBjaGFyIHByZWZpeFs2NF0gPSAiIjsKKyAgICBjaGFyICptZXNzYWdlID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHBDYWxsYmFja0RhdGEtPnBNZXNzYWdlKSArIDUwMDApOworICAgIGFzc2VydChtZXNzYWdlKTsKKyAgICBzdHJ1Y3QgZGVtbyAqZGVtbyA9IChzdHJ1Y3QgZGVtbyAqKXBVc2VyRGF0YTsKKworICAgIGlmIChkZW1vLT51c2VfYnJlYWspIHsKKyNpZm5kZWYgV0lOMzIKKyAgICAgICAgcmFpc2UoU0lHVFJBUCk7CisjZWxzZQorICAgICAgICBEZWJ1Z0JyZWFrKCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobWVzc2FnZVNldmVyaXR5ICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9WRVJCT1NFX0JJVF9FWFQpIHsKKyAgICAgICAgc3RyY2F0KHByZWZpeCwgIlZFUkJPU0UgOiAiKTsKKyAgICB9IGVsc2UgaWYgKG1lc3NhZ2VTZXZlcml0eSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUKSB7CisgICAgICAgIHN0cmNhdChwcmVmaXgsICJJTkZPIDogIik7CisgICAgfSBlbHNlIGlmIChtZXNzYWdlU2V2ZXJpdHkgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1dBUk5JTkdfQklUX0VYVCkgeworICAgICAgICBzdHJjYXQocHJlZml4LCAiV0FSTklORyA6ICIpOworICAgIH0gZWxzZSBpZiAobWVzc2FnZVNldmVyaXR5ICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9FUlJPUl9CSVRfRVhUKSB7CisgICAgICAgIHN0cmNhdChwcmVmaXgsICJFUlJPUiA6ICIpOworICAgIH0KKworICAgIGlmIChtZXNzYWdlVHlwZSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9HRU5FUkFMX0JJVF9FWFQpIHsKKyAgICAgICAgc3RyY2F0KHByZWZpeCwgIkdFTkVSQUwiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWVzc2FnZVR5cGUgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfVkFMSURBVElPTl9CSVRfRVhUKSB7CisgICAgICAgICAgICBzdHJjYXQocHJlZml4LCAiVkFMSURBVElPTiIpOworICAgICAgICAgICAgdmFsaWRhdGlvbl9lcnJvciA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lc3NhZ2VUeXBlICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1BFUkZPUk1BTkNFX0JJVF9FWFQpIHsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9WQUxJREFUSU9OX0JJVF9FWFQpIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQocHJlZml4LCAifCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY2F0KHByZWZpeCwgIlBFUkZPUk1BTkNFIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcHJpbnRmKG1lc3NhZ2UsICIlcyAtIE1lc3NhZ2UgSWQgTnVtYmVyOiAlZCB8IE1lc3NhZ2UgSWQgTmFtZTogJXNcblx0JXNcbiIsIHByZWZpeCwgcENhbGxiYWNrRGF0YS0+bWVzc2FnZUlkTnVtYmVyLAorICAgICAgICAgICAgcENhbGxiYWNrRGF0YS0+cE1lc3NhZ2VJZE5hbWUsIHBDYWxsYmFja0RhdGEtPnBNZXNzYWdlKTsKKyAgICBpZiAocENhbGxiYWNrRGF0YS0+b2JqZWN0Q291bnQgPiAwKSB7CisgICAgICAgIGNoYXIgdG1wX21lc3NhZ2VbNTAwXTsKKyAgICAgICAgc3ByaW50Zih0bXBfbWVzc2FnZSwgIlxuXHRPYmplY3RzIC0gJWRcbiIsIHBDYWxsYmFja0RhdGEtPm9iamVjdENvdW50KTsKKyAgICAgICAgc3RyY2F0KG1lc3NhZ2UsIHRtcF9tZXNzYWdlKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBvYmplY3QgPSAwOyBvYmplY3QgPCBwQ2FsbGJhY2tEYXRhLT5vYmplY3RDb3VudDsgKytvYmplY3QpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHBDYWxsYmFja0RhdGEtPnBPYmplY3RzW29iamVjdF0ucE9iamVjdE5hbWUgJiYgc3RybGVuKHBDYWxsYmFja0RhdGEtPnBPYmplY3RzW29iamVjdF0ucE9iamVjdE5hbWUpID4gMCkgeworICAgICAgICAgICAgICAgIHNwcmludGYodG1wX21lc3NhZ2UsICJcdFx0T2JqZWN0WyVkXSAtICVzLCBIYW5kbGUgJXAsIE5hbWUgXCIlc1wiXG4iLCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtPYmplY3RUeXBlKHBDYWxsYmFja0RhdGEtPnBPYmplY3RzW29iamVjdF0ub2JqZWN0VHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShwQ2FsbGJhY2tEYXRhLT5wT2JqZWN0c1tvYmplY3RdLm9iamVjdEhhbmRsZSksIHBDYWxsYmFja0RhdGEtPnBPYmplY3RzW29iamVjdF0ucE9iamVjdE5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcF9tZXNzYWdlLCAiXHRcdE9iamVjdFslZF0gLSAlcywgSGFuZGxlICVwXG4iLCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtPYmplY3RUeXBlKHBDYWxsYmFja0RhdGEtPnBPYmplY3RzW29iamVjdF0ub2JqZWN0VHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShwQ2FsbGJhY2tEYXRhLT5wT2JqZWN0c1tvYmplY3RdLm9iamVjdEhhbmRsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY2F0KG1lc3NhZ2UsIHRtcF9tZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocENhbGxiYWNrRGF0YS0+Y21kQnVmTGFiZWxDb3VudCA+IDApIHsKKyAgICAgICAgY2hhciB0bXBfbWVzc2FnZVs1MDBdOworICAgICAgICBzcHJpbnRmKHRtcF9tZXNzYWdlLCAiXG5cdENvbW1hbmQgQnVmZmVyIExhYmVscyAtICVkXG4iLCBwQ2FsbGJhY2tEYXRhLT5jbWRCdWZMYWJlbENvdW50KTsKKyAgICAgICAgc3RyY2F0KG1lc3NhZ2UsIHRtcF9tZXNzYWdlKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjbWRfYnVmX2xhYmVsID0gMDsgY21kX2J1Zl9sYWJlbCA8IHBDYWxsYmFja0RhdGEtPmNtZEJ1ZkxhYmVsQ291bnQ7ICsrY21kX2J1Zl9sYWJlbCkgeworICAgICAgICAgICAgc3ByaW50Zih0bXBfbWVzc2FnZSwgIlx0XHRMYWJlbFslZF0gLSAlcyB7ICVmLCAlZiwgJWYsICVmfVxuIiwgY21kX2J1Zl9sYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgcENhbGxiYWNrRGF0YS0+cENtZEJ1ZkxhYmVsc1tjbWRfYnVmX2xhYmVsXS5wTGFiZWxOYW1lLCBwQ2FsbGJhY2tEYXRhLT5wQ21kQnVmTGFiZWxzW2NtZF9idWZfbGFiZWxdLmNvbG9yWzBdLAorICAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2tEYXRhLT5wQ21kQnVmTGFiZWxzW2NtZF9idWZfbGFiZWxdLmNvbG9yWzFdLCBwQ2FsbGJhY2tEYXRhLT5wQ21kQnVmTGFiZWxzW2NtZF9idWZfbGFiZWxdLmNvbG9yWzJdLAorICAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2tEYXRhLT5wQ21kQnVmTGFiZWxzW2NtZF9idWZfbGFiZWxdLmNvbG9yWzNdKTsKKyAgICAgICAgICAgIHN0cmNhdChtZXNzYWdlLCB0bXBfbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBfV0lOMzIKKworICAgIGluX2NhbGxiYWNrID0gdHJ1ZTsKKyAgICBpZiAoIWRlbW8tPnN1cHByZXNzX3BvcHVwcykgTWVzc2FnZUJveChOVUxMLCBtZXNzYWdlLCAiQWxlcnQiLCBNQl9PSyk7CisgICAgaW5fY2FsbGJhY2sgPSBmYWxzZTsKKworI2VsaWYgZGVmaW5lZChBTkRST0lEKQorCisgICAgaWYgKG1lc3NhZ2VTZXZlcml0eSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUKSB7CisgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgQVBQX1NIT1JUX05BTUUsICIlcyIsIG1lc3NhZ2UpOworICAgIH0gZWxzZSBpZiAobWVzc2FnZVNldmVyaXR5ICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9XQVJOSU5HX0JJVF9FWFQpIHsKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19XQVJOLCBBUFBfU0hPUlRfTkFNRSwgIiVzIiwgbWVzc2FnZSk7CisgICAgfSBlbHNlIGlmIChtZXNzYWdlU2V2ZXJpdHkgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0VSUk9SX0JJVF9FWFQpIHsKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgQVBQX1NIT1JUX05BTUUsICIlcyIsIG1lc3NhZ2UpOworICAgIH0gZWxzZSBpZiAobWVzc2FnZVNldmVyaXR5ICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9WRVJCT1NFX0JJVF9FWFQpIHsKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19WRVJCT1NFLCBBUFBfU0hPUlRfTkFNRSwgIiVzIiwgbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBBUFBfU0hPUlRfTkFNRSwgIiVzIiwgbWVzc2FnZSk7CisgICAgfQorCisjZWxzZQorCisgICAgcHJpbnRmKCIlc1xuIiwgbWVzc2FnZSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisKKyNlbmRpZgorCisgICAgZnJlZShtZXNzYWdlKTsKKworICAgIC8vIERvbid0IGJhaWwgb3V0LCBidXQga2VlcCBnb2luZy4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQWN0dWFsVGltZUxhdGUodWludDY0X3QgZGVzaXJlZCwgdWludDY0X3QgYWN0dWFsLCB1aW50NjRfdCByZHVyKSB7CisgICAgLy8gVGhlIGRlc2lyZWQgdGltZSB3YXMgdGhlIGVhcmxpZXN0IHRpbWUgdGhhdCB0aGUgcHJlc2VudCBzaG91bGQgaGF2ZQorICAgIC8vIG9jY3VyZWQuICBJbiBhbG1vc3QgZXZlcnkgY2FzZSwgdGhlIGFjdHVhbCB0aW1lIHNob3VsZCBiZSBsYXRlciB0aGFuIHRoZQorICAgIC8vIGRlc2lyZWQgdGltZS4gIFdlIHNob3VsZCBvbmx5IGNvbnNpZGVyIHRoZSBhY3R1YWwgdGltZSAibGF0ZSIgaWYgaXQgaXMKKyAgICAvLyBhZnRlciAiZGVzaXJlZCArIHJkdXIiLgorICAgIGlmIChhY3R1YWwgPD0gZGVzaXJlZCkgeworICAgICAgICAvLyBUaGUgYWN0dWFsIHRpbWUgd2FzIGJlZm9yZSBvciBlcXVhbCB0byB0aGUgZGVzaXJlZCB0aW1lLiAgVGhpcyB3aWxsCisgICAgICAgIC8vIHByb2JhYmx5IG5ldmVyIGhhcHBlbiwgYnV0IGluIGNhc2UgaXQgZG9lcywgcmV0dXJuIGZhbHNlIHNpbmNlIHRoZQorICAgICAgICAvLyBwcmVzZW50IHdhcyBvYnZpb3VzbHkgTk9UIGxhdGUuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDY0X3QgZGVhZGxpbmUgPSBkZXNpcmVkICsgcmR1cjsKKyAgICBpZiAoYWN0dWFsID4gZGVhZGxpbmUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KK2Jvb2wgQ2FuUHJlc2VudEVhcmxpZXIodWludDY0X3QgZWFybGllc3QsIHVpbnQ2NF90IGFjdHVhbCwgdWludDY0X3QgbWFyZ2luLCB1aW50NjRfdCByZHVyKSB7CisgICAgaWYgKGVhcmxpZXN0IDwgYWN0dWFsKSB7CisgICAgICAgIC8vIENvbnNpZGVyIHdoZXRoZXIgdGhpcyBwcmVzZW50IGNvdWxkIGhhdmUgb2NjdXJlZCBlYXJsaWVyLiAgTWFrZSBzdXJlCisgICAgICAgIC8vIHRoYXQgZWFybGllc3QgdGltZSB3YXMgYXQgbGVhc3QgMm1zZWMgZWFybGllciB0aGFuIGFjdHVhbCB0aW1lLCBhbmQKKyAgICAgICAgLy8gdGhhdCB0aGUgbWFyZ2luIHdhcyBhdCBsZWFzdCAybXNlYzoKKyAgICAgICAgdWludDY0X3QgZGlmZiA9IGFjdHVhbCAtIGVhcmxpZXN0OworICAgICAgICBpZiAoKGRpZmYgPj0gKDIgKiBNSUxMSU9OKSkgJiYgKG1hcmdpbiA+PSAoMiAqIE1JTExJT04pKSkgeworICAgICAgICAgICAgLy8gVGhpcyBwcmVzZW50IGNvdWxkIGhhdmUgb2NjdXJlZCBlYXJsaWVyIGJlY2F1c2UgYm90aDogMSkgdGhlCisgICAgICAgICAgICAvLyBlYXJsaWVzdCB0aW1lIHdhcyBhdCBsZWFzdCAyIG1zZWMgYmVmb3JlIGFjdHVhbCB0aW1lLCBhbmQgMikgdGhlCisgICAgICAgICAgICAvLyBtYXJnaW4gd2FzIGF0IGxlYXN0IDJtc2VjLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uczoKK3N0YXRpYyB2b2lkIGRlbW9fcmVzaXplKHN0cnVjdCBkZW1vICpkZW1vKTsKK3N0YXRpYyB2b2lkIGRlbW9fY3JlYXRlX3N1cmZhY2Uoc3RydWN0IGRlbW8gKmRlbW8pOworCitzdGF0aWMgYm9vbCBtZW1vcnlfdHlwZV9mcm9tX3Byb3BlcnRpZXMoc3RydWN0IGRlbW8gKmRlbW8sIHVpbnQzMl90IHR5cGVCaXRzLCBWa0ZsYWdzIHJlcXVpcmVtZW50c19tYXNrLCB1aW50MzJfdCAqdHlwZUluZGV4KSB7CisgICAgLy8gU2VhcmNoIG1lbXR5cGVzIHRvIGZpbmQgZmlyc3QgaW5kZXggd2l0aCB0aG9zZSBwcm9wZXJ0aWVzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9NRU1PUllfVFlQRVM7IGkrKykgeworICAgICAgICBpZiAoKHR5cGVCaXRzICYgMSkgPT0gMSkgeworICAgICAgICAgICAgLy8gVHlwZSBpcyBhdmFpbGFibGUsIGRvZXMgaXQgbWF0Y2ggdXNlciBwcm9wZXJ0aWVzPworICAgICAgICAgICAgaWYgKChkZW1vLT5tZW1vcnlfcHJvcGVydGllcy5tZW1vcnlUeXBlc1tpXS5wcm9wZXJ0eUZsYWdzICYgcmVxdWlyZW1lbnRzX21hc2spID09IHJlcXVpcmVtZW50c19tYXNrKSB7CisgICAgICAgICAgICAgICAgKnR5cGVJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHlwZUJpdHMgPj49IDE7CisgICAgfQorICAgIC8vIE5vIG1lbW9yeSB0eXBlcyBtYXRjaGVkLCByZXR1cm4gZmFpbHVyZQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgZGVtb19mbHVzaF9pbml0X2NtZChzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIFZrUmVzdWx0IFVfQVNTRVJUX09OTFkgZXJyOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBjb3VsZCBnZXQgY2FsbGVkIHR3aWNlIGlmIHRoZSB0ZXh0dXJlIHVzZXMgYSBzdGFnaW5nIGJ1ZmZlcgorICAgIC8vIEluIHRoYXQgY2FzZSB0aGUgc2Vjb25kIGNhbGwgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICBpZiAoZGVtby0+Y21kID09IFZLX05VTExfSEFORExFKSByZXR1cm47CisKKyAgICBlcnIgPSB2a0VuZENvbW1hbmRCdWZmZXIoZGVtby0+Y21kKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZlbmNlX2NpID0gey5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPLCAucE5leHQgPSBOVUxMLCAuZmxhZ3MgPSAwfTsKKyAgICBlcnIgPSB2a0NyZWF0ZUZlbmNlKGRlbW8tPmRldmljZSwgJmZlbmNlX2NpLCBOVUxMLCAmZmVuY2UpOworICAgIGFzc2VydCghZXJyKTsKKworICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciBjbWRfYnVmc1tdID0ge2RlbW8tPmNtZH07CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0gey5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2FpdFNlbWFwaG9yZUNvdW50ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBXYWl0U2VtYXBob3JlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wV2FpdERzdFN0YWdlTWFzayA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21tYW5kQnVmZmVyQ291bnQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucENvbW1hbmRCdWZmZXJzID0gY21kX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEx9OworCisgICAgZXJyID0gdmtRdWV1ZVN1Ym1pdChkZW1vLT5ncmFwaGljc19xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBmZW5jZSk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgZXJyID0gdmtXYWl0Rm9yRmVuY2VzKGRlbW8tPmRldmljZSwgMSwgJmZlbmNlLCBWS19UUlVFLCBVSU5UNjRfTUFYKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICB2a0ZyZWVDb21tYW5kQnVmZmVycyhkZW1vLT5kZXZpY2UsIGRlbW8tPmNtZF9wb29sLCAxLCBjbWRfYnVmcyk7CisgICAgdmtEZXN0cm95RmVuY2UoZGVtby0+ZGV2aWNlLCBmZW5jZSwgTlVMTCk7CisgICAgZGVtby0+Y21kID0gVktfTlVMTF9IQU5ETEU7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fc2V0X2ltYWdlX2xheW91dChzdHJ1Y3QgZGVtbyAqZGVtbywgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2ssIFZrSW1hZ2VMYXlvdXQgb2xkX2ltYWdlX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IG5ld19pbWFnZV9sYXlvdXQsIFZrQWNjZXNzRmxhZ0JpdHMgc3JjQWNjZXNzTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjX3N0YWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkZXN0X3N0YWdlcykgeworICAgIGFzc2VydChkZW1vLT5jbWQpOworCisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1hZ2VfbWVtb3J5X2JhcnJpZXIgPSB7LnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3JjQWNjZXNzTWFzayA9IHNyY0FjY2Vzc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRzdEFjY2Vzc01hc2sgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcmNRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2xkTGF5b3V0ID0gb2xkX2ltYWdlX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV3TGF5b3V0ID0gbmV3X2ltYWdlX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW1hZ2UgPSBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3VicmVzb3VyY2VSYW5nZSA9IHthc3BlY3RNYXNrLCAwLCAxLCAwLCAxfX07CisKKyAgICBzd2l0Y2ggKG5ld19pbWFnZV9sYXlvdXQpIHsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw6CisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgYW55dGhpbmcgdGhhdCB3YXMgY29weWluZyBmcm9tIHRoaXMgaW1hZ2UgaGFzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgaW1hZ2VfbWVtb3J5X2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19UUkFOU0ZFUl9XUklURV9CSVQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw6CisgICAgICAgICAgICBpbWFnZV9tZW1vcnlfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw6CisgICAgICAgICAgICBpbWFnZV9tZW1vcnlfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9XUklURV9CSVQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw6CisgICAgICAgICAgICBpbWFnZV9tZW1vcnlfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1NIQURFUl9SRUFEX0JJVCB8IFZLX0FDQ0VTU19JTlBVVF9BVFRBQ0hNRU5UX1JFQURfQklUOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw6CisgICAgICAgICAgICBpbWFnZV9tZW1vcnlfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklUOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSOgorICAgICAgICAgICAgaW1hZ2VfbWVtb3J5X2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19NRU1PUllfUkVBRF9CSVQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaW1hZ2VfbWVtb3J5X2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciAqcG1lbW9yeV9iYXJyaWVyID0gJmltYWdlX21lbW9yeV9iYXJyaWVyOworCisgICAgdmtDbWRQaXBlbGluZUJhcnJpZXIoZGVtby0+Y21kLCBzcmNfc3RhZ2VzLCBkZXN0X3N0YWdlcywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgMSwgcG1lbW9yeV9iYXJyaWVyKTsKK30KKworc3RhdGljIHZvaWQgZGVtb19kcmF3X2J1aWxkX2NtZChzdHJ1Y3QgZGVtbyAqZGVtbywgVmtDb21tYW5kQnVmZmVyIGNtZF9idWYpIHsKKyAgICBWa0RlYnVnVXRpbHNMYWJlbEVYVCBsYWJlbDsKKyAgICBtZW1zZXQoJmxhYmVsLCAwLCBzaXplb2YobGFiZWwpKTsKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY21kX2J1Zl9pbmZvID0geworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPLAorICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAuZmxhZ3MgPSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCwKKyAgICAgICAgLnBJbmhlcml0YW5jZUluZm8gPSBOVUxMLAorICAgIH07CisgICAgY29uc3QgVmtDbGVhclZhbHVlIGNsZWFyX3ZhbHVlc1syXSA9IHsKKyAgICAgICAgWzBdID0gey5jb2xvci5mbG9hdDMyID0gezAuMmYsIDAuMmYsIDAuMmYsIDAuMmZ9fSwKKyAgICAgICAgWzFdID0gey5kZXB0aFN0ZW5jaWwgPSB7MS4wZiwgMH19LAorICAgIH07CisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJwX2JlZ2luID0geworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLAorICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAucmVuZGVyUGFzcyA9IGRlbW8tPnJlbmRlcl9wYXNzLAorICAgICAgICAuZnJhbWVidWZmZXIgPSBkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2RlbW8tPmN1cnJlbnRfYnVmZmVyXS5mcmFtZWJ1ZmZlciwKKyAgICAgICAgLnJlbmRlckFyZWEub2Zmc2V0LnggPSAwLAorICAgICAgICAucmVuZGVyQXJlYS5vZmZzZXQueSA9IDAsCisgICAgICAgIC5yZW5kZXJBcmVhLmV4dGVudC53aWR0aCA9IGRlbW8tPndpZHRoLAorICAgICAgICAucmVuZGVyQXJlYS5leHRlbnQuaGVpZ2h0ID0gZGVtby0+aGVpZ2h0LAorICAgICAgICAuY2xlYXJWYWx1ZUNvdW50ID0gMiwKKyAgICAgICAgLnBDbGVhclZhbHVlcyA9IGNsZWFyX3ZhbHVlcywKKyAgICB9OworICAgIFZrUmVzdWx0IFVfQVNTRVJUX09OTFkgZXJyOworCisgICAgZXJyID0gdmtCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZiwgJmNtZF9idWZfaW5mbyk7CisKKyAgICBpZiAoZGVtby0+dmFsaWRhdGUpIHsKKyAgICAgICAgLy8gU2V0IGEgbmFtZSBmb3IgdGhlIGNvbW1hbmQgYnVmZmVyCisgICAgICAgIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIGNtZF9idWZfbmFtZSA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9OQU1FX0lORk9fRVhULAorICAgICAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgICAgIC5vYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVIsCisgICAgICAgICAgICAub2JqZWN0SGFuZGxlID0gKHVpbnQ2NF90KWNtZF9idWYsCisgICAgICAgICAgICAucE9iamVjdE5hbWUgPSAiQ3ViZURyYXdDb21tYW5kQnVmIiwKKyAgICAgICAgfTsKKyAgICAgICAgZGVtby0+U2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoZGVtby0+ZGV2aWNlLCAmY21kX2J1Zl9uYW1lKTsKKworICAgICAgICBsYWJlbC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX0xBQkVMX0VYVDsKKyAgICAgICAgbGFiZWwucE5leHQgPSBOVUxMOworICAgICAgICBsYWJlbC5wTGFiZWxOYW1lID0gIkRyYXdCZWdpbiI7CisgICAgICAgIGxhYmVsLmNvbG9yWzBdID0gMC40ZjsKKyAgICAgICAgbGFiZWwuY29sb3JbMV0gPSAwLjNmOworICAgICAgICBsYWJlbC5jb2xvclsyXSA9IDAuMmY7CisgICAgICAgIGxhYmVsLmNvbG9yWzNdID0gMC4xZjsKKyAgICAgICAgZGVtby0+Q21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoY21kX2J1ZiwgJmxhYmVsKTsKKyAgICB9CisKKyAgICBhc3NlcnQoIWVycik7CisgICAgdmtDbWRCZWdpblJlbmRlclBhc3MoY21kX2J1ZiwgJnJwX2JlZ2luLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisKKyAgICBpZiAoZGVtby0+dmFsaWRhdGUpIHsKKyAgICAgICAgbGFiZWwuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQ7CisgICAgICAgIGxhYmVsLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgbGFiZWwucExhYmVsTmFtZSA9ICJJbnNpZGVSZW5kZXJQYXNzIjsKKyAgICAgICAgbGFiZWwuY29sb3JbMF0gPSA4LjRmOworICAgICAgICBsYWJlbC5jb2xvclsxXSA9IDcuM2Y7CisgICAgICAgIGxhYmVsLmNvbG9yWzJdID0gNi4yZjsKKyAgICAgICAgbGFiZWwuY29sb3JbM10gPSA3LjFmOworICAgICAgICBkZW1vLT5DbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVChjbWRfYnVmLCAmbGFiZWwpOworICAgIH0KKworICAgIHZrQ21kQmluZFBpcGVsaW5lKGNtZF9idWYsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIGRlbW8tPnBpcGVsaW5lKTsKKyAgICB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cyhjbWRfYnVmLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBkZW1vLT5waXBlbGluZV9sYXlvdXQsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbZGVtby0+Y3VycmVudF9idWZmZXJdLmRlc2NyaXB0b3Jfc2V0LCAwLCBOVUxMKTsKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0OworICAgIG1lbXNldCgmdmlld3BvcnQsIDAsIHNpemVvZih2aWV3cG9ydCkpOworICAgIGZsb2F0IHZpZXdwb3J0X2RpbWVuc2lvbjsKKyAgICBpZiAoZGVtby0+d2lkdGggPCBkZW1vLT5oZWlnaHQpIHsKKyAgICAgICAgdmlld3BvcnRfZGltZW5zaW9uID0gKGZsb2F0KWRlbW8tPndpZHRoOworICAgICAgICB2aWV3cG9ydC55ID0gKGRlbW8tPmhlaWdodCAtIGRlbW8tPndpZHRoKSAvIDIuMGY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmlld3BvcnRfZGltZW5zaW9uID0gKGZsb2F0KWRlbW8tPmhlaWdodDsKKyAgICAgICAgdmlld3BvcnQueCA9IChkZW1vLT53aWR0aCAtIGRlbW8tPmhlaWdodCkgLyAyLjBmOworICAgIH0KKyAgICB2aWV3cG9ydC5oZWlnaHQgPSB2aWV3cG9ydF9kaW1lbnNpb247CisgICAgdmlld3BvcnQud2lkdGggPSB2aWV3cG9ydF9kaW1lbnNpb247CisgICAgdmlld3BvcnQubWluRGVwdGggPSAoZmxvYXQpMC4wZjsKKyAgICB2aWV3cG9ydC5tYXhEZXB0aCA9IChmbG9hdCkxLjBmOworICAgIHZrQ21kU2V0Vmlld3BvcnQoY21kX2J1ZiwgMCwgMSwgJnZpZXdwb3J0KTsKKworICAgIFZrUmVjdDJEIHNjaXNzb3I7CisgICAgbWVtc2V0KCZzY2lzc29yLCAwLCBzaXplb2Yoc2Npc3NvcikpOworICAgIHNjaXNzb3IuZXh0ZW50LndpZHRoID0gZGVtby0+d2lkdGg7CisgICAgc2Npc3Nvci5leHRlbnQuaGVpZ2h0ID0gZGVtby0+aGVpZ2h0OworICAgIHNjaXNzb3Iub2Zmc2V0LnggPSAwOworICAgIHNjaXNzb3Iub2Zmc2V0LnkgPSAwOworICAgIHZrQ21kU2V0U2Npc3NvcihjbWRfYnVmLCAwLCAxLCAmc2Npc3Nvcik7CisKKyAgICBpZiAoZGVtby0+dmFsaWRhdGUpIHsKKyAgICAgICAgbGFiZWwuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQ7CisgICAgICAgIGxhYmVsLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgbGFiZWwucExhYmVsTmFtZSA9ICJBY3R1YWxEcmF3IjsKKyAgICAgICAgbGFiZWwuY29sb3JbMF0gPSAtMC40ZjsKKyAgICAgICAgbGFiZWwuY29sb3JbMV0gPSAtMC4zZjsKKyAgICAgICAgbGFiZWwuY29sb3JbMl0gPSAtMC4yZjsKKyAgICAgICAgbGFiZWwuY29sb3JbM10gPSAtMC4xZjsKKyAgICAgICAgZGVtby0+Q21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoY21kX2J1ZiwgJmxhYmVsKTsKKyAgICB9CisKKyAgICB2a0NtZERyYXcoY21kX2J1ZiwgMTIgKiAzLCAxLCAwLCAwKTsKKyAgICBpZiAoZGVtby0+dmFsaWRhdGUpIHsKKyAgICAgICAgZGVtby0+Q21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKGNtZF9idWYpOworICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCBlbmRpbmcgdGhlIHJlbmRlcnBhc3MgY2hhbmdlcyB0aGUgaW1hZ2UncyBsYXlvdXQgZnJvbQorICAgIC8vIENPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCB0byBQUkVTRU5UX1NSQ19LSFIKKyAgICB2a0NtZEVuZFJlbmRlclBhc3MoY21kX2J1Zik7CisgICAgaWYgKGRlbW8tPnZhbGlkYXRlKSB7CisgICAgICAgIGRlbW8tPkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVChjbWRfYnVmKTsKKyAgICB9CisKKyAgICBpZiAoZGVtby0+c2VwYXJhdGVfcHJlc2VudF9xdWV1ZSkgeworICAgICAgICAvLyBXZSBoYXZlIHRvIHRyYW5zZmVyIG93bmVyc2hpcCBmcm9tIHRoZSBncmFwaGljcyBxdWV1ZSBmYW1pbHkgdG8gdGhlCisgICAgICAgIC8vIHByZXNlbnQgcXVldWUgZmFtaWx5IHRvIGJlIGFibGUgdG8gcHJlc2VudC4gIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlCisgICAgICAgIC8vIHRvIHRyYW5zZmVyIGZyb20gcHJlc2VudCBxdWV1ZSBmYW1pbHkgYmFjayB0byBncmFwaGljcyBxdWV1ZSBmYW1pbHkgYXQKKyAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGZyYW1lIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgaW1hZ2UncworICAgICAgICAvLyBjb250ZW50cyBhdCB0aGF0IHBvaW50LgorICAgICAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWFnZV9vd25lcnNoaXBfYmFycmllciA9IHsuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNyY0FjY2Vzc01hc2sgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZHN0QWNjZXNzTWFzayA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBkZW1vLT5ncmFwaGljc19xdWV1ZV9mYW1pbHlfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kc3RRdWV1ZUZhbWlseUluZGV4ID0gZGVtby0+cHJlc2VudF9xdWV1ZV9mYW1pbHlfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbWFnZSA9IGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbZGVtby0+Y3VycmVudF9idWZmZXJdLmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3VicmVzb3VyY2VSYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAxfX07CisKKyAgICAgICAgdmtDbWRQaXBlbGluZUJhcnJpZXIoY21kX2J1ZiwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsIDAsIDAsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDEsICZpbWFnZV9vd25lcnNoaXBfYmFycmllcik7CisgICAgfQorICAgIGlmIChkZW1vLT52YWxpZGF0ZSkgeworICAgICAgICBkZW1vLT5DbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoY21kX2J1Zik7CisgICAgfQorICAgIGVyciA9IHZrRW5kQ29tbWFuZEJ1ZmZlcihjbWRfYnVmKTsKKyAgICBhc3NlcnQoIWVycik7Cit9CisKK3ZvaWQgZGVtb19idWlsZF9pbWFnZV9vd25lcnNoaXBfY21kKHN0cnVjdCBkZW1vICpkZW1vLCBpbnQgaSkgeworICAgIFZrUmVzdWx0IFVfQVNTRVJUX09OTFkgZXJyOworCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNtZF9idWZfaW5mbyA9IHsKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTywKKyAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgLmZsYWdzID0gVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQsCisgICAgICAgIC5wSW5oZXJpdGFuY2VJbmZvID0gTlVMTCwKKyAgICB9OworICAgIGVyciA9IHZrQmVnaW5Db21tYW5kQnVmZmVyKGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uZ3JhcGhpY3NfdG9fcHJlc2VudF9jbWQsICZjbWRfYnVmX2luZm8pOworICAgIGFzc2VydCghZXJyKTsKKworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltYWdlX293bmVyc2hpcF9iYXJyaWVyID0gey5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNyY0FjY2Vzc01hc2sgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kc3RBY2Nlc3NNYXNrID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3JjUXVldWVGYW1pbHlJbmRleCA9IGRlbW8tPmdyYXBoaWNzX3F1ZXVlX2ZhbWlseV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZHN0UXVldWVGYW1pbHlJbmRleCA9IGRlbW8tPnByZXNlbnRfcXVldWVfZmFtaWx5X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbWFnZSA9IGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnJlc291cmNlUmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMX19OworCisgICAgdmtDbWRQaXBlbGluZUJhcnJpZXIoZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5ncmFwaGljc190b19wcmVzZW50X2NtZCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCwgMCwgMCwgTlVMTCwgMCwgTlVMTCwgMSwgJmltYWdlX293bmVyc2hpcF9iYXJyaWVyKTsKKyAgICBlcnIgPSB2a0VuZENvbW1hbmRCdWZmZXIoZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5ncmFwaGljc190b19wcmVzZW50X2NtZCk7CisgICAgYXNzZXJ0KCFlcnIpOworfQorCit2b2lkIGRlbW9fdXBkYXRlX2RhdGFfYnVmZmVyKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgbWF0NHg0IE1WUCwgTW9kZWwsIFZQOworICAgIGludCBtYXRyaXhTaXplID0gc2l6ZW9mKE1WUCk7CisgICAgdWludDhfdCAqcERhdGE7CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisKKyAgICBtYXQ0eDRfbXVsKFZQLCBkZW1vLT5wcm9qZWN0aW9uX21hdHJpeCwgZGVtby0+dmlld19tYXRyaXgpOworCisgICAgLy8gUm90YXRlIGFyb3VuZCB0aGUgWSBheGlzCisgICAgbWF0NHg0X2R1cChNb2RlbCwgZGVtby0+bW9kZWxfbWF0cml4KTsKKyAgICBtYXQ0eDRfcm90YXRlKGRlbW8tPm1vZGVsX21hdHJpeCwgTW9kZWwsIDAuMGYsIDEuMGYsIDAuMGYsIChmbG9hdClkZWdyZWVzVG9SYWRpYW5zKGRlbW8tPnNwaW5fYW5nbGUpKTsKKyAgICBtYXQ0eDRfbXVsKE1WUCwgVlAsIGRlbW8tPm1vZGVsX21hdHJpeCk7CisKKyAgICBlcnIgPSB2a01hcE1lbW9yeShkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbZGVtby0+Y3VycmVudF9idWZmZXJdLnVuaWZvcm1fbWVtb3J5LCAwLCBWS19XSE9MRV9TSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwRGF0YSk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgbWVtY3B5KHBEYXRhLCAoY29uc3Qgdm9pZCAqKSZNVlBbMF1bMF0sIG1hdHJpeFNpemUpOworCisgICAgdmtVbm1hcE1lbW9yeShkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbZGVtby0+Y3VycmVudF9idWZmZXJdLnVuaWZvcm1fbWVtb3J5KTsKK30KKwordm9pZCBEZW1vVXBkYXRlVGFyZ2V0SVBEKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgLy8gTG9vayBhdCB3aGF0IGhhcHBlbmVkIHRvIHByZXZpb3VzIHByZXNlbnRzLCBhbmQgbWFrZSBhcHByb3ByaWF0ZQorICAgIC8vIGFkanVzdG1lbnRzIGluIHRpbWluZzoKKyAgICBWa1Jlc3VsdCBVX0FTU0VSVF9PTkxZIGVycjsKKyAgICBWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgKnBhc3QgPSBOVUxMOworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKworICAgIGVyciA9IGRlbW8tPmZwR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRShkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbiwgJmNvdW50LCBOVUxMKTsKKyAgICBhc3NlcnQoIWVycik7CisgICAgaWYgKGNvdW50KSB7CisgICAgICAgIHBhc3QgPSAoVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFICopbWFsbG9jKHNpemVvZihWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUpICogY291bnQpOworICAgICAgICBhc3NlcnQocGFzdCk7CisgICAgICAgIGVyciA9IGRlbW8tPmZwR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRShkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbiwgJmNvdW50LCBwYXN0KTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworCisgICAgICAgIGJvb2wgZWFybHkgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBsYXRlID0gZmFsc2U7CisgICAgICAgIGJvb2wgY2FsaWJyYXRlX25leHQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghZGVtby0+c3luY2Rfd2l0aF9hY3R1YWxfcHJlc2VudHMpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoYXQgd2UndmUgcmVjZWl2ZWQgYW4KKyAgICAgICAgICAgICAgICAvLyBhY3R1YWxQcmVzZW50VGltZSBmb3IgdGhpcyBzd2FwY2hhaW4uICBJbiBvcmRlciB0byBub3QKKyAgICAgICAgICAgICAgICAvLyBwZXJjZWl2ZSB0aGVzZSBlYXJseSBmcmFtZXMgYXMgImxhdGUiLCB3ZSBuZWVkIHRvIHN5bmMtdXAKKyAgICAgICAgICAgICAgICAvLyBvdXIgZnV0dXJlIGRlc2lyZWRQcmVzZW50VGltZSdzIHdpdGggdGhlCisgICAgICAgICAgICAgICAgLy8gYWN0dWFsUHJlc2VudFRpbWUocykgdGhhdCB3ZSdyZSByZWNlaXZpbmcgbm93LgorICAgICAgICAgICAgICAgIGNhbGlicmF0ZV9uZXh0ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIC8vIFNvIHRoYXQgd2UgZG9uJ3Qgc3VzcGVjdCBhbnkgcGVuZGluZyBwcmVzZW50cyBhcyBsYXRlLAorICAgICAgICAgICAgICAgIC8vIHJlY29yZCB0aGVtIGFsbCBhcyBzdXNwZWN0ZWQtbGF0ZSBwcmVzZW50czoKKyAgICAgICAgICAgICAgICBkZW1vLT5sYXN0X2xhdGVfaWQgPSBkZW1vLT5uZXh0X3ByZXNlbnRfaWQgLSAxOworICAgICAgICAgICAgICAgIGRlbW8tPmxhc3RfZWFybHlfaWQgPSAwOworICAgICAgICAgICAgICAgIGRlbW8tPnN5bmNkX3dpdGhfYWN0dWFsX3ByZXNlbnRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQ2FuUHJlc2VudEVhcmxpZXIocGFzdFtpXS5lYXJsaWVzdFByZXNlbnRUaW1lLCBwYXN0W2ldLmFjdHVhbFByZXNlbnRUaW1lLCBwYXN0W2ldLnByZXNlbnRNYXJnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW8tPnJlZnJlc2hfZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpbWFnZSBjb3VsZCBoYXZlIGJlZW4gcHJlc2VudGVkIGVhcmxpZXIuICBXZSBkb24ndCB3YW50CisgICAgICAgICAgICAgICAgLy8gdG8gZGVjcmVhc2UgdGhlIHRhcmdldF9JUEQgdW50aWwgd2UndmUgc2VlbiBlYXJseSBwcmVzZW50cworICAgICAgICAgICAgICAgIC8vIGZvciBhdCBsZWFzdCB0d28gc2Vjb25kcy4KKyAgICAgICAgICAgICAgICBpZiAoZGVtby0+bGFzdF9lYXJseV9pZCA9PSBwYXN0W2ldLnByZXNlbnRJRCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBub3cgc2VlbiB0d28gc2Vjb25kcyB3b3J0aCBvZiBlYXJseSBwcmVzZW50cy4KKyAgICAgICAgICAgICAgICAgICAgLy8gRmxhZyBpdCBhcyBzdWNoLCBhbmQgcmVzZXQgdGhlIGNvdW50ZXI6CisgICAgICAgICAgICAgICAgICAgIGVhcmx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZGVtby0+bGFzdF9lYXJseV9pZCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZW1vLT5sYXN0X2Vhcmx5X2lkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWFybHkgcHJlc2VudCB3ZSd2ZSBzZWVuLgorICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHByZXNlbnRJRCBmb3IgdHdvIHNlY29uZHMgZnJvbSBub3cuCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGxhc3RFYXJseVRpbWUgPSBwYXN0W2ldLmFjdHVhbFByZXNlbnRUaW1lICsgKDIgKiBCSUxMSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaG93TWFueVByZXNlbnRzID0gKHVpbnQzMl90KSgobGFzdEVhcmx5VGltZSAtIHBhc3RbaV0uYWN0dWFsUHJlc2VudFRpbWUpIC8gZGVtby0+dGFyZ2V0X0lQRCk7CisgICAgICAgICAgICAgICAgICAgIGRlbW8tPmxhc3RfZWFybHlfaWQgPSBwYXN0W2ldLnByZXNlbnRJRCArIGhvd01hbnlQcmVzZW50czsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGhlIG1pZHN0IG9mIGEgc2V0IG9mIGVhcmx5IGltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHNvIHdlIHdvbid0IGRvIGFueXRoaW5nLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZGVtby0+bGFzdF9sYXRlX2lkID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQWN0dWFsVGltZUxhdGUocGFzdFtpXS5kZXNpcmVkUHJlc2VudFRpbWUsIHBhc3RbaV0uYWN0dWFsUHJlc2VudFRpbWUsIGRlbW8tPnJlZnJlc2hfZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpbWFnZSB3YXMgcHJlc2VudGVkIGFmdGVyIGl0cyBkZXNpcmVkIHRpbWUuICBTaW5jZQorICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBkZWxheSBiZXR3ZWVuIGNhbGxpbmcgdmtRdWV1ZVByZXNlbnRLSFIgYW5kIHdoZW4KKyAgICAgICAgICAgICAgICAvLyB3ZSBnZXQgdGhlIHRpbWluZyBkYXRhLCBzZXZlcmFsIHByZXNlbnRzIG1heSBoYXZlIGJlZW4gbGF0ZS4KKyAgICAgICAgICAgICAgICAvLyBUaHVzLCB3ZSBuZWVkIHRvIHRocmVhdCBhbGwgb2YgdGhlIG91dHN0YW5kaW5nIHByZXNlbnRzIGFzCisgICAgICAgICAgICAgICAgLy8gYmVpbmcgbGlrZWx5IGxhdGUsIHNvIHRoYXQgd2Ugb25seSBpbmNyZWFzZSB0aGUgdGFyZ2V0X0lQRAorICAgICAgICAgICAgICAgIC8vIG9uY2UgZm9yIGFsbCBvZiB0aG9zZSBwcmVzZW50cy4KKyAgICAgICAgICAgICAgICBpZiAoKGRlbW8tPmxhc3RfbGF0ZV9pZCA9PSAwKSB8fCAoZGVtby0+bGFzdF9sYXRlX2lkIDwgcGFzdFtpXS5wcmVzZW50SUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGxhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgdGhlIGxhc3Qgc3VzcGVjdGVkLWxhdGUgcHJlc2VudDoKKyAgICAgICAgICAgICAgICAgICAgZGVtby0+bGFzdF9sYXRlX2lkID0gZGVtby0+bmV4dF9wcmVzZW50X2lkIC0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGhlIG1pZHN0IG9mIGEgc2V0IG9mIGxpa2VseS1sYXRlIGltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHNvIHdlIHdvbid0IGRvIGFueXRoaW5nLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlYXJseSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGRlbW8tPmxhc3RfZWFybHlfaWQgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGltYWdlIHdhcyBub3QgcHJlc2VudGVkIGVhcmx5IG9yIGxhdGUsIHJlc2V0CisgICAgICAgICAgICAgICAgLy8gYW55IHNldHMgb2YgZWFybHkgb3IgbGF0ZSBwcmVzZW50SURzOgorICAgICAgICAgICAgICAgIGVhcmx5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNhbGlicmF0ZV9uZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkZW1vLT5sYXN0X2Vhcmx5X2lkID0gMDsKKyAgICAgICAgICAgICAgICBkZW1vLT5sYXN0X2xhdGVfaWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVhcmx5KSB7CisgICAgICAgICAgICAvLyBTaW5jZSB3ZSd2ZSBzZWVuIGF0IGxlYXN0IHR3by1zZWNvbmRzIHdvcnRoIG9mIHByZXNudHMgdGhhdAorICAgICAgICAgICAgLy8gY291bGQgaGF2ZSBvY2N1cmVkIGVhcmxpZXIgdGhhbiBkZXNpcmVkLCBsZXQncyBkZWNyZWFzZSB0aGUKKyAgICAgICAgICAgIC8vIHRhcmdldF9JUEQgKGkuZS4gaW5jcmVhc2UgdGhlIGZyYW1lIHJhdGUpOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRPRE8oaWFuZWxsaW90dCk6IFRyeSB0byBjYWxjdWxhdGUgYSBiZXR0ZXIgdGFyZ2V0X0lQRCBiYXNlZAorICAgICAgICAgICAgLy8gb24gdGhlIG1vc3QgcmVjZW50bHktc2VlbiBwcmVzZW50ICh0aGlzIGlzIG92ZXJseS1zaW1wbGlzdGljKS4KKyAgICAgICAgICAgIGRlbW8tPnJlZnJlc2hfZHVyYXRpb25fbXVsdGlwbGllci0tOworICAgICAgICAgICAgaWYgKGRlbW8tPnJlZnJlc2hfZHVyYXRpb25fbXVsdGlwbGllciA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgaW4gY2FzZSBpdCBkb2VzLCBkb24ndAorICAgICAgICAgICAgICAgIC8vIHRyeSB0byBnbyBmYXN0ZXIuCisgICAgICAgICAgICAgICAgZGVtby0+cmVmcmVzaF9kdXJhdGlvbl9tdWx0aXBsaWVyID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbW8tPnRhcmdldF9JUEQgPSBkZW1vLT5yZWZyZXNoX2R1cmF0aW9uICogZGVtby0+cmVmcmVzaF9kdXJhdGlvbl9tdWx0aXBsaWVyOworICAgICAgICB9CisgICAgICAgIGlmIChsYXRlKSB7CisgICAgICAgICAgICAvLyBTaW5jZSB3ZSBmb3VuZCBhIG5ldyBpbnN0YW5jZSBvZiBhIGxhdGUgcHJlc2VudCwgd2Ugd2FudCB0bworICAgICAgICAgICAgLy8gaW5jcmVhc2UgdGhlIHRhcmdldF9JUEQgKGkuZS4gZGVjcmVhc2UgdGhlIGZyYW1lIHJhdGUpOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRPRE8oaWFuZWxsaW90dCk6IFRyeSB0byBjYWxjdWxhdGUgYSBiZXR0ZXIgdGFyZ2V0X0lQRCBiYXNlZAorICAgICAgICAgICAgLy8gb24gdGhlIG1vc3QgcmVjZW50bHktc2VlbiBwcmVzZW50ICh0aGlzIGlzIG92ZXJseS1zaW1wbGlzdGljKS4KKyAgICAgICAgICAgIGRlbW8tPnJlZnJlc2hfZHVyYXRpb25fbXVsdGlwbGllcisrOworICAgICAgICAgICAgZGVtby0+dGFyZ2V0X0lQRCA9IGRlbW8tPnJlZnJlc2hfZHVyYXRpb24gKiBkZW1vLT5yZWZyZXNoX2R1cmF0aW9uX211bHRpcGxpZXI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FsaWJyYXRlX25leHQpIHsKKyAgICAgICAgICAgIGludDY0X3QgbXVsdGlwbGUgPSBkZW1vLT5uZXh0X3ByZXNlbnRfaWQgLSBwYXN0W2NvdW50IC0gMV0ucHJlc2VudElEOworICAgICAgICAgICAgZGVtby0+cHJldl9kZXNpcmVkX3ByZXNlbnRfdGltZSA9IChwYXN0W2NvdW50IC0gMV0uYWN0dWFsUHJlc2VudFRpbWUgKyAobXVsdGlwbGUgKiBkZW1vLT50YXJnZXRfSVBEKSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShwYXN0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fZHJhdyhzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIFZrUmVzdWx0IFVfQVNTRVJUX09OTFkgZXJyOworCisgICAgLy8gRW5zdXJlIG5vIG1vcmUgdGhhbiBGUkFNRV9MQUcgcmVuZGVyaW5ncyBhcmUgb3V0c3RhbmRpbmcKKyAgICB2a1dhaXRGb3JGZW5jZXMoZGVtby0+ZGV2aWNlLCAxLCAmZGVtby0+ZmVuY2VzW2RlbW8tPmZyYW1lX2luZGV4XSwgVktfVFJVRSwgVUlOVDY0X01BWCk7CisgICAgdmtSZXNldEZlbmNlcyhkZW1vLT5kZXZpY2UsIDEsICZkZW1vLT5mZW5jZXNbZGVtby0+ZnJhbWVfaW5kZXhdKTsKKworICAgIGRvIHsKKyAgICAgICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgc3dhcGNoYWluIGltYWdlOgorICAgICAgICBlcnIgPQorICAgICAgICAgICAgZGVtby0+ZnBBY3F1aXJlTmV4dEltYWdlS0hSKGRlbW8tPmRldmljZSwgZGVtby0+c3dhcGNoYWluLCBVSU5UNjRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW8tPmltYWdlX2FjcXVpcmVkX3NlbWFwaG9yZXNbZGVtby0+ZnJhbWVfaW5kZXhdLCBWS19OVUxMX0hBTkRMRSwgJmRlbW8tPmN1cnJlbnRfYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyID09IFZLX0VSUk9SX09VVF9PRl9EQVRFX0tIUikgeworICAgICAgICAgICAgLy8gZGVtby0+c3dhcGNoYWluIGlzIG91dCBvZiBkYXRlIChlLmcuIHRoZSB3aW5kb3cgd2FzIHJlc2l6ZWQpIGFuZAorICAgICAgICAgICAgLy8gbXVzdCBiZSByZWNyZWF0ZWQ6CisgICAgICAgICAgICBkZW1vX3Jlc2l6ZShkZW1vKTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gVktfU1VCT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgIC8vIGRlbW8tPnN3YXBjaGFpbiBpcyBub3QgYXMgb3B0aW1hbCBhcyBpdCBjb3VsZCBiZSwgYnV0IHRoZSBwbGF0Zm9ybSdzCisgICAgICAgICAgICAvLyBwcmVzZW50YXRpb24gZW5naW5lIHdpbGwgc3RpbGwgcHJlc2VudCB0aGUgaW1hZ2UgY29ycmVjdGx5LgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIpIHsKKyAgICAgICAgICAgIHZrRGVzdHJveVN1cmZhY2VLSFIoZGVtby0+aW5zdCwgZGVtby0+c3VyZmFjZSwgTlVMTCk7CisgICAgICAgICAgICBkZW1vX2NyZWF0ZV9zdXJmYWNlKGRlbW8pOworICAgICAgICAgICAgZGVtb19yZXNpemUoZGVtbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoIWVycik7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChlcnIgIT0gVktfU1VDQ0VTUyk7CisKKyAgICBkZW1vX3VwZGF0ZV9kYXRhX2J1ZmZlcihkZW1vKTsKKworICAgIGlmIChkZW1vLT5WS19HT09HTEVfZGlzcGxheV90aW1pbmdfZW5hYmxlZCkgeworICAgICAgICAvLyBMb29rIGF0IHdoYXQgaGFwcGVuZWQgdG8gcHJldmlvdXMgcHJlc2VudHMsIGFuZCBtYWtlIGFwcHJvcHJpYXRlCisgICAgICAgIC8vIGFkanVzdG1lbnRzIGluIHRpbWluZzoKKyAgICAgICAgRGVtb1VwZGF0ZVRhcmdldElQRChkZW1vKTsKKworICAgICAgICAvLyBOb3RlOiBhIHJlYWwgYXBwbGljYXRpb24gd291bGQgcG9zaXRpb24gaXRzIGdlb21ldHJ5IHRvIHRoYXQgaXQncyBpbgorICAgICAgICAvLyB0aGUgY29ycmVjdCBsb2NhdG9pbiBmb3Igd2hlbiB0aGUgbmV4dCBpbWFnZSBpcyBwcmVzZW50ZWQuICBJdCBtaWdodAorICAgICAgICAvLyBhbHNvIHdhaXQsIHNvIHRoYXQgdGhlcmUncyBsZXNzIGxhdGVuY3kgYmV0d2VlbiBhbnkgaW5wdXQgYW5kIHdoZW4KKyAgICAgICAgLy8gdGhlIG5leHQgaW1hZ2UgaXMgcmVuZGVyZWQvcHJlc2VudGVkLiAgVGhpcyBkZW1vIHByb2dyYW0gaXMgc28KKyAgICAgICAgLy8gc2ltcGxlIHRoYXQgaXQgZG9lc24ndCBkbyBlaXRoZXIgb2YgdGhvc2UuCisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgdGhlIGltYWdlIGFjcXVpcmVkIHNlbWFwaG9yZSB0byBiZSBzaWduYWxlZCB0byBlbnN1cmUKKyAgICAvLyB0aGF0IHRoZSBpbWFnZSB3b24ndCBiZSByZW5kZXJlZCB0byB1bnRpbCB0aGUgcHJlc2VudGF0aW9uCisgICAgLy8gZW5naW5lIGhhcyBmdWxseSByZWxlYXNlZCBvd25lcnNoaXAgdG8gdGhlIGFwcGxpY2F0aW9uLCBhbmQgaXQgaXMKKyAgICAvLyBva2F5IHRvIHJlbmRlciB0byB0aGUgaW1hZ2UuCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgcGlwZV9zdGFnZV9mbGFnczsKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm87CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgc3VibWl0X2luZm8ucFdhaXREc3RTdGFnZU1hc2sgPSAmcGlwZV9zdGFnZV9mbGFnczsKKyAgICBwaXBlX3N0YWdlX2ZsYWdzID0gVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklUOworICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gJmRlbW8tPmltYWdlX2FjcXVpcmVkX3NlbWFwaG9yZXNbZGVtby0+ZnJhbWVfaW5kZXhdOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbZGVtby0+Y3VycmVudF9idWZmZXJdLmNtZDsKKyAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSAmZGVtby0+ZHJhd19jb21wbGV0ZV9zZW1hcGhvcmVzW2RlbW8tPmZyYW1lX2luZGV4XTsKKyAgICBlcnIgPSB2a1F1ZXVlU3VibWl0KGRlbW8tPmdyYXBoaWNzX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIGRlbW8tPmZlbmNlc1tkZW1vLT5mcmFtZV9pbmRleF0pOworICAgIGFzc2VydCghZXJyKTsKKworICAgIGlmIChkZW1vLT5zZXBhcmF0ZV9wcmVzZW50X3F1ZXVlKSB7CisgICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBzZXBhcmF0ZSBxdWV1ZXMsIGNoYW5nZSBpbWFnZSBvd25lcnNoaXAgdG8gdGhlCisgICAgICAgIC8vIHByZXNlbnQgcXVldWUgYmVmb3JlIHByZXNlbnRpbmcsIHdhaXRpbmcgZm9yIHRoZSBkcmF3IGNvbXBsZXRlCisgICAgICAgIC8vIHNlbWFwaG9yZSBhbmQgc2lnbmFsbGluZyB0aGUgb3duZXJzaGlwIHJlbGVhc2VkIHNlbWFwaG9yZSB3aGVuIGZpbmlzaGVkCisgICAgICAgIFZrRmVuY2UgbnVsbEZlbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIHBpcGVfc3RhZ2VfZmxhZ3MgPSBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQ7CisgICAgICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0U2VtYXBob3JlcyA9ICZkZW1vLT5kcmF3X2NvbXBsZXRlX3NlbWFwaG9yZXNbZGVtby0+ZnJhbWVfaW5kZXhdOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tkZW1vLT5jdXJyZW50X2J1ZmZlcl0uZ3JhcGhpY3NfdG9fcHJlc2VudF9jbWQ7CisgICAgICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSAmZGVtby0+aW1hZ2Vfb3duZXJzaGlwX3NlbWFwaG9yZXNbZGVtby0+ZnJhbWVfaW5kZXhdOworICAgICAgICBlcnIgPSB2a1F1ZXVlU3VibWl0KGRlbW8tPnByZXNlbnRfcXVldWUsIDEsICZzdWJtaXRfaW5mbywgbnVsbEZlbmNlKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSB1c2luZyBzZXBhcmF0ZSBxdWV1ZXMgd2UgaGF2ZSB0byB3YWl0IGZvciBpbWFnZSBvd25lcnNoaXAsCisgICAgLy8gb3RoZXJ3aXNlIHdhaXQgZm9yIGRyYXcgY29tcGxldGUKKyAgICBWa1ByZXNlbnRJbmZvS0hSIHByZXNlbnQgPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfSU5GT19LSFIsCisgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgIC53YWl0U2VtYXBob3JlQ291bnQgPSAxLAorICAgICAgICAucFdhaXRTZW1hcGhvcmVzID0gKGRlbW8tPnNlcGFyYXRlX3ByZXNlbnRfcXVldWUpID8gJmRlbW8tPmltYWdlX293bmVyc2hpcF9zZW1hcGhvcmVzW2RlbW8tPmZyYW1lX2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmRlbW8tPmRyYXdfY29tcGxldGVfc2VtYXBob3Jlc1tkZW1vLT5mcmFtZV9pbmRleF0sCisgICAgICAgIC5zd2FwY2hhaW5Db3VudCA9IDEsCisgICAgICAgIC5wU3dhcGNoYWlucyA9ICZkZW1vLT5zd2FwY2hhaW4sCisgICAgICAgIC5wSW1hZ2VJbmRpY2VzID0gJmRlbW8tPmN1cnJlbnRfYnVmZmVyLAorICAgIH07CisKKyAgICBWa1JlY3RMYXllcktIUiByZWN0OworICAgIFZrUHJlc2VudFJlZ2lvbktIUiByZWdpb247CisgICAgVmtQcmVzZW50UmVnaW9uc0tIUiByZWdpb25zOworICAgIGlmIChkZW1vLT5WS19LSFJfaW5jcmVtZW50YWxfcHJlc2VudF9lbmFibGVkKSB7CisgICAgICAgIC8vIElmIHVzaW5nIFZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50LCB3ZSBwcm92aWRlIGEgaGludCBvZiB0aGUgcmVnaW9uCisgICAgICAgIC8vIHRoYXQgY29udGFpbnMgY2hhbmdlZCBjb250ZW50IHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91c2x5LXByZXNlbnRlZAorICAgICAgICAvLyBpbWFnZS4gIFRoZSBpbXBsZW1lbnRhdGlvbiBjYW4gdXNlIHRoaXMgaGludCBpbiBvcmRlciB0byBzYXZlCisgICAgICAgIC8vIHdvcmsvcG93ZXIgKGJ5IG9ubHkgY29weWluZyB0aGUgcmVnaW9uIGluIHRoZSBoaW50KS4gIFRoZQorICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIGlnbm9yZSB0aGUgaGludCB0aG91Z2gsIGFuZCBzbyB3ZSBtdXN0CisgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBlbnRpcmUgaW1hZ2UgaGFzIHRoZSBjb3JyZWN0bHktZHJhd24gY29udGVudC4KKyAgICAgICAgdWludDMyX3QgZWlnaHRoT2ZXaWR0aCA9IGRlbW8tPndpZHRoIC8gODsKKyAgICAgICAgdWludDMyX3QgZWlnaHRoT2ZIZWlnaHQgPSBkZW1vLT5oZWlnaHQgLyA4OworCisgICAgICAgIHJlY3Qub2Zmc2V0LnggPSBlaWdodGhPZldpZHRoOworICAgICAgICByZWN0Lm9mZnNldC55ID0gZWlnaHRoT2ZIZWlnaHQ7CisgICAgICAgIHJlY3QuZXh0ZW50LndpZHRoID0gZWlnaHRoT2ZXaWR0aCAqIDY7CisgICAgICAgIHJlY3QuZXh0ZW50LmhlaWdodCA9IGVpZ2h0aE9mSGVpZ2h0ICogNjsKKyAgICAgICAgcmVjdC5sYXllciA9IDA7CisKKyAgICAgICAgcmVnaW9uLnJlY3RhbmdsZUNvdW50ID0gMTsKKyAgICAgICAgcmVnaW9uLnBSZWN0YW5nbGVzID0gJnJlY3Q7CisKKyAgICAgICAgcmVnaW9ucy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfUkVHSU9OU19LSFI7CisgICAgICAgIHJlZ2lvbnMucE5leHQgPSBwcmVzZW50LnBOZXh0OworICAgICAgICByZWdpb25zLnN3YXBjaGFpbkNvdW50ID0gcHJlc2VudC5zd2FwY2hhaW5Db3VudDsKKyAgICAgICAgcmVnaW9ucy5wUmVnaW9ucyA9ICZyZWdpb247CisgICAgICAgIHByZXNlbnQucE5leHQgPSAmcmVnaW9uczsKKyAgICB9CisKKyAgICBpZiAoZGVtby0+VktfR09PR0xFX2Rpc3BsYXlfdGltaW5nX2VuYWJsZWQpIHsKKyAgICAgICAgVmtQcmVzZW50VGltZUdPT0dMRSBwdGltZTsKKyAgICAgICAgaWYgKGRlbW8tPnByZXZfZGVzaXJlZF9wcmVzZW50X3RpbWUgPT0gMCkgeworICAgICAgICAgICAgLy8gVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBwcmVzZW50IGZvciB0aGlzIHN3YXBjaGFpbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSByZWxhdGl2ZSB0byB0aGUgcHJlc2VudGF0aW9uIGVuZ2luZSdzCisgICAgICAgICAgICAvLyBkaXNwbGF5J3MgcmVmcmVzaCBjeWNsZS4gIFdlIGFsc28gZG9uJ3Qga25vdyBob3cgbG9uZyByZW5kZXJpbmcKKyAgICAgICAgICAgIC8vIHRha2VzLiAgTGV0J3MgbWFrZSBhIGdyb3NzbHktc2ltcGxpZmllZCBhc3N1bXB0aW9uIHRoYXQgdGhlCisgICAgICAgICAgICAvLyBkZXNpcmVkUHJlc2VudFRpbWUgc2hvdWxkIGJlIGhhbGYgd2F5IGJldHdlZW4gbm93IGFuZAorICAgICAgICAgICAgLy8gbm93K3RhcmdldF9JUEQuICBXZSB3aWxsIGFkanVzdCBvdmVyIHRpbWUuCisgICAgICAgICAgICB1aW50NjRfdCBjdXJ0aW1lID0gZ2V0VGltZUluTmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgIGlmIChjdXJ0aW1lID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBkaWRuJ3QgZmluZCBvdXQgdGhlIGN1cnJlbnQgdGltZSwgZG9uJ3QgZ2l2ZSBhCisgICAgICAgICAgICAgICAgLy8gZGVzaXJlZFByZXNlbnRUaW1lOgorICAgICAgICAgICAgICAgIHB0aW1lLmRlc2lyZWRQcmVzZW50VGltZSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB0aW1lLmRlc2lyZWRQcmVzZW50VGltZSA9IGN1cnRpbWUgKyAoZGVtby0+dGFyZ2V0X0lQRCA+PiAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB0aW1lLmRlc2lyZWRQcmVzZW50VGltZSA9IChkZW1vLT5wcmV2X2Rlc2lyZWRfcHJlc2VudF90aW1lICsgZGVtby0+dGFyZ2V0X0lQRCk7CisgICAgICAgIH0KKyAgICAgICAgcHRpbWUucHJlc2VudElEID0gZGVtby0+bmV4dF9wcmVzZW50X2lkKys7CisgICAgICAgIGRlbW8tPnByZXZfZGVzaXJlZF9wcmVzZW50X3RpbWUgPSBwdGltZS5kZXNpcmVkUHJlc2VudFRpbWU7CisKKyAgICAgICAgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFIHByZXNlbnRfdGltZSA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEUsCisgICAgICAgICAgICAucE5leHQgPSBwcmVzZW50LnBOZXh0LAorICAgICAgICAgICAgLnN3YXBjaGFpbkNvdW50ID0gcHJlc2VudC5zd2FwY2hhaW5Db3VudCwKKyAgICAgICAgICAgIC5wVGltZXMgPSAmcHRpbWUsCisgICAgICAgIH07CisgICAgICAgIGlmIChkZW1vLT5WS19HT09HTEVfZGlzcGxheV90aW1pbmdfZW5hYmxlZCkgeworICAgICAgICAgICAgcHJlc2VudC5wTmV4dCA9ICZwcmVzZW50X3RpbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBkZW1vLT5mcFF1ZXVlUHJlc2VudEtIUihkZW1vLT5wcmVzZW50X3F1ZXVlLCAmcHJlc2VudCk7CisgICAgZGVtby0+ZnJhbWVfaW5kZXggKz0gMTsKKyAgICBkZW1vLT5mcmFtZV9pbmRleCAlPSBGUkFNRV9MQUc7CisKKyAgICBpZiAoZXJyID09IFZLX0VSUk9SX09VVF9PRl9EQVRFX0tIUikgeworICAgICAgICAvLyBkZW1vLT5zd2FwY2hhaW4gaXMgb3V0IG9mIGRhdGUgKGUuZy4gdGhlIHdpbmRvdyB3YXMgcmVzaXplZCkgYW5kCisgICAgICAgIC8vIG11c3QgYmUgcmVjcmVhdGVkOgorICAgICAgICBkZW1vX3Jlc2l6ZShkZW1vKTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBWS19TVUJPUFRJTUFMX0tIUikgeworICAgICAgICAvLyBkZW1vLT5zd2FwY2hhaW4gaXMgbm90IGFzIG9wdGltYWwgYXMgaXQgY291bGQgYmUsIGJ1dCB0aGUgcGxhdGZvcm0ncworICAgICAgICAvLyBwcmVzZW50YXRpb24gZW5naW5lIHdpbGwgc3RpbGwgcHJlc2VudCB0aGUgaW1hZ2UgY29ycmVjdGx5LgorICAgIH0gZWxzZSBpZiAoZXJyID09IFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIpIHsKKyAgICAgICAgdmtEZXN0cm95U3VyZmFjZUtIUihkZW1vLT5pbnN0LCBkZW1vLT5zdXJmYWNlLCBOVUxMKTsKKyAgICAgICAgZGVtb19jcmVhdGVfc3VyZmFjZShkZW1vKTsKKyAgICAgICAgZGVtb19yZXNpemUoZGVtbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVtb19wcmVwYXJlX2J1ZmZlcnMoc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBWa1Jlc3VsdCBVX0FTU0VSVF9PTkxZIGVycjsKKyAgICBWa1N3YXBjaGFpbktIUiBvbGRTd2FwY2hhaW4gPSBkZW1vLT5zd2FwY2hhaW47CisKKyAgICAvLyBDaGVjayB0aGUgc3VyZmFjZSBjYXBhYmlsaXRpZXMgYW5kIGZvcm1hdHMKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgc3VyZkNhcGFiaWxpdGllczsKKyAgICBlcnIgPSBkZW1vLT5mcEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihkZW1vLT5ncHUsIGRlbW8tPnN1cmZhY2UsICZzdXJmQ2FwYWJpbGl0aWVzKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICB1aW50MzJfdCBwcmVzZW50TW9kZUNvdW50OworICAgIGVyciA9IGRlbW8tPmZwR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKGRlbW8tPmdwdSwgZGVtby0+c3VyZmFjZSwgJnByZXNlbnRNb2RlQ291bnQsIE5VTEwpOworICAgIGFzc2VydCghZXJyKTsKKyAgICBWa1ByZXNlbnRNb2RlS0hSICpwcmVzZW50TW9kZXMgPSAoVmtQcmVzZW50TW9kZUtIUiAqKW1hbGxvYyhwcmVzZW50TW9kZUNvdW50ICogc2l6ZW9mKFZrUHJlc2VudE1vZGVLSFIpKTsKKyAgICBhc3NlcnQocHJlc2VudE1vZGVzKTsKKyAgICBlcnIgPSBkZW1vLT5mcEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihkZW1vLT5ncHUsIGRlbW8tPnN1cmZhY2UsICZwcmVzZW50TW9kZUNvdW50LCBwcmVzZW50TW9kZXMpOworICAgIGFzc2VydCghZXJyKTsKKworICAgIFZrRXh0ZW50MkQgc3dhcGNoYWluRXh0ZW50OworICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGVpdGhlciBib3RoIDB4RkZGRkZGRkYsIG9yIGJvdGggbm90IDB4RkZGRkZGRkYuCisgICAgaWYgKHN1cmZDYXBhYmlsaXRpZXMuY3VycmVudEV4dGVudC53aWR0aCA9PSAweEZGRkZGRkZGKSB7CisgICAgICAgIC8vIElmIHRoZSBzdXJmYWNlIHNpemUgaXMgdW5kZWZpbmVkLCB0aGUgc2l6ZSBpcyBzZXQgdG8gdGhlIHNpemUKKyAgICAgICAgLy8gb2YgdGhlIGltYWdlcyByZXF1ZXN0ZWQsIHdoaWNoIG11c3QgZml0IHdpdGhpbiB0aGUgbWluaW11bSBhbmQKKyAgICAgICAgLy8gbWF4aW11bSB2YWx1ZXMuCisgICAgICAgIHN3YXBjaGFpbkV4dGVudC53aWR0aCA9IGRlbW8tPndpZHRoOworICAgICAgICBzd2FwY2hhaW5FeHRlbnQuaGVpZ2h0ID0gZGVtby0+aGVpZ2h0OworCisgICAgICAgIGlmIChzd2FwY2hhaW5FeHRlbnQud2lkdGggPCBzdXJmQ2FwYWJpbGl0aWVzLm1pbkltYWdlRXh0ZW50LndpZHRoKSB7CisgICAgICAgICAgICBzd2FwY2hhaW5FeHRlbnQud2lkdGggPSBzdXJmQ2FwYWJpbGl0aWVzLm1pbkltYWdlRXh0ZW50LndpZHRoOworICAgICAgICB9IGVsc2UgaWYgKHN3YXBjaGFpbkV4dGVudC53aWR0aCA+IHN1cmZDYXBhYmlsaXRpZXMubWF4SW1hZ2VFeHRlbnQud2lkdGgpIHsKKyAgICAgICAgICAgIHN3YXBjaGFpbkV4dGVudC53aWR0aCA9IHN1cmZDYXBhYmlsaXRpZXMubWF4SW1hZ2VFeHRlbnQud2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3dhcGNoYWluRXh0ZW50LmhlaWdodCA8IHN1cmZDYXBhYmlsaXRpZXMubWluSW1hZ2VFeHRlbnQuaGVpZ2h0KSB7CisgICAgICAgICAgICBzd2FwY2hhaW5FeHRlbnQuaGVpZ2h0ID0gc3VyZkNhcGFiaWxpdGllcy5taW5JbWFnZUV4dGVudC5oZWlnaHQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3dhcGNoYWluRXh0ZW50LmhlaWdodCA+IHN1cmZDYXBhYmlsaXRpZXMubWF4SW1hZ2VFeHRlbnQuaGVpZ2h0KSB7CisgICAgICAgICAgICBzd2FwY2hhaW5FeHRlbnQuaGVpZ2h0ID0gc3VyZkNhcGFiaWxpdGllcy5tYXhJbWFnZUV4dGVudC5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGUgc3VyZmFjZSBzaXplIGlzIGRlZmluZWQsIHRoZSBzd2FwIGNoYWluIHNpemUgbXVzdCBtYXRjaAorICAgICAgICBzd2FwY2hhaW5FeHRlbnQgPSBzdXJmQ2FwYWJpbGl0aWVzLmN1cnJlbnRFeHRlbnQ7CisgICAgICAgIGRlbW8tPndpZHRoID0gc3VyZkNhcGFiaWxpdGllcy5jdXJyZW50RXh0ZW50LndpZHRoOworICAgICAgICBkZW1vLT5oZWlnaHQgPSBzdXJmQ2FwYWJpbGl0aWVzLmN1cnJlbnRFeHRlbnQuaGVpZ2h0OworICAgIH0KKworICAgIGlmIChkZW1vLT53aWR0aCA9PSAwIHx8IGRlbW8tPmhlaWdodCA9PSAwKSB7CisgICAgICAgIGRlbW8tPmlzX21pbmltaXplZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBkZW1vLT5pc19taW5pbWl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUgRklGTyBwcmVzZW50IG1vZGUgaXMgZ3VhcmFudGVlZCBieSB0aGUgc3BlYyB0byBiZSBzdXBwb3J0ZWQKKyAgICAvLyBhbmQgdG8gaGF2ZSBubyB0ZWFyaW5nLiAgSXQncyBhIGdyZWF0IGRlZmF1bHQgcHJlc2VudCBtb2RlIHRvIHVzZS4KKyAgICBWa1ByZXNlbnRNb2RlS0hSIHN3YXBjaGFpblByZXNlbnRNb2RlID0gVktfUFJFU0VOVF9NT0RFX0ZJRk9fS0hSOworCisgICAgLy8gIFRoZXJlIGFyZSB0aW1lcyB3aGVuIHlvdSBtYXkgd2lzaCB0byB1c2UgYW5vdGhlciBwcmVzZW50IG1vZGUuICBUaGUKKyAgICAvLyAgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRvIHNlbGVjdCB0aGVtLCBhbmQgdGhlIGNvbW1lbnRzIHByb3ZpZGUgc29tZQorICAgIC8vICByZWFzb25zIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhlbS4KKyAgICAvLworICAgIC8vIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IFZ1bGthbiAxLjAgZG9lc24ndCBwcm92aWRlIGEgbWV0aG9kIGZvcgorICAgIC8vIHN5bmNocm9uaXppbmcgcmVuZGVyaW5nIHdpdGggdGhlIHByZXNlbnRhdGlvbiBlbmdpbmUncyBkaXNwbGF5LiAgVGhlcmUKKyAgICAvLyBpcyBhIG1ldGhvZCBwcm92aWRlZCBmb3IgdGhyb3R0bGluZyByZW5kZXJpbmcgd2l0aCB0aGUgZGlzcGxheSwgYnV0CisgICAgLy8gdGhlcmUgYXJlIHNvbWUgcHJlc2VudGF0aW9uIGVuZ2luZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIHdpbGwgbm90IHdvcmsuCisgICAgLy8gSWYgYW4gYXBwbGljYXRpb24gZG9lc24ndCB0aHJvdHRsZSBpdHMgcmVuZGVyaW5nLCBhbmQgaWYgaXQgcmVuZGVycyBtdWNoCisgICAgLy8gZmFzdGVyIHRoYW4gdGhlIHJlZnJlc2ggcmF0ZSBvZiB0aGUgZGlzcGxheSwgdGhpcyBjYW4gd2FzdGUgcG93ZXIgb24KKyAgICAvLyBtb2JpbGUgZGV2aWNlcy4gIFRoYXQgaXMgYmVjYXVzZSBwb3dlciBpcyBiZWluZyBzcGVudCByZW5kZXJpbmcgaW1hZ2VzCisgICAgLy8gdGhhdCBtYXkgbmV2ZXIgYmUgc2Vlbi4KKworICAgIC8vIFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSIGlzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjYXJlIGFib3V0CisgICAgLy8gdGVhcmluZywgb3IgaGF2ZSBzb21lIHdheSBvZiBzeW5jaHJvbml6aW5nIHRoZWlyIHJlbmRlcmluZyB3aXRoIHRoZQorICAgIC8vIGRpc3BsYXkuCisgICAgLy8gVktfUFJFU0VOVF9NT0RFX01BSUxCT1hfS0hSIG1heSBiZSB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyB0aGF0CisgICAgLy8gZ2VuZXJhbGx5IHJlbmRlciBhIG5ldyBwcmVzZW50YWJsZSBpbWFnZSBldmVyeSByZWZyZXNoIGN5Y2xlLCBidXQgYXJlCisgICAgLy8gb2NjYXNpb25hbGx5IGVhcmx5LiAgSW4gdGhpcyBjYXNlLCB0aGUgYXBwbGljYXRpb24gd2FudHMgdGhlIG5ldyBpbWFnZQorICAgIC8vIHRvIGJlIGRpc3BsYXllZCBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91c2x5LXF1ZXVlZC1mb3ItcHJlc2VudGF0aW9uIGltYWdlCisgICAgLy8gdGhhdCBoYXMgbm90IHlldCBiZWVuIGRpc3BsYXllZC4KKyAgICAvLyBWS19QUkVTRU5UX01PREVfRklGT19SRUxBWEVEX0tIUiBpcyBmb3IgYXBwbGljYXRpb25zIHRoYXQgZ2VuZXJhbGx5CisgICAgLy8gcmVuZGVyIGEgbmV3IHByZXNlbnRhYmxlIGltYWdlIGV2ZXJ5IHJlZnJlc2ggY3ljbGUsIGJ1dCBhcmUgb2NjYXNpb25hbGx5CisgICAgLy8gbGF0ZS4gIEluIHRoaXMgY2FzZSAocGVyaGFwcyBiZWNhdXNlIG9mIHN0dXR0ZXJpbmcvbGF0ZW5jeSBjb25jZXJucyksCisgICAgLy8gdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRoZSBsYXRlIGltYWdlIHRvIGJlIGltbWVkaWF0ZWx5IGRpc3BsYXllZCwgZXZlbgorICAgIC8vIHRob3VnaCB0aGF0IG1heSBtZWFuIHNvbWUgdGVhcmluZy4KKworICAgIGlmIChkZW1vLT5wcmVzZW50TW9kZSAhPSBzd2FwY2hhaW5QcmVzZW50TW9kZSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZXNlbnRNb2RlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHByZXNlbnRNb2Rlc1tpXSA9PSBkZW1vLT5wcmVzZW50TW9kZSkgeworICAgICAgICAgICAgICAgIHN3YXBjaGFpblByZXNlbnRNb2RlID0gZGVtby0+cHJlc2VudE1vZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN3YXBjaGFpblByZXNlbnRNb2RlICE9IGRlbW8tPnByZXNlbnRNb2RlKSB7CisgICAgICAgIEVSUl9FWElUKCJQcmVzZW50IG1vZGUgc3BlY2lmaWVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsICJQcmVzZW50IG1vZGUgdW5zdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBWa0ltYWdlcyB0byB1c2UgaW4gdGhlIHN3YXAgY2hhaW4uCisgICAgLy8gQXBwbGljYXRpb24gZGVzaXJlcyB0byBhY3F1aXJlIDMgaW1hZ2VzIGF0IGEgdGltZSBmb3IgdHJpcGxlCisgICAgLy8gYnVmZmVyaW5nCisgICAgdWludDMyX3QgZGVzaXJlZE51bU9mU3dhcGNoYWluSW1hZ2VzID0gMzsKKyAgICBpZiAoZGVzaXJlZE51bU9mU3dhcGNoYWluSW1hZ2VzIDwgc3VyZkNhcGFiaWxpdGllcy5taW5JbWFnZUNvdW50KSB7CisgICAgICAgIGRlc2lyZWROdW1PZlN3YXBjaGFpbkltYWdlcyA9IHN1cmZDYXBhYmlsaXRpZXMubWluSW1hZ2VDb3VudDsKKyAgICB9CisgICAgLy8gSWYgbWF4SW1hZ2VDb3VudCBpcyAwLCB3ZSBjYW4gYXNrIGZvciBhcyBtYW55IGltYWdlcyBhcyB3ZSB3YW50OworICAgIC8vIG90aGVyd2lzZSB3ZSdyZSBsaW1pdGVkIHRvIG1heEltYWdlQ291bnQKKyAgICBpZiAoKHN1cmZDYXBhYmlsaXRpZXMubWF4SW1hZ2VDb3VudCA+IDApICYmIChkZXNpcmVkTnVtT2ZTd2FwY2hhaW5JbWFnZXMgPiBzdXJmQ2FwYWJpbGl0aWVzLm1heEltYWdlQ291bnQpKSB7CisgICAgICAgIC8vIEFwcGxpY2F0aW9uIG11c3Qgc2V0dGxlIGZvciBmZXdlciBpbWFnZXMgdGhhbiBkZXNpcmVkOgorICAgICAgICBkZXNpcmVkTnVtT2ZTd2FwY2hhaW5JbWFnZXMgPSBzdXJmQ2FwYWJpbGl0aWVzLm1heEltYWdlQ291bnQ7CisgICAgfQorCisgICAgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIgcHJlVHJhbnNmb3JtOworICAgIGlmIChzdXJmQ2FwYWJpbGl0aWVzLnN1cHBvcnRlZFRyYW5zZm9ybXMgJiBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSKSB7CisgICAgICAgIHByZVRyYW5zZm9ybSA9IFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0lERU5USVRZX0JJVF9LSFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJlVHJhbnNmb3JtID0gc3VyZkNhcGFiaWxpdGllcy5jdXJyZW50VHJhbnNmb3JtOworICAgIH0KKworICAgIC8vIEZpbmQgYSBzdXBwb3J0ZWQgY29tcG9zaXRlIGFscGhhIG1vZGUgLSBvbmUgb2YgdGhlc2UgaXMgZ3VhcmFudGVlZCB0byBiZSBzZXQKKyAgICBWa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgY29tcG9zaXRlQWxwaGEgPSBWS19DT01QT1NJVEVfQUxQSEFfT1BBUVVFX0JJVF9LSFI7CisgICAgVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIGNvbXBvc2l0ZUFscGhhRmxhZ3NbNF0gPSB7CisgICAgICAgIFZLX0NPTVBPU0lURV9BTFBIQV9PUEFRVUVfQklUX0tIUiwKKyAgICAgICAgVktfQ09NUE9TSVRFX0FMUEhBX1BSRV9NVUxUSVBMSUVEX0JJVF9LSFIsCisgICAgICAgIFZLX0NPTVBPU0lURV9BTFBIQV9QT1NUX01VTFRJUExJRURfQklUX0tIUiwKKyAgICAgICAgVktfQ09NUE9TSVRFX0FMUEhBX0lOSEVSSVRfQklUX0tIUiwKKyAgICB9OworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbXBvc2l0ZUFscGhhRmxhZ3MpOyBpKyspIHsKKyAgICAgICAgaWYgKHN1cmZDYXBhYmlsaXRpZXMuc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEgJiBjb21wb3NpdGVBbHBoYUZsYWdzW2ldKSB7CisgICAgICAgICAgICBjb21wb3NpdGVBbHBoYSA9IGNvbXBvc2l0ZUFscGhhRmxhZ3NbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBzd2FwY2hhaW5fY2kgPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIsCisgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgIC5zdXJmYWNlID0gZGVtby0+c3VyZmFjZSwKKyAgICAgICAgLm1pbkltYWdlQ291bnQgPSBkZXNpcmVkTnVtT2ZTd2FwY2hhaW5JbWFnZXMsCisgICAgICAgIC5pbWFnZUZvcm1hdCA9IGRlbW8tPmZvcm1hdCwKKyAgICAgICAgLmltYWdlQ29sb3JTcGFjZSA9IGRlbW8tPmNvbG9yX3NwYWNlLAorICAgICAgICAuaW1hZ2VFeHRlbnQgPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC53aWR0aCA9IHN3YXBjaGFpbkV4dGVudC53aWR0aCwKKyAgICAgICAgICAgICAgICAuaGVpZ2h0ID0gc3dhcGNoYWluRXh0ZW50LmhlaWdodCwKKyAgICAgICAgICAgIH0sCisgICAgICAgIC5pbWFnZVVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsCisgICAgICAgIC5wcmVUcmFuc2Zvcm0gPSBwcmVUcmFuc2Zvcm0sCisgICAgICAgIC5jb21wb3NpdGVBbHBoYSA9IGNvbXBvc2l0ZUFscGhhLAorICAgICAgICAuaW1hZ2VBcnJheUxheWVycyA9IDEsCisgICAgICAgIC5pbWFnZVNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDAsCisgICAgICAgIC5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTCwKKyAgICAgICAgLnByZXNlbnRNb2RlID0gc3dhcGNoYWluUHJlc2VudE1vZGUsCisgICAgICAgIC5vbGRTd2FwY2hhaW4gPSBvbGRTd2FwY2hhaW4sCisgICAgICAgIC5jbGlwcGVkID0gdHJ1ZSwKKyAgICB9OworICAgIHVpbnQzMl90IGk7CisgICAgZXJyID0gZGVtby0+ZnBDcmVhdGVTd2FwY2hhaW5LSFIoZGVtby0+ZGV2aWNlLCAmc3dhcGNoYWluX2NpLCBOVUxMLCAmZGVtby0+c3dhcGNoYWluKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICAvLyBJZiB3ZSBqdXN0IHJlLWNyZWF0ZWQgYW4gZXhpc3Rpbmcgc3dhcGNoYWluLCB3ZSBzaG91bGQgZGVzdHJveSB0aGUgb2xkCisgICAgLy8gc3dhcGNoYWluIGF0IHRoaXMgcG9pbnQuCisgICAgLy8gTm90ZTogZGVzdHJveWluZyB0aGUgc3dhcGNoYWluIGFsc28gY2xlYW5zIHVwIGFsbCBpdHMgYXNzb2NpYXRlZAorICAgIC8vIHByZXNlbnRhYmxlIGltYWdlcyBvbmNlIHRoZSBwbGF0Zm9ybSBpcyBkb25lIHdpdGggdGhlbS4KKyAgICBpZiAob2xkU3dhcGNoYWluICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIGRlbW8tPmZwRGVzdHJveVN3YXBjaGFpbktIUihkZW1vLT5kZXZpY2UsIG9sZFN3YXBjaGFpbiwgTlVMTCk7CisgICAgfQorCisgICAgZXJyID0gZGVtby0+ZnBHZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGVtby0+ZGV2aWNlLCBkZW1vLT5zd2FwY2hhaW4sICZkZW1vLT5zd2FwY2hhaW5JbWFnZUNvdW50LCBOVUxMKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBWa0ltYWdlICpzd2FwY2hhaW5JbWFnZXMgPSAoVmtJbWFnZSAqKW1hbGxvYyhkZW1vLT5zd2FwY2hhaW5JbWFnZUNvdW50ICogc2l6ZW9mKFZrSW1hZ2UpKTsKKyAgICBhc3NlcnQoc3dhcGNoYWluSW1hZ2VzKTsKKyAgICBlcnIgPSBkZW1vLT5mcEdldFN3YXBjaGFpbkltYWdlc0tIUihkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbiwgJmRlbW8tPnN3YXBjaGFpbkltYWdlQ291bnQsIHN3YXBjaGFpbkltYWdlcyk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlcyA9CisgICAgICAgIChTd2FwY2hhaW5JbWFnZVJlc291cmNlcyAqKW1hbGxvYyhzaXplb2YoU3dhcGNoYWluSW1hZ2VSZXNvdXJjZXMpICogZGVtby0+c3dhcGNoYWluSW1hZ2VDb3VudCk7CisgICAgYXNzZXJ0KGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXMpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlbW8tPnN3YXBjaGFpbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gY29sb3JfaW1hZ2VfdmlldyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAgICAgLmZvcm1hdCA9IGRlbW8tPmZvcm1hdCwKKyAgICAgICAgICAgIC5jb21wb25lbnRzID0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC5yID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfUiwKKyAgICAgICAgICAgICAgICAgICAgLmcgPSBWS19DT01QT05FTlRfU1dJWlpMRV9HLAorICAgICAgICAgICAgICAgICAgICAuYiA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0IsCisgICAgICAgICAgICAgICAgICAgIC5hID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLnN1YnJlc291cmNlUmFuZ2UgPQorICAgICAgICAgICAgICAgIHsuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIC5iYXNlTWlwTGV2ZWwgPSAwLCAubGV2ZWxDb3VudCA9IDEsIC5iYXNlQXJyYXlMYXllciA9IDAsIC5sYXllckNvdW50ID0gMX0sCisgICAgICAgICAgICAudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICB9OworCisgICAgICAgIGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uaW1hZ2UgPSBzd2FwY2hhaW5JbWFnZXNbaV07CisKKyAgICAgICAgY29sb3JfaW1hZ2Vfdmlldy5pbWFnZSA9IGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uaW1hZ2U7CisKKyAgICAgICAgZXJyID0gdmtDcmVhdGVJbWFnZVZpZXcoZGVtby0+ZGV2aWNlLCAmY29sb3JfaW1hZ2VfdmlldywgTlVMTCwgJmRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udmlldyk7CisgICAgICAgIGFzc2VydCghZXJyKTsKKyAgICB9CisKKyAgICBpZiAoZGVtby0+VktfR09PR0xFX2Rpc3BsYXlfdGltaW5nX2VuYWJsZWQpIHsKKyAgICAgICAgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSByY19kdXI7CisgICAgICAgIGVyciA9IGRlbW8tPmZwR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoZGVtby0+ZGV2aWNlLCBkZW1vLT5zd2FwY2hhaW4sICZyY19kdXIpOworICAgICAgICBhc3NlcnQoIWVycik7CisgICAgICAgIGRlbW8tPnJlZnJlc2hfZHVyYXRpb24gPSByY19kdXIucmVmcmVzaER1cmF0aW9uOworCisgICAgICAgIGRlbW8tPnN5bmNkX3dpdGhfYWN0dWFsX3ByZXNlbnRzID0gZmFsc2U7CisgICAgICAgIC8vIEluaXRpYWxseSB0YXJnZXQgMVggdGhlIHJlZnJlc2ggZHVyYXRpb246CisgICAgICAgIGRlbW8tPnRhcmdldF9JUEQgPSBkZW1vLT5yZWZyZXNoX2R1cmF0aW9uOworICAgICAgICBkZW1vLT5yZWZyZXNoX2R1cmF0aW9uX211bHRpcGxpZXIgPSAxOworICAgICAgICBkZW1vLT5wcmV2X2Rlc2lyZWRfcHJlc2VudF90aW1lID0gMDsKKyAgICAgICAgZGVtby0+bmV4dF9wcmVzZW50X2lkID0gMTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCAhPSBzd2FwY2hhaW5JbWFnZXMpIHsKKyAgICAgICAgZnJlZShzd2FwY2hhaW5JbWFnZXMpOworICAgIH0KKworICAgIGlmIChOVUxMICE9IHByZXNlbnRNb2RlcykgeworICAgICAgICBmcmVlKHByZXNlbnRNb2Rlcyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZW1vX3ByZXBhcmVfZGVwdGgoc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBjb25zdCBWa0Zvcm1hdCBkZXB0aF9mb3JtYXQgPSBWS19GT1JNQVRfRDE2X1VOT1JNOworICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlID0geworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQsCisgICAgICAgIC5mb3JtYXQgPSBkZXB0aF9mb3JtYXQsCisgICAgICAgIC5leHRlbnQgPSB7ZGVtby0+d2lkdGgsIGRlbW8tPmhlaWdodCwgMX0sCisgICAgICAgIC5taXBMZXZlbHMgPSAxLAorICAgICAgICAuYXJyYXlMYXllcnMgPSAxLAorICAgICAgICAuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLAorICAgICAgICAudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULAorICAgICAgICAuZmxhZ3MgPSAwLAorICAgIH07CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gdmlldyA9IHsKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgLmltYWdlID0gVktfTlVMTF9IQU5ETEUsCisgICAgICAgIC5mb3JtYXQgPSBkZXB0aF9mb3JtYXQsCisgICAgICAgIC5zdWJyZXNvdXJjZVJhbmdlID0KKyAgICAgICAgICAgIHsuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQsIC5iYXNlTWlwTGV2ZWwgPSAwLCAubGV2ZWxDb3VudCA9IDEsIC5iYXNlQXJyYXlMYXllciA9IDAsIC5sYXllckNvdW50ID0gMX0sCisgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgIC52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCwKKyAgICB9OworCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisgICAgYm9vbCBVX0FTU0VSVF9PTkxZIHBhc3M7CisKKyAgICBkZW1vLT5kZXB0aC5mb3JtYXQgPSBkZXB0aF9mb3JtYXQ7CisKKyAgICAvKiBjcmVhdGUgaW1hZ2UgKi8KKyAgICBlcnIgPSB2a0NyZWF0ZUltYWdlKGRlbW8tPmRldmljZSwgJmltYWdlLCBOVUxMLCAmZGVtby0+ZGVwdGguaW1hZ2UpOworICAgIGFzc2VydCghZXJyKTsKKworICAgIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGVtby0+ZGV2aWNlLCBkZW1vLT5kZXB0aC5pbWFnZSwgJm1lbV9yZXFzKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBkZW1vLT5kZXB0aC5tZW1fYWxsb2Muc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICBkZW1vLT5kZXB0aC5tZW1fYWxsb2MucE5leHQgPSBOVUxMOworICAgIGRlbW8tPmRlcHRoLm1lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IG1lbV9yZXFzLnNpemU7CisgICAgZGVtby0+ZGVwdGgubWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IDA7CisKKyAgICBwYXNzID0gbWVtb3J5X3R5cGVfZnJvbV9wcm9wZXJ0aWVzKGRlbW8sIG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZW1vLT5kZXB0aC5tZW1fYWxsb2MubWVtb3J5VHlwZUluZGV4KTsKKyAgICBhc3NlcnQocGFzcyk7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBlcnIgPSB2a0FsbG9jYXRlTWVtb3J5KGRlbW8tPmRldmljZSwgJmRlbW8tPmRlcHRoLm1lbV9hbGxvYywgTlVMTCwgJmRlbW8tPmRlcHRoLm1lbSk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgLyogYmluZCBtZW1vcnkgKi8KKyAgICBlcnIgPSB2a0JpbmRJbWFnZU1lbW9yeShkZW1vLT5kZXZpY2UsIGRlbW8tPmRlcHRoLmltYWdlLCBkZW1vLT5kZXB0aC5tZW0sIDApOworICAgIGFzc2VydCghZXJyKTsKKworICAgIC8qIGNyZWF0ZSBpbWFnZSB2aWV3ICovCisgICAgdmlldy5pbWFnZSA9IGRlbW8tPmRlcHRoLmltYWdlOworICAgIGVyciA9IHZrQ3JlYXRlSW1hZ2VWaWV3KGRlbW8tPmRldmljZSwgJnZpZXcsIE5VTEwsICZkZW1vLT5kZXB0aC52aWV3KTsKKyAgICBhc3NlcnQoIWVycik7Cit9CisKKy8qIENvbnZlcnQgcHBtIGltYWdlIGRhdGEgZnJvbSBoZWFkZXIgZmlsZSBpbnRvIFJHQkEgdGV4dHVyZSBpbWFnZSAqLworI2luY2x1ZGUgImx1bmFyZy5wcG0uaCIKK2Jvb2wgbG9hZFRleHR1cmUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVpbnQ4X3QgKnJnYmFfZGF0YSwgVmtTdWJyZXNvdXJjZUxheW91dCAqbGF5b3V0LCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgKHZvaWQpZmlsZW5hbWU7CisgICAgY2hhciAqY1B0cjsKKyAgICBjUHRyID0gKGNoYXIgKilsdW5hcmdfcHBtOworICAgIGlmICgodW5zaWduZWQgY2hhciAqKWNQdHIgPj0gKGx1bmFyZ19wcG0gKyBsdW5hcmdfcHBtX2xlbikgfHwgc3RybmNtcChjUHRyLCAiUDZcbiIsIDMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgd2hpbGUgKHN0cm5jbXAoY1B0cisrLCAiXG4iLCAxKSkKKyAgICAgICAgOworICAgIHNzY2FuZihjUHRyLCAiJXUgJXUiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAocmdiYV9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHdoaWxlIChzdHJuY21wKGNQdHIrKywgIlxuIiwgMSkpCisgICAgICAgIDsKKyAgICBpZiAoKHVuc2lnbmVkIGNoYXIgKiljUHRyID49IChsdW5hcmdfcHBtICsgbHVuYXJnX3BwbV9sZW4pIHx8IHN0cm5jbXAoY1B0ciwgIjI1NVxuIiwgNCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aGlsZSAoc3RybmNtcChjUHRyKyssICJcbiIsIDEpKQorICAgICAgICA7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAqaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgdWludDhfdCAqcm93UHRyID0gcmdiYV9kYXRhOworICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8ICp3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBtZW1jcHkocm93UHRyLCBjUHRyLCAzKTsKKyAgICAgICAgICAgIHJvd1B0clszXSA9IDI1NTsgLyogQWxwaGEgb2YgMSAqLworICAgICAgICAgICAgcm93UHRyICs9IDQ7CisgICAgICAgICAgICBjUHRyICs9IDM7CisgICAgICAgIH0KKyAgICAgICAgcmdiYV9kYXRhICs9IGxheW91dC0+cm93UGl0Y2g7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBkZW1vX3ByZXBhcmVfdGV4dHVyZV9idWZmZXIoc3RydWN0IGRlbW8gKmRlbW8sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgdGV4dHVyZV9vYmplY3QgKnRleF9vYmopIHsKKyAgICBpbnQzMl90IHRleF93aWR0aDsKKyAgICBpbnQzMl90IHRleF9oZWlnaHQ7CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisgICAgYm9vbCBVX0FTU0VSVF9PTkxZIHBhc3M7CisKKyAgICBpZiAoIWxvYWRUZXh0dXJlKGZpbGVuYW1lLCBOVUxMLCBOVUxMLCAmdGV4X3dpZHRoLCAmdGV4X2hlaWdodCkpIHsKKyAgICAgICAgRVJSX0VYSVQoIkZhaWxlZCB0byBsb2FkIHRleHR1cmVzIiwgIkxvYWQgVGV4dHVyZSBGYWlsdXJlIik7CisgICAgfQorCisgICAgdGV4X29iai0+dGV4X3dpZHRoID0gdGV4X3dpZHRoOworICAgIHRleF9vYmotPnRleF9oZWlnaHQgPSB0ZXhfaGVpZ2h0OworCisgICAgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHsuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gdGV4X3dpZHRoICogdGV4X2hlaWdodCAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVldWVGYW1pbHlJbmRleENvdW50ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTH07CisKKyAgICBlcnIgPSB2a0NyZWF0ZUJ1ZmZlcihkZW1vLT5kZXZpY2UsICZidWZmZXJfY3JlYXRlX2luZm8sIE5VTEwsICZ0ZXhfb2JqLT5idWZmZXIpOworICAgIGFzc2VydCghZXJyKTsKKworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworICAgIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRlbW8tPmRldmljZSwgdGV4X29iai0+YnVmZmVyLCAmbWVtX3JlcXMpOworCisgICAgdGV4X29iai0+bWVtX2FsbG9jLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgdGV4X29iai0+bWVtX2FsbG9jLnBOZXh0ID0gTlVMTDsKKyAgICB0ZXhfb2JqLT5tZW1fYWxsb2MuYWxsb2NhdGlvblNpemUgPSBtZW1fcmVxcy5zaXplOworICAgIHRleF9vYmotPm1lbV9hbGxvYy5tZW1vcnlUeXBlSW5kZXggPSAwOworCisgICAgVmtGbGFncyByZXF1aXJlbWVudHMgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDsKKyAgICBwYXNzID0gbWVtb3J5X3R5cGVfZnJvbV9wcm9wZXJ0aWVzKGRlbW8sIG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCByZXF1aXJlbWVudHMsICZ0ZXhfb2JqLT5tZW1fYWxsb2MubWVtb3J5VHlwZUluZGV4KTsKKyAgICBhc3NlcnQocGFzcyk7CisKKyAgICBlcnIgPSB2a0FsbG9jYXRlTWVtb3J5KGRlbW8tPmRldmljZSwgJnRleF9vYmotPm1lbV9hbGxvYywgTlVMTCwgJih0ZXhfb2JqLT5tZW0pKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICAvKiBiaW5kIG1lbW9yeSAqLworICAgIGVyciA9IHZrQmluZEJ1ZmZlck1lbW9yeShkZW1vLT5kZXZpY2UsIHRleF9vYmotPmJ1ZmZlciwgdGV4X29iai0+bWVtLCAwKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0IGxheW91dDsKKyAgICBtZW1zZXQoJmxheW91dCwgMCwgc2l6ZW9mKGxheW91dCkpOworICAgIGxheW91dC5yb3dQaXRjaCA9IHRleF93aWR0aCAqIDQ7CisKKyAgICB2b2lkICpkYXRhOworICAgIGVyciA9IHZrTWFwTWVtb3J5KGRlbW8tPmRldmljZSwgdGV4X29iai0+bWVtLCAwLCB0ZXhfb2JqLT5tZW1fYWxsb2MuYWxsb2NhdGlvblNpemUsIDAsICZkYXRhKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBpZiAoIWxvYWRUZXh0dXJlKGZpbGVuYW1lLCBkYXRhLCAmbGF5b3V0LCAmdGV4X3dpZHRoLCAmdGV4X2hlaWdodCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBsb2FkaW5nIHRleHR1cmU6ICVzXG4iLCBmaWxlbmFtZSk7CisgICAgfQorCisgICAgdmtVbm1hcE1lbW9yeShkZW1vLT5kZXZpY2UsIHRleF9vYmotPm1lbSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fcHJlcGFyZV90ZXh0dXJlX2ltYWdlKHN0cnVjdCBkZW1vICpkZW1vLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IHRleHR1cmVfb2JqZWN0ICp0ZXhfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ZsYWdzIHJlcXVpcmVkX3Byb3BzKSB7CisgICAgY29uc3QgVmtGb3JtYXQgdGV4X2Zvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbnQzMl90IHRleF93aWR0aDsKKyAgICBpbnQzMl90IHRleF9oZWlnaHQ7CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisgICAgYm9vbCBVX0FTU0VSVF9PTkxZIHBhc3M7CisKKyAgICBpZiAoIWxvYWRUZXh0dXJlKGZpbGVuYW1lLCBOVUxMLCBOVUxMLCAmdGV4X3dpZHRoLCAmdGV4X2hlaWdodCkpIHsKKyAgICAgICAgRVJSX0VYSVQoIkZhaWxlZCB0byBsb2FkIHRleHR1cmVzIiwgIkxvYWQgVGV4dHVyZSBGYWlsdXJlIik7CisgICAgfQorCisgICAgdGV4X29iai0+dGV4X3dpZHRoID0gdGV4X3dpZHRoOworICAgIHRleF9vYmotPnRleF9oZWlnaHQgPSB0ZXhfaGVpZ2h0OworCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRCwKKyAgICAgICAgLmZvcm1hdCA9IHRleF9mb3JtYXQsCisgICAgICAgIC5leHRlbnQgPSB7dGV4X3dpZHRoLCB0ZXhfaGVpZ2h0LCAxfSwKKyAgICAgICAgLm1pcExldmVscyA9IDEsCisgICAgICAgIC5hcnJheUxheWVycyA9IDEsCisgICAgICAgIC5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAudGlsaW5nID0gdGlsaW5nLAorICAgICAgICAudXNhZ2UgPSB1c2FnZSwKKyAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQsCisgICAgfTsKKworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworCisgICAgZXJyID0gdmtDcmVhdGVJbWFnZShkZW1vLT5kZXZpY2UsICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJnRleF9vYmotPmltYWdlKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRlbW8tPmRldmljZSwgdGV4X29iai0+aW1hZ2UsICZtZW1fcmVxcyk7CisKKyAgICB0ZXhfb2JqLT5tZW1fYWxsb2Muc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICB0ZXhfb2JqLT5tZW1fYWxsb2MucE5leHQgPSBOVUxMOworICAgIHRleF9vYmotPm1lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IG1lbV9yZXFzLnNpemU7CisgICAgdGV4X29iai0+bWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IDA7CisKKyAgICBwYXNzID0gbWVtb3J5X3R5cGVfZnJvbV9wcm9wZXJ0aWVzKGRlbW8sIG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCByZXF1aXJlZF9wcm9wcywgJnRleF9vYmotPm1lbV9hbGxvYy5tZW1vcnlUeXBlSW5kZXgpOworICAgIGFzc2VydChwYXNzKTsKKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLworICAgIGVyciA9IHZrQWxsb2NhdGVNZW1vcnkoZGVtby0+ZGV2aWNlLCAmdGV4X29iai0+bWVtX2FsbG9jLCBOVUxMLCAmKHRleF9vYmotPm1lbSkpOworICAgIGFzc2VydCghZXJyKTsKKworICAgIC8qIGJpbmQgbWVtb3J5ICovCisgICAgZXJyID0gdmtCaW5kSW1hZ2VNZW1vcnkoZGVtby0+ZGV2aWNlLCB0ZXhfb2JqLT5pbWFnZSwgdGV4X29iai0+bWVtLCAwKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBpZiAocmVxdWlyZWRfcHJvcHMgJiBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCkgeworICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2Ugc3VicmVzID0geworICAgICAgICAgICAgLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULAorICAgICAgICAgICAgLm1pcExldmVsID0gMCwKKyAgICAgICAgICAgIC5hcnJheUxheWVyID0gMCwKKyAgICAgICAgfTsKKyAgICAgICAgVmtTdWJyZXNvdXJjZUxheW91dCBsYXlvdXQ7CisgICAgICAgIHZvaWQgKmRhdGE7CisKKyAgICAgICAgdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KGRlbW8tPmRldmljZSwgdGV4X29iai0+aW1hZ2UsICZzdWJyZXMsICZsYXlvdXQpOworCisgICAgICAgIGVyciA9IHZrTWFwTWVtb3J5KGRlbW8tPmRldmljZSwgdGV4X29iai0+bWVtLCAwLCB0ZXhfb2JqLT5tZW1fYWxsb2MuYWxsb2NhdGlvblNpemUsIDAsICZkYXRhKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworCisgICAgICAgIGlmICghbG9hZFRleHR1cmUoZmlsZW5hbWUsIGRhdGEsICZsYXlvdXQsICZ0ZXhfd2lkdGgsICZ0ZXhfaGVpZ2h0KSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBsb2FkaW5nIHRleHR1cmU6ICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICB2a1VubWFwTWVtb3J5KGRlbW8tPmRldmljZSwgdGV4X29iai0+bWVtKTsKKyAgICB9CisKKyAgICB0ZXhfb2JqLT5pbWFnZUxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fZGVzdHJveV90ZXh0dXJlKHN0cnVjdCBkZW1vICpkZW1vLCBzdHJ1Y3QgdGV4dHVyZV9vYmplY3QgKnRleF9vYmpzKSB7CisgICAgLyogY2xlYW4gdXAgc3RhZ2luZyByZXNvdXJjZXMgKi8KKyAgICB2a0ZyZWVNZW1vcnkoZGVtby0+ZGV2aWNlLCB0ZXhfb2Jqcy0+bWVtLCBOVUxMKTsKKyAgICBpZiAodGV4X29ianMtPmltYWdlKSB2a0Rlc3Ryb3lJbWFnZShkZW1vLT5kZXZpY2UsIHRleF9vYmpzLT5pbWFnZSwgTlVMTCk7CisgICAgaWYgKHRleF9vYmpzLT5idWZmZXIpIHZrRGVzdHJveUJ1ZmZlcihkZW1vLT5kZXZpY2UsIHRleF9vYmpzLT5idWZmZXIsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBkZW1vX3ByZXBhcmVfdGV4dHVyZXMoc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBjb25zdCBWa0Zvcm1hdCB0ZXhfZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIFZrRm9ybWF0UHJvcGVydGllcyBwcm9wczsKKyAgICB1aW50MzJfdCBpOworCisgICAgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoZGVtby0+Z3B1LCB0ZXhfZm9ybWF0LCAmcHJvcHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IERFTU9fVEVYVFVSRV9DT1VOVDsgaSsrKSB7CisgICAgICAgIFZrUmVzdWx0IFVfQVNTRVJUX09OTFkgZXJyOworCisgICAgICAgIGlmICgocHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0JJVCkgJiYgIWRlbW8tPnVzZV9zdGFnaW5nX2J1ZmZlcikgeworICAgICAgICAgICAgLyogRGV2aWNlIGNhbiB0ZXh0dXJlIHVzaW5nIGxpbmVhciB0ZXh0dXJlcyAqLworICAgICAgICAgICAgZGVtb19wcmVwYXJlX3RleHR1cmVfaW1hZ2UoZGVtbywgdGV4X2ZpbGVzW2ldLCAmZGVtby0+dGV4dHVyZXNbaV0sIFZLX0lNQUdFX1RJTElOR19MSU5FQVIsIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQpOworICAgICAgICAgICAgLy8gTm90aGluZyBpbiB0aGUgcGlwZWxpbmUgbmVlZHMgdG8gYmUgY29tcGxldGUgdG8gc3RhcnQsIGFuZCBkb24ndCBhbGxvdyBmcmFnbWVudAorICAgICAgICAgICAgLy8gc2hhZGVyIHRvIHJ1biB1bnRpbCBsYXlvdXQgdHJhbnNpdGlvbiBjb21wbGV0ZXMKKyAgICAgICAgICAgIGRlbW9fc2V0X2ltYWdlX2xheW91dChkZW1vLCBkZW1vLT50ZXh0dXJlc1tpXS5pbWFnZSwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW8tPnRleHR1cmVzW2ldLmltYWdlTGF5b3V0LCAwLCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCk7CisgICAgICAgICAgICBkZW1vLT5zdGFnaW5nX3RleHR1cmUuaW1hZ2UgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUKSB7CisgICAgICAgICAgICAvKiBNdXN0IHVzZSBzdGFnaW5nIGJ1ZmZlciB0byBjb3B5IGxpbmVhciB0ZXh0dXJlIHRvIG9wdGltaXplZCAqLworCisgICAgICAgICAgICBtZW1zZXQoJmRlbW8tPnN0YWdpbmdfdGV4dHVyZSwgMCwgc2l6ZW9mKGRlbW8tPnN0YWdpbmdfdGV4dHVyZSkpOworICAgICAgICAgICAgZGVtb19wcmVwYXJlX3RleHR1cmVfYnVmZmVyKGRlbW8sIHRleF9maWxlc1tpXSwgJmRlbW8tPnN0YWdpbmdfdGV4dHVyZSk7CisKKyAgICAgICAgICAgIGRlbW9fcHJlcGFyZV90ZXh0dXJlX2ltYWdlKGRlbW8sIHRleF9maWxlc1tpXSwgJmRlbW8tPnRleHR1cmVzW2ldLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQpOworCisgICAgICAgICAgICBkZW1vX3NldF9pbWFnZV9sYXlvdXQoZGVtbywgZGVtby0+dGV4dHVyZXNbaV0uaW1hZ2UsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsIDAsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZFUl9CSVQpOworCisgICAgICAgICAgICBWa0J1ZmZlckltYWdlQ29weSBjb3B5X3JlZ2lvbiA9IHsKKyAgICAgICAgICAgICAgICAuYnVmZmVyT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAuYnVmZmVyUm93TGVuZ3RoID0gZGVtby0+c3RhZ2luZ190ZXh0dXJlLnRleF93aWR0aCwKKyAgICAgICAgICAgICAgICAuYnVmZmVySW1hZ2VIZWlnaHQgPSBkZW1vLT5zdGFnaW5nX3RleHR1cmUudGV4X2hlaWdodCwKKyAgICAgICAgICAgICAgICAuaW1hZ2VTdWJyZXNvdXJjZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAwLCAxfSwKKyAgICAgICAgICAgICAgICAuaW1hZ2VPZmZzZXQgPSB7MCwgMCwgMH0sCisgICAgICAgICAgICAgICAgLmltYWdlRXh0ZW50ID0ge2RlbW8tPnN0YWdpbmdfdGV4dHVyZS50ZXhfd2lkdGgsIGRlbW8tPnN0YWdpbmdfdGV4dHVyZS50ZXhfaGVpZ2h0LCAxfSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoZGVtby0+Y21kLCBkZW1vLT5zdGFnaW5nX3RleHR1cmUuYnVmZmVyLCBkZW1vLT50ZXh0dXJlc1tpXS5pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLCAmY29weV9yZWdpb24pOworCisgICAgICAgICAgICBkZW1vX3NldF9pbWFnZV9sYXlvdXQoZGVtbywgZGVtby0+dGV4dHVyZXNbaV0uaW1hZ2UsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vLT50ZXh0dXJlc1tpXS5pbWFnZUxheW91dCwgVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDYW4ndCBzdXBwb3J0IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSAhPyAqLworICAgICAgICAgICAgYXNzZXJ0KCEiTm8gc3VwcG9ydCBmb3IgUjhHOEI4QThfVU5PUk0gYXMgdGV4dHVyZSBpbWFnZSBmb3JtYXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlciA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAgICAgLm1hZ0ZpbHRlciA9IFZLX0ZJTFRFUl9ORUFSRVNULAorICAgICAgICAgICAgLm1pbkZpbHRlciA9IFZLX0ZJTFRFUl9ORUFSRVNULAorICAgICAgICAgICAgLm1pcG1hcE1vZGUgPSBWS19TQU1QTEVSX01JUE1BUF9NT0RFX05FQVJFU1QsCisgICAgICAgICAgICAuYWRkcmVzc01vZGVVID0gVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRSwKKyAgICAgICAgICAgIC5hZGRyZXNzTW9kZVYgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFLAorICAgICAgICAgICAgLmFkZHJlc3NNb2RlVyA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UsCisgICAgICAgICAgICAubWlwTG9kQmlhcyA9IDAuMGYsCisgICAgICAgICAgICAuYW5pc290cm9weUVuYWJsZSA9IFZLX0ZBTFNFLAorICAgICAgICAgICAgLm1heEFuaXNvdHJvcHkgPSAxLAorICAgICAgICAgICAgLmNvbXBhcmVPcCA9IFZLX0NPTVBBUkVfT1BfTkVWRVIsCisgICAgICAgICAgICAubWluTG9kID0gMC4wZiwKKyAgICAgICAgICAgIC5tYXhMb2QgPSAwLjBmLAorICAgICAgICAgICAgLmJvcmRlckNvbG9yID0gVktfQk9SREVSX0NPTE9SX0ZMT0FUX09QQVFVRV9XSElURSwKKyAgICAgICAgICAgIC51bm5vcm1hbGl6ZWRDb29yZGluYXRlcyA9IFZLX0ZBTFNFLAorICAgICAgICB9OworCisgICAgICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyB2aWV3ID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgICAgICAuaW1hZ2UgPSBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgIC52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCwKKyAgICAgICAgICAgIC5mb3JtYXQgPSB0ZXhfZm9ybWF0LAorICAgICAgICAgICAgLmNvbXBvbmVudHMgPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfUiwKKyAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfRywKKyAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfQiwKKyAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfQSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLnN1YnJlc291cmNlUmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMX0sCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICB9OworCisgICAgICAgIC8qIGNyZWF0ZSBzYW1wbGVyICovCisgICAgICAgIGVyciA9IHZrQ3JlYXRlU2FtcGxlcihkZW1vLT5kZXZpY2UsICZzYW1wbGVyLCBOVUxMLCAmZGVtby0+dGV4dHVyZXNbaV0uc2FtcGxlcik7CisgICAgICAgIGFzc2VydCghZXJyKTsKKworICAgICAgICAvKiBjcmVhdGUgaW1hZ2UgdmlldyAqLworICAgICAgICB2aWV3LmltYWdlID0gZGVtby0+dGV4dHVyZXNbaV0uaW1hZ2U7CisgICAgICAgIGVyciA9IHZrQ3JlYXRlSW1hZ2VWaWV3KGRlbW8tPmRldmljZSwgJnZpZXcsIE5VTEwsICZkZW1vLT50ZXh0dXJlc1tpXS52aWV3KTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworICAgIH0KK30KKwordm9pZCBkZW1vX3ByZXBhcmVfY3ViZV9kYXRhX2J1ZmZlcnMoc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmX2luZm87CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtX2FsbG9jOworICAgIHVpbnQ4X3QgKnBEYXRhOworICAgIG1hdDR4NCBNVlAsIFZQOworICAgIFZrUmVzdWx0IFVfQVNTRVJUX09OTFkgZXJyOworICAgIGJvb2wgVV9BU1NFUlRfT05MWSBwYXNzOworICAgIHN0cnVjdCB2a3RleGN1YmVfdnNfdW5pZm9ybSBkYXRhOworCisgICAgbWF0NHg0X211bChWUCwgZGVtby0+cHJvamVjdGlvbl9tYXRyaXgsIGRlbW8tPnZpZXdfbWF0cml4KTsKKyAgICBtYXQ0eDRfbXVsKE1WUCwgVlAsIGRlbW8tPm1vZGVsX21hdHJpeCk7CisgICAgbWVtY3B5KGRhdGEubXZwLCBNVlAsIHNpemVvZihNVlApKTsKKyAgICAvLyAgICBkdW1wTWF0cml4KCJNVlAiLCBNVlApOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAxMiAqIDM7IGkrKykgeworICAgICAgICBkYXRhLnBvc2l0aW9uW2ldWzBdID0gZ192ZXJ0ZXhfYnVmZmVyX2RhdGFbaSAqIDNdOworICAgICAgICBkYXRhLnBvc2l0aW9uW2ldWzFdID0gZ192ZXJ0ZXhfYnVmZmVyX2RhdGFbaSAqIDMgKyAxXTsKKyAgICAgICAgZGF0YS5wb3NpdGlvbltpXVsyXSA9IGdfdmVydGV4X2J1ZmZlcl9kYXRhW2kgKiAzICsgMl07CisgICAgICAgIGRhdGEucG9zaXRpb25baV1bM10gPSAxLjBmOworICAgICAgICBkYXRhLmF0dHJbaV1bMF0gPSBnX3V2X2J1ZmZlcl9kYXRhWzIgKiBpXTsKKyAgICAgICAgZGF0YS5hdHRyW2ldWzFdID0gZ191dl9idWZmZXJfZGF0YVsyICogaSArIDFdOworICAgICAgICBkYXRhLmF0dHJbaV1bMl0gPSAwOworICAgICAgICBkYXRhLmF0dHJbaV1bM10gPSAwOworICAgIH0KKworICAgIG1lbXNldCgmYnVmX2luZm8sIDAsIHNpemVvZihidWZfaW5mbykpOworICAgIGJ1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1Zl9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICBidWZfaW5mby5zaXplID0gc2l6ZW9mKGRhdGEpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBkZW1vLT5zd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgZXJyID0gdmtDcmVhdGVCdWZmZXIoZGVtby0+ZGV2aWNlLCAmYnVmX2luZm8sIE5VTEwsICZkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fYnVmZmVyKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworCisgICAgICAgIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRlbW8tPmRldmljZSwgZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX2J1ZmZlciwgJm1lbV9yZXFzKTsKKworICAgICAgICBtZW1fYWxsb2Muc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgbWVtX2FsbG9jLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gbWVtX3JlcXMuc2l6ZTsKKyAgICAgICAgbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IDA7CisKKyAgICAgICAgcGFzcyA9IG1lbW9yeV90eXBlX2Zyb21fcHJvcGVydGllcyhkZW1vLCBtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCk7CisgICAgICAgIGFzc2VydChwYXNzKTsKKworICAgICAgICBlcnIgPSB2a0FsbG9jYXRlTWVtb3J5KGRlbW8tPmRldmljZSwgJm1lbV9hbGxvYywgTlVMTCwgJmRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udW5pZm9ybV9tZW1vcnkpOworICAgICAgICBhc3NlcnQoIWVycik7CisKKyAgICAgICAgZXJyID0gdmtNYXBNZW1vcnkoZGVtby0+ZGV2aWNlLCBkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fbWVtb3J5LCAwLCBWS19XSE9MRV9TSVpFLCAwLCAodm9pZCAqKikmcERhdGEpOworICAgICAgICBhc3NlcnQoIWVycik7CisKKyAgICAgICAgbWVtY3B5KHBEYXRhLCAmZGF0YSwgc2l6ZW9mIGRhdGEpOworCisgICAgICAgIHZrVW5tYXBNZW1vcnkoZGVtby0+ZGV2aWNlLCBkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fbWVtb3J5KTsKKworICAgICAgICBlcnIgPSB2a0JpbmRCdWZmZXJNZW1vcnkoZGVtby0+ZGV2aWNlLCBkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX21lbW9yeSwgMCk7CisgICAgICAgIGFzc2VydCghZXJyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fcHJlcGFyZV9kZXNjcmlwdG9yX2xheW91dChzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgbGF5b3V0X2JpbmRpbmdzWzJdID0geworICAgICAgICBbMF0gPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5iaW5kaW5nID0gMCwKKyAgICAgICAgICAgICAgICAuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsCisgICAgICAgICAgICAgICAgLmRlc2NyaXB0b3JDb3VudCA9IDEsCisgICAgICAgICAgICAgICAgLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwKKyAgICAgICAgICAgICAgICAucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTCwKKyAgICAgICAgICAgIH0sCisgICAgICAgIFsxXSA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLmJpbmRpbmcgPSAxLAorICAgICAgICAgICAgICAgIC5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLAorICAgICAgICAgICAgICAgIC5kZXNjcmlwdG9yQ291bnQgPSBERU1PX1RFWFRVUkVfQ09VTlQsCisgICAgICAgICAgICAgICAgLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULAorICAgICAgICAgICAgICAgIC5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMLAorICAgICAgICAgICAgfSwKKyAgICB9OworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gZGVzY3JpcHRvcl9sYXlvdXQgPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgLmJpbmRpbmdDb3VudCA9IDIsCisgICAgICAgIC5wQmluZGluZ3MgPSBsYXlvdXRfYmluZGluZ3MsCisgICAgfTsKKyAgICBWa1Jlc3VsdCBVX0FTU0VSVF9PTkxZIGVycjsKKworICAgIGVyciA9IHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dChkZW1vLT5kZXZpY2UsICZkZXNjcmlwdG9yX2xheW91dCwgTlVMTCwgJmRlbW8tPmRlc2NfbGF5b3V0KTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBwUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvID0geworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgIC5zZXRMYXlvdXRDb3VudCA9IDEsCisgICAgICAgIC5wU2V0TGF5b3V0cyA9ICZkZW1vLT5kZXNjX2xheW91dCwKKyAgICB9OworCisgICAgZXJyID0gdmtDcmVhdGVQaXBlbGluZUxheW91dChkZW1vLT5kZXZpY2UsICZwUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLCBOVUxMLCAmZGVtby0+cGlwZWxpbmVfbGF5b3V0KTsKKyAgICBhc3NlcnQoIWVycik7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fcHJlcGFyZV9yZW5kZXJfcGFzcyhzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIC8vIFRoZSBpbml0aWFsIGxheW91dCBmb3IgdGhlIGNvbG9yIGFuZCBkZXB0aCBhdHRhY2htZW50cyB3aWxsIGJlIExBWU9VVF9VTkRFRklORUQKKyAgICAvLyBiZWNhdXNlIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVycGFzcywgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVpciBjb250ZW50cy4KKyAgICAvLyBBdCB0aGUgc3RhcnQgb2YgdGhlIHN1YnBhc3MsIHRoZSBjb2xvciBhdHRhY2htZW50J3MgbGF5b3V0IHdpbGwgYmUgdHJhbnNpdGlvbmVkCisgICAgLy8gdG8gTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCBhbmQgdGhlIGRlcHRoIHN0ZW5jaWwgYXR0YWNobWVudCdzIGxheW91dAorICAgIC8vIHdpbGwgYmUgdHJhbnNpdGlvbmVkIHRvIExBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTC4gIEF0IHRoZSBlbmQgb2YKKyAgICAvLyB0aGUgcmVuZGVycGFzcywgdGhlIGNvbG9yIGF0dGFjaG1lbnQncyBsYXlvdXQgd2lsbCBiZSB0cmFuc2l0aW9uZWQgdG8KKyAgICAvLyBMQVlPVVRfUFJFU0VOVF9TUkNfS0hSIHRvIGJlIHJlYWR5IHRvIHByZXNlbnQuICBUaGlzIGlzIGFsbCBkb25lIGFzIHBhcnQgb2YKKyAgICAvLyB0aGUgcmVuZGVycGFzcywgbm8gYmFycmllcnMgYXJlIG5lY2Vzc2FyeS4KKyAgICBjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50c1syXSA9IHsKKyAgICAgICAgWzBdID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAuZm9ybWF0ID0gZGVtby0+Zm9ybWF0LAorICAgICAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgICAgICAgICAgLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgLmxvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwKKyAgICAgICAgICAgICAgICAuc3RvcmVPcCA9IFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkUsCisgICAgICAgICAgICAgICAgLnN0ZW5jaWxMb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgIC5zdGVuY2lsU3RvcmVPcCA9IFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgIC5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgICAgICAgICAuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSLAorICAgICAgICAgICAgfSwKKyAgICAgICAgWzFdID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAuZm9ybWF0ID0gZGVtby0+ZGVwdGguZm9ybWF0LAorICAgICAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgICAgICAgICAgLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgLmxvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwKKyAgICAgICAgICAgICAgICAuc3RvcmVPcCA9IFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgIC5zdGVuY2lsTG9hZE9wID0gVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAuc3RlbmNpbFN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICAgICAgLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgICAgICAgICAgfSwKKyAgICB9OworICAgIGNvbnN0IFZrQXR0YWNobWVudFJlZmVyZW5jZSBjb2xvcl9yZWZlcmVuY2UgPSB7CisgICAgICAgIC5hdHRhY2htZW50ID0gMCwKKyAgICAgICAgLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgfTsKKyAgICBjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgZGVwdGhfcmVmZXJlbmNlID0geworICAgICAgICAuYXR0YWNobWVudCA9IDEsCisgICAgICAgIC5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgfTsKKyAgICBjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0geworICAgICAgICAucGlwZWxpbmVCaW5kUG9pbnQgPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLAorICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAuaW5wdXRBdHRhY2htZW50Q291bnQgPSAwLAorICAgICAgICAucElucHV0QXR0YWNobWVudHMgPSBOVUxMLAorICAgICAgICAuY29sb3JBdHRhY2htZW50Q291bnQgPSAxLAorICAgICAgICAucENvbG9yQXR0YWNobWVudHMgPSAmY29sb3JfcmVmZXJlbmNlLAorICAgICAgICAucFJlc29sdmVBdHRhY2htZW50cyA9IE5VTEwsCisgICAgICAgIC5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9ICZkZXB0aF9yZWZlcmVuY2UsCisgICAgICAgIC5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudCA9IDAsCisgICAgICAgIC5wUHJlc2VydmVBdHRhY2htZW50cyA9IE5VTEwsCisgICAgfTsKKworICAgIFZrU3VicGFzc0RlcGVuZGVuY3kgYXR0YWNobWVudERlcGVuZGVuY2llc1syXSA9IHsKKyAgICAgICAgWzBdID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZXB0aCBidWZmZXIgaXMgc2hhcmVkIGJldHdlZW4gc3dhcGNoYWluIGltYWdlcworICAgICAgICAgICAgICAgIC5zcmNTdWJwYXNzID0gVktfU1VCUEFTU19FWFRFUk5BTCwKKyAgICAgICAgICAgICAgICAuZHN0U3VicGFzcyA9IDAsCisgICAgICAgICAgICAgICAgLnNyY1N0YWdlTWFzayA9IFZLX1BJUEVMSU5FX1NUQUdFX0VBUkxZX0ZSQUdNRU5UX1RFU1RTX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0xBVEVfRlJBR01FTlRfVEVTVFNfQklULAorICAgICAgICAgICAgICAgIC5kc3RTdGFnZU1hc2sgPSBWS19QSVBFTElORV9TVEFHRV9FQVJMWV9GUkFHTUVOVF9URVNUU19CSVQgfCBWS19QSVBFTElORV9TVEFHRV9MQVRFX0ZSQUdNRU5UX1RFU1RTX0JJVCwKKyAgICAgICAgICAgICAgICAuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklULAorICAgICAgICAgICAgICAgIC5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9SRUFEX0JJVCB8IFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklULAorICAgICAgICAgICAgICAgIC5kZXBlbmRlbmN5RmxhZ3MgPSAwLAorICAgICAgICAgICAgfSwKKyAgICAgICAgWzFdID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJbWFnZSBMYXlvdXQgVHJhbnNpdGlvbgorICAgICAgICAgICAgICAgIC5zcmNTdWJwYXNzID0gVktfU1VCUEFTU19FWFRFUk5BTCwKKyAgICAgICAgICAgICAgICAuZHN0U3VicGFzcyA9IDAsCisgICAgICAgICAgICAgICAgLnNyY1N0YWdlTWFzayA9IFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAgICAgICAgICAgICAuZHN0U3RhZ2VNYXNrID0gVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgIC5zcmNBY2Nlc3NNYXNrID0gMCwKKyAgICAgICAgICAgICAgICAuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVCB8IFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfQklULAorICAgICAgICAgICAgICAgIC5kZXBlbmRlbmN5RmxhZ3MgPSAwLAorICAgICAgICAgICAgfSwKKyAgICB9OworCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycF9pbmZvID0geworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgLmF0dGFjaG1lbnRDb3VudCA9IDIsCisgICAgICAgIC5wQXR0YWNobWVudHMgPSBhdHRhY2htZW50cywKKyAgICAgICAgLnN1YnBhc3NDb3VudCA9IDEsCisgICAgICAgIC5wU3VicGFzc2VzID0gJnN1YnBhc3MsCisgICAgICAgIC5kZXBlbmRlbmN5Q291bnQgPSAyLAorICAgICAgICAucERlcGVuZGVuY2llcyA9IGF0dGFjaG1lbnREZXBlbmRlbmNpZXMsCisgICAgfTsKKyAgICBWa1Jlc3VsdCBVX0FTU0VSVF9PTkxZIGVycjsKKworICAgIGVyciA9IHZrQ3JlYXRlUmVuZGVyUGFzcyhkZW1vLT5kZXZpY2UsICZycF9pbmZvLCBOVUxMLCAmZGVtby0+cmVuZGVyX3Bhc3MpOworICAgIGFzc2VydCghZXJyKTsKK30KKworc3RhdGljIFZrU2hhZGVyTW9kdWxlIGRlbW9fcHJlcGFyZV9zaGFkZXJfbW9kdWxlKHN0cnVjdCBkZW1vICpkZW1vLCBjb25zdCB1aW50MzJfdCAqY29kZSwgc2l6ZV90IHNpemUpIHsKKyAgICBWa1NoYWRlck1vZHVsZSBtb2R1bGU7CisgICAgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIG1vZHVsZUNyZWF0ZUluZm87CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisKKyAgICBtb2R1bGVDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTzsKKyAgICBtb2R1bGVDcmVhdGVJbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBtb2R1bGVDcmVhdGVJbmZvLmZsYWdzID0gMDsKKyAgICBtb2R1bGVDcmVhdGVJbmZvLmNvZGVTaXplID0gc2l6ZTsKKyAgICBtb2R1bGVDcmVhdGVJbmZvLnBDb2RlID0gY29kZTsKKworICAgIGVyciA9IHZrQ3JlYXRlU2hhZGVyTW9kdWxlKGRlbW8tPmRldmljZSwgJm1vZHVsZUNyZWF0ZUluZm8sIE5VTEwsICZtb2R1bGUpOworICAgIGFzc2VydCghZXJyKTsKKworICAgIHJldHVybiBtb2R1bGU7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fcHJlcGFyZV92cyhzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIGNvbnN0IHVpbnQzMl90IHZzX2NvZGVbXSA9IHsKKyNpbmNsdWRlICJjdWJlLnZlcnQuaW5jIgorICAgIH07CisgICAgZGVtby0+dmVydF9zaGFkZXJfbW9kdWxlID0gZGVtb19wcmVwYXJlX3NoYWRlcl9tb2R1bGUoZGVtbywgdnNfY29kZSwgc2l6ZW9mKHZzX2NvZGUpKTsKK30KKworc3RhdGljIHZvaWQgZGVtb19wcmVwYXJlX2ZzKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgY29uc3QgdWludDMyX3QgZnNfY29kZVtdID0geworI2luY2x1ZGUgImN1YmUuZnJhZy5pbmMiCisgICAgfTsKKyAgICBkZW1vLT5mcmFnX3NoYWRlcl9tb2R1bGUgPSBkZW1vX3ByZXBhcmVfc2hhZGVyX21vZHVsZShkZW1vLCBmc19jb2RlLCBzaXplb2YoZnNfY29kZSkpOworfQorCitzdGF0aWMgdm9pZCBkZW1vX3ByZXBhcmVfcGlwZWxpbmUoc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHBpcGVsaW5lOworICAgIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gcGlwZWxpbmVDYWNoZTsKKyAgICBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gdmk7CisgICAgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gaWE7CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gcnM7CisgICAgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gY2I7CisgICAgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyBkczsKKyAgICBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gdnA7CisgICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIG1zOworICAgIFZrRHluYW1pY1N0YXRlIGR5bmFtaWNTdGF0ZUVuYWJsZXNbVktfRFlOQU1JQ19TVEFURV9SQU5HRV9TSVpFXTsKKyAgICBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyBkeW5hbWljU3RhdGU7CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisKKyAgICBtZW1zZXQoZHluYW1pY1N0YXRlRW5hYmxlcywgMCwgc2l6ZW9mIGR5bmFtaWNTdGF0ZUVuYWJsZXMpOworICAgIG1lbXNldCgmZHluYW1pY1N0YXRlLCAwLCBzaXplb2YgZHluYW1pY1N0YXRlKTsKKyAgICBkeW5hbWljU3RhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPOworICAgIGR5bmFtaWNTdGF0ZS5wRHluYW1pY1N0YXRlcyA9IGR5bmFtaWNTdGF0ZUVuYWJsZXM7CisKKyAgICBtZW1zZXQoJnBpcGVsaW5lLCAwLCBzaXplb2YocGlwZWxpbmUpKTsKKyAgICBwaXBlbGluZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lLmxheW91dCA9IGRlbW8tPnBpcGVsaW5lX2xheW91dDsKKworICAgIG1lbXNldCgmdmksIDAsIHNpemVvZih2aSkpOworICAgIHZpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX1NUQVRFX0NSRUFURV9JTkZPOworCisgICAgbWVtc2V0KCZpYSwgMCwgc2l6ZW9mKGlhKSk7CisgICAgaWEuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBpYS50b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUOworCisgICAgbWVtc2V0KCZycywgMCwgc2l6ZW9mKHJzKSk7CisgICAgcnMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX0NSRUFURV9JTkZPOworICAgIHJzLnBvbHlnb25Nb2RlID0gVktfUE9MWUdPTl9NT0RFX0ZJTEw7CisgICAgcnMuY3VsbE1vZGUgPSBWS19DVUxMX01PREVfQkFDS19CSVQ7CisgICAgcnMuZnJvbnRGYWNlID0gVktfRlJPTlRfRkFDRV9DT1VOVEVSX0NMT0NLV0lTRTsKKyAgICBycy5kZXB0aENsYW1wRW5hYmxlID0gVktfRkFMU0U7CisgICAgcnMucmFzdGVyaXplckRpc2NhcmRFbmFibGUgPSBWS19GQUxTRTsKKyAgICBycy5kZXB0aEJpYXNFbmFibGUgPSBWS19GQUxTRTsKKyAgICBycy5saW5lV2lkdGggPSAxLjBmOworCisgICAgbWVtc2V0KCZjYiwgMCwgc2l6ZW9mKGNiKSk7CisgICAgY2Iuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBhdHRfc3RhdGVbMV07CisgICAgbWVtc2V0KGF0dF9zdGF0ZSwgMCwgc2l6ZW9mKGF0dF9zdGF0ZSkpOworICAgIGF0dF9zdGF0ZVswXS5jb2xvcldyaXRlTWFzayA9IDB4ZjsKKyAgICBhdHRfc3RhdGVbMF0uYmxlbmRFbmFibGUgPSBWS19GQUxTRTsKKyAgICBjYi5hdHRhY2htZW50Q291bnQgPSAxOworICAgIGNiLnBBdHRhY2htZW50cyA9IGF0dF9zdGF0ZTsKKworICAgIG1lbXNldCgmdnAsIDAsIHNpemVvZih2cCkpOworICAgIHZwLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgdnAudmlld3BvcnRDb3VudCA9IDE7CisgICAgZHluYW1pY1N0YXRlRW5hYmxlc1tkeW5hbWljU3RhdGUuZHluYW1pY1N0YXRlQ291bnQrK10gPSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUOworICAgIHZwLnNjaXNzb3JDb3VudCA9IDE7CisgICAgZHluYW1pY1N0YXRlRW5hYmxlc1tkeW5hbWljU3RhdGUuZHluYW1pY1N0YXRlQ291bnQrK10gPSBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1I7CisKKyAgICBtZW1zZXQoJmRzLCAwLCBzaXplb2YoZHMpKTsKKyAgICBkcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZHMuZGVwdGhUZXN0RW5hYmxlID0gVktfVFJVRTsKKyAgICBkcy5kZXB0aFdyaXRlRW5hYmxlID0gVktfVFJVRTsKKyAgICBkcy5kZXB0aENvbXBhcmVPcCA9IFZLX0NPTVBBUkVfT1BfTEVTU19PUl9FUVVBTDsKKyAgICBkcy5kZXB0aEJvdW5kc1Rlc3RFbmFibGUgPSBWS19GQUxTRTsKKyAgICBkcy5iYWNrLmZhaWxPcCA9IFZLX1NURU5DSUxfT1BfS0VFUDsKKyAgICBkcy5iYWNrLnBhc3NPcCA9IFZLX1NURU5DSUxfT1BfS0VFUDsKKyAgICBkcy5iYWNrLmNvbXBhcmVPcCA9IFZLX0NPTVBBUkVfT1BfQUxXQVlTOworICAgIGRzLnN0ZW5jaWxUZXN0RW5hYmxlID0gVktfRkFMU0U7CisgICAgZHMuZnJvbnQgPSBkcy5iYWNrOworCisgICAgbWVtc2V0KCZtcywgMCwgc2l6ZW9mKG1zKSk7CisgICAgbXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBtcy5wU2FtcGxlTWFzayA9IE5VTEw7CisgICAgbXMucmFzdGVyaXphdGlvblNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisKKyAgICBkZW1vX3ByZXBhcmVfdnMoZGVtbyk7CisgICAgZGVtb19wcmVwYXJlX2ZzKGRlbW8pOworCisgICAgLy8gVHdvIHN0YWdlczogdnMgYW5kIGZzCisgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzaGFkZXJTdGFnZXNbMl07CisgICAgbWVtc2V0KCZzaGFkZXJTdGFnZXMsIDAsIDIgKiBzaXplb2YoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbykpOworCisgICAgc2hhZGVyU3RhZ2VzWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgIHNoYWRlclN0YWdlc1swXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOworICAgIHNoYWRlclN0YWdlc1swXS5tb2R1bGUgPSBkZW1vLT52ZXJ0X3NoYWRlcl9tb2R1bGU7CisgICAgc2hhZGVyU3RhZ2VzWzBdLnBOYW1lID0gIm1haW4iOworCisgICAgc2hhZGVyU3RhZ2VzWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgIHNoYWRlclN0YWdlc1sxXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgc2hhZGVyU3RhZ2VzWzFdLm1vZHVsZSA9IGRlbW8tPmZyYWdfc2hhZGVyX21vZHVsZTsKKyAgICBzaGFkZXJTdGFnZXNbMV0ucE5hbWUgPSAibWFpbiI7CisKKyAgICBtZW1zZXQoJnBpcGVsaW5lQ2FjaGUsIDAsIHNpemVvZihwaXBlbGluZUNhY2hlKSk7CisgICAgcGlwZWxpbmVDYWNoZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NBQ0hFX0NSRUFURV9JTkZPOworCisgICAgZXJyID0gdmtDcmVhdGVQaXBlbGluZUNhY2hlKGRlbW8tPmRldmljZSwgJnBpcGVsaW5lQ2FjaGUsIE5VTEwsICZkZW1vLT5waXBlbGluZUNhY2hlKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBwaXBlbGluZS5wVmVydGV4SW5wdXRTdGF0ZSA9ICZ2aTsKKyAgICBwaXBlbGluZS5wSW5wdXRBc3NlbWJseVN0YXRlID0gJmlhOworICAgIHBpcGVsaW5lLnBSYXN0ZXJpemF0aW9uU3RhdGUgPSAmcnM7CisgICAgcGlwZWxpbmUucENvbG9yQmxlbmRTdGF0ZSA9ICZjYjsKKyAgICBwaXBlbGluZS5wTXVsdGlzYW1wbGVTdGF0ZSA9ICZtczsKKyAgICBwaXBlbGluZS5wVmlld3BvcnRTdGF0ZSA9ICZ2cDsKKyAgICBwaXBlbGluZS5wRGVwdGhTdGVuY2lsU3RhdGUgPSAmZHM7CisgICAgcGlwZWxpbmUuc3RhZ2VDb3VudCA9IEFSUkFZX1NJWkUoc2hhZGVyU3RhZ2VzKTsKKyAgICBwaXBlbGluZS5wU3RhZ2VzID0gc2hhZGVyU3RhZ2VzOworICAgIHBpcGVsaW5lLnJlbmRlclBhc3MgPSBkZW1vLT5yZW5kZXJfcGFzczsKKyAgICBwaXBlbGluZS5wRHluYW1pY1N0YXRlID0gJmR5bmFtaWNTdGF0ZTsKKworICAgIHBpcGVsaW5lLnJlbmRlclBhc3MgPSBkZW1vLT5yZW5kZXJfcGFzczsKKworICAgIGVyciA9IHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGVtby0+ZGV2aWNlLCBkZW1vLT5waXBlbGluZUNhY2hlLCAxLCAmcGlwZWxpbmUsIE5VTEwsICZkZW1vLT5waXBlbGluZSk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgdmtEZXN0cm95U2hhZGVyTW9kdWxlKGRlbW8tPmRldmljZSwgZGVtby0+ZnJhZ19zaGFkZXJfbW9kdWxlLCBOVUxMKTsKKyAgICB2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUoZGVtby0+ZGV2aWNlLCBkZW1vLT52ZXJ0X3NoYWRlcl9tb2R1bGUsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBkZW1vX3ByZXBhcmVfZGVzY3JpcHRvcl9wb29sKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbFNpemUgdHlwZV9jb3VudHNbMl0gPSB7CisgICAgICAgIFswXSA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsCisgICAgICAgICAgICAgICAgLmRlc2NyaXB0b3JDb3VudCA9IGRlbW8tPnN3YXBjaGFpbkltYWdlQ291bnQsCisgICAgICAgICAgICB9LAorICAgICAgICBbMV0gPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC50eXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsCisgICAgICAgICAgICAgICAgLmRlc2NyaXB0b3JDb3VudCA9IGRlbW8tPnN3YXBjaGFpbkltYWdlQ291bnQgKiBERU1PX1RFWFRVUkVfQ09VTlQsCisgICAgICAgICAgICB9LAorICAgIH07CisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gZGVzY3JpcHRvcl9wb29sID0geworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgIC5tYXhTZXRzID0gZGVtby0+c3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICAgICAgLnBvb2xTaXplQ291bnQgPSAyLAorICAgICAgICAucFBvb2xTaXplcyA9IHR5cGVfY291bnRzLAorICAgIH07CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisKKyAgICBlcnIgPSB2a0NyZWF0ZURlc2NyaXB0b3JQb29sKGRlbW8tPmRldmljZSwgJmRlc2NyaXB0b3JfcG9vbCwgTlVMTCwgJmRlbW8tPmRlc2NfcG9vbCk7CisgICAgYXNzZXJ0KCFlcnIpOworfQorCitzdGF0aWMgdm9pZCBkZW1vX3ByZXBhcmVfZGVzY3JpcHRvcl9zZXQoc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gdGV4X2Rlc2NzW0RFTU9fVEVYVFVSRV9DT1VOVF07CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgd3JpdGVzWzJdOworICAgIFZrUmVzdWx0IFVfQVNTRVJUX09OTFkgZXJyOworCisgICAgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGFsbG9jX2luZm8gPSB7LnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmlwdG9yUG9vbCA9IGRlbW8tPmRlc2NfcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpcHRvclNldENvdW50ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucFNldExheW91dHMgPSAmZGVtby0+ZGVzY19sYXlvdXR9OworCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmZXJfaW5mbzsKKyAgICBidWZmZXJfaW5mby5vZmZzZXQgPSAwOworICAgIGJ1ZmZlcl9pbmZvLnJhbmdlID0gc2l6ZW9mKHN0cnVjdCB2a3RleGN1YmVfdnNfdW5pZm9ybSk7CisKKyAgICBtZW1zZXQoJnRleF9kZXNjcywgMCwgc2l6ZW9mKHRleF9kZXNjcykpOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgREVNT19URVhUVVJFX0NPVU5UOyBpKyspIHsKKyAgICAgICAgdGV4X2Rlc2NzW2ldLnNhbXBsZXIgPSBkZW1vLT50ZXh0dXJlc1tpXS5zYW1wbGVyOworICAgICAgICB0ZXhfZGVzY3NbaV0uaW1hZ2VWaWV3ID0gZGVtby0+dGV4dHVyZXNbaV0udmlldzsKKyAgICAgICAgdGV4X2Rlc2NzW2ldLmltYWdlTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDsKKyAgICB9CisKKyAgICBtZW1zZXQoJndyaXRlcywgMCwgc2l6ZW9mKHdyaXRlcykpOworCisgICAgd3JpdGVzWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgd3JpdGVzWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgd3JpdGVzWzBdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIHdyaXRlc1swXS5wQnVmZmVySW5mbyA9ICZidWZmZXJfaW5mbzsKKworICAgIHdyaXRlc1sxXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIHdyaXRlc1sxXS5kc3RCaW5kaW5nID0gMTsKKyAgICB3cml0ZXNbMV0uZGVzY3JpcHRvckNvdW50ID0gREVNT19URVhUVVJFX0NPVU5UOworICAgIHdyaXRlc1sxXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIHdyaXRlc1sxXS5wSW1hZ2VJbmZvID0gdGV4X2Rlc2NzOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBkZW1vLT5zd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgZXJyID0gdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKGRlbW8tPmRldmljZSwgJmFsbG9jX2luZm8sICZkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmRlc2NyaXB0b3Jfc2V0KTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworICAgICAgICBidWZmZXJfaW5mby5idWZmZXIgPSBkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fYnVmZmVyOworICAgICAgICB3cml0ZXNbMF0uZHN0U2V0ID0gZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5kZXNjcmlwdG9yX3NldDsKKyAgICAgICAgd3JpdGVzWzFdLmRzdFNldCA9IGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uZGVzY3JpcHRvcl9zZXQ7CisgICAgICAgIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoZGVtby0+ZGV2aWNlLCAyLCB3cml0ZXMsIDAsIE5VTEwpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVtb19wcmVwYXJlX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIFZrSW1hZ2VWaWV3IGF0dGFjaG1lbnRzWzJdOworICAgIGF0dGFjaG1lbnRzWzFdID0gZGVtby0+ZGVwdGgudmlldzsKKworICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZiX2luZm8gPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAucmVuZGVyUGFzcyA9IGRlbW8tPnJlbmRlcl9wYXNzLAorICAgICAgICAuYXR0YWNobWVudENvdW50ID0gMiwKKyAgICAgICAgLnBBdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzLAorICAgICAgICAud2lkdGggPSBkZW1vLT53aWR0aCwKKyAgICAgICAgLmhlaWdodCA9IGRlbW8tPmhlaWdodCwKKyAgICAgICAgLmxheWVycyA9IDEsCisgICAgfTsKKyAgICBWa1Jlc3VsdCBVX0FTU0VSVF9PTkxZIGVycjsKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlbW8tPnN3YXBjaGFpbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICBhdHRhY2htZW50c1swXSA9IGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udmlldzsKKyAgICAgICAgZXJyID0gdmtDcmVhdGVGcmFtZWJ1ZmZlcihkZW1vLT5kZXZpY2UsICZmYl9pbmZvLCBOVUxMLCAmZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5mcmFtZWJ1ZmZlcik7CisgICAgICAgIGFzc2VydCghZXJyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fcHJlcGFyZShzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIFZrUmVzdWx0IFVfQVNTRVJUX09OTFkgZXJyOworICAgIGlmIChkZW1vLT5jbWRfcG9vbCA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBjbWRfcG9vbF9pbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgICAgIC5xdWV1ZUZhbWlseUluZGV4ID0gZGVtby0+Z3JhcGhpY3NfcXVldWVfZmFtaWx5X2luZGV4LAorICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgfTsKKyAgICAgICAgZXJyID0gdmtDcmVhdGVDb21tYW5kUG9vbChkZW1vLT5kZXZpY2UsICZjbWRfcG9vbF9pbmZvLCBOVUxMLCAmZGVtby0+Y21kX3Bvb2wpOworICAgICAgICBhc3NlcnQoIWVycik7CisgICAgfQorCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNtZCA9IHsKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgLmNvbW1hbmRQb29sID0gZGVtby0+Y21kX3Bvb2wsCisgICAgICAgIC5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlksCisgICAgICAgIC5jb21tYW5kQnVmZmVyQ291bnQgPSAxLAorICAgIH07CisgICAgZXJyID0gdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKGRlbW8tPmRldmljZSwgJmNtZCwgJmRlbW8tPmNtZCk7CisgICAgYXNzZXJ0KCFlcnIpOworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjbWRfYnVmX2luZm8gPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sCisgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgIC5wSW5oZXJpdGFuY2VJbmZvID0gTlVMTCwKKyAgICB9OworICAgIGVyciA9IHZrQmVnaW5Db21tYW5kQnVmZmVyKGRlbW8tPmNtZCwgJmNtZF9idWZfaW5mbyk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgZGVtb19wcmVwYXJlX2J1ZmZlcnMoZGVtbyk7CisKKyAgICBpZiAoZGVtby0+aXNfbWluaW1pemVkKSB7CisgICAgICAgIGRlbW8tPnByZXBhcmVkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZW1vX3ByZXBhcmVfZGVwdGgoZGVtbyk7CisgICAgZGVtb19wcmVwYXJlX3RleHR1cmVzKGRlbW8pOworICAgIGRlbW9fcHJlcGFyZV9jdWJlX2RhdGFfYnVmZmVycyhkZW1vKTsKKworICAgIGRlbW9fcHJlcGFyZV9kZXNjcmlwdG9yX2xheW91dChkZW1vKTsKKyAgICBkZW1vX3ByZXBhcmVfcmVuZGVyX3Bhc3MoZGVtbyk7CisgICAgZGVtb19wcmVwYXJlX3BpcGVsaW5lKGRlbW8pOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlbW8tPnN3YXBjaGFpbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICBlcnIgPSB2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoZGVtby0+ZGV2aWNlLCAmY21kLCAmZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5jbWQpOworICAgICAgICBhc3NlcnQoIWVycik7CisgICAgfQorCisgICAgaWYgKGRlbW8tPnNlcGFyYXRlX3ByZXNlbnRfcXVldWUpIHsKKyAgICAgICAgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gcHJlc2VudF9jbWRfcG9vbF9pbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgICAgIC5xdWV1ZUZhbWlseUluZGV4ID0gZGVtby0+cHJlc2VudF9xdWV1ZV9mYW1pbHlfaW5kZXgsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICB9OworICAgICAgICBlcnIgPSB2a0NyZWF0ZUNvbW1hbmRQb29sKGRlbW8tPmRldmljZSwgJnByZXNlbnRfY21kX3Bvb2xfaW5mbywgTlVMTCwgJmRlbW8tPnByZXNlbnRfY21kX3Bvb2wpOworICAgICAgICBhc3NlcnQoIWVycik7CisgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBwcmVzZW50X2NtZF9pbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgICAgICAuY29tbWFuZFBvb2wgPSBkZW1vLT5wcmVzZW50X2NtZF9wb29sLAorICAgICAgICAgICAgLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSwKKyAgICAgICAgICAgIC5jb21tYW5kQnVmZmVyQ291bnQgPSAxLAorICAgICAgICB9OworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVtby0+c3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBlcnIgPSB2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoZGVtby0+ZGV2aWNlLCAmcHJlc2VudF9jbWRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5ncmFwaGljc190b19wcmVzZW50X2NtZCk7CisgICAgICAgICAgICBhc3NlcnQoIWVycik7CisgICAgICAgICAgICBkZW1vX2J1aWxkX2ltYWdlX293bmVyc2hpcF9jbWQoZGVtbywgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZW1vX3ByZXBhcmVfZGVzY3JpcHRvcl9wb29sKGRlbW8pOworICAgIGRlbW9fcHJlcGFyZV9kZXNjcmlwdG9yX3NldChkZW1vKTsKKworICAgIGRlbW9fcHJlcGFyZV9mcmFtZWJ1ZmZlcnMoZGVtbyk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVtby0+c3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgIGRlbW8tPmN1cnJlbnRfYnVmZmVyID0gaTsKKyAgICAgICAgZGVtb19kcmF3X2J1aWxkX2NtZChkZW1vLCBkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmNtZCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQcmVwYXJlIGZ1bmN0aW9ucyBhYm92ZSBtYXkgZ2VuZXJhdGUgcGlwZWxpbmUgY29tbWFuZHMKKyAgICAgKiB0aGF0IG5lZWQgdG8gYmUgZmx1c2hlZCBiZWZvcmUgYmVnaW5uaW5nIHRoZSByZW5kZXIgbG9vcC4KKyAgICAgKi8KKyAgICBkZW1vX2ZsdXNoX2luaXRfY21kKGRlbW8pOworICAgIGlmIChkZW1vLT5zdGFnaW5nX3RleHR1cmUuYnVmZmVyKSB7CisgICAgICAgIGRlbW9fZGVzdHJveV90ZXh0dXJlKGRlbW8sICZkZW1vLT5zdGFnaW5nX3RleHR1cmUpOworICAgIH0KKworICAgIGRlbW8tPmN1cnJlbnRfYnVmZmVyID0gMDsKKyAgICBkZW1vLT5wcmVwYXJlZCA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fY2xlYW51cChzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIHVpbnQzMl90IGk7CisKKyAgICBkZW1vLT5wcmVwYXJlZCA9IGZhbHNlOworICAgIHZrRGV2aWNlV2FpdElkbGUoZGVtby0+ZGV2aWNlKTsKKworICAgIC8vIFdhaXQgZm9yIGZlbmNlcyBmcm9tIHByZXNlbnQgb3BlcmF0aW9ucworICAgIGZvciAoaSA9IDA7IGkgPCBGUkFNRV9MQUc7IGkrKykgeworICAgICAgICB2a1dhaXRGb3JGZW5jZXMoZGVtby0+ZGV2aWNlLCAxLCAmZGVtby0+ZmVuY2VzW2ldLCBWS19UUlVFLCBVSU5UNjRfTUFYKTsKKyAgICAgICAgdmtEZXN0cm95RmVuY2UoZGVtby0+ZGV2aWNlLCBkZW1vLT5mZW5jZXNbaV0sIE5VTEwpOworICAgICAgICB2a0Rlc3Ryb3lTZW1hcGhvcmUoZGVtby0+ZGV2aWNlLCBkZW1vLT5pbWFnZV9hY3F1aXJlZF9zZW1hcGhvcmVzW2ldLCBOVUxMKTsKKyAgICAgICAgdmtEZXN0cm95U2VtYXBob3JlKGRlbW8tPmRldmljZSwgZGVtby0+ZHJhd19jb21wbGV0ZV9zZW1hcGhvcmVzW2ldLCBOVUxMKTsKKyAgICAgICAgaWYgKGRlbW8tPnNlcGFyYXRlX3ByZXNlbnRfcXVldWUpIHsKKyAgICAgICAgICAgIHZrRGVzdHJveVNlbWFwaG9yZShkZW1vLT5kZXZpY2UsIGRlbW8tPmltYWdlX293bmVyc2hpcF9zZW1hcGhvcmVzW2ldLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1pbmltaXplZCwgZGVtb19yZXNpemUgaGFzIGFscmVhZHkgZG9uZSBzb21lIGNsZWFudXAgZm9yIHVzLgorICAgIGlmICghZGVtby0+aXNfbWluaW1pemVkKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZW1vLT5zd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHZrRGVzdHJveUZyYW1lYnVmZmVyKGRlbW8tPmRldmljZSwgZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5mcmFtZWJ1ZmZlciwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgdmtEZXN0cm95RGVzY3JpcHRvclBvb2woZGVtby0+ZGV2aWNlLCBkZW1vLT5kZXNjX3Bvb2wsIE5VTEwpOworCisgICAgICAgIHZrRGVzdHJveVBpcGVsaW5lKGRlbW8tPmRldmljZSwgZGVtby0+cGlwZWxpbmUsIE5VTEwpOworICAgICAgICB2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlKGRlbW8tPmRldmljZSwgZGVtby0+cGlwZWxpbmVDYWNoZSwgTlVMTCk7CisgICAgICAgIHZrRGVzdHJveVJlbmRlclBhc3MoZGVtby0+ZGV2aWNlLCBkZW1vLT5yZW5kZXJfcGFzcywgTlVMTCk7CisgICAgICAgIHZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KGRlbW8tPmRldmljZSwgZGVtby0+cGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsKKyAgICAgICAgdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dChkZW1vLT5kZXZpY2UsIGRlbW8tPmRlc2NfbGF5b3V0LCBOVUxMKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgREVNT19URVhUVVJFX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIHZrRGVzdHJveUltYWdlVmlldyhkZW1vLT5kZXZpY2UsIGRlbW8tPnRleHR1cmVzW2ldLnZpZXcsIE5VTEwpOworICAgICAgICAgICAgdmtEZXN0cm95SW1hZ2UoZGVtby0+ZGV2aWNlLCBkZW1vLT50ZXh0dXJlc1tpXS5pbWFnZSwgTlVMTCk7CisgICAgICAgICAgICB2a0ZyZWVNZW1vcnkoZGVtby0+ZGV2aWNlLCBkZW1vLT50ZXh0dXJlc1tpXS5tZW0sIE5VTEwpOworICAgICAgICAgICAgdmtEZXN0cm95U2FtcGxlcihkZW1vLT5kZXZpY2UsIGRlbW8tPnRleHR1cmVzW2ldLnNhbXBsZXIsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGRlbW8tPmZwRGVzdHJveVN3YXBjaGFpbktIUihkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbiwgTlVMTCk7CisKKyAgICAgICAgdmtEZXN0cm95SW1hZ2VWaWV3KGRlbW8tPmRldmljZSwgZGVtby0+ZGVwdGgudmlldywgTlVMTCk7CisgICAgICAgIHZrRGVzdHJveUltYWdlKGRlbW8tPmRldmljZSwgZGVtby0+ZGVwdGguaW1hZ2UsIE5VTEwpOworICAgICAgICB2a0ZyZWVNZW1vcnkoZGVtby0+ZGV2aWNlLCBkZW1vLT5kZXB0aC5tZW0sIE5VTEwpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZW1vLT5zd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHZrRGVzdHJveUltYWdlVmlldyhkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udmlldywgTlVMTCk7CisgICAgICAgICAgICB2a0ZyZWVDb21tYW5kQnVmZmVycyhkZW1vLT5kZXZpY2UsIGRlbW8tPmNtZF9wb29sLCAxLCAmZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5jbWQpOworICAgICAgICAgICAgdmtEZXN0cm95QnVmZmVyKGRlbW8tPmRldmljZSwgZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX2J1ZmZlciwgTlVMTCk7CisgICAgICAgICAgICB2a0ZyZWVNZW1vcnkoZGVtby0+ZGV2aWNlLCBkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fbWVtb3J5LCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXMpOworICAgICAgICBmcmVlKGRlbW8tPnF1ZXVlX3Byb3BzKTsKKyAgICAgICAgdmtEZXN0cm95Q29tbWFuZFBvb2woZGVtby0+ZGV2aWNlLCBkZW1vLT5jbWRfcG9vbCwgTlVMTCk7CisKKyAgICAgICAgaWYgKGRlbW8tPnNlcGFyYXRlX3ByZXNlbnRfcXVldWUpIHsKKyAgICAgICAgICAgIHZrRGVzdHJveUNvbW1hbmRQb29sKGRlbW8tPmRldmljZSwgZGVtby0+cHJlc2VudF9jbWRfcG9vbCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmtEZXZpY2VXYWl0SWRsZShkZW1vLT5kZXZpY2UpOworICAgIHZrRGVzdHJveURldmljZShkZW1vLT5kZXZpY2UsIE5VTEwpOworICAgIGlmIChkZW1vLT52YWxpZGF0ZSkgeworICAgICAgICBkZW1vLT5EZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVChkZW1vLT5pbnN0LCBkZW1vLT5kYmdfbWVzc2VuZ2VyLCBOVUxMKTsKKyAgICB9CisgICAgdmtEZXN0cm95U3VyZmFjZUtIUihkZW1vLT5pbnN0LCBkZW1vLT5zdXJmYWNlLCBOVUxMKTsKKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgIFhEZXN0cm95V2luZG93KGRlbW8tPmRpc3BsYXksIGRlbW8tPnhsaWJfd2luZG93KTsKKyAgICBYQ2xvc2VEaXNwbGF5KGRlbW8tPmRpc3BsYXkpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICB4Y2JfZGVzdHJveV93aW5kb3coZGVtby0+Y29ubmVjdGlvbiwgZGVtby0+eGNiX3dpbmRvdyk7CisgICAgeGNiX2Rpc2Nvbm5lY3QoZGVtby0+Y29ubmVjdGlvbik7CisgICAgZnJlZShkZW1vLT5hdG9tX3dtX2RlbGV0ZV93aW5kb3cpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgd2xfa2V5Ym9hcmRfZGVzdHJveShkZW1vLT5rZXlib2FyZCk7CisgICAgd2xfcG9pbnRlcl9kZXN0cm95KGRlbW8tPnBvaW50ZXIpOworICAgIHdsX3NlYXRfZGVzdHJveShkZW1vLT5zZWF0KTsKKyAgICB3bF9zaGVsbF9zdXJmYWNlX2Rlc3Ryb3koZGVtby0+c2hlbGxfc3VyZmFjZSk7CisgICAgd2xfc3VyZmFjZV9kZXN0cm95KGRlbW8tPndpbmRvdyk7CisgICAgd2xfc2hlbGxfZGVzdHJveShkZW1vLT5zaGVsbCk7CisgICAgd2xfY29tcG9zaXRvcl9kZXN0cm95KGRlbW8tPmNvbXBvc2l0b3IpOworICAgIHdsX3JlZ2lzdHJ5X2Rlc3Ryb3koZGVtby0+cmVnaXN0cnkpOworICAgIHdsX2Rpc3BsYXlfZGlzY29ubmVjdChkZW1vLT5kaXNwbGF5KTsKKyNlbmRpZgorCisgICAgdmtEZXN0cm95SW5zdGFuY2UoZGVtby0+aW5zdCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fcmVzaXplKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgdWludDMyX3QgaTsKKworICAgIC8vIERvbid0IHJlYWN0IHRvIHJlc2l6ZSB1bnRpbCBhZnRlciBmaXJzdCBpbml0aWFsaXphdGlvbi4KKyAgICBpZiAoIWRlbW8tPnByZXBhcmVkKSB7CisgICAgICAgIGlmIChkZW1vLT5pc19taW5pbWl6ZWQpIHsKKyAgICAgICAgICAgIGRlbW9fcHJlcGFyZShkZW1vKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEluIG9yZGVyIHRvIHByb3Blcmx5IHJlc2l6ZSB0aGUgd2luZG93LCB3ZSBtdXN0IHJlLWNyZWF0ZSB0aGUgc3dhcGNoYWluCisgICAgLy8gQU5EIHJlZG8gdGhlIGNvbW1hbmQgYnVmZmVycywgZXRjLgorICAgIC8vCisgICAgLy8gRmlyc3QsIHBlcmZvcm0gcGFydCBvZiB0aGUgZGVtb19jbGVhbnVwKCkgZnVuY3Rpb246CisgICAgZGVtby0+cHJlcGFyZWQgPSBmYWxzZTsKKyAgICB2a0RldmljZVdhaXRJZGxlKGRlbW8tPmRldmljZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVtby0+c3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgIHZrRGVzdHJveUZyYW1lYnVmZmVyKGRlbW8tPmRldmljZSwgZGVtby0+c3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5mcmFtZWJ1ZmZlciwgTlVMTCk7CisgICAgfQorICAgIHZrRGVzdHJveURlc2NyaXB0b3JQb29sKGRlbW8tPmRldmljZSwgZGVtby0+ZGVzY19wb29sLCBOVUxMKTsKKworICAgIHZrRGVzdHJveVBpcGVsaW5lKGRlbW8tPmRldmljZSwgZGVtby0+cGlwZWxpbmUsIE5VTEwpOworICAgIHZrRGVzdHJveVBpcGVsaW5lQ2FjaGUoZGVtby0+ZGV2aWNlLCBkZW1vLT5waXBlbGluZUNhY2hlLCBOVUxMKTsKKyAgICB2a0Rlc3Ryb3lSZW5kZXJQYXNzKGRlbW8tPmRldmljZSwgZGVtby0+cmVuZGVyX3Bhc3MsIE5VTEwpOworICAgIHZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KGRlbW8tPmRldmljZSwgZGVtby0+cGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsKKyAgICB2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KGRlbW8tPmRldmljZSwgZGVtby0+ZGVzY19sYXlvdXQsIE5VTEwpOworCisgICAgZm9yIChpID0gMDsgaSA8IERFTU9fVEVYVFVSRV9DT1VOVDsgaSsrKSB7CisgICAgICAgIHZrRGVzdHJveUltYWdlVmlldyhkZW1vLT5kZXZpY2UsIGRlbW8tPnRleHR1cmVzW2ldLnZpZXcsIE5VTEwpOworICAgICAgICB2a0Rlc3Ryb3lJbWFnZShkZW1vLT5kZXZpY2UsIGRlbW8tPnRleHR1cmVzW2ldLmltYWdlLCBOVUxMKTsKKyAgICAgICAgdmtGcmVlTWVtb3J5KGRlbW8tPmRldmljZSwgZGVtby0+dGV4dHVyZXNbaV0ubWVtLCBOVUxMKTsKKyAgICAgICAgdmtEZXN0cm95U2FtcGxlcihkZW1vLT5kZXZpY2UsIGRlbW8tPnRleHR1cmVzW2ldLnNhbXBsZXIsIE5VTEwpOworICAgIH0KKworICAgIHZrRGVzdHJveUltYWdlVmlldyhkZW1vLT5kZXZpY2UsIGRlbW8tPmRlcHRoLnZpZXcsIE5VTEwpOworICAgIHZrRGVzdHJveUltYWdlKGRlbW8tPmRldmljZSwgZGVtby0+ZGVwdGguaW1hZ2UsIE5VTEwpOworICAgIHZrRnJlZU1lbW9yeShkZW1vLT5kZXZpY2UsIGRlbW8tPmRlcHRoLm1lbSwgTlVMTCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVtby0+c3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgIHZrRGVzdHJveUltYWdlVmlldyhkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udmlldywgTlVMTCk7CisgICAgICAgIHZrRnJlZUNvbW1hbmRCdWZmZXJzKGRlbW8tPmRldmljZSwgZGVtby0+Y21kX3Bvb2wsIDEsICZkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmNtZCk7CisgICAgICAgIHZrRGVzdHJveUJ1ZmZlcihkZW1vLT5kZXZpY2UsIGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udW5pZm9ybV9idWZmZXIsIE5VTEwpOworICAgICAgICB2a0ZyZWVNZW1vcnkoZGVtby0+ZGV2aWNlLCBkZW1vLT5zd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fbWVtb3J5LCBOVUxMKTsKKyAgICB9CisgICAgdmtEZXN0cm95Q29tbWFuZFBvb2woZGVtby0+ZGV2aWNlLCBkZW1vLT5jbWRfcG9vbCwgTlVMTCk7CisgICAgZGVtby0+Y21kX3Bvb2wgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBpZiAoZGVtby0+c2VwYXJhdGVfcHJlc2VudF9xdWV1ZSkgeworICAgICAgICB2a0Rlc3Ryb3lDb21tYW5kUG9vbChkZW1vLT5kZXZpY2UsIGRlbW8tPnByZXNlbnRfY21kX3Bvb2wsIE5VTEwpOworICAgIH0KKyAgICBmcmVlKGRlbW8tPnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXMpOworCisgICAgLy8gU2Vjb25kLCByZS1wZXJmb3JtIHRoZSBkZW1vX3ByZXBhcmUoKSBmdW5jdGlvbiwgd2hpY2ggd2lsbCByZS1jcmVhdGUgdGhlCisgICAgLy8gc3dhcGNoYWluOgorICAgIGRlbW9fcHJlcGFyZShkZW1vKTsKK30KKworLy8gT24gTVMtV2luZG93cywgbWFrZSB0aGlzIGEgZ2xvYmFsLCBzbyBpdCdzIGF2YWlsYWJsZSB0byBXbmRQcm9jKCkKK3N0cnVjdCBkZW1vIGRlbW87CisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCitzdGF0aWMgdm9pZCBkZW1vX3J1bihzdHJ1Y3QgZGVtbyAqZGVtbykgeworICAgIGlmICghZGVtby0+cHJlcGFyZWQpIHJldHVybjsKKworICAgIGRlbW9fZHJhdyhkZW1vKTsKKyAgICBkZW1vLT5jdXJGcmFtZSsrOworICAgIGlmIChkZW1vLT5mcmFtZUNvdW50ICE9IElOVDMyX01BWCAmJiBkZW1vLT5jdXJGcmFtZSA9PSBkZW1vLT5mcmFtZUNvdW50KSB7CisgICAgICAgIFBvc3RRdWl0TWVzc2FnZSh2YWxpZGF0aW9uX2Vycm9yKTsKKyAgICB9Cit9CisKKy8vIE1TLVdpbmRvd3MgZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb246CitMUkVTVUxUIENBTExCQUNLIFduZFByb2MoSFdORCBoV25kLCBVSU5UIHVNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pIHsKKyAgICBzd2l0Y2ggKHVNc2cpIHsKKyAgICAgICAgY2FzZSBXTV9DTE9TRToKKyAgICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSh2YWxpZGF0aW9uX2Vycm9yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdNX1BBSU5UOgorICAgICAgICAgICAgLy8gVGhlIHZhbGlkYXRpb24gY2FsbGJhY2sgY2FsbHMgTWVzc2FnZUJveCB3aGljaCBjYW4gZ2VuZXJhdGUgcGFpbnQKKyAgICAgICAgICAgIC8vIGV2ZW50cyAtIGRvbid0IG1ha2UgbW9yZSBWdWxrYW4gY2FsbHMgaWYgd2UgZ290IGhlcmUgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIGNhbGxiYWNrCisgICAgICAgICAgICBpZiAoIWluX2NhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgZGVtb19ydW4oJmRlbW8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fR0VUTUlOTUFYSU5GTzogIC8vIHNldCB3aW5kb3cncyBtaW5pbXVtIHNpemUKKyAgICAgICAgICAgICgoTUlOTUFYSU5GTyAqKWxQYXJhbSktPnB0TWluVHJhY2tTaXplID0gZGVtby5taW5zaXplOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgV01fRVJBU0VCS0dORDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFdNX1NJWkU6CisgICAgICAgICAgICAvLyBSZXNpemUgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBuZXcgd2luZG93IHNpemUsIGV4Y2VwdCB3aGVuCisgICAgICAgICAgICAvLyBpdCB3YXMgbWluaW1pemVkLiBWdWxrYW4gZG9lc24ndCBzdXBwb3J0IGltYWdlcyBvciBzd2FwY2hhaW5zCisgICAgICAgICAgICAvLyB3aXRoIHdpZHRoPTAgYW5kIGhlaWdodD0wLgorICAgICAgICAgICAgaWYgKHdQYXJhbSAhPSBTSVpFX01JTklNSVpFRCkgeworICAgICAgICAgICAgICAgIGRlbW8ud2lkdGggPSBsUGFyYW0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgZGVtby5oZWlnaHQgPSAobFBhcmFtICYgMHhmZmZmMDAwMCkgPj4gMTY7CisgICAgICAgICAgICAgICAgZGVtb19yZXNpemUoJmRlbW8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fS0VZRE9XTjoKKyAgICAgICAgICAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWS19FU0NBUEU6CisgICAgICAgICAgICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSh2YWxpZGF0aW9uX2Vycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19MRUZUOgorICAgICAgICAgICAgICAgICAgICBkZW1vLnNwaW5fYW5nbGUgLT0gZGVtby5zcGluX2luY3JlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19SSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgZGVtby5zcGluX2FuZ2xlICs9IGRlbW8uc3Bpbl9pbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVktfU1BBQ0U6CisgICAgICAgICAgICAgICAgICAgIGRlbW8ucGF1c2UgPSAhZGVtby5wYXVzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gKERlZldpbmRvd1Byb2MoaFduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pKTsKK30KKworc3RhdGljIHZvaWQgZGVtb19jcmVhdGVfd2luZG93KHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgV05EQ0xBU1NFWCB3aW5fY2xhc3M7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSB3aW5kb3cgY2xhc3Mgc3RydWN0dXJlOgorICAgIHdpbl9jbGFzcy5jYlNpemUgPSBzaXplb2YoV05EQ0xBU1NFWCk7CisgICAgd2luX2NsYXNzLnN0eWxlID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7CisgICAgd2luX2NsYXNzLmxwZm5XbmRQcm9jID0gV25kUHJvYzsKKyAgICB3aW5fY2xhc3MuY2JDbHNFeHRyYSA9IDA7CisgICAgd2luX2NsYXNzLmNiV25kRXh0cmEgPSAwOworICAgIHdpbl9jbGFzcy5oSW5zdGFuY2UgPSBkZW1vLT5jb25uZWN0aW9uOyAgLy8gaEluc3RhbmNlCisgICAgd2luX2NsYXNzLmhJY29uID0gTG9hZEljb24oTlVMTCwgSURJX0FQUExJQ0FUSU9OKTsKKyAgICB3aW5fY2xhc3MuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKKyAgICB3aW5fY2xhc3MuaGJyQmFja2dyb3VuZCA9IChIQlJVU0gpR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOworICAgIHdpbl9jbGFzcy5scHN6TWVudU5hbWUgPSBOVUxMOworICAgIHdpbl9jbGFzcy5scHN6Q2xhc3NOYW1lID0gZGVtby0+bmFtZTsKKyAgICB3aW5fY2xhc3MuaEljb25TbSA9IExvYWRJY29uKE5VTEwsIElESV9XSU5MT0dPKTsKKyAgICAvLyBSZWdpc3RlciB3aW5kb3cgY2xhc3M6CisgICAgaWYgKCFSZWdpc3RlckNsYXNzRXgoJndpbl9jbGFzcykpIHsKKyAgICAgICAgLy8gSXQgZGlkbid0IHdvcmssIHNvIHRyeSB0byBnaXZlIGEgdXNlZnVsIGVycm9yOgorICAgICAgICBwcmludGYoIlVuZXhwZWN0ZWQgZXJyb3IgdHJ5aW5nIHRvIHN0YXJ0IHRoZSBhcHBsaWNhdGlvbiFcbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgLy8gQ3JlYXRlIHdpbmRvdyB3aXRoIHRoZSByZWdpc3RlcmVkIGNsYXNzOgorICAgIFJFQ1Qgd3IgPSB7MCwgMCwgZGVtby0+d2lkdGgsIGRlbW8tPmhlaWdodH07CisgICAgQWRqdXN0V2luZG93UmVjdCgmd3IsIFdTX09WRVJMQVBQRURXSU5ET1csIEZBTFNFKTsKKyAgICBkZW1vLT53aW5kb3cgPSBDcmVhdGVXaW5kb3dFeCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW8tPm5hbWUsICAgICAgICAgICAgLy8gY2xhc3MgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW8tPm5hbWUsICAgICAgICAgICAgLy8gYXBwIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19PVkVSTEFQUEVEV0lORE9XIHwgIC8vIHdpbmRvdyBzdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19WSVNJQkxFIHwgV1NfU1lTTUVOVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIDEwMCwgICAgICAgICAgICAvLyB4L3kgY29vcmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3IucmlnaHQgLSB3ci5sZWZ0LCAgLy8gd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ci5ib3R0b20gLSB3ci50b3AsICAvLyBoZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdG8gcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRvIG1lbnUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vLT5jb25uZWN0aW9uLCAgICAvLyBoSW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgICAgICAvLyBubyBleHRyYSBwYXJhbWV0ZXJzCisgICAgaWYgKCFkZW1vLT53aW5kb3cpIHsKKyAgICAgICAgLy8gSXQgZGlkbid0IHdvcmssIHNvIHRyeSB0byBnaXZlIGEgdXNlZnVsIGVycm9yOgorICAgICAgICBwcmludGYoIkNhbm5vdCBjcmVhdGUgYSB3aW5kb3cgaW4gd2hpY2ggdG8gZHJhdyFcbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgLy8gV2luZG93IGNsaWVudCBhcmVhIHNpemUgbXVzdCBiZSBhdCBsZWFzdCAxIHBpeGVsIGhpZ2gsIHRvIHByZXZlbnQgY3Jhc2guCisgICAgZGVtby0+bWluc2l6ZS54ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWE1JTlRSQUNLKTsKKyAgICBkZW1vLT5taW5zaXplLnkgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZTUlOVFJBQ0spICsgMTsKK30KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorc3RhdGljIHZvaWQgZGVtb19jcmVhdGVfeGxpYl93aW5kb3coc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBjb25zdCBjaGFyICpkaXNwbGF5X2VudmFyID0gZ2V0ZW52KCJESVNQTEFZIik7CisgICAgaWYgKGRpc3BsYXlfZW52YXIgPT0gTlVMTCB8fCBkaXNwbGF5X2VudmFyWzBdID09ICdcMCcpIHsKKyAgICAgICAgcHJpbnRmKCJFbnZpcm9ubWVudCB2YXJpYWJsZSBESVNQTEFZIHJlcXVpcmVzIGEgdmFsaWQgdmFsdWUuXG5FeGl0aW5nIC4uLlxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIFhJbml0VGhyZWFkcygpOworICAgIGRlbW8tPmRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoTlVMTCk7CisgICAgbG9uZyB2aXN1YWxNYXNrID0gVmlzdWFsU2NyZWVuTWFzazsKKyAgICBpbnQgbnVtYmVyT2ZWaXN1YWxzOworICAgIFhWaXN1YWxJbmZvIHZJbmZvVGVtcGxhdGUgPSB7fTsKKyAgICB2SW5mb1RlbXBsYXRlLnNjcmVlbiA9IERlZmF1bHRTY3JlZW4oZGVtby0+ZGlzcGxheSk7CisgICAgWFZpc3VhbEluZm8gKnZpc3VhbEluZm8gPSBYR2V0VmlzdWFsSW5mbyhkZW1vLT5kaXNwbGF5LCB2aXN1YWxNYXNrLCAmdkluZm9UZW1wbGF0ZSwgJm51bWJlck9mVmlzdWFscyk7CisKKyAgICBDb2xvcm1hcCBjb2xvcm1hcCA9CisgICAgICAgIFhDcmVhdGVDb2xvcm1hcChkZW1vLT5kaXNwbGF5LCBSb290V2luZG93KGRlbW8tPmRpc3BsYXksIHZJbmZvVGVtcGxhdGUuc2NyZWVuKSwgdmlzdWFsSW5mby0+dmlzdWFsLCBBbGxvY05vbmUpOworCisgICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgd2luZG93QXR0cmlidXRlcyA9IHt9OworICAgIHdpbmRvd0F0dHJpYnV0ZXMuY29sb3JtYXAgPSBjb2xvcm1hcDsKKyAgICB3aW5kb3dBdHRyaWJ1dGVzLmJhY2tncm91bmRfcGl4ZWwgPSAweEZGRkZGRkZGOworICAgIHdpbmRvd0F0dHJpYnV0ZXMuYm9yZGVyX3BpeGVsID0gMDsKKyAgICB3aW5kb3dBdHRyaWJ1dGVzLmV2ZW50X21hc2sgPSBLZXlQcmVzc01hc2sgfCBLZXlSZWxlYXNlTWFzayB8IFN0cnVjdHVyZU5vdGlmeU1hc2sgfCBFeHBvc3VyZU1hc2s7CisKKyAgICBkZW1vLT54bGliX3dpbmRvdyA9IFhDcmVhdGVXaW5kb3coZGVtby0+ZGlzcGxheSwgUm9vdFdpbmRvdyhkZW1vLT5kaXNwbGF5LCB2SW5mb1RlbXBsYXRlLnNjcmVlbiksIDAsIDAsIGRlbW8tPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vLT5oZWlnaHQsIDAsIHZpc3VhbEluZm8tPmRlcHRoLCBJbnB1dE91dHB1dCwgdmlzdWFsSW5mby0+dmlzdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWwgfCBDV0V2ZW50TWFzayB8IENXQ29sb3JtYXAsICZ3aW5kb3dBdHRyaWJ1dGVzKTsKKworICAgIFhTZWxlY3RJbnB1dChkZW1vLT5kaXNwbGF5LCBkZW1vLT54bGliX3dpbmRvdywgRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrKTsKKyAgICBYTWFwV2luZG93KGRlbW8tPmRpc3BsYXksIGRlbW8tPnhsaWJfd2luZG93KTsKKyAgICBYRmx1c2goZGVtby0+ZGlzcGxheSk7CisgICAgZGVtby0+eGxpYl93bV9kZWxldGVfd2luZG93ID0gWEludGVybkF0b20oZGVtby0+ZGlzcGxheSwgIldNX0RFTEVURV9XSU5ET1ciLCBGYWxzZSk7Cit9CitzdGF0aWMgdm9pZCBkZW1vX2hhbmRsZV94bGliX2V2ZW50KHN0cnVjdCBkZW1vICpkZW1vLCBjb25zdCBYRXZlbnQgKmV2ZW50KSB7CisgICAgc3dpdGNoIChldmVudC0+dHlwZSkgeworICAgICAgICBjYXNlIENsaWVudE1lc3NhZ2U6CisgICAgICAgICAgICBpZiAoKEF0b20pZXZlbnQtPnhjbGllbnQuZGF0YS5sWzBdID09IGRlbW8tPnhsaWJfd21fZGVsZXRlX3dpbmRvdykgZGVtby0+cXVpdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlQcmVzczoKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQtPnhrZXkua2V5Y29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMHg5OiAgLy8gRXNjYXBlCisgICAgICAgICAgICAgICAgICAgIGRlbW8tPnF1aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4NzE6ICAvLyBsZWZ0IGFycm93IGtleQorICAgICAgICAgICAgICAgICAgICBkZW1vLT5zcGluX2FuZ2xlIC09IGRlbW8tPnNwaW5faW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4NzI6ICAvLyByaWdodCBhcnJvdyBrZXkKKyAgICAgICAgICAgICAgICAgICAgZGVtby0+c3Bpbl9hbmdsZSArPSBkZW1vLT5zcGluX2luY3JlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDQxOiAgLy8gc3BhY2UgYmFyCisgICAgICAgICAgICAgICAgICAgIGRlbW8tPnBhdXNlID0gIWRlbW8tPnBhdXNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbmZpZ3VyZU5vdGlmeToKKyAgICAgICAgICAgIGlmICgoZGVtby0+d2lkdGggIT0gZXZlbnQtPnhjb25maWd1cmUud2lkdGgpIHx8IChkZW1vLT5oZWlnaHQgIT0gZXZlbnQtPnhjb25maWd1cmUuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGRlbW8tPndpZHRoID0gZXZlbnQtPnhjb25maWd1cmUud2lkdGg7CisgICAgICAgICAgICAgICAgZGVtby0+aGVpZ2h0ID0gZXZlbnQtPnhjb25maWd1cmUuaGVpZ2h0OworICAgICAgICAgICAgICAgIGRlbW9fcmVzaXplKGRlbW8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fcnVuX3hsaWIoc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICB3aGlsZSAoIWRlbW8tPnF1aXQpIHsKKyAgICAgICAgWEV2ZW50IGV2ZW50OworCisgICAgICAgIGlmIChkZW1vLT5wYXVzZSkgeworICAgICAgICAgICAgWE5leHRFdmVudChkZW1vLT5kaXNwbGF5LCAmZXZlbnQpOworICAgICAgICAgICAgZGVtb19oYW5kbGVfeGxpYl9ldmVudChkZW1vLCAmZXZlbnQpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChYUGVuZGluZyhkZW1vLT5kaXNwbGF5KSA+IDApIHsKKyAgICAgICAgICAgIFhOZXh0RXZlbnQoZGVtby0+ZGlzcGxheSwgJmV2ZW50KTsKKyAgICAgICAgICAgIGRlbW9faGFuZGxlX3hsaWJfZXZlbnQoZGVtbywgJmV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGRlbW9fZHJhdyhkZW1vKTsKKyAgICAgICAgZGVtby0+Y3VyRnJhbWUrKzsKKyAgICAgICAgaWYgKGRlbW8tPmZyYW1lQ291bnQgIT0gSU5UMzJfTUFYICYmIGRlbW8tPmN1ckZyYW1lID09IGRlbW8tPmZyYW1lQ291bnQpIGRlbW8tPnF1aXQgPSB0cnVlOworICAgIH0KK30KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCitzdGF0aWMgdm9pZCBkZW1vX2hhbmRsZV94Y2JfZXZlbnQoc3RydWN0IGRlbW8gKmRlbW8sIGNvbnN0IHhjYl9nZW5lcmljX2V2ZW50X3QgKmV2ZW50KSB7CisgICAgdWludDhfdCBldmVudF9jb2RlID0gZXZlbnQtPnJlc3BvbnNlX3R5cGUgJiAweDdmOworICAgIHN3aXRjaCAoZXZlbnRfY29kZSkgeworICAgICAgICBjYXNlIFhDQl9FWFBPU0U6CisgICAgICAgICAgICAvLyBUT0RPOiBSZXNpemUgd2luZG93CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBYQ0JfQ0xJRU5UX01FU1NBR0U6CisgICAgICAgICAgICBpZiAoKCooeGNiX2NsaWVudF9tZXNzYWdlX2V2ZW50X3QgKilldmVudCkuZGF0YS5kYXRhMzJbMF0gPT0gKCpkZW1vLT5hdG9tX3dtX2RlbGV0ZV93aW5kb3cpLmF0b20pIHsKKyAgICAgICAgICAgICAgICBkZW1vLT5xdWl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFhDQl9LRVlfUkVMRUFTRTogeworICAgICAgICAgICAgY29uc3QgeGNiX2tleV9yZWxlYXNlX2V2ZW50X3QgKmtleSA9IChjb25zdCB4Y2Jfa2V5X3JlbGVhc2VfZXZlbnRfdCAqKWV2ZW50OworCisgICAgICAgICAgICBzd2l0Y2ggKGtleS0+ZGV0YWlsKSB7CisgICAgICAgICAgICAgICAgY2FzZSAweDk6ICAvLyBFc2NhcGUKKyAgICAgICAgICAgICAgICAgICAgZGVtby0+cXVpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg3MTogIC8vIGxlZnQgYXJyb3cga2V5CisgICAgICAgICAgICAgICAgICAgIGRlbW8tPnNwaW5fYW5nbGUgLT0gZGVtby0+c3Bpbl9pbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg3MjogIC8vIHJpZ2h0IGFycm93IGtleQorICAgICAgICAgICAgICAgICAgICBkZW1vLT5zcGluX2FuZ2xlICs9IGRlbW8tPnNwaW5faW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4NDE6ICAvLyBzcGFjZSBiYXIKKyAgICAgICAgICAgICAgICAgICAgZGVtby0+cGF1c2UgPSAhZGVtby0+cGF1c2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFhDQl9DT05GSUdVUkVfTk9USUZZOiB7CisgICAgICAgICAgICBjb25zdCB4Y2JfY29uZmlndXJlX25vdGlmeV9ldmVudF90ICpjZmcgPSAoY29uc3QgeGNiX2NvbmZpZ3VyZV9ub3RpZnlfZXZlbnRfdCAqKWV2ZW50OworICAgICAgICAgICAgaWYgKChkZW1vLT53aWR0aCAhPSBjZmctPndpZHRoKSB8fCAoZGVtby0+aGVpZ2h0ICE9IGNmZy0+aGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGRlbW8tPndpZHRoID0gY2ZnLT53aWR0aDsKKyAgICAgICAgICAgICAgICBkZW1vLT5oZWlnaHQgPSBjZmctPmhlaWdodDsKKyAgICAgICAgICAgICAgICBkZW1vX3Jlc2l6ZShkZW1vKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVtb19ydW5feGNiKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgeGNiX2ZsdXNoKGRlbW8tPmNvbm5lY3Rpb24pOworCisgICAgd2hpbGUgKCFkZW1vLT5xdWl0KSB7CisgICAgICAgIHhjYl9nZW5lcmljX2V2ZW50X3QgKmV2ZW50OworCisgICAgICAgIGlmIChkZW1vLT5wYXVzZSkgeworICAgICAgICAgICAgZXZlbnQgPSB4Y2Jfd2FpdF9mb3JfZXZlbnQoZGVtby0+Y29ubmVjdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBldmVudCA9IHhjYl9wb2xsX2Zvcl9ldmVudChkZW1vLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZXZlbnQpIHsKKyAgICAgICAgICAgIGRlbW9faGFuZGxlX3hjYl9ldmVudChkZW1vLCBldmVudCk7CisgICAgICAgICAgICBmcmVlKGV2ZW50KTsKKyAgICAgICAgICAgIGV2ZW50ID0geGNiX3BvbGxfZm9yX2V2ZW50KGRlbW8tPmNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgZGVtb19kcmF3KGRlbW8pOworICAgICAgICBkZW1vLT5jdXJGcmFtZSsrOworICAgICAgICBpZiAoZGVtby0+ZnJhbWVDb3VudCAhPSBJTlQzMl9NQVggJiYgZGVtby0+Y3VyRnJhbWUgPT0gZGVtby0+ZnJhbWVDb3VudCkgZGVtby0+cXVpdCA9IHRydWU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZW1vX2NyZWF0ZV94Y2Jfd2luZG93KHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgdWludDMyX3QgdmFsdWVfbWFzaywgdmFsdWVfbGlzdFszMl07CisKKyAgICBkZW1vLT54Y2Jfd2luZG93ID0geGNiX2dlbmVyYXRlX2lkKGRlbW8tPmNvbm5lY3Rpb24pOworCisgICAgdmFsdWVfbWFzayA9IFhDQl9DV19CQUNLX1BJWEVMIHwgWENCX0NXX0VWRU5UX01BU0s7CisgICAgdmFsdWVfbGlzdFswXSA9IGRlbW8tPnNjcmVlbi0+YmxhY2tfcGl4ZWw7CisgICAgdmFsdWVfbGlzdFsxXSA9IFhDQl9FVkVOVF9NQVNLX0tFWV9SRUxFQVNFIHwgWENCX0VWRU5UX01BU0tfRVhQT1NVUkUgfCBYQ0JfRVZFTlRfTUFTS19TVFJVQ1RVUkVfTk9USUZZOworCisgICAgeGNiX2NyZWF0ZV93aW5kb3coZGVtby0+Y29ubmVjdGlvbiwgWENCX0NPUFlfRlJPTV9QQVJFTlQsIGRlbW8tPnhjYl93aW5kb3csIGRlbW8tPnNjcmVlbi0+cm9vdCwgMCwgMCwgZGVtby0+d2lkdGgsIGRlbW8tPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBYQ0JfV0lORE9XX0NMQVNTX0lOUFVUX09VVFBVVCwgZGVtby0+c2NyZWVuLT5yb290X3Zpc3VhbCwgdmFsdWVfbWFzaywgdmFsdWVfbGlzdCk7CisKKyAgICAvKiBNYWdpYyBjb2RlIHRoYXQgd2lsbCBzZW5kIG5vdGlmaWNhdGlvbiB3aGVuIHdpbmRvdyBpcyBkZXN0cm95ZWQgKi8KKyAgICB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgY29va2llID0geGNiX2ludGVybl9hdG9tKGRlbW8tPmNvbm5lY3Rpb24sIDEsIDEyLCAiV01fUFJPVE9DT0xTIik7CisgICAgeGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKnJlcGx5ID0geGNiX2ludGVybl9hdG9tX3JlcGx5KGRlbW8tPmNvbm5lY3Rpb24sIGNvb2tpZSwgMCk7CisKKyAgICB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgY29va2llMiA9IHhjYl9pbnRlcm5fYXRvbShkZW1vLT5jb25uZWN0aW9uLCAwLCAxNiwgIldNX0RFTEVURV9XSU5ET1ciKTsKKyAgICBkZW1vLT5hdG9tX3dtX2RlbGV0ZV93aW5kb3cgPSB4Y2JfaW50ZXJuX2F0b21fcmVwbHkoZGVtby0+Y29ubmVjdGlvbiwgY29va2llMiwgMCk7CisKKyAgICB4Y2JfY2hhbmdlX3Byb3BlcnR5KGRlbW8tPmNvbm5lY3Rpb24sIFhDQl9QUk9QX01PREVfUkVQTEFDRSwgZGVtby0+eGNiX3dpbmRvdywgKCpyZXBseSkuYXRvbSwgNCwgMzIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAmKCpkZW1vLT5hdG9tX3dtX2RlbGV0ZV93aW5kb3cpLmF0b20pOworICAgIGZyZWUocmVwbHkpOworCisgICAgeGNiX21hcF93aW5kb3coZGVtby0+Y29ubmVjdGlvbiwgZGVtby0+eGNiX3dpbmRvdyk7CisKKyAgICAvLyBGb3JjZSB0aGUgeC95IGNvb3JkaW5hdGVzIHRvIDEwMCwxMDAgcmVzdWx0cyBhcmUgaWRlbnRpY2FsIGluIGNvbnNlY3V0aXZlCisgICAgLy8gcnVucworICAgIGNvbnN0IHVpbnQzMl90IGNvb3Jkc1tdID0gezEwMCwgMTAwfTsKKyAgICB4Y2JfY29uZmlndXJlX3dpbmRvdyhkZW1vLT5jb25uZWN0aW9uLCBkZW1vLT54Y2Jfd2luZG93LCBYQ0JfQ09ORklHX1dJTkRPV19YIHwgWENCX0NPTkZJR19XSU5ET1dfWSwgY29vcmRzKTsKK30KKy8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKK3N0YXRpYyB2b2lkIGRlbW9fcnVuKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgd2hpbGUgKCFkZW1vLT5xdWl0KSB7CisgICAgICAgIGlmIChkZW1vLT5wYXVzZSkgeworICAgICAgICAgICAgd2xfZGlzcGxheV9kaXNwYXRjaChkZW1vLT5kaXNwbGF5KTsgIC8vIGJsb2NrIGFuZCB3YWl0IGZvciBpbnB1dAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2xfZGlzcGxheV9kaXNwYXRjaF9wZW5kaW5nKGRlbW8tPmRpc3BsYXkpOyAgLy8gZG9uJ3QgYmxvY2sKKyAgICAgICAgICAgIGRlbW9fZHJhdyhkZW1vKTsKKyAgICAgICAgICAgIGRlbW8tPmN1ckZyYW1lKys7CisgICAgICAgICAgICBpZiAoZGVtby0+ZnJhbWVDb3VudCAhPSBJTlQzMl9NQVggJiYgZGVtby0+Y3VyRnJhbWUgPT0gZGVtby0+ZnJhbWVDb3VudCkgZGVtby0+cXVpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9waW5nKHZvaWQgKmRhdGEgVU5VU0VELCBzdHJ1Y3Qgd2xfc2hlbGxfc3VyZmFjZSAqc2hlbGxfc3VyZmFjZSwgdWludDMyX3Qgc2VyaWFsKSB7CisgICAgd2xfc2hlbGxfc3VyZmFjZV9wb25nKHNoZWxsX3N1cmZhY2UsIHNlcmlhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jb25maWd1cmUodm9pZCAqZGF0YSBVTlVTRUQsIHN0cnVjdCB3bF9zaGVsbF9zdXJmYWNlICpzaGVsbF9zdXJmYWNlIFVOVVNFRCwgdWludDMyX3QgZWRnZXMgVU5VU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoIFVOVVNFRCwgaW50MzJfdCBoZWlnaHQgVU5VU0VEKSB7fQorCitzdGF0aWMgdm9pZCBoYW5kbGVfcG9wdXBfZG9uZSh2b2lkICpkYXRhIFVOVVNFRCwgc3RydWN0IHdsX3NoZWxsX3N1cmZhY2UgKnNoZWxsX3N1cmZhY2UgVU5VU0VEKSB7fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdsX3NoZWxsX3N1cmZhY2VfbGlzdGVuZXIgc2hlbGxfc3VyZmFjZV9saXN0ZW5lciA9IHtoYW5kbGVfcGluZywgaGFuZGxlX2NvbmZpZ3VyZSwgaGFuZGxlX3BvcHVwX2RvbmV9OworCitzdGF0aWMgdm9pZCBkZW1vX2NyZWF0ZV93aW5kb3coc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBkZW1vLT53aW5kb3cgPSB3bF9jb21wb3NpdG9yX2NyZWF0ZV9zdXJmYWNlKGRlbW8tPmNvbXBvc2l0b3IpOworICAgIGlmICghZGVtby0+d2luZG93KSB7CisgICAgICAgIHByaW50ZigiQ2FuIG5vdCBjcmVhdGUgd2F5bGFuZF9zdXJmYWNlIGZyb20gY29tcG9zaXRvciFcbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBkZW1vLT5zaGVsbF9zdXJmYWNlID0gd2xfc2hlbGxfZ2V0X3NoZWxsX3N1cmZhY2UoZGVtby0+c2hlbGwsIGRlbW8tPndpbmRvdyk7CisgICAgaWYgKCFkZW1vLT5zaGVsbF9zdXJmYWNlKSB7CisgICAgICAgIHByaW50ZigiQ2FuIG5vdCBnZXQgc2hlbGxfc3VyZmFjZSBmcm9tIHdheWxhbmRfc3VyZmFjZSFcbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgd2xfc2hlbGxfc3VyZmFjZV9hZGRfbGlzdGVuZXIoZGVtby0+c2hlbGxfc3VyZmFjZSwgJnNoZWxsX3N1cmZhY2VfbGlzdGVuZXIsIGRlbW8pOworICAgIHdsX3NoZWxsX3N1cmZhY2Vfc2V0X3RvcGxldmVsKGRlbW8tPnNoZWxsX3N1cmZhY2UpOworICAgIHdsX3NoZWxsX3N1cmZhY2Vfc2V0X3RpdGxlKGRlbW8tPnNoZWxsX3N1cmZhY2UsIEFQUF9TSE9SVF9OQU1FKTsKK30KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKQorc3RhdGljIHZvaWQgZGVtb19ydW4oc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBpZiAoIWRlbW8tPnByZXBhcmVkKSByZXR1cm47CisKKyAgICBkZW1vX2RyYXcoZGVtbyk7CisgICAgZGVtby0+Y3VyRnJhbWUrKzsKK30KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKK3N0YXRpYyB2b2lkIGRlbW9fcnVuKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgZGVtb19kcmF3KGRlbW8pOworICAgIGRlbW8tPmN1ckZyYW1lKys7CisgICAgaWYgKGRlbW8tPmZyYW1lQ291bnQgIT0gSU5UMzJfTUFYICYmIGRlbW8tPmN1ckZyYW1lID09IGRlbW8tPmZyYW1lQ291bnQpIHsKKyAgICAgICAgZGVtby0+cXVpdCA9IFRSVUU7CisgICAgfQorfQorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fRElTUExBWV9LSFIpCitzdGF0aWMgVmtSZXN1bHQgZGVtb19jcmVhdGVfZGlzcGxheV9zdXJmYWNlKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisgICAgdWludDMyX3QgZGlzcGxheV9jb3VudDsKKyAgICB1aW50MzJfdCBtb2RlX2NvdW50OworICAgIHVpbnQzMl90IHBsYW5lX2NvdW50OworICAgIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgZGlzcGxheV9wcm9wczsKKyAgICBWa0Rpc3BsYXlLSFIgZGlzcGxheTsKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiBtb2RlX3Byb3BzOworICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiAqcGxhbmVfcHJvcHM7CisgICAgVmtCb29sMzIgZm91bmRfcGxhbmUgPSBWS19GQUxTRTsKKyAgICB1aW50MzJfdCBwbGFuZV9pbmRleDsKKyAgICBWa0V4dGVudDJEIGltYWdlX2V4dGVudDsKKyAgICBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVfaW5mbzsKKworICAgIC8vIEdldCB0aGUgZmlyc3QgZGlzcGxheQorICAgIGVyciA9IHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUihkZW1vLT5ncHUsICZkaXNwbGF5X2NvdW50LCBOVUxMKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBpZiAoZGlzcGxheV9jb3VudCA9PSAwKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGZpbmQgYW55IGRpc3BsYXkhXG4iKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZGlzcGxheV9jb3VudCA9IDE7CisgICAgZXJyID0gdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKGRlbW8tPmdwdSwgJmRpc3BsYXlfY291bnQsICZkaXNwbGF5X3Byb3BzKTsKKyAgICBhc3NlcnQoIWVyciB8fCAoZXJyID09IFZLX0lOQ09NUExFVEUpKTsKKworICAgIGRpc3BsYXkgPSBkaXNwbGF5X3Byb3BzLmRpc3BsYXk7CisKKyAgICAvLyBHZXQgdGhlIGZpcnN0IG1vZGUgb2YgdGhlIGRpc3BsYXkKKyAgICBlcnIgPSB2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUihkZW1vLT5ncHUsIGRpc3BsYXksICZtb2RlX2NvdW50LCBOVUxMKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBpZiAobW9kZV9jb3VudCA9PSAwKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGZpbmQgYW55IG1vZGUgZm9yIHRoZSBkaXNwbGF5IVxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIG1vZGVfY291bnQgPSAxOworICAgIGVyciA9IHZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKGRlbW8tPmdwdSwgZGlzcGxheSwgJm1vZGVfY291bnQsICZtb2RlX3Byb3BzKTsKKyAgICBhc3NlcnQoIWVyciB8fCAoZXJyID09IFZLX0lOQ09NUExFVEUpKTsKKworICAgIC8vIEdldCB0aGUgbGlzdCBvZiBwbGFuZXMKKyAgICBlcnIgPSB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihkZW1vLT5ncHUsICZwbGFuZV9jb3VudCwgTlVMTCk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgaWYgKHBsYW5lX2NvdW50ID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgZmluZCBhbnkgcGxhbmUhXG4iKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgcGxhbmVfcHJvcHMgPSBtYWxsb2Moc2l6ZW9mKFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUikgKiBwbGFuZV9jb3VudCk7CisgICAgYXNzZXJ0KHBsYW5lX3Byb3BzKTsKKworICAgIGVyciA9IHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKGRlbW8tPmdwdSwgJnBsYW5lX2NvdW50LCBwbGFuZV9wcm9wcyk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgLy8gRmluZCBhIHBsYW5lIGNvbXBhdGlibGUgd2l0aCB0aGUgZGlzcGxheQorICAgIGZvciAocGxhbmVfaW5kZXggPSAwOyBwbGFuZV9pbmRleCA8IHBsYW5lX2NvdW50OyBwbGFuZV9pbmRleCsrKSB7CisgICAgICAgIHVpbnQzMl90IHN1cHBvcnRlZF9jb3VudDsKKyAgICAgICAgVmtEaXNwbGF5S0hSICpzdXBwb3J0ZWRfZGlzcGxheXM7CisKKyAgICAgICAgLy8gRGlzcXVhbGlmeSBwbGFuZXMgdGhhdCBhcmUgYm91bmQgdG8gYSBkaWZmZXJlbnQgZGlzcGxheQorICAgICAgICBpZiAoKHBsYW5lX3Byb3BzW3BsYW5lX2luZGV4XS5jdXJyZW50RGlzcGxheSAhPSBWS19OVUxMX0hBTkRMRSkgJiYgKHBsYW5lX3Byb3BzW3BsYW5lX2luZGV4XS5jdXJyZW50RGlzcGxheSAhPSBkaXNwbGF5KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSB2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKGRlbW8tPmdwdSwgcGxhbmVfaW5kZXgsICZzdXBwb3J0ZWRfY291bnQsIE5VTEwpOworICAgICAgICBhc3NlcnQoIWVycik7CisKKyAgICAgICAgaWYgKHN1cHBvcnRlZF9jb3VudCA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cHBvcnRlZF9kaXNwbGF5cyA9IG1hbGxvYyhzaXplb2YoVmtEaXNwbGF5S0hSKSAqIHN1cHBvcnRlZF9jb3VudCk7CisgICAgICAgIGFzc2VydChzdXBwb3J0ZWRfZGlzcGxheXMpOworCisgICAgICAgIGVyciA9IHZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoZGVtby0+Z3B1LCBwbGFuZV9pbmRleCwgJnN1cHBvcnRlZF9jb3VudCwgc3VwcG9ydGVkX2Rpc3BsYXlzKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRfY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZF9kaXNwbGF5c1tpXSA9PSBkaXNwbGF5KSB7CisgICAgICAgICAgICAgICAgZm91bmRfcGxhbmUgPSBWS19UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJlZShzdXBwb3J0ZWRfZGlzcGxheXMpOworCisgICAgICAgIGlmIChmb3VuZF9wbGFuZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kX3BsYW5lKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGZpbmQgYSBwbGFuZSBjb21wYXRpYmxlIHdpdGggdGhlIGRpc3BsYXkhXG4iKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZnJlZShwbGFuZV9wcm9wcyk7CisKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiBwbGFuZUNhcHM7CisgICAgdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoZGVtby0+Z3B1LCBtb2RlX3Byb3BzLmRpc3BsYXlNb2RlLCBwbGFuZV9pbmRleCwgJnBsYW5lQ2Fwcyk7CisgICAgLy8gRmluZCBhIHN1cHBvcnRlZCBhbHBoYSBtb2RlCisgICAgVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIGFscGhhTW9kZSA9IFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfT1BBUVVFX0JJVF9LSFI7CisgICAgVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIGFscGhhTW9kZXNbNF0gPSB7CisgICAgICAgIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfT1BBUVVFX0JJVF9LSFIsCisgICAgICAgIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfR0xPQkFMX0JJVF9LSFIsCisgICAgICAgIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfUEVSX1BJWEVMX0JJVF9LSFIsCisgICAgICAgIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfUEVSX1BJWEVMX1BSRU1VTFRJUExJRURfQklUX0tIUiwKKyAgICB9OworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoYWxwaGFNb2Rlcyk7IGkrKykgeworICAgICAgICBpZiAocGxhbmVDYXBzLnN1cHBvcnRlZEFscGhhICYgYWxwaGFNb2Rlc1tpXSkgeworICAgICAgICAgICAgYWxwaGFNb2RlID0gYWxwaGFNb2Rlc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGltYWdlX2V4dGVudC53aWR0aCA9IG1vZGVfcHJvcHMucGFyYW1ldGVycy52aXNpYmxlUmVnaW9uLndpZHRoOworICAgIGltYWdlX2V4dGVudC5oZWlnaHQgPSBtb2RlX3Byb3BzLnBhcmFtZXRlcnMudmlzaWJsZVJlZ2lvbi5oZWlnaHQ7CisKKyAgICBjcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI7CisgICAgY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGNyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKyAgICBjcmVhdGVfaW5mby5kaXNwbGF5TW9kZSA9IG1vZGVfcHJvcHMuZGlzcGxheU1vZGU7CisgICAgY3JlYXRlX2luZm8ucGxhbmVJbmRleCA9IHBsYW5lX2luZGV4OworICAgIGNyZWF0ZV9pbmZvLnBsYW5lU3RhY2tJbmRleCA9IHBsYW5lX3Byb3BzW3BsYW5lX2luZGV4XS5jdXJyZW50U3RhY2tJbmRleDsKKyAgICBjcmVhdGVfaW5mby50cmFuc2Zvcm0gPSBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSOworICAgIGNyZWF0ZV9pbmZvLmFscGhhTW9kZSA9IGFscGhhTW9kZTsKKyAgICBjcmVhdGVfaW5mby5nbG9iYWxBbHBoYSA9IDEuMGY7CisgICAgY3JlYXRlX2luZm8uaW1hZ2VFeHRlbnQgPSBpbWFnZV9leHRlbnQ7CisKKyAgICByZXR1cm4gdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKGRlbW8tPmluc3QsICZjcmVhdGVfaW5mbywgTlVMTCwgJmRlbW8tPnN1cmZhY2UpOworfQorCitzdGF0aWMgdm9pZCBkZW1vX3J1bl9kaXNwbGF5KHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgd2hpbGUgKCFkZW1vLT5xdWl0KSB7CisgICAgICAgIGRlbW9fZHJhdyhkZW1vKTsKKyAgICAgICAgZGVtby0+Y3VyRnJhbWUrKzsKKworICAgICAgICBpZiAoZGVtby0+ZnJhbWVDb3VudCAhPSBJTlQzMl9NQVggJiYgZGVtby0+Y3VyRnJhbWUgPT0gZGVtby0+ZnJhbWVDb3VudCkgeworICAgICAgICAgICAgZGVtby0+cXVpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybiAxICh0cnVlKSBpZiBhbGwgbGF5ZXIgbmFtZXMgc3BlY2lmaWVkIGluIGNoZWNrX25hbWVzCisgKiBjYW4gYmUgZm91bmQgaW4gZ2l2ZW4gbGF5ZXIgcHJvcGVydGllcy4KKyAqLworc3RhdGljIFZrQm9vbDMyIGRlbW9fY2hlY2tfbGF5ZXJzKHVpbnQzMl90IGNoZWNrX2NvdW50LCBjaGFyICoqY2hlY2tfbmFtZXMsIHVpbnQzMl90IGxheWVyX2NvdW50LCBWa0xheWVyUHJvcGVydGllcyAqbGF5ZXJzKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNoZWNrX2NvdW50OyBpKyspIHsKKyAgICAgICAgVmtCb29sMzIgZm91bmQgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbGF5ZXJfY291bnQ7IGorKykgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoY2hlY2tfbmFtZXNbaV0sIGxheWVyc1tqXS5sYXllck5hbWUpKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgbGF5ZXI6ICVzXG4iLCBjaGVja19uYW1lc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZGVtb19pbml0X3ZrKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgVmtSZXN1bHQgZXJyOworICAgIHVpbnQzMl90IGluc3RhbmNlX2V4dGVuc2lvbl9jb3VudCA9IDA7CisgICAgdWludDMyX3QgaW5zdGFuY2VfbGF5ZXJfY291bnQgPSAwOworICAgIGNoYXIgKmluc3RhbmNlX3ZhbGlkYXRpb25fbGF5ZXJzW10gPSB7IlZLX0xBWUVSX0tIUk9OT1NfdmFsaWRhdGlvbiJ9OworICAgIGRlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50ID0gMDsKKyAgICBkZW1vLT5lbmFibGVkX2xheWVyX2NvdW50ID0gMDsKKyAgICBkZW1vLT5pc19taW5pbWl6ZWQgPSBmYWxzZTsKKyAgICBkZW1vLT5jbWRfcG9vbCA9IFZLX05VTExfSEFORExFOworCisgICAgLy8gTG9vayBmb3IgdmFsaWRhdGlvbiBsYXllcnMKKyAgICBWa0Jvb2wzMiB2YWxpZGF0aW9uX2ZvdW5kID0gMDsKKyAgICBpZiAoZGVtby0+dmFsaWRhdGUpIHsKKyAgICAgICAgZXJyID0gdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygmaW5zdGFuY2VfbGF5ZXJfY291bnQsIE5VTEwpOworICAgICAgICBhc3NlcnQoIWVycik7CisKKyAgICAgICAgaWYgKGluc3RhbmNlX2xheWVyX2NvdW50ID4gMCkgeworICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKmluc3RhbmNlX2xheWVycyA9IG1hbGxvYyhzaXplb2YoVmtMYXllclByb3BlcnRpZXMpICogaW5zdGFuY2VfbGF5ZXJfY291bnQpOworICAgICAgICAgICAgZXJyID0gdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygmaW5zdGFuY2VfbGF5ZXJfY291bnQsIGluc3RhbmNlX2xheWVycyk7CisgICAgICAgICAgICBhc3NlcnQoIWVycik7CisKKyAgICAgICAgICAgIHZhbGlkYXRpb25fZm91bmQgPSBkZW1vX2NoZWNrX2xheWVycyhBUlJBWV9TSVpFKGluc3RhbmNlX3ZhbGlkYXRpb25fbGF5ZXJzKSwgaW5zdGFuY2VfdmFsaWRhdGlvbl9sYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VfbGF5ZXJfY291bnQsIGluc3RhbmNlX2xheWVycyk7CisgICAgICAgICAgICBpZiAodmFsaWRhdGlvbl9mb3VuZCkgeworICAgICAgICAgICAgICAgIGRlbW8tPmVuYWJsZWRfbGF5ZXJfY291bnQgPSBBUlJBWV9TSVpFKGluc3RhbmNlX3ZhbGlkYXRpb25fbGF5ZXJzKTsKKyAgICAgICAgICAgICAgICBkZW1vLT5lbmFibGVkX2xheWVyc1swXSA9ICJWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShpbnN0YW5jZV9sYXllcnMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWxpZGF0aW9uX2ZvdW5kKSB7CisgICAgICAgICAgICBFUlJfRVhJVCgKKyAgICAgICAgICAgICAgICAidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCByZXF1aXJlZCB2YWxpZGF0aW9uIGxheWVyLlxuXG4iCisgICAgICAgICAgICAgICAgIlBsZWFzZSBsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExvb2sgZm9yIGluc3RhbmNlIGV4dGVuc2lvbnMgKi8KKyAgICBWa0Jvb2wzMiBzdXJmYWNlRXh0Rm91bmQgPSAwOworICAgIFZrQm9vbDMyIHBsYXRmb3JtU3VyZmFjZUV4dEZvdW5kID0gMDsKKyAgICBtZW1zZXQoZGVtby0+ZXh0ZW5zaW9uX25hbWVzLCAwLCBzaXplb2YoZGVtby0+ZXh0ZW5zaW9uX25hbWVzKSk7CisKKyAgICBlcnIgPSB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhOVUxMLCAmaW5zdGFuY2VfZXh0ZW5zaW9uX2NvdW50LCBOVUxMKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBpZiAoaW5zdGFuY2VfZXh0ZW5zaW9uX2NvdW50ID4gMCkgeworICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKmluc3RhbmNlX2V4dGVuc2lvbnMgPSBtYWxsb2Moc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykgKiBpbnN0YW5jZV9leHRlbnNpb25fY291bnQpOworICAgICAgICBlcnIgPSB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhOVUxMLCAmaW5zdGFuY2VfZXh0ZW5zaW9uX2NvdW50LCBpbnN0YW5jZV9leHRlbnNpb25zKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5zdGFuY2VfZXh0ZW5zaW9uX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLCBpbnN0YW5jZV9leHRlbnNpb25zW2ldLmV4dGVuc2lvbk5hbWUpKSB7CisgICAgICAgICAgICAgICAgc3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBkZW1vLT5leHRlbnNpb25fbmFtZXNbZGVtby0+ZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgICAgIH0KKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCisgICAgICAgICAgICBpZiAoIXN0cmNtcChWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgaW5zdGFuY2VfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtU3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBkZW1vLT5leHRlbnNpb25fbmFtZXNbZGVtby0+ZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgICAgICAgICAgaWYgKCFzdHJjbXAoVktfS0hSX1hMSUJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgaW5zdGFuY2VfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtU3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBkZW1vLT5leHRlbnNpb25fbmFtZXNbZGVtby0+ZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19LSFJfWExJQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FOworICAgICAgICAgICAgfQorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgaW5zdGFuY2VfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtU3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBkZW1vLT5leHRlbnNpb25fbmFtZXNbZGVtby0+ZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19LSFJfWENCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUU7CisgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsIGluc3RhbmNlX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwbGF0Zm9ybVN1cmZhY2VFeHRGb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgZGVtby0+ZXh0ZW5zaW9uX25hbWVzW2RlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KytdID0gVktfS0hSX1dBWUxBTkRfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0RJU1BMQVlfS0hSKQorICAgICAgICAgICAgaWYgKCFzdHJjbXAoVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUsIGluc3RhbmNlX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwbGF0Zm9ybVN1cmZhY2VFeHRGb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgZGVtby0+ZXh0ZW5zaW9uX25hbWVzW2RlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KytdID0gVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUU7CisgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUikKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9BTkRST0lEX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsIGluc3RhbmNlX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwbGF0Zm9ybVN1cmZhY2VFeHRGb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgZGVtby0+ZXh0ZW5zaW9uX25hbWVzW2RlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KytdID0gVktfS0hSX0FORFJPSURfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0VYVF9NRVRBTF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLCBpbnN0YW5jZV9leHRlbnNpb25zW2ldLmV4dGVuc2lvbk5hbWUpKSB7CisgICAgICAgICAgICAgICAgcGxhdGZvcm1TdXJmYWNlRXh0Rm91bmQgPSAxOworICAgICAgICAgICAgICAgIGRlbW8tPmV4dGVuc2lvbl9uYW1lc1tkZW1vLT5lbmFibGVkX2V4dGVuc2lvbl9jb3VudCsrXSA9IFZLX0VYVF9NRVRBTF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAoIXN0cmNtcChWS19FWFRfREVCVUdfVVRJTFNfRVhURU5TSU9OX05BTUUsIGluc3RhbmNlX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVtby0+dmFsaWRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVtby0+ZXh0ZW5zaW9uX25hbWVzW2RlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KytdID0gVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChkZW1vLT5lbmFibGVkX2V4dGVuc2lvbl9jb3VudCA8IDY0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZyZWUoaW5zdGFuY2VfZXh0ZW5zaW9ucyk7CisgICAgfQorCisgICAgaWYgKCFzdXJmYWNlRXh0Rm91bmQpIHsKKyAgICAgICAgRVJSX0VYSVQoInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIGZhaWxlZCB0byBmaW5kIHRoZSAiIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FCisgICAgICAgICAgICAgICAgICIgZXh0ZW5zaW9uLlxuXG4iCisgICAgICAgICAgICAgICAgICJEbyB5b3UgaGF2ZSBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkgaW5zdGFsbGVkP1xuIgorICAgICAgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyAgICB9CisgICAgaWYgKCFwbGF0Zm9ybVN1cmZhY2VFeHRGb3VuZCkgeworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUikKKyAgICAgICAgRVJSX0VYSVQoInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIGZhaWxlZCB0byBmaW5kIHRoZSAiIFZLX0tIUl9XSU4zMl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FCisgICAgICAgICAgICAgICAgICIgZXh0ZW5zaW9uLlxuXG4iCisgICAgICAgICAgICAgICAgICJEbyB5b3UgaGF2ZSBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkgaW5zdGFsbGVkP1xuIgorICAgICAgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKKyAgICAgICAgRVJSX0VYSVQoInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIGZhaWxlZCB0byBmaW5kIHRoZSAiIFZLX0VYVF9NRVRBTF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FCisgICAgICAgICAgICAgICAgICIgZXh0ZW5zaW9uLlxuXG4iCisgICAgICAgICAgICAgICAgICJEbyB5b3UgaGF2ZSBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkgaW5zdGFsbGVkP1xuIgorICAgICAgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisgICAgICAgIEVSUl9FWElUKCJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCB0aGUgIiBWS19LSFJfWENCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUKKyAgICAgICAgICAgICAgICAgIiBleHRlbnNpb24uXG5cbiIKKyAgICAgICAgICAgICAgICAgIkRvIHlvdSBoYXZlIGEgY29tcGF0aWJsZSBWdWxrYW4gaW5zdGFsbGFibGUgY2xpZW50IGRyaXZlciAoSUNEKSBpbnN0YWxsZWQ/XG4iCisgICAgICAgICAgICAgICAgICJQbGVhc2UgbG9vayBhdCB0aGUgR2V0dGluZyBTdGFydGVkIGd1aWRlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW5zdGFuY2UgRmFpbHVyZSIpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgICAgIEVSUl9FWElUKCJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCB0aGUgIiBWS19LSFJfV0FZTEFORF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FCisgICAgICAgICAgICAgICAgICIgZXh0ZW5zaW9uLlxuXG4iCisgICAgICAgICAgICAgICAgICJEbyB5b3UgaGF2ZSBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkgaW5zdGFsbGVkP1xuIgorICAgICAgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0RJU1BMQVlfS0hSKQorICAgICAgICBFUlJfRVhJVCgidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgZmFpbGVkIHRvIGZpbmQgdGhlICIgVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUKKyAgICAgICAgICAgICAgICAgIiBleHRlbnNpb24uXG5cbiIKKyAgICAgICAgICAgICAgICAgIkRvIHlvdSBoYXZlIGEgY29tcGF0aWJsZSBWdWxrYW4gaW5zdGFsbGFibGUgY2xpZW50IGRyaXZlciAoSUNEKSBpbnN0YWxsZWQ/XG4iCisgICAgICAgICAgICAgICAgICJQbGVhc2UgbG9vayBhdCB0aGUgR2V0dGluZyBTdGFydGVkIGd1aWRlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW5zdGFuY2UgRmFpbHVyZSIpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIpCisgICAgICAgIEVSUl9FWElUKCJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCB0aGUgIiBWS19LSFJfQU5EUk9JRF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FCisgICAgICAgICAgICAgICAgICIgZXh0ZW5zaW9uLlxuXG4iCisgICAgICAgICAgICAgICAgICJEbyB5b3UgaGF2ZSBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkgaW5zdGFsbGVkP1xuIgorICAgICAgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgICAgICBFUlJfRVhJVCgidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgZmFpbGVkIHRvIGZpbmQgdGhlICIgVktfS0hSX1hMSUJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRQorICAgICAgICAgICAgICAgICAiIGV4dGVuc2lvbi5cblxuIgorICAgICAgICAgICAgICAgICAiRG8geW91IGhhdmUgYSBjb21wYXRpYmxlIFZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpIGluc3RhbGxlZD9cbiIKKyAgICAgICAgICAgICAgICAgIlBsZWFzZSBsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBGYWlsdXJlIik7CisjZW5kaWYKKyAgICB9CisgICAgY29uc3QgVmtBcHBsaWNhdGlvbkluZm8gYXBwID0geworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPLAorICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAucEFwcGxpY2F0aW9uTmFtZSA9IEFQUF9TSE9SVF9OQU1FLAorICAgICAgICAuYXBwbGljYXRpb25WZXJzaW9uID0gMCwKKyAgICAgICAgLnBFbmdpbmVOYW1lID0gQVBQX1NIT1JUX05BTUUsCisgICAgICAgIC5lbmdpbmVWZXJzaW9uID0gMCwKKyAgICAgICAgLmFwaVZlcnNpb24gPSBWS19BUElfVkVSU0lPTl8xXzAsCisgICAgfTsKKyAgICBWa0luc3RhbmNlQ3JlYXRlSW5mbyBpbnN0X2luZm8gPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBOVUxMLAorICAgICAgICAucEFwcGxpY2F0aW9uSW5mbyA9ICZhcHAsCisgICAgICAgIC5lbmFibGVkTGF5ZXJDb3VudCA9IGRlbW8tPmVuYWJsZWRfbGF5ZXJfY291bnQsCisgICAgICAgIC5wcEVuYWJsZWRMYXllck5hbWVzID0gKGNvbnN0IGNoYXIgKmNvbnN0ICopaW5zdGFuY2VfdmFsaWRhdGlvbl9sYXllcnMsCisgICAgICAgIC5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBkZW1vLT5lbmFibGVkX2V4dGVuc2lvbl9jb3VudCwKKyAgICAgICAgLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gKGNvbnN0IGNoYXIgKmNvbnN0ICopZGVtby0+ZXh0ZW5zaW9uX25hbWVzLAorICAgIH07CisKKyAgICAvKgorICAgICAqIFRoaXMgaXMgaW5mbyBmb3IgYSB0ZW1wIGNhbGxiYWNrIHRvIHVzZSBkdXJpbmcgQ3JlYXRlSW5zdGFuY2UuCisgICAgICogQWZ0ZXIgdGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHdlIHVzZSB0aGUgaW5zdGFuY2UtYmFzZWQKKyAgICAgKiBmdW5jdGlvbiB0byByZWdpc3RlciB0aGUgZmluYWwgY2FsbGJhY2suCisgICAgICovCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBkYmdfbWVzc2VuZ2VyX2NyZWF0ZV9pbmZvOworICAgIGlmIChkZW1vLT52YWxpZGF0ZSkgeworICAgICAgICAvLyBWS19FWFRfZGVidWdfdXRpbHMgc3R5bGUKKyAgICAgICAgZGJnX21lc3Nlbmdlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DUkVBVEVfSU5GT19FWFQ7CisgICAgICAgIGRiZ19tZXNzZW5nZXJfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgICAgICBkYmdfbWVzc2VuZ2VyX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKyAgICAgICAgZGJnX21lc3Nlbmdlcl9jcmVhdGVfaW5mby5tZXNzYWdlU2V2ZXJpdHkgPQorICAgICAgICAgICAgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9XQVJOSU5HX0JJVF9FWFQgfCBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0VSUk9SX0JJVF9FWFQ7CisgICAgICAgIGRiZ19tZXNzZW5nZXJfY3JlYXRlX2luZm8ubWVzc2FnZVR5cGUgPSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfR0VORVJBTF9CSVRfRVhUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9WQUxJREFUSU9OX0JJVF9FWFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1BFUkZPUk1BTkNFX0JJVF9FWFQ7CisgICAgICAgIGRiZ19tZXNzZW5nZXJfY3JlYXRlX2luZm8ucGZuVXNlckNhbGxiYWNrID0gZGVidWdfbWVzc2VuZ2VyX2NhbGxiYWNrOworICAgICAgICBkYmdfbWVzc2VuZ2VyX2NyZWF0ZV9pbmZvLnBVc2VyRGF0YSA9IGRlbW87CisgICAgICAgIGluc3RfaW5mby5wTmV4dCA9ICZkYmdfbWVzc2VuZ2VyX2NyZWF0ZV9pbmZvOworICAgIH0KKworICAgIHVpbnQzMl90IGdwdV9jb3VudDsKKworICAgIGVyciA9IHZrQ3JlYXRlSW5zdGFuY2UoJmluc3RfaW5mbywgTlVMTCwgJmRlbW8tPmluc3QpOworICAgIGlmIChlcnIgPT0gVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUikgeworICAgICAgICBFUlJfRVhJVCgKKyAgICAgICAgICAgICJDYW5ub3QgZmluZCBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkuXG5cbiIKKyAgICAgICAgICAgICJQbGVhc2UgbG9vayBhdCB0aGUgR2V0dGluZyBTdGFydGVkIGd1aWRlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKKyAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgRVJSX0VYSVQoCisgICAgICAgICAgICAiQ2Fubm90IGZpbmQgYSBzcGVjaWZpZWQgZXh0ZW5zaW9uIGxpYnJhcnkuXG4iCisgICAgICAgICAgICAiTWFrZSBzdXJlIHlvdXIgbGF5ZXJzIHBhdGggaXMgc2V0IGFwcHJvcHJpYXRlbHkuXG4iLAorICAgICAgICAgICAgInZrQ3JlYXRlSW5zdGFuY2UgRmFpbHVyZSIpOworICAgIH0gZWxzZSBpZiAoZXJyKSB7CisgICAgICAgIEVSUl9FWElUKAorICAgICAgICAgICAgInZrQ3JlYXRlSW5zdGFuY2UgZmFpbGVkLlxuXG4iCisgICAgICAgICAgICAiRG8geW91IGhhdmUgYSBjb21wYXRpYmxlIFZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpIGluc3RhbGxlZD9cbiIKKyAgICAgICAgICAgICJQbGVhc2UgbG9vayBhdCB0aGUgR2V0dGluZyBTdGFydGVkIGd1aWRlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKKyAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyAgICB9CisKKyAgICAvKiBNYWtlIGluaXRpYWwgY2FsbCB0byBxdWVyeSBncHVfY291bnQsIHRoZW4gc2Vjb25kIGNhbGwgZm9yIGdwdSBpbmZvKi8KKyAgICBlcnIgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhkZW1vLT5pbnN0LCAmZ3B1X2NvdW50LCBOVUxMKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBpZiAoZ3B1X2NvdW50ID4gMCkgeworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlICpwaHlzaWNhbF9kZXZpY2VzID0gbWFsbG9jKHNpemVvZihWa1BoeXNpY2FsRGV2aWNlKSAqIGdwdV9jb3VudCk7CisgICAgICAgIGVyciA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGRlbW8tPmluc3QsICZncHVfY291bnQsIHBoeXNpY2FsX2RldmljZXMpOworICAgICAgICBhc3NlcnQoIWVycik7CisgICAgICAgIC8qIEZvciBjdWJlIGRlbW8gd2UganVzdCBncmFiIHRoZSBmaXJzdCBwaHlzaWNhbCBkZXZpY2UgKi8KKyAgICAgICAgZGVtby0+Z3B1ID0gcGh5c2ljYWxfZGV2aWNlc1swXTsKKyAgICAgICAgZnJlZShwaHlzaWNhbF9kZXZpY2VzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFUlJfRVhJVCgKKyAgICAgICAgICAgICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyByZXBvcnRlZCB6ZXJvIGFjY2Vzc2libGUgZGV2aWNlcy5cblxuIgorICAgICAgICAgICAgIkRvIHlvdSBoYXZlIGEgY29tcGF0aWJsZSBWdWxrYW4gaW5zdGFsbGFibGUgY2xpZW50IGRyaXZlciAoSUNEKSBpbnN0YWxsZWQ/XG4iCisgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgRmFpbHVyZSIpOworICAgIH0KKworICAgIC8qIExvb2sgZm9yIGRldmljZSBleHRlbnNpb25zICovCisgICAgdWludDMyX3QgZGV2aWNlX2V4dGVuc2lvbl9jb3VudCA9IDA7CisgICAgVmtCb29sMzIgc3dhcGNoYWluRXh0Rm91bmQgPSAwOworICAgIGRlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50ID0gMDsKKyAgICBtZW1zZXQoZGVtby0+ZXh0ZW5zaW9uX25hbWVzLCAwLCBzaXplb2YoZGVtby0+ZXh0ZW5zaW9uX25hbWVzKSk7CisKKyAgICBlcnIgPSB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoZGVtby0+Z3B1LCBOVUxMLCAmZGV2aWNlX2V4dGVuc2lvbl9jb3VudCwgTlVMTCk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgaWYgKGRldmljZV9leHRlbnNpb25fY291bnQgPiAwKSB7CisgICAgICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqZGV2aWNlX2V4dGVuc2lvbnMgPSBtYWxsb2Moc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykgKiBkZXZpY2VfZXh0ZW5zaW9uX2NvdW50KTsKKyAgICAgICAgZXJyID0gdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGRlbW8tPmdwdSwgTlVMTCwgJmRldmljZV9leHRlbnNpb25fY291bnQsIGRldmljZV9leHRlbnNpb25zKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXZpY2VfZXh0ZW5zaW9uX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUsIGRldmljZV9leHRlbnNpb25zW2ldLmV4dGVuc2lvbk5hbWUpKSB7CisgICAgICAgICAgICAgICAgc3dhcGNoYWluRXh0Rm91bmQgPSAxOworICAgICAgICAgICAgICAgIGRlbW8tPmV4dGVuc2lvbl9uYW1lc1tkZW1vLT5lbmFibGVkX2V4dGVuc2lvbl9jb3VudCsrXSA9IFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZGVtby0+ZW5hYmxlZF9leHRlbnNpb25fY291bnQgPCA2NCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVtby0+VktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnRfZW5hYmxlZCkgeworICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHVzZXIgImVuYWJsZWQiIHRoZSBleHRlbnNpb24gdmlhIHRoZSBjb21tYW5kCisgICAgICAgICAgICAvLyBsaW5lLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IGl0J3MgZW51bWVyYXRlZCBmb3IgdXNlIHdpdGggdGhlCisgICAgICAgICAgICAvLyBkZXZpY2UuICBUaGVyZWZvcmUsIGRpc2FibGUgaXQgaGVyZSwgYW5kIHJlLWVuYWJsZSBpdCBhZ2FpbiBpZgorICAgICAgICAgICAgLy8gZW51bWVyYXRlZC4KKyAgICAgICAgICAgIGRlbW8tPlZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50X2VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXZpY2VfZXh0ZW5zaW9uX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChWS19LSFJfSU5DUkVNRU5UQUxfUFJFU0VOVF9FWFRFTlNJT05fTkFNRSwgZGV2aWNlX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVtby0+ZXh0ZW5zaW9uX25hbWVzW2RlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KytdID0gVktfS0hSX0lOQ1JFTUVOVEFMX1BSRVNFTlRfRVhURU5TSU9OX05BTUU7CisgICAgICAgICAgICAgICAgICAgIGRlbW8tPlZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50X2VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBEYmdNc2coIlZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50IGV4dGVuc2lvbiBlbmFibGVkXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0KGRlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50IDwgNjQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZW1vLT5WS19LSFJfaW5jcmVtZW50YWxfcHJlc2VudF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgRGJnTXNnKCJWS19LSFJfaW5jcmVtZW50YWxfcHJlc2VudCBleHRlbnNpb24gTk9UIEFWQUlMQUJMRVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVtby0+VktfR09PR0xFX2Rpc3BsYXlfdGltaW5nX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIEV2ZW4gdGhvdWdoIHRoZSB1c2VyICJlbmFibGVkIiB0aGUgZXh0ZW5zaW9uIHZpYSB0aGUgY29tbWFuZAorICAgICAgICAgICAgLy8gbGluZSwgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCBpdCdzIGVudW1lcmF0ZWQgZm9yIHVzZSB3aXRoIHRoZQorICAgICAgICAgICAgLy8gZGV2aWNlLiAgVGhlcmVmb3JlLCBkaXNhYmxlIGl0IGhlcmUsIGFuZCByZS1lbmFibGUgaXQgYWdhaW4gaWYKKyAgICAgICAgICAgIC8vIGVudW1lcmF0ZWQuCisgICAgICAgICAgICBkZW1vLT5WS19HT09HTEVfZGlzcGxheV90aW1pbmdfZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRldmljZV9leHRlbnNpb25fY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0dPT0dMRV9ESVNQTEFZX1RJTUlOR19FWFRFTlNJT05fTkFNRSwgZGV2aWNlX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVtby0+ZXh0ZW5zaW9uX25hbWVzW2RlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KytdID0gVktfR09PR0xFX0RJU1BMQVlfVElNSU5HX0VYVEVOU0lPTl9OQU1FOworICAgICAgICAgICAgICAgICAgICBkZW1vLT5WS19HT09HTEVfZGlzcGxheV90aW1pbmdfZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIERiZ01zZygiVktfR09PR0xFX2Rpc3BsYXlfdGltaW5nIGV4dGVuc2lvbiBlbmFibGVkXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0KGRlbW8tPmVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50IDwgNjQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZW1vLT5WS19HT09HTEVfZGlzcGxheV90aW1pbmdfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIERiZ01zZygiVktfR09PR0xFX2Rpc3BsYXlfdGltaW5nIGV4dGVuc2lvbiBOT1QgQVZBSUxBQkxFXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyZWUoZGV2aWNlX2V4dGVuc2lvbnMpOworICAgIH0KKworICAgIGlmICghc3dhcGNoYWluRXh0Rm91bmQpIHsKKyAgICAgICAgRVJSX0VYSVQoInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCB0aGUgIiBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FCisgICAgICAgICAgICAgICAgICIgZXh0ZW5zaW9uLlxuXG5EbyB5b3UgaGF2ZSBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkgaW5zdGFsbGVkP1xuIgorICAgICAgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyAgICB9CisKKyAgICBpZiAoZGVtby0+dmFsaWRhdGUpIHsKKyAgICAgICAgLy8gU2V0dXAgVktfRVhUX2RlYnVnX3V0aWxzIGZ1bmN0aW9uIHBvaW50ZXJzIGFsd2F5cyAod2UgdXNlIHRoZW0gZm9yCisgICAgICAgIC8vIGRlYnVnIGxhYmVscyBhbmQgbmFtZXMpLgorICAgICAgICBkZW1vLT5DcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0KKyAgICAgICAgICAgIChQRk5fdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKXZrR2V0SW5zdGFuY2VQcm9jQWRkcihkZW1vLT5pbnN0LCAidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIik7CisgICAgICAgIGRlbW8tPkRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0KKyAgICAgICAgICAgIChQRk5fdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCl2a0dldEluc3RhbmNlUHJvY0FkZHIoZGVtby0+aW5zdCwgInZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiKTsKKyAgICAgICAgZGVtby0+U3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQgPQorICAgICAgICAgICAgKFBGTl92a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKXZrR2V0SW5zdGFuY2VQcm9jQWRkcihkZW1vLT5pbnN0LCAidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIpOworICAgICAgICBkZW1vLT5DbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCA9CisgICAgICAgICAgICAoUEZOX3ZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQpdmtHZXRJbnN0YW5jZVByb2NBZGRyKGRlbW8tPmluc3QsICJ2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIik7CisgICAgICAgIGRlbW8tPkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCA9CisgICAgICAgICAgICAoUEZOX3ZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKXZrR2V0SW5zdGFuY2VQcm9jQWRkcihkZW1vLT5pbnN0LCAidmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiKTsKKyAgICAgICAgZGVtby0+Q21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUID0KKyAgICAgICAgICAgIChQRk5fdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQpdmtHZXRJbnN0YW5jZVByb2NBZGRyKGRlbW8tPmluc3QsICJ2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgICAgICBkZW1vLT5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCA9CisgICAgICAgICAgICAoUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQpdmtHZXRJbnN0YW5jZVByb2NBZGRyKGRlbW8tPmluc3QsICJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIik7CisgICAgICAgIGlmIChOVUxMID09IGRlbW8tPkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgfHwgTlVMTCA9PSBkZW1vLT5EZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCB8fAorICAgICAgICAgICAgTlVMTCA9PSBkZW1vLT5TdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCB8fCBOVUxMID09IGRlbW8tPkNtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIHx8CisgICAgICAgICAgICBOVUxMID09IGRlbW8tPkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCB8fCBOVUxMID09IGRlbW8tPkNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCB8fAorICAgICAgICAgICAgTlVMTCA9PSBkZW1vLT5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCkgeworICAgICAgICAgICAgRVJSX0VYSVQoIkdldFByb2NBZGRyOiBGYWlsZWQgdG8gaW5pdCBWS19FWFRfZGVidWdfdXRpbHNcbiIsICJHZXRQcm9jQWRkcjogRmFpbHVyZSIpOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZGVtby0+Q3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVChkZW1vLT5pbnN0LCAmZGJnX21lc3Nlbmdlcl9jcmVhdGVfaW5mbywgTlVMTCwgJmRlbW8tPmRiZ19tZXNzZW5nZXIpOworICAgICAgICBzd2l0Y2ggKGVycikgeworICAgICAgICAgICAgY2FzZSBWS19TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk6CisgICAgICAgICAgICAgICAgRVJSX0VYSVQoIkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQ6IG91dCBvZiBob3N0IG1lbW9yeVxuIiwgIkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgRmFpbHVyZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBFUlJfRVhJVCgiQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVDogdW5rbm93biBmYWlsdXJlXG4iLCAiQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCBGYWlsdXJlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoZGVtby0+Z3B1LCAmZGVtby0+Z3B1X3Byb3BzKTsKKworICAgIC8qIENhbGwgd2l0aCBOVUxMIGRhdGEgdG8gZ2V0IGNvdW50ICovCisgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhkZW1vLT5ncHUsICZkZW1vLT5xdWV1ZV9mYW1pbHlfY291bnQsIE5VTEwpOworICAgIGFzc2VydChkZW1vLT5xdWV1ZV9mYW1pbHlfY291bnQgPj0gMSk7CisKKyAgICBkZW1vLT5xdWV1ZV9wcm9wcyA9IChWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAqKW1hbGxvYyhkZW1vLT5xdWV1ZV9mYW1pbHlfY291bnQgKiBzaXplb2YoVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMpKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKGRlbW8tPmdwdSwgJmRlbW8tPnF1ZXVlX2ZhbWlseV9jb3VudCwgZGVtby0+cXVldWVfcHJvcHMpOworCisgICAgLy8gUXVlcnkgZmluZS1ncmFpbmVkIGZlYXR1cmUgc3VwcG9ydCBmb3IgdGhpcyBkZXZpY2UuCisgICAgLy8gIElmIGFwcCBoYXMgc3BlY2lmaWMgZmVhdHVyZSByZXF1aXJlbWVudHMgaXQgc2hvdWxkIGNoZWNrIHN1cHBvcnRlZAorICAgIC8vICBmZWF0dXJlcyBiYXNlZCBvbiB0aGlzIHF1ZXJ5CisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIHBoeXNEZXZGZWF0dXJlczsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoZGVtby0+Z3B1LCAmcGh5c0RldkZlYXR1cmVzKTsKKworICAgIEdFVF9JTlNUQU5DRV9QUk9DX0FERFIoZGVtby0+aW5zdCwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUik7CisgICAgR0VUX0lOU1RBTkNFX1BST0NfQUREUihkZW1vLT5pbnN0LCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIpOworICAgIEdFVF9JTlNUQU5DRV9QUk9DX0FERFIoZGVtby0+aW5zdCwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUik7CisgICAgR0VUX0lOU1RBTkNFX1BST0NfQUREUihkZW1vLT5pbnN0LCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIpOworICAgIEdFVF9JTlNUQU5DRV9QUk9DX0FERFIoZGVtby0+aW5zdCwgR2V0U3dhcGNoYWluSW1hZ2VzS0hSKTsKK30KKworc3RhdGljIHZvaWQgZGVtb19jcmVhdGVfZGV2aWNlKHN0cnVjdCBkZW1vICpkZW1vKSB7CisgICAgVmtSZXN1bHQgVV9BU1NFUlRfT05MWSBlcnI7CisgICAgZmxvYXQgcXVldWVfcHJpb3JpdGllc1sxXSA9IHswLjB9OworICAgIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIHF1ZXVlc1syXTsKKyAgICBxdWV1ZXNbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfQ1JFQVRFX0lORk87CisgICAgcXVldWVzWzBdLnBOZXh0ID0gTlVMTDsKKyAgICBxdWV1ZXNbMF0ucXVldWVGYW1pbHlJbmRleCA9IGRlbW8tPmdyYXBoaWNzX3F1ZXVlX2ZhbWlseV9pbmRleDsKKyAgICBxdWV1ZXNbMF0ucXVldWVDb3VudCA9IDE7CisgICAgcXVldWVzWzBdLnBRdWV1ZVByaW9yaXRpZXMgPSBxdWV1ZV9wcmlvcml0aWVzOworICAgIHF1ZXVlc1swXS5mbGFncyA9IDA7CisKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gZGV2aWNlID0geworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IE5VTEwsCisgICAgICAgIC5xdWV1ZUNyZWF0ZUluZm9Db3VudCA9IDEsCisgICAgICAgIC5wUXVldWVDcmVhdGVJbmZvcyA9IHF1ZXVlcywKKyAgICAgICAgLmVuYWJsZWRMYXllckNvdW50ID0gMCwKKyAgICAgICAgLnBwRW5hYmxlZExheWVyTmFtZXMgPSBOVUxMLAorICAgICAgICAuZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gZGVtby0+ZW5hYmxlZF9leHRlbnNpb25fY291bnQsCisgICAgICAgIC5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IChjb25zdCBjaGFyICpjb25zdCAqKWRlbW8tPmV4dGVuc2lvbl9uYW1lcywKKyAgICAgICAgLnBFbmFibGVkRmVhdHVyZXMgPSBOVUxMLCAgLy8gSWYgc3BlY2lmaWMgZmVhdHVyZXMgYXJlIHJlcXVpcmVkLCBwYXNzIHRoZW0gaW4gaGVyZQorICAgIH07CisgICAgaWYgKGRlbW8tPnNlcGFyYXRlX3ByZXNlbnRfcXVldWUpIHsKKyAgICAgICAgcXVldWVzWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPOworICAgICAgICBxdWV1ZXNbMV0ucE5leHQgPSBOVUxMOworICAgICAgICBxdWV1ZXNbMV0ucXVldWVGYW1pbHlJbmRleCA9IGRlbW8tPnByZXNlbnRfcXVldWVfZmFtaWx5X2luZGV4OworICAgICAgICBxdWV1ZXNbMV0ucXVldWVDb3VudCA9IDE7CisgICAgICAgIHF1ZXVlc1sxXS5wUXVldWVQcmlvcml0aWVzID0gcXVldWVfcHJpb3JpdGllczsKKyAgICAgICAgcXVldWVzWzFdLmZsYWdzID0gMDsKKyAgICAgICAgZGV2aWNlLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMjsKKyAgICB9CisgICAgZXJyID0gdmtDcmVhdGVEZXZpY2UoZGVtby0+Z3B1LCAmZGV2aWNlLCBOVUxMLCAmZGVtby0+ZGV2aWNlKTsKKyAgICBhc3NlcnQoIWVycik7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9fY3JlYXRlX3N1cmZhY2Uoc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBWa1Jlc3VsdCBVX0FTU0VSVF9PTkxZIGVycjsKKworLy8gQ3JlYXRlIGEgV1NJIHN1cmZhY2UgZm9yIHRoZSB3aW5kb3c6CisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKQorICAgIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBjcmVhdGVJbmZvLmZsYWdzID0gMDsKKyAgICBjcmVhdGVJbmZvLmhpbnN0YW5jZSA9IGRlbW8tPmNvbm5lY3Rpb247CisgICAgY3JlYXRlSW5mby5od25kID0gZGVtby0+d2luZG93OworCisgICAgZXJyID0gdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIoZGVtby0+aW5zdCwgJmNyZWF0ZUluZm8sIE5VTEwsICZkZW1vLT5zdXJmYWNlKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKQorICAgIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNyZWF0ZUluZm87CisgICAgY3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dBWUxBTkRfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI7CisgICAgY3JlYXRlSW5mby5wTmV4dCA9IE5VTEw7CisgICAgY3JlYXRlSW5mby5mbGFncyA9IDA7CisgICAgY3JlYXRlSW5mby5kaXNwbGF5ID0gZGVtby0+ZGlzcGxheTsKKyAgICBjcmVhdGVJbmZvLnN1cmZhY2UgPSBkZW1vLT53aW5kb3c7CisKKyAgICBlcnIgPSB2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKGRlbW8tPmluc3QsICZjcmVhdGVJbmZvLCBOVUxMLCAmZGVtby0+c3VyZmFjZSk7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUikKKyAgICBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIGNyZWF0ZUluZm8ucE5leHQgPSBOVUxMOworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSAwOworICAgIGNyZWF0ZUluZm8ud2luZG93ID0gKHN0cnVjdCBBTmF0aXZlV2luZG93ICopKGRlbW8tPndpbmRvdyk7CisKKyAgICBlcnIgPSB2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKGRlbW8tPmluc3QsICZjcmVhdGVJbmZvLCBOVUxMLCAmZGVtby0+c3VyZmFjZSk7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikKKyAgICBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9YTElCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIGNyZWF0ZUluZm8ucE5leHQgPSBOVUxMOworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSAwOworICAgIGNyZWF0ZUluZm8uZHB5ID0gZGVtby0+ZGlzcGxheTsKKyAgICBjcmVhdGVJbmZvLndpbmRvdyA9IGRlbW8tPnhsaWJfd2luZG93OworCisgICAgZXJyID0gdmtDcmVhdGVYbGliU3VyZmFjZUtIUihkZW1vLT5pbnN0LCAmY3JlYXRlSW5mbywgTlVMTCwgJmRlbW8tPnN1cmZhY2UpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNyZWF0ZUluZm87CisgICAgY3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1hDQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBjcmVhdGVJbmZvLmZsYWdzID0gMDsKKyAgICBjcmVhdGVJbmZvLmNvbm5lY3Rpb24gPSBkZW1vLT5jb25uZWN0aW9uOworICAgIGNyZWF0ZUluZm8ud2luZG93ID0gZGVtby0+eGNiX3dpbmRvdzsKKworICAgIGVyciA9IHZrQ3JlYXRlWGNiU3VyZmFjZUtIUihkZW1vLT5pbnN0LCAmY3JlYXRlSW5mbywgTlVMTCwgJmRlbW8tPnN1cmZhY2UpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fRElTUExBWV9LSFIpCisgICAgZXJyID0gZGVtb19jcmVhdGVfZGlzcGxheV9zdXJmYWNlKGRlbW8pOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKQorICAgIFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCBzdXJmYWNlOworICAgIHN1cmZhY2Uuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVDsKKyAgICBzdXJmYWNlLnBOZXh0ID0gTlVMTDsKKyAgICBzdXJmYWNlLmZsYWdzID0gMDsKKyAgICBzdXJmYWNlLnBMYXllciA9IGRlbW8tPmNhTWV0YWxMYXllcjsKKworICAgIGVyciA9IHZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKGRlbW8tPmluc3QsICZzdXJmYWNlLCBOVUxMLCAmZGVtby0+c3VyZmFjZSk7CisjZW5kaWYKKyAgICBhc3NlcnQoIWVycik7Cit9CisKK3N0YXRpYyB2b2lkIGRlbW9faW5pdF92a19zd2FwY2hhaW4oc3RydWN0IGRlbW8gKmRlbW8pIHsKKyAgICBWa1Jlc3VsdCBVX0FTU0VSVF9PTkxZIGVycjsKKworICAgIGRlbW9fY3JlYXRlX3N1cmZhY2UoZGVtbyk7CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBxdWV1ZSB0byBsZWFybiB3aGV0aGVyIGl0IHN1cHBvcnRzIHByZXNlbnRpbmc6CisgICAgVmtCb29sMzIgKnN1cHBvcnRzUHJlc2VudCA9IChWa0Jvb2wzMiAqKW1hbGxvYyhkZW1vLT5xdWV1ZV9mYW1pbHlfY291bnQgKiBzaXplb2YoVmtCb29sMzIpKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVtby0+cXVldWVfZmFtaWx5X2NvdW50OyBpKyspIHsKKyAgICAgICAgZGVtby0+ZnBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKGRlbW8tPmdwdSwgaSwgZGVtby0+c3VyZmFjZSwgJnN1cHBvcnRzUHJlc2VudFtpXSk7CisgICAgfQorCisgICAgLy8gU2VhcmNoIGZvciBhIGdyYXBoaWNzIGFuZCBhIHByZXNlbnQgcXVldWUgaW4gdGhlIGFycmF5IG9mIHF1ZXVlCisgICAgLy8gZmFtaWxpZXMsIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIGJvdGgKKyAgICB1aW50MzJfdCBncmFwaGljc1F1ZXVlRmFtaWx5SW5kZXggPSBVSU5UMzJfTUFYOworICAgIHVpbnQzMl90IHByZXNlbnRRdWV1ZUZhbWlseUluZGV4ID0gVUlOVDMyX01BWDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVtby0+cXVldWVfZmFtaWx5X2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKChkZW1vLT5xdWV1ZV9wcm9wc1tpXS5xdWV1ZUZsYWdzICYgVktfUVVFVUVfR1JBUEhJQ1NfQklUKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZ3JhcGhpY3NRdWV1ZUZhbWlseUluZGV4ID09IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICBncmFwaGljc1F1ZXVlRmFtaWx5SW5kZXggPSBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3VwcG9ydHNQcmVzZW50W2ldID09IFZLX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBncmFwaGljc1F1ZXVlRmFtaWx5SW5kZXggPSBpOworICAgICAgICAgICAgICAgIHByZXNlbnRRdWV1ZUZhbWlseUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmVzZW50UXVldWVGYW1pbHlJbmRleCA9PSBVSU5UMzJfTUFYKSB7CisgICAgICAgIC8vIElmIGRpZG4ndCBmaW5kIGEgcXVldWUgdGhhdCBzdXBwb3J0cyBib3RoIGdyYXBoaWNzIGFuZCBwcmVzZW50LCB0aGVuCisgICAgICAgIC8vIGZpbmQgYSBzZXBhcmF0ZSBwcmVzZW50IHF1ZXVlLgorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVtby0+cXVldWVfZmFtaWx5X2NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdXBwb3J0c1ByZXNlbnRbaV0gPT0gVktfVFJVRSkgeworICAgICAgICAgICAgICAgIHByZXNlbnRRdWV1ZUZhbWlseUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGVycm9yIGlmIGNvdWxkIG5vdCBmaW5kIGJvdGggYSBncmFwaGljcyBhbmQgYSBwcmVzZW50IHF1ZXVlCisgICAgaWYgKGdyYXBoaWNzUXVldWVGYW1pbHlJbmRleCA9PSBVSU5UMzJfTUFYIHx8IHByZXNlbnRRdWV1ZUZhbWlseUluZGV4ID09IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgRVJSX0VYSVQoIkNvdWxkIG5vdCBmaW5kIGJvdGggZ3JhcGhpY3MgYW5kIHByZXNlbnQgcXVldWVzXG4iLCAiU3dhcGNoYWluIEluaXRpYWxpemF0aW9uIEZhaWx1cmUiKTsKKyAgICB9CisKKyAgICBkZW1vLT5ncmFwaGljc19xdWV1ZV9mYW1pbHlfaW5kZXggPSBncmFwaGljc1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgZGVtby0+cHJlc2VudF9xdWV1ZV9mYW1pbHlfaW5kZXggPSBwcmVzZW50UXVldWVGYW1pbHlJbmRleDsKKyAgICBkZW1vLT5zZXBhcmF0ZV9wcmVzZW50X3F1ZXVlID0gKGRlbW8tPmdyYXBoaWNzX3F1ZXVlX2ZhbWlseV9pbmRleCAhPSBkZW1vLT5wcmVzZW50X3F1ZXVlX2ZhbWlseV9pbmRleCk7CisgICAgZnJlZShzdXBwb3J0c1ByZXNlbnQpOworCisgICAgZGVtb19jcmVhdGVfZGV2aWNlKGRlbW8pOworCisgICAgR0VUX0RFVklDRV9QUk9DX0FERFIoZGVtby0+ZGV2aWNlLCBDcmVhdGVTd2FwY2hhaW5LSFIpOworICAgIEdFVF9ERVZJQ0VfUFJPQ19BRERSKGRlbW8tPmRldmljZSwgRGVzdHJveVN3YXBjaGFpbktIUik7CisgICAgR0VUX0RFVklDRV9QUk9DX0FERFIoZGVtby0+ZGV2aWNlLCBHZXRTd2FwY2hhaW5JbWFnZXNLSFIpOworICAgIEdFVF9ERVZJQ0VfUFJPQ19BRERSKGRlbW8tPmRldmljZSwgQWNxdWlyZU5leHRJbWFnZUtIUik7CisgICAgR0VUX0RFVklDRV9QUk9DX0FERFIoZGVtby0+ZGV2aWNlLCBRdWV1ZVByZXNlbnRLSFIpOworICAgIGlmIChkZW1vLT5WS19HT09HTEVfZGlzcGxheV90aW1pbmdfZW5hYmxlZCkgeworICAgICAgICBHRVRfREVWSUNFX1BST0NfQUREUihkZW1vLT5kZXZpY2UsIEdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKTsKKyAgICAgICAgR0VUX0RFVklDRV9QUk9DX0FERFIoZGVtby0+ZGV2aWNlLCBHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKTsKKyAgICB9CisKKyAgICB2a0dldERldmljZVF1ZXVlKGRlbW8tPmRldmljZSwgZGVtby0+Z3JhcGhpY3NfcXVldWVfZmFtaWx5X2luZGV4LCAwLCAmZGVtby0+Z3JhcGhpY3NfcXVldWUpOworCisgICAgaWYgKCFkZW1vLT5zZXBhcmF0ZV9wcmVzZW50X3F1ZXVlKSB7CisgICAgICAgIGRlbW8tPnByZXNlbnRfcXVldWUgPSBkZW1vLT5ncmFwaGljc19xdWV1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICB2a0dldERldmljZVF1ZXVlKGRlbW8tPmRldmljZSwgZGVtby0+cHJlc2VudF9xdWV1ZV9mYW1pbHlfaW5kZXgsIDAsICZkZW1vLT5wcmVzZW50X3F1ZXVlKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgVmtGb3JtYXQncyB0aGF0IGFyZSBzdXBwb3J0ZWQ6CisgICAgdWludDMyX3QgZm9ybWF0Q291bnQ7CisgICAgZXJyID0gZGVtby0+ZnBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKGRlbW8tPmdwdSwgZGVtby0+c3VyZmFjZSwgJmZvcm1hdENvdW50LCBOVUxMKTsKKyAgICBhc3NlcnQoIWVycik7CisgICAgVmtTdXJmYWNlRm9ybWF0S0hSICpzdXJmRm9ybWF0cyA9IChWa1N1cmZhY2VGb3JtYXRLSFIgKiltYWxsb2MoZm9ybWF0Q291bnQgKiBzaXplb2YoVmtTdXJmYWNlRm9ybWF0S0hSKSk7CisgICAgZXJyID0gZGVtby0+ZnBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKGRlbW8tPmdwdSwgZGVtby0+c3VyZmFjZSwgJmZvcm1hdENvdW50LCBzdXJmRm9ybWF0cyk7CisgICAgYXNzZXJ0KCFlcnIpOworICAgIC8vIElmIHRoZSBmb3JtYXQgbGlzdCBpbmNsdWRlcyBqdXN0IG9uZSBlbnRyeSBvZiBWS19GT1JNQVRfVU5ERUZJTkVELAorICAgIC8vIHRoZSBzdXJmYWNlIGhhcyBubyBwcmVmZXJyZWQgZm9ybWF0LiAgT3RoZXJ3aXNlLCBhdCBsZWFzdCBvbmUKKyAgICAvLyBzdXBwb3J0ZWQgZm9ybWF0IHdpbGwgYmUgcmV0dXJuZWQuCisgICAgaWYgKGZvcm1hdENvdW50ID09IDEgJiYgc3VyZkZvcm1hdHNbMF0uZm9ybWF0ID09IFZLX0ZPUk1BVF9VTkRFRklORUQpIHsKKyAgICAgICAgZGVtby0+Zm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChmb3JtYXRDb3VudCA+PSAxKTsKKyAgICAgICAgZGVtby0+Zm9ybWF0ID0gc3VyZkZvcm1hdHNbMF0uZm9ybWF0OworICAgIH0KKyAgICBkZW1vLT5jb2xvcl9zcGFjZSA9IHN1cmZGb3JtYXRzWzBdLmNvbG9yU3BhY2U7CisgICAgZnJlZShzdXJmRm9ybWF0cyk7CisKKyAgICBkZW1vLT5xdWl0ID0gZmFsc2U7CisgICAgZGVtby0+Y3VyRnJhbWUgPSAwOworCisgICAgLy8gQ3JlYXRlIHNlbWFwaG9yZXMgdG8gc3luY2hyb25pemUgYWNxdWlyaW5nIHByZXNlbnRhYmxlIGJ1ZmZlcnMgYmVmb3JlCisgICAgLy8gcmVuZGVyaW5nIGFuZCB3YWl0aW5nIGZvciBkcmF3aW5nIHRvIGJlIGNvbXBsZXRlIGJlZm9yZSBwcmVzZW50aW5nCisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNlbWFwaG9yZUNyZWF0ZUluZm8gPSB7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gTlVMTCwKKyAgICAgICAgLmZsYWdzID0gMCwKKyAgICB9OworCisgICAgLy8gQ3JlYXRlIGZlbmNlcyB0aGF0IHdlIGNhbiB1c2UgdG8gdGhyb3R0bGUgaWYgd2UgZ2V0IHRvbyBmYXIKKyAgICAvLyBhaGVhZCBvZiB0aGUgaW1hZ2UgcHJlc2VudHMKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmZW5jZV9jaSA9IHsKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8sIC5wTmV4dCA9IE5VTEwsIC5mbGFncyA9IFZLX0ZFTkNFX0NSRUFURV9TSUdOQUxFRF9CSVR9OworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBGUkFNRV9MQUc7IGkrKykgeworICAgICAgICBlcnIgPSB2a0NyZWF0ZUZlbmNlKGRlbW8tPmRldmljZSwgJmZlbmNlX2NpLCBOVUxMLCAmZGVtby0+ZmVuY2VzW2ldKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworCisgICAgICAgIGVyciA9IHZrQ3JlYXRlU2VtYXBob3JlKGRlbW8tPmRldmljZSwgJnNlbWFwaG9yZUNyZWF0ZUluZm8sIE5VTEwsICZkZW1vLT5pbWFnZV9hY3F1aXJlZF9zZW1hcGhvcmVzW2ldKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworCisgICAgICAgIGVyciA9IHZrQ3JlYXRlU2VtYXBob3JlKGRlbW8tPmRldmljZSwgJnNlbWFwaG9yZUNyZWF0ZUluZm8sIE5VTEwsICZkZW1vLT5kcmF3X2NvbXBsZXRlX3NlbWFwaG9yZXNbaV0pOworICAgICAgICBhc3NlcnQoIWVycik7CisKKyAgICAgICAgaWYgKGRlbW8tPnNlcGFyYXRlX3ByZXNlbnRfcXVldWUpIHsKKyAgICAgICAgICAgIGVyciA9IHZrQ3JlYXRlU2VtYXBob3JlKGRlbW8tPmRldmljZSwgJnNlbWFwaG9yZUNyZWF0ZUluZm8sIE5VTEwsICZkZW1vLT5pbWFnZV9vd25lcnNoaXBfc2VtYXBob3Jlc1tpXSk7CisgICAgICAgICAgICBhc3NlcnQoIWVycik7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVtby0+ZnJhbWVfaW5kZXggPSAwOworCisgICAgLy8gR2V0IE1lbW9yeSBpbmZvcm1hdGlvbiBhbmQgcHJvcGVydGllcworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKGRlbW8tPmdwdSwgJmRlbW8tPm1lbW9yeV9wcm9wZXJ0aWVzKTsKK30KKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKQorc3RhdGljIHZvaWQgcG9pbnRlcl9oYW5kbGVfZW50ZXIodm9pZCAqZGF0YSwgc3RydWN0IHdsX3BvaW50ZXIgKnBvaW50ZXIsIHVpbnQzMl90IHNlcmlhbCwgc3RydWN0IHdsX3N1cmZhY2UgKnN1cmZhY2UsIHdsX2ZpeGVkX3Qgc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bF9maXhlZF90IHN5KSB7fQorCitzdGF0aWMgdm9pZCBwb2ludGVyX2hhbmRsZV9sZWF2ZSh2b2lkICpkYXRhLCBzdHJ1Y3Qgd2xfcG9pbnRlciAqcG9pbnRlciwgdWludDMyX3Qgc2VyaWFsLCBzdHJ1Y3Qgd2xfc3VyZmFjZSAqc3VyZmFjZSkge30KKworc3RhdGljIHZvaWQgcG9pbnRlcl9oYW5kbGVfbW90aW9uKHZvaWQgKmRhdGEsIHN0cnVjdCB3bF9wb2ludGVyICpwb2ludGVyLCB1aW50MzJfdCB0aW1lLCB3bF9maXhlZF90IHN4LCB3bF9maXhlZF90IHN5KSB7fQorCitzdGF0aWMgdm9pZCBwb2ludGVyX2hhbmRsZV9idXR0b24odm9pZCAqZGF0YSwgc3RydWN0IHdsX3BvaW50ZXIgKndsX3BvaW50ZXIsIHVpbnQzMl90IHNlcmlhbCwgdWludDMyX3QgdGltZSwgdWludDMyX3QgYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXRlKSB7CisgICAgc3RydWN0IGRlbW8gKmRlbW8gPSBkYXRhOworICAgIGlmIChidXR0b24gPT0gQlROX0xFRlQgJiYgc3RhdGUgPT0gV0xfUE9JTlRFUl9CVVRUT05fU1RBVEVfUFJFU1NFRCkgeworICAgICAgICB3bF9zaGVsbF9zdXJmYWNlX21vdmUoZGVtby0+c2hlbGxfc3VyZmFjZSwgZGVtby0+c2VhdCwgc2VyaWFsKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBvaW50ZXJfaGFuZGxlX2F4aXModm9pZCAqZGF0YSwgc3RydWN0IHdsX3BvaW50ZXIgKndsX3BvaW50ZXIsIHVpbnQzMl90IHRpbWUsIHVpbnQzMl90IGF4aXMsIHdsX2ZpeGVkX3QgdmFsdWUpIHt9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2xfcG9pbnRlcl9saXN0ZW5lciBwb2ludGVyX2xpc3RlbmVyID0geworICAgIHBvaW50ZXJfaGFuZGxlX2VudGVyLCBwb2ludGVyX2hhbmRsZV9sZWF2ZSwgcG9pbnRlcl9oYW5kbGVfbW90aW9uLCBwb2ludGVyX2hhbmRsZV9idXR0b24sIHBvaW50ZXJfaGFuZGxlX2F4aXMsCit9OworCitzdGF0aWMgdm9pZCBrZXlib2FyZF9oYW5kbGVfa2V5bWFwKHZvaWQgKmRhdGEsIHN0cnVjdCB3bF9rZXlib2FyZCAqa2V5Ym9hcmQsIHVpbnQzMl90IGZvcm1hdCwgaW50IGZkLCB1aW50MzJfdCBzaXplKSB7fQorCitzdGF0aWMgdm9pZCBrZXlib2FyZF9oYW5kbGVfZW50ZXIodm9pZCAqZGF0YSwgc3RydWN0IHdsX2tleWJvYXJkICprZXlib2FyZCwgdWludDMyX3Qgc2VyaWFsLCBzdHJ1Y3Qgd2xfc3VyZmFjZSAqc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xfYXJyYXkgKmtleXMpIHt9CisKK3N0YXRpYyB2b2lkIGtleWJvYXJkX2hhbmRsZV9sZWF2ZSh2b2lkICpkYXRhLCBzdHJ1Y3Qgd2xfa2V5Ym9hcmQgKmtleWJvYXJkLCB1aW50MzJfdCBzZXJpYWwsIHN0cnVjdCB3bF9zdXJmYWNlICpzdXJmYWNlKSB7fQorCitzdGF0aWMgdm9pZCBrZXlib2FyZF9oYW5kbGVfa2V5KHZvaWQgKmRhdGEsIHN0cnVjdCB3bF9rZXlib2FyZCAqa2V5Ym9hcmQsIHVpbnQzMl90IHNlcmlhbCwgdWludDMyX3QgdGltZSwgdWludDMyX3Qga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGF0ZSkgeworICAgIGlmIChzdGF0ZSAhPSBXTF9LRVlCT0FSRF9LRVlfU1RBVEVfUkVMRUFTRUQpIHJldHVybjsKKyAgICBzdHJ1Y3QgZGVtbyAqZGVtbyA9IGRhdGE7CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgY2FzZSBLRVlfRVNDOiAgLy8gRXNjYXBlCisgICAgICAgICAgICBkZW1vLT5xdWl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtFWV9MRUZUOiAgLy8gbGVmdCBhcnJvdyBrZXkKKyAgICAgICAgICAgIGRlbW8tPnNwaW5fYW5nbGUgLT0gZGVtby0+c3Bpbl9pbmNyZW1lbnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRVlfUklHSFQ6ICAvLyByaWdodCBhcnJvdyBrZXkKKyAgICAgICAgICAgIGRlbW8tPnNwaW5fYW5nbGUgKz0gZGVtby0+c3Bpbl9pbmNyZW1lbnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRVlfU1BBQ0U6ICAvLyBzcGFjZSBiYXIKKyAgICAgICAgICAgIGRlbW8tPnBhdXNlID0gIWRlbW8tPnBhdXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBrZXlib2FyZF9oYW5kbGVfbW9kaWZpZXJzKHZvaWQgKmRhdGEsIHN0cnVjdCB3bF9rZXlib2FyZCAqa2V5Ym9hcmQsIHVpbnQzMl90IHNlcmlhbCwgdWludDMyX3QgbW9kc19kZXByZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vZHNfbGF0Y2hlZCwgdWludDMyX3QgbW9kc19sb2NrZWQsIHVpbnQzMl90IGdyb3VwKSB7fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdsX2tleWJvYXJkX2xpc3RlbmVyIGtleWJvYXJkX2xpc3RlbmVyID0geworICAgIGtleWJvYXJkX2hhbmRsZV9rZXltYXAsIGtleWJvYXJkX2hhbmRsZV9lbnRlciwga2V5Ym9hcmRfaGFuZGxlX2xlYXZlLCBrZXlib2FyZF9oYW5kbGVfa2V5LCBrZXlib2FyZF9oYW5kbGVfbW9kaWZpZXJzLAorfTsKKworc3RhdGljIHZvaWQgc2VhdF9oYW5kbGVfY2FwYWJpbGl0aWVzKHZvaWQgKmRhdGEsIHN0cnVjdCB3bF9zZWF0ICpzZWF0LCBlbnVtIHdsX3NlYXRfY2FwYWJpbGl0eSBjYXBzKSB7CisgICAgLy8gU3Vic2NyaWJlIHRvIHBvaW50ZXIgZXZlbnRzCisgICAgc3RydWN0IGRlbW8gKmRlbW8gPSBkYXRhOworICAgIGlmICgoY2FwcyAmIFdMX1NFQVRfQ0FQQUJJTElUWV9QT0lOVEVSKSAmJiAhZGVtby0+cG9pbnRlcikgeworICAgICAgICBkZW1vLT5wb2ludGVyID0gd2xfc2VhdF9nZXRfcG9pbnRlcihzZWF0KTsKKyAgICAgICAgd2xfcG9pbnRlcl9hZGRfbGlzdGVuZXIoZGVtby0+cG9pbnRlciwgJnBvaW50ZXJfbGlzdGVuZXIsIGRlbW8pOworICAgIH0gZWxzZSBpZiAoIShjYXBzICYgV0xfU0VBVF9DQVBBQklMSVRZX1BPSU5URVIpICYmIGRlbW8tPnBvaW50ZXIpIHsKKyAgICAgICAgd2xfcG9pbnRlcl9kZXN0cm95KGRlbW8tPnBvaW50ZXIpOworICAgICAgICBkZW1vLT5wb2ludGVyID0gTlVMTDsKKyAgICB9CisgICAgLy8gU3Vic2NyaWJlIHRvIGtleWJvYXJkIGV2ZW50cworICAgIGlmIChjYXBzICYgV0xfU0VBVF9DQVBBQklMSVRZX0tFWUJPQVJEKSB7CisgICAgICAgIGRlbW8tPmtleWJvYXJkID0gd2xfc2VhdF9nZXRfa2V5Ym9hcmQoc2VhdCk7CisgICAgICAgIHdsX2tleWJvYXJkX2FkZF9saXN0ZW5lcihkZW1vLT5rZXlib2FyZCwgJmtleWJvYXJkX2xpc3RlbmVyLCBkZW1vKTsKKyAgICB9IGVsc2UgaWYgKCEoY2FwcyAmIFdMX1NFQVRfQ0FQQUJJTElUWV9LRVlCT0FSRCkpIHsKKyAgICAgICAgd2xfa2V5Ym9hcmRfZGVzdHJveShkZW1vLT5rZXlib2FyZCk7CisgICAgICAgIGRlbW8tPmtleWJvYXJkID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2xfc2VhdF9saXN0ZW5lciBzZWF0X2xpc3RlbmVyID0geworICAgIHNlYXRfaGFuZGxlX2NhcGFiaWxpdGllcywKK307CisKK3N0YXRpYyB2b2lkIHJlZ2lzdHJ5X2hhbmRsZV9nbG9iYWwodm9pZCAqZGF0YSwgc3RydWN0IHdsX3JlZ2lzdHJ5ICpyZWdpc3RyeSwgdWludDMyX3QgaWQsIGNvbnN0IGNoYXIgKmludGVyZmFjZSwgdWludDMyX3QgdmVyc2lvbikgeworICAgIHN0cnVjdCBkZW1vICpkZW1vID0gZGF0YTsKKyAgICAvLyBwaWNrdXAgd2F5bGFuZCBvYmplY3RzIHdoZW4gdGhleSBhcHBlYXIKKyAgICBpZiAoc3RyY21wKGludGVyZmFjZSwgIndsX2NvbXBvc2l0b3IiKSA9PSAwKSB7CisgICAgICAgIHVpbnQzMl90IG1pblZlcnNpb24gPSB2ZXJzaW9uIDwgNCA/IHZlcnNpb24gOiA0OworICAgICAgICBkZW1vLT5jb21wb3NpdG9yID0gd2xfcmVnaXN0cnlfYmluZChyZWdpc3RyeSwgaWQsICZ3bF9jb21wb3NpdG9yX2ludGVyZmFjZSwgbWluVmVyc2lvbik7CisgICAgICAgIGlmIChkZW1vLT5WS19LSFJfaW5jcmVtZW50YWxfcHJlc2VudF9lbmFibGVkICYmIG1pblZlcnNpb24gPCA0KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldheWxhbmQgY29tcG9zaXRvciBkb2Vzbid0IHN1cHBvcnQgVktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnQsIGRpc2FibGluZy5cbiIpOworICAgICAgICAgICAgZGVtby0+VktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnRfZW5hYmxlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHJjbXAoaW50ZXJmYWNlLCAid2xfc2hlbGwiKSA9PSAwKSB7CisgICAgICAgIGRlbW8tPnNoZWxsID0gd2xfcmVnaXN0cnlfYmluZChyZWdpc3RyeSwgaWQsICZ3bF9zaGVsbF9pbnRlcmZhY2UsIDEpOworICAgIH0gZWxzZSBpZiAoc3RyY21wKGludGVyZmFjZSwgIndsX3NlYXQiKSA9PSAwKSB7CisgICAgICAgIGRlbW8tPnNlYXQgPSB3bF9yZWdpc3RyeV9iaW5kKHJlZ2lzdHJ5LCBpZCwgJndsX3NlYXRfaW50ZXJmYWNlLCAxKTsKKyAgICAgICAgd2xfc2VhdF9hZGRfbGlzdGVuZXIoZGVtby0+c2VhdCwgJnNlYXRfbGlzdGVuZXIsIGRlbW8pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVnaXN0cnlfaGFuZGxlX2dsb2JhbF9yZW1vdmUodm9pZCAqZGF0YSBVTlVTRUQsIHN0cnVjdCB3bF9yZWdpc3RyeSAqcmVnaXN0cnkgVU5VU0VELCB1aW50MzJfdCBuYW1lIFVOVVNFRCkge30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB3bF9yZWdpc3RyeV9saXN0ZW5lciByZWdpc3RyeV9saXN0ZW5lciA9IHtyZWdpc3RyeV9oYW5kbGVfZ2xvYmFsLCByZWdpc3RyeV9oYW5kbGVfZ2xvYmFsX3JlbW92ZX07CisjZW5kaWYKKworc3RhdGljIHZvaWQgZGVtb19pbml0X2Nvbm5lY3Rpb24oc3RydWN0IGRlbW8gKmRlbW8pIHsKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKQorICAgIGNvbnN0IHhjYl9zZXR1cF90ICpzZXR1cDsKKyAgICB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QgaXRlcjsKKyAgICBpbnQgc2NyOworCisgICAgY29uc3QgY2hhciAqZGlzcGxheV9lbnZhciA9IGdldGVudigiRElTUExBWSIpOworICAgIGlmIChkaXNwbGF5X2VudmFyID09IE5VTEwgfHwgZGlzcGxheV9lbnZhclswXSA9PSAnXDAnKSB7CisgICAgICAgIHByaW50ZigiRW52aXJvbm1lbnQgdmFyaWFibGUgRElTUExBWSByZXF1aXJlcyBhIHZhbGlkIHZhbHVlLlxuRXhpdGluZyAuLi5cbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBkZW1vLT5jb25uZWN0aW9uID0geGNiX2Nvbm5lY3QoTlVMTCwgJnNjcik7CisgICAgaWYgKHhjYl9jb25uZWN0aW9uX2hhc19lcnJvcihkZW1vLT5jb25uZWN0aW9uKSA+IDApIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgZmluZCBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkuXG5FeGl0aW5nIC4uLlxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHNldHVwID0geGNiX2dldF9zZXR1cChkZW1vLT5jb25uZWN0aW9uKTsKKyAgICBpdGVyID0geGNiX3NldHVwX3Jvb3RzX2l0ZXJhdG9yKHNldHVwKTsKKyAgICB3aGlsZSAoc2NyLS0gPiAwKSB4Y2Jfc2NyZWVuX25leHQoJml0ZXIpOworCisgICAgZGVtby0+c2NyZWVuID0gaXRlci5kYXRhOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgZGVtby0+ZGlzcGxheSA9IHdsX2Rpc3BsYXlfY29ubmVjdChOVUxMKTsKKworICAgIGlmIChkZW1vLT5kaXNwbGF5ID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgZmluZCBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkuXG5FeGl0aW5nIC4uLlxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGRlbW8tPnJlZ2lzdHJ5ID0gd2xfZGlzcGxheV9nZXRfcmVnaXN0cnkoZGVtby0+ZGlzcGxheSk7CisgICAgd2xfcmVnaXN0cnlfYWRkX2xpc3RlbmVyKGRlbW8tPnJlZ2lzdHJ5LCAmcmVnaXN0cnlfbGlzdGVuZXIsIGRlbW8pOworICAgIHdsX2Rpc3BsYXlfZGlzcGF0Y2goZGVtby0+ZGlzcGxheSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZGVtb19pbml0KHN0cnVjdCBkZW1vICpkZW1vLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICB2ZWMzIGV5ZSA9IHswLjBmLCAzLjBmLCA1LjBmfTsKKyAgICB2ZWMzIG9yaWdpbiA9IHswLCAwLCAwfTsKKyAgICB2ZWMzIHVwID0gezAuMGYsIDEuMGYsIDAuMH07CisKKyAgICBtZW1zZXQoZGVtbywgMCwgc2l6ZW9mKCpkZW1vKSk7CisgICAgZGVtby0+cHJlc2VudE1vZGUgPSBWS19QUkVTRU5UX01PREVfRklGT19LSFI7CisgICAgZGVtby0+ZnJhbWVDb3VudCA9IElOVDMyX01BWDsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi0tdXNlX3N0YWdpbmciKSA9PSAwKSB7CisgICAgICAgICAgICBkZW1vLT51c2Vfc3RhZ2luZ19idWZmZXIgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdHJjbXAoYXJndltpXSwgIi0tcHJlc2VudF9tb2RlIikgPT0gMCkgJiYgKGkgPCBhcmdjIC0gMSkpIHsKKyAgICAgICAgICAgIGRlbW8tPnByZXNlbnRNb2RlID0gYXRvaShhcmd2W2kgKyAxXSk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLWJyZWFrIikgPT0gMCkgeworICAgICAgICAgICAgZGVtby0+dXNlX2JyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi0tdmFsaWRhdGUiKSA9PSAwKSB7CisgICAgICAgICAgICBkZW1vLT52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLXZhbGlkYXRlLWNoZWNrcy1kaXNhYmxlZCIpID09IDApIHsKKyAgICAgICAgICAgIGRlbW8tPnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIGRlbW8tPnZhbGlkYXRlX2NoZWNrc19kaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLXhsaWIiKSA9PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi0teGxpYiBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZyIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS1jIikgPT0gMCAmJiBkZW1vLT5mcmFtZUNvdW50ID09IElOVDMyX01BWCAmJiBpIDwgYXJnYyAtIDEgJiYKKyAgICAgICAgICAgIHNzY2FuZihhcmd2W2kgKyAxXSwgIiVkIiwgJmRlbW8tPmZyYW1lQ291bnQpID09IDEgJiYgZGVtby0+ZnJhbWVDb3VudCA+PSAwKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLXN1cHByZXNzX3BvcHVwcyIpID09IDApIHsKKyAgICAgICAgICAgIGRlbW8tPnN1cHByZXNzX3BvcHVwcyA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLWRpc3BsYXlfdGltaW5nIikgPT0gMCkgeworICAgICAgICAgICAgZGVtby0+VktfR09PR0xFX2Rpc3BsYXlfdGltaW5nX2VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS1pbmNyZW1lbnRhbF9wcmVzZW50IikgPT0gMCkgeworICAgICAgICAgICAgZGVtby0+VktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnRfZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChBTkRST0lEKQorICAgICAgICBFUlJfRVhJVCgiVXNhZ2U6IHZrY3ViZSBbLS12YWxpZGF0ZV1cbiIsICJVc2FnZSIpOworI2Vsc2UKKyAgICAgICAgY2hhciAqbWVzc2FnZSA9CisgICAgICAgICAgICAiVXNhZ2U6XG4gICVzXHRbLS11c2Vfc3RhZ2luZ10gWy0tdmFsaWRhdGVdIFstLXZhbGlkYXRlLWNoZWNrcy1kaXNhYmxlZF1cbiIKKyAgICAgICAgICAgICJcdFstLWJyZWFrXSBbLS1jIDxmcmFtZWNvdW50Pl0gWy0tc3VwcHJlc3NfcG9wdXBzXVxuIgorICAgICAgICAgICAgIlx0Wy0taW5jcmVtZW50YWxfcHJlc2VudF0gWy0tZGlzcGxheV90aW1pbmddXG4iCisgICAgICAgICAgICAiXHRbLS1wcmVzZW50X21vZGUgPHByZXNlbnQgbW9kZSBlbnVtPl1cbiIKKyAgICAgICAgICAgICJcdDxwcmVzZW50X21vZGVfZW51bT5cbiIKKyAgICAgICAgICAgICJcdFx0VktfUFJFU0VOVF9NT0RFX0lNTUVESUFURV9LSFIgPSAlZFxuIgorICAgICAgICAgICAgIlx0XHRWS19QUkVTRU5UX01PREVfTUFJTEJPWF9LSFIgPSAlZFxuIgorICAgICAgICAgICAgIlx0XHRWS19QUkVTRU5UX01PREVfRklGT19LSFIgPSAlZFxuIgorICAgICAgICAgICAgIlx0XHRWS19QUkVTRU5UX01PREVfRklGT19SRUxBWEVEX0tIUiA9ICVkXG4iOworICAgICAgICBpbnQgbGVuZ3RoID0gc25wcmludGYoTlVMTCwgMCwgbWVzc2FnZSwgQVBQX1NIT1JUX05BTUUsIFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSLCBWS19QUkVTRU5UX01PREVfTUFJTEJPWF9LSFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QUkVTRU5UX01PREVfRklGT19LSFIsIFZLX1BSRVNFTlRfTU9ERV9GSUZPX1JFTEFYRURfS0hSKTsKKyAgICAgICAgY2hhciAqdXNhZ2UgPSAoY2hhciAqKW1hbGxvYyhsZW5ndGggKyAxKTsKKyAgICAgICAgaWYgKCF1c2FnZSkgeworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50Zih1c2FnZSwgbGVuZ3RoICsgMSwgbWVzc2FnZSwgQVBQX1NIT1JUX05BTUUsIFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSLCBWS19QUkVTRU5UX01PREVfTUFJTEJPWF9LSFIsCisgICAgICAgICAgICAgICAgIFZLX1BSRVNFTlRfTU9ERV9GSUZPX0tIUiwgVktfUFJFU0VOVF9NT0RFX0ZJRk9fUkVMQVhFRF9LSFIpOworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgICAgICBpZiAoIWRlbW8tPnN1cHByZXNzX3BvcHVwcykgTWVzc2FnZUJveChOVUxMLCB1c2FnZSwgIlVzYWdlIEVycm9yIiwgTUJfT0spOworI2Vsc2UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHVzYWdlKTsKKyAgICAgICAgZmZsdXNoKHN0ZGVycik7CisjZW5kaWYKKyAgICAgICAgZnJlZSh1c2FnZSk7CisgICAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBkZW1vX2luaXRfY29ubmVjdGlvbihkZW1vKTsKKworICAgIGRlbW9faW5pdF92ayhkZW1vKTsKKworICAgIGRlbW8tPndpZHRoID0gNTAwOworICAgIGRlbW8tPmhlaWdodCA9IDUwMDsKKworICAgIGRlbW8tPnNwaW5fYW5nbGUgPSA0LjBmOworICAgIGRlbW8tPnNwaW5faW5jcmVtZW50ID0gMC4yZjsKKyAgICBkZW1vLT5wYXVzZSA9IGZhbHNlOworCisgICAgbWF0NHg0X3BlcnNwZWN0aXZlKGRlbW8tPnByb2plY3Rpb25fbWF0cml4LCAoZmxvYXQpZGVncmVlc1RvUmFkaWFucyg0NS4wZiksIDEuMGYsIDAuMWYsIDEwMC4wZik7CisgICAgbWF0NHg0X2xvb2tfYXQoZGVtby0+dmlld19tYXRyaXgsIGV5ZSwgb3JpZ2luLCB1cCk7CisgICAgbWF0NHg0X2lkZW50aXR5KGRlbW8tPm1vZGVsX21hdHJpeCk7CisKKyAgICBkZW1vLT5wcm9qZWN0aW9uX21hdHJpeFsxXVsxXSAqPSAtMTsgIC8vIEZsaXAgcHJvamVjdGlvbiBtYXRyaXggZnJvbSBHTCB0byBWdWxrYW4gb3JpZW50YXRpb24uCit9CisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCisvLyBJbmNsdWRlIGhlYWRlciByZXF1aXJlZCBmb3IgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisjaW5jbHVkZSA8c2hlbGxhcGkuaD4KKworaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSBoUHJldkluc3RhbmNlLCBMUFNUUiBwQ21kTGluZSwgaW50IG5DbWRTaG93KSB7CisgICAgTVNHIG1zZzsgICAgLy8gbWVzc2FnZQorICAgIGJvb2wgZG9uZTsgIC8vIGZsYWcgc2F5aW5nIHdoZW4gYXBwIGlzIGNvbXBsZXRlCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7CisKKyAgICAvLyBFbnN1cmUgd1BhcmFtIGlzIGluaXRpYWxpemVkLgorICAgIG1zZy53UGFyYW0gPSAwOworCisgICAgLy8gVXNlIHRoZSBDb21tYW5kTGluZSBmdW5jdGlvbnMgdG8gZ2V0IHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgIC8vIFVuZm9ydHVuYXRlbHksIE1pY3Jvc29mdCBvdXRwdXRzCisgICAgLy8gdGhpcyBpbmZvcm1hdGlvbiBhcyB3aWRlIGNoYXJhY3RlcnMgZm9yIFVuaWNvZGUsIGFuZCB3ZSBzaW1wbHkgd2FudCB0aGUKKyAgICAvLyBBc2NpaSB2ZXJzaW9uIHRvIGJlIGNvbXBhdGlibGUKKyAgICAvLyB3aXRoIHRoZSBub24tV2luZG93cyBzaWRlLiAgU28sIHdlIGhhdmUgdG8gY29udmVydCB0aGUgaW5mb3JtYXRpb24gdG8KKyAgICAvLyBBc2NpaSBjaGFyYWN0ZXIgc3RyaW5ncy4KKyAgICBMUFdTVFIgKmNvbW1hbmRMaW5lQXJncyA9IENvbW1hbmRMaW5lVG9Bcmd2VyhHZXRDb21tYW5kTGluZVcoKSwgJmFyZ2MpOworICAgIGlmIChOVUxMID09IGNvbW1hbmRMaW5lQXJncykgeworICAgICAgICBhcmdjID0gMDsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA+IDApIHsKKyAgICAgICAgYXJndiA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqIGFyZ2MpOworICAgICAgICBpZiAoYXJndiA9PSBOVUxMKSB7CisgICAgICAgICAgICBhcmdjID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGlpaSA9IDA7IGlpaSA8IGFyZ2M7IGlpaSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHdpZGVDaGFyTGVuID0gd2NzbGVuKGNvbW1hbmRMaW5lQXJnc1tpaWldKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ29udmVydGVkID0gMDsKKworICAgICAgICAgICAgICAgIGFyZ3ZbaWlpXSA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSAqICh3aWRlQ2hhckxlbiArIDEpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJndltpaWldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgd2NzdG9tYnNfcygmbnVtQ29udmVydGVkLCBhcmd2W2lpaV0sIHdpZGVDaGFyTGVuICsgMSwgY29tbWFuZExpbmVBcmdzW2lpaV0sIHdpZGVDaGFyTGVuICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXJndiA9IE5VTEw7CisgICAgfQorCisgICAgZGVtb19pbml0KCZkZW1vLCBhcmdjLCBhcmd2KTsKKworICAgIC8vIEZyZWUgdXAgdGhlIGl0ZW1zIHdlIGhhZCB0byBhbGxvY2F0ZSBmb3IgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgaWYgKGFyZ2MgPiAwICYmIGFyZ3YgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGludCBpaWkgPSAwOyBpaWkgPCBhcmdjOyBpaWkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3ZbaWlpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnJlZShhcmd2W2lpaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyZWUoYXJndik7CisgICAgfQorCisgICAgZGVtby5jb25uZWN0aW9uID0gaEluc3RhbmNlOworICAgIHN0cm5jcHkoZGVtby5uYW1lLCAiVnVsa2FuIEN1YmUiLCBBUFBfTkFNRV9TVFJfTEVOKTsKKyAgICBkZW1vX2NyZWF0ZV93aW5kb3coJmRlbW8pOworICAgIGRlbW9faW5pdF92a19zd2FwY2hhaW4oJmRlbW8pOworCisgICAgZGVtb19wcmVwYXJlKCZkZW1vKTsKKworICAgIGRvbmUgPSBmYWxzZTsgIC8vIGluaXRpYWxpemUgbG9vcCBjb25kaXRpb24gdmFyaWFibGUKKworICAgIC8vIG1haW4gbWVzc2FnZSBsb29wCisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIGlmIChkZW1vLnBhdXNlKSB7CisgICAgICAgICAgICBjb25zdCBCT09MIHN1Y2MgPSBXYWl0TWVzc2FnZSgpOworCisgICAgICAgICAgICBpZiAoIXN1Y2MpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVtbyAqdG1wID0gJmRlbW87CisgICAgICAgICAgICAgICAgc3RydWN0IGRlbW8gKmRlbW8gPSB0bXA7CisgICAgICAgICAgICAgICAgRVJSX0VYSVQoIldhaXRNZXNzYWdlKCkgZmFpbGVkIG9uIHBhdXNlZCBkZW1vIiwgImV2ZW50IGxvb3AgZXJyb3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQZWVrTWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwLCBQTV9SRU1PVkUpOworICAgICAgICBpZiAobXNnLm1lc3NhZ2UgPT0gV01fUVVJVCkgIC8vIGNoZWNrIGZvciBhIHF1aXQgbWVzc2FnZQorICAgICAgICB7CisgICAgICAgICAgICBkb25lID0gdHJ1ZTsgIC8vIGlmIGZvdW5kLCBxdWl0IGFwcAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVHJhbnNsYXRlIGFuZCBkaXNwYXRjaCB0byBldmVudCBxdWV1ZSovCisgICAgICAgICAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworICAgICAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworICAgICAgICB9CisgICAgICAgIFJlZHJhd1dpbmRvdyhkZW1vLndpbmRvdywgTlVMTCwgTlVMTCwgUkRXX0lOVEVSTkFMUEFJTlQpOworICAgIH0KKworICAgIGRlbW9fY2xlYW51cCgmZGVtbyk7CisKKyAgICByZXR1cm4gKGludCltc2cud1BhcmFtOworfQorCisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQpCitzdGF0aWMgdm9pZCBkZW1vX21haW4oc3RydWN0IGRlbW8gKmRlbW8sIHZvaWQgKmNhTWV0YWxMYXllciwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICAgIGRlbW9faW5pdChkZW1vLCBhcmdjLCAoY2hhciAqKilhcmd2KTsKKyAgICBkZW1vLT5jYU1ldGFsTGF5ZXIgPSBjYU1ldGFsTGF5ZXI7CisgICAgZGVtb19pbml0X3ZrX3N3YXBjaGFpbihkZW1vKTsKKyAgICBkZW1vX3ByZXBhcmUoZGVtbyk7CisgICAgZGVtby0+c3Bpbl9hbmdsZSA9IDAuNGY7Cit9CisKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKQorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9uYXRpdmVfYXBwX2dsdWUuaD4KKyNpbmNsdWRlICJhbmRyb2lkX3V0aWwuaCIKKworc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKK3N0YXRpYyBib29sIGFjdGl2ZSA9IGZhbHNlOworc3RydWN0IGRlbW8gZGVtbzsKKworc3RhdGljIGludDMyX3QgcHJvY2Vzc0lucHV0KHN0cnVjdCBhbmRyb2lkX2FwcCAqYXBwLCBBSW5wdXRFdmVudCAqZXZlbnQpIHsgcmV0dXJuIDA7IH0KKworc3RhdGljIHZvaWQgcHJvY2Vzc0NvbW1hbmQoc3RydWN0IGFuZHJvaWRfYXBwICphcHAsIGludDMyX3QgY21kKSB7CisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBBUFBfQ01EX0lOSVRfV0lORE9XOiB7CisgICAgICAgICAgICBpZiAoYXBwLT53aW5kb3cpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBnZXR0aW5nIGEgbmV3IHdpbmRvdy4gIElmIHRoZSBhcHAgaXMgc3RhcnRpbmcgdXAsIHdlCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBpbml0aWFsaXplLiAgSWYgdGhlIGFwcCBoYXMgYWxyZWFkeSBiZWVuCisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQsIHRoYXQgbWVhbnMgdGhhdCB3ZSBsb3N0IG91ciBwcmV2aW91cyB3aW5kb3csCisgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIGEgbG90IG9mIHdvcmsgdG8gZG8uICBBdCBhIG1pbmltdW0sCisgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBkZXN0cm95IHRoZSBzd2FwY2hhaW4gYW5kIHN1cmZhY2UgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgICAgICAgICAgLy8gdGhlIG9sZCB3aW5kb3csIGFuZCBjcmVhdGUgYSBuZXcgc3VyZmFjZSBhbmQgc3dhcGNoYWluLgorICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoZXJlIGFyZSBhIGxvdCBvZiBvdGhlciBvYmplY3RzL3N0YXRlIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBpcyB0aWVkIHRvIHRoZSBzd2FwY2hhaW4sIGl0J3MgZWFzaWVzdCB0byBzaW1wbHkgY2xlYW51cCBhbmQKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBvdmVyIChpLmUuIHVzZSBhIGJydXRlLWZvcmNlIGFwcHJvYWNoIG9mIHJlLXN0YXJ0aW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCkKKyAgICAgICAgICAgICAgICBpZiAoZGVtby5wcmVwYXJlZCkgeworICAgICAgICAgICAgICAgICAgICBkZW1vX2NsZWFudXAoJmRlbW8pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBhcnNlIEludGVudHMgaW50byBhcmdjLCBhcmd2CisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBmb2xsb3dpbmcga2V5IHRvIHNlbmQgYXJndW1lbnRzLCBpLmUuCisgICAgICAgICAgICAgICAgLy8gLS1lcyBhcmdzICItLXZhbGlkYXRlIgorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIga2V5W10gPSAiYXJncyI7CisgICAgICAgICAgICAgICAgY2hhciAqYXBwVGFnID0gKGNoYXIgKilBUFBfU0hPUlRfTkFNRTsKKyAgICAgICAgICAgICAgICBpbnQgYXJnYyA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqKmFyZ3YgPSBnZXRfYXJncyhhcHAsIGtleSwgYXBwVGFnLCAmYXJnYyk7CisKKyAgICAgICAgICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIGFwcFRhZywgImFyZ2MgPSAlaSIsIGFyZ2MpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIGFwcFRhZywgImFyZ3ZbJWldID0gJXMiLCBpLCBhcmd2W2ldKTsKKworICAgICAgICAgICAgICAgIGRlbW9faW5pdCgmZGVtbywgYXJnYywgYXJndik7CisKKyAgICAgICAgICAgICAgICAvLyBGcmVlIHRoZSBhcmd2IG1hbGxvYydkIGJ5IGdldF9hcmdzCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIGZyZWUoYXJndltpXSk7CisKKyAgICAgICAgICAgICAgICBkZW1vLndpbmRvdyA9ICh2b2lkICopYXBwLT53aW5kb3c7CisgICAgICAgICAgICAgICAgZGVtb19pbml0X3ZrX3N3YXBjaGFpbigmZGVtbyk7CisgICAgICAgICAgICAgICAgZGVtb19wcmVwYXJlKCZkZW1vKTsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFQUF9DTURfR0FJTkVEX0ZPQ1VTOiB7CisgICAgICAgICAgICBhY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBUFBfQ01EX0xPU1RfRk9DVVM6IHsKKyAgICAgICAgICAgIGFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgYW5kcm9pZF9tYWluKHN0cnVjdCBhbmRyb2lkX2FwcCAqYXBwKSB7CisjaWZkZWYgQU5EUk9JRAorICAgIGludCB2dWxrYW5TdXBwb3J0ID0gSW5pdFZ1bGthbigpOworICAgIGlmICh2dWxrYW5TdXBwb3J0ID09IDApIHJldHVybjsKKyNlbmRpZgorCisgICAgZGVtby5wcmVwYXJlZCA9IGZhbHNlOworCisgICAgYXBwLT5vbkFwcENtZCA9IHByb2Nlc3NDb21tYW5kOworICAgIGFwcC0+b25JbnB1dEV2ZW50ID0gcHJvY2Vzc0lucHV0OworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IGV2ZW50czsKKyAgICAgICAgc3RydWN0IGFuZHJvaWRfcG9sbF9zb3VyY2UgKnNvdXJjZTsKKyAgICAgICAgd2hpbGUgKEFMb29wZXJfcG9sbEFsbChhY3RpdmUgPyAwIDogLTEsIE5VTEwsICZldmVudHMsICh2b2lkICoqKSZzb3VyY2UpID49IDApIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnByb2Nlc3MoYXBwLCBzb3VyY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXBwLT5kZXN0cm95UmVxdWVzdGVkICE9IDApIHsKKyAgICAgICAgICAgICAgICBkZW1vX2NsZWFudXAoJmRlbW8pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5pdGlhbGl6ZWQgJiYgYWN0aXZlKSB7CisgICAgICAgICAgICBkZW1vX3J1bigmZGVtbyk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RydWN0IGRlbW8gZGVtbzsKKworICAgIGRlbW9faW5pdCgmZGVtbywgYXJnYywgYXJndik7CisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICBkZW1vX2NyZWF0ZV94Y2Jfd2luZG93KCZkZW1vKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgIGRlbW9fY3JlYXRlX3hsaWJfd2luZG93KCZkZW1vKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKQorICAgIGRlbW9fY3JlYXRlX3dpbmRvdygmZGVtbyk7CisjZW5kaWYKKworICAgIGRlbW9faW5pdF92a19zd2FwY2hhaW4oJmRlbW8pOworCisgICAgZGVtb19wcmVwYXJlKCZkZW1vKTsKKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisgICAgZGVtb19ydW5feGNiKCZkZW1vKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgIGRlbW9fcnVuX3hsaWIoJmRlbW8pOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgZGVtb19ydW4oJmRlbW8pOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fRElTUExBWV9LSFIpCisgICAgZGVtb19ydW5fZGlzcGxheSgmZGVtbyk7CisjZW5kaWYKKworICAgIGRlbW9fY2xlYW51cCgmZGVtbyk7CisKKyAgICByZXR1cm4gdmFsaWRhdGlvbl9lcnJvcjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9jdWJlLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvY3ViZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhYTVhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvY3ViZS5jcHAKQEAgLTAsMCArMSwzMDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSmVyZW15IEhheWVzIDxqZXJlbXlAbHVuYXJnLmNvbT4KKyAqLworCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpIHx8IGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNpbnR0eXBlcz4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNzaWduYWw+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNkZWZpbmUgVlVMS0FOX0hQUF9OT19TTUFSVF9IQU5ETEUKKyNkZWZpbmUgVlVMS0FOX0hQUF9OT19FWENFUFRJT05TCisjZGVmaW5lIFZVTEtBTl9IUFBfVFlQRVNBRkVfQ09OVkVSU0lPTgorI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaHBwPgorI2luY2x1ZGUgPHZ1bGthbi92a19zZGtfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgImxpbm1hdGguaCIKKworI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgVkVSSUZZKHgpIGFzc2VydCh4KQorI2Vsc2UKKyNkZWZpbmUgVkVSSUZZKHgpICgodm9pZCkoeCkpCisjZW5kaWYKKworI2RlZmluZSBBUFBfU0hPUlRfTkFNRSAidmtjdWJlIgorI2lmZGVmIF9XSU4zMgorI2RlZmluZSBBUFBfTkFNRV9TVFJfTEVOIDgwCisjZW5kaWYKKworLy8gQWxsb3cgYSBtYXhpbXVtIG9mIHR3byBvdXRzdGFuZGluZyBwcmVzZW50YXRpb24gb3BlcmF0aW9ucy4KKyNkZWZpbmUgRlJBTUVfTEFHIDIKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYVswXSkpCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgRVJSX0VYSVQoZXJyX21zZywgZXJyX2NsYXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFzdXBwcmVzc19wb3B1cHMpIE1lc3NhZ2VCb3gobnVsbHB0ciwgZXJyX21zZywgZXJyX2NsYXNzLCBNQl9PSyk7IFwKKyAgICAgICAgZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRVJSX0VYSVQoZXJyX21zZywgZXJyX2NsYXNzKSBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYoIiVzXG4iLCBlcnJfbXNnKTsgICAgIFwKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7ICAgICAgICAgICAgICBcCisgICAgICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RydWN0IHRleHR1cmVfb2JqZWN0IHsKKyAgICB2azo6U2FtcGxlciBzYW1wbGVyOworCisgICAgdms6OkltYWdlIGltYWdlOworICAgIHZrOjpCdWZmZXIgYnVmZmVyOworICAgIHZrOjpJbWFnZUxheW91dCBpbWFnZUxheW91dHt2azo6SW1hZ2VMYXlvdXQ6OmVVbmRlZmluZWR9OworCisgICAgdms6Ok1lbW9yeUFsbG9jYXRlSW5mbyBtZW1fYWxsb2M7CisgICAgdms6OkRldmljZU1lbW9yeSBtZW07CisgICAgdms6OkltYWdlVmlldyB2aWV3OworCisgICAgaW50MzJfdCB0ZXhfd2lkdGh7MH07CisgICAgaW50MzJfdCB0ZXhfaGVpZ2h0ezB9OworfTsKKworc3RhdGljIGNoYXIgY29uc3QgKmNvbnN0IHRleF9maWxlc1tdID0geyJsdW5hcmcucHBtIn07CisKK3N0YXRpYyBpbnQgdmFsaWRhdGlvbl9lcnJvciA9IDA7CisKK3N0cnVjdCB2a2N1YmVfdnNfdW5pZm9ybSB7CisgICAgLy8gTXVzdCBzdGFydCB3aXRoIE1WUAorICAgIGZsb2F0IG12cFs0XVs0XTsKKyAgICBmbG9hdCBwb3NpdGlvblsxMiAqIDNdWzRdOworICAgIGZsb2F0IGNvbG9yWzEyICogM11bNF07Cit9OworCitzdHJ1Y3Qgdmt0ZXhjdWJlX3ZzX3VuaWZvcm0geworICAgIC8vIE11c3Qgc3RhcnQgd2l0aCBNVlAKKyAgICBmbG9hdCBtdnBbNF1bNF07CisgICAgZmxvYXQgcG9zaXRpb25bMTIgKiAzXVs0XTsKKyAgICBmbG9hdCBhdHRyWzEyICogM11bNF07Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXNoIGFuZCBWZXJ0ZXhGb3JtYXQgRGF0YQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2xhbmctZm9ybWF0IG9mZgorc3RhdGljIGNvbnN0IGZsb2F0IGdfdmVydGV4X2J1ZmZlcl9kYXRhW10gPSB7CisgICAgLTEuMGYsLTEuMGYsLTEuMGYsICAvLyAtWCBzaWRlCisgICAgLTEuMGYsLTEuMGYsIDEuMGYsCisgICAgLTEuMGYsIDEuMGYsIDEuMGYsCisgICAgLTEuMGYsIDEuMGYsIDEuMGYsCisgICAgLTEuMGYsIDEuMGYsLTEuMGYsCisgICAgLTEuMGYsLTEuMGYsLTEuMGYsCisKKyAgICAtMS4wZiwtMS4wZiwtMS4wZiwgIC8vIC1aIHNpZGUKKyAgICAgMS4wZiwgMS4wZiwtMS4wZiwKKyAgICAgMS4wZiwtMS4wZiwtMS4wZiwKKyAgICAtMS4wZiwtMS4wZiwtMS4wZiwKKyAgICAtMS4wZiwgMS4wZiwtMS4wZiwKKyAgICAgMS4wZiwgMS4wZiwtMS4wZiwKKworICAgIC0xLjBmLC0xLjBmLC0xLjBmLCAgLy8gLVkgc2lkZQorICAgICAxLjBmLC0xLjBmLC0xLjBmLAorICAgICAxLjBmLC0xLjBmLCAxLjBmLAorICAgIC0xLjBmLC0xLjBmLC0xLjBmLAorICAgICAxLjBmLC0xLjBmLCAxLjBmLAorICAgIC0xLjBmLC0xLjBmLCAxLjBmLAorCisgICAgLTEuMGYsIDEuMGYsLTEuMGYsICAvLyArWSBzaWRlCisgICAgLTEuMGYsIDEuMGYsIDEuMGYsCisgICAgIDEuMGYsIDEuMGYsIDEuMGYsCisgICAgLTEuMGYsIDEuMGYsLTEuMGYsCisgICAgIDEuMGYsIDEuMGYsIDEuMGYsCisgICAgIDEuMGYsIDEuMGYsLTEuMGYsCisKKyAgICAgMS4wZiwgMS4wZiwtMS4wZiwgIC8vICtYIHNpZGUKKyAgICAgMS4wZiwgMS4wZiwgMS4wZiwKKyAgICAgMS4wZiwtMS4wZiwgMS4wZiwKKyAgICAgMS4wZiwtMS4wZiwgMS4wZiwKKyAgICAgMS4wZiwtMS4wZiwtMS4wZiwKKyAgICAgMS4wZiwgMS4wZiwtMS4wZiwKKworICAgIC0xLjBmLCAxLjBmLCAxLjBmLCAgLy8gK1ogc2lkZQorICAgIC0xLjBmLC0xLjBmLCAxLjBmLAorICAgICAxLjBmLCAxLjBmLCAxLjBmLAorICAgIC0xLjBmLC0xLjBmLCAxLjBmLAorICAgICAxLjBmLC0xLjBmLCAxLjBmLAorICAgICAxLjBmLCAxLjBmLCAxLjBmLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGdfdXZfYnVmZmVyX2RhdGFbXSA9IHsKKyAgICAwLjBmLCAxLjBmLCAgLy8gLVggc2lkZQorICAgIDEuMGYsIDEuMGYsCisgICAgMS4wZiwgMC4wZiwKKyAgICAxLjBmLCAwLjBmLAorICAgIDAuMGYsIDAuMGYsCisgICAgMC4wZiwgMS4wZiwKKworICAgIDEuMGYsIDEuMGYsICAvLyAtWiBzaWRlCisgICAgMC4wZiwgMC4wZiwKKyAgICAwLjBmLCAxLjBmLAorICAgIDEuMGYsIDEuMGYsCisgICAgMS4wZiwgMC4wZiwKKyAgICAwLjBmLCAwLjBmLAorCisgICAgMS4wZiwgMC4wZiwgIC8vIC1ZIHNpZGUKKyAgICAxLjBmLCAxLjBmLAorICAgIDAuMGYsIDEuMGYsCisgICAgMS4wZiwgMC4wZiwKKyAgICAwLjBmLCAxLjBmLAorICAgIDAuMGYsIDAuMGYsCisKKyAgICAxLjBmLCAwLjBmLCAgLy8gK1kgc2lkZQorICAgIDAuMGYsIDAuMGYsCisgICAgMC4wZiwgMS4wZiwKKyAgICAxLjBmLCAwLjBmLAorICAgIDAuMGYsIDEuMGYsCisgICAgMS4wZiwgMS4wZiwKKworICAgIDEuMGYsIDAuMGYsICAvLyArWCBzaWRlCisgICAgMC4wZiwgMC4wZiwKKyAgICAwLjBmLCAxLjBmLAorICAgIDAuMGYsIDEuMGYsCisgICAgMS4wZiwgMS4wZiwKKyAgICAxLjBmLCAwLjBmLAorCisgICAgMC4wZiwgMC4wZiwgIC8vICtaIHNpZGUKKyAgICAwLjBmLCAxLjBmLAorICAgIDEuMGYsIDAuMGYsCisgICAgMC4wZiwgMS4wZiwKKyAgICAxLjBmLCAxLjBmLAorICAgIDEuMGYsIDAuMGYsCit9OworLy8gY2xhbmctZm9ybWF0IG9uCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2azo6SW1hZ2UgaW1hZ2U7CisgICAgdms6OkNvbW1hbmRCdWZmZXIgY21kOworICAgIHZrOjpDb21tYW5kQnVmZmVyIGdyYXBoaWNzX3RvX3ByZXNlbnRfY21kOworICAgIHZrOjpJbWFnZVZpZXcgdmlldzsKKyAgICB2azo6QnVmZmVyIHVuaWZvcm1fYnVmZmVyOworICAgIHZrOjpEZXZpY2VNZW1vcnkgdW5pZm9ybV9tZW1vcnk7CisgICAgdms6OkZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyOworICAgIHZrOjpEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OworfSBTd2FwY2hhaW5JbWFnZVJlc291cmNlczsKKworc3RydWN0IERlbW8geworICAgIERlbW8oKTsKKyAgICB2b2lkIGJ1aWxkX2ltYWdlX293bmVyc2hpcF9jbWQodWludDMyX3QgY29uc3QgJik7CisgICAgdms6OkJvb2wzMiBjaGVja19sYXllcnModWludDMyX3QsIGNvbnN0IGNoYXIgKmNvbnN0ICosIHVpbnQzMl90LCB2azo6TGF5ZXJQcm9wZXJ0aWVzICopOworICAgIHZvaWQgY2xlYW51cCgpOworICAgIHZvaWQgY3JlYXRlX2RldmljZSgpOworICAgIHZvaWQgZGVzdHJveV90ZXh0dXJlKHRleHR1cmVfb2JqZWN0ICopOworICAgIHZvaWQgZHJhdygpOworICAgIHZvaWQgZHJhd19idWlsZF9jbWQodms6OkNvbW1hbmRCdWZmZXIpOworICAgIHZvaWQgZmx1c2hfaW5pdF9jbWQoKTsKKyAgICB2b2lkIGluaXQoaW50LCBjaGFyICoqKTsKKyAgICB2b2lkIGluaXRfY29ubmVjdGlvbigpOworICAgIHZvaWQgaW5pdF92aygpOworICAgIHZvaWQgaW5pdF92a19zd2FwY2hhaW4oKTsKKyAgICB2b2lkIHByZXBhcmUoKTsKKyAgICB2b2lkIHByZXBhcmVfYnVmZmVycygpOworICAgIHZvaWQgcHJlcGFyZV9jdWJlX2RhdGFfYnVmZmVycygpOworICAgIHZvaWQgcHJlcGFyZV9kZXB0aCgpOworICAgIHZvaWQgcHJlcGFyZV9kZXNjcmlwdG9yX2xheW91dCgpOworICAgIHZvaWQgcHJlcGFyZV9kZXNjcmlwdG9yX3Bvb2woKTsKKyAgICB2b2lkIHByZXBhcmVfZGVzY3JpcHRvcl9zZXQoKTsKKyAgICB2b2lkIHByZXBhcmVfZnJhbWVidWZmZXJzKCk7CisgICAgdms6OlNoYWRlck1vZHVsZSBwcmVwYXJlX3NoYWRlcl9tb2R1bGUoY29uc3QgdWludDMyX3QgKiwgc2l6ZV90KTsKKyAgICB2azo6U2hhZGVyTW9kdWxlIHByZXBhcmVfdnMoKTsKKyAgICB2azo6U2hhZGVyTW9kdWxlIHByZXBhcmVfZnMoKTsKKyAgICB2b2lkIHByZXBhcmVfcGlwZWxpbmUoKTsKKyAgICB2b2lkIHByZXBhcmVfcmVuZGVyX3Bhc3MoKTsKKyAgICB2b2lkIHByZXBhcmVfdGV4dHVyZV9pbWFnZShjb25zdCBjaGFyICosIHRleHR1cmVfb2JqZWN0ICosIHZrOjpJbWFnZVRpbGluZywgdms6OkltYWdlVXNhZ2VGbGFncywgdms6Ok1lbW9yeVByb3BlcnR5RmxhZ3MpOworICAgIHZvaWQgcHJlcGFyZV90ZXh0dXJlX2J1ZmZlcihjb25zdCBjaGFyICosIHRleHR1cmVfb2JqZWN0ICopOworICAgIHZvaWQgcHJlcGFyZV90ZXh0dXJlcygpOworCisgICAgdm9pZCByZXNpemUoKTsKKyAgICB2b2lkIGNyZWF0ZV9zdXJmYWNlKCk7CisgICAgdm9pZCBzZXRfaW1hZ2VfbGF5b3V0KHZrOjpJbWFnZSwgdms6OkltYWdlQXNwZWN0RmxhZ3MsIHZrOjpJbWFnZUxheW91dCwgdms6OkltYWdlTGF5b3V0LCB2azo6QWNjZXNzRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZrOjpQaXBlbGluZVN0YWdlRmxhZ3MsIHZrOjpQaXBlbGluZVN0YWdlRmxhZ3MpOworICAgIHZvaWQgdXBkYXRlX2RhdGFfYnVmZmVyKCk7CisgICAgYm9vbCBsb2FkVGV4dHVyZShjb25zdCBjaGFyICosIHVpbnQ4X3QgKiwgdms6OlN1YnJlc291cmNlTGF5b3V0ICosIGludDMyX3QgKiwgaW50MzJfdCAqKTsKKyAgICBib29sIG1lbW9yeV90eXBlX2Zyb21fcHJvcGVydGllcyh1aW50MzJfdCwgdms6Ok1lbW9yeVByb3BlcnR5RmxhZ3MsIHVpbnQzMl90ICopOworCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKQorICAgIHZvaWQgcnVuKCk7CisgICAgdm9pZCBjcmVhdGVfd2luZG93KCk7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikKKyAgICB2b2lkIGNyZWF0ZV94bGliX3dpbmRvdygpOworICAgIHZvaWQgaGFuZGxlX3hsaWJfZXZlbnQoY29uc3QgWEV2ZW50ICopOworICAgIHZvaWQgcnVuX3hsaWIoKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisgICAgdm9pZCBoYW5kbGVfeGNiX2V2ZW50KGNvbnN0IHhjYl9nZW5lcmljX2V2ZW50X3QgKik7CisgICAgdm9pZCBydW5feGNiKCk7CisgICAgdm9pZCBjcmVhdGVfeGNiX3dpbmRvdygpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgdm9pZCBydW4oKTsKKyAgICB2b2lkIGNyZWF0ZV93aW5kb3coKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKKyAgICB2b2lkIHJ1bigpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fRElTUExBWV9LSFIpCisgICAgdms6OlJlc3VsdCBjcmVhdGVfZGlzcGxheV9zdXJmYWNlKCk7CisgICAgdm9pZCBydW5fZGlzcGxheSgpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCisgICAgSElOU1RBTkNFIGNvbm5lY3Rpb247ICAgICAgICAgLy8gaEluc3RhbmNlIC0gV2luZG93cyBJbnN0YW5jZQorICAgIEhXTkQgd2luZG93OyAgICAgICAgICAgICAgICAgIC8vIGhXbmQgLSB3aW5kb3cgaGFuZGxlCisgICAgUE9JTlQgbWluc2l6ZTsgICAgICAgICAgICAgICAgLy8gbWluaW11bSB3aW5kb3cgc2l6ZQorICAgIGNoYXIgbmFtZVtBUFBfTkFNRV9TVFJfTEVOXTsgIC8vIE5hbWUgdG8gcHV0IG9uIHRoZSB3aW5kb3cvaWNvbgorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpCisgICAgV2luZG93IHhsaWJfd2luZG93OworICAgIEF0b20geGxpYl93bV9kZWxldGVfd2luZG93OworICAgIERpc3BsYXkgKmRpc3BsYXk7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKQorICAgIHhjYl93aW5kb3dfdCB4Y2Jfd2luZG93OworICAgIHhjYl9zY3JlZW5fdCAqc2NyZWVuOworICAgIHhjYl9jb25uZWN0aW9uX3QgKmNvbm5lY3Rpb247CisgICAgeGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKmF0b21fd21fZGVsZXRlX3dpbmRvdzsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKQorICAgIHdsX2Rpc3BsYXkgKmRpc3BsYXk7CisgICAgd2xfcmVnaXN0cnkgKnJlZ2lzdHJ5OworICAgIHdsX2NvbXBvc2l0b3IgKmNvbXBvc2l0b3I7CisgICAgd2xfc3VyZmFjZSAqd2luZG93OworICAgIHdsX3NoZWxsICpzaGVsbDsKKyAgICB3bF9zaGVsbF9zdXJmYWNlICpzaGVsbF9zdXJmYWNlOworICAgIHdsX3NlYXQgKnNlYXQ7CisgICAgd2xfcG9pbnRlciAqcG9pbnRlcjsKKyAgICB3bF9rZXlib2FyZCAqa2V5Ym9hcmQ7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQpCisgICAgdm9pZCAqY2FNZXRhbExheWVyOworI2VuZGlmCisKKyAgICB2azo6U3VyZmFjZUtIUiBzdXJmYWNlOworICAgIGJvb2wgcHJlcGFyZWQ7CisgICAgYm9vbCB1c2Vfc3RhZ2luZ19idWZmZXI7CisgICAgYm9vbCB1c2VfeGxpYjsKKyAgICBib29sIHNlcGFyYXRlX3ByZXNlbnRfcXVldWU7CisKKyAgICB2azo6SW5zdGFuY2UgaW5zdDsKKyAgICB2azo6UGh5c2ljYWxEZXZpY2UgZ3B1OworICAgIHZrOjpEZXZpY2UgZGV2aWNlOworICAgIHZrOjpRdWV1ZSBncmFwaGljc19xdWV1ZTsKKyAgICB2azo6UXVldWUgcHJlc2VudF9xdWV1ZTsKKyAgICB1aW50MzJfdCBncmFwaGljc19xdWV1ZV9mYW1pbHlfaW5kZXg7CisgICAgdWludDMyX3QgcHJlc2VudF9xdWV1ZV9mYW1pbHlfaW5kZXg7CisgICAgdms6OlNlbWFwaG9yZSBpbWFnZV9hY3F1aXJlZF9zZW1hcGhvcmVzW0ZSQU1FX0xBR107CisgICAgdms6OlNlbWFwaG9yZSBkcmF3X2NvbXBsZXRlX3NlbWFwaG9yZXNbRlJBTUVfTEFHXTsKKyAgICB2azo6U2VtYXBob3JlIGltYWdlX293bmVyc2hpcF9zZW1hcGhvcmVzW0ZSQU1FX0xBR107CisgICAgdms6OlBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBncHVfcHJvcHM7CisgICAgc3RkOjp1bmlxdWVfcHRyPHZrOjpRdWV1ZUZhbWlseVByb3BlcnRpZXNbXT4gcXVldWVfcHJvcHM7CisgICAgdms6OlBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlfcHJvcGVydGllczsKKworICAgIHVpbnQzMl90IGVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50OworICAgIHVpbnQzMl90IGVuYWJsZWRfbGF5ZXJfY291bnQ7CisgICAgY2hhciBjb25zdCAqZXh0ZW5zaW9uX25hbWVzWzY0XTsKKyAgICBjaGFyIGNvbnN0ICplbmFibGVkX2xheWVyc1s2NF07CisKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdms6OkZvcm1hdCBmb3JtYXQ7CisgICAgdms6OkNvbG9yU3BhY2VLSFIgY29sb3Jfc3BhY2U7CisKKyAgICB1aW50MzJfdCBzd2FwY2hhaW5JbWFnZUNvdW50OworICAgIHZrOjpTd2FwY2hhaW5LSFIgc3dhcGNoYWluOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTd2FwY2hhaW5JbWFnZVJlc291cmNlc1tdPiBzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzOworICAgIHZrOjpQcmVzZW50TW9kZUtIUiBwcmVzZW50TW9kZTsKKyAgICB2azo6RmVuY2UgZmVuY2VzW0ZSQU1FX0xBR107CisgICAgdWludDMyX3QgZnJhbWVfaW5kZXg7CisKKyAgICB2azo6Q29tbWFuZFBvb2wgY21kX3Bvb2w7CisgICAgdms6OkNvbW1hbmRQb29sIHByZXNlbnRfY21kX3Bvb2w7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICB2azo6Rm9ybWF0IGZvcm1hdDsKKyAgICAgICAgdms6OkltYWdlIGltYWdlOworICAgICAgICB2azo6TWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYzsKKyAgICAgICAgdms6OkRldmljZU1lbW9yeSBtZW07CisgICAgICAgIHZrOjpJbWFnZVZpZXcgdmlldzsKKyAgICB9IGRlcHRoOworCisgICAgc3RhdGljIGludDMyX3QgY29uc3QgdGV4dHVyZV9jb3VudCA9IDE7CisgICAgdGV4dHVyZV9vYmplY3QgdGV4dHVyZXNbdGV4dHVyZV9jb3VudF07CisgICAgdGV4dHVyZV9vYmplY3Qgc3RhZ2luZ190ZXh0dXJlOworCisgICAgc3RydWN0IHsKKyAgICAgICAgdms6OkJ1ZmZlciBidWY7CisgICAgICAgIHZrOjpNZW1vcnlBbGxvY2F0ZUluZm8gbWVtX2FsbG9jOworICAgICAgICB2azo6RGV2aWNlTWVtb3J5IG1lbTsKKyAgICAgICAgdms6OkRlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZlcl9pbmZvOworICAgIH0gdW5pZm9ybV9kYXRhOworCisgICAgdms6OkNvbW1hbmRCdWZmZXIgY21kOyAgLy8gQnVmZmVyIGZvciBpbml0aWFsaXphdGlvbiBjb21tYW5kcworICAgIHZrOjpQaXBlbGluZUxheW91dCBwaXBlbGluZV9sYXlvdXQ7CisgICAgdms6OkRlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY19sYXlvdXQ7CisgICAgdms6OlBpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZTsKKyAgICB2azo6UmVuZGVyUGFzcyByZW5kZXJfcGFzczsKKyAgICB2azo6UGlwZWxpbmUgcGlwZWxpbmU7CisKKyAgICBtYXQ0eDQgcHJvamVjdGlvbl9tYXRyaXg7CisgICAgbWF0NHg0IHZpZXdfbWF0cml4OworICAgIG1hdDR4NCBtb2RlbF9tYXRyaXg7CisKKyAgICBmbG9hdCBzcGluX2FuZ2xlOworICAgIGZsb2F0IHNwaW5faW5jcmVtZW50OworICAgIGJvb2wgcGF1c2U7CisKKyAgICB2azo6U2hhZGVyTW9kdWxlIHZlcnRfc2hhZGVyX21vZHVsZTsKKyAgICB2azo6U2hhZGVyTW9kdWxlIGZyYWdfc2hhZGVyX21vZHVsZTsKKworICAgIHZrOjpEZXNjcmlwdG9yUG9vbCBkZXNjX3Bvb2w7CisgICAgdms6OkRlc2NyaXB0b3JTZXQgZGVzY19zZXQ7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dms6OkZyYW1lYnVmZmVyW10+IGZyYW1lYnVmZmVyczsKKworICAgIGJvb2wgcXVpdDsKKyAgICB1aW50MzJfdCBjdXJGcmFtZTsKKyAgICB1aW50MzJfdCBmcmFtZUNvdW50OworICAgIGJvb2wgdmFsaWRhdGU7CisgICAgYm9vbCB1c2VfYnJlYWs7CisgICAgYm9vbCBzdXBwcmVzc19wb3B1cHM7CisKKyAgICB1aW50MzJfdCBjdXJyZW50X2J1ZmZlcjsKKyAgICB1aW50MzJfdCBxdWV1ZV9mYW1pbHlfY291bnQ7Cit9OworCisjaWZkZWYgX1dJTjMyCisvLyBNUy1XaW5kb3dzIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uOgorTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jKEhXTkQgaFduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCitzdGF0aWMgdm9pZCBoYW5kbGVfcGluZyh2b2lkICpkYXRhLCB3bF9zaGVsbF9zdXJmYWNlICpzaGVsbF9zdXJmYWNlLCB1aW50MzJfdCBzZXJpYWwpIHsKKyAgICB3bF9zaGVsbF9zdXJmYWNlX3Bvbmcoc2hlbGxfc3VyZmFjZSwgc2VyaWFsKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2NvbmZpZ3VyZSh2b2lkICpkYXRhLCB3bF9zaGVsbF9zdXJmYWNlICpzaGVsbF9zdXJmYWNlLCB1aW50MzJfdCBlZGdlcywgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHt9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9wb3B1cF9kb25lKHZvaWQgKmRhdGEsIHdsX3NoZWxsX3N1cmZhY2UgKnNoZWxsX3N1cmZhY2UpIHt9CisKK3N0YXRpYyBjb25zdCB3bF9zaGVsbF9zdXJmYWNlX2xpc3RlbmVyIHNoZWxsX3N1cmZhY2VfbGlzdGVuZXIgPSB7aGFuZGxlX3BpbmcsIGhhbmRsZV9jb25maWd1cmUsIGhhbmRsZV9wb3B1cF9kb25lfTsKKworc3RhdGljIHZvaWQgcG9pbnRlcl9oYW5kbGVfZW50ZXIodm9pZCAqZGF0YSwgc3RydWN0IHdsX3BvaW50ZXIgKnBvaW50ZXIsIHVpbnQzMl90IHNlcmlhbCwgc3RydWN0IHdsX3N1cmZhY2UgKnN1cmZhY2UsIHdsX2ZpeGVkX3Qgc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bF9maXhlZF90IHN5KSB7fQorCitzdGF0aWMgdm9pZCBwb2ludGVyX2hhbmRsZV9sZWF2ZSh2b2lkICpkYXRhLCBzdHJ1Y3Qgd2xfcG9pbnRlciAqcG9pbnRlciwgdWludDMyX3Qgc2VyaWFsLCBzdHJ1Y3Qgd2xfc3VyZmFjZSAqc3VyZmFjZSkge30KKworc3RhdGljIHZvaWQgcG9pbnRlcl9oYW5kbGVfbW90aW9uKHZvaWQgKmRhdGEsIHN0cnVjdCB3bF9wb2ludGVyICpwb2ludGVyLCB1aW50MzJfdCB0aW1lLCB3bF9maXhlZF90IHN4LCB3bF9maXhlZF90IHN5KSB7fQorCitzdGF0aWMgdm9pZCBwb2ludGVyX2hhbmRsZV9idXR0b24odm9pZCAqZGF0YSwgc3RydWN0IHdsX3BvaW50ZXIgKndsX3BvaW50ZXIsIHVpbnQzMl90IHNlcmlhbCwgdWludDMyX3QgdGltZSwgdWludDMyX3QgYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXRlKSB7CisgICAgRGVtbyAqZGVtbyA9IChEZW1vICopZGF0YTsKKyAgICBpZiAoYnV0dG9uID09IEJUTl9MRUZUICYmIHN0YXRlID09IFdMX1BPSU5URVJfQlVUVE9OX1NUQVRFX1BSRVNTRUQpIHsKKyAgICAgICAgd2xfc2hlbGxfc3VyZmFjZV9tb3ZlKGRlbW8tPnNoZWxsX3N1cmZhY2UsIGRlbW8tPnNlYXQsIHNlcmlhbCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwb2ludGVyX2hhbmRsZV9heGlzKHZvaWQgKmRhdGEsIHN0cnVjdCB3bF9wb2ludGVyICp3bF9wb2ludGVyLCB1aW50MzJfdCB0aW1lLCB1aW50MzJfdCBheGlzLCB3bF9maXhlZF90IHZhbHVlKSB7fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdsX3BvaW50ZXJfbGlzdGVuZXIgcG9pbnRlcl9saXN0ZW5lciA9IHsKKyAgICBwb2ludGVyX2hhbmRsZV9lbnRlciwgcG9pbnRlcl9oYW5kbGVfbGVhdmUsIHBvaW50ZXJfaGFuZGxlX21vdGlvbiwgcG9pbnRlcl9oYW5kbGVfYnV0dG9uLCBwb2ludGVyX2hhbmRsZV9heGlzLAorfTsKKworc3RhdGljIHZvaWQga2V5Ym9hcmRfaGFuZGxlX2tleW1hcCh2b2lkICpkYXRhLCBzdHJ1Y3Qgd2xfa2V5Ym9hcmQgKmtleWJvYXJkLCB1aW50MzJfdCBmb3JtYXQsIGludCBmZCwgdWludDMyX3Qgc2l6ZSkge30KKworc3RhdGljIHZvaWQga2V5Ym9hcmRfaGFuZGxlX2VudGVyKHZvaWQgKmRhdGEsIHN0cnVjdCB3bF9rZXlib2FyZCAqa2V5Ym9hcmQsIHVpbnQzMl90IHNlcmlhbCwgc3RydWN0IHdsX3N1cmZhY2UgKnN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdsX2FycmF5ICprZXlzKSB7fQorCitzdGF0aWMgdm9pZCBrZXlib2FyZF9oYW5kbGVfbGVhdmUodm9pZCAqZGF0YSwgc3RydWN0IHdsX2tleWJvYXJkICprZXlib2FyZCwgdWludDMyX3Qgc2VyaWFsLCBzdHJ1Y3Qgd2xfc3VyZmFjZSAqc3VyZmFjZSkge30KKworc3RhdGljIHZvaWQga2V5Ym9hcmRfaGFuZGxlX2tleSh2b2lkICpkYXRhLCBzdHJ1Y3Qgd2xfa2V5Ym9hcmQgKmtleWJvYXJkLCB1aW50MzJfdCBzZXJpYWwsIHVpbnQzMl90IHRpbWUsIHVpbnQzMl90IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUgIT0gV0xfS0VZQk9BUkRfS0VZX1NUQVRFX1JFTEVBU0VEKSByZXR1cm47CisgICAgRGVtbyAqZGVtbyA9IChEZW1vICopZGF0YTsKKyAgICBzd2l0Y2ggKGtleSkgeworICAgICAgICBjYXNlIEtFWV9FU0M6ICAvLyBFc2NhcGUKKyAgICAgICAgICAgIGRlbW8tPnF1aXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0VZX0xFRlQ6ICAvLyBsZWZ0IGFycm93IGtleQorICAgICAgICAgICAgZGVtby0+c3Bpbl9hbmdsZSAtPSBkZW1vLT5zcGluX2luY3JlbWVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtFWV9SSUdIVDogIC8vIHJpZ2h0IGFycm93IGtleQorICAgICAgICAgICAgZGVtby0+c3Bpbl9hbmdsZSArPSBkZW1vLT5zcGluX2luY3JlbWVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtFWV9TUEFDRTogIC8vIHNwYWNlIGJhcgorICAgICAgICAgICAgZGVtby0+cGF1c2UgPSAhZGVtby0+cGF1c2U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGtleWJvYXJkX2hhbmRsZV9tb2RpZmllcnModm9pZCAqZGF0YSwgd2xfa2V5Ym9hcmQgKmtleWJvYXJkLCB1aW50MzJfdCBzZXJpYWwsIHVpbnQzMl90IG1vZHNfZGVwcmVzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb2RzX2xhdGNoZWQsIHVpbnQzMl90IG1vZHNfbG9ja2VkLCB1aW50MzJfdCBncm91cCkge30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB3bF9rZXlib2FyZF9saXN0ZW5lciBrZXlib2FyZF9saXN0ZW5lciA9IHsKKyAgICBrZXlib2FyZF9oYW5kbGVfa2V5bWFwLCBrZXlib2FyZF9oYW5kbGVfZW50ZXIsIGtleWJvYXJkX2hhbmRsZV9sZWF2ZSwga2V5Ym9hcmRfaGFuZGxlX2tleSwga2V5Ym9hcmRfaGFuZGxlX21vZGlmaWVycywKK307CisKK3N0YXRpYyB2b2lkIHNlYXRfaGFuZGxlX2NhcGFiaWxpdGllcyh2b2lkICpkYXRhLCB3bF9zZWF0ICpzZWF0LCB1aW50MzJfdCBjYXBzKSB7CisgICAgLy8gU3Vic2NyaWJlIHRvIHBvaW50ZXIgZXZlbnRzCisgICAgRGVtbyAqZGVtbyA9IChEZW1vICopZGF0YTsKKyAgICBpZiAoKGNhcHMgJiBXTF9TRUFUX0NBUEFCSUxJVFlfUE9JTlRFUikgJiYgIWRlbW8tPnBvaW50ZXIpIHsKKyAgICAgICAgZGVtby0+cG9pbnRlciA9IHdsX3NlYXRfZ2V0X3BvaW50ZXIoc2VhdCk7CisgICAgICAgIHdsX3BvaW50ZXJfYWRkX2xpc3RlbmVyKGRlbW8tPnBvaW50ZXIsICZwb2ludGVyX2xpc3RlbmVyLCBkZW1vKTsKKyAgICB9IGVsc2UgaWYgKCEoY2FwcyAmIFdMX1NFQVRfQ0FQQUJJTElUWV9QT0lOVEVSKSAmJiBkZW1vLT5wb2ludGVyKSB7CisgICAgICAgIHdsX3BvaW50ZXJfZGVzdHJveShkZW1vLT5wb2ludGVyKTsKKyAgICAgICAgZGVtby0+cG9pbnRlciA9IE5VTEw7CisgICAgfQorICAgIC8vIFN1YnNjcmliZSB0byBrZXlib2FyZCBldmVudHMKKyAgICBpZiAoY2FwcyAmIFdMX1NFQVRfQ0FQQUJJTElUWV9LRVlCT0FSRCkgeworICAgICAgICBkZW1vLT5rZXlib2FyZCA9IHdsX3NlYXRfZ2V0X2tleWJvYXJkKHNlYXQpOworICAgICAgICB3bF9rZXlib2FyZF9hZGRfbGlzdGVuZXIoZGVtby0+a2V5Ym9hcmQsICZrZXlib2FyZF9saXN0ZW5lciwgZGVtbyk7CisgICAgfSBlbHNlIGlmICghKGNhcHMgJiBXTF9TRUFUX0NBUEFCSUxJVFlfS0VZQk9BUkQpKSB7CisgICAgICAgIHdsX2tleWJvYXJkX2Rlc3Ryb3koZGVtby0+a2V5Ym9hcmQpOworICAgICAgICBkZW1vLT5rZXlib2FyZCA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgY29uc3Qgd2xfc2VhdF9saXN0ZW5lciBzZWF0X2xpc3RlbmVyID0geworICAgIHNlYXRfaGFuZGxlX2NhcGFiaWxpdGllcywKK307CisKK3N0YXRpYyB2b2lkIHJlZ2lzdHJ5X2hhbmRsZV9nbG9iYWwodm9pZCAqZGF0YSwgd2xfcmVnaXN0cnkgKnJlZ2lzdHJ5LCB1aW50MzJfdCBpZCwgY29uc3QgY2hhciAqaW50ZXJmYWNlLCB1aW50MzJfdCB2ZXJzaW9uKSB7CisgICAgRGVtbyAqZGVtbyA9IChEZW1vICopZGF0YTsKKyAgICAvLyBwaWNrdXAgd2F5bGFuZCBvYmplY3RzIHdoZW4gdGhleSBhcHBlYXIKKyAgICBpZiAoc3RyY21wKGludGVyZmFjZSwgIndsX2NvbXBvc2l0b3IiKSA9PSAwKSB7CisgICAgICAgIGRlbW8tPmNvbXBvc2l0b3IgPSAod2xfY29tcG9zaXRvciAqKXdsX3JlZ2lzdHJ5X2JpbmQocmVnaXN0cnksIGlkLCAmd2xfY29tcG9zaXRvcl9pbnRlcmZhY2UsIDEpOworICAgIH0gZWxzZSBpZiAoc3RyY21wKGludGVyZmFjZSwgIndsX3NoZWxsIikgPT0gMCkgeworICAgICAgICBkZW1vLT5zaGVsbCA9ICh3bF9zaGVsbCAqKXdsX3JlZ2lzdHJ5X2JpbmQocmVnaXN0cnksIGlkLCAmd2xfc2hlbGxfaW50ZXJmYWNlLCAxKTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChpbnRlcmZhY2UsICJ3bF9zZWF0IikgPT0gMCkgeworICAgICAgICBkZW1vLT5zZWF0ID0gKHdsX3NlYXQgKil3bF9yZWdpc3RyeV9iaW5kKHJlZ2lzdHJ5LCBpZCwgJndsX3NlYXRfaW50ZXJmYWNlLCAxKTsKKyAgICAgICAgd2xfc2VhdF9hZGRfbGlzdGVuZXIoZGVtby0+c2VhdCwgJnNlYXRfbGlzdGVuZXIsIGRlbW8pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVnaXN0cnlfaGFuZGxlX2dsb2JhbF9yZW1vdmUodm9pZCAqZGF0YSwgd2xfcmVnaXN0cnkgKnJlZ2lzdHJ5LCB1aW50MzJfdCBuYW1lKSB7fQorCitzdGF0aWMgY29uc3Qgd2xfcmVnaXN0cnlfbGlzdGVuZXIgcmVnaXN0cnlfbGlzdGVuZXIgPSB7cmVnaXN0cnlfaGFuZGxlX2dsb2JhbCwgcmVnaXN0cnlfaGFuZGxlX2dsb2JhbF9yZW1vdmV9OworI2VuZGlmCisKK0RlbW86OkRlbW8oKQorICAgIDoKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCisgICAgICBjb25uZWN0aW9ue251bGxwdHJ9LAorICAgICAgd2luZG93e251bGxwdHJ9LAorICAgICAgbWluc2l6ZShQT0lOVHswLCAwfSksICAvLyBVc2UgZXhwbGljaXQgY29uc3RydWN0aW9uIHRvIGF2b2lkIE1TVkMgZXJyb3IgQzI3OTcuCisjZW5kaWYKKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgICAgeGxpYl93aW5kb3d7MH0sCisgICAgICB4bGliX3dtX2RlbGV0ZV93aW5kb3d7MH0sCisgICAgICBkaXNwbGF5e251bGxwdHJ9LAorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICAgIHhjYl93aW5kb3d7MH0sCisgICAgICBzY3JlZW57bnVsbHB0cn0sCisgICAgICBjb25uZWN0aW9ue251bGxwdHJ9LAorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgICBkaXNwbGF5e251bGxwdHJ9LAorICAgICAgcmVnaXN0cnl7bnVsbHB0cn0sCisgICAgICBjb21wb3NpdG9ye251bGxwdHJ9LAorICAgICAgd2luZG93e251bGxwdHJ9LAorICAgICAgc2hlbGx7bnVsbHB0cn0sCisgICAgICBzaGVsbF9zdXJmYWNle251bGxwdHJ9LAorICAgICAgc2VhdHtudWxscHRyfSwKKyAgICAgIHBvaW50ZXJ7bnVsbHB0cn0sCisgICAgICBrZXlib2FyZHtudWxscHRyfSwKKyNlbmRpZgorICAgICAgcHJlcGFyZWR7ZmFsc2V9LAorICAgICAgdXNlX3N0YWdpbmdfYnVmZmVye2ZhbHNlfSwKKyAgICAgIHVzZV94bGlie2ZhbHNlfSwKKyAgICAgIGdyYXBoaWNzX3F1ZXVlX2ZhbWlseV9pbmRleHswfSwKKyAgICAgIHByZXNlbnRfcXVldWVfZmFtaWx5X2luZGV4ezB9LAorICAgICAgZW5hYmxlZF9leHRlbnNpb25fY291bnR7MH0sCisgICAgICBlbmFibGVkX2xheWVyX2NvdW50ezB9LAorICAgICAgd2lkdGh7MH0sCisgICAgICBoZWlnaHR7MH0sCisgICAgICBzd2FwY2hhaW5JbWFnZUNvdW50ezB9LAorICAgICAgcHJlc2VudE1vZGV7dms6OlByZXNlbnRNb2RlS0hSOjplRmlmb30sCisgICAgICBmcmFtZV9pbmRleHswfSwKKyAgICAgIHNwaW5fYW5nbGV7MC4wZn0sCisgICAgICBzcGluX2luY3JlbWVudHswLjBmfSwKKyAgICAgIHBhdXNle2ZhbHNlfSwKKyAgICAgIHF1aXR7ZmFsc2V9LAorICAgICAgY3VyRnJhbWV7MH0sCisgICAgICBmcmFtZUNvdW50ezB9LAorICAgICAgdmFsaWRhdGV7ZmFsc2V9LAorICAgICAgdXNlX2JyZWFre2ZhbHNlfSwKKyAgICAgIHN1cHByZXNzX3BvcHVwc3tmYWxzZX0sCisgICAgICBjdXJyZW50X2J1ZmZlcnswfSwKKyAgICAgIHF1ZXVlX2ZhbWlseV9jb3VudHswfSB7CisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKQorICAgIG1lbXNldChuYW1lLCAnXDAnLCBBUFBfTkFNRV9TVFJfTEVOKTsKKyNlbmRpZgorICAgIG1lbXNldChwcm9qZWN0aW9uX21hdHJpeCwgMCwgc2l6ZW9mKHByb2plY3Rpb25fbWF0cml4KSk7CisgICAgbWVtc2V0KHZpZXdfbWF0cml4LCAwLCBzaXplb2Yodmlld19tYXRyaXgpKTsKKyAgICBtZW1zZXQobW9kZWxfbWF0cml4LCAwLCBzaXplb2YobW9kZWxfbWF0cml4KSk7Cit9CisKK3ZvaWQgRGVtbzo6YnVpbGRfaW1hZ2Vfb3duZXJzaGlwX2NtZCh1aW50MzJfdCBjb25zdCAmaSkgeworICAgIGF1dG8gY29uc3QgY21kX2J1Zl9pbmZvID0gdms6OkNvbW1hbmRCdWZmZXJCZWdpbkluZm8oKS5zZXRGbGFncyh2azo6Q29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHM6OmVTaW11bHRhbmVvdXNVc2UpOworICAgIGF1dG8gcmVzdWx0ID0gc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5ncmFwaGljc190b19wcmVzZW50X2NtZC5iZWdpbigmY21kX2J1Zl9pbmZvKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIGF1dG8gY29uc3QgaW1hZ2Vfb3duZXJzaGlwX2JhcnJpZXIgPQorICAgICAgICB2azo6SW1hZ2VNZW1vcnlCYXJyaWVyKCkKKyAgICAgICAgICAgIC5zZXRTcmNBY2Nlc3NNYXNrKHZrOjpBY2Nlc3NGbGFncygpKQorICAgICAgICAgICAgLnNldERzdEFjY2Vzc01hc2sodms6OkFjY2Vzc0ZsYWdzKCkpCisgICAgICAgICAgICAuc2V0T2xkTGF5b3V0KHZrOjpJbWFnZUxheW91dDo6ZVByZXNlbnRTcmNLSFIpCisgICAgICAgICAgICAuc2V0TmV3TGF5b3V0KHZrOjpJbWFnZUxheW91dDo6ZVByZXNlbnRTcmNLSFIpCisgICAgICAgICAgICAuc2V0U3JjUXVldWVGYW1pbHlJbmRleChncmFwaGljc19xdWV1ZV9mYW1pbHlfaW5kZXgpCisgICAgICAgICAgICAuc2V0RHN0UXVldWVGYW1pbHlJbmRleChwcmVzZW50X3F1ZXVlX2ZhbWlseV9pbmRleCkKKyAgICAgICAgICAgIC5zZXRJbWFnZShzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmltYWdlKQorICAgICAgICAgICAgLnNldFN1YnJlc291cmNlUmFuZ2Uodms6OkltYWdlU3VicmVzb3VyY2VSYW5nZSh2azo6SW1hZ2VBc3BlY3RGbGFnQml0czo6ZUNvbG9yLCAwLCAxLCAwLCAxKSk7CisKKyAgICBzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmdyYXBoaWNzX3RvX3ByZXNlbnRfY21kLnBpcGVsaW5lQmFycmllcigKKyAgICAgICAgdms6OlBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUJvdHRvbU9mUGlwZSwgdms6OlBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUJvdHRvbU9mUGlwZSwgdms6OkRlcGVuZGVuY3lGbGFnQml0cygpLCAwLCBudWxscHRyLCAwLAorICAgICAgICBudWxscHRyLCAxLCAmaW1hZ2Vfb3duZXJzaGlwX2JhcnJpZXIpOworCisgICAgcmVzdWx0ID0gc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5ncmFwaGljc190b19wcmVzZW50X2NtZC5lbmQoKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKK30KKwordms6OkJvb2wzMiBEZW1vOjpjaGVja19sYXllcnModWludDMyX3QgY2hlY2tfY291bnQsIGNoYXIgY29uc3QgKmNvbnN0ICpjb25zdCBjaGVja19uYW1lcywgdWludDMyX3QgbGF5ZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2azo6TGF5ZXJQcm9wZXJ0aWVzICpsYXllcnMpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2hlY2tfY291bnQ7IGkrKykgeworICAgICAgICB2azo6Qm9vbDMyIGZvdW5kID0gVktfRkFMU0U7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBsYXllcl9jb3VudDsgaisrKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChjaGVja19uYW1lc1tpXSwgbGF5ZXJzW2pdLmxheWVyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFZLX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBsYXllcjogJXNcbiIsIGNoZWNrX25hbWVzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWS19UUlVFOworfQorCit2b2lkIERlbW86OmNsZWFudXAoKSB7CisgICAgcHJlcGFyZWQgPSBmYWxzZTsKKyAgICBkZXZpY2Uud2FpdElkbGUoKTsKKworICAgIC8vIFdhaXQgZm9yIGZlbmNlcyBmcm9tIHByZXNlbnQgb3BlcmF0aW9ucworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBGUkFNRV9MQUc7IGkrKykgeworICAgICAgICBkZXZpY2Uud2FpdEZvckZlbmNlcygxLCAmZmVuY2VzW2ldLCBWS19UUlVFLCBVSU5UNjRfTUFYKTsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lGZW5jZShmZW5jZXNbaV0sIG51bGxwdHIpOworICAgICAgICBkZXZpY2UuZGVzdHJveVNlbWFwaG9yZShpbWFnZV9hY3F1aXJlZF9zZW1hcGhvcmVzW2ldLCBudWxscHRyKTsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lTZW1hcGhvcmUoZHJhd19jb21wbGV0ZV9zZW1hcGhvcmVzW2ldLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHNlcGFyYXRlX3ByZXNlbnRfcXVldWUpIHsKKyAgICAgICAgICAgIGRldmljZS5kZXN0cm95U2VtYXBob3JlKGltYWdlX293bmVyc2hpcF9zZW1hcGhvcmVzW2ldLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lGcmFtZWJ1ZmZlcihzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgZGV2aWNlLmRlc3Ryb3lEZXNjcmlwdG9yUG9vbChkZXNjX3Bvb2wsIG51bGxwdHIpOworCisgICAgZGV2aWNlLmRlc3Ryb3lQaXBlbGluZShwaXBlbGluZSwgbnVsbHB0cik7CisgICAgZGV2aWNlLmRlc3Ryb3lQaXBlbGluZUNhY2hlKHBpcGVsaW5lQ2FjaGUsIG51bGxwdHIpOworICAgIGRldmljZS5kZXN0cm95UmVuZGVyUGFzcyhyZW5kZXJfcGFzcywgbnVsbHB0cik7CisgICAgZGV2aWNlLmRlc3Ryb3lQaXBlbGluZUxheW91dChwaXBlbGluZV9sYXlvdXQsIG51bGxwdHIpOworICAgIGRldmljZS5kZXN0cm95RGVzY3JpcHRvclNldExheW91dChkZXNjX2xheW91dCwgbnVsbHB0cik7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdGV4dHVyZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGRldmljZS5kZXN0cm95SW1hZ2VWaWV3KHRleHR1cmVzW2ldLnZpZXcsIG51bGxwdHIpOworICAgICAgICBkZXZpY2UuZGVzdHJveUltYWdlKHRleHR1cmVzW2ldLmltYWdlLCBudWxscHRyKTsKKyAgICAgICAgZGV2aWNlLmZyZWVNZW1vcnkodGV4dHVyZXNbaV0ubWVtLCBudWxscHRyKTsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lTYW1wbGVyKHRleHR1cmVzW2ldLnNhbXBsZXIsIG51bGxwdHIpOworICAgIH0KKyAgICBkZXZpY2UuZGVzdHJveVN3YXBjaGFpbktIUihzd2FwY2hhaW4sIG51bGxwdHIpOworCisgICAgZGV2aWNlLmRlc3Ryb3lJbWFnZVZpZXcoZGVwdGgudmlldywgbnVsbHB0cik7CisgICAgZGV2aWNlLmRlc3Ryb3lJbWFnZShkZXB0aC5pbWFnZSwgbnVsbHB0cik7CisgICAgZGV2aWNlLmZyZWVNZW1vcnkoZGVwdGgubWVtLCBudWxscHRyKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lJbWFnZVZpZXcoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS52aWV3LCBudWxscHRyKTsKKyAgICAgICAgZGV2aWNlLmZyZWVDb21tYW5kQnVmZmVycyhjbWRfcG9vbCwgMSwgJnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uY21kKTsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lCdWZmZXIoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX2J1ZmZlciwgbnVsbHB0cik7CisgICAgICAgIGRldmljZS5mcmVlTWVtb3J5KHN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udW5pZm9ybV9tZW1vcnksIG51bGxwdHIpOworICAgIH0KKworICAgIGRldmljZS5kZXN0cm95Q29tbWFuZFBvb2woY21kX3Bvb2wsIG51bGxwdHIpOworCisgICAgaWYgKHNlcGFyYXRlX3ByZXNlbnRfcXVldWUpIHsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lDb21tYW5kUG9vbChwcmVzZW50X2NtZF9wb29sLCBudWxscHRyKTsKKyAgICB9CisgICAgZGV2aWNlLndhaXRJZGxlKCk7CisgICAgZGV2aWNlLmRlc3Ryb3kobnVsbHB0cik7CisgICAgaW5zdC5kZXN0cm95U3VyZmFjZUtIUihzdXJmYWNlLCBudWxscHRyKTsKKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHhsaWJfd2luZG93KTsKKyAgICBYQ2xvc2VEaXNwbGF5KGRpc3BsYXkpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICB4Y2JfZGVzdHJveV93aW5kb3coY29ubmVjdGlvbiwgeGNiX3dpbmRvdyk7CisgICAgeGNiX2Rpc2Nvbm5lY3QoY29ubmVjdGlvbik7CisgICAgZnJlZShhdG9tX3dtX2RlbGV0ZV93aW5kb3cpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgd2xfa2V5Ym9hcmRfZGVzdHJveShrZXlib2FyZCk7CisgICAgd2xfcG9pbnRlcl9kZXN0cm95KHBvaW50ZXIpOworICAgIHdsX3NlYXRfZGVzdHJveShzZWF0KTsKKyAgICB3bF9zaGVsbF9zdXJmYWNlX2Rlc3Ryb3koc2hlbGxfc3VyZmFjZSk7CisgICAgd2xfc3VyZmFjZV9kZXN0cm95KHdpbmRvdyk7CisgICAgd2xfc2hlbGxfZGVzdHJveShzaGVsbCk7CisgICAgd2xfY29tcG9zaXRvcl9kZXN0cm95KGNvbXBvc2l0b3IpOworICAgIHdsX3JlZ2lzdHJ5X2Rlc3Ryb3kocmVnaXN0cnkpOworICAgIHdsX2Rpc3BsYXlfZGlzY29ubmVjdChkaXNwbGF5KTsKKyNlbmRpZgorCisgICAgaW5zdC5kZXN0cm95KG51bGxwdHIpOworfQorCit2b2lkIERlbW86OmNyZWF0ZV9kZXZpY2UoKSB7CisgICAgZmxvYXQgY29uc3QgcHJpb3JpdGllc1sxXSA9IHswLjB9OworCisgICAgdms6OkRldmljZVF1ZXVlQ3JlYXRlSW5mbyBxdWV1ZXNbMl07CisgICAgcXVldWVzWzBdLnNldFF1ZXVlRmFtaWx5SW5kZXgoZ3JhcGhpY3NfcXVldWVfZmFtaWx5X2luZGV4KTsKKyAgICBxdWV1ZXNbMF0uc2V0UXVldWVDb3VudCgxKTsKKyAgICBxdWV1ZXNbMF0uc2V0UFF1ZXVlUHJpb3JpdGllcyhwcmlvcml0aWVzKTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IHZrOjpEZXZpY2VDcmVhdGVJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFF1ZXVlQ3JlYXRlSW5mb0NvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQUXVldWVDcmVhdGVJbmZvcyhxdWV1ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmFibGVkTGF5ZXJDb3VudCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHBFbmFibGVkTGF5ZXJOYW1lcyhudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RW5hYmxlZEV4dGVuc2lvbkNvdW50KGVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMoKGNvbnN0IGNoYXIgKmNvbnN0ICopZXh0ZW5zaW9uX25hbWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UEVuYWJsZWRGZWF0dXJlcyhudWxscHRyKTsKKworICAgIGlmIChzZXBhcmF0ZV9wcmVzZW50X3F1ZXVlKSB7CisgICAgICAgIHF1ZXVlc1sxXS5zZXRRdWV1ZUZhbWlseUluZGV4KHByZXNlbnRfcXVldWVfZmFtaWx5X2luZGV4KTsKKyAgICAgICAgcXVldWVzWzFdLnNldFF1ZXVlQ291bnQoMSk7CisgICAgICAgIHF1ZXVlc1sxXS5zZXRQUXVldWVQcmlvcml0aWVzKHByaW9yaXRpZXMpOworICAgICAgICBkZXZpY2VJbmZvLnNldFF1ZXVlQ3JlYXRlSW5mb0NvdW50KDIpOworICAgIH0KKworICAgIGF1dG8gcmVzdWx0ID0gZ3B1LmNyZWF0ZURldmljZSgmZGV2aWNlSW5mbywgbnVsbHB0ciwgJmRldmljZSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7Cit9CisKK3ZvaWQgRGVtbzo6ZGVzdHJveV90ZXh0dXJlKHRleHR1cmVfb2JqZWN0ICp0ZXhfb2JqcykgeworICAgIC8vIGNsZWFuIHVwIHN0YWdpbmcgcmVzb3VyY2VzCisgICAgZGV2aWNlLmZyZWVNZW1vcnkodGV4X29ianMtPm1lbSwgbnVsbHB0cik7CisgICAgaWYgKHRleF9vYmpzLT5pbWFnZSkgZGV2aWNlLmRlc3Ryb3lJbWFnZSh0ZXhfb2Jqcy0+aW1hZ2UsIG51bGxwdHIpOworICAgIGlmICh0ZXhfb2Jqcy0+YnVmZmVyKSBkZXZpY2UuZGVzdHJveUJ1ZmZlcih0ZXhfb2Jqcy0+YnVmZmVyLCBudWxscHRyKTsKK30KKwordm9pZCBEZW1vOjpkcmF3KCkgeworICAgIC8vIEVuc3VyZSBubyBtb3JlIHRoYW4gRlJBTUVfTEFHIHJlbmRlcmluZ3MgYXJlIG91dHN0YW5kaW5nCisgICAgZGV2aWNlLndhaXRGb3JGZW5jZXMoMSwgJmZlbmNlc1tmcmFtZV9pbmRleF0sIFZLX1RSVUUsIFVJTlQ2NF9NQVgpOworICAgIGRldmljZS5yZXNldEZlbmNlcygxLCAmZmVuY2VzW2ZyYW1lX2luZGV4XSk7CisKKyAgICB2azo6UmVzdWx0IHJlc3VsdDsKKyAgICBkbyB7CisgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICBkZXZpY2UuYWNxdWlyZU5leHRJbWFnZUtIUihzd2FwY2hhaW4sIFVJTlQ2NF9NQVgsIGltYWdlX2FjcXVpcmVkX3NlbWFwaG9yZXNbZnJhbWVfaW5kZXhdLCB2azo6RmVuY2UoKSwgJmN1cnJlbnRfYnVmZmVyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplRXJyb3JPdXRPZkRhdGVLSFIpIHsKKyAgICAgICAgICAgIC8vIGRlbW8tPnN3YXBjaGFpbiBpcyBvdXQgb2YgZGF0ZSAoZS5nLiB0aGUgd2luZG93IHdhcyByZXNpemVkKSBhbmQKKyAgICAgICAgICAgIC8vIG11c3QgYmUgcmVjcmVhdGVkOgorICAgICAgICAgICAgcmVzaXplKCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWJvcHRpbWFsS0hSKSB7CisgICAgICAgICAgICAvLyBzd2FwY2hhaW4gaXMgbm90IGFzIG9wdGltYWwgYXMgaXQgY291bGQgYmUsIGJ1dCB0aGUgcGxhdGZvcm0ncworICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uIGVuZ2luZSB3aWxsIHN0aWxsIHByZXNlbnQgdGhlIGltYWdlIGNvcnJlY3RseS4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplRXJyb3JTdXJmYWNlTG9zdEtIUikgeworICAgICAgICAgICAgaW5zdC5kZXN0cm95U3VyZmFjZUtIUihzdXJmYWNlLCBudWxscHRyKTsKKyAgICAgICAgICAgIGNyZWF0ZV9zdXJmYWNlKCk7CisgICAgICAgICAgICByZXNpemUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmVzdWx0ICE9IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIHVwZGF0ZV9kYXRhX2J1ZmZlcigpOworCisgICAgLy8gV2FpdCBmb3IgdGhlIGltYWdlIGFjcXVpcmVkIHNlbWFwaG9yZSB0byBiZSBzaWduYWxlZCB0byBlbnN1cmUKKyAgICAvLyB0aGF0IHRoZSBpbWFnZSB3b24ndCBiZSByZW5kZXJlZCB0byB1bnRpbCB0aGUgcHJlc2VudGF0aW9uCisgICAgLy8gZW5naW5lIGhhcyBmdWxseSByZWxlYXNlZCBvd25lcnNoaXAgdG8gdGhlIGFwcGxpY2F0aW9uLCBhbmQgaXQgaXMKKyAgICAvLyBva2F5IHRvIHJlbmRlciB0byB0aGUgaW1hZ2UuCisgICAgdms6OlBpcGVsaW5lU3RhZ2VGbGFncyBjb25zdCBwaXBlX3N0YWdlX2ZsYWdzID0gdms6OlBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudE91dHB1dDsKKyAgICBhdXRvIGNvbnN0IHN1Ym1pdF9pbmZvID0gdms6OlN1Ym1pdEluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBXYWl0RHN0U3RhZ2VNYXNrKCZwaXBlX3N0YWdlX2ZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdhaXRTZW1hcGhvcmVDb3VudCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBXYWl0U2VtYXBob3JlcygmaW1hZ2VfYWNxdWlyZWRfc2VtYXBob3Jlc1tmcmFtZV9pbmRleF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tbWFuZEJ1ZmZlckNvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UENvbW1hbmRCdWZmZXJzKCZzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2N1cnJlbnRfYnVmZmVyXS5jbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2lnbmFsU2VtYXBob3JlQ291bnQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQU2lnbmFsU2VtYXBob3JlcygmZHJhd19jb21wbGV0ZV9zZW1hcGhvcmVzW2ZyYW1lX2luZGV4XSk7CisKKyAgICByZXN1bHQgPSBncmFwaGljc19xdWV1ZS5zdWJtaXQoMSwgJnN1Ym1pdF9pbmZvLCBmZW5jZXNbZnJhbWVfaW5kZXhdKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIGlmIChzZXBhcmF0ZV9wcmVzZW50X3F1ZXVlKSB7CisgICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBzZXBhcmF0ZSBxdWV1ZXMsIGNoYW5nZSBpbWFnZSBvd25lcnNoaXAgdG8gdGhlCisgICAgICAgIC8vIHByZXNlbnQgcXVldWUgYmVmb3JlIHByZXNlbnRpbmcsIHdhaXRpbmcgZm9yIHRoZSBkcmF3IGNvbXBsZXRlCisgICAgICAgIC8vIHNlbWFwaG9yZSBhbmQgc2lnbmFsbGluZyB0aGUgb3duZXJzaGlwIHJlbGVhc2VkIHNlbWFwaG9yZSB3aGVuCisgICAgICAgIC8vIGZpbmlzaGVkCisgICAgICAgIGF1dG8gY29uc3QgcHJlc2VudF9zdWJtaXRfaW5mbyA9IHZrOjpTdWJtaXRJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQV2FpdERzdFN0YWdlTWFzaygmcGlwZV9zdGFnZV9mbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXYWl0U2VtYXBob3JlQ291bnQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQV2FpdFNlbWFwaG9yZXMoJmRyYXdfY29tcGxldGVfc2VtYXBob3Jlc1tmcmFtZV9pbmRleF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tbWFuZEJ1ZmZlckNvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UENvbW1hbmRCdWZmZXJzKCZzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2N1cnJlbnRfYnVmZmVyXS5ncmFwaGljc190b19wcmVzZW50X2NtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTaWduYWxTZW1hcGhvcmVDb3VudCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBTaWduYWxTZW1hcGhvcmVzKCZpbWFnZV9vd25lcnNoaXBfc2VtYXBob3Jlc1tmcmFtZV9pbmRleF0pOworCisgICAgICAgIHJlc3VsdCA9IHByZXNlbnRfcXVldWUuc3VibWl0KDEsICZwcmVzZW50X3N1Ym1pdF9pbmZvLCB2azo6RmVuY2UoKSk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSB1c2luZyBzZXBhcmF0ZSBxdWV1ZXMgd2UgaGF2ZSB0byB3YWl0IGZvciBpbWFnZSBvd25lcnNoaXAsCisgICAgLy8gb3RoZXJ3aXNlIHdhaXQgZm9yIGRyYXcgY29tcGxldGUKKyAgICBhdXRvIGNvbnN0IHByZXNlbnRJbmZvID0gdms6OlByZXNlbnRJbmZvS0hSKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXYWl0U2VtYXBob3JlQ291bnQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQV2FpdFNlbWFwaG9yZXMoc2VwYXJhdGVfcHJlc2VudF9xdWV1ZSA/ICZpbWFnZV9vd25lcnNoaXBfc2VtYXBob3Jlc1tmcmFtZV9pbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZkcmF3X2NvbXBsZXRlX3NlbWFwaG9yZXNbZnJhbWVfaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN3YXBjaGFpbkNvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UFN3YXBjaGFpbnMoJnN3YXBjaGFpbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQSW1hZ2VJbmRpY2VzKCZjdXJyZW50X2J1ZmZlcik7CisKKyAgICByZXN1bHQgPSBwcmVzZW50X3F1ZXVlLnByZXNlbnRLSFIoJnByZXNlbnRJbmZvKTsKKyAgICBmcmFtZV9pbmRleCArPSAxOworICAgIGZyYW1lX2luZGV4ICU9IEZSQU1FX0xBRzsKKyAgICBpZiAocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVFcnJvck91dE9mRGF0ZUtIUikgeworICAgICAgICAvLyBzd2FwY2hhaW4gaXMgb3V0IG9mIGRhdGUgKGUuZy4gdGhlIHdpbmRvdyB3YXMgcmVzaXplZCkgYW5kCisgICAgICAgIC8vIG11c3QgYmUgcmVjcmVhdGVkOgorICAgICAgICByZXNpemUoKTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3Vib3B0aW1hbEtIUikgeworICAgICAgICAvLyBzd2FwY2hhaW4gaXMgbm90IGFzIG9wdGltYWwgYXMgaXQgY291bGQgYmUsIGJ1dCB0aGUgcGxhdGZvcm0ncworICAgICAgICAvLyBwcmVzZW50YXRpb24gZW5naW5lIHdpbGwgc3RpbGwgcHJlc2VudCB0aGUgaW1hZ2UgY29ycmVjdGx5LgorICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVFcnJvclN1cmZhY2VMb3N0S0hSKSB7CisgICAgICAgIGluc3QuZGVzdHJveVN1cmZhY2VLSFIoc3VyZmFjZSwgbnVsbHB0cik7CisgICAgICAgIGNyZWF0ZV9zdXJmYWNlKCk7CisgICAgICAgIHJlc2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgIH0KK30KKwordm9pZCBEZW1vOjpkcmF3X2J1aWxkX2NtZCh2azo6Q29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7CisgICAgYXV0byBjb25zdCBjb21tYW5kSW5mbyA9IHZrOjpDb21tYW5kQnVmZmVyQmVnaW5JbmZvKCkuc2V0RmxhZ3Modms6OkNvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzOjplU2ltdWx0YW5lb3VzVXNlKTsKKworICAgIHZrOjpDbGVhclZhbHVlIGNvbnN0IGNsZWFyVmFsdWVzWzJdID0ge3ZrOjpDbGVhckNvbG9yVmFsdWUoc3RkOjphcnJheTxmbG9hdCwgND4oe3swLjJmLCAwLjJmLCAwLjJmLCAwLjJmfX0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2azo6Q2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSgxLjBmLCAwdSl9OworCisgICAgYXV0byBjb25zdCBwYXNzSW5mbyA9IHZrOjpSZW5kZXJQYXNzQmVnaW5JbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSZW5kZXJQYXNzKHJlbmRlcl9wYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZyYW1lYnVmZmVyKHN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbY3VycmVudF9idWZmZXJdLmZyYW1lYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlbmRlckFyZWEodms6OlJlY3QyRCh2azo6T2Zmc2V0MkQoMCwgMCksIHZrOjpFeHRlbnQyRCgodWludDMyX3Qpd2lkdGgsICh1aW50MzJfdCloZWlnaHQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDbGVhclZhbHVlQ291bnQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQQ2xlYXJWYWx1ZXMoY2xlYXJWYWx1ZXMpOworCisgICAgYXV0byByZXN1bHQgPSBjb21tYW5kQnVmZmVyLmJlZ2luKCZjb21tYW5kSW5mbyk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBjb21tYW5kQnVmZmVyLmJlZ2luUmVuZGVyUGFzcygmcGFzc0luZm8sIHZrOjpTdWJwYXNzQ29udGVudHM6OmVJbmxpbmUpOworICAgIGNvbW1hbmRCdWZmZXIuYmluZFBpcGVsaW5lKHZrOjpQaXBlbGluZUJpbmRQb2ludDo6ZUdyYXBoaWNzLCBwaXBlbGluZSk7CisgICAgY29tbWFuZEJ1ZmZlci5iaW5kRGVzY3JpcHRvclNldHModms6OlBpcGVsaW5lQmluZFBvaW50OjplR3JhcGhpY3MsIHBpcGVsaW5lX2xheW91dCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tjdXJyZW50X2J1ZmZlcl0uZGVzY3JpcHRvcl9zZXQsIDAsIG51bGxwdHIpOworICAgIGZsb2F0IHZpZXdwb3J0X2RpbWVuc2lvbjsKKyAgICBmbG9hdCB2aWV3cG9ydF94ID0gMC4wZjsKKyAgICBmbG9hdCB2aWV3cG9ydF95ID0gMC4wZjsKKyAgICBpZiAod2lkdGggPCBoZWlnaHQpIHsKKyAgICAgICAgdmlld3BvcnRfZGltZW5zaW9uID0gKGZsb2F0KXdpZHRoOworICAgICAgICB2aWV3cG9ydF95ID0gKGhlaWdodCAtIHdpZHRoKSAvIDIuMGY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmlld3BvcnRfZGltZW5zaW9uID0gKGZsb2F0KWhlaWdodDsKKyAgICAgICAgdmlld3BvcnRfeCA9ICh3aWR0aCAtIGhlaWdodCkgLyAyLjBmOworICAgIH0KKyAgICBhdXRvIGNvbnN0IHZpZXdwb3J0ID0gdms6OlZpZXdwb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRYKHZpZXdwb3J0X3gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0WSh2aWV3cG9ydF95KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKChmbG9hdCl2aWV3cG9ydF9kaW1lbnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SGVpZ2h0KChmbG9hdCl2aWV3cG9ydF9kaW1lbnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWluRGVwdGgoKGZsb2F0KTAuMGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWF4RGVwdGgoKGZsb2F0KTEuMGYpOworICAgIGNvbW1hbmRCdWZmZXIuc2V0Vmlld3BvcnQoMCwgMSwgJnZpZXdwb3J0KTsKKworICAgIHZrOjpSZWN0MkQgY29uc3Qgc2Npc3Nvcih2azo6T2Zmc2V0MkQoMCwgMCksIHZrOjpFeHRlbnQyRCh3aWR0aCwgaGVpZ2h0KSk7CisgICAgY29tbWFuZEJ1ZmZlci5zZXRTY2lzc29yKDAsIDEsICZzY2lzc29yKTsKKyAgICBjb21tYW5kQnVmZmVyLmRyYXcoMTIgKiAzLCAxLCAwLCAwKTsKKyAgICAvLyBOb3RlIHRoYXQgZW5kaW5nIHRoZSByZW5kZXJwYXNzIGNoYW5nZXMgdGhlIGltYWdlJ3MgbGF5b3V0IGZyb20KKyAgICAvLyBDT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgdG8gUFJFU0VOVF9TUkNfS0hSCisgICAgY29tbWFuZEJ1ZmZlci5lbmRSZW5kZXJQYXNzKCk7CisKKyAgICBpZiAoc2VwYXJhdGVfcHJlc2VudF9xdWV1ZSkgeworICAgICAgICAvLyBXZSBoYXZlIHRvIHRyYW5zZmVyIG93bmVyc2hpcCBmcm9tIHRoZSBncmFwaGljcyBxdWV1ZSBmYW1pbHkgdG8KKyAgICAgICAgLy8gdGhlCisgICAgICAgIC8vIHByZXNlbnQgcXVldWUgZmFtaWx5IHRvIGJlIGFibGUgdG8gcHJlc2VudC4gIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBoYXZlCisgICAgICAgIC8vIHRvIHRyYW5zZmVyIGZyb20gcHJlc2VudCBxdWV1ZSBmYW1pbHkgYmFjayB0byBncmFwaGljcyBxdWV1ZQorICAgICAgICAvLyBmYW1pbHkgYXQKKyAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGZyYW1lIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUKKyAgICAgICAgLy8gaW1hZ2UncworICAgICAgICAvLyBjb250ZW50cyBhdCB0aGF0IHBvaW50LgorICAgICAgICBhdXRvIGNvbnN0IGltYWdlX293bmVyc2hpcF9iYXJyaWVyID0KKyAgICAgICAgICAgIHZrOjpJbWFnZU1lbW9yeUJhcnJpZXIoKQorICAgICAgICAgICAgICAgIC5zZXRTcmNBY2Nlc3NNYXNrKHZrOjpBY2Nlc3NGbGFncygpKQorICAgICAgICAgICAgICAgIC5zZXREc3RBY2Nlc3NNYXNrKHZrOjpBY2Nlc3NGbGFncygpKQorICAgICAgICAgICAgICAgIC5zZXRPbGRMYXlvdXQodms6OkltYWdlTGF5b3V0OjplUHJlc2VudFNyY0tIUikKKyAgICAgICAgICAgICAgICAuc2V0TmV3TGF5b3V0KHZrOjpJbWFnZUxheW91dDo6ZVByZXNlbnRTcmNLSFIpCisgICAgICAgICAgICAgICAgLnNldFNyY1F1ZXVlRmFtaWx5SW5kZXgoZ3JhcGhpY3NfcXVldWVfZmFtaWx5X2luZGV4KQorICAgICAgICAgICAgICAgIC5zZXREc3RRdWV1ZUZhbWlseUluZGV4KHByZXNlbnRfcXVldWVfZmFtaWx5X2luZGV4KQorICAgICAgICAgICAgICAgIC5zZXRJbWFnZShzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2N1cnJlbnRfYnVmZmVyXS5pbWFnZSkKKyAgICAgICAgICAgICAgICAuc2V0U3VicmVzb3VyY2VSYW5nZSh2azo6SW1hZ2VTdWJyZXNvdXJjZVJhbmdlKHZrOjpJbWFnZUFzcGVjdEZsYWdCaXRzOjplQ29sb3IsIDAsIDEsIDAsIDEpKTsKKworICAgICAgICBjb21tYW5kQnVmZmVyLnBpcGVsaW5lQmFycmllcih2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQm90dG9tT2ZQaXBlLCB2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQm90dG9tT2ZQaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2azo6RGVwZW5kZW5jeUZsYWdCaXRzKCksIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbWFnZV9vd25lcnNoaXBfYmFycmllcik7CisgICAgfQorCisgICAgcmVzdWx0ID0gY29tbWFuZEJ1ZmZlci5lbmQoKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKK30KKwordm9pZCBEZW1vOjpmbHVzaF9pbml0X2NtZCgpIHsKKyAgICAvLyBUT0RPOiBobW0uCisgICAgLy8gVGhpcyBmdW5jdGlvbiBjb3VsZCBnZXQgY2FsbGVkIHR3aWNlIGlmIHRoZSB0ZXh0dXJlIHVzZXMgYSBzdGFnaW5nCisgICAgLy8gYnVmZmVyCisgICAgLy8gSW4gdGhhdCBjYXNlIHRoZSBzZWNvbmQgY2FsbCBzaG91bGQgYmUgaWdub3JlZAorICAgIGlmICghY21kKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIHJlc3VsdCA9IGNtZC5lbmQoKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIGF1dG8gY29uc3QgZmVuY2VJbmZvID0gdms6OkZlbmNlQ3JlYXRlSW5mbygpOworICAgIHZrOjpGZW5jZSBmZW5jZTsKKyAgICByZXN1bHQgPSBkZXZpY2UuY3JlYXRlRmVuY2UoJmZlbmNlSW5mbywgbnVsbHB0ciwgJmZlbmNlKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIHZrOjpDb21tYW5kQnVmZmVyIGNvbnN0IGNvbW1hbmRCdWZmZXJzW10gPSB7Y21kfTsKKyAgICBhdXRvIGNvbnN0IHN1Ym1pdEluZm8gPSB2azo6U3VibWl0SW5mbygpLnNldENvbW1hbmRCdWZmZXJDb3VudCgxKS5zZXRQQ29tbWFuZEJ1ZmZlcnMoY29tbWFuZEJ1ZmZlcnMpOworCisgICAgcmVzdWx0ID0gZ3JhcGhpY3NfcXVldWUuc3VibWl0KDEsICZzdWJtaXRJbmZvLCBmZW5jZSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICByZXN1bHQgPSBkZXZpY2Uud2FpdEZvckZlbmNlcygxLCAmZmVuY2UsIFZLX1RSVUUsIFVJTlQ2NF9NQVgpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgZGV2aWNlLmZyZWVDb21tYW5kQnVmZmVycyhjbWRfcG9vbCwgMSwgY29tbWFuZEJ1ZmZlcnMpOworICAgIGRldmljZS5kZXN0cm95RmVuY2UoZmVuY2UsIG51bGxwdHIpOworCisgICAgY21kID0gdms6OkNvbW1hbmRCdWZmZXIoKTsKK30KKwordm9pZCBEZW1vOjppbml0KGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHZlYzMgZXllID0gezAuMGYsIDMuMGYsIDUuMGZ9OworICAgIHZlYzMgb3JpZ2luID0gezAsIDAsIDB9OworICAgIHZlYzMgdXAgPSB7MC4wZiwgMS4wZiwgMC4wfTsKKworICAgIHByZXNlbnRNb2RlID0gdms6OlByZXNlbnRNb2RlS0hSOjplRmlmbzsKKyAgICBmcmFtZUNvdW50ID0gVUlOVDMyX01BWDsKKyAgICB1c2VfeGxpYiA9IGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS11c2Vfc3RhZ2luZyIpID09IDApIHsKKyAgICAgICAgICAgIHVzZV9zdGFnaW5nX2J1ZmZlciA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0cmNtcChhcmd2W2ldLCAiLS1wcmVzZW50X21vZGUiKSA9PSAwKSAmJiAoaSA8IGFyZ2MgLSAxKSkgeworICAgICAgICAgICAgcHJlc2VudE1vZGUgPSAodms6OlByZXNlbnRNb2RlS0hSKWF0b2koYXJndltpICsgMV0pOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS1icmVhayIpID09IDApIHsKKyAgICAgICAgICAgIHVzZV9icmVhayA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLXZhbGlkYXRlIikgPT0gMCkgeworICAgICAgICAgICAgdmFsaWRhdGUgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS14bGliIikgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICItLXhsaWIgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmciKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi0tYyIpID09IDAgJiYgZnJhbWVDb3VudCA9PSBVSU5UMzJfTUFYICYmIGkgPCBhcmdjIC0gMSAmJgorICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbaSArIDFdLCAiJSIgU0NOdTMyLCAmZnJhbWVDb3VudCkgPT0gMSkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS1zdXBwcmVzc19wb3B1cHMiKSA9PSAwKSB7CisgICAgICAgICAgICBzdXBwcmVzc19wb3B1cHMgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSB1c2FnZTsKKyAgICAgICAgdXNhZ2UgPDwgIlVzYWdlOlxuICAiIDw8IEFQUF9TSE9SVF9OQU1FIDw8ICJcdFstLXVzZV9zdGFnaW5nXSBbLS12YWxpZGF0ZV1cbiIKKyAgICAgICAgICAgICAgPDwgIlx0Wy0tYnJlYWtdIFstLWMgPGZyYW1lY291bnQ+XSBbLS1zdXBwcmVzc19wb3B1cHNdXG4iCisgICAgICAgICAgICAgIDw8ICJcdFstLXByZXNlbnRfbW9kZSA8cHJlc2VudCBtb2RlIGVudW0+XVxuIgorICAgICAgICAgICAgICA8PCAiXHQ8cHJlc2VudF9tb2RlX2VudW0+XG4iCisgICAgICAgICAgICAgIDw8ICJcdFx0VktfUFJFU0VOVF9NT0RFX0lNTUVESUFURV9LSFIgPSAiIDw8IFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSIDw8ICJcbiIKKyAgICAgICAgICAgICAgPDwgIlx0XHRWS19QUkVTRU5UX01PREVfTUFJTEJPWF9LSFIgPSAiIDw8IFZLX1BSRVNFTlRfTU9ERV9NQUlMQk9YX0tIUiA8PCAiXG4iCisgICAgICAgICAgICAgIDw8ICJcdFx0VktfUFJFU0VOVF9NT0RFX0ZJRk9fS0hSID0gIiA8PCBWS19QUkVTRU5UX01PREVfRklGT19LSFIgPDwgIlxuIgorICAgICAgICAgICAgICA8PCAiXHRcdFZLX1BSRVNFTlRfTU9ERV9GSUZPX1JFTEFYRURfS0hSID0gIiA8PCBWS19QUkVTRU5UX01PREVfRklGT19SRUxBWEVEX0tIUjsKKworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgICAgICBpZiAoIXN1cHByZXNzX3BvcHVwcykgTWVzc2FnZUJveChOVUxMLCB1c2FnZS5zdHIoKS5jX3N0cigpLCAiVXNhZ2UgRXJyb3IiLCBNQl9PSyk7CisjZWxzZQorICAgICAgICBzdGQ6OmNlcnIgPDwgdXNhZ2Uuc3RyKCk7CisgICAgICAgIHN0ZDo6Y2Vyci5mbHVzaCgpOworI2VuZGlmCisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgaWYgKCF1c2VfeGxpYikgeworICAgICAgICBpbml0X2Nvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICBpbml0X3ZrKCk7CisKKyAgICB3aWR0aCA9IDUwMDsKKyAgICBoZWlnaHQgPSA1MDA7CisKKyAgICBzcGluX2FuZ2xlID0gNC4wZjsKKyAgICBzcGluX2luY3JlbWVudCA9IDAuMmY7CisgICAgcGF1c2UgPSBmYWxzZTsKKworICAgIG1hdDR4NF9wZXJzcGVjdGl2ZShwcm9qZWN0aW9uX21hdHJpeCwgKGZsb2F0KWRlZ3JlZXNUb1JhZGlhbnMoNDUuMGYpLCAxLjBmLCAwLjFmLCAxMDAuMGYpOworICAgIG1hdDR4NF9sb29rX2F0KHZpZXdfbWF0cml4LCBleWUsIG9yaWdpbiwgdXApOworICAgIG1hdDR4NF9pZGVudGl0eShtb2RlbF9tYXRyaXgpOworCisgICAgcHJvamVjdGlvbl9tYXRyaXhbMV1bMV0gKj0gLTE7ICAvLyBGbGlwIHByb2plY3Rpb24gbWF0cml4IGZyb20gR0wgdG8gVnVsa2FuIG9yaWVudGF0aW9uLgorfQorCit2b2lkIERlbW86OmluaXRfY29ubmVjdGlvbigpIHsKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKQorICAgIGNvbnN0IHhjYl9zZXR1cF90ICpzZXR1cDsKKyAgICB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QgaXRlcjsKKyAgICBpbnQgc2NyOworCisgICAgY29uc3QgY2hhciAqZGlzcGxheV9lbnZhciA9IGdldGVudigiRElTUExBWSIpOworICAgIGlmIChkaXNwbGF5X2VudmFyID09IG51bGxwdHIgfHwgZGlzcGxheV9lbnZhclswXSA9PSAnXDAnKSB7CisgICAgICAgIHByaW50ZigiRW52aXJvbm1lbnQgdmFyaWFibGUgRElTUExBWSByZXF1aXJlcyBhIHZhbGlkIHZhbHVlLlxuRXhpdGluZyAuLi5cbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBjb25uZWN0aW9uID0geGNiX2Nvbm5lY3QobnVsbHB0ciwgJnNjcik7CisgICAgaWYgKHhjYl9jb25uZWN0aW9uX2hhc19lcnJvcihjb25uZWN0aW9uKSA+IDApIHsKKyAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgIkNhbm5vdCBmaW5kIGEgY29tcGF0aWJsZSBWdWxrYW4gaW5zdGFsbGFibGUgY2xpZW50IGRyaXZlciAiCisgICAgICAgICAgICAiKElDRCkuXG5FeGl0aW5nIC4uLlxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHNldHVwID0geGNiX2dldF9zZXR1cChjb25uZWN0aW9uKTsKKyAgICBpdGVyID0geGNiX3NldHVwX3Jvb3RzX2l0ZXJhdG9yKHNldHVwKTsKKyAgICB3aGlsZSAoc2NyLS0gPiAwKSB4Y2Jfc2NyZWVuX25leHQoJml0ZXIpOworCisgICAgc2NyZWVuID0gaXRlci5kYXRhOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgZGlzcGxheSA9IHdsX2Rpc3BsYXlfY29ubmVjdChudWxscHRyKTsKKworICAgIGlmIChkaXNwbGF5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgZmluZCBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkuXG5FeGl0aW5nIC4uLlxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHJlZ2lzdHJ5ID0gd2xfZGlzcGxheV9nZXRfcmVnaXN0cnkoZGlzcGxheSk7CisgICAgd2xfcmVnaXN0cnlfYWRkX2xpc3RlbmVyKHJlZ2lzdHJ5LCAmcmVnaXN0cnlfbGlzdGVuZXIsIHRoaXMpOworICAgIHdsX2Rpc3BsYXlfZGlzcGF0Y2goZGlzcGxheSk7CisjZW5kaWYKK30KKwordm9pZCBEZW1vOjppbml0X3ZrKCkgeworICAgIHVpbnQzMl90IGluc3RhbmNlX2V4dGVuc2lvbl9jb3VudCA9IDA7CisgICAgdWludDMyX3QgaW5zdGFuY2VfbGF5ZXJfY291bnQgPSAwOworICAgIGNoYXIgY29uc3QgKmNvbnN0IGluc3RhbmNlX3ZhbGlkYXRpb25fbGF5ZXJzW10gPSB7IlZLX0xBWUVSX0tIUk9OT1NfdmFsaWRhdGlvbiJ9OworICAgIGVuYWJsZWRfZXh0ZW5zaW9uX2NvdW50ID0gMDsKKyAgICBlbmFibGVkX2xheWVyX2NvdW50ID0gMDsKKworICAgIC8vIExvb2sgZm9yIHZhbGlkYXRpb24gbGF5ZXJzCisgICAgdms6OkJvb2wzMiB2YWxpZGF0aW9uX2ZvdW5kID0gVktfRkFMU0U7CisgICAgaWYgKHZhbGlkYXRlKSB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gdms6OmVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKCZpbnN0YW5jZV9sYXllcl9jb3VudCwgc3RhdGljX2Nhc3Q8dms6OkxheWVyUHJvcGVydGllcyAqPihudWxscHRyKSk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgICAgIGlmIChpbnN0YW5jZV9sYXllcl9jb3VudCA+IDApIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx2azo6TGF5ZXJQcm9wZXJ0aWVzW10+IGluc3RhbmNlX2xheWVycyhuZXcgdms6OkxheWVyUHJvcGVydGllc1tpbnN0YW5jZV9sYXllcl9jb3VudF0pOworICAgICAgICAgICAgcmVzdWx0ID0gdms6OmVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKCZpbnN0YW5jZV9sYXllcl9jb3VudCwgaW5zdGFuY2VfbGF5ZXJzLmdldCgpKTsKKyAgICAgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgICAgICAgICB2YWxpZGF0aW9uX2ZvdW5kID0gY2hlY2tfbGF5ZXJzKEFSUkFZX1NJWkUoaW5zdGFuY2VfdmFsaWRhdGlvbl9sYXllcnMpLCBpbnN0YW5jZV92YWxpZGF0aW9uX2xheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VfbGF5ZXJfY291bnQsIGluc3RhbmNlX2xheWVycy5nZXQoKSk7CisgICAgICAgICAgICBpZiAodmFsaWRhdGlvbl9mb3VuZCkgeworICAgICAgICAgICAgICAgIGVuYWJsZWRfbGF5ZXJfY291bnQgPSBBUlJBWV9TSVpFKGluc3RhbmNlX3ZhbGlkYXRpb25fbGF5ZXJzKTsKKyAgICAgICAgICAgICAgICBlbmFibGVkX2xheWVyc1swXSA9ICJWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWxpZGF0aW9uX2ZvdW5kKSB7CisgICAgICAgICAgICBFUlJfRVhJVCgKKyAgICAgICAgICAgICAgICAidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCByZXF1aXJlZCB2YWxpZGF0aW9uIGxheWVyLlxuXG4iCisgICAgICAgICAgICAgICAgIlBsZWFzZSBsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExvb2sgZm9yIGluc3RhbmNlIGV4dGVuc2lvbnMgKi8KKyAgICB2azo6Qm9vbDMyIHN1cmZhY2VFeHRGb3VuZCA9IFZLX0ZBTFNFOworICAgIHZrOjpCb29sMzIgcGxhdGZvcm1TdXJmYWNlRXh0Rm91bmQgPSBWS19GQUxTRTsKKyAgICBtZW1zZXQoZXh0ZW5zaW9uX25hbWVzLCAwLCBzaXplb2YoZXh0ZW5zaW9uX25hbWVzKSk7CisKKyAgICBhdXRvIHJlc3VsdCA9IHZrOjplbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMobnVsbHB0ciwgJmluc3RhbmNlX2V4dGVuc2lvbl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dms6OkV4dGVuc2lvblByb3BlcnRpZXMgKj4obnVsbHB0cikpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgaWYgKGluc3RhbmNlX2V4dGVuc2lvbl9jb3VudCA+IDApIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHZrOjpFeHRlbnNpb25Qcm9wZXJ0aWVzW10+IGluc3RhbmNlX2V4dGVuc2lvbnMobmV3IHZrOjpFeHRlbnNpb25Qcm9wZXJ0aWVzW2luc3RhbmNlX2V4dGVuc2lvbl9jb3VudF0pOworICAgICAgICByZXN1bHQgPSB2azo6ZW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIsICZpbnN0YW5jZV9leHRlbnNpb25fY291bnQsIGluc3RhbmNlX2V4dGVuc2lvbnMuZ2V0KCkpOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5zdGFuY2VfZXh0ZW5zaW9uX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLCBpbnN0YW5jZV9leHRlbnNpb25zW2ldLmV4dGVuc2lvbk5hbWUpKSB7CisgICAgICAgICAgICAgICAgc3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZXNbZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgICAgIH0KKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCisgICAgICAgICAgICBpZiAoIXN0cmNtcChWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgaW5zdGFuY2VfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtU3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZXNbZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgICAgICAgICAgaWYgKCFzdHJjbXAoVktfS0hSX1hMSUJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgaW5zdGFuY2VfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtU3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZXNbZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19LSFJfWExJQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FOworICAgICAgICAgICAgfQorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgaW5zdGFuY2VfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtU3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZXNbZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19LSFJfWENCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUU7CisgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsIGluc3RhbmNlX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwbGF0Zm9ybVN1cmZhY2VFeHRGb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX25hbWVzW2VuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KytdID0gVktfS0hSX1dBWUxBTkRfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0RJU1BMQVlfS0hSKQorICAgICAgICAgICAgaWYgKCFzdHJjbXAoVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUsIGluc3RhbmNlX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwbGF0Zm9ybVN1cmZhY2VFeHRGb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX25hbWVzW2VuYWJsZWRfZXh0ZW5zaW9uX2NvdW50KytdID0gVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUU7CisgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQpCisgICAgICAgICAgICBpZiAoIXN0cmNtcChWS19FWFRfTUVUQUxfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgaW5zdGFuY2VfZXh0ZW5zaW9uc1tpXS5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtU3VyZmFjZUV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZXNbZW5hYmxlZF9leHRlbnNpb25fY291bnQrK10gPSBWS19FWFRfTUVUQUxfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgICAgIH0KKworI2VuZGlmCisgICAgICAgICAgICBhc3NlcnQoZW5hYmxlZF9leHRlbnNpb25fY291bnQgPCA2NCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN1cmZhY2VFeHRGb3VuZCkgeworICAgICAgICBFUlJfRVhJVCgidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgZmFpbGVkIHRvIGZpbmQgdGhlICIgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUKKyAgICAgICAgICAgICAgICAgIiBleHRlbnNpb24uXG5cbiIKKyAgICAgICAgICAgICAgICAgIkRvIHlvdSBoYXZlIGEgY29tcGF0aWJsZSBWdWxrYW4gaW5zdGFsbGFibGUgY2xpZW50IGRyaXZlciAoSUNEKSBpbnN0YWxsZWQ/XG4iCisgICAgICAgICAgICAgICAgICJQbGVhc2UgbG9vayBhdCB0aGUgR2V0dGluZyBTdGFydGVkIGd1aWRlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW5zdGFuY2UgRmFpbHVyZSIpOworICAgIH0KKworICAgIGlmICghcGxhdGZvcm1TdXJmYWNlRXh0Rm91bmQpIHsKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCisgICAgICAgIEVSUl9FWElUKCJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCB0aGUgIiBWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRQorICAgICAgICAgICAgICAgICAiIGV4dGVuc2lvbi5cblxuIgorICAgICAgICAgICAgICAgICAiRG8geW91IGhhdmUgYSBjb21wYXRpYmxlIFZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpIGluc3RhbGxlZD9cbiIKKyAgICAgICAgICAgICAgICAgIlBsZWFzZSBsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBGYWlsdXJlIik7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKQorICAgICAgICBFUlJfRVhJVCgidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgZmFpbGVkIHRvIGZpbmQgdGhlICIgVktfS0hSX1hDQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FCisgICAgICAgICAgICAgICAgICIgZXh0ZW5zaW9uLlxuXG4iCisgICAgICAgICAgICAgICAgICJEbyB5b3UgaGF2ZSBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkgaW5zdGFsbGVkP1xuIgorICAgICAgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUluc3RhbmNlIEZhaWx1cmUiKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKQorICAgICAgICBFUlJfRVhJVCgidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgZmFpbGVkIHRvIGZpbmQgdGhlICIgVktfS0hSX1dBWUxBTkRfU1VSRkFDRV9FWFRFTlNJT05fTkFNRQorICAgICAgICAgICAgICAgICAiIGV4dGVuc2lvbi5cblxuIgorICAgICAgICAgICAgICAgICAiRG8geW91IGhhdmUgYSBjb21wYXRpYmxlIFZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpIGluc3RhbGxlZD9cbiIKKyAgICAgICAgICAgICAgICAgIlBsZWFzZSBsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBGYWlsdXJlIik7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikKKyAgICAgICAgRVJSX0VYSVQoInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIGZhaWxlZCB0byBmaW5kIHRoZSAiIFZLX0tIUl9YTElCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUKKyAgICAgICAgICAgICAgICAgIiBleHRlbnNpb24uXG5cbiIKKyAgICAgICAgICAgICAgICAgIkRvIHlvdSBoYXZlIGEgY29tcGF0aWJsZSBWdWxrYW4gaW5zdGFsbGFibGUgY2xpZW50IGRyaXZlciAoSUNEKSBpbnN0YWxsZWQ/XG4iCisgICAgICAgICAgICAgICAgICJQbGVhc2UgbG9vayBhdCB0aGUgR2V0dGluZyBTdGFydGVkIGd1aWRlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW5zdGFuY2UgRmFpbHVyZSIpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fRElTUExBWV9LSFIpCisgICAgICAgIEVSUl9FWElUKCJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCB0aGUgIiBWS19LSFJfRElTUExBWV9FWFRFTlNJT05fTkFNRQorICAgICAgICAgICAgICAgICAiIGV4dGVuc2lvbi5cblxuIgorICAgICAgICAgICAgICAgICAiRG8geW91IGhhdmUgYSBjb21wYXRpYmxlIFZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpIGluc3RhbGxlZD9cbiIKKyAgICAgICAgICAgICAgICAgIlBsZWFzZSBsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBGYWlsdXJlIik7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQpCisgICAgICAgIEVSUl9FWElUKCJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBmYWlsZWQgdG8gZmluZCB0aGUgIiBWS19FWFRfTUVUQUxfU1VSRkFDRV9FWFRFTlNJT05fTkFNRQorICAgICAgICAgICAgICAgICAiIGV4dGVuc2lvbi5cblxuRG8geW91IGhhdmUgYSBjb21wYXRpYmxlICIKKyAgICAgICAgICAgICAgICAgIlZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpIGluc3RhbGxlZD9cblBsZWFzZSAiCisgICAgICAgICAgICAgICAgICJsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgIgorICAgICAgICAgICAgICAgICAiaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBGYWlsdXJlIik7CisjZW5kaWYKKyAgICB9CisgICAgYXV0byBjb25zdCBhcHAgPSB2azo6QXBwbGljYXRpb25JbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UEFwcGxpY2F0aW9uTmFtZShBUFBfU0hPUlRfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXBwbGljYXRpb25WZXJzaW9uKDApCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBFbmdpbmVOYW1lKEFQUF9TSE9SVF9OQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmdpbmVWZXJzaW9uKDApCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8wKTsKKyAgICBhdXRvIGNvbnN0IGluc3RfaW5mbyA9IHZrOjpJbnN0YW5jZUNyZWF0ZUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQQXBwbGljYXRpb25JbmZvKCZhcHApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVuYWJsZWRMYXllckNvdW50KGVuYWJsZWRfbGF5ZXJfY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBwRW5hYmxlZExheWVyTmFtZXMoaW5zdGFuY2VfdmFsaWRhdGlvbl9sYXllcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVuYWJsZWRFeHRlbnNpb25Db3VudChlbmFibGVkX2V4dGVuc2lvbl9jb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMoZXh0ZW5zaW9uX25hbWVzKTsKKworICAgIHJlc3VsdCA9IHZrOjpjcmVhdGVJbnN0YW5jZSgmaW5zdF9pbmZvLCBudWxscHRyLCAmaW5zdCk7CisgICAgaWYgKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplRXJyb3JJbmNvbXBhdGlibGVEcml2ZXIpIHsKKyAgICAgICAgRVJSX0VYSVQoCisgICAgICAgICAgICAiQ2Fubm90IGZpbmQgYSBjb21wYXRpYmxlIFZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpLlxuXG4iCisgICAgICAgICAgICAiUGxlYXNlIGxvb2sgYXQgdGhlIEdldHRpbmcgU3RhcnRlZCBndWlkZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBGYWlsdXJlIik7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZUVycm9yRXh0ZW5zaW9uTm90UHJlc2VudCkgeworICAgICAgICBFUlJfRVhJVCgKKyAgICAgICAgICAgICJDYW5ub3QgZmluZCBhIHNwZWNpZmllZCBleHRlbnNpb24gbGlicmFyeS5cbiIKKyAgICAgICAgICAgICJNYWtlIHN1cmUgeW91ciBsYXllcnMgcGF0aCBpcyBzZXQgYXBwcm9wcmlhdGVseS5cbiIsCisgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBGYWlsdXJlIik7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpIHsKKyAgICAgICAgRVJSX0VYSVQoCisgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBmYWlsZWQuXG5cbiIKKyAgICAgICAgICAgICJEbyB5b3UgaGF2ZSBhIGNvbXBhdGlibGUgVnVsa2FuIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgKElDRCkgaW5zdGFsbGVkP1xuIgorICAgICAgICAgICAgIlBsZWFzZSBsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgInZrQ3JlYXRlSW5zdGFuY2UgRmFpbHVyZSIpOworICAgIH0KKworICAgIC8qIE1ha2UgaW5pdGlhbCBjYWxsIHRvIHF1ZXJ5IGdwdV9jb3VudCwgdGhlbiBzZWNvbmQgY2FsbCBmb3IgZ3B1IGluZm8qLworICAgIHVpbnQzMl90IGdwdV9jb3VudDsKKyAgICByZXN1bHQgPSBpbnN0LmVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygmZ3B1X2NvdW50LCBzdGF0aWNfY2FzdDx2azo6UGh5c2ljYWxEZXZpY2UgKj4obnVsbHB0cikpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgaWYgKGdwdV9jb3VudCA+IDApIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHZrOjpQaHlzaWNhbERldmljZVtdPiBwaHlzaWNhbF9kZXZpY2VzKG5ldyB2azo6UGh5c2ljYWxEZXZpY2VbZ3B1X2NvdW50XSk7CisgICAgICAgIHJlc3VsdCA9IGluc3QuZW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCZncHVfY291bnQsIHBoeXNpY2FsX2RldmljZXMuZ2V0KCkpOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKyAgICAgICAgLyogRm9yIGN1YmUgZGVtbyB3ZSBqdXN0IGdyYWIgdGhlIGZpcnN0IHBoeXNpY2FsIGRldmljZSAqLworICAgICAgICBncHUgPSBwaHlzaWNhbF9kZXZpY2VzWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIEVSUl9FWElUKAorICAgICAgICAgICAgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzIHJlcG9ydGVkIHplcm8gYWNjZXNzaWJsZSBkZXZpY2VzLlxuXG4iCisgICAgICAgICAgICAiRG8geW91IGhhdmUgYSBjb21wYXRpYmxlIFZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpIGluc3RhbGxlZD9cbiIKKyAgICAgICAgICAgICJQbGVhc2UgbG9vayBhdCB0aGUgR2V0dGluZyBTdGFydGVkIGd1aWRlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKKyAgICAgICAgICAgICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyBGYWlsdXJlIik7CisgICAgfQorCisgICAgLyogTG9vayBmb3IgZGV2aWNlIGV4dGVuc2lvbnMgKi8KKyAgICB1aW50MzJfdCBkZXZpY2VfZXh0ZW5zaW9uX2NvdW50ID0gMDsKKyAgICB2azo6Qm9vbDMyIHN3YXBjaGFpbkV4dEZvdW5kID0gVktfRkFMU0U7CisgICAgZW5hYmxlZF9leHRlbnNpb25fY291bnQgPSAwOworICAgIG1lbXNldChleHRlbnNpb25fbmFtZXMsIDAsIHNpemVvZihleHRlbnNpb25fbmFtZXMpKTsKKworICAgIHJlc3VsdCA9CisgICAgICAgIGdwdS5lbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIsICZkZXZpY2VfZXh0ZW5zaW9uX2NvdW50LCBzdGF0aWNfY2FzdDx2azo6RXh0ZW5zaW9uUHJvcGVydGllcyAqPihudWxscHRyKSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbl9jb3VudCA+IDApIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHZrOjpFeHRlbnNpb25Qcm9wZXJ0aWVzW10+IGRldmljZV9leHRlbnNpb25zKG5ldyB2azo6RXh0ZW5zaW9uUHJvcGVydGllc1tkZXZpY2VfZXh0ZW5zaW9uX2NvdW50XSk7CisgICAgICAgIHJlc3VsdCA9IGdwdS5lbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIsICZkZXZpY2VfZXh0ZW5zaW9uX2NvdW50LCBkZXZpY2VfZXh0ZW5zaW9ucy5nZXQoKSk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXZpY2VfZXh0ZW5zaW9uX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUsIGRldmljZV9leHRlbnNpb25zW2ldLmV4dGVuc2lvbk5hbWUpKSB7CisgICAgICAgICAgICAgICAgc3dhcGNoYWluRXh0Rm91bmQgPSAxOworICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9uYW1lc1tlbmFibGVkX2V4dGVuc2lvbl9jb3VudCsrXSA9IFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZW5hYmxlZF9leHRlbnNpb25fY291bnQgPCA2NCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN3YXBjaGFpbkV4dEZvdW5kKSB7CisgICAgICAgIEVSUl9FWElUKCJ2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMgZmFpbGVkIHRvIGZpbmQgdGhlICIgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRQorICAgICAgICAgICAgICAgICAiIGV4dGVuc2lvbi5cblxuIgorICAgICAgICAgICAgICAgICAiRG8geW91IGhhdmUgYSBjb21wYXRpYmxlIFZ1bGthbiBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIChJQ0QpIGluc3RhbGxlZD9cbiIKKyAgICAgICAgICAgICAgICAgIlBsZWFzZSBsb29rIGF0IHRoZSBHZXR0aW5nIFN0YXJ0ZWQgZ3VpZGUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSBGYWlsdXJlIik7CisgICAgfQorCisgICAgZ3B1LmdldFByb3BlcnRpZXMoJmdwdV9wcm9wcyk7CisKKyAgICAvKiBDYWxsIHdpdGggbnVsbHB0ciBkYXRhIHRvIGdldCBjb3VudCAqLworICAgIGdwdS5nZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMoJnF1ZXVlX2ZhbWlseV9jb3VudCwgc3RhdGljX2Nhc3Q8dms6OlF1ZXVlRmFtaWx5UHJvcGVydGllcyAqPihudWxscHRyKSk7CisgICAgYXNzZXJ0KHF1ZXVlX2ZhbWlseV9jb3VudCA+PSAxKTsKKworICAgIHF1ZXVlX3Byb3BzLnJlc2V0KG5ldyB2azo6UXVldWVGYW1pbHlQcm9wZXJ0aWVzW3F1ZXVlX2ZhbWlseV9jb3VudF0pOworICAgIGdwdS5nZXRRdWV1ZUZhbWlseVByb3BlcnRpZXMoJnF1ZXVlX2ZhbWlseV9jb3VudCwgcXVldWVfcHJvcHMuZ2V0KCkpOworCisgICAgLy8gUXVlcnkgZmluZS1ncmFpbmVkIGZlYXR1cmUgc3VwcG9ydCBmb3IgdGhpcyBkZXZpY2UuCisgICAgLy8gIElmIGFwcCBoYXMgc3BlY2lmaWMgZmVhdHVyZSByZXF1aXJlbWVudHMgaXQgc2hvdWxkIGNoZWNrIHN1cHBvcnRlZAorICAgIC8vICBmZWF0dXJlcyBiYXNlZCBvbiB0aGlzIHF1ZXJ5CisgICAgdms6OlBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgcGh5c0RldkZlYXR1cmVzOworICAgIGdwdS5nZXRGZWF0dXJlcygmcGh5c0RldkZlYXR1cmVzKTsKK30KKwordm9pZCBEZW1vOjpjcmVhdGVfc3VyZmFjZSgpIHsKKy8vIENyZWF0ZSBhIFdTSSBzdXJmYWNlIGZvciB0aGUgd2luZG93OgorI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUikKKyAgICB7CisgICAgICAgIGF1dG8gY29uc3QgY3JlYXRlSW5mbyA9IHZrOjpXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKCkuc2V0SGluc3RhbmNlKGNvbm5lY3Rpb24pLnNldEh3bmQod2luZG93KTsKKworICAgICAgICBhdXRvIHJlc3VsdCA9IGluc3QuY3JlYXRlV2luMzJTdXJmYWNlS0hSKCZjcmVhdGVJbmZvLCBudWxscHRyLCAmc3VyZmFjZSk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSKQorICAgIHsKKyAgICAgICAgYXV0byBjb25zdCBjcmVhdGVJbmZvID0gdms6OldheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUigpLnNldERpc3BsYXkoZGlzcGxheSkuc2V0U3VyZmFjZSh3aW5kb3cpOworCisgICAgICAgIGF1dG8gcmVzdWx0ID0gaW5zdC5jcmVhdGVXYXlsYW5kU3VyZmFjZUtIUigmY3JlYXRlSW5mbywgbnVsbHB0ciwgJnN1cmZhY2UpOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikKKyAgICB7CisgICAgICAgIGF1dG8gY29uc3QgY3JlYXRlSW5mbyA9IHZrOjpYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIoKS5zZXREcHkoZGlzcGxheSkuc2V0V2luZG93KHhsaWJfd2luZG93KTsKKworICAgICAgICBhdXRvIHJlc3VsdCA9IGluc3QuY3JlYXRlWGxpYlN1cmZhY2VLSFIoJmNyZWF0ZUluZm8sIG51bGxwdHIsICZzdXJmYWNlKTsKKyAgICAgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICB7CisgICAgICAgIGF1dG8gY29uc3QgY3JlYXRlSW5mbyA9IHZrOjpYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUigpLnNldENvbm5lY3Rpb24oY29ubmVjdGlvbikuc2V0V2luZG93KHhjYl93aW5kb3cpOworCisgICAgICAgIGF1dG8gcmVzdWx0ID0gaW5zdC5jcmVhdGVYY2JTdXJmYWNlS0hSKCZjcmVhdGVJbmZvLCBudWxscHRyLCAmc3VyZmFjZSk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKKyAgICB7CisgICAgICAgIGF1dG8gY29uc3QgY3JlYXRlSW5mbyA9IHZrOjpNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKCkuc2V0UExheWVyKHN0YXRpY19jYXN0PENBTWV0YWxMYXllciAqPihjYU1ldGFsTGF5ZXIpKTsKKworICAgICAgICBhdXRvIHJlc3VsdCA9IGluc3QuY3JlYXRlTWV0YWxTdXJmYWNlRVhUKCZjcmVhdGVJbmZvLCBudWxscHRyLCAmc3VyZmFjZSk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0RJU1BMQVlfS0hSKQorICAgIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBjcmVhdGVfZGlzcGxheV9zdXJmYWNlKCk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIERlbW86OmluaXRfdmtfc3dhcGNoYWluKCkgeworICAgIGNyZWF0ZV9zdXJmYWNlKCk7CisgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggcXVldWUgdG8gbGVhcm4gd2hldGhlciBpdCBzdXBwb3J0cyBwcmVzZW50aW5nOgorICAgIHN0ZDo6dW5pcXVlX3B0cjx2azo6Qm9vbDMyW10+IHN1cHBvcnRzUHJlc2VudChuZXcgdms6OkJvb2wzMltxdWV1ZV9mYW1pbHlfY291bnRdKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVfZmFtaWx5X2NvdW50OyBpKyspIHsKKyAgICAgICAgZ3B1LmdldFN1cmZhY2VTdXBwb3J0S0hSKGksIHN1cmZhY2UsICZzdXBwb3J0c1ByZXNlbnRbaV0pOworICAgIH0KKworICAgIHVpbnQzMl90IGdyYXBoaWNzUXVldWVGYW1pbHlJbmRleCA9IFVJTlQzMl9NQVg7CisgICAgdWludDMyX3QgcHJlc2VudFF1ZXVlRmFtaWx5SW5kZXggPSBVSU5UMzJfTUFYOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBxdWV1ZV9mYW1pbHlfY291bnQ7IGkrKykgeworICAgICAgICBpZiAocXVldWVfcHJvcHNbaV0ucXVldWVGbGFncyAmIHZrOjpRdWV1ZUZsYWdCaXRzOjplR3JhcGhpY3MpIHsKKyAgICAgICAgICAgIGlmIChncmFwaGljc1F1ZXVlRmFtaWx5SW5kZXggPT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIGdyYXBoaWNzUXVldWVGYW1pbHlJbmRleCA9IGk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdXBwb3J0c1ByZXNlbnRbaV0gPT0gVktfVFJVRSkgeworICAgICAgICAgICAgICAgIGdyYXBoaWNzUXVldWVGYW1pbHlJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgcHJlc2VudFF1ZXVlRmFtaWx5SW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByZXNlbnRRdWV1ZUZhbWlseUluZGV4ID09IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgLy8gSWYgZGlkbid0IGZpbmQgYSBxdWV1ZSB0aGF0IHN1cHBvcnRzIGJvdGggZ3JhcGhpY3MgYW5kIHByZXNlbnQsCisgICAgICAgIC8vIHRoZW4KKyAgICAgICAgLy8gZmluZCBhIHNlcGFyYXRlIHByZXNlbnQgcXVldWUuCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBxdWV1ZV9mYW1pbHlfY291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHN1cHBvcnRzUHJlc2VudFtpXSA9PSBWS19UUlVFKSB7CisgICAgICAgICAgICAgICAgcHJlc2VudFF1ZXVlRmFtaWx5SW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgZXJyb3IgaWYgY291bGQgbm90IGZpbmQgYm90aCBhIGdyYXBoaWNzIGFuZCBhIHByZXNlbnQgcXVldWUKKyAgICBpZiAoZ3JhcGhpY3NRdWV1ZUZhbWlseUluZGV4ID09IFVJTlQzMl9NQVggfHwgcHJlc2VudFF1ZXVlRmFtaWx5SW5kZXggPT0gVUlOVDMyX01BWCkgeworICAgICAgICBFUlJfRVhJVCgiQ291bGQgbm90IGZpbmQgYm90aCBncmFwaGljcyBhbmQgcHJlc2VudCBxdWV1ZXNcbiIsICJTd2FwY2hhaW4gSW5pdGlhbGl6YXRpb24gRmFpbHVyZSIpOworICAgIH0KKworICAgIGdyYXBoaWNzX3F1ZXVlX2ZhbWlseV9pbmRleCA9IGdyYXBoaWNzUXVldWVGYW1pbHlJbmRleDsKKyAgICBwcmVzZW50X3F1ZXVlX2ZhbWlseV9pbmRleCA9IHByZXNlbnRRdWV1ZUZhbWlseUluZGV4OworICAgIHNlcGFyYXRlX3ByZXNlbnRfcXVldWUgPSAoZ3JhcGhpY3NfcXVldWVfZmFtaWx5X2luZGV4ICE9IHByZXNlbnRfcXVldWVfZmFtaWx5X2luZGV4KTsKKworICAgIGNyZWF0ZV9kZXZpY2UoKTsKKworICAgIGRldmljZS5nZXRRdWV1ZShncmFwaGljc19xdWV1ZV9mYW1pbHlfaW5kZXgsIDAsICZncmFwaGljc19xdWV1ZSk7CisgICAgaWYgKCFzZXBhcmF0ZV9wcmVzZW50X3F1ZXVlKSB7CisgICAgICAgIHByZXNlbnRfcXVldWUgPSBncmFwaGljc19xdWV1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2UuZ2V0UXVldWUocHJlc2VudF9xdWV1ZV9mYW1pbHlfaW5kZXgsIDAsICZwcmVzZW50X3F1ZXVlKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgVmtGb3JtYXQncyB0aGF0IGFyZSBzdXBwb3J0ZWQ6CisgICAgdWludDMyX3QgZm9ybWF0Q291bnQ7CisgICAgYXV0byByZXN1bHQgPSBncHUuZ2V0U3VyZmFjZUZvcm1hdHNLSFIoc3VyZmFjZSwgJmZvcm1hdENvdW50LCBzdGF0aWNfY2FzdDx2azo6U3VyZmFjZUZvcm1hdEtIUiAqPihudWxscHRyKSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dms6OlN1cmZhY2VGb3JtYXRLSFJbXT4gc3VyZkZvcm1hdHMobmV3IHZrOjpTdXJmYWNlRm9ybWF0S0hSW2Zvcm1hdENvdW50XSk7CisgICAgcmVzdWx0ID0gZ3B1LmdldFN1cmZhY2VGb3JtYXRzS0hSKHN1cmZhY2UsICZmb3JtYXRDb3VudCwgc3VyZkZvcm1hdHMuZ2V0KCkpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgLy8gSWYgdGhlIGZvcm1hdCBsaXN0IGluY2x1ZGVzIGp1c3Qgb25lIGVudHJ5IG9mIFZLX0ZPUk1BVF9VTkRFRklORUQsCisgICAgLy8gdGhlIHN1cmZhY2UgaGFzIG5vIHByZWZlcnJlZCBmb3JtYXQuICBPdGhlcndpc2UsIGF0IGxlYXN0IG9uZQorICAgIC8vIHN1cHBvcnRlZCBmb3JtYXQgd2lsbCBiZSByZXR1cm5lZC4KKyAgICBpZiAoZm9ybWF0Q291bnQgPT0gMSAmJiBzdXJmRm9ybWF0c1swXS5mb3JtYXQgPT0gdms6OkZvcm1hdDo6ZVVuZGVmaW5lZCkgeworICAgICAgICBmb3JtYXQgPSB2azo6Rm9ybWF0OjplQjhHOFI4QThVbm9ybTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoZm9ybWF0Q291bnQgPj0gMSk7CisgICAgICAgIGZvcm1hdCA9IHN1cmZGb3JtYXRzWzBdLmZvcm1hdDsKKyAgICB9CisgICAgY29sb3Jfc3BhY2UgPSBzdXJmRm9ybWF0c1swXS5jb2xvclNwYWNlOworCisgICAgcXVpdCA9IGZhbHNlOworICAgIGN1ckZyYW1lID0gMDsKKworICAgIC8vIENyZWF0ZSBzZW1hcGhvcmVzIHRvIHN5bmNocm9uaXplIGFjcXVpcmluZyBwcmVzZW50YWJsZSBidWZmZXJzIGJlZm9yZQorICAgIC8vIHJlbmRlcmluZyBhbmQgd2FpdGluZyBmb3IgZHJhd2luZyB0byBiZSBjb21wbGV0ZSBiZWZvcmUgcHJlc2VudGluZworICAgIGF1dG8gY29uc3Qgc2VtYXBob3JlQ3JlYXRlSW5mbyA9IHZrOjpTZW1hcGhvcmVDcmVhdGVJbmZvKCk7CisKKyAgICAvLyBDcmVhdGUgZmVuY2VzIHRoYXQgd2UgY2FuIHVzZSB0byB0aHJvdHRsZSBpZiB3ZSBnZXQgdG9vIGZhcgorICAgIC8vIGFoZWFkIG9mIHRoZSBpbWFnZSBwcmVzZW50cworICAgIGF1dG8gY29uc3QgZmVuY2VfY2kgPSB2azo6RmVuY2VDcmVhdGVJbmZvKCkuc2V0RmxhZ3Modms6OkZlbmNlQ3JlYXRlRmxhZ0JpdHM6OmVTaWduYWxlZCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEZSQU1FX0xBRzsgaSsrKSB7CisgICAgICAgIHJlc3VsdCA9IGRldmljZS5jcmVhdGVGZW5jZSgmZmVuY2VfY2ksIG51bGxwdHIsICZmZW5jZXNbaV0pOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgICAgICByZXN1bHQgPSBkZXZpY2UuY3JlYXRlU2VtYXBob3JlKCZzZW1hcGhvcmVDcmVhdGVJbmZvLCBudWxscHRyLCAmaW1hZ2VfYWNxdWlyZWRfc2VtYXBob3Jlc1tpXSk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgICAgIHJlc3VsdCA9IGRldmljZS5jcmVhdGVTZW1hcGhvcmUoJnNlbWFwaG9yZUNyZWF0ZUluZm8sIG51bGxwdHIsICZkcmF3X2NvbXBsZXRlX3NlbWFwaG9yZXNbaV0pOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgICAgICBpZiAoc2VwYXJhdGVfcHJlc2VudF9xdWV1ZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZGV2aWNlLmNyZWF0ZVNlbWFwaG9yZSgmc2VtYXBob3JlQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmltYWdlX293bmVyc2hpcF9zZW1hcGhvcmVzW2ldKTsKKyAgICAgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgICAgICB9CisgICAgfQorICAgIGZyYW1lX2luZGV4ID0gMDsKKworICAgIC8vIEdldCBNZW1vcnkgaW5mb3JtYXRpb24gYW5kIHByb3BlcnRpZXMKKyAgICBncHUuZ2V0TWVtb3J5UHJvcGVydGllcygmbWVtb3J5X3Byb3BlcnRpZXMpOworfQorCit2b2lkIERlbW86OnByZXBhcmUoKSB7CisgICAgYXV0byBjb25zdCBjbWRfcG9vbF9pbmZvID0gdms6OkNvbW1hbmRQb29sQ3JlYXRlSW5mbygpLnNldFF1ZXVlRmFtaWx5SW5kZXgoZ3JhcGhpY3NfcXVldWVfZmFtaWx5X2luZGV4KTsKKyAgICBhdXRvIHJlc3VsdCA9IGRldmljZS5jcmVhdGVDb21tYW5kUG9vbCgmY21kX3Bvb2xfaW5mbywgbnVsbHB0ciwgJmNtZF9wb29sKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIGF1dG8gY29uc3QgY21kID0gdms6OkNvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb21tYW5kUG9vbChjbWRfcG9vbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGV2ZWwodms6OkNvbW1hbmRCdWZmZXJMZXZlbDo6ZVByaW1hcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbW1hbmRCdWZmZXJDb3VudCgxKTsKKworICAgIHJlc3VsdCA9IGRldmljZS5hbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCZjbWQsICZ0aGlzLT5jbWQpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgYXV0byBjb25zdCBjbWRfYnVmX2luZm8gPSB2azo6Q29tbWFuZEJ1ZmZlckJlZ2luSW5mbygpLnNldFBJbmhlcml0YW5jZUluZm8obnVsbHB0cik7CisKKyAgICByZXN1bHQgPSB0aGlzLT5jbWQuYmVnaW4oJmNtZF9idWZfaW5mbyk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBwcmVwYXJlX2J1ZmZlcnMoKTsKKyAgICBwcmVwYXJlX2RlcHRoKCk7CisgICAgcHJlcGFyZV90ZXh0dXJlcygpOworICAgIHByZXBhcmVfY3ViZV9kYXRhX2J1ZmZlcnMoKTsKKworICAgIHByZXBhcmVfZGVzY3JpcHRvcl9sYXlvdXQoKTsKKyAgICBwcmVwYXJlX3JlbmRlcl9wYXNzKCk7CisgICAgcHJlcGFyZV9waXBlbGluZSgpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN3YXBjaGFpbkltYWdlQ291bnQ7ICsraSkgeworICAgICAgICByZXN1bHQgPSBkZXZpY2UuYWxsb2NhdGVDb21tYW5kQnVmZmVycygmY21kLCAmc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5jbWQpOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKyAgICB9CisKKyAgICBpZiAoc2VwYXJhdGVfcHJlc2VudF9xdWV1ZSkgeworICAgICAgICBhdXRvIGNvbnN0IHByZXNlbnRfY21kX3Bvb2xfaW5mbyA9IHZrOjpDb21tYW5kUG9vbENyZWF0ZUluZm8oKS5zZXRRdWV1ZUZhbWlseUluZGV4KHByZXNlbnRfcXVldWVfZmFtaWx5X2luZGV4KTsKKworICAgICAgICByZXN1bHQgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZFBvb2woJnByZXNlbnRfY21kX3Bvb2xfaW5mbywgbnVsbHB0ciwgJnByZXNlbnRfY21kX3Bvb2wpOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgICAgICBhdXRvIGNvbnN0IHByZXNlbnRfY21kID0gdms6OkNvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb21tYW5kUG9vbChwcmVzZW50X2NtZF9wb29sKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMZXZlbCh2azo6Q29tbWFuZEJ1ZmZlckxldmVsOjplUHJpbWFyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tbWFuZEJ1ZmZlckNvdW50KDEpOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGRldmljZS5hbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKCZwcmVzZW50X2NtZCwgJnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uZ3JhcGhpY3NfdG9fcHJlc2VudF9jbWQpOworICAgICAgICAgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICAgICAgICAgIGJ1aWxkX2ltYWdlX293bmVyc2hpcF9jbWQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcmVwYXJlX2Rlc2NyaXB0b3JfcG9vbCgpOworICAgIHByZXBhcmVfZGVzY3JpcHRvcl9zZXQoKTsKKworICAgIHByZXBhcmVfZnJhbWVidWZmZXJzKCk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluSW1hZ2VDb3VudDsgKytpKSB7CisgICAgICAgIGN1cnJlbnRfYnVmZmVyID0gaTsKKyAgICAgICAgZHJhd19idWlsZF9jbWQoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5jbWQpOworICAgIH0KKworICAgIC8qCisgICAgICogUHJlcGFyZSBmdW5jdGlvbnMgYWJvdmUgbWF5IGdlbmVyYXRlIHBpcGVsaW5lIGNvbW1hbmRzCisgICAgICogdGhhdCBuZWVkIHRvIGJlIGZsdXNoZWQgYmVmb3JlIGJlZ2lubmluZyB0aGUgcmVuZGVyIGxvb3AuCisgICAgICovCisgICAgZmx1c2hfaW5pdF9jbWQoKTsKKyAgICBpZiAoc3RhZ2luZ190ZXh0dXJlLmJ1ZmZlcikgeworICAgICAgICBkZXN0cm95X3RleHR1cmUoJnN0YWdpbmdfdGV4dHVyZSk7CisgICAgfQorCisgICAgY3VycmVudF9idWZmZXIgPSAwOworICAgIHByZXBhcmVkID0gdHJ1ZTsKK30KKwordm9pZCBEZW1vOjpwcmVwYXJlX2J1ZmZlcnMoKSB7CisgICAgdms6OlN3YXBjaGFpbktIUiBvbGRTd2FwY2hhaW4gPSBzd2FwY2hhaW47CisKKyAgICAvLyBDaGVjayB0aGUgc3VyZmFjZSBjYXBhYmlsaXRpZXMgYW5kIGZvcm1hdHMKKyAgICB2azo6U3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdXJmQ2FwYWJpbGl0aWVzOworICAgIGF1dG8gcmVzdWx0ID0gZ3B1LmdldFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoc3VyZmFjZSwgJnN1cmZDYXBhYmlsaXRpZXMpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgdWludDMyX3QgcHJlc2VudE1vZGVDb3VudDsKKyAgICByZXN1bHQgPSBncHUuZ2V0U3VyZmFjZVByZXNlbnRNb2Rlc0tIUihzdXJmYWNlLCAmcHJlc2VudE1vZGVDb3VudCwgc3RhdGljX2Nhc3Q8dms6OlByZXNlbnRNb2RlS0hSICo+KG51bGxwdHIpKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjx2azo6UHJlc2VudE1vZGVLSFJbXT4gcHJlc2VudE1vZGVzKG5ldyB2azo6UHJlc2VudE1vZGVLSFJbcHJlc2VudE1vZGVDb3VudF0pOworICAgIHJlc3VsdCA9IGdwdS5nZXRTdXJmYWNlUHJlc2VudE1vZGVzS0hSKHN1cmZhY2UsICZwcmVzZW50TW9kZUNvdW50LCBwcmVzZW50TW9kZXMuZ2V0KCkpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgdms6OkV4dGVudDJEIHN3YXBjaGFpbkV4dGVudDsKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBlaXRoZXIgYm90aCAtMSwgb3IgYm90aCBub3QgLTEuCisgICAgaWYgKHN1cmZDYXBhYmlsaXRpZXMuY3VycmVudEV4dGVudC53aWR0aCA9PSAodWludDMyX3QpLTEpIHsKKyAgICAgICAgLy8gSWYgdGhlIHN1cmZhY2Ugc2l6ZSBpcyB1bmRlZmluZWQsIHRoZSBzaXplIGlzIHNldCB0bworICAgICAgICAvLyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VzIHJlcXVlc3RlZC4KKyAgICAgICAgc3dhcGNoYWluRXh0ZW50LndpZHRoID0gd2lkdGg7CisgICAgICAgIHN3YXBjaGFpbkV4dGVudC5oZWlnaHQgPSBoZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgdGhlIHN1cmZhY2Ugc2l6ZSBpcyBkZWZpbmVkLCB0aGUgc3dhcCBjaGFpbiBzaXplIG11c3QgbWF0Y2gKKyAgICAgICAgc3dhcGNoYWluRXh0ZW50ID0gc3VyZkNhcGFiaWxpdGllcy5jdXJyZW50RXh0ZW50OworICAgICAgICB3aWR0aCA9IHN1cmZDYXBhYmlsaXRpZXMuY3VycmVudEV4dGVudC53aWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gc3VyZkNhcGFiaWxpdGllcy5jdXJyZW50RXh0ZW50LmhlaWdodDsKKyAgICB9CisKKyAgICAvLyBUaGUgRklGTyBwcmVzZW50IG1vZGUgaXMgZ3VhcmFudGVlZCBieSB0aGUgc3BlYyB0byBiZSBzdXBwb3J0ZWQKKyAgICAvLyBhbmQgdG8gaGF2ZSBubyB0ZWFyaW5nLiAgSXQncyBhIGdyZWF0IGRlZmF1bHQgcHJlc2VudCBtb2RlIHRvIHVzZS4KKyAgICB2azo6UHJlc2VudE1vZGVLSFIgc3dhcGNoYWluUHJlc2VudE1vZGUgPSB2azo6UHJlc2VudE1vZGVLSFI6OmVGaWZvOworCisgICAgLy8gIFRoZXJlIGFyZSB0aW1lcyB3aGVuIHlvdSBtYXkgd2lzaCB0byB1c2UgYW5vdGhlciBwcmVzZW50IG1vZGUuICBUaGUKKyAgICAvLyAgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRvIHNlbGVjdCB0aGVtLCBhbmQgdGhlIGNvbW1lbnRzIHByb3ZpZGUgc29tZQorICAgIC8vICByZWFzb25zIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhlbS4KKyAgICAvLworICAgIC8vIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IFZ1bGthbiAxLjAgZG9lc24ndCBwcm92aWRlIGEgbWV0aG9kIGZvcgorICAgIC8vIHN5bmNocm9uaXppbmcgcmVuZGVyaW5nIHdpdGggdGhlIHByZXNlbnRhdGlvbiBlbmdpbmUncyBkaXNwbGF5LiAgVGhlcmUKKyAgICAvLyBpcyBhIG1ldGhvZCBwcm92aWRlZCBmb3IgdGhyb3R0bGluZyByZW5kZXJpbmcgd2l0aCB0aGUgZGlzcGxheSwgYnV0CisgICAgLy8gdGhlcmUgYXJlIHNvbWUgcHJlc2VudGF0aW9uIGVuZ2luZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIHdpbGwgbm90IHdvcmsuCisgICAgLy8gSWYgYW4gYXBwbGljYXRpb24gZG9lc24ndCB0aHJvdHRsZSBpdHMgcmVuZGVyaW5nLCBhbmQgaWYgaXQgcmVuZGVycyBtdWNoCisgICAgLy8gZmFzdGVyIHRoYW4gdGhlIHJlZnJlc2ggcmF0ZSBvZiB0aGUgZGlzcGxheSwgdGhpcyBjYW4gd2FzdGUgcG93ZXIgb24KKyAgICAvLyBtb2JpbGUgZGV2aWNlcy4gIFRoYXQgaXMgYmVjYXVzZSBwb3dlciBpcyBiZWluZyBzcGVudCByZW5kZXJpbmcgaW1hZ2VzCisgICAgLy8gdGhhdCBtYXkgbmV2ZXIgYmUgc2Vlbi4KKworICAgIC8vIFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSIGlzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjYXJlCisgICAgLy8gYWJvdXQKKyAgICAvLyB0ZWFyaW5nLCBvciBoYXZlIHNvbWUgd2F5IG9mIHN5bmNocm9uaXppbmcgdGhlaXIgcmVuZGVyaW5nIHdpdGggdGhlCisgICAgLy8gZGlzcGxheS4KKyAgICAvLyBWS19QUkVTRU5UX01PREVfTUFJTEJPWF9LSFIgbWF5IGJlIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIHRoYXQKKyAgICAvLyBnZW5lcmFsbHkgcmVuZGVyIGEgbmV3IHByZXNlbnRhYmxlIGltYWdlIGV2ZXJ5IHJlZnJlc2ggY3ljbGUsIGJ1dCBhcmUKKyAgICAvLyBvY2Nhc2lvbmFsbHkgZWFybHkuICBJbiB0aGlzIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0aGUgbmV3CisgICAgLy8gaW1hZ2UKKyAgICAvLyB0byBiZSBkaXNwbGF5ZWQgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXNseS1xdWV1ZWQtZm9yLXByZXNlbnRhdGlvbgorICAgIC8vIGltYWdlCisgICAgLy8gdGhhdCBoYXMgbm90IHlldCBiZWVuIGRpc3BsYXllZC4KKyAgICAvLyBWS19QUkVTRU5UX01PREVfRklGT19SRUxBWEVEX0tIUiBpcyBmb3IgYXBwbGljYXRpb25zIHRoYXQgZ2VuZXJhbGx5CisgICAgLy8gcmVuZGVyIGEgbmV3IHByZXNlbnRhYmxlIGltYWdlIGV2ZXJ5IHJlZnJlc2ggY3ljbGUsIGJ1dCBhcmUKKyAgICAvLyBvY2Nhc2lvbmFsbHkKKyAgICAvLyBsYXRlLiAgSW4gdGhpcyBjYXNlIChwZXJoYXBzIGJlY2F1c2Ugb2Ygc3R1dHRlcmluZy9sYXRlbmN5IGNvbmNlcm5zKSwKKyAgICAvLyB0aGUgYXBwbGljYXRpb24gd2FudHMgdGhlIGxhdGUgaW1hZ2UgdG8gYmUgaW1tZWRpYXRlbHkgZGlzcGxheWVkLAorICAgIC8vIGV2ZW4KKyAgICAvLyB0aG91Z2ggdGhhdCBtYXkgbWVhbiBzb21lIHRlYXJpbmcuCisKKyAgICBpZiAocHJlc2VudE1vZGUgIT0gc3dhcGNoYWluUHJlc2VudE1vZGUpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmVzZW50TW9kZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChwcmVzZW50TW9kZXNbaV0gPT0gcHJlc2VudE1vZGUpIHsKKyAgICAgICAgICAgICAgICBzd2FwY2hhaW5QcmVzZW50TW9kZSA9IHByZXNlbnRNb2RlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN3YXBjaGFpblByZXNlbnRNb2RlICE9IHByZXNlbnRNb2RlKSB7CisgICAgICAgIEVSUl9FWElUKCJQcmVzZW50IG1vZGUgc3BlY2lmaWVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsICJQcmVzZW50IG1vZGUgdW5zdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBWa0ltYWdlcyB0byB1c2UgaW4gdGhlIHN3YXAgY2hhaW4uCisgICAgLy8gQXBwbGljYXRpb24gZGVzaXJlcyB0byBhY3F1aXJlIDMgaW1hZ2VzIGF0IGEgdGltZSBmb3IgdHJpcGxlCisgICAgLy8gYnVmZmVyaW5nCisgICAgdWludDMyX3QgZGVzaXJlZE51bU9mU3dhcGNoYWluSW1hZ2VzID0gMzsKKyAgICBpZiAoZGVzaXJlZE51bU9mU3dhcGNoYWluSW1hZ2VzIDwgc3VyZkNhcGFiaWxpdGllcy5taW5JbWFnZUNvdW50KSB7CisgICAgICAgIGRlc2lyZWROdW1PZlN3YXBjaGFpbkltYWdlcyA9IHN1cmZDYXBhYmlsaXRpZXMubWluSW1hZ2VDb3VudDsKKyAgICB9CisKKyAgICAvLyBJZiBtYXhJbWFnZUNvdW50IGlzIDAsIHdlIGNhbiBhc2sgZm9yIGFzIG1hbnkgaW1hZ2VzIGFzIHdlIHdhbnQsCisgICAgLy8gb3RoZXJ3aXNlCisgICAgLy8gd2UncmUgbGltaXRlZCB0byBtYXhJbWFnZUNvdW50CisgICAgaWYgKChzdXJmQ2FwYWJpbGl0aWVzLm1heEltYWdlQ291bnQgPiAwKSAmJiAoZGVzaXJlZE51bU9mU3dhcGNoYWluSW1hZ2VzID4gc3VyZkNhcGFiaWxpdGllcy5tYXhJbWFnZUNvdW50KSkgeworICAgICAgICAvLyBBcHBsaWNhdGlvbiBtdXN0IHNldHRsZSBmb3IgZmV3ZXIgaW1hZ2VzIHRoYW4gZGVzaXJlZDoKKyAgICAgICAgZGVzaXJlZE51bU9mU3dhcGNoYWluSW1hZ2VzID0gc3VyZkNhcGFiaWxpdGllcy5tYXhJbWFnZUNvdW50OworICAgIH0KKworICAgIHZrOjpTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgcHJlVHJhbnNmb3JtOworICAgIGlmIChzdXJmQ2FwYWJpbGl0aWVzLnN1cHBvcnRlZFRyYW5zZm9ybXMgJiB2azo6U3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSOjplSWRlbnRpdHkpIHsKKyAgICAgICAgcHJlVHJhbnNmb3JtID0gdms6OlN1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUjo6ZUlkZW50aXR5OworICAgIH0gZWxzZSB7CisgICAgICAgIHByZVRyYW5zZm9ybSA9IHN1cmZDYXBhYmlsaXRpZXMuY3VycmVudFRyYW5zZm9ybTsKKyAgICB9CisKKyAgICAvLyBGaW5kIGEgc3VwcG9ydGVkIGNvbXBvc2l0ZSBhbHBoYSBtb2RlIC0gb25lIG9mIHRoZXNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgc2V0CisgICAgdms6OkNvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgY29tcG9zaXRlQWxwaGEgPSB2azo6Q29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZU9wYXF1ZTsKKyAgICB2azo6Q29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiBjb21wb3NpdGVBbHBoYUZsYWdzWzRdID0geworICAgICAgICB2azo6Q29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZU9wYXF1ZSwKKyAgICAgICAgdms6OkNvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFI6OmVQcmVNdWx0aXBsaWVkLAorICAgICAgICB2azo6Q29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZVBvc3RNdWx0aXBsaWVkLAorICAgICAgICB2azo6Q29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUjo6ZUluaGVyaXQsCisgICAgfTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21wb3NpdGVBbHBoYUZsYWdzKTsgaSsrKSB7CisgICAgICAgIGlmIChzdXJmQ2FwYWJpbGl0aWVzLnN1cHBvcnRlZENvbXBvc2l0ZUFscGhhICYgY29tcG9zaXRlQWxwaGFGbGFnc1tpXSkgeworICAgICAgICAgICAgY29tcG9zaXRlQWxwaGEgPSBjb21wb3NpdGVBbHBoYUZsYWdzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGNvbnN0IHN3YXBjaGFpbl9jaSA9IHZrOjpTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3VyZmFjZShzdXJmYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNaW5JbWFnZUNvdW50KGRlc2lyZWROdW1PZlN3YXBjaGFpbkltYWdlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW1hZ2VGb3JtYXQoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbWFnZUNvbG9yU3BhY2UoY29sb3Jfc3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEltYWdlRXh0ZW50KHtzd2FwY2hhaW5FeHRlbnQud2lkdGgsIHN3YXBjaGFpbkV4dGVudC5oZWlnaHR9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbWFnZUFycmF5TGF5ZXJzKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEltYWdlVXNhZ2Uodms6OkltYWdlVXNhZ2VGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW1hZ2VTaGFyaW5nTW9kZSh2azo6U2hhcmluZ01vZGU6OmVFeGNsdXNpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFF1ZXVlRmFtaWx5SW5kZXhDb3VudCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQUXVldWVGYW1pbHlJbmRpY2VzKG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZVRyYW5zZm9ybShwcmVUcmFuc2Zvcm0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbXBvc2l0ZUFscGhhKGNvbXBvc2l0ZUFscGhhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50TW9kZShzd2FwY2hhaW5QcmVzZW50TW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2xpcHBlZCh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPbGRTd2FwY2hhaW4ob2xkU3dhcGNoYWluKTsKKworICAgIHJlc3VsdCA9IGRldmljZS5jcmVhdGVTd2FwY2hhaW5LSFIoJnN3YXBjaGFpbl9jaSwgbnVsbHB0ciwgJnN3YXBjaGFpbik7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICAvLyBJZiB3ZSBqdXN0IHJlLWNyZWF0ZWQgYW4gZXhpc3Rpbmcgc3dhcGNoYWluLCB3ZSBzaG91bGQgZGVzdHJveSB0aGUKKyAgICAvLyBvbGQKKyAgICAvLyBzd2FwY2hhaW4gYXQgdGhpcyBwb2ludC4KKyAgICAvLyBOb3RlOiBkZXN0cm95aW5nIHRoZSBzd2FwY2hhaW4gYWxzbyBjbGVhbnMgdXAgYWxsIGl0cyBhc3NvY2lhdGVkCisgICAgLy8gcHJlc2VudGFibGUgaW1hZ2VzIG9uY2UgdGhlIHBsYXRmb3JtIGlzIGRvbmUgd2l0aCB0aGVtLgorICAgIGlmIChvbGRTd2FwY2hhaW4pIHsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lTd2FwY2hhaW5LSFIob2xkU3dhcGNoYWluLCBudWxscHRyKTsKKyAgICB9CisKKyAgICByZXN1bHQgPSBkZXZpY2UuZ2V0U3dhcGNoYWluSW1hZ2VzS0hSKHN3YXBjaGFpbiwgJnN3YXBjaGFpbkltYWdlQ291bnQsIHN0YXRpY19jYXN0PHZrOjpJbWFnZSAqPihudWxscHRyKSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dms6OkltYWdlW10+IHN3YXBjaGFpbkltYWdlcyhuZXcgdms6OkltYWdlW3N3YXBjaGFpbkltYWdlQ291bnRdKTsKKyAgICByZXN1bHQgPSBkZXZpY2UuZ2V0U3dhcGNoYWluSW1hZ2VzS0hSKHN3YXBjaGFpbiwgJnN3YXBjaGFpbkltYWdlQ291bnQsIHN3YXBjaGFpbkltYWdlcy5nZXQoKSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzLnJlc2V0KG5ldyBTd2FwY2hhaW5JbWFnZVJlc291cmNlc1tzd2FwY2hhaW5JbWFnZUNvdW50XSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluSW1hZ2VDb3VudDsgKytpKSB7CisgICAgICAgIGF1dG8gY29sb3JfaW1hZ2VfdmlldyA9IHZrOjpJbWFnZVZpZXdDcmVhdGVJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWaWV3VHlwZSh2azo6SW1hZ2VWaWV3VHlwZTo6ZTJEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZvcm1hdChmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3VicmVzb3VyY2VSYW5nZSh2azo6SW1hZ2VTdWJyZXNvdXJjZVJhbmdlKHZrOjpJbWFnZUFzcGVjdEZsYWdCaXRzOjplQ29sb3IsIDAsIDEsIDAsIDEpKTsKKworICAgICAgICBzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmltYWdlID0gc3dhcGNoYWluSW1hZ2VzW2ldOworCisgICAgICAgIGNvbG9yX2ltYWdlX3ZpZXcuaW1hZ2UgPSBzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmltYWdlOworCisgICAgICAgIHJlc3VsdCA9IGRldmljZS5jcmVhdGVJbWFnZVZpZXcoJmNvbG9yX2ltYWdlX3ZpZXcsIG51bGxwdHIsICZzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnZpZXcpOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKyAgICB9Cit9CisKK3ZvaWQgRGVtbzo6cHJlcGFyZV9jdWJlX2RhdGFfYnVmZmVycygpIHsKKyAgICBtYXQ0eDQgVlA7CisgICAgbWF0NHg0X211bChWUCwgcHJvamVjdGlvbl9tYXRyaXgsIHZpZXdfbWF0cml4KTsKKworICAgIG1hdDR4NCBNVlA7CisgICAgbWF0NHg0X211bChNVlAsIFZQLCBtb2RlbF9tYXRyaXgpOworCisgICAgdmt0ZXhjdWJlX3ZzX3VuaWZvcm0gZGF0YTsKKyAgICBtZW1jcHkoZGF0YS5tdnAsIE1WUCwgc2l6ZW9mKE1WUCkpOworICAgIC8vICAgIGR1bXBNYXRyaXgoIk1WUCIsIE1WUCkKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDEyICogMzsgaSsrKSB7CisgICAgICAgIGRhdGEucG9zaXRpb25baV1bMF0gPSBnX3ZlcnRleF9idWZmZXJfZGF0YVtpICogM107CisgICAgICAgIGRhdGEucG9zaXRpb25baV1bMV0gPSBnX3ZlcnRleF9idWZmZXJfZGF0YVtpICogMyArIDFdOworICAgICAgICBkYXRhLnBvc2l0aW9uW2ldWzJdID0gZ192ZXJ0ZXhfYnVmZmVyX2RhdGFbaSAqIDMgKyAyXTsKKyAgICAgICAgZGF0YS5wb3NpdGlvbltpXVszXSA9IDEuMGY7CisgICAgICAgIGRhdGEuYXR0cltpXVswXSA9IGdfdXZfYnVmZmVyX2RhdGFbMiAqIGldOworICAgICAgICBkYXRhLmF0dHJbaV1bMV0gPSBnX3V2X2J1ZmZlcl9kYXRhWzIgKiBpICsgMV07CisgICAgICAgIGRhdGEuYXR0cltpXVsyXSA9IDA7CisgICAgICAgIGRhdGEuYXR0cltpXVszXSA9IDA7CisgICAgfQorCisgICAgYXV0byBjb25zdCBidWZfaW5mbyA9IHZrOjpCdWZmZXJDcmVhdGVJbmZvKCkuc2V0U2l6ZShzaXplb2YoZGF0YSkpLnNldFVzYWdlKHZrOjpCdWZmZXJVc2FnZUZsYWdCaXRzOjplVW5pZm9ybUJ1ZmZlcik7CisKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN3YXBjaGFpbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICBhdXRvIHJlc3VsdCA9IGRldmljZS5jcmVhdGVCdWZmZXIoJmJ1Zl9pbmZvLCBudWxscHRyLCAmc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX2J1ZmZlcik7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgICAgIHZrOjpNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisgICAgICAgIGRldmljZS5nZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX2J1ZmZlciwgJm1lbV9yZXFzKTsKKworICAgICAgICBhdXRvIG1lbV9hbGxvYyA9IHZrOjpNZW1vcnlBbGxvY2F0ZUluZm8oKS5zZXRBbGxvY2F0aW9uU2l6ZShtZW1fcmVxcy5zaXplKS5zZXRNZW1vcnlUeXBlSW5kZXgoMCk7CisKKyAgICAgICAgYm9vbCBjb25zdCBwYXNzID0gbWVtb3J5X3R5cGVfZnJvbV9wcm9wZXJ0aWVzKAorICAgICAgICAgICAgbWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsIHZrOjpNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplSG9zdFZpc2libGUgfCB2azo6TWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZUhvc3RDb2hlcmVudCwKKyAgICAgICAgICAgICZtZW1fYWxsb2MubWVtb3J5VHlwZUluZGV4KTsKKyAgICAgICAgVkVSSUZZKHBhc3MpOworCisgICAgICAgIHJlc3VsdCA9IGRldmljZS5hbGxvY2F0ZU1lbW9yeSgmbWVtX2FsbG9jLCBudWxscHRyLCAmc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX21lbW9yeSk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgICAgIGF1dG8gcERhdGEgPSBkZXZpY2UubWFwTWVtb3J5KHN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udW5pZm9ybV9tZW1vcnksIDAsIFZLX1dIT0xFX1NJWkUsIHZrOjpNZW1vcnlNYXBGbGFncygpKTsKKyAgICAgICAgVkVSSUZZKHBEYXRhLnJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICAgICAgbWVtY3B5KHBEYXRhLnZhbHVlLCAmZGF0YSwgc2l6ZW9mIGRhdGEpOworCisgICAgICAgIGRldmljZS51bm1hcE1lbW9yeShzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fbWVtb3J5KTsKKworICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgZGV2aWNlLmJpbmRCdWZmZXJNZW1vcnkoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX2J1ZmZlciwgc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX21lbW9yeSwgMCk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgIH0KK30KKwordm9pZCBEZW1vOjpwcmVwYXJlX2RlcHRoKCkgeworICAgIGRlcHRoLmZvcm1hdCA9IHZrOjpGb3JtYXQ6OmVEMTZVbm9ybTsKKworICAgIGF1dG8gY29uc3QgaW1hZ2UgPSB2azo6SW1hZ2VDcmVhdGVJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbWFnZVR5cGUodms6OkltYWdlVHlwZTo6ZTJEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZvcm1hdChkZXB0aC5mb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXh0ZW50KHsodWludDMyX3Qpd2lkdGgsICh1aW50MzJfdCloZWlnaHQsIDF9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1pcExldmVscygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFycmF5TGF5ZXJzKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2FtcGxlcyh2azo6U2FtcGxlQ291bnRGbGFnQml0czo6ZTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGlsaW5nKHZrOjpJbWFnZVRpbGluZzo6ZU9wdGltYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VXNhZ2Uodms6OkltYWdlVXNhZ2VGbGFnQml0czo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2hhcmluZ01vZGUodms6OlNoYXJpbmdNb2RlOjplRXhjbHVzaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFF1ZXVlRmFtaWx5SW5kZXhDb3VudCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBRdWV1ZUZhbWlseUluZGljZXMobnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsTGF5b3V0KHZrOjpJbWFnZUxheW91dDo6ZVVuZGVmaW5lZCk7CisKKyAgICBhdXRvIHJlc3VsdCA9IGRldmljZS5jcmVhdGVJbWFnZSgmaW1hZ2UsIG51bGxwdHIsICZkZXB0aC5pbWFnZSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICB2azo6TWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworICAgIGRldmljZS5nZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhkZXB0aC5pbWFnZSwgJm1lbV9yZXFzKTsKKworICAgIGRlcHRoLm1lbV9hbGxvYy5zZXRBbGxvY2F0aW9uU2l6ZShtZW1fcmVxcy5zaXplKTsKKyAgICBkZXB0aC5tZW1fYWxsb2Muc2V0TWVtb3J5VHlwZUluZGV4KDApOworCisgICAgYXV0byBjb25zdCBwYXNzID0gbWVtb3J5X3R5cGVfZnJvbV9wcm9wZXJ0aWVzKG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCB2azo6TWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZURldmljZUxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgubWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCk7CisgICAgVkVSSUZZKHBhc3MpOworCisgICAgcmVzdWx0ID0gZGV2aWNlLmFsbG9jYXRlTWVtb3J5KCZkZXB0aC5tZW1fYWxsb2MsIG51bGxwdHIsICZkZXB0aC5tZW0pOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgcmVzdWx0ID0gZGV2aWNlLmJpbmRJbWFnZU1lbW9yeShkZXB0aC5pbWFnZSwgZGVwdGgubWVtLCAwKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIGF1dG8gY29uc3QgdmlldyA9IHZrOjpJbWFnZVZpZXdDcmVhdGVJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEltYWdlKGRlcHRoLmltYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Vmlld1R5cGUodms6OkltYWdlVmlld1R5cGU6OmUyRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZvcm1hdChkZXB0aC5mb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdWJyZXNvdXJjZVJhbmdlKHZrOjpJbWFnZVN1YnJlc291cmNlUmFuZ2Uodms6OkltYWdlQXNwZWN0RmxhZ0JpdHM6OmVEZXB0aCwgMCwgMSwgMCwgMSkpOworICAgIHJlc3VsdCA9IGRldmljZS5jcmVhdGVJbWFnZVZpZXcoJnZpZXcsIG51bGxwdHIsICZkZXB0aC52aWV3KTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKK30KKwordm9pZCBEZW1vOjpwcmVwYXJlX2Rlc2NyaXB0b3JfbGF5b3V0KCkgeworICAgIHZrOjpEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBjb25zdCBsYXlvdXRfYmluZGluZ3NbMl0gPSB7dms6OkRlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QmluZGluZygwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjcmlwdG9yVHlwZSh2azo6RGVzY3JpcHRvclR5cGU6OmVVbmlmb3JtQnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjcmlwdG9yQ291bnQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3RhZ2VGbGFncyh2azo6U2hhZGVyU3RhZ2VGbGFnQml0czo6ZVZlcnRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UEltbXV0YWJsZVNhbXBsZXJzKG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdms6OkRlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QmluZGluZygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjcmlwdG9yVHlwZSh2azo6RGVzY3JpcHRvclR5cGU6OmVDb21iaW5lZEltYWdlU2FtcGxlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGVzY3JpcHRvckNvdW50KHRleHR1cmVfY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0YWdlRmxhZ3Modms6OlNoYWRlclN0YWdlRmxhZ0JpdHM6OmVGcmFnbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UEltbXV0YWJsZVNhbXBsZXJzKG51bGxwdHIpfTsKKworICAgIGF1dG8gY29uc3QgZGVzY3JpcHRvcl9sYXlvdXQgPSB2azo6RGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8oKS5zZXRCaW5kaW5nQ291bnQoMikuc2V0UEJpbmRpbmdzKGxheW91dF9iaW5kaW5ncyk7CisKKyAgICBhdXRvIHJlc3VsdCA9IGRldmljZS5jcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KCZkZXNjcmlwdG9yX2xheW91dCwgbnVsbHB0ciwgJmRlc2NfbGF5b3V0KTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIGF1dG8gY29uc3QgcFBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyA9IHZrOjpQaXBlbGluZUxheW91dENyZWF0ZUluZm8oKS5zZXRTZXRMYXlvdXRDb3VudCgxKS5zZXRQU2V0TGF5b3V0cygmZGVzY19sYXlvdXQpOworCisgICAgcmVzdWx0ID0gZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KCZwUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLCBudWxscHRyLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKK30KKwordm9pZCBEZW1vOjpwcmVwYXJlX2Rlc2NyaXB0b3JfcG9vbCgpIHsKKyAgICB2azo6RGVzY3JpcHRvclBvb2xTaXplIGNvbnN0IHBvb2xTaXplc1syXSA9IHsKKyAgICAgICAgdms6OkRlc2NyaXB0b3JQb29sU2l6ZSgpLnNldFR5cGUodms6OkRlc2NyaXB0b3JUeXBlOjplVW5pZm9ybUJ1ZmZlcikuc2V0RGVzY3JpcHRvckNvdW50KHN3YXBjaGFpbkltYWdlQ291bnQpLAorICAgICAgICB2azo6RGVzY3JpcHRvclBvb2xTaXplKCkKKyAgICAgICAgICAgIC5zZXRUeXBlKHZrOjpEZXNjcmlwdG9yVHlwZTo6ZUNvbWJpbmVkSW1hZ2VTYW1wbGVyKQorICAgICAgICAgICAgLnNldERlc2NyaXB0b3JDb3VudChzd2FwY2hhaW5JbWFnZUNvdW50ICogdGV4dHVyZV9jb3VudCl9OworCisgICAgYXV0byBjb25zdCBkZXNjcmlwdG9yX3Bvb2wgPQorICAgICAgICB2azo6RGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKCkuc2V0TWF4U2V0cyhzd2FwY2hhaW5JbWFnZUNvdW50KS5zZXRQb29sU2l6ZUNvdW50KDIpLnNldFBQb29sU2l6ZXMocG9vbFNpemVzKTsKKworICAgIGF1dG8gcmVzdWx0ID0gZGV2aWNlLmNyZWF0ZURlc2NyaXB0b3JQb29sKCZkZXNjcmlwdG9yX3Bvb2wsIG51bGxwdHIsICZkZXNjX3Bvb2wpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworfQorCit2b2lkIERlbW86OnByZXBhcmVfZGVzY3JpcHRvcl9zZXQoKSB7CisgICAgYXV0byBjb25zdCBhbGxvY19pbmZvID0KKyAgICAgICAgdms6OkRlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8oKS5zZXREZXNjcmlwdG9yUG9vbChkZXNjX3Bvb2wpLnNldERlc2NyaXB0b3JTZXRDb3VudCgxKS5zZXRQU2V0TGF5b3V0cygmZGVzY19sYXlvdXQpOworCisgICAgYXV0byBidWZmZXJfaW5mbyA9IHZrOjpEZXNjcmlwdG9yQnVmZmVySW5mbygpLnNldE9mZnNldCgwKS5zZXRSYW5nZShzaXplb2Yoc3RydWN0IHZrdGV4Y3ViZV92c191bmlmb3JtKSk7CisKKyAgICB2azo6RGVzY3JpcHRvckltYWdlSW5mbyB0ZXhfZGVzY3NbdGV4dHVyZV9jb3VudF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHRleHR1cmVfY291bnQ7IGkrKykgeworICAgICAgICB0ZXhfZGVzY3NbaV0uc2V0U2FtcGxlcih0ZXh0dXJlc1tpXS5zYW1wbGVyKTsKKyAgICAgICAgdGV4X2Rlc2NzW2ldLnNldEltYWdlVmlldyh0ZXh0dXJlc1tpXS52aWV3KTsKKyAgICAgICAgdGV4X2Rlc2NzW2ldLnNldEltYWdlTGF5b3V0KHZrOjpJbWFnZUxheW91dDo6ZVNoYWRlclJlYWRPbmx5T3B0aW1hbCk7CisgICAgfQorCisgICAgdms6OldyaXRlRGVzY3JpcHRvclNldCB3cml0ZXNbMl07CisKKyAgICB3cml0ZXNbMF0uc2V0RGVzY3JpcHRvckNvdW50KDEpOworICAgIHdyaXRlc1swXS5zZXREZXNjcmlwdG9yVHlwZSh2azo6RGVzY3JpcHRvclR5cGU6OmVVbmlmb3JtQnVmZmVyKTsKKyAgICB3cml0ZXNbMF0uc2V0UEJ1ZmZlckluZm8oJmJ1ZmZlcl9pbmZvKTsKKworICAgIHdyaXRlc1sxXS5zZXREc3RCaW5kaW5nKDEpOworICAgIHdyaXRlc1sxXS5zZXREZXNjcmlwdG9yQ291bnQodGV4dHVyZV9jb3VudCk7CisgICAgd3JpdGVzWzFdLnNldERlc2NyaXB0b3JUeXBlKHZrOjpEZXNjcmlwdG9yVHlwZTo6ZUNvbWJpbmVkSW1hZ2VTYW1wbGVyKTsKKyAgICB3cml0ZXNbMV0uc2V0UEltYWdlSW5mbyh0ZXhfZGVzY3MpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBkZXZpY2UuYWxsb2NhdGVEZXNjcmlwdG9yU2V0cygmYWxsb2NfaW5mbywgJnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uZGVzY3JpcHRvcl9zZXQpOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgICAgICBidWZmZXJfaW5mby5zZXRCdWZmZXIoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS51bmlmb3JtX2J1ZmZlcik7CisgICAgICAgIHdyaXRlc1swXS5zZXREc3RTZXQoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5kZXNjcmlwdG9yX3NldCk7CisgICAgICAgIHdyaXRlc1sxXS5zZXREc3RTZXQoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5kZXNjcmlwdG9yX3NldCk7CisgICAgICAgIGRldmljZS51cGRhdGVEZXNjcmlwdG9yU2V0cygyLCB3cml0ZXMsIDAsIG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBEZW1vOjpwcmVwYXJlX2ZyYW1lYnVmZmVycygpIHsKKyAgICB2azo6SW1hZ2VWaWV3IGF0dGFjaG1lbnRzWzJdOworICAgIGF0dGFjaG1lbnRzWzFdID0gZGVwdGgudmlldzsKKworICAgIGF1dG8gY29uc3QgZmJfaW5mbyA9IHZrOjpGcmFtZWJ1ZmZlckNyZWF0ZUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVuZGVyUGFzcyhyZW5kZXJfcGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF0dGFjaG1lbnRDb3VudCgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UEF0dGFjaG1lbnRzKGF0dGFjaG1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoKHVpbnQzMl90KXdpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SGVpZ2h0KCh1aW50MzJfdCloZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXllcnMoMSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgIGF0dGFjaG1lbnRzWzBdID0gc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS52aWV3OworICAgICAgICBhdXRvIGNvbnN0IHJlc3VsdCA9IGRldmljZS5jcmVhdGVGcmFtZWJ1ZmZlcigmZmJfaW5mbywgbnVsbHB0ciwgJnN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0uZnJhbWVidWZmZXIpOworICAgICAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKyAgICB9Cit9CisKK3ZrOjpTaGFkZXJNb2R1bGUgRGVtbzo6cHJlcGFyZV9mcygpIHsKKyAgICBjb25zdCB1aW50MzJfdCBmcmFnU2hhZGVyQ29kZVtdID0geworI2luY2x1ZGUgImN1YmUuZnJhZy5pbmMiCisgICAgfTsKKworICAgIGZyYWdfc2hhZGVyX21vZHVsZSA9IHByZXBhcmVfc2hhZGVyX21vZHVsZShmcmFnU2hhZGVyQ29kZSwgc2l6ZW9mKGZyYWdTaGFkZXJDb2RlKSk7CisKKyAgICByZXR1cm4gZnJhZ19zaGFkZXJfbW9kdWxlOworfQorCit2b2lkIERlbW86OnByZXBhcmVfcGlwZWxpbmUoKSB7CisgICAgdms6OlBpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvIGNvbnN0IHBpcGVsaW5lQ2FjaGVJbmZvOworICAgIGF1dG8gcmVzdWx0ID0gZGV2aWNlLmNyZWF0ZVBpcGVsaW5lQ2FjaGUoJnBpcGVsaW5lQ2FjaGVJbmZvLCBudWxscHRyLCAmcGlwZWxpbmVDYWNoZSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICB2azo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gY29uc3Qgc2hhZGVyU3RhZ2VJbmZvWzJdID0geworICAgICAgICB2azo6UGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oKS5zZXRTdGFnZSh2azo6U2hhZGVyU3RhZ2VGbGFnQml0czo6ZVZlcnRleCkuc2V0TW9kdWxlKHByZXBhcmVfdnMoKSkuc2V0UE5hbWUoIm1haW4iKSwKKyAgICAgICAgdms6OlBpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKCkuc2V0U3RhZ2Uodms6OlNoYWRlclN0YWdlRmxhZ0JpdHM6OmVGcmFnbWVudCkuc2V0TW9kdWxlKHByZXBhcmVfZnMoKSkuc2V0UE5hbWUoIm1haW4iKX07CisKKyAgICB2azo6UGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBjb25zdCB2ZXJ0ZXhJbnB1dEluZm87CisKKyAgICBhdXRvIGNvbnN0IGlucHV0QXNzZW1ibHlJbmZvID0gdms6OlBpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbygpLnNldFRvcG9sb2d5KHZrOjpQcmltaXRpdmVUb3BvbG9neTo6ZVRyaWFuZ2xlTGlzdCk7CisKKyAgICAvLyBUT0RPOiBXaGVyZSBhcmUgcFZpZXdwb3J0cyBhbmQgcFNjaXNzb3JzIHNldD8KKyAgICBhdXRvIGNvbnN0IHZpZXdwb3J0SW5mbyA9IHZrOjpQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKCkuc2V0Vmlld3BvcnRDb3VudCgxKS5zZXRTY2lzc29yQ291bnQoMSk7CisKKyAgICBhdXRvIGNvbnN0IHJhc3Rlcml6YXRpb25JbmZvID0gdms6OlBpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGVwdGhDbGFtcEVuYWJsZShWS19GQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSYXN0ZXJpemVyRGlzY2FyZEVuYWJsZShWS19GQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb2x5Z29uTW9kZSh2azo6UG9seWdvbk1vZGU6OmVGaWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEN1bGxNb2RlKHZrOjpDdWxsTW9kZUZsYWdCaXRzOjplQmFjaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGcm9udEZhY2Uodms6OkZyb250RmFjZTo6ZUNvdW50ZXJDbG9ja3dpc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGVwdGhCaWFzRW5hYmxlKFZLX0ZBTFNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldExpbmVXaWR0aCgxLjBmKTsKKworICAgIGF1dG8gY29uc3QgbXVsdGlzYW1wbGVJbmZvID0gdms6OlBpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8oKTsKKworICAgIGF1dG8gY29uc3Qgc3RlbmNpbE9wID0KKyAgICAgICAgdms6OlN0ZW5jaWxPcFN0YXRlKCkuc2V0RmFpbE9wKHZrOjpTdGVuY2lsT3A6OmVLZWVwKS5zZXRQYXNzT3Aodms6OlN0ZW5jaWxPcDo6ZUtlZXApLnNldENvbXBhcmVPcCh2azo6Q29tcGFyZU9wOjplQWx3YXlzKTsKKworICAgIGF1dG8gY29uc3QgZGVwdGhTdGVuY2lsSW5mbyA9IHZrOjpQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXB0aFRlc3RFbmFibGUoVktfVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlcHRoV3JpdGVFbmFibGUoVktfVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlcHRoQ29tcGFyZU9wKHZrOjpDb21wYXJlT3A6OmVMZXNzT3JFcXVhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlcHRoQm91bmRzVGVzdEVuYWJsZShWS19GQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0ZW5jaWxUZXN0RW5hYmxlKFZLX0ZBTFNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RnJvbnQoc3RlbmNpbE9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QmFjayhzdGVuY2lsT3ApOworCisgICAgdms6OlBpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBjb25zdCBjb2xvckJsZW5kQXR0YWNobWVudHNbMV0gPSB7CisgICAgICAgIHZrOjpQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUoKS5zZXRDb2xvcldyaXRlTWFzayh2azo6Q29sb3JDb21wb25lbnRGbGFnQml0czo6ZVIgfCB2azo6Q29sb3JDb21wb25lbnRGbGFnQml0czo6ZUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdms6OkNvbG9yQ29tcG9uZW50RmxhZ0JpdHM6OmVCIHwgdms6OkNvbG9yQ29tcG9uZW50RmxhZ0JpdHM6OmVBKX07CisKKyAgICBhdXRvIGNvbnN0IGNvbG9yQmxlbmRJbmZvID0KKyAgICAgICAgdms6OlBpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbygpLnNldEF0dGFjaG1lbnRDb3VudCgxKS5zZXRQQXR0YWNobWVudHMoY29sb3JCbGVuZEF0dGFjaG1lbnRzKTsKKworICAgIHZrOjpEeW5hbWljU3RhdGUgY29uc3QgZHluYW1pY1N0YXRlc1syXSA9IHt2azo6RHluYW1pY1N0YXRlOjplVmlld3BvcnQsIHZrOjpEeW5hbWljU3RhdGU6OmVTY2lzc29yfTsKKworICAgIGF1dG8gY29uc3QgZHluYW1pY1N0YXRlSW5mbyA9IHZrOjpQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8oKS5zZXRQRHluYW1pY1N0YXRlcyhkeW5hbWljU3RhdGVzKS5zZXREeW5hbWljU3RhdGVDb3VudCgyKTsKKworICAgIGF1dG8gY29uc3QgcGlwZWxpbmUgPSB2azo6R3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0YWdlQ291bnQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQU3RhZ2VzKHNoYWRlclN0YWdlSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQVmVydGV4SW5wdXRTdGF0ZSgmdmVydGV4SW5wdXRJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBJbnB1dEFzc2VtYmx5U3RhdGUoJmlucHV0QXNzZW1ibHlJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBWaWV3cG9ydFN0YXRlKCZ2aWV3cG9ydEluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UFJhc3Rlcml6YXRpb25TdGF0ZSgmcmFzdGVyaXphdGlvbkluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UE11bHRpc2FtcGxlU3RhdGUoJm11bHRpc2FtcGxlSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQRGVwdGhTdGVuY2lsU3RhdGUoJmRlcHRoU3RlbmNpbEluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UENvbG9yQmxlbmRTdGF0ZSgmY29sb3JCbGVuZEluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UER5bmFtaWNTdGF0ZSgmZHluYW1pY1N0YXRlSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXlvdXQocGlwZWxpbmVfbGF5b3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlbmRlclBhc3MocmVuZGVyX3Bhc3MpOworCisgICAgcmVzdWx0ID0gZGV2aWNlLmNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKHBpcGVsaW5lQ2FjaGUsIDEsICZwaXBlbGluZSwgbnVsbHB0ciwgJnRoaXMtPnBpcGVsaW5lKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIGRldmljZS5kZXN0cm95U2hhZGVyTW9kdWxlKGZyYWdfc2hhZGVyX21vZHVsZSwgbnVsbHB0cik7CisgICAgZGV2aWNlLmRlc3Ryb3lTaGFkZXJNb2R1bGUodmVydF9zaGFkZXJfbW9kdWxlLCBudWxscHRyKTsKK30KKwordm9pZCBEZW1vOjpwcmVwYXJlX3JlbmRlcl9wYXNzKCkgeworICAgIC8vIFRoZSBpbml0aWFsIGxheW91dCBmb3IgdGhlIGNvbG9yIGFuZCBkZXB0aCBhdHRhY2htZW50cyB3aWxsIGJlIExBWU9VVF9VTkRFRklORUQKKyAgICAvLyBiZWNhdXNlIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVycGFzcywgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVpciBjb250ZW50cy4KKyAgICAvLyBBdCB0aGUgc3RhcnQgb2YgdGhlIHN1YnBhc3MsIHRoZSBjb2xvciBhdHRhY2htZW50J3MgbGF5b3V0IHdpbGwgYmUgdHJhbnNpdGlvbmVkCisgICAgLy8gdG8gTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCBhbmQgdGhlIGRlcHRoIHN0ZW5jaWwgYXR0YWNobWVudCdzIGxheW91dAorICAgIC8vIHdpbGwgYmUgdHJhbnNpdGlvbmVkIHRvIExBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTC4gIEF0IHRoZSBlbmQgb2YKKyAgICAvLyB0aGUgcmVuZGVycGFzcywgdGhlIGNvbG9yIGF0dGFjaG1lbnQncyBsYXlvdXQgd2lsbCBiZSB0cmFuc2l0aW9uZWQgdG8KKyAgICAvLyBMQVlPVVRfUFJFU0VOVF9TUkNfS0hSIHRvIGJlIHJlYWR5IHRvIHByZXNlbnQuICBUaGlzIGlzIGFsbCBkb25lIGFzIHBhcnQgb2YKKyAgICAvLyB0aGUgcmVuZGVycGFzcywgbm8gYmFycmllcnMgYXJlIG5lY2Vzc2FyeS4KKyAgICBjb25zdCB2azo6QXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnRzWzJdID0ge3ZrOjpBdHRhY2htZW50RGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGb3JtYXQoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTYW1wbGVzKHZrOjpTYW1wbGVDb3VudEZsYWdCaXRzOjplMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TG9hZE9wKHZrOjpBdHRhY2htZW50TG9hZE9wOjplQ2xlYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0b3JlT3Aodms6OkF0dGFjaG1lbnRTdG9yZU9wOjplU3RvcmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0ZW5jaWxMb2FkT3Aodms6OkF0dGFjaG1lbnRMb2FkT3A6OmVEb250Q2FyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3RlbmNpbFN0b3JlT3Aodms6OkF0dGFjaG1lbnRTdG9yZU9wOjplRG9udENhcmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxMYXlvdXQodms6OkltYWdlTGF5b3V0OjplVW5kZWZpbmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaW5hbExheW91dCh2azo6SW1hZ2VMYXlvdXQ6OmVQcmVzZW50U3JjS0hSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrOjpBdHRhY2htZW50RGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGb3JtYXQoZGVwdGguZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTYW1wbGVzKHZrOjpTYW1wbGVDb3VudEZsYWdCaXRzOjplMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TG9hZE9wKHZrOjpBdHRhY2htZW50TG9hZE9wOjplQ2xlYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0b3JlT3Aodms6OkF0dGFjaG1lbnRTdG9yZU9wOjplRG9udENhcmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0ZW5jaWxMb2FkT3Aodms6OkF0dGFjaG1lbnRMb2FkT3A6OmVEb250Q2FyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3RlbmNpbFN0b3JlT3Aodms6OkF0dGFjaG1lbnRTdG9yZU9wOjplRG9udENhcmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxMYXlvdXQodms6OkltYWdlTGF5b3V0OjplVW5kZWZpbmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaW5hbExheW91dCh2azo6SW1hZ2VMYXlvdXQ6OmVEZXB0aFN0ZW5jaWxBdHRhY2htZW50T3B0aW1hbCl9OworCisgICAgYXV0byBjb25zdCBjb2xvcl9yZWZlcmVuY2UgPSB2azo6QXR0YWNobWVudFJlZmVyZW5jZSgpLnNldEF0dGFjaG1lbnQoMCkuc2V0TGF5b3V0KHZrOjpJbWFnZUxheW91dDo6ZUNvbG9yQXR0YWNobWVudE9wdGltYWwpOworCisgICAgYXV0byBjb25zdCBkZXB0aF9yZWZlcmVuY2UgPQorICAgICAgICB2azo6QXR0YWNobWVudFJlZmVyZW5jZSgpLnNldEF0dGFjaG1lbnQoMSkuc2V0TGF5b3V0KHZrOjpJbWFnZUxheW91dDo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnRPcHRpbWFsKTsKKworICAgIGF1dG8gY29uc3Qgc3VicGFzcyA9IHZrOjpTdWJwYXNzRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGlwZWxpbmVCaW5kUG9pbnQodms6OlBpcGVsaW5lQmluZFBvaW50OjplR3JhcGhpY3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnB1dEF0dGFjaG1lbnRDb3VudCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UElucHV0QXR0YWNobWVudHMobnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbG9yQXR0YWNobWVudENvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQQ29sb3JBdHRhY2htZW50cygmY29sb3JfcmVmZXJlbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UFJlc29sdmVBdHRhY2htZW50cyhudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UERlcHRoU3RlbmNpbEF0dGFjaG1lbnQoJmRlcHRoX3JlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlcnZlQXR0YWNobWVudENvdW50KDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQUHJlc2VydmVBdHRhY2htZW50cyhudWxscHRyKTsKKworICAgIHZrOjpQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VzID0gdms6OlBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZUVhcmx5RnJhZ21lbnRUZXN0cyB8IHZrOjpQaXBlbGluZVN0YWdlRmxhZ0JpdHM6OmVMYXRlRnJhZ21lbnRUZXN0czsKKyAgICB2azo6U3VicGFzc0RlcGVuZGVuY3kgY29uc3QgZGVwZW5kZW5jaWVzWzJdID0geworICAgICAgICB2azo6U3VicGFzc0RlcGVuZGVuY3koKSAgLy8gRGVwdGggYnVmZmVyIGlzIHNoYXJlZCBiZXR3ZWVuIHN3YXBjaGFpbiBpbWFnZXMKKyAgICAgICAgICAgIC5zZXRTcmNTdWJwYXNzKFZLX1NVQlBBU1NfRVhURVJOQUwpCisgICAgICAgICAgICAuc2V0RHN0U3VicGFzcygwKQorICAgICAgICAgICAgLnNldFNyY1N0YWdlTWFzayhzdGFnZXMpCisgICAgICAgICAgICAuc2V0RHN0U3RhZ2VNYXNrKHN0YWdlcykKKyAgICAgICAgICAgIC5zZXRTcmNBY2Nlc3NNYXNrKHZrOjpBY2Nlc3NGbGFnQml0czo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnRXcml0ZSkKKyAgICAgICAgICAgIC5zZXREc3RBY2Nlc3NNYXNrKHZrOjpBY2Nlc3NGbGFnQml0czo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnRSZWFkIHwgdms6OkFjY2Vzc0ZsYWdCaXRzOjplRGVwdGhTdGVuY2lsQXR0YWNobWVudFdyaXRlKQorICAgICAgICAgICAgLnNldERlcGVuZGVuY3lGbGFncyh2azo6RGVwZW5kZW5jeUZsYWdzKCkpLAorICAgICAgICB2azo6U3VicGFzc0RlcGVuZGVuY3koKSAgLy8gSW1hZ2UgbGF5b3V0IHRyYW5zaXRpb24KKyAgICAgICAgICAgIC5zZXRTcmNTdWJwYXNzKFZLX1NVQlBBU1NfRVhURVJOQUwpCisgICAgICAgICAgICAuc2V0RHN0U3VicGFzcygwKQorICAgICAgICAgICAgLnNldFNyY1N0YWdlTWFzayh2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQ29sb3JBdHRhY2htZW50T3V0cHV0KQorICAgICAgICAgICAgLnNldERzdFN0YWdlTWFzayh2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplQ29sb3JBdHRhY2htZW50T3V0cHV0KQorICAgICAgICAgICAgLnNldFNyY0FjY2Vzc01hc2sodms6OkFjY2Vzc0ZsYWdCaXRzKCkpCisgICAgICAgICAgICAuc2V0RHN0QWNjZXNzTWFzayh2azo6QWNjZXNzRmxhZ0JpdHM6OmVDb2xvckF0dGFjaG1lbnRXcml0ZSB8IHZrOjpBY2Nlc3NGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudFJlYWQpCisgICAgICAgICAgICAuc2V0RGVwZW5kZW5jeUZsYWdzKHZrOjpEZXBlbmRlbmN5RmxhZ3MoKSksCisgICAgfTsKKworICAgIGF1dG8gY29uc3QgcnBfaW5mbyA9IHZrOjpSZW5kZXJQYXNzQ3JlYXRlSW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdHRhY2htZW50Q291bnQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBBdHRhY2htZW50cyhhdHRhY2htZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN1YnBhc3NDb3VudCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UFN1YnBhc3Nlcygmc3VicGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlcGVuZGVuY3lDb3VudCgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UERlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXMpOworCisgICAgYXV0byByZXN1bHQgPSBkZXZpY2UuY3JlYXRlUmVuZGVyUGFzcygmcnBfaW5mbywgbnVsbHB0ciwgJnJlbmRlcl9wYXNzKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKK30KKwordms6OlNoYWRlck1vZHVsZSBEZW1vOjpwcmVwYXJlX3NoYWRlcl9tb2R1bGUoY29uc3QgdWludDMyX3QgKmNvZGUsIHNpemVfdCBzaXplKSB7CisgICAgY29uc3QgYXV0byBtb2R1bGVDcmVhdGVJbmZvID0gdms6OlNoYWRlck1vZHVsZUNyZWF0ZUluZm8oKS5zZXRDb2RlU2l6ZShzaXplKS5zZXRQQ29kZShjb2RlKTsKKworICAgIHZrOjpTaGFkZXJNb2R1bGUgbW9kdWxlOworICAgIGF1dG8gcmVzdWx0ID0gZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSgmbW9kdWxlQ3JlYXRlSW5mbywgbnVsbHB0ciwgJm1vZHVsZSk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICByZXR1cm4gbW9kdWxlOworfQorCit2b2lkIERlbW86OnByZXBhcmVfdGV4dHVyZV9idWZmZXIoY29uc3QgY2hhciAqZmlsZW5hbWUsIHRleHR1cmVfb2JqZWN0ICp0ZXhfb2JqKSB7CisgICAgaW50MzJfdCB0ZXhfd2lkdGg7CisgICAgaW50MzJfdCB0ZXhfaGVpZ2h0OworCisgICAgaWYgKCFsb2FkVGV4dHVyZShmaWxlbmFtZSwgTlVMTCwgTlVMTCwgJnRleF93aWR0aCwgJnRleF9oZWlnaHQpKSB7CisgICAgICAgIEVSUl9FWElUKCJGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlcyIsICJMb2FkIFRleHR1cmUgRmFpbHVyZSIpOworICAgIH0KKworICAgIHRleF9vYmotPnRleF93aWR0aCA9IHRleF93aWR0aDsKKyAgICB0ZXhfb2JqLT50ZXhfaGVpZ2h0ID0gdGV4X2hlaWdodDsKKworICAgIGF1dG8gY29uc3QgYnVmZmVyX2NyZWF0ZV9pbmZvID0gdms6OkJ1ZmZlckNyZWF0ZUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTaXplKHRleF93aWR0aCAqIHRleF9oZWlnaHQgKiA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRVc2FnZSh2azo6QnVmZmVyVXNhZ2VGbGFnQml0czo6ZVRyYW5zZmVyU3JjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTaGFyaW5nTW9kZSh2azo6U2hhcmluZ01vZGU6OmVFeGNsdXNpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFF1ZXVlRmFtaWx5SW5kZXhDb3VudCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQUXVldWVGYW1pbHlJbmRpY2VzKG51bGxwdHIpOworCisgICAgYXV0byByZXN1bHQgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKCZidWZmZXJfY3JlYXRlX2luZm8sIG51bGxwdHIsICZ0ZXhfb2JqLT5idWZmZXIpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgdms6Ok1lbW9yeVJlcXVpcmVtZW50cyBtZW1fcmVxczsKKyAgICBkZXZpY2UuZ2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKHRleF9vYmotPmJ1ZmZlciwgJm1lbV9yZXFzKTsKKworICAgIHRleF9vYmotPm1lbV9hbGxvYy5zZXRBbGxvY2F0aW9uU2l6ZShtZW1fcmVxcy5zaXplKTsKKyAgICB0ZXhfb2JqLT5tZW1fYWxsb2Muc2V0TWVtb3J5VHlwZUluZGV4KDApOworCisgICAgdms6Ok1lbW9yeVByb3BlcnR5RmxhZ3MgcmVxdWlyZW1lbnRzID0gdms6Ok1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVIb3N0VmlzaWJsZSB8IHZrOjpNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplSG9zdENvaGVyZW50OworICAgIGF1dG8gcGFzcyA9IG1lbW9yeV90eXBlX2Zyb21fcHJvcGVydGllcyhtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgcmVxdWlyZW1lbnRzLCAmdGV4X29iai0+bWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCk7CisgICAgVkVSSUZZKHBhc3MgPT0gdHJ1ZSk7CisKKyAgICByZXN1bHQgPSBkZXZpY2UuYWxsb2NhdGVNZW1vcnkoJnRleF9vYmotPm1lbV9hbGxvYywgbnVsbHB0ciwgJih0ZXhfb2JqLT5tZW0pKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIHJlc3VsdCA9IGRldmljZS5iaW5kQnVmZmVyTWVtb3J5KHRleF9vYmotPmJ1ZmZlciwgdGV4X29iai0+bWVtLCAwKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIHZrOjpTdWJyZXNvdXJjZUxheW91dCBsYXlvdXQ7CisgICAgbWVtc2V0KCZsYXlvdXQsIDAsIHNpemVvZihsYXlvdXQpKTsKKyAgICBsYXlvdXQucm93UGl0Y2ggPSB0ZXhfd2lkdGggKiA0OworICAgIGF1dG8gZGF0YSA9IGRldmljZS5tYXBNZW1vcnkodGV4X29iai0+bWVtLCAwLCB0ZXhfb2JqLT5tZW1fYWxsb2MuYWxsb2NhdGlvblNpemUpOworICAgIFZFUklGWShkYXRhLnJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBpZiAoIWxvYWRUZXh0dXJlKGZpbGVuYW1lLCAodWludDhfdCAqKWRhdGEudmFsdWUsICZsYXlvdXQsICZ0ZXhfd2lkdGgsICZ0ZXhfaGVpZ2h0KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGxvYWRpbmcgdGV4dHVyZTogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBkZXZpY2UudW5tYXBNZW1vcnkodGV4X29iai0+bWVtKTsKK30KKwordm9pZCBEZW1vOjpwcmVwYXJlX3RleHR1cmVfaW1hZ2UoY29uc3QgY2hhciAqZmlsZW5hbWUsIHRleHR1cmVfb2JqZWN0ICp0ZXhfb2JqLCB2azo6SW1hZ2VUaWxpbmcgdGlsaW5nLCB2azo6SW1hZ2VVc2FnZUZsYWdzIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdms6Ok1lbW9yeVByb3BlcnR5RmxhZ3MgcmVxdWlyZWRfcHJvcHMpIHsKKyAgICBpbnQzMl90IHRleF93aWR0aDsKKyAgICBpbnQzMl90IHRleF9oZWlnaHQ7CisgICAgaWYgKCFsb2FkVGV4dHVyZShmaWxlbmFtZSwgbnVsbHB0ciwgbnVsbHB0ciwgJnRleF93aWR0aCwgJnRleF9oZWlnaHQpKSB7CisgICAgICAgIEVSUl9FWElUKCJGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlcyIsICJMb2FkIFRleHR1cmUgRmFpbHVyZSIpOworICAgIH0KKworICAgIHRleF9vYmotPnRleF93aWR0aCA9IHRleF93aWR0aDsKKyAgICB0ZXhfb2JqLT50ZXhfaGVpZ2h0ID0gdGV4X2hlaWdodDsKKworICAgIGF1dG8gY29uc3QgaW1hZ2VfY3JlYXRlX2luZm8gPSB2azo6SW1hZ2VDcmVhdGVJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbWFnZVR5cGUodms6OkltYWdlVHlwZTo6ZTJEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZvcm1hdCh2azo6Rm9ybWF0OjplUjhHOEI4QThVbm9ybSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFeHRlbnQoeyh1aW50MzJfdCl0ZXhfd2lkdGgsICh1aW50MzJfdCl0ZXhfaGVpZ2h0LCAxfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNaXBMZXZlbHMoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBcnJheUxheWVycygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNhbXBsZXModms6OlNhbXBsZUNvdW50RmxhZ0JpdHM6OmUxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRpbGluZyh0aWxpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VXNhZ2UodXNhZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2hhcmluZ01vZGUodms6OlNoYXJpbmdNb2RlOjplRXhjbHVzaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFF1ZXVlRmFtaWx5SW5kZXhDb3VudCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBRdWV1ZUZhbWlseUluZGljZXMobnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsTGF5b3V0KHZrOjpJbWFnZUxheW91dDo6ZVByZWluaXRpYWxpemVkKTsKKworICAgIGF1dG8gcmVzdWx0ID0gZGV2aWNlLmNyZWF0ZUltYWdlKCZpbWFnZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnRleF9vYmotPmltYWdlKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIHZrOjpNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisgICAgZGV2aWNlLmdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKHRleF9vYmotPmltYWdlLCAmbWVtX3JlcXMpOworCisgICAgdGV4X29iai0+bWVtX2FsbG9jLnNldEFsbG9jYXRpb25TaXplKG1lbV9yZXFzLnNpemUpOworICAgIHRleF9vYmotPm1lbV9hbGxvYy5zZXRNZW1vcnlUeXBlSW5kZXgoMCk7CisKKyAgICBhdXRvIHBhc3MgPSBtZW1vcnlfdHlwZV9mcm9tX3Byb3BlcnRpZXMobWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsIHJlcXVpcmVkX3Byb3BzLCAmdGV4X29iai0+bWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCk7CisgICAgVkVSSUZZKHBhc3MgPT0gdHJ1ZSk7CisKKyAgICByZXN1bHQgPSBkZXZpY2UuYWxsb2NhdGVNZW1vcnkoJnRleF9vYmotPm1lbV9hbGxvYywgbnVsbHB0ciwgJih0ZXhfb2JqLT5tZW0pKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIHJlc3VsdCA9IGRldmljZS5iaW5kSW1hZ2VNZW1vcnkodGV4X29iai0+aW1hZ2UsIHRleF9vYmotPm1lbSwgMCk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBpZiAocmVxdWlyZWRfcHJvcHMgJiB2azo6TWVtb3J5UHJvcGVydHlGbGFnQml0czo6ZUhvc3RWaXNpYmxlKSB7CisgICAgICAgIGF1dG8gY29uc3Qgc3VicmVzID0gdms6OkltYWdlU3VicmVzb3VyY2UoKS5zZXRBc3BlY3RNYXNrKHZrOjpJbWFnZUFzcGVjdEZsYWdCaXRzOjplQ29sb3IpLnNldE1pcExldmVsKDApLnNldEFycmF5TGF5ZXIoMCk7CisgICAgICAgIHZrOjpTdWJyZXNvdXJjZUxheW91dCBsYXlvdXQ7CisgICAgICAgIGRldmljZS5nZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KHRleF9vYmotPmltYWdlLCAmc3VicmVzLCAmbGF5b3V0KTsKKworICAgICAgICBhdXRvIGRhdGEgPSBkZXZpY2UubWFwTWVtb3J5KHRleF9vYmotPm1lbSwgMCwgdGV4X29iai0+bWVtX2FsbG9jLmFsbG9jYXRpb25TaXplKTsKKyAgICAgICAgVkVSSUZZKGRhdGEucmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgICAgICBpZiAoIWxvYWRUZXh0dXJlKGZpbGVuYW1lLCAodWludDhfdCAqKWRhdGEudmFsdWUsICZsYXlvdXQsICZ0ZXhfd2lkdGgsICZ0ZXhfaGVpZ2h0KSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBsb2FkaW5nIHRleHR1cmU6ICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBkZXZpY2UudW5tYXBNZW1vcnkodGV4X29iai0+bWVtKTsKKyAgICB9CisKKyAgICB0ZXhfb2JqLT5pbWFnZUxheW91dCA9IHZrOjpJbWFnZUxheW91dDo6ZVNoYWRlclJlYWRPbmx5T3B0aW1hbDsKK30KKwordm9pZCBEZW1vOjpwcmVwYXJlX3RleHR1cmVzKCkgeworICAgIHZrOjpGb3JtYXQgY29uc3QgdGV4X2Zvcm1hdCA9IHZrOjpGb3JtYXQ6OmVSOEc4QjhBOFVub3JtOworICAgIHZrOjpGb3JtYXRQcm9wZXJ0aWVzIHByb3BzOworICAgIGdwdS5nZXRGb3JtYXRQcm9wZXJ0aWVzKHRleF9mb3JtYXQsICZwcm9wcyk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdGV4dHVyZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGlmICgocHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgJiB2azo6Rm9ybWF0RmVhdHVyZUZsYWdCaXRzOjplU2FtcGxlZEltYWdlKSAmJiAhdXNlX3N0YWdpbmdfYnVmZmVyKSB7CisgICAgICAgICAgICAvKiBEZXZpY2UgY2FuIHRleHR1cmUgdXNpbmcgbGluZWFyIHRleHR1cmVzICovCisgICAgICAgICAgICBwcmVwYXJlX3RleHR1cmVfaW1hZ2UodGV4X2ZpbGVzW2ldLCAmdGV4dHVyZXNbaV0sIHZrOjpJbWFnZVRpbGluZzo6ZUxpbmVhciwgdms6OkltYWdlVXNhZ2VGbGFnQml0czo6ZVNhbXBsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdms6Ok1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVIb3N0VmlzaWJsZSB8IHZrOjpNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzOjplSG9zdENvaGVyZW50KTsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgaW4gdGhlIHBpcGVsaW5lIG5lZWRzIHRvIGJlIGNvbXBsZXRlIHRvIHN0YXJ0LCBhbmQgZG9uJ3QgYWxsb3cgZnJhZ21lbnQKKyAgICAgICAgICAgIC8vIHNoYWRlciB0byBydW4gdW50aWwgbGF5b3V0IHRyYW5zaXRpb24gY29tcGxldGVzCisgICAgICAgICAgICBzZXRfaW1hZ2VfbGF5b3V0KHRleHR1cmVzW2ldLmltYWdlLCB2azo6SW1hZ2VBc3BlY3RGbGFnQml0czo6ZUNvbG9yLCB2azo6SW1hZ2VMYXlvdXQ6OmVQcmVpbml0aWFsaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXNbaV0uaW1hZ2VMYXlvdXQsIHZrOjpBY2Nlc3NGbGFnQml0cygpLCB2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVG9wT2ZQaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplRnJhZ21lbnRTaGFkZXIpOworICAgICAgICAgICAgc3RhZ2luZ190ZXh0dXJlLmltYWdlID0gdms6OkltYWdlKCk7CisgICAgICAgIH0gZWxzZSBpZiAocHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgdms6OkZvcm1hdEZlYXR1cmVGbGFnQml0czo6ZVNhbXBsZWRJbWFnZSkgeworICAgICAgICAgICAgLyogTXVzdCB1c2Ugc3RhZ2luZyBidWZmZXIgdG8gY29weSBsaW5lYXIgdGV4dHVyZSB0byBvcHRpbWl6ZWQgKi8KKworICAgICAgICAgICAgcHJlcGFyZV90ZXh0dXJlX2J1ZmZlcih0ZXhfZmlsZXNbaV0sICZzdGFnaW5nX3RleHR1cmUpOworCisgICAgICAgICAgICBwcmVwYXJlX3RleHR1cmVfaW1hZ2UodGV4X2ZpbGVzW2ldLCAmdGV4dHVyZXNbaV0sIHZrOjpJbWFnZVRpbGluZzo6ZU9wdGltYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdms6OkltYWdlVXNhZ2VGbGFnQml0czo6ZVRyYW5zZmVyRHN0IHwgdms6OkltYWdlVXNhZ2VGbGFnQml0czo6ZVNhbXBsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdms6Ok1lbW9yeVByb3BlcnR5RmxhZ0JpdHM6OmVEZXZpY2VMb2NhbCk7CisKKyAgICAgICAgICAgIHNldF9pbWFnZV9sYXlvdXQodGV4dHVyZXNbaV0uaW1hZ2UsIHZrOjpJbWFnZUFzcGVjdEZsYWdCaXRzOjplQ29sb3IsIHZrOjpJbWFnZUxheW91dDo6ZVByZWluaXRpYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2azo6SW1hZ2VMYXlvdXQ6OmVUcmFuc2ZlckRzdE9wdGltYWwsIHZrOjpBY2Nlc3NGbGFnQml0cygpLCB2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVG9wT2ZQaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplVHJhbnNmZXIpOworCisgICAgICAgICAgICBhdXRvIGNvbnN0IHN1YnJlc291cmNlID0gdms6OkltYWdlU3VicmVzb3VyY2VMYXllcnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXNwZWN0TWFzayh2azo6SW1hZ2VBc3BlY3RGbGFnQml0czo6ZUNvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWlwTGV2ZWwoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEJhc2VBcnJheUxheWVyKDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXllckNvdW50KDEpOworCisgICAgICAgICAgICBhdXRvIGNvbnN0IGNvcHlfcmVnaW9uID0KKyAgICAgICAgICAgICAgICB2azo6QnVmZmVySW1hZ2VDb3B5KCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEJ1ZmZlck9mZnNldCgwKQorICAgICAgICAgICAgICAgICAgICAuc2V0QnVmZmVyUm93TGVuZ3RoKHN0YWdpbmdfdGV4dHVyZS50ZXhfd2lkdGgpCisgICAgICAgICAgICAgICAgICAgIC5zZXRCdWZmZXJJbWFnZUhlaWdodChzdGFnaW5nX3RleHR1cmUudGV4X2hlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEltYWdlU3VicmVzb3VyY2Uoc3VicmVzb3VyY2UpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbWFnZU9mZnNldCh7MCwgMCwgMH0pCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbWFnZUV4dGVudCh7KHVpbnQzMl90KXN0YWdpbmdfdGV4dHVyZS50ZXhfd2lkdGgsICh1aW50MzJfdClzdGFnaW5nX3RleHR1cmUudGV4X2hlaWdodCwgMX0pOworCisgICAgICAgICAgICBjbWQuY29weUJ1ZmZlclRvSW1hZ2Uoc3RhZ2luZ190ZXh0dXJlLmJ1ZmZlciwgdGV4dHVyZXNbaV0uaW1hZ2UsIHZrOjpJbWFnZUxheW91dDo6ZVRyYW5zZmVyRHN0T3B0aW1hbCwgMSwgJmNvcHlfcmVnaW9uKTsKKworICAgICAgICAgICAgc2V0X2ltYWdlX2xheW91dCh0ZXh0dXJlc1tpXS5pbWFnZSwgdms6OkltYWdlQXNwZWN0RmxhZ0JpdHM6OmVDb2xvciwgdms6OkltYWdlTGF5b3V0OjplVHJhbnNmZXJEc3RPcHRpbWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlc1tpXS5pbWFnZUxheW91dCwgdms6OkFjY2Vzc0ZsYWdCaXRzOjplVHJhbnNmZXJXcml0ZSwgdms6OlBpcGVsaW5lU3RhZ2VGbGFnQml0czo6ZVRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2azo6UGlwZWxpbmVTdGFnZUZsYWdCaXRzOjplRnJhZ21lbnRTaGFkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KCEiTm8gc3VwcG9ydCBmb3IgUjhHOEI4QThfVU5PUk0gYXMgdGV4dHVyZSBpbWFnZSBmb3JtYXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gY29uc3Qgc2FtcGxlckluZm8gPSB2azo6U2FtcGxlckNyZWF0ZUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNYWdGaWx0ZXIodms6OkZpbHRlcjo6ZU5lYXJlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1pbkZpbHRlcih2azo6RmlsdGVyOjplTmVhcmVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWlwbWFwTW9kZSh2azo6U2FtcGxlck1pcG1hcE1vZGU6OmVOZWFyZXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBZGRyZXNzTW9kZVUodms6OlNhbXBsZXJBZGRyZXNzTW9kZTo6ZUNsYW1wVG9FZGdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBZGRyZXNzTW9kZVYodms6OlNhbXBsZXJBZGRyZXNzTW9kZTo6ZUNsYW1wVG9FZGdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBZGRyZXNzTW9kZVcodms6OlNhbXBsZXJBZGRyZXNzTW9kZTo6ZUNsYW1wVG9FZGdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNaXBMb2RCaWFzKDAuMGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFuaXNvdHJvcHlFbmFibGUoVktfRkFMU0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1heEFuaXNvdHJvcHkoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tcGFyZUVuYWJsZShWS19GQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tcGFyZU9wKHZrOjpDb21wYXJlT3A6OmVOZXZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWluTG9kKDAuMGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1heExvZCgwLjBmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCb3JkZXJDb2xvcih2azo6Qm9yZGVyQ29sb3I6OmVGbG9hdE9wYXF1ZVdoaXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRVbm5vcm1hbGl6ZWRDb29yZGluYXRlcyhWS19GQUxTRSk7CisKKyAgICAgICAgYXV0byByZXN1bHQgPSBkZXZpY2UuY3JlYXRlU2FtcGxlcigmc2FtcGxlckluZm8sIG51bGxwdHIsICZ0ZXh0dXJlc1tpXS5zYW1wbGVyKTsKKyAgICAgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICAgICAgYXV0byBjb25zdCB2aWV3SW5mbyA9IHZrOjpJbWFnZVZpZXdDcmVhdGVJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW1hZ2UodGV4dHVyZXNbaV0uaW1hZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZpZXdUeXBlKHZrOjpJbWFnZVZpZXdUeXBlOjplMkQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZvcm1hdCh0ZXhfZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdWJyZXNvdXJjZVJhbmdlKHZrOjpJbWFnZVN1YnJlc291cmNlUmFuZ2Uodms6OkltYWdlQXNwZWN0RmxhZ0JpdHM6OmVDb2xvciwgMCwgMSwgMCwgMSkpOworCisgICAgICAgIHJlc3VsdCA9IGRldmljZS5jcmVhdGVJbWFnZVZpZXcoJnZpZXdJbmZvLCBudWxscHRyLCAmdGV4dHVyZXNbaV0udmlldyk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworICAgIH0KK30KKwordms6OlNoYWRlck1vZHVsZSBEZW1vOjpwcmVwYXJlX3ZzKCkgeworICAgIGNvbnN0IHVpbnQzMl90IHZlcnRTaGFkZXJDb2RlW10gPSB7CisjaW5jbHVkZSAiY3ViZS52ZXJ0LmluYyIKKyAgICB9OworCisgICAgdmVydF9zaGFkZXJfbW9kdWxlID0gcHJlcGFyZV9zaGFkZXJfbW9kdWxlKHZlcnRTaGFkZXJDb2RlLCBzaXplb2YodmVydFNoYWRlckNvZGUpKTsKKworICAgIHJldHVybiB2ZXJ0X3NoYWRlcl9tb2R1bGU7Cit9CisKK3ZvaWQgRGVtbzo6cmVzaXplKCkgeworICAgIHVpbnQzMl90IGk7CisKKyAgICAvLyBEb24ndCByZWFjdCB0byByZXNpemUgdW50aWwgYWZ0ZXIgZmlyc3QgaW5pdGlhbGl6YXRpb24uCisgICAgaWYgKCFwcmVwYXJlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW4gb3JkZXIgdG8gcHJvcGVybHkgcmVzaXplIHRoZSB3aW5kb3csIHdlIG11c3QgcmUtY3JlYXRlIHRoZQorICAgIC8vIHN3YXBjaGFpbgorICAgIC8vIEFORCByZWRvIHRoZSBjb21tYW5kIGJ1ZmZlcnMsIGV0Yy4KKyAgICAvLworICAgIC8vIEZpcnN0LCBwZXJmb3JtIHBhcnQgb2YgdGhlIGNsZWFudXAoKSBmdW5jdGlvbjoKKyAgICBwcmVwYXJlZCA9IGZhbHNlOworICAgIGF1dG8gcmVzdWx0ID0gZGV2aWNlLndhaXRJZGxlKCk7CisgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgIGRldmljZS5kZXN0cm95RnJhbWVidWZmZXIoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tpXS5mcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgfQorCisgICAgZGV2aWNlLmRlc3Ryb3lEZXNjcmlwdG9yUG9vbChkZXNjX3Bvb2wsIG51bGxwdHIpOworCisgICAgZGV2aWNlLmRlc3Ryb3lQaXBlbGluZShwaXBlbGluZSwgbnVsbHB0cik7CisgICAgZGV2aWNlLmRlc3Ryb3lQaXBlbGluZUNhY2hlKHBpcGVsaW5lQ2FjaGUsIG51bGxwdHIpOworICAgIGRldmljZS5kZXN0cm95UmVuZGVyUGFzcyhyZW5kZXJfcGFzcywgbnVsbHB0cik7CisgICAgZGV2aWNlLmRlc3Ryb3lQaXBlbGluZUxheW91dChwaXBlbGluZV9sYXlvdXQsIG51bGxwdHIpOworICAgIGRldmljZS5kZXN0cm95RGVzY3JpcHRvclNldExheW91dChkZXNjX2xheW91dCwgbnVsbHB0cik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGV4dHVyZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGRldmljZS5kZXN0cm95SW1hZ2VWaWV3KHRleHR1cmVzW2ldLnZpZXcsIG51bGxwdHIpOworICAgICAgICBkZXZpY2UuZGVzdHJveUltYWdlKHRleHR1cmVzW2ldLmltYWdlLCBudWxscHRyKTsKKyAgICAgICAgZGV2aWNlLmZyZWVNZW1vcnkodGV4dHVyZXNbaV0ubWVtLCBudWxscHRyKTsKKyAgICAgICAgZGV2aWNlLmRlc3Ryb3lTYW1wbGVyKHRleHR1cmVzW2ldLnNhbXBsZXIsIG51bGxwdHIpOworICAgIH0KKworICAgIGRldmljZS5kZXN0cm95SW1hZ2VWaWV3KGRlcHRoLnZpZXcsIG51bGxwdHIpOworICAgIGRldmljZS5kZXN0cm95SW1hZ2UoZGVwdGguaW1hZ2UsIG51bGxwdHIpOworICAgIGRldmljZS5mcmVlTWVtb3J5KGRlcHRoLm1lbSwgbnVsbHB0cik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgIGRldmljZS5kZXN0cm95SW1hZ2VWaWV3KHN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udmlldywgbnVsbHB0cik7CisgICAgICAgIGRldmljZS5mcmVlQ29tbWFuZEJ1ZmZlcnMoY21kX3Bvb2wsIDEsICZzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLmNtZCk7CisgICAgICAgIGRldmljZS5kZXN0cm95QnVmZmVyKHN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbaV0udW5pZm9ybV9idWZmZXIsIG51bGxwdHIpOworICAgICAgICBkZXZpY2UuZnJlZU1lbW9yeShzd2FwY2hhaW5faW1hZ2VfcmVzb3VyY2VzW2ldLnVuaWZvcm1fbWVtb3J5LCBudWxscHRyKTsKKyAgICB9CisKKyAgICBkZXZpY2UuZGVzdHJveUNvbW1hbmRQb29sKGNtZF9wb29sLCBudWxscHRyKTsKKyAgICBpZiAoc2VwYXJhdGVfcHJlc2VudF9xdWV1ZSkgeworICAgICAgICBkZXZpY2UuZGVzdHJveUNvbW1hbmRQb29sKHByZXNlbnRfY21kX3Bvb2wsIG51bGxwdHIpOworICAgIH0KKworICAgIC8vIFNlY29uZCwgcmUtcGVyZm9ybSB0aGUgcHJlcGFyZSgpIGZ1bmN0aW9uLCB3aGljaCB3aWxsIHJlLWNyZWF0ZSB0aGUKKyAgICAvLyBzd2FwY2hhaW4uCisgICAgcHJlcGFyZSgpOworfQorCit2b2lkIERlbW86OnNldF9pbWFnZV9sYXlvdXQodms6OkltYWdlIGltYWdlLCB2azo6SW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrLCB2azo6SW1hZ2VMYXlvdXQgb2xkTGF5b3V0LCB2azo6SW1hZ2VMYXlvdXQgbmV3TGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrOjpBY2Nlc3NGbGFncyBzcmNBY2Nlc3NNYXNrLCB2azo6UGlwZWxpbmVTdGFnZUZsYWdzIHNyY19zdGFnZXMsIHZrOjpQaXBlbGluZVN0YWdlRmxhZ3MgZGVzdF9zdGFnZXMpIHsKKyAgICBhc3NlcnQoY21kKTsKKworICAgIGF1dG8gRHN0QWNjZXNzTWFzayA9IFtdKHZrOjpJbWFnZUxheW91dCBjb25zdCAmbGF5b3V0KSB7CisgICAgICAgIHZrOjpBY2Nlc3NGbGFncyBmbGFnczsKKworICAgICAgICBzd2l0Y2ggKGxheW91dCkgeworICAgICAgICAgICAgY2FzZSB2azo6SW1hZ2VMYXlvdXQ6OmVUcmFuc2ZlckRzdE9wdGltYWw6CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFueXRoaW5nIHRoYXQgd2FzIGNvcHlpbmcgZnJvbSB0aGlzIGltYWdlIGhhcworICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgIGZsYWdzID0gdms6OkFjY2Vzc0ZsYWdCaXRzOjplVHJhbnNmZXJXcml0ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugdms6OkltYWdlTGF5b3V0OjplQ29sb3JBdHRhY2htZW50T3B0aW1hbDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IHZrOjpBY2Nlc3NGbGFnQml0czo6ZUNvbG9yQXR0YWNobWVudFdyaXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB2azo6SW1hZ2VMYXlvdXQ6OmVEZXB0aFN0ZW5jaWxBdHRhY2htZW50T3B0aW1hbDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IHZrOjpBY2Nlc3NGbGFnQml0czo6ZURlcHRoU3RlbmNpbEF0dGFjaG1lbnRXcml0ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugdms6OkltYWdlTGF5b3V0OjplU2hhZGVyUmVhZE9ubHlPcHRpbWFsOgorICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbnkgQ29weSBvciBDUFUgd3JpdGVzIHRvIGltYWdlIGFyZSBmbHVzaGVkCisgICAgICAgICAgICAgICAgZmxhZ3MgPSB2azo6QWNjZXNzRmxhZ0JpdHM6OmVTaGFkZXJSZWFkIHwgdms6OkFjY2Vzc0ZsYWdCaXRzOjplSW5wdXRBdHRhY2htZW50UmVhZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugdms6OkltYWdlTGF5b3V0OjplVHJhbnNmZXJTcmNPcHRpbWFsOgorICAgICAgICAgICAgICAgIGZsYWdzID0gdms6OkFjY2Vzc0ZsYWdCaXRzOjplVHJhbnNmZXJSZWFkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB2azo6SW1hZ2VMYXlvdXQ6OmVQcmVzZW50U3JjS0hSOgorICAgICAgICAgICAgICAgIGZsYWdzID0gdms6OkFjY2Vzc0ZsYWdCaXRzOjplTWVtb3J5UmVhZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmxhZ3M7CisgICAgfTsKKworICAgIGF1dG8gY29uc3QgYmFycmllciA9IHZrOjpJbWFnZU1lbW9yeUJhcnJpZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3JjQWNjZXNzTWFzayhzcmNBY2Nlc3NNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RHN0QWNjZXNzTWFzayhEc3RBY2Nlc3NNYXNrKG5ld0xheW91dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPbGRMYXlvdXQob2xkTGF5b3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmV3TGF5b3V0KG5ld0xheW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNyY1F1ZXVlRmFtaWx5SW5kZXgoVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREc3RRdWV1ZUZhbWlseUluZGV4KFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW1hZ2UoaW1hZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdWJyZXNvdXJjZVJhbmdlKHZrOjpJbWFnZVN1YnJlc291cmNlUmFuZ2UoYXNwZWN0TWFzaywgMCwgMSwgMCwgMSkpOworCisgICAgY21kLnBpcGVsaW5lQmFycmllcihzcmNfc3RhZ2VzLCBkZXN0X3N0YWdlcywgdms6OkRlcGVuZGVuY3lGbGFnQml0cygpLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmYmFycmllcik7Cit9CisKK3ZvaWQgRGVtbzo6dXBkYXRlX2RhdGFfYnVmZmVyKCkgeworICAgIG1hdDR4NCBWUDsKKyAgICBtYXQ0eDRfbXVsKFZQLCBwcm9qZWN0aW9uX21hdHJpeCwgdmlld19tYXRyaXgpOworCisgICAgLy8gUm90YXRlIGFyb3VuZCB0aGUgWSBheGlzCisgICAgbWF0NHg0IE1vZGVsOworICAgIG1hdDR4NF9kdXAoTW9kZWwsIG1vZGVsX21hdHJpeCk7CisgICAgbWF0NHg0X3JvdGF0ZShtb2RlbF9tYXRyaXgsIE1vZGVsLCAwLjBmLCAxLjBmLCAwLjBmLCAoZmxvYXQpZGVncmVlc1RvUmFkaWFucyhzcGluX2FuZ2xlKSk7CisKKyAgICBtYXQ0eDQgTVZQOworICAgIG1hdDR4NF9tdWwoTVZQLCBWUCwgbW9kZWxfbWF0cml4KTsKKworICAgIGF1dG8gZGF0YSA9IGRldmljZS5tYXBNZW1vcnkoc3dhcGNoYWluX2ltYWdlX3Jlc291cmNlc1tjdXJyZW50X2J1ZmZlcl0udW5pZm9ybV9tZW1vcnksIDAsIFZLX1dIT0xFX1NJWkUsIHZrOjpNZW1vcnlNYXBGbGFncygpKTsKKyAgICBWRVJJRlkoZGF0YS5yZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgbWVtY3B5KGRhdGEudmFsdWUsIChjb25zdCB2b2lkICopJk1WUFswXVswXSwgc2l6ZW9mKE1WUCkpOworCisgICAgZGV2aWNlLnVubWFwTWVtb3J5KHN3YXBjaGFpbl9pbWFnZV9yZXNvdXJjZXNbY3VycmVudF9idWZmZXJdLnVuaWZvcm1fbWVtb3J5KTsKK30KKworLyogQ29udmVydCBwcG0gaW1hZ2UgZGF0YSBmcm9tIGhlYWRlciBmaWxlIGludG8gUkdCQSB0ZXh0dXJlIGltYWdlICovCisjaW5jbHVkZSAibHVuYXJnLnBwbS5oIgorYm9vbCBEZW1vOjpsb2FkVGV4dHVyZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdWludDhfdCAqcmdiYV9kYXRhLCB2azo6U3VicmVzb3VyY2VMYXlvdXQgKmxheW91dCwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgeworICAgICh2b2lkKWZpbGVuYW1lOworICAgIGNoYXIgKmNQdHI7CisgICAgY1B0ciA9IChjaGFyICopbHVuYXJnX3BwbTsKKyAgICBpZiAoKHVuc2lnbmVkIGNoYXIgKiljUHRyID49IChsdW5hcmdfcHBtICsgbHVuYXJnX3BwbV9sZW4pIHx8IHN0cm5jbXAoY1B0ciwgIlA2XG4iLCAzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHdoaWxlIChzdHJuY21wKGNQdHIrKywgIlxuIiwgMSkpCisgICAgICAgIDsKKyAgICBzc2NhbmYoY1B0ciwgIiV1ICV1Iiwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJnYmFfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB3aGlsZSAoc3RybmNtcChjUHRyKyssICJcbiIsIDEpKQorICAgICAgICA7CisgICAgaWYgKCh1bnNpZ25lZCBjaGFyICopY1B0ciA+PSAobHVuYXJnX3BwbSArIGx1bmFyZ19wcG1fbGVuKSB8fCBzdHJuY21wKGNQdHIsICIyNTVcbiIsIDQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgd2hpbGUgKHN0cm5jbXAoY1B0cisrLCAiXG4iLCAxKSkKKyAgICAgICAgOworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgKmhlaWdodDsgeSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKnJvd1B0ciA9IHJnYmFfZGF0YTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAqd2lkdGg7IHgrKykgeworICAgICAgICAgICAgbWVtY3B5KHJvd1B0ciwgY1B0ciwgMyk7CisgICAgICAgICAgICByb3dQdHJbM10gPSAyNTU7IC8qIEFscGhhIG9mIDEgKi8KKyAgICAgICAgICAgIHJvd1B0ciArPSA0OworICAgICAgICAgICAgY1B0ciArPSAzOworICAgICAgICB9CisgICAgICAgIHJnYmFfZGF0YSArPSBsYXlvdXQtPnJvd1BpdGNoOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZW1vOjptZW1vcnlfdHlwZV9mcm9tX3Byb3BlcnRpZXModWludDMyX3QgdHlwZUJpdHMsIHZrOjpNZW1vcnlQcm9wZXJ0eUZsYWdzIHJlcXVpcmVtZW50c19tYXNrLCB1aW50MzJfdCAqdHlwZUluZGV4KSB7CisgICAgLy8gU2VhcmNoIG1lbXR5cGVzIHRvIGZpbmQgZmlyc3QgaW5kZXggd2l0aCB0aG9zZSBwcm9wZXJ0aWVzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9NRU1PUllfVFlQRVM7IGkrKykgeworICAgICAgICBpZiAoKHR5cGVCaXRzICYgMSkgPT0gMSkgeworICAgICAgICAgICAgLy8gVHlwZSBpcyBhdmFpbGFibGUsIGRvZXMgaXQgbWF0Y2ggdXNlciBwcm9wZXJ0aWVzPworICAgICAgICAgICAgaWYgKChtZW1vcnlfcHJvcGVydGllcy5tZW1vcnlUeXBlc1tpXS5wcm9wZXJ0eUZsYWdzICYgcmVxdWlyZW1lbnRzX21hc2spID09IHJlcXVpcmVtZW50c19tYXNrKSB7CisgICAgICAgICAgICAgICAgKnR5cGVJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHlwZUJpdHMgPj49IDE7CisgICAgfQorCisgICAgLy8gTm8gbWVtb3J5IHR5cGVzIG1hdGNoZWQsIHJldHVybiBmYWlsdXJlCisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKQordm9pZCBEZW1vOjpydW4oKSB7CisgICAgaWYgKCFwcmVwYXJlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZHJhdygpOworICAgIGN1ckZyYW1lKys7CisKKyAgICBpZiAoZnJhbWVDb3VudCAhPSBVSU5UMzJfTUFYICYmIGN1ckZyYW1lID09IGZyYW1lQ291bnQpIHsKKyAgICAgICAgUG9zdFF1aXRNZXNzYWdlKHZhbGlkYXRpb25fZXJyb3IpOworICAgIH0KK30KKwordm9pZCBEZW1vOjpjcmVhdGVfd2luZG93KCkgeworICAgIFdORENMQVNTRVggd2luX2NsYXNzOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgd2luZG93IGNsYXNzIHN0cnVjdHVyZToKKyAgICB3aW5fY2xhc3MuY2JTaXplID0gc2l6ZW9mKFdORENMQVNTRVgpOworICAgIHdpbl9jbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOworICAgIHdpbl9jbGFzcy5scGZuV25kUHJvYyA9IFduZFByb2M7CisgICAgd2luX2NsYXNzLmNiQ2xzRXh0cmEgPSAwOworICAgIHdpbl9jbGFzcy5jYlduZEV4dHJhID0gMDsKKyAgICB3aW5fY2xhc3MuaEluc3RhbmNlID0gY29ubmVjdGlvbjsgIC8vIGhJbnN0YW5jZQorICAgIHdpbl9jbGFzcy5oSWNvbiA9IExvYWRJY29uKG51bGxwdHIsIElESV9BUFBMSUNBVElPTik7CisgICAgd2luX2NsYXNzLmhDdXJzb3IgPSBMb2FkQ3Vyc29yKG51bGxwdHIsIElEQ19BUlJPVyk7CisgICAgd2luX2NsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKKyAgICB3aW5fY2xhc3MubHBzek1lbnVOYW1lID0gbnVsbHB0cjsKKyAgICB3aW5fY2xhc3MubHBzekNsYXNzTmFtZSA9IG5hbWU7CisgICAgd2luX2NsYXNzLmhJY29uU20gPSBMb2FkSWNvbihudWxscHRyLCBJRElfV0lOTE9HTyk7CisKKyAgICAvLyBSZWdpc3RlciB3aW5kb3cgY2xhc3M6CisgICAgaWYgKCFSZWdpc3RlckNsYXNzRXgoJndpbl9jbGFzcykpIHsKKyAgICAgICAgLy8gSXQgZGlkbid0IHdvcmssIHNvIHRyeSB0byBnaXZlIGEgdXNlZnVsIGVycm9yOgorICAgICAgICBwcmludGYoIlVuZXhwZWN0ZWQgZXJyb3IgdHJ5aW5nIHRvIHN0YXJ0IHRoZSBhcHBsaWNhdGlvbiFcbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgd2luZG93IHdpdGggdGhlIHJlZ2lzdGVyZWQgY2xhc3M6CisgICAgUkVDVCB3ciA9IHswLCAwLCBzdGF0aWNfY2FzdDxMT05HPih3aWR0aCksIHN0YXRpY19jYXN0PExPTkc+KGhlaWdodCl9OworICAgIEFkanVzdFdpbmRvd1JlY3QoJndyLCBXU19PVkVSTEFQUEVEV0lORE9XLCBGQUxTRSk7CisgICAgd2luZG93ID0gQ3JlYXRlV2luZG93RXgoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgIC8vIGFwcCBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfT1ZFUkxBUFBFRFdJTkRPVyB8ICAvLyB3aW5kb3cgc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfVklTSUJMRSB8IFdTX1NZU01FTlUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAxMDAsICAgICAgICAgICAgLy8geC95IGNvb3JkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyLnJpZ2h0IC0gd3IubGVmdCwgIC8vIHdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3IuYm90dG9tIC0gd3IudG9wLCAgLy8gaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAgLy8gaGFuZGxlIHRvIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICAgICAgICAgICAgIC8vIGhhbmRsZSB0byBtZW51CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgICAgICAgICAgLy8gaEluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7ICAgICAgICAgICAgLy8gbm8gZXh0cmEgcGFyYW1ldGVycworCisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgLy8gSXQgZGlkbid0IHdvcmssIHNvIHRyeSB0byBnaXZlIGEgdXNlZnVsIGVycm9yOgorICAgICAgICBwcmludGYoIkNhbm5vdCBjcmVhdGUgYSB3aW5kb3cgaW4gd2hpY2ggdG8gZHJhdyFcbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBXaW5kb3cgY2xpZW50IGFyZWEgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDEgcGl4ZWwgaGlnaCwgdG8gcHJldmVudAorICAgIC8vIGNyYXNoLgorICAgIG1pbnNpemUueCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hNSU5UUkFDSyk7CisgICAgbWluc2l6ZS55ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWU1JTlRSQUNLKSArIDE7Cit9CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikKKwordm9pZCBEZW1vOjpjcmVhdGVfeGxpYl93aW5kb3coKSB7CisgICAgY29uc3QgY2hhciAqZGlzcGxheV9lbnZhciA9IGdldGVudigiRElTUExBWSIpOworICAgIGlmIChkaXNwbGF5X2VudmFyID09IG51bGxwdHIgfHwgZGlzcGxheV9lbnZhclswXSA9PSAnXDAnKSB7CisgICAgICAgIHByaW50ZigiRW52aXJvbm1lbnQgdmFyaWFibGUgRElTUExBWSByZXF1aXJlcyBhIHZhbGlkIHZhbHVlLlxuRXhpdGluZyAuLi5cbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBYSW5pdFRocmVhZHMoKTsKKyAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KG51bGxwdHIpOworICAgIGxvbmcgdmlzdWFsTWFzayA9IFZpc3VhbFNjcmVlbk1hc2s7CisgICAgaW50IG51bWJlck9mVmlzdWFsczsKKyAgICBYVmlzdWFsSW5mbyB2SW5mb1RlbXBsYXRlID0ge307CisgICAgdkluZm9UZW1wbGF0ZS5zY3JlZW4gPSBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOworICAgIFhWaXN1YWxJbmZvICp2aXN1YWxJbmZvID0gWEdldFZpc3VhbEluZm8oZGlzcGxheSwgdmlzdWFsTWFzaywgJnZJbmZvVGVtcGxhdGUsICZudW1iZXJPZlZpc3VhbHMpOworCisgICAgQ29sb3JtYXAgY29sb3JtYXAgPSBYQ3JlYXRlQ29sb3JtYXAoZGlzcGxheSwgUm9vdFdpbmRvdyhkaXNwbGF5LCB2SW5mb1RlbXBsYXRlLnNjcmVlbiksIHZpc3VhbEluZm8tPnZpc3VhbCwgQWxsb2NOb25lKTsKKworICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIHdpbmRvd0F0dHJpYnV0ZXMgPSB7fTsKKyAgICB3aW5kb3dBdHRyaWJ1dGVzLmNvbG9ybWFwID0gY29sb3JtYXA7CisgICAgd2luZG93QXR0cmlidXRlcy5iYWNrZ3JvdW5kX3BpeGVsID0gMHhGRkZGRkZGRjsKKyAgICB3aW5kb3dBdHRyaWJ1dGVzLmJvcmRlcl9waXhlbCA9IDA7CisgICAgd2luZG93QXR0cmlidXRlcy5ldmVudF9tYXNrID0gS2V5UHJlc3NNYXNrIHwgS2V5UmVsZWFzZU1hc2sgfCBTdHJ1Y3R1cmVOb3RpZnlNYXNrIHwgRXhwb3N1cmVNYXNrOworCisgICAgeGxpYl93aW5kb3cgPQorICAgICAgICBYQ3JlYXRlV2luZG93KGRpc3BsYXksIFJvb3RXaW5kb3coZGlzcGxheSwgdkluZm9UZW1wbGF0ZS5zY3JlZW4pLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCB2aXN1YWxJbmZvLT5kZXB0aCwgSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsSW5mby0+dmlzdWFsLCBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWwgfCBDV0V2ZW50TWFzayB8IENXQ29sb3JtYXAsICZ3aW5kb3dBdHRyaWJ1dGVzKTsKKworICAgIFhTZWxlY3RJbnB1dChkaXNwbGF5LCB4bGliX3dpbmRvdywgRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrKTsKKyAgICBYTWFwV2luZG93KGRpc3BsYXksIHhsaWJfd2luZG93KTsKKyAgICBYRmx1c2goZGlzcGxheSk7CisgICAgeGxpYl93bV9kZWxldGVfd2luZG93ID0gWEludGVybkF0b20oZGlzcGxheSwgIldNX0RFTEVURV9XSU5ET1ciLCBGYWxzZSk7Cit9CisKK3ZvaWQgRGVtbzo6aGFuZGxlX3hsaWJfZXZlbnQoY29uc3QgWEV2ZW50ICpldmVudCkgeworICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBDbGllbnRNZXNzYWdlOgorICAgICAgICAgICAgaWYgKChBdG9tKWV2ZW50LT54Y2xpZW50LmRhdGEubFswXSA9PSB4bGliX3dtX2RlbGV0ZV93aW5kb3cpIHsKKyAgICAgICAgICAgICAgICBxdWl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVByZXNzOgorICAgICAgICAgICAgc3dpdGNoIChldmVudC0+eGtleS5rZXljb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAweDk6ICAvLyBFc2NhcGUKKyAgICAgICAgICAgICAgICAgICAgcXVpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg3MTogIC8vIGxlZnQgYXJyb3cga2V5CisgICAgICAgICAgICAgICAgICAgIHNwaW5fYW5nbGUgLT0gc3Bpbl9pbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg3MjogIC8vIHJpZ2h0IGFycm93IGtleQorICAgICAgICAgICAgICAgICAgICBzcGluX2FuZ2xlICs9IHNwaW5faW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4NDE6ICAvLyBzcGFjZSBiYXIKKyAgICAgICAgICAgICAgICAgICAgcGF1c2UgPSAhcGF1c2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29uZmlndXJlTm90aWZ5OgorICAgICAgICAgICAgaWYgKCgoaW50MzJfdCl3aWR0aCAhPSBldmVudC0+eGNvbmZpZ3VyZS53aWR0aCkgfHwgKChpbnQzMl90KWhlaWdodCAhPSBldmVudC0+eGNvbmZpZ3VyZS5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBldmVudC0+eGNvbmZpZ3VyZS53aWR0aDsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBldmVudC0+eGNvbmZpZ3VyZS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgcmVzaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBEZW1vOjpydW5feGxpYigpIHsKKyAgICB3aGlsZSAoIXF1aXQpIHsKKyAgICAgICAgWEV2ZW50IGV2ZW50OworCisgICAgICAgIGlmIChwYXVzZSkgeworICAgICAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZXZlbnQpOworICAgICAgICAgICAgaGFuZGxlX3hsaWJfZXZlbnQoJmV2ZW50KTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoWFBlbmRpbmcoZGlzcGxheSkgPiAwKSB7CisgICAgICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZldmVudCk7CisgICAgICAgICAgICBoYW5kbGVfeGxpYl9ldmVudCgmZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgZHJhdygpOworICAgICAgICBjdXJGcmFtZSsrOworCisgICAgICAgIGlmIChmcmFtZUNvdW50ICE9IFVJTlQzMl9NQVggJiYgY3VyRnJhbWUgPT0gZnJhbWVDb3VudCkgeworICAgICAgICAgICAgcXVpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKQorCit2b2lkIERlbW86OmhhbmRsZV94Y2JfZXZlbnQoY29uc3QgeGNiX2dlbmVyaWNfZXZlbnRfdCAqZXZlbnQpIHsKKyAgICB1aW50OF90IGV2ZW50X2NvZGUgPSBldmVudC0+cmVzcG9uc2VfdHlwZSAmIDB4N2Y7CisgICAgc3dpdGNoIChldmVudF9jb2RlKSB7CisgICAgICAgIGNhc2UgWENCX0VYUE9TRToKKyAgICAgICAgICAgIC8vIFRPRE86IFJlc2l6ZSB3aW5kb3cKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFhDQl9DTElFTlRfTUVTU0FHRToKKyAgICAgICAgICAgIGlmICgoKih4Y2JfY2xpZW50X21lc3NhZ2VfZXZlbnRfdCAqKWV2ZW50KS5kYXRhLmRhdGEzMlswXSA9PSAoKmF0b21fd21fZGVsZXRlX3dpbmRvdykuYXRvbSkgeworICAgICAgICAgICAgICAgIHF1aXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWENCX0tFWV9SRUxFQVNFOiB7CisgICAgICAgICAgICBjb25zdCB4Y2Jfa2V5X3JlbGVhc2VfZXZlbnRfdCAqa2V5ID0gKGNvbnN0IHhjYl9rZXlfcmVsZWFzZV9ldmVudF90ICopZXZlbnQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5LT5kZXRhaWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4OTogIC8vIEVzY2FwZQorICAgICAgICAgICAgICAgICAgICBxdWl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDcxOiAgLy8gbGVmdCBhcnJvdyBrZXkKKyAgICAgICAgICAgICAgICAgICAgc3Bpbl9hbmdsZSAtPSBzcGluX2luY3JlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDcyOiAgLy8gcmlnaHQgYXJyb3cga2V5CisgICAgICAgICAgICAgICAgICAgIHNwaW5fYW5nbGUgKz0gc3Bpbl9pbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg0MTogIC8vIHNwYWNlIGJhcgorICAgICAgICAgICAgICAgICAgICBwYXVzZSA9ICFwYXVzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgWENCX0NPTkZJR1VSRV9OT1RJRlk6IHsKKyAgICAgICAgICAgIGNvbnN0IHhjYl9jb25maWd1cmVfbm90aWZ5X2V2ZW50X3QgKmNmZyA9IChjb25zdCB4Y2JfY29uZmlndXJlX25vdGlmeV9ldmVudF90ICopZXZlbnQ7CisgICAgICAgICAgICBpZiAoKHdpZHRoICE9IGNmZy0+d2lkdGgpIHx8IChoZWlnaHQgIT0gY2ZnLT5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBjZmctPndpZHRoOworICAgICAgICAgICAgICAgIGhlaWdodCA9IGNmZy0+aGVpZ2h0OworICAgICAgICAgICAgICAgIHJlc2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIERlbW86OnJ1bl94Y2IoKSB7CisgICAgeGNiX2ZsdXNoKGNvbm5lY3Rpb24pOworCisgICAgd2hpbGUgKCFxdWl0KSB7CisgICAgICAgIHhjYl9nZW5lcmljX2V2ZW50X3QgKmV2ZW50OworCisgICAgICAgIGlmIChwYXVzZSkgeworICAgICAgICAgICAgZXZlbnQgPSB4Y2Jfd2FpdF9mb3JfZXZlbnQoY29ubmVjdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBldmVudCA9IHhjYl9wb2xsX2Zvcl9ldmVudChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZXZlbnQpIHsKKyAgICAgICAgICAgIGhhbmRsZV94Y2JfZXZlbnQoZXZlbnQpOworICAgICAgICAgICAgZnJlZShldmVudCk7CisgICAgICAgICAgICBldmVudCA9IHhjYl9wb2xsX2Zvcl9ldmVudChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGRyYXcoKTsKKyAgICAgICAgY3VyRnJhbWUrKzsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgIT0gVUlOVDMyX01BWCAmJiBjdXJGcmFtZSA9PSBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBxdWl0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBEZW1vOjpjcmVhdGVfeGNiX3dpbmRvdygpIHsKKyAgICB1aW50MzJfdCB2YWx1ZV9tYXNrLCB2YWx1ZV9saXN0WzMyXTsKKworICAgIHhjYl93aW5kb3cgPSB4Y2JfZ2VuZXJhdGVfaWQoY29ubmVjdGlvbik7CisKKyAgICB2YWx1ZV9tYXNrID0gWENCX0NXX0JBQ0tfUElYRUwgfCBYQ0JfQ1dfRVZFTlRfTUFTSzsKKyAgICB2YWx1ZV9saXN0WzBdID0gc2NyZWVuLT5ibGFja19waXhlbDsKKyAgICB2YWx1ZV9saXN0WzFdID0gWENCX0VWRU5UX01BU0tfS0VZX1JFTEVBU0UgfCBYQ0JfRVZFTlRfTUFTS19FWFBPU1VSRSB8IFhDQl9FVkVOVF9NQVNLX1NUUlVDVFVSRV9OT1RJRlk7CisKKyAgICB4Y2JfY3JlYXRlX3dpbmRvdyhjb25uZWN0aW9uLCBYQ0JfQ09QWV9GUk9NX1BBUkVOVCwgeGNiX3dpbmRvdywgc2NyZWVuLT5yb290LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICAgIFhDQl9XSU5ET1dfQ0xBU1NfSU5QVVRfT1VUUFVULCBzY3JlZW4tPnJvb3RfdmlzdWFsLCB2YWx1ZV9tYXNrLCB2YWx1ZV9saXN0KTsKKworICAgIC8qIE1hZ2ljIGNvZGUgdGhhdCB3aWxsIHNlbmQgbm90aWZpY2F0aW9uIHdoZW4gd2luZG93IGlzIGRlc3Ryb3llZCAqLworICAgIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdCBjb29raWUgPSB4Y2JfaW50ZXJuX2F0b20oY29ubmVjdGlvbiwgMSwgMTIsICJXTV9QUk9UT0NPTFMiKTsKKyAgICB4Y2JfaW50ZXJuX2F0b21fcmVwbHlfdCAqcmVwbHkgPSB4Y2JfaW50ZXJuX2F0b21fcmVwbHkoY29ubmVjdGlvbiwgY29va2llLCAwKTsKKworICAgIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdCBjb29raWUyID0geGNiX2ludGVybl9hdG9tKGNvbm5lY3Rpb24sIDAsIDE2LCAiV01fREVMRVRFX1dJTkRPVyIpOworICAgIGF0b21fd21fZGVsZXRlX3dpbmRvdyA9IHhjYl9pbnRlcm5fYXRvbV9yZXBseShjb25uZWN0aW9uLCBjb29raWUyLCAwKTsKKworICAgIHhjYl9jaGFuZ2VfcHJvcGVydHkoY29ubmVjdGlvbiwgWENCX1BST1BfTU9ERV9SRVBMQUNFLCB4Y2Jfd2luZG93LCAoKnJlcGx5KS5hdG9tLCA0LCAzMiwgMSwgJigqYXRvbV93bV9kZWxldGVfd2luZG93KS5hdG9tKTsKKworICAgIGZyZWUocmVwbHkpOworCisgICAgeGNiX21hcF93aW5kb3coY29ubmVjdGlvbiwgeGNiX3dpbmRvdyk7CisKKyAgICAvLyBGb3JjZSB0aGUgeC95IGNvb3JkaW5hdGVzIHRvIDEwMCwxMDAgcmVzdWx0cyBhcmUgaWRlbnRpY2FsIGluCisgICAgLy8gY29uc2VjdXRpdmUKKyAgICAvLyBydW5zCisgICAgY29uc3QgdWludDMyX3QgY29vcmRzW10gPSB7MTAwLCAxMDB9OworICAgIHhjYl9jb25maWd1cmVfd2luZG93KGNvbm5lY3Rpb24sIHhjYl93aW5kb3csIFhDQl9DT05GSUdfV0lORE9XX1ggfCBYQ0JfQ09ORklHX1dJTkRPV19ZLCBjb29yZHMpOworfQorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisKK3ZvaWQgRGVtbzo6cnVuKCkgeworICAgIHdoaWxlICghcXVpdCkgeworICAgICAgICBpZiAocGF1c2UpIHsKKyAgICAgICAgICAgIHdsX2Rpc3BsYXlfZGlzcGF0Y2goZGlzcGxheSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3bF9kaXNwbGF5X2Rpc3BhdGNoX3BlbmRpbmcoZGlzcGxheSk7CisgICAgICAgICAgICB1cGRhdGVfZGF0YV9idWZmZXIoKTsKKyAgICAgICAgICAgIGRyYXcoKTsKKyAgICAgICAgICAgIGN1ckZyYW1lKys7CisgICAgICAgICAgICBpZiAoZnJhbWVDb3VudCAhPSBVSU5UMzJfTUFYICYmIGN1ckZyYW1lID09IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBxdWl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBEZW1vOjpjcmVhdGVfd2luZG93KCkgeworICAgIHdpbmRvdyA9IHdsX2NvbXBvc2l0b3JfY3JlYXRlX3N1cmZhY2UoY29tcG9zaXRvcik7CisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgcHJpbnRmKCJDYW4gbm90IGNyZWF0ZSB3YXlsYW5kX3N1cmZhY2UgZnJvbSBjb21wb3NpdG9yIVxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHNoZWxsX3N1cmZhY2UgPSB3bF9zaGVsbF9nZXRfc2hlbGxfc3VyZmFjZShzaGVsbCwgd2luZG93KTsKKyAgICBpZiAoIXNoZWxsX3N1cmZhY2UpIHsKKyAgICAgICAgcHJpbnRmKCJDYW4gbm90IGdldCBzaGVsbF9zdXJmYWNlIGZyb20gd2F5bGFuZF9zdXJmYWNlIVxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHdsX3NoZWxsX3N1cmZhY2VfYWRkX2xpc3RlbmVyKHNoZWxsX3N1cmZhY2UsICZzaGVsbF9zdXJmYWNlX2xpc3RlbmVyLCB0aGlzKTsKKyAgICB3bF9zaGVsbF9zdXJmYWNlX3NldF90b3BsZXZlbChzaGVsbF9zdXJmYWNlKTsKKyAgICB3bF9zaGVsbF9zdXJmYWNlX3NldF90aXRsZShzaGVsbF9zdXJmYWNlLCBBUFBfU0hPUlRfTkFNRSk7Cit9CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQpCit2b2lkIERlbW86OnJ1bigpIHsKKyAgICBkcmF3KCk7CisgICAgY3VyRnJhbWUrKzsKKyAgICBpZiAoZnJhbWVDb3VudCAhPSBVSU5UMzJfTUFYICYmIGN1ckZyYW1lID09IGZyYW1lQ291bnQpIHsKKyAgICAgICAgcXVpdCA9IHRydWU7CisgICAgfQorfQorI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fRElTUExBWV9LSFIpCisKK3ZrOjpSZXN1bHQgRGVtbzo6Y3JlYXRlX2Rpc3BsYXlfc3VyZmFjZSgpIHsKKyAgICB2azo6UmVzdWx0IHJlc3VsdDsKKyAgICB1aW50MzJfdCBkaXNwbGF5X2NvdW50OworICAgIHVpbnQzMl90IG1vZGVfY291bnQ7CisgICAgdWludDMyX3QgcGxhbmVfY291bnQ7CisgICAgdms6OkRpc3BsYXlQcm9wZXJ0aWVzS0hSIGRpc3BsYXlfcHJvcHM7CisgICAgdms6OkRpc3BsYXlLSFIgZGlzcGxheTsKKyAgICB2azo6RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIG1vZGVfcHJvcHM7CisgICAgdms6OkRpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgKnBsYW5lX3Byb3BzOworICAgIHZrOjpCb29sMzIgZm91bmRfcGxhbmUgPSBWS19GQUxTRTsKKyAgICB1aW50MzJfdCBwbGFuZV9pbmRleDsKKyAgICB2azo6RXh0ZW50MkQgaW1hZ2VfZXh0ZW50OworCisgICAgLy8gR2V0IHRoZSBmaXJzdCBkaXNwbGF5CisgICAgcmVzdWx0ID0gZ3B1LmdldERpc3BsYXlQcm9wZXJ0aWVzS0hSKCZkaXNwbGF5X2NvdW50LCBudWxscHRyKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIGlmIChkaXNwbGF5X2NvdW50ID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgZmluZCBhbnkgZGlzcGxheSFcbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBkaXNwbGF5X2NvdW50ID0gMTsKKyAgICByZXN1bHQgPSBncHUuZ2V0RGlzcGxheVByb3BlcnRpZXNLSFIoJmRpc3BsYXlfY291bnQsICZkaXNwbGF5X3Byb3BzKTsKKyAgICBWRVJJRlkoKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2VzcykgfHwgKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplSW5jb21wbGV0ZSkpOworCisgICAgZGlzcGxheSA9IGRpc3BsYXlfcHJvcHMuZGlzcGxheTsKKworICAgIC8vIEdldCB0aGUgZmlyc3QgbW9kZSBvZiB0aGUgZGlzcGxheQorICAgIHJlc3VsdCA9IGdwdS5nZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoZGlzcGxheSwgJm1vZGVfY291bnQsIG51bGxwdHIpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgaWYgKG1vZGVfY291bnQgPT0gMCkgeworICAgICAgICBwcmludGYoIkNhbm5vdCBmaW5kIGFueSBtb2RlIGZvciB0aGUgZGlzcGxheSFcbiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBtb2RlX2NvdW50ID0gMTsKKyAgICByZXN1bHQgPSBncHUuZ2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKGRpc3BsYXksICZtb2RlX2NvdW50LCAmbW9kZV9wcm9wcyk7CisgICAgVkVSSUZZKChyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpIHx8IChyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZUluY29tcGxldGUpKTsKKworICAgIC8vIEdldCB0aGUgbGlzdCBvZiBwbGFuZXMKKyAgICByZXN1bHQgPSBncHUuZ2V0RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUigmcGxhbmVfY291bnQsIG51bGxwdHIpOworICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgaWYgKHBsYW5lX2NvdW50ID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgZmluZCBhbnkgcGxhbmUhXG4iKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgcGxhbmVfcHJvcHMgPSAodms6OkRpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgKiltYWxsb2Moc2l6ZW9mKHZrOjpEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKSAqIHBsYW5lX2NvdW50KTsKKyAgICBWRVJJRlkocGxhbmVfcHJvcHMgIT0gbnVsbHB0cik7CisKKyAgICByZXN1bHQgPSBncHUuZ2V0RGlzcGxheVBsYW5lUHJvcGVydGllc0tIUigmcGxhbmVfY291bnQsIHBsYW5lX3Byb3BzKTsKKyAgICBWRVJJRlkocmVzdWx0ID09IHZrOjpSZXN1bHQ6OmVTdWNjZXNzKTsKKworICAgIC8vIEZpbmQgYSBwbGFuZSBjb21wYXRpYmxlIHdpdGggdGhlIGRpc3BsYXkKKyAgICBmb3IgKHBsYW5lX2luZGV4ID0gMDsgcGxhbmVfaW5kZXggPCBwbGFuZV9jb3VudDsgcGxhbmVfaW5kZXgrKykgeworICAgICAgICB1aW50MzJfdCBzdXBwb3J0ZWRfY291bnQ7CisgICAgICAgIHZrOjpEaXNwbGF5S0hSICpzdXBwb3J0ZWRfZGlzcGxheXM7CisKKyAgICAgICAgLy8gRGlzcXVhbGlmeSBwbGFuZXMgdGhhdCBhcmUgYm91bmQgdG8gYSBkaWZmZXJlbnQgZGlzcGxheQorICAgICAgICBpZiAocGxhbmVfcHJvcHNbcGxhbmVfaW5kZXhdLmN1cnJlbnREaXNwbGF5ICYmIChwbGFuZV9wcm9wc1twbGFuZV9pbmRleF0uY3VycmVudERpc3BsYXkgIT0gZGlzcGxheSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gZ3B1LmdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKHBsYW5lX2luZGV4LCAmc3VwcG9ydGVkX2NvdW50LCBudWxscHRyKTsKKyAgICAgICAgVkVSSUZZKHJlc3VsdCA9PSB2azo6UmVzdWx0OjplU3VjY2Vzcyk7CisKKyAgICAgICAgaWYgKHN1cHBvcnRlZF9jb3VudCA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cHBvcnRlZF9kaXNwbGF5cyA9ICh2azo6RGlzcGxheUtIUiAqKW1hbGxvYyhzaXplb2Yodms6OkRpc3BsYXlLSFIpICogc3VwcG9ydGVkX2NvdW50KTsKKyAgICAgICAgVkVSSUZZKHN1cHBvcnRlZF9kaXNwbGF5cyAhPSBudWxscHRyKTsKKworICAgICAgICByZXN1bHQgPSBncHUuZ2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIocGxhbmVfaW5kZXgsICZzdXBwb3J0ZWRfY291bnQsIHN1cHBvcnRlZF9kaXNwbGF5cyk7CisgICAgICAgIFZFUklGWShyZXN1bHQgPT0gdms6OlJlc3VsdDo6ZVN1Y2Nlc3MpOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRfY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZF9kaXNwbGF5c1tpXSA9PSBkaXNwbGF5KSB7CisgICAgICAgICAgICAgICAgZm91bmRfcGxhbmUgPSBWS19UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJlZShzdXBwb3J0ZWRfZGlzcGxheXMpOworCisgICAgICAgIGlmIChmb3VuZF9wbGFuZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kX3BsYW5lKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGZpbmQgYSBwbGFuZSBjb21wYXRpYmxlIHdpdGggdGhlIGRpc3BsYXkhXG4iKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZnJlZShwbGFuZV9wcm9wcyk7CisKKyAgICB2azo6RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIHBsYW5lQ2FwczsKKyAgICBncHUuZ2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKG1vZGVfcHJvcHMuZGlzcGxheU1vZGUsIHBsYW5lX2luZGV4LCAmcGxhbmVDYXBzKTsKKyAgICAvLyBGaW5kIGEgc3VwcG9ydGVkIGFscGhhIG1vZGUKKyAgICB2azo6RGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUiBhbHBoYU1vZGUgPSB2azo6RGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjo6ZU9wYXF1ZTsKKyAgICB2azo6RGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUiBhbHBoYU1vZGVzWzRdID0geworICAgICAgICB2azo6RGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUjo6ZU9wYXF1ZSwKKyAgICAgICAgdms6OkRpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFI6OmVHbG9iYWwsCisgICAgICAgIHZrOjpEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSOjplUGVyUGl4ZWwsCisgICAgICAgIHZrOjpEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSOjplUGVyUGl4ZWxQcmVtdWx0aXBsaWVkLAorICAgIH07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNpemVvZihhbHBoYU1vZGVzKTsgaSsrKSB7CisgICAgICAgIGlmIChwbGFuZUNhcHMuc3VwcG9ydGVkQWxwaGEgJiBhbHBoYU1vZGVzW2ldKSB7CisgICAgICAgICAgICBhbHBoYU1vZGUgPSBhbHBoYU1vZGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbWFnZV9leHRlbnQuc2V0V2lkdGgobW9kZV9wcm9wcy5wYXJhbWV0ZXJzLnZpc2libGVSZWdpb24ud2lkdGgpOworICAgIGltYWdlX2V4dGVudC5zZXRIZWlnaHQobW9kZV9wcm9wcy5wYXJhbWV0ZXJzLnZpc2libGVSZWdpb24uaGVpZ2h0KTsKKworICAgIGF1dG8gY29uc3QgY3JlYXRlSW5mbyA9IHZrOjpEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGlzcGxheU1vZGUobW9kZV9wcm9wcy5kaXNwbGF5TW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBsYW5lSW5kZXgocGxhbmVfaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQbGFuZVN0YWNrSW5kZXgocGxhbmVfcHJvcHNbcGxhbmVfaW5kZXhdLmN1cnJlbnRTdGFja0luZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0R2xvYmFsQWxwaGEoMS4wZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFscGhhTW9kZShhbHBoYU1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbWFnZUV4dGVudChpbWFnZV9leHRlbnQpOworCisgICAgcmV0dXJuIGluc3QuY3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigmY3JlYXRlSW5mbywgbnVsbHB0ciwgJnN1cmZhY2UpOworfQorCit2b2lkIERlbW86OnJ1bl9kaXNwbGF5KCkgeworICAgIHdoaWxlICghcXVpdCkgeworICAgICAgICBkcmF3KCk7CisgICAgICAgIGN1ckZyYW1lKys7CisKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgIT0gVUlOVDMyX01BWCAmJiBjdXJGcmFtZSA9PSBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBxdWl0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisjaWYgX1dJTjMyCisvLyBJbmNsdWRlIGhlYWRlciByZXF1aXJlZCBmb3IgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisjaW5jbHVkZSA8c2hlbGxhcGkuaD4KKworRGVtbyBkZW1vOworCisvLyBNUy1XaW5kb3dzIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uOgorTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jKEhXTkQgaFduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKSB7CisgICAgc3dpdGNoICh1TXNnKSB7CisgICAgICAgIGNhc2UgV01fQ0xPU0U6CisgICAgICAgICAgICBQb3N0UXVpdE1lc3NhZ2UodmFsaWRhdGlvbl9lcnJvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTV9QQUlOVDoKKyAgICAgICAgICAgIGRlbW8ucnVuKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTV9HRVRNSU5NQVhJTkZPOiAgLy8gc2V0IHdpbmRvdydzIG1pbmltdW0gc2l6ZQorICAgICAgICAgICAgKChNSU5NQVhJTkZPICopbFBhcmFtKS0+cHRNaW5UcmFja1NpemUgPSBkZW1vLm1pbnNpemU7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBXTV9FUkFTRUJLR05EOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgV01fU0laRToKKyAgICAgICAgICAgIC8vIFJlc2l6ZSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIG5ldyB3aW5kb3cgc2l6ZSwgZXhjZXB0IHdoZW4KKyAgICAgICAgICAgIC8vIGl0IHdhcyBtaW5pbWl6ZWQuIFZ1bGthbiBkb2Vzbid0IHN1cHBvcnQgaW1hZ2VzIG9yIHN3YXBjaGFpbnMKKyAgICAgICAgICAgIC8vIHdpdGggd2lkdGg9MCBhbmQgaGVpZ2h0PTAuCisgICAgICAgICAgICBpZiAod1BhcmFtICE9IFNJWkVfTUlOSU1JWkVEKSB7CisgICAgICAgICAgICAgICAgZGVtby53aWR0aCA9IGxQYXJhbSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBkZW1vLmhlaWdodCA9IChsUGFyYW0gJiAweGZmZmYwMDAwKSA+PiAxNjsKKyAgICAgICAgICAgICAgICBkZW1vLnJlc2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fS0VZRE9XTjoKKyAgICAgICAgICAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWS19FU0NBUEU6CisgICAgICAgICAgICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSh2YWxpZGF0aW9uX2Vycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19MRUZUOgorICAgICAgICAgICAgICAgICAgICBkZW1vLnNwaW5fYW5nbGUgLT0gZGVtby5zcGluX2luY3JlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19SSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgZGVtby5zcGluX2FuZ2xlICs9IGRlbW8uc3Bpbl9pbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVktfU1BBQ0U6CisgICAgICAgICAgICAgICAgICAgIGRlbW8ucGF1c2UgPSAhZGVtby5wYXVzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAoRGVmV2luZG93UHJvYyhoV25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSkpOworfQorCitpbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0YW5jZSwgSElOU1RBTkNFIGhQcmV2SW5zdGFuY2UsIExQU1RSIHBDbWRMaW5lLCBpbnQgbkNtZFNob3cpIHsKKyAgICAvLyBUT0RPOiBHYWguLiByZWZhY3Rvci4gVGhpcyBpc24ndCAxOTg5LgorICAgIE1TRyBtc2c7ICAgIC8vIG1lc3NhZ2UKKyAgICBib29sIGRvbmU7ICAvLyBmbGFnIHNheWluZyB3aGVuIGFwcCBpcyBjb21wbGV0ZQorICAgIGludCBhcmdjOworICAgIGNoYXIgKiphcmd2OworCisgICAgLy8gRW5zdXJlIHdQYXJhbSBpcyBpbml0aWFsaXplZC4KKyAgICBtc2cud1BhcmFtID0gMDsKKworICAgIC8vIFVzZSB0aGUgQ29tbWFuZExpbmUgZnVuY3Rpb25zIHRvIGdldCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAvLyBVbmZvcnR1bmF0ZWx5LCBNaWNyb3NvZnQgb3V0cHV0cworICAgIC8vIHRoaXMgaW5mb3JtYXRpb24gYXMgd2lkZSBjaGFyYWN0ZXJzIGZvciBVbmljb2RlLCBhbmQgd2Ugc2ltcGx5IHdhbnQgdGhlCisgICAgLy8gQXNjaWkgdmVyc2lvbiB0byBiZSBjb21wYXRpYmxlCisgICAgLy8gd2l0aCB0aGUgbm9uLVdpbmRvd3Mgc2lkZS4gIFNvLCB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIGluZm9ybWF0aW9uIHRvCisgICAgLy8gQXNjaWkgY2hhcmFjdGVyIHN0cmluZ3MuCisgICAgTFBXU1RSICpjb21tYW5kTGluZUFyZ3MgPSBDb21tYW5kTGluZVRvQXJndlcoR2V0Q29tbWFuZExpbmVXKCksICZhcmdjKTsKKyAgICBpZiAobnVsbHB0ciA9PSBjb21tYW5kTGluZUFyZ3MpIHsKKyAgICAgICAgYXJnYyA9IDA7CisgICAgfQorCisgICAgaWYgKGFyZ2MgPiAwKSB7CisgICAgICAgIGFyZ3YgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBhcmdjKTsKKyAgICAgICAgaWYgKGFyZ3YgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgYXJnYyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpaWkgPSAwOyBpaWkgPCBhcmdjOyBpaWkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCB3aWRlQ2hhckxlbiA9IHdjc2xlbihjb21tYW5kTGluZUFyZ3NbaWlpXSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvbnZlcnRlZCA9IDA7CisKKyAgICAgICAgICAgICAgICBhcmd2W2lpaV0gPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikgKiAod2lkZUNoYXJMZW4gKyAxKSk7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3ZbaWlpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHdjc3RvbWJzX3MoJm51bUNvbnZlcnRlZCwgYXJndltpaWldLCB3aWRlQ2hhckxlbiArIDEsIGNvbW1hbmRMaW5lQXJnc1tpaWldLCB3aWRlQ2hhckxlbiArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGFyZ3YgPSBudWxscHRyOworICAgIH0KKworICAgIGRlbW8uaW5pdChhcmdjLCBhcmd2KTsKKworICAgIC8vIEZyZWUgdXAgdGhlIGl0ZW1zIHdlIGhhZCB0byBhbGxvY2F0ZSBmb3IgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgaWYgKGFyZ2MgPiAwICYmIGFyZ3YgIT0gbnVsbHB0cikgeworICAgICAgICBmb3IgKGludCBpaWkgPSAwOyBpaWkgPCBhcmdjOyBpaWkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3ZbaWlpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZnJlZShhcmd2W2lpaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyZWUoYXJndik7CisgICAgfQorCisgICAgZGVtby5jb25uZWN0aW9uID0gaEluc3RhbmNlOworICAgIHN0cm5jcHkoZGVtby5uYW1lLCAiVnVsa2FuIEN1YmUiLCBBUFBfTkFNRV9TVFJfTEVOKTsKKyAgICBkZW1vLmNyZWF0ZV93aW5kb3coKTsKKyAgICBkZW1vLmluaXRfdmtfc3dhcGNoYWluKCk7CisKKyAgICBkZW1vLnByZXBhcmUoKTsKKworICAgIGRvbmUgPSBmYWxzZTsgIC8vIGluaXRpYWxpemUgbG9vcCBjb25kaXRpb24gdmFyaWFibGUKKworICAgIC8vIG1haW4gbWVzc2FnZSBsb29wCisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIGlmIChkZW1vLnBhdXNlKSB7CisgICAgICAgICAgICBjb25zdCBCT09MIHN1Y2MgPSBXYWl0TWVzc2FnZSgpOworCisgICAgICAgICAgICBpZiAoIXN1Y2MpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZzdXBwcmVzc19wb3B1cHMgPSBkZW1vLnN1cHByZXNzX3BvcHVwczsKKyAgICAgICAgICAgICAgICBFUlJfRVhJVCgiV2FpdE1lc3NhZ2UoKSBmYWlsZWQgb24gcGF1c2VkIGRlbW8iLCAiZXZlbnQgbG9vcCBlcnJvciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUGVla01lc3NhZ2UoJm1zZywgbnVsbHB0ciwgMCwgMCwgUE1fUkVNT1ZFKTsKKyAgICAgICAgaWYgKG1zZy5tZXNzYWdlID09IFdNX1FVSVQpICAvLyBjaGVjayBmb3IgYSBxdWl0IG1lc3NhZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZG9uZSA9IHRydWU7ICAvLyBpZiBmb3VuZCwgcXVpdCBhcHAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRyYW5zbGF0ZSBhbmQgZGlzcGF0Y2ggdG8gZXZlbnQgcXVldWUqLworICAgICAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKKyAgICAgICAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKKyAgICAgICAgfQorICAgICAgICBSZWRyYXdXaW5kb3coZGVtby53aW5kb3csIG51bGxwdHIsIG51bGxwdHIsIFJEV19JTlRFUk5BTFBBSU5UKTsKKyAgICB9CisKKyAgICBkZW1vLmNsZWFudXAoKTsKKworICAgIHJldHVybiAoaW50KW1zZy53UGFyYW07Cit9CisKKyNlbGlmIF9fbGludXhfXworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBEZW1vIGRlbW87CisKKyAgICBkZW1vLmluaXQoYXJnYywgYXJndik7CisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKQorICAgIGRlbW8uY3JlYXRlX3hjYl93aW5kb3coKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgIGRlbW8udXNlX3hsaWIgPSB0cnVlOworICAgIGRlbW8uY3JlYXRlX3hsaWJfd2luZG93KCk7CisjZWxpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyAgICBkZW1vLmNyZWF0ZV93aW5kb3coKTsKKyNlbmRpZgorCisgICAgZGVtby5pbml0X3ZrX3N3YXBjaGFpbigpOworCisgICAgZGVtby5wcmVwYXJlKCk7CisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKQorICAgIGRlbW8ucnVuX3hjYigpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpCisgICAgZGVtby5ydW5feGxpYigpOworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgZGVtby5ydW4oKTsKKyNlbGlmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0RJU1BMQVlfS0hSKQorICAgIGRlbW8ucnVuX2Rpc3BsYXkoKTsKKyNlbmRpZgorCisgICAgZGVtby5jbGVhbnVwKCk7CisKKyAgICByZXR1cm4gdmFsaWRhdGlvbl9lcnJvcjsKK30KKworI2VsaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKQorCisvLyBHbG9iYWwgZnVuY3Rpb24gaW52b2tlZCBmcm9tIE5TIG9yIFVJIHZpZXdzIGFuZCBjb250cm9sbGVycyB0byBjcmVhdGUgZGVtbworc3RhdGljIHZvaWQgZGVtb19tYWluKHN0cnVjdCBEZW1vICZkZW1vLCB2b2lkICpjYU1ldGFsTGF5ZXIsIGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgICBkZW1vLmluaXQoYXJnYywgKGNoYXIgKiopYXJndik7CisgICAgZGVtby5jYU1ldGFsTGF5ZXIgPSBjYU1ldGFsTGF5ZXI7CisgICAgZGVtby5pbml0X3ZrX3N3YXBjaGFpbigpOworICAgIGRlbW8ucHJlcGFyZSgpOworICAgIGRlbW8uc3Bpbl9hbmdsZSA9IDAuNGY7Cit9CisKKyNlbHNlCisjZXJyb3IgIlBsYXRmb3JtIG5vdCBzdXBwb3J0ZWQiCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvY3ViZS5mcmFnIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9jdWJlLmZyYWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmNjUwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvY3ViZS5mcmFnCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBGcmFnbWVudCBzaGFkZXIgZm9yIGN1YmUgZGVtbworICovCisjdmVyc2lvbiA0MDAKKyNleHRlbnNpb24gR0xfQVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzIDogZW5hYmxlCisjZXh0ZW5zaW9uIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgOiBlbmFibGUKK2xheW91dCAoYmluZGluZyA9IDEpIHVuaWZvcm0gc2FtcGxlcjJEIHRleDsKKworbGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzQgdGV4Y29vcmQ7CitsYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjMyBmcmFnX3BvczsKK2xheW91dCAobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB1RnJhZ0NvbG9yOworCitjb25zdCB2ZWMzIGxpZ2h0RGlyPSB2ZWMzKDAuNDI0LCAwLjU2NiwgMC43MDcpOworCit2b2lkIG1haW4oKSB7CisgICB2ZWMzIGRYID0gZEZkeChmcmFnX3Bvcyk7CisgICB2ZWMzIGRZID0gZEZkeShmcmFnX3Bvcyk7CisgICB2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZShjcm9zcyhkWCxkWSkpOworICAgZmxvYXQgbGlnaHQgPSBtYXgoMC4wLCBkb3QobGlnaHREaXIsIG5vcm1hbCkpOworICAgdUZyYWdDb2xvciA9IGxpZ2h0ICogdGV4dHVyZSh0ZXgsIHRleGNvb3JkLnh5KTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvY3ViZS52Y3hwcm9qLnVzZXIgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2N1YmUudmN4cHJvai51c2VyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5MWNkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2N1YmUudmN4cHJvai51c2VyCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjEyLjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxMb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+VktfTEFZRVJfUEFUSD0uLlxsYXllcnNcRGVidWc8L0xvY2FsRGVidWdnZXJFbnZpcm9ubWVudD4KKyAgICA8RGVidWdnZXJGbGF2b3I+V2luZG93c0xvY2FsRGVidWdnZXI8L0RlYnVnZ2VyRmxhdm9yPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8TG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PlZLX0xBWUVSX1BBVEg9Li5cbGF5ZXJzXFJlbGVhc2U8L0xvY2FsRGVidWdnZXJFbnZpcm9ubWVudD4KKyAgICA8RGVidWdnZXJGbGF2b3I+V2luZG93c0xvY2FsRGVidWdnZXI8L0RlYnVnZ2VyRmxhdm9yPgorICA8L1Byb3BlcnR5R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2N1YmUudmVydCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvY3ViZS52ZXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzgwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2N1YmUudmVydApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKgorICogVmVydGV4IHNoYWRlciB1c2VkIGJ5IEN1YmUgZGVtby4KKyAqLworI3ZlcnNpb24gNDAwCisjZXh0ZW5zaW9uIEdMX0FSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyA6IGVuYWJsZQorI2V4dGVuc2lvbiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIDogZW5hYmxlCitsYXlvdXQoc3RkMTQwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSBidWYgeworICAgICAgICBtYXQ0IE1WUDsKKyAgICAgICAgdmVjNCBwb3NpdGlvblsxMiozXTsKKyAgICAgICAgdmVjNCBhdHRyWzEyKjNdOworfSB1YnVmOworCitsYXlvdXQgKGxvY2F0aW9uID0gMCkgb3V0IHZlYzQgdGV4Y29vcmQ7CitsYXlvdXQgKGxvY2F0aW9uID0gMSkgb3V0IHZlYzMgZnJhZ19wb3M7CisKK3ZvaWQgbWFpbigpIAoreworICAgdGV4Y29vcmQgPSB1YnVmLmF0dHJbZ2xfVmVydGV4SW5kZXhdOworICAgZ2xfUG9zaXRpb24gPSB1YnVmLk1WUCAqIHVidWYucG9zaXRpb25bZ2xfVmVydGV4SW5kZXhdOworICAgZnJhZ19wb3MgPSBnbF9Qb3NpdGlvbi54eXo7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2dldHRpbWUuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvZ2V0dGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjY1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2dldHRpbWUuaApAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCwgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIFBvcnRlZCBmcm9tIGRyYXdFbGVtZW50cyBVdGlsaXR5IExpYnJhcnkgKEdvb2dsZSwgSW5jLikKKyAqIFBvcnQgZG9uZSBieTogSWFuIEVsbGlvdHQgPGlhbmVsbGlvdHRAZ29vZ2xlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx2dWxrYW4vdmtfcGxhdGZvcm0uaD4KKworI2lmIGRlZmluZWQoX1dJTjMyKQorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZWxpZiBkZWZpbmVkKF9fdW5peF9fKSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fQU5EUk9JRF9fKSB8fCBkZWZpbmVkKF9fRVBPQzMyX18pIHx8IGRlZmluZWQoX19RTlhfXykKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjZW5kaWYKKwordWludDY0X3QgZ2V0VGltZUluTmFub3NlY29uZHModm9pZCkgeworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgIExBUkdFX0lOVEVHRVIgZnJlcTsKKyAgICBMQVJHRV9JTlRFR0VSIGNvdW50OworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZjb3VudCk7CisgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSk7CisgICAgYXNzZXJ0KGZyZXEuTG93UGFydCAhPSAwIHx8IGZyZXEuSGlnaFBhcnQgIT0gMCk7CisKKyAgICBpZiAoY291bnQuUXVhZFBhcnQgPCBNQVhMT05HTE9ORyAvIDEwMDAwMDApIHsKKyAgICAgICAgYXNzZXJ0KGZyZXEuUXVhZFBhcnQgIT0gMCk7CisgICAgICAgIHJldHVybiBjb3VudC5RdWFkUGFydCAqIDEwMDAwMDAgLyBmcmVxLlF1YWRQYXJ0OworICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChmcmVxLlF1YWRQYXJ0ID49IDEwMDAwMDApOworICAgICAgICByZXR1cm4gY291bnQuUXVhZFBhcnQgLyAoZnJlcS5RdWFkUGFydCAvIDEwMDAwMDApOworICAgIH0KKworI2VsaWYgZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZChfX2xpbnV4KSB8fCBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0FORFJPSURfXykgfHwgZGVmaW5lZChfX1FOWF9fKQorICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJyVGltZTsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmN1cnJUaW1lKTsKKyAgICByZXR1cm4gKHVpbnQ2NF90KWN1cnJUaW1lLnR2X3NlYyAqIDEwMDAwMDAgKyAoKHVpbnQ2NF90KWN1cnJUaW1lLnR2X25zZWMgLyAxMDAwKTsKKworI2VsaWYgZGVmaW5lZChfX0VQT0MzMl9fKQorICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJyVGltZTsKKyAgICAvKiBTeW1iaWFuIHN1cHBvcnRzIG9ubHkgcmVhbHRpbWUgY2xvY2sgZm9yIGNsb2NrX2dldHRpbWUuICovCisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cnJUaW1lKTsKKyAgICByZXR1cm4gKHVpbnQ2NF90KWN1cnJUaW1lLnR2X3NlYyAqIDEwMDAwMDAgKyAoKHVpbnQ2NF90KWN1cnJUaW1lLnR2X25zZWMgLyAxMDAwKTsKKworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgc3RydWN0IHRpbWV2YWwgY3VyclRpbWU7CisgICAgZ2V0dGltZW9mZGF5KCZjdXJyVGltZSwgTlVMTCk7CisgICAgcmV0dXJuICh1aW50NjRfdCljdXJyVGltZS50dl9zZWMgKiAxMDAwMDAwICsgKHVpbnQ2NF90KWN1cnJUaW1lLnR2X3VzZWM7CisKKyNlbHNlCisjZXJyb3IgIk5vdCBpbXBsZW1lbnRlZCBmb3IgdGFyZ2V0IE9TIgorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2xpbm1hdGguaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbGlubWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDM4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2xpbm1hdGguaApAQCAtMCwwICsxLDUwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBSZWxpY2Vuc2VkIGZyb20gdGhlIFdURlBMIChodHRwOi8vd3d3Lnd0ZnBsLm5ldC9mYXEvKS4KKyAqLworCisjaWZuZGVmIExJTk1BVEhfSAorI2RlZmluZSBMSU5NQVRIX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKworLy8gQ29udmVydHMgZGVncmVlcyB0byByYWRpYW5zLgorI2RlZmluZSBkZWdyZWVzVG9SYWRpYW5zKGFuZ2xlRGVncmVlcykgKGFuZ2xlRGVncmVlcyAqIE1fUEkgLyAxODAuMCkKKworLy8gQ29udmVydHMgcmFkaWFucyB0byBkZWdyZWVzLgorI2RlZmluZSByYWRpYW5zVG9EZWdyZWVzKGFuZ2xlUmFkaWFucykgKGFuZ2xlUmFkaWFucyAqIDE4MC4wIC8gTV9QSSkKKwordHlwZWRlZiBmbG9hdCB2ZWMzWzNdOworc3RhdGljIGlubGluZSB2b2lkIHZlYzNfYWRkKHZlYzMgciwgdmVjMyBjb25zdCBhLCB2ZWMzIGNvbnN0IGIpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSByW2ldID0gYVtpXSArIGJbaV07Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdmVjM19zdWIodmVjMyByLCB2ZWMzIGNvbnN0IGEsIHZlYzMgY29uc3QgYikgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHJbaV0gPSBhW2ldIC0gYltpXTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWMzX3NjYWxlKHZlYzMgciwgdmVjMyBjb25zdCB2LCBmbG9hdCBjb25zdCBzKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgcltpXSA9IHZbaV0gKiBzOworfQorc3RhdGljIGlubGluZSBmbG9hdCB2ZWMzX211bF9pbm5lcih2ZWMzIGNvbnN0IGEsIHZlYzMgY29uc3QgYikgeworICAgIGZsb2F0IHAgPSAwLmY7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgcCArPSBiW2ldICogYVtpXTsKKyAgICByZXR1cm4gcDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWMzX211bF9jcm9zcyh2ZWMzIHIsIHZlYzMgY29uc3QgYSwgdmVjMyBjb25zdCBiKSB7CisgICAgclswXSA9IGFbMV0gKiBiWzJdIC0gYVsyXSAqIGJbMV07CisgICAgclsxXSA9IGFbMl0gKiBiWzBdIC0gYVswXSAqIGJbMl07CisgICAgclsyXSA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07Cit9CitzdGF0aWMgaW5saW5lIGZsb2F0IHZlYzNfbGVuKHZlYzMgY29uc3QgdikgeyByZXR1cm4gc3FydGYodmVjM19tdWxfaW5uZXIodiwgdikpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdmVjM19ub3JtKHZlYzMgciwgdmVjMyBjb25zdCB2KSB7CisgICAgZmxvYXQgayA9IDEuZiAvIHZlYzNfbGVuKHYpOworICAgIHZlYzNfc2NhbGUociwgdiwgayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdmVjM19yZWZsZWN0KHZlYzMgciwgdmVjMyBjb25zdCB2LCB2ZWMzIGNvbnN0IG4pIHsKKyAgICBmbG9hdCBwID0gMi5mICogdmVjM19tdWxfaW5uZXIodiwgbik7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgcltpXSA9IHZbaV0gLSBwICogbltpXTsKK30KKwordHlwZWRlZiBmbG9hdCB2ZWM0WzRdOworc3RhdGljIGlubGluZSB2b2lkIHZlYzRfYWRkKHZlYzQgciwgdmVjNCBjb25zdCBhLCB2ZWM0IGNvbnN0IGIpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSByW2ldID0gYVtpXSArIGJbaV07Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdmVjNF9zdWIodmVjNCByLCB2ZWM0IGNvbnN0IGEsIHZlYzQgY29uc3QgYikgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHJbaV0gPSBhW2ldIC0gYltpXTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWM0X3NjYWxlKHZlYzQgciwgdmVjNCB2LCBmbG9hdCBzKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgcltpXSA9IHZbaV0gKiBzOworfQorc3RhdGljIGlubGluZSBmbG9hdCB2ZWM0X211bF9pbm5lcih2ZWM0IGEsIHZlYzQgYikgeworICAgIGZsb2F0IHAgPSAwLmY7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgcCArPSBiW2ldICogYVtpXTsKKyAgICByZXR1cm4gcDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWM0X211bF9jcm9zcyh2ZWM0IHIsIHZlYzQgYSwgdmVjNCBiKSB7CisgICAgclswXSA9IGFbMV0gKiBiWzJdIC0gYVsyXSAqIGJbMV07CisgICAgclsxXSA9IGFbMl0gKiBiWzBdIC0gYVswXSAqIGJbMl07CisgICAgclsyXSA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07CisgICAgclszXSA9IDEuZjsKK30KK3N0YXRpYyBpbmxpbmUgZmxvYXQgdmVjNF9sZW4odmVjNCB2KSB7IHJldHVybiBzcXJ0Zih2ZWM0X211bF9pbm5lcih2LCB2KSk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWM0X25vcm0odmVjNCByLCB2ZWM0IHYpIHsKKyAgICBmbG9hdCBrID0gMS5mIC8gdmVjNF9sZW4odik7CisgICAgdmVjNF9zY2FsZShyLCB2LCBrKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWM0X3JlZmxlY3QodmVjNCByLCB2ZWM0IHYsIHZlYzQgbikgeworICAgIGZsb2F0IHAgPSAyLmYgKiB2ZWM0X211bF9pbm5lcih2LCBuKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSByW2ldID0gdltpXSAtIHAgKiBuW2ldOworfQorCit0eXBlZGVmIHZlYzQgbWF0NHg0WzRdOworc3RhdGljIGlubGluZSB2b2lkIG1hdDR4NF9pZGVudGl0eShtYXQ0eDQgTSkgeworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIE1baV1bal0gPSBpID09IGogPyAxLmYgOiAwLmY7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X2R1cChtYXQ0eDQgTSwgbWF0NHg0IE4pIHsKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSBNW2ldW2pdID0gTltpXVtqXTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXQ0eDRfcm93KHZlYzQgciwgbWF0NHg0IE0sIGludCBpKSB7CisgICAgaW50IGs7CisgICAgZm9yIChrID0gMDsgayA8IDQ7ICsraykgcltrXSA9IE1ba11baV07Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X2NvbCh2ZWM0IHIsIG1hdDR4NCBNLCBpbnQgaSkgeworICAgIGludCBrOworICAgIGZvciAoayA9IDA7IGsgPCA0OyArK2spIHJba10gPSBNW2ldW2tdOworfQorc3RhdGljIGlubGluZSB2b2lkIG1hdDR4NF90cmFuc3Bvc2UobWF0NHg0IE0sIG1hdDR4NCBOKSB7CisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMDsgaiA8IDQ7ICsraikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgTVtpXVtqXSA9IE5bal1baV07Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X2FkZChtYXQ0eDQgTSwgbWF0NHg0IGEsIG1hdDR4NCBiKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgdmVjNF9hZGQoTVtpXSwgYVtpXSwgYltpXSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X3N1YihtYXQ0eDQgTSwgbWF0NHg0IGEsIG1hdDR4NCBiKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgdmVjNF9zdWIoTVtpXSwgYVtpXSwgYltpXSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X3NjYWxlKG1hdDR4NCBNLCBtYXQ0eDQgYSwgZmxvYXQgaykgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHZlYzRfc2NhbGUoTVtpXSwgYVtpXSwgayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X3NjYWxlX2FuaXNvKG1hdDR4NCBNLCBtYXQ0eDQgYSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGludCBpOworICAgIHZlYzRfc2NhbGUoTVswXSwgYVswXSwgeCk7CisgICAgdmVjNF9zY2FsZShNWzFdLCBhWzFdLCB5KTsKKyAgICB2ZWM0X3NjYWxlKE1bMl0sIGFbMl0sIHopOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgTVszXVtpXSA9IGFbM11baV07CisgICAgfQorfQorc3RhdGljIGlubGluZSB2b2lkIG1hdDR4NF9tdWwobWF0NHg0IE0sIG1hdDR4NCBhLCBtYXQ0eDQgYikgeworICAgIGludCBrLCByLCBjOworICAgIGZvciAoYyA9IDA7IGMgPCA0OyArK2MpCisgICAgICAgIGZvciAociA9IDA7IHIgPCA0OyArK3IpIHsKKyAgICAgICAgICAgIE1bY11bcl0gPSAwLmY7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgKytrKSBNW2NdW3JdICs9IGFba11bcl0gKiBiW2NdW2tdOworICAgICAgICB9Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X211bF92ZWM0KHZlYzQgciwgbWF0NHg0IE0sIHZlYzQgdikgeworICAgIGludCBpLCBqOworICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgcltqXSA9IDAuZjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgcltqXSArPSBNW2ldW2pdICogdltpXTsKKyAgICB9Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X3RyYW5zbGF0ZShtYXQ0eDQgVCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIG1hdDR4NF9pZGVudGl0eShUKTsKKyAgICBUWzNdWzBdID0geDsKKyAgICBUWzNdWzFdID0geTsKKyAgICBUWzNdWzJdID0gejsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXQ0eDRfdHJhbnNsYXRlX2luX3BsYWNlKG1hdDR4NCBNLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgdmVjNCB0ID0ge3gsIHksIHosIDB9OworICAgIHZlYzQgcjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIG1hdDR4NF9yb3cociwgTSwgaSk7CisgICAgICAgIE1bM11baV0gKz0gdmVjNF9tdWxfaW5uZXIociwgdCk7CisgICAgfQorfQorc3RhdGljIGlubGluZSB2b2lkIG1hdDR4NF9mcm9tX3ZlYzNfbXVsX291dGVyKG1hdDR4NCBNLCB2ZWMzIGEsIHZlYzMgYikgeworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIE1baV1bal0gPSBpIDwgMyAmJiBqIDwgMyA/IGFbaV0gKiBiW2pdIDogMC5mOworfQorc3RhdGljIGlubGluZSB2b2lkIG1hdDR4NF9yb3RhdGUobWF0NHg0IFIsIG1hdDR4NCBNLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCBhbmdsZSkgeworICAgIGZsb2F0IHMgPSBzaW5mKGFuZ2xlKTsKKyAgICBmbG9hdCBjID0gY29zZihhbmdsZSk7CisgICAgdmVjMyB1ID0ge3gsIHksIHp9OworCisgICAgaWYgKHZlYzNfbGVuKHUpID4gMWUtNCkgeworICAgICAgICB2ZWMzX25vcm0odSwgdSk7CisgICAgICAgIG1hdDR4NCBUOworICAgICAgICBtYXQ0eDRfZnJvbV92ZWMzX211bF9vdXRlcihULCB1LCB1KTsKKworICAgICAgICBtYXQ0eDQgUyA9IHt7MCwgdVsyXSwgLXVbMV0sIDB9LCB7LXVbMl0sIDAsIHVbMF0sIDB9LCB7dVsxXSwgLXVbMF0sIDAsIDB9LCB7MCwgMCwgMCwgMH19OworICAgICAgICBtYXQ0eDRfc2NhbGUoUywgUywgcyk7CisKKyAgICAgICAgbWF0NHg0IEM7CisgICAgICAgIG1hdDR4NF9pZGVudGl0eShDKTsKKyAgICAgICAgbWF0NHg0X3N1YihDLCBDLCBUKTsKKworICAgICAgICBtYXQ0eDRfc2NhbGUoQywgQywgYyk7CisKKyAgICAgICAgbWF0NHg0X2FkZChULCBULCBDKTsKKyAgICAgICAgbWF0NHg0X2FkZChULCBULCBTKTsKKworICAgICAgICBUWzNdWzNdID0gMS47CisgICAgICAgIG1hdDR4NF9tdWwoUiwgTSwgVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0NHg0X2R1cChSLCBNKTsKKyAgICB9Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X3JvdGF0ZV9YKG1hdDR4NCBRLCBtYXQ0eDQgTSwgZmxvYXQgYW5nbGUpIHsKKyAgICBmbG9hdCBzID0gc2luZihhbmdsZSk7CisgICAgZmxvYXQgYyA9IGNvc2YoYW5nbGUpOworICAgIG1hdDR4NCBSID0ge3sxLmYsIDAuZiwgMC5mLCAwLmZ9LCB7MC5mLCBjLCBzLCAwLmZ9LCB7MC5mLCAtcywgYywgMC5mfSwgezAuZiwgMC5mLCAwLmYsIDEuZn19OworICAgIG1hdDR4NF9tdWwoUSwgTSwgUik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X3JvdGF0ZV9ZKG1hdDR4NCBRLCBtYXQ0eDQgTSwgZmxvYXQgYW5nbGUpIHsKKyAgICBmbG9hdCBzID0gc2luZihhbmdsZSk7CisgICAgZmxvYXQgYyA9IGNvc2YoYW5nbGUpOworICAgIG1hdDR4NCBSID0ge3tjLCAwLmYsIHMsIDAuZn0sIHswLmYsIDEuZiwgMC5mLCAwLmZ9LCB7LXMsIDAuZiwgYywgMC5mfSwgezAuZiwgMC5mLCAwLmYsIDEuZn19OworICAgIG1hdDR4NF9tdWwoUSwgTSwgUik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X3JvdGF0ZV9aKG1hdDR4NCBRLCBtYXQ0eDQgTSwgZmxvYXQgYW5nbGUpIHsKKyAgICBmbG9hdCBzID0gc2luZihhbmdsZSk7CisgICAgZmxvYXQgYyA9IGNvc2YoYW5nbGUpOworICAgIG1hdDR4NCBSID0ge3tjLCBzLCAwLmYsIDAuZn0sIHstcywgYywgMC5mLCAwLmZ9LCB7MC5mLCAwLmYsIDEuZiwgMC5mfSwgezAuZiwgMC5mLCAwLmYsIDEuZn19OworICAgIG1hdDR4NF9tdWwoUSwgTSwgUik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X2ludmVydChtYXQ0eDQgVCwgbWF0NHg0IE0pIHsKKyAgICBmbG9hdCBzWzZdOworICAgIGZsb2F0IGNbNl07CisgICAgc1swXSA9IE1bMF1bMF0gKiBNWzFdWzFdIC0gTVsxXVswXSAqIE1bMF1bMV07CisgICAgc1sxXSA9IE1bMF1bMF0gKiBNWzFdWzJdIC0gTVsxXVswXSAqIE1bMF1bMl07CisgICAgc1syXSA9IE1bMF1bMF0gKiBNWzFdWzNdIC0gTVsxXVswXSAqIE1bMF1bM107CisgICAgc1szXSA9IE1bMF1bMV0gKiBNWzFdWzJdIC0gTVsxXVsxXSAqIE1bMF1bMl07CisgICAgc1s0XSA9IE1bMF1bMV0gKiBNWzFdWzNdIC0gTVsxXVsxXSAqIE1bMF1bM107CisgICAgc1s1XSA9IE1bMF1bMl0gKiBNWzFdWzNdIC0gTVsxXVsyXSAqIE1bMF1bM107CisKKyAgICBjWzBdID0gTVsyXVswXSAqIE1bM11bMV0gLSBNWzNdWzBdICogTVsyXVsxXTsKKyAgICBjWzFdID0gTVsyXVswXSAqIE1bM11bMl0gLSBNWzNdWzBdICogTVsyXVsyXTsKKyAgICBjWzJdID0gTVsyXVswXSAqIE1bM11bM10gLSBNWzNdWzBdICogTVsyXVszXTsKKyAgICBjWzNdID0gTVsyXVsxXSAqIE1bM11bMl0gLSBNWzNdWzFdICogTVsyXVsyXTsKKyAgICBjWzRdID0gTVsyXVsxXSAqIE1bM11bM10gLSBNWzNdWzFdICogTVsyXVszXTsKKyAgICBjWzVdID0gTVsyXVsyXSAqIE1bM11bM10gLSBNWzNdWzJdICogTVsyXVszXTsKKworICAgIC8qIEFzc3VtZXMgaXQgaXMgaW52ZXJ0aWJsZSAqLworICAgIGZsb2F0IGlkZXQgPSAxLjBmIC8gKHNbMF0gKiBjWzVdIC0gc1sxXSAqIGNbNF0gKyBzWzJdICogY1szXSArIHNbM10gKiBjWzJdIC0gc1s0XSAqIGNbMV0gKyBzWzVdICogY1swXSk7CisKKyAgICBUWzBdWzBdID0gKE1bMV1bMV0gKiBjWzVdIC0gTVsxXVsyXSAqIGNbNF0gKyBNWzFdWzNdICogY1szXSkgKiBpZGV0OworICAgIFRbMF1bMV0gPSAoLU1bMF1bMV0gKiBjWzVdICsgTVswXVsyXSAqIGNbNF0gLSBNWzBdWzNdICogY1szXSkgKiBpZGV0OworICAgIFRbMF1bMl0gPSAoTVszXVsxXSAqIHNbNV0gLSBNWzNdWzJdICogc1s0XSArIE1bM11bM10gKiBzWzNdKSAqIGlkZXQ7CisgICAgVFswXVszXSA9ICgtTVsyXVsxXSAqIHNbNV0gKyBNWzJdWzJdICogc1s0XSAtIE1bMl1bM10gKiBzWzNdKSAqIGlkZXQ7CisKKyAgICBUWzFdWzBdID0gKC1NWzFdWzBdICogY1s1XSArIE1bMV1bMl0gKiBjWzJdIC0gTVsxXVszXSAqIGNbMV0pICogaWRldDsKKyAgICBUWzFdWzFdID0gKE1bMF1bMF0gKiBjWzVdIC0gTVswXVsyXSAqIGNbMl0gKyBNWzBdWzNdICogY1sxXSkgKiBpZGV0OworICAgIFRbMV1bMl0gPSAoLU1bM11bMF0gKiBzWzVdICsgTVszXVsyXSAqIHNbMl0gLSBNWzNdWzNdICogc1sxXSkgKiBpZGV0OworICAgIFRbMV1bM10gPSAoTVsyXVswXSAqIHNbNV0gLSBNWzJdWzJdICogc1syXSArIE1bMl1bM10gKiBzWzFdKSAqIGlkZXQ7CisKKyAgICBUWzJdWzBdID0gKE1bMV1bMF0gKiBjWzRdIC0gTVsxXVsxXSAqIGNbMl0gKyBNWzFdWzNdICogY1swXSkgKiBpZGV0OworICAgIFRbMl1bMV0gPSAoLU1bMF1bMF0gKiBjWzRdICsgTVswXVsxXSAqIGNbMl0gLSBNWzBdWzNdICogY1swXSkgKiBpZGV0OworICAgIFRbMl1bMl0gPSAoTVszXVswXSAqIHNbNF0gLSBNWzNdWzFdICogc1syXSArIE1bM11bM10gKiBzWzBdKSAqIGlkZXQ7CisgICAgVFsyXVszXSA9ICgtTVsyXVswXSAqIHNbNF0gKyBNWzJdWzFdICogc1syXSAtIE1bMl1bM10gKiBzWzBdKSAqIGlkZXQ7CisKKyAgICBUWzNdWzBdID0gKC1NWzFdWzBdICogY1szXSArIE1bMV1bMV0gKiBjWzFdIC0gTVsxXVsyXSAqIGNbMF0pICogaWRldDsKKyAgICBUWzNdWzFdID0gKE1bMF1bMF0gKiBjWzNdIC0gTVswXVsxXSAqIGNbMV0gKyBNWzBdWzJdICogY1swXSkgKiBpZGV0OworICAgIFRbM11bMl0gPSAoLU1bM11bMF0gKiBzWzNdICsgTVszXVsxXSAqIHNbMV0gLSBNWzNdWzJdICogc1swXSkgKiBpZGV0OworICAgIFRbM11bM10gPSAoTVsyXVswXSAqIHNbM10gLSBNWzJdWzFdICogc1sxXSArIE1bMl1bMl0gKiBzWzBdKSAqIGlkZXQ7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWF0NHg0X29ydGhvbm9ybWFsaXplKG1hdDR4NCBSLCBtYXQ0eDQgTSkgeworICAgIG1hdDR4NF9kdXAoUiwgTSk7CisgICAgZmxvYXQgcyA9IDEuOworICAgIHZlYzMgaDsKKworICAgIHZlYzNfbm9ybShSWzJdLCBSWzJdKTsKKworICAgIHMgPSB2ZWMzX211bF9pbm5lcihSWzFdLCBSWzJdKTsKKyAgICB2ZWMzX3NjYWxlKGgsIFJbMl0sIHMpOworICAgIHZlYzNfc3ViKFJbMV0sIFJbMV0sIGgpOworICAgIHZlYzNfbm9ybShSWzJdLCBSWzJdKTsKKworICAgIHMgPSB2ZWMzX211bF9pbm5lcihSWzFdLCBSWzJdKTsKKyAgICB2ZWMzX3NjYWxlKGgsIFJbMl0sIHMpOworICAgIHZlYzNfc3ViKFJbMV0sIFJbMV0sIGgpOworICAgIHZlYzNfbm9ybShSWzFdLCBSWzFdKTsKKworICAgIHMgPSB2ZWMzX211bF9pbm5lcihSWzBdLCBSWzFdKTsKKyAgICB2ZWMzX3NjYWxlKGgsIFJbMV0sIHMpOworICAgIHZlYzNfc3ViKFJbMF0sIFJbMF0sIGgpOworICAgIHZlYzNfbm9ybShSWzBdLCBSWzBdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1hdDR4NF9mcnVzdHVtKG1hdDR4NCBNLCBmbG9hdCBsLCBmbG9hdCByLCBmbG9hdCBiLCBmbG9hdCB0LCBmbG9hdCBuLCBmbG9hdCBmKSB7CisgICAgTVswXVswXSA9IDIuZiAqIG4gLyAociAtIGwpOworICAgIE1bMF1bMV0gPSBNWzBdWzJdID0gTVswXVszXSA9IDAuZjsKKworICAgIE1bMV1bMV0gPSAyLmYgKiBuIC8gKHQgLSBiKTsKKyAgICBNWzFdWzBdID0gTVsxXVsyXSA9IE1bMV1bM10gPSAwLmY7CisKKyAgICBNWzJdWzBdID0gKHIgKyBsKSAvIChyIC0gbCk7CisgICAgTVsyXVsxXSA9ICh0ICsgYikgLyAodCAtIGIpOworICAgIE1bMl1bMl0gPSAtKGYgKyBuKSAvIChmIC0gbik7CisgICAgTVsyXVszXSA9IC0xLmY7CisKKyAgICBNWzNdWzJdID0gLTIuZiAqIChmICogbikgLyAoZiAtIG4pOworICAgIE1bM11bMF0gPSBNWzNdWzFdID0gTVszXVszXSA9IDAuZjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXQ0eDRfb3J0aG8obWF0NHg0IE0sIGZsb2F0IGwsIGZsb2F0IHIsIGZsb2F0IGIsIGZsb2F0IHQsIGZsb2F0IG4sIGZsb2F0IGYpIHsKKyAgICBNWzBdWzBdID0gMi5mIC8gKHIgLSBsKTsKKyAgICBNWzBdWzFdID0gTVswXVsyXSA9IE1bMF1bM10gPSAwLmY7CisKKyAgICBNWzFdWzFdID0gMi5mIC8gKHQgLSBiKTsKKyAgICBNWzFdWzBdID0gTVsxXVsyXSA9IE1bMV1bM10gPSAwLmY7CisKKyAgICBNWzJdWzJdID0gLTIuZiAvIChmIC0gbik7CisgICAgTVsyXVswXSA9IE1bMl1bMV0gPSBNWzJdWzNdID0gMC5mOworCisgICAgTVszXVswXSA9IC0ociArIGwpIC8gKHIgLSBsKTsKKyAgICBNWzNdWzFdID0gLSh0ICsgYikgLyAodCAtIGIpOworICAgIE1bM11bMl0gPSAtKGYgKyBuKSAvIChmIC0gbik7CisgICAgTVszXVszXSA9IDEuZjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXQ0eDRfcGVyc3BlY3RpdmUobWF0NHg0IG0sIGZsb2F0IHlfZm92LCBmbG9hdCBhc3BlY3QsIGZsb2F0IG4sIGZsb2F0IGYpIHsKKyAgICAvKiBOT1RFOiBEZWdyZWVzIGFyZSBhbiB1bmhhbmR5IHVuaXQgdG8gd29yayB3aXRoLgorICAgICAqIGxpbm1hdGguaCB1c2VzIHJhZGlhbnMgZm9yIGV2ZXJ5dGhpbmchICovCisgICAgZmxvYXQgY29uc3QgYSA9IChmbG9hdCkoMS5mIC8gdGFuKHlfZm92IC8gMi5mKSk7CisKKyAgICBtWzBdWzBdID0gYSAvIGFzcGVjdDsKKyAgICBtWzBdWzFdID0gMC5mOworICAgIG1bMF1bMl0gPSAwLmY7CisgICAgbVswXVszXSA9IDAuZjsKKworICAgIG1bMV1bMF0gPSAwLmY7CisgICAgbVsxXVsxXSA9IGE7CisgICAgbVsxXVsyXSA9IDAuZjsKKyAgICBtWzFdWzNdID0gMC5mOworCisgICAgbVsyXVswXSA9IDAuZjsKKyAgICBtWzJdWzFdID0gMC5mOworICAgIG1bMl1bMl0gPSAtKChmICsgbikgLyAoZiAtIG4pKTsKKyAgICBtWzJdWzNdID0gLTEuZjsKKworICAgIG1bM11bMF0gPSAwLmY7CisgICAgbVszXVsxXSA9IDAuZjsKKyAgICBtWzNdWzJdID0gLSgoMi5mICogZiAqIG4pIC8gKGYgLSBuKSk7CisgICAgbVszXVszXSA9IDAuZjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXQ0eDRfbG9va19hdChtYXQ0eDQgbSwgdmVjMyBleWUsIHZlYzMgY2VudGVyLCB2ZWMzIHVwKSB7CisgICAgLyogQWRhcHRlZCBmcm9tIEFuZHJvaWQncyBPcGVuR0wgTWF0cml4LmphdmEuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBTZWUgdGhlIE9wZW5HTCBHTFVUIGRvY3VtZW50YXRpb24gZm9yIGdsdUxvb2tBdCBmb3IgYSBkZXNjcmlwdGlvbiAqLworICAgIC8qIG9mIHRoZSBhbGdvcml0aG0uIFdlIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCB3YXk6ICAgICAgICovCisKKyAgICAvKiBUT0RPOiBUaGUgbmVnYXRpb24gb2Ygb2YgY2FuIGJlIHNwYXJlZCBieSBzd2FwcGluZyB0aGUgb3JkZXIgb2YKKyAgICAgKiAgICAgICBvcGVyYW5kcyBpbiB0aGUgZm9sbG93aW5nIGNyb3NzIHByb2R1Y3RzIGluIHRoZSByaWdodCB3YXkuICovCisgICAgdmVjMyBmOworICAgIHZlYzNfc3ViKGYsIGNlbnRlciwgZXllKTsKKyAgICB2ZWMzX25vcm0oZiwgZik7CisKKyAgICB2ZWMzIHM7CisgICAgdmVjM19tdWxfY3Jvc3MocywgZiwgdXApOworICAgIHZlYzNfbm9ybShzLCBzKTsKKworICAgIHZlYzMgdDsKKyAgICB2ZWMzX211bF9jcm9zcyh0LCBzLCBmKTsKKworICAgIG1bMF1bMF0gPSBzWzBdOworICAgIG1bMF1bMV0gPSB0WzBdOworICAgIG1bMF1bMl0gPSAtZlswXTsKKyAgICBtWzBdWzNdID0gMC5mOworCisgICAgbVsxXVswXSA9IHNbMV07CisgICAgbVsxXVsxXSA9IHRbMV07CisgICAgbVsxXVsyXSA9IC1mWzFdOworICAgIG1bMV1bM10gPSAwLmY7CisKKyAgICBtWzJdWzBdID0gc1syXTsKKyAgICBtWzJdWzFdID0gdFsyXTsKKyAgICBtWzJdWzJdID0gLWZbMl07CisgICAgbVsyXVszXSA9IDAuZjsKKworICAgIG1bM11bMF0gPSAwLmY7CisgICAgbVszXVsxXSA9IDAuZjsKKyAgICBtWzNdWzJdID0gMC5mOworICAgIG1bM11bM10gPSAxLmY7CisKKyAgICBtYXQ0eDRfdHJhbnNsYXRlX2luX3BsYWNlKG0sIC1leWVbMF0sIC1leWVbMV0sIC1leWVbMl0pOworfQorCit0eXBlZGVmIGZsb2F0IHF1YXRbNF07CitzdGF0aWMgaW5saW5lIHZvaWQgcXVhdF9pZGVudGl0eShxdWF0IHEpIHsKKyAgICBxWzBdID0gcVsxXSA9IHFbMl0gPSAwLmY7CisgICAgcVszXSA9IDEuZjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBxdWF0X2FkZChxdWF0IHIsIHF1YXQgYSwgcXVhdCBiKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgcltpXSA9IGFbaV0gKyBiW2ldOworfQorc3RhdGljIGlubGluZSB2b2lkIHF1YXRfc3ViKHF1YXQgciwgcXVhdCBhLCBxdWF0IGIpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSByW2ldID0gYVtpXSAtIGJbaV07Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcXVhdF9tdWwocXVhdCByLCBxdWF0IHAsIHF1YXQgcSkgeworICAgIHZlYzMgdzsKKyAgICB2ZWMzX211bF9jcm9zcyhyLCBwLCBxKTsKKyAgICB2ZWMzX3NjYWxlKHcsIHAsIHFbM10pOworICAgIHZlYzNfYWRkKHIsIHIsIHcpOworICAgIHZlYzNfc2NhbGUodywgcSwgcFszXSk7CisgICAgdmVjM19hZGQociwgciwgdyk7CisgICAgclszXSA9IHBbM10gKiBxWzNdIC0gdmVjM19tdWxfaW5uZXIocCwgcSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcXVhdF9zY2FsZShxdWF0IHIsIHF1YXQgdiwgZmxvYXQgcykgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHJbaV0gPSB2W2ldICogczsKK30KK3N0YXRpYyBpbmxpbmUgZmxvYXQgcXVhdF9pbm5lcl9wcm9kdWN0KHF1YXQgYSwgcXVhdCBiKSB7CisgICAgZmxvYXQgcCA9IDAuZjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBwICs9IGJbaV0gKiBhW2ldOworICAgIHJldHVybiBwOworfQorc3RhdGljIGlubGluZSB2b2lkIHF1YXRfY29uaihxdWF0IHIsIHF1YXQgcSkgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHJbaV0gPSAtcVtpXTsKKyAgICByWzNdID0gcVszXTsKK30KKyNkZWZpbmUgcXVhdF9ub3JtIHZlYzRfbm9ybQorc3RhdGljIGlubGluZSB2b2lkIHF1YXRfbXVsX3ZlYzModmVjMyByLCBxdWF0IHEsIHZlYzMgdikgeworICAgIHF1YXQgdl8gPSB7dlswXSwgdlsxXSwgdlsyXSwgMC5mfTsKKworICAgIHF1YXRfY29uaihyLCBxKTsKKyAgICBxdWF0X25vcm0ociwgcik7CisgICAgcXVhdF9tdWwociwgdl8sIHIpOworICAgIHF1YXRfbXVsKHIsIHEsIHIpOworfQorc3RhdGljIGlubGluZSB2b2lkIG1hdDR4NF9mcm9tX3F1YXQobWF0NHg0IE0sIHF1YXQgcSkgeworICAgIGZsb2F0IGEgPSBxWzNdOworICAgIGZsb2F0IGIgPSBxWzBdOworICAgIGZsb2F0IGMgPSBxWzFdOworICAgIGZsb2F0IGQgPSBxWzJdOworICAgIGZsb2F0IGEyID0gYSAqIGE7CisgICAgZmxvYXQgYjIgPSBiICogYjsKKyAgICBmbG9hdCBjMiA9IGMgKiBjOworICAgIGZsb2F0IGQyID0gZCAqIGQ7CisKKyAgICBNWzBdWzBdID0gYTIgKyBiMiAtIGMyIC0gZDI7CisgICAgTVswXVsxXSA9IDIuZiAqIChiICogYyArIGEgKiBkKTsKKyAgICBNWzBdWzJdID0gMi5mICogKGIgKiBkIC0gYSAqIGMpOworICAgIE1bMF1bM10gPSAwLmY7CisKKyAgICBNWzFdWzBdID0gMiAqIChiICogYyAtIGEgKiBkKTsKKyAgICBNWzFdWzFdID0gYTIgLSBiMiArIGMyIC0gZDI7CisgICAgTVsxXVsyXSA9IDIuZiAqIChjICogZCArIGEgKiBiKTsKKyAgICBNWzFdWzNdID0gMC5mOworCisgICAgTVsyXVswXSA9IDIuZiAqIChiICogZCArIGEgKiBjKTsKKyAgICBNWzJdWzFdID0gMi5mICogKGMgKiBkIC0gYSAqIGIpOworICAgIE1bMl1bMl0gPSBhMiAtIGIyIC0gYzIgKyBkMjsKKyAgICBNWzJdWzNdID0gMC5mOworCisgICAgTVszXVswXSA9IE1bM11bMV0gPSBNWzNdWzJdID0gMC5mOworICAgIE1bM11bM10gPSAxLmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXQ0eDRvX211bF9xdWF0KG1hdDR4NCBSLCBtYXQ0eDQgTSwgcXVhdCBxKSB7CisgICAgLyogIFhYWDogVGhlIHdheSB0aGlzIGlzIHdyaXR0ZW4gb25seSB3b3JrcyBmb3Igb3Rob2dvbmFsIG1hdHJpY2VzLiAqLworICAgIC8qIFRPRE86IFRha2UgY2FyZSBvZiBub24tb3J0aG9nb25hbCBjYXNlLiAqLworICAgIHF1YXRfbXVsX3ZlYzMoUlswXSwgcSwgTVswXSk7CisgICAgcXVhdF9tdWxfdmVjMyhSWzFdLCBxLCBNWzFdKTsKKyAgICBxdWF0X211bF92ZWMzKFJbMl0sIHEsIE1bMl0pOworCisgICAgUlszXVswXSA9IFJbM11bMV0gPSBSWzNdWzJdID0gMC5mOworICAgIFJbM11bM10gPSAxLmY7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcXVhdF9mcm9tX21hdDR4NChxdWF0IHEsIG1hdDR4NCBNKSB7CisgICAgZmxvYXQgciA9IDAuZjsKKyAgICBpbnQgaTsKKworICAgIGludCBwZXJtW10gPSB7MCwgMSwgMiwgMCwgMX07CisgICAgaW50ICpwID0gcGVybTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgZmxvYXQgbSA9IE1baV1baV07CisgICAgICAgIGlmIChtIDwgcikgY29udGludWU7CisgICAgICAgIG0gPSByOworICAgICAgICBwID0gJnBlcm1baV07CisgICAgfQorCisgICAgciA9IHNxcnRmKDEuZiArIE1bcFswXV1bcFswXV0gLSBNW3BbMV1dW3BbMV1dIC0gTVtwWzJdXVtwWzJdXSk7CisKKyAgICBpZiAociA8IDFlLTYpIHsKKyAgICAgICAgcVswXSA9IDEuZjsKKyAgICAgICAgcVsxXSA9IHFbMl0gPSBxWzNdID0gMC5mOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcVswXSA9IHIgLyAyLmY7CisgICAgcVsxXSA9IChNW3BbMF1dW3BbMV1dIC0gTVtwWzFdXVtwWzBdXSkgLyAoMi5mICogcik7CisgICAgcVsyXSA9IChNW3BbMl1dW3BbMF1dIC0gTVtwWzBdXVtwWzJdXSkgLyAoMi5mICogcik7CisgICAgcVszXSA9IChNW3BbMl1dW3BbMV1dIC0gTVtwWzFdXVtwWzJdXSkgLyAoMi5mICogcik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9sdW5hcmcucHBtLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL2x1bmFyZy5wcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzhhOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9sdW5hcmcucHBtLmgKQEAgLTAsMCArMSw5MzY1IEBACitzdGF0aWMgdW5zaWduZWQgY2hhciBsdW5hcmdfcHBtW10gPSB7CisgICAgMHg1MCwgMHgzNiwgMHgwYSwgMHgzMiwgMHgzNSwgMHgzNiwgMHgyMCwgMHgzMiwgMHgzNSwgMHgzNiwgMHgwYSwgMHgzMiwgMHgzNSwgMHgzNSwgMHgwYSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsCisgICAgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwKKyAgICAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdiLAorICAgIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLAorICAgIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdiLAorICAgIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwKKyAgICAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLAorICAgIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwKKyAgICAweDdkLCAweDdkLCAweDdkLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgICAgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdjLCAweDdjLCAweDdjLAorICAgIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgICAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZSwgMHg3ZSwgMHg3ZSwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsCisgICAgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwKKyAgICAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2UsIDB4N2UsIDB4N2UsCisgICAgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCisgICAgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwKKyAgICAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLAorICAgIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODAsIDB4ODAsIDB4ODAsCisgICAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZSwgMHg3ZSwgMHg3ZSwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLAorICAgIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwKKyAgICAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCisgICAgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywKKyAgICAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LAorICAgIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsCisgICAgMHg4MywgMHg4MywgMHg4MywgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwKKyAgICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCisgICAgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwKKyAgICAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LAorICAgIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsCisgICAgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywKKyAgICAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLAorICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsCisgICAgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YiwgMHg3YiwgMHg3YiwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwKKyAgICAweDdiLCAweDdiLCAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsCisgICAgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwKKyAgICAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg2LCAweDg2LCAweDg2LAorICAgIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsCisgICAgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NSwgMHg4NSwgMHg4NSwKKyAgICAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LAorICAgIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODAsIDB4ODAsIDB4ODAsCisgICAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZCwgMHg3ZCwgMHg3ZCwKKyAgICAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDY5LCAweDc0LCAweDc1LCAweDMzLCAweDZkLCAweDc1LCAweDE0LCAweDY1LCAweDcxLAorICAgIDB4MGYsIDB4NjIsIDB4NmUsIDB4MGYsIDB4NjIsIDB4NmUsIDB4MGYsIDB4NjIsIDB4NmUsIDB4MGYsIDB4NjIsIDB4NmUsIDB4MGYsIDB4NjIsIDB4NmUsIDB4MGYsIDB4NjIsIDB4NmUsIDB4MGYsIDB4NjIsIDB4NmUsCisgICAgMHgwZiwgMHg2MiwgMHg2ZSwgMHgwZiwgMHg2MiwgMHg2ZSwgMHgwZiwgMHg2MiwgMHg2ZSwgMHgwZiwgMHg2MiwgMHg2ZSwgMHgwZiwgMHg2MiwgMHg2ZSwgMHgwZiwgMHg2MiwgMHg2ZSwgMHgwZiwgMHg2MiwgMHg2ZSwKKyAgICAweDBmLCAweDYyLCAweDZlLCAweDBmLCAweDYyLCAweDZlLCAweDBmLCAweDYyLCAweDZlLCAweDBmLCAweDYyLCAweDZlLCAweDBmLCAweDYyLCAweDZlLCAweDBmLCAweDYyLCAweDZlLCAweDBmLCAweDYyLCAweDZlLAorICAgIDB4MGYsIDB4NjIsIDB4NmUsIDB4MGYsIDB4NjIsIDB4NmQsIDB4MGYsIDB4NjIsIDB4NmQsIDB4MGYsIDB4NjIsIDB4NmQsIDB4MGYsIDB4NjEsIDB4NmQsIDB4MGYsIDB4NjEsIDB4NmQsIDB4MGYsIDB4NjEsIDB4NmQsCisgICAgMHgwZiwgMHg2MSwgMHg2ZCwgMHgwZiwgMHg2MSwgMHg2ZCwgMHgwZiwgMHg2MSwgMHg2ZCwgMHgwZiwgMHg2MSwgMHg2ZCwgMHgwZiwgMHg2MSwgMHg2ZCwgMHgwZiwgMHg2MSwgMHg2ZCwgMHgwZiwgMHg2MSwgMHg2YywKKyAgICAweDBmLCAweDYxLCAweDZjLCAweDBmLCAweDYwLCAweDZjLCAweDBmLCAweDYwLCAweDZjLCAweDBmLCAweDYwLCAweDZjLCAweDBmLCAweDYwLCAweDZjLCAweDBmLCAweDYwLCAweDZjLCAweDBmLCAweDYwLCAweDZjLAorICAgIDB4MGYsIDB4NjAsIDB4NmMsIDB4MGYsIDB4NjAsIDB4NmIsIDB4MGYsIDB4NWYsIDB4NmIsIDB4MGYsIDB4NWYsIDB4NmIsIDB4MGYsIDB4NWYsIDB4NmIsIDB4MGYsIDB4NWYsIDB4NmIsIDB4MGYsIDB4NWYsIDB4NmIsCisgICAgMHgwZiwgMHg1ZiwgMHg2YSwgMHgwZiwgMHg1ZiwgMHg2YSwgMHgwZiwgMHg1ZSwgMHg2YSwgMHgwZiwgMHg1ZSwgMHg2OSwgMHgwZiwgMHg1ZSwgMHg2OSwgMHgwZiwgMHg1ZSwgMHg2OSwgMHgwZiwgMHg1ZCwgMHg2OSwKKyAgICAweDBkLCAweDVkLCAweDY4LCAweDBkLCAweDVkLCAweDY4LCAweDBkLCAweDVkLCAweDY4LCAweDBkLCAweDVjLCAweDY4LCAweDBkLCAweDVjLCAweDY3LCAweDBkLCAweDVjLCAweDY3LCAweDBkLCAweDVjLCAweDY3LAorICAgIDB4MGQsIDB4NWIsIDB4NjYsIDB4MGQsIDB4NWIsIDB4NjYsIDB4MGQsIDB4NWIsIDB4NjYsIDB4MGQsIDB4NWEsIDB4NjUsIDB4MGQsIDB4NWEsIDB4NjUsIDB4MGQsIDB4NTksIDB4NjQsIDB4MGUsIDB4NTksIDB4NjQsCisgICAgMHgwZSwgMHg1OSwgMHg2MywgMHgwZSwgMHg1OSwgMHg2MywgMHgwZSwgMHg1OSwgMHg2MiwgMHgwZSwgMHg1OSwgMHg2MiwgMHgwZSwgMHg1NywgMHg2MSwgMHgwZSwgMHg1OCwgMHg2MCwgMHgwZiwgMHg1NywgMHg1ZiwKKyAgICAweDBmLCAweDU3LCAweDVmLCAweDBlLCAweDU2LCAweDVmLCAweDBkLCAweDU2LCAweDVmLCAweDBkLCAweDU1LCAweDVmLCAweDBkLCAweDU0LCAweDVlLCAweDBkLCAweDU0LCAweDVkLCAweDBlLCAweDUzLCAweDVlLAorICAgIDB4MGUsIDB4NTMsIDB4NWQsIDB4MGUsIDB4NTIsIDB4NWMsIDB4MGUsIDB4NTIsIDB4NWMsIDB4MGUsIDB4NTEsIDB4NWIsIDB4MGUsIDB4NTIsIDB4NWEsIDB4MGUsIDB4NTEsIDB4NWEsIDB4MGUsIDB4NGYsIDB4NTgsCisgICAgMHgwZSwgMHg0ZiwgMHg1NywgMHgwZSwgMHg0ZSwgMHg1NiwgMHgwZSwgMHg0ZCwgMHg1NiwgMHgwZiwgMHg0YywgMHg1NiwgMHgwZiwgMHg0YywgMHg1NSwgMHgwZCwgMHg0YiwgMHg1MywgMHgwZCwgMHg0YSwgMHg1MywKKyAgICAweDBkLCAweDRhLCAweDUxLCAweDBlLCAweDRhLCAweDUxLCAweDBlLCAweDQ5LCAweDUxLCAweDBkLCAweDQ4LCAweDUwLCAweDBkLCAweDQ3LCAweDRmLCAweDBkLCAweDQ2LCAweDRlLCAweDBkLCAweDQ2LCAweDRkLAorICAgIDB4MGQsIDB4NDQsIDB4NGIsIDB4MGQsIDB4NDMsIDB4NGIsIDB4MGQsIDB4NDIsIDB4NGIsIDB4MGQsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsCisgICAgMHgwYywgMHgzZSwgMHg0NSwgMHgwYywgMHgzZCwgMHg0MywgMHgwOSwgMHgzNywgMHgzZiwgMHg0MSwgMHg2OSwgMHg2ZSwgMHhkNywgMHhlNCwgMHhlNiwgMHhjNCwgMHhkNywgMHhkYSwgMHg1YiwgMHg5MSwgMHg5OCwKKyAgICAweDQ2LCAweDgxLCAweDhhLCAweDQ2LCAweDgwLCAweDg5LCAweDQ2LCAweDgwLCAweDg5LCAweDQ2LCAweDgwLCAweDg5LCAweDQ1LCAweDgwLCAweDg5LCAweDQ1LCAweDgwLCAweDg5LCAweDQzLCAweDdlLCAweDg4LAorICAgIDB4NDMsIDB4N2QsIDB4ODYsIDB4NDMsIDB4N2QsIDB4ODYsIDB4NDIsIDB4N2MsIDB4ODUsIDB4NDEsIDB4N2IsIDB4ODQsIDB4NDEsIDB4N2IsIDB4ODQsIDB4NDAsIDB4N2EsIDB4ODQsIDB4M2YsIDB4NzksIDB4ODMsCisgICAgMHgzZSwgMHg3OCwgMHg4MiwgMHgzZCwgMHg3OCwgMHg4MSwgMHgzYywgMHg3NywgMHg4MCwgMHgzYiwgMHg3NiwgMHg3ZiwgMHgzYiwgMHg3NiwgMHg3ZiwgMHgzYSwgMHg3NCwgMHg3ZCwgMHgzOSwgMHg3NCwgMHg3ZCwKKyAgICAweDM4LCAweDcxLCAweDdiLCAweDM3LCAweDcxLCAweDdiLCAweDM2LCAweDcwLCAweDdhLCAweDM1LCAweDZmLCAweDc5LCAweDM0LCAweDZmLCAweDc3LCAweDMzLCAweDZmLCAweDc3LCAweDMyLCAweDZjLCAweDc2LAorICAgIDB4MzIsIDB4NmIsIDB4NzUsIDB4MzEsIDB4NmIsIDB4NzUsIDB4MmYsIDB4NjksIDB4NzMsIDB4MmYsIDB4NjksIDB4NzEsIDB4MmUsIDB4NjgsIDB4NzEsIDB4MmQsIDB4NjgsIDB4NzAsIDB4MmQsIDB4NjcsIDB4NmYsCisgICAgMHgyYywgMHg2NSwgMHg2ZiwgMHgyYSwgMHg2NCwgMHg2ZCwgMHgyYSwgMHg2NCwgMHg2YywgMHgyOSwgMHg2MywgMHg2YywgMHgyOSwgMHg2MiwgMHg2YiwgMHgyOCwgMHg2MiwgMHg2YSwgMHgyNywgMHg2MCwgMHg2OSwKKyAgICAweDI3LCAweDYwLCAweDY5LCAweDI3LCAweDYwLCAweDY5LCAweDI2LCAweDVlLCAweDY3LCAweDI2LCAweDVlLCAweDY3LCAweDI2LCAweDVlLCAweDY1LCAweDI1LCAweDVkLCAweDY0LCAweDI1LCAweDVkLCAweDY0LAorICAgIDB4MjQsIDB4NWIsIDB4NjMsIDB4MjMsIDB4NWEsIDB4NjMsIDB4MjMsIDB4NTksIDB4NjMsIDB4MjMsIDB4NTksIDB4NjIsIDB4MjMsIDB4NTgsIDB4NjEsIDB4MjIsIDB4NTgsIDB4NjEsIDB4MjIsIDB4NTcsIDB4NjAsCisgICAgMHgyMiwgMHg1NywgMHg2MCwgMHgyMiwgMHg1NiwgMHg1ZiwgMHgyMiwgMHg1NiwgMHg1ZiwgMHgyMiwgMHg1NSwgMHg1ZCwgMHgyMSwgMHg1NSwgMHg1ZCwgMHgyMCwgMHg1MywgMHg1YiwgMHgyMCwgMHg1MiwgMHg1YiwKKyAgICAweDIwLCAweDUyLCAweDViLCAweDIwLCAweDUyLCAweDViLCAweDIwLCAweDUyLCAweDVhLCAweDFmLCAweDUxLCAweDU5LCAweDFmLCAweDUxLCAweDU5LCAweDFmLCAweDUwLCAweDU4LCAweDFlLCAweDRmLCAweDU3LAorICAgIDB4MWUsIDB4NGYsIDB4NTcsIDB4MWUsIDB4NGQsIDB4NTUsIDB4MWUsIDB4NGQsIDB4NTUsIDB4MWUsIDB4NGQsIDB4NTQsIDB4MWUsIDB4NGMsIDB4NTQsIDB4MWQsIDB4NGMsIDB4NTMsIDB4MWQsIDB4NGIsIDB4NTIsCisgICAgMHgxYywgMHg0YSwgMHg1MSwgMHgxZCwgMHg0YSwgMHg1MSwgMHgxZCwgMHg0OSwgMHg1MCwgMHgxZCwgMHg0OCwgMHg0ZiwgMHgxYywgMHg0NywgMHg0ZSwgMHgxYywgMHg0NywgMHg0ZSwgMHgxYywgMHg0NiwgMHg0ZCwKKyAgICAweDFjLCAweDQ2LCAweDRjLCAweDFiLCAweDQ1LCAweDRiLCAweDFiLCAweDQ0LCAweDRiLCAweDFiLCAweDQzLCAweDRhLCAweDFiLCAweDQzLCAweDQ5LCAweDI2LCAweDRjLCAweDUyLCAweDQ5LCAweDYyLCAweDY3LAorICAgIDB4NzIsIDB4NzMsIDB4NzMsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NTYsIDB4NzIsIDB4NzYsIDB4MGMsIDB4NjEsIDB4NmQsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWYsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwKKyAgICAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LAorICAgIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsCisgICAgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0YywgMHgwNCwgMHg0MywgMHg0YiwgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0OSwgMHgwNCwgMHg0MCwgMHg0OSwKKyAgICAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDM5LCAweDQxLAorICAgIDB4MDQsIDB4MzgsIDB4NDAsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzYsIDB4M2UsIDB4MDQsIDB4MzUsIDB4M2QsIDB4MDQsIDB4MzQsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzksCisgICAgMHgwMywgMHgzMSwgMHgzOCwgMHgwMywgMHgzMCwgMHgzNiwgMHgwMywgMHgyZiwgMHgzNSwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYiwgMHgzMSwgMHgwMywgMHgyOSwgMHgyZiwKKyAgICAweDAwLCAweDI1LCAweDJhLCAweDVhLCAweDdhLCAweDdlLCAweGZmLCAweGZmLCAweGZmLCAweGRjLCAweGU5LCAweGViLCAweDUyLCAweDkwLCAweDlhLCAweDM4LCAweDdmLCAweDhhLCAweDM4LCAweDdmLCAweDhhLAorICAgIDB4MzcsIDB4N2UsIDB4ODksIDB4MzcsIDB4N2UsIDB4ODksIDB4MzYsIDB4N2MsIDB4ODgsIDB4MzYsIDB4N2MsIDB4ODgsIDB4MzUsIDB4N2IsIDB4ODYsIDB4MzQsIDB4N2EsIDB4ODUsIDB4MzQsIDB4N2EsIDB4ODQsCisgICAgMHgzMywgMHg3OSwgMHg4MywgMHgzMiwgMHg3NywgMHg4MywgMHgzMSwgMHg3NywgMHg4MSwgMHgzMCwgMHg3NSwgMHg4MSwgMHgzMCwgMHg3NSwgMHg4MCwgMHgyZiwgMHg3NCwgMHg3ZSwgMHgyZSwgMHg3MywgMHg3ZSwKKyAgICAweDJkLCAweDcyLCAweDdjLCAweDJjLCAweDcxLCAweDdjLCAweDJiLCAweDcwLCAweDdhLCAweDJhLCAweDZlLCAweDc5LCAweDI5LCAweDZkLCAweDc4LCAweDI3LCAweDZkLCAweDc3LCAweDI2LCAweDZiLCAweDc2LAorICAgIDB4MjYsIDB4NmEsIDB4NzUsIDB4MjUsIDB4NjksIDB4NzMsIDB4MjQsIDB4NjgsIDB4NzMsIDB4MjMsIDB4NjcsIDB4NzEsIDB4MjIsIDB4NjUsIDB4NzAsIDB4MjEsIDB4NjQsIDB4NmYsIDB4MWYsIDB4NjIsIDB4NmQsCisgICAgMHgxZSwgMHg2MSwgMHg2YywgMHgxZCwgMHg2MCwgMHg2YiwgMHgxYywgMHg1ZiwgMHg2YSwgMHgxYywgMHg1ZiwgMHg2YSwgMHgxYiwgMHg1ZSwgMHg2OCwgMHgxYSwgMHg1YywgMHg2NywgMHgxOSwgMHg1YSwgMHg2NSwKKyAgICAweDE5LCAweDVhLCAweDY1LCAweDE4LCAweDU5LCAweDYzLCAweDE4LCAweDU5LCAweDYyLCAweDE3LCAweDU3LCAweDYxLCAweDE3LCAweDU2LCAweDYxLCAweDE2LCAweDU1LCAweDVmLCAweDE2LCAweDU0LCAweDVlLAorICAgIDB4MTUsIDB4NTMsIDB4NWQsIDB4MTQsIDB4NTIsIDB4NWMsIDB4MTMsIDB4NTAsIDB4NWEsIDB4MTMsIDB4NTAsIDB4NWEsIDB4MTMsIDB4NGYsIDB4NTksIDB4MTIsIDB4NGUsIDB4NTcsIDB4MTIsIDB4NGQsIDB4NTcsCisgICAgMHgxMiwgMHg0YywgMHg1NiwgMHgxMSwgMHg0YiwgMHg1NSwgMHgxMCwgMHg0YiwgMHg1NCwgMHgxMCwgMHg0YSwgMHg1MywgMHgxMCwgMHg0YSwgMHg1MywgMHgxMCwgMHg0OSwgMHg1MiwgMHgxMCwgMHg0OCwgMHg1MSwKKyAgICAweDEwLCAweDQ3LCAweDUwLCAweDBmLCAweDQ2LCAweDRmLCAweDBmLCAweDQ1LCAweDRlLCAweDBlLCAweDQzLCAweDRjLCAweDBlLCAweDQzLCAweDRiLCAweDBlLCAweDQzLCAweDRiLCAweDBlLCAweDQyLCAweDRhLAorICAgIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2UsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsCisgICAgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzOCwgMHgzZSwgMHgwYywgMHgzNywgMHgzZCwgMHgwYiwgMHgzNiwgMHgzYywKKyAgICAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDMzLCAweDNhLCAweDBiLCAweDMyLCAweDM5LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LAorICAgIDB4MGEsIDB4MmUsIDB4MzQsIDB4MGEsIDB4MmQsIDB4MzMsIDB4MGEsIDB4MmMsIDB4MzIsIDB4MDksIDB4MmIsIDB4MzEsIDB4MjEsIDB4NDYsIDB4NGMsIDB4NjksIDB4NzAsIDB4NzEsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NjMsIDB4NzMsIDB4NzYsIDB4MGIsIDB4NjAsIDB4NmQsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsCisgICAgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwKKyAgICAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LAorICAgIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsCisgICAgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywKKyAgICAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAxLCAweDI5LCAweDJmLCAweDAwLCAweDIzLCAweDI5LCAweDY5LCAweDg3LCAweDhiLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTAsIDB4ZWMsIDB4ZWQsIDB4NTUsIDB4OTMsIDB4OWMsIDB4M2IsIDB4ODEsIDB4OGMsIDB4M2IsIDB4ODEsIDB4OGIsIDB4M2EsIDB4ODEsIDB4OGIsIDB4MzksIDB4N2YsIDB4OGEsCisgICAgMHgzOSwgMHg3ZSwgMHg4OSwgMHgzOCwgMHg3ZSwgMHg4OSwgMHgzNywgMHg3ZCwgMHg4NywgMHgzNywgMHg3YywgMHg4NywgMHgzNiwgMHg3YywgMHg4NywgMHgzNSwgMHg3YiwgMHg4NSwgMHgzNCwgMHg3YSwgMHg4NSwKKyAgICAweDMzLCAweDc5LCAweDgzLCAweDMxLCAweDc3LCAweDgyLCAweDMxLCAweDc2LCAweDgxLCAweDMwLCAweDc1LCAweDgwLCAweDJmLCAweDc1LCAweDdmLCAweDJlLCAweDczLCAweDdlLCAweDJkLCAweDcyLCAweDdjLAorICAgIDB4MmMsIDB4NzEsIDB4N2MsIDB4MmIsIDB4NzAsIDB4N2EsIDB4MmEsIDB4NmYsIDB4N2EsIDB4MjgsIDB4NmQsIDB4NzgsIDB4MjYsIDB4NmMsIDB4NzYsIDB4MjYsIDB4NmIsIDB4NzYsIDB4MjUsIDB4NmEsIDB4NzQsCisgICAgMHgyNCwgMHg2OCwgMHg3NCwgMHgyMywgMHg2NywgMHg3MiwgMHgyMiwgMHg2NiwgMHg3MSwgMHgyMSwgMHg2NSwgMHg2ZiwgMHgyMCwgMHg2NCwgMHg2ZSwgMHgxZiwgMHg2MiwgMHg2ZSwgMHgxZSwgMHg2MiwgMHg2ZCwKKyAgICAweDFkLCAweDYxLCAweDZjLCAweDFjLCAweDVmLCAweDZiLCAweDFiLCAweDVmLCAweDY5LCAweDFhLCAweDVkLCAweDY4LCAweDFhLCAweDVkLCAweDY4LCAweDE5LCAweDViLCAweDY2LCAweDE5LCAweDVhLCAweDY0LAorICAgIDB4MTgsIDB4NWEsIDB4NjMsIDB4MTcsIDB4NTgsIDB4NjMsIDB4MTcsIDB4NTgsIDB4NjIsIDB4MTYsIDB4NTYsIDB4NjAsIDB4MTYsIDB4NTUsIDB4NjAsIDB4MTUsIDB4NTQsIDB4NWYsIDB4MTUsIDB4NTQsIDB4NWUsCisgICAgMHgxNCwgMHg1MiwgMHg1YywgMHgxNCwgMHg1MiwgMHg1YywgMHgxMywgMHg1MSwgMHg1YiwgMHgxMiwgMHg0ZiwgMHg1OSwgMHgxMiwgMHg0ZSwgMHg1OCwgMHgxMiwgMHg0ZSwgMHg1NywgMHgxMiwgMHg0ZCwgMHg1NywKKyAgICAweDExLCAweDRjLCAweDU2LCAweDExLCAweDRjLCAweDU1LCAweDEwLCAweDRiLCAweDU0LCAweDEwLCAweDRiLCAweDU0LCAweDEwLCAweDRhLCAweDUzLCAweDEwLCAweDQ5LCAweDUyLCAweDEwLCAweDQ4LCAweDUxLAorICAgIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDYsIDB4NGUsIDB4MGUsIDB4NDUsIDB4NGUsIDB4MGUsIDB4NDQsIDB4NGQsIDB4MGUsIDB4NDMsIDB4NGMsIDB4MGUsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDIsIDB4NGEsCisgICAgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwKKyAgICAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLAorICAgIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzEsIDB4MzcsCisgICAgMHgwYSwgMHgyZiwgMHgzNSwgMHgwOSwgMHgyOCwgMHgyZCwgMHgyMCwgMHg0NiwgMHg0YywgMHg3MywgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHgyNCwgMHg2YSwgMHg3NCwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLAorICAgIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsCisgICAgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywKKyAgICAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLAorICAgIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmIsIDB4MzEsIDB4MDEsIDB4MjcsIDB4MmQsIDB4MDEsIDB4MjYsIDB4MmMsIDB4ODAsIDB4OWEsIDB4OWQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTEsIDB4ZWMsIDB4ZWQsCisgICAgMHg1OCwgMHg5NCwgMHg5ZCwgMHgzZSwgMHg4MywgMHg4ZSwgMHgzYywgMHg4MiwgMHg4ZCwgMHgzYywgMHg4MSwgMHg4YywgMHgzYywgMHg4MCwgMHg4YiwgMHgzYiwgMHg3ZiwgMHg4YSwgMHgzYiwgMHg3ZiwgMHg4YSwKKyAgICAweDNhLCAweDdlLCAweDg5LCAweDM5LCAweDdkLCAweDg4LCAweDM4LCAweDdkLCAweDg3LCAweDM3LCAweDdiLCAweDg2LCAweDM2LCAweDdiLCAweDg1LCAweDM0LCAweDc5LCAweDg0LCAweDMzLCAweDc4LCAweDgzLAorICAgIDB4MzIsIDB4NzcsIDB4ODIsIDB4MzEsIDB4NzYsIDB4ODEsIDB4MzAsIDB4NzQsIDB4N2YsIDB4MmYsIDB4NzMsIDB4N2UsIDB4MmUsIDB4NzIsIDB4N2QsIDB4MmQsIDB4NzEsIDB4N2MsIDB4MmMsIDB4NzAsIDB4N2IsCisgICAgMHgyYSwgMHg2ZSwgMHg3OSwgMHgyOCwgMHg2ZCwgMHg3NywgMHgyNywgMHg2YywgMHg3NywgMHgyNiwgMHg2YiwgMHg3NSwgMHgyNiwgMHg2YSwgMHg3NSwgMHgyNSwgMHg2OCwgMHg3MywgMHgyNCwgMHg2OCwgMHg3MiwKKyAgICAweDIzLCAweDY2LCAweDcwLCAweDIxLCAweDY1LCAweDZmLCAweDIxLCAweDY0LCAweDZmLCAweDFmLCAweDYzLCAweDZkLCAweDFlLCAweDYxLCAweDZkLCAweDFkLCAweDYwLCAweDZiLCAweDFjLCAweDVmLCAweDZhLAorICAgIDB4MWIsIDB4NWUsIDB4NjgsIDB4MWEsIDB4NWQsIDB4NjgsIDB4MWEsIDB4NWMsIDB4NjcsIDB4MTksIDB4NWEsIDB4NjUsIDB4MTgsIDB4NWEsIDB4NjMsIDB4MTgsIDB4NTksIDB4NjMsIDB4MTcsIDB4NTgsIDB4NjIsCisgICAgMHgxNiwgMHg1NiwgMHg2MCwgMHgxNiwgMHg1NSwgMHg2MCwgMHgxNSwgMHg1NCwgMHg1ZiwgMHgxNSwgMHg1NCwgMHg1ZSwgMHgxNSwgMHg1MywgMHg1ZCwgMHgxNCwgMHg1MiwgMHg1YywgMHgxMywgMHg1MSwgMHg1YiwKKyAgICAweDEzLCAweDUwLCAweDVhLCAweDEyLCAweDRlLCAweDU4LCAweDEyLCAweDRlLCAweDU3LCAweDEyLCAweDRkLCAweDU3LCAweDEyLCAweDRjLCAweDU2LCAweDExLCAweDRjLCAweDU1LCAweDEwLCAweDRiLCAweDU0LAorICAgIDB4MTAsIDB4NGIsIDB4NTQsIDB4MTAsIDB4NGEsIDB4NTMsIDB4MTAsIDB4NDksIDB4NTIsIDB4MTAsIDB4NDgsIDB4NTEsIDB4MTAsIDB4NDcsIDB4NTAsIDB4MGYsIDB4NDYsIDB4NGUsIDB4MGUsIDB4NDUsIDB4NGUsCisgICAgMHgwZSwgMHg0NCwgMHg0ZCwgMHgwZSwgMHg0MywgMHg0YywgMHgwZSwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MiwgMHg0YSwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywKKyAgICAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLAorICAgIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsCisgICAgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZCwgMHgzMywgMHgwOSwgMHgyOSwgMHgyZSwKKyAgICAweDQ1LCAweDYwLCAweDY0LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwYywgMHg2MSwgMHg2ZCwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwKKyAgICAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLAorICAgIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsCisgICAgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwKKyAgICAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LAorICAgIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsCisgICAgMHgwMCwgMHgyNSwgMHgyYSwgMHgwNiwgMHgyYiwgMHgyZiwgMHhhNCwgMHhiOCwgMHhiYSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhkZSwgMHhlOSwgMHhlYiwgMHg1NiwgMHg5MiwgMHg5YiwgMHgzZiwgMHg4NCwgMHg4ZiwKKyAgICAweDNmLCAweDgzLCAweDhlLCAweDNlLCAweDgyLCAweDhkLCAweDNlLCAweDgyLCAweDhkLCAweDNkLCAweDgxLCAweDhiLCAweDNjLCAweDgwLCAweDhiLCAweDNjLCAweDdmLCAweDhhLCAweDNiLCAweDdmLCAweDg5LAorICAgIDB4M2EsIDB4N2QsIDB4ODgsIDB4MzksIDB4N2QsIDB4ODcsIDB4MzcsIDB4N2IsIDB4ODUsIDB4MzUsIDB4NzksIDB4ODQsIDB4MzQsIDB4NzgsIDB4ODMsIDB4MzMsIDB4NzgsIDB4ODIsIDB4MzIsIDB4NzYsIDB4ODEsCisgICAgMHgzMSwgMHg3NCwgMHg3ZiwgMHgzMCwgMHg3NCwgMHg3ZSwgMHgyZiwgMHg3MiwgMHg3ZCwgMHgyZSwgMHg3MSwgMHg3YywgMHgyYywgMHg2ZiwgMHg3YSwgMHgyYSwgMHg2ZiwgMHg3OSwgMHgyOSwgMHg2ZCwgMHg3OCwKKyAgICAweDI4LCAweDZkLCAweDc3LCAweDI2LCAweDZhLCAweDc1LCAweDI2LCAweDY5LCAweDc0LCAweDI1LCAweDY4LCAweDcyLCAweDI0LCAweDY3LCAweDcxLCAweDIzLCAweDY2LCAweDcwLCAweDIyLCAweDY0LCAweDcwLAorICAgIDB4MjAsIDB4NjQsIDB4NmUsIDB4MWYsIDB4NjIsIDB4NmQsIDB4MWUsIDB4NjEsIDB4NmMsIDB4MWQsIDB4NjAsIDB4NmEsIDB4MWMsIDB4NWUsIDB4NjksIDB4MWIsIDB4NWUsIDB4NjgsIDB4MWEsIDB4NWMsIDB4NjcsCisgICAgMHgxYSwgMHg1YiwgMHg2NiwgMHgxOCwgMHg1YSwgMHg2NCwgMHgxOCwgMHg1OSwgMHg2MywgMHgxOCwgMHg1OSwgMHg2MiwgMHgxNywgMHg1NywgMHg2MSwgMHgxNiwgMHg1NSwgMHg2MCwgMHgxNiwgMHg1NCwgMHg1ZiwKKyAgICAweDE1LCAweDU0LCAweDVlLCAweDE1LCAweDUzLCAweDVkLCAweDE1LCAweDUzLCAweDVkLCAweDEzLCAweDUxLCAweDViLCAweDEzLCAweDUwLCAweDVhLCAweDEzLCAweDRmLCAweDU5LCAweDEyLCAweDRlLCAweDU3LAorICAgIDB4MTIsIDB4NGQsIDB4NTcsIDB4MTIsIDB4NGMsIDB4NTYsIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTAsIDB4NGIsIDB4NTQsIDB4MTAsIDB4NGIsIDB4NTQsIDB4MTAsIDB4NGEsIDB4NTMsIDB4MTAsIDB4NDksIDB4NTIsCisgICAgMHgxMCwgMHg0OCwgMHg1MSwgMHgxMCwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZSwgMHg0NSwgMHg0ZSwgMHgwZSwgMHg0NCwgMHg0ZCwgMHgwZSwgMHg0MywgMHg0YywgMHgwZSwgMHg0MywgMHg0YiwKKyAgICAweDBlLCAweDQyLCAweDRhLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LAorICAgIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsCisgICAgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywKKyAgICAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDI5LCAweDJlLCAweDIzLCAweDQ5LCAweDRmLCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsCisgICAgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsCisgICAgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwKKyAgICAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLAorICAgIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsCisgICAgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMCwgMHgyMiwgMHgyNywgMHgxMiwgMHgzNSwgMHgzYSwKKyAgICAweGNjLCAweGQ3LCAweGQ5LCAweGZmLCAweGZmLCAweGZmLCAweGQ2LCAweGU1LCAweGU3LCAweDUxLCAweDhmLCAweDk5LCAweDQzLCAweDg2LCAweDkwLCAweDQxLCAweDg0LCAweDhlLCAweDQxLCAweDg0LCAweDhlLAorICAgIDB4NDAsIDB4ODMsIDB4OGQsIDB4M2YsIDB4ODIsIDB4OGMsIDB4M2UsIDB4ODEsIDB4OGMsIDB4M2QsIDB4ODAsIDB4OGEsIDB4M2MsIDB4N2YsIDB4OGEsIDB4M2MsIDB4N2UsIDB4ODgsIDB4MzksIDB4N2MsIDB4ODYsCisgICAgMHgzOCwgMHg3YiwgMHg4NiwgMHgzNywgMHg3YSwgMHg4NCwgMHgzNiwgMHg3YSwgMHg4NCwgMHgzNCwgMHg3OCwgMHg4MiwgMHgzMywgMHg3NiwgMHg4MCwgMHgzMiwgMHg3NSwgMHg4MCwgMHgzMSwgMHg3MywgMHg3ZSwKKyAgICAweDMwLCAweDczLCAweDdkLCAweDJlLCAweDcxLCAweDdiLCAweDJjLCAweDcwLCAweDdhLCAweDJiLCAweDZlLCAweDc5LCAweDI5LCAweDZkLCAweDc3LCAweDI4LCAweDZjLCAweDc3LCAweDI3LCAweDZhLCAweDc1LAorICAgIDB4MjYsIDB4NjksIDB4NzQsIDB4MjYsIDB4NjgsIDB4NzIsIDB4MjQsIDB4NjcsIDB4NzEsIDB4MjMsIDB4NjUsIDB4NzAsIDB4MjEsIDB4NjQsIDB4NmYsIDB4MjAsIDB4NjMsIDB4NmUsIDB4MWYsIDB4NjEsIDB4NmQsCisgICAgMHgxZSwgMHg2MSwgMHg2YiwgMHgxZCwgMHg1ZiwgMHg2OSwgMHgxYywgMHg1ZSwgMHg2OSwgMHgxYiwgMHg1ZCwgMHg2NywgMHgxYSwgMHg1YiwgMHg2NiwgMHgxOSwgMHg1YiwgMHg2NSwgMHgxOCwgMHg1OSwgMHg2NCwKKyAgICAweDE4LCAweDU5LCAweDYyLCAweDE4LCAweDU4LCAweDYxLCAweDE3LCAweDU2LCAweDYxLCAweDE2LCAweDU0LCAweDVmLCAweDE2LCAweDU0LCAweDVlLCAweDE1LCAweDUzLCAweDVkLCAweDE1LCAweDUzLCAweDVkLAorICAgIDB4MTQsIDB4NTIsIDB4NWMsIDB4MTMsIDB4NTAsIDB4NWEsIDB4MTMsIDB4NGYsIDB4NTksIDB4MTMsIDB4NGYsIDB4NTgsIDB4MTIsIDB4NGQsIDB4NTcsIDB4MTIsIDB4NGMsIDB4NTYsIDB4MTIsIDB4NGMsIDB4NTUsCisgICAgMHgxMCwgMHg0YiwgMHg1NCwgMHgxMCwgMHg0YiwgMHg1NCwgMHgxMCwgMHg0YSwgMHg1MywgMHgxMCwgMHg0OSwgMHg1MiwgMHgxMCwgMHg0OCwgMHg1MSwgMHgxMCwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NywgMHg0ZiwKKyAgICAweDBlLCAweDQ1LCAweDRlLCAweDBlLCAweDQ0LCAweDRkLCAweDBlLCAweDQzLCAweDRjLCAweDBlLCAweDQzLCAweDRiLCAweDBlLCAweDQyLCAweDRhLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LAorICAgIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsCisgICAgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwKKyAgICAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LAorICAgIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwKKyAgICAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsCisgICAgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwKKyAgICAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLAorICAgIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsCisgICAgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwKKyAgICAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAwLCAweDFmLCAweDIzLCAweDI2LCAweDQ5LCAweDRlLCAweGYxLCAweGY1LCAweGY1LCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4YzcsIDB4ZGIsIDB4ZGUsIDB4NGEsIDB4OGEsIDB4OTUsIDB4NDUsIDB4ODYsIDB4OTAsIDB4NDUsIDB4ODYsIDB4OTAsIDB4NDQsIDB4ODUsIDB4OGYsIDB4NDIsIDB4ODMsIDB4OGUsIDB4NDEsIDB4ODMsIDB4OGQsCisgICAgMHg0MCwgMHg4MiwgMHg4YywgMHgzZiwgMHg4MSwgMHg4YiwgMHgzZCwgMHg4MCwgMHg4YSwgMHgzYywgMHg3ZSwgMHg4OCwgMHgzYiwgMHg3ZCwgMHg4OCwgMHgzYSwgMHg3YywgMHg4NiwgMHgzOCwgMHg3YiwgMHg4NSwKKyAgICAweDM3LCAweDc5LCAweDg0LCAweDM2LCAweDc4LCAweDgyLCAweDM0LCAweDc3LCAweDgxLCAweDMzLCAweDc1LCAweDgwLCAweDMxLCAweDc0LCAweDdlLCAweDMxLCAweDcyLCAweDdkLCAweDJlLCAweDcxLCAweDdiLAorICAgIDB4MmQsIDB4NzAsIDB4N2EsIDB4MmIsIDB4NmUsIDB4NzgsIDB4MmEsIDB4NmQsIDB4NzgsIDB4MjksIDB4NmIsIDB4NzYsIDB4MjcsIDB4NmEsIDB4NzQsIDB4MjYsIDB4NjksIDB4NzMsIDB4MjYsIDB4NjgsIDB4NzIsCisgICAgMHgyNSwgMHg2NiwgMHg3MSwgMHgyMiwgMHg2NSwgMHg2ZiwgMHgyMSwgMHg2MywgMHg2ZiwgMHgyMCwgMHg2MiwgMHg2ZCwgMHgxZiwgMHg2MSwgMHg2YywgMHgxZSwgMHg2MCwgMHg2YSwgMHgxZCwgMHg1ZiwgMHg2OSwKKyAgICAweDFjLCAweDVkLCAweDY4LCAweDFiLCAweDVjLCAweDY2LCAweDE5LCAweDViLCAweDY1LCAweDE5LCAweDVhLCAweDY1LCAweDE4LCAweDU5LCAweDYzLCAweDE4LCAweDU4LCAweDYxLCAweDE3LCAweDU2LCAweDYxLAorICAgIDB4MTcsIDB4NTUsIDB4NjAsIDB4MTYsIDB4NTQsIDB4NWUsIDB4MTYsIDB4NTMsIDB4NWQsIDB4MTUsIDB4NTMsIDB4NWQsIDB4MTQsIDB4NTIsIDB4NWMsIDB4MTQsIDB4NTEsIDB4NWIsIDB4MTMsIDB4NGYsIDB4NTksCisgICAgMHgxMywgMHg0ZiwgMHg1OCwgMHgxMiwgMHg0ZCwgMHg1NywgMHgxMiwgMHg0YywgMHg1NiwgMHgxMiwgMHg0YywgMHg1NSwgMHgxMSwgMHg0YiwgMHg1NCwgMHgxMCwgMHg0YiwgMHg1NCwgMHgxMCwgMHg0YSwgMHg1MywKKyAgICAweDEwLCAweDQ5LCAweDUyLCAweDEwLCAweDQ4LCAweDUxLCAweDEwLCAweDQ3LCAweDUwLCAweDEwLCAweDQ3LCAweDRmLCAweDBmLCAweDQ2LCAweDRmLCAweDBlLCAweDQ0LCAweDRkLCAweDBlLCAweDQzLCAweDRjLAorICAgIDB4MGUsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDIsIDB4NGEsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsCisgICAgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwKKyAgICAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LAorICAgIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsCisgICAgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwKKyAgICAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LAorICAgIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsCisgICAgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwKKyAgICAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLAorICAgIDB4MDIsIDB4MjUsIDB4MmEsIDB4MDAsIDB4MWQsIDB4MjIsIDB4NGQsIDB4NmMsIDB4NzEsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YjEsIDB4Y2QsIDB4ZDEsIDB4NDgsIDB4ODgsIDB4OTMsCisgICAgMHg0NywgMHg4OCwgMHg5MiwgMHg0NywgMHg4NywgMHg5MSwgMHg0NiwgMHg4NiwgMHg5MCwgMHg0NSwgMHg4NSwgMHg5MCwgMHg0MywgMHg4NCwgMHg4ZSwgMHg0MiwgMHg4MywgMHg4ZCwgMHg0MSwgMHg4MiwgMHg4YywKKyAgICAweDNlLCAweDgwLCAweDhhLCAweDNkLCAweDdmLCAweDg5LCAweDNkLCAweDdlLCAweDg4LCAweDNiLCAweDdkLCAweDg3LCAweDNhLCAweDdiLCAweDg1LCAweDM4LCAweDc5LCAweDgzLCAweDM3LCAweDc5LCAweDgzLAorICAgIDB4MzUsIDB4NzYsIDB4ODEsIDB4MzQsIDB4NzYsIDB4ODAsIDB4MzIsIDB4NzQsIDB4N2UsIDB4MzAsIDB4NzIsIDB4N2MsIDB4MmYsIDB4NzEsIDB4N2MsIDB4MmQsIDB4NzAsIDB4NzksIDB4MmMsIDB4NmUsIDB4NzksCisgICAgMHgyYSwgMHg2YywgMHg3NywgMHgyOSwgMHg2YiwgMHg3NSwgMHgyOCwgMHg2YSwgMHg3NCwgMHgyNiwgMHg2OSwgMHg3MywgMHgyNiwgMHg2NywgMHg3MiwgMHgyNCwgMHg2NiwgMHg3MCwgMHgyMywgMHg2NSwgMHg3MCwKKyAgICAweDIxLCAweDYyLCAweDZlLCAweDIwLCAweDYyLCAweDZjLCAweDFmLCAweDYwLCAweDZiLCAweDFlLCAweDYwLCAweDZhLCAweDFkLCAweDVlLCAweDY4LCAweDFjLCAweDVjLCAweDY3LCAweDFhLCAweDVjLCAweDY1LAorICAgIDB4MTksIDB4NWEsIDB4NjUsIDB4MTgsIDB4NTksIDB4NjMsIDB4MTgsIDB4NTgsIDB4NjIsIDB4MTgsIDB4NTcsIDB4NjEsIDB4MTcsIDB4NTUsIDB4NjAsIDB4MTcsIDB4NTUsIDB4NWYsIDB4MTYsIDB4NTMsIDB4NWQsCisgICAgMHgxNiwgMHg1MywgMHg1ZCwgMHgxNCwgMHg1MiwgMHg1YywgMHgxNCwgMHg1MSwgMHg1YiwgMHgxMywgMHg0ZiwgMHg1OSwgMHgxMywgMHg0ZiwgMHg1OCwgMHgxMywgMHg0ZSwgMHg1OCwgMHgxMiwgMHg0YywgMHg1NiwKKyAgICAweDEyLCAweDRjLCAweDU1LCAweDExLCAweDRiLCAweDU0LCAweDExLCAweDRiLCAweDU0LCAweDEwLCAweDRhLCAweDUzLCAweDEwLCAweDQ5LCAweDUyLCAweDEwLCAweDQ4LCAweDUxLCAweDEwLCAweDQ3LCAweDUwLAorICAgIDB4MTAsIDB4NDcsIDB4NGYsIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGUsIDB4NDQsIDB4NGQsIDB4MGUsIDB4NDMsIDB4NGMsIDB4MGUsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDIsIDB4NGEsIDB4MGUsIDB4NDEsIDB4NDksCisgICAgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywKKyAgICAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLAorICAgIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsCisgICAgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwKKyAgICAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLAorICAgIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsCisgICAgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwKKyAgICAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLAorICAgIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDEsIDB4MjMsIDB4MjgsIDB4MDAsIDB4MjAsIDB4MjUsCisgICAgMHg4OSwgMHhhMCwgMHhhNCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg5OCwgMHhiYywgMHhjMiwgMHg0YiwgMHg4YSwgMHg5NCwgMHg0YSwgMHg4YSwgMHg5MywgMHg0OCwgMHg4OCwgMHg5MiwKKyAgICAweDQ3LCAweDg3LCAweDkxLCAweDQ3LCAweDg2LCAweDkwLCAweDQ1LCAweDg0LCAweDhmLCAweDQ0LCAweDg0LCAweDhkLCAweDQyLCAweDgyLCAweDhjLCAweDQxLCAweDgxLCAweDhiLCAweDNmLCAweDgwLCAweDhhLAorICAgIDB4M2QsIDB4N2YsIDB4ODgsIDB4M2QsIDB4N2QsIDB4ODcsIDB4M2IsIDB4N2IsIDB4ODUsIDB4MzksIDB4N2EsIDB4ODQsIDB4MzgsIDB4NzgsIDB4ODIsIDB4MzYsIDB4NzcsIDB4ODEsIDB4MzQsIDB4NzUsIDB4N2YsCisgICAgMHgzMiwgMHg3NCwgMHg3ZSwgMHgzMSwgMHg3MiwgMHg3ZCwgMHgzMCwgMHg3MiwgMHg3YiwgMHgyZSwgMHg2ZiwgMHg3YSwgMHgyYywgMHg2ZCwgMHg3OCwgMHgyYiwgMHg2ZCwgMHg3NiwgMHgyOSwgMHg2YSwgMHg3NCwKKyAgICAweDI4LCAweDZhLCAweDc0LCAweDI3LCAweDY4LCAweDczLCAweDI1LCAweDY3LCAweDcxLCAweDI0LCAweDY1LCAweDcwLCAweDIzLCAweDY0LCAweDZmLCAweDIxLCAweDYyLCAweDZkLCAweDIwLCAweDYxLCAweDZiLAorICAgIDB4MWYsIDB4NjAsIDB4NmIsIDB4MWUsIDB4NWYsIDB4NjksIDB4MWQsIDB4NWQsIDB4NjcsIDB4MWIsIDB4NWMsIDB4NjYsIDB4MWEsIDB4NWIsIDB4NjUsIDB4MTksIDB4NWEsIDB4NjQsIDB4MTgsIDB4NTgsIDB4NjIsCisgICAgMHgxOCwgMHg1NywgMHg2MiwgMHgxOCwgMHg1NiwgMHg2MCwgMHgxNywgMHg1NSwgMHg1ZiwgMHgxNywgMHg1NCwgMHg1ZSwgMHgxNiwgMHg1MywgMHg1ZCwgMHgxNCwgMHg1MiwgMHg1YywgMHgxNCwgMHg1MSwgMHg1YiwKKyAgICAweDE0LCAweDUwLCAweDVhLCAweDEzLCAweDRmLCAweDU4LCAweDEzLCAweDRlLCAweDU4LCAweDEzLCAweDRkLCAweDU3LCAweDEyLCAweDRjLCAweDU1LCAweDExLCAweDRiLCAweDU0LCAweDExLCAweDRiLCAweDU0LAorICAgIDB4MTAsIDB4NGEsIDB4NTMsIDB4MTAsIDB4NDksIDB4NTIsIDB4MTAsIDB4NDgsIDB4NTEsIDB4MTAsIDB4NDcsIDB4NTAsIDB4MTAsIDB4NDcsIDB4NGYsIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsCisgICAgMHgwZSwgMHg0MywgMHg0YywgMHgwZSwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MiwgMHg0YSwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwKKyAgICAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLAorICAgIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksCisgICAgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywKKyAgICAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLAorICAgIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsCisgICAgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwKKyAgICAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LAorICAgIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsCisgICAgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMCwgMHgxZSwgMHgyMywgMHgwZSwgMHgyZSwgMHgzMywgMHhjYSwgMHhkNiwgMHhkNywgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGY5LCAweGZiLCAweGZiLCAweDdhLCAweGE5LCAweGIwLCAweDRlLCAweDhjLCAweDk1LCAweDRjLCAweDhhLCAweDk0LCAweDRiLCAweDg5LCAweDkzLCAweDRhLCAweDg5LCAweDkyLCAweDQ4LCAweDg3LCAweDkxLAorICAgIDB4NDcsIDB4ODYsIDB4OTAsIDB4NDUsIDB4ODQsIDB4OGUsIDB4NDMsIDB4ODIsIDB4OGQsIDB4NDIsIDB4ODIsIDB4OGIsIDB4NDEsIDB4ODEsIDB4OGIsIDB4M2UsIDB4N2UsIDB4ODgsIDB4M2QsIDB4N2QsIDB4ODcsCisgICAgMHgzYywgMHg3YywgMHg4NiwgMHgzYSwgMHg3YSwgMHg4NCwgMHgzOSwgMHg3OSwgMHg4MywgMHgzNywgMHg3NywgMHg4MSwgMHgzNCwgMHg3NiwgMHg3ZiwgMHgzMiwgMHg3MywgMHg3ZSwgMHgzMiwgMHg3MywgMHg3YywKKyAgICAweDMwLCAweDcxLCAweDdiLCAweDJlLCAweDZmLCAweDc5LCAweDJkLCAweDZlLCAweDc4LCAweDJiLCAweDZjLCAweDc2LCAweDJhLCAweDZiLCAweDc1LCAweDI4LCAweDY5LCAweDc0LCAweDI2LCAweDY4LCAweDcyLAorICAgIDB4MjUsIDB4NjYsIDB4NzEsIDB4MjQsIDB4NjQsIDB4NzAsIDB4MjMsIDB4NjQsIDB4NmUsIDB4MjEsIDB4NjIsIDB4NmMsIDB4MjAsIDB4NjEsIDB4NmIsIDB4MWYsIDB4NWYsIDB4NmEsIDB4MWUsIDB4NWUsIDB4NjgsCisgICAgMHgxYywgMHg1ZCwgMHg2NywgMHgxYiwgMHg1YiwgMHg2NiwgMHgxYSwgMHg1YiwgMHg2NCwgMHgxOSwgMHg1OSwgMHg2MywgMHgxOSwgMHg1OCwgMHg2MywgMHgxOCwgMHg1NiwgMHg2MCwgMHgxOCwgMHg1NiwgMHg2MCwKKyAgICAweDE3LCAweDU0LCAweDVlLCAweDE2LCAweDUzLCAweDVkLCAweDE1LCAweDUyLCAweDVjLCAweDE1LCAweDUxLCAweDViLCAweDE0LCAweDUwLCAweDVhLCAweDE0LCAweDUwLCAweDU5LCAweDEzLCAweDRlLCAweDU4LAorICAgIDB4MTMsIDB4NGQsIDB4NTcsIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTEsIDB4NGIsIDB4NTQsIDB4MTEsIDB4NGIsIDB4NTQsIDB4MTEsIDB4NGEsIDB4NTMsIDB4MTAsIDB4NDksIDB4NTIsIDB4MTAsIDB4NDgsIDB4NTEsCisgICAgMHgxMCwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwgMHgwZiwgMHg0NSwgMHg0ZSwgMHgwZiwgMHg0NCwgMHg0ZCwgMHgwZSwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MiwgMHg0YSwKKyAgICAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LAorICAgIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsCisgICAgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwKKyAgICAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsCisgICAgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwKKyAgICAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLAorICAgIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsCisgICAgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwKKyAgICAweDAyLCAweDIzLCAweDI3LCAweDAwLCAweDFiLCAweDFmLCAweDMxLCAweDUxLCAweDU2LCAweGZlLCAweGZlLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGU1LCAweGVlLCAweGVmLCAweDY0LCAweDlhLCAweGEyLAorICAgIDB4NTAsIDB4OGMsIDB4OTYsIDB4NGYsIDB4OGMsIDB4OTYsIDB4NGUsIDB4OGIsIDB4OTQsIDB4NGMsIDB4ODksIDB4OTMsIDB4NGIsIDB4ODksIDB4OTIsIDB4NDksIDB4ODcsIDB4OTAsIDB4NDcsIDB4ODUsIDB4OGYsCisgICAgMHg0NSwgMHg4MywgMHg4ZCwgMHg0MywgMHg4MiwgMHg4YywgMHg0MSwgMHg4MCwgMHg4YSwgMHg0MCwgMHg3ZiwgMHg4OCwgMHgzZSwgMHg3ZSwgMHg4NywgMHgzZCwgMHg3YiwgMHg4NSwgMHgzYiwgMHg3YSwgMHg4NCwKKyAgICAweDM5LCAweDc4LCAweDgyLCAweDM2LCAweDc3LCAweDgwLCAweDM1LCAweDc1LCAweDgwLCAweDMzLCAweDc0LCAweDdlLCAweDMyLCAweDcyLCAweDdjLCAweDMxLCAweDcwLCAweDdiLCAweDJmLCAweDZmLCAweDc5LAorICAgIDB4MmQsIDB4NmQsIDB4NzcsIDB4MmIsIDB4NmMsIDB4NzYsIDB4MmEsIDB4NmEsIDB4NzUsIDB4MjcsIDB4NjksIDB4NzMsIDB4MjYsIDB4NjcsIDB4NzIsIDB4MjUsIDB4NjUsIDB4NzAsIDB4MjQsIDB4NjQsIDB4NmYsCisgICAgMHgyMywgMHg2MywgMHg2ZCwgMHgyMSwgMHg2MiwgMHg2YywgMHgyMCwgMHg2MCwgMHg2YSwgMHgxZiwgMHg1ZSwgMHg2OSwgMHgxZCwgMHg1ZSwgMHg2NywgMHgxYywgMHg1YywgMHg2NywgMHgxYiwgMHg1YiwgMHg2NSwKKyAgICAweDFhLCAweDVhLCAweDYzLCAweDE5LCAweDU4LCAweDYzLCAweDE4LCAweDU2LCAweDYxLCAweDE4LCAweDU2LCAweDYwLCAweDE4LCAweDU1LCAweDVmLCAweDE3LCAweDU0LCAweDVlLCAweDE2LCAweDUzLCAweDVkLAorICAgIDB4MTUsIDB4NTEsIDB4NWIsIDB4MTQsIDB4NTAsIDB4NWEsIDB4MTQsIDB4NTAsIDB4NTksIDB4MTMsIDB4NGUsIDB4NTgsIDB4MTMsIDB4NGQsIDB4NTcsIDB4MTMsIDB4NGQsIDB4NTYsIDB4MTEsIDB4NGIsIDB4NTQsCisgICAgMHgxMSwgMHg0YiwgMHg1NCwgMHgxMSwgMHg0YSwgMHg1MywgMHgxMSwgMHg0OSwgMHg1MiwgMHgxMCwgMHg0OCwgMHg1MSwgMHgxMCwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwKKyAgICAweDBmLCAweDQ1LCAweDRlLCAweDBmLCAweDQ0LCAweDRkLCAweDBlLCAweDQzLCAweDRiLCAweDBlLCAweDQyLCAweDRhLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LAorICAgIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsCisgICAgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwKKyAgICAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLAorICAgIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LAorICAgIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsCisgICAgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwKKyAgICAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLAorICAgIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsCisgICAgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwKKyAgICAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIwLCAweDI1LCAweDAwLCAweDFiLCAweDFmLAorICAgIDB4NzcsIDB4OTAsIDB4OTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YzUsIDB4ZDksIDB4ZGMsIDB4NTMsIDB4OGYsIDB4OTgsIDB4NTIsIDB4OGUsIDB4OTgsIDB4NTIsIDB4OGUsIDB4OTYsCisgICAgMHg1MCwgMHg4YywgMHg5NSwgMHg0ZSwgMHg4YSwgMHg5NCwgMHg0YiwgMHg4OCwgMHg5MiwgMHg0YSwgMHg4NywgMHg5MSwgMHg0OSwgMHg4NiwgMHg4ZiwgMHg0NywgMHg4NSwgMHg4ZSwgMHg0NSwgMHg4MywgMHg4YywKKyAgICAweDQzLCAweDgxLCAweDhhLCAweDQxLCAweDdmLCAweDg5LCAweDNmLCAweDdkLCAweDg3LCAweDNkLCAweDdjLCAweDg2LCAweDNjLCAweDdhLCAweDg0LCAweDM5LCAweDc5LCAweDgyLCAweDM3LCAweDc3LCAweDgxLAorICAgIDB4MzUsIDB4NzUsIDB4N2YsIDB4MzMsIDB4NzMsIDB4N2UsIDB4MzIsIDB4NzIsIDB4N2MsIDB4MzEsIDB4NzAsIDB4N2EsIDB4MmYsIDB4NmUsIDB4NzgsIDB4MmQsIDB4NmQsIDB4NzcsIDB4MmMsIDB4NmIsIDB4NzYsCisgICAgMHgyOSwgMHg2YSwgMHg3NCwgMHgyNywgMHg2OCwgMHg3MywgMHgyNiwgMHg2NiwgMHg3MSwgMHgyNSwgMHg2NSwgMHg2ZiwgMHgyNCwgMHg2NCwgMHg2ZSwgMHgyMywgMHg2MywgMHg2ZCwgMHgyMSwgMHg2MSwgMHg2YiwKKyAgICAweDIwLCAweDVmLCAweDY5LCAweDFlLCAweDVlLCAweDY4LCAweDFkLCAweDVkLCAweDY3LCAweDFjLCAweDVjLCAweDY2LCAweDFhLCAweDVhLCAweDYzLCAweDFhLCAweDU5LCAweDYzLCAweDE5LCAweDU3LCAweDYyLAorICAgIDB4MTgsIDB4NTYsIDB4NjAsIDB4MTgsIDB4NTUsIDB4NWYsIDB4MTcsIDB4NTQsIDB4NWUsIDB4MTYsIDB4NTMsIDB4NWQsIDB4MTUsIDB4NTEsIDB4NWIsIDB4MTUsIDB4NTAsIDB4NWEsIDB4MTQsIDB4NTAsIDB4NTksCisgICAgMHgxNCwgMHg0ZiwgMHg1OSwgMHgxMywgMHg0ZCwgMHg1NywgMHgxMywgMHg0ZCwgMHg1NiwgMHgxMiwgMHg0YywgMHg1NSwgMHgxMSwgMHg0YiwgMHg1NCwgMHgxMSwgMHg0YSwgMHg1MywgMHgxMSwgMHg0OSwgMHg1MiwKKyAgICAweDEwLCAweDQ4LCAweDUxLCAweDEwLCAweDQ3LCAweDUwLCAweDEwLCAweDQ3LCAweDRmLCAweDBmLCAweDQ2LCAweDRmLCAweDBmLCAweDQ1LCAweDRlLCAweDBmLCAweDQ0LCAweDRkLCAweDBmLCAweDQ0LCAweDRjLAorICAgIDB4MGUsIDB4NDIsIDB4NGEsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsCisgICAgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwKKyAgICAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LAorICAgIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwKKyAgICAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywKKyAgICAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LAorICAgIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsCisgICAgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwKKyAgICAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLAorICAgIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDAsIDB4MWMsIDB4MjAsIDB4MGQsIDB4MmIsIDB4MzAsIDB4Y2QsIDB4ZDcsIDB4ZDgsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHg5YiwgMHhiZCwgMHhjMywgMHg1NiwgMHg5MSwgMHg5YSwgMHg1NSwgMHg5MCwgMHg5OSwgMHg1MywgMHg4ZSwgMHg5OCwgMHg1MiwgMHg4ZCwgMHg5NiwgMHg0ZiwgMHg4YiwgMHg5NCwKKyAgICAweDRkLCAweDg5LCAweDkzLCAweDRiLCAweDg4LCAweDkxLCAweDQ5LCAweDg2LCAweDkwLCAweDQ4LCAweDg0LCAweDhlLCAweDQ2LCAweDgyLCAweDhjLCAweDQ0LCAweDgxLCAweDhiLCAweDQyLCAweDdmLCAweDg5LAorICAgIDB4NDAsIDB4N2UsIDB4ODgsIDB4M2UsIDB4N2MsIDB4ODYsIDB4M2MsIDB4N2IsIDB4ODQsIDB4M2EsIDB4NzksIDB4ODMsIDB4MzgsIDB4NzcsIDB4ODEsIDB4MzYsIDB4NzUsIDB4N2YsIDB4MzQsIDB4NzMsIDB4N2QsCisgICAgMHgzMiwgMHg3MiwgMHg3YiwgMHgzMSwgMHg3MCwgMHg3OSwgMHgyZiwgMHg2ZSwgMHg3OCwgMHgyZCwgMHg2YywgMHg3NywgMHgyYiwgMHg2YiwgMHg3NSwgMHgyOSwgMHg2OSwgMHg3NCwgMHgyNywgMHg2NywgMHg3MiwKKyAgICAweDI2LCAweDY2LCAweDcwLCAweDI1LCAweDY0LCAweDZlLCAweDI0LCAweDY0LCAweDZlLCAweDIyLCAweDYxLCAweDZjLCAweDIxLCAweDYwLCAweDZhLCAweDFmLCAweDVmLCAweDY4LCAweDFlLCAweDVkLCAweDY4LAorICAgIDB4MWMsIDB4NWMsIDB4NjYsIDB4MWIsIDB4NWEsIDB4NjQsIDB4MWEsIDB4NTksIDB4NjMsIDB4MTksIDB4NTcsIDB4NjIsIDB4MTgsIDB4NTYsIDB4NjAsIDB4MTgsIDB4NTUsIDB4NWYsIDB4MTgsIDB4NTUsIDB4NWYsCisgICAgMHgxNiwgMHg1MywgMHg1ZCwgMHgxNSwgMHg1MSwgMHg1YiwgMHgxNSwgMHg1MCwgMHg1YSwgMHgxNSwgMHg1MCwgMHg1OSwgMHgxNCwgMHg0ZiwgMHg1OSwgMHgxNCwgMHg0ZSwgMHg1OCwgMHgxMywgMHg0ZCwgMHg1NiwKKyAgICAweDEyLCAweDRjLCAweDU1LCAweDExLCAweDRiLCAweDU0LCAweDExLCAweDRhLCAweDUzLCAweDExLCAweDQ5LCAweDUyLCAweDExLCAweDQ4LCAweDUxLCAweDEwLCAweDQ3LCAweDUwLCAweDEwLCAweDQ3LCAweDRmLAorICAgIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGYsIDB4NDQsIDB4NGQsIDB4MGYsIDB4NDQsIDB4NGMsIDB4MGYsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsCisgICAgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwKKyAgICAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLAorICAgIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsCisgICAgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsCisgICAgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwKKyAgICAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LAorICAgIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsCisgICAgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwKKyAgICAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLAorICAgIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsCisgICAgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMCwgMHgxOCwgMHgxYywgMHgzYiwgMHg1OCwgMHg1ZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmMiwgMHhmNiwgMHhmNywgMHg3NCwgMHhhNCwgMHhhYywKKyAgICAweDU4LCAweDkyLCAweDlhLCAweDU3LCAweDkwLCAweDlhLCAweDU1LCAweDhmLCAweDk4LCAweDUzLCAweDhkLCAweDk2LCAweDUwLCAweDhiLCAweDk0LCAweDRlLCAweDhhLCAweDkzLCAweDRkLCAweDg5LCAweDkyLAorICAgIDB4NGEsIDB4ODYsIDB4OTAsIDB4NDksIDB4ODQsIDB4OGUsIDB4NDcsIDB4ODMsIDB4OGMsIDB4NDUsIDB4ODEsIDB4OGIsIDB4NDMsIDB4ODAsIDB4ODksIDB4NDEsIDB4N2UsIDB4ODcsIDB4M2UsIDB4N2MsIDB4ODUsCisgICAgMHgzYywgMHg3YSwgMHg4NCwgMHgzYSwgMHg3OSwgMHg4MiwgMHgzOCwgMHg3NiwgMHg4MSwgMHgzNiwgMHg3NCwgMHg3ZiwgMHgzNCwgMHg3MywgMHg3YywgMHgzMiwgMHg3MSwgMHg3YSwgMHgzMSwgMHg3MCwgMHg3OSwKKyAgICAweDJmLCAweDZkLCAweDc4LCAweDJjLCAweDZjLCAweDc2LCAweDJiLCAweDZiLCAweDc1LCAweDI5LCAweDY4LCAweDczLCAweDI3LCAweDY3LCAweDcxLCAweDI2LCAweDY1LCAweDZmLCAweDI1LCAweDY0LCAweDZlLAorICAgIDB4MjQsIDB4NjMsIDB4NmQsIDB4MjIsIDB4NjAsIDB4NmIsIDB4MjAsIDB4NjAsIDB4NjksIDB4MWUsIDB4NWQsIDB4NjgsIDB4MWQsIDB4NWQsIDB4NjYsIDB4MWMsIDB4NWIsIDB4NjUsIDB4MWIsIDB4NTksIDB4NjQsCisgICAgMHgxYSwgMHg1OCwgMHg2MiwgMHgxOSwgMHg1NywgMHg2MSwgMHgxOSwgMHg1NiwgMHg2MCwgMHgxOCwgMHg1NSwgMHg1ZiwgMHgxNywgMHg1NCwgMHg1ZSwgMHgxNiwgMHg1MiwgMHg1YywgMHgxNiwgMHg1MSwgMHg1YiwKKyAgICAweDE1LCAweDUwLCAweDU5LCAweDE0LCAweDRmLCAweDU5LCAweDE0LCAweDRlLCAweDU4LCAweDEzLCAweDRkLCAweDU2LCAweDEyLCAweDRjLCAweDU1LCAweDEyLCAweDRjLCAweDU1LCAweDExLCAweDRhLCAweDUzLAorICAgIDB4MTEsIDB4NDksIDB4NTIsIDB4MTEsIDB4NDgsIDB4NTEsIDB4MTAsIDB4NDcsIDB4NTAsIDB4MTAsIDB4NDcsIDB4NGYsIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGYsIDB4NDQsIDB4NGQsCisgICAgMHgwZiwgMHg0NCwgMHg0YywgMHgwZiwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwKKyAgICAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLAorICAgIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsCisgICAgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwKKyAgICAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLAorICAgIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsCisgICAgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwKKyAgICAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LAorICAgIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsCisgICAgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMSwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYywgMHgyMSwKKyAgICAweDk4LCAweGFiLCAweGFlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGNmLCAweGRmLCAweGUyLCAweDVkLCAweDk1LCAweDlkLCAweDViLCAweDkzLCAweDljLCAweDU5LCAweDkyLCAweDlhLAorICAgIDB4NTYsIDB4OTAsIDB4OTgsIDB4NTUsIDB4OGUsIDB4OTcsIDB4NTIsIDB4OGMsIDB4OTUsIDB4NTAsIDB4OGIsIDB4OTQsIDB4NGUsIDB4ODksIDB4OTIsIDB4NGMsIDB4ODcsIDB4OTAsIDB4NDksIDB4ODUsIDB4OGUsCisgICAgMHg0OCwgMHg4MywgMHg4YywgMHg0NiwgMHg4MiwgMHg4YiwgMHg0MywgMHg3ZiwgMHg4OSwgMHg0MCwgMHg3ZSwgMHg4NywgMHgzZSwgMHg3YywgMHg4NSwgMHgzZCwgMHg3YSwgMHg4MywgMHgzYSwgMHg3OCwgMHg4MiwKKyAgICAweDM4LCAweDc2LCAweDgwLCAweDM2LCAweDc0LCAweDdlLCAweDM0LCAweDcyLCAweDdjLCAweDMyLCAweDcxLCAweDdhLCAweDMxLCAweDZmLCAweDc5LCAweDJlLCAweDZkLCAweDc3LCAweDJjLCAweDZiLCAweDc2LAorICAgIDB4MmEsIDB4NjksIDB4NzQsIDB4MjksIDB4NjgsIDB4NzIsIDB4MjcsIDB4NjYsIDB4NzAsIDB4MjYsIDB4NjUsIDB4NmYsIDB4MjUsIDB4NjMsIDB4NmQsIDB4MjMsIDB4NjEsIDB4NmIsIDB4MjEsIDB4NjAsIDB4NmEsCisgICAgMHgxZiwgMHg1ZSwgMHg2OCwgMHgxZSwgMHg1ZCwgMHg2NywgMHgxZCwgMHg1YywgMHg2NSwgMHgxYywgMHg1YSwgMHg2NSwgMHgxYiwgMHg1OSwgMHg2MywgMHgxYSwgMHg1OCwgMHg2MSwgMHgxOSwgMHg1NiwgMHg2MCwKKyAgICAweDE4LCAweDU1LCAweDVmLCAweDE3LCAweDU0LCAweDVlLCAweDE3LCAweDUzLCAweDVkLCAweDE2LCAweDUxLCAweDViLCAweDE1LCAweDUwLCAweDU5LCAweDE1LCAweDUwLCAweDU5LCAweDE0LCAweDRlLCAweDU4LAorICAgIDB4MTQsIDB4NGUsIDB4NTcsIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTEsIDB4NGEsIDB4NTMsIDB4MTEsIDB4NDksIDB4NTIsIDB4MTEsIDB4NDgsIDB4NTEsIDB4MTEsIDB4NDcsIDB4NTAsCisgICAgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwgMHgwZiwgMHg0NSwgMHg0ZSwgMHgwZiwgMHg0NCwgMHg0ZCwgMHgwZiwgMHg0NCwgMHg0YywgMHgwZiwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwKKyAgICAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLAorICAgIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsCisgICAgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwKKyAgICAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLAorICAgIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsCisgICAgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywKKyAgICAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLAorICAgIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsCisgICAgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywKKyAgICAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAwLCAweDE3LCAweDFiLCAweDFmLCAweDNkLCAweDQxLCAweGZhLCAweGZjLCAweGZjLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4OTksIDB4YmQsIDB4YzIsIDB4NWQsIDB4OTUsIDB4OWUsIDB4NWMsIDB4OTQsIDB4OWMsIDB4NTksIDB4OTIsIDB4OWEsIDB4NTcsIDB4OTAsIDB4OTksIDB4NTUsIDB4OGUsIDB4OTcsCisgICAgMHg1MywgMHg4ZCwgMHg5NSwgMHg1MSwgMHg4YiwgMHg5NCwgMHg0ZiwgMHg4OSwgMHg5MiwgMHg0YywgMHg4NywgMHg5MCwgMHg0YSwgMHg4NSwgMHg4ZSwgMHg0OSwgMHg4NCwgMHg4ZCwgMHg0NiwgMHg4MSwgMHg4YSwKKyAgICAweDQzLCAweDgwLCAweDg4LCAweDQxLCAweDdlLCAweDg3LCAweDNlLCAweDdjLCAweDg1LCAweDNkLCAweDdhLCAweDgzLCAweDNiLCAweDc3LCAweDgxLCAweDM5LCAweDc2LCAweDdmLCAweDM2LCAweDczLCAweDdkLAorICAgIDB4MzQsIDB4NzIsIDB4N2MsIDB4MzIsIDB4NzAsIDB4N2EsIDB4MzAsIDB4NmYsIDB4NzgsIDB4MmUsIDB4NmQsIDB4NzcsIDB4MmMsIDB4NmEsIDB4NzUsIDB4MmEsIDB4NjksIDB4NzMsIDB4MjgsIDB4NjcsIDB4NzEsCisgICAgMHgyNiwgMHg2NSwgMHg3MCwgMHgyNiwgMHg2NCwgMHg2ZSwgMHgyNCwgMHg2MiwgMHg2YywgMHgyMiwgMHg2MSwgMHg2YSwgMHgyMCwgMHg1ZiwgMHg2OSwgMHgxZiwgMHg1ZSwgMHg2NywgMHgxZSwgMHg1YywgMHg2NiwKKyAgICAweDFkLCAweDViLCAweDY1LCAweDFjLCAweDU5LCAweDY0LCAweDFhLCAweDU4LCAweDYxLCAweDE5LCAweDU2LCAweDYwLCAweDE4LCAweDU1LCAweDVmLCAweDE3LCAweDU1LCAweDVlLCAweDE3LCAweDUzLCAweDVkLAorICAgIDB4MTYsIDB4NTEsIDB4NWIsIDB4MTYsIDB4NTEsIDB4NWEsIDB4MTUsIDB4NTAsIDB4NTksIDB4MTUsIDB4NGYsIDB4NTgsIDB4MTQsIDB4NGUsIDB4NTcsIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTIsIDB4NGMsIDB4NTUsCisgICAgMHgxMiwgMHg0YiwgMHg1NCwgMHgxMSwgMHg0OSwgMHg1MiwgMHgxMSwgMHg0OCwgMHg1MSwgMHgxMSwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwgMHgwZiwgMHg0NSwgMHg0ZSwKKyAgICAweDBmLCAweDQ0LCAweDRkLCAweDBmLCAweDQ0LCAweDRjLCAweDBmLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LAorICAgIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsCisgICAgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwKKyAgICAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLAorICAgIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsCisgICAgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywKKyAgICAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLAorICAgIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsCisgICAgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwKKyAgICAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLAorICAgIDB4MDIsIDB4MWMsIDB4MjEsIDB4MDAsIDB4MTYsIDB4MWEsIDB4NzgsIDB4OGYsIDB4OTIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4ZjEsIDB4ZjIsIDB4NmYsIDB4YTAsIDB4YTgsCisgICAgMHg1ZiwgMHg5NiwgMHg5ZSwgMHg1ZCwgMHg5NCwgMHg5YywgMHg1YSwgMHg5MSwgMHg5YiwgMHg1OCwgMHg5MCwgMHg5OSwgMHg1NiwgMHg4ZiwgMHg5OCwgMHg1NCwgMHg4YywgMHg5NSwgMHg1MiwgMHg4YiwgMHg5MywKKyAgICAweDUwLCAweDg5LCAweDkyLCAweDRkLCAweDg3LCAweDkwLCAweDRiLCAweDg1LCAweDhmLCAweDQ5LCAweDgzLCAweDhjLCAweDQ2LCAweDgyLCAweDhhLCAweDQzLCAweDdmLCAweDg4LCAweDQxLCAweDdlLCAweDg2LAorICAgIDB4M2YsIDB4N2IsIDB4ODUsIDB4M2QsIDB4NzksIDB4ODMsIDB4M2IsIDB4NzcsIDB4ODEsIDB4MzksIDB4NzUsIDB4N2YsIDB4MzYsIDB4NzMsIDB4N2QsIDB4MzQsIDB4NzEsIDB4N2MsIDB4MzIsIDB4NzAsIDB4N2EsCisgICAgMHgzMCwgMHg2ZSwgMHg3OCwgMHgyZSwgMHg2YywgMHg3NiwgMHgyYywgMHg2YSwgMHg3NCwgMHgyYSwgMHg2OCwgMHg3MiwgMHgyOCwgMHg2NywgMHg3MSwgMHgyNiwgMHg2NSwgMHg2ZiwgMHgyNiwgMHg2MywgMHg2ZCwKKyAgICAweDIzLCAweDYyLCAweDZiLCAweDIyLCAweDYwLCAweDZhLCAweDIwLCAweDVmLCAweDY4LCAweDFmLCAweDVkLCAweDY3LCAweDI1LCAweDYwLCAweDZiLCAweDMwLCAweDY4LCAweDcyLCAweDNiLCAweDcwLCAweDc4LAorICAgIDB4NGIsIDB4N2IsIDB4ODIsIDB4NTYsIDB4ODMsIDB4OGEsIDB4NTgsIDB4ODQsIDB4OGMsIDB4NTEsIDB4N2YsIDB4ODYsIDB4NGMsIDB4NzksIDB4ODEsIDB4M2YsIDB4NzAsIDB4NzcsIDB4MzEsIDB4NjUsIDB4NmQsCisgICAgMHgyNiwgMHg1YiwgMHg2NCwgMHgxOCwgMHg1MSwgMHg1YSwgMHgxMywgMHg0ZCwgMHg1NiwgMHgxMiwgMHg0YywgMHg1NSwgMHgxMiwgMHg0YiwgMHg1NCwgMHgxMSwgMHg0OSwgMHg1MiwgMHgxMSwgMHg0OCwgMHg1MSwKKyAgICAweDExLCAweDQ3LCAweDUwLCAweDExLCAweDQ3LCAweDRmLCAweDBmLCAweDQ2LCAweDRmLCAweDBmLCAweDQ1LCAweDRlLCAweDBmLCAweDQ0LCAweDRkLCAweDBmLCAweDQ0LCAweDRjLCAweDBmLCAweDQzLCAweDRiLAorICAgIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsCisgICAgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwKKyAgICAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LAorICAgIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwKKyAgICAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwKKyAgICAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LAorICAgIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsCisgICAgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywKKyAgICAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LAorICAgIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDAsIDB4MTcsIDB4MWIsIDB4MTMsIDB4MmYsIDB4MzQsCisgICAgMHhlYSwgMHhlZiwgMHhlZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhiOCwgMHhkMSwgMHhkNCwgMHg2MywgMHg5OCwgMHhhMCwgMHg2MCwgMHg5NiwgMHg5ZiwgMHg1ZSwgMHg5NCwgMHg5ZCwKKyAgICAweDVjLCAweDkzLCAweDliLCAweDU5LCAweDkxLCAweDk5LCAweDU3LCAweDhmLCAweDk4LCAweDU1LCAweDhkLCAweDk2LCAweDUzLCAweDhiLCAweDk0LCAweDUwLCAweDg5LCAweDkxLCAweDRlLCAweDg3LCAweDkwLAorICAgIDB4NGIsIDB4ODUsIDB4OGUsIDB4NDksIDB4ODMsIDB4OGMsIDB4NDYsIDB4ODEsIDB4OGEsIDB4NDQsIDB4N2YsIDB4ODgsIDB4NDEsIDB4N2QsIDB4ODYsIDB4M2YsIDB4N2IsIDB4ODQsIDB4M2QsIDB4NzksIDB4ODIsCisgICAgMHgzYiwgMHg3NywgMHg4MCwgMHgzOCwgMHg3NSwgMHg3ZSwgMHgzNiwgMHg3MywgMHg3ZCwgMHgzMywgMHg3MSwgMHg3YiwgMHgzMiwgMHg2ZiwgMHg3YSwgMHgyZiwgMHg2YywgMHg3NywgMHgyZCwgMHg2YiwgMHg3NSwKKyAgICAweDJiLCAweDY5LCAweDczLCAweDI5LCAweDY3LCAweDcxLCAweDI3LCAweDY1LCAweDZmLCAweDI2LCAweDY0LCAweDZlLCAweDM1LCAweDZlLCAweDc4LCAweDYwLCAweDhkLCAweDk0LCAweDkxLCAweGIwLCAweGI1LAorICAgIDB4YjgsIDB4Y2MsIDB4Y2YsIDB4ZDQsIDB4ZTAsIDB4ZTIsIDB4ZWMsIDB4ZjEsIDB4ZjIsIDB4ZmQsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmOSwgMHhmYSwgMHhmYSwgMHhlNCwgMHhlYiwgMHhlYywgMHhjYiwgMHhkOCwgMHhkOSwgMHhhYiwgMHhiZiwgMHhjMywKKyAgICAweDdmLCAweDlmLCAweGE0LCAweDQ5LCAweDc1LCAweDdjLCAweDIwLCAweDU1LCAweDVkLCAweDExLCAweDQ4LCAweDUxLCAweDExLCAweDQ3LCAweDUwLCAweDExLCAweDQ3LCAweDRmLCAweDBmLCAweDQ2LCAweDRmLAorICAgIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGYsIDB4NDQsIDB4NGQsIDB4MGYsIDB4NDQsIDB4NGMsIDB4MGYsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsCisgICAgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwKKyAgICAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLAorICAgIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsCisgICAgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsCisgICAgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsCisgICAgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwKKyAgICAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LAorICAgIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsCisgICAgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwKKyAgICAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLAorICAgIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsCisgICAgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMCwgMHgxNCwgMHgxOCwgMHg2OSwgMHg4MSwgMHg4NSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGY3LCAweGZhLCAweGZhLCAweDgyLCAweGFkLCAweGIzLCAweDY0LCAweDk5LCAweGExLCAweDYxLCAweDk2LCAweDlmLCAweDYwLCAweDk1LCAweDlkLCAweDVkLCAweDkzLCAweDljLCAweDViLCAweDkxLCAweDlhLAorICAgIDB4NTgsIDB4OGYsIDB4OTcsIDB4NTUsIDB4OGQsIDB4OTYsIDB4NTQsIDB4OGIsIDB4OTQsIDB4NTEsIDB4ODksIDB4OTIsIDB4NGYsIDB4ODcsIDB4OTAsIDB4NGIsIDB4ODUsIDB4OGUsIDB4NDksIDB4ODMsIDB4OGMsCisgICAgMHg0NywgMHg4MSwgMHg4YSwgMHg0NCwgMHg3ZiwgMHg4OCwgMHg0MSwgMHg3YywgMHg4NiwgMHgzZiwgMHg3YiwgMHg4NCwgMHgzZCwgMHg3OCwgMHg4MSwgMHgzYiwgMHg3NywgMHg4MCwgMHgzOCwgMHg3NCwgMHg3ZSwKKyAgICAweDM1LCAweDczLCAweDdjLCAweDMzLCAweDcwLCAweDdhLCAweDMxLCAweDZlLCAweDc4LCAweDJmLCAweDZjLCAweDc2LCAweDJkLCAweDZhLCAweDc0LCAweDNlLCAweDc3LCAweDgwLCAweDdiLCAweGExLCAweGE3LAorICAgIDB4YmIsIDB4Y2UsIDB4ZDIsIDB4ZWUsIDB4ZjMsIDB4ZjMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGUyLCAweGU5LCAweGVhLAorICAgIDB4YTksIDB4YmQsIDB4YzAsIDB4NWUsIDB4ODMsIDB4ODksIDB4MWUsIDB4NTEsIDB4NTksIDB4MTAsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGYsIDB4NDQsIDB4NGQsIDB4MGYsIDB4NDQsIDB4NGMsCisgICAgMHgwZiwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwKKyAgICAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLAorICAgIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsCisgICAgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLAorICAgIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLAorICAgIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsCisgICAgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwKKyAgICAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LAorICAgIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsCisgICAgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwKKyAgICAweDAwLCAweDE2LCAweDE5LCAweDExLCAweDJjLCAweDMwLCAweGU5LCAweGVkLCAweGVlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGM5LCAweGRjLCAweGRmLCAweDY4LCAweDliLCAweGEzLAorICAgIDB4NjUsIDB4OTksIDB4YTEsIDB4NjMsIDB4OTgsIDB4YTAsIDB4NjAsIDB4OTYsIDB4OWUsIDB4NWUsIDB4OTMsIDB4OWIsIDB4NWIsIDB4OTEsIDB4OTksIDB4NTksIDB4OGYsIDB4OTgsIDB4NTYsIDB4OGQsIDB4OTYsCisgICAgMHg1NSwgMHg4YywgMHg5NCwgMHg1MiwgMHg4OSwgMHg5MiwgMHg0ZSwgMHg4NywgMHg4ZiwgMHg0YiwgMHg4NSwgMHg4ZSwgMHg0OSwgMHg4MywgMHg4YiwgMHg0NywgMHg4MSwgMHg4YSwgMHg0NCwgMHg3ZSwgMHg4NywKKyAgICAweDQxLCAweDdjLCAweDg1LCAweDNlLCAweDc5LCAweDgyLCAweDNkLCAweDc4LCAweDgxLCAweDNhLCAweDc1LCAweDdmLCAweDM3LCAweDc0LCAweDdkLCAweDM0LCAweDcxLCAweDdiLCAweDMzLCAweDZmLCAweDc5LAorICAgIDB4NWQsIDB4OGQsIDB4OTQsIDB4YWQsIDB4YzUsIDB4YzksIDB4ZWUsIDB4ZjMsIDB4ZjQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTMsIDB4ZTksIDB4ZWEsCisgICAgMHg5MiwgMHhhYiwgMHhhZiwgMHgzNCwgMHg2MSwgMHg2OSwgMHgwZiwgMHg0NCwgMHg0ZCwgMHgwZiwgMHg0NCwgMHg0YywgMHgwZiwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwKKyAgICAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLAorICAgIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsCisgICAgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwKKyAgICAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwKKyAgICAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksCisgICAgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLAorICAgIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksCisgICAgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwKKyAgICAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLAorICAgIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsCisgICAgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwKKyAgICAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDE5LCAweDFkLCAweDAwLCAweDEzLCAweDE3LCAweDZlLCAweDg1LCAweDg5LAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmMsIDB4ZmQsIDB4ZmQsIDB4OGMsIDB4YjMsIDB4YjksIDB4NjksIDB4OWIsIDB4YTQsIDB4NjYsIDB4OTksIDB4YTEsIDB4NjQsIDB4OTgsIDB4YTAsCisgICAgMHg2MSwgMHg5NiwgMHg5ZSwgMHg1ZiwgMHg5MywgMHg5YiwgMHg1YywgMHg5MSwgMHg5YSwgMHg1OSwgMHg4ZiwgMHg5NywgMHg1NywgMHg4ZSwgMHg5NiwgMHg1NSwgMHg4YiwgMHg5NCwgMHg1MSwgMHg4OSwgMHg5MSwKKyAgICAweDRlLCAweDg2LCAweDhmLCAweDRiLCAweDg1LCAweDhkLCAweDQ5LCAweDgyLCAweDhiLCAweDQ2LCAweDdmLCAweDg5LCAweDQ0LCAweDdlLCAweDg3LCAweDQxLCAweDdiLCAweDg0LCAweDNlLCAweDc5LCAweDgyLAorICAgIDB4M2MsIDB4NzYsIDB4ODAsIDB4MzksIDB4NzUsIDB4N2UsIDB4NjMsIDB4OTIsIDB4OWEsIDB4YzAsIDB4ZDMsIDB4ZDYsIDB4ZmMsIDB4ZmQsIDB4ZmQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmNywgMHhmOCwgMHhmOSwgMHhhNSwgMHhiOSwgMHhiYywKKyAgICAweDM3LCAweDYzLCAweDY5LCAweDBmLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LAorICAgIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsCisgICAgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwKKyAgICAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLAorICAgIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLAorICAgIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsCisgICAgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwKKyAgICAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLAorICAgIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsCisgICAgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywKKyAgICAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLAorICAgIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDAsIDB4MTQsIDB4MTcsIDB4MTYsIDB4MzEsIDB4MzQsIDB4ZjIsIDB4ZjYsIDB4ZjYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhjZSwgMHhkZiwgMHhlMSwgMHg2YywgMHg5ZSwgMHhhNiwgMHg2YSwgMHg5YywgMHhhNCwgMHg2NywgMHg5YSwgMHhhMiwgMHg2NCwgMHg5OCwgMHg5ZiwgMHg2MSwgMHg5NSwgMHg5ZCwgMHg2MCwgMHg5NCwgMHg5YywKKyAgICAweDVkLCAweDkxLCAweDlhLCAweDVhLCAweDhmLCAweDk4LCAweDU3LCAweDhkLCAweDk1LCAweDU0LCAweDhiLCAweDkzLCAweDUxLCAweDg4LCAweDkxLCAweDRlLCAweDg2LCAweDhmLCAweDRiLCAweDg0LCAweDhkLAorICAgIDB4NDksIDB4ODEsIDB4OGEsIDB4NDYsIDB4N2YsIDB4ODgsIDB4NDMsIDB4N2MsIDB4ODUsIDB4NDAsIDB4N2IsIDB4ODMsIDB4NTUsIDB4ODgsIDB4OTEsIDB4YjcsIDB4Y2MsIDB4ZDAsIDB4ZmMsIDB4ZmQsIDB4ZmQsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGY2LCAweGY4LCAweGY4LCAweDk1LCAweGFjLCAweGFmLCAweDIyLCAweDUxLCAweDU4LAorICAgIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsCisgICAgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywKKyAgICAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LAorICAgIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLAorICAgIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwKKyAgICAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsCisgICAgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwKKyAgICAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLAorICAgIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsCisgICAgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwKKyAgICAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LAorICAgIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWIsCisgICAgMHgwMCwgMHgxNCwgMHgxNywgMHg4NCwgMHg5OCwgMHg5YywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmYiwgMHhmYywgMHhmZCwgMHg4YywgMHhiMywgMHhiOSwgMHg2ZCwgMHg5ZSwgMHhhNiwKKyAgICAweDZiLCAweDlkLCAweGE0LCAweDY4LCAweDlhLCAweGEyLCAweDY1LCAweDk4LCAweDlmLCAweDYyLCAweDk2LCAweDllLCAweDYwLCAweDkzLCAweDliLCAweDVkLCAweDkxLCAweDlhLCAweDVhLCAweDhmLCAweDk3LAorICAgIDB4NTcsIDB4OGQsIDB4OTUsIDB4NTQsIDB4OGEsIDB4OTMsIDB4NTEsIDB4ODgsIDB4OTAsIDB4NGUsIDB4ODYsIDB4OGYsIDB4NGIsIDB4ODMsIDB4OGMsIDB4NDksIDB4ODEsIDB4OGEsIDB4NDYsIDB4N2UsIDB4ODcsCisgICAgMHg4ZCwgMHhhZiwgMHhiNSwgMHhlZiwgMHhmNCwgMHhmNSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTIsIDB4ZTgsIDB4ZTksIDB4NWQsIDB4N2YsIDB4ODQsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsCisgICAgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwKKyAgICAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LAorICAgIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsCisgICAgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwKKyAgICAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LAorICAgIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsCisgICAgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywKKyAgICAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLAorICAgIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsCisgICAgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMCwgMHgxMSwgMHgxNCwgMHgyNiwgMHg0MSwgMHg0NiwgMHhmZCwgMHhmZSwgMHhmZSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGM3LCAweGRhLCAweGRkLCAweDcxLCAweGExLCAweGE4LCAweDZlLCAweDlmLCAweGE2LCAweDZjLCAweDljLCAweGE0LCAweDY5LCAweDlhLCAweGEyLAorICAgIDB4NjYsIDB4OTgsIDB4YTAsIDB4NjIsIDB4OTUsIDB4OWQsIDB4NjAsIDB4OTQsIDB4OWMsIDB4NWQsIDB4OTEsIDB4OTksIDB4NTksIDB4OGYsIDB4OTYsIDB4NTcsIDB4OGMsIDB4OTUsIDB4NTQsIDB4OGEsIDB4OTIsCisgICAgMHg1MCwgMHg4NywgMHg5MCwgMHg0ZCwgMHg4NCwgMHg4ZCwgMHg1YiwgMHg4ZCwgMHg5NSwgMHhjMywgMHhkNSwgMHhkOCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg5ZiwgMHhiMywgMHhiNiwgMHgxYSwgMHg0YSwgMHg1MCwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwKKyAgICAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLAorICAgIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsCisgICAgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLAorICAgIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsCisgICAgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywKKyAgICAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLAorICAgIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksCisgICAgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwKKyAgICAweDAyLCAweDE4LCAweDFjLCAweDAwLCAweDE1LCAweDE5LCAweDA0LCAweDE4LCAweDFiLCAweGI2LCAweGMzLCAweGM0LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGY1LCAweGY4LCAweGY5LAorICAgIDB4ODUsIDB4YWQsIDB4YjQsIDB4NzIsIDB4YTEsIDB4YTksIDB4NmYsIDB4OWYsIDB4YTYsIDB4NmMsIDB4OWMsIDB4YTQsIDB4NjksIDB4OWEsIDB4YTIsIDB4NjYsIDB4OTcsIDB4OWYsIDB4NjMsIDB4OTYsIDB4OWUsCisgICAgMHg2MCwgMHg5MiwgMHg5YiwgMHg1YywgMHg5MSwgMHg5OCwgMHg1OSwgMHg4ZSwgMHg5NiwgMHg1NiwgMHg4YiwgMHg5MywgMHg1MywgMHg4OSwgMHg5MiwgMHg3NCwgMHg5ZiwgMHhhNiwgMHhlNCwgMHhlYywgMHhlZCwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmOSwgMHhmYiwgMHhmYiwgMHhlYiwgMHhmMCwgMHhmMSwgMHhkNiwgMHhlMSwgMHhlMiwgMHhjNCwgMHhkNCwgMHhkNiwgMHhiYSwgMHhjYywgMHhjZiwKKyAgICAweGI4LCAweGNiLCAweGNlLCAweGMwLCAweGQwLCAweGQzLCAweGNlLCAweGRiLCAweGRkLCAweGU2LCAweGVjLCAweGVkLCAweGY1LCAweGY3LCAweGY4LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGNmLCAweGQ5LCAweGRhLCAweDM0LCAweDVkLCAweDYzLCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLAorICAgIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsCisgICAgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwKKyAgICAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwKKyAgICAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLAorICAgIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsCisgICAgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwKKyAgICAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LAorICAgIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsCisgICAgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwKKyAgICAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAwLCAweDBmLCAweDEyLAorICAgIDB4NGIsIDB4NjUsIDB4NjksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YjYsIDB4Y2YsIDB4ZDMsIDB4NzYsIDB4YTQsIDB4YWIsIDB4NzIsIDB4YTEsIDB4YTgsCisgICAgMHg2ZiwgMHg5ZSwgMHhhNiwgMHg2YywgMHg5YywgMHhhNCwgMHg2OSwgMHg5OSwgMHhhMSwgMHg2NiwgMHg5NywgMHg5ZiwgMHg2MywgMHg5NSwgMHg5ZCwgMHg1ZiwgMHg5MiwgMHg5YSwgMHg1YywgMHg5MCwgMHg5OCwKKyAgICAweDU4LCAweDhkLCAweDk1LCAweDg4LCAweGFlLCAweGIzLCAweGYzLCAweGY3LCAweGY4LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmYiwgMHhmYywgMHhmYywgMHhkNSwgMHhlMSwgMHhlMywgMHg5ZCwgMHhiOSwgMHhiZCwgMHg3MCwgMHg5NywgMHg5ZCwgMHg0YSwgMHg3YiwgMHg4MywKKyAgICAweDJkLCAweDY1LCAweDZmLCAweDI0LCAweDVmLCAweDY3LCAweDFmLCAweDVhLCAweDY0LCAweDFkLCAweDU5LCAweDYyLCAweDFiLCAweDU2LCAweDYwLCAweDFhLCAweDU1LCAweDVlLCAweDFjLCAweDU2LCAweDVmLAorICAgIDB4MjAsIDB4NTgsIDB4NjIsIDB4MzcsIDB4NjksIDB4NzEsIDB4NWMsIDB4ODQsIDB4OGEsIDB4ODksIDB4YTUsIDB4YWEsIDB4YzIsIDB4ZDEsIDB4ZDQsIDB4ZjUsIDB4ZjcsIDB4ZjgsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGU3LCAweGVjLCAweGVkLCAweDRhLCAweDZlLCAweDc0LAorICAgIDB4MTEsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsCisgICAgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywKKyAgICAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsCisgICAgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsCisgICAgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwKKyAgICAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLAorICAgIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsCisgICAgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwKKyAgICAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLAorICAgIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDAsIDB4MTEsIDB4MTQsIDB4MTAsIDB4MjgsIDB4MmMsIDB4ZWIsIDB4ZWUsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhlNiwgMHhlZSwgMHhlZiwgMHg3ZCwgMHhhOSwgMHhiMCwgMHg3NiwgMHhhMywgMHhhYSwgMHg3MywgMHhhMSwgMHhhOCwgMHg2ZiwgMHg5ZSwgMHhhNiwgMHg2YywgMHg5YywgMHhhMywKKyAgICAweDZhLCAweDlhLCAweGEyLCAweDY2LCAweDk3LCAweDlmLCAweDYyLCAweDk0LCAweDljLCAweDVmLCAweDkyLCAweDlhLCAweDk0LCAweGI2LCAweGJiLCAweGZiLCAweGZjLCAweGZkLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlMiwgMHhlYSwgMHhlYywgMHg5OSwgMHhiNiwgMHhiYSwgMHg1MywgMHg4MywgMHg4YiwKKyAgICAweDJjLCAweDY3LCAweDcwLCAweDI4LCAweDY0LCAweDZkLCAweDI2LCAweDYxLCAweDZiLCAweDI1LCAweDVmLCAweDY5LCAweDI0LCAweDVmLCAweDY4LCAweDIxLCAweDVjLCAweDY1LCAweDIwLCAweDViLCAweDY0LAorICAgIDB4MWQsIDB4NTksIDB4NjIsIDB4MWMsIDB4NTcsIDB4NjEsIDB4MWIsIDB4NTUsIDB4NWYsIDB4MTksIDB4NTQsIDB4NWQsIDB4MTgsIDB4NTIsIDB4NWMsIDB4MTcsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NTAsIDB4NTksCisgICAgMHgxNiwgMHg0ZiwgMHg1OCwgMHgxNSwgMHg0ZSwgMHg1NywgMHgzMiwgMHg2NCwgMHg2YiwgMHg3YSwgMHg5OSwgMHg5ZSwgMHhkMCwgMHhkYiwgMHhkZCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZWUsIDB4ZjEsIDB4ZjIsIDB4OGQsIDB4YTMsIDB4YTcsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsCisgICAgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwKKyAgICAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LAorICAgIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwKKyAgICAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsCisgICAgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwKKyAgICAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLAorICAgIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsCisgICAgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwKKyAgICAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LAorICAgIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsCisgICAgMHgwMSwgMHgxNCwgMHgxNywgMHgwMCwgMHgxMiwgMHgxNSwgMHg5MSwgMHhhNCwgMHhhNywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg5ZiwgMHhjMCwgMHhjNSwKKyAgICAweDc5LCAweGE2LCAweGFkLCAweDc2LCAweGEzLCAweGFhLCAweDczLCAweGExLCAweGE4LCAweDZmLCAweDllLCAweGE1LCAweDZjLCAweDliLCAweGEzLCAweDY4LCAweDk4LCAweGEwLCAweDY0LCAweDk2LCAweDlkLAorICAgIDB4OTgsIDB4YjksIDB4YmUsIDB4ZmMsIDB4ZmQsIDB4ZmQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhkZCwgMHhlNywgMHhlOCwKKyAgICAweDgyLCAweGE2LCAweGFjLCAweDNkLCAweDczLCAweDdjLCAweDJmLCAweDZhLCAweDczLCAweDJkLCAweDY4LCAweDcyLCAweDJiLCAweDY3LCAweDcwLCAweDI5LCAweDY1LCAweDZlLCAweDI2LCAweDYyLCAweDZjLAorICAgIDB4MjUsIDB4NWYsIDB4NjksIDB4MjQsIDB4NWYsIDB4NjgsIDB4MjIsIDB4NWMsIDB4NjYsIDB4MjAsIDB4NWIsIDB4NjQsIDB4MWUsIDB4NTksIDB4NjMsIDB4MWQsIDB4NTgsIDB4NjEsIDB4MWIsIDB4NTUsIDB4NWYsCisgICAgMHgxYSwgMHg1NSwgMHg1ZCwgMHgxOSwgMHg1MywgMHg1ZCwgMHgxOCwgMHg1MSwgMHg1YiwgMHgxNywgMHg1MSwgMHg1OSwgMHgxNiwgMHg0ZiwgMHg1OCwgMHgxNSwgMHg0ZSwgMHg1NywgMHgxNCwgMHg0ZCwgMHg1NSwKKyAgICAweDE0LCAweDRjLCAweDU0LCAweDE3LCAweDRkLCAweDU2LCAweDU5LCAweDdmLCAweDg1LCAweGM1LCAweGQzLCAweGQ0LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhiMCwgMHhjMCwgMHhjMiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwKKyAgICAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LAorICAgIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsCisgICAgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwKKyAgICAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LAorICAgIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsCisgICAgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwKKyAgICAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLAorICAgIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsCisgICAgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMCwgMHgwZSwgMHgxMCwgMHgzYSwgMHg1NCwgMHg1OSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGNkLCAweGRlLCAweGUxLCAweDdjLCAweGE4LCAweGFlLCAweDc5LCAweGE1LCAweGFjLCAweDc2LCAweGEzLCAweGFhLAorICAgIDB4NzIsIDB4YTAsIDB4YTcsIDB4NmUsIDB4OWQsIDB4YTQsIDB4NmMsIDB4OWIsIDB4YTIsIDB4OTIsIDB4YjUsIDB4YmEsIDB4ZmEsIDB4ZmMsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGVlLCAweGYzLCAweGY0LCAweDkxLCAweGIxLCAweGI2LCAweDQxLCAweDc4LCAweDgxLCAweDM2LCAweDcwLCAweDc5LCAweDMzLCAweDZkLCAweDc2LCAweDMxLCAweDZjLCAweDc0LAorICAgIDB4MmUsIDB4NjksIDB4NzIsIDB4MmMsIDB4NjcsIDB4NzAsIDB4MjksIDB4NjUsIDB4NmUsIDB4MjcsIDB4NjIsIDB4NmMsIDB4MjYsIDB4NjAsIDB4NmEsIDB4MjQsIDB4NWYsIDB4NjgsIDB4MjIsIDB4NWMsIDB4NjYsCisgICAgMHgyMSwgMHg1YywgMHg2NSwgMHgxZSwgMHg1OSwgMHg2MywgMHgxZCwgMHg1OCwgMHg2MSwgMHgxYiwgMHg1NSwgMHg1ZiwgMHgxYSwgMHg1NSwgMHg1ZCwgMHgxOSwgMHg1MywgMHg1ZCwgMHgxOCwgMHg1MSwgMHg1YiwKKyAgICAweDE3LCAweDUxLCAweDU5LCAweDE2LCAweDRmLCAweDU4LCAweDE1LCAweDRlLCAweDU3LCAweDE0LCAweDRkLCAweDU1LCAweDE0LCAweDRjLCAweDU0LCAweDEzLCAweDRhLCAweDUzLCAweDEzLCAweDQ5LCAweDUyLAorICAgIDB4MTQsIDB4NDksIDB4NTEsIDB4NjMsIDB4ODYsIDB4OGMsIDB4ZGUsIDB4ZTUsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhYywgMHhiYywgMHhiZiwgMHgwZCwgMHgzYiwgMHg0MywKKyAgICAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLAorICAgIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsCisgICAgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwKKyAgICAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLAorICAgIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsCisgICAgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwKKyAgICAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLAorICAgIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsCisgICAgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywKKyAgICAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAwLCAweDExLCAweDEyLCAweDBlLCAweDI1LCAweDI4LCAweGU2LCAweGVjLCAweGVjLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZjAsIDB4ZjUsIDB4ZjYsIDB4OGEsIDB4YjEsIDB4YjcsIDB4N2MsIDB4YTcsIDB4YWUsIDB4NzgsIDB4YTUsIDB4YWIsIDB4NzUsIDB4YTEsIDB4YTksIDB4NzIsIDB4YTAsIDB4YTcsIDB4ODYsIDB4YWQsIDB4YjMsCisgICAgMHhmMiwgMHhmNiwgMHhmNywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGMzLCAweGQ1LCAweGQ4LCAweDU3LCAweDg5LCAweDkxLCAweDNlLCAweDc2LCAweDdmLAorICAgIDB4M2IsIDB4NzQsIDB4N2QsIDB4MzgsIDB4NzEsIDB4N2EsIDB4MzUsIDB4NmUsIDB4NzgsIDB4MzIsIDB4NmMsIDB4NzUsIDB4MmYsIDB4NjksIDB4NzMsIDB4MmQsIDB4NjgsIDB4NzEsIDB4MmEsIDB4NjUsIDB4NmUsCisgICAgMHgyOCwgMHg2MywgMHg2ZCwgMHgyNiwgMHg2MSwgMHg2YiwgMHgyNSwgMHg1ZiwgMHg2OSwgMHgyMywgMHg1ZCwgMHg2NiwgMHgyMiwgMHg1YywgMHg2NiwgMHgxZiwgMHg1YSwgMHg2MywgMHgxZSwgMHg1OCwgMHg2MiwKKyAgICAweDFjLCAweDU2LCAweDYwLCAweDFiLCAweDU1LCAweDVlLCAweDE5LCAweDUzLCAweDVkLCAweDE4LCAweDUxLCAweDViLCAweDE3LCAweDUxLCAweDU5LCAweDE2LCAweDRmLCAweDU4LCAweDE1LCAweDRlLCAweDU3LAorICAgIDB4MTUsIDB4NGQsIDB4NTYsIDB4MTQsIDB4NGMsIDB4NTQsIDB4MTMsIDB4NGEsIDB4NTMsIDB4MTMsIDB4NDksIDB4NTIsIDB4MTIsIDB4NDgsIDB4NTAsIDB4MTEsIDB4NDcsIDB4NTAsIDB4MjIsIDB4NTMsIDB4NWIsCisgICAgMHhhMCwgMHhiNSwgMHhiOCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGFjLCAweGJjLCAweGJmLCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLAorICAgIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksCisgICAgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywKKyAgICAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLAorICAgIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsCisgICAgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwKKyAgICAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LAorICAgIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsCisgICAgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywKKyAgICAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAxLCAweDEzLCAweDE2LAorICAgIDB4MDAsIDB4MTEsIDB4MTQsIDB4OWIsIDB4YWMsIDB4YWUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YTksIDB4YzUsIDB4Y2EsIDB4N2YsIDB4YTksIDB4YWYsCisgICAgMHg3YywgMHhhNywgMHhhZSwgMHg3OCwgMHhhNCwgMHhhYiwgMHg3ZSwgMHhhNywgMHhhZiwgMHhlMSwgMHhlYSwgMHhlYywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZiLCAweGZjLCAweGZjLAorICAgIDB4OTgsIDB4YjcsIDB4YmMsIDB4NDQsIDB4N2IsIDB4ODUsIDB4NDIsIDB4N2EsIDB4ODMsIDB4M2YsIDB4NzcsIDB4ODAsIDB4M2MsIDB4NzUsIDB4N2UsIDB4MzksIDB4NzIsIDB4N2IsIDB4MzYsIDB4NmYsIDB4NzgsCisgICAgMHgzMywgMHg2ZCwgMHg3NiwgMHgzMSwgMHg2YiwgMHg3NCwgMHgyZSwgMHg2OSwgMHg3MiwgMHgyYiwgMHg2NiwgMHg2ZiwgMHgyOSwgMHg2NCwgMHg2ZSwgMHgyNywgMHg2MSwgMHg2YiwgMHgyNiwgMHg2MCwgMHg2OSwKKyAgICAweDI0LCAweDVlLCAweDY3LCAweDIyLCAweDVjLCAweDY2LCAweDFmLCAweDVhLCAweDYzLCAweDFlLCAweDU4LCAweDYyLCAweDFkLCAweDU3LCAweDYwLCAweDFiLCAweDU1LCAweDVlLCAweDFhLCAweDU0LCAweDVkLAorICAgIDB4MTksIDB4NTIsIDB4NWMsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NTAsIDB4NTgsIDB4MTYsIDB4NGYsIDB4NTgsIDB4MTUsIDB4NGQsIDB4NTYsIDB4MTQsIDB4NGMsIDB4NTQsIDB4MTQsIDB4NGIsIDB4NTMsCisgICAgMHgxMywgMHg0OSwgMHg1MiwgMHgxMiwgMHg0OCwgMHg1MCwgMHgxMSwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NSwgMHg0ZSwgMHgxMCwgMHg0NCwgMHg0ZCwgMHg2NywgMHg4OCwgMHg4ZCwgMHhmMiwgMHhmNSwgMHhmNSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGFjLCAweGJjLCAweGJmLAorICAgIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsCisgICAgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwKKyAgICAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsCisgICAgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwKKyAgICAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLAorICAgIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsCisgICAgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwKKyAgICAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLAorICAgIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDAsIDB4MGQsIDB4MGYsIDB4NDcsIDB4NjEsIDB4NjUsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhkMCwgMHhlMCwgMHhlMiwgMHg4MywgMHhhYiwgMHhiMiwgMHg3ZiwgMHhhOSwgMHhhZiwgMHg3YiwgMHhhNiwgMHhhZCwgMHhjYiwgMHhkYiwgMHhkZSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZjEsIDB4ZjUsIDB4ZjYsIDB4N2QsIDB4YTUsIDB4YWIsIDB4NGIsIDB4ODEsIDB4OGEsIDB4NDYsIDB4N2QsIDB4ODYsIDB4NDMsIDB4N2IsIDB4ODMsCisgICAgMHg0MCwgMHg3OCwgMHg4MSwgMHgzZSwgMHg3NiwgMHg3ZiwgMHgzYiwgMHg3MywgMHg3YywgMHgzOCwgMHg3MCwgMHg3YSwgMHgzNCwgMHg2ZSwgMHg3NywgMHgzMiwgMHg2YiwgMHg3NSwgMHgyZiwgMHg2OSwgMHg3MiwKKyAgICAweDJjLCAweDY3LCAweDZmLCAweDJhLCAweDY0LCAweDZlLCAweDI4LCAweDYyLCAweDZjLCAweDI2LCAweDYwLCAweDY5LCAweDI0LCAweDVlLCAweDY3LCAweDIzLCAweDVkLCAweDY2LCAweDIwLCAweDViLCAweDY0LAorICAgIDB4MWUsIDB4NTgsIDB4NjIsIDB4MWQsIDB4NTcsIDB4NjAsIDB4MWMsIDB4NTYsIDB4NWYsIDB4MWEsIDB4NTQsIDB4NWQsIDB4MTksIDB4NTIsIDB4NWMsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTYsIDB4NGYsIDB4NTgsCisgICAgMHgxNiwgMHg0ZiwgMHg1OCwgMHgxNSwgMHg0ZCwgMHg1NiwgMHgxNCwgMHg0YywgMHg1NCwgMHgxNCwgMHg0YiwgMHg1MywgMHgxMywgMHg0OSwgMHg1MiwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMSwgMHg0NywgMHg1MCwKKyAgICAweDExLCAweDQ2LCAweDRmLCAweDEwLCAweDQ0LCAweDRkLCAweDEwLCAweDQ0LCAweDRjLCAweDQ1LCAweDZkLCAweDczLCAweGU0LCAweGU5LCAweGVhLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWMsIDB4YmMsIDB4YmYsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsCisgICAgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwKKyAgICAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLAorICAgIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LAorICAgIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsCisgICAgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwKKyAgICAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLAorICAgIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsCisgICAgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwKKyAgICAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LAorICAgIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsCisgICAgMHgwMiwgMHgxMywgMHgxNiwgMHgwMCwgMHgwZCwgMHgxMCwgMHgxYSwgMHgzMiwgMHgzNiwgMHhmYiwgMHhmZCwgMHhmZCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlYywgMHhmMywgMHhmNCwKKyAgICAweDhjLCAweGIyLCAweGI3LCAweDgyLCAweGFiLCAweGIxLCAweGFjLCAweGM3LCAweGNiLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZWQsIDB4ZjIsIDB4ZjMsIDB4NzYsIDB4OWYsIDB4YTYsCisgICAgMHg0ZSwgMHg4NCwgMHg4YywgMHg0YywgMHg4MSwgMHg4YSwgMHg0OCwgMHg3ZSwgMHg4NywgMHg0NSwgMHg3YywgMHg4NSwgMHg0MiwgMHg3OSwgMHg4MiwgMHgzZiwgMHg3NywgMHg4MCwgMHgzYywgMHg3NCwgMHg3ZCwKKyAgICAweDM5LCAweDcxLCAweDdhLCAweDM1LCAweDZmLCAweDc3LCAweDMzLCAweDZjLCAweDc2LCAweDMwLCAweDZhLCAweDczLCAweDJlLCAweDY4LCAweDcxLCAweDJiLCAweDY1LCAweDZmLCAweDI5LCAweDYzLCAweDZkLAorICAgIDB4MjcsIDB4NjEsIDB4NmEsIDB4MjUsIDB4NWUsIDB4NjgsIDB4MjMsIDB4NWQsIDB4NjYsIDB4MjAsIDB4NWIsIDB4NjQsIDB4MWYsIDB4NTksIDB4NjIsIDB4MWUsIDB4NTcsIDB4NjEsIDB4MWMsIDB4NTYsIDB4NWYsCisgICAgMHgxYiwgMHg1NCwgMHg1ZSwgMHgxOSwgMHg1MiwgMHg1YywgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg1MCwgMHg1OCwgMHgxNiwgMHg0ZiwgMHg1OCwgMHgxNSwgMHg0ZCwgMHg1NiwgMHgxNSwgMHg0YywgMHg1NSwKKyAgICAweDE0LCAweDRiLCAweDUzLCAweDEzLCAweDQ5LCAweDUyLCAweDEzLCAweDQ5LCAweDUxLCAweDExLCAweDQ3LCAweDUwLCAweDExLCAweDQ2LCAweDRmLCAweDEwLCAweDQ0LCAweDRkLCAweDEwLCAweDQ0LCAweDRjLAorICAgIDB4MTAsIDB4NDMsIDB4NGIsIDB4MzgsIDB4NjIsIDB4NjgsIDB4ZGYsIDB4ZTYsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhhYywgMHhiYywgMHhiZiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwKKyAgICAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LAorICAgIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwKKyAgICAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywKKyAgICAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LAorICAgIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsCisgICAgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwKKyAgICAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLAorICAgIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsCisgICAgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMCwgMHgxMSwgMHgxMywgMHgwNCwgMHgxNiwgMHgxOSwKKyAgICAweGNiLCAweGQ0LCAweGQ2LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDlmLCAweGJlLCAweGMzLCAweDhkLCAweGIzLCAweGI5LCAweGYxLCAweGY2LCAweGY2LAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhlZiwgMHhmNCwgMHhmNSwgMHg3OSwgMHhhMiwgMHhhOCwgMHg1NSwgMHg4OCwgMHg5MSwgMHg1MCwgMHg4NSwgMHg4ZCwgMHg0ZCwgMHg4MiwgMHg4YiwgMHg0YSwgMHg3ZiwgMHg4OCwKKyAgICAweDQ2LCAweDdkLCAweDg1LCAweDQzLCAweDdhLCAweDgzLCAweDQwLCAweDc4LCAweDgxLCAweDNkLCAweDc0LCAweDdlLCAweDNhLCAweDcyLCAweDdiLCAweDM2LCAweDcwLCAweDc4LCAweDM0LCAweDZkLCAweDc2LAorICAgIDB4MzEsIDB4NmIsIDB4NzMsIDB4MmUsIDB4NjgsIDB4NzEsIDB4MmMsIDB4NjYsIDB4NmYsIDB4MmEsIDB4NjMsIDB4NmQsIDB4MjgsIDB4NjIsIDB4NmIsIDB4MjYsIDB4NWYsIDB4NjgsIDB4MjQsIDB4NWUsIDB4NjcsCisgICAgMHgyMiwgMHg1YywgMHg2NSwgMHgxZiwgMHg1OSwgMHg2MiwgMHgxZSwgMHg1NywgMHg2MSwgMHgxZCwgMHg1NywgMHg1ZiwgMHgxYiwgMHg1NCwgMHg1ZSwgMHgxYSwgMHg1MywgMHg1YywgMHgxOSwgMHg1MiwgMHg1YiwKKyAgICAweDE3LCAweDUwLCAweDU5LCAweDE3LCAweDUwLCAweDU4LCAweDE2LCAweDRlLCAweDU3LCAweDE1LCAweDRjLCAweDU1LCAweDE0LCAweDRiLCAweDUzLCAweDEzLCAweDQ5LCAweDUyLCAweDEzLCAweDQ5LCAweDUxLAorICAgIDB4MTEsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDYsIDB4NGYsIDB4MTAsIDB4NDQsIDB4NGQsIDB4MTAsIDB4NDQsIDB4NGMsIDB4MTAsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4M2EsIDB4NjMsIDB4NmEsCisgICAgMHhlNywgMHhlYywgMHhlZCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhYywgMHhiYywgMHhiZiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwKKyAgICAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLAorICAgIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsCisgICAgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsCisgICAgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwKKyAgICAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LAorICAgIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsCisgICAgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwKKyAgICAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLAorICAgIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsCisgICAgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwKKyAgICAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAwLCAweDBkLCAweDBmLCAweDgwLCAweDk0LCAweDk3LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YmUsIDB4ZDMsIDB4ZDcsIDB4YzcsIDB4ZGEsIDB4ZGMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmOCwgMHhmYSwgMHhmYiwgMHg4NiwgMHhhYiwgMHhiMSwgMHg1YSwgMHg4ZCwgMHg5NCwKKyAgICAweDU3LCAweDg5LCAweDkyLCAweDUyLCAweDg3LCAweDhmLCAweDRlLCAweDgzLCAweDhjLCAweDRiLCAweDgwLCAweDg5LCAweDQ4LCAweDdlLCAweDg2LCAweDQ0LCAweDdiLCAweDgzLCAweDQxLCAweDc5LCAweDgxLAorICAgIDB4M2YsIDB4NzYsIDB4N2YsIDB4M2MsIDB4NzMsIDB4N2MsIDB4MzcsIDB4NzAsIDB4NzksIDB4MzQsIDB4NmQsIDB4NzcsIDB4MzIsIDB4NmIsIDB4NzQsIDB4MmYsIDB4NjksIDB4NzEsIDB4MmQsIDB4NjYsIDB4NzAsCisgICAgMHgyYSwgMHg2MywgMHg2ZCwgMHgyOCwgMHg2MiwgMHg2YiwgMHgyNiwgMHg1ZiwgMHg2OCwgMHgyNCwgMHg1ZSwgMHg2NywgMHgyMiwgMHg1YywgMHg2NSwgMHgyMCwgMHg1YSwgMHg2MywgMHgxZSwgMHg1NywgMHg2MSwKKyAgICAweDFkLCAweDU3LCAweDVmLCAweDFjLCAweDU1LCAweDVmLCAweDFhLCAweDUzLCAweDVjLCAweDE5LCAweDUyLCAweDViLCAweDE3LCAweDUwLCAweDU5LCAweDE3LCAweDUwLCAweDU4LCAweDE2LCAweDRlLCAweDU3LAorICAgIDB4MTUsIDB4NGMsIDB4NTUsIDB4MTQsIDB4NGIsIDB4NTMsIDB4MTQsIDB4NGEsIDB4NTIsIDB4MTMsIDB4NDksIDB4NTEsIDB4MTEsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDYsIDB4NGYsIDB4MTAsIDB4NDQsIDB4NGQsCisgICAgMHgxMCwgMHg0NCwgMHg0YywgMHgxMCwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHg0ZSwgMHg3MiwgMHg3OCwgMHhmNiwgMHhmOCwgMHhmOCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGFjLCAweGJjLCAweGJmLCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLAorICAgIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsCisgICAgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwKKyAgICAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLAorICAgIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsCisgICAgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwKKyAgICAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LAorICAgIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsCisgICAgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwKKyAgICAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LAorICAgIDB4MDAsIDB4MGIsIDB4MGQsIDB4NDEsIDB4NWEsIDB4NWUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZjEsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjksIDB4ZjksCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGEwLCAweGJkLCAweGMxLCAweDYwLCAweDkwLCAweDk4LCAweDVjLCAweDhlLCAweDk1LCAweDU4LCAweDhiLCAweDkzLCAweDU0LCAweDg4LCAweDkwLCAweDUwLCAweDg1LCAweDhkLAorICAgIDB4NGQsIDB4ODEsIDB4OGEsIDB4NDksIDB4N2YsIDB4ODcsIDB4NDYsIDB4N2MsIDB4ODQsIDB4NDIsIDB4NzksIDB4ODIsIDB4NDAsIDB4NzYsIDB4N2YsIDB4M2QsIDB4NzQsIDB4N2QsIDB4MzgsIDB4NzEsIDB4NzksCisgICAgMHgzNSwgMHg2ZSwgMHg3NywgMHgzMywgMHg2YywgMHg3NSwgMHgzMCwgMHg2OSwgMHg3MiwgMHgyZCwgMHg2NiwgMHg3MCwgMHgyYiwgMHg2NCwgMHg2ZSwgMHgyOSwgMHg2MywgMHg2YywgMHgyNiwgMHg2MCwgMHg2OSwKKyAgICAweDI1LCAweDVlLCAweDY4LCAweDIzLCAweDVkLCAweDY2LCAweDIwLCAweDVhLCAweDYzLCAweDFmLCAweDU4LCAweDYyLCAweDFlLCAweDU3LCAweDYwLCAweDFjLCAweDU1LCAweDVmLCAweDFhLCAweDUzLCAweDVjLAorICAgIDB4MTksIDB4NTIsIDB4NWIsIDB4MTcsIDB4NTAsIDB4NTksIDB4MTcsIDB4NTAsIDB4NTgsIDB4MTYsIDB4NGUsIDB4NTcsIDB4MTUsIDB4NGMsIDB4NTUsIDB4MTQsIDB4NGIsIDB4NTMsIDB4MTQsIDB4NGEsIDB4NTIsCisgICAgMHgxMywgMHg0OSwgMHg1MSwgMHgxMiwgMHg0OCwgMHg1MSwgMHgxMSwgMHg0NiwgMHg0ZiwgMHgxMSwgMHg0NSwgMHg0ZSwgMHgxMCwgMHg0NCwgMHg0YywgMHgwZiwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwKKyAgICAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDc1LCAweDkyLCAweDk2LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGFjLCAweGJjLCAweGJmLCAweDBkLCAweDNiLCAweDQzLAorICAgIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsCisgICAgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwKKyAgICAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLAorICAgIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsCisgICAgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywKKyAgICAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLAorICAgIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsCisgICAgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywKKyAgICAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLAorICAgIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDAsIDB4MGIsIDB4MGQsIDB4MWYsIDB4MzcsIDB4M2EsIDB4ZmQsIDB4ZmUsIDB4ZmUsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGM3LCAweGQ4LCAweGRiLCAweDY2LCAweDk2LCAweDlkLCAweDYyLCAweDkyLCAweDk5LAorICAgIDB4NWUsIDB4OGYsIDB4OTcsIDB4NWEsIDB4OGMsIDB4OTQsIDB4NTYsIDB4ODksIDB4OTEsIDB4NTIsIDB4ODYsIDB4OGYsIDB4NGUsIDB4ODMsIDB4OGMsIDB4NGIsIDB4ODAsIDB4ODgsIDB4NDcsIDB4N2QsIDB4ODUsCisgICAgMHg0MywgMHg3YSwgMHg4MywgMHg0MCwgMHg3NywgMHg4MCwgMHgzZSwgMHg3NCwgMHg3ZCwgMHgzOSwgMHg3MiwgMHg3YSwgMHgzNiwgMHg2ZiwgMHg3OCwgMHgzNCwgMHg2ZCwgMHg3NSwgMHgzMSwgMHg2YSwgMHg3MywKKyAgICAweDJlLCAweDY3LCAweDcxLCAweDJjLCAweDY1LCAweDZmLCAweDI5LCAweDYzLCAweDZjLCAweDI3LCAweDYwLCAweDZhLCAweDI2LCAweDVmLCAweDY4LCAweDI0LCAweDVkLCAweDY3LCAweDIyLCAweDViLCAweDY0LAorICAgIDB4MjAsIDB4NTksIDB4NjIsIDB4MWUsIDB4NTcsIDB4NjAsIDB4MWMsIDB4NTUsIDB4NWYsIDB4MWIsIDB4NTMsIDB4NWQsIDB4MTksIDB4NTIsIDB4NWIsIDB4MTcsIDB4NTAsIDB4NTksIDB4MTcsIDB4NTAsIDB4NTgsCisgICAgMHgxNiwgMHg0ZSwgMHg1NywgMHgxNSwgMHg0YywgMHg1NSwgMHgxNSwgMHg0YiwgMHg1NCwgMHgxNCwgMHg0YSwgMHg1MiwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMiwgMHg0OCwgMHg1MSwgMHgxMSwgMHg0NiwgMHg0ZiwKKyAgICAweDExLCAweDQ1LCAweDRlLCAweDEwLCAweDQ0LCAweDRjLCAweDBmLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LAorICAgIDB4YjQsIDB4YzMsIDB4YzUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWUsIDB4YmUsIDB4YzEsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsCisgICAgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwKKyAgICAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLAorICAgIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsCisgICAgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywKKyAgICAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLAorICAgIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsCisgICAgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwKKyAgICAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLAorICAgIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsCisgICAgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMCwgMHgwZSwgMHgxMCwgMHgwYSwgMHgxYywgMHgxZiwgMHhkYiwgMHhlMSwgMHhlMiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZjAsIDB4ZjUsIDB4ZjYsIDB4N2IsIDB4YTMsIDB4YWIsIDB4NjgsIDB4OTcsIDB4OWUsIDB4NjQsIDB4OTMsIDB4OWEsIDB4NjAsIDB4OTAsIDB4OTgsIDB4NWIsIDB4OGMsIDB4OTUsIDB4NTcsIDB4OGEsIDB4OTIsCisgICAgMHg1MywgMHg4NywgMHg4ZiwgMHg0ZiwgMHg4MywgMHg4YywgMHg0YywgMHg4MSwgMHg4OSwgMHg0OCwgMHg3ZCwgMHg4NiwgMHg0NCwgMHg3YiwgMHg4MywgMHg0MSwgMHg3OCwgMHg4MSwgMHgzZiwgMHg3NSwgMHg3ZSwKKyAgICAweDNhLCAweDcyLCAweDdiLCAweDM3LCAweDZmLCAweDc5LCAweDM0LCAweDZkLCAweDc2LCAweDMyLCAweDZiLCAweDczLCAweDJmLCAweDY4LCAweDcxLCAweDJjLCAweDY1LCAweDZmLCAweDJhLCAweDYzLCAweDZjLAorICAgIDB4MjgsIDB4NjEsIDB4NmEsIDB4MjYsIDB4NWYsIDB4NjgsIDB4MjQsIDB4NWQsIDB4NjcsIDB4MjIsIDB4NWIsIDB4NjQsIDB4MjAsIDB4NTksIDB4NjIsIDB4MWUsIDB4NTcsIDB4NjAsIDB4MWQsIDB4NTYsIDB4NWYsCisgICAgMHgxYiwgMHg1MywgMHg1ZCwgMHgxYSwgMHg1MywgMHg1YiwgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg1MCwgMHg1OSwgMHgxNywgMHg0ZiwgMHg1NywgMHgxNiwgMHg0ZCwgMHg1NiwgMHgxNSwgMHg0YiwgMHg1NCwKKyAgICAweDE0LCAweDRhLCAweDUyLCAweDEzLCAweDQ5LCAweDUxLCAweDEyLCAweDQ4LCAweDUxLCAweDExLCAweDQ2LCAweDRmLCAweDExLCAweDQ1LCAweDRlLCAweDEwLCAweDQ0LCAweDRjLCAweDBmLCAweDQzLCAweDRiLAorICAgIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MzIsIDB4NWMsIDB4NjEsIDB4ZWUsIDB4ZjEsIDB4ZjIsIDB4YjgsIDB4YzYsIDB4YzgsCisgICAgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwKKyAgICAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LAorICAgIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwKKyAgICAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwKKyAgICAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LAorICAgIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsCisgICAgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywKKyAgICAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LAorICAgIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsCisgICAgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMSwgMHgxMCwgMHgxMiwgMHgwMSwgMHgwZSwgMHgxMSwKKyAgICAweGI1LCAweGMxLCAweGMzLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWUsIDB4YzgsIDB4Y2MsIDB4NmUsIDB4OWIsIDB4YTIsIDB4NjksIDB4OTcsIDB4OWUsCisgICAgMHg2NSwgMHg5NCwgMHg5YiwgMHg2MSwgMHg5MSwgMHg5OCwgMHg1ZCwgMHg4ZSwgMHg5NiwgMHg1OSwgMHg4YiwgMHg5MywgMHg1NSwgMHg4OCwgMHg5MCwgMHg1MCwgMHg4NCwgMHg4ZCwgMHg0ZCwgMHg4MSwgMHg4YSwKKyAgICAweDQ5LCAweDdlLCAweDg2LCAweDQ2LCAweDdjLCAweDg0LCAweDQyLCAweDc4LCAweDgxLCAweDQwLCAweDc2LCAweDdmLCAweDNjLCAweDc0LCAweDdjLCAweDM4LCAweDcwLCAweDc5LCAweDM1LCAweDZlLCAweDc3LAorICAgIDB4MzMsIDB4NmIsIDB4NzQsIDB4MzAsIDB4NjgsIDB4NzIsIDB4MmUsIDB4NjYsIDB4NzAsIDB4MmIsIDB4NjQsIDB4NmQsIDB4MjgsIDB4NjEsIDB4NmEsIDB4MjYsIDB4NjAsIDB4NjksIDB4MjUsIDB4NWUsIDB4NjcsCisgICAgMHgyMywgMHg1YywgMHg2NSwgMHgyMSwgMHg1YSwgMHg2MywgMHgxZiwgMHg1OCwgMHg2MSwgMHgxZCwgMHg1NiwgMHg1ZiwgMHgxYiwgMHg1MywgMHg1ZCwgMHgxYSwgMHg1MywgMHg1YiwgMHgxOCwgMHg1MSwgMHg1YSwKKyAgICAweDE3LCAweDUwLCAweDU5LCAweDE3LCAweDRmLCAweDU3LCAweDE2LCAweDRkLCAweDU2LCAweDE1LCAweDRiLCAweDU0LCAweDE0LCAweDRhLCAweDUyLCAweDEzLCAweDQ5LCAweDUxLCAweDEyLCAweDQ4LCAweDUxLAorICAgIDB4MTEsIDB4NDYsIDB4NGYsIDB4MTEsIDB4NDUsIDB4NGUsIDB4MTAsIDB4NDQsIDB4NGMsIDB4MGYsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsCisgICAgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHg4NSwgMHg5ZCwgMHhhMSwgMHg5OCwgMHhhYywgMHhhZiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwKKyAgICAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLAorICAgIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsCisgICAgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsCisgICAgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsCisgICAgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwKKyAgICAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LAorICAgIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsCisgICAgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwKKyAgICAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLAorICAgIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsCisgICAgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwKKyAgICAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDEwLCAweDEyLCAweDAwLCAweDBjLCAweDBlLCAweDc5LCAweDhlLCAweDkxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhlOSwgMHhmMCwgMHhmMSwgMHg3YSwgMHhhNCwgMHhhYSwgMHg3MCwgMHg5YywgMHhhMywgMHg2YiwgMHg5OSwgMHhhMCwgMHg2NiwgMHg5NSwgMHg5YywgMHg2MywgMHg5MiwgMHg5YSwgMHg1ZiwgMHg4ZiwgMHg5NywKKyAgICAweDVhLCAweDhjLCAweDk0LCAweDU2LCAweDg5LCAweDkxLCAweDUyLCAweDg1LCAweDhlLCAweDRlLCAweDgzLCAweDhiLCAweDRiLCAweDdmLCAweDg4LCAweDQ3LCAweDdkLCAweDg1LCAweDQzLCAweDc5LCAweDgyLAorICAgIDB4NDAsIDB4NzYsIDB4N2YsIDB4M2QsIDB4NzQsIDB4N2MsIDB4MzksIDB4NzEsIDB4N2EsIDB4MzYsIDB4NmYsIDB4NzcsIDB4MzQsIDB4NmMsIDB4NzUsIDB4MzEsIDB4NjksIDB4NzMsIDB4MmUsIDB4NjYsIDB4NzAsCisgICAgMHgyYywgMHg2NSwgMHg2ZSwgMHgyOSwgMHg2MiwgMHg2YiwgMHgyNiwgMHg2MCwgMHg2OSwgMHgyNSwgMHg1ZSwgMHg2NywgMHgyMywgMHg1YywgMHg2NSwgMHgyMSwgMHg1YSwgMHg2MywgMHgxZiwgMHg1OCwgMHg2MSwKKyAgICAweDFkLCAweDU2LCAweDVmLCAweDFjLCAweDU0LCAweDVlLCAweDFhLCAweDUzLCAweDViLCAweDE4LCAweDUxLCAweDVhLCAweDE3LCAweDUwLCAweDU5LCAweDE3LCAweDRmLCAweDU3LCAweDE2LCAweDRkLCAweDU2LAorICAgIDB4MTUsIDB4NGIsIDB4NTQsIDB4MTQsIDB4NGEsIDB4NTIsIDB4MTQsIDB4NGEsIDB4NTEsIDB4MTIsIDB4NDgsIDB4NTEsIDB4MTEsIDB4NDYsIDB4NGYsIDB4MTEsIDB4NDUsIDB4NGUsIDB4MTAsIDB4NDQsIDB4NGMsCisgICAgMHgwZiwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgyMywgMHg0ZSwgMHg1NiwKKyAgICAweDM2LCAweDVkLCAweDY0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLAorICAgIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsCisgICAgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLAorICAgIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLAorICAgIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsCisgICAgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwKKyAgICAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LAorICAgIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsCisgICAgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwKKyAgICAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDEwLCAweDEzLAorICAgIDB4MDAsIDB4MGEsIDB4MGMsIDB4NGEsIDB4NjMsIDB4NjcsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhiMiwgMHhjYSwgMHhjZSwgMHg3NSwgMHhhMCwgMHhhNywgMHg3MCwgMHg5ZCwgMHhhNCwKKyAgICAweDZkLCAweDlhLCAweGExLCAweDY4LCAweDk2LCAweDlkLCAweDY0LCAweDk0LCAweDliLCAweDYwLCAweDkwLCAweDk4LCAweDViLCAweDhkLCAweDk1LCAweDU3LCAweDg5LCAweDkyLCAweDUzLCAweDg2LCAweDhmLAorICAgIDB4NGYsIDB4ODMsIDB4OGIsIDB4NGMsIDB4ODAsIDB4ODgsIDB4NDgsIDB4N2QsIDB4ODYsIDB4NDUsIDB4N2EsIDB4ODMsIDB4NDAsIDB4NzYsIDB4N2YsIDB4M2QsIDB4NzQsIDB4N2MsIDB4M2EsIDB4NzIsIDB4N2IsCisgICAgMHgzNywgMHg2ZiwgMHg3OCwgMHgzNCwgMHg2YywgMHg3NSwgMHgzMSwgMHg2OSwgMHg3MywgMHgyZiwgMHg2NywgMHg3MCwgMHgyYywgMHg2NSwgMHg2ZSwgMHgyOSwgMHg2MiwgMHg2YiwgMHgyOCwgMHg2MSwgMHg2YSwKKyAgICAweDI1LCAweDVlLCAweDY3LCAweDIyLCAweDViLCAweDY0LCAweDIxLCAweDVhLCAweDYzLCAweDIwLCAweDU5LCAweDYxLCAweDFlLCAweDU3LCAweDYwLCAweDFjLCAweDU0LCAweDVlLCAweDFiLCAweDUzLCAweDVjLAorICAgIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NTAsIDB4NTksIDB4MTcsIDB4NGYsIDB4NTcsIDB4MTYsIDB4NGQsIDB4NTYsIDB4MTUsIDB4NGIsIDB4NTQsIDB4MTQsIDB4NGEsIDB4NTIsIDB4MTQsIDB4NGEsIDB4NTEsCisgICAgMHgxMiwgMHg0OCwgMHg1MSwgMHgxMSwgMHg0NiwgMHg0ZiwgMHgxMSwgMHg0NSwgMHg0ZSwgMHgxMSwgMHg0NSwgMHg0ZCwgMHgxMCwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwKKyAgICAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLAorICAgIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsCisgICAgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwKKyAgICAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwKKyAgICAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksCisgICAgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLAorICAgIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksCisgICAgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwKKyAgICAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLAorICAgIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsCisgICAgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwKKyAgICAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLAorICAgIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDEsIDB4MTAsIDB4MTMsIDB4MDAsIDB4MGEsIDB4MGMsIDB4MmUsIDB4NDcsIDB4NGIsIDB4ZmUsIDB4ZmUsIDB4ZmUsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGYxLCAweGY1LCAweGY2LCAweDg4LCAweGFkLCAweGIzLCAweDc3LCAweGEyLCAweGE5LCAweDcyLCAweDllLCAweGE1LCAweDZlLCAweDliLCAweGExLCAweDZhLCAweDk3LCAweDllLCAweDY1LCAweDk0LCAweDliLAorICAgIDB4NjIsIDB4OTEsIDB4OTksIDB4NWMsIDB4OGUsIDB4OTUsIDB4NTgsIDB4OGEsIDB4OTIsIDB4NTQsIDB4ODYsIDB4OGYsIDB4NTAsIDB4ODQsIDB4OGMsIDB4NGQsIDB4ODEsIDB4ODksIDB4NDksIDB4N2UsIDB4ODYsCisgICAgMHg0NiwgMHg3YiwgMHg4NCwgMHg0MiwgMHg3OCwgMHg4MCwgMHgzZSwgMHg3NSwgMHg3ZCwgMHgzYiwgMHg3MiwgMHg3YiwgMHgzNywgMHg2ZiwgMHg3OCwgMHgzNCwgMHg2ZCwgMHg3NSwgMHgzMiwgMHg2YSwgMHg3MywKKyAgICAweDJmLCAweDY3LCAweDcwLCAweDJjLCAweDY1LCAweDZlLCAweDJhLCAweDYzLCAweDZiLCAweDI4LCAweDYxLCAweDZhLCAweDI1LCAweDVlLCAweDY3LCAweDI0LCAweDVkLCAweDY2LCAweDIyLCAweDVhLCAweDY0LAorICAgIDB4MjAsIDB4NTksIDB4NjEsIDB4MWUsIDB4NTcsIDB4NjAsIDB4MWQsIDB4NTUsIDB4NWUsIDB4MWIsIDB4NTMsIDB4NWMsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NTAsIDB4NTksIDB4MTcsIDB4NGYsIDB4NTcsCisgICAgMHgxNiwgMHg0ZCwgMHg1NiwgMHgxNSwgMHg0YiwgMHg1NCwgMHgxNSwgMHg0YSwgMHg1MywgMHgxNCwgMHg0YSwgMHg1MSwgMHgxMiwgMHg0OCwgMHg1MSwgMHgxMiwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NSwgMHg0ZSwKKyAgICAweDExLCAweDQ1LCAweDRkLCAweDEwLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LAorICAgIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsCisgICAgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwKKyAgICAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLAorICAgIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLAorICAgIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsCisgICAgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwKKyAgICAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLAorICAgIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsCisgICAgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywKKyAgICAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLAorICAgIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsCisgICAgMHgwMSwgMHgxMCwgMHgxMywgMHgwMCwgMHgwYSwgMHgwYywgMHgxZCwgMHgzNCwgMHgzNywgMHhmNSwgMHhmNiwgMHhmNiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGNkLCAweGRkLCAweGUwLCAweDdkLCAweGE2LCAweGFjLCAweDc4LCAweGEyLCAweGE5LAorICAgIDB4NzMsIDB4OWUsIDB4YTYsIDB4NzAsIDB4OWMsIDB4YTMsIDB4NmIsIDB4OTgsIDB4OWYsIDB4NjYsIDB4OTUsIDB4OWMsIDB4NjMsIDB4OTIsIDB4OWEsIDB4NWQsIDB4OGUsIDB4OTYsIDB4NWEsIDB4OGIsIDB4OTQsCisgICAgMHg1NSwgMHg4NywgMHg5MCwgMHg1MSwgMHg4NSwgMHg4ZCwgMHg0ZCwgMHg4MSwgMHg4OSwgMHg0YSwgMHg3ZiwgMHg4NywgMHg0NywgMHg3YywgMHg4NCwgMHg0MywgMHg3OCwgMHg4MSwgMHgzZiwgMHg3NiwgMHg3ZSwKKyAgICAweDNiLCAweDcyLCAweDdiLCAweDM4LCAweDcwLCAweDc5LCAweDM1LCAweDZkLCAweDc2LCAweDMzLCAweDZhLCAweDc0LCAweDMwLCAweDY4LCAweDcxLCAweDJkLCAweDY1LCAweDZlLCAweDJhLCAweDYzLCAweDZiLAorICAgIDB4MjgsIDB4NjEsIDB4NmEsIDB4MjYsIDB4NWYsIDB4NjgsIDB4MjQsIDB4NWQsIDB4NjYsIDB4MjIsIDB4NWEsIDB4NjQsIDB4MjAsIDB4NTksIDB4NjEsIDB4MWYsIDB4NTcsIDB4NjEsIDB4MWQsIDB4NTUsIDB4NWUsCisgICAgMHgxYiwgMHg1MywgMHg1YywgMHgxOSwgMHg1MiwgMHg1YSwgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg0ZiwgMHg1OCwgMHgxNywgMHg0ZSwgMHg1NiwgMHgxNiwgMHg0YywgMHg1NSwgMHgxNSwgMHg0YSwgMHg1MywKKyAgICAweDE0LCAweDRhLCAweDUxLCAweDEyLCAweDQ4LCAweDUxLCAweDEyLCAweDQ3LCAweDUwLCAweDExLCAweDQ1LCAweDRlLCAweDExLCAweDQ1LCAweDRkLCAweDEwLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LAorICAgIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsCisgICAgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywKKyAgICAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LAorICAgIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDhlLCAweGI0LCAweGJhLCAweGI0LCAweGNkLCAweGQxLCAweDI4LCAweDcyLCAweDdjLCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDIxLCAweDZjLCAweDc3LCAweGIxLCAweGNiLCAweGNmLCAweDk0LCAweGI3LCAweGJkLCAweDA5LCAweDViLCAweDY3LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4NTEsIDB4OGEsIDB4OTMsIDB4YmIsIDB4ZDEsIDB4ZDQsCisgICAgMHg2NCwgMHg5NywgMHg5ZSwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLAorICAgIDB4NWQsIDB4OTAsIDB4OTcsIDB4MGEsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHg0NCwgMHg3YywgMHg4MywgMHg4YywgMHhhZSwgMHhiMywgMHg0OCwgMHg3ZCwgMHg4NSwKKyAgICAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsCisgICAgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgzNiwgMHg2OSwgMHg3MCwgMHgzMCwgMHg2MywgMHg2YiwgMHgwNCwgMHg0MSwgMHg0YSwKKyAgICAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLAorICAgIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsCisgICAgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgxMCwgMHgzYywgMHg0MSwgMHg5NywgMHhhOSwgMHhhYywgMHhiMCwgMHhiZCwgMHhiZiwgMHhhZiwgMHhiYywgMHhiZSwgMHhhZiwgMHhiYywgMHhiZSwKKyAgICAweGFmLCAweGJiLCAweGJkLCAweGFmLCAweGJiLCAweGJkLCAweGIwLCAweGJjLCAweGJkLCAweDk4LCAweGE3LCAweGE5LCAweDVjLCAweDcyLCAweDc1LCAweDExLCAweDMwLCAweDM1LCAweDAyLCAweDIzLCAweDI3LAorICAgIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsCisgICAgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMSwgMHgxMCwgMHgxMywgMHgwMCwgMHgwYiwgMHgwZCwgMHgxMCwgMHgyNCwgMHgyNywKKyAgICAweGRjLCAweGRmLCAweGUwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YTUsIDB4YzIsIDB4YzYsIDB4N2QsIDB4YTcsIDB4YWQsIDB4NzksIDB4YTMsIDB4YWEsIDB4NzUsIDB4YTAsIDB4YTcsIDB4NzAsIDB4OWQsIDB4YTMsIDB4NmMsIDB4OTksIDB4YTAsCisgICAgMHg2NywgMHg5NiwgMHg5ZCwgMHg2NCwgMHg5MiwgMHg5YSwgMHg1ZSwgMHg4ZiwgMHg5NywgMHg1YSwgMHg4YywgMHg5NCwgMHg1NiwgMHg4OCwgMHg5MCwgMHg1MiwgMHg4NSwgMHg4ZCwgMHg0ZSwgMHg4MiwgMHg4YSwKKyAgICAweDRiLCAweDdmLCAweDg4LCAweDQ4LCAweDdjLCAweDg1LCAweDQ0LCAweDc5LCAweDgyLCAweDQwLCAweDc2LCAweDdlLCAweDNjLCAweDczLCAweDdjLCAweDM5LCAweDcxLCAweDc5LCAweDM1LCAweDZkLCAweDc2LAorICAgIDB4MzMsIDB4NmEsIDB4NzQsIDB4MzAsIDB4NjgsIDB4NzEsIDB4MmUsIDB4NjYsIDB4NmYsIDB4MmIsIDB4NjMsIDB4NmMsIDB4MjgsIDB4NjEsIDB4NmEsIDB4MjYsIDB4NjAsIDB4NjksIDB4MjUsIDB4NWQsIDB4NjYsCisgICAgMHgyMywgMHg1YiwgMHg2NCwgMHgyMSwgMHg1YSwgMHg2MiwgMHgxZiwgMHg1NywgMHg2MSwgMHgxZCwgMHg1NSwgMHg1ZSwgMHgxYywgMHg1NCwgMHg1ZCwgMHgxOSwgMHg1MiwgMHg1YSwgMHgxOCwgMHg1MSwgMHg1YSwKKyAgICAweDE3LCAweDRmLCAweDU4LCAweDE3LCAweDRlLCAweDU2LCAweDE2LCAweDRjLCAweDU1LCAweDE1LCAweDRhLCAweDUzLCAweDE0LCAweDRhLCAweDUxLCAweDEyLCAweDQ4LCAweDUxLCAweDEyLCAweDQ3LCAweDUwLAorICAgIDB4MTEsIDB4NDUsIDB4NGUsIDB4MTEsIDB4NDUsIDB4NGQsIDB4MTAsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsCisgICAgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwKKyAgICAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LAorICAgIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweGQ3LCAweGU1LCAweGU3LAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4M2IsIDB4N2UsIDB4ODcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDMwLCAweDc2LCAweDgwLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZTAsIDB4ZWEsIDB4ZWMsIDB4MGIsIDB4NWMsIDB4NjgsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHg3OSwgMHhhNSwgMHhhYywgMHhmZiwgMHhmZiwgMHhmZiwgMHg5NiwgMHhiOCwgMHhiZCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4ZDAsIDB4ZGYsIDB4ZTEsIDB4OGUsIDB4YjEsIDB4YjYsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDViLCAweDg0LCAweGE5LCAweGFlLCAweGZmLCAweGZmLCAweGZmLCAweDhhLCAweGFjLCAweGIyLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsCisgICAgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwKKyAgICAweDA1LCAweDQzLCAweDRkLCAweGEyLCAweGJhLCAweGJkLCAweGE0LCAweGJiLCAweGJlLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LAorICAgIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsCisgICAgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgxNywgMHg0MSwgMHg0NywKKyAgICAweGU3LCAweGViLCAweGVjLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDEsIDB4ZDcsIDB4ZDgsIDB4M2EsIDB4NTMsIDB4NTYsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsCisgICAgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwKKyAgICAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDEwLCAweDEzLCAweDAwLCAweDBkLCAweDBmLCAweDA3LCAweDE4LCAweDFjLCAweGM1LCAweGNjLCAweGNkLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZjIsIDB4ZjYsIDB4ZjcsIDB4OTAsIDB4YjMsIDB4YjgsIDB4N2YsIDB4YTgsIDB4YWUsCisgICAgMHg3YiwgMHhhNCwgMHhhYiwgMHg3NiwgMHhhMCwgMHhhNywgMHg3MSwgMHg5ZCwgMHhhNCwgMHg2ZCwgMHg5OSwgMHhhMCwgMHg2OCwgMHg5NiwgMHg5ZCwgMHg2NCwgMHg5MywgMHg5YiwgMHg1ZiwgMHg5MCwgMHg5NywKKyAgICAweDViLCAweDhjLCAweDk1LCAweDU3LCAweDg4LCAweDkxLCAweDUzLCAweDg2LCAweDhlLCAweDRlLCAweDgyLCAweDhhLCAweDRiLCAweDdmLCAweDg4LCAweDQ4LCAweDdjLCAweDg1LCAweDQzLCAweDc4LCAweDgxLAorICAgIDB4NDAsIDB4NzYsIDB4N2UsIDB4M2QsIDB4NzQsIDB4N2MsIDB4MzksIDB4NzEsIDB4NzksIDB4MzYsIDB4NmUsIDB4NzYsIDB4MzQsIDB4NmIsIDB4NzUsIDB4MzEsIDB4NjgsIDB4NzIsIDB4MmUsIDB4NjYsIDB4NmYsCisgICAgMHgyYiwgMHg2MywgMHg2YywgMHgyOSwgMHg2MiwgMHg2YiwgMHgyNiwgMHg1ZiwgMHg2OCwgMHgyNSwgMHg1ZCwgMHg2NiwgMHgyMywgMHg1YiwgMHg2NCwgMHgyMSwgMHg1YSwgMHg2MiwgMHgxZiwgMHg1NywgMHg2MSwKKyAgICAweDFkLCAweDU1LCAweDVlLCAweDFjLCAweDU0LCAweDVkLCAweDE5LCAweDUyLCAweDVhLCAweDE4LCAweDUxLCAweDVhLCAweDE3LCAweDRmLCAweDU4LCAweDE3LCAweDRlLCAweDU2LCAweDE2LCAweDRjLCAweDU1LAorICAgIDB4MTUsIDB4NGEsIDB4NTMsIDB4MTQsIDB4NGEsIDB4NTEsIDB4MTIsIDB4NDgsIDB4NTEsIDB4MTIsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDUsIDB4NGUsIDB4MTEsIDB4NDUsIDB4NGQsIDB4MTAsIDB4NDMsIDB4NGIsCisgICAgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwKKyAgICAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLAorICAgIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsCisgICAgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4Y2UsIDB4ZGYsIDB4ZTEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzksIDB4N2MsIDB4ODYsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MmUsIDB4NzUsIDB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDYsIDB4ZTQsIDB4ZTYsIDB4MGIsIDB4NWMsIDB4NjgsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHg3NCwgMHhhMiwgMHhhOSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweDkwLCAweGI0LCAweGI5LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg2MCwgMHhjNywgMHhkOSwgMHhkYiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg2ZSwgMHg5YSwgMHhhMSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDdlLCAweGE0LCAweGFhLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ODMsIDB4YTgsIDB4YWQsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDFiLCAweDUzLCAweDVjLCAweGVlLCAweGYyLCAweGYzLCAweGVlLCAweGYyLCAweGYzLAorICAgIDB4MWEsIDB4NTEsIDB4NWEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsCisgICAgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywKKyAgICAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDE2LCAweDQwLCAweDQ2LCAweGUxLCAweGU3LCAweGU3LCAweGY3LCAweGY4LCAweGY5LCAweDY2LCAweDdmLCAweDgzLAorICAgIDB4NGQsIDB4NmEsIDB4NmUsIDB4NTAsIDB4NmIsIDB4NmYsIDB4NGYsIDB4NmEsIDB4NmUsIDB4NGYsIDB4NjksIDB4NmQsIDB4NzQsIDB4ODgsIDB4OGEsIDB4Y2MsIDB4ZDMsIDB4ZDQsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhlNywgMHhlYSwgMHhlYiwgMHgyNSwgMHgzZiwgMHg0NCwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwKKyAgICAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDEwLCAweDEzLCAweDAxLCAweDBkLCAweDEwLAorICAgIDB4MDMsIDB4MTAsIDB4MTIsIDB4YjMsIDB4YmIsIDB4YmMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhkZSwgMHhlOSwgMHhlYSwgMHg4NSwgMHhhYywgMHhiMiwgMHg4MCwgMHhhOSwgMHhhZSwgMHg3YywgMHhhNSwgMHhhYiwgMHg3NywgMHhhMSwgMHhhOCwgMHg3MiwgMHg5ZSwgMHhhNCwKKyAgICAweDZlLCAweDlhLCAweGExLCAweDY5LCAweDk3LCAweDllLCAweDY1LCAweDk0LCAweDliLCAweDYwLCAweDkwLCAweDk4LCAweDVjLCAweDhkLCAweDk1LCAweDU4LCAweDg5LCAweDkyLCAweDU0LCAweDg2LCAweDhlLAorICAgIDB4NGYsIDB4ODIsIDB4OGIsIDB4NGMsIDB4ODAsIDB4ODgsIDB4NDksIDB4N2QsIDB4ODYsIDB4NDUsIDB4N2EsIDB4ODIsIDB4NDEsIDB4NzcsIDB4N2YsIDB4M2QsIDB4NzQsIDB4N2MsIDB4M2EsIDB4NzIsIDB4N2EsCisgICAgMHgzNiwgMHg2ZSwgMHg3NiwgMHgzNCwgMHg2YiwgMHg3NSwgMHgzMSwgMHg2OCwgMHg3MiwgMHgyZSwgMHg2NiwgMHg2ZiwgMHgyYiwgMHg2MywgMHg2YywgMHgyYSwgMHg2MywgMHg2YiwgMHgyNiwgMHg2MCwgMHg2OSwKKyAgICAweDI0LCAweDVkLCAweDY2LCAweDIzLCAweDViLCAweDY0LCAweDIxLCAweDVhLCAweDYyLCAweDFmLCAweDU3LCAweDYxLCAweDFkLCAweDU1LCAweDVlLCAweDFjLCAweDU0LCAweDVkLCAweDE5LCAweDUyLCAweDVhLAorICAgIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NGYsIDB4NTgsIDB4MTcsIDB4NGUsIDB4NTYsIDB4MTYsIDB4NGMsIDB4NTUsIDB4MTUsIDB4NGEsIDB4NTMsIDB4MTQsIDB4NGEsIDB4NTEsIDB4MTIsIDB4NDgsIDB4NTEsCisgICAgMHgxMiwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NSwgMHg0ZSwgMHgxMSwgMHg0NSwgMHg0ZCwgMHgxMCwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywKKyAgICAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLAorICAgIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsCisgICAgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwKKyAgICAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHhjZSwgMHhkZiwgMHhlMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHgzOSwgMHg3YywgMHg4NiwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MmUsIDB4NzUsIDB4N2YsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhkNiwgMHhlNCwgMHhlNiwgMHgwYiwgMHg1YywgMHg2OCwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDc0LCAweGEyLCAweGE5LCAweGZmLCAweGZmLCAweGZmLCAweDkwLCAweGI0LCAweGI5LCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHhjNCwgMHhkNywgMHhkOSwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZkLCAweGZlLCAweGZlLCAweDViLCAweDhlLCAweDk1LCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4N2UsIDB4YTQsIDB4YWEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ODMsIDB4YTgsIDB4YWQsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwKKyAgICAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLAorICAgIDB4MDUsIDB4NDQsIDB4NGQsIDB4NmMsIDB4OTAsIDB4OTYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NmYsIDB4OTIsIDB4OTcsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsCisgICAgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwKKyAgICAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LAorICAgIDB4MTYsIDB4NDAsIDB4NDYsIDB4ZTMsIDB4ZTgsIDB4ZTksIDB4ZjEsIDB4ZjQsIDB4ZjQsIDB4MTksIDB4M2YsIDB4NDUsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsCisgICAgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwYSwgMHgyYiwgMHgzMCwgMHhiMywgMHhiZCwgMHhiZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHg5MSwgMHg5ZSwgMHhhMSwgMHgwMiwgMHgyMCwgMHgyNCwKKyAgICAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LAorICAgIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDEsIDB4MTAsIDB4MTMsIDB4MDEsIDB4MGUsIDB4MTAsIDB4MDEsIDB4MGMsIDB4MGUsIDB4YTAsIDB4YWIsIDB4YWMsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhjOCwgMHhkYSwgMHhkZCwgMHg4NiwgMHhhYywgMHhiMiwKKyAgICAweDgxLCAweGE5LCAweGFmLCAweDdkLCAweGE1LCAweGFjLCAweDc4LCAweGEyLCAweGE5LCAweDczLCAweDllLCAweGE1LCAweDZmLCAweDliLCAweGExLCAweDZhLCAweDk3LCAweDllLCAweDY1LCAweDk0LCAweDliLAorICAgIDB4NjEsIDB4OTEsIDB4OTgsIDB4NWMsIDB4OGQsIDB4OTUsIDB4NTksIDB4OGEsIDB4OTIsIDB4NTQsIDB4ODYsIDB4OGUsIDB4NTAsIDB4ODMsIDB4OGIsIDB4NGQsIDB4ODEsIDB4ODksIDB4NGEsIDB4N2UsIDB4ODYsCisgICAgMHg0NiwgMHg3YSwgMHg4MywgMHg0MiwgMHg3OCwgMHg4MCwgMHgzZSwgMHg3NCwgMHg3ZCwgMHgzYSwgMHg3MiwgMHg3YSwgMHgzNywgMHg2ZiwgMHg3NywgMHgzNCwgMHg2YywgMHg3NSwgMHgzMSwgMHg2OCwgMHg3MiwKKyAgICAweDJmLCAweDY3LCAweDcwLCAweDJjLCAweDY0LCAweDZkLCAweDI5LCAweDYyLCAweDZiLCAweDI3LCAweDYwLCAweDY5LCAweDI1LCAweDVkLCAweDY2LCAweDIyLCAweDVhLCAweDY0LCAweDIwLCAweDU5LCAweDYxLAorICAgIDB4MWYsIDB4NTcsIDB4NjEsIDB4MWUsIDB4NTYsIDB4NWYsIDB4MWMsIDB4NTQsIDB4NWQsIDB4MTksIDB4NTIsIDB4NWEsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NGYsIDB4NTgsIDB4MTcsIDB4NGUsIDB4NTYsCisgICAgMHgxNiwgMHg0YywgMHg1NSwgMHgxNSwgMHg0YSwgMHg1MywgMHgxNCwgMHg0YSwgMHg1MSwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMiwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NSwgMHg0ZSwgMHgxMSwgMHg0NSwgMHg0ZCwKKyAgICAweDEwLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LAorICAgIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsCisgICAgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywKKyAgICAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHhjZSwgMHhkZiwgMHhlMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHgzOSwgMHg3YywgMHg4NiwKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgyZSwgMHg3NSwgMHg3ZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhkNiwgMHhlNCwgMHhlNiwgMHgwYiwgMHg1YywgMHg2OCwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4NzQsIDB4YTIsIDB4YTksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4OTAsIDB4YjQsIDB4YjksIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweGM0LCAweGQ3LCAweGQ5LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGY2LCAweGY5LCAweGY5LCAweDRhLCAweDgyLCAweDhhLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4N2UsIDB4YTQsIDB4YWEsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHg4MywgMHhhOCwgMHhhZCwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDgsIDB4NDYsIDB4NGYsIDB4Y2IsIDB4ZDgsIDB4ZGEsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhjZiwgMHhkYSwgMHhkYywgMHgwYSwgMHg0NCwgMHg0ZCwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwKKyAgICAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLAorICAgIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MTYsIDB4NDAsIDB4NDYsIDB4ZTMsIDB4ZTgsIDB4ZTksIDB4ZjIsIDB4ZjQsIDB4ZjUsCisgICAgMHgyMywgMHg0NywgMHg0ZCwgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwKKyAgICAweDNjLCAweDU2LCAweDVhLCAweGZmLCAweGZmLCAweGZmLCAweGQxLCAweGQ3LCAweGQ4LCAweDA2LCAweDIzLCAweDI3LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLAorICAgIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDEsIDB4MTAsIDB4MTMsCisgICAgMHgwMSwgMHgwZSwgMHgxMCwgMHgwMSwgMHgwYywgMHgwZSwgMHg4OCwgMHg5NSwgMHg5NywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGI0LCAweGNkLCAweGQwLCAweDg3LCAweGFkLCAweGIzLCAweDgyLCAweGFhLCAweGIwLCAweDdkLCAweGE2LCAweGFkLCAweDc5LCAweGEyLCAweGE5LAorICAgIDB4NzQsIDB4OWYsIDB4YTYsIDB4NzAsIDB4OWIsIDB4YTIsIDB4NmIsIDB4OTgsIDB4OWYsIDB4NjYsIDB4OTQsIDB4OWMsIDB4NjIsIDB4OTIsIDB4OTksIDB4NWQsIDB4OGUsIDB4OTYsIDB4NTksIDB4OGEsIDB4OTIsCisgICAgMHg1NSwgMHg4NywgMHg4ZiwgMHg1MCwgMHg4MywgMHg4YiwgMHg0ZCwgMHg4MSwgMHg4OSwgMHg0YSwgMHg3ZSwgMHg4NiwgMHg0NiwgMHg3YSwgMHg4MywgMHg0MiwgMHg3OCwgMHg4MCwgMHgzZSwgMHg3NCwgMHg3ZCwKKyAgICAweDNiLCAweDcyLCAweDdhLCAweDM3LCAweDZmLCAweDc3LCAweDM0LCAweDZjLCAweDc1LCAweDMyLCAweDY5LCAweDcyLCAweDJmLCAweDY3LCAweDcwLCAweDJjLCAweDY0LCAweDZkLCAweDJhLCAweDYzLCAweDZiLAorICAgIDB4MjYsIDB4NjAsIDB4NjksIDB4MjYsIDB4NWUsIDB4NjcsIDB4MjQsIDB4NWMsIDB4NjUsIDB4MjIsIDB4NWEsIDB4NjMsIDB4MjAsIDB4NTgsIDB4NjEsIDB4MWUsIDB4NTYsIDB4NWYsIDB4MWMsIDB4NTQsIDB4NWQsCisgICAgMHgxYSwgMHg1MywgMHg1YiwgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg0ZiwgMHg1OCwgMHgxNywgMHg0ZSwgMHg1NiwgMHgxNiwgMHg0YywgMHg1NSwgMHgxNSwgMHg0YSwgMHg1MywgMHgxNCwgMHg0YSwgMHg1MSwKKyAgICAweDEzLCAweDQ5LCAweDUxLCAweDEyLCAweDQ3LCAweDUwLCAweDExLCAweDQ1LCAweDRlLCAweDExLCAweDQ1LCAweDRkLCAweDEwLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LAorICAgIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsCisgICAgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwKKyAgICAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LAorICAgIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweGNlLCAweGRmLCAweGUxLCAweGZmLCAweGZmLCAweGZmLCAweDM5LCAweDdjLCAweDg2LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDJlLCAweDc1LCAweDdmLCAweGZmLCAweGZmLCAweGZmLCAweGQ2LCAweGU0LCAweGU2LCAweDBiLCAweDVjLCAweDY4LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4NzQsIDB4YTIsIDB4YTksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4OTAsIDB4YjQsIDB4YjksCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweGM0LCAweGQ3LCAweGQ5LAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZGMsIDB4ZTcsIDB4ZTgsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZWMsIDB4ZjIsIDB4ZjMsIDB4M2EsIDB4NzcsIDB4N2YsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHg3ZSwgMHhhNCwgMHhhYSwgMHhmZiwgMHhmZiwgMHhmZiwgMHg4MywgMHhhOCwgMHhhZCwgMHgwNSwgMHg0ZSwgMHg1OSwKKyAgICAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsCisgICAgMHgwNSwgMHg0NSwgMHg0ZSwgMHg0NCwgMHg3MywgMHg3YSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmMiwgMHhmNSwgMHhmNiwgMHhmNSwgMHhmOCwgMHhmOCwgMHhmZiwgMHhmZiwgMHhmZiwgMHg0YSwgMHg3NSwgMHg3YywKKyAgICAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLAorICAgIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsCisgICAgMHgwMywgMHgzMiwgMHgzOCwgMHgxNiwgMHg0MCwgMHg0NiwgMHhlMywgMHhlOCwgMHhlOSwgMHhmMiwgMHhmNCwgMHhmNSwgMHgyMywgMHg0NywgMHg0ZCwgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwKKyAgICAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDFiLCAweDM5LCAweDNkLCAweGZlLCAweGZlLCAweGZlLCAweGU1LCAweGU4LCAweGU5LAorICAgIDB4MGEsIDB4MjcsIDB4MmIsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsCisgICAgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMSwgMHgxMCwgMHgxMywgMHgwMSwgMHgwZSwgMHgxMCwgMHgwMCwgMHgwYiwgMHgwZCwgMHg3OCwgMHg4NywgMHg4YSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGE2LCAweGMzLCAweGM3LAorICAgIDB4ODcsIDB4YWQsIDB4YjMsIDB4ODIsIDB4YWEsIDB4YjAsIDB4N2QsIDB4YTYsIDB4YWQsIDB4NzksIDB4YTIsIDB4YTksIDB4NzQsIDB4OWYsIDB4YTYsIDB4NzAsIDB4OWIsIDB4YTIsIDB4NmMsIDB4OTksIDB4YTAsCisgICAgMHg2NywgMHg5NSwgMHg5ZCwgMHg2MiwgMHg5MiwgMHg5OSwgMHg1ZSwgMHg4ZSwgMHg5NywgMHg1YSwgMHg4YSwgMHg5MywgMHg1NSwgMHg4NywgMHg4ZiwgMHg1MSwgMHg4NCwgMHg4YywgMHg0ZCwgMHg4MSwgMHg4OSwKKyAgICAweDRhLCAweDdlLCAweDg2LCAweDQ1LCAweDdhLCAweDgyLCAweDQyLCAweDc4LCAweDgwLCAweDNmLCAweDc1LCAweDdlLCAweDNiLCAweDcyLCAweDdhLCAweDM4LCAweDZmLCAweDc4LCAweDM0LCAweDZjLCAweDc1LAorICAgIDB4MzIsIDB4NjksIDB4NzIsIDB4MmYsIDB4NjcsIDB4NzAsIDB4MmQsIDB4NjUsIDB4NmQsIDB4MmEsIDB4NjMsIDB4NmIsIDB4MjYsIDB4NjAsIDB4NjksIDB4MjYsIDB4NWUsIDB4NjcsIDB4MjQsIDB4NWMsIDB4NjUsCisgICAgMHgyMiwgMHg1YSwgMHg2MywgMHgyMCwgMHg1OCwgMHg2MSwgMHgxZSwgMHg1NiwgMHg1ZiwgMHgxYywgMHg1NCwgMHg1ZCwgMHgxYSwgMHg1MywgMHg1YiwgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg0ZiwgMHg1OCwKKyAgICAweDE3LCAweDRlLCAweDU2LCAweDE2LCAweDRjLCAweDU1LCAweDE1LCAweDRhLCAweDUzLCAweDE0LCAweDRhLCAweDUxLCAweDEzLCAweDQ5LCAweDUxLCAweDEyLCAweDQ3LCAweDUwLCAweDExLCAweDQ1LCAweDRlLAorICAgIDB4MTEsIDB4NDUsIDB4NGQsIDB4MTAsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsCisgICAgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwKKyAgICAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LAorICAgIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweGNlLCAweGRmLCAweGUxLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4MzksIDB4N2MsIDB4ODYsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDJlLCAweDc1LCAweDdmLCAweGZmLCAweGZmLCAweGZmLCAweGQ2LCAweGU0LCAweGU2LAorICAgIDB4MGIsIDB4NWMsIDB4NjgsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHg3NCwgMHhhMiwgMHhhOSwgMHhmZiwgMHhmZiwgMHhmZiwgMHg5MCwgMHhiNCwgMHhiOSwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4YzUsIDB4ZDcsIDB4ZGEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NGIsIDB4ODMsIDB4OGIsIDB4YjQsIDB4Y2IsIDB4Y2UsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhlMCwgMHhlOSwgMHhlYiwgMHgyYSwgMHg2YywgMHg3NSwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwKKyAgICAweDdlLCAweGE0LCAweGFhLCAweGZmLCAweGZmLCAweGZmLCAweDgzLCAweGE4LCAweGFkLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsCisgICAgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHhhMywgMHhiYSwgMHhiZCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweDk0LCAweGFmLCAweGIyLCAweDg5LCAweGE2LCAweGFhLCAweGZmLCAweGZmLCAweGZmLCAweGFlLCAweGMyLCAweGM0LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LAorICAgIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsCisgICAgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgxNiwgMHg0MCwgMHg0NiwgMHhlMywgMHhlOCwgMHhlOSwKKyAgICAweGYyLCAweGY0LCAweGY1LCAweDIzLCAweDQ3LCAweDRkLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLAorICAgIDB4MDMsIDB4MjUsIDB4MmEsIDB4M2EsIDB4NTQsIDB4NTgsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDEsIDB4ZDcsIDB4ZDgsIDB4MDYsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsCisgICAgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMiwgMHgxNCwKKyAgICAweDAxLCAweDEwLCAweDEzLCAweDAxLCAweDBlLCAweDExLCAweDAwLCAweDBiLCAweDBkLCAweDZiLCAweDdjLCAweDdmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YTAsIDB4YmYsIDB4YzQsIDB4ODgsIDB4YWUsIDB4YjQsIDB4ODMsIDB4YWEsIDB4YjAsIDB4N2UsIDB4YTcsIDB4YWQsCisgICAgMHg3YSwgMHhhMywgMHhhYSwgMHg3NSwgMHhhMCwgMHhhNiwgMHg3MCwgMHg5YywgMHhhMywgMHg2YywgMHg5OSwgMHhhMCwgMHg2NywgMHg5NSwgMHg5ZCwgMHg2MywgMHg5MiwgMHg5YSwgMHg1ZSwgMHg4ZSwgMHg5NywKKyAgICAweDVhLCAweDhhLCAweDkzLCAweDU2LCAweDg4LCAweDkwLCAweDUxLCAweDg0LCAweDhjLCAweDRkLCAweDgxLCAweDg5LCAweDRiLCAweDdlLCAweDg3LCAweDQ3LCAweDdiLCAweDg0LCAweDQyLCAweDc4LCAweDgwLAorICAgIDB4M2YsIDB4NzUsIDB4N2UsIDB4M2IsIDB4NzIsIDB4N2EsIDB4MzgsIDB4NmYsIDB4NzgsIDB4MzQsIDB4NmMsIDB4NzUsIDB4MzIsIDB4NjksIDB4NzIsIDB4MmYsIDB4NjcsIDB4NzAsIDB4MmQsIDB4NjUsIDB4NmQsCisgICAgMHgyYSwgMHg2MywgMHg2YiwgMHgyNywgMHg2MCwgMHg2OSwgMHgyNiwgMHg1ZSwgMHg2NywgMHgyNCwgMHg1YywgMHg2NSwgMHgyMiwgMHg1YSwgMHg2MywgMHgyMCwgMHg1OCwgMHg2MSwgMHgxZSwgMHg1NiwgMHg1ZiwKKyAgICAweDFkLCAweDU1LCAweDVkLCAweDFhLCAweDUzLCAweDViLCAweDE4LCAweDUxLCAweDVhLCAweDE3LCAweDRmLCAweDU4LCAweDE3LCAweDRlLCAweDU2LCAweDE2LCAweDRjLCAweDU1LCAweDE1LCAweDRhLCAweDUzLAorICAgIDB4MTQsIDB4NGEsIDB4NTEsIDB4MTMsIDB4NDksIDB4NTEsIDB4MTIsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDUsIDB4NGUsIDB4MTEsIDB4NDUsIDB4NGQsIDB4MTAsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksCisgICAgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywKKyAgICAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLAorICAgIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsCisgICAgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4Y2UsIDB4ZGYsIDB4ZTEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzksIDB4N2MsIDB4ODYsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MmUsIDB4NzUsIDB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDYsIDB4ZTQsIDB4ZTYsIDB4MGIsIDB4NWMsIDB4NjgsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHg3NCwgMHhhMiwgMHhhOSwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweDkwLCAweGI0LCAweGI5LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsCisgICAgMHhjNSwgMHhkNywgMHhkYSwgMHhmZiwgMHhmZiwgMHhmZiwgMHgzOCwgMHg3NSwgMHg3ZSwgMHgxMiwgMHg1YiwgMHg2NiwgMHhjYiwgMHhkYiwgMHhkZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhkMiwgMHhlMCwgMHhlMiwKKyAgICAweDFkLCAweDYxLCAweDZiLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDdlLCAweGE0LCAweGFhLCAweGZmLCAweGZmLCAweGZmLCAweDgzLCAweGE4LCAweGFkLAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwKKyAgICAweDA1LCAweDQ2LCAweDRmLCAweDIxLCAweDVhLCAweDYyLCAweGYxLCAweGY1LCAweGY1LCAweGZlLCAweGZlLCAweGZlLCAweDMyLCAweDY2LCAweDZkLCAweDI2LCAweDVjLCAweDY0LCAweGY5LCAweGZiLCAweGZiLAorICAgIDB4ZjcsIDB4ZjksIDB4ZjksIDB4MjksIDB4NWMsIDB4NjMsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsCisgICAgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwKKyAgICAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDE2LCAweDQwLCAweDQ2LCAweGUzLCAweGU4LCAweGU5LCAweGYyLCAweGY0LCAweGY1LCAweDIzLCAweDQ3LCAweDRkLCAweDAzLCAweDJjLCAweDMyLAorICAgIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MTIsIDB4MzIsIDB4MzcsIDB4YjksIDB4YzIsIDB4YzMsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHg4OSwgMHg5NywgMHg5YSwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywKKyAgICAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDEwLCAweDEzLCAweDAxLCAweDBlLCAweDExLCAweDAwLCAweDBhLCAweDBjLAorICAgIDB4NjQsIDB4NzUsIDB4NzgsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmEsIDB4ZmMsIDB4ZmMsCisgICAgMHg5ZCwgMHhiYywgMHhjMSwgMHg4OSwgMHhhZSwgMHhiNCwgMHg4MywgMHhhYSwgMHhiMCwgMHg3ZSwgMHhhNywgMHhhZCwgMHg3YSwgMHhhMywgMHhhYSwgMHg3NSwgMHhhMCwgMHhhNiwgMHg3MCwgMHg5YywgMHhhMywKKyAgICAweDZjLCAweDk5LCAweGEwLCAweDY4LCAweDk2LCAweDlkLCAweDYzLCAweDkyLCAweDlhLCAweDVlLCAweDhlLCAweDk3LCAweDVhLCAweDhiLCAweDkzLCAweDU2LCAweDg4LCAweDkwLCAweDUyLCAweDg0LCAweDhjLAorICAgIDB4NGQsIDB4ODEsIDB4ODksIDB4NGIsIDB4N2UsIDB4ODcsIDB4NDcsIDB4N2IsIDB4ODQsIDB4NDIsIDB4NzgsIDB4ODAsIDB4M2YsIDB4NzUsIDB4N2UsIDB4M2IsIDB4NzIsIDB4N2EsIDB4MzgsIDB4NmYsIDB4NzgsCisgICAgMHgzNSwgMHg2YywgMHg3NiwgMHgzMiwgMHg2OSwgMHg3MiwgMHgzMCwgMHg2OCwgMHg3MCwgMHgyZCwgMHg2NSwgMHg2ZCwgMHgyYSwgMHg2MywgMHg2YiwgMHgyNywgMHg2MCwgMHg2OSwgMHgyNiwgMHg1ZSwgMHg2NywKKyAgICAweDI0LCAweDVjLCAweDY1LCAweDIyLCAweDVhLCAweDYzLCAweDIwLCAweDU4LCAweDYxLCAweDFlLCAweDU2LCAweDVmLCAweDFkLCAweDU1LCAweDVkLCAweDFhLCAweDUzLCAweDViLCAweDE4LCAweDUxLCAweDVhLAorICAgIDB4MTcsIDB4NGYsIDB4NTgsIDB4MTcsIDB4NGUsIDB4NTYsIDB4MTYsIDB4NGMsIDB4NTUsIDB4MTUsIDB4NGEsIDB4NTMsIDB4MTUsIDB4NGEsIDB4NTIsIDB4MTMsIDB4NDksIDB4NTEsIDB4MTIsIDB4NDcsIDB4NTAsCisgICAgMHgxMSwgMHg0NSwgMHg0ZSwgMHgxMSwgMHg0NSwgMHg0ZCwgMHgxMCwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwKKyAgICAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLAorICAgIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksCisgICAgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4Y2UsIDB4ZGYsIDB4ZTEsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHgzOSwgMHg3YywgMHg4NiwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MmUsIDB4NzUsIDB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhkNiwgMHhlNCwgMHhlNiwgMHgwYiwgMHg1YywgMHg2OCwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDc0LCAweGEyLCAweGE5LCAweGZmLCAweGZmLCAweGZmLCAweDkwLCAweGI0LCAweGI5LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHhjNSwgMHhkNywgMHhkYSwgMHhmZiwgMHhmZiwgMHhmZiwgMHg0MywgMHg3ZCwgMHg4NSwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDIzLCAweDY4LCAweDcyLCAweGQ4LCAweGU0LCAweGU2LCAweGZmLCAweGZmLCAweGZmLCAweGMzLCAweGQ1LCAweGQ4LCAweDExLCAweDU5LCAweDY0LCAweDA1LCAweDUxLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWIsIDB4N2UsIDB4YTQsIDB4YWEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ODMsIDB4YTgsIDB4YWQsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywKKyAgICAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDc4LCAweDlhLCAweDlmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4YzIsIDB4ZDEsIDB4ZDQsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDQsIDB4NDIsIDB4NGIsIDB4YjQsIDB4YzYsIDB4YzksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ODksIDB4YTUsIDB4YTksIDB4MDQsIDB4M2UsIDB4NDcsCisgICAgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwKKyAgICAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDE2LCAweDQwLCAweDQ2LAorICAgIDB4ZTMsIDB4ZTgsIDB4ZTksIDB4ZjIsIDB4ZjQsIDB4ZjUsIDB4MjAsIDB4NDUsIDB4NGEsIDB4MzMsIDB4NTUsIDB4NTksIDB4NDcsIDB4NjQsIDB4NjgsIDB4NDYsIDB4NjIsIDB4NjYsIDB4NTUsIDB4NmUsIDB4NzIsCisgICAgMHg4NCwgMHg5NiwgMHg5OCwgMHhkYiwgMHhlMCwgMHhlMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhjZCwgMHhkNCwgMHhkNSwgMHgxOCwgMHgzNCwgMHgzOSwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywKKyAgICAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LAorICAgIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDEsIDB4MTAsIDB4MTMsIDB4MDEsIDB4MGUsIDB4MTEsIDB4MDAsIDB4MGEsIDB4MGMsIDB4NjEsIDB4NzMsIDB4NzYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmOSwgMHhmYiwgMHhmYiwgMHg5YywgMHhiYywgMHhjMSwgMHg4OSwgMHhhZSwgMHhiNCwgMHg4NCwgMHhhYiwgMHhiMSwKKyAgICAweDdmLCAweGE3LCAweGFlLCAweDdiLCAweGE0LCAweGFhLCAweDc2LCAweGEwLCAweGE3LCAweDcxLCAweDlkLCAweGEzLCAweDZkLCAweDk5LCAweGEwLCAweDY4LCAweDk2LCAweDlkLCAweDYzLCAweDkyLCAweDlhLAorICAgIDB4NWYsIDB4OGYsIDB4OTcsIDB4NWEsIDB4OGIsIDB4OTMsIDB4NTYsIDB4ODgsIDB4OTAsIDB4NTIsIDB4ODQsIDB4OGMsIDB4NGQsIDB4ODEsIDB4ODksIDB4NGIsIDB4N2UsIDB4ODcsIDB4NDcsIDB4N2IsIDB4ODQsCisgICAgMHg0MiwgMHg3OCwgMHg4MCwgMHgzZiwgMHg3NSwgMHg3ZSwgMHgzYywgMHg3MywgMHg3YiwgMHgzOCwgMHg2ZiwgMHg3OCwgMHgzNSwgMHg2YywgMHg3NiwgMHgzMywgMHg2YSwgMHg3MywgMHgzMCwgMHg2OCwgMHg3MCwKKyAgICAweDJkLCAweDY1LCAweDZkLCAweDJhLCAweDYzLCAweDZiLCAweDI3LCAweDYwLCAweDY5LCAweDI1LCAweDVkLCAweDY2LCAweDI0LCAweDVjLCAweDY1LCAweDIyLCAweDVhLCAweDYzLCAweDIwLCAweDU4LCAweDYxLAorICAgIDB4MWUsIDB4NTYsIDB4NWYsIDB4MWQsIDB4NTUsIDB4NWQsIDB4MWEsIDB4NTMsIDB4NWIsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NGYsIDB4NTgsIDB4MTcsIDB4NGUsIDB4NTYsIDB4MTYsIDB4NGMsIDB4NTUsCisgICAgMHgxNSwgMHg0YSwgMHg1MywgMHgxNSwgMHg0YSwgMHg1MiwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMiwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NSwgMHg0ZSwgMHgxMSwgMHg0NSwgMHg0ZCwgMHgxMCwgMHg0MywgMHg0YiwKKyAgICAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LAorICAgIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsCisgICAgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwKKyAgICAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHhjZSwgMHhkZiwgMHhlMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHgzOSwgMHg3YywgMHg4NiwgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgyZSwgMHg3NSwgMHg3ZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhkNiwgMHhlNCwgMHhlNiwgMHgwYiwgMHg1YywgMHg2OCwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDc0LCAweGEyLCAweGE5LAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4OTAsIDB4YjQsIDB4YjksIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDYwLCAweGM1LCAweGQ3LCAweGRhLCAweGZmLCAweGZmLCAweGZmLCAweDQyLCAweDdjLCAweDg1LCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDJmLCAweDZmLCAweDc4LAorICAgIDB4ZTQsIDB4ZWMsIDB4ZWQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YjMsIDB4Y2EsIDB4Y2QsIDB4MGIsIDB4NTUsIDB4NWYsIDB4MDUsIDB4NTAsIDB4NWIsIDB4N2UsIDB4YTQsIDB4YWEsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHg4MywgMHhhOCwgMHhhZCwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTAsIDB4MGMsIDB4NGIsIDB4NTQsIDB4ZDYsIDB4ZTAsIDB4ZTIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NjEsIDB4ODgsIDB4OGYsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsCisgICAgMHg0ZiwgMHg3YSwgMHg4MCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlMSwgMHhlOCwgMHhlOSwgMHgxNCwgMHg0YSwgMHg1MywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwKKyAgICAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLAorICAgIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MTYsIDB4NDAsIDB4NDYsIDB4ZTMsIDB4ZTgsIDB4ZTksIDB4ZjIsIDB4ZjQsIDB4ZjUsIDB4MTksIDB4M2YsIDB4NDUsCisgICAgMHg0ZSwgMHg2YiwgMHg2ZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZSwgMHhmZSwgMHhmZSwgMHg5ZSwgMHhhYiwgMHhhZCwKKyAgICAweDE3LCAweDM1LCAweDM5LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLAorICAgIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDEsIDB4MTAsIDB4MTMsIDB4MDEsIDB4MGUsIDB4MTEsCisgICAgMHgwMCwgMHgwYSwgMHgwYywgMHg2MSwgMHg3MywgMHg3NiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZiLCAweGZjLCAweGZjLCAweDllLCAweGJkLCAweGMyLCAweDg5LCAweGFlLCAweGI0LCAweDg0LCAweGFiLCAweGIxLCAweDdmLCAweGE3LCAweGFlLCAweDdiLCAweGE0LCAweGFhLCAweDc2LCAweGEwLCAweGE3LAorICAgIDB4NzEsIDB4OWQsIDB4YTMsIDB4NmQsIDB4OTksIDB4YTAsIDB4NjgsIDB4OTYsIDB4OWQsIDB4NjQsIDB4OTMsIDB4OWEsIDB4NWYsIDB4OGYsIDB4OTcsIDB4NWEsIDB4OGIsIDB4OTMsIDB4NTYsIDB4ODgsIDB4OTAsCisgICAgMHg1MiwgMHg4NCwgMHg4YywgMHg0ZCwgMHg4MSwgMHg4OSwgMHg0YiwgMHg3ZSwgMHg4NywgMHg0NywgMHg3YiwgMHg4NCwgMHg0MiwgMHg3OCwgMHg4MCwgMHgzZiwgMHg3NSwgMHg3ZSwgMHgzYywgMHg3MywgMHg3YiwKKyAgICAweDM4LCAweDZmLCAweDc4LCAweDM1LCAweDZjLCAweDc2LCAweDMzLCAweDZhLCAweDczLCAweDMwLCAweDY4LCAweDcwLCAweDJkLCAweDY1LCAweDZkLCAweDJhLCAweDYzLCAweDZiLCAweDI3LCAweDYwLCAweDY5LAorICAgIDB4MjUsIDB4NWQsIDB4NjYsIDB4MjQsIDB4NWMsIDB4NjUsIDB4MjIsIDB4NWEsIDB4NjMsIDB4MjAsIDB4NTgsIDB4NjEsIDB4MWUsIDB4NTYsIDB4NWYsIDB4MWQsIDB4NTUsIDB4NWQsIDB4MWEsIDB4NTMsIDB4NWIsCisgICAgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg0ZiwgMHg1OCwgMHgxNywgMHg0ZSwgMHg1NiwgMHgxNiwgMHg0YywgMHg1NSwgMHgxNSwgMHg0YSwgMHg1MywgMHgxNSwgMHg0YSwgMHg1MiwgMHgxMywgMHg0OSwgMHg1MSwKKyAgICAweDEyLCAweDQ3LCAweDUwLCAweDExLCAweDQ1LCAweDRlLCAweDExLCAweDQ1LCAweDRkLCAweDEwLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LAorICAgIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsCisgICAgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwKKyAgICAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLAorICAgIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweGNlLCAweGRmLCAweGUxLCAweGZmLCAweGZmLCAweGZmLCAweDM5LCAweDdjLCAweDg2LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgyZSwgMHg3NSwgMHg3ZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGQ2LCAweGU0LCAweGU2LCAweDBiLCAweDVjLCAweDY4LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4NzQsIDB4YTIsIDB4YTksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4OTAsIDB4YjQsIDB4YjksIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweGM1LCAweGQ3LCAweGRhLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4NDIsIDB4N2MsIDB4ODUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4M2EsIDB4NzcsIDB4N2YsIDB4ZWMsIDB4ZjIsIDB4ZjMsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHg5ZiwgMHhiYywgMHhjMCwgMHgwNSwgMHg1MCwgMHg1YiwgMHg3YiwgMHhhMiwgMHhhOCwgMHhmZiwgMHhmZiwgMHhmZiwgMHg4MywgMHhhOCwgMHhhZCwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LAorICAgIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4NGYsIDB4N2MsIDB4ODMsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhlMiwgMHhlOSwgMHhlYSwgMHgxNCwgMHg0ZSwgMHg1NywgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwYSwgMHg0NSwgMHg0ZSwgMHhkMiwgMHhkZCwgMHhkZSwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweDYyLCAweDg3LCAweDhjLCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLAorICAgIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsCisgICAgMHgxNiwgMHg0MCwgMHg0NiwgMHhlMywgMHhlOCwgMHhlOSwgMHhmMiwgMHhmNCwgMHhmNSwgMHgyMiwgMHg0NywgMHg0YywgMHgwMywgMHgyYywgMHgzMiwgMHg2YSwgMHg4MSwgMHg4NCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGE0LCAweGIxLCAweGIzLCAweDI3LCAweDQ0LCAweDQ4LCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LAorICAgIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsCisgICAgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMSwgMHgxMCwgMHgxMywgMHgwMSwgMHgwZSwgMHgxMSwgMHgwMCwgMHgwYiwgMHgwYywgMHg2NiwgMHg3NywgMHg3YSwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGEyLCAweGMwLCAweGM0LCAweDg5LCAweGFlLCAweGI0LAorICAgIDB4ODQsIDB4YWIsIDB4YjEsIDB4N2YsIDB4YTcsIDB4YWUsIDB4N2IsIDB4YTQsIDB4YWEsIDB4NzYsIDB4YTAsIDB4YTcsIDB4NzEsIDB4OWQsIDB4YTMsIDB4NmQsIDB4OTksIDB4YTAsIDB4NjgsIDB4OTYsIDB4OWQsCisgICAgMHg2MywgMHg5MiwgMHg5YSwgMHg1ZiwgMHg4ZiwgMHg5NywgMHg1YSwgMHg4YiwgMHg5MywgMHg1NiwgMHg4OCwgMHg5MCwgMHg1MiwgMHg4NCwgMHg4YywgMHg0ZCwgMHg4MSwgMHg4OSwgMHg0YiwgMHg3ZSwgMHg4NywKKyAgICAweDQ3LCAweDdiLCAweDg0LCAweDQyLCAweDc4LCAweDgwLCAweDNmLCAweDc1LCAweDdlLCAweDNjLCAweDczLCAweDdiLCAweDM4LCAweDZmLCAweDc4LCAweDM1LCAweDZjLCAweDc2LCAweDMzLCAweDZhLCAweDczLAorICAgIDB4MzAsIDB4NjgsIDB4NzAsIDB4MmQsIDB4NjUsIDB4NmQsIDB4MmEsIDB4NjMsIDB4NmIsIDB4MjcsIDB4NjAsIDB4NjksIDB4MjUsIDB4NWQsIDB4NjYsIDB4MjQsIDB4NWMsIDB4NjUsIDB4MjIsIDB4NWEsIDB4NjMsCisgICAgMHgyMCwgMHg1OCwgMHg2MSwgMHgxZSwgMHg1NiwgMHg1ZiwgMHgxZCwgMHg1NSwgMHg1ZCwgMHgxYSwgMHg1MywgMHg1YiwgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg0ZiwgMHg1OCwgMHgxNywgMHg0ZSwgMHg1NiwKKyAgICAweDE2LCAweDRjLCAweDU1LCAweDE1LCAweDRhLCAweDUzLCAweDE1LCAweDRhLCAweDUyLCAweDEzLCAweDQ5LCAweDUxLCAweDEyLCAweDQ3LCAweDUwLCAweDExLCAweDQ1LCAweDRlLCAweDExLCAweDQ1LCAweDRkLAorICAgIDB4MTAsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsCisgICAgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwKKyAgICAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LAorICAgIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweGNlLCAweGRmLCAweGUxLCAweGZmLCAweGZmLCAweGZmLCAweDM5LCAweDdjLCAweDg2LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDJmLCAweDc1LCAweDdmLCAweGZmLCAweGZmLCAweGZmLCAweGQ1LCAweGUzLCAweGU1LCAweDBhLCAweDVjLCAweDY3LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHg3MiwgMHhhMSwgMHhhNywgMHhmZiwgMHhmZiwgMHhmZiwgMHg5MSwgMHhiNSwgMHhiYSwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4YzUsIDB4ZDcsIDB4ZGEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NDIsIDB4N2MsIDB4ODUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHg0NywgMHg3ZiwgMHg4NywgMHhmNSwgMHhmOCwgMHhmOSwgMHhmZiwgMHhmZiwgMHhmZiwgMHg3YiwgMHhhMiwgMHhhOCwgMHg3OCwgMHhhMCwgMHhhNiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweDgzLCAweGE4LCAweGFkLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHhhZiwgMHhjNCwgMHhjNiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg4OCwgMHhhNiwgMHhhYiwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywKKyAgICAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDZlLCAweDkxLCAweDk2LCAweGZmLCAweGZmLCAweGZmLCAweGM1LCAweGQyLCAweGQ0LCAweDA2LCAweDQwLCAweDQ3LCAweDA0LCAweDNkLCAweDQ1LAorICAgIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsCisgICAgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgxNiwgMHg0MCwgMHg0NiwgMHhlMywgMHhlOCwgMHhlOSwgMHhmMiwgMHhmNCwgMHhmNSwKKyAgICAweDIzLCAweDQ3LCAweDRkLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDhlLCAweDlmLCAweGEyLCAweGZmLCAweGZmLCAweGZmLCAweGRiLCAweGUxLCAweGUxLCAweDI2LCAweDQzLCAweDQ3LAorICAgIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsCisgICAgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMSwgMHgxMCwgMHgxMywKKyAgICAweDAxLCAweDBlLCAweDExLCAweDAwLCAweDBiLCAweDBkLCAweDZlLCAweDdmLCAweDgyLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YTksIDB4YzUsIDB4YzksIDB4ODksIDB4YWUsIDB4YjQsIDB4ODQsIDB4YWIsIDB4YjEsIDB4N2YsIDB4YTcsIDB4YWUsIDB4N2IsIDB4YTQsIDB4YWEsCisgICAgMHg3NiwgMHhhMCwgMHhhNywgMHg3MSwgMHg5ZCwgMHhhMywgMHg2ZCwgMHg5OSwgMHhhMCwgMHg2OCwgMHg5NiwgMHg5ZCwgMHg2MywgMHg5MiwgMHg5YSwgMHg1ZSwgMHg4ZSwgMHg5NywgMHg1YSwgMHg4YiwgMHg5MywKKyAgICAweDU2LCAweDg4LCAweDkwLCAweDUyLCAweDg0LCAweDhjLCAweDRkLCAweDgxLCAweDg5LCAweDRiLCAweDdlLCAweDg3LCAweDQ3LCAweDdiLCAweDg0LCAweDQyLCAweDc4LCAweDgwLCAweDNmLCAweDc1LCAweDdlLAorICAgIDB4M2IsIDB4NzIsIDB4N2EsIDB4MzgsIDB4NmYsIDB4NzgsIDB4MzUsIDB4NmMsIDB4NzYsIDB4MzMsIDB4NmEsIDB4NzMsIDB4MzAsIDB4NjgsIDB4NzAsIDB4MmQsIDB4NjUsIDB4NmQsIDB4MmEsIDB4NjMsIDB4NmIsCisgICAgMHgyNywgMHg2MCwgMHg2OSwgMHgyNSwgMHg1ZCwgMHg2NiwgMHgyNCwgMHg1YywgMHg2NSwgMHgyMiwgMHg1YSwgMHg2MywgMHgyMCwgMHg1OCwgMHg2MSwgMHgxZSwgMHg1NiwgMHg1ZiwgMHgxZCwgMHg1NSwgMHg1ZCwKKyAgICAweDFhLCAweDUzLCAweDViLCAweDE4LCAweDUxLCAweDVhLCAweDE3LCAweDRmLCAweDU4LCAweDE3LCAweDRlLCAweDU2LCAweDE2LCAweDRjLCAweDU1LCAweDE1LCAweDRhLCAweDUzLCAweDE1LCAweDRhLCAweDUyLAorICAgIDB4MTMsIDB4NDksIDB4NTEsIDB4MTIsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDUsIDB4NGUsIDB4MTEsIDB4NDUsIDB4NGQsIDB4MTAsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsCisgICAgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwKKyAgICAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLAorICAgIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsCisgICAgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4Y2UsIDB4ZGYsIDB4ZTEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzksIDB4N2MsIDB4ODYsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MjksIDB4NzEsIDB4N2MsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTAsIDB4ZWEsIDB4ZWMsIDB4MGEsIDB4NWMsIDB4NjcsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHg3YiwgMHhhNywgMHhhZCwgMHhmZiwgMHhmZiwgMHhmZiwgMHg4ZCwgMHhiMiwgMHhiNywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4YzUsIDB4ZDcsIDB4ZGEsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHg0MiwgMHg3YywgMHg4NSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDU0LCAweDg4LCAweDkwLCAweGZhLCAweGZjLCAweGZjLCAweGZmLCAweGZmLCAweGZmLCAweGRiLCAweGU2LCAweGU3LCAweGZmLCAweGZmLCAweGZmLCAweDgzLCAweGE4LCAweGFkLCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgyYSwgMHg2MiwgMHg2YSwgMHhmNiwgMHhmOCwgMHhmOSwKKyAgICAweGY5LCAweGZiLCAweGZiLCAweDJjLCAweDYxLCAweDY5LCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDFiLCAweDUxLCAweDU5LAorICAgIDB4ZTksIDB4ZWUsIDB4ZWYsIDB4ZmQsIDB4ZmQsIDB4ZmUsIDB4M2UsIDB4NmIsIDB4NzEsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsCisgICAgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwKKyAgICAweDAzLCAweDMyLCAweDM4LCAweDE2LCAweDQwLCAweDQ2LCAweGUzLCAweGU4LCAweGU5LCAweGYyLCAweGY0LCAweGY1LCAweDIzLCAweDQ3LCAweDRkLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLAorICAgIDB4MDcsIDB4MmMsIDB4MzIsIDB4YjEsIDB4YmMsIDB4YmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDUsIDB4ZGIsIDB4ZGMsIDB4MWQsIDB4M2EsIDB4M2YsIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsCisgICAgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwKKyAgICAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDEwLCAweDEzLCAweDAxLCAweDBlLCAweDEwLCAweDAwLCAweDBiLCAweDBkLCAweDdkLCAweDhjLCAweDhmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YjgsIDB4Y2YsIDB4ZDMsCisgICAgMHg4OCwgMHhhZSwgMHhiNCwgMHg4MywgMHhhYSwgMHhiMCwgMHg3ZSwgMHhhNywgMHhhZCwgMHg3YSwgMHhhMywgMHhhYSwgMHg3NSwgMHhhMCwgMHhhNiwgMHg3MCwgMHg5YywgMHhhMywgMHg2YywgMHg5OSwgMHhhMCwKKyAgICAweDY3LCAweDk1LCAweDlkLCAweDYzLCAweDkyLCAweDlhLCAweDVlLCAweDhlLCAweDk3LCAweDVhLCAweDhiLCAweDkzLCAweDU2LCAweDg4LCAweDkwLCAweDUxLCAweDg0LCAweDhjLCAweDRkLCAweDgxLCAweDg5LAorICAgIDB4NGIsIDB4N2UsIDB4ODcsIDB4NDcsIDB4N2IsIDB4ODQsIDB4NDIsIDB4NzgsIDB4ODAsIDB4M2YsIDB4NzUsIDB4N2UsIDB4M2IsIDB4NzIsIDB4N2EsIDB4MzgsIDB4NmYsIDB4NzgsIDB4MzUsIDB4NmMsIDB4NzYsCisgICAgMHgzMiwgMHg2OSwgMHg3MiwgMHgzMCwgMHg2OCwgMHg3MCwgMHgyZCwgMHg2NSwgMHg2ZCwgMHgyYSwgMHg2MywgMHg2YiwgMHgyNywgMHg2MCwgMHg2OSwgMHgyNiwgMHg1ZSwgMHg2NywgMHgyNCwgMHg1YywgMHg2NSwKKyAgICAweDIyLCAweDVhLCAweDYzLCAweDIwLCAweDU4LCAweDYxLCAweDFlLCAweDU2LCAweDVmLCAweDFkLCAweDU1LCAweDVkLCAweDFhLCAweDUzLCAweDViLCAweDE4LCAweDUxLCAweDVhLCAweDE3LCAweDRmLCAweDU4LAorICAgIDB4MTcsIDB4NGUsIDB4NTYsIDB4MTYsIDB4NGMsIDB4NTUsIDB4MTUsIDB4NGEsIDB4NTMsIDB4MTQsIDB4NGEsIDB4NTEsIDB4MTMsIDB4NDksIDB4NTEsIDB4MTIsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDUsIDB4NGUsCisgICAgMHgxMSwgMHg0NSwgMHg0ZCwgMHgxMCwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwKKyAgICAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLAorICAgIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsCisgICAgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4Y2UsIDB4ZGYsIDB4ZTEsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHgzOSwgMHg3YywgMHg4NiwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MTIsIDB4NjIsIDB4NmQsIDB4ZTEsIDB4ZWIsIDB4ZWMsIDB4ZmMsIDB4ZmQsIDB4ZmQsCisgICAgMHg0NywgMHg4NSwgMHg4ZCwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA3LCAweDU5LCAweDY1LCAweGM3LCAweGRhLCAweGRjLCAweGZmLCAweGZmLCAweGZmLCAweDVmLCAweDk0LCAweDliLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHhjNSwgMHhkNywgMHhkYSwgMHhmZiwgMHhmZiwgMHhmZiwgMHg0MiwgMHg3YywgMHg4NSwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDYzLCAweDkzLCAweDk5LCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ODMsIDB4YTgsIDB4YWQsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwKKyAgICAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDgzLCAweGE0LCAweGE5LCAweGZmLCAweGZmLCAweGZmLCAweGIwLCAweGM0LCAweGM3LCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLAorICAgIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4OTIsIDB4YWIsIDB4YWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YTEsIDB4YjcsIDB4YmEsCisgICAgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwKKyAgICAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDE2LCAweDQwLCAweDQ2LCAweGUzLCAweGU4LCAweGU5LAorICAgIDB4ZjIsIDB4ZjQsIDB4ZjUsIDB4MjMsIDB4NDcsIDB4NGQsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MTUsIDB4MzcsIDB4M2QsIDB4Y2YsIDB4ZDUsIDB4ZDYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhjMSwgMHhjOSwgMHhjYSwgMHgwZCwgMHgyYywgMHgzMCwgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwKKyAgICAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LAorICAgIDB4MDEsIDB4MTAsIDB4MTMsIDB4MDEsIDB4MGUsIDB4MTAsIDB4MDEsIDB4MGMsIDB4MGUsIDB4OTAsIDB4OWQsIDB4OWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhjYywgMHhkZCwgMHhkZiwgMHg4OCwgMHhhZSwgMHhiNCwgMHg4MywgMHhhYSwgMHhiMCwgMHg3ZSwgMHhhNywgMHhhZCwKKyAgICAweDdhLCAweGEzLCAweGFhLCAweDc1LCAweGEwLCAweGE2LCAweDcwLCAweDljLCAweGEzLCAweDZjLCAweDk5LCAweGEwLCAweDY3LCAweDk1LCAweDlkLCAweDYzLCAweDkyLCAweDlhLCAweDVlLCAweDhlLCAweDk3LAorICAgIDB4NWEsIDB4OGEsIDB4OTMsIDB4NTYsIDB4ODgsIDB4OTAsIDB4NTEsIDB4ODQsIDB4OGMsIDB4NGQsIDB4ODEsIDB4ODksIDB4NGIsIDB4N2UsIDB4ODcsIDB4NDcsIDB4N2IsIDB4ODQsIDB4NDIsIDB4NzgsIDB4ODAsCisgICAgMHgzZiwgMHg3NSwgMHg3ZSwgMHgzYiwgMHg3MiwgMHg3YSwgMHgzOCwgMHg2ZiwgMHg3OCwgMHgzNCwgMHg2YywgMHg3NSwgMHgzMiwgMHg2OSwgMHg3MiwgMHgyZiwgMHg2NywgMHg3MCwgMHgyZCwgMHg2NSwgMHg2ZCwKKyAgICAweDJhLCAweDYzLCAweDZiLCAweDI2LCAweDYwLCAweDY5LCAweDI2LCAweDVlLCAweDY3LCAweDI0LCAweDVjLCAweDY1LCAweDIyLCAweDVhLCAweDYzLCAweDIwLCAweDU4LCAweDYxLCAweDFlLCAweDU2LCAweDVmLAorICAgIDB4MWMsIDB4NTQsIDB4NWQsIDB4MWEsIDB4NTMsIDB4NWIsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NGYsIDB4NTgsIDB4MTcsIDB4NGUsIDB4NTYsIDB4MTYsIDB4NGMsIDB4NTUsIDB4MTUsIDB4NGEsIDB4NTMsCisgICAgMHgxNCwgMHg0YSwgMHg1MSwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMiwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NSwgMHg0ZSwgMHgxMSwgMHg0NSwgMHg0ZCwgMHgxMCwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwKKyAgICAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLAorICAgIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsCisgICAgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwKKyAgICAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHhjZSwgMHhkZiwgMHhlMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHgyZSwgMHg3NSwgMHg3ZiwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHg4MiwgMHhhYywgMHhiMiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhkOSwgMHhlNiwgMHhlNywgMHgzNSwgMHg3OCwgMHg4MiwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDBmLCAweDVlLCAweDY5LCAweDkzLCAweGI2LCAweGJjLCAweGZmLCAweGZmLCAweGZmLCAweGRmLCAweGU5LCAweGViLAorICAgIDB4MTYsIDB4NjIsIDB4NmQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwKKyAgICAweGM1LCAweGQ3LCAweGRhLCAweGZmLCAweGZmLCAweGZmLCAweDQyLCAweDdjLCAweDg1LCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4NzQsIDB4OWUsIDB4YTQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ODMsIDB4YTgsIDB4YWQsCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDEwLCAweDRmLCAweDU5LCAweGRmLCAweGU3LCAweGU4LAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NGUsIDB4N2IsIDB4ODEsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsCisgICAgMHgwNCwgMHg0MCwgMHg0OSwgMHgzMSwgMHg2MiwgMHg2OSwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmMSwgMHhmNCwgMHhmNSwgMHgyMiwgMHg1NCwgMHg1YiwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywKKyAgICAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLAorICAgIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MTYsIDB4NDAsIDB4NDYsIDB4ZTMsIDB4ZTgsIDB4ZTksIDB4ZjIsIDB4ZjQsIDB4ZjUsIDB4MjMsIDB4NDcsIDB4NGQsIDB4MDMsIDB4MmMsIDB4MzIsCisgICAgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgyYywgMHg0YSwgMHg0ZSwgMHhlNiwgMHhlYSwgMHhlYSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhOCwgMHhiMywgMHhiNCwKKyAgICAweDA0LCAweDIzLCAweDI4LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLAorICAgIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDEsIDB4MTAsIDB4MTMsIDB4MDEsIDB4MGUsIDB4MTAsIDB4MDEsIDB4MGQsIDB4MGYsCisgICAgMHhhNiwgMHhiMSwgMHhiMiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGUxLCAweGViLCAweGVjLCAweDg3LCAweGFkLCAweGIzLCAweDgyLCAweGFhLCAweGIwLCAweDdkLCAweGE2LCAweGFkLCAweDc5LCAweGEyLCAweGE5LCAweDc0LCAweDlmLCAweGE2LCAweDcwLCAweDliLCAweGEyLAorICAgIDB4NmIsIDB4OTgsIDB4OWYsIDB4NjYsIDB4OTQsIDB4OWMsIDB4NjIsIDB4OTIsIDB4OTksIDB4NWQsIDB4OGUsIDB4OTYsIDB4NWEsIDB4OGEsIDB4OTMsIDB4NTUsIDB4ODcsIDB4OGYsIDB4NTEsIDB4ODQsIDB4OGMsCisgICAgMHg0ZCwgMHg4MSwgMHg4OSwgMHg0YSwgMHg3ZSwgMHg4NiwgMHg0NiwgMHg3YSwgMHg4MywgMHg0MiwgMHg3OCwgMHg4MCwgMHgzZSwgMHg3NCwgMHg3ZCwgMHgzYiwgMHg3MiwgMHg3YSwgMHgzNywgMHg2ZiwgMHg3NywKKyAgICAweDM0LCAweDZjLCAweDc1LCAweDMyLCAweDY5LCAweDcyLCAweDJmLCAweDY3LCAweDcwLCAweDJjLCAweDY0LCAweDZkLCAweDJhLCAweDYzLCAweDZiLCAweDI2LCAweDYwLCAweDY5LCAweDI2LCAweDVlLCAweDY3LAorICAgIDB4MjQsIDB4NWMsIDB4NjUsIDB4MjIsIDB4NWEsIDB4NjMsIDB4MjAsIDB4NTgsIDB4NjEsIDB4MWUsIDB4NTYsIDB4NWYsIDB4MWMsIDB4NTQsIDB4NWQsIDB4MWEsIDB4NTMsIDB4NWIsIDB4MTgsIDB4NTEsIDB4NWEsCisgICAgMHgxNywgMHg0ZiwgMHg1OCwgMHgxNywgMHg0ZSwgMHg1NiwgMHgxNiwgMHg0YywgMHg1NSwgMHgxNSwgMHg0YSwgMHg1MywgMHgxNCwgMHg0YSwgMHg1MSwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMiwgMHg0NywgMHg1MCwKKyAgICAweDExLCAweDQ1LCAweDRlLCAweDExLCAweDQ1LCAweDRkLCAweDEwLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LAorICAgIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsCisgICAgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwKKyAgICAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHhjZCwgMHhkZSwgMHhlMSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweDk3LCAweGJiLCAweGMwLCAweDdiLCAweGE4LCAweGFmLCAweDdkLCAweGE5LCAweGIwLCAweDdkLCAweGE5LCAweGIwLCAweDdlLCAweGFhLCAweGIwLCAweDc3LCAweGE2LCAweGFjLAorICAgIDB4MWEsIDB4NjgsIDB4NzMsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgxMSwgMHg2MSwgMHg2ZCwKKyAgICAweGMxLCAweGQ1LCAweGQ4LCAweGZmLCAweGZmLCAweGZmLCAweGY0LCAweGY4LCAweGY4LCAweGE3LCAweGM0LCAweGM5LCAweDgwLCAweGFhLCAweGIwLCAweDdiLCAweGE3LCAweGFkLCAweDkyLCAweGI2LCAweGJiLAorICAgIDB4ZDQsIDB4ZTIsIDB4ZTQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZjgsIDB4ZmEsIDB4ZmIsIDB4NGIsIDB4ODYsIDB4OGUsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweGM1LCAweGQ3LCAweGRhLCAweGZmLCAweGZmLCAweGZmLCAweDQyLCAweDdjLCAweDg1LAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YiwgMHg4NSwgMHhhYSwgMHhhZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg4NSwgMHhhOSwgMHhhZSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLAorICAgIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4NWEsIDB4ODYsIDB4OGMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDQsIDB4ZGYsIDB4ZTEsIDB4MGMsIDB4NGEsIDB4NTMsIDB4MDUsIDB4NDQsIDB4NGQsCisgICAgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHhiNCwgMHhjNSwgMHhjOCwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweDdiLCAweDk5LCAweDlkLCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLAorICAgIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MTYsIDB4NDAsIDB4NDYsCisgICAgMHhlMywgMHhlOCwgMHhlOSwgMHhmMiwgMHhmNCwgMHhmNSwgMHgyMywgMHg0NywgMHg0ZCwgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwKKyAgICAweDAzLCAweDI3LCAweDJjLCAweDQ1LCAweDVlLCAweDYyLCAweGY4LCAweGY5LCAweGY5LCAweGZmLCAweGZmLCAweGZmLCAweDhkLCAweDliLCAweDlkLCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLAorICAgIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsCisgICAgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMSwgMHgxMCwgMHgxMywgMHgwMSwgMHgwZCwgMHgxMCwgMHgwMywgMHgxMiwgMHgxNSwgMHhiOCwgMHhiZiwgMHhjMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGY0LCAweGY4LCAweGY4LCAweDkzLCAweGI1LCAweGJhLCAweDgxLCAweGE5LCAweGFmLAorICAgIDB4N2QsIDB4YTUsIDB4YWMsIDB4NzgsIDB4YTIsIDB4YTksIDB4NzMsIDB4OWUsIDB4YTUsIDB4NzAsIDB4OWIsIDB4YTIsIDB4NmIsIDB4OTgsIDB4OWYsIDB4NjYsIDB4OTQsIDB4OWMsIDB4NjEsIDB4OTEsIDB4OTgsCisgICAgMHg1ZCwgMHg4ZSwgMHg5NiwgMHg1OSwgMHg4YSwgMHg5MiwgMHg1NSwgMHg4NywgMHg4ZiwgMHg1MCwgMHg4MywgMHg4YiwgMHg0ZCwgMHg4MSwgMHg4OSwgMHg0YSwgMHg3ZSwgMHg4NiwgMHg0NiwgMHg3YSwgMHg4MywKKyAgICAweDQyLCAweDc4LCAweDgwLCAweDNlLCAweDc0LCAweDdkLCAweDNhLCAweDcyLCAweDdhLCAweDM3LCAweDZmLCAweDc3LCAweDM0LCAweDZjLCAweDc1LCAweDMyLCAweDY5LCAweDcyLCAweDJmLCAweDY3LCAweDcwLAorICAgIDB4MmMsIDB4NjQsIDB4NmQsIDB4MmEsIDB4NjMsIDB4NmIsIDB4MjcsIDB4NjAsIDB4NjksIDB4MjUsIDB4NWQsIDB4NjYsIDB4MjMsIDB4NWIsIDB4NjQsIDB4MjEsIDB4NWEsIDB4NjIsIDB4MjAsIDB4NTgsIDB4NjEsCisgICAgMHgxZSwgMHg1NiwgMHg1ZiwgMHgxYywgMHg1NCwgMHg1ZCwgMHgxOSwgMHg1MiwgMHg1YSwgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg0ZiwgMHg1OCwgMHgxNywgMHg0ZSwgMHg1NiwgMHgxNiwgMHg0YywgMHg1NSwKKyAgICAweDE1LCAweDRhLCAweDUzLCAweDE0LCAweDRhLCAweDUxLCAweDEzLCAweDQ5LCAweDUxLCAweDEyLCAweDQ3LCAweDUwLCAweDExLCAweDQ1LCAweDRlLCAweDExLCAweDQ1LCAweDRkLCAweDEwLCAweDQzLCAweDRiLAorICAgIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsCisgICAgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwKKyAgICAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LAorICAgIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweGQ4LCAweGU1LCAweGU3LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzMsIDB4NzksIDB4ODIsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDE4LCAweDY1LCAweDcwLCAweDllLCAweGJmLCAweGMzLCAweGY5LCAweGZiLCAweGZiLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4Y2YsIDB4ZGYsIDB4ZTEsIDB4NDksIDB4ODUsIDB4OGUsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTQsIDB4NjAsIDB4Y2YsIDB4ZGUsIDB4ZTAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NDQsIDB4N2UsIDB4ODYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHhhNiwgMHhjMCwgMHhjNCwKKyAgICAweDhlLCAweGFmLCAweGI0LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDgsIDB4NGEsIDB4NTMsIDB4YzUsIDB4ZDQsIDB4ZDcsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHg3NiwgMHg5OSwgMHg5ZSwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwKKyAgICAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDRmLCAweDc4LCAweDdlLCAweGZmLCAweGZmLCAweGZmLCAweGU1LCAweGViLCAweGVjLCAweDE1LCAweDQ5LCAweDUwLAorICAgIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsCisgICAgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgxNywgMHg0MSwgMHg0NywgMHhlZiwgMHhmMiwgMHhmMiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgyNSwgMHg0OSwgMHg0ZSwKKyAgICAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDY5LCAweDdjLCAweDdmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4OGUsIDB4OTAsIDB4MTAsIDB4MmEsIDB4MmYsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsCisgICAgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMSwgMHgxMCwgMHgxMywgMHgwMCwgMHgwZCwgMHgwZiwKKyAgICAweDBhLCAweDFjLCAweDFmLCAweGNjLCAweGQxLCAweGQyLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWEsIDB4YzUsIDB4YzksIDB4ODEsIDB4YTksIDB4YWYsIDB4N2QsIDB4YTUsIDB4YWMsIDB4NzgsIDB4YTIsIDB4YTksIDB4NzMsIDB4OWUsIDB4YTUsCisgICAgMHg2ZiwgMHg5YiwgMHhhMSwgMHg2YSwgMHg5NywgMHg5ZSwgMHg2NiwgMHg5NCwgMHg5YywgMHg2MSwgMHg5MSwgMHg5OCwgMHg1YywgMHg4ZCwgMHg5NSwgMHg1OCwgMHg4OSwgMHg5MiwgMHg1NCwgMHg4NiwgMHg4ZSwKKyAgICAweDUwLCAweDgzLCAweDhiLCAweDRjLCAweDgwLCAweDg4LCAweDQ5LCAweDdkLCAweDg2LCAweDQ0LCAweDc5LCAweDgyLCAweDQxLCAweDc3LCAweDdmLCAweDNlLCAweDc0LCAweDdkLCAweDNhLCAweDcyLCAweDdhLAorICAgIDB4MzcsIDB4NmYsIDB4NzcsIDB4MzQsIDB4NmIsIDB4NzUsIDB4MzEsIDB4NjgsIDB4NzIsIDB4MmYsIDB4NjcsIDB4NzAsIDB4MmMsIDB4NjQsIDB4NmQsIDB4MjksIDB4NjIsIDB4NmIsIDB4MjYsIDB4NjAsIDB4NjksCisgICAgMHgyNSwgMHg1ZCwgMHg2NiwgMHgyMywgMHg1YiwgMHg2NCwgMHgyMSwgMHg1YSwgMHg2MiwgMHgxZiwgMHg1NywgMHg2MSwgMHgxZSwgMHg1NiwgMHg1ZiwgMHgxYywgMHg1NCwgMHg1ZCwgMHgxOSwgMHg1MiwgMHg1YSwKKyAgICAweDE4LCAweDUxLCAweDVhLCAweDE3LCAweDRmLCAweDU4LCAweDE3LCAweDRlLCAweDU2LCAweDE2LCAweDRjLCAweDU1LCAweDE1LCAweDRhLCAweDUzLCAweDE0LCAweDRhLCAweDUxLCAweDEzLCAweDQ5LCAweDUxLAorICAgIDB4MTIsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDUsIDB4NGUsIDB4MzQsIDB4NjAsIDB4NjcsIDB4M2YsIDB4NjgsIDB4NmUsIDB4M2IsIDB4NjUsIDB4NmIsIDB4M2IsIDB4NjQsIDB4NmEsIDB4M2IsIDB4NjMsIDB4NmEsCisgICAgMHgzYiwgMHg2MywgMHg2OSwgMHgzYiwgMHg2MiwgMHg2OCwgMHgzYiwgMHg2MiwgMHg2OCwgMHgyYiwgMHg1NCwgMHg1YiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwKKyAgICAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLAorICAgIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsCisgICAgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4NmIsIDB4OWQsIDB4YTQsIDB4ODYsIDB4YWYsIDB4YjUsIDB4ODQsIDB4YWUsIDB4YjQsIDB4ODQsIDB4YWUsIDB4YjQsIDB4ODQsIDB4YWUsIDB4YjQsIDB4ODQsIDB4YWUsIDB4YjQsIDB4ODUsIDB4YWYsIDB4YjQsCisgICAgMHg3ZSwgMHhhYSwgMHhiMCwgMHgxYiwgMHg2OSwgMHg3NCwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MzIsIDB4NzYsIDB4ODAsIDB4NjgsIDB4OWEsIDB4YTEsIDB4ODMsIDB4YWMsIDB4YjIsIDB4ODUsIDB4YWUsIDB4YjQsCisgICAgMHg3NywgMHhhNSwgMHhhYiwgMHg0YiwgMHg4NiwgMHg4ZiwgMHgwZiwgMHg1ZSwgMHg2OSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4NzIsIDB4OWUsIDB4YTUsIDB4OTgsIDB4YjksIDB4YmQsCisgICAgMHgyNywgMHg2YSwgMHg3MywgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDBmLCAweDU2LCAweDYwLCAweDM2LCAweDcxLCAweDdhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsCisgICAgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgxYywgMHg1OSwgMHg2MSwgMHhhNywgMHhiZSwgMHhjMiwgMHhhNywgMHhiZSwgMHhjMSwgMHgxYywgMHg1NywgMHg1ZiwgMHgwNSwgMHg0NSwgMHg0ZSwKKyAgICAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LAorICAgIDB4MGEsIDB4NDMsIDB4NGIsIDB4OTYsIDB4YWUsIDB4YjEsIDB4YjMsIDB4YzQsIDB4YzcsIDB4MmYsIDB4NWUsIDB4NjQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsCisgICAgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwKKyAgICAweDBkLCAweDM5LCAweDNmLCAweDc0LCAweDhjLCAweDkwLCAweDdjLCAweDkyLCAweDk1LCAweDEzLCAweDNhLCAweDQwLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLAorICAgIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4NjIsIDB4NzcsIDB4NzksIDB4ODYsIDB4OTUsIDB4OTcsIDB4N2UsIDB4OGQsIDB4OGYsCisgICAgMHgyZSwgMHg0NSwgMHg0OSwgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwKKyAgICAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDEwLCAweDEzLCAweDAwLCAweDBiLCAweDBkLCAweDE0LCAweDI5LCAweDJjLCAweGU1LCAweGU3LCAweGU3LCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDEsIDB4ZGYsIDB4ZTIsCisgICAgMHg3ZiwgMHhhOCwgMHhhZSwgMHg3YiwgMHhhNCwgMHhhYiwgMHg3NywgMHhhMSwgMHhhOCwgMHg3MiwgMHg5ZSwgMHhhNCwgMHg2ZSwgMHg5YSwgMHhhMSwgMHg2OSwgMHg5NywgMHg5ZSwgMHg2NSwgMHg5NCwgMHg5YiwKKyAgICAweDVmLCAweDkwLCAweDk3LCAweDViLCAweDhjLCAweDk1LCAweDU4LCAweDg5LCAweDkyLCAweDUzLCAweDg2LCAweDhlLCAweDRmLCAweDgyLCAweDhiLCAweDRjLCAweDgwLCAweDg4LCAweDQ5LCAweDdkLCAweDg2LAorICAgIDB4NDUsIDB4N2EsIDB4ODIsIDB4NDEsIDB4NzcsIDB4N2YsIDB4M2QsIDB4NzQsIDB4N2MsIDB4M2EsIDB4NzIsIDB4N2EsIDB4MzYsIDB4NmUsIDB4NzYsIDB4MzQsIDB4NmIsIDB4NzUsIDB4MzEsIDB4NjgsIDB4NzIsCisgICAgMHgyZSwgMHg2NiwgMHg2ZiwgMHgyYywgMHg2NCwgMHg2ZCwgMHgyOSwgMHg2MiwgMHg2YiwgMHgyNiwgMHg2MCwgMHg2OSwgMHgyNSwgMHg1ZCwgMHg2NiwgMHgyMywgMHg1YiwgMHg2NCwgMHgyMSwgMHg1YSwgMHg2MiwKKyAgICAweDFmLCAweDU3LCAweDYxLCAweDFkLCAweDU1LCAweDVlLCAweDFjLCAweDU0LCAweDVkLCAweDE5LCAweDUyLCAweDVhLCAweDE4LCAweDUxLCAweDVhLCAweDE3LCAweDRmLCAweDU4LCAweDE3LCAweDRlLCAweDU2LAorICAgIDB4MTYsIDB4NGMsIDB4NTUsIDB4MTUsIDB4NGEsIDB4NTMsIDB4MTQsIDB4NGEsIDB4NTEsIDB4MTIsIDB4NDgsIDB4NTEsIDB4MTIsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDUsIDB4NGUsIDB4Y2MsIDB4ZDcsIDB4ZDksCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGFlLCAweGJlLCAweGMxLCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLAorICAgIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsCisgICAgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLAorICAgIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLAorICAgIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsCisgICAgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwKKyAgICAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LAorICAgIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsCisgICAgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwKKyAgICAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDEwLCAweDEzLAorICAgIDB4MDAsIDB4MGEsIDB4MGMsIDB4MjMsIDB4M2EsIDB4M2QsIDB4ZmIsIDB4ZmMsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmMiwgMHhmNiwgMHhmNywgMHg4YiwgMHhiMCwgMHhiNSwgMHg3YSwgMHhhNCwgMHhhYSwgMHg3NSwgMHhhMCwgMHhhNywKKyAgICAweDcxLCAweDlkLCAweGE0LCAweDZkLCAweDk5LCAweGEwLCAweDY4LCAweDk2LCAweDlkLCAweDY0LCAweDkyLCAweDlhLCAweDVmLCAweDkwLCAweDk3LCAweDVhLCAweDhjLCAweDk0LCAweDU3LCAweDg4LCAweDkxLAorICAgIDB4NTIsIDB4ODUsIDB4OGQsIDB4NGUsIDB4ODIsIDB4OGEsIDB4NGIsIDB4N2YsIDB4ODgsIDB4NDgsIDB4N2MsIDB4ODUsIDB4NDQsIDB4NzksIDB4ODIsIDB4NDAsIDB4NzYsIDB4N2UsIDB4M2QsIDB4NzQsIDB4N2MsCisgICAgMHgzOSwgMHg3MSwgMHg3OSwgMHgzNiwgMHg2ZSwgMHg3NiwgMHgzMywgMHg2YSwgMHg3NCwgMHgzMSwgMHg2OCwgMHg3MiwgMHgyZSwgMHg2NiwgMHg2ZiwgMHgyYiwgMHg2MywgMHg2YywgMHgyOSwgMHg2MiwgMHg2YiwKKyAgICAweDI2LCAweDVmLCAweDY4LCAweDI1LCAweDVkLCAweDY2LCAweDIzLCAweDViLCAweDY0LCAweDIxLCAweDVhLCAweDYyLCAweDFmLCAweDU3LCAweDYxLCAweDFkLCAweDU1LCAweDVlLCAweDFiLCAweDUzLCAweDVjLAorICAgIDB4MTksIDB4NTIsIDB4NWEsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NGYsIDB4NTgsIDB4MTcsIDB4NGUsIDB4NTYsIDB4MTYsIDB4NGMsIDB4NTUsIDB4MTUsIDB4NGEsIDB4NTMsIDB4MTQsIDB4NGEsIDB4NTEsCisgICAgMHgxMiwgMHg0OCwgMHg1MSwgMHgxMiwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NSwgMHg0ZSwgMHhjOSwgMHhkNSwgMHhkNywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGFjLCAweGJjLCAweGJmLCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLAorICAgIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsCisgICAgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwKKyAgICAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwKKyAgICAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksCisgICAgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLAorICAgIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksCisgICAgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwKKyAgICAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLAorICAgIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsCisgICAgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwKKyAgICAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLAorICAgIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDEsIDB4MTAsIDB4MTMsIDB4MDAsIDB4MGEsIDB4MGMsIDB4MzcsIDB4NGYsIDB4NTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGI0LCAweGNjLCAweGQwLCAweDc5LCAweGEzLCAweGFhLCAweDc0LCAweDlmLCAweGE2LCAweDcwLCAweDljLCAweGEzLCAweDZjLCAweDk5LCAweGEwLCAweDY3LCAweDk2LCAweDlkLAorICAgIDB4NjMsIDB4OTIsIDB4OWEsIDB4NWUsIDB4OGYsIDB4OTcsIDB4NWEsIDB4OGIsIDB4OTQsIDB4NTYsIDB4ODgsIDB4OTAsIDB4NTEsIDB4ODUsIDB4OGQsIDB4NGQsIDB4ODEsIDB4ODksIDB4NGEsIDB4N2YsIDB4ODcsCisgICAgMHg0NywgMHg3YywgMHg4NCwgMHg0MiwgMHg3OCwgMHg4MCwgMHgzZiwgMHg3NiwgMHg3ZSwgMHgzYywgMHg3MywgMHg3YywgMHgzOCwgMHg3MCwgMHg3OSwgMHgzNSwgMHg2ZCwgMHg3NiwgMHgzMywgMHg2YSwgMHg3NCwKKyAgICAweDMwLCAweDY4LCAweDcxLCAweDJkLCAweDY1LCAweDZlLCAweDJhLCAweDYzLCAweDZiLCAweDI4LCAweDYxLCAweDZhLCAweDI2LCAweDVmLCAweDY4LCAweDI0LCAweDVkLCAweDY2LCAweDIxLCAweDVhLCAweDYzLAorICAgIDB4MjAsIDB4NTksIDB4NjEsIDB4MWYsIDB4NTcsIDB4NjEsIDB4MWQsIDB4NTUsIDB4NWUsIDB4MWIsIDB4NTMsIDB4NWMsIDB4MTksIDB4NTIsIDB4NWEsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NGYsIDB4NTgsCisgICAgMHgxNywgMHg0ZSwgMHg1NiwgMHgxNiwgMHg0YywgMHg1NSwgMHgxNSwgMHg0YSwgMHg1MywgMHgxNCwgMHg0YSwgMHg1MSwgMHgxMiwgMHg0OCwgMHg1MSwgMHgxMiwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NSwgMHg0ZSwKKyAgICAweGM5LCAweGQ1LCAweGQ3LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWMsIDB4YmMsIDB4YmYsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsCisgICAgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwKKyAgICAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLAorICAgIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLAorICAgIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsCisgICAgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwKKyAgICAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLAorICAgIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsCisgICAgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywKKyAgICAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLAorICAgIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsCisgICAgMHgwMSwgMHgxMCwgMHgxMiwgMHgwMCwgMHgwYiwgMHgwZCwgMHg1OSwgMHg3MSwgMHg3NSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGU5LCAweGYwLCAweGYxLCAweDdlLCAweGE2LCAweGFkLAorICAgIDB4NzMsIDB4OWUsIDB4YTYsIDB4NmYsIDB4OWIsIDB4YTIsIDB4NmEsIDB4OTcsIDB4OWUsIDB4NjYsIDB4OTUsIDB4OWMsIDB4NjIsIDB4OTEsIDB4OTksIDB4NWQsIDB4OGUsIDB4OTYsIDB4NTksIDB4OGEsIDB4OTMsCisgICAgMHg1NSwgMHg4NywgMHg5MCwgMHg1MCwgMHg4NCwgMHg4YywgMHg0ZCwgMHg4MSwgMHg4OSwgMHg0OSwgMHg3ZSwgMHg4NiwgMHg0NSwgMHg3YSwgMHg4MywgMHg0MiwgMHg3OCwgMHg4MCwgMHgzZiwgMHg3NiwgMHg3ZSwKKyAgICAweDNiLCAweDcyLCAweDdiLCAweDM4LCAweDcwLCAweDc5LCAweDM0LCAweDZkLCAweDc1LCAweDMyLCAweDZhLCAweDczLCAweDMwLCAweDY4LCAweDcxLCAweDJkLCAweDY1LCAweDZlLCAweDJhLCAweDYzLCAweDZiLAorICAgIDB4MjgsIDB4NjEsIDB4NmEsIDB4MjUsIDB4NWUsIDB4NjcsIDB4MjQsIDB4NWQsIDB4NjYsIDB4MjIsIDB4NWEsIDB4NjQsIDB4MWYsIDB4NTgsIDB4NjEsIDB4MWUsIDB4NTcsIDB4NjAsIDB4MWQsIDB4NTUsIDB4NWUsCisgICAgMHgxYiwgMHg1MywgMHg1YywgMHgxOSwgMHg1MiwgMHg1YSwgMHgxNywgMHg1MCwgMHg1OSwgMHgxNywgMHg0ZiwgMHg1NywgMHgxNiwgMHg0ZCwgMHg1NiwgMHgxNiwgMHg0YywgMHg1NSwgMHgxNSwgMHg0YSwgMHg1MywKKyAgICAweDE0LCAweDRhLCAweDUxLCAweDEyLCAweDQ4LCAweDUxLCAweDEyLCAweDQ3LCAweDUwLCAweDExLCAweDQ1LCAweDRlLCAweGM5LCAweGQ1LCAweGQ3LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWMsIDB4YmMsIDB4YmYsIDB4MGQsIDB4M2IsIDB4NDMsCisgICAgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywKKyAgICAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LAorICAgIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLAorICAgIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwKKyAgICAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsCisgICAgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwKKyAgICAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLAorICAgIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsCisgICAgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwKKyAgICAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LAorICAgIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsCisgICAgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMiwgMHgxNCwgMHgwMSwgMHgxMCwgMHgxMiwgMHgwMCwgMHgwZCwgMHgwZiwgMHg4ZSwgMHg5ZiwgMHhhMiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWUsIDB4YzcsIDB4Y2IsIDB4NzEsIDB4OWQsIDB4YTQsIDB4NmUsIDB4OWIsIDB4YTEsIDB4NjksIDB4OTcsIDB4OWUsCisgICAgMHg2NCwgMHg5NCwgMHg5YiwgMHg2MSwgMHg5MCwgMHg5OCwgMHg1YiwgMHg4ZCwgMHg5NSwgMHg1OCwgMHg4YSwgMHg5MiwgMHg1NCwgMHg4NiwgMHg4ZiwgMHg0ZiwgMHg4MywgMHg4YiwgMHg0YywgMHg4MCwgMHg4OCwKKyAgICAweDQ4LCAweDdkLCAweDg2LCAweDQ0LCAweDdhLCAweDgyLCAweDQxLCAweDc3LCAweDgwLCAweDNlLCAweDc1LCAweDdkLCAweDNhLCAweDcyLCAweDdiLCAweDM3LCAweDZmLCAweDc4LCAweDM0LCAweDZkLCAweDc1LAorICAgIDB4MzIsIDB4NmEsIDB4NzMsIDB4MmYsIDB4NjcsIDB4NzAsIDB4MmMsIDB4NjUsIDB4NmUsIDB4MmEsIDB4NjMsIDB4NmIsIDB4MjcsIDB4NjAsIDB4NmEsIDB4MjYsIDB4NWYsIDB4NjgsIDB4MjQsIDB4NWQsIDB4NjYsCisgICAgMHgyMiwgMHg1YSwgMHg2NCwgMHgyMCwgMHg1OSwgMHg2MSwgMHgxZSwgMHg1NywgMHg2MCwgMHgxYywgMHg1NCwgMHg1ZSwgMHgxYiwgMHg1MywgMHg1YywgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg1MCwgMHg1OSwKKyAgICAweDE3LCAweDRmLCAweDU3LCAweDE2LCAweDRkLCAweDU2LCAweDE1LCAweDRiLCAweDU0LCAweDE1LCAweDRhLCAweDUzLCAweDE0LCAweDRhLCAweDUxLCAweDEyLCAweDQ4LCAweDUxLCAweDEyLCAweDQ3LCAweDUwLAorICAgIDB4MTEsIDB4NDUsIDB4NGUsIDB4YzksIDB4ZDUsIDB4ZDcsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhYywgMHhiYywgMHhiZiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwKKyAgICAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LAorICAgIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsCisgICAgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwKKyAgICAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LAorICAgIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsCisgICAgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywKKyAgICAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLAorICAgIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsCisgICAgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwKKyAgICAweDAxLCAweDEyLCAweDE0LCAweDAxLCAweDBmLCAweDEyLCAweDAzLCAweDEyLCAweDE0LCAweGM1LCAweGNmLCAweGQxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhlZCwgMHhmMywgMHhmNCwgMHg3YiwgMHhhNSwgMHhhYiwgMHg2YywgMHg5OSwgMHhhMCwgMHg2NywgMHg5NiwgMHg5ZCwgMHg2NCwgMHg5MywgMHg5YSwgMHg1ZiwgMHg4ZiwgMHg5NywgMHg1YSwgMHg4YywgMHg5NCwKKyAgICAweDU3LCAweDg5LCAweDkyLCAweDUyLCAweDg1LCAweDhlLCAweDRlLCAweDgzLCAweDhiLCAweDRiLCAweDdmLCAweDg4LCAweDQ3LCAweDdkLCAweDg1LCAweDQ0LCAweDdhLCAweDgyLCAweDQxLCAweDc3LCAweDgwLAorICAgIDB4M2QsIDB4NzQsIDB4N2MsIDB4MzksIDB4NzEsIDB4N2EsIDB4MzYsIDB4NmYsIDB4NzcsIDB4MzQsIDB4NmMsIDB4NzUsIDB4MzEsIDB4NjksIDB4NzMsIDB4MmYsIDB4NjcsIDB4NzAsIDB4MmMsIDB4NjUsIDB4NmUsCisgICAgMHgyOSwgMHg2MiwgMHg2YiwgMHgyNywgMHg2MCwgMHg2YSwgMHgyNSwgMHg1ZSwgMHg2NywgMHgyMywgMHg1YywgMHg2NSwgMHgyMCwgMHg1OSwgMHg2MiwgMHgxZiwgMHg1OCwgMHg2MSwgMHgxZSwgMHg1NywgMHg2MCwKKyAgICAweDFjLCAweDU0LCAweDVlLCAweDFhLCAweDUzLCAweDViLCAweDE4LCAweDUxLCAweDVhLCAweDE3LCAweDUwLCAweDU5LCAweDE3LCAweDRmLCAweDU3LCAweDE2LCAweDRkLCAweDU2LCAweDE1LCAweDRiLCAweDU0LAorICAgIDB4MTQsIDB4NGEsIDB4NTIsIDB4MTQsIDB4NGEsIDB4NTEsIDB4MTIsIDB4NDgsIDB4NTEsIDB4MTEsIDB4NDYsIDB4NGYsIDB4MTEsIDB4NDUsIDB4NGUsIDB4YzksIDB4ZDQsIDB4ZDYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhYywgMHhiYywgMHhiZiwKKyAgICAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLAorICAgIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsCisgICAgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLAorICAgIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsCisgICAgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywKKyAgICAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLAorICAgIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksCisgICAgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwKKyAgICAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAxLCAweDEyLCAweDE0LCAweDAwLCAweDBlLCAweDBmLCAweDEwLCAweDI0LCAweDI3LAorICAgIDB4ZTgsIDB4ZWMsIDB4ZWQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhiZiwgMHhkMywgMHhkNiwgMHg2YSwgMHg5OCwgMHg5ZiwKKyAgICAweDY2LCAweDk1LCAweDljLCAweDYyLCAweDkyLCAweDk5LCAweDVlLCAweDhlLCAweDk3LCAweDVhLCAweDhjLCAweDk0LCAweDU1LCAweDg4LCAweDkwLCAweDUxLCAweDg1LCAweDhkLCAweDRkLCAweDgyLCAweDhhLAorICAgIDB4NGEsIDB4N2YsIDB4ODcsIDB4NDYsIDB4N2MsIDB4ODQsIDB4NDMsIDB4NzksIDB4ODIsIDB4NDAsIDB4NzYsIDB4N2YsIDB4M2MsIDB4NzQsIDB4N2MsIDB4MzksIDB4NzEsIDB4N2EsIDB4MzUsIDB4NmUsIDB4NzcsCisgICAgMHgzMywgMHg2YiwgMHg3NCwgMHgzMCwgMHg2OCwgMHg3MiwgMHgyZSwgMHg2NiwgMHg3MCwgMHgyYiwgMHg2NCwgMHg2ZCwgMHgyOCwgMHg2MSwgMHg2YSwgMHgyNiwgMHg2MCwgMHg2OSwgMHgyNSwgMHg1ZSwgMHg2NywKKyAgICAweDIzLCAweDVjLCAweDY1LCAweDIxLCAweDVhLCAweDYzLCAweDFlLCAweDU3LCAweDYwLCAweDFkLCAweDU2LCAweDVmLCAweDFjLCAweDU0LCAweDVlLCAweDFhLCAweDUzLCAweDViLCAweDE4LCAweDUxLCAweDVhLAorICAgIDB4MTcsIDB4NTAsIDB4NTksIDB4MTcsIDB4NGYsIDB4NTcsIDB4MTYsIDB4NGQsIDB4NTYsIDB4MTUsIDB4NGIsIDB4NTQsIDB4MTQsIDB4NGEsIDB4NTIsIDB4MTQsIDB4NGEsIDB4NTEsIDB4MTIsIDB4NDgsIDB4NTEsCisgICAgMHgxMSwgMHg0NiwgMHg0ZiwgMHgxMSwgMHg0NSwgMHg0ZSwgMHhjOSwgMHhkNCwgMHhkNiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGFjLCAweGJjLCAweGJmLCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLAorICAgIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsCisgICAgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwKKyAgICAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwKKyAgICAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLAorICAgIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsCisgICAgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwKKyAgICAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LAorICAgIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsCisgICAgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwKKyAgICAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LAorICAgIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDAsIDB4MGIsIDB4MGQsIDB4MjgsIDB4NDEsIDB4NDQsIDB4ZmQsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZkLCAweGZlLCAweGZlLCAweDk1LCAweGI2LCAweGJiLCAweDY0LCAweDk0LCAweDliLCAweDYxLCAweDkxLCAweDk4LCAweDVjLCAweDhkLCAweDk1LAorICAgIDB4NTgsIDB4OGIsIDB4OTIsIDB4NTQsIDB4ODcsIDB4OTAsIDB4NTAsIDB4ODQsIDB4OGQsIDB4NGQsIDB4ODEsIDB4OGEsIDB4NDksIDB4N2UsIDB4ODYsIDB4NDUsIDB4N2IsIDB4ODQsIDB4NDIsIDB4NzgsIDB4ODEsCisgICAgMHg0MCwgMHg3NiwgMHg3ZiwgMHgzYiwgMHg3MywgMHg3YiwgMHgzOCwgMHg3MCwgMHg3OSwgMHgzNSwgMHg2ZSwgMHg3NywgMHgzMiwgMHg2YiwgMHg3MywgMHgzMCwgMHg2OCwgMHg3MiwgMHgyZCwgMHg2NSwgMHg2ZiwKKyAgICAweDJhLCAweDYzLCAweDZjLCAweDI5LCAweDYyLCAweDZiLCAweDI2LCAweDYwLCAweDY5LCAweDIzLCAweDVkLCAweDY2LCAweDIyLCAweDViLCAweDY0LCAweDIwLCAweDU5LCAweDYyLCAweDFmLCAweDU4LCAweDYxLAorICAgIDB4MWQsIDB4NTYsIDB4NWYsIDB4MWIsIDB4NTMsIDB4NWQsIDB4MWEsIDB4NTMsIDB4NWIsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NTAsIDB4NTksIDB4MTcsIDB4NGYsIDB4NTcsIDB4MTYsIDB4NGQsIDB4NTYsCisgICAgMHgxNSwgMHg0YiwgMHg1NCwgMHgxNCwgMHg0YSwgMHg1MiwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMiwgMHg0OCwgMHg1MSwgMHgxMSwgMHg0NiwgMHg0ZiwgMHgxMSwgMHg0NSwgMHg0ZSwgMHhjOSwgMHhkNCwgMHhkNiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4YWMsIDB4YmMsIDB4YmYsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsCisgICAgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywKKyAgICAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsCisgICAgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsCisgICAgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwKKyAgICAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLAorICAgIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsCisgICAgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwKKyAgICAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLAorICAgIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTMsIDB4MTYsIDB4MDEsIDB4MTIsIDB4MTQsIDB4MDAsIDB4MGIsIDB4MGUsCisgICAgMHg1MCwgMHg2YSwgMHg2ZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlYiwgMHhmMiwgMHhmMywgMHhmNSwgMHhmOCwgMHhmOSwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZWIsIDB4ZjEsIDB4ZjIsIDB4NzUsIDB4OWUsIDB4YTUsIDB4NWYsIDB4OTAsIDB4OTcsIDB4NWIsIDB4OGMsIDB4OTUsIDB4NTYsIDB4ODksIDB4OTEsIDB4NTIsIDB4ODYsIDB4OGYsIDB4NGYsIDB4ODMsIDB4OGMsCisgICAgMHg0YywgMHg4MSwgMHg4OSwgMHg0OCwgMHg3ZCwgMHg4NiwgMHg0NCwgMHg3YiwgMHg4MywgMHg0MCwgMHg3NywgMHg4MCwgMHgzZSwgMHg3NCwgMHg3ZCwgMHgzYSwgMHg3MiwgMHg3YiwgMHgzNywgMHg2ZiwgMHg3OSwKKyAgICAweDM0LCAweDZkLCAweDc2LCAweDMyLCAweDZiLCAweDczLCAweDJmLCAweDY4LCAweDcxLCAweDJjLCAweDY1LCAweDZmLCAweDJhLCAweDYzLCAweDZjLCAweDI3LCAweDYwLCAweDZhLCAweDI2LCAweDVmLCAweDY4LAorICAgIDB4MjQsIDB4NWQsIDB4NjcsIDB4MjIsIDB4NWIsIDB4NjQsIDB4MWYsIDB4NTgsIDB4NjIsIDB4MWUsIDB4NTcsIDB4NjAsIDB4MWQsIDB4NTYsIDB4NWYsIDB4MWIsIDB4NTMsIDB4NWQsIDB4MWEsIDB4NTMsIDB4NWIsCisgICAgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg1MCwgMHg1OCwgMHgxNiwgMHg0ZSwgMHg1NywgMHgxNiwgMHg0ZCwgMHg1NiwgMHgxNSwgMHg0YiwgMHg1NCwgMHgxNCwgMHg0YSwgMHg1MiwgMHgxMywgMHg0OSwgMHg1MSwKKyAgICAweDEyLCAweDQ4LCAweDUxLCAweDExLCAweDQ2LCAweDRmLCAweDExLCAweDQ1LCAweDRlLCAweGM5LCAweGQ0LCAweGQ2LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWMsIDB4YmMsIDB4YmYsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsCisgICAgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwKKyAgICAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LAorICAgIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwKKyAgICAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsCisgICAgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwKKyAgICAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLAorICAgIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsCisgICAgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwKKyAgICAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LAorICAgIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsCisgICAgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMSwgMHgxMSwgMHgxNCwgMHgwMCwgMHgwZiwgMHgxMiwgMHg5YywgMHhhYywgMHhhZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGI1LCAweGNkLCAweGQxLCAweGM4LCAweGRhLCAweGRkLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDUsIDB4ZTIsIDB4ZTQsIDB4NjQsIDB4OTMsIDB4OWIsCisgICAgMHg1OSwgMHg4YiwgMHg5NCwgMHg1NSwgMHg4OSwgMHg5MCwgMHg1MSwgMHg4NSwgMHg4ZSwgMHg0ZCwgMHg4MiwgMHg4YiwgMHg0YSwgMHg3ZiwgMHg4OCwgMHg0NiwgMHg3YywgMHg4NCwgMHg0MywgMHg3YSwgMHg4MywKKyAgICAweDQwLCAweDc3LCAweDgwLCAweDNkLCAweDc0LCAweDdkLCAweDM5LCAweDcyLCAweDdhLCAweDM2LCAweDZmLCAweDc4LCAweDM0LCAweDZkLCAweDc1LCAweDMxLCAweDZhLCAweDczLCAweDJlLCAweDY3LCAweDcxLAorICAgIDB4MmIsIDB4NjQsIDB4NmUsIDB4MjksIDB4NjMsIDB4NmMsIDB4MjcsIDB4NjAsIDB4NmEsIDB4MjUsIDB4NWUsIDB4NjgsIDB4MjIsIDB4NWMsIDB4NjUsIDB4MjEsIDB4NWEsIDB4NjQsIDB4MjAsIDB4NTksIDB4NjIsCisgICAgMHgxZCwgMHg1NywgMHg1ZiwgMHgxYywgMHg1NSwgMHg1ZiwgMHgxYiwgMHg1MywgMHg1ZCwgMHgxOSwgMHg1MiwgMHg1YiwgMHgxNywgMHg1MCwgMHg1OSwgMHgxNywgMHg1MCwgMHg1OCwgMHgxNiwgMHg0ZSwgMHg1NywKKyAgICAweDE1LCAweDRjLCAweDU1LCAweDE1LCAweDRiLCAweDU0LCAweDE0LCAweDRhLCAweDUyLCAweDEzLCAweDQ5LCAweDUxLCAweDEyLCAweDQ4LCAweDUxLCAweDExLCAweDQ2LCAweDRmLCAweDExLCAweDQ1LCAweDRlLAorICAgIDB4YzksIDB4ZDQsIDB4ZDYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhhYywgMHhiYywgMHhiZiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwKKyAgICAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LAorICAgIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsCisgICAgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwKKyAgICAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LAorICAgIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsCisgICAgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwKKyAgICAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLAorICAgIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsCisgICAgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxMywgMHgxNiwgMHgwMCwgMHgxMCwgMHgxMiwKKyAgICAweDA5LCAweDFjLCAweDIwLCAweGRiLCAweGUxLCAweGUyLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZjLCAweGZkLCAweGZkLCAweDlhLCAweGJjLCAweGMwLCAweDkwLCAweGI0LCAweGJhLAorICAgIDB4ZWYsIDB4ZjQsIDB4ZjUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhjNywgMHhkOCwgMHhkYiwgMHg1YSwgMHg4YywgMHg5NCwgMHg1MywgMHg4NywgMHg4ZiwgMHg0ZiwgMHg4NCwgMHg4ZCwKKyAgICAweDRjLCAweDgxLCAweDhhLCAweDQ4LCAweDdlLCAweDg2LCAweDQ1LCAweDdiLCAweDg0LCAweDQyLCAweDc5LCAweDgyLCAweDNmLCAweDc2LCAweDdmLCAweDNjLCAweDczLCAweDdjLCAweDM4LCAweDcxLCAweDc5LAorICAgIDB4MzUsIDB4NmUsIDB4NzcsIDB4MzMsIDB4NmMsIDB4NzUsIDB4MzAsIDB4NjksIDB4NzIsIDB4MmQsIDB4NjYsIDB4NzAsIDB4MmIsIDB4NjQsIDB4NmUsIDB4MjgsIDB4NjIsIDB4NmIsIDB4MjYsIDB4NjAsIDB4NjksCisgICAgMHgyNSwgMHg1ZSwgMHg2OCwgMHgyMywgMHg1ZCwgMHg2NiwgMHgyMSwgMHg1YSwgMHg2NCwgMHgxZiwgMHg1OCwgMHg2MiwgMHgxZCwgMHg1NywgMHg1ZiwgMHgxYywgMHg1NSwgMHg1ZiwgMHgxYSwgMHg1MywgMHg1YywKKyAgICAweDE5LCAweDUyLCAweDViLCAweDE3LCAweDUwLCAweDU5LCAweDE3LCAweDUwLCAweDU4LCAweDE2LCAweDRlLCAweDU3LCAweDE1LCAweDRjLCAweDU1LCAweDE0LCAweDRiLCAweDUzLCAweDE0LCAweDRhLCAweDUyLAorICAgIDB4MTMsIDB4NDksIDB4NTEsIDB4MTEsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDYsIDB4NGYsIDB4MTEsIDB4NDUsIDB4NGUsIDB4YzksIDB4ZDQsIDB4ZDYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhYywgMHhiYywgMHhiZiwgMHgwZCwgMHgzYiwgMHg0MywKKyAgICAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLAorICAgIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsCisgICAgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwKKyAgICAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLAorICAgIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsCisgICAgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwKKyAgICAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLAorICAgIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsCisgICAgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywKKyAgICAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAyLCAweDEzLCAweDE2LCAweDAwLCAweDBkLCAweDBmLCAweDI3LCAweDNmLCAweDQ0LCAweGZlLCAweGZlLCAweGZlLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTQsIDB4ZWQsIDB4ZWUsIDB4OGEsIDB4YjEsIDB4YjcsIDB4ODUsIDB4YWQsIDB4YjMsIDB4YWIsIDB4YzYsIDB4Y2EsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGMxLCAweGQ0LCAweGQ3LCAweDU2LCAweDg5LCAweDkxLCAweDRkLCAweDgzLCAweDhjLCAweDRiLCAweDgwLCAweDg5LCAweDQ3LCAweDdkLCAweDg2LCAweDQ0LCAweDdiLCAweDgzLAorICAgIDB4NDAsIDB4NzgsIDB4ODEsIDB4M2UsIDB4NzUsIDB4N2UsIDB4M2IsIDB4NzIsIDB4N2IsIDB4MzcsIDB4NzAsIDB4NzksIDB4MzQsIDB4NmQsIDB4NzcsIDB4MzIsIDB4NmIsIDB4NzQsIDB4MmYsIDB4NjksIDB4NzEsCisgICAgMHgyYywgMHg2NiwgMHg2ZiwgMHgyYSwgMHg2MywgMHg2ZCwgMHgyNywgMHg2MSwgMHg2YSwgMHgyNiwgMHg1ZiwgMHg2OCwgMHgyNCwgMHg1ZSwgMHg2NywgMHgyMSwgMHg1YiwgMHg2NSwgMHgyMCwgMHg1YSwgMHg2MywKKyAgICAweDFlLCAweDU3LCAweDYxLCAweDFkLCAweDU3LCAweDVmLCAweDFiLCAweDU0LCAweDVlLCAweDFhLCAweDUzLCAweDVjLCAweDE5LCAweDUyLCAweDViLCAweDE3LCAweDUwLCAweDU5LCAweDE3LCAweDUwLCAweDU4LAorICAgIDB4MTYsIDB4NGUsIDB4NTcsIDB4MTUsIDB4NGMsIDB4NTUsIDB4MTQsIDB4NGIsIDB4NTMsIDB4MTQsIDB4NGEsIDB4NTIsIDB4MTMsIDB4NDksIDB4NTEsIDB4MTEsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDYsIDB4NGYsCisgICAgMHgxMCwgMHg0NCwgMHg0ZCwgMHhjOSwgMHhkNCwgMHhkNiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGFjLCAweGJjLCAweGJmLCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLAorICAgIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksCisgICAgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywKKyAgICAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLAorICAgIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsCisgICAgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwKKyAgICAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LAorICAgIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsCisgICAgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywKKyAgICAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAyLCAweDE1LCAweDE4LCAweDAxLCAweDEzLCAweDE2LAorICAgIDB4MDAsIDB4MGUsIDB4MTAsIDB4NWQsIDB4NzUsIDB4NzksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YzYsIDB4ZDksIDB4ZGMsIDB4ODYsIDB4YWUsIDB4YjQsCisgICAgMHg4MywgMHhhYiwgMHhiMiwgMHg3ZiwgMHhhOCwgMHhhZiwgMHhjNiwgMHhkOCwgMHhkYiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGM4LCAweGQ5LCAweGRjLAorICAgIDB4NTksIDB4OGEsIDB4OTMsIDB4NDksIDB4N2YsIDB4ODgsIDB4NDYsIDB4N2QsIDB4ODUsIDB4NDIsIDB4NzksIDB4ODIsIDB4NDAsIDB4NzcsIDB4ODAsIDB4M2QsIDB4NzQsIDB4N2UsIDB4MzksIDB4NzEsIDB4N2EsCisgICAgMHgzNSwgMHg2ZiwgMHg3NywgMHgzNCwgMHg2ZCwgMHg3NiwgMHgzMSwgMHg2YiwgMHg3MywgMHgyZSwgMHg2OCwgMHg3MSwgMHgyYywgMHg2NiwgMHg2ZiwgMHgyYSwgMHg2MywgMHg2ZCwgMHgyNywgMHg2MSwgMHg2YSwKKyAgICAweDI1LCAweDVlLCAweDY4LCAweDI0LCAweDVlLCAweDY3LCAweDIxLCAweDViLCAweDY1LCAweDIwLCAweDVhLCAweDYzLCAweDFlLCAweDU3LCAweDYxLCAweDFjLCAweDU2LCAweDVmLCAweDFiLCAweDU0LCAweDVlLAorICAgIDB4MWEsIDB4NTMsIDB4NWMsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NTAsIDB4NTgsIDB4MTYsIDB4NGYsIDB4NTgsIDB4MTYsIDB4NGUsIDB4NTcsIDB4MTUsIDB4NGMsIDB4NTUsIDB4MTQsIDB4NGIsIDB4NTMsCisgICAgMHgxMywgMHg0OSwgMHg1MiwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMSwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NiwgMHg0ZiwgMHgxMCwgMHg0NCwgMHg0ZCwgMHhjOCwgMHhkNCwgMHhkNiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGFjLCAweGJjLCAweGJmLAorICAgIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsCisgICAgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwKKyAgICAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsCisgICAgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwKKyAgICAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLAorICAgIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsCisgICAgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwKKyAgICAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLAorICAgIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MDEsIDB4MTIsIDB4MTUsIDB4MDMsIDB4MTQsIDB4MTcsIDB4YmIsIDB4YzgsIDB4YzksIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhMCwgMHhjMCwgMHhjNCwgMHg4NCwgMHhhYywgMHhiMiwgMHg4MCwgMHhhOSwgMHhiMCwgMHg3YywgMHhhNiwgMHhhZCwgMHg3ZCwgMHhhOCwgMHhhZSwKKyAgICAweGRhLCAweGU2LCAweGU4LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZGQsIDB4ZTcsIDB4ZTksIDB4NjgsIDB4OTQsIDB4OWQsIDB4NDQsIDB4N2IsIDB4ODQsCisgICAgMHg0MSwgMHg3OSwgMHg4MSwgMHgzZiwgMHg3NywgMHg4MCwgMHgzYiwgMHg3MywgMHg3YywgMHgzOCwgMHg3MCwgMHg3YSwgMHgzNCwgMHg2ZSwgMHg3NywgMHgzMiwgMHg2YiwgMHg3NSwgMHgzMCwgMHg2YSwgMHg3MywKKyAgICAweDJkLCAweDY3LCAweDcwLCAweDJhLCAweDY0LCAweDZlLCAweDI4LCAweDYyLCAweDZjLCAweDI2LCAweDYxLCAweDZhLCAweDI1LCAweDVlLCAweDY4LCAweDIzLCAweDVkLCAweDY2LCAweDIwLCAweDViLCAweDY0LAorICAgIDB4MWYsIDB4NTksIDB4NjIsIDB4MWQsIDB4NTcsIDB4NjAsIDB4MWMsIDB4NTYsIDB4NWYsIDB4MWEsIDB4NTQsIDB4NWQsIDB4MTksIDB4NTIsIDB4NWMsIDB4MTgsIDB4NTEsIDB4NWEsIDB4MTcsIDB4NTAsIDB4NTgsCisgICAgMHgxNiwgMHg0ZiwgMHg1OCwgMHgxNSwgMHg0ZCwgMHg1NiwgMHgxNSwgMHg0YywgMHg1NSwgMHgxNCwgMHg0YiwgMHg1MywgMHgxMywgMHg0OSwgMHg1MiwgMHgxMywgMHg0OSwgMHg1MSwgMHgxMSwgMHg0NywgMHg1MCwKKyAgICAweDExLCAweDQ2LCAweDRmLCAweDJkLCAweDViLCAweDYzLCAweGUyLCAweGU4LCAweGU5LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWMsIDB4YmMsIDB4YmYsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsCisgICAgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwKKyAgICAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLAorICAgIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LAorICAgIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsCisgICAgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwKKyAgICAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLAorICAgIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsCisgICAgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwKKyAgICAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LAorICAgIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDIsIDB4MTcsIDB4MWEsIDB4MDIsIDB4MTUsIDB4MTgsCisgICAgMHgwMCwgMHgwZiwgMHgxMSwgMHgxYSwgMHgzMiwgMHgzNiwgMHhmOCwgMHhmYSwgMHhmYSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlNiwgMHhlZiwgMHhmMCwgMHg4NywgMHhhZiwgMHhiNSwKKyAgICAweDgxLCAweGFhLCAweGIxLCAweDdkLCAweGE4LCAweGFlLCAweDc5LCAweGE1LCAweGFiLCAweDc2LCAweGEyLCAweGE5LCAweDgxLCAweGE5LCAweGFmLCAweGU4LCAweGVmLCAweGYwLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmMywgMHhmNywgMHhmNywgMHg5MSwgMHhiMiwgMHhiNywgMHg0MiwgMHg3OSwgMHg4MSwgMHgzZCwgMHg3NSwgMHg3ZSwgMHgzYSwgMHg3MiwgMHg3YywKKyAgICAweDM3LCAweDcwLCAweDc5LCAweDM0LCAweDZlLCAweDc2LCAweDMxLCAweDZiLCAweDc0LCAweDJlLCAweDY5LCAweDcyLCAweDJjLCAweDY3LCAweDZmLCAweDJhLCAweDY0LCAweDZlLCAweDI4LCAweDYyLCAweDZjLAorICAgIDB4MjYsIDB4NjAsIDB4NjksIDB4MjQsIDB4NWUsIDB4NjcsIDB4MjIsIDB4NWMsIDB4NjYsIDB4MjAsIDB4NWIsIDB4NjQsIDB4MWUsIDB4NTgsIDB4NjIsIDB4MWQsIDB4NTcsIDB4NjAsIDB4MWIsIDB4NTUsIDB4NWUsCisgICAgMHgxYSwgMHg1NCwgMHg1ZCwgMHgxOSwgMHg1MiwgMHg1YywgMHgxOCwgMHg1MSwgMHg1YSwgMHgxNywgMHg1MCwgMHg1OCwgMHgxNiwgMHg0ZiwgMHg1OCwgMHgxNSwgMHg0ZCwgMHg1NiwgMHgxNCwgMHg0YywgMHg1NCwKKyAgICAweDE0LCAweDRiLCAweDUzLCAweDEzLCAweDQ5LCAweDUyLCAweDEyLCAweDQ4LCAweDUwLCAweDExLCAweDQ3LCAweDUwLCAweDYxLCAweDg0LCAweDhhLCAweGU1LCAweGVhLCAweGViLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhhYywgMHhiYywgMHhiZiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwKKyAgICAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LAorICAgIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwKKyAgICAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywKKyAgICAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LAorICAgIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsCisgICAgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwKKyAgICAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLAorICAgIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsCisgICAgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwgMHgwMiwgMHgxNSwgMHgxOCwgMHgwMCwgMHgwZSwgMHgxMSwgMHg1MywgMHg2YywgMHg3MCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGMxLCAweGQ2LCAweGQ5LCAweDgyLCAweGFiLCAweGIyLCAweDdlLCAweGE4LCAweGFmLCAweDdhLCAweGE2LCAweGFkLCAweDc3LCAweGEzLCAweGFhLAorICAgIDB4NzMsIDB4YTAsIDB4YTcsIDB4NmYsIDB4OWQsIDB4YTQsIDB4ODUsIDB4YWMsIDB4YjIsIDB4ZWQsIDB4ZjMsIDB4ZjQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGNkLCAweGRiLCAweGRlLCAweDY2LCAweDkzLCAweDlhLCAweDM5LCAweDcyLCAweDdiLCAweDM2LCAweDZmLCAweDc4LCAweDMzLCAweDZkLCAweDc2LCAweDMwLCAweDZhLCAweDc0LAorICAgIDB4MmQsIDB4NjgsIDB4NzEsIDB4MmIsIDB4NjYsIDB4NmYsIDB4MjgsIDB4NjMsIDB4NmQsIDB4MjcsIDB4NjEsIDB4NmIsIDB4MjYsIDB4NjEsIDB4NmEsIDB4MjQsIDB4NWUsIDB4NjcsIDB4MjIsIDB4NWMsIDB4NjYsCisgICAgMHgyMCwgMHg1YiwgMHg2NCwgMHgxZSwgMHg1OCwgMHg2MiwgMHgxYywgMHg1NiwgMHg2MCwgMHgxYiwgMHg1NSwgMHg1ZSwgMHgxYSwgMHg1NCwgMHg1ZCwgMHgxOCwgMHg1MSwgMHg1YiwgMHgxNywgMHg1MSwgMHg1OSwKKyAgICAweDE3LCAweDUwLCAweDU4LCAweDE2LCAweDRmLCAweDU4LCAweDE1LCAweDRkLCAweDU2LCAweDE0LCAweDRjLCAweDU0LCAweDEzLCAweDRhLCAweDUzLCAweDEzLCAweDQ5LCAweDUyLCAweDNhLCAweDY3LCAweDZlLAorICAgIDB4YjIsIDB4YzQsIDB4YzcsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhYywgMHhiYywgMHhiZiwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwKKyAgICAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLAorICAgIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsCisgICAgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsCisgICAgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwKKyAgICAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LAorICAgIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsCisgICAgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwKKyAgICAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLAorICAgIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsCisgICAgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMiwgMHgxOCwgMHgxYywgMHgwMiwgMHgxNywgMHgxYSwKKyAgICAweDAxLCAweDE0LCAweDE3LCAweDAzLCAweDE1LCAweDE5LCAweGI4LCAweGM0LCAweGM2LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZiLCAweGZjLCAweGZkLCAweDk3LCAweGJhLCAweGJmLAorICAgIDB4N2UsIDB4YTksIDB4YWYsIDB4N2EsIDB4YTYsIDB4YWQsIDB4NzgsIDB4YTQsIDB4YWIsIDB4NzQsIDB4YTEsIDB4YTgsIDB4NzAsIDB4OWUsIDB4YTYsIDB4NmMsIDB4OWIsIDB4YTMsIDB4NjksIDB4OTksIDB4YTAsCisgICAgMHg4MSwgMHhhOSwgMHhiMCwgMHhlYywgMHhmMiwgMHhmMywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZiLCAweGZjLCAweGZjLAorICAgIDB4YjksIDB4Y2QsIDB4ZDEsIDB4NWYsIDB4OGQsIDB4OTQsIDB4MzMsIDB4NmQsIDB4NzYsIDB4MmYsIDB4NjksIDB4NzMsIDB4MmMsIDB4NjcsIDB4NzAsIDB4MmEsIDB4NjUsIDB4NmUsIDB4MjcsIDB4NjIsIDB4NmMsCisgICAgMHgyNiwgMHg2MCwgMHg2YSwgMHgyNCwgMHg1ZiwgMHg2OCwgMHgyMywgMHg1ZCwgMHg2NiwgMHgyMSwgMHg1YywgMHg2NSwgMHgxZiwgMHg1YSwgMHg2MywgMHgxZCwgMHg1OCwgMHg2MSwgMHgxYywgMHg1NiwgMHg2MCwKKyAgICAweDFiLCAweDU1LCAweDVlLCAweDE5LCAweDUzLCAweDVkLCAweDE4LCAweDUxLCAweDViLCAweDE3LCAweDUxLCAweDU5LCAweDE2LCAweDRmLCAweDU4LCAweDE1LCAweDRlLCAweDU3LCAweDE1LCAweDRkLCAweDU2LAorICAgIDB4MTQsIDB4NGMsIDB4NTQsIDB4NDAsIDB4NmQsIDB4NzQsIDB4YTQsIDB4YjksIDB4YmQsIDB4ZjcsIDB4ZjksIDB4ZjksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGFlLCAweGJlLCAweGMxLCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLAorICAgIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsCisgICAgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwKKyAgICAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLAorICAgIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsCisgICAgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwKKyAgICAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LAorICAgIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsCisgICAgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwKKyAgICAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLCAweDAyLCAweDE3LCAweDFhLCAweDAwLCAweDEwLCAweDEzLCAweDFmLCAweDM5LCAweDNkLCAweGZlLCAweGZlLCAweGZlLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZGEsIDB4ZTcsIDB4ZTksIDB4N2UsIDB4YTksIDB4YjAsIDB4N2IsIDB4YTcsIDB4YWUsIDB4NzgsIDB4YTQsIDB4YWIsIDB4NzQsIDB4YTEsIDB4YTksCisgICAgMHg3MSwgMHg5ZiwgMHhhNiwgMHg2ZCwgMHg5YywgMHhhNCwgMHg2YSwgMHg5OSwgMHhhMSwgMHg2NiwgMHg5NywgMHg5ZiwgMHg2MywgMHg5NCwgMHg5YywgMHg3OSwgMHhhNCwgMHhhOSwgMHhlNCwgMHhlZCwgMHhlZSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmMsIDB4ZmQsIDB4ZmQsIDB4YzksIDB4ZDgsIDB4ZGEsCisgICAgMHg4MSwgMHhhNCwgMHhhYSwgMHg0MiwgMHg3OCwgMHg4MCwgMHgyOSwgMHg2NSwgMHg2ZSwgMHgyNywgMHg2MiwgMHg2YywgMHgyNSwgMHg1ZiwgMHg2OSwgMHgyNCwgMHg1ZiwgMHg2OCwgMHgyMywgMHg1ZCwgMHg2NiwKKyAgICAweDIwLCAweDViLCAweDY0LCAweDFlLCAweDU5LCAweDYzLCAweDFkLCAweDU4LCAweDYxLCAweDFiLCAweDU1LCAweDVmLCAweDFhLCAweDU1LCAweDVkLCAweDE5LCAweDUzLCAweDVkLCAweDE4LCAweDUxLCAweDViLAorICAgIDB4MTcsIDB4NTEsIDB4NTksIDB4MTcsIDB4NTAsIDB4NTksIDB4MzEsIDB4NjMsIDB4NmIsIDB4NzAsIDB4OTMsIDB4OTgsIDB4YmUsIDB4Y2UsIDB4ZDAsIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGI0LCAweGMzLCAweGM1LCAweDU0LCAweDc1LCAweDdiLCAweDBkLCAweDNiLCAweDQzLAorICAgIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsCisgICAgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwKKyAgICAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLAorICAgIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsCisgICAgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywKKyAgICAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLAorICAgIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsCisgICAgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywKKyAgICAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDFhLCAweDFlLCAweDAyLCAweDE4LCAweDFjLAorICAgIDB4MDIsIDB4MTYsIDB4MWEsIDB4MDAsIDB4MTAsIDB4MTMsIDB4NmEsIDB4ODIsIDB4ODUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWEsIDB4YzYsIDB4Y2IsCisgICAgMHg3YSwgMHhhNywgMHhhZSwgMHg3OCwgMHhhNCwgMHhhYiwgMHg3NSwgMHhhMiwgMHhhOSwgMHg3MSwgMHhhMCwgMHhhNywgMHg2ZSwgMHg5ZCwgMHhhNCwgMHg2YiwgMHg5YiwgMHhhMiwgMHg2OCwgMHg5OCwgMHhhMCwKKyAgICAweDY0LCAweDk2LCAweDlkLCAweDYwLCAweDkyLCAweDlhLCAweDVkLCAweDkxLCAweDk4LCAweDY5LCAweDk4LCAweGEwLCAweGQxLCAweGRmLCAweGUyLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmNCwgMHhmNywgMHhmOCwgMHhjOCwgMHhkNywgMHhkYSwKKyAgICAweDk4LCAweGI1LCAweGI5LCAweDcyLCAweDk3LCAweDllLCAweDUyLCAweDgwLCAweDg3LCAweDNiLCAweDZmLCAweDc3LCAweDJkLCAweDY1LCAweDZkLCAweDI5LCAweDYxLCAweDZhLCAweDI3LCAweDVmLCAweDY4LAorICAgIDB4MjksIDB4NjAsIDB4NjksIDB4MzksIDB4NmMsIDB4NzMsIDB4NGYsIDB4N2IsIDB4ODMsIDB4NmUsIDB4OTIsIDB4OTgsIDB4OTUsIDB4YjAsIDB4YjMsIDB4YzcsIDB4ZDUsIDB4ZDcsIDB4ZjQsIDB4ZjcsIDB4ZjcsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4OWQsIDB4YjEsIDB4YjQsIDB4MTMsIDB4NDIsIDB4NDksIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsCisgICAgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwKKyAgICAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLAorICAgIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsCisgICAgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywKKyAgICAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLAorICAgIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsCisgICAgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwKKyAgICAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLAorICAgIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDIsIDB4MTgsIDB4MWMsIDB4MDAsIDB4MTQsIDB4MTgsIDB4MGEsIDB4MjEsIDB4MjUsIDB4ZGIsIDB4ZTEsIDB4ZTMsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlOSwgMHhmMCwgMHhmMSwgMHg4MCwgMHhhYiwgMHhiMSwgMHg3OCwgMHhhNSwgMHhhYywgMHg3NCwgMHhhMiwgMHhhOSwgMHg3MSwgMHhhMCwgMHhhNywKKyAgICAweDZlLCAweDllLCAweGE1LCAweDZiLCAweDliLCAweGEyLCAweDY3LCAweDk4LCAweGEwLCAweDY1LCAweDk2LCAweDllLCAweDYxLCAweDk0LCAweDliLCAweDVkLCAweDkxLCAweDk5LCAweDVhLCAweDhmLCAweDk2LAorICAgIDB4NTcsIDB4OGIsIDB4OTQsIDB4NTgsIDB4OGMsIDB4OTQsIDB4YWUsIDB4YzcsIDB4Y2IsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZjLCAweGZjLCAweGZkLAorICAgIDB4ZjUsIDB4ZjcsIDB4ZjgsIDB4ZWUsIDB4ZjMsIDB4ZjMsIDB4ZWEsIDB4ZWYsIDB4ZjAsIDB4ZWEsIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjgsIDB4ZjgsIDB4ZmQsIDB4ZmUsIDB4ZmUsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4N2IsIDB4OTYsIDB4OWEsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsCisgICAgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwKKyAgICAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LAorICAgIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwKKyAgICAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwKKyAgICAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LAorICAgIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsCisgICAgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywKKyAgICAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LAorICAgIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDIsIDB4MWEsIDB4MWUsCisgICAgMHgwMiwgMHgxOCwgMHgxYywgMHgwMCwgMHgxMSwgMHgxNCwgMHg0MCwgMHg1YywgMHg1ZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhiNSwgMHhjZSwgMHhkMiwKKyAgICAweDc3LCAweGE0LCAweGFiLCAweDc0LCAweGEzLCAweGFhLCAweDcxLCAweGEwLCAweGE3LCAweDZlLCAweDllLCAweGE1LCAweDZiLCAweDliLCAweGEzLCAweDY4LCAweDk5LCAweGEwLCAweDY1LCAweDk3LCAweDlmLAorICAgIDB4NjEsIDB4OTQsIDB4OWMsIDB4NWUsIDB4OTIsIDB4OTksIDB4NWIsIDB4OGYsIDB4OTgsIDB4NTcsIDB4OGQsIDB4OTUsIDB4NTQsIDB4ODksIDB4OTIsIDB4NTEsIDB4ODcsIDB4OTAsIDB4NGUsIDB4ODUsIDB4OGQsCisgICAgMHg3ZSwgMHhhNSwgMHhhYywgMHhlNCwgMHhlZCwgMHhlZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZGIsIDB4ZTMsIDB4ZTQsIDB4NGEsIDB4NmYsIDB4NzUsCisgICAgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwKKyAgICAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLAorICAgIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsCisgICAgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsCisgICAgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsCisgICAgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwKKyAgICAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LAorICAgIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsCisgICAgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwKKyAgICAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLAorICAgIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsCisgICAgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwgMHgwMiwgMHgxYSwgMHgxZSwgMHgwMCwgMHgxNywgMHgxYiwgMHgwMywgMHgxOSwgMHgxYywgMHhhZSwgMHhiZCwgMHhiZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGYwLCAweGY1LCAweGY2LCAweDgxLCAweGFiLCAweGIyLCAweDczLCAweGEyLCAweGE5LCAweDcwLCAweGEwLCAweGE3LCAweDZkLCAweDllLCAweGE1LAorICAgIDB4NmIsIDB4OWIsIDB4YTMsIDB4NjgsIDB4OTksIDB4YTEsIDB4NjQsIDB4OTYsIDB4OWUsIDB4NjIsIDB4OTUsIDB4OWQsIDB4NWYsIDB4OTIsIDB4OWEsIDB4NWIsIDB4OTAsIDB4OTgsIDB4NTgsIDB4OGQsIDB4OTYsCisgICAgMHg1NSwgMHg4YiwgMHg5MywgMHg1MiwgMHg4OCwgMHg5MSwgMHg0ZSwgMHg4NSwgMHg4ZSwgMHg0YywgMHg4NCwgMHg4YywgMHg0OSwgMHg4MCwgMHg4OSwgMHg1NCwgMHg4OCwgMHg5MCwgMHhhYywgMHhjNSwgMHhjOSwKKyAgICAweGZhLCAweGZiLCAweGZjLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmYiwgMHhmYywgMHhmYywgMHg5YSwgMHhhZiwgMHhiMywgMHgxZSwgMHg0ZCwgMHg1NSwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwKKyAgICAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLAorICAgIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsCisgICAgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLAorICAgIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLAorICAgIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsCisgICAgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwKKyAgICAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LAorICAgIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsCisgICAgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMiwgMHgxYiwgMHgxZiwKKyAgICAweDAyLCAweDFhLCAweDFlLCAweDAwLCAweDEzLCAweDE2LCAweDI5LCAweDQ2LCAweDRiLCAweGZlLCAweGZlLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGI5LCAweGQxLCAweGQ1LAorICAgIDB4NzIsIDB4YTEsIDB4YTksIDB4NmYsIDB4YTAsIDB4YTcsIDB4NmMsIDB4OWUsIDB4YTUsIDB4NmEsIDB4OWIsIDB4YTMsIDB4NjcsIDB4OTksIDB4YTEsIDB4NjQsIDB4OTcsIDB4OWYsIDB4NjEsIDB4OTQsIDB4OWMsCisgICAgMHg1ZiwgMHg5MywgMHg5YiwgMHg1YywgMHg5MCwgMHg5OCwgMHg1OCwgMHg4ZSwgMHg5NiwgMHg1NiwgMHg4YiwgMHg5NCwgMHg1MiwgMHg4OSwgMHg5MSwgMHg0ZiwgMHg4NiwgMHg4ZiwgMHg0YywgMHg4NCwgMHg4ZCwKKyAgICAweDRhLCAweDgyLCAweDhhLCAweDQ3LCAweDdmLCAweDg4LCAweDQ0LCAweDdkLCAweDg2LCAweDQxLCAweDdhLCAweDg0LCAweDY2LCAweDk0LCAweDliLCAweGM5LCAweGQ5LCAweGRjLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhjMiwgMHhjZiwgMHhkMSwgMHg0NywgMHg2ZSwgMHg3NSwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwKKyAgICAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLAorICAgIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsCisgICAgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwKKyAgICAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwKKyAgICAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksCisgICAgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLAorICAgIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksCisgICAgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwKKyAgICAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLAorICAgIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsCisgICAgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwKKyAgICAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLCAweDAyLCAweDFiLCAweDFmLCAweDAyLCAweDE5LCAweDFkLCAweDAxLCAweDE4LCAweDFiLCAweDk2LCAweGE5LCAweGFjLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZWYsIDB4ZjUsIDB4ZjUsIDB4N2UsIDB4YWEsIDB4YjEsIDB4NmUsIDB4OWYsIDB4YTcsIDB4NmMsIDB4OWQsIDB4YTUsIDB4NjksIDB4OWIsIDB4YTMsCisgICAgMHg2NiwgMHg5OSwgMHhhMSwgMHg2NCwgMHg5NywgMHg5ZiwgMHg2MSwgMHg5NSwgMHg5ZCwgMHg1ZSwgMHg5MiwgMHg5YSwgMHg1YywgMHg5MSwgMHg5OSwgMHg1OSwgMHg4ZSwgMHg5NywgMHg1NiwgMHg4YywgMHg5NCwKKyAgICAweDUzLCAweDhhLCAweDkyLCAweDUwLCAweDg4LCAweDkwLCAweDRkLCAweDg1LCAweDhlLCAweDRhLCAweDgyLCAweDhiLCAweDQ4LCAweDgwLCAweDg5LCAweDQ1LCAweDdlLCAweDg2LCAweDQyLCAweDdjLCAweDg1LAorICAgIDB4M2YsIDB4NzksIDB4ODMsIDB4M2MsIDB4NzcsIDB4ODAsIDB4M2EsIDB4NzUsIDB4N2YsIDB4NzMsIDB4OWMsIDB4YTMsIDB4Y2QsIDB4ZGMsIDB4ZGUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZSwgMHhmZSwgMHhmZSwgMHhjNCwgMHhkMSwgMHhkMywgMHg1OCwgMHg3ZCwgMHg4MywKKyAgICAweDExLCAweDQ1LCAweDRkLCAweDBmLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LAorICAgIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsCisgICAgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwKKyAgICAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLAorICAgIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLAorICAgIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsCisgICAgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwKKyAgICAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLAorICAgIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsCisgICAgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywKKyAgICAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAyLCAweDFlLCAweDIzLCAweDAyLCAweDFkLCAweDIxLAorICAgIDB4MDIsIDB4MWIsIDB4MWYsIDB4MDAsIDB4MTQsIDB4MTgsIDB4MjMsIDB4NDAsIDB4NDUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YjMsIDB4Y2QsIDB4ZDEsCisgICAgMHg2ZCwgMHg5ZiwgMHhhNiwgMHg2YiwgMHg5ZCwgMHhhNSwgMHg2OSwgMHg5YiwgMHhhMywgMHg2NiwgMHg5OSwgMHhhMSwgMHg2MywgMHg5NywgMHg5ZiwgMHg2MCwgMHg5NCwgMHg5ZCwgMHg1ZSwgMHg5MywgMHg5YiwKKyAgICAweDVjLCAweDkxLCAweDk5LCAweDU5LCAweDhmLCAweDk3LCAweDU2LCAweDhjLCAweDk1LCAweDUzLCAweDhhLCAweDkyLCAweDUwLCAweDg4LCAweDkxLCAweDRkLCAweDg2LCAweDhlLCAweDRiLCAweDgzLCAweDhjLAorICAgIDB4NDgsIDB4ODAsIDB4OGEsIDB4NDUsIDB4N2YsIDB4ODcsIDB4NDIsIDB4N2MsIDB4ODUsIDB4M2YsIDB4N2EsIDB4ODMsIDB4M2UsIDB4NzgsIDB4ODIsIDB4M2EsIDB4NzYsIDB4N2YsIDB4MzcsIDB4NzMsIDB4N2QsCisgICAgMHgzNSwgMHg3MSwgMHg3YiwgMHgzNSwgMHg3MCwgMHg3OSwgMHg2NiwgMHg5MiwgMHg5OSwgMHhiNCwgMHhjYSwgMHhjZCwgMHhmMSwgMHhmNSwgMHhmNiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlYywgMHhmMSwgMHhmMSwKKyAgICAweGE0LCAweGI5LCAweGJjLCAweDRhLCAweDczLCAweDdhLCAweDEyLCAweDQ2LCAweDRmLCAweDBmLCAweDQ0LCAweDRkLCAweDBmLCAweDQ0LCAweDRjLCAweDBmLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LAorICAgIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsCisgICAgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywKKyAgICAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LAorICAgIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLAorICAgIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwKKyAgICAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsCisgICAgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwKKyAgICAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLAorICAgIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsCisgICAgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwKKyAgICAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LAorICAgIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsIDB4MDIsIDB4MWQsIDB4MjEsIDB4MDIsIDB4MWEsIDB4MWUsIDB4MDEsIDB4MTgsIDB4MWMsIDB4OTQsIDB4YTcsIDB4YWEsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlOCwgMHhmMCwgMHhmMSwgMHg3NCwgMHhhMywgMHhhYiwgMHg2YSwgMHg5ZCwgMHhhNCwgMHg2NywgMHg5YSwgMHhhMiwgMHg2NSwgMHg5OSwgMHhhMSwKKyAgICAweDYyLCAweDk3LCAweDlmLCAweDYwLCAweDk0LCAweDlkLCAweDVkLCAweDkyLCAweDlhLCAweDViLCAweDkxLCAweDk5LCAweDU4LCAweDhlLCAweDk3LCAweDU1LCAweDhjLCAweDk1LCAweDU0LCAweDhhLCAweDkzLAorICAgIDB4NTAsIDB4ODgsIDB4OTEsIDB4NGQsIDB4ODYsIDB4OGYsIDB4NGIsIDB4ODQsIDB4OGMsIDB4NDgsIDB4ODEsIDB4OGIsIDB4NDUsIDB4N2YsIDB4ODgsIDB4NDMsIDB4N2QsIDB4ODYsIDB4NDAsIDB4N2IsIDB4ODMsCisgICAgMHgzZSwgMHg3OSwgMHg4MiwgMHgzYiwgMHg3NiwgMHg4MCwgMHgzOCwgMHg3NSwgMHg3ZSwgMHgzNSwgMHg3MiwgMHg3YywgMHgzMywgMHg3MCwgMHg3YSwgMHgzMiwgMHg2ZSwgMHg3OCwgMHgyZiwgMHg2YiwgMHg3NSwKKyAgICAweDJkLCAweDZhLCAweDc0LCAweDQwLCAweDc3LCAweDgwLCAweDdiLCAweGExLCAweGE3LCAweGI2LCAweGNiLCAweGNlLCAweGU2LCAweGVkLCAweGVlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZSwgMHhmZSwgMHhmZSwKKyAgICAweGRlLCAweGU2LCAweGU3LCAweGE5LCAweGJkLCAweGMwLCAweDY1LCAweDg5LCAweDhlLCAweDI1LCAweDU2LCAweDVlLCAweDExLCAweDQ3LCAweDRmLCAweDEwLCAweDQ2LCAweDRmLCAweDBmLCAweDQ1LCAweDRlLAorICAgIDB4MGYsIDB4NDQsIDB4NGQsIDB4MGYsIDB4NDQsIDB4NGMsIDB4MGYsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsCisgICAgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwKKyAgICAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LAorICAgIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsCisgICAgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwKKyAgICAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LAorICAgIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsCisgICAgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywKKyAgICAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLAorICAgIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDIsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MWUsIDB4MjMsCisgICAgMHgwMiwgMHgxZCwgMHgyMSwgMHgwMCwgMHgxNiwgMHgxOSwgMHgyOSwgMHg0NywgMHg0YywgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhMCwgMHhjMSwgMHhjNiwKKyAgICAweDY5LCAweDljLCAweGE0LCAweDY2LCAweDlhLCAweGEyLCAweDYzLCAweDk4LCAweGEwLCAweDYxLCAweDk2LCAweDllLCAweDVmLCAweDk1LCAweDlkLCAweDVjLCAweDkyLCAweDlhLCAweDVhLCAweDkwLCAweDk5LAorICAgIDB4NTcsIDB4OGUsIDB4OTcsIDB4NTUsIDB4OGMsIDB4OTUsIDB4NTMsIDB4OGEsIDB4OTMsIDB4NTAsIDB4ODgsIDB4OTEsIDB4NGQsIDB4ODcsIDB4OGYsIDB4NGIsIDB4ODQsIDB4OGQsIDB4NDgsIDB4ODIsIDB4OGIsCisgICAgMHg0NSwgMHg3ZiwgMHg4OSwgMHg0MywgMHg3ZCwgMHg4NywgMHg0MCwgMHg3YiwgMHg4NCwgMHgzZSwgMHg3OSwgMHg4MiwgMHgzYywgMHg3NywgMHg4MCwgMHgzOSwgMHg3NSwgMHg3ZiwgMHgzNiwgMHg3MywgMHg3ZCwKKyAgICAweDMzLCAweDcwLCAweDdiLCAweDMyLCAweDZlLCAweDc5LCAweDMwLCAweDZkLCAweDc3LCAweDJlLCAweDZiLCAweDc0LCAweDJjLCAweDY5LCAweDczLCAweDJhLCAweDY3LCAweDcxLCAweDI3LCAweDY0LCAweDZlLAorICAgIDB4MjYsIDB4NjQsIDB4NmQsIDB4MzEsIDB4NmEsIDB4NzUsIDB4NTIsIDB4ODMsIDB4OGEsIDB4N2UsIDB4YTIsIDB4YTcsIDB4YTIsIDB4YmMsIDB4YzAsIDB4YmMsIDB4Y2UsIDB4ZDEsIDB4ZDAsIDB4ZGQsIDB4ZGYsCisgICAgMHhkZiwgMHhlNywgMHhlOSwgMHhlOSwgMHhlZiwgMHhmMCwgMHhlYywgMHhmMSwgMHhmMiwgMHhlYiwgMHhmMCwgMHhmMSwgMHhlNiwgMHhlZCwgMHhlZSwgMHhkYiwgMHhlNCwgMHhlNSwgMHhjYSwgMHhkNywgMHhkOSwKKyAgICAweGI0LCAweGM2LCAweGNhLCAweDk3LCAweGIxLCAweGI1LCAweDZlLCAweDkxLCAweDk3LCAweDNlLCAweDZlLCAweDc1LCAweDFkLCAweDUzLCAweDVjLCAweDEyLCAweDRhLCAweDUzLCAweDEyLCAweDQ5LCAweDUyLAorICAgIDB4MTEsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDcsIDB4NGYsIDB4MTAsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGYsIDB4NDQsIDB4NGQsIDB4MGYsIDB4NDQsIDB4NGMsIDB4MGYsIDB4NDMsIDB4NGIsCisgICAgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwKKyAgICAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLAorICAgIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsCisgICAgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwKKyAgICAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLAorICAgIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsCisgICAgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywKKyAgICAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLAorICAgIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksCisgICAgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwgMHgwMiwgMHgxZSwgMHgyMywgMHgwMSwgMHgxYiwgMHgxZiwgMHgwMywgMHgxZCwgMHgyMSwgMHhhNiwgMHhiNiwgMHhiOSwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGQ2LCAweGU0LCAweGU3LCAweDY4LCAweDliLCAweGEzLCAweDY1LCAweDlhLCAweGExLCAweDYyLCAweDk4LCAweGEwLCAweDYwLCAweDk2LCAweDlmLAorICAgIDB4NWUsIDB4OTQsIDB4OWMsIDB4NWIsIDB4OTIsIDB4OWEsIDB4NTksIDB4OTAsIDB4OTksIDB4NTYsIDB4OGUsIDB4OTYsIDB4NTUsIDB4OGMsIDB4OTUsIDB4NTIsIDB4OGEsIDB4OTMsIDB4NTAsIDB4ODksIDB4OTEsCisgICAgMHg0ZCwgMHg4NiwgMHg4ZiwgMHg0YiwgMHg4NSwgMHg4ZCwgMHg0OCwgMHg4MiwgMHg4YiwgMHg0NSwgMHg4MCwgMHg4OSwgMHg0MywgMHg3ZSwgMHg4OCwgMHg0MCwgMHg3YiwgMHg4NSwgMHgzZSwgMHg3YSwgMHg4MywKKyAgICAweDNjLCAweDc3LCAweDgwLCAweDNhLCAweDc2LCAweDdmLCAweDM3LCAweDczLCAweDdkLCAweDM0LCAweDcyLCAweDdiLCAweDMzLCAweDcwLCAweDdhLCAweDMwLCAweDZkLCAweDc3LCAweDJlLCAweDZjLCAweDc1LAorICAgIDB4MmMsIDB4NjksIDB4NzMsIDB4MmEsIDB4NjgsIDB4NzIsIDB4MjgsIDB4NjYsIDB4NzAsIDB4MjYsIDB4NjQsIDB4NmUsIDB4MjUsIDB4NjMsIDB4NmMsIDB4MjMsIDB4NjEsIDB4NmIsIDB4MjIsIDB4NjAsIDB4NjksCisgICAgMHgyMCwgMHg1ZSwgMHg2NywgMHgxZiwgMHg1YywgMHg2NywgMHgxZSwgMHg1YiwgMHg2NSwgMHgyMSwgMHg1ZCwgMHg2NywgMHgyOCwgMHg2MiwgMHg2YSwgMHgyYywgMHg2NCwgMHg2YywgMHgyYiwgMHg2MywgMHg2YywKKyAgICAweDJhLCAweDYyLCAweDZhLCAweDI3LCAweDVmLCAweDY4LCAweDIxLCAweDU5LCAweDYyLCAweDFhLCAweDUzLCAweDVkLCAweDE1LCAweDRmLCAweDU4LCAweDE1LCAweDRmLCAweDU3LCAweDEzLCAweDRkLCAweDU2LAorICAgIDB4MTMsIDB4NGQsIDB4NTYsIDB4MTIsIDB4NGIsIDB4NTQsIDB4MTIsIDB4NGEsIDB4NTMsIDB4MTEsIDB4NDgsIDB4NTEsIDB4MTEsIDB4NDcsIDB4NTAsIDB4MTEsIDB4NDcsIDB4NGYsIDB4MGYsIDB4NDYsIDB4NGYsCisgICAgMHgwZiwgMHg0NSwgMHg0ZSwgMHgwZiwgMHg0NCwgMHg0ZCwgMHgwZiwgMHg0NCwgMHg0YywgMHgwZiwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywKKyAgICAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLAorICAgIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsCisgICAgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwKKyAgICAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLAorICAgIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwKKyAgICAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLAorICAgIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsCisgICAgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwKKyAgICAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LAorICAgIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsCisgICAgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMywgMHgyNywgMHgwMiwgMHgyMSwgMHgyNiwgMHgwMiwgMHgyMCwgMHgyNCwKKyAgICAweDAyLCAweDFlLCAweDIzLCAweDAwLCAweDE3LCAweDFhLCAweDNkLCAweDViLCAweDVmLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGY4LCAweGZiLCAweGZiLCAweDg2LCAweGFmLCAweGI2LAorICAgIDB4NjMsIDB4OTgsIDB4YTEsIDB4NjEsIDB4OTcsIDB4OWYsIDB4NWYsIDB4OTUsIDB4OWQsIDB4NWQsIDB4OTMsIDB4OWMsIDB4NWEsIDB4OTEsIDB4OWEsIDB4NTgsIDB4OTAsIDB4OTksIDB4NTUsIDB4OGUsIDB4OTYsCisgICAgMHg1NCwgMHg4YywgMHg5NSwgMHg1MSwgMHg4YSwgMHg5MywgMHg0ZiwgMHg4OCwgMHg5MSwgMHg0ZCwgMHg4NywgMHg5MCwgMHg0YSwgMHg4NCwgMHg4ZCwgMHg0OCwgMHg4MywgMHg4YiwgMHg0NSwgMHg4MCwgMHg4YSwKKyAgICAweDQzLCAweDdmLCAweDg4LCAweDQwLCAweDdjLCAweDg2LCAweDNlLCAweDdhLCAweDg0LCAweDNjLCAweDc4LCAweDgxLCAweDNhLCAweDc2LCAweDdmLCAweDM3LCAweDc0LCAweDdkLCAweDM1LCAweDcyLCAweDdjLAorICAgIDB4MzMsIDB4NzEsIDB4N2EsIDB4MzEsIDB4NmUsIDB4NzksIDB4MmYsIDB4NmMsIDB4NzcsIDB4MmQsIDB4NmIsIDB4NzUsIDB4MmIsIDB4NjksIDB4NzMsIDB4MjksIDB4NjcsIDB4NzEsIDB4MjcsIDB4NjUsIDB4NmYsCisgICAgMHgyNiwgMHg2MywgMHg2ZCwgMHgyNCwgMHg2MiwgMHg2YywgMHgyMiwgMHg2MCwgMHg2YSwgMHgyMSwgMHg1ZiwgMHg2OSwgMHgxZiwgMHg1ZCwgMHg2NywgMHgxZSwgMHg1YiwgMHg2NiwgMHgxZCwgMHg1YSwgMHg2NCwKKyAgICAweDFjLCAweDU5LCAweDYzLCAweDFhLCAweDU3LCAweDYwLCAweDE5LCAweDU2LCAweDYwLCAweDE3LCAweDU1LCAweDVlLCAweDE3LCAweDU0LCAweDVkLCAweDE3LCAweDUyLCAweDVjLCAweDE2LCAweDUxLCAweDVhLAorICAgIDB4MTYsIDB4NTAsIDB4NWEsIDB4MTUsIDB4NGYsIDB4NTgsIDB4MTQsIDB4NGUsIDB4NTcsIDB4MTMsIDB4NGQsIDB4NTYsIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTIsIDB4NGIsIDB4NTQsIDB4MTIsIDB4NGEsIDB4NTMsCisgICAgMHgxMSwgMHg0OCwgMHg1MSwgMHgxMSwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwgMHgwZiwgMHg0NSwgMHg0ZSwgMHgwZiwgMHg0NCwgMHg0ZCwgMHgwZiwgMHg0NCwgMHg0YywKKyAgICAweDBmLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LAorICAgIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsCisgICAgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywKKyAgICAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsCisgICAgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsCisgICAgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwKKyAgICAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLAorICAgIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsCisgICAgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwKKyAgICAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LCAweDAyLCAweDIwLCAweDI0LCAweDAwLCAweDFiLCAweDFmLCAweDBiLCAweDI4LCAweDJjLCAweGNhLCAweGQ1LCAweGQ2LAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YjEsIDB4Y2MsIDB4ZDEsIDB4NjEsIDB4OTgsIDB4YTAsIDB4NWYsIDB4OTYsIDB4OWYsIDB4NWQsIDB4OTUsIDB4OWQsIDB4NWIsIDB4OTMsIDB4OWIsCisgICAgMHg1OSwgMHg5MSwgMHg5YSwgMHg1NywgMHg5MCwgMHg5OCwgMHg1NSwgMHg4ZSwgMHg5NywgMHg1MywgMHg4YywgMHg5NSwgMHg1MSwgMHg4YSwgMHg5MywgMHg0ZSwgMHg4OCwgMHg5MSwgMHg0YywgMHg4NiwgMHg4ZiwKKyAgICAweDRhLCAweDg1LCAweDhlLCAweDQ4LCAweDgyLCAweDhjLCAweDQ1LCAweDgxLCAweDhhLCAweDQyLCAweDdlLCAweDg4LCAweDQwLCAweDdkLCAweDg2LCAweDNlLCAweDdhLCAweDg0LCAweDNjLCAweDc4LCAweDgyLAorICAgIDB4M2EsIDB4NzcsIDB4ODAsIDB4MzgsIDB4NzUsIDB4N2UsIDB4MzUsIDB4NzMsIDB4N2MsIDB4MzMsIDB4NzEsIDB4N2IsIDB4MzEsIDB4NmYsIDB4NzksIDB4MmYsIDB4NmQsIDB4NzgsIDB4MmQsIDB4NmIsIDB4NzYsCisgICAgMHgyYiwgMHg2YSwgMHg3NCwgMHgyOSwgMHg2NywgMHg3MSwgMHgyNywgMHg2NiwgMHg3MCwgMHgyNiwgMHg2NSwgMHg2ZiwgMHgyNSwgMHg2MiwgMHg2YywgMHgyMiwgMHg2MSwgMHg2YSwgMHgyMSwgMHg1ZiwgMHg2YSwKKyAgICAweDIwLCAweDVmLCAweDY4LCAweDFmLCAweDVkLCAweDY3LCAweDFkLCAweDViLCAweDY1LCAweDFjLCAweDU5LCAweDY0LCAweDFiLCAweDU5LCAweDYyLCAweDFhLCAweDU3LCAweDYwLCAweDE5LCAweDU2LCAweDYwLAorICAgIDB4MTcsIDB4NTUsIDB4NWUsIDB4MTcsIDB4NTMsIDB4NWQsIDB4MTcsIDB4NTIsIDB4NWMsIDB4MTYsIDB4NTEsIDB4NWEsIDB4MTUsIDB4NTAsIDB4NTksIDB4MTUsIDB4NGYsIDB4NTgsIDB4MTQsIDB4NGUsIDB4NTcsCisgICAgMHgxMywgMHg0ZCwgMHg1NiwgMHgxMiwgMHg0YywgMHg1NSwgMHgxMiwgMHg0YiwgMHg1NCwgMHgxMSwgMHg0OSwgMHg1MiwgMHgxMSwgMHg0OCwgMHg1MSwgMHgxMSwgMHg0NywgMHg1MCwgMHgxMSwgMHg0NywgMHg0ZiwKKyAgICAweDBmLCAweDQ2LCAweDRmLCAweDBmLCAweDQ1LCAweDRlLCAweDBmLCAweDQ0LCAweDRkLCAweDBmLCAweDQ0LCAweDRjLCAweDBmLCAweDQzLCAweDRiLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LAorICAgIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsCisgICAgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwKKyAgICAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LAorICAgIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwKKyAgICAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LAorICAgIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsCisgICAgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwKKyAgICAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLAorICAgIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsCisgICAgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwKKyAgICAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJhLCAweDAzLCAweDI0LCAweDI5LCAweDAyLCAweDIzLCAweDI3LCAweDAyLCAweDIxLCAweDI2LAorICAgIDB4MDIsIDB4MWYsIDB4MjQsIDB4MDAsIDB4MTksIDB4MWQsIDB4NmEsIDB4ODMsIDB4ODcsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZGQsIDB4ZTksIDB4ZWIsIDB4NjQsIDB4OWEsIDB4YTIsCisgICAgMHg1ZCwgMHg5NSwgMHg5ZSwgMHg1YywgMHg5NCwgMHg5ZCwgMHg1YSwgMHg5MiwgMHg5YiwgMHg1NywgMHg5MCwgMHg5OSwgMHg1NSwgMHg4ZSwgMHg5OCwgMHg1NSwgMHg4ZSwgMHg5NywgMHg1MiwgMHg4YywgMHg5NSwKKyAgICAweDRmLCAweDg5LCAweDkyLCAweDRkLCAweDg3LCAweDkwLCAweDRiLCAweDg2LCAweDhmLCAweDQ5LCAweDg0LCAweDhkLCAweDQ4LCAweDgzLCAweDhjLCAweDQ1LCAweDgwLCAweDhhLCAweDQyLCAweDdmLCAweDg4LAorICAgIDB4M2YsIDB4N2MsIDB4ODYsIDB4M2UsIDB4N2IsIDB4ODQsIDB4M2MsIDB4NzksIDB4ODMsIDB4M2EsIDB4NzcsIDB4ODEsIDB4MzcsIDB4NzUsIDB4N2UsIDB4MzUsIDB4NzMsIDB4N2MsIDB4MzMsIDB4NzIsIDB4N2IsCisgICAgMHgzMiwgMHg2ZiwgMHg3YSwgMHgyZiwgMHg2ZSwgMHg3OCwgMHgyZCwgMHg2YywgMHg3NywgMHgyYiwgMHg2YSwgMHg3NCwgMHgyOSwgMHg2OCwgMHg3MiwgMHgyOCwgMHg2NywgMHg3MSwgMHgyNiwgMHg2NSwgMHg3MCwKKyAgICAweDI1LCAweDYzLCAweDZkLCAweDI0LCAweDYyLCAweDZjLCAweDIxLCAweDYwLCAweDZhLCAweDIwLCAweDVmLCAweDY5LCAweDFmLCAweDVlLCAweDY3LCAweDFlLCAweDVjLCAweDY2LCAweDFjLCAweDVhLCAweDY1LAorICAgIDB4MWIsIDB4NTksIDB4NjMsIDB4MWEsIDB4NTgsIDB4NjEsIDB4MTksIDB4NTYsIDB4NjAsIDB4MTksIDB4NTYsIDB4NjAsIDB4MTcsIDB4NTQsIDB4NWUsIDB4MTcsIDB4NTMsIDB4NWQsIDB4MTYsIDB4NTEsIDB4NWIsCisgICAgMHgxNiwgMHg1MSwgMHg1YSwgMHgxNSwgMHg1MCwgMHg1OSwgMHgxNCwgMHg0ZSwgMHg1OCwgMHgxNCwgMHg0ZSwgMHg1NywgMHgxMiwgMHg0YywgMHg1NSwgMHgxMiwgMHg0YywgMHg1NSwgMHgxMiwgMHg0YiwgMHg1NCwKKyAgICAweDExLCAweDQ5LCAweDUyLCAweDExLCAweDQ4LCAweDUxLCAweDExLCAweDQ3LCAweDUwLCAweDEwLCAweDQ3LCAweDRmLCAweDBmLCAweDQ2LCAweDRmLCAweDBmLCAweDQ1LCAweDRlLCAweDBmLCAweDQ0LCAweDRkLAorICAgIDB4MGYsIDB4NDQsIDB4NGMsIDB4MGYsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsCisgICAgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwKKyAgICAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LAorICAgIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsCisgICAgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwKKyAgICAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LAorICAgIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsCisgICAgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwKKyAgICAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLAorICAgIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsIDB4MDIsIDB4MjEsIDB4MjYsIDB4MDAsIDB4MWEsIDB4MWUsIDB4MjIsIDB4NDIsIDB4NDcsIDB4ZjksIDB4ZmIsIDB4ZmIsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmNywgMHhmYSwgMHhmYSwgMHg4MSwgMHhhZCwgMHhiNCwgMHg1YywgMHg5NCwgMHg5ZCwgMHg1YiwgMHg5NCwgMHg5YywgMHg1OSwgMHg5MiwgMHg5YiwgMHg1NywgMHg5MCwgMHg5OSwKKyAgICAweDU1LCAweDhmLCAweDk3LCAweDUyLCAweDhjLCAweDk2LCAweDUwLCAweDhiLCAweDk0LCAweDRmLCAweDhhLCAweDkzLCAweDRjLCAweDg4LCAweDkxLCAweDRhLCAweDg2LCAweDhmLCAweDQ5LCAweDg0LCAweDhlLAorICAgIDB4NDcsIDB4ODIsIDB4OGMsIDB4NDQsIDB4ODAsIDB4OGEsIDB4NDIsIDB4N2UsIDB4ODgsIDB4M2YsIDB4N2QsIDB4ODYsIDB4M2UsIDB4N2IsIDB4ODUsIDB4M2IsIDB4NzksIDB4ODIsIDB4MzksIDB4NzcsIDB4ODEsCisgICAgMHgzNywgMHg3NSwgMHg3ZiwgMHgzNSwgMHg3NCwgMHg3ZCwgMHgzMywgMHg3MiwgMHg3YiwgMHgzMiwgMHg3MCwgMHg3YSwgMHgzMCwgMHg2ZSwgMHg3OSwgMHgyZCwgMHg2ZCwgMHg3NywgMHgyYiwgMHg2YiwgMHg3NSwKKyAgICAweDJhLCAweDY5LCAweDc0LCAweDI4LCAweDY4LCAweDcyLCAweDI2LCAweDY1LCAweDcwLCAweDI2LCAweDY1LCAweDZmLCAweDI0LCAweDYzLCAweDZkLCAweDIzLCAweDYxLCAweDZiLCAweDIwLCAweDYwLCAweDY5LAorICAgIDB4MWYsIDB4NWUsIDB4NjgsIDB4MWUsIDB4NWQsIDB4NjcsIDB4MWQsIDB4NWMsIDB4NjUsIDB4MWMsIDB4NWEsIDB4NjUsIDB4MWEsIDB4NTgsIDB4NjIsIDB4MTksIDB4NTcsIDB4NjEsIDB4MTgsIDB4NTUsIDB4NWYsCisgICAgMHgxOCwgMHg1NSwgMHg1ZiwgMHgxNywgMHg1NCwgMHg1ZSwgMHgxNiwgMHg1MiwgMHg1YywgMHgxNiwgMHg1MSwgMHg1YiwgMHgxNSwgMHg1MCwgMHg1OSwgMHgxNSwgMHg1MCwgMHg1OSwgMHgxNCwgMHg0ZSwgMHg1OCwKKyAgICAweDE0LCAweDRlLCAweDU3LCAweDEyLCAweDRjLCAweDU1LCAweDEyLCAweDRjLCAweDU1LCAweDExLCAweDRhLCAweDUzLCAweDExLCAweDQ5LCAweDUyLCAweDExLCAweDQ4LCAweDUxLCAweDExLCAweDQ3LCAweDUwLAorICAgIDB4MTAsIDB4NDcsIDB4NGYsIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGYsIDB4NDQsIDB4NGQsIDB4MGYsIDB4NDQsIDB4NGMsIDB4MGYsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksCisgICAgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywKKyAgICAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLAorICAgIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsCisgICAgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsCisgICAgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwKKyAgICAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwKKyAgICAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLAorICAgIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsCisgICAgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwKKyAgICAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLAorICAgIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDMsIDB4MjcsIDB4MmMsIDB4MDMsIDB4MjUsIDB4MmEsIDB4MDMsIDB4MjQsIDB4MjksIDB4MDIsIDB4MjMsIDB4MjcsCisgICAgMHgwMCwgMHgxZiwgMHgyNCwgMHgwNSwgMHgyNCwgMHgyOSwgMHhhZSwgMHhiZSwgMHhjMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhhNCwgMHhjNCwgMHhjOSwgMHg1YSwgMHg5MywgMHg5YywKKyAgICAweDU4LCAweDkyLCAweDliLCAweDU3LCAweDkxLCAweDlhLCAweDU1LCAweDhmLCAweDk5LCAweDUyLCAweDhkLCAweDk2LCAweDUwLCAweDhjLCAweDk0LCAweDRmLCAweDhhLCAweDk0LCAweDRkLCAweDg5LCAweDkyLAorICAgIDB4NGIsIDB4ODgsIDB4OTEsIDB4NDksIDB4ODYsIDB4OGYsIDB4NDgsIDB4ODQsIDB4OGQsIDB4NDYsIDB4ODIsIDB4OGMsIDB4NDMsIDB4ODAsIDB4ODksIDB4NDEsIDB4N2YsIDB4ODgsIDB4M2YsIDB4N2MsIDB4ODYsCisgICAgMHgzZCwgMHg3YiwgMHg4NCwgMHgzYiwgMHg3OSwgMHg4MywgMHgzOSwgMHg3OCwgMHg4MSwgMHgzNywgMHg3NiwgMHg4MCwgMHgzNSwgMHg3NCwgMHg3ZSwgMHgzMywgMHg3MiwgMHg3YywgMHgzMiwgMHg3MCwgMHg3YSwKKyAgICAweDMwLCAweDZmLCAweDc5LCAweDJlLCAweDZkLCAweDc3LCAweDJjLCAweDZjLCAweDc2LCAweDJhLCAweDZhLCAweDc1LCAweDI4LCAweDY4LCAweDczLCAweDI2LCAweDY2LCAweDcwLCAweDI2LCAweDY1LCAweDZmLAorICAgIDB4MjQsIDB4NjQsIDB4NmUsIDB4MjMsIDB4NjIsIDB4NmMsIDB4MjIsIDB4NjAsIDB4NmIsIDB4MWYsIDB4NWYsIDB4NjgsIDB4MWUsIDB4NWQsIDB4NjgsIDB4MWQsIDB4NWQsIDB4NjYsIDB4MWMsIDB4NWIsIDB4NjUsCisgICAgMHgxYiwgMHg1OSwgMHg2NCwgMHgxYSwgMHg1OCwgMHg2MiwgMHgxOSwgMHg1NywgMHg2MSwgMHgxOCwgMHg1NSwgMHg1ZiwgMHgxOCwgMHg1NSwgMHg1ZiwgMHgxNywgMHg1NCwgMHg1ZSwgMHgxNiwgMHg1MiwgMHg1YywKKyAgICAweDE1LCAweDUwLCAweDVhLCAweDE1LCAweDUwLCAweDU5LCAweDE0LCAweDRmLCAweDU5LCAweDE0LCAweDRlLCAweDU4LCAweDEzLCAweDRkLCAweDU2LCAweDEyLCAweDRjLCAweDU1LCAweDEyLCAweDRjLCAweDU1LAorICAgIDB4MTEsIDB4NGEsIDB4NTMsIDB4MTEsIDB4NDksIDB4NTIsIDB4MTEsIDB4NDgsIDB4NTEsIDB4MTAsIDB4NDcsIDB4NTAsIDB4MTAsIDB4NDcsIDB4NGYsIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsCisgICAgMHgwZiwgMHg0NCwgMHg0ZCwgMHgwZiwgMHg0NCwgMHg0YywgMHgwZiwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwKKyAgICAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLAorICAgIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksCisgICAgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywKKyAgICAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLAorICAgIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsCisgICAgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwKKyAgICAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LAorICAgIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsCisgICAgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwgMHgwMiwgMHgyMiwgMHgyNywgMHgwMCwgMHgxYiwgMHgyMCwgMHg1ZSwgMHg3YSwgMHg3ZSwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGM3LCAweGRiLCAweGRlLCAweDU3LCAweDkyLCAweDliLCAweDU1LCAweDkwLCAweDk5LCAweDU0LCAweDhmLCAweDk5LCAweDUzLCAweDhmLCAweDk4LCAweDUyLCAweDhkLCAweDk2LAorICAgIDB4NTAsIDB4OGMsIDB4OTUsIDB4NGQsIDB4OGEsIDB4OTMsIDB4NGMsIDB4ODgsIDB4OTIsIDB4NGEsIDB4ODcsIDB4OTAsIDB4NDksIDB4ODYsIDB4OGYsIDB4NDcsIDB4ODQsIDB4OGQsIDB4NDUsIDB4ODIsIDB4OGIsCisgICAgMHg0MiwgMHg4MCwgMHg4YSwgMHg0MCwgMHg3ZSwgMHg4OCwgMHgzZSwgMHg3ZCwgMHg4NywgMHgzZCwgMHg3YiwgMHg4NSwgMHgzYiwgMHg3YSwgMHg4MywgMHgzOSwgMHg3OCwgMHg4MiwgMHgzNywgMHg3NywgMHg4MCwKKyAgICAweDM1LCAweDc1LCAweDdmLCAweDMzLCAweDcyLCAweDdkLCAweDMyLCAweDcxLCAweDdiLCAweDMwLCAweDZmLCAweDc5LCAweDJlLCAweDZlLCAweDc3LCAweDJkLCAweDZjLCAweDc3LCAweDJhLCAweDZiLCAweDc1LAorICAgIDB4MjgsIDB4NjksIDB4NzMsIDB4MjcsIDB4NjcsIDB4NzIsIDB4MjYsIDB4NjYsIDB4NzAsIDB4MjUsIDB4NjQsIDB4NmUsIDB4MjMsIDB4NjMsIDB4NmQsIDB4MjIsIDB4NjEsIDB4NmMsIDB4MjAsIDB4NWYsIDB4NjksCisgICAgMHgxZSwgMHg1ZSwgMHg2OCwgMHgxZCwgMHg1ZCwgMHg2NywgMHgxYywgMHg1YywgMHg2NiwgMHgxYiwgMHg1YSwgMHg2NCwgMHgxYSwgMHg1OSwgMHg2MywgMHgxOSwgMHg1NywgMHg2MiwgMHgxOSwgMHg1NywgMHg2MSwKKyAgICAweDE4LCAweDU1LCAweDVmLCAweDE4LCAweDU1LCAweDVmLCAweDE2LCAweDUzLCAweDVkLCAweDE2LCAweDUyLCAweDVjLCAweDE1LCAweDUwLCAweDVhLCAweDE0LCAweDUwLCAweDU5LCAweDE0LCAweDRmLCAweDU5LAorICAgIDB4MTMsIDB4NGQsIDB4NTcsIDB4MTMsIDB4NGQsIDB4NTYsIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTEsIDB4NGIsIDB4NTQsIDB4MTEsIDB4NGEsIDB4NTMsIDB4MTEsIDB4NDksIDB4NTIsIDB4MTEsIDB4NDgsIDB4NTEsCisgICAgMHgxMCwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwgMHgwZiwgMHg0NSwgMHg0ZSwgMHgwZiwgMHg0NCwgMHg0ZCwgMHgwZiwgMHg0NCwgMHg0YywgMHgwZSwgMHg0MiwgMHg0YSwKKyAgICAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LAorICAgIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsCisgICAgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwKKyAgICAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLCAweDE5LCAweDNmLCAweDQ2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLAorICAgIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsCisgICAgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwKKyAgICAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLAorICAgIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsCisgICAgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMywgMHgyOCwgMHgyZSwgMHgwMywgMHgyNywgMHgyYywgMHgwMywgMHgyNSwgMHgyYSwgMHgwMywgMHgyNCwgMHgyOSwKKyAgICAweDAwLCAweDFjLCAweDIxLCAweDI3LCAweDQ4LCAweDRlLCAweGY5LCAweGZiLCAweGZiLCAweGZmLCAweGZmLCAweGZmLCAweGUyLCAweGVjLCAweGVlLCAweDY0LCAweDlhLCAweGE0LCAweDUzLCAweDkwLCAweDk4LAorICAgIDB4NTIsIDB4OGUsIDB4OTcsIDB4NTEsIDB4OGQsIDB4OTcsIDB4NTAsIDB4OGMsIDB4OTUsIDB4NGUsIDB4OGEsIDB4OTQsIDB4NGMsIDB4ODksIDB4OTIsIDB4NGEsIDB4ODgsIDB4OTEsIDB4NDksIDB4ODYsIDB4OTAsCisgICAgMHg0NywgMHg4NSwgMHg4ZSwgMHg0NSwgMHg4MywgMHg4ZCwgMHg0MywgMHg4MSwgMHg4YiwgMHg0MSwgMHg3ZiwgMHg4OSwgMHgzZiwgMHg3ZSwgMHg4OCwgMHgzZCwgMHg3YywgMHg4NiwgMHgzZCwgMHg3YiwgMHg4NSwKKyAgICAweDNiLCAweDc5LCAweDgzLCAweDM4LCAweDc4LCAweDgxLCAweDM2LCAweDc2LCAweDgwLCAweDM0LCAweDc1LCAweDdlLCAweDMyLCAweDczLCAweDdkLCAweDMyLCAweDcxLCAweDdjLCAweDMwLCAweDcwLCAweDc5LAorICAgIDB4MmUsIDB4NmUsIDB4NzcsIDB4MmMsIDB4NmMsIDB4NzYsIDB4MmIsIDB4NmIsIDB4NzYsIDB4MjgsIDB4NmEsIDB4NzMsIDB4MjcsIDB4NjgsIDB4NzMsIDB4MjYsIDB4NjYsIDB4NzEsIDB4MjUsIDB4NjUsIDB4NmYsCisgICAgMHgyMywgMHg2MywgMHg2ZCwgMHgyMiwgMHg2MiwgMHg2YywgMHgyMSwgMHg2MSwgMHg2YiwgMHgxZiwgMHg1ZSwgMHg2OSwgMHgxZCwgMHg1ZSwgMHg2NywgMHgxYywgMHg1YywgMHg2NywgMHgxYiwgMHg1YiwgMHg2NSwKKyAgICAweDFhLCAweDVhLCAweDYzLCAweDE5LCAweDU4LCAweDYzLCAweDE4LCAweDU2LCAweDYxLCAweDE4LCAweDU2LCAweDYwLCAweDE4LCAweDU1LCAweDVmLCAweDE3LCAweDU0LCAweDVlLCAweDE2LCAweDUzLCAweDVkLAorICAgIDB4MTUsIDB4NTEsIDB4NWIsIDB4MTUsIDB4NTAsIDB4NWEsIDB4MTQsIDB4NTAsIDB4NTksIDB4MTQsIDB4NGYsIDB4NTksIDB4MTMsIDB4NGQsIDB4NTcsIDB4MTMsIDB4NGQsIDB4NTYsIDB4MTEsIDB4NGIsIDB4NTQsCisgICAgMHgxMSwgMHg0YiwgMHg1NCwgMHgxMSwgMHg0YSwgMHg1MywgMHgxMSwgMHg0OSwgMHg1MiwgMHgxMCwgMHg0OCwgMHg1MSwgMHgxMCwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwKKyAgICAweDBmLCAweDQ1LCAweDRlLCAweDBmLCAweDQ0LCAweDRkLCAweDBlLCAweDQzLCAweDRiLCAweDBlLCAweDQyLCAweDRhLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LAorICAgIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsCisgICAgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwKKyAgICAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDMwLAorICAgIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDA3LCAweDVkLCAweDY5LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsCisgICAgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LAorICAgIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsCisgICAgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwKKyAgICAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLAorICAgIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsCisgICAgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwKKyAgICAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAzLCAweDI1LCAweDJiLCAweDAwLCAweDIwLCAweDI1LCAweDBkLCAweDJkLCAweDMzLCAweGMzLCAweGQwLCAweGQyLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZjMsIDB4ZjgsIDB4ZjgsIDB4NzYsIDB4YTUsIDB4YWQsIDB4NTEsIDB4OGUsIDB4OTcsIDB4NTAsIDB4OGQsIDB4OTYsIDB4NGUsIDB4OGIsIDB4OTUsIDB4NGQsIDB4OGIsIDB4OTQsIDB4NGMsIDB4OGEsIDB4OTMsCisgICAgMHg0YSwgMHg4OCwgMHg5MiwgMHg0OSwgMHg4NywgMHg5MSwgMHg0NywgMHg4NSwgMHg4ZiwgMHg0NSwgMHg4MywgMHg4ZSwgMHg0NCwgMHg4MywgMHg4YywgMHg0MiwgMHg4MiwgMHg4YiwgMHg0MCwgMHg4MCwgMHg4OSwKKyAgICAweDNmLCAweDdlLCAweDg4LCAweDNkLCAweDdjLCAweDg2LCAweDNjLCAweDdiLCAweDg1LCAweDNhLCAweDdhLCAweDg0LCAweDM4LCAweDc3LCAweDgyLCAweDM1LCAweDc2LCAweDgwLCAweDM0LCAweDc1LCAweDdmLAorICAgIDB4MzIsIDB4NzMsIDB4N2QsIDB4MzEsIDB4NzEsIDB4N2MsIDB4MzAsIDB4NzAsIDB4N2EsIDB4MmUsIDB4NmYsIDB4NzgsIDB4MmMsIDB4NmMsIDB4NzYsIDB4MmIsIDB4NmMsIDB4NzYsIDB4MjksIDB4NmEsIDB4NzQsCisgICAgMHgyNywgMHg2OSwgMHg3MywgMHgyNiwgMHg2NywgMHg3MiwgMHgyNSwgMHg2NSwgMHg3MCwgMHgyMywgMHg2NCwgMHg2ZSwgMHgyMiwgMHg2MiwgMHg2YywgMHgyMSwgMHg2MiwgMHg2YywgMHgyMCwgMHg2MCwgMHg2YSwKKyAgICAweDFlLCAweDVlLCAweDY4LCAweDFjLCAweDVkLCAweDY3LCAweDFiLCAweDViLCAweDY2LCAweDFhLCAweDViLCAweDY0LCAweDE5LCAweDU5LCAweDYzLCAweDE5LCAweDU4LCAweDYzLCAweDE4LCAweDU2LCAweDYxLAorICAgIDB4MTgsIDB4NTYsIDB4NjAsIDB4MTcsIDB4NTQsIDB4NWUsIDB4MTcsIDB4NTQsIDB4NWUsIDB4MTUsIDB4NTIsIDB4NWMsIDB4MTUsIDB4NTEsIDB4NWIsIDB4MTQsIDB4NTAsIDB4NWEsIDB4MTQsIDB4NTAsIDB4NTksCisgICAgMHgxMywgMHg0ZSwgMHg1OCwgMHgxMywgMHg0ZCwgMHg1NywgMHgxMywgMHg0ZCwgMHg1NiwgMHgxMSwgMHg0YiwgMHg1NCwgMHgxMSwgMHg0YiwgMHg1NCwgMHgxMSwgMHg0YSwgMHg1MywgMHgxMCwgMHg0OSwgMHg1MiwKKyAgICAweDEwLCAweDQ4LCAweDUxLCAweDEwLCAweDQ3LCAweDUwLCAweDEwLCAweDQ3LCAweDRmLCAweDBmLCAweDQ2LCAweDRmLCAweDBmLCAweDQ1LCAweDRlLCAweDBmLCAweDQ0LCAweDRkLCAweDBlLCAweDQzLCAweDRiLAorICAgIDB4MGUsIDB4NDIsIDB4NGEsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsCisgICAgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwKKyAgICAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LAorICAgIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MDksIDB4MmEsIDB4MzAsIDB4MTksIDB4M2YsIDB4NDYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwKKyAgICAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywKKyAgICAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LAorICAgIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsCisgICAgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwKKyAgICAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLCAweDAzLCAweDI5LCAweDJmLCAweDAzLCAweDI4LCAweDJlLCAweDAzLCAweDI3LCAweDJjLCAweDAxLCAweDI0LCAweDI5LAorICAgIDB4MDEsIDB4MjIsIDB4MjcsIDB4ODksIDB4OWYsIDB4YTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4OGIsIDB4YjQsIDB4YmEsIDB4NGUsIDB4OGMsIDB4OTYsIDB4NGQsIDB4OGIsIDB4OTUsCisgICAgMHg0YywgMHg4YiwgMHg5NCwgMHg0YiwgMHg4OSwgMHg5MywgMHg0OSwgMHg4OCwgMHg5MiwgMHg0OCwgMHg4OCwgMHg5MSwgMHg0NywgMHg4NiwgMHg5MCwgMHg0NiwgMHg4NSwgMHg4ZiwgMHg0NCwgMHg4NCwgMHg4ZCwKKyAgICAweDQyLCAweDgyLCAweDhjLCAweDQwLCAweDgwLCAweDhhLCAweDNmLCAweDgwLCAweDhhLCAweDNkLCAweDdlLCAweDg4LCAweDNjLCAweDdjLCAweDg2LCAweDNiLCAweDdiLCAweDg1LCAweDM5LCAweDc5LCAweDgzLAorICAgIDB4MzcsIDB4NzgsIDB4ODIsIDB4MzYsIDB4NzYsIDB4ODAsIDB4MzMsIDB4NzUsIDB4N2UsIDB4MzIsIDB4NzMsIDB4N2QsIDB4MzEsIDB4NzIsIDB4N2MsIDB4MmYsIDB4NzAsIDB4N2IsIDB4MmUsIDB4NmYsIDB4NzksCisgICAgMHgyYywgMHg2ZCwgMHg3NywgMHgyYSwgMHg2YiwgMHg3NSwgMHgyOSwgMHg2YSwgMHg3NCwgMHgyNywgMHg2OCwgMHg3MywgMHgyNiwgMHg2OCwgMHg3MiwgMHgyNSwgMHg2NiwgMHg3MSwgMHgyMywgMHg2NCwgMHg2ZiwKKyAgICAweDIyLCAweDYzLCAweDZkLCAweDIxLCAweDYyLCAweDZjLCAweDIwLCAweDYxLCAweDZiLCAweDFmLCAweDVmLCAweDZhLCAweDFlLCAweDVlLCAweDY4LCAweDFiLCAweDVjLCAweDY2LCAweDFhLCAweDViLCAweDY1LAorICAgIDB4MWEsIDB4NWIsIDB4NjQsIDB4MTksIDB4NTksIDB4NjMsIDB4MTgsIDB4NTcsIDB4NjIsIDB4MTgsIDB4NTYsIDB4NjEsIDB4MTcsIDB4NTUsIDB4NWYsIDB4MTcsIDB4NTQsIDB4NWUsIDB4MTcsIDB4NTQsIDB4NWUsCisgICAgMHgxNSwgMHg1MiwgMHg1YywgMHgxNCwgMHg1MSwgMHg1YiwgMHgxNCwgMHg1MCwgMHg1YSwgMHgxMywgMHg0ZiwgMHg1OCwgMHgxMywgMHg0ZSwgMHg1OCwgMHgxMywgMHg0ZCwgMHg1NywgMHgxMiwgMHg0YywgMHg1NSwKKyAgICAweDExLCAweDRiLCAweDU0LCAweDExLCAweDRiLCAweDU0LCAweDExLCAweDRhLCAweDUzLCAweDEwLCAweDQ5LCAweDUyLCAweDEwLCAweDQ4LCAweDUxLCAweDEwLCAweDQ3LCAweDUwLCAweDEwLCAweDQ3LCAweDRmLAorICAgIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGUsIDB4NDMsIDB4NGMsIDB4MGUsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDIsIDB4NGEsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsCisgICAgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwKKyAgICAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLAorICAgIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmYsIDB4MzUsIDB4MGEsIDB4MmUsIDB4MzQsCisgICAgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4MDcsIDB4NWQsIDB4NjksIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywKKyAgICAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLAorICAgIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsCisgICAgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywKKyAgICAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDUwLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LAorICAgIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsCisgICAgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwKKyAgICAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLCAweDA0LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LAorICAgIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsCisgICAgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwgMHgwNCwgMHgzNiwgMHgzZCwgMHgwNCwgMHgzNSwgMHgzYywgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwKKyAgICAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LCAweDAzLCAweDJlLCAweDM0LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJhLCAweDMwLAorICAgIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDIsIDB4MjYsIDB4MmMsIDB4MDAsIDB4MWYsIDB4MjQsIDB4NTYsIDB4NzMsIDB4NzgsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHg5ZCwgMHhjMCwgMHhjNiwgMHg0YiwgMHg4YiwgMHg5NSwgMHg0YSwgMHg4YSwgMHg5NCwgMHg0OSwgMHg4OSwgMHg5MywgMHg0OCwgMHg4OCwgMHg5MiwgMHg0NywgMHg4NywgMHg5MSwgMHg0NywgMHg4NiwgMHg5MSwKKyAgICAweDQ1LCAweDg1LCAweDhmLCAweDQ0LCAweDg0LCAweDhlLCAweDQzLCAweDgzLCAweDhkLCAweDQxLCAweDgyLCAweDhiLCAweDNmLCAweDgwLCAweDhhLCAweDNlLCAweDdmLCAweDg5LCAweDNkLCAweDdlLCAweDg4LAorICAgIDB4M2IsIDB4N2MsIDB4ODYsIDB4M2EsIDB4N2EsIDB4ODQsIDB4MzgsIDB4NzksIDB4ODMsIDB4MzcsIDB4NzgsIDB4ODIsIDB4MzUsIDB4NzYsIDB4ODEsIDB4MzMsIDB4NzQsIDB4N2YsIDB4MzIsIDB4NzQsIDB4N2QsCisgICAgMHgzMCwgMHg3MiwgMHg3YywgMHgyZiwgMHg3MSwgMHg3YiwgMHgyZCwgMHg2ZiwgMHg3OSwgMHgyYywgMHg2ZCwgMHg3OCwgMHgyYSwgMHg2YywgMHg3NiwgMHgyOSwgMHg2YSwgMHg3NCwgMHgyNywgMHg2OSwgMHg3MywKKyAgICAweDI2LCAweDY4LCAweDczLCAweDI1LCAweDY3LCAweDcxLCAweDIzLCAweDY1LCAweDcwLCAweDIyLCAweDYzLCAweDZlLCAweDIxLCAweDYyLCAweDZkLCAweDIwLCAweDYxLCAweDZiLCAweDFmLCAweDYwLCAweDZiLAorICAgIDB4MWUsIDB4NWYsIDB4NjksIDB4MWQsIDB4NWQsIDB4NjcsIDB4MWIsIDB4NWMsIDB4NjYsIDB4MWEsIDB4NWIsIDB4NjUsIDB4MTksIDB4NWEsIDB4NjQsIDB4MTgsIDB4NTgsIDB4NjIsIDB4MTgsIDB4NTcsIDB4NjEsCisgICAgMHgxOCwgMHg1NiwgMHg2MCwgMHgxNywgMHg1NSwgMHg1ZiwgMHgxNiwgMHg1MywgMHg1ZCwgMHgxNiwgMHg1MywgMHg1ZCwgMHgxNSwgMHg1MiwgMHg1YywgMHgxNCwgMHg1MSwgMHg1YiwgMHgxNCwgMHg1MCwgMHg1YSwKKyAgICAweDEzLCAweDRmLCAweDU4LCAweDEzLCAweDRlLCAweDU4LCAweDEyLCAweDRjLCAweDU2LCAweDEyLCAweDRjLCAweDU1LCAweDExLCAweDRiLCAweDU0LCAweDExLCAweDRiLCAweDU0LCAweDEwLCAweDRhLCAweDUzLAorICAgIDB4MTAsIDB4NDksIDB4NTIsIDB4MTAsIDB4NDgsIDB4NTEsIDB4MTAsIDB4NDcsIDB4NTAsIDB4MTAsIDB4NDcsIDB4NGYsIDB4MGYsIDB4NDYsIDB4NGYsIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGUsIDB4NDMsIDB4NGMsCisgICAgMHgwZSwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MiwgMHg0YSwgMHgwZSwgMHg0MSwgMHg0OSwgMHgwZCwgMHg0MCwgMHg0OCwgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwKKyAgICAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLCAweDBjLCAweDNiLCAweDQyLCAweDBjLCAweDNhLCAweDQxLCAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLAorICAgIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsIDB4MGIsIDB4MzQsIDB4M2IsIDB4MGIsIDB4MzQsIDB4M2EsIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsCisgICAgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwgMHgwYSwgMHgyZSwgMHgzNCwgMHgwOSwgMHgyYSwgMHgzMCwgMHgxOSwgMHgzZiwgMHg0NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgwNywgMHg1ZSwgMHg2YSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwKKyAgICAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU4LCAweDYzLCAweDA2LCAweDU3LCAweDYzLAorICAgIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjIsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTYsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjEsCisgICAgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1NCwgMHg1ZiwgMHgwNiwgMHg1MywgMHg1ZSwgMHgwNiwgMHg1MywgMHg1ZSwKKyAgICAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDVjLCAweDA1LCAweDUxLCAweDViLCAweDA1LCAweDUwLCAweDViLAorICAgIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTksIDB4MDUsIDB4NGUsIDB4NTgsIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGQsIDB4NTcsCisgICAgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YiwgMHg1NSwgMHgwNSwgMHg0YSwgMHg1NCwgMHgwNSwgMHg0OSwgMHg1MywgMHgwNSwgMHg0OCwgMHg1MiwKKyAgICAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLCAweDA1LCAweDQ2LCAweDRmLCAweDA1LCAweDQ1LCAweDRlLCAweDA1LCAweDQ0LCAweDRkLCAweDA1LCAweDQzLCAweDRkLAorICAgIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsIDB4MDQsIDB4NDAsIDB4NDksIDB4MDQsIDB4M2YsIDB4NDgsIDB4MDQsIDB4M2UsIDB4NDcsIDB4MDQsIDB4M2UsIDB4NDYsCisgICAgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywgMHgwNCwgMHgzYSwgMHg0MiwgMHgwNCwgMHgzOSwgMHg0MSwgMHgwNCwgMHgzOCwgMHgzZiwgMHgwNCwgMHgzNywgMHgzZSwKKyAgICAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLCAweDAzLCAweDMzLCAweDNhLCAweDAzLCAweDMyLCAweDM4LCAweDAzLCAweDMxLCAweDM3LCAweDAzLCAweDJmLCAweDM2LAorICAgIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsIDB4MDMsIDB4MmEsIDB4MzAsIDB4MDMsIDB4MjksIDB4MmYsIDB4MDMsIDB4MjgsIDB4MmUsIDB4MDAsIDB4MWYsIDB4MjUsCisgICAgMHgzMiwgMHg1NSwgMHg1YSwgMHhmYSwgMHhmYywgMHhmYywgMHhmZiwgMHhmZiwgMHhmZiwgMHhhYSwgMHhjOCwgMHhjZCwgMHg0OCwgMHg4YSwgMHg5NCwgMHg0NywgMHg4OSwgMHg5MywgMHg0NywgMHg4OCwgMHg5MiwKKyAgICAweDQ3LCAweDg3LCAweDkxLCAweDQ2LCAweDg3LCAweDkwLCAweDQ0LCAweDg1LCAweDhmLCAweDQzLCAweDg0LCAweDhlLCAweDQyLCAweDgzLCAweDhkLCAweDQxLCAweDgyLCAweDhkLCAweDNmLCAweDgxLCAweDhiLAorICAgIDB4M2QsIDB4N2YsIDB4ODksIDB4M2QsIDB4N2UsIDB4ODksIDB4M2IsIDB4N2QsIDB4ODcsIDB4M2EsIDB4N2MsIDB4ODYsIDB4MzgsIDB4N2EsIDB4ODQsIDB4MzcsIDB4NzksIDB4ODMsIDB4MzYsIDB4NzgsIDB4ODIsCisgICAgMHgzNCwgMHg3NiwgMHg4MCwgMHgzMiwgMHg3NSwgMHg3ZiwgMHgzMSwgMHg3MywgMHg3ZSwgMHgyZiwgMHg3MiwgMHg3YywgMHgyZSwgMHg3MCwgMHg3YiwgMHgyZCwgMHg3MCwgMHg3OSwgMHgyYiwgMHg2ZSwgMHg3OCwKKyAgICAweDJhLCAweDZjLCAweDc3LCAweDI4LCAweDZiLCAweDc1LCAweDI3LCAweDY5LCAweDczLCAweDI2LCAweDY5LCAweDczLCAweDI1LCAweDY2LCAweDcxLCAweDIzLCAweDY2LCAweDcwLCAweDIyLCAweDY0LCAweDZmLAorICAgIDB4MjEsIDB4NjIsIDB4NmUsIDB4MjAsIDB4NjIsIDB4NmMsIDB4MWYsIDB4NjAsIDB4NmIsIDB4MWUsIDB4NjAsIDB4NmEsIDB4MWQsIDB4NWUsIDB4NjgsIDB4MWMsIDB4NWMsIDB4NjcsIDB4MWEsIDB4NWMsIDB4NjUsCisgICAgMHgxOSwgMHg1YSwgMHg2NSwgMHgxOCwgMHg1OSwgMHg2MywgMHgxOCwgMHg1OCwgMHg2MSwgMHgxOCwgMHg1NywgMHg2MSwgMHgxNywgMHg1NSwgMHg2MCwgMHgxNywgMHg1NSwgMHg1ZiwgMHgxNiwgMHg1MywgMHg1ZCwKKyAgICAweDE1LCAweDUzLCAweDVkLCAweDE0LCAweDUyLCAweDVjLCAweDE0LCAweDUxLCAweDViLCAweDEzLCAweDRmLCAweDU5LCAweDEzLCAweDRmLCAweDU4LCAweDEzLCAweDRlLCAweDU4LCAweDEyLCAweDRjLCAweDU2LAorICAgIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTEsIDB4NGIsIDB4NTQsIDB4MTAsIDB4NGIsIDB4NTQsIDB4MTAsIDB4NGEsIDB4NTMsIDB4MTAsIDB4NDksIDB4NTIsIDB4MTAsIDB4NDgsIDB4NTEsIDB4MTAsIDB4NDcsIDB4NTAsCisgICAgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwgMHgwZSwgMHg0NCwgMHg0ZCwgMHgwZSwgMHg0MywgMHg0YywgMHgwZSwgMHg0MywgMHg0YiwgMHgwZSwgMHg0MiwgMHg0YSwgMHgwZSwgMHg0MSwgMHg0OSwKKyAgICAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LCAweDBkLCAweDNlLCAweDQ1LCAweDBkLCAweDNkLCAweDQ1LCAweDBkLCAweDNjLCAweDQ0LCAweDBkLCAweDNiLCAweDQzLAorICAgIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsIDB4MGMsIDB4MzgsIDB4M2YsIDB4MGMsIDB4MzcsIDB4M2UsIDB4MGMsIDB4MzYsIDB4M2QsIDB4MGIsIDB4MzUsIDB4M2MsCisgICAgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwgMHgwYiwgMHgzMiwgMHgzOCwgMHgwYSwgMHgzMSwgMHgzNywgMHgwYSwgMHgzMCwgMHgzNiwgMHgwYSwgMHgyZiwgMHgzNSwKKyAgICAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDJhLCAweDJmLCAweDFiLCAweDQyLCAweDQ4LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHgxMSwgMHg2NCwgMHg3MCwKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OSwgMHg2NSwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDY0LCAweDA2LCAweDU4LCAweDYzLAorICAgIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjMsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsIDB4MDYsIDB4NTcsIDB4NjIsCisgICAgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MSwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NSwgMHg2MCwgMHgwNiwgMHg1NCwgMHg2MCwKKyAgICAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLCAweDA2LCAweDUzLCAweDVlLCAweDA1LCAweDUzLCAweDVlLCAweDA1LCAweDUyLCAweDVkLCAweDA1LCAweDUyLCAweDVkLAorICAgIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWIsIDB4MDUsIDB4NTAsIDB4NWEsIDB4MDUsIDB4NGYsIDB4NWEsIDB4MDUsIDB4NGUsIDB4NTksCisgICAgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0ZCwgMHg1NywgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YywgMHg1NiwgMHgwNSwgMHg0YiwgMHg1NSwKKyAgICAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLCAweDA1LCAweDQ4LCAweDUyLCAweDA1LCAweDQ4LCAweDUxLCAweDA1LCAweDQ3LCAweDUxLCAweDA1LCAweDQ3LCAweDUwLAorICAgIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsIDB4MDUsIDB4NDMsIDB4NGQsIDB4MDQsIDB4NDMsIDB4NGMsIDB4MDQsIDB4NDIsIDB4NGIsIDB4MDQsIDB4NDEsIDB4NGEsCisgICAgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywgMHgwNCwgMHgzZSwgMHg0NiwgMHgwNCwgMHgzZCwgMHg0NSwgMHgwNCwgMHgzYywgMHg0NCwgMHgwNCwgMHgzYiwgMHg0MywKKyAgICAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLCAweDA0LCAweDM3LCAweDNlLCAweDA0LCAweDM2LCAweDNkLCAweDA0LCAweDM1LCAweDNjLCAweDA0LCAweDMzLCAweDNiLAorICAgIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsIDB4MDMsIDB4MmYsIDB4MzYsIDB4MDMsIDB4MmUsIDB4MzQsIDB4MDMsIDB4MmQsIDB4MzMsIDB4MDMsIDB4MmMsIDB4MzIsCisgICAgMHgwMywgMHgyYSwgMHgzMCwgMHgwMywgMHgyOSwgMHgyZiwgMHgwMCwgMHgyMiwgMHgyNywgMHgxYywgMHg0MSwgMHg0NiwgMHhkZSwgMHhlNSwgMHhlNiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhiMywgMHhjZSwgMHhkMiwKKyAgICAweDQ2LCAweDg4LCAweDkyLCAweDQ1LCAweDg4LCAweDkyLCAweDQ1LCAweDg3LCAweDkxLCAweDQzLCAweDg1LCAweDhmLCAweDQzLCAweDg1LCAweDhmLCAweDQyLCAweDg0LCAweDhlLCAweDQxLCAweDgzLCAweDhkLAorICAgIDB4NDAsIDB4ODIsIDB4OGQsIDB4M2YsIDB4ODIsIDB4OGIsIDB4M2QsIDB4ODAsIDB4OGEsIDB4M2MsIDB4N2YsIDB4ODksIDB4M2IsIDB4N2UsIDB4ODgsIDB4M2EsIDB4N2MsIDB4ODcsIDB4MzgsIDB4N2IsIDB4ODUsCisgICAgMHgzNywgMHg3YSwgMHg4NCwgMHgzNiwgMHg3OSwgMHg4MywgMHgzNCwgMHg3NywgMHg4MSwgMHgzMywgMHg3NiwgMHg4MCwgMHgzMSwgMHg3NCwgMHg3ZSwgMHgzMSwgMHg3MywgMHg3ZSwgMHgzMCwgMHg3MiwgMHg3YywKKyAgICAweDJkLCAweDcxLCAweDdhLCAweDJjLCAweDZmLCAweDdhLCAweDJiLCAweDZlLCAweDc4LCAweDI5LCAweDZjLCAweDc3LCAweDI4LCAweDZiLCAweDc2LCAweDI3LCAweDZhLCAweDc0LCAweDI2LCAweDY4LCAweDcyLAorICAgIDB4MjUsIDB4NjcsIDB4NzEsIDB4MjQsIDB4NjYsIDB4NzEsIDB4MjIsIDB4NjUsIDB4NmYsIDB4MjEsIDB4NjMsIDB4NmYsIDB4MjAsIDB4NjIsIDB4NmQsIDB4MWYsIDB4NjEsIDB4NmMsIDB4MWUsIDB4NjAsIDB4NmEsCisgICAgMHgxZCwgMHg1ZiwgMHg2OSwgMHgxYywgMHg1ZCwgMHg2OCwgMHgxYiwgMHg1YywgMHg2NiwgMHgxOSwgMHg1YiwgMHg2NSwgMHgxOCwgMHg1OSwgMHg2NCwgMHgxOCwgMHg1OSwgMHg2MywgMHgxOCwgMHg1OCwgMHg2MSwKKyAgICAweDE3LCAweDU2LCAweDYxLCAweDE3LCAweDU1LCAweDYwLCAweDE2LCAweDU0LCAweDVlLCAweDE2LCAweDUzLCAweDVkLCAweDE1LCAweDUzLCAweDVkLCAweDE0LCAweDUyLCAweDVjLCAweDEzLCAweDUwLCAweDVhLAorICAgIDB4MTMsIDB4NGYsIDB4NTksIDB4MTMsIDB4NGYsIDB4NTgsIDB4MTIsIDB4NGQsIDB4NTcsIDB4MTIsIDB4NGMsIDB4NTYsIDB4MTIsIDB4NGMsIDB4NTUsIDB4MTEsIDB4NGIsIDB4NTQsIDB4MTAsIDB4NGIsIDB4NTQsCisgICAgMHgxMCwgMHg0YSwgMHg1MywgMHgxMCwgMHg0OSwgMHg1MiwgMHgxMCwgMHg0OCwgMHg1MSwgMHgxMCwgMHg0NywgMHg1MCwgMHgxMCwgMHg0NywgMHg0ZiwgMHgwZiwgMHg0NiwgMHg0ZiwgMHgwZSwgMHg0NCwgMHg0ZCwKKyAgICAweDBlLCAweDQzLCAweDRjLCAweDBlLCAweDQzLCAweDRiLCAweDBlLCAweDQyLCAweDRhLCAweDBlLCAweDQxLCAweDQ5LCAweDBkLCAweDQwLCAweDQ4LCAweDBkLCAweDNmLCAweDQ3LCAweDBkLCAweDNmLCAweDQ2LAorICAgIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsIDB4MGQsIDB4M2IsIDB4NDMsIDB4MGMsIDB4M2IsIDB4NDIsIDB4MGMsIDB4M2EsIDB4NDEsIDB4MGMsIDB4MzksIDB4NDAsCisgICAgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwgMHgwYiwgMHgzNSwgMHgzYywgMHgwYiwgMHgzNCwgMHgzYiwgMHgwYiwgMHgzNCwgMHgzYSwgMHgwYiwgMHgzMywgMHgzOSwKKyAgICAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LCAweDBhLCAweDJmLCAweDM1LCAweDBhLCAweDJlLCAweDM0LCAweDA5LCAweDI4LCAweDJkLCAweDJiLCAweDRmLCAweDU1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDM3LCAweDZkLCAweDc2LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsIDB4MDYsIDB4NTgsIDB4NjMsCisgICAgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MiwgMHgwNiwgMHg1NiwgMHg2MSwgMHgwNiwgMHg1NiwgMHg2MSwKKyAgICAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU0LCAweDYwLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDU0LCAweDVmLCAweDA2LCAweDUzLCAweDVlLAorICAgIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTIsIDB4NWQsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWMsIDB4MDUsIDB4NTEsIDB4NWIsCisgICAgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OSwgMHgwNSwgMHg0ZSwgMHg1OCwgMHgwNSwgMHg0ZCwgMHg1NywKKyAgICAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRiLCAweDU1LCAweDA1LCAweDRhLCAweDU0LCAweDA1LCAweDQ5LCAweDUzLAorICAgIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTAsIDB4MDUsIDB4NDYsIDB4NGYsIDB4MDUsIDB4NDUsIDB4NGUsIDB4MDUsIDB4NDQsIDB4NGQsCisgICAgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwgMHgwNCwgMHg0MSwgMHg0YSwgMHgwNCwgMHg0MCwgMHg0OSwgMHgwNCwgMHgzZiwgMHg0OCwgMHgwNCwgMHgzZSwgMHg0NywKKyAgICAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LCAweDA0LCAweDNiLCAweDQzLCAweDA0LCAweDNhLCAweDQyLCAweDA0LCAweDM5LCAweDQxLCAweDA0LCAweDM4LCAweDNmLAorICAgIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsIDB4MDQsIDB4MzMsIDB4M2IsIDB4MDMsIDB4MzMsIDB4M2EsIDB4MDMsIDB4MzIsIDB4MzgsIDB4MDMsIDB4MzEsIDB4MzcsCisgICAgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywgMHgwMywgMHgyYywgMHgzMiwgMHgwMywgMHgyYiwgMHgzMSwgMHgwMCwgMHgyNCwgMHgyYSwgMHgxMiwgMHgzNiwgMHgzYiwKKyAgICAweGM3LCAweGQ0LCAweGQ2LCAweGZmLCAweGZmLCAweGZmLCAweGI2LCAweGQwLCAweGQ1LCAweDQ3LCAweDg4LCAweDkzLCAweDQzLCAweDg2LCAweDkwLCAweDQxLCAweDg1LCAweDkwLCAweDQxLCAweDg0LCAweDhmLAorICAgIDB4NDAsIDB4ODMsIDB4OGUsIDB4M2YsIDB4ODIsIDB4OGQsIDB4M2YsIDB4ODIsIDB4OGMsIDB4M2UsIDB4ODEsIDB4OGMsIDB4M2MsIDB4ODAsIDB4OGIsIDB4M2MsIDB4N2YsIDB4ODksIDB4M2IsIDB4N2UsIDB4ODksCisgICAgMHgzYSwgMHg3ZCwgMHg4NywgMHgzOCwgMHg3YywgMHg4NiwgMHgzNywgMHg3YSwgMHg4NSwgMHgzNiwgMHg3YSwgMHg4NCwgMHgzNCwgMHg3OCwgMHg4MywgMHgzMywgMHg3NywgMHg4MSwgMHgzMiwgMHg3NSwgMHg4MCwKKyAgICAweDMxLCAweDc0LCAweDdmLCAweDMwLCAweDczLCAweDdkLCAweDJmLCAweDcyLCAweDdkLCAweDJkLCAweDcwLCAweDdiLCAweDJiLCAweDZmLCAweDc5LCAweDJhLCAweDZlLCAweDc5LCAweDI5LCAweDZkLCAweDc3LAorICAgIDB4MjcsIDB4NmIsIDB4NzYsIDB4MjYsIDB4NjksIDB4NzQsIDB4MjYsIDB4NjksIDB4NzMsIDB4MjUsIDB4NjcsIDB4NzEsIDB4MjQsIDB4NjcsIDB4NzEsIDB4MjMsIDB4NjUsIDB4NzAsIDB4MjAsIDB4NjQsIDB4NmUsCisgICAgMHgxZiwgMHg2MiwgMHg2ZCwgMHgxZSwgMHg2MSwgMHg2YywgMHgxZSwgMHg2MSwgMHg2YiwgMHgxZCwgMHg1ZiwgMHg2OSwgMHgxYywgMHg1ZSwgMHg2OSwgMHgxYiwgMHg1ZCwgMHg2NywgMHgxYSwgMHg1YiwgMHg2NiwKKyAgICAweDE4LCAweDVhLCAweDY0LCAweDE4LCAweDU5LCAweDY0LCAweDE4LCAweDU5LCAweDYyLCAweDE3LCAweDU3LCAweDYxLCAweDE3LCAweDU2LCAweDYxLCAweDE2LCAweDU0LCAweDVmLCAweDE2LCAweDU0LCAweDVlLAorICAgIDB4MTUsIDB4NTMsIDB4NWQsIDB4MTUsIDB4NTMsIDB4NWQsIDB4MTQsIDB4NTIsIDB4NWMsIDB4MTMsIDB4NTAsIDB4NWEsIDB4MTMsIDB4NGYsIDB4NTksIDB4MTIsIDB4NGUsIDB4NTcsIDB4MTIsIDB4NGQsIDB4NTcsCisgICAgMHgxMiwgMHg0YywgMHg1NiwgMHgxMiwgMHg0YywgMHg1NSwgMHgxMCwgMHg0YiwgMHg1NCwgMHgxMCwgMHg0YiwgMHg1NCwgMHgxMCwgMHg0YSwgMHg1MywgMHgxMCwgMHg0OSwgMHg1MiwgMHgxMCwgMHg0OCwgMHg1MSwKKyAgICAweDEwLCAweDQ3LCAweDUwLCAweDEwLCAweDQ3LCAweDRmLCAweDBlLCAweDQ1LCAweDRlLCAweDBlLCAweDQ0LCAweDRkLCAweDBlLCAweDQzLCAweDRjLCAweDBlLCAweDQzLCAweDRiLCAweDBlLCAweDQyLCAweDRhLAorICAgIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsIDB4MGQsIDB4M2YsIDB4NDYsIDB4MGQsIDB4M2UsIDB4NDUsIDB4MGQsIDB4M2QsIDB4NDUsIDB4MGQsIDB4M2MsIDB4NDQsCisgICAgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwgMHgwYywgMHgzOSwgMHg0MCwgMHgwYywgMHgzOCwgMHgzZiwgMHgwYywgMHgzNywgMHgzZSwgMHgwYywgMHgzNiwgMHgzZCwKKyAgICAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLCAweDBiLCAweDMzLCAweDM5LCAweDBiLCAweDMyLCAweDM4LCAweDBhLCAweDMxLCAweDM3LCAweDBhLCAweDMwLCAweDM2LAorICAgIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmQsIDB4MzIsIDB4MGEsIDB4MmUsIDB4MzQsIDB4NTYsIDB4NjgsIDB4NmIsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzMsIDB4NzUsIDB4NzUsIDB4MTksIDB4NjcsIDB4NzIsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWEsIDB4NjYsCisgICAgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LCAweDA2LCAweDU5LCAweDY1LAorICAgIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsIDB4MDYsIDB4NTgsIDB4NjQsCisgICAgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywgMHgwNiwgMHg1NywgMHg2MiwgMHgwNiwgMHg1NywgMHg2MiwKKyAgICAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU1LCAweDYxLCAweDA2LCAweDU1LCAweDYwLCAweDA2LCAweDU1LCAweDYwLAorICAgIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDYsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTMsIDB4NWUsIDB4MDUsIDB4NTIsIDB4NWQsCisgICAgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YiwgMHgwNSwgMHg1MCwgMHg1YSwgMHgwNSwgMHg0ZiwgMHg1YSwKKyAgICAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRkLCAweDU3LCAweDA1LCAweDRjLCAweDU2LCAweDA1LCAweDRjLCAweDU2LAorICAgIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsIDB4MDUsIDB4NDgsIDB4NTIsIDB4MDUsIDB4NDgsIDB4NTEsIDB4MDUsIDB4NDcsIDB4NTEsCisgICAgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwgMHgwNSwgMHg0MywgMHg0ZCwgMHgwNCwgMHg0MywgMHg0YywgMHgwNCwgMHg0MiwgMHg0YiwKKyAgICAweDA0LCAweDQxLCAweDRhLCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LCAweDA0LCAweDNlLCAweDQ2LCAweDA0LCAweDNkLCAweDQ1LCAweDA0LCAweDNjLCAweDQ0LAorICAgIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4M2YsIDB4MDQsIDB4MzcsIDB4M2UsIDB4MDQsIDB4MzYsIDB4M2QsIDB4MDQsIDB4MzUsIDB4M2MsCisgICAgMHgwNCwgMHgzMywgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzNywgMHgwMywgMHgyZiwgMHgzNiwgMHgwMywgMHgyZSwgMHgzNCwgMHgwMywgMHgyZCwgMHgzMywKKyAgICAweDAzLCAweDJjLCAweDMyLCAweDAwLCAweDI2LCAweDJjLCAweDBiLCAweDMxLCAweDM3LCAweGFkLCAweGJmLCAweGMyLCAweGZmLCAweGZmLCAweGZmLCAweGI0LCAweGNmLCAweGQ0LCAweDQ0LCAweDg3LCAweDkyLAorICAgIDB4NDAsIDB4ODQsIDB4OGYsIDB4NDAsIDB4ODQsIDB4OGYsIDB4M2UsIDB4ODMsIDB4OGUsIDB4M2QsIDB4ODIsIDB4OGQsIDB4M2QsIDB4ODEsIDB4OGMsIDB4M2MsIDB4ODEsIDB4OGIsIDB4M2MsIDB4ODAsIDB4OGEsCisgICAgMHgzYiwgMHg3ZiwgMHg4YSwgMHgzYSwgMHg3ZSwgMHg4OSwgMHgzOSwgMHg3ZCwgMHg4OCwgMHgzOCwgMHg3YywgMHg4NywgMHgzNywgMHg3YiwgMHg4NiwgMHgzNSwgMHg3YSwgMHg4NCwgMHgzNCwgMHg3OCwgMHg4NCwKKyAgICAweDMzLCAweDc4LCAweDgyLCAweDMyLCAweDc3LCAweDgyLCAweDMxLCAweDc2LCAweDgwLCAweDMwLCAweDc0LCAweDdlLCAweDJmLCAweDczLCAweDdlLCAweDJlLCAweDcxLCAweDdjLCAweDJkLCAweDcxLCAweDdjLAorICAgIDB4MmIsIDB4NmYsIDB4N2EsIDB4MjksIDB4NmUsIDB4NzgsIDB4MjgsIDB4NmQsIDB4NzcsIDB4MjcsIDB4NmMsIDB4NzYsIDB4MjYsIDB4NmEsIDB4NzUsIDB4MjYsIDB4NjksIDB4NzQsIDB4MjQsIDB4NjgsIDB4NzIsCisgICAgMHgyMywgMHg2NiwgMHg3MCwgMHgyMiwgMHg2NSwgMHg3MCwgMHgyMSwgMHg2NCwgMHg2ZiwgMHgxZiwgMHg2MywgMHg2ZCwgMHgxZSwgMHg2MSwgMHg2ZCwgMHgxZCwgMHg2MCwgMHg2YiwgMHgxYywgMHg1ZiwgMHg2YSwKKyAgICAweDFjLCAweDVlLCAweDY5LCAweDFiLCAweDVlLCAweDY4LCAweDFhLCAweDVjLCAweDY3LCAweDE5LCAweDVhLCAweDY1LCAweDE4LCAweDVhLCAweDY0LCAweDE4LCAweDU5LCAweDYzLCAweDE3LCAweDU4LCAweDYyLAorICAgIDB4MTcsIDB4NTcsIDB4NjEsIDB4MTYsIDB4NTUsIDB4NjAsIDB4MTYsIDB4NTQsIDB4NWYsIDB4MTUsIDB4NTQsIDB4NWUsIDB4MTUsIDB4NTMsIDB4NWQsIDB4MTQsIDB4NTIsIDB4NWMsIDB4MTMsIDB4NTEsIDB4NWIsCisgICAgMHgxMywgMHg1MCwgMHg1YSwgMHgxMywgMHg0ZiwgMHg1OSwgMHgxMiwgMHg0ZSwgMHg1NywgMHgxMiwgMHg0ZCwgMHg1NywgMHgxMiwgMHg0YywgMHg1NiwgMHgxMSwgMHg0YywgMHg1NSwgMHgxMCwgMHg0YiwgMHg1NCwKKyAgICAweDEwLCAweDRiLCAweDU0LCAweDEwLCAweDRhLCAweDUzLCAweDEwLCAweDQ5LCAweDUyLCAweDEwLCAweDQ4LCAweDUxLCAweDEwLCAweDQ3LCAweDUwLCAweDBmLCAweDQ2LCAweDRlLCAweDBlLCAweDQ1LCAweDRlLAorICAgIDB4MGUsIDB4NDQsIDB4NGQsIDB4MGUsIDB4NDMsIDB4NGMsIDB4MGUsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDIsIDB4NGEsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsCisgICAgMHgwZCwgMHgzZiwgMHg0NiwgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwKKyAgICAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLAorICAgIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmQsIDB4MzIsIDB4MDksIDB4MjksIDB4MmYsIDB4MzYsIDB4NTcsIDB4NWMsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NmYsIDB4NzQsIDB4NzUsIDB4MjMsIDB4NmEsIDB4NzQsCisgICAgMHgwNywgMHg1ZCwgMHg2OSwgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywKKyAgICAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LCAweDA2LCAweDViLCAweDY3LAorICAgIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsIDB4MDYsIDB4NWIsIDB4NjcsCisgICAgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YiwgMHg2NywgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwgMHgwNiwgMHg1YSwgMHg2NiwKKyAgICAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LCAweDA2LCAweDVhLCAweDY2LAorICAgIDB4MDYsIDB4NWEsIDB4NjYsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsIDB4MDYsIDB4NTksIDB4NjUsCisgICAgMHgwNiwgMHg1OSwgMHg2NSwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2NCwgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1OCwgMHg2MywgMHgwNiwgMHg1NywgMHg2MywKKyAgICAweDA2LCAweDU3LCAweDYzLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU3LCAweDYyLCAweDA2LCAweDU2LCAweDYyLCAweDA2LCAweDU2LCAweDYxLCAweDA2LCAweDU2LCAweDYxLAorICAgIDB4MDYsIDB4NTUsIDB4NjEsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTUsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NjAsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTQsIDB4NWYsIDB4MDYsIDB4NTMsIDB4NWYsCisgICAgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZSwgMHgwNSwgMHg1MywgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1ZCwgMHgwNSwgMHg1MiwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YywgMHgwNSwgMHg1MSwgMHg1YiwKKyAgICAweDA1LCAweDUwLCAweDViLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRmLCAweDVhLCAweDA1LCAweDRlLCAweDU5LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRlLCAweDU4LCAweDA1LCAweDRkLCAweDU3LAorICAgIDB4MDUsIDB4NGQsIDB4NTcsIDB4MDUsIDB4NGMsIDB4NTYsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGIsIDB4NTUsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NGEsIDB4NTQsIDB4MDUsIDB4NDksIDB4NTMsCisgICAgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0OCwgMHg1MSwgMHgwNSwgMHg0NywgMHg1MCwgMHgwNSwgMHg0NiwgMHg1MCwgMHgwNSwgMHg0NiwgMHg0ZiwgMHgwNSwgMHg0NSwgMHg0ZSwgMHgwNSwgMHg0NCwgMHg0ZCwKKyAgICAweDA1LCAweDQzLCAweDRjLCAweDA0LCAweDQyLCAweDRiLCAweDA0LCAweDQyLCAweDRhLCAweDA0LCAweDQxLCAweDQ5LCAweDA0LCAweDQwLCAweDQ5LCAweDA0LCAweDNmLCAweDQ4LCAweDA0LCAweDNlLCAweDQ3LAorICAgIDB4MDQsIDB4M2QsIDB4NDUsIDB4MDQsIDB4M2MsIDB4NDQsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MDQsIDB4M2EsIDB4NDIsIDB4MDQsIDB4MzksIDB4NDEsIDB4MDQsIDB4MzgsIDB4NDAsIDB4MDQsIDB4MzgsIDB4M2YsCisgICAgMHgwNCwgMHgzNiwgMHgzZSwgMHgwNCwgMHgzNSwgMHgzZCwgMHgwNCwgMHgzNCwgMHgzYiwgMHgwMywgMHgzMywgMHgzYSwgMHgwMywgMHgzMiwgMHgzOCwgMHgwMywgMHgzMSwgMHgzOCwgMHgwMywgMHgzMCwgMHgzNiwKKyAgICAweDAzLCAweDJlLCAweDM1LCAweDAzLCAweDJkLCAweDMzLCAweDAzLCAweDJjLCAweDMyLCAweDAzLCAweDJiLCAweDMxLCAweDAxLCAweDI4LCAweDJlLCAweDA4LCAweDMwLCAweDM1LCAweDlkLCAweGIyLCAweGI1LAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YWMsIDB4Y2EsIDB4Y2UsIDB4NDAsIDB4ODUsIDB4OGYsIDB4M2MsIDB4ODIsIDB4OGQsIDB4M2MsIDB4ODEsIDB4OGMsIDB4M2MsIDB4ODEsIDB4OGMsIDB4M2MsIDB4ODAsIDB4OGIsCisgICAgMHgzYiwgMHg3ZiwgMHg4YSwgMHgzYSwgMHg3ZSwgMHg4OSwgMHgzYSwgMHg3ZSwgMHg4OCwgMHgzOSwgMHg3ZCwgMHg4OCwgMHgzOCwgMHg3YywgMHg4NiwgMHgzNywgMHg3YiwgMHg4NiwgMHgzNiwgMHg3YSwgMHg4NSwKKyAgICAweDM0LCAweDc5LCAweDg0LCAweDMzLCAweDc4LCAweDgzLCAweDMyLCAweDc3LCAweDgyLCAweDMxLCAweDc2LCAweDgwLCAweDMxLCAweDc1LCAweDgwLCAweDMwLCAweDc0LCAweDdlLCAweDJmLCAweDczLCAweDdlLAorICAgIDB4MmUsIDB4NzEsIDB4N2MsIDB4MmQsIDB4NzAsIDB4N2IsIDB4MmMsIDB4NmYsIDB4N2EsIDB4MmEsIDB4NmUsIDB4NzksIDB4MjgsIDB4NmQsIDB4NzcsIDB4MjcsIDB4NmIsIDB4NzUsIDB4MjYsIDB4NjksIDB4NzQsCisgICAgMHgyNiwgMHg2OSwgMHg3MywgMHgyNSwgMHg2OCwgMHg3MiwgMHgyNCwgMHg2NywgMHg3MSwgMHgyMywgMHg2NSwgMHg3MCwgMHgyMSwgMHg2MywgMHg2ZiwgMHgyMCwgMHg2MywgMHg2ZCwgMHgxZiwgMHg2MSwgMHg2ZCwKKyAgICAweDFlLCAweDYxLCAweDZiLCAweDFkLCAweDYwLCAweDZhLCAweDFjLCAweDVlLCAweDY5LCAweDFiLCAweDVkLCAweDY3LCAweDFiLCAweDVjLCAweDY2LCAweDFhLCAweDViLCAweDY2LCAweDE4LCAweDU5LCAweDYzLAorICAgIDB4MTgsIDB4NTgsIDB4NjMsIDB4MTgsIDB4NTcsIDB4NjEsIDB4MTcsIDB4NTYsIDB4NjAsIDB4MTcsIDB4NTUsIDB4NjAsIDB4MTYsIDB4NTQsIDB4NWUsIDB4MTYsIDB4NTMsIDB4NWQsIDB4MTQsIDB4NTIsIDB4NWMsCisgICAgMHgxNCwgMHg1MSwgMHg1YiwgMHgxMywgMHg1MCwgMHg1YSwgMHgxMywgMHg0ZiwgMHg1OSwgMHgxMywgMHg0ZiwgMHg1OCwgMHgxMywgMHg0ZSwgMHg1OCwgMHgxMiwgMHg0YywgMHg1NiwgMHgxMSwgMHg0YiwgMHg1NCwKKyAgICAweDExLCAweDRiLCAweDU0LCAweDExLCAweDRhLCAweDUzLCAweDEwLCAweDQ5LCAweDUyLCAweDEwLCAweDQ4LCAweDUxLCAweDEwLCAweDQ4LCAweDUxLCAweDEwLCAweDQ3LCAweDUwLCAweDBmLCAweDQ2LCAweDRmLAorICAgIDB4MGYsIDB4NDUsIDB4NGUsIDB4MGYsIDB4NDQsIDB4NGQsIDB4MGUsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDMsIDB4NGIsIDB4MGUsIDB4NDEsIDB4NDksIDB4MGQsIDB4NDAsIDB4NDgsIDB4MGQsIDB4M2YsIDB4NDcsCisgICAgMHgwZCwgMHgzZiwgMHg0NywgMHgwZCwgMHgzZSwgMHg0NSwgMHgwZCwgMHgzZCwgMHg0NSwgMHgwZCwgMHgzYywgMHg0NCwgMHgwZCwgMHgzYiwgMHg0MywgMHgwYywgMHgzYiwgMHg0MiwgMHgwYywgMHgzYSwgMHg0MSwKKyAgICAweDBjLCAweDM5LCAweDQwLCAweDBjLCAweDM4LCAweDNmLCAweDBjLCAweDM3LCAweDNlLCAweDBjLCAweDM2LCAweDNkLCAweDBiLCAweDM1LCAweDNjLCAweDBiLCAweDM0LCAweDNiLCAweDBiLCAweDM0LCAweDNhLAorICAgIDB4MGIsIDB4MzMsIDB4MzksIDB4MGIsIDB4MzIsIDB4MzgsIDB4MGEsIDB4MzEsIDB4MzcsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MzAsIDB4MzYsIDB4MGEsIDB4MmUsIDB4MzQsIDB4MGEsIDB4MmQsIDB4MzIsCisgICAgMHgwYSwgMHgyYywgMHgzMiwgMHgxMiwgMHgzNywgMHgzZSwgMHgzZSwgMHg1YywgMHg2MSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg1YiwgMHg3MywgMHg3NiwgMHgzOSwgMHg2ZSwgMHg3NiwgMHgyZCwgMHg2YywgMHg3NSwKKyAgICAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LAorICAgIDB4MmQsIDB4NmMsIDB4NzUsIDB4MmQsIDB4NmMsIDB4NzUsIDB4MmQsIDB4NmMsIDB4NzUsIDB4MmQsIDB4NmMsIDB4NzUsIDB4MmQsIDB4NmMsIDB4NzUsIDB4MmQsIDB4NmMsIDB4NzUsIDB4MmQsIDB4NmMsIDB4NzUsCisgICAgMHgyZCwgMHg2YywgMHg3NSwgMHgyZCwgMHg2YywgMHg3NSwgMHgyZCwgMHg2YywgMHg3NSwgMHgyZCwgMHg2YywgMHg3NSwgMHgyZCwgMHg2YywgMHg3NSwgMHgyZCwgMHg2YywgMHg3NSwgMHgyZCwgMHg2YywgMHg3NSwKKyAgICAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LCAweDJkLCAweDZjLCAweDc1LAorICAgIDB4MmQsIDB4NmMsIDB4NzUsIDB4MmQsIDB4NmMsIDB4NzUsIDB4MmQsIDB4NmIsIDB4NzQsIDB4MmQsIDB4NmIsIDB4NzQsIDB4MmQsIDB4NmIsIDB4NzQsIDB4MmQsIDB4NmIsIDB4NzQsIDB4MmQsIDB4NmIsIDB4NzQsCisgICAgMHgyZCwgMHg2YiwgMHg3NCwgMHgyZCwgMHg2YiwgMHg3NCwgMHgyZCwgMHg2YiwgMHg3NCwgMHgyZCwgMHg2YiwgMHg3NCwgMHgyZCwgMHg2YiwgMHg3NCwgMHgyZCwgMHg2YiwgMHg3MywgMHgyZCwgMHg2YiwgMHg3MywKKyAgICAweDJkLCAweDZiLCAweDczLCAweDJkLCAweDZiLCAweDczLCAweDJjLCAweDZhLCAweDczLCAweDJjLCAweDY5LCAweDcyLCAweDJjLCAweDY5LCAweDcyLCAweDJjLCAweDY5LCAweDcyLCAweDJkLCAweDY5LCAweDcyLAorICAgIDB4MmQsIDB4NjksIDB4NzIsIDB4MmQsIDB4NjksIDB4NzIsIDB4MmQsIDB4NjksIDB4NzIsIDB4MmQsIDB4NjksIDB4NzIsIDB4MmQsIDB4NjksIDB4NzIsIDB4MmQsIDB4NjksIDB4NzIsIDB4MmQsIDB4NjksIDB4NzIsCisgICAgMHgyZCwgMHg2OSwgMHg3MSwgMHgyZCwgMHg2OSwgMHg3MSwgMHgyYywgMHg2OCwgMHg3MSwgMHgyYywgMHg2OCwgMHg3MSwgMHgyYywgMHg2OCwgMHg3MiwgMHgyYywgMHg2OCwgMHg3MiwgMHgyYywgMHg2OCwgMHg3MCwKKyAgICAweDJjLCAweDY4LCAweDcwLCAweDJjLCAweDY3LCAweDcwLCAweDJjLCAweDY3LCAweDcwLCAweDJjLCAweDY3LCAweDcwLCAweDJkLCAweDY3LCAweDcwLCAweDJkLCAweDY3LCAweDZmLCAweDJjLCAweDY3LCAweDZmLAorICAgIDB4MmQsIDB4NjcsIDB4NmYsIDB4MmQsIDB4NjYsIDB4NmYsIDB4MmQsIDB4NjYsIDB4NmYsIDB4MmUsIDB4NjcsIDB4NmYsIDB4MmUsIDB4NjcsIDB4NmYsIDB4MmUsIDB4NjcsIDB4NmYsIDB4MmUsIDB4NjcsIDB4NmYsCisgICAgMHgyZCwgMHg2NywgMHg2ZiwgMHgyZSwgMHg2NiwgMHg2ZiwgMHgyZSwgMHg2NiwgMHg2ZSwgMHgyZSwgMHg2NiwgMHg2ZSwgMHgyZSwgMHg2NiwgMHg2ZSwgMHgyZiwgMHg2NiwgMHg2ZCwgMHgyZSwgMHg2NSwgMHg2ZSwKKyAgICAweDJmLCAweDY1LCAweDZlLCAweDJmLCAweDY1LCAweDZlLCAweDMwLCAweDY1LCAweDZkLCAweDJmLCAweDY1LCAweDZjLCAweDMwLCAweDY1LCAweDZjLCAweDMxLCAweDY1LCAweDZjLCAweDMwLCAweDY0LCAweDZjLAorICAgIDB4MzAsIDB4NjQsIDB4NmIsIDB4MzEsIDB4NjQsIDB4NmMsIDB4MzEsIDB4NjQsIDB4NmIsIDB4MzEsIDB4NjQsIDB4NmIsIDB4MzEsIDB4NjMsIDB4NmIsIDB4MzEsIDB4NjMsIDB4NmEsIDB4MzEsIDB4NjIsIDB4NmEsCisgICAgMHgzMSwgMHg2MiwgMHg2YSwgMHgzMSwgMHg2MiwgMHg2OSwgMHgzMSwgMHg2MSwgMHg2OSwgMHgzMiwgMHg2MSwgMHg2OSwgMHgzMSwgMHg2MSwgMHg2OSwgMHgzMSwgMHg2MSwgMHg2NywgMHgzMSwgMHg2MCwgMHg2NiwKKyAgICAweDMxLCAweDYwLCAweDY2LCAweDMxLCAweDVmLCAweDY2LCAweDMxLCAweDVmLCAweDY1LCAweDMxLCAweDVmLCAweDY1LCAweDMwLCAweDVlLCAweDY0LCAweDMwLCAweDVkLCAweDYzLCAweDMwLCAweDVkLCAweDYzLAorICAgIDB4MzAsIDB4NWIsIDB4NjIsIDB4MmMsIDB4NTYsIDB4NWQsIDB4NjksIDB4ODksIDB4OGQsIDB4YWYsIDB4YzIsIDB4YzQsIDB4OWQsIDB4YjQsIDB4YjcsIDB4NjcsIDB4ODksIDB4OGYsIDB4NjQsIDB4ODcsIDB4OGMsCisgICAgMHg2NCwgMHg4NywgMHg4YywgMHg2MywgMHg4NywgMHg4YywgMHg2MywgMHg4NywgMHg4YywgMHg2MiwgMHg4NSwgMHg4YiwgMHg2MiwgMHg4NSwgMHg4YiwgMHg2MiwgMHg4NCwgMHg4YSwgMHg2MiwgMHg4NCwgMHg4YSwKKyAgICAweDYxLCAweDg0LCAweDhhLCAweDYwLCAweDgzLCAweDg4LCAweDYwLCAweDgzLCAweDg4LCAweDVmLCAweDgzLCAweDg4LCAweDVlLCAweDgxLCAweDg3LCAweDVlLCAweDgxLCAweDg2LCAweDVkLCAweDgwLCAweDg2LAorICAgIDB4NWMsIDB4N2YsIDB4ODUsIDB4NWIsIDB4N2YsIDB4ODUsIDB4NWEsIDB4N2UsIDB4ODQsIDB4NTksIDB4N2QsIDB4ODIsIDB4NTksIDB4N2MsIDB4ODIsIDB4NTgsIDB4N2MsIDB4ODIsIDB4NTcsIDB4N2IsIDB4ODEsCisgICAgMHg1NywgMHg3YiwgMHg4MCwgMHg1NSwgMHg3YSwgMHg3ZiwgMHg1NCwgMHg3OSwgMHg3ZSwgMHg1NCwgMHg3NywgMHg3ZCwgMHg1NCwgMHg3NywgMHg3ZCwgMHg1MiwgMHg3NywgMHg3YywgMHg1MSwgMHg3NiwgMHg3YiwKKyAgICAweDUwLCAweDc1LCAweDdiLCAweDRmLCAweDc0LCAweDc5LCAweDRmLCAweDczLCAweDc5LCAweDRlLCAweDcyLCAweDc4LCAweDRkLCAweDcyLCAweDc4LCAweDRjLCAweDcxLCAweDc3LCAweDRiLCAweDcwLCAweDc2LAorICAgIDB4NGIsIDB4NzAsIDB4NzYsIDB4NGEsIDB4NzAsIDB4NzUsIDB4NDksIDB4NmYsIDB4NzUsIDB4NDksIDB4NmUsIDB4NzQsIDB4NDgsIDB4NmQsIDB4NzMsIDB4NDcsIDB4NmMsIDB4NzEsIDB4NDcsIDB4NmMsIDB4NzEsCisgICAgMHg0NiwgMHg2YiwgMHg3MSwgMHg0NiwgMHg2YiwgMHg3MSwgMHg0NSwgMHg2YSwgMHg3MCwgMHg0NSwgMHg2YSwgMHg3MCwgMHg0NSwgMHg2YSwgMHg3MCwgMHg0NSwgMHg2OCwgMHg2ZSwgMHg0NSwgMHg2OCwgMHg2ZSwKKyAgICAweDQ1LCAweDY4LCAweDZlLCAweDQ0LCAweDY4LCAweDZkLCAweDQ0LCAweDY4LCAweDZkLCAweDQzLCAweDY3LCAweDZjLCAweDQzLCAweDY3LCAweDZjLCAweDQyLCAweDY1LCAweDZjLCAweDQyLCAweDY1LCAweDZjLAorICAgIDB4NDIsIDB4NjUsIDB4NmIsIDB4NDIsIDB4NjUsIDB4NmIsIDB4NDEsIDB4NjUsIDB4NmIsIDB4NDEsIDB4NjQsIDB4NmEsIDB4NDEsIDB4NjQsIDB4NmEsIDB4NDAsIDB4NjMsIDB4NjksIDB4NDAsIDB4NjMsIDB4NjksCisgICAgMHg0MCwgMHg2MywgMHg2OSwgMHgzZiwgMHg2MywgMHg2OCwgMHgzZiwgMHg2MywgMHg2OCwgMHgzZiwgMHg2MiwgMHg2OCwgMHgzZiwgMHg2MSwgMHg2NywgMHgzZiwgMHg2MSwgMHg2NywgMHgzZiwgMHg2MSwgMHg2NywKKyAgICAweDNmLCAweDYwLCAweDY3LCAweDNlLCAweDYwLCAweDY1LCAweDNlLCAweDYwLCAweDY1LCAweDNlLCAweDYwLCAweDY1LCAweDNlLCAweDVmLCAweDY1LCAweDNlLCAweDVmLCAweDY1LCAweDNkLCAweDVmLCAweDY0LAorICAgIDB4M2QsIDB4NWYsIDB4NjQsIDB4M2QsIDB4NWUsIDB4NjQsIDB4M2QsIDB4NWUsIDB4NjMsIDB4M2QsIDB4NWUsIDB4NjMsIDB4M2QsIDB4NWQsIDB4NjMsIDB4M2QsIDB4NWQsIDB4NjMsIDB4M2MsIDB4NWMsIDB4NjIsCisgICAgMHgzYiwgMHg1YywgMHg2MSwgMHgzYywgMHg1YiwgMHg2MCwgMHgzYywgMHg1YiwgMHg2MCwgMHgzYywgMHg1YiwgMHg2MCwgMHg0YSwgMHg2MywgMHg2NywgMHg2NywgMHg3MCwgMHg3MSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODMsIDB4ODMsIDB4ODMsCisgICAgMHg4MywgMHg4MywgMHg4MywgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwgMHg4NiwgMHg4NiwKKyAgICAweDg2LCAweDg2LCAweDg2LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg4LAorICAgIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksCisgICAgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwKKyAgICAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg1LCAweDg1LCAweDg1LAorICAgIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsCisgICAgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLAorICAgIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLAorICAgIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgICAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywKKyAgICAweDgzLCAweDgzLCAweDgzLCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg2LCAweDg2LCAweDg2LAorICAgIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsCisgICAgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywgMHg4NywKKyAgICAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LAorICAgIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODMsIDB4ODMsIDB4ODMsCisgICAgMHg4MywgMHg4MywgMHg4MywgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLAorICAgIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgICAweDgwLCAweDgwLCAweDgwLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLAorICAgIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsCisgICAgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwKKyAgICAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LAorICAgIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODMsIDB4ODMsIDB4ODMsCisgICAgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODMsIDB4ODMsIDB4ODMsCisgICAgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwKKyAgICAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LAorICAgIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsCisgICAgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MywgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwKKyAgICAweDgxLCAweDgxLCAweDgxLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgICAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwKKyAgICAweDgyLCAweDgyLCAweDgyLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLCAweDgzLAorICAgIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsCisgICAgMHg4MywgMHg4MywgMHg4MywgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwKKyAgICAweDgxLCAweDgxLCAweDgxLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdjLCAweDdjLCAweDdjLAorICAgIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsCisgICAgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgxLAorICAgIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCisgICAgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwKKyAgICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgICAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2QsIDB4N2QsIDB4N2QsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YiwgMHg3YiwgMHg3YiwKKyAgICAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgICAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLAorICAgIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsCisgICAgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZSwKKyAgICAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLCAweDdlLAorICAgIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2QsIDB4N2QsIDB4N2QsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwKKyAgICAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdkLAorICAgIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsCisgICAgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLAorICAgIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywKKyAgICAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLAorICAgIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsCisgICAgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3YiwgMHg3YiwgMHg3YiwKKyAgICAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsCisgICAgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwKKyAgICAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdhLAorICAgIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKyAgICAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorICAgIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4NzksCisgICAgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LAorICAgIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzgsCisgICAgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwKKyAgICAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LAorICAgIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzYsCisgICAgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwgMHg3NiwKKyAgICAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc2LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsCisgICAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwKKyAgICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc1LAorICAgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzV9Oworc3RhdGljIHVuc2lnbmVkIGludCBsdW5hcmdfcHBtX2xlbiA9IDE5NjYyMzsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9BcHBEZWxlZ2F0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlL0FwcERlbGVnYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxZGZlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9BcHBEZWxlZ2F0ZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBBcHBEZWxlZ2F0ZS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVGhlIEJyZW53aWxsIFdvcmtzaG9wIEx0ZC4gKGh0dHA6Ly93d3cuYnJlbndpbGwuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgQXBwRGVsZWdhdGUgOiBOU09iamVjdDxOU0FwcGxpY2F0aW9uRGVsZWdhdGU+CisKK0BlbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9BcHBEZWxlZ2F0ZS5tIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlL0FwcERlbGVnYXRlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3YmNhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9BcHBEZWxlZ2F0ZS5tCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBBcHBEZWxlZ2F0ZS5tCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVGhlIEJyZW53aWxsIFdvcmtzaG9wIEx0ZC4gKGh0dHA6Ly93d3cuYnJlbndpbGwuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIkFwcERlbGVnYXRlLmgiCisKK0BpbnRlcmZhY2UgQXBwRGVsZWdhdGUgKCkKKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gQXBwRGVsZWdhdGUKKworLSAodm9pZClhcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzooTlNOb3RpZmljYXRpb24gKilhTm90aWZpY2F0aW9uIHsKKyAgICAvLyBJbnNlcnQgY29kZSBoZXJlIHRvIGluaXRpYWxpemUgeW91ciBhcHBsaWNhdGlvbgorfQorCistICh2b2lkKWFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZTooTlNOb3RpZmljYXRpb24gKilhTm90aWZpY2F0aW9uIHsKKyAgICAvLyBJbnNlcnQgY29kZSBoZXJlIHRvIHRlYXIgZG93biB5b3VyIGFwcGxpY2F0aW9uCit9CisKKy0gKEJPT0wpYXBwbGljYXRpb25TaG91bGRUZXJtaW5hdGVBZnRlckxhc3RXaW5kb3dDbG9zZWQ6KE5TQXBwbGljYXRpb24gKilzZW5kZXIgeworICAgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9EZW1vVmlld0NvbnRyb2xsZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9EZW1vVmlld0NvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjkwY2M3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlL0RlbW9WaWV3Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBEZW1vVmlld0NvbnRyb2xsZXIuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IFRoZSBCcmVud2lsbCBXb3Jrc2hvcCBMdGQuIChodHRwOi8vd3d3LmJyZW53aWxsLmNvbSkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxBcHBLaXQvQXBwS2l0Lmg+CisKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgRGVtb1ZpZXdDb250cm9sbGVyCisKKy8qKiBUaGUgbWFpbiB2aWV3IGNvbnRyb2xsZXIgZm9yIHRoZSBkZW1vIHN0b3J5Ym9hcmQuICovCitAaW50ZXJmYWNlIERlbW9WaWV3Q29udHJvbGxlciA6IE5TVmlld0NvbnRyb2xsZXIKK0BlbmQKKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBEZW1vVmlldworCisvKiogVGhlIE1ldGFsLWNvbXBhdGliaWxlIHZpZXcgZm9yIHRoZSBkZW1vIFN0b3J5Ym9hcmQuICovCitAaW50ZXJmYWNlIERlbW9WaWV3IDogTlNWaWV3CitAZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvRGVtb1ZpZXdDb250cm9sbGVyLm0gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvRGVtb1ZpZXdDb250cm9sbGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlMjI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9EZW1vVmlld0NvbnRyb2xsZXIubQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIERlbW9WaWV3Q29udHJvbGxlci5tCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVGhlIEJyZW53aWxsIFdvcmtzaG9wIEx0ZC4gKGh0dHA6Ly93d3cuYnJlbndpbGwuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIkRlbW9WaWV3Q29udHJvbGxlci5oIgorI2ltcG9ydCA8UXVhcnR6Q29yZS9DQU1ldGFsTGF5ZXIuaD4KKworI2luY2x1ZGUgPE1vbHRlblZLL212a192dWxrYW4uaD4KKworI2luY2x1ZGUgImN1YmUuYyIKKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBEZW1vVmlld0NvbnRyb2xsZXIKKworQGltcGxlbWVudGF0aW9uIERlbW9WaWV3Q29udHJvbGxlciB7CisgICAgQ1ZEaXNwbGF5TGlua1JlZiBfZGlzcGxheUxpbms7CisgICAgc3RydWN0IGRlbW8gZGVtbzsKKyAgICBOU1RpbWVyKiBfdGltZXI7Cit9CisKKy0gKHZvaWQpZGVhbGxvYyB7CisgICAgZGVtb19jbGVhbnVwKCZkZW1vKTsKKyAgICBDVkRpc3BsYXlMaW5rUmVsZWFzZShfZGlzcGxheUxpbmspOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyoqIFNpbmNlIHRoaXMgaXMgYSBzaW5nbGUtdmlldyBhcHAsIGluaXRpYWxpemUgVnVsa2FuIGR1cmluZyB2aWV3IGxvYWRpbmcuICovCistICh2b2lkKXZpZXdEaWRMb2FkIHsKKyAgICBbc3VwZXIgdmlld0RpZExvYWRdOworCisgICAgc2VsZi52aWV3LndhbnRzTGF5ZXIgPSBZRVM7ICAvLyBCYWNrIHRoZSB2aWV3IHdpdGggYSBsYXllciBjcmVhdGVkIGJ5IHRoZSBtYWtlQmFja2luZ0xheWVyIG1ldGhvZC4KKworICAgIC8vIENvbnZlcnQgaW5jb21pbmcgYXJncyB0byAiQyIgYXJnYy9hcmd2IHN0cmluZ3MKKyAgICBOU0FycmF5ICphcmdzID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBhcmd1bWVudHNdOworICAgIGNvbnN0IGNoYXIqKiBhcmd2ID0gKGNvbnN0IGNoYXIqKikgYWxsb2NhKHNpemVvZihjaGFyKikgKiBhcmdzLmNvdW50KTsKKyAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYXJncy5jb3VudDsgaSsrKSB7CisgICAgICAgIE5TU3RyaW5nICpzID0gYXJnc1tpXTsKKyAgICAgICAgYXJndltpXSA9IHMuVVRGOFN0cmluZzsKKyAgICB9CisKKyAgICBkZW1vX21haW4oJmRlbW8sIHNlbGYudmlldy5sYXllciwgYXJncy5jb3VudCwgYXJndik7CisKKyAgICAvLyBNb25pdG9yIHRoZSByZW5kZXJpbmcgbG9vcCBmb3IgYSBxdWl0IGNvbmRpdGlvbgorICAgIF90aW1lciA9IFtOU1RpbWVyIHNjaGVkdWxlZFRpbWVyV2l0aFRpbWVJbnRlcnZhbDogMC4yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBAc2VsZWN0b3Iob25UaWNrOikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdHM6IFlFU107CisKKyAgICAvLyBTdGFydCB0aGUgcmVuZGVyaW5nIGxvb3AKKyAgICBDVkRpc3BsYXlMaW5rQ3JlYXRlV2l0aEFjdGl2ZUNHRGlzcGxheXMoJl9kaXNwbGF5TGluayk7CisgICAgQ1ZEaXNwbGF5TGlua1NldE91dHB1dENhbGxiYWNrKF9kaXNwbGF5TGluaywgJkRpc3BsYXlMaW5rQ2FsbGJhY2ssICZkZW1vKTsKKyAgICBDVkRpc3BsYXlMaW5rU3RhcnQoX2Rpc3BsYXlMaW5rKTsKKworfQorCisvLyBDbG9zZSB0aGUgd2luZG93IGlmIHRoZSBkZW1vIGlzIGluIGEgUXVpdCBzdGF0ZQorLSh2b2lkKW9uVGljazooTlNUaW1lciopdGltZXIgeworICAgIGlmIChkZW1vLnF1aXQpIHsKKyAgICAgICAgW1tbc2VsZiB2aWV3XSB3aW5kb3ddIGNsb3NlXTsKKyAgICB9Cit9CisKKyNwcmFnbWEgbWFyayBEaXNwbGF5IGxvb3AgY2FsbGJhY2sgZnVuY3Rpb24KKworLyoqIFJlbmRlcmluZyBsb29wIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB1c2Ugd2l0aCBhIENWRGlzcGxheUxpbmsuICovCitzdGF0aWMgQ1ZSZXR1cm4gRGlzcGxheUxpbmtDYWxsYmFjayhDVkRpc3BsYXlMaW5rUmVmIGRpc3BsYXlMaW5rLCBjb25zdCBDVlRpbWVTdGFtcCogbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1ZUaW1lU3RhbXAqIG91dHB1dFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVk9wdGlvbkZsYWdzIGZsYWdzSW4sIENWT3B0aW9uRmxhZ3MqIGZsYWdzT3V0LCB2b2lkKiB0YXJnZXQpIHsKKyAgICBzdHJ1Y3QgZGVtbyogZGVtbyA9IChzdHJ1Y3QgZGVtbyopdGFyZ2V0OworICAgIGRlbW9fcnVuKGRlbW8pOworICAgIGlmIChkZW1vLT5xdWl0KSB7CisgICAgICAgIENWRGlzcGxheUxpbmtTdG9wKGRpc3BsYXlMaW5rKTsKKyAgICAgICAgQ1ZEaXNwbGF5TGlua1JlbGVhc2UoZGlzcGxheUxpbmspOworICAgIH0KKyAgICByZXR1cm4ga0NWUmV0dXJuU3VjY2VzczsKK30KKworQGVuZAorCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIERlbW9WaWV3CisKK0BpbXBsZW1lbnRhdGlvbiBEZW1vVmlldworCisvKiogSW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgd2FudHMgdG8gZHJhdyB1c2luZyB0aGUgYmFja2luZyBsYXllciBpbnN0ZWFkIG9mIHVzaW5nIGRyYXdSZWN0Oi4gICovCistIChCT09MKXdhbnRzVXBkYXRlTGF5ZXIgeworICAgIHJldHVybiBZRVM7Cit9CisKKy8qKiBSZXR1cm5zIGEgTWV0YWwtY29tcGF0aWJsZSBsYXllci4gKi8KKysgKENsYXNzKWxheWVyQ2xhc3MgeworICAgIHJldHVybiBbQ0FNZXRhbExheWVyIGNsYXNzXTsKK30KKworLyoqIElmIHRoZSB3YW50c0xheWVyIHByb3BlcnR5IGlzIHNldCB0byBZRVMsIHRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB0byByZXR1cm4gYSBsYXllciBpbnN0YW5jZS4gKi8KKy0gKENBTGF5ZXIqKW1ha2VCYWNraW5nTGF5ZXIgeworICAgIENBTGF5ZXIqIGxheWVyID0gW3NlbGYuY2xhc3MubGF5ZXJDbGFzcyBsYXllcl07CisgICAgQ0dTaXplIHZpZXdTY2FsZSA9IFtzZWxmIGNvbnZlcnRTaXplVG9CYWNraW5nOkNHU2l6ZU1ha2UoMS4wLCAxLjApXTsKKyAgICBsYXllci5jb250ZW50c1NjYWxlID0gTUlOKHZpZXdTY2FsZS53aWR0aCwgdmlld1NjYWxlLmhlaWdodCk7CisgICAgcmV0dXJuIGxheWVyOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvSW5mby5wbGlzdCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MTQ1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvSW5mby5wbGlzdApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke01BQ09TWF9CVU5ETEVfRVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz5Wa0N1YmU8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPlZ1bGthbkljb24uaWNuczwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20ubHVuYXJnLnZrY3ViZTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVMb25nVmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPlZrQ3ViZTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5DU1Jlc291cmNlc0ZpbGVNYXBwZWQ8L2tleT4KKwk8dHJ1ZS8+CisJPGtleT5OU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQ8L2tleT4KKwk8c3RyaW5nPkNvcHlyaWdodCAoYykgMjAxOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEx1bmFyRyBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9zdHJpbmc+CisJPGtleT5OU01haW5TdG9yeWJvYXJkRmlsZTwva2V5PgorCTxzdHJpbmc+TWFpbjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9SZXNvdXJjZXMvTWFpbi5zdG9yeWJvYXJkIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlL1Jlc291cmNlcy9NYWluLnN0b3J5Ym9hcmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxYzE0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9SZXNvdXJjZXMvTWFpbi5zdG9yeWJvYXJkCkBAIC0wLDAgKzEsMTMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxkb2N1bWVudCB0eXBlPSJjb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlcjMuQ29jb2EuU3Rvcnlib2FyZC5YSUIiIHZlcnNpb249IjMuMCIgdG9vbHNWZXJzaW9uPSIxMDExNyIgc3lzdGVtVmVyc2lvbj0iMTVHMjZhIiB0YXJnZXRSdW50aW1lPSJNYWNPU1guQ29jb2EiIHByb3BlcnR5QWNjZXNzQ29udHJvbD0ibm9uZSIgdXNlQXV0b2xheW91dD0iWUVTIiBpbml0aWFsVmlld0NvbnRyb2xsZXI9IkI4RC0wTi01d1MiPgorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBsb3ltZW50IGlkZW50aWZpZXI9Im1hY29zeCIvPgorICAgICAgICA8cGx1Z0luIGlkZW50aWZpZXI9ImNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLkNvY29hUGx1Z2luIiB2ZXJzaW9uPSIxMDExNyIvPgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxzY2VuZXM+CisgICAgICAgIDwhLS1BcHBsaWNhdGlvbi0tPgorICAgICAgICA8c2NlbmUgc2NlbmVJRD0iSlBvLTR5LUZYMyI+CisgICAgICAgICAgICA8b2JqZWN0cz4KKyAgICAgICAgICAgICAgICA8YXBwbGljYXRpb24gaWQ9Imhudy14Vi0wem4iIHNjZW5lTWVtYmVySUQ9InZpZXdDb250cm9sbGVyIj4KKyAgICAgICAgICAgICAgICAgICAgPG1lbnUga2V5PSJtYWluTWVudSIgdGl0bGU9Ik1haW4gTWVudSIgc3lzdGVtTWVudT0ibWFpbiIgaWQ9IkFZdS1zSy1xUzYiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGl0ZW1zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0aXRsZT0iTW9sdGVuVksgRGVtbyIgaWQ9IjFYdC1IWS11QnciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW9kaWZpZXJNYXNrIGtleT0ia2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudSBrZXk9InN1Ym1lbnUiIHRpdGxlPSJNb2x0ZW5WSyBEZW1vIiBzeXN0ZW1NZW51PSJhcHBsZSIgaWQ9InVReS1ERC1KRHIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGl0ZW1zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0aXRsZT0iQWJvdXQgRGVtbyIgaWQ9IjVrVi1WYi1ReFMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW9kaWZpZXJNYXNrIGtleT0ia2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIHNlbGVjdG9yPSJvcmRlckZyb250U3RhbmRhcmRBYm91dFBhbmVsOiIgdGFyZ2V0PSJBZHktaEktNWdkIiBpZD0iRXhwLUNaLVZlbSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudUl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIGlzU2VwYXJhdG9ySXRlbT0iWUVTIiBpZD0iVk9xLXkwLVNFSCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0aXRsZT0iSGlkZSBEZW1vIiBrZXlFcXVpdmFsZW50PSJoIiBpZD0iT2x3LW5QLWJRTiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhY3Rpb24gc2VsZWN0b3I9ImhpZGU6IiB0YXJnZXQ9IkFkeS1oSS01Z2QiIGlkPSJQbk4tVWMtbTY4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9IkhpZGUgT3RoZXJzIiBrZXlFcXVpdmFsZW50PSJoIiBpZD0iVmRyLWZwLVh6TyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtb2RpZmllck1hc2sga2V5PSJrZXlFcXVpdmFsZW50TW9kaWZpZXJNYXNrIiBvcHRpb249IllFUyIgY29tbWFuZD0iWUVTIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhY3Rpb24gc2VsZWN0b3I9ImhpZGVPdGhlckFwcGxpY2F0aW9uczoiIHRhcmdldD0iQWR5LWhJLTVnZCIgaWQ9IlZUNC1hWS1YQ1QiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0aXRsZT0iU2hvdyBBbGwiIGlkPSJLZDItbXAtcFVTIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1vZGlmaWVyTWFzayBrZXk9ImtleUVxdWl2YWxlbnRNb2RpZmllck1hc2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFjdGlvbiBzZWxlY3Rvcj0idW5oaWRlQWxsQXBwbGljYXRpb25zOiIgdGFyZ2V0PSJBZHktaEktNWdkIiBpZD0iRGhnLUxlLXhveCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudUl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIGlzU2VwYXJhdG9ySXRlbT0iWUVTIiBpZD0ia0N4LU9FLXZnVCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0aXRsZT0iUXVpdCBEZW1vIiBrZXlFcXVpdmFsZW50PSJxIiBpZD0iNHNiLTRzLVZMaSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhY3Rpb24gc2VsZWN0b3I9InRlcm1pbmF0ZToiIHRhcmdldD0iQWR5LWhJLTVnZCIgaWQ9IlRlNy1wbi1ZekYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudUl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRpdGxlPSJXaW5kb3ciIGlkPSJhVUYtZDEtNWJSIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1vZGlmaWVyTWFzayBrZXk9ImtleUVxdWl2YWxlbnRNb2RpZmllck1hc2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnUga2V5PSJzdWJtZW51IiB0aXRsZT0iV2luZG93IiBzeXN0ZW1NZW51PSJ3aW5kb3ciIGlkPSJUZDctYUQtNWxvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9Ik1pbmltaXplIiBrZXlFcXVpdmFsZW50PSJtIiBpZD0iT1k3LVdGLXBvViI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhY3Rpb24gc2VsZWN0b3I9InBlcmZvcm1NaW5pYXR1cml6ZToiIHRhcmdldD0iQWR5LWhJLTVnZCIgaWQ9IlZ3VC1XRC1ZUGUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0aXRsZT0iWm9vbSIgaWQ9IlI0by1uMi1FcTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW9kaWZpZXJNYXNrIGtleT0ia2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIHNlbGVjdG9yPSJwZXJmb3JtWm9vbToiIHRhcmdldD0iQWR5LWhJLTVnZCIgaWQ9IkRJbC1jQy1jQ3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSBpc1NlcGFyYXRvckl0ZW09IllFUyIgaWQ9ImV1My03aS15SU0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9IkJyaW5nIEFsbCB0byBGcm9udCIgaWQ9IkxFMi1hUi0wWEoiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW9kaWZpZXJNYXNrIGtleT0ia2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIHNlbGVjdG9yPSJhcnJhbmdlSW5Gcm9udDoiIHRhcmdldD0iQWR5LWhJLTVnZCIgaWQ9IkRSTi1mdS1nUWgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudUl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRpdGxlPSJIZWxwIiBpZD0id3ByLTNxLU1jZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtb2RpZmllck1hc2sga2V5PSJrZXlFcXVpdmFsZW50TW9kaWZpZXJNYXNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51IGtleT0ic3VibWVudSIgdGl0bGU9IkhlbHAiIHN5c3RlbU1lbnU9ImhlbHAiIGlkPSJGMlMtZnotTlZRIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9Ik1vbHRlblZLIERlbW8gSGVscCIga2V5RXF1aXZhbGVudD0iPyIgaWQ9IkZLRS1TbS1LdW0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIHNlbGVjdG9yPSJzaG93SGVscDoiIHRhcmdldD0iQWR5LWhJLTVnZCIgaWQ9Ink3WC0yUS05bm8iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudUl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2l0ZW1zPgorICAgICAgICAgICAgICAgICAgICA8L21lbnU+CisgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRsZXQgcHJvcGVydHk9ImRlbGVnYXRlIiBkZXN0aW5hdGlvbj0iVm9lLVR4LXJMQyIgaWQ9IlByRC1mdS1QNm0iLz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2FwcGxpY2F0aW9uPgorICAgICAgICAgICAgICAgIDxjdXN0b21PYmplY3QgaWQ9IlZvZS1UeC1yTEMiIGN1c3RvbUNsYXNzPSJBcHBEZWxlZ2F0ZSIvPgorICAgICAgICAgICAgICAgIDxjdXN0b21PYmplY3QgaWQ9IkFkeS1oSS01Z2QiIHVzZXJMYWJlbD0iRmlyc3QgUmVzcG9uZGVyIiBjdXN0b21DbGFzcz0iTlNSZXNwb25kZXIiIHNjZW5lTWVtYmVySUQ9ImZpcnN0UmVzcG9uZGVyIi8+CisgICAgICAgICAgICA8L29iamVjdHM+CisgICAgICAgICAgICA8cG9pbnQga2V5PSJjYW52YXNMb2NhdGlvbiIgeD0iODMuNSIgeT0iLTQ3Ii8+CisgICAgICAgIDwvc2NlbmU+CisgICAgICAgIDwhLS1XaW5kb3cgQ29udHJvbGxlci0tPgorICAgICAgICA8c2NlbmUgc2NlbmVJRD0iUjJWLUIwLW5JNCI+CisgICAgICAgICAgICA8b2JqZWN0cz4KKyAgICAgICAgICAgICAgICA8d2luZG93Q29udHJvbGxlciBpZD0iQjhELTBOLTV3UyIgc2NlbmVNZW1iZXJJRD0idmlld0NvbnRyb2xsZXIiPgorICAgICAgICAgICAgICAgICAgICA8d2luZG93IGtleT0id2luZG93IiB0aXRsZT0iTW9sdGVuVksgRGVtbyIgYWxsb3dzVG9vbFRpcHNXaGVuQXBwbGljYXRpb25Jc0luYWN0aXZlPSJOTyIgYXV0b3JlY2FsY3VsYXRlc0tleVZpZXdMb29wPSJOTyIgb25lU2hvdD0iTk8iIHJlbGVhc2VkV2hlbkNsb3NlZD0iTk8iIHNob3dzVG9vbGJhckJ1dHRvbj0iTk8iIHZpc2libGVBdExhdW5jaD0iTk8iIGFuaW1hdGlvbkJlaGF2aW9yPSJkZWZhdWx0IiBpZD0iSVF2LUlCLWlMQSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93U3R5bGVNYXNrIGtleT0ic3R5bGVNYXNrIiB0aXRsZWQ9IllFUyIgY2xvc2FibGU9IllFUyIgbWluaWF0dXJpemFibGU9IllFUyIgcmVzaXphYmxlPSJZRVMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IGtleT0iY29udGVudFJlY3QiIHg9IjEwNTEiIHk9IjY1NiIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIyMDAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IGtleT0ic2NyZWVuUmVjdCIgeD0iMC4wIiB5PSIwLjAiIHdpZHRoPSIyNTYwIiBoZWlnaHQ9IjE0MTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBrZXk9Im1pblNpemUiIHR5cGU9InNpemUiIHdpZHRoPSIzMDAiIGhlaWdodD0iMjAwIi8+CisgICAgICAgICAgICAgICAgICAgIDwvd2luZG93PgorICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2VndWUgZGVzdGluYXRpb249IlhmRy1sUS05d0QiIGtpbmQ9InJlbGF0aW9uc2hpcCIgcmVsYXRpb25zaGlwPSJ3aW5kb3cuc2hhZG93ZWRDb250ZW50Vmlld0NvbnRyb2xsZXIiIGlkPSJjcTItRkUtSlFNIi8+CisgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgPC93aW5kb3dDb250cm9sbGVyPgorICAgICAgICAgICAgICAgIDxjdXN0b21PYmplY3QgaWQ9Ik9reS16WS1vUDQiIHVzZXJMYWJlbD0iRmlyc3QgUmVzcG9uZGVyIiBjdXN0b21DbGFzcz0iTlNSZXNwb25kZXIiIHNjZW5lTWVtYmVySUQ9ImZpcnN0UmVzcG9uZGVyIi8+CisgICAgICAgICAgICA8L29iamVjdHM+CisgICAgICAgICAgICA8cG9pbnQga2V5PSJjYW52YXNMb2NhdGlvbiIgeD0iODMiIHk9IjE0NiIvPgorICAgICAgICA8L3NjZW5lPgorICAgICAgICA8IS0tRGVtbyBWaWV3IENvbnRyb2xsZXItLT4KKyAgICAgICAgPHNjZW5lIHNjZW5lSUQ9ImhJei1BUC1WT0QiPgorICAgICAgICAgICAgPG9iamVjdHM+CisgICAgICAgICAgICAgICAgPHZpZXdDb250cm9sbGVyIGlkPSJYZkctbFEtOXdEIiBjdXN0b21DbGFzcz0iRGVtb1ZpZXdDb250cm9sbGVyIiBzY2VuZU1lbWJlcklEPSJ2aWV3Q29udHJvbGxlciI+CisgICAgICAgICAgICAgICAgICAgIDx2aWV3IGtleT0idmlldyIgaWQ9Im0yUy1KcC1RZGwiIGN1c3RvbUNsYXNzPSJEZW1vVmlldyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBrZXk9ImZyYW1lIiB4PSIwLjAiIHk9IjAuMCIgd2lkdGg9IjQwMCIgaGVpZ2h0PSIzMDAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhdXRvcmVzaXppbmdNYXNrIGtleT0iYXV0b3Jlc2l6aW5nTWFzayIvPgorICAgICAgICAgICAgICAgICAgICA8L3ZpZXc+CisgICAgICAgICAgICAgICAgPC92aWV3Q29udHJvbGxlcj4KKyAgICAgICAgICAgICAgICA8Y3VzdG9tT2JqZWN0IGlkPSJyUHQtTlQtbmtVIiB1c2VyTGFiZWw9IkZpcnN0IFJlc3BvbmRlciIgY3VzdG9tQ2xhc3M9Ik5TUmVzcG9uZGVyIiBzY2VuZU1lbWJlcklEPSJmaXJzdFJlc3BvbmRlciIvPgorICAgICAgICAgICAgPC9vYmplY3RzPgorICAgICAgICAgICAgPHBvaW50IGtleT0iY2FudmFzTG9jYXRpb24iIHg9IjgzIiB5PSI1NjQiLz4KKyAgICAgICAgPC9zY2VuZT4KKyAgICA8L3NjZW5lcz4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvUmVzb3VyY2VzL1Z1bGthbkljb24uaWNucyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9SZXNvdXJjZXMvVnVsa2FuSWNvbi5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiODJmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvUmVzb3VyY2VzL1Z1bGthbkljb24uaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvY3ViZS5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9jdWJlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmNiYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvY3ViZS5jbWFrZQpAQCAtMCwwICsxLDgzIEBACisjIH5+fgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyB+fn4KKworIyBWa0N1YmUgQXBwbGljYXRpb24gQnVuZGxlCisKK3NldChjdWJlX1NSQ1MKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZS9tYWluLm0KKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZS9BcHBEZWxlZ2F0ZS5tCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL2N1YmUvRGVtb1ZpZXdDb250cm9sbGVyLm0pCisKK3NldChjdWJlX0hEUlMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL2N1YmUvQXBwRGVsZWdhdGUuaCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZS9EZW1vVmlld0NvbnRyb2xsZXIuaCkKKworc2V0KGN1YmVfUkVTT1VSQ0VTICR7Q01BS0VfQklOQVJZX0RJUn0vc3RhZ2luZy1qc29uL01vbHRlblZLX2ljZC5qc29uCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL2N1YmUvUmVzb3VyY2VzL1Z1bGthbkljb24uaWNucykKKworIyBIYXZlIFhjb2RlIGhhbmRsZSB0aGUgU3Rvcnlib2FyZAoraWYoJHtDTUFLRV9HRU5FUkFUT1J9IE1BVENIRVMgIl5YY29kZS4qIikKKyAgICBzZXQoY3ViZV9SRVNPVVJDRVMgJHtjdWJlX1JFU09VUkNFU30gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL2N1YmUvUmVzb3VyY2VzL01haW4uc3Rvcnlib2FyZCkKK2VuZGlmKCkKKworYWRkX2V4ZWN1dGFibGUodmtjdWJlIE1BQ09TWF9CVU5ETEUgJHtjdWJlX1NSQ1N9ICR7Y3ViZV9IRFJTfSAke2N1YmVfUkVTT1VSQ0VTfSBjdWJlLnZlcnQuaW5jIGN1YmUuZnJhZy5pbmMpCisKKyMgSGFuZGxlIHRoZSBTdG9yeWJvYXJkIG91cnNlbHZlcworaWYoTk9UICR7Q01BS0VfR0VORVJBVE9SfSBNQVRDSEVTICJeWGNvZGUuKiIpCisgICAgIyBDb21waWxlIHRoZSBzdG9yeWJvYXJkIGZpbGUgd2l0aCB0aGUgaWJ0b29sLgorICAgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgdmtjdWJlIFBPU1RfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0lCVE9PTH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWVycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0td2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW5vdGljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW91dHB1dC1mb3JtYXQgaHVtYW4tcmVhZGFibGUtdGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tY29tcGlsZSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmtjdWJlLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvTWFpbi5zdG9yeWJvYXJkYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZS9SZXNvdXJjZXMvTWFpbi5zdG9yeWJvYXJkCisgICAgICAgICAgICAgICAgICAgICAgIENPTU1FTlQgIkNvbXBpbGluZyBzdG9yeWJvYXJkIikKK2VuZGlmKCkKKworYWRkX2RlcGVuZGVuY2llcyh2a2N1YmUgTW9sdGVuVktfaWNkLXN0YWdpbmctanNvbikKKworIyBJbmNsdWRlIGRlbW8gc291cmNlIGNvZGUgZGlyIGJlY2F1c2UgdGhlIE1hY09TIGN1YmUncyBPYmplY3RpdmUtQyBzb3VyY2UgaW5jbHVkZXMgdGhlICJvcmlnaW5hbCIgY3ViZSBhcHBsaWNhdGlvbiBDIHNvdXJjZSBjb2RlLgorIyBBbHNvIGluY2x1ZGUgdGhlIE1vbHRlblZLIGhlbHBlciBmaWxlcy4KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKHZrY3ViZSBQUklWQVRFICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSAke01PTFRFTlZLX0RJUn0vTW9sdGVuVksvaW5jbHVkZSkKKworIyBXZSBkbyB0aGlzIHNvIHZ1bGthbmluZm8gaXMgbGlua2VkIHRvIGFuIGluZGl2aWR1YWwgbGlicmFyeSBhbmQgTk9UIGEgZnJhbWV3b3JrLgordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHZrY3ViZSAke1Z1bGthbl9MSUJSQVJZfSAiLWZyYW1ld29yayBDb2NvYSAtZnJhbWV3b3JrIFF1YXJ0ekNvcmUiKQorCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModmtjdWJlIFBST1BFUlRJRVMgTUFDT1NYX0JVTkRMRV9JTkZPX1BMSVNUICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYWNPUy9jdWJlL0luZm8ucGxpc3QpCisKKyMgVGhlIFJFU09VUkNFIHRhcmdldCBwcm9wZXJ0eSBjYW5ub3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBNQUNPU1hfUEFDS0FHRV9MT0NBVElPTiBwcm9wZXJ0eS4gIFdlIG5lZWQgZmluZS1ncmFpbmVkCisjIGNvbnRyb2wgb3ZlciB0aGUgUmVzb3VyY2UgZGlyZWN0b3J5LCBzbyB3ZSBoYXZlIHRvIHNwZWNpZnkgdGhlIGRlc3RpbmF0aW9uIG9mIGFsbCB0aGUgcmVzb3VyY2UgZmlsZXMgb24gYSBwZXItZGVzdGluYXRpb24tCisjIGRpcmVjdG9yeSBiYXNpcy4gSWYgYWxsIHRoZSBmaWxlcyB3ZW50IGludG8gdGhlIHRvcC1sZXZlbCBSZXNvdXJjZSBkaXJlY3RvcnksIHRoZW4gd2UgY291bGQgc2ltcGx5IHNldCB0aGUgUkVTT1VSQ0UgcHJvcGVydHkgdG8gYQorIyBsaXN0IG9mIGFsbCB0aGUgcmVzb3VyY2UgZmlsZXMuCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtjdWJlX1JFU09VUkNFU30gUFJPUEVSVElFUyBNQUNPU1hfUEFDS0FHRV9MT0NBVElPTiAiUmVzb3VyY2VzIikKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygiJHtDTUFLRV9CSU5BUllfRElSfS9zdGFnaW5nLWpzb24vTW9sdGVuVktfaWNkLmpzb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVElFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ09TWF9QQUNLQUdFX0xPQ0FUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlcy92dWxrYW4vaWNkLmQiKQorCisjIENvcHkgdGhlIE1vbHRlblZLIGxpYiBpbnRvIHRoZSBidW5kbGUuCitpZigke0NNQUtFX0dFTkVSQVRPUn0gTUFUQ0hFUyAiXlhjb2RlLioiKQorICAgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgdmtjdWJlIFBPU1RfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgIiR7TU9MVEVOVktfRElSfS9Nb2x0ZW5WSy9tYWNPUy9keW5hbWljL2xpYk1vbHRlblZLLmR5bGliIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8kPENPTkZJRz4vdmtjdWJlLmFwcC9Db250ZW50cy9GcmFtZXdvcmtzL2xpYk1vbHRlblZLLmR5bGliCisgICAgICAgICAgICAgICAgICAgICAgIERFUEVORFMgdnVsa2FuKQorZWxzZSgpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCB2a2N1YmUgUE9TVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAiJHtNT0xURU5WS19ESVJ9L01vbHRlblZLL21hY09TL2R5bmFtaWMvbGliTW9sdGVuVksuZHlsaWIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3ZrY3ViZS5hcHAvQ29udGVudHMvRnJhbWV3b3Jrcy9saWJNb2x0ZW5WSy5keWxpYgorICAgICAgICAgICAgICAgICAgICAgICBERVBFTkRTIHZ1bGthbikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZS9tYWluLm0gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvbWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWUwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmUvbWFpbi5tCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBtYWluLm0KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBUaGUgQnJlbndpbGwgV29ya3Nob3AgTHRkLiAoaHR0cDovL3d3dy5icmVud2lsbC5jb20pCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeyByZXR1cm4gTlNBcHBsaWNhdGlvbk1haW4oYXJnYywgYXJndik7IH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL0FwcERlbGVnYXRlLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9BcHBEZWxlZ2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWRmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9BcHBEZWxlZ2F0ZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBBcHBEZWxlZ2F0ZS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVGhlIEJyZW53aWxsIFdvcmtzaG9wIEx0ZC4gKGh0dHA6Ly93d3cuYnJlbndpbGwuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgQXBwRGVsZWdhdGUgOiBOU09iamVjdDxOU0FwcGxpY2F0aW9uRGVsZWdhdGU+CisKK0BlbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL0FwcERlbGVnYXRlLm1tIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvQXBwRGVsZWdhdGUubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3YmNhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL0FwcERlbGVnYXRlLm1tCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBBcHBEZWxlZ2F0ZS5tCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVGhlIEJyZW53aWxsIFdvcmtzaG9wIEx0ZC4gKGh0dHA6Ly93d3cuYnJlbndpbGwuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIkFwcERlbGVnYXRlLmgiCisKK0BpbnRlcmZhY2UgQXBwRGVsZWdhdGUgKCkKKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gQXBwRGVsZWdhdGUKKworLSAodm9pZClhcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzooTlNOb3RpZmljYXRpb24gKilhTm90aWZpY2F0aW9uIHsKKyAgICAvLyBJbnNlcnQgY29kZSBoZXJlIHRvIGluaXRpYWxpemUgeW91ciBhcHBsaWNhdGlvbgorfQorCistICh2b2lkKWFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZTooTlNOb3RpZmljYXRpb24gKilhTm90aWZpY2F0aW9uIHsKKyAgICAvLyBJbnNlcnQgY29kZSBoZXJlIHRvIHRlYXIgZG93biB5b3VyIGFwcGxpY2F0aW9uCit9CisKKy0gKEJPT0wpYXBwbGljYXRpb25TaG91bGRUZXJtaW5hdGVBZnRlckxhc3RXaW5kb3dDbG9zZWQ6KE5TQXBwbGljYXRpb24gKilzZW5kZXIgeworICAgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL0RlbW9WaWV3Q29udHJvbGxlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvRGVtb1ZpZXdDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5MGNjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL0RlbW9WaWV3Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBEZW1vVmlld0NvbnRyb2xsZXIuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IFRoZSBCcmVud2lsbCBXb3Jrc2hvcCBMdGQuIChodHRwOi8vd3d3LmJyZW53aWxsLmNvbSkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxBcHBLaXQvQXBwS2l0Lmg+CisKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgRGVtb1ZpZXdDb250cm9sbGVyCisKKy8qKiBUaGUgbWFpbiB2aWV3IGNvbnRyb2xsZXIgZm9yIHRoZSBkZW1vIHN0b3J5Ym9hcmQuICovCitAaW50ZXJmYWNlIERlbW9WaWV3Q29udHJvbGxlciA6IE5TVmlld0NvbnRyb2xsZXIKK0BlbmQKKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBEZW1vVmlldworCisvKiogVGhlIE1ldGFsLWNvbXBhdGliaWxlIHZpZXcgZm9yIHRoZSBkZW1vIFN0b3J5Ym9hcmQuICovCitAaW50ZXJmYWNlIERlbW9WaWV3IDogTlNWaWV3CitAZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9EZW1vVmlld0NvbnRyb2xsZXIubW0gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9EZW1vVmlld0NvbnRyb2xsZXIubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwMDNiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL0RlbW9WaWV3Q29udHJvbGxlci5tbQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIERlbW9WaWV3Q29udHJvbGxlci5tCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVGhlIEJyZW53aWxsIFdvcmtzaG9wIEx0ZC4gKGh0dHA6Ly93d3cuYnJlbndpbGwuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIkRlbW9WaWV3Q29udHJvbGxlci5oIgorI2ltcG9ydCA8UXVhcnR6Q29yZS9DQU1ldGFsTGF5ZXIuaD4KKworI2luY2x1ZGUgPE1vbHRlblZLL212a192dWxrYW4uaD4KKworI2luY2x1ZGUgImN1YmUuY3BwIgorCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIERlbW9WaWV3Q29udHJvbGxlcgorCitAaW1wbGVtZW50YXRpb24gRGVtb1ZpZXdDb250cm9sbGVyIHsKKyAgICBDVkRpc3BsYXlMaW5rUmVmIF9kaXNwbGF5TGluazsKKyAgICBzdHJ1Y3QgRGVtbyBkZW1vOworICAgIE5TVGltZXIqIF90aW1lcjsKK30KKworLSAodm9pZClkZWFsbG9jIHsKKyAgICBkZW1vLmNsZWFudXAoKTsKKyAgICBDVkRpc3BsYXlMaW5rUmVsZWFzZShfZGlzcGxheUxpbmspOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyoqIFNpbmNlIHRoaXMgaXMgYSBzaW5nbGUtdmlldyBhcHAsIGluaXRpYWxpemUgVnVsa2FuIGR1cmluZyB2aWV3IGxvYWRpbmcuICovCistICh2b2lkKXZpZXdEaWRMb2FkIHsKKyAgICBbc3VwZXIgdmlld0RpZExvYWRdOworCisgICAgc2VsZi52aWV3LndhbnRzTGF5ZXIgPSBZRVM7ICAvLyBCYWNrIHRoZSB2aWV3IHdpdGggYSBsYXllciBjcmVhdGVkIGJ5IHRoZSBtYWtlQmFja2luZ0xheWVyIG1ldGhvZC4KKworICAgIC8vIENvbnZlcnQgaW5jb21pbmcgYXJncyB0byAiQyIgYXJnYy9hcmd2IHN0cmluZ3MKKyAgICBOU0FycmF5ICphcmdzID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBhcmd1bWVudHNdOworICAgIGNvbnN0IGNoYXIqKiBhcmd2ID0gKGNvbnN0IGNoYXIqKikgYWxsb2NhKHNpemVvZihjaGFyKikgKiBhcmdzLmNvdW50KTsKKyAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYXJncy5jb3VudDsgaSsrKSB7CisgICAgICAgIE5TU3RyaW5nICpzID0gYXJnc1tpXTsKKyAgICAgICAgYXJndltpXSA9IHMuVVRGOFN0cmluZzsKKyAgICB9CisKKyAgICBkZW1vX21haW4oZGVtbywgc2VsZi52aWV3LmxheWVyLCBhcmdzLmNvdW50LCBhcmd2KTsKKworICAgIC8vIE1vbml0b3IgdGhlIHJlbmRlcmluZyBsb29wIGZvciBhIHF1aXQgY29uZGl0aW9uCisgICAgX3RpbWVyID0gW05TVGltZXIgc2NoZWR1bGVkVGltZXJXaXRoVGltZUludGVydmFsOiAwLjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IEBzZWxlY3RvcihvblRpY2s6KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogc2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0czogWUVTXTsKKworICAgIC8vIFN0YXJ0IHRoZSByZW5kZXJpbmcgbG9vcAorICAgIENWRGlzcGxheUxpbmtDcmVhdGVXaXRoQWN0aXZlQ0dEaXNwbGF5cygmX2Rpc3BsYXlMaW5rKTsKKyAgICBDVkRpc3BsYXlMaW5rU2V0T3V0cHV0Q2FsbGJhY2soX2Rpc3BsYXlMaW5rLCAmRGlzcGxheUxpbmtDYWxsYmFjaywgJmRlbW8pOworICAgIENWRGlzcGxheUxpbmtTdGFydChfZGlzcGxheUxpbmspOworfQorCisvLyBDbG9zZSB0aGUgd2luZG93IGlmIHRoZSBkZW1vIGlzIGluIGEgUXVpdCBzdGF0ZQorLSh2b2lkKW9uVGljazooTlNUaW1lciopdGltZXIgeworICAgIGlmIChkZW1vLnF1aXQpIHsKKyAgICAgICAgW1tbc2VsZiB2aWV3XSB3aW5kb3ddIGNsb3NlXTsKKyAgICB9Cit9CisKKyNwcmFnbWEgbWFyayBEaXNwbGF5IGxvb3AgY2FsbGJhY2sgZnVuY3Rpb24KKworLyoqIFJlbmRlcmluZyBsb29wIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB1c2Ugd2l0aCBhIENWRGlzcGxheUxpbmsuICovCitzdGF0aWMgQ1ZSZXR1cm4gRGlzcGxheUxpbmtDYWxsYmFjayhDVkRpc3BsYXlMaW5rUmVmIGRpc3BsYXlMaW5rLCBjb25zdCBDVlRpbWVTdGFtcCogbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1ZUaW1lU3RhbXAqIG91dHB1dFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVk9wdGlvbkZsYWdzIGZsYWdzSW4sIENWT3B0aW9uRmxhZ3MqIGZsYWdzT3V0LCB2b2lkKiB0YXJnZXQpIHsKKyAgICBzdHJ1Y3QgRGVtbyogZGVtbyA9IChzdHJ1Y3QgRGVtbyopdGFyZ2V0OworICAgIGRlbW8tPnJ1bigpOworICAgIGlmIChkZW1vLT5xdWl0KSB7CisgICAgICAgIENWRGlzcGxheUxpbmtTdG9wKGRpc3BsYXlMaW5rKTsKKyAgICAgICAgQ1ZEaXNwbGF5TGlua1JlbGVhc2UoZGlzcGxheUxpbmspOworICAgIH0KKyAgICByZXR1cm4ga0NWUmV0dXJuU3VjY2VzczsKK30KKworQGVuZAorCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIERlbW9WaWV3CisKK0BpbXBsZW1lbnRhdGlvbiBEZW1vVmlldworCisvKiogSW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgd2FudHMgdG8gZHJhdyB1c2luZyB0aGUgYmFja2luZyBsYXllciBpbnN0ZWFkIG9mIHVzaW5nIGRyYXdSZWN0Oi4gICovCistIChCT09MKXdhbnRzVXBkYXRlTGF5ZXIgeworICAgIHJldHVybiBZRVM7Cit9CisKKy8qKiBSZXR1cm5zIGEgTWV0YWwtY29tcGF0aWJsZSBsYXllci4gKi8KKysgKENsYXNzKWxheWVyQ2xhc3MgeworICAgIHJldHVybiBbQ0FNZXRhbExheWVyIGNsYXNzXTsKK30KKworLyoqIElmIHRoZSB3YW50c0xheWVyIHByb3BlcnR5IGlzIHNldCB0byBZRVMsIHRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB0byByZXR1cm4gYSBsYXllciBpbnN0YW5jZS4gKi8KKy0gKENBTGF5ZXIqKW1ha2VCYWNraW5nTGF5ZXIgeworICAgIENBTGF5ZXIqIGxheWVyID0gW3NlbGYuY2xhc3MubGF5ZXJDbGFzcyBsYXllcl07CisgICAgQ0dTaXplIHZpZXdTY2FsZSA9IFtzZWxmIGNvbnZlcnRTaXplVG9CYWNraW5nOkNHU2l6ZU1ha2UoMS4wLCAxLjApXTsKKyAgICBsYXllci5jb250ZW50c1NjYWxlID0gTUlOKHZpZXdTY2FsZS53aWR0aCwgdmlld1NjYWxlLmhlaWdodCk7CisgICAgcmV0dXJuIGxheWVyOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9JbmZvLnBsaXN0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGI3NGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvSW5mby5wbGlzdApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke01BQ09TWF9CVU5ETEVfRVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz5Wa0N1YmVwcDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+VnVsa2FuSWNvbi5pY25zPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS5sdW5hcmcuY3ViZXBwPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUxvbmdWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+VmtDdWJlcHA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q1NSZXNvdXJjZXNGaWxlTWFwcGVkPC9rZXk+CisJPHRydWUvPgorCTxrZXk+TlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0PC9rZXk+CisJPHN0cmluZz5Db3B5cmlnaHQgKGMpIDIwMTggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBMdW5hckcgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvc3RyaW5nPgorCTxrZXk+TlNNYWluU3Rvcnlib2FyZEZpbGU8L2tleT4KKwk8c3RyaW5nPk1haW48L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9SZXNvdXJjZXMvTWFpbi5zdG9yeWJvYXJkIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvUmVzb3VyY2VzL01haW4uc3Rvcnlib2FyZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjFjMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvUmVzb3VyY2VzL01haW4uc3Rvcnlib2FyZApAQCAtMCwwICsxLDEzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8ZG9jdW1lbnQgdHlwZT0iY29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIzLkNvY29hLlN0b3J5Ym9hcmQuWElCIiB2ZXJzaW9uPSIzLjAiIHRvb2xzVmVyc2lvbj0iMTAxMTciIHN5c3RlbVZlcnNpb249IjE1RzI2YSIgdGFyZ2V0UnVudGltZT0iTWFjT1NYLkNvY29hIiBwcm9wZXJ0eUFjY2Vzc0NvbnRyb2w9Im5vbmUiIHVzZUF1dG9sYXlvdXQ9IllFUyIgaW5pdGlhbFZpZXdDb250cm9sbGVyPSJCOEQtME4tNXdTIj4KKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwbG95bWVudCBpZGVudGlmaWVyPSJtYWNvc3giLz4KKyAgICAgICAgPHBsdWdJbiBpZGVudGlmaWVyPSJjb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5Db2NvYVBsdWdpbiIgdmVyc2lvbj0iMTAxMTciLz4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8c2NlbmVzPgorICAgICAgICA8IS0tQXBwbGljYXRpb24tLT4KKyAgICAgICAgPHNjZW5lIHNjZW5lSUQ9IkpQby00eS1GWDMiPgorICAgICAgICAgICAgPG9iamVjdHM+CisgICAgICAgICAgICAgICAgPGFwcGxpY2F0aW9uIGlkPSJobncteFYtMHpuIiBzY2VuZU1lbWJlcklEPSJ2aWV3Q29udHJvbGxlciI+CisgICAgICAgICAgICAgICAgICAgIDxtZW51IGtleT0ibWFpbk1lbnUiIHRpdGxlPSJNYWluIE1lbnUiIHN5c3RlbU1lbnU9Im1haW4iIGlkPSJBWXUtc0stcVM2Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9Ik1vbHRlblZLIERlbW8iIGlkPSIxWHQtSFktdUJ3Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1vZGlmaWVyTWFzayBrZXk9ImtleUVxdWl2YWxlbnRNb2RpZmllck1hc2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnUga2V5PSJzdWJtZW51IiB0aXRsZT0iTW9sdGVuVksgRGVtbyIgc3lzdGVtTWVudT0iYXBwbGUiIGlkPSJ1UXktREQtSkRyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9IkFib3V0IERlbW8iIGlkPSI1a1YtVmItUXhTIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1vZGlmaWVyTWFzayBrZXk9ImtleUVxdWl2YWxlbnRNb2RpZmllck1hc2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFjdGlvbiBzZWxlY3Rvcj0ib3JkZXJGcm9udFN0YW5kYXJkQWJvdXRQYW5lbDoiIHRhcmdldD0iQWR5LWhJLTVnZCIgaWQ9IkV4cC1DWi1WZW0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSBpc1NlcGFyYXRvckl0ZW09IllFUyIgaWQ9IlZPcS15MC1TRUgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9IkhpZGUgRGVtbyIga2V5RXF1aXZhbGVudD0iaCIgaWQ9Ik9sdy1uUC1iUU4iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIHNlbGVjdG9yPSJoaWRlOiIgdGFyZ2V0PSJBZHktaEktNWdkIiBpZD0iUG5OLVVjLW02OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudUl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRpdGxlPSJIaWRlIE90aGVycyIga2V5RXF1aXZhbGVudD0iaCIgaWQ9IlZkci1mcC1Yek8iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW9kaWZpZXJNYXNrIGtleT0ia2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzayIgb3B0aW9uPSJZRVMiIGNvbW1hbmQ9IllFUyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIHNlbGVjdG9yPSJoaWRlT3RoZXJBcHBsaWNhdGlvbnM6IiB0YXJnZXQ9IkFkeS1oSS01Z2QiIGlkPSJWVDQtYVktWENUIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9IlNob3cgQWxsIiBpZD0iS2QyLW1wLXBVUyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtb2RpZmllck1hc2sga2V5PSJrZXlFcXVpdmFsZW50TW9kaWZpZXJNYXNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhY3Rpb24gc2VsZWN0b3I9InVuaGlkZUFsbEFwcGxpY2F0aW9uczoiIHRhcmdldD0iQWR5LWhJLTVnZCIgaWQ9IkRoZy1MZS14b3giLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSBpc1NlcGFyYXRvckl0ZW09IllFUyIgaWQ9ImtDeC1PRS12Z1QiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9IlF1aXQgRGVtbyIga2V5RXF1aXZhbGVudD0icSIgaWQ9IjRzYi00cy1WTGkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIHNlbGVjdG9yPSJ0ZXJtaW5hdGU6IiB0YXJnZXQ9IkFkeS1oSS01Z2QiIGlkPSJUZTctcG4tWXpGIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0aXRsZT0iV2luZG93IiBpZD0iYVVGLWQxLTViUiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtb2RpZmllck1hc2sga2V5PSJrZXlFcXVpdmFsZW50TW9kaWZpZXJNYXNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51IGtleT0ic3VibWVudSIgdGl0bGU9IldpbmRvdyIgc3lzdGVtTWVudT0id2luZG93IiBpZD0iVGQ3LWFELTVsbyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRpdGxlPSJNaW5pbWl6ZSIga2V5RXF1aXZhbGVudD0ibSIgaWQ9Ik9ZNy1XRi1wb1YiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uIHNlbGVjdG9yPSJwZXJmb3JtTWluaWF0dXJpemU6IiB0YXJnZXQ9IkFkeS1oSS01Z2QiIGlkPSJWd1QtV0QtWVBlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gdGl0bGU9Ilpvb20iIGlkPSJSNG8tbjItRXE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1vZGlmaWVyTWFzayBrZXk9ImtleUVxdWl2YWxlbnRNb2RpZmllck1hc2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFjdGlvbiBzZWxlY3Rvcj0icGVyZm9ybVpvb206IiB0YXJnZXQ9IkFkeS1oSS01Z2QiIGlkPSJESWwtY0MtY0NzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudUl0ZW0gaXNTZXBhcmF0b3JJdGVtPSJZRVMiIGlkPSJldTMtN2kteUlNIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRpdGxlPSJCcmluZyBBbGwgdG8gRnJvbnQiIGlkPSJMRTItYVItMFhKIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1vZGlmaWVyTWFzayBrZXk9ImtleUVxdWl2YWxlbnRNb2RpZmllck1hc2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFjdGlvbiBzZWxlY3Rvcj0iYXJyYW5nZUluRnJvbnQ6IiB0YXJnZXQ9IkFkeS1oSS01Z2QiIGlkPSJEUk4tZnUtZ1FoIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW51SXRlbSB0aXRsZT0iSGVscCIgaWQ9Indwci0zcS1NY2QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW9kaWZpZXJNYXNrIGtleT0ia2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzayIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVudSBrZXk9InN1Ym1lbnUiIHRpdGxlPSJIZWxwIiBzeXN0ZW1NZW51PSJoZWxwIiBpZD0iRjJTLWZ6LU5WUSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbnVJdGVtIHRpdGxlPSJNb2x0ZW5WSyBEZW1vIEhlbHAiIGtleUVxdWl2YWxlbnQ9Ij8iIGlkPSJGS0UtU20tS3VtIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFjdGlvbiBzZWxlY3Rvcj0ic2hvd0hlbHA6IiB0YXJnZXQ9IkFkeS1oSS01Z2QiIGlkPSJ5N1gtMlEtOW5vIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbnVJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW51PgorICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3V0bGV0IHByb3BlcnR5PSJkZWxlZ2F0ZSIgZGVzdGluYXRpb249IlZvZS1UeC1yTEMiIGlkPSJQckQtZnUtUDZtIi8+CisgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdGlvbnM+CisgICAgICAgICAgICAgICAgPC9hcHBsaWNhdGlvbj4KKyAgICAgICAgICAgICAgICA8Y3VzdG9tT2JqZWN0IGlkPSJWb2UtVHgtckxDIiBjdXN0b21DbGFzcz0iQXBwRGVsZWdhdGUiLz4KKyAgICAgICAgICAgICAgICA8Y3VzdG9tT2JqZWN0IGlkPSJBZHktaEktNWdkIiB1c2VyTGFiZWw9IkZpcnN0IFJlc3BvbmRlciIgY3VzdG9tQ2xhc3M9Ik5TUmVzcG9uZGVyIiBzY2VuZU1lbWJlcklEPSJmaXJzdFJlc3BvbmRlciIvPgorICAgICAgICAgICAgPC9vYmplY3RzPgorICAgICAgICAgICAgPHBvaW50IGtleT0iY2FudmFzTG9jYXRpb24iIHg9IjgzLjUiIHk9Ii00NyIvPgorICAgICAgICA8L3NjZW5lPgorICAgICAgICA8IS0tV2luZG93IENvbnRyb2xsZXItLT4KKyAgICAgICAgPHNjZW5lIHNjZW5lSUQ9IlIyVi1CMC1uSTQiPgorICAgICAgICAgICAgPG9iamVjdHM+CisgICAgICAgICAgICAgICAgPHdpbmRvd0NvbnRyb2xsZXIgaWQ9IkI4RC0wTi01d1MiIHNjZW5lTWVtYmVySUQ9InZpZXdDb250cm9sbGVyIj4KKyAgICAgICAgICAgICAgICAgICAgPHdpbmRvdyBrZXk9IndpbmRvdyIgdGl0bGU9Ik1vbHRlblZLIERlbW8iIGFsbG93c1Rvb2xUaXBzV2hlbkFwcGxpY2F0aW9uSXNJbmFjdGl2ZT0iTk8iIGF1dG9yZWNhbGN1bGF0ZXNLZXlWaWV3TG9vcD0iTk8iIG9uZVNob3Q9Ik5PIiByZWxlYXNlZFdoZW5DbG9zZWQ9Ik5PIiBzaG93c1Rvb2xiYXJCdXR0b249Ik5PIiB2aXNpYmxlQXRMYXVuY2g9Ik5PIiBhbmltYXRpb25CZWhhdmlvcj0iZGVmYXVsdCIgaWQ9IklRdi1JQi1pTEEiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvd1N0eWxlTWFzayBrZXk9InN0eWxlTWFzayIgdGl0bGVkPSJZRVMiIGNsb3NhYmxlPSJZRVMiIG1pbmlhdHVyaXphYmxlPSJZRVMiIHJlc2l6YWJsZT0iWUVTIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBrZXk9ImNvbnRlbnRSZWN0IiB4PSIxMDUxIiB5PSI2NTYiIHdpZHRoPSIzMDAiIGhlaWdodD0iMjAwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBrZXk9InNjcmVlblJlY3QiIHg9IjAuMCIgeT0iMC4wIiB3aWR0aD0iMjU2MCIgaGVpZ2h0PSIxNDE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUga2V5PSJtaW5TaXplIiB0eXBlPSJzaXplIiB3aWR0aD0iMzAwIiBoZWlnaHQ9IjIwMCIvPgorICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdz4KKyAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlZ3VlIGRlc3RpbmF0aW9uPSJYZkctbFEtOXdEIiBraW5kPSJyZWxhdGlvbnNoaXAiIHJlbGF0aW9uc2hpcD0id2luZG93LnNoYWRvd2VkQ29udGVudFZpZXdDb250cm9sbGVyIiBpZD0iY3EyLUZFLUpRTSIvPgorICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3Rpb25zPgorICAgICAgICAgICAgICAgIDwvd2luZG93Q29udHJvbGxlcj4KKyAgICAgICAgICAgICAgICA8Y3VzdG9tT2JqZWN0IGlkPSJPa3ktelktb1A0IiB1c2VyTGFiZWw9IkZpcnN0IFJlc3BvbmRlciIgY3VzdG9tQ2xhc3M9Ik5TUmVzcG9uZGVyIiBzY2VuZU1lbWJlcklEPSJmaXJzdFJlc3BvbmRlciIvPgorICAgICAgICAgICAgPC9vYmplY3RzPgorICAgICAgICAgICAgPHBvaW50IGtleT0iY2FudmFzTG9jYXRpb24iIHg9IjgzIiB5PSIxNDYiLz4KKyAgICAgICAgPC9zY2VuZT4KKyAgICAgICAgPCEtLURlbW8gVmlldyBDb250cm9sbGVyLS0+CisgICAgICAgIDxzY2VuZSBzY2VuZUlEPSJoSXotQVAtVk9EIj4KKyAgICAgICAgICAgIDxvYmplY3RzPgorICAgICAgICAgICAgICAgIDx2aWV3Q29udHJvbGxlciBpZD0iWGZHLWxRLTl3RCIgY3VzdG9tQ2xhc3M9IkRlbW9WaWV3Q29udHJvbGxlciIgc2NlbmVNZW1iZXJJRD0idmlld0NvbnRyb2xsZXIiPgorICAgICAgICAgICAgICAgICAgICA8dmlldyBrZXk9InZpZXciIGlkPSJtMlMtSnAtUWRsIiBjdXN0b21DbGFzcz0iRGVtb1ZpZXciPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qga2V5PSJmcmFtZSIgeD0iMC4wIiB5PSIwLjAiIHdpZHRoPSI0MDAiIGhlaWdodD0iMzAwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXV0b3Jlc2l6aW5nTWFzayBrZXk9ImF1dG9yZXNpemluZ01hc2siLz4KKyAgICAgICAgICAgICAgICAgICAgPC92aWV3PgorICAgICAgICAgICAgICAgIDwvdmlld0NvbnRyb2xsZXI+CisgICAgICAgICAgICAgICAgPGN1c3RvbU9iamVjdCBpZD0iclB0LU5ULW5rVSIgdXNlckxhYmVsPSJGaXJzdCBSZXNwb25kZXIiIGN1c3RvbUNsYXNzPSJOU1Jlc3BvbmRlciIgc2NlbmVNZW1iZXJJRD0iZmlyc3RSZXNwb25kZXIiLz4KKyAgICAgICAgICAgIDwvb2JqZWN0cz4KKyAgICAgICAgICAgIDxwb2ludCBrZXk9ImNhbnZhc0xvY2F0aW9uIiB4PSI4MyIgeT0iNTY0Ii8+CisgICAgICAgIDwvc2NlbmU+CisgICAgPC9zY2VuZXM+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvUmVzb3VyY2VzL1Z1bGthbkljb24uaWNucyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL1Jlc291cmNlcy9WdWxrYW5JY29uLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4MmZiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL1Jlc291cmNlcy9WdWxrYW5JY29uLmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvY3ViZXBwLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9tYWNPUy9jdWJlcHAvY3ViZXBwLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NmRjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9jdWJlcHAuY21ha2UKQEAgLTAsMCArMSw4NSBAQAorIyB+fn4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxOCBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgfn5+CisKKyMgVmtDdWJlIEFwcGxpY2F0aW9uIEJ1bmRsZQorCitzZXQoY3ViZXBwX1NSQ1MKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZXBwL21haW4ubW0KKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZXBwL0FwcERlbGVnYXRlLm1tCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL2N1YmVwcC9EZW1vVmlld0NvbnRyb2xsZXIubW0pCisKK3NldCgKKyAgICBjdWJlcHBfSERSUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZXBwL0FwcERlbGVnYXRlLmggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL2N1YmVwcC9EZW1vVmlld0NvbnRyb2xsZXIuaAorICAgICkKKworc2V0KGN1YmVwcF9SRVNPVVJDRVMgJHtDTUFLRV9CSU5BUllfRElSfS9zdGFnaW5nLWpzb24vTW9sdGVuVktfaWNkLmpzb24KKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZXBwL1Jlc291cmNlcy9WdWxrYW5JY29uLmljbnMpCisKKyMgSGF2ZSBYY29kZSBoYW5kbGUgdGhlIFN0b3J5Ym9hcmQKK2lmKCR7Q01BS0VfR0VORVJBVE9SfSBNQVRDSEVTICJeWGNvZGUuKiIpCisgICAgc2V0KGN1YmVwcF9SRVNPVVJDRVMgJHtjdWJlcHBfUkVTT1VSQ0VTfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvY3ViZXBwL1Jlc291cmNlcy9NYWluLnN0b3J5Ym9hcmQpCitlbmRpZigpCisKK2FkZF9leGVjdXRhYmxlKHZrY3ViZXBwIE1BQ09TWF9CVU5ETEUgJHtjdWJlcHBfU1JDU30gJHtjdWJlcHBfSERSU30gJHtjdWJlcHBfUkVTT1VSQ0VTfSBjdWJlLnZlcnQuaW5jIGN1YmUuZnJhZy5pbmMpCisKKyMgSGFuZGxlIHRoZSBTdG9yeWJvYXJkIG91cnNlbHZlcworaWYoTk9UICR7Q01BS0VfR0VORVJBVE9SfSBNQVRDSEVTICJeWGNvZGUuKiIpCisgICAgIyBDb21waWxlIHRoZSBzdG9yeWJvYXJkIGZpbGUgd2l0aCB0aGUgaWJ0b29sLgorICAgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgdmtjdWJlcHAgUE9TVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7SUJUT09MfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS13YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbm90aWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0LWZvcm1hdCBodW1hbi1yZWFkYWJsZS10ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1jb21waWxlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS92a2N1YmVwcC5hcHAvQ29udGVudHMvUmVzb3VyY2VzL01haW4uc3Rvcnlib2FyZGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL2N1YmVwcC9SZXNvdXJjZXMvTWFpbi5zdG9yeWJvYXJkCisgICAgICAgICAgICAgICAgICAgICAgIENPTU1FTlQgIkNvbXBpbGluZyBzdG9yeWJvYXJkIikKK2VuZGlmKCkKKworYWRkX2RlcGVuZGVuY2llcyh2a2N1YmVwcCBNb2x0ZW5WS19pY2Qtc3RhZ2luZy1qc29uKQorCisjIEluY2x1ZGUgZGVtbyBzb3VyY2UgY29kZSBkaXIgYmVjYXVzZSB0aGUgTWFjT1MgdmtjdWJlcHAncyBPYmplY3RpdmUtQyBzb3VyY2UgaW5jbHVkZXMgdGhlICJvcmlnaW5hbCIgdmtjdWJlcHAgYXBwbGljYXRpb24gQysrIHNvdXJjZQorIyBjb2RlLiBBbHNvIGluY2x1ZGUgdGhlIE1vbHRlblZLIGhlbHBlciBmaWxlcy4KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKHZrY3ViZXBwIFBSSVZBVEUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7TU9MVEVOVktfRElSfS9Nb2x0ZW5WSy9pbmNsdWRlKQorCisjIFdlIGRvIHRoaXMgc28gdnVsa2FuaW5mbyBpcyBsaW5rZWQgdG8gYW4gaW5kaXZpZHVhbCBsaWJyYXJ5IGFuZCBOT1QgYSBmcmFtZXdvcmsuCit0YXJnZXRfbGlua19saWJyYXJpZXModmtjdWJlcHAgJHtWdWxrYW5fTElCUkFSWX0gIi1mcmFtZXdvcmsgQ29jb2EgLWZyYW1ld29yayBRdWFydHpDb3JlIikKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHZrY3ViZXBwIFBST1BFUlRJRVMgTUFDT1NYX0JVTkRMRV9JTkZPX1BMSVNUICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYWNPUy9jdWJlcHAvSW5mby5wbGlzdCkKKworIyBUaGUgUkVTT1VSQ0UgdGFyZ2V0IHByb3BlcnR5IGNhbm5vdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE1BQ09TWF9QQUNLQUdFX0xPQ0FUSU9OIHByb3BlcnR5LiAgV2UgbmVlZCBmaW5lLWdyYWluZWQKKyMgY29udHJvbCBvdmVyIHRoZSBSZXNvdXJjZSBkaXJlY3RvcnksIHNvIHdlIGhhdmUgdG8gc3BlY2lmeSB0aGUgZGVzdGluYXRpb24gb2YgYWxsIHRoZSByZXNvdXJjZSBmaWxlcyBvbiBhIHBlci1kZXN0aW5hdGlvbi0KKyMgZGlyZWN0b3J5IGJhc2lzLiBJZiBhbGwgdGhlIGZpbGVzIHdlbnQgaW50byB0aGUgdG9wLWxldmVsIFJlc291cmNlIGRpcmVjdG9yeSwgdGhlbiB3ZSBjb3VsZCBzaW1wbHkgc2V0IHRoZSBSRVNPVVJDRSBwcm9wZXJ0eSB0byBhCisjIGxpc3Qgb2YgYWxsIHRoZSByZXNvdXJjZSBmaWxlcy4KK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke2N1YmVwcF9SRVNPVVJDRVN9IFBST1BFUlRJRVMgTUFDT1NYX1BBQ0tBR0VfTE9DQVRJT04gIlJlc291cmNlcyIpCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoIiR7Q01BS0VfQklOQVJZX0RJUn0vc3RhZ2luZy1qc29uL01vbHRlblZLX2ljZC5qc29uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNPU1hfUEFDS0FHRV9MT0NBVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMvdnVsa2FuL2ljZC5kIikKKworIyBDb3B5IHRoZSBNb2x0ZW5WSyBsaWIgaW50byB0aGUgYnVuZGxlLgoraWYoJHtDTUFLRV9HRU5FUkFUT1J9IE1BVENIRVMgIl5YY29kZS4qIikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIHZrY3ViZXBwIFBPU1RfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgIiR7TU9MVEVOVktfRElSfS9Nb2x0ZW5WSy9tYWNPUy9keW5hbWljL2xpYk1vbHRlblZLLmR5bGliIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8kPENPTkZJRz4vdmtjdWJlcHAuYXBwL0NvbnRlbnRzL0ZyYW1ld29ya3MvbGliTW9sdGVuVksuZHlsaWIKKyAgICAgICAgICAgICAgICAgICAgICAgREVQRU5EUyB2dWxrYW4pCitlbHNlKCkKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIHZrY3ViZXBwIFBPU1RfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgIiR7TU9MVEVOVktfRElSfS9Nb2x0ZW5WSy9tYWNPUy9keW5hbWljL2xpYk1vbHRlblZLLmR5bGliIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS92a2N1YmVwcC5hcHAvQ29udGVudHMvRnJhbWV3b3Jrcy9saWJNb2x0ZW5WSy5keWxpYgorICAgICAgICAgICAgICAgICAgICAgICBERVBFTkRTIHZ1bGthbikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvbWFjT1MvY3ViZXBwL21haW4ubW0gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9tYWluLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWUwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9jdWJlL21hY09TL2N1YmVwcC9tYWluLm1tCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBtYWluLm0KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBUaGUgQnJlbndpbGwgV29ya3Nob3AgTHRkLiAoaHR0cDovL3d3dy5icmVud2lsbC5jb20pCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeyByZXR1cm4gTlNBcHBsaWNhdGlvbk1haW4oYXJnYywgYXJndik7IH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvb2JqZWN0X3R5cGVfc3RyaW5nX2hlbHBlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvY3ViZS9vYmplY3RfdHlwZV9zdHJpbmdfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3OWJhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2N1YmUvb2JqZWN0X3R5cGVfc3RyaW5nX2hlbHBlci5oCkBAIC0wLDAgKzEsMTEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE4IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNwcmFnbWEgb25jZQorI2lmZGVmIF9XSU4zMgorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDA2NSApCisjZW5kaWYKKworI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtPYmplY3RUeXBlKFZrT2JqZWN0VHlwZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa09iamVjdFR5cGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1FVRVJZX1BPT0w6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1FVRVJZX1BPT0wiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlgiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9TRU1BUEhPUkU6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1NFTUFQSE9SRSI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRSI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUiI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU0FNUExFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfU0FNUExFUiI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0VYVCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU1BR0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0lNQUdFIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9VTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9VTktOT1dOIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0w6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0JVRkZFUiI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9JTlNUQU5DRToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfSU5TVEFOQ0UiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU1BR0VfVklFVzoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfSU1BR0VfVklFVyI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0wiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfRElTUExBWV9LSFIiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9CVUZGRVJfVklFVyI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0VYVCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEUiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRSI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVQiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUlk6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUlkiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0ZFTkNFOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9GRU5DRSI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfUVVFVUU6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1FVRVVFIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVZJQ0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0RFVklDRSI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1M6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9FVkVOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfRVZFTlQiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9QSVBFTElORSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa09iamVjdFR5cGUiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2V4dGVybmFsL3g2NC9saWIvdnVsa2FuLTEubGliIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvZXh0ZXJuYWwveDY0L2xpYi92dWxrYW4tMS5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyM2E3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2V4dGVybmFsL3g2NC9saWIvdnVsa2FuLTEubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2V4dGVybmFsL3g4Ni9saWIvdnVsa2FuLTEubGliIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvZXh0ZXJuYWwveDg2L2xpYi92dWxrYW4tMS5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhYTdiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2V4dGVybmFsL3g4Ni9saWIvdnVsa2FuLTEubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzg1MzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTc3IEBACisjIH5+fgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgfn5+CisKK2lmKFdJTjMyKQorICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgLURWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hYIC1EV0lOMzJfTEVBTl9BTkRfTUVBTikKK2Vsc2VpZihBTkRST0lEKQorICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiAtRFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIWCkKK2Vsc2VpZihBUFBMRSkKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLKQorZWxzZWlmKFVOSVggQU5EIE5PVCBBUFBMRSkgIyBpLmUuIExpbnV4CisgICAgaWYoQlVJTERfV1NJX1hDQl9TVVBQT1JUKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fWENCX0tIUiAtRFZLX1VTRV9QTEFURk9STV9YQ0JfS0hYKQorICAgIGVuZGlmKCkKKworICAgIGlmKEJVSUxEX1dTSV9YTElCX1NVUFBPUlQpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9YTElCX0tIUiAtRFZLX1VTRV9QTEFURk9STV9YTElCX0tIWCAtRFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQpCisgICAgZW5kaWYoKQorCisgICAgaWYoQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSIC1EVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hYKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuc3VwcG9ydGVkIFBsYXRmb3JtISIpCitlbmRpZigpCisKKyMgQ29weSBvciBsaW5rIHRoZSBKU09OIGZpbGVzIHRvIHRoZSBiaW5hcnkgZGlyZWN0b3J5IGZvciBlYXNlIG9mIHVzZSBpbiB0aGUgYnVpbGQgdHJlZS4KK3NldChJQ0RfSlNPTl9GSUxFUyBWa0lDRF9tb2NrX2ljZCkKK2lmKFdJTjMyKQorICAgICMgZXh0cmEgc2V0dXAgZm9yIG91dC1vZi10cmVlIGJ1aWxkcworICAgIGlmKE5PVCAoQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIFNUUkVRVUFMIENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUikpCisgICAgICAgIGlmKENNQUtFX0dFTkVSQVRPUiBNQVRDSEVTICJeVmlzdWFsIFN0dWRpby4qIikKKyAgICAgICAgICAgIGZvcmVhY2goY29uZmlnX2ZpbGUgJHtJQ0RfSlNPTl9GSUxFU30pCisgICAgICAgICAgICAgICAgZmlsZShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vd2luZG93cy8ke2NvbmZpZ19maWxlfS5qc29uIHNyY19qc29uKQorICAgICAgICAgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyQ8Q09ORklHPi8ke2NvbmZpZ19maWxlfS5qc29uIGRzdF9qc29uKQorICAgICAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7Y29uZmlnX2ZpbGV9LWpzb24gQUxMIENPTU1BTkQgY29weSAke3NyY19qc29ufSAke2RzdF9qc29ufSBWRVJCQVRJTSkKKyAgICAgICAgICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtjb25maWdfZmlsZX0tanNvbiBQUk9QRVJUSUVTIEZPTERFUiAke1RPT0xTX0hFTFBFUl9GT0xERVJ9KQorICAgICAgICAgICAgZW5kZm9yZWFjaChjb25maWdfZmlsZSkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBmb3JlYWNoKGNvbmZpZ19maWxlICR7SUNEX0pTT05fRklMRVN9KQorICAgICAgICAgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3dpbmRvd3MvJHtjb25maWdfZmlsZX0uanNvbiBzcmNfanNvbikKKyAgICAgICAgICAgICAgICBmaWxlKFRPX05BVElWRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke2NvbmZpZ19maWxlfS5qc29uIGRzdF9qc29uKQorICAgICAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7Y29uZmlnX2ZpbGV9LWpzb24gQUxMIENPTU1BTkQgY29weSAke3NyY19qc29ufSAke2RzdF9qc29ufSBWRVJCQVRJTSkKKyAgICAgICAgICAgIGVuZGZvcmVhY2goY29uZmlnX2ZpbGUpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCitlbHNlaWYoQVBQTEUpCisgICAgIyBleHRyYSBzZXR1cCBmb3Igb3V0LW9mLXRyZWUgYnVpbGRzCisgICAgaWYoTk9UIChDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVIgU1RSRVFVQUwgQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSKSkKKyAgICAgICAgaWYoQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIl5YY29kZS4qIikKKyAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KG1rX2ljZF9jb25maWdfZGlyIEFMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8kPENPTkZJRz4pCisgICAgICAgICAgICBmb3JlYWNoKGNvbmZpZ19maWxlICR7SUNEX0pTT05fRklMRVN9KQorICAgICAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7Y29uZmlnX2ZpbGV9LWpzb24gQUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVQRU5EUyBta19pY2RfY29uZmlnX2RpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjcmVhdGVfc3ltbGluayAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjb3MvJHtjb25maWdfZmlsZX0uanNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDxDT05GSUc+ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8kPENPTkZJRz4vJHtjb25maWdfZmlsZX0uanNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkJBVElNKQorICAgICAgICAgICAgZW5kZm9yZWFjaChjb25maWdfZmlsZSkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBmb3JlYWNoKGNvbmZpZ19maWxlICR7SUNEX0pTT05fRklMRVN9KQorICAgICAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7Y29uZmlnX2ZpbGV9LWpzb24gQUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNyZWF0ZV9zeW1saW5rICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYWNvcy8ke2NvbmZpZ19maWxlfS5qc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbmZpZ19maWxlfS5qc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0pCisgICAgICAgICAgICBlbmRmb3JlYWNoKGNvbmZpZ19maWxlKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorZWxzZSgpCisgICAgIyBleHRyYSBzZXR1cCBmb3Igb3V0LW9mLXRyZWUgYnVpbGRzCisgICAgaWYoTk9UIChDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVIgU1RSRVFVQUwgQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSKSkKKyAgICAgICAgZm9yZWFjaChjb25maWdfZmlsZSAke0lDRF9KU09OX0ZJTEVTfSkKKyAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7Y29uZmlnX2ZpbGV9LWpzb24gQUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpbnV4LyR7Y29uZmlnX2ZpbGV9Lmpzb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjb25maWdfZmlsZX0uanNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0pCisgICAgICAgIGVuZGZvcmVhY2goY29uZmlnX2ZpbGUpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCisjIEZvciBJQ0Qgd2l0aCBhIGRpcmVjdCBkZXBlbmRlbmN5IG9uIGEgcHJvamVjdCB3aXRoIHRoZSBzYW1lIG5hbWUsIHVzZSBpdC4KK2lmKE5PVCAoQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIFNUUkVRVUFMIENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUikpCisgICAgZm9yZWFjaChjb25maWdfZmlsZSAke0lDRF9KU09OX0ZJTEVTfSkKKyAgICAgICAgYWRkX2RlcGVuZGVuY2llcygke2NvbmZpZ19maWxlfS1qc29uICR7Y29uZmlnX2ZpbGV9KQorICAgIGVuZGZvcmVhY2goY29uZmlnX2ZpbGUpCitlbmRpZigpCithZGRfY3VzdG9tX3RhcmdldChnZW5lcmF0ZV9pY2RfZmlsZXMgREVQRU5EUyBtb2NrX2ljZC5oIG1vY2tfaWNkLmNwcCkKK3NldF90YXJnZXRfcHJvcGVydGllcyhnZW5lcmF0ZV9pY2RfZmlsZXMgUFJPUEVSVElFUyBGT0xERVIgJHtUT09MU19IRUxQRVJfRk9MREVSfSkKKworaWYoV0lOMzIpCisgICAgbWFjcm8oYWRkX3ZrX2ljZCB0YXJnZXQpCisgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1ZrSUNEXyR7dGFyZ2V0fS5kZWYgREVGX0ZJTEUpCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KGNvcHktJHt0YXJnZXR9LWRlZi1maWxlIEFMTAorICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgJHtERUZfRklMRX0gVmtJQ0RfJHt0YXJnZXR9LmRlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJCQVRJTSkKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGNvcHktJHt0YXJnZXR9LWRlZi1maWxlIFBST1BFUlRJRVMgRk9MREVSICR7VE9PTFNfSEVMUEVSX0ZPTERFUn0pCisgICAgICAgIGFkZF9saWJyYXJ5KFZrSUNEXyR7dGFyZ2V0fSBTSEFSRUQgJHtBUkdOfSBWa0lDRF8ke3RhcmdldH0uZGVmKQorICAgICAgICBpZihJTlNUQUxMX0lDRCkKKyAgICAgICAgICAgIGluc3RhbGwoVEFSR0VUUyBWa0lDRF8ke3RhcmdldH0gREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRtYWNybygpCitlbHNlaWYoQVBQTEUpCisgICAgbWFjcm8oYWRkX3ZrX2ljZCB0YXJnZXQpCisgICAgICAgIGFkZF9saWJyYXJ5KFZrSUNEXyR7dGFyZ2V0fSBTSEFSRUQgJHtBUkdOfSkKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZrSUNEXyR7dGFyZ2V0fSBQUk9QRVJUSUVTIExJTktfRkxBR1MgIi1XbCIpCisgICAgICAgIGlmKElOU1RBTExfSUNEKQorICAgICAgICAgICAgaW5zdGFsbChUQVJHRVRTIFZrSUNEXyR7dGFyZ2V0fSBERVNUSU5BVElPTiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRtYWNybygpCitlbHNlKCkKKyAgICBtYWNybyhhZGRfdmtfaWNkIHRhcmdldCkKKyAgICAgICAgYWRkX2xpYnJhcnkoVmtJQ0RfJHt0YXJnZXR9IFNIQVJFRCAke0FSR059KQorICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoVmtJQ0RfJHt0YXJnZXR9IFBST1BFUlRJRVMgTElOS19GTEFHUyAiLVdsLC1leHBvcnQtZHluYW1pYywtQnN5bWJvbGljLC0tZXhjbHVkZS1saWJzLEFMTCIpCisgICAgICAgIGlmKChVTklYIEFORCBOT1QgQVBQTEUpIEFORCBJTlNUQUxMX0lDRCkgIyBpLmUuIExpbnV4CisgICAgICAgICAgICBpbnN0YWxsKFRBUkdFVFMgVmtJQ0RfJHt0YXJnZXR9IERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQorICAgICAgICBlbmRpZigpCisgICAgZW5kbWFjcm8oKQorZW5kaWYoKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgICAgICAgICAke1Z1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICR7V0FZTEFORF9DTElFTlRfSU5DTFVERV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAgICAke1BST0pFQ1RfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSkKKworaWYoV0lOMzIpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHU19SRUxFQVNFICIke0NNQUtFX0NYWF9GTEFHU19SRUxFQVNFfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIikKKyAgICBzZXQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTyAiJHtDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk99IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgIHNldChDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk99IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfREVCVUcgIiR7Q01BS0VfQ1hYX0ZMQUdTX0RFQlVHfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC9iaWdvYmoiKQorICAgIHNldChDTUFLRV9DX0ZMQUdTX0RFQlVHICIke0NNQUtFX0NfRkxBR1NfREVCVUd9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgL2JpZ29iaiIpCisgICAgIyBUdXJuIG9mZiB0cmFuc2l0aW9uYWwgImNoYW5nZWQgYmVoYXZpb3IiIHdhcm5pbmcgbWVzc2FnZSBmb3IgVmlzdWFsIFN0dWRpbyB2ZXJzaW9ucyBwcmlvciB0byAyMDE1LiBUaGUgY2hhbmdlZCBiZWhhdmlvciBpcworICAgICMgdGhhdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMgYXJlIG5vdyBmaXhlZCB0byBjbGVhciB0aGUgc3RydWN0IG1lbWJlcnMuCisgICAgYWRkX2NvbXBpbGVfb3B0aW9ucygiJDwkPEFORDokPENYWF9DT01QSUxFUl9JRDpNU1ZDPiwkPFZFUlNJT05fTEVTUzokPENYWF9DT01QSUxFUl9WRVJTSU9OPiwxOT4+Oi93ZDQzNTE+IikKK2Vsc2UoKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtV3BvaW50ZXItYXJpdGggLVduby11bnVzZWQtZnVuY3Rpb24gLVduby1zaWduLWNvbXBhcmUiKQorICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC1XcG9pbnRlci1hcml0aCAtV25vLXVudXNlZC1mdW5jdGlvbiAtV25vLXNpZ24tY29tcGFyZSIpCitlbmRpZigpCisKK2FkZF92a19pY2QobW9ja19pY2QgZ2VuZXJhdGVkL21vY2tfaWNkLmNwcCBnZW5lcmF0ZWQvbW9ja19pY2QuaCkKKworIyBKU09OIGZpbGUocykgaW5zdGFsbCB0YXJnZXRzLiBGb3IgTGludXgsIG5lZWQgdG8gcmVtb3ZlIHRoZSAiLi8iIGZyb20gdGhlIGxpYnJhcnkgcGF0aCBiZWZvcmUgaW5zdGFsbGluZyB0byBzeXN0ZW0gZGlyZWN0b3JpZXMuCitpZigoVU5JWCBBTkQgTk9UIEFQUExFKSBBTkQgSU5TVEFMTF9JQ0QpICMgaS5lLiBMaW51eAorICAgIGZvcmVhY2goY29uZmlnX2ZpbGUgJHtJQ0RfSlNPTl9GSUxFU30pCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7Y29uZmlnX2ZpbGV9LXN0YWdpbmctanNvbiBBTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCBta2RpciAtcCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3RhZ2luZy1qc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgY3AgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpbnV4LyR7Y29uZmlnX2ZpbGV9Lmpzb24gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3N0YWdpbmctanNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EIHNlZCAtaSAtZSAiL1wibGlicmFyeV9wYXRoXCI6L3MkLi9saWJWa0lDRCRsaWJWa0lDRCQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3N0YWdpbmctanNvbi8ke2NvbmZpZ19maWxlfS5qc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkJBVElNCisgICAgICAgICAgICAgICAgICAgICAgICAgIERFUEVORFMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpbnV4LyR7Y29uZmlnX2ZpbGV9Lmpzb24pCisgICAgICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3N0YWdpbmctanNvbi8ke2NvbmZpZ19maWxlfS5qc29uCisgICAgICAgICAgICAgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0RBVEFST09URElSfS92dWxrYW4vaWNkLmQpCisgICAgZW5kZm9yZWFjaChjb25maWdfZmlsZSkKK2VuZGlmKCkKKworIyBXaW5kb3dzIHVzZXMgdGhlIEpTT04gZmlsZSBhcy1pcy4KK2lmKFdJTjMyIEFORCBJTlNUQUxMX0lDRCkKKyAgICBmb3JlYWNoKGNvbmZpZ19maWxlICR7SUNEX0pTT05fRklMRVN9KQorICAgICAgICBpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS93aW5kb3dzLyR7Y29uZmlnX2ZpbGV9Lmpzb24gREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCisgICAgZW5kZm9yZWFjaChjb25maWdfZmlsZSkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTRiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsODcgQEAKKyMgVnVsa2FuIE1vY2sgSUNECisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgbW9jayBJQ0QgZHJpdmVyIGRlc2lnbmVkIGZvciB2YWxpZGF0aW9uIGxheWVyIHRlc3RpbmcuCisKKyMjIEludHJvZHVjdGlvbgorCitUaGUgbW9jayBJQ0QgaXMgZm9jdXNlZCBvbiBlbmFibGluZyB2YWxpZGF0aW9uIHRlc3RpbmcgYXBhcnQgZnJvbSBhbiBhY3R1YWwgZGV2aWNlLiBCZWNhdXNlIHRoZSB2YWxpZGF0aW9uIGxheWVycworc2l0IG9uIHRvcCBvZiB0aGUgSUNEIGFuZCBkb24ndCBkZXBlbmQgdXBvbiB0aGUgcmVzdWx0cyBvZiBWdWxrYW4gcmVuZGVyaW5nLCB0aGV5IGNhbiBiZSB0ZXN0ZWQgd2l0aG91dCBoYXZpbmcgYWN0dWFsCitHUFUgaGFyZHdhcmUgYmFja2luZyB0aGUgSUNELiBUaGUgZmluYWwgbW9jayBkcml2ZXIgd2lsbCBiZSBjb21wb3NlZCBvZiB0aHJlZSBtYWluIGZlYXR1cmVzOiBhIG51bGwgZHJpdmVyLCBmbGV4aWJsZQorZGV2aWNlIGNvbmZpZ3VyYXRpb24sIGFuZCBlbnRyeXBvaW50IHRyYWNraW5nICYgdmVyaWZpY2F0aW9uLgorCisjIyMgTnVsbCBEcml2ZXIKK1RoZSBpbnRpYWwgbW9jayBkcml2ZXIgZmVhdHVyZXMganVzdCB0aGUgbnVsbCBkcml2ZXIgY2FwYWJpbGl0eS4gVGhpcyBhbGxvd3MgYWxsIG9mIHRoZSB2YWxpZGF0aW9uIHRlc3RzIHRvIGJlIHJ1bgorb24gYSBmaXhlZCBkZXZpY2UgY29uZmlndXJhdGlvbiB0aGF0IGlzIGhhcmQtY29kZWQgaW50byB0aGUgSUNELgorCisjIyMgRGV2aWNlIENvbmZpZ3VyYXRpb24KK0RldmljZSBjb25maWd1cmF0aW9uIGNhbiBiZSBhZGRlZCBieSBydW5uaW5nIHRoZSBEZXZTaW0gbGF5ZXIgYmVsb3cgdGhlIHZhbGlkYXRpb24gbGF5ZXJzLCBidXQgYWJvdmUgdGhlIG1vY2sgZHJpdmVyLgorVGhlIGN1cnJlbnQgcGxhbiBpcyB0aGF0IGlmIGRldmljZSBjdXN0b21pemF0aW9uIGJleW9uZCBEZXZTaW0ncyBjYXBhYmlsaXRpZXMgYXJlIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uIGxheWVyIHRlc3RpbmcKK3RoZW4gdGhlIERldlNpbSBsYXllciB3aWxsIGJlIGVuaGFuY2VkIHdpdGggdGhlIHJlcXVpcmVkIGZlYXR1cmVzLiBUaGUgbW9jayBsYXllciBpdHNlbGYgaXMganVzdCBwbGFubmVkIHRvIGhhdmUgc29tZQoraGFyZC1jb2RlZCBkZXZpY2Ugc2V0dGluZ3MgdGhhdCB3aWxsIGVuYWJsZSBpdCB0byBydW4gYWxsIG9mIHRoZSB2YWxpZGF0aW9uIHRlc3RzLgorCisjIyMgRW50cnlwb2ludCBUcmFja2luZyAmIFZlcmlmaWNhdGlvbgorRW50cnlwb2ludCB0cmFja2luZyBhbmQgdmVyaWZpY2F0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIG1vY2sgbGF5ZXIgYXMgYSBsYXRlciBmZWF0dXJlLiBUaGUgaWRlYSBpcyB0aGF0IGFsbCBleHBlY3RlZAorVnVsa2FuIGZ1bmN0aW9uIGNhbGxzIGFuZCB0aGVpciBwYXJhbWV0ZXJzIGNhbiBiZSBzdG9yZWQgaW4gdGhlIElDRCBhbmQgdGhlbiBhIHNlcGFyYXRlIGNhbGwgY2FuIGJlIG1hZGUgdG8gdmVyaWZ5IHRoYXQKK3RoZSBleGVwZWN0ZWQgY2FsbHMgYW5kIHBhcmFtZXRlcnMgYWN0dWFsbHkgZW50ZXJlZCB0aGUgSUNELiBUaGlzIGFsbG93cyB2ZXJpZmljYXRpb24gdGhhdCB0aGUgdmFsaWRhdGlvbiBsYXllcnMgYXJlCitjb3JyZWN0bHkgcGFzc2luZyBjYWxscyBhbmQgdGhlaXIgcGFyYW1ldGVycyB0aHJvdWdoIHRvIHRoZSBJQ0QgdW5jaGFuZ2VkLgorCisjIyBVc2luZyB0aGUgTW9jayBJQ0QKKworVG8gZW5hYmxlIHRoZSBtb2NrIElDRCwgc2V0IFZLXF9JQ0RcX0ZJTEVOQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0byB5b3VyIHtCVUlMRF9ESVJ9L2ljZC9Wa0lDRFxfbW9ja1xfaWNkLmpzb24uCisKKyMjIFBsYW5zCisKK1RoZSBpbml0aWFsIG1vY2sgSUNEIGlzIGp1c3QgdGhlIG51bGwgZHJpdmVyIHdoaWNoIGNhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggRGV2U2ltIHRvIHRlc3QgdmFsaWRhdGlvbiBsYXllcnMgb24KK3NpbXVsYXRlZCBkZXZpY2VzLiBIZXJlJ3MgYSByb3VnaCBzZXF1ZW5jZSBvZiB0YXNrcyBwbGFubmVkIGZvciB0aGUgbW9jayBkcml2ZXIgZ29pbmcgZm9yd2FyZDoKKy0gW1hdIEdldCBhbGwgTFZMIHRlc3RzIHBhc3Npbmcgb24gdGhlIGJhcmUgbnVsbCBkcml2ZXIKKy0gW1hdIEdldCBmYWlsaW5nIHRlc3RzIHBhc3NpbmcKKy0gW1hdIEdldCBza2lwcGVkIHRlc3RzIHBhc3NpbmcgYXMgYWJsZQorLSBbIF0gR2V0IGFsbCBMVkwgdGVzdHMgdG8gcnVuIHdpdGhvdXQgdW5leHBlY3RlZCBlcnJvcnMKKy0gW1hdIERldmVsb3AgYXV0b21hdGVkIHRlc3QgZmxvdyB1c2luZyBtb2NrIElDRCAoYWx0ZXJuYXRpdmUgdG8gb3IgcmVwbGFjZW1lbnQgZm9yIHJ1blxfYWxsXF90ZXN0cy5zaCkKKy0gW1hdIEdldCBhbGwgTFZMIHRlc3RzIHRvIHBhc3Mgb24gYSBzZWxlY3Rpb24gb2YgZGV2aWNlIHByb2ZpbGVzIHVzaW5nIERldlNpbSBsYXllcgorLSBbIF0gVXBkYXRlIExWTCB0ZXN0cyB3aXRoIGRldmljZSBkZXBlbmRlbmNpZXMgdG8gdGFyZ2V0IHNwZWNpZmljIGRldmljZSBwcm9maWxlcworLSBbIF0gQWRkIGVudHJ5cG9pbnQgdHJhY2tpbmcgJiB2ZXJpZmljYXRpb24KKy0gWyBdIEluaXRpYWxseSB0cmFjayBleHBlY3RlZCBjYWxscworLSBbIF0gVXBkYXRlIHNvbWUgdGVzdHMgdG8gdmVyaWZ5IGV4cGVjdGVkIGNhcGFiaWxpdHkKKy0gWyBdIEV4cGFuZCB0cmFja2luZyB0byBpbmNsdWRlIHBhcmFtZXRlcnMKKworIyMgQmV5b25kIFZhbGlkYXRpb24gTGF5ZXIgVGVzdGluZworCitUaGUgZm9jdXMgb2YgdGhlIG1vY2sgaWNkIGlzIGZvciB2YWxpZGF0aW9uIHRlc3RpbmcsIGJ1dCB0aGUgY29kZSBpcyBhdmFpbGFibGUgdG8gdXNlIGFuZCBlbmhhbmNlIGZvciBhbnlvbmUgd2lzaGluZyB0byBhcHBseSBpdCBmb3IgYWx0ZXJuYXRpdmUKK3B1cnBvc2VzLgorV2l0aCB0aGUgZm9sbG93aW5nIGVuaGFuY2VtZW50cywgdGhlIG1vY2sgZHJpdmVyIHN0YXRlIGF2YWlsYWJsZSB0byB0aGUgYXBwIHNob3VsZCB2ZXJ5IGNsb3NlbHkgbWltaWMgYW4gYWN0dWFsIElDRDoKKy0gVXBkYXRlIHZhcmlvdXMgZnVuY3Rpb24gcmV0dXJuIGNvZGVzCistIFNpbXVsYXRlZCBzeW5jaHJvbml6YXRpb24gb2JqZWN0cworLSBTaW11bGF0ZWQgcXVlcnkgd2l0aCBtb2NrIGRhdGEKKy0gQmFzaWMgY29tbWFuZCBidWZmZXIgc3RhdGUgdHJhY2tpbmcgdG8gbm90ZSBzeW5jaCBvYmplY3QgdHJhbnNpdGlvbnMgYW5kIHF1ZXJ5IHN0YXRlIHVwZGF0ZXMKKworQmV5b25kIHRoYXQgaXQncyBjZXJ0YWlubHkgcG9zc2libGUgdGhhdCB0aGUgbW9jayBpY2QgY291bGQgYmUgaG9va2VkIHVwIHRvIGEgU1cgcmVuZGVyZXIgYW5kIHNlcnZlIGFzIGEgdmlydHVhbCBHUFUgd2l0aCBjb21wbGV0ZSByZW5kZXJpbmcvY29tcHV0ZQorY2FwYWJpbGl0aWVzLgorCisjIyBTdGF0dXMKKworVGhpcyBpcyBhIHRlbXBvcmFyeSBzZWN0aW9uIHVzZWQgZm9yIHRyYWNraW5nIGFzIHRoZSBtb2NrIGljZCBpcyBiZWluZyBkZXZlbG9wZWQuIE9uY2UgYWxsIHRlc3RzIGFyZSBwYXNzaW5nIHdpdGggdGhlIG1vY2ssIHRoaXMgc2VjdGlvbiBjYW4gYmUgcmVtb3ZlZC4KK0N1cnJlbnRseSAzMzMvMzMzIHRlc3RzIGFyZSBwYXNzaW5nIHdpdGggdGhlIG1vY2sgaWNkLCBidXQgbWFueSBwYXNzaW5nIHRlc3RzIGhhdmUgdW5leHBlY3RlZCB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IG5lZWQgdG8gYmUgY2xlYW5lZCB1cC4KKworIyMjIEZhaWxpbmcgVGVzdHMKKworTk9ORQorCisjIyMgUGFzc2luZyBUZXN0cyBXaXRoIFVuZXhwZWN0ZWQgRXJyb3JzCisKKy0gVmtMYXllclRlc3QuUmVuZGVyUGFzc0luVXNlRGVzdHJveWVkU2lnbmFsZWQKKy0gVmtMYXllclRlc3QuUmVuZGVyUGFzc0luY29tcGF0aWJsZQorCisjIyMgU2tpcHBlZCBUZXN0cworCistIFZrTGF5ZXJUZXN0LkJpbmRJbWFnZUludmFsaWRNZW1vcnlUeXBlCistIFZrTGF5ZXJUZXN0LkNyZWF0ZVBpcGVsaW5lQmFkVmVydGV4QXR0cmlidXRlRm9ybWF0CistIFZrTGF5ZXJUZXN0Lk1pc2NCbGl0SW1hZ2VUZXN0cworLSBWa0xheWVyVGVzdC5UZW1wb3JhcnlFeHRlcm5hbFNlbWFwaG9yZQorLSBWa0xheWVyVGVzdC5UZW1wb3JhcnlFeHRlcm5hbEZlbmNlCistIFZrTGF5ZXJUZXN0LkludmFsaWRCYXJyaWVycworLSBWa0xheWVyVGVzdC5Db21tYW5kUXVldWVGbGFncworLSBWa1Bvc2l0aXZlTGF5ZXJUZXN0LlR3b1F1ZXVlc0Vuc3VyZUNvcnJlY3RSZXRpcmVtZW50V2l0aFdvcmtTdG9sZW4KKy0gVmtQb3NpdGl2ZUxheWVyVGVzdC5FeHRlcm5hbFNlbWFwaG9yZQorLSBWa1Bvc2l0aXZlTGF5ZXJUZXN0LkV4dGVybmFsRmVuY2UKKy0gVmtQb3NpdGl2ZUxheWVyVGVzdC5FeHRlcm5hbE1lbW9yeQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL1ZrSUNEX21vY2tfaWNkLmRlZiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9Wa0lDRF9tb2NrX2ljZC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwZmIzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9Wa0lDRF9tb2NrX2ljZC5kZWYKQEAgLTAsMCArMSwzNiBAQAorCis7Ozs7IEJlZ2luIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OworOworOyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBUaGUgS2hyb25vcyBHcm91cCBJbmMuCis7IENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCis7IENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEx1bmFyRywgSW5jLgorOyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBHb29nbGUgSW5jLgorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOworOyAgQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+Cis7Cis7Ozs7ICBFbmQgQ29weXJpZ2h0IE5vdGljZSA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OworCitMSUJSQVJZIFZrSUNEX21vY2tfaWNkCitFWFBPUlRTCit2a19pY2RHZXRJbnN0YW5jZVByb2NBZGRyCit2a19pY2RHZXRQaHlzaWNhbERldmljZVByb2NBZGRyCit2a19pY2ROZWdvdGlhdGVMb2FkZXJJQ0RJbnRlcmZhY2VWZXJzaW9uCit2a0Rlc3Ryb3lTdXJmYWNlS0hSCit2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIKK3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSCit2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIKK3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSCit2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIKK3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvZ2VuZXJhdGVkLy5jbGFuZy1mb3JtYXQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvZ2VuZXJhdGVkLy5jbGFuZy1mb3JtYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiOTgzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9nZW5lcmF0ZWQvLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDUgQEAKKy0tLQorIyBEaXNhYmxlIGNsYW5nLWZvcm1hdCBmb3IgZ2VuZXJhdGVkIGNvZGUKK0Rpc2FibGVGb3JtYXQ6IHRydWUKK1NvcnRJbmNsdWRlczogZmFsc2UKKy4uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL2dlbmVyYXRlZC9tb2NrX2ljZC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvZ2VuZXJhdGVkL21vY2tfaWNkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThhNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL2dlbmVyYXRlZC9tb2NrX2ljZC5jcHAKQEAgLTAsMCArMSw0NDYzIEBACisvKgorKiogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoKKyoqIFRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBLaHJvbm9zIFZ1bGthbiBYTUwgQVBJIFJlZ2lzdHJ5LgorKioKKyovCisKKyNpbmNsdWRlICJtb2NrX2ljZC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJ2a190eXBlbWFwX2hlbHBlci5oIgorbmFtZXNwYWNlIHZrbW9jayB7CisKKwordXNpbmcgc3RkOjp1bm9yZGVyZWRfbWFwOworCisvLyBNYXAgZGV2aWNlIG1lbW9yeSBoYW5kbGUgdG8gYW55IG1hcHBlZCBhbGxvY2F0aW9ucyB0aGF0IHdlJ2xsIG5lZWQgdG8gZnJlZSBvbiB1bm1hcAorc3RhdGljIHVub3JkZXJlZF9tYXA8VmtEZXZpY2VNZW1vcnksIHN0ZDo6dmVjdG9yPHZvaWQqPj4gbWFwcGVkX21lbW9yeV9tYXA7CisKK3N0YXRpYyBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsX2RldmljZSA9IG51bGxwdHI7CitzdGF0aWMgdW5vcmRlcmVkX21hcDxWa0RldmljZSwgdW5vcmRlcmVkX21hcDx1aW50MzJfdCwgdW5vcmRlcmVkX21hcDx1aW50MzJfdCwgVmtRdWV1ZT4+PiBxdWV1ZV9tYXA7CitzdGF0aWMgdW5vcmRlcmVkX21hcDxWa0RldmljZSwgdW5vcmRlcmVkX21hcDxWa0J1ZmZlciwgVmtCdWZmZXJDcmVhdGVJbmZvPj4gYnVmZmVyX21hcDsKKworLy8gVE9ETzogV291bGQgbGlrZSB0byBjb2RlZ2VuIHRoaXMgYnV0IGxpbWl0cyBhcmVuJ3QgaW4gWE1MCitzdGF0aWMgVmtQaHlzaWNhbERldmljZUxpbWl0cyBTZXRMaW1pdHMoVmtQaHlzaWNhbERldmljZUxpbWl0cyAqbGltaXRzKSB7CisgICAgbGltaXRzLT5tYXhJbWFnZURpbWVuc2lvbjFEID0gNDA5NjsKKyAgICBsaW1pdHMtPm1heEltYWdlRGltZW5zaW9uMkQgPSA0MDk2OworICAgIGxpbWl0cy0+bWF4SW1hZ2VEaW1lbnNpb24zRCA9IDI1NjsKKyAgICBsaW1pdHMtPm1heEltYWdlRGltZW5zaW9uQ3ViZSA9IDQwOTY7CisgICAgbGltaXRzLT5tYXhJbWFnZUFycmF5TGF5ZXJzID0gMjU2OworICAgIGxpbWl0cy0+bWF4VGV4ZWxCdWZmZXJFbGVtZW50cyA9IDY1NTM2OworICAgIGxpbWl0cy0+bWF4VW5pZm9ybUJ1ZmZlclJhbmdlID0gMTYzODQ7CisgICAgbGltaXRzLT5tYXhTdG9yYWdlQnVmZmVyUmFuZ2UgPSAxMzQyMTc3Mjg7CisgICAgbGltaXRzLT5tYXhQdXNoQ29uc3RhbnRzU2l6ZSA9IDEyODsKKyAgICBsaW1pdHMtPm1heE1lbW9yeUFsbG9jYXRpb25Db3VudCA9IDQwOTY7CisgICAgbGltaXRzLT5tYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50ID0gNDAwMDsKKyAgICBsaW1pdHMtPmJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgPSAxOworICAgIGxpbWl0cy0+c3BhcnNlQWRkcmVzc1NwYWNlU2l6ZSA9IDIxNDc0ODM2NDg7CisgICAgbGltaXRzLT5tYXhCb3VuZERlc2NyaXB0b3JTZXRzID0gNDsKKyAgICBsaW1pdHMtPm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzID0gMTY7CisgICAgbGltaXRzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyA9IDEyOworICAgIGxpbWl0cy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMgPSA0OworICAgIGxpbWl0cy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyA9IDE2OworICAgIGxpbWl0cy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUltYWdlcyA9IDQ7CisgICAgbGltaXRzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzID0gNDsKKyAgICBsaW1pdHMtPm1heFBlclN0YWdlUmVzb3VyY2VzID0gMTI4OworICAgIGxpbWl0cy0+bWF4RGVzY3JpcHRvclNldFNhbXBsZXJzID0gOTY7CisgICAgbGltaXRzLT5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMgPSA3MjsKKyAgICBsaW1pdHMtPm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMgPSA4OworICAgIGxpbWl0cy0+bWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzID0gMjQ7CisgICAgbGltaXRzLT5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljID0gNDsKKyAgICBsaW1pdHMtPm1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzID0gOTY7CisgICAgbGltaXRzLT5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlcyA9IDI0OworICAgIGxpbWl0cy0+bWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHMgPSA0OworICAgIGxpbWl0cy0+bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzID0gMTY7CisgICAgbGltaXRzLT5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzID0gMTY7CisgICAgbGltaXRzLT5tYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldCA9IDIwNDc7CisgICAgbGltaXRzLT5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUgPSAyMDQ4OworICAgIGxpbWl0cy0+bWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyA9IDY0OworICAgIGxpbWl0cy0+bWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsID0gNjQ7CisgICAgbGltaXRzLT5tYXhUZXNzZWxsYXRpb25QYXRjaFNpemUgPSAzMjsKKyAgICBsaW1pdHMtPm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMgPSA2NDsKKyAgICBsaW1pdHMtPm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzID0gNjQ7CisgICAgbGltaXRzLT5tYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzID0gMTIwOworICAgIGxpbWl0cy0+bWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyA9IDIwNDg7CisgICAgbGltaXRzLT5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzID0gNjQ7CisgICAgbGltaXRzLT5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyA9IDY0OworICAgIGxpbWl0cy0+bWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucyA9IDMyOworICAgIGxpbWl0cy0+bWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMgPSA2NDsKKyAgICBsaW1pdHMtPm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyA9IDY0OworICAgIGxpbWl0cy0+bWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyA9IDI1NjsKKyAgICBsaW1pdHMtPm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzID0gMTAyNDsKKyAgICBsaW1pdHMtPm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzID0gNjQ7CisgICAgbGltaXRzLT5tYXhGcmFnbWVudE91dHB1dEF0dGFjaG1lbnRzID0gNDsKKyAgICBsaW1pdHMtPm1heEZyYWdtZW50RHVhbFNyY0F0dGFjaG1lbnRzID0gMTsKKyAgICBsaW1pdHMtPm1heEZyYWdtZW50Q29tYmluZWRPdXRwdXRSZXNvdXJjZXMgPSA0OworICAgIGxpbWl0cy0+bWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemUgPSAxNjM4NDsKKyAgICBsaW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSA9IDY1NTM1OworICAgIGxpbWl0cy0+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzFdID0gNjU1MzU7CisgICAgbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMl0gPSA2NTUzNTsKKyAgICBsaW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyA9IDEyODsKKyAgICBsaW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBTaXplWzBdID0gMTI4OworICAgIGxpbWl0cy0+bWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMV0gPSAxMjg7CisgICAgbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSA9IDY0OworICAgIGxpbWl0cy0+c3ViUGl4ZWxQcmVjaXNpb25CaXRzID0gNDsKKyAgICBsaW1pdHMtPnN1YlRleGVsUHJlY2lzaW9uQml0cyA9IDQ7CisgICAgbGltaXRzLT5taXBtYXBQcmVjaXNpb25CaXRzID0gNDsKKyAgICBsaW1pdHMtPm1heERyYXdJbmRleGVkSW5kZXhWYWx1ZSA9IFVJTlQzMl9NQVg7CisgICAgbGltaXRzLT5tYXhEcmF3SW5kaXJlY3RDb3VudCA9IFVJTlQxNl9NQVg7CisgICAgbGltaXRzLT5tYXhTYW1wbGVyTG9kQmlhcyA9IDIuMGY7CisgICAgbGltaXRzLT5tYXhTYW1wbGVyQW5pc290cm9weSA9IDE2OworICAgIGxpbWl0cy0+bWF4Vmlld3BvcnRzID0gMTY7CisgICAgbGltaXRzLT5tYXhWaWV3cG9ydERpbWVuc2lvbnNbMF0gPSA0MDk2OworICAgIGxpbWl0cy0+bWF4Vmlld3BvcnREaW1lbnNpb25zWzFdID0gNDA5NjsKKyAgICBsaW1pdHMtPnZpZXdwb3J0Qm91bmRzUmFuZ2VbMF0gPSAtODE5MjsKKyAgICBsaW1pdHMtPnZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0gPSA4MTkxOworICAgIGxpbWl0cy0+dmlld3BvcnRTdWJQaXhlbEJpdHMgPSAwOworICAgIGxpbWl0cy0+bWluTWVtb3J5TWFwQWxpZ25tZW50ID0gNjQ7CisgICAgbGltaXRzLT5taW5UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudCA9IDE2OworICAgIGxpbWl0cy0+bWluVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudCA9IDE2OworICAgIGxpbWl0cy0+bWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCA9IDE2OworICAgIGxpbWl0cy0+bWluVGV4ZWxPZmZzZXQgPSAtODsKKyAgICBsaW1pdHMtPm1heFRleGVsT2Zmc2V0ID0gNzsKKyAgICBsaW1pdHMtPm1pblRleGVsR2F0aGVyT2Zmc2V0ID0gLTg7CisgICAgbGltaXRzLT5tYXhUZXhlbEdhdGhlck9mZnNldCA9IDc7CisgICAgbGltaXRzLT5taW5JbnRlcnBvbGF0aW9uT2Zmc2V0ID0gMC4wZjsKKyAgICBsaW1pdHMtPm1heEludGVycG9sYXRpb25PZmZzZXQgPSAwLjVmOworICAgIGxpbWl0cy0+c3ViUGl4ZWxJbnRlcnBvbGF0aW9uT2Zmc2V0Qml0cyA9IDQ7CisgICAgbGltaXRzLT5tYXhGcmFtZWJ1ZmZlcldpZHRoID0gNDA5NjsKKyAgICBsaW1pdHMtPm1heEZyYW1lYnVmZmVySGVpZ2h0ID0gNDA5NjsKKyAgICBsaW1pdHMtPm1heEZyYW1lYnVmZmVyTGF5ZXJzID0gMjU2OworICAgIGxpbWl0cy0+ZnJhbWVidWZmZXJDb2xvclNhbXBsZUNvdW50cyA9IDB4N0Y7CisgICAgbGltaXRzLT5mcmFtZWJ1ZmZlckRlcHRoU2FtcGxlQ291bnRzID0gMHg3RjsKKyAgICBsaW1pdHMtPmZyYW1lYnVmZmVyU3RlbmNpbFNhbXBsZUNvdW50cyA9IDB4N0Y7CisgICAgbGltaXRzLT5mcmFtZWJ1ZmZlck5vQXR0YWNobWVudHNTYW1wbGVDb3VudHMgPSAweDdGOworICAgIGxpbWl0cy0+bWF4Q29sb3JBdHRhY2htZW50cyA9IDQ7CisgICAgbGltaXRzLT5zYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyA9IDB4N0Y7CisgICAgbGltaXRzLT5zYW1wbGVkSW1hZ2VJbnRlZ2VyU2FtcGxlQ291bnRzID0gMHg3RjsKKyAgICBsaW1pdHMtPnNhbXBsZWRJbWFnZURlcHRoU2FtcGxlQ291bnRzID0gMHg3RjsKKyAgICBsaW1pdHMtPnNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMgPSAweDdGOworICAgIGxpbWl0cy0+c3RvcmFnZUltYWdlU2FtcGxlQ291bnRzID0gMHg3RjsKKyAgICBsaW1pdHMtPm1heFNhbXBsZU1hc2tXb3JkcyA9IDE7CisgICAgbGltaXRzLT50aW1lc3RhbXBDb21wdXRlQW5kR3JhcGhpY3MgPSBWS19UUlVFOworICAgIGxpbWl0cy0+dGltZXN0YW1wUGVyaW9kID0gMTsKKyAgICBsaW1pdHMtPm1heENsaXBEaXN0YW5jZXMgPSA4OworICAgIGxpbWl0cy0+bWF4Q3VsbERpc3RhbmNlcyA9IDg7CisgICAgbGltaXRzLT5tYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzID0gODsKKyAgICBsaW1pdHMtPmRpc2NyZXRlUXVldWVQcmlvcml0aWVzID0gMjsKKyAgICBsaW1pdHMtPnBvaW50U2l6ZVJhbmdlWzBdID0gMS4wZjsKKyAgICBsaW1pdHMtPnBvaW50U2l6ZVJhbmdlWzFdID0gNjQuMGY7CisgICAgbGltaXRzLT5saW5lV2lkdGhSYW5nZVswXSA9IDEuMGY7CisgICAgbGltaXRzLT5saW5lV2lkdGhSYW5nZVsxXSA9IDguMGY7CisgICAgbGltaXRzLT5wb2ludFNpemVHcmFudWxhcml0eSA9IDEuMGY7CisgICAgbGltaXRzLT5saW5lV2lkdGhHcmFudWxhcml0eSA9IDEuMGY7CisgICAgbGltaXRzLT5zdHJpY3RMaW5lcyA9IFZLX1RSVUU7CisgICAgbGltaXRzLT5zdGFuZGFyZFNhbXBsZUxvY2F0aW9ucyA9IFZLX1RSVUU7CisgICAgbGltaXRzLT5vcHRpbWFsQnVmZmVyQ29weU9mZnNldEFsaWdubWVudCA9IDE7CisgICAgbGltaXRzLT5vcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50ID0gMTsKKyAgICBsaW1pdHMtPm5vbkNvaGVyZW50QXRvbVNpemUgPSAyNTY7CisKKyAgICByZXR1cm4gKmxpbWl0czsKK30KKwordm9pZCBTZXRCb29sQXJyYXlUcnVlKFZrQm9vbDMyKiBib29sX2FycmF5LCB1aW50MzJfdCBudW1fYm9vbHMpCit7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9ib29sczsgKytpKSB7CisgICAgICAgIGJvb2xfYXJyYXlbaV0gPSBWS19UUlVFOworICAgIH0KK30KKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbnN0YW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UpCit7CisKKyAgICAvLyBUT0RPOiBJZiBsb2FkZXIgdmVyIDw9NCBJQ0QgbXVzdCBmYWlsIHdpdGggVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUiBmb3IgYWxsIHZrQ3JlYXRlSW5zdGFuY2UgY2FsbHMgd2l0aAorICAgIC8vICBhcGlWZXJzaW9uIHNldCB0byA+IFZ1bGthbiAxLjAgYmVjYXVzZSB0aGUgbG9hZGVyIGlzIHN0aWxsIGF0IGludGVyZmFjZSB2ZXJzaW9uIDw9IDQuIE90aGVyd2lzZSwgdGhlCisgICAgLy8gIElDRCBzaG91bGQgYmVoYXZlIGFzIG5vcm1hbC4KKyAgICBpZiAobG9hZGVyX2ludGVyZmFjZV92ZXJzaW9uIDw9IDQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVI7CisgICAgfQorICAgICpwSW5zdGFuY2UgPSAoVmtJbnN0YW5jZSlDcmVhdGVEaXNwT2JqSGFuZGxlKCk7CisgICAgLy8gVE9ETzogSWYgZW11bGF0aW5nIHNwZWNpZmljIGRldmljZSBjYXBzLCB3aWxsIG5lZWQgdG8gYWRkIGludGVsbGlnZW5jZSBoZXJlCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95SW5zdGFuY2UoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisKKyAgICAvLyBEZXN0cm95IHBoeXNpY2FsIGRldmljZQorICAgIERlc3Ryb3lEaXNwT2JqSGFuZGxlKCh2b2lkKilwaHlzaWNhbF9kZXZpY2UpOworCisgICAgRGVzdHJveURpc3BPYmpIYW5kbGUoKHZvaWQqKWluc3RhbmNlKTsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUNvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlcykKK3sKKyAgICBpZiAocFBoeXNpY2FsRGV2aWNlcykgeworICAgICAgICBpZiAoIXBoeXNpY2FsX2RldmljZSkgeworICAgICAgICAgICAgcGh5c2ljYWxfZGV2aWNlID0gKFZrUGh5c2ljYWxEZXZpY2UpQ3JlYXRlRGlzcE9iakhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgICpwUGh5c2ljYWxEZXZpY2VzID0gcGh5c2ljYWxfZGV2aWNlOworICAgIH0gZWxzZSB7CisgICAgICAgICpwUGh5c2ljYWxEZXZpY2VDb3VudCA9IDE7CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyogICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKQoreworICAgIHVpbnQzMl90IG51bV9ib29scyA9IHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMpIC8gc2l6ZW9mKFZrQm9vbDMyKTsKKyAgICBWa0Jvb2wzMiAqYm9vbF9hcnJheSA9ICZwRmVhdHVyZXMtPnJvYnVzdEJ1ZmZlckFjY2VzczsKKyAgICBTZXRCb29sQXJyYXlUcnVlKGJvb2xfYXJyYXksIG51bV9ib29scyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKQoreworICAgIGlmIChWS19GT1JNQVRfVU5ERUZJTkVEID09IGZvcm1hdCkgeworICAgICAgICAqcEZvcm1hdFByb3BlcnRpZXMgPSB7IDB4MCwgMHgwLCAweDAgfTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBKdXN0IHJldHVybmluZyBmdWxsIHN1cHBvcnQgZm9yIGV2ZXJ5dGhpbmcgaW5pdGlhbGx5CisgICAgICAgICpwRm9ybWF0UHJvcGVydGllcyA9IHsgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiwgMHgwMEZGRkZGRiB9OworICAgIH0KK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VDcmVhdGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKQoreworICAgIC8vIEEgaGFyZGNvZGVkIHVuc3VwcG9ydGVkIGZvcm1hdAorICAgIGlmIChmb3JtYXQgPT0gVktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzIpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIFRPRE86IEp1c3QgaGFyZC1jb2Rpbmcgc29tZSB2YWx1ZXMgZm9yIG5vdworICAgIC8vIFRPRE86IElmIHRpbGluZyBpcyBsaW5lYXIsIGxpbWl0IHRoZSBtaXBzLCBsZXZlbHMsICYgc2FtcGxlIGNvdW50CisgICAgaWYgKFZLX0lNQUdFX1RJTElOR19MSU5FQVIgPT0gdGlsaW5nKSB7CisgICAgICAgICpwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0geyB7IDQwOTYsIDQwOTYsIDI1NiB9LCAxLCAxLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIDQyOTQ5NjcyOTYgfTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBoYXJkLWNvZGUgc3VwcG9ydCBmb3IgYWxsIHNhbXBsZSBjb3VudHMgZXhjZXB0IDY0IGJpdHMuCisgICAgICAgICpwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0geyB7IDQwOTYsIDQwOTYsIDI1NiB9LCAxMiwgMjU2LCAweDdGICYgflZLX1NBTVBMRV9DT1VOVF82NF9CSVQsIDQyOTQ5NjcyOTYgfTsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworICAgIC8vIFRPRE86IEp1c3QgaGFyZC1jb2Rpbmcgc29tZSB2YWx1ZXMgZm9yIG5vdworICAgIHBQcm9wZXJ0aWVzLT5hcGlWZXJzaW9uID0gVktfQVBJX1ZFUlNJT05fMV8wOworICAgIHBQcm9wZXJ0aWVzLT5kcml2ZXJWZXJzaW9uID0gMTsKKyAgICBwUHJvcGVydGllcy0+dmVuZG9ySUQgPSAweGJhNWViYTExOworICAgIHBQcm9wZXJ0aWVzLT5kZXZpY2VJRCA9IDB4ZjAwNWJhMTE7CisgICAgcFByb3BlcnRpZXMtPmRldmljZVR5cGUgPSBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9WSVJUVUFMX0dQVTsKKyAgICAvL3N0ZDo6c3RyaW5nIGRldk5hbWUgPSAiVnVsa2FuIE1vY2sgRGV2aWNlIjsKKyAgICBzdHJjcHkocFByb3BlcnRpZXMtPmRldmljZU5hbWUsICJWdWxrYW4gTW9jayBEZXZpY2UiKTsKKyAgICBwUHJvcGVydGllcy0+cGlwZWxpbmVDYWNoZVVVSURbMF0gPSAxODsKKyAgICBwUHJvcGVydGllcy0+bGltaXRzID0gU2V0TGltaXRzKCZwUHJvcGVydGllcy0+bGltaXRzKTsKKyAgICBwUHJvcGVydGllcy0+c3BhcnNlUHJvcGVydGllcyA9IHsgVktfVFJVRSwgVktfVFJVRSwgVktfVFJVRSwgVktfVFJVRSwgVktfVFJVRSB9OworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKQoreworICAgIGlmICghcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgeworICAgICAgICAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50KSB7CisgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzWzBdLnF1ZXVlRmxhZ3MgPSBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCB8IFZLX1FVRVVFX1RSQU5TRkVSX0JJVCB8IFZLX1FVRVVFX1NQQVJTRV9CSU5ESU5HX0JJVDsKKyAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXNbMF0ucXVldWVDb3VudCA9IDE7CisgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzWzBdLnRpbWVzdGFtcFZhbGlkQml0cyA9IDA7CisgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzWzBdLm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSA9IHsxLDEsMX07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogICAgICAgICAgIHBNZW1vcnlQcm9wZXJ0aWVzKQoreworICAgIHBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlUeXBlQ291bnQgPSAyOworICAgIHBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlUeXBlc1swXS5wcm9wZXJ0eUZsYWdzID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQ7CisgICAgcE1lbW9yeVByb3BlcnRpZXMtPm1lbW9yeVR5cGVzWzBdLmhlYXBJbmRleCA9IDA7CisgICAgcE1lbW9yeVByb3BlcnRpZXMtPm1lbW9yeVR5cGVzWzFdLnByb3BlcnR5RmxhZ3MgPSBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ0FDSEVEX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDsKKyAgICBwTWVtb3J5UHJvcGVydGllcy0+bWVtb3J5VHlwZXNbMV0uaGVhcEluZGV4ID0gMTsKKyAgICBwTWVtb3J5UHJvcGVydGllcy0+bWVtb3J5SGVhcENvdW50ID0gMjsKKyAgICBwTWVtb3J5UHJvcGVydGllcy0+bWVtb3J5SGVhcHNbMF0uZmxhZ3MgPSAwOworICAgIHBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlIZWFwc1swXS5zaXplID0gODAwMDAwMDAwMDsKKyAgICBwTWVtb3J5UHJvcGVydGllcy0+bWVtb3J5SGVhcHNbMV0uZmxhZ3MgPSBWS19NRU1PUllfSEVBUF9ERVZJQ0VfTE9DQUxfQklUOworICAgIHBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlIZWFwc1sxXS5zaXplID0gODAwMDAwMDAwMDsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpCit7CisKKyAgICBpZiAoIW5lZ290aWF0ZV9sb2FkZXJfaWNkX2ludGVyZmFjZV9jYWxsZWQpIHsKKyAgICAgICAgbG9hZGVyX2ludGVyZmFjZV92ZXJzaW9uID0gMDsKKyAgICB9CisgICAgY29uc3QgYXV0byAmaXRlbSA9IG5hbWVfdG9fZnVuY3B0cl9tYXAuZmluZChwTmFtZSk7CisgICAgaWYgKGl0ZW0gIT0gbmFtZV90b19mdW5jcHRyX21hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KGl0ZW0tPnNlY29uZCk7CisgICAgfQorICAgIC8vIE1vY2sgc2hvdWxkIGludGVyY2VwdCBhbGwgZnVuY3Rpb25zIHNvIGlmIHdlIGdldCBoZXJlIGp1c3QgcmV0dXJuIG51bGwKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgR2V0RGV2aWNlUHJvY0FkZHIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmFtZSkKK3sKKworICAgIHJldHVybiBHZXRJbnN0YW5jZVByb2NBZGRyKG51bGxwdHIsIHBOYW1lKTsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEZXZpY2UoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UpCit7CisKKyAgICAqcERldmljZSA9IChWa0RldmljZSlDcmVhdGVEaXNwT2JqSGFuZGxlKCk7CisgICAgLy8gVE9ETzogSWYgZW11bGF0aW5nIHNwZWNpZmljIGRldmljZSBjYXBzLCB3aWxsIG5lZWQgdG8gYWRkIGludGVsbGlnZW5jZSBoZXJlCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGV2aWNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgLy8gRmlyc3QgZGVzdHJveSBzdWItZGV2aWNlIG9iamVjdHMKKyAgICAvLyBEZXN0cm95IFF1ZXVlcworICAgIGZvciAoYXV0byBkZXZfcXVldWVfbWFwX3BhaXIgOiBxdWV1ZV9tYXApIHsKKyAgICAgICAgZm9yIChhdXRvIHF1ZXVlX2ZhbWlseV9tYXBfcGFpciA6IHF1ZXVlX21hcFtkZXZfcXVldWVfbWFwX3BhaXIuZmlyc3RdKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaW5kZXhfcXVldWVfcGFpciA6IHF1ZXVlX21hcFtkZXZfcXVldWVfbWFwX3BhaXIuZmlyc3RdW3F1ZXVlX2ZhbWlseV9tYXBfcGFpci5maXJzdF0pIHsKKyAgICAgICAgICAgICAgICBEZXN0cm95RGlzcE9iakhhbmRsZSgodm9pZCopaW5kZXhfcXVldWVfcGFpci5zZWNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHF1ZXVlX21hcC5jbGVhcigpOworICAgIC8vIE5vdyBkZXN0cm95IGRldmljZQorICAgIERlc3Ryb3lEaXNwT2JqSGFuZGxlKCh2b2lkKilkZXZpY2UpOworICAgIC8vIFRPRE86IElmIGVtdWxhdGluZyBzcGVjaWZpYyBkZXZpY2UgY2Fwcywgd2lsbCBuZWVkIHRvIGFkZCBpbnRlbGxpZ2VuY2UgaGVyZQorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcygKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllck5hbWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworCisgICAgLy8gSWYgcmVxdWVzdGluZyBudW1iZXIgb2YgZXh0ZW5zaW9ucywgcmV0dXJuIHRoYXQKKyAgICBpZiAoIXBMYXllck5hbWUpIHsKKyAgICAgICAgaWYgKCFwUHJvcGVydGllcykgeworICAgICAgICAgICAgKnBQcm9wZXJ0eUNvdW50ID0gKHVpbnQzMl90KWluc3RhbmNlX2V4dGVuc2lvbl9tYXAuc2l6ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm5hbWVfdmVyX3BhaXIgOiBpbnN0YW5jZV9leHRlbnNpb25fbWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gKnBQcm9wZXJ0eUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0cm5jcHkocFByb3BlcnRpZXNbaV0uZXh0ZW5zaW9uTmFtZSwgbmFtZV92ZXJfcGFpci5maXJzdC5jX3N0cigpLCBzaXplb2YocFByb3BlcnRpZXNbaV0uZXh0ZW5zaW9uTmFtZSkpOworICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2ldLmV4dGVuc2lvbk5hbWVbc2l6ZW9mKHBQcm9wZXJ0aWVzW2ldLmV4dGVuc2lvbk5hbWUpIC0gMV0gPSAwOworICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2ldLnNwZWNWZXJzaW9uID0gbmFtZV92ZXJfcGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgIT0gaW5zdGFuY2VfZXh0ZW5zaW9uX21hcC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfSU5DT01QTEVURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBJZiByZXF1ZXN0aW5nIGV4dGVuc2lvbiBwcm9wZXJ0aWVzLCBmaWxsIGluIGRhdGEgc3RydWN0IGZvciBudW1iZXIgb2YgZXh0ZW5zaW9ucworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllck5hbWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworCisgICAgLy8gSWYgcmVxdWVzdGluZyBudW1iZXIgb2YgZXh0ZW5zaW9ucywgcmV0dXJuIHRoYXQKKyAgICBpZiAoIXBMYXllck5hbWUpIHsKKyAgICAgICAgaWYgKCFwUHJvcGVydGllcykgeworICAgICAgICAgICAgKnBQcm9wZXJ0eUNvdW50ID0gKHVpbnQzMl90KWRldmljZV9leHRlbnNpb25fbWFwLnNpemUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGkgPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZuYW1lX3Zlcl9wYWlyIDogZGV2aWNlX2V4dGVuc2lvbl9tYXApIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAqcFByb3BlcnR5Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c3RybmNweShwUHJvcGVydGllc1tpXS5leHRlbnNpb25OYW1lLCBuYW1lX3Zlcl9wYWlyLmZpcnN0LmNfc3RyKCksIHNpemVvZihwUHJvcGVydGllc1tpXS5leHRlbnNpb25OYW1lKSk7CisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXNbaV0uZXh0ZW5zaW9uTmFtZVtzaXplb2YocFByb3BlcnRpZXNbaV0uZXh0ZW5zaW9uTmFtZSkgLSAxXSA9IDA7CisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXNbaV0uc3BlY1ZlcnNpb24gPSBuYW1lX3Zlcl9wYWlyLnNlY29uZDsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSAhPSBkZXZpY2VfZXh0ZW5zaW9uX21hcC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfSU5DT01QTEVURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBJZiByZXF1ZXN0aW5nIGV4dGVuc2lvbiBwcm9wZXJ0aWVzLCBmaWxsIGluIGRhdGEgc3RydWN0IGZvciBudW1iZXIgb2YgZXh0ZW5zaW9ucworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtMYXllclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtMYXllclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlUXVldWUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVJbmRleCwKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgIGF1dG8gcXVldWUgPSBxdWV1ZV9tYXBbZGV2aWNlXVtxdWV1ZUZhbWlseUluZGV4XVtxdWV1ZUluZGV4XTsKKyAgICBpZiAocXVldWUpIHsKKyAgICAgICAgKnBRdWV1ZSA9IHF1ZXVlOworICAgIH0gZWxzZSB7CisgICAgICAgICpwUXVldWUgPSBxdWV1ZV9tYXBbZGV2aWNlXVtxdWV1ZUZhbWlseUluZGV4XVtxdWV1ZUluZGV4XSA9IChWa1F1ZXVlKUNyZWF0ZURpc3BPYmpIYW5kbGUoKTsKKyAgICB9CisgICAgLy8gVE9ETzogSWYgZW11bGF0aW5nIHNwZWNpZmljIGRldmljZSBjYXBzLCB3aWxsIG5lZWQgdG8gYWRkIGludGVsbGlnZW5jZSBoZXJlCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFF1ZXVlU3VibWl0KAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qICAgICAgICAgICAgICAgICAgICAgICAgIHBTdWJtaXRzLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVXYWl0SWRsZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERldmljZVdhaXRJZGxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFsbG9jYXRlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKiAgICAgICAgICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXZpY2VNZW1vcnkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5KQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBNZW1vcnkgPSAoVmtEZXZpY2VNZW1vcnkpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIE1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgVmtNZW1vcnlNYXBGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB2b2lkKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwRGF0YSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgIC8vIFRPRE86IEp1c3QgaGFyZC1jb2RpbmcgNjRrIHdob2xlIHNpemUgZm9yIG5vdworICAgIGlmIChWS19XSE9MRV9TSVpFID09IHNpemUpCisgICAgICAgIHNpemUgPSAweDEwMDAwOworICAgIHZvaWQqIG1hcF9hZGRyID0gbWFsbG9jKChzaXplX3Qpc2l6ZSk7CisgICAgbWFwcGVkX21lbW9yeV9tYXBbbWVtb3J5XS5wdXNoX2JhY2sobWFwX2FkZHIpOworICAgICpwcERhdGEgPSBtYXBfYWRkcjsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVubWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgZm9yIChhdXRvIG1hcF9hZGRyIDogbWFwcGVkX21lbW9yeV9tYXBbbWVtb3J5XSkgeworICAgICAgICBmcmVlKG1hcF9hZGRyKTsKKyAgICB9CisgICAgbWFwcGVkX21lbW9yeV9tYXAuZXJhc2UobWVtb3J5KTsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQnVmZmVyTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRJbWFnZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICAvLyBUT0RPOiBKdXN0IGhhcmQtY29kaW5nIHJlcXMgZm9yIG5vdworICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPnNpemUgPSA0MDk2OworICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPmFsaWdubWVudCA9IDE7CisgICAgcE1lbW9yeVJlcXVpcmVtZW50cy0+bWVtb3J5VHlwZUJpdHMgPSAweEZGRkY7CisgICAgLy8gUmV0dXJuIGEgYmV0dGVyIHNpemUgYmFzZWQgb24gdGhlIGJ1ZmZlciBzaXplIGZyb20gdGhlIGNyZWF0ZSBpbmZvLgorICAgIGF1dG8gZF9pdGVyID0gYnVmZmVyX21hcC5maW5kKGRldmljZSk7CisgICAgaWYgKGRfaXRlciAhPSBidWZmZXJfbWFwLmVuZCgpKSB7CisgICAgICAgIGF1dG8gaXRlciA9IGRfaXRlci0+c2Vjb25kLmZpbmQoYnVmZmVyKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gZF9pdGVyLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPnNpemUgPSAoKGl0ZXItPnNlY29uZC5zaXplICsgNDA5NSkgLyA0MDk2KSAqIDQwOTY7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICAvLyBUT0RPOiBKdXN0IGhhcmQtY29kaW5nIHJlcXMgZm9yIG5vdworICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPnNpemUgPSA0MDk2OworICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPmFsaWdubWVudCA9IDE7CisKKyAgICAvLyBIZXJlIHdlIGhhcmQtY29kZSB0aGF0IHRoZSBtZW1vcnkgdHlwZSBhdCBpbmRleCAzIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGltYWdlLgorICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPm1lbW9yeVR5cGVCaXRzID0gMHhGRkZGICYgfigweDEgPDwgMyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFF1ZXVlQmluZFNwYXJzZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiAgICAgICAgICAgICAgICAgICAgIHBCaW5kSW5mbywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUZlbmNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBGZW5jZSA9IChWa0ZlbmNlKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVzZXRGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRGZW5jZVN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFdhaXRGb3JGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcywKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBbGwsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFNlbWFwaG9yZSA9IChWa1NlbWFwaG9yZSlnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcEV2ZW50ID0gKFZrRXZlbnQpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKy8vRGVzdHJveSBvYmplY3QKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19FVkVOVF9TRVQ7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldEV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUXVlcnlQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXJ5UG9vbCkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwUXVlcnlQb29sID0gKFZrUXVlcnlQb29sKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95UXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKy8vRGVzdHJveSBvYmplY3QKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwQnVmZmVyID0gKFZrQnVmZmVyKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgYnVmZmVyX21hcFtkZXZpY2VdWypwQnVmZmVyXSA9ICpwQ3JlYXRlSW5mbzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lCdWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgYnVmZmVyX21hcFtkZXZpY2VdLmVyYXNlKGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlQnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlclZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBWaWV3ID0gKFZrQnVmZmVyVmlldylnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXJWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKy8vRGVzdHJveSBvYmplY3QKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwSW1hZ2UgPSAoVmtJbWFnZSlnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSogICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLAorICAgIFZrU3VicmVzb3VyY2VMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dCkKK3sKKyAgICAvLyBOZWVkIHNhZmUgdmFsdWVzLiBDYWxsZXJzIGFyZSBjb21wdXRpbmcgbWVtb3J5IG9mZnNldHMgZnJvbSBwTGF5b3V0LCB3aXRoIG5vIHJldHVybiBjb2RlIHRvIGZsYWcgZmFpbHVyZS4gCisgICAgKnBMYXlvdXQgPSBWa1N1YnJlc291cmNlTGF5b3V0KCk7IC8vIERlZmF1bHQgY29uc3RydWN0b3IgemVybyB2YWx1ZXMuCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2VWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFZpZXcgPSAoVmtJbWFnZVZpZXcpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NoYWRlck1vZHVsZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaGFkZXJNb2R1bGUpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFNoYWRlck1vZHVsZSA9IChWa1NoYWRlck1vZHVsZSlnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUNhY2hlKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBQaXBlbGluZUNhY2hlID0gKFZrUGlwZWxpbmVDYWNoZSlnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKy8vRGVzdHJveSBvYmplY3QKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBNZXJnZVBpcGVsaW5lQ2FjaGVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICBwUGlwZWxpbmVzW2ldID0gKFZrUGlwZWxpbmUpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICBwUGlwZWxpbmVzW2ldID0gKFZrUGlwZWxpbmUpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFBpcGVsaW5lTGF5b3V0ID0gKFZrUGlwZWxpbmVMYXlvdXQpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKy8vRGVzdHJveSBvYmplY3QKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXIpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFNhbXBsZXIgPSAoVmtTYW1wbGVyKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95U2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICBwU2V0TGF5b3V0KQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBTZXRMYXlvdXQgPSAoVmtEZXNjcmlwdG9yU2V0TGF5b3V0KWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JQb29sKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBEZXNjcmlwdG9yUG9vbCA9IChWa0Rlc2NyaXB0b3JQb29sKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVzZXREZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyArK2kpIHsKKyAgICAgICAgcERlc2NyaXB0b3JTZXRzW2ldID0gKFZrRGVzY3JpcHRvclNldClnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBGcmVlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cykKK3sKKy8vRGVzdHJveSBvYmplY3QKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVwZGF0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JDb3B5Q291bnQsCisgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvckNvcGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZyYW1lYnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlcikKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwRnJhbWVidWZmZXIgPSAoVmtGcmFtZWJ1ZmZlcilnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtSZW5kZXJQYXNzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVuZGVyUGFzcykKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwUmVuZGVyUGFzcyA9IChWa1JlbmRlclBhc3MpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUmVuZGVyUGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQ29tbWFuZFBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRQb29sKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBDb21tYW5kUG9vbCA9IChWa0NvbW1hbmRQb29sKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVzZXRDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWxsb2NhdGVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEFsbG9jYXRlSW5mby0+Y29tbWFuZEJ1ZmZlckNvdW50OyArK2kpIHsKKyAgICAgICAgcENvbW1hbmRCdWZmZXJzW2ldID0gKFZrQ29tbWFuZEJ1ZmZlcilDcmVhdGVEaXNwT2JqSGFuZGxlKCk7CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRnJlZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmVnaW5Db21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qICAgICAgICAgICAgIHBCZWdpbkluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW5kQ29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVzZXRDb21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgIGZsYWdzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZFBpcGVsaW5lKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRWaWV3cG9ydCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3cG9ydHMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRTY2lzc29yKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2lzc29ycykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldExpbmVXaWR0aCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREZXB0aEJpYXMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDbGFtcCwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hc2spCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmREZXNjcmlwdG9yU2V0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY09mZnNldENvdW50LAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcER5bmFtaWNPZmZzZXRzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0luZGV4VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VHlwZSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmVydGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRleGVkKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQmxpdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLAorICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ29weUJ1ZmZlclRvSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDb3B5SW1hZ2VUb0J1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRmlsbEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENsZWFyQ29sb3JJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiAgICAgICAgICAgICAgICAgICAgcENvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDbGVhckF0dGFjaG1lbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb3VudCwKKyAgICBjb25zdCBWa0NsZWFyQXR0YWNobWVudCogICAgICAgICAgICAgICAgICAgIHBBdHRhY2htZW50cywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RDb3VudCwKKyAgICBjb25zdCBWa0NsZWFyUmVjdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0cykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFJlc29sdmVJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFJlc2V0RXZlbnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRXYWl0RXZlbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQsCisgICAgY29uc3QgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRzLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RhZ2VNYXNrLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICBwSW1hZ2VNZW1vcnlCYXJyaWVycykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5RdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFdyaXRlVGltZXN0YW1wKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RhZ2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWROZXh0U3VicGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRXhlY3V0ZUNvbW1hbmRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlVmVyc2lvbigKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBcGlWZXJzaW9uKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmluZEltYWdlTWVtb3J5MigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiAgICAgICAgICAgICAgICBwQmluZEluZm9zKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERldmljZUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGV2aWNlSW5kZXgsCisgICAgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiAgICAgICAgICAgICAgICAgICBwUGVlck1lbW9yeUZlYXR1cmVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RGV2aWNlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRGlzcGF0Y2hCYXNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWiwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKQoreworICAgIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpCit7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIocGh5c2ljYWxEZXZpY2UsIHBGZWF0dXJlcyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydGllcyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykKK3sKKyAgICBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHBGb3JtYXRQcm9wZXJ0aWVzKTsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogICAgIHBJbWFnZUZvcm1hdEluZm8sCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKQoreworICAgIHJldHVybiBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcykKK3sKKyAgICBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpCit7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMpOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFRyaW1Db21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXZpY2VRdWV1ZTIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VRdWV1ZUluZm8yKiAgICAgICAgICAgICAgICAgICBwUXVldWVJbmZvLAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKQoreworICAgIEdldERldmljZVF1ZXVlKGRldmljZSwgcFF1ZXVlSW5mby0+cXVldWVGYW1pbHlJbmRleCwgcFF1ZXVlSW5mby0+cXVldWVJbmRleCwgcFF1ZXVlKTsKKyAgICAvLyBUT0RPOiBBZGQgZnVydGhlciBzdXBwb3J0IGZvciBHZXREZXZpY2VRdWV1ZTIgZmVhdHVyZXMKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwWWNiY3JDb252ZXJzaW9uID0gKFZrU2FtcGxlclljYmNyQ29udmVyc2lvbilnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSlnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldCwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKQoreworICAgIC8vIEhhcmQtY29kZSBzdXBwb3J0IGZvciBhbGwgaGFuZGxlIHR5cGVzIGFuZCBmZWF0dXJlcworICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtPmV4dGVybmFsTWVtb3J5UHJvcGVydGllcy5leHRlcm5hbE1lbW9yeUZlYXR1cmVzID0gMHg3OworICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtPmV4dGVybmFsTWVtb3J5UHJvcGVydGllcy5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyA9IDB4MUZGOworICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtPmV4dGVybmFsTWVtb3J5UHJvcGVydGllcy5jb21wYXRpYmxlSGFuZGxlVHlwZXMgPSAweDFGRjsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykKK3sKKyAgICAvLyBIYXJkLWNvZGUgc3VwcG9ydCBmb3IgYWxsIGhhbmRsZSB0eXBlcyBhbmQgZmVhdHVyZXMKKyAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtPmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzID0gMHhGOworICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcy0+Y29tcGF0aWJsZUhhbmRsZVR5cGVzID0gMHhGOworICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcy0+ZXh0ZXJuYWxGZW5jZUZlYXR1cmVzID0gMHgzOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykKK3sKKyAgICAvLyBIYXJkIGNvZGUgc3VwcG9ydCBmb3IgYWxsIGhhbmRsZSB0eXBlcyBhbmQgZmVhdHVyZXMKKyAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLT5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyA9IDB4MUY7CisgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy0+Y29tcGF0aWJsZUhhbmRsZVR5cGVzID0gMHgxRjsKKyAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLT5leHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVzID0gMHgzOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95U3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkKQoreworICAgIC8vIEN1cnJlbnRseSBzYXkgdGhhdCBhbGwgc3VyZmFjZS9xdWV1ZSBjb21ib3MgYXJlIHN1cHBvcnRlZAorICAgICpwU3VwcG9ydGVkID0gVktfVFJVRTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykKK3sKKyAgICAvLyBJbiBnZW5lcmFsIGp1c3Qgc2F5IG1heCBzdXBwb3J0ZWQgaXMgYXZhaWxhYmxlIGZvciByZXF1ZXN0ZWQgc3VyZmFjZQorICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5taW5JbWFnZUNvdW50ID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWF4SW1hZ2VDb3VudCA9IDA7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRFeHRlbnQud2lkdGggPSAweEZGRkZGRkZGOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5jdXJyZW50RXh0ZW50LmhlaWdodCA9IDB4RkZGRkZGRkY7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPm1pbkltYWdlRXh0ZW50LndpZHRoID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWluSW1hZ2VFeHRlbnQuaGVpZ2h0ID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWF4SW1hZ2VFeHRlbnQud2lkdGggPSAzODQwOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUV4dGVudC5oZWlnaHQgPSAyMTYwOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUFycmF5TGF5ZXJzID0gMTI4OworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXBwb3J0ZWRUcmFuc2Zvcm1zID0gVktfU1VSRkFDRV9UUkFOU0ZPUk1fSURFTlRJVFlfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfOTBfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfMTgwX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fUk9UQVRFXzI3MF9CSVRfS0hSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzkwX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzE4MF9CSVRfS0hSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8yNzBfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9JTkhFUklUX0JJVF9LSFI7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRUcmFuc2Zvcm0gPSBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSA9IFZLX0NPTVBPU0lURV9BTFBIQV9PUEFRVUVfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9TSVRFX0FMUEhBX1BSRV9NVUxUSVBMSUVEX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0NPTVBPU0lURV9BTFBIQV9QT1NUX01VTFRJUExJRURfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9TSVRFX0FMUEhBX0lOSEVSSVRfQklUX0tIUjsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+c3VwcG9ydGVkVXNhZ2VGbGFncyA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVDsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cykKK3sKKyAgICAvLyBDdXJyZW50bHkgYWx3YXlzIHNheSB0aGF0IFJHQkE4ICYgQkdSQTggYXJlIHN1cHBvcnRlZAorICAgIGlmICghcFN1cmZhY2VGb3JtYXRzKSB7CisgICAgICAgICpwU3VyZmFjZUZvcm1hdENvdW50ID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGxpbmcgdGhyb3VnaCBhbmQganVzdCBmaWxsaW5nIGhvd2V2ZXIgbWFueSB0eXBlcyBhcmUgcmVxdWVzdGVkCisgICAgICAgIHN3aXRjaCgqcFN1cmZhY2VGb3JtYXRDb3VudCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHNbMV0uZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzWzFdLmNvbG9yU3BhY2UgPSBWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFI7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1swXS5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHNbMF0uY29sb3JTcGFjZSA9IFZLX0NPTE9SX1NQQUNFX1NSR0JfTk9OTElORUFSX0tIUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykKK3sKKyAgICAvLyBDdXJyZW50bHkgYWx3YXlzIHNheSB0aGF0IGFsbCBwcmVzZW50IG1vZGVzIGFyZSBzdXBwb3J0ZWQKKyAgICBpZiAoIXBQcmVzZW50TW9kZXMpIHsKKyAgICAgICAgKnBQcmVzZW50TW9kZUNvdW50ID0gNjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGxpbmcgdGhyb3VnaCBhbmQganVzdCBmaWxsaW5nIGhvd2V2ZXIgbWFueSBtb2RlcyBhcmUgcmVxdWVzdGVkCisgICAgICAgIHN3aXRjaCgqcFByZXNlbnRNb2RlQ291bnQpIHsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgcFByZXNlbnRNb2Rlc1s1XSA9IFZLX1BSRVNFTlRfTU9ERV9TSEFSRURfQ09OVElOVU9VU19SRUZSRVNIX0tIUjsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBwUHJlc2VudE1vZGVzWzRdID0gVktfUFJFU0VOVF9NT0RFX1NIQVJFRF9ERU1BTkRfUkVGUkVTSF9LSFI7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgcFByZXNlbnRNb2Rlc1szXSA9IFZLX1BSRVNFTlRfTU9ERV9GSUZPX1JFTEFYRURfS0hSOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHBQcmVzZW50TW9kZXNbMl0gPSBWS19QUkVTRU5UX01PREVfRklGT19LSFI7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcFByZXNlbnRNb2Rlc1sxXSA9IFZLX1BSRVNFTlRfTU9ERV9NQUlMQk9YX0tIUjsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcFByZXNlbnRNb2Rlc1swXSA9IFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBTd2FwY2hhaW4gPSAoVmtTd2FwY2hhaW5LSFIpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFN3YXBjaGFpbkltYWdlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlcykKK3sKKyAgICBpZiAoIXBTd2FwY2hhaW5JbWFnZXMpIHsKKyAgICAgICAgKnBTd2FwY2hhaW5JbWFnZUNvdW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKCpwU3dhcGNoYWluSW1hZ2VDb3VudCA+IDApIHsKKyAgICAgICAgcFN3YXBjaGFpbkltYWdlc1swXSA9IChWa0ltYWdlKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgICAgIGlmICgqcFN3YXBjaGFpbkltYWdlQ291bnQgIT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIFZLX0lOQ09NUExFVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFF1ZXVlUHJlc2VudEtIUigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrUHJlc2VudEluZm9LSFIqICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRJbmZvKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogICAgICAgIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RDb3VudCwKKyAgICBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0cykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlTmV4dEltYWdlMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiAgICAgICAgICAgIHBBY3F1aXJlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheUNvdW50LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGlzcGxheU1vZGVLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEaXNwbGF5TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9kZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwTW9kZSA9IChWa0Rpc3BsYXlNb2RlS0hSKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5TW9kZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFN1cmZhY2UgPSAoVmtTdXJmYWNlS0hSKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluQ291bnQ7ICsraSkgeworICAgICAgICBwU3dhcGNoYWluc1tpXSA9IChWa1N3YXBjaGFpbktIUilnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVhsaWJTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZpc3VhbElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsSUQpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVhjYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBTdXJmYWNlID0gKFZrU3VyZmFjZUtIUilnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB4Y2JfY29ubmVjdGlvbl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgeGNiX3Zpc3VhbGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxfaWQpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIgKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHN0cnVjdCB3bF9kaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIgKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIgKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVXaW4zMlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBTdXJmYWNlID0gKFZrU3VyZmFjZUtIUilnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgKi8KKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpCit7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhwaHlzaWNhbERldmljZSwgJnBGZWF0dXJlcy0+ZmVhdHVyZXMpOworICAgIHVpbnQzMl90IG51bV9ib29scyA9IDA7IC8vIENvdW50IG51bWJlciBvZiBWa0Jvb2wzMnMgaW4gZXh0ZW5zaW9uIHN0cnVjdHMKKyAgICBWa0Jvb2wzMiogZmVhdF9ib29scyA9IG51bGxwdHI7CisgICAgY29uc3QgYXV0byAqZGVzY19pZHhfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ+KHBGZWF0dXJlcy0+cE5leHQpOworICAgIGlmIChkZXNjX2lkeF9mZWF0dXJlcykgeworICAgICAgICBjb25zdCBhdXRvIGJvb2xfc2l6ZSA9IHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQpIC0gb2Zmc2V0b2YoVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhULCBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyk7CisgICAgICAgIG51bV9ib29scyA9IGJvb2xfc2l6ZS9zaXplb2YoVmtCb29sMzIpOworICAgICAgICBmZWF0X2Jvb2xzID0gKFZrQm9vbDMyKikmZGVzY19pZHhfZmVhdHVyZXMtPnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nOworICAgICAgICBTZXRCb29sQXJyYXlUcnVlKGZlYXRfYm9vbHMsIG51bV9ib29scyk7CisgICAgfQorICAgIGNvbnN0IGF1dG8gKmJsZW5kb3BfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUPihwRmVhdHVyZXMtPnBOZXh0KTsKKyAgICBpZiAoYmxlbmRvcF9mZWF0dXJlcykgeworICAgICAgICBjb25zdCBhdXRvIGJvb2xfc2l6ZSA9IHNpemVvZihWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKSAtIG9mZnNldG9mKFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQsIGFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMpOworICAgICAgICBudW1fYm9vbHMgPSBib29sX3NpemUvc2l6ZW9mKFZrQm9vbDMyKTsKKyAgICAgICAgZmVhdF9ib29scyA9IChWa0Jvb2wzMiopJmJsZW5kb3BfZmVhdHVyZXMtPmFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnM7CisgICAgICAgIFNldEJvb2xBcnJheVRydWUoZmVhdF9ib29scywgbnVtX2Jvb2xzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsICZwUHJvcGVydGllcy0+cHJvcGVydGllcyk7CisgICAgY29uc3QgYXV0byAqZGVzY19pZHhfcHJvcHMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVD4ocFByb3BlcnRpZXMtPnBOZXh0KTsKKyAgICBpZiAoZGVzY19pZHhfcHJvcHMpIHsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQqIHdyaXRlX3Byb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUKilkZXNjX2lkeF9wcm9wczsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29scyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IGZhbHNlOworICAgICAgICB3cml0ZV9wcm9wcy0+c2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBmYWxzZTsKKyAgICAgICAgd3JpdGVfcHJvcHMtPnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IGZhbHNlOworICAgICAgICB3cml0ZV9wcm9wcy0+c2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBmYWxzZTsKKyAgICAgICAgd3JpdGVfcHJvcHMtPnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gZmFsc2U7CisgICAgICAgIHdyaXRlX3Byb3BzLT5yb2J1c3RCdWZmZXJBY2Nlc3NVcGRhdGVBZnRlckJpbmQgPSB0cnVlOworICAgICAgICB3cml0ZV9wcm9wcy0+cXVhZERpdmVyZ2VudEltcGxpY2l0TG9kID0gdHJ1ZTsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzID0gNTAwMDAwOworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMgPSA1MDAwMDA7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgPSA1MDAwMDA7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzID0gNTAwMDAwOworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzID0gNTAwMDAwOworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzID0gNTAwMDAwOworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzID0gOTY7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljID0gODsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWMgPSA0OworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgPSA1MDAwMDA7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzID0gNTAwMDAwOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gKnB1c2hfZGVzY3JpcHRvcl9wcm9wcyA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI+KHBQcm9wZXJ0aWVzLT5wTmV4dCk7CisgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9wcm9wcykgeworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKiB3cml0ZV9wcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKilwdXNoX2Rlc2NyaXB0b3JfcHJvcHM7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhQdXNoRGVzY3JpcHRvcnMgPSAyNTY7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqZGVwdGhfc3RlbmNpbF9yZXNvbHZlX3Byb3BzID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSPihwUHJvcGVydGllcy0+cE5leHQpOworICAgIGlmIChkZXB0aF9zdGVuY2lsX3Jlc29sdmVfcHJvcHMpIHsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKiB3cml0ZV9wcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIqKWRlcHRoX3N0ZW5jaWxfcmVzb2x2ZV9wcm9wczsKKyAgICAgICAgd3JpdGVfcHJvcHMtPnN1cHBvcnRlZERlcHRoUmVzb2x2ZU1vZGVzID0gVktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFI7CisgICAgICAgIHdyaXRlX3Byb3BzLT5zdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzID0gVktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFI7CisgICAgfQorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpCit7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsICZwRm9ybWF0UHJvcGVydGllcy0+Zm9ybWF0UHJvcGVydGllcyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykKK3sKKyAgICBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcEltYWdlRm9ybWF0SW5mby0+Zm9ybWF0LCBwSW1hZ2VGb3JtYXRJbmZvLT50eXBlLCBwSW1hZ2VGb3JtYXRJbmZvLT50aWxpbmcsIHBJbWFnZUZvcm1hdEluZm8tPnVzYWdlLCBwSW1hZ2VGb3JtYXRJbmZvLT5mbGFncywgJnBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPmltYWdlRm9ybWF0UHJvcGVydGllcyk7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKQoreworICAgIGlmIChwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ICYmIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHsKKyAgICAgICAgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsICZwUXVldWVGYW1pbHlQcm9wZXJ0aWVzLT5xdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBudWxscHRyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcykKK3sKKyAgICBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsICZwTWVtb3J5UHJvcGVydGllcy0+bWVtb3J5UHJvcGVydGllcyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREZXZpY2VNYXNrS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU1hc2spCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFRyaW1Db21tYW5kUG9vbEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKQoreworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKK30KKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKKyAgICBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiogICAgICAgICAgIHBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiAqLworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5RmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeUZkUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwKKyAgICBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlGZFByb3BlcnRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiAqLworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sCisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqICAgICAgICAgICAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKQoreworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKK30KKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiAgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgKi8KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTZW1hcGhvcmVGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKy8vRGVzdHJveSBvYmplY3QKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFJlbmRlclBhc3MgPSAoVmtSZW5kZXJQYXNzKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpblJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZE5leHRTdWJwYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbywKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFN3YXBjaGFpblN0YXR1c0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogICAgcEV4dGVybmFsRmVuY2VJbmZvLAorICAgIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKQoreworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEZlbmNlSW5mbywgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKTsKK30KKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogICAgICBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgKi8KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogICAgICAgICAgICAgICBwSW1wb3J0RmVuY2VGZEluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJDb3VudCwKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogICAgICAgICAgICAgICAgICAgIHBDb3VudGVycywKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiAgICAgICAgIHBDb3VudGVyRGVzY3JpcHRpb25zKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiogIHBQZXJmb3JtYW5jZVF1ZXJ5Q3JlYXRlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1QYXNzZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqICAgICAgICBwSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiogICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykKK3sKKyAgICBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBTdXJmYWNlSW5mby0+c3VyZmFjZSwgJnBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXQyS0hSKiAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cykKK3sKKyAgICAvLyBDdXJyZW50bHkgYWx3YXlzIHNheSB0aGF0IFJHQkE4ICYgQkdSQTggYXJlIHN1cHBvcnRlZAorICAgIGlmICghcFN1cmZhY2VGb3JtYXRzKSB7CisgICAgICAgICpwU3VyZmFjZUZvcm1hdENvdW50ID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGxpbmcgdGhyb3VnaCBhbmQganVzdCBmaWxsaW5nIGhvd2V2ZXIgbWFueSB0eXBlcyBhcmUgcmVxdWVzdGVkCisgICAgICAgIHN3aXRjaCgqcFN1cmZhY2VGb3JtYXRDb3VudCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHNbMV0ucE5leHQgPSBudWxscHRyOworICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzWzFdLnN1cmZhY2VGb3JtYXQuZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzWzFdLnN1cmZhY2VGb3JtYXQuY29sb3JTcGFjZSA9IFZLX0NPTE9SX1NQQUNFX1NSR0JfTk9OTElORUFSX0tIUjsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzWzFdLnBOZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1swXS5zdXJmYWNlRm9ybWF0LmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1swXS5zdXJmYWNlRm9ybWF0LmNvbG9yU3BhY2UgPSBWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogICAgICAgICAgICAgICBwRGlzcGxheVBsYW5lSW5mbywKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIHBJbmZvLT5pbWFnZSwgJnBNZW1vcnlSZXF1aXJlbWVudHMtPm1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKQoreworICAgIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIHBJbmZvLT5idWZmZXIsICZwTWVtb3J5UmVxdWlyZW1lbnRzLT5tZW1vcnlSZXF1aXJlbWVudHMpOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBZY2JjckNvbnZlcnNpb24gPSAoVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQnVmZmVyTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRJbWFnZU1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogICAgICAgICAgICAgICAgcEJpbmRJbmZvcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKworCisKKworCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFdhaXRTZW1hcGhvcmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqICAgICAgICAgICAgICAgcFdhaXRJbmZvLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTaWduYWxTZW1hcGhvcmVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKiAgICAgICAgICAgICBwU2lnbmFsSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtEZXZpY2VBZGRyZXNzIFZLQVBJX0NBTEwgR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB1aW50NjRfdCBWS0FQSV9DQUxMIEdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHVpbnQ2NF90IFZLQVBJX0NBTEwgR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiogICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXhlY3V0YWJsZUNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogICAgICAgICAgcFByb3BlcnRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogICAgICAgICAgIHBTdGF0aXN0aWNzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogICAgICAgICAgcEV4ZWN1dGFibGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqICAgICAgICAgICAgICAgICAgIHBDYWxsYmFjaykKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwQ2FsbGJhY2sgPSAoVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworLy9EZXN0cm95IG9iamVjdAorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVidWdSZXBvcnRNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb2RlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2UpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKworCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogICAgICAgIHBUYWdJbmZvKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqICAgICAgIHBOYW1lSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERlYnVnTWFya2VyQmVnaW5FWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREZWJ1Z01hcmtlckVuZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREZWJ1Z01hcmtlckluc2VydEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqICAgICAgICAgICBwTWFya2VySW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXplcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgdWludDMyX3QgVktBUElfQ0FMTCBHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTaGFkZXJJbmZvQU1EKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgVmtTaGFkZXJTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdGFnZSwKKyAgICBWa1NoYWRlckluZm9UeXBlQU1EICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm9TaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fR0dQICovCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGV4dGVybmFsSGFuZGxlVHlwZSwKKyAgICBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqICAgICAgICAgIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiAqLworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFN1cmZhY2UgPSAoVmtTdXJmYWNlS0hSKWdsb2JhbF91bmlxdWVfaGFuZGxlKys7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1ZJX05OICovCisKKworCisKKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogICBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqICAgICAgICAgIHBQcm9jZXNzQ29tbWFuZHNJbmZvKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiAgcFJlc2VydmVTcGFjZUluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKiAgICAgICAgICAgICAgICBwSW5kaXJlY3RDb21tYW5kc0xheW91dCkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwSW5kaXJlY3RDb21tYW5kc0xheW91dCA9IChWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAgICAgICAgICAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcE9iamVjdFRhYmxlID0gKFZrT2JqZWN0VGFibGVOVlgpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKy8vRGVzdHJveSBvYmplY3QKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVFbnRyeU5WWCogY29uc3QqICAgICAgICAgcHBPYmplY3RUYWJsZUVudHJpZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBVbnJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqICAgICAgICAgICAgICAgICBwT2JqZWN0RW50cnlUeXBlcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqICAgICAgIHBGZWF0dXJlcywKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiAgICAgICAgIHBMaW1pdHMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogICAgICAgICAgICAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlbGVhc2VEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVYbGliRGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBSUk91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyT3V0cHV0LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXkpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVCAqLworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRGlzcGxheVBvd2VyQ29udHJvbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5UG93ZXJJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheVBvd2VySW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWdpc3RlckRldmljZUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICAgcERldmljZUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFN3YXBjaGFpbkNvdW50ZXJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUICAgICAgICAgICAgICAgICBjb3VudGVyLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJWYWx1ZSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUqICAgICAgICAgICAgICAgcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsCisgICAgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5ncykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc2NhcmRSZWN0YW5nbGVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTZXRIZHJNZXRhZGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMsCisgICAgY29uc3QgVmtIZHJNZXRhZGF0YUVYVCogICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBTdXJmYWNlID0gKFZrU3VyZmFjZUtIUilnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLICovCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQqICAgICAgICBwTmFtZUluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgIHBUYWdJbmZvKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogICAgICAgICAgICAgICAgICAgcE1lc3NlbmdlcikKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwTWVzc2VuZ2VyID0gKFZrRGVidWdVdGlsc01lc3NlbmdlckVYVClnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUICAgICAgbWVzc2FnZVNldmVyaXR5LAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgICAgICAgICAgICAgbWVzc2FnZVR5cGVzLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogcENhbGxiYWNrRGF0YSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqICAgcFByb3BlcnRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSICovCisKKworCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiAgICAgICAgICAgICBwU2FtcGxlTG9jYXRpb25zSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLAorICAgIFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKiAgICAgICAgICAgICAgICAgcE11bHRpc2FtcGxlUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCisKKworCisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogICAgICBwUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgICAgICAgIHBWYWxpZGF0aW9uQ2FjaGUpCit7CisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICAqcFZhbGlkYXRpb25DYWNoZSA9IChWa1ZhbGlkYXRpb25DYWNoZUVYVClnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKiAgICAgICAgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViAgICAgICAgICAgICAgICAgICBzYW1wbGVPcmRlclR5cGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TYW1wbGVPcmRlckNvdW50LAorICAgIGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogICAgICAgICAgcEN1c3RvbVNhbXBsZU9yZGVycykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwQWNjZWxlcmF0aW9uU3RydWN0dXJlID0gKFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisvL0Rlc3Ryb3kgb2JqZWN0Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBwQmluZEluZm9zKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqICAgICAgICBwSW5mbywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlT2Zmc2V0LAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hPZmZzZXQpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViAgICAgICAgICAgbW9kZSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFRyYWNlUmF5c05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICBwUGlwZWxpbmVzW2ldID0gKFZrUGlwZWxpbmUpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEdyb3VwLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsCisgICAgVmtRdWVyeVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5KQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENvbXBpbGVEZWZlcnJlZE5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXIpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhvc3RQb2ludGVyLAorICAgIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiAgICAgICAgICAgcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWluQ291bnQsCisgICAgVmtUaW1lRG9tYWluRVhUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbnMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fR0dQICovCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRDaGVja3BvaW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnRNYXJrZXIpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YUNvdW50LAorICAgIFZrQ2hlY2twb2ludERhdGFOViogICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorfQorCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogIHBJbml0aWFsaXplSW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogICAgICAgICBwTWFya2VySW5mbykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiAgIHBNYXJrZXJJbmZvKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiAgICAgICBwT3ZlcnJpZGVJbmZvKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHBBY3F1aXJlSW5mbywKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKiAgICAgICAgICAgIHBDb25maWd1cmF0aW9uKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgICAgICAgICAgICAgcGFyYW1ldGVyLAorICAgIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiAgICAgICAgICAgICAgICAgICAgcFZhbHVlKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBTdXJmYWNlID0gKFZrU3VyZmFjZUtIUilnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgICpwU3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUICovCisKKworCisKKworCisKKworCisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa0RldmljZUFkZHJlc3MgVktBUElfQ0FMTCBHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9vbENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogICAgICAgICAgcFRvb2xQcm9wZXJ0aWVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqICAgICAgICAgICAgcFByb3BlcnRpZXMpCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21iaW5hdGlvbkNvdW50LAorICAgIFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKiAgICAgcENvbWJpbmF0aW9ucykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlQ291bnQsCisgICAgVmtQcmVzZW50TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKQoreworLy9Ob3QgYSBDUkVBVEUgb3IgREVTVFJPWSBmdW5jdGlvbgorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pCit7CisvL05vdCBhIENSRUFURSBvciBERVNUUk9ZIGZ1bmN0aW9uCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcykKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSICovCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBTdXJmYWNlID0gKFZrU3VyZmFjZUtIUilnbG9iYWxfdW5pcXVlX2hhbmRsZSsrOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRMaW5lU3RpcHBsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZUZhY3RvciwKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlUGF0dGVybikKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUmVzZXRRdWVyeVBvb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCkKK3sKKy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24KK30KKworCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgY2FyZSBhYm91dCBwaHlzaWNhbCBkZXZpY2UgZnVuY3Rpb25zIGFuZCByZXR1cm4gbnVsbHB0ciBmb3Igb3RoZXIgZnVuY3Rpb25zCisgICAgY29uc3QgYXV0byAmaXRlbSA9IG5hbWVfdG9fZnVuY3B0cl9tYXAuZmluZChmdW5jTmFtZSk7CisgICAgaWYgKGl0ZW0gIT0gbmFtZV90b19mdW5jcHRyX21hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KGl0ZW0tPnNlY29uZCk7CisgICAgfQorICAgIC8vIE1vY2sgc2hvdWxkIGludGVyY2VwdCBhbGwgZnVuY3Rpb25zIHNvIGlmIHdlIGdldCBoZXJlIGp1c3QgcmV0dXJuIG51bGwKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworfSAvLyBuYW1lc3BhY2Ugdmttb2NrCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxzZQorI2RlZmluZSBFWFBPUlQKKyNlbmRpZgorCitleHRlcm4gIkMiIHsKKworRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtfaWNkR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyKiBwTmFtZSkgeworICAgIGlmICghdmttb2NrOjpuZWdvdGlhdGVfbG9hZGVyX2ljZF9pbnRlcmZhY2VfY2FsbGVkKSB7CisgICAgICAgIHZrbW9jazo6bG9hZGVyX2ludGVyZmFjZV92ZXJzaW9uID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHZrbW9jazo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgcE5hbWUpOworfQorCitFWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a19pY2RHZXRQaHlzaWNhbERldmljZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBOYW1lKSB7CisgICAgcmV0dXJuIHZrbW9jazo6R2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcihpbnN0YW5jZSwgcE5hbWUpOworfQorCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrX2ljZE5lZ290aWF0ZUxvYWRlcklDREludGVyZmFjZVZlcnNpb24odWludDMyX3QqIHBTdXBwb3J0ZWRWZXJzaW9uKSB7CisgICAgdmttb2NrOjpuZWdvdGlhdGVfbG9hZGVyX2ljZF9pbnRlcmZhY2VfY2FsbGVkID0gdHJ1ZTsKKyAgICB2a21vY2s6OmxvYWRlcl9pbnRlcmZhY2VfdmVyc2lvbiA9ICpwU3VwcG9ydGVkVmVyc2lvbjsKKyAgICBpZiAoKnBTdXBwb3J0ZWRWZXJzaW9uID4gdmttb2NrOjpTVVBQT1JURURfTE9BREVSX0lDRF9JTlRFUkZBQ0VfVkVSU0lPTikgeworICAgICAgICAqcFN1cHBvcnRlZFZlcnNpb24gPSB2a21vY2s6OlNVUFBPUlRFRF9MT0FERVJfSUNEX0lOVEVSRkFDRV9WRVJTSU9OOworICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCitFWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgdmttb2NrOjpEZXN0cm95U3VyZmFjZUtIUihpbnN0YW5jZSwgc3VyZmFjZSwgcEFsbG9jYXRvcik7Cit9CisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0Jvb2wzMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpCit7CisgICAgcmV0dXJuIHZrbW9jazo6R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgc3VyZmFjZSwgcFN1cHBvcnRlZCk7Cit9CisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykKK3sKKyAgICByZXR1cm4gdmttb2NrOjpHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKK30KKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdEtIUiogICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKQoreworICAgIHJldHVybiB2a21vY2s6OkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBTdXJmYWNlRm9ybWF0Q291bnQsIHBTdXJmYWNlRm9ybWF0cyk7Cit9CisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMpCit7CisgICAgcmV0dXJuIHZrbW9jazo6R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwUHJlc2VudE1vZGVDb3VudCwgcFByZXNlbnRNb2Rlcyk7Cit9CisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICByZXR1cm4gdmttb2NrOjpDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlWGxpYlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlWGNiU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fWENCX0tIUiAqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICByZXR1cm4gdmttb2NrOjpDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIgKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlV2luMzJTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgKi8KKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpCit7CisgICAgcmV0dXJuIHZrbW9jazo6R2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKGRldmljZSwgc3VyZmFjZSwgcE1vZGVzKTsKK30KKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKQoreworICAgIHJldHVybiB2a21vY2s6OkdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBSZWN0Q291bnQsIHBSZWN0cyk7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVZpU3VyZmFjZU5OKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICByZXR1cm4gdmttb2NrOjpDcmVhdGVWaVN1cmZhY2VOTihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fVklfTk4gKi8KKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykKK3sKKyAgICByZXR1cm4gdmttb2NrOjpHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSU9TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlSU9TU3VyZmFjZU1WSyhpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fSU9TX01WSyAqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICByZXR1cm4gdmttb2NrOjpDcmVhdGVNYWNPU1N1cmZhY2VNVksoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSyAqLworCit9IC8vIGVuZCBleHRlcm4gIkMiCisKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL2dlbmVyYXRlZC9tb2NrX2ljZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL2dlbmVyYXRlZC9tb2NrX2ljZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTAwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvZ2VuZXJhdGVkL21vY2tfaWNkLmgKQEAgLTAsMCArMSwzMDUxIEBACisjaWZuZGVmIF9fbW9ja19pY2RfaF8KKyNkZWZpbmUgX19tb2NrX2ljZF9oXyAxCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisqKgorKi8KKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSAidnVsa2FuL3ZrX2ljZC5oIgorbmFtZXNwYWNlIHZrbW9jayB7CisKKwordXNpbmcgbXV0ZXhfdCA9IHN0ZDo6bXV0ZXg7Cit1c2luZyBsb2NrX2d1YXJkX3QgPSBzdGQ6OmxvY2tfZ3VhcmQ8bXV0ZXhfdD47Cit1c2luZyB1bmlxdWVfbG9ja190ID0gc3RkOjp1bmlxdWVfbG9jazxtdXRleF90PjsKKworc3RhdGljIG11dGV4X3QgZ2xvYmFsX2xvY2s7CitzdGF0aWMgdWludDY0X3QgZ2xvYmFsX3VuaXF1ZV9oYW5kbGUgPSAxOworc3RhdGljIGNvbnN0IHVpbnQzMl90IFNVUFBPUlRFRF9MT0FERVJfSUNEX0lOVEVSRkFDRV9WRVJTSU9OID0gNTsKK3N0YXRpYyB1aW50MzJfdCBsb2FkZXJfaW50ZXJmYWNlX3ZlcnNpb24gPSAwOworc3RhdGljIGJvb2wgbmVnb3RpYXRlX2xvYWRlcl9pY2RfaW50ZXJmYWNlX2NhbGxlZCA9IGZhbHNlOworc3RhdGljIHZvaWQqIENyZWF0ZURpc3BPYmpIYW5kbGUoKSB7CisgICAgYXV0byBoYW5kbGUgPSBuZXcgVktfTE9BREVSX0RBVEE7CisgICAgc2V0X2xvYWRlcl9tYWdpY192YWx1ZShoYW5kbGUpOworICAgIHJldHVybiBoYW5kbGU7Cit9CitzdGF0aWMgdm9pZCBEZXN0cm95RGlzcE9iakhhbmRsZSh2b2lkKiBoYW5kbGUpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxWS19MT0FERVJfREFUQSo+KGhhbmRsZSk7Cit9CisKKy8vIE1hcCBvZiBpbnN0YW5jZSBleHRlbnNpb24gbmFtZSB0byB2ZXJzaW9uCitzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCB1aW50MzJfdD4gaW5zdGFuY2VfZXh0ZW5zaW9uX21hcCA9IHsKKyAgICB7IlZLX0tIUl9zdXJmYWNlIiwgMjV9LAorICAgIHsiVktfS0hSX2Rpc3BsYXkiLCAyM30sCisgICAgeyJWS19LSFJfeGxpYl9zdXJmYWNlIiwgNn0sCisgICAgeyJWS19LSFJfeGNiX3N1cmZhY2UiLCA2fSwKKyAgICB7IlZLX0tIUl93YXlsYW5kX3N1cmZhY2UiLCA2fSwKKyAgICB7IlZLX0tIUl9hbmRyb2lkX3N1cmZhY2UiLCA2fSwKKyAgICB7IlZLX0tIUl93aW4zMl9zdXJmYWNlIiwgNn0sCisgICAgeyJWS19FWFRfZGVidWdfcmVwb3J0IiwgOX0sCisgICAgeyJWS19HR1Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSIsIDF9LAorICAgIHsiVktfTlZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyIsIDF9LAorICAgIHsiVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiLCAyfSwKKyAgICB7IlZLX0VYVF92YWxpZGF0aW9uX2ZsYWdzIiwgMn0sCisgICAgeyJWS19OTl92aV9zdXJmYWNlIiwgMX0sCisgICAgeyJWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIiwgMX0sCisgICAgeyJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyIsIDF9LAorICAgIHsiVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMiLCAxfSwKKyAgICB7IlZLX0VYVF9kaXJlY3RfbW9kZV9kaXNwbGF5IiwgMX0sCisgICAgeyJWS19FWFRfYWNxdWlyZV94bGliX2Rpc3BsYXkiLCAxfSwKKyAgICB7IlZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciIsIDF9LAorICAgIHsiVktfRVhUX3N3YXBjaGFpbl9jb2xvcnNwYWNlIiwgNH0sCisgICAgeyJWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIiwgMX0sCisgICAgeyJWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiIsIDF9LAorICAgIHsiVktfS0hSX2dldF9kaXNwbGF5X3Byb3BlcnRpZXMyIiwgMX0sCisgICAgeyJWS19NVktfaW9zX3N1cmZhY2UiLCAyfSwKKyAgICB7IlZLX01WS19tYWNvc19zdXJmYWNlIiwgMn0sCisgICAgeyJWS19FWFRfZGVidWdfdXRpbHMiLCAxfSwKKyAgICB7IlZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UiLCAxfSwKKyAgICB7IlZLX0VYVF9tZXRhbF9zdXJmYWNlIiwgMX0sCisgICAgeyJWS19LSFJfc3VyZmFjZV9wcm90ZWN0ZWRfY2FwYWJpbGl0aWVzIiwgMX0sCisgICAgeyJWS19FWFRfdmFsaWRhdGlvbl9mZWF0dXJlcyIsIDJ9LAorICAgIHsiVktfRVhUX2hlYWRsZXNzX3N1cmZhY2UiLCAxfSwKK307CisvLyBNYXAgb2YgZGV2aWNlIGV4dGVuc2lvbiBuYW1lIHRvIHZlcnNpb24KK3N0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHVpbnQzMl90PiBkZXZpY2VfZXh0ZW5zaW9uX21hcCA9IHsKKyAgICB7IlZLX0tIUl9zd2FwY2hhaW4iLCA3MH0sCisgICAgeyJWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4iLCAxMH0sCisgICAgeyJWS19OVl9nbHNsX3NoYWRlciIsIDF9LAorICAgIHsiVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCIsIDF9LAorICAgIHsiVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UiLCAzfSwKKyAgICB7IlZLX0lNR19maWx0ZXJfY3ViaWMiLCAxfSwKKyAgICB7IlZLX0FNRF9yYXN0ZXJpemF0aW9uX29yZGVyIiwgMX0sCisgICAgeyJWS19BTURfc2hhZGVyX3RyaW5hcnlfbWlubWF4IiwgMX0sCisgICAgeyJWS19BTURfc2hhZGVyX2V4cGxpY2l0X3ZlcnRleF9wYXJhbWV0ZXIiLCAxfSwKKyAgICB7IlZLX0VYVF9kZWJ1Z19tYXJrZXIiLCA0fSwKKyAgICB7IlZLX0FNRF9nY25fc2hhZGVyIiwgMX0sCisgICAgeyJWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiIsIDF9LAorICAgIHsiVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjayIsIDF9LAorICAgIHsiVktfTlZYX2ltYWdlX3ZpZXdfaGFuZGxlIiwgMX0sCisgICAgeyJWS19BTURfZHJhd19pbmRpcmVjdF9jb3VudCIsIDJ9LAorICAgIHsiVktfQU1EX25lZ2F0aXZlX3ZpZXdwb3J0X2hlaWdodCIsIDF9LAorICAgIHsiVktfQU1EX2dwdV9zaGFkZXJfaGFsZl9mbG9hdCIsIDJ9LAorICAgIHsiVktfQU1EX3NoYWRlcl9iYWxsb3QiLCAxfSwKKyAgICB7IlZLX0FNRF90ZXh0dXJlX2dhdGhlcl9iaWFzX2xvZCIsIDF9LAorICAgIHsiVktfQU1EX3NoYWRlcl9pbmZvIiwgMX0sCisgICAgeyJWS19BTURfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfbG9kIiwgMX0sCisgICAgeyJWS19OVl9jb3JuZXJfc2FtcGxlZF9pbWFnZSIsIDJ9LAorICAgIHsiVktfS0hSX211bHRpdmlldyIsIDF9LAorICAgIHsiVktfSU1HX2Zvcm1hdF9wdnJ0YyIsIDF9LAorICAgIHsiVktfTlZfZXh0ZXJuYWxfbWVtb3J5IiwgMX0sCisgICAgeyJWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIiLCAxfSwKKyAgICB7IlZLX05WX3dpbjMyX2tleWVkX211dGV4IiwgMn0sCisgICAgeyJWS19LSFJfZGV2aWNlX2dyb3VwIiwgNH0sCisgICAgeyJWS19LSFJfc2hhZGVyX2RyYXdfcGFyYW1ldGVycyIsIDF9LAorICAgIHsiVktfRVhUX3NoYWRlcl9zdWJncm91cF9iYWxsb3QiLCAxfSwKKyAgICB7IlZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfdm90ZSIsIDF9LAorICAgIHsiVktfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYXN0Y19oZHIiLCAxfSwKKyAgICB7IlZLX0VYVF9hc3RjX2RlY29kZV9tb2RlIiwgMX0sCisgICAgeyJWS19LSFJfbWFpbnRlbmFuY2UxIiwgMn0sCisgICAgeyJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5IiwgMX0sCisgICAgeyJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyIiwgMX0sCisgICAgeyJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkIiwgMX0sCisgICAgeyJWS19LSFJfd2luMzJfa2V5ZWRfbXV0ZXgiLCAxfSwKKyAgICB7IlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmUiLCAxfSwKKyAgICB7IlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIiLCAxfSwKKyAgICB7IlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfZmQiLCAxfSwKKyAgICB7IlZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IiLCAyfSwKKyAgICB7IlZLX0VYVF9jb25kaXRpb25hbF9yZW5kZXJpbmciLCAyfSwKKyAgICB7IlZLX0tIUl9zaGFkZXJfZmxvYXQxNl9pbnQ4IiwgMX0sCisgICAgeyJWS19LSFJfMTZiaXRfc3RvcmFnZSIsIDF9LAorICAgIHsiVktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnQiLCAxfSwKKyAgICB7IlZLX0tIUl9kZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZSIsIDF9LAorICAgIHsiVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMiLCAzfSwKKyAgICB7IlZLX05WX2NsaXBfc3BhY2Vfd19zY2FsaW5nIiwgMX0sCisgICAgeyJWS19FWFRfZGlzcGxheV9jb250cm9sIiwgMX0sCisgICAgeyJWS19HT09HTEVfZGlzcGxheV90aW1pbmciLCAxfSwKKyAgICB7IlZLX05WX3NhbXBsZV9tYXNrX292ZXJyaWRlX2NvdmVyYWdlIiwgMX0sCisgICAgeyJWS19OVl9nZW9tZXRyeV9zaGFkZXJfcGFzc3Rocm91Z2giLCAxfSwKKyAgICB7IlZLX05WX3ZpZXdwb3J0X2FycmF5MiIsIDF9LAorICAgIHsiVktfTlZYX211bHRpdmlld19wZXJfdmlld19hdHRyaWJ1dGVzIiwgMX0sCisgICAgeyJWS19OVl92aWV3cG9ydF9zd2l6emxlIiwgMX0sCisgICAgeyJWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzIiwgMX0sCisgICAgeyJWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24iLCAxfSwKKyAgICB7IlZLX0VYVF9kZXB0aF9jbGlwX2VuYWJsZSIsIDF9LAorICAgIHsiVktfRVhUX2hkcl9tZXRhZGF0YSIsIDJ9LAorICAgIHsiVktfS0hSX2ltYWdlbGVzc19mcmFtZWJ1ZmZlciIsIDF9LAorICAgIHsiVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMiIsIDF9LAorICAgIHsiVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSIsIDF9LAorICAgIHsiVktfS0hSX2V4dGVybmFsX2ZlbmNlIiwgMX0sCisgICAgeyJWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIiLCAxfSwKKyAgICB7IlZLX0tIUl9leHRlcm5hbF9mZW5jZV9mZCIsIDF9LAorICAgIHsiVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5IiwgMX0sCisgICAgeyJWS19LSFJfbWFpbnRlbmFuY2UyIiwgMX0sCisgICAgeyJWS19LSFJfdmFyaWFibGVfcG9pbnRlcnMiLCAxfSwKKyAgICB7IlZLX0VYVF9leHRlcm5hbF9tZW1vcnlfZG1hX2J1ZiIsIDF9LAorICAgIHsiVktfRVhUX3F1ZXVlX2ZhbWlseV9mb3JlaWduIiwgMX0sCisgICAgeyJWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24iLCAzfSwKKyAgICB7IlZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyIiwgM30sCisgICAgeyJWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4IiwgMn0sCisgICAgeyJWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyIsIDF9LAorICAgIHsiVktfQU1EX2dwdV9zaGFkZXJfaW50MTYiLCAyfSwKKyAgICB7IlZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMiLCAxfSwKKyAgICB7IlZLX0FNRF9zaGFkZXJfZnJhZ21lbnRfbWFzayIsIDF9LAorICAgIHsiVktfRVhUX2lubGluZV91bmlmb3JtX2Jsb2NrIiwgMX0sCisgICAgeyJWS19FWFRfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0IiwgMX0sCisgICAgeyJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyIsIDF9LAorICAgIHsiVktfS0hSX3JlbGF4ZWRfYmxvY2tfbGF5b3V0IiwgMX0sCisgICAgeyJWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyIiwgMX0sCisgICAgeyJWS19LSFJfaW1hZ2VfZm9ybWF0X2xpc3QiLCAxfSwKKyAgICB7IlZLX0VYVF9ibGVuZF9vcGVyYXRpb25fYWR2YW5jZWQiLCAyfSwKKyAgICB7IlZLX05WX2ZyYWdtZW50X2NvdmVyYWdlX3RvX2NvbG9yIiwgMX0sCisgICAgeyJWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzIiwgMX0sCisgICAgeyJWS19OVl9maWxsX3JlY3RhbmdsZSIsIDF9LAorICAgIHsiVktfTlZfc2hhZGVyX3NtX2J1aWx0aW5zIiwgMX0sCisgICAgeyJWS19FWFRfcG9zdF9kZXB0aF9jb3ZlcmFnZSIsIDF9LAorICAgIHsiVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiIsIDE0fSwKKyAgICB7IlZLX0tIUl9iaW5kX21lbW9yeTIiLCAxfSwKKyAgICB7IlZLX0VYVF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVyIiwgMX0sCisgICAgeyJWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZyIsIDJ9LAorICAgIHsiVktfRVhUX3NoYWRlcl92aWV3cG9ydF9pbmRleF9sYXllciIsIDF9LAorICAgIHsiVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlIiwgM30sCisgICAgeyJWS19OVl9yYXlfdHJhY2luZyIsIDN9LAorICAgIHsiVktfTlZfcmVwcmVzZW50YXRpdmVfZnJhZ21lbnRfdGVzdCIsIDJ9LAorICAgIHsiVktfS0hSX21haW50ZW5hbmNlMyIsIDF9LAorICAgIHsiVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQiLCAxfSwKKyAgICB7IlZLX0VYVF9maWx0ZXJfY3ViaWMiLCAyfSwKKyAgICB7IlZLX0VYVF9nbG9iYWxfcHJpb3JpdHkiLCAyfSwKKyAgICB7IlZLX0tIUl9zaGFkZXJfc3ViZ3JvdXBfZXh0ZW5kZWRfdHlwZXMiLCAxfSwKKyAgICB7IlZLX0tIUl84Yml0X3N0b3JhZ2UiLCAxfSwKKyAgICB7IlZLX0VYVF9leHRlcm5hbF9tZW1vcnlfaG9zdCIsIDF9LAorICAgIHsiVktfQU1EX2J1ZmZlcl9tYXJrZXIiLCAxfSwKKyAgICB7IlZLX0tIUl9zaGFkZXJfYXRvbWljX2ludDY0IiwgMX0sCisgICAgeyJWS19LSFJfc2hhZGVyX2Nsb2NrIiwgMX0sCisgICAgeyJWS19BTURfcGlwZWxpbmVfY29tcGlsZXJfY29udHJvbCIsIDF9LAorICAgIHsiVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyIsIDF9LAorICAgIHsiVktfQU1EX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMiLCAyfSwKKyAgICB7IlZLX0FNRF9tZW1vcnlfb3ZlcmFsbG9jYXRpb25fYmVoYXZpb3IiLCAxfSwKKyAgICB7IlZLX0VYVF92ZXJ0ZXhfYXR0cmlidXRlX2Rpdmlzb3IiLCAzfSwKKyAgICB7IlZLX0dHUF9mcmFtZV90b2tlbiIsIDF9LAorICAgIHsiVktfRVhUX3BpcGVsaW5lX2NyZWF0aW9uX2ZlZWRiYWNrIiwgMX0sCisgICAgeyJWS19LSFJfZHJpdmVyX3Byb3BlcnRpZXMiLCAxfSwKKyAgICB7IlZLX0tIUl9zaGFkZXJfZmxvYXRfY29udHJvbHMiLCA0fSwKKyAgICB7IlZLX05WX3NoYWRlcl9zdWJncm91cF9wYXJ0aXRpb25lZCIsIDF9LAorICAgIHsiVktfS0hSX2RlcHRoX3N0ZW5jaWxfcmVzb2x2ZSIsIDF9LAorICAgIHsiVktfS0hSX3N3YXBjaGFpbl9tdXRhYmxlX2Zvcm1hdCIsIDF9LAorICAgIHsiVktfTlZfY29tcHV0ZV9zaGFkZXJfZGVyaXZhdGl2ZXMiLCAxfSwKKyAgICB7IlZLX05WX21lc2hfc2hhZGVyIiwgMX0sCisgICAgeyJWS19OVl9mcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWMiLCAxfSwKKyAgICB7IlZLX05WX3NoYWRlcl9pbWFnZV9mb290cHJpbnQiLCAyfSwKKyAgICB7IlZLX05WX3NjaXNzb3JfZXhjbHVzaXZlIiwgMX0sCisgICAgeyJWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cyIsIDJ9LAorICAgIHsiVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSIsIDJ9LAorICAgIHsiVktfSU5URUxfc2hhZGVyX2ludGVnZXJfZnVuY3Rpb25zMiIsIDF9LAorICAgIHsiVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkiLCAxfSwKKyAgICB7IlZLX0tIUl92dWxrYW5fbWVtb3J5X21vZGVsIiwgM30sCisgICAgeyJWS19FWFRfcGNpX2J1c19pbmZvIiwgMn0sCisgICAgeyJWS19BTURfZGlzcGxheV9uYXRpdmVfaGRyIiwgMX0sCisgICAgeyJWS19FWFRfZnJhZ21lbnRfZGVuc2l0eV9tYXAiLCAxfSwKKyAgICB7IlZLX0VYVF9zY2FsYXJfYmxvY2tfbGF5b3V0IiwgMX0sCisgICAgeyJWS19HT09HTEVfaGxzbF9mdW5jdGlvbmFsaXR5MSIsIDF9LAorICAgIHsiVktfR09PR0xFX2RlY29yYXRlX3N0cmluZyIsIDF9LAorICAgIHsiVktfRVhUX3N1Ymdyb3VwX3NpemVfY29udHJvbCIsIDJ9LAorICAgIHsiVktfQU1EX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMyIiwgMX0sCisgICAgeyJWS19BTURfZGV2aWNlX2NvaGVyZW50X21lbW9yeSIsIDF9LAorICAgIHsiVktfS0hSX3NwaXJ2XzFfNCIsIDF9LAorICAgIHsiVktfRVhUX21lbW9yeV9idWRnZXQiLCAxfSwKKyAgICB7IlZLX0VYVF9tZW1vcnlfcHJpb3JpdHkiLCAxfSwKKyAgICB7IlZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nIiwgMX0sCisgICAgeyJWS19LSFJfc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzIiwgMX0sCisgICAgeyJWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzIiwgMn0sCisgICAgeyJWS19FWFRfdG9vbGluZ19pbmZvIiwgMX0sCisgICAgeyJWS19FWFRfc2VwYXJhdGVfc3RlbmNpbF91c2FnZSIsIDF9LAorICAgIHsiVktfTlZfY29vcGVyYXRpdmVfbWF0cml4IiwgMX0sCisgICAgeyJWS19OVl9jb3ZlcmFnZV9yZWR1Y3Rpb25fbW9kZSIsIDF9LAorICAgIHsiVktfRVhUX2ZyYWdtZW50X3NoYWRlcl9pbnRlcmxvY2siLCAxfSwKKyAgICB7IlZLX0VYVF95Y2Jjcl9pbWFnZV9hcnJheXMiLCAxfSwKKyAgICB7IlZLX0tIUl91bmlmb3JtX2J1ZmZlcl9zdGFuZGFyZF9sYXlvdXQiLCAxfSwKKyAgICB7IlZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUiLCA0fSwKKyAgICB7IlZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MiLCAxfSwKKyAgICB7IlZLX0VYVF9saW5lX3Jhc3Rlcml6YXRpb24iLCAxfSwKKyAgICB7IlZLX0VYVF9ob3N0X3F1ZXJ5X3Jlc2V0IiwgMX0sCisgICAgeyJWS19FWFRfaW5kZXhfdHlwZV91aW50OCIsIDF9LAorICAgIHsiVktfS0hSX3BpcGVsaW5lX2V4ZWN1dGFibGVfcHJvcGVydGllcyIsIDF9LAorICAgIHsiVktfRVhUX3NoYWRlcl9kZW1vdGVfdG9faGVscGVyX2ludm9jYXRpb24iLCAxfSwKKyAgICB7IlZLX0VYVF90ZXhlbF9idWZmZXJfYWxpZ25tZW50IiwgMX0sCisgICAgeyJWS19HT09HTEVfdXNlcl90eXBlIiwgMX0sCit9OworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbnN0YW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUluc3RhbmNlKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUNvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogICAgICAgICAgIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworCitzdGF0aWMgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBHZXREZXZpY2VQcm9jQWRkcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOYW1lKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEZXZpY2UoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcygKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllck5hbWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJOYW1lLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrTGF5ZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlUXVldWUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVJbmRleCwKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVTdWJtaXQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdENvdW50LAorICAgIGNvbnN0IFZrU3VibWl0SW5mbyogICAgICAgICAgICAgICAgICAgICAgICAgcFN1Ym1pdHMsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVXYWl0SWRsZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBEZXZpY2VXYWl0SWRsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRnJlZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIE1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgVmtNZW1vcnlNYXBGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB2b2lkKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwRGF0YSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBVbm1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmluZEJ1ZmZlck1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmluZEltYWdlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qICAgICAgICAgICAgICAgICAgICAgcEJpbmRJbmZvLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUZlbmNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVzZXRGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RmVuY2VTdGF0dXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgV2FpdEZvckZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzLAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEFsbCwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50KTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RXZlbnRTdGF0dXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVzZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtRdWVyeVBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVlcnlQb29sKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXJWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95QnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlclZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95SW1hZ2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSogICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLAorICAgIFZrU3VicmVzb3VyY2VMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2VWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NoYWRlck1vZHVsZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaGFkZXJNb2R1bGUpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVDYWNoZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95UGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgTWVyZ2VQaXBlbGluZUNhY2hlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdENhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQ2FjaGVDb3VudCwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgIHBTcmNDYWNoZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lQaXBlbGluZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXIpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgIHBTZXRMYXlvdXQpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclBvb2wpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldERlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVwZGF0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JDb3B5Q291bnQsCisgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvckNvcGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRnJhbWVidWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGcmFtZWJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWVidWZmZXIpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kUG9vbCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlc2V0Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBGcmVlQ29tbWFuZEJ1ZmZlcnMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmVnaW5Db21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qICAgICAgICAgICAgIHBCZWdpbkluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZFBpcGVsaW5lKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0Vmlld3BvcnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtWaWV3cG9ydCogICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlld3BvcnRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldFNjaXNzb3IoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjaXNzb3JzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldExpbmVXaWR0aCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RGVwdGhCaWFzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ2xhbXAsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNTbG9wZUZhY3Rvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRCbGVuZENvbnN0YW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZENvbnN0YW50c1s0XSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldFN0ZW5jaWxDb21wYXJlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVNYXNrKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldFN0ZW5jaWxXcml0ZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1hc2spOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCaW5kRGVzY3JpcHRvclNldHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNPZmZzZXRDb3VudCwKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEeW5hbWljT2Zmc2V0cyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCaW5kSW5kZXhCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrSW5kZXhUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhUeXBlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhdygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZlcnRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGV4ZWQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluZGV4LAorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4T2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRleGVkSW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERpc3BhdGNoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50Wik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDb3B5QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ29weUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQmxpdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLAorICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlCdWZmZXJUb0ltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlJbWFnZVRvQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEZpbGxCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ2xlYXJDb2xvckltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUqICAgICAgICAgICAgICAgICAgICBwQ29sb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiAgICAgICAgICAgICAgcFJhbmdlcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ2xlYXJBdHRhY2htZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50Q291bnQsCisgICAgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqICAgICAgICAgICAgICAgICAgICBwQXR0YWNobWVudHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Q291bnQsCisgICAgY29uc3QgVmtDbGVhclJlY3QqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUmVzb2x2ZUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVJlc29sdmUqICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRSZXNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VNYXNrKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFdhaXRFdmVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudCwKKyAgICBjb25zdCBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudHMsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRFbmRRdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRXcml0ZVRpbWVzdGFtcCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZVN0YWdlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpblJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZE5leHRTdWJwYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEV4ZWN1dGVDb21tYW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uKAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFwaVZlcnNpb24pOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRJbWFnZU1lbW9yeTIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogICAgICAgICAgICAgICAgcEJpbmRJbmZvcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RGV2aWNlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERpc3BhdGNoQmFzZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFRyaW1Db21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlUXVldWUyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlSW5mbywKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24pOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sCisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqICAgICAgICAgICAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgVmtTdXJmYWNlRm9ybWF0S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2Rlcyk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTd2FwY2hhaW5JbWFnZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVOZXh0SW1hZ2VLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VJbmRleCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVQcmVzZW50S0hSKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJlc2VudEluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogICAgICAgIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlTmV4dEltYWdlMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiAgICAgICAgICAgIHBBY3F1aXJlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KTsKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheUNvdW50LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZUluZGV4LAorICAgIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKiAgICAgICAgICAgICAgcENhcGFiaWxpdGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVhsaWJTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWaXN1YWxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbElEKTsKKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIgKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCitzdGF0aWMgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB4Y2JfY29ubmVjdGlvbl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgeGNiX3Zpc3VhbGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxfaWQpOworI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCitzdGF0aWMgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgc3RydWN0IHdsX2Rpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KTsKKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIgKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlV2luMzJTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgpOworI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgKi8KKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERldmljZUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGV2aWNlSW5kZXgsCisgICAgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiAgICAgICAgICAgICAgICAgICBwUGVlck1lbW9yeUZlYXR1cmVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldERldmljZU1hc2tLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzayk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKTsKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBUcmltQ29tbWFuZFBvb2xLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCisgICAgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqICAgICAgICAgICBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzKTsKKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSICovCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeUZkUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwKKyAgICBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlGZFByb3BlcnRpZXMpOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgKi8KKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyk7CisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpOworI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgKi8KKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKTsKKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworCisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5SZW5kZXJQYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLAorICAgIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICAgICAgICAgICAgcFN1YnBhc3NCZWdpbkluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kTmV4dFN1YnBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbyk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTd2FwY2hhaW5TdGF0dXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiAgICAgIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKTsKKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSICovCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBJbXBvcnRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqICAgICAgICAgICAgICAgcEltcG9ydEZlbmNlRmRJbmZvKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJDb3VudCwKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogICAgICAgICAgICAgICAgICAgIHBDb3VudGVycywKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiAgICAgICAgIHBDb3VudGVyRGVzY3JpcHRpb25zKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqICBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtUGFzc2VzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiogICAgICAgIHBJbmZvKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdDJLSFIqICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKTsKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogICAgICAgICAgICAgICBwRGlzcGxheVBsYW5lSW5mbywKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpOworCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQnVmZmVyTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kSW1hZ2VNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqICAgICAgICAgICAgICAgcFN1cHBvcnQpOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworCisKKworCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFdhaXRTZW1hcGhvcmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqICAgICAgICAgICAgICAgcFdhaXRJbmZvLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2lnbmFsU2VtYXBob3JlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogICAgICAgICAgICAgcFNpZ25hbEluZm8pOworCisKKworCisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa0RldmljZUFkZHJlc3MgVktBUElfQ0FMTCBHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiB1aW50NjRfdCBWS0FQSV9DQUxMIEdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiB1aW50NjRfdCBWS0FQSV9DQUxMIEdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbyk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKiAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGVjdXRhYmxlQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICBwUHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogICAgICAgICAgIHBTdGF0aXN0aWNzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMpOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCogICAgICAgICAgICAgICAgICAgcENhbGxiYWNrKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVidWdSZXBvcnRNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb2RlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2UpOworCisKKworCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQqICAgICAgICBwVGFnSW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCogICAgICAgcE5hbWVJbmZvKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERlYnVnTWFya2VyQmVnaW5FWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRGVidWdNYXJrZXJFbmRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERlYnVnTWFya2VySW5zZXJ0RVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogICAgICAgICAgIHBNYXJrZXJJbmZvKTsKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXplcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q291bnRlckJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleFN0cmlkZSk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgdWludDMyX3QgVktBUElfQ0FMTCBHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbyk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTaGFkZXJJbmZvQU1EKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgVmtTaGFkZXJTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdGFnZSwKKyAgICBWa1NoYWRlckluZm9UeXBlQU1EICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm9TaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm8pOworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9HR1AgKi8KKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICAgICAgICAgZXh0ZXJuYWxIYW5kbGVUeXBlLAorICAgIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViogICAgICAgICAgcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSk7CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiAqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgKi8KKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlVmlTdXJmYWNlTk4oCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fVklfTk4gKi8KKworCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiAgIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFByb2Nlc3NDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiAgICAgICAgICBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqICBwUmVzZXJ2ZVNwYWNlSW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKiAgICAgICAgICAgICAgICBwSW5kaXJlY3RDb21tYW5kc0xheW91dCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggICAgICAgICAgICAgICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa09iamVjdFRhYmxlTlZYKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RUYWJsZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95T2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBVbnJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqICAgICAgICAgICAgICAgICBwT2JqZWN0RW50cnlUeXBlcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKiAgICAgICBwRmVhdHVyZXMsCisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogICAgICAgICBwTGltaXRzKTsKKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiAgICAgICAgICAgICAgICAgcFZpZXdwb3J0V1NjYWxpbmdzKTsKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlbGVhc2VEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlWGxpYkRpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFJhbmRST3V0cHV0RGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFJST3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnJPdXRwdXQsCisgICAgVmtEaXNwbGF5S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheSk7CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVCAqLworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERpc3BsYXlQb3dlckNvbnRyb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlQb3dlckluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgICBwRGV2aWNlRXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTd2FwY2hhaW5Db3VudGVyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCAgICAgICAgICAgICAgICAgY291bnRlciwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyVmFsdWUpOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogICAgICAgICAgICAgICBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsCisgICAgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5ncyk7CisKKworCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNjYXJkUmVjdGFuZ2xlcyk7CisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFNldEhkck1ldGFkYXRhRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWlucywKKyAgICBjb25zdCBWa0hkck1ldGFkYXRhRVhUKiAgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YSk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fSU9TX01WSyAqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZU1hY09TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksgKi8KKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogICAgICAgIHBOYW1lSW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgIHBUYWdJbmZvKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQqICAgICAgICAgICAgICAgICAgIHBNZXNzZW5nZXIpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCAgICAgIG1lc3NhZ2VTZXZlcml0eSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICAgICAgICAgICAgIG1lc3NhZ2VUeXBlcywKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEpOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogICBwUHJvcGVydGllcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpOworI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiAqLworCisKKworCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogICAgICAgICAgICAgcFNhbXBsZUxvY2F0aW9uc0luZm8pOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqICAgICAgICAgICAgICAgICBwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzKTsKKworCisKKworCisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogICAgICBwUHJvcGVydGllcyk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICAgICAgICBwVmFsaWRhdGlvbkNhY2hlKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworCisKKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqICAgICAgICAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViAgICAgICAgICAgICAgICAgICBzYW1wbGVPcmRlclR5cGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TYW1wbGVPcmRlckNvdW50LAorICAgIGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogICAgICAgICAgcEN1c3RvbVNhbXBsZU9yZGVycyk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogICAgICAgIHBJbmZvLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZmZzZXQsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaE9mZnNldCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViAgICAgICAgICAgbW9kZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRUcmFjZVJheXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0R3JvdXAsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLAorICAgIFZrUXVlcnlUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcik7CisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhvc3RQb2ludGVyLAorICAgIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiAgICAgICAgICAgcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcyk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFdyaXRlQnVmZmVyTWFya2VyQU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RhZ2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIpOworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEb21haW5Db3VudCwKKyAgICBWa1RpbWVEb21haW5FWFQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWlucyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbik7CisKKworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX0dHUCAqLworCisKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3TWVzaFRhc2tzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUYXNrKTsKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCisKKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycyk7CisKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldENoZWNrcG9pbnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludE1hcmtlcik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YUNvdW50LAorICAgIFZrQ2hlY2twb2ludERhdGFOViogICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhKTsKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqICBwSW5pdGlhbGl6ZUluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogICAgICAgICBwTWFya2VySW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogICBwTWFya2VySW5mbyk7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqICAgICAgIHBPdmVycmlkZUluZm8pOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHBBY3F1aXJlSW5mbywKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKiAgICAgICAgICAgIHBDb25maWd1cmF0aW9uKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAgICAgICAgICAgICBjb25maWd1cmF0aW9uKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAgICAgICAgICAgICBjb25maWd1cmF0aW9uKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgICAgICAgICAgICAgcGFyYW1ldGVyLAorICAgIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiAgICAgICAgICAgICAgICAgICAgcFZhbHVlKTsKKworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTZXRMb2NhbERpbW1pbmdBTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwQ2hhaW4sCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpbW1pbmdFbmFibGUpOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCAqLworCisKKworCisKKworCisKKworCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtEZXZpY2VBZGRyZXNzIFZLQVBJX0NBTEwgR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKTsKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb29sQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKiAgICAgICAgICBwVG9vbFByb3BlcnRpZXMpOworCisKKworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tYmluYXRpb25Db3VudCwKKyAgICBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogICAgIHBDb21iaW5hdGlvbnMpOworCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMpOworCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbik7CisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKTsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKTsKKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSICovCisKKworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKworCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0TGluZVN0aXBwbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVGYWN0b3IsCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZVBhdHRlcm4pOworCisKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBSZXNldFF1ZXJ5UG9vbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50KTsKKworCisKKworCisvLyBNYXAgb2YgYWxsIEFQSXMgdG8gYmUgaW50ZXJjZXB0ZWQgYnkgdGhpcyBsYXllcgorc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgdm9pZCo+IG5hbWVfdG9fZnVuY3B0cl9tYXAgPSB7CisgICAgeyJ2a0NyZWF0ZUluc3RhbmNlIiwgKHZvaWQqKUNyZWF0ZUluc3RhbmNlfSwKKyAgICB7InZrRGVzdHJveUluc3RhbmNlIiwgKHZvaWQqKURlc3Ryb3lJbnN0YW5jZX0sCisgICAgeyJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIsICh2b2lkKilFbnVtZXJhdGVQaHlzaWNhbERldmljZXN9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXN9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXN9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXN9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzfSwKKyAgICB7InZrR2V0SW5zdGFuY2VQcm9jQWRkciIsICh2b2lkKilHZXRJbnN0YW5jZVByb2NBZGRyfSwKKyAgICB7InZrR2V0RGV2aWNlUHJvY0FkZHIiLCAodm9pZCopR2V0RGV2aWNlUHJvY0FkZHJ9LAorICAgIHsidmtDcmVhdGVEZXZpY2UiLCAodm9pZCopQ3JlYXRlRGV2aWNlfSwKKyAgICB7InZrRGVzdHJveURldmljZSIsICh2b2lkKilEZXN0cm95RGV2aWNlfSwKKyAgICB7InZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIiwgKHZvaWQqKUVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllc30sCisgICAgeyJ2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiLCAodm9pZCopRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllc30sCisgICAgeyJ2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIiwgKHZvaWQqKUVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzfSwKKyAgICB7InZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIiwgKHZvaWQqKUVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllc30sCisgICAgeyJ2a0dldERldmljZVF1ZXVlIiwgKHZvaWQqKUdldERldmljZVF1ZXVlfSwKKyAgICB7InZrUXVldWVTdWJtaXQiLCAodm9pZCopUXVldWVTdWJtaXR9LAorICAgIHsidmtRdWV1ZVdhaXRJZGxlIiwgKHZvaWQqKVF1ZXVlV2FpdElkbGV9LAorICAgIHsidmtEZXZpY2VXYWl0SWRsZSIsICh2b2lkKilEZXZpY2VXYWl0SWRsZX0sCisgICAgeyJ2a0FsbG9jYXRlTWVtb3J5IiwgKHZvaWQqKUFsbG9jYXRlTWVtb3J5fSwKKyAgICB7InZrRnJlZU1lbW9yeSIsICh2b2lkKilGcmVlTWVtb3J5fSwKKyAgICB7InZrTWFwTWVtb3J5IiwgKHZvaWQqKU1hcE1lbW9yeX0sCisgICAgeyJ2a1VubWFwTWVtb3J5IiwgKHZvaWQqKVVubWFwTWVtb3J5fSwKKyAgICB7InZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiLCAodm9pZCopRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXN9LAorICAgIHsidmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIiwgKHZvaWQqKUludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXN9LAorICAgIHsidmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IiwgKHZvaWQqKUdldERldmljZU1lbW9yeUNvbW1pdG1lbnR9LAorICAgIHsidmtCaW5kQnVmZmVyTWVtb3J5IiwgKHZvaWQqKUJpbmRCdWZmZXJNZW1vcnl9LAorICAgIHsidmtCaW5kSW1hZ2VNZW1vcnkiLCAodm9pZCopQmluZEltYWdlTWVtb3J5fSwKKyAgICB7InZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIiwgKHZvaWQqKUdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c30sCisgICAgeyJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIiwgKHZvaWQqKUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzfSwKKyAgICB7InZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiLCAodm9pZCopR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHN9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllc30sCisgICAgeyJ2a1F1ZXVlQmluZFNwYXJzZSIsICh2b2lkKilRdWV1ZUJpbmRTcGFyc2V9LAorICAgIHsidmtDcmVhdGVGZW5jZSIsICh2b2lkKilDcmVhdGVGZW5jZX0sCisgICAgeyJ2a0Rlc3Ryb3lGZW5jZSIsICh2b2lkKilEZXN0cm95RmVuY2V9LAorICAgIHsidmtSZXNldEZlbmNlcyIsICh2b2lkKilSZXNldEZlbmNlc30sCisgICAgeyJ2a0dldEZlbmNlU3RhdHVzIiwgKHZvaWQqKUdldEZlbmNlU3RhdHVzfSwKKyAgICB7InZrV2FpdEZvckZlbmNlcyIsICh2b2lkKilXYWl0Rm9yRmVuY2VzfSwKKyAgICB7InZrQ3JlYXRlU2VtYXBob3JlIiwgKHZvaWQqKUNyZWF0ZVNlbWFwaG9yZX0sCisgICAgeyJ2a0Rlc3Ryb3lTZW1hcGhvcmUiLCAodm9pZCopRGVzdHJveVNlbWFwaG9yZX0sCisgICAgeyJ2a0NyZWF0ZUV2ZW50IiwgKHZvaWQqKUNyZWF0ZUV2ZW50fSwKKyAgICB7InZrRGVzdHJveUV2ZW50IiwgKHZvaWQqKURlc3Ryb3lFdmVudH0sCisgICAgeyJ2a0dldEV2ZW50U3RhdHVzIiwgKHZvaWQqKUdldEV2ZW50U3RhdHVzfSwKKyAgICB7InZrU2V0RXZlbnQiLCAodm9pZCopU2V0RXZlbnR9LAorICAgIHsidmtSZXNldEV2ZW50IiwgKHZvaWQqKVJlc2V0RXZlbnR9LAorICAgIHsidmtDcmVhdGVRdWVyeVBvb2wiLCAodm9pZCopQ3JlYXRlUXVlcnlQb29sfSwKKyAgICB7InZrRGVzdHJveVF1ZXJ5UG9vbCIsICh2b2lkKilEZXN0cm95UXVlcnlQb29sfSwKKyAgICB7InZrR2V0UXVlcnlQb29sUmVzdWx0cyIsICh2b2lkKilHZXRRdWVyeVBvb2xSZXN1bHRzfSwKKyAgICB7InZrQ3JlYXRlQnVmZmVyIiwgKHZvaWQqKUNyZWF0ZUJ1ZmZlcn0sCisgICAgeyJ2a0Rlc3Ryb3lCdWZmZXIiLCAodm9pZCopRGVzdHJveUJ1ZmZlcn0sCisgICAgeyJ2a0NyZWF0ZUJ1ZmZlclZpZXciLCAodm9pZCopQ3JlYXRlQnVmZmVyVmlld30sCisgICAgeyJ2a0Rlc3Ryb3lCdWZmZXJWaWV3IiwgKHZvaWQqKURlc3Ryb3lCdWZmZXJWaWV3fSwKKyAgICB7InZrQ3JlYXRlSW1hZ2UiLCAodm9pZCopQ3JlYXRlSW1hZ2V9LAorICAgIHsidmtEZXN0cm95SW1hZ2UiLCAodm9pZCopRGVzdHJveUltYWdlfSwKKyAgICB7InZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIsICh2b2lkKilHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0fSwKKyAgICB7InZrQ3JlYXRlSW1hZ2VWaWV3IiwgKHZvaWQqKUNyZWF0ZUltYWdlVmlld30sCisgICAgeyJ2a0Rlc3Ryb3lJbWFnZVZpZXciLCAodm9pZCopRGVzdHJveUltYWdlVmlld30sCisgICAgeyJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIsICh2b2lkKilDcmVhdGVTaGFkZXJNb2R1bGV9LAorICAgIHsidmtEZXN0cm95U2hhZGVyTW9kdWxlIiwgKHZvaWQqKURlc3Ryb3lTaGFkZXJNb2R1bGV9LAorICAgIHsidmtDcmVhdGVQaXBlbGluZUNhY2hlIiwgKHZvaWQqKUNyZWF0ZVBpcGVsaW5lQ2FjaGV9LAorICAgIHsidmtEZXN0cm95UGlwZWxpbmVDYWNoZSIsICh2b2lkKilEZXN0cm95UGlwZWxpbmVDYWNoZX0sCisgICAgeyJ2a0dldFBpcGVsaW5lQ2FjaGVEYXRhIiwgKHZvaWQqKUdldFBpcGVsaW5lQ2FjaGVEYXRhfSwKKyAgICB7InZrTWVyZ2VQaXBlbGluZUNhY2hlcyIsICh2b2lkKilNZXJnZVBpcGVsaW5lQ2FjaGVzfSwKKyAgICB7InZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCAodm9pZCopQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXN9LAorICAgIHsidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIiwgKHZvaWQqKUNyZWF0ZUNvbXB1dGVQaXBlbGluZXN9LAorICAgIHsidmtEZXN0cm95UGlwZWxpbmUiLCAodm9pZCopRGVzdHJveVBpcGVsaW5lfSwKKyAgICB7InZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiLCAodm9pZCopQ3JlYXRlUGlwZWxpbmVMYXlvdXR9LAorICAgIHsidmtEZXN0cm95UGlwZWxpbmVMYXlvdXQiLCAodm9pZCopRGVzdHJveVBpcGVsaW5lTGF5b3V0fSwKKyAgICB7InZrQ3JlYXRlU2FtcGxlciIsICh2b2lkKilDcmVhdGVTYW1wbGVyfSwKKyAgICB7InZrRGVzdHJveVNhbXBsZXIiLCAodm9pZCopRGVzdHJveVNhbXBsZXJ9LAorICAgIHsidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IiwgKHZvaWQqKUNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXR9LAorICAgIHsidmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCIsICh2b2lkKilEZXN0cm95RGVzY3JpcHRvclNldExheW91dH0sCisgICAgeyJ2a0NyZWF0ZURlc2NyaXB0b3JQb29sIiwgKHZvaWQqKUNyZWF0ZURlc2NyaXB0b3JQb29sfSwKKyAgICB7InZrRGVzdHJveURlc2NyaXB0b3JQb29sIiwgKHZvaWQqKURlc3Ryb3lEZXNjcmlwdG9yUG9vbH0sCisgICAgeyJ2a1Jlc2V0RGVzY3JpcHRvclBvb2wiLCAodm9pZCopUmVzZXREZXNjcmlwdG9yUG9vbH0sCisgICAgeyJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiLCAodm9pZCopQWxsb2NhdGVEZXNjcmlwdG9yU2V0c30sCisgICAgeyJ2a0ZyZWVEZXNjcmlwdG9yU2V0cyIsICh2b2lkKilGcmVlRGVzY3JpcHRvclNldHN9LAorICAgIHsidmtVcGRhdGVEZXNjcmlwdG9yU2V0cyIsICh2b2lkKilVcGRhdGVEZXNjcmlwdG9yU2V0c30sCisgICAgeyJ2a0NyZWF0ZUZyYW1lYnVmZmVyIiwgKHZvaWQqKUNyZWF0ZUZyYW1lYnVmZmVyfSwKKyAgICB7InZrRGVzdHJveUZyYW1lYnVmZmVyIiwgKHZvaWQqKURlc3Ryb3lGcmFtZWJ1ZmZlcn0sCisgICAgeyJ2a0NyZWF0ZVJlbmRlclBhc3MiLCAodm9pZCopQ3JlYXRlUmVuZGVyUGFzc30sCisgICAgeyJ2a0Rlc3Ryb3lSZW5kZXJQYXNzIiwgKHZvaWQqKURlc3Ryb3lSZW5kZXJQYXNzfSwKKyAgICB7InZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5IiwgKHZvaWQqKUdldFJlbmRlckFyZWFHcmFudWxhcml0eX0sCisgICAgeyJ2a0NyZWF0ZUNvbW1hbmRQb29sIiwgKHZvaWQqKUNyZWF0ZUNvbW1hbmRQb29sfSwKKyAgICB7InZrRGVzdHJveUNvbW1hbmRQb29sIiwgKHZvaWQqKURlc3Ryb3lDb21tYW5kUG9vbH0sCisgICAgeyJ2a1Jlc2V0Q29tbWFuZFBvb2wiLCAodm9pZCopUmVzZXRDb21tYW5kUG9vbH0sCisgICAgeyJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiLCAodm9pZCopQWxsb2NhdGVDb21tYW5kQnVmZmVyc30sCisgICAgeyJ2a0ZyZWVDb21tYW5kQnVmZmVycyIsICh2b2lkKilGcmVlQ29tbWFuZEJ1ZmZlcnN9LAorICAgIHsidmtCZWdpbkNvbW1hbmRCdWZmZXIiLCAodm9pZCopQmVnaW5Db21tYW5kQnVmZmVyfSwKKyAgICB7InZrRW5kQ29tbWFuZEJ1ZmZlciIsICh2b2lkKilFbmRDb21tYW5kQnVmZmVyfSwKKyAgICB7InZrUmVzZXRDb21tYW5kQnVmZmVyIiwgKHZvaWQqKVJlc2V0Q29tbWFuZEJ1ZmZlcn0sCisgICAgeyJ2a0NtZEJpbmRQaXBlbGluZSIsICh2b2lkKilDbWRCaW5kUGlwZWxpbmV9LAorICAgIHsidmtDbWRTZXRWaWV3cG9ydCIsICh2b2lkKilDbWRTZXRWaWV3cG9ydH0sCisgICAgeyJ2a0NtZFNldFNjaXNzb3IiLCAodm9pZCopQ21kU2V0U2Npc3Nvcn0sCisgICAgeyJ2a0NtZFNldExpbmVXaWR0aCIsICh2b2lkKilDbWRTZXRMaW5lV2lkdGh9LAorICAgIHsidmtDbWRTZXREZXB0aEJpYXMiLCAodm9pZCopQ21kU2V0RGVwdGhCaWFzfSwKKyAgICB7InZrQ21kU2V0QmxlbmRDb25zdGFudHMiLCAodm9pZCopQ21kU2V0QmxlbmRDb25zdGFudHN9LAorICAgIHsidmtDbWRTZXREZXB0aEJvdW5kcyIsICh2b2lkKilDbWRTZXREZXB0aEJvdW5kc30sCisgICAgeyJ2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayIsICh2b2lkKilDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2t9LAorICAgIHsidmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrIiwgKHZvaWQqKUNtZFNldFN0ZW5jaWxXcml0ZU1hc2t9LAorICAgIHsidmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIiwgKHZvaWQqKUNtZFNldFN0ZW5jaWxSZWZlcmVuY2V9LAorICAgIHsidmtDbWRCaW5kRGVzY3JpcHRvclNldHMiLCAodm9pZCopQ21kQmluZERlc2NyaXB0b3JTZXRzfSwKKyAgICB7InZrQ21kQmluZEluZGV4QnVmZmVyIiwgKHZvaWQqKUNtZEJpbmRJbmRleEJ1ZmZlcn0sCisgICAgeyJ2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzIiwgKHZvaWQqKUNtZEJpbmRWZXJ0ZXhCdWZmZXJzfSwKKyAgICB7InZrQ21kRHJhdyIsICh2b2lkKilDbWREcmF3fSwKKyAgICB7InZrQ21kRHJhd0luZGV4ZWQiLCAodm9pZCopQ21kRHJhd0luZGV4ZWR9LAorICAgIHsidmtDbWREcmF3SW5kaXJlY3QiLCAodm9pZCopQ21kRHJhd0luZGlyZWN0fSwKKyAgICB7InZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCIsICh2b2lkKilDbWREcmF3SW5kZXhlZEluZGlyZWN0fSwKKyAgICB7InZrQ21kRGlzcGF0Y2giLCAodm9pZCopQ21kRGlzcGF0Y2h9LAorICAgIHsidmtDbWREaXNwYXRjaEluZGlyZWN0IiwgKHZvaWQqKUNtZERpc3BhdGNoSW5kaXJlY3R9LAorICAgIHsidmtDbWRDb3B5QnVmZmVyIiwgKHZvaWQqKUNtZENvcHlCdWZmZXJ9LAorICAgIHsidmtDbWRDb3B5SW1hZ2UiLCAodm9pZCopQ21kQ29weUltYWdlfSwKKyAgICB7InZrQ21kQmxpdEltYWdlIiwgKHZvaWQqKUNtZEJsaXRJbWFnZX0sCisgICAgeyJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlIiwgKHZvaWQqKUNtZENvcHlCdWZmZXJUb0ltYWdlfSwKKyAgICB7InZrQ21kQ29weUltYWdlVG9CdWZmZXIiLCAodm9pZCopQ21kQ29weUltYWdlVG9CdWZmZXJ9LAorICAgIHsidmtDbWRVcGRhdGVCdWZmZXIiLCAodm9pZCopQ21kVXBkYXRlQnVmZmVyfSwKKyAgICB7InZrQ21kRmlsbEJ1ZmZlciIsICh2b2lkKilDbWRGaWxsQnVmZmVyfSwKKyAgICB7InZrQ21kQ2xlYXJDb2xvckltYWdlIiwgKHZvaWQqKUNtZENsZWFyQ29sb3JJbWFnZX0sCisgICAgeyJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiLCAodm9pZCopQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZX0sCisgICAgeyJ2a0NtZENsZWFyQXR0YWNobWVudHMiLCAodm9pZCopQ21kQ2xlYXJBdHRhY2htZW50c30sCisgICAgeyJ2a0NtZFJlc29sdmVJbWFnZSIsICh2b2lkKilDbWRSZXNvbHZlSW1hZ2V9LAorICAgIHsidmtDbWRTZXRFdmVudCIsICh2b2lkKilDbWRTZXRFdmVudH0sCisgICAgeyJ2a0NtZFJlc2V0RXZlbnQiLCAodm9pZCopQ21kUmVzZXRFdmVudH0sCisgICAgeyJ2a0NtZFdhaXRFdmVudHMiLCAodm9pZCopQ21kV2FpdEV2ZW50c30sCisgICAgeyJ2a0NtZFBpcGVsaW5lQmFycmllciIsICh2b2lkKilDbWRQaXBlbGluZUJhcnJpZXJ9LAorICAgIHsidmtDbWRCZWdpblF1ZXJ5IiwgKHZvaWQqKUNtZEJlZ2luUXVlcnl9LAorICAgIHsidmtDbWRFbmRRdWVyeSIsICh2b2lkKilDbWRFbmRRdWVyeX0sCisgICAgeyJ2a0NtZFJlc2V0UXVlcnlQb29sIiwgKHZvaWQqKUNtZFJlc2V0UXVlcnlQb29sfSwKKyAgICB7InZrQ21kV3JpdGVUaW1lc3RhbXAiLCAodm9pZCopQ21kV3JpdGVUaW1lc3RhbXB9LAorICAgIHsidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIsICh2b2lkKilDbWRDb3B5UXVlcnlQb29sUmVzdWx0c30sCisgICAgeyJ2a0NtZFB1c2hDb25zdGFudHMiLCAodm9pZCopQ21kUHVzaENvbnN0YW50c30sCisgICAgeyJ2a0NtZEJlZ2luUmVuZGVyUGFzcyIsICh2b2lkKilDbWRCZWdpblJlbmRlclBhc3N9LAorICAgIHsidmtDbWROZXh0U3VicGFzcyIsICh2b2lkKilDbWROZXh0U3VicGFzc30sCisgICAgeyJ2a0NtZEVuZFJlbmRlclBhc3MiLCAodm9pZCopQ21kRW5kUmVuZGVyUGFzc30sCisgICAgeyJ2a0NtZEV4ZWN1dGVDb21tYW5kcyIsICh2b2lkKilDbWRFeGVjdXRlQ29tbWFuZHN9LAorICAgIHsidmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24iLCAodm9pZCopRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9ufSwKKyAgICB7InZrQmluZEJ1ZmZlck1lbW9yeTIiLCAodm9pZCopQmluZEJ1ZmZlck1lbW9yeTJ9LAorICAgIHsidmtCaW5kSW1hZ2VNZW1vcnkyIiwgKHZvaWQqKUJpbmRJbWFnZU1lbW9yeTJ9LAorICAgIHsidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIsICh2b2lkKilHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc30sCisgICAgeyJ2a0NtZFNldERldmljZU1hc2siLCAodm9pZCopQ21kU2V0RGV2aWNlTWFza30sCisgICAgeyJ2a0NtZERpc3BhdGNoQmFzZSIsICh2b2lkKilDbWREaXNwYXRjaEJhc2V9LAorICAgIHsidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyIsICh2b2lkKilFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc30sCisgICAgeyJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiIsICh2b2lkKilHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJ9LAorICAgIHsidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIiwgKHZvaWQqKUdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJ9LAorICAgIHsidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiLCAodm9pZCopR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJ9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJ9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJ9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJ9LAorICAgIHsidmtUcmltQ29tbWFuZFBvb2wiLCAodm9pZCopVHJpbUNvbW1hbmRQb29sfSwKKyAgICB7InZrR2V0RGV2aWNlUXVldWUyIiwgKHZvaWQqKUdldERldmljZVF1ZXVlMn0sCisgICAgeyJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCAodm9pZCopQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbn0sCisgICAgeyJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgKHZvaWQqKURlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9ufSwKKyAgICB7InZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgKHZvaWQqKUNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZX0sCisgICAgeyJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCAodm9pZCopRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZX0sCisgICAgeyJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUiLCAodm9pZCopVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXN9LAorICAgIHsidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCIsICh2b2lkKilHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydH0sCisgICAgeyJ2a0Rlc3Ryb3lTdXJmYWNlS0hSIiwgKHZvaWQqKURlc3Ryb3lTdXJmYWNlS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFJ9LAorICAgIHsidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCAodm9pZCopQ3JlYXRlU3dhcGNoYWluS0hSfSwKKyAgICB7InZrRGVzdHJveVN3YXBjaGFpbktIUiIsICh2b2lkKilEZXN0cm95U3dhcGNoYWluS0hSfSwKKyAgICB7InZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIiwgKHZvaWQqKUdldFN3YXBjaGFpbkltYWdlc0tIUn0sCisgICAgeyJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiLCAodm9pZCopQWNxdWlyZU5leHRJbWFnZUtIUn0sCisgICAgeyJ2a1F1ZXVlUHJlc2VudEtIUiIsICh2b2lkKilRdWV1ZVByZXNlbnRLSFJ9LAorICAgIHsidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiLCAodm9pZCopR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSfSwKKyAgICB7InZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiwgKHZvaWQqKUdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUn0sCisgICAgeyJ2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIiwgKHZvaWQqKUFjcXVpcmVOZXh0SW1hZ2UyS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUn0sCisgICAgeyJ2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIiwgKHZvaWQqKUdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSfSwKKyAgICB7InZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIiwgKHZvaWQqKUdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUn0sCisgICAgeyJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIiwgKHZvaWQqKUNyZWF0ZURpc3BsYXlNb2RlS0hSfSwKKyAgICB7InZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIiwgKHZvaWQqKUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUn0sCisgICAgeyJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiLCAodm9pZCopQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUn0sCisgICAgeyJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiLCAodm9pZCopQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUn0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgeyJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIiwgKHZvaWQqKUNyZWF0ZVhsaWJTdXJmYWNlS0hSfSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFJ9LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICB7InZrQ3JlYXRlWGNiU3VyZmFjZUtIUiIsICh2b2lkKilDcmVhdGVYY2JTdXJmYWNlS0hSfSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFJ9LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgeyJ2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIiwgKHZvaWQqKUNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSfSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFJ9LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgeyJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgKHZvaWQqKUNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSfSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgKHZvaWQqKUNyZWF0ZVdpbjMyU3VyZmFjZUtIUn0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSfSwKKyNlbmRpZgorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFJ9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUn0sCisgICAgeyJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSIiwgKHZvaWQqKUdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSfSwKKyAgICB7InZrQ21kU2V0RGV2aWNlTWFza0tIUiIsICh2b2lkKilDbWRTZXREZXZpY2VNYXNrS0hSfSwKKyAgICB7InZrQ21kRGlzcGF0Y2hCYXNlS0hSIiwgKHZvaWQqKUNtZERpc3BhdGNoQmFzZUtIUn0sCisgICAgeyJ2a1RyaW1Db21tYW5kUG9vbEtIUiIsICh2b2lkKilUcmltQ29tbWFuZFBvb2xLSFJ9LAorICAgIHsidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiIsICh2b2lkKilFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSfSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSIiwgKHZvaWQqKUdldE1lbW9yeVdpbjMySGFuZGxlS0hSfSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIiwgKHZvaWQqKUdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUn0sCisjZW5kaWYKKyAgICB7InZrR2V0TWVtb3J5RmRLSFIiLCAodm9pZCopR2V0TWVtb3J5RmRLSFJ9LAorICAgIHsidmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIiLCAodm9pZCopR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFJ9LAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiLCAodm9pZCopSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFJ9LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHsidmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIsICh2b2lkKilHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUn0sCisjZW5kaWYKKyAgICB7InZrSW1wb3J0U2VtYXBob3JlRmRLSFIiLCAodm9pZCopSW1wb3J0U2VtYXBob3JlRmRLSFJ9LAorICAgIHsidmtHZXRTZW1hcGhvcmVGZEtIUiIsICh2b2lkKilHZXRTZW1hcGhvcmVGZEtIUn0sCisgICAgeyJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIiwgKHZvaWQqKUNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSfSwKKyAgICB7InZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCAodm9pZCopQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFJ9LAorICAgIHsidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCAodm9pZCopQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSfSwKKyAgICB7InZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsICh2b2lkKilEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSfSwKKyAgICB7InZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIsICh2b2lkKilVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSfSwKKyAgICB7InZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCAodm9pZCopQ3JlYXRlUmVuZGVyUGFzczJLSFJ9LAorICAgIHsidmtDbWRCZWdpblJlbmRlclBhc3MyS0hSIiwgKHZvaWQqKUNtZEJlZ2luUmVuZGVyUGFzczJLSFJ9LAorICAgIHsidmtDbWROZXh0U3VicGFzczJLSFIiLCAodm9pZCopQ21kTmV4dFN1YnBhc3MyS0hSfSwKKyAgICB7InZrQ21kRW5kUmVuZGVyUGFzczJLSFIiLCAodm9pZCopQ21kRW5kUmVuZGVyUGFzczJLSFJ9LAorICAgIHsidmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIiLCAodm9pZCopR2V0U3dhcGNoYWluU3RhdHVzS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSfSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIiLCAodm9pZCopSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUn0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIiLCAodm9pZCopR2V0RmVuY2VXaW4zMkhhbmRsZUtIUn0sCisjZW5kaWYKKyAgICB7InZrSW1wb3J0RmVuY2VGZEtIUiIsICh2b2lkKilJbXBvcnRGZW5jZUZkS0hSfSwKKyAgICB7InZrR2V0RmVuY2VGZEtIUiIsICh2b2lkKilHZXRGZW5jZUZkS0hSfSwKKyAgICB7InZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIsICh2b2lkKilFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFJ9LAorICAgIHsidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIsICh2b2lkKilBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUn0sCisgICAgeyJ2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIiwgKHZvaWQqKVJlbGVhc2VQcm9maWxpbmdMb2NrS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFJ9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUn0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUn0sCisgICAgeyJ2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIiLCAodm9pZCopR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUn0sCisgICAgeyJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiLCAodm9pZCopR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUn0sCisgICAgeyJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIsICh2b2lkKilHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFJ9LAorICAgIHsidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgKHZvaWQqKUdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFJ9LAorICAgIHsidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiLCAodm9pZCopR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSfSwKKyAgICB7InZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICh2b2lkKilDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSfSwKKyAgICB7InZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCAodm9pZCopRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFJ9LAorICAgIHsidmtCaW5kQnVmZmVyTWVtb3J5MktIUiIsICh2b2lkKilCaW5kQnVmZmVyTWVtb3J5MktIUn0sCisgICAgeyJ2a0JpbmRJbWFnZU1lbW9yeTJLSFIiLCAodm9pZCopQmluZEltYWdlTWVtb3J5MktIUn0sCisgICAgeyJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIiwgKHZvaWQqKUdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSfSwKKyAgICB7InZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIiLCAodm9pZCopQ21kRHJhd0luZGlyZWN0Q291bnRLSFJ9LAorICAgIHsidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiLCAodm9pZCopQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSfSwKKyAgICB7InZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSIiwgKHZvaWQqKUdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUn0sCisgICAgeyJ2a1dhaXRTZW1hcGhvcmVzS0hSIiwgKHZvaWQqKVdhaXRTZW1hcGhvcmVzS0hSfSwKKyAgICB7InZrU2lnbmFsU2VtYXBob3JlS0hSIiwgKHZvaWQqKVNpZ25hbFNlbWFwaG9yZUtIUn0sCisgICAgeyJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIiLCAodm9pZCopR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUn0sCisgICAgeyJ2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIiwgKHZvaWQqKUdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSfSwKKyAgICB7InZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiLCAodm9pZCopR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFJ9LAorICAgIHsidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIiwgKHZvaWQqKUdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFJ9LAorICAgIHsidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIiwgKHZvaWQqKUdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFJ9LAorICAgIHsidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIsICh2b2lkKilHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUn0sCisgICAgeyJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCAodm9pZCopQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVH0sCisgICAgeyJ2a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIiwgKHZvaWQqKURlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUfSwKKyAgICB7InZrRGVidWdSZXBvcnRNZXNzYWdlRVhUIiwgKHZvaWQqKURlYnVnUmVwb3J0TWVzc2FnZUVYVH0sCisgICAgeyJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUIiwgKHZvaWQqKURlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUfSwKKyAgICB7InZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIiwgKHZvaWQqKURlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVH0sCisgICAgeyJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiLCAodm9pZCopQ21kRGVidWdNYXJrZXJCZWdpbkVYVH0sCisgICAgeyJ2a0NtZERlYnVnTWFya2VyRW5kRVhUIiwgKHZvaWQqKUNtZERlYnVnTWFya2VyRW5kRVhUfSwKKyAgICB7InZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiLCAodm9pZCopQ21kRGVidWdNYXJrZXJJbnNlcnRFWFR9LAorICAgIHsidmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUIiwgKHZvaWQqKUNtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFR9LAorICAgIHsidmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUIiwgKHZvaWQqKUNtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFR9LAorICAgIHsidmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCIsICh2b2lkKilDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVH0sCisgICAgeyJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIiwgKHZvaWQqKUNtZEJlZ2luUXVlcnlJbmRleGVkRVhUfSwKKyAgICB7InZrQ21kRW5kUXVlcnlJbmRleGVkRVhUIiwgKHZvaWQqKUNtZEVuZFF1ZXJ5SW5kZXhlZEVYVH0sCisgICAgeyJ2a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCIsICh2b2lkKilDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFR9LAorICAgIHsidmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgiLCAodm9pZCopR2V0SW1hZ2VWaWV3SGFuZGxlTlZYfSwKKyAgICB7InZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQiLCAodm9pZCopQ21kRHJhd0luZGlyZWN0Q291bnRBTUR9LAorICAgIHsidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiLCAodm9pZCopQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EfSwKKyAgICB7InZrR2V0U2hhZGVySW5mb0FNRCIsICh2b2lkKilHZXRTaGFkZXJJbmZvQU1EfSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgeyJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiwgKHZvaWQqKUNyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQfSwKKyNlbmRpZgorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WfSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYiLCAodm9pZCopR2V0TWVtb3J5V2luMzJIYW5kbGVOVn0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKyAgICB7InZrQ3JlYXRlVmlTdXJmYWNlTk4iLCAodm9pZCopQ3JlYXRlVmlTdXJmYWNlTk59LAorI2VuZGlmCisgICAgeyJ2a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiLCAodm9pZCopQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVH0sCisgICAgeyJ2a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIiwgKHZvaWQqKUNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUfSwKKyAgICB7InZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIiwgKHZvaWQqKUNtZFByb2Nlc3NDb21tYW5kc05WWH0sCisgICAgeyJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIiwgKHZvaWQqKUNtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYfSwKKyAgICB7InZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsICh2b2lkKilDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYfSwKKyAgICB7InZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAodm9pZCopRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlh9LAorICAgIHsidmtDcmVhdGVPYmplY3RUYWJsZU5WWCIsICh2b2lkKilDcmVhdGVPYmplY3RUYWJsZU5WWH0sCisgICAgeyJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCIsICh2b2lkKilEZXN0cm95T2JqZWN0VGFibGVOVlh9LAorICAgIHsidmtSZWdpc3Rlck9iamVjdHNOVlgiLCAodm9pZCopUmVnaXN0ZXJPYmplY3RzTlZYfSwKKyAgICB7InZrVW5yZWdpc3Rlck9iamVjdHNOVlgiLCAodm9pZCopVW5yZWdpc3Rlck9iamVjdHNOVlh9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWH0sCisgICAgeyJ2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViIsICh2b2lkKilDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlZ9LAorICAgIHsidmtSZWxlYXNlRGlzcGxheUVYVCIsICh2b2lkKilSZWxlYXNlRGlzcGxheUVYVH0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgIHsidmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQiLCAodm9pZCopQWNxdWlyZVhsaWJEaXNwbGF5RVhUfSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICB7InZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUIiwgKHZvaWQqKUdldFJhbmRST3V0cHV0RGlzcGxheUVYVH0sCisjZW5kaWYKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUfSwKKyAgICB7InZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCIsICh2b2lkKilEaXNwbGF5UG93ZXJDb250cm9sRVhUfSwKKyAgICB7InZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIsICh2b2lkKilSZWdpc3RlckRldmljZUV2ZW50RVhUfSwKKyAgICB7InZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQiLCAodm9pZCopUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFR9LAorICAgIHsidmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIiwgKHZvaWQqKUdldFN3YXBjaGFpbkNvdW50ZXJFWFR9LAorICAgIHsidmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSIsICh2b2lkKilHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRX0sCisgICAgeyJ2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiLCAodm9pZCopR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRX0sCisgICAgeyJ2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQiLCAodm9pZCopQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVH0sCisgICAgeyJ2a1NldEhkck1ldGFkYXRhRVhUIiwgKHZvaWQqKVNldEhkck1ldGFkYXRhRVhUfSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgIHsidmtDcmVhdGVJT1NTdXJmYWNlTVZLIiwgKHZvaWQqKUNyZWF0ZUlPU1N1cmZhY2VNVkt9LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIHsidmtDcmVhdGVNYWNPU1N1cmZhY2VNVksiLCAodm9pZCopQ3JlYXRlTWFjT1NTdXJmYWNlTVZLfSwKKyNlbmRpZgorICAgIHsidmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCIsICh2b2lkKilTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVH0sCisgICAgeyJ2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQiLCAodm9pZCopU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVH0sCisgICAgeyJ2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiLCAodm9pZCopUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVH0sCisgICAgeyJ2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUIiwgKHZvaWQqKVF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUfSwKKyAgICB7InZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiLCAodm9pZCopUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFR9LAorICAgIHsidmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIsICh2b2lkKilDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVH0sCisgICAgeyJ2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCIsICh2b2lkKilDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFR9LAorICAgIHsidmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiLCAodm9pZCopQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUfSwKKyAgICB7InZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIsICh2b2lkKilDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUfSwKKyAgICB7InZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCAodm9pZCopRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFR9LAorICAgIHsidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIsICh2b2lkKilTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVH0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgeyJ2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIiwgKHZvaWQqKUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEfSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHsidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIiwgKHZvaWQqKUdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUR9LAorI2VuZGlmCisgICAgeyJ2a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCIsICh2b2lkKilDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFR9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCIsICh2b2lkKilHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVH0sCisgICAgeyJ2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIiwgKHZvaWQqKUdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUfSwKKyAgICB7InZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIiwgKHZvaWQqKUNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVH0sCisgICAgeyJ2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQiLCAodm9pZCopRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVH0sCisgICAgeyJ2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCIsICh2b2lkKilNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFR9LAorICAgIHsidmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIiwgKHZvaWQqKUdldFZhbGlkYXRpb25DYWNoZURhdGFFWFR9LAorICAgIHsidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIiwgKHZvaWQqKUNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlZ9LAorICAgIHsidmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WIiwgKHZvaWQqKUNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlZ9LAorICAgIHsidmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WIiwgKHZvaWQqKUNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlZ9LAorICAgIHsidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICh2b2lkKilDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVn0sCisgICAgeyJ2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICh2b2lkKilEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlZ9LAorICAgIHsidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViIsICh2b2lkKilHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVn0sCisgICAgeyJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIsICh2b2lkKilCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlZ9LAorICAgIHsidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgKHZvaWQqKUNtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZ9LAorICAgIHsidmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAodm9pZCopQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WfSwKKyAgICB7InZrQ21kVHJhY2VSYXlzTlYiLCAodm9pZCopQ21kVHJhY2VSYXlzTlZ9LAorICAgIHsidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCAodm9pZCopQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WfSwKKyAgICB7InZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIiwgKHZvaWQqKUdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVn0sCisgICAgeyJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIiwgKHZvaWQqKUdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WfSwKKyAgICB7InZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIiwgKHZvaWQqKUNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVn0sCisgICAgeyJ2a0NvbXBpbGVEZWZlcnJlZE5WIiwgKHZvaWQqKUNvbXBpbGVEZWZlcnJlZE5WfSwKKyAgICB7InZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIiwgKHZvaWQqKUdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVH0sCisgICAgeyJ2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EIiwgKHZvaWQqKUNtZFdyaXRlQnVmZmVyTWFya2VyQU1EfSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFR9LAorICAgIHsidmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCIsICh2b2lkKilHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVH0sCisgICAgeyJ2a0NtZERyYXdNZXNoVGFza3NOViIsICh2b2lkKilDbWREcmF3TWVzaFRhc2tzTlZ9LAorICAgIHsidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViIsICh2b2lkKilDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVn0sCisgICAgeyJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYiLCAodm9pZCopQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVn0sCisgICAgeyJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViIsICh2b2lkKilDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlZ9LAorICAgIHsidmtDbWRTZXRDaGVja3BvaW50TlYiLCAodm9pZCopQ21kU2V0Q2hlY2twb2ludE5WfSwKKyAgICB7InZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WIiwgKHZvaWQqKUdldFF1ZXVlQ2hlY2twb2ludERhdGFOVn0sCisgICAgeyJ2a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIiwgKHZvaWQqKUluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMfSwKKyAgICB7InZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIsICh2b2lkKilVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMfSwKKyAgICB7InZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCIsICh2b2lkKilDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMfSwKKyAgICB7InZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCIsICh2b2lkKilDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMfSwKKyAgICB7InZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMIiwgKHZvaWQqKUNtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTH0sCisgICAgeyJ2a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsICh2b2lkKilBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUx9LAorICAgIHsidmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiLCAodm9pZCopUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMfSwKKyAgICB7InZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsICh2b2lkKilRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMfSwKKyAgICB7InZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIsICh2b2lkKilHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMfSwKKyAgICB7InZrU2V0TG9jYWxEaW1taW5nQU1EIiwgKHZvaWQqKVNldExvY2FsRGltbWluZ0FNRH0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICB7InZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEiLCAodm9pZCopQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUF9LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgIHsidmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQiLCAodm9pZCopQ3JlYXRlTWV0YWxTdXJmYWNlRVhUfSwKKyNlbmRpZgorICAgIHsidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIiwgKHZvaWQqKUdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFR9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFR9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIiwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlZ9LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WfSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVH0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIsICh2b2lkKilBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFR9LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHsidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCAodm9pZCopUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUfSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIsICh2b2lkKilHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUfSwKKyNlbmRpZgorICAgIHsidmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQiLCAodm9pZCopQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUfSwKKyAgICB7InZrQ21kU2V0TGluZVN0aXBwbGVFWFQiLCAodm9pZCopQ21kU2V0TGluZVN0aXBwbGVFWFR9LAorICAgIHsidmtSZXNldFF1ZXJ5UG9vbEVYVCIsICh2b2lkKilSZXNldFF1ZXJ5UG9vbEVYVH0sCit9OworCisKK30gLy8gbmFtZXNwYWNlIHZrbW9jaworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9nZW5lcmF0ZWQvdmtfdHlwZW1hcF9oZWxwZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9nZW5lcmF0ZWQvdmtfdHlwZW1hcF9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGZiZWRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL2dlbmVyYXRlZC92a190eXBlbWFwX2hlbHBlci5oCkBAIC0wLDAgKzEsMzY4NiBAQAorLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKioKKy8vIFNlZSB2dWxrYW5fdG9vbHNfaGVscGVyX2ZpbGVfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5Z29AZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZm9yYmVzQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IEpvaG4gWnVsYXVmPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCisvLyBUaGVzZSBlbXB0eSBnZW5lcmljIHRlbXBsYXRlcyBhcmUgc3BlY2lhbGl6ZWQgZm9yIGVhY2ggdHlwZSB3aXRoIHNUeXBlCisvLyBtZW1iZXJzIGFuZCBmb3IgZWFjaCBzVHlwZSAtLSBwcm92aWRpbmcgYSB0d28gd2F5IG1hcCBiZXR3ZWVuIHN0cnVjdHVyZQorLy8gdHlwZXMgYW5kIHNUeXBlcworCit0ZW1wbGF0ZSA8VmtTdHJ1Y3R1cmVUeXBlIGlkPiBzdHJ1Y3QgTHZsU1R5cGVNYXAge307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEx2bFR5cGVNYXAge307CisKKy8vIE1hcCB0eXBlIFZrQXBwbGljYXRpb25JbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQXBwbGljYXRpb25JbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQXBwbGljYXRpb25JbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0luc3RhbmNlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbnN0YW5jZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0luc3RhbmNlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtEZXZpY2VDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1Ym1pdEluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3VibWl0SW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrU3VibWl0SW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtNZW1vcnlBbGxvY2F0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5QWxsb2NhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtNZW1vcnlBbGxvY2F0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrTWFwcGVkTWVtb3J5UmFuZ2UgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTUFQUEVEX01FTU9SWV9SQU5HRQordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNYXBwZWRNZW1vcnlSYW5nZT4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUFQUEVEX01FTU9SWV9SQU5HRTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFPiB7CisgICAgdHlwZWRlZiBWa01hcHBlZE1lbW9yeVJhbmdlIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0JpbmRTcGFyc2VJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZFNwYXJzZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQklORF9TUEFSU0VfSU5GTz4geworICAgIHR5cGVkZWYgVmtCaW5kU3BhcnNlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtGZW5jZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRmVuY2VDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtGZW5jZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2VtYXBob3JlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0V2ZW50Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFdmVudENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0V2ZW50Q3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUXVlcnlQb29sQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQnVmZmVyQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQnVmZmVyQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtCdWZmZXJDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9WSUVXX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0J1ZmZlclZpZXdDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtJbWFnZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtJbWFnZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlVmlld0NyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ0FDSEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ0FDSEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX1NUQVRFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfREVQVEhfU1RFTkNJTF9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NUFVURV9QSVBFTElORV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT01QVVRFX1BJUEVMSU5FX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NhbXBsZXJDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2FtcGxlckNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtTYW1wbGVyQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtXcml0ZURlc2NyaXB0b3JTZXQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrV3JpdGVEZXNjcmlwdG9yU2V0PiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVD4geworICAgIHR5cGVkZWYgVmtXcml0ZURlc2NyaXB0b3JTZXQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQ29weURlc2NyaXB0b3JTZXQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQ09QWV9ERVNDUklQVE9SX1NFVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDb3B5RGVzY3JpcHRvclNldD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09QWV9ERVNDUklQVE9SX1NFVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT1BZX0RFU0NSSVBUT1JfU0VUPiB7CisgICAgdHlwZWRlZiBWa0NvcHlEZXNjcmlwdG9yU2V0IFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtSZW5kZXJQYXNzQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDb21tYW5kUG9vbENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTz4geworICAgIHR5cGVkZWYgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeUJhcnJpZXIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5QmFycmllcj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVI+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5QmFycmllciBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtCdWZmZXJNZW1vcnlCYXJyaWVyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX0JBUlJJRVI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9CQVJSSUVSPiB7CisgICAgdHlwZWRlZiBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlTWVtb3J5QmFycmllcj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1JlbmRlclBhc3NCZWdpbkluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtSZW5kZXJQYXNzQmVnaW5JbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfUFJPUEVSVElFUwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1BST1BFUlRJRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1BST1BFUlRJRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQmluZEJ1ZmZlck1lbW9yeUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZEJ1ZmZlck1lbW9yeUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0JpbmRJbWFnZU1lbW9yeUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtCaW5kSW1hZ2VNZW1vcnlJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQmluZEltYWdlTWVtb3J5SW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfUkVRVUlSRU1FTlRTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFM+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX0FMTE9DQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX0FMTE9DQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfRkxBR1NfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9SRU5ERVJfUEFTU19CRUdJTl9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdyb3VwU3VibWl0SW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TVUJNSVRfSU5GTz4geworICAgIHR5cGVkZWYgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTz4geworICAgIHR5cGVkZWYgVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfREVWSUNFX0dST1VQX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfREVWSUNFX0dST1VQX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTz4geworICAgIHR5cGVkZWYgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0dST1VQX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzI+IHsKKyAgICB0eXBlZGVmIFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMj4geworICAgIHR5cGVkZWYgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1BBUlNFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TUEFSU0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzI+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtNZW1vcnlSZXF1aXJlbWVudHMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlSZXF1aXJlbWVudHMyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeVJlcXVpcmVtZW50czIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU18yOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzI+IHsKKyAgICB0eXBlZGVmIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRm9ybWF0UHJvcGVydGllczIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtGb3JtYXRQcm9wZXJ0aWVzMj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yPiB7CisgICAgdHlwZWRlZiBWa0Zvcm1hdFByb3BlcnRpZXMyIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzI+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1F1ZXVlRmFtaWx5UHJvcGVydGllczI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9QUk9QRVJUSUVTXzI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUVVFVUVfRkFNSUxZX1BST1BFUlRJRVNfMj4geworICAgIHR5cGVkZWYgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yPiB7CisgICAgdHlwZWRlZiBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1BBUlNFX0lNQUdFX0ZPUk1BVF9JTkZPXzI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19JTlBVVF9BVFRBQ0hNRU5UX0FTUEVDVF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfVVNBR0VfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfVVNBR0VfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX0ZFQVRVUkVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFUz4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BST1BFUlRJRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUz4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9QUk9QRVJUSUVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfUFJPUEVSVElFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VRdWV1ZUluZm8yIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9JTkZPXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlUXVldWVJbmZvMj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfSU5GT18yPiB7CisgICAgdHlwZWRlZiBWa0RldmljZVF1ZXVlSW5mbzIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUHJvdGVjdGVkU3VibWl0SW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QUk9URUNURURfU1VCTUlUX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUHJvdGVjdGVkU3VibWl0SW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJPVEVDVEVEX1NVQk1JVF9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTz4geworICAgIHR5cGVkZWYgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfUExBTkVfTUVNT1JZX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfUExBTkVfTUVNT1JZX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfUExBTkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTz4geworICAgIHR5cGVkZWYgVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRkVBVFVSRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU1BR0VfRk9STUFUX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTUFHRV9GT1JNQVRfUFJPUEVSVElFUz4geworICAgIHR5cGVkZWYgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfSU1BR0VfRk9STUFUX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfSU1BR0VfRk9STUFUX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0JVRkZFUl9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUz4geworICAgIHR5cGVkZWYgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JRF9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JRF9QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZFTkNFX1BST1BFUlRJRVM+IHsKKyAgICB0eXBlZGVmIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9TRU1BUEhPUkVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVM+IHsKKyAgICB0eXBlZGVmIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlQ+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRFJBV19QQVJBTUVURVJTX0ZFQVRVUkVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQcmVzZW50SW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1ByZXNlbnRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUHJlc2VudEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfU1dBUENIQUlOX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX1NXQVBDSEFJTl9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9TV0FQQ0hBSU5fSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX05FWFRfSU1BR0VfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfTkVYVF9JTUFHRV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX05FWFRfSU1BR0VfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0NBUEFCSUxJVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0NBUEFCSUxJVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUkVTRU5UX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUkVTRU5UX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJFU0VOVF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKy8vIE1hcCB0eXBlIFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9YTElCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKy8vIE1hcCB0eXBlIFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9YQ0JfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKy8vIE1hcCB0eXBlIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1dBWUxBTkRfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XQVlMQU5EX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1dBWUxBTkRfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBNYXAgdHlwZSBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9XSU4zMl9IQU5ETEVfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfV0lOMzJfSEFORExFX1BST1BFUlRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9XSU4zMl9IQU5ETEVfUFJPUEVSVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9GRF9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbXBvcnRNZW1vcnlGZEluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9GRF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9GRF9QUk9QRVJUSUVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlGZFByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9GRF9QUk9QRVJUSUVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfRkRfUFJPUEVSVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeUdldEZkSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0ZEX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa01lbW9yeUdldEZkSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9GRF9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0ZEX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeUdldEZkSW5mb0tIUiBUeXBlOworfTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9TRU1BUEhPUkVfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRDNEMTJfRkVOQ0VfU1VCTUlUX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9EM0QxMl9GRU5DRV9TVUJNSVRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRDNEMTJfRkVOQ0VfU1VCTUlUX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9TRU1BUEhPUkVfRkRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfRkRfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfR0VUX0ZEX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfRkRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QVVNIX0RFU0NSSVBUT1JfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QVVNIX0RFU0NSSVBUT1JfUFJPUEVSVElFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BVU0hfREVTQ1JJUFRPUl9QUk9QRVJUSUVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUHJlc2VudFJlZ2lvbnNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9SRUdJT05TX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQcmVzZW50UmVnaW9uc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9SRUdJT05TX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1JFR0lPTlNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1ByZXNlbnRSZWdpb25zS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfSU1BR0VfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVFNfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVFNfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0FUVEFDSE1FTlRfQkVHSU5fSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0FUVEFDSE1FTlRfQkVHSU5fSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQVRUQUNITUVOVF9CRUdJTl9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl8yX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl8yX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fMl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVBFTkRFTkNZXzJfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1N1YnBhc3NEZXBlbmRlbmN5MktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVBFTkRFTkNZXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUj4geworICAgIHR5cGVkZWYgVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPXzJfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk9fMl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk9fMl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1YnBhc3NCZWdpbkluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19CRUdJTl9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdWJwYXNzQmVnaW5JbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0JFR0lOX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VicGFzc0JlZ2luSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTdWJwYXNzRW5kSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0VORF9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdWJwYXNzRW5kSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VicGFzc0VuZEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFSRURfUFJFU0VOVF9TVVJGQUNFX0NBUEFCSUxJVElFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9GRF9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbXBvcnRGZW5jZUZkSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9GRF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtGZW5jZUdldEZkSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRmVuY2VHZXRGZEluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9GRF9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRmVuY2VHZXRGZEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX1BST1BFUlRJRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9QUk9QRVJUSUVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfUFJPUEVSVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUj4geworICAgIHR5cGVkZWYgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSPiB7CisgICAgdHlwZWRlZiBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfUFJPRklMSU5HX0xPQ0tfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9TVUJNSVRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVUkZBQ0VfSU5GT18yX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU3VyZmFjZUZvcm1hdDJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GT1JNQVRfMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3VyZmFjZUZvcm1hdDJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRk9STUFUXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRk9STUFUXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa1N1cmZhY2VGb3JtYXQyS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BST1BFUlRJRVNfMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGlzcGxheVByb3BlcnRpZXMyS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BST1BFUlRJRVNfMl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUk9QRVJUSUVTXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfUFJPUEVSVElFU18yX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUj4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfSU5GT18yX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEaXNwbGF5UGxhbmVJbmZvMktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9JTkZPXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfSU5GT18yX0tIUj4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfTElTVF9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzhCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQVRPTUlDX0lOVDY0X0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQVRPTUlDX0lOVDY0X0ZFQVRVUkVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0FUT01JQ19JTlQ2NF9GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NMT0NLX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9EUklWRVJfUFJPUEVSVElFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkxPQVRfQ09OVFJPTFNfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUX0NPTlRST0xTX1BST1BFUlRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GTE9BVF9DT05UUk9MU19QUk9QRVJUSUVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fREVQVEhfU1RFTkNJTF9SRVNPTFZFX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9QUk9QRVJUSUVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfU1RFTkNJTF9SRVNPTFZFX1BST1BFUlRJRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfRkVBVFVSRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9GRUFUVVJFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9QUk9QRVJUSUVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfVFlQRV9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfVFlQRV9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9USU1FTElORV9TRU1BUEhPUkVfU1VCTUlUX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9XQUlUX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1NlbWFwaG9yZVdhaXRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfV0FJVF9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfV0FJVF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9TSUdOQUxfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1NJR05BTF9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfU0lHTkFMX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfU1RFTkNJTF9MQVlPVVRfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV9TVEVOQ0lMX0xBWU9VVF9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfU1RFTkNJTF9MQVlPVVRfS0hSPiB7CisgICAgdHlwZWRlZiBWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFI+IHsKKyAgICB0eXBlZGVmIFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0NSRUFURV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQUxMT0NBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0FMTE9DQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0FMTE9DQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19GRUFUVVJFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9SQVNURVJJWkFUSU9OX09SREVSX0FNRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9SQVNURVJJWkFUSU9OX09SREVSX0FNRDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1JBU1RFUklaQVRJT05fT1JERVJfQU1EPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9OQU1FX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfTkFNRV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX05BTUVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9UQUdfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX1RBR19JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX1RBR19JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9NQVJLRVJfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfTUFSS0VSX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9NQVJLRVJfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0NSRUFURV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0NSRUFURV9JTkZPX05WPiB7CisgICAgdHlwZWRlZiBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JVRkZFUl9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9CVUZGRVJfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fQlVGRkVSX0NSRUFURV9JTkZPX05WPiB7CisgICAgdHlwZWRlZiBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX01FTU9SWV9BTExPQ0FURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX0ZFQVRVUkVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfU1RSRUFNX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfU1RSRUFNX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1NUUkVBTV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlggdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19IQU5ETEVfSU5GT19OVlgKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19IQU5ETEVfSU5GT19OVlg7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19IQU5ETEVfSU5GT19OVlg+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9URVhUVVJFX0xPRF9HQVRIRVJfRk9STUFUX1BST1BFUlRJRVNfQU1ECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9URVhUVVJFX0xPRF9HQVRIRVJfRk9STUFUX1BST1BFUlRJRVNfQU1EOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1RFWFRVUkVfTE9EX0dBVEhFUl9GT1JNQVRfUFJPUEVSVElFU19BTUQ+IHsKKyAgICB0eXBlZGVmIFZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisvLyBNYXAgdHlwZSBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVFJFQU1fREVTQ1JJUFRPUl9TVVJGQUNFX0NSRUFURV9JTkZPX0dHUAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1A+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfQ1JFQVRFX0lORk9fR0dQOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfQ1JFQVRFX0lORk9fR0dQPiB7CisgICAgdHlwZWRlZiBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1JORVJfU0FNUExFRF9JTUFHRV9GRUFUVVJFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1JORVJfU0FNUExFRF9JTUFHRV9GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09STkVSX1NBTVBMRURfSU1BR0VfRkVBVFVSRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrVmFsaWRhdGlvbkZsYWdzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkxBR1NfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1ZhbGlkYXRpb25GbGFnc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GTEFHU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GTEFHU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrVmFsaWRhdGlvbkZsYWdzRVhUIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisvLyBNYXAgdHlwZSBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9WSV9TVVJGQUNFX0NSRUFURV9JTkZPX05OCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfVklfU1VSRkFDRV9DUkVBVEVfSU5GT19OTjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9WSV9TVVJGQUNFX0NSRUFURV9JTkZPX05OPiB7CisgICAgdHlwZWRlZiBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19BU1RDX0RFQ09ERV9NT0RFX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19BU1RDX0RFQ09ERV9NT0RFX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0FTVENfREVDT0RFX01PREVfRVhUPiB7CisgICAgdHlwZWRlZiBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0FTVENfREVDT0RFX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CRUdJTl9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRkVBVFVSRVNfTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRkVBVFVSRVNfTlZYOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRkVBVFVSRVNfTlZYPiB7CisgICAgdHlwZWRlZiBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0xJTUlUU19OVlg7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYPiB7CisgICAgdHlwZWRlZiBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlgKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlg+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlg7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX0NSRUFURV9JTkZPX05WWD4geworICAgIHR5cGVkZWYgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlg+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYPiB7CisgICAgdHlwZWRlZiBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlg+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DTURfUkVTRVJWRV9TUEFDRV9GT1JfQ09NTUFORFNfSU5GT19OVlg+IHsKKyAgICB0eXBlZGVmIFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9PQkpFQ1RfVEFCTEVfQ1JFQVRFX0lORk9fTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfT0JKRUNUX1RBQkxFX0NSRUFURV9JTkZPX05WWDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9PQkpFQ1RfVEFCTEVfQ1JFQVRFX0lORk9fTlZYPiB7CisgICAgdHlwZWRlZiBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1dfU0NBTElOR19TVEFURV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhUPiB7CisgICAgdHlwZWRlZiBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlQb3dlckluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QT1dFUl9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEaXNwbGF5UG93ZXJJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BPV0VSX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUE9XRVJfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGlzcGxheVBvd2VySW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VFdmVudEluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUV2ZW50SW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9FVkVOVF9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEZXZpY2VFdmVudEluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGlzcGxheUV2ZW50SW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX0VWRU5UX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0Rpc3BsYXlFdmVudEluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfRVZFTlRfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9FVkVOVF9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5RXZlbnRJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DT1VOVEVSX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NPVU5URVJfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DT1VOVEVSX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEUKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRT4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9USU1FU19JTkZPX0dPT0dMRTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1RJTUVTX0lORk9fR09PR0xFPiB7CisgICAgdHlwZWRlZiBWa1ByZXNlbnRUaW1lc0luZm9HT09HTEUgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BFUl9WSUVXX0FUVFJJQlVURVNfUFJPUEVSVElFU19OVlg7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1dJWlpMRV9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TV0laWkxFX1NUQVRFX0NSRUFURV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NXSVpaTEVfU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ESVNDQVJEX1JFQ1RBTkdMRV9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRElTQ0FSRF9SRUNUQU5HTEVfUFJPUEVSVElFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RJU0NBUkRfUkVDVEFOR0xFX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RJU0NBUkRfUkVDVEFOR0xFX1NUQVRFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RJU0NBUkRfUkVDVEFOR0xFX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9ESVNDQVJEX1JFQ1RBTkdMRV9TVEFURV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fQ09OU0VSVkFUSVZFX1NUQVRFX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfQ0xJUF9FTkFCTEVfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9DTElQX0VOQUJMRV9GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX0NMSVBfRU5BQkxFX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0RFUFRIX0NMSVBfU1RBVEVfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9ERVBUSF9DTElQX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0RFUFRIX0NMSVBfU1RBVEVfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtIZHJNZXRhZGF0YUVYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9IRFJfTUVUQURBVEFfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0hkck1ldGFkYXRhRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9IRFJfTUVUQURBVEFfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0hEUl9NRVRBREFUQV9FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSGRyTWV0YWRhdGFFWFQgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworLy8gTWFwIHR5cGUgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVksKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVks+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVks+IHsKKyAgICB0eXBlZGVmIFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKy8vIE1hcCB0eXBlIFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSz4geworICAgIHR5cGVkZWYgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworLy8gTWFwIHR5cGUgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX05BTUVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfVEFHX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RlYnVnVXRpbHNMYWJlbEVYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVidWdVdGlsc0xhYmVsRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTEFCRUxfRVhUPiB7CisgICAgdHlwZWRlZiBWa0RlYnVnVXRpbHNMYWJlbEVYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DQUxMQkFDS19EQVRBX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NBTExCQUNLX0RBVEFfRVhUPiB7CisgICAgdHlwZWRlZiBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBNYXAgdHlwZSBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9VU0FHRV9BTkRST0lECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfVVNBR0VfQU5EUk9JRDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9VU0FHRV9BTkRST0lEPiB7CisgICAgdHlwZWRlZiBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorLy8gTWFwIHR5cGUgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1BST1BFUlRJRVNfQU5EUk9JRDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQ+IHsKKyAgICB0eXBlZGVmIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKy8vIE1hcCB0eXBlIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRk9STUFUX1BST1BFUlRJRVNfQU5EUk9JRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRk9STUFUX1BST1BFUlRJRVNfQU5EUk9JRDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9GT1JNQVRfUFJPUEVSVElFU19BTkRST0lEPiB7CisgICAgdHlwZWRlZiBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBNYXAgdHlwZSBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRD4geworICAgIHR5cGVkZWYgVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorLy8gTWFwIHR5cGUgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQ+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKy8vIE1hcCB0eXBlIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZPUk1BVF9BTkRST0lECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4dGVybmFsRm9ybWF0QU5EUk9JRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQ+IHsKKyAgICB0eXBlZGVmIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBNYXAgdHlwZSBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1JFRFVDVElPTl9NT0RFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX0ZJTFRFUl9NSU5NQVhfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfRklMVEVSX01JTk1BWF9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9GSUxURVJfTUlOTUFYX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfUFJPUEVSVElFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVD4geworICAgIHR5cGVkZWYgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9JTkxJTkVfVU5JRk9STV9CTE9DS19DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9JTkxJTkVfVU5JRk9STV9CTE9DS19DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX1NBTVBMRV9MT0NBVElPTlNfQkVHSU5fSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfU0FNUExFX0xPQ0FUSU9OU19CRUdJTl9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19TQU1QTEVfTE9DQVRJT05TX0JFR0lOX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0FNUExFX0xPQ0FUSU9OU19TVEFURV9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NBTVBMRV9MT0NBVElPTlNfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NBTVBMRV9MT0NBVElPTlNfU1RBVEVfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFX0xPQ0FUSU9OU19QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVfTE9DQVRJT05TX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVfTE9DQVRJT05TX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTVVMVElTQU1QTEVfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX0FEVkFOQ0VEX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfTU9EVUxBVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9NT0RVTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX01PRFVMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19QUk9QRVJUSUVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19QUk9QRVJUSUVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU01fQlVJTFRJTlNfUFJPUEVSVElFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU01fQlVJTFRJTlNfRkVBVFVSRVNfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0xJU1RfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19MSVNUX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfTElTVF9FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0xJU1RfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX1ZBTElEQVRJT05fQ0FDSEVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfVkFMSURBVElPTl9DQUNIRV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9CSU5ESU5HX0ZMQUdTX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9BTExPQ0FURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQUxMT0NBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9BTExPQ0FURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVD4geworICAgIHR5cGVkZWYgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU0hBRElOR19SQVRFX0lNQUdFX1NUQVRFX0NSRUFURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9JTUFHRV9TVEFURV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfSU1BR0VfU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfUFJPUEVSVElFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfUFJPUEVSVElFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfQ09BUlNFX1NBTVBMRV9PUkRFUl9TVEFURV9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0dlb21ldHJ5VHJpYW5nbGVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX1RSSUFOR0xFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9UUklBTkdMRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrR2VvbWV0cnlUcmlhbmdsZXNOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtHZW9tZXRyeUFBQkJOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0dlb21ldHJ5QUFCQk5WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX0FBQkJfTlY+IHsKKyAgICB0eXBlZGVmIFZrR2VvbWV0cnlBQUJCTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrR2VvbWV0cnlOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtHZW9tZXRyeU5WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OVj4geworICAgIHR5cGVkZWYgVmtHZW9tZXRyeU5WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9JTkZPX05WPiB7CisgICAgdHlwZWRlZiBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVj4geworICAgIHR5cGVkZWYgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SQVlfVFJBQ0lOR19QUk9QRVJUSUVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JBWV9UUkFDSU5HX1BST1BFUlRJRVNfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JBWV9UUkFDSU5HX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX0ZFQVRVUkVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfU1RBVEVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9TVEFURV9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfVklFV19JTUFHRV9GT1JNQVRfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0ZJTFRFUl9DVUJJQ19JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRklMVEVSX0NVQklDX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0ZJTFRFUl9DVUJJQ19JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0dMT0JBTF9QUklPUklUWV9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0dMT0JBTF9QUklPUklUWV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfSE9TVF9QT0lOVEVSX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9IT1NUX1BPSU5URVJfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9IT1NUX1BPSU5URVJfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfSE9TVF9QT0lOVEVSX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0hPU1RfUE9JTlRFUl9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfSE9TVF9QT0lOVEVSX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX01FTU9SWV9IT1NUX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX01FTU9SWV9IT1NUX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9NRU1PUllfSE9TVF9QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTVBJTEVSX0NPTlRST0xfQ1JFQVRFX0lORk9fQU1ECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NBTElCUkFURURfVElNRVNUQU1QX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DQUxJQlJBVEVEX1RJTUVTVEFNUF9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DQUxJQlJBVEVEX1RJTUVTVEFNUF9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0FNRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NPUkVfUFJPUEVSVElFU19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfQU1EPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQ1JFQVRFX0lORk9fQU1ECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQ+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfRElWSVNPUl9TVEFURV9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9ESVZJU09SX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfRElWSVNPUl9TVEFURV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorLy8gTWFwIHR5cGUgVmtQcmVzZW50RnJhbWVUb2tlbkdHUCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0ZSQU1FX1RPS0VOX0dHUAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQcmVzZW50RnJhbWVUb2tlbkdHUD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9GUkFNRV9UT0tFTl9HR1A7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9GUkFNRV9UT0tFTl9HR1A+IHsKKyAgICB0eXBlZGVmIFZrUHJlc2VudEZyYW1lVG9rZW5HR1AgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX0ZFQVRVUkVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfUFJPUEVSVElFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9QUk9QRVJUSUVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9QUk9QRVJUSUVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9CQVJZQ0VOVFJJQ19GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0ZFQVRVUkVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWENMVVNJVkVfU0NJU1NPUl9GRUFUVVJFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhDTFVTSVZFX1NDSVNTT1JfRkVBVFVSRVNfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYQ0xVU0lWRV9TQ0lTU09SX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9DSEVDS1BPSU5UX1BST1BFUlRJRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfQ0hFQ0tQT0lOVF9QUk9QRVJUSUVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9DSEVDS1BPSU5UX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0NoZWNrcG9pbnREYXRhTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQ0hFQ0tQT0lOVF9EQVRBX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0NoZWNrcG9pbnREYXRhTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NIRUNLUE9JTlRfREFUQV9OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DSEVDS1BPSU5UX0RBVEFfTlY+IHsKKyAgICB0eXBlZGVmIFZrQ2hlY2twb2ludERhdGFOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRkVBVFVSRVNfSU5URUwKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUw+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU5URUdFUl9GVU5DVElPTlNfMl9GRUFUVVJFU19JTlRFTDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRkVBVFVSRVNfSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUwKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTklUSUFMSVpFX1BFUkZPUk1BTkNFX0FQSV9JTkZPX0lOVEVMOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GT19JTlRFTDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMPiB7CisgICAgdHlwZWRlZiBWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9NQVJLRVJfSU5GT19JTlRFTAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfTUFSS0VSX0lORk9fSU5URUw7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfTUFSS0VSX0lORk9fSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfU1RSRUFNX01BUktFUl9JTkZPX0lOVEVMCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9TVFJFQU1fTUFSS0VSX0lORk9fSU5URUw7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfU1RSRUFNX01BUktFUl9JTkZPX0lOVEVMPiB7CisgICAgdHlwZWRlZiBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfT1ZFUlJJREVfSU5GT19JTlRFTAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9PVkVSUklERV9JTkZPX0lOVEVMOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX09WRVJSSURFX0lORk9fSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUw+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMPiB7CisgICAgdHlwZWRlZiBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUENJX0JVU19JTkZPX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QQ0lfQlVTX0lORk9fUFJPUEVSVElFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BDSV9CVVNfSU5GT19QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTkFUSVZFX0hEUl9TVVJGQUNFX0NBUEFCSUxJVElFU19BTUQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTkFUSVZFX0hEUl9TVVJGQUNFX0NBUEFCSUxJVElFU19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9OQVRJVkVfSERSX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0FNRD4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fRElTUExBWV9OQVRJVkVfSERSX0NSRUFURV9JTkZPX0FNRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQ+IHsKKyAgICB0eXBlZGVmIFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorLy8gTWFwIHR5cGUgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQQordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUE+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFUElQRV9TVVJGQUNFX0NSRUFURV9JTkZPX0ZVQ0hTSUE7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQT4geworICAgIHR5cGVkZWYgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKy8vIE1hcCB0eXBlIFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9SRVFVSVJFRF9TVUJHUk9VUF9TSVpFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfUkVRVUlSRURfU1VCR1JPVVBfU0laRV9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX1JFUVVJUkVEX1NVQkdST1VQX1NJWkVfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfMl9BTUQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0ZFQVRVUkVTX0FNRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1EOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1EPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9CVURHRVRfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJJT1JJVFlfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9QUklPUklUWV9BTExPQ0FURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1BSSU9SSVRZX0FMTE9DQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9QUklPUklUWV9BTExPQ0FURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UT09MX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UT09MX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UT09MX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NURU5DSUxfVVNBR0VfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9GRUFUVVJFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9QUk9QRVJUSUVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0ZFQVRVUkVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0ZFQVRVUkVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1JFRFVDVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1JFRFVDVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9SRURVQ1RJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfTUlYRURfU0FNUExFU19DT01CSU5BVElPTl9OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WPiB7CisgICAgdHlwZWRlZiBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfSU5URVJMT0NLX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1lDQkNSX0lNQUdFX0FSUkFZU19GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9FWFQ+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9XSU4zMl9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSEVBRExFU1NfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSEVBRExFU1NfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSEVBRExFU1NfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9MSU5FX1NUQVRFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0xJTkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fTElORV9TVEFURV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9IT1NUX1FVRVJZX1JFU0VUX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkRFWF9UWVBFX1VJTlQ4X0ZFQVRVUkVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkRFWF9UWVBFX1VJTlQ4X0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5ERVhfVFlQRV9VSU5UOF9GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RFTU9URV9UT19IRUxQRVJfSU5WT0NBVElPTl9GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUIFR5cGU7Cit9OworCisvLyBIZWFkZXIgImJhc2UgY2xhc3MiIGZvciBwTmV4dCBjaGFpbiB0cmF2ZXJzYWwKK3N0cnVjdCBMdmxHZW5lcmljSGVhZGVyIHsKKyAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgIGNvbnN0IEx2bEdlbmVyaWNIZWFkZXIgKnBOZXh0OworfTsKKworLy8gRmluZCBhbiBlbnRyeSBvZiB0aGUgZ2l2ZW4gdHlwZSBpbiB0aGUgcE5leHQgY2hhaW4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjb25zdCBUICpsdmxfZmluZF9pbl9jaGFpbihjb25zdCB2b2lkICpuZXh0KSB7CisgICAgY29uc3QgTHZsR2VuZXJpY0hlYWRlciAqY3VycmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTHZsR2VuZXJpY0hlYWRlciAqPihuZXh0KTsKKyAgICBjb25zdCBUICpmb3VuZCA9IG51bGxwdHI7CisgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAgICAgaWYgKEx2bFR5cGVNYXA8VD46OmtTVHlwZSA9PSBjdXJyZW50LT5zVHlwZSkgeworICAgICAgICAgICAgZm91bmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihjdXJyZW50KTsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBOZXh0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmb3VuZDsKK30KKworLy8gSW5pdCB0aGUgaGVhZGVyIG9mIGFuIHNUeXBlIHN0cnVjdCB3aXRoIHBOZXh0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBsdmxfaW5pdF9zdHJ1Y3Qodm9pZCAqcF9uZXh0KSB7CisgICAgVCBvdXQgPSB7fTsKKyAgICBvdXQuc1R5cGUgPSBMdmxUeXBlTWFwPFQ+OjprU1R5cGU7CisgICAgb3V0LnBOZXh0ID0gcF9uZXh0OworICAgIHJldHVybiBvdXQ7Cit9CisKKy8vIEluaXQgdGhlIGhlYWRlciBvZiBhbiBzVHlwZSBzdHJ1Y3QKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGx2bF9pbml0X3N0cnVjdCgpIHsKKyAgICBUIG91dCA9IHt9OworICAgIG91dC5zVHlwZSA9IEx2bFR5cGVNYXA8VD46OmtTVHlwZTsKKyAgICByZXR1cm4gb3V0OworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvbGludXgvVmtJQ0RfbW9ja19pY2QuanNvbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9saW51eC9Wa0lDRF9tb2NrX2ljZC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvbGludXgvVmtJQ0RfbW9ja19pY2QuanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMC4xIiwKKyAgICAiSUNEIjogeworICAgICAgICAibGlicmFyeV9wYXRoIjogIi4vbGliVmtJQ0RfbW9ja19pY2Quc28iLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4xLjk3IgorICAgIH0KK30KKworCisKKworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvbWFjb3MvVmtJQ0RfbW9ja19pY2QuanNvbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL2ljZC9tYWNvcy9Wa0lDRF9tb2NrX2ljZC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDE5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2QvbWFjb3MvVmtJQ0RfbW9ja19pY2QuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4wLjEiLAorICAgICJJQ0QiOiB7CisgICAgICAgICJsaWJyYXJ5X3BhdGgiOiAiLi9saWJWa0lDRF9tb2NrX2ljZC5keWxpYiIsCisgICAgICAgICJhcGlfdmVyc2lvbiI6ICIxLjEuOTciCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9pY2Qvd2luZG93cy9Wa0lDRF9tb2NrX2ljZC5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL3dpbmRvd3MvVmtJQ0RfbW9ja19pY2QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTkyZjVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvaWNkL3dpbmRvd3MvVmtJQ0RfbW9ja19pY2QuanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMC4xIiwKKyAgICAiSUNEIjogeworICAgICAgICAibGlicmFyeV9wYXRoIjogIi5cXFZrSUNEX21vY2tfaWNkLmRsbCIsCisgICAgICAgICJhcGlfdmVyc2lvbiI6ICIxLjEuOTciCisgICAgfQorfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL21hY19jb21tb24uY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9tYWNfY29tbW9uLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDNjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9tYWNfY29tbW9uLmNtYWtlCkBAIC0wLDAgKzEsNTYgQEAKKyMgfn5+CisjIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIH5+fgorCisjIFNldCB1cCBjb21tb24gc2V0dGluZ3MgZm9yIGJ1aWxkaW5nIGFsbCBkZW1vcyBvbiBBcHBsZSBwbGF0Zm9ybXMuCisKKyMgU291cmNlIGZvciB0aGUgTW9sdGVuVksgSUNEIGxpYnJhcnkgYW5kIEpTT04gZmlsZQorc2V0KE1PTFRFTlZLX0RJUiAke01PTFRFTlZLX1JFUE9fUk9PVH0pCisKKyMgTW9sdGVuVksgSlNPTiBGaWxlCisKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EIG1rZGlyIC1wICR7Q01BS0VfQklOQVJZX0RJUn0vc3RhZ2luZy1qc29uKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgc2VkIC1lICIvXCJsaWJyYXJ5X3BhdGhcIjovcyQ6W1s6c3BhY2U6XV0qXCJbWzpzcGFjZTpdXSpbXFwuXFwvXSokOiBcIi4uXFwvLi5cXC8uLlxcL0ZyYW1ld29ya3NcXC8kIgorICAgICAgICAgICAgICAgICAgICAgICAgJHtNT0xURU5WS19ESVJ9L01vbHRlblZLL2ljZC9Nb2x0ZW5WS19pY2QuanNvbgorICAgICAgICAgICAgICAgIE9VVFBVVF9GSUxFICR7Q01BS0VfQklOQVJZX0RJUn0vc3RhZ2luZy1qc29uL01vbHRlblZLX2ljZC5qc29uKQorCisjIH5+fgorIyBNb2RpZnkgdGhlIElDRCBKU09OIGZpbGUgdG8gYWRqdXN0IHRoZSBsaWJyYXJ5IHBhdGguCisjIFRoZSBJQ0QgSlNPTiBmaWxlIGdvZXMgaW4gdGhlIFJlc291cmNlcy92dWxrYW4vaWNkLmQgZGlyZWN0b3J5LCBzbyBhZGp1c3QgdGhlCisjIGxpYnJhcnlfcGF0aCB0byB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgRnJhbWV3b3JrcyBkaXJlY3RvcnkgaW4gdGhlIGJ1bmRsZS4KKyMgVGhlIHJlZ2V4IGRvZXM6IHN1YnN0aXR1dGUgJzo8d2hpdGVzcGFjZT4iPHdoaXRlc3BhY2U+PGFsbCBvY2N1cmVuY2VzIG9mIC4gYW5kIC8+JyB3aXRoOgorIyAnOiAiLi4vLi4vLi4vRnJhbWV3b3Jrcy8nCisjIH5+fgorYWRkX2N1c3RvbV90YXJnZXQoTW9sdGVuVktfaWNkLXN0YWdpbmctanNvbiBBTEwKKyAgICAgICAgICAgICAgICAgIENPTU1BTkQgbWtkaXIgLXAgJHtDTUFLRV9CSU5BUllfRElSfS9zdGFnaW5nLWpzb24KKyAgICAgICAgICAgICAgICAgIENPTU1BTkQgc2VkIC1lICIvXCJsaWJyYXJ5X3BhdGhcIjovcyQ6W1s6c3BhY2U6XV0qXCJbWzpzcGFjZTpdXSpbXFwuXFwvXSokOiBcIi4uXFwvLi5cXC8uLlxcL0ZyYW1ld29ya3NcXC8kIgorICAgICAgICAgICAgICAgICAgICAgICAgICAke01PTFRFTlZLX0RJUn0vTW9sdGVuVksvaWNkL01vbHRlblZLX2ljZC5qc29uID4gJHtDTUFLRV9CSU5BUllfRElSfS9zdGFnaW5nLWpzb24vTW9sdGVuVktfaWNkLmpzb24KKyAgICAgICAgICAgICAgICAgIFZFUkJBVElNCisgICAgICAgICAgICAgICAgICBERVBFTkRTICIke01PTFRFTlZLX0RJUn0vTW9sdGVuVksvaWNkL01vbHRlblZLX2ljZC5qc29uIikKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0NNQUtFX0JJTkFSWV9ESVJ9L3N0YWdpbmctanNvbi9Nb2x0ZW5WS19pY2QuanNvbiBQUk9QRVJUSUVTIEdFTkVSQVRFRCBUUlVFKQorCitmaW5kX2xpYnJhcnkoQ09DT0EgTkFNRVMgQ29jb2EpCisKKyMgTG9jYXRlIEludGVyZmFjZSBCdWlsZGVyIFRvb2wsIG5lZWRlZCB0byBidWlsZCB0aGluZ3MgbGlrZSBTdG9yeWJvYXJkcyBvdXRzaWRlIG9mIFhjb2RlLgoraWYoTk9UICR7Q01BS0VfR0VORVJBVE9SfSBNQVRDSEVTICJeWGNvZGUuKiIpCisgICAgIyBNYWtlIHN1cmUgd2UgY2FuIGZpbmQgdGhlICdpYnRvb2wnIHByb2dyYW0uIElmIHdlIGNhbiBOT1QgZmluZCBpdCB3ZSBza2lwIGdlbmVyYXRpb24gb2YgdGhpcyBwcm9qZWN0LgorICAgIGZpbmRfcHJvZ3JhbShJQlRPT0wgaWJ0b29sIEhJTlRTICIvdXNyL2JpbiIgIiR7T1NYX0RFVkVMT1BFUl9ST09UfS91c3IvYmluIikKKyAgICBpZigke0lCVE9PTH0gU1RSRVFVQUwgIklCVE9PTC1OT1RGT1VORCIpCisgICAgICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiaWJ0b29sIGNhbiBub3QgYmUgZm91bmQgYW5kIGlzIG5lZWRlZCB0byBjb21waWxlIHRoZSAueGliIGZpbGVzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXQgc2hvdWxkIGhhdmUgYmVlbiBpbnN0YWxsZWQgd2l0aCB0aGUgQXBwbGUgZGV2ZWxvcGVyIHRvb2xzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRlZmF1bHQgc3lzdGVtIHBhdGhzIHdlcmUgc2VhcmNoZWQgaW4gYWRkaXRpb24gdG8gJHtPU1hfREVWRUxPUEVSX1JPT1R9L3Vzci9iaW4uIikKKyAgICBlbmRpZigpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9zY3JpcHRzL2NoZWNrX2NvZGVfZm9ybWF0LnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9jaGVja19jb2RlX2Zvcm1hdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZGU0Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9jaGVja19jb2RlX2Zvcm1hdC5zaApAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKGMpIDIwMTcgR29vZ2xlIEluYy4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBTY3JpcHQgdG8gZGV0ZXJtaW5lIGlmIHNvdXJjZSBjb2RlIGluIFB1bGwgUmVxdWVzdCBpcyBwcm9wZXJseSBmb3JtYXR0ZWQuCisjIEV4aXRzIHdpdGggbm9uIDAgZXhpdCBjb2RlIGlmIGZvcm1hdHRpbmcgaXMgbmVlZGVkLgorIworIyBUaGlzIHNjcmlwdCBhc3N1bWVzIHRvIGJlIGludm9rZWQgYXQgdGhlIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuCisKK1JFRD0nXDAzM1swOzMxbScKK0dSRUVOPSdcMDMzWzA7MzJtJworTkM9J1wwMzNbMG0nICMgTm8gQ29sb3IKKworRklMRVNfVE9fQ0hFQ0s9JChnaXQgZGlmZiAtLW5hbWUtb25seSBtYXN0ZXIgfCBncmVwIC12IC1FICJeaW5jbHVkZS92dWxrYW4iIHwgZ3JlcCAtRSAiLipcLihjcHB8Y2N8Y1wrXCt8Y3h4fGN8aHxocHApJCIpCisKK2lmIFsgLXogIiR7RklMRVNfVE9fQ0hFQ0t9IiBdOyB0aGVuCisgIGVjaG8gLWUgIiR7R1JFRU59Tm8gc291cmNlIGNvZGUgdG8gY2hlY2sgZm9yIGZvcm1hdHRpbmcuJHtOQ30iCisgIGV4aXQgMAorZmkKKworRk9STUFUX0RJRkY9JChnaXQgZGlmZiAtVTAgbWFzdGVyIC0tICR7RklMRVNfVE9fQ0hFQ0t9IHwgcHl0aG9uIC4vc2NyaXB0cy9jbGFuZy1mb3JtYXQtZGlmZi5weSAtcDEgLXN0eWxlPWZpbGUpCisKK2lmIFsgLXogIiR7Rk9STUFUX0RJRkZ9IiBdOyB0aGVuCisgIGVjaG8gLWUgIiR7R1JFRU59QWxsIHNvdXJjZSBjb2RlIGluIFBSIHByb3Blcmx5IGZvcm1hdHRlZC4ke05DfSIKKyAgZXhpdCAwCitlbHNlCisgIGVjaG8gLWUgIiR7UkVEfUZvdW5kIGZvcm1hdHRpbmcgZXJyb3JzISR7TkN9IgorICBlY2hvICIke0ZPUk1BVF9ESUZGfSIKKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9jaGVja19jb21taXRfbWVzc2FnZV9mb3JtYXQuc2ggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9zY3JpcHRzL2NoZWNrX2NvbW1pdF9tZXNzYWdlX2Zvcm1hdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTY2NjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9jaGVja19jb21taXRfbWVzc2FnZV9mb3JtYXQuc2gKQEAgLTAsMCArMSwxMDIgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVuYXJHLCBJbmMuCisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQ2hlY2tzIGNvbW1pdCBtZXNzYWdlcyBhZ2FpbnN0IHByb2plY3Qgc3RhbmRhcmRzIGluIENPTlRSSUJVVElORy5tZCBkb2N1bWVudAorIyBTY3JpcHQgdG8gZGV0ZXJtaW5lIGlmIGNvbW1pdCBtZXNzYWdlcyBpbiBQdWxsIFJlcXVlc3QgYXJlIHByb3Blcmx5IGZvcm1hdHRlZC4KKyMgRXhpdHMgd2l0aCBub24gMCBleGl0IGNvZGUgaWYgcmVmb3JtYXR0aW5nIGlzIG5lZWRlZC4KKworIyBEaXNhYmxlIHN1YnNoZWxscworc2hvcHQgLXMgbGFzdHBpcGUKKworUkVEPSdcMDMzWzA7MzFtJworR1JFRU49J1wwMzNbMDszMm0nCitOQz0nXDAzM1swbScgIyBObyBDb2xvcgorCisjIFRSQVZJU19DT01NSVRfUkFOR0UgY29udGFpbnMgcmFuZ2Ugb2YgY29tbWl0cyBmb3IgdGhpcyBQUgorCisjIEdldCB1c2VyLXN1cHBsaWVkIGNvbW1pdCBtZXNzYWdlIHRleHQgZm9yIGFwcGxpY2FibGUgY29tbWl0cyBhbmQgaW5zZXJ0CisjIGEgdW5pcXVlIHNlcGFyYXRvciBzdHJpbmcgaWRlbnRpZmllci4gVGhlIGdpdCBjb21tYW5kIHJldHVybnMgT05MWSB0aGUKKyMgc3ViamVjdCBsaW5lIGFuZCBib2R5IGZvciBlYWNoIG9mIHRoZSBjb21taXRzLgorQ09NTUlUX1RFWFQ9JChnaXQgbG9nICR7VFJBVklTX0NPTU1JVF9SQU5HRX0gLS1wcmV0dHk9Zm9ybWF0OiJYWFhORVdMSU5FWFhYIiVuJUIpCisKKyMgQmFpbCBpZiB0aGVyZSBhcmUgbm9uZQoraWYgWyAteiAiJHtDT01NSVRfVEVYVH0iIF07IHRoZW4KKyAgZWNobyAtZSAiJHtHUkVFTn1ObyBjb21taXQgbWVzc2dhZ2VzIHRvIGNoZWNrIGZvciBmb3JtYXR0aW5nLiR7TkN9IgorICBleGl0IDAKK2VsaWYgISBlY2hvICRUUkFWSVNfQ09NTUlUX1JBTkdFIHwgZ3JlcCAtcSAiXC5cLlwuIjsgdGhlbgorICBlY2hvIC1lICIke0dSRUVOfU5vIGNvbW1pdCBtZXNzZ2FnZXMgdG8gY2hlY2sgZm9yIGZvcm1hdHRpbmcuJHtOQ30iCisgIGV4aXQgMAorZmkKKworIyBQcm9jZXNzIGNvbW1pdCBtZXNzYWdlcworc3VjY2Vzcz0xCitjdXJyZW50X2xpbmU9MAorcHJldmxpbmU9IiIKKworIyBQcm9jZXNzIGVhY2ggbGluZSBvZiB0aGUgY29tbWl0IG1lc3NhZ2Ugb3V0cHV0LCByZXNldHRpbmcgY291bnRlciBvbiBzZXBhcmF0b3IKK3ByaW50ZiAlcyAiJENPTU1JVF9URVhUIiB8IHdoaWxlIElGUz0nJyByZWFkIC1yIGxpbmU7IGRvCisgICMgZWNobyAiQ291bnQgPSAkY3VycmVudF9saW5lIDxMaW5lPiA9ICRsaW5lIgorICBjdXJyZW50X2xpbmU9JCgoY3VycmVudF9saW5lKzEpKQorICBpZiBbICIkbGluZSIgPSAiWFhYTkVXTElORVhYWCIgXTsgdGhlbgorICAgIGN1cnJlbnRfbGluZT0wCisgIGZpCisgIGNoYXJzPSR7I2xpbmV9CisgIGlmIFsgJGN1cnJlbnRfbGluZSAtZXEgMSBdOyB0aGVuCisgICAgIyBTdWJqZWN0IGxpbmUgc2hvdWxkIGJlIDUwIGNoYXJzIG9yIGxlc3MgKGJ1dCBnaXZlIHNvbWUgc2xhY2sgaGVyZSkKKyAgICBpZiBbICRjaGFycyAtZ3QgNTQgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIGZvbGxvd2luZyBzdWJqZWN0IGxpbmUgZXhjZWVkcyA1MCBjaGFyYWN0ZXJzIGluIGxlbmd0aC4iCisgICAgICBlY2hvICIgICAgICckbGluZSciCisgICAgICBzdWNjZXNzPTAKKyAgICBmaQorICAgIGk9JCgoJGNoYXJzLTEpKQorICAgIGxhc3RfY2hhcj0ke2xpbmU6JGk6MX0KKyAgICAjIE91dHB1dCBlcnJvciBpZiBsYXN0IGNoYXIgb2Ygc3ViamVjdCBsaW5lIGlzIG5vdCBhbHBoYS1udW1lcmljCisgICAgaWYgW1sgISAkbGFzdF9jaGFyID1+IFswLTlhLXpBLVpdIF1dOyB0aGVuCisgICAgICBlY2hvICJGb3IgdGhlIGZvbGxvd2luZyBjb21taXQsIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgc3ViamVjdCBsaW5lIG11c3Qgbm90IGJlIG5vbi1hbHBoYW51bWVyaWMuIgorICAgICAgZWNobyAiICAgICAnJGxpbmUnIgorICAgICAgc3VjY2Vzcz0wCisgICAgZmkKKyAgICAjIENoZWNraW5nIGlmIHN1YmplY3QgbGluZSBkb2Vzbid0IHN0YXJ0IHdpdGggJ21vZHVsZTogJworICAgIHByZWZpeD0kKGVjaG8gJGxpbmUgfCBjdXQgLWYxIC1kICIgIikKKyAgICBpZiBbICIke3ByZWZpeDogLTF9IiAhPSAiOiIgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIGZvbGxvd2luZyBzdWJqZWN0IGxpbmUgbXVzdCBzdGFydCB3aXRoIGEgc2luZ2xlIHdvcmQgc3BlY2lmeWluZyB0aGUgZnVuY3Rpb25hbCBhcmVhIG9mIHRoZSBjaGFuZ2UsIGZvbGxvd2VkIGJ5IGEgY29sb24gYW5kIHNwYWNlLiBJLmUuLCAnbGF5ZXJzOiBTdWJqZWN0IGxpbmUgaGVyZSciCisgICAgICBlY2hvICIgICAgICckbGluZSciCisgICAgICBzdWNjZXNzPTAKKyAgICBmaQorICBlbGlmIFsgJGN1cnJlbnRfbGluZSAtZXEgMiBdOyB0aGVuCisgICAgIyBDb21taXQgbWVzc2FnZSBtdXN0IGhhdmUgYSBibGFuayBsaW5lIGJldHdlZW4gc3ViamVjdCBhbmQgYm9keQorICAgIGlmIFsgJGNoYXJzIC1uZSAwIF07IHRoZW4KKyAgICAgIGVjaG8gIlRoZSBmb2xsb3dpbmcgc3ViamVjdCBsaW5lIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lLiIKKyAgICAgIGVjaG8gIiAgICAgJyRwcmV2bGluZSciCisgICAgICBzdWNjZXNzPTAKKyAgICBmaQorICBlbHNlCisgICAgIyBMaW5lcyBpbiBhIGNvbW1pdCBtZXNzYWdlIGJvZHkgbXVzdCBiZSBsZXNzIHRoYW4gNzIgY2hhcmFjdGVycyBpbiBsZW5ndGggKGJ1dCBnaXZlIHNvbWUgc2xhY2spCisgICAgaWYgWyAkY2hhcnMgLWd0IDc2IF07IHRoZW4KKyAgICAgIGVjaG8gIlRoZSBmb2xsb3dpbmcgY29tbWl0IG1lc3NhZ2UgYm9keSBsaW5lIGV4Y2VlZHMgdGhlIDcyIGNoYXJhY3RlciBsaW1pdC4iCisgICAgICBlY2hvICInJGxpbmVcJyIKKyAgICAgIHN1Y2Nlc3M9MAorICAgIGZpCisgIGZpCisgIHByZXZsaW5lPSRsaW5lCitkb25lCisKK2lmIFsgJHN1Y2Nlc3MgLWVxIDEgXTsgdGhlbgorICBlY2hvIC1lICIke0dSRUVOfUFsbCBjb21taXQgbWVzc2FnZXMgaW4gcHVsbCByZXF1ZXN0IGFyZSBwcm9wZXJseSBmb3JtYXR0ZWQuJHtOQ30iCisgIGV4aXQgMAorZWxzZQorICBleGl0IDEKK2ZpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9zY3JpcHRzL2NvbW1vbl9jb2RlZ2VuLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9jb21tb25fY29kZWdlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZlYmFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9jb21tb25fY29kZWdlbi5weQpAQCAtMCwwICsxLDc0IEBACisjIS91c3IvYmluL3B5dGhvbjMgLWkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisKK2ltcG9ydCBvcworCisjIENvcHlyaWdodCB0ZXh0IHByZWZpeGluZyBhbGwgaGVhZGVycyAobGlzdCBvZiBzdHJpbmdzKS4KK3ByZWZpeFN0cmluZ3MgPSBbCisgICAgJy8qJywKKyAgICAnKiogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLicsCisgICAgJyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IFZhbHZlIENvcnBvcmF0aW9uJywKKyAgICAnKiogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgTHVuYXJHLCBJbmMuJywKKyAgICAnKiogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgR29vZ2xlIEluYy4nLAorICAgICcqKicsCisgICAgJyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOycsCisgICAgJyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4nLAorICAgICcqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQnLAorICAgICcqKicsCisgICAgJyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnLAorICAgICcqKicsCisgICAgJyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUnLAorICAgICcqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCcsCisgICAgJyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLicsCisgICAgJyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQnLAorICAgICcqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4nLAorICAgICcqLycsCisgICAgJycKK10KKworCitwbGF0Zm9ybV9kaWN0ID0geworICAgICdhbmRyb2lkJyA6ICdWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFInLAorICAgICdmdWNoc2lhJyA6ICdWS19VU0VfUExBVEZPUk1fRlVDSFNJQScsCisgICAgJ2dncCc6ICdWS19VU0VfUExBVEZPUk1fR0dQJywKKyAgICAnaW9zJyA6ICdWS19VU0VfUExBVEZPUk1fSU9TX01WSycsCisgICAgJ21hY29zJyA6ICdWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLJywKKyAgICAnbWV0YWwnIDogJ1ZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQnLAorICAgICd2aScgOiAnVktfVVNFX1BMQVRGT1JNX1ZJX05OJywKKyAgICAnd2F5bGFuZCcgOiAnVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSJywKKyAgICAnd2luMzInIDogJ1ZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFInLAorICAgICd4Y2InIDogJ1ZLX1VTRV9QTEFURk9STV9YQ0JfS0hSJywKKyAgICAneGxpYicgOiAnVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSJywKKyAgICAneGxpYl94cmFuZHInIDogJ1ZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQnLAorfQorCisjCisjIFJldHVybiBhcHByb3ByaWF0ZSBmZWF0dXJlIHByb3RlY3Qgc3RyaW5nIGZyb20gJ3BsYXRmb3JtJyB0YWcgb24gZmVhdHVyZQorZGVmIEdldEZlYXR1cmVQcm90ZWN0KGludGVyZmFjZSk6CisgICAgIiIiR2V0IHBsYXRmb3JtIHByb3RlY3Rpb24gc3RyaW5nIiIiCisgICAgcGxhdGZvcm0gPSBpbnRlcmZhY2UuZ2V0KCdwbGF0Zm9ybScpCisgICAgcHJvdGVjdCA9IE5vbmUKKyAgICBpZiBwbGF0Zm9ybSBpcyBub3QgTm9uZToKKyAgICAgICAgcHJvdGVjdCA9IHBsYXRmb3JtX2RpY3RbcGxhdGZvcm1dCisgICAgcmV0dXJuIHByb3RlY3QKKworIyBoZWxwZXIgdG8gZGVmaW5lIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QKK2RlZiByZXBvX3JlbGF0aXZlKHBhdGgpOgorICAgIHJldHVybiBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicsIHBhdGgpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9kZXRlcm1pbmVfdnNfdmVyc2lvbi5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMvZGV0ZXJtaW5lX3ZzX3ZlcnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzk4MmJmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMvZGV0ZXJtaW5lX3ZzX3ZlcnNpb24ucHkKQEAgLTAsMCArMSwxMTkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNiBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBNYXJrIFlvdW5nIDxtYXJreUBsdW5hcmcuY29tPgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKKyMgRm9sbG93aW5nIGZ1bmN0aW9uIGNvZGUgc25pcHBldCB3YXMgZm91bmQgb24gU3RhY2tPdmVyZmxvdyAod2l0aCBhIGNoYW5nZSB0byBsb3dlcgorIyBjYW1lbC1jYXNlIG9uIHRoZSB2YXJpYWJsZSBuYW1lcyk6CisjICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTcvdGVzdC1pZi1leGVjdXRhYmxlLWV4aXN0cy1pbi1weXRob24KK2RlZiBmaW5kX2V4ZWN1dGFibGUocHJvZ3JhbSk6CisgICAgZGVmIGlzX2V4ZShmUGF0aCk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmlzZmlsZShmUGF0aCkgYW5kIG9zLmFjY2VzcyhmUGF0aCwgb3MuWF9PSykKKworICAgIGZQYXRoLCBmTmFtZSA9IG9zLnBhdGguc3BsaXQocHJvZ3JhbSkKKyAgICBpZiBmUGF0aDoKKyAgICAgICAgaWYgaXNfZXhlKHByb2dyYW0pOgorICAgICAgICAgICAgcmV0dXJuIHByb2dyYW0KKyAgICBlbHNlOgorICAgICAgICBmb3IgcGF0aCBpbiBvcy5lbnZpcm9uWyJQQVRIIl0uc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdHJpcCgnIicpCisgICAgICAgICAgICBleGVfZmlsZSA9IG9zLnBhdGguam9pbihwYXRoLCBwcm9ncmFtKQorICAgICAgICAgICAgaWYgaXNfZXhlKGV4ZV9maWxlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZXhlX2ZpbGUKKworICAgIHJldHVybiBOb25lCisgICAgCitkZWYgZGV0ZXJtaW5lX3llYXIodmVyc2lvbik6CisgICAgaWYgdmVyc2lvbiA9PSA4OgorICAgICAgICByZXR1cm4gMjAwNQorICAgIGVsaWYgdmVyc2lvbiA9PSA5OgorICAgICAgICByZXR1cm4gMjAwOAorICAgIGVsaWYgdmVyc2lvbiA9PSAxMDoKKyAgICAgICAgcmV0dXJuIDIwMTAKKyAgICBlbGlmIHZlcnNpb24gPT0gMTE6CisgICAgICAgIHJldHVybiAyMDEyCisgICAgZWxpZiB2ZXJzaW9uID09IDEyOgorICAgICAgICByZXR1cm4gMjAxMworICAgIGVsaWYgdmVyc2lvbiA9PSAxNDoKKyAgICAgICAgcmV0dXJuIDIwMTUKKyAgICBlbGlmIHZlcnNpb24gPT0gMTU6CisgICAgICAgIHJldHVybiAyMDE3CisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIDAwMDAKKyAgICAKKyMgRGV0ZXJtaW5lIGlmIG1zYnVpbGQgaXMgaW4gdGhlIHBhdGgsIHRoZW4gY2FsbCBpdCB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gYW5kIHBhcnNlCisjIGl0IGludG8gYSBmb3JtYXQgd2UgY2FuIHVzZSwgd2hpY2ggaXMgIjx2ZXJzaW9uX251bT4gPHZlcnNpb25feWVhcj4iLgoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBleGVOYW1lICAgICA9ICdtc2J1aWxkLmV4ZScKKyAgICBhcmd1bWVudHMgICA9ICcvdmVyJworCisgICAgIyBEZXRlcm1pbmUgaWYgdGhlIGV4ZWN1dGFibGUgZXhpc3RzIGluIHRoZSBwYXRoLCB0aGlzIGlzIGNyaXRpY2FsLgorICAgICMKKyAgICBmb3VuZEV4ZU5hbWUgPSBmaW5kX2V4ZWN1dGFibGUoZXhlTmFtZSkKKworICAgICMgSWYgbm90IGZvdW5kLCByZXR1cm4gYW4gaW52YWxpZCBudW1iZXIgYnV0IGluIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgc28gaXQgd2lsbAorICAgICMgZmFpbCBpZiB0aGUgcHJvZ3JhbSBhYm92ZSB0cmllcyB0byB1c2UgaXQuCisgICAgaWYgZm91bmRFeGVOYW1lID09IE5vbmU6CisgICAgICAgIHByaW50KCcwMCAwMDAwJykKKyAgICAgICAgcHJpbnQoJ0V4ZWN1dGFibGUgJyArIGV4ZU5hbWUgKyAnIG5vdCBmb3VuZCBpbiBQQVRIIScpCisgICAgZWxzZToKKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oW2V4ZU5hbWUsIGFyZ3VtZW50c10sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHN5c0NhbGxPdXQgPSBwcm9jLnN0ZG91dC5yZWFkbGluZSgpLmRlY29kZSgnaXNvLTg4NTktMScpLnJzdHJpcCgpCisgICAgICAgIAorICAgICAgICB2ZXJzaW9uID0gTm9uZQorCisgICAgICAgICMgU3BsaXQgYXJvdW5kIGFueSBzcGFjZXMgZmlyc3QKKyAgICAgICAgc3BhY2VMaXN0ICA9IHN5c0NhbGxPdXQuc3BsaXQoJyAnKQorICAgICAgICBmb3Igc3BhY2VTdHJpbmcgaW4gc3BhY2VMaXN0OgorCisgICAgICAgICAgICAjIElmIHdlJ3ZlIGFscmVhZHkgZm91bmQgaXQsIGJhaWwuCisgICAgICAgICAgICBpZiB2ZXJzaW9uICE9IE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgCisgICAgICAgICAgICAjIE5vdyBzcGxpdCBhcm91bmQgbGluZSBmZWVkcworICAgICAgICAgICAgbGluZUxpc3QgPSBzcGFjZVN0cmluZy5zcGxpdCgnXG4nKQorICAgICAgICAgICAgZm9yIGN1ckxpbmUgaW4gbGluZUxpc3Q6CisKKyAgICAgICAgICAgICAgICAjIElmIHdlJ3ZlIGFscmVhZHkgZm91bmQgaXQsIGJhaWwuCisgICAgICAgICAgICAgICAgaWYgdmVyc2lvbiAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gY29udGludWUgaWYgdGhlcmUncyBhIHBlcmlvZCBpbiB0aGUgbGlzdAorICAgICAgICAgICAgICAgIGlmICcuJyBub3QgaW4gY3VyTGluZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICMgR2V0IHRoZSBmaXJzdCBlbGVtZW50IGFuZCBkZXRlcm1pbmUgaWYgaXQgaXMgYSBudW1iZXIsIGlmIHNvLCB3ZSd2ZQorICAgICAgICAgICAgICAgICMgZ290IG91ciBudW1iZXIuCisgICAgICAgICAgICAgICAgc3BsaXRBcm91bmRQZXJpb2QgPSBjdXJMaW5lLnNwbGl0KCcuJykKKyAgICAgICAgICAgICAgICBpZiBzcGxpdEFyb3VuZFBlcmlvZFswXS5pc2RpZ2l0KCk6CisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBpbnQgKHNwbGl0QXJvdW5kUGVyaW9kWzBdKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAKKyAgICAgICAgIyBGYWlsc2FmZSB0byByZXR1cm4gYSBudW1iZXIgaW4gdGhlIHByb3BlciBmb3JtYXQsIGJ1dCBvbmUgdGhhdCB3aWxsIGZhaWwuCisgICAgICAgIGlmIHZlcnNpb24gPT0gTm9uZToKKyAgICAgICAgICAgIHZlcnNpb24gPSAwMAorCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSB5ZWFyIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHZlcnNpb24KKyAgICAgICAgeWVhciA9IGRldGVybWluZV95ZWFyKHZlcnNpb24pCisgICAgICAgIAorICAgICAgICAjIE91dHB1dCB0aGUgc3RyaW5nIHdlIG5lZWQgZm9yIENtYWtlIHRvIHByb3Blcmx5IGJ1aWxkIGZvciB0aGlzIHZlcnNpb24KKyAgICAgICAgcHJpbnQoc3RyKHZlcnNpb24pICsgJyAnICsgc3RyKHllYXIpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9mZXRjaF9nbHNsYW5ndmFsaWRhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9mZXRjaF9nbHNsYW5ndmFsaWRhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiZTY4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9zY3JpcHRzL2ZldGNoX2dsc2xhbmd2YWxpZGF0b3IucHkKQEAgLTAsMCArMSw3NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKworCisjIFRoaXMgc2NyaXB0IHdpbGwgZG93bmxvYWQgdGhlIGxhdGVzdCBnbHNsYW5nIHJlbGVhc2UgYmluYXJ5IGFuZCBleHRyYWN0IHRoZQorIyBnbHNsYW5nVmFsaWRhdG9yIGJpbmFyeSBuZWVkZWQgYnkgdGhlIHZrY3ViZSBhbmQgdmtjdWJlcHAgYXBwbGljYXRpb25zLgorIworIyBJdCB0YWtlcyBhcyBpdHMgbG9uZSBhcmd1bWVudCB0aGUgZmlsbmFtZSAobm8gcGF0aCkgZGVzY3JpYmluZyB0aGUgcmVsZWFzZQorIyBiaW5hcnkgbmFtZSBmcm9tIHRoZSBnbHNsYW5nIGdpdGh1YiByZWxlYXNlcyBwYWdlLgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzc2wKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdXJsbGliLnJlcXVlc3QKK2ltcG9ydCB6aXBmaWxlCisKK1NDUklQVFNfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCitSRVBPX0RJUiA9IG9zLnBhdGguam9pbihTQ1JJUFRTX0RJUiwgJy4uJykKK0dMU0xBTkdfVVJMID0gImh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xzbGFuZy9yZWxlYXNlcy9kb3dubG9hZC83LjkuMjg4OCIKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpICE9IDI6CisgICAgICAgIHByaW50KCJFUlJPUiAtLSBtdXN0IGluY2x1ZGUgYSBzaW5nbGUgZ2xzbGFuZyByZWxlYXNlIHppcGZpbGUgbmFtZSBhcmd1bWVudCIpCisgICAgICAgIHN5cy5leGl0KCk7CisKKyAgICBHTFNMQU5HX0ZJTEVOQU1FID0gc3lzLmFyZ3ZbMV0KKyAgICBHTFNMQU5HX0NPTVBMRVRFX1VSTCA9IEdMU0xBTkdfVVJMICsgIi8iICsgR0xTTEFOR19GSUxFTkFNRQorICAgIEdMU0xBTkdfT1VURklMRU5BTUUgPSBvcy5wYXRoLmpvaW4oUkVQT19ESVIsICJnbHNsYW5nIiwgR0xTTEFOR19GSUxFTkFNRSkKKyAgICBHTFNMQU5HX1ZBTElEQVRPUl9QQVRIID0gb3MucGF0aC5qb2luKFJFUE9fRElSLCAiZ2xzbGFuZyIsICJiaW4iKQorICAgIEdMU0xBTkdfVkFMSURBVE9SX0ZVTExfUEFUSCA9IG9zLnBhdGguam9pbihSRVBPX0RJUiwgImdsc2xhbmciLCAiYmluIiwgImdsc2xhbmdWYWxpZGF0b3IiKQorICAgIEdMU0xBTkdfRElSID0gb3MucGF0aC5qb2luKFJFUE9fRElSLCAiZ2xzbGFuZyIpCisKKyAgICBpZiBvcy5wYXRoLmlzZGlyKEdMU0xBTkdfRElSKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihHTFNMQU5HX1ZBTElEQVRPUl9QQVRIKToKKyAgICAgICAgICAgIGRpcl9jb250ZW50cyA9IG9zLmxpc3RkaXIoR0xTTEFOR19WQUxJREFUT1JfUEFUSCkKKyAgICAgICAgICAgIGZvciBhZmlsZSBpbiBkaXJfY29udGVudHM6CisgICAgICAgICAgICAgICAgaWYgImdsc2xhbmdWYWxpZGF0b3IiIGluIGFmaWxlOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiICAgVXNpbmcgZ2xzbGFuZ1ZhbGlkYXRvciBhdCAlcyIgJSBHTFNMQU5HX1ZBTElEQVRPUl9QQVRIKQorICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgpOworICAgIGVsc2U6CisgICAgICAgIG9zLm1rZGlyKEdMU0xBTkdfRElSKQorICAgIHByaW50KCIgICBEb3dubG9hZGluZyBnbHNsYW5nVmFsaWRhdG9yIGJpbmFyeSBmcm9tIGdsc2xhbmcgcmVsZWFzZXMgZGlyIikKKyAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKworICAgICMgRG93bmxvYWQgcmVsZWFzZSB6aXAgZmlsZSBmcm9tIGdsc2xhbmcgZ2l0aHViIHJlbGVhc2VzIHNpdGUKKyAgICB3aXRoIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4oR0xTTEFOR19DT01QTEVURV9VUkwsIGNvbnRleHQ9c3NsLl9jcmVhdGVfdW52ZXJpZmllZF9jb250ZXh0KCkpIGFzIHJlc3BvbnNlLCBvcGVuKEdMU0xBTkdfT1VURklMRU5BTUUsICd3YicpIGFzIG91dF9maWxlOgorICAgICAgICBzaHV0aWwuY29weWZpbGVvYmoocmVzcG9uc2UsIG91dF9maWxlKQorICAgICMgVW56aXAgdGhlIGdsc2xhbmcgYmluYXJ5IGFyY2hpdmUKKyAgICB6aXBwZWRfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShHTFNMQU5HX09VVEZJTEVOQU1FLCAncicpCisgICAgbmFtZWxpc3QgPSB6aXBwZWRfZmlsZS5uYW1lbGlzdCgpCisgICAgZm9yIGFmaWxlIGluIG5hbWVsaXN0OgorICAgICAgICBpZiAiZ2xzbGFuZ1ZhbGlkYXRvciIgaW4gYWZpbGU6CisgICAgICAgICAgICBFWEVfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKEdMU0xBTkdfRElSLCBhZmlsZSkKKyAgICAgICAgICAgIHppcHBlZF9maWxlLmV4dHJhY3QoYWZpbGUsIEdMU0xBTkdfRElSKQorICAgICAgICAgICAgb3MuY2htb2QoRVhFX0ZJTEVfUEFUSCwgMG83NzUpCisgICAgICAgICAgICBicmVhaworICAgIHppcHBlZF9maWxlLmNsb3NlKCkKKyAgICBzeXMuZXhpdCgpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9zY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNGJlMjRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkKQEAgLTAsMCArMSwxMDkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMgQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxOSBMdW5hckcsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogTWlrZSBTY2h1Y2hhcmR0IDxtaWtlc0BsdW5hcmcuY29tPgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBmaWxlY21wCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKKworaW1wb3J0IGNvbW1vbl9jb2RlZ2VuCisKKyMgZmlsZXMgdG8gZXhjbHVkZSBmcm9tIC0tdmVyaWZ5IGNoZWNrCit2ZXJpZnlfZXhjbHVkZSA9IFsnLmNsYW5nLWZvcm1hdCddCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSdHZW5lcmF0ZSBzb3VyY2UgY29kZSBmb3IgdGhpcyByZXBvc2l0b3J5JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdyZWdpc3RyeScsIG1ldGF2YXI9J1JFR0lTVFJZX1BBVEgnLCBoZWxwPSdwYXRoIHRvIHRoZSBWdWxrYW4tSGVhZGVycyByZWdpc3RyeSBkaXJlY3RvcnknKQorICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWknLCAnLS1pbmNyZW1lbnRhbCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J29ubHkgdXBkYXRlIHJlcG8gZmlsZXMgdGhhdCBjaGFuZ2UnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJpZnknLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSd2ZXJpZnkgcmVwbyBmaWxlcyBtYXRjaCBnZW5lcmF0b3Igb3V0cHV0JykKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKworICAgIGdlbl9jbWRzID0gW1tjb21tb25fY29kZWdlbi5yZXBvX3JlbGF0aXZlKCdzY3JpcHRzL2t2dF9nZW52ay5weScpLAorICAgICAgICAgICAgICAgICAnLXJlZ2lzdHJ5Jywgb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihhcmdzLnJlZ2lzdHJ5LCAgJ3ZrLnhtbCcpKSwKKyAgICAgICAgICAgICAgICAgJy1xdWlldCcsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lXSBmb3IgZmlsZW5hbWUgaW4gWyd2a190eXBlbWFwX2hlbHBlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vY2tfaWNkLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9ja19pY2QuY3BwJ11dCisKKyAgICByZXBvX2RpciA9IGNvbW1vbl9jb2RlZ2VuLnJlcG9fcmVsYXRpdmUoJ2ljZC9nZW5lcmF0ZWQnKQorCisgICAgIyBnZXQgZGlyZWN0b3J5IHdoZXJlIGdlbmVyYXRvcnMgd2lsbCBydW4KKyAgICBpZiBhcmdzLnZlcmlmeSBvciBhcmdzLmluY3JlbWVudGFsOgorICAgICAgICAjIGdlbmVyYXRlIGluIHRlbXAgZGlyZWN0b3J5IHNvIHdlIGNhbiBjb21wYXJlIG9yIGNvcHkgbGF0ZXIKKyAgICAgICAgdGVtcF9vYmogPSB0ZW1wZmlsZS5UZW1wb3JhcnlEaXJlY3RvcnkocHJlZml4PSdWdWxrYW5Mb2FkZXJfZ2VuZXJhdGVkX3NvdXJjZV8nKQorICAgICAgICB0ZW1wX2RpciA9IHRlbXBfb2JqLm5hbWUKKyAgICAgICAgZ2VuX2RpciA9IHRlbXBfZGlyCisgICAgZWxzZToKKyAgICAgICAgIyBnZW5lcmF0ZSBkaXJlY3RseSBpbiB0aGUgcmVwbworICAgICAgICBnZW5fZGlyID0gcmVwb19kaXIKKworICAgICMgcnVuIGVhY2ggY29kZSBnZW5lcmF0b3IKKyAgICBmb3IgY21kIGluIGdlbl9jbWRzOgorICAgICAgICBwcmludCgnICcuam9pbihjbWQpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3N5cy5leGVjdXRhYmxlXSArIGNtZCwgY3dkPWdlbl9kaXIpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHByaW50KCdFUlJPUjonLCBzdHIoZSkpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgIyBvcHRpb25hbCBwb3N0LWdlbmVyYXRpb24gc3RlcHMKKyAgICBpZiBhcmdzLnZlcmlmeToKKyAgICAgICAgIyBjb21wYXJlIGNvbnRlbnRzIG9mIHRlbXAgZGlyIGFuZCByZXBvCisgICAgICAgIHRlbXBfZmlsZXMgPSBzZXQob3MubGlzdGRpcih0ZW1wX2RpcikpCisgICAgICAgIHJlcG9fZmlsZXMgPSBzZXQob3MubGlzdGRpcihyZXBvX2RpcikpCisgICAgICAgIGZpbGVzX21hdGNoID0gVHJ1ZQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gc29ydGVkKCh0ZW1wX2ZpbGVzIHwgcmVwb19maWxlcykgLSBzZXQodmVyaWZ5X2V4Y2x1ZGUpKToKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lIG5vdCBpbiByZXBvX2ZpbGVzOgorICAgICAgICAgICAgICAgIHByaW50KCdFUlJPUjogTWlzc2luZyByZXBvIGZpbGUnLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBmaWxlc19tYXRjaCA9IEZhbHNlCisgICAgICAgICAgICBlbGlmIGZpbGVuYW1lIG5vdCBpbiB0ZW1wX2ZpbGVzOgorICAgICAgICAgICAgICAgIHByaW50KCdFUlJPUjogTWlzc2luZyBnZW5lcmF0b3IgZm9yJywgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZmlsZXNfbWF0Y2ggPSBGYWxzZQorICAgICAgICAgICAgZWxpZiBub3QgZmlsZWNtcC5jbXAob3MucGF0aC5qb2luKHRlbXBfZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHJlcG9fZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGxvdz1GYWxzZSk6CisgICAgICAgICAgICAgICAgcHJpbnQoJ0VSUk9SOiBSZXBvIGZpbGVzIGRvIG5vdCBtYXRjaCBnZW5lcmF0b3Igb3V0cHV0IGZvcicsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGZpbGVzX21hdGNoID0gRmFsc2UKKworICAgICAgICAjIHJldHVybiBjb2RlIGZvciB0ZXN0IHNjcmlwdHMKKyAgICAgICAgaWYgZmlsZXNfbWF0Y2g6CisgICAgICAgICAgICBwcmludCgnU1VDQ0VTUzogUmVwbyBmaWxlcyBtYXRjaCBnZW5lcmF0b3Igb3V0cHV0JykKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiAxCisKKyAgICBlbGlmIGFyZ3MuaW5jcmVtZW50YWw6CisgICAgICAgICMgY29weSBtaXNzaW5nIG9yIGRpZmZlcmluZyBmaWxlcyBmcm9tIHRlbXAgZGlyZWN0b3J5IHRvIHJlcG8KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIodGVtcF9kaXIpOgorICAgICAgICAgICAgdGVtcF9maWxlbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICByZXBvX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHJlcG9fZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZXBvX2ZpbGVuYW1lKSBvciBcCisgICAgICAgICAgICAgICBub3QgZmlsZWNtcC5jbXAodGVtcF9maWxlbmFtZSwgcmVwb19maWxlbmFtZSwgc2hhbGxvdz1GYWxzZSk6CisgICAgICAgICAgICAgICAgcHJpbnQoJ3VwZGF0ZScsIHJlcG9fZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHRlbXBfZmlsZW5hbWUsIHJlcG9fZmlsZW5hbWUpCisKKyAgICByZXR1cm4gMAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9nZW5lcmF0ZV92dWxrYW5fd3JhcHBlci5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMvZ2VuZXJhdGVfdnVsa2FuX3dyYXBwZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTA4ZjY2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMvZ2VuZXJhdGVfdnVsa2FuX3dyYXBwZXIucHkKQEAgLTAsMCArMSwxMjI5IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAxOCBHb29nbGUsIEluYy4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyMgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyMgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisjIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisjIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisjIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisjIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisjIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyMgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisiIiJHZW5lcmF0ZSBWdWxrYW4gd3JhcHBlciB0byBzdXBwb3J0IEFuZHJvaWQgd2l0aG91dCBsaWJ2dWxrYW4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworY2xhc3MgQ29tbWFuZChvYmplY3QpOgorICAgIFBMQVRGT1JNID0gMAorICAgIExPQURFUiA9IDEKKyAgICBJTlNUQU5DRSA9IDIKKyAgICBERVZJQ0UgPSAzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZGlzcGF0Y2gpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZGlzcGF0Y2ggPSBkaXNwYXRjaAorICAgICAgICBzZWxmLnR5ID0gc2VsZi5fZ2V0X3R5cGUoKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiB2YWxpZF9jX3R5cGVkZWYoYyk6CisgICAgICAgIHJldHVybiAoYy5zdGFydHN3aXRoKCJ0eXBlZGVmIikgYW5kCisgICAgICAgICAgICAgICAgYy5lbmRzd2l0aCgiKTsiKSBhbmQKKyAgICAgICAgICAgICAgICAiKlBGTl92a1ZvaWRGdW5jdGlvbiIgbm90IGluIGMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9jX3R5cGVkZWYoY2xzLCBjKToKKyAgICAgICAgbmFtZV9iZWdpbiA9IGMuZmluZCgiKlBGTl92ayIpICsgNSAjIGluc3RlYWQgb2YgNyB0byByZXN0b3JlIHZrCisgICAgICAgIG5hbWVfZW5kID0gYy5maW5kKCIpKCIsIG5hbWVfYmVnaW4pCisgICAgICAgIG5hbWUgPSBjW25hbWVfYmVnaW46bmFtZV9lbmRdCisKKyAgICAgICAgZGlzcGF0Y2hfYmVnaW4gPSBuYW1lX2VuZCArIDIKKyAgICAgICAgZGlzcGF0Y2hfZW5kID0gYy5maW5kKCIgIiwgZGlzcGF0Y2hfYmVnaW4pCisgICAgICAgIGRpc3BhdGNoID0gY1tkaXNwYXRjaF9iZWdpbjpkaXNwYXRjaF9lbmRdCisgICAgICAgIGlmIG5vdCBkaXNwYXRjaC5zdGFydHN3aXRoKCJWayIpOgorICAgICAgICAgICAgZGlzcGF0Y2ggPSBOb25lCisKKyAgICAgICAgcmV0dXJuIGNscyhuYW1lLCBkaXNwYXRjaCkKKworICAgIGRlZiBfZ2V0X3R5cGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGlzcGF0Y2g6CisgICAgICAgICAgICBpZiBzZWxmLmRpc3BhdGNoIGluIFsiVmtEZXZpY2UiLCAiVmtRdWV1ZSIsICJWa0NvbW1hbmRCdWZmZXIiXToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ERVZJQ0UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuSU5TVEFOQ0UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYubmFtZSBpbiBbIkdldEluc3RhbmNlUHJvY0FkZHIiXToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5QTEFURk9STQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5MT0FERVIKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJDb21tYW5kKG5hbWU9JXMsIGRpc3BhdGNoPSVzKSIgJSBcCisgICAgICAgICAgICAgICAgKHJlcHIoc2VsZi5uYW1lKSwgcmVwcihzZWxmLmRpc3BhdGNoKSkKKworY2xhc3MgRXh0ZW5zaW9uKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHZlcnNpb24sIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVtdKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgIHNlbGYuZ3VhcmQgPSBndWFyZAorICAgICAgICBzZWxmLmNvbW1hbmRzID0gY29tbWFuZHNbOl0KKworICAgIGRlZiBhZGRfY29tbWFuZChzZWxmLCBjbWQpOgorICAgICAgICBzZWxmLmNvbW1hbmRzLmFwcGVuZChjbWQpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgbGluZXMuYXBwZW5kKCJFeHRlbnNpb24obmFtZT0lcywgdmVyc2lvbj0lcywgZ3VhcmQ9JXMsIGNvbW1hbmRzPVsiICUKKyAgICAgICAgICAgICAgICAocmVwcihzZWxmLm5hbWUpLCByZXByKHNlbGYudmVyc2lvbiksIHJlcHIoc2VsZi5ndWFyZCkpKQorCisgICAgICAgIGZvciBjbWQgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiICAgICVzLCIgJSByZXByKGNtZCkpCisKKyAgICAgICAgbGluZXMuYXBwZW5kKCJdKSIpCisKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKKworIyBnZW5lcmF0ZWQgYnkgImdlbmVyYXRlX3Z1bGthbl93cmFwcGVyLnB5IHBhcnNlIHZ1bGthbi5oIgorVktfY29yZV8wID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX2NvcmVfMCcsIHZlcnNpb249MCwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVJbnN0YW5jZScsIGRpc3BhdGNoPU5vbmUpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95SW5zdGFuY2UnLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMnLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMnLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMnLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcycsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcycsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEluc3RhbmNlUHJvY0FkZHInLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXREZXZpY2VQcm9jQWRkcicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVEZXZpY2UnLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95RGV2aWNlJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsIGRpc3BhdGNoPU5vbmUpLAorICAgIENvbW1hbmQobmFtZT0ndmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnLCBkaXNwYXRjaD1Ob25lKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0RGV2aWNlUXVldWUnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrUXVldWVTdWJtaXQnLCBkaXNwYXRjaD0nVmtRdWV1ZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtRdWV1ZVdhaXRJZGxlJywgZGlzcGF0Y2g9J1ZrUXVldWUnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGV2aWNlV2FpdElkbGUnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQWxsb2NhdGVNZW1vcnknLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRnJlZU1lbW9yeScsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtNYXBNZW1vcnknLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrVW5tYXBNZW1vcnknLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50JywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0JpbmRCdWZmZXJNZW1vcnknLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQmluZEltYWdlTWVtb3J5JywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcycsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a1F1ZXVlQmluZFNwYXJzZScsIGRpc3BhdGNoPSdWa1F1ZXVlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZUZlbmNlJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0Rlc3Ryb3lGZW5jZScsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtSZXNldEZlbmNlcycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRGZW5jZVN0YXR1cycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtXYWl0Rm9yRmVuY2VzJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZVNlbWFwaG9yZScsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95U2VtYXBob3JlJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZUV2ZW50JywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0Rlc3Ryb3lFdmVudCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRFdmVudFN0YXR1cycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtTZXRFdmVudCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtSZXNldEV2ZW50JywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZVF1ZXJ5UG9vbCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95UXVlcnlQb29sJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFF1ZXJ5UG9vbFJlc3VsdHMnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlQnVmZmVyJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0Rlc3Ryb3lCdWZmZXInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlQnVmZmVyVmlldycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95QnVmZmVyVmlldycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVJbWFnZScsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95SW1hZ2UnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVJbWFnZVZpZXcnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveUltYWdlVmlldycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVTaGFkZXJNb2R1bGUnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveVNoYWRlck1vZHVsZScsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVQaXBlbGluZUNhY2hlJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBpcGVsaW5lQ2FjaGVEYXRhJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a01lcmdlUGlwZWxpbmVDYWNoZXMnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95UGlwZWxpbmUnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveVBpcGVsaW5lTGF5b3V0JywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZVNhbXBsZXInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveVNhbXBsZXInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVEZXNjcmlwdG9yUG9vbCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95RGVzY3JpcHRvclBvb2wnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrUmVzZXREZXNjcmlwdG9yUG9vbCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0ZyZWVEZXNjcmlwdG9yU2V0cycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtVcGRhdGVEZXNjcmlwdG9yU2V0cycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVGcmFtZWJ1ZmZlcicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95RnJhbWVidWZmZXInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlUmVuZGVyUGFzcycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95UmVuZGVyUGFzcycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHknLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlQ29tbWFuZFBvb2wnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveUNvbW1hbmRQb29sJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a1Jlc2V0Q29tbWFuZFBvb2wnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQWxsb2NhdGVDb21tYW5kQnVmZmVycycsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtGcmVlQ29tbWFuZEJ1ZmZlcnMnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQmVnaW5Db21tYW5kQnVmZmVyJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtFbmRDb21tYW5kQnVmZmVyJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtSZXNldENvbW1hbmRCdWZmZXInLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEJpbmRQaXBlbGluZScsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0Vmlld3BvcnQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFNldFNjaXNzb3InLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFNldExpbmVXaWR0aCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0RGVwdGhCaWFzJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRTZXRCbGVuZENvbnN0YW50cycsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0RGVwdGhCb3VuZHMnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzaycsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzaycsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZScsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kQmluZERlc2NyaXB0b3JTZXRzJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRCaW5kSW5kZXhCdWZmZXInLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWREcmF3JywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWREcmF3SW5kZXhlZCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRHJhd0luZGlyZWN0JywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWREcmF3SW5kZXhlZEluZGlyZWN0JywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWREaXNwYXRjaCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRGlzcGF0Y2hJbmRpcmVjdCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kQ29weUJ1ZmZlcicsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kQ29weUltYWdlJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRCbGl0SW1hZ2UnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZENvcHlCdWZmZXJUb0ltYWdlJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcicsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kVXBkYXRlQnVmZmVyJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRGaWxsQnVmZmVyJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRDbGVhckNvbG9ySW1hZ2UnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZENsZWFyQXR0YWNobWVudHMnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFJlc29sdmVJbWFnZScsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0RXZlbnQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFJlc2V0RXZlbnQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFdhaXRFdmVudHMnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFBpcGVsaW5lQmFycmllcicsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kQmVnaW5RdWVyeScsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRW5kUXVlcnknLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFJlc2V0UXVlcnlQb29sJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRXcml0ZVRpbWVzdGFtcCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFB1c2hDb25zdGFudHMnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEJlZ2luUmVuZGVyUGFzcycsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kTmV4dFN1YnBhc3MnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEVuZFJlbmRlclBhc3MnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEV4ZWN1dGVDb21tYW5kcycsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKK10pCisKK1ZLX2NvcmVfMSA9IEV4dGVuc2lvbihuYW1lPSdWS19jb3JlXzEnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uJywgZGlzcGF0Y2g9Tm9uZSksCisgICAgQ29tbWFuZChuYW1lPSd2a0JpbmRCdWZmZXJNZW1vcnkyJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0JpbmRJbWFnZU1lbW9yeTInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0RGV2aWNlTWFzaycsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRGlzcGF0Y2hCYXNlJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcycsIGRpc3BhdGNoPSdWa0luc3RhbmNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a1RyaW1Db21tYW5kUG9vbCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXREZXZpY2VRdWV1ZTInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZScsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcycsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9zdXJmYWNlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9zdXJmYWNlJywgdmVyc2lvbj0yNSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95U3VyZmFjZUtIUicsIGRpc3BhdGNoPSdWa0luc3RhbmNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9zd2FwY2hhaW4gPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX3N3YXBjaGFpbicsIHZlcnNpb249NzAsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlU3dhcGNoYWluS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0Rlc3Ryb3lTd2FwY2hhaW5LSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0FjcXVpcmVOZXh0SW1hZ2VLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrUXVldWVQcmVzZW50S0hSJywgZGlzcGF0Y2g9J1ZrUXVldWUnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQWNxdWlyZU5leHRJbWFnZTJLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9kaXNwbGF5ID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9kaXNwbGF5JywgdmVyc2lvbj0yMSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVEaXNwbGF5TW9kZUtIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFInLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorXSkKKworVktfS0hSX2Rpc3BsYXlfc3dhcGNoYWluID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9kaXNwbGF5X3N3YXBjaGFpbicsIHZlcnNpb249OSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCitdKQorCitWS19LSFJfc2FtcGxlcl9taXJyb3JfY2xhbXBfdG9fZWRnZSA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfc2FtcGxlcl9taXJyb3JfY2xhbXBfdG9fZWRnZScsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfS0hSX211bHRpdmlldyA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfbXVsdGl2aWV3JywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCitdKQorCitWS19LSFJfZGV2aWNlX2dyb3VwID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9kZXZpY2VfZ3JvdXAnLCB2ZXJzaW9uPTMsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0RGV2aWNlTWFza0tIUicsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRGlzcGF0Y2hCYXNlS0hSJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorXSkKKworVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0tIUl9tYWludGVuYW5jZTEgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX21haW50ZW5hbmNlMScsIHZlcnNpb249MiwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtUcmltQ29tbWFuZFBvb2xLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24gPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUicsIGRpc3BhdGNoPSdWa0luc3RhbmNlJyksCitdKQorCitWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcycsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCitdKQorCitWS19LSFJfZXh0ZXJuYWxfbWVtb3J5ID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9leHRlcm5hbF9tZW1vcnknLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRNZW1vcnlGZEtIUicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmUgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZScsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0ltcG9ydFNlbWFwaG9yZUZkS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFNlbWFwaG9yZUZkS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCitdKQorCitWS19LSFJfcHVzaF9kZXNjcmlwdG9yID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9wdXNoX2Rlc2NyaXB0b3InLCB2ZXJzaW9uPTIsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFInLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorXSkKKworVktfS0hSXzE2Yml0X3N0b3JhZ2UgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSXzE2Yml0X3N0b3JhZ2UnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50ID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50JywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVSZW5kZXJQYXNzMktIUicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRCZWdpblJlbmRlclBhc3MyS0hSJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWROZXh0U3VicGFzczJLSFInLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEVuZFJlbmRlclBhc3MyS0hSJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorXSkKKworVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFN3YXBjaGFpblN0YXR1c0tIUicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorXSkKKworVktfS0hSX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcyA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorXSkKKworVktfS0hSX2V4dGVybmFsX2ZlbmNlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9leHRlcm5hbF9mZW5jZScsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfS0hSX2V4dGVybmFsX2ZlbmNlX2ZkID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9leHRlcm5hbF9mZW5jZV9mZCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtJbXBvcnRGZW5jZUZkS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEZlbmNlRmRLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9tYWludGVuYW5jZTIgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX21haW50ZW5hbmNlMicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczInLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl92YXJpYWJsZV9wb2ludGVycyA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfdmFyaWFibGVfcG9pbnRlcnMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMiA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllczInLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorXSkKKworVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbicsIHZlcnNpb249MywgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfS0hSX3N0b3JhZ2VfYnVmZmVyX3N0b3JhZ2VfY2xhc3MgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX3N0b3JhZ2VfYnVmZmVyX3N0b3JhZ2VfY2xhc3MnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0tIUl9yZWxheGVkX2Jsb2NrX2xheW91dCA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfcmVsYXhlZF9ibG9ja19sYXlvdXQnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9pbWFnZV9mb3JtYXRfbGlzdCA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfaW1hZ2VfZm9ybWF0X2xpc3QnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24gPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCitdKQorCitWS19LSFJfYmluZF9tZW1vcnkyID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9iaW5kX21lbW9yeTInLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQmluZEJ1ZmZlck1lbW9yeTJLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQmluZEltYWdlTWVtb3J5MktIUicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorXSkKKworVktfS0hSX21haW50ZW5hbmNlMyA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfbWFpbnRlbmFuY2UzJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCitdKQorCitWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUicsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorXSkKKworVktfS0hSXzhiaXRfc3RvcmFnZSA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfOGJpdF9zdG9yYWdlJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19LSFJfc2hhZGVyX2F0b21pY19pbnQ2NCA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfc2hhZGVyX2F0b21pY19pbnQ2NCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfS0hSX2RyaXZlcl9wcm9wZXJ0aWVzID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9kcml2ZXJfcHJvcGVydGllcycsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfS0hSX3Z1bGthbl9tZW1vcnlfbW9kZWwgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX3Z1bGthbl9tZW1vcnlfbW9kZWwnLCB2ZXJzaW9uPTIsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9kZWJ1Z19yZXBvcnQgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX2RlYnVnX3JlcG9ydCcsIHZlcnNpb249OSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUJywgZGlzcGF0Y2g9J1ZrSW5zdGFuY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQnLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQnLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorXSkKKworVktfTlZfZ2xzbF9zaGFkZXIgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfZ2xzbF9zaGFkZXInLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfSU1HX2ZpbHRlcl9jdWJpYyA9IEV4dGVuc2lvbihuYW1lPSdWS19JTUdfZmlsdGVyX2N1YmljJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19BTURfcmFzdGVyaXphdGlvbl9vcmRlciA9IEV4dGVuc2lvbihuYW1lPSdWS19BTURfcmFzdGVyaXphdGlvbl9vcmRlcicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfQU1EX3NoYWRlcl90cmluYXJ5X21pbm1heCA9IEV4dGVuc2lvbihuYW1lPSdWS19BTURfc2hhZGVyX3RyaW5hcnlfbWlubWF4JywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19BTURfc2hhZGVyX2V4cGxpY2l0X3ZlcnRleF9wYXJhbWV0ZXIgPSBFeHRlbnNpb24obmFtZT0nVktfQU1EX3NoYWRlcl9leHBsaWNpdF92ZXJ0ZXhfcGFyYW1ldGVyJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19FWFRfZGVidWdfbWFya2VyID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9kZWJ1Z19tYXJrZXInLCB2ZXJzaW9uPTQsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZERlYnVnTWFya2VyRW5kRVhUJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKK10pCisKK1ZLX0FNRF9nY25fc2hhZGVyID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0FNRF9nY25fc2hhZGVyJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiA9IEV4dGVuc2lvbihuYW1lPSdWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjayA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRW5kUXVlcnlJbmRleGVkRVhUJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCitdKQorCitWS19BTURfZHJhd19pbmRpcmVjdF9jb3VudCA9IEV4dGVuc2lvbihuYW1lPSdWS19BTURfZHJhd19pbmRpcmVjdF9jb3VudCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorXSkKKworVktfQU1EX25lZ2F0aXZlX3ZpZXdwb3J0X2hlaWdodCA9IEV4dGVuc2lvbihuYW1lPSdWS19BTURfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0JywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19BTURfZ3B1X3NoYWRlcl9oYWxmX2Zsb2F0ID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0FNRF9ncHVfc2hhZGVyX2hhbGZfZmxvYXQnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0FNRF9zaGFkZXJfYmFsbG90ID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0FNRF9zaGFkZXJfYmFsbG90JywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19BTURfdGV4dHVyZV9nYXRoZXJfYmlhc19sb2QgPSBFeHRlbnNpb24obmFtZT0nVktfQU1EX3RleHR1cmVfZ2F0aGVyX2JpYXNfbG9kJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19BTURfc2hhZGVyX2luZm8gPSBFeHRlbnNpb24obmFtZT0nVktfQU1EX3NoYWRlcl9pbmZvJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFNoYWRlckluZm9BTUQnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0FNRF9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9sb2QgPSBFeHRlbnNpb24obmFtZT0nVktfQU1EX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2xvZCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UnLCB2ZXJzaW9uPTIsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0lNR19mb3JtYXRfcHZydGMgPSBFeHRlbnNpb24obmFtZT0nVktfSU1HX2Zvcm1hdF9wdnJ0YycsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyA9IEV4dGVuc2lvbihuYW1lPSdWS19OVl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCitdKQorCitWS19OVl9leHRlcm5hbF9tZW1vcnkgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfZXh0ZXJuYWxfbWVtb3J5JywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19FWFRfdmFsaWRhdGlvbl9mbGFncyA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfdmFsaWRhdGlvbl9mbGFncycsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfRVhUX3NoYWRlcl9zdWJncm91cF9iYWxsb3QgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX3NoYWRlcl9zdWJncm91cF9iYWxsb3QnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfdm90ZSA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfc2hhZGVyX3N1Ymdyb3VwX3ZvdGUnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9hc3RjX2RlY29kZV9tb2RlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9hc3RjX2RlY29kZV9tb2RlJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19FWFRfY29uZGl0aW9uYWxfcmVuZGVyaW5nID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9jb25kaXRpb25hbF9yZW5kZXJpbmcnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCitdKQorCitWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyA9IEV4dGVuc2lvbihuYW1lPSdWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcycsIHZlcnNpb249MywgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZU9iamVjdFRhYmxlTlZYJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtSZWdpc3Rlck9iamVjdHNOVlgnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrVW5yZWdpc3Rlck9iamVjdHNOVlgnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgnLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorXSkKKworVktfTlZfY2xpcF9zcGFjZV93X3NjYWxpbmcgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfY2xpcF9zcGFjZV93X3NjYWxpbmcnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorXSkKKworVktfRVhUX2RpcmVjdF9tb2RlX2Rpc3BsYXkgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX2RpcmVjdF9tb2RlX2Rpc3BsYXknLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrUmVsZWFzZURpc3BsYXlFWFQnLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorXSkKKworVktfRVhUX2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlcicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUJywgZGlzcGF0Y2g9J1ZrUGh5c2ljYWxEZXZpY2UnKSwKK10pCisKK1ZLX0VYVF9kaXNwbGF5X2NvbnRyb2wgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX2Rpc3BsYXlfY29udHJvbCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtEaXNwbGF5UG93ZXJDb250cm9sRVhUJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0U3dhcGNoYWluQ291bnRlckVYVCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorXSkKKworVktfR09PR0xFX2Rpc3BsYXlfdGltaW5nID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0dPT0dMRV9kaXNwbGF5X3RpbWluZycsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRScsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCitdKQorCitWS19OVl9zYW1wbGVfbWFza19vdmVycmlkZV9jb3ZlcmFnZSA9IEV4dGVuc2lvbihuYW1lPSdWS19OVl9zYW1wbGVfbWFza19vdmVycmlkZV9jb3ZlcmFnZScsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZfZ2VvbWV0cnlfc2hhZGVyX3Bhc3N0aHJvdWdoID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX05WX2dlb21ldHJ5X3NoYWRlcl9wYXNzdGhyb3VnaCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZfdmlld3BvcnRfYXJyYXkyID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX05WX3ZpZXdwb3J0X2FycmF5MicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZYX211bHRpdmlld19wZXJfdmlld19hdHRyaWJ1dGVzID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX05WWF9tdWx0aXZpZXdfcGVyX3ZpZXdfYXR0cmlidXRlcycsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZfdmlld3BvcnRfc3dpenpsZSA9IEV4dGVuc2lvbihuYW1lPSdWS19OVl92aWV3cG9ydF9zd2l6emxlJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9kaXNjYXJkX3JlY3RhbmdsZXMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKK10pCisKK1ZLX0VYVF9jb25zZXJ2YXRpdmVfcmFzdGVyaXphdGlvbiA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24nLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9zd2FwY2hhaW5fY29sb3JzcGFjZSA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfc3dhcGNoYWluX2NvbG9yc3BhY2UnLCB2ZXJzaW9uPTMsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9oZHJfbWV0YWRhdGEgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX2hkcl9tZXRhZGF0YScsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtTZXRIZHJNZXRhZGF0YUVYVCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorXSkKKworVktfRVhUX2V4dGVybmFsX21lbW9yeV9kbWFfYnVmID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9leHRlcm5hbF9tZW1vcnlfZG1hX2J1ZicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfRVhUX3F1ZXVlX2ZhbWlseV9mb3JlaWduID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9xdWV1ZV9mYW1pbHlfZm9yZWlnbicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfRVhUX2RlYnVnX3V0aWxzID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9kZWJ1Z191dGlscycsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQnLCBkaXNwYXRjaD0nVmtRdWV1ZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCcsIGRpc3BhdGNoPSdWa1F1ZXVlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUJywgZGlzcGF0Y2g9J1ZrUXVldWUnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCcsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUJywgZGlzcGF0Y2g9J1ZrSW5zdGFuY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQnLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCcsIGRpc3BhdGNoPSdWa0luc3RhbmNlJyksCitdKQorCitWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4ID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9zYW1wbGVyX2ZpbHRlcl9taW5tYXgnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0FNRF9ncHVfc2hhZGVyX2ludDE2ID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0FNRF9ncHVfc2hhZGVyX2ludDE2JywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19BTURfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0FNRF9zaGFkZXJfZnJhZ21lbnRfbWFzayA9IEV4dGVuc2lvbihuYW1lPSdWS19BTURfc2hhZGVyX2ZyYWdtZW50X21hc2snLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jayA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfaW5saW5lX3VuaWZvcm1fYmxvY2snLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9zaGFkZXJfc3RlbmNpbF9leHBvcnQgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX3NoYWRlcl9zdGVuY2lsX2V4cG9ydCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCcsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCitdKQorCitWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9ibGVuZF9vcGVyYXRpb25fYWR2YW5jZWQnLCB2ZXJzaW9uPTIsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX05WX2ZyYWdtZW50X2NvdmVyYWdlX3RvX2NvbG9yID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX05WX2ZyYWdtZW50X2NvdmVyYWdlX3RvX2NvbG9yJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX05WX2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX05WX2ZpbGxfcmVjdGFuZ2xlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX05WX2ZpbGxfcmVjdGFuZ2xlJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19FWFRfcG9zdF9kZXB0aF9jb3ZlcmFnZSA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfcG9zdF9kZXB0aF9jb3ZlcmFnZScsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfRVhUX2V4dGVuc2lvbl8xNTkgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX2V4dGVuc2lvbl8xNTknLCB2ZXJzaW9uPTAsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVyID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVyJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCitdKQorCitWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfdmFsaWRhdGlvbl9jYWNoZScsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorXSkKKworVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcnLCB2ZXJzaW9uPTIsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0VYVF9zaGFkZXJfdmlld3BvcnRfaW5kZXhfbGF5ZXIgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX3NoYWRlcl92aWV3cG9ydF9pbmRleF9sYXllcicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZfc2hhZGluZ19yYXRlX2ltYWdlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZScsIHZlcnNpb249MywgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorXSkKKworVktfTlZfcmF5X3RyYWNpbmcgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfcmF5X3RyYWNpbmcnLCB2ZXJzaW9uPTIsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFRyYWNlUmF5c05WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVicsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ29tcGlsZURlZmVycmVkTlYnLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX05WX3JlcHJlc2VudGF0aXZlX2ZyYWdtZW50X3Rlc3QgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfcmVwcmVzZW50YXRpdmVfZnJhZ21lbnRfdGVzdCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfRVhUX2dsb2JhbF9wcmlvcml0eSA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfZ2xvYmFsX3ByaW9yaXR5JywgdmVyc2lvbj0yLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19FWFRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QgPSBFeHRlbnNpb24obmFtZT0nVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0JywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorXSkKKworVktfQU1EX2J1ZmZlcl9tYXJrZXIgPSBFeHRlbnNpb24obmFtZT0nVktfQU1EX2J1ZmZlcl9tYXJrZXInLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQnLCBkaXNwYXRjaD0nVmtDb21tYW5kQnVmZmVyJyksCitdKQorCitWS19FWFRfY2FsaWJyYXRlZF90aW1lc3RhbXBzID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQnLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorXSkKKworVktfQU1EX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMgPSBFeHRlbnNpb24obmFtZT0nVktfQU1EX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX0FNRF9tZW1vcnlfb3ZlcmFsbG9jYXRpb25fYmVoYXZpb3IgPSBFeHRlbnNpb24obmFtZT0nVktfQU1EX21lbW9yeV9vdmVyYWxsb2NhdGlvbl9iZWhhdmlvcicsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfRVhUX3ZlcnRleF9hdHRyaWJ1dGVfZGl2aXNvciA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yJywgdmVyc2lvbj0zLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19OVl9zaGFkZXJfc3ViZ3JvdXBfcGFydGl0aW9uZWQgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfc2hhZGVyX3N1Ymdyb3VwX3BhcnRpdGlvbmVkJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19OVl9jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlcyA9IEV4dGVuc2lvbihuYW1lPSdWS19OVl9jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlcycsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZfbWVzaF9zaGFkZXIgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfbWVzaF9zaGFkZXInLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRHJhd01lc2hUYXNrc05WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVicsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVicsIGRpc3BhdGNoPSdWa0NvbW1hbmRCdWZmZXInKSwKK10pCisKK1ZLX05WX2ZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpYyA9IEV4dGVuc2lvbihuYW1lPSdWS19OVl9mcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWMnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKK10pCisKK1ZLX05WX3NoYWRlcl9pbWFnZV9mb290cHJpbnQgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfc2hhZGVyX2ltYWdlX2Zvb3RwcmludCcsIHZlcnNpb249MSwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfTlZfc2Npc3Nvcl9leGNsdXNpdmUgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfc2Npc3Nvcl9leGNsdXNpdmUnLCB2ZXJzaW9uPTEsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorXSkKKworVktfTlZfZGV2aWNlX2RpYWdub3N0aWNfY2hlY2twb2ludHMgPSBFeHRlbnNpb24obmFtZT0nVktfTlZfZGV2aWNlX2RpYWdub3N0aWNfY2hlY2twb2ludHMnLCB2ZXJzaW9uPTIsIGd1YXJkPU5vbmUsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ21kU2V0Q2hlY2twb2ludE5WJywgZGlzcGF0Y2g9J1ZrQ29tbWFuZEJ1ZmZlcicpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYnLCBkaXNwYXRjaD0nVmtRdWV1ZScpLAorXSkKKworVktfRVhUX3BjaV9idXNfaW5mbyA9IEV4dGVuc2lvbihuYW1lPSdWS19FWFRfcGNpX2J1c19pbmZvJywgdmVyc2lvbj0xLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19HT09HTEVfaGxzbF9mdW5jdGlvbmFsaXR5MSA9IEV4dGVuc2lvbihuYW1lPSdWS19HT09HTEVfaGxzbF9mdW5jdGlvbmFsaXR5MScsIHZlcnNpb249MCwgZ3VhcmQ9Tm9uZSwgY29tbWFuZHM9WworXSkKKworVktfR09PR0xFX2RlY29yYXRlX3N0cmluZyA9IEV4dGVuc2lvbihuYW1lPSdWS19HT09HTEVfZGVjb3JhdGVfc3RyaW5nJywgdmVyc2lvbj0wLCBndWFyZD1Ob25lLCBjb21tYW5kcz1bCitdKQorCitWS19LSFJfYW5kcm9pZF9zdXJmYWNlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9hbmRyb2lkX3N1cmZhY2UnLCB2ZXJzaW9uPTYsIGd1YXJkPSdWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFInLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSJywgZGlzcGF0Y2g9J1ZrSW5zdGFuY2UnKSwKK10pCisKK1ZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyJywgdmVyc2lvbj0zLCBndWFyZD0nVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSJywgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCcsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCitdKQorCitWS19GVUNIU0lBX2ltYWdlcGlwZV9zdXJmYWNlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0ZVQ0hTSUFfaW1hZ2VwaXBlX3N1cmZhY2UnLCB2ZXJzaW9uPTEsIGd1YXJkPSdWS19VU0VfUExBVEZPUk1fRlVDSFNJQScsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEnLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorXSkKKworVktfTVZLX2lvc19zdXJmYWNlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX01WS19pb3Nfc3VyZmFjZScsIHZlcnNpb249MiwgZ3VhcmQ9J1ZLX1VTRV9QTEFURk9STV9JT1NfTVZLJywgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVJT1NTdXJmYWNlTVZLJywgZGlzcGF0Y2g9J1ZrSW5zdGFuY2UnKSwKK10pCisKK1ZLX01WS19tYWNvc19zdXJmYWNlID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX01WS19tYWNvc19zdXJmYWNlJywgdmVyc2lvbj0yLCBndWFyZD0nVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSycsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLJywgZGlzcGF0Y2g9J1ZrSW5zdGFuY2UnKSwKK10pCisKK1ZLX05OX3ZpX3N1cmZhY2UgPSBFeHRlbnNpb24obmFtZT0nVktfTk5fdmlfc3VyZmFjZScsIHZlcnNpb249MSwgZ3VhcmQ9J1ZLX1VTRV9QTEFURk9STV9WSV9OTicsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrQ3JlYXRlVmlTdXJmYWNlTk4nLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorXSkKKworVktfS0hSX3dheWxhbmRfc3VyZmFjZSA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfd2F5bGFuZF9zdXJmYWNlJywgdmVyc2lvbj02LCBndWFyZD0nVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSJywgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUicsIGRpc3BhdGNoPSdWa0luc3RhbmNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorXSkKKworVktfS0hSX3dpbjMyX3N1cmZhY2UgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX3dpbjMyX3N1cmZhY2UnLCB2ZXJzaW9uPTYsIGd1YXJkPSdWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSJywgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVXaW4zMlN1cmZhY2VLSFInLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUicsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCitdKQorCitWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzInLCB2ZXJzaW9uPTEsIGd1YXJkPSdWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSJywgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUicsIGRpc3BhdGNoPSdWa0RldmljZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl93aW4zMl9rZXllZF9tdXRleCA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfd2luMzJfa2V5ZWRfbXV0ZXgnLCB2ZXJzaW9uPTEsIGd1YXJkPSdWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSJywgY29tbWFuZHM9WworXSkKKworVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV93aW4zMiA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyJywgdmVyc2lvbj0xLCBndWFyZD0nVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUicsIGNvbW1hbmRzPVsKKyAgICBDb21tYW5kKG5hbWU9J3ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKKyAgICBDb21tYW5kKG5hbWU9J3ZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX0tIUl9leHRlcm5hbF9mZW5jZV93aW4zMiA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzInLCB2ZXJzaW9uPTEsIGd1YXJkPSdWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSJywgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldEZlbmNlV2luMzJIYW5kbGVLSFInLCBkaXNwYXRjaD0nVmtEZXZpY2UnKSwKK10pCisKK1ZLX05WX2V4dGVybmFsX21lbW9yeV93aW4zMiA9IEV4dGVuc2lvbihuYW1lPSdWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzInLCB2ZXJzaW9uPTEsIGd1YXJkPSdWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSJywgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WJywgZGlzcGF0Y2g9J1ZrRGV2aWNlJyksCitdKQorCitWS19OVl93aW4zMl9rZXllZF9tdXRleCA9IEV4dGVuc2lvbihuYW1lPSdWS19OVl93aW4zMl9rZXllZF9tdXRleCcsIHZlcnNpb249MSwgZ3VhcmQ9J1ZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFInLCBjb21tYW5kcz1bCitdKQorCitWS19LSFJfeGNiX3N1cmZhY2UgPSBFeHRlbnNpb24obmFtZT0nVktfS0hSX3hjYl9zdXJmYWNlJywgdmVyc2lvbj02LCBndWFyZD0nVktfVVNFX1BMQVRGT1JNX1hDQl9LSFInLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0NyZWF0ZVhjYlN1cmZhY2VLSFInLCBkaXNwYXRjaD0nVmtJbnN0YW5jZScpLAorICAgIENvbW1hbmQobmFtZT0ndmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorXSkKKworVktfS0hSX3hsaWJfc3VyZmFjZSA9IEV4dGVuc2lvbihuYW1lPSdWS19LSFJfeGxpYl9zdXJmYWNlJywgdmVyc2lvbj02LCBndWFyZD0nVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSJywgY29tbWFuZHM9WworICAgIENvbW1hbmQobmFtZT0ndmtDcmVhdGVYbGliU3VyZmFjZUtIUicsIGRpc3BhdGNoPSdWa0luc3RhbmNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFInLCBkaXNwYXRjaD0nVmtQaHlzaWNhbERldmljZScpLAorXSkKKworVktfRVhUX2FjcXVpcmVfeGxpYl9kaXNwbGF5ID0gRXh0ZW5zaW9uKG5hbWU9J1ZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheScsIHZlcnNpb249MSwgZ3VhcmQ9J1ZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQnLCBjb21tYW5kcz1bCisgICAgQ29tbWFuZChuYW1lPSd2a0FjcXVpcmVYbGliRGlzcGxheUVYVCcsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCisgICAgQ29tbWFuZChuYW1lPSd2a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCcsIGRpc3BhdGNoPSdWa1BoeXNpY2FsRGV2aWNlJyksCitdKQorCitleHRlbnNpb25zID0gWworICAgIFZLX2NvcmVfMCwKKyAgICBWS19jb3JlXzEsCisgICAgVktfS0hSX3N1cmZhY2UsCisgICAgVktfS0hSX3N3YXBjaGFpbiwKKyAgICBWS19LSFJfZGlzcGxheSwKKyAgICBWS19LSFJfZGlzcGxheV9zd2FwY2hhaW4sCisgICAgVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UsCisgICAgVktfS0hSX211bHRpdmlldywKKyAgICBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiwKKyAgICBWS19LSFJfZGV2aWNlX2dyb3VwLAorICAgIFZLX0tIUl9zaGFkZXJfZHJhd19wYXJhbWV0ZXJzLAorICAgIFZLX0tIUl9tYWludGVuYW5jZTEsCisgICAgVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbiwKKyAgICBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcywKKyAgICBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5LAorICAgIFZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQsCisgICAgVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMsCisgICAgVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZSwKKyAgICBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkLAorICAgIFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IsCisgICAgVktfS0hSXzE2Yml0X3N0b3JhZ2UsCisgICAgVktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnQsCisgICAgVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlLAorICAgIFZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIsCisgICAgVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSwKKyAgICBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzLAorICAgIFZLX0tIUl9leHRlcm5hbF9mZW5jZSwKKyAgICBWS19LSFJfZXh0ZXJuYWxfZmVuY2VfZmQsCisgICAgVktfS0hSX21haW50ZW5hbmNlMiwKKyAgICBWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiwKKyAgICBWS19LSFJfdmFyaWFibGVfcG9pbnRlcnMsCisgICAgVktfS0hSX2dldF9kaXNwbGF5X3Byb3BlcnRpZXMyLAorICAgIFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiwKKyAgICBWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcywKKyAgICBWS19LSFJfcmVsYXhlZF9ibG9ja19sYXlvdXQsCisgICAgVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiwKKyAgICBWS19LSFJfaW1hZ2VfZm9ybWF0X2xpc3QsCisgICAgVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiwKKyAgICBWS19LSFJfYmluZF9tZW1vcnkyLAorICAgIFZLX0tIUl9tYWludGVuYW5jZTMsCisgICAgVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQsCisgICAgVktfS0hSXzhiaXRfc3RvcmFnZSwKKyAgICBWS19LSFJfc2hhZGVyX2F0b21pY19pbnQ2NCwKKyAgICBWS19LSFJfZHJpdmVyX3Byb3BlcnRpZXMsCisgICAgVktfS0hSX3Z1bGthbl9tZW1vcnlfbW9kZWwsCisgICAgVktfRVhUX2RlYnVnX3JlcG9ydCwKKyAgICBWS19OVl9nbHNsX3NoYWRlciwKKyAgICBWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkLAorICAgIFZLX0lNR19maWx0ZXJfY3ViaWMsCisgICAgVktfQU1EX3Jhc3Rlcml6YXRpb25fb3JkZXIsCisgICAgVktfQU1EX3NoYWRlcl90cmluYXJ5X21pbm1heCwKKyAgICBWS19BTURfc2hhZGVyX2V4cGxpY2l0X3ZlcnRleF9wYXJhbWV0ZXIsCisgICAgVktfRVhUX2RlYnVnX21hcmtlciwKKyAgICBWS19BTURfZ2NuX3NoYWRlciwKKyAgICBWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiwKKyAgICBWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrLAorICAgIFZLX0FNRF9kcmF3X2luZGlyZWN0X2NvdW50LAorICAgIFZLX0FNRF9uZWdhdGl2ZV92aWV3cG9ydF9oZWlnaHQsCisgICAgVktfQU1EX2dwdV9zaGFkZXJfaGFsZl9mbG9hdCwKKyAgICBWS19BTURfc2hhZGVyX2JhbGxvdCwKKyAgICBWS19BTURfdGV4dHVyZV9nYXRoZXJfYmlhc19sb2QsCisgICAgVktfQU1EX3NoYWRlcl9pbmZvLAorICAgIFZLX0FNRF9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9sb2QsCisgICAgVktfTlZfY29ybmVyX3NhbXBsZWRfaW1hZ2UsCisgICAgVktfSU1HX2Zvcm1hdF9wdnJ0YywKKyAgICBWS19OVl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzLAorICAgIFZLX05WX2V4dGVybmFsX21lbW9yeSwKKyAgICBWS19FWFRfdmFsaWRhdGlvbl9mbGFncywKKyAgICBWS19FWFRfc2hhZGVyX3N1Ymdyb3VwX2JhbGxvdCwKKyAgICBWS19FWFRfc2hhZGVyX3N1Ymdyb3VwX3ZvdGUsCisgICAgVktfRVhUX2FzdGNfZGVjb2RlX21vZGUsCisgICAgVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZywKKyAgICBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcywKKyAgICBWS19OVl9jbGlwX3NwYWNlX3dfc2NhbGluZywKKyAgICBWS19FWFRfZGlyZWN0X21vZGVfZGlzcGxheSwKKyAgICBWS19FWFRfZGlzcGxheV9zdXJmYWNlX2NvdW50ZXIsCisgICAgVktfRVhUX2Rpc3BsYXlfY29udHJvbCwKKyAgICBWS19HT09HTEVfZGlzcGxheV90aW1pbmcsCisgICAgVktfTlZfc2FtcGxlX21hc2tfb3ZlcnJpZGVfY292ZXJhZ2UsCisgICAgVktfTlZfZ2VvbWV0cnlfc2hhZGVyX3Bhc3N0aHJvdWdoLAorICAgIFZLX05WX3ZpZXdwb3J0X2FycmF5MiwKKyAgICBWS19OVlhfbXVsdGl2aWV3X3Blcl92aWV3X2F0dHJpYnV0ZXMsCisgICAgVktfTlZfdmlld3BvcnRfc3dpenpsZSwKKyAgICBWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzLAorICAgIFZLX0VYVF9jb25zZXJ2YXRpdmVfcmFzdGVyaXphdGlvbiwKKyAgICBWS19FWFRfc3dhcGNoYWluX2NvbG9yc3BhY2UsCisgICAgVktfRVhUX2hkcl9tZXRhZGF0YSwKKyAgICBWS19FWFRfZXh0ZXJuYWxfbWVtb3J5X2RtYV9idWYsCisgICAgVktfRVhUX3F1ZXVlX2ZhbWlseV9mb3JlaWduLAorICAgIFZLX0VYVF9kZWJ1Z191dGlscywKKyAgICBWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4LAorICAgIFZLX0FNRF9ncHVfc2hhZGVyX2ludDE2LAorICAgIFZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMsCisgICAgVktfQU1EX3NoYWRlcl9mcmFnbWVudF9tYXNrLAorICAgIFZLX0VYVF9pbmxpbmVfdW5pZm9ybV9ibG9jaywKKyAgICBWS19FWFRfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0LAorICAgIFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zLAorICAgIFZLX0VYVF9ibGVuZF9vcGVyYXRpb25fYWR2YW5jZWQsCisgICAgVktfTlZfZnJhZ21lbnRfY292ZXJhZ2VfdG9fY29sb3IsCisgICAgVktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlcywKKyAgICBWS19OVl9maWxsX3JlY3RhbmdsZSwKKyAgICBWS19FWFRfcG9zdF9kZXB0aF9jb3ZlcmFnZSwKKyAgICBWS19FWFRfZXh0ZW5zaW9uXzE1OSwKKyAgICBWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllciwKKyAgICBWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSwKKyAgICBWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZywKKyAgICBWS19FWFRfc2hhZGVyX3ZpZXdwb3J0X2luZGV4X2xheWVyLAorICAgIFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSwKKyAgICBWS19OVl9yYXlfdHJhY2luZywKKyAgICBWS19OVl9yZXByZXNlbnRhdGl2ZV9mcmFnbWVudF90ZXN0LAorICAgIFZLX0VYVF9nbG9iYWxfcHJpb3JpdHksCisgICAgVktfRVhUX2V4dGVybmFsX21lbW9yeV9ob3N0LAorICAgIFZLX0FNRF9idWZmZXJfbWFya2VyLAorICAgIFZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMsCisgICAgVktfQU1EX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMsCisgICAgVktfQU1EX21lbW9yeV9vdmVyYWxsb2NhdGlvbl9iZWhhdmlvciwKKyAgICBWS19FWFRfdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yLAorICAgIFZLX05WX3NoYWRlcl9zdWJncm91cF9wYXJ0aXRpb25lZCwKKyAgICBWS19OVl9jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlcywKKyAgICBWS19OVl9tZXNoX3NoYWRlciwKKyAgICBWS19OVl9mcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWMsCisgICAgVktfTlZfc2hhZGVyX2ltYWdlX2Zvb3RwcmludCwKKyAgICBWS19OVl9zY2lzc29yX2V4Y2x1c2l2ZSwKKyAgICBWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cywKKyAgICBWS19FWFRfcGNpX2J1c19pbmZvLAorICAgIFZLX0dPT0dMRV9obHNsX2Z1bmN0aW9uYWxpdHkxLAorICAgIFZLX0dPT0dMRV9kZWNvcmF0ZV9zdHJpbmcsCisgICAgVktfS0hSX2FuZHJvaWRfc3VyZmFjZSwKKyAgICBWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciwKKyAgICBWS19GVUNIU0lBX2ltYWdlcGlwZV9zdXJmYWNlLAorICAgIFZLX01WS19pb3Nfc3VyZmFjZSwKKyAgICBWS19NVktfbWFjb3Nfc3VyZmFjZSwKKyAgICBWS19OTl92aV9zdXJmYWNlLAorICAgIFZLX0tIUl93YXlsYW5kX3N1cmZhY2UsCisgICAgVktfS0hSX3dpbjMyX3N1cmZhY2UsCisgICAgVktfS0hSX2V4dGVybmFsX21lbW9yeV93aW4zMiwKKyAgICBWS19LSFJfd2luMzJfa2V5ZWRfbXV0ZXgsCisgICAgVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV93aW4zMiwKKyAgICBWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIsCisgICAgVktfTlZfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyLAorICAgIFZLX05WX3dpbjMyX2tleWVkX211dGV4LAorICAgIFZLX0tIUl94Y2Jfc3VyZmFjZSwKKyAgICBWS19LSFJfeGxpYl9zdXJmYWNlLAorICAgIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSwKK10KKyMgZW5kIG9mIGdlbmVyYXRlZCBjb2RlCisKK2RlZiBnZW5lcmF0ZV93cmFwcGVyX2hlYWRlcihndWFyZCk6CisgICAgY29weXJpZ2h0ID0gW10KKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyAgICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIikKKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKKyAgICBsaW5lcyA9IFtsaW5lLnJzdHJpcCgpIGZvciBsaW5lIGluIGNvcHlyaWdodF0KKworICAgIGxpbmVzLmFwcGVuZCgiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4iKQorICAgIGxpbmVzLmFwcGVuZCgiI2lmbmRlZiAlcyIgJSBndWFyZCkKKyAgICBsaW5lcy5hcHBlbmQoIiNkZWZpbmUgJXMiICUgZ3VhcmQpCisgICAgbGluZXMuYXBwZW5kKCIiKQorICAgIGxpbmVzLmFwcGVuZCgiI2lmZGVmIF9fY3BsdXNwbHVzIikKKyAgICBsaW5lcy5hcHBlbmQoImV4dGVybiBcIkNcIiB7IikKKyAgICBsaW5lcy5hcHBlbmQoIiNlbmRpZiIpCisgICAgbGluZXMuYXBwZW5kKCIiKQorICAgIGxpbmVzLmFwcGVuZCgiI2RlZmluZSBWS19OT19QUk9UT1RZUEVTIDEiKQorICAgIGxpbmVzLmFwcGVuZCgiI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4iKQorICAgIGxpbmVzLmFwcGVuZCgiIikKKyAgICBsaW5lcy5hcHBlbmQoIi8qIEluaXRpYWxpemUgdGhlIFZ1bGthbiBmdW5jdGlvbiBwb2ludGVyIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGlzIGhlYWRlci4iKQorICAgIGxpbmVzLmFwcGVuZCgiICogUmV0dXJucyAwIGlmIHZ1bGthbiBpcyBub3QgYXZhaWxhYmxlLCBub24temVybyBpZiBpdCBpcyBhdmFpbGFibGUuIikKKyAgICBsaW5lcy5hcHBlbmQoIiAqLyIpCisgICAgbGluZXMuYXBwZW5kKCJpbnQgSW5pdFZ1bGthbih2b2lkKTsiKQorICAgIGxpbmVzLmFwcGVuZCgiIikKKworICAgIGZvciBleHQgaW4gZXh0ZW5zaW9uczoKKyAgICAgICAgIyBPbmx5IHdyYXAgY29yZSBhbmQgV1NJIGZ1bmN0aW9ucworICAgICAgICB3cmFwcGVkX2V4dHMgPSB7J1ZLX2NvcmUnLCAnVktfS0hSJ30KKyAgICAgICAgaWYgbm90IGFueShleHQubmFtZS5zdGFydHN3aXRoKHMpIGZvciBzIGluIHdyYXBwZWRfZXh0cyk6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIGV4dC5ndWFyZDoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiI2lmZGVmICVzIiAlIGV4dC5ndWFyZCkKKworICAgICAgICBsaW5lcy5hcHBlbmQoIi8vICVzIiAlIGV4dC5uYW1lKQorICAgICAgICBmb3IgY21kIGluIGV4dC5jb21tYW5kczoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiZXh0ZXJuIFBGTl8lcyAlczsiICUgKGNtZC5uYW1lLCBjbWQubmFtZSkpCisKKyAgICAgICAgaWYgZXh0Lmd1YXJkOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIjZW5kaWYiKQorICAgICAgICBsaW5lcy5hcHBlbmQoIiIpCisKKyAgICBsaW5lcy5hcHBlbmQoIiIpCisgICAgbGluZXMuYXBwZW5kKCIiKQorICAgIGxpbmVzLmFwcGVuZCgiI2lmZGVmIF9fY3BsdXNwbHVzIikKKyAgICBsaW5lcy5hcHBlbmQoIn0iKQorICAgIGxpbmVzLmFwcGVuZCgiI2VuZGlmIikKKyAgICBsaW5lcy5hcHBlbmQoIiIpCisgICAgbGluZXMuYXBwZW5kKCIjZW5kaWYgIC8vICVzIiAlIGd1YXJkKQorCisgICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKKworZGVmIGdlbmVyYXRlX3dyYXBwZXJfc291cmNlKGhlYWRlcik6CisgICAgY29weXJpZ2h0ID0gW10KKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyAgICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIikKKyAgICBjb3B5cmlnaHQuYXBwZW5kKCIgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAiKQorICAgIGNvcHlyaWdodC5hcHBlbmQoIiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpCisgICAgY29weXJpZ2h0LmFwcGVuZCgiICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKKyAgICBsaW5lcyA9IFtsaW5lLnJzdHJpcCgpIGZvciBsaW5lIGluIGNvcHlyaWdodF0KKworICAgIGxpbmVzLmFwcGVuZCgiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4iKQorICAgIGxpbmVzLmFwcGVuZCgiI2lmZGVmIF9fY3BsdXNwbHVzIikKKyAgICBsaW5lcy5hcHBlbmQoImV4dGVybiBcIkNcIiB7IikKKyAgICBsaW5lcy5hcHBlbmQoIiNlbmRpZiIpCisgICAgbGluZXMuYXBwZW5kKCIiKQorICAgIGxpbmVzLmFwcGVuZCgiI2luY2x1ZGUgXCIlc1wiIiAlIGhlYWRlcikKKyAgICBsaW5lcy5hcHBlbmQoIiNpbmNsdWRlIDxkbGZjbi5oPiIpCisgICAgbGluZXMuYXBwZW5kKCIiKQorCisgICAgbGluZXMuYXBwZW5kKCJpbnQgSW5pdFZ1bGthbih2b2lkKSB7IikKKyAgICBsaW5lcy5hcHBlbmQoIiAgICB2b2lkKiBsaWJ2dWxrYW4gPSBkbG9wZW4oXCJsaWJ2dWxrYW4uc29cIiwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsiKQorICAgIGxpbmVzLmFwcGVuZCgiICAgIGlmICghbGlidnVsa2FuKSIpCisgICAgbGluZXMuYXBwZW5kKCIgICAgICAgIHJldHVybiAwOyIpCisgICAgbGluZXMuYXBwZW5kKCIiKQorICAgIGxpbmVzLmFwcGVuZCgiICAgIC8vIFZ1bGthbiBzdXBwb3J0ZWQsIHNldCBmdW5jdGlvbiBhZGRyZXNzZXMiKQorICAgIGZvciBleHQgaW4gZXh0ZW5zaW9uczoKKyAgICAgICAgIyBPbmx5IHdyYXAgY29yZSBhbmQgV1NJIGZ1bmN0aW9ucworICAgICAgICB3cmFwcGVkX2V4dHMgPSB7J1ZLX2NvcmUnLCAnVktfS0hSJ30KKyAgICAgICAgaWYgbm90IGFueShleHQubmFtZS5zdGFydHN3aXRoKHMpIGZvciBzIGluIHdyYXBwZWRfZXh0cyk6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIGV4dC5ndWFyZDoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiIikKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiI2lmZGVmICVzIiAlIGV4dC5ndWFyZCkKKworICAgICAgICBmb3IgY21kIGluIGV4dC5jb21tYW5kczoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiICAgICVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fJXM+KGRsc3ltKGxpYnZ1bGthbiwgXCIlc1wiKSk7IiAlIChjbWQubmFtZSwgY21kLm5hbWUsIGNtZC5uYW1lKSkKKworICAgICAgICBpZiBleHQuZ3VhcmQ6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoIiNlbmRpZiIpCisKKyAgICBsaW5lcy5hcHBlbmQoIiAgICByZXR1cm4gMTsiKQorICAgIGxpbmVzLmFwcGVuZCgifSIpCisgICAgbGluZXMuYXBwZW5kKCIiKQorCisgICAgbGluZXMuYXBwZW5kKCIvLyBObyBWdWxrYW4gc3VwcG9ydCwgZG8gbm90IHNldCBmdW5jdGlvbiBhZGRyZXNzZXMiKQorICAgIGZvciBleHQgaW4gZXh0ZW5zaW9uczoKKyAgICAgICAgaWYgZXh0Lmd1YXJkOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIiKQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIjaWZkZWYgJXMiICUgZXh0Lmd1YXJkKQorCisgICAgICAgIGZvciBjbWQgaW4gZXh0LmNvbW1hbmRzOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCJQRk5fJXMgJXM7IiAlIChjbWQubmFtZSwgY21kLm5hbWUpKQorCisgICAgICAgIGlmIGV4dC5ndWFyZDoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiI2VuZGlmIikKKworICAgIGxpbmVzLmFwcGVuZCgiIikKKyAgICBsaW5lcy5hcHBlbmQoIiNpZmRlZiBfX2NwbHVzcGx1cyIpCisgICAgbGluZXMuYXBwZW5kKCJ9IikKKyAgICBsaW5lcy5hcHBlbmQoIiNlbmRpZiIpCisKKyAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKQorCitkZWYgcGFyc2Vfc3ViaGVhZGVyKGZpbGVuYW1lLCBleHRfZ3VhcmQpOgorICAgIHN1Yl9leHRlbnNpb25zID0gW10KKworICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInIiKSBhcyBmOgorICAgICAgICBjdXJyZW50X2V4dCA9IE5vbmUKKyAgICAgICAgc3BlY192ZXJzaW9uID0gTm9uZQorCisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpOworCisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIiNkZWZpbmUgVktfQVBJX1ZFUlNJT04iKToKKyAgICAgICAgICAgICAgICBtaW5vcl9lbmQgPSBsaW5lLnJmaW5kKCIsIikKKyAgICAgICAgICAgICAgICBtaW5vcl9iZWdpbiA9IGxpbmUucmZpbmQoIiwiLCAwLCBtaW5vcl9lbmQpICsgMQorICAgICAgICAgICAgICAgIHNwZWNfdmVyc2lvbiA9IGludChsaW5lW21pbm9yX2JlZ2luOm1pbm9yX2VuZF0pCisgICAgICAgICAgICAgICAgIyBhZGQgY29yZQorICAgICAgICAgICAgICAgIGN1cnJlbnRfZXh0ID0gRXh0ZW5zaW9uKCJWS19jb3JlXyVzIiAlIHNwZWNfdmVyc2lvbiwgc3BlY192ZXJzaW9uKQorICAgICAgICAgICAgICAgIHN1Yl9leHRlbnNpb25zLmFwcGVuZChjdXJyZW50X2V4dCkKKyAgICAgICAgICAgIGVsaWYgQ29tbWFuZC52YWxpZF9jX3R5cGVkZWYobGluZSk6CisgICAgICAgICAgICAgICAgY3VycmVudF9leHQuYWRkX2NvbW1hbmQoQ29tbWFuZC5mcm9tX2NfdHlwZWRlZihsaW5lKSkKKyAgICAgICAgICAgIGVsaWYgbGluZS5zdGFydHN3aXRoKCIjZGVmaW5lIikgYW5kICJTUEVDX1ZFUlNJT04gIiBpbiBsaW5lOgorICAgICAgICAgICAgICAgIHZlcnNpb25fYmVnaW4gPSBsaW5lLnJmaW5kKCIgIikgKyAxCisgICAgICAgICAgICAgICAgc3BlY192ZXJzaW9uID0gaW50KGxpbmVbdmVyc2lvbl9iZWdpbjpdKQorICAgICAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoIiNkZWZpbmUiKSBhbmQgIkVYVEVOU0lPTl9OQU1FICIgaW4gbGluZToKKyAgICAgICAgICAgICAgICBuYW1lX2VuZCA9IGxpbmUucmZpbmQoIlwiIikKKyAgICAgICAgICAgICAgICBuYW1lX2JlZ2luID0gbGluZS5yZmluZCgiXCIiLCAwLCBuYW1lX2VuZCkgKyAxCisgICAgICAgICAgICAgICAgbmFtZSA9IGxpbmVbbmFtZV9iZWdpbjpuYW1lX2VuZF0KKyAgICAgICAgICAgICAgICAjIGFkZCBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBjdXJyZW50X2V4dCA9IEV4dGVuc2lvbihuYW1lLCBzcGVjX3ZlcnNpb24sIGV4dF9ndWFyZCkKKyAgICAgICAgICAgICAgICBzdWJfZXh0ZW5zaW9ucy5hcHBlbmQoY3VycmVudF9leHQpCisKKyAgICByZXR1cm4gc3ViX2V4dGVuc2lvbnM7CisKK2RlZiBwYXJzZV92dWxrYW5faChmaWxlbmFtZSk6CisgICAgZXh0ZW5zaW9ucyA9IFtdCisKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyIikgYXMgZjoKKyAgICAgICAgZXh0X2d1YXJkID0gTm9uZQorCisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpOworCisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIiNpbmNsdWRlIFwidnVsa2FuXyIpOgorICAgICAgICAgICAgICAgICMgRXh0cmFjdCB0aGUgZmlsZW5hbWUgYW5kIHBhcnNlIGl0LiAgTXVzdCBiZSBsb2NhbCB0byBzY3JpcHQgZmlsZSAobm8gcGF0aCkuCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5leHRlbmQocGFyc2Vfc3ViaGVhZGVyKGxpbmVbMTA6XS5yZXBsYWNlKCciJywgJycpLCBleHRfZ3VhcmQpKQorICAgICAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoIiNpZmRlZiBWS19VU0VfUExBVEZPUk0iKToKKyAgICAgICAgICAgICAgICBndWFyZF9iZWdpbiA9IGxpbmUuZmluZCgiICIpICsgMQorICAgICAgICAgICAgICAgIGV4dF9ndWFyZCA9IGxpbmVbZ3VhcmRfYmVnaW46XQorICAgICAgICAgICAgZWxpZiBleHRfZ3VhcmQgYW5kIGxpbmUuc3RhcnRzd2l0aCgiI2VuZGlmIikgYW5kIGV4dF9ndWFyZCBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGV4dF9ndWFyZCA9IE5vbmUKKworICAgIGZvciBleHQgaW4gZXh0ZW5zaW9uczoKKyAgICAgICAgcHJpbnQoIiVzID0gJXMiICUgKGV4dC5uYW1lLCByZXByKGV4dCkpKQorICAgICAgICBwcmludCgiIikKKworICAgIHByaW50KCJleHRlbnNpb25zID0gWyIpCisgICAgZm9yIGV4dCBpbiBleHRlbnNpb25zOgorICAgICAgICBwcmludCgiICAgICVzLCIgJSBleHQubmFtZSkKKyAgICBwcmludCgiXSIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgc3lzLmFyZ3ZbMV0gPT0gInBhcnNlIjoKKyAgICAgICAgcGFyc2VfdnVsa2FuX2goc3lzLmFyZ3ZbMl0pCisgICAgZWxzZToKKyAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlsxXQorICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKyAgICAgICAgY29udGVudHMgPSBbXQorCisgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoIi5oIik6CisgICAgICAgICAgICBjb250ZW50cyA9IGdlbmVyYXRlX3dyYXBwZXJfaGVhZGVyKGJhc2UucmVwbGFjZSgiLiIsICJfIikudXBwZXIoKSkKKyAgICAgICAgZWxpZiBiYXNlLmVuZHN3aXRoKCIuY3BwIik6CisgICAgICAgICAgICBjb250ZW50cyA9IGdlbmVyYXRlX3dyYXBwZXJfc291cmNlKGJhc2UucmVwbGFjZSgiLmNwcCIsICIuaCIpKQorCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmOgorICAgICAgICAgICAgcHJpbnQoY29udGVudHMsIGZpbGU9ZikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMva25vd25fZ29vZC5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9rbm93bl9nb29kLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1NmJkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMva25vd25fZ29vZC5qc29uCkBAIC0wLDAgKzEsNjYgQEAKK3sKKyAgInJlcG9zIiA6IFsKKyAgICB7CisgICAgICAibmFtZSIgOiAiZ2xzbGFuZyIsCisgICAgICAidXJsIiA6ICJodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsc2xhbmcuZ2l0IiwKKyAgICAgICJzdWJfZGlyIiA6ICJnbHNsYW5nIiwKKyAgICAgICJidWlsZF9kaXIiIDogImdsc2xhbmcvYnVpbGQiLAorICAgICAgImluc3RhbGxfZGlyIiA6ICJnbHNsYW5nL2J1aWxkL2luc3RhbGwiLAorICAgICAgImNvbW1pdCIgOiAiYjEzMTYzMGU3Yzc0OWE1ZGMxOWZhYTQ1ODAyNDI2MGM3MWZiMTcwZiIsCisgICAgICAicHJlYnVpbGQiIDogWworICAgICAgICAicHl0aG9uIHVwZGF0ZV9nbHNsYW5nX3NvdXJjZXMucHkiCisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSIgOiAiVnVsa2FuLUhlYWRlcnMiLAorICAgICAgInVybCIgOiAiaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tSGVhZGVycy5naXQiLAorICAgICAgInN1Yl9kaXIiIDogIlZ1bGthbi1IZWFkZXJzIiwKKyAgICAgICJidWlsZF9kaXIiIDogIlZ1bGthbi1IZWFkZXJzL2J1aWxkIiwKKyAgICAgICJpbnN0YWxsX2RpciIgOiAiVnVsa2FuLUhlYWRlcnMvYnVpbGQvaW5zdGFsbCIsCisgICAgICAiY29tbWl0IiA6ICJ2MS4xLjEzMCIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIiA6ICJNb2x0ZW5WSyIsCisgICAgICAidXJsIiA6ICJodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL01vbHRlblZLLmdpdCIsCisgICAgICAic3ViX2RpciIgOiAiTW9sdGVuVksiLAorICAgICAgImJ1aWxkX2RpciIgOiAiTW9sdGVuVksiLAorICAgICAgImluc3RhbGxfZGlyIiA6ICJNb2x0ZW5WSyIsCisgICAgICAiY29tbWl0IiA6ICJ2MS4wLjM4IiwKKyAgICAgICJjdXN0b21fYnVpbGQiIDogWworICAgICAgICAiLi9mZXRjaERlcGVuZGVuY2llcyAtLWdsc2xhbmctcm9vdCB7MFtnbHNsYW5nXVtyZXBvX2Rpcl19IiwKKyAgICAgICAgInhjb2RlYnVpbGQgLXByb2plY3QgTW9sdGVuVktQYWNrYWdpbmcueGNvZGVwcm9qIEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlM9JyRHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TIE1WS19DT05GSUdfTE9HX0xFVkVMPTEnIC1zY2hlbWUgXCJNb2x0ZW5WSyBQYWNrYWdlXCIgYnVpbGQiCisgICAgICBdLAorICAgICAgImJ1aWxkX3N0ZXAiIDogImN1c3RvbSIsCisgICAgICAiYnVpbGRfcGxhdGZvcm1zIiA6IFsKKyAgICAgICAgImRhcndpbiIKKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIiA6ICJWdWxrYW4tTG9hZGVyIiwKKyAgICAgICJ1cmwiIDogImh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLUxvYWRlci5naXQiLAorICAgICAgInN1Yl9kaXIiIDogIlZ1bGthbi1Mb2FkZXIiLAorICAgICAgImJ1aWxkX2RpciIgOiAiVnVsa2FuLUxvYWRlci9idWlsZCIsCisgICAgICAiaW5zdGFsbF9kaXIiIDogIlZ1bGthbi1Mb2FkZXIvYnVpbGQvaW5zdGFsbCIsCisgICAgICAiY29tbWl0IiA6ICJ2MS4xLjEzMCIsCisgICAgICAiZGVwcyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidmFyX25hbWUiIDogIlZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSIiwKKyAgICAgICAgICAicmVwb19uYW1lIiA6ICJWdWxrYW4tSGVhZGVycyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICJjbWFrZV9vcHRpb25zIiA6IFsKKyAgICAgICAgIi1EQlVJTERfVEVTVFM9Tk8iCisgICAgICBdLAorICAgICAgImJ1aWxkX3BsYXRmb3JtcyIgOiBbCisgICAgICAgICJsaW51eCIsCisgICAgICAgICJkYXJ3aW4iCisgICAgICBdCisgICAgfQorICBdLAorICAiaW5zdGFsbF9uYW1lcyIgOiB7CisgICAgICAiZ2xzbGFuZyIgOiAiR0xTTEFOR19JTlNUQUxMX0RJUiIsCisgICAgICAiVnVsa2FuLUhlYWRlcnMiIDogIlZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSIiwKKyAgICAgICJWdWxrYW4tTG9hZGVyIiA6ICJWVUxLQU5fTE9BREVSX0lOU1RBTExfRElSIiwKKyAgICAgICJNb2x0ZW5WSyIgOiAiTU9MVEVOVktfUkVQT19ST09UIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMva3Z0X2dlbnZrLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9rdnRfZ2VudmsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwMjFhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMva3Z0X2dlbnZrLnB5CkBAIC0wLDAgKzEsNDAzIEBACisjIS91c3IvYmluL3B5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBjUHJvZmlsZQoraW1wb3J0IHBkYgoraW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBvcworCisjIFNpbXBsZSB0aW1lciBmdW5jdGlvbnMKK3N0YXJ0VGltZSA9IE5vbmUKKworCitkZWYgc3RhcnRUaW1lcih0aW1laXQpOgorICAgIGdsb2JhbCBzdGFydFRpbWUKKyAgICBpZiB0aW1laXQ6CisgICAgICAgIHN0YXJ0VGltZSA9IHRpbWUucHJvY2Vzc190aW1lKCkKKworCitkZWYgZW5kVGltZXIodGltZWl0LCBtc2cpOgorICAgIGdsb2JhbCBzdGFydFRpbWUKKyAgICBpZiB0aW1laXQ6CisgICAgICAgIGVuZFRpbWUgPSB0aW1lLnByb2Nlc3NfdGltZSgpCisgICAgICAgIHdyaXRlKG1zZywgZW5kVGltZSAtIHN0YXJ0VGltZSwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBzdGFydFRpbWUgPSBOb25lCisKKyMgVHVybiBhIGxpc3Qgb2Ygc3RyaW5ncyBpbnRvIGEgcmVnZXhwIHN0cmluZyBtYXRjaGluZyBleGFjdGx5IHRob3NlIHN0cmluZ3MKKworCitkZWYgbWFrZVJFc3RyaW5nKGxpc3QsIGRlZmF1bHQ9Tm9uZSk6CisgICAgaWYgbGVuKGxpc3QpID4gMCBvciBkZWZhdWx0IGlzIE5vbmU6CisgICAgICAgIHJldHVybiAnXignICsgJ3wnLmpvaW4obGlzdCkgKyAnKSQnCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworIyBSZXR1cm5zIGEgZGlyZWN0b3J5IG9mIFsgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBnZW5lcmF0b3Igb3B0aW9ucyBdIGluZGV4ZWQKKyMgYnkgc3BlY2lmaWVkIHNob3J0IG5hbWVzLiBUaGUgZ2VuZXJhdG9yIG9wdGlvbnMgaW5jb3Jwb3JhdGUgdGhlIGZvbGxvd2luZworIyBwYXJhbWV0ZXJzOgorIworIyBhcmdzIGlzIGFuIHBhcnNlZCBhcmd1bWVudCBvYmplY3Q7IHNlZSBiZWxvdyBmb3IgdGhlIGZpZWxkcyB0aGF0IGFyZSB1c2VkLgorCisKK2RlZiBtYWtlR2VuT3B0cyhhcmdzKToKKyAgICBnbG9iYWwgZ2VuT3B0cworICAgIGdlbk9wdHMgPSB7fQorCisgICAgIyBEZWZhdWx0IGNsYXNzIG9mIGV4dGVuc2lvbnMgdG8gaW5jbHVkZSwgb3IgTm9uZQorICAgIGRlZmF1bHRFeHRlbnNpb25zID0gYXJncy5kZWZhdWx0RXh0ZW5zaW9ucworCisgICAgIyBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgdG8gaW5jbHVkZSAobGlzdCBvZiBleHRlbnNpb25zKQorICAgIGV4dGVuc2lvbnMgPSBhcmdzLmV4dGVuc2lvbgorCisgICAgIyBFeHRlbnNpb25zIHRvIHJlbW92ZSAobGlzdCBvZiBleHRlbnNpb25zKQorICAgIHJlbW92ZUV4dGVuc2lvbnMgPSBhcmdzLnJlbW92ZUV4dGVuc2lvbnMKKworICAgICMgRXh0ZW5zaW9ucyB0byBlbWl0IChsaXN0IG9mIGV4dGVuc2lvbnMpCisgICAgZW1pdEV4dGVuc2lvbnMgPSBhcmdzLmVtaXRFeHRlbnNpb25zCisKKyAgICAjIEZlYXR1cmVzIHRvIGluY2x1ZGUgKGxpc3Qgb2YgZmVhdHVyZXMpCisgICAgZmVhdHVyZXMgPSBhcmdzLmZlYXR1cmUKKworICAgICMgV2hldGhlciB0byBkaXNhYmxlIGluY2x1c2lvbiBwcm90ZWN0IGluIGhlYWRlcnMKKyAgICBwcm90ZWN0ID0gYXJncy5wcm90ZWN0CisKKyAgICAjIE91dHB1dCB0YXJnZXQgZGlyZWN0b3J5CisgICAgZGlyZWN0b3J5ID0gYXJncy5kaXJlY3RvcnkKKworICAgICMgRGVzY3JpcHRpdmUgbmFtZXMgZm9yIHZhcmlvdXMgcmVnZXhwIHBhdHRlcm5zIHVzZWQgdG8gc2VsZWN0CisgICAgIyB2ZXJzaW9ucyBhbmQgZXh0ZW5zaW9ucworICAgIGFsbEZlYXR1cmVzID0gYWxsRXh0ZW5zaW9ucyA9ICcuKicKKyAgICBub0ZlYXR1cmVzID0gbm9FeHRlbnNpb25zID0gTm9uZQorCisgICAgIyBUdXJuIGxpc3RzIG9mIG5hbWVzL3BhdHRlcm5zIGludG8gbWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9ucworICAgIGFkZEV4dGVuc2lvbnNQYXQgPSBtYWtlUkVzdHJpbmcoZXh0ZW5zaW9ucywgTm9uZSkKKyAgICByZW1vdmVFeHRlbnNpb25zUGF0ID0gbWFrZVJFc3RyaW5nKHJlbW92ZUV4dGVuc2lvbnMsIE5vbmUpCisgICAgZW1pdEV4dGVuc2lvbnNQYXQgPSBtYWtlUkVzdHJpbmcoZW1pdEV4dGVuc2lvbnMsIGFsbEV4dGVuc2lvbnMpCisgICAgZmVhdHVyZXNQYXQgPSBtYWtlUkVzdHJpbmcoZmVhdHVyZXMsIGFsbEZlYXR1cmVzKQorCisgICAgIyBDb3B5cmlnaHQgdGV4dCBwcmVmaXhpbmcgYWxsIGhlYWRlcnMgKGxpc3Qgb2Ygc3RyaW5ncykuCisgICAgcHJlZml4U3RyaW5ncyA9IFsKKyAgICAgICAgJy8qJywKKyAgICAgICAgJyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4nLAorICAgICAgICAnKionLAorICAgICAgICAnKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7JywKKyAgICAgICAgJyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4nLAorICAgICAgICAnKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JywKKyAgICAgICAgJyoqJywKKyAgICAgICAgJyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnLAorICAgICAgICAnKionLAorICAgICAgICAnKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZScsCisgICAgICAgICcqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCcsCisgICAgICAgICcqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4nLAorICAgICAgICAnKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCcsCisgICAgICAgICcqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4nLAorICAgICAgICAnKi8nLAorICAgICAgICAnJworICAgIF0KKworICAgICMgVGV4dCBzcGVjaWZpYyB0byBWdWxrYW4gaGVhZGVycworICAgIHZrUHJlZml4U3RyaW5ncyA9IFsKKyAgICAgICAgJy8qJywKKyAgICAgICAgJyoqIFRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBLaHJvbm9zIFZ1bGthbiBYTUwgQVBJIFJlZ2lzdHJ5LicsCisgICAgICAgICcqKicsCisgICAgICAgICcqLycsCisgICAgICAgICcnCisgICAgXQorCisgICAgIyBEZWZhdWx0cyBmb3IgZ2VuZXJhdGluZyByZS1pbmNsdXNpb24gcHJvdGVjdGlvbiB3cmFwcGVycyAob3Igbm90KQorICAgIHByb3RlY3RGZWF0dXJlID0gcHJvdGVjdAorCisgICAgIyBBbiBBUEkgc3R5bGUgY29udmVudGlvbnMgb2JqZWN0CisgICAgY29udmVudGlvbnMgPSBWdWxrYW5Db252ZW50aW9ucygpCisKKyAgICAjIEhlbHBlciBmaWxlIGdlbmVyYXRvciBvcHRpb25zIGZvciB0eXBlbWFwX2hlbHBlci5oCisgICAgZ2VuT3B0c1sndmtfdHlwZW1hcF9oZWxwZXIuaCddID0gWworICAgICAgICBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zPWNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWU9J3ZrX3R5cGVtYXBfaGVscGVyLmgnLAorICAgICAgICAgICAgZGlyZWN0b3J5PWRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWU9J3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlPU5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucz1mZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucz1mZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zPSd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucz1hZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucz1yZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnM9ZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0PXByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBwcm90ZWN0RmVhdHVyZT1GYWxzZSwKKyAgICAgICAgICAgIGFwaWNhbGw9J1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5PSdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXA9J1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtPTQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cz1GYWxzZSwKKyAgICAgICAgICAgIGhlbHBlcl9maWxlX3R5cGU9J3R5cGVtYXBfaGVscGVyX2hlYWRlcicpCisgICAgXQorCisgICAgIyBPcHRpb25zIGZvciBtb2NrIElDRCBoZWFkZXIKKyAgICBnZW5PcHRzWydtb2NrX2ljZC5oJ10gPSBbCisgICAgICAgIE1vY2tJQ0RPdXRwdXRHZW5lcmF0b3IsCisgICAgICAgIE1vY2tJQ0RHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnM9Y29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZT0nbW9ja19pY2QuaCcsCisgICAgICAgICAgICBkaXJlY3Rvcnk9ZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZT0ndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGU9Tm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zPWZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zPWZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnM9J3Z1bGthbicsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zPWFkZEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zPXJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucz1lbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQ9cHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlPUZhbHNlLAorICAgICAgICAgICAgYXBpY2FsbD0nVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnk9J1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cD0nVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW09NDgsCisgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzPUZhbHNlLAorICAgICAgICAgICAgaGVscGVyX2ZpbGVfdHlwZT0nbW9ja19pY2RfaGVhZGVyJykKKyAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIG1vY2sgSUNEIGNwcAorICAgIGdlbk9wdHNbJ21vY2tfaWNkLmNwcCddID0gWworICAgICAgICBNb2NrSUNET3V0cHV0R2VuZXJhdG9yLAorICAgICAgICBNb2NrSUNER2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zPWNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWU9J21vY2tfaWNkLmNwcCcsCisgICAgICAgICAgICBkaXJlY3Rvcnk9ZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZT0ndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGU9Tm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zPWZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zPWZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnM9J3Z1bGthbicsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zPWFkZEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zPXJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucz1lbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQ9cHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlPUZhbHNlLAorICAgICAgICAgICAgYXBpY2FsbD0nVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnk9J1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cD0nVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW09NDgsCisgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzPUZhbHNlLAorICAgICAgICAgICAgaGVscGVyX2ZpbGVfdHlwZT0nbW9ja19pY2Rfc291cmNlJykKKyAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIHZ1bGthbmluZm8uaHBwCisgICAgZ2VuT3B0c1sndnVsa2FuaW5mby5ocHAnXSA9IFsKKyAgICAgICAgVnVsa2FuSW5mb0dlbmVyYXRvciwKKyAgICAgICAgVnVsa2FuSW5mb0dlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucz1jb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lPSd2dWxrYW5pbmZvLmhwcCcsCisgICAgICAgICAgICBkaXJlY3Rvcnk9ZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZT0ndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGU9Tm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zPWZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zPWZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnM9J3Z1bGthbicsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zPWFkZEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zPXJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucz1lbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQ9cHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlPUZhbHNlLAorICAgICAgICAgICAgYXBpY2FsbD0nVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnk9J1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cD0nVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW09NDgsCisgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzPUZhbHNlKQorICAgIF0KKworCisjIEdlbmVyYXRlIGEgdGFyZ2V0IGJhc2VkIG9uIHRoZSBvcHRpb25zIGluIHRoZSBtYXRjaGluZyBnZW5PcHRze30gb2JqZWN0LgorIyBUaGlzIGlzIGVuY2Fwc3VsYXRlZCBpbiBhIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBwcm9maWxlZCBhbmQvb3IgdGltZWQuCisjIFRoZSBhcmdzIHBhcmFtZXRlciBpcyBhbiBwYXJzZWQgYXJndW1lbnQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZworIyBmaWVsZHMgdGhhdCBhcmUgdXNlZDoKKyMgICB0YXJnZXQgLSB0YXJnZXQgdG8gZ2VuZXJhdGUKKyMgICBkaXJlY3RvcnkgLSBkaXJlY3RvcnkgdG8gZ2VuZXJhdGUgaXQgaW4KKyMgICBwcm90ZWN0IC0gVHJ1ZSBpZiByZS1pbmNsdXNpb24gd3JhcHBlcnMgc2hvdWxkIGJlIGNyZWF0ZWQKKyMgICBleHRlbnNpb25zIC0gbGlzdCBvZiBhZGRpdGlvbmFsIGV4dGVuc2lvbnMgdG8gaW5jbHVkZSBpbiBnZW5lcmF0ZWQKKyMgICBpbnRlcmZhY2VzCitkZWYgZ2VuVGFyZ2V0KGFyZ3MpOgorICAgIGdsb2JhbCBnZW5PcHRzCisKKyAgICAjIENyZWF0ZSBnZW5lcmF0b3Igb3B0aW9ucyB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICAgbWFrZUdlbk9wdHMoYXJncykKKworICAgIGlmIChhcmdzLnRhcmdldCBpbiBnZW5PcHRzLmtleXMoKSk6CisgICAgICAgIGNyZWF0ZUdlbmVyYXRvciA9IGdlbk9wdHNbYXJncy50YXJnZXRdWzBdCisgICAgICAgIG9wdGlvbnMgPSBnZW5PcHRzW2FyZ3MudGFyZ2V0XVsxXQorCisgICAgICAgIGlmIG5vdCBhcmdzLnF1aWV0OgorICAgICAgICAgICAgd3JpdGUoJyogQnVpbGRpbmcnLCBvcHRpb25zLmZpbGVuYW1lLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLnZlcnNpb25zICAgICAgICAgID0nLAorICAgICAgICAgICAgICAgICAgb3B0aW9ucy52ZXJzaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5lbWl0dmVyc2lvbnMgICAgICA9JywKKyAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZW1pdHZlcnNpb25zLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLmRlZmF1bHRFeHRlbnNpb25zID0nLAorICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0RXh0ZW5zaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5hZGRFeHRlbnNpb25zICAgICA9JywKKyAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWRkRXh0ZW5zaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5yZW1vdmVFeHRlbnNpb25zICA9JywKKyAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmVtb3ZlRXh0ZW5zaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5lbWl0RXh0ZW5zaW9ucyAgICA9JywKKyAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZW1pdEV4dGVuc2lvbnMsIGZpbGU9c3lzLnN0ZGVycikKKworICAgICAgICBzdGFydFRpbWVyKGFyZ3MudGltZSkKKyAgICAgICAgZ2VuID0gY3JlYXRlR2VuZXJhdG9yKGVyckZpbGU9ZXJyV2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5GaWxlPWVycldhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnRmlsZT1kaWFnKQorICAgICAgICByZWcuc2V0R2VuZXJhdG9yKGdlbikKKyAgICAgICAgcmVnLmFwaUdlbihvcHRpb25zKQorCisgICAgICAgIGlmIG5vdCBhcmdzLnF1aWV0OgorICAgICAgICAgICAgd3JpdGUoJyogR2VuZXJhdGVkJywgb3B0aW9ucy5maWxlbmFtZSwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBlbmRUaW1lcihhcmdzLnRpbWUsICcqIFRpbWUgdG8gZ2VuZXJhdGUgJyArIG9wdGlvbnMuZmlsZW5hbWUgKyAnID0nKQorICAgIGVsc2U6CisgICAgICAgIHdyaXRlKCdObyBnZW5lcmF0b3Igb3B0aW9ucyBmb3IgdW5rbm93biB0YXJnZXQ6JywKKyAgICAgICAgICAgICAgYXJncy50YXJnZXQsIGZpbGU9c3lzLnN0ZGVycikKKworCisjIC1mZWF0dXJlIG5hbWUKKyMgLWV4dGVuc2lvbiBuYW1lCisjIEZvciBib3RoLCAibmFtZSIgbWF5IGJlIGEgc2luZ2xlIG5hbWUsIG9yIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QKKyMgb2YgbmFtZXMsIG9yIGEgcmVndWxhciBleHByZXNzaW9uLgoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZGVmYXVsdEV4dGVuc2lvbnMnLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J3Z1bGthbicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGEgc2luZ2xlIGNsYXNzIG9mIGV4dGVuc2lvbnMgdG8gYWRkIHRvIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1leHRlbnNpb24nLCBhY3Rpb249J2FwcGVuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhbiBleHRlbnNpb24gb3IgZXh0ZW5zaW9ucyB0byBhZGQgdG8gdGFyZ2V0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXJlbW92ZUV4dGVuc2lvbnMnLCBhY3Rpb249J2FwcGVuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhbiBleHRlbnNpb24gb3IgZXh0ZW5zaW9ucyB0byByZW1vdmUgZnJvbSB0YXJnZXRzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZW1pdEV4dGVuc2lvbnMnLCBhY3Rpb249J2FwcGVuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhbiBleHRlbnNpb24gb3IgZXh0ZW5zaW9ucyB0byBlbWl0IGluIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1mZWF0dXJlJywgYWN0aW9uPSdhcHBlbmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYSBjb3JlIEFQSSBmZWF0dXJlIG5hbWUgb3IgbmFtZXMgdG8gYWRkIHRvIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgZGVidWdnaW5nJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZHVtcCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgZHVtcCB0byBzdGRlcnInKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kaWFnZmlsZScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nV3JpdGUgZGlhZ25vc3RpY3MgdG8gc3BlY2lmaWVkIGZpbGUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1lcnJmaWxlJywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdXcml0ZSBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHNwZWNpZmllZCBmaWxlIGluc3RlYWQgb2Ygc3RkZXJyJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctbm9wcm90ZWN0JywgZGVzdD0ncHJvdGVjdCcsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRGlzYWJsZSBpbmNsdXNpb24gcHJvdGVjdGlvbiBpbiBvdXRwdXQgaGVhZGVycycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXByb2ZpbGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIHByb2ZpbGluZycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXJlZ2lzdHJ5JywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSd2ay54bWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVXNlIHNwZWNpZmllZCByZWdpc3RyeSBmaWxlIGluc3RlYWQgb2YgdmsueG1sJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdGltZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgdGltaW5nJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdmFsaWRhdGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIGdyb3VwIHZhbGlkYXRpb24nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgYWN0aW9uPSdzdG9yZScsIGRlc3Q9J2RpcmVjdG9yeScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PScuJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0NyZWF0ZSB0YXJnZXQgYW5kIHJlbGF0ZWQgZmlsZXMgaW4gc3BlY2lmaWVkIGRpcmVjdG9yeScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgndGFyZ2V0JywgbWV0YXZhcj0ndGFyZ2V0JywgbmFyZ3M9Jz8nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSB0YXJnZXQnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1N1cHByZXNzIHNjcmlwdCBvdXRwdXQgZHVyaW5nIG5vcm1hbCBleGVjdXRpb24uJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdmVyYm9zZScsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLCBkZXN0PSdxdWlldCcsIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0VuYWJsZSBzY3JpcHQgb3V0cHV0IGR1cmluZyBub3JtYWwgZXhlY3V0aW9uLicpCisKKyAgICAjIFRoaXMgYXJndW1lbnQgdGVsbHMgdXMgd2hlcmUgdG8gbG9hZCB0aGUgc2NyaXB0IGZyb20gdGhlIFZ1bGthbi1IZWFkZXJzIHJlZ2lzdHJ5CisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXNjcmlwdHMnLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0ZpbmQgYWRkaXRpb25hbCBzY3JpcHRzIGluIHRoaXMgZGlyZWN0b3J5JykKKworICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICAjIGRlZmF1bHQgc2NyaXB0cyBwYXRoIHRvIGJlIHNhbWUgYXMgcmVnaXN0cnkKKyAgICBpZiBub3QgYXJncy5zY3JpcHRzOgorICAgICAgICBhcmdzLnNjcmlwdHMgPSBvcy5wYXRoLmRpcm5hbWUoYXJncy5yZWdpc3RyeSkKKworICAgIHNjcmlwdHNfZGlyZWN0b3J5X3BhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKKyAgICByZWdpc3RyeV9oZWFkZXJzX3BhdGggPSBvcy5wYXRoLmpvaW4oc2NyaXB0c19kaXJlY3RvcnlfcGF0aCwgYXJncy5zY3JpcHRzKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCByZWdpc3RyeV9oZWFkZXJzX3BhdGgpCisKKyAgICBmcm9tIHJlZyBpbXBvcnQgKgorICAgIGZyb20gZ2VuZXJhdG9yIGltcG9ydCB3cml0ZQorICAgIGZyb20gY2dlbmVyYXRvciBpbXBvcnQgQ0dlbmVyYXRvck9wdGlvbnMsIENPdXRwdXRHZW5lcmF0b3IKKworICAgICMgR2VuZXJhdG9yIE1vZGlmaWNhdGlvbnMKKyAgICBmcm9tIG1vY2tfaWNkX2dlbmVyYXRvciBpbXBvcnQgTW9ja0lDREdlbmVyYXRvck9wdGlvbnMsIE1vY2tJQ0RPdXRwdXRHZW5lcmF0b3IKKyAgICBmcm9tIHZ1bGthbl90b29sc19oZWxwZXJfZmlsZV9nZW5lcmF0b3IgaW1wb3J0IEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3IsIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zCisgICAgZnJvbSB2dWxrYW5pbmZvX2dlbmVyYXRvciBpbXBvcnQgVnVsa2FuSW5mb0dlbmVyYXRvciwgVnVsa2FuSW5mb0dlbmVyYXRvck9wdGlvbnMKKyAgICAjIFRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciB2a2NvbnZlbnRpb25zIHB5dGhvbjIgY29tcGF0aWJpbGl0eQorICAgIGltcG9ydCBhYmMKKyAgICBhYmMuQUJDID0gYWJjLkFCQ01ldGEoJ0FCQycsIChvYmplY3QsKSwge30pCisgICAgZnJvbSB2a2NvbnZlbnRpb25zIGltcG9ydCBWdWxrYW5Db252ZW50aW9ucworCisgICAgIyBUaGlzIHNwbGl0cyBhcmd1bWVudHMgd2hpY2ggYXJlIHNwYWNlLXNlcGFyYXRlZCBsaXN0cworICAgIGFyZ3MuZmVhdHVyZSA9IFtuYW1lIGZvciBhcmcgaW4gYXJncy5mZWF0dXJlIGZvciBuYW1lIGluIGFyZy5zcGxpdCgpXQorICAgIGFyZ3MuZXh0ZW5zaW9uID0gW25hbWUgZm9yIGFyZyBpbiBhcmdzLmV4dGVuc2lvbiBmb3IgbmFtZSBpbiBhcmcuc3BsaXQoKV0KKworICAgICMgTG9hZCAmIHBhcnNlIHJlZ2lzdHJ5CisgICAgcmVnID0gUmVnaXN0cnkoKQorCisgICAgc3RhcnRUaW1lcihhcmdzLnRpbWUpCisgICAgdHJlZSA9IGV0cmVlLnBhcnNlKGFyZ3MucmVnaXN0cnkpCisgICAgZW5kVGltZXIoYXJncy50aW1lLCAnKiBUaW1lIHRvIG1ha2UgRWxlbWVudFRyZWUgPScpCisKKyAgICBpZiBhcmdzLmRlYnVnOgorICAgICAgICBwZGIucnVuKCdyZWcubG9hZEVsZW1lbnRUcmVlKHRyZWUpJykKKyAgICBlbHNlOgorICAgICAgICBzdGFydFRpbWVyKGFyZ3MudGltZSkKKyAgICAgICAgcmVnLmxvYWRFbGVtZW50VHJlZSh0cmVlKQorICAgICAgICBlbmRUaW1lcihhcmdzLnRpbWUsICcqIFRpbWUgdG8gcGFyc2UgRWxlbWVudFRyZWUgPScpCisKKyAgICBpZiAoYXJncy52YWxpZGF0ZSk6CisgICAgICAgIHJlZy52YWxpZGF0ZUdyb3VwcygpCisKKyAgICBpZiAoYXJncy5kdW1wKToKKyAgICAgICAgd3JpdGUoJyogRHVtcGluZyByZWdpc3RyeSB0byByZWdkdW1wLnR4dCcsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmVnLmR1bXBSZWcoZmlsZWhhbmRsZT1vcGVuKCdyZWdkdW1wLnR4dCcsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykpCisKKyAgICAjIGNyZWF0ZSBlcnJvci93YXJuaW5nICYgZGlhZ25vc3RpYyBmaWxlcworICAgIGlmIChhcmdzLmVycmZpbGUpOgorICAgICAgICBlcnJXYXJuID0gb3BlbihhcmdzLmVycmZpbGUsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICBlbHNlOgorICAgICAgICBlcnJXYXJuID0gc3lzLnN0ZGVycgorCisgICAgaWYgKGFyZ3MuZGlhZ2ZpbGUpOgorICAgICAgICBkaWFnID0gb3BlbihhcmdzLmRpYWdmaWxlLCAndycsIGVuY29kaW5nPSd1dGYtOCcpCisgICAgZWxzZToKKyAgICAgICAgZGlhZyA9IE5vbmUKKworICAgIGlmIChhcmdzLmRlYnVnKToKKyAgICAgICAgcGRiLnJ1bignZ2VuVGFyZ2V0KGFyZ3MpJykKKyAgICBlbGlmIChhcmdzLnByb2ZpbGUpOgorICAgICAgICBpbXBvcnQgY1Byb2ZpbGUKKyAgICAgICAgaW1wb3J0IHBzdGF0cworICAgICAgICBjUHJvZmlsZS5ydW4oJ2dlblRhcmdldChhcmdzKScsICdwcm9maWxlLnR4dCcpCisgICAgICAgIHAgPSBwc3RhdHMuU3RhdHMoJ3Byb2ZpbGUudHh0JykKKyAgICAgICAgcC5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cygndGltZScpLnByaW50X3N0YXRzKDUwKQorICAgIGVsc2U6CisgICAgICAgIGdlblRhcmdldChhcmdzKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9tb2NrX2ljZF9nZW5lcmF0b3IucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9zY3JpcHRzL21vY2tfaWNkX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2YyY2FkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy9tb2NrX2ljZF9nZW5lcmF0b3IucHkKQEAgLTAsMCArMSwxMzE4IEBACisjIS91c3IvYmluL3B5dGhvbjMgLWkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBMdW5hckcsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisjCisjIFRoaXMgc2NyaXB0IGdlbmVyYXRlcyBhIE1vY2sgSUNEIHRoYXQgaW50ZXJjZXB0cyBhbG1vc3QgYWxsIFZ1bGthbgorIyAgZnVuY3Rpb25zLiBUaGF0IGxheWVyIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VmdWwgb3IgZXZlbiBjb21waWxhYmxlCisjICBpbiBpdHMgaW5pdGlhbCBzdGF0ZS4gUmF0aGVyIGl0J3MgaW50ZW5kZWQgdG8gYmUgYSBzdGFydGluZyBwb2ludCB0aGF0CisjICBjYW4gYmUgY29waWVkIGFuZCBjdXN0b21pemVkIHRvIGFzc2lzdCBpbiBjcmVhdGlvbiBvZiBhIG5ldyBsYXllci4KKworaW1wb3J0IG9zLHJlLHN5cworZnJvbSBnZW5lcmF0b3IgaW1wb3J0ICoKK2Zyb20gY29tbW9uX2NvZGVnZW4gaW1wb3J0ICoKKworCisjIE1vY2sgaGVhZGVyIGNvZGUKK0hFQURFUl9DX0NPREUgPSAnJycKK3VzaW5nIG11dGV4X3QgPSBzdGQ6Om11dGV4OwordXNpbmcgbG9ja19ndWFyZF90ID0gc3RkOjpsb2NrX2d1YXJkPG11dGV4X3Q+OwordXNpbmcgdW5pcXVlX2xvY2tfdCA9IHN0ZDo6dW5pcXVlX2xvY2s8bXV0ZXhfdD47CisKK3N0YXRpYyBtdXRleF90IGdsb2JhbF9sb2NrOworc3RhdGljIHVpbnQ2NF90IGdsb2JhbF91bmlxdWVfaGFuZGxlID0gMTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBTVVBQT1JURURfTE9BREVSX0lDRF9JTlRFUkZBQ0VfVkVSU0lPTiA9IDU7CitzdGF0aWMgdWludDMyX3QgbG9hZGVyX2ludGVyZmFjZV92ZXJzaW9uID0gMDsKK3N0YXRpYyBib29sIG5lZ290aWF0ZV9sb2FkZXJfaWNkX2ludGVyZmFjZV9jYWxsZWQgPSBmYWxzZTsKK3N0YXRpYyB2b2lkKiBDcmVhdGVEaXNwT2JqSGFuZGxlKCkgeworICAgIGF1dG8gaGFuZGxlID0gbmV3IFZLX0xPQURFUl9EQVRBOworICAgIHNldF9sb2FkZXJfbWFnaWNfdmFsdWUoaGFuZGxlKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorc3RhdGljIHZvaWQgRGVzdHJveURpc3BPYmpIYW5kbGUodm9pZCogaGFuZGxlKSB7CisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8VktfTE9BREVSX0RBVEEqPihoYW5kbGUpOworfQorJycnCisKKyMgTWFudWFsIGNvZGUgYXQgdGhlIHRvcCBvZiB0aGUgY3BwIHNvdXJjZSBmaWxlCitTT1VSQ0VfQ1BQX1BSRUZJWCA9ICcnJwordXNpbmcgc3RkOjp1bm9yZGVyZWRfbWFwOworCisvLyBNYXAgZGV2aWNlIG1lbW9yeSBoYW5kbGUgdG8gYW55IG1hcHBlZCBhbGxvY2F0aW9ucyB0aGF0IHdlJ2xsIG5lZWQgdG8gZnJlZSBvbiB1bm1hcAorc3RhdGljIHVub3JkZXJlZF9tYXA8VmtEZXZpY2VNZW1vcnksIHN0ZDo6dmVjdG9yPHZvaWQqPj4gbWFwcGVkX21lbW9yeV9tYXA7CisKK3N0YXRpYyBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsX2RldmljZSA9IG51bGxwdHI7CitzdGF0aWMgdW5vcmRlcmVkX21hcDxWa0RldmljZSwgdW5vcmRlcmVkX21hcDx1aW50MzJfdCwgdW5vcmRlcmVkX21hcDx1aW50MzJfdCwgVmtRdWV1ZT4+PiBxdWV1ZV9tYXA7CitzdGF0aWMgdW5vcmRlcmVkX21hcDxWa0RldmljZSwgdW5vcmRlcmVkX21hcDxWa0J1ZmZlciwgVmtCdWZmZXJDcmVhdGVJbmZvPj4gYnVmZmVyX21hcDsKKworLy8gVE9ETzogV291bGQgbGlrZSB0byBjb2RlZ2VuIHRoaXMgYnV0IGxpbWl0cyBhcmVuJ3QgaW4gWE1MCitzdGF0aWMgVmtQaHlzaWNhbERldmljZUxpbWl0cyBTZXRMaW1pdHMoVmtQaHlzaWNhbERldmljZUxpbWl0cyAqbGltaXRzKSB7CisgICAgbGltaXRzLT5tYXhJbWFnZURpbWVuc2lvbjFEID0gNDA5NjsKKyAgICBsaW1pdHMtPm1heEltYWdlRGltZW5zaW9uMkQgPSA0MDk2OworICAgIGxpbWl0cy0+bWF4SW1hZ2VEaW1lbnNpb24zRCA9IDI1NjsKKyAgICBsaW1pdHMtPm1heEltYWdlRGltZW5zaW9uQ3ViZSA9IDQwOTY7CisgICAgbGltaXRzLT5tYXhJbWFnZUFycmF5TGF5ZXJzID0gMjU2OworICAgIGxpbWl0cy0+bWF4VGV4ZWxCdWZmZXJFbGVtZW50cyA9IDY1NTM2OworICAgIGxpbWl0cy0+bWF4VW5pZm9ybUJ1ZmZlclJhbmdlID0gMTYzODQ7CisgICAgbGltaXRzLT5tYXhTdG9yYWdlQnVmZmVyUmFuZ2UgPSAxMzQyMTc3Mjg7CisgICAgbGltaXRzLT5tYXhQdXNoQ29uc3RhbnRzU2l6ZSA9IDEyODsKKyAgICBsaW1pdHMtPm1heE1lbW9yeUFsbG9jYXRpb25Db3VudCA9IDQwOTY7CisgICAgbGltaXRzLT5tYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50ID0gNDAwMDsKKyAgICBsaW1pdHMtPmJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgPSAxOworICAgIGxpbWl0cy0+c3BhcnNlQWRkcmVzc1NwYWNlU2l6ZSA9IDIxNDc0ODM2NDg7CisgICAgbGltaXRzLT5tYXhCb3VuZERlc2NyaXB0b3JTZXRzID0gNDsKKyAgICBsaW1pdHMtPm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzID0gMTY7CisgICAgbGltaXRzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyA9IDEyOworICAgIGxpbWl0cy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMgPSA0OworICAgIGxpbWl0cy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyA9IDE2OworICAgIGxpbWl0cy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUltYWdlcyA9IDQ7CisgICAgbGltaXRzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzID0gNDsKKyAgICBsaW1pdHMtPm1heFBlclN0YWdlUmVzb3VyY2VzID0gMTI4OworICAgIGxpbWl0cy0+bWF4RGVzY3JpcHRvclNldFNhbXBsZXJzID0gOTY7CisgICAgbGltaXRzLT5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMgPSA3MjsKKyAgICBsaW1pdHMtPm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMgPSA4OworICAgIGxpbWl0cy0+bWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzID0gMjQ7CisgICAgbGltaXRzLT5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljID0gNDsKKyAgICBsaW1pdHMtPm1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzID0gOTY7CisgICAgbGltaXRzLT5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlcyA9IDI0OworICAgIGxpbWl0cy0+bWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHMgPSA0OworICAgIGxpbWl0cy0+bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzID0gMTY7CisgICAgbGltaXRzLT5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzID0gMTY7CisgICAgbGltaXRzLT5tYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldCA9IDIwNDc7CisgICAgbGltaXRzLT5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUgPSAyMDQ4OworICAgIGxpbWl0cy0+bWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyA9IDY0OworICAgIGxpbWl0cy0+bWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsID0gNjQ7CisgICAgbGltaXRzLT5tYXhUZXNzZWxsYXRpb25QYXRjaFNpemUgPSAzMjsKKyAgICBsaW1pdHMtPm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMgPSA2NDsKKyAgICBsaW1pdHMtPm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzID0gNjQ7CisgICAgbGltaXRzLT5tYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzID0gMTIwOworICAgIGxpbWl0cy0+bWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyA9IDIwNDg7CisgICAgbGltaXRzLT5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzID0gNjQ7CisgICAgbGltaXRzLT5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyA9IDY0OworICAgIGxpbWl0cy0+bWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucyA9IDMyOworICAgIGxpbWl0cy0+bWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMgPSA2NDsKKyAgICBsaW1pdHMtPm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyA9IDY0OworICAgIGxpbWl0cy0+bWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyA9IDI1NjsKKyAgICBsaW1pdHMtPm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzID0gMTAyNDsKKyAgICBsaW1pdHMtPm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzID0gNjQ7CisgICAgbGltaXRzLT5tYXhGcmFnbWVudE91dHB1dEF0dGFjaG1lbnRzID0gNDsKKyAgICBsaW1pdHMtPm1heEZyYWdtZW50RHVhbFNyY0F0dGFjaG1lbnRzID0gMTsKKyAgICBsaW1pdHMtPm1heEZyYWdtZW50Q29tYmluZWRPdXRwdXRSZXNvdXJjZXMgPSA0OworICAgIGxpbWl0cy0+bWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemUgPSAxNjM4NDsKKyAgICBsaW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSA9IDY1NTM1OworICAgIGxpbWl0cy0+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzFdID0gNjU1MzU7CisgICAgbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMl0gPSA2NTUzNTsKKyAgICBsaW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyA9IDEyODsKKyAgICBsaW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBTaXplWzBdID0gMTI4OworICAgIGxpbWl0cy0+bWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMV0gPSAxMjg7CisgICAgbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSA9IDY0OworICAgIGxpbWl0cy0+c3ViUGl4ZWxQcmVjaXNpb25CaXRzID0gNDsKKyAgICBsaW1pdHMtPnN1YlRleGVsUHJlY2lzaW9uQml0cyA9IDQ7CisgICAgbGltaXRzLT5taXBtYXBQcmVjaXNpb25CaXRzID0gNDsKKyAgICBsaW1pdHMtPm1heERyYXdJbmRleGVkSW5kZXhWYWx1ZSA9IFVJTlQzMl9NQVg7CisgICAgbGltaXRzLT5tYXhEcmF3SW5kaXJlY3RDb3VudCA9IFVJTlQxNl9NQVg7CisgICAgbGltaXRzLT5tYXhTYW1wbGVyTG9kQmlhcyA9IDIuMGY7CisgICAgbGltaXRzLT5tYXhTYW1wbGVyQW5pc290cm9weSA9IDE2OworICAgIGxpbWl0cy0+bWF4Vmlld3BvcnRzID0gMTY7CisgICAgbGltaXRzLT5tYXhWaWV3cG9ydERpbWVuc2lvbnNbMF0gPSA0MDk2OworICAgIGxpbWl0cy0+bWF4Vmlld3BvcnREaW1lbnNpb25zWzFdID0gNDA5NjsKKyAgICBsaW1pdHMtPnZpZXdwb3J0Qm91bmRzUmFuZ2VbMF0gPSAtODE5MjsKKyAgICBsaW1pdHMtPnZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0gPSA4MTkxOworICAgIGxpbWl0cy0+dmlld3BvcnRTdWJQaXhlbEJpdHMgPSAwOworICAgIGxpbWl0cy0+bWluTWVtb3J5TWFwQWxpZ25tZW50ID0gNjQ7CisgICAgbGltaXRzLT5taW5UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudCA9IDE2OworICAgIGxpbWl0cy0+bWluVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudCA9IDE2OworICAgIGxpbWl0cy0+bWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCA9IDE2OworICAgIGxpbWl0cy0+bWluVGV4ZWxPZmZzZXQgPSAtODsKKyAgICBsaW1pdHMtPm1heFRleGVsT2Zmc2V0ID0gNzsKKyAgICBsaW1pdHMtPm1pblRleGVsR2F0aGVyT2Zmc2V0ID0gLTg7CisgICAgbGltaXRzLT5tYXhUZXhlbEdhdGhlck9mZnNldCA9IDc7CisgICAgbGltaXRzLT5taW5JbnRlcnBvbGF0aW9uT2Zmc2V0ID0gMC4wZjsKKyAgICBsaW1pdHMtPm1heEludGVycG9sYXRpb25PZmZzZXQgPSAwLjVmOworICAgIGxpbWl0cy0+c3ViUGl4ZWxJbnRlcnBvbGF0aW9uT2Zmc2V0Qml0cyA9IDQ7CisgICAgbGltaXRzLT5tYXhGcmFtZWJ1ZmZlcldpZHRoID0gNDA5NjsKKyAgICBsaW1pdHMtPm1heEZyYW1lYnVmZmVySGVpZ2h0ID0gNDA5NjsKKyAgICBsaW1pdHMtPm1heEZyYW1lYnVmZmVyTGF5ZXJzID0gMjU2OworICAgIGxpbWl0cy0+ZnJhbWVidWZmZXJDb2xvclNhbXBsZUNvdW50cyA9IDB4N0Y7CisgICAgbGltaXRzLT5mcmFtZWJ1ZmZlckRlcHRoU2FtcGxlQ291bnRzID0gMHg3RjsKKyAgICBsaW1pdHMtPmZyYW1lYnVmZmVyU3RlbmNpbFNhbXBsZUNvdW50cyA9IDB4N0Y7CisgICAgbGltaXRzLT5mcmFtZWJ1ZmZlck5vQXR0YWNobWVudHNTYW1wbGVDb3VudHMgPSAweDdGOworICAgIGxpbWl0cy0+bWF4Q29sb3JBdHRhY2htZW50cyA9IDQ7CisgICAgbGltaXRzLT5zYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyA9IDB4N0Y7CisgICAgbGltaXRzLT5zYW1wbGVkSW1hZ2VJbnRlZ2VyU2FtcGxlQ291bnRzID0gMHg3RjsKKyAgICBsaW1pdHMtPnNhbXBsZWRJbWFnZURlcHRoU2FtcGxlQ291bnRzID0gMHg3RjsKKyAgICBsaW1pdHMtPnNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMgPSAweDdGOworICAgIGxpbWl0cy0+c3RvcmFnZUltYWdlU2FtcGxlQ291bnRzID0gMHg3RjsKKyAgICBsaW1pdHMtPm1heFNhbXBsZU1hc2tXb3JkcyA9IDE7CisgICAgbGltaXRzLT50aW1lc3RhbXBDb21wdXRlQW5kR3JhcGhpY3MgPSBWS19UUlVFOworICAgIGxpbWl0cy0+dGltZXN0YW1wUGVyaW9kID0gMTsKKyAgICBsaW1pdHMtPm1heENsaXBEaXN0YW5jZXMgPSA4OworICAgIGxpbWl0cy0+bWF4Q3VsbERpc3RhbmNlcyA9IDg7CisgICAgbGltaXRzLT5tYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzID0gODsKKyAgICBsaW1pdHMtPmRpc2NyZXRlUXVldWVQcmlvcml0aWVzID0gMjsKKyAgICBsaW1pdHMtPnBvaW50U2l6ZVJhbmdlWzBdID0gMS4wZjsKKyAgICBsaW1pdHMtPnBvaW50U2l6ZVJhbmdlWzFdID0gNjQuMGY7CisgICAgbGltaXRzLT5saW5lV2lkdGhSYW5nZVswXSA9IDEuMGY7CisgICAgbGltaXRzLT5saW5lV2lkdGhSYW5nZVsxXSA9IDguMGY7CisgICAgbGltaXRzLT5wb2ludFNpemVHcmFudWxhcml0eSA9IDEuMGY7CisgICAgbGltaXRzLT5saW5lV2lkdGhHcmFudWxhcml0eSA9IDEuMGY7CisgICAgbGltaXRzLT5zdHJpY3RMaW5lcyA9IFZLX1RSVUU7CisgICAgbGltaXRzLT5zdGFuZGFyZFNhbXBsZUxvY2F0aW9ucyA9IFZLX1RSVUU7CisgICAgbGltaXRzLT5vcHRpbWFsQnVmZmVyQ29weU9mZnNldEFsaWdubWVudCA9IDE7CisgICAgbGltaXRzLT5vcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50ID0gMTsKKyAgICBsaW1pdHMtPm5vbkNvaGVyZW50QXRvbVNpemUgPSAyNTY7CisKKyAgICByZXR1cm4gKmxpbWl0czsKK30KKwordm9pZCBTZXRCb29sQXJyYXlUcnVlKFZrQm9vbDMyKiBib29sX2FycmF5LCB1aW50MzJfdCBudW1fYm9vbHMpCit7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9ib29sczsgKytpKSB7CisgICAgICAgIGJvb2xfYXJyYXlbaV0gPSBWS19UUlVFOworICAgIH0KK30KKycnJworCisjIE1hbnVhbCBjb2RlIGF0IHRoZSBlbmQgb2YgdGhlIGNwcCBzb3VyY2UgZmlsZQorU09VUkNFX0NQUF9QT1NURklYID0gJycnCisKK3N0YXRpYyBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGNhcmUgYWJvdXQgcGh5c2ljYWwgZGV2aWNlIGZ1bmN0aW9ucyBhbmQgcmV0dXJuIG51bGxwdHIgZm9yIG90aGVyIGZ1bmN0aW9ucworICAgIGNvbnN0IGF1dG8gJml0ZW0gPSBuYW1lX3RvX2Z1bmNwdHJfbWFwLmZpbmQoZnVuY05hbWUpOworICAgIGlmIChpdGVtICE9IG5hbWVfdG9fZnVuY3B0cl9tYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihpdGVtLT5zZWNvbmQpOworICAgIH0KKyAgICAvLyBNb2NrIHNob3VsZCBpbnRlcmNlcHQgYWxsIGZ1bmN0aW9ucyBzbyBpZiB3ZSBnZXQgaGVyZSBqdXN0IHJldHVybiBudWxsCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gLy8gbmFtZXNwYWNlIHZrbW9jaworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBFWFBPUlQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1OTApCisjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2Vsc2UKKyNkZWZpbmUgRVhQT1JUCisjZW5kaWYKKworZXh0ZXJuICJDIiB7CisKK0VYUE9SVCBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHZrX2ljZEdldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciogcE5hbWUpIHsKKyAgICBpZiAoIXZrbW9jazo6bmVnb3RpYXRlX2xvYWRlcl9pY2RfaW50ZXJmYWNlX2NhbGxlZCkgeworICAgICAgICB2a21vY2s6OmxvYWRlcl9pbnRlcmZhY2VfdmVyc2lvbiA9IDE7CisgICAgfQorICAgIHJldHVybiB2a21vY2s6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIHBOYW1lKTsKK30KKworRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtfaWNkR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyKiBwTmFtZSkgeworICAgIHJldHVybiB2a21vY2s6OkdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIoaW5zdGFuY2UsIHBOYW1lKTsKK30KKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a19pY2ROZWdvdGlhdGVMb2FkZXJJQ0RJbnRlcmZhY2VWZXJzaW9uKHVpbnQzMl90KiBwU3VwcG9ydGVkVmVyc2lvbikgeworICAgIHZrbW9jazo6bmVnb3RpYXRlX2xvYWRlcl9pY2RfaW50ZXJmYWNlX2NhbGxlZCA9IHRydWU7CisgICAgdmttb2NrOjpsb2FkZXJfaW50ZXJmYWNlX3ZlcnNpb24gPSAqcFN1cHBvcnRlZFZlcnNpb247CisgICAgaWYgKCpwU3VwcG9ydGVkVmVyc2lvbiA+IHZrbW9jazo6U1VQUE9SVEVEX0xPQURFUl9JQ0RfSU5URVJGQUNFX1ZFUlNJT04pIHsKKyAgICAgICAgKnBTdXBwb3J0ZWRWZXJzaW9uID0gdmttb2NrOjpTVVBQT1JURURfTE9BREVSX0lDRF9JTlRFUkZBQ0VfVkVSU0lPTjsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIHZrbW9jazo6RGVzdHJveVN1cmZhY2VLSFIoaW5zdGFuY2UsIHN1cmZhY2UsIHBBbGxvY2F0b3IpOworfQorCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkKQoreworICAgIHJldHVybiB2a21vY2s6OkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHN1cmZhY2UsIHBTdXBwb3J0ZWQpOworfQorCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpCit7CisgICAgcmV0dXJuIHZrbW9jazo6R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7Cit9CisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cykKK3sKKyAgICByZXR1cm4gdmttb2NrOjpHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMpOworfQorCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlQ291bnQsCisgICAgVmtQcmVzZW50TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKQoreworICAgIHJldHVybiB2a21vY2s6OkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFByZXNlbnRNb2RlQ291bnQsIHBQcmVzZW50TW9kZXMpOworfQorCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHJldHVybiB2a21vY2s6OkNyZWF0ZVhsaWJTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUiAqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVhjYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHJldHVybiB2a21vY2s6OkNyZWF0ZVhjYlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIgKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCitFWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHJldHVybiB2a21vY2s6OkNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUiAqLworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSICovCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHJldHVybiB2a21vY2s6OkNyZWF0ZVdpbjMyU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKK30KKyNlbmRpZiAvKiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSICovCisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKQoreworICAgIHJldHVybiB2a21vY2s6OkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihkZXZpY2UsIHN1cmZhY2UsIHBNb2Rlcyk7Cit9CisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RDb3VudCwKKyAgICBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0cykKK3sKKyAgICByZXR1cm4gdmttb2NrOjpHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwUmVjdENvdW50LCBwUmVjdHMpOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlVmlTdXJmYWNlTk4oaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX1ZJX05OICovCisKK0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpCit7CisgICAgcmV0dXJuIHZrbW9jazo6R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVChwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHJldHVybiB2a21vY2s6OkNyZWF0ZUlPU1N1cmZhY2VNVksoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7Cit9CisjZW5kaWYgLyogVktfVVNFX1BMQVRGT1JNX0lPU19NVksgKi8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgcmV0dXJuIHZrbW9jazo6Q3JlYXRlTWFjT1NTdXJmYWNlTVZLKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworfQorI2VuZGlmIC8qIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksgKi8KKworfSAvLyBlbmQgZXh0ZXJuICJDIgorCisnJycKKworQ1VTVE9NX0NfSU5URVJDRVBUUyA9IHsKKyd2a0NyZWF0ZUluc3RhbmNlJzogJycnCisgICAgLy8gVE9ETzogSWYgbG9hZGVyIHZlciA8PTQgSUNEIG11c3QgZmFpbCB3aXRoIFZLX0VSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVIgZm9yIGFsbCB2a0NyZWF0ZUluc3RhbmNlIGNhbGxzIHdpdGgKKyAgICAvLyAgYXBpVmVyc2lvbiBzZXQgdG8gPiBWdWxrYW4gMS4wIGJlY2F1c2UgdGhlIGxvYWRlciBpcyBzdGlsbCBhdCBpbnRlcmZhY2UgdmVyc2lvbiA8PSA0LiBPdGhlcndpc2UsIHRoZQorICAgIC8vICBJQ0Qgc2hvdWxkIGJlaGF2ZSBhcyBub3JtYWwuCisgICAgaWYgKGxvYWRlcl9pbnRlcmZhY2VfdmVyc2lvbiA8PSA0KSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSOworICAgIH0KKyAgICAqcEluc3RhbmNlID0gKFZrSW5zdGFuY2UpQ3JlYXRlRGlzcE9iakhhbmRsZSgpOworICAgIC8vIFRPRE86IElmIGVtdWxhdGluZyBzcGVjaWZpYyBkZXZpY2UgY2Fwcywgd2lsbCBuZWVkIHRvIGFkZCBpbnRlbGxpZ2VuY2UgaGVyZQorICAgIHJldHVybiBWS19TVUNDRVNTOworJycnLAorJ3ZrRGVzdHJveUluc3RhbmNlJzogJycnCisgICAgLy8gRGVzdHJveSBwaHlzaWNhbCBkZXZpY2UKKyAgICBEZXN0cm95RGlzcE9iakhhbmRsZSgodm9pZCopcGh5c2ljYWxfZGV2aWNlKTsKKworICAgIERlc3Ryb3lEaXNwT2JqSGFuZGxlKCh2b2lkKilpbnN0YW5jZSk7CisnJycsCisndmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMnOiAnJycKKyAgICBpZiAocFBoeXNpY2FsRGV2aWNlcykgeworICAgICAgICBpZiAoIXBoeXNpY2FsX2RldmljZSkgeworICAgICAgICAgICAgcGh5c2ljYWxfZGV2aWNlID0gKFZrUGh5c2ljYWxEZXZpY2UpQ3JlYXRlRGlzcE9iakhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgICpwUGh5c2ljYWxEZXZpY2VzID0gcGh5c2ljYWxfZGV2aWNlOworICAgIH0gZWxzZSB7CisgICAgICAgICpwUGh5c2ljYWxEZXZpY2VDb3VudCA9IDE7CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworJycnLAorJ3ZrQ3JlYXRlRGV2aWNlJzogJycnCisgICAgKnBEZXZpY2UgPSAoVmtEZXZpY2UpQ3JlYXRlRGlzcE9iakhhbmRsZSgpOworICAgIC8vIFRPRE86IElmIGVtdWxhdGluZyBzcGVjaWZpYyBkZXZpY2UgY2Fwcywgd2lsbCBuZWVkIHRvIGFkZCBpbnRlbGxpZ2VuY2UgaGVyZQorICAgIHJldHVybiBWS19TVUNDRVNTOworJycnLAorJ3ZrRGVzdHJveURldmljZSc6ICcnJworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgLy8gRmlyc3QgZGVzdHJveSBzdWItZGV2aWNlIG9iamVjdHMKKyAgICAvLyBEZXN0cm95IFF1ZXVlcworICAgIGZvciAoYXV0byBkZXZfcXVldWVfbWFwX3BhaXIgOiBxdWV1ZV9tYXApIHsKKyAgICAgICAgZm9yIChhdXRvIHF1ZXVlX2ZhbWlseV9tYXBfcGFpciA6IHF1ZXVlX21hcFtkZXZfcXVldWVfbWFwX3BhaXIuZmlyc3RdKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaW5kZXhfcXVldWVfcGFpciA6IHF1ZXVlX21hcFtkZXZfcXVldWVfbWFwX3BhaXIuZmlyc3RdW3F1ZXVlX2ZhbWlseV9tYXBfcGFpci5maXJzdF0pIHsKKyAgICAgICAgICAgICAgICBEZXN0cm95RGlzcE9iakhhbmRsZSgodm9pZCopaW5kZXhfcXVldWVfcGFpci5zZWNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHF1ZXVlX21hcC5jbGVhcigpOworICAgIC8vIE5vdyBkZXN0cm95IGRldmljZQorICAgIERlc3Ryb3lEaXNwT2JqSGFuZGxlKCh2b2lkKilkZXZpY2UpOworICAgIC8vIFRPRE86IElmIGVtdWxhdGluZyBzcGVjaWZpYyBkZXZpY2UgY2Fwcywgd2lsbCBuZWVkIHRvIGFkZCBpbnRlbGxpZ2VuY2UgaGVyZQorJycnLAorJ3ZrR2V0RGV2aWNlUXVldWUnOiAnJycKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgIGF1dG8gcXVldWUgPSBxdWV1ZV9tYXBbZGV2aWNlXVtxdWV1ZUZhbWlseUluZGV4XVtxdWV1ZUluZGV4XTsKKyAgICBpZiAocXVldWUpIHsKKyAgICAgICAgKnBRdWV1ZSA9IHF1ZXVlOworICAgIH0gZWxzZSB7CisgICAgICAgICpwUXVldWUgPSBxdWV1ZV9tYXBbZGV2aWNlXVtxdWV1ZUZhbWlseUluZGV4XVtxdWV1ZUluZGV4XSA9IChWa1F1ZXVlKUNyZWF0ZURpc3BPYmpIYW5kbGUoKTsKKyAgICB9CisgICAgLy8gVE9ETzogSWYgZW11bGF0aW5nIHNwZWNpZmljIGRldmljZSBjYXBzLCB3aWxsIG5lZWQgdG8gYWRkIGludGVsbGlnZW5jZSBoZXJlCisgICAgcmV0dXJuOworJycnLAorJ3ZrR2V0RGV2aWNlUXVldWUyJzogJycnCisgICAgR2V0RGV2aWNlUXVldWUoZGV2aWNlLCBwUXVldWVJbmZvLT5xdWV1ZUZhbWlseUluZGV4LCBwUXVldWVJbmZvLT5xdWV1ZUluZGV4LCBwUXVldWUpOworICAgIC8vIFRPRE86IEFkZCBmdXJ0aGVyIHN1cHBvcnQgZm9yIEdldERldmljZVF1ZXVlMiBmZWF0dXJlcworJycnLAorJ3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnOiAnJycKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyc6ICcnJworICAgIHJldHVybiBWS19TVUNDRVNTOworJycnLAorJ3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJzogJycnCisgICAgLy8gSWYgcmVxdWVzdGluZyBudW1iZXIgb2YgZXh0ZW5zaW9ucywgcmV0dXJuIHRoYXQKKyAgICBpZiAoIXBMYXllck5hbWUpIHsKKyAgICAgICAgaWYgKCFwUHJvcGVydGllcykgeworICAgICAgICAgICAgKnBQcm9wZXJ0eUNvdW50ID0gKHVpbnQzMl90KWluc3RhbmNlX2V4dGVuc2lvbl9tYXAuc2l6ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm5hbWVfdmVyX3BhaXIgOiBpbnN0YW5jZV9leHRlbnNpb25fbWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gKnBQcm9wZXJ0eUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0cm5jcHkocFByb3BlcnRpZXNbaV0uZXh0ZW5zaW9uTmFtZSwgbmFtZV92ZXJfcGFpci5maXJzdC5jX3N0cigpLCBzaXplb2YocFByb3BlcnRpZXNbaV0uZXh0ZW5zaW9uTmFtZSkpOworICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2ldLmV4dGVuc2lvbk5hbWVbc2l6ZW9mKHBQcm9wZXJ0aWVzW2ldLmV4dGVuc2lvbk5hbWUpIC0gMV0gPSAwOworICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2ldLnNwZWNWZXJzaW9uID0gbmFtZV92ZXJfcGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgIT0gaW5zdGFuY2VfZXh0ZW5zaW9uX21hcC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfSU5DT01QTEVURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBJZiByZXF1ZXN0aW5nIGV4dGVuc2lvbiBwcm9wZXJ0aWVzLCBmaWxsIGluIGRhdGEgc3RydWN0IGZvciBudW1iZXIgb2YgZXh0ZW5zaW9ucworICAgIHJldHVybiBWS19TVUNDRVNTOworJycnLAorJ3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyc6ICcnJworICAgIC8vIElmIHJlcXVlc3RpbmcgbnVtYmVyIG9mIGV4dGVuc2lvbnMsIHJldHVybiB0aGF0CisgICAgaWYgKCFwTGF5ZXJOYW1lKSB7CisgICAgICAgIGlmICghcFByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgICpwUHJvcGVydHlDb3VudCA9ICh1aW50MzJfdClkZXZpY2VfZXh0ZW5zaW9uX21hcC5zaXplKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmbmFtZV92ZXJfcGFpciA6IGRldmljZV9leHRlbnNpb25fbWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gKnBQcm9wZXJ0eUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0cm5jcHkocFByb3BlcnRpZXNbaV0uZXh0ZW5zaW9uTmFtZSwgbmFtZV92ZXJfcGFpci5maXJzdC5jX3N0cigpLCBzaXplb2YocFByb3BlcnRpZXNbaV0uZXh0ZW5zaW9uTmFtZSkpOworICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2ldLmV4dGVuc2lvbk5hbWVbc2l6ZW9mKHBQcm9wZXJ0aWVzW2ldLmV4dGVuc2lvbk5hbWUpIC0gMV0gPSAwOworICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2ldLnNwZWNWZXJzaW9uID0gbmFtZV92ZXJfcGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgIT0gZGV2aWNlX2V4dGVuc2lvbl9tYXAuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0lOQ09NUExFVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgcmVxdWVzdGluZyBleHRlbnNpb24gcHJvcGVydGllcywgZmlsbCBpbiBkYXRhIHN0cnVjdCBmb3IgbnVtYmVyIG9mIGV4dGVuc2lvbnMKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUic6ICcnJworICAgIC8vIEN1cnJlbnRseSBhbHdheXMgc2F5IHRoYXQgYWxsIHByZXNlbnQgbW9kZXMgYXJlIHN1cHBvcnRlZAorICAgIGlmICghcFByZXNlbnRNb2RlcykgeworICAgICAgICAqcFByZXNlbnRNb2RlQ291bnQgPSA2OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgZmFsbGluZyB0aHJvdWdoIGFuZCBqdXN0IGZpbGxpbmcgaG93ZXZlciBtYW55IG1vZGVzIGFyZSByZXF1ZXN0ZWQKKyAgICAgICAgc3dpdGNoKCpwUHJlc2VudE1vZGVDb3VudCkgeworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBwUHJlc2VudE1vZGVzWzVdID0gVktfUFJFU0VOVF9NT0RFX1NIQVJFRF9DT05USU5VT1VTX1JFRlJFU0hfS0hSOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHBQcmVzZW50TW9kZXNbNF0gPSBWS19QUkVTRU5UX01PREVfU0hBUkVEX0RFTUFORF9SRUZSRVNIX0tIUjsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBwUHJlc2VudE1vZGVzWzNdID0gVktfUFJFU0VOVF9NT0RFX0ZJRk9fUkVMQVhFRF9LSFI7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcFByZXNlbnRNb2Rlc1syXSA9IFZLX1BSRVNFTlRfTU9ERV9GSUZPX0tIUjsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwUHJlc2VudE1vZGVzWzFdID0gVktfUFJFU0VOVF9NT0RFX01BSUxCT1hfS0hSOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwUHJlc2VudE1vZGVzWzBdID0gVktfUFJFU0VOVF9NT0RFX0lNTUVESUFURV9LSFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFInOiAnJycKKyAgICAvLyBDdXJyZW50bHkgYWx3YXlzIHNheSB0aGF0IFJHQkE4ICYgQkdSQTggYXJlIHN1cHBvcnRlZAorICAgIGlmICghcFN1cmZhY2VGb3JtYXRzKSB7CisgICAgICAgICpwU3VyZmFjZUZvcm1hdENvdW50ID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGxpbmcgdGhyb3VnaCBhbmQganVzdCBmaWxsaW5nIGhvd2V2ZXIgbWFueSB0eXBlcyBhcmUgcmVxdWVzdGVkCisgICAgICAgIHN3aXRjaCgqcFN1cmZhY2VGb3JtYXRDb3VudCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHNbMV0uZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzWzFdLmNvbG9yU3BhY2UgPSBWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFI7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1swXS5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHNbMF0uY29sb3JTcGFjZSA9IFZLX0NPTE9SX1NQQUNFX1NSR0JfTk9OTElORUFSX0tIUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworJycnLAorJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFInOiAnJycKKyAgICAvLyBDdXJyZW50bHkgYWx3YXlzIHNheSB0aGF0IFJHQkE4ICYgQkdSQTggYXJlIHN1cHBvcnRlZAorICAgIGlmICghcFN1cmZhY2VGb3JtYXRzKSB7CisgICAgICAgICpwU3VyZmFjZUZvcm1hdENvdW50ID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGxpbmcgdGhyb3VnaCBhbmQganVzdCBmaWxsaW5nIGhvd2V2ZXIgbWFueSB0eXBlcyBhcmUgcmVxdWVzdGVkCisgICAgICAgIHN3aXRjaCgqcFN1cmZhY2VGb3JtYXRDb3VudCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHNbMV0ucE5leHQgPSBudWxscHRyOworICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzWzFdLnN1cmZhY2VGb3JtYXQuZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzWzFdLnN1cmZhY2VGb3JtYXQuY29sb3JTcGFjZSA9IFZLX0NPTE9SX1NQQUNFX1NSR0JfTk9OTElORUFSX0tIUjsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzWzFdLnBOZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1swXS5zdXJmYWNlRm9ybWF0LmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1swXS5zdXJmYWNlRm9ybWF0LmNvbG9yU3BhY2UgPSBWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFInOiAnJycKKyAgICAvLyBDdXJyZW50bHkgc2F5IHRoYXQgYWxsIHN1cmZhY2UvcXVldWUgY29tYm9zIGFyZSBzdXBwb3J0ZWQKKyAgICAqcFN1cHBvcnRlZCA9IFZLX1RSVUU7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFInOiAnJycKKyAgICAvLyBJbiBnZW5lcmFsIGp1c3Qgc2F5IG1heCBzdXBwb3J0ZWQgaXMgYXZhaWxhYmxlIGZvciByZXF1ZXN0ZWQgc3VyZmFjZQorICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5taW5JbWFnZUNvdW50ID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWF4SW1hZ2VDb3VudCA9IDA7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRFeHRlbnQud2lkdGggPSAweEZGRkZGRkZGOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5jdXJyZW50RXh0ZW50LmhlaWdodCA9IDB4RkZGRkZGRkY7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPm1pbkltYWdlRXh0ZW50LndpZHRoID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWluSW1hZ2VFeHRlbnQuaGVpZ2h0ID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWF4SW1hZ2VFeHRlbnQud2lkdGggPSAzODQwOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUV4dGVudC5oZWlnaHQgPSAyMTYwOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUFycmF5TGF5ZXJzID0gMTI4OworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXBwb3J0ZWRUcmFuc2Zvcm1zID0gVktfU1VSRkFDRV9UUkFOU0ZPUk1fSURFTlRJVFlfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfOTBfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfMTgwX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fUk9UQVRFXzI3MF9CSVRfS0hSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzkwX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzE4MF9CSVRfS0hSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8yNzBfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9JTkhFUklUX0JJVF9LSFI7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRUcmFuc2Zvcm0gPSBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSA9IFZLX0NPTVBPU0lURV9BTFBIQV9PUEFRVUVfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9TSVRFX0FMUEhBX1BSRV9NVUxUSVBMSUVEX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0NPTVBPU0lURV9BTFBIQV9QT1NUX01VTFRJUExJRURfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9TSVRFX0FMUEhBX0lOSEVSSVRfQklUX0tIUjsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+c3VwcG9ydGVkVXNhZ2VGbGFncyA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVDsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFInOiAnJycKKyAgICBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBTdXJmYWNlSW5mby0+c3VyZmFjZSwgJnBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a0dldEluc3RhbmNlUHJvY0FkZHInOiAnJycKKyAgICBpZiAoIW5lZ290aWF0ZV9sb2FkZXJfaWNkX2ludGVyZmFjZV9jYWxsZWQpIHsKKyAgICAgICAgbG9hZGVyX2ludGVyZmFjZV92ZXJzaW9uID0gMDsKKyAgICB9CisgICAgY29uc3QgYXV0byAmaXRlbSA9IG5hbWVfdG9fZnVuY3B0cl9tYXAuZmluZChwTmFtZSk7CisgICAgaWYgKGl0ZW0gIT0gbmFtZV90b19mdW5jcHRyX21hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KGl0ZW0tPnNlY29uZCk7CisgICAgfQorICAgIC8vIE1vY2sgc2hvdWxkIGludGVyY2VwdCBhbGwgZnVuY3Rpb25zIHNvIGlmIHdlIGdldCBoZXJlIGp1c3QgcmV0dXJuIG51bGwKKyAgICByZXR1cm4gbnVsbHB0cjsKKycnJywKKyd2a0dldERldmljZVByb2NBZGRyJzogJycnCisgICAgcmV0dXJuIEdldEluc3RhbmNlUHJvY0FkZHIobnVsbHB0ciwgcE5hbWUpOworJycnLAorJ3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzJzogJycnCisgICAgcE1lbW9yeVByb3BlcnRpZXMtPm1lbW9yeVR5cGVDb3VudCA9IDI7CisgICAgcE1lbW9yeVByb3BlcnRpZXMtPm1lbW9yeVR5cGVzWzBdLnByb3BlcnR5RmxhZ3MgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDsKKyAgICBwTWVtb3J5UHJvcGVydGllcy0+bWVtb3J5VHlwZXNbMF0uaGVhcEluZGV4ID0gMDsKKyAgICBwTWVtb3J5UHJvcGVydGllcy0+bWVtb3J5VHlwZXNbMV0ucHJvcGVydHlGbGFncyA9IFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DQUNIRURfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUOworICAgIHBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlUeXBlc1sxXS5oZWFwSW5kZXggPSAxOworICAgIHBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlIZWFwQ291bnQgPSAyOworICAgIHBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlIZWFwc1swXS5mbGFncyA9IDA7CisgICAgcE1lbW9yeVByb3BlcnRpZXMtPm1lbW9yeUhlYXBzWzBdLnNpemUgPSA4MDAwMDAwMDAwOworICAgIHBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlIZWFwc1sxXS5mbGFncyA9IFZLX01FTU9SWV9IRUFQX0RFVklDRV9MT0NBTF9CSVQ7CisgICAgcE1lbW9yeVByb3BlcnRpZXMtPm1lbW9yeUhlYXBzWzFdLnNpemUgPSA4MDAwMDAwMDAwOworJycnLAorJ3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUic6ICcnJworICAgIEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgJnBNZW1vcnlQcm9wZXJ0aWVzLT5tZW1vcnlQcm9wZXJ0aWVzKTsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzJzogJycnCisgICAgaWYgKCFwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7CisgICAgICAgICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQpIHsKKyAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXNbMF0ucXVldWVGbGFncyA9IFZLX1FVRVVFX0dSQVBISUNTX0JJVCB8IFZLX1FVRVVFX0NPTVBVVEVfQklUIHwgVktfUVVFVUVfVFJBTlNGRVJfQklUIHwgVktfUVVFVUVfU1BBUlNFX0JJTkRJTkdfQklUOworICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllc1swXS5xdWV1ZUNvdW50ID0gMTsKKyAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXNbMF0udGltZXN0YW1wVmFsaWRCaXRzID0gMDsKKyAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXNbMF0ubWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5ID0gezEsMSwxfTsKKyAgICAgICAgfQorICAgIH0KKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUic6ICcnJworICAgIGlmIChwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ICYmIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHsKKyAgICAgICAgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsICZwUXVldWVGYW1pbHlQcm9wZXJ0aWVzLT5xdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBudWxscHRyKTsKKyAgICB9CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzJzogJycnCisgICAgdWludDMyX3QgbnVtX2Jvb2xzID0gc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcykgLyBzaXplb2YoVmtCb29sMzIpOworICAgIFZrQm9vbDMyICpib29sX2FycmF5ID0gJnBGZWF0dXJlcy0+cm9idXN0QnVmZmVyQWNjZXNzOworICAgIFNldEJvb2xBcnJheVRydWUoYm9vbF9hcnJheSwgbnVtX2Jvb2xzKTsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSJzogJycnCisgICAgR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhwaHlzaWNhbERldmljZSwgJnBGZWF0dXJlcy0+ZmVhdHVyZXMpOworICAgIHVpbnQzMl90IG51bV9ib29scyA9IDA7IC8vIENvdW50IG51bWJlciBvZiBWa0Jvb2wzMnMgaW4gZXh0ZW5zaW9uIHN0cnVjdHMKKyAgICBWa0Jvb2wzMiogZmVhdF9ib29scyA9IG51bGxwdHI7CisgICAgY29uc3QgYXV0byAqZGVzY19pZHhfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ+KHBGZWF0dXJlcy0+cE5leHQpOworICAgIGlmIChkZXNjX2lkeF9mZWF0dXJlcykgeworICAgICAgICBjb25zdCBhdXRvIGJvb2xfc2l6ZSA9IHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQpIC0gb2Zmc2V0b2YoVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhULCBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyk7CisgICAgICAgIG51bV9ib29scyA9IGJvb2xfc2l6ZS9zaXplb2YoVmtCb29sMzIpOworICAgICAgICBmZWF0X2Jvb2xzID0gKFZrQm9vbDMyKikmZGVzY19pZHhfZmVhdHVyZXMtPnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nOworICAgICAgICBTZXRCb29sQXJyYXlUcnVlKGZlYXRfYm9vbHMsIG51bV9ib29scyk7CisgICAgfQorICAgIGNvbnN0IGF1dG8gKmJsZW5kb3BfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUPihwRmVhdHVyZXMtPnBOZXh0KTsKKyAgICBpZiAoYmxlbmRvcF9mZWF0dXJlcykgeworICAgICAgICBjb25zdCBhdXRvIGJvb2xfc2l6ZSA9IHNpemVvZihWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKSAtIG9mZnNldG9mKFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQsIGFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMpOworICAgICAgICBudW1fYm9vbHMgPSBib29sX3NpemUvc2l6ZW9mKFZrQm9vbDMyKTsKKyAgICAgICAgZmVhdF9ib29scyA9IChWa0Jvb2wzMiopJmJsZW5kb3BfZmVhdHVyZXMtPmFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnM7CisgICAgICAgIFNldEJvb2xBcnJheVRydWUoZmVhdF9ib29scywgbnVtX2Jvb2xzKTsKKyAgICB9CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMnOiAnJycKKyAgICBpZiAoVktfRk9STUFUX1VOREVGSU5FRCA9PSBmb3JtYXQpIHsKKyAgICAgICAgKnBGb3JtYXRQcm9wZXJ0aWVzID0geyAweDAsIDB4MCwgMHgwIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogSnVzdCByZXR1cm5pbmcgZnVsbCBzdXBwb3J0IGZvciBldmVyeXRoaW5nIGluaXRpYWxseQorICAgICAgICAqcEZvcm1hdFByb3BlcnRpZXMgPSB7IDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYgfTsKKyAgICB9CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSJzogJycnCisgICAgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsICZwRm9ybWF0UHJvcGVydGllcy0+Zm9ybWF0UHJvcGVydGllcyk7CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyc6ICcnJworICAgIC8vIEEgaGFyZGNvZGVkIHVuc3VwcG9ydGVkIGZvcm1hdAorICAgIGlmIChmb3JtYXQgPT0gVktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzIpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIFRPRE86IEp1c3QgaGFyZC1jb2Rpbmcgc29tZSB2YWx1ZXMgZm9yIG5vdworICAgIC8vIFRPRE86IElmIHRpbGluZyBpcyBsaW5lYXIsIGxpbWl0IHRoZSBtaXBzLCBsZXZlbHMsICYgc2FtcGxlIGNvdW50CisgICAgaWYgKFZLX0lNQUdFX1RJTElOR19MSU5FQVIgPT0gdGlsaW5nKSB7CisgICAgICAgICpwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0geyB7IDQwOTYsIDQwOTYsIDI1NiB9LCAxLCAxLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIDQyOTQ5NjcyOTYgfTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBoYXJkLWNvZGUgc3VwcG9ydCBmb3IgYWxsIHNhbXBsZSBjb3VudHMgZXhjZXB0IDY0IGJpdHMuCisgICAgICAgICpwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0geyB7IDQwOTYsIDQwOTYsIDI1NiB9LCAxMiwgMjU2LCAweDdGICYgflZLX1NBTVBMRV9DT1VOVF82NF9CSVQsIDQyOTQ5NjcyOTYgfTsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFInOiAnJycKKyAgICBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcEltYWdlRm9ybWF0SW5mby0+Zm9ybWF0LCBwSW1hZ2VGb3JtYXRJbmZvLT50eXBlLCBwSW1hZ2VGb3JtYXRJbmZvLT50aWxpbmcsIHBJbWFnZUZvcm1hdEluZm8tPnVzYWdlLCBwSW1hZ2VGb3JtYXRJbmZvLT5mbGFncywgJnBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPmltYWdlRm9ybWF0UHJvcGVydGllcyk7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMnOiAnJycKKyAgICAvLyBUT0RPOiBKdXN0IGhhcmQtY29kaW5nIHNvbWUgdmFsdWVzIGZvciBub3cKKyAgICBwUHJvcGVydGllcy0+YXBpVmVyc2lvbiA9IFZLX0FQSV9WRVJTSU9OXzFfMDsKKyAgICBwUHJvcGVydGllcy0+ZHJpdmVyVmVyc2lvbiA9IDE7CisgICAgcFByb3BlcnRpZXMtPnZlbmRvcklEID0gMHhiYTVlYmExMTsKKyAgICBwUHJvcGVydGllcy0+ZGV2aWNlSUQgPSAweGYwMDViYTExOworICAgIHBQcm9wZXJ0aWVzLT5kZXZpY2VUeXBlID0gVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfVklSVFVBTF9HUFU7CisgICAgLy9zdGQ6OnN0cmluZyBkZXZOYW1lID0gIlZ1bGthbiBNb2NrIERldmljZSI7CisgICAgc3RyY3B5KHBQcm9wZXJ0aWVzLT5kZXZpY2VOYW1lLCAiVnVsa2FuIE1vY2sgRGV2aWNlIik7CisgICAgcFByb3BlcnRpZXMtPnBpcGVsaW5lQ2FjaGVVVUlEWzBdID0gMTg7CisgICAgcFByb3BlcnRpZXMtPmxpbWl0cyA9IFNldExpbWl0cygmcFByb3BlcnRpZXMtPmxpbWl0cyk7CisgICAgcFByb3BlcnRpZXMtPnNwYXJzZVByb3BlcnRpZXMgPSB7IFZLX1RSVUUsIFZLX1RSVUUsIFZLX1RSVUUsIFZLX1RSVUUsIFZLX1RSVUUgfTsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFInOiAnJycKKyAgICBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsICZwUHJvcGVydGllcy0+cHJvcGVydGllcyk7CisgICAgY29uc3QgYXV0byAqZGVzY19pZHhfcHJvcHMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVD4ocFByb3BlcnRpZXMtPnBOZXh0KTsKKyAgICBpZiAoZGVzY19pZHhfcHJvcHMpIHsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQqIHdyaXRlX3Byb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUKilkZXNjX2lkeF9wcm9wczsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29scyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IGZhbHNlOworICAgICAgICB3cml0ZV9wcm9wcy0+c2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBmYWxzZTsKKyAgICAgICAgd3JpdGVfcHJvcHMtPnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IGZhbHNlOworICAgICAgICB3cml0ZV9wcm9wcy0+c2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBmYWxzZTsKKyAgICAgICAgd3JpdGVfcHJvcHMtPnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gZmFsc2U7CisgICAgICAgIHdyaXRlX3Byb3BzLT5yb2J1c3RCdWZmZXJBY2Nlc3NVcGRhdGVBZnRlckJpbmQgPSB0cnVlOworICAgICAgICB3cml0ZV9wcm9wcy0+cXVhZERpdmVyZ2VudEltcGxpY2l0TG9kID0gdHJ1ZTsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzID0gNTAwMDAwOworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMgPSA1MDAwMDA7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgPSA1MDAwMDA7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzID0gNTAwMDAwOworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzID0gNTAwMDAwOworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzID0gNTAwMDAwOworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzID0gOTY7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljID0gODsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWMgPSA0OworICAgICAgICB3cml0ZV9wcm9wcy0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgPSA1MDAwMDA7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyA9IDUwMDAwMDsKKyAgICAgICAgd3JpdGVfcHJvcHMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzID0gNTAwMDAwOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gKnB1c2hfZGVzY3JpcHRvcl9wcm9wcyA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI+KHBQcm9wZXJ0aWVzLT5wTmV4dCk7CisgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9wcm9wcykgeworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKiB3cml0ZV9wcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKilwdXNoX2Rlc2NyaXB0b3JfcHJvcHM7CisgICAgICAgIHdyaXRlX3Byb3BzLT5tYXhQdXNoRGVzY3JpcHRvcnMgPSAyNTY7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqZGVwdGhfc3RlbmNpbF9yZXNvbHZlX3Byb3BzID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSPihwUHJvcGVydGllcy0+cE5leHQpOworICAgIGlmIChkZXB0aF9zdGVuY2lsX3Jlc29sdmVfcHJvcHMpIHsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKiB3cml0ZV9wcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIqKWRlcHRoX3N0ZW5jaWxfcmVzb2x2ZV9wcm9wczsKKyAgICAgICAgd3JpdGVfcHJvcHMtPnN1cHBvcnRlZERlcHRoUmVzb2x2ZU1vZGVzID0gVktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFI7CisgICAgICAgIHdyaXRlX3Byb3BzLT5zdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzID0gVktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFI7CisgICAgfQorJycnLAorJ3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMnOicnJworICAgIC8vIEhhcmQgY29kZSBzdXBwb3J0IGZvciBhbGwgaGFuZGxlIHR5cGVzIGFuZCBmZWF0dXJlcworICAgIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtPmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzID0gMHgxRjsKKyAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLT5jb21wYXRpYmxlSGFuZGxlVHlwZXMgPSAweDFGOworICAgIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtPmV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXMgPSAweDM7CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUic6JycnCisgICAgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworJycnLAorJ3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyc6JycnCisgICAgLy8gSGFyZC1jb2RlIHN1cHBvcnQgZm9yIGFsbCBoYW5kbGUgdHlwZXMgYW5kIGZlYXR1cmVzCisgICAgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLT5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyA9IDB4RjsKKyAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtPmNvbXBhdGlibGVIYW5kbGVUeXBlcyA9IDB4RjsKKyAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtPmV4dGVybmFsRmVuY2VGZWF0dXJlcyA9IDB4MzsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFInOicnJworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEZlbmNlSW5mbywgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKTsKKycnJywKKyd2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzJzonJycKKyAgICAvLyBIYXJkLWNvZGUgc3VwcG9ydCBmb3IgYWxsIGhhbmRsZSB0eXBlcyBhbmQgZmVhdHVyZXMKKyAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLT5leHRlcm5hbE1lbW9yeVByb3BlcnRpZXMuZXh0ZXJuYWxNZW1vcnlGZWF0dXJlcyA9IDB4NzsKKyAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLT5leHRlcm5hbE1lbW9yeVByb3BlcnRpZXMuZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgPSAweDFGRjsKKyAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLT5leHRlcm5hbE1lbW9yeVByb3BlcnRpZXMuY29tcGF0aWJsZUhhbmRsZVR5cGVzID0gMHgxRkY7CisnJycsCisndmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUic6JycnCisgICAgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEJ1ZmZlckluZm8sIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpOworJycnLAorJ3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzJzogJycnCisgICAgLy8gVE9ETzogSnVzdCBoYXJkLWNvZGluZyByZXFzIGZvciBub3cKKyAgICBwTWVtb3J5UmVxdWlyZW1lbnRzLT5zaXplID0gNDA5NjsKKyAgICBwTWVtb3J5UmVxdWlyZW1lbnRzLT5hbGlnbm1lbnQgPSAxOworICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPm1lbW9yeVR5cGVCaXRzID0gMHhGRkZGOworICAgIC8vIFJldHVybiBhIGJldHRlciBzaXplIGJhc2VkIG9uIHRoZSBidWZmZXIgc2l6ZSBmcm9tIHRoZSBjcmVhdGUgaW5mby4KKyAgICBhdXRvIGRfaXRlciA9IGJ1ZmZlcl9tYXAuZmluZChkZXZpY2UpOworICAgIGlmIChkX2l0ZXIgIT0gYnVmZmVyX21hcC5lbmQoKSkgeworICAgICAgICBhdXRvIGl0ZXIgPSBkX2l0ZXItPnNlY29uZC5maW5kKGJ1ZmZlcik7CisgICAgICAgIGlmIChpdGVyICE9IGRfaXRlci0+c2Vjb25kLmVuZCgpKSB7CisgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzLT5zaXplID0gKChpdGVyLT5zZWNvbmQuc2l6ZSArIDQwOTUpIC8gNDA5NikgKiA0MDk2OworICAgICAgICB9CisgICAgfQorJycnLAorJ3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUic6ICcnJworICAgIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIHBJbmZvLT5idWZmZXIsICZwTWVtb3J5UmVxdWlyZW1lbnRzLT5tZW1vcnlSZXF1aXJlbWVudHMpOworJycnLAorJ3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMnOiAnJycKKyAgICAvLyBUT0RPOiBKdXN0IGhhcmQtY29kaW5nIHJlcXMgZm9yIG5vdworICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPnNpemUgPSA0MDk2OworICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPmFsaWdubWVudCA9IDE7CisKKyAgICAvLyBIZXJlIHdlIGhhcmQtY29kZSB0aGF0IHRoZSBtZW1vcnkgdHlwZSBhdCBpbmRleCAzIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGltYWdlLgorICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPm1lbW9yeVR5cGVCaXRzID0gMHhGRkZGICYgfigweDEgPDwgMyk7CisnJycsCisndmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFInOiAnJycKKyAgICBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIHBJbmZvLT5pbWFnZSwgJnBNZW1vcnlSZXF1aXJlbWVudHMtPm1lbW9yeVJlcXVpcmVtZW50cyk7CisnJycsCisndmtNYXBNZW1vcnknOiAnJycKKyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOworICAgIC8vIFRPRE86IEp1c3QgaGFyZC1jb2RpbmcgNjRrIHdob2xlIHNpemUgZm9yIG5vdworICAgIGlmIChWS19XSE9MRV9TSVpFID09IHNpemUpCisgICAgICAgIHNpemUgPSAweDEwMDAwOworICAgIHZvaWQqIG1hcF9hZGRyID0gbWFsbG9jKChzaXplX3Qpc2l6ZSk7CisgICAgbWFwcGVkX21lbW9yeV9tYXBbbWVtb3J5XS5wdXNoX2JhY2sobWFwX2FkZHIpOworICAgICpwcERhdGEgPSBtYXBfYWRkcjsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a1VubWFwTWVtb3J5JzogJycnCisgICAgdW5pcXVlX2xvY2tfdCBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICBmb3IgKGF1dG8gbWFwX2FkZHIgOiBtYXBwZWRfbWVtb3J5X21hcFttZW1vcnldKSB7CisgICAgICAgIGZyZWUobWFwX2FkZHIpOworICAgIH0KKyAgICBtYXBwZWRfbWVtb3J5X21hcC5lcmFzZShtZW1vcnkpOworJycnLAorJ3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCc6ICcnJworICAgIC8vIE5lZWQgc2FmZSB2YWx1ZXMuIENhbGxlcnMgYXJlIGNvbXB1dGluZyBtZW1vcnkgb2Zmc2V0cyBmcm9tIHBMYXlvdXQsIHdpdGggbm8gcmV0dXJuIGNvZGUgdG8gZmxhZyBmYWlsdXJlLiAKKyAgICAqcExheW91dCA9IFZrU3VicmVzb3VyY2VMYXlvdXQoKTsgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciB6ZXJvIHZhbHVlcy4KKycnJywKKyd2a0dldFN3YXBjaGFpbkltYWdlc0tIUic6ICcnJworICAgIGlmICghcFN3YXBjaGFpbkltYWdlcykgeworICAgICAgICAqcFN3YXBjaGFpbkltYWdlQ291bnQgPSAxOworICAgIH0gZWxzZSBpZiAoKnBTd2FwY2hhaW5JbWFnZUNvdW50ID4gMCkgeworICAgICAgICBwU3dhcGNoYWluSW1hZ2VzWzBdID0gKFZrSW1hZ2UpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICAgICAgaWYgKCpwU3dhcGNoYWluSW1hZ2VDb3VudCAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gVktfSU5DT01QTEVURTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a0FjcXVpcmVOZXh0SW1hZ2VzS0hSJzogJycnCisgICAgKnBJbWFnZUluZGV4ID0gMDsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKKycnJywKKyd2a0NyZWF0ZUJ1ZmZlcic6ICcnJworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgKnBCdWZmZXIgPSAoVmtCdWZmZXIpZ2xvYmFsX3VuaXF1ZV9oYW5kbGUrKzsKKyAgICBidWZmZXJfbWFwW2RldmljZV1bKnBCdWZmZXJdID0gKnBDcmVhdGVJbmZvOworICAgIHJldHVybiBWS19TVUNDRVNTOworJycnLAorJ3ZrRGVzdHJveUJ1ZmZlcic6ICcnJworICAgIHVuaXF1ZV9sb2NrX3QgbG9jayhnbG9iYWxfbG9jayk7CisgICAgYnVmZmVyX21hcFtkZXZpY2VdLmVyYXNlKGJ1ZmZlcik7CisnJycsCit9CisKKyMgTW9ja0lDREdlbmVyYXRvck9wdGlvbnMgLSBzdWJjbGFzcyBvZiBHZW5lcmF0b3JPcHRpb25zLgorIworIyBBZGRzIG9wdGlvbnMgdXNlZCBieSBNb2NrSUNET3V0cHV0R2VuZXJhdG9yIG9iamVjdHMgZHVyaW5nIE1vY2sKKyMgSUNEIGdlbmVyYXRpb24uCisjCisjIEFkZGl0aW9uYWwgbWVtYmVycworIyAgIHByZWZpeFRleHQgLSBsaXN0IG9mIHN0cmluZ3MgdG8gcHJlZml4IGdlbmVyYXRlZCBoZWFkZXIgd2l0aAorIyAgICAgKHVzdWFsbHkgYSBjb3B5cmlnaHQgc3RhdGVtZW50ICsgY2FsbGluZyBjb252ZW50aW9uIG1hY3JvcykuCisjICAgcHJvdGVjdEZpbGUgLSBUcnVlIGlmIG11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0aW9uIHNob3VsZCBiZQorIyAgICAgZ2VuZXJhdGVkIChiYXNlZCBvbiB0aGUgZmlsZW5hbWUpIGFyb3VuZCB0aGUgZW50aXJlIGhlYWRlci4KKyMgICBwcm90ZWN0RmVhdHVyZSAtIFRydWUgaWYgI2lmbmRlZi4uI2VuZGlmIHByb3RlY3Rpb24gc2hvdWxkIGJlCisjICAgICBnZW5lcmF0ZWQgYXJvdW5kIGEgZmVhdHVyZSBpbnRlcmZhY2UgaW4gdGhlIGhlYWRlciBmaWxlLgorIyAgIGdlbkZ1bmNQb2ludGVycyAtIFRydWUgaWYgZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmcyBzaG91bGQgYmUKKyMgICAgIGdlbmVyYXRlZAorIyAgIHByb3RlY3RQcm90byAtIElmIGNvbmRpdGlvbmFsIHByb3RlY3Rpb24gc2hvdWxkIGJlIGdlbmVyYXRlZAorIyAgICAgYXJvdW5kIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMsIHNldCB0byBlaXRoZXIgJyNpZmRlZicKKyMgICAgIHRvIHJlcXVpcmUgb3B0LWluICgjaWZkZWYgcHJvdGVjdFByb3RvU3RyKSBvciAnI2lmbmRlZicKKyMgICAgIHRvIHJlcXVpcmUgb3B0LW91dCAoI2lmbmRlZiBwcm90ZWN0UHJvdG9TdHIpLiBPdGhlcndpc2UKKyMgICAgIHNldCB0byBOb25lLgorIyAgIHByb3RlY3RQcm90b1N0ciAtICNpZmRlZi8jaWZuZGVmIHN5bWJvbCB0byB1c2UgYXJvdW5kIHByb3RvdHlwZQorIyAgICAgZGVjbGFyYXRpb25zLCBpZiBwcm90ZWN0UHJvdG8gaXMgc2V0CisjICAgYXBpY2FsbCAtIHN0cmluZyB0byB1c2UgZm9yIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBwcmVmaXgsCisjICAgICBzdWNoIGFzIEFQSUNBTEwgb24gV2luZG93cy4KKyMgICBhcGllbnRyeSAtIHN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8sCisjICAgICBpbiB0eXBlZGVmcywgc3VjaCBhcyBBUElFTlRSWS4KKyMgICBhcGllbnRyeXAgLSBzdHJpbmcgdG8gdXNlIGZvciB0aGUgY2FsbGluZyBjb252ZW50aW9uIG1hY3JvCisjICAgICBpbiBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzLCBzdWNoIGFzIEFQSUVOVFJZUC4KKyMgICBpbmRlbnRGdW5jUHJvdG8gLSBUcnVlIGlmIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMgc2hvdWxkIHB1dCBlYWNoCisjICAgICBwYXJhbWV0ZXIgb24gYSBzZXBhcmF0ZSBsaW5lCisjICAgaW5kZW50RnVuY1BvaW50ZXIgLSBUcnVlIGlmIHR5cGVkZWZlZCBmdW5jdGlvbiBwb2ludGVycyBzaG91bGQgcHV0IGVhY2gKKyMgICAgIHBhcmFtZXRlciBvbiBhIHNlcGFyYXRlIGxpbmUKKyMgICBhbGlnbkZ1bmNQYXJhbSAtIGlmIG5vbnplcm8gYW5kIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHB1dCBvbiBhCisjICAgICBzZXBhcmF0ZSBsaW5lLCBhbGlnbiBwYXJhbWV0ZXIgbmFtZXMgYXQgdGhlIHNwZWNpZmllZCBjb2x1bW4KK2NsYXNzIE1vY2tJQ0RHZW5lcmF0b3JPcHRpb25zKEdlbmVyYXRvck9wdGlvbnMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBjb252ZW50aW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gJy4nLAorICAgICAgICAgICAgICAgICBhcGluYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZW1pdHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgc29ydFByb2NlZHVyZSA9IHJlZ1NvcnRGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgcHJlZml4VGV4dCA9ICIiLAorICAgICAgICAgICAgICAgICBnZW5GdW5jUG9pbnRlcnMgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0RmlsZSA9IFRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdFByb3RvID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdFByb3RvU3RyID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgYXBpY2FsbCA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeSA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeXAgPSAnJywKKyAgICAgICAgICAgICAgICAgaW5kZW50RnVuY1Byb3RvID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgaW5kZW50RnVuY1BvaW50ZXIgPSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgaGVscGVyX2ZpbGVfdHlwZSA9ICcnKToKKyAgICAgICAgR2VuZXJhdG9yT3B0aW9ucy5fX2luaXRfXyhzZWxmLCBjb252ZW50aW9ucywgZmlsZW5hbWUsIGRpcmVjdG9yeSwgYXBpbmFtZSwgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucywgZW1pdHZlcnNpb25zLCBkZWZhdWx0RXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zLCByZW1vdmVFeHRlbnNpb25zLCBlbWl0RXh0ZW5zaW9ucywgc29ydFByb2NlZHVyZSkKKyAgICAgICAgc2VsZi5wcmVmaXhUZXh0ICAgICAgPSBwcmVmaXhUZXh0CisgICAgICAgIHNlbGYuZ2VuRnVuY1BvaW50ZXJzID0gZ2VuRnVuY1BvaW50ZXJzCisgICAgICAgIHNlbGYucHJvdGVjdEZpbGUgICAgID0gcHJvdGVjdEZpbGUKKyAgICAgICAgc2VsZi5wcm90ZWN0RmVhdHVyZSAgPSBwcm90ZWN0RmVhdHVyZQorICAgICAgICBzZWxmLnByb3RlY3RQcm90byAgICA9IHByb3RlY3RQcm90bworICAgICAgICBzZWxmLnByb3RlY3RQcm90b1N0ciA9IHByb3RlY3RQcm90b1N0cgorICAgICAgICBzZWxmLmFwaWNhbGwgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgPSBhcGllbnRyeQorICAgICAgICBzZWxmLmFwaWVudHJ5cCAgICAgICA9IGFwaWVudHJ5cAorICAgICAgICBzZWxmLmluZGVudEZ1bmNQcm90byA9IGluZGVudEZ1bmNQcm90bworICAgICAgICBzZWxmLmluZGVudEZ1bmNQb2ludGVyID0gaW5kZW50RnVuY1BvaW50ZXIKKyAgICAgICAgc2VsZi5hbGlnbkZ1bmNQYXJhbSAgPSBhbGlnbkZ1bmNQYXJhbQorCisjIE1vY2tJQ0RPdXRwdXRHZW5lcmF0b3IgLSBzdWJjbGFzcyBvZiBPdXRwdXRHZW5lcmF0b3IuCisjIEdlbmVyYXRlcyBhIG1vY2sgdnVsa2FuIElDRC4KKyMgIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBtaW5pbWFsIHJlcGxhY2VtZW50IGZvciBhIHZ1bGthbiBkZXZpY2UgaW4gb3JkZXIKKyMgIHRvIGVuYWJsZSBWdWxrYW4gVmFsaWRhdGlvbiB0ZXN0aW5nLgorIworIyAtLS0tIG1ldGhvZHMgLS0tLQorIyBNb2NrT3V0cHV0R2VuZXJhdG9yKGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkgLSBhcmdzIGFzIGZvcgorIyAgIE91dHB1dEdlbmVyYXRvci4gRGVmaW5lcyBhZGRpdGlvbmFsIGludGVybmFsIHN0YXRlLgorIyAtLS0tIG1ldGhvZHMgb3ZlcnJpZGluZyBiYXNlIGNsYXNzIC0tLS0KKyMgYmVnaW5GaWxlKGdlbk9wdHMpCisjIGVuZEZpbGUoKQorIyBiZWdpbkZlYXR1cmUoaW50ZXJmYWNlLCBlbWl0KQorIyBlbmRGZWF0dXJlKCkKKyMgZ2VuVHlwZSh0eXBlaW5mbyxuYW1lKQorIyBnZW5TdHJ1Y3QodHlwZWluZm8sbmFtZSkKKyMgZ2VuR3JvdXAoZ3JvdXBpbmZvLG5hbWUpCisjIGdlbkVudW0oZW51bWluZm8sIG5hbWUpCisjIGdlbkNtZChjbWRpbmZvKQorY2xhc3MgTW9ja0lDRE91dHB1dEdlbmVyYXRvcihPdXRwdXRHZW5lcmF0b3IpOgorICAgICIiIkdlbmVyYXRlIHNwZWNpZmllZCBBUEkgaW50ZXJmYWNlcyBpbiBhIHNwZWNpZmljIHN0eWxlLCBzdWNoIGFzIGEgQyBoZWFkZXIiIiIKKyAgICAjIFRoaXMgaXMgYW4gb3JkZXJlZCBsaXN0IG9mIHNlY3Rpb25zIGluIHRoZSBoZWFkZXIgZmlsZS4KKyAgICBUWVBFX1NFQ1RJT05TID0gWydpbmNsdWRlJywgJ2RlZmluZScsICdiYXNldHlwZScsICdoYW5kbGUnLCAnZW51bScsCisgICAgICAgICAgICAgICAgICAgICAnZ3JvdXAnLCAnYml0bWFzaycsICdmdW5jcG9pbnRlcicsICdzdHJ1Y3QnXQorICAgIEFMTF9TRUNUSU9OUyA9IFRZUEVfU0VDVElPTlMgKyBbJ2NvbW1hbmQnXQorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBlcnJGaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgd2FybkZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICBkaWFnRmlsZSA9IHN5cy5zdGRvdXQpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuX19pbml0X18oc2VsZiwgZXJyRmlsZSwgd2FybkZpbGUsIGRpYWdGaWxlKQorICAgICAgICAjIEludGVybmFsIHN0YXRlIC0gYWNjdW11bGF0b3JzIGZvciBkaWZmZXJlbnQgaW5uZXIgYmxvY2sgdGV4dAorICAgICAgICBzZWxmLnNlY3Rpb25zID0gZGljdChbKHNlY3Rpb24sIFtdKSBmb3Igc2VjdGlvbiBpbiBzZWxmLkFMTF9TRUNUSU9OU10pCisgICAgICAgIHNlbGYuaW50ZXJjZXB0cyA9IFtdCisKKyAgICAjIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheQorICAgIGRlZiBwYXJhbUlzQXJyYXkoc2VsZiwgcGFyYW0pOgorICAgICAgICByZXR1cm4gcGFyYW0uYXR0cmliLmdldCgnbGVuJykgaXMgbm90IE5vbmUKKworICAgICMgQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBwYXNzZWQgaW4gaXMgYSBwb2ludGVyCisgICAgZGVmIHBhcmFtSXNQb2ludGVyKHNlbGYsIHBhcmFtKToKKyAgICAgICAgaXNwb2ludGVyID0gRmFsc2UKKyAgICAgICAgZm9yIGVsZW0gaW4gcGFyYW06CisgICAgICAgICAgICBpZiAoKGVsZW0udGFnICE9ICd0eXBlJykgYW5kIChlbGVtLnRhaWwgaXMgbm90IE5vbmUpKSBhbmQgJyonIGluIGVsZW0udGFpbDoKKyAgICAgICAgICAgICAgICBpc3BvaW50ZXIgPSBUcnVlCisgICAgICAgIHJldHVybiBpc3BvaW50ZXIKKworICAgICMgQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgbm9uLWRpc3BhdGNoYWJsZSBoYW5kbGUKKyAgICBkZWYgaXNIYW5kbGVUeXBlTm9uRGlzcGF0Y2hhYmxlKHNlbGYsIGhhbmRsZXR5cGUpOgorICAgICAgICBoYW5kbGUgPSBzZWxmLnJlZ2lzdHJ5LnRyZWUuZmluZCgidHlwZXMvdHlwZS9bbmFtZT0nIiArIGhhbmRsZXR5cGUgKyAiJ11bQGNhdGVnb3J5PSdoYW5kbGUnXSIpCisgICAgICAgIGlmIGhhbmRsZSBpcyBub3QgTm9uZSBhbmQgaGFuZGxlLmZpbmQoJ3R5cGUnKS50ZXh0ID09ICdWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUnOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBkaXNwYXRjaGFibGUgaGFuZGxlCisgICAgZGVmIGlzSGFuZGxlVHlwZURpc3BhdGNoYWJsZShzZWxmLCBoYW5kbGV0eXBlKToKKyAgICAgICAgaGFuZGxlID0gc2VsZi5yZWdpc3RyeS50cmVlLmZpbmQoInR5cGVzL3R5cGUvW25hbWU9JyIgKyBoYW5kbGV0eXBlICsgIiddW0BjYXRlZ29yeT0naGFuZGxlJ10iKQorICAgICAgICBpZiBoYW5kbGUgaXMgbm90IE5vbmUgYW5kIGhhbmRsZS5maW5kKCd0eXBlJykudGV4dCA9PSAnVktfREVGSU5FX0hBTkRMRSc6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpCisgICAgICAgICMgQy1zcGVjaWZpYworICAgICAgICAjCisgICAgICAgICMgTXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gJiBDKysgbmFtZXNwYWNlLgorICAgICAgICBzZWxmLmhlYWRlciA9IEZhbHNlCisgICAgICAgIGlmIChnZW5PcHRzLnByb3RlY3RGaWxlIGFuZCBzZWxmLmdlbk9wdHMuZmlsZW5hbWUgYW5kICdoJyA9PSBzZWxmLmdlbk9wdHMuZmlsZW5hbWVbLTFdKToKKyAgICAgICAgICAgIHNlbGYuaGVhZGVyID0gVHJ1ZQorICAgICAgICAgICAgaGVhZGVyU3ltID0gJ19fJyArIHJlLnN1YihyJ1wuaCcsICdfaF8nLCBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZ2VuT3B0cy5maWxlbmFtZSkpCisgICAgICAgICAgICB3cml0ZSgnI2lmbmRlZicsIGhlYWRlclN5bSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnI2RlZmluZScsIGhlYWRlclN5bSwgJzEnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICMKKyAgICAgICAgIyBVc2VyLXN1cHBsaWVkIHByZWZpeCB0ZXh0LCBpZiBhbnkgKGxpc3Qgb2Ygc3RyaW5ncykKKyAgICAgICAgaWYgKGdlbk9wdHMucHJlZml4VGV4dCk6CisgICAgICAgICAgICBmb3IgcyBpbiBnZW5PcHRzLnByZWZpeFRleHQ6CisgICAgICAgICAgICAgICAgd3JpdGUocywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIGlmIHNlbGYuaGVhZGVyOgorICAgICAgICAgICAgd3JpdGUoJyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJyNpbmNsdWRlIDxtdXRleD4nLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCcjaW5jbHVkZSA8c3RyaW5nPicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJyNpbmNsdWRlIDxjc3RyaW5nPicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJyNpbmNsdWRlICJ2dWxrYW4vdmtfaWNkLmgiJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3cml0ZSgnI2luY2x1ZGUgIm1vY2tfaWNkLmgiJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnI2luY2x1ZGUgPHN0ZGxpYi5oPicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJyNpbmNsdWRlIDx2ZWN0b3I+JywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnI2luY2x1ZGUgInZrX3R5cGVtYXBfaGVscGVyLmgiJywgZmlsZT1zZWxmLm91dEZpbGUpCisKKyAgICAgICAgd3JpdGUoJ25hbWVzcGFjZSB2a21vY2sgeycsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICBpZiBzZWxmLmhlYWRlcjoKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICB3cml0ZShIRUFERVJfQ19DT0RFLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgICMgSW5jbHVkZSBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgaW4gSUNEIGV4Y2VwdCBzcGVjaWZpYyBpZ25vcmVkIG9uZXMKKyAgICAgICAgICAgIGRldmljZV9leHRzID0gW10KKyAgICAgICAgICAgIGluc3RhbmNlX2V4dHMgPSBbXQorICAgICAgICAgICAgIyBJZ25vcmUgZXh0ZW5zaW9ucyB0aGF0IElDRHMgc2hvdWxkIG5vdCBpbXBsZW1lbnQgb3IgYXJlIG5vdCBzYWZlIHRvIHJlcG9ydAorICAgICAgICAgICAgaWdub3JlX2V4dHMgPSBbJ1ZLX0VYVF92YWxpZGF0aW9uX2NhY2hlJ10KKyAgICAgICAgICAgIGZvciBleHQgaW4gc2VsZi5yZWdpc3RyeS50cmVlLmZpbmRhbGwoImV4dGVuc2lvbnMvZXh0ZW5zaW9uIik6CisgICAgICAgICAgICAgICAgaWYgZXh0LmF0dHJpYlsnc3VwcG9ydGVkJ10gIT0gJ2Rpc2FibGVkJzogIyBPbmx5IGluY2x1ZGUgZW5hYmxlZCBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIGlmIChleHQuYXR0cmliWyduYW1lJ10gaW4gaWdub3JlX2V4dHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbGlmIChleHQuYXR0cmliLmdldCgndHlwZScpIGFuZCAnaW5zdGFuY2UnID09IGV4dC5hdHRyaWJbJ3R5cGUnXSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZV9leHRzLmFwcGVuZCgnICAgIHsiJXMiLCAlc30sJyAlIChleHQuYXR0cmliWyduYW1lJ10sIGV4dFswXVswXS5hdHRyaWJbJ3ZhbHVlJ10pKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2V4dHMuYXBwZW5kKCcgICAgeyIlcyIsICVzfSwnICUgKGV4dC5hdHRyaWJbJ25hbWUnXSwgZXh0WzBdWzBdLmF0dHJpYlsndmFsdWUnXSkpCisgICAgICAgICAgICB3cml0ZSgnLy8gTWFwIG9mIGluc3RhbmNlIGV4dGVuc2lvbiBuYW1lIHRvIHZlcnNpb24nLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCdzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCB1aW50MzJfdD4gaW5zdGFuY2VfZXh0ZW5zaW9uX21hcCA9IHsnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCdcbicuam9pbihpbnN0YW5jZV9leHRzKSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnfTsnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCcvLyBNYXAgb2YgZGV2aWNlIGV4dGVuc2lvbiBuYW1lIHRvIHZlcnNpb24nLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCdzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCB1aW50MzJfdD4gZGV2aWNlX2V4dGVuc2lvbl9tYXAgPSB7JywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnXG4nLmpvaW4oZGV2aWNlX2V4dHMpLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCd9OycsIGZpbGU9c2VsZi5vdXRGaWxlKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgd3JpdGUoU09VUkNFX0NQUF9QUkVGSVgsIGZpbGU9c2VsZi5vdXRGaWxlKQorCisgICAgZGVmIGVuZEZpbGUoc2VsZik6CisgICAgICAgICMgQy1zcGVjaWZpYworICAgICAgICAjIEZpbmlzaCBDKysgbmFtZXNwYWNlIGFuZCBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbgorICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICBpZiBzZWxmLmhlYWRlcjoKKyAgICAgICAgICAgICMgcmVjb3JkIGludGVyY2VwdGVkIHByb2NlZHVyZXMKKyAgICAgICAgICAgIHdyaXRlKCcvLyBNYXAgb2YgYWxsIEFQSXMgdG8gYmUgaW50ZXJjZXB0ZWQgYnkgdGhpcyBsYXllcicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJ3N0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHZvaWQqPiBuYW1lX3RvX2Z1bmNwdHJfbWFwID0geycsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJ1xuJy5qb2luKHNlbGYuaW50ZXJjZXB0cyksIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJ307XG4nLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICB3cml0ZSgnfSAvLyBuYW1lc3BhY2Ugdmttb2NrJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgd3JpdGUoJyNlbmRpZicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICBlbHNlOiAjIExvYWRlci1sYXllci1pbnRlcmZhY2UsIG5lZWQgdG8gaW1wbGVtZW50IGdsb2JhbCBpbnRlcmZhY2UgZnVuY3Rpb25zCisgICAgICAgICAgICB3cml0ZShTT1VSQ0VfQ1BQX1BPU1RGSVgsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAjIEZpbmlzaCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmVuZEZpbGUoc2VsZikKKyAgICBkZWYgYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCk6CisgICAgICAgICN3cml0ZSgnLy8gc3RhcnRpbmcgYmVnaW5GZWF0dXJlJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICMgU3RhcnQgcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KQorICAgICAgICBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgPSBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpCisgICAgICAgICMgQy1zcGVjaWZpYworICAgICAgICAjIEFjY3VtdWxhdGUgaW5jbHVkZXMsIGRlZmluZXMsIHR5cGVzLCBlbnVtcywgZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmcywKKyAgICAgICAgIyBlbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBzZXBhcmF0ZWx5IGZvciB0aGlzIGZlYXR1cmUuIFRoZXkncmUgb25seQorICAgICAgICAjIHByaW50ZWQgaW4gZW5kRmVhdHVyZSgpLgorICAgICAgICBzZWxmLnNlY3Rpb25zID0gZGljdChbKHNlY3Rpb24sIFtdKSBmb3Igc2VjdGlvbiBpbiBzZWxmLkFMTF9TRUNUSU9OU10pCisgICAgICAgICN3cml0ZSgnLy8gZW5kaW5nIGJlZ2luRmVhdHVyZScsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgIGRlZiBlbmRGZWF0dXJlKHNlbGYpOgorICAgICAgICAjIEMtc3BlY2lmaWMKKyAgICAgICAgIyBBY3R1YWxseSB3cml0ZSB0aGUgaW50ZXJmYWNlIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgICAgI3dyaXRlKCcvLyBzdGFydGluZyBlbmRGZWF0dXJlJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIGlmIChzZWxmLmVtaXQpOgorICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgIGlmIChzZWxmLmdlbk9wdHMucHJvdGVjdEZlYXR1cmUpOgorICAgICAgICAgICAgICAgIHdyaXRlKCcjaWZuZGVmJywgc2VsZi5mZWF0dXJlTmFtZSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAjIElmIHR5cGUgZGVjbGFyYXRpb25zIGFyZSBuZWVkZWQgYnkgb3RoZXIgZmVhdHVyZXMgYmFzZWQgb24KKyAgICAgICAgICAgICMgdGhpcyBvbmUsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gc3VwcHJlc3MgdGhlIEV4dHJhUHJvdGVjdCwKKyAgICAgICAgICAgICMgb3IgbW92ZSBpdCBiZWxvdyB0aGUgJ2ZvciBzZWN0aW9uLi4uJyBsb29wLgorICAgICAgICAgICAgI3dyaXRlKCcvLyBlbmRGZWF0dXJlIGxvb2tpbmcgYXQgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0JywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBpZiAoc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0ICE9IE5vbmUpOgorICAgICAgICAgICAgICAgIHdyaXRlKCcjaWZkZWYnLCBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgI3dyaXRlKCcjZGVmaW5lJywgc2VsZi5mZWF0dXJlTmFtZSwgJzEnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuVFlQRV9TRUNUSU9OUzoKKyAgICAgICAgICAgICAgICAjd3JpdGUoJy8vIGVuZEZlYXR1cmUgd3JpdGluZyBzZWN0aW9uJytzZWN0aW9uLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYuc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgICAgICAgICBpZiBjb250ZW50czoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoJ1xuJy5qb2luKGNvbnRlbnRzKSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICAjd3JpdGUoJy8vIGVuZEZlYXR1cmUgbG9va2luZyBhdCBzZWxmLnNlY3Rpb25zW2NvbW1hbmRdJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBpZiAoc2VsZi5zZWN0aW9uc1snY29tbWFuZCddKToKKyAgICAgICAgICAgICAgICB3cml0ZSgnXG4nLmpvaW4oc2VsZi5zZWN0aW9uc1snY29tbWFuZCddKSwgZW5kPXUnJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgIGlmIChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgIT0gTm9uZSk6CisgICAgICAgICAgICAgICAgd3JpdGUoJyNlbmRpZiAvKicsIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwgJyovJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBpZiAoc2VsZi5nZW5PcHRzLnByb3RlY3RGZWF0dXJlKToKKyAgICAgICAgICAgICAgICB3cml0ZSgnI2VuZGlmIC8qJywgc2VsZi5mZWF0dXJlTmFtZSwgJyovJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmVhdHVyZShzZWxmKQorICAgICAgICAjd3JpdGUoJy8vIGVuZGluZyBlbmRGZWF0dXJlJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgIworICAgICMgQXBwZW5kIGEgZGVmaW5pdGlvbiB0byB0aGUgc3BlY2lmaWVkIHNlY3Rpb24KKyAgICBkZWYgYXBwZW5kU2VjdGlvbihzZWxmLCBzZWN0aW9uLCB0ZXh0KToKKyAgICAgICAgIyBzZWxmLnNlY3Rpb25zW3NlY3Rpb25dLmFwcGVuZCgnU0VDVElPTjogJyArIHNlY3Rpb24gKyAnXG4nKQorICAgICAgICBzZWxmLnNlY3Rpb25zW3NlY3Rpb25dLmFwcGVuZCh0ZXh0KQorICAgICMKKyAgICAjIFR5cGUgZ2VuZXJhdGlvbgorICAgIGRlZiBnZW5UeXBlKHNlbGYsIHR5cGVpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgIHBhc3MKKyAgICAjCisgICAgIyBTdHJ1Y3QgKGUuZy4gQyAic3RydWN0IiB0eXBlKSBnZW5lcmF0aW9uLgorICAgICMgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgPHR5cGU+IHRhZyB3aGVyZSB0aGUgY29udGVudHMgYXJlCisgICAgIyBpbnRlcnByZXRlZCBhcyBhIHNldCBvZiA8bWVtYmVyPiB0YWdzIGluc3RlYWQgb2YgZnJlZWZvcm0gQworICAgICMgQyB0eXBlIGRlY2xhcmF0aW9ucy4gVGhlIDxtZW1iZXI+IHRhZ3MgYXJlIGp1c3QgbGlrZSA8cGFyYW0+CisgICAgIyB0YWdzIC0gdGhleSBhcmUgYSBkZWNsYXJhdGlvbiBvZiBhIHN0cnVjdCBvciB1bmlvbiBtZW1iZXIuCisgICAgIyBPbmx5IHNpbXBsZSBtZW1iZXIgZGVjbGFyYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vIG5lc3RlZAorICAgICMgc3RydWN0cyBldGMuKQorICAgIGRlZiBnZW5TdHJ1Y3Qoc2VsZiwgdHlwZWluZm8sIHR5cGVOYW1lLCBhbGlhcyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5TdHJ1Y3Qoc2VsZiwgdHlwZWluZm8sIHR5cGVOYW1lLCBhbGlhcykKKyAgICAgICAgYm9keSA9ICd0eXBlZGVmICcgKyB0eXBlaW5mby5lbGVtLmdldCgnY2F0ZWdvcnknKSArICcgJyArIHR5cGVOYW1lICsgJyB7XG4nCisgICAgICAgICMgcGFyYW1kZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbCh0eXBlaW5mby5lbGVtLCBzZWxmLmdlbk9wdHMuYWxpZ25GdW5jUGFyYW0pCisgICAgICAgIGZvciBtZW1iZXIgaW4gdHlwZWluZm8uZWxlbS5maW5kYWxsKCcuLy9tZW1iZXInKToKKyAgICAgICAgICAgIGJvZHkgKz0gc2VsZi5tYWtlQ1BhcmFtRGVjbChtZW1iZXIsIHNlbGYuZ2VuT3B0cy5hbGlnbkZ1bmNQYXJhbSkKKyAgICAgICAgICAgIGJvZHkgKz0gJztcbicKKyAgICAgICAgYm9keSArPSAnfSAnICsgdHlwZU5hbWUgKyAnO1xuJworICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ3N0cnVjdCcsIGJvZHkpCisgICAgIworICAgICMgR3JvdXAgKGUuZy4gQyAiZW51bSIgdHlwZSkgZ2VuZXJhdGlvbi4KKyAgICAjIFRoZXNlIGFyZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgd2l0aCBvdGhlciB0eXBlcy4KKyAgICBkZWYgZ2VuR3JvdXAoc2VsZiwgZ3JvdXBpbmZvLCBncm91cE5hbWUsIGFsaWFzKToKKyAgICAgICAgcGFzcworICAgICMgRW51bWVyYW50IGdlbmVyYXRpb24KKyAgICAjIDxlbnVtPiB0YWdzIG1heSBzcGVjaWZ5IHRoZWlyIHZhbHVlcyBpbiBzZXZlcmFsIHdheXMsIGJ1dCBhcmUgdXN1YWxseQorICAgICMganVzdCBpbnRlZ2Vycy4KKyAgICBkZWYgZ2VuRW51bShzZWxmLCBlbnVtaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICBwYXNzCisgICAgIworICAgICMgQ29tbWFuZCBnZW5lcmF0aW9uCisgICAgZGVmIGdlbkNtZChzZWxmLCBjbWRpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgIGRlY2xzID0gc2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSkKKyAgICAgICAgaWYgc2VsZi5oZWFkZXI6ICMgSW4gdGhlIGhlYWRlciBkZWNsYXJlIGFsbCBpbnRlcmNlcHRzCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICdzdGF0aWMgJXMnICUgKGRlY2xzWzBdKSkKKyAgICAgICAgICAgIGlmIChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgIT0gTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5pbnRlcmNlcHRzICs9IFsgJyNpZmRlZiAlcycgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgXQorICAgICAgICAgICAgc2VsZi5pbnRlcmNlcHRzICs9IFsgJyAgICB7IiVzIiwgKHZvaWQqKSVzfSwnICUgKG5hbWUsbmFtZVsyOl0pIF0KKyAgICAgICAgICAgIGlmIChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgIT0gTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5pbnRlcmNlcHRzICs9IFsgJyNlbmRpZicgXQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbWFudWFsX2Z1bmN0aW9ucyA9IFsKKyAgICAgICAgICAgICMgSW5jbHVkZSBmdW5jdGlvbnMgaGVyZSB0byBiZSBpbnRlcmVjcHRlZCB3LyBtYW51YWxseSBpbXBsZW1lbnRlZCBmdW5jdGlvbiBib2RpZXMKKyAgICAgICAgICAgICd2a0dldERldmljZVByb2NBZGRyJywKKyAgICAgICAgICAgICd2a0dldEluc3RhbmNlUHJvY0FkZHInLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlRGV2aWNlJywKKyAgICAgICAgICAgICd2a0Rlc3Ryb3lEZXZpY2UnLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlSW5zdGFuY2UnLAorICAgICAgICAgICAgJ3ZrRGVzdHJveUluc3RhbmNlJywKKyAgICAgICAgICAgICMndmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUJywKKyAgICAgICAgICAgICMndmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCcsCisgICAgICAgICAgICAndmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcycsCisgICAgICAgICAgICAndmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMnLAorICAgICAgICAgICAgJ3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICd2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMnLAorICAgICAgICBdCisgICAgICAgIGlmIG5hbWUgaW4gbWFudWFsX2Z1bmN0aW9uczoKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcnKQorICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gQ1VTVE9NX0NfSU5URVJDRVBUUzoKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnLy8gZGVjbGFyZSBvbmx5JykKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnc3RhdGljICVzJyAlIChkZWNsc1swXSkpCisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJy8vIFRPRE86IEltcGxlbWVudCBjdXN0b20gaW50ZXJjZXB0IGJvZHknKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnc3RhdGljICVzJyAlIChkZWNsc1swXVs6LTFdKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAne1xuJXN9JyAlIChDVVNUT01fQ19JTlRFUkNFUFRTW25hbWVdKSkKKyAgICAgICAgICAgIHNlbGYuaW50ZXJjZXB0cyArPSBbICcgICAgeyIlcyIsICh2b2lkKiklc30sJyAlIChuYW1lLG5hbWVbMjpdKSBdCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyByZWNvcmQgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBpbnRlcmNlcHRlZAorICAgICAgICBpZiAoc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0ICE9IE5vbmUpOgorICAgICAgICAgICAgc2VsZi5pbnRlcmNlcHRzICs9IFsgJyNpZmRlZiAlcycgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgXQorICAgICAgICBzZWxmLmludGVyY2VwdHMgKz0gWyAnICAgIHsiJXMiLCAodm9pZCopJXN9LCcgJSAobmFtZSxuYW1lWzI6XSkgXQorICAgICAgICBpZiAoc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0ICE9IE5vbmUpOgorICAgICAgICAgICAgc2VsZi5pbnRlcmNlcHRzICs9IFsgJyNlbmRpZicgXQorCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgICMKKyAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJycpCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICdzdGF0aWMgJXMnICUgKGRlY2xzWzBdWzotMV0pKQorICAgICAgICBpZiBuYW1lIGluIENVU1RPTV9DX0lOVEVSQ0VQVFM6CisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAneyVzfScgJSAoQ1VTVE9NX0NfSU5URVJDRVBUU1tuYW1lXSkpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIERlY2xhcmUgcmVzdWx0IHZhcmlhYmxlLCBpZiBhbnkuCisgICAgICAgIHJlc3VsdHR5cGUgPSBjbWRpbmZvLmVsZW0uZmluZCgncHJvdG8vdHlwZScpCisgICAgICAgIGlmIChyZXN1bHR0eXBlICE9IE5vbmUgYW5kIHJlc3VsdHR5cGUudGV4dCA9PSAndm9pZCcpOgorICAgICAgICAgICAgcmVzdWx0dHlwZSA9IE5vbmUKKyAgICAgICAgIyBpZiB0aGUgbmFtZSB3LyBLSFIgcG9zdGZpeCBpcyBpbiB0aGUgQ1VTVE9NX0NfSU5URVJDRVBUUworICAgICAgICAjIENhbGwgdGhlIEtIUiBjdXN0b20gdmVyc2lvbiBpbnN0ZWFkIG9mIGdlbmVyYXRpbmcgc2VwYXJhdGUgY29kZQorICAgICAgICBraHJfbmFtZSA9IG5hbWUgKyAiS0hSIgorICAgICAgICBpZiBraHJfbmFtZSBpbiBDVVNUT01fQ19JTlRFUkNFUFRTOgorICAgICAgICAgICAgcmV0dXJuX3N0cmluZyA9ICcnCisgICAgICAgICAgICBpZiByZXN1bHR0eXBlICE9IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuX3N0cmluZyA9ICdyZXR1cm4gJworICAgICAgICAgICAgcGFyYW1zID0gY21kaW5mby5lbGVtLmZpbmRhbGwoJ3BhcmFtL25hbWUnKQorICAgICAgICAgICAgcGFyYW1fbmFtZXMgPSBbXQorICAgICAgICAgICAgZm9yIHBhcmFtIGluIHBhcmFtczoKKyAgICAgICAgICAgICAgICBwYXJhbV9uYW1lcy5hcHBlbmQocGFyYW0udGV4dCkKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICd7XG4gICAgJXMlcyglcyk7XG59JyAlIChyZXR1cm5fc3RyaW5nLCBraHJfbmFtZVsyOl0sICIsICIuam9pbihwYXJhbV9uYW1lcykpKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICd7JykKKworICAgICAgICBhcGlfZnVuY3Rpb25fbmFtZSA9IGNtZGluZm8uZWxlbS5hdHRyaWIuZ2V0KCduYW1lJykKKyAgICAgICAgIyBHRVQgVEhFIFRZUEUgT0YgRlVOQ1RJT04KKyAgICAgICAgaWYgVHJ1ZSBpbiBbZnR4dCBpbiBhcGlfZnVuY3Rpb25fbmFtZSBmb3IgZnR4dCBpbiBbJ0NyZWF0ZScsICdBbGxvY2F0ZSddXToKKyAgICAgICAgICAgICMgR2V0IGxhc3QgcGFyYW0KKyAgICAgICAgICAgIGxhc3RfcGFyYW0gPSBjbWRpbmZvLmVsZW0uZmluZGFsbCgncGFyYW0nKVstMV0KKyAgICAgICAgICAgIGxwX3R4dCA9IGxhc3RfcGFyYW0uZmluZCgnbmFtZScpLnRleHQKKyAgICAgICAgICAgIGxwX2xlbiA9IE5vbmUKKyAgICAgICAgICAgIGlmICgnbGVuJyBpbiBsYXN0X3BhcmFtLmF0dHJpYik6CisgICAgICAgICAgICAgICAgbHBfbGVuID0gbGFzdF9wYXJhbS5hdHRyaWJbJ2xlbiddCisgICAgICAgICAgICAgICAgbHBfbGVuID0gbHBfbGVuLnJlcGxhY2UoJzo6JywgJy0+JykKKyAgICAgICAgICAgIGxwX3R5cGUgPSBsYXN0X3BhcmFtLmZpbmQoJ3R5cGUnKS50ZXh0CisgICAgICAgICAgICBoYW5kbGVfdHlwZSA9ICdkaXNwYXRjaGFibGUnCisgICAgICAgICAgICBhbGxvY2F0b3JfdHh0ID0gJ0NyZWF0ZURpc3BPYmpIYW5kbGUoKSc7CisgICAgICAgICAgICBpZiAoc2VsZi5pc0hhbmRsZVR5cGVOb25EaXNwYXRjaGFibGUobHBfdHlwZSkpOgorICAgICAgICAgICAgICAgIGhhbmRsZV90eXBlID0gJ25vbi0nICsgaGFuZGxlX3R5cGUKKyAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHh0ID0gJ2dsb2JhbF91bmlxdWVfaGFuZGxlKysnOworICAgICAgICAgICAgIyBOZWVkIHRvIGxvY2sgaW4gYm90aCBjYXNlcworICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJyAgICB1bmlxdWVfbG9ja190IGxvY2soZ2xvYmFsX2xvY2spOycpCisgICAgICAgICAgICBpZiAobHBfbGVuICE9IE5vbmUpOgorICAgICAgICAgICAgICAgICNwcmludCgiJXMgbGFzdCBwYXJhbXMgKCVzKSBoYXMgbGVuICVzIiAlIChoYW5kbGVfdHlwZSwgbHBfdHh0LCBscF9sZW4pKQorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICVzOyArK2kpIHsnICUgKGxwX2xlbikpCisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJyAgICAgICAgJXNbaV0gPSAoJXMpJXM7JyAlIChscF90eHQsIGxwX3R5cGUsIGFsbG9jYXRvcl90eHQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgfScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNwcmludCgiU2luZ2xlICVzIGxhc3QgcGFyYW0gaXMgJyVzJyB3LyB0eXBlICclcyciICUgKGhhbmRsZV90eXBlLCBscF90eHQsIGxwX3R5cGUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgKiVzID0gKCVzKSVzOycgJSAobHBfdHh0LCBscF90eXBlLCBhbGxvY2F0b3JfdHh0KSkKKyAgICAgICAgZWxpZiBUcnVlIGluIFtmdHh0IGluIGFwaV9mdW5jdGlvbl9uYW1lIGZvciBmdHh0IGluIFsnRGVzdHJveScsICdGcmVlJ11dOgorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJy8vRGVzdHJveSBvYmplY3QnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJy8vTm90IGEgQ1JFQVRFIG9yIERFU1RST1kgZnVuY3Rpb24nKQorCisgICAgICAgICMgUmV0dXJuIHJlc3VsdCB2YXJpYWJsZSwgaWYgYW55LgorICAgICAgICBpZiAocmVzdWx0dHlwZSAhPSBOb25lKToKKyAgICAgICAgICAgIGlmIGFwaV9mdW5jdGlvbl9uYW1lID09ICd2a0dldEV2ZW50U3RhdHVzJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnICAgIHJldHVybiBWS19FVkVOVF9TRVQ7JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJyAgICByZXR1cm4gVktfU1VDQ0VTUzsnKQorICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnfScpCisgICAgIworICAgICMgb3ZlcnJpZGUgbWFrZVByb3RvTmFtZSB0byBkcm9wIHRoZSAidmsiIHByZWZpeAorICAgIGRlZiBtYWtlUHJvdG9OYW1lKHNlbGYsIG5hbWUsIHRhaWwpOgorICAgICAgICByZXR1cm4gc2VsZi5nZW5PcHRzLmFwaWVudHJ5ICsgbmFtZVsyOl0gKyB0YWlsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9zY3JpcHRzL3VwZGF0ZV9kZXBzLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy91cGRhdGVfZGVwcy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMWZlMzZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy91cGRhdGVfZGVwcy5weQpAQCAtMCwwICsxLDY3OSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIEdsc2xhbmcgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxOCBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIHNjcmlwdCB3YXMgaGVhdmlseSBsZXZlcmFnZWQgZnJvbSBLaHJvbm9zR3JvdXAvZ2xzbGFuZworIyB1cGRhdGVfZ2xzbGFuZ19zb3VyY2VzLnB5LgorIiIidXBkYXRlX2RlcHMucHkKKworR2V0IGFuZCBidWlsZCBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzIHVzaW5nIGtub3duLWdvb2QgY29tbWl0cy4KKworUHVycG9zZQorLS0tLS0tLQorCitUaGlzIHByb2dyYW0gaXMgaW50ZW5kZWQgdG8gYXNzaXN0IGEgZGV2ZWxvcGVyIG9mIHRoaXMgcmVwb3NpdG9yeQorKHRoZSAiaG9tZSIgcmVwb3NpdG9yeSkgYnkgZ2F0aGVyaW5nIGFuZCBidWlsZGluZyB0aGUgcmVwb3NpdG9yaWVzIHRoYXQKK3RoaXMgaG9tZSByZXBvc2l0b3J5IGRlcGVuZCBvbi4gIEl0IGFsc28gY2hlY2tzIG91dCBlYWNoIGRlcGVuZGVudAorcmVwb3NpdG9yeSBhdCBhICJrbm93bi1nb29kIiBjb21taXQgaW4gb3JkZXIgdG8gcHJvdmlkZSBzdGFiaWxpdHkgaW4KK3RoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzLgorCitQeXRob24gQ29tcGF0aWJpbGl0eQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBwcm9ncmFtIGNhbiBiZSB1c2VkIHdpdGggUHl0aG9uIDIuNyBhbmQgUHl0aG9uIDMuCisKK0tub3duLUdvb2QgSlNPTiBEYXRhYmFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcHJvZ3JhbSBleHBlY3RzIHRvIGZpbmQgYSBmaWxlIG5hbWVkICJrbm93bi1nb29kLmpzb24iIGluIHRoZQorc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHByb2dyYW0gZmlsZS4gIFRoaXMgSlNPTiBmaWxlIGlzIHRhaWxvcmVkIGZvcgordGhlIG5lZWRzIG9mIHRoZSBob21lIHJlcG9zaXRvcnkgYnkgaW5jbHVkaW5nIGl0cyBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzLgorCitQcm9ncmFtIE9wdGlvbnMKKy0tLS0tLS0tLS0tLS0tLQorCitTZWUgdGhlIGhlbHAgdGV4dCAodXBkYXRlX2RlcHMucHkgLS1oZWxwKSBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIG9wdGlvbnMuCisKK1Byb2dyYW0gT3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgcHJvZ3JhbSB1c2VzIHRoZSB1c2VyJ3MgY3VycmVudCBkaXJlY3RvcnkgYXQgdGhlIHRpbWUgb2YgcHJvZ3JhbQoraW52b2NhdGlvbiBhcyB0aGUgbG9jYXRpb24gZm9yIGZldGNoaW5nIGFuZCBidWlsZGluZyB0aGUgZGVwZW5kZW50CityZXBvc2l0b3JpZXMuICBUaGUgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyBieSB1c2luZyB0aGUgIi0tZGlyIiBvcHRpb24uCisKK0ZvciBleGFtcGxlLCBhIGRpcmVjdG9yeSBuYW1lZCAiYnVpbGQiIGluIHRoZSByZXBvc2l0b3J5J3Mgcm9vdCBkaXJlY3RvcnkKK2lzIGEgZ29vZCBwbGFjZSB0byBwdXQgdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgYmVjYXVzZSB0aGF0IGRpcmVjdG9yeQoraXMgbm90IHRyYWNrZWQgYnkgR2l0LiAoU2VlIHRoZSAuZ2l0aWdub3JlIGZpbGUuKSAgVGhlICJleHRlcm5hbCIgZGlyZWN0b3J5CittYXkgYWxzbyBiZSBhIHN1aXRhYmxlIGxvY2F0aW9uLgorQSB1c2VyIGNhbiBpc3N1ZToKKworJCBjZCBNeS1SZXBvCiskIG1rZGlyIGJ1aWxkCiskIGNkIGJ1aWxkCiskIC4uL3NjcmlwdHMvdXBkYXRlX2RlcHMucHkKKworb3IsIHRvIGRvIHRoZSBzYW1lIHRoaW5nLCBidXQgdXNpbmcgdGhlIC0tZGlyIG9wdGlvbjoKKworJCBjZCBNeS1SZXBvCiskIG1rZGlyIGJ1aWxkCiskIHNjcmlwdHMvdXBkYXRlX2RlcHMucHkgLS1kaXI9YnVpbGQKKworV2l0aCB0aGVzZSBjb21tYW5kcywgdGhlICJidWlsZCIgZGlyZWN0b3J5IGlzIGNvbnNpZGVyZWQgdGhlICJ0b3AiCitkaXJlY3Rvcnkgd2hlcmUgdGhlIHByb2dyYW0gY2xvbmVzIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzLiAgVGhlCitKU09OIGZpbGUgY29uZmlndXJlcyB0aGUgYnVpbGQgYW5kIGluc3RhbGwgd29ya2luZyBkaXJlY3RvcmllcyB0byBiZQord2l0aGluIHRoaXMgInRvcCIgZGlyZWN0b3J5LgorCitOb3RlIHRoYXQgdGhlICJkaXIiIG9wdGlvbiBjYW4gYWxzbyBzcGVjaWZ5IGFuIGFic29sdXRlIHBhdGg6CisKKyQgY2QgTXktUmVwbworJCBzY3JpcHRzL3VwZGF0ZV9kZXBzLnB5IC0tZGlyPS90bXAvZGVwcworCitUaGUgInRvcCIgZGlyIGlzIHRoZW4gL3RtcC9kZXBzIChMaW51eCBmaWxlc3lzdGVtIGV4YW1wbGUpIGFuZCBpcword2hlcmUgdGhpcyBwcm9ncmFtIHdpbGwgY2xvbmUgYW5kIGJ1aWxkIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzLgorCitIZWxwZXIgQ01ha2UgQ29uZmlnIEZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHRoZSBwcm9ncmFtIGZpbmlzaGVzIGJ1aWxkaW5nIHRoZSBkZXBlbmRlbmNpZXMsIGl0IHdyaXRlcyBhIGZpbGUKK25hbWVkICJoZWxwZXIuY21ha2UiIHRvIHRoZSAidG9wIiBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBDTWFrZSBjb21tYW5kcworZm9yIHNldHRpbmcgQ01ha2UgdmFyaWFibGVzIGZvciBsb2NhdGluZyB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcy4KK1RoaXMgaGVscGVyIGZpbGUgY2FuIGJlIHVzZWQgdG8gc2V0IHVwIHRoZSBDTWFrZSBidWlsZCBmaWxlcyBmb3IgdGhpcworImhvbWUiIHJlcG9zaXRvcnkuCisKK0EgY29tcGxldGUgc2VxdWVuY2UgbWlnaHQgbG9vayBsaWtlOgorCiskIGdpdCBjbG9uZSBnaXRAZ2l0aHViLmNvbTpNeS1Hcm91cC9NeS1SZXBvLmdpdAorJCBjZCBNeS1SZXBvCiskIG1rZGlyIGJ1aWxkCiskIGNkIGJ1aWxkCiskIC4uL3NjcmlwdHMvdXBkYXRlX2RlcHMucHkKKyQgY21ha2UgLUMgaGVscGVyLmNtYWtlIC4uCiskIGNtYWtlIC0tYnVpbGQgLgorCitKU09OIEZpbGUgU2NoZW1hCistLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlJ3Mgbm8gZm9ybWFsIHNjaGVtYSBmb3IgdGhlICJrbm93bi1nb29kIiBKU09OIGZpbGUsIGJ1dCBoZXJlIGlzCithIGRlc2NyaXB0aW9uIG9mIGl0cyBlbGVtZW50cy4gIEFsbCBlbGVtZW50cyBhcmUgcmVxdWlyZWQgZXhjZXB0IHRob3NlCittYXJrZWQgYXMgb3B0aW9uYWwuICBQbGVhc2Ugc2VlIHRoZSAia25vd25fZ29vZC5qc29uIiBmaWxlIGZvcgorZXhhbXBsZXMgb2YgYWxsIG9mIHRoZXNlIGVsZW1lbnRzLgorCistIG5hbWUKKworVGhlIG5hbWUgb2YgdGhlIGRlcGVuZGVudCByZXBvc2l0b3J5LiAgVGhpcyBmaWVsZCBjYW4gYmUgcmVmZXJlbmNlZAorYnkgdGhlICJkZXBzLnJlcG9fbmFtZSIgc3RydWN0dXJlIHRvIHJlY29yZCBhIGRlcGVuZGVuY3kuCisKKy0gdXJsCisKK1NwZWNpZmllcyB0aGUgVVJMIG9mIHRoZSByZXBvc2l0b3J5LgorRXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tTG9hZGVyLmdpdAorCistIHN1Yl9kaXIKKworVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgcHJvZ3JhbSBjbG9uZXMgdGhlIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvCit0aGUgInRvcCIgZGlyZWN0b3J5LgorCistIGJ1aWxkX2RpcgorCitUaGUgZGlyZWN0b3J5IHVzZWQgdG8gYnVpbGQgdGhlIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvIHRoZSAidG9wIgorZGlyZWN0b3J5LgorCistIGluc3RhbGxfZGlyCisKK1RoZSBkaXJlY3RvcnkgdXNlZCB0byBzdG9yZSB0aGUgaW5zdGFsbGVkIGJ1aWxkIGFydGlmYWN0cywgcmVsYXRpdmUKK3RvIHRoZSAidG9wIiBkaXJlY3RvcnkuCisKKy0gY29tbWl0CisKK1RoZSBjb21taXQgdXNlZCB0byBjaGVja291dCB0aGUgcmVwb3NpdG9yeS4gIFRoaXMgY2FuIGJlIGEgU0hBLTEKK29iamVjdCBuYW1lIG9yIGEgcmVmbmFtZSB1c2VkIHdpdGggdGhlIHJlbW90ZSBuYW1lICJvcmlnaW4iLgorRm9yIGV4YW1wbGUsIHRoaXMgZmllbGQgY2FuIGJlIHNldCB0byAib3JpZ2luL3Nkay0xLjEuNzciIHRvCitzZWxlY3QgdGhlIGVuZCBvZiB0aGUgc2RrLTEuMS43NyBicmFuY2guCisKKy0gZGVwcyAob3B0aW9uYWwpCisKK0FuIGFycmF5IG9mIHBhaXJzIGNvbnNpc3Rpbmcgb2YgYSBDTWFrZSB2YXJpYWJsZSBuYW1lIGFuZCBhCityZXBvc2l0b3J5IG5hbWUgdG8gc3BlY2lmeSBhIGRlcGVuZGVudCByZXBvIGFuZCBhICJsaW5rIiB0bwordGhhdCByZXBvJ3MgaW5zdGFsbCBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZToKKworImRlcHMiIDogWworICAgIHsKKyAgICAgICAgInZhcl9uYW1lIiA6ICJWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUiIsCisgICAgICAgICJyZXBvX25hbWUiIDogIlZ1bGthbi1IZWFkZXJzIgorICAgIH0KK10KKword2hpY2ggcmVwcmVzZW50cyB0aGF0IHRoaXMgcmVwb3NpdG9yeSBkZXBlbmRzIG9uIHRoZSBWdWxrYW4tSGVhZGVycworcmVwb3NpdG9yeSBhbmQgdXNlcyB0aGUgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVIgQ01ha2UgdmFyaWFibGUgdG8KK3NwZWNpZnkgdGhlIGxvY2F0aW9uIHdoZXJlIGl0IGV4cGVjdHMgdG8gZmluZCB0aGUgVnVsa2FuLUhlYWRlcnMgaW5zdGFsbAorZGlyZWN0b3J5LgorTm90ZSB0aGF0IHRoZSAicmVwb19uYW1lIiBlbGVtZW50IG11c3QgbWF0Y2ggdGhlICJuYW1lIiBlbGVtZW50IG9mIHNvbWUKK290aGVyIHJlcG9zaXRvcnkgaW4gdGhlIEpTT04gZmlsZS4KKworLSBwcmVidWlsZCAob3B0aW9uYWwpCistIHByZWJ1aWxkX2xpbnV4IChvcHRpb25hbCkgIChGb3IgTGludXggYW5kIE1hY09TKQorLSBwcmVidWlsZF93aW5kb3dzIChvcHRpb25hbCkKKworQSBsaXN0IG9mIGNvbW1hbmRzIHRvIGV4ZWN1dGUgYmVmb3JlIGJ1aWxkaW5nIGEgZGVwZW5kZW50IHJlcG9zaXRvcnkuCitUaGlzIGlzIHVzZWZ1bCBmb3IgcmVwb3NpdG9yaWVzIHRoYXQgcmVxdWlyZSB0aGUgZXhlY3V0aW9uIG9mIHNvbWUKK3NvcnQgb2YgInVwZGF0ZSIgc2NyaXB0IG9yIG5lZWQgdG8gY2xvbmUgYW4gYXV4aWxsYXJ5IHJlcG9zaXRvcnkgbGlrZQorZ29vZ2xldGVzdC4KKworVGhlIGNvbW1hbmRzIGxpc3RlZCBpbiAicHJlYnVpbGQiIGFyZSBleGVjdXRlZCBmaXJzdCwgYW5kIHRoZW4gdGhlCitjb21tYW5kcyBmb3IgdGhlIHNwZWNpZmljIHBsYXRmb3JtIGFyZSBleGVjdXRlZC4KKworLSBjdXN0b21fYnVpbGQgKG9wdGlvbmFsKQorCitBIGxpc3Qgb2YgY29tbWFuZHMgdG8gZXhlY3V0ZSBhcyBhIGN1c3RvbSBidWlsZCBpbnN0ZWFkIG9mIHVzaW5nCit0aGUgYnVpbHQgaW4gQ01ha2Ugd2F5IG9mIGJ1aWxkaW5nLiBSZXF1aXJlcyAiYnVpbGRfc3RlcCIgdG8gYmUKK3NldCB0byAiY3VzdG9tIgorCitZb3UgY2FuIGluc2VydCB0aGUgZm9sbG93aW5nIGtleXdvcmRzIGludG8gdGhlIGNvbW1hbmRzIGxpc3RlZCBpbgorImN1c3RvbV9idWlsZCIgaWYgdGhleSByZXF1aXJlIHJ1bnRpbWUgaW5mb3JtYXRpb24gKGxpa2Ugd2hldGhlciB0aGUKK2J1aWxkIGNvbmZpZyBpcyAiRGVidWciIG9yICJSZWxlYXNlIikuCisKK0tleXdvcmRzOgorezB9IHJlZmVyZW5jZSB0byBhIGRpY3Rpb25hcnkgb2YgcmVwb3MgYW5kIHRoZWlyIGF0dHJpYnV0ZXMKK3sxfSByZWZlcmVuY2UgdG8gdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgc2V0IGJlZm9yZSBzdGFydAorezJ9IHJlZmVyZW5jZSB0byB0aGUgQ09ORklHX01BUCB2YWx1ZSBvZiBjb25maWcuCisKK0V4YW1wbGU6Cit7Mn0gcmV0dXJucyB0aGUgQ09ORklHX01BUCB2YWx1ZSBvZiBjb25maWcgZS5nLiBkZWJ1ZyAtPiBEZWJ1ZworezF9LmNvbmZpZyByZXR1cm5zIHRoZSBjb25maWcgdmFyaWFibGUgc2V0IHdoZW4geW91IHJhbiB1cGRhdGVfZGVwLnB5Cit7MH1bVnVsa2FuLUhlYWRlcnNdW3JlcG9fcm9vdF0gcmV0dXJucyB0aGUgcmVwb19yb290IHZhcmlhYmxlIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFZ1bGthbi1IZWFkZXJzIEdvb2RSZXBvIG9iamVjdC4KKworLSBjbWFrZV9vcHRpb25zIChvcHRpb25hbCkKKworQSBsaXN0IG9mIG9wdGlvbnMgdG8gcGFzcyB0byBDTWFrZSBkdXJpbmcgdGhlIGdlbmVyYXRpb24gcGhhc2UuCisKKy0gY2lfb25seSAob3B0aW9uYWwpCisKK0EgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hlcmUgb25lIG11c3QgYmUgc2V0IHRvICJ0cnVlIgorKGNhc2UtaW5zZW5zaXRpdmUpIGluIG9yZGVyIGZvciB0aGlzIHJlcG8gdG8gYmUgZmV0Y2hlZCBhbmQgYnVpbHQuCitUaGlzIGxpc3QgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSByZXBvcyB0aGF0IHNob3VsZCBiZSBidWlsdCBvbmx5IGluIENJLgorVHlwaWNhbGx5LCB0aGlzIGxpc3QgbWlnaHQgY29udGFpbiAiVFJBVklTIiBhbmQvb3IgIkFQUFZFWU9SIiBiZWNhdXNlCitlYWNoIG9mIHRoZXNlIENJIHN5c3RlbXMgc2V0cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGl0cyBvd24KK25hbWUgdG8gInRydWUiLiAgTm90ZSB0aGF0IHRoaXMgY291bGQgYWxzbyBiZSAoYWIpdXNlZCB0byBjb250cm9sCit0aGUgcHJvY2Vzc2luZyBvZiB0aGUgcmVwbyB3aXRoIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIFRoZSBkZWZhdWx0CitpcyBhbiBlbXB0eSBsaXN0LCB3aGljaCBtZWFucyB0aGF0IHRoZSByZXBvIGlzIGFsd2F5cyBwcm9jZXNzZWQuCisKKy0gYnVpbGRfc3RlcCAob3B0aW9uYWwpCisKK1NwZWNpZmllcyBpZiB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcnkgc2hvdWxkIGJlIGJ1aWx0IG9yIG5vdC4gVGhpcyBjYW4KK2hhdmUgYSB2YWx1ZSBvZiAnYnVpbGQnLCAnY3VzdG9tJywgIG9yICdza2lwJy4gVGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgYXJlCitidWlsdCBieSBkZWZhdWx0LgorCistIGJ1aWxkX3BsYXRmb3JtcyAob3B0aW9uYWwpCisKK0EgbGlzdCBvZiBwbGF0Zm9ybXMgdGhlIHJlcG9zaXRvcnkgd2lsbCBiZSBidWlsdCBvbi4KK0xlZ2FsIG9wdGlvbnMgaW5jbHVkZToKKyJ3aW5kb3dzIgorImxpbnV4IgorImRhcndpbiIKKworQnVpbGRzIG9uIGFsbCBwbGF0Zm9ybXMgYnkgZGVmYXVsdC4KKworTm90ZQorLS0tLQorCitUaGUgInN1Yl9kaXIiLCAiYnVpbGRfZGlyIiwgYW5kICJpbnN0YWxsX2RpciIgZWxlbWVudHMgYXJlIGFsbCByZWxhdGl2ZQordG8gdGhlIGVmZmVjdGl2ZSAidG9wIiBkaXJlY3RvcnkuICBTcGVjaWZ5aW5nIGFic29sdXRlIHBhdGhzIGlzIG5vdAorc3VwcG9ydGVkLiAgSG93ZXZlciwgdGhlICJ0b3AiIGRpcmVjdG9yeSBzcGVjaWZpZWQgd2l0aCB0aGUgIi0tZGlyIgorb3B0aW9uIGNhbiBiZSBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGguCisKKyIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGpzb24KK2ltcG9ydCBkaXN0dXRpbHMuZGlyX3V0aWwKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgc2hsZXgKK2ltcG9ydCBzaHV0aWwKKworS05PV05fR09PRF9GSUxFX05BTUUgPSAna25vd25fZ29vZC5qc29uJworCitDT05GSUdfTUFQID0geworICAgICdkZWJ1Zyc6ICdEZWJ1ZycsCisgICAgJ3JlbGVhc2UnOiAnUmVsZWFzZScsCisgICAgJ3JlbHdpdGhkZWJpbmZvJzogJ1JlbFdpdGhEZWJJbmZvJywKKyAgICAnbWluc2l6ZXJlbCc6ICdNaW5TaXplUmVsJworfQorCitWRVJCT1NFID0gRmFsc2UKKworREVWTlVMTCA9IG9wZW4ob3MuZGV2bnVsbCwgJ3diJykKKworCitkZWYgY29tbWFuZF9vdXRwdXQoY21kLCBkaXJlY3RvcnksIGZhaWxfb2s9RmFsc2UpOgorICAgICIiIlJ1bnMgYSBjb21tYW5kIGluIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIGl0cyBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtLgorCisgICAgQ2FwdHVyZXMgdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSBhbmQgcHJpbnRzIGl0IGlmIGVycm9yLgorCisgICAgUmFpc2VzIGEgUnVudGltZUVycm9yIGlmIHRoZSBjb21tYW5kIGZhaWxzIHRvIGxhdW5jaCBvciBvdGhlcndpc2UgZmFpbHMuCisgICAgIiIiCisgICAgaWYgVkVSQk9TRToKKyAgICAgICAgcHJpbnQoJ0luIHtkfToge2NtZH0nLmZvcm1hdChkPWRpcmVjdG9yeSwgY21kPWNtZCkpCisgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oCisgICAgICAgIGNtZCwgY3dkPWRpcmVjdG9yeSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAoc3Rkb3V0LCBzdGRlcnIpID0gcC5jb21tdW5pY2F0ZSgpCisgICAgaWYgcC5yZXR1cm5jb2RlICE9IDA6CisgICAgICAgIHByaW50KCcqKiogRXJyb3IgKioqXG5zdGRlcnIgY29udGVudHM6XG57fScuZm9ybWF0KHN0ZGVycikpCisgICAgICAgIGlmIG5vdCBmYWlsX29rOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdGYWlsZWQgdG8gcnVuIHt9IGluIHt9Jy5mb3JtYXQoY21kLCBkaXJlY3RvcnkpKQorICAgIGlmIFZFUkJPU0U6CisgICAgICAgIHByaW50KHN0ZG91dCkKKyAgICByZXR1cm4gc3Rkb3V0CisKK2NsYXNzIEdvb2RSZXBvKG9iamVjdCk6CisgICAgIiIiUmVwcmVzZW50cyBhIHJlcG9zaXRvcnkgYXQgYSBrbm93bi1nb29kIGNvbW1pdC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBqc29uLCBhcmdzKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZXMgdGhpcyBnb29kIHJlcG8gb2JqZWN0LgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICdqc29uJzogIEEgZnVsbHkgcG9wdWxhdGVkIEpTT04gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlcG8uCisgICAgICAgICdhcmdzJzogIFJlc3VsdHMgZnJvbSBBcmd1bWVudFBhcnNlcgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fanNvbiA9IGpzb24KKyAgICAgICAgc2VsZi5fYXJncyA9IGFyZ3MKKyAgICAgICAgIyBSZXF1aXJlZCBKU09OIGVsZW1lbnRzCisgICAgICAgIHNlbGYubmFtZSA9IGpzb25bJ25hbWUnXQorICAgICAgICBzZWxmLnVybCA9IGpzb25bJ3VybCddCisgICAgICAgIHNlbGYuc3ViX2RpciA9IGpzb25bJ3N1Yl9kaXInXQorICAgICAgICBzZWxmLmNvbW1pdCA9IGpzb25bJ2NvbW1pdCddCisgICAgICAgICMgT3B0aW9uYWwgSlNPTiBlbGVtZW50cworICAgICAgICBzZWxmLmJ1aWxkX2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKKyAgICAgICAgaWYganNvbi5nZXQoJ2J1aWxkX2RpcicpOgorICAgICAgICAgICAgc2VsZi5idWlsZF9kaXIgPSBvcy5wYXRoLm5vcm1wYXRoKGpzb25bJ2J1aWxkX2RpciddKQorICAgICAgICBpZiBqc29uLmdldCgnaW5zdGFsbF9kaXInKToKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBvcy5wYXRoLm5vcm1wYXRoKGpzb25bJ2luc3RhbGxfZGlyJ10pCisgICAgICAgIHNlbGYuZGVwcyA9IGpzb25bJ2RlcHMnXSBpZiAoJ2RlcHMnIGluIGpzb24pIGVsc2UgW10KKyAgICAgICAgc2VsZi5wcmVidWlsZCA9IGpzb25bJ3ByZWJ1aWxkJ10gaWYgKCdwcmVidWlsZCcgaW4ganNvbikgZWxzZSBbXQorICAgICAgICBzZWxmLnByZWJ1aWxkX2xpbnV4ID0ganNvblsncHJlYnVpbGRfbGludXgnXSBpZiAoCisgICAgICAgICAgICAncHJlYnVpbGRfbGludXgnIGluIGpzb24pIGVsc2UgW10KKyAgICAgICAgc2VsZi5wcmVidWlsZF93aW5kb3dzID0ganNvblsncHJlYnVpbGRfd2luZG93cyddIGlmICgKKyAgICAgICAgICAgICdwcmVidWlsZF93aW5kb3dzJyBpbiBqc29uKSBlbHNlIFtdCisgICAgICAgIHNlbGYuY3VzdG9tX2J1aWxkID0ganNvblsnY3VzdG9tX2J1aWxkJ10gaWYgKCdjdXN0b21fYnVpbGQnIGluIGpzb24pIGVsc2UgW10KKyAgICAgICAgc2VsZi5jbWFrZV9vcHRpb25zID0ganNvblsnY21ha2Vfb3B0aW9ucyddIGlmICgKKyAgICAgICAgICAgICdjbWFrZV9vcHRpb25zJyBpbiBqc29uKSBlbHNlIFtdCisgICAgICAgIHNlbGYuY2lfb25seSA9IGpzb25bJ2NpX29ubHknXSBpZiAoJ2NpX29ubHknIGluIGpzb24pIGVsc2UgW10KKyAgICAgICAgc2VsZi5idWlsZF9zdGVwID0ganNvblsnYnVpbGRfc3RlcCddIGlmICgnYnVpbGRfc3RlcCcgaW4ganNvbikgZWxzZSAnYnVpbGQnCisgICAgICAgIHNlbGYuYnVpbGRfcGxhdGZvcm1zID0ganNvblsnYnVpbGRfcGxhdGZvcm1zJ10gaWYgKCdidWlsZF9wbGF0Zm9ybXMnIGluIGpzb24pIGVsc2UgW10KKyAgICAgICAgIyBBYnNvbHV0ZSBwYXRocyBmb3IgYSByZXBvJ3MgZGlyZWN0b3JpZXMKKyAgICAgICAgZGlyX3RvcCA9IG9zLnBhdGguYWJzcGF0aChhcmdzLmRpcikKKyAgICAgICAgc2VsZi5yZXBvX2RpciA9IG9zLnBhdGguam9pbihkaXJfdG9wLCBzZWxmLnN1Yl9kaXIpCisgICAgICAgIGlmIHNlbGYuYnVpbGRfZGlyOgorICAgICAgICAgICAgc2VsZi5idWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oZGlyX3RvcCwgc2VsZi5idWlsZF9kaXIpCisgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9kaXI6CisgICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gb3MucGF0aC5qb2luKGRpcl90b3AsIHNlbGYuaW5zdGFsbF9kaXIpCisJICAgICMgQ2hlY2sgaWYgcGxhdGZvcm0gaXMgb25lIHRvIGJ1aWxkIG9uCisgICAgICAgIHNlbGYub25fYnVpbGRfcGxhdGZvcm0gPSBGYWxzZQorICAgICAgICBpZiBzZWxmLmJ1aWxkX3BsYXRmb3JtcyA9PSBbXSBvciBwbGF0Zm9ybS5zeXN0ZW0oKS5sb3dlcigpIGluIHNlbGYuYnVpbGRfcGxhdGZvcm1zOgorICAgICAgICAgICAgc2VsZi5vbl9idWlsZF9wbGF0Zm9ybSA9IFRydWUKKworICAgIGRlZiBDbG9uZShzZWxmKToKKyAgICAgICAgZGlzdHV0aWxzLmRpcl91dGlsLm1rcGF0aChzZWxmLnJlcG9fZGlyKQorICAgICAgICBjb21tYW5kX291dHB1dChbJ2dpdCcsICdjbG9uZScsIHNlbGYudXJsLCAnLiddLCBzZWxmLnJlcG9fZGlyKQorCisgICAgZGVmIEZldGNoKHNlbGYpOgorICAgICAgICBjb21tYW5kX291dHB1dChbJ2dpdCcsICdmZXRjaCcsICdvcmlnaW4nXSwgc2VsZi5yZXBvX2RpcikKKworICAgIGRlZiBDaGVja291dChzZWxmKToKKyAgICAgICAgcHJpbnQoJ0NoZWNraW5nIG91dCB7bn0gaW4ge2R9Jy5mb3JtYXQobj1zZWxmLm5hbWUsIGQ9c2VsZi5yZXBvX2RpcikpCisgICAgICAgIGlmIHNlbGYuX2FyZ3MuZG9fY2xlYW5fcmVwbzoKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5yZXBvX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYucmVwb19kaXIsICcuZ2l0JykpOgorICAgICAgICAgICAgc2VsZi5DbG9uZSgpCisgICAgICAgIHNlbGYuRmV0Y2goKQorICAgICAgICBpZiBsZW4oc2VsZi5fYXJncy5yZWYpOgorICAgICAgICAgICAgY29tbWFuZF9vdXRwdXQoWydnaXQnLCAnY2hlY2tvdXQnLCBzZWxmLl9hcmdzLnJlZl0sIHNlbGYucmVwb19kaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb21tYW5kX291dHB1dChbJ2dpdCcsICdjaGVja291dCcsIHNlbGYuY29tbWl0XSwgc2VsZi5yZXBvX2RpcikKKyAgICAgICAgcHJpbnQoY29tbWFuZF9vdXRwdXQoWydnaXQnLCAnc3RhdHVzJ10sIHNlbGYucmVwb19kaXIpKQorCisgICAgZGVmIEN1c3RvbVByZVByb2Nlc3Moc2VsZiwgY21kX3N0ciwgcmVwb19kaWN0KToKKyAgICAgICAgcmV0dXJuIGNtZF9zdHIuZm9ybWF0KHJlcG9fZGljdCwgc2VsZi5fYXJncywgQ09ORklHX01BUFtzZWxmLl9hcmdzLmNvbmZpZ10pCisKKyAgICBkZWYgUHJlQnVpbGQoc2VsZik6CisgICAgICAgICIiIkV4ZWN1dGUgYW55IHByZWJ1aWxkIHN0ZXBzIGZyb20gdGhlIHJlcG8gcm9vdCIiIgorICAgICAgICBmb3IgcCBpbiBzZWxmLnByZWJ1aWxkOgorICAgICAgICAgICAgY29tbWFuZF9vdXRwdXQoc2hsZXguc3BsaXQocCksIHNlbGYucmVwb19kaXIpCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdMaW51eCcgb3IgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0Rhcndpbic6CisgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLnByZWJ1aWxkX2xpbnV4OgorICAgICAgICAgICAgICAgIGNvbW1hbmRfb3V0cHV0KHNobGV4LnNwbGl0KHApLCBzZWxmLnJlcG9fZGlyKQorICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLnByZWJ1aWxkX3dpbmRvd3M6CisgICAgICAgICAgICAgICAgY29tbWFuZF9vdXRwdXQoc2hsZXguc3BsaXQocCksIHNlbGYucmVwb19kaXIpCisKKyAgICBkZWYgQ3VzdG9tQnVpbGQoc2VsZiwgcmVwb19kaWN0KToKKyAgICAgICAgIiIiRXhlY3V0ZSBhbnkgY3VzdG9tX2J1aWxkIHN0ZXBzIGZyb20gdGhlIHJlcG8gcm9vdCIiIgorICAgICAgICBmb3IgcCBpbiBzZWxmLmN1c3RvbV9idWlsZDoKKyAgICAgICAgICAgIGNtZCA9IHNlbGYuQ3VzdG9tUHJlUHJvY2VzcyhwLCByZXBvX2RpY3QpCisgICAgICAgICAgICBjb21tYW5kX291dHB1dChzaGxleC5zcGxpdChjbWQpLCBzZWxmLnJlcG9fZGlyKQorCisgICAgZGVmIENNYWtlQ29uZmlnKHNlbGYsIHJlcG9zKToKKyAgICAgICAgIiIiQnVpbGQgQ01ha2UgY29tbWFuZCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcGhhc2UgYW5kIGV4ZWN1dGUgaXQiIiIKKyAgICAgICAgaWYgc2VsZi5fYXJncy5kb19jbGVhbl9idWlsZDoKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5idWlsZF9kaXIpCisgICAgICAgIGlmIHNlbGYuX2FyZ3MuZG9fY2xlYW5faW5zdGFsbDoKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5pbnN0YWxsX2RpcikKKworICAgICAgICAjIENyZWF0ZSBhbmQgY2hhbmdlIHRvIGJ1aWxkIGRpcmVjdG9yeQorICAgICAgICBkaXN0dXRpbHMuZGlyX3V0aWwubWtwYXRoKHNlbGYuYnVpbGRfZGlyKQorICAgICAgICBvcy5jaGRpcihzZWxmLmJ1aWxkX2RpcikKKworICAgICAgICBjbWFrZV9jbWQgPSBbCisgICAgICAgICAgICAnY21ha2UnLCBzZWxmLnJlcG9fZGlyLAorICAgICAgICAgICAgJy1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JyArIHNlbGYuaW5zdGFsbF9kaXIKKyAgICAgICAgXQorCisgICAgICAgICMgRm9yIGVhY2ggcmVwbyB0aGlzIHJlcG8gZGVwZW5kcyBvbiwgZ2VuZXJhdGUgYSBDTWFrZSB2YXJpYWJsZQorICAgICAgICAjIGRlZmluaXRpb25zIGZvciAiLi4uSU5TVEFMTF9ESVIiIHRoYXQgcG9pbnRzIHRvIHRoYXQgZGVwZW5kZW50CisgICAgICAgICMgcmVwbydzIGluc3RhbGwgZGlyLgorICAgICAgICBmb3IgZCBpbiBzZWxmLmRlcHM6CisgICAgICAgICAgICBkZXBfY29tbWl0ID0gW3IgZm9yIHIgaW4gcmVwb3MgaWYgci5uYW1lID09IGRbJ3JlcG9fbmFtZSddXQorICAgICAgICAgICAgaWYgbGVuKGRlcF9jb21taXQpOgorICAgICAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy1Ee3Zhcl9uYW1lfT17aW5zdGFsbF9kaXJ9Jy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lPWRbJ3Zhcl9uYW1lJ10sCisgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfZGlyPWRlcF9jb21taXRbMF0uaW5zdGFsbF9kaXIpKQorCisgICAgICAgICMgQWRkIGFueSBDTWFrZSBvcHRpb25zCisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5jbWFrZV9vcHRpb25zOgorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZChvcHRpb24pCisKKyAgICAgICAgIyBTZXQgYnVpbGQgY29uZmlnIGZvciBzaW5nbGUtY29uZmlndXJhdGlvbiBnZW5lcmF0b3JzCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdMaW51eCcgb3IgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0Rhcndpbic6CisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCctRENNQUtFX0JVSUxEX1RZUEU9e2NvbmZpZ30nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBjb25maWc9Q09ORklHX01BUFtzZWxmLl9hcmdzLmNvbmZpZ10pKQorCisgICAgICAgICMgVXNlIHRoZSBDTWFrZSAtQSBvcHRpb24gdG8gc2VsZWN0IHRoZSBwbGF0Zm9ybSBhcmNoaXRlY3R1cmUKKyAgICAgICAgIyB3aXRob3V0IG5lZWRpbmcgYSBWaXN1YWwgU3R1ZGlvIGdlbmVyYXRvci4KKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgaWYgc2VsZi5fYXJncy5hcmNoID09ICc2NCcgb3Igc2VsZi5fYXJncy5hcmNoID09ICd4NjQnIG9yIHNlbGYuX2FyZ3MuYXJjaCA9PSAnd2luNjQnOgorICAgICAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy1BJykKKyAgICAgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCd4NjQnKQorCisgICAgICAgICMgQXBwbHkgYSBnZW5lcmF0b3IsIGlmIG9uZSBpcyBzcGVjaWZpZWQuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHN1cHBseQorICAgICAgICAjIGEgc3BlY2lmaWMgZ2VuZXJhdG9yIGZvciB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcyB0byBtYXRjaAorICAgICAgICAjIHRoYXQgb2YgdGhlIG1haW4gcmVwb3NpdG9yeS4KKyAgICAgICAgaWYgc2VsZi5fYXJncy5nZW5lcmF0b3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjbWFrZV9jbWQuZXh0ZW5kKFsnLUcnLCBzZWxmLl9hcmdzLmdlbmVyYXRvcl0pCisKKyAgICAgICAgaWYgVkVSQk9TRToKKyAgICAgICAgICAgIHByaW50KCJDTWFrZSBjb21tYW5kOiAiICsgIiAiLmpvaW4oY21ha2VfY21kKSkKKworICAgICAgICByZXRfY29kZSA9IHN1YnByb2Nlc3MuY2FsbChjbWFrZV9jbWQpCisgICAgICAgIGlmIHJldF9jb2RlICE9IDA6CisgICAgICAgICAgICBzeXMuZXhpdChyZXRfY29kZSkKKworICAgIGRlZiBDTWFrZUJ1aWxkKHNlbGYpOgorICAgICAgICAiIiJCdWlsZCBDTWFrZSBjb21tYW5kIGZvciB0aGUgYnVpbGQgcGhhc2UgYW5kIGV4ZWN1dGUgaXQiIiIKKyAgICAgICAgY21ha2VfY21kID0gWydjbWFrZScsICctLWJ1aWxkJywgc2VsZi5idWlsZF9kaXIsICctLXRhcmdldCcsICdpbnN0YWxsJ10KKyAgICAgICAgaWYgc2VsZi5fYXJncy5kb19jbGVhbjoKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy0tY2xlYW4tZmlyc3QnKQorCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy0tY29uZmlnJykKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoQ09ORklHX01BUFtzZWxmLl9hcmdzLmNvbmZpZ10pCisKKyAgICAgICAgIyBTcGVlZCB1cCB0aGUgYnVpbGQuCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdMaW51eCcgb3IgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0Rhcndpbic6CisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCctLScpCisgICAgICAgICAgICBudW1fbWFrZV9qb2JzID0gbXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpCisgICAgICAgICAgICBlbnZfbWFrZV9qb2JzID0gb3MuZW52aXJvbi5nZXQoJ01BS0VfSk9CUycsIE5vbmUpCisgICAgICAgICAgICBpZiBlbnZfbWFrZV9qb2JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbnVtX21ha2Vfam9icyA9IG1pbihudW1fbWFrZV9qb2JzLCBpbnQoZW52X21ha2Vfam9icykpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCd3YXJuaW5nOiBlbnZpcm9ubWVudCB2YXJpYWJsZSBNQUtFX0pPQlMgaGFzIG5vbi1udW1lcmljIHZhbHVlICJ7fSIuICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdVc2luZyB7fSAoQ1BVIGNvdW50KSBpbnN0ZWFkLicuZm9ybWF0KGVudl9tYWtlX2pvYnMsIG51bV9tYWtlX2pvYnMpKQorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnLWp7fScuZm9ybWF0KG51bV9tYWtlX2pvYnMpKQorICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCctLScpCisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCcvbWF4Y3B1Y291bnQnKQorCisgICAgICAgIGlmIFZFUkJPU0U6CisgICAgICAgICAgICBwcmludCgiQ01ha2UgY29tbWFuZDogIiArICIgIi5qb2luKGNtYWtlX2NtZCkpCisKKyAgICAgICAgcmV0X2NvZGUgPSBzdWJwcm9jZXNzLmNhbGwoY21ha2VfY21kKQorICAgICAgICBpZiByZXRfY29kZSAhPSAwOgorICAgICAgICAgICAgc3lzLmV4aXQocmV0X2NvZGUpCisKKyAgICBkZWYgQnVpbGQoc2VsZiwgcmVwb3MsIHJlcG9fZGljdCk6CisgICAgICAgICIiIkJ1aWxkIHRoZSBkZXBlbmRlbnQgcmVwbyIiIgorICAgICAgICBwcmludCgnQnVpbGRpbmcge259IGluIHtkfScuZm9ybWF0KG49c2VsZi5uYW1lLCBkPXNlbGYucmVwb19kaXIpKQorICAgICAgICBwcmludCgnQnVpbGQgZGlyID0ge2J9Jy5mb3JtYXQoYj1zZWxmLmJ1aWxkX2RpcikpCisgICAgICAgIHByaW50KCdJbnN0YWxsIGRpciA9IHtpfVxuJy5mb3JtYXQoaT1zZWxmLmluc3RhbGxfZGlyKSkKKworICAgICAgICAjIFJ1biBhbnkgcHJlYnVpbGQgY29tbWFuZHMKKyAgICAgICAgc2VsZi5QcmVCdWlsZCgpCisKKyAgICAgICAgaWYgc2VsZi5idWlsZF9zdGVwID09ICdjdXN0b20nOgorICAgICAgICAgICAgc2VsZi5DdXN0b21CdWlsZChyZXBvX2RpY3QpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEJ1aWxkIGFuZCBleGVjdXRlIENNYWtlIGNvbW1hbmQgZm9yIGNyZWF0aW5nIGJ1aWxkIGZpbGVzCisgICAgICAgIHNlbGYuQ01ha2VDb25maWcocmVwb3MpCisKKyAgICAgICAgIyBCdWlsZCBhbmQgZXhlY3V0ZSBDTWFrZSBjb21tYW5kIGZvciB0aGUgYnVpbGQKKyAgICAgICAgc2VsZi5DTWFrZUJ1aWxkKCkKKworCitkZWYgR2V0R29vZFJlcG9zKGFyZ3MpOgorICAgICIiIlJldHVybnMgdGhlIGxhdGVzdCBsaXN0IG9mIEdvb2RSZXBvIG9iamVjdHMuCisKKyAgICBUaGUga25vd24tZ29vZCBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBzYW1lCisgICAgZGlyZWN0b3J5IGFzIHRoaXMgc2NyaXB0IHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSAna25vd25fZ29vZF9kaXInCisgICAgcGFyYW1ldGVyLgorICAgICIiIgorICAgIGlmIGFyZ3Mua25vd25fZ29vZF9kaXI6CisgICAgICAgIGtub3duX2dvb2RfZmlsZSA9IG9zLnBhdGguam9pbiggb3MucGF0aC5hYnNwYXRoKGFyZ3Mua25vd25fZ29vZF9kaXIpLAorICAgICAgICAgICAgS05PV05fR09PRF9GSUxFX05BTUUpCisgICAgZWxzZToKKyAgICAgICAga25vd25fZ29vZF9maWxlID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCBLTk9XTl9HT09EX0ZJTEVfTkFNRSkKKyAgICB3aXRoIG9wZW4oa25vd25fZ29vZF9maWxlKSBhcyBrbm93bl9nb29kOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgR29vZFJlcG8ocmVwbywgYXJncykKKyAgICAgICAgICAgIGZvciByZXBvIGluIGpzb24ubG9hZHMoa25vd25fZ29vZC5yZWFkKCkpWydyZXBvcyddCisgICAgICAgIF0KKworCitkZWYgR2V0SW5zdGFsbE5hbWVzKGFyZ3MpOgorICAgICIiIlJldHVybnMgdGhlIGluc3RhbGwgbmFtZXMgbGlzdC4KKworICAgIFRoZSBrbm93bi1nb29kIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIHNhbWUKKyAgICBkaXJlY3RvcnkgYXMgdGhpcyBzY3JpcHQgdW5sZXNzIG92ZXJyaWRkZW4gYnkgdGhlICdrbm93bl9nb29kX2RpcicKKyAgICBwYXJhbWV0ZXIuCisgICAgIiIiCisgICAgaWYgYXJncy5rbm93bl9nb29kX2RpcjoKKyAgICAgICAga25vd25fZ29vZF9maWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChhcmdzLmtub3duX2dvb2RfZGlyKSwKKyAgICAgICAgICAgIEtOT1dOX0dPT0RfRklMRV9OQU1FKQorICAgIGVsc2U6CisgICAgICAgIGtub3duX2dvb2RfZmlsZSA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgS05PV05fR09PRF9GSUxFX05BTUUpCisgICAgd2l0aCBvcGVuKGtub3duX2dvb2RfZmlsZSkgYXMga25vd25fZ29vZDoKKyAgICAgICAgaW5zdGFsbF9pbmZvID0ganNvbi5sb2Fkcyhrbm93bl9nb29kLnJlYWQoKSkKKyAgICAgICAgaWYgaW5zdGFsbF9pbmZvLmdldCgnaW5zdGFsbF9uYW1lcycpOgorICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxfaW5mb1snaW5zdGFsbF9uYW1lcyddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisKK2RlZiBDcmVhdGVIZWxwZXIoYXJncywgcmVwb3MsIGZpbGVuYW1lKToKKyAgICAiIiJDcmVhdGUgYSBDTWFrZSBjb25maWcgaGVscGVyIGZpbGUuCisKKyAgICBUaGUgaGVscGVyIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoICdjbWFrZSAtQyA8ZmlsZT4nCisgICAgdG8gYnVpbGQgdGhpcyBob21lIHJlcG8gdXNpbmcgdGhlIGRlcGVuZGVuY2llcyBidWlsdCBieSB0aGlzIHNjcmlwdC4KKworICAgIFRoZSBpbnN0YWxsX25hbWVzIGRpY3Rpb25hcnkgcmVwcmVzZW50cyB0aGUgQ01ha2UgdmFyaWFibGVzIHVzZWQgYnkgdGhlCisgICAgaG9tZSByZXBvIHRvIGxvY2F0ZSB0aGUgaW5zdGFsbCBkaXJzIG9mIHRoZSBkZXBlbmRlbnQgcmVwb3MuCisgICAgVGhpcyBpbmZvcm1hdGlvbiBpcyBiYWtlZCBpbnRvIHRoZSBDTWFrZSBmaWxlcyBvZiB0aGUgaG9tZSByZXBvIGFuZCBzbworICAgIHRoaXMgZGljdGlvbmFyeSBpcyBrZXB0IHdpdGggdGhlIHJlcG8gdmlhIHRoZSBqc29uIGZpbGUuCisgICAgIiIiCisgICAgZGVmIGVzY2FwZShwYXRoKToKKyAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnXFwnLCAnXFxcXCcpCisgICAgaW5zdGFsbF9uYW1lcyA9IEdldEluc3RhbGxOYW1lcyhhcmdzKQorICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBoZWxwZXJfZmlsZToKKyAgICAgICAgZm9yIHJlcG8gaW4gcmVwb3M6CisgICAgICAgICAgICBpZiBpbnN0YWxsX25hbWVzIGFuZCByZXBvLm5hbWUgaW4gaW5zdGFsbF9uYW1lcyBhbmQgcmVwby5vbl9idWlsZF9wbGF0Zm9ybToKKyAgICAgICAgICAgICAgICBoZWxwZXJfZmlsZS53cml0ZSgnc2V0KHt2YXJ9ICJ7ZGlyfSIgQ0FDSEUgU1RSSU5HICIiIEZPUkNFKVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcj1pbnN0YWxsX25hbWVzW3JlcG8ubmFtZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj1lc2NhcGUocmVwby5pbnN0YWxsX2RpcikpKQorCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICAgIGRlc2NyaXB0aW9uPSdHZXQgYW5kIGJ1aWxkIGRlcGVuZGVudCByZXBvcyBhdCBrbm93bi1nb29kIGNvbW1pdHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWtub3duX2dvb2RfZGlyJywKKyAgICAgICAgZGVzdD0na25vd25fZ29vZF9kaXInLAorICAgICAgICBoZWxwPSJTcGVjaWZ5IGRpcmVjdG9yeSBmb3Iga25vd25fZ29vZC5qc29uIGZpbGUuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1kaXInLAorICAgICAgICBkZXN0PSdkaXInLAorICAgICAgICBkZWZhdWx0PScuJywKKyAgICAgICAgaGVscD0iU2V0IHRhcmdldCBkaXJlY3RvcnkgZm9yIHJlcG9zaXRvcnkgcm9vdHMuIERlZmF1bHQgaXMgXCcuXCcuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1yZWYnLAorICAgICAgICBkZXN0PSdyZWYnLAorICAgICAgICBkZWZhdWx0PScnLAorICAgICAgICBoZWxwPSJPdmVycmlkZSAnY29tbWl0JyB3aXRoIGdpdCByZWZlcmVuY2UuIEUuZy4sICdvcmlnaW4vbWFzdGVyJyIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tbm8tYnVpbGQnLAorICAgICAgICBkZXN0PSdkb19idWlsZCcsCisgICAgICAgIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAorICAgICAgICBoZWxwPQorICAgICAgICAiQ2xvbmUvdXBkYXRlIHJlcG9zaXRvcmllcyBhbmQgZ2VuZXJhdGUgYnVpbGQgZmlsZXMgd2l0aG91dCBwZXJmb3JtaW5nIGNvbXBpbGF0aW9uIiwKKyAgICAgICAgZGVmYXVsdD1UcnVlKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWNsZWFuJywKKyAgICAgICAgZGVzdD0nZG9fY2xlYW4nLAorICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICBoZWxwPSJDbGVhbiBmaWxlcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXIgYW5kIGxpbmtlciBiZWZvcmUgYnVpbGRpbmciLAorICAgICAgICBkZWZhdWx0PUZhbHNlKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWNsZWFuLXJlcG8nLAorICAgICAgICBkZXN0PSdkb19jbGVhbl9yZXBvJywKKyAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgaGVscD0iRGVsZXRlIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGJlZm9yZSBidWlsZGluZyIsCisgICAgICAgIGRlZmF1bHQ9RmFsc2UpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tY2xlYW4tYnVpbGQnLAorICAgICAgICBkZXN0PSdkb19jbGVhbl9idWlsZCcsCisgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgIGhlbHA9IkRlbGV0ZSBidWlsZCBkaXJlY3RvcnkgYmVmb3JlIGJ1aWxkaW5nIiwKKyAgICAgICAgZGVmYXVsdD1GYWxzZSkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1jbGVhbi1pbnN0YWxsJywKKyAgICAgICAgZGVzdD0nZG9fY2xlYW5faW5zdGFsbCcsCisgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgIGhlbHA9IkRlbGV0ZSBpbnN0YWxsIGRpcmVjdG9yeSBiZWZvcmUgYnVpbGRpbmciLAorICAgICAgICBkZWZhdWx0PUZhbHNlKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWFyY2gnLAorICAgICAgICBkZXN0PSdhcmNoJywKKyAgICAgICAgY2hvaWNlcz1bJzMyJywgJzY0JywgJ3g4NicsICd4NjQnLCAnd2luMzInLCAnd2luNjQnXSwKKyAgICAgICAgdHlwZT1zdHIubG93ZXIsCisgICAgICAgIGhlbHA9IlNldCBidWlsZCBmaWxlcyBhcmNoaXRlY3R1cmUgKFdpbmRvd3MpIiwKKyAgICAgICAgZGVmYXVsdD0nNjQnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWNvbmZpZycsCisgICAgICAgIGRlc3Q9J2NvbmZpZycsCisgICAgICAgIGNob2ljZXM9WydkZWJ1ZycsICdyZWxlYXNlJywgJ3JlbHdpdGhkZWJpbmZvJywgJ21pbnNpemVyZWwnXSwKKyAgICAgICAgdHlwZT1zdHIubG93ZXIsCisgICAgICAgIGhlbHA9IlNldCBidWlsZCBmaWxlcyBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgZGVmYXVsdD0nZGVidWcnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWdlbmVyYXRvcicsCisgICAgICAgIGRlc3Q9J2dlbmVyYXRvcicsCisgICAgICAgIGhlbHA9IlNldCB0aGUgQ01ha2UgZ2VuZXJhdG9yIiwKKyAgICAgICAgZGVmYXVsdD1Ob25lKQorCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBzYXZlX2N3ZCA9IG9zLmdldGN3ZCgpCisKKyAgICAjIENyZWF0ZSB3b3JraW5nICJ0b3AiIGRpcmVjdG9yeSBpZiBuZWVkZWQKKyAgICBkaXN0dXRpbHMuZGlyX3V0aWwubWtwYXRoKGFyZ3MuZGlyKQorICAgIGFic190b3BfZGlyID0gb3MucGF0aC5hYnNwYXRoKGFyZ3MuZGlyKQorCisgICAgcmVwb3MgPSBHZXRHb29kUmVwb3MoYXJncykKKyAgICByZXBvX2RpY3QgPSB7fQorCisgICAgcHJpbnQoJ1N0YXJ0aW5nIGJ1aWxkcyBpbiB7ZH0nLmZvcm1hdChkPWFic190b3BfZGlyKSkKKyAgICBmb3IgcmVwbyBpbiByZXBvczoKKyAgICAgICAgIyBJZiB0aGUgcmVwbyBoYXMgYSBwbGF0Zm9ybSB3aGl0ZWxpc3QsIHNraXAgdGhlIHJlcG8KKyAgICAgICAgIyB1bmxlc3Mgd2UgYXJlIGJ1aWxkaW5nIG9uIGEgd2hpdGVsaXN0ZWQgcGxhdGZvcm0uCisgICAgICAgIGlmIG5vdCByZXBvLm9uX2J1aWxkX3BsYXRmb3JtOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBmaWVsZF9saXN0ID0gKCd1cmwnLAorICAgICAgICAgICAgICAgICAgICAgICdzdWJfZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAnY29tbWl0JywKKyAgICAgICAgICAgICAgICAgICAgICAnYnVpbGRfZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbF9kaXInLAorICAgICAgICAgICAgICAgICAgICAgICdkZXBzJywKKyAgICAgICAgICAgICAgICAgICAgICAncHJlYnVpbGQnLAorICAgICAgICAgICAgICAgICAgICAgICdwcmVidWlsZF9saW51eCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3ByZWJ1aWxkX3dpbmRvd3MnLAorICAgICAgICAgICAgICAgICAgICAgICdjdXN0b21fYnVpbGQnLAorICAgICAgICAgICAgICAgICAgICAgICdjbWFrZV9vcHRpb25zJywKKyAgICAgICAgICAgICAgICAgICAgICAnY2lfb25seScsCisgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX3N0ZXAnLAorICAgICAgICAgICAgICAgICAgICAgICdidWlsZF9wbGF0Zm9ybXMnLAorICAgICAgICAgICAgICAgICAgICAgICdyZXBvX2RpcicsCisgICAgICAgICAgICAgICAgICAgICAgJ29uX2J1aWxkX3BsYXRmb3JtJykKKyAgICAgICAgcmVwb19kaWN0W3JlcG8ubmFtZV0gPSB7ZmllbGQ6IGdldGF0dHIocmVwbywgZmllbGQpIGZvciBmaWVsZCBpbiBmaWVsZF9saXN0fQorCisgICAgICAgICMgSWYgdGhlIHJlcG8gaGFzIGEgQ0kgd2hpdGVsaXN0LCBza2lwIHRoZSByZXBvIHVubGVzcworICAgICAgICAjIG9uZSBvZiB0aGUgQ0kncyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdG8gdHJ1ZS4KKyAgICAgICAgaWYgbGVuKHJlcG8uY2lfb25seSk6CisgICAgICAgICAgICBkb19idWlsZCA9IEZhbHNlCisgICAgICAgICAgICBmb3IgZW52IGluIHJlcG8uY2lfb25seToKKyAgICAgICAgICAgICAgICBpZiBub3QgZW52IGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgb3MuZW52aXJvbltlbnZdLmxvd2VyKCkgPT0gJ3RydWUnOgorICAgICAgICAgICAgICAgICAgICBkb19idWlsZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5vdCBkb19idWlsZDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICMgQ2xvbmUvdXBkYXRlIHRoZSByZXBvc2l0b3J5CisgICAgICAgIHJlcG8uQ2hlY2tvdXQoKQorCisgICAgICAgICMgQnVpbGQgdGhlIHJlcG9zaXRvcnkKKyAgICAgICAgaWYgYXJncy5kb19idWlsZCBhbmQgcmVwby5idWlsZF9zdGVwICE9ICdza2lwJzoKKyAgICAgICAgICAgIHJlcG8uQnVpbGQocmVwb3MsIHJlcG9fZGljdCkKKworICAgICMgTmVlZCB0byByZXN0b3JlIG9yaWdpbmFsIGN3ZCBpbiBvcmRlciBmb3IgQ3JlYXRlSGVscGVyIHRvIGZpbmQganNvbiBmaWxlCisgICAgb3MuY2hkaXIoc2F2ZV9jd2QpCisgICAgQ3JlYXRlSGVscGVyKGFyZ3MsIHJlcG9zLCBvcy5wYXRoLmpvaW4oYWJzX3RvcF9kaXIsICdoZWxwZXIuY21ha2UnKSkKKworICAgIHN5cy5leGl0KDApCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMvdnVsa2FuX3Rvb2xzX2hlbHBlcl9maWxlX2dlbmVyYXRvci5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3NjcmlwdHMvdnVsa2FuX3Rvb2xzX2hlbHBlcl9maWxlX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTViMjQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy92dWxrYW5fdG9vbHNfaGVscGVyX2ZpbGVfZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMTIzMiBAQAorIyEvdXNyL2Jpbi9weXRob24zIC1pCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorIyBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyMgQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorCitpbXBvcnQgb3MscmUsc3lzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIGV0cmVlCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgKgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorZnJvbSBjb21tb25fY29kZWdlbiBpbXBvcnQgKgorCisjCisjIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zIC0gc3ViY2xhc3Mgb2YgR2VuZXJhdG9yT3B0aW9ucy4KK2NsYXNzIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zKEdlbmVyYXRvck9wdGlvbnMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBjb252ZW50aW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gJy4nLAorICAgICAgICAgICAgICAgICBhcGluYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZW1pdHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgc29ydFByb2NlZHVyZSA9IHJlZ1NvcnRGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgcHJlZml4VGV4dCA9ICIiLAorICAgICAgICAgICAgICAgICBnZW5GdW5jUG9pbnRlcnMgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0RmlsZSA9IFRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgYXBpY2FsbCA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeSA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeXAgPSAnJywKKyAgICAgICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICBsaWJyYXJ5X25hbWUgPSAnJywKKyAgICAgICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IFRydWUsCisgICAgICAgICAgICAgICAgIGhlbHBlcl9maWxlX3R5cGUgPSAnJyk6CisgICAgICAgIEdlbmVyYXRvck9wdGlvbnMuX19pbml0X18oc2VsZiwgY29udmVudGlvbnMsIGZpbGVuYW1lLCBkaXJlY3RvcnksIGFwaW5hbWUsIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMsIGVtaXR2ZXJzaW9ucywgZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucywgcmVtb3ZlRXh0ZW5zaW9ucywgZW1pdEV4dGVuc2lvbnMsIHNvcnRQcm9jZWR1cmUpCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgICA9IHByZWZpeFRleHQKKyAgICAgICAgc2VsZi5nZW5GdW5jUG9pbnRlcnMgID0gZ2VuRnVuY1BvaW50ZXJzCisgICAgICAgIHNlbGYucHJvdGVjdEZpbGUgICAgICA9IHByb3RlY3RGaWxlCisgICAgICAgIHNlbGYucHJvdGVjdEZlYXR1cmUgICA9IHByb3RlY3RGZWF0dXJlCisgICAgICAgIHNlbGYuYXBpY2FsbCAgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgID0gYXBpZW50cnkKKyAgICAgICAgc2VsZi5hcGllbnRyeXAgICAgICAgID0gYXBpZW50cnlwCisgICAgICAgIHNlbGYuYWxpZ25GdW5jUGFyYW0gICA9IGFsaWduRnVuY1BhcmFtCisgICAgICAgIHNlbGYubGlicmFyeV9uYW1lICAgICA9IGxpYnJhcnlfbmFtZQorICAgICAgICBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPSBoZWxwZXJfZmlsZV90eXBlCisjCisjIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3IgLSBzdWJjbGFzcyBvZiBPdXRwdXRHZW5lcmF0b3IuIE91dHB1dHMgVnVsa2FuIGhlbHBlciBmaWxlcworY2xhc3MgSGVscGVyRmlsZU91dHB1dEdlbmVyYXRvcihPdXRwdXRHZW5lcmF0b3IpOgorICAgICIiIkdlbmVyYXRlIGhlbHBlciBmaWxlIGJhc2VkIG9uIFhNTCBlbGVtZW50IGF0dHJpYnV0ZXMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgZXJyRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIHdhcm5GaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgZGlhZ0ZpbGUgPSBzeXMuc3Rkb3V0KToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkKKyAgICAgICAgIyBJbnRlcm5hbCBzdGF0ZSAtIGFjY3VtdWxhdG9ycyBmb3IgZGlmZmVyZW50IGlubmVyIGJsb2NrIHRleHQKKyAgICAgICAgc2VsZi5lbnVtX291dHB1dCA9ICcnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmluZyBidWlsdCB1cCBvZiBlbnVtIHN0cmluZyByb3V0aW5lcworICAgICAgICAjIEludGVybmFsIHN0YXRlIC0gYWNjdW11bGF0b3JzIGZvciBkaWZmZXJlbnQgaW5uZXIgYmxvY2sgdGV4dAorICAgICAgICBzZWxmLnN0cnVjdE5hbWVzID0gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTGlzdCBvZiBWdWxrYW4gc3RydWN0IHR5cGVuYW1lcworICAgICAgICBzZWxmLnN0cnVjdFR5cGVzID0gZGljdCgpICAgICAgICAgICAgICAgICAgICAgICAgICMgTWFwIG9mIFZ1bGthbiBzdHJ1Y3QgdHlwZW5hbWUgdG8gcmVxdWlyZWQgVmtTdHJ1Y3R1cmVUeXBlCisgICAgICAgIHNlbGYuc3RydWN0TWVtYmVycyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMaXN0IG9mIFN0cnVjdE1lbWJlckRhdGEgcmVjb3JkcyBmb3IgYWxsIFZ1bGthbiBzdHJ1Y3RzCisgICAgICAgIHNlbGYub2JqZWN0X3R5cGVzID0gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMaXN0IG9mIGFsbCBoYW5kbGUgdHlwZXMKKyAgICAgICAgc2VsZi5vYmplY3RfdHlwZV9hbGlhc2VzID0gW10gICAgICAgICAgICAgICAgICAgICAjIEFsaWFzZXMgdG8gaGFuZGxlcyB0eXBlcyAoZm9yIGhhbmRsZXMgdGhhdCB3ZXJlIGV4dGVuc2lvbnMpCisgICAgICAgIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlcyA9IFtdICAgICAgICAgICAgICAgIyBIYW5keSBjb3B5IG9mIGRlYnVnX3JlcG9ydF9vYmplY3RfdHlwZSBlbnVtIGRhdGEKKyAgICAgICAgc2VsZi5jb3JlX29iamVjdF90eXBlcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAjIEhhbmR5IGNvcHkgb2YgY29yZV9vYmplY3RfdHlwZSBlbnVtIGRhdGEKKyAgICAgICAgc2VsZi5kZXZpY2VfZXh0ZW5zaW9uX2luZm8gPSBkaWN0KCkgICAgICAgICAgICAgICAjIERpY3Qgb2YgZGV2aWNlIGV4dGVuc2lvbiBuYW1lIGRlZmluZXMgYW5kIGlmZGVmIHZhbHVlcworICAgICAgICBzZWxmLmluc3RhbmNlX2V4dGVuc2lvbl9pbmZvID0gZGljdCgpICAgICAgICAgICAgICMgRGljdCBvZiBpbnN0YW5jZSBleHRlbnNpb24gbmFtZSBkZWZpbmVzIGFuZCBpZmRlZiB2YWx1ZXMKKworICAgICAgICAjIE5hbWVkIHR1cGxlcyB0byBzdG9yZSBzdHJ1Y3QgYW5kIGNvbW1hbmQgZGF0YQorICAgICAgICBzZWxmLlN0cnVjdFR5cGUgPSBuYW1lZHR1cGxlKCdTdHJ1Y3RUeXBlJywgWyduYW1lJywgJ3ZhbHVlJ10pCisgICAgICAgIHNlbGYuQ29tbWFuZFBhcmFtID0gbmFtZWR0dXBsZSgnQ29tbWFuZFBhcmFtJywgWyd0eXBlJywgJ25hbWUnLCAnaXNwb2ludGVyJywgJ2lzc3RhdGljYXJyYXknLCAnaXNjb25zdCcsICdpc2NvdW50JywgJ2xlbicsICdleHRzdHJ1Y3RzJywgJ2NkZWNsJ10pCisgICAgICAgIHNlbGYuU3RydWN0TWVtYmVyRGF0YSA9IG5hbWVkdHVwbGUoJ1N0cnVjdE1lbWJlckRhdGEnLCBbJ25hbWUnLCAnbWVtYmVycycsICdpZmRlZl9wcm90ZWN0J10pCisKKyAgICAgICAgc2VsZi5jdXN0b21fY29uc3RydWN0X3BhcmFtcyA9IHsKKyAgICAgICAgICAgICMgc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIG5lZWRzIHRvIGtub3cgaWYgc3VicGFzcyBoYXMgY29sb3IgYW5kXG9yIGRlcHRoXHN0ZW5jaWwgYXR0YWNobWVudHMgdG8gdXNlIGl0cyBwb2ludGVycworICAgICAgICAgICAgJ1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAnLCBjb25zdCBib29sIHVzZXNfY29sb3JfYXR0YWNobWVudCwgY29uc3QgYm9vbCB1c2VzX2RlcHRoc3RlbmNpbF9hdHRhY2htZW50JywKKyAgICAgICAgICAgICMgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gbmVlZHMgdG8ga25vdyBpZiB2aWV3cG9ydCBhbmQgc2Npc3NvciBpcyBkeW5hbWljIHRvIHVzZSBpdHMgcG9pbnRlcnMKKyAgICAgICAgICAgICdWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAnLCBjb25zdCBib29sIGlzX2R5bmFtaWNfdmlld3BvcnRzLCBjb25zdCBib29sIGlzX2R5bmFtaWNfc2Npc3NvcnMnLAorICAgICAgICB9CisgICAgIworICAgICMgQ2FsbGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bgorICAgIGRlZiBiZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cykKKyAgICAgICAgIyBVc2VyLXN1cHBsaWVkIHByZWZpeCB0ZXh0LCBpZiBhbnkgKGxpc3Qgb2Ygc3RyaW5ncykKKyAgICAgICAgc2VsZi5oZWxwZXJfZmlsZV90eXBlID0gZ2VuT3B0cy5oZWxwZXJfZmlsZV90eXBlCisgICAgICAgIHNlbGYubGlicmFyeV9uYW1lID0gZ2VuT3B0cy5saWJyYXJ5X25hbWUKKyAgICAgICAgIyBGaWxlIENvbW1lbnQKKyAgICAgICAgZmlsZV9jb21tZW50ID0gJy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqXG4nCisgICAgICAgIGZpbGVfY29tbWVudCArPSAnLy8gU2VlIHZ1bGthbl90b29sc19oZWxwZXJfZmlsZV9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnNcbicKKyAgICAgICAgd3JpdGUoZmlsZV9jb21tZW50LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgIyBDb3B5cmlnaHQgTm90aWNlCisgICAgICAgIGNvcHlyaWdodCA9ICcnCisgICAgICAgIGNvcHlyaWdodCArPSAnXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgTHVuYXJHLCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgR29vZ2xlIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpO1xuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlnb0Bnb29nbGUuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZvcmJlc0Bnb29nbGUuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogSm9obiBadWxhdWY8anp1bGF1ZkBsdW5hcmcuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4nCisgICAgICAgIHdyaXRlKGNvcHlyaWdodCwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgIworICAgICMgV3JpdGUgZ2VuZXJhdGVkIGZpbGUgY29udGVudCB0byBvdXRwdXQgZmlsZQorICAgIGRlZiBlbmRGaWxlKHNlbGYpOgorICAgICAgICBkZXN0X2ZpbGUgPSAnJworICAgICAgICBkZXN0X2ZpbGUgKz0gc2VsZi5PdXRwdXREZXN0RmlsZSgpCisgICAgICAgICMgUmVtb3ZlIGJsYW5rIGxpbmVzIGF0IEVPRgorICAgICAgICBpZiBkZXN0X2ZpbGUuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICBkZXN0X2ZpbGUgPSBkZXN0X2ZpbGVbOi0xXQorICAgICAgICB3cml0ZShkZXN0X2ZpbGUsIGZpbGU9c2VsZi5vdXRGaWxlKTsKKyAgICAgICAgIyBGaW5pc2ggcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5lbmRGaWxlKHNlbGYpCisgICAgIworICAgICMgT3ZlcnJpZGUgcGFyZW50IGNsYXNzIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBiZWdpbm5pbmcgb2YgYW4gZXh0ZW5zaW9uCisgICAgZGVmIGJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpOgorICAgICAgICAjIFN0YXJ0IHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCkKKyAgICAgICAgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0ID0gR2V0RmVhdHVyZVByb3RlY3QoaW50ZXJmYWNlKQorCisgICAgICAgIGlmIHNlbGYuZmVhdHVyZU5hbWUgPT0gJ1ZLX1ZFUlNJT05fMV8wJyBvciBzZWxmLmZlYXR1cmVOYW1lID09ICdWS19WRVJTSU9OXzFfMSc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbmFtZSA9IHNlbGYuZmVhdHVyZU5hbWUKKyAgICAgICAgbmFtZUVsZW0gPSBpbnRlcmZhY2VbMF1bMV0KKyAgICAgICAgbmFtZV9kZWZpbmUgPSBuYW1lRWxlbS5nZXQoJ25hbWUnKQorICAgICAgICBpZiAnRVhURU5TSU9OX05BTUUnIG5vdCBpbiBuYW1lX2RlZmluZToKKyAgICAgICAgICAgIHByaW50KCJFcnJvciBpbiB2ay54bWwgZmlsZSAtLSBleHRlbnNpb24gbmFtZSBpcyBub3QgYXZhaWxhYmxlIikKKyAgICAgICAgcmVxdWlyZXMgPSBpbnRlcmZhY2UuZ2V0KCdyZXF1aXJlcycpCisgICAgICAgIGlmIHJlcXVpcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVxdWlyZWRfZXh0ZW5zaW9ucyA9IHJlcXVpcmVzLnNwbGl0KCcsJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcXVpcmVkX2V4dGVuc2lvbnMgPSBsaXN0KCkKKyAgICAgICAgaW5mbyA9IHsgJ2RlZmluZSc6IG5hbWVfZGVmaW5lLCAnaWZkZWYnOnNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwgJ3JlcXMnOnJlcXVpcmVkX2V4dGVuc2lvbnMgfQorICAgICAgICBpZiBpbnRlcmZhY2UuZ2V0KCd0eXBlJykgPT0gJ2luc3RhbmNlJzoKKyAgICAgICAgICAgIHNlbGYuaW5zdGFuY2VfZXh0ZW5zaW9uX2luZm9bbmFtZV0gPSBpbmZvCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRldmljZV9leHRlbnNpb25faW5mb1tuYW1lXSA9IGluZm8KKworICAgICMKKyAgICAjIE92ZXJyaWRlIHBhcmVudCBjbGFzcyB0byBiZSBub3RpZmllZCBvZiB0aGUgZW5kIG9mIGFuIGV4dGVuc2lvbgorICAgIGRlZiBlbmRGZWF0dXJlKHNlbGYpOgorICAgICAgICAjIEZpbmlzaCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmVuZEZlYXR1cmUoc2VsZikKKyAgICAjCisgICAgIyBHcmFiIGdyb3VwIChlLmcuIEMgImVudW0iIHR5cGUpIGluZm8gdG8gb3V0cHV0IGZvciBlbnVtLXN0cmluZyBjb252ZXJzaW9uIGhlbHBlcgorICAgIGRlZiBnZW5Hcm91cChzZWxmLCBncm91cGluZm8sIGdyb3VwTmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuR3JvdXAoc2VsZiwgZ3JvdXBpbmZvLCBncm91cE5hbWUsIGFsaWFzKQorICAgICAgICBncm91cEVsZW0gPSBncm91cGluZm8uZWxlbQorICAgICAgICAjIEZvciBlbnVtX3N0cmluZ19oZWFkZXIKKyAgICAgICAgaWYgc2VsZi5oZWxwZXJfZmlsZV90eXBlID09ICdlbnVtX3N0cmluZ19oZWFkZXInOgorICAgICAgICAgICAgdmFsdWVfc2V0ID0gc2V0KCkKKyAgICAgICAgICAgIGZvciBlbGVtIGluIGdyb3VwRWxlbS5maW5kYWxsKCdlbnVtJyk6CisgICAgICAgICAgICAgICAgaWYgZWxlbS5nZXQoJ3N1cHBvcnRlZCcpICE9ICdkaXNhYmxlZCcgYW5kIGVsZW0uZ2V0KCdhbGlhcycpID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX3NldC5hZGQoZWxlbS5nZXQoJ25hbWUnKSkKKyAgICAgICAgICAgIHNlbGYuZW51bV9vdXRwdXQgKz0gc2VsZi5HZW5lcmF0ZUVudW1TdHJpbmdDb252ZXJzaW9uKGdyb3VwTmFtZSwgdmFsdWVfc2V0KQorICAgICAgICBlbGlmIHNlbGYuaGVscGVyX2ZpbGVfdHlwZSA9PSAnb2JqZWN0X3R5cGVzX2hlYWRlcic6CisgICAgICAgICAgICBpZiBncm91cE5hbWUgPT0gJ1ZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUJzoKKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBncm91cEVsZW0uZmluZGFsbCgnZW51bScpOgorICAgICAgICAgICAgICAgICAgICBpZiBlbGVtLmdldCgnc3VwcG9ydGVkJykgIT0gJ2Rpc2FibGVkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fbmFtZSA9IGVsZW0uZ2V0KCduYW1lJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlcy5hcHBlbmQoaXRlbV9uYW1lKQorICAgICAgICAgICAgZWxpZiBncm91cE5hbWUgPT0gJ1ZrT2JqZWN0VHlwZSc6CisgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gZ3JvdXBFbGVtLmZpbmRhbGwoJ2VudW0nKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZWxlbS5nZXQoJ3N1cHBvcnRlZCcpICE9ICdkaXNhYmxlZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX25hbWUgPSBlbGVtLmdldCgnbmFtZScpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvcmVfb2JqZWN0X3R5cGVzLmFwcGVuZChpdGVtX25hbWUpCisKKyAgICAjCisgICAgIyBDYWxsZWQgZm9yIGVhY2ggdHlwZSAtLSBpZiB0aGUgdHlwZSBpcyBhIHN0cnVjdC91bmlvbiwgZ3JhYiB0aGUgbWV0YWRhdGEKKyAgICBkZWYgZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgIHR5cGVFbGVtID0gdHlwZWluZm8uZWxlbQorICAgICAgICAjIElmIHRoZSB0eXBlIGlzIGEgc3RydWN0IHR5cGUsIHRyYXZlcnNlIHRoZSBpbWJlZGRlZCA8bWVtYmVyPiB0YWdzIGdlbmVyYXRpbmcgYSBzdHJ1Y3R1cmUuCisgICAgICAgICMgT3RoZXJ3aXNlLCBlbWl0IHRoZSB0YWcgdGV4dC4KKyAgICAgICAgY2F0ZWdvcnkgPSB0eXBlRWxlbS5nZXQoJ2NhdGVnb3J5JykKKyAgICAgICAgaWYgY2F0ZWdvcnkgPT0gJ2hhbmRsZSc6CisgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICBzZWxmLm9iamVjdF90eXBlX2FsaWFzZXMuYXBwZW5kKChuYW1lLGFsaWFzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vYmplY3RfdHlwZXMuYXBwZW5kKG5hbWUpCisgICAgICAgIGVsaWYgKGNhdGVnb3J5ID09ICdzdHJ1Y3QnIG9yIGNhdGVnb3J5ID09ICd1bmlvbicpOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3ROYW1lcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIHNlbGYuZ2VuU3RydWN0KHR5cGVpbmZvLCBuYW1lLCBhbGlhcykKKyAgICAjCisgICAgIyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBhIHBvaW50ZXIKKyAgICBkZWYgcGFyYW1Jc1BvaW50ZXIoc2VsZiwgcGFyYW0pOgorICAgICAgICBpc3BvaW50ZXIgPSBGYWxzZQorICAgICAgICBmb3IgZWxlbSBpbiBwYXJhbToKKyAgICAgICAgICAgIGlmICgoZWxlbS50YWcgaXMgbm90ICd0eXBlJykgYW5kIChlbGVtLnRhaWwgaXMgbm90IE5vbmUpKSBhbmQgJyonIGluIGVsZW0udGFpbDoKKyAgICAgICAgICAgICAgICBpc3BvaW50ZXIgPSBUcnVlCisgICAgICAgIHJldHVybiBpc3BvaW50ZXIKKyAgICAjCisgICAgIyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBhIHN0YXRpYyBhcnJheQorICAgIGRlZiBwYXJhbUlzU3RhdGljQXJyYXkoc2VsZiwgcGFyYW0pOgorICAgICAgICBpc3N0YXRpY2FycmF5ID0gMAorICAgICAgICBwYXJhbW5hbWUgPSBwYXJhbS5maW5kKCduYW1lJykKKyAgICAgICAgaWYgKHBhcmFtbmFtZS50YWlsIGlzIG5vdCBOb25lKSBhbmQgKCdbJyBpbiBwYXJhbW5hbWUudGFpbCk6CisgICAgICAgICAgICBpc3N0YXRpY2FycmF5ID0gcGFyYW1uYW1lLnRhaWwuY291bnQoJ1snKQorICAgICAgICByZXR1cm4gaXNzdGF0aWNhcnJheQorICAgICMKKyAgICAjIFJldHJpZXZlIHRoZSB0eXBlIGFuZCBuYW1lIGZvciBhIHBhcmFtZXRlcgorICAgIGRlZiBnZXRUeXBlTmFtZVR1cGxlKHNlbGYsIHBhcmFtKToKKyAgICAgICAgdHlwZSA9ICcnCisgICAgICAgIG5hbWUgPSAnJworICAgICAgICBmb3IgZWxlbSBpbiBwYXJhbToKKyAgICAgICAgICAgIGlmIGVsZW0udGFnID09ICd0eXBlJzoKKyAgICAgICAgICAgICAgICB0eXBlID0gbm9uZVN0cihlbGVtLnRleHQpCisgICAgICAgICAgICBlbGlmIGVsZW0udGFnID09ICduYW1lJzoKKyAgICAgICAgICAgICAgICBuYW1lID0gbm9uZVN0cihlbGVtLnRleHQpCisgICAgICAgIHJldHVybiAodHlwZSwgbmFtZSkKKyAgICAjIEV4dHJhY3QgbGVuZ3RoIHZhbHVlcyBmcm9tIGxhdGV4bWF0aC4gIEN1cnJlbnRseSBhbiBpbmZsZXhpYmxlIHNvbHV0aW9uIHRoYXQgbG9va3MgZm9yIHNwZWNpZmljCisgICAgIyBwYXR0ZXJucyB0aGF0IGFyZSBmb3VuZCBpbiB2ay54bWwuICBXaWxsIG5lZWQgdG8gYmUgdXBkYXRlZCB3aGVuIG5ldyBwYXR0ZXJucyBhcmUgaW50cm9kdWNlZC4KKyAgICBkZWYgcGFyc2VMYXRlWE1hdGgoc2VsZiwgc291cmNlKToKKyAgICAgICAgbmFtZSA9ICdFUlJPUicKKyAgICAgICAgZGVjb3JhdGVkTmFtZSA9ICdFUlJPUicKKyAgICAgICAgaWYgJ21hdGhpdCcgaW4gc291cmNlOgorICAgICAgICAgICAgIyBNYXRjaGVzIGV4cHJlc3Npb25zIHNpbWlsYXIgdG8gJ2xhdGV4bWF0aDpbXGxjZWlse1xtYXRoaXR7cmFzdGVyaXphdGlvblNhbXBsZXN9IFxvdmVyIDMyfVxyY2VpbF0nCisgICAgICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHInbGF0ZXhtYXRoXHMqXDpccypcW1xzKlxcbChcdyspXHMqXHtccypcXG1hdGhpdFxzKlx7XHMqKFx3KylccypcfVxzKlxcb3ZlclxzKihcZCspXHMqXH1ccypcXHIoXHcrKVxzKlxdJywgc291cmNlKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoIG9yIG1hdGNoLmdyb3VwKDEpICE9IG1hdGNoLmdyb3VwKDQpOgorICAgICAgICAgICAgICAgIHJhaXNlICdVbnJlY29nbml6ZWQgbGF0ZXhtYXRoIGV4cHJlc3Npb24nCisgICAgICAgICAgICBuYW1lID0gbWF0Y2guZ3JvdXAoMikKKyAgICAgICAgICAgICMgTmVlZCB0byBhZGQgMSBmb3IgY2VpbGluZyBmdW5jdGlvbjsgb3RoZXJ3aXNlLCB0aGUgYWxsb2NhdGVkIHBhY2tldAorICAgICAgICAgICAgIyBzaXplIHdpbGwgYmUgbGVzcyB0aGFuIG5lZWRlZCBkdXJpbmcgY2FwdHVyZSBmb3Igc29tZSB0aXRsZSB3aGljaCB1c2UKKyAgICAgICAgICAgICMgdGhpcyBpbiBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8uIGJhc2VkIG9uIGNlaWxpbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICMgZGVmaW5pdGlvbixpdCBpcyAnezB9JXsxfT97MH0vezF9ICsgMTp7MH0vezF9Jy5mb3JtYXQoKm1hdGNoLmdyb3VwKDIsIDMpKSwKKyAgICAgICAgICAgICMgaXRzIHZhbHVlIDw9ICd7fS97fSArIDEnLgorICAgICAgICAgICAgaWYgbWF0Y2guZ3JvdXAoMSkgPT0gJ2NlaWwnOgorICAgICAgICAgICAgICAgIGRlY29yYXRlZE5hbWUgPSAne30ve30gKyAxJy5mb3JtYXQoKm1hdGNoLmdyb3VwKDIsIDMpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWNvcmF0ZWROYW1lID0gJ3t9L3t9Jy5mb3JtYXQoKm1hdGNoLmdyb3VwKDIsIDMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBNYXRjaGVzIGV4cHJlc3Npb25zIHNpbWlsYXIgdG8gJ2xhdGV4bWF0aCA6IFtkYXRhU2l6ZSBcb3ZlciA0XScKKyAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gocidsYXRleG1hdGhccypcOlxzKlxbXHMqKFxcdGV4dHJtXHspPyhcdyspXH0/XHMqXFxvdmVyXHMqKFxkKylccypcXScsIHNvdXJjZSkKKyAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgZGVjb3JhdGVkTmFtZSA9ICd7fS97fScuZm9ybWF0KCptYXRjaC5ncm91cCgyLCAzKSkKKyAgICAgICAgcmV0dXJuIG5hbWUsIGRlY29yYXRlZE5hbWUKKyAgICAjCisgICAgIyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIGxlbiB0YWcKKyAgICBkZWYgZ2V0TGVuKHNlbGYsIHBhcmFtKToKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICBsZW4gPSBwYXJhbS5hdHRyaWIuZ2V0KCdsZW4nKQorICAgICAgICBpZiBsZW4gYW5kIGxlbiAhPSAnbnVsbC10ZXJtaW5hdGVkJzoKKyAgICAgICAgICAgICMgRm9yIHN0cmluZyBhcnJheXMsICdsZW4nIGNhbiBsb29rIGxpa2UgJ2NvdW50LG51bGwtdGVybWluYXRlZCcsIGluZGljYXRpbmcgdGhhdCB3ZQorICAgICAgICAgICAgIyBoYXZlIGEgbnVsbCB0ZXJtaW5hdGVkIGFycmF5IG9mIHN0cmluZ3MuICBXZSBzdHJpcCB0aGUgbnVsbC10ZXJtaW5hdGVkIGZyb20gdGhlCisgICAgICAgICAgICAjICdsZW4nIGZpZWxkIGFuZCBvbmx5IHJldHVybiB0aGUgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIHN0cmluZyBjb3VudAorICAgICAgICAgICAgaWYgJ251bGwtdGVybWluYXRlZCcgaW4gbGVuOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxlbi5zcGxpdCgnLCcpWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxlbgorICAgICAgICAgICAgaWYgJ2xhdGV4bWF0aCcgaW4gbGVuOgorICAgICAgICAgICAgICAgIHBhcmFtX3R5cGUsIHBhcmFtX25hbWUgPSBzZWxmLmdldFR5cGVOYW1lVHVwbGUocGFyYW0pCisgICAgICAgICAgICAgICAgbGVuX25hbWUsIHJlc3VsdCA9IHNlbGYucGFyc2VMYXRlWE1hdGgobGVuKQorICAgICAgICAgICAgIyBTcGVjIGhhcyBub3cgbm90YXRpb24gZm9yIGxlbiBhdHRyaWJ1dGVzLCB1c2luZyA6OiBpbnN0ZWFkIG9mIHBsYXRmb3JtIHNwZWNpZmljIHBvaW50ZXIgc3ltYm9sCisgICAgICAgICAgICByZXN1bHQgPSBzdHIocmVzdWx0KS5yZXBsYWNlKCc6OicsICctPicpCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAjCisgICAgIyBDaGVjayBpZiBhIHN0cnVjdHVyZSBpcyBvciBjb250YWlucyBhIGRpc3BhdGNoYWJsZSAoZGlzcGF0Y2hhYmxlID0gVHJ1ZSkgb3IKKyAgICAjIG5vbi1kaXNwYXRjaGFibGUgKGRpc3BhdGNoYWJsZSA9IEZhbHNlKSBoYW5kbGUKKyAgICBkZWYgVHlwZUNvbnRhaW5zT2JqZWN0SGFuZGxlKHNlbGYsIGhhbmRsZV90eXBlLCBkaXNwYXRjaGFibGUpOgorICAgICAgICBpZiBkaXNwYXRjaGFibGU6CisgICAgICAgICAgICB0eXBlX2tleSA9ICdWS19ERUZJTkVfSEFORExFJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHlwZV9rZXkgPSAnVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFJworICAgICAgICBoYW5kbGUgPSBzZWxmLnJlZ2lzdHJ5LnRyZWUuZmluZCgidHlwZXMvdHlwZS9bbmFtZT0nIiArIGhhbmRsZV90eXBlICsgIiddW0BjYXRlZ29yeT0naGFuZGxlJ10iKQorICAgICAgICBpZiBoYW5kbGUgaXMgbm90IE5vbmUgYW5kIGhhbmRsZS5maW5kKCd0eXBlJykudGV4dCA9PSB0eXBlX2tleToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgaWYgaGFuZGxlX3R5cGUgaXMgYSBzdHJ1Y3QsIHNlYXJjaCBpdHMgbWVtYmVycworICAgICAgICBpZiBoYW5kbGVfdHlwZSBpbiBzZWxmLnN0cnVjdE5hbWVzOgorICAgICAgICAgICAgbWVtYmVyX2luZGV4ID0gbmV4dCgoaSBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoc2VsZi5zdHJ1Y3RNZW1iZXJzKSBpZiB2WzBdID09IGhhbmRsZV90eXBlKSwgTm9uZSkKKyAgICAgICAgICAgIGlmIG1lbWJlcl9pbmRleCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnN0cnVjdE1lbWJlcnNbbWVtYmVyX2luZGV4XS5tZW1iZXJzOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLnJlZ2lzdHJ5LnRyZWUuZmluZCgidHlwZXMvdHlwZS9bbmFtZT0nIiArIGl0ZW0udHlwZSArICInXVtAY2F0ZWdvcnk9J2hhbmRsZSddIikKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFuZGxlIGlzIG5vdCBOb25lIGFuZCBoYW5kbGUuZmluZCgndHlwZScpLnRleHQgPT0gdHlwZV9rZXk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAjCisgICAgIyBHZW5lcmF0ZSBsb2NhbCByZWFkeS1hY2Nlc3MgZGF0YSBkZXNjcmliaW5nIFZ1bGthbiBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgZnJvbSB0aGUgWE1MIG1ldGFkYXRhCisgICAgZGVmIGdlblN0cnVjdChzZWxmLCB0eXBlaW5mbywgdHlwZU5hbWUsIGFsaWFzKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlblN0cnVjdChzZWxmLCB0eXBlaW5mbywgdHlwZU5hbWUsIGFsaWFzKQorICAgICAgICBtZW1iZXJzID0gdHlwZWluZm8uZWxlbS5maW5kYWxsKCcuLy9tZW1iZXInKQorICAgICAgICAjIEl0ZXJhdGUgb3ZlciBtZW1iZXJzIG9uY2UgdG8gZ2V0IGxlbmd0aCBwYXJhbWV0ZXJzIGZvciBhcnJheXMKKyAgICAgICAgbGVucyA9IHNldCgpCisgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgIGxlbiA9IHNlbGYuZ2V0TGVuKG1lbWJlcikKKyAgICAgICAgICAgIGlmIGxlbjoKKyAgICAgICAgICAgICAgICBsZW5zLmFkZChsZW4pCisgICAgICAgICMgR2VuZXJhdGUgbWVtYmVyIGluZm8KKyAgICAgICAgbWVtYmVyc0luZm8gPSBbXQorICAgICAgICBmb3IgbWVtYmVyIGluIG1lbWJlcnM6CisgICAgICAgICAgICAjIEdldCB0aGUgbWVtYmVyJ3MgdHlwZSBhbmQgbmFtZQorICAgICAgICAgICAgaW5mbyA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShtZW1iZXIpCisgICAgICAgICAgICB0eXBlID0gaW5mb1swXQorICAgICAgICAgICAgbmFtZSA9IGluZm9bMV0KKyAgICAgICAgICAgIGNkZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbChtZW1iZXIsIDEpCisgICAgICAgICAgICAjIFByb2Nlc3MgVmtTdHJ1Y3R1cmVUeXBlCisgICAgICAgICAgICBpZiB0eXBlID09ICdWa1N0cnVjdHVyZVR5cGUnOgorICAgICAgICAgICAgICAgICMgRXh0cmFjdCB0aGUgcmVxdWlyZWQgc3RydWN0IHR5cGUgdmFsdWUgZnJvbSB0aGUgY29tbWVudHMKKyAgICAgICAgICAgICAgICAjIGVtYmVkZGVkIGluIHRoZSBvcmlnaW5hbCB0ZXh0IGRlZmluaW5nIHRoZSAndHlwZWluZm8nIGVsZW1lbnQKKyAgICAgICAgICAgICAgICByYXdYbWwgPSBldHJlZS50b3N0cmluZyh0eXBlaW5mby5lbGVtKS5kZWNvZGUoJ2FzY2lpJykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZS5zZWFyY2gocidWS19TVFJVQ1RVUkVfVFlQRV9cdysnLCByYXdYbWwpCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC5ncm91cCgwKQorICAgICAgICAgICAgICAgICAgICAjIFN0b3JlIHRoZSByZXF1aXJlZCB0eXBlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RydWN0VHlwZXNbdHlwZU5hbWVdID0gc2VsZi5TdHJ1Y3RUeXBlKG5hbWU9bmFtZSwgdmFsdWU9dmFsdWUpCisgICAgICAgICAgICAjIFN0b3JlIHBvaW50ZXIvYXJyYXkvc3RyaW5nIGluZm8KKyAgICAgICAgICAgIGlzc3RhdGljYXJyYXkgPSBzZWxmLnBhcmFtSXNTdGF0aWNBcnJheShtZW1iZXIpCisgICAgICAgICAgICBtZW1iZXJzSW5mby5hcHBlbmQoc2VsZi5Db21tYW5kUGFyYW0odHlwZT10eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3BvaW50ZXI9c2VsZi5wYXJhbUlzUG9pbnRlcihtZW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3RhdGljYXJyYXk9aXNzdGF0aWNhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2NvbnN0PVRydWUgaWYgJ2NvbnN0JyBpbiBjZGVjbCBlbHNlIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY291bnQ9VHJ1ZSBpZiBuYW1lIGluIGxlbnMgZWxzZSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW49c2VsZi5nZXRMZW4obWVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRzdHJ1Y3RzPXNlbGYucmVnaXN0cnkudmFsaWRleHRlbnNpb25zdHJ1Y3RzW3R5cGVOYW1lXSBpZiBuYW1lID09ICdwTmV4dCcgZWxzZSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkZWNsPWNkZWNsKSkKKyAgICAgICAgc2VsZi5zdHJ1Y3RNZW1iZXJzLmFwcGVuZChzZWxmLlN0cnVjdE1lbWJlckRhdGEobmFtZT10eXBlTmFtZSwgbWVtYmVycz1tZW1iZXJzSW5mbywgaWZkZWZfcHJvdGVjdD1zZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QpKQorICAgICMKKyAgICAjIEVudW1fc3RyaW5nX2hlYWRlcjogQ3JlYXRlIGEgcm91dGluZSB0byBjb252ZXJ0IGFuIGVudW1lcmF0ZWQgdmFsdWUgaW50byBhIHN0cmluZworICAgIGRlZiBHZW5lcmF0ZUVudW1TdHJpbmdDb252ZXJzaW9uKHNlbGYsIGdyb3VwTmFtZSwgdmFsdWVfbGlzdCk6CisgICAgICAgIG91dHN0cmluZyA9ICdcbicKKyAgICAgICAgb3V0c3RyaW5nICs9ICdzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ18lcyglcyBpbnB1dF92YWx1ZSlcbicgJSAoZ3JvdXBOYW1lLCBncm91cE5hbWUpCisgICAgICAgIG91dHN0cmluZyArPSAne1xuJworICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICBzd2l0Y2ggKCglcylpbnB1dF92YWx1ZSlcbicgJSBncm91cE5hbWUKKyAgICAgICAgb3V0c3RyaW5nICs9ICcgICAge1xuJworICAgICAgICBmb3IgaXRlbSBpbiB2YWx1ZV9saXN0OgorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgICAgIGNhc2UgJXM6XG4nICUgaXRlbQorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgICAgICAgICByZXR1cm4gIiVzIjtcbicgJSBpdGVtCisgICAgICAgIG91dHN0cmluZyArPSAnICAgICAgICBkZWZhdWx0OlxuJworICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkICVzIjtcbicgJSBncm91cE5hbWUKKyAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgfVxuJworICAgICAgICBvdXRzdHJpbmcgKz0gJ31cbicKKyAgICAgICAgcmV0dXJuIG91dHN0cmluZworICAgICMKKyAgICAjIFRhY2sgb24gYSBoZWxwZXIgd2hpY2gsIGdpdmVuIGFuIGluZGV4IGludG8gYSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgc3RydWN0dXJlLCB3aWxsIHByaW50IHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgbmFtZQorICAgIGRlZiBEZUluZGV4UGh5c0RldkZlYXR1cmVzKHNlbGYpOgorICAgICAgICBwZGV2X21lbWJlcnMgPSBOb25lCisgICAgICAgIGZvciBuYW1lLCBtZW1iZXJzLCBpZmRlZiBpbiBzZWxmLnN0cnVjdE1lbWJlcnM6CisgICAgICAgICAgICBpZiBuYW1lID09ICdWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMnOgorICAgICAgICAgICAgICAgIHBkZXZfbWVtYmVycyA9IG1lbWJlcnMKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBkZWluZGV4ID0gJ1xuJworICAgICAgICBkZWluZGV4ICs9ICdzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKiBHZXRQaHlzRGV2RmVhdHVyZVN0cmluZyh1aW50MzJfdCBpbmRleCkge1xuJworICAgICAgICBkZWluZGV4ICs9ICcgICAgY29uc3QgY2hhciAqIEluZGV4VG9QaHlzRGV2RmVhdHVyZVN0cmluZ1tdID0ge1xuJworICAgICAgICBmb3IgZmVhdHVyZSBpbiBwZGV2X21lbWJlcnM6CisgICAgICAgICAgICBkZWluZGV4ICs9ICcgICAgICAgICIlcyIsXG4nICUgZmVhdHVyZS5uYW1lCisgICAgICAgIGRlaW5kZXggKz0gJyAgICB9O1xuXG4nCisgICAgICAgIGRlaW5kZXggKz0gJyAgICByZXR1cm4gSW5kZXhUb1BoeXNEZXZGZWF0dXJlU3RyaW5nW2luZGV4XTtcbicKKyAgICAgICAgZGVpbmRleCArPSAnfVxuJworICAgICAgICByZXR1cm4gZGVpbmRleAorICAgICMKKyAgICAjIENvbWJpbmUgZW51bSBzdHJpbmcgaGVscGVyIGhlYWRlciBmaWxlIHByZWFtYmxlIHdpdGggYm9keSB0ZXh0IGFuZCByZXR1cm4KKyAgICBkZWYgR2VuZXJhdGVFbnVtU3RyaW5nSGVscGVySGVhZGVyKHNlbGYpOgorICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciA9ICdcbicKKyAgICAgICAgICAgIGVudW1fc3RyaW5nX2hlbHBlcl9oZWFkZXIgKz0gJyNwcmFnbWEgb25jZVxuJworICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciArPSAnI2lmZGVmIF9XSU4zMlxuJworICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciArPSAnI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDA2NSApXG4nCisgICAgICAgICAgICBlbnVtX3N0cmluZ19oZWxwZXJfaGVhZGVyICs9ICcjZW5kaWZcbicKKyAgICAgICAgICAgIGVudW1fc3RyaW5nX2hlbHBlcl9oZWFkZXIgKz0gJ1xuJworICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciArPSAnI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD5cbicKKyAgICAgICAgICAgIGVudW1fc3RyaW5nX2hlbHBlcl9oZWFkZXIgKz0gJ1xuJworICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciArPSBzZWxmLmVudW1fb3V0cHV0CisgICAgICAgICAgICBlbnVtX3N0cmluZ19oZWxwZXJfaGVhZGVyICs9IHNlbGYuRGVJbmRleFBoeXNEZXZGZWF0dXJlcygpCisgICAgICAgICAgICByZXR1cm4gZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlcgorICAgICMKKyAgICAjIEhlbHBlciBmdW5jdGlvbiBmb3IgZGVjbGFyaW5nIGEgY291bnRlciB2YXJpYWJsZSBvbmx5IG9uY2UKKyAgICBkZWYgRGVjbGFyZUNvdW50ZXIoc2VsZiwgc3RyaW5nX3ZhciwgZGVjbGFyZV9mbGFnKToKKyAgICAgICAgaWYgZGVjbGFyZV9mbGFnID09IEZhbHNlOgorICAgICAgICAgICAgc3RyaW5nX3ZhciArPSAnICAgICAgICB1aW50MzJfdCBpID0gMDtcbicKKyAgICAgICAgICAgIGRlY2xhcmVfZmxhZyA9IFRydWUKKyAgICAgICAgcmV0dXJuIHN0cmluZ192YXIsIGRlY2xhcmVfZmxhZworICAgICMKKyAgICAjIENvbWJpbmUgc2FmZSBzdHJ1Y3QgaGVscGVyIGhlYWRlciBmaWxlIHByZWFtYmxlIHdpdGggYm9keSB0ZXh0IGFuZCByZXR1cm4KKyAgICBkZWYgR2VuZXJhdGVTYWZlU3RydWN0SGVscGVySGVhZGVyKHNlbGYpOgorICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfaGVhZGVyID0gJ1xuJworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfaGVhZGVyICs9ICcjcHJhZ21hIG9uY2VcbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX2hlYWRlciArPSAnI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD5cbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX2hlYWRlciArPSAnXG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9oZWFkZXIgKz0gc2VsZi5HZW5lcmF0ZVNhZmVTdHJ1Y3RIZWFkZXIoKQorICAgICAgICByZXR1cm4gc2FmZV9zdHJ1Y3RfaGVscGVyX2hlYWRlcgorICAgICMKKyAgICAjIHNhZmVfc3RydWN0IGhlYWRlcjogYnVpbGQgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgaGVhZGVyIGZpbGUKKyAgICBkZWYgR2VuZXJhdGVTYWZlU3RydWN0SGVhZGVyKHNlbGYpOgorICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgPSAnJworICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnN0cnVjdE1lbWJlcnM6CisgICAgICAgICAgICBpZiBzZWxmLk5lZWRTYWZlU3RydWN0KGl0ZW0pID09IFRydWU6CisgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICdcbicKKyAgICAgICAgICAgICAgICBpZiBpdGVtLmlmZGVmX3Byb3RlY3QgIT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcjaWZkZWYgJXNcbicgJSBpdGVtLmlmZGVmX3Byb3RlY3QKKyAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJ3N0cnVjdCBzYWZlXyVzIHtcbicgJSAoaXRlbS5uYW1lKQorICAgICAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gaXRlbS5tZW1iZXJzOgorICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIudHlwZSBpbiBzZWxmLnN0cnVjdE5hbWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX2luZGV4ID0gbmV4dCgoaSBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoc2VsZi5zdHJ1Y3RNZW1iZXJzKSBpZiB2WzBdID09IG1lbWJlci50eXBlKSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlcl9pbmRleCBpcyBub3QgTm9uZSBhbmQgc2VsZi5OZWVkU2FmZVN0cnVjdChzZWxmLnN0cnVjdE1lbWJlcnNbbWVtYmVyX2luZGV4XSkgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIuaXNwb2ludGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyAgICBzYWZlXyVzKiAlcztcbicgJSAobWVtYmVyLnR5cGUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgIHNhZmVfJXMgJXM7XG4nICUgKG1lbWJlci50eXBlLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIubGVuIGlzIG5vdCBOb25lIGFuZCAoc2VsZi5UeXBlQ29udGFpbnNPYmplY3RIYW5kbGUobWVtYmVyLnR5cGUsIFRydWUpIG9yIHNlbGYuVHlwZUNvbnRhaW5zT2JqZWN0SGFuZGxlKG1lbWJlci50eXBlLCBGYWxzZSkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgICVzKiAlcztcbicgJSAobWVtYmVyLnR5cGUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICclcztcbicgJSBtZW1iZXIuY2RlY2wKKyAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyAgICBzYWZlXyVzKGNvbnN0ICVzKiBpbl9zdHJ1Y3Qlcyk7XG4nICUgKGl0ZW0ubmFtZSwgaXRlbS5uYW1lLCBzZWxmLmN1c3RvbV9jb25zdHJ1Y3RfcGFyYW1zLmdldChpdGVtLm5hbWUsICcnKSkKKyAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyAgICBzYWZlXyVzKGNvbnN0IHNhZmVfJXMmIHNyYyk7XG4nICUgKGl0ZW0ubmFtZSwgaXRlbS5uYW1lKQorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgIHNhZmVfJXMmIG9wZXJhdG9yPShjb25zdCBzYWZlXyVzJiBzcmMpO1xuJyAlIChpdGVtLm5hbWUsIGl0ZW0ubmFtZSkKKyAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyAgICBzYWZlXyVzKCk7XG4nICUgaXRlbS5uYW1lCisgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcgICAgfnNhZmVfJXMoKTtcbicgJSBpdGVtLm5hbWUKKyAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgJXMqIGluX3N0cnVjdCVzKTtcbicgJSAoaXRlbS5uYW1lLCBzZWxmLmN1c3RvbV9jb25zdHJ1Y3RfcGFyYW1zLmdldChpdGVtLm5hbWUsICcnKSkKKyAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV8lcyogc3JjKTtcbicgJSAoaXRlbS5uYW1lKQorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgICVzICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PCVzICo+KHRoaXMpOyB9XG4nICUgKGl0ZW0ubmFtZSwgaXRlbS5uYW1lKQorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgICVzIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PCVzIGNvbnN0ICo+KHRoaXMpOyB9XG4nICUgKGl0ZW0ubmFtZSwgaXRlbS5uYW1lKQorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnfTtcbicKKyAgICAgICAgICAgICAgICBpZiBpdGVtLmlmZGVmX3Byb3RlY3QgIT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcjZW5kaWYgLy8gJXNcbicgJSBpdGVtLmlmZGVmX3Byb3RlY3QKKyAgICAgICAgcmV0dXJuIHNhZmVfc3RydWN0X2hlYWRlcgorICAgICMKKyAgICAjIEdlbmVyYXRlIGV4dGVuc2lvbiBoZWxwZXIgaGVhZGVyIGZpbGUKKyAgICBkZWYgR2VuZXJhdGVFeHRlbnNpb25IZWxwZXJIZWFkZXIoc2VsZik6CisKKyAgICAgICAgVl8xXzBfaW5zdGFuY2VfZXh0ZW5zaW9uc19wcm9tb3RlZF90b19jb3JlID0gWworICAgICAgICAgICAgJ3ZrX2tocl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24nLAorICAgICAgICAgICAgJ3ZrX2tocl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMnLAorICAgICAgICAgICAgJ3ZrX2tocl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzJywKKyAgICAgICAgICAgICd2a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcycsCisgICAgICAgICAgICAndmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yJywKKyAgICAgICAgICAgIF0KKworICAgICAgICBWXzFfMF9kZXZpY2VfZXh0ZW5zaW9uc19wcm9tb3RlZF90b19jb3JlID0gWworICAgICAgICAgICAgJ3ZrX2tocl8xNmJpdF9zdG9yYWdlJywKKyAgICAgICAgICAgICd2a19raHJfYmluZF9tZW1vcnlfMicsCisgICAgICAgICAgICAndmtfa2hyX2RlZGljYXRlZF9hbGxvY2F0aW9uJywKKyAgICAgICAgICAgICd2a19raHJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUnLAorICAgICAgICAgICAgJ3ZrX2tocl9kZXZpY2VfZ3JvdXAnLAorICAgICAgICAgICAgJ3ZrX2tocl9leHRlcm5hbF9mZW5jZScsCisgICAgICAgICAgICAndmtfa2hyX2V4dGVybmFsX21lbW9yeScsCisgICAgICAgICAgICAndmtfa2hyX2V4dGVybmFsX3NlbWFwaG9yZScsCisgICAgICAgICAgICAndmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzInLAorICAgICAgICAgICAgJ3ZrX2tocl9tYWludGVuYW5jZTEnLAorICAgICAgICAgICAgJ3ZrX2tocl9tYWludGVuYW5jZTInLAorICAgICAgICAgICAgJ3ZrX2tocl9tYWludGVuYW5jZTMnLAorICAgICAgICAgICAgJ3ZrX2tocl9tdWx0aXZpZXcnLAorICAgICAgICAgICAgJ3ZrX2tocl9yZWxheGVkX2Jsb2NrX2xheW91dCcsCisgICAgICAgICAgICAndmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbicsCisgICAgICAgICAgICAndmtfa2hyX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMnLAorICAgICAgICAgICAgJ3ZrX2tocl9zdG9yYWdlX2J1ZmZlcl9zdG9yYWdlX2NsYXNzJywKKyAgICAgICAgICAgICd2a19raHJfdmFyaWFibGVfcG9pbnRlcnMnLAorICAgICAgICAgICAgXQorCisgICAgICAgIG91dHB1dCA9IFsKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJyNpZm5kZWYgVktfRVhURU5TSU9OX0hFTFBFUl9IXycsCisgICAgICAgICAgICAnI2RlZmluZSBWS19FWFRFTlNJT05fSEVMUEVSX0hfJywKKyAgICAgICAgICAgICcjaW5jbHVkZSA8c3RyaW5nPicsCisgICAgICAgICAgICAnI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+JywKKyAgICAgICAgICAgICcjaW5jbHVkZSA8dXRpbGl0eT4nLAorICAgICAgICAgICAgJycsCisgICAgICAgICAgICAnI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4nLAorICAgICAgICAgICAgJyddCisKKyAgICAgICAgZGVmIGd1YXJkZWQoaWZkZWYsIHZhbHVlKToKKyAgICAgICAgICAgIGlmIGlmZGVmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiAnXG4nLmpvaW4oWyAnI2lmZGVmICVzJyAlIGlmZGVmLCB2YWx1ZSwgJyNlbmRpZicgXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgZm9yIHR5cGUgaW4gWydJbnN0YW5jZScsICdEZXZpY2UnXToKKyAgICAgICAgICAgIHN0cnVjdF90eXBlID0gJyVzRXh0ZW5zaW9ucycgJSB0eXBlCisgICAgICAgICAgICBpZiB0eXBlID09ICdJbnN0YW5jZSc6CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2RpY3QgPSBzZWxmLmluc3RhbmNlX2V4dGVuc2lvbl9pbmZvCisgICAgICAgICAgICAgICAgcHJvbW90ZWRfZXh0X2xpc3QgPSBWXzFfMF9pbnN0YW5jZV9leHRlbnNpb25zX3Byb21vdGVkX3RvX2NvcmUKKyAgICAgICAgICAgICAgICBzdHJ1Y3RfZGVjbCA9ICdzdHJ1Y3QgJXMgeycgJSBzdHJ1Y3RfdHlwZQorICAgICAgICAgICAgICAgIGluc3RhbmNlX3N0cnVjdF90eXBlID0gc3RydWN0X3R5cGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2RpY3QgPSBzZWxmLmRldmljZV9leHRlbnNpb25faW5mbworICAgICAgICAgICAgICAgIHByb21vdGVkX2V4dF9saXN0ID0gVl8xXzBfZGV2aWNlX2V4dGVuc2lvbnNfcHJvbW90ZWRfdG9fY29yZQorICAgICAgICAgICAgICAgIHN0cnVjdF9kZWNsID0gJ3N0cnVjdCAlcyA6IHB1YmxpYyAlcyB7JyAlIChzdHJ1Y3RfdHlwZSwgaW5zdGFuY2Vfc3RydWN0X3R5cGUpCisKKyAgICAgICAgICAgIGV4dGVuc2lvbl9pdGVtcyA9IHNvcnRlZChleHRlbnNpb25fZGljdC5pdGVtcygpKQorCisgICAgICAgICAgICBmaWVsZF9uYW1lID0geyBleHRfbmFtZTogcmUuc3ViKCdfZXh0ZW5zaW9uX25hbWUnLCAnJywgaW5mb1snZGVmaW5lJ10ubG93ZXIoKSkgZm9yIGV4dF9uYW1lLCBpbmZvIGluIGV4dGVuc2lvbl9pdGVtcyB9CisgICAgICAgICAgICBpZiB0eXBlID09ICdJbnN0YW5jZSc6CisgICAgICAgICAgICAgICAgaW5zdGFuY2VfZmllbGRfbmFtZSA9IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICBpbnN0YW5jZV9leHRlbnNpb25fZGljdCA9IGV4dGVuc2lvbl9kaWN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgR2V0IGNvbXBsZXRlIGZpZWxkIG5hbWUgYW5kIGV4dGVuc2lvbiBkYXRhIGZvciBib3RoIEluc3RhbmNlIGFuZCBEZXZpY2UgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIGZpZWxkX25hbWUudXBkYXRlKGluc3RhbmNlX2ZpZWxkX25hbWUpCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2RpY3QgPSBleHRlbnNpb25fZGljdC5jb3B5KCkgICMgRG9uJ3QgbW9kaWZ5IHRoZSBzZWxmLjxkaWN0PiB3ZSdyZSBwb2ludGluZyB0bworICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9kaWN0LnVwZGF0ZShpbnN0YW5jZV9leHRlbnNpb25fZGljdCkKKworICAgICAgICAgICAgIyBPdXRwdXQgdGhlIGRhdGEgbWVtYmVyIGxpc3QKKyAgICAgICAgICAgIHN0cnVjdCAgPSBbc3RydWN0X2RlY2xdCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsgJyAgICBib29sICVze2ZhbHNlfTsnICUgZmllbGRfbmFtZVtleHRfbmFtZV0gZm9yIGV4dF9uYW1lLCBpbmZvIGluIGV4dGVuc2lvbl9pdGVtc10pCisKKyAgICAgICAgICAgICMgQ29uc3RydWN0IHRoZSBleHRlbnNpb24gaW5mb3JtYXRpb24gbWFwIC0tIG1hcHBpbmcgbmFtZSB0byBkYXRhIG1lbWJlciAoZmllbGQpLCBhbmQgcmVxdWlyZWQgZXh0ZW5zaW9ucworICAgICAgICAgICAgIyBUaGUgbWFwIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBzdGF0aWMgZnVuY3Rpb24gbWVtYmVyIGZvciBwb3J0YWJpbGl0eSByZWFzb25zLgorICAgICAgICAgICAgaW5mb190eXBlID0gJyVzSW5mbycgJSB0eXBlCisgICAgICAgICAgICBpbmZvX21hcF90eXBlID0gJyVzTWFwJyAlIGluZm9fdHlwZQorICAgICAgICAgICAgcmVxX3R5cGUgPSAnJXNSZXEnICUgdHlwZQorICAgICAgICAgICAgcmVxX3ZlY190eXBlID0gJyVzVmVjJyAlIHJlcV90eXBlCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICAgICAnICAgIHN0cnVjdCAlcyB7JyAlIHJlcV90eXBlLAorICAgICAgICAgICAgICAgICcgICAgICAgIGNvbnN0IGJvb2wgJXM6OiogZW5hYmxlZDsnICUgc3RydWN0X3R5cGUsCisgICAgICAgICAgICAgICAgJyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsnLAorICAgICAgICAgICAgICAgICcgICAgfTsnLAorICAgICAgICAgICAgICAgICcgICAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjwlcz4gJXM7JyAlIChyZXFfdHlwZSwgcmVxX3ZlY190eXBlKSwKKyAgICAgICAgICAgICAgICAnICAgIHN0cnVjdCAlcyB7JyAlIGluZm9fdHlwZSwKKyAgICAgICAgICAgICAgICAnICAgICAgICVzKGJvb2wgJXM6Oiogc3RhdGVfLCBjb25zdCAlcyByZXF1aXJlc18pOiBzdGF0ZShzdGF0ZV8pLCByZXF1aXJlcyhyZXF1aXJlc18pIHt9JyAlICggaW5mb190eXBlLCBzdHJ1Y3RfdHlwZSwgcmVxX3ZlY190eXBlKSwKKyAgICAgICAgICAgICAgICAnICAgICAgIGJvb2wgJXM6Oiogc3RhdGU7JyAlIHN0cnVjdF90eXBlLAorICAgICAgICAgICAgICAgICcgICAgICAgJXMgcmVxdWlyZXM7JyAlIHJlcV92ZWNfdHlwZSwKKyAgICAgICAgICAgICAgICAnICAgIH07JywKKyAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICAgICAnICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCVzPiAlczsnICUgKGluZm9fdHlwZSwgaW5mb19tYXBfdHlwZSksCisgICAgICAgICAgICAgICAgJyAgICBzdGF0aWMgY29uc3QgJXMgJmdldF9pbmZvKGNvbnN0IGNoYXIgKm5hbWUpIHsnICVpbmZvX3R5cGUsCisgICAgICAgICAgICAgICAgJyAgICAgICAgc3RhdGljIGNvbnN0ICVzIGluZm9fbWFwID0geycgJSBpbmZvX21hcF90eXBlIF0pCisKKyAgICAgICAgICAgIGZpZWxkX2Zvcm1hdCA9ICcmJyArIHN0cnVjdF90eXBlICsgJzo6JXMnCisgICAgICAgICAgICByZXFfZm9ybWF0ID0gJ3snICsgZmllbGRfZm9ybWF0KyAnLCAlc30nCisgICAgICAgICAgICByZXFfaW5kZW50ID0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgcmVxX2pvaW4gPSAnLCcgKyByZXFfaW5kZW50CisgICAgICAgICAgICBpbmZvX2Zvcm1hdCA9ICgnICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoJXMsICcgKyBpbmZvX3R5cGUgKyAnKCcgKyBmaWVsZF9mb3JtYXQgKyAnLCB7JXN9KSksJykKKyAgICAgICAgICAgIGRlZiBmb3JtYXRfaW5mbyhleHRfbmFtZSwgaW5mbyk6CisgICAgICAgICAgICAgICAgcmVxcyA9IHJlcV9qb2luLmpvaW4oW3JlcV9mb3JtYXQgJSAoZmllbGRfbmFtZVtyZXFdLCBleHRlbnNpb25fZGljdFtyZXFdWydkZWZpbmUnXSkgZm9yIHJlcSBpbiBpbmZvWydyZXFzJ11dKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmZvX2Zvcm1hdCAlIChpbmZvWydkZWZpbmUnXSwgZmllbGRfbmFtZVtleHRfbmFtZV0sICd7JXN9JyAlIChyZXFfaW5kZW50ICsgcmVxcykgaWYgcmVxcyBlbHNlICcnKQorCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFtndWFyZGVkKGluZm9bJ2lmZGVmJ10sIGZvcm1hdF9pbmZvKGV4dF9uYW1lLCBpbmZvKSkgZm9yIGV4dF9uYW1lLCBpbmZvIGluIGV4dGVuc2lvbl9pdGVtc10pCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAnICAgICAgICB9OycsCisgICAgICAgICAgICAgICAgJycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgc3RhdGljIGNvbnN0ICVzIGVtcHR5X2luZm8ge251bGxwdHIsICVzKCl9OycgJSAoaW5mb190eXBlLCByZXFfdmVjX3R5cGUpLAorICAgICAgICAgICAgICAgICcgICAgICAgICVzOjpjb25zdF9pdGVyYXRvciBpbmZvID0gaW5mb19tYXAuZmluZChuYW1lKTsnICUgaW5mb19tYXBfdHlwZSwKKyAgICAgICAgICAgICAgICAnICAgICAgICBpZiAoIGluZm8gIT0gaW5mb19tYXAuY2VuZCgpKSB7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgcmV0dXJuIGluZm8tPnNlY29uZDsnLAorICAgICAgICAgICAgICAgICcgICAgICAgIH0nLAorICAgICAgICAgICAgICAgICcgICAgICAgIHJldHVybiBlbXB0eV9pbmZvOycsCisgICAgICAgICAgICAgICAgJyAgICB9JywKKyAgICAgICAgICAgICAgICAnJ10pCisKKyAgICAgICAgICAgIGlmIHR5cGUgPT0gJ0luc3RhbmNlJzoKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAgICAgJyAgICB1aW50MzJfdCBOb3JtYWxpemVBcGlWZXJzaW9uKHVpbnQzMl90IHNwZWNpZmllZF92ZXJzaW9uKSB7JywKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgdWludDMyX3QgYXBpX3ZlcnNpb24gPSAoc3BlY2lmaWVkX3ZlcnNpb24gPCBWS19BUElfVkVSU0lPTl8xXzEpID8gVktfQVBJX1ZFUlNJT05fMV8wIDogVktfQVBJX1ZFUlNJT05fMV8xOycsCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHJldHVybiBhcGlfdmVyc2lvbjsnLAorICAgICAgICAgICAgICAgICAgICAnICAgIH0nLAorICAgICAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICAgICAgICAgJyAgICB1aW50MzJfdCBJbml0RnJvbUluc3RhbmNlQ3JlYXRlSW5mbyh1aW50MzJfdCByZXF1ZXN0ZWRfYXBpX3ZlcnNpb24sIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbykgeyddKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAgICAgJyAgICAlcygpID0gZGVmYXVsdDsnICUgc3RydWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICcgICAgJXMoY29uc3QgJXMmIGluc3RhbmNlX2V4dCkgOiAlcyhpbnN0YW5jZV9leHQpIHt9JyAlIChzdHJ1Y3RfdHlwZSwgaW5zdGFuY2Vfc3RydWN0X3R5cGUsIGluc3RhbmNlX3N0cnVjdF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgJycsCisgICAgICAgICAgICAgICAgICAgICcgICAgdWludDMyX3QgSW5pdEZyb21EZXZpY2VDcmVhdGVJbmZvKGNvbnN0ICVzICppbnN0YW5jZV9leHRlbnNpb25zLCB1aW50MzJfdCByZXF1ZXN0ZWRfYXBpX3ZlcnNpb24sJyAlIGluc3RhbmNlX3N0cnVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKSB7JywKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgLy8gSW5pdGlhbGl6ZTogdGhpcyB0byBkZWZhdWx0cywgIGJhc2UgY2xhc3MgZmllbGRzIHRvIGlucHV0LicsCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGFzc2VydChpbnN0YW5jZV9leHRlbnNpb25zKTsnLAorICAgICAgICAgICAgICAgICAgICAnICAgICAgICAqdGhpcyA9ICVzKCppbnN0YW5jZV9leHRlbnNpb25zKTsnICUgc3RydWN0X3R5cGVdKQorCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICAgICAnICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBWXzFfMF9wcm9tb3RlZF8lc19leHRlbnNpb25zID0geycgJSB0eXBlLmxvd2VyKCkgXSkKKyAgICAgICAgICAgIHN0cnVjdC5leHRlbmQoWycgICAgICAgICAgICAlc19FWFRFTlNJT05fTkFNRSwnICUgZXh0X25hbWUudXBwZXIoKSBmb3IgZXh0X25hbWUgaW4gcHJvbW90ZWRfZXh0X2xpc3RdKQorICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbCisgICAgICAgICAgICAgICAgJyAgICAgICAgfTsnLAorICAgICAgICAgICAgICAgICcnLAorICAgICAgICAgICAgICAgICcgICAgICAgIC8vIEluaXRpYWxpemUgc3RydWN0IGRhdGEsIHJvYnVzdCB0byBpbnZhbGlkIHBDcmVhdGVJbmZvJywKKyAgICAgICAgICAgICAgICAnICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKSB7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBpZiAoIXBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSkgY29udGludWU7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9IGdldF9pbmZvKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGlmKGluZm8uc3RhdGUpIHRoaXMtPiooaW5mby5zdGF0ZSkgPSB0cnVlOycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIH0nLAorICAgICAgICAgICAgICAgICcgICAgICAgIH0nLAorICAgICAgICAgICAgICAgICcgICAgICAgIHVpbnQzMl90IGFwaV92ZXJzaW9uID0gTm9ybWFsaXplQXBpVmVyc2lvbihyZXF1ZXN0ZWRfYXBpX3ZlcnNpb24pOycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgaWYgKGFwaV92ZXJzaW9uID49IFZLX0FQSV9WRVJTSU9OXzFfMSkgeycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGZvciAoYXV0byBwcm9tb3RlZF9leHQgOiBWXzFfMF9wcm9tb3RlZF8lc19leHRlbnNpb25zKSB7JyAlIHR5cGUubG93ZXIoKSwKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9IGdldF9pbmZvKHByb21vdGVkX2V4dCk7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGFzc2VydChpbmZvLnN0YXRlKTsnLAorICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgaWYgKGluZm8uc3RhdGUpIHRoaXMtPiooaW5mby5zdGF0ZSkgPSB0cnVlOycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIH0nLAorICAgICAgICAgICAgICAgICcgICAgICAgIH0nLAorICAgICAgICAgICAgICAgICcgICAgICAgIHJldHVybiBhcGlfdmVyc2lvbjsnLAorICAgICAgICAgICAgICAgICcgICAgfScsCisgICAgICAgICAgICAgICAgJ307J10pCisKKyAgICAgICAgICAgICMgT3V0cHV0IHJlZmVyZW5jZSBsaXN0cyBvZiBpbnN0YW5jZS9kZXZpY2UgZXh0ZW5zaW9uIG5hbWVzCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsnJywgJ3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgayVzRXh0ZW5zaW9uTmFtZXMgPSAnICUgdHlwZV0pCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFtndWFyZGVkKGluZm9bJ2lmZGVmJ10sICcgICAgJXMnICUgaW5mb1snZGVmaW5lJ10pIGZvciBleHRfbmFtZSwgaW5mbyBpbiBleHRlbnNpb25faXRlbXNdKQorICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbJzsnLCAnJ10pCisgICAgICAgICAgICBvdXRwdXQuZXh0ZW5kKHN0cnVjdCkKKworICAgICAgICBvdXRwdXQuZXh0ZW5kKFsnJywgJyNlbmRpZiAvLyBWS19FWFRFTlNJT05fSEVMUEVSX0hfJ10pCisgICAgICAgIHJldHVybiAnXG4nLmpvaW4ob3V0cHV0KQorICAgICMKKyAgICAjIENvbWJpbmUgb2JqZWN0IHR5cGVzIGhlbHBlciBoZWFkZXIgZmlsZSBwcmVhbWJsZSB3aXRoIGJvZHkgdGV4dCBhbmQgcmV0dXJuCisgICAgZGVmIEdlbmVyYXRlT2JqZWN0VHlwZXNIZWxwZXJIZWFkZXIoc2VsZik6CisgICAgICAgIG9iamVjdF90eXBlc19oZWxwZXJfaGVhZGVyID0gJ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVscGVyX2hlYWRlciArPSAnI3ByYWdtYSBvbmNlXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWxwZXJfaGVhZGVyICs9ICdcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlbHBlcl9oZWFkZXIgKz0gJyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+XG5cbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlbHBlcl9oZWFkZXIgKz0gc2VsZi5HZW5lcmF0ZU9iamVjdFR5cGVzSGVhZGVyKCkKKyAgICAgICAgcmV0dXJuIG9iamVjdF90eXBlc19oZWxwZXJfaGVhZGVyCisgICAgIworICAgICMgT2JqZWN0IHR5cGVzIGhlYWRlcjogY3JlYXRlIG9iamVjdCBlbnVtIHR5cGUgaGVhZGVyIGZpbGUKKyAgICBkZWYgR2VuZXJhdGVPYmplY3RUeXBlc0hlYWRlcihzZWxmKToKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciA9ICcnCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJy8vIE9iamVjdCBUeXBlIGVudW0gZm9yIHZhbGlkYXRpb24gbGF5ZXIgaW50ZXJuYWwgb2JqZWN0IGhhbmRsaW5nXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ3R5cGVkZWYgZW51bSBWdWxrYW5PYmplY3RUeXBlIHtcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgIGtWdWxrYW5PYmplY3RUeXBlVW5rbm93biA9IDAsXG4nCisgICAgICAgIGVudW1fbnVtID0gMQorICAgICAgICB0eXBlX2xpc3QgPSBbXTsKKyAgICAgICAgZW51bV9lbnRyeV9tYXAgPSB7fQorCisgICAgICAgICMgT3V0cHV0IGVudW0gZGVmaW5pdGlvbiBhcyBlYWNoIGhhbmRsZSBpcyBwcm9jZXNzZWQsIHNhdmluZyB0aGUgbmFtZXMgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbiByb3V0aW5lCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYub2JqZWN0X3R5cGVzOgorICAgICAgICAgICAgZml4dXBfbmFtZSA9IGl0ZW1bMjpdCisgICAgICAgICAgICBlbnVtX2VudHJ5ID0gJ2tWdWxrYW5PYmplY3RUeXBlJXMnICUgZml4dXBfbmFtZQorICAgICAgICAgICAgZW51bV9lbnRyeV9tYXBbaXRlbV0gPSBlbnVtX2VudHJ5CisgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgJyArIGVudW1fZW50cnkKKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyA9ICVkLFxuJyAlIGVudW1fbnVtCisgICAgICAgICAgICBlbnVtX251bSArPSAxCisgICAgICAgICAgICB0eXBlX2xpc3QuYXBwZW5kKGVudW1fZW50cnkpCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICBrVnVsa2FuT2JqZWN0VHlwZU1heCA9ICVkLFxuJyAlIGVudW1fbnVtCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAvLyBBbGlhc2VzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbHR5IG9mICJwcm9tb3RlZCIgdHlwZXNcbicKKyAgICAgICAgZm9yIChuYW1lLCBhbGlhcykgaW4gc2VsZi5vYmplY3RfdHlwZV9hbGlhc2VzOgorICAgICAgICAgICAgZml4dXBfbmFtZSA9IG5hbWVbMjpdCisgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAga1Z1bGthbk9iamVjdFR5cGV7fSA9IHt9LFxuJy5mb3JtYXQoZml4dXBfbmFtZSwgZW51bV9lbnRyeV9tYXBbYWxpYXNdKQorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICd9IFZ1bGthbk9iamVjdFR5cGU7XG5cbicKKworICAgICAgICAjIE91dHB1dCBuYW1lIHN0cmluZyBoZWxwZXIKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnLy8gQXJyYXkgb2Ygb2JqZWN0IG5hbWUgc3RyaW5ncyBmb3IgT0JKRUNUX1RZUEUgZW51bSBjb252ZXJzaW9uXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb2JqZWN0X3N0cmluZ1trVnVsa2FuT2JqZWN0VHlwZU1heF0gPSB7XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAiVW5rbm93biIsXG4nCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYub2JqZWN0X3R5cGVzOgorICAgICAgICAgICAgZml4dXBfbmFtZSA9IGl0ZW1bMjpdCisgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgIiVzIixcbicgJSBmaXh1cF9uYW1lCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ307XG4nCisKKyAgICAgICAgIyBLZXkgY3JlYXRpb24gaGVscGVyIGZvciBtYXAgY29tcHJlaGVuc2lvbnMgdGhhdCBjb252ZXJ0IGJldHdlZW4gazxOYW1lPiBhbmQgVks8TmFtZT4gc3ltYm9scworICAgICAgICBkZWYgdG9fa2V5KHJlZ2V4LCByYXdfa2V5KTogcmV0dXJuIHJlLnNlYXJjaChyZWdleCwgcmF3X2tleSkuZ3JvdXAoMSkubG93ZXIoKS5yZXBsYWNlKCJfIiwiIikKKworICAgICAgICAjIE91dHB1dCBhIGNvbnZlcnNpb24gcm91dGluZSBmcm9tIHRoZSBsYXllciBvYmplY3QgZGVmaW5pdGlvbnMgdG8gdGhlIGRlYnVnIHJlcG9ydCBkZWZpbml0aW9ucworICAgICAgICAjIEFzIHRoZSBWS19ERUJVR19SRVBPUlQgdHlwZXMgYXJlIG5vdCBiZWluZyB1cGRhdGVkLCBzcGVjaWZ5IFVOS05PV04gZm9yIHVubWF0Y2hlZCB0eXBlcworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICdcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnLy8gSGVscGVyIGFycmF5IHRvIGdldCBWdWxrYW4gVktfRVhUX2RlYnVnX3JlcG9ydCBvYmplY3QgdHlwZSBlbnVtIGZyb20gdGhlIGludGVybmFsIGxheWVycyB2ZXJzaW9uXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ2NvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGdldF9kZWJ1Z19yZXBvcnRfZW51bVtdID0ge1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAvLyBrVnVsa2FuT2JqZWN0VHlwZVVua25vd25cbicKKworICAgICAgICBkYmdfcmUgPSAnXlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV8oLiopX0VYVCQnCisgICAgICAgIGRiZ19tYXAgPSB7dG9fa2V5KGRiZ19yZSwgZGJnKSA6IGRiZyBmb3IgZGJnIGluIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlc30KKyAgICAgICAgZGJnX2RlZmF1bHQgPSAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUJworICAgICAgICBmb3Igb2JqZWN0X3R5cGUgaW4gdHlwZV9saXN0OgorICAgICAgICAgICAgdmtfb2JqZWN0X3R5cGUgPSBkYmdfbWFwLmdldChvYmplY3RfdHlwZS5yZXBsYWNlKCJrVnVsa2FuT2JqZWN0VHlwZSIsICIiKS5sb3dlcigpLCBkYmdfZGVmYXVsdCkKKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAlcywgICAvLyAlc1xuJyAlICh2a19vYmplY3RfdHlwZSwgb2JqZWN0X3R5cGUpCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ307XG4nCisKKyAgICAgICAgIyBPdXRwdXQgYSBjb252ZXJzaW9uIHJvdXRpbmUgZnJvbSB0aGUgbGF5ZXIgb2JqZWN0IGRlZmluaXRpb25zIHRvIHRoZSBjb3JlIG9iamVjdCB0eXBlIGRlZmluaXRpb25zCisgICAgICAgICMgVGhpcyB3aWxsIGludGVudGlvbmFsbHkgKmZhaWwqIGZvciB1bm1hdGNoZWQgdHlwZXMgYXMgdGhlIFZLX09CSkVDVF9UWVBFIGxpc3Qgc2hvdWxkIG1hdGNoIHRoZSBrVnVsa2FuT2JqZWN0VHlwZSBsaXN0CisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcvLyBIZWxwZXIgYXJyYXkgdG8gZ2V0IE9mZmljaWFsIFZ1bGthbiBWa09iamVjdFR5cGUgZW51bSBmcm9tIHRoZSBpbnRlcm5hbCBsYXllcnMgdmVyc2lvblxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICdjb25zdCBWa09iamVjdFR5cGUgZ2V0X29iamVjdF90eXBlX2VudW1bXSA9IHtcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgIFZLX09CSkVDVF9UWVBFX1VOS05PV04sIC8vIGtWdWxrYW5PYmplY3RUeXBlVW5rbm93blxuJworCisgICAgICAgIHZrb19yZSA9ICdeVktfT0JKRUNUX1RZUEVfKC4qKScKKyAgICAgICAgdmtvX21hcCA9IHt0b19rZXkodmtvX3JlLCB2a28pIDogdmtvIGZvciB2a28gaW4gc2VsZi5jb3JlX29iamVjdF90eXBlc30KKyAgICAgICAgZm9yIG9iamVjdF90eXBlIGluIHR5cGVfbGlzdDoKKyAgICAgICAgICAgIHZrX29iamVjdF90eXBlID0gdmtvX21hcFtvYmplY3RfdHlwZS5yZXBsYWNlKCJrVnVsa2FuT2JqZWN0VHlwZSIsICIiKS5sb3dlcigpXQorICAgICAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgICVzLCAgIC8vICVzXG4nICUgKHZrX29iamVjdF90eXBlLCBvYmplY3RfdHlwZSkKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnfTtcbicKKworICAgICAgICAjIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB0byBWa09iamVjdFR5cGUKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJy8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdG8gVmtPYmplY3RUeXBlXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ3N0YXRpYyBpbmxpbmUgVmtPYmplY3RUeXBlIGNvbnZlcnREZWJ1Z1JlcG9ydE9iamVjdFRvQ29yZU9iamVjdChWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBkZWJ1Z19yZXBvcnRfb2JqKXtcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCkge1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgICAgIHJldHVybiBWS19PQkpFQ1RfVFlQRV9VTktOT1dOO1xuJworICAgICAgICBmb3IgY29yZV9vYmplY3RfdHlwZSBpbiBzZWxmLmNvcmVfb2JqZWN0X3R5cGVzOgorICAgICAgICAgICAgY29yZV90YXJnZXRfdHlwZSA9IGNvcmVfb2JqZWN0X3R5cGUucmVwbGFjZSgiVktfT0JKRUNUX1RZUEVfIiwgIiIpLmxvd2VyKCkKKyAgICAgICAgICAgIGNvcmVfdGFyZ2V0X3R5cGUgPSBjb3JlX3RhcmdldF90eXBlLnJlcGxhY2UoIl8iLCAiIikKKyAgICAgICAgICAgIGZvciBkcl9vYmplY3RfdHlwZSBpbiBzZWxmLmRlYnVnX3JlcG9ydF9vYmplY3RfdHlwZXM6CisgICAgICAgICAgICAgICAgZHJfdGFyZ2V0X3R5cGUgPSBkcl9vYmplY3RfdHlwZS5yZXBsYWNlKCJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfIiwgIiIpLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBkcl90YXJnZXRfdHlwZSA9IGRyX3RhcmdldF90eXBlWzotNF0KKyAgICAgICAgICAgICAgICBkcl90YXJnZXRfdHlwZSA9IGRyX3RhcmdldF90eXBlLnJlcGxhY2UoIl8iLCAiIikKKyAgICAgICAgICAgICAgICBpZiBjb3JlX3RhcmdldF90eXBlID09IGRyX3RhcmdldF90eXBlOgorICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgfSBlbHNlIGlmIChkZWJ1Z19yZXBvcnRfb2JqID09ICVzKSB7XG4nICUgZHJfb2JqZWN0X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgICAgICByZXR1cm4gJXM7XG4nICUgY29yZV9vYmplY3RfdHlwZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgfVxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgcmV0dXJuIFZLX09CSkVDVF9UWVBFX1VOS05PV047XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ31cbicKKworICAgICAgICAjIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBWa09iamVjdFR5cGUgdG8gVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJy8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdG8gVmtPYmplY3RUeXBlXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ3N0YXRpYyBpbmxpbmUgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgY29udmVydENvcmVPYmplY3RUb0RlYnVnUmVwb3J0T2JqZWN0KFZrT2JqZWN0VHlwZSBjb3JlX3JlcG9ydF9vYmope1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgaWYgKGNvcmVfcmVwb3J0X29iaiA9PSBWS19PQkpFQ1RfVFlQRV9VTktOT1dOKSB7XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVDtcbicKKyAgICAgICAgZm9yIGNvcmVfb2JqZWN0X3R5cGUgaW4gc2VsZi5jb3JlX29iamVjdF90eXBlczoKKyAgICAgICAgICAgIGNvcmVfdGFyZ2V0X3R5cGUgPSBjb3JlX29iamVjdF90eXBlLnJlcGxhY2UoIlZLX09CSkVDVF9UWVBFXyIsICIiKS5sb3dlcigpCisgICAgICAgICAgICBjb3JlX3RhcmdldF90eXBlID0gY29yZV90YXJnZXRfdHlwZS5yZXBsYWNlKCJfIiwgIiIpCisgICAgICAgICAgICBmb3IgZHJfb2JqZWN0X3R5cGUgaW4gc2VsZi5kZWJ1Z19yZXBvcnRfb2JqZWN0X3R5cGVzOgorICAgICAgICAgICAgICAgIGRyX3RhcmdldF90eXBlID0gZHJfb2JqZWN0X3R5cGUucmVwbGFjZSgiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFXyIsICIiKS5sb3dlcigpCisgICAgICAgICAgICAgICAgZHJfdGFyZ2V0X3R5cGUgPSBkcl90YXJnZXRfdHlwZVs6LTRdCisgICAgICAgICAgICAgICAgZHJfdGFyZ2V0X3R5cGUgPSBkcl90YXJnZXRfdHlwZS5yZXBsYWNlKCJfIiwgIiIpCisgICAgICAgICAgICAgICAgaWYgY29yZV90YXJnZXRfdHlwZSA9PSBkcl90YXJnZXRfdHlwZToKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgIH0gZWxzZSBpZiAoY29yZV9yZXBvcnRfb2JqID09ICVzKSB7XG4nICUgY29yZV9vYmplY3RfdHlwZQorICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgICAgIHJldHVybiAlcztcbicgJSBkcl9vYmplY3RfdHlwZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgfVxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVDtcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnfVxuJworICAgICAgICByZXR1cm4gb2JqZWN0X3R5cGVzX2hlYWRlcgorICAgICMKKyAgICAjIERldGVybWluZSBpZiBhIHN0cnVjdHVyZSBuZWVkcyBhIHNhZmVfc3RydWN0IGhlbHBlciBmdW5jdGlvbgorICAgICMgVGhhdCBpcywgaXQgaGFzIGFuIHNUeXBlIG9yIG9uZSBvZiBpdHMgbWVtYmVycyBpcyBhIHBvaW50ZXIKKyAgICBkZWYgTmVlZFNhZmVTdHJ1Y3Qoc2VsZiwgc3RydWN0dXJlKToKKyAgICAgICAgaWYgJ3NUeXBlJyA9PSBzdHJ1Y3R1cmUubmFtZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGZvciBtZW1iZXIgaW4gc3RydWN0dXJlLm1lbWJlcnM6CisgICAgICAgICAgICBpZiBtZW1iZXIuaXNwb2ludGVyID09IFRydWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgIworICAgICMgQ29tYmluZSBzYWZlIHN0cnVjdCBoZWxwZXIgc291cmNlIGZpbGUgcHJlYW1ibGUgd2l0aCBib2R5IHRleHQgYW5kIHJldHVybgorICAgIGRlZiBHZW5lcmF0ZVNhZmVTdHJ1Y3RIZWxwZXJTb3VyY2Uoc2VsZik6CisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9zb3VyY2UgPSAnXG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9zb3VyY2UgKz0gJyNpbmNsdWRlICJ2a19zYWZlX3N0cnVjdC5oIlxuJworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfc291cmNlICs9ICcjaW5jbHVkZSA8c3RyaW5nLmg+XG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9zb3VyY2UgKz0gJyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFJcbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX3NvdXJjZSArPSAnI2lmIF9fQU5EUk9JRF9BUElfXyA8IF9fQU5EUk9JRF9BUElfT19fXG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9zb3VyY2UgKz0gJ3N0cnVjdCBBSGFyZHdhcmVCdWZmZXIge307XG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9zb3VyY2UgKz0gJyNlbmRpZlxuJworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfc291cmNlICs9ICcjZW5kaWZcbicKKworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfc291cmNlICs9ICdcbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX3NvdXJjZSArPSBzZWxmLkdlbmVyYXRlU2FmZVN0cnVjdFNvdXJjZSgpCisgICAgICAgIHJldHVybiBzYWZlX3N0cnVjdF9oZWxwZXJfc291cmNlCisgICAgIworICAgICMgc2FmZV9zdHJ1Y3Qgc291cmNlIC0tIGNyZWF0ZSBib2RpZXMgb2Ygc2FmZSBzdHJ1Y3QgaGVscGVyIGZ1bmN0aW9ucworICAgIGRlZiBHZW5lcmF0ZVNhZmVTdHJ1Y3RTb3VyY2Uoc2VsZik6CisgICAgICAgIHNhZmVfc3RydWN0X2JvZHkgPSBbXQorICAgICAgICB3c2lfc3RydWN0cyA9IFsnVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFInLAorICAgICAgICAgICAgICAgICAgICAgICAnVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICdWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICdWa01pclN1cmZhY2VDcmVhdGVJbmZvS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ1ZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ1ZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUicKKyAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnN0cnVjdE1lbWJlcnM6CisgICAgICAgICAgICBpZiBzZWxmLk5lZWRTYWZlU3RydWN0KGl0ZW0pID09IEZhbHNlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpdGVtLm5hbWUgaW4gd3NpX3N0cnVjdHM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGl0ZW0uaWZkZWZfcHJvdGVjdCAhPSBOb25lOgorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCIjaWZkZWYgJXNcbiIgJSBpdGVtLmlmZGVmX3Byb3RlY3QpCisgICAgICAgICAgICBzc19uYW1lID0gInNhZmVfJXMiICUgaXRlbS5uYW1lCisgICAgICAgICAgICBpbml0X2xpc3QgPSAnJyAgICAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBpbiBzdHJ1Y3QgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIKKyAgICAgICAgICAgIGRlZmF1bHRfaW5pdF9saXN0ID0gJycgICMgRGVmYXVsdCBjb25zdHJ1Y3RvciBqdXN0IGluaXRzIHB0cnMgdG8gbnVsbHB0ciBpbiBpbml0aWFsaXplcgorICAgICAgICAgICAgaW5pdF9mdW5jX3R4dCA9ICcnICAgICAgIyBUeHQgZm9yIGluaXRpYWxpemUoKSBmdW5jdGlvbiB0aGF0IHRha2VzIHN0cnVjdCBwdHIgYW5kIGluaXRzIG1lbWJlcnMKKyAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgPSAnJyAgICAgICMgQm9keSBvZiBjb25zdHVjdG9yIGFzIHdlbGwgYXMgYm9keSBvZiBpbml0aWFsaXplKCkgZnVuYyBmb2xsb3dpbmcgaW5pdF9mdW5jX3R4dAorICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ID0gJycKKworICAgICAgICAgICAgY3VzdG9tX2NvbnN0cnVjdF90eHQgPSB7CisgICAgICAgICAgICAgICAgIyBWa1dyaXRlRGVzY3JpcHRvclNldCBpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSBwb2ludGVycyBtYXkgYmUgbm9uLW51bGwgYnV0IGlnbm9yZWQKKyAgICAgICAgICAgICAgICAnVmtXcml0ZURlc2NyaXB0b3JTZXQnIDoKKyAgICAgICAgICAgICAgICAgICAgJyAgICBzd2l0Y2ggKGRlc2NyaXB0b3JUeXBlKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0U6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgaW5fc3RydWN0LT5wSW1hZ2VJbmZvKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBwSW1hZ2VJbmZvID0gbmV3IFZrRGVzY3JpcHRvckltYWdlSW5mb1tkZXNjcmlwdG9yQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8ZGVzY3JpcHRvckNvdW50OyArK2kpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBwSW1hZ2VJbmZvW2ldID0gaW5fc3RydWN0LT5wSW1hZ2VJbmZvW2ldO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJyZWFrO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjpcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgaW5fc3RydWN0LT5wQnVmZmVySW5mbykge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgcEJ1ZmZlckluZm8gPSBuZXcgVmtEZXNjcmlwdG9yQnVmZmVySW5mb1tkZXNjcmlwdG9yQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8ZGVzY3JpcHRvckNvdW50OyArK2kpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBwQnVmZmVySW5mb1tpXSA9IGluX3N0cnVjdC0+cEJ1ZmZlckluZm9baV07XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgYnJlYWs7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOlxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjpcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBpbl9zdHJ1Y3QtPnBUZXhlbEJ1ZmZlclZpZXcpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHBUZXhlbEJ1ZmZlclZpZXcgPSBuZXcgVmtCdWZmZXJWaWV3W2Rlc2NyaXB0b3JDb3VudF07XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGk9MDsgaTxkZXNjcmlwdG9yQ291bnQ7ICsraSkge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIHBUZXhlbEJ1ZmZlclZpZXdbaV0gPSBpbl9zdHJ1Y3QtPnBUZXhlbEJ1ZmZlclZpZXdbaV07XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgYnJlYWs7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGRlZmF1bHQ6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJyZWFrO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicsCisgICAgICAgICAgICAgICAgJ1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbycgOgorICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBDb2RlKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBDb2RlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCAqPihuZXcgdWludDhfdFtjb2RlU2l6ZV0pO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ29kZSwgKHZvaWQgKilpbl9zdHJ1Y3QtPnBDb2RlLCBjb2RlU2l6ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJywKKyAgICAgICAgICAgICAgICAjIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UgaXRzIHBvaW50ZXJzIG1heSBiZSBub24tbnVsbCBidXQgaWdub3JlZAorICAgICAgICAgICAgICAgICdWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvJyA6CisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHN0YWdlQ291bnQgJiYgaW5fc3RydWN0LT5wU3RhZ2VzKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBTdGFnZXMgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvW3N0YWdlQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBmb3IgKHVpbnQzMl90IGk9MDsgaTxzdGFnZUNvdW50OyArK2kpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHBTdGFnZXNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wU3RhZ2VzW2ldKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wVmVydGV4SW5wdXRTdGF0ZSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFZlcnRleElucHV0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wVmVydGV4SW5wdXRTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IE5VTEw7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKGluX3N0cnVjdC0+cElucHV0QXNzZW1ibHlTdGF0ZSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcElucHV0QXNzZW1ibHlTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cElucHV0QXNzZW1ibHlTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwSW5wdXRBc3NlbWJseVN0YXRlID0gTlVMTDtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBib29sIGhhc190ZXNzZWxsYXRpb25fc3RhZ2UgPSBmYWxzZTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3RhZ2VDb3VudCAmJiBwU3RhZ2VzKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBmb3IgKHVpbnQzMl90IGk9MDsgaTxzdGFnZUNvdW50ICYmICFoYXNfdGVzc2VsbGF0aW9uX3N0YWdlOyArK2kpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBpZiAocFN0YWdlc1tpXS5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUIHx8IHBTdGFnZXNbaV0uc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVClcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlID0gdHJ1ZTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wVGVzc2VsbGF0aW9uU3RhdGUgJiYgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFRlc3NlbGxhdGlvblN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBUZXNzZWxsYXRpb25TdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwVGVzc2VsbGF0aW9uU3RhdGUgcG9pbnRlciBpZ25vcmVkXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgYm9vbCBoYXNfcmFzdGVyaXphdGlvbiA9IGluX3N0cnVjdC0+cFJhc3Rlcml6YXRpb25TdGF0ZSA/ICFpbl9zdHJ1Y3QtPnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlIDogZmFsc2U7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKGluX3N0cnVjdC0+cFZpZXdwb3J0U3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgYm9vbCBpc19keW5hbWljX3ZpZXdwb3J0cyA9IGZhbHNlO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBib29sIGlzX2R5bmFtaWNfc2Npc3NvcnMgPSBmYWxzZTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgaWYgKGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZSAmJiBpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlLT5keW5hbWljU3RhdGVDb3VudCAmJiAhaXNfZHluYW1pY192aWV3cG9ydHM7ICsraSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBpZiAoaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlLT5wRHluYW1pY1N0YXRlc1tpXSA9PSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICBpc19keW5hbWljX3ZpZXdwb3J0cyA9IHRydWU7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlLT5keW5hbWljU3RhdGVDb3VudCAmJiAhaXNfZHluYW1pY19zY2lzc29yczsgKytpKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGlmIChpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzW2ldID09IFZLX0RZTkFNSUNfU1RBVEVfU0NJU1NPUilcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgaXNfZHluYW1pY19zY2lzc29ycyA9IHRydWU7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFZpZXdwb3J0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wVmlld3BvcnRTdGF0ZSwgaXNfZHluYW1pY192aWV3cG9ydHMsIGlzX2R5bmFtaWNfc2Npc3NvcnMpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIH0gZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVmlld3BvcnRTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBWaWV3cG9ydFN0YXRlIHBvaW50ZXIgaWdub3JlZFxuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBSYXN0ZXJpemF0aW9uU3RhdGUpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBSYXN0ZXJpemF0aW9uU3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFJhc3Rlcml6YXRpb25TdGF0ZSA9IE5VTEw7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKGluX3N0cnVjdC0+cE11bHRpc2FtcGxlU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBNdWx0aXNhbXBsZVN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cE11bHRpc2FtcGxlU3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcE11bHRpc2FtcGxlU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwTXVsdGlzYW1wbGVTdGF0ZSBwb2ludGVyIGlnbm9yZWRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAvLyBuZWVkcyBhIHRyYWNrZWQgc3VicGFzcyBzdGF0ZSB1c2VzX2RlcHRoc3RlbmNpbF9hdHRhY2htZW50XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKGluX3N0cnVjdC0+cERlcHRoU3RlbmNpbFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uICYmIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBEZXB0aFN0ZW5jaWxTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wRGVwdGhTdGVuY2lsU3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcERlcHRoU3RlbmNpbFN0YXRlIHBvaW50ZXIgaWdub3JlZFxuJworICAgICAgICAgICAgICAgICAgICAnICAgIC8vIG5lZWRzIGEgdHJhY2tlZCBzdWJwYXNzIHN0YXRlIHVzZXNDb2xvckF0dGFjaG1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wQ29sb3JCbGVuZFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uICYmIHVzZXNfY29sb3JfYXR0YWNobWVudClcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcENvbG9yQmxlbmRTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cENvbG9yQmxlbmRTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwQ29sb3JCbGVuZFN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcENvbG9yQmxlbmRTdGF0ZSBwb2ludGVyIGlnbm9yZWRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwRHluYW1pY1N0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBEeW5hbWljU3RhdGUgPSBOVUxMO1xuJywKKyAgICAgICAgICAgICAgICAgIyBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UgaXRzIHBvaW50ZXJzIG1heSBiZSBub24tbnVsbCBidXQgaWdub3JlZAorICAgICAgICAgICAgICAgICdWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wVmlld3BvcnRzICYmICFpc19keW5hbWljX3ZpZXdwb3J0cykge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVmlld3BvcnRzID0gbmV3IFZrVmlld3BvcnRbaW5fc3RydWN0LT52aWV3cG9ydENvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3cG9ydHMsICh2b2lkICopaW5fc3RydWN0LT5wVmlld3BvcnRzLCBzaXplb2YoVmtWaWV3cG9ydCkqaW5fc3RydWN0LT52aWV3cG9ydENvdW50KTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVmlld3BvcnRzID0gTlVMTDtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wU2Npc3NvcnMgJiYgIWlzX2R5bmFtaWNfc2Npc3NvcnMpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFNjaXNzb3JzID0gbmV3IFZrUmVjdDJEW2luX3N0cnVjdC0+c2Npc3NvckNvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTY2lzc29ycywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBTY2lzc29ycywgc2l6ZW9mKFZrUmVjdDJEKSppbl9zdHJ1Y3QtPnNjaXNzb3JDb3VudCk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFNjaXNzb3JzID0gTlVMTDtcbicsCisgICAgICAgICAgICAgICAgIyBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlIGl0cyBwSW1tdXRhYmxlU2FtcGxlcnMgcG9pbnRlciBtYXkgYmUgbm9uLW51bGwgYnV0IGlnbm9yZWQKKyAgICAgICAgICAgICAgICAnVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZycgOgorICAgICAgICAgICAgICAgICAgICAnICAgIGNvbnN0IGJvb2wgc2FtcGxlcl90eXBlID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiB8fCBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgaW5fc3RydWN0LT5wSW1tdXRhYmxlU2FtcGxlcnMgJiYgc2FtcGxlcl90eXBlKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBJbW11dGFibGVTYW1wbGVycyA9IG5ldyBWa1NhbXBsZXJbZGVzY3JpcHRvckNvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8ZGVzY3JpcHRvckNvdW50OyArK2kpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHBJbW11dGFibGVTYW1wbGVyc1tpXSA9IGluX3N0cnVjdC0+cEltbXV0YWJsZVNhbXBsZXJzW2ldO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJywKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VzdG9tX2NvcHlfdHh0ID0geworICAgICAgICAgICAgICAgICMgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSBpdCBoYXMgY3VzdG9tIGNvbnN0cnVjdCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgJ1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3RhZ2VDb3VudCAmJiBzcmMucFN0YWdlcykge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwU3RhZ2VzID0gbmV3IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1tzdGFnZUNvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8c3RhZ2VDb3VudDsgKytpKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBwU3RhZ2VzW2ldLmluaXRpYWxpemUoJnNyYy5wU3RhZ2VzW2ldKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3JjLnBWZXJ0ZXhJbnB1dFN0YXRlKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbygqc3JjLnBWZXJ0ZXhJbnB1dFN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBWZXJ0ZXhJbnB1dFN0YXRlID0gTlVMTDtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3JjLnBJbnB1dEFzc2VtYmx5U3RhdGUpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbygqc3JjLnBJbnB1dEFzc2VtYmx5U3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcElucHV0QXNzZW1ibHlTdGF0ZSA9IE5VTEw7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgYm9vbCBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlID0gZmFsc2U7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHN0YWdlQ291bnQgJiYgcFN0YWdlcylcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8c3RhZ2VDb3VudCAmJiAhaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZTsgKytpKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgaWYgKHBTdGFnZXNbaV0uc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCB8fCBwU3RhZ2VzW2ldLnN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSA9IHRydWU7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wVGVzc2VsbGF0aW9uU3RhdGUgJiYgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFRlc3NlbGxhdGlvblN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbygqc3JjLnBUZXNzZWxsYXRpb25TdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwVGVzc2VsbGF0aW9uU3RhdGUgcG9pbnRlciBpZ25vcmVkXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgYm9vbCBoYXNfcmFzdGVyaXphdGlvbiA9IHNyYy5wUmFzdGVyaXphdGlvblN0YXRlID8gIXNyYy5wUmFzdGVyaXphdGlvblN0YXRlLT5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA6IGZhbHNlO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChzcmMucFZpZXdwb3J0U3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFZpZXdwb3J0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wVmlld3BvcnRTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfSBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBWaWV3cG9ydFN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcFZpZXdwb3J0U3RhdGUgcG9pbnRlciBpZ25vcmVkXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wUmFzdGVyaXphdGlvblN0YXRlKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwUmFzdGVyaXphdGlvblN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8oKnNyYy5wUmFzdGVyaXphdGlvblN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBOVUxMO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChzcmMucE11bHRpc2FtcGxlU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBNdWx0aXNhbXBsZVN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKCpzcmMucE11bHRpc2FtcGxlU3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcE11bHRpc2FtcGxlU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwTXVsdGlzYW1wbGVTdGF0ZSBwb2ludGVyIGlnbm9yZWRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3JjLnBEZXB0aFN0ZW5jaWxTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbilcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbygqc3JjLnBEZXB0aFN0ZW5jaWxTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwRGVwdGhTdGVuY2lsU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwRGVwdGhTdGVuY2lsU3RhdGUgcG9pbnRlciBpZ25vcmVkXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wQ29sb3JCbGVuZFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwQ29sb3JCbGVuZFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wQ29sb3JCbGVuZFN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwQ29sb3JCbGVuZFN0YXRlIHBvaW50ZXIgaWdub3JlZFxuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChzcmMucER5bmFtaWNTdGF0ZSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcER5bmFtaWNTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKCpzcmMucER5bmFtaWNTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwRHluYW1pY1N0YXRlID0gTlVMTDtcbicsCisgICAgICAgICAgICAgICAgICMgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlIGl0IGhhcyBjdXN0b20gY29uc3RydWN0IHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAnVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvJyA6CisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wVmlld3BvcnRzKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBWaWV3cG9ydHMgPSBuZXcgVmtWaWV3cG9ydFtzcmMudmlld3BvcnRDb3VudF07XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRzLCAodm9pZCAqKXNyYy5wVmlld3BvcnRzLCBzaXplb2YoVmtWaWV3cG9ydCkqc3JjLnZpZXdwb3J0Q291bnQpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBWaWV3cG9ydHMgPSBOVUxMO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChzcmMucFNjaXNzb3JzKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBTY2lzc29ycyA9IG5ldyBWa1JlY3QyRFtzcmMuc2Npc3NvckNvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTY2lzc29ycywgKHZvaWQgKilzcmMucFNjaXNzb3JzLCBzaXplb2YoVmtSZWN0MkQpKnNyYy5zY2lzc29yQ291bnQpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBTY2lzc29ycyA9IE5VTEw7XG4nLAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXN0b21fZGVzdHJ1Y3RfdHh0ID0geydWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAocENvZGUpXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGRlbGV0ZVtdIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwQ29kZSk7XG4nIH0KKworICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBpdGVtLm1lbWJlcnM6CisgICAgICAgICAgICAgICAgbV90eXBlID0gbWVtYmVyLnR5cGUKKyAgICAgICAgICAgICAgICBpZiBtZW1iZXIudHlwZSBpbiBzZWxmLnN0cnVjdE5hbWVzOgorICAgICAgICAgICAgICAgICAgICBtZW1iZXJfaW5kZXggPSBuZXh0KChpIGZvciBpLCB2IGluIGVudW1lcmF0ZShzZWxmLnN0cnVjdE1lbWJlcnMpIGlmIHZbMF0gPT0gbWVtYmVyLnR5cGUpLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXJfaW5kZXggaXMgbm90IE5vbmUgYW5kIHNlbGYuTmVlZFNhZmVTdHJ1Y3Qoc2VsZi5zdHJ1Y3RNZW1iZXJzW21lbWJlcl9pbmRleF0pID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICBtX3R5cGUgPSAnc2FmZV8lcycgJSBtZW1iZXIudHlwZQorICAgICAgICAgICAgICAgIGlmIG1lbWJlci5pc3BvaW50ZXIgYW5kICdzYWZlXycgbm90IGluIG1fdHlwZSBhbmQgc2VsZi5UeXBlQ29udGFpbnNPYmplY3RIYW5kbGUobWVtYmVyLnR5cGUsIEZhbHNlKSA9PSBGYWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBQdHIgdHlwZXMgdy9vIGEgc2FmZV9zdHJ1Y3QsIGZvciBub24tbnVsbCBjYXNlIG5lZWQgdG8gYWxsb2NhdGUgbmV3IHB0ciBhbmQgY29weSBkYXRhIGluCisgICAgICAgICAgICAgICAgICAgIGlmIG1fdHlwZSBpbiBbJ3ZvaWQnLCAnY2hhciddOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3IgdGhlc2UgZXhjZXB0aW9ucyBqdXN0IGNvcHkgaW5pdGlhbCB2YWx1ZSBvdmVyIGZvciBub3cKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG4gICAgJXMoaW5fc3RydWN0LT4lcyksJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2Z1bmNfdHh0ICs9ICcgICAgJXMgPSBpbl9zdHJ1Y3QtPiVzO1xuJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2luaXRfbGlzdCArPSAnXG4gICAgJXMobnVsbHB0ciksJyAlIChtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG4gICAgJXMobnVsbHB0ciksJyAlIChtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZnVuY190eHQgKz0gJyAgICAlcyA9IG51bGxwdHI7XG4nICUgKG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3BOZXh0JyAhPSBtZW1iZXIubmFtZSBhbmQgJ3ZvaWQnIG5vdCBpbiBtX3R5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1lbWJlci5pc3N0YXRpY2FycmF5IGFuZCAobWVtYmVyLmxlbiBpcyBOb25lIG9yICcvJyBpbiBtZW1iZXIubGVuKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIGlmIChpbl9zdHJ1Y3QtPiVzKSB7XG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgICAgICAlcyA9IG5ldyAlcygqaW5fc3RydWN0LT4lcyk7XG4nICUgKG1lbWJlci5uYW1lLCBtX3R5cGUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdF90eHQgKz0gJyAgICBpZiAoJXMpXG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgICAgIGRlbGV0ZSAlcztcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICBpZiAoaW5fc3RydWN0LT4lcykge1xuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgJXMgPSBuZXcgJXNbaW5fc3RydWN0LT4lc107XG4nICUgKG1lbWJlci5uYW1lLCBtX3R5cGUsIG1lbWJlci5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgbWVtY3B5ICgodm9pZCAqKSVzLCAodm9pZCAqKWluX3N0cnVjdC0+JXMsIHNpemVvZiglcykqaW5fc3RydWN0LT4lcyk7XG4nICUgKG1lbWJlci5uYW1lLCBtZW1iZXIubmFtZSwgbV90eXBlLCBtZW1iZXIubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdF90eHQgKz0gJyAgICBpZiAoJXMpXG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgICAgIGRlbGV0ZVtdICVzO1xuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgZWxpZiBtZW1iZXIuaXNzdGF0aWNhcnJheSBvciBtZW1iZXIubGVuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIubGVuIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEV4dHJhY3QgbGVuZ3RoIG9mIHN0YXRpYyBhcnJheSBieSBncmFiYmluZyB2YWwgYmV0d2VlbiBbXQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2FycmF5X3NpemUgPSByZS5tYXRjaChyIlteW10qXFsoW15dXSopXF0iLCBtZW1iZXIuY2RlY2wpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8JXM7ICsraSkge1xuJyAlIHN0YXRpY19hcnJheV9zaXplLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICVzW2ldID0gaW5fc3RydWN0LT4lc1tpXTtcbicgJSAobWVtYmVyLm5hbWUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSW5pdCBhcnJheSBwdHIgdG8gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9pbml0X2xpc3QgKz0gJ1xuICAgICVzKG51bGxwdHIpLCcgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9saXN0ICs9ICdcbiAgICAlcyhudWxscHRyKSwnICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZnVuY190eHQgKz0gJyAgICAlcyA9IG51bGxwdHI7XG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2VsZW1lbnQgPSAnaW5fc3RydWN0LT4lc1tpXScgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyLnR5cGUgaW4gc2VsZi5zdHJ1Y3ROYW1lczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfaW5kZXggPSBuZXh0KChpIGZvciBpLCB2IGluIGVudW1lcmF0ZShzZWxmLnN0cnVjdE1lbWJlcnMpIGlmIHZbMF0gPT0gbWVtYmVyLnR5cGUpLCBOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlcl9pbmRleCBpcyBub3QgTm9uZSBhbmQgc2VsZi5OZWVkU2FmZVN0cnVjdChzZWxmLnN0cnVjdE1lbWJlcnNbbWVtYmVyX2luZGV4XSkgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfZWxlbWVudCA9ICclcygmaW5fc3RydWN0LT5zYWZlXyVzW2ldKScgJSAobWVtYmVyLnR5cGUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIGlmICglcyAmJiBpbl9zdHJ1Y3QtPiVzKSB7XG4nICUgKG1lbWJlci5sZW4sIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgICAgICAlcyA9IG5ldyAlc1slc107XG4nICUgKG1lbWJlci5uYW1lLCBtX3R5cGUsIG1lbWJlci5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdF90eHQgKz0gJyAgICBpZiAoJXMpXG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgICAgICBkZWxldGVbXSAlcztcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgICAgICBmb3IgKHVpbnQzMl90IGk9MDsgaTwlczsgKytpKSB7XG4nICUgKG1lbWJlci5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAnc2FmZV8nIGluIG1fdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICAgICAlc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPiVzW2ldKTtcbicgJSAobWVtYmVyLm5hbWUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICAgICAlc1tpXSA9ICVzO1xuJyAlIChtZW1iZXIubmFtZSwgYXJyYXlfZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICBlbGlmIG1lbWJlci5pc3BvaW50ZXIgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIGlmIChpbl9zdHJ1Y3QtPiVzKVxuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgJXMgPSBuZXcgJXMoaW5fc3RydWN0LT4lcyk7XG4nICUgKG1lbWJlci5uYW1lLCBtX3R5cGUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICVzID0gTlVMTDtcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdF90eHQgKz0gJyAgICBpZiAoJXMpXG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgICAgIGRlbGV0ZSAlcztcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgIGVsaWYgJ3NhZmVfJyBpbiBtX3R5cGU6CisgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG4gICAgJXMoJmluX3N0cnVjdC0+JXMpLCcgJSAobWVtYmVyLm5hbWUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICBpbml0X2Z1bmNfdHh0ICs9ICcgICAgJXMuaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT4lcyk7XG4nICUgKG1lbWJlci5uYW1lLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpbml0X2xpc3QgKz0gJ1xuICAgICVzKGluX3N0cnVjdC0+JXMpLCcgJSAobWVtYmVyLm5hbWUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICBpbml0X2Z1bmNfdHh0ICs9ICcgICAgJXMgPSBpbl9zdHJ1Y3QtPiVzO1xuJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICBpZiAnJyAhPSBpbml0X2xpc3Q6CisgICAgICAgICAgICAgICAgaW5pdF9saXN0ID0gaW5pdF9saXN0WzotMV0gIyBoYWNrIG9mZiBmaW5hbCBjb21tYQorICAgICAgICAgICAgaWYgaXRlbS5uYW1lIGluIGN1c3RvbV9jb25zdHJ1Y3RfdHh0OgorICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgPSBjdXN0b21fY29uc3RydWN0X3R4dFtpdGVtLm5hbWVdCisgICAgICAgICAgICBpZiBpdGVtLm5hbWUgaW4gY3VzdG9tX2Rlc3RydWN0X3R4dDoKKyAgICAgICAgICAgICAgICBkZXN0cnVjdF90eHQgPSBjdXN0b21fZGVzdHJ1Y3RfdHh0W2l0ZW0ubmFtZV0KKyAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCJcbiVzOjolcyhjb25zdCAlcyogaW5fc3RydWN0JXMpIDolc1xue1xuJXN9IiAlIChzc19uYW1lLCBzc19uYW1lLCBpdGVtLm5hbWUsIHNlbGYuY3VzdG9tX2NvbnN0cnVjdF9wYXJhbXMuZ2V0KGl0ZW0ubmFtZSwgJycpLCBpbml0X2xpc3QsIGNvbnN0cnVjdF90eHQpKQorICAgICAgICAgICAgaWYgJycgIT0gZGVmYXVsdF9pbml0X2xpc3Q6CisgICAgICAgICAgICAgICAgZGVmYXVsdF9pbml0X2xpc3QgPSAiIDolcyIgJSAoZGVmYXVsdF9pbml0X2xpc3RbOi0xXSkKKyAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCJcbiVzOjolcygpJXNcbnt9IiAlIChzc19uYW1lLCBzc19uYW1lLCBkZWZhdWx0X2luaXRfbGlzdCkpCisgICAgICAgICAgICAjIENyZWF0ZSBzbGlnaHQgdmFyaWF0aW9uIG9mIGluaXQgYW5kIGNvbnN0cnVjdCB0eHQgZm9yIGNvcHkgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNyYyBvYmplY3QgcmVmZXJlbmNlIHZzLiBzdHJ1Y3QgcHRyCisgICAgICAgICAgICBjb3B5X2NvbnN0cnVjdF9pbml0ID0gaW5pdF9mdW5jX3R4dC5yZXBsYWNlKCdpbl9zdHJ1Y3QtPicsICdzcmMuJykKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0X3R4dCA9IGNvbnN0cnVjdF90eHQucmVwbGFjZSgnIChpbl9zdHJ1Y3QtPicsICcgKHNyYy4nKSAgICAgIyBFeGNsdWRlICdpZicgYmxvY2tzIGZyb20gbmV4dCBsaW5lCisgICAgICAgICAgICBjb3B5X2NvbnN0cnVjdF90eHQgPSBjb3B5X2NvbnN0cnVjdF90eHQucmVwbGFjZSgnKGluX3N0cnVjdC0+JywgJygqc3JjLicpICMgUGFzcyBvYmplY3QgdG8gY29weSBjb25zdHJ1Y3RvcnMKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0X3R4dCA9IGNvcHlfY29uc3RydWN0X3R4dC5yZXBsYWNlKCdpbl9zdHJ1Y3QtPicsICdzcmMuJykgICAgIyBNb2RpZnkgcmVtYWluaW5nIHN0cnVjdCByZWZzIGZvciBzcmMgb2JqZWN0CisgICAgICAgICAgICBpZiBpdGVtLm5hbWUgaW4gY3VzdG9tX2NvcHlfdHh0OgorICAgICAgICAgICAgICAgIGNvcHlfY29uc3RydWN0X3R4dCA9IGN1c3RvbV9jb3B5X3R4dFtpdGVtLm5hbWVdCisgICAgICAgICAgICBjb3B5X2Fzc2lnbl90eHQgPSAnICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpcztcblxuJyArIGRlc3RydWN0X3R4dCArICdcbicgKyBjb3B5X2NvbnN0cnVjdF9pbml0ICsgY29weV9jb25zdHJ1Y3RfdHh0ICsgJ1xuICAgIHJldHVybiAqdGhpczsnCisgICAgICAgICAgICBzYWZlX3N0cnVjdF9ib2R5LmFwcGVuZCgiXG4lczo6JXMoY29uc3QgJXMmIHNyYylcbntcbiVzJXN9IiAlIChzc19uYW1lLCBzc19uYW1lLCBzc19uYW1lLCBjb3B5X2NvbnN0cnVjdF9pbml0LCBjb3B5X2NvbnN0cnVjdF90eHQpKSAjIENvcHkgY29uc3RydWN0b3IKKyAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCJcbiVzJiAlczo6b3BlcmF0b3I9KGNvbnN0ICVzJiBzcmMpXG57XG4lc1xufSIgJSAoc3NfbmFtZSwgc3NfbmFtZSwgc3NfbmFtZSwgY29weV9hc3NpZ25fdHh0KSkgIyBDb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCJcbiVzOjp+JXMoKVxue1xuJXN9IiAlIChzc19uYW1lLCBzc19uYW1lLCBkZXN0cnVjdF90eHQpKQorICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfYm9keS5hcHBlbmQoIlxudm9pZCAlczo6aW5pdGlhbGl6ZShjb25zdCAlcyogaW5fc3RydWN0JXMpXG57XG4lcyVzfSIgJSAoc3NfbmFtZSwgaXRlbS5uYW1lLCBzZWxmLmN1c3RvbV9jb25zdHJ1Y3RfcGFyYW1zLmdldChpdGVtLm5hbWUsICcnKSwgaW5pdF9mdW5jX3R4dCwgY29uc3RydWN0X3R4dCkpCisgICAgICAgICAgICAjIENvcHkgaW5pdGlhbGl6ZXIgdXNlcyBzYW1lIHR4dCBhcyBjb3B5IGNvbnN0cnVjdG9yIGJ1dCBoYXMgYSBwdHIgYW5kIG5vdCBhIHJlZmVyZW5jZQorICAgICAgICAgICAgaW5pdF9jb3B5ID0gY29weV9jb25zdHJ1Y3RfaW5pdC5yZXBsYWNlKCdzcmMuJywgJ3NyYy0+JykKKyAgICAgICAgICAgIGluaXRfY29uc3RydWN0ID0gY29weV9jb25zdHJ1Y3RfdHh0LnJlcGxhY2UoJ3NyYy4nLCAnc3JjLT4nKQorICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfYm9keS5hcHBlbmQoIlxudm9pZCAlczo6aW5pdGlhbGl6ZShjb25zdCAlcyogc3JjKVxue1xuJXMlc30iICUgKHNzX25hbWUsIHNzX25hbWUsIGluaXRfY29weSwgaW5pdF9jb25zdHJ1Y3QpKQorICAgICAgICAgICAgaWYgaXRlbS5pZmRlZl9wcm90ZWN0ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfYm9keS5hcHBlbmQoIiNlbmRpZiAvLyAlc1xuIiAlIGl0ZW0uaWZkZWZfcHJvdGVjdCkKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihzYWZlX3N0cnVjdF9ib2R5KQorICAgICMKKyAgICAjIEdlbmVyYXRlIHRoZSB0eXBlIG1hcAorICAgIGRlZiBHZW5lcmF0ZVR5cGVNYXBIZWxwZXJIZWFkZXIoc2VsZik6CisgICAgICAgIHByZWZpeCA9ICdMdmwnCisgICAgICAgIGZwcmVmaXggPSAnbHZsXycKKyAgICAgICAgdHlwZW1hcCA9IHByZWZpeCArICdUeXBlTWFwJworICAgICAgICBpZG1hcCA9IHByZWZpeCArICdTVHlwZU1hcCcKKyAgICAgICAgdHlwZV9tZW1iZXIgPSAnVHlwZScKKyAgICAgICAgaWRfbWVtYmVyID0gJ2tTVHlwZScKKyAgICAgICAgaWRfZGVjbCA9ICdzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlICcKKyAgICAgICAgZ2VuZXJpY19oZWFkZXIgPSBwcmVmaXggKyAnR2VuZXJpY0hlYWRlcicKKyAgICAgICAgdHlwZW5hbWVfZnVuYyA9IGZwcmVmaXggKyAndHlwZW5hbWUnCisgICAgICAgIGlkbmFtZV9mdW5jID0gZnByZWZpeCArICdzdHlwZV9uYW1lJworICAgICAgICBmaW5kX2Z1bmMgPSBmcHJlZml4ICsgJ2ZpbmRfaW5fY2hhaW4nCisgICAgICAgIGluaXRfZnVuYyA9IGZwcmVmaXggKyAnaW5pdF9zdHJ1Y3QnCisKKyAgICAgICAgZXhwbGFuYXRvcnlfY29tbWVudCA9ICdcbicuam9pbigoCisgICAgICAgICAgICAgICAgJy8vIFRoZXNlIGVtcHR5IGdlbmVyaWMgdGVtcGxhdGVzIGFyZSBzcGVjaWFsaXplZCBmb3IgZWFjaCB0eXBlIHdpdGggc1R5cGUnLAorICAgICAgICAgICAgICAgICcvLyBtZW1iZXJzIGFuZCBmb3IgZWFjaCBzVHlwZSAtLSBwcm92aWRpbmcgYSB0d28gd2F5IG1hcCBiZXR3ZWVuIHN0cnVjdHVyZScsCisgICAgICAgICAgICAgICAgJy8vIHR5cGVzIGFuZCBzVHlwZXMnKSkKKworICAgICAgICBlbXB0eV90eXBlbWFwID0gJ3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgJyArIHR5cGVtYXAgKyAnIHt9OycKKyAgICAgICAgdHlwZW1hcF9mb3JtYXQgID0gJ3RlbXBsYXRlIDw+IHN0cnVjdCB7dGVtcGxhdGV9PHt0eXBlbmFtZX0+IHt7XG4nCisgICAgICAgIHR5cGVtYXBfZm9ybWF0ICs9ICcgICAge2lkX2RlY2x9e2lkX21lbWJlcn0gPSB7aWRfdmFsdWV9O1xuJworICAgICAgICB0eXBlbWFwX2Zvcm1hdCArPSAnfX07XG4nCisKKyAgICAgICAgZW1wdHlfaWRtYXAgPSAndGVtcGxhdGUgPFZrU3RydWN0dXJlVHlwZSBpZD4gc3RydWN0ICcgKyBpZG1hcCArICcge307JworICAgICAgICBpZG1hcF9mb3JtYXQgPSAnJy5qb2luKCgKKyAgICAgICAgICAgICd0ZW1wbGF0ZSA8PiBzdHJ1Y3Qge3RlbXBsYXRlfTx7aWRfdmFsdWV9PiB7e1xuJywKKyAgICAgICAgICAgICcgICAgdHlwZWRlZiB7dHlwZW5hbWV9IHt0eXBlZGVmfTtcbicsCisgICAgICAgICAgICAnfX07XG4nKSkKKworICAgICAgICAjIERlZmluZSB0aGUgdXRpbGl0aWVzIChoZXJlIHNvIGFueSByZW5hbWluZyBzdGF5cyBjb25zaXN0ZW50KSwgaWYgdGhpcyBncm93cyBsYXJnZSwgcmVmYWN0b3IgdG8gYSBmaXhlZCAuaCBmaWxlCisgICAgICAgIHV0aWxpdGllc19mb3JtYXQgPSAnXG4nLmpvaW4oKAorICAgICAgICAgICAgJy8vIEhlYWRlciAiYmFzZSBjbGFzcyIgZm9yIHBOZXh0IGNoYWluIHRyYXZlcnNhbCcsCisgICAgICAgICAgICAnc3RydWN0IHtoZWFkZXJ9IHt7JywKKyAgICAgICAgICAgICcgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7JywKKyAgICAgICAgICAgICcgICBjb25zdCB7aGVhZGVyfSAqcE5leHQ7JywKKyAgICAgICAgICAgICd9fTsnLAorICAgICAgICAgICAgJycsCisgICAgICAgICAgICAnLy8gRmluZCBhbiBlbnRyeSBvZiB0aGUgZ2l2ZW4gdHlwZSBpbiB0aGUgcE5leHQgY2hhaW4nLAorICAgICAgICAgICAgJ3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjb25zdCBUICp7ZmluZF9mdW5jfShjb25zdCB2b2lkICpuZXh0KSB7eycsCisgICAgICAgICAgICAnICAgIGNvbnN0IHtoZWFkZXJ9ICpjdXJyZW50ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB7aGVhZGVyfSAqPihuZXh0KTsnLAorICAgICAgICAgICAgJyAgICBjb25zdCBUICpmb3VuZCA9IG51bGxwdHI7JywKKyAgICAgICAgICAgICcgICAgd2hpbGUgKGN1cnJlbnQpIHt7JywKKyAgICAgICAgICAgICcgICAgICAgIGlmICh7dHlwZV9tYXB9PFQ+Ojp7aWRfbWVtYmVyfSA9PSBjdXJyZW50LT5zVHlwZSkge3snLAorICAgICAgICAgICAgJyAgICAgICAgICAgIGZvdW5kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oY3VycmVudCk7JywKKyAgICAgICAgICAgICcgICAgICAgICAgICBjdXJyZW50ID0gbnVsbHB0cjsnLAorICAgICAgICAgICAgJyAgICAgICAgfX0gZWxzZSB7eycsCisgICAgICAgICAgICAnICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBOZXh0OycsCisgICAgICAgICAgICAnICAgICAgICB9fScsCisgICAgICAgICAgICAnICAgIH19JywKKyAgICAgICAgICAgICcgICAgcmV0dXJuIGZvdW5kOycsCisgICAgICAgICAgICAnfX0nLAorICAgICAgICAgICAgJycsCisgICAgICAgICAgICAnLy8gSW5pdCB0aGUgaGVhZGVyIG9mIGFuIHNUeXBlIHN0cnVjdCB3aXRoIHBOZXh0JywKKyAgICAgICAgICAgICd0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCB7aW5pdF9mdW5jfSh2b2lkICpwX25leHQpIHt7JywKKyAgICAgICAgICAgICcgICAgVCBvdXQgPSB7e319OycsCisgICAgICAgICAgICAnICAgIG91dC5zVHlwZSA9IHt0eXBlX21hcH08VD46OmtTVHlwZTsnLAorICAgICAgICAgICAgJyAgICBvdXQucE5leHQgPSBwX25leHQ7JywKKyAgICAgICAgICAgICcgICAgcmV0dXJuIG91dDsnLAorICAgICAgICAgICAgJ319JywKKyAgICAgICAgICAgICAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJy8vIEluaXQgdGhlIGhlYWRlciBvZiBhbiBzVHlwZSBzdHJ1Y3QnLAorICAgICAgICAgICAgJ3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIHtpbml0X2Z1bmN9KCkge3snLAorICAgICAgICAgICAgJyAgICBUIG91dCA9IHt7fX07JywKKyAgICAgICAgICAgICcgICAgb3V0LnNUeXBlID0ge3R5cGVfbWFwfTxUPjo6a1NUeXBlOycsCisgICAgICAgICAgICAnICAgIHJldHVybiBvdXQ7JywKKyAgICAgICAgICAgICd9fScsCisKKyAgICAgICAgICAgICcnKSkKKworICAgICAgICBjb2RlID0gW10KKworICAgICAgICAjIEdlbmVyYXRlIGhlYWRlcgorICAgICAgICBjb2RlLmFwcGVuZCgnXG4nLmpvaW4oKAorICAgICAgICAgICAgJyNwcmFnbWEgb25jZScsCisgICAgICAgICAgICAnI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD5cbicsCisgICAgICAgICAgICBleHBsYW5hdG9yeV9jb21tZW50LCAnJywKKyAgICAgICAgICAgIGVtcHR5X2lkbWFwLAorICAgICAgICAgICAgZW1wdHlfdHlwZW1hcCwgJycpKSkKKworICAgICAgICAjIEdlbmVyYXRlIHRoZSBzcGVjaWFsaXphdGlvbnMgZm9yIGVhY2ggdHlwZSBhbmQgc3R5cGUKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5zdHJ1Y3RNZW1iZXJzOgorICAgICAgICAgICAgdHlwZW5hbWUgPSBpdGVtLm5hbWUKKyAgICAgICAgICAgIGluZm8gPSBzZWxmLnN0cnVjdFR5cGVzLmdldCh0eXBlbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBpbmZvOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGl0ZW0uaWZkZWZfcHJvdGVjdCAhPSBOb25lOgorICAgICAgICAgICAgICAgIGNvZGUuYXBwZW5kKCcjaWZkZWYgJXMnICUgaXRlbS5pZmRlZl9wcm90ZWN0KQorCisgICAgICAgICAgICBjb2RlLmFwcGVuZCgnLy8gTWFwIHR5cGUge30gdG8gaWQge30nLmZvcm1hdCh0eXBlbmFtZSwgaW5mby52YWx1ZSkpCisgICAgICAgICAgICBjb2RlLmFwcGVuZCh0eXBlbWFwX2Zvcm1hdC5mb3JtYXQodGVtcGxhdGU9dHlwZW1hcCwgdHlwZW5hbWU9dHlwZW5hbWUsIGlkX3ZhbHVlPWluZm8udmFsdWUsCisgICAgICAgICAgICAgICAgaWRfZGVjbD1pZF9kZWNsLCBpZF9tZW1iZXI9aWRfbWVtYmVyKSkKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKGlkbWFwX2Zvcm1hdC5mb3JtYXQodGVtcGxhdGU9aWRtYXAsIHR5cGVuYW1lPXR5cGVuYW1lLCBpZF92YWx1ZT1pbmZvLnZhbHVlLCB0eXBlZGVmPXR5cGVfbWVtYmVyKSkKKworICAgICAgICAgICAgaWYgaXRlbS5pZmRlZl9wcm90ZWN0ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoJyNlbmRpZiAvLyAlcycgJSBpdGVtLmlmZGVmX3Byb3RlY3QpCisKKyAgICAgICAgIyBHZW5lcmF0ZSB1dGlsaXRpZXMgZm9yIGFsbCB0eXBlcworICAgICAgICBjb2RlLmFwcGVuZCgnXG4nLmpvaW4oKAorICAgICAgICAgICAgdXRpbGl0aWVzX2Zvcm1hdC5mb3JtYXQoaWRfbWVtYmVyPWlkX21lbWJlciwgaWRfbWFwPWlkbWFwLCB0eXBlX21hcD10eXBlbWFwLAorICAgICAgICAgICAgICAgIHR5cGVfbWVtYmVyPXR5cGVfbWVtYmVyLCBoZWFkZXI9Z2VuZXJpY19oZWFkZXIsIHR5cGVuYW1lX2Z1bmM9dHlwZW5hbWVfZnVuYywgaWRuYW1lX2Z1bmM9aWRuYW1lX2Z1bmMsCisgICAgICAgICAgICAgICAgZmluZF9mdW5jPWZpbmRfZnVuYywgaW5pdF9mdW5jPWluaXRfZnVuYyksICcnCisgICAgICAgICAgICApKSkKKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGNvZGUpCisKKyAgICAjCisgICAgIyBDcmVhdGUgYSBoZWxwZXIgZmlsZSBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nCisgICAgZGVmIE91dHB1dERlc3RGaWxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPT0gJ2VudW1fc3RyaW5nX2hlYWRlcic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5HZW5lcmF0ZUVudW1TdHJpbmdIZWxwZXJIZWFkZXIoKQorICAgICAgICBlbGlmIHNlbGYuaGVscGVyX2ZpbGVfdHlwZSA9PSAnc2FmZV9zdHJ1Y3RfaGVhZGVyJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkdlbmVyYXRlU2FmZVN0cnVjdEhlbHBlckhlYWRlcigpCisgICAgICAgIGVsaWYgc2VsZi5oZWxwZXJfZmlsZV90eXBlID09ICdzYWZlX3N0cnVjdF9zb3VyY2UnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2VuZXJhdGVTYWZlU3RydWN0SGVscGVyU291cmNlKCkKKyAgICAgICAgZWxpZiBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPT0gJ29iamVjdF90eXBlc19oZWFkZXInOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2VuZXJhdGVPYmplY3RUeXBlc0hlbHBlckhlYWRlcigpCisgICAgICAgIGVsaWYgc2VsZi5oZWxwZXJfZmlsZV90eXBlID09ICdleHRlbnNpb25faGVscGVyX2hlYWRlcic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5HZW5lcmF0ZUV4dGVuc2lvbkhlbHBlckhlYWRlcigpCisgICAgICAgIGVsaWYgc2VsZi5oZWxwZXJfZmlsZV90eXBlID09ICd0eXBlbWFwX2hlbHBlcl9oZWFkZXInOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2VuZXJhdGVUeXBlTWFwSGVscGVySGVhZGVyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnQmFkIEhlbHBlciBGaWxlIEdlbmVyYXRvciBPcHRpb24gJXMnICUgc2VsZi5oZWxwZXJfZmlsZV90eXBlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy9zY3JpcHRzL3Z1bGthbmluZm9fZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy92dWxrYW5pbmZvX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJmYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvc2NyaXB0cy92dWxrYW5pbmZvX2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDg5NyBAQAorIyEvdXNyL2Jpbi9weXRob24zCisjCisjIENvcHlyaWdodCAoYykgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxOSBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IENoYXJsZXMgR2llc3NlbiA8Y2hhcmxlc0BsdW5hcmcuY29tPgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHN0cmluZworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBldHJlZQoraW1wb3J0IGdlbmVyYXRvciBhcyBnZW4KK2ltcG9ydCBvcGVyYXRvcgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2Zyb20gZ2VuZXJhdG9yIGltcG9ydCAqCitmcm9tIGNvbW1vbl9jb2RlZ2VuIGltcG9ydCAqCisKK2xpY2Vuc2VfaGVhZGVyID0gJycnCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hhcmxlcyBHaWVzc2VuIDxjaGFybGVzQGx1bmFyZy5jb20+CisgKgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisgKi8KKycnJworCitjdXN0b21fZm9ybWF0ZXJzID0gJycnCitzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvLCBWa0NvbmZvcm1hbmNlVmVyc2lvbktIUiAmYykgeworICAgIHJldHVybiBvIDw8IHN0ZDo6dG9fc3RyaW5nKGMubWFqb3IpIDw8ICIuIiA8PCBzdGQ6OnRvX3N0cmluZyhjLm1pbm9yKSA8PCAiLiIgPDwgc3RkOjp0b19zdHJpbmcoYy5zdWJtaW5vcikgPDwgIi4iCisgICAgICAgICAgICAgPDwgc3RkOjp0b19zdHJpbmcoYy5wYXRjaCk7Cit9CisKK3N0ZDo6c3RyaW5nIFZrRXh0ZW50M0RTdHJpbmcoVmtFeHRlbnQzRCBlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIoIikgKyBzdGQ6OnRvX3N0cmluZyhlLndpZHRoKSArICIsICIgKyBzdGQ6OnRvX3N0cmluZyhlLmhlaWdodCkgKyAiLCAiICsgc3RkOjp0b19zdHJpbmcoZS5kZXB0aCkgKyAiKSI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9faGV4X3N0cihUIGkpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgc3RyZWFtIDw8ICIweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KHNpemVvZihUKSkgPDwgc3RkOjpoZXggPDwgaTsKKyAgICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX2hleF9zdHIoUHJpbnRlciAmcCwgVCBpKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pCisgICAgICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB0b19oZXhfc3RyKGkpOworfQorJycnCisKKyMgdXNlZCBpbiB0aGUgLmNwcCBjb2RlCitzdHJ1Y3R1cmVzX3RvX2dlbiA9IFsnVmtFeHRlbnQzRCcsICdWa0V4dGVudDJEJywgJ1ZrUGh5c2ljYWxEZXZpY2VMaW1pdHMnLCAnVmtQaHlzaWNhbERldmljZUZlYXR1cmVzJywKKyAgICAgICAgICAgICAgICAgICAgICdWa1BoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcycsICdWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFInLCAnVmtTdXJmYWNlRm9ybWF0S0hSJywgJ1ZrTGF5ZXJQcm9wZXJ0aWVzJ10KK2VudW1zX3RvX2dlbiA9IFsnVmtSZXN1bHQnLCAnVmtGb3JtYXQnLCAnVmtQcmVzZW50TW9kZUtIUicsCisgICAgICAgICAgICAgICAgJ1ZrUGh5c2ljYWxEZXZpY2VUeXBlJywgJ1ZrSW1hZ2VUaWxpbmcnXQorZmxhZ3NfdG9fZ2VuID0gWydWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUicsICdWa0NvbXBvc2l0ZUFscGhhRmxhZ3NLSFInLAorICAgICAgICAgICAgICAgICdWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUicsICdWa0Zvcm1hdEZlYXR1cmVGbGFncycsICdWa01lbW9yeVByb3BlcnR5RmxhZ3MnLCAnVmtNZW1vcnlIZWFwRmxhZ3MnXQorZmxhZ3Nfc3RyaW5nc190b19nZW4gPSBbJ1ZrUXVldWVGbGFncyddCisKK3N0cnVjdF9jb21wYXJpc29uc190b19nZW4gPSBbJ1ZrU3VyZmFjZUZvcm1hdEtIUicsICdWa1N1cmZhY2VGb3JtYXQyS0hSJywgJ1ZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSJywgJ1ZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQnXQorCisjIGlvc3RyZWFtIG9yIGN1c3RvbSBvdXRwdXR0ZXIgaGFuZGxlcyB0aGVzZSB0eXBlcworcHJlZGVmaW5lZF90eXBlcyA9IFsnY2hhcicsICdWa0Jvb2wzMicsICd1aW50MzJfdCcsICd1aW50OF90JywgJ2ludDMyX3QnLAorICAgICAgICAgICAgICAgICAgICAnZmxvYXQnLCAndWludDY0X3QnLCAnc2l6ZV90JywgJ1ZrRGV2aWNlU2l6ZScsICdWa0NvbmZvcm1hbmNlVmVyc2lvbktIUiddCisjIG5lZWQgbGlzdCBvZiB2ZW5kZXJzIHRvIGJsYWNrbGlzdCB2ZW5kb3IgZXh0ZW5zaW9ucwordmVuZG9yX2FiYnJldmlhdGlvbnMgPSBbJ19JTUcnLCAnX0FNRCcsICdfQU1EWCcsICdfQVJNJywgJ19GU0wnLCAnX0JSQ00nLCAnX05YUCcsICdfTlYnLCAnX05WWCcsICdfVklWJywgJ19WU0knLCAnX0tEQUInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ19BTkRST0lEJywgJ19DSFJPTUlVTScsICdfRlVDSFNJQScsICdfR0dQJywgJ19HT09HTEUnLCAnX1FDT00nLCAnX0xVTkFSRycsICdfU0FNU1VORycsICdfU0VDJywgJ19USVpFTicsCisgICAgICAgICAgICAgICAgICAgICAgICAnX1JFTkRFUkRPQycsICdfTk4nLCAnX01WSycsICdfS0hYJywgJ19NRVNBJywgJ19JTlRFTCddCisKKyMgVHlwZXMgdGhhdCBuZWVkIHBOZXh0IENoYWlucyBidWlsdC4gJ2V4dGVuZHMnIGlzIHRoZSB4bWwgdGFnIHVzZWQgaW4gdGhlIHN0cnVjdGV4dGVuZHMgbWVtYmVyLiAndHlwZScgY2FuIGJlIGRldmljZSwgaW5zdGFuY2UsIG9yIGJvdGgKK0VYVEVOU0lPTl9DQVRFR09SSUVTID0geydwaHlzX2RldmljZV9wcm9wczInOiB7J2V4dGVuZHMnOiAnVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyJywgJ3R5cGUnOiAnZGV2aWNlJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAncGh5c19kZXZpY2VfbWVtX3Byb3BzMic6IHsnZXh0ZW5kcyc6ICdWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczInLCAndHlwZSc6ICdkZXZpY2UnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdwaHlzX2RldmljZV9mZWF0dXJlczInOiB7J2V4dGVuZHMnOiAnVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMixWa0RldmljZUNyZWF0ZUluZm8nLCAndHlwZSc6ICdkZXZpY2UnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdXJmYWNlX2NhcGFiaWxpdGllczInOiB7J2V4dGVuZHMnOiAnVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUicsICd0eXBlJzogJ2JvdGgnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtYXRfcHJvcGVydGllczInOiB7J2V4dGVuZHMnOiAnVmtGb3JtYXRQcm9wZXJ0aWVzMicsICd0eXBlJzogJ2RldmljZSd9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworY2xhc3MgVnVsa2FuSW5mb0dlbmVyYXRvck9wdGlvbnMoR2VuZXJhdG9yT3B0aW9ucyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25zPU5vbmUsCisgICAgICAgICAgICAgICAgIGlucHV0PU5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeT0nLicsCisgICAgICAgICAgICAgICAgIGFwaW5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgICB2ZXJzaW9ucz0nLionLAorICAgICAgICAgICAgICAgICBlbWl0dmVyc2lvbnM9Jy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucz1Ob25lLAorICAgICAgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zPU5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zPU5vbmUsCisgICAgICAgICAgICAgICAgIHNvcnRQcm9jZWR1cmU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcHJlZml4VGV4dD0iIiwKKyAgICAgICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzPVRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGaWxlPVRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlPVRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RQcm90bz1Ob25lLAorICAgICAgICAgICAgICAgICBwcm90ZWN0UHJvdG9TdHI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgYXBpY2FsbD0nJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnk9JycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5cD0nJywKKyAgICAgICAgICAgICAgICAgaW5kZW50RnVuY1Byb3RvPVRydWUsCisgICAgICAgICAgICAgICAgIGluZGVudEZ1bmNQb2ludGVyPUZhbHNlLAorICAgICAgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbT0wLAorICAgICAgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzPVRydWUsCisgICAgICAgICAgICAgICAgICk6CisgICAgICAgIEdlbmVyYXRvck9wdGlvbnMuX19pbml0X18oc2VsZiwgY29udmVudGlvbnMsIGZpbGVuYW1lLCBkaXJlY3RvcnksIGFwaW5hbWUsIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMsIGVtaXR2ZXJzaW9ucywgZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucywgcmVtb3ZlRXh0ZW5zaW9ucywgZW1pdEV4dGVuc2lvbnMsIHNvcnRQcm9jZWR1cmUpCisgICAgICAgIHNlbGYuaW5wdXQgPSBpbnB1dAorICAgICAgICBzZWxmLnByZWZpeFRleHQgPSBwcmVmaXhUZXh0CisgICAgICAgIHNlbGYuZ2VuRnVuY1BvaW50ZXJzID0gZ2VuRnVuY1BvaW50ZXJzCisgICAgICAgIHNlbGYucHJvdGVjdEZpbGUgPSBwcm90ZWN0RmlsZQorICAgICAgICBzZWxmLnByb3RlY3RGZWF0dXJlID0gcHJvdGVjdEZlYXR1cmUKKyAgICAgICAgc2VsZi5wcm90ZWN0UHJvdG8gPSBwcm90ZWN0UHJvdG8KKyAgICAgICAgc2VsZi5wcm90ZWN0UHJvdG9TdHIgPSBwcm90ZWN0UHJvdG9TdHIKKyAgICAgICAgc2VsZi5hcGljYWxsID0gYXBpY2FsbAorICAgICAgICBzZWxmLmFwaWVudHJ5ID0gYXBpZW50cnkKKyAgICAgICAgc2VsZi5hcGllbnRyeXAgPSBhcGllbnRyeXAKKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUHJvdG8gPSBpbmRlbnRGdW5jUHJvdG8KKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUG9pbnRlciA9IGluZGVudEZ1bmNQb2ludGVyCisgICAgICAgIHNlbGYuYWxpZ25GdW5jUGFyYW0gPSBhbGlnbkZ1bmNQYXJhbQorCisjIFZ1bGthbkluZm9HZW5lcmF0b3IgLSBzdWJjbGFzcyBvZiBPdXRwdXRHZW5lcmF0b3IuCisjIEdlbmVyYXRlcyBhIHZ1bGthbiBpbmZvIG91dHB1dCBoZWxwZXIgZnVuY3Rpb24KKworCitjbGFzcyBWdWxrYW5JbmZvR2VuZXJhdG9yKE91dHB1dEdlbmVyYXRvcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgZXJyRmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICB3YXJuRmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICBkaWFnRmlsZT1zeXMuc3Rkb3V0KToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkKKworICAgICAgICBzZWxmLmNvbnN0YW50cyA9IE9yZGVyZWREaWN0KCkKKworICAgICAgICBzZWxmLmV4dGVuc2lvbl9zZXRzID0gT3JkZXJlZERpY3QoKQorICAgICAgICBmb3IgZXh0X2NhdCBpbiBFWFRFTlNJT05fQ0FURUdPUklFUy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmV4dGVuc2lvbl9zZXRzW2V4dF9jYXRdID0gc2V0KCkKKworICAgICAgICBzZWxmLmVudW1zID0gc2V0KCkKKyAgICAgICAgc2VsZi5mbGFncyA9IHNldCgpCisgICAgICAgIHNlbGYuYml0bWFza3MgPSBzZXQoKQorICAgICAgICBzZWxmLnN0cnVjdHVyZXMgPSBzZXQoKQorICAgICAgICBzZWxmLnN0cnVjdHNfdG9fY29tcCA9IHNldCgpCisgICAgICAgIHNlbGYuYWxsX3N0cnVjdHVyZXMgPSBzZXQoKQorCisgICAgICAgIHNlbGYudHlwZXNfdG9fZ2VuID0gc2V0KCkKKworICAgICAgICBzZWxmLmV4dEZ1bmNzID0gT3JkZXJlZERpY3QoKQorICAgICAgICBzZWxmLmV4dFR5cGVzID0gT3JkZXJlZERpY3QoKQorCisgICAgZGVmIGJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKToKKyAgICAgICAgZ2VuLk91dHB1dEdlbmVyYXRvci5iZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cykKKworICAgICAgICByb290ID0gc2VsZi5yZWdpc3RyeS5yZWcKKworICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnJlZ2lzdHJ5LnJlZy5maW5kYWxsKCdlbnVtcycpOgorICAgICAgICAgICAgaWYgbm9kZS5nZXQoJ25hbWUnKSA9PSAnQVBJIENvbnN0YW50cyc6CisgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbm9kZS5maW5kYWxsKCdlbnVtJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uc3RhbnRzW2l0ZW0uZ2V0KCduYW1lJyldID0gaXRlbS5nZXQoJ3ZhbHVlJykKKworICAgICAgICBmb3Igbm9kZSBpbiByb290LmZpbmQoJ2V4dGVuc2lvbnMnKS5maW5kYWxsKCdleHRlbnNpb24nKToKKyAgICAgICAgICAgIGV4dCA9IFZ1bGthbkV4dGVuc2lvbihub2RlKQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZXh0LnZrdHlwZXM6CisgICAgICAgICAgICAgICAgc2VsZi5leHRUeXBlc1tpdGVtXSA9IGV4dAorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZXh0LnZrZnVuY3M6CisgICAgICAgICAgICAgICAgc2VsZi5leHRGdW5jc1tpdGVtXSA9IGV4dAorCisgICAgZGVmIGVuZEZpbGUoc2VsZik6CisgICAgICAgIHR5cGVzX3RvX2dlbiA9IHNldCgpCisgICAgICAgIGZvciBzIGluIGVudW1zX3RvX2dlbjoKKyAgICAgICAgICAgIHR5cGVzX3RvX2dlbi5hZGQocykKKworICAgICAgICBmb3IgZiBpbiBmbGFnc190b19nZW46CisgICAgICAgICAgICB0eXBlc190b19nZW4uYWRkKGYpCisKKyAgICAgICAgdHlwZXNfdG9fZ2VuID0gdHlwZXNfdG9fZ2VuLnVuaW9uKEdhdGhlclR5cGVzVG9HZW4oc2VsZi5zdHJ1Y3R1cmVzKSkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gRVhURU5TSU9OX0NBVEVHT1JJRVMuaXRlbXMoKToKKyAgICAgICAgICAgIHR5cGVzX3RvX2dlbiA9IHR5cGVzX3RvX2dlbi51bmlvbigKKyAgICAgICAgICAgICAgICBHYXRoZXJUeXBlc1RvR2VuKHNlbGYuZXh0ZW5zaW9uX3NldHNba2V5XSkpCisKKyAgICAgICAgc3RydWN0c190b19jb21wID0gc2V0KCkKKyAgICAgICAgZm9yIHMgaW4gc3RydWN0X2NvbXBhcmlzb25zX3RvX2dlbjoKKyAgICAgICAgICAgIHN0cnVjdHNfdG9fY29tcC5hZGQocykKKyAgICAgICAgc3RydWN0c190b19jb21wID0gc3RydWN0c190b19jb21wLnVuaW9uKAorICAgICAgICAgICAgR2F0aGVyVHlwZXNUb0dlbihzZWxmLnN0cnVjdHNfdG9fY29tcCkpCisKKyAgICAgICAgc2VsZi5lbnVtcyA9IHNvcnRlZChzZWxmLmVudW1zLCBrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignbmFtZScpKQorICAgICAgICBzZWxmLmZsYWdzID0gc29ydGVkKHNlbGYuZmxhZ3MsIGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCduYW1lJykpCisgICAgICAgIHNlbGYuYml0bWFza3MgPSBzb3J0ZWQoc2VsZi5iaXRtYXNrcywga2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoJ25hbWUnKSkKKyAgICAgICAgc2VsZi5zdHJ1Y3R1cmVzID0gc29ydGVkKAorICAgICAgICAgICAgc2VsZi5zdHJ1Y3R1cmVzLCBrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignbmFtZScpKQorICAgICAgICBzZWxmLmFsbF9zdHJ1Y3R1cmVzID0gc29ydGVkKAorICAgICAgICAgICAgc2VsZi5hbGxfc3RydWN0dXJlcywga2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoJ25hbWUnKSkKKworICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLmV4dGVuc2lvbl9zZXRzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmV4dGVuc2lvbl9zZXRzW2tleV0gPSBzb3J0ZWQoCisgICAgICAgICAgICAgICAgdmFsdWUsIGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCduYW1lJykpCisKKyAgICAgICAgb3V0ID0gJycKKyAgICAgICAgb3V0ICs9IGxpY2Vuc2VfaGVhZGVyICsgIlxuIgorICAgICAgICBvdXQgKz0gIiNpbmNsdWRlIFwidnVsa2FuaW5mby5oXCJcbiIKKyAgICAgICAgb3V0ICs9ICIjaW5jbHVkZSBcIm91dHB1dHByaW50ZXIuaFwiXG4iCisgICAgICAgIG91dCArPSBjdXN0b21fZm9ybWF0ZXJzCisKKyAgICAgICAgZm9yIGUgaW4gc2VsZi5lbnVtczoKKyAgICAgICAgICAgIGlmIGUubmFtZSBpbiB0eXBlc190b19nZW46CisgICAgICAgICAgICAgICAgb3V0ICs9IFByaW50RW51bVRvU3RyaW5nKGUsIHNlbGYpCisgICAgICAgICAgICAgICAgb3V0ICs9IFByaW50RW51bShlLCBzZWxmKQorCisgICAgICAgIGZvciBmIGluIHNlbGYuZmxhZ3M6CisgICAgICAgICAgICBpZiBmLm5hbWUgaW4gdHlwZXNfdG9fZ2VuOgorICAgICAgICAgICAgICAgIGZvciBiIGluIHNlbGYuYml0bWFza3M6CisgICAgICAgICAgICAgICAgICAgIGlmIGIubmFtZSA9PSBmLmVudW06CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gUHJpbnRGbGFncyhmLCBiLCBzZWxmKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFByaW50Qml0TWFzayhiLCBmLm5hbWUsIHNlbGYpCisKKyAgICAgICAgICAgIGlmIGYubmFtZSBpbiBmbGFnc19zdHJpbmdzX3RvX2dlbjoKKyAgICAgICAgICAgICAgICBmb3IgYiBpbiBzZWxmLmJpdG1hc2tzOgorICAgICAgICAgICAgICAgICAgICBpZiBiLm5hbWUgPT0gZi5lbnVtOgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFByaW50Qml0TWFza1RvU3RyaW5nKGIsIGYubmFtZSwgc2VsZikKKworICAgICAgICAjIGZpbmQgYWxsIHN0cnVjdHVyZXMgbmVlZGVkIHRvIGR1bXAgdGhlIHJlcXVlc3RlZCBzdHJ1Y3R1cmVzCisgICAgICAgIHN0cnVjdHVyZV9uYW1lcyA9IHNldCgpCisgICAgICAgIGZvciBzIGluIHNlbGYuYWxsX3N0cnVjdHVyZXM6CisgICAgICAgICAgICBpZiBzLm5hbWUgaW4gdHlwZXNfdG9fZ2VuOgorICAgICAgICAgICAgICAgIHN0cnVjdHVyZV9uYW1lcy5hZGQocy5uYW1lKQorCisgICAgICAgIGZvciBzIGluIHNlbGYuYWxsX3N0cnVjdHVyZXM6CisgICAgICAgICAgICBpZiBzLm5hbWUgaW4gdHlwZXNfdG9fZ2VuOgorICAgICAgICAgICAgICAgIG91dCArPSBQcmludEZvcndhcmREZWNsYXJhdGlvbihzLCBzZWxmKQorCisgICAgICAgIGZvciBzIGluIHNlbGYuYWxsX3N0cnVjdHVyZXM6CisgICAgICAgICAgICBpZiBzLm5hbWUgaW4gdHlwZXNfdG9fZ2VuOgorICAgICAgICAgICAgICAgIG91dCArPSBQcmludFN0cnVjdHVyZShzLCBzdHJ1Y3R1cmVfbmFtZXMsIHNlbGYpCisKKyAgICAgICAgb3V0ICs9ICJwTmV4dENoYWluSW5mb3MgZ2V0X2NoYWluX2luZm9zKCkge1xuIgorICAgICAgICBvdXQgKz0gIiAgICBwTmV4dENoYWluSW5mb3MgaW5mb3M7XG4iCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIEVYVEVOU0lPTl9DQVRFR09SSUVTLml0ZW1zKCk6CisgICAgICAgICAgICBvdXQgKz0gUHJpbnRDaGFpbkJ1aWxkZXJzKGtleSwgc2VsZi5leHRlbnNpb25fc2V0c1trZXldKQorICAgICAgICBvdXQgKz0gIiAgICByZXR1cm4gaW5mb3M7XG59XG4iCisKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gRVhURU5TSU9OX0NBVEVHT1JJRVMuaXRlbXMoKToKKyAgICAgICAgICAgIG91dCArPSBQcmludENoYWluSXRlcmF0b3Ioa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4dGVuc2lvbl9zZXRzW2tleV0sIHZhbHVlLmdldCgndHlwZScpKQorCisgICAgICAgIGZvciBzIGluIHNlbGYuYWxsX3N0cnVjdHVyZXM6CisgICAgICAgICAgICBpZiBzLm5hbWUgaW4gc3RydWN0c190b19jb21wOgorICAgICAgICAgICAgICAgIG91dCArPSBQcmludFN0cnVjdENvbXBhcmlzb25Gb3J3YXJkRGVmKHMpCisKKyAgICAgICAgZm9yIHMgaW4gc2VsZi5hbGxfc3RydWN0dXJlczoKKyAgICAgICAgICAgIGlmIHMubmFtZSBpbiBzdHJ1Y3RzX3RvX2NvbXA6CisgICAgICAgICAgICAgICAgb3V0ICs9IFByaW50U3RydWN0Q29tcGFyaXNvbihzKQorCisgICAgICAgIGdlbi53cml0ZShvdXQsIGZpbGU9c2VsZi5vdXRGaWxlKQorCisgICAgICAgIGdlbi5PdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorCisgICAgZGVmIGdlbkNtZChzZWxmLCBjbWQsIG5hbWUsIGFsaWFzKToKKyAgICAgICAgZ2VuLk91dHB1dEdlbmVyYXRvci5nZW5DbWQoc2VsZiwgY21kLCBuYW1lLCBhbGlhcykKKworICAgICMgVGhlc2UgYXJlIGFjdHVhbGx5IGNvbnN0YW50cworICAgIGRlZiBnZW5FbnVtKHNlbGYsIGVudW1pbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgIGdlbi5PdXRwdXRHZW5lcmF0b3IuZ2VuRW51bShzZWxmLCBlbnVtaW5mbywgbmFtZSwgYWxpYXMpCisKKyAgICAjIFRoZXNlIGFyZSBhY3R1YWxseSBlbnVtcworICAgIGRlZiBnZW5Hcm91cChzZWxmLCBncm91cGluZm8sIGdyb3VwTmFtZSwgYWxpYXMpOgorICAgICAgICBnZW4uT3V0cHV0R2VuZXJhdG9yLmdlbkdyb3VwKHNlbGYsIGdyb3VwaW5mbywgZ3JvdXBOYW1lLCBhbGlhcykKKworICAgICAgICBpZiBhbGlhcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGdyb3VwaW5mby5lbGVtLmdldCgndHlwZScpID09ICdiaXRtYXNrJzoKKyAgICAgICAgICAgIHNlbGYuYml0bWFza3MuYWRkKFZ1bGthbkJpdG1hc2soZ3JvdXBpbmZvLmVsZW0pKQorICAgICAgICBlbGlmIGdyb3VwaW5mby5lbGVtLmdldCgndHlwZScpID09ICdlbnVtJzoKKyAgICAgICAgICAgIHNlbGYuZW51bXMuYWRkKFZ1bGthbkVudW0oZ3JvdXBpbmZvLmVsZW0pKQorCisgICAgZGVmIGdlblR5cGUoc2VsZiwgdHlwZWluZm8sIG5hbWUsIGFsaWFzKToKKyAgICAgICAgZ2VuLk91dHB1dEdlbmVyYXRvci5nZW5UeXBlKHNlbGYsIHR5cGVpbmZvLCBuYW1lLCBhbGlhcykKKworICAgICAgICBpZiBhbGlhcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHR5cGVpbmZvLmVsZW0uZ2V0KCdjYXRlZ29yeScpID09ICdiaXRtYXNrJzoKKyAgICAgICAgICAgIHNlbGYuZmxhZ3MuYWRkKFZ1bGthbkZsYWdzKHR5cGVpbmZvLmVsZW0pKQorCisgICAgICAgIGlmIHR5cGVpbmZvLmVsZW0uZ2V0KCdjYXRlZ29yeScpID09ICdzdHJ1Y3QnIGFuZCBuYW1lIGluIHN0cnVjdHVyZXNfdG9fZ2VuOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3R1cmVzLmFkZChWdWxrYW5TdHJ1Y3R1cmUoCisgICAgICAgICAgICAgICAgbmFtZSwgdHlwZWluZm8uZWxlbSwgc2VsZi5jb25zdGFudHMsIHNlbGYuZXh0VHlwZXMpKQorCisgICAgICAgIGlmIHR5cGVpbmZvLmVsZW0uZ2V0KCdjYXRlZ29yeScpID09ICdzdHJ1Y3QnIGFuZCBuYW1lIGluIHN0cnVjdF9jb21wYXJpc29uc190b19nZW46CisgICAgICAgICAgICBzZWxmLnN0cnVjdHNfdG9fY29tcC5hZGQoVnVsa2FuU3RydWN0dXJlKAorICAgICAgICAgICAgICAgIG5hbWUsIHR5cGVpbmZvLmVsZW0sIHNlbGYuY29uc3RhbnRzLCBzZWxmLmV4dFR5cGVzKSkKKworICAgICAgICBpZiB0eXBlaW5mby5lbGVtLmdldCgnY2F0ZWdvcnknKSA9PSAnc3RydWN0JzoKKyAgICAgICAgICAgIHNlbGYuYWxsX3N0cnVjdHVyZXMuYWRkKFZ1bGthblN0cnVjdHVyZSgKKyAgICAgICAgICAgICAgICBuYW1lLCB0eXBlaW5mby5lbGVtLCBzZWxmLmNvbnN0YW50cywgc2VsZi5leHRUeXBlcykpCisKKyAgICAgICAgZm9yIHZlbmRvciBpbiB2ZW5kb3JfYWJicmV2aWF0aW9uczoKKyAgICAgICAgICAgIGZvciBub2RlIGluIHR5cGVpbmZvLmVsZW0uZmluZGFsbCgnbWVtYmVyJyk6CisgICAgICAgICAgICAgICAgaWYobm9kZS5nZXQoJ3ZhbHVlcycpIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgaWYobm9kZS5nZXQoJ3ZhbHVlcycpLmZpbmQodmVuZG9yKSkgIT0gLTE6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBFWFRFTlNJT05fQ0FURUdPUklFUy5pdGVtcygpOgorICAgICAgICAgICAgaWYgdHlwZWluZm8uZWxlbS5nZXQoJ3N0cnVjdGV4dGVuZHMnKSA9PSB2YWx1ZS5nZXQoJ2V4dGVuZHMnKToKKyAgICAgICAgICAgICAgICBzZWxmLmV4dGVuc2lvbl9zZXRzW2tleV0uYWRkKFZ1bGthblN0cnVjdHVyZSgKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHlwZWluZm8uZWxlbSwgc2VsZi5jb25zdGFudHMsIHNlbGYuZXh0VHlwZXMpKQorCisKK2RlZiBHYXRoZXJUeXBlc1RvR2VuKHN0cnVjdHVyZXMpOgorICAgIHR5cGVzID0gc2V0KCkKKyAgICBhZGRlZF9zdHVmZiA9IFRydWUgICMgcmVwZWF0IHVudGlsIG5vIG5ldyB0eXBlcyBhcmUgYWRkZWQKKyAgICB3aGlsZSBhZGRlZF9zdHVmZiA9PSBUcnVlOgorICAgICAgICBhZGRlZF9zdHVmZiA9IEZhbHNlCisgICAgICAgIGZvciBzIGluIHN0cnVjdHVyZXM6CisgICAgICAgICAgICBzaXplID0gbGVuKHR5cGVzKQorICAgICAgICAgICAgdHlwZXMuYWRkKHMubmFtZSkKKyAgICAgICAgICAgIGlmIGxlbih0eXBlcykgIT0gc2l6ZToKKyAgICAgICAgICAgICAgICBhZGRlZF9zdHVmZiA9IFRydWUKKyAgICAgICAgICAgIGZvciBtIGluIHMubWVtYmVyczoKKyAgICAgICAgICAgICAgICBpZiBtLnR5cGVJRCBub3QgaW4gcHJlZGVmaW5lZF90eXBlcyBhbmQgbS5uYW1lIG5vdCBpbiBbJ3NUeXBlJywgJ3BOZXh0J106CisgICAgICAgICAgICAgICAgICAgIHR5cGVzLmFkZChtLnR5cGVJRCkKKyAgICByZXR1cm4gdHlwZXMKKworCitkZWYgR2V0RXh0ZW5zaW9uKG5hbWUsIGdlbmVyYXRvcik6CisgICAgaWYgbmFtZSBpbiBnZW5lcmF0b3IuZXh0RnVuY3M6CisgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZXh0RnVuY3NbbmFtZV0KKyAgICBlbGlmIG5hbWUgaW4gZ2VuZXJhdG9yLmV4dFR5cGVzOgorICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmV4dFR5cGVzW25hbWVdCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitkZWYgQWRkR3VhcmRIZWFkZXIob2JqKToKKyAgICBpZiBvYmogaXMgbm90IE5vbmUgYW5kIG9iai5ndWFyZCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuICIjaWZkZWYge31cbiIuZm9ybWF0KG9iai5ndWFyZCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gIiIKKworCitkZWYgQWRkR3VhcmRGb290ZXIob2JqKToKKyAgICBpZiBvYmogaXMgbm90IE5vbmUgYW5kIG9iai5ndWFyZCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuICIjZW5kaWYgIC8vIHt9XG4iLmZvcm1hdChvYmouZ3VhcmQpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICIiCisKKworZGVmIFByaW50RW51bVRvU3RyaW5nKGUsIGdlbik6CisgICAgb3V0ID0gJycKKyAgICBvdXQgKz0gQWRkR3VhcmRIZWFkZXIoR2V0RXh0ZW5zaW9uKGUubmFtZSwgZ2VuKSkKKworICAgIG91dCArPSAic3RhdGljIGNvbnN0IGNoYXIgKiIgKyBlLm5hbWUgKyAiU3RyaW5nKCIgKyBlLm5hbWUgKyAiIHZhbHVlKSB7XG4iCisgICAgb3V0ICs9ICIgICAgc3dpdGNoICh2YWx1ZSkge1xuIgorICAgIGZvciB2IGluIGUub3B0aW9uczoKKyAgICAgICAgb3V0ICs9ICIgICAgICAgIGNhc2UgKCIgKyBzdHIodi52YWx1ZSkgKyBcCisgICAgICAgICAgICAiKTogcmV0dXJuIFwiIiArIHYubmFtZVszOl0gKyAiXCI7XG4iCisgICAgb3V0ICs9ICIgICAgICAgIGRlZmF1bHQ6IHJldHVybiBcIlVOS05PV05fIiArIGUubmFtZSArICJcIjtcbiIKKyAgICBvdXQgKz0gIiAgICB9XG59XG4iCisgICAgb3V0ICs9IEFkZEd1YXJkRm9vdGVyKEdldEV4dGVuc2lvbihlLm5hbWUsIGdlbikpCisgICAgcmV0dXJuIG91dAorCisKK2RlZiBQcmludEVudW0oZSwgZ2VuKToKKyAgICBvdXQgPSAnJworICAgIG91dCArPSBBZGRHdWFyZEhlYWRlcihHZXRFeHRlbnNpb24oZS5uYW1lLCBnZW4pKQorICAgIG91dCArPSAidm9pZCBEdW1wIiArIGUubmFtZSArIFwKKyAgICAgICAgIihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCAiICsgXAorICAgICAgICBlLm5hbWUgKyAiIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7XG4iCisgICAgb3V0ICs9ICIgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHtcbiIKKyAgICBvdXQgKz0gIiAgICAgICAgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlLCB3aWR0aCk7XG4iCisgICAgb3V0ICs9ICIgICAgICAgIHJldHVybjtcbiIKKyAgICBvdXQgKz0gIiAgICB9IGVsc2Uge1xuIgorICAgIG91dCArPSAiICAgICAgICBwLlByaW50S2V5VmFsdWUobmFtZSwgIiArIFwKKyAgICAgICAgZS5uYW1lICsgIlN0cmluZyh2YWx1ZSksIHdpZHRoKTtcbiAgICB9XG4iCisgICAgb3V0ICs9ICJ9XG4iCisgICAgb3V0ICs9IEFkZEd1YXJkRm9vdGVyKEdldEV4dGVuc2lvbihlLm5hbWUsIGdlbikpCisgICAgcmV0dXJuIG91dAorCisKK2RlZiBQcmludEZsYWdzKGYsIGIsIGdlbik6CisgICAgb3V0ID0gJycKKyAgICBvdXQgKz0gQWRkR3VhcmRIZWFkZXIoR2V0RXh0ZW5zaW9uKGYubmFtZSwgZ2VuKSkKKworICAgIG91dCArPSAidm9pZCBEdW1wIiArIGYubmFtZSArIFwKKyAgICAgICAgIihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCAiICsgXAorICAgICAgICBmLmVudW0gKyAiIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7XG4iCisgICAgb3V0ICs9ICIgICAgaWYgKHZhbHVlID09IDApIHAuUHJpbnRFbGVtZW50KFwiTm9uZVwiKTtcbiIKKyAgICBmb3IgdiBpbiBiLm9wdGlvbnM6CisgICAgICAgIG91dCArPSAiICAgIGlmICgiICsgc3RyKHYudmFsdWUpICsgXAorICAgICAgICAgICAgIiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudChcIiIgKyBcCisgICAgICAgICAgICBzdHIodi5uYW1lWzM6XSkgKyAiXCIpO1xuIgorICAgIG91dCArPSAifVxuIgorCisgICAgb3V0ICs9IEFkZEd1YXJkRm9vdGVyKEdldEV4dGVuc2lvbihmLm5hbWUsIGdlbikpCisgICAgcmV0dXJuIG91dAorCisKK2RlZiBQcmludEJpdE1hc2soYiwgbmFtZSwgZ2VuKToKKyAgICBvdXQgPSAnJworICAgIG91dCArPSBBZGRHdWFyZEhlYWRlcihHZXRFeHRlbnNpb24oYi5uYW1lLCBnZW4pKQorICAgIG91dCArPSAidm9pZCBEdW1wIiArIG5hbWUgKyBcCisgICAgICAgICIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgIiArIG5hbWUgKyAiIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7XG4iCisgICAgb3V0ICs9ICIgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlKTsgcmV0dXJuOyB9XG4iCisgICAgb3V0ICs9ICIgICAgcC5PYmplY3RTdGFydChuYW1lKTtcbiIKKyAgICBvdXQgKz0gIiAgICBEdW1wIiArIG5hbWUgKyBcCisgICAgICAgICIocCwgbmFtZSwgc3RhdGljX2Nhc3Q8IiArIGIubmFtZSArICI+KHZhbHVlKSwgd2lkdGgpO1xuIgorICAgIG91dCArPSAiICAgIHAuT2JqZWN0RW5kKCk7XG4iCisgICAgb3V0ICs9ICJ9XG4iCisgICAgb3V0ICs9ICJ2b2lkIER1bXAiICsgYi5uYW1lICsgXAorICAgICAgICAiKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsICIgKyBcCisgICAgICAgIGIubmFtZSArICIgdmFsdWUsIGludCB3aWR0aCA9IDApIHtcbiIKKyAgICBvdXQgKz0gIiAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH1cbiIKKyAgICBvdXQgKz0gIiAgICBwLk9iamVjdFN0YXJ0KG5hbWUpO1xuIgorICAgIG91dCArPSAiICAgIER1bXAiICsgbmFtZSArICIocCwgbmFtZSwgdmFsdWUsIHdpZHRoKTtcbiIKKyAgICBvdXQgKz0gIiAgICBwLk9iamVjdEVuZCgpO1xuIgorICAgIG91dCArPSAifVxuIgorICAgIG91dCArPSBBZGRHdWFyZEZvb3RlcihHZXRFeHRlbnNpb24oYi5uYW1lLCBnZW4pKQorICAgIHJldHVybiBvdXQKKworCitkZWYgUHJpbnRCaXRNYXNrVG9TdHJpbmcoYiwgbmFtZSwgZ2VuKToKKyAgICBvdXQgPSAnJworICAgIG91dCArPSBBZGRHdWFyZEhlYWRlcihHZXRFeHRlbnNpb24oYi5uYW1lLCBnZW4pKQorICAgIG91dCArPSAic3RkOjpzdHJpbmcgIiArIG5hbWUgKyBcCisgICAgICAgICJTdHJpbmcoIiArIG5hbWUgKyAiIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7XG4iCisgICAgb3V0ICs9ICIgICAgc3RkOjpzdHJpbmcgb3V0O1xuIgorICAgIG91dCArPSAiICAgIGJvb2wgaXNfZmlyc3QgPSB0cnVlO1xuIgorICAgIGZvciB2IGluIGIub3B0aW9uczoKKyAgICAgICAgb3V0ICs9ICIgICAgaWYgKCIgKyBzdHIodi52YWx1ZSkgKyAiICYgdmFsdWUpIHtcbiIKKyAgICAgICAgb3V0ICs9ICIgICAgICAgIGlmIChpc19maXJzdCkgeyBpc19maXJzdCA9IGZhbHNlOyB9IGVsc2UgeyBvdXQgKz0gXCIgfCBcIjsgfVxuIgorICAgICAgICBvdXQgKz0gIiAgICAgICAgb3V0ICs9IFwiIiArIFwKKyAgICAgICAgICAgIHN0cih2Lm5hbWUpLnN0cmlwKCJWS18iKS5zdHJpcCgiX0JJVCIpICsgIlwiO1xuIgorICAgICAgICBvdXQgKz0gIiAgICB9XG4iCisgICAgb3V0ICs9ICIgICAgcmV0dXJuIG91dDtcbiIKKyAgICBvdXQgKz0gIn1cbiIKKyAgICBvdXQgKz0gQWRkR3VhcmRGb290ZXIoR2V0RXh0ZW5zaW9uKGIubmFtZSwgZ2VuKSkKKyAgICByZXR1cm4gb3V0CisKKworZGVmIFByaW50Rm9yd2FyZERlY2xhcmF0aW9uKHN0cnVjdCwgZ2VuKToKKyAgICBvdXQgPSAnJworICAgIG91dCArPSBBZGRHdWFyZEhlYWRlcihzdHJ1Y3QpCisgICAgb3V0ICs9ICJ2b2lkIER1bXAiICsgc3RydWN0Lm5hbWUgKyBcCisgICAgICAgICIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgIiArIHN0cnVjdC5uYW1lICsgIiAmb2JqKTtcbiIKKyAgICBvdXQgKz0gQWRkR3VhcmRGb290ZXIoc3RydWN0KQorCisgICAgcmV0dXJuIG91dAorCisKK2RlZiBQcmludFN0cnVjdHVyZShzdHJ1Y3QsIHN0cnVjdHVyZV9uYW1lcywgZ2VuKToKKyAgICBvdXQgPSAnJworICAgIG91dCArPSBBZGRHdWFyZEhlYWRlcihzdHJ1Y3QpCisgICAgbWF4X2tleV9sZW4gPSBsZW4oc3RydWN0Lm1lbWJlcnNbMF0ubmFtZSkKKyAgICBmb3IgdiBpbiBzdHJ1Y3QubWVtYmVyczoKKyAgICAgICAgaWYgdi5hcnJheUxlbmd0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbih2Lm5hbWUpICsgbGVuKHYuYXJyYXlMZW5ndGgpICsgMiA+IG1heF9rZXlfbGVuOgorICAgICAgICAgICAgICAgIG1heF9rZXlfbGVuID0gbGVuKHYubmFtZSkgKyBsZW4odi5hcnJheUxlbmd0aCkgKyAyCisgICAgICAgIGVsaWYgdi50eXBlSUQgaW4gcHJlZGVmaW5lZF90eXBlczoKKyAgICAgICAgICAgIGlmIGxlbih2Lm5hbWUpID4gbWF4X2tleV9sZW46CisgICAgICAgICAgICAgICAgbWF4X2tleV9sZW4gPSBsZW4odi5uYW1lKQorCisgICAgb3V0ICs9ICJ2b2lkIER1bXAiICsgc3RydWN0Lm5hbWUgKyBcCisgICAgICAgICIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgIiArIHN0cnVjdC5uYW1lICsgIiAmb2JqKSB7XG4iCisgICAgaWYgc3RydWN0Lm5hbWUgPT0gIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHMiOgorICAgICAgICBvdXQgKz0gIiAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbilcbiIKKyAgICAgICAgb3V0ICs9ICIgICAgICAgIHAuT2JqZWN0U3RhcnQoXCJsaW1pdHNcIik7XG4iCisgICAgICAgIG91dCArPSAiICAgIGVsc2VcbiIKKyAgICAgICAgb3V0ICs9ICIgICAgICAgIHAuU2V0U3ViSGVhZGVyKCkuT2JqZWN0U3RhcnQobmFtZSk7XG4iCisgICAgZWxpZiBzdHJ1Y3QubmFtZSA9PSAiVmtQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMiOgorICAgICAgICBvdXQgKz0gIiAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbilcbiIKKyAgICAgICAgb3V0ICs9ICIgICAgICAgIHAuT2JqZWN0U3RhcnQoXCJzcGFyc2VQcm9wZXJ0aWVzXCIpO1xuIgorICAgICAgICBvdXQgKz0gIiAgICBlbHNlXG4iCisgICAgICAgIG91dCArPSAiICAgICAgICBwLlNldFN1YkhlYWRlcigpLk9iamVjdFN0YXJ0KG5hbWUpO1xuIgorICAgIGVsc2U6CisgICAgICAgIG91dCArPSAiICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7XG4iCisKKyAgICBmb3IgdiBpbiBzdHJ1Y3QubWVtYmVyczoKKyAgICAgICAgIyBhcnJheXMKKyAgICAgICAgaWYgdi5hcnJheUxlbmd0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgc3RyaW5ncworICAgICAgICAgICAgaWYgdi50eXBlSUQgPT0gImNoYXIiOgorICAgICAgICAgICAgICAgIG91dCArPSAiICAgIHAuUHJpbnRLZXlTdHJpbmcoXCIiICsgdi5uYW1lICsgIlwiLCBvYmouIiArIFwKKyAgICAgICAgICAgICAgICAgICAgdi5uYW1lICsgIiwgIiArIHN0cihtYXhfa2V5X2xlbikgKyAiKTtcbiIKKyAgICAgICAgICAgICMgdXVpZCdzCisgICAgICAgICAgICBlbGlmICh2LmFycmF5TGVuZ3RoID09IHN0cigxNikgYW5kIHYudHlwZUlEID09ICJ1aW50OF90Iik6ICAjIFZLX1VVSURfU0laRQorICAgICAgICAgICAgICAgIG91dCArPSAiICAgIHAuUHJpbnRLZXlTdHJpbmcoXCIiICsgdi5uYW1lICsgIlwiLCB0b19zdHJpbmdfMTYob2JqLiIgKyBcCisgICAgICAgICAgICAgICAgICAgIHYubmFtZSArICIpLCAiICsgc3RyKG1heF9rZXlfbGVuKSArICIpO1xuIgorICAgICAgICAgICAgZWxpZiAodi5hcnJheUxlbmd0aCA9PSBzdHIoOCkgYW5kIHYudHlwZUlEID09ICJ1aW50OF90Iik6ICAjIFZLX0xVSURfU0laRQorICAgICAgICAgICAgICAgIG91dCArPSAiICAgIGlmIChvYmouZGV2aWNlTFVJRFZhbGlkKSIgICMgc3BlY2lhbCBjYXNlCisgICAgICAgICAgICAgICAgb3V0ICs9ICIgcC5QcmludEtleVN0cmluZyhcIiIgKyB2Lm5hbWUgKyAiXCIsIHRvX3N0cmluZ184KG9iai4iICsgXAorICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgKyAiKSwgIiArIHN0cihtYXhfa2V5X2xlbikgKyAiKTtcbiIKKyAgICAgICAgICAgIGVsaWYgdi5hcnJheUxlbmd0aC5pc2RpZ2l0KCk6CisgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgcC5BcnJheVN0YXJ0KFwiIiArIHYubmFtZSArIFwKKyAgICAgICAgICAgICAgICAgICAgIlwiLCAiK3YuYXJyYXlMZW5ndGgrIik7XG4iCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgaW50KHYuYXJyYXlMZW5ndGgpKToKKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgcC5QcmludEVsZW1lbnQob2JqLiIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgKyAiWyIgKyBzdHIoaSkgKyAiXSk7XG4iCisgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgcC5BcnJheUVuZCgpO1xuIgorICAgICAgICAgICAgZWxzZTogICMgZHluYW1pYyBhcnJheSBsZW5ndGggYmFzZWQgb24gb3RoZXIgbWVtYmVyCisgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgcC5BcnJheVN0YXJ0KFwiIiArIHYubmFtZSArIFwKKyAgICAgICAgICAgICAgICAgICAgIlwiLCBvYmouIit2LmFycmF5TGVuZ3RoKyIpO1xuIgorICAgICAgICAgICAgICAgIG91dCArPSAiICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBvYmouIiArIFwKKyAgICAgICAgICAgICAgICAgICAgdi5hcnJheUxlbmd0aCsiOyBpKyspIHtcbiIKKyAgICAgICAgICAgICAgICBpZiB2LnR5cGVJRCBpbiBzdHJ1Y3R1cmVfbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIG91dCArPSAiICAgICAgICBpZiAob2JqLiIgKyB2Lm5hbWUgKyAiICE9IG51bGxwdHIpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgICAgICAgICBwLlNldEVsZW1lbnRJbmRleChpKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgICAgICAgICBEdW1wIiArIHYudHlwZUlEICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIihwLCBcIiIgKyB2Lm5hbWUgKyAiXCIsIG9iai4iICsgdi5uYW1lICsgIltpXSk7XG4iCisgICAgICAgICAgICAgICAgICAgIG91dCArPSAiICAgICAgICB9XG4iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgICAgIHAuUHJpbnRFbGVtZW50KG9iai4iICsgdi5uYW1lICsgIltpXSk7XG4iCisgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgfVxuICAgIHAuQXJyYXlFbmQoKTtcbiIKKyAgICAgICAgZWxpZiB2LnR5cGVJRCA9PSAiVmtCb29sMzIiOgorICAgICAgICAgICAgb3V0ICs9ICIgICAgcC5QcmludEtleUJvb2woXCIiICsgdi5uYW1lICsgIlwiLCBzdGF0aWNfY2FzdDxib29sPihvYmouIiArIFwKKyAgICAgICAgICAgICAgICB2Lm5hbWUgKyAiKSwgIiArIHN0cihtYXhfa2V5X2xlbikgKyAiKTtcbiIKKyAgICAgICAgZWxpZiB2LnR5cGVJRCA9PSAiVmtEZXZpY2VTaXplIjoKKyAgICAgICAgICAgIG91dCArPSAiICAgIHAuUHJpbnRLZXlWYWx1ZShcIiIgKyB2Lm5hbWUgKyAiXCIsIHRvX2hleF9zdHIocCwgb2JqLiIgKyBcCisgICAgICAgICAgICAgICAgdi5uYW1lICsgIiksICIgKyBzdHIobWF4X2tleV9sZW4pICsgIik7XG4iCisgICAgICAgIGVsaWYgdi50eXBlSUQgaW4gcHJlZGVmaW5lZF90eXBlczoKKyAgICAgICAgICAgIG91dCArPSAiICAgIHAuUHJpbnRLZXlWYWx1ZShcIiIgKyB2Lm5hbWUgKyAiXCIsIG9iai4iICsgXAorICAgICAgICAgICAgICAgIHYubmFtZSArICIsICIgKyBzdHIobWF4X2tleV9sZW4pICsgIik7XG4iCisgICAgICAgIGVsaWYgdi5uYW1lIG5vdCBpbiBbJ3NUeXBlJywgJ3BOZXh0J106CisgICAgICAgICAgICBpZiB2LnR5cGVJRCBpbiBzdHJ1Y3R1cmVfbmFtZXM6CisgICAgICAgICAgICAgICAgb3V0ICs9ICIgICAgRHVtcCIgKyB2LnR5cGVJRCArIFwKKyAgICAgICAgICAgICAgICAgICAgIihwLCBcIiIgKyB2Lm5hbWUgKyAiXCIsIG9iai4iICsgdi5uYW1lICsgIik7XG4iCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dCArPSAiICAgIER1bXAiICsgdi50eXBlSUQgKyBcCisgICAgICAgICAgICAgICAgICAgICIocCwgXCIiICsgdi5uYW1lICsgIlwiLCBvYmouIiArIFwKKyAgICAgICAgICAgICAgICAgICAgdi5uYW1lICsgIiwgIiArIHN0cihtYXhfa2V5X2xlbikgKyAiKTtcbiIKKworICAgIG91dCArPSAiICAgIHAuT2JqZWN0RW5kKCk7XG4iCisgICAgb3V0ICs9ICJ9XG4iCisKKyAgICBvdXQgKz0gQWRkR3VhcmRGb290ZXIoc3RydWN0KQorICAgIHJldHVybiBvdXQKKworCitkZWYgUHJpbnRDaGFpbkJ1aWxkZXJzKGxpc3ROYW1lLCBzdHJ1Y3R1cmVzKToKKyAgICBvdXQgPSAnJworICAgIG91dCArPSAiICAgIGluZm9zLiIgKyBsaXN0TmFtZSArICIgPSB7XG4iCisgICAgZm9yIHMgaW4gc3RydWN0dXJlczoKKyAgICAgICAgb3V0ICs9IEFkZEd1YXJkSGVhZGVyKHMpCisgICAgICAgIGlmIHMuc1R5cGVOYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0ICs9ICIgICAgICAgIHsiICsgcy5zVHlwZU5hbWUgKyAiLCBzaXplb2YoIiArIHMubmFtZSArICIpfSxcbiIKKyAgICAgICAgb3V0ICs9IEFkZEd1YXJkRm9vdGVyKHMpCisgICAgb3V0ICs9ICIgICAgfTtcbiIKKyAgICByZXR1cm4gb3V0CisKKworZGVmIFByaW50Q2hhaW5JdGVyYXRvcihsaXN0TmFtZSwgc3RydWN0dXJlcywgY2hlY2tFeHRMb2MpOgorICAgIHNvcnRlZF9zdHJ1Y3R1cmVzID0gc29ydGVkKHN0cnVjdHVyZXMsIGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCJuYW1lIikpCisKKyAgICBvdXQgPSAnJworICAgIG91dCArPSAidm9pZCBjaGFpbl9pdGVyYXRvcl8iICsgbGlzdE5hbWUgKyAiKFByaW50ZXIgJnAsICIKKyAgICBpZiBjaGVja0V4dExvYyA9PSAiZGV2aWNlIjoKKyAgICAgICAgb3V0ICs9ICJBcHBHcHUgJmdwdSIKKyAgICBlbGlmIGNoZWNrRXh0TG9jID09ICJpbnN0YW5jZSI6CisgICAgICAgIG91dCArPSAiQXBwSW5zdGFuY2UgJmluc3QiCisgICAgZWxpZiBjaGVja0V4dExvYyA9PSAiYm90aCI6CisgICAgICAgIG91dCArPSAiQXBwSW5zdGFuY2UgJmluc3QsIEFwcEdwdSAmZ3B1IgorICAgIG91dCArPSAiLCB2b2lkICogcGxhY2UpIHtcbiIKKworICAgIG91dCArPSAiICAgIHdoaWxlIChwbGFjZSkge1xuIgorICAgIG91dCArPSAiICAgICAgICBzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgKnN0cnVjdHVyZSA9IChzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgKilwbGFjZTtcbiIKKyAgICBvdXQgKz0gIiAgICAgICAgcC5TZXRTdWJIZWFkZXIoKTtcbiIKKyAgICBmb3IgcyBpbiBzb3J0ZWRfc3RydWN0dXJlczoKKyAgICAgICAgb3V0ICs9IEFkZEd1YXJkSGVhZGVyKHMpCisgICAgICAgIGlmIHMuc1R5cGVOYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgcy5leHROYW1lU3RyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG91dCArPSAiICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSAiICsgXAorICAgICAgICAgICAgICAgICAgICBzLnNUeXBlTmFtZSArICIgJiZcbiIKKyAgICAgICAgICAgICAgICBpZiBzLmV4dFR5cGUgPT0gImRldmljZSI6CisgICAgICAgICAgICAgICAgICAgIG91dCArPSAiICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZCgiICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcy5leHROYW1lU3RyICsgIikpIHtcbiIKKyAgICAgICAgICAgICAgICBlbGlmIHMuZXh0VHlwZSA9PSAiaW5zdGFuY2UiOgorICAgICAgICAgICAgICAgICAgICBvdXQgKz0gIiAgICAgICAgICAgIGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKCIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBzLmV4dE5hbWVTdHIgKyAiKSkge1xuIgorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dCArPSAiICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSAiICsgXAorICAgICAgICAgICAgICAgICAgICBzLnNUeXBlTmFtZSArICIpIHtcbiIKKworICAgICAgICAgICAgb3V0ICs9ICIgICAgICAgICAgICAiICsgcy5uYW1lICsgIiogcHJvcHMgPSAiICsgXAorICAgICAgICAgICAgICAgICIoIitzLm5hbWUrIiopc3RydWN0dXJlO1xuIgorICAgICAgICAgICAgb3V0ICs9ICIgICAgICAgICAgICBEdW1wIiArIHMubmFtZSArIFwKKyAgICAgICAgICAgICAgICAiKHAsIFwiIiArIHMubmFtZSArICJcIiwgKnByb3BzKTtcbiIKKyAgICAgICAgICAgIG91dCArPSAiICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7XG4iCisgICAgICAgICAgICBvdXQgKz0gIiAgICAgICAgfVxuIgorICAgICAgICBvdXQgKz0gQWRkR3VhcmRGb290ZXIocykKKyAgICBvdXQgKz0gIiAgICAgICAgcGxhY2UgPSBzdHJ1Y3R1cmUtPnBOZXh0O1xuIgorICAgIG91dCArPSAiICAgIH1cbiIKKyAgICBvdXQgKz0gIn1cbiIKKyAgICByZXR1cm4gb3V0CisKKworZGVmIFByaW50U3RydWN0Q29tcGFyaXNvbkZvcndhcmREZWYoc3RydWN0dXJlKToKKyAgICBvdXQgPSAnJworICAgIG91dCArPSAiYm9vbCBvcGVyYXRvcj09KGNvbnN0ICIgKyBzdHJ1Y3R1cmUubmFtZSArIFwKKyAgICAgICAgIiAmIGEsIGNvbnN0ICIgKyBzdHJ1Y3R1cmUubmFtZSArICIgYik7XG4iCisgICAgcmV0dXJuIG91dAorCisKK2RlZiBQcmludFN0cnVjdENvbXBhcmlzb24oc3RydWN0dXJlKToKKyAgICBvdXQgPSAnJworICAgIG91dCArPSAiYm9vbCBvcGVyYXRvcj09KGNvbnN0ICIgKyBzdHJ1Y3R1cmUubmFtZSArIFwKKyAgICAgICAgIiAmIGEsIGNvbnN0ICIgKyBzdHJ1Y3R1cmUubmFtZSArICIgYikge1xuIgorICAgIG91dCArPSAiICAgIHJldHVybiAiCisgICAgaXNfZmlyc3QgPSBUcnVlCisgICAgZm9yIG0gaW4gc3RydWN0dXJlLm1lbWJlcnM6CisgICAgICAgIGlmIG0ubmFtZSBub3QgaW4gWydzVHlwZScsICdwTmV4dCddOgorICAgICAgICAgICAgaWYgbm90IGlzX2ZpcnN0OgorICAgICAgICAgICAgICAgIG91dCArPSAiXG4gICAgICAgICYmICIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaXNfZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgb3V0ICs9ICJhLiIgKyBtLm5hbWUgKyAiID09IGIuIiArIG0ubmFtZQorICAgIG91dCArPSAiO1xuIgorICAgIG91dCArPSAifVxuIgorICAgIHJldHVybiBvdXQKKworCitkZWYgaXNQb3cyKG51bSk6CisgICAgcmV0dXJuIG51bSAhPSAwIGFuZCAoKG51bSAmIChudW0gLSAxKSkgPT0gMCkKKworCitkZWYgU3RyVG9JbnQocyk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gaW50KHMpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHJldHVybiBpbnQocywgMTYpCisKKworY2xhc3MgVnVsa2FuRW51bToKKyAgICBjbGFzcyBPcHRpb246CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHZhbHVlLCBiaXRwb3MsIGNvbW1lbnQpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICAgICAgc2VsZi5jb21tZW50ID0gY29tbWVudAorICAgICAgICAgICAgc2VsZi5tdWx0aVZhbHVlID0gTm9uZQorCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKworICAgICAgICAgICAgICAgIHNlbGYubXVsdGlWYWx1ZSA9IG5vdCBpc1BvdzIoU3RyVG9JbnQodmFsdWUpKQorCisgICAgICAgICAgICBpZiB2YWx1ZSA9PSAwIG9yIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAxIDw8IGludChiaXRwb3MpCisKKyAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorCisgICAgICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICdvcHROYW1lJzogc2VsZi5uYW1lLAorICAgICAgICAgICAgICAgICdvcHRWYWx1ZSc6IHNlbGYudmFsdWUsCisgICAgICAgICAgICAgICAgJ29wdENvbW1lbnQnOiBzZWxmLmNvbW1lbnQsCisgICAgICAgICAgICAgICAgJ29wdE11bHRpVmFsdWUnOiBzZWxmLm11bHRpVmFsdWUsCisgICAgICAgICAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUpOgorICAgICAgICBzZWxmLm5hbWUgPSByb290Tm9kZS5nZXQoJ25hbWUnKQorICAgICAgICBzZWxmLnR5cGUgPSByb290Tm9kZS5nZXQoJ3R5cGUnKQorICAgICAgICBzZWxmLm9wdGlvbnMgPSBbXQorCisgICAgICAgIGZvciBjaGlsZCBpbiByb290Tm9kZToKKyAgICAgICAgICAgIGNoaWxkTmFtZSA9IGNoaWxkLmdldCgnbmFtZScpCisgICAgICAgICAgICBjaGlsZFZhbHVlID0gY2hpbGQuZ2V0KCd2YWx1ZScpCisgICAgICAgICAgICBjaGlsZEJpdHBvcyA9IGNoaWxkLmdldCgnYml0cG9zJykKKyAgICAgICAgICAgIGNoaWxkQ29tbWVudCA9IGNoaWxkLmdldCgnY29tbWVudCcpCisgICAgICAgICAgICBjaGlsZEV4dGVuZHMgPSBjaGlsZC5nZXQoJ2V4dGVuZHMnKQorICAgICAgICAgICAgY2hpbGRPZmZzZXQgPSBjaGlsZC5nZXQoJ29mZnNldCcpCisgICAgICAgICAgICBjaGlsZEV4dE51bSA9IGNoaWxkLmdldCgnZXh0bnVtYmVyJykKKyAgICAgICAgICAgIHN1cHBvcnQgPSBjaGlsZC5nZXQoJ3N1cHBvcnRlZCcpCisgICAgICAgICAgICBpZihzdXBwb3J0ID09ICJkaXNhYmxlZCIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGNoaWxkTmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiAoY2hpbGRWYWx1ZSBpcyBOb25lIGFuZCBjaGlsZEJpdHBvcyBpcyBOb25lIGFuZCBjaGlsZE9mZnNldCBpcyBOb25lKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjaGlsZEV4dGVuZHMgaXMgbm90IE5vbmUgYW5kIGNoaWxkRXh0TnVtIGlzIG5vdCBOb25lIGFuZCBjaGlsZE9mZnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlbnVtTmVnYXRpdmUgPSBGYWxzZQorICAgICAgICAgICAgICAgIGV4dE51bSA9IGludChjaGlsZEV4dE51bSkKKyAgICAgICAgICAgICAgICBleHRPZmZzZXQgPSBpbnQoY2hpbGRPZmZzZXQpCisgICAgICAgICAgICAgICAgZXh0QmFzZSA9IDEwMDAwMDAwMDAKKyAgICAgICAgICAgICAgICBleHRCbG9ja1NpemUgPSAxMDAwCisgICAgICAgICAgICAgICAgY2hpbGRWYWx1ZSA9IGV4dEJhc2UgKyAoZXh0TnVtIC0gMSkgKiBleHRCbG9ja1NpemUgKyBleHRPZmZzZXQKKyAgICAgICAgICAgICAgICBpZiAoJ2RpcicgaW4gY2hpbGQua2V5cygpKToKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRWYWx1ZSA9IC1jaGlsZFZhbHVlCisgICAgICAgICAgICBkdXBsaWNhdGUgPSBGYWxzZQorICAgICAgICAgICAgZm9yIG8gaW4gc2VsZi5vcHRpb25zOgorICAgICAgICAgICAgICAgIGlmIG8udmFsdWVzKClbJ29wdE5hbWUnXSA9PSBjaGlsZE5hbWU6CisgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZSA9IFRydWUKKyAgICAgICAgICAgIGlmIGR1cGxpY2F0ZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYXBwZW5kKFZ1bGthbkVudW0uT3B0aW9uKAorICAgICAgICAgICAgICAgIGNoaWxkTmFtZSwgY2hpbGRWYWx1ZSwgY2hpbGRCaXRwb3MsIGNoaWxkQ29tbWVudCkpCisKKworY2xhc3MgVnVsa2FuQml0bWFzazoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSk6CisgICAgICAgIHNlbGYubmFtZSA9IHJvb3ROb2RlLmdldCgnbmFtZScpCisgICAgICAgIHNlbGYudHlwZSA9IHJvb3ROb2RlLmdldCgndHlwZScpCisKKyAgICAgICAgIyBSZWFkIGVhY2ggdmFsdWUgdGhhdCB0aGUgZW51bSBjb250YWlucworICAgICAgICBzZWxmLm9wdGlvbnMgPSBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gcm9vdE5vZGU6CisgICAgICAgICAgICBjaGlsZE5hbWUgPSBjaGlsZC5nZXQoJ25hbWUnKQorICAgICAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkLmdldCgndmFsdWUnKQorICAgICAgICAgICAgY2hpbGRCaXRwb3MgPSBjaGlsZC5nZXQoJ2JpdHBvcycpCisgICAgICAgICAgICBjaGlsZENvbW1lbnQgPSBjaGlsZC5nZXQoJ2NvbW1lbnQnKQorICAgICAgICAgICAgc3VwcG9ydCA9IGNoaWxkLmdldCgnc3VwcG9ydGVkJykKKyAgICAgICAgICAgIGlmIGNoaWxkTmFtZSBpcyBOb25lIG9yIChjaGlsZFZhbHVlIGlzIE5vbmUgYW5kIGNoaWxkQml0cG9zIGlzIE5vbmUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZihzdXBwb3J0ID09ICJkaXNhYmxlZCIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hcHBlbmQoVnVsa2FuRW51bS5PcHRpb24oCisgICAgICAgICAgICAgICAgY2hpbGROYW1lLCBjaGlsZFZhbHVlLCBjaGlsZEJpdHBvcywgY2hpbGRDb21tZW50KSkKKworCitjbGFzcyBWdWxrYW5GbGFnczoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSk6CisgICAgICAgIHNlbGYubmFtZSA9IHJvb3ROb2RlLmdldCgnbmFtZScpCisgICAgICAgIHNlbGYudHlwZSA9IHJvb3ROb2RlLmdldCgndHlwZScpCisgICAgICAgIHNlbGYuZW51bSA9IHJvb3ROb2RlLmdldCgncmVxdWlyZXMnKQorCisKK2NsYXNzIFZ1bGthblZhcmlhYmxlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSwgY29uc3RhbnRzLCBwYXJlbnROYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gcm9vdE5vZGUuZmluZCgnbmFtZScpLnRleHQKKyAgICAgICAgIyBUeXBlbmFtZSwgZGVyZWZlcmVuY2VkIGFuZCBjb252ZXJ0ZWQgdG8gYSB1c2VhYmxlIEMrKyB0b2tlbgorICAgICAgICBzZWxmLnR5cGVJRCA9IHJvb3ROb2RlLmZpbmQoJ3R5cGUnKS50ZXh0CisgICAgICAgIHNlbGYuYmFzZVR5cGUgPSBzZWxmLnR5cGVJRAorICAgICAgICBzZWxmLmNoaWxkVHlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5hcnJheUxlbmd0aCA9IE5vbmUKKworICAgICAgICBzZWxmLnRleHQgPSAnJworICAgICAgICBmb3Igbm9kZSBpbiByb290Tm9kZS5pdGVydGV4dCgpOgorICAgICAgICAgICAgY29tbWVudCA9IHJvb3ROb2RlLmZpbmQoJ2NvbW1lbnQnKQorICAgICAgICAgICAgaWYgY29tbWVudCBpcyBub3QgTm9uZSBhbmQgY29tbWVudC50ZXh0ID09IG5vZGU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYudGV4dCArPSBub2RlCisKKyAgICAgICAgdHlwZU1hdGNoID0gcmUuc2VhcmNoKCcuKz8oPz0nICsgc2VsZi5uYW1lICsgJyknLCBzZWxmLnRleHQpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGVNYXRjaC5zdHJpbmdbdHlwZU1hdGNoLnN0YXJ0KCk6dHlwZU1hdGNoLmVuZCgpXQorICAgICAgICBzZWxmLnR5cGUgPSAnICcuam9pbihzZWxmLnR5cGUuc3BsaXQoKSkKKyAgICAgICAgYnJhY2tldE1hdGNoID0gcmUuc2VhcmNoKCcoPzw9XFxbKVthLXpBLVowLTlfXSsoPz1cXF0pJywgc2VsZi50ZXh0KQorICAgICAgICBpZiBicmFja2V0TWF0Y2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBtYXRjaFRleHQgPSBicmFja2V0TWF0Y2guc3RyaW5nW2JyYWNrZXRNYXRjaC5zdGFydCgKKyAgICAgICAgICAgICk6YnJhY2tldE1hdGNoLmVuZCgpXQorICAgICAgICAgICAgc2VsZi5jaGlsZFR5cGUgPSBzZWxmLnR5cGUKKyAgICAgICAgICAgIHNlbGYudHlwZSArPSAnWycgKyBtYXRjaFRleHQgKyAnXScKKyAgICAgICAgICAgIGlmIG1hdGNoVGV4dCBpbiBjb25zdGFudHM6CisgICAgICAgICAgICAgICAgc2VsZi5hcnJheUxlbmd0aCA9IGNvbnN0YW50c1ttYXRjaFRleHRdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXJyYXlMZW5ndGggPSBtYXRjaFRleHQKKworICAgICAgICBzZWxmLmxlbmd0aE1lbWJlciA9IEZhbHNlCisgICAgICAgIGxlbmd0aFN0cmluZyA9IHJvb3ROb2RlLmdldCgnbGVuJykKKyAgICAgICAgbGVuZ3RocyA9IFtdCisgICAgICAgIGlmIGxlbmd0aFN0cmluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxlbmd0aHMgPSByZS5zcGxpdCgnLCcsIGxlbmd0aFN0cmluZykKKyAgICAgICAgICAgIGxlbmd0aHMgPSBsaXN0KGZpbHRlcigoJ251bGwtdGVybWluYXRlZCcpLl9fbmVfXywgbGVuZ3RocykpCisgICAgICAgIGFzc2VydChsZW4obGVuZ3RocykgPD0gMSkKKyAgICAgICAgaWYgc2VsZi5hcnJheUxlbmd0aCBpcyBOb25lIGFuZCBsZW4obGVuZ3RocykgPiAwOgorICAgICAgICAgICAgc2VsZi5jaGlsZFR5cGUgPSAnKicuam9pbihzZWxmLnR5cGUuc3BsaXQoJyonKVswOi0xXSkKKyAgICAgICAgICAgIHNlbGYuYXJyYXlMZW5ndGggPSBsZW5ndGhzWzBdCisgICAgICAgICAgICBzZWxmLmxlbmd0aE1lbWJlciA9IFRydWUKKyAgICAgICAgaWYgc2VsZi5hcnJheUxlbmd0aCBpcyBub3QgTm9uZSBhbmQgc2VsZi5hcnJheUxlbmd0aC5zdGFydHN3aXRoKCdsYXRleG1hdGgnKToKKyAgICAgICAgICAgIGNvZGUgPSBzZWxmLmFycmF5TGVuZ3RoWzEwOmxlbihzZWxmLmFycmF5TGVuZ3RoKV0KKyAgICAgICAgICAgIGNvZGUgPSByZS5zdWIoJ1xcWycsICcnLCBjb2RlKQorICAgICAgICAgICAgY29kZSA9IHJlLnN1YignXFxdJywgJycsIGNvZGUpCisgICAgICAgICAgICBjb2RlID0gcmUuc3ViKCdcXFxcKGxjZWlsfHJjZWlsKScsICcnLCBjb2RlKQorICAgICAgICAgICAgY29kZSA9IHJlLnN1Yigne3x9JywgJycsIGNvZGUpCisgICAgICAgICAgICBjb2RlID0gcmUuc3ViKCdcXFxcbWF0aGl0JywgJycsIGNvZGUpCisgICAgICAgICAgICBjb2RlID0gcmUuc3ViKCdcXFxcb3ZlcicsICcvJywgY29kZSkKKyAgICAgICAgICAgIGNvZGUgPSByZS5zdWIoJ1xcXFx0ZXh0cm0nLCAnJywgY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXJyYXlMZW5ndGggPSBjb2RlCisKKyAgICAgICAgIyBEZXJlZmVyZW5jZSBpZiBuZWNlc3NhcnkgYW5kIGhhbmRsZSBtZW1iZXJzIG9mIHZhcmlhYmxlcworICAgICAgICBpZiBzZWxmLmFycmF5TGVuZ3RoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hcnJheUxlbmd0aCA9IHJlLnN1YignOjonLCAnLT4nLCBzZWxmLmFycmF5TGVuZ3RoKQorICAgICAgICAgICAgc2VjdGlvbnMgPSBzZWxmLmFycmF5TGVuZ3RoLnNwbGl0KCctPicpCisgICAgICAgICAgICBpZiBzZWN0aW9uc1stMV1bMF0gPT0gJ3AnIGFuZCBzZWN0aW9uc1swXVsxXS5pc3VwcGVyKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hcnJheUxlbmd0aCA9ICcqJyArIHNlbGYuYXJyYXlMZW5ndGgKKworCitjbGFzcyBWdWxrYW5TdHJ1Y3R1cmU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHJvb3ROb2RlLCBjb25zdGFudHMsIGV4dFR5cGVzKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLm1lbWJlcnMgPSBbXQorICAgICAgICBzZWxmLmd1YXJkID0gTm9uZQorICAgICAgICBzZWxmLnNUeXBlTmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5leHROYW1lU3RyID0gTm9uZQorICAgICAgICBzZWxmLmV4dFR5cGUgPSBOb25lCisgICAgICAgIGZvciBub2RlIGluIHJvb3ROb2RlLmZpbmRhbGwoJ21lbWJlcicpOgorICAgICAgICAgICAgaWYobm9kZS5nZXQoJ3ZhbHVlcycpIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICBzZWxmLnNUeXBlTmFtZSA9IG5vZGUuZ2V0KCd2YWx1ZXMnKQorICAgICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZChWdWxrYW5WYXJpYWJsZSgKKyAgICAgICAgICAgICAgICBub2RlLCBjb25zdGFudHMsIHNlbGYubmFtZSkpCisKKyAgICAgICAgZm9yIGssIGUgaW4gZXh0VHlwZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGsgPT0gc2VsZi5uYW1lOgorICAgICAgICAgICAgICAgIGlmIGUuZ3VhcmQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ3VhcmQgPSBlLmd1YXJkCisgICAgICAgICAgICAgICAgaWYgZS5leHROYW1lU3RyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmV4dE5hbWVTdHIgPSBlLmV4dE5hbWVTdHIKKyAgICAgICAgICAgICAgICBpZiBlLnR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXh0VHlwZSA9IGUudHlwZQorCisKK2NsYXNzIFZ1bGthbkV4dGVuc2lvbjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUpOgorICAgICAgICBzZWxmLm5hbWUgPSByb290Tm9kZS5nZXQoJ25hbWUnKQorICAgICAgICBzZWxmLm51bWJlciA9IGludChyb290Tm9kZS5nZXQoJ251bWJlcicpKQorICAgICAgICBzZWxmLnR5cGUgPSByb290Tm9kZS5nZXQoJ3R5cGUnKQorICAgICAgICBzZWxmLmRlcGVuZGVuY3kgPSByb290Tm9kZS5nZXQoJ3JlcXVpcmVzJykKKyAgICAgICAgc2VsZi5ndWFyZCA9IEdldEZlYXR1cmVQcm90ZWN0KHJvb3ROb2RlKQorICAgICAgICBzZWxmLnN1cHBvcnRlZCA9IHJvb3ROb2RlLmdldCgnc3VwcG9ydGVkJykKKyAgICAgICAgc2VsZi5leHROYW1lU3RyID0gTm9uZQorICAgICAgICBzZWxmLnZrdHlwZXMgPSBbXQorICAgICAgICBzZWxmLnZrZnVuY3MgPSBbXQorICAgICAgICBzZWxmLmNvbnN0YW50cyA9IHt9CisgICAgICAgIHNlbGYuZW51bVZhbHVlcyA9IHt9CisKKyAgICAgICAgZm9yIHJlcSBpbiByb290Tm9kZS5maW5kYWxsKCdyZXF1aXJlJyk6CisgICAgICAgICAgICBmb3IgdHkgaW4gcmVxLmZpbmRhbGwoJ3R5cGUnKToKKyAgICAgICAgICAgICAgICBzZWxmLnZrdHlwZXMuYXBwZW5kKHR5LmdldCgnbmFtZScpKQorCisgICAgICAgICAgICBmb3IgZnVuYyBpbiByZXEuZmluZGFsbCgnY29tbWFuZCcpOgorICAgICAgICAgICAgICAgIHNlbGYudmtmdW5jcy5hcHBlbmQoZnVuYy5nZXQoJ25hbWUnKSkKKworICAgICAgICAgICAgZm9yIGVudW0gaW4gcmVxLmZpbmRhbGwoJ2VudW0nKToKKyAgICAgICAgICAgICAgICBiYXNlID0gZW51bS5nZXQoJ2V4dGVuZHMnKQorICAgICAgICAgICAgICAgIG5hbWUgPSBlbnVtLmdldCgnbmFtZScpCisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnVtLmdldCgndmFsdWUnKQorICAgICAgICAgICAgICAgIGJpdHBvcyA9IGVudW0uZ2V0KCdiaXRwb3MnKQorICAgICAgICAgICAgICAgIG9mZnNldCA9IGVudW0uZ2V0KCdvZmZzZXQnKQorICAgICAgICAgICAgICAgICMgZ2V0cyB0aGUgVktfWFhYX0VYVEVOU0lPTl9OQU1FIHN0cmluZworICAgICAgICAgICAgICAgIGlmIHZhbHVlID09ICJcIiIgKyBzZWxmLm5hbWUgKyAiXCIiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmV4dE5hbWVTdHIgPSBuYW1lCisKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lIGFuZCBiaXRwb3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMSA8PCBpbnQoYml0cG9zKQorCisgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBpbnQob2Zmc2V0KQorICAgICAgICAgICAgICAgIGlmIGJhc2UgaXMgbm90IE5vbmUgYW5kIG9mZnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlID0gMTAwMDAwMDAwMCArIDEwMDAqKHNlbGYubnVtYmVyIC0gMSkgKyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgZW51bS5nZXQoJ2RpcicpID09ICctJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZSA9IC1lbnVtVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnVtVmFsdWVzW2Jhc2VdID0gKG5hbWUsIGVudW1WYWx1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnN0YW50c1tuYW1lXSA9IHZhbHVlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy92dWxrYW5pbmZvL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDc3NmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzMSBAQAorIyB+fn4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIH5+fgorCisjIENNYWtlTGlzdHMudHh0IGZpbGUgZm9yIGJ1aWxkaW5nIFZ1bGthbmluZm8KKworZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCAzIFFVSUVUKQorc2V0IChQWVRIT05fQ01EICR7UFlUSE9OX0VYRUNVVEFCTEV9KQorCitzZXQoVktJTkZPX0RJUiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCitzZXQoS1ZVTEtBTlRPT0xTX1NDUklQVFNfRElSICR7Q01BS0VfU09VUkNFX0RJUn0vc2NyaXB0cykKKworaWYoUFlUSE9OSU5URVJQX0ZPVU5EKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KGdlbmVyYXRlX3Z1bGthbmluZm9faHBwCisgICAgICAgIENPTU1BTkQgJHtQWVRIT05fQ01EfSAke0tWVUxLQU5UT09MU19TQ1JJUFRTX0RJUn0va3Z0X2dlbnZrLnB5IC1yZWdpc3RyeSAke1Z1bGthblJlZ2lzdHJ5X0RJUn0vdmsueG1sIC1zY3JpcHRzICR7VnVsa2FuUmVnaXN0cnlfRElSfSB2dWxrYW5pbmZvLmhwcAorICAgICAgICBERVBFTkRTICR7VnVsa2FuUmVnaXN0cnlfRElSfS92ay54bWwgJHtWdWxrYW5SZWdpc3RyeV9ESVJ9L2dlbmVyYXRvci5weSAke0tWVUxLQU5UT09MU19TQ1JJUFRTX0RJUn0vdnVsa2FuaW5mb19nZW5lcmF0b3IucHkgJHtLVlVMS0FOVE9PTFNfU0NSSVBUU19ESVJ9L2t2dF9nZW52ay5weSAke1Z1bGthblJlZ2lzdHJ5X0RJUn0vcmVnLnB5CisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7UFJPSkVDVF9TT1VSQ0VfRElSfS92dWxrYW5pbmZvL2dlbmVyYXRlZAorICAgICAgICApCisgICAgZWxzZSgpCisgICAgICAgIG1lc3NhZ2UoIldBUk5JTkc6IGdlbmVyYXRlX3Z1bGthbmluZm9faHBwIHRhcmdldCByZXF1aXJlcyBweXRob24gMyIpCitlbmRpZigpCisKK2lmKFdJTjMyKQorICAgIGFkZF9leGVjdXRhYmxlKHZ1bGthbmluZm8gdnVsa2FuaW5mby5jcHAgdnVsa2FuaW5mby5yYykKK2Vsc2VpZihBUFBMRSkKKyAgICBhZGRfZXhlY3V0YWJsZSh2dWxrYW5pbmZvCisgICAgICAgICAgICAgICAgICAgdnVsa2FuaW5mby5jcHAKKyAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvdnVsa2FuaW5mby9tZXRhbF92aWV3Lm1tCisgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL3Z1bGthbmluZm8vbWV0YWxfdmlldy5oKQorZWxzZSgpCisgICAgYWRkX2V4ZWN1dGFibGUodnVsa2FuaW5mbyB2dWxrYW5pbmZvLmNwcCkKK2VuZGlmKCkKKwordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXModnVsa2FuaW5mbyBQUklWQVRFICR7Q01BS0VfU09VUkNFX0RJUn0vdnVsa2FuaW5mbykKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKHZ1bGthbmluZm8gUFJJVkFURSAke0NNQUtFX1NPVVJDRV9ESVJ9L3Z1bGthbmluZm8vZ2VuZXJhdGVkKQorCitpZihVTklYIEFORCBOT1QgQVBQTEUpICMgaS5lLiBMaW51eAorICAgIGluY2x1ZGUoRmluZFBrZ0NvbmZpZykKKyAgICBvcHRpb24oQlVJTERfV1NJX1hDQl9TVVBQT1JUICJCdWlsZCBYQ0IgV1NJIHN1cHBvcnQiIE9OKQorICAgIG9wdGlvbihCVUlMRF9XU0lfWExJQl9TVVBQT1JUICJCdWlsZCBYbGliIFdTSSBzdXBwb3J0IiBPTikKKyAgICBvcHRpb24oQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCAiQnVpbGQgV2F5bGFuZCBXU0kgc3VwcG9ydCIgT04pCisKKyAgICBpZihCVUlMRF9XU0lfWENCX1NVUFBPUlQpCisgICAgICAgIGZpbmRfcGFja2FnZShYQ0IgUkVRVUlSRUQpCisgICAgICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKHZ1bGthbmluZm8gUFJJVkFURSAke1hDQl9JTkNMVURFX0RJUlN9KQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXModnVsa2FuaW5mbyAke1hDQl9MSUJSQVJJRVN9KQorICAgICAgICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyh2dWxrYW5pbmZvIFBSSVZBVEUgLURWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICBlbmRpZigpCisKKyAgICBpZihCVUlMRF9XU0lfWExJQl9TVVBQT1JUKQorICAgICAgICBmaW5kX3BhY2thZ2UoWDExIFJFUVVJUkVEKQorICAgICAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllcyh2dWxrYW5pbmZvIFBSSVZBVEUgJHtYMTFfSU5DTFVERV9ESVJ9KQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXModnVsa2FuaW5mbyAke1gxMV9MSUJSQVJJRVN9KQorICAgICAgICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyh2dWxrYW5pbmZvIFBSSVZBVEUgLURWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpCisgICAgZW5kaWYoKQorCisgICAgaWYoQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCkKKyAgICAgICAgZmluZF9wYWNrYWdlKFdheWxhbmQgUkVRVUlSRUQpCisgICAgICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKHZ1bGthbmluZm8gUFJJVkFURSAke1dBWUxBTkRfQ0xJRU5UX0lOQ0xVREVfRElSfSkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHZ1bGthbmluZm8gJHtXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVN9KQorICAgICAgICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyh2dWxrYW5pbmZvIFBSSVZBVEUgLURWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZihBUFBMRSkKKyAgICAjIFdlIGRvIHRoaXMgc28gdnVsa2FuaW5mbyBpcyBsaW5rZWQgdG8gYW4gaW5kaXZpZHVhbCBsaWJyYXJ5IGFuZCBOT1QgYSBmcmFtZXdvcmsuCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHZ1bGthbmluZm8gJHtWdWxrYW5fTElCUkFSWX0gIi1mcmFtZXdvcmsgQXBwS2l0IC1mcmFtZXdvcmsgUXVhcnR6Q29yZSIpCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXModnVsa2FuaW5mbyBQUklWQVRFICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYWNPUy92dWxrYW5pbmZvICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0pCitlbHNlKCkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModnVsa2FuaW5mbyBWdWxrYW46OlZ1bGthbikKK2VuZGlmKCkKKworIyBDcmVhdGUgdnVsa2FuaW5mbyBhcHBsaWNhdGlvbiBidW5kbGUgZm9yIE1hY09TCitpZihBUFBMRSkKKyAgICBpbmNsdWRlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYWNPUy92dWxrYW5pbmZvLmNtYWtlKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyh2dWxrYW5pbmZvIFBVQkxJQyAtRFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgLURXSU4zMl9MRUFOX0FORF9NRUFOIC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MpCisgICAgaWYoTk9UIE1TVkNfVkVSU0lPTiBMRVNTIDE5MDApCisgICAgICAgICMgRW5hYmxlIGNvbnRyb2wgZmxvdyBndWFyZAorICAgICAgICBtZXNzYWdlKFNUQVRVUyAiQnVpbGRpbmcgdnVsa2FuaW5mbyB3aXRoIGNvbnRyb2wgZmxvdyBndWFyZCIpCisgICAgICAgIGFkZF9jb21waWxlX29wdGlvbnMoIiQ8JDxDWFhfQ09NUElMRVJfSUQ6TVNWQz46L2d1YXJkOmNmPiIpCisgICAgICAgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1N9IC9ndWFyZDpjZiIpCisgICAgICAgIHNldChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICIke0NNQUtFX0VYRV9MSU5LRVJfRkxBR1N9IC9ndWFyZDpjZiIpCisgICAgZW5kaWYoKQorCisgICAgIyBVc2Ugc3RhdGljIE1TVkNSVCBsaWJyYXJpZXMKKyAgICBmb3JlYWNoKGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGluCisgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX0RFQlVHCisgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX01JTlNJWkVSRUwKKyAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMRUFTRQorICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19SRUxXSVRIREVCSU5GTworICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHCisgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTAorICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTykKKyAgICAgICAgaWYoJHtjb25maWd1cmF0aW9ufSBNQVRDSEVTICIvTUQiKQorICAgICAgICAgICAgc3RyaW5nKFJFR0VYCisgICAgICAgICAgICAgICAgICAgUkVQTEFDRSAiL01EIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9NVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29uZmlndXJhdGlvbn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIkeyR7Y29uZmlndXJhdGlvbn19IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorCisgICAgZmlsZShDT1BZIHZ1bGthbmluZm8udmN4cHJvai51c2VyIERFU1RJTkFUSU9OICR7Q01BS0VfQklOQVJZX0RJUn0vdnVsa2FuaW5mbykKK2Vsc2VpZihBUFBMRSkKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLIC1EVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkKK2VuZGlmKCkKKworaWYoQVBQTEUpCisgICAgaW5zdGFsbChUQVJHRVRTIHZ1bGthbmluZm8gUlVOVElNRSBERVNUSU5BVElPTiAidnVsa2FuaW5mbyIpCitlbHNlKCkKKyAgICBpbnN0YWxsKFRBUkdFVFMgdnVsa2FuaW5mbyBSVU5USU1FIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9CSU5ESVJ9KQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy92dWxrYW5pbmZvL2dlbmVyYXRlZC8uY2xhbmctZm9ybWF0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9nZW5lcmF0ZWQvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmI5ODNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9nZW5lcmF0ZWQvLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDUgQEAKKy0tLQorIyBEaXNhYmxlIGNsYW5nLWZvcm1hdCBmb3IgZ2VuZXJhdGVkIGNvZGUKK0Rpc2FibGVGb3JtYXQ6IHRydWUKK1NvcnRJbmNsdWRlczogZmFsc2UKKy4uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9nZW5lcmF0ZWQvdnVsa2FuaW5mby5ocHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy92dWxrYW5pbmZvL2dlbmVyYXRlZC92dWxrYW5pbmZvLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY2MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9nZW5lcmF0ZWQvdnVsa2FuaW5mby5ocHAKQEAgLTAsMCArMSwyMjQzIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGFybGVzIEdpZXNzZW4gPGNoYXJsZXNAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBWdWxrYW4gWE1MIEFQSSBSZWdpc3RyeS4KKyAqLworCisjaW5jbHVkZSAidnVsa2FuaW5mby5oIgorI2luY2x1ZGUgIm91dHB1dHByaW50ZXIuaCIKKworc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmbywgVmtDb25mb3JtYW5jZVZlcnNpb25LSFIgJmMpIHsKKyAgICByZXR1cm4gbyA8PCBzdGQ6OnRvX3N0cmluZyhjLm1ham9yKSA8PCAiLiIgPDwgc3RkOjp0b19zdHJpbmcoYy5taW5vcikgPDwgIi4iIDw8IHN0ZDo6dG9fc3RyaW5nKGMuc3VibWlub3IpIDw8ICIuIgorICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGMucGF0Y2gpOworfQorCitzdGQ6OnN0cmluZyBWa0V4dGVudDNEU3RyaW5nKFZrRXh0ZW50M0QgZSkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiKCIpICsgc3RkOjp0b19zdHJpbmcoZS53aWR0aCkgKyAiLCAiICsgc3RkOjp0b19zdHJpbmcoZS5oZWlnaHQpICsgIiwgIiArIHN0ZDo6dG9fc3RyaW5nKGUuZGVwdGgpICsgIikiOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX2hleF9zdHIoVCBpKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIHN0cmVhbSA8PCAiMHgiIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyhzaXplb2YoVCkpIDw8IHN0ZDo6aGV4IDw8IGk7CisgICAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19oZXhfc3RyKFByaW50ZXIgJnAsIFQgaSkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKQorICAgICAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoaSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdG9faGV4X3N0cihpKTsKK30KK3N0YXRpYyBjb25zdCBjaGFyICpWa0NvbG9yU3BhY2VLSFJTdHJpbmcoVmtDb2xvclNwYWNlS0hSIHZhbHVlKSB7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlICgwKTogcmV0dXJuICJDT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFIiOworICAgICAgICBjYXNlICgxMDAwMTA0MDAxKTogcmV0dXJuICJDT0xPUl9TUEFDRV9ESVNQTEFZX1AzX05PTkxJTkVBUl9FWFQiOworICAgICAgICBjYXNlICgxMDAwMTA0MDAyKTogcmV0dXJuICJDT0xPUl9TUEFDRV9FWFRFTkRFRF9TUkdCX0xJTkVBUl9FWFQiOworICAgICAgICBjYXNlICgxMDAwMTA0MDAzKTogcmV0dXJuICJDT0xPUl9TUEFDRV9ESVNQTEFZX1AzX0xJTkVBUl9FWFQiOworICAgICAgICBjYXNlICgxMDAwMTA0MDA0KTogcmV0dXJuICJDT0xPUl9TUEFDRV9EQ0lfUDNfTk9OTElORUFSX0VYVCI7CisgICAgICAgIGNhc2UgKDEwMDAxMDQwMDUpOiByZXR1cm4gIkNPTE9SX1NQQUNFX0JUNzA5X0xJTkVBUl9FWFQiOworICAgICAgICBjYXNlICgxMDAwMTA0MDA2KTogcmV0dXJuICJDT0xPUl9TUEFDRV9CVDcwOV9OT05MSU5FQVJfRVhUIjsKKyAgICAgICAgY2FzZSAoMTAwMDEwNDAwNyk6IHJldHVybiAiQ09MT1JfU1BBQ0VfQlQyMDIwX0xJTkVBUl9FWFQiOworICAgICAgICBjYXNlICgxMDAwMTA0MDA4KTogcmV0dXJuICJDT0xPUl9TUEFDRV9IRFIxMF9TVDIwODRfRVhUIjsKKyAgICAgICAgY2FzZSAoMTAwMDEwNDAwOSk6IHJldHVybiAiQ09MT1JfU1BBQ0VfRE9MQllWSVNJT05fRVhUIjsKKyAgICAgICAgY2FzZSAoMTAwMDEwNDAxMCk6IHJldHVybiAiQ09MT1JfU1BBQ0VfSERSMTBfSExHX0VYVCI7CisgICAgICAgIGNhc2UgKDEwMDAxMDQwMTEpOiByZXR1cm4gIkNPTE9SX1NQQUNFX0FET0JFUkdCX0xJTkVBUl9FWFQiOworICAgICAgICBjYXNlICgxMDAwMTA0MDEyKTogcmV0dXJuICJDT0xPUl9TUEFDRV9BRE9CRVJHQl9OT05MSU5FQVJfRVhUIjsKKyAgICAgICAgY2FzZSAoMTAwMDEwNDAxMyk6IHJldHVybiAiQ09MT1JfU1BBQ0VfUEFTU19USFJPVUdIX0VYVCI7CisgICAgICAgIGNhc2UgKDEwMDAxMDQwMTQpOiByZXR1cm4gIkNPTE9SX1NQQUNFX0VYVEVOREVEX1NSR0JfTk9OTElORUFSX0VYVCI7CisgICAgICAgIGNhc2UgKDEwMDAyMTMwMDApOiByZXR1cm4gIkNPTE9SX1NQQUNFX0RJU1BMQVlfTkFUSVZFX0FNRCI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTl9Wa0NvbG9yU3BhY2VLSFIiOworICAgIH0KK30KK3ZvaWQgRHVtcFZrQ29sb3JTcGFjZUtIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0NvbG9yU3BhY2VLSFIgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUsIHdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIHAuUHJpbnRLZXlWYWx1ZShuYW1lLCBWa0NvbG9yU3BhY2VLSFJTdHJpbmcodmFsdWUpLCB3aWR0aCk7CisgICAgfQorfQorc3RhdGljIGNvbnN0IGNoYXIgKlZrRHJpdmVySWRLSFJTdHJpbmcoVmtEcml2ZXJJZEtIUiB2YWx1ZSkgeworICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgY2FzZSAoMSk6IHJldHVybiAiRFJJVkVSX0lEX0FNRF9QUk9QUklFVEFSWV9LSFIiOworICAgICAgICBjYXNlICgyKTogcmV0dXJuICJEUklWRVJfSURfQU1EX09QRU5fU09VUkNFX0tIUiI7CisgICAgICAgIGNhc2UgKDMpOiByZXR1cm4gIkRSSVZFUl9JRF9NRVNBX1JBRFZfS0hSIjsKKyAgICAgICAgY2FzZSAoNCk6IHJldHVybiAiRFJJVkVSX0lEX05WSURJQV9QUk9QUklFVEFSWV9LSFIiOworICAgICAgICBjYXNlICg1KTogcmV0dXJuICJEUklWRVJfSURfSU5URUxfUFJPUFJJRVRBUllfV0lORE9XU19LSFIiOworICAgICAgICBjYXNlICg2KTogcmV0dXJuICJEUklWRVJfSURfSU5URUxfT1BFTl9TT1VSQ0VfTUVTQV9LSFIiOworICAgICAgICBjYXNlICg3KTogcmV0dXJuICJEUklWRVJfSURfSU1BR0lOQVRJT05fUFJPUFJJRVRBUllfS0hSIjsKKyAgICAgICAgY2FzZSAoOCk6IHJldHVybiAiRFJJVkVSX0lEX1FVQUxDT01NX1BST1BSSUVUQVJZX0tIUiI7CisgICAgICAgIGNhc2UgKDkpOiByZXR1cm4gIkRSSVZFUl9JRF9BUk1fUFJPUFJJRVRBUllfS0hSIjsKKyAgICAgICAgY2FzZSAoMTApOiByZXR1cm4gIkRSSVZFUl9JRF9HT09HTEVfU1dJRlRTSEFERVJfS0hSIjsKKyAgICAgICAgY2FzZSAoMTEpOiByZXR1cm4gIkRSSVZFUl9JRF9HR1BfUFJPUFJJRVRBUllfS0hSIjsKKyAgICAgICAgY2FzZSAoMTIpOiByZXR1cm4gIkRSSVZFUl9JRF9CUk9BRENPTV9QUk9QUklFVEFSWV9LSFIiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV05fVmtEcml2ZXJJZEtIUiI7CisgICAgfQorfQordm9pZCBEdW1wVmtEcml2ZXJJZEtIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0RyaXZlcklkS0hSIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlLCB3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBwLlByaW50S2V5VmFsdWUobmFtZSwgVmtEcml2ZXJJZEtIUlN0cmluZyh2YWx1ZSksIHdpZHRoKTsKKyAgICB9Cit9CitzdGF0aWMgY29uc3QgY2hhciAqVmtGb3JtYXRTdHJpbmcoVmtGb3JtYXQgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgIGNhc2UgKDApOiByZXR1cm4gIkZPUk1BVF9VTkRFRklORUQiOworICAgICAgICBjYXNlICgxKTogcmV0dXJuICJGT1JNQVRfUjRHNF9VTk9STV9QQUNLOCI7CisgICAgICAgIGNhc2UgKDIpOiByZXR1cm4gIkZPUk1BVF9SNEc0QjRBNF9VTk9STV9QQUNLMTYiOworICAgICAgICBjYXNlICgzKTogcmV0dXJuICJGT1JNQVRfQjRHNFI0QTRfVU5PUk1fUEFDSzE2IjsKKyAgICAgICAgY2FzZSAoNCk6IHJldHVybiAiRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTYiOworICAgICAgICBjYXNlICg1KTogcmV0dXJuICJGT1JNQVRfQjVHNlI1X1VOT1JNX1BBQ0sxNiI7CisgICAgICAgIGNhc2UgKDYpOiByZXR1cm4gIkZPUk1BVF9SNUc1QjVBMV9VTk9STV9QQUNLMTYiOworICAgICAgICBjYXNlICg3KTogcmV0dXJuICJGT1JNQVRfQjVHNVI1QTFfVU5PUk1fUEFDSzE2IjsKKyAgICAgICAgY2FzZSAoOCk6IHJldHVybiAiRk9STUFUX0ExUjVHNUI1X1VOT1JNX1BBQ0sxNiI7CisgICAgICAgIGNhc2UgKDkpOiByZXR1cm4gIkZPUk1BVF9SOF9VTk9STSI7CisgICAgICAgIGNhc2UgKDEwKTogcmV0dXJuICJGT1JNQVRfUjhfU05PUk0iOworICAgICAgICBjYXNlICgxMSk6IHJldHVybiAiRk9STUFUX1I4X1VTQ0FMRUQiOworICAgICAgICBjYXNlICgxMik6IHJldHVybiAiRk9STUFUX1I4X1NTQ0FMRUQiOworICAgICAgICBjYXNlICgxMyk6IHJldHVybiAiRk9STUFUX1I4X1VJTlQiOworICAgICAgICBjYXNlICgxNCk6IHJldHVybiAiRk9STUFUX1I4X1NJTlQiOworICAgICAgICBjYXNlICgxNSk6IHJldHVybiAiRk9STUFUX1I4X1NSR0IiOworICAgICAgICBjYXNlICgxNik6IHJldHVybiAiRk9STUFUX1I4RzhfVU5PUk0iOworICAgICAgICBjYXNlICgxNyk6IHJldHVybiAiRk9STUFUX1I4RzhfU05PUk0iOworICAgICAgICBjYXNlICgxOCk6IHJldHVybiAiRk9STUFUX1I4RzhfVVNDQUxFRCI7CisgICAgICAgIGNhc2UgKDE5KTogcmV0dXJuICJGT1JNQVRfUjhHOF9TU0NBTEVEIjsKKyAgICAgICAgY2FzZSAoMjApOiByZXR1cm4gIkZPUk1BVF9SOEc4X1VJTlQiOworICAgICAgICBjYXNlICgyMSk6IHJldHVybiAiRk9STUFUX1I4RzhfU0lOVCI7CisgICAgICAgIGNhc2UgKDIyKTogcmV0dXJuICJGT1JNQVRfUjhHOF9TUkdCIjsKKyAgICAgICAgY2FzZSAoMjMpOiByZXR1cm4gIkZPUk1BVF9SOEc4QjhfVU5PUk0iOworICAgICAgICBjYXNlICgyNCk6IHJldHVybiAiRk9STUFUX1I4RzhCOF9TTk9STSI7CisgICAgICAgIGNhc2UgKDI1KTogcmV0dXJuICJGT1JNQVRfUjhHOEI4X1VTQ0FMRUQiOworICAgICAgICBjYXNlICgyNik6IHJldHVybiAiRk9STUFUX1I4RzhCOF9TU0NBTEVEIjsKKyAgICAgICAgY2FzZSAoMjcpOiByZXR1cm4gIkZPUk1BVF9SOEc4QjhfVUlOVCI7CisgICAgICAgIGNhc2UgKDI4KTogcmV0dXJuICJGT1JNQVRfUjhHOEI4X1NJTlQiOworICAgICAgICBjYXNlICgyOSk6IHJldHVybiAiRk9STUFUX1I4RzhCOF9TUkdCIjsKKyAgICAgICAgY2FzZSAoMzApOiByZXR1cm4gIkZPUk1BVF9COEc4UjhfVU5PUk0iOworICAgICAgICBjYXNlICgzMSk6IHJldHVybiAiRk9STUFUX0I4RzhSOF9TTk9STSI7CisgICAgICAgIGNhc2UgKDMyKTogcmV0dXJuICJGT1JNQVRfQjhHOFI4X1VTQ0FMRUQiOworICAgICAgICBjYXNlICgzMyk6IHJldHVybiAiRk9STUFUX0I4RzhSOF9TU0NBTEVEIjsKKyAgICAgICAgY2FzZSAoMzQpOiByZXR1cm4gIkZPUk1BVF9COEc4UjhfVUlOVCI7CisgICAgICAgIGNhc2UgKDM1KTogcmV0dXJuICJGT1JNQVRfQjhHOFI4X1NJTlQiOworICAgICAgICBjYXNlICgzNik6IHJldHVybiAiRk9STUFUX0I4RzhSOF9TUkdCIjsKKyAgICAgICAgY2FzZSAoMzcpOiByZXR1cm4gIkZPUk1BVF9SOEc4QjhBOF9VTk9STSI7CisgICAgICAgIGNhc2UgKDM4KTogcmV0dXJuICJGT1JNQVRfUjhHOEI4QThfU05PUk0iOworICAgICAgICBjYXNlICgzOSk6IHJldHVybiAiRk9STUFUX1I4RzhCOEE4X1VTQ0FMRUQiOworICAgICAgICBjYXNlICg0MCk6IHJldHVybiAiRk9STUFUX1I4RzhCOEE4X1NTQ0FMRUQiOworICAgICAgICBjYXNlICg0MSk6IHJldHVybiAiRk9STUFUX1I4RzhCOEE4X1VJTlQiOworICAgICAgICBjYXNlICg0Mik6IHJldHVybiAiRk9STUFUX1I4RzhCOEE4X1NJTlQiOworICAgICAgICBjYXNlICg0Myk6IHJldHVybiAiRk9STUFUX1I4RzhCOEE4X1NSR0IiOworICAgICAgICBjYXNlICg0NCk6IHJldHVybiAiRk9STUFUX0I4RzhSOEE4X1VOT1JNIjsKKyAgICAgICAgY2FzZSAoNDUpOiByZXR1cm4gIkZPUk1BVF9COEc4UjhBOF9TTk9STSI7CisgICAgICAgIGNhc2UgKDQ2KTogcmV0dXJuICJGT1JNQVRfQjhHOFI4QThfVVNDQUxFRCI7CisgICAgICAgIGNhc2UgKDQ3KTogcmV0dXJuICJGT1JNQVRfQjhHOFI4QThfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgKDQ4KTogcmV0dXJuICJGT1JNQVRfQjhHOFI4QThfVUlOVCI7CisgICAgICAgIGNhc2UgKDQ5KTogcmV0dXJuICJGT1JNQVRfQjhHOFI4QThfU0lOVCI7CisgICAgICAgIGNhc2UgKDUwKTogcmV0dXJuICJGT1JNQVRfQjhHOFI4QThfU1JHQiI7CisgICAgICAgIGNhc2UgKDUxKTogcmV0dXJuICJGT1JNQVRfQThCOEc4UjhfVU5PUk1fUEFDSzMyIjsKKyAgICAgICAgY2FzZSAoNTIpOiByZXR1cm4gIkZPUk1BVF9BOEI4RzhSOF9TTk9STV9QQUNLMzIiOworICAgICAgICBjYXNlICg1Myk6IHJldHVybiAiRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyIjsKKyAgICAgICAgY2FzZSAoNTQpOiByZXR1cm4gIkZPUk1BVF9BOEI4RzhSOF9TU0NBTEVEX1BBQ0szMiI7CisgICAgICAgIGNhc2UgKDU1KTogcmV0dXJuICJGT1JNQVRfQThCOEc4UjhfVUlOVF9QQUNLMzIiOworICAgICAgICBjYXNlICg1Nik6IHJldHVybiAiRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyIjsKKyAgICAgICAgY2FzZSAoNTcpOiByZXR1cm4gIkZPUk1BVF9BOEI4RzhSOF9TUkdCX1BBQ0szMiI7CisgICAgICAgIGNhc2UgKDU4KTogcmV0dXJuICJGT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyIjsKKyAgICAgICAgY2FzZSAoNTkpOiByZXR1cm4gIkZPUk1BVF9BMlIxMEcxMEIxMF9TTk9STV9QQUNLMzIiOworICAgICAgICBjYXNlICg2MCk6IHJldHVybiAiRk9STUFUX0EyUjEwRzEwQjEwX1VTQ0FMRURfUEFDSzMyIjsKKyAgICAgICAgY2FzZSAoNjEpOiByZXR1cm4gIkZPUk1BVF9BMlIxMEcxMEIxMF9TU0NBTEVEX1BBQ0szMiI7CisgICAgICAgIGNhc2UgKDYyKTogcmV0dXJuICJGT1JNQVRfQTJSMTBHMTBCMTBfVUlOVF9QQUNLMzIiOworICAgICAgICBjYXNlICg2Myk6IHJldHVybiAiRk9STUFUX0EyUjEwRzEwQjEwX1NJTlRfUEFDSzMyIjsKKyAgICAgICAgY2FzZSAoNjQpOiByZXR1cm4gIkZPUk1BVF9BMkIxMEcxMFIxMF9VTk9STV9QQUNLMzIiOworICAgICAgICBjYXNlICg2NSk6IHJldHVybiAiRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMiI7CisgICAgICAgIGNhc2UgKDY2KTogcmV0dXJuICJGT1JNQVRfQTJCMTBHMTBSMTBfVVNDQUxFRF9QQUNLMzIiOworICAgICAgICBjYXNlICg2Nyk6IHJldHVybiAiRk9STUFUX0EyQjEwRzEwUjEwX1NTQ0FMRURfUEFDSzMyIjsKKyAgICAgICAgY2FzZSAoNjgpOiByZXR1cm4gIkZPUk1BVF9BMkIxMEcxMFIxMF9VSU5UX1BBQ0szMiI7CisgICAgICAgIGNhc2UgKDY5KTogcmV0dXJuICJGT1JNQVRfQTJCMTBHMTBSMTBfU0lOVF9QQUNLMzIiOworICAgICAgICBjYXNlICg3MCk6IHJldHVybiAiRk9STUFUX1IxNl9VTk9STSI7CisgICAgICAgIGNhc2UgKDcxKTogcmV0dXJuICJGT1JNQVRfUjE2X1NOT1JNIjsKKyAgICAgICAgY2FzZSAoNzIpOiByZXR1cm4gIkZPUk1BVF9SMTZfVVNDQUxFRCI7CisgICAgICAgIGNhc2UgKDczKTogcmV0dXJuICJGT1JNQVRfUjE2X1NTQ0FMRUQiOworICAgICAgICBjYXNlICg3NCk6IHJldHVybiAiRk9STUFUX1IxNl9VSU5UIjsKKyAgICAgICAgY2FzZSAoNzUpOiByZXR1cm4gIkZPUk1BVF9SMTZfU0lOVCI7CisgICAgICAgIGNhc2UgKDc2KTogcmV0dXJuICJGT1JNQVRfUjE2X1NGTE9BVCI7CisgICAgICAgIGNhc2UgKDc3KTogcmV0dXJuICJGT1JNQVRfUjE2RzE2X1VOT1JNIjsKKyAgICAgICAgY2FzZSAoNzgpOiByZXR1cm4gIkZPUk1BVF9SMTZHMTZfU05PUk0iOworICAgICAgICBjYXNlICg3OSk6IHJldHVybiAiRk9STUFUX1IxNkcxNl9VU0NBTEVEIjsKKyAgICAgICAgY2FzZSAoODApOiByZXR1cm4gIkZPUk1BVF9SMTZHMTZfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgKDgxKTogcmV0dXJuICJGT1JNQVRfUjE2RzE2X1VJTlQiOworICAgICAgICBjYXNlICg4Mik6IHJldHVybiAiRk9STUFUX1IxNkcxNl9TSU5UIjsKKyAgICAgICAgY2FzZSAoODMpOiByZXR1cm4gIkZPUk1BVF9SMTZHMTZfU0ZMT0FUIjsKKyAgICAgICAgY2FzZSAoODQpOiByZXR1cm4gIkZPUk1BVF9SMTZHMTZCMTZfVU5PUk0iOworICAgICAgICBjYXNlICg4NSk6IHJldHVybiAiRk9STUFUX1IxNkcxNkIxNl9TTk9STSI7CisgICAgICAgIGNhc2UgKDg2KTogcmV0dXJuICJGT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQiOworICAgICAgICBjYXNlICg4Nyk6IHJldHVybiAiRk9STUFUX1IxNkcxNkIxNl9TU0NBTEVEIjsKKyAgICAgICAgY2FzZSAoODgpOiByZXR1cm4gIkZPUk1BVF9SMTZHMTZCMTZfVUlOVCI7CisgICAgICAgIGNhc2UgKDg5KTogcmV0dXJuICJGT1JNQVRfUjE2RzE2QjE2X1NJTlQiOworICAgICAgICBjYXNlICg5MCk6IHJldHVybiAiRk9STUFUX1IxNkcxNkIxNl9TRkxPQVQiOworICAgICAgICBjYXNlICg5MSk6IHJldHVybiAiRk9STUFUX1IxNkcxNkIxNkExNl9VTk9STSI7CisgICAgICAgIGNhc2UgKDkyKTogcmV0dXJuICJGT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNIjsKKyAgICAgICAgY2FzZSAoOTMpOiByZXR1cm4gIkZPUk1BVF9SMTZHMTZCMTZBMTZfVVNDQUxFRCI7CisgICAgICAgIGNhc2UgKDk0KTogcmV0dXJuICJGT1JNQVRfUjE2RzE2QjE2QTE2X1NTQ0FMRUQiOworICAgICAgICBjYXNlICg5NSk6IHJldHVybiAiRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UIjsKKyAgICAgICAgY2FzZSAoOTYpOiByZXR1cm4gIkZPUk1BVF9SMTZHMTZCMTZBMTZfU0lOVCI7CisgICAgICAgIGNhc2UgKDk3KTogcmV0dXJuICJGT1JNQVRfUjE2RzE2QjE2QTE2X1NGTE9BVCI7CisgICAgICAgIGNhc2UgKDk4KTogcmV0dXJuICJGT1JNQVRfUjMyX1VJTlQiOworICAgICAgICBjYXNlICg5OSk6IHJldHVybiAiRk9STUFUX1IzMl9TSU5UIjsKKyAgICAgICAgY2FzZSAoMTAwKTogcmV0dXJuICJGT1JNQVRfUjMyX1NGTE9BVCI7CisgICAgICAgIGNhc2UgKDEwMSk6IHJldHVybiAiRk9STUFUX1IzMkczMl9VSU5UIjsKKyAgICAgICAgY2FzZSAoMTAyKTogcmV0dXJuICJGT1JNQVRfUjMyRzMyX1NJTlQiOworICAgICAgICBjYXNlICgxMDMpOiByZXR1cm4gIkZPUk1BVF9SMzJHMzJfU0ZMT0FUIjsKKyAgICAgICAgY2FzZSAoMTA0KTogcmV0dXJuICJGT1JNQVRfUjMyRzMyQjMyX1VJTlQiOworICAgICAgICBjYXNlICgxMDUpOiByZXR1cm4gIkZPUk1BVF9SMzJHMzJCMzJfU0lOVCI7CisgICAgICAgIGNhc2UgKDEwNik6IHJldHVybiAiRk9STUFUX1IzMkczMkIzMl9TRkxPQVQiOworICAgICAgICBjYXNlICgxMDcpOiByZXR1cm4gIkZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVCI7CisgICAgICAgIGNhc2UgKDEwOCk6IHJldHVybiAiRk9STUFUX1IzMkczMkIzMkEzMl9TSU5UIjsKKyAgICAgICAgY2FzZSAoMTA5KTogcmV0dXJuICJGT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVCI7CisgICAgICAgIGNhc2UgKDExMCk6IHJldHVybiAiRk9STUFUX1I2NF9VSU5UIjsKKyAgICAgICAgY2FzZSAoMTExKTogcmV0dXJuICJGT1JNQVRfUjY0X1NJTlQiOworICAgICAgICBjYXNlICgxMTIpOiByZXR1cm4gIkZPUk1BVF9SNjRfU0ZMT0FUIjsKKyAgICAgICAgY2FzZSAoMTEzKTogcmV0dXJuICJGT1JNQVRfUjY0RzY0X1VJTlQiOworICAgICAgICBjYXNlICgxMTQpOiByZXR1cm4gIkZPUk1BVF9SNjRHNjRfU0lOVCI7CisgICAgICAgIGNhc2UgKDExNSk6IHJldHVybiAiRk9STUFUX1I2NEc2NF9TRkxPQVQiOworICAgICAgICBjYXNlICgxMTYpOiByZXR1cm4gIkZPUk1BVF9SNjRHNjRCNjRfVUlOVCI7CisgICAgICAgIGNhc2UgKDExNyk6IHJldHVybiAiRk9STUFUX1I2NEc2NEI2NF9TSU5UIjsKKyAgICAgICAgY2FzZSAoMTE4KTogcmV0dXJuICJGT1JNQVRfUjY0RzY0QjY0X1NGTE9BVCI7CisgICAgICAgIGNhc2UgKDExOSk6IHJldHVybiAiRk9STUFUX1I2NEc2NEI2NEE2NF9VSU5UIjsKKyAgICAgICAgY2FzZSAoMTIwKTogcmV0dXJuICJGT1JNQVRfUjY0RzY0QjY0QTY0X1NJTlQiOworICAgICAgICBjYXNlICgxMjEpOiByZXR1cm4gIkZPUk1BVF9SNjRHNjRCNjRBNjRfU0ZMT0FUIjsKKyAgICAgICAgY2FzZSAoMTIyKTogcmV0dXJuICJGT1JNQVRfQjEwRzExUjExX1VGTE9BVF9QQUNLMzIiOworICAgICAgICBjYXNlICgxMjMpOiByZXR1cm4gIkZPUk1BVF9FNUI5RzlSOV9VRkxPQVRfUEFDSzMyIjsKKyAgICAgICAgY2FzZSAoMTI0KTogcmV0dXJuICJGT1JNQVRfRDE2X1VOT1JNIjsKKyAgICAgICAgY2FzZSAoMTI1KTogcmV0dXJuICJGT1JNQVRfWDhfRDI0X1VOT1JNX1BBQ0szMiI7CisgICAgICAgIGNhc2UgKDEyNik6IHJldHVybiAiRk9STUFUX0QzMl9TRkxPQVQiOworICAgICAgICBjYXNlICgxMjcpOiByZXR1cm4gIkZPUk1BVF9TOF9VSU5UIjsKKyAgICAgICAgY2FzZSAoMTI4KTogcmV0dXJuICJGT1JNQVRfRDE2X1VOT1JNX1M4X1VJTlQiOworICAgICAgICBjYXNlICgxMjkpOiByZXR1cm4gIkZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVCI7CisgICAgICAgIGNhc2UgKDEzMCk6IHJldHVybiAiRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVCI7CisgICAgICAgIGNhc2UgKDEzMSk6IHJldHVybiAiRk9STUFUX0JDMV9SR0JfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxMzIpOiByZXR1cm4gIkZPUk1BVF9CQzFfUkdCX1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlICgxMzMpOiByZXR1cm4gIkZPUk1BVF9CQzFfUkdCQV9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgKDEzNCk6IHJldHVybiAiRk9STUFUX0JDMV9SR0JBX1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlICgxMzUpOiByZXR1cm4gIkZPUk1BVF9CQzJfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxMzYpOiByZXR1cm4gIkZPUk1BVF9CQzJfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgKDEzNyk6IHJldHVybiAiRk9STUFUX0JDM19VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgKDEzOCk6IHJldHVybiAiRk9STUFUX0JDM19TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTM5KTogcmV0dXJuICJGT1JNQVRfQkM0X1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTQwKTogcmV0dXJuICJGT1JNQVRfQkM0X1NOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTQxKTogcmV0dXJuICJGT1JNQVRfQkM1X1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTQyKTogcmV0dXJuICJGT1JNQVRfQkM1X1NOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTQzKTogcmV0dXJuICJGT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0siOworICAgICAgICBjYXNlICgxNDQpOiByZXR1cm4gIkZPUk1BVF9CQzZIX1NGTE9BVF9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE0NSk6IHJldHVybiAiRk9STUFUX0JDN19VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE0Nik6IHJldHVybiAiRk9STUFUX0JDN19TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTQ3KTogcmV0dXJuICJGT1JNQVRfRVRDMl9SOEc4QjhfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNDgpOiByZXR1cm4gIkZPUk1BVF9FVEMyX1I4RzhCOF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTQ5KTogcmV0dXJuICJGT1JNQVRfRVRDMl9SOEc4QjhBMV9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE1MCk6IHJldHVybiAiRk9STUFUX0VUQzJfUjhHOEI4QTFfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE1MSk6IHJldHVybiAiRk9STUFUX0VUQzJfUjhHOEI4QThfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNTIpOiByZXR1cm4gIkZPUk1BVF9FVEMyX1I4RzhCOEE4X1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlICgxNTMpOiByZXR1cm4gIkZPUk1BVF9FQUNfUjExX1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTU0KTogcmV0dXJuICJGT1JNQVRfRUFDX1IxMV9TTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE1NSk6IHJldHVybiAiRk9STUFUX0VBQ19SMTFHMTFfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNTYpOiByZXR1cm4gIkZPUk1BVF9FQUNfUjExRzExX1NOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTU3KTogcmV0dXJuICJGT1JNQVRfQVNUQ180eDRfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNTgpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzR4NF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTU5KTogcmV0dXJuICJGT1JNQVRfQVNUQ181eDRfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNjApOiByZXR1cm4gIkZPUk1BVF9BU1RDXzV4NF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTYxKTogcmV0dXJuICJGT1JNQVRfQVNUQ181eDVfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNjIpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzV4NV9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTYzKTogcmV0dXJuICJGT1JNQVRfQVNUQ182eDVfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNjQpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzZ4NV9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTY1KTogcmV0dXJuICJGT1JNQVRfQVNUQ182eDZfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNjYpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzZ4Nl9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTY3KTogcmV0dXJuICJGT1JNQVRfQVNUQ184eDVfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNjgpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzh4NV9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTY5KTogcmV0dXJuICJGT1JNQVRfQVNUQ184eDZfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNzApOiByZXR1cm4gIkZPUk1BVF9BU1RDXzh4Nl9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTcxKTogcmV0dXJuICJGT1JNQVRfQVNUQ184eDhfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNzIpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzh4OF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTczKTogcmV0dXJuICJGT1JNQVRfQVNUQ18xMHg1X1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTc0KTogcmV0dXJuICJGT1JNQVRfQVNUQ18xMHg1X1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlICgxNzUpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzEweDZfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxNzYpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzEweDZfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE3Nyk6IHJldHVybiAiRk9STUFUX0FTVENfMTB4OF9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE3OCk6IHJldHVybiAiRk9STUFUX0FTVENfMTB4OF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTc5KTogcmV0dXJuICJGT1JNQVRfQVNUQ18xMHgxMF9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE4MCk6IHJldHVybiAiRk9STUFUX0FTVENfMTB4MTBfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgKDE4MSk6IHJldHVybiAiRk9STUFUX0FTVENfMTJ4MTBfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlICgxODIpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlICgxODMpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzEyeDEyX1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTg0KTogcmV0dXJuICJGT1JNQVRfQVNUQ18xMngxMl9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAwMCk6IHJldHVybiAiRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STSI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMDEpOiByZXR1cm4gIkZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk0iOworICAgICAgICBjYXNlICgxMDAwMTU2MDAyKTogcmV0dXJuICJGT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STSI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMDMpOiByZXR1cm4gIkZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk0iOworICAgICAgICBjYXNlICgxMDAwMTU2MDA0KTogcmV0dXJuICJGT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMl9VTk9STSI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMDUpOiByZXR1cm4gIkZPUk1BVF9HOF9COFI4XzJQTEFORV80MjJfVU5PUk0iOworICAgICAgICBjYXNlICgxMDAwMTU2MDA2KTogcmV0dXJuICJGT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STSI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMDcpOiByZXR1cm4gIkZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTYiOworICAgICAgICBjYXNlICgxMDAwMTU2MDA4KTogcmV0dXJuICJGT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2IjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAwOSk6IHJldHVybiAiRk9STUFUX1IxMFg2RzEwWDZCMTBYNkExMFg2X1VOT1JNXzRQQUNLMTYiOworICAgICAgICBjYXNlICgxMDAwMTU2MDEwKTogcmV0dXJuICJGT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTYiOworICAgICAgICBjYXNlICgxMDAwMTU2MDExKTogcmV0dXJuICJGT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTYiOworICAgICAgICBjYXNlICgxMDAwMTU2MDEyKTogcmV0dXJuICJGT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2IjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAxMyk6IHJldHVybiAiRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2IjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAxNCk6IHJldHVybiAiRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMTUpOiByZXR1cm4gIkZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMTYpOiByZXR1cm4gIkZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlICgxMDAwMTU2MDE3KTogcmV0dXJuICJGT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAxOCk6IHJldHVybiAiRk9STUFUX1IxMlg0RzEyWDRfVU5PUk1fMlBBQ0sxNiI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMTkpOiByZXR1cm4gIkZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2IjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAyMCk6IHJldHVybiAiRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2IjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAyMSk6IHJldHVybiAiRk9STUFUX0IxMlg0RzEyWDRSMTJYNEcxMlg0XzQyMl9VTk9STV80UEFDSzE2IjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAyMik6IHJldHVybiAiRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMjMpOiByZXR1cm4gIkZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMjQpOiByZXR1cm4gIkZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlICgxMDAwMTU2MDI1KTogcmV0dXJuICJGT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlICgxMDAwMTU2MDI2KTogcmV0dXJuICJGT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2IjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAyNyk6IHJldHVybiAiRk9STUFUX0cxNkIxNkcxNlIxNl80MjJfVU5PUk0iOworICAgICAgICBjYXNlICgxMDAwMTU2MDI4KTogcmV0dXJuICJGT1JNQVRfQjE2RzE2UjE2RzE2XzQyMl9VTk9STSI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMjkpOiByZXR1cm4gIkZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNIjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAzMCk6IHJldHVybiAiRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STSI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMzEpOiByZXR1cm4gIkZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIyX1VOT1JNIjsKKyAgICAgICAgY2FzZSAoMTAwMDE1NjAzMik6IHJldHVybiAiRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STSI7CisgICAgICAgIGNhc2UgKDEwMDAxNTYwMzMpOiByZXR1cm4gIkZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNIjsKKyAgICAgICAgY2FzZSAoMTAwMDA1NDAwMCk6IHJldHVybiAiRk9STUFUX1BWUlRDMV8yQlBQX1VOT1JNX0JMT0NLX0lNRyI7CisgICAgICAgIGNhc2UgKDEwMDAwNTQwMDEpOiByZXR1cm4gIkZPUk1BVF9QVlJUQzFfNEJQUF9VTk9STV9CTE9DS19JTUciOworICAgICAgICBjYXNlICgxMDAwMDU0MDAyKTogcmV0dXJuICJGT1JNQVRfUFZSVEMyXzJCUFBfVU5PUk1fQkxPQ0tfSU1HIjsKKyAgICAgICAgY2FzZSAoMTAwMDA1NDAwMyk6IHJldHVybiAiRk9STUFUX1BWUlRDMl80QlBQX1VOT1JNX0JMT0NLX0lNRyI7CisgICAgICAgIGNhc2UgKDEwMDAwNTQwMDQpOiByZXR1cm4gIkZPUk1BVF9QVlJUQzFfMkJQUF9TUkdCX0JMT0NLX0lNRyI7CisgICAgICAgIGNhc2UgKDEwMDAwNTQwMDUpOiByZXR1cm4gIkZPUk1BVF9QVlJUQzFfNEJQUF9TUkdCX0JMT0NLX0lNRyI7CisgICAgICAgIGNhc2UgKDEwMDAwNTQwMDYpOiByZXR1cm4gIkZPUk1BVF9QVlJUQzJfMkJQUF9TUkdCX0JMT0NLX0lNRyI7CisgICAgICAgIGNhc2UgKDEwMDAwNTQwMDcpOiByZXR1cm4gIkZPUk1BVF9QVlJUQzJfNEJQUF9TUkdCX0JMT0NLX0lNRyI7CisgICAgICAgIGNhc2UgKDEwMDAwNjYwMDApOiByZXR1cm4gIkZPUk1BVF9BU1RDXzR4NF9TRkxPQVRfQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSAoMTAwMDA2NjAwMSk6IHJldHVybiAiRk9STUFUX0FTVENfNXg0X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlICgxMDAwMDY2MDAyKTogcmV0dXJuICJGT1JNQVRfQVNUQ181eDVfU0ZMT0FUX0JMT0NLX0VYVCI7CisgICAgICAgIGNhc2UgKDEwMDAwNjYwMDMpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzZ4NV9TRkxPQVRfQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSAoMTAwMDA2NjAwNCk6IHJldHVybiAiRk9STUFUX0FTVENfNng2X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlICgxMDAwMDY2MDA1KTogcmV0dXJuICJGT1JNQVRfQVNUQ184eDVfU0ZMT0FUX0JMT0NLX0VYVCI7CisgICAgICAgIGNhc2UgKDEwMDAwNjYwMDYpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzh4Nl9TRkxPQVRfQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSAoMTAwMDA2NjAwNyk6IHJldHVybiAiRk9STUFUX0FTVENfOHg4X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlICgxMDAwMDY2MDA4KTogcmV0dXJuICJGT1JNQVRfQVNUQ18xMHg1X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlICgxMDAwMDY2MDA5KTogcmV0dXJuICJGT1JNQVRfQVNUQ18xMHg2X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlICgxMDAwMDY2MDEwKTogcmV0dXJuICJGT1JNQVRfQVNUQ18xMHg4X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlICgxMDAwMDY2MDExKTogcmV0dXJuICJGT1JNQVRfQVNUQ18xMHgxMF9TRkxPQVRfQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSAoMTAwMDA2NjAxMik6IHJldHVybiAiRk9STUFUX0FTVENfMTJ4MTBfU0ZMT0FUX0JMT0NLX0VYVCI7CisgICAgICAgIGNhc2UgKDEwMDAwNjYwMTMpOiByZXR1cm4gIkZPUk1BVF9BU1RDXzEyeDEyX1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV05fVmtGb3JtYXQiOworICAgIH0KK30KK3ZvaWQgRHVtcFZrRm9ybWF0KFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrRm9ybWF0IHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlLCB3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBwLlByaW50S2V5VmFsdWUobmFtZSwgVmtGb3JtYXRTdHJpbmcodmFsdWUpLCB3aWR0aCk7CisgICAgfQorfQorc3RhdGljIGNvbnN0IGNoYXIgKlZrSW1hZ2VUaWxpbmdTdHJpbmcoVmtJbWFnZVRpbGluZyB2YWx1ZSkgeworICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgY2FzZSAoMCk6IHJldHVybiAiSU1BR0VfVElMSU5HX09QVElNQUwiOworICAgICAgICBjYXNlICgxKTogcmV0dXJuICJJTUFHRV9USUxJTkdfTElORUFSIjsKKyAgICAgICAgY2FzZSAoMTAwMDE1ODAwMCk6IHJldHVybiAiSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOX1ZrSW1hZ2VUaWxpbmciOworICAgIH0KK30KK3ZvaWQgRHVtcFZrSW1hZ2VUaWxpbmcoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtJbWFnZVRpbGluZyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7CisgICAgICAgIHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSwgd2lkdGgpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKG5hbWUsIFZrSW1hZ2VUaWxpbmdTdHJpbmcodmFsdWUpLCB3aWR0aCk7CisgICAgfQorfQorc3RhdGljIGNvbnN0IGNoYXIgKlZrUGh5c2ljYWxEZXZpY2VUeXBlU3RyaW5nKFZrUGh5c2ljYWxEZXZpY2VUeXBlIHZhbHVlKSB7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlICgwKTogcmV0dXJuICJQSFlTSUNBTF9ERVZJQ0VfVFlQRV9PVEhFUiI7CisgICAgICAgIGNhc2UgKDEpOiByZXR1cm4gIlBIWVNJQ0FMX0RFVklDRV9UWVBFX0lOVEVHUkFURURfR1BVIjsKKyAgICAgICAgY2FzZSAoMik6IHJldHVybiAiUEhZU0lDQUxfREVWSUNFX1RZUEVfRElTQ1JFVEVfR1BVIjsKKyAgICAgICAgY2FzZSAoMyk6IHJldHVybiAiUEhZU0lDQUxfREVWSUNFX1RZUEVfVklSVFVBTF9HUFUiOworICAgICAgICBjYXNlICg0KTogcmV0dXJuICJQSFlTSUNBTF9ERVZJQ0VfVFlQRV9DUFUiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV05fVmtQaHlzaWNhbERldmljZVR5cGUiOworICAgIH0KK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VUeXBlKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VUeXBlIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlLCB3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBwLlByaW50S2V5VmFsdWUobmFtZSwgVmtQaHlzaWNhbERldmljZVR5cGVTdHJpbmcodmFsdWUpLCB3aWR0aCk7CisgICAgfQorfQorc3RhdGljIGNvbnN0IGNoYXIgKlZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yU3RyaW5nKFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yIHZhbHVlKSB7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlICgwKTogcmV0dXJuICJQT0lOVF9DTElQUElOR19CRUhBVklPUl9BTExfQ0xJUF9QTEFORVMiOworICAgICAgICBjYXNlICgxKTogcmV0dXJuICJQT0lOVF9DTElQUElOR19CRUhBVklPUl9VU0VSX0NMSVBfUExBTkVTX09OTFkiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV05fVmtQb2ludENsaXBwaW5nQmVoYXZpb3IiOworICAgIH0KK30KK3ZvaWQgRHVtcFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlLCB3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBwLlByaW50S2V5VmFsdWUobmFtZSwgVmtQb2ludENsaXBwaW5nQmVoYXZpb3JTdHJpbmcodmFsdWUpLCB3aWR0aCk7CisgICAgfQorfQorc3RhdGljIGNvbnN0IGNoYXIgKlZrUHJlc2VudE1vZGVLSFJTdHJpbmcoVmtQcmVzZW50TW9kZUtIUiB2YWx1ZSkgeworICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgY2FzZSAoMCk6IHJldHVybiAiUFJFU0VOVF9NT0RFX0lNTUVESUFURV9LSFIiOworICAgICAgICBjYXNlICgxKTogcmV0dXJuICJQUkVTRU5UX01PREVfTUFJTEJPWF9LSFIiOworICAgICAgICBjYXNlICgyKTogcmV0dXJuICJQUkVTRU5UX01PREVfRklGT19LSFIiOworICAgICAgICBjYXNlICgzKTogcmV0dXJuICJQUkVTRU5UX01PREVfRklGT19SRUxBWEVEX0tIUiI7CisgICAgICAgIGNhc2UgKDEwMDAxMTEwMDApOiByZXR1cm4gIlBSRVNFTlRfTU9ERV9TSEFSRURfREVNQU5EX1JFRlJFU0hfS0hSIjsKKyAgICAgICAgY2FzZSAoMTAwMDExMTAwMSk6IHJldHVybiAiUFJFU0VOVF9NT0RFX1NIQVJFRF9DT05USU5VT1VTX1JFRlJFU0hfS0hSIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOX1ZrUHJlc2VudE1vZGVLSFIiOworICAgIH0KK30KK3ZvaWQgRHVtcFZrUHJlc2VudE1vZGVLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQcmVzZW50TW9kZUtIUiB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7CisgICAgICAgIHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSwgd2lkdGgpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKG5hbWUsIFZrUHJlc2VudE1vZGVLSFJTdHJpbmcodmFsdWUpLCB3aWR0aCk7CisgICAgfQorfQorc3RhdGljIGNvbnN0IGNoYXIgKlZrUmVzdWx0U3RyaW5nKFZrUmVzdWx0IHZhbHVlKSB7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlICgwKTogcmV0dXJuICJTVUNDRVNTIjsKKyAgICAgICAgY2FzZSAoMSk6IHJldHVybiAiTk9UX1JFQURZIjsKKyAgICAgICAgY2FzZSAoMik6IHJldHVybiAiVElNRU9VVCI7CisgICAgICAgIGNhc2UgKDMpOiByZXR1cm4gIkVWRU5UX1NFVCI7CisgICAgICAgIGNhc2UgKDQpOiByZXR1cm4gIkVWRU5UX1JFU0VUIjsKKyAgICAgICAgY2FzZSAoNSk6IHJldHVybiAiSU5DT01QTEVURSI7CisgICAgICAgIGNhc2UgKC0xKTogcmV0dXJuICJFUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkiOworICAgICAgICBjYXNlICgtMik6IHJldHVybiAiRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlkiOworICAgICAgICBjYXNlICgtMyk6IHJldHVybiAiRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEIjsKKyAgICAgICAgY2FzZSAoLTQpOiByZXR1cm4gIkVSUk9SX0RFVklDRV9MT1NUIjsKKyAgICAgICAgY2FzZSAoLTUpOiByZXR1cm4gIkVSUk9SX01FTU9SWV9NQVBfRkFJTEVEIjsKKyAgICAgICAgY2FzZSAoLTYpOiByZXR1cm4gIkVSUk9SX0xBWUVSX05PVF9QUkVTRU5UIjsKKyAgICAgICAgY2FzZSAoLTcpOiByZXR1cm4gIkVSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVCI7CisgICAgICAgIGNhc2UgKC04KTogcmV0dXJuICJFUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UIjsKKyAgICAgICAgY2FzZSAoLTkpOiByZXR1cm4gIkVSUk9SX0lOQ09NUEFUSUJMRV9EUklWRVIiOworICAgICAgICBjYXNlICgtMTApOiByZXR1cm4gIkVSUk9SX1RPT19NQU5ZX09CSkVDVFMiOworICAgICAgICBjYXNlICgtMTEpOiByZXR1cm4gIkVSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEIjsKKyAgICAgICAgY2FzZSAoLTEyKTogcmV0dXJuICJFUlJPUl9GUkFHTUVOVEVEX1BPT0wiOworICAgICAgICBjYXNlICgtMTAwMDA2OTAwMCk6IHJldHVybiAiRVJST1JfT1VUX09GX1BPT0xfTUVNT1JZIjsKKyAgICAgICAgY2FzZSAoLTEwMDAwNzIwMDMpOiByZXR1cm4gIkVSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFIjsKKyAgICAgICAgY2FzZSAoLTEwMDAwMDAwMDApOiByZXR1cm4gIkVSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiOworICAgICAgICBjYXNlICgtMTAwMDAwMDAwMSk6IHJldHVybiAiRVJST1JfTkFUSVZFX1dJTkRPV19JTl9VU0VfS0hSIjsKKyAgICAgICAgY2FzZSAoMTAwMDAwMTAwMyk6IHJldHVybiAiU1VCT1BUSU1BTF9LSFIiOworICAgICAgICBjYXNlICgtMTAwMDAwMTAwNCk6IHJldHVybiAiRVJST1JfT1VUX09GX0RBVEVfS0hSIjsKKyAgICAgICAgY2FzZSAoLTEwMDAwMDMwMDEpOiByZXR1cm4gIkVSUk9SX0lOQ09NUEFUSUJMRV9ESVNQTEFZX0tIUiI7CisgICAgICAgIGNhc2UgKC0xMDAwMDExMDAxKTogcmV0dXJuICJFUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQiOworICAgICAgICBjYXNlICgtMTAwMDAxMjAwMCk6IHJldHVybiAiRVJST1JfSU5WQUxJRF9TSEFERVJfTlYiOworICAgICAgICBjYXNlICgtMTAwMDE1ODAwMCk6IHJldHVybiAiRVJST1JfSU5WQUxJRF9EUk1fRk9STUFUX01PRElGSUVSX1BMQU5FX0xBWU9VVF9FWFQiOworICAgICAgICBjYXNlICgtMTAwMDE2MTAwMCk6IHJldHVybiAiRVJST1JfRlJBR01FTlRBVElPTl9FWFQiOworICAgICAgICBjYXNlICgtMTAwMDE3NDAwMSk6IHJldHVybiAiRVJST1JfTk9UX1BFUk1JVFRFRF9FWFQiOworICAgICAgICBjYXNlICgtMTAwMDI0NDAwMCk6IHJldHVybiAiRVJST1JfSU5WQUxJRF9ERVZJQ0VfQUREUkVTU19FWFQiOworICAgICAgICBjYXNlICgtMTAwMDI1NTAwMCk6IHJldHVybiAiRVJST1JfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX01PREVfTE9TVF9FWFQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV05fVmtSZXN1bHQiOworICAgIH0KK30KK3ZvaWQgRHVtcFZrUmVzdWx0KFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUmVzdWx0IHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlLCB3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBwLlByaW50S2V5VmFsdWUobmFtZSwgVmtSZXN1bHRTdHJpbmcodmFsdWUpLCB3aWR0aCk7CisgICAgfQorfQorc3RhdGljIGNvbnN0IGNoYXIgKlZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUlN0cmluZyhWa1NoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFIgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgIGNhc2UgKDApOiByZXR1cm4gIlNIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfMzJfQklUX09OTFlfS0hSIjsKKyAgICAgICAgY2FzZSAoMSk6IHJldHVybiAiU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9BTExfS0hSIjsKKyAgICAgICAgY2FzZSAoMik6IHJldHVybiAiU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9OT05FX0tIUiI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTl9Wa1NoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFIiOworICAgIH0KK30KK3ZvaWQgRHVtcFZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1NoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFIgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUsIHdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIHAuUHJpbnRLZXlWYWx1ZShuYW1lLCBWa1NoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFJTdHJpbmcodmFsdWUpLCB3aWR0aCk7CisgICAgfQorfQordm9pZCBEdW1wVmtDb21wb3NpdGVBbHBoYUZsYWdzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmICh2YWx1ZSA9PSAwKSBwLlByaW50RWxlbWVudCgiTm9uZSIpOworICAgIGlmICgxICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJDT01QT1NJVEVfQUxQSEFfT1BBUVVFX0JJVF9LSFIiKTsKKyAgICBpZiAoMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiQ09NUE9TSVRFX0FMUEhBX1BSRV9NVUxUSVBMSUVEX0JJVF9LSFIiKTsKKyAgICBpZiAoNCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiQ09NUE9TSVRFX0FMUEhBX1BPU1RfTVVMVElQTElFRF9CSVRfS0hSIik7CisgICAgaWYgKDggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkNPTVBPU0lURV9BTFBIQV9JTkhFUklUX0JJVF9LSFIiKTsKK30KK3ZvaWQgRHVtcFZrQ29tcG9zaXRlQWxwaGFGbGFnc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0NvbXBvc2l0ZUFscGhhRmxhZ3NLSFIgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa0NvbXBvc2l0ZUFscGhhRmxhZ3NLSFIocCwgbmFtZSwgc3RhdGljX2Nhc3Q8VmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSPih2YWx1ZSksIHdpZHRoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7IHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSk7IHJldHVybjsgfQorICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrQ29tcG9zaXRlQWxwaGFGbGFnc0tIUihwLCBuYW1lLCB2YWx1ZSwgd2lkdGgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmICh2YWx1ZSA9PSAwKSBwLlByaW50RWxlbWVudCgiTm9uZSIpOworICAgIGlmICgxICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX0xPQ0FMX0JJVF9LSFIiKTsKKyAgICBpZiAoMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9SRU1PVEVfQklUX0tIUiIpOworICAgIGlmICg0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX1NVTV9CSVRfS0hSIik7CisgICAgaWYgKDggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkRFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfTE9DQUxfTVVMVElfREVWSUNFX0JJVF9LSFIiKTsKK30KK3ZvaWQgRHVtcFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlKTsgcmV0dXJuOyB9CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBEdW1wVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIocCwgbmFtZSwgc3RhdGljX2Nhc3Q8VmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFI+KHZhbHVlKSwgd2lkdGgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7IHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSk7IHJldHVybjsgfQorICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKHAsIG5hbWUsIHZhbHVlLCB3aWR0aCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrRm9ybWF0RmVhdHVyZUZsYWdzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHZhbHVlID09IDApIHAuUHJpbnRFbGVtZW50KCJOb25lIik7CisgICAgaWYgKDEgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUIik7CisgICAgaWYgKDIgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklUIik7CisgICAgaWYgKDQgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVCIpOworICAgIGlmICg4ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQiKTsKKyAgICBpZiAoMTYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCIpOworICAgIGlmICgzMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9URVhFTF9CVUZGRVJfQVRPTUlDX0JJVCIpOworICAgIGlmICg2NCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiRk9STUFUX0ZFQVRVUkVfVkVSVEVYX0JVRkZFUl9CSVQiKTsKKyAgICBpZiAoMTI4ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCIpOworICAgIGlmICgyNTYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQkxFTkRfQklUIik7CisgICAgaWYgKDUxMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCIpOworICAgIGlmICgxMDI0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9CTElUX1NSQ19CSVQiKTsKKyAgICBpZiAoMjA0OCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUIik7CisgICAgaWYgKDQwOTYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQiKTsKKyAgICBpZiAoMTYzODQgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVQiKTsKKyAgICBpZiAoMzI3NjggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQiKTsKKyAgICBpZiAoMTMxMDcyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9NSURQT0lOVF9DSFJPTUFfU0FNUExFU19CSVQiKTsKKyAgICBpZiAoMjYyMTQ0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fTElORUFSX0ZJTFRFUl9CSVQiKTsKKyAgICBpZiAoNTI0Mjg4ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVCIpOworICAgIGlmICgxMDQ4NTc2ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0JJVCIpOworICAgIGlmICgyMDk3MTUyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0ZPUkNFQUJMRV9CSVQiKTsKKyAgICBpZiAoNDE5NDMwNCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiRk9STUFUX0ZFQVRVUkVfRElTSk9JTlRfQklUIik7CisgICAgaWYgKDgzODg2MDggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX0NPU0lURURfQ0hST01BX1NBTVBMRVNfQklUIik7CisgICAgaWYgKDgxOTIgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9JTUciKTsKKyAgICBpZiAoNjU1MzYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIkZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX01JTk1BWF9CSVRfRVhUIik7CisgICAgaWYgKDE2Nzc3MjE2ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJGT1JNQVRfRkVBVFVSRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUIik7Cit9Cit2b2lkIER1bXBWa0Zvcm1hdEZlYXR1cmVGbGFncyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0Zvcm1hdEZlYXR1cmVGbGFncyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7IHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSk7IHJldHVybjsgfQorICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrRm9ybWF0RmVhdHVyZUZsYWdzKHAsIG5hbWUsIHN0YXRpY19jYXN0PFZrRm9ybWF0RmVhdHVyZUZsYWdCaXRzPih2YWx1ZSksIHdpZHRoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa0Zvcm1hdEZlYXR1cmVGbGFncyhwLCBuYW1lLCB2YWx1ZSwgd2lkdGgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa0ltYWdlVXNhZ2VGbGFncyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0ltYWdlVXNhZ2VGbGFnQml0cyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmICh2YWx1ZSA9PSAwKSBwLlByaW50RWxlbWVudCgiTm9uZSIpOworICAgIGlmICgxICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJJTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIik7CisgICAgaWYgKDIgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIklNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQiKTsKKyAgICBpZiAoNCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQiKTsKKyAgICBpZiAoOCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQiKTsKKyAgICBpZiAoMTYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIklNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIik7CisgICAgaWYgKDMyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJJTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIik7CisgICAgaWYgKDY0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJJTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQiKTsKKyAgICBpZiAoMTI4ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJJTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCIpOworICAgIGlmICgyNTYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIklNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYiKTsKKyAgICBpZiAoNTEyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJJTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUIik7Cit9Cit2b2lkIER1bXBWa0ltYWdlVXNhZ2VGbGFncyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0ltYWdlVXNhZ2VGbGFncyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7IHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSk7IHJldHVybjsgfQorICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrSW1hZ2VVc2FnZUZsYWdzKHAsIG5hbWUsIHN0YXRpY19jYXN0PFZrSW1hZ2VVc2FnZUZsYWdCaXRzPih2YWx1ZSksIHdpZHRoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtJbWFnZVVzYWdlRmxhZ0JpdHMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtJbWFnZVVzYWdlRmxhZ0JpdHMgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa0ltYWdlVXNhZ2VGbGFncyhwLCBuYW1lLCB2YWx1ZSwgd2lkdGgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa01lbW9yeUhlYXBGbGFncyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa01lbW9yeUhlYXBGbGFnQml0cyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmICh2YWx1ZSA9PSAwKSBwLlByaW50RWxlbWVudCgiTm9uZSIpOworICAgIGlmICgxICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJNRU1PUllfSEVBUF9ERVZJQ0VfTE9DQUxfQklUIik7CisgICAgaWYgKDIgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIk1FTU9SWV9IRUFQX01VTFRJX0lOU1RBTkNFX0JJVCIpOworfQordm9pZCBEdW1wVmtNZW1vcnlIZWFwRmxhZ3MoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtNZW1vcnlIZWFwRmxhZ3MgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa01lbW9yeUhlYXBGbGFncyhwLCBuYW1lLCBzdGF0aWNfY2FzdDxWa01lbW9yeUhlYXBGbGFnQml0cz4odmFsdWUpLCB3aWR0aCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrTWVtb3J5SGVhcEZsYWdCaXRzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrTWVtb3J5SGVhcEZsYWdCaXRzIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlKTsgcmV0dXJuOyB9CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBEdW1wVmtNZW1vcnlIZWFwRmxhZ3MocCwgbmFtZSwgdmFsdWUsIHdpZHRoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtNZW1vcnlQcm9wZXJ0eUZsYWdzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrTWVtb3J5UHJvcGVydHlGbGFnQml0cyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmICh2YWx1ZSA9PSAwKSBwLlByaW50RWxlbWVudCgiTm9uZSIpOworICAgIGlmICgxICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJNRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCIpOworICAgIGlmICgyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJNRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCIpOworICAgIGlmICg0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJNRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQiKTsKKyAgICBpZiAoOCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiTUVNT1JZX1BST1BFUlRZX0hPU1RfQ0FDSEVEX0JJVCIpOworICAgIGlmICgxNiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiTUVNT1JZX1BST1BFUlRZX0xBWklMWV9BTExPQ0FURURfQklUIik7CisgICAgaWYgKDMyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJNRU1PUllfUFJPUEVSVFlfUFJPVEVDVEVEX0JJVCIpOworICAgIGlmICg2NCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiTUVNT1JZX1BST1BFUlRZX0RFVklDRV9DT0hFUkVOVF9CSVRfQU1EIik7CisgICAgaWYgKDEyOCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiTUVNT1JZX1BST1BFUlRZX0RFVklDRV9VTkNBQ0hFRF9CSVRfQU1EIik7Cit9Cit2b2lkIER1bXBWa01lbW9yeVByb3BlcnR5RmxhZ3MoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlKTsgcmV0dXJuOyB9CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBEdW1wVmtNZW1vcnlQcm9wZXJ0eUZsYWdzKHAsIG5hbWUsIHN0YXRpY19jYXN0PFZrTWVtb3J5UHJvcGVydHlGbGFnQml0cz4odmFsdWUpLCB3aWR0aCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrTWVtb3J5UHJvcGVydHlGbGFnQml0cyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa01lbW9yeVByb3BlcnR5RmxhZ0JpdHMgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa01lbW9yeVByb3BlcnR5RmxhZ3MocCwgbmFtZSwgdmFsdWUsIHdpZHRoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQorc3RkOjpzdHJpbmcgVmtRdWV1ZUZsYWdzU3RyaW5nKFZrUXVldWVGbGFncyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIHN0ZDo6c3RyaW5nIG91dDsKKyAgICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoMSAmIHZhbHVlKSB7CisgICAgICAgIGlmIChpc19maXJzdCkgeyBpc19maXJzdCA9IGZhbHNlOyB9IGVsc2UgeyBvdXQgKz0gIiB8ICI7IH0KKyAgICAgICAgb3V0ICs9ICJRVUVVRV9HUkFQSElDUyI7CisgICAgfQorICAgIGlmICgyICYgdmFsdWUpIHsKKyAgICAgICAgaWYgKGlzX2ZpcnN0KSB7IGlzX2ZpcnN0ID0gZmFsc2U7IH0gZWxzZSB7IG91dCArPSAiIHwgIjsgfQorICAgICAgICBvdXQgKz0gIlFVRVVFX0NPTVBVVEUiOworICAgIH0KKyAgICBpZiAoNCAmIHZhbHVlKSB7CisgICAgICAgIGlmIChpc19maXJzdCkgeyBpc19maXJzdCA9IGZhbHNlOyB9IGVsc2UgeyBvdXQgKz0gIiB8ICI7IH0KKyAgICAgICAgb3V0ICs9ICJRVUVVRV9UUkFOU0ZFUiI7CisgICAgfQorICAgIGlmICg4ICYgdmFsdWUpIHsKKyAgICAgICAgaWYgKGlzX2ZpcnN0KSB7IGlzX2ZpcnN0ID0gZmFsc2U7IH0gZWxzZSB7IG91dCArPSAiIHwgIjsgfQorICAgICAgICBvdXQgKz0gIlFVRVVFX1NQQVJTRV9CSU5ESU5HIjsKKyAgICB9CisgICAgaWYgKDE2ICYgdmFsdWUpIHsKKyAgICAgICAgaWYgKGlzX2ZpcnN0KSB7IGlzX2ZpcnN0ID0gZmFsc2U7IH0gZWxzZSB7IG91dCArPSAiIHwgIjsgfQorICAgICAgICBvdXQgKz0gIlFVRVVFX1BST1RFQ1RFRCI7CisgICAgfQorICAgIHJldHVybiBvdXQ7Cit9Cit2b2lkIER1bXBWa1Jlc29sdmVNb2RlRmxhZ3NLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHZhbHVlID09IDApIHAuUHJpbnRFbGVtZW50KCJOb25lIik7CisgICAgaWYgKDAgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlJFU09MVkVfTU9ERV9OT05FX0tIUiIpOworICAgIGlmICgxICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJSRVNPTFZFX01PREVfU0FNUExFX1pFUk9fQklUX0tIUiIpOworICAgIGlmICgyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJSRVNPTFZFX01PREVfQVZFUkFHRV9CSVRfS0hSIik7CisgICAgaWYgKDQgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlJFU09MVkVfTU9ERV9NSU5fQklUX0tIUiIpOworICAgIGlmICg4ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJSRVNPTFZFX01PREVfTUFYX0JJVF9LSFIiKTsKK30KK3ZvaWQgRHVtcFZrUmVzb2x2ZU1vZGVGbGFnc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1Jlc29sdmVNb2RlRmxhZ3NLSFIgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa1Jlc29sdmVNb2RlRmxhZ3NLSFIocCwgbmFtZSwgc3RhdGljX2Nhc3Q8VmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSPih2YWx1ZSksIHdpZHRoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7IHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSk7IHJldHVybjsgfQorICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrUmVzb2x2ZU1vZGVGbGFnc0tIUihwLCBuYW1lLCB2YWx1ZSwgd2lkdGgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1NhbXBsZUNvdW50RmxhZ3MoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHZhbHVlID09IDApIHAuUHJpbnRFbGVtZW50KCJOb25lIik7CisgICAgaWYgKDEgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNBTVBMRV9DT1VOVF8xX0JJVCIpOworICAgIGlmICgyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTQU1QTEVfQ09VTlRfMl9CSVQiKTsKKyAgICBpZiAoNCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU0FNUExFX0NPVU5UXzRfQklUIik7CisgICAgaWYgKDggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNBTVBMRV9DT1VOVF84X0JJVCIpOworICAgIGlmICgxNiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU0FNUExFX0NPVU5UXzE2X0JJVCIpOworICAgIGlmICgzMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU0FNUExFX0NPVU5UXzMyX0JJVCIpOworICAgIGlmICg2NCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU0FNUExFX0NPVU5UXzY0X0JJVCIpOworfQordm9pZCBEdW1wVmtTYW1wbGVDb3VudEZsYWdzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU2FtcGxlQ291bnRGbGFncyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7IHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSk7IHJldHVybjsgfQorICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrU2FtcGxlQ291bnRGbGFncyhwLCBuYW1lLCBzdGF0aWNfY2FzdDxWa1NhbXBsZUNvdW50RmxhZ0JpdHM+KHZhbHVlKSwgd2lkdGgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1NhbXBsZUNvdW50RmxhZ0JpdHMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlKTsgcmV0dXJuOyB9CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBEdW1wVmtTYW1wbGVDb3VudEZsYWdzKHAsIG5hbWUsIHZhbHVlLCB3aWR0aCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrU2hhZGVyU3RhZ2VGbGFncyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAodmFsdWUgPT0gMCkgcC5QcmludEVsZW1lbnQoIk5vbmUiKTsKKyAgICBpZiAoMSAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQiKTsKKyAgICBpZiAoMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCIpOworICAgIGlmICg0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUIik7CisgICAgaWYgKDggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQiKTsKKyAgICBpZiAoMTYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQiKTsKKyAgICBpZiAoMzIgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNIQURFUl9TVEFHRV9DT01QVVRFX0JJVCIpOworICAgIGlmICgweDAwMDAwMDFGICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTSEFERVJfU1RBR0VfQUxMX0dSQVBISUNTIik7CisgICAgaWYgKDB4N0ZGRkZGRkYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNIQURFUl9TVEFHRV9BTEwiKTsKKyAgICBpZiAoMjU2ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OViIpOworICAgIGlmICg1MTIgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OViIpOworICAgIGlmICgxMDI0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WIik7CisgICAgaWYgKDIwNDggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNIQURFUl9TVEFHRV9NSVNTX0JJVF9OViIpOworICAgIGlmICg0MDk2ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OViIpOworICAgIGlmICg4MTkyICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTSEFERVJfU1RBR0VfQ0FMTEFCTEVfQklUX05WIik7CisgICAgaWYgKDY0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTSEFERVJfU1RBR0VfVEFTS19CSVRfTlYiKTsKKyAgICBpZiAoMTI4ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTSEFERVJfU1RBR0VfTUVTSF9CSVRfTlYiKTsKK30KK3ZvaWQgRHVtcFZrU2hhZGVyU3RhZ2VGbGFncyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1NoYWRlclN0YWdlRmxhZ3MgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa1NoYWRlclN0YWdlRmxhZ3MocCwgbmFtZSwgc3RhdGljX2Nhc3Q8VmtTaGFkZXJTdGFnZUZsYWdCaXRzPih2YWx1ZSksIHdpZHRoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtTaGFkZXJTdGFnZUZsYWdCaXRzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyB2YWx1ZSwgaW50IHdpZHRoID0gMCkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7IHAuUHJpbnRLZXlWYWx1ZShuYW1lLCB2YWx1ZSk7IHJldHVybjsgfQorICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrU2hhZGVyU3RhZ2VGbGFncyhwLCBuYW1lLCB2YWx1ZSwgd2lkdGgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1N1Ymdyb3VwRmVhdHVyZUZsYWdzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHMgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAodmFsdWUgPT0gMCkgcC5QcmludEVsZW1lbnQoIk5vbmUiKTsKKyAgICBpZiAoMSAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VCR1JPVVBfRkVBVFVSRV9CQVNJQ19CSVQiKTsKKyAgICBpZiAoMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VCR1JPVVBfRkVBVFVSRV9WT1RFX0JJVCIpOworICAgIGlmICg0ICYgdmFsdWUpIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJTVUJHUk9VUF9GRUFUVVJFX0FSSVRITUVUSUNfQklUIik7CisgICAgaWYgKDggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNVQkdST1VQX0ZFQVRVUkVfQkFMTE9UX0JJVCIpOworICAgIGlmICgxNiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX0JJVCIpOworICAgIGlmICgzMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX1JFTEFUSVZFX0JJVCIpOworICAgIGlmICg2NCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VCR1JPVVBfRkVBVFVSRV9DTFVTVEVSRURfQklUIik7CisgICAgaWYgKDEyOCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VCR1JPVVBfRkVBVFVSRV9RVUFEX0JJVCIpOworICAgIGlmICgyNTYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNVQkdST1VQX0ZFQVRVUkVfUEFSVElUSU9ORURfQklUX05WIik7Cit9Cit2b2lkIER1bXBWa1N1Ymdyb3VwRmVhdHVyZUZsYWdzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ3MgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa1N1Ymdyb3VwRmVhdHVyZUZsYWdzKHAsIG5hbWUsIHN0YXRpY19jYXN0PFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHM+KHZhbHVlKSwgd2lkdGgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1N1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHMgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa1N1Ymdyb3VwRmVhdHVyZUZsYWdzKHAsIG5hbWUsIHZhbHVlLCB3aWR0aCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHZhbHVlID09IDApIHAuUHJpbnRFbGVtZW50KCJOb25lIik7CisgICAgaWYgKDEgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNVUkZBQ0VfVFJBTlNGT1JNX0lERU5USVRZX0JJVF9LSFIiKTsKKyAgICBpZiAoMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VSRkFDRV9UUkFOU0ZPUk1fUk9UQVRFXzkwX0JJVF9LSFIiKTsKKyAgICBpZiAoNCAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VSRkFDRV9UUkFOU0ZPUk1fUk9UQVRFXzE4MF9CSVRfS0hSIik7CisgICAgaWYgKDggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV8yNzBfQklUX0tIUiIpOworICAgIGlmICgxNiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfQklUX0tIUiIpOworICAgIGlmICgzMiAmIHZhbHVlKSBwLlNldEFzVHlwZSgpLlByaW50RWxlbWVudCgiU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzkwX0JJVF9LSFIiKTsKKyAgICBpZiAoNjQgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8xODBfQklUX0tIUiIpOworICAgIGlmICgxMjggJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8yNzBfQklUX0tIUiIpOworICAgIGlmICgyNTYgJiB2YWx1ZSkgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoIlNVUkZBQ0VfVFJBTlNGT1JNX0lOSEVSSVRfQklUX0tIUiIpOworfQordm9pZCBEdW1wVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIgdmFsdWUsIGludCB3aWR0aCA9IDApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeyBwLlByaW50S2V5VmFsdWUobmFtZSwgdmFsdWUpOyByZXR1cm47IH0KKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUihwLCBuYW1lLCBzdGF0aWNfY2FzdDxWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUj4odmFsdWUpLCB3aWR0aCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHZhbHVlLCBpbnQgd2lkdGggPSAwKSB7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsgcC5QcmludEtleVZhbHVlKG5hbWUsIHZhbHVlKTsgcmV0dXJuOyB9CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBEdW1wVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ3NLSFIocCwgbmFtZSwgdmFsdWUsIHdpZHRoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUICZvYmopOwordm9pZCBEdW1wVmtFeHRlbnQyRChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0V4dGVudDJEICZvYmopOwordm9pZCBEdW1wVmtFeHRlbnQzRChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0V4dGVudDNEICZvYmopOwordm9pZCBEdW1wVmtMYXllclByb3BlcnRpZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtMYXllclByb3BlcnRpZXMgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlTGltaXRzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcyAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgJm9iaik7Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCAmb2JqKTsKK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSICZvYmopOwordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUICZvYmopOwordm9pZCBEdW1wVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICZvYmopOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3ZvaWQgRHVtcFZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCAmb2JqKTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgordm9pZCBEdW1wVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiAmb2JqKTsKK3ZvaWQgRHVtcFZrU3VyZmFjZUZvcm1hdEtIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1N1cmZhY2VGb3JtYXRLSFIgJm9iaik7Cit2b2lkIER1bXBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSICZvYmopOwordm9pZCBEdW1wVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleVZhbHVlKCJkcm1Gb3JtYXRNb2RpZmllciIsIG9iai5kcm1Gb3JtYXRNb2RpZmllciwgMjcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgiZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50Iiwgb2JqLmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCwgMjcpOworICAgIER1bXBWa0Zvcm1hdEZlYXR1cmVGbGFncyhwLCAiZHJtRm9ybWF0TW9kaWZpZXJUaWxpbmdGZWF0dXJlcyIsIG9iai5kcm1Gb3JtYXRNb2RpZmllclRpbGluZ0ZlYXR1cmVzLCAyNyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleVZhbHVlKCJkcm1Gb3JtYXRNb2RpZmllckNvdW50Iiwgb2JqLmRybUZvcm1hdE1vZGlmaWVyQ291bnQsIDUyKTsKKyAgICBwLkFycmF5U3RhcnQoInBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMiLCBvYmouZHJtRm9ybWF0TW9kaWZpZXJDb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG9iai5kcm1Gb3JtYXRNb2RpZmllckNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG9iai5wRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHAuU2V0RWxlbWVudEluZGV4KGkpOworICAgICAgICAgICAgRHVtcFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKHAsICJwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzIiwgb2JqLnBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHAuQXJyYXlFbmQoKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtFeHRlbnQyRChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0V4dGVudDJEICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgid2lkdGgiLCBvYmoud2lkdGgsIDYpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgiaGVpZ2h0Iiwgb2JqLmhlaWdodCwgNik7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrRXh0ZW50M0QoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtFeHRlbnQzRCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIndpZHRoIiwgb2JqLndpZHRoLCA2KTsKKyAgICBwLlByaW50S2V5VmFsdWUoImhlaWdodCIsIG9iai5oZWlnaHQsIDYpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgiZGVwdGgiLCBvYmouZGVwdGgsIDYpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa0xheWVyUHJvcGVydGllcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa0xheWVyUHJvcGVydGllcyAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5U3RyaW5nKCJsYXllck5hbWUiLCBvYmoubGF5ZXJOYW1lLCAyMSk7CisgICAgcC5QcmludEtleVZhbHVlKCJzcGVjVmVyc2lvbiIsIG9iai5zcGVjVmVyc2lvbiwgMjEpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgiaW1wbGVtZW50YXRpb25WZXJzaW9uIiwgb2JqLmltcGxlbWVudGF0aW9uVmVyc2lvbiwgMjEpOworICAgIHAuUHJpbnRLZXlTdHJpbmcoImRlc2NyaXB0aW9uIiwgb2JqLmRlc2NyaXB0aW9uLCAyMSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MpLCAzNCk7CisgICAgcC5QcmludEtleUJvb2woInVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyksIDM0KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3RvcmFnZVB1c2hDb25zdGFudDE2Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnN0b3JhZ2VQdXNoQ29uc3RhbnQxNiksIDM0KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3RvcmFnZUlucHV0T3V0cHV0MTYiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc3RvcmFnZUlucHV0T3V0cHV0MTYpLCAzNCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJzdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyksIDMzKTsKKyAgICBwLlByaW50S2V5Qm9vbCgidW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyksIDMzKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3RvcmFnZVB1c2hDb25zdGFudDgiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc3RvcmFnZVB1c2hDb25zdGFudDgpLCAzMyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmRlY29kZU1vZGVTaGFyZWRFeHBvbmVudCksIDI0KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJhZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMpLCAzMSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleVZhbHVlKCJhZHZhbmNlZEJsZW5kTWF4Q29sb3JBdHRhY2htZW50cyIsIG9iai5hZHZhbmNlZEJsZW5kTWF4Q29sb3JBdHRhY2htZW50cywgMzcpOworICAgIHAuUHJpbnRLZXlCb29sKCJhZHZhbmNlZEJsZW5kSW5kZXBlbmRlbnRCbGVuZCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5hZHZhbmNlZEJsZW5kSW5kZXBlbmRlbnRCbGVuZCksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWRTcmNDb2xvciIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5hZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yKSwgMzcpOworICAgIHAuUHJpbnRLZXlCb29sKCJhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZERzdENvbG9yIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3IpLCAzNyk7CisgICAgcC5QcmludEtleUJvb2woImFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5hZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXApLCAzNyk7CisgICAgcC5QcmludEtleUJvb2woImFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zKSwgMzcpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woImJ1ZmZlckRldmljZUFkZHJlc3MiLCBzdGF0aWNfY2FzdDxib29sPihvYmouYnVmZmVyRGV2aWNlQWRkcmVzcyksIDMyKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkiLCBzdGF0aWNfY2FzdDxib29sPihvYmouYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkpLCAzMik7CisgICAgcC5QcmludEtleUJvb2woImJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UpLCAzMik7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJjb25kaXRpb25hbFJlbmRlcmluZyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5jb25kaXRpb25hbFJlbmRlcmluZyksIDI5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiaW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmciLCBzdGF0aWNfY2FzdDxib29sPihvYmouaW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmcpLCAyOSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleVZhbHVlKCJwcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemUiLCBvYmoucHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplLCA0Myk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSIsIG9iai5tYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSwgNDMpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgiZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemVHcmFudWxhcml0eSIsIG9iai5leHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5LCA0Myk7CisgICAgcC5QcmludEtleUJvb2woInByaW1pdGl2ZVVuZGVyZXN0aW1hdGlvbiIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5wcmltaXRpdmVVbmRlcmVzdGltYXRpb24pLCA0Myk7CisgICAgcC5QcmludEtleUJvb2woImNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb24iLCBzdGF0aWNfY2FzdDxib29sPihvYmouY29uc2VydmF0aXZlUG9pbnRBbmRMaW5lUmFzdGVyaXphdGlvbiksIDQzKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQpLCA0Myk7CisgICAgcC5QcmludEtleUJvb2woImRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVnZW5lcmF0ZUxpbmVzUmFzdGVyaXplZCksIDQzKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZnVsbHlDb3ZlcmVkRnJhZ21lbnRTaGFkZXJJbnB1dFZhcmlhYmxlIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZSksIDQzKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qb3N0RGVwdGhDb3ZlcmFnZSksIDQzKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZGVwdGhDbGlwRW5hYmxlIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmRlcHRoQ2xpcEVuYWJsZSksIDE1KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBEdW1wVmtSZXNvbHZlTW9kZUZsYWdzS0hSKHAsICJzdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlcyIsIG9iai5zdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlcywgMjIpOworICAgIER1bXBWa1Jlc29sdmVNb2RlRmxhZ3NLSFIocCwgInN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXMiLCBvYmouc3VwcG9ydGVkU3RlbmNpbFJlc29sdmVNb2RlcywgMjIpOworICAgIHAuUHJpbnRLZXlCb29sKCJpbmRlcGVuZGVudFJlc29sdmVOb25lIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmluZGVwZW5kZW50UmVzb2x2ZU5vbmUpLCAyMik7CisgICAgcC5QcmludEtleUJvb2woImluZGVwZW5kZW50UmVzb2x2ZSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5pbmRlcGVuZGVudFJlc29sdmUpLCAyMik7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nKSwgNTApOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyksIDUwKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcpLCA1MCk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcpLCA1MCk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKSwgNTApOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmciLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKSwgNTApOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyksIDUwKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmciLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcpLCA1MCk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKSwgNTApOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyksIDUwKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCksIDUwKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQpLCA1MCk7CisgICAgcC5QcmludEtleUJvb2woImRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kKSwgNTApOworICAgIHAuUHJpbnRLZXlCb29sKCJkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKSwgNTApOworICAgIHAuUHJpbnRLZXlCb29sKCJkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCksIDUwKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQpLCA1MCk7CisgICAgcC5QcmludEtleUJvb2woImRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nKSwgNTApOworICAgIHAuUHJpbnRLZXlCb29sKCJkZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQpLCA1MCk7CisgICAgcC5QcmludEtleUJvb2woImRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudCksIDUwKTsKKyAgICBwLlByaW50S2V5Qm9vbCgicnVudGltZURlc2NyaXB0b3JBcnJheSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5ydW50aW1lRGVzY3JpcHRvckFycmF5KSwgNTApOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29scyIsIG9iai5tYXhVcGRhdGVBZnRlckJpbmREZXNjcmlwdG9yc0luQWxsUG9vbHMsIDUyKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSksIDUyKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUpLCA1Mik7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUpLCA1Mik7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlKSwgNTIpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSksIDUyKTsKKyAgICBwLlByaW50S2V5Qm9vbCgicm9idXN0QnVmZmVyQWNjZXNzVXBkYXRlQWZ0ZXJCaW5kIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnJvYnVzdEJ1ZmZlckFjY2Vzc1VwZGF0ZUFmdGVyQmluZCksIDUyKTsKKyAgICBwLlByaW50S2V5Qm9vbCgicXVhZERpdmVyZ2VudEltcGxpY2l0TG9kIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnF1YWREaXZlcmdlbnRJbXBsaWNpdExvZCksIDUyKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzIiwgb2JqLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzLCA1Mik7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycyIsIG9iai5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycywgNTIpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMiLCBvYmoubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMsIDUyKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMiLCBvYmoubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlcywgNTIpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyIsIG9iai5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzLCA1Mik7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzIiwgb2JqLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMsIDUyKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzIiwgb2JqLm1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzLCA1Mik7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMiLCBvYmoubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzLCA1Mik7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMiLCBvYmoubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzLCA1Mik7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljIiwgb2JqLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyc0R5bmFtaWMsIDUyKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyIsIG9iai5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMsIDUyKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWMiLCBvYmoubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzRHluYW1pYywgNTIpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMiLCBvYmoubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMsIDUyKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzIiwgb2JqLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzLCA1Mik7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyIsIG9iai5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cywgNTIpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4RGlzY2FyZFJlY3RhbmdsZXMiLCBvYmoubWF4RGlzY2FyZFJlY3RhbmdsZXMsIDIwKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrRHJpdmVySWRLSFIocCwgImRyaXZlcklEIiwgb2JqLmRyaXZlcklELCAxOCk7CisgICAgcC5QcmludEtleVN0cmluZygiZHJpdmVyTmFtZSIsIG9iai5kcml2ZXJOYW1lLCAxOCk7CisgICAgcC5QcmludEtleVN0cmluZygiZHJpdmVySW5mbyIsIG9iai5kcml2ZXJJbmZvLCAxOCk7CisgICAgcC5QcmludEtleVZhbHVlKCJjb25mb3JtYW5jZVZlcnNpb24iLCBvYmouY29uZm9ybWFuY2VWZXJzaW9uLCAxOCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudCIsIHRvX2hleF9zdHIocCwgb2JqLm1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQpLCAzMSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInJvYnVzdEJ1ZmZlckFjY2VzcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5yb2J1c3RCdWZmZXJBY2Nlc3MpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woImZ1bGxEcmF3SW5kZXhVaW50MzIiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZnVsbERyYXdJbmRleFVpbnQzMiksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiaW1hZ2VDdWJlQXJyYXkiLCBzdGF0aWNfY2FzdDxib29sPihvYmouaW1hZ2VDdWJlQXJyYXkpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woImluZGVwZW5kZW50QmxlbmQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouaW5kZXBlbmRlbnRCbGVuZCksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZ2VvbWV0cnlTaGFkZXIiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZ2VvbWV0cnlTaGFkZXIpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInRlc3NlbGxhdGlvblNoYWRlciIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai50ZXNzZWxsYXRpb25TaGFkZXIpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNhbXBsZVJhdGVTaGFkaW5nIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNhbXBsZVJhdGVTaGFkaW5nKSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJkdWFsU3JjQmxlbmQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZHVhbFNyY0JsZW5kKSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJsb2dpY09wIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmxvZ2ljT3ApLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woIm11bHRpRHJhd0luZGlyZWN0Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLm11bHRpRHJhd0luZGlyZWN0KSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2UpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woImRlcHRoQ2xhbXAiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVwdGhDbGFtcCksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZGVwdGhCaWFzQ2xhbXAiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVwdGhCaWFzQ2xhbXApLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woImZpbGxNb2RlTm9uU29saWQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZmlsbE1vZGVOb25Tb2xpZCksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZGVwdGhCb3VuZHMiLCBzdGF0aWNfY2FzdDxib29sPihvYmouZGVwdGhCb3VuZHMpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woIndpZGVMaW5lcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai53aWRlTGluZXMpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woImxhcmdlUG9pbnRzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmxhcmdlUG9pbnRzKSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJhbHBoYVRvT25lIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmFscGhhVG9PbmUpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woIm11bHRpVmlld3BvcnQiLCBzdGF0aWNfY2FzdDxib29sPihvYmoubXVsdGlWaWV3cG9ydCksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2FtcGxlckFuaXNvdHJvcHkiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2FtcGxlckFuaXNvdHJvcHkpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInRleHR1cmVDb21wcmVzc2lvbkVUQzIiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudGV4dHVyZUNvbXByZXNzaW9uRVRDMiksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgidGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInRleHR1cmVDb21wcmVzc2lvbkJDIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnRleHR1cmVDb21wcmVzc2lvbkJDKSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJvY2NsdXNpb25RdWVyeVByZWNpc2UiLCBzdGF0aWNfY2FzdDxib29sPihvYmoub2NjbHVzaW9uUXVlcnlQcmVjaXNlKSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJwaXBlbGluZVN0YXRpc3RpY3NRdWVyeSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5waXBlbGluZVN0YXRpc3RpY3NRdWVyeSksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgidmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0cyksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0KSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0KSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nKSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmcpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlckNsaXBEaXN0YW5jZSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJDbGlwRGlzdGFuY2UpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlckN1bGxEaXN0YW5jZSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJDdWxsRGlzdGFuY2UpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlckZsb2F0NjQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyRmxvYXQ2NCksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVySW50NjQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVySW50NjQpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlckludDE2Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckludDE2KSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyUmVzb3VyY2VNaW5Mb2QiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyUmVzb3VyY2VNaW5Mb2QpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNwYXJzZUJpbmRpbmciLCBzdGF0aWNfY2FzdDxib29sPihvYmouc3BhcnNlQmluZGluZyksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3BhcnNlUmVzaWRlbmN5QnVmZmVyIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNwYXJzZVJlc2lkZW5jeUJ1ZmZlciksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zcGFyc2VSZXNpZGVuY3lJbWFnZTJEKSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJzcGFyc2VSZXNpZGVuY3lJbWFnZTNEIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNwYXJzZVJlc2lkZW5jeUltYWdlM0QpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzKSwgMzkpOworICAgIHAuUHJpbnRLZXlCb29sKCJzcGFyc2VSZXNpZGVuY3k0U2FtcGxlcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zcGFyc2VSZXNpZGVuY3k0U2FtcGxlcyksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woInNwYXJzZVJlc2lkZW5jeUFsaWFzZWQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc3BhcnNlUmVzaWRlbmN5QWxpYXNlZCksIDM5KTsKKyAgICBwLlByaW50S2V5Qm9vbCgidmFyaWFibGVNdWx0aXNhbXBsZVJhdGUiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudmFyaWFibGVNdWx0aXNhbXBsZVJhdGUpLCAzOSk7CisgICAgcC5QcmludEtleUJvb2woImluaGVyaXRlZFF1ZXJpZXMiLCBzdGF0aWNfY2FzdDxib29sPihvYmouaW5oZXJpdGVkUXVlcmllcyksIDM5KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBEdW1wVmtTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSKHAsICJkZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZSIsIG9iai5kZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZSwgMzcpOworICAgIER1bXBWa1NoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFIocCwgInJvdW5kaW5nTW9kZUluZGVwZW5kZW5jZSIsIG9iai5yb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UsIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQxNiIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2KSwgMzcpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDMyIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzIpLCAzNyk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0NjQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NCksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDE2Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQxNiksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDMyIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMiksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDY0Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQ2NCksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDE2Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQxNiksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDMyIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMiksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDY0Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQ2NCksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQxNiIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2KSwgMzcpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDMyIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzIpLCAzNyk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0NjQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NCksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQxNiIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2KSwgMzcpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDMyIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzIpLCAzNyk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0NjQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NCksIDM3KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZnJhZ21lbnREZW5zaXR5TWFwIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmZyYWdtZW50RGVuc2l0eU1hcCksIDM3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5mcmFnbWVudERlbnNpdHlNYXBEeW5hbWljKSwgMzcpOworICAgIHAuUHJpbnRLZXlCb29sKCJmcmFnbWVudERlbnNpdHlNYXBOb25TdWJzYW1wbGVkSW1hZ2VzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmZyYWdtZW50RGVuc2l0eU1hcE5vblN1YnNhbXBsZWRJbWFnZXMpLCAzNyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa0V4dGVudDJEKHAsICJtaW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemUiLCBvYmoubWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplKTsKKyAgICBEdW1wVmtFeHRlbnQyRChwLCAibWF4RnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplIiwgb2JqLm1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSk7CisgICAgcC5QcmludEtleUJvb2woImZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zKSwgMjYpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2siLCBzdGF0aWNfY2FzdDxib29sPihvYmouZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2spLCAzNCk7CisgICAgcC5QcmludEtleUJvb2woImZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2siLCBzdGF0aWNfY2FzdDxib29sPihvYmouZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9jayksIDM0KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jayIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5mcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrKSwgMzQpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiaG9zdFF1ZXJ5UmVzZXQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouaG9zdFF1ZXJ5UmVzZXQpLCAxNCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5U3RyaW5nKCJkZXZpY2VVVUlEIiwgdG9fc3RyaW5nXzE2KG9iai5kZXZpY2VVVUlEKSwgMTUpOworICAgIHAuUHJpbnRLZXlTdHJpbmcoImRyaXZlclVVSUQiLCB0b19zdHJpbmdfMTYob2JqLmRyaXZlclVVSUQpLCAxNSk7CisgICAgaWYgKG9iai5kZXZpY2VMVUlEVmFsaWQpIHAuUHJpbnRLZXlTdHJpbmcoImRldmljZUxVSUQiLCB0b19zdHJpbmdfOChvYmouZGV2aWNlTFVJRCksIDE1KTsKKyAgICBwLlByaW50S2V5VmFsdWUoImRldmljZU5vZGVNYXNrIiwgb2JqLmRldmljZU5vZGVNYXNrLCAxNSk7CisgICAgcC5QcmludEtleUJvb2woImRldmljZUxVSURWYWxpZCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5kZXZpY2VMVUlEVmFsaWQpLCAxNSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJpbWFnZWxlc3NGcmFtZWJ1ZmZlciIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5pbWFnZWxlc3NGcmFtZWJ1ZmZlciksIDIwKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woImluZGV4VHlwZVVpbnQ4Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmluZGV4VHlwZVVpbnQ4KSwgMTQpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJpbmxpbmVVbmlmb3JtQmxvY2siLCBzdGF0aWNfY2FzdDxib29sPihvYmouaW5saW5lVW5pZm9ybUJsb2NrKSwgNTApOworICAgIHAuUHJpbnRLZXlCb29sKCJkZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5kZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZCksIDUwKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplIiwgb2JqLm1heElubGluZVVuaWZvcm1CbG9ja1NpemUsIDU1KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3MiLCBvYmoubWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrcywgNTUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcyIsIG9iai5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzLCA1NSk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrcyIsIG9iai5tYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrcywgNTUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MiLCBvYmoubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MsIDU1KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZUxpbWl0cyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICZvYmopIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikKKyAgICAgICAgcC5PYmplY3RTdGFydCgibGltaXRzIik7CisgICAgZWxzZQorICAgICAgICBwLlNldFN1YkhlYWRlcigpLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4SW1hZ2VEaW1lbnNpb24xRCIsIG9iai5tYXhJbWFnZURpbWVuc2lvbjFELCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhJbWFnZURpbWVuc2lvbjJEIiwgb2JqLm1heEltYWdlRGltZW5zaW9uMkQsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heEltYWdlRGltZW5zaW9uM0QiLCBvYmoubWF4SW1hZ2VEaW1lbnNpb24zRCwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4SW1hZ2VEaW1lbnNpb25DdWJlIiwgb2JqLm1heEltYWdlRGltZW5zaW9uQ3ViZSwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4SW1hZ2VBcnJheUxheWVycyIsIG9iai5tYXhJbWFnZUFycmF5TGF5ZXJzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhUZXhlbEJ1ZmZlckVsZW1lbnRzIiwgb2JqLm1heFRleGVsQnVmZmVyRWxlbWVudHMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFVuaWZvcm1CdWZmZXJSYW5nZSIsIG9iai5tYXhVbmlmb3JtQnVmZmVyUmFuZ2UsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFN0b3JhZ2VCdWZmZXJSYW5nZSIsIG9iai5tYXhTdG9yYWdlQnVmZmVyUmFuZ2UsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFB1c2hDb25zdGFudHNTaXplIiwgb2JqLm1heFB1c2hDb25zdGFudHNTaXplLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhNZW1vcnlBbGxvY2F0aW9uQ291bnQiLCBvYmoubWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50LCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50Iiwgb2JqLm1heFNhbXBsZXJBbGxvY2F0aW9uQ291bnQsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoImJ1ZmZlckltYWdlR3JhbnVsYXJpdHkiLCB0b19oZXhfc3RyKHAsIG9iai5idWZmZXJJbWFnZUdyYW51bGFyaXR5KSwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgic3BhcnNlQWRkcmVzc1NwYWNlU2l6ZSIsIHRvX2hleF9zdHIocCwgb2JqLnNwYXJzZUFkZHJlc3NTcGFjZVNpemUpLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhCb3VuZERlc2NyaXB0b3JTZXRzIiwgb2JqLm1heEJvdW5kRGVzY3JpcHRvclNldHMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzIiwgb2JqLm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyIsIG9iai5tYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMiLCBvYmoubWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZWRJbWFnZXMiLCBvYmoubWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUltYWdlcyIsIG9iai5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzIiwgb2JqLm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFBlclN0YWdlUmVzb3VyY2VzIiwgb2JqLm1heFBlclN0YWdlUmVzb3VyY2VzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMiLCBvYmoubWF4RGVzY3JpcHRvclNldFNhbXBsZXJzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMiLCBvYmoubWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljIiwgb2JqLm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyIsIG9iai5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWMiLCBvYmoubWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMiLCBvYmoubWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzIiwgb2JqLm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cyIsIG9iai5tYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzIiwgb2JqLm1heFZlcnRleElucHV0QXR0cmlidXRlcywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VmVydGV4SW5wdXRCaW5kaW5ncyIsIG9iai5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldCIsIG9iai5tYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldCwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VmVydGV4SW5wdXRCaW5kaW5nU3RyaWRlIiwgb2JqLm1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyIsIG9iai5tYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhUZXNzZWxsYXRpb25HZW5lcmF0aW9uTGV2ZWwiLCBvYmoubWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhUZXNzZWxsYXRpb25QYXRjaFNpemUiLCBvYmoubWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzIiwgb2JqLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIiwgb2JqLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzIiwgb2JqLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJQYXRjaE91dHB1dENvbXBvbmVudHMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xUb3RhbE91dHB1dENvbXBvbmVudHMiLCBvYmoubWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyIsIG9iai5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyIsIG9iai5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucyIsIG9iai5tYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyIsIG9iai5tYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIiwgb2JqLm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyIsIG9iai5tYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cyIsIG9iai5tYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMiLCBvYmoubWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heEZyYWdtZW50T3V0cHV0QXR0YWNobWVudHMiLCBvYmoubWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHMiLCBvYmoubWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heEZyYWdtZW50Q29tYmluZWRPdXRwdXRSZXNvdXJjZXMiLCBvYmoubWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlcywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemUiLCBvYmoubWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemUsIDQ3KTsKKyAgICBwLkFycmF5U3RhcnQoIm1heENvbXB1dGVXb3JrR3JvdXBDb3VudCIsIDMpOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMF0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMl0pOworICAgIHAuQXJyYXlFbmQoKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyIsIG9iai5tYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMsIDQ3KTsKKyAgICBwLkFycmF5U3RhcnQoIm1heENvbXB1dGVXb3JrR3JvdXBTaXplIiwgMyk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLm1heENvbXB1dGVXb3JrR3JvdXBTaXplWzBdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmoubWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMV0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSk7CisgICAgcC5BcnJheUVuZCgpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgic3ViUGl4ZWxQcmVjaXNpb25CaXRzIiwgb2JqLnN1YlBpeGVsUHJlY2lzaW9uQml0cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgic3ViVGV4ZWxQcmVjaXNpb25CaXRzIiwgb2JqLnN1YlRleGVsUHJlY2lzaW9uQml0cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWlwbWFwUHJlY2lzaW9uQml0cyIsIG9iai5taXBtYXBQcmVjaXNpb25CaXRzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEcmF3SW5kZXhlZEluZGV4VmFsdWUiLCBvYmoubWF4RHJhd0luZGV4ZWRJbmRleFZhbHVlLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhEcmF3SW5kaXJlY3RDb3VudCIsIG9iai5tYXhEcmF3SW5kaXJlY3RDb3VudCwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4U2FtcGxlckxvZEJpYXMiLCBvYmoubWF4U2FtcGxlckxvZEJpYXMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFNhbXBsZXJBbmlzb3Ryb3B5Iiwgb2JqLm1heFNhbXBsZXJBbmlzb3Ryb3B5LCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhWaWV3cG9ydHMiLCBvYmoubWF4Vmlld3BvcnRzLCA0Nyk7CisgICAgcC5BcnJheVN0YXJ0KCJtYXhWaWV3cG9ydERpbWVuc2lvbnMiLCAyKTsKKyAgICBwLlByaW50RWxlbWVudChvYmoubWF4Vmlld3BvcnREaW1lbnNpb25zWzBdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmoubWF4Vmlld3BvcnREaW1lbnNpb25zWzFdKTsKKyAgICBwLkFycmF5RW5kKCk7CisgICAgcC5BcnJheVN0YXJ0KCJ2aWV3cG9ydEJvdW5kc1JhbmdlIiwgMik7CisgICAgcC5QcmludEVsZW1lbnQob2JqLnZpZXdwb3J0Qm91bmRzUmFuZ2VbMF0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai52aWV3cG9ydEJvdW5kc1JhbmdlWzFdKTsKKyAgICBwLkFycmF5RW5kKCk7CisgICAgcC5QcmludEtleVZhbHVlKCJ2aWV3cG9ydFN1YlBpeGVsQml0cyIsIG9iai52aWV3cG9ydFN1YlBpeGVsQml0cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWluTWVtb3J5TWFwQWxpZ25tZW50Iiwgb2JqLm1pbk1lbW9yeU1hcEFsaWdubWVudCwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQiLCB0b19oZXhfc3RyKHAsIG9iai5taW5UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudCksIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiLCB0b19oZXhfc3RyKHAsIG9iai5taW5Vbmlmb3JtQnVmZmVyT2Zmc2V0QWxpZ25tZW50KSwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCIsIHRvX2hleF9zdHIocCwgb2JqLm1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQpLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtaW5UZXhlbE9mZnNldCIsIG9iai5taW5UZXhlbE9mZnNldCwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VGV4ZWxPZmZzZXQiLCBvYmoubWF4VGV4ZWxPZmZzZXQsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1pblRleGVsR2F0aGVyT2Zmc2V0Iiwgb2JqLm1pblRleGVsR2F0aGVyT2Zmc2V0LCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhUZXhlbEdhdGhlck9mZnNldCIsIG9iai5tYXhUZXhlbEdhdGhlck9mZnNldCwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWluSW50ZXJwb2xhdGlvbk9mZnNldCIsIG9iai5taW5JbnRlcnBvbGF0aW9uT2Zmc2V0LCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhJbnRlcnBvbGF0aW9uT2Zmc2V0Iiwgb2JqLm1heEludGVycG9sYXRpb25PZmZzZXQsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoInN1YlBpeGVsSW50ZXJwb2xhdGlvbk9mZnNldEJpdHMiLCBvYmouc3ViUGl4ZWxJbnRlcnBvbGF0aW9uT2Zmc2V0Qml0cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4RnJhbWVidWZmZXJXaWR0aCIsIG9iai5tYXhGcmFtZWJ1ZmZlcldpZHRoLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhGcmFtZWJ1ZmZlckhlaWdodCIsIG9iai5tYXhGcmFtZWJ1ZmZlckhlaWdodCwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4RnJhbWVidWZmZXJMYXllcnMiLCBvYmoubWF4RnJhbWVidWZmZXJMYXllcnMsIDQ3KTsKKyAgICBEdW1wVmtTYW1wbGVDb3VudEZsYWdzKHAsICJmcmFtZWJ1ZmZlckNvbG9yU2FtcGxlQ291bnRzIiwgb2JqLmZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHMsIDQ3KTsKKyAgICBEdW1wVmtTYW1wbGVDb3VudEZsYWdzKHAsICJmcmFtZWJ1ZmZlckRlcHRoU2FtcGxlQ291bnRzIiwgb2JqLmZyYW1lYnVmZmVyRGVwdGhTYW1wbGVDb3VudHMsIDQ3KTsKKyAgICBEdW1wVmtTYW1wbGVDb3VudEZsYWdzKHAsICJmcmFtZWJ1ZmZlclN0ZW5jaWxTYW1wbGVDb3VudHMiLCBvYmouZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzLCA0Nyk7CisgICAgRHVtcFZrU2FtcGxlQ291bnRGbGFncyhwLCAiZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzIiwgb2JqLmZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50cywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4Q29sb3JBdHRhY2htZW50cyIsIG9iai5tYXhDb2xvckF0dGFjaG1lbnRzLCA0Nyk7CisgICAgRHVtcFZrU2FtcGxlQ291bnRGbGFncyhwLCAic2FtcGxlZEltYWdlQ29sb3JTYW1wbGVDb3VudHMiLCBvYmouc2FtcGxlZEltYWdlQ29sb3JTYW1wbGVDb3VudHMsIDQ3KTsKKyAgICBEdW1wVmtTYW1wbGVDb3VudEZsYWdzKHAsICJzYW1wbGVkSW1hZ2VJbnRlZ2VyU2FtcGxlQ291bnRzIiwgb2JqLnNhbXBsZWRJbWFnZUludGVnZXJTYW1wbGVDb3VudHMsIDQ3KTsKKyAgICBEdW1wVmtTYW1wbGVDb3VudEZsYWdzKHAsICJzYW1wbGVkSW1hZ2VEZXB0aFNhbXBsZUNvdW50cyIsIG9iai5zYW1wbGVkSW1hZ2VEZXB0aFNhbXBsZUNvdW50cywgNDcpOworICAgIER1bXBWa1NhbXBsZUNvdW50RmxhZ3MocCwgInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiLCBvYmouc2FtcGxlZEltYWdlU3RlbmNpbFNhbXBsZUNvdW50cywgNDcpOworICAgIER1bXBWa1NhbXBsZUNvdW50RmxhZ3MocCwgInN0b3JhZ2VJbWFnZVNhbXBsZUNvdW50cyIsIG9iai5zdG9yYWdlSW1hZ2VTYW1wbGVDb3VudHMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFNhbXBsZU1hc2tXb3JkcyIsIG9iai5tYXhTYW1wbGVNYXNrV29yZHMsIDQ3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgidGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnRpbWVzdGFtcENvbXB1dGVBbmRHcmFwaGljcyksIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoInRpbWVzdGFtcFBlcmlvZCIsIG9iai50aW1lc3RhbXBQZXJpb2QsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heENsaXBEaXN0YW5jZXMiLCBvYmoubWF4Q2xpcERpc3RhbmNlcywgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4Q3VsbERpc3RhbmNlcyIsIG9iai5tYXhDdWxsRGlzdGFuY2VzLCA0Nyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzIiwgb2JqLm1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXMsIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoImRpc2NyZXRlUXVldWVQcmlvcml0aWVzIiwgb2JqLmRpc2NyZXRlUXVldWVQcmlvcml0aWVzLCA0Nyk7CisgICAgcC5BcnJheVN0YXJ0KCJwb2ludFNpemVSYW5nZSIsIDIpOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5wb2ludFNpemVSYW5nZVswXSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLnBvaW50U2l6ZVJhbmdlWzFdKTsKKyAgICBwLkFycmF5RW5kKCk7CisgICAgcC5BcnJheVN0YXJ0KCJsaW5lV2lkdGhSYW5nZSIsIDIpOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5saW5lV2lkdGhSYW5nZVswXSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmxpbmVXaWR0aFJhbmdlWzFdKTsKKyAgICBwLkFycmF5RW5kKCk7CisgICAgcC5QcmludEtleVZhbHVlKCJwb2ludFNpemVHcmFudWxhcml0eSIsIG9iai5wb2ludFNpemVHcmFudWxhcml0eSwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibGluZVdpZHRoR3JhbnVsYXJpdHkiLCBvYmoubGluZVdpZHRoR3JhbnVsYXJpdHksIDQ3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3RyaWN0TGluZXMiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc3RyaWN0TGluZXMpLCA0Nyk7CisgICAgcC5QcmludEtleUJvb2woInN0YW5kYXJkU2FtcGxlTG9jYXRpb25zIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnN0YW5kYXJkU2FtcGxlTG9jYXRpb25zKSwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgib3B0aW1hbEJ1ZmZlckNvcHlPZmZzZXRBbGlnbm1lbnQiLCB0b19oZXhfc3RyKHAsIG9iai5vcHRpbWFsQnVmZmVyQ29weU9mZnNldEFsaWdubWVudCksIDQ3KTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm9wdGltYWxCdWZmZXJDb3B5Um93UGl0Y2hBbGlnbm1lbnQiLCB0b19oZXhfc3RyKHAsIG9iai5vcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50KSwgNDcpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibm9uQ29oZXJlbnRBdG9tU2l6ZSIsIHRvX2hleF9zdHIocCwgb2JqLm5vbkNvaGVyZW50QXRvbVNpemUpLCA0Nyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJyZWN0YW5ndWxhckxpbmVzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnJlY3Rhbmd1bGFyTGluZXMpLCAyNCk7CisgICAgcC5QcmludEtleUJvb2woImJyZXNlbmhhbUxpbmVzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmJyZXNlbmhhbUxpbmVzKSwgMjQpOworICAgIHAuUHJpbnRLZXlCb29sKCJzbW9vdGhMaW5lcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zbW9vdGhMaW5lcyksIDI0KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lcyksIDI0KTsKKyAgICBwLlByaW50S2V5Qm9vbCgic3RpcHBsZWRCcmVzZW5oYW1MaW5lcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zdGlwcGxlZEJyZXNlbmhhbUxpbmVzKSwgMjQpOworICAgIHAuUHJpbnRLZXlCb29sKCJzdGlwcGxlZFNtb290aExpbmVzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnN0aXBwbGVkU21vb3RoTGluZXMpLCAyNCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5VmFsdWUoImxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHMiLCBvYmoubGluZVN1YlBpeGVsUHJlY2lzaW9uQml0cywgMjUpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFBlclNldERlc2NyaXB0b3JzIiwgb2JqLm1heFBlclNldERlc2NyaXB0b3JzLCAyMyk7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhNZW1vcnlBbGxvY2F0aW9uU2l6ZSIsIHRvX2hleF9zdHIocCwgb2JqLm1heE1lbW9yeUFsbG9jYXRpb25TaXplKSwgMjMpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLkFycmF5U3RhcnQoImhlYXBCdWRnZXQiLCAxNik7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmhlYXBCdWRnZXRbMF0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5oZWFwQnVkZ2V0WzFdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcEJ1ZGdldFsyXSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmhlYXBCdWRnZXRbM10pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5oZWFwQnVkZ2V0WzRdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcEJ1ZGdldFs1XSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmhlYXBCdWRnZXRbNl0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5oZWFwQnVkZ2V0WzddKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcEJ1ZGdldFs4XSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmhlYXBCdWRnZXRbOV0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5oZWFwQnVkZ2V0WzEwXSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmhlYXBCdWRnZXRbMTFdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcEJ1ZGdldFsxMl0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5oZWFwQnVkZ2V0WzEzXSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmhlYXBCdWRnZXRbMTRdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcEJ1ZGdldFsxNV0pOworICAgIHAuQXJyYXlFbmQoKTsKKyAgICBwLkFycmF5U3RhcnQoImhlYXBVc2FnZSIsIDE2KTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzBdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzFdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzJdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzNdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzRdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzVdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzZdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzddKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzhdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzldKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzEwXSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmhlYXBVc2FnZVsxMV0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5oZWFwVXNhZ2VbMTJdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouaGVhcFVzYWdlWzEzXSk7CisgICAgcC5QcmludEVsZW1lbnQob2JqLmhlYXBVc2FnZVsxNF0pOworICAgIHAuUHJpbnRFbGVtZW50KG9iai5oZWFwVXNhZ2VbMTVdKTsKKyAgICBwLkFycmF5RW5kKCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJtZW1vcnlQcmlvcml0eSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5tZW1vcnlQcmlvcml0eSksIDE0KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgibXVsdGl2aWV3Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLm11bHRpdmlldyksIDI3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgibXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIiLCBzdGF0aWNfY2FzdDxib29sPihvYmoubXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIpLCAyNyk7CisgICAgcC5QcmludEtleUJvb2woIm11bHRpdmlld1Rlc3NlbGxhdGlvblNoYWRlciIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5tdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIpLCAyNyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4TXVsdGl2aWV3Vmlld0NvdW50Iiwgb2JqLm1heE11bHRpdmlld1ZpZXdDb3VudCwgMjUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleCIsIG9iai5tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LCAyNSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleVZhbHVlKCJwY2lEb21haW4iLCBvYmoucGNpRG9tYWluLCAxMSk7CisgICAgcC5QcmludEtleVZhbHVlKCJwY2lCdXMiLCBvYmoucGNpQnVzLCAxMSk7CisgICAgcC5QcmludEtleVZhbHVlKCJwY2lEZXZpY2UiLCBvYmoucGNpRGV2aWNlLCAxMSk7CisgICAgcC5QcmludEtleVZhbHVlKCJwY2lGdW5jdGlvbiIsIG9iai5wY2lGdW5jdGlvbiwgMTEpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMiLCBzdGF0aWNfY2FzdDxib29sPihvYmoucGVyZm9ybWFuY2VDb3VudGVyUXVlcnlQb29scyksIDM2KTsKKyAgICBwLlByaW50S2V5Qm9vbCgicGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnBlcmZvcm1hbmNlQ291bnRlck11bHRpcGxlUXVlcnlQb29scyksIDM2KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgiYWxsb3dDb21tYW5kQnVmZmVyUXVlcnlDb3BpZXMiLCBzdGF0aWNfY2FzdDxib29sPihvYmouYWxsb3dDb21tYW5kQnVmZmVyUXVlcnlDb3BpZXMpLCAyOSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgicGlwZWxpbmVFeGVjdXRhYmxlSW5mbyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5waXBlbGluZUV4ZWN1dGFibGVJbmZvKSwgMjIpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa1BvaW50Q2xpcHBpbmdCZWhhdmlvcihwLCAicG9pbnRDbGlwcGluZ0JlaGF2aW9yIiwgb2JqLnBvaW50Q2xpcHBpbmdCZWhhdmlvciwgNSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInByb3RlY3RlZE1lbW9yeSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5wcm90ZWN0ZWRNZW1vcnkpLCAxNSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJwcm90ZWN0ZWROb0ZhdWx0Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnByb3RlY3RlZE5vRmF1bHQpLCAxNik7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFB1c2hEZXNjcmlwdG9ycyIsIG9iai5tYXhQdXNoRGVzY3JpcHRvcnMsIDE4KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgRHVtcFZrU2FtcGxlQ291bnRGbGFncyhwLCAic2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHMiLCBvYmouc2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHMsIDMyKTsKKyAgICBEdW1wVmtFeHRlbnQyRChwLCAibWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZSIsIG9iai5tYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplKTsKKyAgICBwLkFycmF5U3RhcnQoInNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlIiwgMik7CisgICAgcC5QcmludEVsZW1lbnQob2JqLnNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlWzBdKTsKKyAgICBwLlByaW50RWxlbWVudChvYmouc2FtcGxlTG9jYXRpb25Db29yZGluYXRlUmFuZ2VbMV0pOworICAgIHAuQXJyYXlFbmQoKTsKKyAgICBwLlByaW50S2V5VmFsdWUoInNhbXBsZUxvY2F0aW9uU3ViUGl4ZWxCaXRzIiwgb2JqLnNhbXBsZUxvY2F0aW9uU3ViUGl4ZWxCaXRzLCAzMik7CisgICAgcC5QcmludEtleUJvb2woInZhcmlhYmxlU2FtcGxlTG9jYXRpb25zIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnZhcmlhYmxlU2FtcGxlTG9jYXRpb25zKSwgMzIpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJmaWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmZpbHRlck1pbm1heFNpbmdsZUNvbXBvbmVudEZvcm1hdHMpLCAzNCk7CisgICAgcC5QcmludEtleUJvb2woImZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5maWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmcpLCAzNCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2FtcGxlclljYmNyQ29udmVyc2lvbiIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zYW1wbGVyWWNiY3JDb252ZXJzaW9uKSwgMjIpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2NhbGFyQmxvY2tMYXlvdXQiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2NhbGFyQmxvY2tMYXlvdXQpLCAxNyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMpLCAyNyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJCdWZmZXJJbnQ2NEF0b21pY3MiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyQnVmZmVySW50NjRBdG9taWNzKSwgMjQpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3MiLCBzdGF0aWNfY2FzdDxib29sPihvYmouc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzKSwgMjQpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyU3ViZ3JvdXBDbG9jayIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJTdWJncm91cENsb2NrKSwgMTkpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJEZXZpY2VDbG9jayIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJEZXZpY2VDbG9jayksIDE5KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbiksIDMwKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlckRyYXdQYXJhbWV0ZXJzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckRyYXdQYXJhbWV0ZXJzKSwgMjApOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgic2hhZGVyRmxvYXQxNiIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJGbG9hdDE2KSwgMTMpOworICAgIHAuUHJpbnRLZXlCb29sKCJzaGFkZXJJbnQ4Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnNoYWRlckludDgpLCAxMyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlcyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXMpLCAyNyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzICZvYmopIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikKKyAgICAgICAgcC5PYmplY3RTdGFydCgic3BhcnNlUHJvcGVydGllcyIpOworICAgIGVsc2UKKyAgICAgICAgcC5TZXRTdWJIZWFkZXIoKS5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgicmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGUiLCBzdGF0aWNfY2FzdDxib29sPihvYmoucmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGUpLCA0MCk7CisgICAgcC5QcmludEtleUJvb2woInJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGUiLCBzdGF0aWNfY2FzdDxib29sPihvYmoucmVzaWRlbmN5U3RhbmRhcmQyRE11bHRpc2FtcGxlQmxvY2tTaGFwZSksIDQwKTsKKyAgICBwLlByaW50S2V5Qm9vbCgicmVzaWRlbmN5U3RhbmRhcmQzREJsb2NrU2hhcGUiLCBzdGF0aWNfY2FzdDxib29sPihvYmoucmVzaWRlbmN5U3RhbmRhcmQzREJsb2NrU2hhcGUpLCA0MCk7CisgICAgcC5QcmludEtleUJvb2woInJlc2lkZW5jeUFsaWduZWRNaXBTaXplIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnJlc2lkZW5jeUFsaWduZWRNaXBTaXplKSwgNDApOworICAgIHAuUHJpbnRLZXlCb29sKCJyZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5yZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdCksIDQwKTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyhQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgic3ViZ3JvdXBTaXplIiwgb2JqLnN1Ymdyb3VwU2l6ZSwgMjUpOworICAgIER1bXBWa1NoYWRlclN0YWdlRmxhZ3MocCwgInN1cHBvcnRlZFN0YWdlcyIsIG9iai5zdXBwb3J0ZWRTdGFnZXMsIDI1KTsKKyAgICBEdW1wVmtTdWJncm91cEZlYXR1cmVGbGFncyhwLCAic3VwcG9ydGVkT3BlcmF0aW9ucyIsIG9iai5zdXBwb3J0ZWRPcGVyYXRpb25zLCAyNSk7CisgICAgcC5QcmludEtleUJvb2woInF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXMiLCBzdGF0aWNfY2FzdDxib29sPihvYmoucXVhZE9wZXJhdGlvbnNJbkFsbFN0YWdlcyksIDI1KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJzdWJncm91cFNpemVDb250cm9sIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnN1Ymdyb3VwU2l6ZUNvbnRyb2wpLCAyMCk7CisgICAgcC5QcmludEtleUJvb2woImNvbXB1dGVGdWxsU3ViZ3JvdXBzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmNvbXB1dGVGdWxsU3ViZ3JvdXBzKSwgMjApOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWluU3ViZ3JvdXBTaXplIiwgb2JqLm1pblN1Ymdyb3VwU2l6ZSwgMjgpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4U3ViZ3JvdXBTaXplIiwgb2JqLm1heFN1Ymdyb3VwU2l6ZSwgMjgpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4Q29tcHV0ZVdvcmtncm91cFN1Ymdyb3VwcyIsIG9iai5tYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzLCAyOCk7CisgICAgRHVtcFZrU2hhZGVyU3RhZ2VGbGFncyhwLCAicmVxdWlyZWRTdWJncm91cFNpemVTdGFnZXMiLCBvYmoucmVxdWlyZWRTdWJncm91cFNpemVTdGFnZXMsIDI4KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInRleGVsQnVmZmVyQWxpZ25tZW50Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnRleGVsQnVmZmVyQWxpZ25tZW50KSwgMjApOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleVZhbHVlKCJzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcyIsIHRvX2hleF9zdHIocCwgb2JqLnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzKSwgNDQpOworICAgIHAuUHJpbnRLZXlCb29sKCJzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCksIDQ0KTsKKyAgICBwLlByaW50S2V5VmFsdWUoInVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzIiwgdG9faGV4X3N0cihwLCBvYmoudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMpLCA0NCk7CisgICAgcC5QcmludEtleUJvb2woInVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50KSwgNDQpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInRleHR1cmVDb21wcmVzc2lvbkFTVENfSERSIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnRleHR1cmVDb21wcmVzc2lvbkFTVENfSERSKSwgMjYpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgidGltZWxpbmVTZW1hcGhvcmUiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudGltZWxpbmVTZW1hcGhvcmUpLCAxNyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlIiwgb2JqLm1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlLCAzNSk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJ0cmFuc2Zvcm1GZWVkYmFjayIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai50cmFuc2Zvcm1GZWVkYmFjayksIDE3KTsKKyAgICBwLlByaW50S2V5Qm9vbCgiZ2VvbWV0cnlTdHJlYW1zIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmdlb21ldHJ5U3RyZWFtcyksIDE3KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zIiwgb2JqLm1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtcywgNDIpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzIiwgb2JqLm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycywgNDIpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplIiwgdG9faGV4X3N0cihwLCBvYmoubWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplKSwgNDIpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1EYXRhU2l6ZSIsIG9iai5tYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbURhdGFTaXplLCA0Mik7CisgICAgcC5QcmludEtleVZhbHVlKCJtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTaXplIiwgb2JqLm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVNpemUsIDQyKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZSIsIG9iai5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTdHJpZGUsIDQyKTsKKyAgICBwLlByaW50S2V5Qm9vbCgidHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnRyYW5zZm9ybUZlZWRiYWNrUXVlcmllcyksIDQyKTsKKyAgICBwLlByaW50S2V5Qm9vbCgidHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zTGluZXNUcmlhbmdsZXMiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zTGluZXNUcmlhbmdsZXMpLCA0Mik7CisgICAgcC5QcmludEtleUJvb2woInRyYW5zZm9ybUZlZWRiYWNrUmFzdGVyaXphdGlvblN0cmVhbVNlbGVjdCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai50cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3QpLCA0Mik7CisgICAgcC5QcmludEtleUJvb2woInRyYW5zZm9ybUZlZWRiYWNrRHJhdyIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai50cmFuc2Zvcm1GZWVkYmFja0RyYXcpLCA0Mik7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai51bmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXQpLCAyNyk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5Qm9vbCgidmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXIiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXIpLCAyOSk7CisgICAgcC5QcmludEtleUJvb2woInZhcmlhYmxlUG9pbnRlcnMiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudmFyaWFibGVQb2ludGVycyksIDI5KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJ2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IpLCAzOCk7CisgICAgcC5QcmludEtleUJvb2woInZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yKSwgMzgpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQoUHJpbnRlciAmcCwgc3RkOjpzdHJpbmcgbmFtZSwgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4VmVydGV4QXR0cmliRGl2aXNvciIsIG9iai5tYXhWZXJ0ZXhBdHRyaWJEaXZpc29yLCAyMik7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJ2dWxrYW5NZW1vcnlNb2RlbCIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai52dWxrYW5NZW1vcnlNb2RlbCksIDQ1KTsKKyAgICBwLlByaW50S2V5Qm9vbCgidnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZSIsIHN0YXRpY19jYXN0PGJvb2w+KG9iai52dWxrYW5NZW1vcnlNb2RlbERldmljZVNjb3BlKSwgNDUpOworICAgIHAuUHJpbnRLZXlCb29sKCJ2dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnMiLCBzdGF0aWNfY2FzdDxib29sPihvYmoudnVsa2FuTWVtb3J5TW9kZWxBdmFpbGFiaWxpdHlWaXNpYmlsaXR5Q2hhaW5zKSwgNDUpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9Cit2b2lkIER1bXBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInljYmNySW1hZ2VBcnJheXMiLCBzdGF0aWNfY2FzdDxib29sPihvYmoueWNiY3JJbWFnZUFycmF5cyksIDE2KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIER1bXBWa0ltYWdlVXNhZ2VGbGFncyhwLCAic2hhcmVkUHJlc2VudFN1cHBvcnRlZFVzYWdlRmxhZ3MiLCBvYmouc2hhcmVkUHJlc2VudFN1cHBvcnRlZFVzYWdlRmxhZ3MsIDUpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgordm9pZCBEdW1wVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVChQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUICZvYmopIHsKKyAgICBwLk9iamVjdFN0YXJ0KG5hbWUpOworICAgIHAuUHJpbnRLZXlCb29sKCJmdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLmZ1bGxTY3JlZW5FeGNsdXNpdmVTdXBwb3J0ZWQpLCAyOCk7CisgICAgcC5PYmplY3RFbmQoKTsKK30KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgordm9pZCBEdW1wVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBwLlByaW50S2V5VmFsdWUoIm1pbkltYWdlQ291bnQiLCBvYmoubWluSW1hZ2VDb3VudCwgMTkpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4SW1hZ2VDb3VudCIsIG9iai5tYXhJbWFnZUNvdW50LCAxOSk7CisgICAgRHVtcFZrRXh0ZW50MkQocCwgImN1cnJlbnRFeHRlbnQiLCBvYmouY3VycmVudEV4dGVudCk7CisgICAgRHVtcFZrRXh0ZW50MkQocCwgIm1pbkltYWdlRXh0ZW50Iiwgb2JqLm1pbkltYWdlRXh0ZW50KTsKKyAgICBEdW1wVmtFeHRlbnQyRChwLCAibWF4SW1hZ2VFeHRlbnQiLCBvYmoubWF4SW1hZ2VFeHRlbnQpOworICAgIHAuUHJpbnRLZXlWYWx1ZSgibWF4SW1hZ2VBcnJheUxheWVycyIsIG9iai5tYXhJbWFnZUFycmF5TGF5ZXJzLCAxOSk7CisgICAgRHVtcFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSKHAsICJzdXBwb3J0ZWRUcmFuc2Zvcm1zIiwgb2JqLnN1cHBvcnRlZFRyYW5zZm9ybXMsIDE5KTsKKyAgICBEdW1wVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIocCwgImN1cnJlbnRUcmFuc2Zvcm0iLCBvYmouY3VycmVudFRyYW5zZm9ybSwgMTkpOworICAgIER1bXBWa0NvbXBvc2l0ZUFscGhhRmxhZ3NLSFIocCwgInN1cHBvcnRlZENvbXBvc2l0ZUFscGhhIiwgb2JqLnN1cHBvcnRlZENvbXBvc2l0ZUFscGhhLCAxOSk7CisgICAgRHVtcFZrSW1hZ2VVc2FnZUZsYWdzKHAsICJzdXBwb3J0ZWRVc2FnZUZsYWdzIiwgb2JqLnN1cHBvcnRlZFVzYWdlRmxhZ3MsIDE5KTsKKyAgICBwLk9iamVjdEVuZCgpOworfQordm9pZCBEdW1wVmtTdXJmYWNlRm9ybWF0S0hSKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIG5hbWUsIFZrU3VyZmFjZUZvcm1hdEtIUiAmb2JqKSB7CisgICAgcC5PYmplY3RTdGFydChuYW1lKTsKKyAgICBEdW1wVmtGb3JtYXQocCwgImZvcm1hdCIsIG9iai5mb3JtYXQsIDYpOworICAgIER1bXBWa0NvbG9yU3BhY2VLSFIocCwgImNvbG9yU3BhY2UiLCBvYmouY29sb3JTcGFjZSwgNik7CisgICAgcC5PYmplY3RFbmQoKTsKK30KK3ZvaWQgRHVtcFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUihQcmludGVyICZwLCBzdGQ6OnN0cmluZyBuYW1lLCBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgJm9iaikgeworICAgIHAuT2JqZWN0U3RhcnQobmFtZSk7CisgICAgcC5QcmludEtleUJvb2woInN1cHBvcnRzUHJvdGVjdGVkIiwgc3RhdGljX2Nhc3Q8Ym9vbD4ob2JqLnN1cHBvcnRzUHJvdGVjdGVkKSwgMTcpOworICAgIHAuT2JqZWN0RW5kKCk7Cit9CitwTmV4dENoYWluSW5mb3MgZ2V0X2NoYWluX2luZm9zKCkgeworICAgIHBOZXh0Q2hhaW5JbmZvcyBpbmZvczsKKyAgICBpbmZvcy5waHlzX2RldmljZV9wcm9wczIgPSB7CisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX1BST1BFUlRJRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfUFJPUEVSVElFU19LSFIsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX1BST1BFUlRJRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ESVNDQVJEX1JFQ1RBTkdMRV9QUk9QRVJUSUVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUiwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfTUVNT1JZX0hPU1RfUFJPUEVSVElFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUX0NPTlRST0xTX1BST1BFUlRJRVNfS0hSLCBzaXplb2YoVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfUFJPUEVSVElFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfUFJPUEVSVElFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QUk9QRVJUSUVTLCBzaXplb2YoVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QQ0lfQlVTX0lORk9fUFJPUEVSVElFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9QUk9QRVJUSUVTX0tIUiwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUil9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9URUNURURfTUVNT1JZX1BST1BFUlRJRVMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BVU0hfREVTQ1JJUFRPUl9QUk9QRVJUSUVTX0tIUiwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVfTE9DQVRJT05TX1BST1BFUlRJRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX0ZJTFRFUl9NSU5NQVhfUFJPUEVSVElFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9QUk9QRVJUSUVTLCBzaXplb2YoVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9QUk9QRVJUSUVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfUFJPUEVSVElFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSLCBzaXplb2YoVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUil9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19QUk9QRVJUSUVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQpfSwKKyAgICB9OworICAgIGluZm9zLnBoeXNfZGV2aWNlX21lbV9wcm9wczIgPSB7CisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUKX0sCisgICAgfTsKKyAgICBpbmZvcy5waHlzX2RldmljZV9mZWF0dXJlczIgPSB7CisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfMTZCSVRfU1RPUkFHRV9GRUFUVVJFUywgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzhCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFIsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUil9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0FTVENfREVDT0RFX0ZFQVRVUkVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0ZFQVRVUkVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfQ0xJUF9FTkFCTEVfRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfSU5URVJMT0NLX0ZFQVRVUkVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSE9TVF9RVUVSWV9SRVNFVF9GRUFUVVJFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9GRUFUVVJFU19LSFIsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUil9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOREVYX1RZUEVfVUlOVDhfRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJJT1JJVFlfRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9GRUFUVVJFU19LSFIsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0ZFQVRVUkVTX0tIUiwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9URUNURURfTUVNT1JZX0ZFQVRVUkVTLCBzaXplb2YoVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTLCBzaXplb2YoVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSLCBzaXplb2YoVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0FUT01JQ19JTlQ2NF9GRUFUVVJFU19LSFIsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUil9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DTE9DS19GRUFUVVJFU19LSFIsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUil9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19GRUFUVVJFUywgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0ZMT0FUMTZfSU5UOF9GRUFUVVJFU19LSFIsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUil9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFIsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCl9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX0ZFQVRVUkVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfRkVBVFVSRVNfS0hSLCBzaXplb2YoVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhULCBzaXplb2YoVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSLCBzaXplb2YoVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0ZFQVRVUkVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQpfSwKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUiwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfWUNCQ1JfSU1BR0VfQVJSQVlTX0ZFQVRVUkVTX0VYVCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQpfSwKKyAgICB9OworICAgIGluZm9zLnN1cmZhY2VfY2FwYWJpbGl0aWVzMiA9IHsKKyAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX1NIQVJFRF9QUkVTRU5UX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0tIUiwgc2l6ZW9mKFZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIpfSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhULCBzaXplb2YoVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCl9LAorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfS0hSLCBzaXplb2YoVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKX0sCisgICAgfTsKKyAgICBpbmZvcy5mb3JtYXRfcHJvcGVydGllczIgPSB7CisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfTElTVF9FWFQsIHNpemVvZihWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQpfSwKKyAgICB9OworICAgIHJldHVybiBpbmZvczsKK30KK3ZvaWQgY2hhaW5faXRlcmF0b3JfcGh5c19kZXZpY2VfcHJvcHMyKFByaW50ZXIgJnAsIEFwcEdwdSAmZ3B1LCB2b2lkICogcGxhY2UpIHsKKyAgICB3aGlsZSAocGxhY2UpIHsKKyAgICAgICAgc3RydWN0IFZrU3RydWN0dXJlSGVhZGVyICpzdHJ1Y3R1cmUgPSAoc3RydWN0IFZrU3RydWN0dXJlSGVhZGVyICopcGxhY2U7CisgICAgICAgIHAuU2V0U3ViSGVhZGVyKCk7CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfUFJPUEVSVElFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9QUk9QRVJUSUVTX0tIUiAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19LSFJfREVQVEhfU1RFTkNJTF9SRVNPTFZFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIocCwgIlZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19QUk9QRVJUSUVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfREVTQ1JJUFRPUl9JTkRFWElOR19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRElTQ0FSRF9SRUNUQU5HTEVfUFJPUEVSVElFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX0RJU0NBUkRfUkVDVEFOR0xFU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUiAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19LSFJfRFJJVkVSX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUihwLCAiVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX01FTU9SWV9IT1NUX1BST1BFUlRJRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9FWFRFUk5BTF9NRU1PUllfSE9TVF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkxPQVRfQ09OVFJPTFNfUFJPUEVSVElFU19LSFIgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfS0hSX1NIQURFUl9GTE9BVF9DT05UUk9MU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKHAsICJWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX1BST1BFUlRJRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSURfUFJPUEVSVElFUykgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMocCwgIlZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX1BST1BFUlRJRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9MSU5FX1JBU1RFUklaQVRJT05fRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVChwLCAiVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyhwLCAiVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QUk9QRVJUSUVTKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyhwLCAiVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BDSV9CVVNfSU5GT19QUk9QRVJUSUVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfUENJX0JVU19JTkZPX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfUFJPUEVSVElFU19LSFIgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIocCwgIlZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUE9JTlRfQ0xJUFBJTkdfUFJPUEVSVElFUykgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMocCwgIlZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9QUk9QRVJUSUVTKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyhwLCAiVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BVU0hfREVTQ1JJUFRPUl9QUk9QRVJUSUVTX0tIUiAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIocCwgIlZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRV9MT0NBVElPTlNfUFJPUEVSVElFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX1NBTVBMRV9MT0NBVElPTlNfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVChwLCAiVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfRklMVEVSX01JTk1BWF9QUk9QRVJUSUVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfU0FNUExFUl9GSUxURVJfTUlOTUFYX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfUFJPUEVSVElFUykgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMocCwgIlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9QUk9QRVJUSUVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfU1VCR1JPVVBfU0laRV9DT05UUk9MX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9QUk9QRVJUSUVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFIgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfS0hSX1RJTUVMSU5FX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKHAsICJWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfUFJPUEVSVElFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX1RSQU5TRk9STV9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgcGxhY2UgPSBzdHJ1Y3R1cmUtPnBOZXh0OworICAgIH0KK30KK3ZvaWQgY2hhaW5faXRlcmF0b3JfcGh5c19kZXZpY2VfbWVtX3Byb3BzMihQcmludGVyICZwLCBBcHBHcHUgJmdwdSwgdm9pZCAqIHBsYWNlKSB7CisgICAgd2hpbGUgKHBsYWNlKSB7CisgICAgICAgIHN0cnVjdCBWa1N0cnVjdHVyZUhlYWRlciAqc3RydWN0dXJlID0gKHN0cnVjdCBWa1N0cnVjdHVyZUhlYWRlciAqKXBsYWNlOworICAgICAgICBwLlNldFN1YkhlYWRlcigpOworICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfTUVNT1JZX0JVREdFVF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBwbGFjZSA9IHN0cnVjdHVyZS0+cE5leHQ7CisgICAgfQorfQordm9pZCBjaGFpbl9pdGVyYXRvcl9waHlzX2RldmljZV9mZWF0dXJlczIoUHJpbnRlciAmcCwgQXBwR3B1ICZncHUsIHZvaWQgKiBwbGFjZSkgeworICAgIHdoaWxlIChwbGFjZSkgeworICAgICAgICBzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgKnN0cnVjdHVyZSA9IChzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgKilwbGFjZTsKKyAgICAgICAgcC5TZXRTdWJIZWFkZXIoKTsKKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzE2QklUX1NUT1JBR0VfRkVBVFVSRVMpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKHAsICJWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzhCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFIgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfS0hSXzhCSVRfU1RPUkFHRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSKHAsICJWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQVNUQ19ERUNPREVfRkVBVFVSRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9BU1RDX0RFQ09ERV9NT0RFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9CVUZGRVJfREVWSUNFX0FERFJFU1NfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVChwLCAiVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0ZFQVRVUkVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfQ09ORElUSU9OQUxfUkVOREVSSU5HX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9DTElQX0VOQUJMRV9GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX0RFUFRIX0NMSVBfRU5BQkxFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX0RFU0NSSVBUT1JfSU5ERVhJTkdfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVChwLCAiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0lOVEVSTE9DS19GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVChwLCAiVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9IT1NUX1FVRVJZX1JFU0VUX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0tIUl9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUihwLCAiVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOREVYX1RZUEVfVUlOVDhfRkVBVFVSRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9JTkRFWF9UWVBFX1VJTlQ4X0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfTElORV9SQVNURVJJWkFUSU9OX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJJT1JJVFlfRkVBVFVSRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9NRU1PUllfUFJJT1JJVFlfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVChwLCAiVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFUykgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMocCwgIlZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfRkVBVFVSRVNfS0hSICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0tIUl9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKHAsICJWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRkVBVFVSRVNfS0hSICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0tIUl9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUihwLCAiVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUykgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMocCwgIlZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyhwLCAiVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0NBTEFSX0JMT0NLX0xBWU9VVF9GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX1NDQUxBUl9CTE9DS19MQVlPVVRfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVChwLCAiVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19GRUFUVVJFU19LSFIgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfS0hSX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKHAsICJWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9BVE9NSUNfSU5UNjRfRkVBVFVSRVNfS0hSICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0tIUl9TSEFERVJfQVRPTUlDX0lOVDY0X0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIocCwgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0tIUl9TSEFERVJfQ0xPQ0tfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUihwLCAiVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRkVBVFVSRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19GRUFUVVJFUykgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMocCwgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUiAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19LSFJfU0hBREVSX0ZMT0FUMTZfSU5UOF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKHAsICJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX0ZFQVRVUkVTX0tIUiAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19LSFJfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIocCwgIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX0ZFQVRVUkVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfU1VCR1JPVVBfU0laRV9DT05UUk9MX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQocCwgIlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX0ZFQVRVUkVTX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfRkVBVFVSRVNfS0hSICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0tIUl9USU1FTElORV9TRU1BUEhPUkVfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUihwLCAiVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX1RSQU5TRk9STV9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVU5JRk9STV9CVUZGRVJfU1RBTkRBUkRfTEFZT1VUX0ZFQVRVUkVTX0tIUiAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19LSFJfVU5JRk9STV9CVUZGRVJfU1RBTkRBUkRfTEFZT1VUX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIocCwgIlZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzKHAsICJWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKiBwcm9wcyA9IChWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVChwLCAiVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFIgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfS0hSX1ZVTEtBTl9NRU1PUllfTU9ERUxfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiogcHJvcHMgPSAoVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUihwLCAiVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1lDQkNSX0lNQUdFX0FSUkFZU19GRUFUVVJFU19FWFQgJiYKKyAgICAgICAgICAgIGdwdS5DaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX1lDQkNSX0lNQUdFX0FSUkFZU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQqIHByb3BzID0gKFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUKHAsICJWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIiwgKnByb3BzKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIHBsYWNlID0gc3RydWN0dXJlLT5wTmV4dDsKKyAgICB9Cit9Cit2b2lkIGNoYWluX2l0ZXJhdG9yX3N1cmZhY2VfY2FwYWJpbGl0aWVzMihQcmludGVyICZwLCBBcHBJbnN0YW5jZSAmaW5zdCwgQXBwR3B1ICZncHUsIHZvaWQgKiBwbGFjZSkgeworICAgIHdoaWxlIChwbGFjZSkgeworICAgICAgICBzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgKnN0cnVjdHVyZSA9IChzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgKilwbGFjZTsKKyAgICAgICAgcC5TZXRTdWJIZWFkZXIoKTsKKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0tIUl9TSEFSRURfUFJFU0VOVEFCTEVfSU1BR0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwcm9wcyA9IChWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKilzdHJ1Y3R1cmU7CisgICAgICAgICAgICBEdW1wVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUihwLCAiVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVCAmJgorICAgICAgICAgICAgZ3B1LkNoZWNrUGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmNsdWRlZChWS19FWFRfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCogcHJvcHMgPSAoVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCopc3RydWN0dXJlOworICAgICAgICAgICAgRHVtcFZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQocCwgIlZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQiLCAqcHJvcHMpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfS0hSICYmCisgICAgICAgICAgICBpbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKiBwcm9wcyA9IChWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIocCwgIlZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBwbGFjZSA9IHN0cnVjdHVyZS0+cE5leHQ7CisgICAgfQorfQordm9pZCBjaGFpbl9pdGVyYXRvcl9mb3JtYXRfcHJvcGVydGllczIoUHJpbnRlciAmcCwgQXBwR3B1ICZncHUsIHZvaWQgKiBwbGFjZSkgeworICAgIHdoaWxlIChwbGFjZSkgeworICAgICAgICBzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgKnN0cnVjdHVyZSA9IChzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgKilwbGFjZTsKKyAgICAgICAgcC5TZXRTdWJIZWFkZXIoKTsKKyAgICAgICAgaWYgKHN0cnVjdHVyZS0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0xJU1RfRVhUICYmCisgICAgICAgICAgICBncHUuQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKFZLX0VYVF9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUKiBwcm9wcyA9IChWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgIER1bXBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQocCwgIlZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCIsICpwcm9wcyk7CisgICAgICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBwbGFjZSA9IHN0cnVjdHVyZS0+cE5leHQ7CisgICAgfQorfQorYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZrRXh0ZW50MkQgJiBhLCBjb25zdCBWa0V4dGVudDJEIGIpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgJiBhLCBjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIGIpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgJiBhLCBjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIGIpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiAmIGEsIGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBiKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBWa1N1cmZhY2VGb3JtYXQyS0hSICYgYSwgY29uc3QgVmtTdXJmYWNlRm9ybWF0MktIUiBiKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBWa1N1cmZhY2VGb3JtYXRLSFIgJiBhLCBjb25zdCBWa1N1cmZhY2VGb3JtYXRLSFIgYik7Citib29sIG9wZXJhdG9yPT0oY29uc3QgVmtFeHRlbnQyRCAmIGEsIGNvbnN0IFZrRXh0ZW50MkQgYikgeworICAgIHJldHVybiBhLndpZHRoID09IGIud2lkdGgKKyAgICAgICAgJiYgYS5oZWlnaHQgPT0gYi5oZWlnaHQ7Cit9Citib29sIG9wZXJhdG9yPT0oY29uc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCAmIGEsIGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgYikgeworICAgIHJldHVybiBhLm1pbkltYWdlQ291bnQgPT0gYi5taW5JbWFnZUNvdW50CisgICAgICAgICYmIGEubWF4SW1hZ2VDb3VudCA9PSBiLm1heEltYWdlQ291bnQKKyAgICAgICAgJiYgYS5jdXJyZW50RXh0ZW50ID09IGIuY3VycmVudEV4dGVudAorICAgICAgICAmJiBhLm1pbkltYWdlRXh0ZW50ID09IGIubWluSW1hZ2VFeHRlbnQKKyAgICAgICAgJiYgYS5tYXhJbWFnZUV4dGVudCA9PSBiLm1heEltYWdlRXh0ZW50CisgICAgICAgICYmIGEubWF4SW1hZ2VBcnJheUxheWVycyA9PSBiLm1heEltYWdlQXJyYXlMYXllcnMKKyAgICAgICAgJiYgYS5zdXBwb3J0ZWRUcmFuc2Zvcm1zID09IGIuc3VwcG9ydGVkVHJhbnNmb3JtcworICAgICAgICAmJiBhLmN1cnJlbnRUcmFuc2Zvcm0gPT0gYi5jdXJyZW50VHJhbnNmb3JtCisgICAgICAgICYmIGEuc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEgPT0gYi5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYQorICAgICAgICAmJiBhLnN1cHBvcnRlZFVzYWdlRmxhZ3MgPT0gYi5zdXBwb3J0ZWRVc2FnZUZsYWdzCisgICAgICAgICYmIGEuc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzID09IGIuc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzOworfQorYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgJiBhLCBjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIGIpIHsKKyAgICByZXR1cm4gYS5zdXJmYWNlQ2FwYWJpbGl0aWVzID09IGIuc3VyZmFjZUNhcGFiaWxpdGllczsKK30KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgJiBhLCBjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgYikgeworICAgIHJldHVybiBhLm1pbkltYWdlQ291bnQgPT0gYi5taW5JbWFnZUNvdW50CisgICAgICAgICYmIGEubWF4SW1hZ2VDb3VudCA9PSBiLm1heEltYWdlQ291bnQKKyAgICAgICAgJiYgYS5jdXJyZW50RXh0ZW50ID09IGIuY3VycmVudEV4dGVudAorICAgICAgICAmJiBhLm1pbkltYWdlRXh0ZW50ID09IGIubWluSW1hZ2VFeHRlbnQKKyAgICAgICAgJiYgYS5tYXhJbWFnZUV4dGVudCA9PSBiLm1heEltYWdlRXh0ZW50CisgICAgICAgICYmIGEubWF4SW1hZ2VBcnJheUxheWVycyA9PSBiLm1heEltYWdlQXJyYXlMYXllcnMKKyAgICAgICAgJiYgYS5zdXBwb3J0ZWRUcmFuc2Zvcm1zID09IGIuc3VwcG9ydGVkVHJhbnNmb3JtcworICAgICAgICAmJiBhLmN1cnJlbnRUcmFuc2Zvcm0gPT0gYi5jdXJyZW50VHJhbnNmb3JtCisgICAgICAgICYmIGEuc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEgPT0gYi5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYQorICAgICAgICAmJiBhLnN1cHBvcnRlZFVzYWdlRmxhZ3MgPT0gYi5zdXBwb3J0ZWRVc2FnZUZsYWdzOworfQorYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZrU3VyZmFjZUZvcm1hdDJLSFIgJiBhLCBjb25zdCBWa1N1cmZhY2VGb3JtYXQyS0hSIGIpIHsKKyAgICByZXR1cm4gYS5zdXJmYWNlRm9ybWF0ID09IGIuc3VyZmFjZUZvcm1hdDsKK30KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBWa1N1cmZhY2VGb3JtYXRLSFIgJiBhLCBjb25zdCBWa1N1cmZhY2VGb3JtYXRLSFIgYikgeworICAgIHJldHVybiBhLmZvcm1hdCA9PSBiLmZvcm1hdAorICAgICAgICAmJiBhLmNvbG9yU3BhY2UgPT0gYi5jb2xvclNwYWNlOworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy92dWxrYW5pbmZvL2pzb25fdmFsaWRhdGlvbl9wcm9jZXNzLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9qc29uX3ZhbGlkYXRpb25fcHJvY2Vzcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDM0NTI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9qc29uX3ZhbGlkYXRpb25fcHJvY2Vzcy5tZApAQCAtMCwwICsxLDM4IEBACisjIFZhbGlkYXRpbmcgW3Z1bGthbmluZm9dKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVRvb2xzL3RyZWUvbWFzdGVyL3Z1bGthbmluZm8pIEpTT04gb3V0cHV0CisKK1RoZSBmb3JtYXQgb2YgdnVsa2FuaW5mbydzIEpTT04gb3V0cHV0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgaW5wdXQgdG8gdGhlIEx1bmFyRworW0RldmljZSBTaW11bGF0aW9uXShodHRwczovL2dpdGh1Yi5jb20vTHVuYXJHL1Z1bGthblRvb2xzL2Jsb2IvbWFzdGVyL2xheWVyc3Z0L2RldmljZV9zaW11bGF0aW9uLm1kKQorKERldlNpbSkgbGF5ZXIuCitXaGVuIGNoYW5nZXMgYXJlIG1hZGUgdG8gdnVsa2FuaW5mbydzIEpTT04gb3V0cHV0LCB0aGUgZm9ybWF0dGluZyBzaG91bGQgYmUKK3ZhbGlkYXRlZCBhZ2FpbnN0IERldlNpbSdzIEpTT04gc2NoZW1hLCB0byBlbnN1cmUgdGhlIHRleHQgaXMgY29ycmVjdGx5Citmb3JtYXR0ZWQuCisKK1RoZSBEZXZTaW0gSlNPTiBzY2hlbWEgc3BlY2lmaWVzIGV4YWN0bHkgaG93IGl0cyBKU09OIGlucHV0IGRhdGEgbXVzdAorYmUgc3RydWN0dXJlZC4KK1RoZSBzY2hlbWEgbWF5IGJlIGZvdW5kIGF0CitodHRwczovL3NjaGVtYS5raHJvbm9zLm9yZy92dWxrYW4vZGV2c2ltXzFfMF8wLmpzb24KKworIyMgU3RlcHMgdG8gdmFsaWRhdGUgSlNPTiBkYXRhIGFnYWluc3QgdGhlIERldlNpbSBzY2hlbWEKKworMS4gR2VuZXJhdGUgdGhlIHRleHQgdG8gYmUgdGVzdGVkIHVzaW5nIGB2dWxrYW5pbmZvIC0tanNvbmAgYW5kIHNhdmUgdG8gYSBmaWxlLgorMS4gRG93bmxvYWQgdGhlIFtEZXZTaW0gc2NoZW1hXShodHRwczovL3NjaGVtYS5raHJvbm9zLm9yZy92dWxrYW4vZGV2c2ltXzFfMF8wLmpzb24pIHRvIGFub3RoZXIgZmlsZS4KKzEuIEZvciBlYWNoIG9mIHRoZSBvbi1saW5lIEpTT04gdmFsaWRhdG9yIHRvb2xzIGxpc3RlZCBiZWxvdzoKKyAgIDEuIFBhc3RlIHRoZSBzY2hlbWEgYW5kIGFuZCBzYW1wbGUgdGV4dCBpbnRvIHRoZSBgc2NoZW1hYCBhbmQgYGRhdGFgIGZpZWxkcy4KKyAgIDEuIERlcGVuZGluZyBvbiB0aGUgdG9vbCwgaXQgbWF5IHZhbGlkYXRlIGF1dG9tYXRpY2FsbHksIG9yIHJlcXVpcmUgY2xpY2tpbmcgYSBgdmFsaWRhdGVgIGJ1dHRvbi4KKyAgIDEuIEVuc3VyZSB0aGUgdG9vbCByZXBvcnRzIG5vIGVycm9ycy4KKworIyMgTGlzdCBvZiByZWNvbW1lbmRlZCBKU09OIHZhbGlkYXRvciB0b29scworCitFYWNoIG9mIHRoZXNlIHRvb2xzIHNlZW0gdG8gaGF2ZSB0aGVpciBvd24gcXVpcmtzIGFuZC9vciBob2xlcyBpbiBjb3ZlcmFnZS4KK0kgcmVjb21tZW5kIHVzaW5nIGFsbCBvZiB0aGVtLCBlbnN1cmluZyB0aGV5IGFsbCByZXBvcnQgdGhhdCB0aGUgZGF0YSBzdWNjZXNzZnVsbHkKK3ZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEuCisqIGh0dHBzOi8vd3d3Lmpzb25zY2hlbWF2YWxpZGF0b3IubmV0LworKiBodHRwczovL2pzb25zY2hlbWFsaW50LmNvbS8jL3ZlcnNpb24vZHJhZnQtMDQvbWFya3VwL2pzb24KKyogaHR0cHM6Ly9qc29uLXNjaGVtYS12YWxpZGF0b3IuaGVyb2t1YXBwLmNvbS9pbmRleC5qc3AKKworSWYgeW91IGhhdmUgc3VnZ2VzdGlvbnMgZm9yIGJldHRlciB0b29scworKGUuZy46IGFuIG9mZmljaWFsIHJlZmVyZW5jZSB2YWxpZGF0b3IsCithbiBhdXRvbWF0YWJsZSB0b29sIHRvIGludGVncmF0ZSB3aXRoIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24pCitwbGVhc2UgY3JlYXRlIGFuCitbaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVRvb2xzL2lzc3VlcykKK3RvIHJlY29tbWVuZCBpdC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvSW5mby5wbGlzdCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdiMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9tYWNPUy9JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnZ1bGthbmluZm8uc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+VnVsa2FuSW5mbzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+VnVsa2FuSWNvbi5pY25zPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS5sdW5hcmcudnVsa2FuaW5mbzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVMb25nVmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPlZ1bGthbkluZm88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q1NSZXNvdXJjZXNGaWxlTWFwcGVkPC9rZXk+CisJPHRydWUvPgorCTxrZXk+TlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0PC9rZXk+CisJPHN0cmluZz5Db3B5cmlnaHQgKGMpIDIwMTggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBMdW5hckcgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvUmVzb3VyY2VzL1Z1bGthbkljb24uaWNucyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvUmVzb3VyY2VzL1Z1bGthbkljb24uaWNucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjgyZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9tYWNPUy9SZXNvdXJjZXMvVnVsa2FuSWNvbi5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvdnVsa2FuaW5mby5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvdnVsa2FuaW5mby5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI1Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9tYWNPUy92dWxrYW5pbmZvLmNtYWtlCkBAIC0wLDAgKzEsNzMgQEAKKyMgfn5+CisjIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyB+fn4KKworIyBWdWxrYW5pbmZvIEFwcGxpY2F0aW9uIEJ1bmRsZQorCisjIFdlIGFscmVhZHkgaGF2ZSBhICJ2dWxrYW5pbmZvIiB0YXJnZXQsIHNvIGNyZWF0ZSBhIG5ldyB0YXJnZXQgd2l0aCBhIGRpZmZlcmVudCBuYW1lIGFuZCB1c2UgdGhlIE9VVFBVVF9OQU1FIHByb3BlcnR5IHRvIHJlbmFtZSB0aGUKKyMgdGFyZ2V0IHRvIHRoZSBkZXNpcmVkIG5hbWUuIFRoZSBzdGFuZGFsb25lIGJpbmFyeSBpcyBjYWxsZWQgInZ1bGthbmluZm8iIGFuZCB0aGUgYnVuZGxlIGlzIGNhbGxlZCAidnVsa2FuaW5mby5hcHAiLiBOb3RlIHRoYXQgdGhlCisjIGV4ZWN1dGFibGUgaXMgYSBzY3JpcHQgdGhhdCBsYXVuY2hlcyBUZXJtaW5hbCB0byBzZWUgdGhlIG91dHB1dC4KK2FkZF9leGVjdXRhYmxlKHZ1bGthbmluZm8tYnVuZGxlCisgICAgICAgICAgICAgICBNQUNPU1hfQlVORExFCisgICAgICAgICAgICAgICB2dWxrYW5pbmZvLmNwcAorICAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfS9zdGFnaW5nLWpzb24vTW9sdGVuVktfaWNkLmpzb24KKyAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYWNPUy92dWxrYW5pbmZvLnNoCisgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvUmVzb3VyY2VzL1Z1bGthbkljb24uaWNucworICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL3Z1bGthbmluZm8vbWV0YWxfdmlldy5tbQorICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL3Z1bGthbmluZm8vbWV0YWxfdmlldy5oKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHZ1bGthbmluZm8tYnVuZGxlCisgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVElFUyBPVVRQVVRfTkFNRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnVsa2FuaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDT1NYX0JVTkRMRV9JTkZPX1BMSVNUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvSW5mby5wbGlzdCkKKyMgV2UgZG8gdGhpcyBzbyB2dWxrYW5pbmZvIGlzIGxpbmtlZCB0byBhbiBpbmRpdmlkdWFsIGxpYnJhcnkgYW5kIE5PVCBhIGZyYW1ld29yay4KK3RhcmdldF9saW5rX2xpYnJhcmllcyh2dWxrYW5pbmZvLWJ1bmRsZSAke1Z1bGthbl9MSUJSQVJZfSAiLWZyYW1ld29yayBBcHBLaXQgLWZyYW1ld29yayBRdWFydHpDb3JlIikKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKHZ1bGthbmluZm8tYnVuZGxlIFBSSVZBVEUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYWNPUy92dWxrYW5pbmZvICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9nZW5lcmF0ZWQgJHtDTUFLRV9CSU5BUllfRElSfS92dWxrYW5pbmZvICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0pCithZGRfZGVwZW5kZW5jaWVzKHZ1bGthbmluZm8tYnVuZGxlIE1vbHRlblZLX2ljZC1zdGFnaW5nLWpzb24pCisKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFjT1MvdnVsa2FuaW5mby5zaCBQUk9QRVJUSUVTIE1BQ09TWF9QQUNLQUdFX0xPQ0FUSU9OICJNYWNPUyIpCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY09TL1Jlc291cmNlcy9WdWxrYW5JY29uLmljbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUSUVTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDT1NYX1BBQ0tBR0VfTE9DQVRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzIikKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0NNQUtFX0JJTkFSWV9ESVJ9L3N0YWdpbmctanNvbi9Nb2x0ZW5WS19pY2QuanNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNPU1hfUEFDS0FHRV9MT0NBVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMvdnVsa2FuL2ljZC5kIikKKworIyBYY29kZSBwcm9qZWN0cyBuZWVkIHNvbWUgZXh0cmEgaGVscCB3aXRoIHdoYXQgd291bGQgYmUgaW5zdGFsbCBzdGVwcy4KK2lmKCR7Q01BS0VfR0VORVJBVE9SfSBNQVRDSEVTICJeWGNvZGUuKiIpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCB2dWxrYW5pbmZvLWJ1bmRsZSBQT1NUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICIke01PTFRFTlZLX0RJUn0vTW9sdGVuVksvbWFjT1MvZHluYW1pYy9saWJNb2x0ZW5WSy5keWxpYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJDxDT05GSUc+L3Z1bGthbmluZm8uYXBwL0NvbnRlbnRzL0ZyYW1ld29ya3MvbGliTW9sdGVuVksuZHlsaWIKKyAgICAgICAgICAgICAgICAgICAgICAgREVQRU5EUyB2dWxrYW4pCitlbHNlKCkKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIHZ1bGthbmluZm8tYnVuZGxlIFBPU1RfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgIiR7TU9MVEVOVktfRElSfS9Nb2x0ZW5WSy9tYWNPUy9keW5hbWljL2xpYk1vbHRlblZLLmR5bGliIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS92dWxrYW5pbmZvLmFwcC9Db250ZW50cy9GcmFtZXdvcmtzL2xpYk1vbHRlblZLLmR5bGliCisgICAgICAgICAgICAgICAgICAgICAgIERFUEVORFMgdnVsa2FuKQorZW5kaWYoKQorCisjIEtlZXAgUlBBVEggc28gZml4dXBfYnVuZGxlIGNhbiB1c2UgaXQgdG8gZmluZCBsaWJyYXJpZXMKK3NldF90YXJnZXRfcHJvcGVydGllcyh2dWxrYW5pbmZvLWJ1bmRsZSBQUk9QRVJUSUVTIElOU1RBTExfUlBBVEhfVVNFX0xJTktfUEFUSCBUUlVFKQoraW5zdGFsbChUQVJHRVRTIHZ1bGthbmluZm8tYnVuZGxlIEJVTkRMRSBERVNUSU5BVElPTiAidnVsa2FuaW5mbyIpCisjIEZpeCB1cCB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCBpbiB0aGUgZXhlY3V0YWJsZSB0byBmaW5kIChsb2FkZXIpIGxpYnJhcmllcyBpbiB0aGUgYnVuZGxlLiBXaGVuIGZpeHVwX2J1bmRsZSgpIGlzIHBhc3NlZCBhIGJ1bmRsZQorIyBpbiB0aGUgZmlyc3QgYXJndW1lbnQsIGl0IGxvb2tzIGF0IHRoZSBJbmZvLnBsaXN0IGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBCdW5kbGVFeGVjdXRhYmxlLiBJbiB0aGlzIGNhc2UsIHRoZSBleGVjdXRhYmxlIGlzIGEKKyMgc2NyaXB0LCB3aGljaCBjYW4ndCBiZSBmaXhlZCB1cC4gSW5zdGVhZCBwYXNzIGl0IHRoZSBleHBsaWNpdCBuYW1lIG9mIHRoZSBleGVjdXRhYmxlLgoraW5zdGFsbChDT0RFICIKKyAgICBpbmNsdWRlKEJ1bmRsZVV0aWxpdGllcykKKyAgICBmaXh1cF9idW5kbGUoXCR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L3Z1bGthbmluZm8vdnVsa2FuaW5mby5hcHAvQ29udGVudHMvTWFjT1MvdnVsa2FuaW5mbyBcIlwiIFwiJHtWdWxrYW5fTElCUkFSWV9ESVJ9XCIpCisgICAgIikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvdnVsa2FuaW5mby5zaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvdnVsa2FuaW5mby5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NzY5NDk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9tYWNPUy92dWxrYW5pbmZvLnNoCkBAIC0wLDAgKzEsOSBAQAorIyEvYmluL2Jhc2gKK0JBU0VESVI9YGRpcm5hbWUgJDBgCisKK2lmIFsgLWQgL1N5c3RlbS9BcHBsaWNhdGlvbnMvVXRpbGl0aWVzL1Rlcm1pbmFsLmFwcCBdCit0aGVuCisgICAgb3BlbiAvU3lzdGVtL0FwcGxpY2F0aW9ucy9VdGlsaXRpZXMvVGVybWluYWwuYXBwICRCQVNFRElSL3Z1bGthbmluZm8KK2Vsc2UKKyAgICBvcGVuIC9BcHBsaWNhdGlvbnMvVXRpbGl0aWVzL1Rlcm1pbmFsLmFwcCAkQkFTRURJUi92dWxrYW5pbmZvCitmaQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9tYWNPUy92dWxrYW5pbmZvL21ldGFsX3ZpZXcuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvdnVsa2FuaW5mby9tZXRhbF92aWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0MjlkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvdnVsa2FuaW5mby9tZXRhbF92aWV3LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxOCBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEplcmVteSBLbmlhZ2VyIDxqZXJlbXlrQGx1bmFyZy5jb20+CisgKi8KKworI2lmbmRlZiBtZXRhbF92aWV3X2gKKyNkZWZpbmUgbWV0YWxfdmlld19oCisKK3ZvaWQqIENyZWF0ZU1ldGFsVmlldyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKwordm9pZCBEZXN0cm95TWV0YWxWaWV3KHZvaWQqIHZpZXcpOworCit2b2lkKiBHZXRDQU1ldGFsTGF5ZXJGcm9tTWV0YWxWaWV3KHZvaWQqIHZpZXcpOworCisjZW5kaWYgLyogbWV0YWxfdmlld19oICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy92dWxrYW5pbmZvL21hY09TL3Z1bGthbmluZm8vbWV0YWxfdmlldy5tbSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vbWFjT1MvdnVsa2FuaW5mby9tZXRhbF92aWV3Lm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmZmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy92dWxrYW5pbmZvL21hY09TL3Z1bGthbmluZm8vbWV0YWxfdmlldy5tbQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE4IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSmVyZW15IEtuaWFnZXIgPGplcmVteWtAbHVuYXJnLmNvbT4KKyAqLworCisjaW1wb3J0IDxBcHBLaXQvQXBwS2l0Lmg+CisjaW1wb3J0IDxRdWFydHpDb3JlL1F1YXJ0ekNvcmUuaD4KKworQGludGVyZmFjZSBOYXRpdmVNZXRhbFZpZXcgOiBOU1ZpZXcKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIE5hdGl2ZU1ldGFsVmlldworLSAoaWQpaW5pdFdpdGhGcmFtZTooTlNSZWN0KWZyYW1lIHsKKyAgICBpZiAoc2VsZiA9IFtzdXBlciBpbml0V2l0aEZyYW1lOmZyYW1lXSkgeworICAgICAgICBzZWxmLndhbnRzTGF5ZXIgPSBZRVM7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCisrIChDbGFzcylsYXllckNsYXNzIHsKKyAgICByZXR1cm4gW0NBTWV0YWxMYXllciBjbGFzc107Cit9CisKKy0gKENBTGF5ZXIqKW1ha2VCYWNraW5nTGF5ZXIgeworICAgIENBTGF5ZXIqIGxheWVyID0gW3NlbGYuY2xhc3MubGF5ZXJDbGFzcyBsYXllcl07CisgICAgQ0dTaXplIHZpZXdTY2FsZSA9IFtzZWxmIGNvbnZlcnRTaXplVG9CYWNraW5nOkNHU2l6ZU1ha2UoMS4wLCAxLjApXTsKKyAgICBsYXllci5jb250ZW50c1NjYWxlID0gTUlOKHZpZXdTY2FsZS53aWR0aCwgdmlld1NjYWxlLmhlaWdodCk7CisgICAgcmV0dXJuIGxheWVyOworfQorQGVuZAorCit2b2lkKiBDcmVhdGVNZXRhbFZpZXcodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIHJldHVybiBbW05hdGl2ZU1ldGFsVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXTsKK30KKwordm9pZCBEZXN0cm95TWV0YWxWaWV3KHZvaWQqIHZpZXcpIHsgWyhOYXRpdmVNZXRhbFZpZXcqKXZpZXcgZGVhbGxvY107IH0KKwordm9pZCogR2V0Q0FNZXRhbExheWVyRnJvbU1ldGFsVmlldyh2b2lkKiB2aWV3KSB7IHJldHVybiAoKE5hdGl2ZU1ldGFsVmlldyopdmlldykubGF5ZXI7IH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vb3V0cHV0cHJpbnRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby9vdXRwdXRwcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjZjc1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vb3V0cHV0cHJpbnRlci5oCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hhcmxlcyBHaWVzc2VuIDxjaGFybGVzQGx1bmFyZy5jb20+CisgKgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK3N0ZDo6c3RyaW5nIGluc2VydF9xdW90ZXMoc3RkOjpzdHJpbmcgcykgeyByZXR1cm4gIlwiIiArIHMgKyAiXCIiOyB9CisKK3N0ZDo6c3RyaW5nIHRvX3N0cmluZ18xNih1aW50OF90IHVpZFsxNl0pIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgc3RyZWFtIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGQ6OmhleDsKKyAgICBzdHJlYW0gPDwgKGludCl1aWRbMF0gPDwgKGludCl1aWRbMV0gPDwgKGludCl1aWRbMl0gPDwgKGludCl1aWRbM10gPDwgIi0iOworICAgIHN0cmVhbSA8PCAoaW50KXVpZFs0XSA8PCAoaW50KXVpZFs1XSA8PCAiLSI7CisgICAgc3RyZWFtIDw8IChpbnQpdWlkWzZdIDw8IChpbnQpdWlkWzddIDw8ICItIjsKKyAgICBzdHJlYW0gPDwgKGludCl1aWRbOF0gPDwgKGludCl1aWRbOV0gPDwgIi0iOworICAgIHN0cmVhbSA8PCAoaW50KXVpZFsxMF0gPDwgKGludCl1aWRbMTFdIDw8IChpbnQpdWlkWzEyXSA8PCAoaW50KXVpZFsxM10gPDwgKGludCl1aWRbMTRdIDw8IChpbnQpdWlkWzE1XTsKKworICAgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvX3N0cmluZ184KHVpbnQ4X3QgdWlkWzhdKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIHN0cmVhbSA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjpoZXg7CisgICAgc3RyZWFtIDw8IChpbnQpdWlkWzBdIDw8IChpbnQpdWlkWzFdIDw8IChpbnQpdWlkWzJdIDw8IChpbnQpdWlkWzNdIDw8ICItIjsKKyAgICBzdHJlYW0gPDwgKGludCl1aWRbNF0gPDwgKGludCl1aWRbNV0gPDwgKGludCl1aWRbNl0gPDwgKGludCl1aWRbN107CisKKyAgICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCitzdGQ6OnN0cmluZyBWa1ZlcnNpb25TdHJpbmcodWludDMyX3QgdmVyc2lvbikgeworICAgIHVpbnQzMl90IG1ham9yID0gdmVyc2lvbiA+PiAyMjsKKyAgICB1aW50MzJfdCBtaW5vciA9ICh2ZXJzaW9uID4+IDEyKSAmIDB4M2ZmOworICAgIHVpbnQzMl90IHBhdGNoID0gdmVyc2lvbiAmIDB4ZmZmOworICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhtYWpvcikgKyAiLiIgKyBzdGQ6OnRvX3N0cmluZyhtaW5vcikgKyAiLiIgKyBzdGQ6OnRvX3N0cmluZyhwYXRjaCk7Cit9CisKK3N0ZDo6c3RyaW5nIFZrVmVyc2lvblN0cmluZyhWdWxrYW5WZXJzaW9uIHYpIHsKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcodi5tYWpvcikgKyAiLiIgKyBzdGQ6OnRvX3N0cmluZyh2Lm1pbm9yKSArICIuIiArIHN0ZDo6dG9fc3RyaW5nKHYucGF0Y2gpOworfQorCitlbnVtIGNsYXNzIE91dHB1dFR5cGUgeyB0ZXh0LCBodG1sLCBqc29uIH07CisKK2NsYXNzIFByaW50ZXIgeworICAgcHVibGljOgorICAgIFByaW50ZXIoT3V0cHV0VHlwZSBvdXRwdXRfdHlwZSwgc3RkOjpvc3RyZWFtICZvdXQsIGNvbnN0IHVpbnQzMl90IHNlbGVjdGVkX2dwdSwgY29uc3QgVnVsa2FuVmVyc2lvbiB2dWxrYW5fdmVyc2lvbikKKyAgICAgICAgOiBvdXRwdXRfdHlwZShvdXRwdXRfdHlwZSksIG91dChvdXQpIHsKKyAgICAgICAgc3dpdGNoIChvdXRwdXRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6dGV4dCk6CisgICAgICAgICAgICAgICAgb3V0IDw8ICI9PT09PT09PT09XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiVlVMS0FOSU5GT1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIj09PT09PT09PT1cblxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlZ1bGthbiBJbnN0YW5jZSBWZXJzaW9uOiAiIDw8IFZrVmVyc2lvblN0cmluZyh2dWxrYW5fdmVyc2lvbikgPDwgIlxuXG5cbiI7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgKE91dHB1dFR5cGU6Omh0bWwpOgorICAgICAgICAgICAgICAgIG91dCA8PCAiPCFkb2N0eXBlIGh0bWw+XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiPGh0bWwgbGFuZz0nZW4nPlxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0PGhlYWQ+XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdDx0aXRsZT52dWxrYW5pbmZvPC90aXRsZT5cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0PHN0eWxlPlxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRodG1sIHtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjMGIxZTQ4O1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IHVybChcImh0dHBzOi8vdnVsa2FuLmx1bmFyZy5jb20vaW1nL2JnLXN0YXJmaWVsZC5qcGdcIik7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0YmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdC13ZWJraXQtYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHQtbW96LWJhY2tncm91bmQtc2l6ZTogY292ZXI7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0LW8tYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGJhY2tncm91bmQtYXR0YWNobWVudDogZml4ZWQ7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRoZWlnaHQ6IDEwMCU7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdH1cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0I2hlYWRlciB7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0ei1pbmRleDogLTE7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdH1cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0I2hlYWRlcj5pbWcge1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHR3aWR0aDogMTYwcHg7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0bWFyZ2luLWxlZnQ6IC0yODBweDtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHR0b3A6IC0xMHB4O1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGxlZnQ6IDUwJTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0fVxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHQjaGVhZGVyPmgxIHtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRmb250LWZhbWlseTogQXJpYWwsIFwiSGVsdmV0aWNhIE5ldWVcIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGZvbnQtc2l6ZTogNDRweDtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRmb250LXdlaWdodDogMjAwO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdHRleHQtc2hhZG93OiA0cHggNHB4IDVweCAjMDAwO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGNvbG9yOiAjZWVlO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHR3aWR0aDogNDAwcHg7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0bWFyZ2luLWxlZnQ6IC04MHB4O1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdHRvcDogOHB4O1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGxlZnQ6IDUwJTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0fVxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRib2R5IHtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRmb250LWZhbWlseTogQ29uc29sYXMsIG1vbmFjbywgbW9ub3NwYWNlO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGZvbnQtc2l6ZTogMTRweDtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRsaW5lLWhlaWdodDogMjBweDtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRjb2xvcjogI2VlZTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRoZWlnaHQ6IDEwMCU7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0bWFyZ2luOiAwO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdG92ZXJmbG93OiBoaWRkZW47XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdH1cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0I3dyYXBwZXIge1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjNDQ2O1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGJveC1zaGFkb3c6IDBweCAwcHggMTBweCAjMDAwO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdHBhZGRpbmc6IDhweCAxMnB4O1xuXG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHR0b3A6IDgwcHg7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0Ym90dG9tOiAyNXB4O1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdGxlZnQ6IDUwcHg7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0cmlnaHQ6IDUwcHg7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0b3ZlcmZsb3c6IGF1dG87XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdH1cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0ZGV0YWlscz5kZXRhaWxzIHtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRtYXJnaW4tbGVmdDogMjJweDtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0fVxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRkZXRhaWxzPnN1bW1hcnk6b25seS1jaGlsZDo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0ZGlzcGxheTogbm9uZTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0fVxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHQudmFyLCAudHlwZSwgLnZhbCB7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFx0ZGlzcGxheTogaW5saW5lO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHR9XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdC52YXIge1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHR9XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdC50eXBlIHtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRjb2xvcjogI2FjZjtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRtYXJnaW46IDAgMTJweDtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0fVxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHQudmFsIHtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRjb2xvcjogI2FmYTtcbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHRiYWNrZ3JvdW5kOiAjMjIyO1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdHRleHQtYWxpZ246IHJpZ2h0O1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHR9XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdDwvc3R5bGU+XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHQ8L2hlYWQ+XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHQ8Ym9keT5cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0PGRpdiBpZD0naGVhZGVyJz5cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdFx0XHQ8aDE+dnVsa2FuaW5mbzwvaDE+XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdDwvZGl2PlxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHQ8ZGl2IGlkPSd3cmFwcGVyJz5cbiI7CisKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcdDxkZXRhaWxzPjxzdW1tYXJ5PlZ1bGthbiBJbnN0YW5jZSBWZXJzaW9uOiA8c3BhbiBjbGFzcz0ndmFsJz4iIDw8IFZrVmVyc2lvblN0cmluZyh2dWxrYW5fdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgPDwgIjwvc3Bhbj48L3N1bW1hcnk+PC9kZXRhaWxzPlxuXHRcdFx0PGJyIC8+XG4iOworICAgICAgICAgICAgICAgIGluZGVudHMgKz0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgKE91dHB1dFR5cGU6Ompzb24pOgorICAgICAgICAgICAgICAgIG91dCA8PCAie1xuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XCIkc2NoZW1hXCI6IFwiaHR0cHM6Ly9zY2hlbWEua2hyb25vcy5vcmcvdnVsa2FuL2RldnNpbV8xXzBfMC5qc29uI1wiLFxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XCJjb21tZW50c1wiOiB7XG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHRcdFwiZGVzY1wiOiBcIkpTT04gY29uZmlndXJhdGlvbiBmaWxlIGRlc2NyaWJpbmcgR1BVICIgPDwgc2VsZWN0ZWRfZ3B1CisgICAgICAgICAgICAgICAgICAgIDw8ICIuIEdlbmVyYXRlZCB1c2luZyB0aGUgdnVsa2FuaW5mbyBwcm9ncmFtLlwiLFxuIjsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHRcInZ1bGthbkFwaVZlcnNpb25cIjogXCIiIDw8IFZrVmVyc2lvblN0cmluZyh2dWxrYW5fdmVyc2lvbikgPDwgIlwiXG4iOworICAgICAgICAgICAgICAgIG91dCA8PCAiXHR9IjsKKyAgICAgICAgICAgICAgICBpbmRlbnRzKys7CisgICAgICAgICAgICAgICAgaXNfZmlyc3RfaXRlbS5wdXNoKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgflByaW50ZXIoKSB7CisgICAgICAgIHN3aXRjaCAob3V0cHV0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgKE91dHB1dFR5cGU6OnRleHQpOgorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpodG1sKToKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlx0XHQ8L2Rpdj5cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcdDwvYm9keT5cbiI7CisgICAgICAgICAgICAgICAgb3V0IDw8ICI8L2h0bWw+XG4iOworICAgICAgICAgICAgICAgIGluZGVudHMgLT0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgKE91dHB1dFR5cGU6Ompzb24pOgorICAgICAgICAgICAgICAgIG91dCA8PCAiXG59XG4iOworICAgICAgICAgICAgICAgIGluZGVudHMtLTsKKyAgICAgICAgICAgICAgICBpc19maXJzdF9pdGVtLnBvcCgpOworICAgICAgICAgICAgICAgIGFzc2VydChpc19maXJzdF9pdGVtLmVtcHR5KCkgJiYgIm1pc21hdGNoZWQgbnVtYmVyIG9mIE9iamVjdFN0YXJ0L09iamVjdEVuZCBvciBBcnJheVN0YXJ0L0FycmF5RW5kJ3MiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoaW5kZW50cyA9PSAwICYmICJpbmRlbnRzIG11c3QgYmUgemVybyBhdCBwcm9ncmFtIGVuZCIpOworICAgIH07CisKKyAgICBQcmludGVyKGNvbnN0IFByaW50ZXIgJikgPSBkZWxldGU7CisgICAgY29uc3QgUHJpbnRlciAmb3BlcmF0b3I9KGNvbnN0IFByaW50ZXIgJikgPSBkZWxldGU7CisKKyAgICBPdXRwdXRUeXBlIFR5cGUoKSB7IHJldHVybiBvdXRwdXRfdHlwZTsgfQorCisgICAgLy8gQ3VzdG9tIEZvcm1hdHRpbmcKKyAgICAvLyB1c2UgYnkgcHJlcGVuZGluZyB3aXRoIHAuU2V0WFhYKCkuT2JqZWN0U3RhcnQvQXJyYXlTdGFydAorCisgICAgUHJpbnRlciAmU2V0SGVhZGVyKCkgeworICAgICAgICBzZXRfbmV4dF9oZWFkZXIgPSB0cnVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJpbnRlciAmU2V0U3ViSGVhZGVyKCkgeworICAgICAgICBzZXRfbmV4dF9zdWJoZWFkZXIgPSB0cnVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJpbnRlciAmU2V0T3BlbkRldGFpbHMoKSB7CisgICAgICAgIHNldF9kZXRhaWxzX29wZW4gPSB0cnVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJpbnRlciAmU2V0VGl0bGVBc1R5cGUoKSB7CisgICAgICAgIHNldF9vYmplY3RfbmFtZV9hc190eXBlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFByaW50ZXIgJlNldEFzVHlwZSgpIHsKKyAgICAgICAgc2V0X2FzX3R5cGUgPSB0cnVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUHJpbnRlciAmU2V0RWxlbWVudEluZGV4KGludCBpbmRleCkgeworICAgICAgICBhc3NlcnQoaW5kZXggPj0gMCAmJiAiY2Fubm90IHNldCBlbGVtZW50IGluZGV4IHRvIGEgbmVnYXRpdmUgdmFsdWUiKTsKKyAgICAgICAgZWxlbWVudF9pbmRleCA9IGluZGV4OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBPYmplY3RTdGFydChzdGQ6OnN0cmluZyBvYmplY3RfbmFtZSkgeworICAgICAgICBzd2l0Y2ggKG91dHB1dF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjp0ZXh0KTogeworICAgICAgICAgICAgICAgIG91dCA8PCBzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGVudHMpLCAnXHQnKSA8PCBvYmplY3RfbmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudF9pbmRleCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIlsiIDw8IGVsZW1lbnRfaW5kZXggPDwgIl0iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgIjpcbiI7CisgICAgICAgICAgICAgICAgc2l6ZV90IGhlYWRlcnNpemUgPSBvYmplY3RfbmFtZS5zaXplKCkgKyAxOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50X2luZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNpemUgKz0gMSArIHN0ZDo6dG9fc3RyaW5nKGVsZW1lbnRfaW5kZXgpLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9pbmRleCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQcmludEhlYWRlclVuZGVybGluZXMoaGVhZGVyc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpodG1sKToKKyAgICAgICAgICAgICAgICBvdXQgPDwgc3RkOjpzdHJpbmcoc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRlbnRzKSwgJ1x0Jyk7CisgICAgICAgICAgICAgICAgaWYgKHNldF9kZXRhaWxzX29wZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICI8ZGV0YWlscyBvcGVuPiI7CisgICAgICAgICAgICAgICAgICAgIHNldF9kZXRhaWxzX29wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIjxkZXRhaWxzPiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCAiPHN1bW1hcnk+IjsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X29iamVjdF9uYW1lX2FzX3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICI8c3BhbiBjbGFzcz0ndHlwZSc+IiA8PCBvYmplY3RfbmFtZSA8PCAiPC9zcGFuPiI7CisgICAgICAgICAgICAgICAgICAgIHNldF9vYmplY3RfbmFtZV9hc190eXBlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IG9iamVjdF9uYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudF9pbmRleCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIls8c3BhbiBjbGFzcz0ndmFsJz4iIDw8IGVsZW1lbnRfaW5kZXggPDwgIjwvc3Bhbj5dIjsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9pbmRleCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgIjwvc3VtbWFyeT5cbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpqc29uKToKKyAgICAgICAgICAgICAgICBpZiAoIWlzX2ZpcnN0X2l0ZW0udG9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsXG4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlzX2ZpcnN0X2l0ZW0udG9wKCkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpOworICAgICAgICAgICAgICAgIC8vIE9iamVjdHMgd2l0aCBubyBuYW1lIGFyZSBlbGVtZW50cyBpbiBhbiBhcnJheSBvZiBvYmplY3RzCisgICAgICAgICAgICAgICAgaWYgKG9iamVjdF9uYW1lID09ICIiIHx8IGVsZW1lbnRfaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJ7XG4iOworICAgICAgICAgICAgICAgICAgICBlbGVtZW50X2luZGV4ID0gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJcIiIgPDwgb2JqZWN0X25hbWUgPDwgIlwiOiB7XG4iOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlzX2ZpcnN0X2l0ZW0ucHVzaCh0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50cysrOworICAgIH0KKyAgICB2b2lkIE9iamVjdEVuZCgpIHsKKyAgICAgICAgaW5kZW50cy0tOworICAgICAgICBhc3NlcnQoaW5kZW50cyA+PSAwICYmICJpbmRlbnRzIGNhbm5vdCBnbyBiZWxvdyB6ZXJvIik7CisgICAgICAgIHN3aXRjaCAob3V0cHV0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgKE91dHB1dFR5cGU6OnRleHQpOgorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpodG1sKToKKyAgICAgICAgICAgICAgICBvdXQgPDwgc3RkOjpzdHJpbmcoc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRlbnRzKSwgJ1x0JykgPDwgIjwvZGV0YWlscz5cbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpqc29uKToKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlxuIiA8PCBzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGVudHMpLCAnXHQnKSA8PCAifSI7CisgICAgICAgICAgICAgICAgaXNfZmlyc3RfaXRlbS5wb3AoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBBcnJheVN0YXJ0KHN0ZDo6c3RyaW5nIGFycmF5X25hbWUsIHNpemVfdCBlbGVtZW50X2NvdW50ID0gMCkgeworICAgICAgICBzd2l0Y2ggKG91dHB1dF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjp0ZXh0KToKKyAgICAgICAgICAgICAgICBvdXQgPDwgc3RkOjpzdHJpbmcoc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRlbnRzKSwgJ1x0JykgPDwgYXJyYXlfbmFtZSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCA9ICIgPDwgZWxlbWVudF9jb3VudCA8PCAiXG4iOworICAgICAgICAgICAgICAgIFByaW50SGVhZGVyVW5kZXJsaW5lcyhhcnJheV9uYW1lLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6aHRtbCk6CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpOworICAgICAgICAgICAgICAgIGlmIChzZXRfZGV0YWlsc19vcGVuKSB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiPGRldGFpbHMgb3Blbj4iOworICAgICAgICAgICAgICAgICAgICBzZXRfZGV0YWlsc19vcGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICI8ZGV0YWlscz4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgIjxzdW1tYXJ5PiIgPDwgYXJyYXlfbmFtZSA8PCAiOiBjb3VudCA9IDxzcGFuIGNsYXNzPSd2YWwnPiIgPDwgZWxlbWVudF9jb3VudCA8PCAiPC9zcGFuPjwvc3VtbWFyeT5cbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpqc29uKToKKyAgICAgICAgICAgICAgICBpZiAoIWlzX2ZpcnN0X2l0ZW0udG9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsXG4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlzX2ZpcnN0X2l0ZW0udG9wKCkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8ICJcIiIgPDwgYXJyYXlfbmFtZSA8PCAiXCI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIltcbiI7CisgICAgICAgICAgICAgICAgaXNfZmlyc3RfaXRlbS5wdXNoKHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRzKys7CisgICAgfQorICAgIHZvaWQgQXJyYXlFbmQoKSB7CisgICAgICAgIGluZGVudHMtLTsKKyAgICAgICAgYXNzZXJ0KGluZGVudHMgPj0gMCAmJiAiaW5kZW50cyBjYW5ub3QgZ28gYmVsb3cgemVybyIpOworICAgICAgICBzd2l0Y2ggKG91dHB1dF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjp0ZXh0KToKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6aHRtbCk6CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8ICI8L2RldGFpbHM+XG4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6anNvbik6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJcbiIgPDwgc3RkOjpzdHJpbmcoc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRlbnRzKSwgJ1x0JykgPDwgIl0iOworICAgICAgICAgICAgICAgIGlzX2ZpcnN0X2l0ZW0ucG9wKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIHByaW50aW5nIGtleS12YWx1ZSBwYWlycy4KKyAgICAvLyBtaW5fa2V5X3dpZHRoIGxpbmVzIHVwIHRoZSB2YWx1ZXMgbGlzdGVkCisgICAgLy8gdmFsdWVfZGVzY3JpcHRpb24gaXMgZm9yIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBhbmQgaXMgZGlzcGxheWVkIGluc2lkZSBwYXJlbnRoZXNpcyBhZnRlciB0aGUgdmFsdWUKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIFByaW50S2V5VmFsdWUoc3RkOjpzdHJpbmcga2V5LCBUIHZhbHVlLCBzaXplX3QgbWluX2tleV93aWR0aCA9IDAsIHN0ZDo6c3RyaW5nIHZhbHVlX2Rlc2NyaXB0aW9uID0gIiIpIHsKKyAgICAgICAgc3dpdGNoIChvdXRwdXRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6dGV4dCk6CisgICAgICAgICAgICAgICAgaWYgKG1pbl9rZXlfd2lkdGggPiBrZXkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGVudHMpLCAnXHQnKSA8PCBrZXkgPDwgc3RkOjpzdHJpbmcobWluX2tleV93aWR0aCAtIGtleS5zaXplKCksICcgJyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8IGtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8ICIgPSAiIDw8IHZhbHVlOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZV9kZXNjcmlwdGlvbiAhPSAiIikgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIiAoIiA8PCB2YWx1ZV9kZXNjcmlwdGlvbiA8PCAiKSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCAiXG4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6aHRtbCk6CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8ICI8ZGV0YWlscz48c3VtbWFyeT4iIDw8IGtleTsKKyAgICAgICAgICAgICAgICBpZiAobWluX2tleV93aWR0aCA+IGtleS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKG1pbl9rZXlfd2lkdGggLSBrZXkuc2l6ZSgpLCAnICcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FzX3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0X2FzX3R5cGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIgPSA8c3BhbiBjbGFzcz0ndHlwZSc+IiA8PCB2YWx1ZSA8PCAiPC9zcGFuPiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIgPSA8c3BhbiBjbGFzcz0ndmFsJz4iIDw8IHZhbHVlIDw8ICI8L3NwYW4+IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlX2Rlc2NyaXB0aW9uICE9ICIiKSB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiICg8c3BhbiBjbGFzcz0ndmFsJz4iIDw8IHZhbHVlX2Rlc2NyaXB0aW9uIDw8ICI8L3NwYW4+KSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCAiPC9zdW1tYXJ5PjwvZGV0YWlscz5cbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpqc29uKToKKyAgICAgICAgICAgICAgICBpZiAoIWlzX2ZpcnN0X2l0ZW0udG9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsXG4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlzX2ZpcnN0X2l0ZW0udG9wKCkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8ICJcIiIgPDwga2V5IDw8ICJcIjogIiA8PCB2YWx1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGb3IgcHJpbnRpbmcga2V5IC0gc3RyaW5nIHBhaXJzIChuZWNlc3NhcnkgYmVjYXVzZSBvZiBqc29uKQorICAgIHZvaWQgUHJpbnRLZXlTdHJpbmcoc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSwgc2l6ZV90IG1pbl9rZXlfd2lkdGggPSAwLCBzdGQ6OnN0cmluZyB2YWx1ZV9kZXNjcmlwdGlvbiA9ICIiKSB7CisgICAgICAgIHN3aXRjaCAob3V0cHV0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgKE91dHB1dFR5cGU6OnRleHQpOgorICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6aHRtbCk6CisgICAgICAgICAgICAgICAgUHJpbnRLZXlWYWx1ZShrZXksIHZhbHVlLCBtaW5fa2V5X3dpZHRoLCB2YWx1ZV9kZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpqc29uKToKKyAgICAgICAgICAgICAgICBQcmludEtleVZhbHVlKGtleSwgc3RkOjpzdHJpbmcoIlwiIikgKyB2YWx1ZSArICJcIiIsIG1pbl9rZXlfd2lkdGgsIHZhbHVlX2Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGb3IgcHJpbnRpbmcga2V5IC0gc3RyaW5nIHBhaXJzIChuZWNlc3NhcnkgYmVjYXVzZSBvZiBqc29uKQorICAgIHZvaWQgUHJpbnRLZXlCb29sKHN0ZDo6c3RyaW5nIGtleSwgYm9vbCB2YWx1ZSwgc2l6ZV90IG1pbl9rZXlfd2lkdGggPSAwLCBzdGQ6OnN0cmluZyB2YWx1ZV9kZXNjcmlwdGlvbiA9ICIiKSB7CisgICAgICAgIHN3aXRjaCAob3V0cHV0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgKE91dHB1dFR5cGU6OnRleHQpOgorICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6aHRtbCk6CisgICAgICAgICAgICAgICAgUHJpbnRLZXlWYWx1ZShrZXksIHZhbHVlID8gInRydWUiIDogImZhbHNlIiwgbWluX2tleV93aWR0aCwgdmFsdWVfZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6anNvbik6CisgICAgICAgICAgICAgICAgUHJpbnRLZXlWYWx1ZShrZXksIHZhbHVlLCBtaW5fa2V5X3dpZHRoLCB2YWx1ZV9kZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcHJpbnQgaW5zaWRlIGFycmF5CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBQcmludEVsZW1lbnQoVCBlbGVtZW50LCBzdGQ6OnN0cmluZyB2YWx1ZV9kZXNjcmlwdGlvbiA9ICIiKSB7CisgICAgICAgIHN3aXRjaCAob3V0cHV0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgKE91dHB1dFR5cGU6OnRleHQpOgorICAgICAgICAgICAgICAgIG91dCA8PCBzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGVudHMpLCAnXHQnKSA8PCBlbGVtZW50OworICAgICAgICAgICAgICAgIGlmICh2YWx1ZV9kZXNjcmlwdGlvbiAhPSAiIikgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIiAoIiA8PCB2YWx1ZV9kZXNjcmlwdGlvbiA8PCAiKSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCAiXG4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6aHRtbCk6CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8ICI8ZGV0YWlscz48c3VtbWFyeT4iOworICAgICAgICAgICAgICAgIGlmIChzZXRfYXNfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBzZXRfYXNfdHlwZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIjxzcGFuIGNsYXNzPSd0eXBlJz4iIDw8IGVsZW1lbnQgPDwgIjwvc3Bhbj4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiPHNwYW4gY2xhc3M9J3ZhbCc+IiA8PCBlbGVtZW50IDw8ICI8L3NwYW4+IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlX2Rlc2NyaXB0aW9uICE9ICIiKSB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiICg8c3BhbiBjbGFzcz0ndmFsJz4iIDw8IHZhbHVlX2Rlc2NyaXB0aW9uIDw8ICI8L3NwYW4+KSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCAiPC9zdW1tYXJ5PjwvZGV0YWlscz5cbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjpqc29uKToKKyAgICAgICAgICAgICAgICBpZiAoIWlzX2ZpcnN0X2l0ZW0udG9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsXG4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlzX2ZpcnN0X2l0ZW0udG9wKCkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8IGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgUHJpbnRFeHRlbnNpb24oc3RkOjpzdHJpbmcgZXh0X25hbWUsIHVpbnQzMl90IHJldmlzaW9uLCBpbnQgbWluX3dpZHRoID0gMCkgeworICAgICAgICBzd2l0Y2ggKG91dHB1dF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIChPdXRwdXRUeXBlOjp0ZXh0KToKKyAgICAgICAgICAgICAgICBvdXQgPDwgc3RkOjpzdHJpbmcoc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRlbnRzKSwgJ1x0JykgPDwgZXh0X25hbWUgPDwgc3RkOjpzdHJpbmcobWluX3dpZHRoIC0gZXh0X25hbWUuc2l6ZSgpLCAnICcpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgOiBleHRlbnNpb24gcmV2aXNpb24gIiA8PCByZXZpc2lvbiA8PCAiXG4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6aHRtbCk6CisgICAgICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8ICI8ZGV0YWlscz48c3VtbWFyeT48c3BhbiBjbGFzcz0ndHlwZSc+IiA8PCBleHRfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiPC9zcGFuPiIgPDwgc3RkOjpzdHJpbmcobWluX3dpZHRoIC0gZXh0X25hbWUuc2l6ZSgpLCAnICcpIDw8ICIgOiBleHRlbnNpb24gcmV2aXNpb24gPHNwYW4gY2xhc3M9J3ZhbCc+IgorICAgICAgICAgICAgICAgICAgICA8PCByZXZpc2lvbiA8PCAiPC9zcGFuPjwvc3VtbWFyeT48L2RldGFpbHM+XG4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoT3V0cHV0VHlwZTo6anNvbik6CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBBZGROZXdsaW5lKCkgeworICAgICAgICBpZiAob3V0cHV0X3R5cGUgPT0gT3V0cHV0VHlwZTo6dGV4dCkgeworICAgICAgICAgICAgb3V0IDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBJbmRlbnRJbmNyZWFzZSgpIHsKKyAgICAgICAgaWYgKG91dHB1dF90eXBlID09IE91dHB1dFR5cGU6OnRleHQpIHsKKyAgICAgICAgICAgIGluZGVudHMrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIEluZGVudERlY3JlYXNlKCkgeworICAgICAgICBpZiAob3V0cHV0X3R5cGUgPT0gT3V0cHV0VHlwZTo6dGV4dCkgeworICAgICAgICAgICAgaW5kZW50cy0tOworICAgICAgICAgICAgYXNzZXJ0KGluZGVudHMgPj0gMCAmJiAiaW5kZW50cyBjYW5ub3QgZ28gYmVsb3cgemVybyIpOworICAgICAgICB9CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgT3V0cHV0VHlwZSBvdXRwdXRfdHlwZTsKKyAgICBzdGQ6Om9zdHJlYW0gJm91dDsKKyAgICBpbnQgaW5kZW50cyA9IDA7CisKKyAgICAvLyBoZWFkZXIsIHN1YmhlYWRlcgorICAgIGJvb2wgc2V0X25leHRfaGVhZGVyID0gZmFsc2U7CisgICAgYm9vbCBzZXRfbmV4dF9zdWJoZWFkZXIgPSBmYWxzZTsKKworICAgIC8vIGh0bWwgY29sb3JpbmcKKyAgICBib29sIHNldF9hc190eXBlID0gZmFsc2U7CisKKyAgICAvLyBvcGVuIDxkZXRhaWxzPgorICAgIGJvb2wgc2V0X2RldGFpbHNfb3BlbiA9IGZhbHNlOworCisgICAgLy8gbWFrZSBvYmplY3QgdGl0bGVzIHRoZSBjb2xvciBvZiB0eXBlcworICAgIGJvb2wgc2V0X29iamVjdF9uYW1lX2FzX3R5cGUgPSBmYWxzZTsKKworICAgIC8vIG9iamVjdHMgd2hpY2ggYXJlIGluIGFuIGFycmF5CisgICAgaW50IGVsZW1lbnRfaW5kZXggPSAtMTsgIC8vIG5lZ2F0aXZlIG9uZSBpcyB0aGUgc2VudGluZWwgdmFsdWUKKworICAgIC8vIGpzb24KKyAgICBzdGQ6OnN0YWNrPGJvb2w+IGlzX2ZpcnN0X2l0ZW07CisKKyAgICAvLyB1dGlsaXR5CisgICAgdm9pZCBQcmludEhlYWRlclVuZGVybGluZXMoc2l6ZV90IGxlbmd0aCkgeworICAgICAgICBhc3NlcnQoaW5kZW50cyA+PSAwICYmICJpbmRlbnRzIG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIGFzc2VydChsZW5ndGggPD0gMTAwMDAgJiYgImxlbmd0aCBzaG91bGRuJ3QgYmUgdW5yZWFzb25hYmx5IGxhcmdlIik7CisgICAgICAgIGlmIChzZXRfbmV4dF9oZWFkZXIpIHsKKyAgICAgICAgICAgIG91dCA8PCBzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGVudHMpLCAnXHQnKSA8PCBzdGQ6OnN0cmluZyhsZW5ndGgsICc9JykgPDwgIlxuIjsKKyAgICAgICAgICAgIHNldF9uZXh0X2hlYWRlciA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHNldF9uZXh0X3N1YmhlYWRlcikgeworICAgICAgICAgICAgb3V0IDw8IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZW50cyksICdcdCcpIDw8IHN0ZDo6c3RyaW5nKGxlbmd0aCwgJy0nKSA8PCAiXG4iOworICAgICAgICAgICAgc2V0X25leHRfc3ViaGVhZGVyID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby92dWxrYW5pbmZvLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhYzNiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby5jcHAKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBEYXZpZCBQaW5lZG8gPGRhdmlkQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUmVuZSBMaW5kc2F5IDxyZW5lQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEplcmVteSBLbmlhZ2VyIDxqZXJlbXlrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFNoYW5ub24gTWNQaGVyc29uIDxzaGFubm9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEJvYiBFbGxpc29uIDxib2JAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ2hhcmxlcyBHaWVzc2VuIDxjaGFybGVzQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJ2dWxrYW5pbmZvLmhwcCIKKworI2lmZGVmIF9XSU4zMgorLy8gSW5pdGlhbGl6ZSBVc2VyMzIgcG9pbnRlcnMKK1BGTl9BZGp1c3RXaW5kb3dSZWN0IFVzZXIzMkhhbmRsZXM6OnBmbkFkanVzdFdpbmRvd1JlY3QgPSBudWxscHRyOworUEZOX0NyZWF0ZVdpbmRvd0V4QSBVc2VyMzJIYW5kbGVzOjpwZm5DcmVhdGVXaW5kb3dFeEEgPSBudWxscHRyOworUEZOX0RlZldpbmRvd1Byb2NBIFVzZXIzMkhhbmRsZXM6OnBmbkRlZldpbmRvd1Byb2NBID0gbnVsbHB0cjsKK1BGTl9EZXN0cm95V2luZG93IFVzZXIzMkhhbmRsZXM6OnBmbkRlc3Ryb3lXaW5kb3cgPSBudWxscHRyOworUEZOX0xvYWRJY29uQSBVc2VyMzJIYW5kbGVzOjpwZm5Mb2FkSWNvbkEgPSBudWxscHRyOworUEZOX1JlZ2lzdGVyQ2xhc3NFeEEgVXNlcjMySGFuZGxlczo6cGZuUmVnaXN0ZXJDbGFzc0V4QSA9IG51bGxwdHI7CisKK0hNT0RVTEUgVXNlcjMySGFuZGxlczo6dXNlcjMyRGxsSGFuZGxlID0gbnVsbHB0cjsKKworI2VuZGlmCisKKy8vID09PT09PT09PT09IER1bXAgRnVuY3Rpb25zID09PT09PT09PSAvLworCit2b2lkIER1bXBFeHRlbnNpb25zKFByaW50ZXIgJnAsIHN0ZDo6c3RyaW5nIGxheWVyX25hbWUsIHN0ZDo6dmVjdG9yPFZrRXh0ZW5zaW9uUHJvcGVydGllcz4gZXh0ZW5zaW9ucykgeworICAgIHN0ZDo6c29ydChleHRlbnNpb25zLmJlZ2luKCksIGV4dGVuc2lvbnMuZW5kKCksIFtdKFZrRXh0ZW5zaW9uUHJvcGVydGllcyAmYSwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICZiKSAtPiBpbnQgeworICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoYS5leHRlbnNpb25OYW1lKSA8IHN0ZDo6c3RyaW5nKGIuZXh0ZW5zaW9uTmFtZSk7CisgICAgfSk7CisKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgcmV0dXJuOworCisgICAgaW50IG1heF9sZW5ndGggPSAwOworICAgIGlmIChleHRlbnNpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgbWF4X2xlbmd0aCA9IHN0YXRpY19jYXN0PGludD4oc3RybGVuKGV4dGVuc2lvbnMuYXQoMCkuZXh0ZW5zaW9uTmFtZSkpOworICAgICAgICBmb3IgKGF1dG8gJmV4dCA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KHN0cmxlbihleHQuZXh0ZW5zaW9uTmFtZSkpOworICAgICAgICAgICAgaWYgKGxlbiA+IG1heF9sZW5ndGgpIG1heF9sZW5ndGggPSBsZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwLkFycmF5U3RhcnQobGF5ZXJfbmFtZSArICIgRXh0ZW5zaW9ucyIsIGV4dGVuc2lvbnMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJmV4dCA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgcC5QcmludEV4dGVuc2lvbihleHQuZXh0ZW5zaW9uTmFtZSwgZXh0LnNwZWNWZXJzaW9uLCBtYXhfbGVuZ3RoKTsKKyAgICB9CisgICAgcC5BcnJheUVuZCgpOworfQorCit2b2lkIER1bXBMYXllcnMoUHJpbnRlciAmcCwgc3RkOjp2ZWN0b3I8TGF5ZXJFeHRlbnNpb25MaXN0PiBsYXllcnMsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBcHBHcHU+PiAmZ3B1cykgeworICAgIHN0ZDo6c29ydChsYXllcnMuYmVnaW4oKSwgbGF5ZXJzLmVuZCgpLCBbXShMYXllckV4dGVuc2lvbkxpc3QgJmxlZnQsIExheWVyRXh0ZW5zaW9uTGlzdCAmcmlnaHQpIC0+IGludCB7CisgICAgICAgIGNvbnN0IGNoYXIgKmEgPSBsZWZ0LmxheWVyX3Byb3BlcnRpZXMubGF5ZXJOYW1lOworICAgICAgICBjb25zdCBjaGFyICpiID0gcmlnaHQubGF5ZXJfcHJvcGVydGllcy5sYXllck5hbWU7CisgICAgICAgIHJldHVybiBhICYmICghYiB8fCBzdGQ6OnN0cmNtcChhLCBiKSA8IDApOworICAgIH0pOworCisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6OnRleHQgfHwgcC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6aHRtbCkgeworICAgICAgICBwLlNldEhlYWRlcigpLkFycmF5U3RhcnQoIkxheWVycyIsIGxheWVycy5zaXplKCkpOworICAgICAgICBwLkluZGVudERlY3JlYXNlKCk7CisgICAgICAgIGZvciAoYXV0byAmbGF5ZXIgOiBsYXllcnMpIHsKKyAgICAgICAgICAgIGF1dG8gdl9zdHIgPSBWa1ZlcnNpb25TdHJpbmcobGF5ZXIubGF5ZXJfcHJvcGVydGllcy5zcGVjVmVyc2lvbik7CisgICAgICAgICAgICBhdXRvIHByb3BzID0gbGF5ZXIubGF5ZXJfcHJvcGVydGllczsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgaGVhZGVyOworICAgICAgICAgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6OnRleHQpCisgICAgICAgICAgICAgICAgaGVhZGVyID0gc3RkOjpzdHJpbmcocHJvcHMubGF5ZXJOYW1lKSArICIgKCIgKyBwcm9wcy5kZXNjcmlwdGlvbiArICIpIFZ1bGthbiB2ZXJzaW9uICIgKyB2X3N0ciArCisgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbGF5ZXIgdmVyc2lvbiAiICsgc3RkOjp0b19zdHJpbmcocHJvcHMuaW1wbGVtZW50YXRpb25WZXJzaW9uKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Omh0bWwpCisgICAgICAgICAgICAgICAgaGVhZGVyID0gc3RkOjpzdHJpbmcoIjxzcGFuIGNsYXNzPSd0eXBlJz4iKSArIHByb3BzLmxheWVyTmFtZSArICI8L3NwYW4+ICgiICsgcHJvcHMuZGVzY3JpcHRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAgICIpIFZ1bGthbiB2ZXJzaW9uIDxzcGFuIGNsYXNzPSd2YWwnPiIgKyB2X3N0ciArICI8L3NwYW4+LCBsYXllciB2ZXJzaW9uIDxzcGFuIGNsYXNzPSd2YWwnPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHByb3BzLmltcGxlbWVudGF0aW9uVmVyc2lvbikgKyAiPC9zcGFuPiI7CisKKyAgICAgICAgICAgIHAuT2JqZWN0U3RhcnQoaGVhZGVyKTsKKyAgICAgICAgICAgIER1bXBFeHRlbnNpb25zKHAsICJMYXllciIsIGxheWVyLmV4dGVuc2lvbl9wcm9wZXJ0aWVzKTsKKworICAgICAgICAgICAgcC5BcnJheVN0YXJ0KCJEZXZpY2VzIiwgZ3B1cy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChhdXRvICZncHUgOiBncHVzKSB7CisgICAgICAgICAgICAgICAgcC5QcmludEVsZW1lbnQoc3RkOjpzdHJpbmcoIkdQVSBpZCBcdDogIikgKyBzdGQ6OnRvX3N0cmluZyhncHUtPmlkKSwgZ3B1LT5wcm9wcy5kZXZpY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBhdXRvIGV4dHMgPSBncHUtPkFwcEdldFBoeXNpY2FsRGV2aWNlTGF5ZXJFeHRlbnNpb25zKHByb3BzLmxheWVyTmFtZSk7CisgICAgICAgICAgICAgICAgRHVtcEV4dGVuc2lvbnMocCwgIkxheWVyLURldmljZSIsIGV4dHMpOworICAgICAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcC5BcnJheUVuZCgpOworICAgICAgICAgICAgcC5PYmplY3RFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBwLkluZGVudEluY3JlYXNlKCk7CisgICAgICAgIHAuQXJyYXlFbmQoKTsKKyAgICB9IGVsc2UgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5BcnJheVN0YXJ0KCJBcnJheU9mVmtMYXllclByb3BlcnRpZXMiLCBsYXllcnMuc2l6ZSgpKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKGF1dG8gJmxheWVyIDogbGF5ZXJzKSB7CisgICAgICAgICAgICBwLlNldEVsZW1lbnRJbmRleChpKyspOworICAgICAgICAgICAgRHVtcFZrTGF5ZXJQcm9wZXJ0aWVzKHAsICJsYXllclByb3BlcnR5IiwgbGF5ZXIubGF5ZXJfcHJvcGVydGllcyk7CisgICAgICAgIH0KKyAgICAgICAgcC5BcnJheUVuZCgpOworICAgIH0KK30KKwordm9pZCBEdW1wU3VyZmFjZUZvcm1hdHMoUHJpbnRlciAmcCwgQXBwSW5zdGFuY2UgJmluc3QsIEFwcFN1cmZhY2UgJnN1cmZhY2UpIHsKKyAgICBwLkFycmF5U3RhcnQoIkZvcm1hdHMiLCBzdXJmYWNlLnN1cmZfZm9ybWF0czIuc2l6ZSgpKTsKKyAgICBpbnQgaSA9IDA7CisgICAgaWYgKGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgZm9yIChhdXRvICZmb3JtYXQgOiBzdXJmYWNlLnN1cmZfZm9ybWF0czIpIHsKKyAgICAgICAgICAgIHAuU2V0RWxlbWVudEluZGV4KGkrKyk7CisgICAgICAgICAgICBEdW1wVmtTdXJmYWNlRm9ybWF0S0hSKHAsICJTdXJmYWNlRm9ybWF0IiwgZm9ybWF0LnN1cmZhY2VGb3JtYXQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChhdXRvICZmb3JtYXQgOiBzdXJmYWNlLnN1cmZfZm9ybWF0cykgeworICAgICAgICAgICAgcC5TZXRFbGVtZW50SW5kZXgoaSsrKTsKKyAgICAgICAgICAgIER1bXBWa1N1cmZhY2VGb3JtYXRLSFIocCwgIlN1cmZhY2VGb3JtYXQiLCBmb3JtYXQpOworICAgICAgICB9CisgICAgfQorICAgIHAuQXJyYXlFbmQoKTsKK30KKwordm9pZCBEdW1wUHJlc2VudE1vZGVzKFByaW50ZXIgJnAsIEFwcFN1cmZhY2UgJnN1cmZhY2UpIHsKKyAgICBwLkFycmF5U3RhcnQoIlByZXNlbnQgTW9kZXMiLCBzdXJmYWNlLnN1cmZfcHJlc2VudF9tb2Rlcy5zaXplKCkpOworICAgIGZvciAoYXV0byAmbW9kZSA6IHN1cmZhY2Uuc3VyZl9wcmVzZW50X21vZGVzKSB7CisgICAgICAgIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KFZrUHJlc2VudE1vZGVLSFJTdHJpbmcobW9kZSkpOworICAgIH0KKyAgICBwLkFycmF5RW5kKCk7Cit9CisKK3ZvaWQgRHVtcFN1cmZhY2VDYXBhYmlsaXRpZXMoUHJpbnRlciAmcCwgQXBwSW5zdGFuY2UgJmluc3QsIEFwcEdwdSAmZ3B1LCBBcHBTdXJmYWNlICZzdXJmYWNlKSB7CisgICAgYXV0byAmc3VyZl9jYXAgPSBzdXJmYWNlLnN1cmZhY2VfY2FwYWJpbGl0aWVzOworICAgIHAuU2V0U3ViSGVhZGVyKCk7CisgICAgRHVtcFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUihwLCAiVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIiwgc3VyZl9jYXApOworCisgICAgcC5TZXRTdWJIZWFkZXIoKS5PYmplY3RTdGFydCgiVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCIpOworICAgIHsKKyAgICAgICAgcC5PYmplY3RTdGFydCgic3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzIik7CisgICAgICAgIGlmIChzdXJmYWNlLnN1cmZhY2VfY2FwYWJpbGl0aWVzMl9leHQuc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzID09IDApIHAuUHJpbnRFbGVtZW50KCJOb25lIik7CisgICAgICAgIGlmIChzdXJmYWNlLnN1cmZhY2VfY2FwYWJpbGl0aWVzMl9leHQuc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzICYgVktfU1VSRkFDRV9DT1VOVEVSX1ZCTEFOS19FWFQpIHsKKyAgICAgICAgICAgIHAuU2V0QXNUeXBlKCkuUHJpbnRFbGVtZW50KCJWS19TVVJGQUNFX0NPVU5URVJfVkJMQU5LX0VYVCIpOworICAgICAgICB9CisgICAgICAgIHAuT2JqZWN0RW5kKCk7CisgICAgfQorICAgIHAuT2JqZWN0RW5kKCk7ICAvLyBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUCisKKyAgICBjaGFpbl9pdGVyYXRvcl9zdXJmYWNlX2NhcGFiaWxpdGllczIocCwgaW5zdCwgZ3B1LCBzdXJmYWNlLnN1cmZhY2VfY2FwYWJpbGl0aWVzMl9raHIucE5leHQpOworfQorCit2b2lkIER1bXBTdXJmYWNlKFByaW50ZXIgJnAsIEFwcEluc3RhbmNlICZpbnN0LCBBcHBHcHUgJmdwdSwgQXBwU3VyZmFjZSAmc3VyZmFjZSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN1cmZhY2VfdHlwZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBoZWFkZXI7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6OnRleHQpCisgICAgICAgIGhlYWRlciA9IHN0ZDo6c3RyaW5nKCJHUFUgaWQgOiAiKSArIHN0ZDo6dG9fc3RyaW5nKGdwdS5pZCkgKyAiICgiICsgZ3B1LnByb3BzLmRldmljZU5hbWUgKyAiKSI7CisgICAgZWxzZSBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6aHRtbCkKKyAgICAgICAgaGVhZGVyID0gc3RkOjpzdHJpbmcoIkdQVSBpZCA6IDxzcGFuIGNsYXNzPSd2YWwnPiIpICsgc3RkOjp0b19zdHJpbmcoZ3B1LmlkKSArICI8L3NwYW4+ICgiICsgZ3B1LnByb3BzLmRldmljZU5hbWUgKyAiKSI7CisgICAgcC5PYmplY3RTdGFydChoZWFkZXIpOworCisgICAgaWYgKHN1cmZhY2VfdHlwZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcC5TZXRBc1R5cGUoKS5QcmludEtleVZhbHVlKCJTdXJmYWNlIHR5cGUiLCBzdXJmYWNlLnN1cmZhY2VfZXh0ZW5zaW9uLm5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHAuQXJyYXlTdGFydCgiU3VyZmFjZSB0eXBlcyIsIHN1cmZhY2VfdHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChhdXRvICZuYW1lIDogc3VyZmFjZV90eXBlcykgeworICAgICAgICAgICAgcC5QcmludEVsZW1lbnQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcC5BcnJheUVuZCgpOworICAgIH0KKworICAgIER1bXBTdXJmYWNlRm9ybWF0cyhwLCBpbnN0LCBzdXJmYWNlKTsKKworICAgIER1bXBQcmVzZW50TW9kZXMocCwgc3VyZmFjZSk7CisKKyAgICBEdW1wU3VyZmFjZUNhcGFiaWxpdGllcyhwLCBpbnN0LCBncHUsIHN1cmZhY2UpOworCisgICAgcC5PYmplY3RFbmQoKTsKKyAgICBwLkFkZE5ld2xpbmUoKTsKK30KKworc3RydWN0IFN1cmZhY2VUeXBlR3JvdXAgeworICAgIEFwcFN1cmZhY2UgKnN1cmZhY2U7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN1cmZhY2VfdHlwZXM7CisgICAgQXBwR3B1ICpncHU7Cit9OworCitib29sIG9wZXJhdG9yPT0oQXBwU3VyZmFjZSBjb25zdCAmYSwgQXBwU3VyZmFjZSBjb25zdCAmYikgeworICAgIHJldHVybiBhLnN1cmZfcHJlc2VudF9tb2RlcyA9PSBiLnN1cmZfcHJlc2VudF9tb2RlcyAmJiBhLnN1cmZfZm9ybWF0cyA9PSBiLnN1cmZfZm9ybWF0cyAmJiBhLnN1cmZfZm9ybWF0czIgPT0gYi5zdXJmX2Zvcm1hdHMyICYmCisgICAgICAgICAgIGEuc3VyZmFjZV9jYXBhYmlsaXRpZXMgPT0gYi5zdXJmYWNlX2NhcGFiaWxpdGllcyAmJiBhLnN1cmZhY2VfY2FwYWJpbGl0aWVzMl9raHIgPT0gYi5zdXJmYWNlX2NhcGFiaWxpdGllczJfa2hyICYmCisgICAgICAgICAgIGEuc3VyZmFjZV9jYXBhYmlsaXRpZXMyX2V4dCA9PSBiLnN1cmZhY2VfY2FwYWJpbGl0aWVzMl9leHQ7Cit9CisKK3ZvaWQgRHVtcFByZXNlbnRhYmxlU3VyZmFjZXMoUHJpbnRlciAmcCwgQXBwSW5zdGFuY2UgJmluc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBcHBHcHU+PiAmZ3B1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFwcFN1cmZhY2U+PiAmc3VyZmFjZXMpIHsKKyAgICBwLlNldEhlYWRlcigpLk9iamVjdFN0YXJ0KCJQcmVzZW50YWJsZSBTdXJmYWNlcyIpOworICAgIHAuSW5kZW50RGVjcmVhc2UoKTsKKyAgICBzdGQ6OnZlY3RvcjxTdXJmYWNlVHlwZUdyb3VwPiBzdXJmYWNlX2xpc3Q7CisKKyAgICBmb3IgKGF1dG8gJnN1cmZhY2UgOiBzdXJmYWNlcykgeworICAgICAgICBmb3IgKGF1dG8gJmdwdSA6IGdwdXMpIHsKKyAgICAgICAgICAgIGF1dG8gZXhpc3RzID0gc3VyZmFjZV9saXN0LmVuZCgpOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gc3VyZmFjZV9saXN0LmJlZ2luKCk7IGl0ICE9IHN1cmZhY2VfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgICAgIC8vIHVzZSBjdXN0b20gY29tcGFyYXRvciB0byBjaGVjayBpZiB0aGUgc3VyZmFjZSBoYXMgdGhlIHNhbWUgdmFsdWVzCisgICAgICAgICAgICAgICAgaWYgKGl0LT5ncHUgPT0gZ3B1LmdldCgpICYmICppdC0+c3VyZmFjZSA9PSAqc3VyZmFjZS5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSBpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXhpc3RzICE9IHN1cmZhY2VfbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGV4aXN0cy0+c3VyZmFjZV90eXBlcy5wdXNoX2JhY2soc3VyZmFjZS5nZXQoKS0+c3VyZmFjZV9leHRlbnNpb24ubmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1cmZhY2VfbGlzdC5wdXNoX2JhY2soe3N1cmZhY2UuZ2V0KCksIHtzdXJmYWNlLmdldCgpLT5zdXJmYWNlX2V4dGVuc2lvbi5uYW1lfSwgZ3B1LmdldCgpfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvICZncm91cCA6IHN1cmZhY2VfbGlzdCkgeworICAgICAgICBEdW1wU3VyZmFjZShwLCBpbnN0LCAqZ3JvdXAuZ3B1LCAqZ3JvdXAuc3VyZmFjZSwgZ3JvdXAuc3VyZmFjZV90eXBlcyk7CisgICAgfQorICAgIHAuSW5kZW50SW5jcmVhc2UoKTsKKyAgICBwLk9iamVjdEVuZCgpOworICAgIHAuQWRkTmV3bGluZSgpOworfQorCit2b2lkIER1bXBHcm91cHMoUHJpbnRlciAmcCwgQXBwSW5zdGFuY2UgJmluc3QpIHsKKyAgICBpZiAoaW5zdC5DaGVja0V4dGVuc2lvbkVuYWJsZWQoVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgcC5TZXRIZWFkZXIoKS5PYmplY3RTdGFydCgiR3JvdXBzIik7CisgICAgICAgIGF1dG8gZ3JvdXBzID0gR2V0R3JvdXBzKGluc3QpOworICAgICAgICBpbnQgZ3JvdXBfaWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gJmdyb3VwIDogZ3JvdXBzKSB7CisgICAgICAgICAgICBwLk9iamVjdFN0YXJ0KCJEZXZpY2UgR3JvdXAgUHJvcGVydGllcyAoR3JvdXAgIiArIHN0ZDo6dG9fc3RyaW5nKGdyb3VwX2lkKSArICIpIik7CisgICAgICAgICAgICBhdXRvIGdyb3VwX3Byb3BzID0gR2V0R3JvdXBQcm9wcyhncm91cCk7CisgICAgICAgICAgICBwLkFycmF5U3RhcnQoInBoeXNpY2FsRGV2aWNlQ291bnQiLCBncm91cC5waHlzaWNhbERldmljZUNvdW50KTsKKyAgICAgICAgICAgIGludCBpZCA9IDA7CisgICAgICAgICAgICBmb3IgKGF1dG8gJnByb3AgOiBncm91cF9wcm9wcykgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZV9vdXQgPSBwcm9wLmRldmljZU5hbWU7CisgICAgICAgICAgICAgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6OnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlX291dCArPSAiIChJRDogIiArIHN0ZDo6dG9fc3RyaW5nKGlkKyspICsgIikiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6aHRtbCkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfb3V0ICs9ICIgKElEOiA8c3BhbiBjbGFzcz0ndmFsJz4iICsgc3RkOjp0b19zdHJpbmcoaWQrKykgKyAiPC9zcGFuPikiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwLlByaW50RWxlbWVudChkZXZpY2Vfb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAuQXJyYXlFbmQoKTsKKyAgICAgICAgICAgIHAuUHJpbnRLZXlWYWx1ZSgic3Vic2V0QWxsb2NhdGlvbiIsIGdyb3VwLnN1YnNldEFsbG9jYXRpb24pOworICAgICAgICAgICAgcC5PYmplY3RFbmQoKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworCisgICAgICAgICAgICBwLk9iamVjdFN0YXJ0KCJEZXZpY2UgR3JvdXAgUHJlc2VudCBDYXBhYmlsaXRpZXMgKEdyb3VwICIgKyBzdGQ6OnRvX3N0cmluZyhncm91cF9pZCkgKyAiKSIpOworICAgICAgICAgICAgYXV0byBncm91cF9jYXBhYmlsaXRpZXMgPSBHZXRHcm91cENhcGFiaWxpdGllcyhpbnN0LCBncm91cCk7CisgICAgICAgICAgICBpZiAoZ3JvdXBfY2FwYWJpbGl0aWVzLmZpcnN0ID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgcC5QcmludEVsZW1lbnQoIkdyb3VwIGRvZXMgbm90IHN1cHBvcnQgVktfS0hSX2RldmljZV9ncm91cCwgc2tpcHBpbmcgcHJpbnRpbmcgY2FwYWJpbGl0aWVzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBncm91cC5waHlzaWNhbERldmljZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlX291dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6OnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9vdXQgPSBzdGQ6OnN0cmluZyhncm91cF9wcm9wc1tpXS5kZXZpY2VOYW1lKSArICIgKElEOiAiICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiKSI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6aHRtbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX291dCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoZ3JvdXBfcHJvcHNbaV0uZGV2aWNlTmFtZSkgKyAiIChJRDogPHNwYW4gY2xhc3M9J3ZhbCc+IiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIjwvc3Bhbj4pIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwLlByaW50RWxlbWVudChkZXZpY2Vfb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgcC5PYmplY3RTdGFydCgiQ2FuIHByZXNlbnQgaW1hZ2VzIGZyb20gdGhlIGZvbGxvd2luZyBkZXZpY2VzIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBncm91cC5waHlzaWNhbERldmljZUNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAxVSA8PCBqOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwX2NhcGFiaWxpdGllcy5zZWNvbmQucHJlc2VudE1hc2tbaV0gJiBtYXNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6OnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuUHJpbnRFbGVtZW50KHN0ZDo6c3RyaW5nKGdyb3VwX3Byb3BzW2pdLmRldmljZU5hbWUpICsgIiAoSUQ6ICIgKyBzdGQ6OnRvX3N0cmluZyhqKSArICIpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Omh0bWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuUHJpbnRFbGVtZW50KHN0ZDo6c3RyaW5nKGdyb3VwX3Byb3BzW2pdLmRldmljZU5hbWUpICsgIiAoSUQ6IDxzcGFuIGNsYXNzPSd2YWwnPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhqKSArICI8L3NwYW4+KSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHAuT2JqZWN0RW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIER1bXBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUihwLCAiUHJlc2VudCBtb2RlcyIsIGdyb3VwX2NhcGFiaWxpdGllcy5zZWNvbmQubW9kZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcC5PYmplY3RFbmQoKTsKKyAgICAgICAgICAgIHAuQWRkTmV3bGluZSgpOworICAgICAgICAgICAgZ3JvdXBfaWQrKzsKKyAgICAgICAgfQorICAgICAgICBwLk9iamVjdEVuZCgpOworICAgICAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICB9Cit9CisKK3ZvaWQgR3B1RHVtcFByb3BzKFByaW50ZXIgJnAsIEFwcEdwdSAmZ3B1KSB7CisgICAgYXV0byBwcm9wcyA9IGdwdS5HZXREZXZpY2VQcm9wZXJ0aWVzKCk7CisgICAgcC5TZXRTdWJIZWFkZXIoKS5PYmplY3RTdGFydCgiVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMiKTsKKyAgICBwLlByaW50S2V5VmFsdWUoImFwaVZlcnNpb24iLCBwcm9wcy5hcGlWZXJzaW9uLCAxNCwgVmtWZXJzaW9uU3RyaW5nKHByb3BzLmFwaVZlcnNpb24pKTsKKyAgICBwLlByaW50S2V5VmFsdWUoImRyaXZlclZlcnNpb24iLCBwcm9wcy5kcml2ZXJWZXJzaW9uLCAxNCwgdG9faGV4X3N0cihwcm9wcy5kcml2ZXJWZXJzaW9uKSk7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKCJ2ZW5kb3JJRCIsIHByb3BzLnZlbmRvcklELCAxNCk7CisgICAgICAgIHAuUHJpbnRLZXlWYWx1ZSgiZGV2aWNlSUQiLCBwcm9wcy5kZXZpY2VJRCwgMTQpOworICAgICAgICBwLlByaW50S2V5VmFsdWUoImRldmljZVR5cGUiLCBwcm9wcy5kZXZpY2VUeXBlLCAxNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKCJ2ZW5kb3JJRCIsIHRvX2hleF9zdHIocHJvcHMudmVuZG9ySUQpLCAxNCk7CisgICAgICAgIHAuUHJpbnRLZXlWYWx1ZSgiZGV2aWNlSUQiLCB0b19oZXhfc3RyKHByb3BzLmRldmljZUlEKSwgMTQpOworICAgICAgICBwLlByaW50S2V5U3RyaW5nKCJkZXZpY2VUeXBlIiwgVmtQaHlzaWNhbERldmljZVR5cGVTdHJpbmcocHJvcHMuZGV2aWNlVHlwZSksIDE0KTsKKyAgICB9CisgICAgcC5QcmludEtleVN0cmluZygiZGV2aWNlTmFtZSIsIHByb3BzLmRldmljZU5hbWUsIDE0KTsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICBwLkFycmF5U3RhcnQoInBpcGVsaW5lQ2FjaGVVVUlEIik7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19VVUlEX1NJWkU7ICsraSkgeworICAgICAgICAgICAgcC5QcmludEVsZW1lbnQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHByb3BzLnBpcGVsaW5lQ2FjaGVVVUlEW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgcC5BcnJheUVuZCgpOworICAgIH0KKyAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICBpZiAocC5UeXBlKCkgIT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICBwLk9iamVjdEVuZCgpOyAgLy8gbGltaXRzIGFuZCBzcGFyc2UgcHJvcHMgYXJlIG5vdCBzdWIgb2JqZWN0cyBpbiB0aGUgdGV4dCBhbmQgaHRtbCBvdXRwdXQKKyAgICB9CisKKyAgICBpZiAoZ3B1Lmluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMocCwgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHMiLCBncHUucHJvcHMyLnByb3BlcnRpZXMubGltaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZUxpbWl0cyhwLCAiVmtQaHlzaWNhbERldmljZUxpbWl0cyIsIGdwdS5wcm9wcy5saW1pdHMpOworICAgIH0KKyAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICBpZiAoZ3B1Lmluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgRHVtcFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzKHAsICJWa1BoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcyIsIGdwdS5wcm9wczIucHJvcGVydGllcy5zcGFyc2VQcm9wZXJ0aWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEdW1wVmtQaHlzaWNhbERldmljZVNwYXJzZVByb3BlcnRpZXMocCwgIlZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzIiwgZ3B1LnByb3BzLnNwYXJzZVByb3BlcnRpZXMpOworICAgIH0KKyAgICBwLkFkZE5ld2xpbmUoKTsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICBwLk9iamVjdEVuZCgpOyAgLy8gbGltaXRzIGFuZCBzcGFyc2UgcHJvcHMgYXJlIHN1YiBvYmplY3RzIGluIHRoZSBqc29uIG91dHB1dAorICAgIH0KKworICAgIGlmIChwLlR5cGUoKSAhPSBPdXRwdXRUeXBlOjpqc29uKSB7CisgICAgICAgIGlmIChncHUuaW5zdC5DaGVja0V4dGVuc2lvbkVuYWJsZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgdm9pZCAqcGxhY2UgPSBncHUucHJvcHMyLnBOZXh0OworICAgICAgICAgICAgY2hhaW5faXRlcmF0b3JfcGh5c19kZXZpY2VfcHJvcHMyKHAsIGdwdSwgcGxhY2UpOworICAgICAgICB9CisgICAgfQorICAgIHAuQWRkTmV3bGluZSgpOworfQordm9pZCBHcHVEdW1wUXVldWVQcm9wcyhQcmludGVyICZwLCBzdGQ6OnZlY3RvcjxTdXJmYWNlRXh0ZW5zaW9uPiAmc3VyZmFjZXMsIEFwcFF1ZXVlRmFtaWx5UHJvcGVydGllcyAmcXVldWUpIHsKKyAgICBwLlNldEhlYWRlcigpLlNldEVsZW1lbnRJbmRleChzdGF0aWNfY2FzdDxpbnQ+KHF1ZXVlLnF1ZXVlX2luZGV4KSkuT2JqZWN0U3RhcnQoIlZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzIik7CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgRHVtcFZrRXh0ZW50M0QocCwgIm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSIsIHF1ZXVlLnByb3BzLm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcC5QcmludEtleVN0cmluZygibWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5IiwgVmtFeHRlbnQzRFN0cmluZyhxdWV1ZS5wcm9wcy5taW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkpLCAyNyk7CisgICAgfQorICAgIHAuUHJpbnRLZXlWYWx1ZSgicXVldWVDb3VudCIsIHF1ZXVlLnByb3BzLnF1ZXVlQ291bnQsIDI3KTsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICBwLlByaW50S2V5VmFsdWUoInF1ZXVlRmxhZ3MiLCBxdWV1ZS5wcm9wcy5xdWV1ZUZsYWdzLCAyNyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKCJxdWV1ZUZsYWdzIiwgVmtRdWV1ZUZsYWdzU3RyaW5nKHF1ZXVlLnByb3BzLnF1ZXVlRmxhZ3MpLCAyNyk7CisgICAgfQorCisgICAgcC5QcmludEtleVZhbHVlKCJ0aW1lc3RhbXBWYWxpZEJpdHMiLCBxdWV1ZS5wcm9wcy50aW1lc3RhbXBWYWxpZEJpdHMsIDI3KTsKKworICAgIGlmIChwLlR5cGUoKSAhPSBPdXRwdXRUeXBlOjpqc29uKSB7CisgICAgICAgIGlmIChxdWV1ZS5pc19wcmVzZW50X3BsYXRmb3JtX2Fnbm9zdGljKSB7CisgICAgICAgICAgICBwLlByaW50S2V5U3RyaW5nKCJwcmVzZW50IHN1cHBvcnQiLCBxdWV1ZS5wbGF0Zm9ybXNfc3VwcG9ydF9wcmVzZW50ID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwLk9iamVjdFN0YXJ0KCJwcmVzZW50IHN1cHBvcnQiKTsKKyAgICAgICAgICAgIGZvciAoYXV0byAmc3VyZmFjZSA6IHN1cmZhY2VzKSB7CisgICAgICAgICAgICAgICAgcC5QcmludEtleVN0cmluZyhzdXJmYWNlLm5hbWUsIHN1cmZhY2Uuc3VwcG9ydHNfcHJlc2VudCA/ICJ0cnVlIiA6ICJmYWxzZSIsIDE5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAuT2JqZWN0RW5kKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcC5PYmplY3RFbmQoKTsKKyAgICBwLkFkZE5ld2xpbmUoKTsKK30KKworLy8gVGhpcyBwcmludHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtYXQgYWNjb3JkaW5nIHRvIHByZWZpeGVzIG9mIHRoZSBJbnRlcm5hdGlvbmFsIFN5c3RlbSBvZiBRdWFudGl0aWVzIChJU1EpLAorLy8gZGVmaW5lZCBpbiBJU08vSUVDIDgwMDAwLiBUaGUgcHJlZml4ZXMgdXNlZCBoZXJlIGFyZSBub3QgU0kgcHJlZml4ZXMsIGJ1dCByYXRoZXIgdGhlIGJpbmFyeSBwcmVmaXhlcyBiYXNlZCBvbiBwb3dlcnMgb2YgMTAyNAorLy8gKGtpYmktLCBtZWJpLSwgZ2liaS0gZXRjLikuCisjZGVmaW5lIGtCdWZmZXJTaXplIDMyCisKK3N0ZDo6c3RyaW5nIE51bVRvTmljZVN0cihjb25zdCBzaXplX3Qgc3opIHsKKyAgICBjb25zdCBjaGFyIHByZWZpeGVzW10gPSAiS01HVFBFWlkiOworICAgIGNoYXIgYnVmW2tCdWZmZXJTaXplXTsKKyAgICBpbnQgd2hpY2ggPSAtMTsKKyAgICBkb3VibGUgcmVzdWx0ID0gKGRvdWJsZSlzejsKKyAgICB3aGlsZSAocmVzdWx0ID4gMTAyNCAmJiB3aGljaCA8IDcpIHsKKyAgICAgICAgcmVzdWx0IC89IDEwMjQ7CisgICAgICAgICsrd2hpY2g7CisgICAgfQorCisgICAgY2hhciB1bml0W10gPSAiXDBpIjsKKyAgICBpZiAod2hpY2ggPj0gMCkgeworICAgICAgICB1bml0WzBdID0gcHJlZml4ZXNbd2hpY2hdOworICAgIH0KKyNpZmRlZiBfV0lOMzIKKyAgICBfc25wcmludGZfcyhidWYsIGtCdWZmZXJTaXplICogc2l6ZW9mKGNoYXIpLCBrQnVmZmVyU2l6ZSwgIiUuMmYgJXNCIiwgcmVzdWx0LCB1bml0KTsKKyNlbHNlCisgICAgc25wcmludGYoYnVmLCBrQnVmZmVyU2l6ZSwgIiUuMmYgJXNCIiwgcmVzdWx0LCB1bml0KTsKKyNlbmRpZgorICAgIHJldHVybiBzdGQ6OnN0cmluZyhidWYpOworfQorCit2b2lkIEdwdUR1bXBNZW1vcnlQcm9wcyhQcmludGVyICZwLCBBcHBHcHUgJmdwdSkgeworICAgIHAuU2V0SGVhZGVyKCkuT2JqZWN0U3RhcnQoIlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIik7CisgICAgcC5JbmRlbnREZWNyZWFzZSgpOworICAgIHAuQXJyYXlTdGFydCgibWVtb3J5SGVhcHMiLCBncHUubWVtb3J5X3Byb3BzLm1lbW9yeUhlYXBDb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdwdS5tZW1vcnlfcHJvcHMubWVtb3J5SGVhcENvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIG1lbVNpemUgPSBncHUubWVtb3J5X3Byb3BzLm1lbW9yeUhlYXBzW2ldLnNpemU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1lbV9zaXplX2h1bWFuX3JlYWRhYmxlID0gTnVtVG9OaWNlU3RyKHN0YXRpY19jYXN0PHNpemVfdD4obWVtU2l6ZSkpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1lbV9zaXplX3N0ciA9IHN0ZDo6dG9fc3RyaW5nKG1lbVNpemUpICsgIiAoIiArIHRvX2hleF9zdHIobWVtU2l6ZSkgKyAiKSAoIiArIG1lbV9zaXplX2h1bWFuX3JlYWRhYmxlICsgIikiOworCisgICAgICAgIHAuU2V0RWxlbWVudEluZGV4KHN0YXRpY19jYXN0PGludD4oaSkpLk9iamVjdFN0YXJ0KCJtZW1vcnlIZWFwcyIpOworICAgICAgICBpZiAocC5UeXBlKCkgIT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICAgICAgcC5QcmludEtleVZhbHVlKCJzaXplIiwgbWVtX3NpemVfc3RyLCA2KTsKKyAgICAgICAgICAgIHAuUHJpbnRLZXlWYWx1ZSgiYnVkZ2V0IiwgZ3B1LmhlYXBCdWRnZXRbaV0sIDYpOworICAgICAgICAgICAgcC5QcmludEtleVZhbHVlKCJ1c2FnZSIsIGdwdS5oZWFwVXNhZ2VbaV0sIDYpOworICAgICAgICAgICAgRHVtcFZrTWVtb3J5SGVhcEZsYWdzKHAsICJmbGFncyIsIGdwdS5tZW1vcnlfcHJvcHMubWVtb3J5SGVhcHNbaV0uZmxhZ3MsIDYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcC5QcmludEtleVZhbHVlKCJmbGFncyIsIGdwdS5tZW1vcnlfcHJvcHMubWVtb3J5SGVhcHNbaV0uZmxhZ3MpOworICAgICAgICAgICAgcC5QcmludEtleVZhbHVlKCJzaXplIiwgbWVtU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcC5PYmplY3RFbmQoKTsKKyAgICB9CisgICAgcC5BcnJheUVuZCgpOworCisgICAgcC5BcnJheVN0YXJ0KCJtZW1vcnlUeXBlcyIsIGdwdS5tZW1vcnlfcHJvcHMubWVtb3J5VHlwZUNvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZ3B1Lm1lbW9yeV9wcm9wcy5tZW1vcnlUeXBlQ291bnQ7ICsraSkgeworICAgICAgICBwLlNldEVsZW1lbnRJbmRleChzdGF0aWNfY2FzdDxpbnQ+KGkpKS5PYmplY3RTdGFydCgibWVtb3J5VHlwZXMiKTsKKyAgICAgICAgcC5QcmludEtleVZhbHVlKCJoZWFwSW5kZXgiLCBncHUubWVtb3J5X3Byb3BzLm1lbW9yeVR5cGVzW2ldLmhlYXBJbmRleCwgMTMpOworICAgICAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICAgICAgcC5QcmludEtleVZhbHVlKCJwcm9wZXJ0eUZsYWdzIiwgZ3B1Lm1lbW9yeV9wcm9wcy5tZW1vcnlUeXBlc1tpXS5wcm9wZXJ0eUZsYWdzLCAxMyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdXRvIGZsYWdzID0gZ3B1Lm1lbW9yeV9wcm9wcy5tZW1vcnlUeXBlc1tpXS5wcm9wZXJ0eUZsYWdzOworICAgICAgICAgICAgRHVtcFZrTWVtb3J5UHJvcGVydHlGbGFncyhwLCAicHJvcGVydHlGbGFncyA9ICIgKyB0b19oZXhfc3RyKGZsYWdzKSwgZmxhZ3MpOworCisgICAgICAgICAgICBwLk9iamVjdFN0YXJ0KCJ1c2FibGUgZm9yIik7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtZW10eXBlX2JpdCA9IDFVIDw8IGk7CisKKyAgICAgICAgICAgIC8vIG9ubHkgbGluZWFyIGFuZCBvcHRpbWFsIHRpbGluZyBjb25zaWRlcmVkCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOyB0aWxpbmcgPCBncHUubWVtX3R5cGVfcmVzX3N1cHBvcnQuaW1hZ2Uuc2l6ZSgpOyArK3RpbGluZykgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWJsZTsKKyAgICAgICAgICAgICAgICB1c2FibGUgKz0gc3RkOjpzdHJpbmcoVmtJbWFnZVRpbGluZ1N0cmluZyhWa0ltYWdlVGlsaW5nKHRpbGluZykpKSArICI6ICI7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9yaWdfdXNhYmxlX3N0cl9zaXplID0gdXNhYmxlLnNpemUoKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBmbXRfaSA9IDA7IGZtdF9pIDwgZ3B1Lm1lbV90eXBlX3Jlc19zdXBwb3J0LmltYWdlW3RpbGluZ10uc2l6ZSgpOyArK2ZtdF9pKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbUltYWdlU3VwcG9ydCAqaW1hZ2Vfc3VwcG9ydCA9ICZncHUubWVtX3R5cGVfcmVzX3N1cHBvcnQuaW1hZ2VbdGlsaW5nXVtmbXRfaV07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgcmVndWxhcl9jb21wYXRpYmxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N1cHBvcnQtPnJlZ3VsYXJfc3VwcG9ydGVkICYmIChpbWFnZV9zdXBwb3J0LT5yZWd1bGFyX21lbXR5cGVzICYgbWVtdHlwZV9iaXQpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHNwYXJzZV9jb21wYXRpYmxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N1cHBvcnQtPnNwYXJzZV9zdXBwb3J0ZWQgJiYgKGltYWdlX3N1cHBvcnQtPnNwYXJzZV9tZW10eXBlcyAmIG1lbXR5cGVfYml0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB0cmFuc2llbnRfY29tcGF0aWJsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9zdXBwb3J0LT50cmFuc2llbnRfc3VwcG9ydGVkICYmIChpbWFnZV9zdXBwb3J0LT50cmFuc2llbnRfbWVtdHlwZXMgJiBtZW10eXBlX2JpdCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ3VsYXJfY29tcGF0aWJsZSB8fCBzcGFyc2VfY29tcGF0aWJsZSB8fCB0cmFuc2llbnRfY29tcGF0aWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgdXNhYmxlICs9ICIsICI7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm10X2kgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWJsZSArPSAiY29sb3IgaW1hZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlICs9IFZrRm9ybWF0U3RyaW5nKGdwdS5tZW1fdHlwZV9yZXNfc3VwcG9ydC5pbWFnZVt0aWxpbmddW2ZtdF9pXS5mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVndWxhcl9jb21wYXRpYmxlICYmICFzcGFyc2VfY29tcGF0aWJsZSAmJiAhdHJhbnNpZW50X2NvbXBhdGlibGUgJiYgaW1hZ2Vfc3VwcG9ydC0+c3BhcnNlX3N1cHBvcnRlZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N1cHBvcnQtPnRyYW5zaWVudF9zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FibGUgKz0gIihub24tc3BhcnNlLCBub24tdHJhbnNpZW50KSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZ3VsYXJfY29tcGF0aWJsZSAmJiAhc3BhcnNlX2NvbXBhdGlibGUgJiYgaW1hZ2Vfc3VwcG9ydC0+c3BhcnNlX3N1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZV9zdXBwb3J0LT5zcGFyc2Vfc3VwcG9ydGVkKSB1c2FibGUgKz0gIihub24tc3BhcnNlKSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZ3VsYXJfY29tcGF0aWJsZSAmJiAhdHJhbnNpZW50X2NvbXBhdGlibGUgJiYgaW1hZ2Vfc3VwcG9ydC0+dHJhbnNpZW50X3N1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZV9zdXBwb3J0LT50cmFuc2llbnRfc3VwcG9ydGVkKSB1c2FibGUgKz0gIihub24tdHJhbnNpZW50KSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZWd1bGFyX2NvbXBhdGlibGUgJiYgc3BhcnNlX2NvbXBhdGlibGUgJiYgIXRyYW5zaWVudF9jb21wYXRpYmxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N1cHBvcnQtPnNwYXJzZV9zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2Vfc3VwcG9ydC0+c3BhcnNlX3N1cHBvcnRlZCkgdXNhYmxlICs9ICIoc3BhcnNlIG9ubHkpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlZ3VsYXJfY29tcGF0aWJsZSAmJiAhc3BhcnNlX2NvbXBhdGlibGUgJiYgdHJhbnNpZW50X2NvbXBhdGlibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Vfc3VwcG9ydC0+dHJhbnNpZW50X3N1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZV9zdXBwb3J0LT50cmFuc2llbnRfc3VwcG9ydGVkKSB1c2FibGUgKz0gIih0cmFuc2llbnQgb25seSkiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVndWxhcl9jb21wYXRpYmxlICYmIHNwYXJzZV9jb21wYXRpYmxlICYmIHRyYW5zaWVudF9jb21wYXRpYmxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N1cHBvcnQtPnNwYXJzZV9zdXBwb3J0ZWQgJiYgaW1hZ2Vfc3VwcG9ydC0+dHJhbnNpZW50X3N1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWJsZSArPSAiKHNwYXJzZSBhbmQgdHJhbnNpZW50IG9ubHkpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodXNhYmxlLnNpemUoKSA9PSBvcmlnX3VzYWJsZV9zdHJfc2l6ZSkgIC8vIG5vdCB1c2FibGUgZm9yIGFueXRoaW5nCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2FibGUgKz0gIk5vbmUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwLlByaW50RWxlbWVudCh1c2FibGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcC5PYmplY3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHAuT2JqZWN0RW5kKCk7CisgICAgfQorICAgIHAuQXJyYXlFbmQoKTsKKyAgICBwLkluZGVudEluY3JlYXNlKCk7CisgICAgcC5PYmplY3RFbmQoKTsKKyAgICBwLkFkZE5ld2xpbmUoKTsKK30KKwordm9pZCBHcHVEdW1wRmVhdHVyZXMoUHJpbnRlciAmcCwgQXBwR3B1ICZncHUpIHsKKyAgICBwLlNldEhlYWRlcigpOworICAgIER1bXBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMocCwgIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyIsIGdwdS5mZWF0dXJlcyk7CisgICAgcC5BZGROZXdsaW5lKCk7CisgICAgaWYgKHAuVHlwZSgpICE9IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgaWYgKGdwdS5pbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICB2b2lkICpwbGFjZSA9IGdwdS5mZWF0dXJlczIucE5leHQ7CisgICAgICAgICAgICBjaGFpbl9pdGVyYXRvcl9waHlzX2RldmljZV9mZWF0dXJlczIocCwgZ3B1LCBwbGFjZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3B1RHVtcEZvcm1hdFByb3BlcnR5KFByaW50ZXIgJnAsIFZrRm9ybWF0IGZtdCwgVmtGb3JtYXRQcm9wZXJ0aWVzIHByb3ApIHsKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6dGV4dCkgeworICAgICAgICBwLk9iamVjdFN0YXJ0KCJQcm9wZXJ0aWVzIik7CisgICAgfSBlbHNlIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpodG1sKSB7CisgICAgICAgIHAuU2V0VGl0bGVBc1R5cGUoKS5PYmplY3RTdGFydChWa0Zvcm1hdFN0cmluZyhmbXQpKTsKKyAgICB9IGVsc2UgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5PYmplY3RTdGFydCgiIik7CisgICAgfQorICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpodG1sIHx8IHAuVHlwZSgpID09IE91dHB1dFR5cGU6OnRleHQpIHsKKyAgICAgICAgcC5TZXRPcGVuRGV0YWlscygpOworICAgICAgICBEdW1wVmtGb3JtYXRGZWF0dXJlRmxhZ3MocCwgImxpbmVhclRpbGluZyIsIHByb3AubGluZWFyVGlsaW5nRmVhdHVyZXMpOworICAgICAgICBwLlNldE9wZW5EZXRhaWxzKCk7CisgICAgICAgIER1bXBWa0Zvcm1hdEZlYXR1cmVGbGFncyhwLCAib3B0aW1hbFRpbGluZyIsIHByb3Aub3B0aW1hbFRpbGluZ0ZlYXR1cmVzKTsKKyAgICAgICAgcC5TZXRPcGVuRGV0YWlscygpOworICAgICAgICBEdW1wVmtGb3JtYXRGZWF0dXJlRmxhZ3MocCwgImJ1ZmZlckZlYXR1cmVzIiwgcHJvcC5idWZmZXJGZWF0dXJlcyk7CisgICAgfSBlbHNlIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7CisgICAgICAgIHAuUHJpbnRLZXlWYWx1ZSgiZm9ybWF0SUQiLCBmbXQpOworICAgICAgICBwLlByaW50S2V5VmFsdWUoImxpbmVhclRpbGluZ0ZlYXR1cmVzIiwgcHJvcC5saW5lYXJUaWxpbmdGZWF0dXJlcyk7CisgICAgICAgIHAuUHJpbnRLZXlWYWx1ZSgib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIiwgcHJvcC5vcHRpbWFsVGlsaW5nRmVhdHVyZXMpOworICAgICAgICBwLlByaW50S2V5VmFsdWUoImJ1ZmZlckZlYXR1cmVzIiwgcHJvcC5idWZmZXJGZWF0dXJlcyk7CisgICAgfQorICAgIHAuT2JqZWN0RW5kKCk7Cit9CisKK3ZvaWQgR3B1RGV2RHVtcChQcmludGVyICZwLCBBcHBHcHUgJmdwdSkgeworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7CisgICAgICAgIHAuQXJyYXlTdGFydCgiQXJyYXlPZlZrRm9ybWF0UHJvcGVydGllcyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHAuU2V0SGVhZGVyKCkuT2JqZWN0U3RhcnQoIkZvcm1hdCBQcm9wZXJ0aWVzIik7CisgICAgICAgIHAuSW5kZW50RGVjcmVhc2UoKTsKKyAgICB9CisKKyAgICBpZiAocC5UeXBlKCkgPT0gT3V0cHV0VHlwZTo6dGV4dCkgeworICAgICAgICBhdXRvIGZtdFByb3BNYXAgPSBGb3JtYXRQcm9wTWFwKGdwdSk7CisKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBzdGQ6OnZlY3RvcjxWa0Zvcm1hdD4gdW5zdXBwb3J0ZWRfZm9ybWF0czsKKyAgICAgICAgZm9yIChhdXRvICZwcm9wIDogZm10UHJvcE1hcCkgeworICAgICAgICAgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIHByb3BzOworICAgICAgICAgICAgcHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgPSBwcm9wLmZpcnN0LmxpbmVhcjsKKyAgICAgICAgICAgIHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyA9IHByb3AuZmlyc3Qub3B0aW1hbDsKKyAgICAgICAgICAgIHByb3BzLmJ1ZmZlckZlYXR1cmVzID0gcHJvcC5maXJzdC5idWZmZXI7CisgICAgICAgICAgICBpZiAocHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgPT0gMCAmJiBwcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgPT0gMCAmJiBwcm9wcy5idWZmZXJGZWF0dXJlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWRfZm9ybWF0cyA9IHByb3Auc2Vjb25kOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwLlNldEVsZW1lbnRJbmRleChjb3VudGVyKyspLk9iamVjdFN0YXJ0KCJDb21tb24gRm9ybWF0IEdyb3VwIik7CisgICAgICAgICAgICBwLkluZGVudERlY3JlYXNlKCk7CisgICAgICAgICAgICBwLk9iamVjdFN0YXJ0KCJGb3JtYXRzIik7CisgICAgICAgICAgICBmb3IgKGF1dG8gJmZtdCA6IHByb3Auc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoVmtGb3JtYXRTdHJpbmcoZm10KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwLk9iamVjdEVuZCgpOworCisgICAgICAgICAgICBHcHVEdW1wRm9ybWF0UHJvcGVydHkocCwgVktfRk9STUFUX1VOREVGSU5FRCwgcHJvcHMpOworCisgICAgICAgICAgICBwLkluZGVudEluY3JlYXNlKCk7CisgICAgICAgICAgICBwLk9iamVjdEVuZCgpOworICAgICAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBwLk9iamVjdFN0YXJ0KCJVbnN1cHBvcnRlZCBGb3JtYXRzIik7CisgICAgICAgIGZvciAoYXV0byAmZm10IDogdW5zdXBwb3J0ZWRfZm9ybWF0cykgeworICAgICAgICAgICAgcC5TZXRBc1R5cGUoKS5QcmludEVsZW1lbnQoVmtGb3JtYXRTdHJpbmcoZm10KSk7CisgICAgICAgIH0KKyAgICAgICAgcC5PYmplY3RFbmQoKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoYXV0byAmZm9ybWF0IDogZ3B1LnN1cHBvcnRlZF9mb3JtYXRfcmFuZ2VzKSB7CisgICAgICAgICAgICBpZiAoZ3B1LkZvcm1hdFJhbmdlU3VwcG9ydGVkKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgZm10X2NvdW50ZXIgPSBmb3JtYXQuZmlyc3RfZm9ybWF0OyBmbXRfY291bnRlciA8PSBmb3JtYXQubGFzdF9mb3JtYXQ7ICsrZm10X2NvdW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgVmtGb3JtYXQgZm10ID0gc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KGZtdF9jb3VudGVyKTsKKworICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdFByb3BlcnRpZXMgcHJvcHM7CisgICAgICAgICAgICAgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKGdwdS5waHlzX2RldmljZSwgZm10LCAmcHJvcHMpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGpzb24sIGRvbid0IHByaW50IGZvcm1hdCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVuc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgfHwgcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzIHx8IHByb3BzLmJ1ZmZlckZlYXR1cmVzKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgR3B1RHVtcEZvcm1hdFByb3BlcnR5KHAsIGZtdCwgcHJvcHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwLlR5cGUoKSA9PSBPdXRwdXRUeXBlOjpqc29uKSB7CisgICAgICAgIHAuQXJyYXlFbmQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwLkluZGVudEluY3JlYXNlKCk7CisgICAgICAgIHAuT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcC5BZGROZXdsaW5lKCk7Cit9CisKK3ZvaWQgRHVtcEdwdShQcmludGVyICZwLCBBcHBHcHUgJmdwdSwgYm9vbCBzaG93X2Zvcm1hdHMpIHsKKyAgICBpZiAocC5UeXBlKCkgIT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICBwLk9iamVjdFN0YXJ0KCJHUFUiICsgc3RkOjp0b19zdHJpbmcoZ3B1LmlkKSk7CisgICAgICAgIHAuSW5kZW50RGVjcmVhc2UoKTsKKyAgICB9CisgICAgR3B1RHVtcFByb3BzKHAsIGdwdSk7CisKKyAgICBpZiAocC5UeXBlKCkgIT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICBEdW1wRXh0ZW5zaW9ucyhwLCAiRGV2aWNlIiwgZ3B1LmRldmljZV9leHRlbnNpb25zKTsKKyAgICAgICAgcC5BZGROZXdsaW5lKCk7CisgICAgfQorCisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHAuQXJyYXlTdGFydCgiQXJyYXlPZlZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzIik7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdwdS5xdWV1ZV9jb3VudDsgaSsrKSB7CisgICAgICAgIEFwcFF1ZXVlRmFtaWx5UHJvcGVydGllcyBxdWV1ZV9wcm9wcyA9IEFwcFF1ZXVlRmFtaWx5UHJvcGVydGllcyhncHUsIGkpOworICAgICAgICBHcHVEdW1wUXVldWVQcm9wcyhwLCBncHUuaW5zdC5zdXJmYWNlX2V4dGVuc2lvbnMsIHF1ZXVlX3Byb3BzKTsKKyAgICB9CisgICAgaWYgKHAuVHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24pIHAuQXJyYXlFbmQoKTsKKworICAgIEdwdUR1bXBNZW1vcnlQcm9wcyhwLCBncHUpOworICAgIEdwdUR1bXBGZWF0dXJlcyhwLCBncHUpOworICAgIGlmIChwLlR5cGUoKSAhPSBPdXRwdXRUeXBlOjp0ZXh0IHx8IHNob3dfZm9ybWF0cykgeworICAgICAgICBHcHVEZXZEdW1wKHAsIGdwdSk7CisgICAgfQorCisgICAgaWYgKHAuVHlwZSgpICE9IE91dHB1dFR5cGU6Ompzb24pIHsKKyAgICAgICAgcC5JbmRlbnRJbmNyZWFzZSgpOworICAgICAgICBwLk9iamVjdEVuZCgpOworICAgIH0KKyAgICBwLkFkZE5ld2xpbmUoKTsKK30KKworLy8gPT09PT09PT09PT09IFByaW50aW5nIExvZ2ljID09PT09PT09PT09PT0gLy8KKworI2lmZGVmIF9XSU4zMgorLy8gRW5sYXJnZXMgdGhlIGNvbnNvbGUgd2luZG93IHRvIGhhdmUgYSBsYXJnZSBzY3JvbGxiYWNrIHNpemUuCitzdGF0aWMgdm9pZCBDb25zb2xlRW5sYXJnZSgpIHsKKyAgICBjb25zdCBIQU5ETEUgY29uc29sZV9oYW5kbGUgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworCisgICAgLy8gbWFrZSB0aGUgY29uc29sZSB3aW5kb3cgYmlnZ2VyCisgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaTsKKyAgICBDT09SRCBidWZmZXJfc2l6ZTsKKyAgICBpZiAoR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oY29uc29sZV9oYW5kbGUsICZjc2JpKSkgeworICAgICAgICBidWZmZXJfc2l6ZS5YID0gY3NiaS5kd1NpemUuWCArIDMwOworICAgICAgICBidWZmZXJfc2l6ZS5ZID0gMjAwMDA7CisgICAgICAgIFNldENvbnNvbGVTY3JlZW5CdWZmZXJTaXplKGNvbnNvbGVfaGFuZGxlLCBidWZmZXJfc2l6ZSk7CisgICAgfQorCisgICAgU01BTExfUkVDVCByOworICAgIHIuTGVmdCA9IHIuVG9wID0gMDsKKyAgICByLlJpZ2h0ID0gY3NiaS5kd1NpemUuWCAtIDEgKyAzMDsKKyAgICByLkJvdHRvbSA9IDUwOworICAgIFNldENvbnNvbGVXaW5kb3dJbmZvKGNvbnNvbGVfaGFuZGxlLCB0cnVlLCAmcik7CisKKyAgICAvLyBjaGFuZ2UgdGhlIGNvbnNvbGUgd2luZG93IHRpdGxlCisgICAgU2V0Q29uc29sZVRpdGxlKFRFWFQoYXBwX3Nob3J0X25hbWUpKTsKK30KKyNlbmRpZgorCit2b2lkIHByaW50X3VzYWdlKGNvbnN0IGNoYXIgKmFyZ3YwKSB7CisgICAgc3RkOjpjb3V0IDw8ICJcbnZ1bGthbmluZm8gLSBTdW1tYXJpemUgVnVsa2FuIGluZm9ybWF0aW9uIGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuXG4iOworICAgIHN0ZDo6Y291dCA8PCAiVVNBR0U6ICIgPDwgYXJndjAgPDwgIiBbb3B0aW9uc11cblxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIk9QVElPTlM6XG4iOworICAgIHN0ZDo6Y291dCA8PCAiLWgsIC0taGVscCAgICAgICAgICAgIFByaW50IHRoaXMgaGVscC5cbiI7CisgICAgc3RkOjpjb3V0IDw8ICItLWh0bWwgICAgICAgICAgICAgICAgUHJvZHVjZSBhbiBodG1sIHZlcnNpb24gb2YgdnVsa2FuaW5mbyBvdXRwdXQsIHNhdmVkIGFzXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICAgICAgICAgICAgIFwidnVsa2FuaW5mby5odG1sXCIgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tbWFuZCBpc1xuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICAgICAgICAgICAgICAgICAgICBydW4uXG4iOworICAgIHN0ZDo6Y291dCA8PCAiLWosIC0tanNvbiAgICAgICAgICAgIFByb2R1Y2UgYSBqc29uIHZlcnNpb24gb2YgdnVsa2FuaW5mbyB0byBzdGFuZGFyZCBvdXRwdXQgb2YgdGhlXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGdwdSBpbiB0aGUgc3lzdGVtIGNvbmZvcm1pbmcgdG8gdGhlIERldlNpbSBzY2hlbWEuXG4iOworICAgIHN0ZDo6Y291dCA8PCAiLS1qc29uPTxncHUtbnVtYmVyPiAgIEZvciBhIG11bHRpLWdwdSBzeXN0ZW0sIGEgc2luZ2xlIGdwdSBjYW4gYmUgdGFyZ2V0dGVkIGJ5XG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnlpbmcgdGhlIGdwdS1udW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBncHUgb2YgXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0LiBUaGlzIG51bWJlciBjYW4gYmUgZGV0ZXJtaW5lZCBieSBydW5uaW5nXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICAgICAgICAgICAgIHZ1bGthbmluZm8gd2l0aG91dCBhbnkgb3B0aW9ucyBzcGVjaWZpZWQuXG4iOworICAgIHN0ZDo6Y291dCA8PCAiLS1zaG93LWZvcm1hdHMgICAgICAgIERpc3BsYXkgdGhlIGZvcm1hdCBwcm9wZXJ0aWVzIG9mIGVhY2ggcGh5c2ljYWwgZGV2aWNlLlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgaHRtbCBvciBqc29uIG91dHB1dDtcbiI7CisgICAgc3RkOjpjb3V0IDw8ICIgICAgICAgICAgICAgICAgICAgICAgdGhleSB3aWxsIGFsd2F5cyBwcmludCBmb3JtYXQgcHJvcGVydGllcy5cblxuIjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWZkZWYgX1dJTjMyCisgICAgaWYgKENvbnNvbGVJc0V4Y2x1c2l2ZSgpKSBDb25zb2xlRW5sYXJnZSgpOworICAgIGlmICghTG9hZFVzZXIzMkRsbCgpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgdXNlcjMyLmRsbCBsaWJyYXJ5IVxuIik7CisgICAgICAgIFdBSVRfRk9SX0NPTlNPTEVfREVTVFJPWTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisjZW5kaWYKKworICAgIHVpbnQzMl90IHNlbGVjdGVkX2dwdSA9IDA7CisgICAgYm9vbCBzaG93X2Zvcm1hdHMgPSBmYWxzZTsKKworICAgIC8vIENvbWJpbmF0aW9ucyBvZiBvdXRwdXQ6IGh0bWwgb25seSwgaHRtbCBBTkQganNvbiwganNvbiBvbmx5LCBodW1hbiByZWFkYWJsZSBvbmx5CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKyAgICAgICAgaWYgKHN0cm5jbXAoIi0tanNvbiIsIGFyZ3ZbaV0sIDYpID09IDAgfHwgc3RyY21wKGFyZ3ZbaV0sICItaiIpID09IDApIHsKKyAgICAgICAgICAgIGlmIChzdHJsZW4oYXJndltpXSkgPiA3ICYmIHN0cm5jbXAoIi0tanNvbj0iLCBhcmd2W2ldLCA3KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRfZ3B1ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cnRvbChhcmd2W2ldICsgNywgbnVsbHB0ciwgMTApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh1bWFuX3JlYWRhYmxlX291dHB1dCA9IGZhbHNlOworICAgICAgICAgICAganNvbl9vdXRwdXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS1odG1sIikgPT0gMCkgeworICAgICAgICAgICAgaHVtYW5fcmVhZGFibGVfb3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICBodG1sX291dHB1dCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLXNob3ctZm9ybWF0cyIpID09IDApIHsKKyAgICAgICAgICAgIHNob3dfZm9ybWF0cyA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLWhlbHAiKSA9PSAwIHx8IHN0cmNtcChhcmd2W2ldLCAiLWgiKSA9PSAwKSB7CisgICAgICAgICAgICBwcmludF91c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRfdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFwcEluc3RhbmNlIGluc3RhbmNlID0ge307CisgICAgU2V0dXBXaW5kb3dFeHRlbnNpb25zKGluc3RhbmNlKTsKKworICAgIGF1dG8gcE5leHRfY2hhaW5zID0gZ2V0X2NoYWluX2luZm9zKCk7CisKKyAgICBhdXRvIHBoeXNfZGV2aWNlcyA9IGluc3RhbmNlLkZpbmRQaHlzaWNhbERldmljZXMoKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBcHBTdXJmYWNlPj4gc3VyZmFjZXM7CisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpIHx8IGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUikgfHwgXAorICAgIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSykgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKSB8fCBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyAgICBmb3IgKGF1dG8gJnN1cmZhY2VfZXh0ZW5zaW9uIDogaW5zdGFuY2Uuc3VyZmFjZV9leHRlbnNpb25zKSB7CisgICAgICAgIHN1cmZhY2VfZXh0ZW5zaW9uLmNyZWF0ZV93aW5kb3coaW5zdGFuY2UpOworICAgICAgICBzdXJmYWNlX2V4dGVuc2lvbi5zdXJmYWNlID0gc3VyZmFjZV9leHRlbnNpb24uY3JlYXRlX3N1cmZhY2UoaW5zdGFuY2UpOworICAgICAgICBmb3IgKGF1dG8gJnBoeXNfZGV2aWNlIDogcGh5c19kZXZpY2VzKSB7CisgICAgICAgICAgICBzdXJmYWNlcy5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEFwcFN1cmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBBcHBTdXJmYWNlKGluc3RhbmNlLCBwaHlzX2RldmljZSwgc3VyZmFjZV9leHRlbnNpb24sIHBOZXh0X2NoYWlucy5zdXJmYWNlX2NhcGFiaWxpdGllczIpKSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBcHBHcHU+PiBncHVzOworCisgICAgdWludDMyX3QgZ3B1X2NvdW50ZXIgPSAwOworICAgIGZvciAoYXV0byAmcGh5c19kZXZpY2UgOiBwaHlzX2RldmljZXMpIHsKKyAgICAgICAgZ3B1cy5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEFwcEdwdT4obmV3IEFwcEdwdShpbnN0YW5jZSwgZ3B1X2NvdW50ZXIrKywgcGh5c19kZXZpY2UsIHBOZXh0X2NoYWlucykpKTsKKyAgICB9CisKKyAgICBpZiAoc2VsZWN0ZWRfZ3B1ID49IGdwdXMuc2l6ZSgpKSB7CisgICAgICAgIHNlbGVjdGVkX2dwdSA9IDA7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFByaW50ZXI+PiBwcmludGVyczsKKworICAgIHN0ZDo6c3RyZWFtYnVmICpidWY7CisgICAgYnVmID0gc3RkOjpjb3V0LnJkYnVmKCk7CisgICAgc3RkOjpvc3RyZWFtIG91dChidWYpOworICAgIHN0ZDo6b2ZzdHJlYW0gaHRtbF9vdXQ7CisKKyAgICBpZiAoaHVtYW5fcmVhZGFibGVfb3V0cHV0KSB7CisgICAgICAgIHByaW50ZXJzLnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8UHJpbnRlcj4obmV3IFByaW50ZXIoT3V0cHV0VHlwZTo6dGV4dCwgb3V0LCBzZWxlY3RlZF9ncHUsIGluc3RhbmNlLnZrX3ZlcnNpb24pKSk7CisgICAgfQorICAgIGlmIChodG1sX291dHB1dCkgeworICAgICAgICBodG1sX291dCA9IHN0ZDo6b2ZzdHJlYW0oInZ1bGthbmluZm8uaHRtbCIpOworICAgICAgICBwcmludGVycy5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPFByaW50ZXI+KG5ldyBQcmludGVyKE91dHB1dFR5cGU6Omh0bWwsIGh0bWxfb3V0LCBzZWxlY3RlZF9ncHUsIGluc3RhbmNlLnZrX3ZlcnNpb24pKSk7CisgICAgfQorICAgIGlmIChqc29uX291dHB1dCkgeworICAgICAgICBwcmludGVycy5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPFByaW50ZXI+KG5ldyBQcmludGVyKE91dHB1dFR5cGU6Ompzb24sIG91dCwgc2VsZWN0ZWRfZ3B1LCBpbnN0YW5jZS52a192ZXJzaW9uKSkpOworICAgIH0KKworICAgIGZvciAoYXV0byAmcCA6IHByaW50ZXJzKSB7CisgICAgICAgIHAtPlNldEhlYWRlcigpOworICAgICAgICBEdW1wRXh0ZW5zaW9ucygqcC5nZXQoKSwgIkluc3RhbmNlIiwgaW5zdGFuY2UuZ2xvYmFsX2V4dGVuc2lvbnMpOworICAgICAgICBwLT5BZGROZXdsaW5lKCk7CisKKyAgICAgICAgRHVtcExheWVycygqcC5nZXQoKSwgaW5zdGFuY2UuZ2xvYmFsX2xheWVycywgZ3B1cyk7CisKKyAgICAgICAgaWYgKHAtPlR5cGUoKSAhPSBPdXRwdXRUeXBlOjpqc29uKSB7CisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpIHx8IGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUikgfHwgXAorICAgIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSykgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKSB8fCBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyAgICAgICAgICAgIER1bXBQcmVzZW50YWJsZVN1cmZhY2VzKCpwLmdldCgpLCBpbnN0YW5jZSwgZ3B1cywgc3VyZmFjZXMpOworI2VuZGlmCisgICAgICAgICAgICBEdW1wR3JvdXBzKCpwLmdldCgpLCBpbnN0YW5jZSk7CisKKyAgICAgICAgICAgIHAtPlNldEhlYWRlcigpLk9iamVjdFN0YXJ0KCJEZXZpY2UgUHJvcGVydGllcyBhbmQgRXh0ZW5zaW9ucyIpOworICAgICAgICAgICAgcC0+SW5kZW50RGVjcmVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gJmdwdSA6IGdwdXMpIHsKKyAgICAgICAgICAgIGlmICgocC0+VHlwZSgpID09IE91dHB1dFR5cGU6Ompzb24gJiYgZ3B1LT5pZCA9PSBzZWxlY3RlZF9ncHUpIHx8IHAtPlR5cGUoKSA9PSBPdXRwdXRUeXBlOjp0ZXh0IHx8CisgICAgICAgICAgICAgICAgcC0+VHlwZSgpID09IE91dHB1dFR5cGU6Omh0bWwpIHsKKyAgICAgICAgICAgICAgICBEdW1wR3B1KCpwLmdldCgpLCAqZ3B1LmdldCgpLCBzaG93X2Zvcm1hdHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwLT5UeXBlKCkgIT0gT3V0cHV0VHlwZTo6anNvbikgeworICAgICAgICAgICAgcC0+SW5kZW50SW5jcmVhc2UoKTsKKyAgICAgICAgICAgIHAtPk9iamVjdEVuZCgpOworICAgICAgICB9CisgICAgfQorCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpIHx8IGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUikgfHwgXAorICAgIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSykgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUKSB8fCBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKworICAgIGZvciAoYXV0byAmc3VyZmFjZV9leHRlbnNpb24gOiBpbnN0YW5jZS5zdXJmYWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgQXBwRGVzdHJveVN1cmZhY2UoaW5zdGFuY2UsIHN1cmZhY2VfZXh0ZW5zaW9uLnN1cmZhY2UpOworICAgICAgICBzdXJmYWNlX2V4dGVuc2lvbi5kZXN0cm95X3dpbmRvdyhpbnN0YW5jZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBXQUlUX0ZPUl9DT05TT0xFX0RFU1RST1k7CisjaWZkZWYgX1dJTjMyCisgICAgRnJlZVVzZXIzMkRsbCgpOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby92dWxrYW5pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4NjRjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby5oCkBAIC0wLDAgKzEsMTQ3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBSZW5lIExpbmRzYXkgPHJlbmVAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSmVyZW15IEtuaWFnZXIgPGplcmVteWtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogU2hhbm5vbiBNY1BoZXJzb24gPHNoYW5ub25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQm9iIEVsbGlzb24gPGJvYkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDaGFybGVzIEdpZXNzZW4gPGNoYXJsZXNAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaWZkZWYgX19HTlVDX18KKyNpZm5kZWYgX1BPU0lYX0NfU09VUkNFCisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDA4MDlMCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIHN0cm5kdXAocCwgbikgc3RyZHVwKHApCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZiAgLy8gX1dJTjMyCisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLKSB8fCBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQpCisjaW5jbHVkZSAibWV0YWxfdmlldy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+CisKKyNkZWZpbmUgRVJSKGVycikgc3RkOjpjZXJyIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXyA8PCAiOiBmYWlsZWQgd2l0aCAiIDw8IFZrUmVzdWx0U3RyaW5nKGVycikgPDwgIlxuIjsKKworLy8gZ2xvYmFsIGNvbmZpZ3VyYXRpb24KK2Jvb2wgaHVtYW5fcmVhZGFibGVfb3V0cHV0ID0gdHJ1ZTsKK2Jvb2wgaHRtbF9vdXRwdXQgPSBmYWxzZTsKK2Jvb2wganNvbl9vdXRwdXQgPSBmYWxzZTsKKworI2lmZGVmIF9XSU4zMgorCisjZGVmaW5lIHN0cmR1cCBfc3RyZHVwCisKKy8vIFJldHVybnMgbm9uemVybyBpZiB0aGUgY29uc29sZSBpcyB1c2VkIG9ubHkgZm9yIHRoaXMgcHJvY2Vzcy4gV2lsbCByZXR1cm4KKy8vIHplcm8gaWYgYW5vdGhlciBwcm9jZXNzIChzdWNoIGFzIGNtZC5leGUpIGlzIGFsc28gYXR0YWNoZWQuCitzdGF0aWMgaW50IENvbnNvbGVJc0V4Y2x1c2l2ZSh2b2lkKSB7CisgICAgRFdPUkQgcGlkc1syXTsKKyAgICBEV09SRCBudW1fcGlkcyA9IEdldENvbnNvbGVQcm9jZXNzTGlzdChwaWRzLCBBUlJBWVNJWkUocGlkcykpOworICAgIHJldHVybiBudW1fcGlkcyA8PSAxOworfQorCisjZGVmaW5lIFdBSVRfRk9SX0NPTlNPTEVfREVTVFJPWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKENvbnNvbGVJc0V4Y2x1c2l2ZSgpICYmIGh1bWFuX3JlYWRhYmxlX291dHB1dCkgU2xlZXAoSU5GSU5JVEUpOyBcCisgICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFdBSVRfRk9SX0NPTlNPTEVfREVTVFJPWQorI2VuZGlmCisKKyNkZWZpbmUgRVJSX0VYSVQoZXJyKSAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFUlIoZXJyKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7ICAgICAgICAgICBcCisgICAgICAgIGZmbHVzaChzdGRlcnIpOyAgICAgICAgICAgXAorICAgICAgICBXQUlUX0ZPUl9DT05TT0xFX0RFU1RST1k7IFwKKyAgICAgICAgZXhpdCgtMSk7ICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2lmZGVmIF9XSU4zMgorCisjZGVmaW5lIF9DQUxMX1BGTihwZm4sIC4uLikgKHBmbikKKyNkZWZpbmUgQ0FMTF9QRk4oZm5jTmFtZSkgX0NBTExfUEZOKFVzZXIzMkhhbmRsZXM6OnBmbiMjZm5jTmFtZSkKKworI2RlZmluZSBfQ0hFQ0tfUEZOKHBmbiwgZm5jTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAocGZuID09IG51bGxwdHIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0ICVzIGZ1bmN0aW9uIGFkZHJlc3MhXG4iLCBmbmNOYW1lKTsgXAorICAgICAgICAgICAgV0FJVF9GT1JfQ09OU09MRV9ERVNUUk9ZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKGZhbHNlKQorCisjZGVmaW5lIF9TRVRfUEZOKGRsbEhhbmRsZSwgcGZuVHlwZSwgcGZuLCBmbmNOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwZm4gPSByZWludGVycHJldF9jYXN0PHBmblR5cGU+KEdldFByb2NBZGRyZXNzKGRsbEhhbmRsZSwgZm5jTmFtZSkpOyBcCisgICAgICAgIF9DSEVDS19QRk4ocGZuLCBmbmNOYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlIChmYWxzZSkKKworI2RlZmluZSBTRVRfUEZOKGRsbEhhbmRsZSwgZm5jTmFtZSkgX1NFVF9QRk4oVXNlcjMySGFuZGxlczo6ZGxsSGFuZGxlLCBQRk5fIyNmbmNOYW1lLCBVc2VyMzJIYW5kbGVzOjpwZm4jI2ZuY05hbWUsICNmbmNOYW1lKQorCisvLyBVc2VyMzIgZnVuY3Rpb24gZGVjbGFyYXRpb25zCit0eXBlZGVmIFdJTlVTRVJBUEkgQk9PTChXSU5BUEkgKlBGTl9BZGp1c3RXaW5kb3dSZWN0KShfSW5vdXRfIExQUkVDVCwgX0luXyBEV09SRCwgX0luXyBCT09MKTsKK3R5cGVkZWYgV0lOVVNFUkFQSSBIV05EKFdJTkFQSSAqUEZOX0NyZWF0ZVdpbmRvd0V4QSkoX0luXyBEV09SRCwgX0luX29wdF8gTFBDU1RSLCBfSW5fb3B0XyBMUENTVFIsIF9Jbl8gRFdPUkQsIF9Jbl8gaW50LCBfSW5fIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0luXyBpbnQsIF9Jbl8gaW50LCBfSW5fb3B0XyBIV05ELCBfSW5fb3B0XyBITUVOVSwgX0luX29wdF8gSElOU1RBTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5fb3B0XyBMUFZPSUQpOwordHlwZWRlZiBXSU5VU0VSQVBJIExSRVNVTFQoV0lOQVBJICpQRk5fRGVmV2luZG93UHJvY0EpKF9Jbl8gSFdORCwgX0luXyBVSU5ULCBfSW5fIFdQQVJBTSwgX0luXyBMUEFSQU0pOwordHlwZWRlZiBXSU5VU0VSQVBJIEJPT0woV0lOQVBJICpQRk5fRGVzdHJveVdpbmRvdykoX0luXyBIV05EKTsKK3R5cGVkZWYgV0lOVVNFUkFQSSBISUNPTihXSU5BUEkgKlBGTl9Mb2FkSWNvbkEpKF9Jbl9vcHRfIEhJTlNUQU5DRSwgX0luXyBMUENTVFIpOwordHlwZWRlZiBXSU5VU0VSQVBJIEFUT00oV0lOQVBJICpQRk5fUmVnaXN0ZXJDbGFzc0V4QSkoX0luXyBDT05TVCBXTkRDTEFTU0VYQSAqKTsKKworc3RydWN0IFVzZXIzMkhhbmRsZXMgeworICAgIC8vIFVzZXIzMiBmdW5jdGlvbiBwb2ludGVycworICAgIHN0YXRpYyBQRk5fQWRqdXN0V2luZG93UmVjdCBwZm5BZGp1c3RXaW5kb3dSZWN0OworICAgIHN0YXRpYyBQRk5fQ3JlYXRlV2luZG93RXhBIHBmbkNyZWF0ZVdpbmRvd0V4QTsKKyAgICBzdGF0aWMgUEZOX0RlZldpbmRvd1Byb2NBIHBmbkRlZldpbmRvd1Byb2NBOworICAgIHN0YXRpYyBQRk5fRGVzdHJveVdpbmRvdyBwZm5EZXN0cm95V2luZG93OworICAgIHN0YXRpYyBQRk5fTG9hZEljb25BIHBmbkxvYWRJY29uQTsKKyAgICBzdGF0aWMgUEZOX1JlZ2lzdGVyQ2xhc3NFeEEgcGZuUmVnaXN0ZXJDbGFzc0V4QTsKKworICAgIC8vIFVzZXIzMiBkbGwgaGFuZGxlCisgICAgc3RhdGljIEhNT0RVTEUgdXNlcjMyRGxsSGFuZGxlOworfTsKKworYm9vbCBMb2FkVXNlcjMyRGxsKCkgeworICAgIFVzZXIzMkhhbmRsZXM6OnVzZXIzMkRsbEhhbmRsZSA9IExvYWRMaWJyYXJ5RXhBKCJ1c2VyMzIuZGxsIiwgbnVsbHB0ciwgMCk7CisgICAgaWYgKFVzZXIzMkhhbmRsZXM6OnVzZXIzMkRsbEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIFNFVF9QRk4odXNlcjMyRGxsSGFuZGxlLCBBZGp1c3RXaW5kb3dSZWN0KTsKKyAgICAgICAgU0VUX1BGTih1c2VyMzJEbGxIYW5kbGUsIENyZWF0ZVdpbmRvd0V4QSk7CisgICAgICAgIFNFVF9QRk4odXNlcjMyRGxsSGFuZGxlLCBEZWZXaW5kb3dQcm9jQSk7CisgICAgICAgIFNFVF9QRk4odXNlcjMyRGxsSGFuZGxlLCBEZXN0cm95V2luZG93KTsKKyAgICAgICAgU0VUX1BGTih1c2VyMzJEbGxIYW5kbGUsIExvYWRJY29uQSk7CisgICAgICAgIFNFVF9QRk4odXNlcjMyRGxsSGFuZGxlLCBSZWdpc3RlckNsYXNzRXhBKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBGcmVlVXNlcjMyRGxsKCkgeworICAgIGlmIChVc2VyMzJIYW5kbGVzOjp1c2VyMzJEbGxIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBGcmVlTGlicmFyeShVc2VyMzJIYW5kbGVzOjp1c2VyMzJEbGxIYW5kbGUpOworICAgICAgICBVc2VyMzJIYW5kbGVzOjp1c2VyMzJEbGxIYW5kbGUgPSBudWxscHRyOworICAgIH0KK30KKyNlbmRpZiAgLy8gX1dJTjMyCisKK3N0YXRpYyBjb25zdCBjaGFyICpWa1Jlc3VsdFN0cmluZyhWa1Jlc3VsdCBlcnIpOworCitjb25zdCBjaGFyICphcHBfc2hvcnRfbmFtZSA9ICJ2dWxrYW5pbmZvIjsKKworc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBnZXRfY19zdHJfYXJyYXkoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0ICZ2ZWMpIHsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IHJldDsKKyAgICBmb3IgKGF1dG8gJnN0ciA6IHZlYykgcmV0LnB1c2hfYmFjayhzdHIuY19zdHIoKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKlZrRGVidWdSZXBvcnRGbGFnc0VYVFN0cmluZyhjb25zdCBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3MpIHsKKyAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkVSUk9SIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJXQVJOSU5HIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJQRVJGIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiSU5GTyI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkRFQlVHIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgfQorfQorc3RhdGljIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBEYmdDYWxsYmFjayhWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgbXNnRmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9ialR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNyY09iamVjdCwgc2l6ZV90IGxvY2F0aW9uLCBpbnQzMl90IG1zZ0NvZGUsIGNvbnN0IGNoYXIgKnBMYXllclByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcE1zZywgdm9pZCAqcFVzZXJEYXRhKSB7CisgICAgc3RkOjpjZXJyIDw8IFZrRGVidWdSZXBvcnRGbGFnc0VYVFN0cmluZyhtc2dGbGFncykgPDwgIjogWyIgPDwgcExheWVyUHJlZml4IDw8ICJdIENvZGUgIiA8PCBtc2dDb2RlIDw8ICIgOiAiIDw8IHBNc2cgPDwgIlxuIjsKKworICAgIC8vIFRydWUgaXMgcmVzZXJ2ZWQgZm9yIGxheWVyIGRldmVsb3BlcnMsIGFuZCBNQVkgbWVhbiBjYWxscyBhcmUgbm90IGRpc3RyaWJ1dGVkIGRvd24gdGhlIGxheWVyIGNoYWluIGFmdGVyIHZhbGlkYXRpb24gZXJyb3IuCisgICAgLy8gRmFsc2UgU0hPVUxEIGFsd2F5cyBiZSByZXR1cm5lZCBieSBhcHBzOgorICAgIHJldHVybiBWS19GQUxTRTsKK30KKworLy8gLS0tLS0tLS0tLS0gSW5zdGFuY2UgU2V0dXAgLS0tLS0tLSAvLworCitzdHJ1Y3QgVmtTdHJ1Y3R1cmVIZWFkZXIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBWa1N0cnVjdHVyZUhlYWRlciAqcE5leHQ7Cit9OworCitzdHJ1Y3QgcE5leHRDaGFpbkJ1aWxkaW5nQmxvY2tJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdWludDMyX3QgbWVtX3NpemU7Cit9OworCit2b2lkIGJ1aWxkcE5leHRDaGFpbihWa1N0cnVjdHVyZUhlYWRlciAqZmlyc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHBOZXh0Q2hhaW5CdWlsZGluZ0Jsb2NrSW5mbz4gJmNoYWluX2luZm8pIHsKKyAgICBWa1N0cnVjdHVyZUhlYWRlciAqcGxhY2UgPSBmaXJzdDsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjaGFpbl9pbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHBsYWNlLT5wTmV4dCA9IHN0YXRpY19jYXN0PFZrU3RydWN0dXJlSGVhZGVyICo+KG1hbGxvYyhjaGFpbl9pbmZvW2ldLm1lbV9zaXplKSk7CisgICAgICAgIGlmICghcGxhY2UtPnBOZXh0KSB7CisgICAgICAgICAgICBFUlJfRVhJVChWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6bWVtc2V0KHBsYWNlLT5wTmV4dCwgMCwgY2hhaW5faW5mb1tpXS5tZW1fc2l6ZSk7CisgICAgICAgIHBsYWNlID0gcGxhY2UtPnBOZXh0OworICAgICAgICBwbGFjZS0+c1R5cGUgPSBjaGFpbl9pbmZvW2ldLnNUeXBlOworICAgIH0KKworICAgIHBsYWNlLT5wTmV4dCA9IG51bGxwdHI7Cit9CisKK3ZvaWQgZnJlZXBOZXh0Q2hhaW4oVmtTdHJ1Y3R1cmVIZWFkZXIgKmZpcnN0KSB7CisgICAgVmtTdHJ1Y3R1cmVIZWFkZXIgKnBsYWNlID0gZmlyc3Q7CisgICAgVmtTdHJ1Y3R1cmVIZWFkZXIgKm5leHQgPSBudWxscHRyOworCisgICAgd2hpbGUgKHBsYWNlKSB7CisgICAgICAgIG5leHQgPSBwbGFjZS0+cE5leHQ7CisgICAgICAgIGZyZWUocGxhY2UpOworICAgICAgICBwbGFjZSA9IG5leHQ7CisgICAgfQorfQorCitzdHJ1Y3QgTGF5ZXJFeHRlbnNpb25MaXN0IHsKKyAgICBWa0xheWVyUHJvcGVydGllcyBsYXllcl9wcm9wZXJ0aWVze307CisgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBleHRlbnNpb25fcHJvcGVydGllczsKK307CisKK3N0cnVjdCBBcHBJbnN0YW5jZTsKKworc3RydWN0IFN1cmZhY2VFeHRlbnNpb24geworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgdm9pZCAoKmNyZWF0ZV93aW5kb3cpKEFwcEluc3RhbmNlICYpID0gbnVsbHB0cjsKKyAgICBWa1N1cmZhY2VLSFIgKCpjcmVhdGVfc3VyZmFjZSkoQXBwSW5zdGFuY2UgJikgPSBudWxscHRyOworICAgIHZvaWQgKCpkZXN0cm95X3dpbmRvdykoQXBwSW5zdGFuY2UgJikgPSBudWxscHRyOworICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtCb29sMzIgc3VwcG9ydHNfcHJlc2VudCA9IDA7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3VyZmFjZUV4dGVuc2lvbiAmb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUgPT0gb3RoZXIubmFtZSAmJiBzdXJmYWNlID09IG90aGVyLnN1cmZhY2UgJiYgc3VwcG9ydHNfcHJlc2VudCA9PSBvdGhlci5zdXBwb3J0c19wcmVzZW50OworICAgIH0KK307CisKK3N0cnVjdCBWdWxrYW5WZXJzaW9uIHsKKyAgICB1aW50MzJfdCBtYWpvcjsKKyAgICB1aW50MzJfdCBtaW5vcjsKKyAgICB1aW50MzJfdCBwYXRjaDsKK307CisKK3N0cnVjdCBBcHBJbnN0YW5jZSB7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZTsKKyAgICB1aW50MzJfdCBpbnN0YW5jZV92ZXJzaW9uOworICAgIFZ1bGthblZlcnNpb24gdmtfdmVyc2lvbjsKKworICAgIHN0ZDo6dmVjdG9yPExheWVyRXh0ZW5zaW9uTGlzdD4gZ2xvYmFsX2xheWVyczsKKworICAgIHN0ZDo6dmVjdG9yPFZrRXh0ZW5zaW9uUHJvcGVydGllcz4gZ2xvYmFsX2V4dGVuc2lvbnM7ICAvLyBJbnN0YW5jZSBFeHRlbnNpb25zCisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5zdF9leHRlbnNpb25zOworCisgICAgLy8gRnVuY3Rpb25zIGZyb20gdmtHZXRJbnN0YW5jZVByb2NBZGRyZXNzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUOworCisgICAgc3RkOjp2ZWN0b3I8U3VyZmFjZUV4dGVuc2lvbj4gc3VyZmFjZV9leHRlbnNpb25zOworCisgICAgaW50IHdpZHRoID0gMjU2LCBoZWlnaHQgPSAyNTY7CisKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgc3VyZmFjZV9jYXBhYmlsaXRpZXM7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgSElOU1RBTkNFIGhfaW5zdGFuY2U7ICAvLyBXaW5kb3dzIEluc3RhbmNlCisgICAgSFdORCBoX3duZDsgICAgICAgICAgICAvLyB3aW5kb3cgaGFuZGxlCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIHhjYl9jb25uZWN0aW9uX3QgKnhjYl9jb25uZWN0aW9uOworICAgIHhjYl9zY3JlZW5fdCAqeGNiX3NjcmVlbjsKKyAgICB4Y2Jfd2luZG93X3QgeGNiX3dpbmRvdzsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIERpc3BsYXkgKnhsaWJfZGlzcGxheTsKKyAgICBXaW5kb3cgeGxpYl93aW5kb3c7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgdm9pZCAqbWFjb3Nfd2luZG93OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgIHZvaWQgKm1ldGFsX3dpbmRvdzsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIHdsX2Rpc3BsYXkgKndheWxhbmRfZGlzcGxheTsKKyAgICB3bF9zdXJmYWNlICp3YXlsYW5kX3N1cmZhY2U7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIgIC8vIFRPRE8KKyAgICBBTmF0aXZlV2luZG93ICp3aW5kb3c7CisjZW5kaWYKKyAgICBBcHBJbnN0YW5jZSgpIHsKKyAgICAgICAgUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIGVudW1lcmF0ZV9pbnN0YW5jZV92ZXJzaW9uID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uPih2a0dldEluc3RhbmNlUHJvY0FkZHIobnVsbHB0ciwgInZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIikpOworCisgICAgICAgIGlmICghZW51bWVyYXRlX2luc3RhbmNlX3ZlcnNpb24pIHsKKyAgICAgICAgICAgIGluc3RhbmNlX3ZlcnNpb24gPSBWS19BUElfVkVSU0lPTl8xXzA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBWa1Jlc3VsdCBlcnIgPSBlbnVtZXJhdGVfaW5zdGFuY2VfdmVyc2lvbigmaW5zdGFuY2VfdmVyc2lvbik7CisgICAgICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgdmtfdmVyc2lvbiA9IHtWS19WRVJTSU9OX01BSk9SKGluc3RhbmNlX3ZlcnNpb24pLCBWS19WRVJTSU9OX01JTk9SKGluc3RhbmNlX3ZlcnNpb24pLCBWS19WRVJTSU9OX1BBVENIKFZLX0hFQURFUl9WRVJTSU9OKX07CisKKyAgICAgICAgQXBwR2V0SW5zdGFuY2VFeHRlbnNpb25zKCk7CisKKyAgICAgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBkYmdfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhULCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUIHwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYmdDYWxsYmFja307CisKKyAgICAgICAgY29uc3QgVmtBcHBsaWNhdGlvbkluZm8gYXBwX2luZm8gPSB7CisgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPLCBudWxscHRyLCBhcHBfc2hvcnRfbmFtZSwgMSwgbnVsbHB0ciwgMCwgVktfQVBJX1ZFUlNJT05fMV8wfTsKKworICAgICAgICBBcHBDb21waWxlSW5zdGFuY2VFeHRlbnNpb25zVG9FbmFibGUoKTsKKworICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGluc3RfZXh0czsKKyAgICAgICAgZm9yIChhdXRvICZleHQgOiBpbnN0X2V4dGVuc2lvbnMpIGluc3RfZXh0cy5wdXNoX2JhY2soZXh0LmNfc3RyKCkpOworCisgICAgICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvIGluc3RfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTywgICZkYmdfaW5mbywgICAgICAgMCwgJmFwcF9pbmZvLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluc3RfZXh0cy5zaXplKCkpLCBpbnN0X2V4dHMuZGF0YSgpfTsKKworICAgICAgICBWa1Jlc3VsdCBlcnIgPSB2a0NyZWF0ZUluc3RhbmNlKCZpbnN0X2luZm8sIG51bGxwdHIsICZpbnN0YW5jZSk7CisgICAgICAgIGlmIChlcnIgPT0gVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUikgeworICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJDYW5ub3QgY3JlYXRlIFZ1bGthbiBpbnN0YW5jZS5cbiI7CisgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlRoaXMgcHJvYmxlbSBpcyBvZnRlbiBjYXVzZWQgYnkgYSBmYXVsdHkgaW5zdGFsbGF0aW9uIG9mIHRoZSBWdWxrYW4gZHJpdmVyIG9yIGF0dGVtcHRpbmcgdG8gdXNlIGEgR1BVICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhhdCBkb2VzIG5vdCBzdXBwb3J0IFZ1bGthbi5cbiI7CisgICAgICAgICAgICBFUlJfRVhJVChlcnIpOworICAgICAgICB9IGVsc2UgaWYgKGVycikgeworICAgICAgICAgICAgRVJSX0VYSVQoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIEFwcExvYWRJbnN0YW5jZUNvbW1hbmRzKCk7CisgICAgfQorCisgICAgfkFwcEluc3RhbmNlKCkgeyB2a0Rlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgbnVsbHB0cik7IH0KKworICAgIEFwcEluc3RhbmNlKGNvbnN0IEFwcEluc3RhbmNlICYpID0gZGVsZXRlOworICAgIGNvbnN0IEFwcEluc3RhbmNlICZvcGVyYXRvcj0oY29uc3QgQXBwSW5zdGFuY2UgJikgPSBkZWxldGU7CisKKyAgICBib29sIENoZWNrRXh0ZW5zaW9uRW5hYmxlZChzdGQ6OnN0cmluZyBleHRlbnNpb25fdG9fY2hlY2spIHsKKyAgICAgICAgZm9yIChhdXRvICZleHRlbnNpb24gOiBpbnN0X2V4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChleHRlbnNpb25fdG9fY2hlY2sgPT0gZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qIEdldHMgYSBsaXN0IG9mIGxheWVyIGFuZCBpbnN0YW5jZSBleHRlbnNpb25zICovCisgICAgdm9pZCBBcHBHZXRJbnN0YW5jZUV4dGVuc2lvbnMoKSB7CisgICAgICAgIC8qIFNjYW4gbGF5ZXJzICovCisgICAgICAgIHN0ZDo6dmVjdG9yPFZrTGF5ZXJQcm9wZXJ0aWVzPiBnbG9iYWxfbGF5ZXJfcHJvcGVydGllczsKKworICAgICAgICBWa1Jlc3VsdCBlcnI7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZXJyID0gdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygmY291bnQsIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKGVycikgRVJSX0VYSVQoZXJyKTsKKworICAgICAgICAgICAgZ2xvYmFsX2xheWVyX3Byb3BlcnRpZXMucmVzaXplKGNvdW50KTsKKworICAgICAgICAgICAgZXJyID0gdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygmY291bnQsIGdsb2JhbF9sYXllcl9wcm9wZXJ0aWVzLmRhdGEoKSk7CisgICAgICAgIH0gd2hpbGUgKGVyciA9PSBWS19JTkNPTVBMRVRFKTsKKyAgICAgICAgaWYgKGVycikgRVJSX0VYSVQoZXJyKTsKKworICAgICAgICBnbG9iYWxfbGF5ZXJzLnJlc2l6ZShjb3VudCk7CisgICAgICAgIGFzc2VydChnbG9iYWxfbGF5ZXJfcHJvcGVydGllcy5zaXplKCkgPT0gZ2xvYmFsX2xheWVycy5zaXplKCkpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ2xvYmFsX2xheWVyX3Byb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGdsb2JhbF9sYXllcnNbaV0ubGF5ZXJfcHJvcGVydGllcyA9IGdsb2JhbF9sYXllcl9wcm9wZXJ0aWVzW2ldOworCisgICAgICAgICAgICBnbG9iYWxfbGF5ZXJzW2ldLmV4dGVuc2lvbl9wcm9wZXJ0aWVzID0gQXBwR2V0R2xvYmFsTGF5ZXJFeHRlbnNpb25zKGdsb2JhbF9sYXllcl9wcm9wZXJ0aWVzW2ldLmxheWVyTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb2xsZWN0IGdsb2JhbCBleHRlbnNpb25zCisgICAgICAgIC8vIEdldHMgaW5zdGFuY2UgZXh0ZW5zaW9ucywgaWYgbm8gbGF5ZXIgd2FzIHNwZWNpZmllZCBpbiB0aGUgZmlyc3QgcGFyYW10ZXRlcgorICAgICAgICBnbG9iYWxfZXh0ZW5zaW9ucyA9IEFwcEdldEdsb2JhbExheWVyRXh0ZW5zaW9ucyhudWxscHRyKTsKKyAgICB9CisgICAgdm9pZCBBcHBDb21waWxlSW5zdGFuY2VFeHRlbnNpb25zVG9FbmFibGUoKSB7CisgICAgICAgIC8vIEdldCBhbGwgc3VwcG9ydGVkIEluc3RhbmNlIGV4dGVuc2lvbnMgKGV4Y2wuIGxheWVyLXByb3ZpZGVkIG9uZXMpCisgICAgICAgIGZvciAoYXV0byAmZXh0IDogZ2xvYmFsX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGluc3RfZXh0ZW5zaW9ucy5wdXNoX2JhY2soZXh0LmV4dGVuc2lvbk5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgQXBwTG9hZEluc3RhbmNlQ29tbWFuZHMoKSB7CisjZGVmaW5lIExPQURfSU5TVEFOQ0VfVktfQ01EKGNtZCkgY21kID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fIyNjbWQ+KHZrR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgI2NtZCkpCisKKyAgICAgICAgTE9BRF9JTlNUQU5DRV9WS19DTUQodmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKTsKKyAgICAgICAgTE9BRF9JTlNUQU5DRV9WS19DTUQodmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIpOworICAgICAgICBMT0FEX0lOU1RBTkNFX1ZLX0NNRCh2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIpOworICAgICAgICBMT0FEX0lOU1RBTkNFX1ZLX0NNRCh2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKTsKKyAgICAgICAgTE9BRF9JTlNUQU5DRV9WS19DTUQodmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIpOworICAgICAgICBMT0FEX0lOU1RBTkNFX1ZLX0NNRCh2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIpOworICAgICAgICBMT0FEX0lOU1RBTkNFX1ZLX0NNRCh2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIpOworICAgICAgICBMT0FEX0lOU1RBTkNFX1ZLX0NNRCh2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUik7CisgICAgICAgIExPQURfSU5TVEFOQ0VfVktfQ01EKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpOworICAgICAgICBMT0FEX0lOU1RBTkNFX1ZLX0NNRCh2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIpOworICAgICAgICBMT0FEX0lOU1RBTkNFX1ZLX0NNRCh2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIpOworICAgICAgICBMT0FEX0lOU1RBTkNFX1ZLX0NNRCh2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQpOworCisjdW5kZWYgTE9BRF9JTlNUQU5DRV9WS19DTUQKKyAgICB9CisKKyAgICB2b2lkIEFkZFN1cmZhY2VFeHRlbnNpb24oU3VyZmFjZUV4dGVuc2lvbiBleHQpIHsgc3VyZmFjZV9leHRlbnNpb25zLnB1c2hfYmFjayhleHQpOyB9CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBBcHBHZXRHbG9iYWxMYXllckV4dGVuc2lvbnMoY2hhciAqbGF5ZXJfbmFtZSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IGV4dF9wcm9wczsKKyAgICAgICAgVmtSZXN1bHQgZXJyOworICAgICAgICB1aW50MzJfdCBleHRfY291bnQgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICAvLyBnZXRzIHRoZSBleHRlbnNpb24gY291bnQgaWYgdGhlIGxhc3QgcGFyYW1ldGVyIGlzIG51bGxwdHIKKyAgICAgICAgICAgIGVyciA9IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGxheWVyX25hbWUsICZleHRfY291bnQsIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKGVycikgRVJSX0VYSVQoZXJyKTsKKworICAgICAgICAgICAgZXh0X3Byb3BzLnJlc2l6ZShleHRfY291bnQpOworICAgICAgICAgICAgLy8gZ2V0cyB0aGUgZXh0ZW5zaW9uIHByb3BlcnRpZXMgaWYgdGhlIGxhc3QgcGFyYW1ldGVyIGlzIG5vdCBudWxscHRyCisgICAgICAgICAgICBlcnIgPSB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhsYXllcl9uYW1lLCAmZXh0X2NvdW50LCBleHRfcHJvcHMuZGF0YSgpKTsKKyAgICAgICAgfSB3aGlsZSAoZXJyID09IFZLX0lOQ09NUExFVEUpOworICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgICAgICByZXR1cm4gZXh0X3Byb3BzOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFZrUGh5c2ljYWxEZXZpY2U+IEZpbmRQaHlzaWNhbERldmljZXMoKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFZrUGh5c2ljYWxEZXZpY2U+IHBoeXNfZGV2aWNlczsKKworICAgICAgICBWa1Jlc3VsdCBlcnI7CisgICAgICAgIHVpbnQzMl90IGdwdV9jb3VudCA9IDA7CisKKyAgICAgICAgLyogcmVwZWF0IGdldCB1bnRpbCBWS19JTkNPTVBMRVRFIGdvZXMgYXdheSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBlcnIgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJmdwdV9jb3VudCwgbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworCisgICAgICAgICAgICBwaHlzX2RldmljZXMucmVzaXplKGdwdV9jb3VudCk7CisgICAgICAgICAgICBlcnIgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJmdwdV9jb3VudCwgcGh5c19kZXZpY2VzLmRhdGEoKSk7CisgICAgICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgICAgICAgICAgcGh5c19kZXZpY2VzLnJlc2l6ZShncHVfY291bnQpOworICAgICAgICB9IHdoaWxlIChlcnIgPT0gVktfSU5DT01QTEVURSk7CisKKyAgICAgICAgcmV0dXJuIHBoeXNfZGV2aWNlczsKKyAgICB9Cit9OworCisvLyAtLS0tLS0tLS0gUGxhdGZvcm0gU3BlY2lmaWMgUHJlc2VudGF0aW9uIENhbGxzIC0tLS0tLS0tLSAvLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVdpbjMyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisvLyBNUy1XaW5kb3dzIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uOgorTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jKEhXTkQgaFduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKSB7CisgICAgcmV0dXJuIChDQUxMX1BGTihEZWZXaW5kb3dQcm9jQSkoaFduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pKTsKK30KKworc3RhdGljIHZvaWQgQXBwQ3JlYXRlV2luMzJXaW5kb3coQXBwSW5zdGFuY2UgJmluc3QpIHsKKyAgICBpbnN0LmhfaW5zdGFuY2UgPSBHZXRNb2R1bGVIYW5kbGUobnVsbHB0cik7CisKKyAgICBXTkRDTEFTU0VYIHdpbl9jbGFzczsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHdpbmRvdyBjbGFzcyBzdHJ1Y3R1cmU6CisgICAgd2luX2NsYXNzLmNiU2l6ZSA9IHNpemVvZihXTkRDTEFTU0VYKTsKKyAgICB3aW5fY2xhc3Muc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKKyAgICB3aW5fY2xhc3MubHBmblduZFByb2MgPSBXbmRQcm9jOworICAgIHdpbl9jbGFzcy5jYkNsc0V4dHJhID0gMDsKKyAgICB3aW5fY2xhc3MuY2JXbmRFeHRyYSA9IDA7CisgICAgd2luX2NsYXNzLmhJbnN0YW5jZSA9IGluc3QuaF9pbnN0YW5jZTsKKyAgICB3aW5fY2xhc3MuaEljb24gPSBDQUxMX1BGTihMb2FkSWNvbkEpKG51bGxwdHIsIElESV9BUFBMSUNBVElPTik7CisgICAgd2luX2NsYXNzLmhDdXJzb3IgPSBMb2FkQ3Vyc29yKG51bGxwdHIsIElEQ19BUlJPVyk7CisgICAgd2luX2NsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKKyAgICB3aW5fY2xhc3MubHBzek1lbnVOYW1lID0gbnVsbHB0cjsKKyAgICB3aW5fY2xhc3MubHBzekNsYXNzTmFtZSA9IGFwcF9zaG9ydF9uYW1lOworICAgIHdpbl9jbGFzcy5oSW5zdGFuY2UgPSBpbnN0LmhfaW5zdGFuY2U7CisgICAgd2luX2NsYXNzLmhJY29uU20gPSBDQUxMX1BGTihMb2FkSWNvbkEpKG51bGxwdHIsIElESV9XSU5MT0dPKTsKKyAgICAvLyBSZWdpc3RlciB3aW5kb3cgY2xhc3M6CisgICAgaWYgKCFDQUxMX1BGTihSZWdpc3RlckNsYXNzRXhBKSgmd2luX2NsYXNzKSkgeworICAgICAgICAvLyBJdCBkaWRuJ3Qgd29yaywgc28gdHJ5IHRvIGdpdmUgYSB1c2VmdWwgZXJyb3I6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHRoZSB3aW5kb3cgY2xhc3MhXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgLy8gQ3JlYXRlIHdpbmRvdyB3aXRoIHRoZSByZWdpc3RlcmVkIGNsYXNzOgorICAgIFJFQ1Qgd3IgPSB7MCwgMCwgaW5zdC53aWR0aCwgaW5zdC5oZWlnaHR9OworICAgIENBTExfUEZOKEFkanVzdFdpbmRvd1JlY3QpKCZ3ciwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgRkFMU0UpOworICAgIGluc3QuaF93bmQgPSBDQUxMX1BGTihDcmVhdGVXaW5kb3dFeEEpKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX3Nob3J0X25hbWUsICAvLyBjbGFzcyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX3Nob3J0X25hbWUsICAvLyBhcHAgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdTX1ZJU0lCTEUgfCBXU19TWVNNRU5VIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19PVkVSTEFQUEVEV0lORE9XLCAgLy8gd2luZG93IHN0eWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAxMDAsICAgICAgICAgICAgIC8vIHgveSBjb29yZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ci5yaWdodCAtIHdyLmxlZnQsICAgLy8gd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ci5ib3R0b20gLSB3ci50b3AsICAgLy8gaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAgIC8vIGhhbmRsZSB0byBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAgICAgICAgICAgICAgLy8gaGFuZGxlIHRvIG1lbnUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LmhfaW5zdGFuY2UsICAgICAgLy8gaEluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7ICAgICAgICAgICAgIC8vIG5vIGV4dHJhIHBhcmFtZXRlcnMKKyAgICBpZiAoIWluc3QuaF93bmQpIHsKKyAgICAgICAgLy8gSXQgZGlkbid0IHdvcmssIHNvIHRyeSB0byBnaXZlIGEgdXNlZnVsIGVycm9yOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjcmVhdGUgYSB3aW5kb3chXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBWa1N1cmZhY2VLSFIgQXBwQ3JlYXRlV2luMzJTdXJmYWNlKEFwcEluc3RhbmNlICZpbnN0KSB7CisgICAgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNyZWF0ZUluZm87CisgICAgY3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIGNyZWF0ZUluZm8ucE5leHQgPSBudWxscHRyOworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSAwOworICAgIGNyZWF0ZUluZm8uaGluc3RhbmNlID0gaW5zdC5oX2luc3RhbmNlOworICAgIGNyZWF0ZUluZm8uaHduZCA9IGluc3QuaF93bmQ7CisKKyAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUihpbnN0Lmluc3RhbmNlLCAmY3JlYXRlSW5mbywgbnVsbHB0ciwgJnN1cmZhY2UpOworICAgIGlmIChlcnIpIEVSUl9FWElUKGVycik7CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK3N0YXRpYyB2b2lkIEFwcERlc3Ryb3lXaW4zMldpbmRvdyhBcHBJbnN0YW5jZSAmaW5zdCkgeyBDQUxMX1BGTihEZXN0cm95V2luZG93KShpbnN0Lmhfd25kKTsgfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSKSB8fCBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSKSB8fCAgICAgIFwKKyAgICBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9NQUNPU19NVkspIHx8IGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVCkgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIpIHx8IFwKKyAgICBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUikKK3N0YXRpYyB2b2lkIEFwcERlc3Ryb3lTdXJmYWNlKEFwcEluc3RhbmNlICZpbnN0LCBWa1N1cmZhY2VLSFIgc3VyZmFjZSkgeyAgLy8gc2FtZSBmb3IgYWxsIHBsYXRmb3JtcworICAgIHZrRGVzdHJveVN1cmZhY2VLSFIoaW5zdC5pbnN0YW5jZSwgc3VyZmFjZSwgbnVsbHB0cik7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWENCLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKK3N0YXRpYyB2b2lkIEFwcENyZWF0ZVhjYldpbmRvdyhBcHBJbnN0YW5jZSAmaW5zdCkgeworICAgIC8vLS1Jbml0IENvbm5lY3Rpb24tLQorICAgIGNvbnN0IHhjYl9zZXR1cF90ICpzZXR1cDsKKyAgICB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QgaXRlcjsKKyAgICBpbnQgc2NyOworCisgICAgLy8gQVBJIGd1YXJhbnRlZXMgbm9uLW51bGwgeGNiX2Nvbm5lY3Rpb24KKyAgICBpbnN0LnhjYl9jb25uZWN0aW9uID0geGNiX2Nvbm5lY3QobnVsbHB0ciwgJnNjcik7CisgICAgaW50IGNvbm5fZXJyb3IgPSB4Y2JfY29ubmVjdGlvbl9oYXNfZXJyb3IoaW5zdC54Y2JfY29ubmVjdGlvbik7CisgICAgaWYgKGNvbm5fZXJyb3IpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ0IgZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIFggc2VydmVyIGR1ZSB0byBlcnJvcjolZC5cbiIsIGNvbm5fZXJyb3IpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgeGNiX2Rpc2Nvbm5lY3QoaW5zdC54Y2JfY29ubmVjdGlvbik7CisgICAgICAgIGluc3QueGNiX2Nvbm5lY3Rpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2V0dXAgPSB4Y2JfZ2V0X3NldHVwKGluc3QueGNiX2Nvbm5lY3Rpb24pOworICAgIGl0ZXIgPSB4Y2Jfc2V0dXBfcm9vdHNfaXRlcmF0b3Ioc2V0dXApOworICAgIHdoaWxlIChzY3ItLSA+IDApIHsKKyAgICAgICAgeGNiX3NjcmVlbl9uZXh0KCZpdGVyKTsKKyAgICB9CisKKyAgICBpbnN0LnhjYl9zY3JlZW4gPSBpdGVyLmRhdGE7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBpbnN0LnhjYl93aW5kb3cgPSB4Y2JfZ2VuZXJhdGVfaWQoaW5zdC54Y2JfY29ubmVjdGlvbik7CisgICAgeGNiX2NyZWF0ZV93aW5kb3coaW5zdC54Y2JfY29ubmVjdGlvbiwgWENCX0NPUFlfRlJPTV9QQVJFTlQsIGluc3QueGNiX3dpbmRvdywgaW5zdC54Y2Jfc2NyZWVuLT5yb290LCAwLCAwLCBpbnN0LndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIGluc3QuaGVpZ2h0LCAwLCBYQ0JfV0lORE9XX0NMQVNTX0lOUFVUX09VVFBVVCwgaW5zdC54Y2Jfc2NyZWVuLT5yb290X3Zpc3VhbCwgMCwgbnVsbHB0cik7CisKKyAgICB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgY29va2llID0geGNiX2ludGVybl9hdG9tKGluc3QueGNiX2Nvbm5lY3Rpb24sIDEsIDEyLCAiV01fUFJPVE9DT0xTIik7CisgICAgeGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKnJlcGx5ID0geGNiX2ludGVybl9hdG9tX3JlcGx5KGluc3QueGNiX2Nvbm5lY3Rpb24sIGNvb2tpZSwgMCk7CisgICAgZnJlZShyZXBseSk7Cit9CisKK3N0YXRpYyBWa1N1cmZhY2VLSFIgQXBwQ3JlYXRlWGNiU3VyZmFjZShBcHBJbnN0YW5jZSAmaW5zdCkgeworICAgIGlmICghaW5zdC54Y2JfY29ubmVjdGlvbikgeworICAgICAgICBFUlJfRVhJVChWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQpOworICAgIH0KKworICAgIFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgeGNiX2NyZWF0ZUluZm87CisgICAgeGNiX2NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9YQ0JfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI7CisgICAgeGNiX2NyZWF0ZUluZm8ucE5leHQgPSBudWxscHRyOworICAgIHhjYl9jcmVhdGVJbmZvLmZsYWdzID0gMDsKKyAgICB4Y2JfY3JlYXRlSW5mby5jb25uZWN0aW9uID0gaW5zdC54Y2JfY29ubmVjdGlvbjsKKyAgICB4Y2JfY3JlYXRlSW5mby53aW5kb3cgPSBpbnN0LnhjYl93aW5kb3c7CisKKyAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2a0NyZWF0ZVhjYlN1cmZhY2VLSFIoaW5zdC5pbnN0YW5jZSwgJnhjYl9jcmVhdGVJbmZvLCBudWxscHRyLCAmc3VyZmFjZSk7CisgICAgaWYgKGVycikgRVJSX0VYSVQoZXJyKTsKKyAgICByZXR1cm4gc3VyZmFjZTsKK30KKworc3RhdGljIHZvaWQgQXBwRGVzdHJveVhjYldpbmRvdyhBcHBJbnN0YW5jZSAmaW5zdCkgeworICAgIGlmICghaW5zdC54Y2JfY29ubmVjdGlvbikgeworICAgICAgICByZXR1cm47ICAvLyBOb3RoaW5nIHRvIGRlc3Ryb3kKKyAgICB9CisKKyAgICB4Y2JfZGVzdHJveV93aW5kb3coaW5zdC54Y2JfY29ubmVjdGlvbiwgaW5zdC54Y2Jfd2luZG93KTsKKyAgICB4Y2JfZGlzY29ubmVjdChpbnN0LnhjYl9jb25uZWN0aW9uKTsKK30KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWExpYi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorc3RhdGljIHZvaWQgQXBwQ3JlYXRlWGxpYldpbmRvdyhBcHBJbnN0YW5jZSAmaW5zdCkgeworICAgIGxvbmcgdmlzdWFsTWFzayA9IFZpc3VhbFNjcmVlbk1hc2s7CisgICAgaW50IG51bWJlck9mVmlzdWFsczsKKworICAgIGluc3QueGxpYl9kaXNwbGF5ID0gWE9wZW5EaXNwbGF5KG51bGxwdHIpOworICAgIGlmIChpbnN0LnhsaWJfZGlzcGxheSA9PSBudWxscHRyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWExpYiBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgWCBzZXJ2ZXIuXG5FeGl0aW5nIC4uLlxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgWFZpc3VhbEluZm8gdkluZm9UZW1wbGF0ZSA9IHt9OworICAgIHZJbmZvVGVtcGxhdGUuc2NyZWVuID0gRGVmYXVsdFNjcmVlbihpbnN0LnhsaWJfZGlzcGxheSk7CisgICAgWFZpc3VhbEluZm8gKnZpc3VhbEluZm8gPSBYR2V0VmlzdWFsSW5mbyhpbnN0LnhsaWJfZGlzcGxheSwgdmlzdWFsTWFzaywgJnZJbmZvVGVtcGxhdGUsICZudW1iZXJPZlZpc3VhbHMpOworICAgIGluc3QueGxpYl93aW5kb3cgPSBYQ3JlYXRlV2luZG93KGluc3QueGxpYl9kaXNwbGF5LCBSb290V2luZG93KGluc3QueGxpYl9kaXNwbGF5LCB2SW5mb1RlbXBsYXRlLnNjcmVlbiksIDAsIDAsIGluc3Qud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC5oZWlnaHQsIDAsIHZpc3VhbEluZm8tPmRlcHRoLCBJbnB1dE91dHB1dCwgdmlzdWFsSW5mby0+dmlzdWFsLCAwLCBudWxscHRyKTsKKworICAgIFhTeW5jKGluc3QueGxpYl9kaXNwbGF5LCBmYWxzZSk7CisgICAgWEZyZWUodmlzdWFsSW5mbyk7Cit9CisKK3N0YXRpYyBWa1N1cmZhY2VLSFIgQXBwQ3JlYXRlWGxpYlN1cmZhY2UoQXBwSW5zdGFuY2UgJmluc3QpIHsKKyAgICBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9YTElCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIGNyZWF0ZUluZm8ucE5leHQgPSBudWxscHRyOworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSAwOworICAgIGNyZWF0ZUluZm8uZHB5ID0gaW5zdC54bGliX2Rpc3BsYXk7CisgICAgY3JlYXRlSW5mby53aW5kb3cgPSBpbnN0LnhsaWJfd2luZG93OworCisgICAgVmtTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgVmtSZXN1bHQgZXJyID0gdmtDcmVhdGVYbGliU3VyZmFjZUtIUihpbnN0Lmluc3RhbmNlLCAmY3JlYXRlSW5mbywgbnVsbHB0ciwgJnN1cmZhY2UpOworICAgIGlmIChlcnIpIEVSUl9FWElUKGVycik7CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK3N0YXRpYyB2b2lkIEFwcERlc3Ryb3lYbGliV2luZG93KEFwcEluc3RhbmNlICZpbnN0KSB7CisgICAgWERlc3Ryb3lXaW5kb3coaW5zdC54bGliX2Rpc3BsYXksIGluc3QueGxpYl93aW5kb3cpOworICAgIFhDbG9zZURpc3BsYXkoaW5zdC54bGliX2Rpc3BsYXkpOworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1NQUNPU19NVkstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKK3N0YXRpYyB2b2lkIEFwcENyZWF0ZU1hY09TV2luZG93KEFwcEluc3RhbmNlICZpbnN0KSB7CisgICAgaW5zdC5tYWNvc193aW5kb3cgPSBDcmVhdGVNZXRhbFZpZXcoaW5zdC53aWR0aCwgaW5zdC5oZWlnaHQpOworICAgIGlmIChpbnN0Lm1hY29zX3dpbmRvdyA9PSBudWxscHRyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNyZWF0ZSBhIG5hdGl2ZSBNZXRhbCB2aWV3LlxuRXhpdGluZy4uLlxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitzdGF0aWMgVmtTdXJmYWNlS0hSIEFwcENyZWF0ZU1hY09TU3VyZmFjZShBcHBJbnN0YW5jZSAmaW5zdCkgeworICAgIFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSzsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBjcmVhdGVJbmZvLmZsYWdzID0gMDsKKyAgICBjcmVhdGVJbmZvLnBWaWV3ID0gaW5zdC5tYWNvc193aW5kb3c7CisKKyAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZTsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyhpbnN0Lmluc3RhbmNlLCAmY3JlYXRlSW5mbywgbnVsbHB0ciwgJnN1cmZhY2UpOworICAgIGlmIChlcnIpIEVSUl9FWElUKGVycik7CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK3N0YXRpYyB2b2lkIEFwcERlc3Ryb3lNYWNPU1dpbmRvdyhBcHBJbnN0YW5jZSAmaW5zdCkgeyBEZXN0cm95TWV0YWxWaWV3KGluc3QubWFjb3Nfd2luZG93KTsgfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTUVUQUxfRVhULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCitzdGF0aWMgdm9pZCBBcHBDcmVhdGVNZXRhbFdpbmRvdyhBcHBJbnN0YW5jZSAmaW5zdCkgeworICAgIGluc3QubWV0YWxfd2luZG93ID0gQ3JlYXRlTWV0YWxWaWV3KGluc3Qud2lkdGgsIGluc3QuaGVpZ2h0KTsKKyAgICBpZiAoaW5zdC5tZXRhbF93aW5kb3cgPT0gbnVsbHB0cikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjcmVhdGUgYSBuYXRpdmUgTWV0YWwgdmlldy5cbkV4aXRpbmcuLi5cbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworc3RhdGljIFZrU3VyZmFjZUtIUiBBcHBDcmVhdGVNZXRhbFN1cmZhY2UoQXBwSW5zdGFuY2UgJmluc3QpIHsKKyAgICBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgY3JlYXRlSW5mbzsKKyAgICBjcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVUQUxfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQ7CisgICAgY3JlYXRlSW5mby5wTmV4dCA9IG51bGxwdHI7CisgICAgY3JlYXRlSW5mby5mbGFncyA9IDA7CisgICAgY3JlYXRlSW5mby5wTGF5ZXIgPSBzdGF0aWNfY2FzdDxDQU1ldGFsTGF5ZXIgKj4oR2V0Q0FNZXRhbExheWVyRnJvbU1ldGFsVmlldyhpbnN0Lm1ldGFsX3dpbmRvdykpOworCisgICAgVmtTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgVmtSZXN1bHQgZXJyID0gdmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQoaW5zdC5pbnN0YW5jZSwgJmNyZWF0ZUluZm8sIG51bGxwdHIsICZzdXJmYWNlKTsKKyAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgIHJldHVybiBzdXJmYWNlOworfQorCitzdGF0aWMgdm9pZCBBcHBEZXN0cm95TWV0YWxXaW5kb3coQXBwSW5zdGFuY2UgJmluc3QpIHsgRGVzdHJveU1ldGFsVmlldyhpbnN0Lm1ldGFsX3dpbmRvdyk7IH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1XQVlMQU5ELS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCitzdGF0aWMgdm9pZCB3YXlsYW5kX3JlZ2lzdHJ5X2dsb2JhbCh2b2lkICpkYXRhLCBzdHJ1Y3Qgd2xfcmVnaXN0cnkgKnJlZ2lzdHJ5LCB1aW50MzJfdCBpZCwgY29uc3QgY2hhciAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVyc2lvbikgeworICAgIEFwcEluc3RhbmNlICZpbnN0ID0gKnN0YXRpY19jYXN0PEFwcEluc3RhbmNlICo+KGRhdGEpOworICAgIGlmIChzdHJjbXAoaW50ZXJmYWNlLCAid2xfY29tcG9zaXRvciIpID09IDApIHsKKyAgICAgICAgc3RydWN0IHdsX2NvbXBvc2l0b3IgKmNvbXBvc2l0b3IgPSAoc3RydWN0IHdsX2NvbXBvc2l0b3IgKil3bF9yZWdpc3RyeV9iaW5kKHJlZ2lzdHJ5LCBpZCwgJndsX2NvbXBvc2l0b3JfaW50ZXJmYWNlLCAxKTsKKyAgICAgICAgaW5zdC53YXlsYW5kX3N1cmZhY2UgPSB3bF9jb21wb3NpdG9yX2NyZWF0ZV9zdXJmYWNlKGNvbXBvc2l0b3IpOworICAgIH0KK30KK3N0YXRpYyB2b2lkIHdheWxhbmRfcmVnaXN0cnlfZ2xvYmFsX3JlbW92ZSh2b2lkICpkYXRhLCBzdHJ1Y3Qgd2xfcmVnaXN0cnkgKnJlZ2lzdHJ5LCB1aW50MzJfdCBpZCkge30KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2xfcmVnaXN0cnlfbGlzdGVuZXIgd2F5bGFuZF9yZWdpc3RyeV9saXN0ZW5lciA9IHt3YXlsYW5kX3JlZ2lzdHJ5X2dsb2JhbCwgd2F5bGFuZF9yZWdpc3RyeV9nbG9iYWxfcmVtb3ZlfTsKKworc3RhdGljIHZvaWQgQXBwQ3JlYXRlV2F5bGFuZFdpbmRvdyhBcHBJbnN0YW5jZSAmaW5zdCkgeworICAgIGluc3Qud2F5bGFuZF9kaXNwbGF5ID0gd2xfZGlzcGxheV9jb25uZWN0KG51bGxwdHIpOworICAgIHN0cnVjdCB3bF9yZWdpc3RyeSAqcmVnaXN0cnkgPSB3bF9kaXNwbGF5X2dldF9yZWdpc3RyeShpbnN0LndheWxhbmRfZGlzcGxheSk7CisgICAgd2xfcmVnaXN0cnlfYWRkX2xpc3RlbmVyKHdsX2Rpc3BsYXlfZ2V0X3JlZ2lzdHJ5KGluc3Qud2F5bGFuZF9kaXNwbGF5KSwgJndheWxhbmRfcmVnaXN0cnlfbGlzdGVuZXIsIHN0YXRpY19jYXN0PHZvaWQgKj4oJmluc3QpKTsKKyAgICB3bF9kaXNwbGF5X3JvdW5kdHJpcChpbnN0LndheWxhbmRfZGlzcGxheSk7CisgICAgd2xfcmVnaXN0cnlfZGVzdHJveShyZWdpc3RyeSk7Cit9CisKK3N0YXRpYyBWa1N1cmZhY2VLSFIgQXBwQ3JlYXRlV2F5bGFuZFN1cmZhY2UoQXBwSW5zdGFuY2UgJmluc3QpIHsKKyAgICBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XQVlMQU5EX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIGNyZWF0ZUluZm8ucE5leHQgPSBudWxscHRyOworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSAwOworICAgIGNyZWF0ZUluZm8uZGlzcGxheSA9IGluc3Qud2F5bGFuZF9kaXNwbGF5OworICAgIGNyZWF0ZUluZm8uc3VyZmFjZSA9IGluc3Qud2F5bGFuZF9zdXJmYWNlOworCisgICAgVmtTdXJmYWNlS0hSIHN1cmZhY2U7CisgICAgVmtSZXN1bHQgZXJyID0gdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUihpbnN0Lmluc3RhbmNlLCAmY3JlYXRlSW5mbywgbnVsbHB0ciwgJnN1cmZhY2UpOworICAgIGlmIChlcnIpIEVSUl9FWElUKGVycik7CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK3N0YXRpYyB2b2lkIEFwcERlc3Ryb3lXYXlsYW5kV2luZG93KEFwcEluc3RhbmNlICZpbnN0KSB7IHdsX2Rpc3BsYXlfZGlzY29ubmVjdChpbnN0LndheWxhbmRfZGlzcGxheSk7IH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUFORFJPSUQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK3N0YXRpYyB2b2lkIEFwcENyZWF0ZUFuZHJvaWRXaW5kb3coQXBwSW5zdGFuY2UgJmluc3QpIHt9CitzdGF0aWMgVmtTdXJmYWNlS0hSIEFwcENyZWF0ZUFuZHJvaWRTdXJmYWNlKEFwcEluc3RhbmNlICZpbnN0KSB7CisgICAgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgY3JlYXRlSW5mbzsKKyAgICBjcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBjcmVhdGVJbmZvLmZsYWdzID0gMDsKKyAgICBjcmVhdGVJbmZvLndpbmRvdyA9IChzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyAqKShpbnN0LndpbmRvdyk7CisKKyAgICBlcnIgPSB2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKGluc3QuaW5zdCwgJmNyZWF0ZUluZm8sIE5VTEwsICZpbnN0LnN1cmZhY2UpOworICAgIEVYSVRfRVJSKGVycik7Cit9CitzdGF0aWMgVmtTdXJmYWNlS0hSIEFwcERlc3Ryb3lBbmRyb2lkU3VyZmFjZShBcHBJbnN0YW5jZSAmaW5zdCkge30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0gU2V0dXAgV2luZG93cyAtLS0tLS0tLS0tLS0tIC8vCisKK3ZvaWQgU2V0dXBXaW5kb3dFeHRlbnNpb25zKEFwcEluc3RhbmNlICZpbnN0KSB7CisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikgfHwgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpCisgICAgYm9vbCBoYXNfZGlzcGxheSA9IHRydWU7CisgICAgY29uc3QgY2hhciAqZGlzcGxheV92YXIgPSBnZXRlbnYoIkRJU1BMQVkiKTsKKyAgICBpZiAoZGlzcGxheV92YXIgPT0gbnVsbHB0ciB8fCBzdHJsZW4oZGlzcGxheV92YXIpID09IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICInRElTUExBWScgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldC4uLiBza2lwcGluZyBzdXJmYWNlIGluZm9cbiIpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgaGFzX2Rpc3BsYXkgPSBmYWxzZTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIHdsX2Rpc3BsYXkgKndheWxhbmRfZGlzcGxheSA9IHdsX2Rpc3BsYXlfY29ubmVjdChudWxscHRyKTsKKyAgICBib29sIGhhc193YXlsYW5kX2Rpc3BsYXkgPSBmYWxzZTsKKyAgICBpZiAod2F5bGFuZF9kaXNwbGF5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgd2xfZGlzcGxheV9kaXNjb25uZWN0KHdheWxhbmRfZGlzcGxheSk7CisgICAgICAgIGhhc193YXlsYW5kX2Rpc3BsYXkgPSB0cnVlOworICAgIH0KKyNlbmRpZgorCisvLy0tV0lOMzItLQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBTdXJmYWNlRXh0ZW5zaW9uIHN1cmZhY2VfZXh0X3dpbjMyOworICAgIGlmIChpbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgc3VyZmFjZV9leHRfd2luMzIubmFtZSA9IFZLX0tIUl9XSU4zMl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FOworICAgICAgICBzdXJmYWNlX2V4dF93aW4zMi5jcmVhdGVfd2luZG93ID0gQXBwQ3JlYXRlV2luMzJXaW5kb3c7CisgICAgICAgIHN1cmZhY2VfZXh0X3dpbjMyLmNyZWF0ZV9zdXJmYWNlID0gQXBwQ3JlYXRlV2luMzJTdXJmYWNlOworICAgICAgICBzdXJmYWNlX2V4dF93aW4zMi5kZXN0cm95X3dpbmRvdyA9IEFwcERlc3Ryb3lXaW4zMldpbmRvdzsKKworICAgICAgICBpbnN0LkFkZFN1cmZhY2VFeHRlbnNpb24oc3VyZmFjZV9leHRfd2luMzIpOworICAgIH0KKyNlbmRpZgorLy8tLVhDQi0tCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICBTdXJmYWNlRXh0ZW5zaW9uIHN1cmZhY2VfZXh0X3hjYjsKKyAgICBpZiAoaW5zdC5DaGVja0V4dGVuc2lvbkVuYWJsZWQoVktfS0hSX1hDQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBzdXJmYWNlX2V4dF94Y2IubmFtZSA9IFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgc3VyZmFjZV9leHRfeGNiLmNyZWF0ZV93aW5kb3cgPSBBcHBDcmVhdGVYY2JXaW5kb3c7CisgICAgICAgIHN1cmZhY2VfZXh0X3hjYi5jcmVhdGVfc3VyZmFjZSA9IEFwcENyZWF0ZVhjYlN1cmZhY2U7CisgICAgICAgIHN1cmZhY2VfZXh0X3hjYi5kZXN0cm95X3dpbmRvdyA9IEFwcERlc3Ryb3lYY2JXaW5kb3c7CisgICAgICAgIGlmIChoYXNfZGlzcGxheSkgeworICAgICAgICAgICAgaW5zdC5BZGRTdXJmYWNlRXh0ZW5zaW9uKHN1cmZhY2VfZXh0X3hjYik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKy8vLS1YTElCLS0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBTdXJmYWNlRXh0ZW5zaW9uIHN1cmZhY2VfZXh0X3hsaWI7CisgICAgaWYgKGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9YTElCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHN1cmZhY2VfZXh0X3hsaWIubmFtZSA9IFZLX0tIUl9YTElCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUU7CisgICAgICAgIHN1cmZhY2VfZXh0X3hsaWIuY3JlYXRlX3dpbmRvdyA9IEFwcENyZWF0ZVhsaWJXaW5kb3c7CisgICAgICAgIHN1cmZhY2VfZXh0X3hsaWIuY3JlYXRlX3N1cmZhY2UgPSBBcHBDcmVhdGVYbGliU3VyZmFjZTsKKyAgICAgICAgc3VyZmFjZV9leHRfeGxpYi5kZXN0cm95X3dpbmRvdyA9IEFwcERlc3Ryb3lYbGliV2luZG93OworICAgICAgICBpZiAoaGFzX2Rpc3BsYXkpIHsKKyAgICAgICAgICAgIGluc3QuQWRkU3VyZmFjZUV4dGVuc2lvbihzdXJmYWNlX2V4dF94bGliKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorLy8tLU1BQ09TLS0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgU3VyZmFjZUV4dGVuc2lvbiBzdXJmYWNlX2V4dF9tYWNvczsKKyAgICBpZiAoaW5zdC5DaGVja0V4dGVuc2lvbkVuYWJsZWQoVktfTVZLX01BQ09TX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHN1cmZhY2VfZXh0X21hY29zLm5hbWUgPSBWS19NVktfTUFDT1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgc3VyZmFjZV9leHRfbWFjb3MuY3JlYXRlX3dpbmRvdyA9IEFwcENyZWF0ZU1hY09TV2luZG93OworICAgICAgICBzdXJmYWNlX2V4dF9tYWNvcy5jcmVhdGVfc3VyZmFjZSA9IEFwcENyZWF0ZU1hY09TU3VyZmFjZTsKKyAgICAgICAgc3VyZmFjZV9leHRfbWFjb3MuZGVzdHJveV93aW5kb3cgPSBBcHBEZXN0cm95TWFjT1NXaW5kb3c7CisKKyAgICAgICAgaW5zdC5BZGRTdXJmYWNlRXh0ZW5zaW9uKHN1cmZhY2VfZXh0X21hY29zKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyAgICBTdXJmYWNlRXh0ZW5zaW9uIHN1cmZhY2VfZXh0X21ldGFsOworICAgIGlmIChpbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19FWFRfTUVUQUxfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgc3VyZmFjZV9leHRfbWV0YWwubmFtZSA9IFZLX0VYVF9NRVRBTF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FOworICAgICAgICBzdXJmYWNlX2V4dF9tZXRhbC5jcmVhdGVfd2luZG93ID0gQXBwQ3JlYXRlTWV0YWxXaW5kb3c7CisgICAgICAgIHN1cmZhY2VfZXh0X21ldGFsLmNyZWF0ZV9zdXJmYWNlID0gQXBwQ3JlYXRlTWV0YWxTdXJmYWNlOworICAgICAgICBzdXJmYWNlX2V4dF9tZXRhbC5kZXN0cm95X3dpbmRvdyA9IEFwcERlc3Ryb3lNZXRhbFdpbmRvdzsKKworICAgICAgICBpbnN0LkFkZFN1cmZhY2VFeHRlbnNpb24oc3VyZmFjZV9leHRfbWV0YWwpOworICAgIH0KKyNlbmRpZgorLy8tLVdBWUxBTkQtLQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIFN1cmZhY2VFeHRlbnNpb24gc3VyZmFjZV9leHRfd2F5bGFuZDsKKyAgICBpZiAoaW5zdC5DaGVja0V4dGVuc2lvbkVuYWJsZWQoVktfS0hSX1dBWUxBTkRfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgc3VyZmFjZV9leHRfd2F5bGFuZC5uYW1lID0gVktfS0hSX1dBWUxBTkRfU1VSRkFDRV9FWFRFTlNJT05fTkFNRTsKKyAgICAgICAgc3VyZmFjZV9leHRfd2F5bGFuZC5jcmVhdGVfd2luZG93ID0gQXBwQ3JlYXRlV2F5bGFuZFdpbmRvdzsKKyAgICAgICAgc3VyZmFjZV9leHRfd2F5bGFuZC5jcmVhdGVfc3VyZmFjZSA9IEFwcENyZWF0ZVdheWxhbmRTdXJmYWNlOworICAgICAgICBzdXJmYWNlX2V4dF93YXlsYW5kLmRlc3Ryb3lfd2luZG93ID0gQXBwRGVzdHJveVdheWxhbmRXaW5kb3c7CisgICAgICAgIGlmIChoYXNfd2F5bGFuZF9kaXNwbGF5KSB7CisgICAgICAgICAgICBpbnN0LkFkZFN1cmZhY2VFeHRlbnNpb24oc3VyZmFjZV9leHRfd2F5bGFuZCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKy8vLS1BTkRST0lELS0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBTdXJmYWNlRXh0ZW5zaW9uIHN1cmZhY2VfZXh0X2FuZHJvaWQ7CisgICAgaWYgKGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0FORFJPSURfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgc3VyZmFjZV9leHRfYW5kcm9pZC5uYW1lID0gVktfQU5EUk9JRF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FOworICAgICAgICBzdXJmYWNlX2V4dF9hbmRyb2lkLmNyZWF0ZV93aW5kb3cgPSBBcHBDcmVhdGVBbmRyb2lkV2luZG93OworICAgICAgICBzdXJmYWNlX2V4dF9hbmRyb2lkLmNyZWF0ZV9zdXJmYWNlID0gQXBwQ3JlYXRlQW5kcm9pZFN1cmZhY2U7CisgICAgICAgIHN1cmZhY2VfZXh0X2FuZHJvaWQuZGVzdHJveV93aW5kb3cgPSBBcHBEZXN0cm95QW5kcm9pZFdpbmRvdzsKKworICAgICAgICBpbnN0LkFkZFN1cmZhY2VFeHRlbnNpb24oc3VyZmFjZV9leHRfYW5kcm9pZCk7CisgICAgfQorI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0gU3VyZmFjZXMgLS0tLS0tLS0tLS0tLS0gLy8KKworY2xhc3MgQXBwU3VyZmFjZSB7CisgICBwdWJsaWM6CisgICAgQXBwSW5zdGFuY2UgJmluc3Q7CisgICAgU3VyZmFjZUV4dGVuc2lvbiBzdXJmYWNlX2V4dGVuc2lvbjsKKworICAgIHN0ZDo6dmVjdG9yPFZrUHJlc2VudE1vZGVLSFI+IHN1cmZfcHJlc2VudF9tb2RlczsKKworICAgIHN0ZDo6dmVjdG9yPFZrU3VyZmFjZUZvcm1hdEtIUj4gc3VyZl9mb3JtYXRzOworICAgIHN0ZDo6dmVjdG9yPFZrU3VyZmFjZUZvcm1hdDJLSFI+IHN1cmZfZm9ybWF0czI7CisKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgc3VyZmFjZV9jYXBhYmlsaXRpZXM7CisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiBzdXJmYWNlX2NhcGFiaWxpdGllczJfa2hyOworICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgc3VyZmFjZV9jYXBhYmlsaXRpZXMyX2V4dDsKKworICAgIEFwcFN1cmZhY2UoQXBwSW5zdGFuY2UgJmluc3QsIFZrUGh5c2ljYWxEZXZpY2UgcGh5c19kZXZpY2UsIFN1cmZhY2VFeHRlbnNpb24gc3VyZmFjZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxwTmV4dENoYWluQnVpbGRpbmdCbG9ja0luZm8+ICZzdXJfZXh0ZW5zaW9uX3BOZXh0Q2hhaW4pCisgICAgICAgIDogaW5zdChpbnN0KSwgc3VyZmFjZV9leHRlbnNpb24oc3VyZmFjZV9leHRlbnNpb24pIHsKKyAgICAgICAgdWludDMyX3QgcHJlc2VudF9tb2RlX2NvdW50ID0gMDsKKyAgICAgICAgVmtSZXN1bHQgZXJyb3IgPQorICAgICAgICAgICAgaW5zdC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihwaHlzX2RldmljZSwgc3VyZmFjZV9leHRlbnNpb24uc3VyZmFjZSwgJnByZXNlbnRfbW9kZV9jb3VudCwgbnVsbHB0cik7CisgICAgICAgIGlmIChlcnJvcikgRVJSX0VYSVQoZXJyb3IpOworCisgICAgICAgIHN1cmZfcHJlc2VudF9tb2Rlcy5yZXNpemUocHJlc2VudF9tb2RlX2NvdW50KTsKKyAgICAgICAgZXJyb3IgPSBpbnN0LnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKHBoeXNfZGV2aWNlLCBzdXJmYWNlX2V4dGVuc2lvbi5zdXJmYWNlLCAmcHJlc2VudF9tb2RlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZl9wcmVzZW50X21vZGVzLmRhdGEoKSk7CisgICAgICAgIGlmIChlcnJvcikgRVJSX0VYSVQoZXJyb3IpOworCisgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgc3VyZmFjZV9pbmZvMiA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VSRkFDRV9JTkZPXzJfS0hSLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZV9leHRlbnNpb24uc3VyZmFjZX07CisKKyAgICAgICAgdWludDMyX3QgZm9ybWF0X2NvdW50ID0gMDsKKyAgICAgICAgaWYgKGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIFZrUmVzdWx0IGVyciA9IGluc3QudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUihwaHlzX2RldmljZSwgJnN1cmZhY2VfaW5mbzIsICZmb3JtYXRfY291bnQsIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKGVycikgRVJSX0VYSVQoZXJyKTsKKyAgICAgICAgICAgIHN1cmZfZm9ybWF0czIucmVzaXplKGZvcm1hdF9jb3VudCk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZm9ybWF0X2NvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdXJmX2Zvcm1hdHMyW2ldLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GT1JNQVRfMl9LSFI7CisgICAgICAgICAgICAgICAgc3VyZl9mb3JtYXRzMltpXS5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBpbnN0LnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIocGh5c19kZXZpY2UsICZzdXJmYWNlX2luZm8yLCAmZm9ybWF0X2NvdW50LCBzdXJmX2Zvcm1hdHMyLmRhdGEoKSk7CisgICAgICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVmtSZXN1bHQgZXJyID0KKyAgICAgICAgICAgICAgICBpbnN0LnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihwaHlzX2RldmljZSwgc3VyZmFjZV9leHRlbnNpb24uc3VyZmFjZSwgJmZvcm1hdF9jb3VudCwgbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgICAgICAgICAgc3VyZl9mb3JtYXRzLnJlc2l6ZShmb3JtYXRfY291bnQpOworICAgICAgICAgICAgZXJyID0gaW5zdC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIocGh5c19kZXZpY2UsIHN1cmZhY2VfZXh0ZW5zaW9uLnN1cmZhY2UsICZmb3JtYXRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmX2Zvcm1hdHMuZGF0YSgpKTsKKyAgICAgICAgICAgIGlmIChlcnIpIEVSUl9FWElUKGVycik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5zdC5DaGVja0V4dGVuc2lvbkVuYWJsZWQoVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBWa1Jlc3VsdCBlcnIgPQorICAgICAgICAgICAgICAgIGluc3QudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c19kZXZpY2UsIHN1cmZhY2VfZXh0ZW5zaW9uLnN1cmZhY2UsICZzdXJmYWNlX2NhcGFiaWxpdGllcyk7CisgICAgICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHN1cmZhY2VfY2FwYWJpbGl0aWVzMl9raHIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0tIUjsKKyAgICAgICAgICAgIGJ1aWxkcE5leHRDaGFpbigoVmtTdHJ1Y3R1cmVIZWFkZXIgKikmc3VyZmFjZV9jYXBhYmlsaXRpZXMyX2tociwgc3VyX2V4dGVuc2lvbl9wTmV4dENoYWluKTsKKworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBzdXJmYWNlX2luZm87CisgICAgICAgICAgICBzdXJmYWNlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VSRkFDRV9JTkZPXzJfS0hSOworICAgICAgICAgICAgc3VyZmFjZV9pbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN1cmZhY2VfaW5mby5zdXJmYWNlID0gc3VyZmFjZV9leHRlbnNpb24uc3VyZmFjZTsKKworICAgICAgICAgICAgVmtSZXN1bHQgZXJyID0gaW5zdC52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIocGh5c19kZXZpY2UsICZzdXJmYWNlX2luZm8sICZzdXJmYWNlX2NhcGFiaWxpdGllczJfa2hyKTsKKyAgICAgICAgICAgIGlmIChlcnIpIEVSUl9FWElUKGVycik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5zdC5DaGVja0V4dGVuc2lvbkVuYWJsZWQoVktfRVhUX0RJU1BMQVlfU1VSRkFDRV9DT1VOVEVSX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgc3VyZmFjZV9jYXBhYmlsaXRpZXMyX2V4dC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhUOworICAgICAgICAgICAgc3VyZmFjZV9jYXBhYmlsaXRpZXMyX2V4dC5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgICAgICBWa1Jlc3VsdCBlcnIgPQorICAgICAgICAgICAgICAgIGluc3QudmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKHBoeXNfZGV2aWNlLCBzdXJmYWNlX2V4dGVuc2lvbi5zdXJmYWNlLCAmc3VyZmFjZV9jYXBhYmlsaXRpZXMyX2V4dCk7CisgICAgICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgfkFwcFN1cmZhY2UoKSB7CisgICAgICAgIGlmIChpbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfR0VUX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBmcmVlcE5leHRDaGFpbihzdGF0aWNfY2FzdDxWa1N0cnVjdHVyZUhlYWRlciAqPihzdXJmYWNlX2NhcGFiaWxpdGllczJfa2hyLnBOZXh0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBcHBTdXJmYWNlKGNvbnN0IEFwcFN1cmZhY2UgJikgPSBkZWxldGU7CisgICAgY29uc3QgQXBwU3VyZmFjZSAmb3BlcmF0b3I9KGNvbnN0IEFwcFN1cmZhY2UgJikgPSBkZWxldGU7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgR3JvdXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKK3N0ZDo6dmVjdG9yPFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM+IEdldEdyb3VwcyhBcHBJbnN0YW5jZSAmaW5zdCkgeworICAgIGlmIChpbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFI+KAorICAgICAgICAgICAgICAgIHZrR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0Lmluc3RhbmNlLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiIpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzPiBncm91cHM7CisgICAgICAgIHVpbnQzMl90IGdyb3VwX2NvdW50OworICAgICAgICBWa1Jlc3VsdCBlcnI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGVyciA9IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoaW5zdC5pbnN0YW5jZSwgJmdyb3VwX2NvdW50LCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gVktfU1VDQ0VTUyAmJiBlcnIgIT0gVktfSU5DT01QTEVURSkgRVJSX0VYSVQoZXJyKTsKKyAgICAgICAgICAgIGdyb3Vwcy5yZXNpemUoZ3JvdXBfY291bnQpOworCisgICAgICAgICAgICBlcnIgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKGluc3QuaW5zdGFuY2UsICZncm91cF9jb3VudCwgZ3JvdXBzLmRhdGEoKSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IFZLX1NVQ0NFU1MgJiYgZXJyICE9IFZLX0lOQ09NUExFVEUpIEVSUl9FWElUKGVycik7CisgICAgICAgIH0gd2hpbGUgKGVyciA9PSBWS19JTkNPTVBMRVRFKTsKKyAgICAgICAgcmV0dXJuIGdyb3VwczsKKyAgICB9CisgICAgcmV0dXJuIHt9OworfQorCitzdGQ6OnZlY3RvcjxWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcz4gR2V0R3JvdXBQcm9wcyhWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIGdyb3VwKSB7CisgICAgc3RkOjp2ZWN0b3I8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXM+IHByb3BzKGdyb3VwLnBoeXNpY2FsRGV2aWNlQ291bnQpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdyb3VwLnBoeXNpY2FsRGV2aWNlQ291bnQ7ICsraSkgeworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhncm91cC5waHlzaWNhbERldmljZXNbaV0sICZwcm9wc1tpXSk7CisgICAgfQorCisgICAgcmV0dXJuIHByb3BzOworfQorCisvLyBUaGUgYm9vbCBvZiB0aGUgcGFpciByZXR1cm5zIHRydWUgaWYgdGhlIGV4dGVuc2lvbiBWS19LSFJfZGV2aWNlX2dyb3VwIGlzIHByZXNlbnQKK3N0ZDo6cGFpcjxib29sLCBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUj4gR2V0R3JvdXBDYXBhYmlsaXRpZXMoQXBwSW5zdGFuY2UgJmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgZ3JvdXApIHsKKyAgICAvLyBCdWlsZCBjcmVhdGUgaW5mbyBmb3IgbG9naWNhbCBkZXZpY2UgbWFkZSBmcm9tIGFsbCBwaHlzaWNhbCBkZXZpY2VzIGluIHRoaXMgZ3JvdXAuCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGV4dGVuc2lvbnNfbGlzdCA9IHtWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FLCBWS19LSFJfREVWSUNFX0dST1VQX0VYVEVOU0lPTl9OQU1FfTsKKyAgICBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mb0tIUiBkZ19jaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPX0tIUiwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5waHlzaWNhbERldmljZUNvdW50LCBncm91cC5waHlzaWNhbERldmljZXN9OworCisgICAgZmxvYXQgcXVldWVfcHJpb3JpdHkgPSAxLjBmOworCisgICAgYXV0byBleHRfbGlzdCA9IGdldF9jX3N0cl9hcnJheShleHRlbnNpb25zX2xpc3QpOworCisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gcV9jaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDAsIDEsICZxdWV1ZV9wcmlvcml0eX07CisgICAgVmtEZXZpY2VDcmVhdGVJbmZvIGRldmljZV9jaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8sICAgJmRnX2NpLCAgICAgICAgIDAsIDEsICZxX2NpLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGV4dF9saXN0LnNpemUoKSksIGV4dF9saXN0LmRhdGEoKX07CisKKyAgICBWa0RldmljZSBsb2dpY2FsX2RldmljZSA9IFZLX05VTExfSEFORExFOworCisgICAgVmtSZXN1bHQgZXJyID0gdmtDcmVhdGVEZXZpY2UoZ3JvdXAucGh5c2ljYWxEZXZpY2VzWzBdLCAmZGV2aWNlX2NpLCBudWxscHRyLCAmbG9naWNhbF9kZXZpY2UpOworICAgIGlmIChlcnIgIT0gVktfU1VDQ0VTUyAmJiBlcnIgIT0gVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UKSBFUlJfRVhJVChlcnIpOworCisgICAgaWYgKGVyciA9PSBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgZ3JvdXBfY2FwYWJpbGl0aWVzID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0NBUEFCSUxJVElFU19LSFIsIG51bGxwdHJ9OworICAgICAgICB2a0Rlc3Ryb3lEZXZpY2UobG9naWNhbF9kZXZpY2UsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gc3RkOjpwYWlyPGJvb2wsIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPihmYWxzZSwgZ3JvdXBfY2FwYWJpbGl0aWVzKTsKKyAgICB9CisKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiBncm91cF9jYXBhYmlsaXRpZXMgPSB7VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfQ0FQQUJJTElUSUVTX0tIUiwgbnVsbHB0cn07CisKKyAgICAvLyBJZiB0aGUgS0hSX2RldmljZV9ncm91cCBleHRlbnNpb24gaXMgcHJlc2VudCwgd3JpdGUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgbG9naWNhbCBkZXZpY2UgaW50byBhIHN0cnVjdCBmb3IgbGF0ZXIKKyAgICAvLyBvdXRwdXQgdG8gdXNlci4KKyAgICBQRk5fdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUj4oCisgICAgICAgICAgICB2a0dldEluc3RhbmNlUHJvY0FkZHIoaW5zdC5pbnN0YW5jZSwgInZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIikpOworICAgIGVyciA9IHZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKGxvZ2ljYWxfZGV2aWNlLCAmZ3JvdXBfY2FwYWJpbGl0aWVzKTsKKyAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworCisgICAgdmtEZXN0cm95RGV2aWNlKGxvZ2ljYWxfZGV2aWNlLCBudWxscHRyKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8Ym9vbCwgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI+KHRydWUsIGdyb3VwX2NhcGFiaWxpdGllcyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIERldmljZSBTZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisKK3N0cnVjdCBNZW1JbWFnZVN1cHBvcnQgeworICAgIGJvb2wgcmVndWxhcl9zdXBwb3J0ZWQsIHNwYXJzZV9zdXBwb3J0ZWQsIHRyYW5zaWVudF9zdXBwb3J0ZWQ7CisgICAgVmtGb3JtYXQgZm9ybWF0OworICAgIHVpbnQzMl90IHJlZ3VsYXJfbWVtdHlwZXMsIHNwYXJzZV9tZW10eXBlcywgdHJhbnNpZW50X21lbXR5cGVzOworfTsKKworc3RydWN0IE1lbVJlc1N1cHBvcnQgeworICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxNZW1JbWFnZVN1cHBvcnQsIDg+LCAyPiBpbWFnZTsKKyAgICAvLyBUT0RPOiBidWZmZXJzCit9OworCitzdHJ1Y3QgcE5leHRDaGFpbkluZm9zIHsKKyAgICBzdGQ6OnZlY3RvcjxwTmV4dENoYWluQnVpbGRpbmdCbG9ja0luZm8+IHBoeXNfZGV2aWNlX3Byb3BzMjsKKyAgICBzdGQ6OnZlY3RvcjxwTmV4dENoYWluQnVpbGRpbmdCbG9ja0luZm8+IHBoeXNfZGV2aWNlX21lbV9wcm9wczI7CisgICAgc3RkOjp2ZWN0b3I8cE5leHRDaGFpbkJ1aWxkaW5nQmxvY2tJbmZvPiBwaHlzX2RldmljZV9mZWF0dXJlczI7CisgICAgc3RkOjp2ZWN0b3I8cE5leHRDaGFpbkJ1aWxkaW5nQmxvY2tJbmZvPiBzdXJmYWNlX2NhcGFiaWxpdGllczI7CisgICAgc3RkOjp2ZWN0b3I8cE5leHRDaGFpbkJ1aWxkaW5nQmxvY2tJbmZvPiBmb3JtYXRfcHJvcGVydGllczI7Cit9OworCitzdHJ1Y3QgRm9ybWF0UmFuZ2UgeworICAgIC8vIHRoZSBWdWxrYW4gc3RhbmRhcmQgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIHRoaXMgZm9ybWF0IHJhbmdlLCBvciAwIGlmIG5vbi1zdGFuZGFyZAorICAgIHVpbnQzMl90IG1pbmltdW1faW5zdGFuY2VfdmVyc2lvbjsKKworICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdGhhdCBzdXBwb3J0cyB0aGlzIGZvcm1hdCByYW5nZSwgb3IgTlVMTCBpZiB0aGUgcmFuZ2UKKyAgICAvLyBpcyBvbmx5IHBhcnQgb2YgdGhlIHN0YW5kYXJkCisgICAgY29uc3QgY2hhciAqZXh0ZW5zaW9uX25hbWU7CisKKyAgICAvLyBUaGUgZmlyc3QgYW5kIGxhc3Qgc3VwcG9ydGVkIGZvcm1hdHMgd2l0aGluIHRoaXMgcmFuZ2UuCisgICAgVmtGb3JtYXQgZmlyc3RfZm9ybWF0OworICAgIFZrRm9ybWF0IGxhc3RfZm9ybWF0OworfTsKKworc3RydWN0IEFwcEdwdSB7CisgICAgQXBwSW5zdGFuY2UgJmluc3Q7CisgICAgdWludDMyX3QgaWQ7CisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzX2RldmljZTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIHByb3BzOworICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiBwcm9wczI7CisKKyAgICB1aW50MzJfdCBxdWV1ZV9jb3VudDsKKyAgICBzdGQ6OnZlY3RvcjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllcz4gcXVldWVfcHJvcHM7CisgICAgc3RkOjp2ZWN0b3I8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSPiBxdWV1ZV9wcm9wczI7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlfcHJvcHM7CisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIG1lbW9yeV9wcm9wczI7CisKKyAgICBNZW1SZXNTdXBwb3J0IG1lbV90eXBlX3Jlc19zdXBwb3J0OworCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGZlYXR1cmVzOworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgZmVhdHVyZXMyOworICAgIFZrUGh5c2ljYWxEZXZpY2UgbGltaXRzOworCisgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBkZXZpY2VfZXh0ZW5zaW9uczsKKworICAgIFZrRGV2aWNlIGRldjsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZW5hYmxlZF9mZWF0dXJlczsKKworICAgIHN0ZDo6YXJyYXk8VmtEZXZpY2VTaXplLCBWS19NQVhfTUVNT1JZX0hFQVBTPiBoZWFwQnVkZ2V0OworICAgIHN0ZDo6YXJyYXk8VmtEZXZpY2VTaXplLCBWS19NQVhfTUVNT1JZX0hFQVBTPiBoZWFwVXNhZ2U7CisKKyAgICBzdGQ6OnZlY3RvcjxGb3JtYXRSYW5nZT4gc3VwcG9ydGVkX2Zvcm1hdF9yYW5nZXM7CisKKyAgICBBcHBHcHUoQXBwSW5zdGFuY2UgJmluc3QsIHVpbnQzMl90IGlkLCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNfZGV2aWNlLCBwTmV4dENoYWluSW5mb3MgY2hhaW5JbmZvcykKKyAgICAgICAgOiBpbnN0KGluc3QpLCBpZChpZCksIHBoeXNfZGV2aWNlKHBoeXNfZGV2aWNlKSB7CisgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKHBoeXNfZGV2aWNlLCAmcHJvcHMpOworCisgICAgICAgIGlmIChpbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBwcm9wczIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0tIUjsKKyAgICAgICAgICAgIGJ1aWxkcE5leHRDaGFpbigoVmtTdHJ1Y3R1cmVIZWFkZXIgKikmcHJvcHMyLCBjaGFpbkluZm9zLnBoeXNfZGV2aWNlX3Byb3BzMik7CisKKyAgICAgICAgICAgIGluc3QudmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKHBoeXNfZGV2aWNlLCAmcHJvcHMyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdldCBxdWV1ZSBjb3VudCAqLworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNfZGV2aWNlLCAmcXVldWVfY291bnQsIG51bGxwdHIpOworCisgICAgICAgIHF1ZXVlX3Byb3BzLnJlc2l6ZShxdWV1ZV9jb3VudCk7CisKKyAgICAgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzX2RldmljZSwgJnF1ZXVlX2NvdW50LCBxdWV1ZV9wcm9wcy5kYXRhKCkpOworCisgICAgICAgIGlmIChpbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBxdWV1ZV9wcm9wczIucmVzaXplKHF1ZXVlX2NvdW50KTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBxdWV1ZV9jb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgcXVldWVfcHJvcHMyW2ldLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFVUVfRkFNSUxZX1BST1BFUlRJRVNfMl9LSFI7CisgICAgICAgICAgICAgICAgcXVldWVfcHJvcHMyW2ldLnBOZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5zdC52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUihwaHlzX2RldmljZSwgJnF1ZXVlX2NvdW50LCBxdWV1ZV9wcm9wczIuZGF0YSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKHBoeXNfZGV2aWNlLCAmbWVtb3J5X3Byb3BzKTsKKworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMocGh5c19kZXZpY2UsICZmZWF0dXJlcyk7CisKKyAgICAgICAgaWYgKGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIG1lbW9yeV9wcm9wczIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BST1BFUlRJRVNfMl9LSFI7CisgICAgICAgICAgICBidWlsZHBOZXh0Q2hhaW4oKFZrU3RydWN0dXJlSGVhZGVyICopJm1lbW9yeV9wcm9wczIsIGNoYWluSW5mb3MucGh5c19kZXZpY2VfbWVtX3Byb3BzMik7CisKKyAgICAgICAgICAgIGluc3QudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKHBoeXNfZGV2aWNlLCAmbWVtb3J5X3Byb3BzMik7CisKKyAgICAgICAgICAgIGZlYXR1cmVzMi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yX0tIUjsKKyAgICAgICAgICAgIGJ1aWxkcE5leHRDaGFpbigoVmtTdHJ1Y3R1cmVIZWFkZXIgKikmZmVhdHVyZXMyLCBjaGFpbkluZm9zLnBoeXNfZGV2aWNlX2ZlYXR1cmVzMik7CisKKyAgICAgICAgICAgIGluc3QudmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihwaHlzX2RldmljZSwgJmZlYXR1cmVzMik7CisgICAgICAgIH0KKworICAgICAgICBkZXZpY2VfZXh0ZW5zaW9ucyA9IEFwcEdldFBoeXNpY2FsRGV2aWNlTGF5ZXJFeHRlbnNpb25zKG51bGxwdHIpOworCisgICAgICAgIGNvbnN0IGZsb2F0IHF1ZXVlX3ByaW9yaXR5ID0gMS4wZjsKKyAgICAgICAgY29uc3QgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gcV9jaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBqdXN0IHBpY2sgdGhlIGZpcnN0IG9uZSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWV1ZV9wcmlvcml0eX07CisgICAgICAgIGVuYWJsZWRfZmVhdHVyZXMgPSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXN7MH07CisgICAgICAgIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyBkZXZpY2VfY2kgPSB7CisgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDEsICZxX2NpLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAmZW5hYmxlZF9mZWF0dXJlc307CisKKyAgICAgICAgVmtSZXN1bHQgZXJyID0gdmtDcmVhdGVEZXZpY2UocGh5c19kZXZpY2UsICZkZXZpY2VfY2ksIG51bGxwdHIsICZkZXYpOworICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworCisgICAgICAgIGNvbnN0IFZrRm9ybWF0IGNvbG9yX2Zvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtGb3JtYXQ+IGZvcm1hdHMgPSB7CisgICAgICAgICAgICBjb2xvcl9mb3JtYXQsICAgICAgVktfRk9STUFUX0QxNl9VTk9STSwgICAgICAgICBWS19GT1JNQVRfWDhfRDI0X1VOT1JNX1BBQ0szMiwgVktfRk9STUFUX0QzMl9TRkxPQVQsCisgICAgICAgICAgICBWS19GT1JNQVRfUzhfVUlOVCwgVktfRk9STUFUX0QxNl9VTk9STV9TOF9VSU5ULCBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQsICAgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVH07CisgICAgICAgIGFzc2VydChtZW1fdHlwZV9yZXNfc3VwcG9ydC5pbWFnZVswXS5zaXplKCkgPT0gZm9ybWF0cy5zaXplKCkpOworICAgICAgICBjb25zdCBzdGQ6OmFycmF5PFZrSW1hZ2VVc2FnZUZsYWdzLCAyPiB1c2FnZXMgPSB7MCwgVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUfTsKKyAgICAgICAgY29uc3Qgc3RkOjphcnJheTxWa0ltYWdlQ3JlYXRlRmxhZ3MsIDI+IGZsYWdzcyA9IHswLCBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUfTsKKworICAgICAgICBmb3IgKHNpemVfdCBmbXRfaSA9IDA7IGZtdF9pIDwgZm9ybWF0cy5zaXplKCk7ICsrZm10X2kpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgaXRlcmF0ZSBvdmVyIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMIGFuZCBWS19JTUFHRV9USUxJTkdfTElORUFSICgwIGFuZCAxKQorICAgICAgICAgICAgZm9yIChzaXplX3QgdGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7IHRpbGluZyA8PSBWS19JTUFHRV9USUxJTkdfTElORUFSOyArK3RpbGluZykgeworICAgICAgICAgICAgICAgIG1lbV90eXBlX3Jlc19zdXBwb3J0LmltYWdlW3RpbGluZ11bZm10X2ldLmZvcm1hdCA9IGZvcm1hdHNbZm10X2ldOworICAgICAgICAgICAgICAgIG1lbV90eXBlX3Jlc19zdXBwb3J0LmltYWdlW3RpbGluZ11bZm10X2ldLnJlZ3VsYXJfc3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtZW1fdHlwZV9yZXNfc3VwcG9ydC5pbWFnZVt0aWxpbmddW2ZtdF9pXS5zcGFyc2Vfc3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtZW1fdHlwZV9yZXNfc3VwcG9ydC5pbWFnZVt0aWxpbmddW2ZtdF9pXS50cmFuc2llbnRfc3VwcG9ydGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIFZrRm9ybWF0UHJvcGVydGllcyBmbXRfcHJvcHM7CisgICAgICAgICAgICAgICAgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMocGh5c19kZXZpY2UsIGZvcm1hdHNbZm10X2ldLCAmZm10X3Byb3BzKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRpbGluZyA9PSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCAmJiBmbXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICh0aWxpbmcgPT0gVktfSU1BR0VfVElMSU5HX0xJTkVBUiAmJiBmbXRfcHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtX3R5cGVfcmVzX3N1cHBvcnQuaW1hZ2VbdGlsaW5nXVtmbXRfaV0ucmVndWxhcl9zdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbWVtX3R5cGVfcmVzX3N1cHBvcnQuaW1hZ2VbdGlsaW5nXVtmbXRfaV0uc3BhcnNlX3N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtZW1fdHlwZV9yZXNfc3VwcG9ydC5pbWFnZVt0aWxpbmddW2ZtdF9pXS50cmFuc2llbnRfc3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IHVfaSA9IDA7IHVfaSA8IHVzYWdlcy5zaXplKCk7ICsrdV9pKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGZsZ19pID0gMDsgZmxnX2kgPCBmbGFnc3Muc2l6ZSgpOyArK2ZsZ19pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc3NbZmxnX2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVFlQRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHNbZm10X2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgsIDgsIDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWa0ltYWdlVGlsaW5nPih0aWxpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VzW3VfaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbWFnZV9jaS5mbGFncyAmIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlX2NpLnVzYWdlICYgVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VfY2kudXNhZ2UgPT0gMCB8fCAoaW1hZ2VfY2kudXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlX2NpLmZvcm1hdCA9PSBjb2xvcl9mb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2NpLnVzYWdlIHw9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfY2kudXNhZ2UgfD0gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLnNwYXJzZUJpbmRpbmcgJiYgKGltYWdlX2NpLmZsYWdzICYgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fdHlwZV9yZXNfc3VwcG9ydC5pbWFnZVt0aWxpbmddW2ZtdF9pXS5zcGFyc2Vfc3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGltZ19wcm9wczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMocGh5c19kZXZpY2UsIGltYWdlX2NpLmZvcm1hdCwgaW1hZ2VfY2kuaW1hZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9jaS50aWxpbmcsIGltYWdlX2NpLnVzYWdlLCBpbWFnZV9jaS5mbGFncywgJmltZ19wcm9wcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptZW10eXBlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cHBvcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZV9jaS5mbGFncyA9PSAwICYmICEoaW1hZ2VfY2kudXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtdHlwZXMgPSAmbWVtX3R5cGVfcmVzX3N1cHBvcnQuaW1hZ2VbdGlsaW5nXVtmbXRfaV0ucmVndWxhcl9tZW10eXBlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ID0gJm1lbV90eXBlX3Jlc19zdXBwb3J0LmltYWdlW3RpbGluZ11bZm10X2ldLnJlZ3VsYXJfc3VwcG9ydGVkOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaW1hZ2VfY2kuZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGltYWdlX2NpLnVzYWdlICYgVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXR5cGVzID0gJm1lbV90eXBlX3Jlc19zdXBwb3J0LmltYWdlW3RpbGluZ11bZm10X2ldLnNwYXJzZV9tZW10eXBlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ID0gJm1lbV90eXBlX3Jlc19zdXBwb3J0LmltYWdlW3RpbGluZ11bZm10X2ldLnNwYXJzZV9zdXBwb3J0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGltYWdlX2NpLmZsYWdzID09IDAgJiYgKGltYWdlX2NpLnVzYWdlICYgVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXR5cGVzID0gJm1lbV90eXBlX3Jlc19zdXBwb3J0LmltYWdlW3RpbGluZ11bZm10X2ldLnRyYW5zaWVudF9tZW10eXBlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ID0gJm1lbV90eXBlX3Jlc19zdXBwb3J0LmltYWdlW3RpbGluZ11bZm10X2ldLnRyYW5zaWVudF9zdXBwb3J0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IFZLX0VSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN1cHBvcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgRVJSX0VYSVQoZXJyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UgZHVtbXlfaW1nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHZrQ3JlYXRlSW1hZ2UoZGV2LCAmaW1hZ2VfY2ksIG51bGxwdHIsICZkdW1teV9pbWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIEVSUl9FWElUKGVycik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1fcmVxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2LCBkdW1teV9pbWcsICZtZW1fcmVxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWVtdHlwZXMgPSBtZW1fcmVxLm1lbW9yeVR5cGVCaXRzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmtEZXN0cm95SW1hZ2UoZGV2LCBkdW1teV9pbWcsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTWVtb3J5IC8vCisKKyAgICAgICAgc3RydWN0IFZrU3RydWN0dXJlSGVhZGVyICpzdHJ1Y3R1cmUgPSBOVUxMOworICAgICAgICBpZiAoaW5zdC5DaGVja0V4dGVuc2lvbkVuYWJsZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgc3RydWN0dXJlID0gKHN0cnVjdCBWa1N0cnVjdHVyZUhlYWRlciAqKW1lbW9yeV9wcm9wczIucE5leHQ7CisKKyAgICAgICAgICAgIHdoaWxlIChzdHJ1Y3R1cmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVCAmJgorICAgICAgICAgICAgICAgICAgICBDaGVja1BoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5jbHVkZWQoVktfRVhUX01FTU9SWV9CVURHRVRfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUICptZW1fYnVkZ2V0X3Byb3BzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCAqKXN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9NRU1PUllfSEVBUFM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEJ1ZGdldFtpXSA9IG1lbV9idWRnZXRfcHJvcHMtPmhlYXBCdWRnZXRbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFwVXNhZ2VbaV0gPSBtZW1fYnVkZ2V0X3Byb3BzLT5oZWFwVXNhZ2VbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgPSAoc3RydWN0IFZrU3RydWN0dXJlSGVhZGVyICopc3RydWN0dXJlLT5wTmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIGJ1ZmZlciAtIG1lbW9yeSB0eXBlIGNvbXBhdGliaWxpdHkKKworICAgICAgICBzdXBwb3J0ZWRfZm9ybWF0X3JhbmdlcyA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTdGFuZGFyZCBmb3JtYXRzIGluIFZ1bGthbiAxLjAKKyAgICAgICAgICAgICAgICBWS19NQUtFX1ZFUlNJT04oMSwgMCwgMCksCisgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICBWS19GT1JNQVRfQkVHSU5fUkFOR0UsCisgICAgICAgICAgICAgICAgVktfRk9STUFUX0VORF9SQU5HRSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gWUNCQ1IgZXh0ZW5zaW9uLCBzdGFuZGFyZCBpbiBWdWxrYW4gMS4xCisgICAgICAgICAgICAgICAgVktfTUFLRV9WRVJTSU9OKDEsIDEsIDApLAorICAgICAgICAgICAgICAgIFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STSwKKyAgICAgICAgICAgICAgICBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gUFZSVEMgZXh0ZW5zaW9uLCBub3Qgc3RhbmRhcmRpemVkCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBWS19JTUdfRk9STUFUX1BWUlRDX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9QVlJUQzFfMkJQUF9VTk9STV9CTE9DS19JTUcsCisgICAgICAgICAgICAgICAgVktfRk9STUFUX1BWUlRDMl80QlBQX1NSR0JfQkxPQ0tfSU1HLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfTsKKyAgICB9CisgICAgfkFwcEdwdSgpIHsKKyAgICAgICAgdmtEZXN0cm95RGV2aWNlKGRldiwgbnVsbHB0cik7CisKKyAgICAgICAgaWYgKGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIGZyZWVwTmV4dENoYWluKHN0YXRpY19jYXN0PFZrU3RydWN0dXJlSGVhZGVyICo+KGZlYXR1cmVzMi5wTmV4dCkpOworICAgICAgICAgICAgZnJlZXBOZXh0Q2hhaW4oc3RhdGljX2Nhc3Q8VmtTdHJ1Y3R1cmVIZWFkZXIgKj4ocHJvcHMyLnBOZXh0KSk7CisgICAgICAgICAgICBmcmVlcE5leHRDaGFpbihzdGF0aWNfY2FzdDxWa1N0cnVjdHVyZUhlYWRlciAqPihtZW1vcnlfcHJvcHMyLnBOZXh0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBcHBHcHUoY29uc3QgQXBwR3B1ICYpID0gZGVsZXRlOworICAgIGNvbnN0IEFwcEdwdSAmb3BlcmF0b3I9KGNvbnN0IEFwcEdwdSAmKSA9IGRlbGV0ZTsKKworICAgIGJvb2wgQ2hlY2tQaHlzaWNhbERldmljZUV4dGVuc2lvbkluY2x1ZGVkKHN0ZDo6c3RyaW5nIGV4dGVuc2lvbl90b19jaGVjaykgeworICAgICAgICBmb3IgKGF1dG8gJmV4dGVuc2lvbiA6IGRldmljZV9leHRlbnNpb25zKSB7CisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uX3RvX2NoZWNrID09IHN0ZDo6c3RyaW5nKGV4dGVuc2lvbi5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IEFwcEdldFBoeXNpY2FsRGV2aWNlTGF5ZXJFeHRlbnNpb25zKGNoYXIgKmxheWVyX25hbWUpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBleHRlbnNpb25fcHJvcGVydGllczsKKworICAgICAgICBWa1Jlc3VsdCBlcnI7CisgICAgICAgIHVpbnQzMl90IGV4dF9jb3VudCA9IDA7CisKKyAgICAgICAgLyogcmVwZWF0IGdldCB1bnRpbCBWS19JTkNPTVBMRVRFIGdvZXMgYXdheSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBlcnIgPSB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMocGh5c19kZXZpY2UsIGxheWVyX25hbWUsICZleHRfY291bnQsIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKGVycikgRVJSX0VYSVQoZXJyKTsKKworICAgICAgICAgICAgZXh0ZW5zaW9uX3Byb3BlcnRpZXMucmVzaXplKGV4dF9jb3VudCk7CisgICAgICAgICAgICBlcnIgPSB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMocGh5c19kZXZpY2UsIGxheWVyX25hbWUsICZleHRfY291bnQsIGV4dGVuc2lvbl9wcm9wZXJ0aWVzLmRhdGEoKSk7CisgICAgICAgICAgICBpZiAoZXJyKSBFUlJfRVhJVChlcnIpOworICAgICAgICAgICAgZXh0ZW5zaW9uX3Byb3BlcnRpZXMucmVzaXplKGV4dF9jb3VudCk7CisgICAgICAgIH0gd2hpbGUgKGVyciA9PSBWS19JTkNPTVBMRVRFKTsKKworICAgICAgICByZXR1cm4gZXh0ZW5zaW9uX3Byb3BlcnRpZXM7CisgICAgfQorCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZm9ybWF0IHJhbmdlIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgICAgYm9vbCBGb3JtYXRSYW5nZVN1cHBvcnRlZChGb3JtYXRSYW5nZSAmZm9ybWF0X3JhbmdlKSB7CisgICAgICAgIC8vIFRydWUgaWYgc3RhbmRhcmQgYW5kIHN1cHBvcnRlZCBieSBib3RoIHRoaXMgaW5zdGFuY2UgYW5kIHRoaXMgR1BVCisgICAgICAgIGlmIChmb3JtYXRfcmFuZ2UubWluaW11bV9pbnN0YW5jZV92ZXJzaW9uID4gMCAmJiBpbnN0Lmluc3RhbmNlX3ZlcnNpb24gPj0gZm9ybWF0X3JhbmdlLm1pbmltdW1faW5zdGFuY2VfdmVyc2lvbiAmJgorICAgICAgICAgICAgcHJvcHMuYXBpVmVyc2lvbiA+PSBmb3JtYXRfcmFuZ2UubWluaW11bV9pbnN0YW5jZV92ZXJzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRydWUgaWYgdGhpcyBleHRlbnNpb24gaXMgcHJlc2VudAorICAgICAgICBpZiAoZm9ybWF0X3JhbmdlLmV4dGVuc2lvbl9uYW1lICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChmb3JtYXRfcmFuZ2UuZXh0ZW5zaW9uX25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBub3Qgc3VwcG9ydGVkLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgR2V0RGV2aWNlUHJvcGVydGllcygpIHsKKyAgICAgICAgaWYgKGluc3QuQ2hlY2tFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wczIucHJvcGVydGllczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wczsKKyAgICAgICAgfQorICAgIH0KK307CitzdHJ1Y3QgQXBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzIHsKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyBwcm9wczsKKyAgICB1aW50MzJfdCBxdWV1ZV9pbmRleDsKKyAgICBib29sIGlzX3ByZXNlbnRfcGxhdGZvcm1fYWdub3N0aWMgPSB0cnVlOworICAgIFZrQm9vbDMyIHBsYXRmb3Jtc19zdXBwb3J0X3ByZXNlbnQgPSBWS19GQUxTRTsKKworICAgIEFwcFF1ZXVlRmFtaWx5UHJvcGVydGllcyhBcHBHcHUgJmdwdSwgdWludDMyX3QgcXVldWVfaW5kZXgpIDogcXVldWVfaW5kZXgocXVldWVfaW5kZXgpIHsKKyAgICAgICAgaWYgKGdwdS5pbnN0LkNoZWNrRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBwcm9wcyA9IGdwdS5xdWV1ZV9wcm9wczJbcXVldWVfaW5kZXhdLnF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3BzID0gZ3B1LnF1ZXVlX3Byb3BzW3F1ZXVlX2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byAmc3VyZmFjZV9leHQgOiBncHUuaW5zdC5zdXJmYWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIFZrUmVzdWx0IGVyciA9IHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihncHUucGh5c19kZXZpY2UsIHF1ZXVlX2luZGV4LCBzdXJmYWNlX2V4dC5zdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdXJmYWNlX2V4dC5zdXBwb3J0c19wcmVzZW50KTsKKyAgICAgICAgICAgIGlmIChlcnIpIEVSUl9FWElUKGVycik7CisKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgZmlyc3QgPSAoc3VyZmFjZV9leHQgPT0gZ3B1Lmluc3Quc3VyZmFjZV9leHRlbnNpb25zLmF0KDApKTsKKyAgICAgICAgICAgIGlmICghZmlyc3QgJiYgcGxhdGZvcm1zX3N1cHBvcnRfcHJlc2VudCAhPSBzdXJmYWNlX2V4dC5zdXBwb3J0c19wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgaXNfcHJlc2VudF9wbGF0Zm9ybV9hZ25vc3RpYyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgcGxhdGZvcm1zX3N1cHBvcnRfcHJlc2VudCA9IHN1cmZhY2VfZXh0LnN1cHBvcnRzX3ByZXNlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyAtLS0tLS0tLS0gRm9ybWF0IFByb3BlcnRpZXMgLS0tLS0tLS0tLS8vCisKK3N0cnVjdCBQcm9wRmxhZ3MgeworICAgIHVpbnQzMl90IGxpbmVhcjsKKyAgICB1aW50MzJfdCBvcHRpbWFsOworICAgIHVpbnQzMl90IGJ1ZmZlcjsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQcm9wRmxhZ3MgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobGluZWFyID09IG90aGVyLmxpbmVhciAmJiBvcHRpbWFsID09IG90aGVyLm9wdGltYWwgJiYgYnVmZmVyID09IG90aGVyLmJ1ZmZlcik7CisgICAgfQorfTsKKworbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8UHJvcEZsYWdzPiB7CisgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBQcm9wRmxhZ3MgJmspIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgoc3RkOjpoYXNoPHVpbnQzMl90PigpKGsubGluZWFyKSBeIChzdGQ6Omhhc2g8dWludDMyX3Q+KCkoay5vcHRpbWFsKSA8PCAxKSkgPj4gMSkgXgorICAgICAgICAgICAgICAgKHN0ZDo6aGFzaDx1aW50MzJfdD4oKShrLmJ1ZmZlcikgPDwgMSk7CisgICAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworLy8gVXNlZCB0byBzb3J0IHRoZSBmb3JtYXRzIGludG8gYnVja2V0cyBieSB0aGVpciBwcm9wZXJ0aWVzLgorc3RkOjp1bm9yZGVyZWRfbWFwPFByb3BGbGFncywgc3RkOjp2ZWN0b3I8VmtGb3JtYXQ+PiBGb3JtYXRQcm9wTWFwKEFwcEdwdSAmZ3B1KSB7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFByb3BGbGFncywgc3RkOjp2ZWN0b3I8VmtGb3JtYXQ+PiBtYXA7CisgICAgZm9yIChhdXRvIGZtdFJhbmdlIDogZ3B1LnN1cHBvcnRlZF9mb3JtYXRfcmFuZ2VzKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBmbXQgPSBmbXRSYW5nZS5maXJzdF9mb3JtYXQ7IGZtdCA8PSBmbXRSYW5nZS5sYXN0X2Zvcm1hdDsgKytmbXQpIHsKKyAgICAgICAgICAgIFZrRm9ybWF0UHJvcGVydGllcyBwcm9wczsKKyAgICAgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKGdwdS5waHlzX2RldmljZSwgc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KGZtdCksICZwcm9wcyk7CisKKyAgICAgICAgICAgIFByb3BGbGFncyBwZiA9IHtwcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcywgcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzLCBwcm9wcy5idWZmZXJGZWF0dXJlc307CisKKyAgICAgICAgICAgIG1hcFtwZl0ucHVzaF9iYWNrKHN0YXRpY19jYXN0PFZrRm9ybWF0PihmbXQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWFwOworfQorCitWa0Zvcm1hdFByb3BlcnRpZXMyIEdldEZvcm1hdFByb3BlcnRpZXMyKEFwcEdwdSAmZ3B1LCBWa0Zvcm1hdCBmb3JtYXQsIHBOZXh0Q2hhaW5JbmZvcyAmY2hhaW5JbmZvcykgeworICAgIFZrRm9ybWF0UHJvcGVydGllczIgcHJvcHM7CisgICAgcHJvcHMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yOworICAgIGJ1aWxkcE5leHRDaGFpbigoVmtTdHJ1Y3R1cmVIZWFkZXIgKikmcHJvcHMsIGNoYWluSW5mb3MuZm9ybWF0X3Byb3BlcnRpZXMyKTsKKworICAgIGdwdS5pbnN0LnZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUihncHUucGh5c19kZXZpY2UsIGZvcm1hdCwgJnByb3BzKTsKKyAgICByZXR1cm4gcHJvcHM7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy92dWxrYW5pbmZvL3Z1bGthbmluZm8ubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy92dWxrYW5pbmZvL3Z1bGthbmluZm8ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyNTU5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby5tZApAQCAtMCwwICsxLDc0IEBACis8IS0tIG1hcmtkb3dubGludC1kaXNhYmxlIE1EMDQxIC0tPgorPCEtLSBDb3B5cmlnaHQgMjAxNS0yMDE5IEx1bmFyRywgSW5jLiAtLT4KKworWyFbS2hyb25vcyBWdWxrYW5dWzFdXVsyXQorCitbMV06IGh0dHBzOi8vdnVsa2FuLmx1bmFyZy5jb20vaW1nL1Z1bGthbl8xMDBweF9EZWMxNi5wbmcgImh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8iCitbMl06IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8KKworWyFbQ3JlYXRpdmUgQ29tbW9uc11bM11dWzRdCisKK1szXTogaHR0cHM6Ly9pLmNyZWF0aXZlY29tbW9ucy5vcmcvbC9ieS1uZC80LjAvODh4MzEucG5nICJDcmVhdGl2ZSBDb21tb25zIExpY2Vuc2UiCitbNF06IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uZC80LjAvCisKKyMgVnVsa2FuIEluZm9ybWF0aW9uCisKK1Z1bGthbiBJbmZvIGlzIGEgcHJvZ3JhbSBwcm92aWRlZCBpbiB0aGUgU0RLIHdoaWNoIG91dHB1dHMgdmFyaW91cyB0eXBlcyBvZiBWdWxrYW4gaW5mb3JtYXRpb24gc3VjaCBhczoKKy0gZGV2aWNlIHByb3BlcnRpZXMgb2YgaWRlbnRpZmllZCBHUFVzCistIFZ1bGthbiBleHRlbnNpb25zIHN1cHBvcnRlZCBieSBlYWNoIEdQVQorLSByZWNvZ25pemVkIGxheWVycworLSBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0cyBhbmQgZm9ybWF0IHByb3BlcnRpZXMuCisKKyMjIFJ1bm5pbmcgVnVsa2FuIEluZm8KKworQWZ0ZXIgZG93bmxvYWRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIFNESyBhbmQgc2V0dGluZyB1cCB0aGUgcnVudGltZSBlbnZpcm9ubWVudCAoc2VlIHRoZSBbR2V0dGluZyBTdGFydGVkXSguL2dldHRpbmdfc3RhcnRlZC5tZCN1c2VyLWNvbnRlbnQtZG93bmxvYWQtdGhlLXNkaykgZG9jdW1lbnRhdGlvbikgeW91IHdpbGwgYmUgYWJsZSB0byBydW4gdGhlIFZ1bGthbiBJbmZvIHByb2dyYW0gZnJvbSBhIGNvbW1hbmQgcHJvbXB0LgorCitgYGAKK3Z1bGthbmluZm8KK2BgYAorCitFeGVjdXRpbmcgYHZ1bGthbmluZm9gIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBvdXRwdXQgd2lsbCBkZWZhdWx0IHRvIGh1bWFuLXJlYWRhYmxlIG91dHB1dCB0byB0aGUgY29uc29sZS4KKworYGBgCit2dWxrYW5pbmZvIC0taHRtbAorYGBgCisKK1RvIG9yZ2FuaXplIG91dHB1dCBpbiBhIGNvbnZlbmllbnQgSFRNTCBmb3JtYXQgdXNlIHRoZSBgLS1odG1sYCBvcHRpb24uIEV4ZWN1dGluZyBgdnVsa2FuaW5mb2Agd2l0aCB0aGUgYC0taHRtbGAgb3B0aW9uIHByb2R1Y2VzIGEgZmlsZSBjYWxsZWQgYHZ1bGthbmluZm8uaHRtbGAgYW5kIGNhbiBiZSBmb3VuZCBpbiB5b3VyIGJ1aWxkIGRpcmVjdG9yeS4KKworYGBgCit2dWxrYW5pbmZvIC0tanNvbgorYGBgCisKKyBVc2UgdGhlIGAtLWpzb25gIG9wdGlvbiB0byBwcm9kdWNlIFtEZXZTaW0tc2NoZW1hXShodHRwczovL3NjaGVtYS5raHJvbm9zLm9yZy92dWxrYW4vZGV2c2ltXzFfMF8wLmpzb24pLWNvbXBhdGlibGUgSlNPTiBvdXRwdXQgZm9yIHlvdXIgZGV2aWNlLiBBZGRpdGlvbmFsbHksIEpTT04gb3V0cHV0IGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgYC1qYCBvcHRpb24gYW5kIGZvciBtdWx0aS1HUFUgc3lzdGVtcywgYSBzaW5nbGUgR1BVIGNhbiBiZSB0YXJnZXRlZCB1c2luZyB0aGUgYC0tanNvbj1gKmBHUFUtbnVtYmVyYCogb3B0aW9uIHdoZXJlIHRoZSAqYEdQVS1udW1iZXJgKiBpbmRpY2F0ZXMgdGhlIEdQVSBvZiBpbnRlcmVzdCAoZS5nLiwgYC0tanNvbj0wYCkuIFRvIGRldGVybWluZSB0aGUgR1BVIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhciBHUFUsIGV4ZWN1dGUgYHZ1bGthbmluZm9gIHdpdGggdGhlIGAtLWh0bWxgIG9wdGlvbiAob3Igbm9uZSBhdCBhbGwpIGZpcnN0OyBkb2luZyBzbyB3aWxsIHN1bW1hcml6ZSBhbGwgR1BVcyBpbiB0aGUgc3lzdGVtLgorIFRoZSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhlIFtgVktfTEFZRVJfTFVOQVJHX2RldmljZV9zaW11bGF0aW9uYF0oLi9kZXZpY2Vfc2ltdWxhdGlvbl9sYXllci5odG1sKSBsYXllci4KKworCisgVXNlIHRoZSBgLS1oZWxwYCBvciBgLWhgIG9wdGlvbiB0byBwcm9kdWNlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIFZ1bGthbiBJbmZvIG9wdGlvbnMuCitgYGAKK3Z1bGthbmluZm8gLSBTdW1tYXJpemUgVnVsa2FuIGluZm9ybWF0aW9uIGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgorCitVU0FHRTogLi92dWxrYW5pbmZvIFtvcHRpb25zXQorCitPUFRJT05TOgorLWgsIC0taGVscCAgICAgICAgICAgIFByaW50IHRoaXMgaGVscC4KKy0taHRtbCAgICAgICAgICAgICAgICBQcm9kdWNlIGFuIGh0bWwgdmVyc2lvbiBvZiB2dWxrYW5pbmZvIG91dHB1dCwgc2F2ZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAidnVsa2FuaW5mby5odG1sIiBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21tYW5kIGlzCisgICAgICAgICAgICAgICAgICAgICAgcnVuLgorLWosIC0tanNvbiAgICAgICAgICAgIFByb2R1Y2UgYSBqc29uIHZlcnNpb24gb2YgdnVsa2FuaW5mbyBvdXRwdXQgdG8gc3RhbmRhcmQKKyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuCistLWpzb249PGdwdS1udW1iZXI+ICAgRm9yIGEgbXVsdGktZ3B1IHN5c3RlbSwgYSBzaW5nbGUgZ3B1IGNhbiBiZSB0YXJnZXR0ZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5aW5nIHRoZSBncHUtbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ3B1IG9mCisgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3QuIFRoaXMgbnVtYmVyIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHJ1bm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICB2dWxrYW5pbmZvIHdpdGhvdXQgYW55IG9wdGlvbnMgc3BlY2lmaWVkLgorLS1zaG93LWZvcm1hdHMgICAgICAgIERpc3BsYXkgdGhlIGZvcm1hdCBwcm9wZXJ0aWVzIG9mIGVhY2ggcGh5c2ljYWwgZGV2aWNlLgorICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCBodG1sIG9yIGpzb24gb3V0cHV0OworICAgICAgICAgICAgICAgICAgICAgIHRoZXkgd2lsbCBhbHdheXMgcHJpbnQgZm9ybWF0IHByb3BlcnRpZXMuCisKK2BgYAorCisjIyMgV2luZG93cworCitWdWxrYW4gSW5mbyBjYW4gYWxzbyBiZSBmb3VuZCBhcyBhIHNob3J0Y3V0IHVuZGVyIHRoZSBTdGFydCBNZW51LgorKiBgU3RhcnQgTWVudSAtPiBWdWxrYW4gU0RLYCpgdmVyc2lvbmAqYC0+IHZ1bGthbmluZm9gCisKK05vdGU6IEluIG9yZGVyIHRvIHJldmlldyBhbmQvb3Igc2F2ZSB0aGUgb3V0cHV0IHByb2R1Y2VkIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbyBleGVjdXRlIGB2dWxrYW5pbmZvYCB3aXRoIHRoZSBKU09OIG9wdGlvbiwgeW91IHdpbGwgaGF2ZSB0byByZWRpcmVjdCBvdXRwdXQgdG8gYSBmaWxlIGJ5IG1vZGlmeWluZyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbiB0aGUgZGVidWcgb3B0aW9ucy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby5yYyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM4MjRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby92dWxrYW5pbmZvLnJjCkBAIC0wLDAgKzEsOTggQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisvLyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorLy8gQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgTHVuYXJHLCBJbmMuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworLy8gQXV0aG9yOiBMZW5ueSBLb21vdyA8ZGF2aWRAbHVuYXJnLmNvbT4KKy8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN0YXJ0IGN1c3RvbWl6ZSBzZWN0aW9uCisvLyBFZGl0IHRoaXMgc2VjdGlvbiBmb3IgeW91ciBidWlsZAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFZFUlNJT05fTUFKT1IgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZFUlNJT05fTUlOT1IgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZFUlNJT05fUEFUQ0ggICAgICAgICAgICAgICAxMTExCisjZGVmaW5lIFZFUlNJT05fQlVJTEROTyAgICAgICAgICAgICAyMjIyCisKKyNkZWZpbmUgVkVSU0lPTl9CVUlMRF9ERVNDUklQVElPTiAgICJEZXYgQnVpbGQiCisKKy8vIEFsbCBidWlsZHMgZXhjZXB0IHJlbGVhc2UgYnVpbGRzIHNob3VsZCBzZXQgdGhpcyB0byAwLgorLy8gUmVsZWFzZSBidWlsZHMgc2hvdWxkIHNldCB0aGlzIHRvIDEuCisjZGVmaW5lIFZFUlNJT05fSVNfUkVMRUFTRUJVSUxEICAgICAgICAwCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRW5kIG9mIGN1c3RvbWl6ZSBzZWN0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpbmNsdWRlICJ3aW5yZXMuaCIKKworI2RlZmluZSBWRVJfRklMRV9WRVJTSU9OICAgICAgICAgICAgVkVSU0lPTl9NQUpPUiwgVkVSU0lPTl9NSU5PUiwgVkVSU0lPTl9QQVRDSCwgVkVSU0lPTl9CVUlMRE5PCisKKyNkZWZpbmUgU1RSSU5HSVpFMihzKSAjcworI2RlZmluZSBTVFJJTkdJWkUocykgU1RSSU5HSVpFMihzKQorCisjaWYgVkVSU0lPTl9JU19SRUxFQVNFQlVJTEQ9PTEKKyAgICNkZWZpbmUgVkVSX0ZJTEVfREVTQ1JJUFRJT05fU1RSICAgICJWdWxrYW4gSW5mbyIKKyAgICNkZWZpbmUgVkVSX0ZJTEVfVkVSU0lPTl9TVFIgICAgICAgIFNUUklOR0laRShWRVJTSU9OX01BSk9SKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iIFNUUklOR0laRShWRVJTSU9OX01JTk9SKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIgU1RSSU5HSVpFKFZFUlNJT05fUEFUQ0gpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiBTVFJJTkdJWkUoVkVSU0lPTl9CVUlMRE5PKQorI2Vsc2UKKyAgICNkZWZpbmUgVkVSX0ZJTEVfREVTQ1JJUFRJT05fU1RSICAgICJWdWxrYW4gSW5mbyAtICIgVkVSU0lPTl9CVUlMRF9ERVNDUklQVElPTgorICAgI2RlZmluZSBWRVJfRklMRV9WRVJTSU9OX1NUUiAgICAgICAgU1RSSU5HSVpFKFZFUlNJT05fTUFKT1IpICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIgU1RSSU5HSVpFKFZFUlNJT05fTUlOT1IpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiBTVFJJTkdJWkUoVkVSU0lPTl9QQVRDSCkgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iIFNUUklOR0laRShWRVJTSU9OX0JVSUxETk8pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIiBWRVJTSU9OX0JVSUxEX0RFU0NSSVBUSU9OCisjZW5kaWYKKworCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KKyBGSUxFVkVSU0lPTiBWRVJfRklMRV9WRVJTSU9OCisgUFJPRFVDVFZFUlNJT04gVkVSX0ZJTEVfVkVSU0lPTgorIEZJTEVGTEFHU01BU0sgMHgzZkwKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgVlNfRkZfREVCVUcKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorCisgRklMRU9TIDB4MDAwMDBMCisgRklMRVRZUEUgVkZUX0RMTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDAwMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCBWRVJfRklMRV9ERVNDUklQVElPTl9TVFIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsIFZFUl9GSUxFX1ZFUlNJT05fU1RSCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiVnVsa2FuIFJ1bnRpbWUiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCBWRVJfRklMRV9WRVJTSU9OX1NUUgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDAwMDAKKyAgICBFTkQKK0VORApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvdnVsa2FuaW5mby92dWxrYW5pbmZvLnZjeHByb2oudXNlciBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby52Y3hwcm9qLnVzZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTkxY2RkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3Z1bGthbmluZm8vdnVsa2FuaW5mby52Y3hwcm9qLnVzZXIKQEAgLTAsMCArMSwxMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPExvY2FsRGVidWdnZXJFbnZpcm9ubWVudD5WS19MQVlFUl9QQVRIPS4uXGxheWVyc1xEZWJ1ZzwvTG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PgorICAgIDxEZWJ1Z2dlckZsYXZvcj5XaW5kb3dzTG9jYWxEZWJ1Z2dlcjwvRGVidWdnZXJGbGF2b3I+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxMb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+VktfTEFZRVJfUEFUSD0uLlxsYXllcnNcUmVsZWFzZTwvTG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PgorICAgIDxEZWJ1Z2dlckZsYXZvcj5XaW5kb3dzTG9jYWxEZWJ1Z2dlcjwvRGVidWdnZXJGbGF2b3I+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3dpbmRvd3MtcnVudGltZS1pbnN0YWxsZXIvSW5zdGFsbGVyUlQubnNpIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvd2luZG93cy1ydW50aW1lLWluc3RhbGxlci9JbnN0YWxsZXJSVC5uc2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlNTU1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3dpbmRvd3MtcnVudGltZS1pbnN0YWxsZXIvSW5zdGFsbGVyUlQubnNpCkBAIC0wLDAgKzEsMTY1IEBACisjIFRoZSBWdWxrYW4gcnVudGltZSBpbnN0YWxsZXIgTlNJUyBzY3JpcHQKKworIWluY2x1ZGUgTG9naWNMaWIubnNoCisKKyMgSW5wdXQgZmlsZSBsb2NhdGlvbnMKKyFkZWZpbmUgUkVTICIuIgorCisjIElucHV0IHBhcmFtZXRlcnMKKyFpZm5kZWYgTUFKT1IKKyAgICAhZGVmaW5lIE1BSk9SICIxIgorICAgICFkZWZpbmUgTUlOT1IgIjEiCisgICAgIWRlZmluZSBQQVRDSCAiNzMiCisgICAgIWRlZmluZSBCVUlMRCAiMC5kZXYiCishZW5kaWYKKyFkZWZpbmUgVkVSU0lPTiAiJHtNQUpPUn0uJHtNSU5PUn0uJHtQQVRDSH0uJHtCVUlMRH0iCishaWZuZGVmIFBVQkxJU0hFUgorICAgICFkZWZpbmUgUFVCTElTSEVSICJZb3VyQ29tcGFueSwgSW5jLiIKKyFlbmRpZgorIWlmbmRlZiBDT1BZUklHSFQKKyAgICAhZGVmaW5lIENPUFlSSUdIVCAiIgorIWVuZGlmCisKKyMgSW5zdGFsbGVyIGluZm9ybWF0aW9uCitJY29uICR7UkVTfVxWLmljbworT3V0RmlsZSAiVnVsa2FuUlQtJHtWRVJTSU9OfS1JbnN0YWxsZXIuZXhlIgorSW5zdGFsbERpciAiJFBST0dSQU1GSUxFU1xWdWxrYW5SVCIKKworUmVxdWVzdEV4ZWN1dGlvbkxldmVsIGFkbWluCitBZGRCcmFuZGluZ0ltYWdlIGxlZnQgMTUwCitDYXB0aW9uICJWdWxrYW4gUnVudGltZSAke1ZFUlNJT059IFNldHVwIgorTmFtZSAiVnVsa2FuIFJ1bnRpbWUgJHtWRVJTSU9OfSIKK0xpY2Vuc2VEYXRhICIke1JFU31cVnVsa2FuUlQtTGljZW5zZS50eHQiCitQYWdlIGN1c3RvbSBicmFuZGltYWdlICIiICI6IEJyYW5kIEltYWdlIgorUGFnZSBsaWNlbnNlCitQYWdlIGluc3RmaWxlcworCitWSVByb2R1Y3RWZXJzaW9uICIke1ZFUlNJT059IgorVklBZGRWZXJzaW9uS2V5ICAiUHJvZHVjdE5hbWUiICJWdWxrYW4gUnVudGltZSIKK1ZJQWRkVmVyc2lvbktleSAgIkZpbGVWZXJzaW9uIiAiJHtWRVJTSU9OfSIKK1ZJQWRkVmVyc2lvbktleSAgIlByb2R1Y3RWZXJzaW9uIiAiJHtWRVJTSU9OfSIKK1ZJQWRkVmVyc2lvbktleSAgIkxlZ2FsQ29weXJpZ2h0IiAiJHtDT1BZUklHSFR9IgorVklBZGRWZXJzaW9uS2V5ICAiRmlsZURlc2NyaXB0aW9uIiAiVnVsa2FuIFJ1bnRpbWUgSW5zdGFsbGVyIgorCitGdW5jdGlvbiBicmFuZGltYWdlCisgIFNldE91dFBhdGggIiRURU1QIgorICBTZXRGaWxlQXR0cmlidXRlcyBWLmJtcCB0ZW1wb3JhcnkKKyAgRmlsZSAiJHtSRVN9XFYuYm1wIgorICBTZXRCcmFuZGluZ0ltYWdlICIkVEVNUC9WLmJtcCIKK0Z1bmN0aW9uZW5kCisKKyMgVXRpbHRpZXMgdG8gY2hlY2sgaWYgYSBmaWxlIGlzIG9sZGVyIHRoYW4gdGhpcyBpbnN0YWxsZXIgb3Igbm90CitGdW5jdGlvbiBOZWVkc1JlcGxhY2luZworICAgIFBvcCAkMAorCisgICAgIyBFeHRyYWN0IHRoZSB2ZXJzaW9uIG9mIHRoZSBleGlzdGluZyBmaWxlCisgICAgR2V0RGxsVmVyc2lvbiAiJDAiICRSMCAkUjEKKyAgICBJbnRPcCAkUjIgJFIwID4+IDE2CisgICAgSW50T3AgJFIyICRSMiAmIDB4ZmZmZgorICAgIEludE9wICRSMyAkUjAgJiAweGZmZmYKKyAgICBJbnRPcCAkUjQgJFIxID4+IDE2CisgICAgSW50T3AgJFI0ICRSNCAmIDB4ZmZmZgorICAgIEludE9wICRSNSAkUjEgJiAweGZmZmYKKworICAgICMgQ2hlY2sgbWFqb3IgdmVyc2lvbnMKKyAgICAke0lGfSAke01BSk9SfSA+ICRSMgorICAgICAgICBQdXNoIFRydWUKKyAgICAke0VMU0VJRn0gJHtNQUpPUn0gPCAkUjIKKyAgICAgICAgUHVzaCBGYWxzZQorCisgICAgIyBDaGVjayBtaW5vciB2ZXJzaW9ucworICAgICR7RUxTRUlGfSAke01JTk9SfSA+ICRSMworICAgICAgICBQdXNoIFRydWUKKyAgICAke0VMU0VJRn0gJHtNSU5PUn0gPCAkUjMKKyAgICAgICAgUHVzaCBGYWxzZQorCisgICAgIyBDaGVjayBwYXRjaCB2ZXJzaW9ucworICAgICR7RUxTRUlGfSAke1BBVENIfSA+ICRSNAorICAgICAgICBQdXNoIFRydWUKKyAgICAke0VMU0VJRn0gJHtQQVRDSH0gPCAkUjQKKyAgICAgICAgUHVzaCBGYWxzZQorCisgICAgIyBDaGVjayBidWlsZCB2ZXJzaW9ucworICAgICR7RUxTRUlGfSAke0JVSUxEfSA+ICRSNQorICAgICAgICBQdXNoIFRydWUKKyAgICAke0VMU0VJRn0gJHtCVUlMRH0gPCAkUjUKKyAgICAgICAgUHVzaCBGYWxzZQorCisgICAgIyBJZiB0aGV5IG1hdGNoIGV4YWN0bHksIHRoZW4gd2UgdXBkYXRlCisgICAgJHtFTFNFfQorICAgICAgICBQdXNoIFRydWUKKyAgICAke0VORElGfQorRnVuY3Rpb25FbmQKKworIW1hY3JvIEluc3RhbGxJZk5ld2VyIFNyY1BhdGggT3V0TmFtZQorICAgIFB1c2ggIiRPVVRESVJcJHtPdXROYW1lfSIKKyAgICBDYWxsIE5lZWRzUmVwbGFjaW5nCisgICAgUG9wICQwCisKKyAgICAke0lGfSAkMCA9PSBUcnVlCisgICAgICAgIERldGFpbFByaW50ICJGaWxlICRPVVRESVJcJHtPdXROYW1lfSAodmVyc2lvbiAkUjIuJFIzLiRSNC4kUjUpIHdpbGwgYmUgdXBncmFkZWQgdG8gJHtWRVJTSU9OfSIKKyAgICAgICAgRmlsZSAvb25hbWU9JHtPdXROYW1lfSAiJHtTcmNQYXRofSIKKyAgICAke0VMU0V9CisgICAgICAgIERldGFpbFByaW50ICJGaWxlICRPVVRESVJcJHtPdXROYW1lfSAodmVyc2lvbiAkUjIuJFIzLiRSNC4kUjUpIHdpbGwgbm90IGJlIHJlcGxhY2VkIHdpdGggJHtWRVJTSU9OfSIKKyAgICAke0VORElGfQorIW1hY3JvZW5kCisKKyMgVXRpbGl0aWVzIHRvIGNoZWNrIGlmIHRoaXMgaXMgYSA2NC1iaXQgT1Mgb3Igbm90CishZGVmaW5lIElzV293NjQgYCIiIElzV293NjQgIiJgCishbWFjcm8gX0lzV293NjQgX2EgX2IgX3QgX2YKKyAgIWluc2VydG1hY3JvIF9MT0dJQ0xJQl9URU1QCisgIFN5c3RlbTo6Q2FsbCBrZXJuZWwzMjo6R2V0Q3VycmVudFByb2Nlc3MoKXAucworICBTeXN0ZW06OkNhbGwga2VybmVsMzI6OklzV293NjRQcm9jZXNzKHBzLCppMHMpCisgIFBvcCAkX0xPR0lDTElCX1RFTVAKKyAgIWluc2VydG1hY3JvIF8hPSAkX0xPR0lDTElCX1RFTVAgMCBgJHtfdH1gIGAke19mfWAKKyFtYWNyb2VuZAorCishZGVmaW5lIFJ1bm5pbmdYNjQgYCIiIFJ1bm5pbmdYNjQgIiJgCishbWFjcm8gX1J1bm5pbmdYNjQgX2EgX2IgX3QgX2YKKyAgIWlmICR7TlNJU19QVFJfU0laRX0gPiA0CisgICAgIWluc2VydG1hY3JvIExvZ2ljTGliX0p1bXBUb0JyYW5jaCBgJHtfdH1gIGAke19mfWAKKyAgIWVsc2UKKyAgICAhaW5zZXJ0bWFjcm8gX0lzV293NjQgYCR7X2F9YCBgJHtfYn1gIGAke190fWAgYCR7X2Z9YAorICAhZW5kaWYKKyFtYWNyb2VuZAorCisjIEluc3RhbGxlcgorU2VjdGlvbgorICAgIERlbGV0ZSAiJElOU1RESVJcaW5zdGFsbC5sb2ciCisgICAgRGVsZXRlICIkSU5TVERJUlxWVUxLQU5SVF9MSUNFTlNFLnJ0ZiIKKyAgICBMb2dTZXQgb24KKworICAgICMgRGlzYWJsZSBmaWxlc3lzdGVtIHJlZGlyZWN0aW9uCisgICAgU3lzdGVtOjpDYWxsIGtlcm5lbDMyOjpXb3c2NEVuYWJsZVdvdzY0RnNSZWRpcmVjdGlvbihpMCkKKworICAgICR7SUZ9ICR7UnVubmluZ1g2NH0KKyAgICAgICAgU2V0T3V0UGF0aCAkV0lORElSXFN5c3RlbTMyCisgICAgICAgICFpbnNlcnRtYWNybyBJbnN0YWxsSWZOZXdlciAiJHtMT0FERVI2NH0iICJ2dWxrYW4tMS5kbGwiCisgICAgICAgICFpbnNlcnRtYWNybyBJbnN0YWxsSWZOZXdlciAiJHtMT0FERVI2NH0iICJ2dWxrYW4tMS05OTktMC0wLTAuZGxsIgorICAgICAgICAhaW5zZXJ0bWFjcm8gSW5zdGFsbElmTmV3ZXIgIiR7VlVMS0FOSU5GTzY0fSIgInZ1bGthbmluZm8uZXhlIgorICAgICAgICAhaW5zZXJ0bWFjcm8gSW5zdGFsbElmTmV3ZXIgIiR7VlVMS0FOSU5GTzY0fSIgInZ1bGthbmluZm8tMS05OTktMC0wLTAuZXhlIgorICAgICAgICBTZXRPdXRQYXRoICRXSU5ESVJcU3lzV09XNjQKKyAgICAke0VMU0V9CisgICAgICAgIFNldE91dFBhdGggJFdJTkRJUlxTeXN0ZW0zMgorICAgICR7RU5ESUZ9CisKKyAgICAjIEluc3RhbGwgMzItYml0IGNvbnRlbnRzCisgICAgIWluc2VydG1hY3JvIEluc3RhbGxJZk5ld2VyICIke0xPQURFUjMyfSIgInZ1bGthbi0xLmRsbCIKKyAgICAhaW5zZXJ0bWFjcm8gSW5zdGFsbElmTmV3ZXIgIiR7TE9BREVSMzJ9IiAidnVsa2FuLTEtOTk5LTAtMC0wLmRsbCIKKyAgICAhaW5zZXJ0bWFjcm8gSW5zdGFsbElmTmV3ZXIgIiR7VlVMS0FOSU5GTzMyfSIgInZ1bGthbmluZm8uZXhlIgorICAgICFpbnNlcnRtYWNybyBJbnN0YWxsSWZOZXdlciAiJHtWVUxLQU5JTkZPMzJ9IiAidnVsa2FuaW5mby0xLTk5OS0wLTAtMC5leGUiCisKKyAgICAjIER1bXAgbGljZW5zZXMgaW50byBhIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5CisgICAgU2V0T3V0UGF0aCAiJElOU1RESVIiCisgICAgQWNjZXNzQ29udHJvbDo6RGlzYWJsZUZpbGVJbmhlcml0YW5jZSAkSU5TVERJUgorICAgIEFjY2Vzc0NvbnRyb2w6OlNldEZpbGVPd25lciAkSU5TVERJUiAiQWRtaW5pc3RyYXRvcnMiCisgICAgQWNjZXNzQ29udHJvbDo6Q2xlYXJPbkZpbGUgICRJTlNURElSICJBZG1pbmlzdHJhdG9ycyIgIkZ1bGxBY2Nlc3MiCisgICAgQWNjZXNzQ29udHJvbDo6U2V0T25GaWxlICAgICRJTlNURElSICJTWVNURU0iICJGdWxsQWNjZXNzIgorICAgIEFjY2Vzc0NvbnRyb2w6OkdyYW50T25GaWxlICAkSU5TVERJUiAiRXZlcnlvbmUiICJMaXN0RGlyZWN0b3J5IgorICAgIEFjY2Vzc0NvbnRyb2w6OkdyYW50T25GaWxlICAkSU5TVERJUiAiRXZlcnlvbmUiICJHZW5lcmljRXhlY3V0ZSIKKyAgICBBY2Nlc3NDb250cm9sOjpHcmFudE9uRmlsZSAgJElOU1RESVIgIkV2ZXJ5b25lIiAiR2VuZXJpY1JlYWQiCisgICAgQWNjZXNzQ29udHJvbDo6R3JhbnRPbkZpbGUgICRJTlNURElSICJFdmVyeW9uZSIgIlJlYWRBdHRyaWJ1dGVzIgorICAgIEZpbGUgIiR7UkVTfVxWdWxrYW5SVC1MaWNlbnNlLnR4dCIKKworICAgIExvZ1NldCBvZmYKK1NlY3Rpb25FbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3dpbmRvd3MtcnVudGltZS1pbnN0YWxsZXIvTlNJU19TZWN1cml0eS5wYXRjaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3dpbmRvd3MtcnVudGltZS1pbnN0YWxsZXIvTlNJU19TZWN1cml0eS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjc1YWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi10b29scy9zcmMvd2luZG93cy1ydW50aW1lLWluc3RhbGxlci9OU0lTX1NlY3VyaXR5LnBhdGNoCkBAIC0wLDAgKzEsNTggQEAKK2RpZmYgLS1naXQgYS9uc2lzLTMuMGIzLXNyYy9TQ29ucy9Db25maWcvbXMgYi9uc2lzLTMuMGIzLXNyYy9TQ29ucy9Db25maWcvbXMKK2luZGV4IDMyZDNkMzMuLmQyYzRkMjUgMTAwNjQ0CistLS0gYS9uc2lzLTMuMGIzLXNyYy9TQ29ucy9Db25maWcvbXMKKysrKyBiL25zaXMtMy4wYjMtc3JjL1NDb25zL0NvbmZpZy9tcworQEAgLTE2LDcgKzE2LDcgQEAgZGVmIGVudHJ5KHgsdSk6CisgCisgZGVmZW52WydFTlRSWV9GTEFHJ10gPSBlbnRyeQorIGRlZmVudlsnTUFQX0ZMQUcnXSA9ICcvbWFwJworLWRlZmVudlsnTk9ERUZMSUJTX0ZMQUcnXSA9ICcvTk9ERUZBVUxUTElCJworKyNkZWZlbnZbJ05PREVGTElCU19GTEFHJ10gPSAnL05PREVGQVVMVExJQicKKyBkZWZlbnZbJ0NfRkxBRyddID0gJy9UQycKKyBkZWZlbnZbJ0NQUF9GTEFHJ10gPSAnL1RQJworIGRlZmVudlsnQ1BQX1JFUVVJUkVTX1NURExJQiddID0gMAorQEAgLTI5LDcgKzI5LDcgQEAgZGVmZW52WydTVERDQUxMJ10gPSAnX19zdGRjYWxsJworIG1zdnNfdmVyc2lvbiA9IGZsb2F0KGRlZmVudlsnTVNWU19WRVJTSU9OJ10ucmVwbGFjZSgnRXhwJywnJykpCisgaWYgbXN2c192ZXJzaW9uID49IDguMDoKKyAJZGVmZW52WydFWENFUFRJT05fRkxBRyddID0gJy9FSHNjJworLQlkZWZlbnYuQXBwZW5kKENDRkxBR1MgPSBbJy9HUy0nXSkKKysJZGVmZW52LkFwcGVuZChDQ0ZMQUdTID0gWycvR1MnXSkKKyAJZGVmZW52LkFwcGVuZChDUFBERUZJTkVTID0gWydfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUycsICdfQ1JUX05PTlNURENfTk9fV0FSTklOR1MnLCAnX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFJywgJ19DUlRfTk9OX0NPTkZPUk1JTkdfU1dQUklOVEZTJ10pCisgCWRlZmVudlsnTVNWQ1JUX0ZMQUcnXSA9ICcvTVQnICMgQXZvaWQgbXN2Y3I/MC5kbGwgZGVwZW5kZW5jeQorIGVsc2U6CitAQCAtNDMsNiArNDMsMTAgQEAgaWYgbXN2c192ZXJzaW9uID49IDExLjA6CisgCWRlZmVudlsnU1VCU1lTX0NPTiddID0gJy9zdWJzeXN0ZW06Y29uc29sZSw1LjAxJyAjIHN1cHBvcnQgd2luZG93cyB4cAorIAlkZWZlbnZbJ1NVQlNZU19XSU4nXSA9ICcvc3Vic3lzdGVtOndpbmRvd3MsNS4wMScgIyBzdXBwb3J0IHdpbmRvd3MgeHAKKyAKKytpZiBtc3ZzX3ZlcnNpb24gPj0gMTQuMDoKKysJZGVmZW52LkFwcGVuZChDQ0ZMQUdTID0gWycvZ3VhcmQ6Y2YnXSkKKysJZGVmZW52LkFwcGVuZChMSU5LRkxBR1MgPSBbJy9ndWFyZDpjZiddKQorKworICMjIyBkZWZpbmVzCisgCisgZGVmZW52LkFwcGVuZChDUFBERUZJTkVTID0gWygnTlNJU0NBTEwnLCAnJFNURENBTEwnKV0pCitAQCAtMTQzLDkgKzE0Nyw5IEBAIHN0dWJfZW52LkFwcGVuZChDQ0ZMQUdTID0gWycvRmEke1RBUkdFVH0ubHN0J10pICAgICMgbGlzdGluZyBmaWxlIG5hbWUKKyBzdHViX2Vudi5BcHBlbmQoTElOS0ZMQUdTID0gWyckTk9ERUZMSUJTX0ZMQUcnXSkgICAjIG5vIGRlZmF1bHQgbGlicmFyaWVzCisgc3R1Yl9lbnYuQXBwZW5kKExJTktGTEFHUyA9IFsnJE1BUF9GTEFHJ10pICAgICAgICAgIyBnZW5lcmF0ZSBtYXAgZmlsZQorIAorLWlmIG1zdnNfdmVyc2lvbiA+PSAxMC4wOgorLQkjIG5vIHJlbG9jYXRpb25zIHRoYXQgb3VyIHJlc291cmNlIGVkaXRvciBpZ25vcmVzCistCXN0dWJfZW52LkFwcGVuZChMSU5LRkxBR1MgPSBbJy9GSVhFRCddKQorKyNpZiBtc3ZzX3ZlcnNpb24gPj0gMTAuMDoKKysjCSMgbm8gcmVsb2NhdGlvbnMgdGhhdCBvdXIgcmVzb3VyY2UgZWRpdG9yIGlnbm9yZXMKKysjCXN0dWJfZW52LkFwcGVuZChMSU5LRkxBR1MgPSBbJy9GSVhFRCddKQorIAorIHN0dWJfdWVudiA9IHN0dWJfZW52LkNsb25lKCkKKyBzdHViX3VlbnYuQXBwZW5kKENQUERFRklORVMgPSBbJ19VTklDT0RFJywgJ1VOSUNPREUnXSkKK2RpZmYgLS1naXQgYS9uc2lzLTMuMGIzLXNyYy9Tb3VyY2UvZXhlaGVhZC9NYWluLmMgYi9uc2lzLTMuMGIzLXNyYy9Tb3VyY2UvZXhlaGVhZC9NYWluLmMKK2luZGV4IGViMjMxZTcuLmU0NjQyY2UgMTAwNjQ0CistLS0gYS9uc2lzLTMuMGIzLXNyYy9Tb3VyY2UvZXhlaGVhZC9NYWluLmMKKysrKyBiL25zaXMtMy4wYjMtc3JjL1NvdXJjZS9leGVoZWFkL01haW4uYworQEAgLTg0LDYgKzg0LDcgQEAgdm9pZCAqZ19TSEdldEZvbGRlclBhdGg7CisgTlNJU19FTlRSWVBPSU5UX0dVSU5PQ1JUCisgRVhURVJOX0Mgdm9pZCBOU0lTV2luTWFpbk5PQ1JUKCkKKyB7CisrICBfX3NlY3VyaXR5X2luaXRfY29va2llKCk7CisgICBpbnQgcmV0ID0gMDsKKyAgIGNvbnN0IFRDSEFSICptX0VyciA9IF9MQU5HX0VSUk9SV1JJVElOR1RFTVA7CisgCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy93aW5kb3dzLXJ1bnRpbWUtaW5zdGFsbGVyL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3dpbmRvd3MtcnVudGltZS1pbnN0YWxsZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGQ1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy93aW5kb3dzLXJ1bnRpbWUtaW5zdGFsbGVyL1JFQURNRS5tZApAQCAtMCwwICsxLDM4IEBACisKKyMjIFdpbmRvd3MgUnVudGltZSBJbnN0YWxsZXIKKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGZpbGVzIHJlcXVpcmVkIGZvciBidWlsZGluZyB0aGUgV2luZG93cyBWdWxrYW4gUnVudGltZSBJbnN0YWxsZXIgcGFja2FnZS4KK1RoZSBydW50aW1lIGluc3RhbGxlciBpcyBhIG1ldGhvZCBvZiBkZWxpdmVyaW5nIGEgVnVsa2FuIGxvYWRlciB0byBzeXN0ZW0uCitUaGUgcnVudGltZSBpbnN0YWxsZXIgaXMgdXNlZCBieSB0aGUgU0RLIGluc3RhbGxlci4KK0l0IGlzIGFsc28gdXNlZCBieSBzb21lIGRyaXZlcnMgdG8gZW5zdXJlIHRoYXQgYW4gYWRlcXVhdGUgVnVsa2FuIGxvYWRlciBpcyBpbnN0YWxsZWQgb24gYSBzeXN0ZW0uCitBZGRpdGlvbmFsbHksIGFwcGxpY2F0aW9ucyBtYXkgaW5zdGFsbCBhIHJ1bnRpbWUgdG8gZW5zdXJlIHRoYXQgYSBtaW5pbXVtIGxvYWRlciB2ZXJzaW9uIGlzIHByZXNlbnQuCisKK1RvIGJ1aWxkIGEgcnVudGltZSBpbnN0YWxsZXI6CisxLiBHZXQgYSBjb3B5IG9mIHRoZSBOdWxsc29mdCBJbnN0YWxsIFN5c3RlbSAoTlNJUykgdmVyc2lvbiAzLjBiMy4KKyAgIE90aGVyIHZlcnNpb25zIG1heSB3b3JrLCBidXQgdGhlIHBhdGNoIGluY2x1ZGVkIGluIHRoaXMgZGlyZWN0b3J5IGlzIGJ1aWx0IGFnYWluc3QgdmVyc2lvbiAzLjBiMy4KKyAgIEFwcGx5IHRoZSBgTlNJU19TZWN1cml0eS5wYXRjaGAgZmlsZSBwcm92aWRlZCBpbiB0aGlzIGRpcmVjdG9yeSB0byB0aGUgTlNJUyBzb3VyY2UgY29kZS4KKyAgIFRoaXMgc2VjdXJpdHkgcGF0Y2ggYWRkcyB0aGUgL0RZTkFNSUNCQVNFIC9HUywgYW5kIC9ndWFyZDpjZiBvcHRpb25zIHRvIHRoZSBidWlsZC4KKyAgIEluIGFkZGl0aW9uLCBpdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IE5TSVNfQ09ORklHX0xPRz15ZXMgYW5kIE5TSVNfTUFYX1NUUkxFTj04MTkyIHdoZW4gY29tcGlsaW5nLgorICAgT25jZSB5b3UgaGF2ZSBhcHBsaWVkIHRoZSBwYXRjaCwgY29tcGlsZSBOU0lTIHdpdGggdGhlIGNvbW1hbmQ6CisgICAgYGBgCisgICAgc2NvbnMgU0tJUFVUSUxTPSJOU0lTIE1lbnUiLCJNYWtlTGFuZ0lkIiBVTklDT0RFPXllcyBcCisgICAgICAgIFpMSUJfVzMyPTxwYXRoX3RvX3psaWI+XHpsaWItMS4yLjctd2luMzIteDg2IE5TSVNfTUFYX1NUUkxFTj04MTkyIFwKKyAgICAgICAgTlNJU19DT05GSUdfTE9HPXllcyBOU0lTX0NPTkZJR19MT0dfVElNRVNUQU1QPXllcyBcCisgICAgICAgIEFQUEVORF9DQ0ZMQUdTPSIvRFlOQU1JQ0JBU0UgL1ppIiBBUFBFTkRfTElOS0ZMQUdTPSIvRFlOQU1JQ0JBU0UgXAorICAgICAgICAvREVCVUcgL09QVDpSRUYgL09QVDpJQ0YiIFNLSVBET0M9YWxsIGRpc3QtemlwCisgICAgYGBgCisKKzIuIFRoZSBjb21waWxhdGlvbiBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgemlwIGZpbGUgY29udGFpbmluZyB0aGUgbmV3IE5TSVMgYnVpbGQuCisgICBVbnppcCB0aGlzIGZpbGUgdG8gdGhlIGxvY2F0aW9uIG9mIHlvdXIgY2hvb3NpbmcuCisgICBEb3dubG9hZCB0aGUgTlNJUyBBY2Nlc3MgQ29udHJvbCBwbHVnaW4gaW4gY29weSBpdCBpbnRvIHRoZSBwbHVnaW4gZGlyZWN0b3J5IGluIHRoZSBidWlsZCB5b3UganVzdCB1bnppcHBlZC4KKyAgIEl0IG1heSBiZSB1c2VmdWwgdG8gcHJlcGVuZCB0aGlzIE5TSVMgYmluYXJ5IGRpcmVjdG9yeSB0byB5b3VyIHN5c3RlbSdzIHBhdGgsIHNvIHRoYXQgdGhpcyBOU0lTIHdpbGwgYmUgcnVuIHdoZW4geW91IHR5cGUgIm1ha2Vuc2lzIi4KKyAgIE90aGVyd2lzZSwgeW91IHdpbGwganVzdCBoYXZlIHRvIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCB0byBtYWtlbnNpcy5leGUgaW4gdGhlIGZvbGxvd2luZyBzdGVwcy4KKyAgIEl0IG1heSBiZSB1c2VmdWwgdG8gdmVyaWZ5IHRoYXQgYWxsIHNoYXJlZCBsaWJyYXJpZXMgaW4gdGhlIGJ1aWxkIGhhdmUgdGhlIERZTkFNSUNfQkFTRSBhbmQgTlhfQ09NUEFUIGZsYWdzIHNldC4KKworMy4gQnVpbGQgdGhlIFZ1bGthbi1Mb2FkZXIgcmVwb3NpdG9yeSBhbmQgdGhpcyBvbmUuCisKKzQuIEJ1aWxkIHRoZSBydW50aW1lIGluc3RhbGxlciBmcm9tIHRoaXMgZGlyZWN0b3J5IHdpdGggdGhlIGNvbW1hbmQ6CisgICBgYGAKKyAgIG1ha2Vuc2lzIEluc3RhbGxlclJULm5zaSAtRExPQURFUjY0PSI/IiAtRExPQURFUjMyPSI/IiAtRFZVTEtBTklORk82ND0iPyIgLURWVUxLQU5JTkZPMzI9Ij8iCisgICBgYGAKKyAgIHdoZXJlIHRoZSBxdWVzdGlvbiBtYXJrcyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgNjQgYW5kIDMyIGJpdCB2ZXJzaW9ucyBvZiB0aGUgbG9hZGVyIGFuZCB2dWxrYW5pbmZvIGJ1aWxkcy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3dpbmRvd3MtcnVudGltZS1pbnN0YWxsZXIvVi5ibXAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy93aW5kb3dzLXJ1bnRpbWUtaW5zdGFsbGVyL1YuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTMzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy93aW5kb3dzLXJ1bnRpbWUtaW5zdGFsbGVyL1YuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3dpbmRvd3MtcnVudGltZS1pbnN0YWxsZXIvVi5pY28gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy93aW5kb3dzLXJ1bnRpbWUtaW5zdGFsbGVyL1YuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTY2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy93aW5kb3dzLXJ1bnRpbWUtaW5zdGFsbGVyL1YuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdG9vbHMvc3JjL3dpbmRvd3MtcnVudGltZS1pbnN0YWxsZXIvVnVsa2FuUlQtTGljZW5zZS50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy93aW5kb3dzLXJ1bnRpbWUtaW5zdGFsbGVyL1Z1bGthblJULUxpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDBkODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXRvb2xzL3NyYy93aW5kb3dzLXJ1bnRpbWUtaW5zdGFsbGVyL1Z1bGthblJULUxpY2Vuc2UudHh0CkBAIC0wLDAgKzEsNzEgQEAKK0NvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KK0NvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Cit1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhcyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZQordGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVW5sZXNzIG90aGVyd2lzZSBub3RlZCBpbiB0aGUgTElDRU5TRS50eHQgZmlsZSBpbiB0aGUgaW5zdGFsbCBmb2xkZXIsIGFsbAorY29tcG9uZW50cyBvZiB0aGUgVnVsa2FuIFJ1bnRpbWUgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBhYm92ZSBsaWNlbnNlLgorTGljZW5zZXMgZm9yIGFueSBjb21wb25lbnRzIG5vdCBzbyBsaWNlbnNlZCBhcmUgbGlzdGVkIGluIHRoZSBMSUNFTlNFLnR4dAorZmlsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29weXJpZ2h0IChjKSAyMDA5IERhdmUgR2FtYmxlCitDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCitDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5cmlnaHQgKGMpIDIwMTQgam9zZXBoIHdlcmxlIDxqb3NlcGgud2VybGVAZ21haWwuY29tPgorQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KK0NvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiTWF0ZXJpYWxzIiksIHRvCitkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKK3JpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisKK1RIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKworSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCitEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKK09USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBNQVRFUklBTFMgT1IgVEhFCitVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjLy5hcHB2ZXlvci55bWwgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy8uYXBwdmV5b3IueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkN2Q1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy8uYXBwdmV5b3IueW1sCkBAIC0wLDAgKzEsODIgQEAKKyMgV2luZG93cyBCdWlsZCBDb25maWd1cmF0aW9uIGZvciBBcHBWZXlvcgorIyBodHRwOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2FwcHZleW9yLXltbAorIworCisjIFRoaXMgdmVyc2lvbiBzdGFydHMgYSBzZXBhcnRlIGpvYiBmb3IgZWFjaCBwbGF0Zm9ybSBjb25maWcKKyMgaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGUgQXBwVmV5b3IgbGltaXQgb2YgNjAgbWlucyBwZXIgam9iLgorCisjIGJ1aWxkIHZlcnNpb24gZm9ybWF0Cit2ZXJzaW9uOiAie2J1aWxkfSIKKworIyBGcmVlIGFjY291bnRzIGhhdmUgYSBtYXggb2YgMSwgYnV0IGFzayBhbnl3YXkuCittYXhfam9iczogNAorCitvczoKKyAgLSBWaXN1YWwgU3R1ZGlvIDIwMTUKKworaW5pdDoKKyAgLSBnaXQgY29uZmlnIC0tZ2xvYmFsIGNvcmUuYXV0b2NybGYgdHJ1ZQorCitlbnZpcm9ubWVudDoKKyAgUFlUSE9OX1BBVEg6ICJDOi9QeXRob24zNSIKKyAgUFlUSE9OX1BBQ0tBR0VfUEFUSDogIkM6L1B5dGhvbjM1L1NjcmlwdHMiCisgIENNQUtFX1VSTDogImh0dHA6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLXdpbjY0LXg2NC56aXAiCisKK2JyYW5jaGVzOgorICBvbmx5OgorICAgIC0gbWFzdGVyCisKK2luc3RhbGw6CisgIC0gYXBwdmV5b3IgRG93bmxvYWRGaWxlICVDTUFLRV9VUkwlIC1GaWxlTmFtZSBjbWFrZS56aXAKKyAgLSA3eiB4IGNtYWtlLnppcCAtb0M6XGNtYWtlID4gbnVsCisgIC0gc2V0IHBhdGg9QzpcY21ha2VcYmluOyVwYXRoJQorICAtIGNtYWtlIC0tdmVyc2lvbgorCitiZWZvcmVfYnVpbGQ6CisgIC0gIlNFVCBQQVRIPUM6XFxQeXRob24zNTtDOlxcUHl0aG9uMzVcXFNjcmlwdHM7JVBBVEglIgorICAtIGVjaG8uCisgIC0gZWNobyBTdGFydGluZyBidWlsZCBmb3IgJUFQUFZFWU9SX1JFUE9fTkFNRSUgaW4gJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKyAgIyBHZW5lcmF0ZSBidWlsZCBmaWxlcyB1c2luZyBDTWFrZSBmb3IgdGhlIGJ1aWxkIHN0ZXAuCisgIC0gZWNobyBGZXRjaGluZyBnb29nbGV0ZXN0IGV4dGVybmFsIGRlcGVuZGVuY2llcyBmb3IgYnVpbGRpbmcgdmFsaWRhdGlvbiBsYXllciB0ZXN0cworICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xldGVzdC5naXQgZXh0ZXJuYWwvZ29vZ2xldGVzdAorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlL2V4dGVybmFsL2dvb2dsZXRlc3QKKyAgLSBnaXQgY2hlY2tvdXQgdGFncy9yZWxlYXNlLTEuOC4xCisgIC0gY2QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKyAgLSBweXRob24gc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLWRpcj1leHRlcm5hbCAtLWFyY2g9JVBMQVRGT1JNJSAtLWNvbmZpZz0lQ09ORklHVVJBVElPTiUKKyAgLSBlY2hvIFZlcmlmeWluZyBjb25zaXN0ZW5jeSBiZXR3ZWVuIHNvdXJjZSBmaWxlIGdlbmVyYXRvcnMgYW5kIG91dHB1dAorICAtIHB5dGhvbiBzY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weSAtLXZlcmlmeSBleHRlcm5hbC9WdWxrYW4tSGVhZGVycy9yZWdpc3RyeQorICAtIGVjaG8gR2VuZXJhdGluZyBWdWxrYW4tVmFsaWRhdGlvbkxheWVycyBDTWFrZSBmaWxlcyBmb3IgJVBMQVRGT1JNJSAlQ09ORklHVVJBVElPTiUKKyAgLSBta2RpciBidWlsZAorICAtIGNkIGJ1aWxkCisgIC0gY21ha2UgLUEgJVBMQVRGT1JNJSAtQy4uL2V4dGVybmFsL2hlbHBlci5jbWFrZSAtLWNvbmZpZyAlQ09ORklHVVJBVElPTiUgLi4KKyAgLSBlY2hvIEJ1aWxkaW5nIHBsYXRmb3JtPSVQTEFURk9STSUgY29uZmlndXJhdGlvbj0lQ09ORklHVVJBVElPTiUKKyAgLSBta2RpciBsYXllcnNcJUNPTkZJR1VSQVRJT04lCisgIC0gcHl0aG9uIC4uL3NjcmlwdHMvdmtfdmFsaWRhdGlvbl9zdGF0cy5weSAuLi9leHRlcm5hbC9WdWxrYW4tSGVhZGVycy9yZWdpc3RyeS92YWxpZHVzYWdlLmpzb24gLXRleHQgbGF5ZXJzLyVDT05GSUdVUkFUSU9OJS92dWlkX2NvdmVyYWdlX2RhdGFiYXNlLnR4dAorCitwbGF0Zm9ybToKKyAgLSBXaW4zMgorICAtIHg2NAorCitjb25maWd1cmF0aW9uOgorICAtIFJlbGVhc2UKKyAgLSBEZWJ1ZworCisjIEJ1aWxkIG9ubHkgeDY0IFJlbGVhc2UgYW5kIFdpbjMyKHg4NikgRGVidWcgdG8gcmVkdWNlIGJ1aWxkIHRpbWUuCisjIFRoaXMgc2hvdWxkIHN0aWxsIHByb3ZpZGUgYWRlcXVhdGUgMzItYml0IHZzIDY0LWJpdCBhbmQKKyMgUmVsZWFzZSB2cyBEZWJ1ZyBjb3ZlcmFnZS4KK21hdHJpeDoKKyAgZXhjbHVkZToKKyAgICAtIGNvbmZpZ3VyYXRpb246IFJlbGVhc2UKKyAgICAgIHBsYXRmb3JtOiBXaW4zMgorICAgIC0gY29uZmlndXJhdGlvbjogRGVidWcKKyAgICAgIHBsYXRmb3JtOiB4NjQKKworYnVpbGQ6CisgIHBhcmFsbGVsOiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlbmFibGUgTVNCdWlsZCBwYXJhbGxlbCBidWlsZHMKKyAgcHJvamVjdDogYnVpbGQvVnVsa2FuLVZhbGlkYXRpb25MYXllcnMuc2xuICAjIHBhdGggdG8gVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBvciBwcm9qZWN0CisgIHZlcmJvc2l0eTogcXVpZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBxdWlldHxtaW5pbWFsfG5vcm1hbHxkZXRhaWxlZAorCithcnRpZmFjdHM6CisgIC0gcGF0aDogYnVpbGRcbGF5ZXJzXCQoY29uZmlndXJhdGlvbikKKyAgICBuYW1lOiBWdWxrYW4tVmFsaWRhdGlvbkxheWVycy0kKHBsYXRmb3JtKS0kKGNvbmZpZ3VyYXRpb24pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy8uY2xhbmctZm9ybWF0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTM1MjdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDggQEAKKy0tLQorIyBVc2UgZGVmYXVsdHMgZnJvbSB0aGUgR29vZ2xlIHN0eWxlIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorQmFzZWRPblN0eWxlOiBHb29nbGUKK0luZGVudFdpZHRoOiA0CitBY2Nlc3NNb2RpZmllck9mZnNldDogLTIKK0NvbHVtbkxpbWl0OiAxMzIKK1NvcnRJbmNsdWRlczogZmFsc2UKKy4uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvLmduIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvLmduCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTAyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy8uZ24KQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTkgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitidWlsZGNvbmZpZyA9ICIvL2J1aWxkL2NvbmZpZy9CVUlMRENPTkZJRy5nbiIKK3NlY29uZGFyeV9zb3VyY2UgPSAiLy9idWlsZC1nbi9zZWNvbmRhcnkvIgorCitkZWZhdWx0X2FyZ3MgPSB7CisgICAgY2xhbmdfdXNlX2Nocm9tZV9wbHVnaW5zID0gZmFsc2UKKyAgICB1c2VfY3VzdG9tX2xpYmN4eCA9IGZhbHNlCit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjLy50cmF2aXMueW1sIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvLnRyYXZpcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4ZDUzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMjE1IEBACisjIEJ1aWxkIENvbmZpZ3VyYXRpb24gZm9yIFRyYXZpcyBDSQorIyBodHRwczovL3RyYXZpcy1jaS5vcmcKKworZGlzdDogeGVuaWFsCitzdWRvOiByZXF1aXJlZAorbGFuZ3VhZ2U6IGNwcAorCittYXRyaXg6CisgICMgU2hvdyBmaW5hbCBzdGF0dXMgaW1tZWRpYXRlbHkgaWYgYSB0ZXN0IGZhaWxzLgorICBmYXN0X2ZpbmlzaDogdHJ1ZQorICBhbGxvd19mYWlsdXJlczoKKyAgICAtIGVudjogQ0hFQ0tfQ09NTUlUX0ZPUk1BVD1PTgorICAgIC0gZW52OiBWVUxLQU5fQlVJTERfVEFSR0VUPUdOCisgIGluY2x1ZGU6CisgICAgIyBBbmRyb2lkIGJ1aWxkLgorICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogZ2NjCisgICAgICBlbnY6IFZVTEtBTl9CVUlMRF9UQVJHRVQ9QU5EUk9JRCBBTkRST0lEX1RBUkdFVD1hbmRyb2lkLTI2IEFORFJPSURfQUJJPWFybWVhYmktdjdhCisgICAgIyBBbmRyb2lkIDY0LWJpdCBidWlsZC4KKyAgICAtIG9zOiBsaW51eAorICAgICAgY29tcGlsZXI6IGdjYworICAgICAgZW52OiBWVUxLQU5fQlVJTERfVEFSR0VUPUFORFJPSUQgQU5EUk9JRF9UQVJHRVQ9YW5kcm9pZC0yNiBBTkRST0lEX0FCST1hcm02NC12OGEKKyAgICAjIExpbnV4IEdDQyBkZWJ1ZyBidWlsZC4KKyAgICAtIG9zOiBsaW51eAorICAgICAgY29tcGlsZXI6IGdjYworICAgICAgZW52OiBWVUxLQU5fQlVJTERfVEFSR0VUPUxJTlVYCisgICAgIyBMaW51eCBjbGFuZyBkZWJ1ZyBidWlsZC4KKyAgICAtIG9zOiBsaW51eAorICAgICAgY29tcGlsZXI6IGNsYW5nCisgICAgICBlbnY6IFZVTEtBTl9CVUlMRF9UQVJHRVQ9TElOVVgKKyAgICAjIExpbnV4IEdOIGRlYnVnIGJ1aWxkLgorICAgIC0gb3M6IGxpbnV4CisgICAgICBlbnY6IFZVTEtBTl9CVUlMRF9UQVJHRVQ9R04KKyAgICAjIENoZWNrIGZvciBwcm9wZXIgY2xhbmcgZm9ybWF0dGluZyBpbiB0aGUgcHVsbCByZXF1ZXN0LgorICAgIC0gZW52OiBDSEVDS19GT1JNQVQ9T04KKyAgICAjIENoZWNrIGZvciBwcm9wZXIgY29tbWl0IG1lc3NhZ2UgZm9ybWF0dGluZyBmb3IgY29tbWl0cyBpbiBQUgorICAgIC0gZW52OiBDSEVDS19DT01NSVRfRk9STUFUPU9OCisKK2NhY2hlOiBjY2FjaGUKKworIyBVc2Ugc2V0IC1lIHNvIHRoYXQgdGhlIGJ1aWxkIGZhaWxzIHdoZW4gYSBjb21tYW5kIGZhaWxzLgorIyBUaGUgZGVmYXVsdCBhY3Rpb24gZm9yIFRyYXZpcy1DSSBpcyB0byBjb250aW51ZSBydW5uaW5nIGV2ZW4gaWYgYSBjb21tYW5kIGZhaWxzLgorIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RyYXZpcy1jaS90cmF2aXMtY2kvaXNzdWVzLzEwNjYuCisjIFVzZSB0aGUgWUFNTCBibG9jayBzY2FsYXIgaGVhZGVyICh8KSB0byBhbGxvdyBlYXNpZXIgbXVsdGlsaW5lIHNjcmlwdCBjb2RpbmcuCisKK2JlZm9yZV9pbnN0YWxsOgorICAtIHNldCAtZQorICAtIENNQUtFX1ZFUlNJT049My4xMC4yCisgIC0gfAorICAgIGlmIFtbICIke1RSQVZJU19PU19OQU1FfSIgPT0gImxpbnV4IiBdXTsgdGhlbgorICAgICAgIyBVcGdyYWRlIHRvIHRoZSBkZXNpcmVkIHZlcnNpb24gb2YgQ01ha2UKKyAgICAgIENNQUtFX1VSTD0iaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdiR7Q01BS0VfVkVSU0lPTiUuKn0vY21ha2UtJHtDTUFLRV9WRVJTSU9OfS1MaW51eC14ODZfNjQudGFyLmd6IgorICAgICAgZWNobyBDTUFLRV9VUkw9JHtDTUFLRV9VUkx9CisgICAgICBta2RpciBjbWFrZS0ke0NNQUtFX1ZFUlNJT059ICYmIHRyYXZpc19yZXRyeSB3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgLU8gLSAke0NNQUtFX1VSTH0gfCB0YXIgLS1zdHJpcC1jb21wb25lbnRzPTEgLXh6IC1DIGNtYWtlLSR7Q01BS0VfVkVSU0lPTn0KKyAgICAgIGV4cG9ydCBQQVRIPSR7UFdEfS9jbWFrZS0ke0NNQUtFX1ZFUlNJT059L2Jpbjoke1BBVEh9CisgICAgZWxzZQorICAgICAgYnJldyBpbnN0YWxsIGNtYWtlIHx8IGJyZXcgdXBncmFkZSBjbWFrZQorICAgIGZpCisgICAgY21ha2UgLS12ZXJzaW9uCisgIC0gfAorICAgIGlmIFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkxJTlVYIiBdXSB8fCBbWyAiJFZVTEtBTl9CVUlMRF9UQVJHRVQiID09ICJHTiIgXV07IHRoZW4KKyAgICAgICMgSW5zdGFsbCB0aGUgYXBwcm9wcmlhdGUgTGludXggcGFja2FnZXMuCisgICAgICBzdWRvIGFwdC1nZXQgLXFxIHVwZGF0ZQorICAgICAgc3VkbyBhcHQtZ2V0IC15IGluc3RhbGwgbGlieGtiY29tbW9uLWRldiBsaWJ3YXlsYW5kLWRldiBsaWJtaXJjbGllbnQtZGV2IGxpYnhyYW5kci1kZXYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieDExLXhjYi1kZXYgbGlieGNiLWtleXN5bXMxIGxpYnhjYi1rZXlzeW1zMS1kZXYgbGlieGNiLWV3bWgtZGV2IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhjYi1yYW5kcjAtZGV2IHB5dGhvbi1wYXRobGliCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRWVUxLQU5fQlVJTERfVEFSR0VUIiA9PSAiQU5EUk9JRCIgXV07IHRoZW4KKyAgICAgICMgSW5zdGFsbCB0aGUgQW5kcm9pZCBOREsuCisgICAgICBleHBvcnQgQVJDSD1gdW5hbWUgLW1gCisgICAgICB3Z2V0IGh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvcmVwb3NpdG9yeS9hbmRyb2lkLW5kay1yMThiLWxpbnV4LSR7QVJDSH0uemlwCisgICAgICB1bnppcCAtdSAtcSBhbmRyb2lkLW5kay1yMThiLWxpbnV4LSR7QVJDSH0uemlwCisgICAgICBleHBvcnQgQU5EUk9JRF9OREtfSE9NRT1gcHdkYC9hbmRyb2lkLW5kay1yMThiCisgICAgICBleHBvcnQgSkFWQV9IT01FPSIvdXNyL2xpYi9qdm0vamF2YS04LW9yYWNsZSIKKyAgICAgIGV4cG9ydCBQQVRIPSIkQU5EUk9JRF9OREtfSE9NRTokUEFUSCIKKyAgICBmaQorICAtIHwKKyAgICBpZiBbWyAiJENIRUNLX0ZPUk1BVCIgPT0gIk9OIiAmJiAiJFRSQVZJU19QVUxMX1JFUVVFU1QiICE9ICJmYWxzZSIgXV07IHRoZW4KKyAgICAgICMgSW5zdGFsbCB0aGUgY2xhbmcgZm9ybWF0IGRpZmYgdG9vbCwgYnV0IG9ubHkgZm9yIHB1bGwgcmVxdWVzdHMuCisgICAgICBjdXJsIC1MIGh0dHA6Ly9sbHZtLm9yZy9zdm4vbGx2bS1wcm9qZWN0L2NmZS90cnVuay90b29scy9jbGFuZy1mb3JtYXQvY2xhbmctZm9ybWF0LWRpZmYucHkgXAorICAgICAgICAgICAtbyBzY3JpcHRzL2NsYW5nLWZvcm1hdC1kaWZmLnB5OworICAgIGZpCisgICMgTWlzYyBzZXR1cAorICAtIGV4cG9ydCBjb3JlX2NvdW50PSQobnByb2MgfHwgZWNobyA0KSAmJiBlY2hvIGNvcmVfY291bnQgPSAkY29yZV9jb3VudAorICAtIGNjYWNoZSAtLXplcm8tc3RhdHMKKyAgLSBzZXQgK2UKKworc2NyaXB0OgorICAtIHNldCAtZQorICAtIHwKKyAgICBpZiBbWyAiJFZVTEtBTl9CVUlMRF9UQVJHRVQiID09ICJMSU5VWCIgXV07IHRoZW4KKyAgICAgICMgQnVpbGQgVnVsa2FuLUxvYWRlciB0byBydW4gVnVsa2FuLVZhbGlkYXRpb25MYXllciB0ZXN0cworICAgICAgY2QgJHtUUkFWSVNfQlVJTERfRElSfS9leHRlcm5hbAorICAgICAgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLUxvYWRlci5naXQKKyAgICAgIGNkIFZ1bGthbi1Mb2FkZXIKKyAgICAgIHB5dGhvbiBzY3JpcHRzL3VwZGF0ZV9kZXBzLnB5IC0tZGlyPWV4dGVybmFsCisgICAgICBta2RpciBidWlsZAorICAgICAgY2QgYnVpbGQKKyAgICAgIGNtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAtQy4uL2V4dGVybmFsL2hlbHBlci5jbWFrZSAtRENNQUtFX0lOU1RBTExfUFJFRklYPWluc3RhbGwgLi4KKyAgICAgIGNtYWtlIC0tYnVpbGQgLiAtLXRhcmdldCBpbnN0YWxsIC0tIC1qJGNvcmVfY291bnQKKyAgICAgIGNkICR7VFJBVklTX0JVSUxEX0RJUn0KKyAgICAgICMgQnVpbGQgYWxsIHJlbWFpbmluZyBkZXBlbmRlbmNpZXMgZm9yIFZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzCisgICAgICBpZiBbWyAiJFRSQVZJU19FVkVOVF9UWVBFIiA9PSAiY3JvbiIgXV07IHRoZW4KKyAgICAgICAgIyBCdWlsZCBtYXN0ZXIgYnJhbmNoIHdoZW4gdHJpZ2dlcmVkIGJ5IChkYWlseSkgY3JvbiBqb2IKKyAgICAgICAgJHtUUkFWSVNfQlVJTERfRElSfS9zY3JpcHRzL3VwZGF0ZV9kZXBzLnB5IC0tZGlyPSR7VFJBVklTX0JVSUxEX0RJUn0vZXh0ZXJuYWwgLS1yZWY9bWFzdGVyCisgICAgICBlbHNlCisgICAgICAgICR7VFJBVklTX0JVSUxEX0RJUn0vc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLWRpcj0ke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsCisgICAgICBmaQorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkxJTlVYIiBdXTsgdGhlbgorICAgICAgIyBGZXRjaCBnb29nbGV0ZXN0IGNvbXBvbmVudCB0byBidWlsZCB2YWxpZGF0aW9uIGxheWVyIHRlc3RzCisgICAgICBlY2hvIEZldGNoaW5nIGdvb2dsZXRlc3QgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZvciBidWlsZGluZyB2YWxpZGF0aW9uIGxheWVyIHRlc3RzCisgICAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0LmdpdCAke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsL2dvb2dsZXRlc3QKKyAgICAgIHB1c2hkICR7VFJBVklTX0JVSUxEX0RJUn0vZXh0ZXJuYWwvZ29vZ2xldGVzdAorICAgICAgZ2l0IGNoZWNrb3V0IHRhZ3MvcmVsZWFzZS0xLjguMQorICAgICAgcG9wZAorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkxJTlVYIiBdXTsgdGhlbgorICAgICAgIyBWZXJpZnkgY29uc2lzdGVuY3kgYmV0d2VlbiBzb3VyY2UgZmlsZSBnZW5lcmF0b3JzIGFuZCBvdXRwdXQKKyAgICAgIGVjaG8gVmVyaWZ5aW5nIGNvbnNpc3RlbmN5IGJldHdlZW4gc291cmNlIGZpbGUgZ2VuZXJhdG9ycyBhbmQgb3V0cHV0CisgICAgICBweXRob24zICR7VFJBVklTX0JVSUxEX0RJUn0vc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkgLS12ZXJpZnkgJHtUUkFWSVNfQlVJTERfRElSfS9leHRlcm5hbC9WdWxrYW4tSGVhZGVycy9yZWdpc3RyeQorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkxJTlVYIiBdXTsgdGhlbgorICAgICAgIyBCdWlsZCBWdWxrYW4tVmFsaWRhdGlvbkxheWVycworICAgICAgY2QgJHtUUkFWSVNfQlVJTERfRElSfQorICAgICAgbWtkaXIgYnVpbGQKKyAgICAgIGNkIGJ1aWxkCisgICAgICBjbWFrZSAtQyAke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsL2hlbHBlci5jbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgXAorICAgICAgICAgICAgLURWVUxLQU5fTE9BREVSX0lOU1RBTExfRElSPSR7VFJBVklTX0JVSUxEX0RJUn0vZXh0ZXJuYWwvVnVsa2FuLUxvYWRlci9idWlsZC9pbnN0YWxsIFwKKyAgICAgICAgICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JHtUUkFWSVNfQlVJTERfRElSfS9idWlsZC9pbnN0YWxsIC1EQlVJTERfTEFZRVJfU1VQUE9SVF9GSUxFUz1PTiBcCisgICAgICAgICAgICAtRFVTRV9DQ0FDSEU9T04gLi4KKyAgICAgIGNtYWtlIC0tYnVpbGQgLiAtLXRhcmdldCBpbnN0YWxsIC0tIC1qJGNvcmVfY291bnQKKyAgICBmaQorICAtIHwKKyAgICBpZiBbWyAiJFZVTEtBTl9CVUlMRF9UQVJHRVQiID09ICJMSU5VWCIgXV07IHRoZW4KKyAgICAgICMgQnVpbGQgVnVsa2FuVG9vbHMKKyAgICAgICMgTm90ZTogVnVsa2FuVG9vbHMgaGFzIGEgYnVpbGQgZGVwZW5kZW5jeSBvbiBWdWxrYW4tVmFsaWRhdGlvbkxheWVycyBzbyBpdCBtdXN0IGJlIGJ1aWx0IGFmdGVyIFYtVkwgaXMgYnVpbHQKKyAgICAgIHB1c2hkICR7VFJBVklTX0JVSUxEX0RJUn0vZXh0ZXJuYWwvVnVsa2FuVG9vbHMKKyAgICAgIC4vdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuc2gKKyAgICAgIG1rZGlyIGJ1aWxkCisgICAgICBjZCBidWlsZAorICAgICAgY21ha2UgLURDTUFLRV9CVUlMRF9UWVBFPURlYnVnIFwKKyAgICAgICAgICAgIC1EQlVJTERfVklBPU5PIC1EQlVJTERfVktUUkFDRT1OTyAtREJVSUxEX1ZMRj1OTyAtREJVSUxEX1RFU1RTPU5PIC1EQlVJTERfTEFZRVJNR1I9Tk8gXAorICAgICAgICAgICAgLURCVUlMRF9WS1RSQUNFVklFV0VSPU5PIC1EQlVJTERfVktUUkFDRV9MQVlFUj1OTyAtREJVSUxEX1ZLVFJBQ0VfUkVQTEFZPU5PIFwKKyAgICAgICAgICAgIC1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVI9JHtUUkFWSVNfQlVJTERfRElSfS9leHRlcm5hbC9WdWxrYW4tSGVhZGVycy9idWlsZC9pbnN0YWxsIFwKKyAgICAgICAgICAgIC1EVlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUj0ke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsL1Z1bGthbi1Mb2FkZXIvYnVpbGQvaW5zdGFsbCBcCisgICAgICAgICAgICAtRFZVTEtBTl9WQUxJREFUSU9OTEFZRVJTX0lOU1RBTExfRElSPSR7VFJBVklTX0JVSUxEX0RJUn0vYnVpbGQvaW5zdGFsbCBcCisgICAgICAgICAgICAuLgorICAgICAgY21ha2UgLS1idWlsZCAuIC0tIC1qICRjb3JlX2NvdW50CisgICAgICBwb3BkCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRWVUxLQU5fQlVJTERfVEFSR0VUIiA9PSAiTElOVVgiIF1dOyB0aGVuCisgICAgICAjIFJ1biBUZXN0cworICAgICAgY2QgJHtUUkFWSVNfQlVJTERfRElSfQorICAgICAgZXhwb3J0IExEX0xJQlJBUllfUEFUSD0ke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsL1Z1bGthbi1Mb2FkZXIvYnVpbGQvaW5zdGFsbC9saWI6JHtMRF9MSUJSQVJZX1BBVEh9CisgICAgICBleHBvcnQgVktfTEFZRVJfUEFUSD0ke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsL1Z1bGthblRvb2xzL2J1aWxkL2xheWVyc3Z0OiR7VFJBVklTX0JVSUxEX0RJUn0vYnVpbGQvbGF5ZXJzCisgICAgICBleHBvcnQgVktfSUNEX0ZJTEVOQU1FUz0ke1RSQVZJU19CVUlMRF9ESVJ9L2V4dGVybmFsL1Z1bGthbi1Ub29scy9idWlsZC9pY2QvVmtJQ0RfbW9ja19pY2QuanNvbgorICAgICAgYnVpbGQvdGVzdHMvdmtfbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cworICAgICAgZm9yIHByb2ZpbGUgaW4gdGVzdHMvZGV2aWNlX3Byb2ZpbGVzLyouanNvbgorICAgICAgZG8KKyAgICAgICAgZWNobyBUZXN0aW5nIHdpdGggcHJvZmlsZSAkcHJvZmlsZQorICAgICAgICBWS19ERVZTSU1fRklMRU5BTUU9JHByb2ZpbGUgYnVpbGQvdGVzdHMvdmtfbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cyAtLWRldnNpbQorICAgICAgZG9uZQorICAgIGZpCisgIC0gfAorICAgIGlmIFtbICIkVlVMS0FOX0JVSUxEX1RBUkdFVCIgPT0gIkFORFJPSUQiIF1dOyB0aGVuCisgICAgICBwdXNoZCBidWlsZC1hbmRyb2lkCisgICAgICAuL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2ggLS1hYmkgJEFORFJPSURfQUJJIC0tbm8tYnVpbGQKKyAgICAgIFVTRV9DQ0FDSEU9MSBOREtfQ0NBQ0hFPWNjYWNoZSBuZGstYnVpbGQgQVBQX0FCST0kQU5EUk9JRF9BQkkgLWogJGNvcmVfY291bnQKKyAgICAgIHBvcGQKKyAgICBmaQorICAtIHwKKyAgICBpZiBbWyAiJENIRUNLX0ZPUk1BVCIgPT0gIk9OIiBdXTsgdGhlbgorICAgICAgaWYgW1sgIiRUUkFWSVNfUFVMTF9SRVFVRVNUIiAhPSAiZmFsc2UiIF1dOyB0aGVuCisgICAgICAgICMgUnVuIHRoZSBjbGFuZyBmb3JtYXQgY2hlY2sgb25seSBmb3IgcHVsbCByZXF1ZXN0IGJ1aWxkcyBiZWNhdXNlIHRoZQorICAgICAgICAjIG1hc3RlciBicmFuY2ggaXMgbmVlZGVkIHRvIGRvIHRoZSBnaXQgZGlmZi4KKyAgICAgICAgZWNobyAiQ2hlY2tpbmcgY2xhbmctZm9ybWF0IGJldHdlZW4gVFJBVklTX0JSQU5DSD0kVFJBVklTX0JSQU5DSCBhbmQgVFJBVklTX1BVTExfUkVRVUVTVF9CUkFOQ0g9JFRSQVZJU19QVUxMX1JFUVVFU1RfQlJBTkNIIgorICAgICAgICAuL3NjcmlwdHMvY2hlY2tfY29kZV9mb3JtYXQuc2gKKyAgICAgIGVsc2UKKyAgICAgICAgZWNobyAiU2tpcHBpbmcgY2xhbmctZm9ybWF0IGNoZWNrIHNpbmNlIHRoaXMgaXMgbm90IGEgcHVsbCByZXF1ZXN0LiIKKyAgICAgIGZpCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRDSEVDS19DT01NSVRfRk9STUFUIiA9PSAiT04iIF1dOyB0aGVuCisgICAgICBpZiBbWyAiJFRSQVZJU19QVUxMX1JFUVVFU1QiICE9ICJmYWxzZSIgXV07IHRoZW4KKyAgICAgICAgZWNobyAiQ2hlY2tpbmcgY29tbWl0IG1lc3NhZ2UgZm9ybWF0czogIFNlZSBDT05UUklCVVRJTkcubWQiCisgICAgICAgIC4vc2NyaXB0cy9jaGVja19jb21taXRfbWVzc2FnZV9mb3JtYXQuc2gKKyAgICAgIGZpCisgICAgZmkKKyAgLSB8CisgICAgaWYgW1sgIiRWVUxLQU5fQlVJTERfVEFSR0VUIiA9PSAiR04iIF1dOyB0aGVuCisgICAgICBnaXQgY2xvbmUgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3Rvb2xzL2RlcG90X3Rvb2xzLmdpdCBkZXBvdF90b29scworICAgICAgZXhwb3J0IFBBVEg9JFBBVEg6JFBXRC9kZXBvdF90b29scworICAgICAgLi9idWlsZC1nbi91cGRhdGVfZGVwcy5zaAorICAgICAgZ24gZ2VuIG91dC9EZWJ1ZworICAgICAgbmluamEgLUMgb3V0L0RlYnVnCisgICAgZmkKKyAgLSBjY2FjaGUgLS1zaG93LXN0YXRzCisgIC0gc2V0ICtlCisKK25vdGlmaWNhdGlvbnM6CisgIGVtYWlsOgorICAgIHJlY2lwaWVudHM6CisgICAgICAtIGNub3J0aHJvcEBnb29nbGUuY29tCisgICAgICAtIHRvYmluZUBnb29nbGUuY29tCisgICAgICAtIGNocmlzZm9yYmVzQGdvb2dsZS5jb20KKyAgICAgIC0gc2hhbm5vbkBsdW5hcmcuY29tCisgICAgICAtIG1pa2VzQGx1bmFyZy5jb20KKyAgICBvbl9zdWNjZXNzOiBjaGFuZ2UKKyAgICBvbl9mYWlsdXJlOiBhbHdheXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0JVSUxELmduIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvQlVJTEQuZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzZjA4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0JVSUxELmduCkBAIC0wLDAgKzEsMjgyIEBACisjIENvcHlyaWdodCAoQykgMjAxOC0yMDE5IFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuCisjIENvcHlyaWdodCAoQykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCgiLy9idWlsZF9vdmVycmlkZXMvdnVsa2FuX3ZhbGlkYXRpb25fbGF5ZXJzLmduaSIpCisKKyMgRnVjaHNpYSBoYXMgbm9uLXVwc3RyZWFtIGNoYW5nZXMgdG8gdGhlIHZ1bGthbiBsYXllcnMsIHNvIHdlIGRvbid0IHdhbnQKKyMgdG8gYnVpbGQgaXQgZnJvbSB1cHN0cmVhbSBzb3VyY2VzLgorYXNzZXJ0KCFpc19mdWNoc2lhKQorCit2dWxrYW5fdW5kZWZpbmVfY29uZmlncyA9IFtdCitpZiAoaXNfd2luKSB7CisgIHZ1bGthbl91bmRlZmluZV9jb25maWdzICs9IFsKKyAgICAiLy9idWlsZC9jb25maWcvd2luOm5vbWlubWF4IiwKKyAgICAiLy9idWlsZC9jb25maWcvd2luOnVuaWNvZGUiLAorICBdCit9CisKK3Z1bGthbl9nZW5fZGlyID0gIiR0YXJnZXRfZ2VuX2Rpci8kdnVsa2FuX2dlbl9zdWJkaXIiCityYXdfdnVsa2FuX2dlbl9kaXIgPSByZWJhc2VfcGF0aCh2dWxrYW5fZ2VuX2Rpciwgcm9vdF9idWlsZF9kaXIpCisKK3Z1bGthbl9kYXRhX2RpciA9ICIkcm9vdF9vdXRfZGlyLyR2dWxrYW5fZGF0YV9zdWJkaXIiCityYXdfdnVsa2FuX2RhdGFfZGlyID0gcmViYXNlX3BhdGgodnVsa2FuX2RhdGFfZGlyLCByb290X2J1aWxkX2RpcikKKworcmF3X3Jvb3Rfb3V0X2RpciA9IHJlYmFzZV9wYXRoKHJvb3Rfb3V0X2Rpciwgcm9vdF9idWlsZF9kaXIpCisKKyMgVGhpcyBzcGVjaWFsIGFjdGlvbiBpcyBuZWVkZWQgdG8gcmVtb3ZlIG9sZCBWVkwgb2JqZWN0cyB0aGF0IGFyZSBub3cgcmVuYW1lZC4KK2FjdGlvbigidnVsa2FuX2NsZWFuX29sZF92YWxpZGF0aW9uX2xheWVyX29iamVjdHMiKSB7CisgIHNjcmlwdCA9ICJidWlsZC1nbi9yZW1vdmVfZmlsZXMucHkiCisKKyAgIyBpbnB1dHMgaXMgYSAocmFuZG9tKSBuZXcgZmlsZSBzaW5jZSB0aGUgdnZsIHJvbGwsIHVzZWQgdG8gZW5zdXJlIHRoZSBjbGVhbnVwIGlzIGRvbmUgb25seSBvbmNlCisgIGlucHV0cyA9IFsKKyAgICAibGF5ZXJzL2dwdV92YWxpZGF0aW9uLmNwcCIsCisgIF0KKyAgb3V0cHV0cyA9IFsKKyAgICAiJHZ1bGthbl9nZW5fZGlyL29sZF92dmxfZmlsZXNfYXJlX3JlbW92ZWQiLAorICBdCisgIGFyZ3MgPSBbCisgICAgIiRyYXdfdnVsa2FuX2dlbl9kaXIvb2xkX3Z2bF9maWxlc19hcmVfcmVtb3ZlZCIsCisgICAgIiRyYXdfcm9vdF9vdXRfZGlyL2xpYlZrTGF5ZXIqIiwKKyAgICAiJHJhd19yb290X291dF9kaXIvVmtMYXllcioiLAorICAgICIkcmF3X3Z1bGthbl9kYXRhX2Rpci9Wa0xheWVyKi5qc29uIiwKKyAgXQorfQorCitjb25maWcoInZ1bGthbl9pbnRlcm5hbF9jb25maWciKSB7CisgIGRlZmluZXMgPSBbCisgICAgIlZVTEtBTl9OT05fQ01BS0VfQlVJTEQiLAorICAgICJBUElfTkFNRT1cIlZ1bGthblwiIiwKKyAgXQorICBpZiAoaXNfY2xhbmcgfHwgIWlzX3dpbikgeworICAgIGNmbGFncyA9IFsgIi1Xbm8tdW51c2VkLWZ1bmN0aW9uIiBdCisgIH0KKyAgaWYgKGlzX2xpbnV4KSB7CisgICAgZGVmaW5lcyArPSBbCisgICAgICAiU1lTQ09ORkRJUj1cIi9ldGNcIiIsCisgICAgICAiRkFMTEJBQ0tfQ09ORklHX0RJUlM9XCIvZXRjL3hkZ1wiIiwKKyAgICAgICJGQUxMQkFDS19EQVRBX0RJUlM9XCIvdXNyL2xvY2FsL3NoYXJlOi91c3Ivc2hhcmVcIiIsCisgICAgXQorICB9Cit9CisKKyMgVGhlIHZhbGlkYXRpb24gbGF5ZXJzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25maWcoInZ1bGthbl9sYXllcl9jb25maWciKSB7CisgIGluY2x1ZGVfZGlycyA9IFsKKyAgICAibGF5ZXJzIiwKKyAgICAibGF5ZXJzL2dlbmVyYXRlZCIsCisgIF0KK30KKworY29yZV92YWxpZGF0aW9uX3NvdXJjZXMgPSBbCisgICMgVGhpcyBmaWxlIGlzIG1hbnVhbGx5IGluY2x1ZGVkIGluIHRoZSBsYXllcgorICAjICJsYXllcnMvZ2VuZXJhdGVkL3ZrX3NhZmVfc3RydWN0LmNwcCIsCisgICJsYXllcnMvYnVmZmVyX3ZhbGlkYXRpb24uY3BwIiwKKyAgImxheWVycy9idWZmZXJfdmFsaWRhdGlvbi5oIiwKKyAgImxheWVycy9zdGF0ZV90cmFja2VyLmNwcCIsCisgICJsYXllcnMvc3RhdGVfdHJhY2tlci5oIiwKKyAgImxheWVycy9jb3JlX3ZhbGlkYXRpb24uY3BwIiwKKyAgImxheWVycy9jb3JlX3ZhbGlkYXRpb24uaCIsCisgICJsYXllcnMvY29udmVydF90b19yZW5kZXJwYXNzMi5jcHAiLAorICAibGF5ZXJzL2Rlc2NyaXB0b3Jfc2V0cy5jcHAiLAorICAibGF5ZXJzL2Rlc2NyaXB0b3Jfc2V0cy5oIiwKKyAgImxheWVycy9kcmF3ZGlzcGF0Y2guY3BwIiwKKyAgImxheWVycy9ncHVfdmFsaWRhdGlvbi5jcHAiLAorICAibGF5ZXJzL2dwdV92YWxpZGF0aW9uLmgiLAorICAibGF5ZXJzL3NoYWRlcl92YWxpZGF0aW9uLmNwcCIsCisgICJsYXllcnMvc2hhZGVyX3ZhbGlkYXRpb24uaCIsCisgICJsYXllcnMveHhoYXNoLmMiLAorICAibGF5ZXJzL3h4aGFzaC5oIiwKK10KKworb2JqZWN0X2xpZmV0aW1lc19zb3VyY2VzID0gWworICAibGF5ZXJzL2dlbmVyYXRlZC9vYmplY3RfdHJhY2tlci5jcHAiLAorICAibGF5ZXJzL2dlbmVyYXRlZC9vYmplY3RfdHJhY2tlci5oIiwKKyAgImxheWVycy9vYmplY3RfdHJhY2tlcl91dGlscy5jcHAiLAorXQorCitzdGF0ZWxlc3NfdmFsaWRhdGlvbl9zb3VyY2VzID0gWworICAibGF5ZXJzL2dlbmVyYXRlZC9wYXJhbWV0ZXJfdmFsaWRhdGlvbi5jcHAiLAorICAibGF5ZXJzL2dlbmVyYXRlZC9wYXJhbWV0ZXJfdmFsaWRhdGlvbi5oIiwKKyAgImxheWVycy9wYXJhbWV0ZXJfdmFsaWRhdGlvbl91dGlscy5jcHAiLAorXQorCit0aHJlYWRfc2FmZXR5X3NvdXJjZXMgPSBbCisgICJsYXllcnMvZ2VuZXJhdGVkL3RocmVhZF9zYWZldHkuY3BwIiwKKyAgImxheWVycy9nZW5lcmF0ZWQvdGhyZWFkX3NhZmV0eS5oIiwKK10KKwordW5pcXVlX29iamVjdHNfc291cmNlcyA9IFtdCisKK2Jlc3RfcHJhY3RpY2VzX3NvdXJjZXMgPSBbCisgICJsYXllcnMvYmVzdF9wcmFjdGljZXMuY3BwIiwKKyAgImxheWVycy9iZXN0X3ByYWN0aWNlcy5oIiwKKyAgImxheWVycy9iZXN0X3ByYWN0aWNlc19lcnJvcl9lbnVtcy5oIiwKK10KKworY29tbWFuZF9jb3VudGVyX3NvdXJjZXMgPSBbCisgICJsYXllcnMvZ2VuZXJhdGVkL2NvbW1hbmRfY291bnRlcl9oZWxwZXIuY3BwIiwKKyAgImxheWVycy9nZW5lcmF0ZWQvY29tbWFuZF9jb3VudGVyX2hlbHBlci5oIiwKKyAgImxheWVycy9jb21tYW5kX2NvdW50ZXIuaCIsCitdCisKK2NoYXNzaXNfc291cmNlcyA9IFsKKyAgImxheWVycy9zdGF0ZV90cmFja2VyLmgiLAorICAibGF5ZXJzL2NvcmVfdmFsaWRhdGlvbi5oIiwKKyAgImxheWVycy9nZW5lcmF0ZWQvdmtfc2FmZV9zdHJ1Y3QuaCIsCisgICJsYXllcnMvZ2VuZXJhdGVkL3RocmVhZF9zYWZldHkuaCIsCisgICJsYXllcnMvZ2VuZXJhdGVkL2NoYXNzaXMuY3BwIiwKKyAgImxheWVycy9nZW5lcmF0ZWQvY2hhc3Npcy5oIiwKKyAgImxheWVycy9nZW5lcmF0ZWQvbGF5ZXJfY2hhc3Npc19kaXNwYXRjaC5jcHAiLAorICAibGF5ZXJzL2dlbmVyYXRlZC9sYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmgiLAorICAiJHZ1bGthbl9oZWFkZXJzX2Rpci9pbmNsdWRlL3Z1bGthbi92a19sYXllci5oIiwKKyAgIiR2dWxrYW5faGVhZGVyc19kaXIvaW5jbHVkZS92dWxrYW4vdnVsa2FuLmgiLAorXQorCitsYXllcnMgPSBbIFsKKyAgICAgICJraHJvbm9zX3ZhbGlkYXRpb24iLAorICAgICAgY29yZV92YWxpZGF0aW9uX3NvdXJjZXMgKyBvYmplY3RfbGlmZXRpbWVzX3NvdXJjZXMgKworICAgICAgICAgIHN0YXRlbGVzc192YWxpZGF0aW9uX3NvdXJjZXMgKyB0aHJlYWRfc2FmZXR5X3NvdXJjZXMgKworICAgICAgICAgIHVuaXF1ZV9vYmplY3RzX3NvdXJjZXMgKyBiZXN0X3ByYWN0aWNlc19zb3VyY2VzICsKKyAgICAgICAgICBjb21tYW5kX2NvdW50ZXJfc291cmNlcyArIGNoYXNzaXNfc291cmNlcywKKyAgICAgIFsgIjp2dWxrYW5fY29yZV92YWxpZGF0aW9uX2dsc2xhbmciIF0sCisgICAgICBbXSwKKyAgICBdIF0KKworaWYgKCFpc19hbmRyb2lkKSB7CisgIGFjdGlvbigidnVsa2FuX2dlbl9qc29uX2ZpbGVzIikgeworICAgIHNjcmlwdCA9ICJidWlsZC1nbi9nZW5lcmF0ZV92dWxrYW5fbGF5ZXJzX2pzb24ucHkiCisKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBjbGVhbnVwIG9mIG9sZCBsYXllciBKU09OIGZpbGVzIGhhcHBlbnMgYmVmb3JlIHRoZSBuZXcgb25lcyBhcmUgZ2VuZXJhdGVkLgorICAgIGRlcHMgPSBbCisgICAgICAiOnZ1bGthbl9jbGVhbl9vbGRfdmFsaWRhdGlvbl9sYXllcl9vYmplY3RzIiwKKyAgICBdCisgICAganNvbl9uYW1lcyA9IFsKKyAgICAgICJWa0xheWVyX3N0YW5kYXJkX3ZhbGlkYXRpb24uanNvbiIsCisgICAgICAiVmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24uanNvbiIsCisgICAgXQorICAgIHNvdXJjZXMgPSBbCisgICAgICAiJHZ1bGthbl9oZWFkZXJzX2Rpci9pbmNsdWRlL3Z1bGthbi92dWxrYW5fY29yZS5oIiwKKyAgICBdCisgICAgb3V0cHV0cyA9IFtdCisgICAgZm9yZWFjaChqc29uX25hbWUsIGpzb25fbmFtZXMpIHsKKyAgICAgIHNvdXJjZXMgKz0gWyAibGF5ZXJzL2pzb24vJGpzb25fbmFtZS5pbiIgXQorICAgICAgb3V0cHV0cyArPSBbICIkdnVsa2FuX2RhdGFfZGlyLyRqc29uX25hbWUiIF0KKyAgICB9CisgICAgYXJncyA9IFsKKyAgICAgICAgICAgICByZWJhc2VfcGF0aCgibGF5ZXJzL2pzb24iLCByb290X2J1aWxkX2RpciksCisgICAgICAgICAgICAgcmViYXNlX3BhdGgodnVsa2FuX2RhdGFfZGlyLCByb290X2J1aWxkX2RpciksCisgICAgICAgICAgIF0gKyByZWJhc2VfcGF0aChzb3VyY2VzLCByb290X2J1aWxkX2RpcikKKworICAgICMgVGhlIGxheWVyIEpTT04gZmlsZXMgYXJlIHBhcnQgb2YgdGhlIG5lY2Vzc2FyeSBkYXRhIGRlcHMuCisgICAgZGF0YSA9IG91dHB1dHMKKyAgfQorfQorCitzb3VyY2Vfc2V0KCJ2dWxrYW5fbGF5ZXJfdXRpbHMiKSB7CisgIGluY2x1ZGVfZGlycyA9IFsKKyAgICAibGF5ZXJzIiwKKyAgICAibGF5ZXJzL2dlbmVyYXRlZCIsCisgIF0KKyAgc291cmNlcyA9IFsKKyAgICAiJHZ1bGthbl9oZWFkZXJzX2Rpci9pbmNsdWRlL3Z1bGthbi92a19sYXllci5oIiwKKyAgICAiJHZ1bGthbl9oZWFkZXJzX2Rpci9pbmNsdWRlL3Z1bGthbi92a19zZGtfcGxhdGZvcm0uaCIsCisgICAgIiR2dWxrYW5faGVhZGVyc19kaXIvaW5jbHVkZS92dWxrYW4vdnVsa2FuLmgiLAorICAgICJsYXllcnMvdmtfZm9ybWF0X3V0aWxzLmNwcCIsCisgICAgImxheWVycy92a19mb3JtYXRfdXRpbHMuaCIsCisgICAgImxheWVycy92a19sYXllcl9jb25maWcuY3BwIiwKKyAgICAibGF5ZXJzL3ZrX2xheWVyX2NvbmZpZy5oIiwKKyAgICAibGF5ZXJzL3ZrX2xheWVyX2V4dGVuc2lvbl91dGlscy5jcHAiLAorICAgICJsYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmgiLAorICAgICJsYXllcnMvdmtfbGF5ZXJfdXRpbHMuY3BwIiwKKyAgICAibGF5ZXJzL3ZrX2xheWVyX3V0aWxzLmgiLAorICBdCisgIHB1YmxpY19jb25maWdzID0gWworICAgICIkdnVsa2FuX2hlYWRlcnNfZGlyOnZ1bGthbl9oZWFkZXJzX2NvbmZpZyIsCisgICAgIjp2dWxrYW5faW50ZXJuYWxfY29uZmlnIiwKKyAgXQorICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgY29uZmlncyArPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiBdCisgIHB1YmxpY19kZXBzID0gW10KKyAgY29uZmlncyAtPSB2dWxrYW5fdW5kZWZpbmVfY29uZmlncworfQorCitjb25maWcoInZ1bGthbl9jb3JlX3ZhbGlkYXRpb25fY29uZmlnIikgeworICBpbmNsdWRlX2RpcnMgPSBbICIkdnZsX2dsc2xhbmdfZGlyIiBdCit9CisKK3NvdXJjZV9zZXQoInZ1bGthbl9jb3JlX3ZhbGlkYXRpb25fZ2xzbGFuZyIpIHsKKyAgcHVibGljX2RlcHMgPSBbCisgICAgIiR7dnZsX3NwaXJ2X3Rvb2xzX2Rpcn06c3B2dG9vbHMiLAorICAgICIke3Z2bF9zcGlydl90b29sc19kaXJ9OnNwdnRvb2xzX29wdCIsCisgICAgIiR7dnZsX3NwaXJ2X3Rvb2xzX2Rpcn06c3B2dG9vbHNfdmFsIiwKKyAgXQorICBwdWJsaWNfY29uZmlncyA9IFsKKyAgICAiJHZ1bGthbl9oZWFkZXJzX2Rpcjp2dWxrYW5faGVhZGVyc19jb25maWciLAorICAgICI6dnVsa2FuX2NvcmVfdmFsaWRhdGlvbl9jb25maWciLAorICBdCit9CisKK2NvbmZpZygidnVsa2FuX3N0YXRlbGVzc192YWxpZGF0aW9uX2NvbmZpZyIpIHsKKyAgaWYgKGlzX2NsYW5nKSB7CisgICAgY2ZsYWdzX2NjID0gWyAiLVduby11bnVzZWQtY29uc3QtdmFyaWFibGUiIF0KKyAgfQorfQorCitmb3JlYWNoKGxheWVyX2luZm8sIGxheWVycykgeworICBuYW1lID0gbGF5ZXJfaW5mb1swXQorICBzaGFyZWRfbGlicmFyeSgiVmtMYXllcl8kbmFtZSIpIHsKKyAgICBkZWZpbmVzID0gW10KKyAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzIC09IHZ1bGthbl91bmRlZmluZV9jb25maWdzCisgICAgcHVibGljX2NvbmZpZ3MgPSBbICI6dnVsa2FuX2xheWVyX2NvbmZpZyIgXQorICAgIGRlcHMgPSBbCisgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2xlYW51cCBvZiBvbGQgbGF5ZXJzIGhhcHBlbiBiZWZvcmUgdGhlIG5ldyBvbmVzIGFyZSBjb21waWxlZC4KKyAgICAgICI6dnVsa2FuX2NsZWFuX29sZF92YWxpZGF0aW9uX2xheWVyX29iamVjdHMiLAorICAgICAgIjp2dWxrYW5fbGF5ZXJfdXRpbHMiLAorICAgIF0KKyAgICBpZiAobGF5ZXJfaW5mb1syXSAhPSAiIikgeworICAgICAgZGVwcyArPSBsYXllcl9pbmZvWzJdCisgICAgfQorICAgIHNvdXJjZXMgPSBsYXllcl9pbmZvWzFdCisgICAgaWYgKGlzX3dpbikgeworICAgICAgc291cmNlcyArPSBbICJsYXllcnMvVmtMYXllcl8kbmFtZS5kZWYiIF0KKyAgICB9CisgICAgaWYgKGlzX2xpbnV4IHx8IGlzX2FuZHJvaWQpIHsKKyAgICAgIGxkZmxhZ3MgPSBbICItV2wsLUJzeW1ib2xpYywtLWV4Y2x1ZGUtbGlicyxBTEwiIF0KKyAgICB9CisgICAgaWYgKHVzZV94MTEpIHsKKyAgICAgIGRlZmluZXMgKz0gWyAiVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSIiBdCisgICAgfQorICAgIGlmIChpc19hbmRyb2lkKSB7CisgICAgICBsaWJzID0gWworICAgICAgICAibG9nIiwKKyAgICAgICAgIm5hdGl2ZXdpbmRvdyIsCisgICAgICBdCisgICAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2FuZHJvaWQ6aGlkZV9hbGxfYnV0X2puaV9vbmxvYWQiIF0KKyAgICB9CisgICAgZGVmaW5lcyArPSBsYXllcl9pbmZvWzNdCisgIH0KK30KKworZ3JvdXAoInZ1bGthbl92YWxpZGF0aW9uX2xheWVycyIpIHsKKyAgZGF0YV9kZXBzID0gW10KKyAgZm9yZWFjaChsYXllcl9pbmZvLCBsYXllcnMpIHsKKyAgICBuYW1lID0gbGF5ZXJfaW5mb1swXQorICAgIGRhdGFfZGVwcyArPSBbICI6VmtMYXllcl8kbmFtZSIgXQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9CVUlMRC5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0JVSUxELm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDEyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9CVUlMRC5tZApAQCAtMCwwICsxLDg0NiBAQAorIyBCdWlsZCBJbnN0cnVjdGlvbnMKKworSW5zdHJ1Y3Rpb25zIGZvciBidWlsZGluZyB0aGlzIHJlcG9zaXRvcnkgb24gTGludXgsIFdpbmRvd3MsIEFuZHJvaWQsIGFuZAorTWFjT1MuCisKKyMjIEluZGV4CisKKzEuIFtDb250cmlidXRpbmddKCNjb250cmlidXRpbmctdG8tdGhlLXJlcG9zaXRvcnkpCisxLiBbUmVwb3NpdG9yeSBDb250ZW50XSgjcmVwb3NpdG9yeS1jb250ZW50KQorMS4gW1JlcG9zaXRvcnkgU2V0LVVwXSgjcmVwb3NpdG9yeS1zZXQtdXApCisxLiBbV2luZG93cyBCdWlsZF0oI2J1aWxkaW5nLW9uLXdpbmRvd3MpCisxLiBbTGludXggQnVpbGRdKCNidWlsZGluZy1vbi1saW51eCkKKzEuIFtBbmRyb2lkIEJ1aWxkXSgjYnVpbGRpbmctb24tYW5kcm9pZCkKKzEuIFtNYWNPUyBidWlsZF0oI2J1aWxkaW5nLW9uLW1hY29zKQorCisjIyBDb250cmlidXRpbmcgdG8gdGhlIFJlcG9zaXRvcnkKKworSWYgeW91IGludGVuZCB0byBjb250cmlidXRlLCB0aGUgcHJlZmVycmVkIHdvcmsgZmxvdyBpcyBmb3IgeW91IHRvIGRldmVsb3AKK3lvdXIgY29udHJpYnV0aW9uIGluIGEgZm9yayBvZiB0aGlzIHJlcG9zaXRvcnkgaW4geW91ciBHaXRIdWIgYWNjb3VudCBhbmQgdGhlbgorc3VibWl0IGEgcHVsbCByZXF1ZXN0LiBQbGVhc2Ugc2VlIHRoZSBbQ09OVFJJQlVUSU5HLm1kXShDT05UUklCVVRJTkcubWQpIGZpbGUKK2luIHRoaXMgcmVwb3NpdG9yeSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIyBSZXBvc2l0b3J5IENvbnRlbnQKKworVGhpcyByZXBvc2l0b3J5IGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBuZWNlc3NhcnkgdG8gYnVpbGQgdGhlIFZ1bGthbgordmFsaWRhdGlvbiBsYXllcnMgYW5kIHRoZWlyIHRlc3RzLgorCisjIyMgSW5zdGFsbGVkIEZpbGVzCisKK1RoZSBgaW5zdGFsbGAgdGFyZ2V0IGluc3RhbGxzIHRoZSBmb2xsb3dpbmcgZmlsZXMgdW5kZXIgdGhlIGRpcmVjdG9yeQoraW5kaWNhdGVkIGJ5ICppbnN0YWxsX2Rpcio6CisKKy0gKmluc3RhbGxfZGlyKmAvbGliYCA6IFRoZSBWdWxrYW4gdmFsaWRhdGlvbiBsYXllciBsaWJyYXJpZXMKKy0gKmluc3RhbGxfZGlyKmAvc2hhcmUvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmRgIDogVGhlIFZ1bGthbiB2YWxpZGF0aW9uIGxheWVyCisgIEpTT04gZmlsZXMgKExpbnV4IGFuZCBNYWNPUykKKworVGhlIGB1bmluc3RhbGxgIHRhcmdldCBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlIGFib3ZlIGZpbGVzIGZyb20gdGhlIGluc3RhbGwKK2RpcmVjdG9yeS4KKworIyMgUmVwb3NpdG9yeSBTZXQtVXAKKworIyMjIERpc3BsYXkgRHJpdmVycworCitUaGlzIHJlcG9zaXRvcnkgZG9lcyBub3QgY29udGFpbiBhIFZ1bGthbi1jYXBhYmxlIGRyaXZlci4gWW91IHdpbGwgbmVlZCB0bworb2J0YWluIGFuZCBpbnN0YWxsIGEgVnVsa2FuIGRyaXZlciBmcm9tIHlvdXIgZ3JhcGhpY3MgaGFyZHdhcmUgdmVuZG9yIG9yIGZyb20KK3NvbWUgb3RoZXIgc3VpdGFibGUgc291cmNlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIFZ1bGthbiBhcHBsaWNhdGlvbnMuCisKKyMjIyBEb3dubG9hZCB0aGUgUmVwb3NpdG9yeQorCitUbyBjcmVhdGUgeW91ciBsb2NhbCBnaXQgcmVwb3NpdG9yeToKKworICAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1WYWxpZGF0aW9uTGF5ZXJzLmdpdAorCisjIyMgUmVwb3NpdG9yeSBEZXBlbmRlbmNpZXMKKworVGhpcyByZXBvc2l0b3J5IGF0dGVtcHRzIHRvIHJlc29sdmUgc29tZSBvZiBpdHMgZGVwZW5kZW5jaWVzIGJ5IHVzaW5nCitjb21wb25lbnRzIGZvdW5kIGZyb20gdGhlIGZvbGxvd2luZyBwbGFjZXMsIGluIHRoaXMgb3JkZXI6CisKKzEuIENNYWtlIG9yIEVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlcyAoZS5nLiwgLURWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUikKKzEuIEx1bmFyRyBWdWxrYW4gU0RLLCBsb2NhdGVkIGJ5IHRoZSBgVlVMS0FOX1NES2AgZW52aXJvbm1lbnQgdmFyaWFibGUKKzEuIFN5c3RlbS1pbnN0YWxsZWQgcGFja2FnZXMsIG1vc3RseSBhcHBsaWNhYmxlIG9uIExpbnV4CisKK0RlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBieSB0aGUgU0RLIG9yIGluc3RhbGxlZCBwYWNrYWdlcyBtdXN0IGJlCityZXNvbHZlZCB3aXRoIHRoZSAiaW5zdGFsbCBkaXJlY3RvcnkiIG92ZXJyaWRlIGFuZCBhcmUgbGlzdGVkIGJlbG93LiBUaGUKKyJpbnN0YWxsIGRpcmVjdG9yeSIgb3ZlcnJpZGUgY2FuIGFsc28gYmUgdXNlZCB0byBmb3JjZSB0aGUgdXNlIG9mIGEgc3BlY2lmaWMKK3ZlcnNpb24gb2YgdGhhdCBkZXBlbmRlbmN5LgorCisjIyMjIFZ1bGthbi1IZWFkZXJzCisKK1RoaXMgcmVwb3NpdG9yeSBoYXMgYSByZXF1aXJlZCBkZXBlbmRlbmN5IG9uIHRoZQorW1Z1bGthbiBIZWFkZXJzIHJlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLUhlYWRlcnMpLgorWW91IG11c3QgY2xvbmUgdGhlIGhlYWRlcnMgcmVwb3NpdG9yeSBhbmQgYnVpbGQgaXRzIGBpbnN0YWxsYCB0YXJnZXQgYmVmb3JlCitidWlsZGluZyB0aGlzIHJlcG9zaXRvcnkuIFRoZSBWdWxrYW4tSGVhZGVycyByZXBvc2l0b3J5IGlzIHJlcXVpcmVkIGJlY2F1c2UgaXQKK2NvbnRhaW5zIHRoZSBWdWxrYW4gQVBJIGRlZmluaXRpb24gZmlsZXMgKHJlZ2lzdHJ5KSB0aGF0IGFyZSByZXF1aXJlZCB0byBidWlsZAordGhlIHZhbGlkYXRpb24gbGF5ZXJzLiBZb3UgbXVzdCBhbHNvIHRha2Ugbm90ZSBvZiB0aGUgaGVhZGVycycgaW5zdGFsbAorZGlyZWN0b3J5IGFuZCBwYXNzIGl0IG9uIHRoZSBDTWFrZSBjb21tYW5kIGxpbmUgZm9yIGJ1aWxkaW5nIHRoaXMgcmVwb3NpdG9yeSwKK2FzIGRlc2NyaWJlZCBiZWxvdy4KKworIyMjIyBnbHNsYW5nCisKK1RoaXMgcmVwb3NpdG9yeSBoYXMgYSByZXF1aXJlZCBkZXBlbmRlbmN5IG9uIHRoZQorW2dsc2xhbmcgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbHNsYW5nKS4KK1RoZSBnbHNsYW5nIHJlcG9zaXRvcnkgaXMgcmVxdWlyZWQgYmVjYXVzZSBpdCBjb250YWlucyBjb21wb25lbnRzIHRoYXQgYXJlCityZXF1aXJlZCB0byBidWlsZCB0aGUgdmFsaWRhdGlvbiBsYXllcnMuIFlvdSBtdXN0IGNsb25lIHRoZSBnbHNsYW5nIHJlcG9zaXRvcnkKK2FuZCBidWlsZCBpdHMgYGluc3RhbGxgIHRhcmdldC4gRm9sbG93IHRoZSBidWlsZCBpbnN0cnVjdGlvbnMgaW4gdGhlIGdsc2xhbmcKK1tSRUFETUUubWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xzbGFuZy9ibG9iL21hc3Rlci9SRUFETUUubWQpCitmaWxlLiBFbnN1cmUgdGhhdCB0aGUgYHVwZGF0ZV9nbHNsYW5nX3NvdXJjZXMucHlgIHNjcmlwdCBoYXMgYmVlbiBydW4gYXMgcGFydAorb2YgYnVpbGRpbmcgZ2xzbGFuZy4gWW91IG11c3QgYWxzbyB0YWtlIG5vdGUgb2YgdGhlIGdsc2xhbmcgaW5zdGFsbCBkaXJlY3RvcnkKK2FuZCBwYXNzIGl0IG9uIHRoZSBDTWFrZSBjb21tYW5kIGxpbmUgZm9yIGJ1aWxkaW5nIHRoaXMgcmVwb3NpdG9yeSwgYXMKK2Rlc2NyaWJlZCBiZWxvdy4KKworIyMjIyBHb29nbGUgVGVzdAorCitUaGUgdmFsaWRhdGlvbiBsYXllciB0ZXN0cyBkZXBlbmQgb24gdGhlCitbR29vZ2xlIFRlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xldGVzdCkKK2ZyYW1ld29yayBhbmQgZG8gbm90IGJ1aWxkIHVubGVzcyB0aGlzIGZyYW1ld29yayBpcyBkb3dubG9hZGVkIGludG8gdGhlCityZXBvc2l0b3J5J3MgYGV4dGVybmFsYCBkaXJlY3RvcnkuCisKK1RvIG9idGFpbiB0aGUgZnJhbWV3b3JrLCBjaGFuZ2UgeW91ciBjdXJyZW50IGRpcmVjdG9yeSB0byB0aGUgdG9wIG9mIHlvdXIKK1Z1bGthbi1WYWxpZGF0aW9uTGF5ZXJzIHJlcG9zaXRvcnkgYW5kIHJ1bjoKKworICAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QuZ2l0IGV4dGVybmFsL2dvb2dsZXRlc3QKKyAgICBjZCBleHRlcm5hbC9nb29nbGV0ZXN0CisgICAgZ2l0IGNoZWNrb3V0IHRhZ3MvcmVsZWFzZS0xLjguMQorCitiZWZvcmUgY29uZmlndXJpbmcgeW91ciBidWlsZCB3aXRoIENNYWtlLgorCitJZiB5b3UgZG8gbm90IG5lZWQgdGhlIHRlc3RzLCB0aGVyZSBpcyBubyBuZWVkIHRvIGRvd25sb2FkIHRoaXMKK2ZyYW1ld29yay4KKworIyMjIyBWdWxrYW4tTG9hZGVyCisKK1RoZSB2YWxpZGF0aW9uIGxheWVyIHRlc3RzIGRlcGVuZCBvbiB0aGUgVnVsa2FuIGxvYWRlciB3aGVuIHRoZXkgZXhlY3V0ZSBhbmQKK3NvIGEgbG9hZGVyIGlzIG5lZWRlZCBvbmx5IGlmIHRoZSB0ZXN0cyBhcmUgYnVpbHQgYW5kIHJ1bi4KKworQSBsb2FkZXIgY2FuIGJlIHVzZWQgZnJvbSBhbiBpbnN0YWxsZWQgTHVuYXJHIFNESywgYW4gaW5zdGFsbGVkIExpbnV4IHBhY2thZ2UsCitvciBmcm9tIGEgZHJpdmVyIGluc3RhbGxhdGlvbiBvbiBXaW5kb3dzLgorCitJZiBhIGxvYWRlciBpcyBub3QgYXZhaWxhYmxlIGZyb20gYW55IG9mIHRoZXNlIG1ldGhvZHMgYW5kL29yIGl0IGlzIGltcG9ydGFudAordG8gdXNlIGEgbG9hZGVyIGJ1aWx0IGZyb20gYSByZXBvc2l0b3J5LCB0aGVuIHlvdSBtdXN0IGJ1aWxkIHRoZQorW1Z1bGthbi1Mb2FkZXIgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tTG9hZGVyLmdpdCkKK3dpdGggaXRzIGluc3RhbGwgdGFyZ2V0LiBUYWtlIG5vdGUgb2YgaXRzIGluc3RhbGwgZGlyZWN0b3J5IGxvY2F0aW9uIGFuZCBwYXNzCitpdCBvbiB0aGUgQ01ha2UgY29tbWFuZCBsaW5lIGZvciBidWlsZGluZyB0aGlzIHJlcG9zaXRvcnksIGFzIGRlc2NyaWJlZCBiZWxvdy4KKworSWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gcnVuIHRoZSB0ZXN0cywgeW91IGRvIG5vdCBuZWVkIGEgVnVsa2FuIGxvYWRlci4KKworIyMjIEJ1aWxkIGFuZCBJbnN0YWxsIERpcmVjdG9yaWVzCisKK0EgY29tbW9uIGNvbnZlbnRpb24gaXMgdG8gcGxhY2UgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpbiB0aGUgdG9wIGRpcmVjdG9yeSBvZgordGhlIHJlcG9zaXRvcnkgd2l0aCBhIG5hbWUgb2YgYGJ1aWxkYCBhbmQgcGxhY2UgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGFzIGEKK2NoaWxkIG9mIHRoZSBidWlsZCBkaXJlY3Rvcnkgd2l0aCB0aGUgbmFtZSBgaW5zdGFsbGAuIFRoZSByZW1haW5kZXIgb2YgdGhlc2UKK2luc3RydWN0aW9ucyBmb2xsb3cgdGhpcyBjb252ZW50aW9uLCBhbHRob3VnaCB5b3UgY2FuIHVzZSBhbnkgbmFtZSBmb3IgdGhlc2UKK2RpcmVjdG9yaWVzIGFuZCBwbGFjZSB0aGVtIGluIGFueSBsb2NhdGlvbi4KKworIyMjIEJ1aWxkaW5nIERlcGVuZGVudCBSZXBvc2l0b3JpZXMgd2l0aCBLbm93bi1Hb29kIFJldmlzaW9ucworCitUaGVyZSBpcyBhIFB5dGhvbiB1dGlsaXR5IHNjcmlwdCwgYHNjcmlwdHMvdXBkYXRlX2RlcHMucHlgLCB0aGF0IHlvdSBjYW4gdXNlIHRvCitnYXRoZXIgYW5kIGJ1aWxkIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzIG1lbnRpb25lZCBhYm92ZS4gVGhpcyBzY3JpcHQgdXNlcworaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBgc2NyaXB0cy9rbm93bl9nb29kLmpzb25gIGZpbGUgdG8gY2hlY2sgb3V0IGRlcGVuZGVudAorcmVwb3NpdG9yeSByZXZpc2lvbnMgdGhhdCBhcmUga25vd24gdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZXZpc2lvbiBvZiB0aGlzCityZXBvc2l0b3J5IHRoYXQgeW91IGN1cnJlbnRseSBoYXZlIGNoZWNrZWQgb3V0LiBBcyBzdWNoLCB0aGlzIHNjcmlwdCBpcyB1c2VmdWwKK2FzIGEgcXVpY2stc3RhcnQgdG9vbCBmb3IgY29tbW9uIHVzZSBjYXNlcyBhbmQgZGVmYXVsdCBjb25maWd1cmF0aW9ucy4KKworRm9yIGFsbCBwbGF0Zm9ybXMsIHN0YXJ0IHdpdGg6CisKKyAgICBnaXQgY2xvbmUgZ2l0QGdpdGh1Yi5jb206S2hyb25vc0dyb3VwL1Z1bGthbi1WYWxpZGF0aW9uTGF5ZXJzLmdpdAorICAgIGNkIFZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorCitGb3IgNjQtYml0IExpbnV4IGFuZCBNYWNPUywgY29udGludWUgd2l0aDoKKworICAgIC4uL3NjcmlwdHMvdXBkYXRlX2RlcHMucHkKKyAgICBjbWFrZSAtQyBoZWxwZXIuY21ha2UgLi4KKyAgICBjbWFrZSAtLWJ1aWxkIC4KKworRm9yIDY0LWJpdCBXaW5kb3dzLCBjb250aW51ZSB3aXRoOgorCisgICAgLi5cc2NyaXB0c1x1cGRhdGVfZGVwcy5weSAtLWFyY2ggeDY0CisgICAgY21ha2UgLUEgeDY0IC1DIGhlbHBlci5jbWFrZSAuLgorICAgIGNtYWtlIC0tYnVpbGQgLgorCitGb3IgMzItYml0IFdpbmRvd3MsIGNvbnRpbnVlIHdpdGg6CisKKyAgICAuLlxzY3JpcHRzXHVwZGF0ZV9kZXBzLnB5IC0tYXJjaCBXaW4zMgorICAgIGNtYWtlIC1BIFdpbjMyIC1DIGhlbHBlci5jbWFrZSAuLgorICAgIGNtYWtlIC0tYnVpbGQgLgorCitQbGVhc2Ugc2VlIHRoZSBtb3JlIGRldGFpbGVkIGJ1aWxkIGluZm9ybWF0aW9uIGxhdGVyIGluIHRoaXMgZmlsZSBpZiB5b3UgaGF2ZQorc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgdGhlc2UgY29tcG9uZW50cy4KKworIyMjIyBOb3RlcworCistIFlvdSBtYXkgbmVlZCB0byBhZGp1c3Qgc29tZSBvZiB0aGUgQ01ha2Ugb3B0aW9ucyBiYXNlZCBvbiB5b3VyIHBsYXRmb3JtLiBTZWUKKyAgdGhlIHBsYXRmb3JtLXNwZWNpZmljIHNlY3Rpb25zIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuCistIFRoZSBgdXBkYXRlX2RlcHMucHlgIHNjcmlwdCBmZXRjaGVzIGFuZCBidWlsZHMgdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgaW4KKyAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoZW4gaXQgaXMgaW52b2tlZC4gSW4gdGhpcyBjYXNlLCB0aGV5IGFyZSBidWlsdCBpbgorICB0aGUgYGJ1aWxkYCBkaXJlY3RvcnkuCistIFRoZSBgYnVpbGRgIGRpcmVjdG9yeSBpcyBhbHNvIGJlaW5nIHVzZWQgdG8gYnVpbGQgdGhpcworICAoVnVsa2FuLVZhbGlkYXRpb25MYXllcnMpIHJlcG9zaXRvcnkuIEJ1dCB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IGNvbmZsaWN0cworICBpbnNpZGUgdGhlIGBidWlsZGAgZGlyZWN0b3J5IGJldHdlZW4gdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgYW5kIHRoZQorICBidWlsZCBmaWxlcyBmb3IgdGhpcyByZXBvc2l0b3J5LgorLSBUaGUgYC0tZGlyYCBvcHRpb24gZm9yIGB1cGRhdGVfZGVwcy5weWAgY2FuIGJlIHVzZWQgdG8gcmVsb2NhdGUgdGhlCisgIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgdG8gYW5vdGhlciBhcmJpdHJhcnkgZGlyZWN0b3J5IHVzaW5nIGFuIGFic29sdXRlIG9yCisgIHJlbGF0aXZlIHBhdGguCistIFRoZSBgdXBkYXRlX2RlcHMucHlgIHNjcmlwdCBnZW5lcmF0ZXMgYSBmaWxlIG5hbWVkIGBoZWxwZXIuY21ha2VgIGFuZCBwbGFjZXMKKyAgaXQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzIChgYnVpbGRgIGluIHRoaXMKKyAgY2FzZSkuIFRoaXMgZmlsZSBjb250YWlucyBDTWFrZSBjb21tYW5kcyB0byBzZXQgdGhlIENNYWtlIGAqX0lOU1RBTExfRElSYAorICB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCB0byBwb2ludCB0byB0aGUgaW5zdGFsbCBhcnRpZmFjdHMgb2YgdGhlIGRlcGVuZGVudAorICByZXBvc2l0b3JpZXMuIFlvdSBjYW4gdXNlIHRoaXMgZmlsZSB3aXRoIHRoZSBgY21ha2UgLUNgIG9wdGlvbiB0byBzZXQgdGhlc2UKKyAgdmFyaWFibGVzIHdoZW4geW91IGdlbmVyYXRlIHlvdXIgYnVpbGQgZmlsZXMgd2l0aCBDTWFrZS4gVGhpcyBsZXRzIHlvdSBhdm9pZAorICBlbnRlcmluZyBzZXZlcmFsIGAqX0lOU1RBTExfRElSYCB2YXJpYWJsZSBzZXR0aW5ncyBvbiB0aGUgQ01ha2UgY29tbWFuZCBsaW5lLgorLSBJZiB1c2luZyAiTUlOR1ciIChHaXQgRm9yIFdpbmRvd3MpLCB5b3UgbWF5IHdpc2ggdG8gcnVuCisgIGB3aW5wdHkgdXBkYXRlX2RlcHMucHlgIGluIG9yZGVyIHRvIGF2b2lkIGJ1ZmZlcmluZyBhbGwgb2YgdGhlIHNjcmlwdCdzCisgICJwcmludCIgb3V0cHV0IHVudGlsIHRoZSBlbmQgYW5kIHRvIHJldGFpbiB0aGUgYWJpbGl0eSB0byBpbnRlcnJ1cHQgc2NyaXB0CisgIGV4ZWN1dGlvbi4KKy0gUGxlYXNlIHVzZSBgdXBkYXRlX2RlcHMucHkgLS1oZWxwYCB0byBsaXN0IGFkZGl0aW9uYWwgb3B0aW9ucyBhbmQgcmVhZCB0aGUKKyAgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBpbiBgdXBkYXRlX2RlcHMucHlgIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCisjIyMgR2VuZXJhdGVkIHNvdXJjZSBjb2RlCisKK1RoaXMgcmVwb3NpdG9yeSBjb250YWlucyBnZW5lcmF0ZWQgc291cmNlIGNvZGUgaW4gdGhlIGBsYXllcnMvZ2VuZXJhdGVkYAorZGlyZWN0b3J5IHdoaWNoIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBtb2RpZmllZCBkaXJlY3RseS4gSW5zdGVhZCwgY2hhbmdlcyBzaG91bGQgYmUKK21hZGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZ2VuZXJhdG9yIGluIHRoZSBgc2NyaXB0c2AgZGlyZWN0b3J5LiBUaGUgc291cmNlIGZpbGVzIGNhbgordGhlbiBiZSByZWdlbmVyYXRlZCB1c2luZyBgc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHlgOgorCisgICAgcHl0aG9uMyBzY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weSBQQVRIX1RPX1ZVTEtBTl9IRUFERVJTX1JFR0lTVFJZX0RJUgorCitBIGhlbHBlciBDTWFrZSB0YXJnZXQgYFZ1bGthblZMX2dlbmVyYXRlZF9zb3VyY2VgIGlzIGFsc28gcHJvdmlkZWQgdG8gc2ltcGxpZnkKK3RoZSBpbnZvY2F0aW9uIG9mIGBzY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weWAgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5OgorCisgICAgY21ha2UgLS1idWlsZCAuIC0tdGFyZ2V0IFZ1bGthblZMX2dlbmVyYXRlZF9zb3VyY2UKKworIyMjIEJ1aWxkIE9wdGlvbnMKKworV2hlbiBnZW5lcmF0aW5nIG5hdGl2ZSBwbGF0Zm9ybSBidWlsZCBmaWxlcyB0aHJvdWdoIENNYWtlLCBzZXZlcmFsIG9wdGlvbnMgY2FuCitiZSBzcGVjaWZpZWQgdG8gY3VzdG9taXplIHRoZSBidWlsZC4gU29tZSBvZiB0aGUgb3B0aW9ucyBhcmUgYmluYXJ5IG9uL29mZgorb3B0aW9ucywgd2hpbGUgb3RoZXJzIHRha2UgYSBzdHJpbmcgYXMgaW5wdXQuIFRoZSBmb2xsb3dpbmcgaXMgYSB0YWJsZSBvZiBhbGwKK29uL29mZiBvcHRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhpcyByZXBvc2l0b3J5OgorCit8IE9wdGlvbiB8IFBsYXRmb3JtIHwgRGVmYXVsdCB8IERlc2NyaXB0aW9uIHwKK3wgLS0tLS0tIHwgLS0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLS0tLS0gfAorfCBCVUlMRF9MQVlFUlMgfCBBbGwgfCBgT05gIHwgQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRpb24gbGF5ZXJzIGFyZSBidWlsdC4gfAorfCBCVUlMRF9MQVlFUl9TVVBQT1JUX0ZJTEVTIHwgQWxsIHwgYE9GRmAgfCBDb250cm9scyB3aGV0aGVyIG9yIG5vdCBsYXllciBzdXBwb3J0IGZpbGVzIGFyZSBidWlsdCBpZiB0aGUgbGF5ZXJzIGFyZSBub3QgYnVpbHQuIHwKK3wgQlVJTERfVEVTVFMgfCBBbGwgfCBgPz8/YCB8IENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0aW9uIGxheWVyIHRlc3RzIGFyZSBidWlsdC4gVGhlIGRlZmF1bHQgaXMgYE9OYCB3aGVuIHRoZSBHb29nbGUgVGVzdCByZXBvc2l0b3J5IGlzIGNsb25lZCBpbnRvIHRoZSBgZXh0ZXJuYWxgIGRpcmVjdG9yeS4gIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgaXMgYE9GRmAuIHwKK3wgSU5TVEFMTF9URVNUUyB8IEFsbCB8IGBPRkZgIHwgQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRpb24gbGF5ZXIgdGVzdHMgYXJlIGluc3RhbGxlZC4gVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBhIGNvcHkgb2YgR29vZ2xlIFRlc3QgaXMgYXZhaWxhYmxlCit8IEJVSUxEX1dTSV9YQ0JfU1VQUE9SVCB8IExpbnV4IHwgYE9OYCB8IEJ1aWxkIHRoZSBjb21wb25lbnRzIHdpdGggWENCIHN1cHBvcnQuIHwKK3wgQlVJTERfV1NJX1hMSUJfU1VQUE9SVCB8IExpbnV4IHwgYE9OYCB8IEJ1aWxkIHRoZSBjb21wb25lbnRzIHdpdGggWGxpYiBzdXBwb3J0LiB8Cit8IEJVSUxEX1dTSV9XQVlMQU5EX1NVUFBPUlQgfCBMaW51eCB8IGBPTmAgfCBCdWlsZCB0aGUgY29tcG9uZW50cyB3aXRoIFdheWxhbmQgc3VwcG9ydC4gfAorfCBVU0VfQ0NBQ0hFIHwgTGludXggfCBgT0ZGYCB8IEVuYWJsZSBjYWNoaW5nIHdpdGggdGhlIENDYWNoZSBwcm9ncmFtLiB8CisKK1RoZSBmb2xsb3dpbmcgaXMgYSB0YWJsZSBvZiBhbGwgc3RyaW5nIG9wdGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGlzIHJlcG9zaXRvcnk6CisKK3wgT3B0aW9uIHwgUGxhdGZvcm0gfCBEZWZhdWx0IHwgRGVzY3JpcHRpb24gfAorfCAtLS0tLS0gfCAtLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8Cit8IENNQUtFX09TWF9ERVBMT1lNRU5UX1RBUkdFVCB8IE1hY09TIHwgYDEwLjEyYCB8IFRoZSBtaW5pbXVtIHZlcnNpb24gb2YgTWFjT1MgZm9yIGxvYWRlciBkZXBsb3ltZW50LiB8CisKK1RoZXNlIHZhcmlhYmxlcyBzaG91bGQgYmUgc2V0IHVzaW5nIHRoZSBgLURgIG9wdGlvbiB3aGVuIGludm9raW5nIENNYWtlIHRvCitnZW5lcmF0ZSB0aGUgbmF0aXZlIHBsYXRmb3JtIGZpbGVzLgorCisjIyBCdWlsZGluZyBPbiBXaW5kb3dzCisKKyMjIyBXaW5kb3dzIERldmVsb3BtZW50IEVudmlyb25tZW50IFJlcXVpcmVtZW50cworCistIFdpbmRvd3MKKyAgLSBBbnkgUGVyc29uYWwgQ29tcHV0ZXIgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgTWljcm9zb2Z0CistIE1pY3Jvc29mdCBbVmlzdWFsIFN0dWRpb10oaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS8pCisgIC0gVmVyc2lvbnMKKyAgICAtIFsyMDE1XShodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL29sZGVyLWRvd25sb2Fkcy8pCisgICAgLSBbMjAxN10oaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy9kb3dubG9hZHMvKQorICAtIFRoZSBDb21tdW5pdHkgRWRpdGlvbiBvZiBlYWNoIG9mIHRoZSBhYm92ZSB2ZXJzaW9ucyBpcyBzdWZmaWNpZW50LCBhcworICAgIHdlbGwgYXMgYW55IG1vcmUgY2FwYWJsZSBlZGl0aW9uLgorLSBbQ01ha2UgMy4xMC4yXShodHRwczovL2NtYWtlLm9yZy9maWxlcy92My4xMC9jbWFrZS0zLjEwLjItd2luNjQteDY0LnppcCkgaXMgcmVjb21tZW5kZWQuCisgIC0gVXNlIHRoZSBpbnN0YWxsZXIgb3B0aW9uIHRvIGFkZCBDTWFrZSB0byB0aGUgc3lzdGVtIFBBVEgKKy0gR2l0IENsaWVudCBTdXBwb3J0CisgIC0gW0dpdCBmb3IgV2luZG93c10oaHR0cDovL2dpdC1zY20uY29tL2Rvd25sb2FkL3dpbikgaXMgYSBwb3B1bGFyIHNvbHV0aW9uCisgICAgZm9yIFdpbmRvd3MKKyAgLSBTb21lIElERXMgKGUuZy4sIFtWaXN1YWwgU3R1ZGlvXShodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tLyksCisgICAgW0dpdEh1YiBEZXNrdG9wXShodHRwczovL2Rlc2t0b3AuZ2l0aHViLmNvbS8pKSBoYXZlIGludGVncmF0ZWQKKyAgICBHaXQgY2xpZW50IHN1cHBvcnQKKworIyMjIFdpbmRvd3MgQnVpbGQgLSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbworCitUaGUgZ2VuZXJhbCBhcHByb2FjaCBpcyB0byBydW4gQ01ha2UgdG8gZ2VuZXJhdGUgdGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdAorZmlsZXMuIFRoZW4gZWl0aGVyIHJ1biBDTWFrZSB3aXRoIHRoZSBgLS1idWlsZGAgb3B0aW9uIHRvIGJ1aWxkIGZyb20gdGhlCitjb21tYW5kIGxpbmUgb3IgdXNlIHRoZSBWaXN1YWwgU3R1ZGlvIElERSB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgc29sdXRpb24gYW5kCit3b3JrIHdpdGggdGhlIHNvbHV0aW9uIGludGVyYWN0aXZlbHkuCisKKyMjIyMgV2luZG93cyBRdWljayBTdGFydAorCisgICAgY2QgVnVsa2FuLVZhbGlkYXRpb25MYXllcnMKKyAgICBta2RpciBidWlsZAorICAgIGNkIGJ1aWxkCisgICAgY21ha2UgLUEgeDY0IC1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpciBcCisgICAgICAgICAgICAgICAgIC1ER0xTTEFOR19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIC4uCisgICAgY21ha2UgLS1idWlsZCAuCisKK1RoZSBhYm92ZSBjb21tYW5kcyBpbnN0cnVjdCBDTWFrZSB0byBmaW5kIGFuZCB1c2UgdGhlIGRlZmF1bHQgVmlzdWFsIFN0dWRpbworaW5zdGFsbGF0aW9uIHRvIGdlbmVyYXRlIGEgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBhbmQgcHJvamVjdHMgZm9yIHRoZSB4NjQKK2FyY2hpdGVjdHVyZS4gVGhlIHNlY29uZCBDTWFrZSBjb21tYW5kIGJ1aWxkcyB0aGUgRGVidWcgKGRlZmF1bHQpCitjb25maWd1cmF0aW9uIG9mIHRoZSBzb2x1dGlvbi4KKworU2VlIGJlbG93IGZvciB0aGUgZGV0YWlscy4KKworIyMjIyBVc2UgYENNYWtlYCB0byBDcmVhdGUgdGhlIFZpc3VhbCBTdHVkaW8gUHJvamVjdCBGaWxlcworCitDaGFuZ2UgeW91ciBjdXJyZW50IGRpcmVjdG9yeSB0byB0aGUgdG9wIG9mIHRoZSBjbG9uZWQgcmVwb3NpdG9yeSBkaXJlY3RvcnksCitjcmVhdGUgYSBidWlsZCBkaXJlY3RvcnkgYW5kIGdlbmVyYXRlIHRoZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXM6CisKKyAgICBjZCBWdWxrYW4tVmFsaWRhdGlvbkxheWVycworICAgIG1rZGlyIGJ1aWxkCisgICAgY2QgYnVpbGQKKyAgICBjbWFrZSAtQSB4NjQgLURWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIFwKKyAgICAgICAgICAgICAgICAgLURHTFNMQU5HX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIgLi4KKworPiBOb3RlOiBUaGUgYC4uYCBwYXJhbWV0ZXIgdGVsbHMgYGNtYWtlYCB0aGUgbG9jYXRpb24gb2YgdGhlIHRvcCBvZiB0aGUKKz4gcmVwb3NpdG9yeS4gSWYgeW91IHBsYWNlIHlvdXIgYnVpbGQgZGlyZWN0b3J5IHNvbWVwbGFjZSBlbHNlLCB5b3UnbGwgbmVlZCB0bworPiBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0b3AgZGlmZmVyZW50bHkuCisKK1RoZSBgLUFgIG9wdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBlaXRoZXIgdGhlICJXaW4zMiIgb3IgIng2NCIgYXJjaGl0ZWN0dXJlLgorCitJZiBhIGdlbmVyYXRvciBmb3IgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIFZpc3VhbCBTdHVkaW8gaXMgcmVxdWlyZWQsIHlvdSBjYW4KK3NwZWNpZnkgaXQgZm9yIFZpc3VhbCBTdHVkaW8gMjAxNSwgZm9yIGV4YW1wbGUsIHdpdGg6CisKKyAgICA2NC1iaXQ6IC1HICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisgICAgMzItYml0OiAtRyAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IgorCitTZWUgdGhpcyBbbGlzdF0oI2NtYWtlLXZpc3VhbC1zdHVkaW8tZ2VuZXJhdG9ycykgb2Ygb3RoZXIgcG9zc2libGUgZ2VuZXJhdG9ycworZm9yIFZpc3VhbCBTdHVkaW8uCisKK1doZW4gZ2VuZXJhdGluZyB0aGUgcHJvamVjdCBmaWxlcywgdGhlIGFic29sdXRlIHBhdGggdG8gYSBWdWxrYW4tSGVhZGVycworaW5zdGFsbCBkaXJlY3RvcnkgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIHRoZQorYFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIHRoZQorYFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSYCBDTWFrZSB2YXJpYWJsZSB3aXRoIHRoZSBgLURgIENNYWtlIG9wdGlvbi4gSW4KK2VpdGhlciBjYXNlLCB0aGUgdmFyaWFibGUgc2hvdWxkIHBvaW50IHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEKK1Z1bGthbi1IZWFkZXJzIHJlcG9zaXRvcnkgYnVpbHQgd2l0aCB0aGUgaW5zdGFsbCB0YXJnZXQuCisKK1doZW4gZ2VuZXJhdGluZyB0aGUgcHJvamVjdCBmaWxlcywgdGhlIGFic29sdXRlIHBhdGggdG8gYSBnbHNsYW5nIGluc3RhbGwKK2RpcmVjdG9yeSBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgdGhlCitgR0xTTEFOR19JTlNUQUxMX0RJUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkgc2V0dGluZyB0aGUKK2BHTFNMQU5HX0lOU1RBTExfRElSYCBDTWFrZSB2YXJpYWJsZSB3aXRoIHRoZSBgLURgIENNYWtlIG9wdGlvbi4gSW4gZWl0aGVyCitjYXNlLCB0aGUgdmFyaWFibGUgc2hvdWxkIHBvaW50IHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEgZ2xzbGFuZworcmVwb3NpdG9yeSBidWlsdCB3aXRoIHRoZSBpbnN0YWxsIHRhcmdldC4KKworVGhlIGFib3ZlIHN0ZXBzIGNyZWF0ZSBhIFdpbmRvd3Mgc29sdXRpb24gZmlsZSBuYW1lZAorYFZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzLnNsbmAgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKworQXQgdGhpcyBwb2ludCwgeW91IGNhbiBidWlsZCB0aGUgc29sdXRpb24gZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIG9wZW4gdGhlCitnZW5lcmF0ZWQgc29sdXRpb24gd2l0aCBWaXN1YWwgU3R1ZGlvLgorCisjIyMjIEJ1aWxkIHRoZSBTb2x1dGlvbiBGcm9tIHRoZSBDb21tYW5kIExpbmUKKworV2hpbGUgc3RpbGwgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeToKKworICAgIGNtYWtlIC0tYnVpbGQgLgorCit0byBidWlsZCB0aGUgRGVidWcgY29uZmlndXJhdGlvbiAodGhlIGRlZmF1bHQpLCBvcjoKKworICAgIGNtYWtlIC0tYnVpbGQgLiAtLWNvbmZpZyBSZWxlYXNlCisKK3RvIG1ha2UgYSBSZWxlYXNlIGJ1aWxkLgorCisjIyMjIEJ1aWxkIHRoZSBTb2x1dGlvbiBXaXRoIFZpc3VhbCBTdHVkaW8KKworTGF1bmNoIFZpc3VhbCBTdHVkaW8gYW5kIG9wZW4gdGhlICJWdWxrYW4tVmFsaWRhdGlvbkxheWVycy5zbG4iIHNvbHV0aW9uIGZpbGUKK2luIHRoZSBidWlsZCBmb2xkZXIuIFlvdSBtYXkgc2VsZWN0ICJEZWJ1ZyIgb3IgIlJlbGVhc2UiIGZyb20gdGhlIFNvbHV0aW9uCitDb25maWd1cmF0aW9ucyBkcm9wLWRvd24gbGlzdC4gU3RhcnQgYSBidWlsZCBieSBzZWxlY3RpbmcgdGhlIEJ1aWxkLT5CdWlsZAorU29sdXRpb24gbWVudSBpdGVtLgorCisjIyMjIFdpbmRvd3MgSW5zdGFsbCBUYXJnZXQKKworVGhlIENNYWtlIHByb2plY3QgYWxzbyBnZW5lcmF0ZXMgYW4gImluc3RhbGwiIHRhcmdldCB0aGF0IHlvdSBjYW4gdXNlIHRvIGNvcHkKK3RoZSBwcmltYXJ5IGJ1aWxkIGFydGlmYWN0cyB0byBhIHNwZWNpZmljIGxvY2F0aW9uIHVzaW5nIGEgImJpbiwgaW5jbHVkZSwgbGliIgorc3R5bGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBjb2xsZWN0aW5nIHRoZSBhcnRpZmFjdHMgYW5kCitwcm92aWRpbmcgdGhlbSB0byBhbm90aGVyIHByb2plY3QgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlbS4KKworVGhlIGRlZmF1bHQgbG9jYXRpb24gaXMgYCRDTUFLRV9CSU5BUllfRElSXGluc3RhbGxgLCBidXQgY2FuIGJlIGNoYW5nZWQgd2l0aAordGhlIGBDTUFLRV9JTlNUQUxMX1BSRUZJWGAgdmFyaWFibGUgd2hlbiBmaXJzdCBnZW5lcmF0aW5nIHRoZSBwcm9qZWN0IGJ1aWxkCitmaWxlcyB3aXRoIENNYWtlLgorCitZb3UgY2FuIGJ1aWxkIHRoZSBpbnN0YWxsIHRhcmdldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aDoKKworICAgIGNtYWtlIC0tYnVpbGQgLiAtLWNvbmZpZyBSZWxlYXNlIC0tdGFyZ2V0IGluc3RhbGwKKworb3IgYnVpbGQgdGhlIGBJTlNUQUxMYCB0YXJnZXQgZnJvbSB0aGUgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBleHBsb3Jlci4KKworIyMjIyBVc2luZyBhIExvYWRlciBCdWlsdCBmcm9tIGEgUmVwb3NpdG9yeQorCitJZiB5b3UgZG8gbmVlZCB0byBidWlsZCBhbmQgdXNlIHlvdXIgb3duIGxvYWRlciwgYnVpbGQgdGhlIFZ1bGthbi1Mb2FkZXIKK3JlcG9zaXRvcnkgd2l0aCB0aGUgaW5zdGFsbCB0YXJnZXQgYW5kIG1vZGlmeSB5b3VyIENNYWtlIGludm9jYXRpb24gdG8gYWRkIHRoZQorbG9jYXRpb24gb2YgdGhlIGxvYWRlcidzIGluc3RhbGwgZGlyZWN0b3J5OgorCisgICAgY21ha2UgLUEgeDY0IC1EVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpciBcCisgICAgICAgICAgICAgICAgIC1EVlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIFwKKyAgICAgICAgICAgICAgICAgLURHTFNMQU5HX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIgLi4KKworIyMjIFdpbmRvd3MgVGVzdHMgYW5kIERlbW9zCisKK0FmdGVyIG1ha2luZyBhbnkgY2hhbmdlcyB0byB0aGUgcmVwb3NpdG9yeSwgeW91IHNob3VsZCBwZXJmb3JtIHNvbWUgcXVpY2sKK3Nhbml0eSB0ZXN0cywgZXNwZWNpYWxseSB0aGUgaW5jbHVkZWQgbGF5ZXIgdmFsaWRhdGlvbiB0ZXN0cyAodmtfbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cykuCitJbiBhZGRpdGlvbiwgcnVubmluZyBzYW1wbGUgYXBwbGljYXRpb25zIHN1Y2ggYXMgdGhlCitbdmtjdWJlIGRlbW9dKGh0dHBzOi8vd3d3LmdpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Ub29scy5naXQpCit3aXRoIHZhbGlkYXRpb24gZW5hYmxlZCBpcyBhZHZpc2VkLgorCisjIyMgV2luZG93cyBOb3RlcworCisjIyMjIENNYWtlIFZpc3VhbCBTdHVkaW8gR2VuZXJhdG9ycworCitUaGUgY2hvc2VuIGdlbmVyYXRvciBzaG91bGQgbWF0Y2ggb25lIG9mIHRoZSBWaXN1YWwgU3R1ZGlvIHZlcnNpb25zIHRoYXQgeW91CitoYXZlIGluc3RhbGxlZC4gR2VuZXJhdG9yIHN0cmluZ3MgdGhhdCBjb3JyZXNwb25kIHRvIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8KK2luY2x1ZGU6CisKK3wgQnVpbGQgUGxhdGZvcm0gICAgICAgICAgICAgICB8IDY0LWJpdCBHZW5lcmF0b3IgICAgICAgICAgICAgIHwgMzItYml0IEdlbmVyYXRvciAgICAgICAgfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTUgfCAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFdpbjY0IiB8ICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUiIHwKK3wgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxNyB8ICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgV2luNjQiIHwgIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyIgfAorCisjIyMjIFVzaW5nIFRoZSBWdWxrYW4gTG9hZGVyIExpYnJhcnkgaW4gdGhpcyBSZXBvc2l0b3J5IG9uIFdpbmRvd3MKKworVnVsa2FuIHByb2dyYW1zIG11c3QgYmUgYWJsZSB0byBmaW5kIGFuZCB1c2UgdGhlIFZ1bGthbiBsb2FkZXIKKyhgdnVsa2FuLTEuZGxsYCkgbGlicmFyeSBhcyB3ZWxsIGFzIGFueSBvdGhlciBsaWJyYXJpZXMgdGhlIHByb2dyYW0gcmVxdWlyZXMuCitPbmUgY29udmVuaWVudCB3YXkgdG8gZG8gdGhpcyBpcyB0byBjb3B5IHRoZSByZXF1aXJlZCBsaWJyYXJpZXMgaW50byB0aGUgc2FtZQorZGlyZWN0b3J5IGFzIHRoZSBwcm9ncmFtLiBJZiB5b3UgcHJvdmlkZWQgYSBsb2FkZXIgcmVwb3NpdG9yeSBsb2NhdGlvbiB2aWEgdGhlCitgVlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUmAgdmFyaWFibGUsIHRoZSBwcm9qZWN0cyBpbiB0aGlzIHNvbHV0aW9uIGNvcHkgdGhlCitWdWxrYW4gbG9hZGVyIGxpYnJhcnkgYW5kIHRoZSAiZ29vZ2xldGVzdCIgbGlicmFyaWVzIHRvIHRoZQorYGJ1aWxkXHRlc3RzXERlYnVnYCBvciB0aGUgYGJ1aWxkXHRlc3RzXFJlbGVhc2VgIGRpcmVjdG9yeSwgd2hpY2ggaXMgd2hlcmUgdGhlCit0ZXN0IGV4ZWN1dGFibGVzIGFyZSBmb3VuZCwgZGVwZW5kaW5nIG9uIHdoYXQgY29uZmlndXJhdGlvbiB5b3UgYnVpbHQuIChUaGUKK2xheWVyIHZhbGlkYXRpb24gdGVzdHMgdXNlIHRoZSAiZ29vZ2xldGVzdCIgdGVzdGluZyBmcmFtZXdvcmsuKQorCisjIyBCdWlsZGluZyBPbiBMaW51eAorCisjIyMgTGludXggQnVpbGQgUmVxdWlyZW1lbnRzCisKK1RoaXMgcmVwb3NpdG9yeSBoYXMgYmVlbiBidWlsdCBhbmQgdGVzdGVkIG9uIHRoZSB0d28gbW9zdCByZWNlbnQgVWJ1bnR1IExUUwordmVyc2lvbnMuIEN1cnJlbnRseSwgdGhlIG9sZGVzdCBzdXBwb3J0ZWQgdmVyc2lvbiBpcyBVYnVudHUgMTYuMDQsIG1lYW5pbmcKK3RoYXQgdGhlIG1pbmltdW0gb2ZmaWNpYWxseSBzdXBwb3J0ZWQgQysrMTEgY29tcGlsZXIgdmVyc2lvbiBpcyBHQ0MgNS40LjAsCithbHRob3VnaCBlYXJsaWVyIHZlcnNpb25zIG1heSB3b3JrLiBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIHRvIGFkYXB0IHRoaXMKK3JlcG9zaXRvcnkgdG8gb3RoZXIgTGludXggZGlzdHJpYnV0aW9ucy4KKworW0NNYWtlIDMuMTAuMl0oaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLUxpbnV4LXg4Nl82NC50YXIuZ3opIGlzIHJlY29tbWVuZGVkLgorCisjIyMjIFJlcXVpcmVkIFBhY2thZ2UgTGlzdAorCisgICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgZ2l0IGJ1aWxkLWVzc2VudGlhbCBsaWJ4MTEteGNiLWRldiBcCisgICAgICAgIGxpYnhrYmNvbW1vbi1kZXYgbGlid2F5bGFuZC1kZXYgbGlieHJhbmRyLWRldiBcCisgICAgICAgIGxpYmVnbDEtbWVzYS1kZXYKKwkJCisjIyMjIyBSZXF1aXJlZCBwYWNrYWdlIGZvciBVYnVudHUgMTguMDQgdXNlcnMKKworRm9yIHB5dGhvbjIgdXNlcnMKKworICAgIHN1ZG8gYXB0IGluc3RhbGwgcHl0aG9uLWRpc3R1dGlscworCitvciBmb3IgcHl0aG9uMyB1c2VycworCisJc3VkbyBhcHQgaW5zdGFsbCBweXRob24zLWRpc3R1dGlscworCisjIyMgTGludXggQnVpbGQKKworVGhlIGdlbmVyYWwgYXBwcm9hY2ggaXMgdG8gcnVuIENNYWtlIHRvIGdlbmVyYXRlIG1ha2UgZmlsZXMuIFRoZW4gZWl0aGVyIHJ1bgorQ01ha2Ugd2l0aCB0aGUgYC0tYnVpbGRgIG9wdGlvbiBvciBgbWFrZWAgdG8gYnVpbGQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCisjIyMjIExpbnV4IFF1aWNrIFN0YXJ0CisKKyAgICBjZCBWdWxrYW4tVmFsaWRhdGlvbkxheWVycworICAgIG1rZGlyIGJ1aWxkCisgICAgY2QgYnVpbGQKKyAgICBjbWFrZSAtRFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIgXAorICAgICAgICAgIC1ER0xTTEFOR19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIC4uCisgICAgbWFrZQorCitTZWUgYmVsb3cgZm9yIHRoZSBkZXRhaWxzLgorCisjIyMjIFVzZSBDTWFrZSB0byBDcmVhdGUgdGhlIE1ha2UgRmlsZXMKKworQ2hhbmdlIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIHRvcCBvZiB0aGUgY2xvbmVkIHJlcG9zaXRvcnkgZGlyZWN0b3J5LAorY3JlYXRlIGEgYnVpbGQgZGlyZWN0b3J5IGFuZCBnZW5lcmF0ZSB0aGUgbWFrZSBmaWxlcy4KKworICAgIGNkIFZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzCisgICAgbWtkaXIgYnVpbGQKKyAgICBjZCBidWlsZAorICAgIGNtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyBcCisgICAgICAgICAgLURWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIFwKKyAgICAgICAgICAtREdMU0xBTkdfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpciBcCisgICAgICAgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD1pbnN0YWxsIC4uCisKKz4gTm90ZTogVGhlIGAuLmAgcGFyYW1ldGVyIHRlbGxzIGBjbWFrZWAgdGhlIGxvY2F0aW9uIG9mIHRoZSB0b3Agb2YgdGhlCis+IHJlcG9zaXRvcnkuIElmIHlvdSBwbGFjZSB5b3VyIGBidWlsZGAgZGlyZWN0b3J5IHNvbWVwbGFjZSBlbHNlLCB5b3UnbGwgbmVlZAorPiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0b3AgZGlmZmVyZW50bHkuCisKK1VzZSBgLURDTUFLRV9CVUlMRF9UWVBFYCB0byBzcGVjaWZ5IGEgRGVidWcgb3IgUmVsZWFzZSBidWlsZC4KKworV2hlbiBnZW5lcmF0aW5nIHRoZSBwcm9qZWN0IGZpbGVzLCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIFZ1bGthbi1IZWFkZXJzCitpbnN0YWxsIGRpcmVjdG9yeSBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgdGhlCitgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJgIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgdGhlCitgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJgIENNYWtlIHZhcmlhYmxlIHdpdGggdGhlIGAtRGAgQ01ha2Ugb3B0aW9uLiBJbgorZWl0aGVyIGNhc2UsIHRoZSB2YXJpYWJsZSBzaG91bGQgcG9pbnQgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYQorVnVsa2FuLUhlYWRlcnMgcmVwb3NpdG9yeSBidWlsdCB3aXRoIHRoZSBpbnN0YWxsIHRhcmdldC4KKworV2hlbiBnZW5lcmF0aW5nIHRoZSBwcm9qZWN0IGZpbGVzLCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIGdsc2xhbmcgaW5zdGFsbAorZGlyZWN0b3J5IG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB0aGUKK2BHTFNMQU5HX0lOU1RBTExfRElSYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIHRoZQorYEdMU0xBTkdfSU5TVEFMTF9ESVJgIENNYWtlIHZhcmlhYmxlIHdpdGggdGhlIGAtRGAgQ01ha2Ugb3B0aW9uLiBJbiBlaXRoZXIKK2Nhc2UsIHRoZSB2YXJpYWJsZSBzaG91bGQgcG9pbnQgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYSBnbHNsYW5nCityZXBvc2l0b3J5IGJ1aWx0IHdpdGggdGhlIGluc3RhbGwgdGFyZ2V0LgorCis+IE5vdGU6IEZvciBMaW51eCwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGBDTUFLRV9JTlNUQUxMX1BSRUZJWGAgaXMKKz4gYC91c3IvbG9jYWxgLCB3aGljaCB3b3VsZCBiZSB1c2VkIGlmIHlvdSBkbyBub3Qgc3BlY2lmeQorPiBgQ01BS0VfSU5TVEFMTF9QUkVGSVhgLiBJbiB0aGlzIGNhc2UsIHlvdSBtYXkgbmVlZCB0byB1c2UgYHN1ZG9gIHRvIGluc3RhbGwKKz4gdG8gc3lzdGVtIGRpcmVjdG9yaWVzIGxhdGVyIHdoZW4geW91IHJ1biBgbWFrZSBpbnN0YWxsYC4KKworIyMjIyBCdWlsZCB0aGUgUHJvamVjdAorCitZb3UgY2FuIGp1c3QgcnVuIGBtYWtlYCB0byBiZWdpbiB0aGUgYnVpbGQuCisKK1RvIHNwZWVkIHVwIHRoZSBidWlsZCBvbiBhIG11bHRpLWNvcmUgbWFjaGluZSwgdXNlIHRoZSBgLWpgIG9wdGlvbiBmb3IgYG1ha2VgCit0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29yZXMgdG8gdXNlIGZvciB0aGUgYnVpbGQuIEZvciBleGFtcGxlOgorCisgICAgbWFrZSAtajQKKworWW91IGNhbiBhbHNvIHVzZQorCisgICAgY21ha2UgLS1idWlsZCAuCisKK0lmIHlvdXIgYnVpbGQgc3lzdGVtIHN1cHBvcnRzIGNjYWNoZSwgeW91IGNhbiBlbmFibGUgdGhhdCB2aWEgQ01ha2Ugb3B0aW9uIGAtRFVTRV9DQ0FDSEU9T25gCisKKyMjIyBMaW51eCBOb3RlcworCisjIyMjIFdTSSBTdXBwb3J0IEJ1aWxkIE9wdGlvbnMKKworQnkgZGVmYXVsdCwgdGhlIHJlcG9zaXRvcnkgY29tcG9uZW50cyBhcmUgYnVpbHQgd2l0aCBzdXBwb3J0IGZvciB0aGUKK1Z1bGthbi1kZWZpbmVkIFdTSSBkaXNwbGF5IHNlcnZlcnM6IFhjYiwgWGxpYiwgYW5kIFdheWxhbmQuIEl0IGlzIHJlY29tbWVuZGVkCit0byBidWlsZCB0aGUgcmVwb3NpdG9yeSBjb21wb25lbnRzIHdpdGggc3VwcG9ydCBmb3IgdGhlc2UgZGlzcGxheSBzZXJ2ZXJzIHRvCittYXhpbWl6ZSB0aGVpciB1c2FiaWxpdHkgYWNyb3NzIExpbnV4IHBsYXRmb3Jtcy4gSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGJ1aWxkCit0aGVzZSBtb2R1bGVzIHdpdGhvdXQgc3VwcG9ydCBmb3Igb25lIG9mIHRoZSBkaXNwbGF5IHNlcnZlcnMsIHRoZSBhcHByb3ByaWF0ZQorQ01ha2Ugb3B0aW9uIG9mIHRoZSBmb3JtIGBCVUlMRF9XU0lfeHh4X1NVUFBPUlRgIGNhbiBiZSBzZXQgdG8gYE9GRmAuCisKKyMjIyMgTGludXggSW5zdGFsbCB0byBTeXN0ZW0gRGlyZWN0b3JpZXMKKworSW5zdGFsbGluZyB0aGUgZmlsZXMgcmVzdWx0aW5nIGZyb20geW91ciBidWlsZCB0byB0aGUgc3lzdGVtcyBkaXJlY3RvcmllcyBpcworb3B0aW9uYWwgc2luY2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiB1c3VhbGx5IGJlIHVzZWQgaW5zdGVhZCB0byBsb2NhdGUgdGhlCitiaW5hcmllcy4gVGhlcmUgYXJlIGFsc28gcmlza3Mgd2l0aCBpbnRlcmZlcmluZyB3aXRoIGJpbmFyaWVzIGluc3RhbGxlZCBieQorcGFja2FnZXMuIElmIHlvdSBhcmUgY2VydGFpbiB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGluc3RhbGwgeW91ciBiaW5hcmllcyB0bworc3lzdGVtIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHByb2NlZWQgd2l0aCB0aGVzZSBpbnN0cnVjdGlvbnMuCisKK0Fzc3VtaW5nIHRoYXQgeW91J3ZlIGJ1aWx0IHRoZSBjb2RlIGFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgdGhlIGN1cnJlbnQKK2RpcmVjdG9yeSBpcyBzdGlsbCBgYnVpbGRgLCB5b3UgY2FuIGV4ZWN1dGU6CisKKyAgICBzdWRvIG1ha2UgaW5zdGFsbAorCitUaGlzIGNvbW1hbmQgaW5zdGFsbHMgZmlsZXMgdG8gYC91c3IvbG9jYWxgIGlmIG5vIGBDTUFLRV9JTlNUQUxMX1BSRUZJWGAgaXMKK3NwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBidWlsZCBmaWxlcyB3aXRoIENNYWtlOgorCistIGAvdXNyL2xvY2FsL2xpYmA6ICBWdWxrYW4gbGF5ZXJzIHNoYXJlZCBvYmplY3RzCistIGAvdXNyL2xvY2FsL3NoYXJlL3Z1bGthbi9leHBsaWNpdF9sYXllci5kYDogIExheWVyIEpTT04gZmlsZXMKKworWW91IG1heSBuZWVkIHRvIHJ1biBgbGRjb25maWdgIGluIG9yZGVyIHRvIHJlZnJlc2ggdGhlIHN5c3RlbSBsb2FkZXIgc2VhcmNoCitjYWNoZSBvbiBzb21lIExpbnV4IHN5c3RlbXMuCisKK1lvdSBjYW4gZnVydGhlciBjdXN0b21pemUgdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBieSBzZXR0aW5nIGFkZGl0aW9uYWwKK0NNYWtlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGVpciBkZWZhdWx0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3b3VsZCBsaWtlIHRvCitpbnN0YWxsIHRvIGAvdG1wL2J1aWxkYCBpbnN0ZWFkIG9mIGAvdXNyL2xvY2FsYCwgb24geW91ciBDTWFrZSBjb21tYW5kIGxpbmUKK3NwZWNpZnk6CisKKyAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPS90bXAvYnVpbGQKKworVGhlbiBydW4gYG1ha2UgaW5zdGFsbGAgYXMgYmVmb3JlLiBUaGUgaW5zdGFsbCBzdGVwIHBsYWNlcyB0aGUgZmlsZXMgaW4KK2AvdG1wL2J1aWxkYC4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBjb2xsZWN0aW5nIHRoZSBhcnRpZmFjdHMgYW5kIHByb3ZpZGluZwordGhlbSB0byBhbm90aGVyIHByb2plY3QgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlbS4KKworU2VlIHRoZSBDTWFrZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhlc2UgdmFyaWFibGVzIHRvCitmdXJ0aGVyIGN1c3RvbWl6ZSB5b3VyIGluc3RhbGxhdGlvbi4KKworQWxzbyBzZWUgdGhlIGBMb2FkZXJBbmRMYXllckludGVyZmFjZWAgZG9jdW1lbnQgaW4gdGhlIGBsb2FkZXJgIGZvbGRlciBvZiB0aGUKK1Z1bGthbi1Mb2FkZXIgcmVwb3NpdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBsb2FkZXIgYW5kIGxheWVyCitvcGVyYXRpb24uCisKKyMjIyMgTGludXggVW5pbnN0YWxsCisKK1RvIHVuaW5zdGFsbCB0aGUgZmlsZXMgZnJvbSB0aGUgc3lzdGVtIGRpcmVjdG9yaWVzLCB5b3UgY2FuIGV4ZWN1dGU6CisKKyAgICBzdWRvIG1ha2UgdW5pbnN0YWxsCisKKyMjIyMgTGludXggVGVzdHMKKworQnVpbGQgYW5kIHJ1biB0aGUgYHZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHNgLCBpbiB0aGUgdGVzdHMgc3ViZGlyZWN0b3J5LgorCisjIyMjIExpbnV4IDMyLWJpdCBzdXBwb3J0CisKK1VzYWdlIG9mIHRoaXMgcmVwb3NpdG9yeSdzIGNvbnRlbnRzIGluIDMyLWJpdCBMaW51eCBlbnZpcm9ubWVudHMgaXMgbm90CitvZmZpY2lhbGx5IHN1cHBvcnRlZC4gSG93ZXZlciwgc2luY2UgdGhpcyByZXBvc2l0b3J5IGlzIHN1cHBvcnRlZCBvbiAzMi1iaXQKK1dpbmRvd3MsIHRoZXNlIG1vZHVsZXMgc2hvdWxkIGdlbmVyYWxseSB3b3JrIG9uIDMyLWJpdCBMaW51eC4KKworSGVyZSBhcmUgc29tZSBub3RlcyBmb3IgYnVpbGRpbmcgMzItYml0IHRhcmdldHMgb24gYSA2NC1iaXQgVWJ1bnR1ICJyZWZlcmVuY2UiCitwbGF0Zm9ybToKKworSWYgbm90IGFscmVhZHkgaW5zdGFsbGVkLCBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgMzItYml0IGRldmVsb3BtZW50IGxpYnJhcmllczoKKworYGdjYy1tdWx0aWxpYiBnKystbXVsdGlsaWIgbGlieDExLWRldjppMzg2YAorCitUaGlzIGxpc3QgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHlvdXIgZGlzdHJpYnV0aW9uIGFuZCB3aGljaCB3aW5kb3dpbmcgc3lzdGVtcworeW91IGFyZSBidWlsZGluZyBmb3IuCisKK1NldCB1cCB5b3VyIGVudmlyb25tZW50IGZvciBidWlsZGluZyAzMi1iaXQgdGFyZ2V0czoKKworICAgIGV4cG9ydCBBU0ZMQUdTPS0tMzIKKyAgICBleHBvcnQgQ0ZMQUdTPS1tMzIKKyAgICBleHBvcnQgQ1hYRkxBR1M9LW0zMgorICAgIGV4cG9ydCBQS0dfQ09ORklHX0xJQkRJUj0vdXNyL2xpYi9pMzg2LWxpbnV4LWdudQorCitBZ2FpbiwgeW91ciBQS0dfQ09ORklHIGNvbmZpZ3VyYXRpb24gbWF5IGJlIGRpZmZlcmVudCwgZGVwZW5kaW5nIG9uIHlvdXIgZGlzdHJpYnV0aW9uLgorCitGaW5hbGx5LCByZWJ1aWxkIHRoZSByZXBvc2l0b3J5IHVzaW5nIGBjbWFrZWAgYW5kIGBtYWtlYCwgYXMgZXhwbGFpbmVkIGFib3ZlLgorCisjIyMjIFVzaW5nIHRoZSBuZXcgbGF5ZXJzCisKKyAgICBleHBvcnQgVktfTEFZRVJfUEFUSD08cGF0aCB0byB5b3VyIHJlcG9zaXRvcnkgcm9vdD4vYnVpbGQvbGF5ZXJzCisKK1lvdSBjYW4gcnVuIHRoZSBgdmtjdWJlYCBvciBgdnVsa2FuaW5mb2AgYXBwbGljYXRpb25zIGZyb20gdGhlIFZ1bGthbi1Ub29scworcmVwb3NpdG9yeSB0byBzZWUgd2hpY2ggZHJpdmVyLCBsb2FkZXIgYW5kIGxheWVycyBhcmUgYmVpbmcgdXNlZC4KKworIyMgQnVpbGRpbmcgT24gQW5kcm9pZAorCitJbnN0YWxsIHRoZSByZXF1aXJlZCB0b29scyBmb3IgTGludXggYW5kIFdpbmRvd3MgY292ZXJlZCBhYm92ZSwgdGhlbiBhZGQgdGhlCitmb2xsb3dpbmcuCisKKyMjIyBBbmRyb2lkIEJ1aWxkIFJlcXVpcmVtZW50cworCitOb3RlIHRoYXQgdGhlIG1pbmltdW0gc3VwcG9ydGVkIEFuZHJvaWQgU0RLIEFQSSBMZXZlbCBpcyAyNiwgcmV2aXNpb24KK2xldmVsIDMuCisKKy0gSW5zdGFsbCBbQW5kcm9pZCBTdHVkaW8gMi4zXShodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vaW5kZXguaHRtbCkKKyAgb3IgbGF0ZXIuCistIEZyb20gdGhlICJXZWxjb21lIHRvIEFuZHJvaWQgU3R1ZGlvIiBzcGxhc2ggc2NyZWVuLCBhZGQgdGhlIGZvbGxvd2luZworICBjb21wb25lbnRzIHVzaW5nIENvbmZpZ3VyZSA+IFNESyBNYW5hZ2VyOgorICAtIFNESyBQbGF0Zm9ybXMgPiBBbmRyb2lkIDguMC4wIGFuZCBuZXdlcgorICAtIFNESyBUb29scyA+IEFuZHJvaWQgU0RLIEJ1aWxkLVRvb2xzCisgIC0gU0RLIFRvb2xzID4gQW5kcm9pZCBTREsgUGxhdGZvcm0tVG9vbHMKKyAgLSBTREsgVG9vbHMgPiBBbmRyb2lkIFNESyBUb29scworICAtIFNESyBUb29scyA+IE5ESworCisjIyMjIEFkZCBBbmRyb2lkIHNwZWNpZmljcyB0byBlbnZpcm9ubWVudAorCitGb3IgZWFjaCBvZiB0aGUgYmVsb3csIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGJ1aWxkLXRvb2xzCit2ZXJzaW9uLCBhcyBBbmRyb2lkIFN0dWRpbyB3aWxsIHJvbGwgaXQgZm9yd2FyZCBmYWlybHkgcmVndWxhcmx5LgorCitPbiBMaW51eDoKKworICAgIGV4cG9ydCBBTkRST0lEX1NES19IT01FPSRIT01FL0FuZHJvaWQvc2RrCisgICAgZXhwb3J0IEFORFJPSURfTkRLX0hPTUU9JEhPTUUvQW5kcm9pZC9zZGsvbmRrLWJ1bmRsZQorICAgIGV4cG9ydCBQQVRIPSRBTkRST0lEX1NES19IT01FOiRQQVRICisgICAgZXhwb3J0IFBBVEg9JEFORFJPSURfTkRLX0hPTUU6JFBBVEgKKyAgICBleHBvcnQgUEFUSD0kQU5EUk9JRF9TREtfSE9NRS9idWlsZC10b29scy8yNi4wLjM6JFBBVEgKKworT24gV2luZG93czoKKworICAgIHNldCBBTkRST0lEX1NES19IT01FPSVMT0NBTEFQUERBVEElXEFuZHJvaWRcc2RrCisgICAgc2V0IEFORFJPSURfTkRLX0hPTUU9JUxPQ0FMQVBQREFUQSVcQW5kcm9pZFxzZGtcbmRrLWJ1bmRsZQorICAgIHNldCBQQVRIPSVMT0NBTEFQUERBVEElXEFuZHJvaWRcc2RrXG5kay1idW5kbGU7JVBBVEglCisKK09uIE9TWDoKKworICAgIGV4cG9ydCBBTkRST0lEX1NES19IT01FPSRIT01FL0xpYnJhcnkvQW5kcm9pZC9zZGsKKyAgICBleHBvcnQgQU5EUk9JRF9OREtfSE9NRT0kSE9NRS9MaWJyYXJ5L0FuZHJvaWQvc2RrL25kay1idW5kbGUKKyAgICBleHBvcnQgUEFUSD0kQU5EUk9JRF9OREtfUEFUSDokUEFUSAorICAgIGV4cG9ydCBQQVRIPSRBTkRST0lEX1NES19IT01FL2J1aWxkLXRvb2xzLzI2LjAuMzokUEFUSAorCitOb3RlOiBJZiBgamFyc2lnbmVyYCBpcyBtaXNzaW5nIGZyb20geW91ciBwbGF0Zm9ybSwgeW91IGNhbiBmaW5kIGl0IGluIHRoZQorQW5kcm9pZCBTdHVkaW8gaW5zdGFsbCBvciBpbiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiBJZiB5b3UgZG8gbm90IGhhdmUgSmF2YSwKK3lvdSBjYW4gZ2V0IGl0IHdpdGggc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBvcGVuamRrLTgtamRrCisKKyMjIyMgQWRkaXRpb25hbCBPU1ggU3lzdGVtIFJlcXVpcmVtZW50cworCitUZXN0ZWQgb24gT1NYIHZlcnNpb24gMTAuMTMuMworCitTZXR1cCBIb21lYnJldyBhbmQgY29tcG9uZW50cworCistIEZvbGxvdyBpbnN0cnVjdGlvbnMgb24gW2JyZXcuc2hdKGh0dHA6Ly9icmV3LnNoKSB0byBnZXQgSG9tZWJyZXcgaW5zdGFsbGVkLgorCisgICAgICAvdXNyL2Jpbi9ydWJ5IC1lICIkKGN1cmwgLWZzU0wgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0hvbWVicmV3L2luc3RhbGwvbWFzdGVyL2luc3RhbGwpIgorCistIEVuc3VyZSBIb21lYnJldyBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgUEFUSDoKKworICAgICAgZXhwb3J0IFBBVEg9L3Vzci9sb2NhbC9iaW46JFBBVEgKKworLSBBZGQgcGFja2FnZXMgd2l0aCB0aGUgZm9sbG93aW5nOgorCisgICAgICBicmV3IGluc3RhbGwgcHl0aG9uCisKKyMjIyBBbmRyb2lkIEJ1aWxkCisKK1RoZXJlIGFyZSB0d28gb3B0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIEFuZHJvaWQgbGF5ZXJzLiBFaXRoZXIgdXNpbmcgdGhlIFNQSVJWCit0b29scyBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSBBbmRyb2lkIE5ESywgb3IgdXNpbmcgdXBzdHJlYW0gc291cmNlcy4gVG8gYnVpbGQKK3dpdGggU1BJUlYgdG9vbHMgZnJvbSB0aGUgTkRLLCByZW1vdmUgdGhlIGJ1aWxkLWFuZHJvaWQvdGhpcmRfcGFydHkgZGlyZWN0b3J5CitjcmVhdGVkIGJ5IHJ1bm5pbmcgdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5zaCwgKG9yIGF2b2lkIHJ1bm5pbmcKK3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2gpLiBVc2UgdGhlIGZvbGxvd2luZyBzY3JpcHQgdG8gYnVpbGQKK2V2ZXJ5dGhpbmcgaW4gdGhlIHJlcG9zaXRvcnkgZm9yIEFuZHJvaWQsIGluY2x1ZGluZyB2YWxpZGF0aW9uIGxheWVycywgdGVzdHMsCitkZW1vcywgYW5kIEFQSyBwYWNrYWdpbmc6IFRoaXMgc2NyaXB0IGRvZXMgcmV0cmlldmUgYW5kIHVzZSB0aGUgdXBzdHJlYW0gU1BSSVYKK3Rvb2xzLgorCisgICAgY2QgYnVpbGQtYW5kcm9pZAorICAgIC4vYnVpbGRfYWxsLnNoCisKK1Jlc3VsdGluZyB2YWxpZGF0aW9uIGxheWVyIGJpbmFyaWVzIHdpbGwgYmUgaW4gYnVpbGQtYW5kcm9pZC9saWJzLiBUZXN0IGFuZAorZGVtbyBBUEtzIGNhbiBiZSBpbnN0YWxsZWQgb24gcHJvZHVjdGlvbiBkZXZpY2VzIHdpdGg6CisKKyAgICAuL2luc3RhbGxfYWxsLnNoIFstcyA8c2VyaWFsIG51bWJlcj5dCisKK05vdGUgdGhhdCB0aGVyZSBhcmUgbm8gZXF1aXZhbGVudCBzY3JpcHRzIG9uIFdpbmRvd3MgeWV0LCB0aGF0IHdvcmsgbmVlZHMgdG8KK2JlIGNvbXBsZXRlZC4gVGhlIGZvbGxvd2luZyBwZXIgcGxhdGZvcm0gY29tbWFuZHMgY2FuIGJlIHVzZWQgZm9yIGxheWVyIG9ubHkKK2J1aWxkczoKKworIyMjIyBMaW51eCBhbmQgT1NYCisKK0ZvbGxvdyB0aGUgc2V0dXAgc3RlcHMgZm9yIExpbnV4IG9yIE9TWCBhYm92ZSwgdGhlbiBmcm9tIHlvdXIgdGVybWluYWw6CisKKyAgICBjZCBidWlsZC1hbmRyb2lkCisgICAgLi91cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLnNoIC0tbm8tYnVpbGQKKyAgICBuZGstYnVpbGQgLWo0CisKKyMjIyMgV2luZG93cworCitGb2xsb3cgdGhlIHNldHVwIHN0ZXBzIGZvciBXaW5kb3dzIGFib3ZlLCB0aGVuIGZyb20gRGV2ZWxvcGVyIENvbW1hbmQgUHJvbXB0Citmb3IgVlMyMDE1OgorCisgICAgY2QgYnVpbGQtYW5kcm9pZAorICAgIHVwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuYmF0CisgICAgbmRrLWJ1aWxkCisKKyMjIyBBbmRyb2lkIFRlc3RzIGFuZCBEZW1vcworCitBZnRlciBtYWtpbmcgYW55IGNoYW5nZXMgdG8gdGhlIHJlcG9zaXRvcnkgeW91IHNob3VsZCBwZXJmb3JtIHNvbWUgcXVpY2sKK3Nhbml0eSB0ZXN0cywgaW5jbHVkaW5nIHRoZSBsYXllciB2YWxpZGF0aW9uIHRlc3RzIGFuZCB0aGUgdmtjdWJlCitkZW1vIHdpdGggdmFsaWRhdGlvbiBlbmFibGVkLgorCisjIyMjIFJ1biBMYXllciBWYWxpZGF0aW9uIFRlc3RzCisKK1VzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkLCBpbnN0YWxsLCBhbmQgcnVuIHRoZSBsYXllciB2YWxpZGF0aW9uIHRlc3RzCitmb3IgQW5kcm9pZDoKKworICAgIGNkIGJ1aWxkLWFuZHJvaWQKKyAgICAuL2J1aWxkX2FsbC5zaAorICAgIGFkYiBpbnN0YWxsIC1yIGJpbi9WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy5hcGsKKyAgICBhZGIgc2hlbGwgYW0gc3RhcnQgY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMvYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkKKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlIHRlc3RfQVBLIHNjcmlwdCB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGxheWVyCit2YWxpZGF0aW9uIHRlc3RzOgorCisgICAgdGVzdF9BUEsuc2ggLXMgPHNlcmlhbCBudW1iZXI+IC1wIDxwbGFmb3JtIG5hbWU+IC1mIDxndGVzdF9maWx0ZXI+CisKKyMjIEJ1aWxkaW5nIG9uIE1hY09TCisKKyMjIyBNYWNPUyBCdWlsZCBSZXF1aXJlbWVudHMKKworVGVzdGVkIG9uIE9TWCB2ZXJzaW9uIDEwLjEyLjYKKworW0NNYWtlIDMuMTAuMl0oaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuMTAvY21ha2UtMy4xMC4yLURhcndpbi14ODZfNjQudGFyLmd6KSBpcyByZWNvbW1lbmRlZC4KKworU2V0dXAgSG9tZWJyZXcgYW5kIGNvbXBvbmVudHMKKworLSBGb2xsb3cgaW5zdHJ1Y3Rpb25zIG9uIFticmV3LnNoXShodHRwOi8vYnJldy5zaCkgdG8gZ2V0IEhvbWVicmV3IGluc3RhbGxlZC4KKworICAgICAgL3Vzci9iaW4vcnVieSAtZSAiJChjdXJsIC1mc1NMIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Ib21lYnJldy9pbnN0YWxsL21hc3Rlci9pbnN0YWxsKSIKKworLSBFbnN1cmUgSG9tZWJyZXcgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB5b3VyIFBBVEg6CisKKyAgICAgIGV4cG9ydCBQQVRIPS91c3IvbG9jYWwvYmluOiRQQVRICisKKy0gQWRkIHBhY2thZ2VzIHdpdGggdGhlIGZvbGxvd2luZyAobWF5IG5lZWQgcmVmaW5lbWVudCkKKworICAgICAgYnJldyBpbnN0YWxsIHB5dGhvbiBweXRob24zIGdpdAorCisjIyMgQ2xvbmUgdGhlIFJlcG9zaXRvcnkKKworQ2xvbmUgdGhlIFZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzIHJlcG9zaXRvcnk6CisKKyAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tVmFsaWRhdGlvbkxheWVycy5naXQKKworIyMjIE1hY09TIGJ1aWxkCisKKyMjIyMgQ01ha2UgR2VuZXJhdG9ycworCitUaGlzIHJlcG9zaXRvcnkgdXNlcyBDTWFrZSB0byBnZW5lcmF0ZSBidWlsZCBvciBwcm9qZWN0IGZpbGVzIHRoYXQgYXJlIHRoZW4KK3VzZWQgdG8gYnVpbGQgdGhlIHJlcG9zaXRvcnkuIFRoZSBDTWFrZSBnZW5lcmF0b3JzIGV4cGxpY2l0bHkgc3VwcG9ydGVkIGluCit0aGlzIHJlcG9zaXRvcnkgYXJlOgorCistIFVuaXggTWFrZWZpbGVzCistIFhjb2RlCisKKyMjIyMgQnVpbGRpbmcgd2l0aCB0aGUgVW5peCBNYWtlZmlsZXMgR2VuZXJhdG9yCisKK1RoaXMgZ2VuZXJhdG9yIGlzIHRoZSBkZWZhdWx0IGdlbmVyYXRvciwgc28gYWxsIHRoYXQgaXMgbmVlZGVkIGZvciBhIGRlYnVnCitidWlsZCBpczoKKworICAgIG1rZGlyIGJ1aWxkCisgICAgY2QgYnVpbGQKKyAgICBjbWFrZSAtRFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSPWFic29sdXRlX3BhdGhfdG9faW5zdGFsbF9kaXIgXAorICAgICAgICAgIC1ER0xTTEFOR19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIFwKKyAgICAgICAgICAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4KKyAgICBtYWtlCisKK1RvIHNwZWVkIHVwIHRoZSBidWlsZCBvbiBhIG11bHRpLWNvcmUgbWFjaGluZSwgdXNlIHRoZSBgLWpgIG9wdGlvbiBmb3IgYG1ha2VgCit0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29yZXMgdG8gdXNlIGZvciB0aGUgYnVpbGQuIEZvciBleGFtcGxlOgorCisgICAgbWFrZSAtajQKKworIyMjIyBCdWlsZGluZyB3aXRoIHRoZSBYY29kZSBHZW5lcmF0b3IKKworVG8gY3JlYXRlIGFuZCBvcGVuIGFuIFhjb2RlIHByb2plY3Q6CisKKyAgICBta2RpciBidWlsZC14Y29kZQorICAgIGNkIGJ1aWxkLXhjb2RlCisgICAgY21ha2UgLURWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUj1hYnNvbHV0ZV9wYXRoX3RvX2luc3RhbGxfZGlyIFwKKyAgICAgICAgICAtREdMU0xBTkdfSU5TVEFMTF9ESVI9YWJzb2x1dGVfcGF0aF90b19pbnN0YWxsX2RpciBcCisgICAgICAgICAgLUdYY29kZSAuLgorICAgIG9wZW4gVlVMS0FOLnhjb2RlcHJvagorCitXaXRoaW4gWGNvZGUsIHlvdSBjYW4gc2VsZWN0IERlYnVnIG9yIFJlbGVhc2UgYnVpbGRzIGluIHRoZSBCdWlsZCBTZXR0aW5ncyBvZiB0aGUgcHJvamVjdC4KKworIyMjIyBVc2luZyB0aGUgbmV3IGxheWVycyBvbiBNYWNPUworCisgICAgZXhwb3J0IFZLX0xBWUVSX1BBVEg9PHBhdGggdG8geW91ciByZXBvc2l0b3J5IHJvb3Q+L2J1aWxkL2xheWVycworCitZb3UgY2FuIHJ1biB0aGUgYHZ1bGthbmluZm9gIGFwcGxpY2F0aW9ucyBmcm9tIHRoZSBWdWxrYW4tVG9vbHMgcmVwb3NpdG9yeSB0bworc2VlIHdoaWNoIGRyaXZlciwgbG9hZGVyIGFuZCBsYXllcnMgYXJlIGJlaW5nIHVzZWQuCisKKyMjIyBNYWNPUyBUZXN0cworCitBZnRlciBtYWtpbmcgYW55IGNoYW5nZXMgdG8gdGhlIHJlcG9zaXRvcnksIHlvdSBzaG91bGQgYnVpbGQgYW5kIHJ1biB0aGUgaW5jbHVkZWQKK3ZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHMgbG9jYXRlZCBpbiB0aGUgdGVzdHMgc3ViZGlyZWN0b3J5LgorCitUaGVzZSB0ZXN0IHJlcXVpcmUgYSBtYW51YWwgcGF0aCB0byBhbiBJQ0QgdG8gcnVuIHByb3Blcmx5IG9uIE1hY09TLgorCitZb3UgY2FuIHVzZToKKworLSBNb2x0ZW5WSyBJQ0QKKy0gTW9jayBJQ0QKKworIyMjIyBVc2luZyBNb2x0ZW5WSyBJQ0QKKworQ2xvbmUgYW5kIGJ1aWxkIHRoZSBbTW9sdGVuVktdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvTW9sdGVuVkspIHJlcG9zaXRvcnkuCisKK1lvdSB3aWxsIGhhdmUgdG8gZGlyZWN0IHRoZSBsb2FkZXIgZnJvbSBWdWxrYW4tTG9hZGVyIHRvIHRoZSBNb2x0ZW5WSyBJQ0Q6CisKKyAgICBleHBvcnQgVktfSUNEX0ZJTEVOQU1FUz08cGF0aCB0byBNb2x0ZW5WSyByZXBvc2l0b3J5Pi9QYWNrYWdlL0xhdGVzdC9Nb2x0ZW5WSy9tYWNPUy9Nb2x0ZW5WS19pY2QuanNvbgorCisjIyMjIFVzaW5nIE1vY2sgSUNECisKK0Nsb25lIGFuZCBidWlsZCB0aGUgW1Z1bGthbi1Ub29sc10oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tVG9vbHMpIHJlcG9zaXRvcnkuCisKK1lvdSB3aWxsIGhhdmUgdG8gZGlyZWN0IHRoZSBsb2FkZXIgZnJvbSBWdWxrYW4tTG9hZGVyIHRvIHRoZSBNb2NrIElDRDoKKworICAgIGV4cG9ydCBWS19JQ0RfRklMRU5BTUVTPTxwYXRoIHRvIFZ1bGthbi1Ub29scyByZXBvc2l0b3J5Pi9idWlsZC9pY2QvVmtJQ0RfbW9ja19pY2QuanNvbgorCisjIyMjIFJ1bm5pbmcgdGhlIFRlc3RzCisKK0luIGEgdGVybWluYWwsIGNoYW5nZSB0byB0aGUgYnVpbGQvdGVzdHMgZGlyZWN0b3J5IGFuZCBydW4gdGhlIHZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHMuCisKK0Z1cnRoZXIgdGVzdGluZyBhbmQgc2FuaXR5IGNoZWNraW5nIGNhbiBiZSBhY2hpZXZlZCBieSBydW5uaW5nIHRoZSB2a2N1YmUgYW5kCit2dWxrYW5pbmZvIGFwcGxpY2F0aW9ucyBpbiB0aGUKK1tWdWxrYW4tVG9vbHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVRvb2xzKQorcmVwb3NpdG9yeS4KKworTm90ZSB0aGF0IE1vbHRlblZLIGlzIHN0aWxsIGFkZGluZyBWdWxrYW4gZmVhdHVyZXMgYW5kIHNvbWUgdGVzdHMgbWF5IGZhaWwuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzI2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDM2MCBAQAorIyB+fn4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTkgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIH5+fgorCisjIENNYWtlIHByb2plY3QgaW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBjb250YWlucyBwcmUtcHJvamVjdCgpIGluaXRpYWxpemF0aW9uLCBhbmQgZW5kcyB3aXRoIHRoZSBwcm9qZWN0KCkgY29tbWFuZC4KKworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMTAuMikKKworIyBBcHBsZTogTXVzdCBiZSBzZXQgYmVmb3JlIGVuYWJsZV9sYW5ndWFnZSgpIG9yIHByb2plY3QoKSBhcyBpdCBtYXkgaW5mbHVlbmNlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRvb2xjaGFpbiBhbmQgZmxhZ3MuCitzZXQoQ01BS0VfT1NYX0RFUExPWU1FTlRfVEFSR0VUICIxMC4xMiIgQ0FDSEUgU1RSSU5HICJNaW5pbXVtIE9TIFggZGVwbG95bWVudCB2ZXJzaW9uIikKKworcHJvamVjdChWdWxrYW4tVmFsaWRhdGlvbkxheWVycykKKworZW5hYmxlX3Rlc3RpbmcoKQorCisjIFVzZXItaW50ZXJmYWNlIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpYWJsZXMgdGhhdCBhZmZlY3QgZGV2ZWxvcG1lbnQgR1VJcyAoZS5nLiBDTWFrZSBHVUkgYW5kIElERXMpLCBzdWNoIGFzIG9wdGlvbigpLCBmb2xkZXJzLCBhbmQgdmFyaWFibGVzCisjIHdpdGggdGhlIENBQ0hFIHByb3BlcnR5LgorCisjIEFQSV9OQU1FIGFsbG93cyByZW5hbWluZyBidWlsZHMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggaW5zdGFsbGVkIFNES3MuICBJdCBpcyByZWZlcmVuY2VkIGJ5IGxheWVycy92a19sb2FkZXJfcGxhdGZvcm0uaAorc2V0KEFQSV9OQU1FICJWdWxrYW4iIENBQ0hFIFNUUklORyAiQVBJIG5hbWUgdG8gdXNlIHdoZW4gYnVpbGRpbmciKQorc3RyaW5nKFRPTE9XRVIgJHtBUElfTkFNRX0gQVBJX0xPV0VSQ0FTRSkKK2FkZF9kZWZpbml0aW9ucygtREFQSV9OQU1FPSIke0FQSV9OQU1FfSIpCisKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX01PRFVMRV9QQVRIfSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlIikKKworZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCAzIFFVSUVUKQorCitpZiAoVEFSR0VUIFZ1bGthbjo6SGVhZGVycykKKyAgICBtZXNzYWdlKFNUQVRVUyAiVXNpbmcgVnVsa2FuIGhlYWRlcnMgZnJvbSBWdWxrYW46OkhlYWRlcnMgdGFyZ2V0IikKKyAgICBnZXRfdGFyZ2V0X3Byb3BlcnR5KFZ1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTIFZ1bGthbjo6SGVhZGVycyBJTlRFUkZBQ0VfSU5DTFVERV9ESVJFQ1RPUklFUykKKyAgICBnZXRfdGFyZ2V0X3Byb3BlcnR5KFZ1bGthblJlZ2lzdHJ5X0RJUiBWdWxrYW46OlJlZ2lzdHJ5IElOVEVSRkFDRV9JTkNMVURFX0RJUkVDVE9SSUVTKQorZWxzZSgpCisgICAgZmluZF9wYWNrYWdlKFZ1bGthbkhlYWRlcnMgUkVRVUlSRUQpCisKKyAgICAjIHh4eG5zdWJ0aWw6IHRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVwbGFjZWQgYnkgZXhwb3J0ZWQgdGFyZ2V0cworICAgIGFkZF9saWJyYXJ5KFZ1bGthbi1IZWFkZXJzIElOVEVSRkFDRSkKKyAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWdWxrYW4tSGVhZGVycyBJTlRFUkZBQ0UgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSU30pCisgICAgYWRkX2xpYnJhcnkoVnVsa2FuOjpIZWFkZXJzIEFMSUFTIFZ1bGthbi1IZWFkZXJzKQorZW5kaWYoKQorCitvcHRpb24oVVNFX0NDQUNIRSAiVXNlIGNjYWNoZSIgT0ZGKQoraWYoVVNFX0NDQUNIRSkKKyAgICBmaW5kX3Byb2dyYW0oQ0NBQ0hFX0ZPVU5EIGNjYWNoZSkKKyAgICBpZihDQ0FDSEVfRk9VTkQpCisgICAgICAgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgUlVMRV9MQVVOQ0hfQ09NUElMRSBjY2FjaGUpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitzZXQoQ01BS0VfUE9TSVRJT05fSU5ERVBFTkRFTlRfQ09ERSBPTikKKworaW5jbHVkZShHTlVJbnN0YWxsRGlycykKKworaWYoV0lOMzIgQU5EIENNQUtFX0lOU1RBTExfUFJFRklYX0lOSVRJQUxJWkVEX1RPX0RFRkFVTFQpCisgICAgIyBXaW5kb3dzOiBpZiBpbnN0YWxsIGxvY2F0aW9ucyBub3Qgc2V0IGJ5IHVzZXIsIHNldCBpbnN0YWxsIHByZWZpeCB0byAiPGJ1aWxkX2Rpcj5caW5zdGFsbCIuCisgICAgc2V0KENNQUtFX0lOU1RBTExfUFJFRklYICIke0NNQUtFX0JJTkFSWV9ESVJ9L2luc3RhbGwiIENBQ0hFIFBBVEggImRlZmF1bHQgaW5zdGFsbCBwYXRoIiBGT1JDRSkKK2VuZGlmKCkKKworaWYoQVBQTEUpCisgICAgIyBDTWFrZSB2ZXJzaW9ucyAzIG9yIGxhdGVyIG5lZWQgQ01BS0VfTUFDT1NYX1JQQVRIIGRlZmluZWQuIFRoaXMgYXZvaWRzIHRoZSBDTVAwMDQyIHBvbGljeSBtZXNzYWdlLgorICAgIHNldChDTUFLRV9NQUNPU1hfUlBBVEggMSkKK2VuZGlmKCkKKworIyBFbmFibGUgSURFIEdVSSBmb2xkZXJzCitzZXRfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIFVTRV9GT0xERVJTIE9OKQorIyAiSGVscGVyIiB0YXJnZXRzIHRoYXQgZG9uJ3QgaGF2ZSBpbnRlcmVzdGluZyBzb3VyY2UgY29kZSBzaG91bGQgc2V0IHRoZWlyIEZPTERFUiBwcm9wZXJ0eSB0byB0aGlzCitzZXQoTEFZRVJTX0hFTFBFUl9GT0xERVIgIkhlbHBlciBUYXJnZXRzIikKKworIyBPcHRpb25zIGZvciBMaW51eCBvbmx5CitpZihVTklYIEFORCBOT1QgQVBQTEUpICMgaS5lLiBMaW51eAorICAgIGluY2x1ZGUoRmluZFBrZ0NvbmZpZykKKyAgICBvcHRpb24oQlVJTERfV1NJX1hDQl9TVVBQT1JUICJCdWlsZCBYQ0IgV1NJIHN1cHBvcnQiIE9OKQorICAgIG9wdGlvbihCVUlMRF9XU0lfWExJQl9TVVBQT1JUICJCdWlsZCBYbGliIFdTSSBzdXBwb3J0IiBPTikKKyAgICBvcHRpb24oQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCAiQnVpbGQgV2F5bGFuZCBXU0kgc3VwcG9ydCIgT04pCisgICAgc2V0KERFTU9TX1dTSV9TRUxFQ1RJT04gIlhDQiIgQ0FDSEUgU1RSSU5HICJTZWxlY3QgV1NJIHRhcmdldCBmb3IgZGVtb3MgKFhDQiwgWExJQiwgV0FZTEFORCwgRElTUExBWSkiKQorCisgICAgaWYoQlVJTERfV1NJX1hDQl9TVVBQT1JUKQorICAgICAgICBmaW5kX3BhY2thZ2UoWENCIFJFUVVJUkVEKQorICAgIGVuZGlmKCkKKworICAgIGlmKEJVSUxEX1dTSV9YTElCX1NVUFBPUlQpCisgICAgICAgIGZpbmRfcGFja2FnZShYMTEgUkVRVUlSRUQpCisgICAgZW5kaWYoKQorCisgICAgaWYoQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCkKKyAgICAgICAgZmluZF9wYWNrYWdlKFdheWxhbmQgUkVRVUlSRUQpCisgICAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtXQVlMQU5EX0NMSUVOVF9JTkNMVURFX0RJUn0pCisgICAgZW5kaWYoKQorZW5kaWYoKQorCisjIFBsYXRmb3JtLXNwZWNpZmljIGNvbXBpbGVyIHN3aXRjaGVzCitpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBPUiBDTUFLRV9DX0NPTVBJTEVSX0lEIE1BVENIRVMgIkNsYW5nIikKKyAgICBhZGRfY29tcGlsZV9vcHRpb25zKC1XYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAtV2V4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICAtV25vLXVudXNlZC1wYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC1mbm8tc3RyaWN0LWFsaWFzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAtZm5vLWJ1aWx0aW4tbWVtY21wCisgICAgICAgICAgICAgICAgICAgICAgICAtZnZpc2liaWxpdHk9aGlkZGVuKQorCisgICAgIyBUcmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMgZm9yIHZlcnNpb25zIG9mIEdDQyBhbmQgQ2xhbmcgdGhhdCBhcmUgc2hpcHBlZCBvbiBVYnVudHUgMTguMDQgb3Igb2xkZXIuCisgICAgaWYoKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCBBTkQgTk9UIChDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVIgNy4zLjApKSBPUgorICAgICAgICgoIiR7Q01BS0VfQ1hYX0NPTVBJTEVSX0lEfSIgU1RSRVFVQUwgIkNsYW5nIikgQU5EIE5PVCAoQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSIDMuOC4wKSkpCisgICAgICAgIGFkZF9jb21waWxlX29wdGlvbnMoLVdlcnJvcikKKyAgICBlbmRpZigpCisKKyAgICBzZXQoQ01BS0VfQ19TVEFOREFSRCA5OSkKKyAgICBzZXQoQ01BS0VfQ1hYX1NUQU5EQVJEIDExKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtZm5vLXJ0dGkiKQorCisgICAgIyBGb3IgR0NDIHZlcnNpb24gNy4xIG9yIGdyZWF0ZXIsIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGUgaW1wbGljaXQgZmFsbHRocm91Z2ggd2FybmluZyBzaW5jZSB0aGVyZSdzIG5vIGNvbnNpc3RlbnQgd2F5IHRvIHNhdGlzZnkKKyAgICAjIGFsbCBjb21waWxlcnMgdW50aWwgdGhleSBhbGwgYWNjZXB0IHRoZSBDKysxNyBzdGFuZGFyZC4KKyAgICBpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgTk9UIChDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTiBMRVNTIDcuMSkpCisgICAgICAgIGFkZF9jb21waWxlX29wdGlvbnMoLVdpbXBsaWNpdC1mYWxsdGhyb3VnaD0wKQorICAgIGVuZGlmKCkKK2Vsc2VpZihNU1ZDKQorICAgICMgVHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzCisgICAgYWRkX2NvbXBpbGVfb3B0aW9ucygiL1dYIikKKyAgICAjIERpc2FibGUgUlRUSQorICAgIGFkZF9jb21waWxlX29wdGlvbnMoIi9HUi0iKQorICAgICMgV2FybiBhYm91dCBuZXN0ZWQgZGVjbGFyYXRpb25zCisgICAgYWRkX2NvbXBpbGVfb3B0aW9ucygiL3czNDQ1NiIpCisgICAgIyBXYXJuIGFib3V0IHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCisgICAgYWRkX2NvbXBpbGVfb3B0aW9ucygiL3czNDcwMSIpCisgICAgYWRkX2NvbXBpbGVfb3B0aW9ucygiL3czNDcwMyIpCisgICAgIyBXYXJuIGFib3V0IGRpZmZlcmVudCBpbmRpcmVjdGlvbiB0eXBlcy4KKyAgICBhZGRfY29tcGlsZV9vcHRpb25zKCIvdzM0MDU3IikKKyAgICAjIFdhcm4gYWJvdXQgc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoLgorICAgIGFkZF9jb21waWxlX29wdGlvbnMoIi93MzQyNDUiKQorZW5kaWYoKQorCitpZihUQVJHRVQgZ3Rlc3QgT1IgSVNfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leHRlcm5hbC9nb29nbGV0ZXN0KQorICAgIG9wdGlvbihCVUlMRF9URVNUUyAiQnVpbGQgdGVzdHMiIE9OKQorZWxzZSgpCisgICAgb3B0aW9uKEJVSUxEX1RFU1RTICJCdWlsZCB0ZXN0cyIgT0ZGKQorZW5kaWYoKQorCitvcHRpb24oSU5TVEFMTF9URVNUUyAiSW5zdGFsbCB0ZXN0cyIgT0ZGKQorb3B0aW9uKEJVSUxEX0xBWUVSUyAiQnVpbGQgbGF5ZXJzIiBPTikKK29wdGlvbihCVUlMRF9MQVlFUl9TVVBQT1JUX0ZJTEVTICJHZW5lcmF0ZSBsYXllciBmaWxlcyIgT0ZGKSAjIEZvciBnZW5lcmF0aW5nIGZpbGVzIHdoZW4gbm90IGJ1aWxkaW5nIGxheWVycworCitpZihCVUlMRF9URVNUUyBPUiBCVUlMRF9MQVlFUlMpCisKKyAgICBzZXQoR0xTTEFOR19JTlNUQUxMX0RJUiAiR0xTTEFORy1OT1RGT1VORCIgQ0FDSEUgUEFUSCAiQWJzb2x1dGUgcGF0aCB0byBhIGdsc2xhbmcgaW5zdGFsbCBkaXJlY3RvcnkiKQorICAgIGlmKE5PVCBHTFNMQU5HX0lOU1RBTExfRElSIEFORCBOT1QgREVGSU5FRCBFTlZ7R0xTTEFOR19JTlNUQUxMX0RJUn0gQU5EIE5PVCBUQVJHRVQgZ2xzbGFuZykKKyAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiTXVzdCBkZWZpbmUgbG9jYXRpb24gb2YgZ2xzbGFuZyBiaW5hcmllcyAtLSBzZWUgQlVJTEQubWQiKQorICAgIGVuZGlmKCkKKworICAgICMgR0xTTEFOR19JTlNUQUxMX0RJUiBpcyB1c2VkIGFzIHRoZSBwYXRoIHRvIGFsbCBkZXBlbmRlbnQgcHJvamVjdHMnIGluc3RhbGwgZGlycworICAgICMgQ01ha2UgY29tbWFuZCBsaW5lIG9wdGlvbiBvdmVycmlkZXMgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICBpZihOT1QgR0xTTEFOR19JTlNUQUxMX0RJUikKKyAgICAgICAgc2V0KEdMU0xBTkdfSU5TVEFMTF9ESVIgJEVOVntHTFNMQU5HX0lOU1RBTExfRElSfSkKKyAgICBlbmRpZigpCisKKyAgICBpZiAoTk9UIFRBUkdFVCBnbHNsYW5nKQorICAgICAgICBtZXNzYWdlKFNUQVRVUyAiVXNpbmcgZ2xzbGFuZyBpbnN0YWxsIGxvY2F0ZWQgYXQgJHtHTFNMQU5HX0lOU1RBTExfRElSfSIpCisgICAgICAgIHNldChHTFNMQU5HX1NFQVJDSF9QQVRIICIke0dMU0xBTkdfSU5TVEFMTF9ESVJ9L2xpYiIpCisgICAgICAgIHNldChHTFNMQU5HX0RFQlVHX1NFQVJDSF9QQVRIICIke0dMU0xBTkdfSU5TVEFMTF9ESVJ9L2xpYiIpCisgICAgICAgIHNldChHTFNMQU5HX1NQSVJWX0lOQ0xVREVfRElSICIke0dMU0xBTkdfSU5TVEFMTF9ESVJ9L2luY2x1ZGUvZ2xzbGFuZyIgQ0FDSEUgUEFUSCAiUGF0aCB0byBnbHNsYW5nIHNwaXJ2IGhlYWRlcnMiKQorCisgICAgICAgIGZpbmRfbGlicmFyeShHTFNMQU5HX0xJQiBOQU1FUyBnbHNsYW5nIEhJTlRTICR7R0xTTEFOR19TRUFSQ0hfUEFUSH0pCisgICAgICAgIGZpbmRfbGlicmFyeShPR0xDb21waWxlcl9MSUIgTkFNRVMgT0dMQ29tcGlsZXIgSElOVFMgJHtHTFNMQU5HX1NFQVJDSF9QQVRIfSkKKyAgICAgICAgZmluZF9saWJyYXJ5KE9TRGVwZW5kZW50X0xJQiBOQU1FUyBPU0RlcGVuZGVudCBISU5UUyAke0dMU0xBTkdfU0VBUkNIX1BBVEh9KQorICAgICAgICBmaW5kX2xpYnJhcnkoSExTTF9MSUIgTkFNRVMgSExTTCBISU5UUyAke0dMU0xBTkdfU0VBUkNIX1BBVEh9KQorICAgICAgICBmaW5kX2xpYnJhcnkoU1BJUlZfTElCIE5BTUVTIFNQSVJWIEhJTlRTICR7R0xTTEFOR19TRUFSQ0hfUEFUSH0pCisgICAgICAgIGZpbmRfbGlicmFyeShTUElSVl9SRU1BUFBFUl9MSUIgTkFNRVMgU1BWUmVtYXBwZXIgSElOVFMgJHtHTFNMQU5HX1NFQVJDSF9QQVRIfSkKKworICAgICAgICBpZihXSU4zMikKKyAgICAgICAgICAgIGFkZF9saWJyYXJ5KGdsc2xhbmcgU1RBVElDIElNUE9SVEVEKQorICAgICAgICAgICAgYWRkX2xpYnJhcnkoT0dMQ29tcGlsZXIgU1RBVElDIElNUE9SVEVEKQorICAgICAgICAgICAgYWRkX2xpYnJhcnkoT1NEZXBlbmRlbnQgU1RBVElDIElNUE9SVEVEKQorICAgICAgICAgICAgYWRkX2xpYnJhcnkoSExTTCBTVEFUSUMgSU1QT1JURUQpCisgICAgICAgICAgICBhZGRfbGlicmFyeShTUElSViBTVEFUSUMgSU1QT1JURUQpCisgICAgICAgICAgICBhZGRfbGlicmFyeShTUFZSZW1hcHBlciBTVEFUSUMgSU1QT1JURUQpCisKKyAgICAgICAgICAgIGZpbmRfbGlicmFyeShHTFNMQU5HX0RMSUIgTkFNRVMgZ2xzbGFuZ2QgSElOVFMgJHtHTFNMQU5HX0RFQlVHX1NFQVJDSF9QQVRIfSkKKyAgICAgICAgICAgIGZpbmRfbGlicmFyeShPR0xDb21waWxlcl9ETElCIE5BTUVTIE9HTENvbXBpbGVyZCBISU5UUyAke0dMU0xBTkdfREVCVUdfU0VBUkNIX1BBVEh9KQorICAgICAgICAgICAgZmluZF9saWJyYXJ5KE9TRGVwZW5kZW50X0RMSUIgTkFNRVMgT1NEZXBlbmRlbnRkIEhJTlRTICR7R0xTTEFOR19ERUJVR19TRUFSQ0hfUEFUSH0pCisgICAgICAgICAgICBmaW5kX2xpYnJhcnkoSExTTF9ETElCIE5BTUVTIEhMU0xkIEhJTlRTICR7R0xTTEFOR19ERUJVR19TRUFSQ0hfUEFUSH0pCisgICAgICAgICAgICBmaW5kX2xpYnJhcnkoU1BJUlZfRExJQiBOQU1FUyBTUElSVmQgSElOVFMgJHtHTFNMQU5HX0RFQlVHX1NFQVJDSF9QQVRIfSkKKyAgICAgICAgICAgIGZpbmRfbGlicmFyeShTUElSVl9SRU1BUFBFUl9ETElCIE5BTUVTIFNQVlJlbWFwcGVyZCBISU5UUyAke0dMU0xBTkdfREVCVUdfU0VBUkNIX1BBVEh9KQorCisgICAgICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ2xzbGFuZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMgSU1QT1JURURfTE9DQVRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke0dMU0xBTkdfTElCfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtHTFNMQU5HX0RMSUJ9IikKKyAgICAgICAgICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhPR0xDb21waWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMgSU1QT1JURURfTE9DQVRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke09HTENvbXBpbGVyX0xJQn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTl9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7T0dMQ29tcGlsZXJfRExJQn0iKQorICAgICAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKE9TRGVwZW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7T1NEZXBlbmRlbnRfTElCfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtPU0RlcGVuZGVudF9ETElCfSIpCisgICAgICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoSExTTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMgSU1QT1JURURfTE9DQVRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke0hMU0xfTElCfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtITFNMX0RMSUJ9IikKKyAgICAgICAgICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhTUElSVgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMgSU1QT1JURURfTE9DQVRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke1NQSVJWX0xJQn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTl9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7U1BJUlZfRExJQn0iKQorICAgICAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFNQVlJlbWFwcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7U1BJUlZfUkVNQVBQRVJfTElCfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtTUElSVl9SRU1BUFBFUl9ETElCfSIpCisKKyAgICAgICAgICAgIHNldChHTFNMQU5HX0xJQlJBUklFUyBnbHNsYW5nIE9HTENvbXBpbGVyIE9TRGVwZW5kZW50IEhMU0wgU1BJUlYgU1BWUmVtYXBwZXIgJHtTUElSVl9UT09MU19MSUJSQVJJRVN9KQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIHNldChHTFNMQU5HX0xJQlJBUklFUworICAgICAgICAgICAgICAgICR7R0xTTEFOR19MSUJ9CisgICAgICAgICAgICAgICAgJHtPR0xDb21waWxlcl9MSUJ9CisgICAgICAgICAgICAgICAgJHtPU0RlcGVuZGVudF9MSUJ9CisgICAgICAgICAgICAgICAgJHtITFNMX0xJQn0KKyAgICAgICAgICAgICAgICAke1NQSVJWX0xJQn0KKyAgICAgICAgICAgICAgICAke1NQSVJWX1JFTUFQUEVSX0xJQn0KKyAgICAgICAgICAgICAgICAke1NQSVJWX1RPT0xTX0xJQlJBUklFU30pCisgICAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KEdMU0xBTkdfU1BJUlZfSU5DTFVERV9ESVIgIiR7Z2xzbGFuZ19TT1VSQ0VfRElSfSIgQ0FDSEUgUEFUSCAiUGF0aCB0byBnbHNsYW5nIHNwaXJ2IGhlYWRlcnMiKQorICAgICAgICBzZXQoR0xTTEFOR19MSUJSQVJJRVMgZ2xzbGFuZyBTUElSViBTUFZSZW1hcHBlcikKKyAgICBlbmRpZigpCisKKyAgICAjIHNwaXJ2LXRvb2xzCisgICAgaWYgKE5PVCBUQVJHRVQgU1BJUlYtVG9vbHMpCisgICAgICAgIHNldChTUElSVl9UT09MU19CSU5BUllfUk9PVCAiJHtHTFNMQU5HX0lOU1RBTExfRElSfS9saWIiCisgICAgICAgICAgICBDQUNIRSBQQVRIICJVc2VyIGRlZmluZWQgcGF0aCB0byB0aGUgU1BJUlYtVG9vbHMgYmluYXJpZXMgZm9yIHRoaXMgcHJvamVjdCIpCisgICAgICAgIHNldChTUElSVl9UT09MU19PUFRfQklOQVJZX1JPT1QgIiR7R0xTTEFOR19JTlNUQUxMX0RJUn0vbGliIgorICAgICAgICAgICAgQ0FDSEUgUEFUSCAiVXNlciBkZWZpbmVkIHBhdGggdG8gdGhlIFNQSVJWLVRvb2xzLW9wdCBiaW5hcmllcyBmb3IgdGhpcyBwcm9qZWN0IikKKyAgICAgICAgc2V0KFNQSVJWX1RPT0xTX0lOQ0xVREVfRElSICIke0dMU0xBTkdfSU5TVEFMTF9ESVJ9L2luY2x1ZGUiIENBQ0hFIFBBVEggIlBhdGggdG8gc3BpcnYgdG9vbHMgaGVhZGVycyIpCisgICAgICAgIHNldChTUElSVl9UT09MU19TRUFSQ0hfUEFUSCAiJHtHTFNMQU5HX0lOU1RBTExfRElSfS9saWIiKQorICAgICAgICBzZXQoU1BJUlZfVE9PTFNfREVCVUdfU0VBUkNIX1BBVEggIiR7R0xTTEFOR19JTlNUQUxMX0RJUn0vbGliIikKKyAgICAgICAgc2V0KFNQSVJWX1RPT0xTX09QVF9TRUFSQ0hfUEFUSCAiJHtHTFNMQU5HX0lOU1RBTExfRElSfS9saWIiKQorICAgICAgICBzZXQoU1BJUlZfVE9PTFNfT1BUX0RFQlVHX1NFQVJDSF9QQVRIICIke0dMU0xBTkdfSU5TVEFMTF9ESVJ9L2xpYiIpCisKKyAgICAgICAgZmluZF9saWJyYXJ5KFNQSVJWX1RPT0xTX0xJQiBOQU1FUyBTUElSVi1Ub29scyBISU5UUyAke1NQSVJWX1RPT0xTX1NFQVJDSF9QQVRIfSkKKyAgICAgICAgZmluZF9saWJyYXJ5KFNQSVJWX1RPT0xTX09QVF9MSUIgTkFNRVMgU1BJUlYtVG9vbHMtb3B0IEhJTlRTICR7U1BJUlZfVE9PTFNfT1BUX1NFQVJDSF9QQVRIfSkKKworICAgICAgICBpZihXSU4zMikKKyAgICAgICAgICAgIGFkZF9saWJyYXJ5KFNQSVJWLVRvb2xzLW9wdCBTVEFUSUMgSU1QT1JURUQpCisgICAgICAgICAgICBhZGRfbGlicmFyeShTUElSVi1Ub29scyBTVEFUSUMgSU1QT1JURUQpCisKKyAgICAgICAgICAgIGZpbmRfbGlicmFyeShTUElSVl9UT09MU19ETElCIE5BTUVTIFNQSVJWLVRvb2xzZCBISU5UUyAke1NQSVJWX1RPT0xTX0RFQlVHX1NFQVJDSF9QQVRIfSkKKyAgICAgICAgICAgIGZpbmRfbGlicmFyeShTUElSVl9UT09MU19PUFRfRExJQiBOQU1FUyBTUElSVi1Ub29scy1vcHRkIEhJTlRTICR7U1BJUlZfVE9PTFNfT1BUX0RFQlVHX1NFQVJDSF9QQVRIfSkKKworICAgICAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFNQSVJWLVRvb2xzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7U1BJUlZfVE9PTFNfTElCfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtTUElSVl9UT09MU19ETElCfSIpCisgICAgICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoU1BJUlYtVG9vbHMtb3B0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7U1BJUlZfVE9PTFNfT1BUX0xJQn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTl9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7U1BJUlZfVE9PTFNfT1BUX0RMSUJ9IikKKworICAgICAgICAgICAgc2V0KFNQSVJWX1RPT0xTX0xJQlJBUklFUyBTUElSVi1Ub29scy1vcHQgU1BJUlYtVG9vbHMpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgc2V0KFNQSVJWX1RPT0xTX0xJQlJBUklFUyAke1NQSVJWX1RPT0xTX09QVF9MSUJ9ICR7U1BJUlZfVE9PTFNfTElCfSkKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoU1BJUlZfVE9PTFNfTElCUkFSSUVTIFNQSVJWLVRvb2xzIFNQSVJWLVRvb2xzLW9wdCkKKyAgICAgICAgc2V0KFNQSVJWX1RPT0xTX0lOQ0xVREVfRElSICIke3NwaXJ2LXRvb2xzX1NPVVJDRV9ESVJ9L2luY2x1ZGUiIENBQ0hFIFBBVEggIlBhdGggdG8gc3BpcnYgdG9vbHMgaGVhZGVycyIpCisgICAgZW5kaWYoKQorCisgICAgc2V0KEdMU0xBTkdfTElCUkFSSUVTICR7R0xTTEFOR19MSUJSQVJJRVN9ICR7U1BJUlZfVE9PTFNfTElCUkFSSUVTfSkKK2VuZGlmKCkKKworIyBHZW5lcmF0ZSBkZXBlbmRlbnQgaGVscGVyIGZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzZXQoU0NSSVBUU19ESVIgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9zY3JpcHRzIikKKworIyBWa0xheWVyX3V0aWxzIGxpYnJhcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3IgV2luZG93cywgd2UgdXNlIGEgc3RhdGljIGxpYiBiZWNhdXNlIHRoZSBXaW5kb3dzIGxvYWRlciBoYXMgYSBmYWlybHkgcmVzdHJpY3RpdmUgbG9hZGVyIHNlYXJjaCBwYXRoIHRoYXQgY2FuJ3QgYmUgZWFzaWx5CisjIG1vZGlmaWVkIHRvIHBvaW50IGl0IHRvIHRoZSBzYW1lIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBsYXllcnMuIFRPRE86IFRoaXMgc2hvdWxkIG5vdCBiZSBhIGxpYnJhcnkgLS0gaW4gZnV0dXJlLCBpbmNsdWRlCisjIGZpbGVzIGRpcmVjdGx5IGluIGxheWVycy4KKworYWRkX2xpYnJhcnkoVmtMYXllcl91dGlscworICAgICAgICAgICAgU1RBVElDCisgICAgICAgICAgICBsYXllcnMvdmtfbGF5ZXJfY29uZmlnLmNwcAorICAgICAgICAgICAgbGF5ZXJzL3ZrX2xheWVyX2V4dGVuc2lvbl91dGlscy5jcHAKKyAgICAgICAgICAgIGxheWVycy92a19sYXllcl91dGlscy5jcHAKKyAgICAgICAgICAgIGxheWVycy92a19mb3JtYXRfdXRpbHMuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFZrTGF5ZXJfdXRpbHMgUFVCTElDIFZ1bGthbjo6SGVhZGVycykKK2lmKFdJTjMyKQorICAgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKFZrTGF5ZXJfdXRpbHMgUFVCTElDIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTKQorZW5kaWYoKQoraW5zdGFsbChUQVJHRVRTIFZrTGF5ZXJfdXRpbHMgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoVmtMYXllcl91dGlscyBQUk9QRVJUSUVTIExJTktFUl9MQU5HVUFHRSBDWFgpCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWa0xheWVyX3V0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQVUJMSUMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xheWVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9sYXllcnMvZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xheWVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0pCisKKyMgdW5pbnN0YWxsIHRhcmdldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmKE5PVCBUQVJHRVQgdW5pbnN0YWxsKQorICAgIGNvbmZpZ3VyZV9maWxlKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluIgorICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY21ha2VfdW5pbnN0YWxsLmNtYWtlIgorICAgICAgICAgICAgICAgICAgIElNTUVESUFURQorICAgICAgICAgICAgICAgICAgIEBPTkxZKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KHVuaW5zdGFsbCBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLVAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NtYWtlX3VuaW5zdGFsbC5jbWFrZSkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXModW5pbnN0YWxsIFBST1BFUlRJRVMgRk9MREVSICR7TEFZRVJTX0hFTFBFUl9GT0xERVJ9KQorZW5kaWYoKQorCisjIEZldGNoIGhlYWRlciB2ZXJzaW9uIGZyb20gdnVsa2FuX2NvcmUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmaWxlKFNUUklOR1MgIiR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlN9L3Z1bGthbi92dWxrYW5fY29yZS5oIiBsaW5lcyBSRUdFWCAiXiNkZWZpbmUgVktfSEVBREVSX1ZFUlNJT04gWzAtOV0rIikKK2xpc3QoTEVOR1RIIGxpbmVzIGxlbikKK2lmKCR7bGVufSBFUVVBTCAxKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSEFMTAorICAgICAgICAgICAgICAgICAiWzAtOV0rIgorICAgICAgICAgICAgICAgICB2a19oZWFkZXJfdmVyc2lvbgorICAgICAgICAgICAgICAgICAke2xpbmVzfSkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuYWJsZSB0byBmZXRjaCB2ZXJzaW9uIGZyb20gdnVsa2FuX2NvcmUuaCIpCitlbmRpZigpCisKKyMgT3B0aW9uYWwgY29kZWdlbiB0YXJnZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmKFBZVEhPTklOVEVSUF9GT1VORCkKKyAgICBhZGRfY3VzdG9tX3RhcmdldChWdWxrYW5WTF9nZW5lcmF0ZWRfc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1BST0pFQ1RfU09VUkNFX0RJUn0vc2NyaXB0cy9nZW5lcmF0ZV9zb3VyY2UucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7VnVsa2FuUmVnaXN0cnlfRElSfSAtLWluY3JlbWVudGFsCisgICAgICAgICAgICAgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xheWVycy9nZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICApCitlbHNlKCkKKyAgICBtZXNzYWdlKCJXQVJOSU5HOiBWdWxrYW5WTF9nZW5lcmF0ZWRfc291cmNlIHRhcmdldCByZXF1aXJlcyBweXRob24gMyIpCitlbmRpZigpCisKKyMgQWRkIHN1YnByb2plY3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYWRkX3N1YmRpcmVjdG9yeShleHRlcm5hbCkKK2lmKEJVSUxEX1RFU1RTKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdHMpCitlbmRpZigpCisKK2lmKEJVSUxEX0xBWUVSUyBPUiBCVUlMRF9MQVlFUl9TVVBQT1JUX0ZJTEVTKQorICAgIGFkZF9zdWJkaXJlY3RvcnkobGF5ZXJzKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvQ09ERV9PRl9DT05EVUNULm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvQ09ERV9PRl9DT05EVUNULm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTYxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9DT0RFX09GX0NPTkRVQ1QubWQKQEAgLTAsMCArMSBAQAorQSByZW1pbmRlciB0aGF0IHRoaXMgaXNzdWUgdHJhY2tlciBpcyBtYW5hZ2VkIGJ5IHRoZSBLaHJvbm9zIEdyb3VwLiBJbnRlcmFjdGlvbnMgaGVyZSBzaG91bGQgZm9sbG93IHRoZSBLaHJvbm9zIENvZGUgb2YgQ29uZHVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvZGV2ZWxvcGVycy9jb2RlLW9mLWNvbmR1Y3QpLCB3aGljaCBwcm9oaWJpdHMgYWdncmVzc2l2ZSBvciBkZXJvZ2F0b3J5IGxhbmd1YWdlLiBQbGVhc2Uga2VlcCB0aGUgZGlzY3Vzc2lvbiBmcmllbmRseSBhbmQgY2l2aWwuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9DT05UUklCVVRJTkcubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDE3MSBAQAorIyBIb3cgdG8gQ29udHJpYnV0ZSB0byBWdWxrYW4gU291cmNlIFJlcG9zaXRvcmllcworCisjIyAqKlRoZSBSZXBvc2l0b3J5KioKKworVGhlIHNvdXJjZSBjb2RlIGZvciBUaGUgVnVsa2FuLVZhbGlkYXRpb25MYXllciBjb21wb25lbnRzIGlzIHNwb25zb3JlZCBieSBLaHJvbm9zIGFuZCBMdW5hckcuCisqIFtLaHJvbm9zIFZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1WYWxpZGF0aW9uTGF5ZXJzKQorCisKKyMjIyAqKlRoZSBWdWxrYW4gRWNvc3lzdGVtIE5lZWRzIFlvdXIgSGVscCoqCisKK1RoZSBWdWxrYW4gdmFsaWRhdGlvbiBsYXllcnMgYXJlIG9uZSBvZiB0aGUgbGFyZ2VyIGFuZCBtb3JlIGltcG9ydGFudCBjb21wb25lbnRzIGluIHRoaXMgcmVwb3NpdG9yeS4KK1doaWxlIHRoZXJlIGFyZSBvZnRlbiBhY3RpdmUgYW5kIG9yZ2FuaXplZCBkZXZlbG9wbWVudCBlZmZvcnRzIHVuZGVyd2F5IHRvIGltcHJvdmUgdGhlaXIgY292ZXJhZ2UsCit0aGVyZSBhcmUgYWx3YXlzIG9wcG9ydHVuaXRpZXMgZm9yIGFueW9uZSB0byBoZWxwIGJ5IGNvbnRyaWJ1dGluZyBhZGRpdGlvbmFsIHZhbGlkYXRpb24gbGF5ZXIgY2hlY2tzCithbmQgdGVzdHMgZm9yIHRoZXNlIHZhbGlkYXRpb24gY2hlY2tzLgorCitUaGVyZSBhcmUgYSBjb3VwbGUgb2YgbWV0aG9kcyB0byBpZGVudGlmeSBhcmVhcyBvZiBuZWVkOgorKiBFeGFtaW5lIHRoZSBbaXNzdWVzIGxpc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVZhbGlkYXRpb25MYXllcnMvaXNzdWVzKQoraW4gdGhpcyByZXBvc2l0b3J5IGFuZCBsb29rIGZvciBpc3N1ZXMgdGhhdCBhcmUgb2YgaW50ZXJlc3QKKyogQWx0ZXJuYXRpdmVseSwgcnVuIHRoZSBgdmtfdmFsaWRhdGlvbl9zdGF0cy5weWAgc2NyaXB0IChpbiB0aGUgc2NyaXB0cyBkaXJlY3RvcnkpIHdpdGggdGhlIGAtdG9kb2AKK2NvbW1hbmQgbGluZSBhcmd1bWVudCB0byBzZWUgYSBsaXN0IG9mIGFzLXlldCB1bmltcGxlbWVudGVkIHZhbGlkYXRpb24gY2hlY2tzLgorKiBIYXZpbmcgc2VsZWN0ZWQgYSB2YWxpZGF0aW9uIGNoZWNrIHRvIHdvcmsgb24sIGl0IGlzIG9mdGVuIGVmZmljaWVudCB0byBpbXBsZW1lbnQgYSBibG9jayBvZiByZWxhdGVkIGNoZWNrcworYXQgb25jZS4gUmVmZXIgdG8gdGhlIHZhbGlkYXRpb24gZGF0YWJhc2Ugb3V0cHV0IGZyb20gYHZrX3ZhbGlkYXRpb25fc3RhdHMucHlgIChhdmFpbGFibGUgaW4gdGV4dCwgaHRtbCwKK29yIGNzdiBmb3JtYXQpIHRvIGlkZW50aWZ5IHJlbGF0ZWQgY2hlY2tzIHRoYXQgbWF5IGJlIGltcGxlbWVudGVkIHNpbXVsdGFuZW91c2x5LgorCitPZiBjb3Vyc2UsIGlmIHlvdSBoYXZlIHlvdXIgb3duIHdvcmsgaW4gbWluZCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgdG8gZGVzY3JpYmUgaXQgYW5kIGFzc2lnbiBpdCB0byB5b3Vyc2VsZi4KK0ZpbmFsbHksIHBsZWFzZSBmZWVsIGZyZWUgdG8gY29udGFjdCBhbnkgb2YgdGhlIGRldmVsb3BlcnMgdGhhdCBhcmUgYWN0aXZlbHkgY29udHJpYnV0aW5nIHNob3VsZCB5b3UKK3dpc2ggdG8gY29vcmRpbmF0ZSBmdXJ0aGVyLgorUGxlYXNlIHNlZSB0aGUgW3NlY3Rpb24gYWJvdXQgVmFsaWRhdGlvbiBMYXllcnNdKCNzcGVjaWFsLWNvbnNpZGVyYXRpb25zLWZvci12YWxpZGF0aW9uLWxheWVycykKK2xhdGVyIG9uIHRoaXMgcGFnZS4KKworUmVwb3NpdG9yeSBJc3N1ZSBsYWJlbHM6CisKKyogX0J1Z186ICAgICAgICAgIFRoZXNlIGlzc3VlcyByZWZlciB0byBpbnZhbGlkIG9yIGJyb2tlbiBmdW5jdGlvbmFsaXR5IGFuZCBhcmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCisqIF9JbmNvbXBsZXRlXzogICBUaGVzZSBpc3N1ZXMgcmVmZXIgdG8gbWlzc2luZyB2YWxpZGF0aW9uIGNoZWNrcyB0aGF0IHVzZXJzIGhhdmUgZW5jb3VudGVyZWQgZHVyaW5nIGFwcGxpY2F0aW9uCitkZXZlbG9wbWVudCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBkaXJlY3RseSB1c2VmdWwsIGFuZCBhcmUgaGlnaCBwcmlvcml0eS4KKyogX0VuaGFuY2VtZW50XzogIFRoZXNlIGlzc3VlcyByZWZlciB0byBpZGVhcyBmb3IgZXh0ZW5kaW5nIG9yIGltcHJvdmluZyB0aGUgdmFsaWRhdGlvbiBsYXllcnMuCisqIF9UcmlhZ2VkXzogICAgICBUaGVzZSBpc3N1ZXMgaGF2ZSBiZWVuIGFzc2Vzc2VkIGFuZC9vciByZXZpZXdlZAorCitJdCBpcyB0aGUgbWFpbnRhaW5lcnMgZ29hbCBmb3IgYWxsIGlzc3VlcyB0byBiZSBhc3NpZ25lZCBvciB0cmlhZ2VkIHdpdGhpbiBvbmUgYnVzaW5lc3MgZGF5IG9mIHRoZWlyIHN1Ym1pc3Npb24uIElmIHlvdSBjaG9vc2UKK3RvIHdvcmsgb24gYW4gaXNzdWUgdGhhdCBpcyBhc3NpZ25lZCwgc2ltcGx5IGNvb3JkaW5hdGUgd2l0aCB0aGUgY3VycmVudCBhc3NpZ25lZS4KKworIyMjICoqSG93IHRvIFN1Ym1pdCBGaXhlcyoqCisKKyogKipFbnN1cmUgdGhhdCB0aGUgYnVnIHdhcyBub3QgYWxyZWFkeSByZXBvcnRlZCBvciBmaXhlZCoqIGJ5IHNlYXJjaGluZyBvbiBHaXRIdWIgdW5kZXIgSXNzdWVzCisgIGFuZCBQdWxsIFJlcXVlc3RzLgorKiBVc2UgdGhlIGV4aXN0aW5nIEdpdEh1YiBmb3JraW5nIGFuZCBwdWxsIHJlcXVlc3QgcHJvY2Vzcy4KKyAgVGhpcyB3aWxsIGludm9sdmUgW2ZvcmtpbmcgdGhlIHJlcG9zaXRvcnldKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2ZvcmstYS1yZXBvLyksCisgIGNyZWF0aW5nIGEgYnJhbmNoIHdpdGggeW91ciBjb21taXRzLCBhbmQgdGhlbiBbc3VibWl0dGluZyBhIHB1bGwgcmVxdWVzdF0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvdXNpbmctcHVsbC1yZXF1ZXN0cy8pLgorKiBQbGVhc2UgcmVhZCBhbmQgYWRoZXJlIHRvIHRoZSBzdHlsZSBhbmQgcHJvY2VzcyBbZ3VpZGVsaW5lcyBdKCNjb2RpbmctY29udmVudGlvbnMtYW5kLWZvcm1hdHRpbmcpIGVudW1lcmF0ZWQgYmVsb3cuCisqIFBsZWFzZSBiYXNlIHlvdXIgZml4ZXMgb24gdGhlIG1hc3RlciBicmFuY2guICBTREsgYnJhbmNoZXMgYXJlIGdlbmVyYWxseSBub3QgdXBkYXRlZCBleGNlcHQgZm9yIGNyaXRpY2FsIGZpeGVzIG5lZWRlZCB0byByZXBhaXIgYW4gU0RLIHJlbGVhc2UuCisqIFRoZSByZXN1bHRpbmcgUHVsbCBSZXF1ZXN0IHdpbGwgYmUgYXNzaWduZWQgdG8gYSByZXBvc2l0b3J5IG1haW50YWluZXIuIEl0IGlzIHRoZSBtYWludGFpbmVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoZSBQdWxsIFJlcXVlc3QKKyAgcGFzc2VzIHRoZSBHb29nbGUvTHVuYXJHIGludGVybmFsIENJIHByb2Nlc3Nlcy4gT25jZSB0aGUgUHVsbCBSZXF1ZXN0IGhhcyBiZWVuIGFwcHJvdmVkIGFuZCBpcyBwYXNzaW5nIGludGVybmFsIENJLCBhIHJlcG9zaXRvcnkgbWFpbnRhaW5lcgorICB3aWxsIG1lcmdlIHRoZSBQUi4KKworCisjIyMjICoqQ29kaW5nIENvbnZlbnRpb25zIGFuZCBGb3JtYXR0aW5nKioKKyogVXNlIHRoZSAqKltHb29nbGUgc3R5bGUgZ3VpZGVdKGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL2NwcGd1aWRlLmh0bWwpKiogZm9yIHNvdXJjZSBjb2RlIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorICAgICogVGhlIGNvbHVtbiBsaW1pdCBpcyAxMzIgKGFzIG9wcG9zZWQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgODApLiBUaGUgY2xhbmctZm9ybWF0IHRvb2wgd2lsbCBoYW5kbGUgdGhpcy4gU2VlIGJlbG93LgorICAgICogVGhlIGluZGVudCBpcyA0IHNwYWNlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDIgc3BhY2VzLiBBY2Nlc3MgbW9kaWZpZXIgKGUuZy4gYHB1YmxpYzpgKSBpcyBpbmRlbnRlZCAyIHNwYWNlcyBpbnN0ZWFkIG9mIHRoZQorICAgICAgZGVmYXVsdCAxIHNwYWNlLiBBZ2FpbiwgdGhlIGNsYW5nLWZvcm1hdCB0b29sIHdpbGwgaGFuZGxlIHRoaXMuCisgICAgKiBUaGUgQysrIGZpbGUgZXh0ZW5zaW9uIGlzIGAqLmNwcGAgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBgKi5jY2AuCisgICAgKiBJZiB5b3UgY2FuIGp1c3RpZnkgYSByZWFzb24gZm9yIHZpb2xhdGluZyBhIHJ1bGUgaW4gdGhlIGd1aWRlbGluZXMsIHRoZW4geW91IGFyZSBmcmVlIHRvIGRvIHNvLiBCZSBwcmVwYXJlZCB0byBkZWZlbmQgeW91cgorZGVjaXNpb24gZHVyaW5nIGNvZGUgcmV2aWV3LiBUaGlzIHNob3VsZCBiZSB1c2VkIHJlc3BvbnNpYmx5LiBBbiBleGFtcGxlIG9mIGEgYmFkIHJlYXNvbiBpcyAiSSBkb24ndCBsaWtlIHRoYXQgcnVsZS4iIEFuIGV4YW1wbGUgb2YKK2EgZ29vZCByZWFzb24gaXMgIlRoaXMgdmlvbGF0ZXMgdGhlIHN0eWxlIGd1aWRlLCBidXQgaXQgaW1wcm92ZXMgdHlwZSBzYWZldHkuIgorCisqIFJ1biAqKmNsYW5nLWZvcm1hdCoqIG9uIHlvdXIgY2hhbmdlcyB0byBtYWludGFpbiBjb25zaXN0ZW50IGZvcm1hdHRpbmcKKyAgICAqIFRoZXJlIGFyZSBgLmNsYW5nLWZvcm1hdGAgZmlsZXMgcHJlc2VudCBpbiB0aGUgcmVwb3NpdG9yeSB0byBkZWZpbmUgY2xhbmctZm9ybWF0IHNldHRpbmdzCisgICAgICB3aGljaCBhcmUgZm91bmQgYW5kIHVzZWQgYXV0b21hdGljYWxseSBieSBjbGFuZy1mb3JtYXQuCisJKiAqKmNsYW5nLWZvcm1hdCoqIGJpbmFyaWVzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgTExWTSBvcmdpbml6YXRpb24sIGhlcmU6IFtMTFZNXShodHRwczovL2NsYW5nLmxsdm0ub3JnLykuIE91ciBDSSBzeXN0ZW0gKFRyYXZpcy1DSSkKKwkgIGN1cnJlbnRseSB1c2VzIGNsYW5nLWZvcm1hdCB2ZXJzaW9uIDUuMC4wIHRvIGNoZWNrIHRoYXQgdGhlIGxpbmVzIG9mIGNvZGUgeW91IGhhdmUgY2hhbmdlZCBhcmUgZm9ybWF0dGVkIHByb3Blcmx5LiBJdCBpcworCSAgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBzYW1lIHZlcnNpb24gdG8gZm9ybWF0IHlvdXIgY29kZSBwcmlvciB0byBzdWJtaXNzaW9uLgorICAgICogQSBzYW1wbGUgZ2l0IHdvcmtmbG93IG1heSBsb29rIGxpa2U6CisKKz4gICAgICAgICMgTWFrZSBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UuCis+ICAgICAgICAkIGdpdCBhZGQgLXUgLgorPiAgICAgICAgJCBnaXQgY2xhbmctZm9ybWF0IC0tc3R5bGU9ZmlsZQorPiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgY2xhbmctZm9ybWF0IG1hZGUgYW55IGNoYW5nZXMgYW5kIGlmIHRoZXkgYXJlIE9LLgorPiAgICAgICAgJCBnaXQgYWRkIC11IC4KKz4gICAgICAgICQgZ2l0IGNvbW1pdAorCisqICoqQ29tbWl0IE1lc3NhZ2VzKioKKyAgICAqIExpbWl0IHRoZSBzdWJqZWN0IGxpbmUgdG8gNjQgY2hhcmFjdGVycyAtLSB0aGlzIGFsbG93cyB0aGUgaW5mb3JtYXRpb24gdG8gZGlzcGxheSBjb3JyZWN0bHkgaW4gZ2l0L0dpdEh1YiBsb2dzCisgICAgKiBCZWdpbiBzdWJqZWN0IGxpbmUgd2l0aCBhIG9uZS13b3JkIGNvbXBvbmVudCBkZXNjcmlwdGlvbiBmb2xsb3dlZCBieSBhIGNvbG9uIChlLmcuIGJ1aWxkLCBkb2NzLCBsYXllcnMsIHRlc3RzLCBldGMuKQorICAgICogU2VwYXJhdGUgc3ViamVjdCBmcm9tIGJvZHkgd2l0aCBhIGJsYW5rIGxpbmUKKyAgICAqIFdyYXAgdGhlIGJvZHkgYXQgNzIgY2hhcmFjdGVycworICAgICogQ2FwaXRhbGl6ZSB0aGUgc3ViamVjdCBsaW5lCisgICAgKiBEbyBub3QgZW5kIHRoZSBzdWJqZWN0IGxpbmUgd2l0aCBhIHBlcmlvZAorICAgICogVXNlIHRoZSBib2R5IHRvIGV4cGxhaW4gd2hhdCBhbmQgd2h5IHZzLiBob3cKKyAgICAqIFVzZSB0aGUgaW1wZXJhdGl2ZSBtb2RlIGluIHRoZSBzdWJqZWN0IGxpbmUuIFRoaXMganVzdCBtZWFucyB0byB3cml0ZSBpdCBhcyBhIGNvbW1hbmQgKGUuZy4gRml4IHRoZSBzcHJvY2tldCkKKworU3RyaXZlIGZvciBjb21taXRzIHRoYXQgaW1wbGVtZW50IGEgc2luZ2xlIG9yIHJlbGF0ZWQgc2V0IG9mIGZ1bmN0aW9uYWxpdHksIHVzaW5nIGFzIG1hbnkgY29tbWl0cyBhcyBpcyBuZWNlc3NhcnkgKG1vcmUgaXMgYmV0dGVyKS4KK1RoYXQgc2FpZCwgcGxlYXNlIGVuc3VyZSB0aGF0IHRoZSByZXBvc2l0b3J5IGNvbXBpbGVzIGFuZCBwYXNzZXMgdGVzdHMgd2l0aG91dCBlcnJvciBmb3IgZWFjaCBjb21taXQgaW4geW91ciBwdWxsIHJlcXVlc3QuICBOb3RlCit0aGF0IHRvIGJlIGFjY2VwdGVkIGludG8gdGhlIHJlcG9zaXRvcnksIHRoZSBwdWxsIHJlcXVlc3QgbXVzdCBbcGFzcyBhbGwgdGVzdHNdKCN0ZXN0aW5nIHlvdXIgY2hhbmdlcykgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMKKy0tIHRoZSBhdXRvbWF0aWMgR2l0aHViIFRyYXZpcyBhbmQgQXBwVmV5b3IgY29udGludW91cyBpbnRlZ3JhdGlvbiBmZWF0dXJlcyB3aWxsIGFzc2lzdCBpbiBlbmZvcmNpbmcgdGhpcyByZXF1aXJlbWVudC4KKworIyMjIyAqKlRlc3RpbmcgWW91ciBDaGFuZ2VzKioKKyogUnVuIHRoZSBpbmNsdWRlZCBsYXllciB2YWxpZGF0aW9uIHRlc3RzICh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzKSBpbiB0aGUgcmVwb3NpdG9yeSBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggb2YgeW91ciBjb21taXRzIHRvIGNoZWNrIGZvciBhbnkgcmVncmVzc2lvbnMuCisKKyogV3JpdGUgYWRkaXRpb25hbCBsYXllciB2YWxpZGF0aW9uIHRlc3RzIHRoYXQgZXhwbGljaXRseSBleGVyY2lzZSB5b3VyIGNoYW5nZXMuCisKKyogRmVlbCBmcmVlIHRvIHN1YmplY3QgeW91ciBjb2RlIGNoYW5nZXMgdG8gb3RoZXIgdGVzdHMgYXMgd2VsbCEKKworIyMjIyAqKkdpdEh1YiBDbG91ZCBDSSBUZXN0aW5nKioKK1B1bGwgUmVxdWVzdHMgdG8gR2l0SHViIGFyZSB0ZXN0ZWQgaW4gdGhlIGNsb3VkIG9uIExpbnV4IGFuZCBXaW5kb3dzIFZNcy4gVGhlIExpbnV4IFZNcyB1c2UgW1RyYXZpcyBDSV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL0tocm9ub3NHcm91cC9WdWxrYW4tVmFsaWRhdGlvbkxheWVycykgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY29tbWFuZHMgZHJpdmVuIGJ5IHRoZSBbLnRyYXZpcy55bWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVZhbGlkYXRpb25MYXllcnMvYmxvYi9tYXN0ZXIvLnRyYXZpcy55bWwpIGZpbGUuIFRoZSBXaW5kb3dzIFZNcyB1c2UgW0FwcFZleW9yXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L0tocm9ub3N3ZWJtYXN0ZXIvdnVsa2FuLXZhbGlkYXRpb25sYXllcnMvYnJhbmNoL21hc3Rlcikgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY29tbWFuZHMgZHJpdmVuIGJ5IHRoZSBbLmFwcHZleW9yLnltbF0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tVmFsaWRhdGlvbkxheWVycy9ibG9iL21hc3Rlci8uYXBwdmV5b3IueW1sKSBmaWxlLgorCitUaGUgTGludXggdGVzdGluZyBpbmNsdWRlcyBpdGVyYXRpbmcgb24gYWxsIG9mIHRoZSB2YWxpZGF0aW9uIGxheWVyIHRlc3RzIG92ZXIgbXVsdGlwbGUgW2RpZmZlcmVudCBkZXZpY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVZhbGlkYXRpb25MYXllcnMvdHJlZS9tYXN0ZXIvdGVzdHMvZGV2aWNlX3Byb2ZpbGVzKSBwcm9maWxlcyB1c2luZyB0aGUgW2RldnNpbSBsYXllcl0oaHR0cHM6Ly9naXRodWIuY29tL0x1bmFyRy9WdWxrYW5Ub29scy90cmVlL21hc3Rlci9sYXllcnN2dCkgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgW21vY2sgaWNkXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Ub29scy90cmVlL21hc3Rlci9pY2QpLiBUaGlzIGlzIGEgZmFzdCB3YXkgdG8gc2ltdWxhdGUgdGVzdGluZyBhY3Jvc3MgZGlmZmVyZW50IGRldmljZXMuIEFueSBuZXcgdGVzdHMgbXVzdCBwYXNzIGFjcm9zcyBhbGwgZGV2aWNlIHByb2ZpbGVzLgorCisjIyMjICoqU3BlY2lhbCBDb25zaWRlcmF0aW9ucyBmb3IgVmFsaWRhdGlvbiBMYXllcnMqKgorKiAqKlZhbGlkYXRpb24gVGVzdHM6KiogIElmIHlvdSBhcmUgc3VibWl0dGluZyBhIGNoYW5nZSB0aGF0IGFkZHMgYSBuZXcgdmFsaWRhdGlvbiBjaGVjaywgeW91IHNob3VsZCBhbHNvIGNvbnN0cnVjdCBhICJuZWdhdGl2ZSIgdGVzdCBmdW5jdGlvbi4KK1RoZSBuZWdhdGl2ZSB0ZXN0IGZ1bmN0aW9uIHB1cnBvc2VseSB2aW9sYXRlcyB0aGUgdmFsaWRhdGlvbiBydWxlIHRoYXQgdGhlIG5ldyB2YWxpZGF0aW9uIGNoZWNrIGlzIGxvb2tpbmcgZm9yLgorVGhlIHRlc3Qgc2hvdWxkIGNhdXNlIHlvdXIgbmV3IHZhbGlkYXRpb24gY2hlY2sgdG8gaWRlbnRpZnkgdGhlIHZpb2xhdGlvbiBhbmQgaXNzdWUgYSB2YWxpZGF0aW9uIGVycm9yIHJlcG9ydC4KK0FuZCBmaW5hbGx5LCB0aGUgdGVzdCBzaG91bGQgY2hlY2sgdGhhdCB0aGUgdmFsaWRhdGlvbiBlcnJvciByZXBvcnQgaXMgZ2VuZXJhdGVkIGFuZCBjb25zaWRlciB0aGUgdGVzdCBhcyAicGFzc2luZyIKK2lmIHRoZSByZXBvcnQgaXMgcmVjZWl2ZWQuICBPdGhlcndpc2UsIHRoZSB0ZXN0IHNob3VsZCBpbmRpY2F0ZSAiZmFpbHVyZSIuCitUaGlzIG5ldyB0ZXN0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdmFsaWRhdGlvbiBsYXllciB0ZXN0IHByb2dyYW0gaW4gdGhlIGB0ZXN0c2AgZGlyZWN0b3J5IGFuZCBjb250cmlidXRlZAorYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgbmV3IHZhbGlkYXRpb24gY2hlY2sgaXRzZWxmLiBUaGVyZSBhcmUgbWFueSBleGlzdGluZyB2YWxpZGF0aW9uIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5IHRoYXQgY2FuIGJlCit1c2VkIGFzIGEgc3RhcnRpbmcgcG9pbnQuCisqICoqVmFsaWRhdGlvbiBDaGVja3M6KiogIFZhbGlkYXRpb24gY2hlY2tzIGFyZSBjYXJyaWVkIG91dCBieSB0aGUgS2hyb25vcyBWYWxpZGF0aW9uIGxheWVyLiBUaGUgQ29yZUNoZWNrcyB2YWxpZGF0aW9uIG9iamVjdAorY29udGFpbnMgY2hlY2tzIHRoYXQgcmVxdWlyZSBzaWduaWZpY2FudCBhbW91bnRzIG9mIGFwcGxpY2F0aW9uIHN0YXRlIHRvIGNhcnJ5IG91dC4gSW4gY29udHJhc3QsIHRoZSBzdGF0ZWxlc3MgdmFsaWRhdGlvbiBvYmplY3QgY29udGFpbnMKK2NoZWNrcyB0aGF0IHJlcXVpcmUgKG1vc3RseSkgbm8gc3RhdGUgYXQgYWxsLiBQbGVhc2UgaW5xdWlyZSBpZiB5b3UgYXJlIHVuc3VyZSBvZiB0aGUgbG9jYXRpb24gZm9yIHlvdXIgY29udHJpYnV0aW9uLiBUaGUgb3RoZXIKK3ZhbGlkYXRpb24gb2JqZWN0cyAodGhyZWFkX3NhZmV0eSwgb2JqZWN0IGxpZmV0aW1lcykgYXJlIG1vcmUgc3BlY2lhbC1wdXJwb3NlIGFuZCBhcmUgbW9zdGx5IGNvZGUtZ2VuZXJhdGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisqICoqVmFsaWRhdGlvbiBFcnJvci9XYXJuaW5nIE1lc3NhZ2VzOioqICBTdHJpdmUgdG8gZ2l2ZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBwYXJ0aWN1bGFycyBvZiB0aGUgZmFpbHVyZSwgaW5jbHVkaW5nCitvdXRwdXQgYWxsIG9mIHRoZSBhcHBsaWNhYmxlIFZ1bGthbiBPYmplY3RzIGFuZCByZWxhdGVkIHZhbHVlcy4gQWxzbywgZW5zdXJlIHRoYXQgd2hlbiBtZXNzYWdlcyBjYW4gZ2l2ZSBzdWdnZXN0aW9ucyBhYm91dCBfaG93XyB0bworZml4IHRoZSBwcm9ibGVtLCB0aGV5IHNob3VsZCBkbyBzbyB0byBiZXR0ZXIgYXNzaXN0IHRoZSB1c2VyLgorKiAqKlZhbGlkYXRpb24gU3RhdGlzdGljczoqKiBUaGUgYHZrX3ZhbGlkYXRpb25fc3RhdHMucHlgIHNjcmlwdCAoaW4gdGhlIHNjcmlwdHMgZGlyZWN0b3J5KSBpbnNwZWN0cyB0aGUgbGF5ZXIgYW5kIHRlc3Qgc291cmNlIGZpbGVzCithbmQgcmVwb3J0cyBhIHZhcmlldHkgb2Ygc3RhdGlzdGljcyBvbiB2YWxpZGF0aW9uIGNvbXBsZXRlbmVzcyBhbmQgY29ycmVjdG5lc3MuIEJlZm9yZSBzdWJtaXR0aW5nIGEgY2hhbmdlIHlvdSBzaG91bGQgcnVuIHRoaXMKK3NjcmlwdCB3aXRoIHRoZSBjb25zaXN0ZW5jeSBjaGVjayAoYC1jYCkgYXJndW1lbnQgdG8gZW5zdXJlIHRoYXQgeW91ciBjaGFuZ2VzIGhhdmUgbm90IGludHJvZHVjZWQgYW55IGluY29uc2lzdGVuY2llcyBpbiB0aGUgY29kZS4KKyogKipHZW5lcmF0ZWQgU291cmNlIENvZGU6KiogVGhlIGBsYXllcnMvZ2VuZXJhdGVkYCBkaXJlY3RvcnkgY29udGFpbnMgc291cmNlIGNvZGUgdGhhdCBpcyBjcmVhdGVkIGJ5IHNldmVyYWwKK2dlbmVyYXRvciBzY3JpcHRzIGluIHRoZSBgc2NyaXB0c2AgZGlyZWN0b3J5LiBBbGwgY2hhbmdlcyB0byB0aGVzZSBzY3JpcHRzIF9tdXN0XyBiZSBzdWJtaXR0ZWQgd2l0aCB0aGUKK2NvcnJlc3BvbmRpbmcgZ2VuZXJhdGVkIG91dHB1dCB0byBrZWVwIHRoZSByZXBvc2l0b3J5IHNlbGYtY29uc2lzdGVudC4gVGhpcyByZXF1aXJlbWVudCBpcyBlbmZvcmNlZCBieSBib3RoCitUcmF2aXMgQ0kgYW5kIEFwcFZleW9yIHRlc3QgY29uZmlndXJhdGlvbnMuIFJlZ2VuZXJhdGUgc291cmNlIGZpbGVzIGFmdGVyIG1vZGlmeWluZyBhbnkgb2YgdGhlIGdlbmVyYXRvcgorc2NyaXB0cyBhbmQgYmVmb3JlIGJ1aWxkaW5nIGFuZCB0ZXN0aW5nIHlvdXIgY2hhbmdlcy4gTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbgorW0JVSUxELm1kXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1WYWxpZGF0aW9uTGF5ZXJzL2Jsb2IvbWFzdGVyL0JVSUxELm1kI2dlbmVyYXRlZC1zb3VyY2UtY29kZSkuCisKKyMjIyMgQ29kaW5nIENvbnZlbnRpb25zIGZvciBbQ01ha2VdKGh0dHA6Ly9jbWFrZS5vcmcpIGZpbGVzCisKKyogV2hlbiBlZGl0aW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIENNYWtlLCBmb2xsb3cgdGhlIHN0eWxlIGNvbnZlbnRpb25zIG9mIHRoZSBzdXJyb3VuZGluZyBjb2RlLgorICAqIFRoZSBjb2x1bW4gbGltaXQgaXMgMTMyLgorICAqIFRoZSBpbmRlbnQgaXMgNCBzcGFjZXMuCisgICogQ01ha2UgZnVuY3Rpb25zIGFyZSBsb3dlci1jYXNlLgorICAqIFZhcmlhYmxlIGFuZCBrZXl3b3JkIG5hbWVzIGFyZSB1cHBlci1jYXNlLgorKiBUaGUgZm9ybWF0IGlzIGRlZmluZWQgYnkKKyAgW2NtYWtlLWZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2NoZXNoaXJla293L2NtYWtlX2Zvcm1hdCkKKyAgdXNpbmcgdGhlIGBjbWFrZS1mb3JtYXQucHlgIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkgdG8gZGVmaW5lIHRoZSBzZXR0aW5ncy4KKyAgU2VlIHRoZSBjbWFrZS1mb3JtYXQgcGFnZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaXRzIHNpbXBsZSBtYXJrdXAgZm9yIGNvbW1lbnRzLgorKiBEaXNhYmxlIHJlZm9ybWF0dGluZyBvZiBhIGJsb2NrIG9mIGNvbW1lbnQgbGluZXMgYnkgaW5zZXJ0aW5nCisgIGEgYCMgfn5+YCBjb21tZW50IGxpbmUgYmVmb3JlIGFuZCBhZnRlciB0aGF0IGJsb2NrLgorKiBEaXNhYmxlIGFueSBmb3JtYXR0aW5nIG9mIGEgYmxvY2sgb2YgbGluZXMgYnkgc3Vycm91bmRpbmcgdGhhdCBibG9jayB3aXRoCisgIGAjIGNtYWtlLWZvcm1hdDogb2ZmYCBhbmQgYCMgY21ha2UtZm9ybWF0OiBvbmAgY29tbWVudCBsaW5lcy4KKyogVG8gaW5zdGFsbDogYHN1ZG8gcGlwIGluc3RhbGwgY21ha2VfZm9ybWF0YAorKiBUbyBydW46IGBjbWFrZS1mb3JtYXQgLS1pbi1wbGFjZSAkRklMRU5BTUVgCisqICoqSU1QT1JUQU5UIChKdW5lIDIwMTgpKiogY21ha2UtZm9ybWF0IHYwLjMuNiBoYXMgYQorICBbYnVnXSggaHR0cHM6Ly9naXRodWIuY29tL2NoZXNoaXJla293L2NtYWtlX2Zvcm1hdC9pc3N1ZXMvNTApCisgIHRoYXQgY2FuIGNvcnJ1cHQgdGhlIGZvcm1hdHRpbmcgb2YgY29tbWVudCBsaW5lcyBpbiBDTWFrZSBmaWxlcy4KKyAgQSB3b3JrYXJvdW5kIGlzIHRvIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgX2JlZm9yZV8gcnVubmluZyBjbWFrZS1mb3JtYXQ6CisgIGBzZWQgLS1pbi1wbGFjZT0nJyAncy9eICAqIy8jLycgJEZJTEVOQU1FYAorCisjIyMgKipDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKSoqCisKK1lvdSB3aWxsIGJlIHByb21wdGVkIHdpdGggYSBvbmUtdGltZSAiY2xpY2stdGhyb3VnaCIgQ0xBIGRpYWxvZyBhcyBwYXJ0IG9mIHN1Ym1pdHRpbmcgeW91ciBwdWxsIHJlcXVlc3QKK29yIG90aGVyIGNvbnRyaWJ1dGlvbiB0byBHaXRIdWIuCisKKyMjIyAqKkxpY2Vuc2UgYW5kIENvcHlyaWdodHMqKgorCitBbGwgY29udHJpYnV0aW9ucyBtYWRlIHRvIHRoZSBWdWxrYW4tVmFsaWRhdGlvbkxheWVycyByZXBvc2l0b3J5IGFyZSBLaHJvbm9zIGJyYW5kZWQgYW5kIGFzIHN1Y2gsCithbnkgbmV3IGZpbGVzIG5lZWQgdG8gaGF2ZSB0aGUgS2hyb25vcyBsaWNlbnNlIChBcGFjaGUgMi4wIHN0eWxlKSBhbmQgY29weXJpZ2h0IGluY2x1ZGVkLgorUGxlYXNlIHNlZSBhbiBleGlzdGluZyBmaWxlIGluIHRoaXMgcmVwb3NpdG9yeSBmb3IgYW4gZXhhbXBsZS4KKworQWxsIGNvbnRyaWJ1dGlvbnMgbWFkZSB0byB0aGUgTHVuYXJHIHJlcG9zaXRvcmllcyBhcmUgdG8gYmUgbWFkZSB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlCithbmQgYW55IG5ldyBmaWxlcyBuZWVkIHRvIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBhbnkgYXBwbGljYWJsZSBjb3B5cmlnaHRzLgorCitZb3UgY2FuIGluY2x1ZGUgeW91ciBpbmRpdmlkdWFsIGNvcHlyaWdodCBhZnRlciBhbnkgZXhpc3RpbmcgY29weXJpZ2h0cy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0dPVkVSTkFOQ0UubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9HT1ZFUk5BTkNFLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDNkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9HT1ZFUk5BTkNFLm1kCkBAIC0wLDAgKzEsNTMgQEAKKyMjIFZ1bGthbiBWYWxpZGF0aW9uIExheWVycyBSZXBvc2l0b3J5IE1hbmFnZW1lbnQKKworIyAqKk9wZW4gU291cmNlIFByb2plY3QgliBPYmplY3RpdmVzKioKKworKiBBbGlnbm1lbnQgd2l0aCB0aGUgVnVsa2FuIFNwZWNpZmljYXRpb24KKyAgLSBUaGUgZ29hbCBpcyBmb3IgdmFsaWRhdGlvbiBsYXllciBiZWhhdmlvciB0byBlbmZvcmNlIHRoZSB2dWxrYW4gc3BlY2lmaWNhdGlvbiBvbiBhcHBsaWNhdGlvbnMuIFF1ZXN0aW9ucyBvbiBzcGVjaWZpY2F0aW9uCitpbnRlcnByZXRhdGlvbnMgbWF5IHJlcXVpcmUgY29uc3VsdGluZyB3aXRoIHRoZSBLaHJvbm9zIFZ1bGthbiBXb3JrZ3JvdXAgZm9yIHJlc29sdXRpb24KKyAgICAtIFtDb3JlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjAvaHRtbC92a3NwZWMuaHRtbCkKKyAgICAtIFtIZWFkZXIgRmlsZXNdKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi8jaGVhZGVycykKKyAgICAtIFtTREsgUmVzb3VyY2VzXShodHRwczovL3Z1bGthbi5sdW5hcmcuY29tKQorKiBJU1YgRW5hYmxlbWVudAorICAtIFVwZGF0ZXMgb2YgdmFsaWRhdGlvbiBsYXllciBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gYSB0aW1lbHkgZmFzaGlvbgorICAtIEV2ZXJ5IGVmZm9ydCB3aWxsIGJlIG1hZGUgdG8gYmUgcmVzcG9uc2l2ZSB0byBJU1YgaXNzdWVzIHdpdGggdmFsaWRhdGlvbiBsYXllcnMKKyogQ3Jvc3MgUGxhdGZvcm0gQ29tcGF0aWJpbGl0eQorICAtIEdvb2dsZSBhbmQgTHVuYXJHIGNvbGxhYm9yYXRpb246CisgICAgLSBHb29nbGU6IE1vbml0b3IgZm9yIEFuZHJvaWQKKyAgICAtIEx1bmFyRzogTW9uaXRvciBmb3IgZGVza3RvcCAoV2luZG93cyBhbmQgTGludXgpCisgICAgLSBDb250aW51b3VzIEludGVncmF0aW9uOiBIVyB0ZXN0IGZhcm1zIG9wZXJhdGVkIGJ5IEdvb2dsZSBhbmQgTHVuYXJHIG1vbml0b3IgdmFyaW91cyBoYXJkd2FyZS9zb2Z0d2FyZSBwbGF0Zm9ybXMKKyogUmVwbyBRdWFsaXR5CisgIC0gUmVwbyByZW1haW5zIGluIGhlYWx0aHkgc3RhdGUgd2l0aCBhbGwgdGVzdHMgcGFzc2luZyBhbmQgZ29vZC1xdWFsaXR5LCBjb25zaXN0ZW50IGNvZGViYXNlCisgIC0gQ29udGludW91cyBJbnRlZ3JhdGlvbjogQWxvbmcgd2l0aCBHaXRodWIsIEhXIHRlc3QgZmFybXMgb3BlcmF0ZWQgYnkgR29vZ2xlIGFuZCBMdW5hckcgcGVyZm9ybSBwcmUtY29tbWl0IGNsb3VkIHRlc3RpbmcKK29uIHB1bGwtcmVxdWVzdHMKKworIyAqKlJvbGVzIGFuZCBEZWZpbml0aW9ucyoqCisqIENvbnRyaWJ1dG9yLCBDb21tZW50ZXIsIFVzZXIKKyAgLSBTdWJtaXR0aW5nIGNvbnRyaWJ1dGlvbnMsIGNyZWF0aW5nIGlzc3Vlcywgb3IgdXNpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXBvc2l0b3J5CisqIEFwcHJvdmVyCisgIC0gRXhwZXJpZW5jZWQgcHJvamVjdCBtZW1iZXJzIHdobyBoYXZlIG1hZGUgc2lnbmlmaWNhbnQgdGVjaG5pY2FsIGNvbnRyaWJ1dGlvbnMKKyAgLSBXcml0ZSBjb250cm9sOiBBcHByb3ZlIHB1bGwvbWVyZ2UgcmVxdWVzdHMgKHZlcmlmeSBzdWJtaXNzaW9ucyB2cy4gYWNjZXB0YW5jZSBjcml0ZXJpYSkKKyogVGVjaG5pY2FsIFByb2plY3QgTGVhZHMKKyAgLSBMZWFkIHRoZSBwcm9qZWN0IGluIHRlcm1zIG9mIHZlcnNpb25pbmcsIHF1YWxpdHkgYXNzdXJhbmNlLCBhbmQgb3ZlcmFyY2hpbmcgb2JqZWN0aXZlcworICAtIE1vbml0b3IgZ2l0aHViIGlzc3VlcyBhbmQgZHJpdmUgdGltZWx5IHJlc29sdXRpb24KKyAgLSBEZXNpZ25hdGUgbmV3IGFwcHJvdmVycworICAtIEVuc3VyZSBwcm9qZWN0IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIFJlYWRtZSwgQ29udHJpYnV0aW5nIGRvY3MsIHdpa2ksIGV0Yy4sIGtlcHQgdXAtdG8tZGF0ZQorICAtIEFjdCBhcyBhIGZhY2lsaXRhdG9yIGluIHJlc29sdmluZyB0ZWNobmljYWwgY29uZmxpY3RzCisgIC0gSXMgYSBwb2ludC1vZi1jb250YWN0IGZvciBwcm9qZWN0LXJlbGF0ZWQgcXVlc3Rpb25zCisKK1RoZSB0ZWNobmljYWwgcHJvamVjdCBsZWFkcyBmb3IgdGhpcyByZXBvc2l0b3J5IGFyZToKKyogKipNYXJrIExvYm9kemluc2tpKiogW21hcmtAbHVuYXJnLmNvbV0obWFpbHRvOm1hcmtAbHVuYXJnLmNvbSkKKyogKipUb2JpbiBFaGxpcyoqIFt0b2JpbmVAZ29vZ2xlLmNvbV0obWFpbHRvOnRvYmluZUBnb29nbGUuY29tKQorCisjICoqQWNjZXB0YW5jZSBDcml0ZXJpYSBhbmQgUHJvY2VzcyoqCisgIC0gQWxsIHNvdXJjZSBjb2RlIHRvIGluY2x1ZGUgS2hyb25vcyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgKEFwYWNoZSAyLjApLgorICAgIC0gQWRkaXRpb25hbCBjb3B5cmlnaHRzIG9mIGNvbnRyaWJ1dG9ycyBhcHBlbmRlZAorICAtIENvbnRyaWJ1dGlvbnMgYXJlIHZpYSBwdWxsIHJlcXVlc3RzCisgICAgLSBQcm9qZWN0IGxlYWRzIHdpbGwgYXNzaWduaW5nIGFwcHJvdmVycyB0byBjb250cmlidXRvciBwdWxsIHJlcXVlc3RzCisgICAgLSBBcHByb3ZlcnMgY2FuIHNlbGYtYXNzaWduIHRoZWlyIHJldmlld2VycworICAgIC0gRm9yIGNvbXBsZXggb3IgaW52YXNpdmUgY29udHJpYnV0aW9ucywgUHJvamVjdCBMZWFkcyBtYXkgcmVxdWVzdCBhcHByb3ZhbCBmcm9tIHNwZWNpZmljIHJldmlld2VycworICAgIC0gQXQgbGVhc3Qgb25lIHJldmlldyBhcHByb3ZhbCBpcyByZXF1aXJlZCB0byBjb21wbGV0ZSBhIHB1bGwgcmVxdWVzdAorICAgIC0gVGhlIGdvYWwgaXMgdG8gYmUgcmVzcG9uc2l2ZSB0byBjb250cmlidXRvcnMgd2hpbGUgZW5zdXJpbmcgYWNjZXB0YW5jZSBjcml0ZXJpYSBpcyBtZXQgYW5kIHRvIGZhY2lsaXRhdGUgdGhlaXIgc3VibWlzc2lvbnMKKyAgICAtIEFwcHJvdmFsIGlzIGRlcGVuZGVudCB1cG9uIGFkaGVyZW5jZSB0byB0aGUgZ3VpZGVsaW5lcyBpbiBbQ09OVFJJQlVUSU5HLm1kXShDT05UUklCVVRJTkcubWQpLCBhbmQgYWxpZ25tZW50IHdpdGgKK3JlcG9zaXRvcnkgZ29hbHMgb2YgbWFpbnRhaW5hYmlsaXR5LCBjb21wbGV0ZW5lc3MsIGFuZCBxdWFsaXR5CisgICAgLSBDb25mbGljdHMgb3IgcXVlc3Rpb25zIHdpbGwgdWx0aW1hdGVseSBiZSByZXNvbHZlZCBieSB0aGUgcHJvamVjdCBsZWFkcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvTEFZRVJfQ09ORklHVVJBVElPTi5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0xBWUVSX0NPTkZJR1VSQVRJT04ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzZTY4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0xBWUVSX0NPTkZJR1VSQVRJT04ubWQKQEAgLTAsMCArMSwxNDMgQEAKKzwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgTUQwNDEgLS0+Cis8IS0tIENvcHlyaWdodCAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuIC0tPgorCitbIVtLaHJvbm9zIFZ1bGthbl1bMV1dWzJdCisKK1sxXTogaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS9pbWcvVnVsa2FuXzEwMHB4X0RlYzE2LnBuZyAiaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvdnVsa2FuLyIKK1syXTogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvdnVsa2FuLworCisjIExheWVycyBPdmVydmlldyBhbmQgQ29uZmlndXJhdGlvbgorCitbIVtDcmVhdGl2ZSBDb21tb25zXVszXV1bNF0KKworWzNdOiBodHRwczovL2kuY3JlYXRpdmVjb21tb25zLm9yZy9sL2J5LW5kLzQuMC84OHgzMS5wbmcgIkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIKK1s0XTogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5kLzQuMC8KKworVnVsa2FuIHN1cHBvcnRzIGludGVyY2VwdGluZyBvciBob29raW5nIEFQSSBlbnRyeSBwb2ludHMgdmlhIGEgbGF5ZXIgZnJhbWV3b3JrLiAgQSBsYXllciBjYW4gaW50ZXJjZXB0IGFsbCBvciBhbnkgc3Vic2V0IG9mIFZ1bGthbiBBUEkgZW50cnkgcG9pbnRzLiAgTXVsdGlwbGUgbGF5ZXJzIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyIHRvIGNhc2NhZGUgdGhlaXIgZnVuY3Rpb25hbGl0eSBpbiB0aGUgYXBwZWFyYW5jZSBvZiBhIHNpbmdsZSwgbGFyZ2VyIGxheWVyLgorCitWdWxrYW4gdmFsaWRhdGlvbiBhbmQgdXRpbGl0eSBsYXllcnMgZ2l2ZSBWdWxrYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVycyB0aGUgYWJpbGl0eSB0byBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIGFwcGxpY2F0aW9ucyB3aXRob3V0IG1vZGlmeWluZyB0aGUgYXBwbGljYXRpb24gaXRzZWxmLCBlLmcuLCBkdW1waW5nIEFQSSBlbnRyeSBwb2ludHMgb3IgZ2VuZXJhdGluZyBzY3JlZW5zaG90cyBvZiBzcGVjaWZpZWQgZnJhbWVzLgorCisjIyMgVnVsa2FuIENvbmZpZ3VyYXRvciBUb29sCisKK0RldmVsb3BlcnMgY2FuIHVzZSB0aGUgVnVsa2FuIENvbmZpZ3VyYXRvciwgYHZrY29uZmlnYCwgdG8gZW5hYmxlIGV4cGxpY2l0IGxheWVycyBhbmQgZGlzYWJsZSBpbXBsaWNpdCBsYXllcnMgYXMgd2VsbCBhcyBjaGFuZ2UgbGF5ZXIgc2V0dGluZ3MgdGhyb3VnaCBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZS4gIFBsZWFzZSBzZWUgW3RoZSBWdWxrYW4gQ29uZmlndXJhdG9yIGRvY3VtZW50YXRpb24gaW4gdGhlIFZ1bGthbiBTREtdKGh0dHBzOi8vdnVsa2FuLmx1bmFyZy5jb20vZG9jL3Nkay9sYXRlc3Qvd2luZG93cy92a2NvbmZpZy5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgVnVsa2FuIENvbmZpZ3VyYXRvci4gQ29udGludWUgcmVhZGluZyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBjb25maWd1cmUgbGF5ZXJzIHdpdGhvdXQgdXNpbmcgdmtjb25maWcuCisKKyMjIEFjdGl2YXRpbmcgTGF5ZXJzIG9uIFdpbmRvd3MKK0JlZm9yZSBvciBkdXJpbmcgZXhlY3V0aW9uIG9mIGEgVnVsa2FuIGFwcGxpY2F0aW9uLCB0aGUgbG9hZGVyIG11c3QgYmUgaW5mb3JtZWQgb2YgdGhlIGxheWVycyB0byBhY3RpdmF0ZS4KK1RoaXMgY2FuIGJlIGRvbmUgaW4gdHdvIHdheXM6ICBwcm9ncmFtbWF0aWNhbGx5LCBvciBieSB1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK0FwcGxpY2F0aW9ucyBtYXkgcHJvZ3JhbW1hdGljYWxseSBhY3RpdmF0ZSBsYXllcnMgdmlhIHRoZSBgdmtDcmVhdGVJbnN0YW5jZSgpYCBlbnRyeSBwb2ludC4KKworTGF5ZXJzIG1heSBhbHNvIGJlIGFjdGl2YXRlZCBieSB1c2luZyB0aGUgYFZLX0lOU1RBTkNFX0xBWUVSU2AgZW52aXJvbm1lbnQgdmFyaWFibGUuCitUaGUgdmFyaWFibGUgc2hvdWxkIGluY2x1ZGUgYSBzZW1pLWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGxheWVyIG5hbWVzIHRvIGFjdGl2YXRlLgorTm90ZSB0aGF0IG9yZGVyIGlzIHJlbGV2YW50LCB3aXRoIHRoZSBpbml0aWFsIGxheWVyIGJlaW5nIHRoZSBjbG9zZXN0IHRvIHRoZSBhcHBsaWNhdGlvbiwgYW5kIHRoZSBmaW5hbCBsYXllciBiZWluZyBjbG9zZXN0IHRvIHRoZSBkcml2ZXIuCisKK1RoZSBsaXN0IG9mIGxheWVycyB0byBhY3RpdmF0ZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nIGluIGEgQ29tbWFuZCBXaW5kb3c6CisKK2BgYAorQzpcPiBzZXQgVktfSU5TVEFOQ0VfTEFZRVJTPVZLX0xBWUVSX0xVTkFSR19hcGlfZHVtcDtWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24KK2BgYAorSW4gdGhpcyBleGFtcGxlLCB0aGUgYXBpX2R1bXAgbGF5ZXIgd2lsbCBiZSBjYWxsZWQgX2JlZm9yZV8gdGhlIEtocm9ub3MgdmFsaWRhdGlvbiBsYXllci4KKworYFZLX0lOU1RBTkNFX0xBWUVSU2AgbWF5IGFsc28gYmUgc2V0IGluIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCitUbyBhY3RpdmF0ZSBsYXllcnMgbG9jYXRlZCBpbiBhIHBhcnRpY3VsYXIgU0RLIGluc3RhbGxhdGlvbiwgb3IgbGF5ZXJzIGJ1aWx0IGxvY2FsbHkgZnJvbSBzb3VyY2UsIHNwZWNpZnkgdGhlIGxheWVyIEpTT04gbWFuaWZlc3QgZmlsZSBkaXJlY3RvcnkgdXNpbmcgdGhlIGBWS19MQVlFUl9QQVRIYCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK0ZvciBleGFtcGxlLCBpZiBhIFZ1bGthbiBTREsgaXMgaW5zdGFsbGVkIGluIGBDOlxWdWxrYW5TREtcMS4xLjEyMWAsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBpbiBhIENvbW1hbmQgV2luZG93OgorCitgYGAKK0M6XD4gc2V0IFZLX0xBWUVSX1BBVEg9QzpcVnVsa2FuU0RLXDEuMS4xMjFcQmluCitDOlw+IHNldCBWS19JTlNUQU5DRV9MQVlFUlM9VktfTEFZRVJfTFVOQVJHX2FwaV9kdW1wO1ZLX0xBWUVSX0tIUk9OT1NfdmFsaWRhdGlvbgorQzpcPiB2a2N1YmUKK2BgYAorCisjIyBBY3RpdmF0aW5nIExheWVycyBvbiBMaW51eCBhbmQgbWFjT1MKK0JlZm9yZSBvciBkdXJpbmcgZXhlY3V0aW9uIG9mIGEgVnVsa2FuIGFwcGxpY2F0aW9uLCB0aGUgbG9hZGVyIG11c3QgYmUgaW5mb3JtZWQgb2YgdGhlIGxheWVycyB0byBhY3RpdmF0ZS4KK1RoaXMgY2FuIGJlIGRvbmUgaW4gdHdvIHdheXM6ICBwcm9ncmFtbWF0aWNhbGx5LCBvciBieSB1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK0FwcGxpY2F0aW9ucyBtYXkgcHJvZ3JhbW1hdGljYWxseSBhY3RpdmF0ZSBsYXllcnMgdmlhIHRoZSBgdmtDcmVhdGVJbnN0YW5jZSgpYCBlbnRyeSBwb2ludC4KKworTGF5ZXJzIG1heSBhbHNvIGJlIGFjdGl2YXRlZCBieSB1c2luZyB0aGUgYFZLX0lOU1RBTkNFX0xBWUVSU2AgZW52aXJvbm1lbnQgdmFyaWFibGUuCitUaGUgdmFyaWFibGUgc2hvdWxkIGluY2x1ZGUgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBsYXllciBuYW1lcyB0byBhY3RpdmF0ZS4KK05vdGUgdGhhdCBvcmRlciBpcyByZWxldmFudCwgd2l0aCB0aGUgaW5pdGlhbCBsYXllciBiZWluZyB0aGUgY2xvc2VzdCB0byB0aGUgYXBwbGljYXRpb24sIGFuZCB0aGUgZmluYWwgbGF5ZXIgYmVpbmcgY2xvc2VzdCB0byB0aGUgZHJpdmVyLgorCitGb3IgZXhhbXBsZSwgdGhlIGxpc3Qgb2YgZXhwbGljaXQgbGF5ZXJzIHRvIGFjdGl2YXRlIGNhbiBiZSBzcGVjaWZpZWQgd2l0aDoKKworYGBgCiskIGV4cG9ydCBWS19JTlNUQU5DRV9MQVlFUlM9VktfTEFZRVJfTFVOQVJHX2FwaV9kdW1wOlZLX0xBWUVSX0tIUk9OT1NfdmFsaWRhdGlvbgorYGBgCisKK1RvIGFjdGl2YXRlIGxheWVycyBpbiBhIHBhcnRpY3VsYXIgU0RLIGluc3RhbGxhdGlvbiwgb3IgbGF5ZXJzIGJ1aWx0IGxvY2FsbHkgZnJvbSBzb3VyY2UsIGlkZW50aWZ5IGNlcnRhaW4gbGlicmFyeSBwYXRocyBhbmQgdGhlIGxheWVyIEpTT04gbWFuaWZlc3QgZmlsZSBkaXJlY3RvcnkgaW4gYWRkaXRpb24gdG8gdGhlIGxheWVycyB0byBhY3RpdmF0ZS4gIAorCitGb3IgTGludXgsIGlmIHRoZSBWdWxrYW4gU0RLIHdhcyBsb2NhbGx5IGluc3RhbGxlZCB0byBgL3Nka3NgLCBgVlVMS0FOX1NESz0vc2Rrcy9WdWxrYW5TREsvMS4xLjEyMS94ODZfNjRgOgorCitgYGAKKyQgZXhwb3J0IFZLX0xBWUVSX1BBVEg9JFZVTEtBTl9TREsvbGliL3Z1bGthbi9sYXllcnMKKyQgZXhwb3J0IExEX0xJQlJBUllfUEFUSD0kVlVMS0FOX1NESy9saWI6JFZVTEtBTl9TREsvbGliL3Z1bGthbi9sYXllcnMKKyQgZXhwb3J0IFZLX0lOU1RBTkNFX0xBWUVSUz1WS19MQVlFUl9MVU5BUkdfYXBpX2R1bXA6VktfTEFZRVJfS0hST05PU192YWxpZGF0aW9uCiskIC4vdmtjdWJlCitgYGAKKworRm9yIG1hY09TLCBpZiB0aGUgVnVsa2FuIFNESyB3YXMgbG9jYWxseSBpbnN0YWxsZWQgdG8gYC9zZGtzYCwgYFZVTEtBTl9TREs9L3Nka3MvVnVsa2FuU0RLLzEuMS4xMjEvbWFjT1NgOgorCitgYGAKKyQgZXhwb3J0IFZLX0xBWUVSX1BBVEg9JFZVTEtBTl9TREsvZXRjL3Z1bGthbi9leHBsaWNpdF9sYXllcnMuZAorJCBleHBvcnQgRFlMRF9MSUJSQVJZX1BBVEg9JFZVTEtBTl9TREsvbGliCiskIGV4cG9ydCBWS19JTlNUQU5DRV9MQVlFUlM9VktfTEFZRVJfTFVOQVJHX2FwaV9kdW1wOlZLX0xBWUVSX0tIUk9OT1NfdmFsaWRhdGlvbgorJCBjZCAkVlVMS0FOX1NESy8uLi9BcHBsaWNhdGlvbnMvCiskIG9wZW4gdmtjdWJlLmFwcAorYGBgCisKKyMjIyBMYXllciBTZXR0aW5ncyBGaWxlCitJbiBhZGRpdGlvbiB0byBhY3RpdmF0aW5nIHRoZSBsYXllcnMsIGF2YWlsYWJsZSBsYXllciBvcHRpb25zIGNhbiBiZSBzZXQgdmlhIHRoZSBgdmtfbGF5ZXJfc2V0dGluZ3MudHh0YCBzZXR0aW5ncyBmaWxlLgorQnkgZGVmYXVsdCwgdGhlIHNldHRpbmdzIGZpbGUgbXVzdCBiZSBuYW1lZCBgdmtfbGF5ZXJfc2V0dGluZ3MudHh0YCBhbmQgcmVzaWRlIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgdGFyZ2V0ZWQgYXBwbGljYXRpb24uCitJZiBgVktfTEFZRVJfU0VUVElOR1NfUEFUSGAgaXMgc2V0IGFuZCBpcyBhIGRpcmVjdG9yeSwgdGhlbiB0aGUgc2V0dGluZ3MgZmlsZSBtdXN0IGJlIGEgZmlsZSBjYWxsZWQgYHZrX2xheWVyX3NldHRpbmdzLnR4dGAgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieSBgVktfTEFZRVJfU0VUVElOR1NfUEFUSGAuCitJZiBgVktfTEFZRVJfU0VUVElOR1NfUEFUSGAgaXMgc2V0IGFuZCBpcyBub3QgYSBkaXJlY3RvcnksIHRoZW4gaXQgbXVzdCBwb2ludCB0byBhIGZpbGUgKHdpdGggYW55IG5hbWUpIHdoaWNoIGlzIHRoZSBsYXllciBzZXR0aW5ncyBmaWxlLgorCitOb3RlOiAgVG8gY29udHJvbCBsYXllciByZXBvcnRpbmcgb3V0cHV0LCBhIGxheWVyIHNldHRpbmdzIGZpbGUgbXVzdCBiZSBwcm92aWRlZCB0aGF0IGlkZW50aWZpZXMgc3BlY2lmaWMgcmVwb3J0aW5nIGxldmVscyBmb3IgdGhlIGxheWVycyBlbmFibGVkIHZpYSB0aGUgYFZLX0lOU1RBTkNFX0xBWUVSU2AgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK1RoZSBzZXR0aW5ncyBmaWxlIGNvbnNpc3RzIG9mIGNvbW1lbnQgbGluZXMgYW5kIHNldHRpbmdzIGxpbmVzLiAgQ29tbWVudCBsaW5lcyBiZWdpbiB3aXRoIHRoZSBgI2AgY2hhcmFjdGVyLiAgU2V0dGluZ3MgbGluZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgYDxgKmBMYXllck5hbWVgKmA+LjxgKmBzZXR0aW5nX25hbWVgKmA+ID0gPGAqYHNldHRpbmdfdmFsdWVgKmA+YAorCit8IFNldHRpbmcgICAgICAgICAgICAgICAgICB8IFZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgKmBMYXllck5hbWVgKmAucmVwb3J0X2ZsYWdzYCB8IGBpbmZvYCAgICAgIHwgUmVwb3J0IGluZm9ybWF0aW9uIGxldmVsIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgd2FybmAgICAgICB8IFJlcG9ydCB3YXJuaW5nIGxldmVsIG1lc3NhZ2VzICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYHBlcmZgICAgICAgfCBSZXBvcnQgcGVyZm9ybWFuY2UgbGV2ZWwgd2FybmluZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZXJyb3JgICAgICB8IFJlcG9ydCBlcnJvciBsZXZlbCBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZGVidWdgICAgICAgfCBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgKmBMYXllck5hbWVgKmAuZGVidWdfYWN0aW9uYCB8IGBWS19EQkdfTEFZRVJfQUNUSU9OX0lHTk9SRWAgICB8IElnbm9yZSBtZXNzYWdlIHJlcG9ydGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHYCAgfCBSZXBvcnQgbWVzc2FnZXMgdG8gbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYFZLX0RCR19MQVlFUl9BQ1RJT05fREVCVUdfT1VUUFVUYCAgICB8IChXaW5kb3dzKSBSZXBvcnQgbWVzc2FnZXMgdG8gZGVidWcgY29uc29sZSBvZiBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbworfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBWS19EQkdfTEFZRVJfQUNUSU9OX0JSRUFLYCAgICB8IEJyZWFrIG9uIG1lc3NhZ2VzIChub3QgY3VycmVudGx5IHVzZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgKmBMYXllck5hbWVgKmAubG9nX2ZpbGVuYW1lYCB8ICpgZmlsZW5hbWVgKmAudHh0YCAgICAgICAgICAgICB8IE5hbWUgb2YgZmlsZSB0byBsb2cgYHJlcG9ydF9mbGFnc2AgbGV2ZWwgbWVzc2FnZXM7IGRlZmF1bHQgaXMgYHN0ZG91dGAgfAorfCAqYExheWVyTmFtZWAqYC5lbmFibGVzYCB8IGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUYCBlbnVtIHZhbHVlcyBhcyBkZWZpbmVkIGluIHRoZSBWdWxrYW4gU3BlY2lmaWNhdGlvbiAgICAgIHwgRW5hYmxlcyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRpb24gZmVhdHVyZXMgICAgICAgICB8Cit8ICpgTGF5ZXJOYW1lYCpgLmRpc2FibGVzYCB8IGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGBWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVGAgZW51bSB2YWx1ZXMgYXMgZGVmaW5lZCBpbiB0aGUgVnVsa2FuIFNwZWNpZmljYXRpb24gICAgICB8IERpc2FibGVzIHRoZSBzcGVjaWZpZWQgdmFsaWRhdGlvbiBmZWF0dXJlcyAgICAgICAgIHwKKworCisKK1NhbXBsZSBsYXllciBzZXR0aW5ncyBmaWxlIGNvbnRlbnRzOgorCitgYGAKK2tocm9ub3NfdmFsaWRhdGlvbi5yZXBvcnRfZmxhZ3MgPSBpbmZvLGVycm9yCitraHJvbm9zX3ZhbGlkYXRpb24uZGVidWdfYWN0aW9uID0gVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHCitraHJvbm9zX3ZhbGlkYXRpb24uZGlzYWJsZSA9IFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1VOSVFVRV9IQU5ETEVTX0VYVCAKKyMgVktfTEFZRVJfTFVOQVJHX2FwaV9kdW1wIGN1c3RvbSBzZXR0aW5ncworbHVuYXJnX2FwaV9kdW1wLm5vX2FkZHIgPSBUUlVFCitsdW5hcmdfYXBpX2R1bXAuZmlsZSA9IEZBTFNFCitgYGAKK0luIHRoZSBWdWxrYW4tVmFsaWRhdGlvbkxheWVycyByZXBvc2l0b3J5LCBhIHNhbXBsZSBsYXllciBzZXR0aW5ncyBmaWxlIGNhbiBiZSBmb3VuZCBpbiB0aGUgJ2xheWVycycgZGlyZWN0b3J5LCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tVmFsaWRhdGlvbkxheWVycy9ibG9iL21hc3Rlci9sYXllcnMvdmtfbGF5ZXJfc2V0dGluZ3MudHh0KS4KK0luIHRoZSBWdWxrYW4gU0RLLCB0aGlzIExpbnV4IHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIGxvY2F0ZWQgaW4gYGNvbmZpZy92a19sYXllcl9zZXR0aW5ncy50eHRgIG9mIHlvdXIgbG9jYWwgVnVsa2FuIFNESyBpbnN0YWxsLgorT24gV2luZG93cywgeW91IGNhbiBmaW5kIGEgc2FtcGxlIGxheWVyIHNldHRpbmdzIGZpbGUgaW4gYENvbmZpZ1x2a19sYXllcl9zZXR0aW5ncy50eHRgIG9mIHlvdXIgbG9jYWwgVnVsa2FuIFNESyBpbnN0YWxsLgorQ29uc3VsdCB0aGVzZSBzYW1wbGUgbGF5ZXIgc2V0dGluZ3MgZmlsZXMgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYW5kIGRldGFpbCByZWxhdGVkIHRvIGF2YWlsYWJsZSBvcHRpb25zIGFuZCBzZXR0aW5ncy4KKworTm90ZTogSWYgbGF5ZXJzIGFyZSBhY3RpdmF0ZWQgdmlhIGBWS19JTlNUQU5DRV9MQVlFUlNgIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCBpZiBuZWl0aGVyIGFuIGFwcGxpY2F0aW9uLWRlZmluZWQgY2FsbGJhY2sgaXMgZGVmaW5lZCBub3IgYSBsYXllciBzZXR0aW5ncyBmaWxlIGlzIHByZXNlbnQsIHRoZSBsb2FkZXIvbGF5ZXJzIHdpbGwgcHJvdmlkZSBkZWZhdWx0IGNhbGxiYWNrcyBlbmFibGluZyBvdXRwdXQgb2YgZXJyb3ItbGV2ZWwgbWVzc2FnZXMgdG8gc3RhbmRhcmQgb3V0IChhbmQgdmlhIGBPdXRwdXREZWJ1Z1N0cmluZ2Agb24gV2luZG93cykuCisKKyMjIEFkdmFuY2VkIExheWVyIENvbmZpZ3VyYXRpb24sIEluc3RhbGxhdGlvbiwgYW5kIERpc2NvdmVyeSBEZXRhaWxzCitUaGUgVnVsa2FuIGxvYWRlciBzZWFyY2hlcyBzcGVjaWZpYyBwbGF0Zm9ybS1zcGVjaWZpYyBsb2NhdGlvbnMgdG8gZmluZCBpbnN0YWxsZWQgbGF5ZXJzLgorRm9yIGFkZGl0aW9uYWwgZGV0YWlscywgc2VlIHRoZSBgTG9hZGVyQW5kTGF5ZXJJbnRlcmZhY2UubWRgIGF2YWlsYWJsZSBbaGVyZV0oaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS9kb2Mvc2RrL2xhdGVzdC93aW5kb3dzL2xvYWRlcl9hbmRfbGF5ZXJfaW50ZXJmYWNlLmh0bWwpLAorb3IgaW4gdGhlIFZ1bGthbi1Mb2FkZXIgcmVwb3NpdG9yeSwgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLUxvYWRlci9ibG9iL21hc3Rlci9sb2FkZXIvTG9hZGVyQW5kTGF5ZXJJbnRlcmZhY2UubWQpLgorCitTZXR0aW5nIHRoZSBgVktfTEFZRVJfUEFUSGAgZW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGxvYWRlciBsYXllciBzZWFyY2ggbWVjaGFuaXNtLgorV2hlbiBzZXQsIHRoZSBsb2FkZXIgd2lsbCBzZWFyY2ggb25seSB0aGUgZGlyZWN0b3J5KHMpIGlkZW50aWZpZWQgYnkgdGhlIGBWS19MQVlFUl9QQVRIYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgbGF5ZXIgbWFuaWZlc3QgZmlsZXMuCisKK0FwcGxpY2F0aW9ucyBjYW4gcXVlcnkgYXZhaWxhYmxlIGxheWVycyB2aWEgdGhlIGB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKClgIGNvbW1hbmQuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9MSUNFTlNFLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTllMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDIwNyBAQAorVGhlIG1ham9yaXR5IG9mIGZpbGVzIGluIHRoaXMgcHJvamVjdCB1c2UgdGhlIEFwYWNoZSAyLjAgTGljZW5zZS4KK1RoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zIGFuZCB0aGVpciBsaWNlbnNlIGNhbiBiZSBmb3VuZCBpbiB0aGUgc291cmNlLgorQW55IGxpY2Vuc2UgZGV2aWF0aW9ucyBmcm9tIEFwYWNoZSAyLjAgYXJlICJtb3JlIHBlcm1pc3NpdmUiIGxpY2Vuc2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzRiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBWdWxrYW4gRWNvc3lzdGVtIENvbXBvbmVudHMKKworVGhpcyBwcm9qZWN0IHByb3ZpZGVzIHRoZSBLaHJvbm9zIG9mZmljaWFsIFZ1bGthbiB2YWxpZGF0aW9uIGxheWVycyBmb3IgV2luZG93cywgTGludXgsIEFuZHJvaWQsIGFuZCBNYWNPUy4KKworIyMgQ0kgQnVpbGQgU3RhdHVzCit8IFBsYXRmb3JtIHwgQnVpbGQgU3RhdHVzIHwKK3w6LS0tLS0tLS06fDotLS0tLS0tLS0tLS06fAorfCBMaW51eC9BbmRyb2lkIHwgWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvS2hyb25vc0dyb3VwL1Z1bGthbi1WYWxpZGF0aW9uTGF5ZXJzLnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL0tocm9ub3NHcm91cC9WdWxrYW4tVmFsaWRhdGlvbkxheWVycykgfAorfCBXaW5kb3dzIHxbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvOHdkdXE0cjVkOWo4bmhkdj9zdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvS2hyb25vc3dlYm1hc3Rlci92dWxrYW4tdmFsaWRhdGlvbmxheWVycy9icmFuY2gvbWFzdGVyKSB8CisKKworIyMgSW50cm9kdWN0aW9uCisKK1Z1bGthbiBpcyBhbiBFeHBsaWNpdCBBUEksIGVuYWJsaW5nIGRpcmVjdCBjb250cm9sIG92ZXIgaG93IEdQVXMgYWN0dWFsbHkgd29yay4gQnkgZGVzaWduLCBtaW5pbWFsIGVycm9yIGNoZWNraW5nIGlzIGRvbmUgaW5zaWRlCithIFZ1bGthbiBkcml2ZXIuIEFwcGxpY2F0aW9ucyBoYXZlIGZ1bGwgY29udHJvbCBhbmQgcmVzcG9uc2liaWxpdHkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLiBBbnkgZXJyb3JzIGluCitob3cgVnVsa2FuIGlzIHVzZWQgY2FuIHJlc3VsdCBpbiBhIGNyYXNoLiBUaGlzIHByb2plY3QgcHJvdmlkZXMgVnVsa2FuIHZhbGlkYXRpb24gbGF5ZXJzIHRoYXQgY2FuIGJlIGVuYWJsZWQKK3RvIGFzc2lzdCBkZXZlbG9wbWVudCBieSBlbmFibGluZyBkZXZlbG9wZXJzIHRvIHZlcmlmeSB0aGVpciBhcHBsaWNhdGlvbnMgY29ycmVjdCB1c2Ugb2YgdGhlIFZ1bGthbiBBUEkuCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeToKKy0gWypWYWxpZGF0aW9uIExheWVycypdKGxheWVycy8pCistIFsqVGVzdHMqXSh0ZXN0cy8pCisKKyMjIENvbnRhY3QgSW5mb3JtYXRpb24KKyogW1RvYmluIEVobGlzXShtYWlsdG86dG9iaW5lQGdvb2dsZS5jb20pCisqIFtNYXJrIExvYm9kemluc2tpXShtYWlsdG86bWFya0BsdW5hcmcuY29tKQorCisjIyBJbmZvcm1hdGlvbiBmb3IgRGV2ZWxvcGluZyBvciBDb250cmlidXRpbmc6CisKK1BsZWFzZSBzZWUgdGhlIFtDT05UUklCVVRJTkcubWRdKENPTlRSSUJVVElORy5tZCkgZmlsZSBpbiB0aGlzIHJlcG9zaXRvcnkgZm9yIG1vcmUgZGV0YWlscy4KK1BsZWFzZSBzZWUgdGhlIFtHT1ZFUk5BTkNFLm1kXShHT1ZFUk5BTkNFLm1kKSBmaWxlIGluIHRoaXMgcmVwb3NpdG9yeSBmb3IgcmVwb3NpdG9yeSBtYW5hZ2VtZW50IGRldGFpbHMuCisKKyMjIEhvdyB0byBCdWlsZCBhbmQgUnVuCisKK1tCVUlMRC5tZF0oQlVJTEQubWQpCitJbmNsdWRlcyBkaXJlY3Rpb25zIGZvciBidWlsZGluZyBhbGwgY29tcG9uZW50cyBhcyB3ZWxsIGFzIHJ1bm5pbmcgdmFsaWRhdGlvbiB0ZXN0cy4KKworSW5mb3JtYXRpb24gb24gaG93IHRvIGVuYWJsZSB0aGUgdmFyaW91cyBWYWxpZGF0aW9uIGxheWVycyBpcyBpbiBbTEFZRVJfQ09ORklHVVJBVElPTi5tZF0oTEFZRVJfQ09ORklHVVJBVElPTi5tZCkuCisKKyMjIFZlcnNpb24gVGFnZ2luZyBTY2hlbWUKKworVXBkYXRlcyB0byB0aGUgYFZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzYCByZXBvc2l0b3J5IHdoaWNoIGNvcnJlc3BvbmQgdG8gYSBuZXcgVnVsa2FuIHNwZWNpZmljYXRpb24gcmVsZWFzZSBhcmUgdGFnZ2VkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBgdjxgX2B2ZXJzaW9uYF9gPmAgKGUuZy4sIGB2MS4xLjk2YCkuCisKKyoqTm90ZSoqOiBNYXJrZWQgdmVyc2lvbiByZWxlYXNlcyBoYXZlIHVuZGVyZ29uZSB0aG9yb3VnaCB0ZXN0aW5nIGJ1dCBkbyBub3QgaW1wbHkgdGhlIHNhbWUgcXVhbGl0eSBsZXZlbCBhcyBTREsgdGFncy4gU0RLIHRhZ3MgZm9sbG93IHRoZSBgc2RrLTxgX2B2ZXJzaW9uYF9gPi48YF9gcGF0Y2hgX2A+YCBmb3JtYXQgKGUuZy4sIGBzZGstMS4xLjkyLjBgKS4KKworVGhpcyBzY2hlbWUgd2FzIGFkb3B0ZWQgZm9sbG93aW5nIHRoZSAxLjEuOTYgVnVsa2FuIHNwZWNpZmljYXRpb24gcmVsZWFzZS4KKworIyMgTGljZW5zZQorVGhpcyB3b3JrIGlzIHJlbGVhc2VkIGFzIG9wZW4gc291cmNlIHVuZGVyIGEgQXBhY2hlLXN0eWxlIGxpY2Vuc2UgZnJvbSBLaHJvbm9zIGluY2x1ZGluZyBhIEtocm9ub3MgY29weXJpZ2h0LgorCitTZWUgW0xJQ0VOU0UudHh0XShMSUNFTlNFLnR4dCkgZm9yIGEgZnVsbCBsaXN0IG9mIGxpY2Vuc2VzIHVzZWQgaW4gdGhpcyByZXBvc2l0b3J5LgorCisjIyBBY2tub3dsZWRnZW1lbnRzCitXaGlsZSB0aGlzIHByb2plY3QgaGFzIGJlZW4gZGV2ZWxvcGVkIHByaW1hcmlseSBieSBMdW5hckcsIEluYy4sIHRoZXJlIGFyZSBtYW55IG90aGVyCitjb21wYW5pZXMgYW5kIGluZGl2aWR1YWxzIG1ha2luZyB0aGlzIHBvc3NpYmxlOiBWYWx2ZSBDb3Jwb3JhdGlvbiwgZnVuZGluZworcHJvamVjdCBkZXZlbG9wbWVudDsgR29vZ2xlIHByb3ZpZGluZyBzaWduaWZpY2FudCBjb250cmlidXRpb25zIHRvIHRoZSB2YWxpZGF0aW9uIGxheWVyczsKK0tocm9ub3MgcHJvdmlkaW5nIG92ZXJzaWdodCBhbmQgaG9zdGluZyBvZiB0aGUgcHJvamVjdC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU3ZDZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMiIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisKKyAgICA8IS0tIFRoaXMgaXMgdGhlIHBsYXRmb3JtIEFQSSB3aGVyZSBOYXRpdmVBY3Rpdml0eSB3YXMgaW50cm9kdWNlZC4gLS0+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjYiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjYiLz4KKworICAgIDwhLS0gVGhpcyAuYXBrIGhhcyBubyBKYXZhIGNvZGUgaXRzZWxmLCBzbyBzZXQgaGFzQ29kZSB0byBmYWxzZS4gLS0+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIGFuZHJvaWQ6ZGVidWdnYWJsZT0nZmFsc2UnPgorCisgICAgICAgIDwhLS0gVGhpcyBhbGxvd3Mgd3JpdGluZyBsb2cgZmlsZXMgdG8gc2RjYXJkIC0tPgorICAgICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiLz4KKworICAgICAgICA8IS0tIE91ciBhY3Rpdml0eSBpcyB0aGUgYnVpbHQtaW4gTmF0aXZlQWN0aXZpdHkgZnJhbWV3b3JrIGNsYXNzLgorICAgICAgICAgICAgIFRoaXMgd2lsbCB0YWtlIGNhcmUgb2YgaW50ZWdyYXRpbmcgd2l0aCBvdXIgTkRLIGNvZGUuIC0tPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5OYXRpdmVBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICA8IS0tIFRlbGwgTmF0aXZlQWN0aXZpdHkgdGhlIG5hbWUgb2Ygb3IgLnNvIC0tPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmxpYl9uYW1lIiBhbmRyb2lkOnZhbHVlPSJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cyIvPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9idWlsZF9hbGwuc2ggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2J1aWxkX2FsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNmQzZmJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9idWlsZF9hbGwuc2gKQEAgLTAsMCArMSw3MyBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpZiBbIC16ICIke0FORFJPSURfU0RLX0hPTUV9IiBdOwordGhlbiBlY2hvICJQbGVhc2Ugc2V0IEFORFJPSURfU0RLX0hPTUUsIGV4aXRpbmciOyBleGl0IDE7CitlbHNlIGVjaG8gIkFORFJPSURfU0RLX0hPTUUgaXMgJHtBTkRST0lEX1NES19IT01FfSI7CitmaQorCitpZiBbIC16ICIke0FORFJPSURfTkRLX0hPTUV9IiBdOwordGhlbiBlY2hvICJQbGVhc2Ugc2V0IEFORFJPSURfTkRLX0hPTUUsIGV4aXRpbmciOyBleGl0IDE7CitlbHNlIGVjaG8gIkFORFJPSURfTkRLX0hPTUUgaXMgJHtBTkRST0lEX05ES19IT01FfSI7CitmaQorCitpZiBbWyAkKHVuYW1lKSA9PSAiTGludXgiIF1dOyB0aGVuCisgICAgY29yZXM9JChucHJvYykgfHwgZWNobyA0CitlbGlmIFtbICQodW5hbWUpID09ICJEYXJ3aW4iIF1dOyB0aGVuCisgICAgY29yZXM9JChzeXNjdGwgLW4gaHcubmNwdSkgfHwgZWNobyA0CitmaQorCitmdW5jdGlvbiBmaW5kdG9vbCgpIHsKKyAgICBpZiBbWyAhICQodHlwZSAtdCAkMSkgXV07IHRoZW4KKyAgICAgICAgZWNobyBDb21tYW5kICQxIG5vdCBmb3VuZCwgc2VlIC4uL0JVSUxELm1kOworICAgICAgICBleGl0IDE7CisgICAgZmkKK30KKworIyBDaGVjayBmb3IgZGVwZW5kZW5jaWVzCitmaW5kdG9vbCBhYXB0CitmaW5kdG9vbCB6aXBhbGlnbgorZmluZHRvb2wgamFyc2lnbmVyCisKK3NldCAtZXYKKworTEFZRVJfQlVJTERfRElSPSRQV0QKK0RFTU9fQlVJTERfRElSPSRQV0QvLi4vZGVtb3MvYW5kcm9pZAorZWNobyBMQVlFUl9CVUlMRF9ESVI9IiR7TEFZRVJfQlVJTERfRElSfSIKK2VjaG8gREVNT19CVUlMRF9ESVI9IiR7REVNT19CVUlMRF9ESVJ9IgorCitmdW5jdGlvbiBjcmVhdGVfQVBLKCkgeworICAgIGFhcHQgcGFja2FnZSAtZiAtTSBBbmRyb2lkTWFuaWZlc3QueG1sIC1JICIkQU5EUk9JRF9TREtfSE9NRS9wbGF0Zm9ybXMvYW5kcm9pZC0yNi9hbmRyb2lkLmphciIgLVMgcmVzIC1GIGJpbi8kMS11bmFsaWduZWQuYXBrIGJpbi9saWJzCisgICAgIyB1cGRhdGUgdGhpcyBsb2dpYyB0byBkZXRlY3QgaWYga2V5IGlzIGFscmVhZHkgdGhlcmUuICBJZiBzbywgdXNlIGl0LCBvdGhlcndpc2UgY3JlYXRlIGl0LgorICAgIGphcnNpZ25lciAtdmVyYm9zZSAta2V5c3RvcmUgfi8uYW5kcm9pZC9kZWJ1Zy5rZXlzdG9yZSAtc3RvcmVwYXNzIGFuZHJvaWQgLWtleXBhc3MgYW5kcm9pZCAgYmluLyQxLXVuYWxpZ25lZC5hcGsgYW5kcm9pZGRlYnVna2V5CisgICAgemlwYWxpZ24gLWYgNCBiaW4vJDEtdW5hbGlnbmVkLmFwayBiaW4vJDEuYXBrCit9CisKKyMKKyMgYnVpbGQgbGF5ZXJzCisjCisuL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2ggLS1uby1idWlsZAorbmRrLWJ1aWxkIC1qICRjb3JlcworCisjCisjIGJ1aWxkIFZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzIEFQSworIworbWtkaXIgLXAgYmluL2xpYnMvbGliCitjcCAtciAkTEFZRVJfQlVJTERfRElSL2xpYnMvKiAkTEFZRVJfQlVJTERfRElSL2Jpbi9saWJzL2xpYi8KK2NyZWF0ZV9BUEsgVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMKKworZWNobyBCdWlsZHMgc3VjY2VlZGVkCitleGl0IDAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5OTY2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDMgQEAKK0J1aWxkIFZhbGlkYXRpb24gTGF5ZXJzIHdpdGggQW5kcm9pZCBDTWFrZSBQbHVnaW4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0dyYWRsZSBwcm9qZWN0IGluIHRoaXMgZGlyZWN0b3J5IGJ1aWxkcyBsYXllcnMgaW50byBBQVIuCitUaGUgcHJvamVjdCBjb3VsZCBiZSBkaXJlY3RseSBhZGRlZCBpbnRvIGFwcGxpY2F0aW9uJ3MgZ3JhZGxlIHByb2plY3RzLgorW0FuZHJvaWQgU3R1ZGlvIDMuMC4wK10oaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2luZGV4Lmh0bWwpCitJUyByZXF1aXJlZDogZWFybGllciB2ZXJzaW9ucyBvbmx5IHB1Ymxpc2ggcmVsZWFzZSBsaWJzIGJ5IGRlZmF1bHQuCisKK1ByZS1yZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0KK0J1aWxkIFNoYWRlckMgYmluYXJ5CistIEJ1aWxkaW5nIGZyb20gR2l0aHViIFJlcG8gc291cmNlCisxLiBjZCBhbmRyb2lkLWJ1aWxkCisyLiAuL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2gKKzMuIC4vYW5kcm9pZC1nZW5lcmF0ZS5zaAorCitFeHRyYSBTdGVwcyBpZiBidWlsZGluZyBmcm9tIE5ESydzIHNvdXJjZSB0cmVlCitgYGAKKyAgIGNkICR7eW91ciBBTkRST0lEX05ES19ST09UfS9zb3VyY2VzL3RoaXJkX3BhcnR5L3NoYWRlcmMKKyAgIG5kay1idWlsZCAgQVBQX0FCST1hbGwgQVBQX1NUTD1jKytfc3RhdGljIE5ES19UT09MQ0hBSU5fVkVSU0lPTj1jbGFuZyBOREtfUFJPSkVDVF9QQVRIPS4gQVBQX0JVSUxEX1NDUklQVD1BbmRyb2lkLm1rIGxpYnNoYWRlcmNfY29tYmluZWQKK2BgYAorCitBZGRpbmcgbGF5ZXIgbW9kdWxlIGludG8gQW5kcm9pZCBTdHVkaW8gYXBwbGljYXRpb24gcHJvamVjdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEuIGFwcCdzIHNldHRpbmdzLmdyYWRsZSwgYWRkIAorYGBgCisgICAgaW5jbHVkZSAnOmxheWVyTGliJworICAgIHByb2plY3QoJzpsYXllckxpYicpLnByb2plY3REaXIgPSBuZXcgRmlsZSgnL3BhdGgvdG8vY21ha2UvbGF5ZXJsaWInKQorYGBgCisyLiBhcHAncyBidWlsZC5ncmFkbGU6CitgYGAKK2RlcGVuZGVuY2llcyB7CisgICAgLy8gQW5kcm9pZCBTdHVkaW8gMy4wLjArIGlzIHJlcXVpcmVkCisgICAgaW1wbGVtZW50YXRpb24gcHJvamVjdCgnOmxheWVyTGliJykKK30KK2BgYAorQlVJTERfSU5fTkRLIHZhcmlhYmxlIGluIGxheWVybGliL0NNYWtlTGlzdHMudHh0IGNvdWxkIGRldGVjdCB3aGV0aGVyIHRoZSBzb3VyY2UgaXMKK2Zyb20gTkRLIG9yIGdpdGh1YiByZXBvIGNsb25lLCBhbmQgd291bGQgY29uZmlndXJlIHRoZSBmaWxlIHBhdGhzIGFjY29yZGluZ2x5CisKK1Rlc3RlZAorLS0tLS0KK0J1aWxkIG9uIE1hYyBPUywgdGVzdGVkIG9uIEdvb2dsZSBQaXhlbCBYTCB3aXRoIEFuZHJvaWQgT3Jlby4KK0VxdXZpbGFlbnQgYnVpbGQgc2NyaXB0cyBmb3IgV2luZG93cyBPUyBhcmUgYXQgdGhlIHNhbWUgZGlyZWN0b3J5LgorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQ2Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDk3IEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMy40LjEpCisKKyMgVmFsaWRhdGlvbiBsYXllcnMgY291bGQgYmUgYnVpbHQgd2l0aCBjb2RlIGZyb20KKyMgICAgZ2l0aHViIHJlcG8gICBPUgorIyAgICBuZGsncyBzbmFwc2hvdAorIyBUaGUgZmlsZSBzdHJ1Y3R1cmUgZm9yIGdsc2xhbmcgc3Bpci1WIGlzIGRpZmZlcmVudCwgYWRkaW5nIEJVSUxEX0lOX05ESyB2YXJpYWJsZQorc2V0KEJVSUxEX0lOX05ESyBPRkYpCitpZiAoQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIE1BVENIRVMgInNvdXJjZXMvdGhpcmRfcGFydHkvdnVsa2FuL3NyYyIpCisgICAgc2V0KEJVSUxEX0lOX05ESyBPTikKK2VuZGlmKCkKKworc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1zdGQ9YysrMTEgLVdhbGwgLVdlcnJvciBcCisgICAgICAgIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIC1Xbm8tdW51c2VkLWNvbnN0LXZhcmlhYmxlIFwKKyAgICAgICAgLVduby1jKys5OC1jb21wYXQtcGVkYW50aWMgLURWS19QUk9UT1RZUEVTIFwKKyAgICAgICAgLURWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIiKQorCitpZiAoQlVJTERfSU5fTkRLKQorICAgICMgTkRLIGRpcmVjdG9yeSBzdHJ1Y3R1cmU6CisgICAgIyAgJEFORFJPSURfTkRLL3NvdXJjZXMvdGhpcmRfcGFydHkvCisgICAgIyAgICAgICAgdnVsa2FuL3NyYworICAgICMgICAgICAgIHNoYWRlcmMvdGhpcmRfcGFydHkgKGZvciBnbHNsYW5nICYgc3BpcnYtdG9vbHMgKQorICAgICMgdGhpcyBidWlsZCB1c2VzIGNvbWJpbmVkIGxpYiBsaWJzaGFkZXJjLmEgZm9yIGxpYlNQSVJWLVRvb2xzLmEgcHVycG9zZQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoU1JDX0RJUgorICAgICAgICAiJHtBTkRST0lEX05ES30vc291cmNlcy90aGlyZF9wYXJ0eS92dWxrYW4vc3JjIiBBQlNPTFVURSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEVYVEVSTkFMX0RJUgorICAgICAgICAiJHtTUkNfRElSfS8uLi8uLi9zaGFkZXJjL3RoaXJkX3BhcnR5IiBBQlNPTFVURSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KFNQSVJWX0xJQgorICAgICAgICAiJHtTUkNfRElSfS8uLi8uLi9zaGFkZXJjL2xpYnMvJHtBTkRST0lEX1NUTH0vJHtBTkRST0lEX0FCSX0vbGlic2hhZGVyYy5hIgorICAgICAgICBBQlNPTFVURSkKK2Vsc2UgKCkKKyAgICAjIGdpdGh1YiBkaXJlY3Rvcnkgc3RydWN0dXJlOgorICAgICMgICAke1NSQ19ESVJ9CisgICAgIyAgICR7U1JDX0RJUn0vYnVpbGQtYW5kcm9pZC9leHRlcm5hbCAoZm9yIGdsc2xhbmcsIHNwaXJ2LXRvb2xzICYgc2hhZGVyYyApCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChTUkNfRElSICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4iICBBQlNPTFVURSkKKyAgICBzZXQoRVhURVJOQUxfRElSICIke1NSQ19ESVJ9L2J1aWxkLWFuZHJvaWQvdGhpcmRfcGFydHkvc2hhZGVyYy90aGlyZF9wYXJ0eSIpCisgICAgc2V0KFNQSVJWX0xJQgorICAgICAgICAiJHtTUkNfRElSfS9idWlsZC1hbmRyb2lkL3RoaXJkX3BhcnR5L3NoYWRlcmMvYW5kcm9pZF90ZXN0L29iai9sb2NhbC8ke0FORFJPSURfQUJJfS9saWJTUElSVi1Ub29scy5hIikKK2VuZGlmKCkKK3NldChDT01NT05fRElSICIke1NSQ19ESVJ9L2J1aWxkLWFuZHJvaWQvZ2VuZXJhdGVkIikKKworc2V0KENNQUtFX0NYWF9jbG9uZSAiJHtDTUFLRV9DWFhfRkxBR1N9IikKK3NldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtRFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiBcCisgICAgICAgIC1mdmlzaWJpbGl0eT1oaWRkZW4iKQoraW5jbHVkZV9kaXJlY3Rvcmllcygke1NSQ19ESVJ9L2luY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgJHtDT01NT05fRElSfS9pbmNsdWRlCisgICAgICAgICAgICAgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzKQorYWRkX2xpYnJhcnkobGF5ZXJfdXRpbHMgU1RBVElDCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL3ZrX2xheWVyX2NvbmZpZy5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy92a19sYXllcl91dGlscy5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvdmtfZm9ybWF0X3V0aWxzLmNwcCkKK3NldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX2Nsb25lfSIpCisKKyMgYXNzdW1lIHNoYWRlcmMgYWxyZWFkeSBidWlsdCBleHRlcm5hbGx5CithZGRfbGlicmFyeShTUElSVi1Ub29scy1wcmVidWlsdCBTVEFUSUMgSU1QT1JURUQpCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoU1BJUlYtVG9vbHMtcHJlYnVpbHQgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTgorICAgICR7U1BJUlZfTElCfSkKKworc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1EVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSIFwKKyAgICAgICAgICAgICAgICAgICAgIC1mdmlzaWJpbGl0eT1oaWRkZW4iKQorYWRkX2xpYnJhcnkoVmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24gU0hBUkVECisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL3N0YXRlX3RyYWNrZXIuY3BwCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbi5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvZHJhd2Rpc3BhdGNoLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy9jb252ZXJ0X3RvX3JlbmRlcnBhc3MyLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy9kZXNjcmlwdG9yX3NldHMuY3BwCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL2J1ZmZlcl92YWxpZGF0aW9uLmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy9zaGFkZXJfdmFsaWRhdGlvbi5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvZ3B1X3ZhbGlkYXRpb24uY3BwCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzL2Jlc3RfcHJhY3RpY2VzLmNwcAorICAgICAgICAke0NPTU1PTl9ESVJ9L2luY2x1ZGUvbGF5ZXJfY2hhc3Npc19kaXNwYXRjaC5jcHAKKyAgICAgICAgJHtDT01NT05fRElSfS9pbmNsdWRlL2NoYXNzaXMuY3BwCisgICAgICAgICR7Q09NTU9OX0RJUn0vaW5jbHVkZS9wYXJhbWV0ZXJfdmFsaWRhdGlvbi5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvcGFyYW1ldGVyX3ZhbGlkYXRpb25fdXRpbHMuY3BwCisgICAgICAgICR7Q09NTU9OX0RJUn0vaW5jbHVkZS9vYmplY3RfdHJhY2tlci5jcHAKKyAgICAgICAgJHtTUkNfRElSfS9sYXllcnMvb2JqZWN0X3RyYWNrZXJfdXRpbHMuY3BwCisgICAgICAgICR7Q09NTU9OX0RJUn0vaW5jbHVkZS90aHJlYWRfc2FmZXR5LmNwcAorICAgICAgICAke1NSQ19ESVJ9L2xheWVycy94eGhhc2guYykKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKFZrTGF5ZXJfa2hyb25vc192YWxpZGF0aW9uIFBSSVZBVEUKKyAgICAgICAgJHtTUkNfRElSfS9pbmNsdWRlCisgICAgICAgICR7U1JDX0RJUn0vbGF5ZXJzCisgICAgICAgICR7Q09NTU9OX0RJUn0vaW5jbHVkZQorICAgICAgICAke0VYVEVSTkFMX0RJUn0vZ2xzbGFuZworICAgICAgICAke0VYVEVSTkFMX0RJUn0vc3BpcnYtdG9vbHMvaW5jbHVkZSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyX2tocm9ub3NfdmFsaWRhdGlvbiBQUklWQVRFCisgICAgICAgIGxvZyBsYXllcl91dGlscyBTUElSVi1Ub29scy1wcmVidWlsdCkKK2lmIChOT1QgQlVJTERfSU5fTkRLKQorICAgIHNldChTUElSVl9PUFRfTElCCisgICAgICAgICIke1NSQ19ESVJ9L2J1aWxkLWFuZHJvaWQvdGhpcmRfcGFydHkvc2hhZGVyYy9hbmRyb2lkX3Rlc3Qvb2JqL2xvY2FsLyR7QU5EUk9JRF9BQkl9L2xpYlNQSVJWLVRvb2xzLW9wdC5hIikKKyAgICBhZGRfbGlicmFyeShTUElSVi1Ub29scy1vcHQtcHJlYnVpbHQgU1RBVElDIElNUE9SVEVEKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhTUElSVi1Ub29scy1vcHQtcHJlYnVpbHQgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTgorICAgICAgICAke1NQSVJWX09QVF9MSUJ9KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyX2tocm9ub3NfdmFsaWRhdGlvbiBQUklWQVRFCisgICAgICAgIFNQSVJWLVRvb2xzLW9wdC1wcmVidWlsdCkKK2VuZGlmKCkKKworc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfY2xvbmV9IikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvYnVpbGQuZ3JhZGxlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5ZDIzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsMzIgQEAKK2FwcGx5IHBsdWdpbjogJ2NvbS5hbmRyb2lkLmxpYnJhcnknCisKK2FuZHJvaWQgeworICAgIC8qCisgICAgICogUmVxdWlyZWQ6IEFuZHJvaWQgU3R1ZGlvIDMuMC4wKyEKKyAgICAgKi8KKyAgICBjb21waWxlU2RrVmVyc2lvbiAyNQorCisgICAgZGVmYXVsdENvbmZpZyB7CisgICAgICAgIG1pblNka1ZlcnNpb24gMjQKKyAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAyNAorICAgICAgICB2ZXJzaW9uQ29kZSAxCisgICAgICAgIHZlcnNpb25OYW1lICIxLjAiCisgICAgICAgIG5kay5hYmlGaWx0ZXJzICdhcm1lYWJpLXY3YScsICdhcm02NC12OGEnLCAneDg2JywgJ3g4Nl82NCcKKyAgICAgICAgZXh0ZXJuYWxOYXRpdmVCdWlsZCB7CisgICAgICAgICAgICBjbWFrZS5hcmd1bWVudHMgJy1EQU5EUk9JRF9UT09MQ0hBSU49Y2xhbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICctREFORFJPSURfU1RMPWMrK19zdGF0aWMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICctREFORFJPSURfUExBVEZPUk09YW5kcm9pZC0yNCcKKyAgICAgICAgfQorICAgIH0KKyAgICBleHRlcm5hbE5hdGl2ZUJ1aWxkIHsKKyAgICAgICAgY21ha2UucGF0aCAnQ01ha2VMaXN0cy50eHQnCisgICAgfQorICAgIGJ1aWxkVHlwZXMgeworICAgICAgICByZWxlYXNlIHsKKyAgICAgICAgICAgIG1pbmlmeUVuYWJsZWQgZmFsc2UKKyAgICAgICAgICAgIHByb2d1YXJkRmlsZXMgZ2V0RGVmYXVsdFByb2d1YXJkRmlsZSgncHJvZ3VhcmQtYW5kcm9pZC50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgJ3Byb2d1YXJkLXJ1bGVzLnBybycKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9wcm9ndWFyZC1ydWxlcy5wcm8gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL3Byb2d1YXJkLXJ1bGVzLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFmZTcwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9wcm9ndWFyZC1ydWxlcy5wcm8KQEAgLTAsMCArMSwxNyBAQAorIyBBZGQgcHJvamVjdCBzcGVjaWZpYyBQcm9HdWFyZCBydWxlcyBoZXJlLgorIyBCeSBkZWZhdWx0LCB0aGUgZmxhZ3MgaW4gdGhpcyBmaWxlIGFyZSBhcHBlbmRlZCB0byBmbGFncyBzcGVjaWZpZWQKKyMgaW4gJHtBTkRST0lEX1NES30vdG9vbHMvcHJvZ3VhcmQvcHJvZ3VhcmQtYW5kcm9pZC50eHQKKyMgWW91IGNhbiBlZGl0IHRoZSBpbmNsdWRlIHBhdGggYW5kIG9yZGVyIGJ5IGNoYW5naW5nIHRoZSBwcm9ndWFyZEZpbGVzCisjIGRpcmVjdGl2ZSBpbiBidWlsZC5ncmFkbGUuCisjCisjIEZvciBtb3JlIGRldGFpbHMsIHNlZQorIyAgIGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvZGV2ZWxvcGluZy90b29scy9wcm9ndWFyZC5odG1sCisKKyMgQWRkIGFueSBwcm9qZWN0IHNwZWNpZmljIGtlZXAgb3B0aW9ucyBoZXJlOgorCisjIElmIHlvdXIgcHJvamVjdCB1c2VzIFdlYlZpZXcgd2l0aCBKUywgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcKKyMgYW5kIHNwZWNpZnkgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIHRoZSBKYXZhU2NyaXB0IGludGVyZmFjZQorIyBjbGFzczoKKyMta2VlcGNsYXNzbWVtYmVycyBjbGFzcyBmcWNuLm9mLmphdmFzY3JpcHQuaW50ZXJmYWNlLmZvci53ZWJ2aWV3IHsKKyMgICBwdWJsaWMgKjsKKyN9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2NtYWtlL2xheWVybGliL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMzcwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDkgQEAKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmV4YW1wbGUubGF5ZXJsaWIiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6YWxsb3dCYWNrdXA9InRydWUiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNSdGw9InRydWUiPgorCisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvY21ha2UvbGF5ZXJsaWIvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmY4Mzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9jbWFrZS9sYXllcmxpYi9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMyBAQAorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5MYXllciBMaWJyYXJ5PC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvaW5zdGFsbF9hbGwuc2ggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2luc3RhbGxfYWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3NzM1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2luc3RhbGxfYWxsLnNoCkBAIC0wLDAgKzEsNzYgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0IC1lCisKKyMKKyMgUGFyc2UgcGFyYW1ldGVycworIworCitmdW5jdGlvbiBwcmludFVzYWdlIHsKKyAgIGVjaG8gIlN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZToiCisgICBlY2hvICIgICAgLXN8LS1zZXJpYWwgPHRhcmdldCBkZXZpY2Ugc2VyaWFsIG51bWJlcj4gKG9wdGlvbmFsKSIKKyAgIGVjaG8KKyAgIGVjaG8gImkuZS4gJHswIyMqL30gLXMgPHNlcmlhbCBudW1iZXI+IgorICAgZXhpdCAxCit9CisKK2lmIFtbICQoKCQjICUgMikpIC1uZSAwIF1dCit0aGVuCisgICAgZWNobyBQYXJhbWV0ZXJzIG11c3QgYmUgcHJvdmlkZWQgaW4gcGFpcnMuCisgICAgZWNobyBwYXJhbWV0ZXIgY291bnQgPSAkIworICAgIGVjaG8KKyAgICBwcmludFVzYWdlCisgICAgZXhpdCAxCitmaQorCit3aGlsZSBbWyAkIyAtZ3QgMCBdXQorZG8KKyAgICBjYXNlICQxIGluCisgICAgICAgIC1zfC0tc2VyaWFsKQorICAgICAgICAgICAgIyBpbmNsdWRlIHRoZSBmbGFnLCBiZWNhdXNlIHdlIG5lZWQgdG8gbGVhdmUgaXQgb2ZmIGlmIG5vdCBwcm92aWRlZAorICAgICAgICAgICAgc2VyaWFsPSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0qKQorICAgICAgICAgICAgIyB1bmtub3duIG9wdGlvbgorICAgICAgICAgICAgZWNobyBVbmtub3duIG9wdGlvbjogJDEKKyAgICAgICAgICAgIGVjaG8KKyAgICAgICAgICAgIHByaW50VXNhZ2UKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFtbICRzZXJpYWwgXV07IHRoZW4KKyAgICBlY2hvIHNlcmlhbCA9ICIke3NlcmlhbH0iCisgICAgc2VyaWFsRmxhZz0iLXMgJHNlcmlhbCIKKyAgICBpZiBbWyAkKGFkYiBkZXZpY2VzKSAhPSAqIiRzZXJpYWwiKiBdXQorICAgIHRoZW4KKyAgICAgICAgZWNobyBEZXZpY2Ugbm90IGZvdW5kOiAiJHtzZXJpYWx9IgorICAgICAgICBlY2hvCisgICAgICAgIHByaW50VXNhZ2UKKyAgICAgICAgZXhpdCAxCisgICAgZmkKK2Vsc2UKKyAgICBlY2hvIFVzaW5nIGRldmljZSAkKGFkYiBnZXQtc2VyaWFsbm8pCitmaQorCisjIEluc3RhbGwgZXZlcnl0aGluZyBidWlsdCBieSBidWlsZF9hbGwuc2gKK2VjaG8gImFkYiAkc2VyaWFsRmxhZyBpbnN0YWxsIC1yIGJpbi9WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy5hcGsiCithZGIgJHNlcmlhbEZsYWcgaW5zdGFsbCAtciBiaW4vVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMuYXBrCisKK2V4aXQgJD8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvam5pL0FuZHJvaWQubWsgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2puaS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNmZmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2puaS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTMwIEBACisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFZhbHZlIENvcnBvcmF0aW9uCisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitTUkNfRElSIDo9IC4uLy4uCitMQVlFUl9ESVIgOj0gLi4vZ2VuZXJhdGVkCitUSElSRF9QQVJUWSA6PSAuLi90aGlyZF9wYXJ0eQorCitWVUxLQU5fSU5DTFVERSA6PSAkKExPQ0FMX1BBVEgpLyQoVEhJUkRfUEFSVFkpL1Z1bGthbi1IZWFkZXJzL2luY2x1ZGUKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGF5ZXJfdXRpbHMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL2xheWVycy92a19sYXllcl9jb25maWcuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL3ZrX2xheWVyX3V0aWxzLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL3ZrX2Zvcm1hdF91dGlscy5jcHAKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChWVUxLQU5fSU5DTFVERSkgXAorICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLyQoU1JDX0RJUikvbGF5ZXJzL2dlbmVyYXRlZCBcCisgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvJChTUkNfRElSKS9sYXllcnMKK0xPQ0FMX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEgLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1mdW5jdGlvbiAtV25vLXVudXNlZC1jb25zdC12YXJpYWJsZQorTE9DQUxfQ1BQRkxBR1MgKz0gLURWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIgLURWS19QUk9UT1RZUEVTIC1mdmlzaWJpbGl0eT1oaWRkZW4KK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gVmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24KK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL2xheWVycy9zdGF0ZV90cmFja2VyLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbi5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL2xheWVycy9kcmF3ZGlzcGF0Y2guY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS9sYXllcnMvZGVzY3JpcHRvcl9zZXRzLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL2J1ZmZlcl92YWxpZGF0aW9uLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL3NoYWRlcl92YWxpZGF0aW9uLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL2dwdV92YWxpZGF0aW9uLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL2Jlc3RfcHJhY3RpY2VzLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL2NvbnZlcnRfdG9fcmVuZGVycGFzczIuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS9sYXllcnMvZ2VuZXJhdGVkL2xheWVyX2NoYXNzaXNfZGlzcGF0Y2guY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS9sYXllcnMvZ2VuZXJhdGVkL2NoYXNzaXMuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS9sYXllcnMveHhoYXNoLmMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL2xheWVycy9nZW5lcmF0ZWQvcGFyYW1ldGVyX3ZhbGlkYXRpb24uY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS9sYXllcnMvcGFyYW1ldGVyX3ZhbGlkYXRpb25fdXRpbHMuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS9sYXllcnMvZ2VuZXJhdGVkL29iamVjdF90cmFja2VyLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL29iamVjdF90cmFja2VyX3V0aWxzLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL2dlbmVyYXRlZC90aHJlYWRfc2FmZXR5LmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvbGF5ZXJzL2dlbmVyYXRlZC9jb21tYW5kX2NvdW50ZXJfaGVscGVyLmNwcAorTE9DQUxfQ19JTkNMVURFUyArPSAkKFZVTEtBTl9JTkNMVURFKSBcCisgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvJChTUkNfRElSKS9sYXllcnMgXAorICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLyQoU1JDX0RJUikvbGF5ZXJzL2dlbmVyYXRlZAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsYXllcl91dGlscyBnbHNsYW5nIFNQSVJWLVRvb2xzIFNQSVJWLVRvb2xzLW9wdAorTE9DQUxfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMSAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIC1Xbm8tdW51c2VkLWNvbnN0LXZhcmlhYmxlCitMT0NBTF9DUFBGTEFHUyArPSAtRFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUiAtRFZLX1BST1RPVFlQRVMgLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfTERMSUJTICAgIDo9IC1sbG9nIC1sYW5kcm9pZAorTE9DQUxfTERGTEFHUyAgICs9IC1XbCwtQnN5bWJvbGljCitMT0NBTF9MREZMQUdTICAgKz0gLVdsLC0tZXhjbHVkZS1saWJzLEFMTAoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBWa0xheWVyVmFsaWRhdGlvblRlc3RzCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS90ZXN0cy9sYXllcl92YWxpZGF0aW9uX3Rlc3RzLmNwcCBcCisJCQkJICAgJChTUkNfRElSKS90ZXN0cy92a2xheWVydGVzdHNfcGlwZWxpbmVfc2hhZGVyLmNwcCBcCisJCQkJICAgJChTUkNfRElSKS90ZXN0cy92a2xheWVydGVzdHNfYnVmZmVyX2ltYWdlX21lbW9yeV9zYW1wbGVyLmNwcCBcCisJCQkJICAgJChTUkNfRElSKS90ZXN0cy92a2xheWVydGVzdHNfb3RoZXJzLmNwcCBcCisJCQkJICAgJChTUkNfRElSKS90ZXN0cy92a2xheWVydGVzdHNfZGVzY3JpcHRvcl9yZW5kZXJwYXNzX2ZyYW1lYnVmZmVyLmNwcCBcCisJCQkJICAgJChTUkNfRElSKS90ZXN0cy92a2xheWVydGVzdHNfY29tbWFuZC5jcHAgXAorCQkJCSAgICQoU1JDX0RJUikvdGVzdHMvdmtwb3NpdGl2ZWxheWVydGVzdHMuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL3Rlc3RzL3ZrdGVzdGJpbmRpbmcuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL3Rlc3RzL3ZrdGVzdGZyYW1ld29ya2FuZHJvaWQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL3Rlc3RzL3ZrcmVuZGVyZnJhbWV3b3JrLmNwcCBcCisgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS9sYXllcnMvY29udmVydF90b19yZW5kZXJwYXNzMi5jcHAgXAorICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvbGF5ZXJzL2dlbmVyYXRlZC92a19zYWZlX3N0cnVjdC5jcHAgXAorICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvbGF5ZXJzL2dlbmVyYXRlZC9sdnRfZnVuY3Rpb25fcG9pbnRlcnMuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAkKFRISVJEX1BBUlRZKS9WdWxrYW4tVG9vbHMvY29tbW9uL3Z1bGthbl93cmFwcGVyLmNwcAorTE9DQUxfQ19JTkNMVURFUyArPSAkKFZVTEtBTl9JTkNMVURFKSBcCisgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvJChTUkNfRElSKS9sYXllcnMvZ2VuZXJhdGVkIFwKKyAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8kKFNSQ19ESVIpL2xheWVycyBcCisgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvJChTUkNfRElSKS9saWJzIFwKKyAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8kKFRISVJEX1BBUlRZKS9WdWxrYW4tVG9vbHMvY29tbW9uCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZ29vZ2xldGVzdF9tYWluIGxheWVyX3V0aWxzIHNoYWRlcmMKK0xPQ0FMX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEgLURWS19QUk9UT1RZUEVTIC1XYWxsIC1XZXJyb3IgLVduby11bnVzZWQtZnVuY3Rpb24gLVduby11bnVzZWQtY29uc3QtdmFyaWFibGUKK0xPQ0FMX0NQUEZMQUdTICs9IC1EVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSIC1ETlZfRVhURU5TSU9OUyAtREFNRF9FWFRFTlNJT05TIC1mdmlzaWJpbGl0eT1oaWRkZW4gLS1pbmNsdWRlPSQoVEhJUkRfUEFSVFkpL1Z1bGthbi1Ub29scy9jb21tb24vdnVsa2FuX3dyYXBwZXIuaAorTE9DQUxfTERMSUJTIDo9IC1sbG9nIC1sYW5kcm9pZCAtbGRsCitMT0NBTF9MREZMQUdTICAgKz0gLVdsLC1Cc3ltYm9saWMKK0xPQ0FMX0xERkxBR1MgICArPSAtV2wsLS1leGNsdWRlLWxpYnMsQUxMCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyBOb3RlOiBUaGUgZm9sbG93aW5nIG1vZHVsZSBpcyBzaW1pbGFyIGluIG5hbWUgdG8gdGhlIGV4ZWN1dGFibGUsIGJ1dCBkaWZmZXJzIHNvIHRoYXQgbG9hZGVyIHdvbid0IGVudW1lcmF0ZSB0aGUgcmVzdWx0aW5nIC5zbworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3Rlc3RzL2xheWVyX3ZhbGlkYXRpb25fdGVzdHMuY3BwIFwKKwkJCQkgICAkKFNSQ19ESVIpL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19waXBlbGluZV9zaGFkZXIuY3BwIFwKKwkJCQkgICAkKFNSQ19ESVIpL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19idWZmZXJfaW1hZ2VfbWVtb3J5X3NhbXBsZXIuY3BwIFwKKwkJCQkgICAkKFNSQ19ESVIpL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19vdGhlcnMuY3BwIFwKKwkJCQkgICAkKFNSQ19ESVIpL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19kZXNjcmlwdG9yX3JlbmRlcnBhc3NfZnJhbWVidWZmZXIuY3BwIFwKKwkJCQkgICAkKFNSQ19ESVIpL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19jb21tYW5kLmNwcCBcCisJCQkJICAgJChTUkNfRElSKS90ZXN0cy92a3Bvc2l0aXZlbGF5ZXJ0ZXN0cy5jcHAgXAorICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvdGVzdHMvdmt0ZXN0YmluZGluZy5jcHAgXAorICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrYW5kcm9pZC5jcHAgXAorICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvdGVzdHMvdmtyZW5kZXJmcmFtZXdvcmsuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2xheWVycy9jb252ZXJ0X3RvX3JlbmRlcnBhc3MyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS9sYXllcnMvZ2VuZXJhdGVkL3ZrX3NhZmVfc3RydWN0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS9sYXllcnMvZ2VuZXJhdGVkL2x2dF9mdW5jdGlvbl9wb2ludGVycy5jcHAgXAorICAgICAgICAgICAgICAgICAgICQoVEhJUkRfUEFSVFkpL1Z1bGthbi1Ub29scy9jb21tb24vdnVsa2FuX3dyYXBwZXIuY3BwCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVlVMS0FOX0lOQ0xVREUpIFwKKyAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8kKFNSQ19ESVIpL2xheWVycy9nZW5lcmF0ZWQgXAorICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLyQoU1JDX0RJUikvbGF5ZXJzIFwKKyAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8kKFNSQ19ESVIpL2xpYnMgXAorICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLyQoVEhJUkRfUEFSVFkpL1Z1bGthbi1Ub29scy9jb21tb24KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBnb29nbGV0ZXN0X21haW4gbGF5ZXJfdXRpbHMgc2hhZGVyYworTE9DQUxfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMSAtRFZLX1BST1RPVFlQRVMgLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1mdW5jdGlvbiAtV25vLXVudXNlZC1jb25zdC12YXJpYWJsZQorTE9DQUxfQ1BQRkxBR1MgKz0gLURWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIgLUROVl9FWFRFTlNJT05TIC1EQU1EX0VYVEVOU0lPTlMgLWZ2aXNpYmlsaXR5PWhpZGRlbiAtRFZBTElEQVRJT05fQVBLIC0taW5jbHVkZT0kKFRISVJEX1BBUlRZKS9WdWxrYW4tVG9vbHMvY29tbW9uL3Z1bGthbl93cmFwcGVyLmgKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgKz0gYW5kcm9pZF9uYXRpdmVfYXBwX2dsdWUKK0xPQ0FMX0xETElCUyA6PSAtbGxvZyAtbGFuZHJvaWQgLWxkbAorTE9DQUxfTERGTEFHUyA6PSAtdSBBTmF0aXZlQWN0aXZpdHlfb25DcmVhdGUKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworJChjYWxsIGltcG9ydC1tb2R1bGUsYW5kcm9pZC9uYXRpdmVfYXBwX2dsdWUpCiskKGNhbGwgaW1wb3J0LW1vZHVsZSx0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0KQorJChjYWxsIGltcG9ydC1tb2R1bGUsdGhpcmRfcGFydHkvc2hhZGVyYykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvam5pL0FwcGxpY2F0aW9uLm1rIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9qbmkvQXBwbGljYXRpb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzYzI4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvam5pL0FwcGxpY2F0aW9uLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0FQUF9BQkkgOj0gYXJtZWFiaS12N2EgYXJtNjQtdjhhIHg4NiB4ODZfNjQKKyMgQVBQX0FCSSA6PSBhcm02NC12OGEgICAjIGp1c3QgYnVpbGQgZm9yIHBpeGVsMiAgKGRvbid0IGNoZWNrIGluKQorQVBQX1BMQVRGT1JNIDo9IGFuZHJvaWQtMjYKK0FQUF9TVEwgOj0gYysrX3N0YXRpYworTkRLX1RPT0xDSEFJTl9WRVJTSU9OIDo9IGNsYW5nCitOREtfTU9EVUxFX1BBVEggOj0gLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9qbmkvc2hhZGVyYy9BcHBsaWNhdGlvbi5tayBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvam5pL3NoYWRlcmMvQXBwbGljYXRpb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0NzQxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvam5pL3NoYWRlcmMvQXBwbGljYXRpb24ubWsKQEAgLTAsMCArMSw0IEBACitBUFBfQUJJIDo9IGFsbAorQVBQX0JVSUxEX1NDUklQVCA6PSBBbmRyb2lkLm1rCitBUFBfU1RMIDo9IGMrK19zdGF0aWMKK0FQUF9QTEFURk9STSA6PSBhbmRyb2lkLTIzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2tub3duX2dvb2QuanNvbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQva25vd25fZ29vZC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0N2M1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL2tub3duX2dvb2QuanNvbgpAQCAtMCwwICsxLDQwIEBACit7CisgICJyZXBvcyIgOiBbCisgICAgeworICAgICAgIm5hbWUiIDogInNoYWRlcmMiLAorICAgICAgInVybCIgOiAiaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9zaGFkZXJjLmdpdCIsCisgICAgICAic3ViX2RpciIgOiAic2hhZGVyYyIsCisgICAgICAiY29tbWl0IiA6ICIwNTk3ZDM5ZWM2Mzc4ZGMxYzg3MjY4NmFmMWZhMTc5ODhmYWYyNmM4IgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiIDogImdsc2xhbmciLAorICAgICAgInVybCIgOiAiaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbHNsYW5nLmdpdCIsCisgICAgICAic3ViX2RpciIgOiAic2hhZGVyYy90aGlyZF9wYXJ0eS9nbHNsYW5nIiwKKyAgICAgICJjb21taXQiIDogIjM0OTUzODEwYTYyYzUyMzBjYzA1OWNmZGY0MmRjNDRjNWFhYjIyNDYiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSIgOiAiVnVsa2FuLUhlYWRlcnMiLAorICAgICAgInVybCIgOiAiaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tSGVhZGVycy5naXQiLAorICAgICAgInN1Yl9kaXIiIDogIlZ1bGthbi1IZWFkZXJzIiwKKyAgICAgICJjb21taXQiIDogInYxLjEuMTMwIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiIDogIlZ1bGthbi1Ub29scyIsCisgICAgICAidXJsIiA6ICJodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Ub29scy5naXQiLAorICAgICAgInN1Yl9kaXIiIDogIlZ1bGthbi1Ub29scyIsCisgICAgICAiY29tbWl0IiA6ICI1Y2ViN2JlOWEzYmY4NmYzNGFkZTVhN2Y3MjQ1OTI0OGQ5OWE0Yjc2IgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiIDogIlNQSVJWLVRvb2xzIiwKKyAgICAgICJ1cmwiIDogImh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvU1BJUlYtVG9vbHMuZ2l0IiwKKyAgICAgICJzdWJfZGlyIiA6ICJzaGFkZXJjL3RoaXJkX3BhcnR5L3NwaXJ2LXRvb2xzIiwKKyAgICAgICJjb21taXQiIDogIjliM2NjM2UwNTMzNzM1OGQwYmQ5ZmVjMWI3YTUxZTNjYmY1NTMxMmIiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSIgOiAiU1BJUlYtSGVhZGVycyIsCisgICAgICAidXJsIiA6ICJodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1NQSVJWLUhlYWRlcnMuZ2l0IiwKKyAgICAgICJzdWJfZGlyIiA6ICJzaGFkZXJjL3RoaXJkX3BhcnR5L3NwaXJ2LXRvb2xzL2V4dGVybmFsL3NwaXJ2LWhlYWRlcnMiLAorICAgICAgImNvbW1pdCIgOiAiMzhjYWZhYjM3OWU1ZDE2MTM3Y2I5N2E0ODViOTM4NTE5MTAzOWI5MiIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmY3MWIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+VnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHM8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL3Rlc3RfQVBLLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC90ZXN0X0FQSy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMjcyY2QzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC90ZXN0X0FQSy5zaApAQCAtMCwwICsxLDI5MSBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFF1aWV0IGJ5IGRlZmF1bHQKK3NldCAreAorCitlY2hvCitlY2hvID09PSBWdWxrYW4gVmFsaWRhdGlvbiBMYXllcnMgVGVzdHMgPT09CitlY2hvIFJ1bm5pbmcgdGVzdCBzY3JpcHQ6IGJ1aWxkLWFuZHJvaWQvdGVzdF9BUEsuc2gKK2VjaG8KKworIworIyBQYXJzZSBwYXJhbWV0ZXJzCisjCisKK2Z1bmN0aW9uIHByaW50VXNhZ2UgeworICAgZWNobyAiU3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlOiIKKyAgIGVjaG8gIiAgICAtcHwtLXBsYXRmb3JtIDxwbGF0Zm9ybT4gKG9wdGlvbmFsKSIKKyAgIGVjaG8gIiAgICAtZnwtLWZpbHRlciA8Z3Rlc3QgZmlsdGVyIGxpc3Q+IChvcHRpb25hbCkiCisgICBlY2hvICIgICAgLXN8LS1zZXJpYWwgPHRhcmdldCBkZXZpY2Ugc2VyaWFsIG51bWJlcj4gKG9wdGlvbmFsKSIKKyAgIGVjaG8gIiAgICAtYXwtLWFiaSA8dGFyZ2V0IGFiaT4gKG9wdGlvbmFsKSIKKyAgIGVjaG8KKyAgIGVjaG8gImkuZS4gJHswIyMqL30gLXAgPHBsYXRmb3JtPiAtZiA8dGVzdCBmaWx0ZXI+IC1zIDxzZXJpYWwgbnVtYmVyPiIKKyAgIGV4aXQgMQorfQorCitpZiBbWyAkKCgkIyAlIDIpKSAtbmUgMCBdXQordGhlbgorICAgIGVjaG8gUGFyYW1ldGVycyBtdXN0IGJlIHByb3ZpZGVkIGluIHBhaXJzLgorICAgIGVjaG8gcGFyYW1ldGVyIGNvdW50ID0gJCMKKyAgICBlY2hvCisgICAgcHJpbnRVc2FnZQorICAgIGV4aXQgMQorZmkKKword2hpbGUgW1sgJCMgLWd0IDAgXV0KK2RvCisgICAgY2FzZSAkMSBpbgorICAgICAgICAtcHwtLXBsYXRmb3JtKQorICAgICAgICAgICAgcGxhdGZvcm09IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLWZ8LS1maWx0ZXIpCisgICAgICAgICAgICBmaWx0ZXI9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLXN8LS1zZXJpYWwpCisgICAgICAgICAgICBzZXJpYWw9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLWF8LS1hYmkpCisgICAgICAgICAgICBhYmk9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLSopCisgICAgICAgICAgICAjIHVua25vd24gb3B0aW9uCisgICAgICAgICAgICBlY2hvIFVua25vd24gb3B0aW9uOiAkMQorICAgICAgICAgICAgZWNobworICAgICAgICAgICAgcHJpbnRVc2FnZQorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworaWYgW1sgJHNlcmlhbCBdXTsgdGhlbgorICAgIHNlcmlhbEZsYWc9Ii1zICRzZXJpYWwiCisgICAgaWYgW1sgJChhZGIgZGV2aWNlcykgIT0gKiIkc2VyaWFsIiogXV0KKyAgICB0aGVuCisgICAgICAgIGVjaG8gRGV2aWNlIG5vdCBmb3VuZDogIiR7c2VyaWFsfSIKKyAgICAgICAgZWNobworICAgICAgICBwcmludFVzYWdlCisgICAgICAgIGV4aXQgMQorICAgIGZpCitlbHNlCisgICAgZWNobyBVc2luZyBkZXZpY2UgJChhZGIgZ2V0LXNlcmlhbG5vKQorZmkKKworaWYgW1sgLXogJHBsYXRmb3JtIF1dCit0aGVuCisgICAgZWNobyBObyBwbGF0Zm9ybSBzcGVjaWZpZWQuCisgICAgcGxhdGZvcm09IlVuc3BlY2lmaWVkUGxhdGZvcm0iCitmaQorCitpZiBbWyAteiAkZmlsdGVyIF1dCit0aGVuCisgICAgZWNobyBObyBmaWx0ZXIgc3BlY2lmaWVkLCBydW5uaW5nIGFsbCB0ZXN0cy4KKyAgICBmaWx0ZXI9IioiCitmaQorCitpZiBbWyAkcGxhdGZvcm0gXV07IHRoZW4gZWNobyBwbGF0Zm9ybSA9ICIke3BsYXRmb3JtfSI7IGZpCitpZiBbWyAkZmlsdGVyIF1dOyB0aGVuIGVjaG8gZmlsdGVyID0gIiR7ZmlsdGVyfSI7IGZpCitpZiBbWyAkc2VyaWFsIF1dOyB0aGVuIGVjaG8gc2VyaWFsID0gIiR7c2VyaWFsfSI7IGZpCitpZiBbWyAkYWJpIF1dOyB0aGVuIGVjaG8gYWJpID0gIiR7YWJpfSI7IGZpCisKK3NldCAtZQorCitlY2hvCitlY2hvIFNldHRpbmcgdXAuLi4KKworIworIyBTdGFydCB1cAorIworCisjIEdyYWIgb3VyIEFuZHJvaWQgdGVzdCBtdXRleAorIyBXYWl0IGZvciBhbnkgZXhpc3RpbmcgdGVzdCBydW5zIG9uIHRoZSBkZXZpY2VzCisKKyMgQmxvdyBhd2F5IHRoZSBsb2NrIGlmIHRlc3RzIHJ1biB0b28gbG9uZywgYXZvaWRpbmcgaW5maW5pdGUgbG9vcAorbG9ja19zZWNvbmRzPTEyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRHVyYXRpb24gaW4gc2Vjb25kcy4KK2xvY2tfZW5kX3RpbWU9JCgoICQoZGF0ZSArJXMpICsgbG9ja19zZWNvbmRzICkpICAjIENhbGN1bGF0ZSBlbmQgdGltZS4KKwordW50aWwgbWtkaXIgL3Zhci90bXAvVmtMYXllclZhbGlkYXRpb25UZXN0cy4kc2VyaWFsLmxvY2sKK2RvCisgICAgc2xlZXAgNQorICAgIGVjaG8gIldhaXRpbmcgZm9yIGV4aXN0aW5nIEFuZHJvaWQgdGVzdCB0byBjb21wbGV0ZSBvbiAkc2VyaWFsIgorCisgICAgaWYgWyAkKGRhdGUgKyVzKSAtZ3QgJGxvY2tfZW5kX3RpbWUgXQorICAgIHRoZW4KKyAgICAgICAgZWNobyAiTG9jayB0aW1lb3V0IHJlYWNoZWQ6ICRsb2NrX3NlY29uZHMgc2Vjb25kcyIKKyAgICAgICAgZWNobyAiRGVsZXRpbmcgL3Zhci90bXAvVmtMYXllclZhbGlkYXRpb25UZXN0cy4kc2VyaWFsLmxvY2siCisgICAgICAgIHJtIC1yIC92YXIvdG1wL1ZrTGF5ZXJWYWxpZGF0aW9uVGVzdHMuJHNlcmlhbC5sb2NrCisgICAgZmkKK2RvbmUKKworIyBDbGVhbiB1cCBvdXIgbG9jayBvbiBhbnkgZXhpdCBjb25kaXRpb24KK2Z1bmN0aW9uIGZpbmlzaCB7CisgICBybSAtciAvdmFyL3RtcC9Wa0xheWVyVmFsaWRhdGlvblRlc3RzLiRzZXJpYWwubG9jaworfQordHJhcCBmaW5pc2ggRVhJVAorCisjIFdha2UgdXAgdGhlIGRldmljZSAtIG1ha2Ugc3VyZSBlYWNoIGtleWNvZGUgaGFzIHRpbWUgdG8gYmUgcHJvY2Vzc2VkCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgaW5wdXQga2V5ZXZlbnQgIktFWUNPREVfTUVOVSIKK3NsZWVwIDIKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBpbnB1dCBrZXlldmVudCAiS0VZQ09ERV9IT01FIgorc2xlZXAgMgorCisjIENsZWFyIHRoZSBsb2cKK2FkYiAkc2VyaWFsRmxhZyBsb2djYXQgLWMKKworIyBFbnN1cmUgYW55IHByZXZpb3VzIGFjdGl2aXR5IGhhcyBzdG9wcGVkLCBvdGhlcndpc2UgaXQgd29uJ3QgcnVuIHRlc3RzCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgYW0gZm9yY2Utc3RvcCBjb20uZXhhbXBsZS5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cworCisjIFJlbW92ZSBhbnkgZXhpc3RpbmcgQVBLIHRoYXQgbWF5IGhhdmUgYmVlbiBpbnN0YWxsZWQgZnJvbSBhbm90aGVyIGhvc3QKKyMgRGlzYWJsZSBleGl0IG9uIGVycm9yIGluIGNhc2UgdGhlIEFQSyBpcyBub3QgcHJlc2VudAorc2V0ICtlCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgcG0gbGlzdCBwYWNrYWdlcyB8IGdyZXAgY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMKK2lmIFsgJD8gLWVxIDAgXQordGhlbgorICAgIGFkYiAkc2VyaWFsRmxhZyB1bmluc3RhbGwgY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMKK2ZpCisjIFJlLWVuYWJsZSBleGl0IG9uIGVycm9yCitzZXQgLWUKKworZWNobworZWNobyBJbnN0YWxsaW5nIC4vYmluL1Z1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzLmFway4uLgorCisjIEluc3RhbGwgdGhlIGN1cnJlbnQgYnVpbGQKK2lmIFtbIC16ICRhYmkgXV0KK3RoZW4KKyAgYWRiICRzZXJpYWxGbGFnIGluc3RhbGwgLXIgYmluL1Z1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzLmFwaworZWxzZQorICBhZGIgJHNlcmlhbEZsYWcgaW5zdGFsbCAtLWFiaSAkYWJpIC1yIGJpbi9WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy5hcGsKK2ZpCisKK2VjaG8KK2VjaG8gTGF1bmNoaW5nIHRlc3RzLi4uCisKKyMgS2ljayBvZmYgdGhlIHRlc3RzIHdpdGgga25vd24gZXhjZXB0aW9uIGxpc3QKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBhbSBzdGFydCAtYSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiAtYyBhbmRyb2lkLWludGVudC5jYXRlZ29yeS5MQVVOQ0ggLW4gY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMvYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkgLS1lcyBhcmdzIC0tZ3Rlc3RfZmlsdGVyPSIke2ZpbHRlcn0iCisKKyMKKyMgU2NyYXBlIHRoZSBsb2cgdW50aWwgd2UgZ2V0IHBhc3MvZmFpbC9jcmFzaAorIworCisjIFRoZSBmb2xsb3dpbmcgbG9vcCB3aWxsIGdpdmUgdGVzdHMgMjAgbWludXRlcyB0byBwYXNzL2ZhaWwvY3Jhc2gKK3NlY29uZHM9MTIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEdXJhdGlvbiBpbiBzZWNvbmRzLgorZW5kVGltZT0kKCggJChkYXRlICslcykgKyBzZWNvbmRzICkpICAjIENhbGN1bGF0ZSBlbmQgdGltZS4KKworZXhpdENvZGU9LTEKKworIyBEaXNhYmxlIGV4aXQgb24gZXJyb3IsIHdlIGV4cGVjdCBncmVwIHRvIGZhaWwgbXVsdGlwbGUgdGltZXMgaW4gdGhpcyBsb29wCitzZXQgK2UKKword2hpbGUgWyAkKGRhdGUgKyVzKSAtbHQgJGVuZFRpbWUgXTsgZG8gICMgTG9vcCB1bnRpbCBpbnRlcnZhbCBoYXMgZWxhcHNlZC4KKworICAgICMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIHByaW50ZWQgZnJvbSBhbmRyb2lkX21haW4gb24gc3VjY2VzcworICAgIGFkYiAkc2VyaWFsRmxhZyBsb2djYXQgLWQgfCBncmVwICI9PT09IFRlc3RzIFBBU1NFRCA9PT09IgorICAgIGlmIFsgJD8gLWVxIDAgXQorICAgIHRoZW4KKyAgICAgICAgZWNobworICAgICAgICBlY2hvIFZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzIFBBU1NFRCEKKyAgICAgICAgZWNobworICAgICAgICBleGl0Q29kZT0wCisgICAgICAgIGJyZWFrCisgICAgZmkKKworICAgICMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIHByaW50ZWQgZnJvbSBhbmRyb2lkX21haW4gb24gZmFpbHVyZQorICAgIGFkYiAkc2VyaWFsRmxhZyBsb2djYXQgLWQgfCBncmVwICI9PT09IFRlc3RzIEZBSUxFRCA9PT09IgorICAgIGlmIFsgJD8gLWVxIDAgXQorICAgIHRoZW4KKyAgICAgICAgZWNobworICAgICAgICBlY2hvIFZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzIEZBSUxFRCEKKyAgICAgICAgZWNobworICAgICAgICBleGl0Q29kZT0xCisgICAgICAgIGJyZWFrCisgICAgZmkKKworICAgICMgZGV2ZWxvcGVyLmFuZHJvaWQuY29tIHJlY29tbWVuZHMgc2VhcmNoaW5nIGZvciB0aGUgZm9sbG93aW5nIHN0cmluZyB0byBkZXRlY3QgbmF0aXZlIGNyYXNoCisgICAgYWRiICRzZXJpYWxGbGFnIGxvZ2NhdCAtZCB8IGdyZXAgIlwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiBcKlwqXCogXCpcKlwqIFwqXCpcKiIKKyAgICBpZiBbICQ/IC1lcSAwIF0KKyAgICB0aGVuCisgICAgICAgIGV4aXRDb2RlPTIKKyAgICAgICAgZWNobworICAgICAgICBlY2hvIFZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzIENSQVNIRUQhCisgICAgICAgIGVjaG8KKyAgICAgICAgYnJlYWsKKyAgICBmaQorCisgICAgc2xlZXAgNQorCitkb25lCisKK2lmIFsgJGV4aXRDb2RlIC1lcSAtMSBdCit0aGVuCisgICAgZWNobyAiVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMgaGFzbid0IGNvbXBsZXRlZCBpbiAkc2Vjb25kcyBzZWNvbmRzLiBTY3JpcHQgZXhpdGluZy4iCitmaQorCisjCisjIENsZWFudXAKKyMKKworIyBSZXR1cm4gdG8gaG9tZSBzY3JlZW4gdG8gY2xlYXIgYW55IGVycm9yIHBvcC11cHMKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBpbnB1dCBrZXlldmVudCAiS0VZQ09ERV9IT01FIgorc2xlZXAgMgorCisjIFN0b3AgdGhlIGFjdGl2aXR5CithZGIgJHNlcmlhbEZsYWcgc2hlbGwgYW0gZm9yY2Utc3RvcCBjb20uZXhhbXBsZS5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cworCitlY2hvCitlY2hvIEZldGNoaW5nIHRlc3Qgb3V0cHV0IGFuZCBsb2djYXQgdGV4dC4uLgorCisjIEF2b2lkIGNoYXJhY3RlcnMgdGhhdCBhcmUgaWxsZWdhbCBpbiBXaW5kb3dzIGZpbGVuYW1lcywgc28gdGhlc2UKKyMgZmlsZXMgY2FuIGJlIGFyY2hpdmVkIHRvIGEgV2luZG93cyBob3N0IHN5c3RlbSBmb3IgbGF0ZXIgcmVmZXJlbmNlCit0b2RheT0kKGRhdGUgKyVZJW0lZC0lSCVNJVMpCitvdXRGaWxlPSJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy4kcGxhdGZvcm0uJHRvZGF5Lm91dC50eHQiCitlcnJGaWxlPSJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy4kcGxhdGZvcm0uJHRvZGF5LmVyci50eHQiCitsb2dGaWxlPSJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy4kcGxhdGZvcm0uJHRvZGF5LmxvZ2NhdC50eHQiCithZGIgJHNlcmlhbEZsYWcgcHVsbCAvc2RjYXJkL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy9maWxlcy9vdXQudHh0ICRvdXRGaWxlCithZGIgJHNlcmlhbEZsYWcgcHVsbCAvc2RjYXJkL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy9maWxlcy9lcnIudHh0ICRlcnJGaWxlCithZGIgJHNlcmlhbEZsYWcgbG9nY2F0IC1kID4gJGxvZ0ZpbGUKKworaWYgWyAtZiAkb3V0RmlsZSBdOyB0aGVuCisgICAgZWNobyAkb3V0RmlsZSBzaXplICQod2MgLWMgPCAkb3V0RmlsZSkKK2ZpCisKK2lmIFsgLWYgJGVyckZpbGUgXTsgdGhlbgorICAgIGVjaG8gJGVyckZpbGUgc2l6ZSAkKHdjIC1jIDwgJGVyckZpbGUpCitmaQorCitpZiBbIC1mICRsb2dGaWxlIF07IHRoZW4KKyAgICBlY2hvICRsb2dGaWxlIHNpemUgJCh3YyAtYyA8ICRsb2dGaWxlKQorZmkKKworaWYgWyAkZXhpdENvZGUgLW5lIDAgXQordGhlbgorICAgIGVjaG8gCisgICAgZWNobyBWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cyByZXN1bHQgc3RhdHVzIGlzIHVuc3VjY2Vzc2Z1bC4gIER1bXBpbmcgdGVzdCBvdXRwdXQgZmlsZToKKyAgICBlY2hvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgY2F0ICRvdXRGaWxlCisgICAgZWNobyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGVjaG8KKyAgICBlY2hvIAorICAgIGVjaG8gRHVtcGluZyBsb2djYXQgdGV4dCwgZmlsdGVyZWQgYnkgJyciVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMiJyc6CisgICAgZWNobyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGNhdCAkbG9nRmlsZSB8IGdyZXAgVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMKKyAgICBlY2hvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitmaQorCitleGl0ICRleGl0Q29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtYW5kcm9pZC91cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLmJhdCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTZjZTI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5iYXQKQEAgLTAsMCArMSwxMDUgQEAKK0BlY2hvIG9mZg0KK1JFTSBVcGRhdGUgc291cmNlIGZvciBnbHNsYW5nLCBzcGlydi10b29scywgYW5kIHNoYWRlcmMNCisNCitSRU0NCitSRU0gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KK1JFTSBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24NCitSRU0gQ29weXJpZ2h0IDIwMTggTHVuYXJHLCBJbmMuDQorUkVNDQorUkVNIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK1JFTSB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorUkVNIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK1JFTQ0KK1JFTSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK1JFTQ0KK1JFTSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorUkVNIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorUkVNIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK1JFTSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorUkVNIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK1JFTQ0KKw0KK3NldGxvY2FsIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24NCitzZXQgZXJyb3JDb2RlPTANCitzZXQgQU5EUk9JRF9CVUlMRF9ESVI9JX5kcDANCitzZXQgQlVJTERfRElSPSVBTkRST0lEX0JVSUxEX0RJUiUNCitzZXQgQkFTRV9ESVI9JUJVSUxEX0RJUiVcdGhpcmRfcGFydHkNCitzZXQgU0hBREVSQ19ESVI9JUJBU0VfRElSJVxzaGFkZXJjDQorDQorZm9yICUlWCBpbiAod2hlcmUuZXhlKSBkbyAoc2V0IEZPVU5EPSUlfiRQQVRIOlgpDQoraWYgbm90IGRlZmluZWQgRk9VTkQgKA0KKyAgIGVjaG8gRGVwZW5kZW5jeSBjaGVjayBmYWlsZWQ6DQorICAgZWNobyAgIHdoZXJlLmV4ZSBub3QgZm91bmQNCisgICBlY2hvICAgVGhpcyBzY3JpcHQgcmVxdWlyZXMgV2luZG93cyBWaXN0YSBvciBsYXRlciwgd2hpY2ggaW5jbHVkZXMgd2hlcmUuZXhlLg0KKyAgIHNldCBlcnJvckNvZGU9MQ0KKykNCisNCit3aGVyZSAvcSBnaXQuZXhlDQoraWYgJUVSUk9STEVWRUwlIGVxdSAxICgNCisgICBlY2hvIERlcGVuZGVuY3kgY2hlY2sgZmFpbGVkOg0KKyAgIGVjaG8gICBnaXQuZXhlIG5vdCBmb3VuZA0KKyAgIGVjaG8gICBHaXQgZm9yIFdpbmRvd3MgY2FuIGJlIGRvd25sb2FkZWQgaGVyZTogIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG93bmxvYWQvd2luDQorICAgZWNobyAgIEluc3RhbGwgYW5kIGVuc3VyZSBnaXQuZXhlIG1ha2VzIGl0IGludG8geW91ciBQQVRIDQorICAgc2V0IGVycm9yQ29kZT0xDQorKQ0KKw0KK3doZXJlIC9xIG5kay1idWlsZC5jbWQNCitpZiAlRVJST1JMRVZFTCUgZXF1IDEgKA0KKyAgIGVjaG8gRGVwZW5kZW5jeSBjaGVjayBmYWlsZWQ6DQorICAgZWNobyAgIG5kay1idWlsZC5jbWQgbm90IGZvdW5kDQorICAgZWNobyAgIEFuZHJvaWQgTkRLIGNhbiBiZSBkb3dubG9hZGVkIGhlcmU6ICBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL25kay9ndWlkZXMvc2V0dXAuaHRtbA0KKyAgIGVjaG8gICBJbnN0YWxsIGFuZCBlbnN1cmUgbmRrLWJ1aWxkLmNtZCBtYWtlcyBpdCBpbnRvIHlvdXIgUEFUSA0KKyAgIHNldCBlcnJvckNvZGU9MQ0KKykNCisNCis6bWFpbg0KKw0KK2lmICVlcnJvckNvZGUlIG5lcSAwIChnb3RvOmVycm9yKQ0KKw0KK2VjaG8gQ3JlYXRpbmcgYW5kL29yIHVwZGF0aW5nIGdsc2xhbmcsIHNwaXJ2LXRvb2xzLCBzcGlydi1oZWFkZXJzLCBzaGFkZXJjLCB2dWxrYW4taGVhZGVycywgdnVsa2FuLXRvb2xzIGluICVCQVNFX0RJUiUNCisNCitzZXQgYnVpbGQtc2hhZGVyYz0xDQorDQorUkVNIFB1bGwgZG93biBvciB1cGRhdGUgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzDQorZWNobyBVcGRhdGUgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGJhc2VkIG9uIHRoZSAlQU5EUk9JRF9CVUlMRF9ESVIlL2tub3duX2dvb2QuanNvbiBmaWxlDQorcHkgLTMgLi4vc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLW5vLWJ1aWxkIC0tZGlyICVCQVNFX0RJUiUgLS1rbm93bl9nb29kX2RpciAlQlVJTERfRElSJQ0KKw0KKw0KK2lmICVidWlsZC1zaGFkZXJjJSBlcXUgMSAoDQorICAgY2FsbDpidWlsZF9zaGFkZXJjDQorICAgaWYgJWVycm9yQ29kZSUgbmVxIDAgKGdvdG86ZXJyb3IpDQorKQ0KKw0KK2VjaG8uDQorZWNobyBFeGl0aW5nDQorZ290bzpmaW5pc2gNCisNCis6ZXJyb3INCitlY2hvLg0KK2VjaG8gSGFsdGluZyBkdWUgdG8gZXJyb3INCitnb3RvOmZpbmlzaA0KKw0KKzpmaW5pc2gNCitpZiBub3QgIiVjZCVcIiA9PSAiJUJVSUxEX0RJUiUiICggY2QgJUJVSUxEX0RJUiUgKQ0KK2VuZGxvY2FsDQorUkVNIFRoaXMgbmVlZHMgYSBmaXggdG8gcmV0dXJuIGVycm9yLCBzb21ldGhpbmcgbGlrZSBleGl0ICVlcnJvckNvZGUlDQorUkVNIFJpZ2h0IG5vdyBpdCBpcyByZXR1cm5pbmcgMA0KK2dvdG86ZW9mDQorDQorDQorDQorUkVNIC8vID09PT09PT09IEZ1bmN0aW9ucyA9PT09PT09PSAvLw0KKw0KKzpidWlsZF9zaGFkZXJjDQorICAgZWNoby4NCisgICBlY2hvIEJ1aWxkaW5nICVTSEFERVJDX0RJUiUNCisgICBjZCAlU0hBREVSQ19ESVIlXGFuZHJvaWRfdGVzdA0KKyAgIGVjaG8gQnVpbGRpbmcgc2hhZGVyYyB3aXRoIEFuZHJvaWQgTkRLDQorICAgY2FsbCBuZGstYnVpbGQgTkRLX0FQUExJQ0FUSU9OX01LPS4uLy4uLy4uL2puaS9zaGFkZXJjL0FwcGxpY2F0aW9uLm1rIFRISVJEX1BBUlRZX1BBVEg9Li4vdGhpcmRfcGFydHkgLWogNA0KKyAgIFJFTSBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG9uZSBsaWIsIGV2ZW4gdGhvdWdoIHdlIHNob3VsZCBjaGVjayBmb3IgYWxsIHJlc3VsdHMNCisgICBpZiBub3QgZXhpc3QgJVNIQURFUkNfRElSJVxhbmRyb2lkX3Rlc3Rcb2JqXGxvY2FsXHg4NlxsaWJzaGFkZXJjLmEgKA0KKyAgICAgIGVjaG8uDQorICAgICAgZWNobyBzaGFkZXJjIGJ1aWxkIGZhaWxlZCENCisgICAgICBzZXQgZXJyb3JDb2RlPTENCisgICApDQorZ290bzplb2YNCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2ggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1hbmRyb2lkL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmUzOWE5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWFuZHJvaWQvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5zaApAQCAtMCwwICsxLDEwMSBAQAorIyEvYmluL2Jhc2gKKyMgVXBkYXRlIHNvdXJjZSBmb3IgZ2xzbGFuZywgc3BpcnYtdG9vbHMsIHNoYWRlcmMKKworIyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxNSBWYWx2ZSBDb3Jwb3JhdGlvbgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0IC1lCisKK0FORFJPSURCVUlMRERJUj0kUFdECitCVUlMRERJUj0kQU5EUk9JREJVSUxERElSCitCQVNFRElSPSRCVUlMRERJUi90aGlyZF9wYXJ0eQorCitpZiBbWyAkKHVuYW1lKSA9PSAiTGludXgiIF1dOyB0aGVuCisgICAgY29yZXM9IiQobnByb2MgfHwgZWNobyA0KSIKK2VsaWYgW1sgJCh1bmFtZSkgPT0gIkRhcndpbiIgXV07IHRoZW4KKyAgICBjb3Jlcz0kKHN5c2N0bCAtbiBody5uY3B1KQorZmkKKworIworIyBQYXJzZSBwYXJhbWV0ZXJzCisjCisKK2Z1bmN0aW9uIHByaW50VXNhZ2UgeworICAgZWNobyAiU3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlOiIKKyAgIGVjaG8gIiAgICAtLWFiaSA8YWJpPiAob3B0aW9uYWwpIgorICAgZWNobyAiICAgIC0tbm8tYnVpbGQgKG9wdGlvbmFsKSIKKyAgIGVjaG8KKyAgIGVjaG8gImkuZS4gJHswIyMqL30gLS1hYmkgYXJtNjQtdjhhIFxcIgorICAgZXhpdCAxCit9CisKK3doaWxlIFtbICQjIC1ndCAwIF1dCitkbworICAgIGNhc2UgJDEgaW4KKyAgICAgICAgLS1hYmkpCisgICAgICAgICAgICBhYmk9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLS1uby1idWlsZCkKKyAgICAgICAgICAgIG5vYnVpbGQ9MQorICAgICAgICAgICAgc2hpZnQgMQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KKyAgICAgICAgICAgIGVjaG8gVW5rbm93biBvcHRpb246ICQxCisgICAgICAgICAgICBlY2hvCisgICAgICAgICAgICBwcmludFVzYWdlCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorCitlY2hvIGFiaT0kYWJpCitpZiBbWyAteiAkYWJpIF1dCit0aGVuCisgICAgZWNobyBObyBhYmkgcHJvdmlkZWQsIHNvIGJ1aWxkaW5nIGZvciBhbGwgc3VwcG9ydGVkIGFiaXMuCitmaQorCisKKworCitlY2hvIG5vLWJ1aWxkPSRub2J1aWxkCitpZiBbWyAkbm9idWlsZCBdXQordGhlbgorICAgIGVjaG8gU2tpcHBpbmcgYnVpbGQuCitmaQorCitmdW5jdGlvbiBidWlsZF9zaGFkZXJjICgpIHsKKyAgIGVjaG8gIkJ1aWxkaW5nICRCQVNFRElSL3NoYWRlcmMiCisgICBjZCAkQkFTRURJUi9zaGFkZXJjL2FuZHJvaWRfdGVzdAorICAgaWYgW1sgJGFiaSBdXTsgdGhlbgorICAgICAgbmRrLWJ1aWxkIE5ES19BUFBMSUNBVElPTl9NSz0uLi8uLi8uLi9qbmkvc2hhZGVyYy9BcHBsaWNhdGlvbi5tayBUSElSRF9QQVJUWV9QQVRIPS4uL3RoaXJkX3BhcnR5IEFQUF9BQkk9JGFiaSAtaiAkY29yZXM7CisgICBlbHNlCisgICAgICBuZGstYnVpbGQgTkRLX0FQUExJQ0FUSU9OX01LPS4uLy4uLy4uL2puaS9zaGFkZXJjL0FwcGxpY2F0aW9uLm1rIFRISVJEX1BBUlRZX1BBVEg9Li4vdGhpcmRfcGFydHkgLWogJGNvcmVzOworICAgZmkKK30KKworIyBQdWxsIGRvd24gb3IgdXBkYXRlIGV4dGVybmFsIGRlcGVuZGVuY2llcworZWNobyAiVXBkYXRlIGV4dGVybmFsIGRlcGVuZGVuY2llcyBiYXNlZCBvbiB0aGUgJEFORFJPSURCVUlMRERJUi9rbm93bl9nb29kLmpzb24gZmlsZSIKK3B5dGhvbjMgLi4vc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLW5vLWJ1aWxkIC0tZGlyICRCQVNFRElSIC0ta25vd25fZ29vZF9kaXIgJEJVSUxERElSCisKK2lmIFtbIC16ICRub2J1aWxkIF1dCit0aGVuCitidWlsZF9zaGFkZXJjCitmaQorCitlY2hvICIiCitlY2hvICIkezAjIyovfSBmaW5pc2hlZC4iCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWduL2NvbW1pdF9pZC5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWduL2NvbW1pdF9pZC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OGU5NzhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtZ24vY29tbWl0X2lkLnB5CkBAIC0wLDAgKzEsNjQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBHZW5lcmF0ZSBjb21taXQuaCB3aXRoIGdpdCBjb21taXQgaGFzaC4KKyMKKworaW1wb3J0IHN1YnByb2Nlc3MgYXMgc3AKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworCit1c2FnZSA9ICIiIlwKK1VzYWdlOiBjb21taXRfaWQucHkgY2hlY2sgPGFuZ2xlX2Rpcj4gICAgICAgICAgICAgICAgLSBjaGVjayBpZiBnaXQgaXMgcHJlc2VudAorICAgICAgIGNvbW1pdF9pZC5weSBnZW4gPGFuZ2xlX2Rpcj4gPGZpbGVfdG9fd3JpdGU+ICAtIGdlbmVyYXRlIGNvbW1pdC5oIiIiCisKK2RlZiBncmFiX291dHB1dChjb21tYW5kLCBjd2QpOgorICAgIHJldHVybiBzcC5Qb3Blbihjb21tYW5kLCBzdGRvdXQ9c3AuUElQRSwgc2hlbGw9VHJ1ZSwgY3dkPWN3ZCkuY29tbXVuaWNhdGUoKVswXS5zdHJpcCgpCisKK2lmIGxlbihzeXMuYXJndikgPCAzOgorICAgIHN5cy5leGl0KHVzYWdlKQorCitvcGVyYXRpb24gPSBzeXMuYXJndlsxXQorY3dkID0gc3lzLmFyZ3ZbMl0KKworaWYgb3BlcmF0aW9uID09ICdjaGVjayc6CisgICAgaW5kZXhfcGF0aCA9IG9zLnBhdGguam9pbihjd2QsICcuZ2l0JywgJ2luZGV4JykKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbmRleF9wYXRoKToKKyAgICAgICAgcHJpbnQoIjEiKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCIwIikKKyAgICBzeXMuZXhpdCgwKQorCitpZiBsZW4oc3lzLmFyZ3YpIDwgNCBvciBvcGVyYXRpb24gIT0gJ2dlbic6CisgICAgc3lzLmV4aXQodXNhZ2UpCisKK291dHB1dF9maWxlID0gc3lzLmFyZ3ZbM10KK2NvbW1pdF9pZF9zaXplID0gMTIKKwordHJ5OgorICAgIGNvbW1pdF9pZCA9IGdyYWJfb3V0cHV0KCdnaXQgcmV2LXBhcnNlIC0tc2hvcnQ9JWQgSEVBRCcgJSBjb21taXRfaWRfc2l6ZSwgY3dkKQorICAgIGNvbW1pdF9kYXRlID0gZ3JhYl9vdXRwdXQoJ2dpdCBzaG93IC1zIC0tZm9ybWF0PSVjaSBIRUFEJywgY3dkKQorZXhjZXB0OgorICAgIGNvbW1pdF9pZCA9ICdpbnZhbGlkLWhhc2gnCisgICAgY29tbWl0X2RhdGUgPSAnaW52YWxpZC1kYXRlJworCitoZmlsZSA9IG9wZW4ob3V0cHV0X2ZpbGUsICd3JykKKworaGZpbGUud3JpdGUoJyNkZWZpbmUgQU5HTEVfQ09NTUlUX0hBU0ggIiVzIlxuJyAgICAlIGNvbW1pdF9pZCkKK2hmaWxlLndyaXRlKCcjZGVmaW5lIEFOR0xFX0NPTU1JVF9IQVNIX1NJWkUgJWRcbicgJSBjb21taXRfaWRfc2l6ZSkKK2hmaWxlLndyaXRlKCcjZGVmaW5lIEFOR0xFX0NPTU1JVF9EQVRFICIlcyJcbicgICAgJSBjb21taXRfZGF0ZSkKKworaGZpbGUuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtZ24vZ2VuZXJhdGVfdnVsa2FuX2xheWVyc19qc29uLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtZ24vZ2VuZXJhdGVfdnVsa2FuX2xheWVyc19qc29uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5OTljZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1nbi9nZW5lcmF0ZV92dWxrYW5fbGF5ZXJzX2pzb24ucHkKQEAgLTAsMCArMSwxMjYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQU5HTEUgUHJvamVjdCBBdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiR2VuZXJhdGUgY29waWVzIG9mIHRoZSBWdWxrYW4gbGF5ZXJzIEpTT04gZmlsZXMsIHdpdGggbm8gcGF0aHMsIGZvcmNpbmcKK1Z1bGthbiB0byB1c2UgdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggdG8gbG9vayBmb3IgbGF5ZXJzLiIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGdsb2IKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHN5cworCisKK2RlZiBnbG9iX3NsYXNoKGRpcm5hbWUpOgorICAgICIiIkxpa2UgcmVndWxhciBnbG9iIGJ1dCByZXBsYWNlcyBcIHdpdGggLyBpbiByZXR1cm5lZCBwYXRocy4iIiIKKyAgICByZXR1cm4gW3MucmVwbGFjZSgnXFwnLCAnLycpIGZvciBzIGluIGdsb2IuZ2xvYihkaXJuYW1lKV0KKworCitkZWYgbWFpbigpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1pY2QnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3NvdXJjZV9kaXInKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3RhcmdldF9kaXInKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3ZlcnNpb25faGVhZGVyJywgaGVscD0ncGF0aCB0byB2dWxrYW5fY29yZS5oJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdqc29uX2ZpbGVzJywgbmFyZ3M9JyonKQorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBzb3VyY2VfZGlyID0gYXJncy5zb3VyY2VfZGlyCisgICAgdGFyZ2V0X2RpciA9IGFyZ3MudGFyZ2V0X2RpcgorCisgICAganNvbl9maWxlcyA9IFtqIGZvciBqIGluIGFyZ3MuanNvbl9maWxlcyBpZiBqLmVuZHN3aXRoKCcuanNvbicpXQorICAgIGpzb25faW5fZmlsZXMgPSBbaiBmb3IgaiBpbiBhcmdzLmpzb25fZmlsZXMgaWYgai5lbmRzd2l0aCgnLmpzb24uaW4nKV0KKworICAgIGRhdGFfa2V5ID0gJ0lDRCcgaWYgYXJncy5pY2QgZWxzZSAnbGF5ZXInCisKKyAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcihzb3VyY2VfZGlyKToKKyAgICAgICAgcHJpbnQoc291cmNlX2RpciArICcgaXMgbm90IGEgZGlyZWN0b3J5LicsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0YXJnZXRfZGlyKToKKyAgICAgICAgb3MubWFrZWRpcnModGFyZ2V0X2RpcikKKworICAgICMgQ29weSB0aGUgKi5qc29uIGZpbGVzIGZyb20gc291cmNlIGRpciB0byB0YXJnZXQgZGlyCisgICAgaWYgKHNldChnbG9iX3NsYXNoKG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCAnKi5qc29uJykpKSAhPSBzZXQoanNvbl9maWxlcykpOgorICAgICAgICBwcmludChnbG9iLmdsb2Iob3MucGF0aC5qb2luKHNvdXJjZV9kaXIsICcqLmpzb24nKSkpCisgICAgICAgIHByaW50KCcuanNvbiBsaXN0IGluIGduIGZpbGUgaXMgb3V0LW9mLWRhdGUnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiAxCisKKyAgICBmb3IganNvbl9mbmFtZSBpbiBqc29uX2ZpbGVzOgorICAgICAgICBpZiBub3QganNvbl9mbmFtZS5lbmRzd2l0aCgnLmpzb24nKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHdpdGggb3Blbihqc29uX2ZuYW1lKSBhcyBpbmZpbGU6CisgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkKGluZmlsZSkKKworICAgICAgICAjIFVwZGF0ZSB0aGUgcGF0aC4KKyAgICAgICAgaWYgbm90IGRhdGFfa2V5IGluIGRhdGE6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kICclcycga2V5IGluICVzIiAlIChkYXRhX2tleSwganNvbl9mbmFtZSkpCisKKyAgICAgICAgIyBUaGUgc3RhbmRhcmQgdmFsaWRhdGlvbiBsYXllciBoYXMgbm8gbGlicmFyeSBwYXRoLgorICAgICAgICBpZiAnbGlicmFyeV9wYXRoJyBpbiBkYXRhW2RhdGFfa2V5XToKKyAgICAgICAgICAgIHByZXZfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZGF0YVtkYXRhX2tleV1bJ2xpYnJhcnlfcGF0aCddKQorICAgICAgICAgICAgZGF0YVtkYXRhX2tleV1bJ2xpYnJhcnlfcGF0aCddID0gcHJldl9uYW1lCisKKyAgICAgICAgdGFyZ2V0X2ZuYW1lID0gb3MucGF0aC5qb2luKHRhcmdldF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoanNvbl9mbmFtZSkpCisgICAgICAgIHdpdGggb3Blbih0YXJnZXRfZm5hbWUsICd3YicpIGFzIG91dGZpbGU6CisgICAgICAgICAgICBqc29uLmR1bXAoZGF0YSwgb3V0ZmlsZSkKKworICAgICMgR2V0IHRoZSBWdWxrYW4gdmVyc2lvbiBmcm9tIHRoZSB2dWxrYW5fY29yZS5oIGZpbGUKKyAgICB2a19oZWFkZXJfZmlsZW5hbWUgPSBhcmdzLnZlcnNpb25faGVhZGVyCisgICAgdmtfdmVyc2lvbiA9IE5vbmUKKyAgICB3aXRoIG9wZW4odmtfaGVhZGVyX2ZpbGVuYW1lKSBhcyB2a19oZWFkZXJfZmlsZToKKyAgICAgICAgZm9yIGxpbmUgaW4gdmtfaGVhZGVyX2ZpbGU6CisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyNkZWZpbmUgVktfSEVBREVSX1ZFUlNJT04nKToKKyAgICAgICAgICAgICAgICB2a192ZXJzaW9uID0gbGluZS5zcGxpdCgpWy0xXQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgaWYgbm90IHZrX3ZlcnNpb246CisgICAgICAgIHByaW50KCdmYWlsZWQgdG8gZXh0cmFjdCB2a192ZXJzaW9uJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gMQorCisgICAgIyBTZXQganNvbiBmaWxlIHByZWZpeCBhbmQgc3VmZml4IGZvciBnZW5lcmF0aW5nIGZpbGVzLCBkZWZhdWx0IHRvIExpbnV4LgorICAgIHJlbGF0aXZlX3BhdGhfcHJlZml4ID0gJy4uL2xpYicKKyAgICBmaWxlX3R5cGVfc3VmZml4ID0gJy5zbycKKyAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgIHJlbGF0aXZlX3BhdGhfcHJlZml4ID0gcicuLlxcJyAgIyBqc29uLWVzY2FwZWQsIGhlbmNlIHR3byBiYWNrc2xhc2hlcy4KKyAgICAgICAgZmlsZV90eXBlX3N1ZmZpeCA9ICcuZGxsJworCisgICAgIyBGb3IgZWFjaCAqLmpzb24uaW4gdGVtcGxhdGUgZmlsZXMgaW4gc291cmNlIGRpciBnZW5lcmF0ZSBhY3R1YWwganNvbiBmaWxlCisgICAgIyBpbiB0YXJnZXQgZGlyCisgICAgaWYgKHNldChnbG9iX3NsYXNoKG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCAnKi5qc29uLmluJykpKSAhPQorICAgICAgICAgICAgc2V0KGpzb25faW5fZmlsZXMpKToKKyAgICAgICAgcHJpbnQoJy5qc29uLmluIGxpc3QgaW4gZ24gZmlsZSBpcyBvdXQtb2YtZGF0ZScsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmb3IganNvbl9pbl9uYW1lIGluIGpzb25faW5fZmlsZXM6CisgICAgICAgIGlmIG5vdCBqc29uX2luX25hbWUuZW5kc3dpdGgoJy5qc29uLmluJyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBqc29uX2luX2ZuYW1lID0gb3MucGF0aC5iYXNlbmFtZShqc29uX2luX25hbWUpCisgICAgICAgIGxheWVyX25hbWUgPSBqc29uX2luX2ZuYW1lWzotbGVuKCcuanNvbi5pbicpXQorICAgICAgICBsYXllcl9saWJfbmFtZSA9IGxheWVyX25hbWUgKyBmaWxlX3R5cGVfc3VmZml4CisgICAgICAgIGpzb25fb3V0X2ZuYW1lID0gb3MucGF0aC5qb2luKHRhcmdldF9kaXIsIGpzb25faW5fZm5hbWVbOi1sZW4oJy5pbicpXSkKKyAgICAgICAgd2l0aCBvcGVuKGpzb25fb3V0X2ZuYW1lLCd3JykgYXMganNvbl9vdXRfZmlsZSwgXAorICAgICAgICAgICAgIG9wZW4oanNvbl9pbl9uYW1lKSBhcyBpbmZpbGU6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBpbmZpbGU6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnQFJFTEFUSVZFX0xBWUVSX0JJTkFSWUAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfcGF0aF9wcmVmaXggKyBsYXllcl9saWJfbmFtZSkKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdAVktfVkVSU0lPTkAnLCAnMS4xLicgKyB2a192ZXJzaW9uKQorICAgICAgICAgICAgICAgIGpzb25fb3V0X2ZpbGUud3JpdGUobGluZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1nbi9yZW1vdmVfZmlsZXMucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1nbi9yZW1vdmVfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzA5NTkxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWduL3JlbW92ZV9maWxlcy5weQpAQCAtMCwwICsxLDQxIEBACisjIS91c3IvYmluL3B5dGhvbjIKKworIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFOR0xFIFByb2plY3QgQXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgcmVtb3ZlX2ZpbGVzLnB5OgorIyAgIFRoaXMgc3BlY2lhbCBhY3Rpb24gaXMgdXNlZCB0byBjbGVhbnVwIG9sZCBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisjICAgT3RoZXJ3aXNlIEFOR0xFIHdpbGwgcGljayB1cCB0aGUgb2xkIGZpbGUocyksIGNhdXNpbmcgYnVpbGQgb3IgcnVudGltZSBlcnJvcnMuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaWYgbGVuKHN5cy5hcmd2KSA8IDM6CisgICAgcHJpbnQoIlVzYWdlOiAiICsgc3lzLmFyZ3ZbMF0gKyAiIDxzdGFtcF9maWxlPiA8cmVtb3ZlX3BhdHRlcm5zPiIpCisKK3N0YW1wX2ZpbGUgPSBzeXMuYXJndlsxXQorCitmb3IgaSBpbiByYW5nZSgyLCBsZW4oc3lzLmFyZ3YpKToKKyAgICByZW1vdmVfcGF0dGVybiA9IHN5cy5hcmd2W2ldCisgICAgcmVtb3ZlX2ZpbGVzID0gZ2xvYi5nbG9iKHJlbW92ZV9wYXR0ZXJuKQorICAgIGZvciBmIGluIHJlbW92ZV9maWxlczoKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZik6CisgICAgICAgICAgICBvcy5yZW1vdmUoZikKKworIyB0b3VjaCBhIGR1bW15IGZpbGUgdG8ga2VlcCBhIHRpbWVzdGFtcAord2l0aCBvcGVuKHN0YW1wX2ZpbGUsICJ3IikgYXMgZjoKKyAgICBmLndyaXRlKCJibGFoIikKKyAgICBmLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWduL3NlY29uZGFyeS9idWlsZF9vdmVycmlkZXMvYnVpbGQuZ25pIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtZ24vc2Vjb25kYXJ5L2J1aWxkX292ZXJyaWRlcy9idWlsZC5nbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMTFmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWduL3NlY29uZGFyeS9idWlsZF9vdmVycmlkZXMvYnVpbGQuZ25pCkBAIC0wLDAgKzEsMTggQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworYnVpbGRfd2l0aF9jaHJvbWl1bSA9IGZhbHNlCitpZ25vcmVfZWxmMzJfbGltaXRhdGlvbnMgPSB0cnVlCitsaW51eF91c2VfYnVuZGxlZF9iaW51dGlsc19vdmVycmlkZSA9IGZhbHNlCit1c2Vfc3lzdGVtX3hjb2RlID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtZ24vc2Vjb25kYXJ5L2J1aWxkX292ZXJyaWRlcy9zcGlydl90b29scy5nbmkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL3NwaXJ2X3Rvb2xzLmduaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDU4NTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvYnVpbGQtZ24vc2Vjb25kYXJ5L2J1aWxkX292ZXJyaWRlcy9zcGlydl90b29scy5nbmkKQEAgLTAsMCArMSwyMCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTkgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFdlIGFyZSBidWlsZGluZyBpbnNpZGUgVnVsa2FuLVZhbGlkYXRpb25MYXllcnMKK3NwaXJ2X3Rvb2xzX3N0YW5kYWxvbmUgPSBmYWxzZQorCisjIFBhdGhzIHRvIFNQSVJWLVRvb2xzIGRlcGVuZGVuY2llcworc3BpcnZfdG9vbHNfZ29vZ2xldGVzdF9kaXIgPSAiLy9leHRlcm5hbC9nb29nbGV0ZXN0Igorc3BpcnZfdG9vbHNfc3BpcnZfaGVhZGVyc19kaXIgPSAiLy9leHRlcm5hbC9nbHNsYW5nL0V4dGVybmFsL3NwaXJ2LXRvb2xzL2V4dGVybmFsL3NwaXJ2LWhlYWRlcnMiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL3Z1bGthbl92YWxpZGF0aW9uX2xheWVycy5nbmkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1nbi9zZWNvbmRhcnkvYnVpbGRfb3ZlcnJpZGVzL3Z1bGthbl92YWxpZGF0aW9uX2xheWVycy5nbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjZDI4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWduL3NlY29uZGFyeS9idWlsZF9vdmVycmlkZXMvdnVsa2FuX3ZhbGlkYXRpb25fbGF5ZXJzLmduaQpAQCAtMCwwICsxLDI1IEBACisjIENvcHlyaWdodCAoYykgMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgUGF0aHMgdG8gdmFsaWRhdGlvbiBsYXllciBkZXBlbmRlbmNpZXMKK3Z1bGthbl9oZWFkZXJzX2RpciA9ICIvL2V4dGVybmFsL1Z1bGthbi1IZWFkZXJzIgordnZsX3NwaXJ2X3Rvb2xzX2RpciA9ICIvL2V4dGVybmFsL2dsc2xhbmcvRXh0ZXJuYWwvc3BpcnYtdG9vbHMiCit2dmxfZ2xzbGFuZ19kaXIgPSAiLy9leHRlcm5hbC9nbHNsYW5nLyIKKworIyBTdWJkaXJlY3RvcmllcyBmb3IgZ2VuZXJhdGVkIGZpbGVzCit2dWxrYW5fZGF0YV9zdWJkaXIgPSAiIgordnVsa2FuX2dlbl9zdWJkaXIgPSAiIgorCisjIEJ1aWxkIG9wdGlvbnMKK3VzZV94MTEgPSB0cnVlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1nbi91cGRhdGVfZGVwcy5zaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2J1aWxkLWduL3VwZGF0ZV9kZXBzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5NzkyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9idWlsZC1nbi91cGRhdGVfZGVwcy5zaApAQCAtMCwwICsxLDM4IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKGMpIDIwMTkgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEV4ZWN1dGUgYXQgcmVwbyByb290CitjZCAiJChkaXJuYW1lICQwKS8uLiIKKworIyBVc2UgdXBkYXRlX2RlcHMucHkgdG8gdXBkYXRlIHNvdXJjZSBkZXBlbmRlbmNpZXMgZnJvbSAvc2NyaXB0cy9rbm93bl9nb29kLmpzb24KK3NjcmlwdHMvdXBkYXRlX2RlcHMucHkgLS1kaXI9ImV4dGVybmFsIiAtLW5vLWJ1aWxkCisoY2QgZXh0ZXJuYWwvZ2xzbGFuZzsgLi91cGRhdGVfZ2xzbGFuZ19zb3VyY2VzLnB5KQorCisjIFVzZSBnY2xpZW50IHRvIHVwZGF0ZSB0b29sY2hhaW4gZGVwZW5kZW5jaWVzIGZyb20gL2J1aWxkLWduL0RFUFMgKGZyb20gY2hyb21pdW0pCitjYXQgPDwgRU9GID4+IC5nY2xpZW50Citzb2x1dGlvbnMgPSBbCisgIHsgIm5hbWUiICAgICAgICA6ICIuIiwKKyAgICAidXJsIiAgICAgICAgIDogImh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVZhbGlkYXRpb25MYXllcnMiLAorICAgICJkZXBzX2ZpbGUiICAgOiAiYnVpbGQtZ24vREVQUyIsCisgICAgIm1hbmFnZWQiICAgICA6IEZhbHNlLAorICAgICJjdXN0b21fZGVwcyIgOiB7CisgICAgfSwKKyAgICAiY3VzdG9tX3ZhcnMiOiB7fSwKKyAgfSwKK10KK0VPRgorZ2NsaWVudCBzeW5jCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2NtYWtlL0NvcHlyaWdodF9jbWFrZS50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9Db3B5cmlnaHRfY21ha2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0M2M2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9Db3B5cmlnaHRfY21ha2UudHh0CkBAIC0wLDAgKzEsMTI2IEBACitDTWFrZSAtIENyb3NzIFBsYXRmb3JtIE1ha2VmaWxlIEdlbmVyYXRvcgorQ29weXJpZ2h0IDIwMDAtMjAxOCBLaXR3YXJlLCBJbmMuIGFuZCBDb250cmlidXRvcnMKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyogTmVpdGhlciB0aGUgbmFtZSBvZiBLaXR3YXJlLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgQ29udHJpYnV0b3JzCisgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK0hPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFuZCBpbnN0aXR1dGlvbnMgYXJlIGFtb25nIHRoZSBDb250cmlidXRvcnM6CisKKyogQWFyb24gQy4gTWVhZG93cyA8Y21ha2VAc2hhZG93Z3VhcmRkZXYuY29tPgorKiBBZHJpYWFuIGRlIEdyb290IDxncm9vdEBrZGUub3JnPgorKiBBbGVrc2V5IEF2ZGVldiA8c29sb0BhbHRsaW51eC5ydT4KKyogQWxleGFuZGVyIE5ldW5kb3JmIDxuZXVuZG9yZkBrZGUub3JnPgorKiBBbGV4YW5kZXIgU21vcmthbG92IDxhbGV4YW5kZXIuc21vcmthbG92QGl0c2Vlei5jb20+CisqIEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisqIEFsZXggVHVyYm92IDxpLnphdWZpQGdtYWlsLmNvbT4KKyogQW5kcmVhcyBQYWt1bGF0IDxhcGFrdUBnbXguZGU+CisqIEFuZHJlYXMgU2NobmVpZGVyIDxhc25AY3J5cHRvbWlsay5vcmc+CisqIEFuZHLDqSBSaWdsYW5kIEJyb2R0a29yYiA8QW5kcmUuQnJvZHRrb3JiQGlmaS51aW8ubm8+CisqIEF4ZWwgSHVlYmwsIEhlbG1ob2x0ei1aZW50cnVtIERyZXNkZW4gLSBSb3NzZW5kb3JmCisqIEJlbmphbWluIEVpa2VsCisqIEJqb2VybiBSaWNrcyA8YmpvZXJuLnJpY2tzQGdtYWlsLmNvbT4KKyogQnJhZCBIYXJkcyA8YnJhZGhAa2RlLm9yZz4KKyogQ2hyaXN0b3BoZXIgSGFydmV5CisqIENocmlzdG9waCBHcsO8bmluZ2VyIDxmb3NzQGdydWVuaW5nZXIuZGU+CisqIENsZW1lbnQgQ3JldXNvdCA8Y3JldXNvdEBjcy55b3JrLmFjLnVrPgorKiBEYW5pZWwgQmxlemVrIDxibGV6ZWtAZ21haWwuY29tPgorKiBEYW5pZWwgUGZlaWZlciA8ZGFuaWVsQHBmZWlmZXItbWFpbC5kZT4KKyogRW5yaWNvIFNjaG9seiA8ZW5yaWNvLnNjaG9sekBpbmZvcm1hdGlrLnR1LWNoZW1uaXR6LmRlPgorKiBFcmFuIElmcmFoIDxlcmFuLmlmcmFoQGdtYWlsLmNvbT4KKyogRXNiZW4gTW9zZSBIYW5zZW4sIEFuZ2UgT3B0aW1pemF0aW9uIEFwUworKiBHZW9mZnJleSBWaW9sYSA8Z2VvZmZyZXkudmlvbGFAYXNpcm9ib3RzLmNvbT4KKyogR29vZ2xlIEluYworKiBHcmVnb3IgSmFzbnkKKyogSGVsaW8gQ2hpc3NpbmkgZGUgQ2FzdHJvIDxoZWxpb0BrZGUub3JnPgorKiBJbHlhIExhdnJlbm92IDxpbHlhLmxhdnJlbm92QGl0c2Vlei5jb20+CisqIEluc2lnaHQgU29mdHdhcmUgQ29uc29ydGl1bSA8aW5zaWdodHNvZnR3YXJlY29uc29ydGl1bS5vcmc+CisqIEphbiBXb2V0emVsCisqIEtlbGx5IFRob21wc29uIDxrZ3RAbGFubC5nb3Y+CisqIEtvbnN0YW50aW4gUG9kc3Zpcm92IDxrb25zdGFudGluQHBvZHN2aXJvdi5wcm8+CisqIE1hcmlvIEJlbnNpIDxtYmVuc2lAaXBzcXVhZC5uZXQ+CisqIE1hdGhpZXUgTWFsYXRlcnJlIDxtYXRoaWV1Lm1hbGF0ZXJyZUBnbWFpbC5jb20+CisqIE1hdHRoYWV1cyBHLiBDaGFqZGFzCisqIE1hdHRoaWFzIEtyZXR6IDxrcmV0ekBrZGUub3JnPgorKiBNYXR0aGlhcyBNYWVubmljaCA8bWF0dGhpYXNAbWFlbm5pY2gubmV0PgorKiBNaWNoYWVsIFN0w7xybWVyCisqIE1pZ3VlbCBBLiBGaWd1ZXJvYS1WaWxsYW51ZXZhCisqIE1pa2UgSmFja3NvbgorKiBNaWtlIE1jUXVhaWQgPG1pa2VAbWlrZW1jcXVhaWQuY29tPgorKiBOaWNvbGFzIEJvY2sgPG5pY29sYXNib2NrQGdtYWlsLmNvbT4KKyogTmljb2xhcyBEZXNwcmVzIDxuaWNvbGFzLmRlc3ByZXNAZ21haWwuY29tPgorKiBOaWtpdGEgS3J1cGVuJ2tvIDxrcm5la2l0QGdtYWlsLmNvbT4KKyogTlZJRElBIENvcnBvcmF0aW9uIDx3d3cubnZpZGlhLmNvbT4KKyogT3BlbkdhbW1hIEx0ZC4gPG9wZW5nYW1tYS5jb20+CisqIFBhdHJpY2sgU3RvdGtvIDxzdG90a29AY3MudW5pLWJvbm4uZGU+CisqIFBlciDDmHl2aW5kIEthcmxzZW4gPHBlcm95dmluZEBtYW5kcml2YS5vcmc+CisqIFBldGVyIENvbGxpbmdib3VybmUgPHBldGVyQHBjYy5tZS51az4KKyogUGV0ciBHb3R0aGFyZCA8Z290dGhhcmRAaG9uZXl3ZWxsLmNvbT4KKyogUGhpbGlwIExvd21hbiA8cGhpbGlwQHloYnQuY29tPgorKiBQaGlsaXBwZSBQcm91bHggPHBwcm91bHhAZWZmaWNpb3MuY29tPgorKiBSYWZmaSBFbmZpY2lhdWQsIE1heCBQbGFuY2sgU29jaWV0eQorKiBSYXVtZmVsZCA8cmF1bWZlbGQuY29tPgorKiBSb2dlciBMZWlnaCA8cmxlaWdoQGNvZGVsaWJyZS5uZXQ+CisqIFJvbGYgRWlrZSBCZWVyIDxlaWtlQHNmLW1haWwuZGU+CisqIFJvbWFuIERvbmNoZW5rbyA8cm9tYW4uZG9uY2hlbmtvQGl0c2Vlei5jb20+CisqIFJvbWFuIEtoYXJpdG9ub3YgPHJvbWFuLmtoYXJpdG9ub3ZAaXRzZWV6LmNvbT4KKyogUnVzbGFuIEJhcmF0b3YKKyogU2ViYXN0aWFuIEhvbHRlcm1hbm4gPHNlYmhvbHRAeHdtdy5vcmc+CisqIFN0ZXBoZW4gS2VsbHkgPHN0ZXZlaXJlQGdtYWlsLmNvbT4KKyogU3lsdmFpbiBKb3ViZXJ0IDxqb3ViZXJ0LnN5QGdtYWlsLmNvbT4KKyogVGhvbWFzIFNvbmRlcmdhYXJkIDx0c0BtZWRpY2FsLWluc2lnaHQuY29tPgorKiBUb2JpYXMgSHVuZ2VyIDx0b2JpYXMuaHVuZ2VyQHF0LmlvPgorKiBUb2RkIEdhbWJsaW4gPHRnYW1ibGluQGxsbmwuZ292PgorKiBUcmlzdGFuIENhcmVsCisqIFVuaXZlcnNpdHkgb2YgRHVuZGVlCisqIFZhZGltIFpodWtvdgorKiBXaWxsIERpY2hhcnJ5IDx3ZGljaGFycnlAc3RlbGxhcnNjaWVuY2UuY29tPgorCitTZWUgdmVyc2lvbiBjb250cm9sIGhpc3RvcnkgZm9yIGRldGFpbHMgb2YgaW5kaXZpZHVhbCBjb250cmlidXRpb25zLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZSBhcHBsaWVzIHRvIGRpc3RyaWJ1dGlvbnMgb2YKK0NNYWtlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm0uICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSBwYWNrYWdlcyBzdXBwbGllZAord2l0aCBDTWFrZSB1bmRlciBjb21wYXRpYmxlIGxpY2Vuc2VzIHByb3ZpZGUgdGhlaXIgb3duIGNvcHlyaWdodCBub3RpY2VzCitkb2N1bWVudGVkIGluIGNvcnJlc3BvbmRpbmcgc3ViZGlyZWN0b3JpZXMgb3Igc291cmNlIGZpbGVzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ01ha2Ugd2FzIGluaXRpYWxseSBkZXZlbG9wZWQgYnkgS2l0d2FyZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3BvbnNvcnNoaXA6CisKKyAqIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgYXQgdGhlIE5hdGlvbmFsIEluc3RpdHV0ZXMgb2YgSGVhbHRoCisgICBhcyBwYXJ0IG9mIHRoZSBJbnNpZ2h0IFNlZ21lbnRhdGlvbiBhbmQgUmVnaXN0cmF0aW9uIFRvb2xraXQgKElUSykuCisKKyAqIFVTIE5hdGlvbmFsIExhYnMgKExvcyBBbGFtb3MsIExpdmVybW9yZSwgU2FuZGlhKSBBU0MgUGFyYWxsZWwKKyAgIFZpc3VhbGl6YXRpb24gSW5pdGlhdGl2ZS4KKworICogTmF0aW9uYWwgQWxsaWFuY2UgZm9yIE1lZGljYWwgSW1hZ2UgQ29tcHV0aW5nIChOQU1JQykgaXMgZnVuZGVkIGJ5IHRoZQorICAgTmF0aW9uYWwgSW5zdGl0dXRlcyBvZiBIZWFsdGggdGhyb3VnaCB0aGUgTklIIFJvYWRtYXAgZm9yIE1lZGljYWwgUmVzZWFyY2gsCisgICBHcmFudCBVNTQgRUIwMDUxNDkuCisKKyAqIEtpdHdhcmUsIEluYy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2NtYWtlL0ZpbmRVRGV2LmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvY21ha2UvRmluZFVEZXYuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkMTY5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2NtYWtlL0ZpbmRVRGV2LmNtYWtlCkBAIC0wLDAgKzEsMjggQEAKKyMgLSBGaW5kVURldgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKworZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKKworcGtnX2NoZWNrX21vZHVsZXMoUENfTElCVURFViBRVUlFVCBsaWJ1ZGV2KQorCitmaW5kX3BhdGgoVURFVl9JTkNMVURFX0RJUiBOQU1FUyBsaWJ1ZGV2LmgKKyAgICBISU5UUworICAgICR7UENfTElCVURFVl9JTkNMVURFRElSfQorICAgICR7UENfTElCVURFVl9JTkNMVURFX0RJUlN9CisgICAgKQorCitmaW5kX2xpYnJhcnkoVURFVl9MSUJSQVJZIE5BTUVTIHVkZXYKKyAgICBISU5UUworICAgICR7UENfTElCVURFVl9MSUJESVJ9CisgICAgJHtQQ19MSUJVREVWX0xJQlJBUllfRElSU30KKyAgICApCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoVURldiBERUZBVUxUX01TRworICAgIFVERVZfSU5DTFVERV9ESVIgVURFVl9MSUJSQVJZKQorCittYXJrX2FzX2FkdmFuY2VkKFVERVZfSU5DTFVERV9ESVIgVURFVl9MSUJSQVJZKQorCitzZXQoVURFVl9JTkNMVURFX0RJUlMgJHtVREVWX0lOQ0xVREVfRElSfSkKK3NldChVREVWX0xJQlJBUklFUyAke1VERVZfTElCUkFSWX0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9GaW5kVnVsa2FuLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvY21ha2UvRmluZFZ1bGthbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjRjOGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvY21ha2UvRmluZFZ1bGthbi5jbWFrZQpAQCAtMCwwICsxLDgwIEBACisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBPU0ktYXBwcm92ZWQgQlNEIDMtQ2xhdXNlIExpY2Vuc2UuICBTZWUgYWNjb21wYW55aW5nCisjIGZpbGUgQ29weXJpZ2h0LnR4dCBvciBodHRwczovL2NtYWtlLm9yZy9saWNlbnNpbmcgZm9yIGRldGFpbHMuCisKKyMucnN0OgorIyBGaW5kVnVsa2FuCisjIC0tLS0tLS0tLS0KKyMKKyMgVHJ5IHRvIGZpbmQgVnVsa2FuCisjCisjIElNUE9SVEVEIFRhcmdldHMKKyMgXl5eXl5eXl5eXl5eXl5eXgorIworIyBUaGlzIG1vZHVsZSBkZWZpbmVzIDpwcm9wX3RndDpgSU1QT1JURURgIHRhcmdldCBgYFZ1bGthbjo6VnVsa2FuYGAsIGlmCisjIFZ1bGthbiBoYXMgYmVlbiBmb3VuZC4KKyMKKyMgUmVzdWx0IFZhcmlhYmxlcworIyBeXl5eXl5eXl5eXl5eXl5eCisjCisjIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6OgorIworIyAgIFZ1bGthbl9GT1VORCAgICAgICAgICAtIFRydWUgaWYgVnVsa2FuIHdhcyBmb3VuZAorIyAgIFZ1bGthbl9JTkNMVURFX0RJUlMgICAtIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIFZ1bGthbgorIyAgIFZ1bGthbl9MSUJSQVJJRVMgICAgICAtIGxpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkgdG8gdXNlIFZ1bGthbgorIworIyBUaGUgbW9kdWxlIHdpbGwgYWxzbyBkZWZpbmUgdHdvIGNhY2hlIHZhcmlhYmxlczo6CisjCisjICAgVnVsa2FuX0lOQ0xVREVfRElSICAgIC0gdGhlIFZ1bGthbiBpbmNsdWRlIGRpcmVjdG9yeQorIyAgIFZ1bGthbl9MSUJSQVJZICAgICAgICAtIHRoZSBwYXRoIHRvIHRoZSBWdWxrYW4gbGlicmFyeQorIworCitpZihXSU4zMikKKyAgZmluZF9wYXRoKFZ1bGthbl9JTkNMVURFX0RJUgorICAgIE5BTUVTIHZ1bGthbi92dWxrYW4uaAorICAgIFBBVEhTCisgICAgICAiJEVOVntWVUxLQU5fU0RLfS9JbmNsdWRlIgorICAgICkKKworICBpZihDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgZmluZF9saWJyYXJ5KFZ1bGthbl9MSUJSQVJZCisgICAgICBOQU1FUyB2dWxrYW4tMQorICAgICAgUEFUSFMKKyAgICAgICAgIiRFTlZ7VlVMS0FOX1NES30vTGliIgorICAgICAgICAiJEVOVntWVUxLQU5fU0RLfS9CaW4iCisgICAgICAgICkKKyAgZWxzZWlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgNCkKKyAgICBmaW5kX2xpYnJhcnkoVnVsa2FuX0xJQlJBUlkKKyAgICAgIE5BTUVTIHZ1bGthbi0xCisgICAgICBQQVRIUworICAgICAgICAiJEVOVntWVUxLQU5fU0RLfS9MaWIzMiIKKyAgICAgICAgIiRFTlZ7VlVMS0FOX1NES30vQmluMzIiCisgICAgICAgIE5PX1NZU1RFTV9FTlZJUk9OTUVOVF9QQVRICisgICAgICAgICkKKyAgZW5kaWYoKQorZWxzZSgpCisgICAgZmluZF9wYXRoKFZ1bGthbl9JTkNMVURFX0RJUgorICAgICAgTkFNRVMgdnVsa2FuL3Z1bGthbi5oCisgICAgICBQQVRIUworICAgICAgICAiJEVOVntWVUxLQU5fU0RLfS9pbmNsdWRlIikKKyAgICBmaW5kX2xpYnJhcnkoVnVsa2FuX0xJQlJBUlkKKyAgICAgIE5BTUVTIHZ1bGthbgorICAgICAgUEFUSFMKKyAgICAgICAgIiRFTlZ7VlVMS0FOX1NES30vbGliIikKK2VuZGlmKCkKKworc2V0KFZ1bGthbl9MSUJSQVJJRVMgJHtWdWxrYW5fTElCUkFSWX0pCitzZXQoVnVsa2FuX0lOQ0xVREVfRElSUyAke1Z1bGthbl9JTkNMVURFX0RJUn0pCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoVnVsa2FuCisgIERFRkFVTFRfTVNHCisgIFZ1bGthbl9MSUJSQVJZIFZ1bGthbl9JTkNMVURFX0RJUikKKworbWFya19hc19hZHZhbmNlZChWdWxrYW5fSU5DTFVERV9ESVIgVnVsa2FuX0xJQlJBUlkpCisKK2lmKFZ1bGthbl9GT1VORCBBTkQgTk9UIFRBUkdFVCBWdWxrYW46OlZ1bGthbikKKyAgYWRkX2xpYnJhcnkoVnVsa2FuOjpWdWxrYW4gVU5LTk9XTiBJTVBPUlRFRCkKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZ1bGthbjo6VnVsa2FuIFBST1BFUlRJRVMKKyAgICBJTVBPUlRFRF9MT0NBVElPTiAiJHtWdWxrYW5fTElCUkFSSUVTfSIKKyAgICBJTlRFUkZBQ0VfSU5DTFVERV9ESVJFQ1RPUklFUyAiJHtWdWxrYW5fSU5DTFVERV9ESVJTfSIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9GaW5kVnVsa2FuSGVhZGVycy5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2NtYWtlL0ZpbmRWdWxrYW5IZWFkZXJzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzhkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9GaW5kVnVsa2FuSGVhZGVycy5jbWFrZQpAQCAtMCwwICsxLDg2IEBACisjLnJzdDoKKyMgRmluZFZ1bGthbkhlYWRlcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgVHJ5IHRvIGZpbmQgVnVsa2FuIEhlYWRlcnMgYW5kIFJlZ2lzdHJ5LgorIworIyBUaGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHByb2plY3RzIHRoYXQgYnVpbGQgVnVsa2FuCisjICJzeXN0ZW0iIGNvbXBvbmVudHMgc3VjaCBhcyB0aGUgbG9hZGVyIGFuZCBsYXllcnMuCisjIFZ1bGthbiBhcHBsaWNhdGlvbnMgc2hvdWxkIGluc3RlYWQgdXNlIHRoZSBGaW5kVnVsa2FuIChvciBzaW1pbGFyKQorIyBmaW5kIG1vZHVsZSB0aGF0IGxvY2F0ZXMgdGhlIGhlYWRlcnMgYW5kIHRoZSBsb2FkZXIgbGlicmFyeS4KKyMKKyMgV2hlbiB1c2luZyB0aGlzIGZpbmQgbW9kdWxlIHRvIGxvY2F0ZSB0aGUgaGVhZGVycyBhbmQgcmVnaXN0cnkKKyMgaW4gYSBWdWxrYW4tSGVhZGVycyByZXBvc2l0b3J5LCB0aGUgVnVsa2FuLUhlYWRlcnMgcmVwb3NpdG9yeQorIyBzaG91bGQgYmUgYnVpbHQgd2l0aCAnaW5zdGFsbCcgdGFyZ2V0IGFuZCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50CisjIG9yIENNYWtlIHZhcmlhYmxlIHNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGluc3RhbGwgZGlyZWN0b3J5LgorIworIyAgICBWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUgorIworIyBJTVBPUlRFRCBUYXJnZXRzCisjIF5eXl5eXl5eXl5eXl5eXl4KKyMKKyMgVGhpcyBtb2R1bGUgZGVmaW5lcyBubyBJTVBPUlRFRCB0YXJnZXRzCisjCisjIFJlc3VsdCBWYXJpYWJsZXMKKyMgXl5eXl5eXl5eXl5eXl5eXgorIworIyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOjoKKyMKKyMgICBWdWxrYW5IZWFkZXJzX0ZPVU5EICAgICAgICAgIC0gVHJ1ZSBpZiBWdWxrYW5IZWFkZXJzIHdhcyBmb3VuZAorIyAgIFZ1bGthbkhlYWRlcnNfSU5DTFVERV9ESVJTICAgLSBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciBWdWxrYW5IZWFkZXJzCisjCisjICAgVnVsa2FuUmVnaXN0cnlfRk9VTkQgICAgICAgICAtIFRydWUgaWYgVnVsa2FuUmVnaXN0cnkgd2FzIGZvdW5kCisjICAgVnVsa2FuUmVnaXN0cnlfRElSUyAgICAgICAgICAtIGRpcmVjdG9yaWVzIGZvciBWdWxrYW5SZWdpc3RyeQorIworIyBUaGUgbW9kdWxlIHdpbGwgYWxzbyBkZWZpbmUgdHdvIGNhY2hlIHZhcmlhYmxlczo6CisjCisjICAgVnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUiAgICAtIHRoZSBWdWxrYW5IZWFkZXJzIGluY2x1ZGUgZGlyZWN0b3J5CisjICAgVnVsa2FuUmVnaXN0cnlfRElSICAgICAgICAgICAtIHRoZSBWdWxrYW5SZWdpc3RyeSBkaXJlY3RvcnkKKyMKKworIyBQcm9iZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCB0aGUgZW52aXJvbm1lbnQgdG8gc2VlIGlmIHRoZXkgc3BlY2lmeSB0aGUKKyMgVnVsa2FuIGhlYWRlcnMgaW5zdGFsbGF0aW9uIHBhdGguCitpZihOT1QgREVGSU5FRCBWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUikKKyAgaWYgKERFRklORUQgRU5We1ZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSfSkKKyAgICBzZXQoVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVIgIiRFTlZ7VlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVJ9IikKKyAgZWxzZWlmKERFRklORUQgRU5We1ZVTEtBTl9TREt9KQorICAgIHNldChWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUiAiJEVOVntWVUxLQU5fU0RLfS9pbmNsdWRlIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCitpZihERUZJTkVEIFZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSKQorICAjIFdoZW4gQ01BS0VfRklORF9ST09UX1BBVEhfSU5DTFVERSBpcyBzZXQgdG8gT05MWSwgdGhlIEhJTlRTIGluIGZpbmRfcGF0aCgpCisgICMgYXJlIHJlLXJvb3RlZCwgd2hpY2ggcHJldmVudHMgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVIgdG8gd29yayBhcworICAjIGV4cGVjdGVkLiBTbyB1c2UgTk9fQ01BS0VfRklORF9ST09UX1BBVEggdG8gYXZvaWQgaXQuCisKKyAgIyBVc2UgSElOVFMgaW5zdGVhZCBvZiBQQVRIIHRvIHNlYXJjaCB0aGVzZSBsb2NhdGlvbnMgYmVmb3JlCisgICMgc2VhcmNoaW5nIHN5c3RlbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbGlrZSAkUEFUSCB0aGF0IG1heQorICAjIGNvbnRhaW4gU0RLIGRpcmVjdG9yaWVzLgorICBmaW5kX3BhdGgoVnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUgorICAgICAgTkFNRVMgdnVsa2FuL3Z1bGthbi5oCisgICAgICBISU5UUyAke1ZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSfS9pbmNsdWRlCisgICAgICBOT19DTUFLRV9GSU5EX1JPT1RfUEFUSCkKKyAgZmluZF9wYXRoKFZ1bGthblJlZ2lzdHJ5X0RJUgorICAgICAgTkFNRVMgdmsueG1sCisgICAgICBISU5UUyAke1ZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSfS9zaGFyZS92dWxrYW4vcmVnaXN0cnkKKyAgICAgIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRIKQorZWxzZSgpCisgICMgSWYgVlVMS0FOX0hFQURFUlNfSU5TVEFMTF9ESVIsIG9yIG9uZSBvZiBpdHMgdmFyaWFudHMgd2FzIG5vdCBzcGVjaWZpZWQsCisgICMgZG8gYSBub3JtYWwgc2VhcmNoIHdpdGhvdXQgaGludHMuCisgIGZpbmRfcGF0aChWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSIE5BTUVTIHZ1bGthbi92dWxrYW4uaCkKKyAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChWVUxLQU5fUkVHSVNUUllfUEFUSF9ISU5UICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0gRElSRUNUT1JZKQorICBmaW5kX3BhdGgoVnVsa2FuUmVnaXN0cnlfRElSIE5BTUVTIHZrLnhtbCBISU5UUyAke1ZVTEtBTl9SRUdJU1RSWV9QQVRIX0hJTlR9KQorZW5kaWYoKQorCitzZXQoVnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUlMgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSfSkKK3NldChWdWxrYW5SZWdpc3RyeV9ESVJTICR7VnVsa2FuUmVnaXN0cnlfRElSfSkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhWdWxrYW5IZWFkZXJzCisgICAgREVGQVVMVF9NU0cKKyAgICBWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFZ1bGthblJlZ2lzdHJ5CisgICAgREVGQVVMVF9NU0cKKyAgICBWdWxrYW5SZWdpc3RyeV9ESVIpCisKK21hcmtfYXNfYWR2YW5jZWQoVnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUiBWdWxrYW5SZWdpc3RyeV9ESVIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9GaW5kV2F5bGFuZC5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2NtYWtlL0ZpbmRXYXlsYW5kLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzIxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9GaW5kV2F5bGFuZC5jbWFrZQpAQCAtMCwwICsxLDY2IEBACisjIFRyeSB0byBmaW5kIFdheWxhbmQgb24gYSBVbml4IHN5c3RlbQorIworIyBUaGlzIHdpbGwgZGVmaW5lOgorIworIyAgIFdBWUxBTkRfRk9VTkQgICAgICAgLSBUcnVlIGlmIFdheWxhbmQgaXMgZm91bmQKKyMgICBXQVlMQU5EX0xJQlJBUklFUyAgIC0gTGluayB0aGVzZSB0byB1c2UgV2F5bGFuZAorIyAgIFdBWUxBTkRfSU5DTFVERV9ESVIgLSBJbmNsdWRlIGRpcmVjdG9yeSBmb3IgV2F5bGFuZAorIyAgIFdBWUxBTkRfREVGSU5JVElPTlMgLSBDb21waWxlciBmbGFncyBmb3IgdXNpbmcgV2F5bGFuZAorIworIyBJbiBhZGRpdGlvbiB0aGUgZm9sbG93aW5nIG1vcmUgZmluZSBncmFpbmVkIHZhcmlhYmxlcyB3aWxsIGJlIGRlZmluZWQ6CisjCisjICAgV0FZTEFORF9DTElFTlRfRk9VTkQgIFdBWUxBTkRfQ0xJRU5UX0lOQ0xVREVfRElSICBXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVMKKyMgICBXQVlMQU5EX1NFUlZFUl9GT1VORCAgV0FZTEFORF9TRVJWRVJfSU5DTFVERV9ESVIgIFdBWUxBTkRfU0VSVkVSX0xJQlJBUklFUworIyAgIFdBWUxBTkRfRUdMX0ZPVU5EICAgICBXQVlMQU5EX0VHTF9JTkNMVURFX0RJUiAgICAgV0FZTEFORF9FR0xfTElCUkFSSUVTCisjCisjIENvcHlyaWdodCAoYykgMjAxMyBNYXJ0aW4gR3LDpMOfbGluIDxtZ3JhZXNzbGluQGtkZS5vcmc+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKK0lGIChOT1QgV0lOMzIpCisgIElGIChXQVlMQU5EX0lOQ0xVREVfRElSIEFORCBXQVlMQU5EX0xJQlJBUklFUykKKyAgICAjIEluIHRoZSBjYWNoZSBhbHJlYWR5CisgICAgU0VUKFdBWUxBTkRfRklORF9RVUlFVExZIFRSVUUpCisgIEVORElGICgpCisKKyAgIyBVc2UgcGtnLWNvbmZpZyB0byBnZXQgdGhlIGRpcmVjdG9yaWVzIGFuZCB0aGVuIHVzZSB0aGVzZSB2YWx1ZXMKKyAgIyBpbiB0aGUgRklORF9QQVRIKCkgYW5kIEZJTkRfTElCUkFSWSgpIGNhbGxzCisgIEZJTkRfUEFDS0FHRShQa2dDb25maWcpCisgIFBLR19DSEVDS19NT0RVTEVTKFBLR19XQVlMQU5EIFFVSUVUIHdheWxhbmQtY2xpZW50IHdheWxhbmQtc2VydmVyIHdheWxhbmQtZWdsIHdheWxhbmQtY3Vyc29yKQorCisgIFNFVChXQVlMQU5EX0RFRklOSVRJT05TICR7UEtHX1dBWUxBTkRfQ0ZMQUdTfSkKKworICBGSU5EX1BBVEgoV0FZTEFORF9DTElFTlRfSU5DTFVERV9ESVIgIE5BTUVTIHdheWxhbmQtY2xpZW50LmggSElOVFMgJHtQS0dfV0FZTEFORF9JTkNMVURFX0RJUlN9KQorICBGSU5EX1BBVEgoV0FZTEFORF9TRVJWRVJfSU5DTFVERV9ESVIgIE5BTUVTIHdheWxhbmQtc2VydmVyLmggSElOVFMgJHtQS0dfV0FZTEFORF9JTkNMVURFX0RJUlN9KQorICBGSU5EX1BBVEgoV0FZTEFORF9FR0xfSU5DTFVERV9ESVIgICAgIE5BTUVTIHdheWxhbmQtZWdsLmggICAgSElOVFMgJHtQS0dfV0FZTEFORF9JTkNMVURFX0RJUlN9KQorICBGSU5EX1BBVEgoV0FZTEFORF9DVVJTT1JfSU5DTFVERV9ESVIgIE5BTUVTIHdheWxhbmQtY3Vyc29yLmggSElOVFMgJHtQS0dfV0FZTEFORF9JTkNMVURFX0RJUlN9KQorCisgIEZJTkRfTElCUkFSWShXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVMgTkFNRVMgd2F5bGFuZC1jbGllbnQgICBISU5UUyAke1BLR19XQVlMQU5EX0xJQlJBUllfRElSU30pCisgIEZJTkRfTElCUkFSWShXQVlMQU5EX1NFUlZFUl9MSUJSQVJJRVMgTkFNRVMgd2F5bGFuZC1zZXJ2ZXIgICBISU5UUyAke1BLR19XQVlMQU5EX0xJQlJBUllfRElSU30pCisgIEZJTkRfTElCUkFSWShXQVlMQU5EX0VHTF9MSUJSQVJJRVMgICAgTkFNRVMgd2F5bGFuZC1lZ2wgICAgICBISU5UUyAke1BLR19XQVlMQU5EX0xJQlJBUllfRElSU30pCisgIEZJTkRfTElCUkFSWShXQVlMQU5EX0NVUlNPUl9MSUJSQVJJRVMgTkFNRVMgd2F5bGFuZC1jdXJzb3IgICBISU5UUyAke1BLR19XQVlMQU5EX0xJQlJBUllfRElSU30pCisKKyAgc2V0KFdBWUxBTkRfSU5DTFVERV9ESVIgJHtXQVlMQU5EX0NMSUVOVF9JTkNMVURFX0RJUn0gJHtXQVlMQU5EX1NFUlZFUl9JTkNMVURFX0RJUn0gJHtXQVlMQU5EX0VHTF9JTkNMVURFX0RJUn0gJHtXQVlMQU5EX0NVUlNPUl9JTkNMVURFX0RJUn0pCisKKyAgc2V0KFdBWUxBTkRfTElCUkFSSUVTICR7V0FZTEFORF9DTElFTlRfTElCUkFSSUVTfSAke1dBWUxBTkRfU0VSVkVSX0xJQlJBUklFU30gJHtXQVlMQU5EX0VHTF9MSUJSQVJJRVN9ICR7V0FZTEFORF9DVVJTT1JfTElCUkFSSUVTfSkKKworICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIFdBWUxBTkRfSU5DTFVERV9ESVIpCisKKyAgaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORF9DTElFTlQgIERFRkFVTFRfTVNHICBXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVMgIFdBWUxBTkRfQ0xJRU5UX0lOQ0xVREVfRElSKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORF9TRVJWRVIgIERFRkFVTFRfTVNHICBXQVlMQU5EX1NFUlZFUl9MSUJSQVJJRVMgIFdBWUxBTkRfU0VSVkVSX0lOQ0xVREVfRElSKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORF9FR0wgICAgIERFRkFVTFRfTVNHICBXQVlMQU5EX0VHTF9MSUJSQVJJRVMgICAgIFdBWUxBTkRfRUdMX0lOQ0xVREVfRElSKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORF9DVVJTT1IgIERFRkFVTFRfTVNHICBXQVlMQU5EX0NVUlNPUl9MSUJSQVJJRVMgIFdBWUxBTkRfQ1VSU09SX0lOQ0xVREVfRElSKQorICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoV0FZTEFORCAgICAgICAgIERFRkFVTFRfTVNHICBXQVlMQU5EX0xJQlJBUklFUyAgICAgICAgIFdBWUxBTkRfSU5DTFVERV9ESVIpCisKKyAgTUFSS19BU19BRFZBTkNFRCgKKyAgICAgICAgV0FZTEFORF9JTkNMVURFX0RJUiAgICAgICAgIFdBWUxBTkRfTElCUkFSSUVTCisgICAgICAgIFdBWUxBTkRfQ0xJRU5UX0lOQ0xVREVfRElSICBXQVlMQU5EX0NMSUVOVF9MSUJSQVJJRVMKKyAgICAgICAgV0FZTEFORF9TRVJWRVJfSU5DTFVERV9ESVIgIFdBWUxBTkRfU0VSVkVSX0xJQlJBUklFUworICAgICAgICBXQVlMQU5EX0VHTF9JTkNMVURFX0RJUiAgICAgV0FZTEFORF9FR0xfTElCUkFSSUVTCisgICAgICAgIFdBWUxBTkRfQ1VSU09SX0lOQ0xVREVfRElSICBXQVlMQU5EX0NVUlNPUl9MSUJSQVJJRVMKKyAgKQorCitFTkRJRiAoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvY21ha2UvRmluZFgxMV9YQ0IuY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9GaW5kWDExX1hDQi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZiZjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvY21ha2UvRmluZFgxMV9YQ0IuY21ha2UKQEAgLTAsMCArMSwzMiBAQAorIyAtIFRyeSB0byBmaW5kIGxpYlgxMS14Y2IKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgWDExX1hDQl9GT1VORCAtIHN5c3RlbSBoYXMgbGliWDExLXhjYgorIyBYMTFfWENCX0xJQlJBUklFUyAtIExpbmsgdGhlc2UgdG8gdXNlIGxpYlgxMS14Y2IKKyMgWDExX1hDQl9JTkNMVURFX0RJUiAtIHRoZSBsaWJYMTEteGNiIGluY2x1ZGUgZGlyCisjIFgxMV9YQ0JfREVGSU5JVElPTlMgLSBjb21waWxlciBzd2l0Y2hlcyByZXF1aXJlZCBmb3IgdXNpbmcgbGliWDExLXhjYgorCisjIENvcHlyaWdodCAoYykgMjAxMSBGcmVkcmlrIEjDtmdsdW5kIDxmcmVkcmlrQGtkZS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAwOCBIZWxpbyBDaGlzc2luaSBkZSBDYXN0cm8sIDxoZWxpb0BrZGUub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDcgTWF0dGhpYXMgS3JldHosIDxrcmV0ekBrZGUub3JnPgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIEZvciBkZXRhaWxzIHNlZSB0aGUgYWNjb21wYW55aW5nIENPUFlJTkctQ01BS0UtU0NSSVBUUyBmaWxlLgorCitJRiAoTk9UIFdJTjMyKQorICAjIHVzZSBwa2ctY29uZmlnIHRvIGdldCB0aGUgZGlyZWN0b3JpZXMgYW5kIHRoZW4gdXNlIHRoZXNlIHZhbHVlcworICAjIGluIHRoZSBGSU5EX1BBVEgoKSBhbmQgRklORF9MSUJSQVJZKCkgY2FsbHMKKyAgRklORF9QQUNLQUdFKFBrZ0NvbmZpZykKKyAgUEtHX0NIRUNLX01PRFVMRVMoUEtHX1gxMV9YQ0IgUVVJRVQgeDExLXhjYikKKworICBTRVQoWDExX1hDQl9ERUZJTklUSU9OUyAke1BLR19YMTFfWENCX0NGTEFHU30pCisKKyAgRklORF9QQVRIKFgxMV9YQ0JfSU5DTFVERV9ESVIgTkFNRVMgWDExL1hsaWIteGNiLmggSElOVFMgJHtQS0dfWDExX1hDQl9JTkNMVURFX0RJUlN9KQorICBGSU5EX0xJQlJBUlkoWDExX1hDQl9MSUJSQVJJRVMgTkFNRVMgWDExLXhjYiBISU5UUyAke1BLR19YMTFfWENCX0xJQlJBUllfRElSU30pCisKKyAgaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKyAgRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKFgxMV9YQ0IgREVGQVVMVF9NU0cgWDExX1hDQl9MSUJSQVJJRVMgWDExX1hDQl9JTkNMVURFX0RJUikKKworICBNQVJLX0FTX0FEVkFOQ0VEKFgxMV9YQ0JfSU5DTFVERV9ESVIgWDExX1hDQl9MSUJSQVJJRVMpCitFTkRJRiAoTk9UIFdJTjMyKQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9jbWFrZS9GaW5kWENCLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvY21ha2UvRmluZFhDQi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzExNTkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvY21ha2UvRmluZFhDQi5jbWFrZQpAQCAtMCwwICsxLDUxIEBACisjIC0gRmluZFhDQgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKworZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKKworaWYoTk9UIFhDQl9GSU5EX0NPTVBPTkVOVFMpCisgICAgc2V0KFhDQl9GSU5EX0NPTVBPTkVOVFMgeGNiKQorZW5kaWYoKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorc2V0KFhDQl9GT1VORCB0cnVlKQorc2V0KFhDQl9JTkNMVURFX0RJUlMgIiIpCitzZXQoWENCX0xJQlJBUklFUyAiIikKK2ZvcmVhY2goY29tcCAke1hDQl9GSU5EX0NPTVBPTkVOVFN9KQorICAgICMgY29tcG9uZW50IG5hbWUKKyAgICBzdHJpbmcoVE9VUFBFUiAke2NvbXB9IGNvbXBuYW1lKQorICAgIHN0cmluZyhSRVBMQUNFICItIiAiXyIgY29tcG5hbWUgJHtjb21wbmFtZX0pCisgICAgIyBoZWFkZXIgbmFtZQorICAgIHN0cmluZyhSRVBMQUNFICJ4Y2ItIiAiIiBoZWFkZXJuYW1lIHhjYi8ke2NvbXB9LmgpCisgICAgIyBsaWJyYXJ5IG5hbWUKKyAgICBzZXQobGlibmFtZSAke2NvbXB9KQorCisgICAgcGtnX2NoZWNrX21vZHVsZXMoUENfJHtjb21wfSBRVUlFVCAke2NvbXB9KQorCisgICAgZmluZF9wYXRoKCR7Y29tcG5hbWV9X0lOQ0xVREVfRElSIE5BTUVTICR7aGVhZGVybmFtZX0KKyAgICAgICAgSElOVFMKKyAgICAgICAgJHtQQ18ke2NvbXB9X0lOQ0xVREVESVJ9CisgICAgICAgICR7UENfJHtjb21wfV9JTkNMVURFX0RJUlN9CisgICAgICAgICkKKworICAgIGZpbmRfbGlicmFyeSgke2NvbXBuYW1lfV9MSUJSQVJZIE5BTUVTICR7bGlibmFtZX0KKyAgICAgICAgSElOVFMKKyAgICAgICAgJHtQQ18ke2NvbXB9X0xJQkRJUn0KKyAgICAgICAgJHtQQ18ke2NvbXB9X0xJQlJBUllfRElSU30KKyAgICAgICAgKQorCisgICAgZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKCR7Y29tcH0KKyAgICAgICAgRk9VTkRfVkFSICR7Y29tcH1fRk9VTkQKKyAgICAgICAgUkVRVUlSRURfVkFSUyAke2NvbXBuYW1lfV9JTkNMVURFX0RJUiAke2NvbXBuYW1lfV9MSUJSQVJZKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtjb21wbmFtZX1fSU5DTFVERV9ESVIgJHtjb21wbmFtZX1fTElCUkFSWSkKKworICAgIGxpc3QoQVBQRU5EIFhDQl9JTkNMVURFX0RJUlMgJHske2NvbXBuYW1lfV9JTkNMVURFX0RJUn0pCisgICAgbGlzdChBUFBFTkQgWENCX0xJQlJBUklFUyAkeyR7Y29tcG5hbWV9X0xJQlJBUll9KQorCisgICAgaWYoTk9UICR7Y29tcH1fRk9VTkQpCisgICAgICAgIHNldChYQ0JfRk9VTkQgZmFsc2UpCisgICAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCisKK2xpc3QoUkVNT1ZFX0RVUExJQ0FURVMgWENCX0lOQ0xVREVfRElSUykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2NtYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2NtYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDM3ZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvY21ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlLmluCkBAIC0wLDAgKzEsMjEgQEAKK2lmKE5PVCBFWElTVFMgIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAL2luc3RhbGxfbWFuaWZlc3QudHh0IikKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ2Fubm90IGZpbmQgaW5zdGFsbCBtYW5pZmVzdDogQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorZW5kaWYoTk9UIEVYSVNUUyAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorCitmaWxlKFJFQUQgIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAL2luc3RhbGxfbWFuaWZlc3QudHh0IiBmaWxlcykKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJcbiIgIjsiIGZpbGVzICIke2ZpbGVzfSIpCitmb3JlYWNoKGZpbGUgJHtmaWxlc30pCisgIG1lc3NhZ2UoU1RBVFVTICJVbmluc3RhbGxpbmcgJEVOVntERVNURElSfSR7ZmlsZX0iKQorICBpZihJU19TWU1MSU5LICIkRU5We0RFU1RESVJ9JHtmaWxlfSIgT1IgRVhJU1RTICIkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgICAgZXhlY19wcm9ncmFtKAorICAgICAgIkBDTUFLRV9DT01NQU5EQCIgQVJHUyAiLUUgcmVtb3ZlIFwiJEVOVntERVNURElSfSR7ZmlsZX1cIiIKKyAgICAgIE9VVFBVVF9WQVJJQUJMRSBybV9vdXQKKyAgICAgIFJFVFVSTl9WQUxVRSBybV9yZXR2YWwKKyAgICAgICkKKyAgICBpZihOT1QgIiR7cm1fcmV0dmFsfSIgU1RSRVFVQUwgMCkKKyAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlByb2JsZW0gd2hlbiByZW1vdmluZyAkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgICAgZW5kaWYoTk9UICIke3JtX3JldHZhbH0iIFNUUkVRVUFMIDApCisgIGVsc2UoSVNfU1lNTElOSyAiJEVOVntERVNURElSfSR7ZmlsZX0iIE9SIEVYSVNUUyAiJEVOVntERVNURElSfSR7ZmlsZX0iKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGaWxlICRFTlZ7REVTVERJUn0ke2ZpbGV9IGRvZXMgbm90IGV4aXN0LiIpCisgIGVuZGlmKElTX1NZTUxJTksgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IiBPUiBFWElTVFMgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IikKK2VuZGZvcmVhY2goZmlsZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3MvYmVzdF9wcmFjdGljZXMubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9kb2NzL2Jlc3RfcHJhY3RpY2VzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNmVlZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9kb2NzL2Jlc3RfcHJhY3RpY2VzLm1kCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgTUQwNDEgLS0+Cis8IS0tIENvcHlyaWdodCAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuIC0tPgorWyFbS2hyb25vcyBWdWxrYW5dWzFdXVsyXQorCitbMV06IGh0dHBzOi8vdnVsa2FuLmx1bmFyZy5jb20vaW1nL1Z1bGthbl8xMDBweF9EZWMxNi5wbmcgImh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8iCitbMl06IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8KKworIyBCZXN0IFByYWN0aWNlcyBWYWxpZGF0aW9uCisKK1shW0NyZWF0aXZlIENvbW1vbnNdWzNdXVs0XQorCitbM106IGh0dHBzOi8vaS5jcmVhdGl2ZWNvbW1vbnMub3JnL2wvYnktbmQvNC4wLzg4eDMxLnBuZyAiQ3JlYXRpdmUgQ29tbW9ucyBMaWNlbnNlIgorWzRdOiBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmQvNC4wLworCitCZXN0IFByYWN0aWNlcyBWYWxpZGF0aW9uCisKK0Jlc3QgUHJhY3RpY2VzIFZhbGlkYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGhlIGBWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24gbGF5ZXJgLiBXaGVuIGVuYWJsZWQsIHRoZSBCZXN0IFByYWN0aWNlcyBPYmplY3QgaXMKK2ludGVuZGVkIHRvIGhpZ2hsaWdodCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaXNzdWVzLCBxdWVzdGlvbmFibGUgdXNhZ2UgcGF0dGVybnMsIGNvbW1vbiBtaXN0YWtlcywgYW5kIGl0ZW1zIG5vdCBzcGVjaWZpY2FsbHkgcHJvaGliaXRlZAorYnkgdGhlIFZ1bGthbiBzcGVjaWZpY2F0aW9uIGJ1dCB0aGF0IG1heSBsZWFkIHRvIGFwcGxpY2F0aW9uIHByb2JsZW1zLgorCitCZXN0IFByYWN0aWNlcyB3aWxsIGlkZWFsbHkgYmUgcnVuIHBlcmlvZGljYWxseSBhbG9uZyB3aXRoIG5vcm1hbCB2YWxpZGF0aW9uIGNoZWNrcyBzbyB0aGF0IGlzc3VlcyBtYXkgYmUgYWRkcmVzc2VkIGluIGVhcmx5IHN0YWdlcyBvZiBkZXZlbG9wbWVudC4KKworVGhlIHNwZWNpZmljIGFyZWFzIGNvdmVyZWQgYnkgdGhpcyBsYXllciBhcmUgY3VycmVudGx5IHRyYWNrZWQgaW4KK1tHaXRodWIgSXNzdWUgIzI0OiBCZXN0IFByYWN0aWNlcy9Bc3Npc3RhbnQvUGVyZm9ybWFuY2UgTGF5ZXIuXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1WYWxpZGF0aW9uTGF5ZXJzL2lzc3Vlcy8yNCkKK1JlcXVlc3RzIGZvciBhZGRpdGlvbmFsIGNoZWNrcyBjYW4gYmUgcG9zdGVkIHRocm91Z2ggdGhlIHNhbWUgaXNzdWUsIG9yIGJ5IGNyZWF0aW5nIGEgbmV3IEdpdGh1YiBpc3N1ZS4KKworIyMgRW5hYmxpbmcgQmVzdCBQcmFjdGljZXMgVmFsaWRhdGlvbgorCitCZXN0IFByYWN0aWNlcyBWYWxpZGF0aW9uIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFRvIHR1cm4gb24gQmVzdCBQcmFjdGljZXMgdmFsaWRhdGlvbiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBsYXllciBzZXR0aW5ncyBmaWxlLAorYHZrX2xheWVyX3NldHRpbmdzLnR4dGA6CisKK2BgYGNvZGUKK2tocm9ub3NfdmFsaWRhdGlvbi5lbmFibGVzID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9CRVNUX1BSQUNUSUNFU19FWFQKK2BgYAorCitUbyBlbmFibGUgdXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBzZXQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKKworYGBgY29kZQorVktfTEFZRVJfRU5BQkxFUz1WS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0JFU1RfUFJBQ1RJQ0VTX0VYVAorYGBgCisKK1NvbWUgcGxhdGZvcm1zIGRvIG5vdCBzdXBwb3J0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHZhbGlkYXRpb24gbGF5ZXJzIHdpdGggdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuCitQcm9ncmFtcyBydW5uaW5nIG9uIHRoZXNlIHBsYXRmb3JtcyBtdXN0IHRoZW4gdXNlIHRoZSBwcm9ncmFtbWF0aWMgaW50ZXJmYWNlLgorCisjIyMgRW5hYmxpbmcgYW5kIFNwZWNpZnlpbmcgT3B0aW9ucyB3aXRoIHRoZSBQcm9ncmFtbWF0aWMgSW50ZXJmYWNlCisKK1RoZSBgVktfRVhUX3ZhbGlkYXRpb25fZmVhdHVyZXNgIGV4dGVuc2lvbiBjYW4gYmUgdXNlZCB0byBlbmFibGUgQmVzdCBQcmFjdGljZXMgVmFsaWRhdGlvbiBhdCBDcmVhdGVJbnN0YW5jZSB0aW1lLgorCitIZXJlIGlzIHNhbXBsZSBjb2RlIGlsbHVzdHJhdGluZyBob3cgdG8gZW5hYmxlIGl0OgorCitgYGBjb2RlCitWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIGVuYWJsZXNbXSA9IHtWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0JFU1RfUFJBQ1RJQ0VTX0VYVH07CitWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBmZWF0dXJlcyA9IHt9OworZmVhdHVyZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVDsKK2ZlYXR1cmVzLmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID0gMTsKK2ZlYXR1cmVzLnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gZW5hYmxlczsKKworVmtJbnN0YW5jZUNyZWF0ZUluZm8gaW5mbyA9IHt9OworaW5mby5wTmV4dCA9ICZmZWF0dXJlczsKK2BgYApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvZG9jcy9jb3JlX2NoZWNrcy5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3MvY29yZV9jaGVja3MubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2NDhkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3MvY29yZV9jaGVja3MubWQKQEAgLTAsMCArMSw2NyBAQAorPCEtLSBtYXJrZG93bmxpbnQtZGlzYWJsZSBNRDA0MSAtLT4KKzwhLS0gQ29weXJpZ2h0IDIwMTUtMjAxOSBMdW5hckcsIEluYy4gLS0+CisKK1shW0tocm9ub3MgVnVsa2FuXVsxXV1bMl0KKworWzFdOiBodHRwczovL3Z1bGthbi5sdW5hcmcuY29tL2ltZy9WdWxrYW5fMTAwcHhfRGVjMTYucG5nICJodHRwczovL3d3dy5raHJvbm9zLm9yZy92dWxrYW4vIgorWzJdOiBodHRwczovL3d3dy5raHJvbm9zLm9yZy92dWxrYW4vCisKKyMgQ29yZSBWYWxpZGF0aW9uIENoZWNrcworCitbIVtDcmVhdGl2ZSBDb21tb25zXVszXV1bNF0KKworWzNdOiBodHRwczovL2kuY3JlYXRpdmVjb21tb25zLm9yZy9sL2J5LW5kLzQuMC84OHgzMS5wbmcgIkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIKK1s0XTogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5kLzQuMC8KK0ltcGxlbWVudGVkIGFzIHBhcnQgb2YgdGhlIGBWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb25gIGxheWVyLCAgdGhpcyB2YWxpZGF0aW9uIG9iamVjdCBpcyByZXBvbnNpYmxpZSBmb3IgdmFsaWRhdGluZwordGhlIHN0YXR1cyBvZiBkZXNjcmlwdG9yIHNldHMsIGNvbW1hbmQgYnVmZmVycywgc2hhZGVyIG1vZHVsZXMsIHBpcGVsaW5lIHN0YXRlcywgcmVuZGVycGFzcyB1c2FnZSwgc3luY2hyb25pemF0aW9uLAorZHluYW1pYyBzdGF0ZXMsIGFuZCBtYW55IG90aGVyIHR5cGVzIG9mIHZhbGlkIHVzYWdlLiBJdCBpcyB0aGUgbWFpbiBtb2R1bGUgcmVzcG9uc2libGUgZm9yIHZhbGlkYXRpb24gcmVxdWlyaW5nCitzdWJzdGFudGlhbCBiYWNrZ3JvdW5kIHN0YXRlLgorCitUaGlzIG1vZHVsZSB2YWxpZGF0ZXMgdGhhdDoKKworLSB0aGUgZGVzY3JpcHRvciBzZXQgc3RhdGUgYW5kIHBpcGVsaW5lIHN0YXRlIGF0IGVhY2ggZHJhdyBjYWxsIGFyZSBjb25zaXN0ZW50CistIHBpcGVsaW5lcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHksIGtub3duIHdoZW4gdXNlZCBhbmQgYm91bmQgYXQgZHJhdyB0aW1lCistIGRlc2NyaXB0b3Igc2V0cyBhcmUga25vd24gYW5kIGNvbnNpc3Qgb2YgdmFsaWQgdHlwZXMsIGZvcm1hdHMsIGFuZCBsYXlvdXQKKy0gZGVzY3JpcHRvciBzZXQgcmVnaW9ucyBhcmUgdmFsaWQsIGJvdW5kLCBhbmQgdXBkYXRlZCBhcHByb3ByaWF0ZWx5CistIGNvbW1hbmQgYnVmZmVycyByZWZlcmVuY2VkIGFyZSBrbm93biBhbmQgdmFsaWQKKy0gY29tbWFuZCBzZXF1ZW5jaW5nIGZvciBzcGVjaWZpYyBzdGF0ZSBkZXBlbmRlbmNpZXMgYW5kIHJlbmRlcnBhc3MgdXNlIGlzIGNvcnJlY3QKKy0gbWVtb3J5IGlzIGF2YWlsYWJsZQorLSBkeW5hbWljIHN0YXRlIGlzIGNvcnJlY3RseSBzZXQuCisKK1RoaXMgdmFsaWRhdGlvbiBvYmplY3Qgd2lsbCBwcmludCBlcnJvcnMgaWYgdmFsaWRhdGlvbiBjaGVja3MgYXJlIG5vdCBjb3JyZWN0bHkgbWV0LCBhbmQgcHJvdmlkZSBjb250ZXh0IHJlbGF0ZWQgdG8KK3RoZSBmYWlsdXJlcy4KKworIyMgTWVtb3J5L1Jlc291cmNlIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eQorCitUaGlzIHZhbGlkYXRpb24gYWRkaXRpb25hbGx5IGF0dGVtcHRzIHRvIGVuc3VyZSB0aGF0IG1lbW9yeSBvYmplY3RzIGFyZSBtYW5hZ2VkIGNvcnJlY3RseSBieSB0aGUgYXBwbGljYXRpb24uCitUaGVzZSBtZW1vcnkgb2JqZWN0cyBtYXkgYmUgYm91bmQgdG8gcGlwZWxpbmVzLCBvYmplY3RzLCBhbmQgY29tbWFuZCBidWZmZXJzLCBhbmQgdGhlbiBzdWJtaXR0ZWQgdG8gdGhlIEdQVQorZm9yIHdvcmsuIFNwZWNpZmljYWxseSB0aGUgbGF5ZXIgdmFsaWRhdGVzIHRoYXQ6CisKKy0gdGhlIGNvcnJlY3QgbWVtb3J5IG9iamVjdHMgaGF2ZSBiZWVuIGJvdW5kCistIG1lbW9yeSBvYmplY3RzIGFyZSBzcGVjaWZpZWQgY29ycmVjdGx5IHVwb24gY29tbWFuZCBidWZmZXIgc3VibWl0dGFsCistIG9ubHkgZXhpc3RpbmcgbWVtb3J5IG9iamVjdHMgYXJlIHJlZmVyZW5jZWQKKy0gZGVzdHJveWVkIG1lbW9yeSBvYmplY3RzIGFyZSBub3QgcmVmZXJlbmNlZAorLSB0aGUgYXBwbGljYXRpb24gaGFzIGNvbmZpcm1lZCBhbnkgbWVtb3J5IG9iamVjdHMgdG8gYmUgcmV1c2VkIG9yIGRlc3Ryb3llZCBoYXZlIGJlZW4gcHJvcGVybHkgdW5ib3VuZAorLSBjaGVja3MgdGV4dHVyZSBmb3JtYXRzIGFuZCByZW5kZXIgdGFyZ2V0IGZvcm1hdHMuCisKK0Vycm9ycyB3aWxsIGJlIHByaW50ZWQgaWYgdmFsaWRhdGlvbiBjaGVja3MgYXJlIG5vdCBjb3JyZWN0bHkgbWV0IGFuZCB3YXJuaW5ncyBpZiBpbXByb3BlciAoYnV0IG5vdCBpbGxlZ2FsKSB1c2Ugb2YKK21lbW9yeSBpcyBkZXRlY3RlZC4gIFZhbGlkYXRpb24gYWxzbyBkdW1wcyBhbGwgbWVtb3J5IHJlZmVyZW5jZXMgYW5kIGJpbmRpbmdzIGZvciBlYWNoIG9wZXJhdGlvbi4KKworIyMgU2hhZGVyIHZhbGlkYXRpb24gZnVuY3Rpb25hbGl0eQorCitBZGRpdGlvbmFsIGNoZWNrcyBhcHBseSB0byB0aGUgVlMtPkZTIGFuZCBGUy0+Q0IgaW50ZXJmYWNlcyB3aXRoIHRoZSBwaXBlbGluZS4gIFRoZXNlIGNoZWNrcyBpbmNsdWRlOgorCistIHZhbGlkYXRpbmcgdGhhdCBhbGwgdmFyaWFibGVzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgc2hhZGVyIGludGVyZmFjZSBhcmUgIGRlY29yYXRlZCB3aXRoIGVpdGhlciBgc3B2OjpEZWNMb2NhdGlvbmAgb3IgYHNwdjo6RGVjQnVpbHRpbmAgKHRoYXQgaXMsIG9ubHkgdGhlIFNTTyByZW5kZXp2b3VzLWJ5LWxvY2F0aW9uIG1vZGVsIGlzIHN1cHBvcnRlZCkKKy0gZW1pdHRpbmcgYSB3YXJuaW5nIGlmIGEgbG9jYXRpb24gaXMgZGVjbGFyZWQgb25seSBpbiB0aGUgcHJvZHVjaW5nIHN0YWdlICh1c2VsZXNzIHdvcmsgaXMgYmVpbmcgZG9uZSkKKy0gZW1pdHRpbmcgYW4gZXJyb3IgaWYgYSBsb2NhdGlvbiBpcyBkZWNsYXJlZCBvbmx5IGluIHRoZSBjb25zdW1pbmcgc3RhZ2UgKGdhcmJhZ2Ugd2lsbCBiZSByZWFkKS4KKworQSBzcGVjaWFsIGVycm9yIGNoZWNraW5nIGNhc2UgaW52b2tlZCB3aGVuIHRoZSBGUyBzdGFnZSB3cml0ZXMgYSBidWlsdC1pbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsZWdhY3kgYGdsX0ZyYWdDb2xvcmAuICBJbiB0aGlzIGNhc2UsIGFuIGVycm9yIGlzIGVtaXR0ZWQgaWYKKworLSB0aGUgRlMgYWxzbyB3cml0ZXMgYW55IHVzZXItZGVmaW5lZCBvdXRwdXQKKy0gdGhlIENCIGhhcyBhbnkgYXR0YWNobWVudCB3aXRoIGEgYFVJTlRgIG9yIGBTSU5UYCB0eXBlLgorCitUaGVzZSBleHRyYSBjaGVja3MgYXJlIHRvIGVuc3VyZSB0aGF0IHRoZSBsZWdhY3kgYnJvYWRjYXN0IG9mIGBnbF9GcmFnQ29sb3JgIHRvIGFsbCBib3VuZCBjb2xvciBhdHRhY2htZW50cyBpcyB3ZWxsLWRlZmluZWQuCisKKyMjIFN3YXBjaGFpbiB2YWxpZGF0aW9uIGZ1bmN0aW9uYWxpdHkKKworVGhpcyBhcmVhIG9mIGZ1bmN0aW9uYWxpdHkgdmFsaWRhdGVzIHRoZSB1c2Ugb2YgdGhlIFdTSSAoV2luZG93IFN5c3RlbSBJbnRlZ3JhdGlvbikgInN3YXBjaGFpbiIgZXh0ZW5zaW9ucyAoZS5nLiwgYFZLX0VYVF9LSFJfc3dhcGNoYWluYCBhbmQgYFZLX0VYVF9LSFJfZGV2aWNlX3N3YXBjaGFpbmApLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvZG9jcy9ncHVfdmFsaWRhdGlvbi5tZCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3MvZ3B1X3ZhbGlkYXRpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0MDI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3MvZ3B1X3ZhbGlkYXRpb24ubWQKQEAgLTAsMCArMSw5NjcgQEAKKzwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgTUQwNDEgLS0+Cis8IS0tIENvcHlyaWdodCAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuIC0tPgorWyFbS2hyb25vcyBWdWxrYW5dWzFdXVsyXQorCitbMV06IGh0dHBzOi8vdnVsa2FuLmx1bmFyZy5jb20vaW1nL1Z1bGthbl8xMDBweF9EZWMxNi5wbmcgImh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8iCitbMl06IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8KKworIyBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbgorCitbIVtDcmVhdGl2ZSBDb21tb25zXVszXV1bNF0KKworWzNdOiBodHRwczovL2kuY3JlYXRpdmVjb21tb25zLm9yZy9sL2J5LW5kLzQuMC84OHgzMS5wbmcgIkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIKK1s0XTogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5kLzQuMC8KKworR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGhlIFNQSVItViBUb29scyBvcHRpbWl6ZXIgYW5kIHRoZSBgVktfTEFZRVJfS0hST05PU192YWxpZGF0aW9uYCBsYXllci4KK1RoaXMgZG9jdW1lbnQgY292ZXJzIHRoZSBkZXNpZ24gb2YgdGhlIGxheWVyIHBvcnRpb24gb2YgdGhlIGltcGxlbWVudGF0aW9uLgorCisjIyBCYXNpYyBPcGVyYXRpb24KKworVGhlIGJhc2ljIG9wZXJhdGlvbiBvZiBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBpcyBjb21wcmlzZWQgb2YgaW5zdHJ1bWVudGluZyBzaGFkZXIgY29kZSB0byBwZXJmb3JtIHJ1bi10aW1lIGNoZWNraW5nIG9mIHNoYWRlcnMgYW5kCityZXBvcnRpbmcgYW55IGVycm9yIGNvbmRpdGlvbnMgdG8gdGhlIGxheWVyLgorVGhlIGxheWVyIHRoZW4gcmVwb3J0cyB0aGUgZXJyb3JzIHRvIHRoZSB1c2VyIHZpYSB0aGUgc2FtZSByZXBvcnRpbmcgbWVjaGFuaXNtcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSB2YWxpZGF0aW9uIHN5c3RlbS4KKworVGhlIGxheWVyIGluc3RydW1lbnRzIHRoZSBzaGFkZXJzIGJ5IHBhc3NpbmcgdGhlIHNoYWRlcidzIFNQSVItViBieXRlY29kZSB0byB0aGUgU1BJUi1WIG9wdGltaXplciBjb21wb25lbnQgYW5kCitpbnN0cnVjdHMgdGhlIG9wdGltaXplciB0byBwZXJmb3JtIGFuIGluc3RydW1lbnRhdGlvbiBwYXNzIHRvIGFkZCB0aGUgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgdG8gcGVyZm9ybSB0aGUgcnVuLXRpbWUgY2hlY2tpbmcuCitUaGUgbGF5ZXIgdGhlbiBwYXNzZXMgdGhlIHJlc3VsdGluZyBtb2RpZmllZCBTUElSLVYgYnl0ZWNvZGUgdG8gdGhlIGRyaXZlciBhcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEgU2hhZGVyTW9kdWxlLgorCitUaGUgbGF5ZXIgYWxzbyBhbGxvY2F0ZXMgYSBidWZmZXIgdGhhdCBkZXNjcmliZXMgdGhlIGxlbmd0aCBvZiBhbGwgZGVzY3JpcHRvciBhcnJheXMgYW5kIHRoZSB3cml0ZSBzdGF0ZSBvZiBlYWNoIGVsZW1lbnQgb2YgZWFjaCBhcnJheS4KK0l0IG9ubHkgZG9lcyB0aGlzIGlmIHRoZSBWS19FWFRfZGVzY3JpcHRvcl9pbmRleGluZyBleHRlbnNpb24gaXMgZW5hYmxlZC4KKworVGhlIGxheWVyIGFsc28gYWxsb2NhdGVzIGEgYnVmZmVyIHRoYXQgZGVzY3JpYmVzIGFsbCBhZGRyZXNzZXMgcmV0cmlldmVkIGZyb20gdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIGFuZCB0aGUgc2l6ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYnVmZmVycy4KK0l0IG9ubHkgZG9lcyB0aGlzIGlmIHRoZSBWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzIGV4dGVuc2lvbiBpcyBlbmFibGVkLgorCitBcyB0aGUgc2hhZGVyIGlzIGV4ZWN1dGVkLCB0aGUgaW5zdHJ1bWVudGVkIHNoYWRlciBjb2RlIHBlcmZvcm1zIHRoZSBydW4tdGltZSBjaGVja3MuCitJZiBhIGNoZWNrIGRldGVjdHMgYW4gZXJyb3IgY29uZGl0aW9uLCB0aGUgaW5zdHJ1bWVudGF0aW9uIGNvZGUgd3JpdGVzIGFuIGVycm9yIHJlY29yZCBpbnRvIHRoZSBHUFUncyBkZXZpY2UgbWVtb3J5LgorVGhpcyByZWNvcmQgaXMgc21hbGwgYW5kIGlzIG9uIHRoZSBvcmRlciBvZiBhIGRvemVuIDMyLWJpdCB3b3Jkcy4KK1NpbmNlIG11bHRpcGxlIHNoYWRlciBzdGFnZXMgYW5kIG11bHRpcGxlIGludm9jYXRpb25zIG9mIGEgc2hhZGVyIGNhbiBhbGwgZGV0ZWN0IGVycm9ycywgdGhlIGluc3RydW1lbnRhdGlvbiBjb2RlCit3cml0ZXMgZXJyb3IgcmVjb3JkcyBpbnRvIGNvbnNlY3V0aXZlIG1lbW9yeSBsb2NhdGlvbnMgYXMgbG9uZyBhcyB0aGVyZSBpcyBzcGFjZSBhdmFpbGFibGUgaW4gdGhlIHByZS1hbGxvY2F0ZWQgYmxvY2sgb2YgZGV2aWNlIG1lbW9yeS4KKworVGhlIGxheWVyIGluc3BlY3RzIHRoaXMgZGV2aWNlIG1lbW9yeSBibG9jayBhZnRlciBjb21wbGV0aW9uIG9mIGEgcXVldWUgc3VibWlzc2lvbi4KK0lmIHRoZSBHUFUgaGFkIHdyaXR0ZW4gYW4gZXJyb3IgcmVjb3JkIHRvIHRoaXMgbWVtb3J5IGJsb2NrLAordGhlIGxheWVyIGFuYWx5emVzIHRoaXMgZXJyb3IgcmVjb3JkIGFuZCBjb25zdHJ1Y3RzIGEgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlCit3aGljaCBpcyB0aGVuIHJlcG9ydGVkIGluIHRoZSBzYW1lIG1hbm5lciBhcyBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzLgorSWYgdGhlIHNoYWRlciB3YXMgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbiAoc291cmNlIGNvZGUgYW5kIFNQSVItViBpbnN0cnVjdGlvbiBtYXBwaW5nIHRvIHNvdXJjZSBjb2RlIGxpbmVzKSwgdGhlIGxheWVyCithbHNvIHByb3ZpZGVzIHRoZSBsaW5lIG9mIHNoYWRlciBzb3VyY2UgY29kZSB0aGF0IHByb3Zva2VkIHRoZSBlcnJvciBhcyBwYXJ0IG9mIHRoZSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UuCisKKyMjIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIENoZWNrcworCitUaGUgaW5pdGlhbCByZWxlYXNlIChKYW4gMjAxOSkgb2YgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gaW5jbHVkZXMgY2hlY2tpbmcgZm9yIG91dC1vZi1ib3VuZHMgZGVzY3JpcHRvciBhcnJheSBpbmRleGluZworZm9yIGltYWdlL3RleGVsIGRlc2NyaXB0b3IgdHlwZXMuCisKK1RoZSBzZWNvbmQgcmVsZWFzZSAoQXByIDIwMTkpIGFkZHMgdmFsaWRhdGlvbiBmb3Igb3V0LW9mLWJvdW5kcyBkZXNjcmlwdG9yIGFycmF5IGluZGV4aW5nIGFuZCB1c2Ugb2YgdW53cml0dGVuIGRlc2NyaXB0b3JzIHdoZW4gdGhlIAorVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcgZXh0ZW5zaW9uIGlzIGVuYWJsZWQuICBBbHNvIGFkZGVkIChKdW5lIDIwMTkpIHdhcyB2YWxpZGF0aW9uIGZvciBidWZmZXIgZGVzY3JpcHRvcnMuCisKK0EgdGhpcmQgdXBkYXRlIChBdWcgMjAxOSkgYWRkcyB2YWxpZGF0aW9uIG9mIGJ1aWxkaW5nIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGZvciByYXkgdHJhY2luZyB3aGVuIHRoZQorVktfTlZfcmF5X3RyYWNpbmcgZXh0ZW5zaW9uIGlzIGVuYWJsZWQuCisKKyhBdWd1c3QgMjAxOSkgQWRkIGJvdW5kcyBjaGVja2luZyBmb3IgcG9pbnRlcnMgcmV0cmlldmVkIGZyb20gdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhULgorCisjIyMgT3V0LW9mLUJvdW5kcyhPT0IpIERlc2NyaXB0b3IgQXJyYXkgSW5kZXhpbmcKKworQ2hlY2tpbmcgZm9yIGNvcnJlY3QgaW5kZXhpbmcgb2YgZGVzY3JpcHRvciBhcnJheXMgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzICJiaW5kLWxlc3MgdmFsaWRhdGlvbiIuCitJdCBpcyBjYWxsZWQgImJpbmQtbGVzcyIgYmVjYXVzZSBhIGJpbmRpbmcgaW4gYSBkZXNjcmlwdG9yIHNldCBtYXkgY29udGFpbiBhbiBhcnJheSBvZiBsaWtlIGRlc2NyaXB0b3JzLgorQW5kIHVubGVzcyB0aGVyZSBpcyBhIGNvbnN0YW50IG9yIGNvbXBpbGUtdGltZSBpbmRpY2F0aW9uIG9mIHdoaWNoIGRlc2NyaXB0b3IgaW4gdGhlIGFycmF5IGlzIHNlbGVjdGVkLAordGhlIGRlc2NyaXB0b3IgYmluZGluZyBzdGF0dXMgaXMgY29uc2lkZXJlZCB0byBiZSBhbWJpZ3VvdXMsIGxlYXZpbmcgdGhlIGFjdHVhbCBiaW5kaW5nIHRvIGJlIGRldGVybWluZWQgYXQgcnVuLXRpbWUuCisKK0FzIGFuIGV4YW1wbGUsIGEgZnJhZ21lbnQgc2hhZGVyIHByb2dyYW0gbWF5IHVzZSBhIHZhcmlhYmxlIHRvIGluZGV4IGFuIGFycmF5IG9mIGNvbWJpbmVkIGltYWdlIHNhbXBsZXJzLgorU3VjaCBhIGxpbmUgbWlnaHQgbG9vayBsaWtlOgorCitgYGBnbHNsCit1RnJhZ0NvbG9yID0gbGlnaHQgKiB0ZXh0dXJlKHRleFt0ZXhfaW5kXSwgdGV4Y29vcmQueHkpOworYGBgCisKK1RoZSBhcnJheSBvZiBjb21iaW5lZCBpbWFnZSBzYW1wbGVycyBpcyBgdGV4YCBhbmQgaGFzIDYgc2FtcGxlcnMgaW4gdGhlIGFycmF5LgorVGhlIGNvbXBsZXRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZSBpc3N1ZWQgd2hlbiBgdGV4X2luZGAgaW5kZXhlcyBwYXN0IHRoZSBhcnJheSBpczoKKworYGBgdGVybWluYWwKK0VSUk9SIDogVkFMSURBVElPTiAtIE1lc3NhZ2UgSWQgTnVtYmVyOiAwIHwgTWVzc2FnZSBJZCBOYW1lOiBVTkFTU0lHTkVELUltYWdlIGRlc2NyaXB0b3IgaW5kZXggb3V0IG9mIGJvdW5kcworICAgICAgICBJbmRleCBvZiA2IHVzZWQgdG8gaW5kZXggZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggNi4gIENvbW1hbmQgYnVmZmVyIChDdWJlRHJhd0NvbW1hbmRCdWYpKDB4YmMyNGIwKS4KKyAgICAgICAgUGlwZWxpbmUgKDB4NDUpLiBTaGFkZXIgTW9kdWxlICgweDQzKS4gU2hhZGVyIEluc3RydWN0aW9uIEluZGV4ID0gMTA4LiAgU3RhZ2UgPSBGcmFnbWVudC4KKyAgICAgICAgRnJhZ21lbnQgY29vcmQgKHgseSkgPSAoNDE5LjUsIDI1NC41KS4gU2hhZGVyIHZhbGlkYXRpb24gZXJyb3Igb2NjdXJyZWQgaW4gZmlsZToKKyAgICAgICAgL2hvbWUvdXNlci9zcmMvVnVsa2FuLVZhbGlkYXRpb25MYXllcnMvZXh0ZXJuYWwvVnVsa2FuLVRvb2xzL2N1YmUvY3ViZS5mcmFnIGF0IGxpbmUgNDUuCis0NTogICAgdUZyYWdDb2xvciA9IGxpZ2h0ICogdGV4dHVyZSh0ZXhbdGV4X2luZF0sIHRleGNvb3JkLnh5KTsKK2BgYAorVGhlIFZLX0VYVF9kZXNjcmlwdG9yX2luZGV4aW5nIGV4dGVuc2lvbiBhbGxvd3MgYSBzaGFkZXIgdG8gZGVjbGFyZSBhIGRlc2NyaXB0b3IgYXJyYXkgd2l0aG91dCBzcGVjaWZ5aW5nIGl0cyBzaXplCitgYGBnbHNsCitsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDEpIHVuaWZvcm0gc2FtcGxlcjJEIHRleFtdOworYGBgCitJbiB0aGlzIGNhc2UsIHRoZSBsYXllciBuZWVkcyB0byB0ZWxsIHRoZSBvcHRpbWl6YXRpb24gY29kZSBob3cgYmlnIHRoZSBkZXNjcmlwdG9yIGFycmF5IGlzIHNvIHRoZSBjb2RlIGNhbiBkZXRlcm1pbmUgd2hhdCBpcyBvdXQgb2YgCitib3VuZHMgYW5kIHdoYXQgaXMgbm90LgorCitUaGUgZXh0ZW5zaW9uIGFsc28gYWxsb3dzIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmdzIHRvIGJlIHBhcnRpYWxseSBib3VuZCwgbWVhbmluZyB0aGF0IGFzIGxvbmcgYXMgdGhlIHNoYWRlciBkb2Vzbid0IHVzZSBjZXJ0YWluCithcnJheSBlbGVtZW50cywgdGhvc2UgZWxlbWVudHMgYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIGJlZW4gd3JpdHRlbi4KK1RoZSBpbnN0cnVtZW50YXRpb24gY29kZSBuZWVkcyB0byBrbm93IHdoaWNoIGVsZW1lbnRzIG9mIGEgZGVzY3JpcHRvciBhcnJheSBoYXZlIGJlZW4gd3JpdHRlbiwgc28gdGhhdCBpdCBjYW4gdGVsbCBpZiBvbmUgaXMgdXNlZAordGhhdCBoYXMgbm90IGJlZW4gd3JpdHRlbi4KKworTm90ZSB0aGF0IGN1cnJlbnRseSwgVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVCB2YWxpZGF0aW9uIGlzIG5vdCB3b3JraW5nIGFuZCBhbGwgYWNjZXNzZXMgYXJlIHJlcG9ydGVkIGFzIHZhbGlkLgorCisjIyMgQnVmZmVyIGRldmljZSBhZGRyZXNzIGNoZWNraW5nCitUaGUgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIHJvdXRpbmUgY2FuIGJlIHVzZWQgdG8gZ2V0IGEgR1BVIGFkZHJlc3MgdGhhdCBhIHNoYWRlciBjYW4gdXNlIHRvIGRpcmVjdGx5IGFkZHJlc3MgYSBwYXJ0aWN1bGFyIGJ1ZmZlci4KK0dQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIGNvZGUga2VlcHMgdHJhY2sgb2YgYWxsIHN1Y2ggYWRkcmVzc2VzLCBhbG9uZyB3aXRoIHRoZSBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciwgYW5kIGNyZWF0ZXMgYW4gaW5wdXQgYnVmZmVyIGxpc3RpbmcgYWxsIHN1Y2ggYWRkcmVzcy9zaXplIHBhaXJzCitTaGFkZXIgY29kZSBpcyBpbnN0cnVtZW50ZWQgdG8gdmFsaWRhdGUgYnVmZmVyX3JlZmVyZW5jZSBhZGRyZXNzZXMgYW5kIHJlcG9ydCBhbnkgcmVhZHMgb3Igd3JpdGVzIHRoYXQgZG8gbm8gZmFsbCB3aXRoaW4gdGhlIGxpc3RlZCBhZGRyZXNzL3NpemUgcmVnaW9ucy5fCisKKyMjIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIE9wdGlvbnMKKworSGVyZSBhcmUgdGhlIG9wdGlvbnMgcmVsYXRlZCB0byBhY3RpdmF0aW5nIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uOgorCisxLiBFbmFibGUgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gLSBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBpcyBvZmYgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBlbmFibGVkLgorCisgICAgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBzaGFkZXIgaW5zdHJ1bWVudGF0aW9uIG1heSBpbnRyb2R1Y2Ugc2lnbmlmaWNhbnQKKyAgICBzaGFkZXIgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYW5kIGFkZGl0aW9uYWwgcmVzb3VyY2UgY29uc3VtcHRpb24uCisgICAgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gcmVxdWlyZXMgYWRkaXRpb25hbCByZXNvdXJjZXMgc3VjaCBhcyBkZXZpY2UgbWVtb3J5IGFuZCBkZXNjcmlwdG9ycy4KKyAgICBJdCBpcyBkZXNpcmFibGUgZm9yIHRoZSB1c2VyIHRvIG9wdC1pbiB0byB0aGlzIGZlYXR1cmUgYmVjYXVzZSBvZiB0aGVzZSByZXF1aXJlbWVudHMuCisgICAgSW4gYWRkaXRpb24sIHRoZXJlIGFyZSBzZXZlcmFsIGxpbWl0YXRpb25zIHRoYXQgbWF5IGFkdmVyc2VseSBhZmZlY3QgYXBwbGljYXRpb24gYmVoYXZpb3IsCisgICAgYXMgZGVzY3JpYmVkIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuCisKKzIuIFJlc2VydmUgYSBEZXNjcmlwdG9yIFNldCBCaW5kaW5nIFNsb3QgLSBNb2RpZmllcyB0aGUgdmFsdWUgb2YgdGhlIGBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhCb3VuZERlc2NyaXB0b3JTZXRzYAorICAgcHJvcGVydHkgdG8gcmV0dXJuIGEgdmFsdWUgb25lIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGRldmljZSdzIHZhbHVlIHRvICJyZXNlcnZlIiBhIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc2xvdCBmb3IgdXNlIGJ5IEdQVSB2YWxpZGF0aW9uLgorCisgICBUaGlzIG9wdGlvbiBpcyBsaWtlbHkgb25seSBvZiBpbnRlcmVzdCB0byBhcHBsaWNhdGlvbnMgdGhhdCBkeW5hbWljYWxseSBhZGp1c3QgdGhlaXIgZGVzY3JpcHRvciBzZXQgYmluZGluZ3MgdG8gYWRqdXN0IGZvcgorICAgdGhlIGxpbWl0cyBvZiB0aGUgZGV2aWNlLgorCisjIyMgRW5hYmxpbmcgYW5kIFNwZWNpZnlpbmcgT3B0aW9ucyB3aXRoIGEgQ29uZmlndXJhdGlvbiBGaWxlCisKK1RoZSBleGlzdGluZyBsYXllciBjb25maWd1cmF0aW9uIGZpbGUgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbi4KK1RoaXMgbWVjaGFuaXNtIGlzIGRlc2NyaWJlZCBvbiB0aGUKK1tMdW5hclhjaGFuZ2Ugd2Vic2l0ZV0oaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS9kb2Mvc2RrL2xhdGVzdC93aW5kb3dzL2xheWVyX2NvbmZpZ3VyYXRpb24uaHRtbCksCitpbiB0aGUgIkxheWVycyBPdmVydmlldyBhbmQgQ29uZmlndXJhdGlvbiIgZG9jdW1lbnQuCisKK1RvIHR1cm4gb24gR1BVIHZhbGlkYXRpb24sIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgbGF5ZXIgc2V0dGluZ3MgZmlsZSwgd2hpY2ggaXMgb2Z0ZW4KK25hbWVkIGB2a19sYXllcl9zZXR0aW5ncy50eHRgLgorCitgYGBjb2RlCitraHJvbm9zX3ZhbGlkYXRpb24uZW5hYmxlcyA9IFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX0VYVCAKK2BgYAorCitUbyB0dXJuIG9uIEdQVSB2YWxpZGF0aW9uIGFuZCByZXF1ZXN0IHRvIHJlc2VydmUgYSBiaW5kaW5nIHNsb3Q6CisKK2BgYGNvZGUKK2tocm9ub3NfdmFsaWRhdGlvbi5lbmFibGVzID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhULFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX1JFU0VSVkVfQklORElOR19TTE9UX0VYVCAKK2BgYAorCitTb21lIHBsYXRmb3JtcyBkbyBub3Qgc3VwcG9ydCBjb25maWd1cmF0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIGxheWVycyB3aXRoIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLgorUHJvZ3JhbXMgcnVubmluZyBvbiB0aGVzZSBwbGF0Zm9ybXMgbXVzdCB0aGVuIHVzZSB0aGUgcHJvZ3JhbW1hdGljIGludGVyZmFjZS4KKworIyMjIEVuYWJsaW5nIGFuZCBTcGVjaWZ5aW5nIE9wdGlvbnMgd2l0aCB0aGUgUHJvZ3JhbW1hdGljIEludGVyZmFjZQorCitUaGUgYFZLX0VYVF92YWxpZGF0aW9uX2ZlYXR1cmVzYCBleHRlbnNpb24gY2FuIGJlIHVzZWQgdG8gZW5hYmxlIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIGF0IENyZWF0ZUluc3RhbmNlIHRpbWUuCisKK0hlcmUgaXMgc2FtcGxlIGNvZGUgaWxsdXN0cmF0aW5nIGhvdyB0byBlbmFibGUgaXQ6CisKK2BgYEMKK1ZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQgZW5hYmxlc1tdID0ge1ZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX0VYVH07CitWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBmZWF0dXJlcyA9IHt9OworZmVhdHVyZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVDsKK2ZlYXR1cmVzLmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID0gMTsKK2ZlYXR1cmVzLnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gZW5hYmxlczsKKworVmtJbnN0YW5jZUNyZWF0ZUluZm8gaW5mbyA9IHt9OworaW5mby5wTmV4dCA9ICZmZWF0dXJlczsKK2BgYAorCitVc2UgdGhlIGBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9SRVNFUlZFX0JJTkRJTkdfU0xPVF9FWFRgIGVudW0gdG8gcmVzZXJ2ZSBhIGJpbmRpbmcgc2xvdC4KKworIyMgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gTGltaXRhdGlvbnMKKworVGhlcmUgYXJlIHNldmVyYWwgbGltaXRhdGlvbnMgdGhhdCBtYXkgaW1wZWRlIHRoZSBvcGVyYXRpb24gb2YgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb246CisKKyMjIyBWdWxrYW4gMS4xCisKK1Z1bGthbiAxLjEgb3IgbGF0ZXIgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgR1BVIGluc3RydW1lbnRhdGlvbiBjb2RlIHVzZXMgU1BJUi1WIDEuMyBmZWF0dXJlcy4KK1Z1bGthbiAxLDEgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgU1BJUi1WIDEuMyBpcyBhdmFpbGFibGUuCisKKyMjIyBEZXNjcmlwdG9yIFR5cGVzCisKK1RoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdvcmtzIHdpdGggaW1hZ2UsIHRleGVsLCBhbmQgYnVmZmVyIGRlc2NyaXB0b3IgdHlwZXMuCitBIGNvbXBsZXRlIGxpc3QgYXBwZWFycyBsYXRlciBpbiB0aGlzIGRvY3VtZW50LgorCisjIyMgRGVzY3JpcHRvciBTZXQgQmluZGluZyBMaW1pdAorCitUaGlzIGlzIHByb2JhYmx5IHRoZSBtb3N0IGltcG9ydGFudCBsaW1pdGF0aW9uIGFuZCBpcyByZWxhdGVkIHRvIHRoZQorYFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEJvdW5kRGVzY3JpcHRvclNldHNgIGRldmljZSBsaW1pdC4KKworV2hlbiBhcHBsaWNhdGlvbnMgdXNlIGFsbCB0aGUgYXZhaWxhYmxlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc2xvdHMsCitHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgaXQgbmVlZHMgYSBkZXNjcmlwdG9yIHNldCB0bworbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHdyaXRpbmcgdGhlIGVycm9yIHJlcG9ydCByZWNvcmQuCisKK1RoaXMgcHJvYmxlbSBpcyBtb3N0IGxpa2VseSB0byBvY2N1ciBvbiBkZXZpY2VzLCBvZnRlbiBtb2JpbGUsIHRoYXQgc3VwcG9ydCBvbmx5IHRoZQorbWluaW11bSByZXF1aXJlZCB2YWx1ZSBmb3IgYFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEJvdW5kRGVzY3JpcHRvclNldHNgLCB3aGljaCBpcyA0LgorU29tZSBhcHBsaWNhdGlvbnMgbWF5IGJlIHdyaXR0ZW4gdG8gdXNlIDQgc2xvdHMgc2luY2UgdGhpcyBpcyB0aGUgaGlnaGVzdCB2YWx1ZSB0aGF0CitpcyBndWFyYW50ZWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uLgorV2hlbiBzdWNoIGFuIGFwcGxpY2F0aW9uIHVzaW5nIDQgc2xvdHMgcnVucyBvbiBhIGRldmljZSB3aXRoIG9ubHkgNCBzbG90cywKK3RoZW4gR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZC4KKworSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBjb25kaXRpb24gaXMgZGV0ZWN0ZWQgYW5kIGdyYWNlZnVsbHkgcmVjb3ZlcmVkIGZyb20gYnkKK2J1aWxkaW5nIHRoZSBncmFwaGljcyBwaXBlbGluZSB3aXRoIG5vbi1pbnN0cnVtZW50ZWQgc2hhZGVycyBpbnN0ZWFkIG9mIGluc3RydW1lbnRlZCBvbmVzLgorQW4gZXJyb3IgbWVzc2FnZSBpcyBhbHNvIGRpc3BsYXllZCBpbmZvcm1pbmcgdGhlIHVzZXIgb2YgdGhlIGNvbmRpdGlvbi4KKworQXBwbGljYXRpb25zIGRvbid0IGhhdmUgbWFueSBvcHRpb25zIGluIHRoaXMgc2l0dWF0aW9uIGFuZCBpdCBpcyBhbnRpY2lwYXRlZCB0aGF0CitjaGFuZ2luZyB0aGUgYXBwbGljYXRpb24gdG8gZnJlZSBhIHNsb3QgaXMgZGlmZmljdWx0LgorCisjIyMgRGV2aWNlIE1lbW9yeQorCitHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBkb2VzIGFsbG9jYXRlIGRldmljZSBtZW1vcnkgZm9yIHRoZSBlcnJvciByZXBvcnQgYnVmZmVycywgYW5kIGlmCitkZXNjcmlwdG9yIGluZGV4aW5nIGlzIGVuYWJsZWQsIGZvciB0aGUgaW5wdXQgYnVmZmVyIG9mIGRlc2NyaXB0b3Igc2l6ZXMgYW5kIHdyaXRlIHN0YXRlLgorVGhpcyBjYW4gbGVhZCB0byBhIGdyZWF0ZXIgY2hhbmNlIG9mIG1lbW9yeSBleGhhdXN0aW9uLCBlc3BlY2lhbGx5IGluIGNhc2VzIHdoZXJlCit0aGUgYXBwbGljYXRpb24gaXMgdHJ5aW5nIHRvIHVzZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBtZW1vcnkuCitUaGUgZXh0cmEgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBhbHNvIG5vdCB2aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiwgbWFraW5nIGl0CitpbXBvc3NpYmxlIGZvciB0aGUgYXBwbGljYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlbS4KKworTm90ZSB0aGF0IGlmIGRlc2NyaXB0b3IgaW5kZXhpbmcgaXMgZW5hYmxlZCwgdGhlIGlucHV0IGJ1ZmZlciBzaXplIHdpbGwgYmUgZXF1YWwgdG8KKygxICsgKG51bWJlcl9vZl9zZXRzICogMikgKyAoYmluZGluZ19jb3VudCAqIDIpICsgZGVzY3JpcHRvcl9jb3VudCkgd29yZHMgb2YgbWVtb3J5IHdoZXJlCitiaW5kaW5nX2NvdW50IGlzIHRoZSBiaW5kaW5nIG51bWJlciBvZiB0aGUgbGFyZ2VzdCBiaW5kaW5nIGluIHRoZSBzZXQuICAKK1RoaXMgbWVhbnMgdGhhdCBzcGFyc2VseSBwb3B1bGF0ZWQgc2V0cyBhbmQgc2V0cyB3aXRoIGEgdmVyeSBsYXJnZSBiaW5kaW5nIHdpbGwgY2F1c2UKK3RoZSBpbnB1dCBidWZmZXIgdG8gYmUgbXVjaCBsYXJnZXIgdGhhbiBpdCBjb3VsZCBiZSB3aXRoIG1vcmUgZGVuc2VseSBwYWNrZWQgYmluZGluZyBudW1iZXJzLgorQXMgYSBiZXN0IHByYWN0aWNlLCB3aGVuIHVzaW5nIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIHdpdGggZGVzY3JpcHRvciBpbmRleGluZyBlbmFibGVkLAorbWFrZSBzdXJlIGRlc2NyaXB0b3IgYmluZGluZ3MgYXJlIGRlbnNlbHkgcGFja2VkLgorCitJZiBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBkZXZpY2UgbWVtb3J5IGFsbG9jYXRpb25zIGZhaWwsIHRoZSBkZXZpY2UgY291bGQgYmVjb21lCit1bnN0YWJsZSBiZWNhdXNlIHNvbWUgcHJldmlvdXNseS1idWlsdCBwaXBlbGluZXMgbWF5IGNvbnRhaW4gaW5zdHJ1bWVudGVkIHNoYWRlcnMuCitUaGlzIGlzIGEgY29uZGl0aW9uIHRoYXQgaXMgbmVhcmx5IGltcG9zc2libGUgdG8gcmVjb3ZlciBmcm9tLCBzbyB0aGUgbGF5ZXIganVzdAorcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJlZnJhaW5zIGZyb20gYW55IGZ1cnRoZXIgYWxsb2NhdGlvbnMgb3IgaW5zdHJ1bWVudGF0aW9ucy4KK1RoZXJlIGlzIGEgcmVhc29uYWJsZSBjaGFuY2UgdG8gcmVjb3ZlciBmcm9tIHRoZXNlIGNvbmRpdGlvbnMsCitlc3BlY2lhbGx5IGlmIHRoZSBpbnN0cnVtZW50YXRpb24gZG9lcyBub3Qgd3JpdGUgYW55IGVycm9yIHJlY29yZHMuCisKKyMjIyBEZXNjcmlwdG9ycworCitUaGlzIGlzIHJvdWdobHkgdGhlIHNhbWUgcHJvYmxlbSBhcyB0aGUgZGV2aWNlIG1lbW9yeSBwcm9ibGVtIG1lbnRpb25lZCBhYm92ZSwKK2J1dCBmb3IgZGVzY3JpcHRvcnMuCitBbnkgZmFpbHVyZSB0byBhbGxvY2F0ZSBhIGRlc2NyaXB0b3Igc2V0IG1lYW5zIHRoYXQgdGhlIGluc3RydW1lbnRlZCBzaGFkZXIgY29kZQord29uJ3QgaGF2ZSBhIHBsYWNlIHRvIHdyaXRlIGVycm9yIHJlY29yZHMsIHJlc3VsdGluZyBpbiB1bnByZWRpY3RhYmxlIGRldmljZQorYmVoYXZpb3IuCisKKyMjIyBPdGhlciBEZXZpY2UgTGltaXRzCisKK1RoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhZGRpdGlvbmFsIHJlc291cmNlcyB0aGF0IG1heSBjb3VudCBhZ2FpbnN0IHRoZSBmb2xsb3dpbmcgbGltaXRzLAorYW5kIHBvc3NpYmx5IG90aGVyczoKKworKiBgbWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50YAorKiBgbWF4Qm91bmREZXNjcmlwdG9yU2V0c2AKKyogYG1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VCdWZmZXJzYAorKiBgbWF4UGVyU3RhZ2VSZXNvdXJjZXNgCisqIGBtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNgCisqIGBtYXhGcmFnbWVudENvbWJpbmVkT3V0cHV0UmVzb3VyY2VzYAorCitUaGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdGFrZSBzdGVwcyB0byBhdm9pZCBleGNlZWRpbmcgdGhlc2UgbGltaXRzCithbmQgZG9lcyBub3QgdXBkYXRlIHRoZSB0cmFja2luZyBwZXJmb3JtZWQgYnkgb3RoZXIgdmFsaWRhdGlvbiBmdW5jdGlvbnMuCisKKyMjIyBBIE5vdGUgQWJvdXQgdGhlIGBWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzYCBFeHRlbnNpb24KKworVGhlIHJlY2VudGx5IGludHJvZHVjZWQgYFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3NgIGV4dGVuc2lvbiBjYW4gYmUgdXNlZAordG8gaW1wbGVtZW50IEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIHdpdGhvdXQgc29tZSBvZiB0aGUgbGltaXRhdGlvbnMgZGVzY3JpYmVkIGFib3ZlLgorVGhpcyBhcHByb2FjaCB3b3VsZCB1c2UgdGhpcyBleHRlbnNpb24gdG8gb2J0YWluIGEgR1BVIGRldmljZSBwb2ludGVyIHRvIGEgc3RvcmFnZQorYnVmZmVyIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB0byB0aGUgc2hhZGVyIHZpYSBhIHNwZWNpYWxpemF0aW9uIGNvbnN0YW50LgorVGhpcyB0ZWNobmlxdWUgcmVtb3ZlcyB0aGUgbmVlZCB0byBjcmVhdGUgZGVzY3JpcHRvcnMsIHVzZSBhIGRlc2NyaXB0b3Igc2V0IHNsb3QsCittb2RpZnkgcGlwZWxpbmUgbGF5b3V0cywgZXRjLCBhbmQgd291bGQgcmVsYXggc29tZSBvZiB0aGUgbGltaXRhdGlvbnMgbGlzdGVkIGFib3ZlLgorCitUaGlzIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBpcyB1bmRlciBjb25zaWRlcmF0aW9uLgorCisjIyBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBJbnRlcm5hbCBEZXNpZ24KKworVGhpcyBzZWN0aW9uIG1heSBiZSBvZiBpbnRlcmVzdCB0byByZWFkZXJzIHdobyBhcmUgaW50ZXJlc3RlZCBvbiBob3cgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gaXMgaW1wbGVtZW50ZWQuCitJdCBpc24ndCBuZWNlc3NhcmlseSByZXF1aXJlZCBmb3IgdXNpbmcgdGhlIGZlYXR1cmUuCisKKyMjIyBHZW5lcmFsCisKK0luIGdlbmVyYWwsIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzOgorCisqIEZvciBlYWNoIGRyYXcsIGRpc3BhdGNoLCBhbmQgdHJhY2UgcmF5cyBjYWxsLCBhbGxvY2F0ZSBhIGJ1ZmZlciB3aXRoIGVub3VnaCBkZXZpY2UgbWVtb3J5IHRvIGhvbGQgYSBzaW5nbGUgZGVidWcgb3V0cHV0IHJlY29yZCB3cml0dGVuIGJ5IHRoZQorICAgIGluc3RydW1lbnRlZCBzaGFkZXIgY29kZS4KKyAgICBJZiBkZXNjcmlwdG9yIGluZGV4aW5nIGlzIGVuYWJsZWQsIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gZGVzY3JpYmUgdGhlIGRlc2NyaXB0b3IgYXJyYXlzIHNpemVzIGFuZAorICAgIHdyaXRlIHN0YXRlcyBhbmQgYWxsb2NhdGUgZGV2aWNlIG1lbW9yeSBhbmQgYSBidWZmZXIgZm9yIGlucHV0IHRvIHRoZSBpbnN0cnVtZW50ZWQgc2hhZGVyLgorICAgIFRoZSBWdWxrYW4gTWVtb3J5IEFsbG9jYXRvciBpcyB1c2VkIHRvIGhhbmRsZSB0aGlzIGVmZmljaWVudGx5LgorCisgICAgVGhlcmUgaXMgcHJvYmFibHkgbGl0dGxlIGFkdmFudGFnZSBpbiBwcm92aWRpbmcgYSBsYXJnZXIgb3V0cHV0IGJ1ZmZlciBpbiBvcmRlciB0byBvYnRhaW4gbW9yZSBkZWJ1ZyByZWNvcmRzLgorICAgIEl0IGlzIGxpa2VseSwgZXNwZWNpYWxseSBmb3IgZnJhZ21lbnQgc2hhZGVycywgdGhhdCBtdWx0aXBsZSBlcnJvcnMgb2NjdXJyaW5nIG5lYXIgZWFjaCBvdGhlciBoYXZlIHRoZSBzYW1lIHJvb3QgY2F1c2UuCisKKyAgICBBIGJsb2NrIGlzIGFsbG9jYXRlZCBvbiBhIHBlciBkcmF3IGJhc2lzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gYXNzb2NpYXRlIGEgc2hhZGVyIGRlYnVnIGVycm9yIHJlY29yZCB3aXRoCisgICAgYSBkcmF3IHdpdGhpbiBhIGNvbW1hbmQgYnVmZmVyLgorICAgIFRoaXMgaXMgZG9uZSBwYXJ0bHkgdG8gZ2l2ZSB0aGUgdXNlciBtb3JlIGluZm9ybWF0aW9uIGluIHRoZSBlcnJvciByZXBvcnQsIG5hbWVseSB0aGUgY29tbWFuZCBidWZmZXIgaGFuZGxlL25hbWUgYW5kIHRoZSBkcmF3IHdpdGhpbiB0aGF0IGNvbW1hbmQgYnVmZmVyLgorICAgIEFuIGFsdGVybmF0aXZlIGRlc2lnbiBhbGxvY2F0ZXMgdGhpcyBibG9jayBvbiBhIHBlci1kZXZpY2Ugb3IgcGVyLXF1ZXVlIGJhc2lzIGFuZCBzaG91bGQgd29yay4KKyAgICBIb3dldmVyLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaWRlbnRpZnkgdGhlIGNvbW1hbmQgYnVmZmVyIHRoYXQgY2F1c2VzIHRoZSBlcnJvciBpZiBtdWx0aXBsZSBjb21tYW5kIGJ1ZmZlcnMKKyAgICBhcmUgc3VibWl0dGVkIGF0IG9uY2UuCisqIEZvciBlYWNoIGRyYXcsIGRpc3BhdGNoLCBhbmQgdHJhY2UgcmF5cyBjYWxsLCBhbGxvY2F0ZSBhIGRlc2NyaXB0b3Igc2V0IGFuZCB1cGRhdGUgaXQgdG8gcG9pbnQgdG8gdGhlIGJsb2NrIG9mIGRldmljZSBtZW1vcnkganVzdCBhbGxvY2F0ZWQuCisgICAgSWYgZGVzY3JpcHRvciBpbmRleGluZyBpcyBlbmFibGVkLCBhbHNvIHVwZGF0ZSB0aGUgZGVzY3JpcHRvciBzZXQgdG8gcG9pbnQgdG8gdGhlIGFsbG9jYXRlZCBpbnB1dCBidWZmZXIuCisgICAgRmlsbCB0aGUgREkgaW5wdXQgYnVmZmVyIHdpdGggdGhlIHNpemUgYW5kIHdyaXRlIHN0YXRlIGluZm9ybWF0aW9uIGZvciBlYWNoIGRlc2NyaXB0b3IgYXJyYXkuCisgICAgVGhlcmUgaXMgYSBkZXNjcmlwdG9yIHNldCBtYW5hZ2VyIHRvIGhhbmRsZSB0aGlzIGVmZmljaWVudGx5LgorICAgIElmIHRoZSBidWZmZXIgZGV2aWNlIGFkZHJlc3MgZXh0ZW5zaW9uIGlzIGVuYWJsZWQsIGFsbG9jYXRlIGFuIGlucHV0IGJ1ZmZlciB0byBob2xkIHRoZSBhZGRyZXNzIC8gc2l6ZSBwYWlycyBmb3IgYWxsIGFkZHJlc3NlcyByZXRyaWV2ZWQgZnJvbSB2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQuCisgICAgQWxzbyBtYWtlIGFuIGFkZGl0aW9uYWwgY2FsbCBkb3duIHRoZSBjaGFpbiB0byBjcmVhdGUgYSBiaW5kIGRlc2NyaXB0b3Igc2V0IGNvbW1hbmQgdG8gYmluZCBvdXIgZGVzY3JpcHRvciBzZXQgYXQgdGhlIGRlc2lyZWQgaW5kZXguCisgICAgVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBiaW5kaW5nIHRoZSBkZXZpY2UgbWVtb3J5IGJsb2NrIGJlbG9uZ2luZyB0byB0aGlzIGRyYXcgc28gdGhhdCB0aGUgR1BVIGluc3RydW1lbnRhdGlvbgorICAgIHdyaXRlcyBpbnRvIHRoaXMgYnVmZmVyIGZvciB3aGVuIHRoZSBkcmF3IGlzIGV4ZWN1dGVkLgorICAgIFRoZSBlbmQgcmVzdWx0IGlzIHRoYXQgZWFjaCBkcmF3IGNhbGwgaGFzIGl0cyBvd24gYnVmZmVyIGNvbnRhaW5pbmcgR1BVIGluc3RydW1lbnRhdGlvbiBlcnJvcgorICAgIHJlY29yZHMsIGlmIGFueSBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhhdCBkcmF3LgorKiBEZXRlcm1pbmUgdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgaW5kZXggdGhhdCBpcyBldmVudHVhbGx5IHVzZWQgdG8gYmluZCB0aGUgZGVzY3JpcHRvciBzZXQganVzdCBhbGxvY2F0ZWQgYW5kIHVwZGF0ZWQuCisgICAgVXN1YWxseSwgaXQgaXMgYFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEJvdW5kRGVzY3JpcHRvclNldHNgIG1pbnVzIG9uZS4KKyAgICBGb3IgZGV2aWNlcyB0aGF0IGhhdmUgYSB2ZXJ5IGhpZ2ggb3Igbm8gbGltaXQgb24gdGhpcyBib3VuZCwgcGljayBhbiBpbmRleCB0aGF0IGlzbid0IHRvbyBoaWdoLCBidXQgYWJvdmUgbW9zdCBvdGhlciBkZXZpY2UKKyAgICBtYXhpbWEgc3VjaCBhcyAzMi4KKyogV2hlbiBjcmVhdGluZyBhIFNoYWRlck1vZHVsZSwgcGFzcyB0aGUgU1BJUi1WIGJ5dGVjb2RlIHRvIHRoZSBTUElSLVYgb3B0aW1pemVyIHRvIHBlcmZvcm0gdGhlIGluc3RydW1lbnRhdGlvbiBwYXNzLgorICAgIFBhc3MgdGhlIGRlc2lyZWQgZGVzY3JpcHRvciBzZXQgYmluZGluZyBpbmRleCB0byB0aGUgb3B0aW1pemVyIHZpYSBhIHBhcmFtZXRlciBzbyB0aGF0IHRoZSBpbnN0cnVtZW50ZWQKKyAgICBjb2RlIGtub3dzIHdoaWNoIGRlc2NyaXB0b3IgdG8gdXNlIGZvciB3cml0aW5nIGVycm9yIHJlcG9ydCBkYXRhIHRvIHRoZSBtZW1vcnkgYmxvY2suCisgICAgSWYgZGVzY3JpcHRvciBpbmRleGluZyBpcyBlbmFibGVkLCB0dXJuIG9uIE9PQiBhbmQgd3JpdGUgc3RhdGUgY2hlY2tpbmcgaW4gdGhlIGluc3RydW1lbnRhdGlvbiBwYXNzLgorICAgIElmIHRoZSBidWZmZXJfZGV2aWNlX2FkZHJlc3MgZXh0ZW5zaW9uIGlzIGVuYWJsZWQsIGFwcGx5IGEgcGFzcyB0byBhZGQgaW5zdHJ1bWVudGF0aW9uIGNoZWNraW5nIGZvciBvdXQgb2YgYm91bmRzIGJ1ZmZlciByZWZlcmVuY2VzLgorICAgIFVzZSB0aGUgaW5zdHJ1bWVudGVkIGJ5dGVjb2RlIHRvIGNyZWF0ZSB0aGUgU2hhZGVyTW9kdWxlLgorKiBGb3IgYWxsIHBpcGVsaW5lIGxheW91dHMsIGFkZCBvdXIgZGVzY3JpcHRvciBzZXQgdG8gdGhlIGxheW91dCwgYXQgdGhlIGJpbmRpbmcgaW5kZXggZGV0ZXJtaW5lZCBlYXJsaWVyLgorICAgIEZpbGwgYW55IGdhcHMgd2l0aCBlbXB0eSBkZXNjcmlwdG9yIHNldHMuCisKKyAgICBJZiB0aGUgaW5jb21pbmcgbGF5b3V0IGFscmVhZHkgaGFzIGEgZGVzY3JpcHRvciBzZXQgcGxhY2VkIGF0IG91ciBkZXNpcmVkIGluZGV4LCB0aGUgbGF5ZXIgbXVzdCBub3QgYWRkIGl0cworICAgIGRlc2NyaXB0b3Igc2V0IHRvIHRoZSBsYXlvdXQsIHJlcGxhY2luZyB0aGUgb25lIGluIHRoZSBpbmNvbWluZyBsYXlvdXQuCisgICAgSW5zdGVhZCwgdGhlIGxheWVyIGxlYXZlcyB0aGUgbGF5b3V0IGFsb25lIGFuZCBsYXRlciByZXBsYWNlcyB0aGUgaW5zdHJ1bWVudGVkIHNoYWRlcnMgd2l0aAorICAgIG5vbi1pbnN0cnVtZW50ZWQgb25lcyB3aGVuIHRoZSBwaXBlbGluZSBsYXlvdXQgaXMgbGF0ZXIgdXNlZCB0byBjcmVhdGUgYSBncmFwaGljcyBwaXBlbGluZS4KKyAgICBUaGUgbGF5ZXIgaXNzdWVzIGFuIGVycm9yIG1lc3NhZ2UgdG8gcmVwb3J0IHRoaXMgY29uZGl0aW9uLgorKiBXaGVuIGNyZWF0aW5nIGEgR3JhcGhpY3NQaXBlbGluZSwgQ29tcHV0ZVBpcGVsaW5lLCBvciBSYXlUcmFjaW5nUGlwZWxpbmUsIGNoZWNrIHRvIHNlZSBpZiB0aGUgcGlwZWxpbmUgaXMgdXNpbmcgdGhlIGRlYnVnIGJpbmRpbmcgaW5kZXguCisgICAgSWYgaXQgaXMsIHJlcGxhY2UgdGhlIGluc3RydW1lbnRlZCBzaGFkZXJzIGluIHRoZSBwaXBlbGluZSB3aXRoIG5vbi1pbnN0cnVtZW50ZWQgb25lcy4KKyogQmVmb3JlIGNhbGxpbmcgUXVldWVTdWJtaXQsIGlmIGRlc2NyaXB0b3IgaW5kZXhpbmcgaXMgZW5hYmxlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55IHVud3JpdHRlbiBkZXNjcmlwdG9ycyB0aGF0IHdlcmUgZGVjbGFyZWQKKyAgICB1cGRhdGUtYWZ0ZXItYmluZC4KKyAgICBJZiB0aGVyZSB3ZXJlLCB1cGRhdGUgdGhlIHdyaXRlIHN0YXRlIG9mIHRob3NlIGVsZW1lbnRzLgorKiBBZnRlciBjYWxsaW5nIFF1ZXVlU3VibWl0LCBwZXJmb3JtIGEgd2FpdCBvbiB0aGUgcXVldWUgdG8gYWxsb3cgdGhlIHF1ZXVlIHRvIGZpbmlzaCBleGVjdXRpbmcuCisgICAgVGhlbiBtYXAgYW5kIGV4YW1pbmUgdGhlIGRldmljZSBtZW1vcnkgYmxvY2sgZm9yIGVhY2ggZHJhdyBvciB0cmFjZSByYXkgY29tbWFuZCB0aGF0IHdhcyBzdWJtaXR0ZWQuCisgICAgSWYgYW55IGRlYnVnIHJlY29yZCBpcyBmb3VuZCwgZ2VuZXJhdGUgYSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UgZm9yIGVhY2ggcmVjb3JkIGZvdW5kLgorCitUaGUgYWJvdmUgZGVzY3JpYmVzIG9ubHkgdGhlIGhpZ2gtbGV2ZWwgZGV0YWlscyBvZiBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBvcGVyYXRpb24uCitNb3JlIGRldGFpbCBpcyBmb3VuZCBpbiB0aGUgZGlzY3Vzc2lvbiBvZiB0aGUgaW5kaXZpZHVhbCBob29rZWQgZnVuY3Rpb25zIGJlbG93LgorCisjIyMgSW5pdGlhbGl6YXRpb24KKworV2hlbiB0aGUgdmFsaWRhdGlvbiBsYXllciBsb2FkcywgaXQgZXhhbWluZXMgdGhlIHVzZXIgb3B0aW9ucyBmcm9tIGJvdGggdGhlIGxheWVyIHNldHRpbmdzIGZpbGUgYW5kIHRoZQorYFZLX0VYVF92YWxpZGF0aW9uX2ZlYXR1cmVzYCBleHRlbnNpb24uCitOb3RlIHRoYXQgaXQgYWxzbyBwcm9jZXNzZXMgdGhlIHN1YnN1bWVkIGBWS19FWFRfdmFsaWRhdGlvbl9mbGFnc2AgZXh0ZW5zaW9uIGZvciBzaW1wbGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCitGcm9tIHRoZXNlIG9wdGlvbnMsIHRoZSBsYXllciBzZXRzIGluc3RhbmNlLXNjb3BlIGZsYWdzIGluIHRoZSB2YWxpZGF0aW9uIGxheWVyIHRyYWNraW5nIGRhdGEgdG8gaW5kaWNhdGUgaWYKK0dQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgYXNzb2NpYXRlZCBvcHRpb25zLgorCisjIyMgIkNhbGxpbmcgRG93biB0aGUgQ2hhaW4iCisKK011Y2ggb2YgdGhlIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIGltcGxlbWVudGF0aW9uIGludm9sdmVzIG1ha2luZyAiYXBwbGljYXRpb24gbGV2ZWwiIFZ1bGthbiBBUEkKK2NhbGxzIG91dHNpZGUgb2YgdGhlIGFwcGxpY2F0aW9uJ3MgQVBJIHVzYWdlIHRvIGNyZWF0ZSByZXNvdXJjZXMgYW5kIHBlcmZvcm0gaXRzIHJlcXVpcmVkIG9wZXJhdGlvbnMKK2luc2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBsYXllci4KK1RoZXNlIGNhbGxzIGFyZSBub3Qgcm91dGVkIHVwIHRocm91Z2ggdGhlIHRvcCBvZiB0aGUgbG9hZGVyL2xheWVyL2RyaXZlciBjYWxsIHN0YWNrIHZpYSB0aGUgbG9hZGVyLgorSW5zdGVhZCwgdGhleSBhcmUgc2ltcGx5IGRpc3BhdGNoZWQgdmlhIHRoZSBjb250YWluaW5nIGxheWVyJ3MgZGlzcGF0Y2ggdGFibGUuCisKK1RoZXNlIGNhbGxzIHRoZXJlZm9yZSBkb24ndCBwYXNzIHRocm91Z2ggYW55IHZhbGlkYXRpb24gY2hlY2tzIHRoYXQgb2NjdXIgYmVmb3JlIHRoZSBHUFUgdmFsaWRhdGlvbiBjaGVja3MgYXJlIHJ1bi4KK1RoaXMgZG9lc24ndCBwcmVzZW50IGFueSBwYXJ0aWN1bGFyIHByb2JsZW0sIGJ1dCBpdCBkb2VzIHJhaXNlIHNvbWUgaXNzdWVzOgorCisqIFRoZSBhZGRpdGlvbmFsIEFQSSBjYWxscyBhcmUgbm90IGZ1bGx5IHZhbGlkYXRlZAorCisgIFRoaXMgaW1wbGllcyB0aGF0IHRoaXMgYWRkaXRpb25hbCBjb2RlIG1heSBuZXZlciBiZSBjaGVja2VkIGZvciB2YWxpZGF0aW9uIGVycm9ycy4KKyAgVG8gYWRkcmVzcyB0aGlzLCB0aGUgY29kZSBjYW4gImp1c3QiIGJlIHdyaXR0ZW4gY2FyZWZ1bGx5IHNvIHRoYXQgaXQgaXMgInZhbGlkIiBWdWxrYW4sCisgIHdoaWNoIGlzIGhhcmQgdG8gZG8uCisKKyAgT3IsIHRoaXMgY29kZSBjYW4gYmUgY2hlY2tlZCBieSBsb2FkaW5nIGEgS2hyb25vcyB2YWxpZGF0aW9uIGxheWVyIHdpdGgKKyAgR1BVIHZhbGlkYXRpb24gZW5hYmxlZCBvbiB0b3Agb2YgIm5vcm1hbCIgc3RhbmRhcmQgdmFsaWRhdGlvbiBpbiB0aGUKKyAgbGF5ZXIgc3RhY2ssIHdoaWNoIGVmZmVjdGl2ZWx5IHZhbGlkYXRlcyB0aGUgQVBJIHVzYWdlIG9mIHRoaXMgY29kZS4KKyAgVGhpcyBzb3J0IG9mIGNoZWNraW5nIGlzIHBlcmZvcm1lZCBieSBsYXllciBkZXZlbG9wZXJzIHRvIGNoZWNrIHRoYXQgdGhlIGFkZGl0aW9uYWwKKyAgVnVsa2FuIHVzYWdlIGlzIHZhbGlkLgorCisgIFRoaXMgdmFsaWRhdGlvbiBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5OgorCisgICogQnVpbGRpbmcgdGhlIHZhbGlkYXRpb24gbGF5ZXIgd2l0aCBhIGhhY2sgdG8gZm9yY2UgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gdG8gYmUgZW5hYmxlZCAoZG9uJ3QgdXNlIHRoZSBleHBvc2VkIG1lY2hhbmlzbXMgYmVjYXVzZSB5b3UgcHJvYmFibHkgZG9uJ3Qgd2FudCBpdCBlbmFibGVkIHR3aWNlKS4KKyAgKiBSZW5hbWUgdGhpcyBsYXllciBiaW5hcnkgdG8gc29tZXRoaW5nIGVsc2UgbGlrZSAia2hyb25vc192YWxpZGF0aW9uMiIgdG8ga2VlcCBpdCBhcGFydCBmcm9tIHRoZQorICAibm9ybWFsIiBLaHJvbm9zIHZhbGlkYXRpb24uCisgICogQ3JlYXRlIGEgbmV3IEpTT04gZmlsZSB3aXRoIHRoZSBuZXcgbGF5ZXIgbmFtZS4KKyAgKiBTZXQgdXAgdGhlIGxheWVyIHN0YWNrIHNvIHRoYXQgdGhlICJraHJvbm9zX3ZhbGlkYXRpb24yIiBsYXllciBpcyBvbiB0b3Agb2Ygb3IgYmVmb3JlIHRoZSBhY3R1YWwgS2hyb25vcworICAgIHZhbGlkYXRpb24gbGF5ZXIuCisgICogVGhlbiBydW4gdGVzdHMgYW5kIGNoZWNrIGZvciB2YWxpZGF0aW9uIGVycm9ycyBwb2ludGluZyB0byBBUEkgdXNhZ2UgaW4gdGhlICJraHJvbm9zX3ZhbGlkYXRpb24yIiBsYXllci4KKworICBUaGlzIHNob3VsZCBvbmx5IG5lZWQgdG8gYmUgZG9uZSBhZnRlciBtYWtpbmcgYW55IG1ham9yIGNoYW5nZXMgdG8gdGhlIGltcGxlbWVudGF0aW9uLgorCisgIEFub3RoZXIgYXBwcm9hY2ggaW52b2x2ZXMgY2FwdHVyaW5nIGFuIGFwcGxpY2F0aW9uIHRyYWNlIHdpdGggYHZrdHJhY2VgIGFuZCB0aGVuIHBsYXlpbmcKKyAgaXQgYmFjayB3aXRoIGB2a3JlcGxheWAuCisKKyogVGhlIGFkZGl0aW9uYWwgQVBJIGNhbGxzIGFyZSBub3Qgc3RhdGUtdHJhY2tlZAorCisgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSBkZXZpY2UgbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBkZXNjcmlwdG9yIGFsbG9jYXRpb25zIGFyZSBub3QKKyAgdHJhY2tlZCBhbmQgZG8gbm90IHNob3cgdXAgaW4gYW55IG9mIHRoZSBib29ra2VlcGluZyBwZXJmb3JtZWQgYnkgdGhlIHZhbGlkYXRpb24gbGF5ZXJzLgorICBGb3IgZXhhbXBsZSwgYW55IGRldmljZSBtZW1vcnkgYWxsb2NhdGlvbiBwZXJmb3JtZWQgYnkgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gd29uJ3QgYmUKKyAgY291bnRlZCB0b3dhcmRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0aW9ucyBhbGxvd2VkIGJ5IGEgZGV2aWNlLgorICBUaGlzIGNvdWxkIGxlYWQgdG8gYW4gZWFybHkgYWxsb2NhdGlvbiBmYWlsdXJlIHRoYXQgaXMgbm90IGFjY29tcGFuaWVkIGJ5IGEgdmFsaWRhdGlvbiBlcnJvci4KKworICBUaGlzIHNob3J0Y29taW5nIGlzIGxlZnQgYXMgbm90IGFkZHJlc3NlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaXMgYW50aWNpcGF0ZWQgdGhhdAorICBhIGxhdGVyIGltcGxlbWVudGF0aW9uIG9mIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIHVzaW5nIHRoZSBgVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzc2AKKyAgZXh0ZW5zaW9uIHdpbGwgaGF2ZSBsZXNzIG9mIGEgbmVlZCB0byBhbGxvY2F0ZSB0aGVzZQorICB0cmFja2VkIHJlc291cmNlcyBhbmQgaXQgdGhlcmVmb3JlIGJlY29tZXMgbGVzcyBvZiBhbiBpc3N1ZS4KKworIyMjIENvZGUgU3RydWN0dXJlIGFuZCBSZWxhdGlvbnNoaXAgdG8gdGhlIENvcmUgVmFsaWRhdGlvbiBMYXllcgorCitUaGUgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gY29kZSBpcyBsYXJnZWx5IGNvbnRhaW5lZCBpbiBvbmUKK1tmaWxlXShodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1WYWxpZGF0aW9uTGF5ZXJzL2Jsb2IvbWFzdGVyL2xheWVycy9ncHVfdmFsaWRhdGlvbi5jcHApLCB3aXRoICJob29rcyIgaW4KK3RoZSBvdGhlciB2YWxpZGF0aW9uIGNvZGUgdGhhdCBjYWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuCitUaGVzZSBob29rcyBpbiB0aGUgdmFsaWRhdGlvbiBjb2RlIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKKworYGBgQworaWYgKEdldEVuYWJsZXMoZGV2X2RhdGEpLT5ncHVfdmFsaWRhdGlvbikgeworICAgIEdwdVByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmUoZGV2X2RhdGEsIHBpcGVsaW5lX3N0YXRlKTsKK30KK2BgYAorCitUaGUgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gY29kZSBpcyBsaW5rZWQgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkgZm9yIHRoZSBLaHJvbm9zIGFuZCBjb3JlIHZhbGlkYXRpb24gbGF5ZXJzLgorCisjIyMjIFJldmlldyBvZiBLaHJvbm9zIFZhbGlkYXRpb24gQ29kZSBTdHJ1Y3R1cmUKKworRWFjaCBmdW5jdGlvbiBmb3IgYSBWdWxrYW4gQVBJIGNvbW1hbmQgaW50ZXJjZXB0ZWQgaW4gdGhlIEtocm9ub3MgdmFsaWRhdGlvbiBsYXllciBpcyB1c3VhbGx5IHNwbGl0IHVwCitpbnRvIHNldmVyYWwgZGVjb21wb3NlZCBmdW5jdGlvbnMgaW4gb3JkZXIgdG8gb3JnYW5pemUgdGhlIGltcGxlbWVudGF0aW9uLgorVGhlc2UgZnVuY3Rpb25zIHRha2UgdGhlIGZvcm0gb2Y6CisKKyogUHJlQ2FsbFZhbGlkYXRlJmx0O2ZvbyZndDs6IFBlcmZvcm0gdmFsaWRhdGlvbiBzdGVwcyBiZWZvcmUgY2FsbGluZyBkb3duIHRoZSBjaGFpbgorKiBQb3N0Q2FsbFZhbGlkYXRlJmx0O2ZvbyZndDs6IFBlcmZvcm0gdmFsaWRhdGlvbiBzdGVwcyBhZnRlciBjYWxsaW5nIGRvd24gdGhlIGNoYWluCisqIFByZUNhbGxSZWNvcmQmbHQ7Zm9vJmd0OzogUGVyZm9ybSBzdGF0ZSByZWNvcmRpbmcgYmVmb3JlIGNhbGxpbmcgZG93biB0aGUgY2hhaW4KKyogUG9zdENhbGxSZWNvcmQmbHQ7Zm9vJmd0OzogUGVyZm9ybSBzdGF0ZSByZWNvcmRpbmcgYWZ0ZXIgY2FsbGluZyBkb3duIHRoZSBjaGFpbgorCitUaGUgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gZnVuY3Rpb25zIGZvbGxvdyB0aGlzIHBhdHRlcm4gbm90IGJ5IGhvb2tpbmcgaW50byB0aGUgdG9wLWxldmVsIHZhbGlkYXRpb24gQVBJIHNoaW0sIGJ1dAorYnkgaG9va2luZyBvbmUgb2YgdGhlc2UgZGVjb21wb3NlZCBmdW5jdGlvbnMuCisKK1RoZSBkZXNpZ24gb2YgZWFjaCBob29rZWQgZnVuY3Rpb24gZm9sbG93czoKKworIyMjIyBHcHVQcmVDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlCisKKyogTW9kaWZ5IHRoZSBgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzYCB0byB0dXJuIG9uIHR3byBhZGRpdGlvbmFsIHBoeXNpY2FsIGRldmljZSBmZWF0dXJlczoKKyAgKiBgZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzYAorICAqIGB2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3NgCisKKyMjIyMgR3B1UG9zdENhbGxSZWNvcmRDcmVhdGVEZXZpY2UKKworKiBEZXRlcm1pbmUgYW5kIHJlY29yZCAoc2F2ZSBpbiBkZXZpY2Ugc3RhdGUpIHRoZSBkZXNpcmVkIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgaW5kZXgKKyogSW5pdGlhbGl6ZSBWdWxrYW4gTWVtb3J5IEFsbG9jYXRvcgorICAqIERldGVybWluZSBlcnJvciByZWNvcmQgYmxvY2sgc2l6ZSBiYXNlZCBvbiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBlcnJvciByZWNvcmQgYW5kIGFsaWdubWVudCBsaW1pdHMgb2YgdGhlIGRldmljZQorKiBJbml0aWFsaXplIGRlc2NyaXB0b3Igc2V0IG1hbmFnZXIKKyogTWFrZSBhIGRlc2NyaXB0b3Igc2V0IGxheW91dCB0byBkZXNjcmliZSBvdXIgZGVzY3JpcHRvciBzZXQKKyogTWFrZSBhIGRlc2NyaXB0b3Igc2V0IGxheW91dCB0byBkZXNjcmliZSBhICJkdW1teSIgZGVzY3JpcHRvciBzZXQgdGhhdCBjb250YWlucyBubyBkZXNjcmlwdG9ycworICAqIFRoaXMgaXMgdXNlZCB0byAicGFkIiBwaXBlbGluZSBsYXlvdXRzIHRvIGZpbGwgYW55IGdhcHMgYmV0d2VlbiB0aGUgdXNlZCBiaW5kIGluZGljZXMgYW5kIG91ciBiaW5kIGluZGV4CisqIFJlY29yZCB0aGVzZSBvYmplY3RzIGluIHRoZSBwZXItZGV2aWNlIHN0YXRlCisKKyMjIyMgR3B1UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXZpY2UKKworKiBEZXN0cm95IGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCBpbiBDcmVhdGVEZXZpY2UKKyogQ2xlYW4gdXAgZGVzY3JpcHRvciBzZXQgbWFuYWdlcgorKiBDbGVhbiB1cCBWdWxrYW4gTWVtb3J5IEFsbG9jYXRvciAoVk1BKQorKiBDbGVhbiB1cCBkZXZpY2Ugc3RhdGUKKworIyMjIyBHcHVBbGxvY2F0ZVZhbGlkYXRpb25SZXNvdXJjZXMKKworKiBGb3IgZWFjaCBEcmF3LCBEaXNwYXRjaCwgb3IgVHJhY2VSYXlzIGNhbGw6CisgICogR2V0IGEgZGVzY3JpcHRvciBzZXQgZnJvbSB0aGUgZGVzY3JpcHRvciBzZXQgbWFuYWdlcgorICAqIEdldCBhbiBvdXRwdXQgYnVmZmVyIGFuZCBhc3NvY2lhdGVkIG1lbW9yeSBmcm9tIFZNQQorICAqIElmIGRlc2NyaXB0b3IgaW5kZXhpbmcgaXMgZW5hYmxlZCwgZ2V0IGFuIGlucHV0IGJ1ZmZlciBhbmQgZmlsbCB3aXRoIGRlc2NyaXB0b3IgYXJyYXkgaW5mb3JtYXRpb24KKyAgKiBJZiBidWZmZXIgZGV2aWNlIGFkZHJlc3MgaXMgZW5hYmxlZCwgZ2V0IGFuIGlucHV0IGJ1ZmZlciBhbmQgZmlsbCB3aXRoIGFkZHJlc3MgLyBzaXplIHBhaXJzIGZvciBhZGRyZXNzZXMgcmV0cmlldmVkIGZyb20gdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUCisgICogVXBkYXRlICh3cml0ZSkgdGhlIGRlc2NyaXB0b3Igc2V0IHdpdGggdGhlIG1lbW9yeSBpbmZvCisgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBsYXlvdXQgZm9yIHRoZSBwaXBlbGluZSBqdXN0IGJvdW5kIGlzIHVzaW5nIG91ciBzZWxlY3RlZCBiaW5kIGluZGV4CisgICogSWYgbm8gY29uZmxpY3QsIGFkZCBhbiBhZGRpdGlvbmFsIGNvbW1hbmQgdG8gdGhlIGNvbW1hbmQgYnVmZmVyIHRvIGJpbmQgb3VyIGRlc2NyaXB0b3Igc2V0IGF0IG91ciBzZWxlY3RlZCBpbmRleAorKiBSZWNvcmQgdGhlIGFib3ZlIG9iamVjdHMgaW4gdGhlIHBlci1DQiBzdGF0ZTsKK05vdGUgdGhhdCB0aGUgRHJhdyBhbmQgRGlzcGF0Y2ggY2FsbHMgaW5jbHVkZSB2a0NtZERyYXcsIHZrQ21kRHJhd0luZGV4ZWQsIHZrQ21kRHJhd0luZGlyZWN0LCB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QsIHZrQ21kRGlzcGF0Y2gsIHZrQ21kRGlzcGF0Y2hJbmRpcmVjdCwgYW5kIHZrQ21kVHJhY2VSYXlzTlYuCisKKyMjIyMgR3B1UHJlQ2FsbFJlY29yZEZyZWVDb21tYW5kQnVmZmVycworCisqIEZvciBlYWNoIGNvbW1hbmQgYnVmZmVyOgorICAqIERlc3Ryb3kgdGhlIFZNQSBidWZmZXIocyksIHJlbGVhc2luZyB0aGUgbWVtb3J5CisgICogR2l2ZSB0aGUgZGVzY3JpcHRvciBzZXRzIGJhY2sgdG8gdGhlIGRlc2NyaXB0b3Igc2V0IG1hbmFnZXIKKyAgKiBDbGVhbiB1cCBDQiBzdGF0ZQorCisjIyMjIEdwdU92ZXJyaWRlRGlzcGF0Y2hDcmVhdGVTaGFkZXJNb2R1bGUKKworVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBQcmVDYWxsUmVjb3JkQ3JlYXRlU2hhZGVyTW9kdWxlLgorVGhpcyByb3V0aW5lIHNldHMgdXAgdG8gY2FsbCB0aGUgU1BJUi1WIG9wdGltaXplciB0byBydW4gdGhlICJCaW5kbGVzc0NoZWNrUGFzcyIsIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgU1BJUi1WIHdpdGggdGhlIGluc3RydW1lbnRlZCBTUElSLVYKK3doaWNoIGlzIHRoZW4gdXNlZCBpbiB0aGUgY2FsbCBkb3duIHRoZSBjaGFpbiB0byBDcmVhdGVTaGFkZXJNb2R1bGUuCisKK1RoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgInVuaXF1ZSBzaGFkZXIgSUQiIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBTUElSLVYgb3B0aW1pemVyLAord2hpY2ggdGhlIGluc3RydW1lbnRlZCBjb2RlIHB1dHMgaW4gdGhlIGRlYnVnIGVycm9yIHJlY29yZCB0byBpZGVudGlmeSB0aGUgc2hhZGVyLgorVGhpcyBJRCBpcyByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSByZWNvcmRlZCBpbiB0aGUgc2hhZGVyIG1vZHVsZSBhdCBQb3N0Q2FsbFJlY29yZCB0aW1lLgorSXQgd291bGQgaGF2ZSBiZWVuIGNvbnZlbmllbnQgdG8gdXNlIHRoZSBzaGFkZXIgbW9kdWxlIGhhbmRsZSByZXR1cm5lZCBmcm9tIHRoZSBkcml2ZXIgdG8gdXNlIGFzIHRoaXMgc2hhZGVyIElELgorQnV0IHRoZSBzaGFkZXIgbmVlZHMgdG8gYmUgaW5zdHJ1bWVudGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgc2hhZGVyIG1vZHVsZSBhbmQgdGhlcmVmb3JlIHRoZSBoYW5kbGUgaXMgbm90IGF2YWlsYWJsZSB0byB1c2UKK2FzIHRoaXMgSUQgdG8gcGFzcyB0byB0aGUgb3B0aW1pemVyLgorVGhlcmVmb3JlLCB0aGUgbGF5ZXIga2VlcHMgYSAiY291bnRlciIgaW4gcGVyLWRldmljZSBzdGF0ZSB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHNoYWRlciBpcyBpbnN0cnVtZW50ZWQKK3RvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuCitUaGlzIHVuaXF1ZSBJRCBpcyBnaXZlbiB0byB0aGUgU1BJUi1WIG9wdGltaXplciBhbmQgaXMgc3RvcmVkIGluIHRoZSBzaGFkZXIgbW9kdWxlIHN0YXRlIHRyYWNrZXIgYWZ0ZXIgdGhlIHNoYWRlciBtb2R1bGUgaXMgY3JlYXRlZCwgd2hpY2ggY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIElEIGFuZCB0aGUgc2hhZGVyIG1vZHVsZS4KKworVGhlIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGluZyB0aGUgU1BJUi1WIGFsc28gaW5jbHVkZXMgcGFzc2luZyB0aGUgc2VsZWN0ZWQgZGVzY3JpcHRvciBzZXQgYmluZGluZyBpbmRleAordG8gdGhlIFNQSVItViBvcHRpbWl6ZXIgd2hpY2ggdGhlIGluc3RydW1lbnRlZAorY29kZSB1c2VzIHRvIGxvY2F0ZSB0aGUgbWVtb3J5IGJsb2NrIHVzZWQgdG8gd3JpdGUgdGhlIGRlYnVnIGVycm9yIHJlY29yZC4KK0FuIGluc3RydW1lbnRlZCBzaGFkZXIgaXMgbm93ICJoYXJkLXdpcmVkIiB0byB3cml0ZSBlcnJvciByZWNvcmRzIHZpYSB0aGUgZGVzY3JpcHRvciBzZXQgYXQgdGhhdCBiaW5kaW5nCitpZiBpdCBkZXRlY3RzIGFuIGVycm9yLgorVGhpcyBpbXBsaWVzIHRoYXQgdGhlIGluc3RydW1lbnRlZCBzaGFkZXJzIHNob3VsZCBvbmx5IGJlIGFsbG93ZWQgdG8gcnVuIHdoZW4gdGhlIGNvcnJlY3QgYmluZGluZ3MgYXJlIGluIHBsYWNlLgorCitUaGUgb3JpZ2luYWwgU1BJUi1WIGJ5dGVjb2RlIGlzIGxlZnQgc3RvcmVkIGluIHRoZSBzaGFkZXIgbW9kdWxlIHRyYWNraW5nIGRhdGEuCitUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBsYXllciBtYXkgbmVlZCB0byByZXBsYWNlIHRoZSBpbnN0cnVtZW50ZWQgc2hhZGVyIHdpdGggdGhlIG9yaWdpbmFsIHNoYWRlciBpZiwgZm9yIGV4YW1wbGUsCit0aGVyZSBpcyBhIGJpbmRpbmcgaW5kZXggY29uZmxpY3QuCitUaGUgYXBwbGljYXRpb24gY2Fubm90IGRlc3Ryb3kgdGhlIHNoYWRlciBtb2R1bGUgdW50aWwgaXQgaGFzIHVzZWQgdGhlIHNoYWRlciBtb2R1bGUgdG8gY3JlYXRlIHRoZSBwaXBlbGluZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBvcmlnaW5hbCBTUElSLVYgYnl0ZWNvZGUgaXMgYXZhaWxhYmxlIGlmIHdlIG5lZWQgaXQgdG8gcmVwbGFjZSB0aGUgaW5zdHJ1bWVudGVkIHNoYWRlci4KKworIyMjIyBHcHVPdmVycmlkZURpc3BhdGNoQ3JlYXRlUGlwZWxpbmVMYXlvdXQKKworVGhpcyBpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhyb3VnaCBQcmVDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVMYXlvdXQuCisKKyogQ2hlY2sgZm9yIGEgZGVzY3JpcHRvciBzZXQgYmluZGluZyBpbmRleCBjb25mbGljdC4KKyAgKiBJZiB0aGVyZSBpcyBvbmUsIGlzc3VlIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGxlYXZlIHRoZSBwaXBlbGluZSBsYXlvdXQgdW5tb2RpZmllZAorICAqIElmIG5vIGNvbmZsaWN0LCBmb3IgZWFjaCBwaXBlbGluZSBsYXlvdXQ6CisgICAgKiBDcmVhdGUgYSBuZXcgcGlwZWxpbmUgbGF5b3V0CisgICAgKiBDb3B5IHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGludG8gdGhlIG5ldyBwaXBlbGluZSBsYXlvdXQKKyAgICAqIFBhZCB0aGUgbmV3IHBpcGVsaW5lIGxheW91dCB3aXRoIGR1bW15IGRlc2NyaXB0b3Igc2V0IGxheW91dHMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGxhc3Qgb25lCisgICAgKiBBZGQgb3VyIGRlc2NyaXB0b3Igc2V0IGxheW91dCBhcyB0aGUgbGFzdCBvbmUgaW4gdGhlIG5ldyBwaXBlbGluZSBsYXlvdXQKKyogQ3JlYXRlIHRoZSBwaXBlbGluZSBsYXlvdXRzIGJ5IGNhbGxpbmcgZG93biB0aGUgY2hhaW4gd2l0aCB0aGUgb3JpZ2luYWwgb3IgbW9kaWZpZWQgY3JlYXRlIGluZm8KKworIyMjIyBHcHVQcmVDYWxsUXVldWVTdWJtaXQKKworKiBGb3IgZWFjaCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIgaW4gdGhlIHN1Ym1pc3Npb246CisgICogQ2FsbCBoZWxwZXIgZnVuY3Rpb24gdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgdXBkYXRlIGFmdGVyIGJpbmQgZGVzY3JpcHRvcnMgd2hvc2Ugd3JpdGUgc3RhdGUgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZAorICAgIGFuZCBpZiBzbywgbWFwIHRoZSBpbnB1dCBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgc3RhdGUuCisKKyMjIyMgR3B1UG9zdENhbGxRdWV1ZVN1Ym1pdAorCisqIFN1Ym1pdCBhIGNvbW1hbmQgYnVmZmVyIGNvbnRhaW5pbmcgYSBtZW1vcnkgYmFycmllciB0byBtYWtlIEdQVSB3cml0ZXMgYXZhaWxhYmxlIHRvIHRoZSBob3N0IGRvbWFpbi4KKyogQ2FsbCBRdWV1ZVdhaXRJZGxlLgorKiBGb3IgZWFjaCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIgaW4gdGhlIHN1Ym1pc3Npb246CisgICogQ2FsbCBhIGhlbHBlciBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBpbnN0cnVtZW50YXRpb24gZGVidWcgYnVmZmVycyAoZGVzY3JpYmVkIGxhdGVyKQorCisjIyMjIEdwdVByZUNhbGxWYWxpZGF0ZUNtZFdhaXRFdmVudHMKKworKiBSZXBvcnQgYW4gZXJyb3IgYWJvdXQgYSBwb3NzaWJsZSBkZWFkbG9jayBpZiBDbWRXYWl0RXZlbnRzIGlzIHJlY29yZGVkIHdpdGggVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQgc2V0LgorCisjIyMjIEdwdVByZUNhbGxSZWNvcmRDcmVhdGVHcmFwaGljc1BpcGVsaW5lcworCisqIEV4YW1pbmUgdGhlIHBpcGVsaW5lcyB0byBzZWUgaWYgYW55IHVzZSB0aGUgZGVidWcgZGVzY3JpcHRvciBzZXQgYmluZGluZyBpbmRleAorKiBGb3IgdGhvc2UgdGhhdCBkbzoKKyAgKiBDcmVhdGUgbm9uLWluc3RydW1lbnRlZCBzaGFkZXIgbW9kdWxlcyBmcm9tIHRoZSBzYXZlZCBvcmlnaW5hbCBTUElSLVYKKyAgKiBNb2RpZnkgdGhlIENyZWF0ZUluZm8gZGF0YSB0byB1c2UgdGhlc2Ugbm9uLWluc3RydW1lbnRlZCBzaGFkZXJzLgorICAgICogVGhpcyBwcmV2ZW50cyBpbnN0cnVtZW50ZWQgc2hhZGVycyBmcm9tIHVzaW5nIHRoZSBhcHBsaWNhdGlvbidzIGRlc2NyaXB0b3Igc2V0LgorCisjIyMjIEdwdVBvc3RDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMKKworKiBGb3IgZXZlcnkgc2hhZGVyIGluIHRoZSBwaXBlbGluZToKKyAgKiBEZXN0cm95IHRoZSBzaGFkZXIgbW9kdWxlIGNyZWF0ZWQgaW4gR3B1UHJlQ2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLCBpZiBhbnkKKyAgICAqIFRoZXNlIGFyZSBmb3VuZCBpbiB0aGUgQ3JlYXRlSW5mbyB1c2VkIHRvIGNyZWF0ZSB0aGUgcGlwZWxpbmUgYW5kIG5vdCBpbiB0aGUgc2hhZGVyX21vZHVsZQorICAqIENyZWF0ZSBhIHNoYWRlciB0cmFja2luZyByZWNvcmQgdGhhdCBzYXZlczoKKyAgICAqIHNoYWRlciBtb2R1bGUgaGFuZGxlCisgICAgKiB1bmlxdWUgc2hhZGVyIGlkCisgICAgKiBncmFwaGljcyBwaXBlbGluZSBoYW5kbGUKKyAgICAqIHNoYWRlciBieXRlY29kZSBpZiBpdCBjb250YWlucyBkZWJ1ZyBpbmZvCisKK1RoaXMgdHJhY2tlciBpcyB1c2VkIHRvIGF0dGFjaCB0aGUgc2hhZGVyIGJ5dGVjb2RlIHRvIHRoZSBzaGFkZXIgaW4gY2FzZSBpdCBpcyBuZWVkZWQKK2xhdGVyIHRvIGdldCB0aGUgc2hhZGVyIHNvdXJjZSBjb2RlIGRlYnVnIGluZm8uCisKK1RoZSBjdXJyZW50IHNoYWRlciBtb2R1bGUgdHJhY2tlciBpbiB0aGUgdmFsaWRhdGlvbiBjb2RlIHN0b3JlcyB0aGUgYnl0ZWNvZGUsCitidXQgdGhpcyB0cmFja2VyIGhhcyB0aGUgc2FtZSBsaWZlIGN5Y2xlIGFzIHRoZSBzaGFkZXIgbW9kdWxlIGl0c2VsZi4KK0l0IGlzIHBvc3NpYmxlIGZvciB0aGUgYXBwbGljYXRpb24gdG8gZGVzdHJveSB0aGUgc2hhZGVyIG1vZHVsZSBhZnRlcgorY3JlYXRpbmcgZ3JhcGhpY3MgcGlwZWxpbmUgYW5kIGJlZm9yZSBzdWJtaXR0aW5nIHdvcmsgdGhhdCB1c2VzIHRoZSBzaGFkZXIsCittYWtpbmcgdGhlIHNoYWRlciBieXRlY29kZSB1bmF2YWlsYWJsZSBpZiBuZWVkZWQgZm9yIGxhdGVyIGFuYWx5c2lzLgorVGhlcmVmb3JlLCB0aGUgYnl0ZWNvZGUgbXVzdCBiZSBzYXZlZCBhdCB0aGlzIG9wcG9ydHVuaXR5LgorCitUaGlzIHRyYWNrZXIgZXhpc3RzIGFzIGxvbmcgYXMgdGhlIGdyYXBoaWNzIHBpcGVsaW5lIGV4aXN0cywKK3NvIHRoZSBncmFwaGljcyBwaXBlbGluZSBoYW5kbGUgaXMgYWxzbyBzdG9yZWQgaW4gdGhpcyB0cmFja2VyIHNvIHRoYXQgaXQgY2FuCitiZSBsb29rZWQgdXAgd2hlbiB0aGUgZ3JhcGhpY3MgcGlwZWxpbmUgaXMgZGVzdHJveWVkLgorQXQgdGhhdCBwb2ludCwgaXQgaXMgc2FmZSB0byBmcmVlIHRoZSBieXRlY29kZSBzaW5jZSB0aGUgcGlwZWxpbmUgaXMgbmV2ZXIgdXNlZCBhZ2Fpbi4KKworIyMjIyBHcHVQcmVDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lCisKKyogRmluZCB0aGUgc2hhZGVyIHRyYWNrZXIocykgd2l0aCB0aGUgZ3JhcGhpY3MgcGlwZWxpbmUgaGFuZGxlIGFuZCBmcmVlIHRoZSB0cmFja2VyLCBhbG9uZyB3aXRoIGFueSBieXRlY29kZSBpdCBoYXMgc3RvcmVkIGluIGl0LgorCisjIyMgU2hhZGVyIEluc3RydW1lbnRhdGlvbiBTY29wZQorCitUaGUgc2hhZGVyIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIHBlcmZvcm1lZCBieSB0aGUgU1BJUi1WIG9wdGltaXplciBhcHBsaWVzIGRlc2NyaXB0b3IgaW5kZXggYm91bmRzIGNoZWNraW5nCit0byBkZXNjcmlwdG9ycyBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOgorCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRQorICAgIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSCisgICAgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMKKyAgICBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQworCitJbnN0cnVtZW50YXRpb24gaXMgYXBwbGllZCB0byB0aGUgZm9sbG93aW5nIFNQSVItViBvcGVyYXRpb25zOgorCisgICAgT3BJbWFnZVNhbXBsZUltcGxpY2l0TG9kCisgICAgT3BJbWFnZVNhbXBsZUV4cGxpY2l0TG9kCisgICAgT3BJbWFnZVNhbXBsZURyZWZJbXBsaWNpdExvZAorICAgIE9wSW1hZ2VTYW1wbGVEcmVmRXhwbGljaXRMb2QKKyAgICBPcEltYWdlU2FtcGxlUHJvakltcGxpY2l0TG9kCisgICAgT3BJbWFnZVNhbXBsZVByb2pFeHBsaWNpdExvZAorICAgIE9wSW1hZ2VTYW1wbGVQcm9qRHJlZkltcGxpY2l0TG9kCisgICAgT3BJbWFnZVNhbXBsZVByb2pEcmVmRXhwbGljaXRMb2QKKyAgICBPcEltYWdlR2F0aGVyCisgICAgT3BJbWFnZURyZWZHYXRoZXIKKyAgICBPcEltYWdlUXVlcnlMb2QKKyAgICBPcEltYWdlU3BhcnNlU2FtcGxlSW1wbGljaXRMb2QKKyAgICBPcEltYWdlU3BhcnNlU2FtcGxlRXhwbGljaXRMb2QKKyAgICBPcEltYWdlU3BhcnNlU2FtcGxlRHJlZkltcGxpY2l0TG9kCisgICAgT3BJbWFnZVNwYXJzZVNhbXBsZURyZWZFeHBsaWNpdExvZAorICAgIE9wSW1hZ2VTcGFyc2VTYW1wbGVQcm9qSW1wbGljaXRMb2QKKyAgICBPcEltYWdlU3BhcnNlU2FtcGxlUHJvakV4cGxpY2l0TG9kCisgICAgT3BJbWFnZVNwYXJzZVNhbXBsZVByb2pEcmVmSW1wbGljaXRMb2QKKyAgICBPcEltYWdlU3BhcnNlU2FtcGxlUHJvakRyZWZFeHBsaWNpdExvZAorICAgIE9wSW1hZ2VTcGFyc2VHYXRoZXIKKyAgICBPcEltYWdlU3BhcnNlRHJlZkdhdGhlcgorICAgIE9wSW1hZ2VGZXRjaAorICAgIE9wSW1hZ2VSZWFkCisgICAgT3BJbWFnZVF1ZXJ5Rm9ybWF0CisgICAgT3BJbWFnZVF1ZXJ5T3JkZXIKKyAgICBPcEltYWdlUXVlcnlTaXplTG9kCisgICAgT3BJbWFnZVF1ZXJ5U2l6ZQorICAgIE9wSW1hZ2VRdWVyeUxldmVscworICAgIE9wSW1hZ2VRdWVyeVNhbXBsZXMKKyAgICBPcEltYWdlU3BhcnNlRmV0Y2gKKyAgICBPcEltYWdlU3BhcnNlUmVhZAorICAgIE9wSW1hZ2VXcml0ZQorCitBbHNvLCBPcExvYWQgYW5kIE9wU3RvcmUgd2l0aCBhbiBBY2Nlc3NDaGFpbiBpbnRvIGEgYmFzZSBvZiBPcFZhcmlhYmxlIHdpdGgKK2VpdGhlciBVbmlmb3JtIG9yIFN0b3JhZ2VCdWZmZXIgc3RvcmFnZSBjbGFzcyBhbmQgYSB0eXBlIHdoaWNoIGlzIGVpdGhlciBhCitzdHJ1Y3QgZGVjb3JhdGVkIHdpdGggQmxvY2ssIG9yIGEgcnVudGltZSBvciBzdGF0aWNhbGx5LXNpemVkIGFycmF5IG9mIHN1Y2gKK2Egc3RydWN0LgorCisKKyMjIyBTaGFkZXIgSW5zdHJ1bWVudGF0aW9uIEVycm9yIFJlY29yZCBGb3JtYXQKKworVGhlIGluc3RydW1lbnRlZCBzaGFkZXIgY29kZSBnZW5lcmF0ZXMgImVycm9yIHJlY29yZHMiIGluIGEgc3BlY2lmaWMgZm9ybWF0LgorCitUaGlzIGRlc2NyaXB0aW9uIGluY2x1ZGVzIHRoZSBzdXBwb3J0IGZvciBmdXR1cmUgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gZmVhdHVyZXMKK3N1Y2ggYXMgY2hlY2tpbmcgZm9yIHVuaW5pdGlhbGl6ZWQgZGVzY3JpcHRvcnMgaW4gdGhlIHBhcnRpYWxseS1ib3VuZCBzY2VuYXJpby4KK1RoZXNlIGl0ZW1zIGFyZSBub3QgdXNlZCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmb3IgZGVzY3JpcHRvciBhcnJheQorYm91bmRzIGNoZWNraW5nLCBidXQgYXJlIHByb3ZpZGVkIGhlcmUgdG8gY29tcGxldGUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorZXJyb3IgcmVjb3JkIGZvcm1hdC4KKworVGhlIGZvcm1hdCBvZiB0aGlzIGJ1ZmZlciBpcyBhcyBmb2xsb3dzOgorCitgYGBDCitzdHJ1Y3QgRGVidWdPdXRwdXRCdWZmZXJfdAoreworICAgdWludCBEYXRhV3JpdHRlbkxlbmd0aDsKKyAgIHVpbnQgRGF0YVtdOworfQorYGBgCisKK2BEYXRhV3JpdHRlbkxlbmd0aGAgaXMgdGhlIG51bWJlciBvZiB1aW50MzJfdCB3b3JkcyB0aGF0IGhhdmUgYmVlbiBhdHRlbXB0ZWQgdG8gYmUgd3JpdHRlbi4KK0l0IHNob3VsZCBiZSBpbml0aWFsaXplZCB0byAwLgorCitUaGUgYERhdGFgIGFycmF5IGlzIHRoZSB1aW50MzJfdCB3b3JkcyB3cml0dGVuIGJ5IHRoZSBzaGFkZXJzIG9mIHRoZSBwaXBlbGluZSB0byByZWNvcmQgYmluZGxlc3MgdmFsaWRhdGlvbiBlcnJvcnMuCitBbGwgZWxlbWVudHMgb2YgYERhdGFgIHNob3VsZCBiZSBpbml0aWFsaXplZCB0byAwLgorTm90ZSB0aGF0IHRoZSBgRGF0YWAgYXJyYXkgaGFzIHJ1bnRpbWUgbGVuZ3RoLgorVGhlIHNoYWRlciBxdWVyaWVzIHRoZSBsZW5ndGggb2YgdGhlIGBEYXRhYCBhcnJheSB0byBtYWtlIHN1cmUgdGhhdCBpdCBkb2VzIG5vdCB3cml0ZSBwYXN0IHRoZSBlbmQgb2YgYERhdGFgLgorVGhlIHNoYWRlciBvbmx5IHdyaXRlcyBjb21wbGV0ZSByZWNvcmRzLgorVGhlIGxheWVyIHVzZXMgdGhlIGxlbmd0aCBvZiBgRGF0YWAgdG8gY29udHJvbCB0aGUgbnVtYmVyIG9mIHJlY29yZHMgd3JpdHRlbiBieSB0aGUgc2hhZGVycy4KKworVGhlIGBEYXRhV3JpdHRlbkxlbmd0aGAgaXMgYXRvbWljYWxseSB1cGRhdGVkIGJ5IHRoZSBzaGFkZXJzIHNvIHRoYXQgc2hhZGVycyBkbyBub3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXJzJyBkYXRhLgorVGhlIHNoYWRlciB0YWtlcyB0aGUgdmFsdWUgaXQgZ2V0cyBmcm9tIHRoZSBhdG9taWMgdXBkYXRlLgorSWYgdGhlIHZhbHVlIHBsdXMgdGhlIHJlY29yZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgYERhdGFgLCBpdCBkb2VzIG5vdCB3cml0ZSB0aGUgcmVjb3JkLgorCitHaXZlbiB0aGlzIHByb3RvY29sLCB0aGUgdmFsdWUgaW4gYERhdGFXcml0dGVuTGVuZ3RoYCBpcyBub3QgdmVyeSBtZWFuaW5nZnVsIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIGBEYXRhYC4KK0hvd2V2ZXIsIHRoZSBmb3JtYXQgb2YgdGhlIHdyaXR0ZW4gcmVjb3JkcyBwbHVzIHRoZSBmYWN0IHRoYXQgYERhdGFgIGlzIGluaXRpYWxpemVkIHRvIDAgc2hvdWxkIGJlIGVub3VnaCB0byBkZXRlcm1pbmUKK3RoZSByZWNvcmRzIHRoYXQgd2VyZSB3cml0dGVuLgorCisjIyMgUmVjb3JkIEZvcm1hdAorCitUaGUgZm9ybWF0IG9mIGFuIG91dHB1dCByZWNvcmQgaXMgdGhlIGZvbGxvd2luZzoKKworICAgIFdvcmQgMDogUmVjb3JkIHNpemUKKyAgICBXb3JkIDE6IFNoYWRlciBJRAorICAgIFdvcmQgMjogSW5zdHJ1Y3Rpb24gSW5kZXgKKyAgICBXb3JkIDM6IFN0YWdlCisgICAgPFN0YWdlLVNwZWNpZmljIFdvcmRzPgorICAgIDxWYWxpZGF0aW9uLVNwZWNpZmljIFdvcmRzPgorCitUaGUgUmVjb3JkIFNpemUgaXMgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGlzIHJlY29yZCwgaW5jbHVkaW5nIHRoZSB0aGUgUmVjb3JkIFNpemUuCisKK1RoZSBTaGFkZXIgSUQgaXMgYSBoYW5kbGUgdGhhdCB3YXMgcHJvdmlkZWQgYnkgdGhlIGxheWVyIHdoZW4gdGhlIHNoYWRlciB3YXMgaW5zdHJ1bWVudGVkLgorCitUaGUgSW5zdHJ1Y3Rpb24gSW5kZXggaXMgdGhlIGluc3RydWN0aW9uIHdpdGhpbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gYXQgd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgorRm9yIGJpbmRsZXNzLCB0aGlzIHdpbGwgYmUgdGhlIGluc3RydWN0aW9uIHdoaWNoIGNvbnN1bWVzIHRoZSBkZXNjcmlwdG9yIGluIHF1ZXN0aW9uLAorb3IgdGhlIGluc3RydWN0aW9uIHRoYXQgY29uc3VtZXMgdGhlIE9wU2FtcGxlZEltYWdlIHRoYXQgY29uc3VtZXMgdGhlIGRlc2NyaXB0b3IuCisKK1RoZSBTdGFnZSBpcyB0aGUgaW50ZWdlciB2YWx1ZSB1c2VkIGluIFNQSVItViBmb3IgZWFjaCBvZiB0aGUgRXhlY3V0aW9uIE1vZGVsczoKKworfCBTdGFnZSAgICAgICAgIHwgVmFsdWUgfAorfC0tLS0tLS0tLS0tLS0tLXw6LS0tLS06fAorfFZlcnRleCAgICAgICAgIHwwICAgICAgfAorfFRlc3NDdHJsICAgICAgIHwxICAgICAgfAorfFRlc3NFdmFsICAgICAgIHwyICAgICAgfAorfEdlb21ldHJ5ICAgICAgIHwzICAgICAgfAorfEZyYWdtZW50ICAgICAgIHw0ICAgICAgfAorfENvbXB1dGUgICAgICAgIHw1ICAgICAgfAorfFJheUdlbmVyYXRpb25OVnw1MzEzICAgfAorfEludGVyc2VjdGlvbk5WIHw1MzE0ICAgfAorfEFueUhpdE5WICAgICAgIHw1MzE1ICAgfAorfENsb3Nlc3RIaXROViAgIHw1MzE2ICAgfAorfE1pc3NOViAgICAgICAgIHw1MzE3ICAgfAorfENhbGxhYmxlTlYgICAgIHw1MzE4ICAgfAorCisjIyMgU3RhZ2UgU3BlY2lmaWMgV29yZHMKKworVGhlc2UgYXJlIHdvcmRzIHRoYXQgaWRlbnRpZnkgd2hpY2ggImluc3RhbmNlIiBvZiB0aGUgc2hhZGVyIHRoZSB2YWxpZGF0aW9uIGVycm9yIG9jY3VycmVkIGluLgorSGVyZSBhcmUgd29yZHMgZm9yIGVhY2ggc3RhZ2U6CisKK3wgU3RhZ2UgICAgICAgICB8IFdvcmQgMCAgICAgICAgICAgfCBXb3JkIDEgICAgICAgIHwgV29yZCAyICAgICAgIHwKK3wtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18Cit8VmVydGV4ICAgICAgICAgfFZlcnRleElEICAgICAgICAgIHxJbnN0YW5jZUlEICAgICB8IHVudXNlZCAgICAgICAgfAorfFRlc3NDbnRybCAgICAgIHxJbnZvY2F0aW9uSUQgICAgICB8UHJpbWl0aXZlSUQgICAgfCB1bnVzZWQgICAgICAgIHwKK3xUZXNzRXZhbCAgICAgICB8UHJpbWl0aXZlSUQgICAgICAgfFRlc3NDb29yZC51ICAgIHwgVGVzc0Nvb3JkLnYgICB8Cit8R2VvbWV0cnkgICAgICAgfFByaW1pdGl2ZUlEICAgICAgIHxJbnZvY2F0aW9uSUQgICB8IHVudXNlZCAgICAgICAgfAorfEZyYWdtZW50ICAgICAgIHxGcmFnQ29vcmQueCAgICAgICB8RnJhZ0Nvb3JkLnkgICAgfCB1bnVzZWQgICAgICAgIHwKK3xDb21wdXRlICAgICAgICB8R2xvYmFsSW52b2NJRC54ICAgfEdsb2JhbEludm9jSUQueXxHbG9iYWxJbnZvY0lELnp8Cit8UmF5R2VuZXJhdGlvbk5WfExhdW5jaElkTlYueCAgICAgIHxMYXVuY2hJZE5WLnkgICB8TGF1bmNoSWROVi56ICAgfAorfEludGVyc2VjdGlvbk5WIHxMYXVuY2hJZE5WLnggICAgICB8TGF1bmNoSWROVi55ICAgfExhdW5jaElkTlYueiAgIHwKK3xBbnlIaXROViAgICAgICB8TGF1bmNoSWROVi54ICAgICAgfExhdW5jaElkTlYueSAgIHxMYXVuY2hJZE5WLnogICB8Cit8Q2xvc2VzdEhpdE5WICAgfExhdW5jaElkTlYueCAgICAgIHxMYXVuY2hJZE5WLnkgICB8TGF1bmNoSWROVi56ICAgfAorfE1pc3NOViAgICAgICAgIHxMYXVuY2hJZE5WLnggICAgICB8TGF1bmNoSWROVi55ICAgfExhdW5jaElkTlYueiAgIHwKK3xDYWxsYWJsZU5WICAgICB8TGF1bmNoSWROVi54ICAgICAgfExhdW5jaElkTlYueSAgIHxMYXVuY2hJZE5WLnogICB8CisKKyJ1bnVzZWQiIG1lYW5zIG5vdCByZWxldmFudCwgYnV0IHN0aWxsIHByZXNlbnQuCisKKyMjIyBWYWxpZGF0aW9uLVNwZWNpZmljIFdvcmRzCisKK1RoZXNlIGFyZSB3b3JkcyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgdmFsaWRhdGlvbiBiZWluZyBkb25lLgorRm9yIGJpbmRsZXNzIHZhbGlkYXRpb24sIHRoZXkgYXJlIHZhcmlhYmxlLgorCitUaGUgZmlyc3Qgd29yZCBpcyB0aGUgRXJyb3IgQ29kZS4KKworRm9yIHRoZSAqT3V0T2ZCb3VuZHMgZXJyb3JzLCB0d28gd29yZHMgd2lsbCBmb2xsb3c6IFdvcmQwOkRlc2NyaXB0b3JJbmRleCwgV29yZDE6RGVzY3JpcHRvckFycmF5TGVuZ3RoCisKK0ZvciB0aGUgKlVuaW5pdGlhbGl6ZWQgZXJyb3JzLCBvbmUgd29yZCB3aWxsIGZvbGxvdzogV29yZDA6RGVzY3JpcHRvckluZGV4CisKK3wgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgIHwgV29yZCAwICAgICAgICAgICAgICB8IFdvcmQgMSAgICAgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfEluZGV4T3V0T2ZCb3VuZHMgICAgICAgICAgICAgfERlc2NyaXB0b3IgSW5kZXggICAgIHxEZXNjcmlwdG9yIEFycmF5IExlbmd0aHwKK3xEZXNjcmlwdG9yVW5pbml0aWFsaXplZCAgICAgIHxEZXNjcmlwdG9yIEluZGV4ICAgICB8dW51c2VkICAgICAgICAgICAgICAgICB8Cit8QnVmZmVyRGV2aWNlQWRkck9PQiAgICAgICAgICB8T3V0IG9mIEJvdW5kcyBBZGRyZXNzfHVudXNlZCAgICAgICAgICAgICAgICAgfAorCitTbyB0aGUgd29yZHMgd3JpdHRlbiBmb3IgYW4gaW1hZ2UgZGVzY3JpcHRvciBib3VuZHMgZXJyb3IgaW4gYSBmcmFnbWVudCBzaGFkZXIgaXM6CisKKyAgICBXb3JkIDA6IFJlY29yZCBzaXplICg5KQorICAgIFdvcmQgMTogU2hhZGVyIElECisgICAgV29yZCAyOiBJbnN0cnVjdGlvbiBJbmRleAorICAgIFdvcmQgMzogU3RhZ2UgKDQ6RnJhZ21lbnQpCisgICAgV29yZCA0OiBGcmFnQ29vcmQueAorICAgIFdvcmQgNTogRnJhZ0Nvb3JkLnkKKyAgICBXb3JkIDY6IEVycm9yICgwOiBJbWFnZUluZGV4T3V0T2ZCb3VuZHMpCisgICAgV29yZCA3OiBEZXNjcmlwdG9ySW5kZXgKKyAgICBXb3JkIDg6IERlc2NyaXB0b3JBcnJheUxlbmd0aAorCitJZiBhbm90aGVyIGVycm9yIGlzIGVuY291bnRlcmVkLCB0aGF0IHJlY29yZCBpcyB3cml0dGVuIHN0YXJ0aW5nIGF0IFdvcmQgMTAsIGlmIHRoZSB3aG9sZSByZWNvcmQgd2lsbCBub3Qgb3ZlcmZsb3cgRGF0YS4KK0lmIG92ZXJmbG93IHdpbGwgaGFwcGVuLCBubyB3b3JkcyBhcmUgd3JpdHRlbi4uCisKK1RoZSB2YWxpZGF0aW9uIGxheWVyIGNhbiBjb250aW51ZSB0byByZWFkIHZhbGlkIHJlY29yZHMgdW50aWwgaXQgc2VlcyBhIFJlY29yZCBMZW5ndGggb2YgMCBvciB0aGUgZW5kIG9mIERhdGEgaXMgcmVhY2hlZC4KKworIyMjIyBQcm9ncmFtbWF0aWMgaW50ZXJmYWNlCisKK1RoZSBwcm9ncmFtbWF0aWMgaW50ZXJmYWNlIGZvciB0aGUgYWJvdmUgaW5mb3JtYWwgZGVzY3JpcHRpb24gaXMgY29kaWZpZWQgaW4gdGhlCitbU1BJUlYtVG9vbHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvU1BJUlYtVG9vbHMpIHJlcG9zaXRvcnkgaW4gZmlsZQorW2BpbnN0cnVtZW50LmhwcGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvU1BJUlYtVG9vbHMvYmxvYi9tYXN0ZXIvaW5jbHVkZS9zcGlydi10b29scy9pbnN0cnVtZW50LmhwcCkuCitJdCBjb25zaXN0cyBsYXJnZWx5IG9mIGludGVnZXIgY29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIHRoZSBjb2RlcyBhbmQgdmFsdWVzIG1lbnRpb25lZCBhYm92ZSBhbmQKK29mZnNldHMgaW50byB0aGUgcmVjb3JkIGZvciBsb2NhdGluZyBlYWNoIGl0ZW0uCisKKyMjIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIEVycm9yIFJlcG9ydAorCitUaGlzIGlzIGEgZmFpcmx5IHNpbXBsZSBwcm9jZXNzIG9mIG1hcHBpbmcgdGhlIGRlYnVnIHJlcG9ydCBidWZmZXIgYXNzb2NpYXRlZCB3aXRoCitlYWNoIGRyYXcgaW4gdGhlIGNvbW1hbmQgYnVmZmVyIHRoYXQgd2FzIGp1c3Qgc3VibWl0dGVkIGFuZCBsb29raW5nIHRvIHNlZSBpZiB0aGUgR1BVIGluc3RydW1lbnRhdGlvbgorY29kZSB3cm90ZSBhbnl0aGluZy4KK0VhY2ggZHJhdyBpbiB0aGUgY29tbWFuZCBidWZmZXIgc2hvdWxkIGhhdmUgYSBjb3JyZXNwb25kaW5nIHJlc3VsdCBidWZmZXIgaW4gdGhlIGNvbW1hbmQgYnVmZmVyJ3MgbGlzdCBvZiByZXN1bHQgYnVmZmVycy4KK1RoZSByZXBvcnQgZ2VuZXJhdGluZyBjb2RlIGxvb3BzIHRocm91Z2ggdGhlIHJlc3VsdCBidWZmZXJzLCBtYXBzIGVhY2ggb2YgdGhlbSwgY2hlY2tzIGZvciBlcnJvcnMsIGFuZCB1bm1hcHMgdGhlbS4KK1RoZSBsYXllciBjbGVhcnMgdGhlIGJ1ZmZlciB0byB6ZXJvcyB3aGVuIGl0IGlzIGFsbG9jYXRlZCBhbmQgYWZ0ZXIgcHJvY2Vzc2luZyBhbnkKK2J1ZmZlciB0aGF0IHdhcyB3cml0dGVuIHRvLgorVGhlIGluc3RydW1lbnRlZCBzaGFkZXIgY29kZSBleHBlY3RzIHRoZXNlIGJ1ZmZlcnMgdG8gYmUgY2xlYXJlZCB0byB6ZXJvcyBiZWZvcmUgaXQKK3dyaXRlcyB0byB0aGVtLgorCitUaGUgbGF5ZXIgdGhlbiBwcmVwYXJlcyBhICJjb21tb24iIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZSBjb250YWluaW5nOgorCisqIGNvbW1hbmQgYnVmZmVyIGhhbmRsZSAtIFRoaXMgaXMgZWFzaWx5IG9idGFpbmVkIGJlY2F1c2Ugd2UgYXJlIGxvb3Bpbmcgb3ZlciB0aGUgY29tbWFuZAorICBidWZmZXJzIGp1c3Qgc3VibWl0dGVkLgorKiBkcmF3IG51bWJlciAtIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgZHJhd3Mgd2UndmUgcHJvY2Vzc2VkIGZvciBhIGdpdmVuIGNvbW1hbmQgYnVmZmVyLgorKiBwaXBlbGluZSBoYW5kbGUgLSBUaGUgc2hhZGVyIHRyYWNrZXIgZGlzY3Vzc2VkIGVhcmxpZXIgY29udGFpbnMgdGhpcyBoYW5kbGUKKyogc2hhZGVyIG1vZHVsZSBoYW5kbGUgLSBUaGUgIlNoYWRlciBJRCIgKFdvcmQgMSBpbiB0aGUgcmVjb3JkKSBpcyB1c2VkIHRvIGxvb2t1cAorICB0aGUgc2hhZGVyIHRyYWNrZXIgd2hpY2ggaXMgdGhlbiB1c2VkIHRvIG9idGFpbiB0aGUgc2hhZGVyIG1vZHVsZSBhbmQgcGlwZWxpbmUgaGFuZGxlcworKiBpbnN0cnVjdGlvbiBpbmRleCAtIFRoaXMgaXMgdGhlIFNQSVItViBpbnN0cnVjdGlvbiBpbmRleCB3aGVyZSB0aGUgaW52YWxpZCBhcnJheSBhY2Nlc3Mgb2NjdXJyZWQuCisgIEl0IGlzIG5vdCB0aGF0IHVzZWZ1bCBieSBpdHNlbGYsIHNpbmNlIHRoZSB1c2VyIHdvdWxkIGhhdmUgdG8gdXNlIGl0IHRvIGxvY2F0ZSBhIFNQSVItViBpbnN0cnVjdGlvbgorICBpbiBhIFNQSVItViBkaXNhc3NlbWJseSBhbmQgc29tZWhvdyByZWxhdGUgaXQgYmFjayB0byB0aGUgc2hhZGVyIHNvdXJjZSBjb2RlLgorICBCdXQgaXQgY291bGQgc3RpbGwgYmUgdXNlZnVsIHRvIHNvbWUgYW5kIGl0IGlzIGVhc3kgdG8gcmVwb3J0LgorICBUaGUgdXNlciBjYW4gYnVpbGQgdGhlIHNoYWRlciB3aXRoIGRlYnVnIGluZm9ybWF0aW9uIHRvIGdldCBzb3VyY2UtbGV2ZWwgaW5mb3JtYXRpb24uCisKK0ZvciBhbGwgb2JqZWN0cywgdGhlIGxheWVyIGFsc28gbG9va3MgdXAgdGhlIG9iamVjdHMgaW4gdGhlIERlYnVnIFV0aWxzIG9iamVjdCBuYW1lIG1hcCBpbgorY2FzZSB0aGUgYXBwbGljYXRpb24gdXNlZCB0aGF0IGV4dGVuc2lvbiB0byBuYW1lIGFueSBvYmplY3RzLgorSWYgYSBuYW1lIGV4aXN0cyBmb3IgdGhhdCBvYmplY3QsIGl0IGlzIGluY2x1ZGVkIGluIHRoZSBlcnJvciBtZXNzYWdlLgorCitUaGUgbGF5ZXIgdGhlbiBhZGRzIG9uIGVycm9yIG1lc3NhZ2UgdGV4dCBvYnRhaW5lZCBmcm9tIGRlY29kaW5nIHRoZSBzdGFnZS1zcGVjaWZpYyBhbmQKK3ZhbGlkYXRpb24tc3BlY2lmaWMgZGF0YSBhcyBkZXNjcmliZWQgZWFybGllci4KKworVGhpcyBjb21wbGV0ZXMgdGhlIGVycm9yIHJlcG9ydCB3aGVuIHRoZXJlIGlzIG5vIHNvdXJjZS1sZXZlbCBkZWJ1ZyBpbmZvcm1hdGlvbiBpbiB0aGUgc2hhZGVyLgorCisjIyMgU291cmNlLUxldmVsIERlYnVnIEluZm9ybWF0aW9uCisKK1RoaXMgaXMgb25lIG9mIHRoZSBtb3JlIGNvbXBsaWNhdGVkIGFuZCBjb2RlLWhlYXZ5IHBhcnRzIG9mIHRoZSBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBmZWF0dXJlCithbmQgYWxsIGl0IHJlYWxseSBkb2VzIGlzIGRpc3BsYXkgc291cmNlLWxldmVsIGluZm9ybWF0aW9uIHdoZW4gdGhlIHNoYWRlciBpcyBjb21waWxlZAord2l0aCBkZWJ1Z2dpbmcgaW5mbyAoYC1nYCBvcHRpb24gaW4gdGhlIGNhc2Ugb2YgYGdsc2xhbmdWYWxpZGF0b3JgKS4KKworVGhlIHByb2Nlc3MgYnJlYWtzIGRvd24gaW50byB0d28gc3RlcHM6CisKKyMjIyMgT3BMaW5lIFByb2Nlc3NpbmcKKworVGhlIFNQSVItViBnZW5lcmF0b3IgKGUuZy4sIGdsc2xhbmdWYWxpZGF0b3IpIHBsYWNlcyBhbiBPcExpbmUgU1BJUi1WIGluc3RydWN0aW9uIGluIHRoZQorc2hhZGVyIHByb2dyYW0gYWhlYWQgb2YgY29kZSBnZW5lcmF0ZWQgZm9yIGVhY2ggc291cmNlIGNvZGUgc3RhdGVtZW50LgorVGhlIE9wTGluZSBpbnN0cnVjdGlvbiBjb250YWlucyB0aGUgZmlsZW5hbWUgaWQgKGZvciBhbiBPcFN0cmluZyksCit0aGUgc291cmNlIGNvZGUgbGluZSBudW1iZXIgYW5kIHRoZSBzb3VyY2UgY29kZSBjb2x1bW4gbnVtYmVyLgorSXQgaXMgcG9zc2libGUgdG8gaGF2ZSB0d28gc291cmNlIGNvZGUgc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSwKK3doaWNoIGV4cGxhaW5zIHRoZSBuZWVkIGZvciB0aGUgY29sdW1uIG51bWJlci4KKworVGhlIGxheWVyIHNjYW5zIHRoZSBTUElSLVYgbG9va2luZyBmb3IgdGhlIGxhc3QgT3BMaW5lIGluc3RydWN0aW9uIHRoYXQgYXBwZWFycyBiZWZvcmUgdGhlIGluc3RydWN0aW9uCithdCB0aGUgaW5zdHJ1Y3Rpb24gaW5kZXggb2J0YWluZWQgZnJvbSB0aGUgZGVidWcgcmVwb3J0LgorVGhpcyBPcExpbmUgdGhlbiBjb250YWlucyB0aGUgY29ycmVjdCBmaWxlbmFtZSBpZCwgbGluZSBudW1iZXIsIGFuZCBjb2x1bW4gbnVtYmVyIG9mIHRoZQorc3RhdGVtZW50IGNhdXNpbmcgdGhlIGVycm9yLgorVGhlIGZpbGVuYW1lIGl0c2VsZiBpcyBvYnRhaW5lZCBieSBzY2FubmluZyB0aGUgU1BJUi1WIGFnYWluIGZvciBhbiBPcFN0cmluZyBpbnN0cnVjdGlvbiB0aGF0CittYXRjaGVzIHRoZSBpZCBmcm9tIHRoZSBPcExpbmUuCitUaGlzIE9wU3RyaW5nIGNvbnRhaW5zIHRoZSB0ZXh0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZpbGVuYW1lLgorVGhpcyBpbmZvcm1hdGlvbiBpcyBhZGRlZCB0byB0aGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLgorCitGb3Igb25saW5lIGNvbXBpbGF0aW9uIHdoZW4gdGhlcmUgaXMgbm8gImZpbGUiLCBvbmx5IHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZC4KKworIyMjIyBPcFNvdXJjZSBQcm9jZXNzaW5nCisKK1RoZSBTUElSLVYgYnVpbHQgd2l0aCBzb3VyY2UtbGV2ZWwgZGVidWcgaW5mbyBhbHNvIGNvbnRhaW5zIE9wU291cmNlIGluc3RydWN0aW9ucyB0aGF0CitoYXZlIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLCBkZWxpbWl0ZWQgYnkgbmV3bGluZXMuCitEdWUgdG8gcG9zc2libGUgcHJlLXByb2Nlc3NpbmcsIHRoZSBsYXllciBqdXN0IGNhbm5vdCBzaW1wbHkgdXNlIHRoZSBzb3VyY2UgZmlsZSBsaW5lIG51bWJlcgorZnJvbSB0aGUgT3BMaW5lIHRvIGluZGV4IGludG8gdGhpcyBzZXQgb2Ygc291cmNlIGNvZGUgbGluZXMuCisKK0luc3RlYWQsIHRoZSBjb3JyZWN0IHNvdXJjZSBjb2RlIGxpbmUgaXMgZm91bmQgYnkgZmlyc3QgbG9jYXRpbmcgdGhlICIjbGluZSIgZGlyZWN0aXZlIGluIHRoZQorc291cmNlIHRoYXQgc3BlY2lmaWVzIGEgbGluZSBudW1iZXIgY2xvc2VzdCB0byBhbmQgbGVzcyB0aGFuIHRoZSBzb3VyY2UgbGluZSBudW1iZXIgcmVwb3J0ZWQKK2J5IHRoZSBPcExpbmUgbG9jYXRlZCBpbiB0aGUgcHJldmlvdXMgc3RlcC4KK1RoZSBjb3JyZWN0ICIjbGluZSIgZGlyZWN0aXZlIG11c3QgYWxzbyBtYXRjaCBpdHMgZmlsZW5hbWUsIGlmIHNwZWNpZmllZCwKK3dpdGggdGhlIGZpbGVuYW1lIGZyb20gdGhlIE9wTGluZS4KKworVGhlbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAiI2xpbmUiIGxpbmUgbnVtYmVyIGFuZCB0aGUgT3BMaW5lIGxpbmUgbnVtYmVyIGlzIGFkZGVkCit0byB0aGUgcGxhY2Ugd2hlcmUgdGhlICIjbGluZSIgd2FzIGZvdW5kIHRvIGxvY2F0ZSB0aGUgYWN0dWFsIGxpbmUgb2Ygc291cmNlLCB3aGljaCBpcwordGhlbiBhZGRlZCB0byB0aGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLgorCitGb3IgZXhhbXBsZSwgaWYgdGhlIE9wTGluZSBsaW5lIG51bWJlciBpcyAxNSwgYW5kIHRoZXJlIGlzIGEgIiNsaW5lIDEwIiBvbiBsaW5lIDQwCitpbiB0aGUgT3BTb3VyY2Ugc291cmNlLCB0aGVuIGxpbmUgNDUgaW4gdGhlIE9wU291cmNlIGNvbnRhaW5zIHRoZSBjb3JyZWN0IHNvdXJjZSBsaW5lLgorCisjIyMgU2hhZGVyIEluc3RydW1lbnRhdGlvbiBJbnB1dCBSZWNvcmQgRm9ybWF0IGZvciBEZXNjcmlwdG9yIEluZGV4aW5nCisKK0FsdGhvdWdoIHRoZSBESSBpbnB1dCBidWZmZXIgaXMgYSBsaW5lYXIgYXJyYXkgb2YgdW5zaWduZWQgaW50ZWdlcnMsIGNvbmNlcHR1YWxseSB0aGVyZSBhcmUgYXJyYXlzIHdpdGhpbiB0aGUgbGluZWFyIGFycmF5LgorCitXb3JkIDEgc3RhcnRzIGFuIGFycmF5IChkZW5vdGVkIGJ5IHNldHNfdG9fc2l6ZXMpIHRoYXQgaXMgbnVtYmVyX29mX3NldHMgbG9uZywgd2l0aCBhbiBpbmRleCB0aGF0IGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhhdCBzZXQncyBlbnRyaWVzIGluIHRoZSBzaXplcyBhcnJheS4KKworQWZ0ZXIgdGhlIHNldHNfdG9fc2l6ZXMgYXJyYXkgaXMgdGhlIHNpemVzIGFycmF5LCB0aGF0IGNvbnRhaW5zIHRoZSBhcnJheSBzaXplIChvciAxIGlmIGRlc2NyaXB0b3IgaXMgbm90IGFuIGFycmF5KSBvZiBlYWNoIGRlc2NyaXB0b3IgaW4gdGhlIHNldC4gIEJpbmRpbmdzIHdpdGggbm8gZGVzY3JpcHRvciBhcmUgZmlsbGVkIGluIHdpdGggemVyb3MuCisKK0FmdGVyIHRoZSBzaXplcyBhcnJheSBpcyB0aGUgc2V0c190b19iaW5kaW5ncyBhcnJheSB0aGF0IGZvciBlYWNoIGRlc2NyaXB0b3Igc2V0LCBpbmRleGVzIGludG8gdGhlIGJpbmRpbmdzX3RvX3dyaXR0ZW4gYXJyYXkuICBXb3JkIDAgY29udGFpbnMgdGhlIGluZGV4IHRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSBzZXRzX3RvX2JpbmRpbmdzIGFycmF5LgorCitBZnRlciB0aGUgc2V0c190b19iaW5kaW5ncyBhcnJheSwgaXMgdGhlIGJpbmRpbmdzX3RvX3dyaXR0ZW4gYXJyYXkgdGhhdCBmb3IgZWFjaCBiaW5kaW5nIGluIHRoZSBzZXQsIGluZGV4ZXMgdG8gdGhlIHN0YXJ0IG9mIHRoYXQgYmluZGluZydzIGVudHJpZXMgaW4gdGhlIHdyaXR0ZW4gYXJyYXkuCisKK0xhc3RseSBjb21lcyB0aGUgd3JpdHRlbiBhcnJheSwgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYSBnaXZlbiBiaW5kaW5nIC8gYXJyYXkgZWxlbWVudCBoYXMgYmVlbiB3cml0dGVuLgorCitFeGFtcGxlOgorYGBgCitBc3N1bWUgRGVzY3JpcHRvciBTZXQgMCBsb29rcyBsaWtlOiAgICAgICAgICAgICAgICAgICAgICAgIEFuZCBEZXNjcmlwdG9yIFNldCAxIGxvb2tzIGxpa2U6CisgIEJpbmRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZworICAgICAwICAgICAgICAgIEFycmF5WzNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBBcnJheVs0XQorICAgICAxICAgICAgICAgIE5vbiBBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBBcnJheVs1XQorICAgICAzICAgICAgICAgIEFycmF5WzJdCisKK0hlcmUgaXMgd2hhdCB0aGUgaW5wdXQgYnVmZmVyIHNob3VsZCBsb29rIGxpa2U6CisKKyAgIEluZGV4IG9mICAgICAgICAgICAgICAgICAgICAgc2V0c190b19zaXplcyAgICAgICAgICAgICAgICAgICAgIHNpemVzICAgICAgICAgICAgIHNldHNfdG9fYmluZGluZ3MgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzX3RvX3dyaXR0ZW4gICAgd3JpdHRlbgorICAgc2V0c190b19iaW5kaW5ncworCisgICAgIDAgfDExfCBzZXRzX3RvX2JpbmRpbmdzICAgICAxIHwzfCBzZXQgMCBzaXplcyBzdGFydCBhdCAzICAgICAzICB8M3wgUzBCMCAgICAgICAxMSB8MTN8IHNldCAwIGJpbmRpbmdzIHN0YXJ0IGF0IDEzICAgICAgICAxMyB8MjF8IFMwQjAgICAgICAgIDIxIHwxfCBTMEIwSTAgd2FzIHdyaXR0ZW4KKyAgICAgICAgICAgIHN0YXJ0cyBhdCAxMSAgICAgICAgIDIgfDd8IHNldCAxIHNpemVzIHN0YXJ0IGF0IDcgICAgIDQgIHwxfCBTMEIxICAgICAgIDEyIHwxN3wgc2V0IDEgYmluZGluZ3Mgc3RhcnQgYXQgMTcgICAgICAgIDE0IHwyNHwgUzBCMSAgICAgICAgMjIgfDF8IFMwQjBJMSB3YXMgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgfDB8IFMwQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgfDAgfCBTMEIyICAgICAgICAyMyB8MXwgUzBCMEkzIHdhcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICB8MnwgUzBCMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiB8MjV8IFMwQjMgICAgICAgIDI0IHwxfCBTMEIxIHdhcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ICB8MHwgUzFCMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyB8MCB8IFMxQjAgICAgICAgIDI1IHwxfCBTMEIzSTAgd2FzIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIHwwfCBTMUIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4IHwwIHwgUzFCMSAgICAgICAgMjYgfDF8IFMwQjNJMSB3YXMgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgfDR8IFMxQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgfDI3fCBTMUIyICAgICAgICAyNyB8MHwgUzFCMkkwIHdhcyBub3Qgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgfDV8IFMxQjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgfDMxfCBTMUIzICAgICAgICAyOCB8MXwgUzFCMkkxIHdhcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5IHwxfCBTMUIySTIgd2FzIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAgfDF8IFMxQjJJMyB3YXMgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSB8MXwgUzFCM0kwIHdhcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyIHwxfCBTMUIzSTEgd2FzIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMgfDF8IFMxQjNJMiB3YXMgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCB8MXwgUzFCM0kzIHdhcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1IHwxfCBTMUIzSTQgd2FzIHdyaXR0ZW4KK2BgYAorQWx0ZXJuYXRlbHksIHlvdSBjb3VsZCBkZXNjcmliZSB0aGUgYXJyYXkgc2l6ZSBhbmQgd3JpdGUgc3RhdGUgZGF0YSBhczoKKyhzZXQgPSBzLCBiaW5kaW5nID0gYiwgaW5kZXggPSBpKSBpcyBub3QgaW5pdGlhbGl6ZWQgaWYgCitgYGAKK0lucHV0WyBpICsgSW5wdXRbIGIgKyBJbnB1dFsgcyArIElucHV0WyBJbnB1dFswXSBdIF0gXSBdID09IDAKK2BgYAorYW5kIHRoZSBhcnJheSdzIHNpemUgPSBJbnB1dFsgSW5wdXRbIHMgKyAxIF0gKyBiIF0gCisKKyMjIyBTaGFkZXIgSW5zdHJ1bWVudGF0aW9uIElucHV0IFJlY29yZCBGb3JtYXQgZm9yIGJ1ZmZlciBkZXZpY2UgYWRkcmVzcworVGhlIGlucHV0IGJ1ZmZlciBmb3IgYnVmZmVyX3JlZmVyZW5jZSBhY2Nlc3NlcyBjb25zaXN0cyBvZiBhbGwgYWRkcmVzc2VzIHJldHJpZXZlZCBmcm9tIHZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCBhbmQgdGhlIHNpemVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGJ1ZmZlcnMuCitUaGUgYWRkcmVzc2VzIHNob3VsZCBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLgorYGBgCitXb3JkIDA6ICAgSW5kZXggb2Ygc3RhcnQgb2YgYnVmZmVyIHNpemVzIChYKzIpCitXb3JkIDE6ICAgMHgwMDAwMDAwMDAwMDAwMDAwCitXb3JkIDI6ICAgRGV2aWNlIGFkZHJlc3Mgb2YgZmlyc3QgYnVmZmVyCisgICAgICAgICAgICAgICAuCisgICAgICAgICAgICAgICAuCitXb3JkIFg6ICAgRGV2aWNlIGFkZHJlc3Mgb2YgbGFzdCBidWZmZXIKK1dvcmQgWCsxOiAweGZmZmZmZmZmZmZmZmZmZmYKK1dvcmQgWCsyOiAwIChzaXplIG9mIHByZXRlbmQgYnVmZmVyIGF0IHdvcmQgMSkKK1dvcmQgWCszOiBTaXplIG9mIGZpcnN0IGJ1ZmZlcgorICAgICAgICAgICAgICAgLgorICAgICAgICAgICAgICAgLgorV29yZCBZOiAgIFNpemUgb2YgbGFzdCBidWZmZXIKK1dvcmQgWSsxOiAwICAoc2l6ZSBvZiBwcmV0ZW5kIGJ1ZmZlciBhdCB3b3JkIFgrMSkKK2BgYAorIyMjIEFjY2VsZXJhdGlvbiBTdHJ1Y3R1cmUgQnVpbGRpbmcgVmFsaWRhdGlvbgorCitJbmNyZWFzaW5nIHBlcmZvcm1hbmNlIG9mIGdyYXBoaWNzIGhhcmR3YXJlIGhhcyBtYWRlIHJheSB0cmFjaW5nIGEgdmlhYmxlIG9wdGlvbiBmb3IgaW50ZXJhY3RpdmUgcmVuZGVyaW5nLiBUaGUgVktfTlZfcmF5X3RyYWNpbmcgZXh0ZW5zaW9uIGFkZHMKK3JheSB0cmFjaW5nIHN1cHBvcnQgdG8gVnVsa2FuLiBXaXRoIHRoaXMgZXh0ZW5zaW9uLCBhcHBsaWNhdGlvbnMgY3JlYXRlIGFuZCBidWlsZCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIG9iamVjdHMgZm9yIHRoZWlyIHNjZW5lIGdlb21ldHJ5Cit3aGljaCBhbGxvd3MgaW1wbGVtZW50YXRpb25zIHRvIG1hbmFnZSB0aGUgc2NlbmUgZ2VvbWV0cnkgYXMgaXQgaXMgdHJhdmVyc2VkIGR1cmluZyBhIHJheSB0cmFjaW5nIHF1ZXJ5LgorCitUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmVzLCB0b3AgbGV2ZWwgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZXMgYW5kIGJvdHRvbSBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlcy4gQm90dG9tIGxldmVsIGFjY2VsZXJhdGlvbgorc3RydWN0dXJlcyBhcmUgZm9yIGFuIGFycmF5IG9mIGdlb21ldHJpZXMgYW5kIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlcyBhcmUgZm9yIGFuIGFycmF5IG9mIGluc3RhbmNlcyBvZiBib3R0b20gbGV2ZWwgc3RydWN0dXJlcy4KKworVGhlIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYnVpbGRpbmcgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBHUFUgdmFsaWRhdGlvbiBsYXllciB2YWxpZGF0ZXMgdGhhdCB0aGUgYm90dG9tIGxldmVsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgcmVmZXJlbmNlcworZm91bmQgaW4gdGhlIGluc3RhbmNlIGRhdGEgdXNlZCB3aGVuIGJ1aWxkaW5nIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlcyBhcmUgdmFsaWQuCisKKyMjIyMgSW1wbGVtZW50YXRpb24KKworQmVjYXVzZSB0aGUgaW5zdGFuY2UgZGF0YSBidWZmZXIgdXNlZCBpbiB2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgY291bGQgYmUgYSBkZXZpY2UgbG9jYWwgYnVmZmVyIGFuZCBiZWNhdXNlIGNvbW1hbmRzIGFyZSBleGVjdXRlZCBzb21ldGltZQoraW4gdGhlIGZ1dHVyZSwgdmFsaWRhdGluZyB0aGUgaW5zdGFuY2UgYnVmZmVyIG11c3QgdGFrZSBwbGFjZSBvbiB0aGUgR1BVLiBUbyBhY2NvbXBsaXNoIHRoaXMsIHRoZSBHUFUgdmFsaWRhdGlvbiBsYXllciB0cmFja3MgdGhlIGtub3duIHZhbGlkIGhhbmRsZXMKK29mIGJvdHRvbSBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlcyBhdCB0aGUgdGltZSBhIGNvbW1hbmQgYnVmZmVyIGlzIHJlY29yZGVkIGFuZCBpbnNlcnRzIGFuIGFkZGl0aW9uYWwgY29tcHV0ZSBzaGFkZXIgZGlzcGF0Y2ggYmVmb3JlIGNvbW1hbmRzCit3aGljaCBidWlsZCB0b3AgbGV2ZWwgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZXMgdG8gaW5zcGVjdCBhbmQgdmFsaWRhdGUgdGhlIGluc3RhbmNlIGJ1ZmZlciB1c2VkLiBUaGUgY29tcHV0ZSBzaGFkZXIgaXRlcmF0ZXMgb3ZlciB0aGUgaW5zdGFuY2UgYnVmZmVyCithbmQgcmVwbGFjZXMgdW5yZWNvZ25pemVkIGJvdHRvbSBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGhhbmRsZXMgd2l0aCBhIHByZWJ1aWx0IHZhbGlkIGJvdHRvbSBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGhhbmRsZS4gVXBvbiBxdWV1ZQorc3VibWlzc2lvbiBhbmQgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZCBidWZmZXIsIHRoZSByZXBvcnRlZCBmYWlsdXJlcyBhcmUgcmVhZCBmcm9tIGEgc3RvcmFnZSBidWZmZXIgd3JpdHRlbiB0byBieSB0aGUgY29tcHV0ZSBzaGFkZXIgYW5kIGZpbmFsbHkKK3JlcG9ydGVkIHRvIHRoZSBhcHBsaWNhdGlvbi4KKworVG8gaGVscCB2aXN1YWxpemVkLCBhIGNvbW1hbmQgYnVmZmVyIHRoYXQgd291bGQgb3JpZ2luYWxseSBoYXZlIGJlZW4gcmVjb3JkZWQgYXM6CisKK2BgYGNwcAordmtCZWdpbkNvbW1hbmRCdWZmZXIoLi4uKQorCisuLi4gb3RoZXIgY29tbWFuZHMgLi4uCisKK3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViguLi4pIC8vIGJ1aWxkIHRvcCBsZXZlbAorCisuLi4gb3RoZXIgY29tbWFuZHMgLi4uCisKK3ZrRW5kQ29tbWFuZEJ1ZmZlciguLi4pCitgYGAKKword291bGQgYWN0dWFsbHkgYmUgcmVjb3JkZWQgYXM6CisKK2BgYGNwcAordmtCZWdpbkNvbW1hbmRCdWZmZXIoLi4uKQorCisuLi4gb3RoZXIgY29tbWFuZHMgLi4uCisKK3ZrQ21kUGlwZWxpbmVCYXJyaWVyKC4uLikgICAgICAgICAgICAgICAvLyBlbnN1cmUgd3JpdGVzIHRvIGluc3RhbmNlIGJ1ZmZlciBoYXZlIGNvbXBsZXRlZAorCit2a0NtZERpc3BhdGNoKC4uLikgICAgICAgICAgICAgICAgICAgICAgLy8gbGF1bmNoIHZhbGlkYXRpb24gY29tcHV0ZSBzaGFkZXIKKwordmtDbWRQaXBlbGluZUJhcnJpZXIoLi4uKSAgICAgICAgICAgICAgIC8vIGVuc3VyZSB2YWxpZGF0aW9uIGNvbXB1dGUgc2hhZGVyIHdyaXRlcyBoYXZlIGNvbXBsZXRlZAorCit2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoLi4uKSAgLy8gYnVpbGQgdG9wIGxldmVsIHVzaW5nIG1vZGlmaWVkIGluc3RhbmNlIGJ1ZmZlcgorCisuLi4gb3RoZXIgY29tbWFuZHMgLi4uCisKK3ZrRW5kQ29tbWFuZEJ1ZmZlciguLi4pCitgYGAKKyMjIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIFRlc3RpbmcKKworVmFsaWRhdGlvbiBMYXllciBUZXN0cyAoVkxUcykgZXhpc3QgZm9yIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uLgorVGhleSBjYW5ub3QgYmUgcnVuIHdpdGggdGhlICJtb2NrIElDRCIgaW4gaGVhZGxlc3MgQ0kgZW52aXJvbm1lbnRzIGJlY2F1c2UgdGhleSBuZWVkIHRvCithY3R1YWxseSBleGVjdXRlIHNoYWRlcnMuCitCdXQgdGhleSBhcmUgc3RpbGwgdXNlZnVsIHRvIHJ1biBvbiByZWFsIGRldmljZXMgdG8gY2hlY2sgZm9yIHJlZ3Jlc3Npb25zLgorCitUaGVyZSBpc24ndCBhbnl0aGluZyBlbHNlIHRoYXQgcmVtYXJrYWJsZSBvciBkaWZmZXJlbnQgYWJvdXQgdGhlc2UgdGVzdHMuCitUaGV5IGFjdGl2YXRlIEdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIHZpYSB0aGUgcHJvZ3JhbW1hdGljCitpbnRlcmZhY2UgYXMgZGVzY3JpYmVkIGVhcmxpZXIuCisKK1RoZSB0ZXN0cyBleGVyY2lzZSB0aGUgZXh0cmFjdGlvbiBvZiBzb3VyY2UgY29kZSBpbmZvcm1hdGlvbiB3aGVuIHRoZSBzaGFkZXIKK2lzIGJ1aWx0IHdpdGggZGVidWcgaW5mby4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3MvaGFuZGxlX3dyYXBwaW5nLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvZG9jcy9oYW5kbGVfd3JhcHBpbmcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxNDQzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3MvaGFuZGxlX3dyYXBwaW5nLm1kCkBAIC0wLDAgKzEsMTcgQEAKKzwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgTUQwNDEgLS0+CitbIVtLaHJvbm9zIFZ1bGthbl1bMV1dWzJdCisKK1sxXTogaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS9pbWcvVnVsa2FuXzEwMHB4X0RlYzE2LnBuZyAiaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvdnVsa2FuLyIKK1syXTogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvdnVsa2FuLworCisjIEhhbmRsZSBXcmFwcGluZyBGdW5jdGlvbmFsaXR5CitbIVtDcmVhdGl2ZSBDb21tb25zXVszXV1bNF0KKworWzNdOiBodHRwczovL2kuY3JlYXRpdmVjb21tb25zLm9yZy9sL2J5LW5kLzQuMC84OHgzMS5wbmcgIkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIKK1s0XTogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5kLzQuMC8KKworVGhlIGhhbmRsZSB3cmFwcGluZyBmYWNpbGl0eSBpcyBhIGZlYXR1cmUgb2YgdGhlIEtocm9ub3MgTGF5ZXIgd2hpY2ggYWxpYXNlcyBhbGwgbm9uLWRpc3BhdGNoYWJsZSBWdWxrYW4gb2JqZWN0cyB3aXRoIGEgdW5pcXVlIGlkZW50aWZpZXIgYXQgb2JqZWN0LWNyZWF0aW9uIHRpbWUuIFRoZSBhbGlhc2VkIGhhbmRsZXMgYXJlIHVzZWQgZHVyaW5nIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoYXQgZHVwbGljYXRlIG9iamVjdCBoYW5kbGVzIGFyZSBjb3JyZWN0bHkgbWFuYWdlZCBhbmQgdHJhY2tlZCBieSB0aGUgdmFsaWRhdGlvbiBsYXllcnMuIFRoaXMgZW5hYmxlcyBjb25zaXN0ZW50IGFuZCBjb2hlcmVudCB2YWxpZGF0aW9uIGluIGFkZGl0aW9uIHRvIHByb3BlciBvcGVyYXRpb24gb24gc3lzdGVtcyB3aGljaCByZXR1cm4gbm9uLXVuaXF1ZSBvYmplY3QgaGFuZGxlcy4KKworKipOb3RlKio6CisKKyogSWYgeW91IGFyZSBkZXZlbG9waW5nIFZ1bGthbiBleHRlbnNpb25zIHdoaWNoIGluY2x1ZGUgbmV3IEFQSXMgdGFraW5nIG9uZSBvciBtb3JlIFZ1bGthbiBkaXNwYXRjaGFibGUgb2JqZWN0cyBhcyBwYXJhbWV0ZXJzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGRpc2FibGUgaGFuZGxlLXdyYXBwaW5nIGluIG9yZGVyIHVzZSB0aGUgdmFsaWRhdGlvbiBsYXllcnMuIE9wdGlvbnMgZm9yIGRpc2FibGluZyB0aGlzIGZhY2lsaXR5IGluIHRoZSBLaHJvbm9zIHZhbGlkYXRpb24gTGF5ZXIgaW5jbHVkZSB0aGUgVmtDb25maWcgdXRpbGl0eSwgdGhlIHZrX2xheWVyX3NldHRpbmdzLnR4dCBjb25maWd1cmF0aW9uIGZpbGUsIHRoZSBWS19MQVlFUl9ESVNBQkxFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgdGhlIFZLX0VYVF92YWxpZGF0aW9uX2ZlYXR1cmVzIGV4dGVuc2lvbi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3Mva2hyb25vc192YWxpZGF0aW9uX2xheWVyLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvZG9jcy9raHJvbm9zX3ZhbGlkYXRpb25fbGF5ZXIubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5YzliNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3Mva2hyb25vc192YWxpZGF0aW9uX2xheWVyLm1kCkBAIC0wLDAgKzEsMjYgQEAKKzwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgTUQwNDEgLS0+Cis8IS0tIENvcHlyaWdodCAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuIC0tPgorCitbIVtLaHJvbm9zIFZ1bGthbl1bMV1dWzJdCisKK1sxXTogaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS9pbWcvVnVsa2FuXzEwMHB4X0RlYzE2LnBuZyAiaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvdnVsa2FuLyIKK1syXTogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvdnVsa2FuLworCisjIFZLXF9MQVlFUlxfS0hST05PU1xfdmFsaWRhdGlvbgorCitbIVtDcmVhdGl2ZSBDb21tb25zXVszXV1bNF0KKworWzNdOiBodHRwczovL2kuY3JlYXRpdmVjb21tb25zLm9yZy9sL2J5LW5kLzQuMC84OHgzMS5wbmcgIkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIKK1s0XTogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5kLzQuMC8KK1RoZSBgVktfTEFZRVJfS0hST05PU192YWxpZGF0aW9uYCBsYXllciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHZhbGlkYXRpb24gYXJlYXM6CisKKy0gVGhyZWFkIHNhZmV0eSB2YWxpZGF0aW9uCistIFN0YXRlbGVzcyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgorLSBPYmplY3QgbGlmZXRpbWUgdmFsaWRhdGlvbgorLSBDb3JlIHZhbGlkYXRpb24gY2hlY2tzCistIEdQVS1Bc3Npc3RlZCB2YWxpZGF0aW9uCistIEJlc3QgcHJhY3RpY2VzIHZhbGlkYXRpb24KKy0gSGFuZGxlIHdyYXBwaW5nIGZ1bmN0aW9uYWxpdHkKKworRGV0YWlscyBmb3IgdGhlIGZ1bmN0aW9uYWxpdHkgY29udGFpbmVkIGluIGVhY2ggb2YgdGhlc2UgYXJlYXMgY2FuIGJlIHZpZXdlZCBpbiB0aGVpciByZXNwZWN0aXZlIHZhbGlkYXRpb24gZGV0YWlsIGRvY3VtZW50cywgbG9jYXRlZCBpbiB0aGlzIGRpcmVjdG9yeS4KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvZG9jcy9vYmplY3RfbGlmZXRpbWVzLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvZG9jcy9vYmplY3RfbGlmZXRpbWVzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YThkODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9kb2NzL29iamVjdF9saWZldGltZXMubWQKQEAgLTAsMCArMSwyNyBAQAorPCEtLSBtYXJrZG93bmxpbnQtZGlzYWJsZSBNRDA0MSAtLT4KKzwhLS0gQ29weXJpZ2h0IDIwMTUtMjAxOSBMdW5hckcsIEluYy4gLS0+CitbIVtLaHJvbm9zIFZ1bGthbl1bMV1dWzJdCisKK1sxXTogaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS9pbWcvVnVsa2FuXzEwMHB4X0RlYzE2LnBuZyAiaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvdnVsa2FuLyIKK1syXTogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvdnVsa2FuLworCisjIE9iamVjdCBMaWZldGltZXMgVmFsaWRhdGlvbgorCitbIVtDcmVhdGl2ZSBDb21tb25zXVszXV1bNF0KKworWzNdOiBodHRwczovL2kuY3JlYXRpdmVjb21tb25zLm9yZy9sL2J5LW5kLzQuMC84OHgzMS5wbmcgIkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIKK1s0XTogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5kLzQuMC8KKworVGhlIG9iamVjdCB0cmFja2luZyB2YWxpZGF0aW9uIG9iamVjdCB0cmFja3MgYWxsIFZ1bGthbiBvYmplY3RzLiBPYmplY3QgbGlmZXRpbWVzIGFyZSB2YWxpZGF0ZWQKK2Fsb25nIHdpdGggaXNzdWVzIHJlbGF0ZWQgdG8gdW5rbm93biBvYmplY3RzIGFuZCBvYmplY3QgZGVzdHJ1Y3Rpb24gYW5kIGNsZWFudXAuCisKK0FsbCBWdWxrYW4gZGlzcGF0Y2hhYmxlIGFuZCBub24tZGlzcGF0Y2hhYmxlIG9iamVjdHMgYXJlIHRyYWNrZWQgYnkgdGhpcyBtb2R1bGUuCisKK1RoaXMgbGF5ZXIgdmFsaWRhdGVzIHRoYXQ6CisKKy0gb25seSBrbm93biBvYmplY3RzIGFyZSByZWZlcmVuY2VkIGFuZCBkZXN0cm95ZWQKKy0gbG9va3VwcyBhcmUgcGVyZm9ybWVkIG9ubHkgb24gb2JqZWN0cyBiZWluZyB0cmFja2VkCistIG9iamVjdHMgYXJlIGNvcnJlY3RseSBmcmVlZC9kZXN0cm95ZWQKKworVmFsaWRhdGlvbiB3aWxsIHByaW50IGVycm9ycyBpZiB2YWxpZGF0aW9uIGNoZWNrcyBhcmUgbm90IGNvcnJlY3RseSBtZXQgYW5kIHdhcm5pbmdzIGlmIGltcHJvcGVyCityZWZlcmVuY2Ugb2Ygb2JqZWN0cyBpcyBkZXRlY3RlZC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3Mvc3RhdGVsZXNzX3ZhbGlkYXRpb24ubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9kb2NzL3N0YXRlbGVzc192YWxpZGF0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZGM5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9kb2NzL3N0YXRlbGVzc192YWxpZGF0aW9uLm1kCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgTUQwNDEgLS0+Cis8IS0tIENvcHlyaWdodCAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuIC0tPgorWyFbS2hyb25vcyBWdWxrYW5dWzFdXVsyXQorCitbMV06IGh0dHBzOi8vdnVsa2FuLmx1bmFyZy5jb20vaW1nL1Z1bGthbl8xMDBweF9EZWMxNi5wbmcgImh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8iCitbMl06IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8KKworIyBTdGF0ZWxlc3MgUGFyYW1ldGVyIFZhbGlkYXRpb24KKworWyFbQ3JlYXRpdmUgQ29tbW9uc11bM11dWzRdCisKK1szXTogaHR0cHM6Ly9pLmNyZWF0aXZlY29tbW9ucy5vcmcvbC9ieS1uZC80LjAvODh4MzEucG5nICJDcmVhdGl2ZSBDb21tb25zIExpY2Vuc2UiCitbNF06IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uZC80LjAvCisKK1RoZSBzdGF0ZWxlc3MgcGFyYW1ldGVyIHZhbGlkYXRpb24gb2JqZWN0IGNoZWNrcyB0aGUgaW5wdXQgcGFyYW1ldGVycyB0byBBUEkgY2FsbHMgZm9yIHZhbGlkaXR5LgorVGhpcyBsYXllciBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHRhc2tzOgorCistIHZhbGlkYXRpb24gb2Ygc3RydWN0dXJlczsgc3RydWN0dXJlcyBhcmUgcmVjdXJzZWQgaWYgbmVjZXNzYXJ5CistIHZhbGlkYXRpb24gb2YgZW51bWVyYXRlZCB0eXBlIHZhbHVlcworLSBudWxsIHBvaW50ZXIgY29uZGl0aW9ucworLSBzdGF0ZWxlc3MgdmFsaWQgdXNhZ2UgY2hlY2tzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9kb2NzL3RocmVhZF9zYWZldHkubWQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9kb2NzL3RocmVhZF9zYWZldHkubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhY2I2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2RvY3MvdGhyZWFkX3NhZmV0eS5tZApAQCAtMCwwICsxLDE0IEBACis8IS0tIG1hcmtkb3dubGludC1kaXNhYmxlIE1EMDQxIC0tPgorWyFbS2hyb25vcyBWdWxrYW5dWzFdXVsyXQorCitbMV06IGh0dHBzOi8vdnVsa2FuLmx1bmFyZy5jb20vaW1nL1Z1bGthbl8xMDBweF9EZWMxNi5wbmcgImh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8iCitbMl06IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3Z1bGthbi8KKworIyBUaHJlYWQgU2FmZXR5IFZhbGlkYXRpb24KK1shW0NyZWF0aXZlIENvbW1vbnNdWzNdXVs0XQorCitbM106IGh0dHBzOi8vaS5jcmVhdGl2ZWNvbW1vbnMub3JnL2wvYnktbmQvNC4wLzg4eDMxLnBuZyAiQ3JlYXRpdmUgQ29tbW9ucyBMaWNlbnNlIgorWzRdOiBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmQvNC4wLworCitUaGUgdGhyZWFkIHNhZmV0eSB2YWxpZGF0aW9uIG9iamVjdCBjaGVja3MgbXVsdGktdGhyZWFkaW5nIG9mIEFQSSBjYWxscyBmb3IgdmFsaWRpdHkuICBDaGVja3MgcGVyZm9ybWVkCitpbmNsdWRlIGVuc3VyaW5nIHRoYXQgb25seSBvbmUgdGhyZWFkIGF0IGEgdGltZSB1c2VzIGFuIG9iamVjdCBpbiBmcmVlLXRocmVhZGVkIEFQSSBjYWxscy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2V4dGVybmFsL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvZXh0ZXJuYWwvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2M2U5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2V4dGVybmFsL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDUgQEAKKyMgfn5+CisjIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIH5+fgorCisjIEFkZCB5b3VyIG9wdGlvbmFsIGRlcGVuZGVuY2llcyBpbiB0aGlzICJleHRlcm5hbCIgZGlyZWN0b3J5LgorCisjIGdvb2dsZXRlc3QgaXMgYW4gb3B0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jeSBmb3IgdGhpcyByZXBvLgoraWYoQlVJTERfVEVTVFMpCisgICAgIyBBdHRlbXB0IHRvIGVuYWJsZSBnb29nbGV0ZXN0IGlmIGF2YWlsYWJsZS4KKworICAgICMgU3VwcHJlc3MgYWxsIHdhcm5pbmdzIGZyb20gZXh0ZXJuYWwgcHJvamVjdHMgKGkuZS46IGluIHRoaXMgZGlyZWN0b3J5J3Mgc2NvcGUpLgorICAgIGlmKENNQUtFX0NYWF9DT01QSUxFUl9JRCBNQVRDSEVTICJHTlUiIE9SIENNQUtFX0NYWF9DT01QSUxFUl9JRCBNQVRDSEVTICJDbGFuZyIpCisgICAgICAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfT1BUSU9OUyAiLXciKQorICAgIGVuZGlmKCkKKworICAgIGlmKFRBUkdFVCBndGVzdF9tYWluKQorICAgICAgICAjIEFscmVhZHkgZW5hYmxlZCBhcyBhIHRhcmdldCAocGVyaGFwcyBieSBhIHByb2plY3QgZW5jbG9zaW5nIHRoaXMgb25lKQorICAgICAgICBtZXNzYWdlKFNUQVRVUyAiVnVsa2FuLVZhbGlkYXRpb25MYXllcnMvZXh0ZXJuYWw6ICIgImdvb2dsZXRlc3QgYWxyZWFkeSBjb25maWd1cmVkIC0gdXNpbmcgaXQiKQorICAgIGVsc2VpZihJU19ESVJFQ1RPUlkgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9nb29nbGV0ZXN0IikKKyAgICAgICAgIyBUaGUgZ29vZ2xldGVzdCBkaXJlY3RvcnkgZXhpc3RzLCBzbyBlbmFibGUgaXQgYXMgYSB0YXJnZXQuCisgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJWdWxrYW4tVmFsaWRhdGlvbkxheWVycy9leHRlcm5hbDogIiAiZ29vZ2xldGVzdCBmb3VuZCAtIGNvbmZpZ3VyaW5nIGl0IGZvciB0ZXN0cyIpCisgICAgICAgIHNldChCVUlMRF9HVEVTVCBPTiBDQUNIRSBCT09MICJCdWlsZHMgdGhlIGdvb2dsZXRlc3Qgc3VicHJvamVjdCIpCisgICAgICAgIHNldChCVUlMRF9HTU9DSyBPRkYgQ0FDSEUgQk9PTCAiQnVpbGRzIHRoZSBnb29nbGVtb2NrIHN1YnByb2plY3QiKQorICAgICAgICBzZXQoZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydCBPTiBDQUNIRSBCT09MICJMaW5rIGd0ZXN0IHJ1bnRpbWVzIGR5bmFtaWNhbGx5IikKKyAgICAgICAgc2V0KEJVSUxEX1NIQVJFRF9MSUJTIE9OIENBQ0hFIEJPT0wgIkJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiKQorICAgICAgICAjIEVYQ0xVREVfRlJPTV9BTEwga2VlcHMgdGhlIGluc3RhbGwgdGFyZ2V0IGZyb20gaW5zdGFsbGluZyBHVEVTVCBmaWxlcy4KKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2dvb2dsZXRlc3QiIEVYQ0xVREVfRlJPTV9BTEwpCisgICAgZWxzZSgpCisgICAgICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiVnVsa2FuLVZhbGlkYXRpb25MYXllcnMvZXh0ZXJuYWw6ICIgIkdvb2dsZSBUZXN0IHdhcyBub3QgZm91bmQuICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBHb29nbGUgVGVzdCBpbiBleHRlcm5hbC9nb29nbGV0ZXN0IG9yIHNldCBCVUlMRF9URVNUUz1PRkYiKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTVkZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjYxIEBACisjIH5+fgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgfn5+CisKK2lmKFdJTjMyKQorICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgLURWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hYIC1EV0lOMzJfTEVBTl9BTkRfTUVBTikKKyAgICBhZGRfY3VzdG9tX3RhcmdldChta19sYXllcl9jb25maWdfZGlyIEFMTAorICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJDxDT05GSUc+KQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhta19sYXllcl9jb25maWdfZGlyIFBST1BFUlRJRVMgRk9MREVSICR7TEFZRVJTX0hFTFBFUl9GT0xERVJ9KQorZWxzZWlmKEFORFJPSUQpCisgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSIC1EVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hYKQorZWxzZWlmKEFQUExFKQorICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9NQUNPU19NVkspCisgICAgaWYoQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIl5YY29kZS4qIikKKyAgICAgICAgYWRkX2N1c3RvbV90YXJnZXQobWtfbGF5ZXJfY29uZmlnX2RpciBBTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8kPENPTkZJRz4pCisgICAgZW5kaWYoKQorZWxzZWlmKFVOSVggQU5EIE5PVCBBUFBMRSkgIyBpLmUuIExpbnV4CisgICAgaWYoQlVJTERfV1NJX1hDQl9TVVBQT1JUKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fWENCX0tIUiAtRFZLX1VTRV9QTEFURk9STV9YQ0JfS0hYKQorICAgIGVuZGlmKCkKKworICAgIGlmKEJVSUxEX1dTSV9YTElCX1NVUFBPUlQpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9YTElCX0tIUiAtRFZLX1VTRV9QTEFURk9STV9YTElCX0tIWCAtRFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQpCisgICAgZW5kaWYoKQorCisgICAgaWYoQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSIC1EVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hYKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuc3VwcG9ydGVkIFBsYXRmb3JtISIpCitlbmRpZigpCisKKyMgQ29uZmlndXJlIGluc3RhbGxhdGlvbiBvZiBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgZGVwZW5kZW5jaWVzIG9mIG90aGVyIHJlcG9zLgoraWYoQlVJTERfTEFZRVJfU1VQUE9SVF9GSUxFUykKKyAgICBzZXQoTEFZRVJfVVRJTF9GSUxFUworICAgICAgICBjYXN0X3V0aWxzLmgKKyAgICAgICAgaGFzaF91dGlsLmgKKyAgICAgICAgaGFzaF92a190eXBlcy5oCisgICAgICAgIHZrX2Zvcm1hdF91dGlscy5oCisgICAgICAgIHZrX2Zvcm1hdF91dGlscy5jcHAKKyAgICAgICAgdmtfbGF5ZXJfY29uZmlnLmgKKyAgICAgICAgdmtfbGF5ZXJfY29uZmlnLmNwcAorICAgICAgICB2a19sYXllcl9kYXRhLmgKKyAgICAgICAgdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmgKKyAgICAgICAgdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcAorICAgICAgICB2a19sYXllcl9sb2dnaW5nLmgKKyAgICAgICAgdmtfbGF5ZXJfdXRpbHMuaAorICAgICAgICB2a19sYXllcl91dGlscy5jcHAKKyAgICAgICAgdmtfbG9hZGVyX3BsYXRmb3JtLmgKKyAgICAgICAgZ2VuZXJhdGVkL3ZrX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZXMuaAorICAgICAgICBnZW5lcmF0ZWQvdmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaAorICAgICAgICBnZW5lcmF0ZWQvdmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgKKyAgICAgICAgZ2VuZXJhdGVkL3ZrX3NhZmVfc3RydWN0LmgKKyAgICAgICAgZ2VuZXJhdGVkL3ZrX3NhZmVfc3RydWN0LmNwcAorICAgICAgICBnZW5lcmF0ZWQvdmtfZW51bV9zdHJpbmdfaGVscGVyLmgKKyAgICAgICAgZ2VuZXJhdGVkL3ZrX29iamVjdF90eXBlcy5oCisgICAgICAgIGdlbmVyYXRlZC92a19leHRlbnNpb25faGVscGVyLmgKKyAgICAgICAgZ2VuZXJhdGVkL3ZrX3R5cGVtYXBfaGVscGVyLmgpCisgICAgaW5zdGFsbChGSUxFUyAke0xBWUVSX1VUSUxfRklMRVN9IERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9JTkNMVURFRElSfSkKK2VuZGlmKCkKKworc2V0KFRBUkdFVF9OQU1FUworICAgIFZrTGF5ZXJfa2hyb25vc192YWxpZGF0aW9uCisgICAgVmtMYXllcl9zdGFuZGFyZF92YWxpZGF0aW9uKQorCitpZihCVUlMRF9MQVlFUlMpCisgICAgIyBJbnN0YWxsIHRoZSBsYXllciBqc29uIGZpbGVzCisgICAgaWYoV0lOMzIpCisgICAgICAgIGlmKENNQUtFX0dFTkVSQVRPUiBNQVRDSEVTICJeVmlzdWFsIFN0dWRpby4qIikKKyAgICAgICAgICAgIGZvcmVhY2goVEFSR0VUX05BTUUgJHtUQVJHRVRfTkFNRVN9KQorICAgICAgICAgICAgICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyQ8Q09ORklHPi8ke1RBUkdFVF9OQU1FfS5qc29uIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQorICAgICAgICAgICAgZW5kZm9yZWFjaCgpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgZm9yZWFjaChUQVJHRVRfTkFNRSAke1RBUkdFVF9OQU1FU30pCisgICAgICAgICAgICAgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtUQVJHRVRfTkFNRX0uanNvbiBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSkKKyAgICAgICAgICAgIGVuZGZvcmVhY2goKQorICAgICAgICBlbmRpZigpCisgICAgZWxzZWlmKFVOSVgpICMgVU5JWCBpbmNsdWRlcyBBUFBMRQorICAgICAgICBmb3JlYWNoKFRBUkdFVF9OQU1FICR7VEFSR0VUX05BTUVTfSkKKyAgICAgICAgICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3N0YWdpbmctanNvbi8ke1RBUkdFVF9OQU1FfS5qc29uCisgICAgICAgICAgICAgICAgICAgIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9EQVRBUk9PVERJUn0vdnVsa2FuL2V4cGxpY2l0X2xheWVyLmQpCisgICAgICAgIGVuZGZvcmVhY2goKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBTeXN0ZW0tc3BlY2lmaWMgbWFjcm9zIHRvIGNyZWF0ZSBhIGxpYnJhcnkgdGFyZ2V0LgoraWYoV0lOMzIpCisgICAgbWFjcm8oQWRkVmtMYXllciB0YXJnZXQgTEFZRVJfQ09NUElMRV9ERUZJTklUSU9OUykKKyAgICAgICAgZmlsZShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vVmtMYXllcl8ke3RhcmdldH0uZGVmIERFRl9GSUxFKQorICAgICAgICBhZGRfY3VzdG9tX3RhcmdldChjb3B5LSR7dGFyZ2V0fS1kZWYtZmlsZSBBTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICR7REVGX0ZJTEV9IFZrTGF5ZXJfJHt0YXJnZXR9LmRlZgorICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJCQVRJTSkKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGNvcHktJHt0YXJnZXR9LWRlZi1maWxlIFBST1BFUlRJRVMgRk9MREVSICR7TEFZRVJTX0hFTFBFUl9GT0xERVJ9KQorCisgICAgICAgIGFkZF9saWJyYXJ5KFZrTGF5ZXJfJHt0YXJnZXR9IFNIQVJFRCAke0FSR059IFZrTGF5ZXJfJHt0YXJnZXR9LmRlZikKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMoVmtMYXllcl8ke3RhcmdldH0gUFVCTElDICR7TEFZRVJfQ09NUElMRV9ERUZJTklUSU9OU30pCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyXyR7dGFyZ2V0fSBQUklWQVRFIFZrTGF5ZXJfdXRpbHMpCisgICAgICAgIGFkZF9kZXBlbmRlbmNpZXMoVmtMYXllcl8ke3RhcmdldH0gVmtMYXllcl91dGlscykKKyAgICAgICAgaW5zdGFsbChUQVJHRVRTIFZrTGF5ZXJfJHt0YXJnZXR9IERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQorICAgIGVuZG1hY3JvKCkKK2Vsc2VpZihBUFBMRSkKKyAgICBtYWNybyhBZGRWa0xheWVyIHRhcmdldCBMQVlFUl9DT01QSUxFX0RFRklOSVRJT05TKQorICAgICAgICBhZGRfbGlicmFyeShWa0xheWVyXyR7dGFyZ2V0fSBTSEFSRUQgJHtBUkdOfSkKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMoVmtMYXllcl8ke3RhcmdldH0gUFVCTElDICR7TEFZRVJfQ09NUElMRV9ERUZJTklUSU9OU30pCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyXyR7dGFyZ2V0fSBQUklWQVRFIFZrTGF5ZXJfdXRpbHMpCisgICAgICAgIGFkZF9kZXBlbmRlbmNpZXMoVmtMYXllcl8ke3RhcmdldH0gVmtMYXllcl91dGlscykKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZrTGF5ZXJfJHt0YXJnZXR9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUSUVTIExJTktfRkxBR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1XbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5TVEFMTF9SUEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQGxvYWRlcl9wYXRoLyIpCisgICAgICAgIGluc3RhbGwoVEFSR0VUUyBWa0xheWVyXyR7dGFyZ2V0fSBERVNUSU5BVElPTiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisgICAgZW5kbWFjcm8oKQorZWxzZShVTklYIEFORCBOT1QgQVBQTEUpICMgaS5lLjogTGludXgKKyAgICBtYWNybyhBZGRWa0xheWVyIHRhcmdldCBMQVlFUl9DT01QSUxFX0RFRklOSVRJT05TKQorICAgICAgICBhZGRfbGlicmFyeShWa0xheWVyXyR7dGFyZ2V0fSBTSEFSRUQgJHtBUkdOfSkKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMoVmtMYXllcl8ke3RhcmdldH0gUFVCTElDICR7TEFZRVJfQ09NUElMRV9ERUZJTklUSU9OU30pCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyXyR7dGFyZ2V0fSBQUklWQVRFIFZrTGF5ZXJfdXRpbHMpCisgICAgICAgIGFkZF9kZXBlbmRlbmNpZXMoVmtMYXllcl8ke3RhcmdldH0gVmtMYXllcl91dGlscykKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFBST1BFUlRJRVMgTElOS19GTEFHUyAiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYlZrTGF5ZXJfJHt0YXJnZXR9Lm1hcCwtQnN5bWJvbGljLC0tZXhjbHVkZS1saWJzLEFMTCIpCisgICAgICAgIGluc3RhbGwoVEFSR0VUUyBWa0xheWVyXyR7dGFyZ2V0fSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSkKKyAgICBlbmRtYWNybygpCitlbmRpZigpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9nZW5lcmF0ZWQgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSfSkKKworaWYoV0lOMzIpCisgICAgIyBBcHBsaWVzIHRvIGFsbCBjb25maWd1cmF0aW9ucworICAgIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTKQorICAgICMgQXZvaWQ6IGZhdGFsIGVycm9yIEMxMTI4OiBudW1iZXIgb2Ygc2VjdGlvbnMgZXhjZWVkZWQgb2JqZWN0IGZpbGUgZm9ybWF0IGxpbWl0OiBjb21waWxlIHdpdGggL2JpZ29iagorICAgIGFkZF9jb21waWxlX29wdGlvbnMoIi9iaWdvYmoiKQorICAgICMgQWxsb3cgV2luZG93cyB0byB1c2UgbXVsdGlwcm9jZXNzb3IgY29tcGlsYXRpb24KKyAgICBhZGRfY29tcGlsZV9vcHRpb25zKC9NUCkKKyAgICAjIFR1cm4gb2ZmIHRyYW5zaXRpb25hbCAiY2hhbmdlZCBiZWhhdmlvciIgd2FybmluZyBtZXNzYWdlIGZvciBWaXN1YWwgU3R1ZGlvIHZlcnNpb25zIHByaW9yIHRvIDIwMTUuIFRoZSBjaGFuZ2VkIGJlaGF2aW9yIGlzCisgICAgIyB0aGF0IGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBhcmUgbm93IGZpeGVkIHRvIGNsZWFyIHRoZSBzdHJ1Y3QgbWVtYmVycy4KKyAgICBhZGRfY29tcGlsZV9vcHRpb25zKCIkPCQ8QU5EOiQ8Q1hYX0NPTVBJTEVSX0lEOk1TVkM+LCQ8VkVSU0lPTl9MRVNTOiQ8Q1hYX0NPTVBJTEVSX1ZFUlNJT04+LDE5Pj46L3dkNDM1MT4iKQorZWxzZSgpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1XcG9pbnRlci1hcml0aCAtV25vLXVudXNlZC1mdW5jdGlvbiAtV25vLXNpZ24tY29tcGFyZSIpCisgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLVdwb2ludGVyLWFyaXRoIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIC1Xbm8tc2lnbi1jb21wYXJlIikKK2VuZGlmKCkKKworIyBDbGFuZyB3YXJucyBhYm91dCB1bnVzZWQgY29uc3QgdmFyaWFibGVzLiBHZW5lcmF0ZWQgZmlsZXMgbWF5IHB1cnBvc2VseSBjb250YWluIHVudXNlZCBjb25zdHMsIHNvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIGluIENsYW5nCitpZihDTUFLRV9DX0NPTVBJTEVSX0lEIE1BVENIRVMgIkNsYW5nIikKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMocGFyYW1ldGVyX3ZhbGlkYXRpb24uY3BwIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLVduby11bnVzZWQtY29uc3QtdmFyaWFibGUiKQorZW5kaWYoKQorCitzZXQoQ0hBU1NJU19MSUJSQVJZX0ZJTEVTCisgICAgZ2VuZXJhdGVkL2NoYXNzaXMuY3BwCisgICAgZ2VuZXJhdGVkL2xheWVyX2NoYXNzaXNfZGlzcGF0Y2guY3BwCisgICAgZ2VuZXJhdGVkL2NvbW1hbmRfY291bnRlcl9oZWxwZXIuY3BwCisgICAgc3RhdGVfdHJhY2tlci5jcHApCisKK3NldChDT1JFX1ZBTElEQVRJT05fTElCUkFSWV9GSUxFUworICAgIGNvcmVfdmFsaWRhdGlvbi5jcHAKKyAgICBkcmF3ZGlzcGF0Y2guY3BwCisgICAgY29udmVydF90b19yZW5kZXJwYXNzMi5jcHAKKyAgICBkZXNjcmlwdG9yX3NldHMuY3BwCisgICAgYnVmZmVyX3ZhbGlkYXRpb24uY3BwCisgICAgc2hhZGVyX3ZhbGlkYXRpb24uY3BwCisgICAgZ3B1X3ZhbGlkYXRpb24uY3BwCisgICAgeHhoYXNoLmMpCisKK3NldChPQkpFQ1RfTElGRVRJTUVTX0xJQlJBUllfRklMRVMKKyAgICBnZW5lcmF0ZWQvb2JqZWN0X3RyYWNrZXIuY3BwCisgICAgZ2VuZXJhdGVkL29iamVjdF90cmFja2VyLmgKKyAgICBvYmplY3RfdHJhY2tlcl91dGlscy5jcHApCisKK3NldChUSFJFQURfU0FGRVRZX0xJQlJBUllfRklMRVMKKyAgICBnZW5lcmF0ZWQvdGhyZWFkX3NhZmV0eS5jcHAKKyAgICBnZW5lcmF0ZWQvdGhyZWFkX3NhZmV0eS5oKQorCitzZXQoU1RBVEVMRVNTX1ZBTElEQVRJT05fTElCUkFSWV9GSUxFUworICAgIGdlbmVyYXRlZC9wYXJhbWV0ZXJfdmFsaWRhdGlvbi5jcHAKKyAgICBnZW5lcmF0ZWQvcGFyYW1ldGVyX3ZhbGlkYXRpb24uaAorICAgIHBhcmFtZXRlcl92YWxpZGF0aW9uX3V0aWxzLmNwcCkKKworc2V0KEJFU1RfUFJBQ1RJQ0VTX0xJQlJBUllfRklMRVMKKyAgICBiZXN0X3ByYWN0aWNlcy5jcHAKKyAgICBiZXN0X3ByYWN0aWNlcy5oKQorCitzZXQoR1BVX0FTU0lTVEVEX0xJQlJBUllfRklMRVMKKyAgICBncHVfdmFsaWRhdGlvbi5jcHAKKyAgICBncHVfdmFsaWRhdGlvbi5oKQorCitpZihCVUlMRF9MQVlFUlMpCisgICAgQWRkVmtMYXllcihraHJvbm9zX3ZhbGlkYXRpb24gIiIKKyAgICAgICAgJHtDSEFTU0lTX0xJQlJBUllfRklMRVN9CisgICAgICAgICR7Q09SRV9WQUxJREFUSU9OX0xJQlJBUllfRklMRVN9CisgICAgICAgICR7T0JKRUNUX0xJRkVUSU1FU19MSUJSQVJZX0ZJTEVTfQorICAgICAgICAke1RIUkVBRF9TQUZFVFlfTElCUkFSWV9GSUxFU30KKyAgICAgICAgJHtTVEFURUxFU1NfVkFMSURBVElPTl9MSUJSQVJZX0ZJTEVTfQorICAgICAgICAke0JFU1RfUFJBQ1RJQ0VTX0xJQlJBUllfRklMRVN9CisgICAgICAgICR7R1BVX0FTU0lTVEVEX0xJQlJBUllfRklMRVN9KQorCisgICAgIyBLaHJvbm9zIHZhbGlkYXRpb24gYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKKyAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWa0xheWVyX2tocm9ub3NfdmFsaWRhdGlvbiBQUklWQVRFICR7R0xTTEFOR19TUElSVl9JTkNMVURFX0RJUn0pCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoVmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24gUFJJVkFURSAke1NQSVJWX1RPT0xTX0lOQ0xVREVfRElSfSkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoVmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24gUFJJVkFURSAke1NQSVJWX1RPT0xTX0xJQlJBUklFU30pCisKKyAgICAjIFRoZSBvdXRwdXQgZmlsZSBuZWVkcyBVbml4ICIvIiBzZXBhcmF0b3JzIG9yIFdpbmRvd3MgIlwiIHNlcGFyYXRvcnMgT24gdG9wIG9mIHRoYXQsIFdpbmRvd3Mgc2VwYXJhdG9ycyBhY3R1YWxseSBuZWVkIHRvIGJlIGRvdWJsZWQKKyAgICAjIGJlY2F1c2UgdGhlIGpzb24gZm9ybWF0IHVzZXMgYmFja3NsYXNoIGVzY2FwZXMKKyAgICBmaWxlKFRPX05BVElWRV9QQVRIICIuLyIgUkVMQVRJVkVfUEFUSF9QUkVGSVgpCisgICAgc3RyaW5nKFJFUExBQ0UgIlxcIgorICAgICAgICAgICAgICAgICAgICJcXFxcIgorICAgICAgICAgICAgICAgICAgIFJFTEFUSVZFX1BBVEhfUFJFRklYCisgICAgICAgICAgICAgICAgICAgIiR7UkVMQVRJVkVfUEFUSF9QUkVGSVh9IikKKworICAgICMgUnVuIGVhY2ggLmpzb24uaW4gZmlsZSB0aHJvdWdoIHRoZSBnZW5lcmF0b3IgV2UgbmVlZCB0byBjcmVhdGUgdGhlIGdlbmVyYXRvci5jbWFrZSBzY3JpcHQgc28gdGhhdCB0aGUgZ2VuZXJhdG9yIGNhbiBiZSBydW4gYXQKKyAgICAjIGNvbXBpbGUgdGltZSwgaW5zdGVhZCBvZiBjb25maWd1cmUgdGltZSBSdW5uaW5nIGF0IGNvbXBpbGUgdGltZSBsZXRzIHVzIHVzZSBjbWFrZSBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKFRBUkdFVF9GSUxFX05BTUUgYW5kCisgICAgIyBUQVJHRVRfRklMRV9ESVIsIHNwZWNpZmljYWxseSkKKyAgICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuZXJhdG9yLmNtYWtlIiAiY29uZmlndXJlX2ZpbGUoXCJcJHtJTlBVVF9GSUxFfVwiIFwiXCR7T1VUUFVUX0ZJTEV9XCIpIikKKyAgICBmb3JlYWNoKFRBUkdFVF9OQU1FICR7VEFSR0VUX05BTUVTfSkKKyAgICAgICAgc2V0KENPTkZJR19ERUZJTkVTIC1ESU5QVVRfRklMRT0iJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2pzb24vJHtUQVJHRVRfTkFNRX0uanNvbi5pbiIgLURWS19WRVJTSU9OPTEuMS4ke3ZrX2hlYWRlcl92ZXJzaW9ufSkKKyAgICAgICAgIyBJZiB0aGlzIGpzb24gZmlsZSBpcyBub3QgYSBtZXRhbGF5ZXIsIGdldCB0aGUgbmVlZGVkIHByb3BlcnRpZXMgZnJvbSB0aGF0IHRhcmdldAorICAgICAgICBpZihUQVJHRVQgJHtUQVJHRVRfTkFNRX0pCisgICAgICAgICAgICBzZXQoQ09ORklHX0RFRklORVMKKyAgICAgICAgICAgICAgICAke0NPTkZJR19ERUZJTkVTfQorICAgICAgICAgICAgICAgIC1ET1VUUFVUX0ZJTEU9IiQ8VEFSR0VUX0ZJTEVfRElSOiR7VEFSR0VUX05BTUV9Pi8ke1RBUkdFVF9OQU1FfS5qc29uIgorICAgICAgICAgICAgICAgIC1EUkVMQVRJVkVfTEFZRVJfQklOQVJZPSIke1JFTEFUSVZFX1BBVEhfUFJFRklYfSQ8VEFSR0VUX0ZJTEVfTkFNRToke1RBUkdFVF9OQU1FfT4iKQorICAgICAgICAgICAgIyBJZiB0aGlzIGpzb24gZmlsZSBpcyBhIG1ldGFsYXllciwgbWFrZSB0aGUgb3V0cHV0IHBhdGggbWF0Y2ggY29yZSB2YWxpZGF0aW9uLCBhbmQgdGhlcmUgaXMgbm8gbGF5ZXIgYmluYXJ5IGZpbGUKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBzZXQoQ09ORklHX0RFRklORVMgJHtDT05GSUdfREVGSU5FU30gLURPVVRQVVRfRklMRT0iJDxUQVJHRVRfRklMRV9ESVI6VmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24+LyR7VEFSR0VUX05BTUV9Lmpzb24iKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7VEFSR0VUX05BTUV9LWpzb24gQUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAke0NPTkZJR19ERUZJTkVTfSAtUCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbmVyYXRvci5jbWFrZSIpCisgICAgICAgIGlmKENNQUtFX0dFTkVSQVRPUiBNQVRDSEVTICJeVmlzdWFsIFN0dWRpby4qIikKKyAgICAgICAgICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke1RBUkdFVF9OQU1FfS1qc29uIFBST1BFUlRJRVMgRk9MREVSICR7TEFZRVJTX0hFTFBFUl9GT0xERVJ9KQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisKKyAgICAjIEZvciBVTklYLWJhc2VkIHN5c3RlbXMsIGBsaWJyYXJ5X3BhdGhgIHNob3VsZCBub3QgY29udGFpbiBhIHJlbGF0aXZlIHBhdGggKGluZGljYXRlZCBieSAiLi8iKSBiZWZvcmUgaW5zdGFsbGluZyB0byBzeXN0ZW0KKyAgICAjIGRpcmVjdG9yaWVzLCBzbyB3ZSBkbyBub3QgaW5jbHVkZSBpdCBpbiB0aGUgc3RhZ2luZy1qc29uIGZpbGVzIHdoaWNoIGFyZSB1c2VkIGZvciBpbnN0YWxsYXRpb24KKyAgICBpZihVTklYKQorICAgICAgICBmb3JlYWNoKFRBUkdFVF9OQU1FICR7VEFSR0VUX05BTUVTfSkKKyAgICAgICAgICAgIHNldChJTlNUQUxMX0RFRklORVMKKyAgICAgICAgICAgICAgICAtRElOUFVUX0ZJTEU9IiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9qc29uLyR7VEFSR0VUX05BTUV9Lmpzb24uaW4iCisgICAgICAgICAgICAgICAgLURPVVRQVVRfRklMRT0iJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3N0YWdpbmctanNvbi8ke1RBUkdFVF9OQU1FfS5qc29uIgorICAgICAgICAgICAgICAgIC1EVktfVkVSU0lPTj0xLjEuJHt2a19oZWFkZXJfdmVyc2lvbn0pCisgICAgICAgICAgICAjIElmIHRoaXMganNvbiBmaWxlIGlzIG5vdCBhIG1ldGFsYXllciwgZ2V0IHRoZSBuZWVkZWQgcHJvcGVydGllcyBmcm9tIHRoYXQgdGFyZ2V0CisgICAgICAgICAgICBpZihUQVJHRVQgJHtUQVJHRVRfTkFNRX0pCisgICAgICAgICAgICAgICAgc2V0KElOU1RBTExfREVGSU5FUyAke0lOU1RBTExfREVGSU5FU30gLURSRUxBVElWRV9MQVlFUl9CSU5BUlk9IiQ8VEFSR0VUX0ZJTEVfTkFNRToke1RBUkdFVF9OQU1FfT4iKQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICAgICAgYWRkX2N1c3RvbV90YXJnZXQoJHtUQVJHRVRfTkFNRX0tc3RhZ2luZy1qc29uIEFMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9ICR7SU5TVEFMTF9ERUZJTkVTfSAtUCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbmVyYXRvci5jbWFrZSIpCisgICAgICAgIGVuZGZvcmVhY2goKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9Wa0xheWVyX2tocm9ub3NfdmFsaWRhdGlvbi5kZWYgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvVmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24uZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYmZjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvVmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24uZGVmCkBAIC0wLDAgKzEsMzAgQEAKKworOzs7OyBCZWdpbiBDb3B5cmlnaHQgTm90aWNlIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKzsKKzsgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorOyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorOyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKzsgIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BMdW5hckcuY29tPgorOworOzs7OyAgRW5kIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKworTElCUkFSWSBWa0xheWVyX2tocm9ub3NfdmFsaWRhdGlvbgorRVhQT1JUUwordmtHZXRJbnN0YW5jZVByb2NBZGRyCit2a0dldERldmljZVByb2NBZGRyCit2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzCit2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcwordmtOZWdvdGlhdGVMb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9hbmRyb2lkX25ka190eXBlcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2FuZHJvaWRfbmRrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1ZjEyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9hbmRyb2lkX25ka190eXBlcy5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9OREtfVFlQRVNfSF8KKyNkZWZpbmUgQU5EUk9JRF9OREtfVFlQRVNfSF8KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisvLyBBbGwgZXVtcyByZWZlcmVuY2VkIGJ5IFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyIGFyZSBwcmVzZW50IGluCisvLyB0aGUgcGxhdGZvcm0tMjggKEFuZHJvaWQgUCkgdmVyc2lvbnMgb2YgdGhlIGhlYWRlciBmaWxlcy4gIEEgcGFydGlhbCBzZXQgZXhpc3RzIGluIHRoZQorLy8gcGxhdGZvcm0tMjYgKE8pIGhlYWRlcnMsIHdoZXJlIGhhcmR3YXJlX2J1ZmZlci5oIGZpcnN0IGFwcGVhcnMgaW4gdGhlIE5ESy4KKy8vCisvLyBCdWlsZGluZyBWdWxrYW4gdmFsaWRhdGlvbiB3aXRoIE5ESyBoZWFkZXIgZmlsZXMgcHJpb3IgdG8gcGxhdGZvcm0tMjYgaXMgbm90IHN1cHBvcnRlZC4KKy8vCisvLyBEZWNvZGVyIHJpbmcgZm9yIEFuZHJvaWQgY29tcGlsZSBzeW1ib2xzIGZvdW5kIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyb2lkLW5kay9uZGsvaXNzdWVzLzQwNworCisjaWZkZWYgX19BTkRST0lEX18gIC8vIENvbXBpbGluZyBmb3IgQW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYXBpLWxldmVsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4gIC8vIEZpcnN0IGFwcGVhcmFuY2UgaW4gQW5kcm9pZCBPIChwbGF0Zm9ybS0yNikKKworLy8gSWYgTkRLIGlzIE8gKHBsYXRmb3JtLTI2IG9yIC0yNyksIHN1cHBsZW1lbnQgdGhlIG1pc3NpbmcgZW51bXMgd2l0aCBwcmUtcHJvY2Vzc29yIGRlZmluZWQgbGl0ZXJhbHMKKy8vIElmIEFuZHJvaWQgUCBvciBsYXRlciwgdGhlbiBhbGwgcmVxdWlyZWQgZW51bXMgYXJlIGFscmVhZHkgZGVmaW5lZAorI2lmIGRlZmluZWQoX19BTkRST0lEX0FQSV9PX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUElfUF9fKQorLy8gRm9ybWF0cworI2RlZmluZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0QxNl9VTk9STSAweDMwCisjZGVmaW5lIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDI0X1VOT1JNIDB4MzEKKyNkZWZpbmUgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVCAweDMyCisjZGVmaW5lIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDMyX0ZMT0FUIDB4MzMKKyNkZWZpbmUgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMzJfRkxPQVRfUzhfVUlOVCAweDM0CisjZGVmaW5lIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUzhfVUlOVCAweDM1CisvLyBVc2FnZSBiaXRzCisjZGVmaW5lIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ1VCRV9NQVAgMHgyMDAwMDAwCisjZGVmaW5lIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfTUlQTUFQX0NPTVBMRVRFIDB4NDAwMDAwMAorI2VuZGlmICAvLyBfX0FORFJPSURfQVBJX09fXyAmJiAhX1BfXworCisjZWxzZSAgLy8gTm90IF9fQU5EUk9JRF9fLCBidXQgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBUaGlzIGNvbWJpbmF0aW9uIHNob3VsZCBub3QgYmUgc2VlbiBpbiB0aGUgd2lsZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGFsbG93IHRlc3RpbmcKKy8vIG9mIHRoZSBBSEIgZXh0ZW5zaW9uIHZhbGlkYXRpb24gb24gb3RoZXIgcGxhdGZvcm1zIHVzaW5nIE1vY2tJQ0QKKy8vCisvLyBEZWZpbmUgdGhlIG1pbmltYWwgc2V0IG9mIE5ESyBlbnVtcyBhbmQgc3RydWN0cyBuZWVkZWQgdG8gY29tcGlsZQorLy8gVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIgdmFsaWRhdGlvbiB3aXRob3V0IGFuIE5ESyBwcmVzZW50CitzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyIHt9OworCisvLyBFbnVtZXJhdGlvbnMgb2YgZm9ybWF0IGFuZCB1c2FnZSBmbGFncyBmb3IgQW5kcm9pZCBvcGFxdWUgZXh0ZXJuYWwgbWVtb3J5IGJsb2JzCit0eXBlZGVmIGVudW0gQUhhcmR3YXJlQnVmZmVyRm9ybWF0IHsKKyAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOEE4X1VOT1JNID0gMSwKKyAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNID0gMiwKKyAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOF9VTk9STSA9IDMsCisgICAgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SNUc2QjVfVU5PUk0gPSA0LAorICAgIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjE2RzE2QjE2QTE2X0ZMT0FUID0gMHgxNiwKKyAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNID0gMHgyYiwKKyAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0QxNl9VTk9STSA9IDB4MzAsCisgICAgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMjRfVU5PUk0gPSAweDMxLAorICAgIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQgPSAweDMyLAorICAgIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDMyX0ZMT0FUID0gMHgzMywKKyAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0QzMl9GTE9BVF9TOF9VSU5UID0gMHgzNCwKKyAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1M4X1VJTlQgPSAweDM1LAorICAgIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfQkxPQiA9IDB4MjEKK30gQUhhcmR3YXJlQnVmZmVyRm9ybWF0OworCit0eXBlZGVmIGVudW0gQUhhcmR3YXJlQnVmZmVyVXNhZ2UgeworICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRSA9IDB4MTAwLAorICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUID0gMHgyMDAsCisgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DVUJFX01BUCA9IDB4MjAwMDAwMCwKKyAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSA9IDB4NDAwMDAwMCwKKyAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUFJPVEVDVEVEX0NPTlRFTlQgPSAweDQwMDAsCisgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9EQVRBX0JVRkZFUiA9IDB4MTAwMDAwMAorfSBBSGFyZHdhcmVCdWZmZXJVc2FnZTsKKwordHlwZWRlZiBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgeworICAgIHVpbnQzMl90IGZvcm1hdDsgIC8vCSAgIE9uZSBvZiBBSEFSRFdBUkVCVUZGRVJfRk9STUFUXyouCisgICAgdWludDMyX3QgaGVpZ2h0OyAgLy8JICAgSGVpZ2h0IGluIHBpeGVscy4KKyAgICB1aW50MzJfdCBsYXllcnM7ICAvLwkgICBOdW1iZXIgb2YgaW1hZ2VzIGluIGFuIGltYWdlIGFycmF5LgorICAgIHVpbnQzMl90IHJmdTA7ICAgIC8vCSAgIEluaXRpYWxpemUgdG8gemVybywgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgICAgdWludDY0X3QgcmZ1MTsgICAgLy8JICAgSW5pdGlhbGl6ZSB0byB6ZXJvLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAgICB1aW50MzJfdCBzdHJpZGU7ICAvLwkgICBSb3cgc3RyaWRlIGluIHBpeGVscywgaWdub3JlZCBmb3IgQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCkKKyAgICB1aW50NjRfdCB1c2FnZTsgICAvLwkgICBDb21iaW5hdGlvbiBvZiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfKi4KKyAgICB1aW50MzJfdCB3aWR0aDsgICAvLwkgICBXaWR0aCBpbiBwaXhlbHMuCit9IEFIYXJkd2FyZUJ1ZmZlcl9EZXNjOworCisvLyBNaW5pbWFsIE5ESyBmeG4gc3R1YnMgdG8gYWxsb3cgdGVzdGluZyBvbiBuZGstbGVzcyBwbGF0Zm9ybQorc3RhdGljIGlubGluZSBpbnQgQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKGNvbnN0IEFIYXJkd2FyZUJ1ZmZlcl9EZXNjICphaGJEZXNjLCBBSGFyZHdhcmVCdWZmZXIgKipidWZmZXIpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IGFoYkRlc2MtPmhlaWdodCAqIGFoYkRlc2MtPndpZHRoICogODsgIC8vIEFsbG9jIGZvciBsYXJnZXN0ICg2NCBicHApIGZvcm1hdAorICAgIGlmIChzaXplIDwgc2l6ZW9mKEFIYXJkd2FyZUJ1ZmZlcl9EZXNjKSkgc2l6ZSA9IHNpemVvZihBSGFyZHdhcmVCdWZmZXJfRGVzYyk7CisgICAgKmJ1ZmZlciA9IChBSGFyZHdhcmVCdWZmZXIgKiltYWxsb2Moc2l6ZSk7CisgICAgbWVtY3B5KCh2b2lkICopKCpidWZmZXIpLCAodm9pZCAqKWFoYkRlc2MsIHNpemVvZihBSGFyZHdhcmVCdWZmZXJfRGVzYykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoQUhhcmR3YXJlQnVmZmVyICpidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyKSBmcmVlKGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBBSGFyZHdhcmVCdWZmZXJfZGVzY3JpYmUoY29uc3QgQUhhcmR3YXJlQnVmZmVyICpidWZmZXIsIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjICpvdXREZXNjKSB7CisgICAgaWYgKGJ1ZmZlciAmJiBvdXREZXNjKSB7CisgICAgICAgIG1lbWNweSgodm9pZCAqKW91dERlc2MsICh2b2lkICopYnVmZmVyLCBzaXplb2YoQUhhcmR3YXJlQnVmZmVyX0Rlc2MpKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisjZW5kaWYgIC8vIF9fQU5EUk9JRF9fCisKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9OREtfVFlQRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9iZXN0X3ByYWN0aWNlcy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvYmVzdF9wcmFjdGljZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODgzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvYmVzdF9wcmFjdGljZXMuY3BwCkBAIC0wLDAgKzEsODY0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDYW1kZW4gU3RvY2tlciA8Y2FtZGVuQGx1bmFyZy5jb20+CisgKi8KKworI2luY2x1ZGUgImJlc3RfcHJhY3RpY2VzLmgiCisjaW5jbHVkZSAibGF5ZXJfY2hhc3Npc19kaXNwYXRjaC5oIgorI2luY2x1ZGUgImJlc3RfcHJhY3RpY2VzX2Vycm9yX2VudW1zLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworLy8gZ2V0IHRoZSBBUEkgbmFtZSBpcyBwcm9wZXIgZm9ybWF0CitzdGQ6OnN0cmluZyBCZXN0UHJhY3RpY2VzOjpHZXRBUElWZXJzaW9uTmFtZSh1aW50MzJfdCB2ZXJzaW9uKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gdmVyc2lvbl9uYW1lOworICAgIHVpbnQzMl90IG1ham9yID0gVktfVkVSU0lPTl9NQUpPUih2ZXJzaW9uKTsKKyAgICB1aW50MzJfdCBtaW5vciA9IFZLX1ZFUlNJT05fTUlOT1IodmVyc2lvbik7CisgICAgdWludDMyX3QgcGF0Y2ggPSBWS19WRVJTSU9OX1BBVENIKHZlcnNpb24pOworCisgICAgdmVyc2lvbl9uYW1lIDw8IG1ham9yIDw8ICIuIiA8PCBtaW5vciA8PCAiLiIgPDwgcGF0Y2ggPDwgIiAoMHgiIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg4KSA8PCBzdGQ6OmhleCA8PCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgIDw8ICIpIjsKKworICAgIHJldHVybiB2ZXJzaW9uX25hbWUuc3RyKCk7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UqIHBJbnN0YW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworICAgICAgICBpZiAod2hpdGVfbGlzdChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIGtEZXZpY2VFeHRlbnNpb25OYW1lcykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfQ3JlYXRlSW5zdGFuY2VfRXh0ZW5zaW9uTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW5zdGFuY2UoKTogQXR0ZW1wdGluZyB0byBlbmFibGUgRGV2aWNlIEV4dGVuc2lvbiAlcyBhdCBDcmVhdGVJbnN0YW5jZSB0aW1lLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIEJlc3RQcmFjdGljZXM6OlByZUNhbGxSZWNvcmRDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UqIHBJbnN0YW5jZSkgeworICAgIGluc3RhbmNlX2FwaV92ZXJzaW9uID0gcENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8tPmFwaVZlcnNpb247Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlKiBwRGV2aWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICAvLyBnZXQgQVBJIHZlcnNpb24gb2YgcGh5c2ljYWwgZGV2aWNlIHBhc3NlZCB3aGVuIGNyZWF0aW5nIGRldmljZS4KKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBwaHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc3t9OworICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCAmcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMpOworICAgIGF1dG8gZGV2aWNlX2FwaV92ZXJzaW9uID0gcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMuYXBpVmVyc2lvbjsKKworICAgIC8vIGNoZWNrIGFwaSB2ZXJzaW9ucyBhbmQgd2FybiBpZiBpbnN0YW5jZSBhcGkgVmVyc2lvbiBpcyBoaWdoZXIgdGhhbiB2ZXJzaW9uIG9uIGRldmljZS4KKyAgICBpZiAoaW5zdGFuY2VfYXBpX3ZlcnNpb24gPiBkZXZpY2VfYXBpX3ZlcnNpb24pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5zdF9hcGlfbmFtZSA9IEdldEFQSVZlcnNpb25OYW1lKGluc3RhbmNlX2FwaV92ZXJzaW9uKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGV2X2FwaV9uYW1lID0gR2V0QVBJVmVyc2lvbk5hbWUoZGV2aWNlX2FwaV92ZXJzaW9uKTsKKworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfQ3JlYXRlRGV2aWNlX0FQSV9NaXNtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZURldmljZSgpOiBBUEkgVmVyc2lvbiBvZiBjdXJyZW50IGluc3RhbmNlLCAlcyBpcyBoaWdoZXIgdGhhbiBBUEkgVmVyc2lvbiBvbiBkZXZpY2UsICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RfYXBpX25hbWUuY19zdHIoKSwgZGV2X2FwaV9uYW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHdoaXRlX2xpc3QocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBrSW5zdGFuY2VFeHRlbnNpb25OYW1lcykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfQ3JlYXRlSW5zdGFuY2VfRXh0ZW5zaW9uTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRGV2aWNlKCk6IEF0dGVtcHRpbmcgdG8gZW5hYmxlIEluc3RhbmNlIEV4dGVuc2lvbiAlcyBhdCBDcmVhdGVEZXZpY2UgdGltZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHBkX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgaWYgKChwZF9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzU3RhdGUgPT0gVU5DQUxMRUQpICYmIChwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcyAhPSBOVUxMKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfQ3JlYXRlRGV2aWNlX1BERmVhdHVyZXNOb3RDYWxsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXZpY2UoKSBjYWxsZWQgYmVmb3JlIGdldHRpbmcgcGh5c2ljYWwgZGV2aWNlIGZlYXR1cmVzIGZyb20gdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKCkuIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtCdWZmZXIqIHBCdWZmZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmICgocENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA+IDEpICYmIChwQ3JlYXRlSW5mby0+c2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmZmVySGV4OworICAgICAgICBidWZmZXJIZXggPDwgIjB4IiA8PCBzdGQ6OmhleCA8PCBIYW5kbGVUb1VpbnQ2NChwQnVmZmVyKTsKKworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfU2hhcmluZ01vZGVFeGNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBCdWZmZXIgKCVzKSBzcGVjaWZpZXMgYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSB3aGlsZSBzcGVjaWZ5aW5nIG11bHRpcGxlIHF1ZXVlcyAiCisgICAgICAgICAgICAgICAgICAgICIocXVldWVGYW1pbHlJbmRleENvdW50IG9mICUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJIZXguc3RyKCkuY19zdHIoKSwgcENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbWFnZSogcEltYWdlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoKHBDcmVhdGVJbmZvLT5xdWV1ZUZhbWlseUluZGV4Q291bnQgPiAxKSAmJiAocENyZWF0ZUluZm8tPnNoYXJpbmdNb2RlID09IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGltYWdlSGV4OworICAgICAgICBpbWFnZUhleCA8PCAiMHgiIDw8IHN0ZDo6aGV4IDw8IEhhbmRsZVRvVWludDY0KHBJbWFnZSk7CisKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX1NoYXJpbmdNb2RlRXhjbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogSW1hZ2UgKCVzKSBzcGVjaWZpZXMgYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSB3aGlsZSBzcGVjaWZ5aW5nIG11bHRpcGxlIHF1ZXVlcyAiCisgICAgICAgICAgICAgICAgICAgICIocXVldWVGYW1pbHlJbmRleENvdW50IG9mICUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICBpbWFnZUhleC5zdHIoKS5jX3N0cigpLCBwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTd2FwY2hhaW5LSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N3YXBjaGFpbktIUiogcFN3YXBjaGFpbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKCk7CisKKyAgICBpZiAocGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUlN0YXRlID09IFVOQ0FMTEVEKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX1N3YXBjaGFpbl9HZXRTdXJmYWNlTm90Q2FsbGVkLAorICAgICAgICAgICAgInZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgY2FsbGVkIGJlZm9yZSBnZXR0aW5nIHN1cmZhY2UgY2FwYWJpbGl0aWVzIGZyb20gdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoKS4iKTsKKyAgICB9CisKKyAgICBpZiAocGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUlN0YXRlICE9IFFVRVJZX0RFVEFJTFMpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX1N3YXBjaGFpbl9HZXRTdXJmYWNlTm90Q2FsbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgY2FsbGVkIGJlZm9yZSBnZXR0aW5nIHN1cmZhY2UgcHJlc2VudCBtb2RlKHMpIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKCkuIik7CisgICAgfQorCisgICAgaWYgKHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSU3RhdGUgIT0gUVVFUllfREVUQUlMUykgeworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfU3dhcGNoYWluX0dldFN1cmZhY2VOb3RDYWxsZWQsCisgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVN3YXBjaGFpbktIUigpIGNhbGxlZCBiZWZvcmUgZ2V0dGluZyBzdXJmYWNlIGZvcm1hdChzKSBmcm9tIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUigpLiIpOworICAgIH0KKworICAgIGlmICgocENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA+IDEpICYmIChwQ3JlYXRlSW5mby0+aW1hZ2VTaGFyaW5nTW9kZSA9PSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfU2hhcmluZ01vZGVFeGNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogQSBTd2FwY2hhaW4gaXMgYmVpbmcgY3JlYXRlZCB3aGljaCBzcGVjaWZpZXMgYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0VYQ1VMU0lWRSB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmeWluZyBtdWx0aXBsZSBxdWV1ZXMgKHF1ZXVlRmFtaWx5SW5kZXhDb3VudCBvZiAlIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5xdWV1ZUZhbWlseUluZGV4Q291bnQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoKHBDcmVhdGVJbmZvc1tpXS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPiAxKSAmJiAocENyZWF0ZUluZm9zW2ldLmltYWdlU2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX1NoYXJpbmdNb2RlRXhjbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IEEgc2hhcmVkIHN3YXBjaGFpbiAoaW5kZXggJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBiZWluZyBjcmVhdGVkIHdoaWNoIHNwZWNpZmllcyBhIHNoYXJpbmcgbW9kZSBvZiBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFIHdoaWxlIHNwZWNpZnlpbmcgbXVsdGlwbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInF1ZXVlcyAocXVldWVGYW1pbHlJbmRleENvdW50IG9mICUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcENyZWF0ZUluZm9zW2ldLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgIFZrRm9ybWF0IGZvcm1hdCA9IHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZm9ybWF0OworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIGlmICgoRm9ybWF0SXNDb2xvcihmb3JtYXQpIHx8IEZvcm1hdEhhc0RlcHRoKGZvcm1hdCkpICYmCisgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5sb2FkT3AgPT0gVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQmVzdFByYWN0aWNlc19SZW5kZXJQYXNzX0F0dGF0Y2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVuZGVyIHBhc3MgaGFzIGFuIGF0dGFjaG1lbnQgd2l0aCBsb2FkT3AgPT0gVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRpYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRC4gIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVuZGVkLiAgQ29uc2lkZXIgdXNpbmcgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSBpbnN0ZWFkIGlmIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZSB0cnVlbHkgaXMgdW5kZWZpbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyIHBhc3MuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoRm9ybWF0SGFzU3RlbmNpbChmb3JtYXQpICYmIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uc3RlbmNpbExvYWRPcCA9PSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX1JlbmRlclBhc3NfQXR0YXRjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW5kZXIgcGFzcyBoYXMgYW4gYXR0YWNobWVudCB3aXRoIHN0ZW5jaWxMb2FkT3AgPT0gVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGluaXRpYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRC4gIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVuZGVkLiAgQ29uc2lkZXIgdXNpbmcgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSBpbnN0ZWFkIGlmIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZSB0cnVlbHkgaXMgdW5kZWZpbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyIHBhc3MuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGRlcGVuZGVuY3kgPSAwOyBkZXBlbmRlbmN5IDwgcENyZWF0ZUluZm8tPmRlcGVuZGVuY3lDb3VudDsgZGVwZW5kZW5jeSsrKSB7CisgICAgICAgIHNraXAgfD0gQ2hlY2tQaXBlbGluZVN0YWdlRmxhZ3MoInZrQ3JlYXRlUmVuZGVyUGFzcyIsIHBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldLnNyY1N0YWdlTWFzayk7CisgICAgICAgIHNraXAgfD0gQ2hlY2tQaXBlbGluZVN0YWdlRmxhZ3MoInZrQ3JlYXRlUmVuZGVyUGFzcyIsIHBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldLmRzdFN0YWdlTWFzayk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZU1lbW9yeSogcE1lbW9yeSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKG51bV9tZW1fb2JqZWN0cyArIDEgPiBrTWVtb3J5T2JqZWN0V2FybmluZ0xpbWl0KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQmVzdFByYWN0aWNlc19BbGxvY2F0ZU1lbW9yeV9Ub29NYW55T2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICJQZXJmb3JtYW5jZSBXYXJuaW5nOiBUaGlzIGFwcCBoYXMgPiAlIiBQUkl1MzIgIiBtZW1vcnkgb2JqZWN0cy4iLCBrTWVtb3J5T2JqZWN0V2FybmluZ0xpbWl0KTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBJbnNlcnQgZ2V0IGNoZWNrIGZvciBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgb25jZSB0aGUgc3RhdGUgaXMgdHJhY2tlZCBpbiB0aGUgU3RhdGVUcmFja2VyCisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBCZXN0UHJhY3RpY2VzOjpQb3N0Q2FsbFJlY29yZEFsbG9jYXRlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZU1lbW9yeSogcE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEFsbG9jYXRlTWVtb3J5KGRldmljZSwgcEFsbG9jYXRlSW5mbywgcEFsbG9jYXRvciwgcE1lbW9yeSwgcmVzdWx0KTsKKworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICBudW1fbWVtX29iamVjdHMrKzsKKyAgICB9Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlRnJlZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvID0gVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6R2V0RGV2TWVtU3RhdGUobWVtb3J5KTsKKworICAgIGZvciAoYXV0byYgb2JqIDogbWVtX2luZm8tPm9ial9iaW5kaW5ncykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCBnZXRfZGVidWdfcmVwb3J0X2VudW1bb2JqLnR5cGVdLCAwLCBsYXllcl9uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAiVksgT2JqZWN0ICVzIHN0aWxsIGhhcyBhIHJlZmVyZW5jZSB0byBtZW0gb2JqICVzLiIsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUob2JqKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShtZW1faW5mby0+bWVtKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsUmVjb3JkRnJlZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7CisgICAgaWYgKG1lbW9yeSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICBudW1fbWVtX29iamVjdHMtLTsKKyAgICB9Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6VmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5KFZrQnVmZmVyIGJ1ZmZlciwgY29uc3QgY2hhciogYXBpX25hbWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBCVUZGRVJfU1RBVEUqIGJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisKKyAgICBpZiAoIWJ1ZmZlcl9zdGF0ZS0+bWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2VkICYmICFidWZmZXJfc3RhdGUtPmV4dGVybmFsX21lbW9yeV9oYW5kbGUpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX0J1ZmZlck1lbVJlcU5vdENhbGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogQmluZGluZyBtZW1vcnkgdG8gJXMgYnV0IHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCBvbiB0aGF0IGJ1ZmZlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYXBpX25hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYnVmZmVyKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZU1lbW9yeSBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIqIGFwaV9uYW1lID0gIkJpbmRCdWZmZXJNZW1vcnkoKSI7CisKKyAgICBza2lwIHw9IFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeShidWZmZXIsIGFwaV9uYW1lKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUJpbmRCdWZmZXJNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcykgY29uc3QgeworICAgIGNoYXIgYXBpX25hbWVbNjRdOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvQ291bnQ7IGkrKykgeworICAgICAgICBzcHJpbnRmKGFwaV9uYW1lLCAidmtCaW5kQnVmZmVyTWVtb3J5MigpIHBCaW5kSW5mb3NbJXVdIiwgaSk7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5KHBCaW5kSW5mb3NbaV0uYnVmZmVyLCBhcGlfbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBwQmluZEluZm9zKSBjb25zdCB7CisgICAgY2hhciBhcGlfbmFtZVs2NF07CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIHNwcmludGYoYXBpX25hbWUsICJ2a0JpbmRCdWZmZXJNZW1vcnkyS0hSKCkgcEJpbmRJbmZvc1sldV0iLCBpKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUJpbmRCdWZmZXJNZW1vcnkocEJpbmRJbmZvc1tpXS5idWZmZXIsIGFwaV9uYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeShWa0ltYWdlIGltYWdlLCBjb25zdCBjaGFyKiBhcGlfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworCisgICAgaWYgKCFpbWFnZV9zdGF0ZS0+bWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2VkICYmICFpbWFnZV9zdGF0ZS0+ZXh0ZXJuYWxfbWVtb3J5X2hhbmRsZSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfSW1hZ2VNZW1SZXFOb3RDYWxsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJpbmRpbmcgbWVtb3J5IHRvICVzIGJ1dCB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCBvbiB0aGF0IGltYWdlLiIsIGFwaV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZSkuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQmluZEltYWdlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIqIGFwaV9uYW1lID0gInZrQmluZEltYWdlTWVtb3J5KCkiOworCisgICAgc2tpcCB8PSBWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeShpbWFnZSwgYXBpX25hbWUpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQmluZEltYWdlTWVtb3J5MihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiBwQmluZEluZm9zKSBjb25zdCB7CisgICAgY2hhciBhcGlfbmFtZVs2NF07CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIHNwcmludGYoYXBpX25hbWUsICJ2a0JpbmRJbWFnZU1lbW9yeTIoKSBwQmluZEluZm9zWyV1XSIsIGkpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQmluZEltYWdlTWVtb3J5KHBCaW5kSW5mb3NbaV0uaW1hZ2UsIGFwaV9uYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkyS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIGNvbnN0IHsKKyAgICBjaGFyIGFwaV9uYW1lWzY0XTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kSW5mb0NvdW50OyBpKyspIHsKKyAgICAgICAgc3ByaW50ZihhcGlfbmFtZSwgInZrQmluZEltYWdlTWVtb3J5MktIUigpIHBCaW5kSW5mb3NbJXVdIiwgaSk7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkocEJpbmRJbmZvc1tpXS5pbWFnZSwgYXBpX25hbWUpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNncGxfc3RhdGVfZGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IFN0YXRlVHJhY2tlcjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIGNncGxfc3RhdGVfZGF0YSk7CisKKyAgICBpZiAoKGNyZWF0ZUluZm9Db3VudCA+IDEpICYmICghcGlwZWxpbmVDYWNoZSkpIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX0NyZWF0ZVBpcGVsaW5lc19NdWx0aXBsZVBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgIlBlcmZvcm1hbmNlIFdhcm5pbmc6IFRoaXMgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyBjYWxsIGlzIGNyZWF0aW5nIG11bHRpcGxlIHBpcGVsaW5lcyBidXQgaXMgbm90IHVzaW5nIGEgIgorICAgICAgICAgICAgICAgICAgICAicGlwZWxpbmUgY2FjaGUsIHdoaWNoIG1heSBoZWxwIHdpdGggcGVyZm9ybWFuY2UiKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21wdXRlUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2NwbF9zdGF0ZV9kYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gU3RhdGVUcmFja2VyOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIGNjcGxfc3RhdGVfZGF0YSk7CisKKyAgICBpZiAoKGNyZWF0ZUluZm9Db3VudCA+IDEpICYmICghcGlwZWxpbmVDYWNoZSkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX0NyZWF0ZVBpcGVsaW5lc19NdWx0aXBsZVBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJQZXJmb3JtYW5jZSBXYXJuaW5nOiBUaGlzIHZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyBjYWxsIGlzIGNyZWF0aW5nIG11bHRpcGxlIHBpcGVsaW5lcyBidXQgaXMgbm90IHVzaW5nIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgInBpcGVsaW5lIGNhY2hlLCB3aGljaCBtYXkgaGVscCB3aXRoIHBlcmZvcm1hbmNlIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6Q2hlY2tQaXBlbGluZVN0YWdlRmxhZ3Moc3RkOjpzdHJpbmcgYXBpX25hbWUsIGNvbnN0IFZrUGlwZWxpbmVTdGFnZUZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZmxhZ3MgJiBWS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklUKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQmVzdFByYWN0aWNlc19QaXBlbGluZVN0YWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAiWW91IGFyZSB1c2luZyBWS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklUIHdoZW4gJXMgaXMgY2FsbGVkXG4iLCBhcGlfbmFtZS5jX3N0cigpKTsKKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0Jlc3RQcmFjdGljZXNfUGlwZWxpbmVTdGFnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBhcmUgdXNpbmcgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCB3aGVuICVzIGlzIGNhbGxlZFxuIiwgYXBpX25hbWUuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlUXVldWVTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyogcFN1Ym1pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmVuY2UgZmVuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAodWludDMyX3Qgc3VibWl0ID0gMDsgc3VibWl0IDwgc3VibWl0Q291bnQ7IHN1Ym1pdCsrKSB7CisgICAgICAgIGZvciAodWludDMyX3Qgc2VtYXBob3JlID0gMDsgc2VtYXBob3JlIDwgcFN1Ym1pdHNbc3VibWl0XS53YWl0U2VtYXBob3JlQ291bnQ7IHNlbWFwaG9yZSsrKSB7CisgICAgICAgICAgICBza2lwIHw9IENoZWNrUGlwZWxpbmVTdGFnZUZsYWdzKCJ2a1F1ZXVlU3VibWl0IiwgcFN1Ym1pdHNbc3VibWl0XS5wV2FpdERzdFN0YWdlTWFza1tzZW1hcGhvcmVdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIHNraXAgfD0gQ2hlY2tQaXBlbGluZVN0YWdlRmxhZ3MoInZrQ21kU2V0RXZlbnQiLCBzdGFnZU1hc2spOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQ21kUmVzZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIHNraXAgfD0gQ2hlY2tQaXBlbGluZVN0YWdlRmxhZ3MoInZrQ21kUmVzZXRFdmVudCIsIHN0YWdlTWFzayk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVDbWRXYWl0RXZlbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgc2tpcCB8PSBDaGVja1BpcGVsaW5lU3RhZ2VGbGFncygidmtDbWRXYWl0RXZlbnRzIiwgc3JjU3RhZ2VNYXNrKTsKKyAgICBza2lwIHw9IENoZWNrUGlwZWxpbmVTdGFnZUZsYWdzKCJ2a0NtZFdhaXRFdmVudHMiLCBkc3RTdGFnZU1hc2spOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQ21kUGlwZWxpbmVCYXJyaWVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZrRGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbW9yeUJhcnJpZXJzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBza2lwIHw9IENoZWNrUGlwZWxpbmVTdGFnZUZsYWdzKCJ2a0NtZFBpcGVsaW5lQmFycmllciIsIHNyY1N0YWdlTWFzayk7CisgICAgc2tpcCB8PSBDaGVja1BpcGVsaW5lU3RhZ2VGbGFncygidmtDbWRQaXBlbGluZUJhcnJpZXIiLCBkc3RTdGFnZU1hc2spOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVUaW1lc3RhbXAoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIHNraXAgfD0gQ2hlY2tQaXBlbGluZVN0YWdlRmxhZ3MoInZrQ21kV3JpdGVUaW1lc3RhbXAiLCBwaXBlbGluZVN0YWdlKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXcoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHZlcnRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoaW5zdGFuY2VDb3VudCA9PSAwKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQmVzdFByYWN0aWNlc19DbWREcmF3X0luc3RhbmNlQ291bnRaZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IFlvdSBhcmUgY2FsbGluZyB2a0NtZERyYXcoKSB3aXRoIGFuIGluc3RhbmNlQ291bnQgb2YgWmVyby4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgaW5kZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChpbnN0YW5jZUNvdW50ID09IDApIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX0NtZERyYXdfSW5zdGFuY2VDb3VudFplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogWW91IGFyZSBjYWxsaW5nIHZrQ21kRHJhd0luZGV4ZWQoKSB3aXRoIGFuIGluc3RhbmNlQ291bnQgb2YgWmVyby4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZHJhd0NvdW50ID09IDApIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX0NtZERyYXdfRHJhd0NvdW50WmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBZb3UgYXJlIGNhbGxpbmcgdmtDbWREcmF3SW5kaXJlY3QoKSB3aXRoIGEgZHJhd0NvdW50IG9mIFplcm8uIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZHJhd0NvdW50ID09IDApIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX0NtZERyYXdfRHJhd0NvdW50WmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBZb3UgYXJlIGNhbGxpbmcgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KCkgd2l0aCBhIGRyYXdDb3VudCBvZiBaZXJvLiIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdyb3VwQ291bnRaKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoKGdyb3VwQ291bnRYID09IDApIHx8IChncm91cENvdW50WSA9PSAwKSB8fCAoZ3JvdXBDb3VudFogPT0gMCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9CZXN0UHJhY3RpY2VzX0NtZERpc3BhdGNoX0dyb3VwQ291bnRaZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IFlvdSBhcmUgY2FsbGluZyB2a0NtZERpc3BhdGNoKCkgd2hpbGUgb25lIG9yIG1vcmUgZ3JvdXBDb3VudHMgYXJlIHplcm8gKGdyb3VwQ291bnRYID0gJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBncm91cENvdW50WSA9ICUiIFBSSXUzMiAiLCBncm91cENvdW50WiA9ICUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6VmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJRdWVyeShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFwaV9uYW1lKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKworICAgIGlmIChwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSU3RhdGUgPT0gVU5DQUxMRUQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBoeXNpY2FsRGV2aWNlKSwga1ZVSURfQmVzdFByYWN0aWNlc19EaXNwbGF5UGxhbmVfUHJvcGVydGllc05vdENhbGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQb3RlbnRpYWwgcHJvYmxlbSB3aXRoIGNhbGxpbmcgJXMoKSB3aXRob3V0IGZpcnN0IHJldHJpZXZpbmcgcHJvcGVydGllcyBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBvciB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9uYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBwbGFuZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcERpc3BsYXlDb3VudCwgVmtEaXNwbGF5S0hSKiBwRGlzcGxheXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIHNraXAgfD0gVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJRdWVyeShwaHlzaWNhbERldmljZSwgInZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlNb2RlS0hSIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbGFuZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqIHBDYXBhYmlsaXRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIHNraXAgfD0gVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJRdWVyeShwaHlzaWNhbERldmljZSwgInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogcERpc3BsYXlQbGFuZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBwQ2FwYWJpbGl0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBza2lwIHw9IFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSUXVlcnkocGh5c2ljYWxEZXZpY2UsICJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSogcFN3YXBjaGFpbkltYWdlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgYXV0byBzd2FwY2hhaW5fc3RhdGUgPSBHZXRTd2FwY2hhaW5TdGF0ZShzd2FwY2hhaW4pOworCisgICAgaWYgKHN3YXBjaGFpbl9zdGF0ZSAmJiBwU3dhcGNoYWluSW1hZ2VzKSB7CisgICAgICAgIC8vIENvbXBhcmUgdGhlIHByZWxpbWluYXJ5IHZhbHVlIG9mICpwU3dhcGNoYWluSW1hZ2VDb3VudCB3aXRoIHRoZSB2YWx1ZSB0aGlzIHRpbWU6CisgICAgICAgIGlmIChzd2FwY2hhaW5fc3RhdGUtPnZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSU3RhdGUgPT0gVU5DQUxMRUQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwga1ZVSURfQ29yZV9Td2FwY2hhaW5fUHJpb3JDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIoKSBjYWxsZWQgd2l0aCBub24tTlVMTCBwU3dhcGNoYWluSW1hZ2VDb3VudDsgYnV0IG5vIHByaW9yIHBvc2l0aXZlIHZhbHVlIGhhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZW4gc2VlbiBmb3IgcFN3YXBjaGFpbkltYWdlcy4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCisvLyBDb21tb24gZnVuY3Rpb24gdG8gaGFuZGxlIHZhbGlkYXRpb24gZm9yIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzICYgMktIUiB2ZXJzaW9uCitzdGF0aWMgYm9vbCBWYWxpZGF0ZUNvbW1vbkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKGRlYnVnX3JlcG9ydF9kYXRhKiByZXBvcnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEhZU0lDQUxfREVWSUNFX1NUQVRFKiBwZF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVxdWVzdGVkX3F1ZXVlX2ZhbWlseV9wcm9wZXJ0eV9jb3VudCwgYm9vbCBxZnBfbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2FsbGVyX25hbWUpIHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIXFmcF9udWxsKSB7CisgICAgICAgIC8vIFZlcmlmeSB0aGF0IGZvciBlYWNoIHBoeXNpY2FsIGRldmljZSwgdGhpcyBjb21tYW5kIGlzIGNhbGxlZCBmaXJzdCB3aXRoIE5VTEwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyBpbiBvcmRlciB0byBnZXQgY291bnQKKyAgICAgICAgaWYgKFVOQ0FMTEVEID09IHBkX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzU3RhdGUpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGRfc3RhdGUtPnBoeXNfZGV2aWNlKSwga1ZVSURfQ29yZV9EZXZMaW1pdF9NaXNzaW5nUXVlcnlDb3VudCwKKyAgICAgICAgICAgICAgICAiJXMgaXMgY2FsbGVkIHdpdGggbm9uLU5VTEwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyBiZWZvcmUgb2J0YWluaW5nIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQuIEl0IGlzIHJlY29tbWVuZGVkICIKKyAgICAgICAgICAgICAgICAidG8gZmlyc3QgY2FsbCAlcyB3aXRoIE5VTEwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyBpbiBvcmRlciB0byBvYnRhaW4gdGhlIG1heGltYWwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudC4iLAorICAgICAgICAgICAgICAgIGNhbGxlcl9uYW1lLCBjYWxsZXJfbmFtZSk7CisgICAgICAgICAgICAvLyBUaGVuIHZlcmlmeSB0aGF0IHBDb3VudCB0aGF0IGlzIHBhc3NlZCBpbiBvbiBzZWNvbmQgY2FsbCBtYXRjaGVzIHdoYXQgd2FzIHJldHVybmVkCisgICAgICAgIH0gZWxzZSBpZiAocGRfc3RhdGUtPnF1ZXVlX2ZhbWlseV9rbm93bl9jb3VudCAhPSByZXF1ZXN0ZWRfcXVldWVfZmFtaWx5X3Byb3BlcnR5X2NvdW50KSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBkX3N0YXRlLT5waHlzX2RldmljZSksIGtWVUlEX0NvcmVfRGV2TGltaXRfQ291bnRNaXNtYXRjaCwKKyAgICAgICAgICAgICAgICAiJXMgaXMgY2FsbGVkIHdpdGggbm9uLU5VTEwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyBhbmQgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCB2YWx1ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAiLCBidXQgdGhlIGxhcmdlc3QgcHJldmlvdXNseSByZXR1cm5lZCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50IGZvciB0aGlzIHBoeXNpY2FsRGV2aWNlIGlzICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICIuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RlYWQgcmVjZWl2ZSBhbGwgdGhlIHByb3BlcnRpZXMgYnkgY2FsbGluZyAlcyB3aXRoIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgdGhhdCB3YXMgIgorICAgICAgICAgICAgICAgICJwcmV2aW91c2x5IG9idGFpbmVkIGJ5IGNhbGxpbmcgJXMgd2l0aCBOVUxMIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMuIiwKKyAgICAgICAgICAgICAgICBjYWxsZXJfbmFtZSwgcmVxdWVzdGVkX3F1ZXVlX2ZhbWlseV9wcm9wZXJ0eV9jb3VudCwgcGRfc3RhdGUtPnF1ZXVlX2ZhbWlseV9rbm93bl9jb3VudCwgY2FsbGVyX25hbWUsIGNhbGxlcl9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVigKKyAgICBWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFKiBhc19zdGF0ZSA9IEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZVN0YXRlKHBCaW5kSW5mb3NbaV0uYWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICAgICAgaWYgKCFhc19zdGF0ZS0+bWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2VkKSB7CisgICAgICAgICAgICAvLyBUaGVyZSdzIG5vdCBhbiBleHBsaWNpdCByZXF1aXJlbWVudCBpbiB0aGUgc3BlYyB0byBjYWxsIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoKSBwcmlvciB0byBjYWxsaW5nCisgICAgICAgICAgICAvLyBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYgYnV0IGl0J3MgaW1wbGllZCBpbiB0aGF0IG1lbW9yeSBiZWluZyBib3VuZCBtdXN0IGNvbmZvcm0gd2l0aAorICAgICAgICAgICAgLy8gVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgZnJvbSB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WCisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIDAsCisgICAgICAgICAgICAgICAga1ZVSURfQmVzdFByYWN0aWNlc19CaW5kQWNjZWxOVl9Ob01lbVJlcVF1ZXJ5LAorICAgICAgICAgICAgICAgICJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVigpOiAiCisgICAgICAgICAgICAgICAgIkJpbmRpbmcgbWVtb3J5IHRvICVzIGJ1dCB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCBvbiB0aGF0IHN0cnVjdHVyZS4iLAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocEJpbmRJbmZvc1tpXS5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgY29uc3QgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBhc3NlcnQocGh5c2ljYWxfZGV2aWNlX3N0YXRlKTsKKyAgICByZXR1cm4gVmFsaWRhdGVDb21tb25HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhyZXBvcnRfZGF0YSwgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbHB0ciA9PSBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcygpIik7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiogcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgY29uc3QgeworICAgIGNvbnN0IGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgYXNzZXJ0KHBoeXNpY2FsX2RldmljZV9zdGF0ZSk7CisgICAgcmV0dXJuIFZhbGlkYXRlQ29tbW9uR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocmVwb3J0X2RhdGEsIHBoeXNpY2FsX2RldmljZV9zdGF0ZSwgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGxwdHIgPT0gcFF1ZXVlRmFtaWx5UHJvcGVydGllcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKCkiKTsKK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBhc3NlcnQocGh5c2ljYWxfZGV2aWNlX3N0YXRlKTsKKyAgICByZXR1cm4gVmFsaWRhdGVDb21tb25HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhyZXBvcnRfZGF0YSwgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbHB0ciA9PSBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoKSIpOworfQorCitib29sIEJlc3RQcmFjdGljZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlRm9ybWF0S0hSKiBwU3VyZmFjZUZvcm1hdHMpIGNvbnN0IHsKKyAgICBpZiAoIXBTdXJmYWNlRm9ybWF0cykgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgY29uc3QgYXV0byYgY2FsbF9zdGF0ZSA9IHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSU3RhdGU7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGNhbGxfc3RhdGUgPT0gVU5DQUxMRUQpIHsKKyAgICAgICAgLy8gU2luY2Ugd2UgaGF2ZW4ndCByZWNvcmRlZCBhIHByZWxpbWluYXJ5IHZhbHVlIG9mICpwU3VyZmFjZUZvcm1hdENvdW50LCB0aGF0IGxpa2VseSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkaWRuJ3QKKyAgICAgICAgLy8gcHJldmlvdXNseSBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIE5VTEwgdmFsdWUgb2YgcFN1cmZhY2VGb3JtYXRzOgorICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGh5c2ljYWxEZXZpY2UpLCBrVlVJRF9Db3JlX0RldkxpbWl0X011c3RRdWVyeUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUigpIGNhbGxlZCB3aXRoIG5vbi1OVUxMIHBTdXJmYWNlRm9ybWF0Q291bnQ7IGJ1dCBubyBwcmlvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgdmFsdWUgaGFzIGJlZW4gc2VlbiBmb3IgcFN1cmZhY2VGb3JtYXRzLiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8gcHJldl9mb3JtYXRfY291bnQgPSAodWludDMyX3QpcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5zdXJmYWNlX2Zvcm1hdHMuc2l6ZSgpOworICAgICAgICBpZiAoKnBTdXJmYWNlRm9ybWF0Q291bnQgPiBwcmV2X2Zvcm1hdF9jb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaHlzaWNhbERldmljZSksIGtWVUlEX0NvcmVfRGV2TGltaXRfQ291bnRNaXNtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKCkgY2FsbGVkIHdpdGggbm9uLU5VTEwgcFN1cmZhY2VGb3JtYXRDb3VudCwgYW5kIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwU3VyZmFjZUZvcm1hdHMgc2V0IHRvIGEgdmFsdWUgKCV1KSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgKCV1KSB0aGF0IHdhcyByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoZW4gcFN1cmZhY2VGb3JtYXRDb3VudCB3YXMgTlVMTC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU3VyZmFjZUZvcm1hdENvdW50LCBwcmV2X2Zvcm1hdF9jb3VudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQmVzdFByYWN0aWNlczo6UHJlQ2FsbFZhbGlkYXRlUXVldWVCaW5kU3BhcnNlKFZrUXVldWUgcXVldWUsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qIHBCaW5kSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmVuY2UgZmVuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAodWludDMyX3QgYmluZElkeCA9IDA7IGJpbmRJZHggPCBiaW5kSW5mb0NvdW50OyBiaW5kSWR4KyspIHsKKyAgICAgICAgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyYgYmluZEluZm8gPSBwQmluZEluZm9bYmluZElkeF07CisgICAgICAgIC8vIFN0b3JlIHNwYXJzZSBiaW5kaW5nIGltYWdlX3N0YXRlIGFuZCBhZnRlciBiaW5kaW5nIGlzIGNvbXBsZXRlIG1ha2Ugc3VyZSB0aGF0IGFueSByZXF1aXJpbmcgbWV0YWRhdGEgaGF2ZSBpdCBib3VuZAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8Y29uc3QgSU1BR0VfU1RBVEUqPiBzcGFyc2VfaW1hZ2VzOworICAgICAgICAvLyBUcmFjayBpbWFnZXMgZ2V0dGluZyBtZXRhZGF0YSBib3VuZCBieSB0aGlzIGNhbGwgaW4gYSBzZXQsIGl0J2xsIGJlIHJlY29yZGVkIGludG8gdGhlIGltYWdlX3N0YXRlCisgICAgICAgIC8vIGluIFJlY29yZFF1ZXVlQmluZFNwYXJzZS4KKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGNvbnN0IElNQUdFX1NUQVRFKj4gc3BhcnNlX2ltYWdlc193aXRoX21ldGFkYXRhOworICAgICAgICAvLyBJZiB3ZSdyZSBiaW5kaW5nIHNwYXJzZSBpbWFnZSBtZW1vcnkgbWFrZSBzdXJlIHJlcXMgd2VyZSBxdWVyaWVkIGFuZCBub3RlIGlmIG1ldGFkYXRhIGlzIHJlcXVpcmVkIGFuZCBib3VuZAorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm8uaW1hZ2VCaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgY29uc3QgYXV0byYgaW1hZ2VfYmluZCA9IGJpbmRJbmZvLnBJbWFnZUJpbmRzW2ldOworICAgICAgICAgICAgYXV0byBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2VfYmluZC5pbWFnZSk7CisgICAgICAgICAgICBpZiAoIWltYWdlX3N0YXRlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgLy8gUGFyYW0vT2JqZWN0IHZhbGlkYXRpb24gc2hvdWxkIHJlcG9ydCBpbWFnZV9iaW5kLmltYWdlIGhhbmRsZXMgYmVpbmcgaW52YWxpZCwgc28ganVzdCBza2lwIGhlcmUuCisgICAgICAgICAgICBzcGFyc2VfaW1hZ2VzLmluc2VydChpbWFnZV9zdGF0ZSk7CisgICAgICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWltYWdlX3N0YXRlLT5nZXRfc3BhcnNlX3JlcXNfY2FsbGVkIHx8IGltYWdlX3N0YXRlLT5zcGFyc2VfcmVxdWlyZW1lbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG5vdyBqdXN0IHdhcm5pbmcgaWYgc3BhcnNlIGltYWdlIGJpbmRpbmcgb2NjdXJzIHdpdGhvdXQgY2FsbGluZyB0byBnZXQgcmVxcyBmaXJzdAorICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCBrVlVJRF9Db3JlX01lbVRyYWNrX0ludmFsaWRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a1F1ZXVlQmluZFNwYXJzZSgpOiBCaW5kaW5nIHNwYXJzZSBtZW1vcnkgdG8gJXMgd2l0aG91dCBmaXJzdCBjYWxsaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzWzJLSFJdKCkgdG8gcmV0cmlldmUgcmVxdWlyZW1lbnRzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3N0YXRlLT5pbWFnZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpbWFnZV9zdGF0ZS0+bWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2VkKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIG5vdyBqdXN0IHdhcm5pbmcgaWYgc3BhcnNlIGltYWdlIGJpbmRpbmcgb2NjdXJzIHdpdGhvdXQgY2FsbGluZyB0byBnZXQgcmVxcyBmaXJzdAorICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwga1ZVSURfQ29yZV9NZW1UcmFja19JbnZhbGlkU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a1F1ZXVlQmluZFNwYXJzZSgpOiBCaW5kaW5nIHNwYXJzZSBtZW1vcnkgdG8gJXMgd2l0aG91dCBmaXJzdCBjYWxsaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoKSB0byByZXRyaWV2ZSByZXF1aXJlbWVudHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV9zdGF0ZS0+aW1hZ2UpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kSW5mby5pbWFnZU9wYXF1ZUJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiBpbWFnZV9vcGFxdWVfYmluZCA9IGJpbmRJbmZvLnBJbWFnZU9wYXF1ZUJpbmRzW2ldOworICAgICAgICAgICAgYXV0byBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoYmluZEluZm8ucEltYWdlT3BhcXVlQmluZHNbaV0uaW1hZ2UpOworICAgICAgICAgICAgaWYgKCFpbWFnZV9zdGF0ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8vIFBhcmFtL09iamVjdCB2YWxpZGF0aW9uIHNob3VsZCByZXBvcnQgaW1hZ2VfYmluZC5pbWFnZSBoYW5kbGVzIGJlaW5nIGludmFsaWQsIHNvIGp1c3Qgc2tpcCBoZXJlLgorICAgICAgICAgICAgc3BhcnNlX2ltYWdlcy5pbnNlcnQoaW1hZ2Vfc3RhdGUpOworICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZsYWdzICYgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpbWFnZV9zdGF0ZS0+Z2V0X3NwYXJzZV9yZXFzX2NhbGxlZCB8fCBpbWFnZV9zdGF0ZS0+c3BhcnNlX3JlcXVpcmVtZW50cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cganVzdCB3YXJuaW5nIGlmIHNwYXJzZSBpbWFnZSBiaW5kaW5nIG9jY3VycyB3aXRob3V0IGNhbGxpbmcgdG8gZ2V0IHJlcXMgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwga1ZVSURfQ29yZV9NZW1UcmFja19JbnZhbGlkU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZUJpbmRTcGFyc2UoKTogQmluZGluZyBvcGFxdWUgc3BhcnNlIG1lbW9yeSB0byAlcyB3aXRob3V0IGZpcnN0IGNhbGxpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNbMktIUl0oKSB0byByZXRyaWV2ZSByZXF1aXJlbWVudHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2Vfc3RhdGUtPmltYWdlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWltYWdlX3N0YXRlLT5tZW1vcnlfcmVxdWlyZW1lbnRzX2NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3Igbm93IGp1c3Qgd2FybmluZyBpZiBzcGFyc2UgaW1hZ2UgYmluZGluZyBvY2N1cnMgd2l0aG91dCBjYWxsaW5nIHRvIGdldCByZXFzIGZpcnN0CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCBrVlVJRF9Db3JlX01lbVRyYWNrX0ludmFsaWRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrUXVldWVCaW5kU3BhcnNlKCk6IEJpbmRpbmcgb3BhcXVlIHNwYXJzZSBtZW1vcnkgdG8gJXMgd2l0aG91dCBmaXJzdCBjYWxsaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoKSB0byByZXRyaWV2ZSByZXF1aXJlbWVudHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV9zdGF0ZS0+aW1hZ2UpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGltYWdlX29wYXF1ZV9iaW5kLmJpbmRDb3VudDsgKytqKSB7CisgICAgICAgICAgICAgICAgaWYgKGltYWdlX29wYXF1ZV9iaW5kLnBCaW5kc1tqXS5mbGFncyAmIFZLX1NQQVJTRV9NRU1PUllfQklORF9NRVRBREFUQV9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3BhcnNlX2ltYWdlc193aXRoX21ldGFkYXRhLmluc2VydChpbWFnZV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3BhcnNlX2ltYWdlX3N0YXRlIDogc3BhcnNlX2ltYWdlcykgeworICAgICAgICAgICAgaWYgKHNwYXJzZV9pbWFnZV9zdGF0ZS0+c3BhcnNlX21ldGFkYXRhX3JlcXVpcmVkICYmICFzcGFyc2VfaW1hZ2Vfc3RhdGUtPnNwYXJzZV9tZXRhZGF0YV9ib3VuZCAmJgorICAgICAgICAgICAgICAgIHNwYXJzZV9pbWFnZXNfd2l0aF9tZXRhZGF0YS5maW5kKHNwYXJzZV9pbWFnZV9zdGF0ZSkgPT0gc3BhcnNlX2ltYWdlc193aXRoX21ldGFkYXRhLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gV2FybiBpZiBzcGFyc2UgaW1hZ2UgYmluZGluZyBtZXRhZGF0YSByZXF1aXJlZCBmb3IgaW1hZ2Ugd2l0aCBzcGFyc2UgYmluZGluZywgYnV0IG1ldGFkYXRhIG5vdCBib3VuZAorICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc3BhcnNlX2ltYWdlX3N0YXRlLT5pbWFnZSksIGtWVUlEX0NvcmVfTWVtVHJhY2tfSW52YWxpZFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZUJpbmRTcGFyc2UoKTogQmluZGluZyBzcGFyc2UgbWVtb3J5IHRvICVzIHdoaWNoIHJlcXVpcmVzIGEgbWV0YWRhdGEgYXNwZWN0IGJ1dCBubyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5kaW5nIHdpdGggVktfU1BBUlNFX01FTU9SWV9CSU5EX01FVEFEQVRBX0JJVCBzZXQgd2FzIG1hZGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzcGFyc2VfaW1hZ2Vfc3RhdGUtPmltYWdlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIEJlc3RQcmFjdGljZXM6OlBvc3RDYWxsUmVjb3JkUXVldWVCaW5kU3BhcnNlKFZrUXVldWUgcXVldWUsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qIHBCaW5kSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGZW5jZSBmZW5jZSwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisKKyAgICBmb3IgKHVpbnQzMl90IGJpbmRJZHggPSAwOyBiaW5kSWR4IDwgYmluZEluZm9Db3VudDsgYmluZElkeCsrKSB7CisgICAgICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8mIGJpbmRJbmZvID0gcEJpbmRJbmZvW2JpbmRJZHhdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm8uaW1hZ2VPcGFxdWVCaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgY29uc3QgYXV0byYgaW1hZ2Vfb3BhcXVlX2JpbmQgPSBiaW5kSW5mby5wSW1hZ2VPcGFxdWVCaW5kc1tpXTsKKyAgICAgICAgICAgIGF1dG8gaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGJpbmRJbmZvLnBJbWFnZU9wYXF1ZUJpbmRzW2ldLmltYWdlKTsKKyAgICAgICAgICAgIGlmICghaW1hZ2Vfc3RhdGUpCisgICAgICAgICAgICAgICAgY29udGludWU7ICAvLyBQYXJhbS9PYmplY3QgdmFsaWRhdGlvbiBzaG91bGQgcmVwb3J0IGltYWdlX2JpbmQuaW1hZ2UgaGFuZGxlcyBiZWluZyBpbnZhbGlkLCBzbyBqdXN0IHNraXAgaGVyZS4KKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBpbWFnZV9vcGFxdWVfYmluZC5iaW5kQ291bnQ7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChpbWFnZV9vcGFxdWVfYmluZC5wQmluZHNbal0uZmxhZ3MgJiBWS19TUEFSU0VfTUVNT1JZX0JJTkRfTUVUQURBVEFfQklUKSB7CisgICAgICAgICAgICAgICAgICAgIGltYWdlX3N0YXRlLT5zcGFyc2VfbWV0YWRhdGFfYm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCZXN0UHJhY3RpY2VzOjpQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckF0dGFjaG1lbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBhdHRhY2htZW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqIHBBdHRhY2htZW50cywgdWludDMyX3QgcmVjdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiBwUmVjdHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAoIWNiX25vZGUpIHJldHVybiBza2lwOworCisgICAgLy8gV2FybiBpZiB0aGlzIGlzIGlzc3VlZCBwcmlvciB0byBEcmF3IENtZCBhbmQgY2xlYXJpbmcgdGhlIGVudGlyZSBhdHRhY2htZW50CisgICAgaWYgKCFjYl9ub2RlLT5oYXNEcmF3Q21kICYmIChjYl9ub2RlLT5hY3RpdmVSZW5kZXJQYXNzQmVnaW5JbmZvLnJlbmRlckFyZWEuZXh0ZW50LndpZHRoID09IHBSZWN0c1swXS5yZWN0LmV4dGVudC53aWR0aCkgJiYKKyAgICAgICAgKGNiX25vZGUtPmFjdGl2ZVJlbmRlclBhc3NCZWdpbkluZm8ucmVuZGVyQXJlYS5leHRlbnQuaGVpZ2h0ID09IHBSZWN0c1swXS5yZWN0LmV4dGVudC5oZWlnaHQpKSB7CisgICAgICAgIC8vIFRoZXJlIGFyZSB0aW1lcyB3aGVyZSBhcHAgbmVlZHMgdG8gdXNlIENsZWFyQXR0YWNobWVudHMgKGdlbmVyYWxseSB3aGVuIHJldXNpbmcgYSBidWZmZXIgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MpCisgICAgICAgIC8vIFRoaXMgd2FybmluZyBzaG91bGQgYmUgbWFkZSBtb3JlIHNwZWNpZmljLiBJdCdkIGJlIGJlc3QgdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGlzIHRlc3QgaWYgaXQncyBhIHVzZSB0aGF0IG11c3QgY2FsbAorICAgICAgICAvLyBDbWRDbGVhckF0dGFjaG1lbnRzLgorICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfQ2xlYXJDbWRCZWZvcmVEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ2xlYXJBdHRhY2htZW50cygpIGlzc3VlZCBvbiAlcyBwcmlvciB0byBhbnkgRHJhdyBDbWRzLiBJdCBpcyByZWNvbW1lbmRlZCB5b3UgIgorICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBSZW5kZXJQYXNzIExPQURfT1BfQ0xFQVIgb24gQXR0YWNobWVudHMgcHJpb3IgdG8gYW55IERyYXcuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY29tbWFuZEJ1ZmZlcikuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvYmVzdF9wcmFjdGljZXMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9iZXN0X3ByYWN0aWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjA4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvYmVzdF9wcmFjdGljZXMuaApAQCAtMCwwICsxLDEzNyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2FtZGVuIFN0b2NrZXIgPGNhbWRlbkBsdW5hcmcuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiY2hhc3Npcy5oIgorI2luY2x1ZGUgInN0YXRlX3RyYWNrZXIuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTWVtb3J5T2JqZWN0V2FybmluZ0xpbWl0ID0gMjUwOworCitjbGFzcyBCZXN0UHJhY3RpY2VzIDogcHVibGljIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgeworICBwdWJsaWM6CisgICAgdXNpbmcgU3RhdGVUcmFja2VyID0gVmFsaWRhdGlvblN0YXRlVHJhY2tlcjsKKworICAgIHN0ZDo6c3RyaW5nIEdldEFQSVZlcnNpb25OYW1lKHVpbnQzMl90IHZlcnNpb24pIGNvbnN0OworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UqIHBJbnN0YW5jZSkgY29uc3Q7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbnN0YW5jZSogcEluc3RhbmNlKTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXZpY2UqIHBEZXZpY2UpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQnVmZmVyKiBwQnVmZmVyKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlKiBwSW1hZ2UpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWluKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUFsbG9jYXRlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlTWVtb3J5KiBwTWVtb3J5KSBjb25zdDsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQWxsb2NhdGVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZU1lbW9yeSogcE1lbW9yeSwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRGcmVlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIGJvb2wgVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5KFZrQnVmZmVyIGJ1ZmZlciwgY29uc3QgY2hhciogYXBpX25hbWUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0KSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRCdWZmZXJNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5MktIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBwQmluZEluZm9zKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQmluZEltYWdlTWVtb3J5KFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IGNoYXIqIGFwaV9uYW1lKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiBwQmluZEluZm9zKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRnJlZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNncGxfc3RhdGUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBpcGVfc3RhdGUpIGNvbnN0OworCisgICAgYm9vbCBDaGVja1BpcGVsaW5lU3RhZ2VGbGFncyhzdGQ6OnN0cmluZyBhcGlfbmFtZSwgY29uc3QgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZmxhZ3MpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyogcFN1Ym1pdHMsIFZrRmVuY2UgZmVuY2UpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0RXZlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRXZlbnQgZXZlbnQsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzaykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRSZXNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kV2FpdEV2ZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZXZlbnRDb3VudCwgY29uc3QgVmtFdmVudCogcEV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUGlwZWxpbmVCYXJyaWVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBWa0RlcGVuZGVuY3lGbGFncyBkZXBlbmRlbmN5RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRXcml0ZVRpbWVzdGFtcChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhdyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdmVydGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0VmVydGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluc3RhbmNlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ3JvdXBDb3VudFopIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJRdWVyeShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBjaGFyKiBhcGlfbmFtZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBwbGFuZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBEaXNwbGF5Q291bnQsIFZrRGlzcGxheUtIUiogcERpc3BsYXlzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlNb2RlS0hSIG1vZGUsIHVpbnQzMl90IHBsYW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqIHBDYXBhYmlsaXRpZXMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKiBwRGlzcGxheVBsYW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBwQ2FwYWJpbGl0aWVzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UqIHBTd2FwY2hhaW5JbWFnZXMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyogcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VGb3JtYXRLSFIqIHBTdXJmYWNlRm9ybWF0cykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVRdWV1ZUJpbmRTcGFyc2UoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyogcEJpbmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmVuY2UgZmVuY2UpIGNvbnN0OworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZUJpbmRTcGFyc2UoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyogcEJpbmRJbmZvLCBWa0ZlbmNlIGZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQXR0YWNobWVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqIHBBdHRhY2htZW50cywgdWludDMyX3QgcmVjdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyUmVjdCogcFJlY3RzKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHVpbnQzMl90IGluc3RhbmNlX2FwaV92ZXJzaW9uOworCisgICAgdWludDMyX3QgbnVtX21lbV9vYmplY3RzID0gMDsKK307CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvYmVzdF9wcmFjdGljZXNfZXJyb3JfZW51bXMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9iZXN0X3ByYWN0aWNlc19lcnJvcl9lbnVtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMmU3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvYmVzdF9wcmFjdGljZXNfZXJyb3JfZW51bXMuaApAQCAtMCwwICsxLDYyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2FtZGVuIFN0b2NrZXIgPGNhbWRlbkBsdW5hcmcuY29tPgorICovCisKKyNpZm5kZWYgQkVTVF9QUkFDVElDRVNfRVJST1JfRU5VTVNfSF8KKyNkZWZpbmUgQkVTVF9QUkFDVElDRVNfRVJST1JfRU5VTVNfSF8KKworLy8gU3VwcHJlc3MgdW51c2VkIHdhcm5pbmcgb24gTGludXgKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBERUNPUkFURV9VTlVTRUQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIERFQ09SQVRFX1VOVVNFRAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQmVzdFByYWN0aWNlc19DcmVhdGVJbnN0YW5jZV9FeHRlbnNpb25NaXNtYXRjaCA9CisgICAgIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy12a0NyZWF0ZUluc3RhbmNlLWV4dGVuc2lvbi1taXNtYXRjaCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0Jlc3RQcmFjdGljZXNfQ3JlYXRlRGV2aWNlX0FQSV9NaXNtYXRjaCA9CisgICAgIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy12a0NyZWF0ZURldmljZS1BUEktdmVyc2lvbi1taXNtYXRjaCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0Jlc3RQcmFjdGljZXNfU2hhcmluZ01vZGVFeGNsdXNpdmUgPQorICAgICJVTkFTU0lHTkVELUJlc3RQcmFjdGljZXMtdmtDcmVhdGVCdWZmZXItc2hhcmluZy1tb2RlLWV4Y2x1c2l2ZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0Jlc3RQcmFjdGljZXNfUmVuZGVyUGFzc19BdHRhdGNobWVudCA9CisgICAgIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy12a0NyZWF0ZVJlbmRlclBhc3MtYXR0YXRjaG1lbnQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9CZXN0UHJhY3RpY2VzX0FsbG9jYXRlTWVtb3J5X1Rvb01hbnlPYmplY3RzID0KKyAgICAiVU5BU1NJR05FRC1CZXN0UHJhY3RpY2VzLXZrQWxsb2NhdGVNZW1vcnktdG9vLW1hbnktb2JqZWN0cyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0Jlc3RQcmFjdGljZXNfQ3JlYXRlUGlwZWxpbmVzX011bHRpcGxlUGlwZWxpbmVzID0KKyAgICAiVU5BU1NJR05FRC1CZXN0UHJhY3RpY2VzLXZrQ3JlYXRlUGlwZWxpbmVzLW11bHRpcGxlLXBpcGVsaW5lcy1uby1jYWNoZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0Jlc3RQcmFjdGljZXNfUGlwZWxpbmVTdGFnZUZsYWdzID0gIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy1waXBlbGluZS1zdGFnZS1mbGFncyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0Jlc3RQcmFjdGljZXNfQ21kRHJhd19JbnN0YW5jZUNvdW50WmVybyA9CisgICAgIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy12a0NtZERyYXctaW5zdGFuY2UtY291bnQtemVybyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0Jlc3RQcmFjdGljZXNfQ21kRHJhd19EcmF3Q291bnRaZXJvID0gIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy12a0NtZERyYXctZHJhdy1jb3VudC16ZXJvIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQmVzdFByYWN0aWNlc19DbWREaXNwYXRjaF9Hcm91cENvdW50WmVybyA9CisgICAgIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy12a0NtZERpc3BhdGNoLWdyb3VwLWNvdW50LXplcm8iOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9CZXN0UHJhY3RpY2VzX0NyZWF0ZURldmljZV9QREZlYXR1cmVzTm90Q2FsbGVkID0KKyAgICAiVU5BU1NJR05FRC1CZXN0UHJhY3RpY2VzLXZrQ3JlYXRlRGV2aWNlLXBoeXNpY2FsLWRldmljZS1mZWF0dXJlcy1ub3QtcmV0cmlldmVkIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQmVzdFByYWN0aWNlc19Td2FwY2hhaW5fR2V0U3VyZmFjZU5vdENhbGxlZCA9CisgICAgIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy12a0NyZWF0ZVN3YXBjaGFpbktIUi1zdXJmYWNlLW5vdC1yZXRyaWV2ZWQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9CZXN0UHJhY3RpY2VzX0Rpc3BsYXlQbGFuZV9Qcm9wZXJ0aWVzTm90Q2FsbGVkID0KKyAgICAiVU5BU1NJR05FRC1CZXN0UHJhY3RpY2VzLXZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFItcHJvcGVydGllcy1ub3QtcmV0cmlldmVkIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQmVzdFByYWN0aWNlc19CdWZmZXJNZW1SZXFOb3RDYWxsZWQgPQorICAgICJVTkFTU0lHTkVELUJlc3RQcmFjdGljZXMtdmtCaW5kQnVmZmVyTWVtb3J5LXJlcXVpcmVtZW50cy1ub3QtcmV0cmlldmVkIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQmVzdFByYWN0aWNlc19JbWFnZU1lbVJlcU5vdENhbGxlZCA9CisgICAgIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy12a0JpbmRJbWFnZU1lbW9yeS1yZXF1aXJlbWVudHMtbm90LXJldHJpZXZlZCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0Jlc3RQcmFjdGljZXNfQmluZEFjY2VsTlZfTm9NZW1SZXFRdWVyeSA9CisgICAgIlVOQVNTSUdORUQtQmVzdFByYWN0aWNlcy1CaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYtcmVxdWlyZW1lbnRzLW5vdC1yZXRyaWV2ZWQiOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9idWZmZXJfdmFsaWRhdGlvbi5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvYnVmZmVyX3ZhbGlkYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2ZkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvYnVmZmVyX3ZhbGlkYXRpb24uY3BwCkBAIC0wLDAgKzEsNTUyOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICogU2hhbm5vbiBNY1BoZXJzb24gPHNoYW5ub25AbHVuYXJnLmNvbT4KKyAqLworCisvLyBBbGxvdyB1c2Ugb2YgU1RMIG1pbiBhbmQgbWF4IGZ1bmN0aW9ucyBpbiBXaW5kb3dzCisjZGVmaW5lIE5PTUlOTUFYCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJ2a19lbnVtX3N0cmluZ19oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19mb3JtYXRfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9kYXRhLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9sb2dnaW5nLmgiCisjaW5jbHVkZSAidmtfdHlwZW1hcF9oZWxwZXIuaCIKKworI2luY2x1ZGUgImNoYXNzaXMuaCIKKyNpbmNsdWRlICJjb3JlX3ZhbGlkYXRpb24uaCIKKyNpbmNsdWRlICJzaGFkZXJfdmFsaWRhdGlvbi5oIgorI2luY2x1ZGUgImRlc2NyaXB0b3Jfc2V0cy5oIgorI2luY2x1ZGUgImJ1ZmZlcl92YWxpZGF0aW9uLmgiCisKKy8vIFRyYW5zZmVyIFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyBpbnRvIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN0cnVjdAorc3RhdGljIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIFJhbmdlRnJvbUxheWVycyhjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgJnN1YnJlc291cmNlX2xheWVycykgeworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN1YnJlc291cmNlX3JhbmdlOworICAgIHN1YnJlc291cmNlX3JhbmdlLmFzcGVjdE1hc2sgPSBzdWJyZXNvdXJjZV9sYXllcnMuYXNwZWN0TWFzazsKKyAgICBzdWJyZXNvdXJjZV9yYW5nZS5iYXNlQXJyYXlMYXllciA9IHN1YnJlc291cmNlX2xheWVycy5iYXNlQXJyYXlMYXllcjsKKyAgICBzdWJyZXNvdXJjZV9yYW5nZS5sYXllckNvdW50ID0gc3VicmVzb3VyY2VfbGF5ZXJzLmxheWVyQ291bnQ7CisgICAgc3VicmVzb3VyY2VfcmFuZ2UuYmFzZU1pcExldmVsID0gc3VicmVzb3VyY2VfbGF5ZXJzLm1pcExldmVsOworICAgIHN1YnJlc291cmNlX3JhbmdlLmxldmVsQ291bnQgPSAxOworICAgIHJldHVybiBzdWJyZXNvdXJjZV9yYW5nZTsKK30KKworSU1BR0VfU1RBVEU6OklNQUdFX1NUQVRFKFZrSW1hZ2UgaW1nLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pCisgICAgOiBpbWFnZShpbWcpLAorICAgICAgY3JlYXRlSW5mbygqcENyZWF0ZUluZm8pLAorICAgICAgdmFsaWQoZmFsc2UpLAorICAgICAgYWNxdWlyZWQoZmFsc2UpLAorICAgICAgc2hhcmVkX3ByZXNlbnRhYmxlKGZhbHNlKSwKKyAgICAgIGxheW91dF9sb2NrZWQoZmFsc2UpLAorICAgICAgZ2V0X3NwYXJzZV9yZXFzX2NhbGxlZChmYWxzZSksCisgICAgICBzcGFyc2VfbWV0YWRhdGFfcmVxdWlyZWQoZmFsc2UpLAorICAgICAgc3BhcnNlX21ldGFkYXRhX2JvdW5kKGZhbHNlKSwKKyAgICAgIGltcG9ydGVkX2FoYihmYWxzZSksCisgICAgICBoYXNfYWhiX2Zvcm1hdChmYWxzZSksCisgICAgICBhaGJfZm9ybWF0KDApLAorICAgICAgZnVsbF9yYW5nZXt9LAorICAgICAgY3JlYXRlX2Zyb21fc3dhcGNoYWluKFZLX05VTExfSEFORExFKSwKKyAgICAgIGJpbmRfc3dhcGNoYWluKFZLX05VTExfSEFORExFKSwKKyAgICAgIGJpbmRfc3dhcGNoYWluX2ltYWdlSW5kZXgoMCksCisgICAgICBzcGFyc2VfcmVxdWlyZW1lbnRze30geworICAgIGlmICgoY3JlYXRlSW5mby5zaGFyaW5nTW9kZSA9PSBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCkgJiYgKGNyZWF0ZUluZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID4gMCkpIHsKKyAgICAgICAgdWludDMyX3QgKnBRdWV1ZUZhbWlseUluZGljZXMgPSBuZXcgdWludDMyX3RbY3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQ7IGkrKykgeworICAgICAgICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlc1tpXSA9IHBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzW2ldOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZUluZm8ucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgfQorCisgICAgaWYgKGNyZWF0ZUluZm8uZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUKSB7CisgICAgICAgIHNwYXJzZSA9IHRydWU7CisgICAgfQorICAgIGNvbnN0IGF1dG8gZm9ybWF0ID0gY3JlYXRlSW5mby5mb3JtYXQ7CisgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgaW5pdF9yYW5nZXswLCAwLCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUywgMCwgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSU307CisgICAgaWYgKEZvcm1hdElzQ29sb3IoZm9ybWF0KSB8fCBGb3JtYXRJc011bHRpcGxhbmUoZm9ybWF0KSkgeworICAgICAgICBpbml0X3JhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOyAgLy8gTm9ybWFsaXphdGlvbiB3aWxsIGV4cGFuZCB0aGlzIGZvciBtdWx0aXBsYW5lCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdF9yYW5nZS5hc3BlY3RNYXNrID0KKyAgICAgICAgICAgIChGb3JtYXRIYXNEZXB0aChmb3JtYXQpID8gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCA6IDApIHwgKEZvcm1hdEhhc1N0ZW5jaWwoZm9ybWF0KSA/IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCA6IDApOworICAgIH0KKyAgICBmdWxsX3JhbmdlID0gTm9ybWFsaXplU3VicmVzb3VyY2VSYW5nZSgqdGhpcywgaW5pdF9yYW5nZSk7CisKKyAgICBhdXRvICpleHRlcm5hbE1lbW9yeUluZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmIChleHRlcm5hbE1lbW9yeUluZm8pIHsKKyAgICAgICAgZXh0ZXJuYWxfbWVtb3J5X2hhbmRsZSA9IGV4dGVybmFsTWVtb3J5SW5mby0+aGFuZGxlVHlwZXM7CisgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgYXV0byBleHRlcm5hbF9mb3JtYXQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0V4dGVybmFsRm9ybWF0QU5EUk9JRD4oY3JlYXRlSW5mby5wTmV4dCk7CisgICAgaWYgKGV4dGVybmFsX2Zvcm1hdCkgeworICAgICAgICBleHRlcm5hbF9mb3JtYXRfYW5kcm9pZCA9IGV4dGVybmFsX2Zvcm1hdC0+ZXh0ZXJuYWxGb3JtYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgZXh0ZXJuYWxGb3JtYXQgaXMgemVybywgdGhlIGVmZmVjdCBpcyBhcyBpZiB0aGUgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgc3RydWN0dXJlIHdhcyBub3QgcHJlc2VudC4KKyAgICAgICAgZXh0ZXJuYWxfZm9ybWF0X2FuZHJvaWQgPSAwOworICAgIH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCit9CisKK2Jvb2wgSU1BR0VfU1RBVEU6OklzQ3JlYXRlSW5mb0VxdWFsKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZvdGhlcl9jcmVhdGVJbmZvKSBjb25zdCB7CisgICAgYm9vbCBpc19lcXVhbCA9IChjcmVhdGVJbmZvLnNUeXBlID09IG90aGVyX2NyZWF0ZUluZm8uc1R5cGUpICYmIChjcmVhdGVJbmZvLmZsYWdzID09IG90aGVyX2NyZWF0ZUluZm8uZmxhZ3MpOworICAgIGlzX2VxdWFsID0gaXNfZXF1YWwgJiYgSXNJbWFnZVR5cGVFcXVhbChvdGhlcl9jcmVhdGVJbmZvKSAmJiBJc0Zvcm1hdEVxdWFsKG90aGVyX2NyZWF0ZUluZm8pOworICAgIGlzX2VxdWFsID0gaXNfZXF1YWwgJiYgSXNNaXBMZXZlbHNFcXVhbChvdGhlcl9jcmVhdGVJbmZvKSAmJiBJc0FycmF5TGF5ZXJzRXF1YWwob3RoZXJfY3JlYXRlSW5mbyk7CisgICAgaXNfZXF1YWwgPSBpc19lcXVhbCAmJiBJc1VzYWdlRXF1YWwob3RoZXJfY3JlYXRlSW5mbykgJiYgSXNJbml0aWFsTGF5b3V0RXF1YWwob3RoZXJfY3JlYXRlSW5mbyk7CisgICAgaXNfZXF1YWwgPSBpc19lcXVhbCAmJiBJc0V4dGVudEVxdWFsKG90aGVyX2NyZWF0ZUluZm8pICYmIElzVGlsaW5nRXF1YWwob3RoZXJfY3JlYXRlSW5mbyk7CisgICAgaXNfZXF1YWwgPSBpc19lcXVhbCAmJiBJc1NhbXBsZXNFcXVhbChvdGhlcl9jcmVhdGVJbmZvKSAmJiBJc1NoYXJpbmdNb2RlRXF1YWwob3RoZXJfY3JlYXRlSW5mbyk7CisgICAgcmV0dXJuIGlzX2VxdWFsICYmIElzUXVldWVGYW1pbHlJbmRpY2VzRXF1YWwob3RoZXJfY3JlYXRlSW5mbyk7Cit9CisKKy8vIENoZWNrIGltYWdlIGNvbXBhdGliaWxpdHkgcnVsZXMgZm9yIFZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nCitib29sIElNQUdFX1NUQVRFOjpJc0NyZWF0ZUluZm9EZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0NvbXBhdGlibGUoY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gJm90aGVyX2NyZWF0ZUluZm8pIGNvbnN0IHsKKyAgICBib29sIGlzX2NvbXBhdGlibGUgPSAoY3JlYXRlSW5mby5zVHlwZSA9PSBvdGhlcl9jcmVhdGVJbmZvLnNUeXBlKSAmJiAoY3JlYXRlSW5mby5mbGFncyA9PSBvdGhlcl9jcmVhdGVJbmZvLmZsYWdzKTsKKyAgICBpc19jb21wYXRpYmxlID0gaXNfY29tcGF0aWJsZSAmJiBJc0ltYWdlVHlwZUVxdWFsKG90aGVyX2NyZWF0ZUluZm8pICYmIElzRm9ybWF0RXF1YWwob3RoZXJfY3JlYXRlSW5mbyk7CisgICAgaXNfY29tcGF0aWJsZSA9IGlzX2NvbXBhdGlibGUgJiYgSXNNaXBMZXZlbHNFcXVhbChvdGhlcl9jcmVhdGVJbmZvKTsKKyAgICBpc19jb21wYXRpYmxlID0gaXNfY29tcGF0aWJsZSAmJiBJc1VzYWdlRXF1YWwob3RoZXJfY3JlYXRlSW5mbykgJiYgSXNJbml0aWFsTGF5b3V0RXF1YWwob3RoZXJfY3JlYXRlSW5mbyk7CisgICAgaXNfY29tcGF0aWJsZSA9IGlzX2NvbXBhdGlibGUgJiYgSXNTYW1wbGVzRXF1YWwob3RoZXJfY3JlYXRlSW5mbykgJiYgSXNTaGFyaW5nTW9kZUVxdWFsKG90aGVyX2NyZWF0ZUluZm8pOworICAgIGlzX2NvbXBhdGlibGUgPSBpc19jb21wYXRpYmxlICYmIElzUXVldWVGYW1pbHlJbmRpY2VzRXF1YWwob3RoZXJfY3JlYXRlSW5mbykgJiYgSXNUaWxpbmdFcXVhbChvdGhlcl9jcmVhdGVJbmZvKTsKKworICAgIGlzX2NvbXBhdGlibGUgPSBpc19jb21wYXRpYmxlICYmIGNyZWF0ZUluZm8uZXh0ZW50LndpZHRoIDw9IG90aGVyX2NyZWF0ZUluZm8uZXh0ZW50LndpZHRoICYmCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm8uZXh0ZW50LmhlaWdodCA8PSBvdGhlcl9jcmVhdGVJbmZvLmV4dGVudC5oZWlnaHQgJiYKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mby5leHRlbnQuZGVwdGggPD0gb3RoZXJfY3JlYXRlSW5mby5leHRlbnQuZGVwdGggJiYKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mby5hcnJheUxheWVycyA8PSBvdGhlcl9jcmVhdGVJbmZvLmFycmF5TGF5ZXJzOworICAgIHJldHVybiBpc19jb21wYXRpYmxlOworfQorCitib29sIElNQUdFX1NUQVRFOjpJc0NvbXBhdGlibGVBbGlhc2luZyhJTUFHRV9TVEFURSAqb3RoZXJfaW1hZ2Vfc3RhdGUpIHsKKyAgICBpZiAoIShjcmVhdGVJbmZvLmZsYWdzICYgb3RoZXJfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICgoY3JlYXRlX2Zyb21fc3dhcGNoYWluID09IFZLX05VTExfSEFORExFKSAmJiAoYmluZGluZy5tZW0gPT0gb3RoZXJfaW1hZ2Vfc3RhdGUtPmJpbmRpbmcubWVtKSAmJgorICAgICAgICAoYmluZGluZy5tZW0gIT0gVktfTlVMTF9IQU5ETEUpICYmIChiaW5kaW5nLm9mZnNldCA9PSBvdGhlcl9pbWFnZV9zdGF0ZS0+YmluZGluZy5vZmZzZXQpICYmCisgICAgICAgIElzQ3JlYXRlSW5mb0VxdWFsKG90aGVyX2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKChiaW5kX3N3YXBjaGFpbiA9PSBvdGhlcl9pbWFnZV9zdGF0ZS0+YmluZF9zd2FwY2hhaW4pICYmIChiaW5kX3N3YXBjaGFpbiAhPSBWS19OVUxMX0hBTkRMRSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworSU1BR0VfVklFV19TVEFURTo6SU1BR0VfVklFV19TVEFURShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU1BR0VfU1RBVEU+ICZpbSwgVmtJbWFnZVZpZXcgaXYsIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyAqY2kpCisgICAgOiBpbWFnZV92aWV3KGl2KSwKKyAgICAgIGNyZWF0ZV9pbmZvKCpjaSksCisgICAgICBub3JtYWxpemVkX3N1YnJlc291cmNlX3JhbmdlKGNpLT5zdWJyZXNvdXJjZVJhbmdlKSwKKyAgICAgIHNhbXBsZXJDb252ZXJzaW9uKFZLX05VTExfSEFORExFKSwKKyAgICAgIGltYWdlX3N0YXRlKGltKSB7CisgICAgYXV0byAqY29udmVyc2lvbkluZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvPihjcmVhdGVfaW5mby5wTmV4dCk7CisgICAgaWYgKGNvbnZlcnNpb25JbmZvKSBzYW1wbGVyQ29udmVyc2lvbiA9IGNvbnZlcnNpb25JbmZvLT5jb252ZXJzaW9uOworICAgIGlmIChpbWFnZV9zdGF0ZSkgeworICAgICAgICAvLyBBIGxpZ2h0IG5vcm1hbGl6YXRpb24gb2YgdGhlIGNyZWF0ZUluZm8gcmFuZ2UKKyAgICAgICAgYXV0byAmc3ViX3Jlc19yYW5nZSA9IGNyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2U7CisgICAgICAgIHN1Yl9yZXNfcmFuZ2UubGV2ZWxDb3VudCA9IFJlc29sdmVSZW1haW5pbmdMZXZlbHMoJnN1Yl9yZXNfcmFuZ2UsIGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLm1pcExldmVscyk7CisgICAgICAgIHN1Yl9yZXNfcmFuZ2UubGF5ZXJDb3VudCA9IFJlc29sdmVSZW1haW5pbmdMYXllcnMoJnN1Yl9yZXNfcmFuZ2UsIGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmFycmF5TGF5ZXJzKTsKKworICAgICAgICAvLyBDYWNoZSBhIGZ1bGwgbm9ybWFsaXphdGlvbiAoZm9yICJmdWxsIGltYWdlL3dob2xlIGltYWdlIiBjb21wYXJpc29ucykKKyAgICAgICAgbm9ybWFsaXplZF9zdWJyZXNvdXJjZV9yYW5nZSA9IE5vcm1hbGl6ZVN1YnJlc291cmNlUmFuZ2UoKmltYWdlX3N0YXRlLCBjaS0+c3VicmVzb3VyY2VSYW5nZSk7CisgICAgICAgIHNhbXBsZXMgPSBpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5zYW1wbGVzOworICAgICAgICBkZXNjcmlwdG9yX2Zvcm1hdF9iaXRzID0gRGVzY3JpcHRvclJlcXVpcmVtZW50c0JpdHNGcm9tRm9ybWF0KGNyZWF0ZV9pbmZvLmZvcm1hdCk7CisgICAgfQorfQorCit1aW50MzJfdCBGdWxsTWlwQ2hhaW5MZXZlbHModWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgZGVwdGgpIHsKKyAgICAvLyB1aW50IGNhc3QgYXBwbGllcyBmbG9vcigpCisgICAgcmV0dXJuIDF1ICsgKHVpbnQzMl90KWxvZzIoc3RkOjptYXgoe2hlaWdodCwgd2lkdGgsIGRlcHRofSkpOworfQorCit1aW50MzJfdCBGdWxsTWlwQ2hhaW5MZXZlbHMoVmtFeHRlbnQzRCBleHRlbnQpIHsgcmV0dXJuIEZ1bGxNaXBDaGFpbkxldmVscyhleHRlbnQuaGVpZ2h0LCBleHRlbnQud2lkdGgsIGV4dGVudC5kZXB0aCk7IH0KKwordWludDMyX3QgRnVsbE1pcENoYWluTGV2ZWxzKFZrRXh0ZW50MkQgZXh0ZW50KSB7IHJldHVybiBGdWxsTWlwQ2hhaW5MZXZlbHMoZXh0ZW50LmhlaWdodCwgZXh0ZW50LndpZHRoKTsgfQorCitWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBOb3JtYWxpemVTdWJyZXNvdXJjZVJhbmdlKGNvbnN0IElNQUdFX1NUQVRFICZpbWFnZV9zdGF0ZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnJhbmdlKSB7CisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gJmltYWdlX2NyZWF0ZV9pbmZvID0gaW1hZ2Vfc3RhdGUuY3JlYXRlSW5mbzsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBub3JtID0gcmFuZ2U7CisgICAgbm9ybS5sZXZlbENvdW50ID0gUmVzb2x2ZVJlbWFpbmluZ0xldmVscygmcmFuZ2UsIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyk7CisKKyAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIDNEIGltYWdlcyB3aXRoIFZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVF9LSFIgZmxhZyBiaXQsIHdoZXJlIDxleHRlbnQuZGVwdGg+IGFuZAorICAgIC8vIDxhcnJheUxheWVycz4gY2FuIHBvdGVudGlhbGx5IGFsaWFzLgorICAgIHVpbnQzMl90IGxheWVyX2xpbWl0ID0gKDAgIT0gKGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzICYgVktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUX0tIUikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzOworICAgIG5vcm0ubGF5ZXJDb3VudCA9IFJlc29sdmVSZW1haW5pbmdMYXllcnMoJnJhbmdlLCBsYXllcl9saW1pdCk7CisKKyAgICAvLyBGb3IgbXVsdGlwbGFuYXIgZm9ybWF0cywgSU1BR0VfQVNQRUNUX0NPTE9SIGlzIGVxdWl2YWxlbnQgdG8gYWRkaW5nIHRoZSBhc3BlY3Qgb2YgdGhlIGluZGl2aWR1YWwgcGxhbmVzCisgICAgVmtJbWFnZUFzcGVjdEZsYWdzICZhc3BlY3RfbWFzayA9IG5vcm0uYXNwZWN0TWFzazsKKyAgICBpZiAoRm9ybWF0SXNNdWx0aXBsYW5lKGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCkpIHsKKyAgICAgICAgaWYgKGFzcGVjdF9tYXNrICYgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCkgeworICAgICAgICAgICAgYXNwZWN0X21hc2sgJj0gflZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgICAgICBhc3BlY3RfbWFzayB8PSAoVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUIHwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUKTsKKyAgICAgICAgICAgIGlmIChGb3JtYXRQbGFuZUNvdW50KGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCkgPiAyKSB7CisgICAgICAgICAgICAgICAgYXNwZWN0X21hc2sgfD0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBub3JtOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgT0JKRUNULCBjbGFzcyBMQVlPVVQ+Cit2b2lkIENvcmVDaGVja3M6OlNldExheW91dChPQkpFQ1QgKnBPYmplY3QsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VTdWJyZXNvdXJjZSByYW5nZSwgY29uc3QgTEFZT1VUICZsYXlvdXQpIHsKKyAgICBJbWFnZVN1YnJlc291cmNlUGFpciBpbWdwYWlyID0ge2ltYWdlLCB0cnVlLCByYW5nZX07CisgICAgU2V0TGF5b3V0KHBPYmplY3QsIGltZ3BhaXIsIGxheW91dCwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCk7CisgICAgU2V0TGF5b3V0KHBPYmplY3QsIGltZ3BhaXIsIGxheW91dCwgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCk7CisgICAgU2V0TGF5b3V0KHBPYmplY3QsIGltZ3BhaXIsIGxheW91dCwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKTsKKyAgICBTZXRMYXlvdXQocE9iamVjdCwgaW1ncGFpciwgbGF5b3V0LCBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUKTsKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikgeworICAgICAgICBTZXRMYXlvdXQocE9iamVjdCwgaW1ncGFpciwgbGF5b3V0LCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVRfS0hSKTsKKyAgICAgICAgU2V0TGF5b3V0KHBPYmplY3QsIGltZ3BhaXIsIGxheW91dCwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUX0tIUik7CisgICAgICAgIFNldExheW91dChwT2JqZWN0LCBpbWdwYWlyLCBsYXlvdXQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVF9LSFIpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIE9CSkVDVCwgY2xhc3MgTEFZT1VUPgordm9pZCBDb3JlQ2hlY2tzOjpTZXRMYXlvdXQoT0JKRUNUICpwT2JqZWN0LCBJbWFnZVN1YnJlc291cmNlUGFpciBpbWdwYWlyLCBjb25zdCBMQVlPVVQgJmxheW91dCwgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2spIHsKKyAgICBpZiAoaW1ncGFpci5zdWJyZXNvdXJjZS5hc3BlY3RNYXNrICYgYXNwZWN0TWFzaykgeworICAgICAgICBpbWdwYWlyLnN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBhc3BlY3RNYXNrOworICAgICAgICBTZXRMYXlvdXQocE9iamVjdCwgaW1ncGFpciwgbGF5b3V0KTsKKyAgICB9Cit9CisKKy8vIFNldCB0aGUgbGF5b3V0IGluIHN1cHBsaWVkIG1hcAordm9pZCBDb3JlQ2hlY2tzOjpTZXRMYXlvdXQoSW1hZ2VTdWJyZXNQYWlyTGF5b3V0TWFwICZpbWFnZUxheW91dE1hcCwgSW1hZ2VTdWJyZXNvdXJjZVBhaXIgaW1ncGFpciwgVmtJbWFnZUxheW91dCBsYXlvdXQpIHsKKyAgICBhdXRvIGl0ID0gaW1hZ2VMYXlvdXRNYXAuZmluZChpbWdwYWlyKTsKKyAgICBpZiAoaXQgIT0gaW1hZ2VMYXlvdXRNYXAuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5sYXlvdXQgPSBsYXlvdXQ7ICAvLyBVcGRhdGUKKyAgICB9IGVsc2UgeworICAgICAgICBpbWFnZUxheW91dE1hcFtpbWdwYWlyXS5sYXlvdXQgPSBsYXlvdXQ7ICAvLyBJbnNlcnQKKyAgICB9Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6RmluZExheW91dFZlcmlmeUxheW91dChJbWFnZVN1YnJlc291cmNlUGFpciBpbWdwYWlyLCBWa0ltYWdlTGF5b3V0ICZsYXlvdXQsIGNvbnN0IFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrKSB7CisgICAgaWYgKCEoaW1ncGFpci5zdWJyZXNvdXJjZS5hc3BlY3RNYXNrICYgYXNwZWN0TWFzaykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3Mgb2xkQXNwZWN0TWFzayA9IGltZ3BhaXIuc3VicmVzb3VyY2UuYXNwZWN0TWFzazsKKyAgICBpbWdwYWlyLnN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBhc3BlY3RNYXNrOworICAgIGF1dG8gaW1nc3ViSXQgPSBpbWFnZUxheW91dE1hcC5maW5kKGltZ3BhaXIpOworICAgIGlmIChpbWdzdWJJdCA9PSBpbWFnZUxheW91dE1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChsYXlvdXQgIT0gVktfSU1BR0VfTEFZT1VUX01BWF9FTlVNICYmIGxheW91dCAhPSBpbWdzdWJJdC0+c2Vjb25kLmxheW91dCkgeworICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgSGFuZGxlVG9VaW50NjQoaW1ncGFpci5pbWFnZSksCisgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZExheW91dCwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHF1ZXJ5IGZvciAlcyBsYXlvdXQgd2hlbiBjb21iaW5lZCBhc3BlY3QgbWFzayAlZCBoYXMgbXVsdGlwbGUgbGF5b3V0IHR5cGVzOiAlcyBhbmQgJXMiLAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1ncGFpci5pbWFnZSkuY19zdHIoKSwgb2xkQXNwZWN0TWFzaywgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQobGF5b3V0KSwKKyAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZUxheW91dChpbWdzdWJJdC0+c2Vjb25kLmxheW91dCkpOworICAgIH0KKyAgICBsYXlvdXQgPSBpbWdzdWJJdC0+c2Vjb25kLmxheW91dDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZCBsYXlvdXQocykgb24gdGhlIGdsb2JhbCBsZXZlbAorYm9vbCBDb3JlQ2hlY2tzOjpGaW5kR2xvYmFsTGF5b3V0KEltYWdlU3VicmVzb3VyY2VQYWlyIGltZ3BhaXIsIFZrSW1hZ2VMYXlvdXQgJmxheW91dCkgeworICAgIGxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9NQVhfRU5VTTsKKyAgICBGaW5kTGF5b3V0VmVyaWZ5TGF5b3V0KGltZ3BhaXIsIGxheW91dCwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCk7CisgICAgRmluZExheW91dFZlcmlmeUxheW91dChpbWdwYWlyLCBsYXlvdXQsIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpOworICAgIEZpbmRMYXlvdXRWZXJpZnlMYXlvdXQoaW1ncGFpciwgbGF5b3V0LCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpOworICAgIEZpbmRMYXlvdXRWZXJpZnlMYXlvdXQoaW1ncGFpciwgbGF5b3V0LCBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUKTsKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikgeworICAgICAgICBGaW5kTGF5b3V0VmVyaWZ5TGF5b3V0KGltZ3BhaXIsIGxheW91dCwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUik7CisgICAgICAgIEZpbmRMYXlvdXRWZXJpZnlMYXlvdXQoaW1ncGFpciwgbGF5b3V0LCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVRfS0hSKTsKKyAgICAgICAgRmluZExheW91dFZlcmlmeUxheW91dChpbWdwYWlyLCBsYXlvdXQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVF9LSFIpOworICAgIH0KKyAgICBpZiAobGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9NQVhfRU5VTSkgeworICAgICAgICBpbWdwYWlyID0ge2ltZ3BhaXIuaW1hZ2UsIGZhbHNlLCBWa0ltYWdlU3VicmVzb3VyY2UoKX07CisgICAgICAgIGF1dG8gaW1nc3ViSXQgPSBpbWFnZUxheW91dE1hcC5maW5kKGltZ3BhaXIpOworICAgICAgICBpZiAoaW1nc3ViSXQgPT0gaW1hZ2VMYXlvdXRNYXAuZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgbGF5b3V0ID0gaW1nc3ViSXQtPnNlY29uZC5sYXlvdXQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvcmVDaGVja3M6OkZpbmRMYXlvdXRzKFZrSW1hZ2UgaW1hZ2UsIHN0ZDo6dmVjdG9yPFZrSW1hZ2VMYXlvdXQ+ICZsYXlvdXRzKSBjb25zdCB7CisgICAgYXV0byBzdWJfZGF0YSA9IGltYWdlU3VicmVzb3VyY2VNYXAuZmluZChpbWFnZSk7CisgICAgaWYgKHN1Yl9kYXRhID09IGltYWdlU3VicmVzb3VyY2VNYXAuZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIGltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgaWYgKCFpbWFnZV9zdGF0ZSkgcmV0dXJuIGZhbHNlOworICAgIGJvb2wgaWdub3JlR2xvYmFsID0gZmFsc2U7CisgICAgLy8gVE9ETzogTWFrZSB0aGlzIHJvYnVzdCBmb3IgPjEgYXNwZWN0IG1hc2suIE5vdyBpdCB3aWxsIGp1c3Qgc2F5IGlnbm9yZSBwb3RlbnRpYWwgZXJyb3JzIGluIHRoaXMgY2FzZS4KKyAgICBpZiAoc3ViX2RhdGEtPnNlY29uZC5zaXplKCkgPj0gKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmFycmF5TGF5ZXJzICogaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8ubWlwTGV2ZWxzICsgMSkpIHsKKyAgICAgICAgaWdub3JlR2xvYmFsID0gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChhdXRvIGltZ3N1YnBhaXIgOiBzdWJfZGF0YS0+c2Vjb25kKSB7CisgICAgICAgIGlmIChpZ25vcmVHbG9iYWwgJiYgIWltZ3N1YnBhaXIuaGFzU3VicmVzb3VyY2UpIGNvbnRpbnVlOworICAgICAgICBhdXRvIGltZ19kYXRhID0gaW1hZ2VMYXlvdXRNYXAuZmluZChpbWdzdWJwYWlyKTsKKyAgICAgICAgaWYgKGltZ19kYXRhICE9IGltYWdlTGF5b3V0TWFwLmVuZCgpKSB7CisgICAgICAgICAgICBsYXlvdXRzLnB1c2hfYmFjayhpbWdfZGF0YS0+c2Vjb25kLmxheW91dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6RmluZExheW91dChjb25zdCBJbWFnZVN1YnJlc1BhaXJMYXlvdXRNYXAgJmltYWdlTGF5b3V0TWFwLCBJbWFnZVN1YnJlc291cmNlUGFpciBpbWdwYWlyLCBWa0ltYWdlTGF5b3V0ICZsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2spIHsKKyAgICBpZiAoIShpbWdwYWlyLnN1YnJlc291cmNlLmFzcGVjdE1hc2sgJiBhc3BlY3RNYXNrKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGltZ3BhaXIuc3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IGFzcGVjdE1hc2s7CisgICAgYXV0byBpbWdzdWJJdCA9IGltYWdlTGF5b3V0TWFwLmZpbmQoaW1ncGFpcik7CisgICAgaWYgKGltZ3N1Ykl0ID09IGltYWdlTGF5b3V0TWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbGF5b3V0ID0gaW1nc3ViSXQtPnNlY29uZC5sYXlvdXQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIGZpbmQgbGF5b3V0IGluIHN1cHBsaWVkIG1hcAorYm9vbCBDb3JlQ2hlY2tzOjpGaW5kTGF5b3V0KGNvbnN0IEltYWdlU3VicmVzUGFpckxheW91dE1hcCAmaW1hZ2VMYXlvdXRNYXAsIEltYWdlU3VicmVzb3VyY2VQYWlyIGltZ3BhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCAmbGF5b3V0KSBjb25zdCB7CisgICAgbGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX01BWF9FTlVNOworICAgIEZpbmRMYXlvdXQoaW1hZ2VMYXlvdXRNYXAsIGltZ3BhaXIsIGxheW91dCwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCk7CisgICAgRmluZExheW91dChpbWFnZUxheW91dE1hcCwgaW1ncGFpciwgbGF5b3V0LCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUKTsKKyAgICBGaW5kTGF5b3V0KGltYWdlTGF5b3V0TWFwLCBpbWdwYWlyLCBsYXlvdXQsIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCk7CisgICAgRmluZExheW91dChpbWFnZUxheW91dE1hcCwgaW1ncGFpciwgbGF5b3V0LCBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUKTsKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikgeworICAgICAgICBGaW5kTGF5b3V0KGltYWdlTGF5b3V0TWFwLCBpbWdwYWlyLCBsYXlvdXQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVF9LSFIpOworICAgICAgICBGaW5kTGF5b3V0KGltYWdlTGF5b3V0TWFwLCBpbWdwYWlyLCBsYXlvdXQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVF9LSFIpOworICAgICAgICBGaW5kTGF5b3V0KGltYWdlTGF5b3V0TWFwLCBpbWdwYWlyLCBsYXlvdXQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVF9LSFIpOworICAgIH0KKyAgICAvLyBJbWFnZStzdWJyZXNvdXJjZSBub3QgZm91bmQsIGxvb2sgZm9yIGltYWdlIGhhbmRsZSB3L28gc3VicmVzb3VyY2UKKyAgICBpZiAobGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9NQVhfRU5VTSkgeworICAgICAgICBpbWdwYWlyID0ge2ltZ3BhaXIuaW1hZ2UsIGZhbHNlLCBWa0ltYWdlU3VicmVzb3VyY2UoKX07CisgICAgICAgIGF1dG8gaW1nc3ViSXQgPSBpbWFnZUxheW91dE1hcC5maW5kKGltZ3BhaXIpOworICAgICAgICBpZiAoaW1nc3ViSXQgPT0gaW1hZ2VMYXlvdXRNYXAuZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgbGF5b3V0ID0gaW1nc3ViSXQtPnNlY29uZC5sYXlvdXQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBTZXQgdGhlIGxheW91dCBvbiB0aGUgZ2xvYmFsIGxldmVsCit2b2lkIENvcmVDaGVja3M6OlNldEdsb2JhbExheW91dChJbWFnZVN1YnJlc291cmNlUGFpciBpbWdwYWlyLCBjb25zdCBWa0ltYWdlTGF5b3V0ICZsYXlvdXQpIHsKKyAgICBWa0ltYWdlICZpbWFnZSA9IGltZ3BhaXIuaW1hZ2U7CisgICAgYXV0byBkYXRhID0gaW1hZ2VMYXlvdXRNYXAuZmluZChpbWdwYWlyKTsKKyAgICBpZiAoZGF0YSAhPSBpbWFnZUxheW91dE1hcC5lbmQoKSkgeworICAgICAgICBkYXRhLT5zZWNvbmQubGF5b3V0ID0gbGF5b3V0OyAgLy8gVXBkYXRlCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW1hZ2VMYXlvdXRNYXBbaW1ncGFpcl0ubGF5b3V0ID0gbGF5b3V0OyAgLy8gSW5zZXJ0CisgICAgfQorICAgIGF1dG8gJmltYWdlX3N1YnJlc291cmNlcyA9IGltYWdlU3VicmVzb3VyY2VNYXBbaW1hZ2VdOworICAgIGF1dG8gc3VicmVzb3VyY2UgPSBzdGQ6OmZpbmQoaW1hZ2Vfc3VicmVzb3VyY2VzLmJlZ2luKCksIGltYWdlX3N1YnJlc291cmNlcy5lbmQoKSwgaW1ncGFpcik7CisgICAgaWYgKHN1YnJlc291cmNlID09IGltYWdlX3N1YnJlc291cmNlcy5lbmQoKSkgeworICAgICAgICBpbWFnZV9zdWJyZXNvdXJjZXMucHVzaF9iYWNrKGltZ3BhaXIpOworICAgIH0KK30KKworLy8gU2V0IGltYWdlIGxheW91dCBmb3IgZ2l2ZW4gVmtJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3RydWN0Cit2b2lkIENvcmVDaGVja3M6OlNldEltYWdlTGF5b3V0KENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFICZpbWFnZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJmltYWdlX3N1YnJlc291cmNlX3JhbmdlLCBWa0ltYWdlTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBleHBlY3RlZF9sYXlvdXQpIHsKKyAgICBhdXRvICpzdWJyZXNvdXJjZV9tYXAgPSBHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwKGNiX25vZGUsIGltYWdlX3N0YXRlKTsKKyAgICBhc3NlcnQoc3VicmVzb3VyY2VfbWFwKTsgIC8vIHRoZSBub24tY29uc3QgZ2V0dGVyIG11c3QgcmV0dXJuIGEgdmFsaWQgcG9pbnRlcgorICAgIGlmIChzdWJyZXNvdXJjZV9tYXAtPlNldFN1YnJlc291cmNlUmFuZ2VMYXlvdXQoKmNiX25vZGUsIGltYWdlX3N1YnJlc291cmNlX3JhbmdlLCBsYXlvdXQsIGV4cGVjdGVkX2xheW91dCkpIHsKKyAgICAgICAgY2Jfbm9kZS0+aW1hZ2VfbGF5b3V0X2NoYW5nZV9jb3VudCsrOyAgLy8gQ2hhbmdlIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZGF0YSB0byBmb3JjZSByZXZhbGlkYXRpb24KKyAgICB9Cit9CisKKy8vIFNldCB0aGUgaW5pdGlhbCBpbWFnZSBsYXlvdXQgZm9yIGFsbCBzbGljZXMgb2YgYW4gaW1hZ2Ugdmlldwordm9pZCBDb3JlQ2hlY2tzOjpTZXRJbWFnZVZpZXdJbml0aWFsTGF5b3V0KENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IElNQUdFX1ZJRVdfU1RBVEUgJnZpZXdfc3RhdGUsIFZrSW1hZ2VMYXlvdXQgbGF5b3V0KSB7CisgICAgaWYgKGRpc2FibGVkLmltYWdlX2xheW91dF92YWxpZGF0aW9uKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlID0gdmlld19zdGF0ZS5pbWFnZV9zdGF0ZS5nZXQoKTsKKyAgICBhdXRvICpzdWJyZXNvdXJjZV9tYXAgPSBHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwKGNiX25vZGUsICppbWFnZV9zdGF0ZSk7CisgICAgc3VicmVzb3VyY2VfbWFwLT5TZXRTdWJyZXNvdXJjZVJhbmdlSW5pdGlhbExheW91dCgqY2Jfbm9kZSwgdmlld19zdGF0ZS5ub3JtYWxpemVkX3N1YnJlc291cmNlX3JhbmdlLCBsYXlvdXQsICZ2aWV3X3N0YXRlKTsKK30KKworLy8gU2V0IHRoZSBpbml0aWFsIGltYWdlIGxheW91dCBmb3IgYSBwYXNzZWQgbm9uLW5vcm1hbGl6ZWQgc3VicmVzb3VyY2UgcmFuZ2UKK3ZvaWQgQ29yZUNoZWNrczo6U2V0SW1hZ2VJbml0aWFsTGF5b3V0KENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFICZpbWFnZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZyYW5nZSwgVmtJbWFnZUxheW91dCBsYXlvdXQpIHsKKyAgICBhdXRvICpzdWJyZXNvdXJjZV9tYXAgPSBHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwKGNiX25vZGUsIGltYWdlX3N0YXRlKTsKKyAgICBhc3NlcnQoc3VicmVzb3VyY2VfbWFwKTsKKyAgICBzdWJyZXNvdXJjZV9tYXAtPlNldFN1YnJlc291cmNlUmFuZ2VJbml0aWFsTGF5b3V0KCpjYl9ub2RlLCBOb3JtYWxpemVTdWJyZXNvdXJjZVJhbmdlKGltYWdlX3N0YXRlLCByYW5nZSksIGxheW91dCk7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6U2V0SW1hZ2VJbml0aWFsTGF5b3V0KENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgbGF5b3V0KSB7CisgICAgY29uc3QgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgaWYgKCFpbWFnZV9zdGF0ZSkgcmV0dXJuOworICAgIFNldEltYWdlSW5pdGlhbExheW91dChjYl9ub2RlLCAqaW1hZ2Vfc3RhdGUsIHJhbmdlLCBsYXlvdXQpOworfTsKKwordm9pZCBDb3JlQ2hlY2tzOjpTZXRJbWFnZUluaXRpYWxMYXlvdXQoQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgY29uc3QgSU1BR0VfU1RBVEUgJmltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzICZsYXllcnMsIFZrSW1hZ2VMYXlvdXQgbGF5b3V0KSB7CisgICAgU2V0SW1hZ2VJbml0aWFsTGF5b3V0KGNiX25vZGUsIGltYWdlX3N0YXRlLCBSYW5nZUZyb21MYXllcnMobGF5ZXJzKSwgbGF5b3V0KTsKK30KKworLy8gU2V0IGltYWdlIGxheW91dCBmb3IgYWxsIHNsaWNlcyBvZiBhbiBpbWFnZSB2aWV3Cit2b2lkIENvcmVDaGVja3M6OlNldEltYWdlVmlld0xheW91dChDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlLCBjb25zdCBJTUFHRV9WSUVXX1NUQVRFICZ2aWV3X3N0YXRlLCBWa0ltYWdlTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgbGF5b3V0U3RlbmNpbCkgeworICAgIElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSA9IHZpZXdfc3RhdGUuaW1hZ2Vfc3RhdGUuZ2V0KCk7CisKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBzdWJfcmFuZ2UgPSB2aWV3X3N0YXRlLm5vcm1hbGl6ZWRfc3VicmVzb3VyY2VfcmFuZ2U7CisgICAgLy8gV2hlbiBjaGFuZ2luZyB0aGUgbGF5b3V0IG9mIGEgM0QgaW1hZ2Ugc3VicmVzb3VyY2UgdmlhIGEgMkQgb3IgMkRfQVJSUkFZIGltYWdlIHZpZXcsIGFsbCBkZXB0aCBzbGljZXMgb2YKKyAgICAvLyB0aGUgc3VicmVzb3VyY2UgbWlwIGxldmVsKHMpIGFyZSB0cmFuc2l0aW9uZWQsIGlnbm9yaW5nIGFueSBsYXllcnMgcmVzdHJpY3Rpb24gaW4gdGhlIHN1YnJlc291cmNlIGluZm8uCisgICAgaWYgKChpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8zRCkgJiYgKHZpZXdfc3RhdGUuY3JlYXRlX2luZm8udmlld1R5cGUgIT0gVktfSU1BR0VfVklFV19UWVBFXzNEKSkgeworICAgICAgICBzdWJfcmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgICAgICBzdWJfcmFuZ2UubGF5ZXJDb3VudCA9IGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmV4dGVudC5kZXB0aDsKKyAgICB9CisKKyAgICBpZiAoc3ViX3JhbmdlLmFzcGVjdE1hc2sgPT0gKFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpICYmIGxheW91dFN0ZW5jaWwgIT0ga0ludmFsaWRMYXlvdXQpIHsKKyAgICAgICAgc3ViX3JhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgICAgICBTZXRJbWFnZUxheW91dChjYl9ub2RlLCAqaW1hZ2Vfc3RhdGUsIHN1Yl9yYW5nZSwgbGF5b3V0KTsKKyAgICAgICAgc3ViX3JhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgICAgIFNldEltYWdlTGF5b3V0KGNiX25vZGUsICppbWFnZV9zdGF0ZSwgc3ViX3JhbmdlLCBsYXlvdXRTdGVuY2lsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTZXRJbWFnZUxheW91dChjYl9ub2RlLCAqaW1hZ2Vfc3RhdGUsIHN1Yl9yYW5nZSwgbGF5b3V0KTsKKyAgICB9Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVSZW5kZXJQYXNzTGF5b3V0QWdhaW5zdEZyYW1lYnVmZmVySW1hZ2VVc2FnZShSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBWa0ltYWdlTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlIGltYWdlLCBWa0ltYWdlVmlldyBpbWFnZV92aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRnJhbWVidWZmZXIgZnJhbWVidWZmZXIsIFZrUmVuZGVyUGFzcyByZW5kZXJwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGF0dGFjaG1lbnRfaW5kZXgsIGNvbnN0IGNoYXIgKnZhcmlhYmxlX25hbWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvIGltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgY29uc3QgY2hhciAqdnVpZDsKKyAgICBjb25zdCBib29sIHVzZV9ycDIgPSAocnBfdmVyc2lvbiA9PSBSRU5ERVJfUEFTU19WRVJTSU9OXzIpOworCisgICAgaWYgKCFpbWFnZV9zdGF0ZSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBIYW5kbGVUb1VpbnQ2NChpbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZW5kZXIgUGFzcyBiZWdpbiB3aXRoICVzIHVzZXMgJXMgd2hlcmUgcEF0dGFjaG1lbnRzWyUiIFBSSXUzMiAiXSA9ICVzLCB3aGljaCByZWZlcnMgdG8gYW4gaW52YWxpZCBpbWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHJlbmRlcnBhc3MpLmNfc3RyKCksIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoZnJhbWVidWZmZXIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2luZGV4LCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3ZpZXcpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc2tpcDsKKyAgICB9CisKKyAgICBhdXRvIGltYWdlX3VzYWdlID0gaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udXNhZ2U7CisKKyAgICAvLyBDaGVjayBmb3IgbGF5b3V0cyB0aGF0IG1pc21hdGNoIGltYWdlIHVzYWdlcyBpbiB0aGUgZnJhbWVidWZmZXIKKyAgICBpZiAobGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgJiYgIShpbWFnZV91c2FnZSAmIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUKSkgeworICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk0IiA6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA4OTUiOworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgSGFuZGxlVG9VaW50NjQoaW1hZ2UpLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAiTGF5b3V0L3VzYWdlIG1pc21hdGNoIGZvciBhdHRhY2htZW50ICV1IGluICVzIgorICAgICAgICAgICAgICAgICAgICAiIC0gdGhlICVzIGlzICVzIGJ1dCB0aGUgaW1hZ2UgYXR0YWNoZWQgdG8gJXMgdmlhICVzIgorICAgICAgICAgICAgICAgICAgICAiIHdhcyBub3QgY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIiwKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9pbmRleCwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShyZW5kZXJwYXNzKS5jX3N0cigpLCB2YXJpYWJsZV9uYW1lLCBzdHJpbmdfVmtJbWFnZUxheW91dChsYXlvdXQpLAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGZyYW1lYnVmZmVyKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3ZpZXcpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChsYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCAmJgorICAgICAgICAhKGltYWdlX3VzYWdlICYgKFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQpKSkgeworICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk3IiA6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA4OTciOworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgSGFuZGxlVG9VaW50NjQoaW1hZ2UpLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAiTGF5b3V0L3VzYWdlIG1pc21hdGNoIGZvciBhdHRhY2htZW50ICV1IGluICVzIgorICAgICAgICAgICAgICAgICAgICAiIC0gdGhlICVzIGlzICVzIGJ1dCB0aGUgaW1hZ2UgYXR0YWNoZWQgdG8gJXMgdmlhICVzIgorICAgICAgICAgICAgICAgICAgICAiIHdhcyBub3QgY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIG9yIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUIiwKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9pbmRleCwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShyZW5kZXJwYXNzKS5jX3N0cigpLCB2YXJpYWJsZV9uYW1lLCBzdHJpbmdfVmtJbWFnZUxheW91dChsYXlvdXQpLAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGZyYW1lYnVmZmVyKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3ZpZXcpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChsYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMICYmICEoaW1hZ2VfdXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUKSkgeworICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk4IiA6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA4OTgiOworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgSGFuZGxlVG9VaW50NjQoaW1hZ2UpLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAiTGF5b3V0L3VzYWdlIG1pc21hdGNoIGZvciBhdHRhY2htZW50ICV1IGluICVzIgorICAgICAgICAgICAgICAgICAgICAiIC0gdGhlICVzIGlzICVzIGJ1dCB0aGUgaW1hZ2UgYXR0YWNoZWQgdG8gJXMgdmlhICVzIgorICAgICAgICAgICAgICAgICAgICAiIHdhcyBub3QgY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQiLAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2luZGV4LCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHJlbmRlcnBhc3MpLmNfc3RyKCksIHZhcmlhYmxlX25hbWUsIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGxheW91dCksCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoZnJhbWVidWZmZXIpLmNfc3RyKCksIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2VfdmlldykuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKGxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwgJiYgIShpbWFnZV91c2FnZSAmIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQpKSB7CisgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWluaXRpYWxMYXlvdXQtMDMwOTkiIDogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtaW5pdGlhbExheW91dC0wMDg5OSI7CisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBIYW5kbGVUb1VpbnQ2NChpbWFnZSksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICJMYXlvdXQvdXNhZ2UgbWlzbWF0Y2ggZm9yIGF0dGFjaG1lbnQgJXUgaW4gJXMiCisgICAgICAgICAgICAgICAgICAgICIgLSB0aGUgJXMgaXMgJXMgYnV0IHRoZSBpbWFnZSBhdHRhY2hlZCB0byAlcyB2aWEgJXMiCisgICAgICAgICAgICAgICAgICAgICIgd2FzIG5vdCBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCIsCisgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfaW5kZXgsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocmVuZGVycGFzcykuY19zdHIoKSwgdmFyaWFibGVfbmFtZSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQobGF5b3V0KSwKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShmcmFtZWJ1ZmZlcikuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV92aWV3KS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX21haW50ZW5hbmNlMikgeworICAgICAgICBpZiAoKGxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIHx8CisgICAgICAgICAgICAgbGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgfHwKKyAgICAgICAgICAgICBsYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIHx8CisgICAgICAgICAgICAgbGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMKSAmJgorICAgICAgICAgICAgIShpbWFnZV91c2FnZSAmIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQpKSB7CisgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk2IiA6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDE3NTgiOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgSGFuZGxlVG9VaW50NjQoaW1hZ2UpLCB2dWlkLAorICAgICAgICAgICAgICAgICJMYXlvdXQvdXNhZ2UgbWlzbWF0Y2ggZm9yIGF0dGFjaG1lbnQgJXUgaW4gJXMiCisgICAgICAgICAgICAgICAgIiAtIHRoZSAlcyBpcyAlcyBidXQgdGhlIGltYWdlIGF0dGFjaGVkIHRvICVzIHZpYSAlcyIKKyAgICAgICAgICAgICAgICAiIHdhcyBub3QgY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQiLAorICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfaW5kZXgsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocmVuZGVycGFzcykuY19zdHIoKSwgdmFyaWFibGVfbmFtZSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQobGF5b3V0KSwKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGZyYW1lYnVmZmVyKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3ZpZXcpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGNyZWF0ZSByZW5kZXIgcGFzcyAyIGV4dGVuc2lvbiByZXF1aXJlcyBtYWludGVuYW5jZSAyICh0aGUgcHJldmlvdXMgYnJhbmNoKSwgc28gbm8gdnVpZCBzd2l0Y2ggbmVlZGVkIGhlcmUuCisgICAgICAgIGlmICgobGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCB8fAorICAgICAgICAgICAgIGxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCkgJiYKKyAgICAgICAgICAgICEoaW1hZ2VfdXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZSksICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA4OTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXlvdXQvdXNhZ2UgbWlzbWF0Y2ggZm9yIGF0dGFjaG1lbnQgJXUgaW4gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtIHRoZSAlcyBpcyAlcyBidXQgdGhlIGltYWdlIGF0dGFjaGVkIHRvICVzIHZpYSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdhcyBub3QgY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfaW5kZXgsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocmVuZGVycGFzcykuY19zdHIoKSwgdmFyaWFibGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZUxheW91dChsYXlvdXQpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGZyYW1lYnVmZmVyKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2VfdmlldykuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmVyaWZ5RnJhbWVidWZmZXJBbmRSZW5kZXJQYXNzTGF5b3V0cyhSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpwQ0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZSQU1FQlVGRkVSX1NUQVRFICpmcmFtZWJ1ZmZlcl9zdGF0ZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGF1dG8gY29uc3QgcFJlbmRlclBhc3NJbmZvID0gR2V0UmVuZGVyUGFzc1N0YXRlKHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlclBhc3MpLT5jcmVhdGVJbmZvLnB0cigpOworICAgIGF1dG8gY29uc3QgJmZyYW1lYnVmZmVySW5mbyA9IGZyYW1lYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvOworICAgIGNvbnN0IFZrSW1hZ2VWaWV3ICphdHRhY2htZW50cyA9IGZyYW1lYnVmZmVySW5mby5wQXR0YWNobWVudHM7CisKKyAgICBhdXRvIHJlbmRlcl9wYXNzID0gR2V0UmVuZGVyUGFzc1N0YXRlKHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlclBhc3MpLT5yZW5kZXJQYXNzOworICAgIGF1dG8gZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcl9zdGF0ZS0+ZnJhbWVidWZmZXI7CisKKyAgICBpZiAocFJlbmRlclBhc3NJbmZvLT5hdHRhY2htZW50Q291bnQgIT0gZnJhbWVidWZmZXJJbmZvLmF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENCLT5jb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFJlbmRlcnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAiWW91IGNhbm5vdCBzdGFydCBhIHJlbmRlciBwYXNzIHVzaW5nIGEgZnJhbWVidWZmZXIgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgYXR0YWNobWVudHMuIik7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqYXR0YWNobWVudEluZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSPihwUmVuZGVyUGFzc0JlZ2luLT5wTmV4dCk7CisgICAgaWYgKCgoZnJhbWVidWZmZXJJbmZvLmZsYWdzICYgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSKSAhPSAwKSAmJiBhdHRhY2htZW50SW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIGF0dGFjaG1lbnRzID0gYXR0YWNobWVudEluZm8tPnBBdHRhY2htZW50czsKKyAgICB9CisKKyAgICBpZiAoYXR0YWNobWVudHMgIT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCBhdXRvICpjb25zdF9wQ0IgPSBzdGF0aWNfY2FzdDxjb25zdCBDTURfQlVGRkVSX1NUQVRFICo+KHBDQik7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwUmVuZGVyUGFzc0luZm8tPmF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBhdXRvIGltYWdlX3ZpZXcgPSBhdHRhY2htZW50c1tpXTsKKyAgICAgICAgICAgIGF1dG8gdmlld19zdGF0ZSA9IEdldEltYWdlVmlld1N0YXRlKGltYWdlX3ZpZXcpOworCisgICAgICAgICAgICBpZiAoIXZpZXdfc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKSwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJlZ2luUmVuZGVyUGFzcygpOiAlcyBwQXR0YWNobWVudHNbJSIgUFJJdTMyICJdID0gJXMgaXMgbm90IGEgdmFsaWQgVmtJbWFnZVZpZXcgaGFuZGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShmcmFtZWJ1ZmZlcl9zdGF0ZS0+ZnJhbWVidWZmZXIpLmNfc3RyKCksIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2VfdmlldykuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2UgaW1hZ2UgPSB2aWV3X3N0YXRlLT5jcmVhdGVfaW5mby5pbWFnZTsKKyAgICAgICAgICAgIGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworCisgICAgICAgICAgICBpZiAoIWltYWdlX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFJlbmRlclBhc3NCZWdpbi0+cmVuZGVyUGFzcyksICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci1wYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCZWdpblJlbmRlclBhc3MoKTogJXMgcEF0dGFjaG1lbnRzWyUiIFBSSXUzMiAiXSA9ICAlcyByZWZlcmVuY2VzIG5vbi1leHRhbnQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShmcmFtZWJ1ZmZlcl9zdGF0ZS0+ZnJhbWVidWZmZXIpLmNfc3RyKCksIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2VfdmlldykuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGF0dGFjaG1lbnRfaW5pdGlhbF9sYXlvdXQgPSBwUmVuZGVyUGFzc0luZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0OworICAgICAgICAgICAgYXV0byBmaW5hbF9sYXlvdXQgPSBwUmVuZGVyUGFzc0luZm8tPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dDsKKworICAgICAgICAgICAgLy8gQ2FzdCBwQ0IgdG8gY29uc3QgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSBlbnRyaWVzIHRoYXQgZG9uJ3QgZXhpc3QgaGVyZSAoaW4gY2FzZSB0aGUga2V5IGNoYW5nZXMgdG8gc29tZXRoaW5nCisgICAgICAgICAgICAvLyBpbiBjb21tb24gd2l0aCB0aGUgbm9uLWNvbnN0IHZlcnNpb24uKQorICAgICAgICAgICAgY29uc3QgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcCAqc3VicmVzb3VyY2VfbWFwID0KKyAgICAgICAgICAgICAgICAoYXR0YWNobWVudF9pbml0aWFsX2xheW91dCAhPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEKSA/IEdldEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXAoY29uc3RfcENCLCBpbWFnZSkgOiBudWxscHRyOworCisgICAgICAgICAgICBpZiAoc3VicmVzb3VyY2VfbWFwKSB7ICAvLyBJZiBubyBsYXlvdXQgaW5mb3JtYXRpb24gZm9yIGltYWdlIHlldCwgd2lsbCBiZSBjaGVja2VkIGF0IFF1ZXVlU3VibWl0IHRpbWUKKyAgICAgICAgICAgICAgICBMYXlvdXRVc2VDaGVja0FuZE1lc3NhZ2UgbGF5b3V0X2NoZWNrKHN1YnJlc291cmNlX21hcCk7CisgICAgICAgICAgICAgICAgYm9vbCBzdWJyZXNfc2tpcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGF1dG8gc3VicmVzb3VyY2VfY2IgPSBbdGhpcywgaSwgYXR0YWNobWVudF9pbml0aWFsX2xheW91dCwgJmxheW91dF9jaGVjaywgJnN1YnJlc19za2lwXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSAmc3VicmVzLCBWa0ltYWdlTGF5b3V0IGxheW91dCwgVmtJbWFnZUxheW91dCBpbml0aWFsX2xheW91dCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWxheW91dF9jaGVjay5DaGVjayhzdWJyZXMsIGF0dGFjaG1lbnRfaW5pdGlhbF9sYXlvdXQsIGxheW91dCwgaW5pdGlhbF9sYXlvdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJyZXNfc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUmVuZGVycGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgY2Fubm90IHN0YXJ0IGEgcmVuZGVyIHBhc3MgdXNpbmcgYXR0YWNobWVudCAldSB3aGVyZSB0aGUgcmVuZGVyIHBhc3MgaW5pdGlhbCBsYXlvdXQgaXMgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCB0aGUgJXMgbGF5b3V0IG9mIHRoZSBhdHRhY2htZW50IGlzICVzLiBUaGUgbGF5b3V0cyBtdXN0IG1hdGNoLCBvciB0aGUgcmVuZGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzIGluaXRpYWwgbGF5b3V0IGZvciB0aGUgYXR0YWNobWVudCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoYXR0YWNobWVudF9pbml0aWFsX2xheW91dCksIGxheW91dF9jaGVjay5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQobGF5b3V0X2NoZWNrLmxheW91dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAhc3VicmVzX3NraXA7ICAvLyBxdWl0IGNoZWNraW5nIHN1YnJlc291cmNlcyBvbmNlIHdlIGZhaWwgb25jZQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBzdWJyZXNvdXJjZV9tYXAtPkZvclJhbmdlKHZpZXdfc3RhdGUtPm5vcm1hbGl6ZWRfc3VicmVzb3VyY2VfcmFuZ2UsIHN1YnJlc291cmNlX2NiKTsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHN1YnJlc19za2lwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWYWxpZGF0ZVJlbmRlclBhc3NMYXlvdXRBZ2FpbnN0RnJhbWVidWZmZXJJbWFnZVVzYWdlKHJwX3ZlcnNpb24sIGF0dGFjaG1lbnRfaW5pdGlhbF9sYXlvdXQsIGltYWdlLCBpbWFnZV92aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciwgcmVuZGVyX3Bhc3MsIGksICJpbml0aWFsIGxheW91dCIpOworCisgICAgICAgICAgICBWYWxpZGF0ZVJlbmRlclBhc3NMYXlvdXRBZ2FpbnN0RnJhbWVidWZmZXJJbWFnZVVzYWdlKHJwX3ZlcnNpb24sIGZpbmFsX2xheW91dCwgaW1hZ2UsIGltYWdlX3ZpZXcsIGZyYW1lYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfcGFzcywgaSwgImZpbmFsIGxheW91dCIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBSZW5kZXJQYXNzSW5mby0+c3VicGFzc0NvdW50OyArK2opIHsKKyAgICAgICAgICAgIGF1dG8gJnN1YnBhc3MgPSBwUmVuZGVyUGFzc0luZm8tPnBTdWJwYXNzZXNbal07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgcFJlbmRlclBhc3NJbmZvLT5wU3VicGFzc2VzW2pdLmlucHV0QXR0YWNobWVudENvdW50OyArK2spIHsKKyAgICAgICAgICAgICAgICBhdXRvICZhdHRhY2htZW50X3JlZiA9IHN1YnBhc3MucElucHV0QXR0YWNobWVudHNba107CisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpbWFnZV92aWV3ID0gYXR0YWNobWVudHNbYXR0YWNobWVudF9yZWYuYXR0YWNobWVudF07CisgICAgICAgICAgICAgICAgICAgIGF1dG8gdmlld19zdGF0ZSA9IEdldEltYWdlVmlld1N0YXRlKGltYWdlX3ZpZXcpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3X3N0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGltYWdlID0gdmlld19zdGF0ZS0+Y3JlYXRlX2luZm8uaW1hZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZVJlbmRlclBhc3NMYXlvdXRBZ2FpbnN0RnJhbWVidWZmZXJJbWFnZVVzYWdlKHJwX3ZlcnNpb24sIGF0dGFjaG1lbnRfcmVmLmxheW91dCwgaW1hZ2UsIGltYWdlX3ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLCByZW5kZXJfcGFzcywgYXR0YWNobWVudF9yZWYuYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IGF0dGFjaG1lbnQgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgayA9IDA7IGsgPCBwUmVuZGVyUGFzc0luZm8tPnBTdWJwYXNzZXNbal0uY29sb3JBdHRhY2htZW50Q291bnQ7ICsraykgeworICAgICAgICAgICAgICAgIGF1dG8gJmF0dGFjaG1lbnRfcmVmID0gc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1trXTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9yZWYuYXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGltYWdlX3ZpZXcgPSBhdHRhY2htZW50c1thdHRhY2htZW50X3JlZi5hdHRhY2htZW50XTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB2aWV3X3N0YXRlID0gR2V0SW1hZ2VWaWV3U3RhdGUoaW1hZ2Vfdmlldyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdfc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2UgPSB2aWV3X3N0YXRlLT5jcmVhdGVfaW5mby5pbWFnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlUmVuZGVyUGFzc0xheW91dEFnYWluc3RGcmFtZWJ1ZmZlckltYWdlVXNhZ2UocnBfdmVyc2lvbiwgYXR0YWNobWVudF9yZWYubGF5b3V0LCBpbWFnZSwgaW1hZ2VfdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsIHJlbmRlcl9wYXNzLCBhdHRhY2htZW50X3JlZi5hdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IgYXR0YWNobWVudCBsYXlvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJwYXNzLnBSZXNvbHZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZVJlbmRlclBhc3NMYXlvdXRBZ2FpbnN0RnJhbWVidWZmZXJJbWFnZVVzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycF92ZXJzaW9uLCBhdHRhY2htZW50X3JlZi5sYXlvdXQsIGltYWdlLCBpbWFnZV92aWV3LCBmcmFtZWJ1ZmZlciwgcmVuZGVyX3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQsICJyZXNvbHZlIGF0dGFjaG1lbnQgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwUmVuZGVyUGFzc0luZm8tPnBTdWJwYXNzZXNbal0ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHsKKyAgICAgICAgICAgICAgICBhdXRvICZhdHRhY2htZW50X3JlZiA9ICpzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50OworICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50X3JlZi5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfdmlldyA9IGF0dGFjaG1lbnRzW2F0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnRdOworICAgICAgICAgICAgICAgICAgICBhdXRvIHZpZXdfc3RhdGUgPSBHZXRJbWFnZVZpZXdTdGF0ZShpbWFnZV92aWV3KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodmlld19zdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpbWFnZSA9IHZpZXdfc3RhdGUtPmNyZWF0ZV9pbmZvLmltYWdlOworICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVSZW5kZXJQYXNzTGF5b3V0QWdhaW5zdEZyYW1lYnVmZmVySW1hZ2VVc2FnZShycF92ZXJzaW9uLCBhdHRhY2htZW50X3JlZi5sYXlvdXQsIGltYWdlLCBpbWFnZV92aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciwgcmVuZGVyX3Bhc3MsIGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCBhdHRhY2htZW50IGxheW91dCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit2b2lkIENvcmVDaGVja3M6OlRyYW5zaXRpb25BdHRhY2htZW50UmVmTGF5b3V0KENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgRlJBTUVCVUZGRVJfU1RBVEUgKnBGcmFtZWJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSICZyZWYpIHsKKyAgICBpZiAocmVmLmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgYXV0byBpbWFnZV92aWV3ID0gR2V0QXR0YWNobWVudEltYWdlVmlld1N0YXRlKHBGcmFtZWJ1ZmZlciwgcmVmLmF0dGFjaG1lbnQpOworICAgICAgICBpZiAoaW1hZ2VfdmlldykgeworICAgICAgICAgICAgVmtJbWFnZUxheW91dCBzdGVuY2lsX2xheW91dCA9IGtJbnZhbGlkTGF5b3V0OworICAgICAgICAgICAgY29uc3QgYXV0byAqYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSPihyZWYucE5leHQpOworICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0KSB7CisgICAgICAgICAgICAgICAgc3RlbmNpbF9sYXlvdXQgPSBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2V0SW1hZ2VWaWV3TGF5b3V0KHBDQiwgKmltYWdlX3ZpZXcsIHJlZi5sYXlvdXQsIHN0ZW5jaWxfbGF5b3V0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb3JlQ2hlY2tzOjpUcmFuc2l0aW9uU3VicGFzc0xheW91dHMoQ01EX0JVRkZFUl9TVEFURSAqcENCLCBjb25zdCBSRU5ERVJfUEFTU19TVEFURSAqcmVuZGVyX3Bhc3Nfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3VicGFzc19pbmRleCwgRlJBTUVCVUZGRVJfU1RBVEUgKmZyYW1lYnVmZmVyX3N0YXRlKSB7CisgICAgYXNzZXJ0KHJlbmRlcl9wYXNzX3N0YXRlKTsKKworICAgIGlmIChmcmFtZWJ1ZmZlcl9zdGF0ZSkgeworICAgICAgICBhdXRvIGNvbnN0ICZzdWJwYXNzID0gcmVuZGVyX3Bhc3Nfc3RhdGUtPmNyZWF0ZUluZm8ucFN1YnBhc3Nlc1tzdWJwYXNzX2luZGV4XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHN1YnBhc3MuaW5wdXRBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICAgICAgVHJhbnNpdGlvbkF0dGFjaG1lbnRSZWZMYXlvdXQocENCLCBmcmFtZWJ1ZmZlcl9zdGF0ZSwgc3VicGFzcy5wSW5wdXRBdHRhY2htZW50c1tqXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICAgICAgVHJhbnNpdGlvbkF0dGFjaG1lbnRSZWZMYXlvdXQocENCLCBmcmFtZWJ1ZmZlcl9zdGF0ZSwgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHsKKyAgICAgICAgICAgIFRyYW5zaXRpb25BdHRhY2htZW50UmVmTGF5b3V0KHBDQiwgZnJhbWVidWZmZXJfc3RhdGUsICpzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gVHJhbnNpdGlvbiB0aGUgbGF5b3V0IHN0YXRlIGZvciByZW5kZXJwYXNzIGF0dGFjaG1lbnRzIGJhc2VkIG9uIHRoZSBCZWdpblJlbmRlclBhc3MoKSBjYWxsLiBUaGlzIGluY2x1ZGVzOgorLy8gMS4gVHJhbnNpdGlvbiBpbnRvIGluaXRpYWxMYXlvdXQgc3RhdGUKKy8vIDIuIFRyYW5zaXRpb24gZnJvbSBpbml0aWFsTGF5b3V0IHRvIGxheW91dCB1c2VkIGluIHN1YnBhc3MgMAordm9pZCBDb3JlQ2hlY2tzOjpUcmFuc2l0aW9uQmVnaW5SZW5kZXJQYXNzTGF5b3V0cyhDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgY29uc3QgUkVOREVSX1BBU1NfU1RBVEUgKnJlbmRlcl9wYXNzX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRUJVRkZFUl9TVEFURSAqZnJhbWVidWZmZXJfc3RhdGUpIHsKKyAgICAvLyBGaXJzdCB0cmFuc2l0aW9uIGludG8gaW5pdGlhbExheW91dAorICAgIGF1dG8gY29uc3QgcnBjaSA9IHJlbmRlcl9wYXNzX3N0YXRlLT5jcmVhdGVJbmZvLnB0cigpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBycGNpLT5hdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICBhdXRvIHZpZXdfc3RhdGUgPSBHZXRBdHRhY2htZW50SW1hZ2VWaWV3U3RhdGUoZnJhbWVidWZmZXJfc3RhdGUsIGkpOworICAgICAgICBpZiAodmlld19zdGF0ZSkgeworICAgICAgICAgICAgVmtJbWFnZUxheW91dCBzdGVuY2lsX2xheW91dCA9IGtJbnZhbGlkTGF5b3V0OworICAgICAgICAgICAgY29uc3QgYXV0byAqYXR0YWNobWVudF9kZXNjcmlwdGlvbl9zdGVuY2lsX2xheW91dCA9CisgICAgICAgICAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSPihycGNpLT5wQXR0YWNobWVudHNbaV0ucE5leHQpOworICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQpIHsKKyAgICAgICAgICAgICAgICBzdGVuY2lsX2xheW91dCA9IGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxJbml0aWFsTGF5b3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZXRJbWFnZVZpZXdMYXlvdXQoY2Jfc3RhdGUsICp2aWV3X3N0YXRlLCBycGNpLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCwgc3RlbmNpbF9sYXlvdXQpOworICAgICAgICB9CisgICAgfQorICAgIC8vIE5vdyB0cmFuc2l0aW9uIGZvciBmaXJzdCBzdWJwYXNzIChpbmRleCAwKQorICAgIFRyYW5zaXRpb25TdWJwYXNzTGF5b3V0cyhjYl9zdGF0ZSwgcmVuZGVyX3Bhc3Nfc3RhdGUsIDAsIGZyYW1lYnVmZmVyX3N0YXRlKTsKK30KKworYm9vbCBWZXJpZnlBc3BlY3RzUHJlc2VudChWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0X21hc2ssIFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGlmICgoYXNwZWN0X21hc2sgJiBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUKSAhPSAwKSB7CisgICAgICAgIGlmICghKEZvcm1hdElzQ29sb3IoZm9ybWF0KSB8fCBGb3JtYXRJc011bHRpcGxhbmUoZm9ybWF0KSkpIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKChhc3BlY3RfbWFzayAmIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpICE9IDApIHsKKyAgICAgICAgaWYgKCFGb3JtYXRIYXNEZXB0aChmb3JtYXQpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICgoYXNwZWN0X21hc2sgJiBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpICE9IDApIHsKKyAgICAgICAgaWYgKCFGb3JtYXRIYXNTdGVuY2lsKGZvcm1hdCkpIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKDAgIT0KKyAgICAgICAgKGFzcGVjdF9tYXNrICYgKFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVF9LSFIgfCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVRfS0hSIHwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUX0tIUikpKSB7CisgICAgICAgIGlmIChGb3JtYXRQbGFuZUNvdW50KGZvcm1hdCkgPT0gMSkgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVmVyaWZ5IGFuIEltYWdlTWVtb3J5QmFycmllcidzIG9sZC9uZXcgSW1hZ2VMYXlvdXRzIGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIEltYWdlJ3MgSW1hZ2VVc2FnZUZsYWdzLgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUJhcnJpZXJMYXlvdXRUb0ltYWdlVXNhZ2UoY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgJmltZ19iYXJyaWVyLCBib29sIG5ld19ub3Rfb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2VfZmxhZ3MsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJhcnJpZXJfcG5hbWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBWa0ltYWdlTGF5b3V0IGxheW91dCA9IChuZXdfbm90X29sZCkgPyBpbWdfYmFycmllci5uZXdMYXlvdXQgOiBpbWdfYmFycmllci5vbGRMYXlvdXQ7CisgICAgY29uc3QgY2hhciAqbXNnX2NvZGUgPSBrVlVJRFVuZGVmaW5lZDsgIC8vIHNlbnRpbmVsIHZhbHVlIG1lYW5pbmcgIm5vIGVycm9yIgorCisgICAgc3dpdGNoIChsYXlvdXQpIHsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOgorICAgICAgICAgICAgaWYgKCh1c2FnZV9mbGFncyAmIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbXNnX2NvZGUgPSAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMDgiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOgorICAgICAgICAgICAgaWYgKCh1c2FnZV9mbGFncyAmIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQpID09IDApIHsKKyAgICAgICAgICAgICAgICBtc2dfY29kZSA9ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIwOSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDoKKyAgICAgICAgICAgIGlmICgodXNhZ2VfZmxhZ3MgJiBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbXNnX2NvZGUgPSAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDoKKyAgICAgICAgICAgIGlmICgodXNhZ2VfZmxhZ3MgJiAoVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgfCBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBtc2dfY29kZSA9ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw6CisgICAgICAgICAgICBpZiAoKHVzYWdlX2ZsYWdzICYgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1zZ19jb2RlID0gIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDoKKyAgICAgICAgICAgIGlmICgodXNhZ2VfZmxhZ3MgJiBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbXNnX2NvZGUgPSAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTMiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NIQURJTkdfUkFURV9PUFRJTUFMX05WOgorICAgICAgICAgICAgaWYgKCh1c2FnZV9mbGFncyAmIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYpID09IDApIHsKKyAgICAgICAgICAgICAgICBtc2dfY29kZSA9ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMjA4OCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIE90aGVyIFZrSW1hZ2VMYXlvdXQgdmFsdWVzIGRvIG5vdCBoYXZlIFZVcyBkZWZpbmVkIGluIHRoaXMgY29udGV4dC4KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtc2dfY29kZSAhPSBrVlVJRFVuZGVmaW5lZCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1nX2JhcnJpZXIuaW1hZ2UpLCBtc2dfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogSW1hZ2UgYmFycmllciAlcyAlcyBMYXlvdXQ9JXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCAlcyB1c2FnZSBmbGFncyAweCUiIFBSSXgzMiAiLiIsIGZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhcnJpZXJfcG5hbWUsICgobmV3X25vdF9vbGQpID8gIm5ldyIgOiAib2xkIiksIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGxheW91dCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltZ19iYXJyaWVyLmltYWdlKS5jX3N0cigpLCB1c2FnZV9mbGFncyk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisvLyBWZXJpZnkgaW1hZ2UgYmFycmllcnMgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgaW1hZ2VzIHRoZXkgcmVmZXJlbmNlLgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUJhcnJpZXJzVG9JbWFnZXMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbW9yeUJhcnJpZXJzLCBjb25zdCBjaGFyICpmdW5jX25hbWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFNjb3JlYm9hcmQgZm9yIGNoZWNraW5nIGZvciBkdXBsaWNhdGUgYW5kIGluY29uc2lzdGVudCBiYXJyaWVycyB0byBpbWFnZXMKKyAgICBzdHJ1Y3QgSW1hZ2VCYXJyaWVyU2NvcmVib2FyZEVudHJ5IHsKKyAgICAgICAgdWludDMyX3QgaW5kZXg7CisgICAgICAgIC8vIFRoaXMgaXMgZGVzaWduZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIEFQSSBjYWxsLiAgSWYgcmV0YWluZWQgc3RvcmFnZSBvZiB0aGUgYmFycmllcnMgaXMKKyAgICAgICAgLy8gcmVxdWlyZWQsIGNvcGllcyBzaG91bGQgYmUgbWFkZSBhbmQgc21hcnQgb3IgdW5pcXVlIHBvaW50ZXJzIHVzZWQgaW4gc29tZSBvdGhlciBzdHVjdHVyZSAob3IgdGhpcyBvbmUgcmVmYWN0b3JlZCkKKyAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKmJhcnJpZXI7CisgICAgfTsKKyAgICB1c2luZyBJbWFnZUJhcnJpZXJTY29yZWJvYXJkU3VicmVzTWFwID0gc3RkOjp1bm9yZGVyZWRfbWFwPFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLCBJbWFnZUJhcnJpZXJTY29yZWJvYXJkRW50cnk+OworICAgIHVzaW5nIEltYWdlQmFycmllclNjb3JlYm9hcmRJbWFnZU1hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxWa0ltYWdlLCBJbWFnZUJhcnJpZXJTY29yZWJvYXJkU3VicmVzTWFwPjsKKworICAgIC8vIFNjb3JlYm9hcmQgZm9yIGR1cGxpY2F0ZSBsYXlvdXQgdHJhbnNpdGlvbiBiYXJyaWVycyB3aXRoaW4gdGhlIGxpc3QKKyAgICAvLyBQb2ludGVycyByZXRhaW5lZCBpbiB0aGUgc2NvcmVib2FyZCBvbmx5IGhhdmUgdGhlIGxpZmV0aW1lIG9mICp0aGlzKiBjYWxsIChpLmUuIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIEFQSSBjYWxsKQorICAgIEltYWdlQmFycmllclNjb3JlYm9hcmRJbWFnZU1hcCBsYXlvdXRfdHJhbnNpdGlvbnM7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBhdXRvICZpbWdfYmFycmllciA9IHBJbWFnZU1lbW9yeUJhcnJpZXJzW2ldOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBiYXJyaWVyX3BuYW1lID0gInBJbWFnZU1lbW9yeUJhcnJpZXJbIiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIl0iOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2NvcmVib2FyZCBvZiBsYXlvdXQgdHJhbnNpdGlvbnMgYW5kIGNoZWNrIGZvciBiYXJyaWVycyBhZmZlY3RpbmcgdGhlIHNhbWUgaW1hZ2UgYW5kIHN1YnJlc291cmNlCisgICAgICAgIC8vIFRPRE86IGEgaGlnaGVyIHByZWNpc2lvbiBjb3VsZCBiZSBnYWluZWQgYnkgYWRhcHRpbmcgdGhlIGNvbW1hbmRfYnVmZmVyIGltYWdlX2xheW91dF9tYXAgbG9naWMgbG9va2luZyBmb3IgY29uZmxpY3RzCisgICAgICAgIC8vIGF0IGEgcGVyIHN1Yi1yZXNvdXJjZSBsZXZlbAorICAgICAgICBpZiAoaW1nX2JhcnJpZXIub2xkTGF5b3V0ICE9IGltZ19iYXJyaWVyLm5ld0xheW91dCkgeworICAgICAgICAgICAgY29uc3QgSW1hZ2VCYXJyaWVyU2NvcmVib2FyZEVudHJ5IG5ld19lbnRyeXtpLCAmaW1nX2JhcnJpZXJ9OworICAgICAgICAgICAgY29uc3QgYXV0byBpbWFnZV9pdCA9IGxheW91dF90cmFuc2l0aW9ucy5maW5kKGltZ19iYXJyaWVyLmltYWdlKTsKKyAgICAgICAgICAgIGlmIChpbWFnZV9pdCAhPSBsYXlvdXRfdHJhbnNpdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvICZzdWJyZXNfbWFwID0gaW1hZ2VfaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBhdXRvIHN1YnJlc19pdCA9IHN1YnJlc19tYXAuZmluZChpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VicmVzX2l0ICE9IHN1YnJlc19tYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byAmZW50cnkgPSBzdWJyZXNfaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlbnRyeS5iYXJyaWVyLT5uZXdMYXlvdXQgIT0gaW1nX2JhcnJpZXIub2xkTGF5b3V0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGltZ19iYXJyaWVyLm9sZExheW91dCAhPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnJhbmdlID0gaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTE5NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyBjb25mbGljdHMgd2l0aCBlYXJsaWVyIGVudHJ5IHBJbWFnZU1lbW9yeUJhcnJpZXJbJXVdLiAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN1YnJlc291cmNlUmFuZ2U6IGFzcGVjdE1hc2s9JXUgYmFzZU1pcExldmVsPSV1IGxldmVsQ291bnQ9JXUsIGJhc2VBcnJheUxheWVyPSV1LCBsYXllckNvdW50PSV1OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZsaWN0aW5nIGJhcnJpZXIgdHJhbnNpdGlvbnMgaW1hZ2UgbGF5b3V0IGZyb20gJXMgd2hlbiBlYXJsaWVyIGJhcnJpZXIgdHJhbnNpdGlvbmVkIHRvIGxheW91dCAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgYmFycmllcl9wbmFtZS5jX3N0cigpLCBlbnRyeS5pbmRleCwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWdfYmFycmllci5pbWFnZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5hc3BlY3RNYXNrLCByYW5nZS5iYXNlTWlwTGV2ZWwsIHJhbmdlLmxldmVsQ291bnQsIHJhbmdlLmJhc2VBcnJheUxheWVyLCByYW5nZS5sYXllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGltZ19iYXJyaWVyLm9sZExheW91dCksIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGVudHJ5LmJhcnJpZXItPm5ld0xheW91dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3X2VudHJ5OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1YnJlc19tYXBbaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZV0gPSBuZXdfZW50cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXlvdXRfdHJhbnNpdGlvbnNbaW1nX2JhcnJpZXIuaW1hZ2VdW2ltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2VdID0gbmV3X2VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXV0byBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1nX2JhcnJpZXIuaW1hZ2UpOworICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUpIHsKKyAgICAgICAgICAgIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlX2ZsYWdzID0gaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udXNhZ2U7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQmFycmllckxheW91dFRvSW1hZ2VVc2FnZShpbWdfYmFycmllciwgZmFsc2UsIHVzYWdlX2ZsYWdzLCBmdW5jX25hbWUsIGJhcnJpZXJfcG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQmFycmllckxheW91dFRvSW1hZ2VVc2FnZShpbWdfYmFycmllciwgdHJ1ZSwgdXNhZ2VfZmxhZ3MsIGZ1bmNfbmFtZSwgYmFycmllcl9wbmFtZS5jX3N0cigpKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGxheW91dCBpcyBhYmxlIHRvIGJlIHRyYW5zaXRpb25lZCwgY3VycmVudGx5IG9ubHkgcHJlc2VudGVkIHNoYXJlZCBwcmVzZW50YWJsZSBpbWFnZXMgYXJlIGxvY2tlZAorICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlLT5sYXlvdXRfbG9ja2VkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogQWRkIHVuaXF1ZSBpZCBmb3IgZXJyb3Igd2hlbiBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1nX2JhcnJpZXIuaW1hZ2UpLCAwLAorICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byB0cmFuc2l0aW9uIHNoYXJlZCBwcmVzZW50YWJsZSAlcyIKKyAgICAgICAgICAgICAgICAgICAgIiBmcm9tIGxheW91dCAlcyB0byBsYXlvdXQgJXMsIGJ1dCBpbWFnZSBoYXMgYWxyZWFkeSBiZWVuIHByZXNlbnRlZCBhbmQgY2Fubm90IGhhdmUgaXRzIGxheW91dCB0cmFuc2l0aW9uZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWdfYmFycmllci5pbWFnZSkuY19zdHIoKSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoaW1nX2JhcnJpZXIub2xkTGF5b3V0KSwKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoaW1nX2JhcnJpZXIubmV3TGF5b3V0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZpbWFnZV9jcmVhdGVfaW5mbyA9IGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvOworICAgICAgICAgICAgLy8gRm9yIGEgRGVwdGgvU3RlbmNpbCBpbWFnZSBib3RoIGFzcGVjdHMgTVVTVCBiZSBzZXQKKyAgICAgICAgICAgIGlmIChGb3JtYXRJc0RlcHRoQW5kU3RlbmNpbChpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgYXV0byBjb25zdCBhc3BlY3RfbWFzayA9IGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzazsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZF9mZWF0dXJlcy5zZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHNfZmVhdHVyZXMuc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGFzcGVjdF9tYXNrICYgKFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1nX2JhcnJpZXIuaW1hZ2UpLCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMzMxOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEltYWdlIGJhcnJpZXIgJXMgcmVmZXJlbmNlcyAlcyBvZiBmb3JtYXQgJXMgdGhhdCBtdXN0IGhhdmUgZWl0aGVyIHRoZSBkZXB0aCBvciBzdGVuY2lsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc3BlY3RzIHNldCwgYnV0IGl0cyBhc3BlY3RNYXNrIGlzIDB4JSIgUFJJeDMyICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgYmFycmllcl9wbmFtZS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltZ19iYXJyaWVyLmltYWdlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrRm9ybWF0KGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCksIGFzcGVjdF9tYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29uc3QgZHNfbWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYXNwZWN0X21hc2sgJiBkc19tYXNrKSAhPSAoZHNfbWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1nX2JhcnJpZXIuaW1hZ2UpLCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMzMyMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbWFnZSBiYXJyaWVyICVzIHJlZmVyZW5jZXMgJXMgb2YgZm9ybWF0ICVzIHRoYXQgbXVzdCBoYXZlIHRoZSBkZXB0aCBhbmQgc3RlbmNpbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzcGVjdHMgc2V0LCBidXQgaXRzIGFzcGVjdE1hc2sgaXMgMHglIiBQUkl4MzIgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgYmFycmllcl9wbmFtZS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltZ19iYXJyaWVyLmltYWdlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0Zvcm1hdChpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQpLCBhc3BlY3RfbWFzayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gKnN1YnJlc291cmNlX21hcCA9IEdldEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXAoY2Jfc3RhdGUsIGltZ19iYXJyaWVyLmltYWdlKTsKKyAgICAgICAgICAgIGlmIChpbWdfYmFycmllci5vbGRMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IFNldCBtZW1vcnkgaW52YWxpZCB3aGljaCBpcyBpbiBtZW1fdHJhY2tlciBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSBpZiB0aGlzIG5lZWRzIHRvIGJlIGluIHRoZSBGb3JSYW5nZSB0cmF2ZXJzYWwsIHB1bGxpbmcgaXQgb3V0IGFzIGl0IGlzIGN1cnJlbnRseSBpbnZhcmlhbnQgd2l0aAorICAgICAgICAgICAgICAgIC8vIHN1YnJlc291cmNlLgorICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJyZXNvdXJjZV9tYXApIHsKKyAgICAgICAgICAgICAgICBib29sIHN1YnJlc19za2lwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgTGF5b3V0VXNlQ2hlY2tBbmRNZXNzYWdlIGxheW91dF9jaGVjayhzdWJyZXNvdXJjZV9tYXApOworICAgICAgICAgICAgICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIG5vcm1hbGl6ZWRfaXNyID0gTm9ybWFsaXplU3VicmVzb3VyY2VSYW5nZSgqaW1hZ2Vfc3RhdGUsIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UpOworICAgICAgICAgICAgICAgIGF1dG8gc3VicmVzX2NhbGxiYWNrID0gW3RoaXMsIGltZ19iYXJyaWVyLCBjYl9zdGF0ZSwgJmxheW91dF9jaGVjaywgJnN1YnJlc19za2lwXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UgJnN1YnJlcywgVmtJbWFnZUxheW91dCBsYXlvdXQsIFZrSW1hZ2VMYXlvdXQgaW5pdGlhbF9sYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRfY2hlY2suQ2hlY2soc3VicmVzLCBpbWdfYmFycmllci5vbGRMYXlvdXQsIGxheW91dCwgaW5pdGlhbF9sYXlvdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJyZXNfc2tpcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTE5NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9yICVzIHlvdSBjYW5ub3QgdHJhbnNpdGlvbiB0aGUgbGF5b3V0IG9mIGFzcGVjdD0lZCBsZXZlbD0lZCBsYXllcj0lZCBmcm9tICVzIHdoZW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBsYXlvdXQgaXMgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1nX2JhcnJpZXIuaW1hZ2UpLmNfc3RyKCksIHN1YnJlcy5hc3BlY3RNYXNrLCBzdWJyZXMubWlwTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyZXMuYXJyYXlMYXllciwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoaW1nX2JhcnJpZXIub2xkTGF5b3V0KSwgbGF5b3V0X2NoZWNrLm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZUxheW91dChsYXlvdXRfY2hlY2subGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFzdWJyZXNfc2tpcDsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHN1YnJlc291cmNlX21hcC0+Rm9yUmFuZ2Uobm9ybWFsaXplZF9pc3IsIHN1YnJlc19jYWxsYmFjayk7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBzdWJyZXNfc2tpcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpJc1JlbGVhc2VPcChDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgJmJhcnJpZXIpIGNvbnN0IHsKKyAgICBpZiAoIUlzVHJhbnNmZXJPcCgmYmFycmllcikpIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gcG9vbCA9IGNiX3N0YXRlLT5jb21tYW5kX3Bvb2wuZ2V0KCk7CisgICAgcmV0dXJuIHBvb2wgJiYgVGVtcElzUmVsZWFzZU9wPFZrSW1hZ2VNZW1vcnlCYXJyaWVyLCB0cnVlPihwb29sLCAmYmFycmllcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXJyaWVyPgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVFGT1RyYW5zZmVyQmFycmllclVuaXF1ZW5lc3MoY29uc3QgY2hhciAqZnVuY19uYW1lLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhcnJpZXJfY291bnQsIGNvbnN0IEJhcnJpZXIgKmJhcnJpZXJzKSBjb25zdCB7CisgICAgdXNpbmcgQmFycmllclJlY29yZCA9IFFGT1RyYW5zZmVyQmFycmllcjxCYXJyaWVyPjsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvIHBvb2wgPSBjYl9zdGF0ZS0+Y29tbWFuZF9wb29sLmdldCgpOworICAgIGF1dG8gJmJhcnJpZXJfc2V0cyA9IEdldFFGT0JhcnJpZXJTZXRzKGNiX3N0YXRlLCB0eXBlbmFtZSBCYXJyaWVyUmVjb3JkOjpUYWcoKSk7CisgICAgY29uc3QgY2hhciAqYmFycmllcl9uYW1lID0gQmFycmllclJlY29yZDo6QmFycmllck5hbWUoKTsKKyAgICBjb25zdCBjaGFyICpoYW5kbGVfbmFtZSA9IEJhcnJpZXJSZWNvcmQ6OkhhbmRsZU5hbWUoKTsKKyAgICBjb25zdCBjaGFyICp0cmFuc2Zlcl90eXBlID0gbnVsbHB0cjsKKyAgICBmb3IgKHVpbnQzMl90IGIgPSAwOyBiIDwgYmFycmllcl9jb3VudDsgYisrKSB7CisgICAgICAgIGlmICghSXNUcmFuc2Zlck9wKCZiYXJyaWVyc1tiXSkpIGNvbnRpbnVlOworICAgICAgICBjb25zdCBCYXJyaWVyUmVjb3JkICpiYXJyaWVyX3JlY29yZCA9IG51bGxwdHI7CisgICAgICAgIGlmIChUZW1wSXNSZWxlYXNlT3A8QmFycmllciwgdHJ1ZSAvKiBBc3N1bWUgSXNUcmFuc2ZlciAqLz4ocG9vbCwgJmJhcnJpZXJzW2JdKSAmJgorICAgICAgICAgICAgIVF1ZXVlRmFtaWx5SXNTcGVjaWFsKGJhcnJpZXJzW2JdLmRzdFF1ZXVlRmFtaWx5SW5kZXgpKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvIGZvdW5kID0gYmFycmllcl9zZXRzLnJlbGVhc2UuZmluZChiYXJyaWVyc1tiXSk7CisgICAgICAgICAgICBpZiAoZm91bmQgIT0gYmFycmllcl9zZXRzLnJlbGVhc2UuY2VuZCgpKSB7CisgICAgICAgICAgICAgICAgYmFycmllcl9yZWNvcmQgPSAmKCpmb3VuZCk7CisgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSA9ICJyZWxlYXNpbmciOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzQWNxdWlyZU9wPEJhcnJpZXIsIHRydWUgLypBc3N1bWUgSXNUcmFuc2ZlciAqLz4ocG9vbCwgJmJhcnJpZXJzW2JdKSAmJgorICAgICAgICAgICAgICAgICAgICFRdWV1ZUZhbWlseUlzU3BlY2lhbChiYXJyaWVyc1tiXS5zcmNRdWV1ZUZhbWlseUluZGV4KSkgeworICAgICAgICAgICAgY29uc3QgYXV0byBmb3VuZCA9IGJhcnJpZXJfc2V0cy5hY3F1aXJlLmZpbmQoYmFycmllcnNbYl0pOworICAgICAgICAgICAgaWYgKGZvdW5kICE9IGJhcnJpZXJfc2V0cy5hY3F1aXJlLmNlbmQoKSkgeworICAgICAgICAgICAgICAgIGJhcnJpZXJfcmVjb3JkID0gJigqZm91bmQpOworICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgPSAiYWNxdWlyaW5nIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYmFycmllcl9yZWNvcmQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgQmFycmllclJlY29yZDo6RXJyTXNnRHVwbGljYXRlUUZPSW5DQigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMgYXQgaW5kZXggJSIgUFJJdTMyICIgJXMgcXVldWUgb3duZXJzaGlwIG9mICVzICglcyksIGZyb20gc3JjUXVldWVGYW1pbHlJbmRleCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvIGRzdFF1ZXVlRmFtaWx5SW5kZXggJSIgUFJJdTMyICIgZHVwbGljYXRlcyBleGlzdGluZyBiYXJyaWVyIHJlY29yZGVkIGluIHRoaXMgY29tbWFuZCBidWZmZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIGJhcnJpZXJfbmFtZSwgYiwgdHJhbnNmZXJfdHlwZSwgaGFuZGxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShiYXJyaWVyX3JlY29yZC0+aGFuZGxlKS5jX3N0cigpLCBiYXJyaWVyX3JlY29yZC0+c3JjUXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJyaWVyX3JlY29yZC0+ZHN0UXVldWVGYW1pbHlJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK1Z1bGthblR5cGVkSGFuZGxlIEJhcnJpZXJUeXBlZEhhbmRsZShjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciAmYmFycmllcikgeworICAgIHJldHVybiBWdWxrYW5UeXBlZEhhbmRsZShiYXJyaWVyLmltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlKTsKK30KKworY29uc3QgSU1BR0VfU1RBVEUgKkJhcnJpZXJIYW5kbGVTdGF0ZShjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICZkZXZpY2Vfc3RhdGUsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICZiYXJyaWVyKSB7CisgICAgcmV0dXJuIGRldmljZV9zdGF0ZS5HZXRJbWFnZVN0YXRlKGJhcnJpZXIuaW1hZ2UpOworfQorCitWdWxrYW5UeXBlZEhhbmRsZSBCYXJyaWVyVHlwZWRIYW5kbGUoY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyICZiYXJyaWVyKSB7CisgICAgcmV0dXJuIFZ1bGthblR5cGVkSGFuZGxlKGJhcnJpZXIuYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcik7Cit9CisKK2NvbnN0IEJVRkZFUl9TVEFURSAqQmFycmllckhhbmRsZVN0YXRlKGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgJmRldmljZV9zdGF0ZSwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyICZiYXJyaWVyKSB7CisgICAgcmV0dXJuIGRldmljZV9zdGF0ZS5HZXRCdWZmZXJTdGF0ZShiYXJyaWVyLmJ1ZmZlcik7Cit9CisKK1ZrQnVmZmVyIEJhcnJpZXJIYW5kbGUoY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyICZiYXJyaWVyKSB7IHJldHVybiBiYXJyaWVyLmJ1ZmZlcjsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFycmllcj4KK3ZvaWQgQ29yZUNoZWNrczo6UmVjb3JkQmFycmllckFycmF5VmFsaWRhdGlvbkluZm8oY29uc3QgY2hhciAqZnVuY19uYW1lLCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgdWludDMyX3QgYmFycmllcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFycmllciAqYmFycmllcnMpIHsKKyAgICBhdXRvIHBvb2wgPSBjYl9zdGF0ZS0+Y29tbWFuZF9wb29sLmdldCgpOworICAgIGF1dG8gJmJhcnJpZXJfc2V0cyA9IEdldFFGT0JhcnJpZXJTZXRzKGNiX3N0YXRlLCB0eXBlbmFtZSBRRk9UcmFuc2ZlckJhcnJpZXI8QmFycmllcj46OlRhZygpKTsKKyAgICBmb3IgKHVpbnQzMl90IGIgPSAwOyBiIDwgYmFycmllcl9jb3VudDsgYisrKSB7CisgICAgICAgIGF1dG8gJmJhcnJpZXIgPSBiYXJyaWVyc1tiXTsKKyAgICAgICAgaWYgKElzVHJhbnNmZXJPcCgmYmFycmllcikpIHsKKyAgICAgICAgICAgIGlmIChUZW1wSXNSZWxlYXNlT3A8QmFycmllciwgdHJ1ZSAvKiBBc3N1bWUgSXNUcmFuc2ZlciovPihwb29sLCAmYmFycmllcikgJiYKKyAgICAgICAgICAgICAgICAhUXVldWVGYW1pbHlJc1NwZWNpYWwoYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4KSkgeworICAgICAgICAgICAgICAgIGJhcnJpZXJfc2V0cy5yZWxlYXNlLmVtcGxhY2UoYmFycmllcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKElzQWNxdWlyZU9wPEJhcnJpZXIsIHRydWUgLypBc3N1bWUgSXNUcmFuc2ZlciAqLz4ocG9vbCwgJmJhcnJpZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICFRdWV1ZUZhbWlseUlzU3BlY2lhbChiYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXgpKSB7CisgICAgICAgICAgICAgICAgYmFycmllcl9zZXRzLmFjcXVpcmUuZW1wbGFjZShiYXJyaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNyY19xdWV1ZV9mYW1pbHkgPSBiYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGRzdF9xdWV1ZV9mYW1pbHkgPSBiYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXg7CisgICAgICAgIGlmICghUXVldWVGYW1pbHlJc0lnbm9yZWQoc3JjX3F1ZXVlX2ZhbWlseSkgJiYgIVF1ZXVlRmFtaWx5SXNJZ25vcmVkKGRzdF9xdWV1ZV9mYW1pbHkpKSB7CisgICAgICAgICAgICAvLyBPbmx5IGVucXVldWUgc3VibWl0IHRpbWUgY2hlY2sgaWYgaXQgaXMgbmVlZGVkLiBJZiBtb3JlIHN1Ym1pdCB0aW1lIGNoZWNrcyBhcmUgYWRkZWQsIGNoYW5nZSB0aGUgY3JpdGVyaWEKKyAgICAgICAgICAgIC8vIFRPRE8gY3JlYXRlIGEgYmV0dGVyIG5hbWVkIGxpc3QsIG9yIHJlbmFtZSB0aGUgc3VibWl0IHRpbWUgbGlzdHMgdG8gc29tZXRoaW5nIHRoYXQgbWF0Y2hlcyB0aGUgYnJvYWRlciB1c2FnZS4uLgorICAgICAgICAgICAgYXV0byBoYW5kbGVfc3RhdGUgPSBCYXJyaWVySGFuZGxlU3RhdGUoKnRoaXMsIGJhcnJpZXIpOworICAgICAgICAgICAgYm9vbCBtb2RlX2NvbmN1cnJlbnQgPSBoYW5kbGVfc3RhdGUgPyBoYW5kbGVfc3RhdGUtPmNyZWF0ZUluZm8uc2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQgOiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghbW9kZV9jb25jdXJyZW50KSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byB0eXBlZF9oYW5kbGUgPSBCYXJyaWVyVHlwZWRIYW5kbGUoYmFycmllcik7CisgICAgICAgICAgICAgICAgY2Jfc3RhdGUtPnF1ZXVlX3N1Ym1pdF9mdW5jdGlvbnMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICBbZnVuY19uYW1lLCBjYl9zdGF0ZSwgdHlwZWRfaGFuZGxlLCBzcmNfcXVldWVfZmFtaWx5LCBkc3RfcXVldWVfZmFtaWx5XSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldmljZV9kYXRhLCBjb25zdCBRVUVVRV9TVEFURSAqcXVldWVfc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0ZUNvbmN1cnJlbnRCYXJyaWVyQXRTdWJtaXQoZGV2aWNlX2RhdGEsIHF1ZXVlX3N0YXRlLCBmdW5jX25hbWUsIGNiX3N0YXRlLCB0eXBlZF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19xdWV1ZV9mYW1pbHksIGRzdF9xdWV1ZV9mYW1pbHkpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUJhcnJpZXJzUUZPVHJhbnNmZXJVbmlxdWVuZXNzKGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyQmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKnBCdWZmZXJNZW1CYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU1lbUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciAqcEltYWdlTWVtQmFycmllcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlUUZPVHJhbnNmZXJCYXJyaWVyVW5pcXVlbmVzcyhmdW5jX25hbWUsIGNiX3N0YXRlLCBidWZmZXJCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1CYXJyaWVycyk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZVFGT1RyYW5zZmVyQmFycmllclVuaXF1ZW5lc3MoZnVuY19uYW1lLCBjYl9zdGF0ZSwgaW1hZ2VNZW1CYXJyaWVyQ291bnQsIHBJbWFnZU1lbUJhcnJpZXJzKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpSZWNvcmRCYXJyaWVyVmFsaWRhdGlvbkluZm8oY29uc3QgY2hhciAqZnVuY19uYW1lLCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgdWludDMyX3QgYnVmZmVyQmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyICpwQnVmZmVyTWVtQmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtQmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbUJhcnJpZXJzKSB7CisgICAgUmVjb3JkQmFycmllckFycmF5VmFsaWRhdGlvbkluZm8oZnVuY19uYW1lLCBjYl9zdGF0ZSwgYnVmZmVyQmFycmllckNvdW50LCBwQnVmZmVyTWVtQmFycmllcnMpOworICAgIFJlY29yZEJhcnJpZXJBcnJheVZhbGlkYXRpb25JbmZvKGZ1bmNfbmFtZSwgY2Jfc3RhdGUsIGltYWdlTWVtQmFycmllckNvdW50LCBwSW1hZ2VNZW1CYXJyaWVycyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXJyaWVyUmVjb3JkLCB0eXBlbmFtZSBTY29yZWJvYXJkPgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUFuZFVwZGF0ZVFGT1Njb3JlYm9hcmQoY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wZXJhdGlvbiwgY29uc3QgQmFycmllclJlY29yZCAmYmFycmllciwgU2NvcmVib2FyZCAqc2NvcmVib2FyZCkgY29uc3QgeworICAgIC8vIFJlY29yZCB0byB0aGUgc2NvcmVib2FyZCBvciByZXBvcnQgdGhhdCB3ZSBoYXZlIGEgZHVwbGljYXRpb24KKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvIGluc2VydGVkID0gc2NvcmVib2FyZC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGJhcnJpZXIsIGNiX3N0YXRlKSk7CisgICAgaWYgKCFpbnNlcnRlZC5zZWNvbmQgJiYgaW5zZXJ0ZWQuZmlyc3QtPnNlY29uZCAhPSBjYl9zdGF0ZSkgeworICAgICAgICAvLyBUaGlzIGlzIGEgZHVwbGljYXRpb24gKGJ1dCBkb24ndCByZXBvcnQgZHVwbGljYXRlcyBmcm9tIHRoZSBzYW1lIENCLCBhcyB3ZSBkbyB0aGF0IGF0IHJlY29yZCB0aW1lCisgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksIEJhcnJpZXJSZWNvcmQ6OkVyck1zZ0R1cGxpY2F0ZVFGT0luU3VibWl0KCksCisgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMgJXMgcXVldWUgb3duZXJzaGlwIG9mICVzICglcyksIGZyb20gc3JjUXVldWVGYW1pbHlJbmRleCAlIiBQUkl1MzIgIiB0byBkc3RRdWV1ZUZhbWlseUluZGV4ICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAiIGR1cGxpY2F0ZXMgZXhpc3RpbmcgYmFycmllciBzdWJtaXR0ZWQgaW4gdGhpcyBiYXRjaCBmcm9tICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a1F1ZXVlU3VibWl0KCkiLCBCYXJyaWVyUmVjb3JkOjpCYXJyaWVyTmFtZSgpLCBvcGVyYXRpb24sIEJhcnJpZXJSZWNvcmQ6OkhhbmRsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShiYXJyaWVyLmhhbmRsZSkuY19zdHIoKSwgYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4LCBiYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW5zZXJ0ZWQuZmlyc3QtPnNlY29uZC0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFycmllcj4KK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVRdWV1ZWRRRk9UcmFuc2ZlckJhcnJpZXJzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZPVHJhbnNmZXJDQlNjb3JlYm9hcmRzPEJhcnJpZXI+ICpzY29yZWJvYXJkcykgY29uc3QgeworICAgIHVzaW5nIEJhcnJpZXJSZWNvcmQgPSBRRk9UcmFuc2ZlckJhcnJpZXI8QmFycmllcj47CisgICAgdXNpbmcgVHlwZVRhZyA9IHR5cGVuYW1lIEJhcnJpZXJSZWNvcmQ6OlRhZzsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBhdXRvICZjYl9iYXJyaWVycyA9IEdldFFGT0JhcnJpZXJTZXRzKGNiX3N0YXRlLCBUeXBlVGFnKCkpOworICAgIGNvbnN0IEdsb2JhbFFGT1RyYW5zZmVyQmFycmllck1hcDxCYXJyaWVyPiAmZ2xvYmFsX3JlbGVhc2VfYmFycmllcnMgPSBHZXRHbG9iYWxRRk9SZWxlYXNlQmFycmllck1hcChUeXBlVGFnKCkpOworICAgIGNvbnN0IGNoYXIgKmJhcnJpZXJfbmFtZSA9IEJhcnJpZXJSZWNvcmQ6OkJhcnJpZXJOYW1lKCk7CisgICAgY29uc3QgY2hhciAqaGFuZGxlX25hbWUgPSBCYXJyaWVyUmVjb3JkOjpIYW5kbGVOYW1lKCk7CisgICAgLy8gTm8gcmVsZWFzZSBzaG91bGQgaGF2ZSBhbiBleHRhbnQgZHVwbGljYXRlIChXQVJOSU5HKQorICAgIGZvciAoY29uc3QgYXV0byAmcmVsZWFzZSA6IGNiX2JhcnJpZXJzLnJlbGVhc2UpIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGdsb2JhbCBwZW5kaW5nIHJlbGVhc2UgYmFycmllcnMKKyAgICAgICAgY29uc3QgYXV0byBzZXRfaXQgPSBnbG9iYWxfcmVsZWFzZV9iYXJyaWVycy5maW5kKHJlbGVhc2UuaGFuZGxlKTsKKyAgICAgICAgaWYgKHNldF9pdCAhPSBnbG9iYWxfcmVsZWFzZV9iYXJyaWVycy5jZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IFFGT1RyYW5zZmVyQmFycmllclNldDxCYXJyaWVyPiAmc2V0X2Zvcl9oYW5kbGUgPSBzZXRfaXQtPnNlY29uZDsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gZm91bmQgPSBzZXRfZm9yX2hhbmRsZS5maW5kKHJlbGVhc2UpOworICAgICAgICAgICAgaWYgKGZvdW5kICE9IHNldF9mb3JfaGFuZGxlLmNlbmQoKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCBCYXJyaWVyUmVjb3JkOjpFcnJNc2dEdXBsaWNhdGVRRk9TdWJtaXR0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyByZWxlYXNpbmcgcXVldWUgb3duZXJzaGlwIG9mICVzICglcyksIGZyb20gc3JjUXVldWVGYW1pbHlJbmRleCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0byBkc3RRdWV1ZUZhbWlseUluZGV4ICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGR1cGxpY2F0ZXMgZXhpc3RpbmcgYmFycmllciBxdWV1ZWQgZm9yIGV4ZWN1dGlvbiwgd2l0aG91dCBpbnRlcnZlbmluZyBhY3F1aXJlIG9wZXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZVN1Ym1pdCgpIiwgYmFycmllcl9uYW1lLCBoYW5kbGVfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShmb3VuZC0+aGFuZGxlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC0+c3JjUXVldWVGYW1pbHlJbmRleCwgZm91bmQtPmRzdFF1ZXVlRmFtaWx5SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVBbmRVcGRhdGVRRk9TY29yZWJvYXJkKHJlcG9ydF9kYXRhLCBjYl9zdGF0ZSwgInJlbGVhc2luZyIsIHJlbGVhc2UsICZzY29yZWJvYXJkcy0+cmVsZWFzZSk7CisgICAgfQorICAgIC8vIEVhY2ggYWNxdWlyZSBtdXN0IGhhdmUgYSBtYXRjaGluZyByZWxlYXNlIChFUlJPUikKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFjcXVpcmUgOiBjYl9iYXJyaWVycy5hY3F1aXJlKSB7CisgICAgICAgIGNvbnN0IGF1dG8gc2V0X2l0ID0gZ2xvYmFsX3JlbGVhc2VfYmFycmllcnMuZmluZChhY3F1aXJlLmhhbmRsZSk7CisgICAgICAgIGJvb2wgbWF0Y2hpbmdfcmVsZWFzZV9mb3VuZCA9IGZhbHNlOworICAgICAgICBpZiAoc2V0X2l0ICE9IGdsb2JhbF9yZWxlYXNlX2JhcnJpZXJzLmNlbmQoKSkgeworICAgICAgICAgICAgY29uc3QgUUZPVHJhbnNmZXJCYXJyaWVyU2V0PEJhcnJpZXI+ICZzZXRfZm9yX2hhbmRsZSA9IHNldF9pdC0+c2Vjb25kOworICAgICAgICAgICAgbWF0Y2hpbmdfcmVsZWFzZV9mb3VuZCA9IHNldF9mb3JfaGFuZGxlLmZpbmQoYWNxdWlyZSkgIT0gc2V0X2Zvcl9oYW5kbGUuY2VuZCgpOworICAgICAgICB9CisgICAgICAgIGlmICghbWF0Y2hpbmdfcmVsZWFzZV9mb3VuZCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksIEJhcnJpZXJSZWNvcmQ6OkVyck1zZ01pc3NpbmdRRk9SZWxlYXNlSW5TdWJtaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGluIHN1Ym1pdHRlZCBjb21tYW5kIGJ1ZmZlciAlcyBhY3F1aXJpbmcgb3duZXJzaGlwIG9mICVzICglcyksIGZyb20gc3JjUXVldWVGYW1pbHlJbmRleCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvIGRzdFF1ZXVlRmFtaWx5SW5kZXggJSIgUFJJdTMyICIgaGFzIG5vIG1hdGNoaW5nIHJlbGVhc2UgYmFycmllciBxdWV1ZWQgZm9yIGV4ZWN1dGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a1F1ZXVlU3VibWl0KCkiLCBiYXJyaWVyX25hbWUsIGhhbmRsZV9uYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGFjcXVpcmUuaGFuZGxlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmUuc3JjUXVldWVGYW1pbHlJbmRleCwgYWNxdWlyZS5kc3RRdWV1ZUZhbWlseUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBza2lwIHw9IFZhbGlkYXRlQW5kVXBkYXRlUUZPU2NvcmVib2FyZChyZXBvcnRfZGF0YSwgY2Jfc3RhdGUsICJhY3F1aXJpbmciLCBhY3F1aXJlLCAmc2NvcmVib2FyZHMtPmFjcXVpcmUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVF1ZXVlZFFGT1RyYW5zZmVycyhjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZPVHJhbnNmZXJDQlNjb3JlYm9hcmRzPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPiAqcWZvX2ltYWdlX3Njb3JlYm9hcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZHM8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPiAqcWZvX2J1ZmZlcl9zY29yZWJvYXJkcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVRdWV1ZWRRRk9UcmFuc2ZlckJhcnJpZXJzPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPihjYl9zdGF0ZSwgcWZvX2ltYWdlX3Njb3JlYm9hcmRzKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlUXVldWVkUUZPVHJhbnNmZXJCYXJyaWVyczxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+KGNiX3N0YXRlLCBxZm9fYnVmZmVyX3Njb3JlYm9hcmRzKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXI+Cit2b2lkIENvcmVDaGVja3M6OlJlY29yZFF1ZXVlZFFGT1RyYW5zZmVyQmFycmllcnMoQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUpIHsKKyAgICB1c2luZyBCYXJyaWVyUmVjb3JkID0gUUZPVHJhbnNmZXJCYXJyaWVyPEJhcnJpZXI+OworICAgIHVzaW5nIFR5cGVUYWcgPSB0eXBlbmFtZSBCYXJyaWVyUmVjb3JkOjpUYWc7CisgICAgY29uc3QgYXV0byAmY2JfYmFycmllcnMgPSBHZXRRRk9CYXJyaWVyU2V0cyhjYl9zdGF0ZSwgVHlwZVRhZygpKTsKKyAgICBHbG9iYWxRRk9UcmFuc2ZlckJhcnJpZXJNYXA8QmFycmllcj4gJmdsb2JhbF9yZWxlYXNlX2JhcnJpZXJzID0gR2V0R2xvYmFsUUZPUmVsZWFzZUJhcnJpZXJNYXAoVHlwZVRhZygpKTsKKworICAgIC8vIEFkZCByZWxlYXNlIGJhcnJpZXJzIGZyb20gdGhpcyBzdWJtaXQgdG8gdGhlIGdsb2JhbCBtYXAKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnJlbGVhc2UgOiBjYl9iYXJyaWVycy5yZWxlYXNlKSB7CisgICAgICAgIC8vIHRoZSBnbG9iYWwgYmFycmllciBsaXN0IGlzIG1hcHBlZCBieSByZXNvdXJjZSBoYW5kbGUgdG8gYWxsb3cgY2xlYW51cCBvbiByZXNvdXJjZSBkZXN0cnVjdGlvbgorICAgICAgICAvLyBOT1RFOiBXZSdyZSB1c2luZyBbXSBiZWNhdXNlIGNyZWF0aW9uIG9mIGEgU2V0IGlzIGEgbmVlZGVkIHNpZGUgZWZmZWN0IGZvciBuZXcgaGFuZGxlcworICAgICAgICBnbG9iYWxfcmVsZWFzZV9iYXJyaWVyc1tyZWxlYXNlLmhhbmRsZV0uaW5zZXJ0KHJlbGVhc2UpOworICAgIH0KKworICAgIC8vIEVyYXNlIGFjcXVpcmVkIGJhcnJpZXJzIGZyb20gdGhpcyBzdWJtaXQgZnJvbSB0aGUgZ2xvYmFsIG1hcCAtLSBlc3NlbnRpYWxseSBtYXJraW5nIHJlbGVhc2VzIGFzIGNvbnN1bWVkCisgICAgZm9yIChjb25zdCBhdXRvICZhY3F1aXJlIDogY2JfYmFycmllcnMuYWNxdWlyZSkgeworICAgICAgICAvLyBOT1RFOiBXZSdyZSBub3QgdXNpbmcgW10gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSBlbnRyaWVzIGZvciBtaXNzaW5nIHJlbGVhc2VzCisgICAgICAgIGF1dG8gc2V0X2l0ID0gZ2xvYmFsX3JlbGVhc2VfYmFycmllcnMuZmluZChhY3F1aXJlLmhhbmRsZSk7CisgICAgICAgIGlmIChzZXRfaXQgIT0gZ2xvYmFsX3JlbGVhc2VfYmFycmllcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIFFGT1RyYW5zZmVyQmFycmllclNldDxCYXJyaWVyPiAmc2V0X2Zvcl9oYW5kbGUgPSBzZXRfaXQtPnNlY29uZDsKKyAgICAgICAgICAgIHNldF9mb3JfaGFuZGxlLmVyYXNlKGFjcXVpcmUpOworICAgICAgICAgICAgaWYgKHNldF9mb3JfaGFuZGxlLnNpemUoKSA9PSAwKSB7ICAvLyBDbGVhbiB1cCBlbXB0eSBzZXRzCisgICAgICAgICAgICAgICAgZ2xvYmFsX3JlbGVhc2VfYmFycmllcnMuZXJhc2Uoc2V0X2l0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb3JlQ2hlY2tzOjpSZWNvcmRRdWV1ZWRRRk9UcmFuc2ZlcnMoQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUpIHsKKyAgICBSZWNvcmRRdWV1ZWRRRk9UcmFuc2ZlckJhcnJpZXJzPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPihjYl9zdGF0ZSk7CisgICAgUmVjb3JkUXVldWVkUUZPVHJhbnNmZXJCYXJyaWVyczxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+KGNiX3N0YXRlKTsKK30KKworLy8gQXZvaWQgbWFraW5nIHRoZSB0ZW1wbGF0ZSBnbG9iYWxseSB2aXNpYmxlIGJ5IGV4cG9ydGluZyB0aGUgb25lIGluc3RhbmNlIG9mIGl0IHdlIG5lZWQuCit2b2lkIENvcmVDaGVja3M6OkVyYXNlUUZPSW1hZ2VSZWxhc2VCYXJyaWVycyhjb25zdCBWa0ltYWdlICZpbWFnZSkgeyBFcmFzZVFGT1JlbGVhc2VCYXJyaWVyczxWa0ltYWdlTWVtb3J5QmFycmllcj4oaW1hZ2UpOyB9CisKK3ZvaWQgQ29yZUNoZWNrczo6VHJhbnNpdGlvbkltYWdlTGF5b3V0cyhDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgdWludDMyX3QgbWVtQmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICpwSW1nTWVtQmFycmllcnMpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWVtQmFycmllckNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXV0byAmbWVtX2JhcnJpZXIgPSBwSW1nTWVtQmFycmllcnNbaV07CisKKyAgICAgICAgLy8gRm9yIG93bmVyc2hpcCB0cmFuc2ZlcnMsIHRoZSBiYXJyaWVyIGlzIHNwZWNpZmllZCB0d2ljZTsgYXMgYSByZWxlYXNlCisgICAgICAgIC8vIG9wZXJhdGlvbiBvbiB0aGUgeWllbGRpbmcgcXVldWUgZmFtaWx5LCBhbmQgYXMgYW4gYWNxdWlyZSBvcGVyYXRpb24KKyAgICAgICAgLy8gb24gdGhlIGFjcXVpcmluZyBxdWV1ZSBmYW1pbHkuIFRoaXMgYmFycmllciBtYXkgYWxzbyBpbmNsdWRlIGEgbGF5b3V0CisgICAgICAgIC8vIHRyYW5zaXRpb24sIHdoaWNoIG9jY3VycyAnYmV0d2VlbicgdGhlIHR3byBvcGVyYXRpb25zLiBGb3IgdmFsaWRhdGlvbgorICAgICAgICAvLyBwdXJwb3NlcyBpdCBkb2Vzbid0IHNlZW0gaW1wb3J0YW50IHdoaWNoIHNpZGUgcGVyZm9ybXMgdGhlIGxheW91dAorICAgICAgICAvLyB0cmFuc2l0aW9uLCBidXQgaXQgbXVzdCBub3QgYmUgcGVyZm9ybWVkIHR3aWNlLiBXZSdsbCBhcmJpdHJhcmlseQorICAgICAgICAvLyBjaG9vc2UgdG8gcGVyZm9ybSBpdCBhcyBwYXJ0IG9mIHRoZSBhY3F1aXJlIG9wZXJhdGlvbi4KKyAgICAgICAgaWYgKElzUmVsZWFzZU9wKGNiX3N0YXRlLCBtZW1fYmFycmllcikpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYXV0byAqaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKG1lbV9iYXJyaWVyLmltYWdlKTsKKyAgICAgICAgaWYgKCFpbWFnZV9zdGF0ZSkgY29udGludWU7CisgICAgICAgIFJlY29yZFRyYW5zaXRpb25JbWFnZUxheW91dChjYl9zdGF0ZSwgaW1hZ2Vfc3RhdGUsIG1lbV9iYXJyaWVyKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbWFnZSA6IGltYWdlX3N0YXRlLT5hbGlhc2luZ19pbWFnZXMpIHsKKyAgICAgICAgICAgIGltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgICAgICAgICBSZWNvcmRUcmFuc2l0aW9uSW1hZ2VMYXlvdXQoY2Jfc3RhdGUsIGltYWdlX3N0YXRlLCBtZW1fYmFycmllcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UmVjb3JkVHJhbnNpdGlvbkltYWdlTGF5b3V0KENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLCBjb25zdCBJTUFHRV9TVEFURSAqaW1hZ2Vfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciAmbWVtX2JhcnJpZXIpIHsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBub3JtYWxpemVkX2lzciA9IE5vcm1hbGl6ZVN1YnJlc291cmNlUmFuZ2UoKmltYWdlX3N0YXRlLCBtZW1fYmFycmllci5zdWJyZXNvdXJjZVJhbmdlKTsKKyAgICBjb25zdCBhdXRvICZpbWFnZV9jcmVhdGVfaW5mbyA9IGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvOworCisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciAzRCBpbWFnZXMgd2l0aCBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSIGZsYWcgYml0LCB3aGVyZSA8ZXh0ZW50LmRlcHRoPiBhbmQKKyAgICAvLyA8YXJyYXlMYXllcnM+IGNhbiBwb3RlbnRpYWxseSBhbGlhcy4gV2hlbiByZWNvcmRpbmcgbGF5b3V0IGZvciB0aGUgZW50aXJlIGltYWdlLCBwcmUtZW1wdGl2ZWx5IHJlY29yZCBsYXlvdXRzCisgICAgLy8gZm9yIGFsbCAocG90ZW50aWFsKSBsYXllciBzdWJfcmVzb3VyY2VzLgorICAgIGlmICgwICE9IChpbWFnZV9jcmVhdGVfaW5mby5mbGFncyAmIFZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVF9LSFIpKSB7CisgICAgICAgIG5vcm1hbGl6ZWRfaXNyLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICAgICAgbm9ybWFsaXplZF9pc3IubGF5ZXJDb3VudCA9IGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aDsgIC8vIFRyZWF0IGVhY2ggZGVwdGggc2xpY2UgYXMgYSBsYXllciBzdWJyZXNvdXJjZQorICAgIH0KKworICAgIFNldEltYWdlTGF5b3V0KGNiX3N0YXRlLCAqaW1hZ2Vfc3RhdGUsIG5vcm1hbGl6ZWRfaXNyLCBtZW1fYmFycmllci5uZXdMYXlvdXQsIG1lbV9iYXJyaWVyLm9sZExheW91dCk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmVyaWZ5SW1hZ2VMYXlvdXQoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgY29uc3QgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmcmFuZ2UsIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBleHBsaWNpdF9sYXlvdXQsIFZrSW1hZ2VMYXlvdXQgb3B0aW1hbF9sYXlvdXQsIGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGF5b3V0X2ludmFsaWRfbXNnX2NvZGUsIGNvbnN0IGNoYXIgKmxheW91dF9taXNtYXRjaF9tc2dfY29kZSwgYm9vbCAqZXJyb3IpIGNvbnN0IHsKKyAgICBpZiAoZGlzYWJsZWQuaW1hZ2VfbGF5b3V0X3ZhbGlkYXRpb24pIHJldHVybiBmYWxzZTsKKyAgICBhc3NlcnQoY2Jfbm9kZSk7CisgICAgYXNzZXJ0KGltYWdlX3N0YXRlKTsKKyAgICBjb25zdCBhdXRvIGltYWdlID0gaW1hZ2Vfc3RhdGUtPmltYWdlOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgY29uc3QgYXV0byAqc3VicmVzb3VyY2VfbWFwID0gR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcChjYl9ub2RlLCBpbWFnZSk7CisgICAgaWYgKHN1YnJlc291cmNlX21hcCkgeworICAgICAgICBib29sIHN1YnJlc19za2lwID0gZmFsc2U7CisgICAgICAgIExheW91dFVzZUNoZWNrQW5kTWVzc2FnZSBsYXlvdXRfY2hlY2soc3VicmVzb3VyY2VfbWFwLCBhc3BlY3RfbWFzayk7CisgICAgICAgIGF1dG8gc3VicmVzb3VyY2VfY2IgPSBbdGhpcywgZXhwbGljaXRfbGF5b3V0LCBjYl9ub2RlLCBsYXlvdXRfbWlzbWF0Y2hfbXNnX2NvZGUsIGNhbGxlciwgaW1hZ2UsICZsYXlvdXRfY2hlY2ssICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VicmVzX3NraXBdKGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSAmc3VicmVzLCBWa0ltYWdlTGF5b3V0IGxheW91dCwgVmtJbWFnZUxheW91dCBpbml0aWFsX2xheW91dCkgeworICAgICAgICAgICAgaWYgKCFsYXlvdXRfY2hlY2suQ2hlY2soc3VicmVzLCBleHBsaWNpdF9sYXlvdXQsIGxheW91dCwgaW5pdGlhbF9sYXlvdXQpKSB7CisgICAgICAgICAgICAgICAgKmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdWJyZXNfc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgbGF5b3V0X21pc21hdGNoX21zZ19jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQ2Fubm90IHVzZSAlcyAobGF5ZXI9JXUgbWlwPSV1KSB3aXRoIHNwZWNpZmljIGxheW91dCAlcyB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgbGF5b3V0ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlKS5jX3N0cigpLCBzdWJyZXMuYXJyYXlMYXllciwgc3VicmVzLm1pcExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGV4cGxpY2l0X2xheW91dCksIGxheW91dF9jaGVjay5tZXNzYWdlLCBzdHJpbmdfVmtJbWFnZUxheW91dChsYXlvdXRfY2hlY2subGF5b3V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIXN1YnJlc19za2lwOworICAgICAgICB9OworICAgICAgICBzdWJyZXNvdXJjZV9tYXAtPkZvclJhbmdlKHJhbmdlLCBzdWJyZXNvdXJjZV9jYik7CisgICAgICAgIHNraXAgfD0gc3VicmVzX3NraXA7CisgICAgfQorCisgICAgLy8gSWYgb3B0aW1hbF9sYXlvdXQgaXMgbm90IFVOREVGSU5FRCwgY2hlY2sgdGhhdCBsYXlvdXQgbWF0Y2hlcyBvcHRpbWFsIGZvciB0aGlzIGNhc2UKKyAgICBpZiAoKFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgIT0gb3B0aW1hbF9sYXlvdXQpICYmIChleHBsaWNpdF9sYXlvdXQgIT0gb3B0aW1hbF9sYXlvdXQpKSB7CisgICAgICAgIGlmIChWS19JTUFHRV9MQVlPVVRfR0VORVJBTCA9PSBleHBsaWNpdF9sYXlvdXQpIHsKKyAgICAgICAgICAgIGlmIChpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby50aWxpbmcgIT0gVktfSU1BR0VfVElMSU5HX0xJTkVBUikgeworICAgICAgICAgICAgICAgIC8vIExBWU9VVF9HRU5FUkFMIGlzIGFsbG93ZWQsIGJ1dCBtYXkgbm90IGJlIHBlcmZvcm1hbmNlIG9wdGltYWwsIGZsYWcgYXMgcGVyZiB3YXJuaW5nLgorICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBGb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSAlcyBsYXlvdXQgc2hvdWxkIGJlICVzIGluc3RlYWQgb2YgR0VORVJBTC4iLCBjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2UpLmNfc3RyKCksIHN0cmluZ19Wa0ltYWdlTGF5b3V0KG9wdGltYWxfbGF5b3V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSkgeworICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlLT5zaGFyZWRfcHJlc2VudGFibGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUiAhPSBleHBsaWNpdF9sYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X2ludmFsaWRfbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBzaGFyZWQgcHJlc2VudGFibGUgaW1hZ2UgaXMgJXMgYnV0IG11c3QgYmUgVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQob3B0aW1hbF9sYXlvdXQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgbGF5b3V0X2ludmFsaWRfbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBMYXlvdXQgZm9yICVzIGlzICVzIGJ1dCBjYW4gb25seSBiZSAlcyBvciBWS19JTUFHRV9MQVlPVVRfR0VORVJBTC4iLCBjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZSkuY19zdHIoKSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoZXhwbGljaXRfbGF5b3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZUxheW91dChvcHRpbWFsX2xheW91dCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorYm9vbCBDb3JlQ2hlY2tzOjpWZXJpZnlJbWFnZUxheW91dChjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlLCBjb25zdCBJTUFHRV9TVEFURSAqaW1hZ2Vfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyAmc3ViTGF5ZXJzLCBWa0ltYWdlTGF5b3V0IGV4cGxpY2l0X2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBvcHRpbWFsX2xheW91dCwgY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICpsYXlvdXRfaW52YWxpZF9tc2dfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGF5b3V0X21pc21hdGNoX21zZ19jb2RlLCBib29sICplcnJvcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlJbWFnZUxheW91dChjYl9ub2RlLCBpbWFnZV9zdGF0ZSwgUmFuZ2VGcm9tTGF5ZXJzKHN1YkxheWVycyksIGV4cGxpY2l0X2xheW91dCwgb3B0aW1hbF9sYXlvdXQsIGNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X2ludmFsaWRfbXNnX2NvZGUsIGxheW91dF9taXNtYXRjaF9tc2dfY29kZSwgZXJyb3IpOworfQorCit2b2lkIENvcmVDaGVja3M6OlRyYW5zaXRpb25GaW5hbFN1YnBhc3NMYXlvdXRzKENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRUJVRkZFUl9TVEFURSAqZnJhbWVidWZmZXJfc3RhdGUpIHsKKyAgICBhdXRvIHJlbmRlclBhc3MgPSBHZXRSZW5kZXJQYXNzU3RhdGUocFJlbmRlclBhc3NCZWdpbi0+cmVuZGVyUGFzcyk7CisgICAgaWYgKCFyZW5kZXJQYXNzKSByZXR1cm47CisKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiAqcFJlbmRlclBhc3NJbmZvID0gcmVuZGVyUGFzcy0+Y3JlYXRlSW5mby5wdHIoKTsKKyAgICBpZiAoZnJhbWVidWZmZXJfc3RhdGUpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBSZW5kZXJQYXNzSW5mby0+YXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8gdmlld19zdGF0ZSA9IEdldEF0dGFjaG1lbnRJbWFnZVZpZXdTdGF0ZShmcmFtZWJ1ZmZlcl9zdGF0ZSwgaSk7CisgICAgICAgICAgICBpZiAodmlld19zdGF0ZSkgeworICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgc3RlbmNpbF9sYXlvdXQgPSBrSW52YWxpZExheW91dDsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICphdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0ID0KKyAgICAgICAgICAgICAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSPihwUmVuZGVyUGFzc0luZm8tPnBBdHRhY2htZW50c1tpXS5wTmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RlbmNpbF9sYXlvdXQgPSBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsRmluYWxMYXlvdXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU2V0SW1hZ2VWaWV3TGF5b3V0KHBDQiwgKnZpZXdfc3RhdGUsIHBSZW5kZXJQYXNzSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZpbmFsTGF5b3V0LCBzdGVuY2lsX2xheW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKy8vIEFuZHJvaWQtc3BlY2lmaWMgdmFsaWRhdGlvbiB0aGF0IHVzZXMgdHlwZXMgZGVmaW5lZCBvbmx5IHdpdGggVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBUaGlzIGNvdWxkIGFsc28gbW92ZSBpbnRvIGEgc2VwZXJhdGUgY29yZV92YWxpZGF0aW9uX2FuZHJvaWQuY3BwIGZpbGUuLi4gPworCisvLworLy8gQUhCLXNwZWNpZmljIHZhbGlkYXRpb24gd2l0aGluIG5vbi1BSEIgQVBJcworLy8KK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDcmVhdGVJbWFnZUFORFJPSUQoY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqY3JlYXRlX2luZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEICpleHRfZm10X2FuZHJvaWQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0V4dGVybmFsRm9ybWF0QU5EUk9JRD4oY3JlYXRlX2luZm8tPnBOZXh0KTsKKyAgICBpZiAoZXh0X2ZtdF9hbmRyb2lkKSB7CisgICAgICAgIGlmICgwICE9IGV4dF9mbXRfYW5kcm9pZC0+ZXh0ZXJuYWxGb3JtYXQpIHsKKyAgICAgICAgICAgIGlmIChWS19GT1JNQVRfVU5ERUZJTkVEICE9IGNyZWF0ZV9pbmZvLT5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDE5NzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IFZrSW1hZ2VDcmVhdGVJbmZvIHN0cnVjdCBoYXMgYSBjaGFpbmVkIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHN0cnVjdCB3aXRoIG5vbi16ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZXJuYWxGb3JtYXQsIGJ1dCB0aGUgVmtJbWFnZUNyZWF0ZUluZm8ncyBmb3JtYXQgaXMgbm90IFZLX0ZPUk1BVF9VTkRFRklORUQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgwICE9IChWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUICYgY3JlYXRlX2luZm8tPmZsYWdzKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIzOTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBWa0ltYWdlQ3JlYXRlSW5mbyBzdHJ1Y3QgaGFzIGEgY2hhaW5lZCBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBzdHJ1Y3Qgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24temVybyBleHRlcm5hbEZvcm1hdCwgYnV0IGZsYWdzIGluY2x1ZGUgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKDAgIT0gKH5WS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCAmIGNyZWF0ZV9pbmZvLT51c2FnZSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogVmtJbWFnZUNyZWF0ZUluZm8gc3RydWN0IGhhcyBhIGNoYWluZWQgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgc3RydWN0IHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLXplcm8gZXh0ZXJuYWxGb3JtYXQsIGJ1dCB1c2FnZSBpbmNsdWRlcyBiaXRzIG90aGVyIHRoYW4gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChWS19JTUFHRV9USUxJTkdfT1BUSU1BTCAhPSBjcmVhdGVfaW5mby0+dGlsaW5nKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMjM5OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IFZrSW1hZ2VDcmVhdGVJbmZvIHN0cnVjdCBoYXMgYSBjaGFpbmVkIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHN0cnVjdCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi16ZXJvIGV4dGVybmFsRm9ybWF0LCBidXQgbGF5b3V0IGlzIG5vdCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgoMCAhPSBleHRfZm10X2FuZHJvaWQtPmV4dGVybmFsRm9ybWF0KSAmJiAoMCA9PSBhaGJfZXh0X2Zvcm1hdHNfc2V0LmNvdW50KGV4dF9mbXRfYW5kcm9pZC0+ZXh0ZXJuYWxGb3JtYXQpKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRXh0ZXJuYWxGb3JtYXRBTkRST0lELWV4dGVybmFsRm9ybWF0LTAxODk0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBDaGFpbmVkIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHN0cnVjdCBjb250YWlucyBhIG5vbi16ZXJvIGV4dGVybmFsRm9ybWF0IHdoaWNoIGhhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBiZWVuIHByZXZpb3VzbHkgcmV0cmlldmVkIGJ5IHZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoKS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgobnVsbHB0ciA9PSBleHRfZm10X2FuZHJvaWQpIHx8ICgwID09IGV4dF9mbXRfYW5kcm9pZC0+ZXh0ZXJuYWxGb3JtYXQpKSB7CisgICAgICAgIGlmIChWS19GT1JNQVRfVU5ERUZJTkVEID09IGNyZWF0ZV9pbmZvLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMTk3NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogVmtJbWFnZUNyZWF0ZUluZm8gc3RydWN0J3MgZm9ybWF0IGlzIFZLX0ZPUk1BVF9VTkRFRklORUQsIGJ1dCBlaXRoZXIgZG9lcyBub3QgaGF2ZSBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhaW5lZCBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBzdHJ1Y3Qgb3IgdGhlIHN0cnVjdCBleGlzdHMgYnV0IGhhcyBhbiBleHRlcm5hbEZvcm1hdCBvZiAwLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyAqZW1pY2kgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvPihjcmVhdGVfaW5mby0+cE5leHQpOworICAgIGlmIChlbWljaSAmJiAoZW1pY2ktPmhhbmRsZVR5cGVzICYgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEKSkgeworICAgICAgICBpZiAoY3JlYXRlX2luZm8tPmltYWdlVHlwZSAhPSBWS19JTUFHRV9UWVBFXzJEKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzkzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IFZrSW1hZ2VDcmVhdGVJbmZvIHN0cnVjdCB3aXRoIGltYWdlVHlwZSAlcyBoYXMgY2hhaW5lZCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3Qgd2l0aCBoYW5kbGVUeXBlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VUeXBlKGNyZWF0ZV9pbmZvLT5pbWFnZVR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY3JlYXRlX2luZm8tPm1pcExldmVscyAhPSAxKSAmJiAoY3JlYXRlX2luZm8tPm1pcExldmVscyAhPSBGdWxsTWlwQ2hhaW5MZXZlbHMoY3JlYXRlX2luZm8tPmV4dGVudCkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIzOTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IFZrSW1hZ2VDcmVhdGVJbmZvIHN0cnVjdCB3aXRoIGNoYWluZWQgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBzdHJ1Y3Qgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGVUeXBlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllcyBtaXBMZXZlbHMgPSAlIiBQUklkMzIgIiAoZnVsbCBjaGFpbiBtaXBMZXZlbHMgYXJlICUiIFBSSWQzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9pbmZvLT5taXBMZXZlbHMsIEZ1bGxNaXBDaGFpbkxldmVscyhjcmVhdGVfaW5mby0+ZXh0ZW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNyZWF0ZUltYWdlVmlld0FORFJPSUQoY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvICpjcmVhdGVfaW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoY3JlYXRlX2luZm8tPmltYWdlKTsKKworICAgIGlmIChpbWFnZV9zdGF0ZS0+aGFzX2FoYl9mb3JtYXQpIHsKKyAgICAgICAgaWYgKFZLX0ZPUk1BVF9VTkRFRklORUQgIT0gY3JlYXRlX2luZm8tPmZvcm1hdCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjcmVhdGVfaW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDIzOTkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlVmlldygpOiBWa0ltYWdlVmlld0NyZWF0ZUluZm8gc3RydWN0IGhhcyBhIGNoYWluZWQgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgc3RydWN0LCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgbWVtYmVyIGlzICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrRm9ybWF0KGNyZWF0ZV9pbmZvLT5mb3JtYXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoYWluIG11c3QgaW5jbHVkZSBhIGNvbXBhdGlibGUgeWNiY3IgY29udmVyc2lvbgorICAgICAgICBib29sIGNvbnZfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgdWludDY0X3QgZXh0ZXJuYWxfZm9ybWF0ID0gMDsKKyAgICAgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyAqeWNiY3JfY29udl9pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbz4oY3JlYXRlX2luZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKHljYmNyX2NvbnZfaW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gY29udl9oYW5kbGUgPSB5Y2Jjcl9jb252X2luZm8tPmNvbnZlcnNpb247CisgICAgICAgICAgICBpZiAoeWNiY3JfY29udmVyc2lvbl9haGJfZm10X21hcC5maW5kKGNvbnZfaGFuZGxlKSAhPSB5Y2Jjcl9jb252ZXJzaW9uX2FoYl9mbXRfbWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udl9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZXh0ZXJuYWxfZm9ybWF0ID0geWNiY3JfY29udmVyc2lvbl9haGJfZm10X21hcC5hdChjb252X2hhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCghY29udl9mb3VuZCkgfHwgKGV4dGVybmFsX2Zvcm1hdCAhPSBpbWFnZV9zdGF0ZS0+YWhiX2Zvcm1hdCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY3JlYXRlX2luZm8tPmltYWdlKSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyNDAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXcoKTogVmtJbWFnZVZpZXdDcmVhdGVJbmZvIHN0cnVjdCBoYXMgYSBjaGFpbmVkIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHN0cnVjdCwgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aG91dCBhIGNoYWluZWQgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyBzdHJ1Y3Qgd2l0aCB0aGUgc2FtZSBleHRlcm5hbCBmb3JtYXQuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBFcnJvcnMgaW4gY3JlYXRlX2luZm8gc3dpenpsZXMKKyAgICAgICAgaWYgKChjcmVhdGVfaW5mby0+Y29tcG9uZW50cy5yICE9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZKSB8fAorICAgICAgICAgICAgKGNyZWF0ZV9pbmZvLT5jb21wb25lbnRzLmcgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpIHx8CisgICAgICAgICAgICAoY3JlYXRlX2luZm8tPmNvbXBvbmVudHMuYiAhPSBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSkgfHwKKyAgICAgICAgICAgIChjcmVhdGVfaW5mby0+Y29tcG9uZW50cy5hICE9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjcmVhdGVfaW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI0MDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlVmlldygpOiBWa0ltYWdlVmlld0NyZWF0ZUluZm8gc3RydWN0IGhhcyBhIGNoYWluZWQgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgc3RydWN0LCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlcyBvbmUgb3IgbW9yZSBub24taWRlbnRpdHkgY29tcG9uZW50IHN3aXp6bGVzLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0QU5EUk9JRChjb25zdCBWa0ltYWdlIGltYWdlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBjb25zdCBJTUFHRV9TVEFURSAqaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGltYWdlKTsKKyAgICBpZiAoaW1hZ2Vfc3RhdGUtPmltcG9ydGVkX2FoYiAmJiAoMCA9PSBpbWFnZV9zdGF0ZS0+R2V0Qm91bmRNZW1vcnkoKS5zaXplKCkpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIEhhbmRsZVRvVWludDY0KGltYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1pbWFnZS0wMTg5NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KCk6IEF0dGVtcHQgdG8gcXVlcnkgbGF5b3V0IGZyb20gYW4gaW1hZ2UgY3JlYXRlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQgaGFuZGxlVHlwZSB3aGljaCBoYXMgbm90IHlldCBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJib3VuZCB0byBtZW1vcnkuIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisjZWxzZQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ3JlYXRlSW1hZ2VBTkRST0lEKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmNyZWF0ZV9pbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ3JlYXRlSW1hZ2VWaWV3QU5EUk9JRChjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gKmNyZWF0ZV9pbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dEFORFJPSUQoY29uc3QgVmtJbWFnZSBpbWFnZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0ltYWdlICpwSW1hZ2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19hbmRyb2lkX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlcikgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ3JlYXRlSW1hZ2VBTkRST0lEKHJlcG9ydF9kYXRhLCBwQ3JlYXRlSW5mbyk7CisgICAgfSBlbHNlIHsgIC8vIFRoZXNlIGNoZWNrcyBhcmUgb21pdHRlZCBvciByZXBsYWNlZCB3aGVuIEFuZHJvaWQgSFcgQnVmZmVyIGV4dGVuc2lvbiBpcyBhY3RpdmUKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5mb3JtYXQgPT0gVktfRk9STUFUX1VOREVGSU5FRCkgeworICAgICAgICAgICAgcmV0dXJuIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDA5NDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogVmtGb3JtYXQgZm9yIGltYWdlIG11c3Qgbm90IGJlIFZLX0ZPUk1BVF9VTkRFRklORUQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocENyZWF0ZUluZm8tPmZsYWdzICYgVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQpIHsKKyAgICAgICAgaWYgKFZLX0lNQUdFX1RZUEVfMkQgIT0gcENyZWF0ZUluZm8tPmltYWdlVHlwZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAwOTQ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBJbWFnZSB0eXBlIG11c3QgYmUgVktfSU1BR0VfVFlQRV8yRCB3aGVuIFZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklUICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZyBiaXQgaXMgc2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBDcmVhdGVJbmZvLT5leHRlbnQud2lkdGggIT0gcENyZWF0ZUluZm8tPmV4dGVudC5oZWlnaHQpIHx8IChwQ3JlYXRlSW5mby0+YXJyYXlMYXllcnMgPCA2KSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk1NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogSWYgVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQgZmxhZyBiaXQgaXMgc2V0LCB3aWR0aCAoJWQpIG11c3QgZXF1YWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWlnaHQgKCVkKSBhbmQgYXJyYXlMYXllcnMgKCVkKSBtdXN0IGJlID49IDYuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+ZXh0ZW50LndpZHRoLCBwQ3JlYXRlSW5mby0+ZXh0ZW50LmhlaWdodCwgcENyZWF0ZUluZm8tPmFycmF5TGF5ZXJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgKmRldmljZV9saW1pdHMgPSAmcGh5c19kZXZfcHJvcHMubGltaXRzOworICAgIFZrSW1hZ2VVc2FnZUZsYWdzIGF0dGFjaF9mbGFncyA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ7CisgICAgaWYgKChwQ3JlYXRlSW5mby0+dXNhZ2UgJiBhdHRhY2hfZmxhZ3MpICYmIChwQ3JlYXRlSW5mby0+ZXh0ZW50LndpZHRoID4gZGV2aWNlX2xpbWl0cy0+bWF4RnJhbWVidWZmZXJXaWR0aCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogSW1hZ2UgdXNhZ2UgZmxhZ3MgaW5jbHVkZSBhIGZyYW1lIGJ1ZmZlciBhdHRhY2htZW50IGJpdCBhbmQgaW1hZ2Ugd2lkdGggZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVyV2lkdGguIik7CisgICAgfQorCisgICAgaWYgKChwQ3JlYXRlSW5mby0+dXNhZ2UgJiBhdHRhY2hfZmxhZ3MpICYmIChwQ3JlYXRlSW5mby0+ZXh0ZW50LmhlaWdodCA+IGRldmljZV9saW1pdHMtPm1heEZyYW1lYnVmZmVySGVpZ2h0KSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMDk2NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBJbWFnZSB1c2FnZSBmbGFncyBpbmNsdWRlIGEgZnJhbWUgYnVmZmVyIGF0dGFjaG1lbnQgYml0IGFuZCBpbWFnZSBoZWlnaHQgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVySGVpZ2h0Iik7CisgICAgfQorCisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2V4dF9mcmFnbWVudF9kZW5zaXR5X21hcCkgeworICAgICAgICB1aW50MzJfdCBjZWlsaW5nX3dpZHRoID0KKyAgICAgICAgICAgICh1aW50MzJfdCljZWlsKChmbG9hdClkZXZpY2VfbGltaXRzLT5tYXhGcmFtZWJ1ZmZlcldpZHRoIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KChmbG9hdClwaHlzX2Rldl9leHRfcHJvcHMuZnJhZ21lbnRfZGVuc2l0eV9tYXBfcHJvcHMubWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplLndpZHRoLCAxLjBmKSk7CisgICAgICAgIGlmICgocENyZWF0ZUluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCkgJiYgKHBDcmVhdGVJbmZvLT5leHRlbnQud2lkdGggPiBjZWlsaW5nX3dpZHRoKSkgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMjU1OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBJbWFnZSB1c2FnZSBmbGFncyBpbmNsdWRlIGEgZnJhZ21lbnQgZGVuc2l0eSBtYXAgYml0IGFuZCBpbWFnZSB3aWR0aCAoJXUpIGV4Y2VlZHMgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjZWlsaW5nIG9mIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJXaWR0aCAoJXUpIC8gbWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplLndpZHRoICgldSkuIFRoZSBjZWlsaW5nIHZhbHVlOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+ZXh0ZW50LndpZHRoLCBkZXZpY2VfbGltaXRzLT5tYXhGcmFtZWJ1ZmZlcldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmZyYWdtZW50X2RlbnNpdHlfbWFwX3Byb3BzLm1pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZS53aWR0aCwgY2VpbGluZ193aWR0aCk7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBjZWlsaW5nX2hlaWdodCA9CisgICAgICAgICAgICAodWludDMyX3QpY2VpbCgoZmxvYXQpZGV2aWNlX2xpbWl0cy0+bWF4RnJhbWVidWZmZXJIZWlnaHQgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoKGZsb2F0KXBoeXNfZGV2X2V4dF9wcm9wcy5mcmFnbWVudF9kZW5zaXR5X21hcF9wcm9wcy5taW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemUuaGVpZ2h0LCAxLjBmKSk7CisgICAgICAgIGlmICgocENyZWF0ZUluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCkgJiYgKHBDcmVhdGVJbmZvLT5leHRlbnQuaGVpZ2h0ID4gY2VpbGluZ19oZWlnaHQpKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAyNTYwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IEltYWdlIHVzYWdlIGZsYWdzIGluY2x1ZGUgYSBmcmFnbWVudCBkZW5zaXR5IG1hcCBiaXQgYW5kIGltYWdlIGhlaWdodCAoJXUpIGV4Y2VlZHMgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjZWlsaW5nIG9mIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJIZWlnaHQgKCV1KSAvIG1pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZS5oZWlnaHQgKCV1KS4gVGhlIGNlaWxpbmcgdmFsdWU6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5leHRlbnQuaGVpZ2h0LCBkZXZpY2VfbGltaXRzLT5tYXhGcmFtZWJ1ZmZlckhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5mcmFnbWVudF9kZW5zaXR5X21hcF9wcm9wcy5taW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemUuaGVpZ2h0LCBjZWlsaW5nX2hlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfbGltaXRzID0ge307CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfU1VDQ0VTUzsKKyAgICBpZiAocENyZWF0ZUluZm8tPnRpbGluZyAhPSBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQpIHsKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbF9kZXZpY2UsIHBDcmVhdGVJbmZvLT5mb3JtYXQsIHBDcmVhdGVJbmZvLT5pbWFnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnRpbGluZywgcENyZWF0ZUluZm8tPnVzYWdlLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdF9saW1pdHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8gaW1hZ2VfZm9ybWF0X2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzI+KCk7CisgICAgICAgIGF1dG8gaW1hZ2VfZm9ybWF0X3Byb3BlcnRpZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyPigpOworICAgICAgICBpbWFnZV9mb3JtYXRfaW5mby50eXBlID0gcENyZWF0ZUluZm8tPmltYWdlVHlwZTsKKyAgICAgICAgaW1hZ2VfZm9ybWF0X2luZm8udGlsaW5nID0gcENyZWF0ZUluZm8tPnRpbGluZzsKKyAgICAgICAgaW1hZ2VfZm9ybWF0X2luZm8udXNhZ2UgPSBwQ3JlYXRlSW5mby0+dXNhZ2U7CisgICAgICAgIGltYWdlX2Zvcm1hdF9pbmZvLmZsYWdzID0gcENyZWF0ZUluZm8tPmZsYWdzOworICAgICAgICByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihwaHlzaWNhbF9kZXZpY2UsICZpbWFnZV9mb3JtYXRfaW5mbywgJmltYWdlX2Zvcm1hdF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgZm9ybWF0X2xpbWl0cyA9IGltYWdlX2Zvcm1hdF9wcm9wZXJ0aWVzLmltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IFZLX0VSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEKSB7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgICAgIGlmICghbHZsX2ZpbmRfaW5fY2hhaW48VmtFeHRlcm5hbEZvcm1hdEFORFJPSUQ+KHBDcmVhdGVJbmZvLT5wTmV4dCkpCisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCBrVlVJRFVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBGb3JtYXQgJXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb21iaW5hdGlvbiBvZiBwYXJhbWV0ZXJzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrRm9ybWF0KHBDcmVhdGVJbmZvLT5mb3JtYXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocENyZWF0ZUluZm8tPm1pcExldmVscyA+IGZvcm1hdF9saW1pdHMubWF4TWlwTGV2ZWxzKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXRfc3RyaW5nID0gc3RyaW5nX1ZrRm9ybWF0KHBDcmVhdGVJbmZvLT5mb3JtYXQpOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMjI1NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogSW1hZ2UgbWlwIGxldmVscz0lZCBleGNlZWQgaW1hZ2UgZm9ybWF0IG1heE1pcExldmVscz0lZCBmb3IgZm9ybWF0ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPm1pcExldmVscywgZm9ybWF0X2xpbWl0cy5tYXhNaXBMZXZlbHMsIGZvcm1hdF9zdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgdWludDY0X3QgdGV4ZWxfY291bnQgPSAodWludDY0X3QpcENyZWF0ZUluZm8tPmV4dGVudC53aWR0aCAqICh1aW50NjRfdClwQ3JlYXRlSW5mby0+ZXh0ZW50LmhlaWdodCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KXBDcmVhdGVJbmZvLT5leHRlbnQuZGVwdGggKiAodWludDY0X3QpcENyZWF0ZUluZm8tPmFycmF5TGF5ZXJzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpcENyZWF0ZUluZm8tPnNhbXBsZXM7CisgICAgICAgIHVpbnQ2NF90IHRvdGFsX3NpemUgPSAodWludDY0X3Qpc3RkOjpjZWlsKEZvcm1hdFRleGVsU2l6ZShwQ3JlYXRlSW5mby0+Zm9ybWF0KSAqIHRleGVsX2NvdW50KTsKKworICAgICAgICAvLyBSb3VuZCB1cCB0byBpbWFnZUdyYW51bGFyaXR5IGJvdW5kYXJ5CisgICAgICAgIFZrRGV2aWNlU2l6ZSBpbWFnZUdyYW51bGFyaXR5ID0gcGh5c19kZXZfcHJvcHMubGltaXRzLmJ1ZmZlckltYWdlR3JhbnVsYXJpdHk7CisgICAgICAgIHVpbnQ2NF90IGlnX21hc2sgPSBpbWFnZUdyYW51bGFyaXR5IC0gMTsKKyAgICAgICAgdG90YWxfc2l6ZSA9ICh0b3RhbF9zaXplICsgaWdfbWFzaykgJiB+aWdfbWFzazsKKworICAgICAgICBpZiAodG90YWxfc2l6ZSA+IGZvcm1hdF9saW1pdHMubWF4UmVzb3VyY2VTaXplKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9JbWFnZV9JbnZhbGlkRm9ybWF0TGltaXRzVmlvbGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IHJlc291cmNlIHNpemUgZXhjZWVkcyBhbGxvd2FibGUgbWF4aW11bSBJbWFnZSByZXNvdXJjZSBzaXplID0gMHglIiBQUkl4TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIG1heGltdW0gcmVzb3VyY2Ugc2l6ZSA9IDB4JSIgUFJJeExFQVNUNjQgIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3NpemUsIGZvcm1hdF9saW1pdHMubWF4UmVzb3VyY2VTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+YXJyYXlMYXllcnMgPiBmb3JtYXRfbGltaXRzLm1heEFycmF5TGF5ZXJzKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWFycmF5TGF5ZXJzLTAyMjU2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBhcnJheUxheWVycz0lZCBleGNlZWRzIGFsbG93YWJsZSBtYXhpbXVtIHN1cHBvcnRlZCBieSBmb3JtYXQgb2YgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+YXJyYXlMYXllcnMsIGZvcm1hdF9saW1pdHMubWF4QXJyYXlMYXllcnMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2tocl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24gJiYgRm9ybWF0UmVxdWlyZXNZY2JjckNvbnZlcnNpb24ocENyZWF0ZUluZm8tPmZvcm1hdCkgJiYKKyAgICAgICAgICAgICFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfeWNiY3JfaW1hZ2VfYXJyYXlzICYmIHBDcmVhdGVJbmZvLT5hcnJheUxheWVycyA+IDEpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIDAsCisgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNjUzIiwKKyAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBhcnJheUxheWVycz0lZCBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgb2YgMSBmb3IgZm9ybWF0cyByZXF1aXJpbmcgc2FtcGxlciB5Y2JjciBjb252ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+YXJyYXlMYXllcnMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwQ3JlYXRlSW5mby0+c2FtcGxlcyAmIGZvcm1hdF9saW1pdHMuc2FtcGxlQ291bnRzKSA9PSAwKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLTAyMjU4IiwgInZrQ3JlYXRlSW1hZ2UoKTogc2FtcGxlcyAlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGZvcm1hdCAweCUuOFguIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa1NhbXBsZUNvdW50RmxhZ0JpdHMocENyZWF0ZUluZm8tPnNhbXBsZXMpLCBmb3JtYXRfbGltaXRzLnNhbXBsZUNvdW50cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHBDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQpICYmICghZW5hYmxlZF9mZWF0dXJlcy5jb3JlLnNwYXJzZVJlc2lkZW5jeUFsaWFzZWQpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAxOTI0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IHRoZSBzcGFyc2VSZXNpZGVuY3lBbGlhc2VkIGRldmljZSBmZWF0dXJlIGlzIGRpc2FibGVkOiBJbWFnZXMgY2Fubm90IGJlIGNyZWF0ZWQgd2l0aCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQgc2V0LiIpOworICAgIH0KKworICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UyKSB7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVF9LSFIpIHsKKyAgICAgICAgICAgIGlmICghKEZvcm1hdElzQ29tcHJlc3NlZF9CQyhwQ3JlYXRlSW5mby0+Zm9ybWF0KSB8fCBGb3JtYXRJc0NvbXByZXNzZWRfQVNUQ19MRFIocENyZWF0ZUluZm8tPmZvcm1hdCkgfHwKKyAgICAgICAgICAgICAgICAgIEZvcm1hdElzQ29tcHJlc3NlZF9FVEMyX0VBQyhwQ3JlYXRlSW5mby0+Zm9ybWF0KSkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgTWFpbnRlbmFuY2UyIFZVSUQKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IElmIHBDcmVhdGVJbmZvLT5mbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVF9LSFIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IG11c3QgYmUgYmxvY2ssIEVUQyBvciBBU1RDIGNvbXByZXNzZWQsIGJ1dCBpcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrRm9ybWF0KHBDcmVhdGVJbmZvLT5mb3JtYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHBDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogQWRkIE1haW50ZW5hbmNlMiBWVUlECisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCBrVlVJRFVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBJZiBwQ3JlYXRlSW5mby0+ZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVRfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsYWdzIG11c3QgYWxzbyBjb250YWluIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocENyZWF0ZUluZm8tPnNoYXJpbmdNb2RlID09IFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UICYmIHBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVRdWV1ZUZhbWlsaWVzKHBDcmVhdGVJbmZvLT5xdWV1ZUZhbWlseUluZGV4Q291bnQsIHBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzLCAidmtDcmVhdGVJbWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyIsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxNDIwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDE0MjAiLCBmYWxzZSk7CisgICAgfQorCisgICAgaWYgKCFGb3JtYXRJc011bHRpcGxhbmUocENyZWF0ZUluZm8tPmZvcm1hdCkgJiYgIShwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUKSAmJgorICAgICAgICAocENyZWF0ZUluZm8tPmZsYWdzICYgVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVCkpIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAxNTc3IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogZm9ybWF0IGlzICVzIGFuZCBmbGFncyBhcmUgJXMuIFRoZSBmbGFncyBzaG91bGQgbm90IGluY2x1ZGUgVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVC4iLAorICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtGb3JtYXQocENyZWF0ZUluZm8tPmZvcm1hdCksIHN0cmluZ19Wa0ltYWdlQ3JlYXRlRmxhZ3MocENyZWF0ZUluZm8tPmZsYWdzKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UG9zdENhbGxSZWNvcmRDcmVhdGVJbWFnZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrSW1hZ2UgKnBJbWFnZSwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisKKyAgICBTdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2UoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEltYWdlLCByZXN1bHQpOworCisgICAgSU1BR0VfTEFZT1VUX1NUQVRFIGltYWdlX3N0YXRlOworICAgIGltYWdlX3N0YXRlLmxheW91dCA9IHBDcmVhdGVJbmZvLT5pbml0aWFsTGF5b3V0OworICAgIGltYWdlX3N0YXRlLmZvcm1hdCA9IHBDcmVhdGVJbmZvLT5mb3JtYXQ7CisgICAgSW1hZ2VTdWJyZXNvdXJjZVBhaXIgc3VicGFpcnsqcEltYWdlLCBmYWxzZSwgVmtJbWFnZVN1YnJlc291cmNlKCl9OworICAgIGltYWdlU3VicmVzb3VyY2VNYXBbKnBJbWFnZV0ucHVzaF9iYWNrKHN1YnBhaXIpOworICAgIGltYWdlTGF5b3V0TWFwW3N1YnBhaXJdID0gaW1hZ2Vfc3RhdGU7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUltYWdlKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgY29uc3QgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChpbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGltYWdlX3N0YXRlKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3ROb3RJblVzZShpbWFnZV9zdGF0ZSwgb2JqX3N0cnVjdCwgInZrRGVzdHJveUltYWdlIiwgIlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtMDEwMDAiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lJbWFnZShWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIC8vIENsZWFuIHVwIHZhbGlkYXRpb24gc3BlY2lmaWMgZGF0YQorICAgIEVyYXNlUUZPUmVsZWFzZUJhcnJpZXJzPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPihpbWFnZSk7CisKKyAgICBjb25zdCBhdXRvICZzdWJfZW50cnkgPSBpbWFnZVN1YnJlc291cmNlTWFwLmZpbmQoaW1hZ2UpOworICAgIGlmIChzdWJfZW50cnkgIT0gaW1hZ2VTdWJyZXNvdXJjZU1hcC5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBzdWJfZW50cnktPnNlY29uZCkgeworICAgICAgICAgICAgaW1hZ2VMYXlvdXRNYXAuZXJhc2UocGFpcik7CisgICAgICAgIH0KKyAgICAgICAgaW1hZ2VTdWJyZXNvdXJjZU1hcC5lcmFzZShzdWJfZW50cnkpOworICAgIH0KKworICAgIC8vIENsZWFuIHVwIGdlbmVyaWMgaW1hZ2Ugc3RhdGUKKyAgICBTdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmREZXN0cm95SW1hZ2UoZGV2aWNlLCBpbWFnZSwgcEFsbG9jYXRvcik7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbWFnZUF0dHJpYnV0ZXMoY29uc3QgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlLCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmcmFuZ2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChyYW5nZS5hc3BlY3RNYXNrICE9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQpIHsKKyAgICAgICAgY2hhciBjb25zdCBzdHJbXSA9ICJ2a0NtZENsZWFyQ29sb3JJbWFnZSBhc3BlY3RNYXNrcyBmb3IgYWxsIHN1YnJlc291cmNlIHJhbmdlcyBtdXN0IGJlIHNldCB0byBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIjsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZUFzcGVjdCwgc3RyKTsKKyAgICB9CisKKyAgICBpZiAoRm9ybWF0SXNEZXB0aE9yU3RlbmNpbChpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSB7CisgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRDbGVhckNvbG9ySW1hZ2UgY2FsbGVkIHdpdGggZGVwdGgvc3RlbmNpbCBpbWFnZS4iOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtMDAwMDciLCAiJXMuIiwgc3RyKTsKKyAgICB9IGVsc2UgaWYgKEZvcm1hdElzQ29tcHJlc3NlZChpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSB7CisgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRDbGVhckNvbG9ySW1hZ2UgY2FsbGVkIHdpdGggY29tcHJlc3NlZCBpbWFnZS4iOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtMDAwMDciLCAiJXMuIiwgc3RyKTsKKyAgICB9CisKKyAgICBpZiAoIShpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby51c2FnZSAmIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQpKSB7CisgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRDbGVhckNvbG9ySW1hZ2UgY2FsbGVkIHdpdGggaW1hZ2UgY3JlYXRlZCB3aXRob3V0IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQuIjsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlLTAwMDAyIiwgIiVzLiIsIHN0cik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit1aW50MzJfdCBSZXNvbHZlUmVtYWluaW5nTGV2ZWxzKGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpyYW5nZSwgdWludDMyX3QgbWlwX2xldmVscykgeworICAgIC8vIFJldHVybiBjb3JyZWN0IG51bWJlciBvZiBtaXAgbGV2ZWxzIHRha2luZyBpbnRvIGFjY291bnQgVktfUkVNQUlOSU5HX01JUF9MRVZFTFMKKyAgICB1aW50MzJfdCBtaXBfbGV2ZWxfY291bnQgPSByYW5nZS0+bGV2ZWxDb3VudDsKKyAgICBpZiAocmFuZ2UtPmxldmVsQ291bnQgPT0gVktfUkVNQUlOSU5HX01JUF9MRVZFTFMpIHsKKyAgICAgICAgbWlwX2xldmVsX2NvdW50ID0gbWlwX2xldmVscyAtIHJhbmdlLT5iYXNlTWlwTGV2ZWw7CisgICAgfQorICAgIHJldHVybiBtaXBfbGV2ZWxfY291bnQ7Cit9CisKK3VpbnQzMl90IFJlc29sdmVSZW1haW5pbmdMYXllcnMoY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgKnJhbmdlLCB1aW50MzJfdCBsYXllcnMpIHsKKyAgICAvLyBSZXR1cm4gY29ycmVjdCBudW1iZXIgb2YgbGF5ZXJzIHRha2luZyBpbnRvIGFjY291bnQgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUworICAgIHVpbnQzMl90IGFycmF5X2xheWVyX2NvdW50ID0gcmFuZ2UtPmxheWVyQ291bnQ7CisgICAgaWYgKHJhbmdlLT5sYXllckNvdW50ID09IFZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlMpIHsKKyAgICAgICAgYXJyYXlfbGF5ZXJfY291bnQgPSBsYXllcnMgLSByYW5nZS0+YmFzZUFycmF5TGF5ZXI7CisgICAgfQorICAgIHJldHVybiBhcnJheV9sYXllcl9jb3VudDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWZXJpZnlDbGVhckltYWdlTGF5b3V0KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmcmFuZ2UsIFZrSW1hZ2VMYXlvdXQgZGVzdF9pbWFnZV9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY19uYW1lKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZGVzdF9pbWFnZV9sYXlvdXQgIT0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMKSB7CisgICAgICAgIGlmIChkZXN0X2ltYWdlX2xheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCkgeworICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLnRpbGluZyAhPSBWS19JTUFHRV9USUxJTkdfTElORUFSKSB7CisgICAgICAgICAgICAgICAgLy8gTEFZT1VUX0dFTkVSQUwgaXMgYWxsb3dlZCwgYnV0IG1heSBub3QgYmUgcGVyZm9ybWFuY2Ugb3B0aW1hbCwgZmxhZyBhcyBwZXJmIHdhcm5pbmcuCisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkSW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogTGF5b3V0IGZvciBjbGVhcmVkIGltYWdlIHNob3VsZCBiZSBUUkFOU0ZFUl9EU1RfT1BUSU1BTCBpbnN0ZWFkIG9mIEdFTkVSQUwuIiwgZnVuY19uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSID09IGRlc3RfaW1hZ2VfbGF5b3V0KSB7CisgICAgICAgICAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgdW5pcXVlIGVycm9yIGlkIHdoZW4gYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGVuYWJsZSBWS19LSFJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlIGV4dGVuc2lvbiBiZWZvcmUgY3JlYXRpbmcgaW1hZ2VzIHdpdGggYSBsYXlvdXQgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSLiIpOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpbWFnZV9zdGF0ZS0+c2hhcmVkX3ByZXNlbnRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBzaGFyZWQgcHJlc2VudGFibGUgY2xlYXJlZCBpbWFnZSBpcyAlcyBidXQgY2FuIG9ubHkgYmUgVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoZGVzdF9pbWFnZV9sYXlvdXQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9jb2RlID0gIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2VMYXlvdXQtMDAwMDUiOworICAgICAgICAgICAgaWYgKHN0cmNtcChmdW5jX25hbWUsICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoKSIpID09IDApIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9jb2RlID0gIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlTGF5b3V0LTAwMDEyIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHN0cmNtcChmdW5jX25hbWUsICJ2a0NtZENsZWFyQ29sb3JJbWFnZSgpIikgPT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksIGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBMYXlvdXQgZm9yIGNsZWFyZWQgaW1hZ2UgaXMgJXMgYnV0IGNhbiBvbmx5IGJlIFRSQU5TRkVSX0RTVF9PUFRJTUFMIG9yIEdFTkVSQUwuIiwgZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGRlc3RfaW1hZ2VfbGF5b3V0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDYXN0IHRvIGNvbnN0IHRvIHByZXZlbnQgY3JlYXRpb24gYXQgdmFsaWRhdGUgdGltZS4KKyAgICBjb25zdCBhdXRvICpzdWJyZXNvdXJjZV9tYXAgPSBHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwKGNiX25vZGUsIGltYWdlX3N0YXRlLT5pbWFnZSk7CisgICAgaWYgKHN1YnJlc291cmNlX21hcCkgeworICAgICAgICBib29sIHN1YnJlc19za2lwID0gZmFsc2U7CisgICAgICAgIExheW91dFVzZUNoZWNrQW5kTWVzc2FnZSBsYXlvdXRfY2hlY2soc3VicmVzb3VyY2VfbWFwKTsKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2Ugbm9ybWFsaXplZF9pc3IgPSBOb3JtYWxpemVTdWJyZXNvdXJjZVJhbmdlKCppbWFnZV9zdGF0ZSwgcmFuZ2UpOworICAgICAgICBhdXRvIHN1YnJlc19jYWxsYmFjayA9IFt0aGlzLCBjYl9ub2RlLCBkZXN0X2ltYWdlX2xheW91dCwgZnVuY19uYW1lLCAmbGF5b3V0X2NoZWNrLCAmc3VicmVzX3NraXBdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UgJnN1YnJlcywgVmtJbWFnZUxheW91dCBsYXlvdXQsIFZrSW1hZ2VMYXlvdXQgaW5pdGlhbF9sYXlvdXQpIHsKKyAgICAgICAgICAgIGlmICghbGF5b3V0X2NoZWNrLkNoZWNrKHN1YnJlcywgZGVzdF9pbWFnZV9sYXlvdXQsIGxheW91dCwgaW5pdGlhbF9sYXlvdXQpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JfY29kZSA9ICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlTGF5b3V0LTAwMDA0IjsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGZ1bmNfbmFtZSwgInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSgpIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlID0gIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlTGF5b3V0LTAwMDExIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc3RyY21wKGZ1bmNfbmFtZSwgInZrQ21kQ2xlYXJDb2xvckltYWdlKCkiKSA9PSAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VicmVzX3NraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQ2Fubm90IGNsZWFyIGFuIGltYWdlIHdob3NlIGxheW91dCBpcyAlcyBhbmQgZG9lc24ndCBtYXRjaCB0aGUgJXMgbGF5b3V0ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGRlc3RfaW1hZ2VfbGF5b3V0KSwgbGF5b3V0X2NoZWNrLm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZUxheW91dChsYXlvdXRfY2hlY2subGF5b3V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIXN1YnJlc19za2lwOworICAgICAgICB9OworICAgICAgICBzdWJyZXNvdXJjZV9tYXAtPkZvclJhbmdlKG5vcm1hbGl6ZWRfaXNyLCBzdWJyZXNfY2FsbGJhY2spOworICAgICAgICBza2lwIHw9IHN1YnJlc19za2lwOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQ29sb3JJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlICpwQ29sb3IsIHVpbnQzMl90IHJhbmdlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAqcFJhbmdlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIFRPRE8gOiBWZXJpZnkgbWVtb3J5IGlzIGluIFZLX0lNQUdFX1NUQVRFX0NMRUFSIHN0YXRlCisgICAgY29uc3QgYXV0byAqY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY29uc3QgYXV0byAqaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGltYWdlKTsKKyAgICBpZiAoY2Jfbm9kZSAmJiBpbWFnZV9zdGF0ZSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvSW1hZ2UoaW1hZ2Vfc3RhdGUsICJ2a0NtZENsZWFyQ29sb3JJbWFnZSgpIiwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtMDAwMDMiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfbm9kZSwgInZrQ21kQ2xlYXJDb2xvckltYWdlKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfbm9kZSwgQ01EX0NMRUFSQ09MT1JJTUFHRSwgInZrQ21kQ2xlYXJDb2xvckltYWdlKCkiKTsKKyAgICAgICAgaWYgKGFwaV92ZXJzaW9uID49IFZLX0FQSV9WRVJTSU9OXzFfMSB8fCBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UxKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgVmFsaWRhdGVJbWFnZUZvcm1hdEZlYXR1cmVGbGFncyhpbWFnZV9zdGF0ZSwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVCwgInZrQ21kQ2xlYXJDb2xvckltYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlLTAxOTkzIiwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtMDE5OTMiKTsKKyAgICAgICAgfQorICAgICAgICBza2lwIHw9IEluc2lkZVJlbmRlclBhc3MoY2Jfbm9kZSwgInZrQ21kQ2xlYXJDb2xvckltYWdlKCkiLCAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1yZW5kZXJwYXNzIik7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByYW5nZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcmFtX25hbWUgPSAicFJhbmdlc1siICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiXSI7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ21kQ2xlYXJDb2xvclN1YnJlc291cmNlUmFuZ2UoaW1hZ2Vfc3RhdGUsIHBSYW5nZXNbaV0sIHBhcmFtX25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VBdHRyaWJ1dGVzKGltYWdlX3N0YXRlLCBwUmFuZ2VzW2ldKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmVyaWZ5Q2xlYXJJbWFnZUxheW91dChjYl9ub2RlLCBpbWFnZV9zdGF0ZSwgcFJhbmdlc1tpXSwgaW1hZ2VMYXlvdXQsICJ2a0NtZENsZWFyQ29sb3JJbWFnZSgpIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UHJlQ2FsbFJlY29yZENtZENsZWFyQ29sb3JJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSAqcENvbG9yLCB1aW50MzJfdCByYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKSB7CisgICAgU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQ2xlYXJDb2xvckltYWdlKGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcENvbG9yLCByYW5nZUNvdW50LCBwUmFuZ2VzKTsKKworICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworICAgIGlmIChjYl9ub2RlICYmIGltYWdlX3N0YXRlKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByYW5nZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFNldEltYWdlSW5pdGlhbExheW91dChjYl9ub2RlLCBpbWFnZSwgcFJhbmdlc1tpXSwgaW1hZ2VMYXlvdXQpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlICpwRGVwdGhTdGVuY2lsLCB1aW50MzJfdCByYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICAvLyBUT0RPIDogVmVyaWZ5IG1lbW9yeSBpcyBpbiBWS19JTUFHRV9TVEFURV9DTEVBUiBzdGF0ZQorICAgIGNvbnN0IGF1dG8gKmNiX25vZGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNvbnN0IGF1dG8gKmltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgaWYgKGNiX25vZGUgJiYgaW1hZ2Vfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0ltYWdlKGltYWdlX3N0YXRlLCAidmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLTAwMDEwIik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX25vZGUsICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoKSIsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX25vZGUsIENNRF9DTEVBUkRFUFRIU1RFTkNJTElNQUdFLCAidmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKCkiKTsKKyAgICAgICAgaWYgKGFwaV92ZXJzaW9uID49IFZLX0FQSV9WRVJTSU9OXzFfMSB8fCBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UxKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VGb3JtYXRGZWF0dXJlRmxhZ3MoaW1hZ2Vfc3RhdGUsIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQsICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMTk5NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLTAxOTk0Iik7CisgICAgICAgIH0KKyAgICAgICAgc2tpcCB8PSBJbnNpZGVSZW5kZXJQYXNzKGNiX25vZGUsICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoKSIsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1yZW5kZXJwYXNzIik7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByYW5nZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcmFtX25hbWUgPSAicFJhbmdlc1siICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiXSI7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ21kQ2xlYXJEZXB0aFN1YnJlc291cmNlUmFuZ2UoaW1hZ2Vfc3RhdGUsIHBSYW5nZXNbaV0sIHBhcmFtX25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBza2lwIHw9IFZlcmlmeUNsZWFySW1hZ2VMYXlvdXQoY2Jfbm9kZSwgaW1hZ2Vfc3RhdGUsIHBSYW5nZXNbaV0sIGltYWdlTGF5b3V0LCAidmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKCkiKTsKKyAgICAgICAgICAgIC8vIEltYWdlIGFzcGVjdCBtdXN0IGJlIGRlcHRoIG9yIHN0ZW5jaWwgb3IgYm90aAorICAgICAgICAgICAgVmtJbWFnZUFzcGVjdEZsYWdzIHZhbGlkX2FzcGVjdHMgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworICAgICAgICAgICAgaWYgKCgocFJhbmdlc1tpXS5hc3BlY3RNYXNrICYgdmFsaWRfYXNwZWN0cykgPT0gMCkgfHwgKChwUmFuZ2VzW2ldLmFzcGVjdE1hc2sgJiB+dmFsaWRfYXNwZWN0cykgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNvbnN0IHN0cltdID0KKyAgICAgICAgICAgICAgICAgICAgInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSBhc3BlY3RNYXNrcyBmb3IgYWxsIHN1YnJlc291cmNlIHJhbmdlcyBtdXN0IGJlIHNldCB0byBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUICIKKyAgICAgICAgICAgICAgICAgICAgImFuZC9vciBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQiOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkSW1hZ2VBc3BlY3QsIHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltYWdlX3N0YXRlICYmICFGb3JtYXRJc0RlcHRoT3JTdGVuY2lsKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkpIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlIGNhbGxlZCB3aXRob3V0IGEgZGVwdGgvc3RlbmNpbCBpbWFnZS4iOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZSksICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMDAxNCIsICIlcy4iLCBzdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUICE9IChWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUICYgaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udXNhZ2UpKSB7CisgICAgICAgICAgICBjaGFyIGNvbnN0IHN0cltdID0KKyAgICAgICAgICAgICAgICAidmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKCkgY2FsbGVkIHdpdGggYW4gaW1hZ2UgdGhhdCB3YXMgbm90IGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCAiCisgICAgICAgICAgICAgICAgInNldC4iOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZSksICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMDAwOSIsICIlcy4iLCBzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit2b2lkIENvcmVDaGVja3M6OlByZUNhbGxSZWNvcmRDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUgKnBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKSB7CisgICAgU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShjb21tYW5kQnVmZmVyLCBpbWFnZSwgaW1hZ2VMYXlvdXQsIHBEZXB0aFN0ZW5jaWwsIHJhbmdlQ291bnQsIHBSYW5nZXMpOworICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworICAgIGlmIChjYl9ub2RlICYmIGltYWdlX3N0YXRlKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByYW5nZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFNldEltYWdlSW5pdGlhbExheW91dChjYl9ub2RlLCBpbWFnZSwgcFJhbmdlc1tpXSwgaW1hZ2VMYXlvdXQpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgW3gsIHhvZmZzZXRdIGFuZCBbeSwgeW9mZnNldF0gb3ZlcmxhcAorc3RhdGljIGJvb2wgUmFuZ2VzSW50ZXJzZWN0KGludDMyX3Qgc3RhcnQsIHVpbnQzMl90IHN0YXJ0X29mZnNldCwgaW50MzJfdCBlbmQsIHVpbnQzMl90IGVuZF9vZmZzZXQpIHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIHVpbnQzMl90IGludGVyc2VjdGlvbl9taW4gPSBzdGQ6Om1heChzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhcnQpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZW5kKSk7CisgICAgdWludDMyX3QgaW50ZXJzZWN0aW9uX21heCA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGFydCkgKyBzdGFydF9vZmZzZXQsIHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmQpICsgZW5kX29mZnNldCk7CisKKyAgICBpZiAoaW50ZXJzZWN0aW9uX21heCA+IGludGVyc2VjdGlvbl9taW4pIHsKKyAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHNvdXJjZSBhcmVhIG9mIGZpcnN0IGNvcHkgcmVnaW9uIGludGVyc2VjdHMgZGVzdCBhcmVhIG9mIHNlY29uZCByZWdpb24KKy8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVzZSBhcmUgY29weSByZWdpb25zIHdpdGhpbiBhIHNpbmdsZSBpbWFnZSAob3RoZXJ3aXNlIG5vIHBvc3NpYmlsaXR5IG9mIGNvbGxpc2lvbikKK3N0YXRpYyBib29sIFJlZ2lvbkludGVyc2VjdHMoY29uc3QgVmtJbWFnZUNvcHkgKnJnbjAsIGNvbnN0IFZrSW1hZ2VDb3B5ICpyZ24xLCBWa0ltYWdlVHlwZSB0eXBlLCBib29sIGlzX211bHRpcGxhbmUpIHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgLy8gU2VwYXJhdGUgcGxhbmVzIHdpdGhpbiBhIG11bHRpcGxhbmUgaW1hZ2UgY2Fubm90IGludGVyc2VjdAorICAgIGlmIChpc19tdWx0aXBsYW5lICYmIChyZ24wLT5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrICE9IHJnbjEtPmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2spKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKChyZ24wLT5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9PSByZ24xLT5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCkgJiYKKyAgICAgICAgKFJhbmdlc0ludGVyc2VjdChyZ24wLT5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciwgcmduMC0+c3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCwgcmduMS0+ZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmduMS0+ZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCkpKSB7CisgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9UWVBFXzNEOgorICAgICAgICAgICAgICAgIHJlc3VsdCAmPSBSYW5nZXNJbnRlcnNlY3QocmduMC0+c3JjT2Zmc2V0LnosIHJnbjAtPmV4dGVudC5kZXB0aCwgcmduMS0+ZHN0T2Zmc2V0LnosIHJnbjEtPmV4dGVudC5kZXB0aCk7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX1RZUEVfMkQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ICY9IFJhbmdlc0ludGVyc2VjdChyZ24wLT5zcmNPZmZzZXQueSwgcmduMC0+ZXh0ZW50LmhlaWdodCwgcmduMS0+ZHN0T2Zmc2V0LnksIHJnbjEtPmV4dGVudC5oZWlnaHQpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9UWVBFXzFEOgorICAgICAgICAgICAgICAgIHJlc3VsdCAmPSBSYW5nZXNJbnRlcnNlY3QocmduMC0+c3JjT2Zmc2V0LngsIHJnbjAtPmV4dGVudC53aWR0aCwgcmduMS0+ZHN0T2Zmc2V0LngsIHJnbjEtPmV4dGVudC53aWR0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFVucmVjb2duaXplZCBvciBuZXcgSU1BR0VfVFlQRSBlbnVtcyB3aWxsIGJlIGNhdWdodCBpbiBwYXJhbWV0ZXJfdmFsaWRhdGlvbgorICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmV0dXJucyBub24temVybyBpZiBvZmZzZXQgYW5kIGV4dGVudCBleGNlZWQgaW1hZ2UgZXh0ZW50cworc3RhdGljIGNvbnN0IHVpbnQzMl90IHhfYml0ID0gMTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB5X2JpdCA9IDI7CitzdGF0aWMgY29uc3QgdWludDMyX3Qgel9iaXQgPSA0Oworc3RhdGljIHVpbnQzMl90IEV4Y2VlZHNCb3VuZHMoY29uc3QgVmtPZmZzZXQzRCAqb2Zmc2V0LCBjb25zdCBWa0V4dGVudDNEICpleHRlbnQsIGNvbnN0IFZrRXh0ZW50M0QgKmltYWdlX2V4dGVudCkgeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgLy8gRXh0ZW50cy9kZXB0aHMgY2Fubm90IGJlIG5lZ2F0aXZlIGJ1dCBjaGVja3MgbGVmdCBpbiBmb3IgY2xhcml0eQorICAgIGlmICgob2Zmc2V0LT56ICsgZXh0ZW50LT5kZXB0aCA+IGltYWdlX2V4dGVudC0+ZGVwdGgpIHx8IChvZmZzZXQtPnogPCAwKSB8fAorICAgICAgICAoKG9mZnNldC0+eiArIHN0YXRpY19jYXN0PGludDMyX3Q+KGV4dGVudC0+ZGVwdGgpKSA8IDApKSB7CisgICAgICAgIHJlc3VsdCB8PSB6X2JpdDsKKyAgICB9CisgICAgaWYgKChvZmZzZXQtPnkgKyBleHRlbnQtPmhlaWdodCA+IGltYWdlX2V4dGVudC0+aGVpZ2h0KSB8fCAob2Zmc2V0LT55IDwgMCkgfHwKKyAgICAgICAgKChvZmZzZXQtPnkgKyBzdGF0aWNfY2FzdDxpbnQzMl90PihleHRlbnQtPmhlaWdodCkpIDwgMCkpIHsKKyAgICAgICAgcmVzdWx0IHw9IHlfYml0OworICAgIH0KKyAgICBpZiAoKG9mZnNldC0+eCArIGV4dGVudC0+d2lkdGggPiBpbWFnZV9leHRlbnQtPndpZHRoKSB8fCAob2Zmc2V0LT54IDwgMCkgfHwKKyAgICAgICAgKChvZmZzZXQtPnggKyBzdGF0aWNfY2FzdDxpbnQzMl90PihleHRlbnQtPndpZHRoKSkgPCAwKSkgeworICAgICAgICByZXN1bHQgfD0geF9iaXQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRlc3QgaWYgdHdvIFZrRXh0ZW50M0Qgc3RydWN0cyBhcmUgZXF1aXZhbGVudAorc3RhdGljIGlubGluZSBib29sIElzRXh0ZW50RXF1YWwoY29uc3QgVmtFeHRlbnQzRCAqZXh0ZW50LCBjb25zdCBWa0V4dGVudDNEICpvdGhlcl9leHRlbnQpIHsKKyAgICBib29sIHJlc3VsdCA9IHRydWU7CisgICAgaWYgKChleHRlbnQtPndpZHRoICE9IG90aGVyX2V4dGVudC0+d2lkdGgpIHx8IChleHRlbnQtPmhlaWdodCAhPSBvdGhlcl9leHRlbnQtPmhlaWdodCkgfHwKKyAgICAgICAgKGV4dGVudC0+ZGVwdGggIT0gb3RoZXJfZXh0ZW50LT5kZXB0aCkpIHsKKyAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEZvciBpbWFnZSBjb3BpZXMgYmV0d2VlbiBjb21wcmVzc2VkL3VuY29tcHJlc3NlZCBmb3JtYXRzLCB0aGUgZXh0ZW50IGlzIHByb3ZpZGVkIGluIHNvdXJjZSBpbWFnZSB0ZXhlbHMKKy8vIERlc3RpbmF0aW9uIGltYWdlIHRleGVsIGV4dGVudHMgbXVzdCBiZSBhZGp1c3RlZCBieSBibG9jayBzaXplIGZvciB0aGUgZGVzdCB2YWxpZGF0aW9uIGNoZWNrcworVmtFeHRlbnQzRCBHZXRBZGp1c3RlZERlc3RJbWFnZUV4dGVudChWa0Zvcm1hdCBzcmNfZm9ybWF0LCBWa0Zvcm1hdCBkc3RfZm9ybWF0LCBWa0V4dGVudDNEIGV4dGVudCkgeworICAgIFZrRXh0ZW50M0QgYWRqdXN0ZWRfZXh0ZW50ID0gZXh0ZW50OworICAgIGlmICgoRm9ybWF0SXNDb21wcmVzc2VkKHNyY19mb3JtYXQpIHx8IEZvcm1hdElzU2luZ2xlUGxhbmVfNDIyKHNyY19mb3JtYXQpKSAmJgorICAgICAgICAhKEZvcm1hdElzQ29tcHJlc3NlZChkc3RfZm9ybWF0KSB8fCBGb3JtYXRJc1NpbmdsZVBsYW5lXzQyMihkc3RfZm9ybWF0KSkpIHsKKyAgICAgICAgVmtFeHRlbnQzRCBibG9ja19zaXplID0gRm9ybWF0VGV4ZWxCbG9ja0V4dGVudChzcmNfZm9ybWF0KTsKKyAgICAgICAgYWRqdXN0ZWRfZXh0ZW50LndpZHRoIC89IGJsb2NrX3NpemUud2lkdGg7CisgICAgICAgIGFkanVzdGVkX2V4dGVudC5oZWlnaHQgLz0gYmxvY2tfc2l6ZS5oZWlnaHQ7CisgICAgICAgIGFkanVzdGVkX2V4dGVudC5kZXB0aCAvPSBibG9ja19zaXplLmRlcHRoOworICAgIH0gZWxzZSBpZiAoIShGb3JtYXRJc0NvbXByZXNzZWQoc3JjX2Zvcm1hdCkgfHwgRm9ybWF0SXNTaW5nbGVQbGFuZV80MjIoc3JjX2Zvcm1hdCkpICYmCisgICAgICAgICAgICAgICAoRm9ybWF0SXNDb21wcmVzc2VkKGRzdF9mb3JtYXQpIHx8IEZvcm1hdElzU2luZ2xlUGxhbmVfNDIyKGRzdF9mb3JtYXQpKSkgeworICAgICAgICBWa0V4dGVudDNEIGJsb2NrX3NpemUgPSBGb3JtYXRUZXhlbEJsb2NrRXh0ZW50KGRzdF9mb3JtYXQpOworICAgICAgICBhZGp1c3RlZF9leHRlbnQud2lkdGggKj0gYmxvY2tfc2l6ZS53aWR0aDsKKyAgICAgICAgYWRqdXN0ZWRfZXh0ZW50LmhlaWdodCAqPSBibG9ja19zaXplLmhlaWdodDsKKyAgICAgICAgYWRqdXN0ZWRfZXh0ZW50LmRlcHRoICo9IGJsb2NrX3NpemUuZGVwdGg7CisgICAgfQorICAgIHJldHVybiBhZGp1c3RlZF9leHRlbnQ7Cit9CisKKy8vIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBleHRlbnQgb2YgYW4gaW1hZ2Ugc3VicmVzb3VyY2UsIGFkanVzdGVkIGZvciBtaXAgbGV2ZWwgYW5kIGFycmF5IGRlcHRoLgorc3RhdGljIGlubGluZSBWa0V4dGVudDNEIEdldEltYWdlU3VicmVzb3VyY2VFeHRlbnQoY29uc3QgSU1BR0VfU1RBVEUgKmltZywgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzICpzdWJyZXNvdXJjZSkgeworICAgIGNvbnN0IHVpbnQzMl90IG1pcCA9IHN1YnJlc291cmNlLT5taXBMZXZlbDsKKworICAgIC8vIFJldHVybiB6ZXJvIGV4dGVudCBpZiBtaXAgbGV2ZWwgZG9lc24ndCBleGlzdAorICAgIGlmIChtaXAgPj0gaW1nLT5jcmVhdGVJbmZvLm1pcExldmVscykgeworICAgICAgICByZXR1cm4gVmtFeHRlbnQzRHswLCAwLCAwfTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBhbGxvdyBtaXAgYWRqdXN0bWVudCB0byBjcmVhdGUgMCBkaW0sIGJ1dCBwYXNzIGFsb25nIGEgMCBpZiB0aGF0J3Mgd2hhdCBzdWJyZXNvdXJjZSBzcGVjaWZpZWQKKyAgICBWa0V4dGVudDNEIGV4dGVudCA9IGltZy0+Y3JlYXRlSW5mby5leHRlbnQ7CisKKyAgICAvLyBJZiBtdWx0aS1wbGFuZSwgYWRqdXN0IHBlci1wbGFuZSBleHRlbnQKKyAgICBpZiAoRm9ybWF0SXNNdWx0aXBsYW5lKGltZy0+Y3JlYXRlSW5mby5mb3JtYXQpKSB7CisgICAgICAgIFZrRXh0ZW50MkQgZGl2aXNvcnMgPSBGaW5kTXVsdGlwbGFuZUV4dGVudERpdmlzb3JzKGltZy0+Y3JlYXRlSW5mby5mb3JtYXQsIHN1YnJlc291cmNlLT5hc3BlY3RNYXNrKTsKKyAgICAgICAgZXh0ZW50LndpZHRoIC89IGRpdmlzb3JzLndpZHRoOworICAgICAgICBleHRlbnQuaGVpZ2h0IC89IGRpdmlzb3JzLmhlaWdodDsKKyAgICB9CisKKyAgICBpZiAoaW1nLT5jcmVhdGVJbmZvLmZsYWdzICYgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OVikgeworICAgICAgICBleHRlbnQud2lkdGggPSAoMCA9PSBleHRlbnQud2lkdGggPyAwIDogc3RkOjptYXgoMlUsIDEgKyAoKGV4dGVudC53aWR0aCAtIDEpID4+IG1pcCkpKTsKKyAgICAgICAgZXh0ZW50LmhlaWdodCA9ICgwID09IGV4dGVudC5oZWlnaHQgPyAwIDogc3RkOjptYXgoMlUsIDEgKyAoKGV4dGVudC5oZWlnaHQgLSAxKSA+PiBtaXApKSk7CisgICAgICAgIGV4dGVudC5kZXB0aCA9ICgwID09IGV4dGVudC5kZXB0aCA/IDAgOiBzdGQ6Om1heCgyVSwgMSArICgoZXh0ZW50LmRlcHRoIC0gMSkgPj4gbWlwKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGV4dGVudC53aWR0aCA9ICgwID09IGV4dGVudC53aWR0aCA/IDAgOiBzdGQ6Om1heCgxVSwgZXh0ZW50LndpZHRoID4+IG1pcCkpOworICAgICAgICBleHRlbnQuaGVpZ2h0ID0gKDAgPT0gZXh0ZW50LmhlaWdodCA/IDAgOiBzdGQ6Om1heCgxVSwgZXh0ZW50LmhlaWdodCA+PiBtaXApKTsKKyAgICAgICAgZXh0ZW50LmRlcHRoID0gKDAgPT0gZXh0ZW50LmRlcHRoID8gMCA6IHN0ZDo6bWF4KDFVLCBleHRlbnQuZGVwdGggPj4gbWlwKSk7CisgICAgfQorCisgICAgLy8gSW1hZ2UgYXJyYXlzIGhhdmUgYW4gZWZmZWN0aXZlIHogZXh0ZW50IHRoYXQgaXNuJ3QgZGltaW5pc2hlZCBieSBtaXAgbGV2ZWwKKyAgICBpZiAoVktfSU1BR0VfVFlQRV8zRCAhPSBpbWctPmNyZWF0ZUluZm8uaW1hZ2VUeXBlKSB7CisgICAgICAgIGV4dGVudC5kZXB0aCA9IGltZy0+Y3JlYXRlSW5mby5hcnJheUxheWVyczsKKyAgICB9CisKKyAgICByZXR1cm4gZXh0ZW50OworfQorCisvLyBUZXN0IGlmIHRoZSBleHRlbnQgYXJndW1lbnQgaGFzIGFsbCBkaW1lbnNpb25zIHNldCB0byAwLgorc3RhdGljIGlubGluZSBib29sIElzRXh0ZW50QWxsWmVyb2VzKGNvbnN0IFZrRXh0ZW50M0QgKmV4dGVudCkgeworICAgIHJldHVybiAoKGV4dGVudC0+d2lkdGggPT0gMCkgJiYgKGV4dGVudC0+aGVpZ2h0ID09IDApICYmIChleHRlbnQtPmRlcHRoID09IDApKTsKK30KKworLy8gVGVzdCBpZiB0aGUgZXh0ZW50IGFyZ3VtZW50IGhhcyBhbnkgZGltZW5zaW9ucyBzZXQgdG8gMC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBJc0V4dGVudFNpemVaZXJvKGNvbnN0IFZrRXh0ZW50M0QgKmV4dGVudCkgeworICAgIHJldHVybiAoKGV4dGVudC0+d2lkdGggPT0gMCkgfHwgKGV4dGVudC0+aGVpZ2h0ID09IDApIHx8IChleHRlbnQtPmRlcHRoID09IDApKTsKK30KKworLy8gUmV0dXJucyB0aGUgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkgZm9yIGEgc3BlY2lmaWMgaW1hZ2Ugc2NhbGVkIGJ5IGNvbXByZXNzZWQgYmxvY2sgc2l6ZSBpZiBuZWNlc3NhcnkuCitWa0V4dGVudDNEIENvcmVDaGVja3M6OkdldFNjYWxlZEl0Zyhjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlLCBjb25zdCBJTUFHRV9TVEFURSAqaW1nKSBjb25zdCB7CisgICAgLy8gRGVmYXVsdCB0byAoMCwgMCwgMCkgZ3JhbnVsYXJpdHkgaW4gY2FzZSB3ZSBjYW4ndCBmaW5kIHRoZSByZWFsIGdyYW51bGFyaXR5IGZvciB0aGUgcGh5c2ljYWwgZGV2aWNlLgorICAgIFZrRXh0ZW50M0QgZ3JhbnVsYXJpdHkgPSB7MCwgMCwgMH07CisgICAgYXV0byBwUG9vbCA9IGNiX25vZGUtPmNvbW1hbmRfcG9vbC5nZXQoKTsKKyAgICBpZiAocFBvb2wpIHsKKyAgICAgICAgZ3JhbnVsYXJpdHkgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKCktPnF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW3BQb29sLT5xdWV1ZUZhbWlseUluZGV4XS5taW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHk7CisgICAgICAgIGlmIChGb3JtYXRJc0NvbXByZXNzZWQoaW1nLT5jcmVhdGVJbmZvLmZvcm1hdCkgfHwgRm9ybWF0SXNTaW5nbGVQbGFuZV80MjIoaW1nLT5jcmVhdGVJbmZvLmZvcm1hdCkpIHsKKyAgICAgICAgICAgIGF1dG8gYmxvY2tfc2l6ZSA9IEZvcm1hdFRleGVsQmxvY2tFeHRlbnQoaW1nLT5jcmVhdGVJbmZvLmZvcm1hdCk7CisgICAgICAgICAgICBncmFudWxhcml0eS53aWR0aCAqPSBibG9ja19zaXplLndpZHRoOworICAgICAgICAgICAgZ3JhbnVsYXJpdHkuaGVpZ2h0ICo9IGJsb2NrX3NpemUuaGVpZ2h0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBncmFudWxhcml0eTsKK30KKworLy8gVGVzdCBlbGVtZW50cyBvZiBhIFZrRXh0ZW50M0Qgc3RydWN0dXJlIGFnYWluc3QgYWxpZ25tZW50IGNvbnN0cmFpbnRzIGNvbnRhaW5lZCBpbiBhbm90aGVyIFZrRXh0ZW50M0Qgc3RydWN0dXJlCitzdGF0aWMgaW5saW5lIGJvb2wgSXNFeHRlbnRBbGlnbmVkKGNvbnN0IFZrRXh0ZW50M0QgKmV4dGVudCwgY29uc3QgVmtFeHRlbnQzRCAqZ3JhbnVsYXJpdHkpIHsKKyAgICBib29sIHZhbGlkID0gdHJ1ZTsKKyAgICBpZiAoKFNhZmVNb2R1bG8oZXh0ZW50LT5kZXB0aCwgZ3JhbnVsYXJpdHktPmRlcHRoKSAhPSAwKSB8fCAoU2FmZU1vZHVsbyhleHRlbnQtPndpZHRoLCBncmFudWxhcml0eS0+d2lkdGgpICE9IDApIHx8CisgICAgICAgIChTYWZlTW9kdWxvKGV4dGVudC0+aGVpZ2h0LCBncmFudWxhcml0eS0+aGVpZ2h0KSAhPSAwKSkgeworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdmFsaWQ7Cit9CisKKy8vIENoZWNrIGVsZW1lbnRzIG9mIGEgVmtPZmZzZXQzRCBzdHJ1Y3R1cmUgYWdhaW5zdCBhIHF1ZXVlIGZhbWlseSdzIEltYWdlIFRyYW5zZmVyIEdyYW51bGFyaXR5IHZhbHVlcworYm9vbCBDb3JlQ2hlY2tzOjpDaGVja0l0Z09mZnNldChjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlLCBjb25zdCBWa09mZnNldDNEICpvZmZzZXQsIGNvbnN0IFZrRXh0ZW50M0QgKmdyYW51bGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBpLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqbWVtYmVyLCBjb25zdCBjaGFyICp2dWlkKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgVmtFeHRlbnQzRCBvZmZzZXRfZXh0ZW50ID0ge307CisgICAgb2Zmc2V0X2V4dGVudC53aWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhYnMob2Zmc2V0LT54KSk7CisgICAgb2Zmc2V0X2V4dGVudC5oZWlnaHQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWJzKG9mZnNldC0+eSkpOworICAgIG9mZnNldF9leHRlbnQuZGVwdGggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWJzKG9mZnNldC0+eikpOworICAgIGlmIChJc0V4dGVudEFsbFplcm9lcyhncmFudWxhcml0eSkpIHsKKyAgICAgICAgLy8gSWYgdGhlIHF1ZXVlIGZhbWlseSBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eSBpcyAoMCwgMCwgMCksIHRoZW4gdGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSAoMCwgMCwgMCkKKyAgICAgICAgaWYgKElzRXh0ZW50QWxsWmVyb2VzKCZvZmZzZXRfZXh0ZW50KSA9PSBmYWxzZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHBSZWdpb25bJWRdLiVzICh4PSVkLCB5PSVkLCB6PSVkKSBtdXN0IGJlICh4PTAsIHk9MCwgej0wKSB3aGVuIHRoZSBjb21tYW5kIGJ1ZmZlcidzIHF1ZXVlIGZhbWlseSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5IGlzICh3PTAsIGg9MCwgZD0wKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBpLCBtZW1iZXIsIG9mZnNldC0+eCwgb2Zmc2V0LT55LCBvZmZzZXQtPnopOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgdGhlIHF1ZXVlIGZhbWlseSBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eSBpcyBub3QgKDAsIDAsIDApLCB0aGVuIHRoZSBvZmZzZXQgZGltZW5zaW9ucyBtdXN0IGFsd2F5cyBiZSBldmVuCisgICAgICAgIC8vIGludGVnZXIgbXVsdGlwbGVzIG9mIHRoZSBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eS4KKyAgICAgICAgaWYgKElzRXh0ZW50QWxpZ25lZCgmb2Zmc2V0X2V4dGVudCwgZ3JhbnVsYXJpdHkpID09IGZhbHNlKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcFJlZ2lvblslZF0uJXMgKHg9JWQsIHk9JWQsIHo9JWQpIGRpbWVuc2lvbnMgbXVzdCBiZSBldmVuIGludGVnZXIgbXVsdGlwbGVzIG9mIHRoaXMgY29tbWFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcidzIHF1ZXVlIGZhbWlseSBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eSAodz0lZCwgaD0lZCwgZD0lZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgaSwgbWVtYmVyLCBvZmZzZXQtPngsIG9mZnNldC0+eSwgb2Zmc2V0LT56LCBncmFudWxhcml0eS0+d2lkdGgsIGdyYW51bGFyaXR5LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHktPmRlcHRoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gQ2hlY2sgZWxlbWVudHMgb2YgYSBWa0V4dGVudDNEIHN0cnVjdHVyZSBhZ2FpbnN0IGEgcXVldWUgZmFtaWx5J3MgSW1hZ2UgVHJhbnNmZXIgR3JhbnVsYXJpdHkgdmFsdWVzCitib29sIENvcmVDaGVja3M6OkNoZWNrSXRnRXh0ZW50KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IFZrRXh0ZW50M0QgKmV4dGVudCwgY29uc3QgVmtPZmZzZXQzRCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0V4dGVudDNEICpncmFudWxhcml0eSwgY29uc3QgVmtFeHRlbnQzRCAqc3VicmVzb3VyY2VfZXh0ZW50LCBjb25zdCBWa0ltYWdlVHlwZSBpbWFnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBpLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqbWVtYmVyLCBjb25zdCBjaGFyICp2dWlkKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKElzRXh0ZW50QWxsWmVyb2VzKGdyYW51bGFyaXR5KSkgeworICAgICAgICAvLyBJZiB0aGUgcXVldWUgZmFtaWx5IGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5IGlzICgwLCAwLCAwKSwgdGhlbiB0aGUgZXh0ZW50IG11c3QgYWx3YXlzIG1hdGNoIHRoZSBpbWFnZQorICAgICAgICAvLyBzdWJyZXNvdXJjZSBleHRlbnQuCisgICAgICAgIGlmIChJc0V4dGVudEVxdWFsKGV4dGVudCwgc3VicmVzb3VyY2VfZXh0ZW50KSA9PSBmYWxzZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHBSZWdpb25bJWRdLiVzICh3PSVkLCBoPSVkLCBkPSVkKSBtdXN0IG1hdGNoIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSBleHRlbnRzICh3PSVkLCBoPSVkLCBkPSVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoZW4gdGhlIGNvbW1hbmQgYnVmZmVyJ3MgcXVldWUgZmFtaWx5IGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5IGlzICh3PTAsIGg9MCwgZD0wKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBpLCBtZW1iZXIsIGV4dGVudC0+d2lkdGgsIGV4dGVudC0+aGVpZ2h0LCBleHRlbnQtPmRlcHRoLCBzdWJyZXNvdXJjZV9leHRlbnQtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlc291cmNlX2V4dGVudC0+aGVpZ2h0LCBzdWJyZXNvdXJjZV9leHRlbnQtPmRlcHRoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHRoZSBxdWV1ZSBmYW1pbHkgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkgaXMgbm90ICgwLCAwLCAwKSwgdGhlbiB0aGUgZXh0ZW50IGRpbWVuc2lvbnMgbXVzdCBhbHdheXMgYmUgZXZlbgorICAgICAgICAvLyBpbnRlZ2VyIG11bHRpcGxlcyBvZiB0aGUgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkgb3IgdGhlIG9mZnNldCArIGV4dGVudCBkaW1lbnNpb25zIG11c3QgYWx3YXlzIG1hdGNoIHRoZSBpbWFnZQorICAgICAgICAvLyBzdWJyZXNvdXJjZSBleHRlbnQgZGltZW5zaW9ucy4KKyAgICAgICAgVmtFeHRlbnQzRCBvZmZzZXRfZXh0ZW50X3N1bSA9IHt9OworICAgICAgICBvZmZzZXRfZXh0ZW50X3N1bS53aWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhYnMob2Zmc2V0LT54KSkgKyBleHRlbnQtPndpZHRoOworICAgICAgICBvZmZzZXRfZXh0ZW50X3N1bS5oZWlnaHQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWJzKG9mZnNldC0+eSkpICsgZXh0ZW50LT5oZWlnaHQ7CisgICAgICAgIG9mZnNldF9leHRlbnRfc3VtLmRlcHRoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFicyhvZmZzZXQtPnopKSArIGV4dGVudC0+ZGVwdGg7CisgICAgICAgIGJvb2wgeF9vayA9IHRydWU7CisgICAgICAgIGJvb2wgeV9vayA9IHRydWU7CisgICAgICAgIGJvb2wgel9vayA9IHRydWU7CisgICAgICAgIHN3aXRjaCAoaW1hZ2VfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9UWVBFXzNEOgorICAgICAgICAgICAgICAgIHpfb2sgPSAoKDAgPT0gU2FmZU1vZHVsbyhleHRlbnQtPmRlcHRoLCBncmFudWxhcml0eS0+ZGVwdGgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnJlc291cmNlX2V4dGVudC0+ZGVwdGggPT0gb2Zmc2V0X2V4dGVudF9zdW0uZGVwdGgpKTsKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8yRDoKKyAgICAgICAgICAgICAgICB5X29rID0gKCgwID09IFNhZmVNb2R1bG8oZXh0ZW50LT5oZWlnaHQsIGdyYW51bGFyaXR5LT5oZWlnaHQpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnJlc291cmNlX2V4dGVudC0+aGVpZ2h0ID09IG9mZnNldF9leHRlbnRfc3VtLmhlaWdodCkpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9UWVBFXzFEOgorICAgICAgICAgICAgICAgIHhfb2sgPSAoKDAgPT0gU2FmZU1vZHVsbyhleHRlbnQtPndpZHRoLCBncmFudWxhcml0eS0+d2lkdGgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnJlc291cmNlX2V4dGVudC0+d2lkdGggPT0gb2Zmc2V0X2V4dGVudF9zdW0ud2lkdGgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gVW5yZWNvZ25pemVkIG9yIG5ldyBJTUFHRV9UWVBFIGVudW1zIHdpbGwgYmUgY2F1Z2h0IGluIHBhcmFtZXRlcl92YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISh4X29rICYmIHlfb2sgJiYgel9vaykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwUmVnaW9uWyVkXS4lcyAodz0lZCwgaD0lZCwgZD0lZCkgZGltZW5zaW9ucyBtdXN0IGJlIGV2ZW4gaW50ZWdlciBtdWx0aXBsZXMgb2YgdGhpcyBjb21tYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyJ3MgcXVldWUgZmFtaWx5IGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5ICh3PSVkLCBoPSVkLCBkPSVkKSBvciBvZmZzZXQgKHg9JWQsIHk9JWQsIHo9JWQpICsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnQgKHc9JWQsIGg9JWQsIGQ9JWQpIG11c3QgbWF0Y2ggdGhlIGltYWdlIHN1YnJlc291cmNlIGV4dGVudHMgKHc9JWQsIGg9JWQsIGQ9JWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGksIG1lbWJlciwgZXh0ZW50LT53aWR0aCwgZXh0ZW50LT5oZWlnaHQsIGV4dGVudC0+ZGVwdGgsIGdyYW51bGFyaXR5LT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxhcml0eS0+aGVpZ2h0LCBncmFudWxhcml0eS0+ZGVwdGgsIG9mZnNldC0+eCwgb2Zmc2V0LT55LCBvZmZzZXQtPnosIGV4dGVudC0+d2lkdGgsIGV4dGVudC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudC0+ZGVwdGgsIHN1YnJlc291cmNlX2V4dGVudC0+d2lkdGgsIHN1YnJlc291cmNlX2V4dGVudC0+aGVpZ2h0LCBzdWJyZXNvdXJjZV9leHRlbnQtPmRlcHRoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUltYWdlTWlwTGV2ZWwoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgY29uc3QgSU1BR0VfU1RBVEUgKmltZywgdWludDMyX3QgbWlwX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaSwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKm1lbWJlciwgY29uc3QgY2hhciAqdnVpZCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChtaXBfbGV2ZWwgPj0gaW1nLT5jcmVhdGVJbmZvLm1pcExldmVscykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW4gJXMsIHBSZWdpb25zWyV1XS4lcy5taXBMZXZlbCBpcyAldSwgYnV0IHByb3ZpZGVkICVzIGhhcyAldSBtaXAgbGV2ZWxzLiIsIGZ1bmN0aW9uLCBpLCBtZW1iZXIsIG1pcF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1nLT5pbWFnZSkuY19zdHIoKSwgaW1nLT5jcmVhdGVJbmZvLm1pcExldmVscyk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlSW1hZ2VBcnJheUxheWVyUmFuZ2UoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgY29uc3QgSU1BR0VfU1RBVEUgKmltZywgY29uc3QgdWludDMyX3QgYmFzZV9sYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBsYXllcl9jb3VudCwgY29uc3QgdWludDMyX3QgaSwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVtYmVyLCBjb25zdCBjaGFyICp2dWlkKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGJhc2VfbGF5ZXIgPj0gaW1nLT5jcmVhdGVJbmZvLmFycmF5TGF5ZXJzIHx8IGxheWVyX2NvdW50ID4gaW1nLT5jcmVhdGVJbmZvLmFycmF5TGF5ZXJzIHx8CisgICAgICAgIChiYXNlX2xheWVyICsgbGF5ZXJfY291bnQpID4gaW1nLT5jcmVhdGVJbmZvLmFycmF5TGF5ZXJzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcywgcFJlZ2lvbnNbJXVdLiVzLmJhc2VBcnJheUxheWVyIGlzICV1IGFuZCAubGF5ZXJDb3VudCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXUsIGJ1dCBwcm92aWRlZCAlcyBoYXMgJXUgYXJyYXkgbGF5ZXJzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgaSwgbWVtYmVyLCBiYXNlX2xheWVyLCBsYXllcl9jb3VudCwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWctPmltYWdlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5jcmVhdGVJbmZvLmFycmF5TGF5ZXJzKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIENoZWNrIHZhbGlkIHVzYWdlIEltYWdlIFRyYW5zZmVyIEdyYW51bGFyaXR5IHJlcXVpcmVtZW50cyBmb3IgZWxlbWVudHMgb2YgYSBWa0J1ZmZlckltYWdlQ29weSBzdHJ1Y3R1cmUKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDb3B5QnVmZmVySW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5UmVxdWlyZW1lbnRzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSAqcmVnaW9uLCBjb25zdCB1aW50MzJfdCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKnZ1aWQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBWa0V4dGVudDNEIGdyYW51bGFyaXR5ID0gR2V0U2NhbGVkSXRnKGNiX25vZGUsIGltZyk7CisgICAgc2tpcCB8PSBDaGVja0l0Z09mZnNldChjYl9ub2RlLCAmcmVnaW9uLT5pbWFnZU9mZnNldCwgJmdyYW51bGFyaXR5LCBpLCBmdW5jdGlvbiwgImltYWdlT2Zmc2V0IiwgdnVpZCk7CisgICAgVmtFeHRlbnQzRCBzdWJyZXNvdXJjZV9leHRlbnQgPSBHZXRJbWFnZVN1YnJlc291cmNlRXh0ZW50KGltZywgJnJlZ2lvbi0+aW1hZ2VTdWJyZXNvdXJjZSk7CisgICAgc2tpcCB8PSBDaGVja0l0Z0V4dGVudChjYl9ub2RlLCAmcmVnaW9uLT5pbWFnZUV4dGVudCwgJnJlZ2lvbi0+aW1hZ2VPZmZzZXQsICZncmFudWxhcml0eSwgJnN1YnJlc291cmNlX2V4dGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+Y3JlYXRlSW5mby5pbWFnZVR5cGUsIGksIGZ1bmN0aW9uLCAiaW1hZ2VFeHRlbnQiLCB2dWlkKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gQ2hlY2sgdmFsaWQgdXNhZ2UgSW1hZ2UgVHJhbnNmZXIgR3JhbnVsYXJpdHkgcmVxdWlyZW1lbnRzIGZvciBlbGVtZW50cyBvZiBhIFZrSW1hZ2VDb3B5IHN0cnVjdHVyZQorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNvcHlJbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHlSZXF1aXJlbWVudHMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgY29uc3QgSU1BR0VfU1RBVEUgKnNyY19pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTUFHRV9TVEFURSAqZHN0X2ltZywgY29uc3QgVmtJbWFnZUNvcHkgKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGksIGNvbnN0IGNoYXIgKmZ1bmN0aW9uKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gU291cmNlIGltYWdlIGNoZWNrcworICAgIFZrRXh0ZW50M0QgZ3JhbnVsYXJpdHkgPSBHZXRTY2FsZWRJdGcoY2Jfbm9kZSwgc3JjX2ltZyk7CisgICAgc2tpcCB8PQorICAgICAgICBDaGVja0l0Z09mZnNldChjYl9ub2RlLCAmcmVnaW9uLT5zcmNPZmZzZXQsICZncmFudWxhcml0eSwgaSwgZnVuY3Rpb24sICJzcmNPZmZzZXQiLCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNPZmZzZXQtMDE3ODMiKTsKKyAgICBWa0V4dGVudDNEIHN1YnJlc291cmNlX2V4dGVudCA9IEdldEltYWdlU3VicmVzb3VyY2VFeHRlbnQoc3JjX2ltZywgJnJlZ2lvbi0+c3JjU3VicmVzb3VyY2UpOworICAgIGNvbnN0IFZrRXh0ZW50M0QgZXh0ZW50ID0gcmVnaW9uLT5leHRlbnQ7CisgICAgc2tpcCB8PSBDaGVja0l0Z0V4dGVudChjYl9ub2RlLCAmZXh0ZW50LCAmcmVnaW9uLT5zcmNPZmZzZXQsICZncmFudWxhcml0eSwgJnN1YnJlc291cmNlX2V4dGVudCwgc3JjX2ltZy0+Y3JlYXRlSW5mby5pbWFnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBmdW5jdGlvbiwgImV4dGVudCIsICJWVUlELXZrQ21kQ29weUltYWdlLXNyY09mZnNldC0wMTc4MyIpOworCisgICAgLy8gRGVzdGluYXRpb24gaW1hZ2UgY2hlY2tzCisgICAgZ3JhbnVsYXJpdHkgPSBHZXRTY2FsZWRJdGcoY2Jfbm9kZSwgZHN0X2ltZyk7CisgICAgc2tpcCB8PQorICAgICAgICBDaGVja0l0Z09mZnNldChjYl9ub2RlLCAmcmVnaW9uLT5kc3RPZmZzZXQsICZncmFudWxhcml0eSwgaSwgZnVuY3Rpb24sICJkc3RPZmZzZXQiLCAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RPZmZzZXQtMDE3ODQiKTsKKyAgICAvLyBBZGp1c3QgZGVzdCBleHRlbnQsIGlmIG5lY2Vzc2FyeQorICAgIGNvbnN0IFZrRXh0ZW50M0QgZGVzdF9lZmZlY3RpdmVfZXh0ZW50ID0KKyAgICAgICAgR2V0QWRqdXN0ZWREZXN0SW1hZ2VFeHRlbnQoc3JjX2ltZy0+Y3JlYXRlSW5mby5mb3JtYXQsIGRzdF9pbWctPmNyZWF0ZUluZm8uZm9ybWF0LCBleHRlbnQpOworICAgIHN1YnJlc291cmNlX2V4dGVudCA9IEdldEltYWdlU3VicmVzb3VyY2VFeHRlbnQoZHN0X2ltZywgJnJlZ2lvbi0+ZHN0U3VicmVzb3VyY2UpOworICAgIHNraXAgfD0gQ2hlY2tJdGdFeHRlbnQoY2Jfbm9kZSwgJmRlc3RfZWZmZWN0aXZlX2V4dGVudCwgJnJlZ2lvbi0+ZHN0T2Zmc2V0LCAmZ3JhbnVsYXJpdHksICZzdWJyZXNvdXJjZV9leHRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfaW1nLT5jcmVhdGVJbmZvLmltYWdlVHlwZSwgaSwgZnVuY3Rpb24sICJleHRlbnQiLCAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RPZmZzZXQtMDE3ODQiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gVmFsaWRhdGUgY29udGVudHMgb2YgYSBWa0ltYWdlQ29weSBzdHJ1Y3QKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbWFnZUNvcHlEYXRhKGNvbnN0IHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSAqaWNfcmVnaW9ucywgY29uc3QgSU1BR0VfU1RBVEUgKnNyY19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElNQUdFX1NUQVRFICpkc3Rfc3RhdGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VDb3B5IHJlZ2lvbiA9IGljX3JlZ2lvbnNbaV07CisKKyAgICAgICAgLy8gRm9yIGNvbXA8LT51bmNvbXAgY29waWVzLCB0aGUgY29weSBleHRlbnQgZm9yIHRoZSBkZXN0IGltYWdlIG11c3QgYmUgYWRqdXN0ZWQKKyAgICAgICAgY29uc3QgVmtFeHRlbnQzRCBzcmNfY29weV9leHRlbnQgPSByZWdpb24uZXh0ZW50OworICAgICAgICBjb25zdCBWa0V4dGVudDNEIGRzdF9jb3B5X2V4dGVudCA9CisgICAgICAgICAgICBHZXRBZGp1c3RlZERlc3RJbWFnZUV4dGVudChzcmNfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0LCBkc3Rfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0LCByZWdpb24uZXh0ZW50KTsKKworICAgICAgICBib29sIHNsaWNlX292ZXJyaWRlID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IGRlcHRoX3NsaWNlcyA9IDA7CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBjb3B5aW5nIGJldHdlZW4gYSAxRC8yRCBhcnJheSBhbmQgYSAzRCBpbWFnZQorICAgICAgICAvLyBUQkQ6IFRoaXMgc2VlbXMgbGlrZSB0aGUgb25seSB3YXkgdG8gcmVjb25jaWxlIDMgbXV0dWFsbHktZXhjbHVzaXZlIFZVIGNoZWNrcyBmb3IgMkQvM0QgY29waWVzLiBIZWFkcyB1cC4KKyAgICAgICAgaWYgKChWS19JTUFHRV9UWVBFXzNEID09IHNyY19zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUpICYmIChWS19JTUFHRV9UWVBFXzNEICE9IGRzdF9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUpKSB7CisgICAgICAgICAgICBkZXB0aF9zbGljZXMgPSByZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudDsgIC8vIFNsaWNlIGNvdW50IGZyb20gMkQgc3VicmVzb3VyY2UKKyAgICAgICAgICAgIHNsaWNlX292ZXJyaWRlID0gKGRlcHRoX3NsaWNlcyAhPSAxKTsKKyAgICAgICAgfSBlbHNlIGlmICgoVktfSU1BR0VfVFlQRV8zRCA9PSBkc3Rfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlKSAmJiAoVktfSU1BR0VfVFlQRV8zRCAhPSBzcmNfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlKSkgeworICAgICAgICAgICAgZGVwdGhfc2xpY2VzID0gcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQ7ICAvLyBTbGljZSBjb3VudCBmcm9tIDJEIHN1YnJlc291cmNlCisgICAgICAgICAgICBzbGljZV9vdmVycmlkZSA9IChkZXB0aF9zbGljZXMgIT0gMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEbyBhbGwgY2hlY2tzIG9uIHNvdXJjZSBpbWFnZQorICAgICAgICAvLworICAgICAgICBpZiAoc3JjX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzFEKSB7CisgICAgICAgICAgICBpZiAoKDAgIT0gcmVnaW9uLnNyY09mZnNldC55KSB8fCAoMSAhPSBzcmNfY29weV9leHRlbnQuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNyY19zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMDE0NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpOiBwUmVnaW9uWyVkXSBzcmNPZmZzZXQueSBpcyAlZCBhbmQgZXh0ZW50LmhlaWdodCBpcyAlZC4gRm9yIDFEIGltYWdlcyB0aGVzZSBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIDAgYW5kIDEsIHJlc3BlY3RpdmVseS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZWdpb24uc3JjT2Zmc2V0LnksIHNyY19jb3B5X2V4dGVudC5oZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTc4NQorICAgICAgICBpZiAoKHNyY19zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8xRCkgJiYgKCgwICE9IHJlZ2lvbi5zcmNPZmZzZXQueikgfHwgKDEgIT0gc3JjX2NvcHlfZXh0ZW50LmRlcHRoKSkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc3JjX3N0YXRlLT5pbWFnZSksICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzg1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogcFJlZ2lvblslZF0gc3JjT2Zmc2V0LnogaXMgJWQgYW5kIGV4dGVudC5kZXB0aCBpcyAlZC4gRm9yIDFEIGltYWdlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZXNlIG11c3QgYmUgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVnaW9uLnNyY09mZnNldC56LCBzcmNfY29weV9leHRlbnQuZGVwdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTc4NworICAgICAgICBpZiAoKHNyY19zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8yRCkgJiYgKDAgIT0gcmVnaW9uLnNyY09mZnNldC56KSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzcmNfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3ODciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpOiBwUmVnaW9uWyVkXSBzcmNPZmZzZXQueiBpcyAlZC4gRm9yIDJEIGltYWdlcyB0aGUgei1vZmZzZXQgbXVzdCBiZSAwLiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uLnNyY09mZnNldC56KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UxKSB7CisgICAgICAgICAgICBpZiAoc3JjX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzNEKSB7CisgICAgICAgICAgICAgICAgaWYgKCgwICE9IHJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcikgfHwgKDEgIT0gcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzcmNfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDAxNDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogcFJlZ2lvblslZF0gc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgaXMgJWQgYW5kIHNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgJWQuIEZvciBWS19JTUFHRV9UWVBFXzNEIGltYWdlcyB0aGVzZSBtdXN0IGJlIDAgYW5kIDEsIHJlc3BlY3RpdmVseS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIsIHJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAvLyBQcmUgbWFpbnQgMQorICAgICAgICAgICAgaWYgKHNyY19zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8zRCB8fCBkc3Rfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfM0QpIHsKKyAgICAgICAgICAgICAgICBpZiAoKDAgIT0gcmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyKSB8fCAoMSAhPSByZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNyY19zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMDE0MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogcFJlZ2lvblslZF0gc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgaXMgJWQgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmNTdWJyZXNvdXJjZS5sYXllckNvdW50IGlzICVkLiBGb3IgY29waWVzIHdpdGggZWl0aGVyIHNvdXJjZSBvciBkZXN0IG9mIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX1RZUEVfM0QsIHRoZXNlIG11c3QgYmUgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIsIHJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTb3VyY2UgY2hlY2tzIHRoYXQgYXBwbHkgb25seSB0byBjb21wcmVzc2VkIGltYWdlcyAob3IgdG8gXzQyMiBpbWFnZXMgaWYgeWNiY3IgZW5hYmxlZCkKKyAgICAgICAgYm9vbCBleHRfeWNiY3IgPSBJc0V4dEVuYWJsZWQoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbik7CisgICAgICAgIGlmIChGb3JtYXRJc0NvbXByZXNzZWQoc3JjX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkgfHwKKyAgICAgICAgICAgIChleHRfeWNiY3IgJiYgRm9ybWF0SXNTaW5nbGVQbGFuZV80MjIoc3JjX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkpKSB7CisgICAgICAgICAgICBjb25zdCBWa0V4dGVudDNEIGJsb2NrX3NpemUgPSBGb3JtYXRUZXhlbEJsb2NrRXh0ZW50KHNyY19zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpOworICAgICAgICAgICAgLy8gIGltYWdlIG9mZnNldHMgbXVzdCBiZSBtdWx0aXBsZXMgb2YgYmxvY2sgZGltZW5zaW9ucworICAgICAgICAgICAgaWYgKChTYWZlTW9kdWxvKHJlZ2lvbi5zcmNPZmZzZXQueCwgYmxvY2tfc2l6ZS53aWR0aCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoU2FmZU1vZHVsbyhyZWdpb24uc3JjT2Zmc2V0LnksIGJsb2NrX3NpemUuaGVpZ2h0KSAhPSAwKSB8fAorICAgICAgICAgICAgICAgIChTYWZlTW9kdWxvKHJlZ2lvbi5zcmNPZmZzZXQueiwgYmxvY2tfc2l6ZS5kZXB0aCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2dWlkID0gZXh0X3ljYmNyID8gIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3MjciIDogIlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTU3IjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzcmNfc3RhdGUtPmltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bJWRdIHNyY09mZnNldCAoJWQsICVkKSBtdXN0IGJlIG11bHRpcGxlcyBvZiB0aGUgY29tcHJlc3NlZCBpbWFnZSdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleGVsIHdpZHRoICYgaGVpZ2h0ICglZCwgJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlZ2lvbi5zcmNPZmZzZXQueCwgcmVnaW9uLnNyY09mZnNldC55LCBibG9ja19zaXplLndpZHRoLCBibG9ja19zaXplLmhlaWdodCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IFZrRXh0ZW50M0QgbWlwX2V4dGVudCA9IEdldEltYWdlU3VicmVzb3VyY2VFeHRlbnQoc3JjX3N0YXRlLCAmKHJlZ2lvbi5zcmNTdWJyZXNvdXJjZSkpOworICAgICAgICAgICAgaWYgKChTYWZlTW9kdWxvKHNyY19jb3B5X2V4dGVudC53aWR0aCwgYmxvY2tfc2l6ZS53aWR0aCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAoc3JjX2NvcHlfZXh0ZW50LndpZHRoICsgcmVnaW9uLnNyY09mZnNldC54ICE9IG1pcF9leHRlbnQud2lkdGgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdnVpZCA9IGV4dF95Y2JjciA/ICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzI4IiA6ICJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE1OCI7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzcmNfc3RhdGUtPmltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogcFJlZ2lvblslZF0gZXh0ZW50IHdpZHRoICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleHR1cmUgYmxvY2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCAoJWQpLCBvciB3aGVuIGFkZGVkIHRvIHNyY09mZnNldC54ICglZCkgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGggKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19jb3B5X2V4dGVudC53aWR0aCwgYmxvY2tfc2l6ZS53aWR0aCwgcmVnaW9uLnNyY09mZnNldC54LCBtaXBfZXh0ZW50LndpZHRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXh0ZW50IGhlaWdodCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYmxvY2sgaGVpZ2h0LCBvciBleHRlbnQrb2Zmc2V0IGhlaWdodCBtdXN0IGVxdWFsIHN1YnJlc291cmNlIGhlaWdodAorICAgICAgICAgICAgaWYgKChTYWZlTW9kdWxvKHNyY19jb3B5X2V4dGVudC5oZWlnaHQsIGJsb2NrX3NpemUuaGVpZ2h0KSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIChzcmNfY29weV9leHRlbnQuaGVpZ2h0ICsgcmVnaW9uLnNyY09mZnNldC55ICE9IG1pcF9leHRlbnQuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZ1aWQgPSBleHRfeWNiY3IgPyAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTcyOSIgOiAiVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNTkiOworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc3JjX3N0YXRlLT5pbWFnZSksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bJWRdIGV4dGVudCBoZWlnaHQgKCVkKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4dHVyZSBibG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodCAoJWQpLCBvciB3aGVuIGFkZGVkIHRvIHNyY09mZnNldC55ICglZCkgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzcmNfY29weV9leHRlbnQuaGVpZ2h0LCBibG9ja19zaXplLmhlaWdodCwgcmVnaW9uLnNyY09mZnNldC55LCBtaXBfZXh0ZW50LmhlaWdodCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEV4dGVudCBkZXB0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYmxvY2sgZGVwdGgsIG9yIGV4dGVudCtvZmZzZXQgZGVwdGggbXVzdCBlcXVhbCBzdWJyZXNvdXJjZSBkZXB0aAorICAgICAgICAgICAgdWludDMyX3QgY29weV9kZXB0aCA9IChzbGljZV9vdmVycmlkZSA/IGRlcHRoX3NsaWNlcyA6IHNyY19jb3B5X2V4dGVudC5kZXB0aCk7CisgICAgICAgICAgICBpZiAoKFNhZmVNb2R1bG8oY29weV9kZXB0aCwgYmxvY2tfc2l6ZS5kZXB0aCkgIT0gMCkgJiYgKGNvcHlfZGVwdGggKyByZWdpb24uc3JjT2Zmc2V0LnogIT0gbWlwX2V4dGVudC5kZXB0aCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2dWlkID0gZXh0X3ljYmNyID8gIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3MzAiIDogIlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTYwIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNyY19zdGF0ZS0+aW1hZ2UpLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpOiBwUmVnaW9uWyVkXSBleHRlbnQgd2lkdGggKCVkKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4dHVyZSBibG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcHRoICglZCksIG9yIHdoZW4gYWRkZWQgdG8gc3JjT2Zmc2V0LnogKCVkKSBtdXN0IGVxdWFsIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSBkZXB0aCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2NvcHlfZXh0ZW50LmRlcHRoLCBibG9ja19zaXplLmRlcHRoLCByZWdpb24uc3JjT2Zmc2V0LnosIG1pcF9leHRlbnQuZGVwdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAvLyBDb21wcmVzc2VkCisKKyAgICAgICAgLy8gRG8gYWxsIGNoZWNrcyBvbiBkZXN0IGltYWdlCisgICAgICAgIC8vCisgICAgICAgIGlmIChkc3Rfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfMUQpIHsKKyAgICAgICAgICAgIGlmICgoMCAhPSByZWdpb24uZHN0T2Zmc2V0LnkpIHx8ICgxICE9IGRzdF9jb3B5X2V4dGVudC5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZHN0X3N0YXRlLT5pbWFnZSksICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAwMTUyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bJWRdIGRzdE9mZnNldC55IGlzICVkIGFuZCBkc3RfY29weV9leHRlbnQuaGVpZ2h0IGlzICVkLiBGb3IgMUQgaW1hZ2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZXNlIG11c3QgYmUgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlZ2lvbi5kc3RPZmZzZXQueSwgZHN0X2NvcHlfZXh0ZW50LmhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzg2CisgICAgICAgIGlmICgoZHN0X3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzFEKSAmJiAoKDAgIT0gcmVnaW9uLmRzdE9mZnNldC56KSB8fCAoMSAhPSBkc3RfY29weV9leHRlbnQuZGVwdGgpKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3Rfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3ODYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpOiBwUmVnaW9uWyVkXSBkc3RPZmZzZXQueiBpcyAlZCBhbmQgZXh0ZW50LmRlcHRoIGlzICVkLiBGb3IgMUQgaW1hZ2VzIHRoZXNlIG11c3QgYmUgMCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCAxLCByZXNwZWN0aXZlbHkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZWdpb24uZHN0T2Zmc2V0LnosIGRzdF9jb3B5X2V4dGVudC5kZXB0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzg4CisgICAgICAgIGlmICgoZHN0X3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzJEKSAmJiAoMCAhPSByZWdpb24uZHN0T2Zmc2V0LnopKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRzdF9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTc4OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bJWRdIGRzdE9mZnNldC56IGlzICVkLiBGb3IgMkQgaW1hZ2VzIHRoZSB6LW9mZnNldCBtdXN0IGJlIDAuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24uZHN0T2Zmc2V0LnopOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRzdF9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8zRCkgeworICAgICAgICAgICAgaWYgKCgwICE9IHJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcikgfHwgKDEgIT0gcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZHN0X3N0YXRlLT5pbWFnZSksICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTQxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bJWRdIGRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyIGlzICVkIGFuZCBkc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzICVkLiBGb3IgVktfSU1BR0VfVFlQRV8zRCBpbWFnZXMgdGhlc2UgbXVzdCBiZSAwIGFuZCAxLCByZXNwZWN0aXZlbHkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyLCByZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVlUwMTE5OSBjaGFuZ2VkIHdpdGggbW50MQorICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX21haW50ZW5hbmNlMSkgeworICAgICAgICAgICAgaWYgKGRzdF9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8zRCkgeworICAgICAgICAgICAgICAgIGlmICgoMCAhPSByZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIpIHx8ICgxICE9IHJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50KSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZHN0X3N0YXRlLT5pbWFnZSksICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTQxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bJWRdIGRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyIGlzICVkIGFuZCBkc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzICVkLiBGb3IgVktfSU1BR0VfVFlQRV8zRCBpbWFnZXMgdGhlc2UgbXVzdCBiZSAwIGFuZCAxLCByZXNwZWN0aXZlbHkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyLCByZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgLy8gUHJlIG1haW50IDEKKyAgICAgICAgICAgIGlmIChzcmNfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfM0QgfHwgZHN0X3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzNEKSB7CisgICAgICAgICAgICAgICAgaWYgKCgwICE9IHJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcikgfHwgKDEgIT0gcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3Rfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDAxNDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bJWRdIGRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyIGlzICVkIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCBpcyAlZC4gRm9yIGNvcGllcyB3aXRoIGVpdGhlciBzb3VyY2Ugb3IgZGVzdCBvZiB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9UWVBFXzNELCB0aGVzZSBtdXN0IGJlIDAgYW5kIDEsIHJlc3BlY3RpdmVseS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyLCByZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRGVzdCBjaGVja3MgdGhhdCBhcHBseSBvbmx5IHRvIGNvbXByZXNzZWQgaW1hZ2VzIChvciB0byBfNDIyIGltYWdlcyBpZiB5Y2JjciBlbmFibGVkKQorICAgICAgICBpZiAoRm9ybWF0SXNDb21wcmVzc2VkKGRzdF9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpIHx8CisgICAgICAgICAgICAoZXh0X3ljYmNyICYmIEZvcm1hdElzU2luZ2xlUGxhbmVfNDIyKGRzdF9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSkgeworICAgICAgICAgICAgY29uc3QgVmtFeHRlbnQzRCBibG9ja19zaXplID0gRm9ybWF0VGV4ZWxCbG9ja0V4dGVudChkc3Rfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KTsKKworICAgICAgICAgICAgLy8gIGltYWdlIG9mZnNldHMgbXVzdCBiZSBtdWx0aXBsZXMgb2YgYmxvY2sgZGltZW5zaW9ucworICAgICAgICAgICAgaWYgKChTYWZlTW9kdWxvKHJlZ2lvbi5kc3RPZmZzZXQueCwgYmxvY2tfc2l6ZS53aWR0aCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoU2FmZU1vZHVsbyhyZWdpb24uZHN0T2Zmc2V0LnksIGJsb2NrX3NpemUuaGVpZ2h0KSAhPSAwKSB8fAorICAgICAgICAgICAgICAgIChTYWZlTW9kdWxvKHJlZ2lvbi5kc3RPZmZzZXQueiwgYmxvY2tfc2l6ZS5kZXB0aCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2dWlkID0gZXh0X3ljYmNyID8gIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzEiIDogIlZVSUQtVmtJbWFnZUNvcHktZHN0T2Zmc2V0LTAwMTYyIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3Rfc3RhdGUtPmltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bJWRdIGRzdE9mZnNldCAoJWQsICVkKSBtdXN0IGJlIG11bHRpcGxlcyBvZiB0aGUgY29tcHJlc3NlZCBpbWFnZSdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleGVsIHdpZHRoICYgaGVpZ2h0ICglZCwgJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlZ2lvbi5kc3RPZmZzZXQueCwgcmVnaW9uLmRzdE9mZnNldC55LCBibG9ja19zaXplLndpZHRoLCBibG9ja19zaXplLmhlaWdodCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IFZrRXh0ZW50M0QgbWlwX2V4dGVudCA9IEdldEltYWdlU3VicmVzb3VyY2VFeHRlbnQoZHN0X3N0YXRlLCAmKHJlZ2lvbi5kc3RTdWJyZXNvdXJjZSkpOworICAgICAgICAgICAgaWYgKChTYWZlTW9kdWxvKGRzdF9jb3B5X2V4dGVudC53aWR0aCwgYmxvY2tfc2l6ZS53aWR0aCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAoZHN0X2NvcHlfZXh0ZW50LndpZHRoICsgcmVnaW9uLmRzdE9mZnNldC54ICE9IG1pcF9leHRlbnQud2lkdGgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdnVpZCA9IGV4dF95Y2JjciA/ICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzMyIiA6ICJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2MyI7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3Rfc3RhdGUtPmltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogcFJlZ2lvblslZF0gZHN0X2NvcHlfZXh0ZW50IHdpZHRoICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleHR1cmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibG9jayB3aWR0aCAoJWQpLCBvciB3aGVuIGFkZGVkIHRvIGRzdE9mZnNldC54ICglZCkgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGggKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGRzdF9jb3B5X2V4dGVudC53aWR0aCwgYmxvY2tfc2l6ZS53aWR0aCwgcmVnaW9uLmRzdE9mZnNldC54LCBtaXBfZXh0ZW50LndpZHRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXh0ZW50IGhlaWdodCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYmxvY2sgaGVpZ2h0LCBvciBkc3RfY29weV9leHRlbnQrb2Zmc2V0IGhlaWdodCBtdXN0IGVxdWFsIHN1YnJlc291cmNlIGhlaWdodAorICAgICAgICAgICAgaWYgKChTYWZlTW9kdWxvKGRzdF9jb3B5X2V4dGVudC5oZWlnaHQsIGJsb2NrX3NpemUuaGVpZ2h0KSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIChkc3RfY29weV9leHRlbnQuaGVpZ2h0ICsgcmVnaW9uLmRzdE9mZnNldC55ICE9IG1pcF9leHRlbnQuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZ1aWQgPSBleHRfeWNiY3IgPyAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTczMyIgOiAiVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNjQiOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRzdF9zdGF0ZS0+aW1hZ2UpLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogcFJlZ2lvblslZF0gZHN0X2NvcHlfZXh0ZW50IGhlaWdodCAoJWQpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0dXJlIGJsb2NrIGhlaWdodCAoJWQpLCBvciB3aGVuIGFkZGVkIHRvIGRzdE9mZnNldC55ICglZCkgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZHN0X2NvcHlfZXh0ZW50LmhlaWdodCwgYmxvY2tfc2l6ZS5oZWlnaHQsIHJlZ2lvbi5kc3RPZmZzZXQueSwgbWlwX2V4dGVudC5oZWlnaHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFeHRlbnQgZGVwdGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIGJsb2NrIGRlcHRoLCBvciBkc3RfY29weV9leHRlbnQrb2Zmc2V0IGRlcHRoIG11c3QgZXF1YWwgc3VicmVzb3VyY2UgZGVwdGgKKyAgICAgICAgICAgIHVpbnQzMl90IGNvcHlfZGVwdGggPSAoc2xpY2Vfb3ZlcnJpZGUgPyBkZXB0aF9zbGljZXMgOiBkc3RfY29weV9leHRlbnQuZGVwdGgpOworICAgICAgICAgICAgaWYgKChTYWZlTW9kdWxvKGNvcHlfZGVwdGgsIGJsb2NrX3NpemUuZGVwdGgpICE9IDApICYmIChjb3B5X2RlcHRoICsgcmVnaW9uLmRzdE9mZnNldC56ICE9IG1pcF9leHRlbnQuZGVwdGgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdnVpZCA9IGV4dF95Y2JjciA/ICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzM0IiA6ICJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2NSI7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3Rfc3RhdGUtPmltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogcFJlZ2lvblslZF0gZHN0X2NvcHlfZXh0ZW50IHdpZHRoICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleHR1cmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibG9jayBkZXB0aCAoJWQpLCBvciB3aGVuIGFkZGVkIHRvIGRzdE9mZnNldC56ICglZCkgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGggKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGRzdF9jb3B5X2V4dGVudC5kZXB0aCwgYmxvY2tfc2l6ZS5kZXB0aCwgcmVnaW9uLmRzdE9mZnNldC56LCBtaXBfZXh0ZW50LmRlcHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgLy8gQ29tcHJlc3NlZAorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gdmtDbWRDb3B5SW1hZ2UgY2hlY2tzIHRoYXQgb25seSBhcHBseSBpZiB0aGUgbXVsdGlwbGFuZSBleHRlbnNpb24gaXMgZW5hYmxlZAorYm9vbCBDb3JlQ2hlY2tzOjpDb3B5SW1hZ2VNdWx0aXBsYW5lVmFsaWRhdGlvbihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIsIGNvbnN0IElNQUdFX1NUQVRFICpzcmNfaW1hZ2Vfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElNQUdFX1NUQVRFICpkc3RfaW1hZ2Vfc3RhdGUsIGNvbnN0IFZrSW1hZ2VDb3B5IHJlZ2lvbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgLy8gTmVpdGhlciBpbWFnZSBpcyBtdWx0aXBsYW5lCisgICAgaWYgKCghRm9ybWF0SXNNdWx0aXBsYW5lKHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSAmJiAoIUZvcm1hdElzTXVsdGlwbGFuZShkc3RfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KSkpIHsKKyAgICAgICAgLy8gSWYgbmVpdGhlciBpbWFnZSBpcyBtdWx0aS1wbGFuZSB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3JjIGFuZCBkc3QgbXVzdCBtYXRjaAorICAgICAgICBpZiAocmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgIT0gcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2spIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgInZrQ21kQ29weUltYWdlKCk6IENvcHkgYmV0d2VlbiBub24tbXVsdGlwbGFuZSBpbWFnZXMgd2l0aCBkaWZmZXJpbmcgYXNwZWN0TWFza3MgKCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgIDw8IHJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrIDw8ICIgYW5kIDB4IiA8PCByZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA8PCAiICkiOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNTUxIiwgIiVzLiIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU291cmNlIGltYWdlIG11bHRpcGxhbmUgY2hlY2tzCisgICAgICAgIHVpbnQzMl90IHBsYW5lcyA9IEZvcm1hdFBsYW5lQ291bnQoc3JjX2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCk7CisgICAgICAgIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3QgPSByZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzazsKKyAgICAgICAgaWYgKCgyID09IHBsYW5lcykgJiYgKGFzcGVjdCAhPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVRfS0hSKSAmJiAoYXNwZWN0ICE9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVF9LSFIpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8ICJ2a0NtZENvcHlJbWFnZSgpOiBTb3VyY2UgaW1hZ2UgYXNwZWN0IG1hc2sgKDB4IiA8PCBzdGQ6OmhleCA8PCBhc3BlY3QgPDwgIikgaXMgaW52YWxpZCBmb3IgMi1wbGFuZSBmb3JtYXQiOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNTUyIiwgIiVzLiIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGlmICgoMyA9PSBwbGFuZXMpICYmIChhc3BlY3QgIT0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUikgJiYgKGFzcGVjdCAhPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVRfS0hSKSAmJgorICAgICAgICAgICAgKGFzcGVjdCAhPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCAidmtDbWRDb3B5SW1hZ2UoKTogU291cmNlIGltYWdlIGFzcGVjdCBtYXNrICgweCIgPDwgc3RkOjpoZXggPDwgYXNwZWN0IDw8ICIpIGlzIGludmFsaWQgZm9yIDMtcGxhbmUgZm9ybWF0IjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTU1MyIsICIlcy4iLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTaW5nbGUtcGxhbmUgdG8gbXVsdGktcGxhbmUKKyAgICAgICAgaWYgKCghRm9ybWF0SXNNdWx0aXBsYW5lKHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSAmJiAoRm9ybWF0SXNNdWx0aXBsYW5lKGRzdF9pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSAmJgorICAgICAgICAgICAgKFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgIT0gYXNwZWN0KSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCAidmtDbWRDb3B5SW1hZ2UoKTogU291cmNlIGltYWdlIGFzcGVjdCBtYXNrICgweCIgPDwgc3RkOjpoZXggPDwgYXNwZWN0IDw8ICIpIGlzIG5vdCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTU1NyIsICIlcy4iLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlc3QgaW1hZ2UgbXVsdGlwbGFuZSBjaGVja3MKKyAgICAgICAgcGxhbmVzID0gRm9ybWF0UGxhbmVDb3VudChkc3RfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KTsKKyAgICAgICAgYXNwZWN0ID0gcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2s7CisgICAgICAgIGlmICgoMiA9PSBwbGFuZXMpICYmIChhc3BlY3QgIT0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUikgJiYgKGFzcGVjdCAhPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVRfS0hSKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCAidmtDbWRDb3B5SW1hZ2UoKTogRGVzdCBpbWFnZSBhc3BlY3QgbWFzayAoMHgiIDw8IHN0ZDo6aGV4IDw8IGFzcGVjdCA8PCAiKSBpcyBpbnZhbGlkIGZvciAyLXBsYW5lIGZvcm1hdCI7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKSwgIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE1NTQiLCAiJXMuIiwgc3Muc3RyKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgzID09IHBsYW5lcykgJiYgKGFzcGVjdCAhPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVRfS0hSKSAmJiAoYXNwZWN0ICE9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVF9LSFIpICYmCisgICAgICAgICAgICAoYXNwZWN0ICE9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVF9LSFIpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8ICJ2a0NtZENvcHlJbWFnZSgpOiBEZXN0IGltYWdlIGFzcGVjdCBtYXNrICgweCIgPDwgc3RkOjpoZXggPDwgYXNwZWN0IDw8ICIpIGlzIGludmFsaWQgZm9yIDMtcGxhbmUgZm9ybWF0IjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTU1NSIsICIlcy4iLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBNdWx0aS1wbGFuZSB0byBzaW5nbGUtcGxhbmUKKyAgICAgICAgaWYgKChGb3JtYXRJc011bHRpcGxhbmUoc3JjX2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkpICYmICghRm9ybWF0SXNNdWx0aXBsYW5lKGRzdF9pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSAmJgorICAgICAgICAgICAgKFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgIT0gYXNwZWN0KSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCAidmtDbWRDb3B5SW1hZ2UoKTogRGVzdCBpbWFnZSBhc3BlY3QgbWFzayAoMHgiIDw8IHN0ZDo6aGV4IDw8IGFzcGVjdCA8PCAiKSBpcyBub3QgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCI7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKSwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE1NTYiLCAiJXMuIiwgc3Muc3RyKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VDb3B5ICpwUmVnaW9ucykgY29uc3QgeworICAgIGNvbnN0IGF1dG8gKmNiX25vZGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNvbnN0IGF1dG8gKnNyY19pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoc3JjSW1hZ2UpOworICAgIGNvbnN0IGF1dG8gKmRzdF9pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoZHN0SW1hZ2UpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgc2tpcCA9IFZhbGlkYXRlSW1hZ2VDb3B5RGF0YShyZWdpb25Db3VudCwgcFJlZ2lvbnMsIHNyY19pbWFnZV9zdGF0ZSwgZHN0X2ltYWdlX3N0YXRlKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlciA9IGNiX25vZGUtPmNvbW1hbmRCdWZmZXI7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVnaW9uQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0ltYWdlQ29weSByZWdpb24gPSBwUmVnaW9uc1tpXTsKKworICAgICAgICAvLyBGb3IgY29tcC91bmNvbXAgY29waWVzLCB0aGUgY29weSBleHRlbnQgZm9yIHRoZSBkZXN0IGltYWdlIG11c3QgYmUgYWRqdXN0ZWQKKyAgICAgICAgVmtFeHRlbnQzRCBzcmNfY29weV9leHRlbnQgPSByZWdpb24uZXh0ZW50OworICAgICAgICBWa0V4dGVudDNEIGRzdF9jb3B5X2V4dGVudCA9CisgICAgICAgICAgICBHZXRBZGp1c3RlZERlc3RJbWFnZUV4dGVudChzcmNfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0LCBkc3RfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0LCByZWdpb24uZXh0ZW50KTsKKworICAgICAgICBib29sIHNsaWNlX292ZXJyaWRlID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IGRlcHRoX3NsaWNlcyA9IDA7CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBjb3B5aW5nIGJldHdlZW4gYSAxRC8yRCBhcnJheSBhbmQgYSAzRCBpbWFnZQorICAgICAgICAvLyBUQkQ6IFRoaXMgc2VlbXMgbGlrZSB0aGUgb25seSB3YXkgdG8gcmVjb25jaWxlIDMgbXV0dWFsbHktZXhjbHVzaXZlIFZVIGNoZWNrcyBmb3IgMkQvM0QgY29waWVzLiBIZWFkcyB1cC4KKyAgICAgICAgaWYgKChWS19JTUFHRV9UWVBFXzNEID09IHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUpICYmCisgICAgICAgICAgICAoVktfSU1BR0VfVFlQRV8zRCAhPSBkc3RfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlKSkgeworICAgICAgICAgICAgZGVwdGhfc2xpY2VzID0gcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQ7ICAvLyBTbGljZSBjb3VudCBmcm9tIDJEIHN1YnJlc291cmNlCisgICAgICAgICAgICBzbGljZV9vdmVycmlkZSA9IChkZXB0aF9zbGljZXMgIT0gMSk7CisgICAgICAgIH0gZWxzZSBpZiAoKFZLX0lNQUdFX1RZUEVfM0QgPT0gZHN0X2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSkgJiYKKyAgICAgICAgICAgICAgICAgICAoVktfSU1BR0VfVFlQRV8zRCAhPSBzcmNfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlKSkgeworICAgICAgICAgICAgZGVwdGhfc2xpY2VzID0gcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQ7ICAvLyBTbGljZSBjb3VudCBmcm9tIDJEIHN1YnJlc291cmNlCisgICAgICAgICAgICBzbGljZV9vdmVycmlkZSA9IChkZXB0aF9zbGljZXMgIT0gMSk7CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VTdWJyZXNvdXJjZUxheWVycyhjYl9ub2RlLCAmcmVnaW9uLnNyY1N1YnJlc291cmNlLCAidmtDbWRDb3B5SW1hZ2UiLCAic3JjU3VicmVzb3VyY2UiLCBpKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlU3VicmVzb3VyY2VMYXllcnMoY2Jfbm9kZSwgJnJlZ2lvbi5kc3RTdWJyZXNvdXJjZSwgInZrQ21kQ29weUltYWdlIiwgImRzdFN1YnJlc291cmNlIiwgaSk7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZU1pcExldmVsKGNiX25vZGUsIHNyY19pbWFnZV9zdGF0ZSwgcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsLCBpLCAidmtDbWRDb3B5SW1hZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjU3VicmVzb3VyY2UiLCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTY5NiIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VNaXBMZXZlbChjYl9ub2RlLCBkc3RfaW1hZ2Vfc3RhdGUsIHJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCwgaSwgInZrQ21kQ29weUltYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzdFN1YnJlc291cmNlIiwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE2OTciKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlQXJyYXlMYXllclJhbmdlKGNiX25vZGUsIHNyY19pbWFnZV9zdGF0ZSwgcmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQsIGksICJ2a0NtZENvcHlJbWFnZSIsICJzcmNTdWJyZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTY5OCIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VBcnJheUxheWVyUmFuZ2UoY2Jfbm9kZSwgZHN0X2ltYWdlX3N0YXRlLCByZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCwgaSwgInZrQ21kQ29weUltYWdlIiwgImRzdFN1YnJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLWRzdFN1YnJlc291cmNlLTAxNjk5Iik7CisKKyAgICAgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTEpIHsKKyAgICAgICAgICAgIC8vIE5vIGNoYW5jZSBvZiBtaXNtYXRjaCBpZiB3ZSdyZSBvdmVycmlkaW5nIGRlcHRoIHNsaWNlIGNvdW50CisgICAgICAgICAgICBpZiAoIXNsaWNlX292ZXJyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBkZXB0aCBzbGljZXMgaW4gc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAvLyBEZXB0aCBjb21lcyBmcm9tIGxheWVyQ291bnQgZm9yIDFELDJEIHJlc291cmNlcywgZnJvbSBleHRlbnQuZGVwdGggZm9yIDNECisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NsaWNlcyA9CisgICAgICAgICAgICAgICAgICAgIChWS19JTUFHRV9UWVBFXzNEID09IHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPyBzcmNfY29weV9leHRlbnQuZGVwdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3Rfc2xpY2VzID0KKyAgICAgICAgICAgICAgICAgICAgKFZLX0lNQUdFX1RZUEVfM0QgPT0gZHN0X2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSA/IGRzdF9jb3B5X2V4dGVudC5kZXB0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQpOworICAgICAgICAgICAgICAgIGlmIChzcmNfc2xpY2VzICE9IGRzdF9zbGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAgICAgIHNzIDw8ICJ2a0NtZENvcHlJbWFnZSgpOiBudW1iZXIgb2YgZGVwdGggc2xpY2VzIGluIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3VicmVzb3VyY2VzIGZvciBwUmVnaW9uc1siIDw8IGkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0gZG8gbm90IG1hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKSwgIlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTQwIiwgIiVzLiIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvciBlYWNoIHJlZ2lvbiB0aGUgbGF5ZXJDb3VudCBtZW1iZXIgb2Ygc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3QgbWF0Y2gKKyAgICAgICAgICAgIGlmIChyZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCAhPSByZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgIHNzIDw8ICJ2a0NtZENvcHlJbWFnZSgpOiBudW1iZXIgb2YgbGF5ZXJzIGluIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3VicmVzb3VyY2VzIGZvciBwUmVnaW9uc1siIDw8IGkKKyAgICAgICAgICAgICAgICAgICA8PCAiXSBkbyBub3QgbWF0Y2giOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKSwgIlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTQwIiwgIiVzLiIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gbXVsdGlwbGFuZS1zcGVjaWZpYyBjaGVja3MsIGlmIGV4dGVuc2lvbiBlbmFibGVkCisgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSB7CisgICAgICAgICAgICBza2lwIHw9IENvcHlJbWFnZU11bHRpcGxhbmVWYWxpZGF0aW9uKGNvbW1hbmRfYnVmZmVyLCBzcmNfaW1hZ2Vfc3RhdGUsIGRzdF9pbWFnZV9zdGF0ZSwgcmVnaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikgeworICAgICAgICAgICAgLy8gbm90IG11bHRpLXBsYW5lLCB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3QgbWF0Y2gKKyAgICAgICAgICAgIGlmIChyZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayAhPSByZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzaykgeworICAgICAgICAgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRDb3B5SW1hZ2UoKTogU3JjIGFuZCBkZXN0IGFzcGVjdE1hc2tzIGZvciBlYWNoIHJlZ2lvbiBtdXN0IG1hdGNoIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxMzciLCAiJXMuIiwgc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvciBlYWNoIHJlZ2lvbiwgdGhlIGFzcGVjdE1hc2sgbWVtYmVyIG9mIHNyY1N1YnJlc291cmNlIG11c3QgYmUgcHJlc2VudCBpbiB0aGUgc291cmNlIGltYWdlCisgICAgICAgIGlmICghVmVyaWZ5QXNwZWN0c1ByZXNlbnQocmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2ssIHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8ICJ2a0NtZENvcHlJbWFnZSgpOiBwUmVnaW9uWyIgPDwgaQorICAgICAgICAgICAgICAgPDwgIl0gc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayBjYW5ub3Qgc3BlY2lmeSBhc3BlY3RzIG5vdCBwcmVzZW50IGluIHNvdXJjZSBpbWFnZSI7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKSwgIlZVSUQtVmtJbWFnZUNvcHktYXNwZWN0TWFzay0wMDE0MiIsICIlcy4iLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvciBlYWNoIHJlZ2lvbiwgdGhlIGFzcGVjdE1hc2sgbWVtYmVyIG9mIGRzdFN1YnJlc291cmNlIG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZGVzdGluYXRpb24gaW1hZ2UKKyAgICAgICAgaWYgKCFWZXJpZnlBc3BlY3RzUHJlc2VudChyZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzaywgZHN0X2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25bIiA8PCBpCisgICAgICAgICAgICAgICA8PCAiXSBkc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrIGNhbm5vdCBzcGVjaWZ5IGFzcGVjdHMgbm90IHByZXNlbnQgaW4gZGVzdCBpbWFnZSI7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKSwgIlZVSUQtVmtJbWFnZUNvcHktYXNwZWN0TWFzay0wMDE0MyIsICIlcy4iLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHJlZ2lvbiBleHRlbnRzIGZvciAxRC0xRCwgMkQtMkQsIGFuZCAzRC0zRCBjb3BpZXMKKyAgICAgICAgaWYgKHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gZHN0X2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSkgeworICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSByZWdpb24gc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gZWxlbWVudCBvZiByZWdpb25zIG11c3QgYmUgYSByZWdpb24gdGhhdCBpcyBjb250YWluZWQgd2l0aGluIHNyY0ltYWdlCisgICAgICAgICAgICBWa0V4dGVudDNEIGltZ19leHRlbnQgPSBHZXRJbWFnZVN1YnJlc291cmNlRXh0ZW50KHNyY19pbWFnZV9zdGF0ZSwgJihyZWdpb24uc3JjU3VicmVzb3VyY2UpKTsKKyAgICAgICAgICAgIGlmICgwICE9IEV4Y2VlZHNCb3VuZHMoJnJlZ2lvbi5zcmNPZmZzZXQsICZzcmNfY29weV9leHRlbnQsICZpbWdfZXh0ZW50KSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgIHNzIDw8ICJ2a0NtZENvcHlJbWFnZSgpOiBTb3VyY2UgcFJlZ2lvblsiIDw8IGkgPDwgIl0gd2l0aCBtaXBMZXZlbCBbICIgPDwgcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsCisgICAgICAgICAgICAgICAgICAgPDwgIiBdLCBvZmZzZXQgWyAiIDw8IHJlZ2lvbi5zcmNPZmZzZXQueCA8PCAiLCAiIDw8IHJlZ2lvbi5zcmNPZmZzZXQueSA8PCAiLCAiIDw8IHJlZ2lvbi5zcmNPZmZzZXQuegorICAgICAgICAgICAgICAgICAgIDw8ICIgXSwgZXh0ZW50IFsgIiA8PCBzcmNfY29weV9leHRlbnQud2lkdGggPDwgIiwgIiA8PCBzcmNfY29weV9leHRlbnQuaGVpZ2h0IDw8ICIsICIgPDwgc3JjX2NvcHlfZXh0ZW50LmRlcHRoCisgICAgICAgICAgICAgICAgICAgPDwgIiBdIGV4Y2VlZHMgdGhlIHNvdXJjZSBpbWFnZSBkaW1lbnNpb25zIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTIyIiwgIiVzLiIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgZGVzdGluYXRpb24gcmVnaW9uIHNwZWNpZmllZCBieSBhIGdpdmVuIGVsZW1lbnQgb2YgcmVnaW9ucyBtdXN0IGJlIGEgcmVnaW9uIHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiBkc3RfaW1hZ2UKKyAgICAgICAgICAgIGltZ19leHRlbnQgPSBHZXRJbWFnZVN1YnJlc291cmNlRXh0ZW50KGRzdF9pbWFnZV9zdGF0ZSwgJihyZWdpb24uZHN0U3VicmVzb3VyY2UpKTsKKyAgICAgICAgICAgIGlmICgwICE9IEV4Y2VlZHNCb3VuZHMoJnJlZ2lvbi5kc3RPZmZzZXQsICZkc3RfY29weV9leHRlbnQsICZpbWdfZXh0ZW50KSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgIHNzIDw8ICJ2a0NtZENvcHlJbWFnZSgpOiBEZXN0IHBSZWdpb25bIiA8PCBpIDw8ICJdIHdpdGggbWlwTGV2ZWwgWyAiIDw8IHJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbAorICAgICAgICAgICAgICAgICAgIDw8ICIgXSwgb2Zmc2V0IFsgIiA8PCByZWdpb24uZHN0T2Zmc2V0LnggPDwgIiwgIiA8PCByZWdpb24uZHN0T2Zmc2V0LnkgPDwgIiwgIiA8PCByZWdpb24uZHN0T2Zmc2V0LnoKKyAgICAgICAgICAgICAgICAgICA8PCAiIF0sIGV4dGVudCBbICIgPDwgZHN0X2NvcHlfZXh0ZW50LndpZHRoIDw8ICIsICIgPDwgZHN0X2NvcHlfZXh0ZW50LmhlaWdodCA8PCAiLCAiIDw8IGRzdF9jb3B5X2V4dGVudC5kZXB0aAorICAgICAgICAgICAgICAgICAgIDw8ICIgXSBleGNlZWRzIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBkaW1lbnNpb25zIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTIzIiwgIiVzLiIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRWFjaCBkaW1lbnNpb24gb2Zmc2V0ICsgZXh0ZW50IGxpbWl0cyBtdXN0IGZhbGwgd2l0aCBpbWFnZSBzdWJyZXNvdXJjZSBleHRlbnQKKyAgICAgICAgVmtFeHRlbnQzRCBzdWJyZXNvdXJjZV9leHRlbnQgPSBHZXRJbWFnZVN1YnJlc291cmNlRXh0ZW50KHNyY19pbWFnZV9zdGF0ZSwgJihyZWdpb24uc3JjU3VicmVzb3VyY2UpKTsKKyAgICAgICAgaWYgKHNsaWNlX292ZXJyaWRlKSBzcmNfY29weV9leHRlbnQuZGVwdGggPSBkZXB0aF9zbGljZXM7CisgICAgICAgIHVpbnQzMl90IGV4dGVudF9jaGVjayA9IEV4Y2VlZHNCb3VuZHMoJihyZWdpb24uc3JjT2Zmc2V0KSwgJnNyY19jb3B5X2V4dGVudCwgJnN1YnJlc291cmNlX2V4dGVudCk7CisgICAgICAgIGlmIChleHRlbnRfY2hlY2sgJiB4X2JpdCkgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNPZmZzZXQtMDAxNDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCk6IFNvdXJjZSBpbWFnZSBwUmVnaW9uICUxZCB4LWRpbWVuc2lvbiBvZmZzZXQgWyUxZF0gKyBleHRlbnQgWyUxZF0gZXhjZWVkcyBzdWJSZXNvdXJjZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGggWyUxZF0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlZ2lvbi5zcmNPZmZzZXQueCwgc3JjX2NvcHlfZXh0ZW50LndpZHRoLCBzdWJyZXNvdXJjZV9leHRlbnQud2lkdGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4dGVudF9jaGVjayAmIHlfYml0KSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE0NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogU291cmNlIGltYWdlIHBSZWdpb24gJTFkIHktZGltZW5zaW9uIG9mZnNldCBbJTFkXSArIGV4dGVudCBbJTFkXSBleGNlZWRzIHN1YlJlc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJoZWlnaHQgWyUxZF0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlZ2lvbi5zcmNPZmZzZXQueSwgc3JjX2NvcHlfZXh0ZW50LmhlaWdodCwgc3VicmVzb3VyY2VfZXh0ZW50LmhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dGVudF9jaGVjayAmIHpfYml0KSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKTogU291cmNlIGltYWdlIHBSZWdpb24gJTFkIHotZGltZW5zaW9uIG9mZnNldCBbJTFkXSArIGV4dGVudCBbJTFkXSBleGNlZWRzIHN1YlJlc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXB0aCBbJTFkXS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVnaW9uLnNyY09mZnNldC56LCBzcmNfY29weV9leHRlbnQuZGVwdGgsIHN1YnJlc291cmNlX2V4dGVudC5kZXB0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGp1c3QgZGVzdCBleHRlbnQgaWYgbmVjZXNzYXJ5CisgICAgICAgIHN1YnJlc291cmNlX2V4dGVudCA9IEdldEltYWdlU3VicmVzb3VyY2VFeHRlbnQoZHN0X2ltYWdlX3N0YXRlLCAmKHJlZ2lvbi5kc3RTdWJyZXNvdXJjZSkpOworICAgICAgICBpZiAoc2xpY2Vfb3ZlcnJpZGUpIGRzdF9jb3B5X2V4dGVudC5kZXB0aCA9IGRlcHRoX3NsaWNlczsKKworICAgICAgICBleHRlbnRfY2hlY2sgPSBFeGNlZWRzQm91bmRzKCYocmVnaW9uLmRzdE9mZnNldCksICZkc3RfY29weV9leHRlbnQsICZzdWJyZXNvdXJjZV9leHRlbnQpOworICAgICAgICBpZiAoZXh0ZW50X2NoZWNrICYgeF9iaXQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpOiBEZXN0IGltYWdlIHBSZWdpb24gJTFkIHgtZGltZW5zaW9uIG9mZnNldCBbJTFkXSArIGV4dGVudCBbJTFkXSBleGNlZWRzIHN1YlJlc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGggWyUxZF0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZWdpb24uZHN0T2Zmc2V0LngsIGRzdF9jb3B5X2V4dGVudC53aWR0aCwgc3VicmVzb3VyY2VfZXh0ZW50LndpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXh0ZW50X2NoZWNrICYgeV9iaXQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpOiBEZXN0IGltYWdlIHBSZWdpb24gJTFkIHktZGltZW5zaW9uIG9mZnNldCBbJTFkXSArIGV4dGVudCBbJTFkXSBleGNlZWRzIHN1YlJlc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0IFslMWRdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVnaW9uLmRzdE9mZnNldC55LCBkc3RfY29weV9leHRlbnQuaGVpZ2h0LCBzdWJyZXNvdXJjZV9leHRlbnQuaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXh0ZW50X2NoZWNrICYgel9iaXQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpOiBEZXN0IGltYWdlIHBSZWdpb24gJTFkIHotZGltZW5zaW9uIG9mZnNldCBbJTFkXSArIGV4dGVudCBbJTFkXSBleGNlZWRzIHN1YlJlc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwdGggWyUxZF0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZWdpb24uZHN0T2Zmc2V0LnosIGRzdF9jb3B5X2V4dGVudC5kZXB0aCwgc3VicmVzb3VyY2VfZXh0ZW50LmRlcHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSB1bmlvbiBvZiBhbGwgc291cmNlIHJlZ2lvbnMsIGFuZCB0aGUgdW5pb24gb2YgYWxsIGRlc3RpbmF0aW9uIHJlZ2lvbnMsIHNwZWNpZmllZCBieSB0aGUgZWxlbWVudHMgb2YgcmVnaW9ucywKKyAgICAgICAgLy8gbXVzdCBub3Qgb3ZlcmxhcCBpbiBtZW1vcnkKKyAgICAgICAgaWYgKHNyY19pbWFnZV9zdGF0ZS0+aW1hZ2UgPT0gZHN0X2ltYWdlX3N0YXRlLT5pbWFnZSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHJlZ2lvbkNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoUmVnaW9uSW50ZXJzZWN0cygmcmVnaW9uLCAmcFJlZ2lvbnNbal0sIHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0SXNNdWx0aXBsYW5lKHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICAgICAgc3MgPDwgInZrQ21kQ29weUltYWdlKCk6IHBSZWdpb25zWyIgPDwgaSA8PCAiXSBzcmMgb3ZlcmxhcHMgd2l0aCBwUmVnaW9uc1siIDw8IGogPDwgIl0uIjsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKSwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtcFJlZ2lvbnMtMDAxMjQiLCAiJXMuIiwgc3Muc3RyKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlIGZvcm1hdHMgb2Ygc3JjX2ltYWdlIGFuZCBkc3RfaW1hZ2UgbXVzdCBiZSBjb21wYXRpYmxlLiBGb3JtYXRzIGFyZSBjb25zaWRlcmVkIGNvbXBhdGlibGUgaWYgdGhlaXIgdGV4ZWwgc2l6ZSBpbiBieXRlcworICAgIC8vIGlzIHRoZSBzYW1lIGJldHdlZW4gYm90aCBmb3JtYXRzLiBGb3IgZXhhbXBsZSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNIGlzIGNvbXBhdGlibGUgd2l0aCBWS19GT1JNQVRfUjMyX1VJTlQgYmVjYXVzZQorICAgIC8vIGJlY2F1c2UgYm90aCB0ZXhlbHMgYXJlIDQgYnl0ZXMgaW4gc2l6ZS4gRGVwdGgvc3RlbmNpbCBmb3JtYXRzIG11c3QgbWF0Y2ggZXhhY3RseS4KKyAgICBpZiAoRm9ybWF0SXNEZXB0aE9yU3RlbmNpbChzcmNfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KSB8fCBGb3JtYXRJc0RlcHRoT3JTdGVuY2lsKGRzdF9pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpKSB7CisgICAgICAgIGlmIChzcmNfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0ICE9IGRzdF9pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRDb3B5SW1hZ2UgY2FsbGVkIHdpdGggdW5tYXRjaGVkIHNvdXJjZSBhbmQgZGVzdCBpbWFnZSBkZXB0aC9zdGVuY2lsIGZvcm1hdHMuIjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9NaXNtYXRjaGVkSW1hZ2VGb3JtYXQsIHN0cik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIUZvcm1hdFNpemVzQXJlRXF1YWwoc3JjX2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCwgZHN0X2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKSkgeworICAgICAgICAgICAgY2hhciBjb25zdCBzdHJbXSA9ICJ2a0NtZENvcHlJbWFnZSBjYWxsZWQgd2l0aCB1bm1hdGNoZWQgc291cmNlIGFuZCBkZXN0IGltYWdlIGZvcm1hdCBzaXplcy4iOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAwMTM1IiwgIiVzLiIsIHN0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTb3VyY2UgYW5kIGRlc3QgaW1hZ2Ugc2FtcGxlIGNvdW50cyBtdXN0IG1hdGNoCisgICAgaWYgKHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5zYW1wbGVzICE9IGRzdF9pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5zYW1wbGVzKSB7CisgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRDb3B5SW1hZ2UoKSBjYWxsZWQgb24gaW1hZ2UgcGFpciB3aXRoIG5vbi1pZGVudGljYWwgc2FtcGxlIGNvdW50cy4iOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEzNiIsICIlcyIsIHN0cik7CisgICAgfQorCisgICAgc2tpcCB8PSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0ltYWdlKHNyY19pbWFnZV9zdGF0ZSwgInZrQ21kQ29weUltYWdlKCkiLCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEyNyIpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9JbWFnZShkc3RfaW1hZ2Vfc3RhdGUsICJ2a0NtZENvcHlJbWFnZSgpIiwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2UtMDAxMzIiKTsKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IFNSQyAmIERTVCBpbWFnZXMgaGF2ZSBjb3JyZWN0IHVzYWdlIGZsYWdzIHNldAorICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZVVzYWdlRmxhZ3Moc3JjX2ltYWdlX3N0YXRlLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULCB0cnVlLCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEyNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKSIsICJWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlVXNhZ2VGbGFncyhkc3RfaW1hZ2Vfc3RhdGUsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsIHRydWUsICJWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlLTAwMTMxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpIiwgIlZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQiKTsKKyAgICBpZiAoYXBpX3ZlcnNpb24gPj0gVktfQVBJX1ZFUlNJT05fMV8xIHx8IGRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTEpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlRm9ybWF0RmVhdHVyZUZsYWdzKHNyY19pbWFnZV9zdGF0ZSwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCwgInZrQ21kQ29weUltYWdlKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDE5OTUiLCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMTk5NSIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VGb3JtYXRGZWF0dXJlRmxhZ3MoZHN0X2ltYWdlX3N0YXRlLCBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklULCAidmtDbWRDb3B5SW1hZ2UoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMTk5NiIsICJWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlLTAxOTk2Iik7CisgICAgfQorICAgIHNraXAgfD0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX25vZGUsICJ2a0NtZENvcHlJbWFnZSgpIiwgVktfUVVFVUVfVFJBTlNGRVJfQklUIHwgVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9ub2RlLCBDTURfQ09QWUlNQUdFLCAidmtDbWRDb3B5SW1hZ2UoKSIpOworICAgIHNraXAgfD0gSW5zaWRlUmVuZGVyUGFzcyhjYl9ub2RlLCAidmtDbWRDb3B5SW1hZ2UoKSIsICJWVUlELXZrQ21kQ29weUltYWdlLXJlbmRlcnBhc3MiKTsKKyAgICBib29sIGhpdF9lcnJvciA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIgKmludmFsaWRfc3JjX2xheW91dF92dWlkID0gKHNyY19pbWFnZV9zdGF0ZS0+c2hhcmVkX3ByZXNlbnRhYmxlICYmIGRldmljZV9leHRlbnNpb25zLnZrX2tocl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZUxheW91dC0wMTkxNyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMTI5IjsKKyAgICBjb25zdCBjaGFyICppbnZhbGlkX2RzdF9sYXlvdXRfdnVpZCA9IChkc3RfaW1hZ2Vfc3RhdGUtPnNoYXJlZF9wcmVzZW50YWJsZSAmJiBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDEzOTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZUxheW91dC0wMDEzNCI7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlZ2lvbkNvdW50OyArK2kpIHsKKyAgICAgICAgc2tpcCB8PSBWZXJpZnlJbWFnZUxheW91dChjYl9ub2RlLCBzcmNfaW1hZ2Vfc3RhdGUsIHBSZWdpb25zW2ldLnNyY1N1YnJlc291cmNlLCBzcmNJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsICJ2a0NtZENvcHlJbWFnZSgpIiwgaW52YWxpZF9zcmNfbGF5b3V0X3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDAxMjgiLCAmaGl0X2Vycm9yKTsKKyAgICAgICAgc2tpcCB8PSBWZXJpZnlJbWFnZUxheW91dChjYl9ub2RlLCBkc3RfaW1hZ2Vfc3RhdGUsIHBSZWdpb25zW2ldLmRzdFN1YnJlc291cmNlLCBkc3RJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsICJ2a0NtZENvcHlJbWFnZSgpIiwgaW52YWxpZF9kc3RfbGF5b3V0X3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxMzMiLCAmaGl0X2Vycm9yKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNvcHlJbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHlSZXF1aXJlbWVudHMoY2Jfbm9kZSwgc3JjX2ltYWdlX3N0YXRlLCBkc3RfaW1hZ2Vfc3RhdGUsICZwUmVnaW9uc1tpXSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlKCkiKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQcmVDYWxsUmVjb3JkQ21kQ29weUltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VDb3B5ICpwUmVnaW9ucykgeworICAgIFN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZENvcHlJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKyAgICBhdXRvIGNiX25vZGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGF1dG8gc3JjX2ltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShzcmNJbWFnZSk7CisgICAgYXV0byBkc3RfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGRzdEltYWdlKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFsbCBpbWFnZSBzbGljZXMgYXJlIHVwZGF0ZWQgdG8gY29ycmVjdCBsYXlvdXQKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVnaW9uQ291bnQ7ICsraSkgeworICAgICAgICBTZXRJbWFnZUluaXRpYWxMYXlvdXQoY2Jfbm9kZSwgKnNyY19pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uc3JjU3VicmVzb3VyY2UsIHNyY0ltYWdlTGF5b3V0KTsKKyAgICAgICAgU2V0SW1hZ2VJbml0aWFsTGF5b3V0KGNiX25vZGUsICpkc3RfaW1hZ2Vfc3RhdGUsIHBSZWdpb25zW2ldLmRzdFN1YnJlc291cmNlLCBkc3RJbWFnZUxheW91dCk7CisgICAgfQorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgc3ViX3JlY3QgaXMgZW50aXJlbHkgY29udGFpbmVkIHdpdGhpbiByZWN0CitzdGF0aWMgaW5saW5lIGJvb2wgQ29udGFpbnNSZWN0KFZrUmVjdDJEIHJlY3QsIFZrUmVjdDJEIHN1Yl9yZWN0KSB7CisgICAgaWYgKChzdWJfcmVjdC5vZmZzZXQueCA8IHJlY3Qub2Zmc2V0LngpIHx8IChzdWJfcmVjdC5vZmZzZXQueCArIHN1Yl9yZWN0LmV4dGVudC53aWR0aCA+IHJlY3Qub2Zmc2V0LnggKyByZWN0LmV4dGVudC53aWR0aCkgfHwKKyAgICAgICAgKHN1Yl9yZWN0Lm9mZnNldC55IDwgcmVjdC5vZmZzZXQueSkgfHwgKHN1Yl9yZWN0Lm9mZnNldC55ICsgc3ViX3JlY3QuZXh0ZW50LmhlaWdodCA+IHJlY3Qub2Zmc2V0LnkgKyByZWN0LmV4dGVudC5oZWlnaHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDbGVhckF0dGFjaG1lbnRFeHRlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyLCB1aW50MzJfdCBhdHRhY2htZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGUkFNRUJVRkZFUl9TVEFURSAqZnJhbWVidWZmZXIsIHVpbnQzMl90IGZiX2F0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVjdDJEICZyZW5kZXJfYXJlYSwgdWludDMyX3QgcmVjdF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDbGVhclJlY3QgKmNsZWFyX3JlY3RzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgSU1BR0VfVklFV19TVEFURSAqaW1hZ2Vfdmlld19zdGF0ZSA9IG51bGxwdHI7CisgICAgaWYgKGZyYW1lYnVmZmVyICYmIChmYl9hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSAmJiAoZmJfYXR0YWNobWVudCA8IGZyYW1lYnVmZmVyLT5jcmVhdGVJbmZvLmF0dGFjaG1lbnRDb3VudCkpIHsKKyAgICAgICAgaW1hZ2Vfdmlld19zdGF0ZSA9IEdldEltYWdlVmlld1N0YXRlKGZyYW1lYnVmZmVyLT5jcmVhdGVJbmZvLnBBdHRhY2htZW50c1tmYl9hdHRhY2htZW50XSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHJlY3RfY291bnQ7IGorKykgeworICAgICAgICBpZiAoIUNvbnRhaW5zUmVjdChyZW5kZXJfYXJlYSwgY2xlYXJfcmVjdHNbal0ucmVjdCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpLCAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcFJlY3RzLTAwMDE2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDbGVhckF0dGFjaG1lbnRzKCk6IFRoZSBhcmVhIGRlZmluZWQgYnkgcFJlY3RzWyVkXSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBhcmVhIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgaW5zdGFuY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbWFnZV92aWV3X3N0YXRlKSB7CisgICAgICAgICAgICAvLyBUaGUgbGF5ZXJzIHNwZWNpZmllZCBieSBhIGdpdmVuIGVsZW1lbnQgb2YgcFJlY3RzIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBldmVyeSBhdHRhY2htZW50IHRoYXQKKyAgICAgICAgICAgIC8vIHBBdHRhY2htZW50cyByZWZlcnMgdG8KKyAgICAgICAgICAgIGNvbnN0IGF1dG8gYXR0YWNobWVudF9sYXllcl9jb3VudCA9IGltYWdlX3ZpZXdfc3RhdGUtPmNyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudDsKKyAgICAgICAgICAgIGlmICgoY2xlYXJfcmVjdHNbal0uYmFzZUFycmF5TGF5ZXIgPj0gYXR0YWNobWVudF9sYXllcl9jb3VudCkgfHwKKyAgICAgICAgICAgICAgICAoY2xlYXJfcmVjdHNbal0uYmFzZUFycmF5TGF5ZXIgKyBjbGVhcl9yZWN0c1tqXS5sYXllckNvdW50ID4gYXR0YWNobWVudF9sYXllcl9jb3VudCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1wUmVjdHMtMDAwMTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDbGVhckF0dGFjaG1lbnRzKCk6IFRoZSBsYXllcnMgZGVmaW5lZCBpbiBwUmVjdHNbJWRdIGFyZSBub3QgY29udGFpbmVkIGluIHRoZSBsYXllcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgcEF0dGFjaG1lbnRbJWRdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGF0dGFjaG1lbnRfaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQXR0YWNobWVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyQXR0YWNobWVudCAqcEF0dGFjaG1lbnRzLCB1aW50MzJfdCByZWN0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDbGVhclJlY3QgKnBSZWN0cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOyAgLy8gVE9ETzogU2hvdWxkIGJlIGNvbnN0LCBhbmQgbmV2ZXIgbW9kaWZpZWQgZHVyaW5nIHZhbGlkYXRpb24KKyAgICBpZiAoIWNiX25vZGUpIHJldHVybiBza2lwOworCisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfbm9kZSwgInZrQ21kQ2xlYXJBdHRhY2htZW50cygpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX25vZGUsIENNRF9DTEVBUkFUVEFDSE1FTlRTLCAidmtDbWRDbGVhckF0dGFjaG1lbnRzKCkiKTsKKyAgICBza2lwIHw9IE91dHNpZGVSZW5kZXJQYXNzKGNiX25vZGUsICJ2a0NtZENsZWFyQXR0YWNobWVudHMoKSIsICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1yZW5kZXJwYXNzIik7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IGF0dGFjaG1lbnQgaXMgaW4gcmVmZXJlbmNlIGxpc3Qgb2YgYWN0aXZlIHN1YnBhc3MKKyAgICBpZiAoY2Jfbm9kZS0+YWN0aXZlUmVuZGVyUGFzcykgeworICAgICAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiAqcmVuZGVycGFzc19jcmVhdGVfaW5mbyA9IGNiX25vZGUtPmFjdGl2ZVJlbmRlclBhc3MtPmNyZWF0ZUluZm8ucHRyKCk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlbmRlcnBhc3NfYXR0YWNobWVudF9jb3VudCA9IHJlbmRlcnBhc3NfY3JlYXRlX2luZm8tPmF0dGFjaG1lbnRDb3VudDsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICpzdWJwYXNzX2Rlc2MgPSAmcmVuZGVycGFzc19jcmVhdGVfaW5mby0+cFN1YnBhc3Nlc1tjYl9ub2RlLT5hY3RpdmVTdWJwYXNzXTsKKyAgICAgICAgY29uc3QgYXV0byAqZnJhbWVidWZmZXIgPSBHZXRGcmFtZWJ1ZmZlclN0YXRlKGNiX25vZGUtPmFjdGl2ZUZyYW1lYnVmZmVyKTsKKyAgICAgICAgY29uc3QgYXV0byAmcmVuZGVyX2FyZWEgPSBjYl9ub2RlLT5hY3RpdmVSZW5kZXJQYXNzQmVnaW5JbmZvLnJlbmRlckFyZWE7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBhdHRhY2htZW50X2luZGV4ID0gMDsgYXR0YWNobWVudF9pbmRleCA8IGF0dGFjaG1lbnRDb3VudDsgYXR0YWNobWVudF9pbmRleCsrKSB7CisgICAgICAgICAgICBhdXRvIGNsZWFyX2Rlc2MgPSAmcEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRfaW5kZXhdOworICAgICAgICAgICAgdWludDMyX3QgZmJfYXR0YWNobWVudCA9IFZLX0FUVEFDSE1FTlRfVU5VU0VEOworCisgICAgICAgICAgICBpZiAoMCA9PSBjbGVhcl9kZXNjLT5hc3BlY3RNYXNrKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELVZrQ2xlYXJBdHRhY2htZW50LWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIiwgIiAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xlYXJfZGVzYy0+YXNwZWN0TWFzayAmIFZLX0lNQUdFX0FTUEVDVF9NRVRBREFUQV9CSVQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtDbGVhckF0dGFjaG1lbnQtYXNwZWN0TWFzay0wMDAyMCIsICIgIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNsZWFyX2Rlc2MtPmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3JfYXR0YWNobWVudCA9IFZLX0FUVEFDSE1FTlRfVU5VU0VEOworICAgICAgICAgICAgICAgIGlmIChjbGVhcl9kZXNjLT5jb2xvckF0dGFjaG1lbnQgPCBzdWJwYXNzX2Rlc2MtPmNvbG9yQXR0YWNobWVudENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yX2F0dGFjaG1lbnQgPSBzdWJwYXNzX2Rlc2MtPnBDb2xvckF0dGFjaG1lbnRzW2NsZWFyX2Rlc2MtPmNvbG9yQXR0YWNobWVudF0uYXR0YWNobWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjb2xvcl9hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSAmJiAoY29sb3JfYXR0YWNobWVudCA+PSByZW5kZXJwYXNzX2F0dGFjaG1lbnRfY291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtYXNwZWN0TWFzay0wMjUwMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ2xlYXJBdHRhY2htZW50cygpIHBBdHRhY2htZW50c1sldV0uY29sb3JBdHRhY2htZW50PSV1IGlzIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBub3QgYSB2YWxpZCBhdHRhY2htZW50IGZvciAlcyBhdHRhY2htZW50Q291bnQ9JXUuIFN1YnBhc3MgJXUgcENvbG9yQXR0YWNobWVudFsldV09JXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2luZGV4LCBjbGVhcl9kZXNjLT5jb2xvckF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjYl9ub2RlLT5hY3RpdmVSZW5kZXJQYXNzLT5yZW5kZXJQYXNzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX25vZGUtPmFjdGl2ZVN1YnBhc3MsIGNsZWFyX2Rlc2MtPmNvbG9yQXR0YWNobWVudCwgY29sb3JfYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJwYXNzX2F0dGFjaG1lbnRfY291bnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9hdHRhY2htZW50ID0gVktfQVRUQUNITUVOVF9VTlVTRUQ7ICAvLyBEZWZlbnNpdmUsIHByZXZlbnQgbG9va3VwIHBhc3QgZW5kIG9mIHJlbmRlcnBhc3MgYXR0YWNobWVudAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtYXNwZWN0TWFzay0wMjUwMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDbGVhckF0dGFjaG1lbnRzKCkgcEF0dGFjaG1lbnRzWyV1XS5jb2xvckF0dGFjaG1lbnQ9JXUgb3V0IG9mIHJhbmdlIGZvciAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3VicGFzcyAldS4gY29sb3JBdHRhY2htZW50Q291bnQ9JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9pbmRleCwgY2xlYXJfZGVzYy0+Y29sb3JBdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjYl9ub2RlLT5hY3RpdmVSZW5kZXJQYXNzLT5yZW5kZXJQYXNzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfbm9kZS0+YWN0aXZlU3VicGFzcywgc3VicGFzc19kZXNjLT5jb2xvckF0dGFjaG1lbnRDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZiX2F0dGFjaG1lbnQgPSBjb2xvcl9hdHRhY2htZW50OworCisgICAgICAgICAgICAgICAgaWYgKChjbGVhcl9kZXNjLT5hc3BlY3RNYXNrICYgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNsZWFyX2Rlc2MtPmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPQorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ2xlYXJBdHRhY2htZW50cygpIGFzcGVjdE1hc2sgWyVkXSBtdXN0IHNldCBvbmx5IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgb2YgYSBjb2xvciBhdHRhY2htZW50LiI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtDbGVhckF0dGFjaG1lbnQtYXNwZWN0TWFzay0wMDAxOSIsIHN0ciwgYXR0YWNobWVudF9pbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgIC8vIE11c3QgYmUgZGVwdGggYW5kL29yIHN0ZW5jaWwKKyAgICAgICAgICAgICAgICBpZiAoKChjbGVhcl9kZXNjLT5hc3BlY3RNYXNrICYgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCkgIT0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKChjbGVhcl9kZXNjLT5hc3BlY3RNYXNrICYgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSAhPSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRDbGVhckF0dGFjaG1lbnRzKCkgYXNwZWN0TWFzayBbJWRdIGlzIG5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIGJpdHMuIjsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0NsZWFyQXR0YWNobWVudC1hc3BlY3RNYXNrLXBhcmFtZXRlciIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXN1YnBhc3NfZGVzYy0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgfHwKKyAgICAgICAgICAgICAgICAgICAgKHN1YnBhc3NfZGVzYy0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQgPT0gVktfQVRUQUNITUVOVF9VTlVTRUQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX01pc3NpbmdBdHRhY2htZW50UmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ2xlYXJBdHRhY2htZW50cygpIGRlcHRoL3N0ZW5jaWwgY2xlYXIgd2l0aCBubyBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgaW4gc3VicGFzczsgaWdub3JlZCIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZiX2F0dGFjaG1lbnQgPSBzdWJwYXNzX2Rlc2MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYl9ub2RlLT5jcmVhdGVJbmZvLmxldmVsID09IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ2xlYXJBdHRhY2htZW50RXh0ZW50KGNvbW1hbmRCdWZmZXIsIGF0dGFjaG1lbnRfaW5kZXgsIGZyYW1lYnVmZmVyLCBmYl9hdHRhY2htZW50LCByZW5kZXJfYXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RDb3VudCwgcFJlY3RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQcmVDYWxsUmVjb3JkQ21kQ2xlYXJBdHRhY2htZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYXR0YWNobWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyQXR0YWNobWVudCAqcEF0dGFjaG1lbnRzLCB1aW50MzJfdCByZWN0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJSZWN0ICpwUmVjdHMpIHsKKyAgICBhdXRvICpjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAoY2Jfbm9kZS0+YWN0aXZlUmVuZGVyUGFzcyAmJiAoY2Jfbm9kZS0+Y3JlYXRlSW5mby5sZXZlbCA9PSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpKSB7CisgICAgICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpyZW5kZXJwYXNzX2NyZWF0ZV9pbmZvID0gY2Jfbm9kZS0+YWN0aXZlUmVuZGVyUGFzcy0+Y3JlYXRlSW5mby5wdHIoKTsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICpzdWJwYXNzX2Rlc2MgPSAmcmVuZGVycGFzc19jcmVhdGVfaW5mby0+cFN1YnBhc3Nlc1tjYl9ub2RlLT5hY3RpdmVTdWJwYXNzXTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPFZrQ2xlYXJSZWN0Pj4gY2xlYXJfcmVjdF9jb3B5OworICAgICAgICBmb3IgKHVpbnQzMl90IGF0dGFjaG1lbnRfaW5kZXggPSAwOyBhdHRhY2htZW50X2luZGV4IDwgYXR0YWNobWVudENvdW50OyBhdHRhY2htZW50X2luZGV4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gY2xlYXJfZGVzYyA9ICZwQXR0YWNobWVudHNbYXR0YWNobWVudF9pbmRleF07CisgICAgICAgICAgICB1aW50MzJfdCBmYl9hdHRhY2htZW50ID0gVktfQVRUQUNITUVOVF9VTlVTRUQ7CisgICAgICAgICAgICBpZiAoKGNsZWFyX2Rlc2MtPmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUKSAmJgorICAgICAgICAgICAgICAgIChjbGVhcl9kZXNjLT5jb2xvckF0dGFjaG1lbnQgPCBzdWJwYXNzX2Rlc2MtPmNvbG9yQXR0YWNobWVudENvdW50KSkgeworICAgICAgICAgICAgICAgIGZiX2F0dGFjaG1lbnQgPSBzdWJwYXNzX2Rlc2MtPnBDb2xvckF0dGFjaG1lbnRzW2NsZWFyX2Rlc2MtPmNvbG9yQXR0YWNobWVudF0uYXR0YWNobWVudDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNsZWFyX2Rlc2MtPmFzcGVjdE1hc2sgJiAoVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3NfZGVzYy0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHsKKyAgICAgICAgICAgICAgICBmYl9hdHRhY2htZW50ID0gc3VicGFzc19kZXNjLT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYl9hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjbGVhcl9yZWN0X2NvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBhIGNvcHkgb2YgdGhlIGNsZWFyIHJlY3RhbmdsZXMgdGhhdCB3aWxsIHBlcnNpc3QgdW50aWwgdGhlIGxhc3QgbGFtYmRhIGV4ZWN1dGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSB3YW50IHRvIGNyZWF0ZSBpdCBhcyBsYXppbHkgYXMgcG9zc2libGUKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJfcmVjdF9jb3B5LnJlc2V0KG5ldyBzdGQ6OnZlY3RvcjxWa0NsZWFyUmVjdD4ocFJlY3RzLCBwUmVjdHMgKyByZWN0Q291bnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaWYgYSBzZWNvbmRhcnkgbGV2ZWwgY29tbWFuZCBidWZmZXIgaW5oZXJpdHMgdGhlIGZyYW1lYnVmZmVyIGZyb20gdGhlIHByaW1hcnkgY29tbWFuZCBidWZmZXIKKyAgICAgICAgICAgICAgICAvLyAoc2VlIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyksIHRoaXMgdmFsaWRhdGlvbiBtdXN0IGJlIGRlZmVycmVkIHVudGlsIHF1ZXVlIHN1Ym1pdCB0aW1lCisgICAgICAgICAgICAgICAgYXV0byB2YWxfZm4gPSBbdGhpcywgY29tbWFuZEJ1ZmZlciwgYXR0YWNobWVudF9pbmRleCwgZmJfYXR0YWNobWVudCwgcmVjdENvdW50LCBjbGVhcl9yZWN0X2NvcHldKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnByaW1fY2IsIFZrRnJhbWVidWZmZXIgZmIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlY3RDb3VudCA9PSBjbGVhcl9yZWN0X2NvcHktPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZSQU1FQlVGRkVSX1NUQVRFICpmcmFtZWJ1ZmZlciA9IEdldEZyYW1lYnVmZmVyU3RhdGUoZmIpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZyZW5kZXJfYXJlYSA9IHByaW1fY2ItPmFjdGl2ZVJlbmRlclBhc3NCZWdpbkluZm8ucmVuZGVyQXJlYTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNraXAgPSBWYWxpZGF0ZUNsZWFyQXR0YWNobWVudEV4dGVudChjb21tYW5kQnVmZmVyLCBhdHRhY2htZW50X2luZGV4LCBmcmFtZWJ1ZmZlciwgZmJfYXR0YWNobWVudCwgcmVuZGVyX2FyZWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Q291bnQsIGNsZWFyX3JlY3RfY29weS0+ZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNraXA7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjYl9ub2RlLT5jbWRfZXhlY3V0ZV9jb21tYW5kc19mdW5jdGlvbnMuZW1wbGFjZV9iYWNrKHZhbF9mbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kUmVzb2x2ZUltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlUmVzb2x2ZSAqcFJlZ2lvbnMpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvICpjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBjb25zdCBhdXRvICpzcmNfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHNyY0ltYWdlKTsKKyAgICBjb25zdCBhdXRvICpkc3RfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGRzdEltYWdlKTsKKworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChjYl9ub2RlICYmIHNyY19pbWFnZV9zdGF0ZSAmJiBkc3RfaW1hZ2Vfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0ltYWdlKHNyY19pbWFnZV9zdGF0ZSwgInZrQ21kUmVzb2x2ZUltYWdlKCkiLCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZS0wMDI1NiIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvSW1hZ2UoZHN0X2ltYWdlX3N0YXRlLCAidmtDbWRSZXNvbHZlSW1hZ2UoKSIsICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlLTAwMjU4Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX25vZGUsICJ2a0NtZFJlc29sdmVJbWFnZSgpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9ub2RlLCBDTURfUkVTT0xWRUlNQUdFLCAidmtDbWRSZXNvbHZlSW1hZ2UoKSIpOworICAgICAgICBza2lwIHw9IEluc2lkZVJlbmRlclBhc3MoY2Jfbm9kZSwgInZrQ21kUmVzb2x2ZUltYWdlKCkiLCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1yZW5kZXJwYXNzIik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUZvcm1hdEZlYXR1cmVGbGFncyhkc3RfaW1hZ2Vfc3RhdGUsIFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklULCAidmtDbWRSZXNvbHZlSW1hZ2UoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZS0wMjAwMyIsICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlLTAyMDAzIik7CisKKyAgICAgICAgYm9vbCBoaXRfZXJyb3IgPSBmYWxzZTsKKyAgICAgICAgY29uc3QgY2hhciAqaW52YWxpZF9zcmNfbGF5b3V0X3Z1aWQgPQorICAgICAgICAgICAgKHNyY19pbWFnZV9zdGF0ZS0+c2hhcmVkX3ByZXNlbnRhYmxlICYmIGRldmljZV9leHRlbnNpb25zLnZrX2tocl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpCisgICAgICAgICAgICAgICAgPyAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZUxheW91dC0wMTQwMCIKKyAgICAgICAgICAgICAgICA6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMjYxIjsKKyAgICAgICAgY29uc3QgY2hhciAqaW52YWxpZF9kc3RfbGF5b3V0X3Z1aWQgPQorICAgICAgICAgICAgKGRzdF9pbWFnZV9zdGF0ZS0+c2hhcmVkX3ByZXNlbnRhYmxlICYmIGRldmljZV9leHRlbnNpb25zLnZrX2tocl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UpCisgICAgICAgICAgICAgICAgPyAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZUxheW91dC0wMTQwMSIKKyAgICAgICAgICAgICAgICA6ICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlTGF5b3V0LTAwMjYzIjsKKyAgICAgICAgLy8gRm9yIGVhY2ggcmVnaW9uLCB0aGUgbnVtYmVyIG9mIGxheWVycyBpbiB0aGUgaW1hZ2Ugc3VicmVzb3VyY2Ugc2hvdWxkIG5vdCBiZSB6ZXJvCisgICAgICAgIC8vIEZvciBlYWNoIHJlZ2lvbiwgc3JjIGFuZCBkZXN0IGltYWdlIGFzcGVjdCBtdXN0IGJlIGNvbG9yIG9ubHkKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlZ2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUltYWdlU3VicmVzb3VyY2VMYXllcnMoY2Jfbm9kZSwgJnBSZWdpb25zW2ldLnNyY1N1YnJlc291cmNlLCAidmtDbWRSZXNvbHZlSW1hZ2UoKSIsICJzcmNTdWJyZXNvdXJjZSIsIGkpOworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIFZhbGlkYXRlSW1hZ2VTdWJyZXNvdXJjZUxheWVycyhjYl9ub2RlLCAmcFJlZ2lvbnNbaV0uZHN0U3VicmVzb3VyY2UsICJ2a0NtZFJlc29sdmVJbWFnZSgpIiwgImRzdFN1YnJlc291cmNlIiwgaSk7CisgICAgICAgICAgICBza2lwIHw9IFZlcmlmeUltYWdlTGF5b3V0KGNiX25vZGUsIHNyY19pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uc3JjU3VicmVzb3VyY2UsIHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsICJ2a0NtZFJlc29sdmVJbWFnZSgpIiwgaW52YWxpZF9zcmNfbGF5b3V0X3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMjYwIiwgJmhpdF9lcnJvcik7CisgICAgICAgICAgICBza2lwIHw9IFZlcmlmeUltYWdlTGF5b3V0KGNiX25vZGUsIGRzdF9pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uZHN0U3VicmVzb3VyY2UsIGRzdEltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsICJ2a0NtZFJlc29sdmVJbWFnZSgpIiwgaW52YWxpZF9kc3RfbGF5b3V0X3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlTGF5b3V0LTAwMjYyIiwgJmhpdF9lcnJvcik7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VNaXBMZXZlbChjYl9ub2RlLCBzcmNfaW1hZ2Vfc3RhdGUsIHBSZWdpb25zW2ldLnNyY1N1YnJlc291cmNlLm1pcExldmVsLCBpLCAidmtDbWRSZXNvbHZlSW1hZ2UoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjU3VicmVzb3VyY2UiLCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTcwOSIpOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlTWlwTGV2ZWwoY2Jfbm9kZSwgZHN0X2ltYWdlX3N0YXRlLCBwUmVnaW9uc1tpXS5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCwgaSwgInZrQ21kUmVzb2x2ZUltYWdlKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzdFN1YnJlc291cmNlIiwgIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE3MTAiKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUFycmF5TGF5ZXJSYW5nZShjYl9ub2RlLCBzcmNfaW1hZ2Vfc3RhdGUsIHBSZWdpb25zW2ldLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zW2ldLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQsIGksICJ2a0NtZFJlc29sdmVJbWFnZSgpIiwgInNyY1N1YnJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTcxMSIpOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlQXJyYXlMYXllclJhbmdlKGNiX25vZGUsIGRzdF9pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnNbaV0uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCwgaSwgInZrQ21kUmVzb2x2ZUltYWdlKCkiLCAic3JjU3VicmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdFN1YnJlc291cmNlLTAxNzEyIik7CisKKyAgICAgICAgICAgIC8vIGxheWVyIGNvdW50cyBtdXN0IG1hdGNoCisgICAgICAgICAgICBpZiAocFJlZ2lvbnNbaV0uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCAhPSBwUmVnaW9uc1tpXS5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1sYXllckNvdW50LTAwMjY3IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ21kUmVzb2x2ZUltYWdlKCk6IGxheWVyQ291bnQgaW4gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdWJyZXNvdXJjZSBvZiBwUmVnaW9uc1slZF0gZG9lcyBub3QgbWF0Y2guIiwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGb3IgZWFjaCByZWdpb24sIHNyYyBhbmQgZGVzdCBpbWFnZSBhc3BlY3QgbXVzdCBiZSBjb2xvciBvbmx5CisgICAgICAgICAgICBpZiAoKHBSZWdpb25zW2ldLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgIT0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCkgfHwKKyAgICAgICAgICAgICAgICAocFJlZ2lvbnNbaV0uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayAhPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUKSkgeworICAgICAgICAgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPQorICAgICAgICAgICAgICAgICAgICAidmtDbWRSZXNvbHZlSW1hZ2UoKTogc3JjIGFuZCBkZXN0IGFzcGVjdE1hc2tzIGZvciBlYWNoIHJlZ2lvbiBtdXN0IHNwZWNpZnkgb25seSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtJbWFnZVJlc29sdmUtYXNwZWN0TWFzay0wMDI2NiIsICIlcy4iLCBzdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQgIT0gZHN0X2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkgeworICAgICAgICAgICAgY2hhciBjb25zdCBzdHJbXSA9ICJ2a0NtZFJlc29sdmVJbWFnZSBjYWxsZWQgd2l0aCB1bm1hdGNoZWQgc291cmNlIGFuZCBkZXN0IGZvcm1hdHMuIjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfTWlzbWF0Y2hlZEltYWdlRm9ybWF0LCBzdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChzcmNfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlICE9IGRzdF9pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUpIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRSZXNvbHZlSW1hZ2UgY2FsbGVkIHdpdGggdW5tYXRjaGVkIHNvdXJjZSBhbmQgZGVzdCBpbWFnZSB0eXBlcy4iOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9NaXNtYXRjaGVkSW1hZ2VUeXBlLCBzdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChzcmNfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uc2FtcGxlcyA9PSBWS19TQU1QTEVfQ09VTlRfMV9CSVQpIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3Qgc3RyW10gPSAidmtDbWRSZXNvbHZlSW1hZ2UgY2FsbGVkIHdpdGggc291cmNlIHNhbXBsZSBjb3VudCBsZXNzIHRoYW4gMi4iOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2UtMDAyNTciLCAiJXMuIiwgc3RyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHN0X2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLnNhbXBsZXMgIT0gVktfU0FNUExFX0NPVU5UXzFfQklUKSB7CisgICAgICAgICAgICBjaGFyIGNvbnN0IHN0cltdID0gInZrQ21kUmVzb2x2ZUltYWdlIGNhbGxlZCB3aXRoIGRlc3Qgc2FtcGxlIGNvdW50IGdyZWF0ZXIgdGhhbiAxLiI7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZS0wMDI1OSIsICIlcy4iLCBzdHIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KDApOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRCbGl0SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VCbGl0ICpwUmVnaW9ucywgVmtGaWx0ZXIgZmlsdGVyKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAqY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY29uc3QgYXV0byAqc3JjX2ltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShzcmNJbWFnZSk7CisgICAgY29uc3QgYXV0byAqZHN0X2ltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShkc3RJbWFnZSk7CisKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoY2Jfbm9kZSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX25vZGUsIENNRF9CTElUSU1BR0UsICJ2a0NtZEJsaXRJbWFnZSgpIik7CisgICAgfQorICAgIGlmIChjYl9ub2RlICYmIHNyY19pbWFnZV9zdGF0ZSAmJiBkc3RfaW1hZ2Vfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlU2FtcGxlQ291bnQoc3JjX2ltYWdlX3N0YXRlLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsICJ2a0NtZEJsaXRJbWFnZSgpOiBzcmNJbWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjMzIik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZVNhbXBsZUNvdW50KGRzdF9pbWFnZV9zdGF0ZSwgVktfU0FNUExFX0NPVU5UXzFfQklULCAidmtDbWRCbGl0SW1hZ2UoKTogZHN0SW1hZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMDIzNCIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvSW1hZ2Uoc3JjX2ltYWdlX3N0YXRlLCAidmtDbWRCbGl0SW1hZ2UoKSIsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjIwIik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9JbWFnZShkc3RfaW1hZ2Vfc3RhdGUsICJ2a0NtZEJsaXRJbWFnZSgpIiwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDAyMjUiKTsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgVmFsaWRhdGVJbWFnZVVzYWdlRmxhZ3Moc3JjX2ltYWdlX3N0YXRlLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULCB0cnVlLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIxOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKSIsICJWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIik7CisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIFZhbGlkYXRlSW1hZ2VVc2FnZUZsYWdzKGRzdF9pbWFnZV9zdGF0ZSwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgdHJ1ZSwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDAyMjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCkiLCAiVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCIpOworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfbm9kZSwgInZrQ21kQmxpdEltYWdlKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsICJWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX25vZGUsIENNRF9CTElUSU1BR0UsICJ2a0NtZEJsaXRJbWFnZSgpIik7CisgICAgICAgIHNraXAgfD0gSW5zaWRlUmVuZGVyUGFzcyhjYl9ub2RlLCAidmtDbWRCbGl0SW1hZ2UoKSIsICJWVUlELXZrQ21kQmxpdEltYWdlLXJlbmRlcnBhc3MiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlRm9ybWF0RmVhdHVyZUZsYWdzKHNyY19pbWFnZV9zdGF0ZSwgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9TUkNfQklULCAidmtDbWRCbGl0SW1hZ2UoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMTk5OSIsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAxOTk5Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUZvcm1hdEZlYXR1cmVGbGFncyhkc3RfaW1hZ2Vfc3RhdGUsIFZLX0ZPUk1BVF9GRUFUVVJFX0JMSVRfRFNUX0JJVCwgInZrQ21kQmxpdEltYWdlKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDIwMDAiLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMjAwMCIpOworCisgICAgICAgIC8vIFRPRE86IE5lZWQgdG8gdmFsaWRhdGUgaW1hZ2UgbGF5b3V0cywgd2hpY2ggd2lsbCBpbmNsdWRlIGxheW91dCB2YWxpZGF0aW9uIGZvciBzaGFyZWQgcHJlc2VudGFibGUgaW1hZ2VzCisKKyAgICAgICAgVmtGb3JtYXQgc3JjX2Zvcm1hdCA9IHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQ7CisgICAgICAgIFZrRm9ybWF0IGRzdF9mb3JtYXQgPSBkc3RfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0OworICAgICAgICBWa0ltYWdlVHlwZSBzcmNfdHlwZSA9IHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGU7CisgICAgICAgIFZrSW1hZ2VUeXBlIGRzdF90eXBlID0gZHN0X2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZTsKKworICAgICAgICBpZiAoVktfRklMVEVSX0xJTkVBUiA9PSBmaWx0ZXIpIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUZvcm1hdEZlYXR1cmVGbGFncyhzcmNfaW1hZ2Vfc3RhdGUsIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCkiLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItMDIwMDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmxpdEltYWdlLWZpbHRlci0wMjAwMSIpOworICAgICAgICB9IGVsc2UgaWYgKFZLX0ZJTFRFUl9DVUJJQ19JTUcgPT0gZmlsdGVyKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VGb3JtYXRGZWF0dXJlRmxhZ3Moc3JjX2ltYWdlX3N0YXRlLCBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfSU1HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJsaXRJbWFnZSgpIiwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZmlsdGVyLTAyMDAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItMDIwMDIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoVktfRklMVEVSX0NVQklDX0lNRyA9PSBmaWx0ZXIpICYmIChWS19JTUFHRV9UWVBFXzNEICE9IHNyY190eXBlKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZmlsdGVyLTAwMjM3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogc291cmNlIGltYWdlIHR5cGUgbXVzdCBiZSBWS19JTUFHRV9UWVBFXzNEIHdoZW4gY3ViaWMgZmlsdGVyaW5nIGlzIHNwZWNpZmllZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoVktfU0FNUExFX0NPVU5UXzFfQklUICE9IHNyY19pbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5zYW1wbGVzKSB8fAorICAgICAgICAgICAgKFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAhPSBkc3RfaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uc2FtcGxlcykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogc291cmNlIG9yIGRlc3QgaW1hZ2UgaGFzIHNhbXBsZSBjb3VudCBvdGhlciB0aGFuIFZLX1NBTVBMRV9DT1VOVF8xX0JJVC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIGNvbnNpc3RlbmN5IGZvciB1bnNpZ25lZCBmb3JtYXRzCisgICAgICAgIGlmIChGb3JtYXRJc1VJbnQoc3JjX2Zvcm1hdCkgIT0gRm9ybWF0SXNVSW50KGRzdF9mb3JtYXQpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8ICJ2a0NtZEJsaXRJbWFnZSgpOiBJZiBvbmUgb2Ygc3JjSW1hZ2UgYW5kIGRzdEltYWdlIGltYWdlcyBoYXMgdW5zaWduZWQgaW50ZWdlciBmb3JtYXQsICIKKyAgICAgICAgICAgICAgIDw8ICJ0aGUgb3RoZXIgb25lIG11c3QgYWxzbyBoYXZlIHVuc2lnbmVkIGludGVnZXIgZm9ybWF0LiAgIgorICAgICAgICAgICAgICAgPDwgIlNvdXJjZSBmb3JtYXQgaXMgIiA8PCBzdHJpbmdfVmtGb3JtYXQoc3JjX2Zvcm1hdCkgPDwgIiBEZXN0aW5hdGlvbiBmb3JtYXQgaXMgIiA8PCBzdHJpbmdfVmtGb3JtYXQoZHN0X2Zvcm1hdCk7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMCIsICIlcy4iLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIGNvbnNpc3RlbmN5IGZvciBzaWduZWQgZm9ybWF0cworICAgICAgICBpZiAoRm9ybWF0SXNTSW50KHNyY19mb3JtYXQpICE9IEZvcm1hdElzU0ludChkc3RfZm9ybWF0KSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCAidmtDbWRCbGl0SW1hZ2UoKTogSWYgb25lIG9mIHNyY0ltYWdlIGFuZCBkc3RJbWFnZSBpbWFnZXMgaGFzIHNpZ25lZCBpbnRlZ2VyIGZvcm1hdCwgIgorICAgICAgICAgICAgICAgPDwgInRoZSBvdGhlciBvbmUgbXVzdCBhbHNvIGhhdmUgc2lnbmVkIGludGVnZXIgZm9ybWF0LiAgIgorICAgICAgICAgICAgICAgPDwgIlNvdXJjZSBmb3JtYXQgaXMgIiA8PCBzdHJpbmdfVmtGb3JtYXQoc3JjX2Zvcm1hdCkgPDwgIiBEZXN0aW5hdGlvbiBmb3JtYXQgaXMgIiA8PCBzdHJpbmdfVmtGb3JtYXQoZHN0X2Zvcm1hdCk7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIyOSIsICIlcy4iLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIGZpbHRlciBmb3IgRGVwdGgvU3RlbmNpbCBmb3JtYXRzCisgICAgICAgIGlmIChGb3JtYXRJc0RlcHRoT3JTdGVuY2lsKHNyY19mb3JtYXQpICYmIChmaWx0ZXIgIT0gVktfRklMVEVSX05FQVJFU1QpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8ICJ2a0NtZEJsaXRJbWFnZSgpOiBJZiB0aGUgZm9ybWF0IG9mIHNyY0ltYWdlIGlzIGEgZGVwdGgsIHN0ZW5jaWwsIG9yIGRlcHRoIHN0ZW5jaWwgIgorICAgICAgICAgICAgICAgPDwgInRoZW4gZmlsdGVyIG11c3QgYmUgVktfRklMVEVSX05FQVJFU1QuIjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjMyIiwgIiVzLiIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYXNwZWN0IGJpdHMgYW5kIGZvcm1hdHMgZm9yIGRlcHRoL3N0ZW5jaWwgaW1hZ2VzCisgICAgICAgIGlmIChGb3JtYXRJc0RlcHRoT3JTdGVuY2lsKHNyY19mb3JtYXQpIHx8IEZvcm1hdElzRGVwdGhPclN0ZW5jaWwoZHN0X2Zvcm1hdCkpIHsKKyAgICAgICAgICAgIGlmIChzcmNfZm9ybWF0ICE9IGRzdF9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCAidmtDbWRCbGl0SW1hZ2UoKTogSWYgb25lIG9mIHNyY0ltYWdlIGFuZCBkc3RJbWFnZSBpbWFnZXMgaGFzIGEgZm9ybWF0IG9mIGRlcHRoLCBzdGVuY2lsIG9yIGRlcHRoICIKKyAgICAgICAgICAgICAgICAgICA8PCAic3RlbmNpbCwgdGhlIG90aGVyIG9uZSBtdXN0IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBmb3JtYXQuICAiCisgICAgICAgICAgICAgICAgICAgPDwgIlNvdXJjZSBmb3JtYXQgaXMgIiA8PCBzdHJpbmdfVmtGb3JtYXQoc3JjX2Zvcm1hdCkgPDwgIiBEZXN0aW5hdGlvbiBmb3JtYXQgaXMgIgorICAgICAgICAgICAgICAgICAgIDw8IHN0cmluZ19Wa0Zvcm1hdChkc3RfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMSIsICIlcy4iLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgLy8gRGVwdGggb3IgU3RlbmNpbAorCisgICAgICAgIC8vIERvIHBlci1yZWdpb24gY2hlY2tzCisgICAgICAgIGNvbnN0IGNoYXIgKmludmFsaWRfc3JjX2xheW91dF92dWlkID0KKyAgICAgICAgICAgIChzcmNfaW1hZ2Vfc3RhdGUtPnNoYXJlZF9wcmVzZW50YWJsZSAmJiBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKQorICAgICAgICAgICAgICAgID8gIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDEzOTgiCisgICAgICAgICAgICAgICAgOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZUxheW91dC0wMDIyMiI7CisgICAgICAgIGNvbnN0IGNoYXIgKmludmFsaWRfZHN0X2xheW91dF92dWlkID0KKyAgICAgICAgICAgIChkc3RfaW1hZ2Vfc3RhdGUtPnNoYXJlZF9wcmVzZW50YWJsZSAmJiBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKQorICAgICAgICAgICAgICAgID8gIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDEzOTkiCisgICAgICAgICAgICAgICAgOiAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZUxheW91dC0wMDIyNyI7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBWa0ltYWdlQmxpdCByZ24gPSBwUmVnaW9uc1tpXTsKKyAgICAgICAgICAgIGJvb2wgaGl0X2Vycm9yID0gZmFsc2U7CisgICAgICAgICAgICBza2lwIHw9IFZlcmlmeUltYWdlTGF5b3V0KGNiX25vZGUsIHNyY19pbWFnZV9zdGF0ZSwgcmduLnNyY1N1YnJlc291cmNlLCBzcmNJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLCAidmtDbWRCbGl0SW1hZ2UoKSIsIGludmFsaWRfc3JjX2xheW91dF92dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZUxheW91dC0wMDIyMSIsICZoaXRfZXJyb3IpOworICAgICAgICAgICAgc2tpcCB8PSBWZXJpZnlJbWFnZUxheW91dChjYl9ub2RlLCBkc3RfaW1hZ2Vfc3RhdGUsIHJnbi5kc3RTdWJyZXNvdXJjZSwgZHN0SW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgInZrQ21kQmxpdEltYWdlKCkiLCBpbnZhbGlkX2RzdF9sYXlvdXRfdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAyMjYiLCAmaGl0X2Vycm9yKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZVN1YnJlc291cmNlTGF5ZXJzKGNiX25vZGUsICZyZ24uc3JjU3VicmVzb3VyY2UsICJ2a0NtZEJsaXRJbWFnZSgpIiwgInNyY1N1YnJlc291cmNlIiwgaSk7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VTdWJyZXNvdXJjZUxheWVycyhjYl9ub2RlLCAmcmduLmRzdFN1YnJlc291cmNlLCAidmtDbWRCbGl0SW1hZ2UoKSIsICJkc3RTdWJyZXNvdXJjZSIsIGkpOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlTWlwTGV2ZWwoY2Jfbm9kZSwgc3JjX2ltYWdlX3N0YXRlLCByZ24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwsIGksICJ2a0NtZEJsaXRJbWFnZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmNTdWJyZXNvdXJjZSIsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY1N1YnJlc291cmNlLTAxNzA1Iik7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VNaXBMZXZlbChjYl9ub2RlLCBkc3RfaW1hZ2Vfc3RhdGUsIHJnbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCwgaSwgInZrQ21kQmxpdEltYWdlKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzdFN1YnJlc291cmNlIiwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE3MDYiKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUFycmF5TGF5ZXJSYW5nZShjYl9ub2RlLCBzcmNfaW1hZ2Vfc3RhdGUsIHJnbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCwgaSwgInZrQ21kQmxpdEltYWdlKCkiLCAic3JjU3VicmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY1N1YnJlc291cmNlLTAxNzA3Iik7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VBcnJheUxheWVyUmFuZ2UoY2Jfbm9kZSwgZHN0X2ltYWdlX3N0YXRlLCByZ24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmduLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQsIGksICJ2a0NtZEJsaXRJbWFnZSgpIiwgImRzdFN1YnJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RTdWJyZXNvdXJjZS0wMTcwOCIpOworICAgICAgICAgICAgLy8gV2FybiBmb3IgemVyby1zaXplZCByZWdpb25zCisgICAgICAgICAgICBpZiAoKHJnbi5zcmNPZmZzZXRzWzBdLnggPT0gcmduLnNyY09mZnNldHNbMV0ueCkgfHwgKHJnbi5zcmNPZmZzZXRzWzBdLnkgPT0gcmduLnNyY09mZnNldHNbMV0ueSkgfHwKKyAgICAgICAgICAgICAgICAocmduLnNyY09mZnNldHNbMF0ueiA9PSByZ24uc3JjT2Zmc2V0c1sxXS56KSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgIHNzIDw8ICJ2a0NtZEJsaXRJbWFnZSgpOiBwUmVnaW9uc1siIDw8IGkgPDwgIl0uc3JjT2Zmc2V0cyBzcGVjaWZ5IGEgemVyby12b2x1bWUgYXJlYS4iOworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEV4dGVudHMsICIlcyIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChyZ24uZHN0T2Zmc2V0c1swXS54ID09IHJnbi5kc3RPZmZzZXRzWzFdLngpIHx8IChyZ24uZHN0T2Zmc2V0c1swXS55ID09IHJnbi5kc3RPZmZzZXRzWzFdLnkpIHx8CisgICAgICAgICAgICAgICAgKHJnbi5kc3RPZmZzZXRzWzBdLnogPT0gcmduLmRzdE9mZnNldHNbMV0ueikpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCAidmtDbWRCbGl0SW1hZ2UoKTogcFJlZ2lvbnNbIiA8PCBpIDw8ICJdLmRzdE9mZnNldHMgc3BlY2lmeSBhIHplcm8tdm9sdW1lIGFyZWEuIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRFeHRlbnRzLCAiJXMiLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBzcmMvZHN0IGxheWVyY291bnRzIG1hdGNoCisgICAgICAgICAgICBpZiAocmduLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgIT0gcmduLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VCbGl0LWxheWVyQ291bnQtMDAyMzkiLAorICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogbGF5ZXJDb3VudCBpbiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN1YnJlc291cmNlIG9mIHBSZWdpb25zWyVkXSBkb2VzIG5vdCBtYXRjaC4iLCBpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJnbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrICE9IHJnbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VCbGl0LWFzcGVjdE1hc2stMDAyMzgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogYXNwZWN0TWFzayBtZW1iZXJzIGZvciBwUmVnaW9uWyVkXSBkbyBub3QgbWF0Y2guIiwgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghVmVyaWZ5QXNwZWN0c1ByZXNlbnQocmduLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2ssIHNyY19mb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VCbGl0LWFzcGVjdE1hc2stMDAyNDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogcmVnaW9uIFslZF0gc291cmNlIGFzcGVjdE1hc2sgKDB4JXgpIHNwZWNpZmllcyBhc3BlY3RzIG5vdCBwcmVzZW50IGluIHNvdXJjZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZSBmb3JtYXQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmduLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2ssIHN0cmluZ19Wa0Zvcm1hdChzcmNfZm9ybWF0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghVmVyaWZ5QXNwZWN0c1ByZXNlbnQocmduLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2ssIGRzdF9mb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0ltYWdlQmxpdC1hc3BlY3RNYXNrLTAwMjQyIiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCk6IHJlZ2lvbiBbJWRdIGRlc3QgYXNwZWN0TWFzayAoMHgleCkgc3BlY2lmaWVzIGFzcGVjdHMgbm90IHByZXNlbnQgaW4gZGVzdCBpbWFnZSBmb3JtYXQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgcmduLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2ssIHN0cmluZ19Wa0Zvcm1hdChkc3RfZm9ybWF0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIHNvdXJjZSBpbWFnZSBvZmZzZXRzCisgICAgICAgICAgICBWa0V4dGVudDNEIHNyY19leHRlbnQgPSBHZXRJbWFnZVN1YnJlc291cmNlRXh0ZW50KHNyY19pbWFnZV9zdGF0ZSwgJihyZ24uc3JjU3VicmVzb3VyY2UpKTsKKyAgICAgICAgICAgIGlmIChWS19JTUFHRV9UWVBFXzFEID09IHNyY190eXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCgwICE9IHJnbi5zcmNPZmZzZXRzWzBdLnkpIHx8ICgxICE9IHJnbi5zcmNPZmZzZXRzWzFdLnkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtJbWFnZUJsaXQtc3JjSW1hZ2UtMDAyNDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogcmVnaW9uIFslZF0sIHNvdXJjZSBpbWFnZSBvZiB0eXBlIFZLX0lNQUdFX1RZUEVfMUQgd2l0aCBzcmNPZmZzZXRbXS55IHZhbHVlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiAoJTFkLCAlMWQpLiBUaGVzZSBtdXN0IGJlICgwLCAxKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZ24uc3JjT2Zmc2V0c1swXS55LCByZ24uc3JjT2Zmc2V0c1sxXS55KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoVktfSU1BR0VfVFlQRV8xRCA9PSBzcmNfdHlwZSkgfHwgKFZLX0lNQUdFX1RZUEVfMkQgPT0gc3JjX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCgwICE9IHJnbi5zcmNPZmZzZXRzWzBdLnopIHx8ICgxICE9IHJnbi5zcmNPZmZzZXRzWzFdLnopKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtJbWFnZUJsaXQtc3JjSW1hZ2UtMDAyNDciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCk6IHJlZ2lvbiBbJWRdLCBzb3VyY2UgaW1hZ2Ugb2YgdHlwZSBWS19JTUFHRV9UWVBFXzFEIG9yIFZLX0lNQUdFX1RZUEVfMkQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjT2Zmc2V0W10ueiB2YWx1ZXMgb2YgKCUxZCwgJTFkKS4gVGhlc2UgbXVzdCBiZSAoMCwgMSkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJnbi5zcmNPZmZzZXRzWzBdLnosIHJnbi5zcmNPZmZzZXRzWzFdLnopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvb2IgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICgocmduLnNyY09mZnNldHNbMF0ueCA8IDApIHx8IChyZ24uc3JjT2Zmc2V0c1swXS54ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3JjX2V4dGVudC53aWR0aCkpIHx8CisgICAgICAgICAgICAgICAgKHJnbi5zcmNPZmZzZXRzWzFdLnggPCAwKSB8fCAocmduLnNyY09mZnNldHNbMV0ueCA+IHN0YXRpY19jYXN0PGludDMyX3Q+KHNyY19leHRlbnQud2lkdGgpKSkgeworICAgICAgICAgICAgICAgIG9vYiA9IHRydWU7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0ltYWdlQmxpdC1zcmNPZmZzZXQtMDAyNDMiLAorICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogcmVnaW9uIFslZF0gc3JjT2Zmc2V0W10ueCB2YWx1ZXMgKCUxZCwgJTFkKSBleGNlZWQgc3JjU3VicmVzb3VyY2Ugd2lkdGggZXh0ZW50ICglMWQpLiIsIGksCisgICAgICAgICAgICAgICAgICAgIHJnbi5zcmNPZmZzZXRzWzBdLngsIHJnbi5zcmNPZmZzZXRzWzFdLngsIHNyY19leHRlbnQud2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChyZ24uc3JjT2Zmc2V0c1swXS55IDwgMCkgfHwgKHJnbi5zcmNPZmZzZXRzWzBdLnkgPiBzdGF0aWNfY2FzdDxpbnQzMl90PihzcmNfZXh0ZW50LmhlaWdodCkpIHx8CisgICAgICAgICAgICAgICAgKHJnbi5zcmNPZmZzZXRzWzFdLnkgPCAwKSB8fCAocmduLnNyY09mZnNldHNbMV0ueSA+IHN0YXRpY19jYXN0PGludDMyX3Q+KHNyY19leHRlbnQuaGVpZ2h0KSkpIHsKKyAgICAgICAgICAgICAgICBvb2IgPSB0cnVlOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtJbWFnZUJsaXQtc3JjT2Zmc2V0LTAwMjQ0IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCk6IHJlZ2lvbiBbJWRdIHNyY09mZnNldFtdLnkgdmFsdWVzICglMWQsICUxZCkgZXhjZWVkIHNyY1N1YnJlc291cmNlIGhlaWdodCBleHRlbnQgKCUxZCkuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgcmduLnNyY09mZnNldHNbMF0ueSwgcmduLnNyY09mZnNldHNbMV0ueSwgc3JjX2V4dGVudC5oZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChyZ24uc3JjT2Zmc2V0c1swXS56IDwgMCkgfHwgKHJnbi5zcmNPZmZzZXRzWzBdLnogPiBzdGF0aWNfY2FzdDxpbnQzMl90PihzcmNfZXh0ZW50LmRlcHRoKSkgfHwKKyAgICAgICAgICAgICAgICAocmduLnNyY09mZnNldHNbMV0ueiA8IDApIHx8IChyZ24uc3JjT2Zmc2V0c1sxXS56ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3JjX2V4dGVudC5kZXB0aCkpKSB7CisgICAgICAgICAgICAgICAgb29iID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VCbGl0LXNyY09mZnNldC0wMDI0NiIsCisgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJsaXRJbWFnZSgpOiByZWdpb24gWyVkXSBzcmNPZmZzZXRbXS56IHZhbHVlcyAoJTFkLCAlMWQpIGV4Y2VlZCBzcmNTdWJyZXNvdXJjZSBkZXB0aCBleHRlbnQgKCUxZCkuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgcmduLnNyY09mZnNldHNbMF0ueiwgcmduLnNyY09mZnNldHNbMV0ueiwgc3JjX2V4dGVudC5kZXB0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob29iKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQmxpdEltYWdlLXBSZWdpb25zLTAwMjE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCk6IHJlZ2lvbiBbJWRdIHNvdXJjZSBpbWFnZSBibGl0IHJlZ2lvbiBleGNlZWRzIGltYWdlIGRpbWVuc2lvbnMuIiwgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIGRlc3QgaW1hZ2Ugb2Zmc2V0cworICAgICAgICAgICAgVmtFeHRlbnQzRCBkc3RfZXh0ZW50ID0gR2V0SW1hZ2VTdWJyZXNvdXJjZUV4dGVudChkc3RfaW1hZ2Vfc3RhdGUsICYocmduLmRzdFN1YnJlc291cmNlKSk7CisgICAgICAgICAgICBpZiAoVktfSU1BR0VfVFlQRV8xRCA9PSBkc3RfdHlwZSkgeworICAgICAgICAgICAgICAgIGlmICgoMCAhPSByZ24uZHN0T2Zmc2V0c1swXS55KSB8fCAoMSAhPSByZ24uZHN0T2Zmc2V0c1sxXS55KSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VCbGl0LWRzdEltYWdlLTAwMjUwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCk6IHJlZ2lvbiBbJWRdLCBkZXN0IGltYWdlIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCB3aXRoIGRzdE9mZnNldFtdLnkgdmFsdWVzIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglMWQsICUxZCkuIFRoZXNlIG11c3QgYmUgKDAsIDEpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJnbi5kc3RPZmZzZXRzWzBdLnksIHJnbi5kc3RPZmZzZXRzWzFdLnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChWS19JTUFHRV9UWVBFXzFEID09IGRzdF90eXBlKSB8fCAoVktfSU1BR0VfVFlQRV8yRCA9PSBkc3RfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKDAgIT0gcmduLmRzdE9mZnNldHNbMF0ueikgfHwgKDEgIT0gcmduLmRzdE9mZnNldHNbMV0ueikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0ltYWdlQmxpdC1kc3RJbWFnZS0wMDI1MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogcmVnaW9uIFslZF0sIGRlc3QgaW1hZ2Ugb2YgdHlwZSBWS19JTUFHRV9UWVBFXzFEIG9yIFZLX0lNQUdFX1RZUEVfMkQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHN0T2Zmc2V0W10ueiB2YWx1ZXMgb2YgKCUxZCwgJTFkKS4gVGhlc2UgbXVzdCBiZSAoMCwgMSkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJnbi5kc3RPZmZzZXRzWzBdLnosIHJnbi5kc3RPZmZzZXRzWzFdLnopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb29iID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoKHJnbi5kc3RPZmZzZXRzWzBdLnggPCAwKSB8fCAocmduLmRzdE9mZnNldHNbMF0ueCA+IHN0YXRpY19jYXN0PGludDMyX3Q+KGRzdF9leHRlbnQud2lkdGgpKSB8fAorICAgICAgICAgICAgICAgIChyZ24uZHN0T2Zmc2V0c1sxXS54IDwgMCkgfHwgKHJnbi5kc3RPZmZzZXRzWzFdLnggPiBzdGF0aWNfY2FzdDxpbnQzMl90Pihkc3RfZXh0ZW50LndpZHRoKSkpIHsKKyAgICAgICAgICAgICAgICBvb2IgPSB0cnVlOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtJbWFnZUJsaXQtZHN0T2Zmc2V0LTAwMjQ4IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCk6IHJlZ2lvbiBbJWRdIGRzdE9mZnNldFtdLnggdmFsdWVzICglMWQsICUxZCkgZXhjZWVkIGRzdFN1YnJlc291cmNlIHdpZHRoIGV4dGVudCAoJTFkKS4iLCBpLAorICAgICAgICAgICAgICAgICAgICByZ24uZHN0T2Zmc2V0c1swXS54LCByZ24uZHN0T2Zmc2V0c1sxXS54LCBkc3RfZXh0ZW50LndpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmduLmRzdE9mZnNldHNbMF0ueSA8IDApIHx8IChyZ24uZHN0T2Zmc2V0c1swXS55ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZHN0X2V4dGVudC5oZWlnaHQpKSB8fAorICAgICAgICAgICAgICAgIChyZ24uZHN0T2Zmc2V0c1sxXS55IDwgMCkgfHwgKHJnbi5kc3RPZmZzZXRzWzFdLnkgPiBzdGF0aWNfY2FzdDxpbnQzMl90Pihkc3RfZXh0ZW50LmhlaWdodCkpKSB7CisgICAgICAgICAgICAgICAgb29iID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VCbGl0LWRzdE9mZnNldC0wMDI0OSIsCisgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJsaXRJbWFnZSgpOiByZWdpb24gWyVkXSBkc3RPZmZzZXRbXS55IHZhbHVlcyAoJTFkLCAlMWQpIGV4Y2VlZCBkc3RTdWJyZXNvdXJjZSBoZWlnaHQgZXh0ZW50ICglMWQpLiIsIGksCisgICAgICAgICAgICAgICAgICAgIHJnbi5kc3RPZmZzZXRzWzBdLnksIHJnbi5kc3RPZmZzZXRzWzFdLnksIGRzdF9leHRlbnQuaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmduLmRzdE9mZnNldHNbMF0ueiA8IDApIHx8IChyZ24uZHN0T2Zmc2V0c1swXS56ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZHN0X2V4dGVudC5kZXB0aCkpIHx8CisgICAgICAgICAgICAgICAgKHJnbi5kc3RPZmZzZXRzWzFdLnogPCAwKSB8fCAocmduLmRzdE9mZnNldHNbMV0ueiA+IHN0YXRpY19jYXN0PGludDMyX3Q+KGRzdF9leHRlbnQuZGVwdGgpKSkgeworICAgICAgICAgICAgICAgIG9vYiA9IHRydWU7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0ltYWdlQmxpdC1kc3RPZmZzZXQtMDAyNTEiLAorICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogcmVnaW9uIFslZF0gZHN0T2Zmc2V0W10ueiB2YWx1ZXMgKCUxZCwgJTFkKSBleGNlZWQgZHN0U3VicmVzb3VyY2UgZGVwdGggZXh0ZW50ICglMWQpLiIsIGksCisgICAgICAgICAgICAgICAgICAgIHJnbi5kc3RPZmZzZXRzWzBdLnosIHJnbi5kc3RPZmZzZXRzWzFdLnosIGRzdF9leHRlbnQuZGVwdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9vYikgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy0wMDIxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJsaXRJbWFnZSgpOiByZWdpb24gWyVkXSBkZXN0aW5hdGlvbiBpbWFnZSBibGl0IHJlZ2lvbiBleGNlZWRzIGltYWdlIGRpbWVuc2lvbnMuIiwgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoVktfSU1BR0VfVFlQRV8zRCA9PSBzcmNfdHlwZSkgfHwgKFZLX0lNQUdFX1RZUEVfM0QgPT0gZHN0X3R5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCgwICE9IHJnbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcikgfHwgKDEgIT0gcmduLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQpIHx8CisgICAgICAgICAgICAgICAgICAgICgwICE9IHJnbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllcikgfHwgKDEgIT0gcmduLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtJbWFnZUJsaXQtc3JjSW1hZ2UtMDAyNDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKTogcmVnaW9uIFslZF0gYmxpdCB0by9mcm9tIGEgM0QgaW1hZ2UgdHlwZSB3aXRoIGEgbm9uLXplcm8gYmFzZUFycmF5TGF5ZXIsIG9yIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF5ZXJDb3VudCBvdGhlciB0aGFuIDEuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAvLyBwZXItcmVnaW9uIGNoZWNrcworICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UHJlQ2FsbFJlY29yZENtZEJsaXRJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlQmxpdCAqcFJlZ2lvbnMsIFZrRmlsdGVyIGZpbHRlcikgeworICAgIFN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZEJsaXRJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLCBmaWx0ZXIpOworICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byBzcmNfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHNyY0ltYWdlKTsKKyAgICBhdXRvIGRzdF9pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoZHN0SW1hZ2UpOworCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgYWxsIGltYWdlIHNsaWNlcyBhcmUgdXBkYXRlZCB0byBjb3JyZWN0IGxheW91dAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgKytpKSB7CisgICAgICAgIFNldEltYWdlSW5pdGlhbExheW91dChjYl9ub2RlLCAqc3JjX2ltYWdlX3N0YXRlLCBwUmVnaW9uc1tpXS5zcmNTdWJyZXNvdXJjZSwgc3JjSW1hZ2VMYXlvdXQpOworICAgICAgICBTZXRJbWFnZUluaXRpYWxMYXlvdXQoY2Jfbm9kZSwgKmRzdF9pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uZHN0U3VicmVzb3VyY2UsIGRzdEltYWdlTGF5b3V0KTsKKyAgICB9Cit9CisKKy8vIFRoaXMgdmFsaWRhdGVzIHRoYXQgdGhlIGluaXRpYWwgbGF5b3V0IHNwZWNpZmllZCBpbiB0aGUgY29tbWFuZCBidWZmZXIgZm9yIHRoZSBJTUFHRSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2xvYmFsIElNQUdFIGxheW91dAorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNtZEJ1ZkltYWdlTGF5b3V0cyhjb25zdCBDTURfQlVGRkVSX1NUQVRFICpwQ0IsIGNvbnN0IEltYWdlU3VicmVzUGFpckxheW91dE1hcCAmZ2xvYmFsSW1hZ2VMYXlvdXRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlU3VicmVzUGFpckxheW91dE1hcCAqb3ZlcmxheUxheW91dE1hcF9hcmcpIGNvbnN0IHsKKyAgICBpZiAoZGlzYWJsZWQuaW1hZ2VfbGF5b3V0X3ZhbGlkYXRpb24pIHJldHVybiBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBJbWFnZVN1YnJlc1BhaXJMYXlvdXRNYXAgJm92ZXJsYXlMYXlvdXRNYXAgPSAqb3ZlcmxheUxheW91dE1hcF9hcmc7CisgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBsYXlvdXQgbWFwcyBmb3IgZWFjaCByZWZlcmVuY2VkIGltYWdlCisgICAgZm9yIChjb25zdCBhdXRvICZsYXlvdXRfbWFwX2VudHJ5IDogcENCLT5pbWFnZV9sYXlvdXRfbWFwKSB7CisgICAgICAgIGNvbnN0IGF1dG8gaW1hZ2UgPSBsYXlvdXRfbWFwX2VudHJ5LmZpcnN0OworICAgICAgICBjb25zdCBhdXRvICppbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworICAgICAgICBpZiAoIWltYWdlX3N0YXRlKSBjb250aW51ZTsgIC8vIENhbid0IGNoZWNrIGxheW91dHMgb2YgYSBkZWFkIGltYWdlCisgICAgICAgIGNvbnN0IGF1dG8gJnN1YnJlc19tYXAgPSBsYXlvdXRfbWFwX2VudHJ5LnNlY29uZDsKKyAgICAgICAgSW1hZ2VTdWJyZXNvdXJjZVBhaXIgaXNyX3BhaXI7CisgICAgICAgIGlzcl9wYWlyLmltYWdlID0gaW1hZ2U7CisgICAgICAgIGlzcl9wYWlyLmhhc1N1YnJlc291cmNlID0gdHJ1ZTsKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGluaXRpYWxfdXNlcyBmb3IgZWFjaCBzdWJyZXNvdXJjZSByZWZlcmVuY2VkCisgICAgICAgIGZvciAoYXV0byBpdF9pbml0ID0gc3VicmVzX21hcC0+QmVnaW5Jbml0aWFsVXNlKCk7ICFpdF9pbml0LkF0RW5kKCk7ICsraXRfaW5pdCkgeworICAgICAgICAgICAgaXNyX3BhaXIuc3VicmVzb3VyY2UgPSAoKml0X2luaXQpLnN1YnJlc291cmNlOworICAgICAgICAgICAgVmtJbWFnZUxheW91dCBpbml0aWFsX2xheW91dCA9ICgqaXRfaW5pdCkubGF5b3V0OworICAgICAgICAgICAgVmtJbWFnZUxheW91dCBpbWFnZV9sYXlvdXQ7CisgICAgICAgICAgICBpZiAoRmluZExheW91dChvdmVybGF5TGF5b3V0TWFwLCBpc3JfcGFpciwgaW1hZ2VfbGF5b3V0KSB8fCBGaW5kTGF5b3V0KGdsb2JhbEltYWdlTGF5b3V0TWFwLCBpc3JfcGFpciwgaW1hZ2VfbGF5b3V0KSkgeworICAgICAgICAgICAgICAgIGlmIChpbml0aWFsX2xheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNldCBtZW1vcnkgaW52YWxpZCB3aGljaCBpcyBpbiBtZW1fdHJhY2tlciBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGltYWdlX2xheW91dCAhPSBpbml0aWFsX2xheW91dCkgeworICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGxvb2sgdXAgdGhlIGluaXRhbCBsYXlvdXQgKnN0YXRlKiB0byBnZXQgYSBiaXQgbW9yZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICppbml0aWFsX2xheW91dF9zdGF0ZSA9IHN1YnJlc19tYXAtPkdldFN1YnJlc291cmNlSW5pdGlhbExheW91dFN0YXRlKGlzcl9wYWlyLnN1YnJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGluaXRpYWxfbGF5b3V0X3N0YXRlKTsgIC8vIFRoZXJlJ3Mgbm8gd2F5IHdlIHNob3VsZCBoYXZlIGFuIGluaXRpYWwgbGF5b3V0IHdpdGhvdXQgbWF0Y2hpbmcgc3RhdGUuLi4KKyAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaGVzID0gSW1hZ2VMYXlvdXRNYXRjaGVzKGluaXRpYWxfbGF5b3V0X3N0YXRlLT5hc3BlY3RfbWFzaywgaW1hZ2VfbGF5b3V0LCBpbml0aWFsX2xheW91dCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZm9ybWF0dGVkX2xhYmVsID0gRm9ybWF0RGVidWdMYWJlbCgiICIsIHBDQi0+ZGVidWdfbGFiZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ0ItPmNvbW1hbmRCdWZmZXIpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkSW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1Ym1pdHRlZCBjb21tYW5kIGJ1ZmZlciBleHBlY3RzICVzIChzdWJyZXNvdXJjZTogYXNwZWN0TWFzayAweCVYIGFycmF5IGxheWVyICV1LCBtaXAgbGV2ZWwgJXUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gYmUgaW4gbGF5b3V0ICVzLS1pbnN0ZWFkLCBjdXJyZW50IGxheW91dCBpcyAlcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZSkuY19zdHIoKSwgaXNyX3BhaXIuc3VicmVzb3VyY2UuYXNwZWN0TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3JfcGFpci5zdWJyZXNvdXJjZS5hcnJheUxheWVyLCBpc3JfcGFpci5zdWJyZXNvdXJjZS5taXBMZXZlbCwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoaW5pdGlhbF9sYXlvdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGltYWdlX2xheW91dCksIGZvcm1hdHRlZF9sYWJlbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSBhbGwgbGF5b3V0IHNldCBvcGVyYXRpb25zICh3aGljaCB3aWxsIGJlIGEgc3Vic2V0IG9mIHRoZSBpbml0aWFsX2xheW91dHMKKyAgICAgICAgZm9yIChhdXRvIGl0X3NldCA9IHN1YnJlc19tYXAtPkJlZ2luU2V0TGF5b3V0KCk7ICFpdF9zZXQuQXRFbmQoKTsgKytpdF9zZXQpIHsKKyAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgbGF5b3V0ID0gKCppdF9zZXQpLmxheW91dDsKKyAgICAgICAgICAgIGlzcl9wYWlyLnN1YnJlc291cmNlID0gKCppdF9zZXQpLnN1YnJlc291cmNlOworICAgICAgICAgICAgU2V0TGF5b3V0KG92ZXJsYXlMYXlvdXRNYXAsIGlzcl9wYWlyLCBsYXlvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6VXBkYXRlQ21kQnVmSW1hZ2VMYXlvdXRzKENNRF9CVUZGRVJfU1RBVEUgKnBDQikgeworICAgIGZvciAoY29uc3QgYXV0byAmbGF5b3V0X21hcF9lbnRyeSA6IHBDQi0+aW1hZ2VfbGF5b3V0X21hcCkgeworICAgICAgICBjb25zdCBhdXRvIGltYWdlID0gbGF5b3V0X21hcF9lbnRyeS5maXJzdDsKKyAgICAgICAgY29uc3QgYXV0byAqaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGltYWdlKTsKKyAgICAgICAgaWYgKCFpbWFnZV9zdGF0ZSkgY29udGludWU7ICAvLyBDYW4ndCBzZXQgbGF5b3V0cyBvZiBhIGRlYWQgaW1hZ2UKKyAgICAgICAgY29uc3QgYXV0byAmc3VicmVzX21hcCA9IGxheW91dF9tYXBfZW50cnkuc2Vjb25kOworICAgICAgICBJbWFnZVN1YnJlc291cmNlUGFpciBpc3JfcGFpcjsKKyAgICAgICAgaXNyX3BhaXIuaW1hZ2UgPSBpbWFnZTsKKyAgICAgICAgaXNyX3BhaXIuaGFzU3VicmVzb3VyY2UgPSB0cnVlOworCisgICAgICAgIC8vIFVwZGF0ZSBhbGwgbGF5b3V0IHNldCBvcGVyYXRpb25zICh3aGljaCB3aWxsIGJlIGEgc3Vic2V0IG9mIHRoZSBpbml0aWFsX2xheW91dHMKKyAgICAgICAgZm9yIChhdXRvIGl0X3NldCA9IHN1YnJlc19tYXAtPkJlZ2luU2V0TGF5b3V0KCk7ICFpdF9zZXQuQXRFbmQoKTsgKytpdF9zZXQpIHsKKyAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgbGF5b3V0ID0gKCppdF9zZXQpLmxheW91dDsKKyAgICAgICAgICAgIGlzcl9wYWlyLnN1YnJlc291cmNlID0gKCppdF9zZXQpLnN1YnJlc291cmNlOworICAgICAgICAgICAgU2V0R2xvYmFsTGF5b3V0KGlzcl9wYWlyLCBsYXlvdXQpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBWYWxpZGF0ZUxheW91dFZzQXR0YWNobWVudERlc2NyaXB0aW9uIGlzIGEgZ2VuZXJhbCBmdW5jdGlvbiB3aGVyZSB3ZSBjYW4gdmFsaWRhdGUgdmFyaW91cyBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlCisvLyBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBzdHJ1Y3RzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIHN1Yi1wYXNzZXMgb2YgYSByZW5kZXJwYXNzLiBJbml0aWFsIGNoZWNrIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IFJFQURfT05MWQorLy8gbGF5b3V0IGF0dGFjaG1lbnRzIGRvbid0IGhhdmUgQ0xFQVIgYXMgdGhlaXIgbG9hZE9wLgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUxheW91dFZzQXR0YWNobWVudERlc2NyaXB0aW9uKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTGF5b3V0IGZpcnN0X2xheW91dCwgY29uc3QgdWludDMyX3QgYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgJmF0dGFjaG1lbnRfZGVzY3JpcHRpb24pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBjaGFyICp2dWlkOworICAgIGNvbnN0IGJvb2wgdXNlX3JwMiA9IChycF92ZXJzaW9uID09IFJFTkRFUl9QQVNTX1ZFUlNJT05fMik7CisKKyAgICAvLyBWZXJpZnkgdGhhdCBpbml0aWFsIGxvYWRPcCBvbiBSRUFEX09OTFkgYXR0YWNobWVudHMgaXMgbm90IENMRUFSCisgICAgaWYgKGF0dGFjaG1lbnRfZGVzY3JpcHRpb24ubG9hZE9wID09IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUikgeworICAgICAgICBpZiAodXNlX3JwMiAmJiAoKGZpcnN0X2xheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdF9sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdF9sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCkpKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBBdHRhY2htZW50cy0wMjUyMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNsZWFyIGF0dGFjaG1lbnQgJWQgd2l0aCBpbnZhbGlkIGZpcnN0IGxheW91dCAlcy4iLCBhdHRhY2htZW50LCBzdHJpbmdfVmtJbWFnZUxheW91dChmaXJzdF9sYXlvdXQpKTsKKyAgICAgICAgfSBlbHNlIGlmICghdXNlX3JwMiAmJiAoKGZpcnN0X2xheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0X2xheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMKSkpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4MzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjbGVhciBhdHRhY2htZW50ICVkIHdpdGggaW52YWxpZCBmaXJzdCBsYXlvdXQgJXMuIiwgYXR0YWNobWVudCwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoZmlyc3RfbGF5b3V0KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF0dGFjaG1lbnRfZGVzY3JpcHRpb24ubG9hZE9wID09IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUikgeworICAgICAgICBpZiAoZmlyc3RfbGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwpIHsKKyAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8ga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFJlbmRlcnBhc3MgOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMTU2NiI7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY2xlYXIgYXR0YWNobWVudCAlZCB3aXRoIGludmFsaWQgZmlyc3QgbGF5b3V0ICVzLiIsIGF0dGFjaG1lbnQsIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGZpcnN0X2xheW91dCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF0dGFjaG1lbnRfZGVzY3JpcHRpb24uc3RlbmNpbExvYWRPcCA9PSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIpIHsKKyAgICAgICAgaWYgKGZpcnN0X2xheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMKSB7CisgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/IGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRSZW5kZXJwYXNzIDogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDE1NjciOworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNsZWFyIGF0dGFjaG1lbnQgJWQgd2l0aCBpbnZhbGlkIGZpcnN0IGxheW91dCAlcy4iLCBhdHRhY2htZW50LCBzdHJpbmdfVmtJbWFnZUxheW91dChmaXJzdF9sYXlvdXQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUxheW91dHMoUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwgVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgKnBDcmVhdGVJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgY2hhciAqdnVpZDsKKyAgICBjb25zdCBib29sIHVzZV9ycDIgPSAocnBfdmVyc2lvbiA9PSBSRU5ERVJfUEFTU19WRVJTSU9OXzIpOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGZ1bmN0aW9uX25hbWUgPSB1c2VfcnAyID8gInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoKSIgOiAidmtDcmVhdGVSZW5kZXJQYXNzKCkiOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICBWa0Zvcm1hdCBmb3JtYXQgPSBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZvcm1hdDsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBpZiAoKEZvcm1hdElzQ29sb3IoZm9ybWF0KSB8fCBGb3JtYXRIYXNEZXB0aChmb3JtYXQpKSAmJgorICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0ubG9hZE9wID09IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FEKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRSZW5kZXJwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVuZGVyIHBhc3MgaGFzIGFuIGF0dGFjaG1lbnQgd2l0aCBsb2FkT3AgPT0gVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQgYW5kIGluaXRpYWxMYXlvdXQgPT0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRC4gIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IGludGVuZGVkLiAgQ29uc2lkZXIgdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSBpbnN0ZWFkIGlmIHRoZSBpbWFnZSB0cnVlbHkgaXMgdW5kZWZpbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyIHBhc3MuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoRm9ybWF0SGFzU3RlbmNpbChmb3JtYXQpICYmIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uc3RlbmNpbExvYWRPcCA9PSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUmVuZGVycGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbmRlciBwYXNzIGhhcyBhbiBhdHRhY2htZW50IHdpdGggc3RlbmNpbExvYWRPcCA9PSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCBhbmQgaW5pdGlhbExheW91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELiAgVGhpcyBpcyBwcm9iYWJseSBub3Qgd2hhdCB5b3UgaW50ZW5kZWQuICBDb25zaWRlciB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFIGluc3RlYWQgaWYgdGhlIGltYWdlIHRydWVseSBpcyB1bmRlZmluZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXIgcGFzcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRyYWNrIHdoZW4gd2UncmUgb2JzZXJ2aW5nIHRoZSBmaXJzdCB1c2Ugb2YgYW4gYXR0YWNobWVudAorICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGF0dGFjaF9maXJzdF91c2UocENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCwgdHJ1ZSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgJnN1YnBhc3MgPSBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tpXTsKKworICAgICAgICAvLyBDaGVjayBpbnB1dCBhdHRhY2htZW50cyBmaXJzdCwgc28gd2UgY2FuIGRldGVjdCBmaXJzdC11c2UtYXMtaW5wdXQgZm9yIFZVICMwMDM0OQorICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgc3VicGFzcy5pbnB1dEF0dGFjaG1lbnRDb3VudDsgKytqKSB7CisgICAgICAgICAgICBhdXRvIGF0dGFjaF9pbmRleCA9IHN1YnBhc3MucElucHV0QXR0YWNobWVudHNbal0uYXR0YWNobWVudDsKKyAgICAgICAgICAgIGlmIChhdHRhY2hfaW5kZXggPT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIGNvbnRpbnVlOworICAgICAgICAgICAgc3dpdGNoIChzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmxheW91dCkgeworICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw6CisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMOgorICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgaWRlYWwuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDoKKyAgICAgICAgICAgICAgICAgICAgLy8gTWF5IG5vdCBiZSBvcHRpbWFsLiBUT0RPOiByZWNvbnNpZGVyIHRoaXMgd2FybmluZyBiYXNlZCBvbiBvdGhlciBjb25zdHJhaW50cy4KKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkSW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBpbnB1dCBhdHRhY2htZW50IGlzIEdFTkVSQUwgYnV0IHNob3VsZCBiZSBSRUFEX09OTFlfT1BUSU1BTC4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ6CisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ6CisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1sYXlvdXQtMDMwNzciIDogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlLWxheW91dC0wMDg1NyI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXlvdXQgZm9yIGlucHV0IGF0dGFjaG1lbnQgcmVmZXJlbmNlICV1IGluIHN1YnBhc3MgJXUgaXMgJXMgYnV0IG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRFUFRIX1NURU5DSUxfUkVBRF9PTkxZLCBTSEFERVJfUkVBRF9PTkxZX09QVElNQUwsIG9yIEdFTkVSQUwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGksIHN0cmluZ19Wa0ltYWdlTGF5b3V0KHN1YnBhc3MucElucHV0QXR0YWNobWVudHNbal0ubGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOgorICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMuc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzLnNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMzEzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBpbnB1dCBhdHRhY2htZW50IHJlZmVyZW5jZSAldSBpbiBzdWJwYXNzICV1IGlzICVzIGJ1dCBtdXN0IG5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGksIHN0cmluZ19Wa0ltYWdlTGF5b3V0KHN1YnBhc3MucElucHV0QXR0YWNobWVudHNbal0ubGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VicGFzcy5wSW5wdXRBdHRhY2htZW50c1tqXS5hc3BlY3RNYXNrICYgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxheW91dCBmb3IgaW5wdXQgYXR0YWNobWVudCByZWZlcmVuY2UgJXUgaW4gc3VicGFzcyAldSBpcyAlcyBidXQgbXVzdCBub3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBpLCBzdHJpbmdfVmtJbWFnZUxheW91dChzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmxheW91dCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmFzcGVjdE1hc2sgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VicGFzcy5wSW5wdXRBdHRhY2htZW50c1tqXS5sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAqYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSPihzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLnBOZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxMYXlvdXQtMDMzMTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIHRoZSBhdHRhY2htZW50IHJlZmVyZW5jZSAldSBpbiBzdWJwYXNzICV1IHdpdGggcE5leHQgY2hhaW4gaW5zdGFuY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHN0ZW5jaWxMYXlvdXQgbWVtYmVyIGJ1dCBtdXN0IG5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVELCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGVuIHRoZSBsYXlvdXQgZm9yIGlucHV0IGF0dGFjaG1lbnQgcmVmZXJlbmNlICV1IGluIHN1YnBhc3MgJXUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiB0aGVuIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgYSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0IGluc3RhbmNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VicGFzcy5wSW5wdXRBdHRhY2htZW50c1tqXS5sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3MucElucHV0QXR0YWNobWVudHNbal0ubGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGVuIHRoZSBhc3BlY3RNYXNrIGZvciBpbnB1dCBhdHRhY2htZW50IHJlZmVyZW5jZSAldSBpbiBzdWJwYXNzICV1IGlzIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlbiB0aGUgbGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3MucElucHV0QXR0YWNobWVudHNbal0ubGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGVuIHRoZSBhc3BlY3RNYXNrIGZvciBpbnB1dCBhdHRhY2htZW50IHJlZmVyZW5jZSAldSBpbiBzdWJwYXNzICV1IGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGVuIHRoZSBsYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTCwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSOgorICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX21haW50ZW5hbmNlMikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCB0byBnZW5lcmljIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIG90aGVyIGxheW91dHMgYXJlIGFjY2VwdGFibGUKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxheW91dCBmb3IgaW5wdXQgYXR0YWNobWVudCBpcyAlcyBidXQgY2FuIG9ubHkgYmUgUkVBRF9PTkxZX09QVElNQUwgb3IgR0VORVJBTC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoc3VicGFzcy5wSW5wdXRBdHRhY2htZW50c1tqXS5sYXlvdXQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF0dGFjaF9maXJzdF91c2VbYXR0YWNoX2luZGV4XSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVMYXlvdXRWc0F0dGFjaG1lbnREZXNjcmlwdGlvbihyZXBvcnRfZGF0YSwgcnBfdmVyc2lvbiwgc3VicGFzcy5wSW5wdXRBdHRhY2htZW50c1tqXS5sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaF9pbmRleCwgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2hfaW5kZXhdKTsKKworICAgICAgICAgICAgICAgIGJvb2wgdXNlZF9hc19kZXB0aCA9CisgICAgICAgICAgICAgICAgICAgIChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ICE9IE5VTEwgJiYgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCA9PSBhdHRhY2hfaW5kZXgpOworICAgICAgICAgICAgICAgIGJvb2wgdXNlZF9hc19jb2xvciA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgayA9IDA7ICF1c2VkX2FzX2RlcHRoICYmICF1c2VkX2FzX2NvbG9yICYmIGsgPCBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50OyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlZF9hc19jb2xvciA9IChzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2tdLmF0dGFjaG1lbnQgPT0gYXR0YWNoX2luZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF1c2VkX2FzX2RlcHRoICYmICF1c2VkX2FzX2NvbG9yICYmCisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNoX2luZGV4XS5sb2FkT3AgPT0gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSKSB7CisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWxvYWRPcC0wMzA2NCIgOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1sb2FkT3AtMDA4NDYiOworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGF0dGFjaG1lbnQgJXUgaXMgZmlyc3QgdXNlZCBhcyBhbiBpbnB1dCBhdHRhY2htZW50IGluIHN1YnBhc3MgJXUgd2l0aCBsb2FkT3A9Q0xFQVIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUsIGF0dGFjaF9pbmRleCwgYXR0YWNoX2luZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRhY2hfZmlyc3RfdXNlW2F0dGFjaF9pbmRleF0gPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIGF1dG8gYXR0YWNoX2luZGV4ID0gc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXS5hdHRhY2htZW50OworICAgICAgICAgICAgaWYgKGF0dGFjaF9pbmRleCA9PSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIFRPRE86IE5lZWQgYSB3YXkgdG8gdmFsaWRhdGUgc2hhcmVkIHByZXNlbnRhYmxlIGltYWdlcyBoZXJlLCBjdXJyZW50bHkganVzdCBhbGxvd2luZworICAgICAgICAgICAgLy8gVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUgorICAgICAgICAgICAgLy8gIGFzIGFuIGFjY2VwdGFibGUgbGF5b3V0LCBidXQgbmVlZCB0byBtYWtlIHN1cmUgc2hhcmVkIHByZXNlbnRhYmxlIGltYWdlcyBPTkxZIHVzZSB0aGF0IGxheW91dAorICAgICAgICAgICAgc3dpdGNoIChzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2pdLmxheW91dCkgeworICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDoKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGlkZWFsLgorICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUjoKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogU2VlIG5vdGUgYWJvdmUsIGp1c3QgYXNzdW1pbmcgdGhhdCBhdHRhY2htZW50IGlzIHNoYXJlZCBwcmVzZW50YWJsZSBhbmQgYWxsb3dpbmcgdGhpcyBmb3Igbm93LgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw6CisgICAgICAgICAgICAgICAgICAgIC8vIE1heSBub3QgYmUgb3B0aW1hbDsgVE9ETzogcmVjb25zaWRlciB0aGlzIHdhcm5pbmcgYmFzZWQgb24gb3RoZXIgY29uc3RyYWludHM/CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxheW91dCBmb3IgY29sb3IgYXR0YWNobWVudCBpcyBHRU5FUkFMIGJ1dCBzaG91bGQgYmUgQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRDoKKyAgICAgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWxheW91dC0wMzA3NyIgOiAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UtbGF5b3V0LTAwODU3IjsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxheW91dCBmb3IgY29sb3IgYXR0YWNobWVudCByZWZlcmVuY2UgJXUgaW4gc3VicGFzcyAldSBpcyAlcyBidXQgc2hvdWxkIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgb3IgR0VORVJBTC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXS5sYXlvdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOgorICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI6CisgICAgICAgICAgICAgICAgICAgIGlmICghZW5hYmxlZF9mZWF0dXJlcy5zZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHNfZmVhdHVyZXMuc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMzMTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXlvdXQgZm9yIGNvbG9yIGF0dGFjaG1lbnQgcmVmZXJlbmNlICV1IGluIHN1YnBhc3MgJXUgaXMgJXMgYnV0IG11c3Qgbm90IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXS5sYXlvdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2pdLmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBjb2xvciBhdHRhY2htZW50IHJlZmVyZW5jZSAldSBpbiBzdWJwYXNzICV1IGlzICVzIGJ1dCBtdXN0IG5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGksIHN0cmluZ19Wa0ltYWdlTGF5b3V0KHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0ubGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0uYXNwZWN0TWFzayAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2pdLmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0ubGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICphdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFI+KHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0ucE5leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbExheW91dC0wMzMxOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW4gdGhlIGF0dGFjaG1lbnQgcmVmZXJlbmNlICV1IGluIHN1YnBhc3MgJXUgd2l0aCBwTmV4dCBjaGFpbiBpbnN0YW5jZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgc3RlbmNpbExheW91dCBtZW1iZXIgYnV0IG11c3Qgbm90IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELCBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoZW4gdGhlIGxheW91dCBmb3IgY29sb3IgYXR0YWNobWVudCByZWZlcmVuY2UgJXUgaW4gc3VicGFzcyAldSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSIHRoZW4gdGhlIHBOZXh0IGNoYWluIG11c3QgaW5jbHVkZSBhIHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXQgaW5zdGFuY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0uYXNwZWN0TWFzayAmIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2pdLmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXS5sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoZW4gdGhlIGFzcGVjdE1hc2sgZm9yIGNvbG9yIGF0dGFjaG1lbnQgcmVmZXJlbmNlICV1IGluIHN1YnBhc3MgJXUgaXMgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGVuIHRoZSBsYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0uYXNwZWN0TWFzayAmIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0ubGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXS5sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoZW4gdGhlIGFzcGVjdE1hc2sgZm9yIGNvbG9yIGF0dGFjaG1lbnQgcmVmZXJlbmNlICV1IGluIHN1YnBhc3MgJXUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZW4gdGhlIGxheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkSW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBjb2xvciBhdHRhY2htZW50IGlzICVzIGJ1dCBjYW4gb25seSBiZSBDT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgb3IgR0VORVJBTC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXS5sYXlvdXQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN1YnBhc3MucFJlc29sdmVBdHRhY2htZW50cyAmJiAoc3VicGFzcy5wUmVzb2x2ZUF0dGFjaG1lbnRzW2pdLmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpICYmCisgICAgICAgICAgICAgICAgKHN1YnBhc3MucFJlc29sdmVBdHRhY2htZW50c1tqXS5sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCB8fAorICAgICAgICAgICAgICAgICBzdWJwYXNzLnBSZXNvbHZlQXR0YWNobWVudHNbal0ubGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCkpIHsKKyAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItbGF5b3V0LTAzMDc3IiA6ICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZS1sYXlvdXQtMDA4NTciOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxheW91dCBmb3IgcmVzb2x2ZSBhdHRhY2htZW50IHJlZmVyZW5jZSAldSBpbiBzdWJwYXNzICV1IGlzICVzIGJ1dCBzaG91bGQgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMIG9yIEdFTkVSQUwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoc3VicGFzcy5wUmVzb2x2ZUF0dGFjaG1lbnRzW2pdLmxheW91dCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXR0YWNoX2ZpcnN0X3VzZVthdHRhY2hfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUxheW91dFZzQXR0YWNobWVudERlc2NyaXB0aW9uKHJlcG9ydF9kYXRhLCBycF92ZXJzaW9uLCBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2pdLmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoX2luZGV4LCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaF9pbmRleF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0YWNoX2ZpcnN0X3VzZVthdHRhY2hfaW5kZXhdID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCAmJiBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCkgeworICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOgorICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw6CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBpZGVhbC4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOgorICAgICAgICAgICAgICAgICAgICAvLyBNYXkgbm90IGJlIG9wdGltYWw7IFRPRE86IHJlY29uc2lkZXIgdGhpcyB3YXJuaW5nIGJhc2VkIG9uIG90aGVyIGNvbnN0cmFpbnRzPyBHRU5FUkFMIGNhbiBiZSBiZXR0ZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAvLyBkb2luZyBhIGJ1bmNoIG9mIHRyYW5zaXRpb25zLgorICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRU5FUkFMIGxheW91dCBmb3IgZGVwdGggYXR0YWNobWVudCBtYXkgbm90IGdpdmUgb3B0aW1hbCBwZXJmb3JtYW5jZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ6CisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ6CisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1sYXlvdXQtMDMwNzciIDogIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlLWxheW91dC0wMDg1NyI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXlvdXQgZm9yIGRlcHRoIGF0dGFjaG1lbnQgcmVmZXJlbmNlIGluIHN1YnBhc3MgJXUgaXMgJXMgYnV0IG11c3QgYmUgYSB2YWxpZCBkZXB0aC9zdGVuY2lsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQgb3IgR0VORVJBTC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+bGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOgorICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMuc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzLnNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMzEzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBkZXB0aCBhdHRhY2htZW50IHJlZmVyZW5jZSBpbiBzdWJwYXNzICV1IGlzICVzIGJ1dCBtdXN0IG5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHN0cmluZ19Wa0ltYWdlTGF5b3V0KHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBkZXB0aCBhdHRhY2htZW50IHJlZmVyZW5jZSBpbiBzdWJwYXNzICV1IGlzICVzIGJ1dCBtdXN0IG5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHN0cmluZ19Wa0ltYWdlTGF5b3V0KHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hc3BlY3RNYXNrICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAqYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSPihzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5wTmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9yZWZlcmVuY2Vfc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxMYXlvdXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC0+c3RlbmNpbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmZXJlbmNlX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUi1zdGVuY2lsTGF5b3V0LTAzMzE4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiB0aGUgYXR0YWNobWVudCByZWZlcmVuY2UgaW4gc3VicGFzcyAldSB3aXRoIHBOZXh0IGNoYWluIGluc3RhbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBzdGVuY2lsTGF5b3V0IG1lbWJlciBidXQgbXVzdCBub3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsIFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hlbiB0aGUgbGF5b3V0IGZvciBkZXB0aCBhdHRhY2htZW50IHJlZmVyZW5jZSBpbiBzdWJwYXNzICV1IGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgdGhlbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBpbmNsdWRlIGEgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dCBpbnN0YW5jZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXNwZWN0TWFzayAmIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hlbiB0aGUgYXNwZWN0TWFzayBmb3IgZGVwdGggYXR0YWNobWVudCByZWZlcmVuY2UgaW4gc3VicGFzcyAldSBpcyBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZW4gdGhlIGxheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXNwZWN0TWFzayAmIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hlbiB0aGUgYXNwZWN0TWFzayBmb3IgZGVwdGggYXR0YWNobWVudCByZWZlcmVuY2UgaW4gc3VicGFzcyAldSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlbiB0aGUgbGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUwsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggdG8gZ2VuZXJpYyBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBObyBvdGhlciBsYXlvdXRzIGFyZSBhY2NlcHRhYmxlCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXlvdXQgZm9yIGRlcHRoIGF0dGFjaG1lbnQgaXMgJXMgYnV0IGNhbiBvbmx5IGJlIERFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCBvciBHRU5FUkFMLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZUxheW91dChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5sYXlvdXQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXV0byBhdHRhY2hfaW5kZXggPSBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50OworICAgICAgICAgICAgaWYgKGF0dGFjaF9maXJzdF91c2VbYXR0YWNoX2luZGV4XSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVMYXlvdXRWc0F0dGFjaG1lbnREZXNjcmlwdGlvbihyZXBvcnRfZGF0YSwgcnBfdmVyc2lvbiwgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+bGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hfaW5kZXgsIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNoX2luZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRhY2hfZmlyc3RfdXNlW2F0dGFjaF9pbmRleF0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGNvcnJlY3QgdXNhZ2UgYml0cyBzZXQgZm9yIGJ1ZmZlcnMgb3IgaW1hZ2VzLiBWZXJpZnkgdGhhdCAoYWN0dWFsICYgZGVzaXJlZCkgZmxhZ3MgIT0gMCBvciwgaWYgc3RyaWN0CisvLyBpcyB0cnVlLCB2ZXJpZnkgdGhhdCAoYWN0dWFsICYgZGVzaXJlZCkgZmxhZ3MgPT0gZGVzaXJlZAorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVVzYWdlRmxhZ3MoVmtGbGFncyBhY3R1YWwsIFZrRmxhZ3MgZGVzaXJlZCwgVmtCb29sMzIgc3RyaWN0LCBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnQ29kZSwgY2hhciBjb25zdCAqZnVuY19uYW1lLCBjaGFyIGNvbnN0ICp1c2FnZV9zdHIpIGNvbnN0IHsKKyAgICBib29sIGNvcnJlY3RfdXNhZ2UgPSBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBjaGFyICp0eXBlX3N0ciA9IG9iamVjdF9zdHJpbmdbdHlwZWRfaGFuZGxlLnR5cGVdOworICAgIGlmIChzdHJpY3QpIHsKKyAgICAgICAgY29ycmVjdF91c2FnZSA9ICgoYWN0dWFsICYgZGVzaXJlZCkgPT0gZGVzaXJlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ycmVjdF91c2FnZSA9ICgoYWN0dWFsICYgZGVzaXJlZCkgIT0gMCk7CisgICAgfQorICAgIGlmICghY29ycmVjdF91c2FnZSkgeworICAgICAgICBpZiAobXNnQ29kZSA9PSBrVlVJRFVuZGVmaW5lZCkgeworICAgICAgICAgICAgLy8gVE9ETzogRml4IGNhbGxlcnMgd2l0aCBrVlVJRFVuZGVmaW5lZCB0byB1c2UgY29ycmVjdCB2YWxpZGF0aW9uIGNoZWNrcy4KKyAgICAgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZ2V0X2RlYnVnX3JlcG9ydF9lbnVtW3R5cGVkX2hhbmRsZS50eXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkX2hhbmRsZS5oYW5kbGUsIGtWVUlEX0NvcmVfTWVtVHJhY2tfSW52YWxpZFVzYWdlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHVzYWdlIGZsYWcgZm9yICVzIHVzZWQgYnkgJXMuIEluIHRoaXMgY2FzZSwgJXMgc2hvdWxkIGhhdmUgJXMgc2V0IGR1cmluZyBjcmVhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZSh0eXBlZF9oYW5kbGUpLmNfc3RyKCksIGZ1bmNfbmFtZSwgdHlwZV9zdHIsIHVzYWdlX3N0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBza2lwID0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZ2V0X2RlYnVnX3JlcG9ydF9lbnVtW3R5cGVkX2hhbmRsZS50eXBlXSwgdHlwZWRfaGFuZGxlLmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvZGUsICJJbnZhbGlkIHVzYWdlIGZsYWcgZm9yICVzIHVzZWQgYnkgJXMuIEluIHRoaXMgY2FzZSwgJXMgc2hvdWxkIGhhdmUgJXMgc2V0IGR1cmluZyBjcmVhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZSh0eXBlZF9oYW5kbGUpLmNfc3RyKCksIGZ1bmNfbmFtZSwgdHlwZV9zdHIsIHVzYWdlX3N0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0byB2YWxpZGF0ZSB1c2FnZSBmbGFncyBmb3IgYnVmZmVycy4gRm9yIGdpdmVuIGJ1ZmZlcl9zdGF0ZSBzZW5kIGFjdHVhbCB2cy4gZGVzaXJlZCB1c2FnZSBvZmYgdG8gaGVscGVyIGFib3ZlCisvLyB3aGVyZSBhbiBlcnJvciB3aWxsIGJlIGZsYWdnZWQgaWYgdXNhZ2UgaXMgbm90IGNvcnJlY3QKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbWFnZVVzYWdlRmxhZ3MoSU1BR0VfU1RBVEUgY29uc3QgKmltYWdlX3N0YXRlLCBWa0ZsYWdzIGRlc2lyZWQsIGJvb2wgc3RyaWN0LCBjb25zdCBjaGFyICptc2dDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpmdW5jX25hbWUsIGNoYXIgY29uc3QgKnVzYWdlX3N0cmluZykgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZVVzYWdlRmxhZ3MoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udXNhZ2UsIGRlc2lyZWQsIHN0cmljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZ1bGthblR5cGVkSGFuZGxlKGltYWdlX3N0YXRlLT5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSksIG1zZ0NvZGUsIGZ1bmNfbmFtZSwgdXNhZ2Vfc3RyaW5nKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUltYWdlRm9ybWF0RmVhdHVyZUZsYWdzKElNQUdFX1NUQVRFIGNvbnN0ICppbWFnZV9zdGF0ZSwgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZGVzaXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpmdW5jX25hbWUsIGNvbnN0IGNoYXIgKmxpbmVhcl92dWlkLCBjb25zdCBjaGFyICpvcHRpbWFsX3Z1aWQpIGNvbnN0IHsKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BlcnRpZXMgPSBHZXRQREZvcm1hdFByb3BlcnRpZXMoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udGlsaW5nID09IFZLX0lNQUdFX1RJTElOR19MSU5FQVIpIHsKKyAgICAgICAgaWYgKChmb3JtYXRfcHJvcGVydGllcy5saW5lYXJUaWxpbmdGZWF0dXJlcyAmIGRlc2lyZWQpICE9IGRlc2lyZWQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgbGluZWFyX3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluICVzLCBpbnZhbGlkIGxpbmVhclRpbGluZ0ZlYXR1cmVzICgweCUwOFgpIGZvciBmb3JtYXQgJXUgdXNlZCBieSAlcy4iLCBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3Byb3BlcnRpZXMubGluZWFyVGlsaW5nRmVhdHVyZXMsIGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3N0YXRlLT5pbWFnZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLnRpbGluZyA9PSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCkgeworICAgICAgICBpZiAoKGZvcm1hdF9wcm9wZXJ0aWVzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIGRlc2lyZWQpICE9IGRlc2lyZWQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgb3B0aW1hbF92dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcywgaW52YWxpZCBvcHRpbWFsVGlsaW5nRmVhdHVyZXMgKDB4JTA4WCkgZm9yIGZvcm1hdCAldSB1c2VkIGJ5ICVzLiIsIGZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfcHJvcGVydGllcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMsIGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3N0YXRlLT5pbWFnZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbWFnZVN1YnJlc291cmNlTGF5ZXJzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyAqc3VicmVzb3VyY2VfbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqZnVuY19uYW1lLCBjaGFyIGNvbnN0ICptZW1iZXIsIHVpbnQzMl90IGkpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICAvLyBsYXllckNvdW50IG11c3Qgbm90IGJlIHplcm8KKyAgICBpZiAoc3VicmVzb3VyY2VfbGF5ZXJzLT5sYXllckNvdW50ID09IDApIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtbGF5ZXJDb3VudC0wMTcwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW4gJXMsIHBSZWdpb25zWyV1XS4lcy5sYXllckNvdW50IG11c3Qgbm90IGJlIHplcm8uIiwgZnVuY19uYW1lLCBpLCBtZW1iZXIpOworICAgIH0KKyAgICAvLyBhc3BlY3RNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVAorICAgIGlmIChzdWJyZXNvdXJjZV9sYXllcnMtPmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stMDAxNjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkluICVzLCBwUmVnaW9uc1sldV0uJXMuYXNwZWN0TWFzayBoYXMgVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVCBzZXQuIiwgZnVuY19uYW1lLCBpLCBtZW1iZXIpOworICAgIH0KKyAgICAvLyBpZiBhc3BlY3RNYXNrIGNvbnRhaW5zIENPTE9SLCBpdCBtdXN0IG5vdCBjb250YWluIGVpdGhlciBERVBUSCBvciBTVEVOQ0lMCisgICAgaWYgKChzdWJyZXNvdXJjZV9sYXllcnMtPmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUKSAmJgorICAgICAgICAoc3VicmVzb3VyY2VfbGF5ZXJzLT5hc3BlY3RNYXNrICYgKFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAwMTY3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcywgcFJlZ2lvbnNbJXVdLiVzLmFzcGVjdE1hc2sgaGFzIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgYW5kIGVpdGhlciBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgc2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIGksIG1lbWJlcik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdXNhZ2UgZmxhZ3MgZm9yIGJ1ZmZlcnMuIEZvciBnaXZlbiBidWZmZXJfc3RhdGUgc2VuZCBhY3R1YWwgdnMuIGRlc2lyZWQgdXNhZ2Ugb2ZmIHRvIGhlbHBlciBhYm92ZQorLy8gd2hlcmUgYW4gZXJyb3Igd2lsbCBiZSBmbGFnZ2VkIGlmIHVzYWdlIGlzIG5vdCBjb3JyZWN0Citib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQnVmZmVyVXNhZ2VGbGFncyhCVUZGRVJfU1RBVEUgY29uc3QgKmJ1ZmZlcl9zdGF0ZSwgVmtGbGFncyBkZXNpcmVkLCBib29sIHN0cmljdCwgY29uc3QgY2hhciAqbXNnQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKmZ1bmNfbmFtZSwgY2hhciBjb25zdCAqdXNhZ2Vfc3RyaW5nKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlVXNhZ2VGbGFncyhidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8udXNhZ2UsIGRlc2lyZWQsIHN0cmljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZ1bGthblR5cGVkSGFuZGxlKGJ1ZmZlcl9zdGF0ZS0+YnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciksIG1zZ0NvZGUsIGZ1bmNfbmFtZSwgdXNhZ2Vfc3RyaW5nKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUJ1ZmZlclZpZXdSYW5nZShjb25zdCBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSwgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgKmRldmljZV9saW1pdHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSAmcmFuZ2UgPSBwQ3JlYXRlSW5mby0+cmFuZ2U7CisgICAgaWYgKHJhbmdlICE9IFZLX1dIT0xFX1NJWkUpIHsKKyAgICAgICAgLy8gUmFuZ2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAorICAgICAgICBpZiAocmFuZ2UgPD0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLXJhbmdlLTAwOTI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWYgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyByYW5nZSAoJSIgUFJJdUxFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBkb2VzIG5vdCBlcXVhbCBWS19XSE9MRV9TSVpFLCByYW5nZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UpOworICAgICAgICB9CisgICAgICAgIC8vIFJhbmdlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZWxlbWVudCBzaXplIG9mIGZvcm1hdAorICAgICAgICBjb25zdCB1aW50MzJfdCBmb3JtYXRfc2l6ZSA9IEZvcm1hdEVsZW1lbnRTaXplKHBDcmVhdGVJbmZvLT5mb3JtYXQpOworICAgICAgICBpZiAoU2FmZU1vZHVsbyhyYW5nZSwgZm9ybWF0X3NpemUpICE9IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGJ1ZmZlcl9zdGF0ZS0+YnVmZmVyKSwgIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1yYW5nZS0wMDkyOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklmIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gcmFuZ2UgKCUiIFBSSXVMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZG9lcyBub3QgZXF1YWwgVktfV0hPTEVfU0laRSwgcmFuZ2UgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBlbGVtZW50IHNpemUgb2YgdGhlIGZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwgZm9ybWF0X3NpemUpOworICAgICAgICB9CisgICAgICAgIC8vIFJhbmdlIGRpdmlkZWQgYnkgdGhlIGVsZW1lbnQgc2l6ZSBvZiBmb3JtYXQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGV4ZWxCdWZmZXJFbGVtZW50cworICAgICAgICBpZiAoU2FmZURpdmlzaW9uKHJhbmdlLCBmb3JtYXRfc2l6ZSkgPiBkZXZpY2VfbGltaXRzLT5tYXhUZXhlbEJ1ZmZlckVsZW1lbnRzKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChidWZmZXJfc3RhdGUtPmJ1ZmZlciksICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tcmFuZ2UtMDA5MzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZiBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIHJhbmdlICglIiBQUkl1TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGRvZXMgbm90IGVxdWFsIFZLX1dIT0xFX1NJWkUsIHJhbmdlIGRpdmlkZWQgYnkgdGhlIGVsZW1lbnQgc2l6ZSBvZiB0aGUgZm9ybWF0ICglIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXhlbEJ1ZmZlckVsZW1lbnRzICglIiBQUkl1TEVBU1QzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLCBmb3JtYXRfc2l6ZSwgZGV2aWNlX2xpbWl0cy0+bWF4VGV4ZWxCdWZmZXJFbGVtZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIHN1bSBvZiByYW5nZSBhbmQgb2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGJ1ZmZlcgorICAgICAgICBpZiAocmFuZ2UgKyBwQ3JlYXRlSW5mby0+b2Zmc2V0ID4gYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnNpemUpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGJ1ZmZlcl9zdGF0ZS0+YnVmZmVyKSwgIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1vZmZzZXQtMDA5MzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZiBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIHJhbmdlICglIiBQUkl1TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGRvZXMgbm90IGVxdWFsIFZLX1dIT0xFX1NJWkUsIHRoZSBzdW0gb2Ygb2Zmc2V0ICglIiBQUkl1TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGFuZCByYW5nZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyICglIiBQUkl1TEVBU1Q2NCAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLCBwQ3JlYXRlSW5mby0+b2Zmc2V0LCBidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVCdWZmZXJWaWV3QnVmZmVyKGNvbnN0IEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlLCBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcGVydGllcyA9IEdldFBERm9ybWF0UHJvcGVydGllcyhwQ3JlYXRlSW5mby0+Zm9ybWF0KTsKKyAgICBpZiAoKGJ1ZmZlcl9zdGF0ZS0+Y3JlYXRlSW5mby51c2FnZSAmIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQpICYmCisgICAgICAgICEoZm9ybWF0X3Byb3BlcnRpZXMuYnVmZmVyRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMDkzMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYHVzYWdlYCBjb250YWluaW5nIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQsIGZvcm1hdCBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJiZSBzdXBwb3J0ZWQgZm9yIHVuaWZvcm0gdGV4ZWwgYnVmZmVycyIpOworICAgIH0KKyAgICBpZiAoKGJ1ZmZlcl9zdGF0ZS0+Y3JlYXRlSW5mby51c2FnZSAmIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQpICYmCisgICAgICAgICEoZm9ybWF0X3Byb3BlcnRpZXMuYnVmZmVyRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMDkzNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYHVzYWdlYCBjb250YWluaW5nIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQsIGZvcm1hdCBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJiZSBzdXBwb3J0ZWQgZm9yIHN0b3JhZ2UgdGV4ZWwgYnVmZmVycyIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVCdWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0J1ZmZlciAqcEJ1ZmZlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgLy8gVE9ETzogQWRkIGNoZWNrIGZvciAiVlVJRC12a0NyZWF0ZUJ1ZmZlci1mbGFncy0wMDkxMSIgICAgICAgIChzcGFyc2UgYWRkcmVzcyBzcGFjZSBhY2NvdW50aW5nKQorCisgICAgaWYgKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCkgJiYgKCFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuc3BhcnNlQmluZGluZykpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAwOTE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUJ1ZmZlcigpOiB0aGUgc3BhcnNlQmluZGluZyBkZXZpY2UgZmVhdHVyZSBpcyBkaXNhYmxlZDogQnVmZmVycyBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQgc2V0LiIpOworICAgIH0KKworICAgIGlmICgocENyZWF0ZUluZm8tPmZsYWdzICYgVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVCkgJiYgKCFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuc3BhcnNlUmVzaWRlbmN5QnVmZmVyKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDA5MTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlQnVmZmVyKCk6IHRoZSBzcGFyc2VSZXNpZGVuY3lCdWZmZXIgZGV2aWNlIGZlYXR1cmUgaXMgZGlzYWJsZWQ6IEJ1ZmZlcnMgY2Fubm90IGJlIGNyZWF0ZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgc2V0LiIpOworICAgIH0KKworICAgIGlmICgocENyZWF0ZUluZm8tPmZsYWdzICYgVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQpICYmICghZW5hYmxlZF9mZWF0dXJlcy5jb3JlLnNwYXJzZVJlc2lkZW5jeUFsaWFzZWQpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMDkxNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVCdWZmZXIoKTogdGhlIHNwYXJzZVJlc2lkZW5jeUFsaWFzZWQgZGV2aWNlIGZlYXR1cmUgaXMgZGlzYWJsZWQ6IEJ1ZmZlcnMgY2Fubm90IGJlIGNyZWF0ZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUIHNldC4iKTsKKyAgICB9CisKKyAgICBhdXRvIGNoYWluZWRfZGV2YWRkcl9zdHJ1Y3QgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmIChjaGFpbmVkX2RldmFkZHJfc3RydWN0KSB7CisgICAgICAgIGlmICghKHBDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0VYVCkgJiYKKyAgICAgICAgICAgIGNoYWluZWRfZGV2YWRkcl9zdHJ1Y3QtPmRldmljZUFkZHJlc3MgIT0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1kZXZpY2VBZGRyZXNzLTAyNjA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVCdWZmZXIoKTogTm9uLXplcm8gVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVDo6ZGV2aWNlQWRkcmVzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVzIFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0VYVC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gY2hhaW5lZF9vcGFxdWVhZGRyX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmIChjaGFpbmVkX29wYXF1ZWFkZHJfc3RydWN0KSB7CisgICAgICAgIGlmICghKHBDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUikgJiYKKyAgICAgICAgICAgIGNoYWluZWRfb3BhcXVlYWRkcl9zdHJ1Y3QtPm9wYXF1ZUNhcHR1cmVBZGRyZXNzICE9IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tb3BhcXVlQ2FwdHVyZUFkZHJlc3MtMDMzMzciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUJ1ZmZlcigpOiBOb24temVybyBWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUjo6b3BhcXVlQ2FwdHVyZUFkZHJlc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVzIFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocENyZWF0ZUluZm8tPmZsYWdzICYgVktfQlVGRkVSX0NSRUFURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSKSAmJgorICAgICAgICAhZW5hYmxlZF9mZWF0dXJlcy5idWZmZXJfZGV2aWNlX2FkZHJlc3MuYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkgJiYKKyAgICAgICAgIWVuYWJsZWRfZmVhdHVyZXMuYnVmZmVyX2RldmljZV9hZGRyZXNzX2V4dC5idWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzMzOCIsCisgICAgICAgICAgICAidmtDcmVhdGVCdWZmZXIoKTogdGhlIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5IGRldmljZSBmZWF0dXJlIGlzIGRpc2FibGVkOiBCdWZmZXJzIGNhbm5vdCBiZSBjcmVhdGVkIHdpdGggIgorICAgICAgICAgICAgInRoZSBWS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9FWFQgc2V0LiIpOworICAgIH0KKworICAgIGlmIChwQ3JlYXRlSW5mby0+c2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQgJiYgcENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVF1ZXVlRmFtaWxpZXMocENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCwgcENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMsICJ2a0NyZWF0ZUJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyIsICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMTQxOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMTQxOSIsIGZhbHNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVCdWZmZXJWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0J1ZmZlclZpZXcgKnBWaWV3KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgQlVGRkVSX1NUQVRFICpidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShwQ3JlYXRlSW5mby0+YnVmZmVyKTsKKyAgICAvLyBJZiB0aGlzIGlzbid0IGEgc3BhcnNlIGJ1ZmZlciwgaXQgbmVlZHMgdG8gaGF2ZSBtZW1vcnkgYmFja2luZyBpdCBhdCBDcmVhdGVCdWZmZXJWaWV3IHRpbWUKKyAgICBpZiAoYnVmZmVyX3N0YXRlKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoYnVmZmVyX3N0YXRlLCAidmtDcmVhdGVCdWZmZXJWaWV3KCkiLCAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMDkzNSIpOworICAgICAgICAvLyBJbiBvcmRlciB0byBjcmVhdGUgYSB2YWxpZCBidWZmZXIgdmlldywgdGhlIGJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgIC8vIFVOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCBvciBTVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3MoYnVmZmVyX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUIHwgVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAwOTMyIiwgInZrQ3JlYXRlQnVmZmVyVmlldygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0JVRkZFUl9VU0FHRV9bU1RPUkFHRXxVTklGT1JNXV9URVhFTF9CVUZGRVJfQklUIik7CisKKyAgICAgICAgLy8gQnVmZmVyIHZpZXcgb2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGJ1ZmZlcgorICAgICAgICBpZiAocENyZWF0ZUluZm8tPm9mZnNldCA+PSBidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLW9mZnNldC0wMDkyNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQnVmZmVyVmlld0NyZWF0ZUluZm8gb2Zmc2V0ICglIiBQUkl1TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKCUiIFBSSXVMRUFTVDY0ICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPm9mZnNldCwgYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnNpemUpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUxpbWl0cyAqZGV2aWNlX2xpbWl0cyA9ICZwaHlzX2Rldl9wcm9wcy5saW1pdHM7CisgICAgICAgIC8vIEJ1ZmZlciB2aWV3IG9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQKKyAgICAgICAgaWYgKChwQ3JlYXRlSW5mby0+b2Zmc2V0ICUgZGV2aWNlX2xpbWl0cy0+bWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQpICE9IDAgJiYKKyAgICAgICAgICAgICFlbmFibGVkX2ZlYXR1cmVzLnRleGVsX2J1ZmZlcl9hbGlnbm1lbnRfZmVhdHVyZXMudGV4ZWxCdWZmZXJBbGlnbm1lbnQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGJ1ZmZlcl9zdGF0ZS0+YnVmZmVyKSwgIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1vZmZzZXQtMDI3NDkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIG9mZnNldCAoJSIgUFJJdUxFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQgKCUiIFBSSXVMRUFTVDY0ICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPm9mZnNldCwgZGV2aWNlX2xpbWl0cy0+bWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuYWJsZWRfZmVhdHVyZXMudGV4ZWxfYnVmZmVyX2FsaWdubWVudF9mZWF0dXJlcy50ZXhlbEJ1ZmZlckFsaWdubWVudCkgeworICAgICAgICAgICAgVmtEZXZpY2VTaXplIGVsZW1lbnRTaXplID0gRm9ybWF0RWxlbWVudFNpemUocENyZWF0ZUluZm8tPmZvcm1hdCk7CisgICAgICAgICAgICBpZiAoKGVsZW1lbnRTaXplICUgMykgPT0gMCkgeworICAgICAgICAgICAgICAgIGVsZW1lbnRTaXplIC89IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnVzYWdlICYgVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCkgeworICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBhbGlnbm1lbnRSZXF1aXJlbWVudCA9CisgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy50ZXhlbF9idWZmZXJfYWxpZ25tZW50X3Byb3BzLnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzOworICAgICAgICAgICAgICAgIGlmIChwaHlzX2Rldl9leHRfcHJvcHMudGV4ZWxfYnVmZmVyX2FsaWdubWVudF9wcm9wcy5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCkgeworICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRSZXF1aXJlbWVudCA9IHN0ZDo6bWluKGFsaWdubWVudFJlcXVpcmVtZW50LCBlbGVtZW50U2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChTYWZlTW9kdWxvKHBDcmVhdGVJbmZvLT5vZmZzZXQsIGFsaWdubWVudFJlcXVpcmVtZW50KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChidWZmZXJfc3RhdGUtPmJ1ZmZlciksICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAyNzUwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCB1c2FnZSBjb250YWluaW5nIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIG9mZnNldCAoJSIgUFJJdUxFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgbGVzc2VyIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUOjpzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcyAoJSIgUFJJdUxFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIG9yLCBpZiBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUOjpzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiKCUiIFBSSWQzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgVktfVFJVRSwgdGhlIHNpemUgb2YgYSB0ZXhlbCBvZiB0aGUgcmVxdWVzdGVkIGZvcm1hdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIklmIHRoZSBzaXplIG9mIGEgdGV4ZWwgaXMgYSBtdWx0aXBsZSBvZiB0aHJlZSBieXRlcywgdGhlbiB0aGUgc2l6ZSBvZiBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUgY29tcG9uZW50IG9mIGZvcm1hdCBpcyB1c2VkIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPm9mZnNldCwgcGh5c19kZXZfZXh0X3Byb3BzLnRleGVsX2J1ZmZlcl9hbGlnbm1lbnRfcHJvcHMuc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMudGV4ZWxfYnVmZmVyX2FsaWdubWVudF9wcm9wcy5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlcl9zdGF0ZS0+Y3JlYXRlSW5mby51c2FnZSAmIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQpIHsKKyAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgYWxpZ25tZW50UmVxdWlyZW1lbnQgPQorICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMudGV4ZWxfYnVmZmVyX2FsaWdubWVudF9wcm9wcy51bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlczsKKyAgICAgICAgICAgICAgICBpZiAocGh5c19kZXZfZXh0X3Byb3BzLnRleGVsX2J1ZmZlcl9hbGlnbm1lbnRfcHJvcHMudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50UmVxdWlyZW1lbnQgPSBzdGQ6Om1pbihhbGlnbm1lbnRSZXF1aXJlbWVudCwgZWxlbWVudFNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoU2FmZU1vZHVsbyhwQ3JlYXRlSW5mby0+b2Zmc2V0LCBhbGlnbm1lbnRSZXF1aXJlbWVudCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMjc1MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggdXNhZ2UgY29udGFpbmluZyBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklULCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyBvZmZzZXQgKCUiIFBSSXVMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGxlc3NlciBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDo6dW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgKCUiIFBSSXVMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiKSBvciwgaWYgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDo6dW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiglIiBQUklkMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIFZLX1RSVUUsIHRoZSBzaXplIG9mIGEgdGV4ZWwgb2YgdGhlIHJlcXVlc3RlZCBmb3JtYXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJJZiB0aGUgc2l6ZSBvZiBhIHRleGVsIGlzIGEgbXVsdGlwbGUgb2YgdGhyZWUgYnl0ZXMsIHRoZW4gdGhlIHNpemUgb2YgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAic2luZ2xlIGNvbXBvbmVudCBvZiBmb3JtYXQgaXMgdXNlZCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5vZmZzZXQsIHBoeXNfZGV2X2V4dF9wcm9wcy50ZXhlbF9idWZmZXJfYWxpZ25tZW50X3Byb3BzLnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLnRleGVsX2J1ZmZlcl9hbGlnbm1lbnRfcHJvcHMudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJWaWV3UmFuZ2UoYnVmZmVyX3N0YXRlLCBwQ3JlYXRlSW5mbywgZGV2aWNlX2xpbWl0cyk7CisKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUJ1ZmZlclZpZXdCdWZmZXIoYnVmZmVyX3N0YXRlLCBwQ3JlYXRlSW5mbyk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisvLyBGb3IgdGhlIGdpdmVuIGZvcm1hdCB2ZXJpZnkgdGhhdCB0aGUgYXNwZWN0IG1hc2tzIG1ha2Ugc2Vuc2UKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbWFnZUFzcGVjdE1hc2soVmtJbWFnZSBpbWFnZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0X21hc2ssIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdnVpZCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQ7CisgICAgaWYgKGltYWdlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIG9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhUOworICAgIH0KKworICAgIGlmIChGb3JtYXRJc0NvbG9yKGZvcm1hdCkpIHsKKyAgICAgICAgaWYgKChhc3BlY3RfbWFzayAmIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQpICE9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdFR5cGUsIEhhbmRsZVRvVWludDY0KGltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENvbG9yIGltYWdlIGZvcm1hdHMgbXVzdCBoYXZlIHRoZSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIHNldC4iLCBmdW5jX25hbWUpOworICAgICAgICB9IGVsc2UgaWYgKChhc3BlY3RfbWFzayAmIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQpICE9IGFzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RUeXBlLCBIYW5kbGVUb1VpbnQ2NChpbWFnZSksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb2xvciBpbWFnZSBmb3JtYXRzIG11c3QgaGF2ZSBPTkxZIHRoZSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIHNldC4iLCBmdW5jX25hbWUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChGb3JtYXRJc0RlcHRoQW5kU3RlbmNpbChmb3JtYXQpKSB7CisgICAgICAgIGlmICgoYXNwZWN0X21hc2sgJiAoVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkpID09IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdFR5cGUsIEhhbmRsZVRvVWludDY0KGltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IERlcHRoL3N0ZW5jaWwgaW1hZ2UgZm9ybWF0cyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG9mIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUIHNldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoKGFzcGVjdF9tYXNrICYgKFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpKSAhPSBhc3BlY3RfbWFzaykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0VHlwZSwgSGFuZGxlVG9VaW50NjQoaW1hZ2UpLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQ29tYmluYXRpb24gZGVwdGgvc3RlbmNpbCBpbWFnZSBmb3JtYXRzIGNhbiBoYXZlIG9ubHkgdGhlIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUIHNldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEZvcm1hdElzRGVwdGhPbmx5KGZvcm1hdCkpIHsKKyAgICAgICAgaWYgKChhc3BlY3RfbWFzayAmIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpICE9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdFR5cGUsIEhhbmRsZVRvVWludDY0KGltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IERlcHRoLW9ubHkgaW1hZ2UgZm9ybWF0cyBtdXN0IGhhdmUgdGhlIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgc2V0LiIsIGZ1bmNfbmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoKGFzcGVjdF9tYXNrICYgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCkgIT0gYXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdFR5cGUsIEhhbmRsZVRvVWludDY0KGltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IERlcHRoLW9ubHkgaW1hZ2UgZm9ybWF0cyBjYW4gaGF2ZSBvbmx5IHRoZSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHNldC4iLCBmdW5jX25hbWUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChGb3JtYXRJc1N0ZW5jaWxPbmx5KGZvcm1hdCkpIHsKKyAgICAgICAgaWYgKChhc3BlY3RfbWFzayAmIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkgIT0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RUeXBlLCBIYW5kbGVUb1VpbnQ2NChpbWFnZSksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTdGVuY2lsLW9ubHkgaW1hZ2UgZm9ybWF0cyBtdXN0IGhhdmUgdGhlIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCBzZXQuIiwgZnVuY19uYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICgoYXNwZWN0X21hc2sgJiBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpICE9IGFzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RUeXBlLCBIYW5kbGVUb1VpbnQ2NChpbWFnZSksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTdGVuY2lsLW9ubHkgaW1hZ2UgZm9ybWF0cyBjYW4gaGF2ZSBvbmx5IHRoZSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgc2V0LiIsIGZ1bmNfbmFtZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEZvcm1hdElzTXVsdGlwbGFuZShmb3JtYXQpKSB7CisgICAgICAgIFZrSW1hZ2VBc3BlY3RGbGFncyB2YWxpZF9mbGFncyA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ7CisgICAgICAgIGlmICgzID09IEZvcm1hdFBsYW5lQ291bnQoZm9ybWF0KSkgeworICAgICAgICAgICAgdmFsaWRfZmxhZ3MgPSB2YWxpZF9mbGFncyB8IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFzcGVjdF9tYXNrICYgdmFsaWRfZmxhZ3MpICE9IGFzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RUeXBlLCBIYW5kbGVUb1VpbnQ2NChpbWFnZSksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBNdWx0aS1wbGFuZSBpbWFnZSBmb3JtYXRzIG1heSBoYXZlIG9ubHkgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCBvciBWS19JTUFHRV9BU1BFQ1RfUExBTkVfbl9CSVRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0LCB3aGVyZSBuID0gWzAsIDEsIDJdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUltYWdlU3VicmVzb3VyY2VSYW5nZShjb25zdCB1aW50MzJfdCBpbWFnZV9taXBfY291bnQsIGNvbnN0IHVpbnQzMl90IGltYWdlX2xheWVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmc3VicmVzb3VyY2VSYW5nZSwgY29uc3QgY2hhciAqY21kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtX25hbWUsIGNvbnN0IGNoYXIgKmltYWdlX2xheWVyX2NvdW50X3Zhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCBpbWFnZV9oYW5kbGUsIFN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzIGVycm9yQ29kZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFZhbGlkYXRlIG1pcCBsZXZlbHMKKyAgICBpZiAoc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPj0gaW1hZ2VfbWlwX2NvdW50KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIGltYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZXMuYmFzZV9taXBfZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcy5iYXNlTWlwTGV2ZWwgKD0gJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBtaXAgbGV2ZWwgY291bnQgb2YgdGhlIGltYWdlIChpLmUuIGdyZWF0ZXIgb3IgZXF1YWwgdG8gJSIgUFJJdTMyICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfbmFtZSwgcGFyYW1fbmFtZSwgc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwsIGltYWdlX21pcF9jb3VudCk7CisgICAgfQorCisgICAgaWYgKHN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCAhPSBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUykgeworICAgICAgICBpZiAoc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID09IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIGltYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGVzLm1pcF9jb3VudF9lcnIsICIlczogJXMubGV2ZWxDb3VudCBpcyAwLiIsIGNtZF9uYW1lLCBwYXJhbV9uYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IG5lY2Vzc2FyeV9taXBfY291bnQgPSB1aW50NjRfdHtzdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbH0gKyB1aW50NjRfdHtzdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnR9OworCisgICAgICAgICAgICBpZiAobmVjZXNzYXJ5X21pcF9jb3VudCA+IGltYWdlX21pcF9jb3VudCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIGltYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2Rlcy5taXBfY291bnRfZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzLmJhc2VNaXBMZXZlbCArIC5sZXZlbENvdW50ICg9ICUiIFBSSXUzMiAiICsgJSIgUFJJdTMyICIgPSAlIiBQUkl1NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIHRoZSBtaXAgbGV2ZWwgY291bnQgb2YgdGhlIGltYWdlIChpLmUuIGdyZWF0ZXIgdGhhbiAlIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX25hbWUsIHBhcmFtX25hbWUsIHN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsLCBzdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyeV9taXBfY291bnQsIGltYWdlX21pcF9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBhcnJheSBsYXllcnMKKyAgICBpZiAoc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA+PSBpbWFnZV9sYXllcl9jb3VudCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBpbWFnZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGVzLmJhc2VfbGF5ZXJfZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcy5iYXNlQXJyYXlMYXllciAoPSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlICVzIG9mIHRoZSBpbWFnZSB3aGVuIGl0IHdhcyBjcmVhdGVkIChpLmUuIGdyZWF0ZXIgb3IgZXF1YWwgdG8gJSIgUFJJdTMyICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfbmFtZSwgcGFyYW1fbmFtZSwgc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciwgaW1hZ2VfbGF5ZXJfY291bnRfdmFyX25hbWUsIGltYWdlX2xheWVyX2NvdW50KTsKKyAgICB9CisKKyAgICBpZiAoc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ICE9IFZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlMpIHsKKyAgICAgICAgaWYgKHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBpbWFnZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2Rlcy5sYXllcl9jb3VudF9lcnIsICIlczogJXMubGF5ZXJDb3VudCBpcyAwLiIsIGNtZF9uYW1lLCBwYXJhbV9uYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IG5lY2Vzc2FyeV9sYXllcl9jb3VudCA9CisgICAgICAgICAgICAgICAgdWludDY0X3R7c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllcn0gKyB1aW50NjRfdHtzdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnR9OworCisgICAgICAgICAgICBpZiAobmVjZXNzYXJ5X2xheWVyX2NvdW50ID4gaW1hZ2VfbGF5ZXJfY291bnQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBpbWFnZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZXMubGF5ZXJfY291bnRfZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzLmJhc2VBcnJheUxheWVyICsgLmxheWVyQ291bnQgKD0gJSIgUFJJdTMyICIgKyAlIiBQUkl1MzIgIiA9ICUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBncmVhdGVyIHRoYW4gdGhlICVzIG9mIHRoZSBpbWFnZSB3aGVuIGl0IHdhcyBjcmVhdGVkIChpLmUuIGdyZWF0ZXIgdGhhbiAlIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX25hbWUsIHBhcmFtX25hbWUsIHN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIsIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJ5X2xheWVyX2NvdW50LCBpbWFnZV9sYXllcl9jb3VudF92YXJfbmFtZSwgaW1hZ2VfbGF5ZXJfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDcmVhdGVJbWFnZVZpZXdTdWJyZXNvdXJjZVJhbmdlKGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSwgYm9vbCBpc19pbWFnZXZpZXdfMmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZzdWJyZXNvdXJjZVJhbmdlKSBjb25zdCB7CisgICAgYm9vbCBpc19raHJfbWFpbnRlbmFuY2UxID0gSXNFeHRFbmFibGVkKGRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTEpOworICAgIGJvb2wgaXNfaW1hZ2Vfc2xpY2FibGUgPSBpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8zRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSKTsKKyAgICBib29sIGlzXzNEX3RvXzJEX21hcCA9IGlzX2tocl9tYWludGVuYW5jZTEgJiYgaXNfaW1hZ2Vfc2xpY2FibGUgJiYgaXNfaW1hZ2V2aWV3XzJkX3R5cGU7CisKKyAgICBjb25zdCBhdXRvIGltYWdlX2xheWVyX2NvdW50ID0gaXNfM0RfdG9fMkRfbWFwID8gaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZXh0ZW50LmRlcHRoIDogaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uYXJyYXlMYXllcnM7CisgICAgY29uc3QgYXV0byBpbWFnZV9sYXllcl9jb3VudF92YXJfbmFtZSA9IGlzXzNEX3RvXzJEX21hcCA/ICJleHRlbnQuZGVwdGgiIDogImFycmF5TGF5ZXJzIjsKKworICAgIFN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzID0ge307CisgICAgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMuYmFzZV9taXBfZXJyID0gIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE0NzgiOworICAgIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzLm1pcF9jb3VudF9lcnIgPSAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3VicmVzb3VyY2VSYW5nZS0wMTcxOCI7CisgICAgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMuYmFzZV9sYXllcl9lcnIgPSBpc19raHJfbWFpbnRlbmFuY2UxID8gKGlzXzNEX3RvXzJEX21hcCA/ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjcyNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNDgyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3VicmVzb3VyY2VSYW5nZS0wMTQ4MCI7CisgICAgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMubGF5ZXJfY291bnRfZXJyID0gaXNfa2hyX21haW50ZW5hbmNlMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChpc18zRF90b18yRF9tYXAgPyAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3VicmVzb3VyY2VSYW5nZS0wMjcyNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE0ODMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNzE5IjsKKworICAgIHJldHVybiBWYWxpZGF0ZUltYWdlU3VicmVzb3VyY2VSYW5nZShpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5taXBMZXZlbHMsIGltYWdlX2xheWVyX2NvdW50LCBzdWJyZXNvdXJjZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXciLCAicENyZWF0ZUluZm8tPnN1YnJlc291cmNlUmFuZ2UiLCBpbWFnZV9sYXllcl9jb3VudF92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMpOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ21kQ2xlYXJDb2xvclN1YnJlc291cmNlUmFuZ2UoY29uc3QgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZzdWJyZXNvdXJjZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtX25hbWUpIGNvbnN0IHsKKyAgICBTdWJyZXNvdXJjZVJhbmdlRXJyb3JDb2RlcyBzdWJyZXNvdXJjZVJhbmdlRXJyb3JDb2RlcyA9IHt9OworICAgIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzLmJhc2VfbWlwX2VyciA9ICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWJhc2VNaXBMZXZlbC0wMTQ3MCI7CisgICAgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMubWlwX2NvdW50X2VyciA9ICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBSYW5nZXMtMDE2OTIiOworICAgIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzLmJhc2VfbGF5ZXJfZXJyID0gIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtYmFzZUFycmF5TGF5ZXItMDE0NzIiOworICAgIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzLmxheWVyX2NvdW50X2VyciA9ICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBSYW5nZXMtMDE2OTMiOworCisgICAgcmV0dXJuIFZhbGlkYXRlSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLm1pcExldmVscywgaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uYXJyYXlMYXllcnMsIHN1YnJlc291cmNlUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENsZWFyQ29sb3JJbWFnZSIsIHBhcmFtX25hbWUsICJhcnJheUxheWVycyIsIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNtZENsZWFyRGVwdGhTdWJyZXNvdXJjZVJhbmdlKGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmc3VicmVzb3VyY2VSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbV9uYW1lKSBjb25zdCB7CisgICAgU3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMgPSB7fTsKKyAgICBzdWJyZXNvdXJjZVJhbmdlRXJyb3JDb2Rlcy5iYXNlX21pcF9lcnIgPSAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtYmFzZU1pcExldmVsLTAxNDc0IjsKKyAgICBzdWJyZXNvdXJjZVJhbmdlRXJyb3JDb2Rlcy5taXBfY291bnRfZXJyID0gIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtMDE2OTQiOworICAgIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzLmJhc2VfbGF5ZXJfZXJyID0gIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWJhc2VBcnJheUxheWVyLTAxNDc2IjsKKyAgICBzdWJyZXNvdXJjZVJhbmdlRXJyb3JDb2Rlcy5sYXllcl9jb3VudF9lcnIgPSAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMTY5NSI7CisKKyAgICByZXR1cm4gVmFsaWRhdGVJbWFnZVN1YnJlc291cmNlUmFuZ2UoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8ubWlwTGV2ZWxzLCBpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5hcnJheUxheWVycywgc3VicmVzb3VyY2VSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIsIHBhcmFtX25hbWUsICJhcnJheUxheWVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUltYWdlQmFycmllclN1YnJlc291cmNlUmFuZ2UoY29uc3QgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnN1YnJlc291cmNlUmFuZ2UsIGNvbnN0IGNoYXIgKmNtZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFyYW1fbmFtZSkgY29uc3QgeworICAgIFN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzID0ge307CisgICAgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMuYmFzZV9taXBfZXJyID0gIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTQ4NiI7CisgICAgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMubWlwX2NvdW50X2VyciA9ICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE3MjQiOworICAgIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzLmJhc2VfbGF5ZXJfZXJyID0gIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTQ4OCI7CisgICAgc3VicmVzb3VyY2VSYW5nZUVycm9yQ29kZXMubGF5ZXJfY291bnRfZXJyID0gIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTcyNSI7CisKKyAgICByZXR1cm4gVmFsaWRhdGVJbWFnZVN1YnJlc291cmNlUmFuZ2UoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8ubWlwTGV2ZWxzLCBpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5hcnJheUxheWVycywgc3VicmVzb3VyY2VSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX25hbWUsIHBhcmFtX25hbWUsICJhcnJheUxheWVycyIsIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZVZpZXcoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0ltYWdlVmlldyAqcFZpZXcpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBJTUFHRV9TVEFURSAqaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHBDcmVhdGVJbmZvLT5pbWFnZSk7CisgICAgaWYgKGltYWdlX3N0YXRlKSB7CisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIFZhbGlkYXRlSW1hZ2VVc2FnZUZsYWdzKGltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgfCBWS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYgfCBWS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAidmtDcmVhdGVJbWFnZVZpZXcoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfVVNBR0VfW1NBTVBMRUR8U1RPUkFHRXxDT0xPUl9BVFRBQ0hNRU5UfERFUFRIX1NURU5DSUxfQVRUQUNITUVOVHxJTlBVVF9BVFRBQ0hNRU5UfCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSEFESU5HX1JBVEVfSU1BR0V8RlJBR01FTlRfREVOU0lUWV9NQVBdX0JJVCIpOworICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgc3BhcnNlIGltYWdlLCBpdCBuZWVkcyB0byBoYXZlIG1lbW9yeSBiYWNraW5nIGl0IGF0IENyZWF0ZUltYWdlVmlldyB0aW1lCisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9JbWFnZShpbWFnZV9zdGF0ZSwgInZrQ3JlYXRlSW1hZ2VWaWV3KCkiLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMjAiKTsKKyAgICAgICAgLy8gQ2hlY2tzIGltcG9ydGVkIGZyb20gaW1hZ2UgbGF5ZXIKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNyZWF0ZUltYWdlVmlld1N1YnJlc291cmNlUmFuZ2UoCisgICAgICAgICAgICBpbWFnZV9zdGF0ZSwgcENyZWF0ZUluZm8tPnZpZXdUeXBlID09IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCB8fCBwQ3JlYXRlSW5mby0+dmlld1R5cGUgPT0gVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZLAorICAgICAgICAgICAgcENyZWF0ZUluZm8tPnN1YnJlc291cmNlUmFuZ2UpOworCisgICAgICAgIFZrSW1hZ2VDcmVhdGVGbGFncyBpbWFnZV9mbGFncyA9IGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZsYWdzOworICAgICAgICBWa0Zvcm1hdCBpbWFnZV9mb3JtYXQgPSBpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQ7CisgICAgICAgIFZrSW1hZ2VVc2FnZUZsYWdzIGltYWdlX3VzYWdlID0gaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udXNhZ2U7CisgICAgICAgIFZrSW1hZ2VUaWxpbmcgaW1hZ2VfdGlsaW5nID0gaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udGlsaW5nOworICAgICAgICBWa0Zvcm1hdCB2aWV3X2Zvcm1hdCA9IHBDcmVhdGVJbmZvLT5mb3JtYXQ7CisgICAgICAgIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RfbWFzayA9IHBDcmVhdGVJbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2s7CisgICAgICAgIFZrSW1hZ2VUeXBlIGltYWdlX3R5cGUgPSBpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGU7CisgICAgICAgIFZrSW1hZ2VWaWV3VHlwZSB2aWV3X3R5cGUgPSBwQ3JlYXRlSW5mby0+dmlld1R5cGU7CisKKyAgICAgICAgLy8gSWYgdGhlcmUncyBhIGNoYWluZWQgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gc3RydWN0LCBtb2RpZnkgaW1hZ2VfdXNhZ2UgdG8gbWF0Y2gKKyAgICAgICAgYXV0byBjaGFpbmVkX2l2dWNpX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvS0hSPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgICAgICBpZiAoY2hhaW5lZF9pdnVjaV9zdHJ1Y3QpIHsKKyAgICAgICAgICAgIGltYWdlX3VzYWdlID0gY2hhaW5lZF9pdnVjaV9zdHJ1Y3QtPnVzYWdlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCBzdGF0ZSwgaWYgdmlldy9pbWFnZSBmb3JtYXRzIGRpZmZlcgorICAgICAgICBpZiAoKGltYWdlX2ZsYWdzICYgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCkgJiYgKGltYWdlX2Zvcm1hdCAhPSB2aWV3X2Zvcm1hdCkpIHsKKyAgICAgICAgICAgIGlmIChGb3JtYXRJc011bHRpcGxhbmUoaW1hZ2VfZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIFZrRm9ybWF0IGNvbXBhdF9mb3JtYXQgPSBGaW5kTXVsdGlwbGFuZUNvbXBhdGlibGVGb3JtYXQoaW1hZ2VfZm9ybWF0LCBhc3BlY3RfbWFzayk7CisgICAgICAgICAgICAgICAgaWYgKHZpZXdfZm9ybWF0ICE9IGNvbXBhdF9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBmb3JtYXQgbXVzdCBtYXRjaCB0aGUgbXVsdGlwbGFuZSBjb21wYXRpYmxlIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICAgICAgc3MgPDwgInZrQ3JlYXRlSW1hZ2VWaWV3KCk6IEltYWdlVmlldyBmb3JtYXQgIiA8PCBzdHJpbmdfVmtGb3JtYXQodmlld19mb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBwbGFuZSAiIDw8IEdldFBsYW5lSW5kZXgoYXNwZWN0X21hc2spIDw8ICIgb2YgdW5kZXJseWluZyBpbWFnZSBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmdfVmtGb3JtYXQoaW1hZ2VfZm9ybWF0KSA8PCAiLCBtdXN0IGJlICIgPDwgc3RyaW5nX1ZrRm9ybWF0KGNvbXBhdF9mb3JtYXQpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDcmVhdGVJbmZvLT5pbWFnZSksICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTU4NiIsICIlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTIgfHwKKyAgICAgICAgICAgICAgICAgICAgICEoaW1hZ2VfZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfQkxPQ0tfVEVYRUxfVklFV19DT01QQVRJQkxFX0JJVF9LSFIpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXQgTVVTVCBiZSBjb21wYXRpYmxlIChpbiB0aGUgc2FtZSBmb3JtYXQgY29tcGF0aWJpbGl0eSBjbGFzcykgYXMgdGhlIGZvcm1hdCB0aGUgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICBpZiAoRm9ybWF0Q29tcGF0aWJpbGl0eUNsYXNzKGltYWdlX2Zvcm1hdCkgIT0gRm9ybWF0Q29tcGF0aWJpbGl0eUNsYXNzKHZpZXdfZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAgICAgICAgICBzcyA8PCAidmtDcmVhdGVJbWFnZVZpZXcoKTogSW1hZ2VWaWV3IGZvcm1hdCAiIDw8IHN0cmluZ19Wa0Zvcm1hdCh2aWV3X2Zvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgbm90IGluIHRoZSBzYW1lIGZvcm1hdCBjb21wYXRpYmlsaXR5IGNsYXNzIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENyZWF0ZUluZm8tPmltYWdlKS5jX3N0cigpIDw8ICIgIGZvcm1hdCAiIDw8IHN0cmluZ19Wa0Zvcm1hdChpbWFnZV9mb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiAgSW1hZ2VzIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUIEJJVCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiY2FuIHN1cHBvcnQgSW1hZ2VWaWV3cyB3aXRoIGRpZmZlcmluZyBmb3JtYXRzIGJ1dCB0aGV5IG11c3QgYmUgaW4gdGhlIHNhbWUgY29tcGF0aWJpbGl0eSBjbGFzcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMTgiLCAiJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRm9ybWF0IE1VU1QgYmUgSURFTlRJQ0FMIHRvIHRoZSBmb3JtYXQgdGhlIGltYWdlIHdhcyBjcmVhdGVkIHdpdGgKKyAgICAgICAgICAgIGlmIChpbWFnZV9mb3JtYXQgIT0gdmlld19mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCAidmtDcmVhdGVJbWFnZVZpZXcoKSBmb3JtYXQgIiA8PCBzdHJpbmdfVmtGb3JtYXQodmlld19mb3JtYXQpIDw8ICIgZGlmZmVycyBmcm9tICIKKyAgICAgICAgICAgICAgICAgICA8PCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDcmVhdGVJbmZvLT5pbWFnZSkuY19zdHIoKSA8PCAiIGZvcm1hdCAiIDw8IHN0cmluZ19Wa0Zvcm1hdChpbWFnZV9mb3JtYXQpCisgICAgICAgICAgICAgICAgICAgPDwgIi4gIEZvcm1hdHMgTVVTVCBiZSBJREVOVElDQUwgdW5sZXNzIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVCBCSVQgd2FzIHNldCBvbiBpbWFnZSBjcmVhdGlvbi4iOworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENyZWF0ZUluZm8tPmltYWdlKSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDE5IiwgIiVzIiwgc3Muc3RyKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSBjb3JyZWN0IGltYWdlIGFzcGVjdCBiaXRzIGZvciBkZXNpcmVkIGZvcm1hdHMgYW5kIGZvcm1hdCBjb25zaXN0ZW5jeQorICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VBc3BlY3RNYXNrKGltYWdlX3N0YXRlLT5pbWFnZSwgaW1hZ2VfZm9ybWF0LCBhc3BlY3RfbWFzaywgInZrQ3JlYXRlSW1hZ2VWaWV3KCkiKTsKKworICAgICAgICBzd2l0Y2ggKGltYWdlX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8xRDoKKyAgICAgICAgICAgICAgICBpZiAodmlld190eXBlICE9IFZLX0lNQUdFX1ZJRVdfVFlQRV8xRCAmJiB2aWV3X3R5cGUgIT0gVktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3ViUmVzb3VyY2VSYW5nZS0wMTAyMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXcoKTogcENyZWF0ZUluZm8tPnZpZXdUeXBlICVzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggaW1hZ2UgdHlwZSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VWaWV3VHlwZSh2aWV3X3R5cGUpLCBzdHJpbmdfVmtJbWFnZVR5cGUoaW1hZ2VfdHlwZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8yRDoKKyAgICAgICAgICAgICAgICBpZiAodmlld190eXBlICE9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCAmJiB2aWV3X3R5cGUgIT0gVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodmlld190eXBlID09IFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFIHx8IHZpZXdfdHlwZSA9PSBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICEoaW1hZ2VfZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENyZWF0ZUluZm8tPmltYWdlKSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXcoKTogcENyZWF0ZUluZm8tPnZpZXdUeXBlICVzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggaW1hZ2UgdHlwZSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0ltYWdlVmlld1R5cGUodmlld190eXBlKSwgc3RyaW5nX1ZrSW1hZ2VUeXBlKGltYWdlX3R5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aWV3X3R5cGUgIT0gVktfSU1BR0VfVklFV19UWVBFX0NVQkUgJiYgdmlld190eXBlICE9IFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDcmVhdGVJbmZvLT5pbWFnZSksICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJSZXNvdXJjZVJhbmdlLTAxMDIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXcoKTogcENyZWF0ZUluZm8tPnZpZXdUeXBlICVzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggaW1hZ2UgdHlwZSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0ltYWdlVmlld1R5cGUodmlld190eXBlKSwgc3RyaW5nX1ZrSW1hZ2VUeXBlKGltYWdlX3R5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8zRDoKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX21haW50ZW5hbmNlMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmlld190eXBlICE9IFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2aWV3X3R5cGUgPT0gVktfSU1BR0VfVklFV19UWVBFXzJEIHx8IHZpZXdfdHlwZSA9PSBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaW1hZ2VfZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENyZWF0ZUluZm8tPmltYWdlKSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDA1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2VWaWV3KCk6IHBDcmVhdGVJbmZvLT52aWV3VHlwZSAlcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGltYWdlIHR5cGUgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VWaWV3VHlwZSh2aWV3X3R5cGUpLCBzdHJpbmdfVmtJbWFnZVR5cGUoaW1hZ2VfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGltYWdlX2ZsYWdzICYgKFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQgfCBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENyZWF0ZUluZm8tPmltYWdlKSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YlJlc291cmNlUmFuZ2UtMDEwMjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXcoKTogcENyZWF0ZUluZm8tPnZpZXdUeXBlICVzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggaW1hZ2UgdHlwZSAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGVuIHRoZSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULCBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQgZmxhZ3MgYXJlIGVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VWaWV3VHlwZSh2aWV3X3R5cGUpLCBzdHJpbmdfVmtJbWFnZVR5cGUoaW1hZ2VfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENyZWF0ZUluZm8tPmltYWdlKSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YlJlc291cmNlUmFuZ2UtMDEwMjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXcoKTogcENyZWF0ZUluZm8tPnZpZXdUeXBlICVzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggaW1hZ2UgdHlwZSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZVZpZXdUeXBlKHZpZXdfdHlwZSksIHN0cmluZ19Wa0ltYWdlVHlwZShpbWFnZV90eXBlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodmlld190eXBlICE9IFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3ViUmVzb3VyY2VSYW5nZS0wMTAyMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2VWaWV3KCk6IHBDcmVhdGVJbmZvLT52aWV3VHlwZSAlcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGltYWdlIHR5cGUgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZVZpZXdUeXBlKHZpZXdfdHlwZSksIHN0cmluZ19Wa0ltYWdlVHlwZShpbWFnZV90eXBlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0ZXJuYWwgZm9ybWF0IGNoZWNrcyBuZWVkZWQgd2hlbiBWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciBlbmFibGVkCisgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19hbmRyb2lkX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlcikgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNyZWF0ZUltYWdlVmlld0FORFJPSUQocENyZWF0ZUluZm8pOworICAgICAgICB9CisKKyAgICAgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wZXJ0aWVzID0gR2V0UERGb3JtYXRQcm9wZXJ0aWVzKHZpZXdfZm9ybWF0KTsKKyAgICAgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgdGlsaW5nX2ZlYXR1cmVzID0gKGltYWdlX3RpbGluZyAmIFZLX0lNQUdFX1RJTElOR19MSU5FQVIpID8gZm9ybWF0X3Byb3BlcnRpZXMubGluZWFyVGlsaW5nRmVhdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybWF0X3Byb3BlcnRpZXMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzOworCisgICAgICAgIGlmICh0aWxpbmdfZmVhdHVyZXMgPT0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tTm9uZS0wMjI3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2VWaWV3KCk6IHBDcmVhdGVJbmZvLT5mb3JtYXQgJXMgd2l0aCB0aWxpbmcgJXMgaGFzIG5vIHN1cHBvcnRlZCBmb3JtYXQgZmVhdHVyZXMgb24gdGhpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBoeXNpY2FsIGRldmljZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0Zvcm1hdCh2aWV3X2Zvcm1hdCksIHN0cmluZ19Wa0ltYWdlVGlsaW5nKGltYWdlX3RpbGluZykpOworICAgICAgICB9IGVsc2UgaWYgKChpbWFnZV91c2FnZSAmIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUKSAmJiAhKHRpbGluZ19mZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlVmlldygpOiBwQ3JlYXRlSW5mby0+Zm9ybWF0ICVzIHdpdGggdGlsaW5nICVzIGRvZXMgbm90IHN1cHBvcnQgdXNhZ2UgdGhhdCBpbmNsdWRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrRm9ybWF0KHZpZXdfZm9ybWF0KSwgc3RyaW5nX1ZrSW1hZ2VUaWxpbmcoaW1hZ2VfdGlsaW5nKSk7CisgICAgICAgIH0gZWxzZSBpZiAoKGltYWdlX3VzYWdlICYgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQpICYmICEodGlsaW5nX2ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9CSVQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDcmVhdGVJbmZvLT5pbWFnZSksICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby11c2FnZS0wMjI3NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2VWaWV3KCk6IHBDcmVhdGVJbmZvLT5mb3JtYXQgJXMgd2l0aCB0aWxpbmcgJXMgZG9lcyBub3Qgc3VwcG9ydCB1c2FnZSB0aGF0IGluY2x1ZGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtGb3JtYXQodmlld19mb3JtYXQpLCBzdHJpbmdfVmtJbWFnZVRpbGluZyhpbWFnZV90aWxpbmcpKTsKKyAgICAgICAgfSBlbHNlIGlmICgoaW1hZ2VfdXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCkgJiYKKyAgICAgICAgICAgICAgICAgICAhKHRpbGluZ19mZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlVmlldygpOiBwQ3JlYXRlSW5mby0+Zm9ybWF0ICVzIHdpdGggdGlsaW5nICVzIGRvZXMgbm90IHN1cHBvcnQgdXNhZ2UgdGhhdCBpbmNsdWRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrRm9ybWF0KHZpZXdfZm9ybWF0KSwgc3RyaW5nX1ZrSW1hZ2VUaWxpbmcoaW1hZ2VfdGlsaW5nKSk7CisgICAgICAgIH0gZWxzZSBpZiAoKGltYWdlX3VzYWdlICYgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCkgJiYKKyAgICAgICAgICAgICAgICAgICAhKHRpbGluZ19mZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDcmVhdGVJbmZvLT5pbWFnZSksICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby11c2FnZS0wMjI3NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2VWaWV3KCk6IHBDcmVhdGVJbmZvLT5mb3JtYXQgJXMgd2l0aCB0aWxpbmcgJXMgZG9lcyBub3Qgc3VwcG9ydCB1c2FnZSB0aGF0IGluY2x1ZGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0Zvcm1hdCh2aWV3X2Zvcm1hdCksIHN0cmluZ19Wa0ltYWdlVGlsaW5nKGltYWdlX3RpbGluZykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGltYWdlX3VzYWdlICYgVktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVikgeworICAgICAgICAgICAgaWYgKHZpZXdfdHlwZSAhPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQgJiYgdmlld190eXBlICE9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDcmVhdGVJbmZvLT5pbWFnZSksICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjA4NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlVmlldygpIElmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggdXNhZ2UgY29udGFpbmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WLCB2aWV3VHlwZSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX1ZJRVdfVFlQRV8yRCBvciBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlld19mb3JtYXQgIT0gVktfRk9STUFUX1I4X1VJTlQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+aW1hZ2UpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDIwODciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXcoKSBJZiBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIHVzYWdlIGNvbnRhaW5pbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OViwgZm9ybWF0IG11c3QgYmUgVktfRk9STUFUX1I4X1VJTlQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBWYWxpZGF0ZUNtZENvcHlCdWZmZXJCb3VuZHMoY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBjb25zdCBCVUZGRVJfU1RBVEUgKnNyY19idWZmZXJfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJVRkZFUl9TVEFURSAqZHN0X2J1ZmZlcl9zdGF0ZSwgdWludDMyX3QgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyQ29weSAqcFJlZ2lvbnMpIHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIFZrRGV2aWNlU2l6ZSBzcmNfYnVmZmVyX3NpemUgPSBzcmNfYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnNpemU7CisgICAgVmtEZXZpY2VTaXplIGRzdF9idWZmZXJfc2l6ZSA9IGRzdF9idWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZTsKKyAgICBWa0RldmljZVNpemUgc3JjX21pbiA9IFVJTlQ2NF9NQVg7CisgICAgVmtEZXZpY2VTaXplIHNyY19tYXggPSAwOworICAgIFZrRGV2aWNlU2l6ZSBkc3RfbWluID0gVUlOVDY0X01BWDsKKyAgICBWa0RldmljZVNpemUgZHN0X21heCA9IDA7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVnaW9uQ291bnQ7IGkrKykgeworICAgICAgICBzcmNfbWluID0gc3RkOjptaW4oc3JjX21pbiwgcFJlZ2lvbnNbaV0uc3JjT2Zmc2V0KTsKKyAgICAgICAgc3JjX21heCA9IHN0ZDo6bWF4KHNyY19tYXgsIChwUmVnaW9uc1tpXS5zcmNPZmZzZXQgKyBwUmVnaW9uc1tpXS5zaXplKSk7CisgICAgICAgIGRzdF9taW4gPSBzdGQ6Om1pbihkc3RfbWluLCBwUmVnaW9uc1tpXS5kc3RPZmZzZXQpOworICAgICAgICBkc3RfbWF4ID0gc3RkOjptYXgoZHN0X21heCwgKHBSZWdpb25zW2ldLmRzdE9mZnNldCArIHBSZWdpb25zW2ldLnNpemUpKTsKKworICAgICAgICAvLyBUaGUgc3JjT2Zmc2V0IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2Ygc3JjQnVmZmVyCisgICAgICAgIGlmIChwUmVnaW9uc1tpXS5zcmNPZmZzZXQgPj0gc3JjX2J1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzcmNfYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC12a0NtZENvcHlCdWZmZXItc3JjT2Zmc2V0LTAwMTEzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5QnVmZmVyKCk6IHBSZWdpb25zWyVkXS5zcmNPZmZzZXQgKCUiIFBSSXVMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIHBSZWdpb25zWyVkXS5zaXplICglIiBQUkl1TEVBU1Q2NCAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBSZWdpb25zW2ldLnNyY09mZnNldCwgaSwgcFJlZ2lvbnNbaV0uc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgZHN0T2Zmc2V0IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgZHN0QnVmZmVyCisgICAgICAgIGlmIChwUmVnaW9uc1tpXS5kc3RPZmZzZXQgPj0gZHN0X2J1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3RfYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC12a0NtZENvcHlCdWZmZXItZHN0T2Zmc2V0LTAwMTE0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5QnVmZmVyKCk6IHBSZWdpb25zWyVkXS5kc3RPZmZzZXQgKCUiIFBSSXVMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIHBSZWdpb25zWyVkXS5zaXplICglIiBQUkl1TEVBU1Q2NCAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBSZWdpb25zW2ldLmRzdE9mZnNldCwgaSwgcFJlZ2lvbnNbaV0uc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgc2l6ZSBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHNyY0J1ZmZlciBtaW51cyBzcmNPZmZzZXQKKyAgICAgICAgaWYgKHBSZWdpb25zW2ldLnNpemUgPiAoc3JjX2J1ZmZlcl9zaXplIC0gcFJlZ2lvbnNbaV0uc3JjT2Zmc2V0KSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc3JjX2J1ZmZlcl9zdGF0ZS0+YnVmZmVyKSwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNpemUtMDAxMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlCdWZmZXIoKTogcFJlZ2lvbnNbJWRdLnNpemUgKCUiIFBSSXVMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIHRoZSBzb3VyY2UgYnVmZmVyIHNpemUgKCUiIFBSSXVMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgbWludXMgcFJlZ2lvbnNbJWRdLnNyY09mZnNldCAoJSIgUFJJdUxFQVNUNjQgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwUmVnaW9uc1tpXS5zaXplLCBzcmNfYnVmZmVyX3NpemUsIGksIHBSZWdpb25zW2ldLnNyY09mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgc2l6ZSBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGRzdEJ1ZmZlciBtaW51cyBkc3RPZmZzZXQKKyAgICAgICAgaWYgKHBSZWdpb25zW2ldLnNpemUgPiAoZHN0X2J1ZmZlcl9zaXplIC0gcFJlZ2lvbnNbaV0uZHN0T2Zmc2V0KSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZHN0X2J1ZmZlcl9zdGF0ZS0+YnVmZmVyKSwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNpemUtMDAxMTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlCdWZmZXIoKTogcFJlZ2lvbnNbJWRdLnNpemUgKCUiIFBSSXVMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgc2l6ZSAoJSIgUFJJdUxFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBtaW51cyBwUmVnaW9uc1slZF0uZHN0T2Zmc2V0ICglIiBQUkl1TEVBU1Q2NCAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBSZWdpb25zW2ldLnNpemUsIGRzdF9idWZmZXJfc2l6ZSwgaSwgcFJlZ2lvbnNbaV0uZHN0T2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSB1bmlvbiBvZiB0aGUgc291cmNlIHJlZ2lvbnMsIGFuZCB0aGUgdW5pb24gb2YgdGhlIGRlc3RpbmF0aW9uIHJlZ2lvbnMsIG11c3Qgbm90IG92ZXJsYXAgaW4gbWVtb3J5CisgICAgaWYgKHNyY19idWZmZXJfc3RhdGUtPmJ1ZmZlciA9PSBkc3RfYnVmZmVyX3N0YXRlLT5idWZmZXIpIHsKKyAgICAgICAgaWYgKCgoc3JjX21pbiA+IGRzdF9taW4pICYmIChzcmNfbWluIDwgZHN0X21heCkpIHx8ICgoc3JjX21heCA+IGRzdF9taW4pICYmIChzcmNfbWF4IDwgZHN0X21heCkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzcmNfYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC12a0NtZENvcHlCdWZmZXItcFJlZ2lvbnMtMDAxMTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlCdWZmZXIoKTogRGV0ZWN0ZWQgb3ZlcmxhcCBiZXR3ZWVuIHNvdXJjZSBhbmQgZGVzdCByZWdpb25zIGluIG1lbW9yeS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZENvcHlCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckNvcHkgKnBSZWdpb25zKSBjb25zdCB7CisgICAgY29uc3QgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBjb25zdCBhdXRvIHNyY19idWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShzcmNCdWZmZXIpOworICAgIGNvbnN0IGF1dG8gZHN0X2J1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGRzdEJ1ZmZlcik7CisKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvQnVmZmVyKHNyY19idWZmZXJfc3RhdGUsICJ2a0NtZENvcHlCdWZmZXIoKSIsICJWVUlELXZrQ21kQ29weUJ1ZmZlci1zcmNCdWZmZXItMDAxMTkiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvQnVmZmVyKGRzdF9idWZmZXJfc3RhdGUsICJ2a0NtZENvcHlCdWZmZXIoKSIsICJWVUlELXZrQ21kQ29weUJ1ZmZlci1kc3RCdWZmZXItMDAxMjEiKTsKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IFNSQyAmIERTVCBidWZmZXJzIGhhdmUgY29ycmVjdCB1c2FnZSBmbGFncyBzZXQKKyAgICBza2lwIHw9CisgICAgICAgIFZhbGlkYXRlQnVmZmVyVXNhZ2VGbGFncyhzcmNfYnVmZmVyX3N0YXRlLCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwgdHJ1ZSwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNyY0J1ZmZlci0wMDExOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5QnVmZmVyKCkiLCAiVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQiKTsKKyAgICBza2lwIHw9CisgICAgICAgIFZhbGlkYXRlQnVmZmVyVXNhZ2VGbGFncyhkc3RfYnVmZmVyX3N0YXRlLCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgdHJ1ZSwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLWRzdEJ1ZmZlci0wMDEyMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5QnVmZmVyKCkiLCAiVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQiKTsKKyAgICBza2lwIHw9CisgICAgICAgIFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9ub2RlLCAidmtDbWRDb3B5QnVmZmVyKCkiLCBWS19RVUVVRV9UUkFOU0ZFUl9CSVQgfCBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUJ1ZmZlci1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX25vZGUsIENNRF9DT1BZQlVGRkVSLCAidmtDbWRDb3B5QnVmZmVyKCkiKTsKKyAgICBza2lwIHw9IEluc2lkZVJlbmRlclBhc3MoY2Jfbm9kZSwgInZrQ21kQ29weUJ1ZmZlcigpIiwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXJlbmRlcnBhc3MiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kQ29weUJ1ZmZlckJvdW5kcyhyZXBvcnRfZGF0YSwgc3JjX2J1ZmZlcl9zdGF0ZSwgZHN0X2J1ZmZlcl9zdGF0ZSwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUlkbGVCdWZmZXIoVmtCdWZmZXIgYnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgYXV0byBidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShidWZmZXIpOworICAgIGlmICghYnVmZmVyX3N0YXRlKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULCBIYW5kbGVUb1VpbnQ2NChidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfRG91YmxlRGVzdHJveSwgIkNhbm5vdCBmcmVlICVzIHRoYXQgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShidWZmZXIpLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChidWZmZXJfc3RhdGUtPmluX3VzZS5sb2FkKCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGJ1ZmZlciksICJWVUlELXZrRGVzdHJveUJ1ZmZlci1idWZmZXItMDA5MjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZnJlZSAlcyB0aGF0IGlzIGluIHVzZSBieSBhIGNvbW1hbmQgYnVmZmVyLiIsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYnVmZmVyKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95SW1hZ2VWaWV3KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgY29uc3QgeworICAgIGNvbnN0IElNQUdFX1ZJRVdfU1RBVEUgKmltYWdlX3ZpZXdfc3RhdGUgPSBHZXRJbWFnZVZpZXdTdGF0ZShpbWFnZVZpZXcpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QoaW1hZ2VWaWV3LCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlVmlldyk7CisKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoaW1hZ2Vfdmlld19zdGF0ZSkgeworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBWYWxpZGF0ZU9iamVjdE5vdEluVXNlKGltYWdlX3ZpZXdfc3RhdGUsIG9ial9zdHJ1Y3QsICJ2a0Rlc3Ryb3lJbWFnZVZpZXciLCAiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LTAxMDI2Iik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lCdWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgY29uc3QgeworICAgIGF1dG8gYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChidWZmZXJfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUlkbGVCdWZmZXIoYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlclZpZXcgYnVmZmVyVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYXV0byBidWZmZXJfdmlld19zdGF0ZSA9IEdldEJ1ZmZlclZpZXdTdGF0ZShidWZmZXJWaWV3KTsKKyAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSBvYmpfc3RydWN0KGJ1ZmZlclZpZXcsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldyk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGJ1ZmZlcl92aWV3X3N0YXRlKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3ROb3RJblVzZShidWZmZXJfdmlld19zdGF0ZSwgb2JqX3N0cnVjdCwgInZrRGVzdHJveUJ1ZmZlclZpZXciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LTAwOTM2Iik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZEZpbGxCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgc2l6ZSwgdWludDMyX3QgZGF0YSkgY29uc3QgeworICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byBidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShkc3RCdWZmZXIpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoYnVmZmVyX3N0YXRlLCAidmtDbWRGaWxsQnVmZmVyKCkiLCAiVlVJRC12a0NtZEZpbGxCdWZmZXItZHN0QnVmZmVyLTAwMDMxIik7CisgICAgc2tpcCB8PQorICAgICAgICBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfbm9kZSwgInZrQ21kRmlsbEJ1ZmZlcigpIiwgVktfUVVFVUVfVFJBTlNGRVJfQklUIHwgVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEZpbGxCdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9ub2RlLCBDTURfRklMTEJVRkZFUiwgInZrQ21kRmlsbEJ1ZmZlcigpIik7CisgICAgLy8gVmFsaWRhdGUgdGhhdCBEU1QgYnVmZmVyIGhhcyBjb3JyZWN0IHVzYWdlIGZsYWdzIHNldAorICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKGJ1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsIHRydWUsICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RCdWZmZXItMDAwMjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEZpbGxCdWZmZXIoKSIsICJWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCIpOworICAgIHNraXAgfD0gSW5zaWRlUmVuZGVyUGFzcyhjYl9ub2RlLCAidmtDbWRGaWxsQnVmZmVyKCkiLCAiVlVJRC12a0NtZEZpbGxCdWZmZXItcmVuZGVycGFzcyIpOworCisgICAgaWYgKGRzdE9mZnNldCA+PSBidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRzdEJ1ZmZlciksICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RPZmZzZXQtMDAwMjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRmlsbEJ1ZmZlcigpOiBkc3RPZmZzZXQgKDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIG5vdCBsZXNzIHRoYW4gZGVzdGluYXRpb24gYnVmZmVyICglcykgc2l6ZSAoMHglIiBQUkl4TEVBU1Q2NCAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGRzdEJ1ZmZlcikuY19zdHIoKSwgYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnNpemUpOworICAgIH0KKworICAgIGlmICgoc2l6ZSAhPSBWS19XSE9MRV9TSVpFKSAmJiAoc2l6ZSA+IChidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZSAtIGRzdE9mZnNldCkpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZHN0QnVmZmVyKSwgIlZVSUQtdmtDbWRGaWxsQnVmZmVyLXNpemUtMDAwMjciLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRmlsbEJ1ZmZlcigpOiBzaXplICgweCUiIFBSSXhMRUFTVDY0ICIpIGlzIGdyZWF0ZXIgdGhhbiBkc3RCdWZmZXIgKCVzKSBzaXplICgweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiKSBtaW51cyBkc3RPZmZzZXQgKDB4JSIgUFJJeExFQVNUNjQgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoZHN0QnVmZmVyKS5jX3N0cigpLCBidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZSwgZHN0T2Zmc2V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUJ1ZmZlckltYWdlQ29weURhdGEodWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5ICpwUmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSwgY29uc3QgY2hhciAqZnVuY3Rpb24pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGlmIChpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8xRCkgeworICAgICAgICAgICAgaWYgKChwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC55ICE9IDApIHx8IChwUmVnaW9uc1tpXS5pbWFnZUV4dGVudC5oZWlnaHQgIT0gMSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1zcmNJbWFnZS0wMDE5OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBwUmVnaW9uWyVkXSBpbWFnZU9mZnNldC55IGlzICVkIGFuZCBpbWFnZUV4dGVudC5oZWlnaHQgaXMgJWQuIEZvciAxRCBpbWFnZXMgdGhlc2UgbXVzdCBiZSAwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCAxLCByZXNwZWN0aXZlbHkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGksIHBSZWdpb25zW2ldLmltYWdlT2Zmc2V0LnksIHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LmhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzFEKSB8fCAoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfMkQpKSB7CisgICAgICAgICAgICBpZiAoKHBSZWdpb25zW2ldLmltYWdlT2Zmc2V0LnogIT0gMCkgfHwgKHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LmRlcHRoICE9IDEpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktc3JjSW1hZ2UtMDAyMDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogcFJlZ2lvblslZF0gaW1hZ2VPZmZzZXQueiBpcyAlZCBhbmQgaW1hZ2VFeHRlbnQuZGVwdGggaXMgJWQuIEZvciAxRCBhbmQgMkQgaW1hZ2VzIHRoZXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBpLCBwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC56LCBwUmVnaW9uc1tpXS5pbWFnZUV4dGVudC5kZXB0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfM0QpIHsKKyAgICAgICAgICAgIGlmICgoMCAhPSBwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyKSB8fCAoMSAhPSBwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYmFzZUFycmF5TGF5ZXItMDAyMTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogcFJlZ2lvblslZF0gaW1hZ2VTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciBpcyAlZCBhbmQgaW1hZ2VTdWJyZXNvdXJjZS5sYXllckNvdW50IGlzICVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3IgM0QgaW1hZ2VzIHRoZXNlIG11c3QgYmUgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBpLCBwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyLCBwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBWa0ltYWdlIHBhcmFtZXRlcidzIGZvcm1hdCBpcyBub3QgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCwKKyAgICAgICAgLy8gdGhlbiBidWZmZXJPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBWa0ltYWdlIHBhcmFtZXRlcidzIGVsZW1lbnQgc2l6ZQorICAgICAgICB1aW50MzJfdCBlbGVtZW50X3NpemUgPSBGb3JtYXRFbGVtZW50U2l6ZShpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQsIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayk7CisKKyAgICAgICAgaWYgKCFGb3JtYXRJc0RlcHRoQW5kU3RlbmNpbChpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpICYmIFNhZmVNb2R1bG8ocFJlZ2lvbnNbaV0uYnVmZmVyT2Zmc2V0LCBlbGVtZW50X3NpemUpICE9IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVyT2Zmc2V0LTAwMTkzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogcFJlZ2lvblslZF0gYnVmZmVyT2Zmc2V0IDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGlzIGZvcm1hdCdzIHRleGVsIHNpemUgKCUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBpLCBwUmVnaW9uc1tpXS5idWZmZXJPZmZzZXQsIGVsZW1lbnRfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAgQnVmZmVyT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0CisgICAgICAgIGlmIChTYWZlTW9kdWxvKHBSZWdpb25zW2ldLmJ1ZmZlck9mZnNldCwgNCkgIT0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDAxOTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBwUmVnaW9uWyVkXSBidWZmZXJPZmZzZXQgMHglIiBQUkl4TEVBU1Q2NCAiIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiIsIGZ1bmN0aW9uLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zW2ldLmJ1ZmZlck9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICAvLyAgQnVmZmVyUm93TGVuZ3RoIG11c3QgYmUgMCwgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB3aWR0aCBtZW1iZXIgb2YgaW1hZ2VFeHRlbnQKKyAgICAgICAgaWYgKChwUmVnaW9uc1tpXS5idWZmZXJSb3dMZW5ndGggIT0gMCkgJiYgKHBSZWdpb25zW2ldLmJ1ZmZlclJvd0xlbmd0aCA8IHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LndpZHRoKSkgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVyUm93TGVuZ3RoLTAwMTk1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBwUmVnaW9uWyVkXSBidWZmZXJSb3dMZW5ndGggKCVkKSBtdXN0IGJlIHplcm8gb3IgZ3JlYXRlci10aGFuLW9yLWVxdWFsLXRvIGltYWdlRXh0ZW50LndpZHRoICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBpLCBwUmVnaW9uc1tpXS5idWZmZXJSb3dMZW5ndGgsIHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LndpZHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICBCdWZmZXJJbWFnZUhlaWdodCBtdXN0IGJlIDAsIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgaGVpZ2h0IG1lbWJlciBvZiBpbWFnZUV4dGVudAorICAgICAgICBpZiAoKHBSZWdpb25zW2ldLmJ1ZmZlckltYWdlSGVpZ2h0ICE9IDApICYmIChwUmVnaW9uc1tpXS5idWZmZXJJbWFnZUhlaWdodCA8IHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVySW1hZ2VIZWlnaHQtMDAxOTYiLAorICAgICAgICAgICAgICAgICIlcygpOiBwUmVnaW9uWyVkXSBidWZmZXJJbWFnZUhlaWdodCAoJWQpIG11c3QgYmUgemVybyBvciBncmVhdGVyLXRoYW4tb3ItZXF1YWwtdG8gaW1hZ2VFeHRlbnQuaGVpZ2h0ICglZCkuIiwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiwgaSwgcFJlZ2lvbnNbaV0uYnVmZmVySW1hZ2VIZWlnaHQsIHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LmhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxjdWxhdGUgYWRqdXN0ZWQgaW1hZ2UgZXh0ZW50LCBhY2NvdW50aW5nIGZvciBtdWx0aXBsYW5lIGltYWdlIGZhY3RvcnMKKyAgICAgICAgVmtFeHRlbnQzRCBhZHVzdGVkX2ltYWdlX2V4dGVudCA9IEdldEltYWdlU3VicmVzb3VyY2VFeHRlbnQoaW1hZ2Vfc3RhdGUsICZwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlKTsKKyAgICAgICAgLy8gaW1hZ2VPZmZzZXQueCBhbmQgKGltYWdlRXh0ZW50LndpZHRoICsgaW1hZ2VPZmZzZXQueCkgbXVzdCBib3RoIGJlID49IDAgYW5kIDw9IGltYWdlIHN1YnJlc291cmNlIHdpZHRoCisgICAgICAgIGlmICgocFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueCA8IDApIHx8IChwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC54ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oYWR1c3RlZF9pbWFnZV9leHRlbnQud2lkdGgpKSB8fAorICAgICAgICAgICAgKChwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC54ICsgcFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQud2lkdGgpID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oYWR1c3RlZF9pbWFnZV9leHRlbnQud2lkdGgpKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDE5NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IEJvdGggcFJlZ2lvblslZF0gaW1hZ2VvZmZzZXQueCAoJWQpIGFuZCAoaW1hZ2VFeHRlbnQud2lkdGggKyBpbWFnZU9mZnNldC54KSAoJWQpIG11c3QgYmUgPj0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6ZXJvIG9yIDw9IGltYWdlIHN1YnJlc291cmNlIHdpZHRoICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgaSwgcFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueCwgKHBSZWdpb25zW2ldLmltYWdlT2Zmc2V0LnggKyBwUmVnaW9uc1tpXS5pbWFnZUV4dGVudC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR1c3RlZF9pbWFnZV9leHRlbnQud2lkdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW1hZ2VPZmZzZXQueSBhbmQgKGltYWdlRXh0ZW50LmhlaWdodCArIGltYWdlT2Zmc2V0LnkpIG11c3QgYm90aCBiZSA+PSAwIGFuZCA8PSBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQKKyAgICAgICAgaWYgKChwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC55IDwgMCkgfHwgKHBSZWdpb25zW2ldLmltYWdlT2Zmc2V0LnkgPiBzdGF0aWNfY2FzdDxpbnQzMl90PihhZHVzdGVkX2ltYWdlX2V4dGVudC5oZWlnaHQpKSB8fAorICAgICAgICAgICAgKChwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC55ICsgcFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQuaGVpZ2h0KSA+IHN0YXRpY19jYXN0PGludDMyX3Q+KGFkdXN0ZWRfaW1hZ2VfZXh0ZW50LmhlaWdodCkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMTk4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogQm90aCBwUmVnaW9uWyVkXSBpbWFnZW9mZnNldC55ICglZCkgYW5kIChpbWFnZUV4dGVudC5oZWlnaHQgKyBpbWFnZU9mZnNldC55KSAoJWQpIG11c3QgYmUgPj0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6ZXJvIG9yIDw9IGltYWdlIHN1YnJlc291cmNlIGhlaWdodCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGksIHBSZWdpb25zW2ldLmltYWdlT2Zmc2V0LnksIChwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC55ICsgcFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQuaGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHVzdGVkX2ltYWdlX2V4dGVudC5oZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW1hZ2VPZmZzZXQueiBhbmQgKGltYWdlRXh0ZW50LmRlcHRoICsgaW1hZ2VPZmZzZXQueikgbXVzdCBib3RoIGJlID49IDAgYW5kIDw9IGltYWdlIHN1YnJlc291cmNlIGRlcHRoCisgICAgICAgIGlmICgocFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueiA8IDApIHx8IChwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC56ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oYWR1c3RlZF9pbWFnZV9leHRlbnQuZGVwdGgpKSB8fAorICAgICAgICAgICAgKChwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC56ICsgcFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQuZGVwdGgpID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oYWR1c3RlZF9pbWFnZV9leHRlbnQuZGVwdGgpKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDIwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IEJvdGggcFJlZ2lvblslZF0gaW1hZ2VvZmZzZXQueiAoJWQpIGFuZCAoaW1hZ2VFeHRlbnQuZGVwdGggKyBpbWFnZU9mZnNldC56KSAoJWQpIG11c3QgYmUgPj0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6ZXJvIG9yIDw9IGltYWdlIHN1YnJlc291cmNlIGRlcHRoICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgaSwgcFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueiwgKHBSZWdpb25zW2ldLmltYWdlT2Zmc2V0LnogKyBwUmVnaW9uc1tpXS5pbWFnZUV4dGVudC5kZXB0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR1c3RlZF9pbWFnZV9leHRlbnQuZGVwdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3VicmVzb3VyY2UgYXNwZWN0TWFzayBtdXN0IGhhdmUgZXhhY3RseSAxIGJpdCBzZXQKKyAgICAgICAgY29uc3QgaW50IG51bV9iaXRzID0gc2l6ZW9mKFZrRmxhZ3MpICogQ0hBUl9CSVQ7CisgICAgICAgIHN0ZDo6Yml0c2V0PG51bV9iaXRzPiBhc3BlY3RfbWFza19iaXRzKHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayk7CisgICAgICAgIGlmIChhc3BlY3RfbWFza19iaXRzLmNvdW50KCkgIT0gMSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1hc3BlY3RNYXNrLTAwMjEyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGFzcGVjdE1hc2tzIGZvciBpbWFnZVN1YnJlc291cmNlIGluIGVhY2ggcmVnaW9uIG11c3QgaGF2ZSBvbmx5IGEgc2luZ2xlIGJpdCBzZXQuIiwgZnVuY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW1hZ2Ugc3VicmVzb3VyY2UgYXNwZWN0IGJpdCBtdXN0IG1hdGNoIGZvcm1hdAorICAgICAgICBpZiAoIVZlcmlmeUFzcGVjdHNQcmVzZW50KHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzaywgaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1hc3BlY3RNYXNrLTAwMjExIiwKKyAgICAgICAgICAgICAgICAiJXMoKTogcFJlZ2lvblslZF0gc3VicmVzb3VyY2UgYXNwZWN0TWFzayAweCV4IHNwZWNpZmllcyBhc3BlY3RzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIGltYWdlIGZvcm1hdCAweCV4LiIsCisgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGksIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzaywgaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrcyB0aGF0IGFwcGx5IG9ubHkgdG8gY29tcHJlc3NlZCBpbWFnZXMKKyAgICAgICAgaWYgKEZvcm1hdElzQ29tcHJlc3NlZChpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpIHx8IEZvcm1hdElzU2luZ2xlUGxhbmVfNDIyKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkpIHsKKyAgICAgICAgICAgIGF1dG8gYmxvY2tfc2l6ZSA9IEZvcm1hdFRleGVsQmxvY2tFeHRlbnQoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KTsKKworICAgICAgICAgICAgLy8gIEJ1ZmZlclJvd0xlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYmxvY2sgd2lkdGgKKyAgICAgICAgICAgIGlmIChTYWZlTW9kdWxvKHBSZWdpb25zW2ldLmJ1ZmZlclJvd0xlbmd0aCwgYmxvY2tfc2l6ZS53aWR0aCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJSb3dMZW5ndGgtMDAyMDMiLAorICAgICAgICAgICAgICAgICAgICAiJXMoKTogcFJlZ2lvblslZF0gYnVmZmVyUm93TGVuZ3RoICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIGltYWdlJ3MgdGV4ZWwgd2lkdGggKCVkKS4uIiwKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGksIHBSZWdpb25zW2ldLmJ1ZmZlclJvd0xlbmd0aCwgYmxvY2tfc2l6ZS53aWR0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vICBCdWZmZXJSb3dIZWlnaHQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGJsb2NrIGhlaWdodAorICAgICAgICAgICAgaWYgKFNhZmVNb2R1bG8ocFJlZ2lvbnNbaV0uYnVmZmVySW1hZ2VIZWlnaHQsIGJsb2NrX3NpemUuaGVpZ2h0KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlckltYWdlSGVpZ2h0LTAwMjA0IiwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCk6IHBSZWdpb25bJWRdIGJ1ZmZlckltYWdlSGVpZ2h0ICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIGltYWdlJ3MgdGV4ZWwgaGVpZ2h0ICglZCkuLiIsCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBpLCBwUmVnaW9uc1tpXS5idWZmZXJJbWFnZUhlaWdodCwgYmxvY2tfc2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAgaW1hZ2Ugb2Zmc2V0cyBtdXN0IGJlIG11bHRpcGxlcyBvZiBibG9jayBkaW1lbnNpb25zCisgICAgICAgICAgICBpZiAoKFNhZmVNb2R1bG8ocFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueCwgYmxvY2tfc2l6ZS53aWR0aCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoU2FmZU1vZHVsbyhwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC55LCBibG9ja19zaXplLmhlaWdodCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoU2FmZU1vZHVsbyhwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC56LCBibG9ja19zaXplLmRlcHRoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAyMDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBwUmVnaW9uWyVkXSBpbWFnZU9mZnNldCh4LHkpICglZCwgJWQpIG11c3QgYmUgbXVsdGlwbGVzIG9mIHRoZSBjb21wcmVzc2VkIGltYWdlJ3MgdGV4ZWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCAmIGhlaWdodCAoJWQsICVkKS4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgaSwgcFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueCwgcFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueSwgYmxvY2tfc2l6ZS53aWR0aCwgYmxvY2tfc2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBidWZmZXJPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGJsb2NrIHNpemUgKGxpbmVhciBieXRlcykKKyAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrX3NpemVfaW5fYnl0ZXMgPSBGb3JtYXRFbGVtZW50U2l6ZShpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5mb3JtYXQpOworICAgICAgICAgICAgaWYgKFNhZmVNb2R1bG8ocFJlZ2lvbnNbaV0uYnVmZmVyT2Zmc2V0LCBibG9ja19zaXplX2luX2J5dGVzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVyT2Zmc2V0LTAwMjA2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IHBSZWdpb25bJWRdIGJ1ZmZlck9mZnNldCAoMHglIiBQUkl4TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgaW1hZ2UncyB0ZXhlbCBibG9jayBzaXplICglIiBQUkl1MzIgIikuLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBpLCBwUmVnaW9uc1tpXS5idWZmZXJPZmZzZXQsIGJsb2NrX3NpemVfaW5fYnl0ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpbWFnZUV4dGVudCB3aWR0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYmxvY2sgd2lkdGgsIG9yIGV4dGVudCtvZmZzZXQgd2lkdGggbXVzdCBlcXVhbCBzdWJyZXNvdXJjZSB3aWR0aAorICAgICAgICAgICAgVmtFeHRlbnQzRCBtaXBfZXh0ZW50ID0gR2V0SW1hZ2VTdWJyZXNvdXJjZUV4dGVudChpbWFnZV9zdGF0ZSwgJihwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlKSk7CisgICAgICAgICAgICBpZiAoKFNhZmVNb2R1bG8ocFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQud2lkdGgsIGJsb2NrX3NpemUud2lkdGgpICE9IDApICYmCisgICAgICAgICAgICAgICAgKHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LndpZHRoICsgcFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueCAhPSBtaXBfZXh0ZW50LndpZHRoKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlRXh0ZW50LTAwMjA3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IHBSZWdpb25bJWRdIGV4dGVudCB3aWR0aCAoJWQpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXh0dXJlIGJsb2NrIHdpZHRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglZCksIG9yIHdoZW4gYWRkZWQgdG8gb2Zmc2V0LnggKCVkKSBtdXN0IGVxdWFsIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSB3aWR0aCAoJWQpLi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgaSwgcFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQud2lkdGgsIGJsb2NrX3NpemUud2lkdGgsIHBSZWdpb25zW2ldLmltYWdlT2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcF9leHRlbnQud2lkdGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpbWFnZUV4dGVudCBoZWlnaHQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGJsb2NrIGhlaWdodCwgb3IgZXh0ZW50K29mZnNldCBoZWlnaHQgbXVzdCBlcXVhbCBzdWJyZXNvdXJjZSBoZWlnaHQKKyAgICAgICAgICAgIGlmICgoU2FmZU1vZHVsbyhwUmVnaW9uc1tpXS5pbWFnZUV4dGVudC5oZWlnaHQsIGJsb2NrX3NpemUuaGVpZ2h0KSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIChwUmVnaW9uc1tpXS5pbWFnZUV4dGVudC5oZWlnaHQgKyBwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC55ICE9IG1pcF9leHRlbnQuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlRXh0ZW50LTAwMjA4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IHBSZWdpb25bJWRdIGV4dGVudCBoZWlnaHQgKCVkKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4dHVyZSBibG9jayBoZWlnaHQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVkKSwgb3Igd2hlbiBhZGRlZCB0byBvZmZzZXQueSAoJWQpIG11c3QgZXF1YWwgdGhlIGltYWdlIHN1YnJlc291cmNlIGhlaWdodCAoJWQpLi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgaSwgcFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQuaGVpZ2h0LCBibG9ja19zaXplLmhlaWdodCwgcFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwX2V4dGVudC5oZWlnaHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpbWFnZUV4dGVudCBkZXB0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYmxvY2sgZGVwdGgsIG9yIGV4dGVudCtvZmZzZXQgZGVwdGggbXVzdCBlcXVhbCBzdWJyZXNvdXJjZSBkZXB0aAorICAgICAgICAgICAgaWYgKChTYWZlTW9kdWxvKHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LmRlcHRoLCBibG9ja19zaXplLmRlcHRoKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIChwUmVnaW9uc1tpXS5pbWFnZUV4dGVudC5kZXB0aCArIHBSZWdpb25zW2ldLmltYWdlT2Zmc2V0LnogIT0gbWlwX2V4dGVudC5kZXB0aCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZUV4dGVudC0wMDIwOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBwUmVnaW9uWyVkXSBleHRlbnQgd2lkdGggKCVkKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4dHVyZSBibG9jayBkZXB0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWQpLCBvciB3aGVuIGFkZGVkIHRvIG9mZnNldC56ICglZCkgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGggKCVkKS4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGksIHBSZWdpb25zW2ldLmltYWdlRXh0ZW50LmRlcHRoLCBibG9ja19zaXplLmRlcHRoLCBwUmVnaW9uc1tpXS5pbWFnZU9mZnNldC56LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBfZXh0ZW50LmRlcHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitzdGF0aWMgYm9vbCBWYWxpZGF0ZUltYWdlQm91bmRzKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgY29uc3QgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlLCBjb25zdCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkgKnBSZWdpb25zLCBjb25zdCBjaGFyICpmdW5jX25hbWUsIGNvbnN0IGNoYXIgKm1zZ19jb2RlKSB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmltYWdlX2luZm8gPSAmKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgaSsrKSB7CisgICAgICAgIFZrRXh0ZW50M0QgZXh0ZW50ID0gcFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQ7CisgICAgICAgIFZrT2Zmc2V0M0Qgb2Zmc2V0ID0gcFJlZ2lvbnNbaV0uaW1hZ2VPZmZzZXQ7CisKKyAgICAgICAgaWYgKElzRXh0ZW50U2l6ZVplcm8oJmV4dGVudCkpICAvLyBXYXJuIG9uIHplcm8gYXJlYSBzdWJyZXNvdXJjZQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwgKHVpbnQ2NF90KTAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0ltYWdlX1plcm9BcmVhU3VicmVnaW9uLCAiJXM6IHBSZWdpb25bJWRdIGltYWdlRXh0ZW50IG9mIHslMWQsICUxZCwgJTFkfSBoYXMgemVybyBhcmVhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgaSwgZXh0ZW50LndpZHRoLCBleHRlbnQuaGVpZ2h0LCBleHRlbnQuZGVwdGgpOworICAgICAgICB9CisKKyAgICAgICAgVmtFeHRlbnQzRCBpbWFnZV9leHRlbnQgPSBHZXRJbWFnZVN1YnJlc291cmNlRXh0ZW50KGltYWdlX3N0YXRlLCAmKHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UpKTsKKworICAgICAgICAvLyBJZiB3ZSdyZSB1c2luZyBhIGNvbXByZXNzZWQgZm9ybWF0LCB2YWxpZCBleHRlbnQgaXMgcm91bmRlZCB1cCB0byBtdWx0aXBsZSBvZiBibG9jayBzaXplIChwZXIgMTguMSkKKyAgICAgICAgaWYgKEZvcm1hdElzQ29tcHJlc3NlZChpbWFnZV9pbmZvLT5mb3JtYXQpIHx8IEZvcm1hdElzU2luZ2xlUGxhbmVfNDIyKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkpIHsKKyAgICAgICAgICAgIGF1dG8gYmxvY2tfZXh0ZW50ID0gRm9ybWF0VGV4ZWxCbG9ja0V4dGVudChpbWFnZV9pbmZvLT5mb3JtYXQpOworICAgICAgICAgICAgaWYgKGltYWdlX2V4dGVudC53aWR0aCAlIGJsb2NrX2V4dGVudC53aWR0aCkgeworICAgICAgICAgICAgICAgIGltYWdlX2V4dGVudC53aWR0aCArPSAoYmxvY2tfZXh0ZW50LndpZHRoIC0gKGltYWdlX2V4dGVudC53aWR0aCAlIGJsb2NrX2V4dGVudC53aWR0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltYWdlX2V4dGVudC5oZWlnaHQgJSBibG9ja19leHRlbnQuaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfZXh0ZW50LmhlaWdodCArPSAoYmxvY2tfZXh0ZW50LmhlaWdodCAtIChpbWFnZV9leHRlbnQuaGVpZ2h0ICUgYmxvY2tfZXh0ZW50LmhlaWdodCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltYWdlX2V4dGVudC5kZXB0aCAlIGJsb2NrX2V4dGVudC5kZXB0aCkgeworICAgICAgICAgICAgICAgIGltYWdlX2V4dGVudC5kZXB0aCArPSAoYmxvY2tfZXh0ZW50LmRlcHRoIC0gKGltYWdlX2V4dGVudC5kZXB0aCAlIGJsb2NrX2V4dGVudC5kZXB0aCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKDAgIT0gRXhjZWVkc0JvdW5kcygmb2Zmc2V0LCAmZXh0ZW50LCAmaW1hZ2VfZXh0ZW50KSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwgKHVpbnQ2NF90KTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX2NvZGUsICIlczogcFJlZ2lvblslZF0gZXhjZWVkcyBpbWFnZSBib3VuZHMuLiIsIGZ1bmNfbmFtZSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworc3RhdGljIGlubGluZSBib29sIFZhbGlkYXRlQnVmZmVyQm91bmRzKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgY29uc3QgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJVRkZFUl9TVEFURSAqYnVmZl9zdGF0ZSwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5ICpwUmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jX25hbWUsIGNvbnN0IGNoYXIgKm1zZ19jb2RlKSB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBWa0RldmljZVNpemUgYnVmZmVyX3NpemUgPSBidWZmX3N0YXRlLT5jcmVhdGVJbmZvLnNpemU7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVnaW9uQ291bnQ7IGkrKykgeworICAgICAgICBWa0V4dGVudDNEIGNvcHlfZXh0ZW50ID0gcFJlZ2lvbnNbaV0uaW1hZ2VFeHRlbnQ7CisKKyAgICAgICAgVmtEZXZpY2VTaXplIGJ1ZmZlcl93aWR0aCA9ICgwID09IHBSZWdpb25zW2ldLmJ1ZmZlclJvd0xlbmd0aCA/IGNvcHlfZXh0ZW50LndpZHRoIDogcFJlZ2lvbnNbaV0uYnVmZmVyUm93TGVuZ3RoKTsKKyAgICAgICAgVmtEZXZpY2VTaXplIGJ1ZmZlcl9oZWlnaHQgPSAoMCA9PSBwUmVnaW9uc1tpXS5idWZmZXJJbWFnZUhlaWdodCA/IGNvcHlfZXh0ZW50LmhlaWdodCA6IHBSZWdpb25zW2ldLmJ1ZmZlckltYWdlSGVpZ2h0KTsKKyAgICAgICAgVmtEZXZpY2VTaXplIHVuaXRfc2l6ZSA9IEZvcm1hdEVsZW1lbnRTaXplKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayk7ICAvLyBzaXplIChieXRlcykgb2YgdGV4ZWwgb3IgYmxvY2sKKworICAgICAgICBpZiAoRm9ybWF0SXNDb21wcmVzc2VkKGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCkgfHwgRm9ybWF0SXNTaW5nbGVQbGFuZV80MjIoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZm9ybWF0KSkgeworICAgICAgICAgICAgLy8gU3dpdGNoIHRvIHRleGVsIGJsb2NrIHVuaXRzLCByb3VuZGluZyB1cCBmb3IgYW55IHBhcnRpYWxseS11c2VkIGJsb2NrcworICAgICAgICAgICAgYXV0byBibG9ja19kaW0gPSBGb3JtYXRUZXhlbEJsb2NrRXh0ZW50KGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLmZvcm1hdCk7CisgICAgICAgICAgICBidWZmZXJfd2lkdGggPSAoYnVmZmVyX3dpZHRoICsgYmxvY2tfZGltLndpZHRoIC0gMSkgLyBibG9ja19kaW0ud2lkdGg7CisgICAgICAgICAgICBidWZmZXJfaGVpZ2h0ID0gKGJ1ZmZlcl9oZWlnaHQgKyBibG9ja19kaW0uaGVpZ2h0IC0gMSkgLyBibG9ja19kaW0uaGVpZ2h0OworCisgICAgICAgICAgICBjb3B5X2V4dGVudC53aWR0aCA9IChjb3B5X2V4dGVudC53aWR0aCArIGJsb2NrX2RpbS53aWR0aCAtIDEpIC8gYmxvY2tfZGltLndpZHRoOworICAgICAgICAgICAgY29weV9leHRlbnQuaGVpZ2h0ID0gKGNvcHlfZXh0ZW50LmhlaWdodCArIGJsb2NrX2RpbS5oZWlnaHQgLSAxKSAvIGJsb2NrX2RpbS5oZWlnaHQ7CisgICAgICAgICAgICBjb3B5X2V4dGVudC5kZXB0aCA9IChjb3B5X2V4dGVudC5kZXB0aCArIGJsb2NrX2RpbS5kZXB0aCAtIDEpIC8gYmxvY2tfZGltLmRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgLy8gRWl0aGVyIGRlcHRoIG9yIGxheWVyQ291bnQgbWF5IGJlIGdyZWF0ZXIgdGhhbiAxIChub3QgYm90aCkuIFRoaXMgaXMgdGhlIG51bWJlciBvZiAnc2xpY2VzJyB0byBjb3B5CisgICAgICAgIHVpbnQzMl90IHpfY29waWVzID0gc3RkOjptYXgoY29weV9leHRlbnQuZGVwdGgsIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudCk7CisgICAgICAgIGlmIChJc0V4dGVudFNpemVaZXJvKCZjb3B5X2V4dGVudCkgfHwgKDAgPT0gel9jb3BpZXMpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSB3YXJuaW5nIGhlcmU/IEFscmVhZHkgd2FybmVkIGluIFZhbGlkYXRlSW1hZ2VCb3VuZHMoKS4uLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGJ1ZmZlciBvZmZzZXQgb2YgZmluYWwgY29waWVkIGJ5dGUsICsgMS4KKyAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtYXhfYnVmZmVyX29mZnNldCA9ICh6X2NvcGllcyAtIDEpICogYnVmZmVyX2hlaWdodCAqIGJ1ZmZlcl93aWR0aDsgICAgICAvLyBvZmZzZXQgdG8gc2xpY2UKKyAgICAgICAgICAgIG1heF9idWZmZXJfb2Zmc2V0ICs9ICgoY29weV9leHRlbnQuaGVpZ2h0IC0gMSkgKiBidWZmZXJfd2lkdGgpICsgY29weV9leHRlbnQud2lkdGg7ICAvLyBhZGQgcm93LGNvbAorICAgICAgICAgICAgbWF4X2J1ZmZlcl9vZmZzZXQgKj0gdW5pdF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYnl0ZXMKKyAgICAgICAgICAgIG1heF9idWZmZXJfb2Zmc2V0ICs9IHBSZWdpb25zW2ldLmJ1ZmZlck9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaW5pdGlhbCBvZmZzZXQgKGJ5dGVzKQorCisgICAgICAgICAgICBpZiAoYnVmZmVyX3NpemUgPCBtYXhfYnVmZmVyX29mZnNldCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsICh1aW50NjRfdCkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19jb2RlLCAiJXM6IHBSZWdpb25bJWRdIGV4Y2VlZHMgYnVmZmVyIHNpemUgb2YgJSIgUFJJdTY0ICIgYnl0ZXMuLiIsIGZ1bmNfbmFtZSwgaSwgYnVmZmVyX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kQ29weUltYWdlVG9CdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGRzdEJ1ZmZlciwgdWludDMyX3QgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5ICpwUmVnaW9ucykgY29uc3QgeworICAgIGNvbnN0IGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY29uc3QgYXV0byBzcmNfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHNyY0ltYWdlKTsKKyAgICBjb25zdCBhdXRvIGRzdF9idWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShkc3RCdWZmZXIpOworCisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVCdWZmZXJJbWFnZUNvcHlEYXRhKHJlZ2lvbkNvdW50LCBwUmVnaW9ucywgc3JjX2ltYWdlX3N0YXRlLCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciIpOworCisgICAgLy8gVmFsaWRhdGUgY29tbWFuZCBidWZmZXIgc3RhdGUKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX25vZGUsIENNRF9DT1BZSU1BR0VUT0JVRkZFUiwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIoKSIpOworCisgICAgLy8gQ29tbWFuZCBwb29sIG11c3Qgc3VwcG9ydCBncmFwaGljcywgY29tcHV0ZSwgb3IgdHJhbnNmZXIgb3BlcmF0aW9ucworICAgIGNvbnN0IGF1dG8gcFBvb2wgPSBjYl9ub2RlLT5jb21tYW5kX3Bvb2wuZ2V0KCk7CisKKyAgICBWa1F1ZXVlRmxhZ3MgcXVldWVfZmxhZ3MgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKCktPnF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW3BQb29sLT5xdWV1ZUZhbWlseUluZGV4XS5xdWV1ZUZsYWdzOworCisgICAgaWYgKDAgPT0gKHF1ZXVlX2ZsYWdzICYgKFZLX1FVRVVFX0dSQVBISUNTX0JJVCB8IFZLX1FVRVVFX0NPTVBVVEVfQklUIHwgVktfUVVFVUVfVFJBTlNGRVJfQklUKSkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNyZWF0ZUluZm8uY29tbWFuZFBvb2wpLCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNhbGwgdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcigpIG9uIGEgY29tbWFuZCBidWZmZXIgYWxsb2NhdGVkIGZyb20gYSBwb29sIHdpdGhvdXQgZ3JhcGhpY3MsIGNvbXB1dGUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvciB0cmFuc2ZlciBjYXBhYmlsaXRpZXMuLiIpOworICAgIH0KKyAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VCb3VuZHMocmVwb3J0X2RhdGEsIHNyY19pbWFnZV9zdGF0ZSwgcmVnaW9uQ291bnQsIHBSZWdpb25zLCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MiIpOworICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJCb3VuZHMocmVwb3J0X2RhdGEsIHNyY19pbWFnZV9zdGF0ZSwgZHN0X2J1ZmZlcl9zdGF0ZSwgcmVnaW9uQ291bnQsIHBSZWdpb25zLCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcFJlZ2lvbnMtMDAxODMiKTsKKworICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZVNhbXBsZUNvdW50KHNyY19pbWFnZV9zdGF0ZSwgVktfU0FNUExFX0NPVU5UXzFfQklULCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcigpOiBzcmNJbWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZS0wMDE4OCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9JbWFnZShzcmNfaW1hZ2Vfc3RhdGUsICJ2a0NtZENvcHlJbWFnZVRvQnVmZmVyKCkiLCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLTAwMTg3Iik7CisgICAgc2tpcCB8PQorICAgICAgICBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0J1ZmZlcihkc3RfYnVmZmVyX3N0YXRlLCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcigpIiwgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1kc3RCdWZmZXItMDAxOTIiKTsKKworICAgIC8vIFZhbGlkYXRlIHRoYXQgU1JDIGltYWdlICYgRFNUIGJ1ZmZlciBoYXZlIGNvcnJlY3QgdXNhZ2UgZmxhZ3Mgc2V0CisgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlVXNhZ2VGbGFncyhzcmNfaW1hZ2Vfc3RhdGUsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLTAwMTg2IiwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKGRzdF9idWZmZXJfc3RhdGUsIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItZHN0QnVmZmVyLTAwMTkxIiwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIik7CisgICAgaWYgKGFwaV92ZXJzaW9uID49IFZLX0FQSV9WRVJTSU9OXzFfMSB8fCBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UxKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUZvcm1hdEZlYXR1cmVGbGFncyhzcmNfaW1hZ2Vfc3RhdGUsIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVQsICJ2a0NtZENvcHlJbWFnZVRvQnVmZmVyKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZS0wMTk5OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLTAxOTk4Iik7CisgICAgfQorICAgIHNraXAgfD0gSW5zaWRlUmVuZGVyUGFzcyhjYl9ub2RlLCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcigpIiwgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1yZW5kZXJwYXNzIik7CisgICAgYm9vbCBoaXRfZXJyb3IgPSBmYWxzZTsKKyAgICBjb25zdCBjaGFyICpzcmNfaW52YWxpZF9sYXlvdXRfdnVpZCA9IChzcmNfaW1hZ2Vfc3RhdGUtPnNoYXJlZF9wcmVzZW50YWJsZSAmJiBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZUxheW91dC0wMTM5NyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2VMYXlvdXQtMDAxOTAiOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgKytpKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZVN1YnJlc291cmNlTGF5ZXJzKGNiX25vZGUsICZwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlLCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlU3VicmVzb3VyY2UiLCBpKTsKKyAgICAgICAgc2tpcCB8PSBWZXJpZnlJbWFnZUxheW91dChjYl9ub2RlLCBzcmNfaW1hZ2Vfc3RhdGUsIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UsIHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIoKSIsIHNyY19pbnZhbGlkX2xheW91dF92dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2VMYXlvdXQtMDAxODkiLCAmaGl0X2Vycm9yKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNvcHlCdWZmZXJJbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHlSZXF1aXJlbWVudHMoCisgICAgICAgICAgICBjYl9ub2RlLCBzcmNfaW1hZ2Vfc3RhdGUsICZwUmVnaW9uc1tpXSwgaSwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIoKSIsICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItaW1hZ2VPZmZzZXQtMDE3OTQiKTsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgVmFsaWRhdGVJbWFnZU1pcExldmVsKGNiX25vZGUsIHNyY19pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uaW1hZ2VTdWJyZXNvdXJjZS5taXBMZXZlbCwgaSwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlU3VicmVzb3VyY2UiLCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWltYWdlU3VicmVzb3VyY2UtMDE3MDMiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlQXJyYXlMYXllclJhbmdlKGNiX25vZGUsIHNyY19pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uaW1hZ2VTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudCwgaSwgInZrQ21kQ29weUltYWdlVG9CdWZmZXIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VTdWJyZXNvdXJjZSIsICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItaW1hZ2VTdWJyZXNvdXJjZS0wMTcwNCIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQcmVDYWxsUmVjb3JkQ21kQ29weUltYWdlVG9CdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckltYWdlQ29weSAqcFJlZ2lvbnMpIHsKKyAgICBTdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2VUb0J1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKworICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byBzcmNfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHNyY0ltYWdlKTsKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCBhbGwgaW1hZ2Ugc2xpY2VzIHJlY29yZCByZWZlcmVuY2VkIGxheW91dAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgKytpKSB7CisgICAgICAgIFNldEltYWdlSW5pdGlhbExheW91dChjYl9ub2RlLCAqc3JjX2ltYWdlX3N0YXRlLCBwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlLCBzcmNJbWFnZUxheW91dCk7CisgICAgfQorfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZENvcHlCdWZmZXJUb0ltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBzcmNCdWZmZXIsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSAqcFJlZ2lvbnMpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIGNiX25vZGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNvbnN0IGF1dG8gc3JjX2J1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKHNyY0J1ZmZlcik7CisgICAgY29uc3QgYXV0byBkc3RfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGRzdEltYWdlKTsKKworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQnVmZmVySW1hZ2VDb3B5RGF0YShyZWdpb25Db3VudCwgcFJlZ2lvbnMsIGRzdF9pbWFnZV9zdGF0ZSwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UiKTsKKworICAgIC8vIFZhbGlkYXRlIGNvbW1hbmQgYnVmZmVyIHN0YXRlCisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9ub2RlLCBDTURfQ09QWUJVRkZFUlRPSU1BR0UsICJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlKCkiKTsKKworICAgIC8vIENvbW1hbmQgcG9vbCBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIGNvbXB1dGUsIG9yIHRyYW5zZmVyIG9wZXJhdGlvbnMKKyAgICBjb25zdCBhdXRvIHBQb29sID0gY2Jfbm9kZS0+Y29tbWFuZF9wb29sLmdldCgpOworICAgIFZrUXVldWVGbGFncyBxdWV1ZV9mbGFncyA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUoKS0+cXVldWVfZmFtaWx5X3Byb3BlcnRpZXNbcFBvb2wtPnF1ZXVlRmFtaWx5SW5kZXhdLnF1ZXVlRmxhZ3M7CisgICAgaWYgKDAgPT0gKHF1ZXVlX2ZsYWdzICYgKFZLX1FVRVVFX0dSQVBISUNTX0JJVCB8IFZLX1FVRVVFX0NPTVBVVEVfQklUIHwgVktfUVVFVUVfVFJBTlNGRVJfQklUKSkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNyZWF0ZUluZm8uY29tbWFuZFBvb2wpLCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNhbGwgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgpIG9uIGEgY29tbWFuZCBidWZmZXIgYWxsb2NhdGVkIGZyb20gYSBwb29sIHdpdGhvdXQgZ3JhcGhpY3MsIGNvbXB1dGUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvciB0cmFuc2ZlciBjYXBhYmlsaXRpZXMuLiIpOworICAgIH0KKyAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VCb3VuZHMocmVwb3J0X2RhdGEsIGRzdF9pbWFnZV9zdGF0ZSwgcmVnaW9uQ291bnQsIHBSZWdpb25zLCAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1wUmVnaW9ucy0wMDE3MiIpOworICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJCb3VuZHMocmVwb3J0X2RhdGEsIGRzdF9pbWFnZV9zdGF0ZSwgc3JjX2J1ZmZlcl9zdGF0ZSwgcmVnaW9uQ291bnQsIHBSZWdpb25zLCAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtMDAxNzEiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VTYW1wbGVDb3VudChkc3RfaW1hZ2Vfc3RhdGUsIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoKTogZHN0SW1hZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtMDAxNzkiKTsKKyAgICBza2lwIHw9CisgICAgICAgIFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvQnVmZmVyKHNyY19idWZmZXJfc3RhdGUsICJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlKCkiLCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXNyY0J1ZmZlci0wMDE3NiIpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9JbWFnZShkc3RfaW1hZ2Vfc3RhdGUsICJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlKCkiLCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlLTAwMTc4Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3Moc3JjX2J1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1zcmNCdWZmZXItMDAxNzQiLCAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VVc2FnZUZsYWdzKGRzdF9pbWFnZV9zdGF0ZSwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtMDAxNzciLCAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIik7CisgICAgaWYgKGFwaV92ZXJzaW9uID49IFZLX0FQSV9WRVJTSU9OXzFfMSB8fCBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UxKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUZvcm1hdEZlYXR1cmVGbGFncyhkc3RfaW1hZ2Vfc3RhdGUsIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQsICJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS0wMTk5NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlLTAxOTk3Iik7CisgICAgfQorICAgIHNraXAgfD0gSW5zaWRlUmVuZGVyUGFzcyhjYl9ub2RlLCAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgpIiwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1yZW5kZXJwYXNzIik7CisgICAgYm9vbCBoaXRfZXJyb3IgPSBmYWxzZTsKKyAgICBjb25zdCBjaGFyICpkc3RfaW52YWxpZF9sYXlvdXRfdnVpZCA9IChkc3RfaW1hZ2Vfc3RhdGUtPnNoYXJlZF9wcmVzZW50YWJsZSAmJiBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZUxheW91dC0wMTM5NiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxODEiOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25Db3VudDsgKytpKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZVN1YnJlc291cmNlTGF5ZXJzKGNiX25vZGUsICZwUmVnaW9uc1tpXS5pbWFnZVN1YnJlc291cmNlLCAidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlU3VicmVzb3VyY2UiLCBpKTsKKyAgICAgICAgc2tpcCB8PSBWZXJpZnlJbWFnZUxheW91dChjYl9ub2RlLCBkc3RfaW1hZ2Vfc3RhdGUsIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UsIGRzdEltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoKSIsIGRzdF9pbnZhbGlkX2xheW91dF92dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxODAiLCAmaGl0X2Vycm9yKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNvcHlCdWZmZXJJbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHlSZXF1aXJlbWVudHMoCisgICAgICAgICAgICBjYl9ub2RlLCBkc3RfaW1hZ2Vfc3RhdGUsICZwUmVnaW9uc1tpXSwgaSwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoKSIsICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtaW1hZ2VPZmZzZXQtMDE3OTMiKTsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgVmFsaWRhdGVJbWFnZU1pcExldmVsKGNiX25vZGUsIGRzdF9pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uaW1hZ2VTdWJyZXNvdXJjZS5taXBMZXZlbCwgaSwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlU3VicmVzb3VyY2UiLCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWltYWdlU3VicmVzb3VyY2UtMDE3MDEiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlQXJyYXlMYXllclJhbmdlKGNiX25vZGUsIGRzdF9pbWFnZV9zdGF0ZSwgcFJlZ2lvbnNbaV0uaW1hZ2VTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudCwgaSwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VTdWJyZXNvdXJjZSIsICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtaW1hZ2VTdWJyZXNvdXJjZS0wMTcwMiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlclRvSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtJbWFnZSBkc3RJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkgKnBSZWdpb25zKSB7CisgICAgU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlclRvSW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisKKyAgICBhdXRvIGNiX25vZGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGF1dG8gZHN0X2ltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShkc3RJbWFnZSk7CisgICAgLy8gTWFrZSBzdXJlIHRoYXQgYWxsIGltYWdlIHNsaWNlcyBhcmUgcmVjb3JkIHJlZmVyZW5jZWQgbGF5b3V0CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlZ2lvbkNvdW50OyArK2kpIHsKKyAgICAgICAgU2V0SW1hZ2VJbml0aWFsTGF5b3V0KGNiX25vZGUsICpkc3RfaW1hZ2Vfc3RhdGUsIHBSZWdpb25zW2ldLmltYWdlU3VicmVzb3VyY2UsIGRzdEltYWdlTGF5b3V0KTsKKyAgICB9Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSAqcFN1YnJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VicmVzb3VyY2VMYXlvdXQgKnBMYXlvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBWa0ltYWdlQXNwZWN0RmxhZ3Mgc3ViX2FzcGVjdCA9IHBTdWJyZXNvdXJjZS0+YXNwZWN0TWFzazsKKworICAgIC8vIFRoZSBhc3BlY3RNYXNrIG1lbWJlciBvZiBwU3VicmVzb3VyY2UgbXVzdCBvbmx5IGhhdmUgYSBzaW5nbGUgYml0IHNldAorICAgIGNvbnN0IGludCBudW1fYml0cyA9IHNpemVvZihzdWJfYXNwZWN0KSAqIENIQVJfQklUOworICAgIHN0ZDo6Yml0c2V0PG51bV9iaXRzPiBhc3BlY3RfbWFza19iaXRzKHN1Yl9hc3BlY3QpOworICAgIGlmIChhc3BlY3RfbWFza19iaXRzLmNvdW50KCkgIT0gMSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBIYW5kbGVUb1VpbnQ2NChpbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtYXNwZWN0TWFzay0wMDk5NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KCk6IFZrSW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrIG11c3QgaGF2ZSBleGFjdGx5IDEgYml0IHNldC4iKTsKKyAgICB9CisKKyAgICBjb25zdCBJTUFHRV9TVEFURSAqaW1hZ2VfZW50cnkgPSBHZXRJbWFnZVN0YXRlKGltYWdlKTsKKyAgICBpZiAoIWltYWdlX2VudHJ5KSB7CisgICAgICAgIHJldHVybiBza2lwOworICAgIH0KKworICAgIC8vIEltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aWxpbmcgZXF1YWwgdG8gVktfSU1BR0VfVElMSU5HX0xJTkVBUgorICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikgeworICAgICAgICBpZiAoKGltYWdlX2VudHJ5LT5jcmVhdGVJbmZvLnRpbGluZyAhPSBWS19JTUFHRV9USUxJTkdfTElORUFSKSAmJgorICAgICAgICAgICAgKGltYWdlX2VudHJ5LT5jcmVhdGVJbmZvLnRpbGluZyAhPSBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlKSwgIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLTAyMjcwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KCk6IEltYWdlIG11c3QgaGF2ZSB0aWxpbmcgb2YgVktfSU1BR0VfVElMSU5HX0xJTkVBUiBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVC4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbWFnZV9lbnRyeS0+Y3JlYXRlSW5mby50aWxpbmcgIT0gVktfSU1BR0VfVElMSU5HX0xJTkVBUikgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZSksICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1pbWFnZS0wMDk5NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgpOiBJbWFnZSBtdXN0IGhhdmUgdGlsaW5nIG9mIFZLX0lNQUdFX1RJTElOR19MSU5FQVIuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBtaXBMZXZlbCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWlwTGV2ZWxzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAorICAgIGlmIChwU3VicmVzb3VyY2UtPm1pcExldmVsID49IGltYWdlX2VudHJ5LT5jcmVhdGVJbmZvLm1pcExldmVscykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBIYW5kbGVUb1VpbnQ2NChpbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtbWlwTGV2ZWwtMDE3MTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgpOiBwU3VicmVzb3VyY2UubWlwTGV2ZWwgKCVkKSBtdXN0IGJlIGxlc3MgdGhhbiAlZC4iLCBwU3VicmVzb3VyY2UtPm1pcExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZW50cnktPmNyZWF0ZUluZm8ubWlwTGV2ZWxzKTsKKyAgICB9CisKKyAgICAvLyBhcnJheUxheWVyIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhcnJheUxheWVycyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiB0aGUgaW1hZ2Ugd2FzIGNyZWF0ZWQKKyAgICBpZiAocFN1YnJlc291cmNlLT5hcnJheUxheWVyID49IGltYWdlX2VudHJ5LT5jcmVhdGVJbmZvLmFycmF5TGF5ZXJzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIEhhbmRsZVRvVWludDY0KGltYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1hcnJheUxheWVyLTAxNzE3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoKTogcFN1YnJlc291cmNlLmFycmF5TGF5ZXIgKCVkKSBtdXN0IGJlIGxlc3MgdGhhbiAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLT5hcnJheUxheWVyLCBpbWFnZV9lbnRyeS0+Y3JlYXRlSW5mby5hcnJheUxheWVycyk7CisgICAgfQorCisgICAgLy8gc3VicmVzb3VyY2UncyBhc3BlY3QgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggaW1hZ2UncyBmb3JtYXQuCisgICAgY29uc3QgVmtGb3JtYXQgaW1nX2Zvcm1hdCA9IGltYWdlX2VudHJ5LT5jcmVhdGVJbmZvLmZvcm1hdDsKKyAgICBpZiAoaW1hZ2VfZW50cnktPmNyZWF0ZUluZm8udGlsaW5nID09IFZLX0lNQUdFX1RJTElOR19MSU5FQVIpIHsKKyAgICAgICAgaWYgKEZvcm1hdElzTXVsdGlwbGFuZShpbWdfZm9ybWF0KSkgeworICAgICAgICAgICAgVmtJbWFnZUFzcGVjdEZsYWdzIGFsbG93ZWRfZmxhZ3MgPSAoVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUiB8IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVF9LSFIpOworICAgICAgICAgICAgY29uc3QgY2hhciAqdnVpZCA9ICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1mb3JtYXQtMDE1ODEiOyAgLy8gMi1wbGFuZSB2ZXJzaW9uCisgICAgICAgICAgICBpZiAoRm9ybWF0UGxhbmVDb3VudChpbWdfZm9ybWF0KSA+IDJ1KSB7CisgICAgICAgICAgICAgICAgYWxsb3dlZF9mbGFncyB8PSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSOworICAgICAgICAgICAgICAgIHZ1aWQgPSAiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtZm9ybWF0LTAxNTgyIjsgIC8vIDMtcGxhbmUgdmVyc2lvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1Yl9hc3BlY3QgIT0gKHN1Yl9hc3BlY3QgJiBhbGxvd2VkX2ZsYWdzKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgpOiBGb3IgbXVsdGktcGxhbmFyIGltYWdlcywgVmtJbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2sgKDB4JSIgUFJJeDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG11c3QgYmUgYSBzaW5nbGUtcGxhbmUgc3BlY2lmaWVyIGZsYWcuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2FzcGVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0SXNDb2xvcihpbWdfZm9ybWF0KSkgeworICAgICAgICAgICAgaWYgKHN1Yl9hc3BlY3QgIT0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEltYWdlQXNwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KCk6IEZvciBjb2xvciBmb3JtYXRzLCBWa0ltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0FTUEVDVF9DT0xPUi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChGb3JtYXRJc0RlcHRoT3JTdGVuY2lsKGltZ19mb3JtYXQpKSB7CisgICAgICAgICAgICBpZiAoKHN1Yl9hc3BlY3QgIT0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCkgJiYgKHN1Yl9hc3BlY3QgIT0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpbWFnZV9lbnRyeS0+Y3JlYXRlSW5mby50aWxpbmcgPT0gVktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUKSB7CisgICAgICAgIGlmICgoc3ViX2FzcGVjdCAhPSBWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzBfQklUX0VYVCkgJiYgKHN1Yl9hc3BlY3QgIT0gVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8xX0JJVF9FWFQpICYmCisgICAgICAgICAgICAoc3ViX2FzcGVjdCAhPSBWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzJfQklUX0VYVCkgJiYgKHN1Yl9hc3BlY3QgIT0gVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8zX0JJVF9FWFQpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIFZVIGFsc28gbmVlZHMgdG8gZW5zdXJlIHRoYXQgdGhlIERSTSBpbmRleCBpcyBpbiByYW5nZSBhbmQgdmFsaWQuCisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlKSwgIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LXRpbGluZy0wMjI3MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgpOiBWa0ltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV9pX0JJVF9FWFQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfYW5kcm9pZF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUdldEltYWdlU3VicmVzb3VyY2VMYXlvdXRBTkRST0lEKGltYWdlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9idWZmZXJfdmFsaWRhdGlvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2J1ZmZlcl92YWxpZGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjZjU0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9idWZmZXJfdmFsaWRhdGlvbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICovCisjaWZuZGVmIENPUkVfVkFMSURBVElPTl9CVUZGRVJfVkFMSURBVElPTl9IXworI2RlZmluZSBDT1JFX1ZBTElEQVRJT05fQlVGRkVSX1ZBTElEQVRJT05fSF8KKworI2luY2x1ZGUgInZ1bGthbi92a19sYXllci5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxiaXRzZXQ+CisKK3VpbnQzMl90IEZ1bGxNaXBDaGFpbkxldmVscyh1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHdpZHRoID0gMSwgdWludDMyX3QgZGVwdGggPSAxKTsKK3VpbnQzMl90IEZ1bGxNaXBDaGFpbkxldmVscyhWa0V4dGVudDNEKTsKK3VpbnQzMl90IEZ1bGxNaXBDaGFpbkxldmVscyhWa0V4dGVudDJEKTsKKwordWludDMyX3QgUmVzb2x2ZVJlbWFpbmluZ0xldmVscyhjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAqcmFuZ2UsIHVpbnQzMl90IG1pcF9sZXZlbHMpOworCit1aW50MzJfdCBSZXNvbHZlUmVtYWluaW5nTGF5ZXJzKGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpyYW5nZSwgdWludDMyX3QgbGF5ZXJzKTsKK1ZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIE5vcm1hbGl6ZVN1YnJlc291cmNlUmFuZ2UoY29uc3QgSU1BR0VfU1RBVEUgJmltYWdlX3N0YXRlLCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmcmFuZ2UpOworCisjZW5kaWYgIC8vIENPUkVfVkFMSURBVElPTl9CVUZGRVJfVkFMSURBVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2Nhc3RfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jYXN0X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyMTE0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jYXN0X3V0aWxzLmgKQEAgLTAsMCArMSw5MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9obiBadWxhdWYgPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBDQVNUX1VUSUxTX0hfCisjZGVmaW5lIENBU1RfVVRJTFNfSF8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNkZWZpbmUgQ0FTVF9UT19GUk9NX1VUSUxTCisvLyBDYXN0cyB0byBhbGxvdyB2YXJpb3VzIHR5cGVzIG9mIGxlc3MgdGhhbiA2NCBiaXRzIHRvIGJlIGNhc3QgdG8gYW5kIGZyb20gdWludDY0X3Qgc2FmZWx5IGFuZCBwb3J0YWJseQordGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZVR5cGUsIHR5cGVuYW1lIFVpbnQ+CitzdGF0aWMgaW5saW5lIEhhbmRsZVR5cGUgQ2FzdEZyb21VaW50KFVpbnQgdW50eXBlZF9oYW5kbGUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihIYW5kbGVUeXBlKSA9PSBzaXplb2YoVWludCksICJIYW5kbGVUeXBlIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBhcyB1bnR5cGVkIGhhbmRsZSIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxIYW5kbGVUeXBlICo+KCZ1bnR5cGVkX2hhbmRsZSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlVHlwZSwgdHlwZW5hbWUgVWludD4KK3N0YXRpYyBpbmxpbmUgVWludCBDYXN0VG9VaW50KEhhbmRsZVR5cGUgaGFuZGxlKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoSGFuZGxlVHlwZSkgPT0gc2l6ZW9mKFVpbnQpLCAiSGFuZGxlVHlwZSBtdXN0IGJlIHRoZSBzYW1lIHNpemUgYXMgdW50eXBlZCBoYW5kbGUiKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VWludCAqPigmaGFuZGxlKTsKK30KKworLy8gRW5zdXJlIHRoYXQgdGhlIHNpemUgY2hhbmdpbmcgY2FzdHMgYXJlICpzdGF0aWMqIHRvIGVuc3VyZSBwb3J0YWJpbGl0eQordGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZVR5cGU+CitzdGF0aWMgaW5saW5lIEhhbmRsZVR5cGUgQ2FzdEZyb21VaW50NjQodWludDY0X3QgdW50eXBlZF9oYW5kbGUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihIYW5kbGVUeXBlKSA8PSBzaXplb2YodWludDY0X3QpLCAiSGFuZGxlVHlwZSBtdXN0IGJlIG5vdCBsYXJnZXIgdGhhbiB0aGUgdW50eXBlZCBoYW5kbGUgc2l6ZSIpOworICAgIHR5cGVkZWYKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzaXplb2YoSGFuZGxlVHlwZSkgPT0gc2l6ZW9mKHVpbnQ4X3QpLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c2l6ZW9mKEhhbmRsZVR5cGUpID09IHNpemVvZih1aW50MTZfdCksIHVpbnQxNl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzaXplb2YoSGFuZGxlVHlwZSkgPT0gc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIHVpbnQ2NF90Pjo6dHlwZT46OnR5cGU+Ojp0eXBlIFVpbnQ7CisgICAgcmV0dXJuIENhc3RGcm9tVWludDxIYW5kbGVUeXBlLCBVaW50PihzdGF0aWNfY2FzdDxVaW50Pih1bnR5cGVkX2hhbmRsZSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlVHlwZT4KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgQ2FzdFRvVWludDY0KEhhbmRsZVR5cGUgaGFuZGxlKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoSGFuZGxlVHlwZSkgPD0gc2l6ZW9mKHVpbnQ2NF90KSwgIkhhbmRsZVR5cGUgbXVzdCBiZSBub3QgbGFyZ2VyIHRoYW4gdGhlIHVudHlwZWQgaGFuZGxlIHNpemUiKTsKKyAgICB0eXBlZGVmCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c2l6ZW9mKEhhbmRsZVR5cGUpID09IHNpemVvZih1aW50OF90KSwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPHNpemVvZihIYW5kbGVUeXBlKSA9PSBzaXplb2YodWludDE2X3QpLCB1aW50MTZfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c2l6ZW9mKEhhbmRsZVR5cGUpID09IHNpemVvZih1aW50MzJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCB1aW50NjRfdD46OnR5cGU+Ojp0eXBlPjo6dHlwZSBVaW50OworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oQ2FzdFRvVWludDxIYW5kbGVUeXBlLCBVaW50PihoYW5kbGUpKTsKK30KKworLy8gQ29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGNhc2UgYmV0d2VlbiBoYW5kbGVzIGFuZCB0aGUgdHlwZXMgdGhlIGhhbmRsZXMgYWJzdHJhY3QsIHJlZmxlY3RpbmcgdGhlIFZ1bGthbiBoYW5kbGUgc2NoZW1lLCB3aGVyZQorLy8gSGFuZGxlcyBhcmUgZWl0aGVyIHBvaW50ZXJzIChkaXNwYXRjaGFibGUpIG9yIHNpemVvZih1aW50NjRfdCkgKG5vbi1kaXNwYXRjaGFibGUpLCBzLnQuIGZ1bGwgc2l6ZS1zYWZlIGNhc3RzIGFyZSB1c2VkIGFuZAorLy8gd2UgZW5zdXJlIHRoYXQgaGFuZGxlcyBhcmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHVuZGVybHlpbmcgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVUeXBlLCB0eXBlbmFtZSBWYWx1ZVR5cGU+Cit2b2lkIENhc3RUb0hhbmRsZShWYWx1ZVR5cGUgdmFsdWUsIEhhbmRsZVR5cGUgKmhhbmRsZSkgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEhhbmRsZVR5cGUpID49IHNpemVvZihWYWx1ZVR5cGUpLCAiSGFuZGxlVHlwZSBtdXN0IGxhcmdlIGVub3VnaCB0byBob2xkIGludGVybmFsIHZhbHVlIik7CisgICAgKmhhbmRsZSA9IENhc3RGcm9tVWludDY0PEhhbmRsZVR5cGU+KENhc3RUb1VpbnQ2NDxWYWx1ZVR5cGU+KHZhbHVlKSk7Cit9CisvLyBUaGlzIGZvcm0gaXMgY29udmVuaWVudGx5ICJpbmxpbmUiLCB5b3Ugc2hvdWxkIG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoZSBoYW5kbGUgdHlwZSAodGhlIHZhbHVlIHR5cGUgYmVpbmcgZGVkdWNpYmxlIGZyb20gdGhlIGFyZykKK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVUeXBlLCB0eXBlbmFtZSBWYWx1ZVR5cGU+CitIYW5kbGVUeXBlIENhc3RUb0hhbmRsZShWYWx1ZVR5cGUgdmFsdWUpIHsKKyAgICBIYW5kbGVUeXBlIGhhbmRsZTsKKyAgICBDYXN0VG9IYW5kbGUodmFsdWUsICZoYW5kbGUpOworICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lIEhhbmRsZVR5cGU+Cit2b2lkIENhc3RGcm9tSGFuZGxlKEhhbmRsZVR5cGUgaGFuZGxlLCBWYWx1ZVR5cGUgKnZhbHVlKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoSGFuZGxlVHlwZSkgPj0gc2l6ZW9mKFZhbHVlVHlwZSksICJIYW5kbGVUeXBlIG11c3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgaW50ZXJuYWwgdmFsdWUiKTsKKyAgICAqdmFsdWUgPSBDYXN0RnJvbVVpbnQ2NDxWYWx1ZVR5cGU+KENhc3RUb1VpbnQ2NDxIYW5kbGVUeXBlPihoYW5kbGUpKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lIEhhbmRsZVR5cGU+CitWYWx1ZVR5cGUgQ2FzdEZyb21IYW5kbGUoSGFuZGxlVHlwZSBoYW5kbGUpIHsKKyAgICBWYWx1ZVR5cGUgdmFsdWU7CisgICAgQ2FzdEZyb21IYW5kbGUoaGFuZGxlLCAmdmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworI2VuZGlmICAvLyBDQVNUX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvY29tbWFuZF9jb3VudGVyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvY29tbWFuZF9jb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlYjM2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb21tYW5kX2NvdW50ZXIuaApAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTkgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBMaW9uZWwgTGFuZHdlcmxpbiA8bGlvbmVsLmcubGFuZHdlcmxpbkBpbnRlbC5jb20+CisgKi8KKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAiY29yZV92YWxpZGF0aW9uLmgiCisKK2NsYXNzIENvbW1hbmRDb3VudGVyIDogcHVibGljIFZhbGlkYXRpb25PYmplY3QgeworICBwdWJsaWM6CisgICAgQ29tbWFuZENvdW50ZXIoQ29yZUNoZWNrcyAqY29yZUNoZWNrcykgOiBjb3JlQ2hlY2tzKGNvcmVDaGVja3MpIHt9CisgICAgdmlydHVhbCB+Q29tbWFuZENvdW50ZXIoKSB7fQorCisgICAgdmlydHVhbCB3cml0ZV9sb2NrX2d1YXJkX3Qgd3JpdGVfbG9jaygpIHsgcmV0dXJuIGNvcmVDaGVja3MtPndyaXRlX2xvY2soKTsgfQorCisjaW5jbHVkZSAiY29tbWFuZF9jb3VudGVyX2hlbHBlci5oIgorCisgIHByaXZhdGU6CisgICAgQ29yZUNoZWNrcyAqY29yZUNoZWNrczsKK307CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvY29udmVydF90b19yZW5kZXJwYXNzMi5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvY29udmVydF90b19yZW5kZXJwYXNzMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlZGEwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb252ZXJ0X3RvX3JlbmRlcnBhc3MyLmNwcApAQCAtMCwwICsxLDIxMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFRvYmlhcyBIZWN0b3IgPEB0b2Jza2k+CisgKi8KKworI2luY2x1ZGUgImNvbnZlcnRfdG9fcmVuZGVycGFzczIuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInZrX2Zvcm1hdF91dGlscy5oIgorI2luY2x1ZGUgInZrX3R5cGVtYXBfaGVscGVyLmgiCisKK3N0YXRpYyBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiBUb1YyS0hSKGNvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uJiBpbl9zdHJ1Y3QpIHsKKyAgICBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiB2MjsKKyAgICB2Mi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fMl9LSFI7CisgICAgdjIucE5leHQgPSBudWxscHRyOworICAgIHYyLmZsYWdzID0gaW5fc3RydWN0LmZsYWdzOworICAgIHYyLmZvcm1hdCA9IGluX3N0cnVjdC5mb3JtYXQ7CisgICAgdjIuc2FtcGxlcyA9IGluX3N0cnVjdC5zYW1wbGVzOworICAgIHYyLmxvYWRPcCA9IGluX3N0cnVjdC5sb2FkT3A7CisgICAgdjIuc3RvcmVPcCA9IGluX3N0cnVjdC5zdG9yZU9wOworICAgIHYyLnN0ZW5jaWxMb2FkT3AgPSBpbl9zdHJ1Y3Quc3RlbmNpbExvYWRPcDsKKyAgICB2Mi5zdGVuY2lsU3RvcmVPcCA9IGluX3N0cnVjdC5zdGVuY2lsU3RvcmVPcDsKKyAgICB2Mi5pbml0aWFsTGF5b3V0ID0gaW5fc3RydWN0LmluaXRpYWxMYXlvdXQ7CisgICAgdjIuZmluYWxMYXlvdXQgPSBpbl9zdHJ1Y3QuZmluYWxMYXlvdXQ7CisKKyAgICByZXR1cm4gdjI7Cit9CisKK3N0YXRpYyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgVG9WMktIUihjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UmIGluX3N0cnVjdCwgY29uc3QgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2sgPSAwKSB7CisgICAgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIHYyOworICAgIHYyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFI7CisgICAgdjIucE5leHQgPSBudWxscHRyOworICAgIHYyLmF0dGFjaG1lbnQgPSBpbl9zdHJ1Y3QuYXR0YWNobWVudDsKKyAgICB2Mi5sYXlvdXQgPSBpbl9zdHJ1Y3QubGF5b3V0OworICAgIHYyLmFzcGVjdE1hc2sgPSBhc3BlY3RNYXNrOworCisgICAgcmV0dXJuIHYyOworfQorCitzdGF0aWMgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgVG9WMktIUihjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbiYgaW5fc3RydWN0LCBjb25zdCB1aW50MzJfdCB2aWV3TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VBc3BlY3RGbGFncyogaW5wdXRfYXR0YWNobWVudF9hc3BlY3RfbWFza3MpIHsKKyAgICBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiB2MjsKKyAgICB2Mi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fMl9LSFI7CisgICAgdjIucE5leHQgPSBudWxscHRyOworICAgIHYyLmZsYWdzID0gaW5fc3RydWN0LmZsYWdzOworICAgIHYyLnBpcGVsaW5lQmluZFBvaW50ID0gaW5fc3RydWN0LnBpcGVsaW5lQmluZFBvaW50OworICAgIHYyLnZpZXdNYXNrID0gdmlld01hc2s7CisgICAgdjIuaW5wdXRBdHRhY2htZW50Q291bnQgPSBpbl9zdHJ1Y3QuaW5wdXRBdHRhY2htZW50Q291bnQ7CisgICAgdjIucElucHV0QXR0YWNobWVudHMgPSBudWxscHRyOyAgLy8gdG8gYmUgZmlsbGVkCisgICAgdjIuY29sb3JBdHRhY2htZW50Q291bnQgPSBpbl9zdHJ1Y3QuY29sb3JBdHRhY2htZW50Q291bnQ7CisgICAgdjIucENvbG9yQXR0YWNobWVudHMgPSBudWxscHRyOyAgICAgICAgLy8gdG8gYmUgZmlsbGVkCisgICAgdjIucFJlc29sdmVBdHRhY2htZW50cyA9IG51bGxwdHI7ICAgICAgLy8gdG8gYmUgZmlsbGVkCisgICAgdjIucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxscHRyOyAgLy8gdG8gYmUgZmlsbGVkCisgICAgdjIucHJlc2VydmVBdHRhY2htZW50Q291bnQgPSBpbl9zdHJ1Y3QucHJlc2VydmVBdHRhY2htZW50Q291bnQ7CisgICAgdjIucFByZXNlcnZlQXR0YWNobWVudHMgPSBudWxscHRyOyAgLy8gdG8gYmUgZmlsbGVkCisKKyAgICBpZiAodjIuaW5wdXRBdHRhY2htZW50Q291bnQgJiYgaW5fc3RydWN0LnBJbnB1dEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHYyLnBJbnB1dEF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUlt2Mi5pbnB1dEF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2Mi5pbnB1dEF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICB2Mi5wSW5wdXRBdHRhY2htZW50c1tpXSA9IFRvVjJLSFIoaW5fc3RydWN0LnBJbnB1dEF0dGFjaG1lbnRzW2ldLCBpbnB1dF9hdHRhY2htZW50X2FzcGVjdF9tYXNrc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHYyLmNvbG9yQXR0YWNobWVudENvdW50ICYmIGluX3N0cnVjdC5wQ29sb3JBdHRhY2htZW50cykgeworICAgICAgICB2Mi5wQ29sb3JBdHRhY2htZW50cyA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFJbdjIuY29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdjIuY29sb3JBdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgdjIucENvbG9yQXR0YWNobWVudHNbaV0gPSBUb1YyS0hSKGluX3N0cnVjdC5wQ29sb3JBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHYyLmNvbG9yQXR0YWNobWVudENvdW50ICYmIGluX3N0cnVjdC5wUmVzb2x2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgIHYyLnBSZXNvbHZlQXR0YWNobWVudHMgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSW3YyLmNvbG9yQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHYyLmNvbG9yQXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHYyLnBSZXNvbHZlQXR0YWNobWVudHNbaV0gPSBUb1YyS0hSKGluX3N0cnVjdC5wUmVzb2x2ZUF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSB7CisgICAgICAgIHYyLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUigpOworICAgICAgICAqdjIucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBUb1YyS0hSKCppbl9zdHJ1Y3QucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpOworICAgIH0KKyAgICBpZiAodjIucHJlc2VydmVBdHRhY2htZW50Q291bnQgJiYgaW5fc3RydWN0LnBQcmVzZXJ2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgIGF1dG8gcHJlc2VydmVfYXR0YWNobWVudHMgPSBuZXcgdWludDMyX3RbdjIucHJlc2VydmVBdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdjIucHJlc2VydmVBdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcHJlc2VydmVfYXR0YWNobWVudHNbaV0gPSBpbl9zdHJ1Y3QucFByZXNlcnZlQXR0YWNobWVudHNbaV07CisgICAgICAgIH0KKyAgICAgICAgdjIucFByZXNlcnZlQXR0YWNobWVudHMgPSBwcmVzZXJ2ZV9hdHRhY2htZW50czsKKyAgICB9CisKKyAgICByZXR1cm4gdjI7Cit9CisKK3N0YXRpYyBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSIFRvVjJLSFIoY29uc3QgVmtTdWJwYXNzRGVwZW5kZW5jeSYgaW5fc3RydWN0LCBpbnQzMl90IHZpZXdPZmZzZXQgPSAwKSB7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUiB2MjsKKyAgICB2Mi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUjsKKyAgICB2Mi5wTmV4dCA9IG51bGxwdHI7CisgICAgdjIuc3JjU3VicGFzcyA9IGluX3N0cnVjdC5zcmNTdWJwYXNzOworICAgIHYyLmRzdFN1YnBhc3MgPSBpbl9zdHJ1Y3QuZHN0U3VicGFzczsKKyAgICB2Mi5zcmNTdGFnZU1hc2sgPSBpbl9zdHJ1Y3Quc3JjU3RhZ2VNYXNrOworICAgIHYyLmRzdFN0YWdlTWFzayA9IGluX3N0cnVjdC5kc3RTdGFnZU1hc2s7CisgICAgdjIuc3JjQWNjZXNzTWFzayA9IGluX3N0cnVjdC5zcmNBY2Nlc3NNYXNrOworICAgIHYyLmRzdEFjY2Vzc01hc2sgPSBpbl9zdHJ1Y3QuZHN0QWNjZXNzTWFzazsKKyAgICB2Mi5kZXBlbmRlbmN5RmxhZ3MgPSBpbl9zdHJ1Y3QuZGVwZW5kZW5jeUZsYWdzOworICAgIHYyLnZpZXdPZmZzZXQgPSB2aWV3T2Zmc2V0OworCisgICAgcmV0dXJuIHYyOworfQorCit2b2lkIENvbnZlcnRWa1JlbmRlclBhc3NDcmVhdGVJbmZvVG9WMktIUihjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvJiBpbl9zdHJ1Y3QsIHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqIG91dF9zdHJ1Y3QpIHsKKyAgICB1c2luZyBzdGQ6OnZlY3RvcjsKKyAgICBjb25zdCBhdXRvIG11bHRpdmlld19pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbz4oaW5fc3RydWN0LnBOZXh0KTsKKyAgICBjb25zdCBhdXRvKiBpbnB1dF9hdHRhY2htZW50X2FzcGVjdF9pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbz4oaW5fc3RydWN0LnBOZXh0KTsKKworICAgIG91dF9zdHJ1Y3QtPn5zYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKCk7CisgICAgb3V0X3N0cnVjdC0+c1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GT18yX0tIUjsKKyAgICBvdXRfc3RydWN0LT5wTmV4dCA9IG51bGxwdHI7CisgICAgb3V0X3N0cnVjdC0+ZmxhZ3MgPSBpbl9zdHJ1Y3QuZmxhZ3M7CisgICAgb3V0X3N0cnVjdC0+YXR0YWNobWVudENvdW50ID0gaW5fc3RydWN0LmF0dGFjaG1lbnRDb3VudDsKKyAgICBvdXRfc3RydWN0LT5wQXR0YWNobWVudHMgPSBudWxscHRyOyAgLy8gdG8gYmUgZmlsbGVkCisgICAgb3V0X3N0cnVjdC0+c3VicGFzc0NvdW50ID0gaW5fc3RydWN0LnN1YnBhc3NDb3VudDsKKyAgICBvdXRfc3RydWN0LT5wU3VicGFzc2VzID0gbnVsbHB0cjsgIC8vIHRvIGJlIGZpbGxlZAorICAgIG91dF9zdHJ1Y3QtPmRlcGVuZGVuY3lDb3VudCA9IGluX3N0cnVjdC5kZXBlbmRlbmN5Q291bnQ7CisgICAgb3V0X3N0cnVjdC0+cERlcGVuZGVuY2llcyA9IG51bGxwdHI7ICAvLyB0byBiZSBmaWxsZWQKKyAgICBvdXRfc3RydWN0LT5jb3JyZWxhdGVkVmlld01hc2tDb3VudCA9IG11bHRpdmlld19pbmZvID8gbXVsdGl2aWV3X2luZm8tPmNvcnJlbGF0aW9uTWFza0NvdW50IDogMDsKKyAgICBvdXRfc3RydWN0LT5wQ29ycmVsYXRlZFZpZXdNYXNrcyA9IG51bGxwdHI7ICAvLyB0byBiZSBmaWxsZWQKKworICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHN1cHBvcnQgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCBzb21laG93CisgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLURvY3MvaXNzdWVzLzEwMjcKKworICAgIGlmIChvdXRfc3RydWN0LT5hdHRhY2htZW50Q291bnQgJiYgaW5fc3RydWN0LnBBdHRhY2htZW50cykgeworICAgICAgICBvdXRfc3RydWN0LT5wQXR0YWNobWVudHMgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFJbb3V0X3N0cnVjdC0+YXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG91dF9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBvdXRfc3RydWN0LT5wQXR0YWNobWVudHNbaV0gPSBUb1YyS0hSKGluX3N0cnVjdC5wQXR0YWNobWVudHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdHJhbnNsYXRlIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gaW50byB2ZWN0b3IKKyAgICB2ZWN0b3I8dmVjdG9yPFZrSW1hZ2VBc3BlY3RGbGFncz4+IGlucHV0X2F0dGFjaG1lbnRfYXNwZWN0X21hc2tzKG91dF9zdHJ1Y3QtPnN1YnBhc3NDb3VudCk7CisgICAgLy8gc2V0IGRlZmF1bHRzCisgICAgZm9yICh1aW50MzJfdCBzaSA9IDA7IHNpIDwgb3V0X3N0cnVjdC0+c3VicGFzc0NvdW50OyArK3NpKSB7CisgICAgICAgIGlmIChpbl9zdHJ1Y3QucFN1YnBhc3NlcykgeworICAgICAgICAgICAgaW5wdXRfYXR0YWNobWVudF9hc3BlY3RfbWFza3Nbc2ldLnJlc2l6ZShpbl9zdHJ1Y3QucFN1YnBhc3Nlc1tzaV0uaW5wdXRBdHRhY2htZW50Q291bnQsIDApOworCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGlhaSA9IDA7IGlhaSA8IGluX3N0cnVjdC5wU3VicGFzc2VzW3NpXS5pbnB1dEF0dGFjaG1lbnRDb3VudDsgKytpYWkpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0X3N0cnVjdC0+cEF0dGFjaG1lbnRzICYmIGluX3N0cnVjdC5wU3VicGFzc2VzW3NpXS5wSW5wdXRBdHRhY2htZW50cykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBpbnB1dF9hdHRhY2htZW50ID0gaW5fc3RydWN0LnBTdWJwYXNzZXNbc2ldLnBJbnB1dEF0dGFjaG1lbnRzW2lhaV07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gZm9ybWF0ID0gb3V0X3N0cnVjdC0+cEF0dGFjaG1lbnRzW2lucHV0X2F0dGFjaG1lbnQuYXR0YWNobWVudF0uZm9ybWF0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChGb3JtYXRJc0NvbG9yKGZvcm1hdCkpIGlucHV0X2F0dGFjaG1lbnRfYXNwZWN0X21hc2tzW3NpXVtpYWldIHw9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChGb3JtYXRIYXNEZXB0aChmb3JtYXQpKSBpbnB1dF9hdHRhY2htZW50X2FzcGVjdF9tYXNrc1tzaV1baWFpXSB8PSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgICAgICAgICAgICAgICAgICBpZiAoRm9ybWF0SGFzU3RlbmNpbChmb3JtYXQpKSBpbnB1dF9hdHRhY2htZW50X2FzcGVjdF9tYXNrc1tzaV1baWFpXSB8PSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChGb3JtYXRQbGFuZUNvdW50KGZvcm1hdCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9hdHRhY2htZW50X2FzcGVjdF9tYXNrc1tzaV1baWFpXSB8PSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9hdHRhY2htZW50X2FzcGVjdF9tYXNrc1tzaV1baWFpXSB8PSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZvcm1hdFBsYW5lQ291bnQoZm9ybWF0KSA+IDIpIGlucHV0X2F0dGFjaG1lbnRfYXNwZWN0X21hc2tzW3NpXVtpYWldIHw9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gdHJhbnNsYXRlIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8KKyAgICBpZiAoaW5wdXRfYXR0YWNobWVudF9hc3BlY3RfaW5mbyAmJiBpbnB1dF9hdHRhY2htZW50X2FzcGVjdF9pbmZvLT5wQXNwZWN0UmVmZXJlbmNlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5wdXRfYXR0YWNobWVudF9hc3BlY3RfaW5mby0+YXNwZWN0UmVmZXJlbmNlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc3VicGFzcyA9IGlucHV0X2F0dGFjaG1lbnRfYXNwZWN0X2luZm8tPnBBc3BlY3RSZWZlcmVuY2VzW2ldLnN1YnBhc3M7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBpbnB1dF9hdHRhY2htZW50ID0gaW5wdXRfYXR0YWNobWVudF9hc3BlY3RfaW5mby0+cEFzcGVjdFJlZmVyZW5jZXNbaV0uaW5wdXRBdHRhY2htZW50SW5kZXg7CisgICAgICAgICAgICBjb25zdCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFzayA9IGlucHV0X2F0dGFjaG1lbnRfYXNwZWN0X2luZm8tPnBBc3BlY3RSZWZlcmVuY2VzW2ldLmFzcGVjdE1hc2s7CisKKyAgICAgICAgICAgIGlmIChzdWJwYXNzIDwgaW5wdXRfYXR0YWNobWVudF9hc3BlY3RfbWFza3Muc2l6ZSgpICYmCisgICAgICAgICAgICAgICAgaW5wdXRfYXR0YWNobWVudCA8IGlucHV0X2F0dGFjaG1lbnRfYXNwZWN0X21hc2tzW3N1YnBhc3NdLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlucHV0X2F0dGFjaG1lbnRfYXNwZWN0X21hc2tzW3N1YnBhc3NdW2lucHV0X2F0dGFjaG1lbnRdID0gYXNwZWN0TWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGJvb2wgaGFzX3ZpZXdNYXNrID0gbXVsdGl2aWV3X2luZm8gJiYgbXVsdGl2aWV3X2luZm8tPnN1YnBhc3NDb3VudCAmJiBtdWx0aXZpZXdfaW5mby0+cFZpZXdNYXNrczsKKyAgICBpZiAob3V0X3N0cnVjdC0+c3VicGFzc0NvdW50ICYmIGluX3N0cnVjdC5wU3VicGFzc2VzKSB7CisgICAgICAgIG91dF9zdHJ1Y3QtPnBTdWJwYXNzZXMgPSBuZXcgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFJbb3V0X3N0cnVjdC0+c3VicGFzc0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG91dF9zdHJ1Y3QtPnN1YnBhc3NDb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2aWV3TWFzayA9IGhhc192aWV3TWFzayA/IG11bHRpdmlld19pbmZvLT5wVmlld01hc2tzW2ldIDogMDsKKyAgICAgICAgICAgIG91dF9zdHJ1Y3QtPnBTdWJwYXNzZXNbaV0gPSBUb1YyS0hSKGluX3N0cnVjdC5wU3VicGFzc2VzW2ldLCB2aWV3TWFzaywgaW5wdXRfYXR0YWNobWVudF9hc3BlY3RfbWFza3NbaV0uZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGJvb2wgaGFzX3ZpZXdPZmZzZXQgPSBtdWx0aXZpZXdfaW5mbyAmJiBtdWx0aXZpZXdfaW5mby0+ZGVwZW5kZW5jeUNvdW50ICYmIG11bHRpdmlld19pbmZvLT5wVmlld09mZnNldHM7CisgICAgaWYgKG91dF9zdHJ1Y3QtPmRlcGVuZGVuY3lDb3VudCAmJiBpbl9zdHJ1Y3QucERlcGVuZGVuY2llcykgeworICAgICAgICBvdXRfc3RydWN0LT5wRGVwZW5kZW5jaWVzID0gbmV3IHNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFJbb3V0X3N0cnVjdC0+ZGVwZW5kZW5jeUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG91dF9zdHJ1Y3QtPmRlcGVuZGVuY3lDb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZpZXdPZmZzZXQgPSBoYXNfdmlld09mZnNldCA/IG11bHRpdmlld19pbmZvLT5wVmlld09mZnNldHNbaV0gOiAwOworICAgICAgICAgICAgb3V0X3N0cnVjdC0+cERlcGVuZGVuY2llc1tpXSA9IFRvVjJLSFIoaW5fc3RydWN0LnBEZXBlbmRlbmNpZXNbaV0sIHZpZXdPZmZzZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9zdHJ1Y3QtPmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50ICYmIG11bHRpdmlld19pbmZvLT5wQ29ycmVsYXRpb25NYXNrcykgeworICAgICAgICBhdXRvIGNvcnJlbGF0ZWRfdmlld19tYXNrcyA9IG5ldyB1aW50MzJfdFtvdXRfc3RydWN0LT5jb3JyZWxhdGVkVmlld01hc2tDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBvdXRfc3RydWN0LT5jb3JyZWxhdGVkVmlld01hc2tDb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb3JyZWxhdGVkX3ZpZXdfbWFza3NbaV0gPSBtdWx0aXZpZXdfaW5mby0+cENvcnJlbGF0aW9uTWFza3NbaV07CisgICAgICAgIH0KKyAgICAgICAgb3V0X3N0cnVjdC0+cENvcnJlbGF0ZWRWaWV3TWFza3MgPSBjb3JyZWxhdGVkX3ZpZXdfbWFza3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2NvbnZlcnRfdG9fcmVuZGVycGFzczIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb252ZXJ0X3RvX3JlbmRlcnBhc3MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0Y2NmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb252ZXJ0X3RvX3JlbmRlcnBhc3MyLmgKQEAgLTAsMCArMSwyNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFRvYmlhcyBIZWN0b3IgPEB0b2Jza2k+CisgKi8KKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAidmtfc2FmZV9zdHJ1Y3QuaCIKKwordm9pZCBDb252ZXJ0VmtSZW5kZXJQYXNzQ3JlYXRlSW5mb1RvVjJLSFIoY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyYgaW5fc3RydWN0LCBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBvdXRfc3RydWN0KTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb3JlX3ZhbGlkYXRpb24uY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzOTFlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb3JlX3ZhbGlkYXRpb24uY3BwCkBAIC0wLDAgKzEsMTEyNjkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjbm9ydGhyb3BAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogTWljaGFlbCBMZW50aW5lIDxtbGVudGluZUBnb29nbGUuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGdvb2dsZS5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBJYW4gRWxsaW90dCA8aWFuZWxsaW90dEBnb29nbGUuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IER1c3RpbiBHcmF2ZXMgPGR1c3RpbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKZXJlbXkgSGF5ZXMgPGplcmVteUBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEthcmwgU2NodWx0eiA8a2FybEBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIFlvdW5nIDxtYXJreUBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNaWtlIFNjaHVjaGFyZHQgPG1pa2VzQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgV2VpYmxlbiA8bWlrZXdAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IEpvaG4gWnVsYXVmIDxqenVsYXVmQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFNoYW5ub24gTWNQaGVyc29uIDxzaGFubm9uQGx1bmFyZy5jb20+CisgKi8KKworLy8gQWxsb3cgdXNlIG9mIFNUTCBtaW4gYW5kIG1heCBmdW5jdGlvbnMgaW4gV2luZG93cworI2RlZmluZSBOT01JTk1BWAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2YWxhcnJheT4KKworI2luY2x1ZGUgInZrX2xvYWRlcl9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oIgorI2luY2x1ZGUgInZrX2VudW1fc3RyaW5nX2hlbHBlci5oIgorI2luY2x1ZGUgImNoYXNzaXMuaCIKKyNpbmNsdWRlICJjb252ZXJ0X3RvX3JlbmRlcnBhc3MyLmgiCisjaW5jbHVkZSAiY29yZV92YWxpZGF0aW9uLmgiCisjaW5jbHVkZSAiYnVmZmVyX3ZhbGlkYXRpb24uaCIKKyNpbmNsdWRlICJzaGFkZXJfdmFsaWRhdGlvbi5oIgorI2luY2x1ZGUgInZrX2xheWVyX3V0aWxzLmgiCisKKy8vIEFycmF5IG9mIGNvbW1hbmQgbmFtZXMgaW5kZXhlZCBieSBDTURfVFlQRSBlbnVtCitzdGF0aWMgY29uc3Qgc3RkOjphcnJheTxjb25zdCBjaGFyICosIENNRF9SQU5HRV9TSVpFPiBjb21tYW5kX25hbWVfbGlzdCA9IHt7VlVJRF9DTURfTkFNRV9MSVNUfX07CisKKy8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCAqb3V0c2lkZSogdGhlIGNvcmVfdmFsaWRhdGlvbiBuYW1lc3BhY2UgYXMgdGhlaXIgdHlwZQorLy8gaXMgYWxzbyBkZWZpbmVkIG91dHNpZGUgdGhhdCBuYW1lc3BhY2UKK3NpemVfdCBQaXBlbGluZUxheW91dENvbXBhdERlZjo6aGFzaCgpIGNvbnN0IHsKKyAgICBoYXNoX3V0aWw6Okhhc2hDb21iaW5lciBoYzsKKyAgICAvLyBUaGUgc2V0IG51bWJlciBpcyBpbnRlZ3JhbCB0byB0aGUgQ29tcGF0RGVmJ3MgZGlzdGluY3RpdmVuZXNzCisgICAgaGMgPDwgc2V0IDw8IHB1c2hfY29uc3RhbnRfcmFuZ2VzLmdldCgpOworICAgIGNvbnN0IGF1dG8gJmRlc2NyaXB0b3Jfc2V0X2xheW91dHMgPSAqc2V0X2xheW91dHNfaWQuZ2V0KCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSBzZXQ7IGkrKykgeworICAgICAgICBoYyA8PCBkZXNjcmlwdG9yX3NldF9sYXlvdXRzW2ldLmdldCgpOworICAgIH0KKyAgICByZXR1cm4gaGMuVmFsdWUoKTsKK30KKworYm9vbCBQaXBlbGluZUxheW91dENvbXBhdERlZjo6b3BlcmF0b3I9PShjb25zdCBQaXBlbGluZUxheW91dENvbXBhdERlZiAmb3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoKHNldCAhPSBvdGhlci5zZXQpIHx8IChwdXNoX2NvbnN0YW50X3JhbmdlcyAhPSBvdGhlci5wdXNoX2NvbnN0YW50X3JhbmdlcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzZXRfbGF5b3V0c19pZCA9PSBvdGhlci5zZXRfbGF5b3V0c19pZCkgeworICAgICAgICAvLyBpZiBpdCdzIHRoZSBzYW1lIHNldF9sYXlvdXRzX2lkLCB0aGVuICphbnkqIHN1YnNldCB3aWxsIG1hdGNoCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRoZXkgYXJlbid0IGV4YWN0bHkgdGhlIHNhbWUgUGlwZWxpbmVMYXlvdXRTZXRMYXlvdXRzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSByZXF1aXJlZCBzdWJzZXRzIG1hdGNoCisgICAgY29uc3QgYXV0byAmZGVzY3JpcHRvcl9zZXRfbGF5b3V0cyA9ICpzZXRfbGF5b3V0c19pZC5nZXQoKTsKKyAgICBhc3NlcnQoc2V0IDwgZGVzY3JpcHRvcl9zZXRfbGF5b3V0cy5zaXplKCkpOworICAgIGNvbnN0IGF1dG8gJm90aGVyX2RzX2xheW91dHMgPSAqb3RoZXIuc2V0X2xheW91dHNfaWQuZ2V0KCk7CisgICAgYXNzZXJ0KHNldCA8IG90aGVyX2RzX2xheW91dHMuc2l6ZSgpKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDw9IHNldDsgaSsrKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yX3NldF9sYXlvdXRzW2ldICE9IG90aGVyX2RzX2xheW91dHNbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordXNpbmcgc3RkOjptYXg7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOwordXNpbmcgc3RkOjp1bm9yZGVyZWRfbWFwOwordXNpbmcgc3RkOjp1bm9yZGVyZWRfc2V0OwordXNpbmcgc3RkOjp2ZWN0b3I7CisKKy8vIEdldCB0aGUgZ2xvYmFsIG1hcHMgb2YgcGVuZGluZyByZWxlYXNlcworY29uc3QgR2xvYmFsUUZPVHJhbnNmZXJCYXJyaWVyTWFwPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPiAmQ29yZUNoZWNrczo6R2V0R2xvYmFsUUZPUmVsZWFzZUJhcnJpZXJNYXAoCisgICAgY29uc3QgUUZPVHJhbnNmZXJCYXJyaWVyPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPjo6VGFnICZ0eXBlX3RhZykgY29uc3QgeworICAgIHJldHVybiBxZm9fcmVsZWFzZV9pbWFnZV9iYXJyaWVyX21hcDsKK30KK2NvbnN0IEdsb2JhbFFGT1RyYW5zZmVyQmFycmllck1hcDxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+ICZDb3JlQ2hlY2tzOjpHZXRHbG9iYWxRRk9SZWxlYXNlQmFycmllck1hcCgKKyAgICBjb25zdCBRRk9UcmFuc2ZlckJhcnJpZXI8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPjo6VGFnICZ0eXBlX3RhZykgY29uc3QgeworICAgIHJldHVybiBxZm9fcmVsZWFzZV9idWZmZXJfYmFycmllcl9tYXA7Cit9CitHbG9iYWxRRk9UcmFuc2ZlckJhcnJpZXJNYXA8VmtJbWFnZU1lbW9yeUJhcnJpZXI+ICZDb3JlQ2hlY2tzOjpHZXRHbG9iYWxRRk9SZWxlYXNlQmFycmllck1hcCgKKyAgICBjb25zdCBRRk9UcmFuc2ZlckJhcnJpZXI8VmtJbWFnZU1lbW9yeUJhcnJpZXI+OjpUYWcgJnR5cGVfdGFnKSB7CisgICAgcmV0dXJuIHFmb19yZWxlYXNlX2ltYWdlX2JhcnJpZXJfbWFwOworfQorR2xvYmFsUUZPVHJhbnNmZXJCYXJyaWVyTWFwPFZrQnVmZmVyTWVtb3J5QmFycmllcj4gJkNvcmVDaGVja3M6OkdldEdsb2JhbFFGT1JlbGVhc2VCYXJyaWVyTWFwKAorICAgIGNvbnN0IFFGT1RyYW5zZmVyQmFycmllcjxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+OjpUYWcgJnR5cGVfdGFnKSB7CisgICAgcmV0dXJuIHFmb19yZWxlYXNlX2J1ZmZlcl9iYXJyaWVyX21hcDsKK30KKworSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcDo6SW5pdGlhbExheW91dFN0YXRlOjpJbml0aWFsTGF5b3V0U3RhdGUoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAmY2Jfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTUFHRV9WSUVXX1NUQVRFICp2aWV3X3N0YXRlKQorICAgIDogaW1hZ2VfdmlldyhWS19OVUxMX0hBTkRMRSksIGFzcGVjdF9tYXNrKDApLCBsYWJlbChjYl9zdGF0ZS5kZWJ1Z19sYWJlbCkgeworICAgIGlmICh2aWV3X3N0YXRlKSB7CisgICAgICAgIGltYWdlX3ZpZXcgPSB2aWV3X3N0YXRlLT5pbWFnZV92aWV3OworICAgICAgICBhc3BlY3RfbWFzayA9IHZpZXdfc3RhdGUtPmNyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzazsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIEZvcm1hdERlYnVnTGFiZWwoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBMb2dnaW5nTGFiZWwgJmxhYmVsKSB7CisgICAgaWYgKGxhYmVsLkVtcHR5KCkpIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIHN0ZDo6c3RyaW5nIG91dDsKKyAgICBzdHJpbmdfc3ByaW50Zigmb3V0LCAiJXNWa0RlYnVnVXRpbHNMYWJlbChuYW1lPSclcycgY29sb3I9WyVnLCAlZyAlZywgJWddKSIsIHByZWZpeCwgbGFiZWwubmFtZS5jX3N0cigpLCBsYWJlbC5jb2xvclswXSwKKyAgICAgICAgICAgICAgICAgICBsYWJlbC5jb2xvclsxXSwgbGFiZWwuY29sb3JbMl0sIGxhYmVsLmNvbG9yWzNdKTsKKyAgICByZXR1cm4gb3V0OworfQorCisvLyB0aGUgSW1hZ2VMYXlvdXRNYXAgaW1wbGVtZW50YXRpb24gYmFrZXMgaW4gdGhlIG51bWJlciBvZiB2YWxpZCBhc3BlY3RzIC0tIHdlIGhhdmUgdG8gY2hvb3NlIHRoZSBjb3JyZWN0IG9uZSBhdCBjb25zdHJ1Y3Rpb24gdGltZQordGVtcGxhdGUgPHVpbnQzMl90IGtUaHJlc2hvbGQ+CitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXA+IExheW91dE1hcEZhY3RvcnlCeUFzcGVjdChjb25zdCBJTUFHRV9TVEFURSAmaW1hZ2Vfc3RhdGUpIHsKKyAgICBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwICptYXAgPSBudWxscHRyOworICAgIHN3aXRjaCAoaW1hZ2Vfc3RhdGUuZnVsbF9yYW5nZS5hc3BlY3RNYXNrKSB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDoKKyAgICAgICAgICAgIG1hcCA9IG5ldyBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwSW1wbDxDb2xvckFzcGVjdFRyYWl0cywga1RocmVzaG9sZD4oaW1hZ2Vfc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDoKKyAgICAgICAgICAgIG1hcCA9IG5ldyBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwSW1wbDxEZXB0aEFzcGVjdFRyYWl0cywga1RocmVzaG9sZD4oaW1hZ2Vfc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOgorICAgICAgICAgICAgbWFwID0gbmV3IEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXBJbXBsPFN0ZW5jaWxBc3BlY3RUcmFpdHMsIGtUaHJlc2hvbGQ+KGltYWdlX3N0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ6CisgICAgICAgICAgICBtYXAgPSBuZXcgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcEltcGw8RGVwdGhTdGVuY2lsQXNwZWN0VHJhaXRzLCBrVGhyZXNob2xkPihpbWFnZV9zdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ6CisgICAgICAgICAgICBtYXAgPSBuZXcgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcEltcGw8TXVsdGlwbGFuZTJBc3BlY3RUcmFpdHMsIGtUaHJlc2hvbGQ+KGltYWdlX3N0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVDoKKyAgICAgICAgICAgIG1hcCA9IG5ldyBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwSW1wbDxNdWx0aXBsYW5lM0FzcGVjdFRyYWl0cywga1RocmVzaG9sZD4oaW1hZ2Vfc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXNzZXJ0KG1hcCk7ICAvLyBXZSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgaGVyZSBudWxsIHVubGVzcyB0aGUgdHJhaXRzIGNhc2VzIGFyZSBpbmNvbXBsZXRlCisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwPihtYXApOworfQorCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXA+IExheW91dE1hcEZhY3RvcnkoY29uc3QgSU1BR0VfU1RBVEUgJmltYWdlX3N0YXRlKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXA+IG1hcDsKKyAgICBjb25zdCB1aW50MzJfdCBrQWx3YXlzRGVuc2VMaW1pdCA9IDE2OyAgLy8gQWJvdXQgYSBjYWNoZWxpbmUgb24gZGVza29wIGFyY2hpdGVjdHVyZXMKKyAgICBpZiAoaW1hZ2Vfc3RhdGUuZnVsbF9yYW5nZS5sYXllckNvdW50IDw9IGtBbHdheXNEZW5zZUxpbWl0KSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGRlbnNlIHJvdyBtYXAKKyAgICAgICAgbWFwID0gTGF5b3V0TWFwRmFjdG9yeUJ5QXNwZWN0PDA+KGltYWdlX3N0YXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDcmVhdGUgYW4gaW5pdGlhbGx5IHNwYXJzZSByb3cgbWFwCisgICAgICAgIG1hcCA9IExheW91dE1hcEZhY3RvcnlCeUFzcGVjdDxrQWx3YXlzRGVuc2VMaW1pdD4oaW1hZ2Vfc3RhdGUpOworICAgIH0KKyAgICByZXR1cm4gbWFwOworfQorCisvLyBUaGUgY29uc3QgdmFyaWFudCBvbmx5IG5lZWQgdGhlIGltYWdlIGFzIGl0IGlzIHRoZSBrZXkgZm9yIHRoZSBtYXAKK2NvbnN0IEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXAgKkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXAoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIFZrSW1hZ2UgaW1hZ2UpIHsKKyAgICBhdXRvIGl0ID0gY2Jfc3RhdGUtPmltYWdlX2xheW91dF9tYXAuZmluZChpbWFnZSk7CisgICAgaWYgKGl0ID09IGNiX3N0YXRlLT5pbWFnZV9sYXlvdXRfbWFwLmNlbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7Cit9CisKKy8vIFRoZSBub24tY29uc3QgdmFyaWFudCBvbmx5IG5lZWRzIHRoZSBpbWFnZSBzdGF0ZSwgYXMgdGhlIGZhY3RvcnkgcmVxdWlyZXMgaXQgdG8gY29uc3RydWN0IGEgbmV3IGVudHJ5CitJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwICpHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwKENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLCBjb25zdCBJTUFHRV9TVEFURSAmaW1hZ2Vfc3RhdGUpIHsKKyAgICBhdXRvIGl0ID0gY2Jfc3RhdGUtPmltYWdlX2xheW91dF9tYXAuZmluZChpbWFnZV9zdGF0ZS5pbWFnZSk7CisgICAgaWYgKGl0ID09IGNiX3N0YXRlLT5pbWFnZV9sYXlvdXRfbWFwLmVuZCgpKSB7CisgICAgICAgIC8vIEVtcHR5IHNsb3QuLi4gZmlsbCBpdCBpbi4KKyAgICAgICAgYXV0byBpbnNlcnRfcGFpciA9IGNiX3N0YXRlLT5pbWFnZV9sYXlvdXRfbWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihpbWFnZV9zdGF0ZS5pbWFnZSwgTGF5b3V0TWFwRmFjdG9yeShpbWFnZV9zdGF0ZSkpKTsKKyAgICAgICAgYXNzZXJ0KGluc2VydF9wYWlyLnNlY29uZCk7CisgICAgICAgIEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXAgKm5ld19tYXAgPSBpbnNlcnRfcGFpci5maXJzdC0+c2Vjb25kLmdldCgpOworICAgICAgICBhc3NlcnQobmV3X21hcCk7CisgICAgICAgIHJldHVybiBuZXdfbWFwOworICAgIH0KKyAgICByZXR1cm4gaXQtPnNlY29uZC5nZXQoKTsKK30KKworLy8gVHJhY2tzIHRoZSBudW1iZXIgb2YgY29tbWFuZHMgcmVjb3JkZWQgaW4gYSBjb21tYW5kIGJ1ZmZlci4KK3ZvaWQgQ29yZUNoZWNrczo6SW5jcmVtZW50Q29tbWFuZENvdW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT5jb21tYW5kQ291bnQrKzsKK30KKworLy8gRm9yIGdpdmVuIG1lbSBvYmplY3QsIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCBudWxsIG9yIFVOQk9VTkQsIGlmIGl0IGlzLCByZXBvcnQgZXJyb3IuIFJldHVybiBza2lwIHZhbHVlLgorYm9vbCBDb3JlQ2hlY2tzOjpWZXJpZnlCb3VuZE1lbW9yeUlzVmFsaWQoVmtEZXZpY2VNZW1vcnkgbWVtLCBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlLCBjb25zdCBjaGFyICphcGlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yX2NvZGUpIGNvbnN0IHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIGF1dG8gdHlwZV9uYW1lID0gb2JqZWN0X3N0cmluZ1t0eXBlZF9oYW5kbGUudHlwZV07CisgICAgaWYgKFZLX05VTExfSEFORExFID09IG1lbSkgeworICAgICAgICByZXN1bHQgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgdHlwZWRfaGFuZGxlLmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlLCAiJXM6ICVzIHVzZWQgd2l0aCBubyBtZW1vcnkgYm91bmQuIE1lbW9yeSBzaG91bGQgYmUgYm91bmQgYnkgY2FsbGluZyB2a0JpbmQlc01lbW9yeSgpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXBpX25hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUodHlwZWRfaGFuZGxlKS5jX3N0cigpLCB0eXBlX25hbWUgKyAyKTsKKyAgICB9IGVsc2UgaWYgKE1FTU9SWV9VTkJPVU5EID09IG1lbSkgeworICAgICAgICByZXN1bHQgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgdHlwZWRfaGFuZGxlLmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMgdXNlZCB3aXRoIG5vIG1lbW9yeSBib3VuZCBhbmQgcHJldmlvdXNseSBib3VuZCBtZW1vcnkgd2FzIGZyZWVkLiBNZW1vcnkgbXVzdCBub3QgYmUgZnJlZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJwcmlvciB0byB0aGlzIG9wZXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9uYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHR5cGVkX2hhbmRsZSkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENoZWNrIHRvIHNlZSBpZiBtZW1vcnkgd2FzIGV2ZXIgYm91bmQgdG8gdGhpcyBpbWFnZQorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0ltYWdlKGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSwgY29uc3QgY2hhciAqYXBpX25hbWUsIGNvbnN0IGNoYXIgKmVycm9yX2NvZGUpIGNvbnN0IHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIGlmIChpbWFnZV9zdGF0ZS0+Y3JlYXRlX2Zyb21fc3dhcGNoYWluICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIGlmIChpbWFnZV9zdGF0ZS0+YmluZF9zd2FwY2hhaW4gPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCBlcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIGlzIGNyZWF0ZWQgYnkgJXMsIGFuZCB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGJvdW5kIGJ5IGNhbGxpbmcgdmtCaW5kSW1hZ2VNZW1vcnkyKCksIGFuZCB0aGUgcE5leHQgY2hhaW4gIgorICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZXMgVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSLiIsCisgICAgICAgICAgICAgICAgICAgIGFwaV9uYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3N0YXRlLT5pbWFnZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV9zdGF0ZS0+Y3JlYXRlX2Zyb21fc3dhcGNoYWluKS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbWFnZV9zdGF0ZS0+Y3JlYXRlX2Zyb21fc3dhcGNoYWluICE9IGltYWdlX3N0YXRlLT5iaW5kX3N3YXBjaGFpbikgeworICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGltYWdlX3N0YXRlLT5pbWFnZSksIGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICIlczogJXMgaXMgY3JlYXRlZCBieSAlcywgYnV0IHRoZSBpbWFnZSBpcyBib3VuZCBieSAlcy4gVGhlIGltYWdlIHNob3VsZCBiZSBjcmVhdGVkIGFuZCBib3VuZCBieSB0aGUgc2FtZSAiCisgICAgICAgICAgICAgICAgICAgICJzd2FwY2hhaW4iLAorICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV9zdGF0ZS0+aW1hZ2UpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2Vfc3RhdGUtPmNyZWF0ZV9mcm9tX3N3YXBjaGFpbikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV9zdGF0ZS0+YmluZF9zd2FwY2hhaW4pLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgwID09IChzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZmxhZ3MpICYgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCkpIHsKKyAgICAgICAgcmVzdWx0ID0gVmVyaWZ5Qm91bmRNZW1vcnlJc1ZhbGlkKGltYWdlX3N0YXRlLT5iaW5kaW5nLm1lbSwgVnVsa2FuVHlwZWRIYW5kbGUoaW1hZ2Vfc3RhdGUtPmltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9uYW1lLCBlcnJvcl9jb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ2hlY2sgdG8gc2VlIGlmIG1lbW9yeSB3YXMgYm91bmQgdG8gdGhpcyBidWZmZXIKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoY29uc3QgQlVGRkVSX1NUQVRFICpidWZmZXJfc3RhdGUsIGNvbnN0IGNoYXIgKmFwaV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9jb2RlKSBjb25zdCB7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICBpZiAoMCA9PSAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcl9zdGF0ZS0+Y3JlYXRlSW5mby5mbGFncykgJiBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCkpIHsKKyAgICAgICAgcmVzdWx0ID0gVmVyaWZ5Qm91bmRNZW1vcnlJc1ZhbGlkKGJ1ZmZlcl9zdGF0ZS0+YmluZGluZy5tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShidWZmZXJfc3RhdGUtPmJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIpLCBhcGlfbmFtZSwgZXJyb3JfY29kZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENoZWNrIHRvIHNlZSBpZiBtZW1vcnkgd2FzIGJvdW5kIHRvIHRoaXMgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZQorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0FjY2VsZXJhdGlvblN0cnVjdHVyZShjb25zdCBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFICphc19zdGF0ZSwgY29uc3QgY2hhciAqYXBpX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yX2NvZGUpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5Qm91bmRNZW1vcnlJc1ZhbGlkKGFzX3N0YXRlLT5iaW5kaW5nLm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZ1bGthblR5cGVkSGFuZGxlKGFzX3N0YXRlLT5hY2NlbGVyYXRpb25fc3RydWN0dXJlLCBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9uYW1lLCBlcnJvcl9jb2RlKTsKK30KKworLy8gVmFsaWQgdXNhZ2UgY2hlY2tzIGZvciBhIGNhbGwgdG8gU2V0TWVtQmluZGluZygpLgorLy8gRm9yIE5VTEwgbWVtIGNhc2UsIG91dHB1dCB3YXJuaW5nCisvLyBNYWtlIHN1cmUgZ2l2ZW4gb2JqZWN0IGlzIGluIGdsb2JhbCBvYmplY3QgbWFwCisvLyAgSUYgYSBwcmV2aW91cyBiaW5kaW5nIGV4aXN0ZWQsIG91dHB1dCB2YWxpZGF0aW9uIGVycm9yCisvLyAgT3RoZXJ3aXNlLCBhZGQgcmVmZXJlbmNlIGZyb20gb2JqZWN0SW5mbyB0byBtZW1vcnlJbmZvCisvLyAgQWRkIHJlZmVyZW5jZSBvZmYgb2Ygb2JqSW5mbworLy8gVE9ETzogV2UgbWF5IG5lZWQgdG8gcmVmYWN0b3Igb3IgcGFzcyBpbiBtdWx0aXBsZSB2YWxpZCB1c2FnZSBzdGF0ZW1lbnRzIHRvIGhhbmRsZSBtdWx0aXBsZSB2YWxpZCB1c2FnZSBjb25kaXRpb25zLgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVNldE1lbUJpbmRpbmcoVmtEZXZpY2VNZW1vcnkgbWVtLCBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlLCBjb25zdCBjaGFyICphcGlOYW1lKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gSXQncyBhbiBlcnJvciB0byBiaW5kIGFuIG9iamVjdCB0byBOVUxMIG1lbW9yeQorICAgIGlmIChtZW0gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgY29uc3QgQklOREFCTEUgKm1lbV9iaW5kaW5nID0gVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6R2V0T2JqZWN0TWVtQmluZGluZyh0eXBlZF9oYW5kbGUpOworICAgICAgICBhc3NlcnQobWVtX2JpbmRpbmcpOworICAgICAgICBpZiAobWVtX2JpbmRpbmctPnNwYXJzZSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JfY29kZSA9ICJWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLTAxMDQ1IjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhhbmRsZV90eXBlID0gIklNQUdFIjsKKyAgICAgICAgICAgIGlmICh0eXBlZF9oYW5kbGUudHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGVycm9yX2NvZGUgPSAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyLTAxMDMwIjsKKyAgICAgICAgICAgICAgICBoYW5kbGVfdHlwZSA9ICJCVUZGRVIiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQodHlwZWRfaGFuZGxlLnR5cGUgPT0ga1Z1bGthbk9iamVjdFR5cGVJbWFnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtKSwgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW4gJXMsIGF0dGVtcHRpbmcgdG8gYmluZCAlcyB0byAlcyB3aGljaCB3YXMgY3JlYXRlZCB3aXRoIHNwYXJzZSBtZW1vcnkgZmxhZ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoVktfJXNfQ1JFQVRFX1NQQVJTRV8qX0JJVCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlOYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1lbSkuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZSh0eXBlZF9oYW5kbGUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3R5cGUpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUgKm1lbV9pbmZvID0gVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6R2V0RGV2TWVtU3RhdGUobWVtKTsKKyAgICAgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgICAgICBjb25zdCBERVZJQ0VfTUVNT1JZX1NUQVRFICpwcmV2X2JpbmRpbmcgPSBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpHZXREZXZNZW1TdGF0ZShtZW1fYmluZGluZy0+YmluZGluZy5tZW0pOworICAgICAgICAgICAgaWYgKHByZXZfYmluZGluZykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yX2NvZGUgPSAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTA0NCI7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkX2hhbmRsZS50eXBlID09IGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUgPSAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyLTAxMDI5IjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHlwZWRfaGFuZGxlLnR5cGUgPT0ga1Z1bGthbk9iamVjdFR5cGVJbWFnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtKSwgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluICVzLCBhdHRlbXB0aW5nIHRvIGJpbmQgJXMgdG8gJXMgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBib3VuZCB0byAlcy4iLCBhcGlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1lbSkuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZSh0eXBlZF9oYW5kbGUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocHJldl9iaW5kaW5nLT5tZW0pLmNfc3RyKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1fYmluZGluZy0+YmluZGluZy5tZW0gPT0gTUVNT1JZX1VOQk9VTkQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KG1lbSksIGtWVUlEX0NvcmVfTWVtVHJhY2tfUmViaW5kT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW4gJXMsIGF0dGVtcHRpbmcgdG8gYmluZCAlcyB0byAlcyB3aGljaCB3YXMgcHJldmlvdXMgYm91bmQgdG8gbWVtb3J5IHRoYXQgaGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmNlIGJlZW4gZnJlZWQuIE1lbW9yeSBiaW5kaW5ncyBhcmUgaW1tdXRhYmxlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZ1bGthbiBzbyB0aGlzIGF0dGVtcHQgdG8gYmluZCB0byBuZXcgbWVtb3J5IGlzIG5vdCBhbGxvd2VkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaU5hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobWVtKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHR5cGVkX2hhbmRsZSkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVEZXZpY2VRdWV1ZUZhbWlseSh1aW50MzJfdCBxdWV1ZV9mYW1pbHksIGNvbnN0IGNoYXIgKmNtZF9uYW1lLCBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9jb2RlLCBib29sIG9wdGlvbmFsID0gZmFsc2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIW9wdGlvbmFsICYmIHF1ZXVlX2ZhbWlseSA9PSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIGlzIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELCBidXQgaXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBhIHZhbGlkIHF1ZXVlIGZhbWlseSBpbmRleCB2YWx1ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kX25hbWUsIHBhcmFtZXRlcl9uYW1lKTsKKyAgICB9IGVsc2UgaWYgKHF1ZXVlX2ZhbWlseV9pbmRleF9tYXAuZmluZChxdWV1ZV9mYW1pbHkpID09IHF1ZXVlX2ZhbWlseV9pbmRleF9tYXAuZW5kKCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICIlczogJXMgKD0gJSIgUFJJdTMyCisgICAgICAgICAgICAiKSBpcyBub3Qgb25lIG9mIHRoZSBxdWV1ZSBmYW1pbGllcyBnaXZlbiB2aWEgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gc3RydWN0dXJlcyB3aGVuIHRoZSBkZXZpY2Ugd2FzIGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGNtZF9uYW1lLCBwYXJhbWV0ZXJfbmFtZSwgcXVldWVfZmFtaWx5KTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVF1ZXVlRmFtaWxpZXModWludDMyX3QgcXVldWVfZmFtaWx5X2NvdW50LCBjb25zdCB1aW50MzJfdCAqcXVldWVfZmFtaWxpZXMsIGNvbnN0IGNoYXIgKmNtZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJyYXlfcGFyYW1ldGVyX25hbWUsIGNvbnN0IGNoYXIgKnVuaXF1ZV9lcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsaWRfZXJyb3JfY29kZSwgYm9vbCBvcHRpb25hbCA9IGZhbHNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHF1ZXVlX2ZhbWlsaWVzKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gc2V0OworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVfZmFtaWx5X2NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcmFtZXRlcl9uYW1lID0gc3RkOjpzdHJpbmcoYXJyYXlfcGFyYW1ldGVyX25hbWUpICsgIlsiICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiXSI7CisKKyAgICAgICAgICAgIGlmIChzZXQuY291bnQocXVldWVfZmFtaWxpZXNbaV0pKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksIHVuaXF1ZV9lcnJvcl9jb2RlLCAiJXM6ICVzICg9JSIgUFJJdTMyICIpIGlzIG5vdCB1bmlxdWUgd2l0aGluICVzIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9uYW1lLCBwYXJhbWV0ZXJfbmFtZS5jX3N0cigpLCBxdWV1ZV9mYW1pbGllc1tpXSwgYXJyYXlfcGFyYW1ldGVyX25hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXQuaW5zZXJ0KHF1ZXVlX2ZhbWlsaWVzW2ldKTsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlRGV2aWNlUXVldWVGYW1pbHkocXVldWVfZmFtaWxpZXNbaV0sIGNtZF9uYW1lLCBwYXJhbWV0ZXJfbmFtZS5jX3N0cigpLCB2YWxpZF9lcnJvcl9jb2RlLCBvcHRpb25hbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIENoZWNrIG9iamVjdCBzdGF0dXMgZm9yIHNlbGVjdGVkIGZsYWcgc3RhdGUKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVTdGF0dXMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqcE5vZGUsIENCU3RhdHVzRmxhZ3Mgc3RhdHVzX21hc2ssIFZrRmxhZ3MgbXNnX2ZsYWdzLCBjb25zdCBjaGFyICpmYWlsX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnX2NvZGUpIGNvbnN0IHsKKyAgICBpZiAoIShwTm9kZS0+c3RhdHVzICYgc3RhdHVzX21hc2spKSB7CisgICAgICAgIHJldHVybiBsb2dfbXNnKHJlcG9ydF9kYXRhLCBtc2dfZmxhZ3MsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsIEhhbmRsZVRvVWludDY0KHBOb2RlLT5jb21tYW5kQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbXNnX2NvZGUsICIlczogJXMuLiIsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocE5vZGUtPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCksIGZhaWxfbXNnKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBmb3IgYSBnaXZlbiBQU08sIHRoZSBnaXZlbiBzdGF0ZSBlbnVtIGlzIGR5bmFtaWMsIGVsc2UgcmV0dXJuIGZhbHNlCitzdGF0aWMgYm9vbCBJc0R5bmFtaWMoY29uc3QgUElQRUxJTkVfU1RBVEUgKnBQaXBlbGluZSwgY29uc3QgVmtEeW5hbWljU3RhdGUgc3RhdGUpIHsKKyAgICBpZiAocFBpcGVsaW5lICYmIHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBEeW5hbWljU3RhdGUpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBEeW5hbWljU3RhdGUtPmR5bmFtaWNTdGF0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wRHluYW1pY1N0YXRlLT5wRHluYW1pY1N0YXRlc1tpXSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBWYWxpZGF0ZSBzdGF0ZSBzdG9yZWQgYXMgZmxhZ3MgYXQgdGltZSBvZiBkcmF3IGNhbGwKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVEcmF3U3RhdGVGbGFncyhjb25zdCBDTURfQlVGRkVSX1NUQVRFICpwQ0IsIGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwUGlwZSwgYm9vbCBpbmRleGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZ19jb2RlKSBjb25zdCB7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICBpZiAocFBpcGUtPnRvcG9sb2d5X2F0X3Jhc3Rlcml6ZXIgPT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVCB8fAorICAgICAgICBwUGlwZS0+dG9wb2xvZ3lfYXRfcmFzdGVyaXplciA9PSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUCkgeworICAgICAgICByZXN1bHQgfD0gVmFsaWRhdGVTdGF0dXMocENCLCBDQlNUQVRVU19MSU5FX1dJRFRIX1NFVCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHluYW1pYyBsaW5lIHdpZHRoIHN0YXRlIG5vdCBzZXQgZm9yIHRoaXMgY29tbWFuZCBidWZmZXIiLCBtc2dfY29kZSk7CisgICAgfQorICAgIGlmIChwUGlwZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBSYXN0ZXJpemF0aW9uU3RhdGUgJiYKKyAgICAgICAgKHBQaXBlLT5ncmFwaGljc1BpcGVsaW5lQ0kucFJhc3Rlcml6YXRpb25TdGF0ZS0+ZGVwdGhCaWFzRW5hYmxlID09IFZLX1RSVUUpKSB7CisgICAgICAgIHJlc3VsdCB8PSBWYWxpZGF0ZVN0YXR1cyhwQ0IsIENCU1RBVFVTX0RFUFRIX0JJQVNfU0VULCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEeW5hbWljIGRlcHRoIGJpYXMgc3RhdGUgbm90IHNldCBmb3IgdGhpcyBjb21tYW5kIGJ1ZmZlciIsIG1zZ19jb2RlKTsKKyAgICB9CisgICAgaWYgKHBQaXBlLT5ibGVuZENvbnN0YW50c0VuYWJsZWQpIHsKKyAgICAgICAgcmVzdWx0IHw9IFZhbGlkYXRlU3RhdHVzKHBDQiwgQ0JTVEFUVVNfQkxFTkRfQ09OU1RBTlRTX1NFVCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHluYW1pYyBibGVuZCBjb25zdGFudHMgc3RhdGUgbm90IHNldCBmb3IgdGhpcyBjb21tYW5kIGJ1ZmZlciIsIG1zZ19jb2RlKTsKKyAgICB9CisgICAgaWYgKHBQaXBlLT5ncmFwaGljc1BpcGVsaW5lQ0kucERlcHRoU3RlbmNpbFN0YXRlICYmCisgICAgICAgIChwUGlwZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+ZGVwdGhCb3VuZHNUZXN0RW5hYmxlID09IFZLX1RSVUUpKSB7CisgICAgICAgIHJlc3VsdCB8PSBWYWxpZGF0ZVN0YXR1cyhwQ0IsIENCU1RBVFVTX0RFUFRIX0JPVU5EU19TRVQsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWMgZGVwdGggYm91bmRzIHN0YXRlIG5vdCBzZXQgZm9yIHRoaXMgY29tbWFuZCBidWZmZXIiLCBtc2dfY29kZSk7CisgICAgfQorICAgIGlmIChwUGlwZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBEZXB0aFN0ZW5jaWxTdGF0ZSAmJgorICAgICAgICAocFBpcGUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wRGVwdGhTdGVuY2lsU3RhdGUtPnN0ZW5jaWxUZXN0RW5hYmxlID09IFZLX1RSVUUpKSB7CisgICAgICAgIHJlc3VsdCB8PSBWYWxpZGF0ZVN0YXR1cyhwQ0IsIENCU1RBVFVTX1NURU5DSUxfUkVBRF9NQVNLX1NFVCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHluYW1pYyBzdGVuY2lsIHJlYWQgbWFzayBzdGF0ZSBub3Qgc2V0IGZvciB0aGlzIGNvbW1hbmQgYnVmZmVyIiwgbXNnX2NvZGUpOworICAgICAgICByZXN1bHQgfD0gVmFsaWRhdGVTdGF0dXMocENCLCBDQlNUQVRVU19TVEVOQ0lMX1dSSVRFX01BU0tfU0VULCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEeW5hbWljIHN0ZW5jaWwgd3JpdGUgbWFzayBzdGF0ZSBub3Qgc2V0IGZvciB0aGlzIGNvbW1hbmQgYnVmZmVyIiwgbXNnX2NvZGUpOworICAgICAgICByZXN1bHQgfD0gVmFsaWRhdGVTdGF0dXMocENCLCBDQlNUQVRVU19TVEVOQ0lMX1JFRkVSRU5DRV9TRVQsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWMgc3RlbmNpbCByZWZlcmVuY2Ugc3RhdGUgbm90IHNldCBmb3IgdGhpcyBjb21tYW5kIGJ1ZmZlciIsIG1zZ19jb2RlKTsKKyAgICB9CisgICAgaWYgKGluZGV4ZWQpIHsKKyAgICAgICAgcmVzdWx0IHw9IFZhbGlkYXRlU3RhdHVzKHBDQiwgQ0JTVEFUVVNfSU5ERVhfQlVGRkVSX0JPVU5ELCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRleCBidWZmZXIgb2JqZWN0IG5vdCBib3VuZCB0byB0aGlzIGNvbW1hbmQgYnVmZmVyIHdoZW4gSW5kZXhlZCBEcmF3IGF0dGVtcHRlZCIsIG1zZ19jb2RlKTsKKyAgICB9CisgICAgaWYgKHBQaXBlLT50b3BvbG9neV9hdF9yYXN0ZXJpemVyID09IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX0xJU1QgfHwKKyAgICAgICAgcFBpcGUtPnRvcG9sb2d5X2F0X3Jhc3Rlcml6ZXIgPT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfU1RSSVApIHsKKyAgICAgICAgY29uc3QgYXV0byAqbGluZV9zdGF0ZSA9CisgICAgICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQ+KHBQaXBlLT5ncmFwaGljc1BpcGVsaW5lQ0kucFJhc3Rlcml6YXRpb25TdGF0ZS0+cE5leHQpOworICAgICAgICBpZiAobGluZV9zdGF0ZSAmJiBsaW5lX3N0YXRlLT5zdGlwcGxlZExpbmVFbmFibGUpIHsKKyAgICAgICAgICAgIHJlc3VsdCB8PSBWYWxpZGF0ZVN0YXR1cyhwQ0IsIENCU1RBVFVTX0xJTkVfU1RJUFBMRV9TRVQsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEeW5hbWljIGxpbmUgc3RpcHBsZSBzdGF0ZSBub3Qgc2V0IGZvciB0aGlzIGNvbW1hbmQgYnVmZmVyIiwgbXNnX2NvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpMb2dJbnZhbGlkQXR0YWNobWVudE1lc3NhZ2UoY29uc3QgY2hhciAqdHlwZTFfc3RyaW5nLCBjb25zdCBSRU5ERVJfUEFTU19TVEFURSAqcnAxX3N0YXRlLCBjb25zdCBjaGFyICp0eXBlMl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRU5ERVJfUEFTU19TVEFURSAqcnAyX3N0YXRlLCB1aW50MzJfdCBwcmltYXJ5X2F0dGFjaCwgdWludDMyX3Qgc2Vjb25kYXJ5X2F0dGFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICplcnJvcl9jb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHJwMV9zdGF0ZS0+cmVuZGVyUGFzcyksIGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgIiVzOiBSZW5kZXJQYXNzZXMgaW5jb21wYXRpYmxlIGJldHdlZW4gJXMgdy8gJXMgYW5kICVzIHcvICVzIEF0dGFjaG1lbnQgJXUgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAiY29tcGF0aWJsZSB3aXRoICV1OiAlcy4iLAorICAgICAgICAgICAgICAgICAgIGNhbGxlciwgdHlwZTFfc3RyaW5nLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHJwMV9zdGF0ZS0+cmVuZGVyUGFzcykuY19zdHIoKSwgdHlwZTJfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocnAyX3N0YXRlLT5yZW5kZXJQYXNzKS5jX3N0cigpLCBwcmltYXJ5X2F0dGFjaCwgc2Vjb25kYXJ5X2F0dGFjaCwgbXNnKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUF0dGFjaG1lbnRDb21wYXRpYmlsaXR5KGNvbnN0IGNoYXIgKnR5cGUxX3N0cmluZywgY29uc3QgUkVOREVSX1BBU1NfU1RBVEUgKnJwMV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlMl9zdHJpbmcsIGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFICpycDJfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJpbWFyeV9hdHRhY2gsIHVpbnQzMl90IHNlY29uZGFyeV9hdHRhY2gsIGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9jb2RlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYXV0byAmcHJpbWFyeVBhc3NDSSA9IHJwMV9zdGF0ZS0+Y3JlYXRlSW5mbzsKKyAgICBjb25zdCBhdXRvICZzZWNvbmRhcnlQYXNzQ0kgPSBycDJfc3RhdGUtPmNyZWF0ZUluZm87CisgICAgaWYgKHByaW1hcnlQYXNzQ0kuYXR0YWNobWVudENvdW50IDw9IHByaW1hcnlfYXR0YWNoKSB7CisgICAgICAgIHByaW1hcnlfYXR0YWNoID0gVktfQVRUQUNITUVOVF9VTlVTRUQ7CisgICAgfQorICAgIGlmIChzZWNvbmRhcnlQYXNzQ0kuYXR0YWNobWVudENvdW50IDw9IHNlY29uZGFyeV9hdHRhY2gpIHsKKyAgICAgICAgc2Vjb25kYXJ5X2F0dGFjaCA9IFZLX0FUVEFDSE1FTlRfVU5VU0VEOworICAgIH0KKyAgICBpZiAocHJpbWFyeV9hdHRhY2ggPT0gVktfQVRUQUNITUVOVF9VTlVTRUQgJiYgc2Vjb25kYXJ5X2F0dGFjaCA9PSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICByZXR1cm4gc2tpcDsKKyAgICB9CisgICAgaWYgKHByaW1hcnlfYXR0YWNoID09IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgIHNraXAgfD0gTG9nSW52YWxpZEF0dGFjaG1lbnRNZXNzYWdlKHR5cGUxX3N0cmluZywgcnAxX3N0YXRlLCB0eXBlMl9zdHJpbmcsIHJwMl9zdGF0ZSwgcHJpbWFyeV9hdHRhY2gsIHNlY29uZGFyeV9hdHRhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZmlyc3QgaXMgdW51c2VkIHdoaWxlIHRoZSBzZWNvbmQgaXMgbm90LiIsIGNhbGxlciwgZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBza2lwOworICAgIH0KKyAgICBpZiAoc2Vjb25kYXJ5X2F0dGFjaCA9PSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICBza2lwIHw9IExvZ0ludmFsaWRBdHRhY2htZW50TWVzc2FnZSh0eXBlMV9zdHJpbmcsIHJwMV9zdGF0ZSwgdHlwZTJfc3RyaW5nLCBycDJfc3RhdGUsIHByaW1hcnlfYXR0YWNoLCBzZWNvbmRhcnlfYXR0YWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlY29uZCBpcyB1bnVzZWQgd2hpbGUgdGhlIGZpcnN0IGlzIG5vdC4iLCBjYWxsZXIsIGVycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gc2tpcDsKKyAgICB9CisgICAgaWYgKHByaW1hcnlQYXNzQ0kucEF0dGFjaG1lbnRzW3ByaW1hcnlfYXR0YWNoXS5mb3JtYXQgIT0gc2Vjb25kYXJ5UGFzc0NJLnBBdHRhY2htZW50c1tzZWNvbmRhcnlfYXR0YWNoXS5mb3JtYXQpIHsKKyAgICAgICAgc2tpcCB8PSBMb2dJbnZhbGlkQXR0YWNobWVudE1lc3NhZ2UodHlwZTFfc3RyaW5nLCBycDFfc3RhdGUsIHR5cGUyX3N0cmluZywgcnAyX3N0YXRlLCBwcmltYXJ5X2F0dGFjaCwgc2Vjb25kYXJ5X2F0dGFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXkgaGF2ZSBkaWZmZXJlbnQgZm9ybWF0cy4iLCBjYWxsZXIsIGVycm9yX2NvZGUpOworICAgIH0KKyAgICBpZiAocHJpbWFyeVBhc3NDSS5wQXR0YWNobWVudHNbcHJpbWFyeV9hdHRhY2hdLnNhbXBsZXMgIT0gc2Vjb25kYXJ5UGFzc0NJLnBBdHRhY2htZW50c1tzZWNvbmRhcnlfYXR0YWNoXS5zYW1wbGVzKSB7CisgICAgICAgIHNraXAgfD0gTG9nSW52YWxpZEF0dGFjaG1lbnRNZXNzYWdlKHR5cGUxX3N0cmluZywgcnAxX3N0YXRlLCB0eXBlMl9zdHJpbmcsIHJwMl9zdGF0ZSwgcHJpbWFyeV9hdHRhY2gsIHNlY29uZGFyeV9hdHRhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGV5IGhhdmUgZGlmZmVyZW50IHNhbXBsZXMuIiwgY2FsbGVyLCBlcnJvcl9jb2RlKTsKKyAgICB9CisgICAgaWYgKHByaW1hcnlQYXNzQ0kucEF0dGFjaG1lbnRzW3ByaW1hcnlfYXR0YWNoXS5mbGFncyAhPSBzZWNvbmRhcnlQYXNzQ0kucEF0dGFjaG1lbnRzW3NlY29uZGFyeV9hdHRhY2hdLmZsYWdzKSB7CisgICAgICAgIHNraXAgfD0gTG9nSW52YWxpZEF0dGFjaG1lbnRNZXNzYWdlKHR5cGUxX3N0cmluZywgcnAxX3N0YXRlLCB0eXBlMl9zdHJpbmcsIHJwMl9zdGF0ZSwgcHJpbWFyeV9hdHRhY2gsIHNlY29uZGFyeV9hdHRhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGV5IGhhdmUgZGlmZmVyZW50IGZsYWdzLiIsIGNhbGxlciwgZXJyb3JfY29kZSk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVTdWJwYXNzQ29tcGF0aWJpbGl0eShjb25zdCBjaGFyICp0eXBlMV9zdHJpbmcsIGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFICpycDFfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZTJfc3RyaW5nLCBjb25zdCBSRU5ERVJfUEFTU19TVEFURSAqcnAyX3N0YXRlLCBjb25zdCBpbnQgc3VicGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjYWxsZXIsIGNvbnN0IGNoYXIgKmVycm9yX2NvZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBhdXRvICZwcmltYXJ5X2Rlc2MgPSBycDFfc3RhdGUtPmNyZWF0ZUluZm8ucFN1YnBhc3Nlc1tzdWJwYXNzXTsKKyAgICBjb25zdCBhdXRvICZzZWNvbmRhcnlfZGVzYyA9IHJwMl9zdGF0ZS0+Y3JlYXRlSW5mby5wU3VicGFzc2VzW3N1YnBhc3NdOworICAgIHVpbnQzMl90IG1heElucHV0QXR0YWNobWVudENvdW50ID0gc3RkOjptYXgocHJpbWFyeV9kZXNjLmlucHV0QXR0YWNobWVudENvdW50LCBzZWNvbmRhcnlfZGVzYy5pbnB1dEF0dGFjaG1lbnRDb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1heElucHV0QXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgcHJpbWFyeV9pbnB1dF9hdHRhY2ggPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgc2Vjb25kYXJ5X2lucHV0X2F0dGFjaCA9IFZLX0FUVEFDSE1FTlRfVU5VU0VEOworICAgICAgICBpZiAoaSA8IHByaW1hcnlfZGVzYy5pbnB1dEF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICAgICAgcHJpbWFyeV9pbnB1dF9hdHRhY2ggPSBwcmltYXJ5X2Rlc2MucElucHV0QXR0YWNobWVudHNbaV0uYXR0YWNobWVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA8IHNlY29uZGFyeV9kZXNjLmlucHV0QXR0YWNobWVudENvdW50KSB7CisgICAgICAgICAgICBzZWNvbmRhcnlfaW5wdXRfYXR0YWNoID0gc2Vjb25kYXJ5X2Rlc2MucElucHV0QXR0YWNobWVudHNbaV0uYXR0YWNobWVudDsKKyAgICAgICAgfQorICAgICAgICBza2lwIHw9IFZhbGlkYXRlQXR0YWNobWVudENvbXBhdGliaWxpdHkodHlwZTFfc3RyaW5nLCBycDFfc3RhdGUsIHR5cGUyX3N0cmluZywgcnAyX3N0YXRlLCBwcmltYXJ5X2lucHV0X2F0dGFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeV9pbnB1dF9hdHRhY2gsIGNhbGxlciwgZXJyb3JfY29kZSk7CisgICAgfQorICAgIHVpbnQzMl90IG1heENvbG9yQXR0YWNobWVudENvdW50ID0gc3RkOjptYXgocHJpbWFyeV9kZXNjLmNvbG9yQXR0YWNobWVudENvdW50LCBzZWNvbmRhcnlfZGVzYy5jb2xvckF0dGFjaG1lbnRDb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1heENvbG9yQXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgcHJpbWFyeV9jb2xvcl9hdHRhY2ggPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgc2Vjb25kYXJ5X2NvbG9yX2F0dGFjaCA9IFZLX0FUVEFDSE1FTlRfVU5VU0VEOworICAgICAgICBpZiAoaSA8IHByaW1hcnlfZGVzYy5jb2xvckF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICAgICAgcHJpbWFyeV9jb2xvcl9hdHRhY2ggPSBwcmltYXJ5X2Rlc2MucENvbG9yQXR0YWNobWVudHNbaV0uYXR0YWNobWVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA8IHNlY29uZGFyeV9kZXNjLmNvbG9yQXR0YWNobWVudENvdW50KSB7CisgICAgICAgICAgICBzZWNvbmRhcnlfY29sb3JfYXR0YWNoID0gc2Vjb25kYXJ5X2Rlc2MucENvbG9yQXR0YWNobWVudHNbaV0uYXR0YWNobWVudDsKKyAgICAgICAgfQorICAgICAgICBza2lwIHw9IFZhbGlkYXRlQXR0YWNobWVudENvbXBhdGliaWxpdHkodHlwZTFfc3RyaW5nLCBycDFfc3RhdGUsIHR5cGUyX3N0cmluZywgcnAyX3N0YXRlLCBwcmltYXJ5X2NvbG9yX2F0dGFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeV9jb2xvcl9hdHRhY2gsIGNhbGxlciwgZXJyb3JfY29kZSk7CisgICAgICAgIGlmIChycDFfc3RhdGUtPmNyZWF0ZUluZm8uc3VicGFzc0NvdW50ID4gMSkgeworICAgICAgICAgICAgdWludDMyX3QgcHJpbWFyeV9yZXNvbHZlX2F0dGFjaCA9IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBzZWNvbmRhcnlfcmVzb2x2ZV9hdHRhY2ggPSBWS19BVFRBQ0hNRU5UX1VOVVNFRDsKKyAgICAgICAgICAgIGlmIChpIDwgcHJpbWFyeV9kZXNjLmNvbG9yQXR0YWNobWVudENvdW50ICYmIHByaW1hcnlfZGVzYy5wUmVzb2x2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgICAgICAgICAgcHJpbWFyeV9yZXNvbHZlX2F0dGFjaCA9IHByaW1hcnlfZGVzYy5wUmVzb2x2ZUF0dGFjaG1lbnRzW2ldLmF0dGFjaG1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA8IHNlY29uZGFyeV9kZXNjLmNvbG9yQXR0YWNobWVudENvdW50ICYmIHNlY29uZGFyeV9kZXNjLnBSZXNvbHZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgICAgICBzZWNvbmRhcnlfcmVzb2x2ZV9hdHRhY2ggPSBzZWNvbmRhcnlfZGVzYy5wUmVzb2x2ZUF0dGFjaG1lbnRzW2ldLmF0dGFjaG1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQXR0YWNobWVudENvbXBhdGliaWxpdHkodHlwZTFfc3RyaW5nLCBycDFfc3RhdGUsIHR5cGUyX3N0cmluZywgcnAyX3N0YXRlLCBwcmltYXJ5X3Jlc29sdmVfYXR0YWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeV9yZXNvbHZlX2F0dGFjaCwgY2FsbGVyLCBlcnJvcl9jb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCBwcmltYXJ5X2RlcHRoc3RlbmNpbF9hdHRhY2ggPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgc2Vjb25kYXJ5X2RlcHRoc3RlbmNpbF9hdHRhY2ggPSBWS19BVFRBQ0hNRU5UX1VOVVNFRDsKKyAgICBpZiAocHJpbWFyeV9kZXNjLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSB7CisgICAgICAgIHByaW1hcnlfZGVwdGhzdGVuY2lsX2F0dGFjaCA9IHByaW1hcnlfZGVzYy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudFswXS5hdHRhY2htZW50OworICAgIH0KKyAgICBpZiAoc2Vjb25kYXJ5X2Rlc2MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHsKKyAgICAgICAgc2Vjb25kYXJ5X2RlcHRoc3RlbmNpbF9hdHRhY2ggPSBzZWNvbmRhcnlfZGVzYy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudFswXS5hdHRhY2htZW50OworICAgIH0KKyAgICBza2lwIHw9IFZhbGlkYXRlQXR0YWNobWVudENvbXBhdGliaWxpdHkodHlwZTFfc3RyaW5nLCBycDFfc3RhdGUsIHR5cGUyX3N0cmluZywgcnAyX3N0YXRlLCBwcmltYXJ5X2RlcHRoc3RlbmNpbF9hdHRhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeV9kZXB0aHN0ZW5jaWxfYXR0YWNoLCBjYWxsZXIsIGVycm9yX2NvZGUpOworICAgIHJldHVybiBza2lwOworfQorCisvLyBWZXJpZnkgdGhhdCBnaXZlbiByZW5kZXJQYXNzIENyZWF0ZUluZm8gZm9yIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlcnMgYXJlIGNvbXBhdGlibGUuCisvLyAgVGhpcyBmdW5jdGlvbiBkZWFscyBkaXJlY3RseSB3aXRoIHRoZSBDcmVhdGVJbmZvLCB0aGVyZSBhcmUgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBiZWxvdyB0aGF0IGNhbiB0YWtlIHRoZSByZW5kZXJQYXNzIGhhbmRsZSBhbmQKKy8vICB3aWxsIHRoZW4gZmVlZCBpbnRvIHRoaXMgZnVuY3Rpb24KK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVSZW5kZXJQYXNzQ29tcGF0aWJpbGl0eShjb25zdCBjaGFyICp0eXBlMV9zdHJpbmcsIGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFICpycDFfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZTJfc3RyaW5nLCBjb25zdCBSRU5ERVJfUEFTU19TVEFURSAqcnAyX3N0YXRlLCBjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JfY29kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKHJwMV9zdGF0ZS0+Y3JlYXRlSW5mby5zdWJwYXNzQ291bnQgIT0gcnAyX3N0YXRlLT5jcmVhdGVJbmZvLnN1YnBhc3NDb3VudCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocnAxX3N0YXRlLT5yZW5kZXJQYXNzKSwgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogUmVuZGVyUGFzc2VzIGluY29tcGF0aWJsZSBiZXR3ZWVuICVzIHcvICVzIHdpdGggYSBzdWJwYXNzQ291bnQgb2YgJXUgYW5kICVzIHcvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyB3aXRoIGEgc3VicGFzc0NvdW50IG9mICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIsIHR5cGUxX3N0cmluZywgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShycDFfc3RhdGUtPnJlbmRlclBhc3MpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBycDFfc3RhdGUtPmNyZWF0ZUluZm8uc3VicGFzc0NvdW50LCB0eXBlMl9zdHJpbmcsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocnAyX3N0YXRlLT5yZW5kZXJQYXNzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcnAyX3N0YXRlLT5jcmVhdGVJbmZvLnN1YnBhc3NDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJwMV9zdGF0ZS0+Y3JlYXRlSW5mby5zdWJwYXNzQ291bnQ7ICsraSkgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVN1YnBhc3NDb21wYXRpYmlsaXR5KHR5cGUxX3N0cmluZywgcnAxX3N0YXRlLCB0eXBlMl9zdHJpbmcsIHJwMl9zdGF0ZSwgaSwgY2FsbGVyLCBlcnJvcl9jb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gRm9yIGdpdmVuIHBpcGVsaW5lLCByZXR1cm4gbnVtYmVyIG9mIE1TQUEgc2FtcGxlcywgb3Igb25lIGlmIE1TQUEgZGlzYWJsZWQKK3N0YXRpYyBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgR2V0TnVtU2FtcGxlcyhQSVBFTElORV9TVEFURSBjb25zdCAqcGlwZSkgeworICAgIGlmIChwaXBlLT5ncmFwaGljc1BpcGVsaW5lQ0kucE11bHRpc2FtcGxlU3RhdGUgIT0gTlVMTCAmJgorICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTyA9PSBwaXBlLT5ncmFwaGljc1BpcGVsaW5lQ0kucE11bHRpc2FtcGxlU3RhdGUtPnNUeXBlKSB7CisgICAgICAgIHJldHVybiBwaXBlLT5ncmFwaGljc1BpcGVsaW5lQ0kucE11bHRpc2FtcGxlU3RhdGUtPnJhc3Rlcml6YXRpb25TYW1wbGVzOworICAgIH0KKyAgICByZXR1cm4gVktfU0FNUExFX0NPVU5UXzFfQklUOworfQorCitzdGF0aWMgdm9pZCBMaXN0Qml0cyhzdGQ6Om9zdHJlYW0gJnMsIHVpbnQzMl90IGJpdHMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyICYmIGJpdHM7IGkrKykgeworICAgICAgICBpZiAoYml0cyAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICBzIDw8IGk7CisgICAgICAgICAgICBiaXRzICY9IH4oMSA8PCBpKTsKKyAgICAgICAgICAgIGlmIChiaXRzKSB7CisgICAgICAgICAgICAgICAgcyA8PCAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFZhbGlkYXRlIGRyYXctdGltZSBzdGF0ZSByZWxhdGVkIHRvIHRoZSBQU08KK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVQaXBlbGluZURyYXd0aW1lU3RhdGUoY29uc3QgTEFTVF9CT1VORF9TVEFURSAmc3RhdGUsIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgQ01EX1RZUEUgY21kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwUGlwZWxpbmUsIGNvbnN0IGNoYXIgKmNhbGxlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGF1dG8gJmN1cnJlbnRfdnR4X2Jmcl9iaW5kaW5nX2luZm8gPSBwQ0ItPmN1cnJlbnRfdmVydGV4X2J1ZmZlcl9iaW5kaW5nX2luZm8udmVydGV4X2J1ZmZlcl9iaW5kaW5nczsKKworICAgIC8vIFZlcmlmeSB2ZXJ0ZXggYmluZGluZworICAgIGlmIChwUGlwZWxpbmUtPnZlcnRleF9iaW5kaW5nX2Rlc2NyaXB0aW9uc18uc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBQaXBlbGluZS0+dmVydGV4X2JpbmRpbmdfZGVzY3JpcHRpb25zXy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byB2ZXJ0ZXhfYmluZGluZyA9IHBQaXBlbGluZS0+dmVydGV4X2JpbmRpbmdfZGVzY3JpcHRpb25zX1tpXS5iaW5kaW5nOworICAgICAgICAgICAgaWYgKChjdXJyZW50X3Z0eF9iZnJfYmluZGluZ19pbmZvLnNpemUoKSA8ICh2ZXJ0ZXhfYmluZGluZyArIDEpKSB8fAorICAgICAgICAgICAgICAgIChjdXJyZW50X3Z0eF9iZnJfYmluZGluZ19pbmZvW3ZlcnRleF9iaW5kaW5nXS5idWZmZXIgPT0gVktfTlVMTF9IQU5ETEUpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ0ItPmNvbW1hbmRCdWZmZXIpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9WdHhJbmRleE91dE9mQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBleHBlY3RzIHRoYXQgdGhpcyBDb21tYW5kIEJ1ZmZlcidzIHZlcnRleCBiaW5kaW5nIEluZGV4ICV1IHNob3VsZCBiZSBzZXQgdmlhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCaW5kVmVydGV4QnVmZmVycy4gVGhpcyBpcyBiZWNhdXNlIFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gc3RydWN0IGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggIiBQUklOVEZfU0laRV9UX1NQRUNJRklFUiAiIG9mIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zIGhhcyBhIGJpbmRpbmcgdmFsdWUgb2YgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHN0YXRlLnBpcGVsaW5lX3N0YXRlLT5waXBlbGluZSkuY19zdHIoKSwgdmVydGV4X2JpbmRpbmcsIGksIHZlcnRleF9iaW5kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFZlcmlmeSB2ZXJ0ZXggYXR0cmlidXRlIGFkZHJlc3MgYWxpZ25tZW50CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcFBpcGVsaW5lLT52ZXJ0ZXhfYXR0cmlidXRlX2Rlc2NyaXB0aW9uc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJmF0dHJpYnV0ZV9kZXNjcmlwdGlvbiA9IHBQaXBlbGluZS0+dmVydGV4X2F0dHJpYnV0ZV9kZXNjcmlwdGlvbnNfW2ldOworICAgICAgICAgICAgY29uc3QgYXV0byB2ZXJ0ZXhfYmluZGluZyA9IGF0dHJpYnV0ZV9kZXNjcmlwdGlvbi5iaW5kaW5nOworICAgICAgICAgICAgY29uc3QgYXV0byBhdHRyaWJ1dGVfb2Zmc2V0ID0gYXR0cmlidXRlX2Rlc2NyaXB0aW9uLm9mZnNldDsKKworICAgICAgICAgICAgY29uc3QgYXV0byAmdmVydGV4X2JpbmRpbmdfbWFwX2l0ID0gcFBpcGVsaW5lLT52ZXJ0ZXhfYmluZGluZ190b19pbmRleF9tYXBfLmZpbmQodmVydGV4X2JpbmRpbmcpOworICAgICAgICAgICAgaWYgKCh2ZXJ0ZXhfYmluZGluZ19tYXBfaXQgIT0gcFBpcGVsaW5lLT52ZXJ0ZXhfYmluZGluZ190b19pbmRleF9tYXBfLmNlbmQoKSkgJiYKKyAgICAgICAgICAgICAgICAodmVydGV4X2JpbmRpbmcgPCBjdXJyZW50X3Z0eF9iZnJfYmluZGluZ19pbmZvLnNpemUoKSkgJiYKKyAgICAgICAgICAgICAgICAoY3VycmVudF92dHhfYmZyX2JpbmRpbmdfaW5mb1t2ZXJ0ZXhfYmluZGluZ10uYnVmZmVyICE9IFZLX05VTExfSEFORExFKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gdmVydGV4X2J1ZmZlcl9zdHJpZGUgPSBwUGlwZWxpbmUtPnZlcnRleF9iaW5kaW5nX2Rlc2NyaXB0aW9uc19bdmVydGV4X2JpbmRpbmdfbWFwX2l0LT5zZWNvbmRdLnN0cmlkZTsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHZlcnRleF9idWZmZXJfb2Zmc2V0ID0gY3VycmVudF92dHhfYmZyX2JpbmRpbmdfaW5mb1t2ZXJ0ZXhfYmluZGluZ10ub2Zmc2V0OworCisgICAgICAgICAgICAgICAgLy8gVXNlIDEgYXMgdmVydGV4L2luc3RhbmNlIGluZGV4IHRvIHVzZSBidWZmZXIgc3RyaWRlIGFzIHdlbGwKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIGF0dHJpYl9hZGRyZXNzID0gdmVydGV4X2J1ZmZlcl9vZmZzZXQgKyB2ZXJ0ZXhfYnVmZmVyX3N0cmlkZSArIGF0dHJpYnV0ZV9vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgdnR4X2F0dHJpYl9yZXFfYWxpZ25tZW50ID0gcFBpcGVsaW5lLT52ZXJ0ZXhfYXR0cmlidXRlX2FsaWdubWVudHNfW2ldOworCisgICAgICAgICAgICAgICAgaWYgKFNhZmVNb2R1bG8oYXR0cmliX2FkZHJlc3MsIHZ0eF9hdHRyaWJfcmVxX2FsaWdubWVudCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGN1cnJlbnRfdnR4X2Jmcl9iaW5kaW5nX2luZm9bdmVydGV4X2JpbmRpbmddLmJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkVnR4QXR0cmlidXRlQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYXR0cmliQWRkcmVzcyBhbGlnbm1lbnQgZm9yIHZlcnRleCBhdHRyaWJ1dGUgIiBQUklOVEZfU0laRV9UX1NQRUNJRklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tICVzIGFuZCB2ZXJ0ZXggJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc3RhdGUucGlwZWxpbmVfc3RhdGUtPnBpcGVsaW5lKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjdXJyZW50X3Z0eF9iZnJfYmluZGluZ19pbmZvW3ZlcnRleF9iaW5kaW5nXS5idWZmZXIpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoIWN1cnJlbnRfdnR4X2Jmcl9iaW5kaW5nX2luZm8uZW1wdHkoKSkgJiYgKCFwQ0ItPnZlcnRleF9idWZmZXJfdXNlZCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENCLT5jb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfVnR4SW5kZXhPdXRPZkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJWZXJ0ZXggYnVmZmVycyBhcmUgYm91bmQgdG8gJXMgYnV0IG5vIHZlcnRleCBidWZmZXJzIGFyZSBhdHRhY2hlZCB0byAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ0ItPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHN0YXRlLnBpcGVsaW5lX3N0YXRlLT5waXBlbGluZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBWaWV3cG9ydCBvciBzY2lzc29ycyBhcmUgZHluYW1pYywgdmVyaWZ5IHRoYXQgZHluYW1pYyBjb3VudCBtYXRjaGVzIFBTTyBjb3VudC4KKyAgICAvLyBTa2lwIGNoZWNrIGlmIHJhc3Rlcml6YXRpb24gaXMgZGlzYWJsZWQgb3IgdGhlcmUgaXMgbm8gdmlld3BvcnQuCisgICAgaWYgKCghcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucFJhc3Rlcml6YXRpb25TdGF0ZSB8fAorICAgICAgICAgKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID09IFZLX0ZBTFNFKSkgJiYKKyAgICAgICAgcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucFZpZXdwb3J0U3RhdGUpIHsKKyAgICAgICAgYm9vbCBkeW5WaWV3cG9ydCA9IElzRHluYW1pYyhwUGlwZWxpbmUsIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQpOworICAgICAgICBib29sIGR5blNjaXNzb3IgPSBJc0R5bmFtaWMocFBpcGVsaW5lLCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1IpOworCisgICAgICAgIGlmIChkeW5WaWV3cG9ydCkgeworICAgICAgICAgICAgY29uc3QgYXV0byByZXF1aXJlZFZpZXdwb3J0c01hc2sgPSAoMSA8PCBwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wVmlld3BvcnRTdGF0ZS0+dmlld3BvcnRDb3VudCkgLSAxOworICAgICAgICAgICAgY29uc3QgYXV0byBtaXNzaW5nVmlld3BvcnRNYXNrID0gfnBDQi0+dmlld3BvcnRNYXNrICYgcmVxdWlyZWRWaWV3cG9ydHNNYXNrOworICAgICAgICAgICAgaWYgKG1pc3NpbmdWaWV3cG9ydE1hc2spIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCAiRHluYW1pYyB2aWV3cG9ydChzKSAiOworICAgICAgICAgICAgICAgIExpc3RCaXRzKHNzLCBtaXNzaW5nVmlld3BvcnRNYXNrKTsKKyAgICAgICAgICAgICAgICBzcyA8PCAiIGFyZSB1c2VkIGJ5IHBpcGVsaW5lIHN0YXRlIG9iamVjdCwgYnV0IHdlcmUgbm90IHByb3ZpZGVkIHZpYSBjYWxscyB0byB2a0NtZFNldFZpZXdwb3J0KCkuIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfRHJhd1N0YXRlX1ZpZXdwb3J0U2Npc3Nvck1pc21hdGNoLCAiJXMiLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkeW5TY2lzc29yKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvIHJlcXVpcmVkU2Npc3Nvck1hc2sgPSAoMSA8PCBwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wVmlld3BvcnRTdGF0ZS0+c2Npc3NvckNvdW50KSAtIDE7CisgICAgICAgICAgICBjb25zdCBhdXRvIG1pc3NpbmdTY2lzc29yTWFzayA9IH5wQ0ItPnNjaXNzb3JNYXNrICYgcmVxdWlyZWRTY2lzc29yTWFzazsKKyAgICAgICAgICAgIGlmIChtaXNzaW5nU2Npc3Nvck1hc2spIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCAiRHluYW1pYyBzY2lzc29yKHMpICI7CisgICAgICAgICAgICAgICAgTGlzdEJpdHMoc3MsIG1pc3NpbmdTY2lzc29yTWFzayk7CisgICAgICAgICAgICAgICAgc3MgPDwgIiBhcmUgdXNlZCBieSBwaXBlbGluZSBzdGF0ZSBvYmplY3QsIGJ1dCB3ZXJlIG5vdCBwcm92aWRlZCB2aWEgY2FsbHMgdG8gdmtDbWRTZXRTY2lzc29yKCkuIjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfRHJhd1N0YXRlX1ZpZXdwb3J0U2Npc3Nvck1pc21hdGNoLCAiJXMiLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZlcmlmeSB0aGF0IGFueSBNU0FBIHJlcXVlc3QgaW4gUFNPIG1hdGNoZXMgc2FtcGxlIyBpbiBib3VuZCBGQgorICAgIC8vIFNraXAgdGhlIGNoZWNrIGlmIHJhc3Rlcml6YXRpb24gaXMgZGlzYWJsZWQuCisgICAgaWYgKCFwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wUmFzdGVyaXphdGlvblN0YXRlIHx8CisgICAgICAgIChwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wUmFzdGVyaXphdGlvblN0YXRlLT5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA9PSBWS19GQUxTRSkpIHsKKyAgICAgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHBzb19udW1fc2FtcGxlcyA9IEdldE51bVNhbXBsZXMocFBpcGVsaW5lKTsKKyAgICAgICAgaWYgKHBDQi0+YWN0aXZlUmVuZGVyUGFzcykgeworICAgICAgICAgICAgY29uc3QgYXV0byByZW5kZXJfcGFzc19pbmZvID0gcENCLT5hY3RpdmVSZW5kZXJQYXNzLT5jcmVhdGVJbmZvLnB0cigpOworICAgICAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICpzdWJwYXNzX2Rlc2MgPSAmcmVuZGVyX3Bhc3NfaW5mby0+cFN1YnBhc3Nlc1twQ0ItPmFjdGl2ZVN1YnBhc3NdOworICAgICAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHN1YnBhc3NfbnVtX3NhbXBsZXMgPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VicGFzc19kZXNjLT5jb2xvckF0dGFjaG1lbnRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBhdHRhY2htZW50ID0gc3VicGFzc19kZXNjLT5wQ29sb3JBdHRhY2htZW50c1tpXS5hdHRhY2htZW50OworICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKQorICAgICAgICAgICAgICAgICAgICBzdWJwYXNzX251bV9zYW1wbGVzIHw9ICh1bnNpZ25lZClyZW5kZXJfcGFzc19pbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudF0uc2FtcGxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN1YnBhc3NfZGVzYy0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgJiYKKyAgICAgICAgICAgICAgICBzdWJwYXNzX2Rlc2MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBhdHRhY2htZW50ID0gc3VicGFzc19kZXNjLT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudDsKKyAgICAgICAgICAgICAgICBzdWJwYXNzX251bV9zYW1wbGVzIHw9ICh1bnNpZ25lZClyZW5kZXJfcGFzc19pbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudF0uc2FtcGxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoZGV2aWNlX2V4dGVuc2lvbnMudmtfYW1kX21peGVkX2F0dGFjaG1lbnRfc2FtcGxlcyB8fCBkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzKSAmJgorICAgICAgICAgICAgICAgICgoc3VicGFzc19udW1fc2FtcGxlcyAmIHN0YXRpY19jYXN0PHVuc2lnbmVkPihwc29fbnVtX3NhbXBsZXMpKSAhPSBzdWJwYXNzX251bV9zYW1wbGVzKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBQaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9OdW1TYW1wbGVzTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW0gc2FtcGxlcyBtaXNtYXRjaCEgQXQgZHJhdy10aW1lIGluICVzIHdpdGggJXUgc2FtcGxlcyB3aGlsZSBjdXJyZW50ICVzIHcvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1IHNhbXBsZXMhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwUGlwZWxpbmUtPnBpcGVsaW5lKS5jX3N0cigpLCBwc29fbnVtX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENCLT5hY3RpdmVSZW5kZXJQYXNzLT5yZW5kZXJQYXNzKS5jX3N0cigpLCBzdWJwYXNzX251bV9zYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBQaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9Ob0FjdGl2ZVJlbmRlcnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gYWN0aXZlIHJlbmRlciBwYXNzIGZvdW5kIGF0IGRyYXctdGltZSBpbiAlcyEiLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBQaXBlbGluZS0+cGlwZWxpbmUpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIC8vIFZlcmlmeSB0aGF0IFBTTyBjcmVhdGlvbiByZW5kZXJQYXNzIGlzIGNvbXBhdGlibGUgd2l0aCBhY3RpdmUgcmVuZGVyUGFzcworICAgIGlmIChwQ0ItPmFjdGl2ZVJlbmRlclBhc3MpIHsKKyAgICAgICAgLy8gVE9ETzogTW92ZSBhbGwgb2YgdGhlIGVycm9yIGNvZGVzIGNvbW1vbiBhY3Jvc3MgZGlmZmVyZW50IERyYXdzIGludG8gYSBMVVQgYWNjZXNzZWQgYnkgY21kX3R5cGUKKyAgICAgICAgLy8gVE9ETzogQU1EIGV4dGVuc2lvbiBjb2RlcyBhcmUgaW5jbHVkZWQgaGVyZSwgYnV0IGFjdHVhbCBmdW5jdGlvbiBlbnRyeXBvaW50cyBhcmUgbm90IHlldCBpbnRlcmNlcHRlZAorICAgICAgICAvLyBFcnJvciBjb2RlcyBmb3IgcmVuZGVycGFzcyBhbmQgc3VicGFzcyBtaXNtYXRjaGVzCisgICAgICAgIGF1dG8gcnBfZXJyb3IgPSAiVlVJRC12a0NtZERyYXctcmVuZGVyUGFzcy0wMjY4NCIsIHNwX2Vycm9yID0gIlZVSUQtdmtDbWREcmF3LXN1YnBhc3MtMDI2ODUiOworICAgICAgICBzd2l0Y2ggKGNtZF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENNRF9EUkFXSU5ERVhFRDoKKyAgICAgICAgICAgICAgICBycF9lcnJvciA9ICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtcmVuZGVyUGFzcy0wMjY4NCI7CisgICAgICAgICAgICAgICAgc3BfZXJyb3IgPSAiVlVJRC12a0NtZERyYXdJbmRleGVkLXN1YnBhc3MtMDI2ODUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDTURfRFJBV0lORElSRUNUOgorICAgICAgICAgICAgICAgIHJwX2Vycm9yID0gIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtcmVuZGVyUGFzcy0wMjY4NCI7CisgICAgICAgICAgICAgICAgc3BfZXJyb3IgPSAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1zdWJwYXNzLTAyNjg1IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ01EX0RSQVdJTkRJUkVDVENPVU5US0hSOgorICAgICAgICAgICAgICAgIHJwX2Vycm9yID0gIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1yZW5kZXJQYXNzLTAyNjg0IjsKKyAgICAgICAgICAgICAgICBzcF9lcnJvciA9ICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItc3VicGFzcy0wMjY4NSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENNRF9EUkFXSU5ERVhFRElORElSRUNUOgorICAgICAgICAgICAgICAgIHJwX2Vycm9yID0gIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LXJlbmRlclBhc3MtMDI2ODQiOworICAgICAgICAgICAgICAgIHNwX2Vycm9yID0gIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LXN1YnBhc3MtMDI2ODUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDTURfRFJBV0lOREVYRURJTkRJUkVDVENPVU5US0hSOgorICAgICAgICAgICAgICAgIHJwX2Vycm9yID0gIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItcmVuZGVyUGFzcy0wMjY4NCI7CisgICAgICAgICAgICAgICAgc3BfZXJyb3IgPSAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1zdWJwYXNzLTAyNjg1IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ01EX0RSQVdNRVNIVEFTS1NOVjoKKyAgICAgICAgICAgICAgICBycF9lcnJvciA9ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLXJlbmRlclBhc3MtMDI2ODQiOworICAgICAgICAgICAgICAgIHNwX2Vycm9yID0gIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtc3VicGFzcy0wMjY4NSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENNRF9EUkFXTUVTSFRBU0tTSU5ESVJFQ1ROVjoKKyAgICAgICAgICAgICAgICBycF9lcnJvciA9ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtcmVuZGVyUGFzcy0wMjY4NCI7CisgICAgICAgICAgICAgICAgc3BfZXJyb3IgPSAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLXN1YnBhc3MtMDI2ODUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDTURfRFJBV01FU0hUQVNLU0lORElSRUNUQ09VTlROVjoKKyAgICAgICAgICAgICAgICBycF9lcnJvciA9ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1yZW5kZXJQYXNzLTAyNjg0IjsKKyAgICAgICAgICAgICAgICBzcF9lcnJvciA9ICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1zdWJwYXNzLTAyNjg1IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KENNRF9EUkFXID09IGNtZF90eXBlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocENCLT5hY3RpdmVSZW5kZXJQYXNzLT5yZW5kZXJQYXNzICE9IHBQaXBlbGluZS0+cnBfc3RhdGUtPnJlbmRlclBhc3MpIHsKKyAgICAgICAgICAgIC8vIHJlbmRlclBhc3MgdGhhdCBQU08gd2FzIGNyZWF0ZWQgd2l0aCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBhY3RpdmUgcmVuZGVyUGFzcyB0aGF0IFBTTyBpcyBiZWluZyB1c2VkIHdpdGgKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVSZW5kZXJQYXNzQ29tcGF0aWJpbGl0eSgiYWN0aXZlIHJlbmRlciBwYXNzIiwgcENCLT5hY3RpdmVSZW5kZXJQYXNzLCAicGlwZWxpbmUgc3RhdGUgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmUtPnJwX3N0YXRlLmdldCgpLCBjYWxsZXIsIHJwX2Vycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kuc3VicGFzcyAhPSBwQ0ItPmFjdGl2ZVN1YnBhc3MpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBQaXBlbGluZS0+cGlwZWxpbmUpLCBzcF9lcnJvciwgIlBpcGVsaW5lIHdhcyBidWlsdCBmb3Igc3VicGFzcyAldSBidXQgdXNlZCBpbiBzdWJwYXNzICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5zdWJwYXNzLCBwQ0ItPmFjdGl2ZVN1YnBhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIEZvciBnaXZlbiBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQsIHZlcmlmeSB0aGF0IGl0cyBTZXQgaXMgY29tcGF0aWJsZSB3LyB0aGUgc2V0TGF5b3V0IGNvcnJlc3BvbmRpbmcgdG8KKy8vIHBpcGVsaW5lTGF5b3V0W2xheW91dEluZGV4XQorc3RhdGljIGJvb2wgVmVyaWZ5U2V0TGF5b3V0Q29tcGF0aWJpbGl0eShjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIGNvbnN0IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqZGVzY3JpcHRvcl9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVMSU5FX0xBWU9VVF9TVEFURSBjb25zdCAqcGlwZWxpbmVfbGF5b3V0LCBjb25zdCB1aW50MzJfdCBsYXlvdXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICZlcnJvck1zZykgeworICAgIGF1dG8gbnVtX3NldHMgPSBwaXBlbGluZV9sYXlvdXQtPnNldF9sYXlvdXRzLnNpemUoKTsKKyAgICBpZiAobGF5b3V0SW5kZXggPj0gbnVtX3NldHMpIHsKKyAgICAgICAgc3RyaW5nc3RyZWFtIGVycm9yU3RyOworICAgICAgICBlcnJvclN0ciA8PCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBpcGVsaW5lX2xheW91dC0+bGF5b3V0KSA8PCAiKSBvbmx5IGNvbnRhaW5zICIgPDwgbnVtX3NldHMKKyAgICAgICAgICAgICAgICAgPDwgIiBzZXRMYXlvdXRzIGNvcnJlc3BvbmRpbmcgdG8gc2V0cyAwLSIgPDwgbnVtX3NldHMgLSAxIDw8ICIsIGJ1dCB5b3UncmUgYXR0ZW1wdGluZyB0byBiaW5kIHNldCB0byBpbmRleCAiCisgICAgICAgICAgICAgICAgIDw8IGxheW91dEluZGV4OworICAgICAgICBlcnJvck1zZyA9IGVycm9yU3RyLnN0cigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChkZXNjcmlwdG9yX3NldC0+SXNQdXNoRGVzY3JpcHRvcigpKSByZXR1cm4gdHJ1ZTsKKyAgICBhdXRvIGxheW91dF9ub2RlID0gcGlwZWxpbmVfbGF5b3V0LT5zZXRfbGF5b3V0c1tsYXlvdXRJbmRleF0uZ2V0KCk7CisgICAgcmV0dXJuIGN2ZGVzY3JpcHRvcnNldDo6VmVyaWZ5U2V0TGF5b3V0Q29tcGF0aWJpbGl0eShyZXBvcnRfZGF0YSwgbGF5b3V0X25vZGUsIGRlc2NyaXB0b3Jfc2V0LT5HZXRMYXlvdXQoKS5nZXQoKSwgJmVycm9yTXNnKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnN0cmluZ19WdWlkTm90Q29tcGF0aWJsZUZvclNldChDTURfVFlQRSBjbWRfdHlwZSkgeworICAgIGNvbnN0IHN0YXRpYyBzdGQ6Om1hcDxDTURfVFlQRSwgY29uc3QgY2hhciAqPiBpbmNvbXBhdGlibGVfZm9yX3NldF92dWlkID0geworICAgICAgICB7Q01EX0RJU1BBVENILCAiVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI2OTcifSwKKyAgICAgICAge0NNRF9ESVNQQVRDSElORElSRUNULCAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5NyJ9LAorICAgICAgICB7Q01EX0RSQVcsICJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjk3In0sCisgICAgICAgIHtDTURfRFJBV0lOREVYRUQsICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5NyJ9LAorICAgICAgICB7Q01EX0RSQVdJTkRFWEVESU5ESVJFQ1QsICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjk3In0sCisgICAgICAgIHtDTURfRFJBV0lOREVYRURJTkRJUkVDVENPVU5US0hSLCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk3In0sCisgICAgICAgIHtDTURfRFJBV0lORElSRUNULCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjk3In0sCisgICAgICAgIHtDTURfRFJBV0lORElSRUNUQ09VTlRLSFIsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5NyJ9LAorICAgICAgICB7Q01EX0RSQVdNRVNIVEFTS1NJTkRJUkVDVENPVU5UTlYsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjk3In0sCisgICAgICAgIHtDTURfRFJBV01FU0hUQVNLU0lORElSRUNUTlYsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjY5NyJ9LAorICAgICAgICB7Q01EX0RSQVdNRVNIVEFTS1NOViwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjY5NyJ9LAorCisgICAgICAgIC8vIE5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBhdGguLi4KKyAgICAgICAgLy8geyBDTURfRFJBV0RJU1BBVENIQkFTRSwgIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjY5NyIgfSwKKyAgICAgICAgLy8geyBDTURfRFJBV0lORElSRUNUQllURUNPVU5URVhULCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjk3In0sCisgICAgICAgIHtDTURfVFJBQ0VSQVlTTlYsICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjY5NyJ9LAorICAgIH07CisgICAgYXV0byBmaW5kX2l0ID0gaW5jb21wYXRpYmxlX2Zvcl9zZXRfdnVpZC5maW5kKGNtZF90eXBlKTsKKyAgICBpZiAoZmluZF9pdCA9PSBpbmNvbXBhdGlibGVfZm9yX3NldF92dWlkLmNlbmQoKSkgeworICAgICAgICBhc3NlcnQoZmluZF9pdCAhPSBpbmNvbXBhdGlibGVfZm9yX3NldF92dWlkLmNlbmQoKSk7CisgICAgICAgIHJldHVybiAiQkFEIFZVSUQgLS0gVW5rbm93biBDb21tYW5kIFR5cGUiOworICAgIH0KKyAgICByZXR1cm4gZmluZF9pdC0+c2Vjb25kOworfQorLy8gVmFsaWRhdGUgb3ZlcmFsbCBzdGF0ZSBhdCB0aGUgdGltZSBvZiBhIGRyYXcgY2FsbAorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNtZEJ1ZkRyYXdTdGF0ZShjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlLCBDTURfVFlQRSBjbWRfdHlwZSwgY29uc3QgYm9vbCBpbmRleGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BpcGVsaW5lQmluZFBvaW50IGJpbmRfcG9pbnQsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpwaXBlX2Vycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGF0ZV9lcnJfY29kZSkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gbGFzdF9ib3VuZF9pdCA9IGNiX25vZGUtPmxhc3RCb3VuZC5maW5kKGJpbmRfcG9pbnQpOworICAgIGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwUGlwZSA9IG51bGxwdHI7CisgICAgaWYgKGxhc3RfYm91bmRfaXQgIT0gY2Jfbm9kZS0+bGFzdEJvdW5kLmNlbmQoKSkgeworICAgICAgICBwUGlwZSA9IGxhc3RfYm91bmRfaXQtPnNlY29uZC5waXBlbGluZV9zdGF0ZTsKKyAgICB9CisKKyAgICBpZiAobnVsbHB0ciA9PSBwUGlwZSkgeworICAgICAgICByZXR1cm4gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpLCBwaXBlX2Vycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBub3QgY2FsbCAlcyBvbiB0aGlzIGNvbW1hbmQgYnVmZmVyIHdoaWxlIHRoZXJlIGlzIG5vICVzIHBpcGVsaW5lIGJvdW5kLiIsIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBiaW5kX3BvaW50ID09IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MgPyAiR3JhcGhpY3MiIDogIkNvbXB1dGUiKTsKKyAgICB9CisKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIGF1dG8gY29uc3QgJnN0YXRlID0gbGFzdF9ib3VuZF9pdC0+c2Vjb25kOworCisgICAgLy8gRmlyc3QgY2hlY2sgZmxhZyBzdGF0ZXMKKyAgICBpZiAoVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyA9PSBiaW5kX3BvaW50KSByZXN1bHQgPSBWYWxpZGF0ZURyYXdTdGF0ZUZsYWdzKGNiX25vZGUsIHBQaXBlLCBpbmRleGVkLCBzdGF0ZV9lcnJfY29kZSk7CisKKyAgICAvLyBOb3cgY29tcGxldGUgb3RoZXIgc3RhdGUgY2hlY2tzCisgICAgc3RyaW5nIGVycm9yU3RyaW5nOworICAgIGF1dG8gY29uc3QgJnBpcGVsaW5lX2xheW91dCA9IHBQaXBlLT5waXBlbGluZV9sYXlvdXQuZ2V0KCk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBwaXBlbGluZSBpcyBjb21wYXRpYmxlIGZvciB0aGUgbWF4aW11bSB1c2VkIHNldCB3aXRoIHRoZSBib3VuZCBzZXRzLgorICAgIGlmIChwUGlwZS0+YWN0aXZlX3Nsb3RzLnNpemUoKSA+IDAgJiYgIUNvbXBhdEZvclNldChwUGlwZS0+bWF4X2FjdGl2ZV9zbG90LCBzdGF0ZSwgcGlwZWxpbmVfbGF5b3V0LT5jb21wYXRfZm9yX3NldCkpIHsKKyAgICAgICAgcmVzdWx0IHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUGlwZS0+cGlwZWxpbmUpLCBzdHJpbmdfVnVpZE5vdENvbXBhdGlibGVGb3JTZXQoY21kX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogJXMgZGVmaW5lZCB3aXRoICVzIGlzIG5vdCBjb21wYXRpYmxlIGZvciBtYXhpbXVtIHNldCBzdGF0aWNhbGx5IHVzZWQgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBib3VuZCBkZXNjcmlwdG9yIHNldHMsIGxhc3QgYm91bmQgd2l0aCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfbmFtZV9saXN0W2NtZF90eXBlXSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwUGlwZS0+cGlwZWxpbmUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocGlwZWxpbmVfbGF5b3V0LT5sYXlvdXQpLmNfc3RyKCksIHBQaXBlLT5tYXhfYWN0aXZlX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc3RhdGUucGlwZWxpbmVfbGF5b3V0KS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNldF9iaW5kaW5nX3BhaXIgOiBwUGlwZS0+YWN0aXZlX3Nsb3RzKSB7CisgICAgICAgIHVpbnQzMl90IHNldEluZGV4ID0gc2V0X2JpbmRpbmdfcGFpci5maXJzdDsKKyAgICAgICAgLy8gSWYgdmFsaWQgc2V0IGlzIG5vdCBib3VuZCB0aHJvdyBhbiBlcnJvcgorICAgICAgICBpZiAoKHN0YXRlLnBlcl9zZXQuc2l6ZSgpIDw9IHNldEluZGV4KSB8fCAoIXN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLmJvdW5kX2Rlc2NyaXB0b3Jfc2V0KSkgeworICAgICAgICAgICAgcmVzdWx0IHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfRGVzY3JpcHRvclNldE5vdEJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHVzZXMgc2V0ICMldSBidXQgdGhhdCBzZXQgaXMgbm90IGJvdW5kLiIsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocFBpcGUtPnBpcGVsaW5lKS5jX3N0cigpLCBzZXRJbmRleCk7CisgICAgICAgIH0gZWxzZSBpZiAoIVZlcmlmeVNldExheW91dENvbXBhdGliaWxpdHkocmVwb3J0X2RhdGEsIHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLmJvdW5kX2Rlc2NyaXB0b3Jfc2V0LCBwaXBlbGluZV9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5kZXgsIGVycm9yU3RyaW5nKSkgeworICAgICAgICAgICAgLy8gU2V0IGlzIGJvdW5kIGJ1dCBub3QgY29tcGF0aWJsZSB3LyBvdmVybGFwcGluZyBwaXBlbGluZV9sYXlvdXQgZnJvbSBQU08KKyAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldCBzZXRIYW5kbGUgPSBzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS5ib3VuZF9kZXNjcmlwdG9yX3NldC0+R2V0U2V0KCk7CisgICAgICAgICAgICByZXN1bHQgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZXRIYW5kbGUpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9QaXBlbGluZUxheW91dHNJbmNvbXBhdGlibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgYm91bmQgYXMgc2V0ICMldSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG92ZXJsYXBwaW5nICVzIGR1ZSB0bzogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzZXRIYW5kbGUpLmNfc3RyKCksIHNldEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwaXBlbGluZV9sYXlvdXQtPmxheW91dCkuY19zdHIoKSwgZXJyb3JTdHJpbmcuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7ICAvLyBWYWxpZCBzZXQgaXMgYm91bmQgYW5kIGxheW91dCBjb21wYXRpYmxlLCB2YWxpZGF0ZSB0aGF0IGl0J3MgdXBkYXRlZAorICAgICAgICAgICAgLy8gUHVsbCB0aGUgc2V0IG5vZGUKKyAgICAgICAgICAgIGNvbnN0IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqZGVzY3JpcHRvcl9zZXQgPSBzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS5ib3VuZF9kZXNjcmlwdG9yX3NldDsKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBkcmF3LXRpbWUgc3RhdGUgZm9yIHRoaXMgZGVzY3JpcHRvciBzZXQKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycl9zdHI7CisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3Jfc2V0LT5Jc1B1c2hEZXNjcmlwdG9yKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgdGhlICJiaW5kbGVzcyIgc3R5bGUgcmVzb3VyY2UgdXNhZ2Ugd2l0aCBtYW55IGRlc2NyaXB0b3JzLCBuZWVkIHRvIG9wdGltaXplIGNvbW1hbmQgPC0+IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAvLyBiaW5kaW5nIHZhbGlkYXRpb24uIFRha2UgdGhlIHJlcXVlc3RlZCBiaW5kaW5nIHNldCBhbmQgcHJlZmlsdGVyIGl0IHRvIGVsaW1pbmF0ZSByZWR1bmRhbnQgdmFsaWRhdGlvbiBjaGVja3MuCisgICAgICAgICAgICAgICAgLy8gSGVyZSwgdGhlIGN1cnJlbnRseSBib3VuZCBwaXBlbGluZSBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gaW1hZ2UgdmFsaWRhdGlvbiBjaGVjayBpcyByZWR1bmRhbnQuLi4KKyAgICAgICAgICAgICAgICAvLyBmb3IgaW1hZ2VzIGFyZSB0aGUgInJlcSIgcG9ydGlvbiBvZiB0aGUgYmluZGluZ19yZXEgaXMgaW5kaXJlY3RseSAoYnV0IHRpZ2h0bHkpIGNvdXBsZWQgdG8gdGhlIHBpcGVsaW5lLgorICAgICAgICAgICAgICAgIGN2ZGVzY3JpcHRvcnNldDo6UHJlZmlsdGVyQmluZFJlcXVlc3RNYXAgcmVkdWNlZF9tYXAoKmRlc2NyaXB0b3Jfc2V0LCBzZXRfYmluZGluZ19wYWlyLnNlY29uZCk7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmYmluZGluZ19yZXFfbWFwID0gcmVkdWNlZF9tYXAuRmlsdGVyZWRNYXAoKmNiX25vZGUsICpwUGlwZSk7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW4gc2tpcCB2YWxpZGF0aW5nIHRoZSBkZXNjcmlwdG9yIHNldCBpZiAibm90aGluZyIgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdmFsaWRhdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBTYW1lIHNldCwgbm8gaW1hZ2UgbGF5b3V0IGNoYW5nZXMsIGFuZCBzYW1lICJwaXBlbGluZSBzdGF0ZSIgKGJpbmRpbmdfcmVxX21hcCkuIElmIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgIC8vIGFueSBkeW5hbWljIGRlc2NyaXB0b3JzLCBhbHdheXMgcmV2YWxpZGF0ZSByYXRoZXIgdGhhbiBjYWNoaW5nIHRoZSB2YWx1ZXMuIFdlIGN1cnJlbnRseSBvbmx5CisgICAgICAgICAgICAgICAgLy8gYXBwbHkgdGhpcyBvcHRpbWl6YXRpb24gaWYgSXNNYW55RGVzY3JpcHRvcnMgaXMgdHJ1ZSwgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNvcHlpbmcgdGhlCisgICAgICAgICAgICAgICAgLy8gYmluZGluZ19yZXFfbWFwIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGJlIGV4cGVuc2l2ZS4KKyAgICAgICAgICAgICAgICBib29sIGRlc2NyaXB0b3Jfc2V0X2NoYW5nZWQgPQorICAgICAgICAgICAgICAgICAgICAhcmVkdWNlZF9tYXAuSXNNYW55RGVzY3JpcHRvcnMoKSB8fAorICAgICAgICAgICAgICAgICAgICAvLyBSZXZhbGlkYXRlIGVhY2ggdGltZSBpZiB0aGUgc2V0IGhhcyBkeW5hbWljIG9mZnNldHMKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyX3NldFtzZXRJbmRleF0uZHluYW1pY09mZnNldHMuc2l6ZSgpID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAvLyBSZXZhbGlkYXRlIGlmIGRlc2NyaXB0b3Igc2V0IChvciBjb250ZW50cykgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyX3NldFtzZXRJbmRleF0udmFsaWRhdGVkX3NldCAhPSBkZXNjcmlwdG9yX3NldCB8fAorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS52YWxpZGF0ZWRfc2V0X2NoYW5nZV9jb3VudCAhPSBkZXNjcmlwdG9yX3NldC0+R2V0Q2hhbmdlQ291bnQoKSB8fAorICAgICAgICAgICAgICAgICAgICAoIWRpc2FibGVkLmltYWdlX2xheW91dF92YWxpZGF0aW9uICYmCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS52YWxpZGF0ZWRfc2V0X2ltYWdlX2xheW91dF9jaGFuZ2VfY291bnQgIT0gY2Jfbm9kZS0+aW1hZ2VfbGF5b3V0X2NoYW5nZV9jb3VudCk7CisgICAgICAgICAgICAgICAgYm9vbCBuZWVkX3ZhbGlkYXRlID0gZGVzY3JpcHRvcl9zZXRfY2hhbmdlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldmFsaWRhdGUgaWYgcHJldmlvdXMgYmluZGluZ1JlcU1hcCBkb2Vzbid0IGluY2x1ZGUgbmV3IGJpbmRpbmdSZXFNYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjppbmNsdWRlcyhzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS52YWxpZGF0ZWRfc2V0X2JpbmRpbmdfcmVxX21hcC5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLnZhbGlkYXRlZF9zZXRfYmluZGluZ19yZXFfbWFwLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdfcmVxX21hcC5iZWdpbigpLCBiaW5kaW5nX3JlcV9tYXAuZW5kKCkpOworCisgICAgICAgICAgICAgICAgaWYgKG5lZWRfdmFsaWRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3Jfc2V0X2NoYW5nZWQgJiYgcmVkdWNlZF9tYXAuSXNNYW55RGVzY3JpcHRvcnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB2YWxpZGF0ZSB0aGUgYmluZGluZ3MgdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdSZXFNYXAgZGVsdGFfcmVxczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0X2RpZmZlcmVuY2UoYmluZGluZ19yZXFfbWFwLmJlZ2luKCksIGJpbmRpbmdfcmVxX21hcC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyX3NldFtzZXRJbmRleF0udmFsaWRhdGVkX3NldF9iaW5kaW5nX3JlcV9tYXAuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyX3NldFtzZXRJbmRleF0udmFsaWRhdGVkX3NldF9iaW5kaW5nX3JlcV9tYXAuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoZGVsdGFfcmVxcywgZGVsdGFfcmVxcy5iZWdpbigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gVmFsaWRhdGVEcmF3U3RhdGUoZGVzY3JpcHRvcl9zZXQsIGRlbHRhX3JlcXMsIHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLmR5bmFtaWNPZmZzZXRzLCBjYl9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCAmZXJyX3N0cik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gVmFsaWRhdGVEcmF3U3RhdGUoZGVzY3JpcHRvcl9zZXQsIGJpbmRpbmdfcmVxX21hcCwgc3RhdGUucGVyX3NldFtzZXRJbmRleF0uZHluYW1pY09mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfbm9kZSwgZnVuY3Rpb24sICZlcnJfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gc2V0ID0gZGVzY3JpcHRvcl9zZXQtPkdldFNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZXQpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9EZXNjcmlwdG9yU2V0Tm90VXBkYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBib3VuZCBhcyBzZXQgIyV1IGVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBlcnJvciBhdCAlcyB0aW1lOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNldCkuY19zdHIoKSwgc2V0SW5kZXgsIGZ1bmN0aW9uLCBlcnJfc3RyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgZ2VuZXJhbCBwaXBlbGluZSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHZhbGlkYXRlZCBhdCBkcmF3dGltZQorICAgIGlmIChWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTID09IGJpbmRfcG9pbnQpCisgICAgICAgIHJlc3VsdCB8PSBWYWxpZGF0ZVBpcGVsaW5lRHJhd3RpbWVTdGF0ZShzdGF0ZSwgY2Jfbm9kZSwgY21kX3R5cGUsIHBQaXBlLCBmdW5jdGlvbik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlUGlwZWxpbmVMb2NrZWQoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFBJUEVMSU5FX1NUQVRFPj4gY29uc3QgJnBQaXBlbGluZXMsIGludCBwaXBlbGluZUluZGV4KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBjb25zdCBQSVBFTElORV9TVEFURSAqcFBpcGVsaW5lID0gcFBpcGVsaW5lc1twaXBlbGluZUluZGV4XS5nZXQoKTsKKworICAgIC8vIElmIGNyZWF0ZSBkZXJpdmF0aXZlIGJpdCBpcyBzZXQsIGNoZWNrIHRoYXQgd2UndmUgc3BlY2lmaWVkIGEgYmFzZQorICAgIC8vIHBpcGVsaW5lIGNvcnJlY3RseSwgYW5kIHRoYXQgdGhlIGJhc2UgcGlwZWxpbmUgd2FzIGNyZWF0ZWQgdG8gYWxsb3cKKyAgICAvLyBkZXJpdmF0aXZlcy4KKyAgICBpZiAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kuZmxhZ3MgJiBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQpIHsKKyAgICAgICAgY29uc3QgUElQRUxJTkVfU1RBVEUgKnBCYXNlUGlwZWxpbmUgPSBudWxscHRyOworICAgICAgICBpZiAoISgocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kuYmFzZVBpcGVsaW5lSGFuZGxlICE9IFZLX05VTExfSEFORExFKSBeCisgICAgICAgICAgICAgIChwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5iYXNlUGlwZWxpbmVJbmRleCAhPSAtMSkpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIGEgc3VwZXJzZXQgb2YgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyNCIgYW5kCisgICAgICAgICAgICAvLyAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNzI1IgorICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFBpcGVsaW5lQ3JlYXRlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbzogZXhhY3RseSBvbmUgb2YgYmFzZSBwaXBlbGluZSBpbmRleCBhbmQgaGFuZGxlIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIH0gZWxzZSBpZiAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kuYmFzZVBpcGVsaW5lSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5iYXNlUGlwZWxpbmVJbmRleCA+PSBwaXBlbGluZUluZGV4KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtZmxhZ3MtMDA3MjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaXBlbGluZSBDcmVhdGVJbmZvOiBiYXNlIHBpcGVsaW5lIG11c3Qgb2NjdXIgZWFybGllciBpbiBhcnJheSB0aGFuIGRlcml2YXRpdmUgcGlwZWxpbmUuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBCYXNlUGlwZWxpbmUgPSBwUGlwZWxpbmVzW3BQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLmJhc2VQaXBlbGluZUluZGV4XS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5iYXNlUGlwZWxpbmVIYW5kbGUgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHBCYXNlUGlwZWxpbmUgPSBHZXRQaXBlbGluZVN0YXRlKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLmJhc2VQaXBlbGluZUhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocEJhc2VQaXBlbGluZSAmJiAhKHBCYXNlUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5mbGFncyAmIFZLX1BJUEVMSU5FX0NSRUFURV9BTExPV19ERVJJVkFUSVZFU19CSVQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUGlwZWxpbmVDcmVhdGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaXBlbGluZSBDcmVhdGVJbmZvOiBiYXNlIHBpcGVsaW5lIGRvZXMgbm90IGFsbG93IGRlcml2YXRpdmVzLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIFVOTE9DS0VEIHBpcGVsaW5lIHZhbGlkYXRpb24uIERPIE5PVCBsb29rdXAgb2JqZWN0cyBpbiB0aGUgQ29yZUNoZWNrcy0+KiBtYXBzIGluIHRoaXMgZnVuY3Rpb24uCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlUGlwZWxpbmVVbmxvY2tlZChjb25zdCBQSVBFTElORV9TVEFURSAqcFBpcGVsaW5lLCB1aW50MzJfdCBwaXBlbGluZUluZGV4KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICAvLyBFbnN1cmUgdGhlIHN1YnBhc3MgaW5kZXggaXMgdmFsaWQuIElmIG5vdCwgdGhlbiBWYWxpZGF0ZUdyYXBoaWNzUGlwZWxpbmVTaGFkZXJTdGF0ZQorICAgIC8vIHByb2R1Y2VzIG5vbnNlbnNlIGVycm9ycyB0aGF0IGNvbmZ1c2UgdXNlcnMuIE90aGVyIGxheWVycyBzaG91bGQgYWxyZWFkeQorICAgIC8vIGVtaXQgZXJyb3JzIGZvciByZW5kZXJwYXNzIGJlaW5nIGludmFsaWQuCisgICAgYXV0byBzdWJwYXNzX2Rlc2MgPSAmcFBpcGVsaW5lLT5ycF9zdGF0ZS0+Y3JlYXRlSW5mby5wU3VicGFzc2VzW3BQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnN1YnBhc3NdOworICAgIGlmIChwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5zdWJwYXNzID49IHBQaXBlbGluZS0+cnBfc3RhdGUtPmNyZWF0ZUluZm8uc3VicGFzc0NvdW50KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAwNzU5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IFN1YnBhc3MgaW5kZXggJXUgaXMgb3V0IG9mIHJhbmdlIGZvciB0aGlzIHJlbmRlcnBhc3MgKDAuLiV1KS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kuc3VicGFzcywgcFBpcGVsaW5lLT5ycF9zdGF0ZS0+Y3JlYXRlSW5mby5zdWJwYXNzQ291bnQgLSAxKTsKKyAgICAgICAgc3VicGFzc19kZXNjID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucENvbG9yQmxlbmRTdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gKmNvbG9yX2JsZW5kX3N0YXRlID0gcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucENvbG9yQmxlbmRTdGF0ZTsKKyAgICAgICAgaWYgKHN1YnBhc3NfZGVzYyAmJiBjb2xvcl9ibGVuZF9zdGF0ZS0+YXR0YWNobWVudENvdW50ICE9IHN1YnBhc3NfZGVzYy0+Y29sb3JBdHRhY2htZW50Q291bnQpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWF0dGFjaG1lbnRDb3VudC0wMDc0NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpOiAlcyBzdWJwYXNzICV1IGhhcyBjb2xvckF0dGFjaG1lbnRDb3VudCBvZiAldSB3aGljaCBkb2Vzbid0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaCB0aGUgcENvbG9yQmxlbmRTdGF0ZS0+YXR0YWNobWVudENvdW50IG9mICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBQaXBlbGluZS0+cnBfc3RhdGUtPnJlbmRlclBhc3MpLmNfc3RyKCksIHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnN1YnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXNzX2Rlc2MtPmNvbG9yQXR0YWNobWVudENvdW50LCBjb2xvcl9ibGVuZF9zdGF0ZS0+YXR0YWNobWVudENvdW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMuY29yZS5pbmRlcGVuZGVudEJsZW5kKSB7CisgICAgICAgICAgICBpZiAocFBpcGVsaW5lLT5hdHRhY2htZW50cy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgY29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUgKmNvbnN0IHBBdHRhY2htZW50cyA9ICZwUGlwZWxpbmUtPmF0dGFjaG1lbnRzWzBdOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgcFBpcGVsaW5lLT5hdHRhY2htZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvLyBRdW90aW5nIHRoZSBzcGVjOiAiSWYgW3RoZSBpbmRlcGVuZGVudCBibGVuZF0gZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgdGhlIFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlCisgICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmdzIGZvciBhbGwgY29sb3IgYXR0YWNobWVudHMgbXVzdCBiZSBpZGVudGljYWwuIiBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBjb250YWlucworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGF0dGFjaG1lbnQgc3RhdGUsIHNvIG1lbWNtcCBpcyBiZXN0IHN1aXRlZCBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChzdGF0aWNfY2FzdDxjb25zdCB2b2lkICo+KHBBdHRhY2htZW50cyksIHN0YXRpY19jYXN0PGNvbnN0IHZvaWQgKj4oJnBBdHRhY2htZW50c1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBBdHRhY2htZW50c1swXSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA2MDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm86IElmIGluZGVwZW5kZW50IGJsZW5kIGZlYXR1cmUgbm90IGVuYWJsZWQsIGFsbCBlbGVtZW50cyBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBBdHRhY2htZW50cyBtdXN0IGJlIGlkZW50aWNhbC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZW5hYmxlZF9mZWF0dXJlcy5jb3JlLmxvZ2ljT3AgJiYgKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBDb2xvckJsZW5kU3RhdGUtPmxvZ2ljT3BFbmFibGUgIT0gVktfRkFMU0UpKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tbG9naWNPcEVuYWJsZS0wMDYwNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaXBlbGluZSBDcmVhdGVJbmZvOiBJZiBsb2dpYyBvcGVyYXRpb25zIGZlYXR1cmUgbm90IGVuYWJsZWQsIGxvZ2ljT3BFbmFibGUgbXVzdCBiZSBWS19GQUxTRS4iKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBQaXBlbGluZS0+YXR0YWNobWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgocFBpcGVsaW5lLT5hdHRhY2htZW50c1tpXS5zcmNDb2xvckJsZW5kRmFjdG9yID09IFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0NPTE9SKSB8fAorICAgICAgICAgICAgICAgIChwUGlwZWxpbmUtPmF0dGFjaG1lbnRzW2ldLnNyY0NvbG9yQmxlbmRGYWN0b3IgPT0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0NPTE9SKSB8fAorICAgICAgICAgICAgICAgIChwUGlwZWxpbmUtPmF0dGFjaG1lbnRzW2ldLnNyY0NvbG9yQmxlbmRGYWN0b3IgPT0gVktfQkxFTkRfRkFDVE9SX1NSQzFfQUxQSEEpIHx8CisgICAgICAgICAgICAgICAgKHBQaXBlbGluZS0+YXR0YWNobWVudHNbaV0uc3JjQ29sb3JCbGVuZEZhY3RvciA9PSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQUxQSEEpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuZHVhbFNyY0JsZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtc3JjQ29sb3JCbGVuZEZhY3Rvci0wMDYwOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHBQaXBlbGluZXNbJWRdLnBDb2xvckJsZW5kU3RhdGUucEF0dGFjaG1lbnRzWyIgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0uc3JjQ29sb3JCbGVuZEZhY3RvciB1c2VzIGEgZHVhbC1zb3VyY2UgYmxlbmQgZmFjdG9yICglZCksIGJ1dCB0aGlzIGRldmljZSBmZWF0dXJlIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lSW5kZXgsIGksIHBQaXBlbGluZS0+YXR0YWNobWVudHNbaV0uc3JjQ29sb3JCbGVuZEZhY3Rvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwUGlwZWxpbmUtPmF0dGFjaG1lbnRzW2ldLmRzdENvbG9yQmxlbmRGYWN0b3IgPT0gVktfQkxFTkRfRkFDVE9SX1NSQzFfQ09MT1IpIHx8CisgICAgICAgICAgICAgICAgKHBQaXBlbGluZS0+YXR0YWNobWVudHNbaV0uZHN0Q29sb3JCbGVuZEZhY3RvciA9PSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQ09MT1IpIHx8CisgICAgICAgICAgICAgICAgKHBQaXBlbGluZS0+YXR0YWNobWVudHNbaV0uZHN0Q29sb3JCbGVuZEZhY3RvciA9PSBWS19CTEVORF9GQUNUT1JfU1JDMV9BTFBIQSkgfHwKKyAgICAgICAgICAgICAgICAocFBpcGVsaW5lLT5hdHRhY2htZW50c1tpXS5kc3RDb2xvckJsZW5kRmFjdG9yID09IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9BTFBIQSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMuY29yZS5kdWFsU3JjQmxlbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1kc3RDb2xvckJsZW5kRmFjdG9yLTAwNjA5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogcFBpcGVsaW5lc1slZF0ucENvbG9yQmxlbmRTdGF0ZS5wQXR0YWNobWVudHNbIiBQUklOVEZfU0laRV9UX1NQRUNJRklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXS5kc3RDb2xvckJsZW5kRmFjdG9yIHVzZXMgYSBkdWFsLXNvdXJjZSBibGVuZCBmYWN0b3IgKCVkKSwgYnV0IHRoaXMgZGV2aWNlIGZlYXR1cmUgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVJbmRleCwgaSwgcFBpcGVsaW5lLT5hdHRhY2htZW50c1tpXS5kc3RDb2xvckJsZW5kRmFjdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHBQaXBlbGluZS0+YXR0YWNobWVudHNbaV0uc3JjQWxwaGFCbGVuZEZhY3RvciA9PSBWS19CTEVORF9GQUNUT1JfU1JDMV9DT0xPUikgfHwKKyAgICAgICAgICAgICAgICAocFBpcGVsaW5lLT5hdHRhY2htZW50c1tpXS5zcmNBbHBoYUJsZW5kRmFjdG9yID09IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9DT0xPUikgfHwKKyAgICAgICAgICAgICAgICAocFBpcGVsaW5lLT5hdHRhY2htZW50c1tpXS5zcmNBbHBoYUJsZW5kRmFjdG9yID09IFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0FMUEhBKSB8fAorICAgICAgICAgICAgICAgIChwUGlwZWxpbmUtPmF0dGFjaG1lbnRzW2ldLnNyY0FscGhhQmxlbmRGYWN0b3IgPT0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0FMUEhBKSkgeworICAgICAgICAgICAgICAgIGlmICghZW5hYmxlZF9mZWF0dXJlcy5jb3JlLmR1YWxTcmNCbGVuZCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLXNyY0FscGhhQmxlbmRGYWN0b3ItMDA2MTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpOiBwUGlwZWxpbmVzWyVkXS5wQ29sb3JCbGVuZFN0YXRlLnBBdHRhY2htZW50c1siIFBSSU5URl9TSVpFX1RfU1BFQ0lGSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdLnNyY0FscGhhQmxlbmRGYWN0b3IgdXNlcyBhIGR1YWwtc291cmNlIGJsZW5kIGZhY3RvciAoJWQpLCBidXQgdGhpcyBkZXZpY2UgZmVhdHVyZSBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUluZGV4LCBpLCBwUGlwZWxpbmUtPmF0dGFjaG1lbnRzW2ldLnNyY0FscGhhQmxlbmRGYWN0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocFBpcGVsaW5lLT5hdHRhY2htZW50c1tpXS5kc3RBbHBoYUJsZW5kRmFjdG9yID09IFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0NPTE9SKSB8fAorICAgICAgICAgICAgICAgIChwUGlwZWxpbmUtPmF0dGFjaG1lbnRzW2ldLmRzdEFscGhhQmxlbmRGYWN0b3IgPT0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0NPTE9SKSB8fAorICAgICAgICAgICAgICAgIChwUGlwZWxpbmUtPmF0dGFjaG1lbnRzW2ldLmRzdEFscGhhQmxlbmRGYWN0b3IgPT0gVktfQkxFTkRfRkFDVE9SX1NSQzFfQUxQSEEpIHx8CisgICAgICAgICAgICAgICAgKHBQaXBlbGluZS0+YXR0YWNobWVudHNbaV0uZHN0QWxwaGFCbGVuZEZhY3RvciA9PSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQUxQSEEpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuZHVhbFNyY0JsZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtZHN0QWxwaGFCbGVuZEZhY3Rvci0wMDYxMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHBQaXBlbGluZXNbJWRdLnBDb2xvckJsZW5kU3RhdGUucEF0dGFjaG1lbnRzWyIgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0uZHN0QWxwaGFCbGVuZEZhY3RvciB1c2VzIGEgZHVhbC1zb3VyY2UgYmxlbmQgZmFjdG9yICglZCksIGJ1dCB0aGlzIGRldmljZSBmZWF0dXJlIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lSW5kZXgsIGksIHBQaXBlbGluZS0+YXR0YWNobWVudHNbaV0uZHN0QWxwaGFCbGVuZEZhY3Rvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKFZhbGlkYXRlR3JhcGhpY3NQaXBlbGluZVNoYWRlclN0YXRlKHBQaXBlbGluZSkpIHsKKyAgICAgICAgc2tpcCA9IHRydWU7CisgICAgfQorICAgIC8vIEVhY2ggc2hhZGVyJ3Mgc3RhZ2UgbXVzdCBiZSB1bmlxdWUKKyAgICBpZiAocFBpcGVsaW5lLT5kdXBsaWNhdGVfc2hhZGVycykgeworICAgICAgICBmb3IgKHVpbnQzMl90IHN0YWdlID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ7IHN0YWdlICYgVktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDUzsgc3RhZ2UgPDw9IDEpIHsKKyAgICAgICAgICAgIGlmIChwUGlwZWxpbmUtPmR1cGxpY2F0ZV9zaGFkZXJzICYgc3RhZ2UpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFBpcGVsaW5lQ3JlYXRlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IE11bHRpcGxlIHNoYWRlcnMgcHJvdmlkZWQgZm9yIHN0YWdlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFnQml0cyhWa1NoYWRlclN0YWdlRmxhZ0JpdHMoc3RhZ2UpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX252X21lc2hfc2hhZGVyKSB7CisgICAgICAgIC8vIFZTIG9yIG1lc2ggaXMgcmVxdWlyZWQKKyAgICAgICAgaWYgKCEocFBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyAmIChWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCB8IFZLX1NIQURFUl9TVEFHRV9NRVNIX0JJVF9OVikpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0YWdlLTAyMDk2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaXBlbGluZSBDcmVhdGVJbmZvIFN0YXRlOiBWZXJ0ZXggU2hhZGVyIG9yIE1lc2ggU2hhZGVyIHJlcXVpcmVkLiIpOworICAgICAgICB9CisgICAgICAgIC8vIENhbid0IG1peCBtZXNoIGFuZCBWVEcKKyAgICAgICAgaWYgKChwUGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgKFZLX1NIQURFUl9TVEFHRV9NRVNIX0JJVF9OViB8IFZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OVikpICYmCisgICAgICAgICAgICAocFBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyAmCisgICAgICAgICAgICAgKFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUIHwgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCB8IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQgfAorICAgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUKSkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjA5NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogR2VvbWV0cmljIHNoYWRlciBzdGFnZXMgbXVzdCBlaXRoZXIgYmUgYWxsIG1lc2ggKG1lc2ggfCB0YXNrKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGFsbCBWVEcgKHZlcnRleCwgdGVzcyBjb250cm9sLCB0ZXNzIGV2YWwsIGdlb20pLiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVlMgaXMgcmVxdWlyZWQKKyAgICAgICAgaWYgKCEocFBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyAmIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMDcyNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVmVydGV4IFNoYWRlciByZXF1aXJlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZW5hYmxlZF9mZWF0dXJlcy5tZXNoX3NoYWRlci5tZXNoU2hhZGVyICYmIChwUGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDIwOTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogTWVzaCBTaGFkZXIgbm90IHN1cHBvcnRlZC4iKTsKKyAgICB9CisKKyAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMubWVzaF9zaGFkZXIudGFza1NoYWRlciAmJiAocFBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyAmIFZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OVikpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyMDkyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IFRhc2sgU2hhZGVyIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorCisgICAgLy8gRWl0aGVyIGJvdGggb3IgbmVpdGhlciBUQy9URSBzaGFkZXJzIHNob3VsZCBiZSBkZWZpbmVkCisgICAgYm9vbCBoYXNfY29udHJvbCA9IChwUGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCkgIT0gMDsKKyAgICBib29sIGhhc19ldmFsID0gKHBQaXBlbGluZS0+YWN0aXZlX3NoYWRlcnMgJiBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUKSAhPSAwOworICAgIGlmIChoYXNfY29udHJvbCAmJiAhaGFzX2V2YWwpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVEUgYW5kIFRDIHNoYWRlcnMgbXVzdCBiZSBpbmNsdWRlZCBvciBleGNsdWRlZCBhcyBhIHBhaXIuIik7CisgICAgfQorICAgIGlmICghaGFzX2NvbnRyb2wgJiYgaGFzX2V2YWwpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVEUgYW5kIFRDIHNoYWRlcnMgbXVzdCBiZSBpbmNsdWRlZCBvciBleGNsdWRlZCBhcyBhIHBhaXIuIik7CisgICAgfQorICAgIC8vIENvbXB1dGUgc2hhZGVycyBzaG91bGQgYmUgc3BlY2lmaWVkIGluZGVwZW5kZW50IG9mIEdmeCBzaGFkZXJzCisgICAgaWYgKHBQaXBlbGluZS0+YWN0aXZlX3NoYWRlcnMgJiBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0YWdlLTAwNzI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IERvIG5vdCBzcGVjaWZ5IENvbXB1dGUgU2hhZGVyIGZvciBHZnggUGlwZWxpbmUuIik7CisgICAgfQorCisgICAgaWYgKChwUGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQpICYmICFwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wSW5wdXRBc3NlbWJseVN0YXRlKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAyMDk4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IE1pc3NpbmcgcElucHV0QXNzZW1ibHlTdGF0ZS4iKTsKKyAgICB9CisKKyAgICAvLyBWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVCBwcmltaXRpdmUgdG9wb2xvZ3kgaXMgb25seSB2YWxpZCBmb3IgdGVzc2VsbGF0aW9uIHBpcGVsaW5lcy4KKyAgICAvLyBNaXNtYXRjaGluZyBwcmltaXRpdmUgdG9wb2xvZ3kgYW5kIHRlc3NlbGxhdGlvbiBmYWlscyBncmFwaGljcyBwaXBlbGluZSBjcmVhdGlvbi4KKyAgICBpZiAoaGFzX2NvbnRyb2wgJiYgaGFzX2V2YWwgJiYKKyAgICAgICAgKCFwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wSW5wdXRBc3NlbWJseVN0YXRlIHx8CisgICAgICAgICBwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wSW5wdXRBc3NlbWJseVN0YXRlLT50b3BvbG9neSAhPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QgbXVzdCBiZSBzZXQgYXMgSUEgdG9wb2xvZ3kgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXNzZWxsYXRpb24gcGlwZWxpbmVzLiIpOworICAgIH0KKyAgICBpZiAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZSkgeworICAgICAgICBpZiAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+dG9wb2xvZ3kgPT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QpIHsKKyAgICAgICAgICAgIGlmICghaGFzX2NvbnRyb2wgfHwgIWhhc19ldmFsKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby10b3BvbG9neS0wMDczNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QgcHJpbWl0aXZlIHRvcG9sb2d5IGlzIG9ubHkgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGVzc2VsbGF0aW9uIHBpcGVsaW5lcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+cHJpbWl0aXZlUmVzdGFydEVuYWJsZSA9PSBWS19UUlVFKSAmJgorICAgICAgICAgICAgKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnRvcG9sb2d5ID09IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUIHx8CisgICAgICAgICAgICAgcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+dG9wb2xvZ3kgPT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVCB8fAorICAgICAgICAgICAgIHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnRvcG9sb2d5ID09IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUIHx8CisgICAgICAgICAgICAgcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+dG9wb2xvZ3kgPT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVF9XSVRIX0FESkFDRU5DWSB8fAorICAgICAgICAgICAgIHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnRvcG9sb2d5ID09IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZIHx8CisgICAgICAgICAgICAgcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+dG9wb2xvZ3kgPT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQyOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvcG9sb2d5IGlzICVzIGFuZCBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlIGlzIFZLX1RSVUUuIEl0IGlzIGludmFsaWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtQcmltaXRpdmVUb3BvbG9neShwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wSW5wdXRBc3NlbWJseVN0YXRlLT50b3BvbG9neSkpOworICAgICAgICB9CisgICAgICAgIGlmICgoZW5hYmxlZF9mZWF0dXJlcy5jb3JlLmdlb21ldHJ5U2hhZGVyID09IFZLX0ZBTFNFKSAmJgorICAgICAgICAgICAgKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnRvcG9sb2d5ID09IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX0xJU1RfV0lUSF9BREpBQ0VOQ1kgfHwKKyAgICAgICAgICAgICBwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wSW5wdXRBc3NlbWJseVN0YXRlLT50b3BvbG9neSA9PSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUF9XSVRIX0FESkFDRU5DWSB8fAorICAgICAgICAgICAgIHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnRvcG9sb2d5ID09IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZIHx8CisgICAgICAgICAgICAgcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+dG9wb2xvZ3kgPT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQX1dJVEhfQURKQUNFTkNZKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA0MjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3BvbG9neSBpcyAlcyBhbmQgZ2VvbWV0cnkgc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLiBJdCBpcyBpbnZhbGlkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrUHJpbWl0aXZlVG9wb2xvZ3kocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+dG9wb2xvZ3kpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGVuYWJsZWRfZmVhdHVyZXMuY29yZS50ZXNzZWxsYXRpb25TaGFkZXIgPT0gVktfRkFMU0UpICYmCisgICAgICAgICAgICAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+dG9wb2xvZ3kgPT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQzMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvcG9sb2d5IGlzICVzIGFuZCB0ZXNzZWxsYXRpb24gc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLiBJdCBpcyBpbnZhbGlkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrUHJpbWl0aXZlVG9wb2xvZ3kocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZS0+dG9wb2xvZ3kpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIGEgcmFzdGVyaXphdGlvbiBzdGF0ZSBpcyBwcm92aWRlZC4uLgorICAgIGlmIChwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wUmFzdGVyaXphdGlvblN0YXRlKSB7CisgICAgICAgIGlmICgocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucFJhc3Rlcml6YXRpb25TdGF0ZS0+ZGVwdGhDbGFtcEVuYWJsZSA9PSBWS19UUlVFKSAmJgorICAgICAgICAgICAgKCFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuZGVwdGhDbGFtcCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLWRlcHRoQ2xhbXBFbmFibGUtMDA3ODIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHRoZSBkZXB0aENsYW1wIGRldmljZSBmZWF0dXJlIGlzIGRpc2FibGVkOiB0aGUgZGVwdGhDbGFtcEVuYWJsZSBtZW1iZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiB0aGUgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIG11c3QgYmUgc2V0IHRvIFZLX0ZBTFNFLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFJc0R5bmFtaWMocFBpcGVsaW5lLCBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JJQVMpICYmCisgICAgICAgICAgICAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucFJhc3Rlcml6YXRpb25TdGF0ZS0+ZGVwdGhCaWFzQ2xhbXAgIT0gMC4wKSAmJiAoIWVuYWJsZWRfZmVhdHVyZXMuY29yZS5kZXB0aEJpYXNDbGFtcCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRGZWF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHRoZSBkZXB0aEJpYXNDbGFtcCBkZXZpY2UgZmVhdHVyZSBpcyBkaXNhYmxlZDogdGhlIGRlcHRoQmlhc0NsYW1wIG1lbWJlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgbXVzdCBiZSBzZXQgdG8gMC4wIHVubGVzcyB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JJQVMgZHluYW1pYyBzdGF0ZSBpcyBlbmFibGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiByYXN0ZXJpemF0aW9uIGlzIGVuYWJsZWQuLi4KKyAgICAgICAgaWYgKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID09IFZLX0ZBTFNFKSB7CisgICAgICAgICAgICBpZiAoKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBNdWx0aXNhbXBsZVN0YXRlLT5hbHBoYVRvT25lRW5hYmxlID09IFZLX1RSVUUpICYmCisgICAgICAgICAgICAgICAgKCFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuYWxwaGFUb09uZSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLWFscGhhVG9PbmVFbmFibGUtMDA3ODUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpOiB0aGUgYWxwaGFUb09uZSBkZXZpY2UgZmVhdHVyZSBpcyBkaXNhYmxlZDogdGhlIGFscGhhVG9PbmVFbmFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVtYmVyIG9mIHRoZSBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIG11c3QgYmUgc2V0IHRvIFZLX0ZBTFNFLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBzdWJwYXNzIHVzZXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHBEZXB0aFN0ZW5jaWxTdGF0ZSBtdXN0IGJlIGEgcG9pbnRlciB0byBhIHZhbGlkIHN0cnVjdHVyZQorICAgICAgICAgICAgaWYgKHN1YnBhc3NfZGVzYyAmJiBzdWJwYXNzX2Rlc2MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ICYmCisgICAgICAgICAgICAgICAgc3VicGFzc19kZXNjLT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgIGlmICghcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucERlcHRoU3RlbmNpbFN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZS0wMDc1MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaXBlbGluZSBDcmVhdGVJbmZvIFN0YXRlOiBwRGVwdGhTdGVuY2lsU3RhdGUgaXMgTlVMTCB3aGVuIHJhc3Rlcml6YXRpb24gaXMgZW5hYmxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHN1YnBhc3MgdXNlcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudC4iKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+ZGVwdGhCb3VuZHNUZXN0RW5hYmxlID09IFZLX1RSVUUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWVuYWJsZWRfZmVhdHVyZXMuY29yZS5kZXB0aEJvdW5kcykpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWRlcHRoQm91bmRzVGVzdEVuYWJsZS0wMDU5OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHRoZSBkZXB0aEJvdW5kcyBkZXZpY2UgZmVhdHVyZSBpcyBkaXNhYmxlZDogdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcHRoQm91bmRzVGVzdEVuYWJsZSBtZW1iZXIgb2YgdGhlIFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IHRvIFZLX0ZBTFNFLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgc3VicGFzcyB1c2VzIGNvbG9yIGF0dGFjaG1lbnRzLCBwQ29sb3JCbGVuZFN0YXRlIG11c3QgYmUgdmFsaWQgcG9pbnRlcgorICAgICAgICAgICAgaWYgKHN1YnBhc3NfZGVzYykgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yX2F0dGFjaG1lbnRfY291bnQgPSAwOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJwYXNzX2Rlc2MtPmNvbG9yQXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3NfZGVzYy0+cENvbG9yQXR0YWNobWVudHNbaV0uYXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytjb2xvcl9hdHRhY2htZW50X2NvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb2xvcl9hdHRhY2htZW50X2NvdW50ID4gMCAmJiBwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wQ29sb3JCbGVuZFN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlLTAwNzUzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IHBDb2xvckJsZW5kU3RhdGUgaXMgTlVMTCB3aGVuIHJhc3Rlcml6YXRpb24gaXMgZW5hYmxlZCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YnBhc3MgdXNlcyBjb2xvciBhdHRhY2htZW50cy4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHBQaXBlbGluZS0+YWN0aXZlX3NoYWRlcnMgJiBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCkgJiYgIXBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBWZXJ0ZXhJbnB1dFN0YXRlKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAyMDk3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IE1pc3NpbmcgcFZlcnRleElucHV0U3RhdGUuIik7CisgICAgfQorCisgICAgYXV0byB2aSA9IHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBWZXJ0ZXhJbnB1dFN0YXRlOworICAgIGlmICh2aSAhPSBOVUxMKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCB2aS0+dmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudDsgaisrKSB7CisgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQgPSB2aS0+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uc1tqXS5mb3JtYXQ7CisgICAgICAgICAgICAvLyBJbnRlcm5hbCBjYWxsIHRvIGdldCBmb3JtYXQgaW5mby4gIFN0aWxsIGdvZXMgdGhyb3VnaCBsYXllcnMsIGNvdWxkIHBvdGVudGlhbGx5IGdvIGRpcmVjdGx5IHRvIElDRC4KKyAgICAgICAgICAgIFZrRm9ybWF0UHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgICAgICAgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMocGh5c2ljYWxfZGV2aWNlLCBmb3JtYXQsICZwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIGlmICgocHJvcGVydGllcy5idWZmZXJGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1ZFUlRFWF9CVUZGRVJfQklUKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uLWZvcm1hdC0wMDYyMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBDcmVhdGVJbmZvWyVkXS5wVmVydGV4SW5wdXRTdGF0ZS0+dmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zWyVkXS5mb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJXMpIGlzIG5vdCBhIHN1cHBvcnRlZCB2ZXJ0ZXggYnVmZmVyIGZvcm1hdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lSW5kZXgsIGosIHN0cmluZ19Wa0Zvcm1hdChmb3JtYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdWJwYXNzX2Rlc2MgJiYgcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucE11bHRpc2FtcGxlU3RhdGUpIHsKKyAgICAgICAgYXV0byBhY2N1bUNvbG9yU2FtcGxlcyA9IFtzdWJwYXNzX2Rlc2MsIHBQaXBlbGluZV0odWludDMyX3QgJnNhbXBsZXMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJwYXNzX2Rlc2MtPmNvbG9yQXR0YWNobWVudENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIGF0dGFjaG1lbnQgPSBzdWJwYXNzX2Rlc2MtPnBDb2xvckF0dGFjaG1lbnRzW2ldLmF0dGFjaG1lbnQ7CisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyB8PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocFBpcGVsaW5lLT5ycF9zdGF0ZS0+Y3JlYXRlSW5mby5wQXR0YWNobWVudHNbYXR0YWNobWVudF0uc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGlmICghKGRldmljZV9leHRlbnNpb25zLnZrX2FtZF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMgfHwgZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlcykpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJhc3Rlcl9zYW1wbGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEdldE51bVNhbXBsZXMocFBpcGVsaW5lKSk7CisgICAgICAgICAgICB1aW50MzJfdCBzdWJwYXNzX251bV9zYW1wbGVzID0gMDsKKworICAgICAgICAgICAgYWNjdW1Db2xvclNhbXBsZXMoc3VicGFzc19udW1fc2FtcGxlcyk7CisKKyAgICAgICAgICAgIGlmIChzdWJwYXNzX2Rlc2MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ICYmCisgICAgICAgICAgICAgICAgc3VicGFzc19kZXNjLT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gYXR0YWNobWVudCA9IHN1YnBhc3NfZGVzYy0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQ7CisgICAgICAgICAgICAgICAgc3VicGFzc19udW1fc2FtcGxlcyB8PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocFBpcGVsaW5lLT5ycF9zdGF0ZS0+Y3JlYXRlSW5mby5wQXR0YWNobWVudHNbYXR0YWNobWVudF0uc2FtcGxlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHN1YnBhc3NfbnVtX3NhbXBsZXMgaXMgMCB3aGVuIHRoZSBzdWJwYXNzIGhhcyBubyBhdHRhY2htZW50cyBvciBpZiBhbGwgYXR0YWNobWVudHMgYXJlIFZLX0FUVEFDSE1FTlRfVU5VU0VELgorICAgICAgICAgICAgLy8gT25seSB2YWxpZGF0ZSB0aGUgdmFsdWUgb2Ygc3VicGFzc19udW1fc2FtcGxlcyBpZiB0aGUgc3VicGFzcyBoYXMgYXR0YWNobWVudHMgdGhhdCBhcmUgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELgorICAgICAgICAgICAgaWYgKHN1YnBhc3NfbnVtX3NhbXBsZXMgJiYgKCFJc1Bvd2VyT2ZUd28oc3VicGFzc19udW1fc2FtcGxlcykgfHwgKHN1YnBhc3NfbnVtX3NhbXBsZXMgIT0gcmFzdGVyX3NhbXBsZXMpKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDA3NTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcENyZWF0ZUluZm9bJWRdLnBNdWx0aXNhbXBsZVN0YXRlLT5yYXN0ZXJpemF0aW9uU2FtcGxlcyAoJXUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgUmVuZGVyUGFzcyBjb2xvciBhbmQvb3IgZGVwdGggYXR0YWNobWVudC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUluZGV4LCByYXN0ZXJfc2FtcGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfYW1kX21peGVkX2F0dGFjaG1lbnRfc2FtcGxlcykgeworICAgICAgICAgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIG1heF9zYW1wbGVfY291bnQgPSBzdGF0aWNfY2FzdDxWa1NhbXBsZUNvdW50RmxhZ0JpdHM+KDApOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1YnBhc3NfZGVzYy0+Y29sb3JBdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChzdWJwYXNzX2Rlc2MtPnBDb2xvckF0dGFjaG1lbnRzW2ldLmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X3NhbXBsZV9jb3VudCA9IHN0ZDo6bWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3NhbXBsZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZS0+cnBfc3RhdGUtPmNyZWF0ZUluZm8ucEF0dGFjaG1lbnRzW3N1YnBhc3NfZGVzYy0+cENvbG9yQXR0YWNobWVudHNbaV0uYXR0YWNobWVudF0uc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1YnBhc3NfZGVzYy0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgJiYKKyAgICAgICAgICAgICAgICBzdWJwYXNzX2Rlc2MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgbWF4X3NhbXBsZV9jb3VudCA9IHN0ZDo6bWF4KAorICAgICAgICAgICAgICAgICAgICBtYXhfc2FtcGxlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmUtPnJwX3N0YXRlLT5jcmVhdGVJbmZvLnBBdHRhY2htZW50c1tzdWJwYXNzX2Rlc2MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50XS5zYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucFJhc3Rlcml6YXRpb25TdGF0ZS0+cmFzdGVyaXplckRpc2NhcmRFbmFibGUgPT0gVktfRkFMU0UpICYmCisgICAgICAgICAgICAgICAgKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBNdWx0aXNhbXBsZVN0YXRlLT5yYXN0ZXJpemF0aW9uU2FtcGxlcyAhPSBtYXhfc2FtcGxlX2NvdW50KSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDE1MDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcENyZWF0ZUluZm9bJWRdLnBNdWx0aXNhbXBsZVN0YXRlLT5yYXN0ZXJpemF0aW9uU2FtcGxlcyAoJXMpICE9IG1heCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRhY2htZW50IHNhbXBsZXMgKCVzKSB1c2VkIGluIHN1YnBhc3MgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wTXVsdGlzYW1wbGVTdGF0ZS0+cmFzdGVyaXphdGlvblNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtTYW1wbGVDb3VudEZsYWdCaXRzKG1heF9zYW1wbGVfY291bnQpLCBwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5zdWJwYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzKSB7CisgICAgICAgICAgICB1aW50MzJfdCByYXN0ZXJfc2FtcGxlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihHZXROdW1TYW1wbGVzKHBQaXBlbGluZSkpOworICAgICAgICAgICAgdWludDMyX3Qgc3VicGFzc19jb2xvcl9zYW1wbGVzID0gMDsKKworICAgICAgICAgICAgYWNjdW1Db2xvclNhbXBsZXMoc3VicGFzc19jb2xvcl9zYW1wbGVzKTsKKworICAgICAgICAgICAgaWYgKHN1YnBhc3NfZGVzYy0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgJiYKKyAgICAgICAgICAgICAgICBzdWJwYXNzX2Rlc2MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBhdHRhY2htZW50ID0gc3VicGFzc19kZXNjLT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudDsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzdWJwYXNzX2RlcHRoX3NhbXBsZXMgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocFBpcGVsaW5lLT5ycF9zdGF0ZS0+Y3JlYXRlSW5mby5wQXR0YWNobWVudHNbYXR0YWNobWVudF0uc2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBpZiAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucERlcHRoU3RlbmNpbFN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZHNfdGVzdF9lbmFibGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wRGVwdGhTdGVuY2lsU3RhdGUtPmRlcHRoVGVzdEVuYWJsZSA9PSBWS19UUlVFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHBQaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+ZGVwdGhCb3VuZHNUZXN0RW5hYmxlID09IFZLX1RSVUUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucERlcHRoU3RlbmNpbFN0YXRlLT5zdGVuY2lsVGVzdEVuYWJsZSA9PSBWS19UUlVFKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZHNfdGVzdF9lbmFibGVkICYmICghSXNQb3dlck9mVHdvKHN1YnBhc3NfZGVwdGhfc2FtcGxlcykgfHwgKHJhc3Rlcl9zYW1wbGVzICE9IHN1YnBhc3NfZGVwdGhfc2FtcGxlcykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDE0MTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb1slZF0ucE11bHRpc2FtcGxlU3RhdGUtPnJhc3Rlcml6YXRpb25TYW1wbGVzICgldSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIFJlbmRlclBhc3MgZGVwdGggYXR0YWNobWVudCAoJXUpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVJbmRleCwgcmFzdGVyX3NhbXBsZXMsIHN1YnBhc3NfZGVwdGhfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChJc1Bvd2VyT2ZUd28oc3VicGFzc19jb2xvcl9zYW1wbGVzKSkgeworICAgICAgICAgICAgICAgIGlmIChyYXN0ZXJfc2FtcGxlcyA8IHN1YnBhc3NfY29sb3Jfc2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMTQxMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcENyZWF0ZUluZm9bJWRdLnBNdWx0aXNhbXBsZVN0YXRlLT5yYXN0ZXJpemF0aW9uU2FtcGxlcyAoJXUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIFJlbmRlclBhc3MgY29sb3IgYXR0YWNobWVudCAoJXUpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUluZGV4LCByYXN0ZXJfc2FtcGxlcywgc3VicGFzc19jb2xvcl9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucE11bHRpc2FtcGxlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyYXN0ZXJfc2FtcGxlcyA+IHN1YnBhc3NfY29sb3Jfc2FtcGxlcykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwUGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wTXVsdGlzYW1wbGVTdGF0ZS0+c2FtcGxlU2hhZGluZ0VuYWJsZSA9PSBWS19UUlVFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1yYXN0ZXJpemF0aW9uU2FtcGxlcy0wMTQxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcENyZWF0ZUluZm9bJWRdLnBNdWx0aXNhbXBsZVN0YXRlLT5zYW1wbGVTaGFkaW5nRW5hYmxlIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0ZBTFNFIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvWyVkXS5wTXVsdGlzYW1wbGVTdGF0ZS0+cmFzdGVyaXphdGlvblNhbXBsZXMgKCV1KSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlcyBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YnBhc3MgY29sb3IgYXR0YWNobWVudCAoJXUpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUluZGV4LCBwaXBlbGluZUluZGV4LCByYXN0ZXJfc2FtcGxlcywgc3VicGFzc19jb2xvcl9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gKmNvdmVyYWdlX21vZHVsYXRpb25fc3RhdGUgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlY+KAorICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucE11bHRpc2FtcGxlU3RhdGUtPnBOZXh0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY292ZXJhZ2VfbW9kdWxhdGlvbl9zdGF0ZSAmJiAoY292ZXJhZ2VfbW9kdWxhdGlvbl9zdGF0ZS0+Y292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGUgPT0gVktfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3ZlcmFnZV9tb2R1bGF0aW9uX3N0YXRlLT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50ICE9IChyYXN0ZXJfc2FtcGxlcyAvIHN1YnBhc3NfY29sb3Jfc2FtcGxlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVi1jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZS0wMTQwNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBDcmVhdGVJbmZvc1slZF0gVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCBvZiAldSBpcyBpbnZhbGlkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVJbmRleCwgY292ZXJhZ2VfbW9kdWxhdGlvbl9zdGF0ZS0+Y292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfZnJhZ21lbnRfY292ZXJhZ2VfdG9fY29sb3IpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gY292ZXJhZ2VfdG9fY29sb3Jfc3RhdGUgPQorICAgICAgICAgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVj4ocFBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kucE11bHRpc2FtcGxlU3RhdGUpOworCisgICAgICAgICAgICBpZiAoY292ZXJhZ2VfdG9fY29sb3Jfc3RhdGUgJiYgY292ZXJhZ2VfdG9fY29sb3Jfc3RhdGUtPmNvdmVyYWdlVG9Db2xvckVuYWJsZSA9PSBWS19UUlVFKSB7CisgICAgICAgICAgICAgICAgYm9vbCBhdHRhY2htZW50X2lzX3ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfZGV0YWlsOworCisgICAgICAgICAgICAgICAgaWYgKGNvdmVyYWdlX3RvX2NvbG9yX3N0YXRlLT5jb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbiA8IHN1YnBhc3NfZGVzYy0+Y29sb3JBdHRhY2htZW50Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBjb2xvcl9hdHRhY2htZW50X3JlZiA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXNzX2Rlc2MtPnBDb2xvckF0dGFjaG1lbnRzW2NvdmVyYWdlX3RvX2NvbG9yX3N0YXRlLT5jb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbl07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvcl9hdHRhY2htZW50X3JlZi5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIGNvbG9yX2F0dGFjaG1lbnQgPSBwUGlwZWxpbmUtPnJwX3N0YXRlLT5jcmVhdGVJbmZvLnBBdHRhY2htZW50c1tjb2xvcl9hdHRhY2htZW50X3JlZi5hdHRhY2htZW50XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2xvcl9hdHRhY2htZW50LmZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfRk9STUFUX1I4X1VJTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhfU0lOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfVUlOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfU0lOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJfVUlOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJfU0lOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9pc192YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19zcHJpbnRmKCZlcnJvcl9kZXRhaWwsICJyZWZlcmVuY2VzIGFuIGF0dGFjaG1lbnQgd2l0aCBhbiBpbnZhbGlkIGZvcm1hdCAoJXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0Zvcm1hdChjb2xvcl9hdHRhY2htZW50LmZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19zcHJpbnRmKCZlcnJvcl9kZXRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlcyBhbiBpbnZhbGlkIGF0dGFjaG1lbnQuIFRoZSBzdWJwYXNzIHBDb2xvckF0dGFjaG1lbnRzWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0uYXR0YWNobWVudCBoYXMgdGhlIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19BVFRBQ0hNRU5UX1VOVVNFRC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VfdG9fY29sb3Jfc3RhdGUtPmNvdmVyYWdlVG9Db2xvckxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ19zcHJpbnRmKCZlcnJvcl9kZXRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2VzIGFuIG5vbi1leGlzdGluZyBhdHRhY2htZW50IHNpbmNlIHRoZSBzdWJwYXNzIGNvbG9yQXR0YWNobWVudENvdW50IGlzICUiIFBSSXUzMiAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhc3NfZGVzYy0+Y29sb3JBdHRhY2htZW50Q291bnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYXR0YWNobWVudF9pc192YWxpZCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYtY292ZXJhZ2VUb0NvbG9yRW5hYmxlLTAxNDA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb3NbJSIgUFJJZDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXS5wTXVsdGlzYW1wbGVTdGF0ZSBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdmVyYWdlVG9Db2xvckxvY2F0aW9uID0gJSIgUFJJdTMyICIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVJbmRleCwgY292ZXJhZ2VfdG9fY29sb3Jfc3RhdGUtPmNvdmVyYWdlVG9Db2xvckxvY2F0aW9uLCBlcnJvcl9kZXRhaWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIEJsb2NrIG9mIGNvZGUgYXQgc3RhcnQgaGVyZSBzcGVjaWZpY2FsbHkgZm9yIG1hbmFnaW5nL3RyYWNraW5nIERTcworCisvLyBWYWxpZGF0ZSB0aGF0IGdpdmVuIHNldCBpcyB2YWxpZCBhbmQgdGhhdCBpdCdzIG5vdCBiZWluZyB1c2VkIGJ5IGFuIGluLWZsaWdodCBDbWRCdWZmZXIKKy8vIGZ1bmNfc3RyIGlzIHRoZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCisvLyBSZXR1cm4gZmFsc2UgaWYgbm8gZXJyb3JzIG9jY3VyCisvLyBSZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW9uIGVycm9yIG9jY3VycyBhbmQgY2FsbGJhY2sgcmV0dXJucyB0cnVlICh0byBza2lwIHVwY29taW5nIEFQSSBjYWxsIGRvd24gdGhlIGNoYWluKQorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUlkbGVEZXNjcmlwdG9yU2V0KFZrRGVzY3JpcHRvclNldCBzZXQsIGNvbnN0IGNoYXIgKmZ1bmNfc3RyKSBjb25zdCB7CisgICAgaWYgKGRpc2FibGVkLmlkbGVfZGVzY3JpcHRvcl9zZXQpIHJldHVybiBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvIHNldF9ub2RlID0gc2V0TWFwLmZpbmQoc2V0KTsKKyAgICBpZiAoc2V0X25vZGUgPT0gc2V0TWFwLmVuZCgpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZXQpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9Eb3VibGVEZXN0cm95LAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsICVzKCkgb24gJXMgdGhhdCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkLiIsIGZ1bmNfc3RyLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNldCkuY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETyA6IFRoaXMgY292ZXJzIHZhcmlvdXMgZXJyb3IgY2FzZXMgc28gc2hvdWxkIHBhc3MgZXJyb3IgZW51bSBpbnRvIHRoaXMgZnVuY3Rpb24gYW5kIHVzZSBwYXNzZWQgaW4gZW51bSBoZXJlCisgICAgICAgIGlmIChzZXRfbm9kZS0+c2Vjb25kLT5pbl91c2UubG9hZCgpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNldCksICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy0wMDMwOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsICVzKCkgb24gJXMgdGhhdCBpcyBpbiB1c2UgYnkgYSBjb21tYW5kIGJ1ZmZlci4iLCBmdW5jX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNldCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIElmIGEgcmVuZGVycGFzcyBpcyBhY3RpdmUsIHZlcmlmeSB0aGF0IHRoZSBnaXZlbiBjb21tYW5kIHR5cGUgaXMgYXBwcm9wcmlhdGUgZm9yIGN1cnJlbnQgc3VicGFzcyBzdGF0ZQorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNtZFN1YnBhc3NTdGF0ZShjb25zdCBDTURfQlVGRkVSX1NUQVRFICpwQ0IsIGNvbnN0IENNRF9UWVBFIGNtZF90eXBlKSBjb25zdCB7CisgICAgaWYgKCFwQ0ItPmFjdGl2ZVJlbmRlclBhc3MpIHJldHVybiBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocENCLT5hY3RpdmVTdWJwYXNzQ29udGVudHMgPT0gVktfU1VCUEFTU19DT05URU5UU19TRUNPTkRBUllfQ09NTUFORF9CVUZGRVJTICYmCisgICAgICAgIChjbWRfdHlwZSAhPSBDTURfRVhFQ1VURUNPTU1BTkRTICYmIGNtZF90eXBlICE9IENNRF9ORVhUU1VCUEFTUyAmJiBjbWRfdHlwZSAhPSBDTURfRU5EUkVOREVSUEFTUyAmJgorICAgICAgICAgY21kX3R5cGUgIT0gQ01EX05FWFRTVUJQQVNTMktIUiAmJiBjbWRfdHlwZSAhPSBDTURfRU5EUkVOREVSUEFTUzJLSFIpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ0ItPmNvbW1hbmRCdWZmZXIpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkQ29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb21tYW5kcyBjYW5ub3QgYmUgY2FsbGVkIGluIGEgc3VicGFzcyB1c2luZyBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXJzLiIpOworICAgIH0gZWxzZSBpZiAocENCLT5hY3RpdmVTdWJwYXNzQ29udGVudHMgPT0gVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUgJiYgY21kX3R5cGUgPT0gQ01EX0VYRUNVVEVDT01NQU5EUykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENCLT5jb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZENvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRFeGVjdXRlQ29tbWFuZHMoKSBjYW5ub3QgYmUgY2FsbGVkIGluIGEgc3VicGFzcyB1c2luZyBpbmxpbmUgY29tbWFuZHMuIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ21kUXVldWVGbGFncyhjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlLCBjb25zdCBjaGFyICpjYWxsZXJfbmFtZSwgVmtRdWV1ZUZsYWdzIHJlcXVpcmVkX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JfY29kZSkgY29uc3QgeworICAgIGF1dG8gcG9vbCA9IGNiX25vZGUtPmNvbW1hbmRfcG9vbC5nZXQoKTsKKyAgICBpZiAocG9vbCkgeworICAgICAgICBWa1F1ZXVlRmxhZ3MgcXVldWVfZmxhZ3MgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKCktPnF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW3Bvb2wtPnF1ZXVlRmFtaWx5SW5kZXhdLnF1ZXVlRmxhZ3M7CisgICAgICAgIGlmICghKHJlcXVpcmVkX2ZsYWdzICYgcXVldWVfZmxhZ3MpKSB7CisgICAgICAgICAgICBzdHJpbmcgcmVxdWlyZWRfZmxhZ3Nfc3RyaW5nOworICAgICAgICAgICAgZm9yIChhdXRvIGZsYWcgOiB7VktfUVVFVUVfVFJBTlNGRVJfQklULCBWS19RVUVVRV9HUkFQSElDU19CSVQsIFZLX1FVRVVFX0NPTVBVVEVfQklUfSkgeworICAgICAgICAgICAgICAgIGlmIChmbGFnICYgcmVxdWlyZWRfZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkX2ZsYWdzX3N0cmluZy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX2ZsYWdzX3N0cmluZyArPSAiIG9yICI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfZmxhZ3Nfc3RyaW5nICs9IHN0cmluZ19Wa1F1ZXVlRmxhZ0JpdHMoZmxhZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlciksIGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNhbGwgJXMgb24gYSBjb21tYW5kIGJ1ZmZlciBhbGxvY2F0ZWQgZnJvbSBhIHBvb2wgd2l0aG91dCAlcyBjYXBhYmlsaXRpZXMuLiIsIGNhbGxlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfZmxhZ3Nfc3RyaW5nLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGNoYXIgY29uc3QgKkdldENhdXNlU3RyKFZ1bGthblR5cGVkSGFuZGxlIG9iaikgeworICAgIGlmIChvYmoudHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQpIHJldHVybiAiZGVzdHJveWVkIG9yIHVwZGF0ZWQiOworICAgIGlmIChvYmoudHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIpIHJldHVybiAiZGVzdHJveWVkIG9yIHJlcmVjb3JkZWQiOworICAgIHJldHVybiAiZGVzdHJveWVkIjsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpSZXBvcnRJbnZhbGlkQ29tbWFuZEJ1ZmZlcihjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgY29uc3QgY2hhciAqY2FsbF9zb3VyY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gb2JqIDogY2Jfc3RhdGUtPmJyb2tlbl9iaW5kaW5ncykgeworICAgICAgICBjb25zdCBjaGFyICpjYXVzZV9zdHIgPSBHZXRDYXVzZVN0cihvYmopOworICAgICAgICBzdHJpbmcgVlVJRDsKKyAgICAgICAgc3RyaW5nX3NwcmludGYoJlZVSUQsICIlcy0lcyIsIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRDb21tYW5kQnVmZmVyLCBvYmplY3Rfc3RyaW5nW29iai50eXBlXSk7CisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksIFZVSUQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgIllvdSBhcmUgYWRkaW5nICVzIHRvICVzIHRoYXQgaXMgaW52YWxpZCBiZWNhdXNlIGJvdW5kICVzIHdhcyAlcy4iLCBjYWxsX3NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShvYmopLmNfc3RyKCksIGNhdXNlX3N0cik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisvLyAnY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUnIHZhbGlkIHVzYWdlIGVycm9yIGNvZGUgZm9yIGVhY2ggY29tbWFuZAorLy8gQXV0b2dlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoZSB2a192YWxpZGF0aW9uX2Vycm9yX21lc3NhZ2UuaCBjb2RlZ2VuCitzdGF0aWMgY29uc3Qgc3RkOjphcnJheTxjb25zdCBjaGFyICosIENNRF9SQU5HRV9TSVpFPiBtdXN0X2JlX3JlY29yZGluZ19saXN0ID0ge3tWVUlEX01VU1RfQkVfUkVDT1JESU5HX0xJU1R9fTsKKworLy8gVmFsaWRhdGUgdGhlIGdpdmVuIGNvbW1hbmQgYmVpbmcgYWRkZWQgdG8gdGhlIHNwZWNpZmllZCBjbWQgYnVmZmVyLCBmbGFnZ2luZyBlcnJvcnMgaWYgQ0IgaXMgbm90IGluIHRoZSByZWNvcmRpbmcgc3RhdGUgb3IgaWYKKy8vIHRoZXJlJ3MgYW4gaXNzdWUgd2l0aCB0aGUgQ21kIG9yZGVyaW5nCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ21kKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLCBjb25zdCBDTURfVFlQRSBjbWQsIGNvbnN0IGNoYXIgKmNhbGxlcl9uYW1lKSBjb25zdCB7CisgICAgc3dpdGNoIChjYl9zdGF0ZS0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBDQl9SRUNPUkRJTkc6CisgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGVDbWRTdWJwYXNzU3RhdGUoY2Jfc3RhdGUsIGNtZCk7CisKKyAgICAgICAgY2FzZSBDQl9JTlZBTElEX0NPTVBMRVRFOgorICAgICAgICBjYXNlIENCX0lOVkFMSURfSU5DT01QTEVURToKKyAgICAgICAgICAgIHJldHVybiBSZXBvcnRJbnZhbGlkQ29tbWFuZEJ1ZmZlcihjYl9zdGF0ZSwgY2FsbGVyX25hbWUpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoY21kICE9IENNRF9OT05FKTsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gZXJyb3IgPSBtdXN0X2JlX3JlY29yZGluZ19saXN0W2NtZF07CisgICAgICAgICAgICByZXR1cm4gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IGNhbGwgdmtCZWdpbkNvbW1hbmRCdWZmZXIoKSBiZWZvcmUgdGhpcyBjYWxsIHRvICVzLiIsIGNhbGxlcl9uYW1lKTsKKyAgICB9Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVEZXZpY2VNYXNrVG9QaHlzaWNhbERldmljZUNvdW50KHVpbnQzMl90IGRldmljZU1hc2ssIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIFZVSURfaGFuZGxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWVUlEX2hhbmRsZSwgY29uc3QgY2hhciAqVlVJRCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHVpbnQzMl90IGNvdW50ID0gMSA8PCBwaHlzaWNhbF9kZXZpY2VfY291bnQ7CisgICAgaWYgKGNvdW50IDw9IGRldmljZU1hc2spIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVlVJRF9oYW5kbGVfdHlwZSwgVlVJRF9oYW5kbGUsIFZVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGV2aWNlTWFzaygweCUiIFBSSXgzMiAiKSBpcyBpbnZhaWxkLiBQaHlzaWNhbCBkZXZpY2UgY291bnQgaXMgJSIgUFJJdTMyICIuIiwgZGV2aWNlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsX2RldmljZV9jb3VudCk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlRGV2aWNlTWFza1RvWmVybyh1aW50MzJfdCBkZXZpY2VNYXNrLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBWVUlEX2hhbmRsZV90eXBlLCB1aW50NjRfdCBWVUlEX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlZVSUQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZGV2aWNlTWFzayA9PSAwKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZVSURfaGFuZGxlX3R5cGUsIFZVSURfaGFuZGxlLCBWVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgImRldmljZU1hc2soMHglIiBQUkl4MzIgIikgbXVzdCBiZSBub24temVyby4iLCBkZXZpY2VNYXNrKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVEZXZpY2VNYXNrVG9Db21tYW5kQnVmZmVyKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgdWludDMyX3QgZGV2aWNlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIFZVSURfaGFuZGxlX3R5cGUsIHVpbnQ2NF90IFZVSURfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqVlVJRCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICgoZGV2aWNlTWFzayAmIHBDQi0+aW5pdGlhbF9kZXZpY2VfbWFzaykgIT0gZGV2aWNlTWFzaykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWVUlEX2hhbmRsZV90eXBlLCBWVUlEX2hhbmRsZSwgVlVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXZpY2VNYXNrKDB4JSIgUFJJeDMyICIpIGlzIG5vdCBhIHN1YnNldCBvZiAlcyBpbml0aWFsIGRldmljZSBtYXNrKDB4JSIgUFJJeDMyICIpLiIsIGRldmljZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDQi0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSwgcENCLT5pbml0aWFsX2RldmljZV9tYXNrKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVEZXZpY2VNYXNrVG9SZW5kZXJQYXNzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgdWludDMyX3QgZGV2aWNlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIFZVSURfaGFuZGxlX3R5cGUsIHVpbnQ2NF90IFZVSURfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqVlVJRCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICgoZGV2aWNlTWFzayAmIHBDQi0+YWN0aXZlX3JlbmRlcl9wYXNzX2RldmljZV9tYXNrKSAhPSBkZXZpY2VNYXNrKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZVSURfaGFuZGxlX3R5cGUsIFZVSURfaGFuZGxlLCBWVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgImRldmljZU1hc2soMHglIiBQUkl4MzIgIikgaXMgbm90IGEgc3Vic2V0IG9mICVzIGRldmljZSBtYXNrKDB4JSIgUFJJeDMyICIpLiIsIGRldmljZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDQi0+YWN0aXZlUmVuZGVyUGFzcy0+cmVuZGVyUGFzcykuY19zdHIoKSwgcENCLT5hY3RpdmVfcmVuZGVyX3Bhc3NfZGV2aWNlX21hc2spOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gRmxhZ3MgdmFsaWRhdGlvbiBlcnJvciBpZiB0aGUgYXNzb2NpYXRlZCBjYWxsIGlzIG1hZGUgaW5zaWRlIGEgcmVuZGVyIHBhc3MuIFRoZSBhcGlOYW1lIHJvdXRpbmUgc2hvdWxkIE9OTFkgYmUgY2FsbGVkIG91dHNpZGUgYQorLy8gcmVuZGVyIHBhc3MuCitib29sIENvcmVDaGVja3M6Okluc2lkZVJlbmRlclBhc3MoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqcENCLCBjb25zdCBjaGFyICphcGlOYW1lLCBjb25zdCBjaGFyICptc2dDb2RlKSBjb25zdCB7CisgICAgYm9vbCBpbnNpZGUgPSBmYWxzZTsKKyAgICBpZiAocENCLT5hY3RpdmVSZW5kZXJQYXNzKSB7CisgICAgICAgIGluc2lkZSA9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDQi0+Y29tbWFuZEJ1ZmZlciksIG1zZ0NvZGUsICIlczogSXQgaXMgaW52YWxpZCB0byBpc3N1ZSB0aGlzIGNhbGwgaW5zaWRlIGFuIGFjdGl2ZSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFwaU5hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENCLT5hY3RpdmVSZW5kZXJQYXNzLT5yZW5kZXJQYXNzKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGluc2lkZTsKK30KKworLy8gRmxhZ3MgdmFsaWRhdGlvbiBlcnJvciBpZiB0aGUgYXNzb2NpYXRlZCBjYWxsIGlzIG1hZGUgb3V0c2lkZSBhIHJlbmRlciBwYXNzLiBUaGUgYXBpTmFtZQorLy8gcm91dGluZSBzaG91bGQgT05MWSBiZSBjYWxsZWQgaW5zaWRlIGEgcmVuZGVyIHBhc3MuCitib29sIENvcmVDaGVja3M6Ok91dHNpZGVSZW5kZXJQYXNzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgY29uc3QgY2hhciAqYXBpTmFtZSwgY29uc3QgY2hhciAqbXNnQ29kZSkgY29uc3QgeworICAgIGJvb2wgb3V0c2lkZSA9IGZhbHNlOworICAgIGlmICgoKHBDQi0+Y3JlYXRlSW5mby5sZXZlbCA9PSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZKSAmJiAoIXBDQi0+YWN0aXZlUmVuZGVyUGFzcykpIHx8CisgICAgICAgICgocENCLT5jcmVhdGVJbmZvLmxldmVsID09IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSkgJiYgKCFwQ0ItPmFjdGl2ZVJlbmRlclBhc3MpICYmCisgICAgICAgICAhKHBDQi0+YmVnaW5JbmZvLmZsYWdzICYgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUKSkpIHsKKyAgICAgICAgb3V0c2lkZSA9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ0ItPmNvbW1hbmRCdWZmZXIpLCBtc2dDb2RlLCAiJXM6IFRoaXMgY2FsbCBtdXN0IGJlIGlzc3VlZCBpbnNpZGUgYW4gYWN0aXZlIHJlbmRlciBwYXNzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaU5hbWUpOworICAgIH0KKyAgICByZXR1cm4gb3V0c2lkZTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVF1ZXVlRmFtaWx5SW5kZXgoY29uc3QgUEhZU0lDQUxfREVWSUNFX1NUQVRFICpwZF9zdGF0ZSwgdWludDMyX3QgcmVxdWVzdGVkX3F1ZXVlX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycl9jb2RlLCBjb25zdCBjaGFyICpjbWRfbmFtZSwgY29uc3QgY2hhciAqcXVldWVfZmFtaWx5X3Zhcl9uYW1lKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAocmVxdWVzdGVkX3F1ZXVlX2ZhbWlseSA+PSBwZF9zdGF0ZS0+cXVldWVfZmFtaWx5X2tub3duX2NvdW50KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbmRpdGlvbmFsX2V4dF9jbWQgPQorICAgICAgICAgICAgaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIgPyAiIG9yIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyW0tIUl0iIDogIiI7CisKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwZF9zdGF0ZS0+cGh5c19kZXZpY2UpLCBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMgKD0gJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBub3QgbGVzcyB0aGFuIGFueSBwcmV2aW91c2x5IG9idGFpbmVkIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyVzIChpLmUuIGlzIG5vdCBsZXNzIHRoYW4gJXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfbmFtZSwgcXVldWVfZmFtaWx5X3Zhcl9uYW1lLCByZXF1ZXN0ZWRfcXVldWVfZmFtaWx5LCBjb25kaXRpb25hbF9leHRfY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcocGRfc3RhdGUtPnF1ZXVlX2ZhbWlseV9rbm93bl9jb3VudCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisvLyBWZXJpZnkgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm9zCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlRGV2aWNlUXVldWVDcmVhdGVJbmZvcyhjb25zdCBQSFlTSUNBTF9ERVZJQ0VfU1RBVEUgKnBkX3N0YXRlLCB1aW50MzJfdCBpbmZvX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gKmluZm9zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHF1ZXVlX2ZhbWlseV9zZXQ7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5mb19jb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gcmVxdWVzdGVkX3F1ZXVlX2ZhbWlseSA9IGluZm9zW2ldLnF1ZXVlRmFtaWx5SW5kZXg7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgcXVldWVfZmFtaWx5X3Zhcl9uYW1lID0gInBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1siICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiXS5xdWV1ZUZhbWlseUluZGV4IjsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVF1ZXVlRmFtaWx5SW5kZXgocGRfc3RhdGUsIHJlcXVlc3RlZF9xdWV1ZV9mYW1pbHksICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXF1ZXVlRmFtaWx5SW5kZXgtMDAzODEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXZpY2UiLCBxdWV1ZV9mYW1pbHlfdmFyX25hbWUuY19zdHIoKSk7CisKKyAgICAgICAgaWYgKHF1ZXVlX2ZhbWlseV9zZXQuaW5zZXJ0KHJlcXVlc3RlZF9xdWV1ZV9mYW1pbHkpLnNlY29uZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGRfc3RhdGUtPnBoeXNfZGV2aWNlKSwgIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXF1ZXVlRmFtaWx5SW5kZXgtMDAzNzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGVEZXZpY2UoKTogJXMgKD0lIiBQUkl1MzIgIikgaXMgbm90IHVuaXF1ZSB3aXRoaW4gcFF1ZXVlQ3JlYXRlSW5mb3MuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV9mYW1pbHlfdmFyX25hbWUuY19zdHIoKSwgcmVxdWVzdGVkX3F1ZXVlX2ZhbWlseSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBWZXJpZnkgdGhhdCByZXF1ZXN0ZWQgcXVldWUgY291bnQgb2YgcXVldWUgZmFtaWx5IGlzIGtub3duIHRvIGJlIHZhbGlkIGF0IHRoaXMgcG9pbnQgaW4gdGltZQorICAgICAgICBpZiAocmVxdWVzdGVkX3F1ZXVlX2ZhbWlseSA8IHBkX3N0YXRlLT5xdWV1ZV9mYW1pbHlfa25vd25fY291bnQpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVxdWVzdGVkX3F1ZXVlX2NvdW50ID0gaW5mb3NbaV0ucXVldWVDb3VudDsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgcXVldWVfZmFtaWx5X2hhc19wcm9wcyA9IHJlcXVlc3RlZF9xdWV1ZV9mYW1pbHkgPCBwZF9zdGF0ZS0+cXVldWVfZmFtaWx5X3Byb3BlcnRpZXMuc2l6ZSgpOworICAgICAgICAgICAgLy8gc3BlYyBndWFyYW50ZWVzIGF0IGxlYXN0IG9uZSBxdWV1ZSBmb3IgZWFjaCBxdWV1ZSBmYW1pbHkKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGF2YWlsYWJsZV9xdWV1ZV9jb3VudCA9CisgICAgICAgICAgICAgICAgcXVldWVfZmFtaWx5X2hhc19wcm9wcyA/IHBkX3N0YXRlLT5xdWV1ZV9mYW1pbHlfcHJvcGVydGllc1tyZXF1ZXN0ZWRfcXVldWVfZmFtaWx5XS5xdWV1ZUNvdW50IDogMTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbmRpdGlvbmFsX2V4dF9jbWQgPSBpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIgb3IgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJbS0hSXSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIjsKKworICAgICAgICAgICAgaWYgKHJlcXVlc3RlZF9xdWV1ZV9jb3VudCA+IGF2YWlsYWJsZV9xdWV1ZV9jb3VudCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50X25vdGUgPQorICAgICAgICAgICAgICAgICAgICBxdWV1ZV9mYW1pbHlfaGFzX3Byb3BzCisgICAgICAgICAgICAgICAgICAgICAgICA/ICJpLmUuIGlzIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhwZF9zdGF0ZS0+cXVldWVfZmFtaWx5X3Byb3BlcnRpZXNbcmVxdWVzdGVkX3F1ZXVlX2ZhbWlseV0ucXVldWVDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogInRoZSBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzWyIgKyBzdGQ6OnRvX3N0cmluZyhyZXF1ZXN0ZWRfcXVldWVfZmFtaWx5KSArICJdIHdhcyBuZXZlciBvYnRhaW5lZCI7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBkX3N0YXRlLT5waHlzX2RldmljZSksICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXF1ZXVlQ291bnQtMDAzODIiLAorICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXZpY2U6IHBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1slIiBQUkl1MzIgIl0ucXVldWVDb3VudCAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAiKSBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGF2YWlsYWJsZSBxdWV1ZSBjb3VudCBmb3IgdGhpcyBwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICJdLnF1ZXVlRmFtaWx5SW5kZXh9ICg9JSIgUFJJdTMyICIpIG9idGFpbmVkIHByZXZpb3VzbHkgZnJvbSB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzJXMgKCVzKS4iLAorICAgICAgICAgICAgICAgICAgICBpLCByZXF1ZXN0ZWRfcXVldWVfY291bnQsIGksIHJlcXVlc3RlZF9xdWV1ZV9mYW1pbHksIGNvbmRpdGlvbmFsX2V4dF9jbWQsIGNvdW50X25vdGUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBncHUsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRGV2aWNlICpwRGV2aWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgYXV0byBwZF9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUoZ3B1KTsKKworICAgIC8vIFRPRE86IG9iamVjdF90cmFja2VyIHNob3VsZCBwZXJoYXBzIGRvIHRoaXMgaW5zdGVhZAorICAgIC8vICAgICAgIGFuZCBpdCBkb2VzIG5vdCBzZWVtIHRvIGN1cnJlbnRseSB3b3JrIGFueXdheSAtLSB0aGUgbG9hZGVyIGp1c3QgY3Jhc2hlcyBiZWZvcmUgdGhpcyBwb2ludAorICAgIGlmICghcGRfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RldkxpbWl0X011c3RRdWVyeUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2FsbCB0byB2a0NyZWF0ZURldmljZSgpIHcvbyBmaXJzdCBjYWxsaW5nIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCkuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZURldmljZVF1ZXVlQ3JlYXRlSW5mb3MocGRfc3RhdGUsIHBDcmVhdGVJbmZvLT5xdWV1ZUNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UG9zdENhbGxSZWNvcmRDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBncHUsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIC8vIFRoZSBzdGF0ZSB0cmFja2VyIHNldHMgdXAgdGhlIGRldmljZSBzdGF0ZQorICAgIFN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVEZXZpY2UoZ3B1LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSwgcmVzdWx0KTsKKworICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgaG9va3MgZm9yIHRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgZWl0aGVyIGJyb2FkbHkgb3IgZGVlcGx5IHVzZWQgYW5kIHRoYXQgdGhlIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgcmVmYWN0b3IKKyAgICAvLyB3b3VsZCBiZSBtZXNzaWVyIHdpdGhvdXQuCisgICAgLy8gVE9ETzogRmluZCBhIGdvb2Qgd2F5IHRvIGRvIHRoaXMgaG9va2xlc3NseS4KKyAgICBWYWxpZGF0aW9uT2JqZWN0ICpkZXZpY2Vfb2JqZWN0ID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoKnBEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmFsaWRhdGlvbk9iamVjdCAqdmFsaWRhdGlvbl9kYXRhID0gR2V0VmFsaWRhdGlvbk9iamVjdChkZXZpY2Vfb2JqZWN0LT5vYmplY3RfZGlzcGF0Y2gsIExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uKTsKKyAgICBDb3JlQ2hlY2tzICpjb3JlX2NoZWNrcyA9IHN0YXRpY19jYXN0PENvcmVDaGVja3MgKj4odmFsaWRhdGlvbl9kYXRhKTsKKyAgICBjb3JlX2NoZWNrcy0+U2V0U2V0SW1hZ2VWaWV3SW5pdGlhbExheW91dENhbGxiYWNrKAorICAgICAgICBbY29yZV9jaGVja3NdKENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IElNQUdFX1ZJRVdfU1RBVEUgJml2X3N0YXRlLCBWa0ltYWdlTGF5b3V0IGxheW91dCkgLT4gdm9pZCB7CisgICAgICAgICAgICBjb3JlX2NoZWNrcy0+U2V0SW1hZ2VWaWV3SW5pdGlhbExheW91dChjYl9ub2RlLCBpdl9zdGF0ZSwgbGF5b3V0KTsKKyAgICAgICAgfSk7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBpZiAoIWRldmljZSkgcmV0dXJuOworICAgIGltYWdlU3VicmVzb3VyY2VNYXAuY2xlYXIoKTsKKyAgICBpbWFnZUxheW91dE1hcC5jbGVhcigpOworCisgICAgU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveURldmljZShkZXZpY2UsIHBBbGxvY2F0b3IpOworfQorCisvLyBGb3IgZ2l2ZW4gc3RhZ2UgbWFzaywgaWYgR2VvbWV0cnkgc2hhZGVyIHN0YWdlIGlzIG9uIHcvbyBHUyBiZWluZyBlbmFibGVkLCByZXBvcnQgZ2VvX2Vycm9yX2lkCisvLyAgIGFuZCBpZiBUZXNzZWxsYXRpb24gQ29udHJvbCBvciBFdmFsdWF0aW9uIHNoYWRlciBzdGFnZXMgYXJlIG9uIHcvbyBUUyBiZWluZyBlbmFibGVkLCByZXBvcnQgdGVzc19lcnJvcl9pZC4KKy8vIFNpbWlsYXJseSBmb3IgbWVzaCBhbmQgdGFzayBzaGFkZXJzLgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVN0YWdlTWFza0dzVHNFbmFibGVzKFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzaywgY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICpnZW9fZXJyb3JfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGVzc19lcnJvcl9pZCwgY29uc3QgY2hhciAqbWVzaF9lcnJvcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YXNrX2Vycm9yX2lkKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuZ2VvbWV0cnlTaGFkZXIgJiYgKHN0YWdlTWFzayAmIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgZ2VvX2Vycm9yX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGwgaW5jbHVkZXMgYSBzdGFnZU1hc2sgd2l0aCBWS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUIGJpdCBzZXQgd2hlbiBkZXZpY2UgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2VvbWV0cnlTaGFkZXIgZmVhdHVyZSBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIpOworICAgIH0KKyAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMuY29yZS50ZXNzZWxsYXRpb25TaGFkZXIgJiYKKyAgICAgICAgKHN0YWdlTWFzayAmIChWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVCkpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdGVzc19lcnJvcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyBjYWxsIGluY2x1ZGVzIGEgc3RhZ2VNYXNrIHdpdGggVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCBhbmQvb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQgYml0KHMpIHNldCB3aGVuIGRldmljZSBkb2VzIG5vdCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXNzZWxsYXRpb25TaGFkZXIgZmVhdHVyZSBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIpOworICAgIH0KKyAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMubWVzaF9zaGFkZXIubWVzaFNoYWRlciAmJiAoc3RhZ2VNYXNrICYgVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIG1lc2hfZXJyb3JfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgY2FsbCBpbmNsdWRlcyBhIHN0YWdlTWFzayB3aXRoIFZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OViBiaXQgc2V0IHdoZW4gZGV2aWNlIGRvZXMgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVjo6bWVzaFNoYWRlciBmZWF0dXJlIGVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcik7CisgICAgfQorICAgIGlmICghZW5hYmxlZF9mZWF0dXJlcy5tZXNoX3NoYWRlci50YXNrU2hhZGVyICYmIChzdGFnZU1hc2sgJiBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdGFza19lcnJvcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyBjYWxsIGluY2x1ZGVzIGEgc3RhZ2VNYXNrIHdpdGggVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIGJpdCBzZXQgd2hlbiBkZXZpY2UgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WOjp0YXNrU2hhZGVyIGZlYXR1cmUgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBnbG9iYWwgbG9jayBpcyBoZWxkIGJ5IHRoZSBjYWxsaW5nIHRocmVhZC4KKy8vIEZvciB0aGUgZ2l2ZW4gcXVldWUsIHZlcmlmeSB0aGUgcXVldWUgc3RhdGUgdXAgdG8gdGhlIGdpdmVuIHNlcSBudW1iZXIuCisvLyBDdXJyZW50bHkgdGhlIG9ubHkgY2hlY2sgaXMgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgYXJlIGV2ZW50cyB0byBiZSB3YWl0ZWQgb24gcHJpb3IgdG8KKy8vICBhIFF1ZXJ5UmVzZXQsIG1ha2Ugc3VyZSB0aGF0IGFsbCBzdWNoIGV2ZW50cyBoYXZlIGJlZW4gc2lnbmFsbGVkLgorYm9vbCBDb3JlQ2hlY2tzOjpWZXJpZnlRdWV1ZVN0YXRlVG9TZXEoY29uc3QgUVVFVUVfU1RBVEUgKmluaXRpYWxfcXVldWUsIHVpbnQ2NF90IGluaXRpYWxfc2VxKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICAvLyBzZXF1ZW5jZSBudW1iZXIgd2Ugd2FudCB0byB2YWxpZGF0ZSB1cCB0bywgcGVyIHF1ZXVlCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IFFVRVVFX1NUQVRFICosIHVpbnQ2NF90PiB0YXJnZXRfc2Vxc3t7aW5pdGlhbF9xdWV1ZSwgaW5pdGlhbF9zZXF9fTsKKyAgICAvLyBzZXF1ZW5jZSBudW1iZXIgd2UndmUgY29tcGxldGVkIHZhbGlkYXRpb24gZm9yLCBwZXIgcXVldWUKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3QgUVVFVUVfU1RBVEUgKiwgdWludDY0X3Q+IGRvbmVfc2VxczsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBRVUVVRV9TVEFURSAqPiB3b3JrbGlzdHtpbml0aWFsX3F1ZXVlfTsKKworICAgIHdoaWxlICh3b3JrbGlzdC5zaXplKCkpIHsKKyAgICAgICAgYXV0byBxdWV1ZSA9IHdvcmtsaXN0LmJhY2soKTsKKyAgICAgICAgd29ya2xpc3QucG9wX2JhY2soKTsKKworICAgICAgICBhdXRvIHRhcmdldF9zZXEgPSB0YXJnZXRfc2Vxc1txdWV1ZV07CisgICAgICAgIGF1dG8gc2VxID0gc3RkOjptYXgoZG9uZV9zZXFzW3F1ZXVlXSwgcXVldWUtPnNlcSk7CisgICAgICAgIGF1dG8gc3ViX2l0ID0gcXVldWUtPnN1Ym1pc3Npb25zLmJlZ2luKCkgKyBpbnQoc2VxIC0gcXVldWUtPnNlcSk7ICAvLyBzZXEgPj0gcXVldWUtPnNlcQorCisgICAgICAgIGZvciAoOyBzZXEgPCB0YXJnZXRfc2VxOyArK3N1Yl9pdCwgKytzZXEpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byAmd2FpdCA6IHN1Yl9pdC0+d2FpdFNlbWFwaG9yZXMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIG90aGVyX3F1ZXVlID0gR2V0UXVldWVTdGF0ZSh3YWl0LnF1ZXVlKTsKKworICAgICAgICAgICAgICAgIGlmIChvdGhlcl9xdWV1ZSA9PSBxdWV1ZSkgY29udGludWU7ICAvLyBzZW1hcGhvcmVzIC9hbHdheXMvIHBvaW50IGJhY2t3YXJkcywgc28gbm8gcG9pbnQgaGVyZS4KKworICAgICAgICAgICAgICAgIGF1dG8gb3RoZXJfdGFyZ2V0X3NlcSA9IHN0ZDo6bWF4KHRhcmdldF9zZXFzW290aGVyX3F1ZXVlXSwgd2FpdC5zZXEpOworICAgICAgICAgICAgICAgIGF1dG8gb3RoZXJfZG9uZV9zZXEgPSBzdGQ6Om1heChkb25lX3NlcXNbb3RoZXJfcXVldWVdLCBvdGhlcl9xdWV1ZS0+c2VxKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgd2FpdCBpcyBmb3IgYW5vdGhlciBxdWV1ZSwgYW5kIGNvdmVycyBuZXcgc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAvLyBudW1iZXJzIGJleW9uZCB3aGF0IHdlJ3ZlIGFscmVhZHkgdmFsaWRhdGVkLCBtYXJrIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAvLyB0YXJnZXQgc2VxIGFuZCAocG9zc2libHktcmUpYWRkIHRoZSBxdWV1ZSB0byB0aGUgd29ya2xpc3QuCisgICAgICAgICAgICAgICAgaWYgKG90aGVyX2RvbmVfc2VxIDwgb3RoZXJfdGFyZ2V0X3NlcSkgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRfc2Vxc1tvdGhlcl9xdWV1ZV0gPSBvdGhlcl90YXJnZXRfc2VxOworICAgICAgICAgICAgICAgICAgICB3b3JrbGlzdC5wdXNoX2JhY2sob3RoZXJfcXVldWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbmFsbHkgbWFyayB0aGUgcG9pbnQgd2UndmUgbm93IHZhbGlkYXRlZCB0aGlzIHF1ZXVlIHRvLgorICAgICAgICBkb25lX3NlcXNbcXVldWVdID0gc2VxOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCisvLyBXaGVuIHRoZSBnaXZlbiBmZW5jZSBpcyByZXRpcmVkLCB2ZXJpZnkgb3V0c3RhbmRpbmcgcXVldWUgb3BlcmF0aW9ucyB0aHJvdWdoIHRoZSBwb2ludCBvZiB0aGUgZmVuY2UKK2Jvb2wgQ29yZUNoZWNrczo6VmVyaWZ5UXVldWVTdGF0ZVRvRmVuY2UoVmtGZW5jZSBmZW5jZSkgY29uc3QgeworICAgIGF1dG8gZmVuY2Vfc3RhdGUgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKyAgICBpZiAoZmVuY2Vfc3RhdGUgJiYgZmVuY2Vfc3RhdGUtPnNjb3BlID09IGtTeW5jU2NvcGVJbnRlcm5hbCAmJiBWS19OVUxMX0hBTkRMRSAhPSBmZW5jZV9zdGF0ZS0+c2lnbmFsZXIuZmlyc3QpIHsKKyAgICAgICAgcmV0dXJuIFZlcmlmeVF1ZXVlU3RhdGVUb1NlcShHZXRRdWV1ZVN0YXRlKGZlbmNlX3N0YXRlLT5zaWduYWxlci5maXJzdCksIGZlbmNlX3N0YXRlLT5zaWduYWxlci5zZWNvbmQpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDb21tYW5kQnVmZmVyU2ltdWx0YW5lb3VzVXNlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgaW50IGN1cnJlbnRfc3VibWl0X2NvdW50KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKChwQ0ItPmluX3VzZS5sb2FkKCkgfHwgY3VycmVudF9zdWJtaXRfY291bnQgPiAxKSAmJgorICAgICAgICAhKHBDQi0+YmVnaW5JbmZvLmZsYWdzICYgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3MSIsICIlcyBpcyBhbHJlYWR5IGluIHVzZSBhbmQgaXMgbm90IG1hcmtlZCBmb3Igc2ltdWx0YW5lb3VzIHVzZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ0ItPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNvbW1hbmRCdWZmZXJTdGF0ZShjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgY29uc3QgY2hhciAqY2FsbF9zb3VyY2UsIGludCBjdXJyZW50X3N1Ym1pdF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdnVfaWQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZGlzYWJsZWQuY29tbWFuZF9idWZmZXJfc3RhdGUpIHJldHVybiBza2lwOworICAgIC8vIFZhbGlkYXRlIE9ORV9USU1FX1NVQk1JVF9CSVQgQ0IgaXMgbm90IGJlaW5nIHN1Ym1pdHRlZCBtb3JlIHRoYW4gb25jZQorICAgIGlmICgoY2Jfc3RhdGUtPmJlZ2luSW5mby5mbGFncyAmIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQpICYmCisgICAgICAgIChjYl9zdGF0ZS0+c3VibWl0Q291bnQgKyBjdXJyZW50X3N1Ym1pdF9jb3VudCA+IDEpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9Db21tYW5kQnVmZmVyU2luZ2xlU3VibWl0VmlvbGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHdhcyBiZWd1biB3LyBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUIHNldCwgYnV0IGhhcyBiZWVuIHN1Ym1pdHRlZCAweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAidGltZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCksIGNiX3N0YXRlLT5zdWJtaXRDb3VudCArIGN1cnJlbnRfc3VibWl0X2NvdW50KTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IGNtZCBidWZmZXJzIGhhdmUgYmVlbiB1cGRhdGVkCisgICAgc3dpdGNoIChjYl9zdGF0ZS0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBDQl9JTlZBTElEX0lOQ09NUExFVEU6CisgICAgICAgIGNhc2UgQ0JfSU5WQUxJRF9DT01QTEVURToKKyAgICAgICAgICAgIHNraXAgfD0gUmVwb3J0SW52YWxpZENvbW1hbmRCdWZmZXIoY2Jfc3RhdGUsIGNhbGxfc291cmNlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ0JfTkVXOgorICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpKGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgdnVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHVzZWQgaW4gdGhlIGNhbGwgdG8gJXMgaXMgdW5yZWNvcmRlZCBhbmQgY29udGFpbnMgbm8gY29tbWFuZHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKS5jX3N0cigpLCBjYWxsX3NvdXJjZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENCX1JFQ09SRElORzoKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9Ob0VuZENvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IGNhbGwgdmtFbmRDb21tYW5kQnVmZmVyKCkgb24gJXMgYmVmb3JlIHRoaXMgY2FsbCB0byAlcyEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCksIGNhbGxfc291cmNlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IC8qIHJlY29yZGVkICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIENoZWNrIHRoYXQgdGhlIHF1ZXVlIGZhbWlseSBpbmRleCBvZiAncXVldWUnIG1hdGNoZXMgb25lIG9mIHRoZSBlbnRyaWVzIGluIHBRdWV1ZUZhbWlseUluZGljZXMKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRJbWFnZUJ1ZmZlclF1ZXVlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlICZvYmplY3QsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgdWludDMyX3QgKmluZGljZXMpIGNvbnN0IHsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGluZGljZXNbaV0gPT0gcXVldWVGYW1pbHlJbmRleCkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZ2V0X2RlYnVnX3JlcG9ydF9lbnVtW29iamVjdC50eXBlXSwgb2JqZWN0LmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFF1ZXVlRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZVN1Ym1pdDogJXMgY29udGFpbnMgJXMgd2hpY2ggd2FzIG5vdCBjcmVhdGVkIGFsbG93aW5nIGNvbmN1cnJlbnQgYWNjZXNzIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcXVldWUgZmFtaWx5ICVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShvYmplY3QpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gVmFsaWRhdGUgdGhhdCBxdWV1ZUZhbWlseUluZGljZXMgb2YgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlcnMgbWF0Y2ggdGhpcyBxdWV1ZQorLy8gU2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVycyB3ZXJlIHByZXZpb3VzbHkgdmFsaWRhdGVkIGluIHZrQ21kRXhlY3V0ZUNvbW1hbmRzKCkuCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlUXVldWVGYW1pbHlJbmRpY2VzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgVmtRdWV1ZSBxdWV1ZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGF1dG8gcFBvb2wgPSBwQ0ItPmNvbW1hbmRfcG9vbC5nZXQoKTsKKyAgICBhdXRvIHF1ZXVlX3N0YXRlID0gR2V0UXVldWVTdGF0ZShxdWV1ZSk7CisKKyAgICBpZiAocFBvb2wgJiYgcXVldWVfc3RhdGUpIHsKKyAgICAgICAgaWYgKHBQb29sLT5xdWV1ZUZhbWlseUluZGV4ICE9IHF1ZXVlX3N0YXRlLT5xdWV1ZUZhbWlseUluZGV4KSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDQi0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAwMDc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZVN1Ym1pdDogUHJpbWFyeSAlcyBjcmVhdGVkIGluIHF1ZXVlIGZhbWlseSAlZCBpcyBiZWluZyBzdWJtaXR0ZWQgb24gJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIHF1ZXVlIGZhbWlseSAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENCLT5jb21tYW5kQnVmZmVyKS5jX3N0cigpLCBwUG9vbC0+cXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXVlKS5jX3N0cigpLCBxdWV1ZV9zdGF0ZS0+cXVldWVGYW1pbHlJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBhbnkgYm91bmQgaW1hZ2VzIG9yIGJ1ZmZlcnMgY3JlYXRlZCB3aXRoIFNIQVJJTkdfTU9ERV9DT05DVVJSRU5UIGhhdmUgYWNjZXNzIHRvIHRoZSBjdXJyZW50IHF1ZXVlIGZhbWlseQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm9iamVjdCA6IHBDQi0+b2JqZWN0X2JpbmRpbmdzKSB7CisgICAgICAgICAgICBpZiAob2JqZWN0LnR5cGUgPT0ga1Z1bGthbk9iamVjdFR5cGVJbWFnZSkgeworICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2Vfc3RhdGUgPSBvYmplY3Qubm9kZSA/IChJTUFHRV9TVEFURSAqKW9iamVjdC5ub2RlIDogR2V0SW1hZ2VTdGF0ZShvYmplY3QuQ2FzdDxWa0ltYWdlPigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUgJiYgaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uc2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZEltYWdlQnVmZmVyUXVldWUocENCLCBvYmplY3QsIHF1ZXVlX3N0YXRlLT5xdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvLnBRdWV1ZUZhbWlseUluZGljZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0ga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlcl9zdGF0ZSA9IG9iamVjdC5ub2RlID8gKEJVRkZFUl9TVEFURSAqKW9iamVjdC5ub2RlIDogR2V0QnVmZmVyU3RhdGUob2JqZWN0LkNhc3Q8VmtCdWZmZXI+KCkpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJfc3RhdGUgJiYgYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnNoYXJpbmdNb2RlID09IFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRJbWFnZUJ1ZmZlclF1ZXVlKHBDQiwgb2JqZWN0LCBxdWV1ZV9zdGF0ZS0+cXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnBRdWV1ZUZhbWlseUluZGljZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCisvLyBWYWxpZGF0ZSB0aGF0IGEgY29tbWFuZCBidWZmZXIgc3VibWl0dGVkIGhhZCB0aGUgcGVyZm9ybWFuY2UgbG9ja2VkIGhvbGQKKy8vIHdoZW4gcmVjb3JkaW5nIGNvbW1hbmQgaWYgaXQgY29udGFpbnMgcGVyZm9ybWFuY2UgcXVlcmllcy4KK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVQZXJmb3JtYW5jZVF1ZXJpZXMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqcENCLCBWa1F1ZXVlIHF1ZXVlLCBWa1F1ZXJ5UG9vbCAmZmlyc3RfcXVlcnlfcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnRlclBhc3NJbmRleCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGJvb2wgZGlmZmVyZW50X3Bvb2xzID0gZmFsc2U7CisgICAgYm9vbCBpbmRleGVkX2RpZmZlcmVudF9wb29sID0gZmFsc2U7CisKKyAgICBpZiAocENCLT5jcmVhdGVJbmZvLmxldmVsID09IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZzZWNvbmRhcnlDQiA6IHBDQi0+bGlua2VkQ29tbWFuZEJ1ZmZlcnMpCisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlUGVyZm9ybWFuY2VRdWVyaWVzKHNlY29uZGFyeUNCLCBxdWV1ZSwgZmlyc3RfcXVlcnlfcG9vbCwgY291bnRlclBhc3NJbmRleCk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZxdWVyeSA6IHBDQi0+c3RhcnRlZFF1ZXJpZXMpIHsKKyAgICAgICAgY29uc3QgYXV0byBxdWVyeV9wb29sX3N0YXRlID0gR2V0UXVlcnlQb29sU3RhdGUocXVlcnkucG9vbCk7CisKKyAgICAgICAgaWYgKHF1ZXJ5X3Bvb2xfc3RhdGUtPmNyZWF0ZUluZm8ucXVlcnlUeXBlICE9IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSKSBjb250aW51ZTsKKworICAgICAgICBpZiAoY291bnRlclBhc3NJbmRleCA+PSBxdWVyeV9wb29sX3N0YXRlLT5uX3BlcmZvcm1hbmNlX3Bhc3NlcykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ0ItPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSLWNvdW50ZXJQYXNzSW5kZXgtMDMyMjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvdW50ZXJQYXNzSW5kZXggKCV1LCBtYXhpbXVtIGFsbG93ZWQgJXUpIHZhbHVlIGZvciBxdWVyeSBwb29sICVzLiIsIGNvdW50ZXJQYXNzSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfcG9vbF9zdGF0ZS0+bl9wZXJmb3JtYW5jZV9wYXNzZXMsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnkucG9vbCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBDQi0+cGVyZm9ybWFuY2VfbG9ja19hY3F1aXJlZCB8fCBwQ0ItPnBlcmZvcm1hbmNlX2xvY2tfcmVsZWFzZWQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENCLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtRdWV1ZVN1Ym1pdC1wQ29tbWFuZEJ1ZmZlcnMtMDMyMjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21tYW5kYnVmZmVyICVzIHdhcyBzdWJtaXR0ZWQgYW5kIGNvbnRhaW5zIGEgcGVyZm9ybWFuY2UgcXVlcnkgYnV0IHRoZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZmlsaW5nIGxvY2sgd2FzIG5vdCBoZWxkIGNvbnRpbnVvdXNseSB0aHJvdWdob3V0IHRoZSByZWNvcmRpbmcgb2YgY29tbWFuZHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDQi0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVlcnlfcG9vbF9zdGF0ZS0+aGFzX3BlcmZfc2NvcGVfY29tbWFuZF9idWZmZXIgJiYgKHBDQi0+Y29tbWFuZENvdW50IC0gMSkgIT0gcXVlcnkuZW5kQ29tbWFuZEluZGV4KSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDQi0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRW5kUXVlcnktcXVlcnlQb29sLTAzMjI3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRFbmRRdWVyeTogUXVlcnkgcG9vbCAlcyB3YXMgY3JlYXRlZCB3aXRoIGEgY291bnRlciBvZiBzY29wZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfUVVFUllfU0NPUEVfQ09NTUFORF9CVUZGRVJfS0hSIGJ1dCB0aGUgZW5kIG9mIHRoZSBxdWVyeSBpcyBub3QgdGhlIGxhc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kIGluIHRoZSBjb21tYW5kIGJ1ZmZlciAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnkucG9vbCkuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ0ItPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0X3F1ZXJ5X3Bvb2wgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIGlmIChxdWVyeV9wb29sX3N0YXRlLT5wb29sICE9IGZpcnN0X3F1ZXJ5X3Bvb2wpIHsKKyAgICAgICAgICAgICAgICBkaWZmZXJlbnRfcG9vbHMgPSB0cnVlOworICAgICAgICAgICAgICAgIGluZGV4ZWRfZGlmZmVyZW50X3Bvb2wgPSBxdWVyeS5pbmRleGVkOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGZpcnN0X3F1ZXJ5X3Bvb2wgPSBxdWVyeV9wb29sX3N0YXRlLT5wb29sOworICAgIH0KKworICAgIGlmIChkaWZmZXJlbnRfcG9vbHMgJiYgIWVuYWJsZWRfZmVhdHVyZXMucGVyZm9ybWFuY2VfcXVlcnlfZmVhdHVyZXMucGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDQi0+Y29tbWFuZEJ1ZmZlciksCisgICAgICAgICAgICBpbmRleGVkX2RpZmZlcmVudF9wb29sID8gIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjYiIDogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC0wMzIyNiIsCisgICAgICAgICAgICAiQ29tbWFuZGJ1ZmZlciAlcyBjb250YWlucyBtb3JlIHRoYW4gb25lIHBlcmZvcm1hbmNlIHF1ZXJ5IHBvb2wgYnV0ICIKKyAgICAgICAgICAgICJwZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHMgaXMgbm90IGVuYWJsZWQuIiwKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENCLT5jb21tYW5kQnVmZmVyKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVByaW1hcnlDb21tYW5kQnVmZmVyU3RhdGUoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqcENCLCBpbnQgY3VycmVudF9zdWJtaXRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZHM8VmtJbWFnZU1lbW9yeUJhcnJpZXI+ICpxZm9faW1hZ2Vfc2NvcmVib2FyZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZHM8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPiAqcWZvX2J1ZmZlcl9zY29yZWJvYXJkcykgY29uc3QgeworICAgIC8vIFRyYWNrIGluLXVzZSBmb3IgcmVzb3VyY2VzIG9mZiBvZiBwcmltYXJ5IGFuZCBhbnkgc2Vjb25kYXJ5IENCcworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKHBDQi0+Y3JlYXRlSW5mby5sZXZlbCA9PSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDQi0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrU3VibWl0SW5mby1wQ29tbWFuZEJ1ZmZlcnMtMDAwNzUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbW1hbmQgYnVmZmVyICVzIHdhcyBpbmNsdWRlZCBpbiB0aGUgcENvbW1hbmRCdWZmZXJzIGFycmF5IG9mIFF1ZXVlU3VibWl0IGJ1dCB3YXMgYWxsb2NhdGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ0ItPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoYXV0byBwU3ViQ0IgOiBwQ0ItPmxpbmtlZENvbW1hbmRCdWZmZXJzKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlUXVldWVkUUZPVHJhbnNmZXJzKHBTdWJDQiwgcWZvX2ltYWdlX3Njb3JlYm9hcmRzLCBxZm9fYnVmZmVyX3Njb3JlYm9hcmRzKTsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCBJbnZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnMoKSBhdCByZWNvcmRpbmcuCisgICAgICAgICAgICBpZiAoKHBTdWJDQi0+cHJpbWFyeUNvbW1hbmRCdWZmZXIgIT0gcENCLT5jb21tYW5kQnVmZmVyKSAmJgorICAgICAgICAgICAgICAgICEocFN1YkNCLT5iZWdpbkluZm8uZmxhZ3MgJiBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyB3YXMgc3VibWl0dGVkIHdpdGggc2Vjb25kYXJ5ICVzIGJ1dCB0aGF0IGJ1ZmZlciBoYXMgc3Vic2VxdWVudGx5IGJlZW4gYm91bmQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpbWFyeSAlcyBhbmQgaXQgZG9lcyBub3QgaGF2ZSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCBzZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ0ItPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocFN1YkNCLT5jb21tYW5kQnVmZmVyKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBTdWJDQi0+cHJpbWFyeUNvbW1hbmRCdWZmZXIpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQgbm90IHNldCB0aGVuIENCIGNhbm5vdCBhbHJlYWR5IGJlIGV4ZWN1dGluZyBvbiBkZXZpY2UKKyAgICBza2lwIHw9IFZhbGlkYXRlQ29tbWFuZEJ1ZmZlclNpbXVsdGFuZW91c1VzZShwQ0IsIGN1cnJlbnRfc3VibWl0X2NvdW50KTsKKworICAgIHNraXAgfD0gVmFsaWRhdGVRdWV1ZWRRRk9UcmFuc2ZlcnMocENCLCBxZm9faW1hZ2Vfc2NvcmVib2FyZHMsIHFmb19idWZmZXJfc2NvcmVib2FyZHMpOworCisgICAgc2tpcCB8PSBWYWxpZGF0ZUNvbW1hbmRCdWZmZXJTdGF0ZShwQ0IsICJ2a1F1ZXVlU3VibWl0KCkiLCBjdXJyZW50X3N1Ym1pdF9jb3VudCwgIlZVSUQtdmtRdWV1ZVN1Ym1pdC1wQ29tbWFuZEJ1ZmZlcnMtMDAwNzIiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlRmVuY2VGb3JTdWJtaXQoY29uc3QgRkVOQ0VfU1RBVEUgKnBGZW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKHBGZW5jZSAmJiBwRmVuY2UtPnNjb3BlID09IGtTeW5jU2NvcGVJbnRlcm5hbCkgeworICAgICAgICBpZiAocEZlbmNlLT5zdGF0ZSA9PSBGRU5DRV9JTkZMSUdIVCkgeworICAgICAgICAgICAgLy8gVE9ETzogb3Bwb3J0dW5pdGllcyBmb3IgIlZVSUQtdmtRdWV1ZVN1Ym1pdC1mZW5jZS0wMDA2NCIsICJWVUlELXZrUXVldWVCaW5kU3BhcnNlLWZlbmNlLTAxMTE0IiwKKyAgICAgICAgICAgIC8vICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1mZW5jZS0wMTI4NyIKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GRU5DRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocEZlbmNlLT5mZW5jZSksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBzdWJtaXNzaW9uLiIsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocEZlbmNlLT5mZW5jZSkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChwRmVuY2UtPnN0YXRlID09IEZFTkNFX1JFVElSRUQpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IG9wcG9ydHVuaXRpZXMgZm9yICJWVUlELXZrUXVldWVTdWJtaXQtZmVuY2UtMDAwNjMiLCAiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1mZW5jZS0wMTExMyIsCisgICAgICAgICAgICAvLyAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItZmVuY2UtMDEyODciCisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBGZW5jZS0+ZmVuY2UpLCBrVlVJRF9Db3JlX01lbVRyYWNrX0ZlbmNlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHN1Ym1pdHRlZCBpbiBTSUdOQUxFRCBzdGF0ZS4gIEZlbmNlcyBtdXN0IGJlIHJlc2V0IGJlZm9yZSBiZWluZyBzdWJtaXR0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocEZlbmNlLT5mZW5jZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQb3N0Q2FsbFJlY29yZFF1ZXVlU3VibWl0KFZrUXVldWUgcXVldWUsIHVpbnQzMl90IHN1Ym1pdENvdW50LCBjb25zdCBWa1N1Ym1pdEluZm8gKnBTdWJtaXRzLCBWa0ZlbmNlIGZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIFN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRRdWV1ZVN1Ym1pdChxdWV1ZSwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBmZW5jZSwgcmVzdWx0KTsKKworICAgIC8vIFRoZSB0cmlwbHkgbmVzdGVkIGZvciBkdXBsaWNhdGVzIHRoYXQgaW4gdGhlIFN0YXRlVHJhY2tlciwgYnV0IGF2b2lkcyB0aGUgbmVlZCBmb3IgdHdvIGFkZGl0aW9uYWwgY2FsbGJhY2tzLgorICAgIGZvciAodWludDMyX3Qgc3VibWl0X2lkeCA9IDA7IHN1Ym1pdF9pZHggPCBzdWJtaXRDb3VudDsgc3VibWl0X2lkeCsrKSB7CisgICAgICAgIGNvbnN0IFZrU3VibWl0SW5mbyAqc3VibWl0ID0gJnBTdWJtaXRzW3N1Ym1pdF9pZHhdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VibWl0LT5jb21tYW5kQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShzdWJtaXQtPnBDb21tYW5kQnVmZmVyc1tpXSk7CisgICAgICAgICAgICBpZiAoY2Jfbm9kZSkgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byBzZWNvbmRhcnlDbWRCdWZmZXIgOiBjYl9ub2RlLT5saW5rZWRDb21tYW5kQnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBVcGRhdGVDbWRCdWZJbWFnZUxheW91dHMoc2Vjb25kYXJ5Q21kQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgUmVjb3JkUXVldWVkUUZPVHJhbnNmZXJzKHNlY29uZGFyeUNtZEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFVwZGF0ZUNtZEJ1ZkltYWdlTGF5b3V0cyhjYl9ub2RlKTsKKyAgICAgICAgICAgICAgICBSZWNvcmRRdWV1ZWRRRk9UcmFuc2ZlcnMoY2Jfbm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9Citib29sIENvcmVDaGVja3M6OlZhbGlkYXRlU2VtYXBob3Jlc0ZvclN1Ym1pdChWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1N1Ym1pdEluZm8gKnN1Ym1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVub3JkZXJlZF9zZXQ8VmtTZW1hcGhvcmU+ICp1bnNpZ25hbGVkX3NlbWFfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5vcmRlcmVkX3NldDxWa1NlbWFwaG9yZT4gKnNpZ25hbGVkX3NlbWFfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5vcmRlcmVkX3NldDxWa1NlbWFwaG9yZT4gKmludGVybmFsX3NlbWFfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5vcmRlcmVkX21hcDxWa1NlbWFwaG9yZSwgc3RkOjpzZXQ8dWludDY0X3Q+PiAqdGltZWxpbmVfdmFsdWVzX2FyZykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGF1dG8gJnNpZ25hbGVkX3NlbWFwaG9yZXMgPSAqc2lnbmFsZWRfc2VtYV9hcmc7CisgICAgYXV0byAmdW5zaWduYWxlZF9zZW1hcGhvcmVzID0gKnVuc2lnbmFsZWRfc2VtYV9hcmc7CisgICAgYXV0byAmaW50ZXJuYWxfc2VtYXBob3JlcyA9ICppbnRlcm5hbF9zZW1hX2FyZzsKKyAgICBhdXRvICZ0aW1lbGluZV92YWx1ZXMgPSAqdGltZWxpbmVfdmFsdWVzX2FyZzsKKyAgICB1bm9yZGVyZWRfbWFwPFZrU2VtYXBob3JlLCBzdGQ6OnNldDx1aW50NjRfdD4+OjppdGVyYXRvciBpdDsKKyAgICBhdXRvICp0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUj4oc3VibWl0LT5wTmV4dCk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VibWl0LT53YWl0U2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBWYWxpZGF0ZVN0YWdlTWFza0dzVHNFbmFibGVzKHN1Ym1pdC0+cFdhaXREc3RTdGFnZU1hc2tbaV0sICJ2a1F1ZXVlU3VibWl0KCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDAwNzYiLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDAwNzciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDIwODkiLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDIwOTAiKTsKKyAgICAgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlID0gc3VibWl0LT5wV2FpdFNlbWFwaG9yZXNbaV07CisgICAgICAgIGNvbnN0IGF1dG8gKnBTZW1hcGhvcmUgPSBHZXRTZW1hcGhvcmVTdGF0ZShzZW1hcGhvcmUpOworICAgICAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiAmJiAhdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVzLTAzMjM5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtRdWV1ZVN1Ym1pdDogJXMgaXMgYSB0aW1lbGluZSBzZW1hcGhvcmUsIGJ1dCBwQmluZEluZm8gZG9lcyBub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUgYW4gaW5zdGFuY2Ugb2YgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc2VtYXBob3JlKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiAmJiB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8gJiYKKyAgICAgICAgICAgIHN1Ym1pdC0+d2FpdFNlbWFwaG9yZUNvdW50ICE9IHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mby0+d2FpdFNlbWFwaG9yZVZhbHVlQ291bnQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNlbWFwaG9yZSksICJWVUlELVZrU3VibWl0SW5mby1wTmV4dC0wMzI0MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUXVldWVTdWJtaXQ6ICVzIGlzIGEgdGltZWxpbmUgc2VtYXBob3JlLCBpdCBjb250YWlucyBhbiBpbnN0YW5jZSBvZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIsIGJ1dCB3YWl0U2VtYXBob3JlVmFsdWVDb3VudCBpcyBkaWZmZXJlbnQgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhaXRTZW1hcGhvcmVDb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzZW1hcGhvcmUpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChwU2VtYXBob3JlICYmIHBTZW1hcGhvcmUtPnR5cGUgPT0gVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiAmJgorICAgICAgICAgICAgKHBTZW1hcGhvcmUtPnNjb3BlID09IGtTeW5jU2NvcGVJbnRlcm5hbCB8fCBpbnRlcm5hbF9zZW1hcGhvcmVzLmNvdW50KHNlbWFwaG9yZSkpKSB7CisgICAgICAgICAgICBpZiAodW5zaWduYWxlZF9zZW1hcGhvcmVzLmNvdW50KHNlbWFwaG9yZSkgfHwgKCEoc2lnbmFsZWRfc2VtYXBob3Jlcy5jb3VudChzZW1hcGhvcmUpKSAmJiAhKHBTZW1hcGhvcmUtPnNpZ25hbGVkKSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc2VtYXBob3JlKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfUXVldWVGb3J3YXJkUHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpcyB3YWl0aW5nIG9uICVzIHRoYXQgaGFzIG5vIHdheSB0byBiZSBzaWduYWxlZC4iLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXVlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNpZ25hbGVkX3NlbWFwaG9yZXMuZXJhc2Uoc2VtYXBob3JlKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25hbGVkX3NlbWFwaG9yZXMuaW5zZXJ0KHNlbWFwaG9yZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSICYmIHBTZW1hcGhvcmUtPnNjb3BlID09IGtTeW5jU2NvcGVFeHRlcm5hbFRlbXBvcmFyeSkgeworICAgICAgICAgICAgaW50ZXJuYWxfc2VtYXBob3Jlcy5pbnNlcnQoc2VtYXBob3JlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNraXAgJiYgcFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUikgeworICAgICAgICAgICAgYXV0byAmdmFsdWVzID0gdGltZWxpbmVfdmFsdWVzW3NlbWFwaG9yZV07CisgICAgICAgICAgICBpZiAodmFsdWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuaW5zZXJ0KHBTZW1hcGhvcmUtPnBheWxvYWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWVzLmluc2VydCh0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8tPnBXYWl0U2VtYXBob3JlVmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VibWl0LT5zaWduYWxTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSA9IHN1Ym1pdC0+cFNpZ25hbFNlbWFwaG9yZXNbaV07CisgICAgICAgIGNvbnN0IGF1dG8gKnBTZW1hcGhvcmUgPSBHZXRTZW1hcGhvcmVTdGF0ZShzZW1hcGhvcmUpOworICAgICAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiAmJiAhdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVzLTAzMjM5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtRdWV1ZVN1Ym1pdDogJXMgaXMgYSB0aW1lbGluZSBzZW1hcGhvcmUsIGJ1dCBwQmluZEluZm8gZG9lcyBub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUgYW4gaW5zdGFuY2Ugb2YgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc2VtYXBob3JlKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiAmJiB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8gJiYKKyAgICAgICAgICAgIHN1Ym1pdC0+c2lnbmFsU2VtYXBob3JlQ291bnQgIT0gdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLT5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50KSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcE5leHQtMDMyNDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1F1ZXVlU3VibWl0OiAlcyBpcyBhIHRpbWVsaW5lIHNlbWFwaG9yZSwgaXQgY29udGFpbnMgYW4gaW5zdGFuY2Ugb2YiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSLCBidXQgc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudCBpcyBkaWZmZXJlbnQgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25hbFNlbWFwaG9yZUNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIgJiYgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvICYmCisgICAgICAgICAgICB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8tPnBTaWduYWxTZW1hcGhvcmVWYWx1ZXNbaV0gPD0gcFNlbWFwaG9yZS0+cGF5bG9hZCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc2VtYXBob3JlKSwgIlZVSUQtVmtTdWJtaXRJbmZvLXBTaWduYWxTZW1hcGhvcmVzLTAzMjQyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtRdWV1ZVN1Ym1pdDogc2lnbmFsIHZhbHVlIGluICVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgdGltZWxpbmUgc2VtYXBob3JlICVzIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXVlKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSICYmCisgICAgICAgICAgICAocFNlbWFwaG9yZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsIHx8IGludGVybmFsX3NlbWFwaG9yZXMuY291bnQoc2VtYXBob3JlKSkpIHsKKyAgICAgICAgICAgIGlmIChzaWduYWxlZF9zZW1hcGhvcmVzLmNvdW50KHNlbWFwaG9yZSkgfHwgKCEodW5zaWduYWxlZF9zZW1hcGhvcmVzLmNvdW50KHNlbWFwaG9yZSkpICYmIHBTZW1hcGhvcmUtPnNpZ25hbGVkKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9RdWV1ZUZvcndhcmRQcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGlzIHNpZ25hbGluZyAlcyB0aGF0IHdhcyBwcmV2aW91c2x5IHNpZ25hbGVkIGJ5ICVzIGJ1dCBoYXMgbm90IHNpbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZW4gd2FpdGVkIG9uIGJ5IGFueSBxdWV1ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXVlKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwU2VtYXBob3JlLT5zaWduYWxlci5maXJzdCkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVuc2lnbmFsZWRfc2VtYXBob3Jlcy5lcmFzZShzZW1hcGhvcmUpOworICAgICAgICAgICAgICAgIHNpZ25hbGVkX3NlbWFwaG9yZXMuaW5zZXJ0KHNlbWFwaG9yZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFza2lwICYmIHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIpIHsKKyAgICAgICAgICAgIGF1dG8gJnZhbHVlcyA9IHRpbWVsaW5lX3ZhbHVlc1tzZW1hcGhvcmVdOworICAgICAgICAgICAgaWYgKHZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzLmluc2VydChwU2VtYXBob3JlLT5wYXlsb2FkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlcy5pbnNlcnQodGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlTWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UoVmtRdWV1ZSBxdWV1ZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCB1aW50NjRfdCBzZW1hcGhvcmVUcmlnZ2VyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5vcmRlcmVkX21hcDxWa1NlbWFwaG9yZSwgc3RkOjpzZXQ8dWludDY0X3Q+PiAqdGltZWxpbmVfdmFsdWVzX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jX25hbWUsIGNvbnN0IGNoYXIgKnZ1aWQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGF1dG8gJnRpbWVsaW5lX3ZhbHVlcyA9ICp0aW1lbGluZV92YWx1ZXNfYXJnOworICAgIGNvbnN0IGF1dG8gcFNlbWFwaG9yZSA9IEdldFNlbWFwaG9yZVN0YXRlKHNlbWFwaG9yZSk7CisgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIpIHsKKyAgICAgICAgYXNzZXJ0KHNlbWFwaG9yZVRyaWdnZXJWYWx1ZSA+IDApOworCisgICAgICAgIC8vIFRoaXMgc2V0IGNvbnRhaW5zIHRoZSBjdXJyZW50IHBheWxvYWQgdmFsdWUsIHBsdXMgYWxsIHRoZSB3YWl0L3NpZ25hbAorICAgICAgICAvLyB2YWx1ZXMgdGhlIHNlbWFwaG9yZSBjYW4gdGFrZSwgaW4gb3JkZXIKKyAgICAgICAgYXV0byAmdmFsdWVzID0gdGltZWxpbmVfdmFsdWVzW3NlbWFwaG9yZV07CisKKyAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgcHJldmlvdXMgdmFsdWUgYW5kIGNoZWNrIGlmIHRoZSBkaWZmZXJlbmNlIGlzIGJpZ2dlcgorICAgICAgICAvLyB0aGFuIGFsbG93ZWQKKyAgICAgICAgYXV0byBpdCA9IHZhbHVlcy5maW5kKHNlbWFwaG9yZVRyaWdnZXJWYWx1ZSk7CisKKyAgICAgICAgaWYgKGl0ID09IGJlZ2luKHZhbHVlcykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZW1hcGhvcmVUcmlnZ2VyVmFsdWUgLSAqKC0taXQpID4gcGh5c19kZXZfZXh0X3Byb3BzLnRpbWVsaW5lX3NlbWFwaG9yZV9wcm9wcy5tYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc2VtYXBob3JlKSwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIGNvbnRhaW5zIHRpbWVsaW5lIHNlbXBhaG9yZSAlcyB0aGF0IHNldHMgaXRzIHdhaXQgdmFsdWUgd2l0aCBhIG1hcmdpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyZWF0ZXIgdGhhbiBtYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXVlKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNvbW1hbmRCdWZmZXJzRm9yU3VibWl0KFZrUXVldWUgcXVldWUsIGNvbnN0IFZrU3VibWl0SW5mbyAqc3VibWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlU3VicmVzUGFpckxheW91dE1hcCAqbG9jYWxJbWFnZUxheW91dE1hcF9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlNYXAgKmxvY2FsX3F1ZXJ5X3RvX3N0YXRlX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8VmtDb21tYW5kQnVmZmVyPiAqY3VycmVudF9jbWRzX2FyZykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGF1dG8gcXVldWVfc3RhdGUgPSBHZXRRdWV1ZVN0YXRlKHF1ZXVlKTsKKworICAgIEltYWdlU3VicmVzUGFpckxheW91dE1hcCAmbG9jYWxJbWFnZUxheW91dE1hcCA9ICpsb2NhbEltYWdlTGF5b3V0TWFwX2FyZzsKKyAgICB2ZWN0b3I8VmtDb21tYW5kQnVmZmVyPiAmY3VycmVudF9jbWRzID0gKmN1cnJlbnRfY21kc19hcmc7CisKKyAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZHM8VmtJbWFnZU1lbW9yeUJhcnJpZXI+IHFmb19pbWFnZV9zY29yZWJvYXJkczsKKyAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZHM8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPiBxZm9fYnVmZmVyX3Njb3JlYm9hcmRzOworICAgIEV2ZW50VG9TdGFnZU1hcCBsb2NhbEV2ZW50VG9TdGFnZU1hcDsKKworICAgIGNvbnN0IGF1dG8gcGVyZl9zdWJtaXQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSPihzdWJtaXQtPnBOZXh0KTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJtaXQtPmNvbW1hbmRCdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGF1dG8gKmNiX25vZGUgPSBHZXRDQlN0YXRlKHN1Ym1pdC0+cENvbW1hbmRCdWZmZXJzW2ldKTsKKyAgICAgICAgaWYgKGNiX25vZGUpIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDbWRCdWZJbWFnZUxheW91dHMoY2Jfbm9kZSwgaW1hZ2VMYXlvdXRNYXAsICZsb2NhbEltYWdlTGF5b3V0TWFwKTsKKyAgICAgICAgICAgIGN1cnJlbnRfY21kcy5wdXNoX2JhY2soc3VibWl0LT5wQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVByaW1hcnlDb21tYW5kQnVmZmVyU3RhdGUoCisgICAgICAgICAgICAgICAgY2Jfbm9kZSwgKGludClzdGQ6OmNvdW50KGN1cnJlbnRfY21kcy5iZWdpbigpLCBjdXJyZW50X2NtZHMuZW5kKCksIHN1Ym1pdC0+cENvbW1hbmRCdWZmZXJzW2ldKSwKKyAgICAgICAgICAgICAgICAmcWZvX2ltYWdlX3Njb3JlYm9hcmRzLCAmcWZvX2J1ZmZlcl9zY29yZWJvYXJkcyk7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlUXVldWVGYW1pbHlJbmRpY2VzKGNiX25vZGUsIHF1ZXVlKTsKKyAgICAgICAgICAgIFZrUXVlcnlQb29sIGZpcnN0X3F1ZXJ5X3Bvb2wgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVQZXJmb3JtYW5jZVF1ZXJpZXMoY2Jfbm9kZSwgcXVldWUsIGZpcnN0X3F1ZXJ5X3Bvb2wsIHBlcmZfc3VibWl0ID8gcGVyZl9zdWJtaXQtPmNvdW50ZXJQYXNzSW5kZXggOiAwKTsKKworICAgICAgICAgICAgZm9yIChhdXRvIGRlc2NyaXB0b3JTZXQgOiBjYl9ub2RlLT52YWxpZGF0ZV9kZXNjcmlwdG9yc2V0c19pbl9xdWV1ZXN1Ym1pdCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqc2V0X25vZGUgPSBHZXRTZXROb2RlKGRlc2NyaXB0b3JTZXQuZmlyc3QpOworICAgICAgICAgICAgICAgIGlmIChzZXRfbm9kZSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gcGlwZSA6IGRlc2NyaXB0b3JTZXQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gYmluZGluZyA6IHBpcGUuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGR5bmFtaWNPZmZzZXRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgZGF0YSBpc24ndCBhbGxvd2VkIGluIFVQREFURV9BRlRFUl9CSU5ELCBzbyBkeW5hbWljT2Zmc2V0cyBpcyBhbHdheXMgZW1wdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFWYWxpZGF0ZURlc2NyaXB0b3JTZXRCaW5kaW5nRGF0YShjYl9ub2RlLCBzZXRfbm9kZSwgZHluYW1pY09mZnNldHMsIGJpbmRpbmcuZmlyc3QsIGJpbmRpbmcuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrUXVldWVTdWJtaXQoKSIsICZlcnJvcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGVzY3JpcHRvclNldC5maXJzdCksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0Rlc2NyaXB0b3JTZXROb3RVcGRhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGJvdW5kIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBlcnJvciBhdCAlcyB0aW1lOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGRlc2NyaXB0b3JTZXQuZmlyc3QpLmNfc3RyKCksICJ2a1F1ZXVlU3VibWl0KCkiLCBlcnJvci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFBvdGVudGlhbCBlYXJseSBleGl0IGhlcmUgYXMgYmFkIG9iamVjdCBzdGF0ZSBtYXkgY3Jhc2ggaW4gZGVsYXllZCBmdW5jdGlvbiBjYWxscworICAgICAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2FsbCBzdWJtaXQtdGltZSBmdW5jdGlvbnMgdG8gdmFsaWRhdGUgb3IgdXBkYXRlIGxvY2FsIG1pcnJvcnMgb2Ygc3RhdGUgKHRvIHByZXNlcnZlIGNvbnN0LW5lc3MgYXQgdmFsaWRhdGUgdGltZSkKKyAgICAgICAgICAgIGZvciAoYXV0byAmZnVuY3Rpb24gOiBjYl9ub2RlLT5xdWV1ZV9zdWJtaXRfZnVuY3Rpb25zKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBmdW5jdGlvbih0aGlzLCBxdWV1ZV9zdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGF1dG8gJmZ1bmN0aW9uIDogY2Jfbm9kZS0+ZXZlbnRVcGRhdGVzKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBmdW5jdGlvbih0aGlzLCAvKmRvX3ZhbGlkYXRlKi8gdHJ1ZSwgJmxvY2FsRXZlbnRUb1N0YWdlTWFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYXV0byAmZnVuY3Rpb24gOiBjYl9ub2RlLT5xdWVyeVVwZGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGZ1bmN0aW9uKHRoaXMsIC8qZG9fdmFsaWRhdGUqLyB0cnVlLCBsb2NhbF9xdWVyeV90b19zdGF0ZV9tYXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZVF1ZXVlU3VibWl0KFZrUXVldWUgcXVldWUsIHVpbnQzMl90IHN1Ym1pdENvdW50LCBjb25zdCBWa1N1Ym1pdEluZm8gKnBTdWJtaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ZlbmNlIGZlbmNlKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAqcEZlbmNlID0gR2V0RmVuY2VTdGF0ZShmZW5jZSk7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVGZW5jZUZvclN1Ym1pdChwRmVuY2UpOworICAgIGlmIChza2lwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHVub3JkZXJlZF9zZXQ8VmtTZW1hcGhvcmU+IHNpZ25hbGVkX3NlbWFwaG9yZXM7CisgICAgdW5vcmRlcmVkX3NldDxWa1NlbWFwaG9yZT4gdW5zaWduYWxlZF9zZW1hcGhvcmVzOworICAgIHVub3JkZXJlZF9zZXQ8VmtTZW1hcGhvcmU+IGludGVybmFsX3NlbWFwaG9yZXM7CisgICAgdW5vcmRlcmVkX21hcDxWa1NlbWFwaG9yZSwgc3RkOjpzZXQ8dWludDY0X3Q+PiB0aW1lbGluZV92YWx1ZXM7CisgICAgdmVjdG9yPFZrQ29tbWFuZEJ1ZmZlcj4gY3VycmVudF9jbWRzOworICAgIEltYWdlU3VicmVzUGFpckxheW91dE1hcCBsb2NhbEltYWdlTGF5b3V0TWFwOworICAgIFF1ZXJ5TWFwIGxvY2FsX3F1ZXJ5X3RvX3N0YXRlX21hcDsKKworICAgIC8vIE5vdyB2ZXJpZnkgZWFjaCBpbmRpdmlkdWFsIHN1Ym1pdAorICAgIGZvciAodWludDMyX3Qgc3VibWl0X2lkeCA9IDA7IHN1Ym1pdF9pZHggPCBzdWJtaXRDb3VudDsgc3VibWl0X2lkeCsrKSB7CisgICAgICAgIGNvbnN0IFZrU3VibWl0SW5mbyAqc3VibWl0ID0gJnBTdWJtaXRzW3N1Ym1pdF9pZHhdOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlU2VtYXBob3Jlc0ZvclN1Ym1pdChxdWV1ZSwgc3VibWl0LCAmdW5zaWduYWxlZF9zZW1hcGhvcmVzLCAmc2lnbmFsZWRfc2VtYXBob3JlcywgJmludGVybmFsX3NlbWFwaG9yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lbGluZV92YWx1ZXMpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnNGb3JTdWJtaXQocXVldWUsIHN1Ym1pdCwgJmxvY2FsSW1hZ2VMYXlvdXRNYXAsICZsb2NhbF9xdWVyeV90b19zdGF0ZV9tYXAsICZjdXJyZW50X2NtZHMpOworCisgICAgICAgIGF1dG8gY2hhaW5lZF9kZXZpY2VfZ3JvdXBfc3RydWN0ID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtEZXZpY2VHcm91cFN1Ym1pdEluZm8+KHN1Ym1pdC0+cE5leHQpOworICAgICAgICBpZiAoY2hhaW5lZF9kZXZpY2VfZ3JvdXBfc3RydWN0ICYmIGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+Y29tbWFuZEJ1ZmZlckNvdW50ID4gMCkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+Y29tbWFuZEJ1ZmZlckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlRGV2aWNlTWFza1RvUGh5c2ljYWxEZXZpY2VDb3VudChjaGFpbmVkX2RldmljZV9ncm91cF9zdHJ1Y3QtPnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3NbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVCwgSGFuZGxlVG9VaW50NjQocXVldWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLXBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MtMDAwODYiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChza2lwKSByZXR1cm4gc2tpcDsKKworICAgIC8vIE5vdyB2ZXJpZnkgbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UKKyAgICBmb3IgKHVpbnQzMl90IHN1Ym1pdF9pZHggPSAwOyBzdWJtaXRfaWR4IDwgc3VibWl0Q291bnQ7IHN1Ym1pdF9pZHgrKykgeworICAgICAgICBjb25zdCBWa1N1Ym1pdEluZm8gKnN1Ym1pdCA9ICZwU3VibWl0c1tzdWJtaXRfaWR4XTsKKyAgICAgICAgYXV0byAqaW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPihzdWJtaXQtPnBOZXh0KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1Ym1pdC0+d2FpdFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSA9IHN1Ym1pdC0+cFdhaXRTZW1hcGhvcmVzW2ldOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlKHF1ZXVlLCBzZW1hcGhvcmUsIGluZm8gPyBpbmZvLT5wV2FpdFNlbWFwaG9yZVZhbHVlc1tpXSA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVsaW5lX3ZhbHVlcywgIlZrUXVldWVTdWJtaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtMDMyNDMiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VibWl0LT5zaWduYWxTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmUgPSBzdWJtaXQtPnBTaWduYWxTZW1hcGhvcmVzW2ldOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlKHF1ZXVlLCBzZW1hcGhvcmUsIGluZm8gPyBpbmZvLT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzW2ldIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZWxpbmVfdmFsdWVzLCAiVmtRdWV1ZVN1Ym1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJtaXRJbmZvLXBTaWduYWxTZW1hcGhvcmVzLTAzMjQ0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorLy8gQW5kcm9pZC1zcGVjaWZpYyB2YWxpZGF0aW9uIHRoYXQgdXNlcyB0eXBlcyBkZWZpbmVkIG9ubHkgb24gQW5kcm9pZCBhbmQgb25seSBmb3IgTkRLIHZlcnNpb25zCisvLyB0aGF0IHN1cHBvcnQgdGhlIFZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyIGV4dGVuc2lvbi4KKy8vIFRoaXMgY2h1bmsgY291bGQgbW92ZSBpbnRvIGEgc2VwZXJhdGUgY29yZV92YWxpZGF0aW9uX2FuZHJvaWQuY3BwIGZpbGUuLi4gPworCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIE1hcCBleHRlcm5hbCBmb3JtYXQgYW5kIHVzYWdlIGZsYWdzIHRvL2Zyb20gZXF1aXZhbGVudCBWdWxrYW4gZmxhZ3MKKy8vIChUYWJsZXMgYXMgb2YgdjEuMS45MikKKworLy8gQUhhcmR3YXJlQnVmZmVyIEZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgVnVsa2FuIEZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PQorLy8gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNCisvLyBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0KKy8vIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4X1VOT1JNICAgICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk0KKy8vIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjVHNkI1X1VOT1JNICAgICAgICAgIFZLX0ZPUk1BVF9SNUc2QjVfVU5PUk1fUEFDSzE2CisvLyBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxNkcxNkIxNkExNl9GTE9BVCAgICBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NGTE9BVAorLy8gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STSAgICAgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VOT1JNX1BBQ0szMgorLy8gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMTZfVU5PUk0gICAgICAgICAgICAgVktfRk9STUFUX0QxNl9VTk9STQorLy8gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMjRfVU5PUk0gICAgICAgICAgICAgVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzIKKy8vIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQgICAgIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVAorLy8gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMzJfRkxPQVQgICAgICAgICAgICAgVktfRk9STUFUX0QzMl9TRkxPQVQKKy8vIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDMyX0ZMT0FUX1M4X1VJTlQgICAgIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQKKy8vIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUzhfVUlOVCAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9TOF9VSU5UCisKKy8vIFRoZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUXyogYXJlIGFuIGVudW0gaW4gdGhlIE5ESyBoZWFkZXJzLCBidXQgZ2V0IHBhc3NlZCBpbiB0byBWdWxrYW4KKy8vIGFzIHVpbnQzMl90LiBDYXN0aW5nIHRoZSBlbnVtcyBoZXJlIGF2b2lkcyBzY2F0dGVyaW5nIGNhc3RzIGFyb3VuZCBpbiB0aGUgY29kZS4KK3N0ZDo6bWFwPHVpbnQzMl90LCBWa0Zvcm1hdD4gYWhiX2Zvcm1hdF9tYXBfYTJ2ID0geworICAgIHsgKHVpbnQzMl90KUFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4QThfVU5PUk0sICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0gfSwKKyAgICB7ICh1aW50MzJfdClBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNLCAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNIH0sCisgICAgeyAodWludDMyX3QpQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhfVU5PUk0sICAgICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk0gfSwKKyAgICB7ICh1aW50MzJfdClBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I1RzZCNV9VTk9STSwgICAgICAgICAgVktfRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTYgfSwKKyAgICB7ICh1aW50MzJfdClBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxNkcxNkIxNkExNl9GTE9BVCwgICAgVktfRk9STUFUX1IxNkcxNkIxNkExNl9TRkxPQVQgfSwKKyAgICB7ICh1aW50MzJfdClBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNLCAgICAgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VOT1JNX1BBQ0szMiB9LAorICAgIHsgKHVpbnQzMl90KUFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDE2X1VOT1JNLCAgICAgICAgICAgICBWS19GT1JNQVRfRDE2X1VOT1JNIH0sCisgICAgeyAodWludDMyX3QpQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMjRfVU5PUk0sICAgICAgICAgICAgIFZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyIH0sCisgICAgeyAodWludDMyX3QpQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVCwgICAgIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVCB9LAorICAgIHsgKHVpbnQzMl90KUFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDMyX0ZMT0FULCAgICAgICAgICAgICBWS19GT1JNQVRfRDMyX1NGTE9BVCB9LAorICAgIHsgKHVpbnQzMl90KUFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDMyX0ZMT0FUX1M4X1VJTlQsICAgICBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UIH0sCisgICAgeyAodWludDMyX3QpQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9TOF9VSU5ULCAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9TOF9VSU5UIH0KK307CisKKy8vIEFIYXJkd2FyZUJ1ZmZlciBVc2FnZSAgICAgICAgICAgICAgICAgICAgICAgIFZ1bGthbiBVc2FnZSBvciBDcmVhdGlvbiBGbGFnIChJbnRlcm1peGVkIC0gQWFyZ2ghKQorLy8gPT09PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUCisvLyBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUCisvLyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UgICAgICBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVAorLy8gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFICAgICAgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQKKy8vIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUICAgICAgIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUCisvLyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NVQkVfTUFQICAgICAgICAgICBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVAorLy8gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9NSVBNQVBfQ09NUExFVEUgICAgTm9uZQorLy8gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX1BST1RFQ1RFRF9DT05URU5UICAgICAgVktfSU1BR0VfQ1JFQVRFX1BST1RFQ1RFRF9CSVQKKy8vIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQKKy8vIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0NSRUFURV9FWFRFTkRFRF9VU0FHRV9CSVQKKworLy8gU2FtZSBjYXN0aW5nIHJhdGlvbmFsZS4gRGUtbWl4aW5nIHRoZSB0YWJsZSB0byBwcmV2ZW50IHR5cGUgY29uZnVzaW9uIGFuZCBhbGlhc2luZworc3RkOjptYXA8dWludDY0X3QsIFZrSW1hZ2VVc2FnZUZsYWdzPiBhaGJfdXNhZ2VfbWFwX2EydiA9IHsKKyAgICB7ICh1aW50NjRfdClBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UsICAgIChWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUKSB9LAorICAgIHsgKHVpbnQ2NF90KUFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVULCAgICAgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfSwKKyAgICB7ICh1aW50NjRfdClBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSwgIDAgfSwgICAvLyBObyBlcXVpdmFsZW50Cit9OworCitzdGQ6Om1hcDx1aW50NjRfdCwgVmtJbWFnZUNyZWF0ZUZsYWdzPiBhaGJfY3JlYXRlX21hcF9hMnYgPSB7CisgICAgeyAodWludDY0X3QpQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DVUJFX01BUCwgICAgICAgICBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVCB9LAorICAgIHsgKHVpbnQ2NF90KUFIQVJEV0FSRUJVRkZFUl9VU0FHRV9QUk9URUNURURfQ09OVEVOVCwgICAgVktfSU1BR0VfQ1JFQVRFX1BST1RFQ1RFRF9CSVQgfSwKKyAgICB7ICh1aW50NjRfdClBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSwgIDAgfSwgICAvLyBObyBlcXVpdmFsZW50Cit9OworCitzdGQ6Om1hcDxWa0ltYWdlVXNhZ2VGbGFncywgdWludDY0X3Q+IGFoYl91c2FnZV9tYXBfdjJhID0geworICAgIHsgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsICAgICAgICAgICAodWludDY0X3QpQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFIH0sCisgICAgeyBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCwgICh1aW50NjRfdClBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UgfSwKKyAgICB7IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCAgKHVpbnQ2NF90KUFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUICB9LAorfTsKKworc3RkOjptYXA8VmtJbWFnZUNyZWF0ZUZsYWdzLCB1aW50NjRfdD4gYWhiX2NyZWF0ZV9tYXBfdjJhID0geworICAgIHsgVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQsICAodWludDY0X3QpQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DVUJFX01BUCB9LAorICAgIHsgVktfSU1BR0VfQ1JFQVRFX1BST1RFQ1RFRF9CSVQsICAgICAgICAodWludDY0X3QpQUhBUkRXQVJFQlVGRkVSX1VTQUdFX1BST1RFQ1RFRF9DT05URU5UIH0sCit9OworCisvLyBjbGFuZy1mb3JtYXQgb24KKworLy8KKy8vIEFIQi1leHRlbnNpb24gbmV3IEFQSXMKKy8vCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKAorICAgIFZrRGV2aWNlIGRldmljZSwgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciAqYnVmZmVyLCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEICpwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vICBidWZmZXIgbXVzdCBiZSBhIHZhbGlkIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyIG9iamVjdCB3aXRoIGF0IGxlYXN0IG9uZSBvZiB0aGUgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV8qIHVzYWdlIGZsYWdzLgorICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGFoYl9kZXNjOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShidWZmZXIsICZhaGJfZGVzYyk7CisgICAgdWludDMyX3QgcmVxdWlyZWRfZmxhZ3MgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UgfCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NVQkVfTUFQIHwgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9NSVBNQVBfQ09NUExFVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9EQVRBX0JVRkZFUjsKKyAgICBpZiAoMCA9PSAoYWhiX2Rlc2MudXNhZ2UgJiByZXF1aXJlZF9mbGFncykpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELWJ1ZmZlci0wMTg4NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRDogVGhlIEFIYXJkd2FyZUJ1ZmZlcidzIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjLnVzYWdlICgweCUiIFBSSXg2NAorICAgICAgICAgICAgICAgICAgICAgICAgIikgZG9lcyBub3QgaGF2ZSBhbnkgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV8qIGZsYWdzIHNldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYWhiX2Rlc2MudXNhZ2UpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQb3N0Q2FsbFJlY29yZEdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKFZrRGV2aWNlIGRldmljZSwgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgKnBQcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIGF1dG8gYWhiX2Zvcm1hdF9wcm9wcyA9IGx2bF9maW5kX2luX2NoYWluPFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQ+KHBQcm9wZXJ0aWVzLT5wTmV4dCk7CisgICAgaWYgKGFoYl9mb3JtYXRfcHJvcHMpIHsKKyAgICAgICAgYWhiX2V4dF9mb3JtYXRzX3NldC5pbnNlcnQoYWhiX2Zvcm1hdF9wcm9wcy0+ZXh0ZXJuYWxGb3JtYXQpOworICAgIH0KK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyICoqcEJ1ZmZlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUgKm1lbV9pbmZvID0gR2V0RGV2TWVtU3RhdGUocEluZm8tPm1lbW9yeSk7CisKKyAgICAvLyBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQgbXVzdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4KKyAgICAvLyBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb0tIUjo6aGFuZGxlVHlwZXMgd2hlbiBtZW1vcnkgd2FzIGNyZWF0ZWQuCisgICAgaWYgKCFtZW1faW5mby0+aXNfZXhwb3J0IHx8CisgICAgICAgICgwID09IChtZW1faW5mby0+ZXhwb3J0X2hhbmRsZV90eXBlX2ZsYWdzICYgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEKSkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELWhhbmRsZVR5cGVzLTAxODgyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQ6ICVzIHdhcyBub3QgYWxsb2NhdGVkIGZvciBleHBvcnQsIG9yIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwb3J0IGhhbmRsZVR5cGVzICgweCUiIFBSSXgzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikgZGlkIG5vdCBjb250YWluIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwSW5mby0+bWVtb3J5KS5jX3N0cigpLCBtZW1faW5mby0+ZXhwb3J0X2hhbmRsZV90eXBlX2ZsYWdzKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgcE5leHQgY2hhaW4gb2YgdGhlIFZrTWVtb3J5QWxsb2NhdGVJbmZvIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGluY2x1ZGVkIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8KKyAgICAvLyB3aXRoIG5vbi1OVUxMIGltYWdlIG1lbWJlciwgdGhlbiB0aGF0IGltYWdlIG11c3QgYWxyZWFkeSBiZSBib3VuZCB0byBtZW1vcnkuCisgICAgaWYgKG1lbV9pbmZvLT5pc19kZWRpY2F0ZWQgJiYgKFZLX05VTExfSEFORExFICE9IG1lbV9pbmZvLT5kZWRpY2F0ZWRfaW1hZ2UpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKG1lbV9pbmZvLT5kZWRpY2F0ZWRfaW1hZ2UpOworICAgICAgICBpZiAoKG51bGxwdHIgPT0gaW1hZ2Vfc3RhdGUpIHx8ICgwID09IChpbWFnZV9zdGF0ZS0+R2V0Qm91bmRNZW1vcnkoKS5jb3VudChwSW5mby0+bWVtb3J5KSkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELXBOZXh0LTAxODgzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEOiAlcyB3YXMgYWxsb2NhdGVkIHVzaW5nIGEgZGVkaWNhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMsIGJ1dCB0aGF0IGltYWdlIGlzIG5vdCBib3VuZCB0byB0aGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwSW5mby0+bWVtb3J5KS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobWVtX2luZm8tPmRlZGljYXRlZF9pbWFnZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8KKy8vIEFIQi1zcGVjaWZpYyB2YWxpZGF0aW9uIHdpdGhpbiBub24tQUhCIEFQSXMKKy8vCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQWxsb2NhdGVNZW1vcnlBTkRST0lEKGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvICphbGxvY19pbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgYXV0byBpbXBvcnRfYWhiX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEPihhbGxvY19pbmZvLT5wTmV4dCk7CisgICAgYXV0byBleHBfbWVtX2FsbG9jX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbz4oYWxsb2NfaW5mby0+cE5leHQpOworICAgIGF1dG8gbWVtX2RlZF9hbGxvY19pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8+KGFsbG9jX2luZm8tPnBOZXh0KTsKKworICAgIGlmICgoaW1wb3J0X2FoYl9pbmZvKSAmJiAoTlVMTCAhPSBpbXBvcnRfYWhiX2luZm8tPmJ1ZmZlcikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhbiBpbXBvcnQgd2l0aCBoYW5kbGVUeXBlIG9mIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBhaGJfZGVzYyA9IHt9OworICAgICAgICBBSGFyZHdhcmVCdWZmZXJfZGVzY3JpYmUoaW1wb3J0X2FoYl9pbmZvLT5idWZmZXIsICZhaGJfZGVzYyk7CisKKyAgICAgICAgLy8gIElmIGJ1ZmZlciBpcyBub3QgTlVMTCwgaXQgbXVzdCBiZSBhIHZhbGlkIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyIG9iamVjdCB3aXRoIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjOjpmb3JtYXQgYW5kCisgICAgICAgIC8vICBBSGFyZHdhcmVCdWZmZXJfRGVzYzo6dXNhZ2UgY29tcGF0aWJsZSB3aXRoIFZ1bGthbiBhcyBkZXNjcmliZWQgaW4gQW5kcm9pZCBIYXJkd2FyZSBCdWZmZXJzLgorICAgICAgICAvLworICAgICAgICAvLyAgQkxPQiAmIEdQVV9EQVRBX0JVRkZFUiBjb21ibyBzcGVjaWZpY2FsbHkgYWxsb3dlZAorICAgICAgICBpZiAoKEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfQkxPQiAhPSBhaGJfZGVzYy5mb3JtYXQpIHx8ICgwID09IChhaGJfZGVzYy51c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfREFUQV9CVUZGRVIpKSkgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBtdXN0IGJlIGEgY29tYmluYXRpb24gZnJvbSB0aGUgQUhhcmR3YXJlQnVmZmVyIEZvcm1hdCBhbmQgVXNhZ2UgRXF1aXZhbGVuY2UgdGFibGVzCisgICAgICAgICAgICAvLyBVc2FnZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpdCBmcm9tIHRoZSB0YWJsZS4gSXQgbWF5IGhhdmUgYWRkaXRpb25hbCBiaXRzIG5vdCBpbiB0aGUgdGFibGUKKyAgICAgICAgICAgIHVpbnQ2NF90IGFoYl9lcXVpdl91c2FnZV9iaXRzID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFIHwgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DT0xPUl9PVVRQVVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NVQkVfTUFQIHwgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9NSVBNQVBfQ09NUExFVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUFJPVEVDVEVEX0NPTlRFTlQ7CisgICAgICAgICAgICBpZiAoKDAgPT0gKGFoYl9kZXNjLnVzYWdlICYgYWhiX2VxdWl2X3VzYWdlX2JpdHMpKSB8fCAoMCA9PSBhaGJfZm9ybWF0X21hcF9hMnYuY291bnQoYWhiX2Rlc2MuZm9ybWF0KSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1idWZmZXItMDE4ODEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtBbGxvY2F0ZU1lbW9yeTogVGhlIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjJ3MgZm9ybWF0ICggJXUgKSBhbmQvb3IgdXNhZ2UgKCAweCUiIFBSSXg2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggVnVsa2FuLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFoYl9kZXNjLmZvcm1hdCwgYWhiX2Rlc2MudXNhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29sbGVjdCBleHRlcm5hbCBidWZmZXIgaW5mbworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIHBkZWJpID0ge307CisgICAgICAgIHBkZWJpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0JVRkZFUl9JTkZPOworICAgICAgICBwZGViaS5oYW5kbGVUeXBlID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEOworICAgICAgICBpZiAoQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFICYgYWhiX2Rlc2MudXNhZ2UpIHsKKyAgICAgICAgICAgIHBkZWJpLnVzYWdlIHw9IGFoYl91c2FnZV9tYXBfYTJ2W0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUICYgYWhiX2Rlc2MudXNhZ2UpIHsKKyAgICAgICAgICAgIHBkZWJpLnVzYWdlIHw9IGFoYl91c2FnZV9tYXBfYTJ2W0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUXTsKKyAgICAgICAgfQorICAgICAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyBleHRfYnVmX3Byb3BzID0ge307CisgICAgICAgIGV4dF9idWZfcHJvcHMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUzsKKworICAgICAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKHBoeXNpY2FsX2RldmljZSwgJnBkZWJpLCAmZXh0X2J1Zl9wcm9wcyk7CisKKyAgICAgICAgLy8gQ29sbGVjdCBleHRlcm5hbCBmb3JtYXQgaW5mbworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gcGRlaWZpID0ge307CisgICAgICAgIHBkZWlmaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTzsKKyAgICAgICAgcGRlaWZpLmhhbmRsZVR5cGUgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQ7CisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIHBkaWZpMiA9IHt9OworICAgICAgICBwZGlmaTIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMjsKKyAgICAgICAgcGRpZmkyLnBOZXh0ID0gJnBkZWlmaTsKKyAgICAgICAgaWYgKDAgPCBhaGJfZm9ybWF0X21hcF9hMnYuY291bnQoYWhiX2Rlc2MuZm9ybWF0KSkgcGRpZmkyLmZvcm1hdCA9IGFoYl9mb3JtYXRfbWFwX2EydlthaGJfZGVzYy5mb3JtYXRdOworICAgICAgICBwZGlmaTIudHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7ICAgICAgICAgICAvLyBTZWVtcyBsaWtlbHkKKyAgICAgICAgcGRpZmkyLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOyAgLy8gRGl0dG8KKyAgICAgICAgaWYgKEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRSAmIGFoYl9kZXNjLnVzYWdlKSB7CisgICAgICAgICAgICBwZGlmaTIudXNhZ2UgfD0gYWhiX3VzYWdlX21hcF9hMnZbQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DT0xPUl9PVVRQVVQgJiBhaGJfZGVzYy51c2FnZSkgeworICAgICAgICAgICAgcGRpZmkyLnVzYWdlIHw9IGFoYl91c2FnZV9tYXBfYTJ2W0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DVUJFX01BUCAmIGFoYl9kZXNjLnVzYWdlKSB7CisgICAgICAgICAgICBwZGlmaTIuZmxhZ3MgfD0gYWhiX2NyZWF0ZV9tYXBfYTJ2W0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ1VCRV9NQVBdOworICAgICAgICB9CisgICAgICAgIGlmIChBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUFJPVEVDVEVEX0NPTlRFTlQgJiBhaGJfZGVzYy51c2FnZSkgeworICAgICAgICAgICAgcGRpZmkyLmZsYWdzIHw9IGFoYl9jcmVhdGVfbWFwX2EydltBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUFJPVEVDVEVEX0NPTlRFTlRdOworICAgICAgICB9CisKKyAgICAgICAgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyBleHRfaW1nX2ZtdF9wcm9wcyA9IHt9OworICAgICAgICBleHRfaW1nX2ZtdF9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOworICAgICAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgaWZwMiA9IHt9OworICAgICAgICBpZnAyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMjsKKyAgICAgICAgaWZwMi5wTmV4dCA9ICZleHRfaW1nX2ZtdF9wcm9wczsKKworICAgICAgICBWa1Jlc3VsdCBmbXRfbG9va3VwX3Jlc3VsdCA9IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKHBoeXNpY2FsX2RldmljZSwgJnBkaWZpMiwgJmlmcDIpOworCisgICAgICAgIC8vICBJZiBidWZmZXIgaXMgbm90IE5VTEwsIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVycyBtdXN0IGJlIHN1cHBvcnRlZCBmb3IgaW1wb3J0LCBhcyByZXBvcnRlZCBieQorICAgICAgICAvLyAgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyBvciBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcy4KKyAgICAgICAgaWYgKDAgPT0gKGV4dF9idWZfcHJvcHMuZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzLmV4dGVybmFsTWVtb3J5RmVhdHVyZXMgJiBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVCkpIHsKKyAgICAgICAgICAgIGlmICgoVktfU1VDQ0VTUyAhPSBmbXRfbG9va3VwX3Jlc3VsdCkgfHwgKDAgPT0gKGV4dF9pbWdfZm10X3Byb3BzLmV4dGVybmFsTWVtb3J5UHJvcGVydGllcy5leHRlcm5hbE1lbW9yeUZlYXR1cmVzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUKSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1idWZmZXItMDE4ODAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtBbGxvY2F0ZU1lbW9yeTogTmVpdGhlciB0aGUgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyBub3IgdGhlIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdHMgZm9yIHRoZSBBSGFyZHdhcmVCdWZmZXIgaW5jbHVkZSB0aGUgVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQgZmxhZy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHJpZXZlIGJ1ZmZlciBhbmQgZm9ybWF0IHByb3BlcnRpZXMgb2YgdGhlIHByb3ZpZGVkIEFIYXJkd2FyZUJ1ZmZlcgorICAgICAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIGFoYl9mb3JtYXRfcHJvcHMgPSB7fTsKKyAgICAgICAgYWhiX2Zvcm1hdF9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQ7CisgICAgICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgYWhiX3Byb3BzID0ge307CisgICAgICAgIGFoYl9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1BST1BFUlRJRVNfQU5EUk9JRDsKKyAgICAgICAgYWhiX3Byb3BzLnBOZXh0ID0gJmFoYl9mb3JtYXRfcHJvcHM7CisgICAgICAgIERpc3BhdGNoR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoZGV2aWNlLCBpbXBvcnRfYWhiX2luZm8tPmJ1ZmZlciwgJmFoYl9wcm9wcyk7CisKKyAgICAgICAgLy8gYWxsb2NhdGlvblNpemUgbXVzdCBiZSB0aGUgc2l6ZSByZXR1cm5lZCBieSB2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIGZvciB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIKKyAgICAgICAgaWYgKGFsbG9jX2luZm8tPmFsbG9jYXRpb25TaXplICE9IGFoYl9wcm9wcy5hbGxvY2F0aW9uU2l6ZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDIzODMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0FsbG9jYXRlTWVtb3J5OiBWa01lbW9yeUFsbG9jYXRlSW5mbyBzdHJ1Y3Qgd2l0aCBjaGFpbmVkIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3QsIGFsbG9jYXRpb25TaXplICglIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBkb2VzIG5vdCBtYXRjaCB0aGUgQUhhcmR3YXJlQnVmZmVyJ3MgcmVwb3J0ZWQgYWxsb2NhdGlvblNpemUgKCUiIFBSSWQ2NCAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2luZm8tPmFsbG9jYXRpb25TaXplLCBhaGJfcHJvcHMuYWxsb2NhdGlvblNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWVtb3J5VHlwZUluZGV4IG11c3QgYmUgb25lIG9mIHRob3NlIHJldHVybmVkIGJ5IHZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgZm9yIHRoZSBBSGFyZHdhcmVCdWZmZXIKKyAgICAgICAgLy8gTm90ZTogbWVtb3J5VHlwZUluZGV4IGlzIGFuIGluZGV4LCBtZW1vcnlUeXBlQml0cyBpcyBhIGJpdG1hc2sKKyAgICAgICAgdWludDMyX3QgbWVtX3R5cGVfYml0bWFzayA9IDEgPDwgYWxsb2NfaW5mby0+bWVtb3J5VHlwZUluZGV4OworICAgICAgICBpZiAoMCA9PSAobWVtX3R5cGVfYml0bWFzayAmIGFoYl9wcm9wcy5tZW1vcnlUeXBlQml0cykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW1lbW9yeVR5cGVJbmRleC0wMjM4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQWxsb2NhdGVNZW1vcnk6IFZrTWVtb3J5QWxsb2NhdGVJbmZvIHN0cnVjdCB3aXRoIGNoYWluZWQgVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdCwgbWVtb3J5VHlwZUluZGV4ICglIiBQUklkMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgYml0IHNldCBpbiBBSGFyZHdhcmVCdWZmZXIncyByZXBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeVR5cGVCaXRzIGJpdG1hc2sgKDB4JSIgUFJJeDMyICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfaW5mby0+bWVtb3J5VHlwZUluZGV4LCBhaGJfcHJvcHMubWVtb3J5VHlwZUJpdHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2tzIGZvciBhbGxvY2F0aW9ucyB3aXRob3V0IGEgZGVkaWNhdGVkIGFsbG9jYXRpb24gcmVxdWlyZW1lbnQKKyAgICAgICAgaWYgKChudWxscHRyID09IG1lbV9kZWRfYWxsb2NfaW5mbykgfHwgKFZLX05VTExfSEFORExFID09IG1lbV9kZWRfYWxsb2NfaW5mby0+aW1hZ2UpKSB7CisgICAgICAgICAgICAvLyB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIgbXVzdCBoYXZlIGEgZm9ybWF0IG9mIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfQkxPQiBhbmQgYSB1c2FnZSB0aGF0IGluY2x1ZGVzCisgICAgICAgICAgICAvLyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0RBVEFfQlVGRkVSCisgICAgICAgICAgICBpZiAoKCh1aW50NjRfdClBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0JMT0IgIT0gYWhiX2Rlc2MuZm9ybWF0KSB8fAorICAgICAgICAgICAgICAgICgwID09IChhaGJfZGVzYy51c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfREFUQV9CVUZGRVIpKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODQiLAorICAgICAgICAgICAgICAgICAgICAidmtBbGxvY2F0ZU1lbW9yeTogVmtNZW1vcnlBbGxvY2F0ZUluZm8gc3RydWN0IHdpdGggY2hhaW5lZCBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICIKKyAgICAgICAgICAgICAgICAgICAgInN0cnVjdCB3aXRob3V0IGEgZGVkaWNhdGVkIGFsbG9jYXRpb24gcmVxdWlyZW1lbnQsIHdoaWxlIHRoZSBBSGFyZHdhcmVCdWZmZXJfRGVzYydzIGZvcm1hdCAoICV1ICkgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgIkFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfQkxPQiBvciB1c2FnZSAoMHglIiBQUkl4NjQgIikgZG9lcyBub3QgaW5jbHVkZSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0RBVEFfQlVGRkVSLiIsCisgICAgICAgICAgICAgICAgICAgIGFoYl9kZXNjLmZvcm1hdCwgYWhiX2Rlc2MudXNhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgLy8gQ2hlY2tzIHNwZWNpZmljIHRvIGltcG9ydCB3aXRoIGEgZGVkaWNhdGVkIGFsbG9jYXRpb24gcmVxdWlyZW1lbnQKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppY2kgPSAmKEdldEltYWdlU3RhdGUobWVtX2RlZF9hbGxvY19pbmZvLT5pbWFnZSktPmNyZWF0ZUluZm8pOworCisgICAgICAgICAgICAvLyBUaGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIncyB1c2FnZSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG9mIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUIG9yCisgICAgICAgICAgICAvLyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UKKyAgICAgICAgICAgIGlmICgwID09IChhaGJfZGVzYy51c2FnZSAmIChBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCB8IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRSkpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjM4NiIsCisgICAgICAgICAgICAgICAgICAgICJ2a0FsbG9jYXRlTWVtb3J5OiBWa01lbW9yeUFsbG9jYXRlSW5mbyBzdHJ1Y3Qgd2l0aCBjaGFpbmVkIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgYW5kIGEgIgorICAgICAgICAgICAgICAgICAgICAiZGVkaWNhdGVkIGFsbG9jYXRpb24gcmVxdWlyZW1lbnQsIHdoaWxlIHRoZSBBSGFyZHdhcmVCdWZmZXIncyB1c2FnZSAoMHglIiBQUkl4NjQKKyAgICAgICAgICAgICAgICAgICAgIikgY29udGFpbnMgbmVpdGhlciBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCBub3IgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFLiIsCisgICAgICAgICAgICAgICAgICAgIGFoYl9kZXNjLnVzYWdlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gIHRoZSBmb3JtYXQgb2YgaW1hZ2UgbXVzdCBiZSBWS19GT1JNQVRfVU5ERUZJTkVEIG9yIHRoZSBmb3JtYXQgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgIC8vICB2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lECisgICAgICAgICAgICBpZiAoKGljaS0+Zm9ybWF0ICE9IGFoYl9mb3JtYXRfcHJvcHMuZm9ybWF0KSAmJiAoVktfRk9STUFUX1VOREVGSU5FRCAhPSBpY2ktPmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtBbGxvY2F0ZU1lbW9yeTogVmtNZW1vcnlBbGxvY2F0ZUluZm8gc3RydWN0IHdpdGggY2hhaW5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELCB0aGUgZGVkaWNhdGVkIGFsbG9jYXRpb24gaW1hZ2UncyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgKCVzKSBpcyBub3QgVktfRk9STUFUX1VOREVGSU5FRCBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIEFIYXJkd2FyZUJ1ZmZlcidzIGZvcm1hdCAoJXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0Zvcm1hdChpY2ktPmZvcm1hdCksIHN0cmluZ19Wa0Zvcm1hdChhaGJfZm9ybWF0X3Byb3BzLmZvcm1hdCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgd2lkdGgsIGhlaWdodCwgYW5kIGFycmF5IGxheWVyIGRpbWVuc2lvbnMgb2YgaW1hZ2UgYW5kIHRoZSBBbmRyb2lkIGhhcmR3YXJlYnVmZmVyIG11c3QgYmUgaWRlbnRpY2FsCisgICAgICAgICAgICBpZiAoKGljaS0+ZXh0ZW50LndpZHRoICE9IGFoYl9kZXNjLndpZHRoKSB8fCAoaWNpLT5leHRlbnQuaGVpZ2h0ICE9IGFoYl9kZXNjLmhlaWdodCkgfHwKKyAgICAgICAgICAgICAgICAoaWNpLT5hcnJheUxheWVycyAhPSBhaGJfZGVzYy5sYXllcnMpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQWxsb2NhdGVNZW1vcnk6IFZrTWVtb3J5QWxsb2NhdGVJbmZvIHN0cnVjdCB3aXRoIGNoYWluZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCwgdGhlIGRlZGljYXRlZCBhbGxvY2F0aW9uIGltYWdlJ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGgsIGhlaWdodCwgYW5kIGFycmF5TGF5ZXJzICglIiBQUklkMzIgIiAlIiBQUklkMzIgIiAlIiBQUklkMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZG8gbm90IG1hdGNoIHRob3NlIG9mIHRoZSBBSGFyZHdhcmVCdWZmZXIgKCUiIFBSSWQzMiAiICUiIFBSSWQzMiAiICUiIFBSSWQzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2ktPmV4dGVudC53aWR0aCwgaWNpLT5leHRlbnQuaGVpZ2h0LCBpY2ktPmFycmF5TGF5ZXJzLCBhaGJfZGVzYy53aWR0aCwgYWhiX2Rlc2MuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaGJfZGVzYy5sYXllcnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIncyB1c2FnZSBpbmNsdWRlcyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSwgdGhlIGltYWdlIG11c3QKKyAgICAgICAgICAgIC8vIGhhdmUgZWl0aGVyIGEgZnVsbCBtaXBtYXAgY2hhaW4gb3IgZXhhY3RseSAxIG1pcCBsZXZlbC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBOT1RFISBUaGUgbGFuZ3VhZ2Ugb2YgdGhpcyBWVUlEIGNvbnRyYWRpY3RzIHRoZSBsYW5ndWFnZSBpbiB0aGUgc3BlYyAoMS4xLjkzKSwgd2hpY2ggc2F5cyAiVGhlCisgICAgICAgICAgICAvLyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSBmbGFnIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBWdWxrYW4gaW1hZ2UgdXNhZ2Ugb3IgY3JlYXRpb24gZmxhZy4gSW5zdGVhZCwKKyAgICAgICAgICAgIC8vIGl0cyBwcmVzZW5jZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIgY29udGFpbnMgYSBjb21wbGV0ZSBtaXBtYXAgY2hhaW4sIGFuZCBpdHMgYWJzZW5jZSBpbmRpY2F0ZXMKKyAgICAgICAgICAgIC8vIHRoYXQgdGhlIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyIGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgbWlwIGxldmVsLiIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgVlVJRCdzIG1lYW5pbmcsIGJ1dCBpdCBzZWVtcyBsaWtlbHkgdGhhdCB0aGUgc3BlYyB0ZXh0IGlzIGFjdHVhbGx5IGNvcnJlY3QuCisgICAgICAgICAgICAvLyBDbGFyaWZpY2F0aW9uIHJlcXVlc3RlZC4KKyAgICAgICAgICAgIGlmICgoYWhiX2Rlc2MudXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSkgJiYgKGljaS0+bWlwTGV2ZWxzICE9IDEpICYmCisgICAgICAgICAgICAgICAgKGljaS0+bWlwTGV2ZWxzICE9IEZ1bGxNaXBDaGFpbkxldmVscyhpY2ktPmV4dGVudCkpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0FsbG9jYXRlTWVtb3J5OiBWa01lbW9yeUFsbG9jYXRlSW5mbyBzdHJ1Y3Qgd2l0aCBjaGFpbmVkIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNhZ2UgaW5jbHVkZXMgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9NSVBNQVBfQ09NUExFVEUgYnV0IG1pcExldmVscyAoJSIgUFJJZDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgbmVpdGhlciAxIG5vciBmdWxsIG1pcCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYWluIGxldmVscyAoJSIgUFJJZDMyICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNpLT5taXBMZXZlbHMsIEZ1bGxNaXBDaGFpbkxldmVscyhpY2ktPmV4dGVudCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBlYWNoIGJpdCBzZXQgaW4gdGhlIHVzYWdlIG9mIGltYWdlIG11c3QgYmUgbGlzdGVkIGluIEFIYXJkd2FyZUJ1ZmZlciBVc2FnZSBFcXVpdmFsZW5jZSwgYW5kIGlmIHRoZXJlIGlzIGEKKyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgQUhBUkRXQVJFQlVGRkVSX1VTQUdFIGJpdCBsaXN0ZWQgdGhhdCBiaXQgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIncworICAgICAgICAgICAgLy8gQUhhcmR3YXJlQnVmZmVyX0Rlc2M6OnVzYWdlCisgICAgICAgICAgICBpZiAoaWNpLT51c2FnZSAmCisgICAgICAgICAgICAgICAgfihWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfAorICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzOTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0FsbG9jYXRlTWVtb3J5OiBWa01lbW9yeUFsbG9jYXRlSW5mbyBzdHJ1Y3Qgd2l0aCBjaGFpbmVkIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVkaWNhdGVkIGltYWdlIHVzYWdlIGJpdHMgaW5jbHVkZSBvbmUgb3IgbW9yZSB3aXRoIG5vIEFIYXJkd2FyZUJ1ZmZlciBlcXVpdmFsZW50LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGlsbGVnYWxfdXNhZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZrSW1hZ2VVc2FnZUZsYWdzPiB1c2FnZXMgPSB7VktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVH07CisgICAgICAgICAgICBmb3IgKFZrSW1hZ2VVc2FnZUZsYWdzIHViaXQgOiB1c2FnZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWNpLT51c2FnZSAmIHViaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYWhiX3VzYWdlID0gYWhiX3VzYWdlX21hcF92MmFbdWJpdF07CisgICAgICAgICAgICAgICAgICAgIGlmICgwID09IChhaGJfdXNhZ2UgJiBhaGJfZGVzYy51c2FnZSkpIGlsbGVnYWxfdXNhZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbGxlZ2FsX3VzYWdlKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzkwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQWxsb2NhdGVNZW1vcnk6IFZrTWVtb3J5QWxsb2NhdGVJbmZvIHN0cnVjdCB3aXRoIGNoYWluZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCwgb25lIG9yIG1vcmUgQUhhcmR3YXJlQnVmZmVyIHVzYWdlIGJpdHMgZXF1aXZhbGVudCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcHJvdmlkZWQgaW1hZ2UncyB1c2FnZSBiaXRzIGFyZSBtaXNzaW5nIGZyb20gQUhhcmR3YXJlQnVmZmVyX0Rlc2MudXNhZ2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8gTm90IGFuIGltcG9ydAorICAgICAgICBpZiAoKGV4cF9tZW1fYWxsb2NfaW5mbykgJiYgKG1lbV9kZWRfYWxsb2NfaW5mbykgJiYKKyAgICAgICAgICAgICgwICE9IChWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQgJiBleHBfbWVtX2FsbG9jX2luZm8tPmhhbmRsZVR5cGVzKSkgJiYKKyAgICAgICAgICAgIChWS19OVUxMX0hBTkRMRSAhPSBtZW1fZGVkX2FsbG9jX2luZm8tPmltYWdlKSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBBbmRyb2lkIEhXIEJ1ZmZlciBleHBvcnQKKyAgICAgICAgICAgIGlmICgwICE9IGFsbG9jX2luZm8tPmFsbG9jYXRpb25TaXplKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAxODc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQWxsb2NhdGVNZW1vcnk6IHBOZXh0IGNoYWluIGluZGljYXRlcyBhIGRlZGljYXRlZCBBbmRyb2lkIEhhcmR3YXJlIEJ1ZmZlciBleHBvcnQgYWxsb2NhdGlvbiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGFsbG9jYXRpb25TaXplIGlzIG5vbi16ZXJvLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKDAgPT0gYWxsb2NfaW5mby0+YWxsb2NhdGlvblNpemUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAxODc0IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQWxsb2NhdGVNZW1vcnk6IHBOZXh0IGNoYWluIGRvZXMgbm90IGluZGljYXRlIGEgZGVkaWNhdGVkIGV4cG9ydCBhbGxvY2F0aW9uLCBidXQgYWxsb2NhdGlvblNpemUgaXMgMC4iKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJBTkRST0lEKGNvbnN0IFZrSW1hZ2UgaW1hZ2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworICAgIGlmIChpbWFnZV9zdGF0ZS0+aW1wb3J0ZWRfYWhiICYmICgwID09IGltYWdlX3N0YXRlLT5HZXRCb3VuZE1lbW9yeSgpLnNpemUoKSkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgSGFuZGxlVG9VaW50NjQoaW1hZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLTAxODk3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjogQXR0ZW1wdCB0byBxdWVyeSBsYXlvdXQgZnJvbSBhbiBpbWFnZSBjcmVhdGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCBoYW5kbGVUeXBlLCB3aGljaCBoYXMgbm90IHlldCBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJib3VuZCB0byBtZW1vcnkuIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitzdGF0aWMgYm9vbCBWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMkFORFJPSUQoY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yICpwSW1hZ2VGb3JtYXRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAqcEltYWdlRm9ybWF0UHJvcGVydGllcykgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEICphaGJfdXNhZ2UgPQorICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRD4ocEltYWdlRm9ybWF0UHJvcGVydGllcy0+cE5leHQpOworICAgIGlmIChudWxscHRyICE9IGFoYl91c2FnZSkgeworICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gKnBkZWlmaSA9CisgICAgICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8+KHBJbWFnZUZvcm1hdEluZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKChudWxscHRyID09IHBkZWlmaSkgfHwgKFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCAhPSBwZGVpZmktPmhhbmRsZVR5cGUpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcE5leHQtMDE4NjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjogcEltYWdlRm9ybWF0UHJvcGVydGllcyBpbmNsdWRlcyBhIGNoYWluZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBzdHJ1Y3QsIGJ1dCBwSW1hZ2VGb3JtYXRJbmZvIGRvZXMgbm90IGluY2x1ZGUgYSBjaGFpbmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIHN0cnVjdCB3aXRoIGhhbmRsZVR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uQU5EUk9JRChjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICpjcmVhdGVfaW5mbykgY29uc3QgeworICAgIGNvbnN0IFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEICpleHRfZm9ybWF0X2FuZHJvaWQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0V4dGVybmFsRm9ybWF0QU5EUk9JRD4oY3JlYXRlX2luZm8tPnBOZXh0KTsKKyAgICBpZiAoKG51bGxwdHIgIT0gZXh0X2Zvcm1hdF9hbmRyb2lkKSAmJiAoMCAhPSBleHRfZm9ybWF0X2FuZHJvaWQtPmV4dGVybmFsRm9ybWF0KSkgeworICAgICAgICBpZiAoVktfRk9STUFUX1VOREVGSU5FRCAhPSBjcmVhdGVfaW5mby0+Zm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JtYXQtMDE5MDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbltLSFJdOiBDcmVhdGVJbmZvIGZvcm1hdCBpcyBub3QgVktfRk9STUFUX1VOREVGSU5FRCB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlcmUgaXMgYSBjaGFpbmVkIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHN0cnVjdC4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoVktfRk9STUFUX1VOREVGSU5FRCA9PSBjcmVhdGVfaW5mby0+Zm9ybWF0KSB7CisgICAgICAgIHJldHVybiBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tZm9ybWF0LTAxOTA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbltLSFJdOiBDcmVhdGVJbmZvIGZvcm1hdCBpcyBWS19GT1JNQVRfVU5ERUZJTkVEIHdpdGggbm8gY2hhaW5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBzdHJ1Y3QuIik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2Vsc2UgIC8vICFWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUFsbG9jYXRlTWVtb3J5QU5EUk9JRChjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyAqYWxsb2NfaW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworc3RhdGljIGJvb2wgVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJBTkRST0lEKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAqcEltYWdlRm9ybWF0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgKnBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uQU5EUk9JRChjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICpjcmVhdGVfaW5mbykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMkFORFJPSUQoY29uc3QgVmtJbWFnZSBpbWFnZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvICpwQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRGV2aWNlTWVtb3J5ICpwTWVtb3J5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKG1lbU9iak1hcC5zaXplKCkgPj0gcGh5c19kZXZfcHJvcHMubGltaXRzLm1heE1lbW9yeUFsbG9jYXRpb25Db3VudCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkLCAiTnVtYmVyIG9mIGN1cnJlbnRseSB2YWxpZCBtZW1vcnkgb2JqZWN0cyBpcyBub3QgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIGFsbG93ZWQgKCV1KS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heE1lbW9yeUFsbG9jYXRpb25Db3VudCk7CisgICAgfQorCisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2FuZHJvaWRfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVBbGxvY2F0ZU1lbW9yeUFORFJPSUQocEFsbG9jYXRlSW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKDAgPT0gcEFsbG9jYXRlSW5mby0+YWxsb2NhdGlvblNpemUpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1hbGxvY2F0aW9uU2l6ZS0wMDYzOCIsICJ2a0FsbG9jYXRlTWVtb3J5OiBhbGxvY2F0aW9uU2l6ZSBpcyAwLiIpOworICAgICAgICB9OworICAgIH0KKworICAgIGF1dG8gY2hhaW5lZF9mbGFnc19zdHJ1Y3QgPSBsdmxfZmluZF9pbl9jaGFpbjxWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvPihwQWxsb2NhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGNoYWluZWRfZmxhZ3Nfc3RydWN0ICYmIGNoYWluZWRfZmxhZ3Nfc3RydWN0LT5mbGFncyA9PSBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVEZXZpY2VNYXNrVG9QaHlzaWNhbERldmljZUNvdW50KGNoYWluZWRfZmxhZ3Nfc3RydWN0LT5kZXZpY2VNYXNrLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mby1kZXZpY2VNYXNrLTAwNjc1Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVEZXZpY2VNYXNrVG9aZXJvKGNoYWluZWRfZmxhZ3Nfc3RydWN0LT5kZXZpY2VNYXNrLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mby1kZXZpY2VNYXNrLTAwNjc2Iik7CisgICAgfQorCisgICAgaWYgKHBBbGxvY2F0ZUluZm8tPm1lbW9yeVR5cGVJbmRleCA+PSBwaHlzX2Rldl9tZW1fcHJvcHMubWVtb3J5VHlwZUNvdW50KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1wQWxsb2NhdGVJbmZvLTAxNzE0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0FsbG9jYXRlTWVtb3J5OiBhdHRlbXB0aW5nIHRvIGFsbG9jYXRlIG1lbW9yeSB0eXBlICV1LCB3aGljaCBpcyBub3QgYSB2YWxpZCBpbmRleC4gRGV2aWNlIG9ubHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgImFkdmVydGlzZXMgJXUgbWVtb3J5IHR5cGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLT5tZW1vcnlUeXBlSW5kZXgsIHBoeXNfZGV2X21lbV9wcm9wcy5tZW1vcnlUeXBlQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwQWxsb2NhdGVJbmZvLT5hbGxvY2F0aW9uU2l6ZSA+CisgICAgICAgICAgICBwaHlzX2Rldl9tZW1fcHJvcHMubWVtb3J5SGVhcHNbcGh5c19kZXZfbWVtX3Byb3BzLm1lbW9yeVR5cGVzW3BBbGxvY2F0ZUluZm8tPm1lbW9yeVR5cGVJbmRleF0uaGVhcEluZGV4XS5zaXplKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAiVlVJRC12a0FsbG9jYXRlTWVtb3J5LXBBbGxvY2F0ZUluZm8tMDE3MTMiLAorICAgICAgICAgICAgICAgICJ2a0FsbG9jYXRlTWVtb3J5OiBhdHRlbXB0aW5nIHRvIGFsbG9jYXRlICUiIFBSSXU2NAorICAgICAgICAgICAgICAgICIgYnl0ZXMgZnJvbSBoZWFwICV1LCIKKyAgICAgICAgICAgICAgICAiYnV0IHNpemUgb2YgdGhhdCBoZWFwIGlzIG9ubHkgJSIgUFJJdTY0ICIgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLT5hbGxvY2F0aW9uU2l6ZSwgcGh5c19kZXZfbWVtX3Byb3BzLm1lbW9yeVR5cGVzW3BBbGxvY2F0ZUluZm8tPm1lbW9yeVR5cGVJbmRleF0uaGVhcEluZGV4LAorICAgICAgICAgICAgICAgIHBoeXNfZGV2X21lbV9wcm9wcy5tZW1vcnlIZWFwc1twaHlzX2Rldl9tZW1fcHJvcHMubWVtb3J5VHlwZXNbcEFsbG9jYXRlSW5mby0+bWVtb3J5VHlwZUluZGV4XS5oZWFwSW5kZXhdLnNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmRldmljZV9jb2hlcmVudF9tZW1vcnlfZmVhdHVyZXMuZGV2aWNlQ29oZXJlbnRNZW1vcnkgJiYKKyAgICAgICAgICAgICgocGh5c19kZXZfbWVtX3Byb3BzLm1lbW9yeVR5cGVzW3BBbGxvY2F0ZUluZm8tPm1lbW9yeVR5cGVJbmRleF0ucHJvcGVydHlGbGFncyAmCisgICAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfQ09IRVJFTlRfQklUX0FNRCkgIT0gMCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELXZrQWxsb2NhdGVNZW1vcnktZGV2aWNlQ29oZXJlbnRNZW1vcnktMDI3OTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0FsbG9jYXRlTWVtb3J5OiBhdHRlbXB0aW5nIHRvIGFsbG9jYXRlIG1lbW9yeSB0eXBlICV1LCB3aGljaCBpbmNsdWRlcyB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0NPSEVSRU5UX0JJVF9BTUQgbWVtb3J5IHByb3BlcnR5LCBidXQgdGhlIGRldmljZUNvaGVyZW50TWVtb3J5IGZlYXR1cmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8tPm1lbW9yeVR5cGVJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiBWVUlEcyBlbmRpbmcgaW4gMDA2NDMsIDAwNjQ0LCAwMDY0NiwgMDA2NDcsIDAxNzQyLCAwMTc0MywgMDE3NDUsIDAwNjQ1LCAwMDY0OCwgMDE3NDQKKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gRm9yIGdpdmVuIG9iaiBub2RlLCBpZiBpdCBpcyB1c2UsIGZsYWcgYSB2YWxpZGF0aW9uIGVycm9yIGFuZCByZXR1cm4gY2FsbGJhY2sgcmVzdWx0LCBlbHNlIHJldHVybiBmYWxzZQorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZU9iamVjdE5vdEluVXNlKGNvbnN0IEJBU0VfTk9ERSAqb2JqX25vZGUsIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlICZvYmpfc3RydWN0LCBjb25zdCBjaGFyICpjYWxsZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9jb2RlKSBjb25zdCB7CisgICAgaWYgKGRpc2FibGVkLm9iamVjdF9pbl91c2UpIHJldHVybiBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAob2JqX25vZGUtPmluX3VzZS5sb2FkKCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZ2V0X2RlYnVnX3JlcG9ydF9lbnVtW29ial9zdHJ1Y3QudHlwZV0sIG9ial9zdHJ1Y3QuaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSwgIkNhbm5vdCBjYWxsICVzIG9uICVzIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZSBieSBhIGNvbW1hbmQgYnVmZmVyLiIsIGNhbGxlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShvYmpfc3RydWN0KS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRnJlZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgY29uc3QgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW0pOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QobWVtLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeSk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3ROb3RJblVzZShtZW1faW5mbywgb2JqX3N0cnVjdCwgInZrRnJlZU1lbW9yeSIsICJWVUlELXZrRnJlZU1lbW9yeS1tZW1vcnktMDA2NzciKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIFZhbGlkYXRlIHRoYXQgZ2l2ZW4gTWFwIG1lbW9yeSByYW5nZSBpcyB2YWxpZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZW1vcnkgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG1hcHBlZCwKKy8vICBhbmQgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgbWFwIHJhbmdlIHNob3VsZCBiZToKKy8vICAxLiBOb3QgemVybworLy8gIDIuIFdpdGhpbiB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24KK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVNYXBNZW1SYW5nZShjb25zdCBERVZJQ0VfTUVNT1JZX1NUQVRFICptZW1faW5mbywgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhc3NlcnQobWVtX2luZm8pOworICAgIGNvbnN0IGF1dG8gbWVtID0gbWVtX2luZm8tPm1lbTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHNraXAgPQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwgSGFuZGxlVG9VaW50NjQobWVtKSwKKyAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9NZW1UcmFja19JbnZhbGlkTWFwLCAiVmtNYXBNZW1vcnk6IEF0dGVtcHRpbmcgdG8gbWFwIG1lbW9yeSByYW5nZSBvZiBzaXplIHplcm8iKTsKKyAgICB9CisKKyAgICAvLyBJdCBpcyBhbiBhcHBsaWNhdGlvbiBlcnJvciB0byBjYWxsIFZrTWFwTWVtb3J5IG9uIGFuIG9iamVjdCB0aGF0IGlzIGFscmVhZHkgbWFwcGVkCisgICAgaWYgKG1lbV9pbmZvLT5tYXBwZWRfcmFuZ2Uuc2l6ZSAhPSAwKSB7CisgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChtZW0pLCBrVlVJRF9Db3JlX01lbVRyYWNrX0ludmFsaWRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICJWa01hcE1lbW9yeTogQXR0ZW1wdGluZyB0byBtYXAgbWVtb3J5IG9uIGFuIGFscmVhZHktbWFwcGVkICVzLiIsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobWVtKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IG9mZnNldCArIHNpemUgaXMgd2l0aGluIG9iamVjdCdzIGFsbG9jYXRpb25TaXplCisgICAgaWYgKHNpemUgPT0gVktfV0hPTEVfU0laRSkgeworICAgICAgICBpZiAob2Zmc2V0ID49IG1lbV9pbmZvLT5hbGxvY19pbmZvLmFsbG9jYXRpb25TaXplKSB7CisgICAgICAgICAgICBza2lwID0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KG1lbSksIGtWVUlEX0NvcmVfTWVtVHJhY2tfSW52YWxpZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXBwaW5nIE1lbW9yeSBmcm9tIDB4JSIgUFJJeDY0ICIgdG8gMHglIiBQUkl4NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBzaXplIG9mIFZLX1dIT0xFX1NJWkUgb3ZlcnN0ZXBzIHRvdGFsIGFycmF5IHNpemUgMHglIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG1lbV9pbmZvLT5hbGxvY19pbmZvLmFsbG9jYXRpb25TaXplLCBtZW1faW5mby0+YWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKG9mZnNldCArIHNpemUpID4gbWVtX2luZm8tPmFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUpIHsKKyAgICAgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtKSwgIlZVSUQtdmtNYXBNZW1vcnktc2l6ZS0wMDY4MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFwcGluZyBNZW1vcnkgZnJvbSAweCUiIFBSSXg2NCAiIHRvIDB4JSIgUFJJeDY0ICIgb3ZlcnN0ZXBzIHRvdGFsIGFycmF5IHNpemUgMHglIiBQUkl4NjQgIi4iLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICsgb2Zmc2V0LCBtZW1faW5mby0+YWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIEd1YXJkIHZhbHVlIGZvciBwYWQgZGF0YQorc3RhdGljIGNoYXIgTm9uY29oZXJlbnRNZW1vcnlGaWxsVmFsdWUgPSAweGI7CisKK3ZvaWQgQ29yZUNoZWNrczo6SW5pdGlhbGl6ZVNoYWRvd01lbW9yeShWa0RldmljZU1lbW9yeSBtZW0sIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCB2b2lkICoqcHBEYXRhKSB7CisgICAgYXV0byBtZW1faW5mbyA9IEdldERldk1lbVN0YXRlKG1lbSk7CisgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgIHVpbnQzMl90IGluZGV4ID0gbWVtX2luZm8tPmFsbG9jX2luZm8ubWVtb3J5VHlwZUluZGV4OworICAgICAgICBpZiAocGh5c19kZXZfbWVtX3Byb3BzLm1lbW9yeVR5cGVzW2luZGV4XS5wcm9wZXJ0eUZsYWdzICYgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUKSB7CisgICAgICAgICAgICBtZW1faW5mby0+c2hhZG93X2NvcHkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNpemUgPT0gVktfV0hPTEVfU0laRSkgeworICAgICAgICAgICAgICAgIHNpemUgPSBtZW1faW5mby0+YWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSAtIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbV9pbmZvLT5zaGFkb3dfcGFkX3NpemUgPSBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWluTWVtb3J5TWFwQWxpZ25tZW50OworICAgICAgICAgICAgYXNzZXJ0KFNhZmVNb2R1bG8obWVtX2luZm8tPnNoYWRvd19wYWRfc2l6ZSwgcGh5c19kZXZfcHJvcHMubGltaXRzLm1pbk1lbW9yeU1hcEFsaWdubWVudCkgPT0gMCk7CisgICAgICAgICAgICAvLyBFbnN1cmUgc3RhcnQgb2YgbWFwcGVkIHJlZ2lvbiByZWZsZWN0cyBoYXJkd2FyZSBhbGlnbm1lbnQgY29uc3RyYWludHMKKyAgICAgICAgICAgIHVpbnQ2NF90IG1hcF9hbGlnbm1lbnQgPSBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWluTWVtb3J5TWFwQWxpZ25tZW50OworCisgICAgICAgICAgICAvLyBGcm9tIHNwZWM6IChwcERhdGEgLSBvZmZzZXQpIG11c3QgYmUgYWxpZ25lZCB0byBhdCBsZWFzdCBsaW1pdHM6Om1pbk1lbW9yeU1hcEFsaWdubWVudC4KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXJ0X29mZnNldCA9IG9mZnNldCAlIG1hcF9hbGlnbm1lbnQ7CisgICAgICAgICAgICAvLyBEYXRhIHBhc3NlZCB0byBkcml2ZXIgd2lsbCBiZSB3cmFwcGVkIGJ5IGEgZ3VhcmRiYW5kIG9mIGRhdGEgdG8gZGV0ZWN0IG92ZXItIG9yIHVuZGVyLXdyaXRlcy4KKyAgICAgICAgICAgIG1lbV9pbmZvLT5zaGFkb3dfY29weV9iYXNlID0KKyAgICAgICAgICAgICAgICBtYWxsb2Moc3RhdGljX2Nhc3Q8c2l6ZV90PigyICogbWVtX2luZm8tPnNoYWRvd19wYWRfc2l6ZSArIHNpemUgKyBtYXBfYWxpZ25tZW50ICsgc3RhcnRfb2Zmc2V0KSk7CisKKyAgICAgICAgICAgIG1lbV9pbmZvLT5zaGFkb3dfY29weSA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4obWVtX2luZm8tPnNoYWRvd19jb3B5X2Jhc2UpICsgbWFwX2FsaWdubWVudCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KG1hcF9hbGlnbm1lbnQgLSAxKSkgKworICAgICAgICAgICAgICAgIHN0YXJ0X29mZnNldDsKKyAgICAgICAgICAgIGFzc2VydChTYWZlTW9kdWxvKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihtZW1faW5mby0+c2hhZG93X2NvcHkpICsgbWVtX2luZm8tPnNoYWRvd19wYWRfc2l6ZSAtIHN0YXJ0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9hbGlnbm1lbnQpID09IDApOworCisgICAgICAgICAgICBtZW1zZXQobWVtX2luZm8tPnNoYWRvd19jb3B5LCBOb25jb2hlcmVudE1lbW9yeUZpbGxWYWx1ZSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigyICogbWVtX2luZm8tPnNoYWRvd19wYWRfc2l6ZSArIHNpemUpKTsKKyAgICAgICAgICAgICpwcERhdGEgPSBzdGF0aWNfY2FzdDxjaGFyICo+KG1lbV9pbmZvLT5zaGFkb3dfY29weSkgKyBtZW1faW5mby0+c2hhZG93X3BhZF9zaXplOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZVdhaXRGb3JGZW5jZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlICpwRmVuY2VzLCBWa0Jvb2wzMiB3YWl0QWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKKyAgICAvLyBWZXJpZnkgZmVuY2Ugc3RhdHVzIG9mIHN1Ym1pdHRlZCBmZW5jZXMKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZmVuY2VDb3VudDsgaSsrKSB7CisgICAgICAgIHNraXAgfD0gVmVyaWZ5UXVldWVTdGF0ZVRvRmVuY2UocEZlbmNlc1tpXSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2V0RGV2aWNlUXVldWUodWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgdWludDMyX3QgcXVldWVJbmRleCwgVmtRdWV1ZSAqcFF1ZXVlLCBjb25zdCBjaGFyICp2YWxpZF9xZmlfdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpxZmlfaW5fcmFuZ2VfdnVpZCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgc2tpcCB8PSBWYWxpZGF0ZURldmljZVF1ZXVlRmFtaWx5KHF1ZXVlRmFtaWx5SW5kZXgsICJ2a0dldERldmljZVF1ZXVlIiwgInF1ZXVlRmFtaWx5SW5kZXgiLCB2YWxpZF9xZmlfdnVpZCk7CisgICAgY29uc3QgYXV0byAmcXVldWVfZGF0YSA9IHF1ZXVlX2ZhbWlseV9pbmRleF9tYXAuZmluZChxdWV1ZUZhbWlseUluZGV4KTsKKyAgICBpZiAocXVldWVfZGF0YSAhPSBxdWV1ZV9mYW1pbHlfaW5kZXhfbWFwLmVuZCgpICYmIHF1ZXVlX2RhdGEtPnNlY29uZCA8PSBxdWV1ZUluZGV4KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgcWZpX2luX3JhbmdlX3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXREZXZpY2VRdWV1ZTogcXVldWVJbmRleCAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgbm90IGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXVlcyByZXF1ZXN0ZWQgZnJvbSBxdWV1ZUZhbWlseUluZGV4ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSB3aGVuIHRoZSBkZXZpY2Ugd2FzIGNyZWF0ZWQgKGkuZS4gaXMgbm90IGxlc3MgdGhhbiAlIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXgsIHF1ZXVlRmFtaWx5SW5kZXgsIHF1ZXVlX2RhdGEtPnNlY29uZCk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUdldERldmljZVF1ZXVlKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgdWludDMyX3QgcXVldWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWV1ZSAqcFF1ZXVlKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlR2V0RGV2aWNlUXVldWUocXVldWVGYW1pbHlJbmRleCwgcXVldWVJbmRleCwgcFF1ZXVlLCAiVlVJRC12a0dldERldmljZVF1ZXVlLXF1ZXVlRmFtaWx5SW5kZXgtMDAzODQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0RGV2aWNlUXVldWUtcXVldWVJbmRleC0wMDM4NSIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZVF1ZXVlV2FpdElkbGUoVmtRdWV1ZSBxdWV1ZSkgY29uc3QgeworICAgIGNvbnN0IFFVRVVFX1NUQVRFICpxdWV1ZV9zdGF0ZSA9IEdldFF1ZXVlU3RhdGUocXVldWUpOworICAgIHJldHVybiBWZXJpZnlRdWV1ZVN0YXRlVG9TZXEocXVldWVfc3RhdGUsIHF1ZXVlX3N0YXRlLT5zZXEgKyBxdWV1ZV9zdGF0ZS0+c3VibWlzc2lvbnMuc2l6ZSgpKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVEZXZpY2VXYWl0SWRsZShWa0RldmljZSBkZXZpY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBhdXRvICZjb25zdF9xdWV1ZV9tYXAgPSBxdWV1ZU1hcDsKKyAgICBmb3IgKGF1dG8gJnF1ZXVlIDogY29uc3RfcXVldWVfbWFwKSB7CisgICAgICAgIHNraXAgfD0gVmVyaWZ5UXVldWVTdGF0ZVRvU2VxKCZxdWV1ZS5zZWNvbmQsIHF1ZXVlLnNlY29uZC5zZXEgKyBxdWV1ZS5zZWNvbmQuc3VibWlzc2lvbnMuc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTZW1hcGhvcmUgKnBTZW1hcGhvcmUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvICpzZW1fdHlwZV9jcmVhdGVfaW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisKKyAgICBpZiAoc2VtX3R5cGVfY3JlYXRlX2luZm8gJiYgc2VtX3R5cGVfY3JlYXRlX2luZm8tPnNlbWFwaG9yZVR5cGUgPT0gVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSICYmCisgICAgICAgICFlbmFibGVkX2ZlYXR1cmVzLnRpbWVsaW5lX3NlbWFwaG9yZV9mZWF0dXJlcy50aW1lbGluZVNlbWFwaG9yZSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFItdGltZWxpbmVTZW1hcGhvcmUtMDMyNTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZrQ3JlYXRlU2VtYXBob3JlOiB0aW1lbGluZVNlbWFwaG9yZSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBjYW4gbm90IGNyZWF0ZSB0aW1lbGluZSBzZW1hcGhvcmVzIik7CisgICAgfQorCisgICAgaWYgKHNlbV90eXBlX2NyZWF0ZV9pbmZvICYmIHNlbV90eXBlX2NyZWF0ZV9pbmZvLT5zZW1hcGhvcmVUeXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIgJiYKKyAgICAgICAgc2VtX3R5cGVfY3JlYXRlX2luZm8tPmluaXRpYWxWYWx1ZSAhPSAwKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUi1zZW1hcGhvcmVUeXBlLTAzMjc5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVNlbWFwaG9yZTogaWYgc2VtYXBob3JlVHlwZSBpcyBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSLCBpbml0aWFsVmFsdWUgbXVzdCBiZSB6ZXJvIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlV2FpdFNlbWFwaG9yZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSICpwV2FpdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwV2FpdEluZm8tPnNlbWFwaG9yZUNvdW50OyBpKyspIHsKKyAgICAgICAgYXV0byAqcFNlbWFwaG9yZSA9IEdldFNlbWFwaG9yZVN0YXRlKHBXYWl0SW5mby0+cFNlbWFwaG9yZXNbaV0pOworICAgICAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlICE9IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUikgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFdhaXRJbmZvLT5wU2VtYXBob3Jlc1tpXSksICJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcFNlbWFwaG9yZXMtMDMyNTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1dhaXRTZW1hcGhvcmVzS0hSOiBhbGwgc2VtYXBob3JlcyBpbiBwV2FpdEluZm8gbXVzdCBiZSB0aW1lbGluZSBzZW1hcGhvcmVzLCBidXQgJXMgaXMgbm90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBXYWl0SW5mby0+cFNlbWFwaG9yZXNbaV0pLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUZlbmNlKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgY29uc3QgRkVOQ0VfU1RBVEUgKmZlbmNlX25vZGUgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZmVuY2Vfbm9kZSkgeworICAgICAgICBpZiAoZmVuY2Vfbm9kZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsICYmIGZlbmNlX25vZGUtPnN0YXRlID09IEZFTkNFX0lORkxJR0hUKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GRU5DRV9FWFQsIEhhbmRsZVRvVWludDY0KGZlbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrRGVzdHJveUZlbmNlLWZlbmNlLTAxMTIwIiwgIiVzIGlzIGluIHVzZS4iLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGZlbmNlKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgY29uc3QgeworICAgIGNvbnN0IFNFTUFQSE9SRV9TVEFURSAqc2VtYV9ub2RlID0gR2V0U2VtYXBob3JlU3RhdGUoc2VtYXBob3JlKTsKKyAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSBvYmpfc3RydWN0KHNlbWFwaG9yZSwga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChzZW1hX25vZGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdE5vdEluVXNlKHNlbWFfbm9kZSwgb2JqX3N0cnVjdCwgInZrRGVzdHJveVNlbWFwaG9yZSIsICJWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1zZW1hcGhvcmUtMDExMzciKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgY29uc3QgRVZFTlRfU1RBVEUgKmV2ZW50X3N0YXRlID0gR2V0RXZlbnRTdGF0ZShldmVudCk7CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChldmVudCwga1Z1bGthbk9iamVjdFR5cGVFdmVudCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGV2ZW50X3N0YXRlKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3ROb3RJblVzZShldmVudF9zdGF0ZSwgb2JqX3N0cnVjdCwgInZrRGVzdHJveUV2ZW50IiwgIlZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtMDExNDUiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVF1ZXJ5UG9vbChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IFFVRVJZX1BPT0xfU1RBVEUgKnFwX3N0YXRlID0gR2V0UXVlcnlQb29sU3RhdGUocXVlcnlQb29sKTsKKyAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSBvYmpfc3RydWN0KHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChxcF9zdGF0ZSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0Tm90SW5Vc2UocXBfc3RhdGUsIG9ial9zdHJ1Y3QsICJ2a0Rlc3Ryb3lRdWVyeVBvb2wiLCAiVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtcXVlcnlQb29sLTAwNzkzIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlUGVyZm9ybWFuY2VRdWVyeVJlc3VsdHMoY29uc3QgY2hhciAqY21kX25hbWUsIGNvbnN0IFFVRVJZX1BPT0xfU1RBVEUgKnF1ZXJ5X3Bvb2xfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZmxhZ3MgJiAoVktfUVVFUllfUkVTVUxUX1dJVEhfQVZBSUxBQklMSVRZX0JJVCB8IFZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVCB8IFZLX1FVRVJZX1JFU1VMVF82NF9CSVQpKSB7CisgICAgICAgIHN0cmluZyBpbnZhbGlkX2ZsYWdzX3N0cmluZzsKKyAgICAgICAgZm9yIChhdXRvIGZsYWcgOiB7VktfUVVFUllfUkVTVUxUX1dJVEhfQVZBSUxBQklMSVRZX0JJVCwgVktfUVVFUllfUkVTVUxUX1BBUlRJQUxfQklULCBWS19RVUVSWV9SRVNVTFRfNjRfQklUfSkgeworICAgICAgICAgICAgaWYgKGZsYWcgJiBmbGFncykgeworICAgICAgICAgICAgICAgIGlmIChpbnZhbGlkX2ZsYWdzX3N0cmluZy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZF9mbGFnc19zdHJpbmcgKz0gIiBhbmQgIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW52YWxpZF9mbGFnc19zdHJpbmcgKz0gc3RyaW5nX1ZrUXVlcnlSZXN1bHRGbGFnQml0cyhmbGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoY21kX25hbWUsICJ2a0dldFF1ZXJ5UG9vbFJlc3VsdHMiKSA9PSAwID8gIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFF1ZXJ5UG9vbCAlcyB3YXMgY3JlYXRlZCB3aXRoIGEgcXVlcnlUeXBlIG9mIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSIGJ1dCBmbGFncyBjb250YWlucyAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kX25hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlfcG9vbF9zdGF0ZS0+cG9vbCkuY19zdHIoKSwgaW52YWxpZF9mbGFnc19zdHJpbmcuY19zdHIoKSk7CisgICAgfQorCisgICAgUXVlcnlPYmplY3QgcXVlcnlfb2Jqe3F1ZXJ5X3Bvb2xfc3RhdGUtPnBvb2wsIDB1fTsKKyAgICBmb3IgKHVpbnQzMl90IHF1ZXJ5SW5kZXggPSBmaXJzdFF1ZXJ5OyBxdWVyeUluZGV4IDwgcXVlcnlDb3VudDsgcXVlcnlJbmRleCsrKSB7CisgICAgICAgIHF1ZXJ5X29iai5xdWVyeSA9IHF1ZXJ5SW5kZXg7CisgICAgICAgIHVpbnQzMl90IHN1Ym1pdHRlZCA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgcGFzc0luZGV4ID0gMDsgcGFzc0luZGV4IDwgcXVlcnlfcG9vbF9zdGF0ZS0+bl9wZXJmb3JtYW5jZV9wYXNzZXM7IHBhc3NJbmRleCsrKSB7CisgICAgICAgICAgICBhdXRvIHF1ZXJ5X3Bhc3NfaXRlciA9IHF1ZXJ5UGFzc1RvU3RhdGVNYXAuZmluZChRdWVyeU9iamVjdFBhc3MocXVlcnlfb2JqLCBwYXNzSW5kZXgpKTsKKyAgICAgICAgICAgIGlmIChxdWVyeV9wYXNzX2l0ZXIgIT0gcXVlcnlQYXNzVG9TdGF0ZU1hcC5lbmQoKSAmJiBxdWVyeV9wYXNzX2l0ZXItPnNlY29uZCA9PSBRVUVSWVNUQVRFX0FWQUlMQUJMRSkgc3VibWl0dGVkKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1Ym1pdHRlZCA8IHF1ZXJ5X3Bvb2xfc3RhdGUtPm5fcGVyZm9ybWFuY2VfcGFzc2VzKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBRdWVyeVBvb2wgJXMgaGFzICV1IHBlcmZvcm1hbmNlIHF1ZXJ5IHBhc3NlcywgYnV0IHRoZSBxdWVyeSBoYXMgb25seSBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0dGVkIGZvciAldSBvZiB0aGUgcGFzc2VzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX25hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlfcG9vbF9zdGF0ZS0+cG9vbCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9wb29sX3N0YXRlLT5uX3BlcmZvcm1hbmNlX3Bhc3Nlcywgc3VibWl0dGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2V0UXVlcnlQb29sUGVyZm9ybWFuY2VSZXN1bHRzKFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcERhdGEsIFZrRGV2aWNlU2l6ZSBzdHJpZGUsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGF1dG8gcXVlcnlfcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5UG9vbCk7CisKKyAgICBpZiAoIXF1ZXJ5X3Bvb2xfc3RhdGUgfHwgcXVlcnlfcG9vbF9zdGF0ZS0+Y3JlYXRlSW5mby5xdWVyeVR5cGUgIT0gVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIpIHJldHVybiBza2lwOworCisgICAgaWYgKCgoKCh1aW50cHRyX3QpcERhdGEpICUgc2l6ZW9mKFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKSkgIT0gMCB8fAorICAgICAgICAgKHN0cmlkZSAlIHNpemVvZihWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUikpICE9IDApKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVSWV9QT09MX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDMyMjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5UG9vbCAlcyB3YXMgY3JlYXRlZCB3aXRoIGEgcXVlcnlUeXBlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiBidXQgcERhdGEgJiBzdHJpZGUgYXJlIG5vdCBtdWx0aXBsZSBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgb2YgVmtQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlQb29sKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBza2lwIHw9IFZhbGlkYXRlUGVyZm9ybWFuY2VRdWVyeVJlc3VsdHMoInZrR2V0UXVlcnlQb29sUmVzdWx0cyIsIHF1ZXJ5X3Bvb2xfc3RhdGUsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIGZsYWdzKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2V0UXVlcnlQb29sUmVzdWx0c0ZsYWdzKFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYXV0byBxdWVyeV9wb29sX3N0YXRlID0gR2V0UXVlcnlQb29sU3RhdGUocXVlcnlQb29sKTsKKyAgICBpZiAocXVlcnlfcG9vbF9zdGF0ZSkgeworICAgICAgICBpZiAoKHF1ZXJ5X3Bvb2xfc3RhdGUtPmNyZWF0ZUluZm8ucXVlcnlUeXBlID09IFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QKSAmJiAoZmxhZ3MgJiBWS19RVUVSWV9SRVNVTFRfUEFSVElBTF9CSVQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQsIEhhbmRsZVRvVWludDY0KHF1ZXJ5UG9vbCksCisgICAgICAgICAgICAgICAgIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMDgxOCIsCisgICAgICAgICAgICAgICAgIiVzIHdhcyBjcmVhdGVkIHdpdGggYSBxdWVyeVR5cGUgb2YgVktfUVVFUllfVFlQRV9USU1FU1RBTVAgYnV0IGZsYWdzIGNvbnRhaW5zIFZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVC4iLAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlQb29sKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUdldFF1ZXJ5UG9vbFJlc3VsdHNRdWVyaWVzKFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5X29iantxdWVyeVBvb2wsIDB1fTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVlcnlDb3VudDsgKytpKSB7CisgICAgICAgIHF1ZXJ5X29iai5xdWVyeSA9IGZpcnN0UXVlcnkgKyBpOworICAgICAgICBpZiAocXVlcnlUb1N0YXRlTWFwLmNvdW50KHF1ZXJ5X29iaikgPT0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHF1ZXJ5UG9vbCksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRRdWVyeVBvb2xSZXN1bHRzKCkgb24gJXMgYW5kIHF1ZXJ5ICUiIFBSSXUzMiAiOiB1bmtub3duIHF1ZXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXJ5UG9vbCkuY19zdHIoKSwgcXVlcnlfb2JqLnF1ZXJ5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXRRdWVyeVBvb2xSZXN1bHRzKFZrRGV2aWNlIGRldmljZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXJ5Q291bnQsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCAqcERhdGEsIFZrRGV2aWNlU2l6ZSBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgaWYgKGRpc2FibGVkLnF1ZXJ5X3ZhbGlkYXRpb24pIHJldHVybiBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlUXVlcnlQb29sU3RyaWRlKCJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1mbGFncy0wMjgyNyIsICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1mbGFncy0wMDgxNSIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU2l6ZSIsIGRhdGFTaXplLCBmbGFncyk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUdldFF1ZXJ5UG9vbFJlc3VsdHNGbGFncyhxdWVyeVBvb2wsIGZsYWdzKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlR2V0UXVlcnlQb29sUmVzdWx0c1F1ZXJpZXMocXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKKyAgICBza2lwIHw9IFZhbGlkYXRlR2V0UXVlcnlQb29sUGVyZm9ybWFuY2VSZXN1bHRzKHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgcERhdGEsIHN0cmlkZSwgZmxhZ3MpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbnNlcnRNZW1vcnlSYW5nZShjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlLCBjb25zdCBERVZJQ0VfTUVNT1JZX1NUQVRFICptZW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0LCBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyAmbWVtUmVxdWlyZW1lbnRzLCBib29sIGlzX2xpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcGlfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKG1lbW9yeU9mZnNldCA+PSBtZW1faW5mby0+YWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSkgeworICAgICAgICBjb25zdCBjaGFyICplcnJvcl9jb2RlID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKHR5cGVkX2hhbmRsZS50eXBlID09IGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyKSB7CisgICAgICAgICAgICBlcnJvcl9jb2RlID0gIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeU9mZnNldC0wMTAzMSI7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZWRfaGFuZGxlLnR5cGUgPT0ga1Z1bGthbk9iamVjdFR5cGVJbWFnZSkgeworICAgICAgICAgICAgZXJyb3JfY29kZSA9ICJWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeU9mZnNldC0wMTA0NiI7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZWRfaGFuZGxlLnR5cGUgPT0ga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikgeworICAgICAgICAgICAgZXJyb3JfY29kZSA9ICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnlPZmZzZXQtMDI0NTEiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGUKKyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBza2lwID0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtX2luZm8tPm1lbSksIGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcywgYXR0ZW1wdGluZyB0byBiaW5kICVzIHRvICVzLCBtZW1vcnlPZmZzZXQ9MHglIiBQUkl4TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAiIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzaXplIDB4JSIgUFJJeExFQVNUNjQgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShtZW1faW5mby0+bWVtKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHR5cGVkX2hhbmRsZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0LCBtZW1faW5mby0+YWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbnNlcnRJbWFnZU1lbW9yeVJhbmdlKFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUgKm1lbV9pbmZvLCBWa0RldmljZVNpemUgbWVtX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzICZtZW1fcmVxcywgYm9vbCBpc19saW5lYXIsIGNvbnN0IGNoYXIgKmFwaV9uYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlSW5zZXJ0TWVtb3J5UmFuZ2UoVnVsa2FuVHlwZWRIYW5kbGUoaW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UpLCBtZW1faW5mbywgbWVtX29mZnNldCwgbWVtX3JlcXMsIGlzX2xpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbnNlcnRCdWZmZXJNZW1vcnlSYW5nZShWa0J1ZmZlciBidWZmZXIsIGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUgKm1lbV9pbmZvLCBWa0RldmljZVNpemUgbWVtX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyAmbWVtX3JlcXMsIGNvbnN0IGNoYXIgKmFwaV9uYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlSW5zZXJ0TWVtb3J5UmFuZ2UoVnVsa2FuVHlwZWRIYW5kbGUoYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciksIG1lbV9pbmZvLCBtZW1fb2Zmc2V0LCBtZW1fcmVxcywgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVJbnNlcnRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSYW5nZShWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFzLCBjb25zdCBERVZJQ0VfTUVNT1JZX1NUQVRFICptZW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgbWVtX29mZnNldCwgY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMgJm1lbV9yZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFwaV9uYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlSW5zZXJ0TWVtb3J5UmFuZ2UoVnVsa2FuVHlwZWRIYW5kbGUoYXMsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpLCBtZW1faW5mbywgbWVtX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fcmVxcywgdHJ1ZSwgYXBpX25hbWUpOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlTWVtb3J5VHlwZXMoY29uc3QgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8sIGNvbnN0IHVpbnQzMl90IG1lbW9yeV90eXBlX2JpdHMsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZ0NvZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoKCgxIDw8IG1lbV9pbmZvLT5hbGxvY19pbmZvLm1lbW9yeVR5cGVJbmRleCkgJiBtZW1vcnlfdHlwZV9iaXRzKSA9PSAwKSB7CisgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChtZW1faW5mby0+bWVtKSwgbXNnQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IE1lbW9yeVJlcXVpcmVtZW50cy0+bWVtb3J5VHlwZUJpdHMgKDB4JVgpIGZvciB0aGlzIG9iamVjdCB0eXBlIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBtZW1vcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAoMHglWCkgb2YgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZnVuY05hbWUsIG1lbW9yeV90eXBlX2JpdHMsIG1lbV9pbmZvLT5hbGxvY19pbmZvLm1lbW9yeVR5cGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShtZW1faW5mby0+bWVtKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5KFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VNZW1vcnkgbWVtLCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXBpX25hbWUpIGNvbnN0IHsKKyAgICBjb25zdCBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoYnVmZmVyX3N0YXRlKSB7CisgICAgICAgIC8vIFRyYWNrIG9iamVjdHMgdGllZCB0byBtZW1vcnkKKyAgICAgICAgdWludDY0X3QgYnVmZmVyX2hhbmRsZSA9IEhhbmRsZVRvVWludDY0KGJ1ZmZlcik7CisgICAgICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QoYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcik7CisgICAgICAgIHNraXAgPSBWYWxpZGF0ZVNldE1lbUJpbmRpbmcobWVtLCBvYmpfc3RydWN0LCBhcGlfbmFtZSk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYm91bmQgbWVtb3J5IHJhbmdlIGluZm9ybWF0aW9uCisgICAgICAgIGNvbnN0IGF1dG8gbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW0pOworICAgICAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbnNlcnRCdWZmZXJNZW1vcnlSYW5nZShidWZmZXIsIG1lbV9pbmZvLCBtZW1vcnlPZmZzZXQsIGJ1ZmZlcl9zdGF0ZS0+cmVxdWlyZW1lbnRzLCBhcGlfbmFtZSk7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5VHlwZXMobWVtX2luZm8sIGJ1ZmZlcl9zdGF0ZS0+cmVxdWlyZW1lbnRzLm1lbW9yeVR5cGVCaXRzLCBhcGlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LTAxMDM1Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFsaWdubWVudAorICAgICAgICBpZiAoU2FmZU1vZHVsbyhtZW1vcnlPZmZzZXQsIGJ1ZmZlcl9zdGF0ZS0+cmVxdWlyZW1lbnRzLmFsaWdubWVudCkgIT0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsIGJ1ZmZlcl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeU9mZnNldC0wMTAzNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBtZW1vcnlPZmZzZXQgaXMgMHglIiBQUkl4TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYnV0IG11c3QgYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiB0aGUgVmtNZW1vcnlSZXF1aXJlbWVudHM6OmFsaWdubWVudCB2YWx1ZSAweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMgd2l0aCBidWZmZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSwgbWVtb3J5T2Zmc2V0LCBidWZmZXJfc3RhdGUtPnJlcXVpcmVtZW50cy5hbGlnbm1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgICAgICAvLyBWYWxpZGF0ZSBtZW1vcnkgcmVxdWlyZW1lbnRzIHNpemUKKyAgICAgICAgICAgIGlmIChidWZmZXJfc3RhdGUtPnJlcXVpcmVtZW50cy5zaXplID4gKG1lbV9pbmZvLT5hbGxvY19pbmZvLmFsbG9jYXRpb25TaXplIC0gbWVtb3J5T2Zmc2V0KSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULCBidWZmZXJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktc2l6ZS0wMTAzNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogbWVtb3J5IHNpemUgbWludXMgbWVtb3J5T2Zmc2V0IGlzIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBidXQgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyBWa01lbW9yeVJlcXVpcmVtZW50czo6c2l6ZSB2YWx1ZSAweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIHdpdGggYnVmZmVyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9uYW1lLCBtZW1faW5mby0+YWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSAtIG1lbW9yeU9mZnNldCwgYnVmZmVyX3N0YXRlLT5yZXF1aXJlbWVudHMuc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIGRlZGljYXRlZCBhbGxvY2F0aW9uCisgICAgICAgICAgICBpZiAobWVtX2luZm8tPmlzX2RlZGljYXRlZCAmJiAoKG1lbV9pbmZvLT5kZWRpY2F0ZWRfYnVmZmVyICE9IGJ1ZmZlcikgfHwgKG1lbW9yeU9mZnNldCAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgdmtCaW5kQnVmZmVyTWVtb3J5MktIUiBlcnJvciBtZXNzYWdlIHdoZW4gYWRkZWQgdG8gc3BlYy4KKyAgICAgICAgICAgICAgICBhdXRvIHZhbGlkYXRpb25fZXJyb3IgPSBrVlVJRFVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGFwaV9uYW1lLCAidmtCaW5kQnVmZmVyTWVtb3J5KCkiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZXJyb3IgPSAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LTAxNTA4IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsIGJ1ZmZlcl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogZm9yIGRlZGljYXRlZCAlcywgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9LSFI6OmJ1ZmZlciAlcyBtdXN0IGJlIGVxdWFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzIGFuZCBtZW1vcnlPZmZzZXQgMHglIiBQUkl4TEVBU1Q2NCAiIG11c3QgYmUgemVyby4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShtZW0pLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobWVtX2luZm8tPmRlZGljYXRlZF9idWZmZXIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYnVmZmVyKS5jX3N0cigpLCBtZW1vcnlPZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIGNoYWluZWRfZmxhZ3Nfc3RydWN0ID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbz4obWVtX2luZm8tPmFsbG9jX2luZm8ucE5leHQpOworICAgICAgICAgICAgaWYgKGVuYWJsZWRfZmVhdHVyZXMuYnVmZmVyX2RldmljZV9hZGRyZXNzLmJ1ZmZlckRldmljZUFkZHJlc3MgJiYKKyAgICAgICAgICAgICAgICAoYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnVzYWdlICYgVktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfS0hSKSAmJgorICAgICAgICAgICAgICAgICghY2hhaW5lZF9mbGFnc19zdHJ1Y3QgfHwgIShjaGFpbmVkX2ZsYWdzX3N0cnVjdC0+ZmxhZ3MgJiBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUikpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsIGJ1ZmZlcl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXJEZXZpY2VBZGRyZXNzLTAzMzM5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfS0hSIGJpdCBzZXQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCB0aGUgVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0JJVF9LSFIgYml0IHNldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VNZW1vcnkgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQpIGNvbnN0IHsKKyAgICBjb25zdCBjaGFyICphcGlfbmFtZSA9ICJ2a0JpbmRCdWZmZXJNZW1vcnkoKSI7CisgICAgcmV0dXJuIFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeShidWZmZXIsIG1lbSwgbWVtb3J5T2Zmc2V0LCBhcGlfbmFtZSk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvS0hSICpwQmluZEluZm9zKSBjb25zdCB7CisgICAgY2hhciBhcGlfbmFtZVs2NF07CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIHNwcmludGYoYXBpX25hbWUsICJ2a0JpbmRCdWZmZXJNZW1vcnkyKCkgcEJpbmRJbmZvc1sldV0iLCBpKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUJpbmRCdWZmZXJNZW1vcnkocEJpbmRJbmZvc1tpXS5idWZmZXIsIHBCaW5kSW5mb3NbaV0ubWVtb3J5LCBwQmluZEluZm9zW2ldLm1lbW9yeU9mZnNldCwgYXBpX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5MktIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm9LSFIgKnBCaW5kSW5mb3MpIGNvbnN0IHsKKyAgICBjaGFyIGFwaV9uYW1lWzY0XTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kSW5mb0NvdW50OyBpKyspIHsKKyAgICAgICAgc3ByaW50ZihhcGlfbmFtZSwgInZrQmluZEJ1ZmZlck1lbW9yeTJLSFIoKSBwQmluZEluZm9zWyV1XSIsIGkpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeShwQmluZEluZm9zW2ldLmJ1ZmZlciwgcEJpbmRJbmZvc1tpXS5tZW1vcnksIHBCaW5kSW5mb3NbaV0ubWVtb3J5T2Zmc2V0LCBhcGlfbmFtZSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAqcEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfYW5kcm9pZF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMkFORFJPSUQocEluZm8tPmltYWdlKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiAqcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihwSW5mbyk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiAqcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihwSW5mbyk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAqcEltYWdlRm9ybWF0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAqcEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3QgeworICAgIC8vIENhbid0IHdyYXAgQUhCLXNwZWNpZmljIHZhbGlkYXRpb24gaW4gYSBkZXZpY2UgZXh0ZW5zaW9uIGNoZWNrIGhlcmUsIGJ1dCBubyBoYXJtCisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJBTkRST0lEKHJlcG9ydF9kYXRhLCBwSW1hZ2VGb3JtYXRJbmZvLCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yICpwSW1hZ2VGb3JtYXRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyICpwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgLy8gQ2FuJ3Qgd3JhcCBBSEItc3BlY2lmaWMgdmFsaWRhdGlvbiBpbiBhIGRldmljZSBleHRlbnNpb24gY2hlY2sgaGVyZSwgYnV0IG5vIGhhcm0KKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMkFORFJPSUQocmVwb3J0X2RhdGEsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBjb25zdCBQSVBFTElORV9TVEFURSAqcGlwZWxpbmVfc3RhdGUgPSBHZXRQaXBlbGluZVN0YXRlKHBpcGVsaW5lKTsKKyAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSBvYmpfc3RydWN0KHBpcGVsaW5lLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocGlwZWxpbmVfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdE5vdEluVXNlKHBpcGVsaW5lX3N0YXRlLCBvYmpfc3RydWN0LCAidmtEZXN0cm95UGlwZWxpbmUiLCAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1waXBlbGluZS0wMDc2NSIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlcihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlciBzYW1wbGVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBjb25zdCBTQU1QTEVSX1NUQVRFICpzYW1wbGVyX3N0YXRlID0gR2V0U2FtcGxlclN0YXRlKHNhbXBsZXIpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3Qoc2FtcGxlciwga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoc2FtcGxlcl9zdGF0ZSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0Tm90SW5Vc2Uoc2FtcGxlcl9zdGF0ZSwgb2JqX3N0cnVjdCwgInZrRGVzdHJveVNhbXBsZXIiLCAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItMDEwODIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgY29uc3QgeworICAgIGNvbnN0IERFU0NSSVBUT1JfUE9PTF9TVEFURSAqZGVzY19wb29sX3N0YXRlID0gR2V0RGVzY3JpcHRvclBvb2xTdGF0ZShkZXNjcmlwdG9yUG9vbCk7CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChkZXNjcmlwdG9yUG9vbCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGRlc2NfcG9vbF9zdGF0ZSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0Tm90SW5Vc2UoZGVzY19wb29sX3N0YXRlLCBvYmpfc3RydWN0LCAidmtEZXN0cm95RGVzY3JpcHRvclBvb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtMDAzMDMiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIFZlcmlmeSBjbWRCdWZmZXIgaW4gZ2l2ZW4gY2Jfbm9kZSBpcyBub3QgaW4gZ2xvYmFsIGluLWZsaWdodCBzZXQsIGFuZCByZXR1cm4gc2tpcCByZXN1bHQKKy8vICBJZiB0aGlzIGlzIGEgc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyLCB0aGVuIG1ha2Ugc3VyZSBpdHMgcHJpbWFyeSBpcyBhbHNvIGluLWZsaWdodAorLy8gIElmIHByaW1hcnkgaXMgbm90IGluLWZsaWdodCwgdGhlbiByZW1vdmUgc2Vjb25kYXJ5IGZyb20gZ2xvYmFsIGluLWZsaWdodCBzZXQKKy8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSB2YWxpZCBhdCBhIHBvaW50IHdoZW4gY21kQnVmZmVyIGlzIGJlaW5nIHJlc2V0IG9yIGZyZWVkCitib29sIENvcmVDaGVja3M6OkNoZWNrQ29tbWFuZEJ1ZmZlckluRmxpZ2h0KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIGNvbnN0IGNoYXIgKmFjdGlvbiwgY29uc3QgY2hhciAqZXJyb3JfY29kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChjYl9ub2RlLT5pbl91c2UubG9hZCgpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSwgZXJyb3JfY29kZSwgIkF0dGVtcHQgdG8gJXMgJXMgd2hpY2ggaXMgaW4gdXNlLiIsIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisvLyBJdGVyYXRlIG92ZXIgYWxsIGNtZEJ1ZmZlcnMgaW4gZ2l2ZW4gY29tbWFuZFBvb2wgYW5kIHZlcmlmeSB0aGF0IGVhY2ggaXMgbm90IGluIHVzZQorYm9vbCBDb3JlQ2hlY2tzOjpDaGVja0NvbW1hbmRCdWZmZXJzSW5GbGlnaHQoY29uc3QgQ09NTUFORF9QT09MX1NUQVRFICpwUG9vbCwgY29uc3QgY2hhciAqYWN0aW9uLCBjb25zdCBjaGFyICplcnJvcl9jb2RlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGNtZF9idWZmZXIgOiBwUG9vbC0+Y29tbWFuZEJ1ZmZlcnMpIHsKKyAgICAgICAgc2tpcCB8PSBDaGVja0NvbW1hbmRCdWZmZXJJbkZsaWdodChHZXRDQlN0YXRlKGNtZF9idWZmZXIpLCBhY3Rpb24sIGVycm9yX2NvZGUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVGcmVlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb21tYW5kQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBhdXRvICpjYl9ub2RlID0gR2V0Q0JTdGF0ZShwQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICAvLyBEZWxldGUgQ0IgaW5mb3JtYXRpb24gc3RydWN0dXJlLCBhbmQgcmVtb3ZlIGZyb20gY29tbWFuZEJ1ZmZlck1hcAorICAgICAgICBpZiAoY2Jfbm9kZSkgeworICAgICAgICAgICAgc2tpcCB8PSBDaGVja0NvbW1hbmRCdWZmZXJJbkZsaWdodChjYl9ub2RlLCAiZnJlZSIsICJWVUlELXZrRnJlZUNvbW1hbmRCdWZmZXJzLXBDb21tYW5kQnVmZmVycy0wMDA0NyIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrQ29tbWFuZFBvb2wgKnBDb21tYW5kUG9vbCkgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZURldmljZVF1ZXVlRmFtaWx5KHBDcmVhdGVJbmZvLT5xdWV1ZUZhbWlseUluZGV4LCAidmtDcmVhdGVDb21tYW5kUG9vbCIsICJwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDcmVhdGVDb21tYW5kUG9vbC1xdWV1ZUZhbWlseUluZGV4LTAxOTM3Iik7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUXVlcnlQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtRdWVyeVBvb2wgKnBRdWVyeVBvb2wpIGNvbnN0IHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuIGZhbHNlOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChwQ3JlYXRlSW5mbyAmJiBwQ3JlYXRlSW5mby0+cXVlcnlUeXBlID09IFZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUykgeworICAgICAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMuY29yZS5waXBlbGluZVN0YXRpc3RpY3NRdWVyeSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDA3OTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeSBwb29sIHdpdGggdHlwZSBWS19RVUVSWV9UWVBFX1BJUEVMSU5FX1NUQVRJU1RJQ1MgY3JlYXRlZCBvbiBhIGRldmljZSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtEZXZpY2VDcmVhdGVJbmZvLnBFbmFibGVkRmVhdHVyZXMucGlwZWxpbmVTdGF0aXN0aWNzUXVlcnkgPT0gVktfRkFMU0UuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBDcmVhdGVJbmZvICYmIHBDcmVhdGVJbmZvLT5xdWVyeVR5cGUgPT0gVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIpIHsKKyAgICAgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLnBlcmZvcm1hbmNlX3F1ZXJ5X2ZlYXR1cmVzLnBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVSWV9QT09MX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzLTAzMjM3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnkgcG9vbCB3aXRoIHR5cGUgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIgY3JlYXRlZCBvbiBhIGRldmljZSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUi5wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzID09IFZLX0ZBTFNFLiIpOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBwZXJmX2NpID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgICAgIGlmICghcGVyZl9jaSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDMyMjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeSBwb29sIHdpdGggdHlwZSBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiBjcmVhdGVkIGJ1dCB0aGUgcE5leHQgY2hhaW4gb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mbyBkb2VzIG5vdCBjb250YWluIGluIGluc3RhbmNlIG9mIFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgYXV0byAmcGVyZl9jb3VudGVyX2l0ZXIgPSBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnBlcmZfY291bnRlcnMuZmluZChwZXJmX2NpLT5xdWV1ZUZhbWlseUluZGV4KTsKKyAgICAgICAgICAgIGlmIChwZXJmX2NvdW50ZXJfaXRlciA9PSBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnBlcmZfY291bnRlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDMyMzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtRdWVyeVBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUjo6cXVldWVGYW1pbHlJbmRleCBpcyBub3QgYSB2YWxpZCBxdWV1ZSBmYW1pbHkgaW5kZXguIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IFFVRVVFX0ZBTUlMWV9QRVJGX0NPVU5URVJTICpwZXJmX2NvdW50ZXJzID0gcGVyZl9jb3VudGVyX2l0ZXItPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGlkeCA9IDA7IGlkeCA8IHBlcmZfY2ktPmNvdW50ZXJJbmRleENvdW50OyBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGVyZl9jaS0+cENvdW50ZXJJbmRpY2VzW2lkeF0gPj0gcGVyZl9jb3VudGVycy0+Y291bnRlcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItcENvdW50ZXJJbmRpY2VzLTAzMzIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtRdWVyeVBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUjo6cENvdW50ZXJJbmRpY2VzWyV1XSA9ICV1IGlzIG5vdCBhIHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bnRlciBpbmRleC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgcGVyZl9jaS0+cENvdW50ZXJJbmRpY2VzW2lkeF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBjb25zdCBDT01NQU5EX1BPT0xfU1RBVEUgKmNwX3N0YXRlID0gR2V0Q29tbWFuZFBvb2xTdGF0ZShjb21tYW5kUG9vbCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGNwX3N0YXRlKSB7CisgICAgICAgIC8vIFZlcmlmeSB0aGF0IGNvbW1hbmQgYnVmZmVycyBpbiBwb29sIGFyZSBjb21wbGV0ZSAobm90IGluLWZsaWdodCkKKyAgICAgICAgc2tpcCB8PSBDaGVja0NvbW1hbmRCdWZmZXJzSW5GbGlnaHQoY3Bfc3RhdGUsICJkZXN0cm95IGNvbW1hbmQgcG9vbCB3aXRoIiwgIlZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtMDAwNDEiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlUmVzZXRDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAqY29tbWFuZF9wb29sX3N0YXRlID0gR2V0Q29tbWFuZFBvb2xTdGF0ZShjb21tYW5kUG9vbCk7CisgICAgcmV0dXJuIENoZWNrQ29tbWFuZEJ1ZmZlcnNJbkZsaWdodChjb21tYW5kX3Bvb2xfc3RhdGUsICJyZXNldCBjb21tYW5kIHBvb2wgd2l0aCIsICJWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1jb21tYW5kUG9vbC0wMDA0MCIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZVJlc2V0RmVuY2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVmtGZW5jZSAqcEZlbmNlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmZW5jZUNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXV0byBwRmVuY2UgPSBHZXRGZW5jZVN0YXRlKHBGZW5jZXNbaV0pOworICAgICAgICBpZiAocEZlbmNlICYmIHBGZW5jZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsICYmIHBGZW5jZS0+c3RhdGUgPT0gRkVOQ0VfSU5GTElHSFQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GRU5DRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocEZlbmNlc1tpXSksICJWVUlELXZrUmVzZXRGZW5jZXMtcEZlbmNlcy0wMTEyMyIsICIlcyBpcyBpbiB1c2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBGZW5jZXNbaV0pLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lGcmFtZWJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIFZrRnJhbWVidWZmZXIgZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBjb25zdCBGUkFNRUJVRkZFUl9TVEFURSAqZnJhbWVidWZmZXJfc3RhdGUgPSBHZXRGcmFtZWJ1ZmZlclN0YXRlKGZyYW1lYnVmZmVyKTsKKyAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSBvYmpfc3RydWN0KGZyYW1lYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZnJhbWVidWZmZXJfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdE5vdEluVXNlKGZyYW1lYnVmZmVyX3N0YXRlLCBvYmpfc3RydWN0LCAidmtEZXN0cm95RnJhbWVidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtEZXN0cm95RnJhbWVidWZmZXItZnJhbWVidWZmZXItMDA4OTIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgY29uc3QgUkVOREVSX1BBU1NfU1RBVEUgKnJwX3N0YXRlID0gR2V0UmVuZGVyUGFzc1N0YXRlKHJlbmRlclBhc3MpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QocmVuZGVyUGFzcywga1Z1bGthbk9iamVjdFR5cGVSZW5kZXJQYXNzKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocnBfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdE5vdEluVXNlKHJwX3N0YXRlLCBvYmpfc3RydWN0LCAidmtEZXN0cm95UmVuZGVyUGFzcyIsICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy0wMDg3MyIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gQWNjZXNzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGV4dGVybmFsIG1vZHVsZXMKK1ZrRm9ybWF0UHJvcGVydGllcyBDb3JlQ2hlY2tzOjpHZXRQREZvcm1hdFByb3BlcnRpZXMoY29uc3QgVmtGb3JtYXQgZm9ybWF0KSBjb25zdCB7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wZXJ0aWVzOworICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsX2RldmljZSwgZm9ybWF0LCAmZm9ybWF0X3Byb3BlcnRpZXMpOworICAgIHJldHVybiBmb3JtYXRfcHJvcGVydGllczsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVBpcGVsaW5lVmVydGV4RGl2aXNvcnMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFBJUEVMSU5FX1NUQVRFPj4gY29uc3QgJnBpcGVfc3RhdGVfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY291bnQsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKnBpcGVfY2lzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUxpbWl0cyAqZGV2aWNlX2xpbWl0cyA9ICZwaHlzX2Rldl9wcm9wcy5saW1pdHM7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBhdXRvIHB2aWRzX2NpID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVD4ocGlwZV9jaXNbaV0ucFZlcnRleElucHV0U3RhdGUtPnBOZXh0KTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gcHZpZHNfY2kpIGNvbnRpbnVlOworCisgICAgICAgIGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwaXBlX3N0YXRlID0gcGlwZV9zdGF0ZV92ZWNbaV0uZ2V0KCk7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwdmlkc19jaS0+dmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBWa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVCAqdmliZGQgPSAmKHB2aWRzX2NpLT5wVmVydGV4QmluZGluZ0Rpdmlzb3JzW2pdKTsKKyAgICAgICAgICAgIGlmICh2aWJkZC0+YmluZGluZyA+PSBkZXZpY2VfbGltaXRzLT5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC1iaW5kaW5nLTAxODY5IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogUGlwZWxpbmVbJTF1XSB3aXRoIGNoYWluZWQgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCwgIgorICAgICAgICAgICAgICAgICAgICAicFZlcnRleEJpbmRpbmdEaXZpc29yc1slMXVdIGJpbmRpbmcgaW5kZXggb2YgKCUxdSkgZXhjZWVkcyBkZXZpY2UgbWF4VmVydGV4SW5wdXRCaW5kaW5ncyAoJTF1KS4iLAorICAgICAgICAgICAgICAgICAgICBpLCBqLCB2aWJkZC0+YmluZGluZywgZGV2aWNlX2xpbWl0cy0+bWF4VmVydGV4SW5wdXRCaW5kaW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmliZGQtPmRpdmlzb3IgPiBwaHlzX2Rldl9leHRfcHJvcHMudnR4X2F0dHJpYl9kaXZpc29yX3Byb3BzLm1heFZlcnRleEF0dHJpYkRpdmlzb3IpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhULWRpdmlzb3ItMDE4NzAiLAorICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpOiBQaXBlbGluZVslMXVdIHdpdGggY2hhaW5lZCBWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhULCAiCisgICAgICAgICAgICAgICAgICAgICJwVmVydGV4QmluZGluZ0Rpdmlzb3JzWyUxdV0gZGl2aXNvciBvZiAoJTF1KSBleGNlZWRzIGV4dGVuc2lvbiBtYXhWZXJ0ZXhBdHRyaWJEaXZpc29yICglMXUpLiIsCisgICAgICAgICAgICAgICAgICAgIGksIGosIHZpYmRkLT5kaXZpc29yLCBwaHlzX2Rldl9leHRfcHJvcHMudnR4X2F0dHJpYl9kaXZpc29yX3Byb3BzLm1heFZlcnRleEF0dHJpYkRpdmlzb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgwID09IHZpYmRkLT5kaXZpc29yKSAmJiAhZW5hYmxlZF9mZWF0dXJlcy52dHhfYXR0cmliX2Rpdmlzb3JfZmVhdHVyZXMudmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3IpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhULXZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yLTAyMjI4IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogUGlwZWxpbmVbJTF1XSB3aXRoIGNoYWluZWQgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCwgIgorICAgICAgICAgICAgICAgICAgICAicFZlcnRleEJpbmRpbmdEaXZpc29yc1slMXVdIGRpdmlzb3IgbXVzdCBub3QgYmUgMCB3aGVuIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yIGZlYXR1cmUgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKDEgIT0gdmliZGQtPmRpdmlzb3IpICYmICFlbmFibGVkX2ZlYXR1cmVzLnZ0eF9hdHRyaWJfZGl2aXNvcl9mZWF0dXJlcy52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC12ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yLTAyMjI5IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogUGlwZWxpbmVbJTF1XSB3aXRoIGNoYWluZWQgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCwgIgorICAgICAgICAgICAgICAgICAgICAicFZlcnRleEJpbmRpbmdEaXZpc29yc1slMXVdIGRpdmlzb3IgKCUxdSkgbXVzdCBiZSAxIHdoZW4gdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvciBmZWF0dXJlIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgICAgIGksIGosIHZpYmRkLT5kaXZpc29yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluZCB0aGUgY29ycmVzcG9uZGluZyBiaW5kaW5nIGRlc2NyaXB0aW9uIGFuZCB2YWxpZGF0ZSBpbnB1dCByYXRlIHNldHRpbmcKKyAgICAgICAgICAgIGJvb2wgZmFpbGVkXzAxODcxID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcGlwZV9zdGF0ZS0+dmVydGV4X2JpbmRpbmdfZGVzY3JpcHRpb25zXy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgIGlmICgodmliZGQtPmJpbmRpbmcgPT0gcGlwZV9zdGF0ZS0+dmVydGV4X2JpbmRpbmdfZGVzY3JpcHRpb25zX1trXS5iaW5kaW5nKSAmJgorICAgICAgICAgICAgICAgICAgICAoVktfVkVSVEVYX0lOUFVUX1JBVEVfSU5TVEFOQ0UgPT0gcGlwZV9zdGF0ZS0+dmVydGV4X2JpbmRpbmdfZGVzY3JpcHRpb25zX1trXS5pbnB1dFJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZF8wMTg3MSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmFpbGVkXzAxODcxKSB7ICAvLyBEZXNjcmlwdGlvbiBub3QgZm91bmQsIG9yIGhhcyBpbmNvcnJlY3QgaW5wdXRSYXRlIHZhbHVlCisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC1pbnB1dFJhdGUtMDE4NzEiLAorICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpOiBQaXBlbGluZVslMXVdIHdpdGggY2hhaW5lZCBWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhULCAiCisgICAgICAgICAgICAgICAgICAgICJwVmVydGV4QmluZGluZ0Rpdmlzb3JzWyUxdV0gc3BlY2lmaWVzIGJpbmRpbmcgaW5kZXggKCUxdSksIGJ1dCB0aGF0IGJpbmRpbmcgaW5kZXgncyAiCisgICAgICAgICAgICAgICAgICAgICJWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLmlucHV0UmF0ZSBtZW1iZXIgaXMgbm90IFZLX1ZFUlRFWF9JTlBVVF9SQVRFX0lOU1RBTkNFLiIsCisgICAgICAgICAgICAgICAgICAgIGksIGosIHZpYmRkLT5iaW5kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNncGxfc3RhdGVfZGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IFN0YXRlVHJhY2tlcjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjb3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcywgY2dwbF9zdGF0ZV9kYXRhKTsKKyAgICBjcmVhdGVfZ3JhcGhpY3NfcGlwZWxpbmVfYXBpX3N0YXRlICpjZ3BsX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxjcmVhdGVfZ3JhcGhpY3NfcGlwZWxpbmVfYXBpX3N0YXRlICo+KGNncGxfc3RhdGVfZGF0YSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlUGlwZWxpbmVMb2NrZWQoY2dwbF9zdGF0ZS0+cGlwZV9zdGF0ZSwgaSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVBpcGVsaW5lVW5sb2NrZWQoY2dwbF9zdGF0ZS0+cGlwZV9zdGF0ZVtpXS5nZXQoKSwgaSk7CisgICAgfQorCisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2V4dF92ZXJ0ZXhfYXR0cmlidXRlX2Rpdmlzb3IpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVBpcGVsaW5lVmVydGV4RGl2aXNvcnMoY2dwbF9zdGF0ZS0+cGlwZV9zdGF0ZSwgY291bnQsIHBDcmVhdGVJbmZvcyk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2NwbF9zdGF0ZV9kYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gU3RhdGVUcmFja2VyOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcywgY2NwbF9zdGF0ZV9kYXRhKTsKKworICAgIGF1dG8gKmNjcGxfc3RhdGUgPSByZWludGVycHJldF9jYXN0PGNyZWF0ZV9jb21wdXRlX3BpcGVsaW5lX2FwaV9zdGF0ZSAqPihjY3BsX3N0YXRlX2RhdGEpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIC8vIFRPRE86IEFkZCBDb21wdXRlIFBpcGVsaW5lIFZlcmlmaWNhdGlvbgorICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ29tcHV0ZVBpcGVsaW5lKGNjcGxfc3RhdGUtPnBpcGVfc3RhdGUuYmFjaygpLmdldCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtQaXBlbGluZSAqcFBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNydHBsX3N0YXRlX2RhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBTdGF0ZVRyYWNrZXI6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcywgY3J0cGxfc3RhdGVfZGF0YSk7CisKKyAgICBhdXRvICpjcnRwbF9zdGF0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y3JlYXRlX3JheV90cmFjaW5nX3BpcGVsaW5lX2FwaV9zdGF0ZSAqPihjcnRwbF9zdGF0ZV9kYXRhKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlUmF5VHJhY2luZ1BpcGVsaW5lTlYoY3J0cGxfc3RhdGUtPnBpcGVfc3RhdGVbaV0uZ2V0KCkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUluZm9LSFIgKnBQaXBlbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBFeGVjdXRhYmxlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLnBpcGVsaW5lX2V4ZV9wcm9wc19mZWF0dXJlcy5waXBlbGluZUV4ZWN1dGFibGVJbmZvKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXBpcGVsaW5lRXhlY3V0YWJsZUluZm8tMDMyNzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiBjYWxsZWQgd2hlbiBwaXBlbGluZUV4ZWN1dGFibGVJbmZvIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVQaXBlbGluZUV4ZWN1dGFibGVJbmZvKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSICpwRXhlY3V0YWJsZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmICghZW5hYmxlZF9mZWF0dXJlcy5waXBlbGluZV9leGVfcHJvcHNfZmVhdHVyZXMucGlwZWxpbmVFeGVjdXRhYmxlSW5mbykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1waXBlbGluZUV4ZWN1dGFibGVJbmZvLTAzMjcyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIgY2FsbGVkIHdoZW4gcGlwZWxpbmVFeGVjdXRhYmxlSW5mbyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLiIpOworICAgIH0KKworICAgIFZrUGlwZWxpbmVJbmZvS0hSIHBpID0ge307CisgICAgcGkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTkZPX0tIUjsKKyAgICBwaS5waXBlbGluZSA9IHBFeGVjdXRhYmxlSW5mby0+cGlwZWxpbmU7CisKKyAgICAvLyBXZSBjb3VsZCBwcm9iYWJseSBjYWNoZSB0aGlzIGluc3RlYWQgb2YgZmV0Y2hpbmcgaXQgZXZlcnkgdGltZQorICAgIHVpbnQzMl90IGV4ZWN1dGFibGVDb3VudCA9IDA7CisgICAgRGlzcGF0Y2hHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKGRldmljZSwgJnBpLCAmZXhlY3V0YWJsZUNvdW50LCBOVUxMKTsKKworICAgIGlmIChwRXhlY3V0YWJsZUluZm8tPmV4ZWN1dGFibGVJbmRleCA+PSBleGVjdXRhYmxlQ291bnQpIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBFeGVjdXRhYmxlSW5mby0+cGlwZWxpbmUpLCAiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFItZXhlY3V0YWJsZUluZGV4LTAzMjc1IiwKKyAgICAgICAgICAgICAgICAgICAgIlZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mbzo6ZXhlY3V0YWJsZUluZGV4ICglMXUpIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgZXhlY3V0YWJsZXMgYXNzb2NpYXRlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgInRoZSBwaXBlbGluZSAoJTF1KSBhcyByZXR1cm5lZCBieSB2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNzS0hSIiwKKyAgICAgICAgICAgICAgICAgICAgcEV4ZWN1dGFibGVJbmZvLT5leGVjdXRhYmxlSW5kZXgsIGV4ZWN1dGFibGVDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUihWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSICpwRXhlY3V0YWJsZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTdGF0aXN0aWNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiAqcFN0YXRpc3RpY3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZVBpcGVsaW5lRXhlY3V0YWJsZUluZm8oZGV2aWNlLCBwRXhlY3V0YWJsZUluZm8pOworCisgICAgY29uc3QgUElQRUxJTkVfU1RBVEUgKnBpcGVsaW5lX3N0YXRlID0gR2V0UGlwZWxpbmVTdGF0ZShwRXhlY3V0YWJsZUluZm8tPnBpcGVsaW5lKTsKKyAgICBpZiAoIShwaXBlbGluZV9zdGF0ZS0+Z2V0UGlwZWxpbmVDcmVhdGVGbGFncygpICYgVktfUElQRUxJTkVfQ1JFQVRFX0NBUFRVUkVfU1RBVElTVElDU19CSVRfS0hSKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocEV4ZWN1dGFibGVJbmZvLT5waXBlbGluZSksICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1waXBlbGluZS0wMzI3NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIGNhbGxlZCBvbiBhIHBpcGVsaW5lIGNyZWF0ZWQgd2l0aG91dCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1BJUEVMSU5FX0NSRUFURV9DQVBUVVJFX1NUQVRJU1RJQ1NfQklUX0tIUiBmbGFnIHNldCIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKAorICAgIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSICpwRXhlY3V0YWJsZUluZm8sIHVpbnQzMl90ICpwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiAqcFN0YXRpc3RpY3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZVBpcGVsaW5lRXhlY3V0YWJsZUluZm8oZGV2aWNlLCBwRXhlY3V0YWJsZUluZm8pOworCisgICAgY29uc3QgUElQRUxJTkVfU1RBVEUgKnBpcGVsaW5lX3N0YXRlID0gR2V0UGlwZWxpbmVTdGF0ZShwRXhlY3V0YWJsZUluZm8tPnBpcGVsaW5lKTsKKyAgICBpZiAoIShwaXBlbGluZV9zdGF0ZS0+Z2V0UGlwZWxpbmVDcmVhdGVGbGFncygpICYgVktfUElQRUxJTkVfQ1JFQVRFX0NBUFRVUkVfSU5URVJOQUxfUkVQUkVTRU5UQVRJT05TX0JJVF9LSFIpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwRXhlY3V0YWJsZUluZm8tPnBpcGVsaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcGlwZWxpbmUtMDMyNzgiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgY2FsbGVkIG9uIGEgcGlwZWxpbmUgY3JlYXRlZCB3aXRob3V0IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfUElQRUxJTkVfQ1JFQVRFX0NBUFRVUkVfSU5URVJOQUxfUkVQUkVTRU5UQVRJT05TX0JJVF9LSFIgZmxhZyBzZXQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dCAqcFNldExheW91dCkgY29uc3QgeworICAgIHJldHVybiBjdmRlc2NyaXB0b3JzZXQ6OlZhbGlkYXRlRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8oCisgICAgICAgIHJlcG9ydF9kYXRhLCBwQ3JlYXRlSW5mbywgSXNFeHRFbmFibGVkKGRldmljZV9leHRlbnNpb25zLnZrX2tocl9wdXNoX2Rlc2NyaXB0b3IpLCBwaHlzX2Rldl9leHRfcHJvcHMubWF4X3B1c2hfZGVzY3JpcHRvcnMsCisgICAgICAgIElzRXh0RW5hYmxlZChkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZGVzY3JpcHRvcl9pbmRleGluZyksICZlbmFibGVkX2ZlYXR1cmVzLmRlc2NyaXB0b3JfaW5kZXhpbmcsCisgICAgICAgICZlbmFibGVkX2ZlYXR1cmVzLmlubGluZV91bmlmb3JtX2Jsb2NrLCAmcGh5c19kZXZfZXh0X3Byb3BzLmlubGluZV91bmlmb3JtX2Jsb2NrX3Byb3BzLCAmZGV2aWNlX2V4dGVuc2lvbnMpOworfQorCisvLyBVc2VkIGJ5IENyZWF0ZVBpcGVsaW5lTGF5b3V0IGFuZCBDbWRQdXNoQ29uc3RhbnRzLgorLy8gTm90ZSB0aGF0IHRoZSBpbmRleCBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgb25seSB1c2VkIGJ5IENyZWF0ZVBpcGVsaW5lTGF5b3V0LgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVB1c2hDb25zdGFudFJhbmdlKGNvbnN0IHVpbnQzMl90IG9mZnNldCwgY29uc3QgdWludDMyX3Qgc2l6ZSwgY29uc3QgY2hhciAqY2FsbGVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXggPSAwKSBjb25zdCB7CisgICAgaWYgKGRpc2FibGVkLnB1c2hfY29uc3RhbnRfcmFuZ2UpIHJldHVybiBmYWxzZTsKKyAgICB1aW50MzJfdCBjb25zdCBtYXhQdXNoQ29uc3RhbnRzU2l6ZSA9IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhQdXNoQ29uc3RhbnRzU2l6ZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICAvLyBDaGVjayB0aGF0IG9mZnNldCArIHNpemUgZG9uJ3QgZXhjZWVkIHRoZSBtYXguCisgICAgLy8gUHJldmVudCBhcml0aGV0aWMgb3ZlcmZsb3cgaGVyZSBieSBhdm9pZGluZyBhZGRpdGlvbiBhbmQgdGVzdGluZyBpbiB0aGlzIG9yZGVyLgorICAgIGlmICgob2Zmc2V0ID49IG1heFB1c2hDb25zdGFudHNTaXplKSB8fCAoc2l6ZSA+IG1heFB1c2hDb25zdGFudHNTaXplIC0gb2Zmc2V0KSkgeworICAgICAgICAvLyBUaGlzIGlzIGEgcGFpbiBqdXN0IHRvIGFkYXB0IHRoZSBsb2cgbWVzc2FnZSB0byB0aGUgY2FsbGVyLCBidXQgYmV0dGVyIHRvIHNvcnQgaXQgb3V0IG9ubHkgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICAgIGlmICgwID09IHN0cmNtcChjYWxsZXJfbmFtZSwgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKSIpKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID49IG1heFB1c2hDb25zdGFudHNTaXplKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1vZmZzZXQtMDAyOTQiLAorICAgICAgICAgICAgICAgICAgICAiJXMgY2FsbCBoYXMgcHVzaCBjb25zdGFudHMgaW5kZXggJXUgd2l0aCBvZmZzZXQgJXUgdGhhdCBleGNlZWRzIHRoaXMgZGV2aWNlJ3MgbWF4UHVzaENvbnN0YW50U2l6ZSBvZiAldS4iLAorICAgICAgICAgICAgICAgICAgICBjYWxsZXJfbmFtZSwgaW5kZXgsIG9mZnNldCwgbWF4UHVzaENvbnN0YW50c1NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgPiBtYXhQdXNoQ29uc3RhbnRzU2l6ZSAtIG9mZnNldCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zaXplLTAwMjk4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4ICV1IHdpdGggb2Zmc2V0ICV1IGFuZCBzaXplICV1IHRoYXQgZXhjZWVkcyB0aGlzIGRldmljZSdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heFB1c2hDb25zdGFudFNpemUgb2YgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyX25hbWUsIGluZGV4LCBvZmZzZXQsIHNpemUsIG1heFB1c2hDb25zdGFudHNTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChjYWxsZXJfbmFtZSwgInZrQ21kUHVzaENvbnN0YW50cygpIikpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gbWF4UHVzaENvbnN0YW50c1NpemUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtb2Zmc2V0LTAwMzcwIiwKKyAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4ICV1IHdpdGggb2Zmc2V0ICV1IHRoYXQgZXhjZWVkcyB0aGlzIGRldmljZSdzIG1heFB1c2hDb25zdGFudFNpemUgb2YgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGVyX25hbWUsIGluZGV4LCBvZmZzZXQsIG1heFB1c2hDb25zdGFudHNTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplID4gbWF4UHVzaENvbnN0YW50c1NpemUgLSBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1zaXplLTAwMzcxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4ICV1IHdpdGggb2Zmc2V0ICV1IGFuZCBzaXplICV1IHRoYXQgZXhjZWVkcyB0aGlzIGRldmljZSdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heFB1c2hDb25zdGFudFNpemUgb2YgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyX25hbWUsIGluZGV4LCBvZmZzZXQsIHNpemUsIG1heFB1c2hDb25zdGFudHNTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnRlcm5hbEVycm9yLCAiJXMgY2FsbGVyIG5vdCBzdXBwb3J0ZWQuIiwgY2FsbGVyX25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIC8vIHNpemUgbmVlZHMgdG8gYmUgbm9uLXplcm8gYW5kIGEgbXVsdGlwbGUgb2YgNC4KKyAgICBpZiAoKHNpemUgPT0gMCkgfHwgKChzaXplICYgMHgzKSAhPSAwKSkgeworICAgICAgICBpZiAoMCA9PSBzdHJjbXAoY2FsbGVyX25hbWUsICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCkiKSkgeworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zaXplLTAwMjk2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4ICV1IHdpdGggc2l6ZSAldS4gU2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIsIGNhbGxlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSAmIDB4MykgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zaXplLTAwMjk3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4ICV1IHdpdGggc2l6ZSAldS4gU2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4iLCBjYWxsZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGNhbGxlcl9uYW1lLCAidmtDbWRQdXNoQ29uc3RhbnRzKCkiKSkgeworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXNpemUtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgY2FsbCBoYXMgcHVzaCBjb25zdGFudHMgaW5kZXggJXUgd2l0aCBzaXplICV1LiBTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIiwgY2FsbGVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplICYgMHgzKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc2l6ZS0wMDM2OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBjYWxsIGhhcyBwdXNoIGNvbnN0YW50cyBpbmRleCAldSB3aXRoIHNpemUgJXUuIFNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIiwgY2FsbGVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnRlcm5hbEVycm9yLCAiJXMgY2FsbGVyIG5vdCBzdXBwb3J0ZWQuIiwgY2FsbGVyX25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIC8vIG9mZnNldCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQuCisgICAgaWYgKChvZmZzZXQgJiAweDMpICE9IDApIHsKKyAgICAgICAgaWYgKDAgPT0gc3RyY21wKGNhbGxlcl9uYW1lLCAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIikpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLW9mZnNldC0wMDI5NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4ICV1IHdpdGggb2Zmc2V0ICV1LiBPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIiwgY2FsbGVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIG9mZnNldCk7CisgICAgICAgIH0gZWxzZSBpZiAoMCA9PSBzdHJjbXAoY2FsbGVyX25hbWUsICJ2a0NtZFB1c2hDb25zdGFudHMoKSIpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMDM2OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIHdpdGggb2Zmc2V0ICV1LiBPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIiwgY2FsbGVyX25hbWUsIG9mZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW50ZXJuYWxFcnJvciwgIiVzIGNhbGxlciBub3Qgc3VwcG9ydGVkLiIsIGNhbGxlcl9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworZW51bSBEU0xfREVTQ1JJUFRPUl9HUk9VUFMgeworICAgIERTTF9UWVBFX1NBTVBMRVJTID0gMCwKKyAgICBEU0xfVFlQRV9VTklGT1JNX0JVRkZFUlMsCisgICAgRFNMX1RZUEVfU1RPUkFHRV9CVUZGRVJTLAorICAgIERTTF9UWVBFX1NBTVBMRURfSU1BR0VTLAorICAgIERTTF9UWVBFX1NUT1JBR0VfSU1BR0VTLAorICAgIERTTF9UWVBFX0lOUFVUX0FUVEFDSE1FTlRTLAorICAgIERTTF9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLLAorICAgIERTTF9OVU1fREVTQ1JJUFRPUl9HUk9VUFMKK307CisKKy8vIFVzZWQgYnkgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVMYXlvdXQuCisvLyBSZXR1cm5zIGFuIGFycmF5IG9mIHNpemUgRFNMX05VTV9ERVNDUklQVE9SX0dST1VQUyBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgdXNlZCBpbiBhbnkgc2luZ2xlIHBpcGVsaW5lIHN0YWdlCitzdGQ6OnZhbGFycmF5PHVpbnQzMl90PiBHZXREZXNjcmlwdG9yQ291bnRNYXhQZXJTdGFnZSgKKyAgICBjb25zdCBEZXZpY2VGZWF0dXJlcyAqZW5hYmxlZF9mZWF0dXJlcywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbnN0Pj4gJnNldF9sYXlvdXRzLCBib29sIHNraXBfdXBkYXRlX2FmdGVyX2JpbmQpIHsKKyAgICAvLyBJZGVudGlmeSBhY3RpdmUgcGlwZWxpbmUgc3RhZ2VzCisgICAgc3RkOjp2ZWN0b3I8VmtTaGFkZXJTdGFnZUZsYWdzPiBzdGFnZV9mbGFncyA9IHtWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVH07CisgICAgaWYgKGVuYWJsZWRfZmVhdHVyZXMtPmNvcmUuZ2VvbWV0cnlTaGFkZXIpIHsKKyAgICAgICAgc3RhZ2VfZmxhZ3MucHVzaF9iYWNrKFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQpOworICAgIH0KKyAgICBpZiAoZW5hYmxlZF9mZWF0dXJlcy0+Y29yZS50ZXNzZWxsYXRpb25TaGFkZXIpIHsKKyAgICAgICAgc3RhZ2VfZmxhZ3MucHVzaF9iYWNrKFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQpOworICAgICAgICBzdGFnZV9mbGFncy5wdXNoX2JhY2soVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCk7CisgICAgfQorCisgICAgLy8gQWxsb3cgaXRlcmF0aW9uIG92ZXIgZW51bSB2YWx1ZXMKKyAgICBzdGQ6OnZlY3RvcjxEU0xfREVTQ1JJUFRPUl9HUk9VUFM+IGRzbF9ncm91cHMgPSB7CisgICAgICAgIERTTF9UWVBFX1NBTVBMRVJTLCAgICAgICBEU0xfVFlQRV9VTklGT1JNX0JVRkZFUlMsICAgRFNMX1RZUEVfU1RPUkFHRV9CVUZGRVJTLCAgICAgRFNMX1RZUEVfU0FNUExFRF9JTUFHRVMsCisgICAgICAgIERTTF9UWVBFX1NUT1JBR0VfSU1BR0VTLCBEU0xfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UUywgRFNMX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0t9OworCisgICAgLy8gU3VtIGJ5IGxheW91dHMgcGVyIHN0YWdlLCB0aGVuIHBpY2sgbWF4IG9mIHN0YWdlcyBwZXIgdHlwZQorICAgIHN0ZDo6dmFsYXJyYXk8dWludDMyX3Q+IG1heF9zdW0oMFUsIERTTF9OVU1fREVTQ1JJUFRPUl9HUk9VUFMpOyAgLy8gbWF4IGRlc2NyaXB0b3Igc3VtIGFtb25nIGFsbCBwaXBlbGluZSBzdGFnZXMKKyAgICBmb3IgKGF1dG8gc3RhZ2UgOiBzdGFnZV9mbGFncykgeworICAgICAgICBzdGQ6OnZhbGFycmF5PHVpbnQzMl90PiBzdGFnZV9zdW0oMFUsIERTTF9OVU1fREVTQ1JJUFRPUl9HUk9VUFMpOyAgLy8gcGVyLXN0YWdlIHN1bXMKKyAgICAgICAgZm9yIChhdXRvIGRzbCA6IHNldF9sYXlvdXRzKSB7CisgICAgICAgICAgICBpZiAoc2tpcF91cGRhdGVfYWZ0ZXJfYmluZCAmJgorICAgICAgICAgICAgICAgIChkc2wtPkdldENyZWF0ZUZsYWdzKCkgJiBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kaW5nX2lkeCA9IDA7IGJpbmRpbmdfaWR4IDwgZHNsLT5HZXRCaW5kaW5nQ291bnQoKTsgYmluZGluZ19pZHgrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgKmJpbmRpbmcgPSBkc2wtPkdldERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nUHRyRnJvbUluZGV4KGJpbmRpbmdfaWR4KTsKKyAgICAgICAgICAgICAgICAvLyBCaW5kaW5ncyB3aXRoIGEgZGVzY3JpcHRvckNvdW50IG9mIDAgYXJlICJyZXNlcnZlZCIgYW5kIHNob3VsZCBiZSBza2lwcGVkCisgICAgICAgICAgICAgICAgaWYgKDAgIT0gKHN0YWdlICYgYmluZGluZy0+c3RhZ2VGbGFncykgJiYgYmluZGluZy0+ZGVzY3JpcHRvckNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJpbmRpbmctPmRlc2NyaXB0b3JUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlX3N1bVtEU0xfVFlQRV9TQU1QTEVSU10gKz0gYmluZGluZy0+ZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlX3N1bVtEU0xfVFlQRV9VTklGT1JNX0JVRkZFUlNdICs9IGJpbmRpbmctPmRlc2NyaXB0b3JDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZV9zdW1bRFNMX1RZUEVfU1RPUkFHRV9CVUZGRVJTXSArPSBiaW5kaW5nLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2Vfc3VtW0RTTF9UWVBFX1NBTVBMRURfSU1BR0VTXSArPSBiaW5kaW5nLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2Vfc3VtW0RTTF9UWVBFX1NUT1JBR0VfSU1BR0VTXSArPSBiaW5kaW5nLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlX3N1bVtEU0xfVFlQRV9TQU1QTEVEX0lNQUdFU10gKz0gYmluZGluZy0+ZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlX3N1bVtEU0xfVFlQRV9TQU1QTEVSU10gKz0gYmluZGluZy0+ZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZV9zdW1bRFNMX1RZUEVfSU5QVVRfQVRUQUNITUVOVFNdICs9IGJpbmRpbmctPmRlc2NyaXB0b3JDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCBvbmUgYmxvY2sgcGVyIGJpbmRpbmcuIGRlc2NyaXB0b3JDb3VudCBpcyBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZV9zdW1bRFNMX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byB0eXBlIDogZHNsX2dyb3VwcykgeworICAgICAgICAgICAgbWF4X3N1bVt0eXBlXSA9IHN0ZDo6bWF4KHN0YWdlX3N1bVt0eXBlXSwgbWF4X3N1bVt0eXBlXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1heF9zdW07Cit9CisKKy8vIFVzZWQgYnkgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVMYXlvdXQuCisvLyBSZXR1cm5zIGEgbWFwIGluZGV4ZWQgYnkgVktfREVTQ1JJUFRPUl9UWVBFXyogZW51bSBvZiB0aGUgc3VtbWVkIGRlc2NyaXB0b3JzIGJ5IHR5cGUuCisvLyBOb3RlOiBkZXNjcmlwdG9ycyBvbmx5IGNvdW50IGFnYWluc3QgdGhlIGxpbWl0IG9uY2UgZXZlbiBpZiB1c2VkIGJ5IG11bHRpcGxlIHN0YWdlcy4KK3N0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gR2V0RGVzY3JpcHRvclN1bSgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbnN0Pj4gJnNldF9sYXlvdXRzLCBib29sIHNraXBfdXBkYXRlX2FmdGVyX2JpbmQpIHsKKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IHN1bV9ieV90eXBlOworICAgIGZvciAoYXV0byBkc2wgOiBzZXRfbGF5b3V0cykgeworICAgICAgICBpZiAoc2tpcF91cGRhdGVfYWZ0ZXJfYmluZCAmJiAoZHNsLT5HZXRDcmVhdGVGbGFncygpICYgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodWludDMyX3QgYmluZGluZ19pZHggPSAwOyBiaW5kaW5nX2lkeCA8IGRzbC0+R2V0QmluZGluZ0NvdW50KCk7IGJpbmRpbmdfaWR4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgKmJpbmRpbmcgPSBkc2wtPkdldERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nUHRyRnJvbUluZGV4KGJpbmRpbmdfaWR4KTsKKyAgICAgICAgICAgIC8vIEJpbmRpbmdzIHdpdGggYSBkZXNjcmlwdG9yQ291bnQgb2YgMCBhcmUgInJlc2VydmVkIiBhbmQgc2hvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgICAgIGlmIChiaW5kaW5nLT5kZXNjcmlwdG9yQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmctPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY291bnQgb25lIGJsb2NrIHBlciBiaW5kaW5nLiBkZXNjcmlwdG9yQ291bnQgaXMgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgIHN1bV9ieV90eXBlW2JpbmRpbmctPmRlc2NyaXB0b3JUeXBlXSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1bV9ieV90eXBlW2JpbmRpbmctPmRlc2NyaXB0b3JUeXBlXSArPSBiaW5kaW5nLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdW1fYnlfdHlwZTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lTGF5b3V0ICpwUGlwZWxpbmVMYXlvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFZhbGlkYXRlIGxheW91dCBjb3VudCBhZ2FpbnN0IGRldmljZSBwaHlzaWNhbCBsaW1pdAorICAgIGlmIChwQ3JlYXRlSW5mby0+c2V0TGF5b3V0Q291bnQgPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4Qm91bmREZXNjcmlwdG9yU2V0cykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1zZXRMYXlvdXRDb3VudC0wMDI4NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBzZXRMYXlvdXRDb3VudCAoJWQpIGV4Y2VlZHMgcGh5c2ljYWwgZGV2aWNlIG1heEJvdW5kRGVzY3JpcHRvclNldHMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnNldExheW91dENvdW50LCBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4Qm91bmREZXNjcmlwdG9yU2V0cyk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgUHVzaCBDb25zdGFudCByYW5nZXMKKyAgICB1aW50MzJfdCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+cHVzaENvbnN0YW50UmFuZ2VDb3VudDsgKytpKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVQdXNoQ29uc3RhbnRSYW5nZShwQ3JlYXRlSW5mby0+cFB1c2hDb25zdGFudFJhbmdlc1tpXS5vZmZzZXQsIHBDcmVhdGVJbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIiwgaSk7CisgICAgICAgIGlmICgwID09IHBDcmVhdGVJbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzW2ldLnN0YWdlRmxhZ3MpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLXN0YWdlRmxhZ3MtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIGNhbGwgaGFzIG5vIHN0YWdlRmxhZ3Mgc2V0LiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQXMgb2YgMS4wLjI4LCB0aGVyZSBpcyBhIFZVIHRoYXQgc3RhdGVzIHRoYXQgYSBzdGFnZSBmbGFnIGNhbm5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGxpc3Qgb2YgcHVzaCBjb25zdGFudCByYW5nZXMuCisgICAgZm9yIChpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5wdXNoQ29uc3RhbnRSYW5nZUNvdW50OyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBwQ3JlYXRlSW5mby0+cHVzaENvbnN0YW50UmFuZ2VDb3VudDsgKytqKSB7CisgICAgICAgICAgICBpZiAoMCAhPSAocENyZWF0ZUluZm8tPnBQdXNoQ29uc3RhbnRSYW5nZXNbaV0uc3RhZ2VGbGFncyAmIHBDcmVhdGVJbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzW2pdLnN0YWdlRmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wUHVzaENvbnN0YW50UmFuZ2VzLTAwMjkyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKSBEdXBsaWNhdGUgc3RhZ2UgZmxhZ3MgZm91bmQgaW4gcmFuZ2VzICVkIGFuZCAlZC4iLCBpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVhcmx5LW91dAorICAgIGlmIChza2lwKSByZXR1cm4gc2tpcDsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXQgY29uc3Q+PiBzZXRfbGF5b3V0cyhwQ3JlYXRlSW5mby0+c2V0TGF5b3V0Q291bnQsIG51bGxwdHIpOworICAgIHVuc2lnbmVkIGludCBwdXNoX2Rlc2NyaXB0b3Jfc2V0X2NvdW50ID0gMDsKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+c2V0TGF5b3V0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgc2V0X2xheW91dHNbaV0gPSBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U2hhcmVkKHBDcmVhdGVJbmZvLT5wU2V0TGF5b3V0c1tpXSk7CisgICAgICAgICAgICBpZiAoc2V0X2xheW91dHNbaV0tPklzUHVzaERlc2NyaXB0b3IoKSkgKytwdXNoX2Rlc2NyaXB0b3Jfc2V0X2NvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9zZXRfY291bnQgPiAxKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjkzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCkgTXVsdGlwbGUgcHVzaCBkZXNjcmlwdG9yIHNldHMgZm91bmQuIik7CisgICAgfQorCisgICAgLy8gTWF4IGRlc2NyaXB0b3JzIGJ5IHR5cGUsIHdpdGhpbiBhIHNpbmdsZSBwaXBlbGluZSBzdGFnZQorICAgIHN0ZDo6dmFsYXJyYXk8dWludDMyX3Q+IG1heF9kZXNjcmlwdG9yc19wZXJfc3RhZ2UgPSBHZXREZXNjcmlwdG9yQ291bnRNYXhQZXJTdGFnZSgmZW5hYmxlZF9mZWF0dXJlcywgc2V0X2xheW91dHMsIHRydWUpOworICAgIC8vIFNhbXBsZXJzCisgICAgaWYgKG1heF9kZXNjcmlwdG9yc19wZXJfc3RhZ2VbRFNMX1RZUEVfU0FNUExFUlNdID4gcGh5c19kZXZfcHJvcHMubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjg3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IG1heCBwZXItc3RhZ2Ugc2FtcGxlciBiaW5kaW5ncyBjb3VudCAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVycyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlW0RTTF9UWVBFX1NBTVBMRVJTXSwgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzKTsKKyAgICB9CisKKyAgICAvLyBVbmlmb3JtIGJ1ZmZlcnMKKyAgICBpZiAobWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZVtEU0xfVFlQRV9VTklGT1JNX0JVRkZFUlNdID4gcGh5c19kZXZfcHJvcHMubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzKSB7CisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjg4IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogbWF4IHBlci1zdGFnZSB1bmlmb3JtIGJ1ZmZlciBiaW5kaW5ncyBjb3VudCAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgbWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZVtEU0xfVFlQRV9VTklGT1JNX0JVRkZFUlNdLCBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVW5pZm9ybUJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIFN0b3JhZ2UgYnVmZmVycworICAgIGlmIChtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlW0RTTF9UWVBFX1NUT1JBR0VfQlVGRkVSU10gPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMpIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyODkiLAorICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBtYXggcGVyLXN0YWdlIHN0b3JhZ2UgYnVmZmVyIGJpbmRpbmdzIGNvdW50ICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICBtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlW0RTTF9UWVBFX1NUT1JBR0VfQlVGRkVSU10sIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVycyk7CisgICAgfQorCisgICAgLy8gU2FtcGxlZCBpbWFnZXMKKyAgICBpZiAobWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZVtEU0xfVFlQRV9TQU1QTEVEX0lNQUdFU10gPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcykgeworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI5MCIsCisgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IG1heCBwZXItc3RhZ2Ugc2FtcGxlZCBpbWFnZSBiaW5kaW5ncyBjb3VudCAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZWRJbWFnZXMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICBtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlW0RTTF9UWVBFX1NBTVBMRURfSU1BR0VTXSwgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZWRJbWFnZXMpOworICAgIH0KKworICAgIC8vIFN0b3JhZ2UgaW1hZ2VzCisgICAgaWYgKG1heF9kZXNjcmlwdG9yc19wZXJfc3RhZ2VbRFNMX1RZUEVfU1RPUkFHRV9JTUFHRVNdID4gcGh5c19kZXZfcHJvcHMubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXMpIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyOTEiLAorICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBtYXggcGVyLXN0YWdlIHN0b3JhZ2UgaW1hZ2UgYmluZGluZ3MgY291bnQgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgbWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZVtEU0xfVFlQRV9TVE9SQUdFX0lNQUdFU10sIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzKTsKKyAgICB9CisKKyAgICAvLyBJbnB1dCBhdHRhY2htZW50cworICAgIGlmIChtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlW0RTTF9UWVBFX0lOUFVUX0FUVEFDSE1FTlRTXSA+IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjc2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IG1heCBwZXItc3RhZ2UgaW5wdXQgYXR0YWNobWVudCBiaW5kaW5ncyBjb3VudCAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXNjcmlwdG9yc19wZXJfc3RhZ2VbRFNMX1RZUEVfSU5QVVRfQVRUQUNITUVOVFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMpOworICAgIH0KKworICAgIC8vIElubGluZSB1bmlmb3JtIGJsb2NrcworICAgIGlmIChtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlW0RTTF9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLXSA+CisgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5pbmxpbmVfdW5pZm9ybV9ibG9ja19wcm9wcy5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbmxpbmVVbmlmb3JtQmxvY2tzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjE0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IG1heCBwZXItc3RhZ2UgaW5saW5lIHVuaWZvcm0gYmxvY2sgYmluZGluZ3MgY291bnQgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrcyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlW0RTTF9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5pbmxpbmVfdW5pZm9ybV9ibG9ja19wcm9wcy5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbmxpbmVVbmlmb3JtQmxvY2tzKTsKKyAgICB9CisKKyAgICAvLyBUb3RhbCBkZXNjcmlwdG9ycyBieSB0eXBlCisgICAgLy8KKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IHN1bV9hbGxfc3RhZ2VzID0gR2V0RGVzY3JpcHRvclN1bShzZXRfbGF5b3V0cywgdHJ1ZSk7CisgICAgLy8gU2FtcGxlcnMKKyAgICB1aW50MzJfdCBzdW0gPSBzdW1fYWxsX3N0YWdlc1tWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUl0gKyBzdW1fYWxsX3N0YWdlc1tWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUl07CisgICAgaWYgKHN1bSA+IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzciLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogc3VtIG9mIHNhbXBsZXIgYmluZGluZ3MgYW1vbmcgYWxsIHN0YWdlcyAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtLCBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RGVzY3JpcHRvclNldFNhbXBsZXJzKTsKKyAgICB9CisKKyAgICAvLyBVbmlmb3JtIGJ1ZmZlcnMKKyAgICBpZiAoc3VtX2FsbF9zdGFnZXNbVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSXSA+IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzgiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogc3VtIG9mIHVuaWZvcm0gYnVmZmVyIGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl0sIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIER5bmFtaWMgdW5pZm9ybSBidWZmZXJzCisgICAgaWYgKHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDXSA+IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjc5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IHN1bSBvZiBkeW5hbWljIHVuaWZvcm0gYnVmZmVyIGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzRHluYW1pYyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdW1fYWxsX3N0YWdlc1tWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQ10sCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzRHluYW1pYyk7CisgICAgfQorCisgICAgLy8gU3RvcmFnZSBidWZmZXJzCisgICAgaWYgKHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl0gPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjgwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IHN1bSBvZiBzdG9yYWdlIGJ1ZmZlciBiaW5kaW5ncyBhbW9uZyBhbGwgc3RhZ2VzICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdW1fYWxsX3N0YWdlc1tWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJdLCBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzKTsKKyAgICB9CisKKyAgICAvLyBEeW5hbWljIHN0b3JhZ2UgYnVmZmVycworICAgIGlmIChzdW1fYWxsX3N0YWdlc1tWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQ10gPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBzdW0gb2YgZHluYW1pYyBzdG9yYWdlIGJ1ZmZlciBiaW5kaW5ncyBhbW9uZyBhbGwgc3RhZ2VzICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2FsbF9zdGFnZXNbVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUNdLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWMpOworICAgIH0KKworICAgIC8vICBTYW1wbGVkIGltYWdlcworICAgIHN1bSA9IHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFXSArIHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSXSArCisgICAgICAgICAgc3VtX2FsbF9zdGFnZXNbVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSXTsKKyAgICBpZiAoc3VtID4gcGh5c19kZXZfcHJvcHMubGltaXRzLm1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjgyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IHN1bSBvZiBzYW1wbGVkIGltYWdlIGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtLCBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMpOworICAgIH0KKworICAgIC8vICBTdG9yYWdlIGltYWdlcworICAgIHN1bSA9IHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFXSArIHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl07CisgICAgaWYgKHN1bSA+IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlcykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBzdW0gb2Ygc3RvcmFnZSBpbWFnZSBiaW5kaW5ncyBhbW9uZyBhbGwgc3RhZ2VzICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSwgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzKTsKKyAgICB9CisKKyAgICAvLyBJbnB1dCBhdHRhY2htZW50cworICAgIGlmIChzdW1fYWxsX3N0YWdlc1tWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVF0gPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHMpIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODQiLAorICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBzdW0gb2YgaW5wdXQgYXR0YWNobWVudCBiaW5kaW5ncyBhbW9uZyBhbGwgc3RhZ2VzICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICBzdW1fYWxsX3N0YWdlc1tWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVF0sIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cyk7CisgICAgfQorCisgICAgLy8gSW5saW5lIHVuaWZvcm0gYmxvY2tzCisgICAgaWYgKHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFRdID4KKyAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmlubGluZV91bmlmb3JtX2Jsb2NrX3Byb3BzLm1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjE2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IHN1bSBvZiBpbmxpbmUgdW5pZm9ybSBibG9jayBiaW5kaW5ncyBhbW9uZyBhbGwgc3RhZ2VzICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9hbGxfc3RhZ2VzW1ZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFRdLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmlubGluZV91bmlmb3JtX2Jsb2NrX3Byb3BzLm1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzKTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2Rlc2NyaXB0b3JfaW5kZXhpbmcpIHsKKyAgICAgICAgLy8gWFhYIFRPRE86IHJlcGxhY2Ugd2l0aCBjb3JyZWN0IFZVIG1lc3NhZ2VzCisKKyAgICAgICAgLy8gTWF4IGRlc2NyaXB0b3JzIGJ5IHR5cGUsIHdpdGhpbiBhIHNpbmdsZSBwaXBlbGluZSBzdGFnZQorICAgICAgICBzdGQ6OnZhbGFycmF5PHVpbnQzMl90PiBtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlX3VwZGF0ZV9hZnRlcl9iaW5kID0KKyAgICAgICAgICAgIEdldERlc2NyaXB0b3JDb3VudE1heFBlclN0YWdlKCZlbmFibGVkX2ZlYXR1cmVzLCBzZXRfbGF5b3V0cywgZmFsc2UpOworICAgICAgICAvLyBTYW1wbGVycworICAgICAgICBpZiAobWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZV91cGRhdGVfYWZ0ZXJfYmluZFtEU0xfVFlQRV9TQU1QTEVSU10gPgorICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogbWF4IHBlci1zdGFnZSBzYW1wbGVyIGJpbmRpbmdzIGNvdW50ICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVycyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZV91cGRhdGVfYWZ0ZXJfYmluZFtEU0xfVFlQRV9TQU1QTEVSU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVW5pZm9ybSBidWZmZXJzCisgICAgICAgIGlmIChtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlX3VwZGF0ZV9hZnRlcl9iaW5kW0RTTF9UWVBFX1VOSUZPUk1fQlVGRkVSU10gPgorICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogbWF4IHBlci1zdGFnZSB1bmlmb3JtIGJ1ZmZlciBiaW5kaW5ncyBjb3VudCAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXNjcmlwdG9yc19wZXJfc3RhZ2VfdXBkYXRlX2FmdGVyX2JpbmRbRFNMX1RZUEVfVU5JRk9STV9CVUZGRVJTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yYWdlIGJ1ZmZlcnMKKyAgICAgICAgaWYgKG1heF9kZXNjcmlwdG9yc19wZXJfc3RhZ2VfdXBkYXRlX2FmdGVyX2JpbmRbRFNMX1RZUEVfU1RPUkFHRV9CVUZGRVJTXSA+CisgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDI0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBtYXggcGVyLXN0YWdlIHN0b3JhZ2UgYnVmZmVyIGJpbmRpbmdzIGNvdW50ICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZV91cGRhdGVfYWZ0ZXJfYmluZFtEU0xfVFlQRV9TVE9SQUdFX0JVRkZFUlNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5kZXNjcmlwdG9yX2luZGV4aW5nX3Byb3BzLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNhbXBsZWQgaW1hZ2VzCisgICAgICAgIGlmIChtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlX3VwZGF0ZV9hZnRlcl9iaW5kW0RTTF9UWVBFX1NBTVBMRURfSU1BR0VTXSA+CisgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IG1heCBwZXItc3RhZ2Ugc2FtcGxlZCBpbWFnZSBiaW5kaW5ncyBjb3VudCAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlcyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZV91cGRhdGVfYWZ0ZXJfYmluZFtEU0xfVFlQRV9TQU1QTEVEX0lNQUdFU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yYWdlIGltYWdlcworICAgICAgICBpZiAobWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZV91cGRhdGVfYWZ0ZXJfYmluZFtEU0xfVFlQRV9TVE9SQUdFX0lNQUdFU10gPgorICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDI2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBtYXggcGVyLXN0YWdlIHN0b3JhZ2UgaW1hZ2UgYmluZGluZ3MgY291bnQgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXNjcmlwdG9yc19wZXJfc3RhZ2VfdXBkYXRlX2FmdGVyX2JpbmRbRFNMX1RZUEVfU1RPUkFHRV9JTUFHRVNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5kZXNjcmlwdG9yX2luZGV4aW5nX3Byb3BzLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5wdXQgYXR0YWNobWVudHMKKyAgICAgICAgaWYgKG1heF9kZXNjcmlwdG9yc19wZXJfc3RhZ2VfdXBkYXRlX2FmdGVyX2JpbmRbRFNMX1RZUEVfSU5QVVRfQVRUQUNITUVOVFNdID4KKyAgICAgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5kZXNjcmlwdG9yX2luZGV4aW5nX3Byb3BzLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogbWF4IHBlci1zdGFnZSBpbnB1dCBhdHRhY2htZW50IGJpbmRpbmdzIGNvdW50ICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVzY3JpcHRvcnNfcGVyX3N0YWdlX3VwZGF0ZV9hZnRlcl9iaW5kW0RTTF9UWVBFX0lOUFVUX0FUVEFDSE1FTlRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElubGluZSB1bmlmb3JtIGJsb2NrcworICAgICAgICBpZiAobWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZV91cGRhdGVfYWZ0ZXJfYmluZFtEU0xfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS10gPgorICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmlubGluZV91bmlmb3JtX2Jsb2NrX3Byb3BzLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjIxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogbWF4IHBlci1zdGFnZSBpbmxpbmUgdW5pZm9ybSBibG9jayBiaW5kaW5ncyBjb3VudCAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Rlc2NyaXB0b3JzX3Blcl9zdGFnZV91cGRhdGVfYWZ0ZXJfYmluZFtEU0xfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmlubGluZV91bmlmb3JtX2Jsb2NrX3Byb3BzLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVG90YWwgZGVzY3JpcHRvcnMgYnkgdHlwZSwgc3VtbWVkIGFjcm9zcyBhbGwgcGlwZWxpbmUgc3RhZ2VzCisgICAgICAgIC8vCisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gc3VtX2FsbF9zdGFnZXNfdXBkYXRlX2FmdGVyX2JpbmQgPSBHZXREZXNjcmlwdG9yU3VtKHNldF9sYXlvdXRzLCBmYWxzZSk7CisgICAgICAgIC8vIFNhbXBsZXJzCisgICAgICAgIHN1bSA9IHN1bV9hbGxfc3RhZ2VzX3VwZGF0ZV9hZnRlcl9iaW5kW1ZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSXSArCisgICAgICAgICAgICAgIHN1bV9hbGxfc3RhZ2VzX3VwZGF0ZV9hZnRlcl9iaW5kW1ZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSXTsKKyAgICAgICAgaWYgKHN1bSA+IHBoeXNfZGV2X2V4dF9wcm9wcy5kZXNjcmlwdG9yX2luZGV4aW5nX3Byb3BzLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVycykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAzMDM2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBzdW0gb2Ygc2FtcGxlciBiaW5kaW5ncyBhbW9uZyBhbGwgc3RhZ2VzICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSwgcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVuaWZvcm0gYnVmZmVycworICAgICAgICBpZiAoc3VtX2FsbF9zdGFnZXNfdXBkYXRlX2FmdGVyX2JpbmRbVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSXSA+CisgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzAzNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogc3VtIG9mIHVuaWZvcm0gYnVmZmVyIGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2FsbF9zdGFnZXNfdXBkYXRlX2FmdGVyX2JpbmRbVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRHluYW1pYyB1bmlmb3JtIGJ1ZmZlcnMKKyAgICAgICAgaWYgKHN1bV9hbGxfc3RhZ2VzX3VwZGF0ZV9hZnRlcl9iaW5kW1ZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDXSA+CisgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwMzgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IHN1bSBvZiBkeW5hbWljIHVuaWZvcm0gYnVmZmVyIGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyc0R5bmFtaWMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9hbGxfc3RhZ2VzX3VwZGF0ZV9hZnRlcl9iaW5kW1ZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JhZ2UgYnVmZmVycworICAgICAgICBpZiAoc3VtX2FsbF9zdGFnZXNfdXBkYXRlX2FmdGVyX2JpbmRbVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSXSA+CisgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzAzOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogc3VtIG9mIHN0b3JhZ2UgYnVmZmVyIGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX2FsbF9zdGFnZXNfdXBkYXRlX2FmdGVyX2JpbmRbVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRHluYW1pYyBzdG9yYWdlIGJ1ZmZlcnMKKyAgICAgICAgaWYgKHN1bV9hbGxfc3RhZ2VzX3VwZGF0ZV9hZnRlcl9iaW5kW1ZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDXSA+CisgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IHN1bSBvZiBkeW5hbWljIHN0b3JhZ2UgYnVmZmVyIGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9hbGxfc3RhZ2VzX3VwZGF0ZV9hZnRlcl9iaW5kW1ZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICBTYW1wbGVkIGltYWdlcworICAgICAgICBzdW0gPSBzdW1fYWxsX3N0YWdlc191cGRhdGVfYWZ0ZXJfYmluZFtWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRV0gKworICAgICAgICAgICAgICBzdW1fYWxsX3N0YWdlc191cGRhdGVfYWZ0ZXJfYmluZFtWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUl0gKworICAgICAgICAgICAgICBzdW1fYWxsX3N0YWdlc191cGRhdGVfYWZ0ZXJfYmluZFtWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVJdOworICAgICAgICBpZiAoc3VtID4gcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzA0MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogc3VtIG9mIHNhbXBsZWQgaW1hZ2UgYmluZGluZ3MgYW1vbmcgYWxsIHN0YWdlcyAoJWQpIGV4Y2VlZHMgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgbGltaXQgKCVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSwgcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gIFN0b3JhZ2UgaW1hZ2VzCisgICAgICAgIHN1bSA9IHN1bV9hbGxfc3RhZ2VzX3VwZGF0ZV9hZnRlcl9iaW5kW1ZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFXSArCisgICAgICAgICAgICAgIHN1bV9hbGxfc3RhZ2VzX3VwZGF0ZV9hZnRlcl9iaW5kW1ZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl07CisgICAgICAgIGlmIChzdW0gPiBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAzMDQyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpOiBzdW0gb2Ygc3RvcmFnZSBpbWFnZSBiaW5kaW5ncyBhbW9uZyBhbGwgc3RhZ2VzICglZCkgZXhjZWVkcyBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyBsaW1pdCAoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtLCBwaHlzX2Rldl9leHRfcHJvcHMuZGVzY3JpcHRvcl9pbmRleGluZ19wcm9wcy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnB1dCBhdHRhY2htZW50cworICAgICAgICBpZiAoc3VtX2FsbF9zdGFnZXNfdXBkYXRlX2FmdGVyX2JpbmRbVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlRdID4KKyAgICAgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5kZXNjcmlwdG9yX2luZGV4aW5nX3Byb3BzLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCk6IHN1bSBvZiBpbnB1dCBhdHRhY2htZW50IGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1fYWxsX3N0YWdlc191cGRhdGVfYWZ0ZXJfYmluZFtWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5saW5lIHVuaWZvcm0gYmxvY2tzCisgICAgICAgIGlmIChzdW1fYWxsX3N0YWdlc191cGRhdGVfYWZ0ZXJfYmluZFtWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUXSA+CisgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuaW5saW5lX3VuaWZvcm1fYmxvY2tfcHJvcHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjIxNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKTogc3VtIG9mIGlubGluZSB1bmlmb3JtIGJsb2NrIGJpbmRpbmdzIGFtb25nIGFsbCBzdGFnZXMgKCVkKSBleGNlZWRzIGRldmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzIGxpbWl0ICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1fYWxsX3N0YWdlc191cGRhdGVfYWZ0ZXJfYmluZFtWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2Rldl9leHRfcHJvcHMuaW5saW5lX3VuaWZvcm1fYmxvY2tfcHJvcHMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZVJlc2V0RGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgLy8gTWFrZSBzdXJlIHNldHMgYmVpbmcgZGVzdHJveWVkIGFyZSBub3QgY3VycmVudGx5IGluLXVzZQorICAgIGlmIChkaXNhYmxlZC5pZGxlX2Rlc2NyaXB0b3Jfc2V0KSByZXR1cm4gZmFsc2U7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgREVTQ1JJUFRPUl9QT09MX1NUQVRFICpwUG9vbCA9IEdldERlc2NyaXB0b3JQb29sU3RhdGUoZGVzY3JpcHRvclBvb2wpOworICAgIGlmIChwUG9vbCAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoYXV0byBkcyA6IHBQb29sLT5zZXRzKSB7CisgICAgICAgICAgICBpZiAoZHMgJiYgZHMtPmluX3VzZS5sb2FkKCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGVzY3JpcHRvclBvb2wpLCAiVlVJRC12a1Jlc2V0RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtMDAzMTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXQgaXMgaW52YWxpZCB0byBjYWxsIHZrUmVzZXREZXNjcmlwdG9yUG9vbCgpIHdpdGggZGVzY3JpcHRvciBzZXRzIGluIHVzZSBieSBhIGNvbW1hbmQgYnVmZmVyLiIpOworICAgICAgICAgICAgICAgIGlmIChza2lwKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gRW5zdXJlIHRoZSBwb29sIGNvbnRhaW5zIGVub3VnaCBkZXNjcmlwdG9ycyBhbmQgZGVzY3JpcHRvciBzZXRzIHRvIHNhdGlzZnkKKy8vIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4gRmlsbHMgY29tbW9uX2RhdGEgd2l0aCB0aGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIGVhY2ggdHlwZSByZXF1aXJlZCwKKy8vIGFzIHdlbGwgYXMgRGVzY3JpcHRvclNldExheW91dCBwdHJzIHVzZWQgZm9yIGxhdGVyIHVwZGF0ZS4KK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cywgdm9pZCAqYWRzX3N0YXRlX2RhdGEpIGNvbnN0IHsKKyAgICBTdGF0ZVRyYWNrZXI6OlByZUNhbGxWYWxpZGF0ZUFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMsIGFkc19zdGF0ZV9kYXRhKTsKKworICAgIGN2ZGVzY3JpcHRvcnNldDo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEgKmFkc19zdGF0ZSA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y3ZkZXNjcmlwdG9yc2V0OjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzRGF0YSAqPihhZHNfc3RhdGVfZGF0YSk7CisgICAgLy8gQWxsIHN0YXRlIGNoZWNrcyBmb3IgQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyBpcyBkb25lIGluIHNpbmdsZSBmdW5jdGlvbgorICAgIHJldHVybiBWYWxpZGF0ZUFsbG9jYXRlRGVzY3JpcHRvclNldHMocEFsbG9jYXRlSW5mbywgYWRzX3N0YXRlKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVGcmVlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JTZXRzKSBjb25zdCB7CisgICAgLy8gTWFrZSBzdXJlIHRoYXQgbm8gc2V0cyBiZWluZyBkZXN0cm95ZWQgYXJlIGluLWZsaWdodAorICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSBzZXRzIGJlaW5nIGRlc3Ryb3llZCBhcmUgbm90IGN1cnJlbnRseSBpbi11c2UKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBpZiAocERlc2NyaXB0b3JTZXRzW2ldICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSWRsZURlc2NyaXB0b3JTZXQocERlc2NyaXB0b3JTZXRzW2ldLCAidmtGcmVlRGVzY3JpcHRvclNldHMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBERVNDUklQVE9SX1BPT0xfU1RBVEUgKnBvb2xfc3RhdGUgPSBHZXREZXNjcmlwdG9yUG9vbFN0YXRlKGRlc2NyaXB0b3JQb29sKTsKKyAgICBpZiAocG9vbF9zdGF0ZSAmJiAhKFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfRlJFRV9ERVNDUklQVE9SX1NFVF9CSVQgJiBwb29sX3N0YXRlLT5jcmVhdGVJbmZvLmZsYWdzKSkgeworICAgICAgICAvLyBDYW4ndCBGcmVlIGZyb20gYSBOT05fRlJFRSBwb29sCisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGVzY3JpcHRvclBvb2wpLCAiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1kZXNjcmlwdG9yUG9vbC0wMDMxMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSXQgaXMgaW52YWxpZCB0byBjYWxsIHZrRnJlZURlc2NyaXB0b3JTZXRzKCkgd2l0aCBhIHBvb2wgY3JlYXRlZCB3aXRob3V0IHNldHRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfRlJFRV9ERVNDUklQVE9SX1NFVF9CSVQuIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvcldyaXRlcywgdWludDMyX3QgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JDb3BpZXMpIGNvbnN0IHsKKyAgICAvLyBGaXJzdCB0aGluZyB0byBkbyBpcyBwZXJmb3JtIG1hcCBsb29rLXVwcy4KKyAgICAvLyBOT1RFIDogVXBkYXRlRGVzY3JpcHRvclNldHMgaXMgc29tZXdoYXQgdW5pcXVlIGluIHRoYXQgaXQncyBvcGVyYXRpbmcgb24gYSBudW1iZXIgb2YgRGVzY3JpcHRvclNldHMKKyAgICAvLyAgc28gd2UgY2FuJ3QganVzdCBkbyBhIHNpbmdsZSBtYXAgbG9vay11cCB1cC1mcm9udCwgYnV0IGRvIHRoZW0gaW5kaXZpZHVhbGx5IGluIGZ1bmN0aW9ucyBiZWxvdworCisgICAgLy8gTm93IG1ha2UgY2FsbChzKSB0aGF0IHZhbGlkYXRlIHN0YXRlLCBidXQgZG9uJ3QgcGVyZm9ybSBzdGF0ZSB1cGRhdGVzIGluIHRoaXMgZnVuY3Rpb24KKyAgICAvLyBOb3RlLCBoZXJlIERlc2NyaXB0b3JTZXRzIGlzIHVuaXF1ZSBpbiB0aGF0IHdlIGRvbid0IHlldCBoYXZlIGFuIGluc3RhbmNlLiBVc2luZyBhIGhlbHBlciBmdW5jdGlvbiBpbiB0aGUKKyAgICAvLyAgbmFtZXNwYWNlIHdoaWNoIHdpbGwgcGFyc2UgcGFyYW1zIGFuZCBtYWtlIGNhbGxzIGludG8gc3BlY2lmaWMgY2xhc3MgaW5zdGFuY2VzCisgICAgcmV0dXJuIFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldHMoZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzLCBkZXNjcmlwdG9yQ29weUNvdW50LCBwRGVzY3JpcHRvckNvcGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtVcGRhdGVEZXNjcmlwdG9yU2V0cygpIik7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQmVnaW5Db21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvICpwQmVnaW5JbmZvKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGlmICghY2Jfc3RhdGUpIHJldHVybiBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoY2Jfc3RhdGUtPmluX3VzZS5sb2FkKCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0JlZ2luQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDQ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsaW5nIHZrQmVnaW5Db21tYW5kQnVmZmVyKCkgb24gYWN0aXZlICVzIGJlZm9yZSBpdCBoYXMgY29tcGxldGVkLiBZb3UgbXVzdCBjaGVjayAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZCBidWZmZXIgZmVuY2UgYmVmb3JlIHRoaXMgY2FsbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjb21tYW5kQnVmZmVyKS5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKGNiX3N0YXRlLT5jcmVhdGVJbmZvLmxldmVsICE9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlkpIHsKKyAgICAgICAgLy8gU2Vjb25kYXJ5IENvbW1hbmQgQnVmZmVyCisgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyAqcEluZm8gPSBwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvOworICAgICAgICBpZiAoIXBJbmZvKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0JlZ2luQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDUxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtCZWdpbkNvbW1hbmRCdWZmZXIoKTogU2Vjb25kYXJ5ICVzIG11c3QgaGF2ZSBpbmhlcml0YW5jZSBpbmZvLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjb21tYW5kQnVmZmVyKS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwQmVnaW5JbmZvLT5mbGFncyAmIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCkgeworICAgICAgICAgICAgICAgIGFzc2VydChwSW5mby0+cmVuZGVyUGFzcyk7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAqZnJhbWVidWZmZXIgPSBHZXRGcmFtZWJ1ZmZlclN0YXRlKHBJbmZvLT5mcmFtZWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZWJ1ZmZlci0+Y3JlYXRlSW5mby5yZW5kZXJQYXNzICE9IHBJbmZvLT5yZW5kZXJQYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICpyZW5kZXJfcGFzcyA9IEdldFJlbmRlclBhc3NTdGF0ZShwSW5mby0+cmVuZGVyUGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJQYXNzIHRoYXQgZnJhbWVidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBsb2NhbCByZW5kZXJQYXNzCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlUmVuZGVyUGFzc0NvbXBhdGliaWxpdHkoImZyYW1lYnVmZmVyIiwgZnJhbWVidWZmZXItPnJwX3N0YXRlLmdldCgpLCAiY29tbWFuZCBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9wYXNzLCAidmtCZWdpbkNvbW1hbmRCdWZmZXIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWZsYWdzLTAwMDU1Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHBJbmZvLT5vY2NsdXNpb25RdWVyeUVuYWJsZSA9PSBWS19GQUxTRSB8fCBlbmFibGVkX2ZlYXR1cmVzLmNvcmUub2NjbHVzaW9uUXVlcnlQcmVjaXNlID09IFZLX0ZBTFNFKSAmJgorICAgICAgICAgICAgICAgIChwSW5mby0+cXVlcnlGbGFncyAmIFZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtCZWdpbkNvbW1hbmRCdWZmZXIoKTogU2Vjb25kYXJ5ICVzIG11c3Qgbm90IGhhdmUgVktfUVVFUllfQ09OVFJPTF9QUkVDSVNFX0JJVCBpZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvY2N1bHVzaW9uUXVlcnkgaXMgZGlzYWJsZWQgb3IgdGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHByZWNpc2Ugb2NjbHVzaW9uIHF1ZXJpZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjb21tYW5kQnVmZmVyKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocEluZm8gJiYgcEluZm8tPnJlbmRlclBhc3MgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gKnJlbmRlclBhc3MgPSBHZXRSZW5kZXJQYXNzU3RhdGUocEluZm8tPnJlbmRlclBhc3MpOworICAgICAgICAgICAgaWYgKHJlbmRlclBhc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAocEluZm8tPnN1YnBhc3MgPj0gcmVuZGVyUGFzcy0+Y3JlYXRlSW5mby5zdWJwYXNzQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tZmxhZ3MtMDAwNTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQmVnaW5Db21tYW5kQnVmZmVyKCk6IFNlY29uZGFyeSAlcyBtdXN0IGhhdmUgYSBzdWJwYXNzIGluZGV4ICglZCkgdGhhdCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGVzcyB0aGFuIHRoZSBudW1iZXIgb2Ygc3VicGFzc2VzICglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY29tbWFuZEJ1ZmZlcikuY19zdHIoKSwgcEluZm8tPnN1YnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLT5jcmVhdGVJbmZvLnN1YnBhc3NDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChDQl9SRUNPUkRJTkcgPT0gY2Jfc3RhdGUtPnN0YXRlKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtCZWdpbkNvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA0OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtCZWdpbkNvbW1hbmRCdWZmZXIoKTogQ2Fubm90IGNhbGwgQmVnaW4gb24gJXMgaW4gdGhlIFJFQ09SRElORyBzdGF0ZS4gTXVzdCBmaXJzdCBjYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0VuZENvbW1hbmRCdWZmZXIoKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjb21tYW5kQnVmZmVyKS5jX3N0cigpKTsKKyAgICB9IGVsc2UgaWYgKENCX1JFQ09SREVEID09IGNiX3N0YXRlLT5zdGF0ZSB8fCBDQl9JTlZBTElEX0NPTVBMRVRFID09IGNiX3N0YXRlLT5zdGF0ZSkgeworICAgICAgICBWa0NvbW1hbmRQb29sIGNtZFBvb2wgPSBjYl9zdGF0ZS0+Y3JlYXRlSW5mby5jb21tYW5kUG9vbDsKKyAgICAgICAgY29uc3QgYXV0byAqcFBvb2wgPSBjYl9zdGF0ZS0+Y29tbWFuZF9wb29sLmdldCgpOworICAgICAgICBpZiAoIShWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCAmIHBQb29sLT5jcmVhdGVGbGFncykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsIHRvIHZrQmVnaW5Db21tYW5kQnVmZmVyKCkgb24gJXMgYXR0ZW1wdHMgdG8gaW1wbGljaXRseSByZXNldCBjbWRCdWZmZXIgY3JlYXRlZCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgdGhhdCBkb2VzIE5PVCBoYXZlIHRoZSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCBiaXQgc2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjb21tYW5kQnVmZmVyKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGNtZFBvb2wpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIGF1dG8gY2hhaW5lZF9kZXZpY2VfZ3JvdXBfc3RydWN0ID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8+KHBCZWdpbkluZm8tPnBOZXh0KTsKKyAgICBpZiAoY2hhaW5lZF9kZXZpY2VfZ3JvdXBfc3RydWN0KSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVEZXZpY2VNYXNrVG9QaHlzaWNhbERldmljZUNvdW50KAorICAgICAgICAgICAgY2hhaW5lZF9kZXZpY2VfZ3JvdXBfc3RydWN0LT5kZXZpY2VNYXNrLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULCBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwKKyAgICAgICAgICAgICJWVUlELVZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWRldmljZU1hc2stMDAxMDYiKTsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgVmFsaWRhdGVEZXZpY2VNYXNrVG9aZXJvKGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+ZGV2aWNlTWFzaywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8tZGV2aWNlTWFzay0wMDEwNyIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVFbmRDb21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGlmICghY2Jfc3RhdGUpIHJldHVybiBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoKFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlkgPT0gY2Jfc3RhdGUtPmNyZWF0ZUluZm8ubGV2ZWwpIHx8CisgICAgICAgICEoY2Jfc3RhdGUtPmJlZ2luSW5mby5mbGFncyAmIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCkpIHsKKyAgICAgICAgLy8gVGhpcyBuZWVkcyBzcGVjIGNsYXJpZmljYXRpb24gdG8gdXBkYXRlIHZhbGlkIHVzYWdlLCBzZWUgY29tbWVudHMgaW4gUFI6CisgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVnVsa2FuLVZhbGlkYXRpb25MYXllcnMvaXNzdWVzLzE2NQorICAgICAgICBza2lwIHw9IEluc2lkZVJlbmRlclBhc3MoY2Jfc3RhdGUsICJ2a0VuZENvbW1hbmRCdWZmZXIoKSIsICJWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDYwIik7CisgICAgfQorCisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX0VORENPTU1BTkRCVUZGRVIsICJ2a0VuZENvbW1hbmRCdWZmZXIoKSIpOworICAgIGZvciAoYXV0byBxdWVyeSA6IGNiX3N0YXRlLT5hY3RpdmVRdWVyaWVzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVuZGluZyBjb21tYW5kIGJ1ZmZlciB3aXRoIGluIHByb2dyZXNzIHF1ZXJ5OiAlcywgcXVlcnkgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnkucG9vbCkuY19zdHIoKSwgcXVlcnkucXVlcnkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVSZXNldENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgZmxhZ3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpwQ0IgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGlmICghcENCKSByZXR1cm4gZmFsc2U7CisgICAgVmtDb21tYW5kUG9vbCBjbWRQb29sID0gcENCLT5jcmVhdGVJbmZvLmNvbW1hbmRQb29sOworICAgIGNvbnN0IGF1dG8gKnBQb29sID0gcENCLT5jb21tYW5kX3Bvb2wuZ2V0KCk7CisKKyAgICBpZiAoIShWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCAmIHBQb29sLT5jcmVhdGVGbGFncykpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a1Jlc2V0Q29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDQ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHJlc2V0ICVzIGNyZWF0ZWQgZnJvbSAlcyB0aGF0IGRvZXMgTk9UIGhhdmUgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCBiaXQgc2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGNvbW1hbmRCdWZmZXIpLmNfc3RyKCksIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY21kUG9vbCkuY19zdHIoKSk7CisgICAgfQorICAgIHNraXAgfD0gQ2hlY2tDb21tYW5kQnVmZmVySW5GbGlnaHQocENCLCAicmVzZXQiLCAiVlVJRC12a1Jlc2V0Q29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDQ1Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKkdldFBpcGVsaW5lVHlwZU5hbWUoVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCkgeworICAgIHN3aXRjaCAocGlwZWxpbmVCaW5kUG9pbnQpIHsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTOgorICAgICAgICAgICAgcmV0dXJuICJncmFwaGljcyI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFOgorICAgICAgICAgICAgcmV0dXJuICJjb21wdXRlIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WOgorICAgICAgICAgICAgcmV0dXJuICJyYXktdHJhY2luZyI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRCaW5kUGlwZWxpbmUoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lIHBpcGVsaW5lKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZEJpbmRQaXBlbGluZSgpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmluZFBpcGVsaW5lLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9CSU5EUElQRUxJTkUsICJ2a0NtZEJpbmRQaXBlbGluZSgpIik7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPFZrUGlwZWxpbmVCaW5kUG9pbnQsIHN0ZDo6c3RyaW5nPiBiaW5kcG9pbnRfZXJyb3JzID0geworICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMDc3NyIpLAorICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsICJWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAwNzc4IiksCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYsICJWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAyMzkxIil9OworCisgICAgc2tpcCB8PSBWYWxpZGF0ZVBpcGVsaW5lQmluZFBvaW50KGNiX3N0YXRlLCBwaXBlbGluZUJpbmRQb2ludCwgInZrQ21kQmluZFBpcGVsaW5lKCkiLCBiaW5kcG9pbnRfZXJyb3JzKTsKKworICAgIGNvbnN0IGF1dG8gKnBpcGVsaW5lX3N0YXRlID0gR2V0UGlwZWxpbmVTdGF0ZShwaXBlbGluZSk7CisgICAgYXNzZXJ0KHBpcGVsaW5lX3N0YXRlKTsKKworICAgIGNvbnN0IGF1dG8gJnBpcGVsaW5lX3N0YXRlX2JpbmRfcG9pbnQgPSBwaXBlbGluZV9zdGF0ZS0+Z2V0UGlwZWxpbmVUeXBlKCk7CisKKyAgICBpZiAocGlwZWxpbmVCaW5kUG9pbnQgIT0gcGlwZWxpbmVfc3RhdGVfYmluZF9wb2ludCkgeworICAgICAgICBpZiAocGlwZWxpbmVCaW5kUG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAwNzc5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGJpbmQgYSBwaXBlbGluZSBvZiB0eXBlICVzIHRvIHRoZSBncmFwaGljcyBwaXBlbGluZSBiaW5kIHBvaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQaXBlbGluZVR5cGVOYW1lKHBpcGVsaW5lX3N0YXRlX2JpbmRfcG9pbnQpKTsKKyAgICAgICAgfSBlbHNlIGlmIChwaXBlbGluZUJpbmRQb2ludCA9PSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMDc4MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBiaW5kIGEgcGlwZWxpbmUgb2YgdHlwZSAlcyB0byB0aGUgY29tcHV0ZSBwaXBlbGluZSBiaW5kIHBvaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQaXBlbGluZVR5cGVOYW1lKHBpcGVsaW5lX3N0YXRlX2JpbmRfcG9pbnQpKTsKKyAgICAgICAgfSBlbHNlIGlmIChwaXBlbGluZUJpbmRQb2ludCA9PSBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtMDIzOTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYmluZCBhIHBpcGVsaW5lIG9mIHR5cGUgJXMgdG8gdGhlIHJheS10cmFjaW5nIHBpcGVsaW5lIGJpbmQgcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBpcGVsaW5lVHlwZU5hbWUocGlwZWxpbmVfc3RhdGVfYmluZF9wb2ludCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrVmlld3BvcnQgKnBWaWV3cG9ydHMpIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBib29sIHNraXAgPQorICAgICAgICBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZFNldFZpZXdwb3J0KCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1NFVFZJRVdQT1JULCAidmtDbWRTZXRWaWV3cG9ydCgpIik7CisgICAgaWYgKGNiX3N0YXRlLT5zdGF0aWNfc3RhdHVzICYgQ0JTVEFUVVNfVklFV1BPUlRfU0VUKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1Ob25lLTAxMjIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldFZpZXdwb3J0KCk6IHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGhvdXQgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCBmbGFnLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRTY2lzc29yKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFNjaXNzb3IsIHVpbnQzMl90IHNjaXNzb3JDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JlY3QyRCAqcFNjaXNzb3JzKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgYm9vbCBza2lwID0KKyAgICAgICAgVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCAidmtDbWRTZXRTY2lzc29yKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsICJWVUlELXZrQ21kU2V0U2Npc3Nvci1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfU0VUU0NJU1NPUiwgInZrQ21kU2V0U2Npc3NvcigpIik7CisgICAgaWYgKGNiX3N0YXRlLT5zdGF0aWNfc3RhdHVzICYgQ0JTVEFUVVNfU0NJU1NPUl9TRVQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldFNjaXNzb3ItTm9uZS0wMDU5MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRTY2lzc29yKCk6IHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGhvdXQgVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SIGZsYWcuLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RXhjbHVzaXZlU2Npc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwgY29uc3QgVmtSZWN0MkQgKnBFeGNsdXNpdmVTY2lzc29ycykgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9TRVRFWENMVVNJVkVTQ0lTU09STlYsICJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVigpIik7CisgICAgaWYgKGNiX3N0YXRlLT5zdGF0aWNfc3RhdHVzICYgQ0JTVEFUVVNfRVhDTFVTSVZFX1NDSVNTT1JfU0VUKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtTm9uZS0wMjAzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoKTogcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aG91dCBWS19EWU5BTUlDX1NUQVRFX0VYQ0xVU0lWRV9TQ0lTU09SX05WIGZsYWcuIik7CisgICAgfQorCisgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmV4Y2x1c2l2ZV9zY2lzc29yLmV4Y2x1c2l2ZVNjaXNzb3IpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1Ob25lLTAyMDMxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjogVGhlIGV4Y2x1c2l2ZVNjaXNzb3IgZmVhdHVyZSBpcyBkaXNhYmxlZC4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCkgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgInZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVigpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfQklORFNIQURJTkdSQVRFSU1BR0VOViwgInZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVigpIik7CisKKyAgICBpZiAoIWVuYWJsZWRfZmVhdHVyZXMuc2hhZGluZ19yYXRlX2ltYWdlLnNoYWRpbmdSYXRlSW1hZ2UpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtTm9uZS0wMjA1OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WOiBUaGUgc2hhZGluZ1JhdGVJbWFnZSBmZWF0dXJlIGlzIGRpc2FibGVkLiIpOworICAgIH0KKworICAgIGlmIChpbWFnZVZpZXcgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgY29uc3QgYXV0byB2aWV3X3N0YXRlID0gR2V0SW1hZ2VWaWV3U3RhdGUoaW1hZ2VWaWV3KTsKKyAgICAgICAgYXV0byAmaXZjaSA9IHZpZXdfc3RhdGUtPmNyZWF0ZV9pbmZvOworCisgICAgICAgIGlmICghdmlld19zdGF0ZSB8fCAoaXZjaS52aWV3VHlwZSAhPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQgJiYgaXZjaS52aWV3VHlwZSAhPSBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfVklFV19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2VWaWV3KSwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA1OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVjogSWYgaW1hZ2VWaWV3IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaXQgbXVzdCBiZSBhIHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtJbWFnZVZpZXcgaGFuZGxlIG9mIHR5cGUgVktfSU1BR0VfVklFV19UWVBFXzJEIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWV3X3N0YXRlICYmIGl2Y2kuZm9ybWF0ICE9IFZLX0ZPUk1BVF9SOF9VSU5UKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfVklFV19FWFQsIEhhbmRsZVRvVWludDY0KGltYWdlVmlldyksCisgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA2MCIsCisgICAgICAgICAgICAgICAgInZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVjogSWYgaW1hZ2VWaWV3IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaXQgbXVzdCBoYXZlIGEgZm9ybWF0IG9mIFZLX0ZPUk1BVF9SOF9VSU5ULiIpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmljaSA9IHZpZXdfc3RhdGUgPyAmR2V0SW1hZ2VTdGF0ZSh2aWV3X3N0YXRlLT5jcmVhdGVfaW5mby5pbWFnZSktPmNyZWF0ZUluZm8gOiBudWxscHRyOworICAgICAgICBpZiAoaWNpICYmICEoaWNpLT51c2FnZSAmIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfVklFV19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2VWaWV3KSwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA2MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVjogSWYgaW1hZ2VWaWV3IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgdGhlIGltYWdlIG11c3QgaGF2ZSBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYgc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZpZXdfc3RhdGUpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHZpZXdfc3RhdGUtPmNyZWF0ZV9pbmZvLmltYWdlKTsKKyAgICAgICAgICAgIGJvb2wgaGl0X2Vycm9yID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIFhYWCBUT0RPOiBXaGlsZSB0aGUgVlVJRCBzYXlzICJlYWNoIHN1YnJlc291cmNlIiwgb25seSB0aGUgYmFzZSBtaXAgbGV2ZWwgaXMKKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IHVzZWQuIFNpbmNlIHdlIGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gaXRlcmF0ZQorICAgICAgICAgICAgLy8gb3ZlciBhbGwgbWlwIGxldmVscywganVzdCBkb24ndCBib3RoZXIgd2l0aCBub24tYmFzZSBsZXZlbHMuCisgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmcmFuZ2UgPSB2aWV3X3N0YXRlLT5jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlOworICAgICAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzIHN1YnJlc291cmNlID0ge3JhbmdlLmFzcGVjdE1hc2ssIHJhbmdlLmJhc2VNaXBMZXZlbCwgcmFuZ2UuYmFzZUFycmF5TGF5ZXIsIHJhbmdlLmxheWVyQ291bnR9OworCisgICAgICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZlcmlmeUltYWdlTGF5b3V0KGNiX3N0YXRlLCBpbWFnZV9zdGF0ZSwgc3VicmVzb3VyY2UsIGltYWdlTGF5b3V0LCBWS19JTUFHRV9MQVlPVVRfU0hBRElOR19SQVRFX09QVElNQUxfTlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKSIsICJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1pbWFnZUxheW91dC0wMjA2MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtaW1hZ2VWaWV3LTAyMDYyIiwgJmhpdF9lcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViAqcFNoYWRpbmdSYXRlUGFsZXR0ZXMpIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoKSIsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworCisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1NFVFZJRVdQT1JUU0hBRElOR1JBVEVQQUxFVFRFTlYsICJ2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoKSIpOworCisgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLnNoYWRpbmdfcmF0ZV9pbWFnZS5zaGFkaW5nUmF0ZUltYWdlKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLU5vbmUtMDIwNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVjogVGhlIHNoYWRpbmdSYXRlSW1hZ2UgZmVhdHVyZSBpcyBkaXNhYmxlZC4iKTsKKyAgICB9CisKKyAgICBpZiAoY2Jfc3RhdGUtPnN0YXRpY19zdGF0dXMgJiBDQlNUQVRVU19TSEFESU5HX1JBVEVfUEFMRVRURV9TRVQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtTm9uZS0wMjA2NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKCk6IHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGhvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfU0hBRElOR19SQVRFX1BBTEVUVEVfTlYgZmxhZy4iKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdmlld3BvcnRDb3VudDsgKytpKSB7CisgICAgICAgIGF1dG8gKnBhbGV0dGUgPSAmcFNoYWRpbmdSYXRlUGFsZXR0ZXNbaV07CisgICAgICAgIGlmIChwYWxldHRlLT5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50ID09IDAgfHwKKyAgICAgICAgICAgIHBhbGV0dGUtPnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQgPiBwaHlzX2Rldl9leHRfcHJvcHMuc2hhZGluZ19yYXRlX2ltYWdlX3Byb3BzLnNoYWRpbmdSYXRlUGFsZXR0ZVNpemUpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELVZrU2hhZGluZ1JhdGVQYWxldHRlTlYtc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudC0wMjA3MSIsCisgICAgICAgICAgICAgICAgInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVjogc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgc2hhZGluZ1JhdGVQYWxldHRlU2l6ZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2VvbWV0cnlUcmlhbmdsZXNOVihjb25zdCBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgJnRyaWFuZ2xlcywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvYmplY3RfaGFuZGxlLCBjb25zdCBjaGFyICpmdW5jX25hbWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IEJVRkZFUl9TVEFURSAqdmJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZSh0cmlhbmdsZXMudmVydGV4RGF0YSk7CisgICAgaWYgKHZiX3N0YXRlICE9IG51bGxwdHIgJiYgdmJfc3RhdGUtPmJpbmRpbmcuc2l6ZSA8PSB0cmlhbmdsZXMudmVydGV4T2Zmc2V0KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleE9mZnNldC0wMjQyOCIsICIlcyIsIGZ1bmNfbmFtZSk7CisgICAgfQorCisgICAgY29uc3QgQlVGRkVSX1NUQVRFICppYl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKHRyaWFuZ2xlcy5pbmRleERhdGEpOworICAgIGlmIChpYl9zdGF0ZSAhPSBudWxscHRyICYmIGliX3N0YXRlLT5iaW5kaW5nLnNpemUgPD0gdHJpYW5nbGVzLmluZGV4T2Zmc2V0KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4T2Zmc2V0LTAyNDMxIiwgIiVzIiwgZnVuY19uYW1lKTsKKyAgICB9CisKKyAgICBjb25zdCBCVUZGRVJfU1RBVEUgKnRkX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUodHJpYW5nbGVzLnRyYW5zZm9ybURhdGEpOworICAgIGlmICh0ZF9zdGF0ZSAhPSBudWxscHRyICYmIHRkX3N0YXRlLT5iaW5kaW5nLnNpemUgPD0gdHJpYW5nbGVzLnRyYW5zZm9ybU9mZnNldCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi10cmFuc2Zvcm1PZmZzZXQtMDI0MzciLCAiJXMiLCBmdW5jX25hbWUpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2VvbWV0cnlBQUJCTlYoY29uc3QgVmtHZW9tZXRyeUFBQkJOViAmYWFiYnMsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgY29uc3QgQlVGRkVSX1NUQVRFICphYWJiX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYWFiYnMuYWFiYkRhdGEpOworICAgIGlmIChhYWJiX3N0YXRlICE9IG51bGxwdHIgJiYgYWFiYl9zdGF0ZS0+YmluZGluZy5zaXplID4gMCAmJiBhYWJiX3N0YXRlLT5iaW5kaW5nLnNpemUgPD0gYWFiYnMub2Zmc2V0KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHZW9tZXRyeUFBQkJOVi1vZmZzZXQtMDI0MzkiLCAiJXMiLCBmdW5jX25hbWUpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2VvbWV0cnlOVihjb25zdCBWa0dlb21ldHJ5TlYgJmdlb21ldHJ5LCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RfdHlwZSwgdWludDY0X3Qgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChnZW9tZXRyeS5nZW9tZXRyeVR5cGUgPT0gVktfR0VPTUVUUllfVFlQRV9UUklBTkdMRVNfTlYpIHsKKyAgICAgICAgc2tpcCA9IFZhbGlkYXRlR2VvbWV0cnlUcmlhbmdsZXNOVihnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLCBmdW5jX25hbWUpOworICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkuZ2VvbWV0cnlUeXBlID09IFZLX0dFT01FVFJZX1RZUEVfQUFCQlNfTlYpIHsKKyAgICAgICAgc2tpcCA9IFZhbGlkYXRlR2VvbWV0cnlBQUJCTlYoZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLCBmdW5jX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICpwQWNjZWxlcmF0aW9uU3RydWN0dXJlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IG51bGxwdHIgJiYgcENyZWF0ZUluZm8tPmluZm8udHlwZSA9PSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+aW5mby5nZW9tZXRyeUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVHZW9tZXRyeU5WKHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2ldLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgJmluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IEFDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfU1RBVEUgKmFzX3N0YXRlID0gR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlU3RhdGUoaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworICAgIGlmICghYXNfc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIHNraXA7CisgICAgfQorICAgIHVpbnQ2NF90IGFzX2hhbmRsZSA9IEhhbmRsZVRvVWludDY0KGluZm8uYWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICBpZiAoIWFzX3N0YXRlLT5HZXRCb3VuZE1lbW9yeSgpLmVtcHR5KCkpIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgYXNfaGFuZGxlLCAiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLTAyNDUwIiwKKyAgICAgICAgICAgICAgICAgICAgInZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKCk6IGFjY2VsZXJhdGlvblN0cnVjdHVyZSBtdXN0IG5vdCBhbHJlYWR5IGJlIGJhY2tlZCBieSBhIG1lbW9yeSBvYmplY3QuIik7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgYm91bmQgbWVtb3J5IHJhbmdlIGluZm9ybWF0aW9uCisgICAgY29uc3QgYXV0byBtZW1faW5mbyA9IEdldERldk1lbVN0YXRlKGluZm8ubWVtb3J5KTsKKyAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUluc2VydEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJhbmdlKGluZm8uYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBtZW1faW5mbywgaW5mby5tZW1vcnlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19zdGF0ZS0+bWVtb3J5X3JlcXVpcmVtZW50cy5tZW1vcnlSZXF1aXJlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoKSIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5VHlwZXMobWVtX2luZm8sIGFzX3N0YXRlLT5tZW1vcnlfcmVxdWlyZW1lbnRzLm1lbW9yeVJlcXVpcmVtZW50cy5tZW1vcnlUeXBlQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnktMDI1OTMiKTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFsaWdubWVudAorICAgIGlmIChTYWZlTW9kdWxvKGluZm8ubWVtb3J5T2Zmc2V0LCBhc19zdGF0ZS0+bWVtb3J5X3JlcXVpcmVtZW50cy5tZW1vcnlSZXF1aXJlbWVudHMuYWxpZ25tZW50KSAhPSAwKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzX2hhbmRsZSwgIlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLW1lbW9yeU9mZnNldC0wMjU5NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoKTogbWVtb3J5T2Zmc2V0IGlzIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnV0IG11c3QgYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiB0aGUgVmtNZW1vcnlSZXF1aXJlbWVudHM6OmFsaWdubWVudCB2YWx1ZSAweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiLCByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WIHdpdGggYWNjZWxlcmF0aW9uU3RydWN0dXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgImFuZCB0eXBlIG9mIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX09CSkVDVF9OVi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tZW1vcnlPZmZzZXQsIGFzX3N0YXRlLT5tZW1vcnlfcmVxdWlyZW1lbnRzLm1lbW9yeVJlcXVpcmVtZW50cy5hbGlnbm1lbnQpOworICAgIH0KKworICAgIGlmIChtZW1faW5mbykgeworICAgICAgICAvLyBWYWxpZGF0ZSBtZW1vcnkgcmVxdWlyZW1lbnRzIHNpemUKKyAgICAgICAgaWYgKGFzX3N0YXRlLT5tZW1vcnlfcmVxdWlyZW1lbnRzLm1lbW9yeVJlcXVpcmVtZW50cy5zaXplID4gKG1lbV9pbmZvLT5hbGxvY19pbmZvLmFsbG9jYXRpb25TaXplIC0gaW5mby5tZW1vcnlPZmZzZXQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwgYXNfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1zaXplLTAyNTk1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoKTogbWVtb3J5IHNpemUgbWludXMgbWVtb3J5T2Zmc2V0IGlzIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIFZrTWVtb3J5UmVxdWlyZW1lbnRzOjpzaXplIHZhbHVlIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WIHdpdGggYWNjZWxlcmF0aW9uU3RydWN0dXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgdHlwZSBvZiBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9PQkpFQ1RfTlYuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1faW5mby0+YWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSAtIGluZm8ubWVtb3J5T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX3N0YXRlLT5tZW1vcnlfcmVxdWlyZW1lbnRzLm1lbW9yeVJlcXVpcmVtZW50cy5zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WICpwQmluZEluZm9zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvQ291bnQ7IGkrKykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKGRldmljZSwgcEJpbmRJbmZvc1tpXSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCAqcERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IEFDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfU1RBVEUgKmFzX3N0YXRlID0gR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlU3RhdGUoYWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICBpZiAoYXNfc3RhdGUgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBUT0RPOiB1cGRhdGUgdGhlIGZha2UgVlVJRCBiZWxvdyBvbmNlIHRoZSByZWFsIG9uZSBpcyBnZW5lcmF0ZWQuCisgICAgICAgIHNraXAgPSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0FjY2VsZXJhdGlvblN0cnVjdHVyZSgKKyAgICAgICAgICAgIGFzX3N0YXRlLCAidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIsCisgICAgICAgICAgICAiVU5BU1NJR05FRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1YWFhYIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViAqcEluZm8sIFZrQnVmZmVyIGluc3RhbmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgaW5zdGFuY2VPZmZzZXQsIFZrQm9vbDMyIHVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgc2NyYXRjaCwgVmtEZXZpY2VTaXplIHNjcmF0Y2hPZmZzZXQpIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKSIsIFZLX1FVRVVFX0NPTVBVVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfQlVJTERBQ0NFTEVSQVRJT05TVFJVQ1RVUkVOViwgInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpIik7CisKKyAgICBpZiAocEluZm8gIT0gbnVsbHB0ciAmJiBwSW5mby0+dHlwZSA9PSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwSW5mby0+Z2VvbWV0cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlR2VvbWV0cnlOVihwSW5mby0+cEdlb21ldHJpZXNbaV0sIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKToiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwSW5mbyAhPSBudWxscHRyICYmIHBJbmZvLT5nZW9tZXRyeUNvdW50ID4gcGh5c19kZXZfZXh0X3Byb3BzLnJheV90cmFjaW5nX3Byb3BzLm1heEdlb21ldHJ5Q291bnQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZ2VvbWV0cnlDb3VudC0wMjI0MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6IGdlb21ldHJ5Q291bnQgWyVkXSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY6Om1heEdlb21ldHJ5Q291bnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvLT5nZW9tZXRyeUNvdW50KTsKKyAgICB9CisKKyAgICBjb25zdCBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFICpkc3RfYXNfc3RhdGUgPSBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShkc3QpOworICAgIGNvbnN0IEFDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfU1RBVEUgKnNyY19hc19zdGF0ZSA9IEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZVN0YXRlKHNyYyk7CisgICAgY29uc3QgQlVGRkVSX1NUQVRFICpzY3JhdGNoX2J1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKHNjcmF0Y2gpOworCisgICAgaWYgKGRzdF9hc19zdGF0ZSAhPSBudWxscHRyICYmIHBJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGRzdF9hc19zdGF0ZS0+Y3JlYXRlX2luZm8uaW5mby50eXBlICE9IHBJbmZvLT50eXBlKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZHN0LTAyNDg4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6IGNyZWF0ZSBpbmZvIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjp0eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJXNdIG11c3QgYmUgaWRlbnRpY2FsIHRvIGJ1aWxkIGluZm8gVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY6OnR5cGUgWyVzXS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOVihkc3RfYXNfc3RhdGUtPmNyZWF0ZV9pbmZvLmluZm8udHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WKHBJbmZvLT50eXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRzdF9hc19zdGF0ZS0+Y3JlYXRlX2luZm8uaW5mby5mbGFncyAhPSBwSW5mby0+ZmxhZ3MpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kc3QtMDI0ODgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKTogY3JlYXRlIGluZm8gVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY6OmZsYWdzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbMHglWF0gbXVzdCBiZSBpZGVudGljYWwgdG8gYnVpbGQgaW5mbyBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjo6ZmxhZ3MgWzB4JVhdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2FzX3N0YXRlLT5jcmVhdGVfaW5mby5pbmZvLmZsYWdzLCBwSW5mby0+ZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChkc3RfYXNfc3RhdGUtPmNyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCA8IHBJbmZvLT5pbnN0YW5jZUNvdW50KSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZHN0LTAyNDg4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6IGNyZWF0ZSBpbmZvIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjppbnN0YW5jZUNvdW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBidWlsZCBpbmZvIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjppbnN0YW5jZUNvdW50IFslZF0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYXNfc3RhdGUtPmNyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCwgcEluZm8tPmluc3RhbmNlQ291bnQpOworICAgICAgICB9CisgICAgICAgIGlmIChkc3RfYXNfc3RhdGUtPmNyZWF0ZV9pbmZvLmluZm8uZ2VvbWV0cnlDb3VudCA8IHBJbmZvLT5nZW9tZXRyeUNvdW50KSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZHN0LTAyNDg4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6IGNyZWF0ZSBpbmZvIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjpnZW9tZXRyeUNvdW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGJ1aWxkIGluZm8gVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY6Omdlb21ldHJ5Q291bnQgWyVkXS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9hc19zdGF0ZS0+Y3JlYXRlX2luZm8uaW5mby5nZW9tZXRyeUNvdW50LCBwSW5mby0+Z2VvbWV0cnlDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPmdlb21ldHJ5Q291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IFZrR2VvbWV0cnlEYXRhTlYgJmNyZWF0ZV9nZW9tZXRyeV9kYXRhID0gZHN0X2FzX3N0YXRlLT5jcmVhdGVfaW5mby5pbmZvLnBHZW9tZXRyaWVzW2ldLmdlb21ldHJ5OworICAgICAgICAgICAgICAgIGNvbnN0IFZrR2VvbWV0cnlEYXRhTlYgJmJ1aWxkX2dlb21ldHJ5X2RhdGEgPSBwSW5mby0+cEdlb21ldHJpZXNbaV0uZ2VvbWV0cnk7CisgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZV9nZW9tZXRyeV9kYXRhLnRyaWFuZ2xlcy52ZXJ0ZXhDb3VudCA8IGJ1aWxkX2dlb21ldHJ5X2RhdGEudHJpYW5nbGVzLnZlcnRleENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZHN0LTAyNDg4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKTogY3JlYXRlIGluZm8gcEdlb21ldHJpZXNbJWRdLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhDb3VudCBbJWRdIgorICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGJ1aWxkIGluZm8gcEdlb21ldHJpZXNbJWRdLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhDb3VudCBbJWRdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBjcmVhdGVfZ2VvbWV0cnlfZGF0YS50cmlhbmdsZXMudmVydGV4Q291bnQsIGksIGJ1aWxkX2dlb21ldHJ5X2RhdGEudHJpYW5nbGVzLnZlcnRleENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjcmVhdGVfZ2VvbWV0cnlfZGF0YS50cmlhbmdsZXMuaW5kZXhDb3VudCA8IGJ1aWxkX2dlb21ldHJ5X2RhdGEudHJpYW5nbGVzLmluZGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kc3QtMDI0ODgiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpOiBjcmVhdGUgaW5mbyBwR2VvbWV0cmllc1slZF0uZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4Q291bnQgWyVkXSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBidWlsZCBpbmZvIHBHZW9tZXRyaWVzWyVkXS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhDb3VudCBbJWRdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBjcmVhdGVfZ2VvbWV0cnlfZGF0YS50cmlhbmdsZXMuaW5kZXhDb3VudCwgaSwgYnVpbGRfZ2VvbWV0cnlfZGF0YS50cmlhbmdsZXMuaW5kZXhDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3JlYXRlX2dlb21ldHJ5X2RhdGEuYWFiYnMubnVtQUFCQnMgPCBidWlsZF9nZW9tZXRyeV9kYXRhLmFhYmJzLm51bUFBQkJzKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRzdC0wMjQ4OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6IGNyZWF0ZSBpbmZvIHBHZW9tZXRyaWVzWyVkXS5nZW9tZXRyeS5hYWJicy5udW1BQUJCcyBbJWRdIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGJ1aWxkIGluZm8gcEdlb21ldHJpZXNbJWRdLmdlb21ldHJ5LmFhYmJzLm51bUFBQkJzIFslZF0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGNyZWF0ZV9nZW9tZXRyeV9kYXRhLmFhYmJzLm51bUFBQkJzLCBpLCBidWlsZF9nZW9tZXRyeV9kYXRhLmFhYmJzLm51bUFBQkJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRzdF9hc19zdGF0ZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9BY2NlbGVyYXRpb25TdHJ1Y3R1cmUoCisgICAgICAgICAgICBkc3RfYXNfc3RhdGUsICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKSIsCisgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpOworICAgIH0KKworICAgIGlmICh1cGRhdGUgPT0gVktfVFJVRSkgeworICAgICAgICBpZiAoc3JjID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtdXBkYXRlLTAyNDg5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6IElmIHVwZGF0ZSBpcyBWS19UUlVFLCBzcmMgbXVzdCBub3QgYmUgVktfTlVMTF9IQU5ETEUuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3JjX2FzX3N0YXRlID09IG51bGxwdHIgfHwgIXNyY19hc19zdGF0ZS0+YnVpbHQgfHwKKyAgICAgICAgICAgICAgICAhKHNyY19hc19zdGF0ZS0+YnVpbGRfaW5mby5mbGFncyAmIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfVVBEQVRFX0JJVF9OVikpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ4OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKTogSWYgdXBkYXRlIGlzIFZLX1RSVUUsIHNyYyBtdXN0IGhhdmUgYmVlbiBidWlsdCBiZWZvcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX1VQREFURV9CSVRfTlYgc2V0IGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjpmbGFncy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZHN0X2FzX3N0YXRlICE9IG51bGxwdHIgJiYgIWRzdF9hc19zdGF0ZS0+dXBkYXRlX3NjcmF0Y2hfbWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2VkKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3QpLCBrVlVJRF9Db3JlX0NtZEJ1aWxkQWNjZWxOVl9Ob1VwZGF0ZU1lbVJlcVF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKTogVXBkYXRpbmcgJXMgYnV0IHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIHVwZGF0ZSBzY3JhdGNoIG1lbW9yeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoZHN0X2FzX3N0YXRlLT5hY2NlbGVyYXRpb25fc3RydWN0dXJlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIC8vIFVzZSByZXF1aXJlbWVudHMgZmV0Y2hlZCBhdCBjcmVhdGUgdGltZQorICAgICAgICB9CisgICAgICAgIGlmIChzY3JhdGNoX2J1ZmZlcl9zdGF0ZSAhPSBudWxscHRyICYmIGRzdF9hc19zdGF0ZSAhPSBudWxscHRyICYmCisgICAgICAgICAgICBkc3RfYXNfc3RhdGUtPnVwZGF0ZV9zY3JhdGNoX21lbW9yeV9yZXF1aXJlbWVudHMubWVtb3J5UmVxdWlyZW1lbnRzLnNpemUgPgorICAgICAgICAgICAgICAgIChzY3JhdGNoX2J1ZmZlcl9zdGF0ZS0+YmluZGluZy5zaXplIC0gc2NyYXRjaE9mZnNldCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi11cGRhdGUtMDI0OTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoKTogSWYgdXBkYXRlIGlzIFZLX1RSVUUsIFRoZSBzaXplIG1lbWJlciBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVjo6YWNjZWxlcmF0aW9uU3RydWN0dXJlIHNldCB0byBkc3QgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlY6OnR5cGUgc2V0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfVVBEQVRFX1NDUkFUQ0hfTlYgbXVzdCBiZSBsZXNzIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBzY3JhdGNoIG1pbnVzIHNjcmF0Y2hPZmZzZXQiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkc3RfYXNfc3RhdGUgIT0gbnVsbHB0ciAmJiAhZHN0X2FzX3N0YXRlLT5idWlsZF9zY3JhdGNoX21lbW9yeV9yZXF1aXJlbWVudHNfY2hlY2tlZCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZHN0KSwga1ZVSURfQ29yZV9DbWRCdWlsZEFjY2VsTlZfTm9TY3JhdGNoTWVtUmVxUXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpOiBBc3NpZ25pbmcgc2NyYXRjaCBidWZmZXIgdG8gJXMgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigpIGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIHNjcmF0Y2ggbWVtb3J5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShkc3RfYXNfc3RhdGUtPmFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmUpLmNfc3RyKCkpOworICAgICAgICAgICAgLy8gVXNlIHJlcXVpcmVtZW50cyBmZXRjaGVkIGF0IGNyZWF0ZSB0aW1lCisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjcmF0Y2hfYnVmZmVyX3N0YXRlICE9IG51bGxwdHIgJiYgZHN0X2FzX3N0YXRlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIGRzdF9hc19zdGF0ZS0+YnVpbGRfc2NyYXRjaF9tZW1vcnlfcmVxdWlyZW1lbnRzLm1lbW9yeVJlcXVpcmVtZW50cy5zaXplID4KKyAgICAgICAgICAgICAgICAoc2NyYXRjaF9idWZmZXJfc3RhdGUtPmJpbmRpbmcuc2l6ZSAtIHNjcmF0Y2hPZmZzZXQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtdXBkYXRlLTAyNDkxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6IElmIHVwZGF0ZSBpcyBWS19GQUxTRSwgVGhlIHNpemUgbWVtYmVyIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WOjphY2NlbGVyYXRpb25TdHJ1Y3R1cmUgc2V0IHRvIGRzdCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVjo6dHlwZSBzZXQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9CVUlMRF9TQ1JBVENIX05WIG11c3QgYmUgbGVzcyB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgZXF1YWwgdG8gdGhlIHNpemUgb2Ygc2NyYXRjaCBtaW51cyBzY3JhdGNoT2Zmc2V0Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIG1vZGUpIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpIiwgVktfUVVFVUVfQ09NUFVURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworCisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX0NPUFlBQ0NFTEVSQVRJT05TVFJVQ1RVUkVOViwgInZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCkiKTsKKworICAgIGNvbnN0IEFDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfU1RBVEUgKmRzdF9hc19zdGF0ZSA9IEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZVN0YXRlKGRzdCk7CisgICAgY29uc3QgQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9TVEFURSAqc3JjX2FzX3N0YXRlID0gR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlU3RhdGUoc3JjKTsKKworICAgIGlmIChkc3RfYXNfc3RhdGUgIT0gbnVsbHB0cikgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvQWNjZWxlcmF0aW9uU3RydWN0dXJlKAorICAgICAgICAgICAgZHN0X2FzX3N0YXRlLCAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCkiLAorICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyLVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKTsKKyAgICB9CisKKyAgICBpZiAobW9kZSA9PSBWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DT01QQUNUX05WKSB7CisgICAgICAgIGlmIChzcmNfYXNfc3RhdGUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgKCFzcmNfYXNfc3RhdGUtPmJ1aWx0IHx8ICEoc3JjX2FzX3N0YXRlLT5idWlsZF9pbmZvLmZsYWdzICYgVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9BTExPV19DT01QQUNUSU9OX0JJVF9OVikpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1zcmMtMDI0OTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpOiBzcmMgbXVzdCBoYXZlIGJlZW4gYnVpbHQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfQ09NUEFDVElPTl9CSVRfTlYgaWYgbW9kZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NPTVBBQ1RfTlYuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBjb25zdCBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFICphc19zdGF0ZSA9IEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZVN0YXRlKGFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChhc19zdGF0ZSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0Tm90SW5Vc2UoYXNfc3RhdGUsIG9ial9zdHJ1Y3QsICJ2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtMDI0NDIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgdmlld3BvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WICpwVmlld3BvcnRXU2NhbGluZ3MpIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9TRVRWSUVXUE9SVFdTQ0FMSU5HTlYsICJ2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigpIik7CisKKyAgICBpZiAoY2Jfc3RhdGUtPnN0YXRpY19zdGF0dXMgJiBDQlNUQVRVU19WSUVXUE9SVF9XX1NDQUxJTkdfU0VUKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtTm9uZS0wMTMyMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoKTogcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aG91dCBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1dfU0NBTElOR19OViBmbGFnLiIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZFNldExpbmVXaWR0aChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbGluZVdpZHRoKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCAidmtDbWRTZXRMaW5lV2lkdGgoKSIsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1NFVExJTkVXSURUSCwgInZrQ21kU2V0TGluZVdpZHRoKCkiKTsKKworICAgIGlmIChjYl9zdGF0ZS0+c3RhdGljX3N0YXR1cyAmIENCU1RBVFVTX0xJTkVfV0lEVEhfU0VUKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtTm9uZS0wMDc4NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRMaW5lV2lkdGggY2FsbGVkIGJ1dCBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRob3V0IFZLX0RZTkFNSUNfU1RBVEVfTElORV9XSURUSCBmbGFnLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRMaW5lU3RpcHBsZUVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgbGluZVN0aXBwbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxpbmVTdGlwcGxlUGF0dGVybikgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgInZrQ21kU2V0TGluZVN0aXBwbGVFWFQoKSIsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRTZXRMaW5lU3RpcHBsZUVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfU0VUTElORVNUSVBQTEVFWFQsICJ2a0NtZFNldExpbmVTdGlwcGxlRVhUKCkiKTsKKworICAgIGlmIChjYl9zdGF0ZS0+c3RhdGljX3N0YXR1cyAmIENCU1RBVFVTX0xJTkVfU1RJUFBMRV9TRVQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldExpbmVTdGlwcGxlRVhULU5vbmUtMDI3NzUiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0TGluZVN0aXBwbGVFWFQgY2FsbGVkIGJ1dCBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRob3V0IFZLX0RZTkFNSUNfU1RBVEVfTElORV9TVElQUExFX0VYVCBmbGFnLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXB0aEJpYXMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBmbG9hdCBkZXB0aEJpYXNDbGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRlcHRoQmlhc1Nsb3BlRmFjdG9yKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCAidmtDbWRTZXREZXB0aEJpYXMoKSIsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRTZXREZXB0aEJpYXMtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1NFVERFUFRIQklBUywgInZrQ21kU2V0RGVwdGhCaWFzKCkiKTsKKyAgICBpZiAoY2Jfc3RhdGUtPnN0YXRpY19zdGF0dXMgJiBDQlNUQVRVU19ERVBUSF9CSUFTX1NFVCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0RGVwdGhCaWFzLU5vbmUtMDA3ODkiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0RGVwdGhCaWFzKCk6IHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGhvdXQgVktfRFlOQU1JQ19TVEFURV9ERVBUSF9CSUFTIGZsYWcuLiIpOworICAgIH0KKyAgICBpZiAoKGRlcHRoQmlhc0NsYW1wICE9IDAuMCkgJiYgKCFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuZGVwdGhCaWFzQ2xhbXApKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXREZXB0aEJpYXMtZGVwdGhCaWFzQ2xhbXAtMDA3OTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0RGVwdGhCaWFzKCk6IHRoZSBkZXB0aEJpYXNDbGFtcCBkZXZpY2UgZmVhdHVyZSBpcyBkaXNhYmxlZDogdGhlIGRlcHRoQmlhc0NsYW1wIHBhcmFtZXRlciBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJiZSBzZXQgdG8gMC4wLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRCbGVuZENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgZmxvYXQgYmxlbmRDb25zdGFudHNbNF0pIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZFNldEJsZW5kQ29uc3RhbnRzKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0QmxlbmRDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1NFVEJMRU5EQ09OU1RBTlRTLCAidmtDbWRTZXRCbGVuZENvbnN0YW50cygpIik7CisgICAgaWYgKGNiX3N0YXRlLT5zdGF0aWNfc3RhdHVzICYgQ0JTVEFUVVNfQkxFTkRfQ09OU1RBTlRTX1NFVCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0QmxlbmRDb25zdGFudHMtTm9uZS0wMDYxMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRCbGVuZENvbnN0YW50cygpOiBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRob3V0IFZLX0RZTkFNSUNfU1RBVEVfQkxFTkRfQ09OU1RBTlRTIGZsYWcuLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXB0aEJvdW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbWluRGVwdGhCb3VuZHMsIGZsb2F0IG1heERlcHRoQm91bmRzKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCAidmtDbWRTZXREZXB0aEJvdW5kcygpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9TRVRERVBUSEJPVU5EUywgInZrQ21kU2V0RGVwdGhCb3VuZHMoKSIpOworICAgIGlmIChjYl9zdGF0ZS0+c3RhdGljX3N0YXR1cyAmIENCU1RBVFVTX0RFUFRIX0JPVU5EU19TRVQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLU5vbmUtMDA1OTkiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0RGVwdGhCb3VuZHMoKTogcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aG91dCBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUyBmbGFnLi4iKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb21wYXJlTWFzaykgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgInZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9TRVRTVEVOQ0lMQ09NUEFSRU1BU0ssICJ2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzaygpIik7CisgICAgaWYgKGNiX3N0YXRlLT5zdGF0aWNfc3RhdHVzICYgQ0JTVEFUVVNfU1RFTkNJTF9SRUFEX01BU0tfU0VUKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stTm9uZS0wMDYwMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soKTogcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aG91dCBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfQ09NUEFSRV9NQVNLIGZsYWcuLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVNYXNrKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCAidmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzay1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfU0VUU1RFTkNJTFdSSVRFTUFTSywgInZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzaygpIik7CisgICAgaWYgKGNiX3N0YXRlLT5zdGF0aWNfc3RhdHVzICYgQ0JTVEFUVVNfU1RFTkNJTF9XUklURV9NQVNLX1NFVCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzay1Ob25lLTAwNjAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2soKTogcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aG91dCBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfV1JJVEVfTUFTSyBmbGFnLi4iKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0U3RlbmNpbFJlZmVyZW5jZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZmVyZW5jZSkgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgInZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1NFVFNURU5DSUxSRUZFUkVOQ0UsICJ2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UoKSIpOworICAgIGlmIChjYl9zdGF0ZS0+c3RhdGljX3N0YXR1cyAmIENCU1RBVFVTX1NURU5DSUxfUkVGRVJFTkNFX1NFVCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZS1Ob25lLTAwNjA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UoKTogcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aG91dCBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfUkVGRVJFTkNFIGZsYWcuLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworc3RhdGljIGJvb2wgVmFsaWRhdGVEeW5hbWljT2Zmc2V0QWxpZ25tZW50KGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyAqYmluZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIHRlc3RfdHlwZSwgVmtEZXZpY2VTaXplIGFsaWdubWVudCwgY29uc3QgdWludDMyX3QgKnBEeW5hbWljT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJfbXNnLCBjb25zdCBjaGFyICpsaW1pdF9uYW1lLCB1aW50MzJfdCAqb2Zmc2V0X2lkeCkgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChiaW5kaW5nLT5kZXNjcmlwdG9yVHlwZSA9PSB0ZXN0X3R5cGUpIHsKKyAgICAgICAgY29uc3QgYXV0byBlbmRfaWR4ID0gKm9mZnNldF9pZHggKyBiaW5kaW5nLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgIGZvciAodWludDMyX3QgY3VycmVudF9pZHggPSAqb2Zmc2V0X2lkeDsgY3VycmVudF9pZHggPCBlbmRfaWR4OyBjdXJyZW50X2lkeCsrKSB7CisgICAgICAgICAgICBpZiAoU2FmZU1vZHVsbyhwRHluYW1pY09mZnNldHNbY3VycmVudF9pZHhdLCBhbGlnbm1lbnQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsIDAsIGVycl9tc2csCisgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJpbmREZXNjcmlwdG9yU2V0cygpOiBwRHluYW1pY09mZnNldHNbJWRdIGlzICVkIGJ1dCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZGV2aWNlIGxpbWl0ICVzIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgIi4iLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2lkeCwgcER5bmFtaWNPZmZzZXRzW2N1cnJlbnRfaWR4XSwgbGltaXRfbmFtZSwgYWxpZ25tZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqb2Zmc2V0X2lkeCA9IGVuZF9pZHg7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZEJpbmREZXNjcmlwdG9yU2V0cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3Qgc2V0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cywgdWludDMyX3QgZHluYW1pY09mZnNldENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnBEeW5hbWljT2Zmc2V0cykgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCAidmtDbWRCaW5kRGVzY3JpcHRvclNldHMoKSIsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCB8IFZLX1FVRVVFX0NPTVBVVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9CSU5EREVTQ1JJUFRPUlNFVFMsICJ2a0NtZEJpbmREZXNjcmlwdG9yU2V0cygpIik7CisgICAgLy8gVHJhY2sgdG90YWwgY291bnQgb2YgZHluYW1pYyBkZXNjcmlwdG9yIHR5cGVzIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIG9mZnNldCBmb3IgZWFjaCBvbmUKKyAgICB1aW50MzJfdCB0b3RhbF9keW5hbWljX2Rlc2NyaXB0b3JzID0gMDsKKyAgICBzdHJpbmcgZXJyb3Jfc3RyaW5nID0gIiI7CisKKyAgICBjb25zdCBhdXRvICpwaXBlbGluZV9sYXlvdXQgPSBHZXRQaXBlbGluZUxheW91dChsYXlvdXQpOworICAgIGZvciAodWludDMyX3Qgc2V0X2lkeCA9IDA7IHNldF9pZHggPCBzZXRDb3VudDsgc2V0X2lkeCsrKSB7CisgICAgICAgIGNvbnN0IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqZGVzY3JpcHRvcl9zZXQgPSBHZXRTZXROb2RlKHBEZXNjcmlwdG9yU2V0c1tzZXRfaWR4XSk7CisgICAgICAgIGlmIChkZXNjcmlwdG9yX3NldCkgeworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgc2V0IGJlaW5nIGJvdW5kIGlzIGNvbXBhdGlibGUgd2l0aCBvdmVybGFwcGluZyBzZXRMYXlvdXQgb2YgcGlwZWxpbmVMYXlvdXQKKyAgICAgICAgICAgIGlmICghVmVyaWZ5U2V0TGF5b3V0Q29tcGF0aWJpbGl0eShyZXBvcnRfZGF0YSwgZGVzY3JpcHRvcl9zZXQsIHBpcGVsaW5lX2xheW91dCwgc2V0X2lkeCArIGZpcnN0U2V0LCBlcnJvcl9zdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwRGVzY3JpcHRvclNldHNbc2V0X2lkeF0pLCAiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtMDAzNTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yU2V0ICMldSBiZWluZyBib3VuZCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG92ZXJsYXBwaW5nIGRlc2NyaXB0b3JTZXRMYXlvdXQgYXQgaW5kZXggJXUgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBkdWUgdG86ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2lkeCwgc2V0X2lkeCArIGZpcnN0U2V0LCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGxheW91dCkuY19zdHIoKSwgZXJyb3Jfc3RyaW5nLmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIHNldF9keW5hbWljX2Rlc2NyaXB0b3JfY291bnQgPSBkZXNjcmlwdG9yX3NldC0+R2V0RHluYW1pY0Rlc2NyaXB0b3JDb3VudCgpOworICAgICAgICAgICAgaWYgKHNldF9keW5hbWljX2Rlc2NyaXB0b3JfY291bnQpIHsKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2Ugd29uJ3Qgb3ZlcnN0ZXAgYm91bmRzIG9mIHBEeW5hbWljT2Zmc2V0cyBhcnJheQorICAgICAgICAgICAgICAgIGlmICgodG90YWxfZHluYW1pY19kZXNjcmlwdG9ycyArIHNldF9keW5hbWljX2Rlc2NyaXB0b3JfY291bnQpID4gZHluYW1pY09mZnNldENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRlc3QvcmVwb3J0IHRoaXMgaGVyZSwgc3VjaCB0aGF0IHdlIGRvbid0IHJ1biBwYXN0IHRoZSBlbmQgb2YgcER5bmFtaWNPZmZzZXRzIGluIHRoZSBlbHNlIGNsYXVzZQorICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocERlc2NyaXB0b3JTZXRzW3NldF9pZHhdKSwgIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtZHluYW1pY09mZnNldENvdW50LTAwMzU5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3JTZXQgIyV1ICglcykgcmVxdWlyZXMgJXUgZHluYW1pY09mZnNldHMsIGJ1dCBvbmx5ICV1IGR5bmFtaWNPZmZzZXRzIGFyZSBsZWZ0IGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBEeW5hbWljT2Zmc2V0cyBhcnJheS4gVGhlcmUgbXVzdCBiZSBvbmUgZHluYW1pYyBvZmZzZXQgZm9yIGVhY2ggZHluYW1pYyBkZXNjcmlwdG9yIGJlaW5nIGJvdW5kLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9pZHgsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocERlc2NyaXB0b3JTZXRzW3NldF9pZHhdKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC0+R2V0RHluYW1pY0Rlc2NyaXB0b3JDb3VudCgpLCAoZHluYW1pY09mZnNldENvdW50IC0gdG90YWxfZHluYW1pY19kZXNjcmlwdG9ycykpOworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIG51bWJlciBmb3VuZCB0byB0aGUgbWF4aW11bSB0byBwcmV2ZW50IGR1cGxpY2F0ZSBtZXNzYWdlcywgb3Igc3Vic3F1ZW50IGRlc2NyaXB0b3Igc2V0cyBmcm9tCisgICAgICAgICAgICAgICAgICAgIC8vIHRlc3RpbmcgYWdhaW5zdCB0aGUgInNob3J0IHRhaWwiIHdlJ3JlIHNraXBwaW5nIGJlbG93LgorICAgICAgICAgICAgICAgICAgICB0b3RhbF9keW5hbWljX2Rlc2NyaXB0b3JzID0gZHluYW1pY09mZnNldENvdW50OworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBWYWxpZGF0ZSBkeW5hbWljIG9mZnNldHMgYW5kIER5bmFtaWMgT2Zmc2V0IE1pbmltdW1zCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cl9keW5fb2Zmc2V0ID0gdG90YWxfZHluYW1pY19kZXNjcmlwdG9yczsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBkc2wgPSBkZXNjcmlwdG9yX3NldC0+R2V0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gYmluZGluZ19jb3VudCA9IGRzbC0+R2V0QmluZGluZ0NvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJmxpbWl0cyA9IHBoeXNfZGV2X3Byb3BzLmxpbWl0czsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kaW5nX2lkeCA9IDA7IGJpbmRpbmdfaWR4IDwgYmluZGluZ19jb3VudDsgYmluZGluZ19pZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAqYmluZGluZyA9IGRzbC0+R2V0RGVzY3JpcHRvclNldExheW91dEJpbmRpbmdQdHJGcm9tSW5kZXgoYmluZGluZ19pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUR5bmFtaWNPZmZzZXRBbGlnbm1lbnQocmVwb3J0X2RhdGEsIGJpbmRpbmcsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQsIHBEeW5hbWljT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBEeW5hbWljT2Zmc2V0cy0wMTk3MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudCIsICZjdXJfZHluX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlRHluYW1pY09mZnNldEFsaWdubWVudChyZXBvcnRfZGF0YSwgYmluZGluZywgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMubWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCwgcER5bmFtaWNPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcER5bmFtaWNPZmZzZXRzLTAxOTcyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50IiwgJmN1cl9keW5fb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIHJ1bm5pbmcgdG90YWwgb2YgZHluYW1pYyBkZXNjcmlwdG9yIGNvdW50IHRvIHZlcmlmeSBhdCB0aGUgZW5kCisgICAgICAgICAgICAgICAgICAgIHRvdGFsX2R5bmFtaWNfZGVzY3JpcHRvcnMgKz0gc2V0X2R5bmFtaWNfZGVzY3JpcHRvcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBEZXNjcmlwdG9yU2V0c1tzZXRfaWR4XSksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gYmluZCAlcyB0aGF0IGRvZXNuJ3QgZXhpc3QhIiwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwRGVzY3JpcHRvclNldHNbc2V0X2lkeF0pLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIC8vICBkeW5hbWljT2Zmc2V0Q291bnQgbXVzdCBlcXVhbCB0aGUgdG90YWwgbnVtYmVyIG9mIGR5bmFtaWMgZGVzY3JpcHRvcnMgaW4gdGhlIHNldHMgYmVpbmcgYm91bmQKKyAgICBpZiAodG90YWxfZHluYW1pY19kZXNjcmlwdG9ycyAhPSBkeW5hbWljT2Zmc2V0Q291bnQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtZHluYW1pY09mZnNldENvdW50LTAwMzU5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGJpbmQgJXUgZGVzY3JpcHRvclNldHMgd2l0aCAldSBkeW5hbWljIGRlc2NyaXB0b3JzLCBidXQgZHluYW1pY09mZnNldENvdW50IGlzICV1LiBJdCBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImV4YWN0bHkgbWF0Y2ggdGhlIG51bWJlciBvZiBkeW5hbWljIGRlc2NyaXB0b3JzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3VudCwgdG90YWxfZHluYW1pY19kZXNjcmlwdG9ycywgZHluYW1pY09mZnNldENvdW50KTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIFZhbGlkYXRlcyB0aGF0IHRoZSBzdXBwbGllZCBiaW5kIHBvaW50IGlzIHN1cHBvcnRlZCBmb3IgdGhlIGNvbW1hbmQgYnVmZmVyICh2aXMuIHRoZSBjb21tYW5kIHBvb2wpCisvLyBUYWtlcyBhcnJheSBvZiBlcnJvciBjb2RlcyBhcyBzb21lIG9mIHRoZSBWVUlEJ3MgKGUuZy4gdmtDbWRCaW5kUGlwZWxpbmUpIGFyZSB3cml0dGVuIHBlciBiaW5kcG9pbnQKKy8vIFRPRE8gYWRkIHZrQ21kQmluZFBpcGVsaW5lIGJpbmRfcG9pbnQgdmFsaWRhdGlvbiB1c2luZyB0aGlzIGNhbGwuCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlUGlwZWxpbmVCaW5kUG9pbnQoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCwgY29uc3QgY2hhciAqZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPFZrUGlwZWxpbmVCaW5kUG9pbnQsIHN0ZDo6c3RyaW5nPiAmYmluZF9lcnJvcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvIHBvb2wgPSBjYl9zdGF0ZS0+Y29tbWFuZF9wb29sLmdldCgpOworICAgIGlmIChwb29sKSB7ICAvLyBUaGUgbG9zcyBvZiBhIHBvb2wgaW4gYSByZWNvcmRpbmcgY21kIGlzIHJlcG9ydGVkIGluIERlc3Ryb3lDb21tYW5kUG9vbAorICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8VmtQaXBlbGluZUJpbmRQb2ludCwgVmtRdWV1ZUZsYWdzPiBmbGFnX21hc2sgPSB7CisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBzdGF0aWNfY2FzdDxWa1F1ZXVlRmxhZ3M+KFZLX1FVRVVFX0dSQVBISUNTX0JJVCkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLCBzdGF0aWNfY2FzdDxWa1F1ZXVlRmxhZ3M+KFZLX1FVRVVFX0NPTVBVVEVfQklUKSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VmtRdWV1ZUZsYWdzPihWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCkpLAorICAgICAgICB9OworICAgICAgICBjb25zdCBhdXRvICZxZnAgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKCktPnF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW3Bvb2wtPnF1ZXVlRmFtaWx5SW5kZXhdOworICAgICAgICBpZiAoMCA9PSAocWZwLnF1ZXVlRmxhZ3MgJiBmbGFnX21hc2suYXQoYmluZF9wb2ludCkpKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZXJyb3IgPSBiaW5kX2Vycm9ycy5hdChiaW5kX3BvaW50KTsKKyAgICAgICAgICAgIGF1dG8gY2JfdTY0ID0gSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwgY2JfdTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLCAiJXM6ICVzIHdhcyBhbGxvY2F0ZWQgZnJvbSAlcyB0aGF0IGRvZXMgbm90IHN1cHBvcnQgYmluZHBvaW50ICVzLiIsIGZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY2Jfc3RhdGUtPmNyZWF0ZUluZm8uY29tbWFuZFBvb2wpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrUGlwZWxpbmVCaW5kUG9pbnQoYmluZF9wb2ludCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yV3JpdGVzKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgY29uc3QgY2hhciAqZnVuY19uYW1lID0gInZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoKSI7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1BVU0hERVNDUklQVE9SU0VUS0hSLCBmdW5jX25hbWUpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCBmdW5jX25hbWUsIChWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKworICAgIHN0YXRpYyBjb25zdCBzdGQ6Om1hcDxWa1BpcGVsaW5lQmluZFBvaW50LCBzdGQ6OnN0cmluZz4gYmluZF9lcnJvcnMgPSB7CisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItcGlwZWxpbmVCaW5kUG9pbnQtMDAzNjMiKSwKKyAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLCAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLXBpcGVsaW5lQmluZFBvaW50LTAwMzYzIiksCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYsICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItcGlwZWxpbmVCaW5kUG9pbnQtMDAzNjMiKX07CisKKyAgICBza2lwIHw9IFZhbGlkYXRlUGlwZWxpbmVCaW5kUG9pbnQoY2Jfc3RhdGUsIHBpcGVsaW5lQmluZFBvaW50LCBmdW5jX25hbWUsIGJpbmRfZXJyb3JzKTsKKyAgICBjb25zdCBhdXRvIGxheW91dF9kYXRhID0gR2V0UGlwZWxpbmVMYXlvdXQobGF5b3V0KTsKKworICAgIC8vIFZhbGlkYXRlIHRoZSBzZXQgaW5kZXggcG9pbnRzIHRvIGEgcHVzaCBkZXNjcmlwdG9yIHNldCBhbmQgaXMgaW4gcmFuZ2UKKyAgICBpZiAobGF5b3V0X2RhdGEpIHsKKyAgICAgICAgY29uc3QgYXV0byAmc2V0X2xheW91dHMgPSBsYXlvdXRfZGF0YS0+c2V0X2xheW91dHM7CisgICAgICAgIGNvbnN0IGF1dG8gbGF5b3V0X3U2NCA9IEhhbmRsZVRvVWludDY0KGxheW91dCk7CisgICAgICAgIGlmIChzZXQgPCBzZXRfbGF5b3V0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gZHNsID0gc2V0X2xheW91dHNbc2V0XTsKKyAgICAgICAgICAgIGlmIChkc2wpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRzbC0+SXNQdXNoRGVzY3JpcHRvcigpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dF91NjQsICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItc2V0LTAwMzY1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTZXQgaW5kZXggJSIgUFJJdTMyICIgZG9lcyBub3QgbWF0Y2ggcHVzaCBkZXNjcmlwdG9yIHNldCBsYXlvdXQgaW5kZXggZm9yICVzLiIsIGZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGxheW91dCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IHByb3h5IGluIG9yZGVyIHRvIHVzZSB0aGUgZXhpc3RpbmcgZGVzY3JpcHRvciBzZXQgdXBkYXRlIHZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBtb3ZlIHRoZSB2YWxpZGF0aW9uIChsaWtlIHRoaXMpIHRoYXQgZG9lc24ndCBuZWVkIGRlc2NyaXB0b3Igc2V0IHN0YXRlIHRvIHRoZSBEU0wgb2JqZWN0IHNvIHdlCisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGhhdmUgdG8gZG8gdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0IHByb3h5X2RzKFZLX05VTExfSEFORExFLCBudWxscHRyLCBkc2wsIDAsIG51bGxwdHIsIHJlcG9ydF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVB1c2hEZXNjcmlwdG9yc1VwZGF0ZSgmcHJveHlfZHMsIGRlc2NyaXB0b3JXcml0ZUNvdW50LCBwRGVzY3JpcHRvcldyaXRlcywgZnVuY19uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBza2lwID0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhULCBsYXlvdXRfdTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1zZXQtMDAzNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTZXQgaW5kZXggJSIgUFJJdTMyICIgaXMgb3V0c2lkZSBvZiByYW5nZSBmb3IgJXMgKHNldCA8ICUiIFBSSXUzMiAiKS4iLCBmdW5jX25hbWUsIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobGF5b3V0KS5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0X2xheW91dHMuc2l6ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworc3RhdGljIFZrRGV2aWNlU2l6ZSBHZXRJbmRleEFsaWdubWVudChWa0luZGV4VHlwZSBpbmRleFR5cGUpIHsKKyAgICBzd2l0Y2ggKGluZGV4VHlwZSkgeworICAgICAgICBjYXNlIFZLX0lOREVYX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgVktfSU5ERVhfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgY2FzZSBWS19JTkRFWF9UWVBFX1VJTlQ4X0VYVDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gTm90IGEgcmVhbCBpbmRleCB0eXBlLiBFeHByZXNzIG5vIGFsaWdubWVudCByZXF1aXJlbWVudCBoZXJlOyB3ZSBleHBlY3QgdXBwZXIgbGF5ZXIKKyAgICAgICAgICAgIC8vIHRvIGhhdmUgYWxyZWFkeSBwaWNrZWQgdXAgb24gdGhlIGVudW0gYmVpbmcgbm9uc2Vuc2UuCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kQmluZEluZGV4QnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luZGV4VHlwZSBpbmRleFR5cGUpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIGJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgY29uc3QgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoYnVmZmVyX3N0YXRlKTsKKyAgICBhc3NlcnQoY2Jfbm9kZSk7CisKKyAgICBib29sIHNraXAgPQorICAgICAgICBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3MoYnVmZmVyX3N0YXRlLCBWS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVCwgdHJ1ZSwgIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItYnVmZmVyLTAwNDMzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJpbmRJbmRleEJ1ZmZlcigpIiwgIlZLX0JVRkZFUl9VU0FHRV9JTkRFWF9CVUZGRVJfQklUIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfbm9kZSwgInZrQ21kQmluZEluZGV4QnVmZmVyKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9ub2RlLCBDTURfQklORElOREVYQlVGRkVSLCAidmtDbWRCaW5kSW5kZXhCdWZmZXIoKSIpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoYnVmZmVyX3N0YXRlLCAidmtDbWRCaW5kSW5kZXhCdWZmZXIoKSIsICJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWJ1ZmZlci0wMDQzNCIpOworICAgIGNvbnN0IGF1dG8gb2Zmc2V0X2FsaWduID0gR2V0SW5kZXhBbGlnbm1lbnQoaW5kZXhUeXBlKTsKKyAgICBpZiAob2Zmc2V0ICUgb2Zmc2V0X2FsaWduKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItb2Zmc2V0LTAwNDMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJpbmRJbmRleEJ1ZmZlcigpIG9mZnNldCAoMHglIiBQUkl4TEVBU1Q2NCAiKSBkb2VzIG5vdCBmYWxsIG9uIGFsaWdubWVudCAoJXMpIGJvdW5kYXJ5LiIsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0luZGV4VHlwZShpbmRleFR5cGUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRCaW5kVmVydGV4QnVmZmVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyICpwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplICpwT2Zmc2V0cykgY29uc3QgeworICAgIGNvbnN0IGF1dG8gY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX0JJTkRWRVJURVhCVUZGRVJTLCAidmtDbWRCaW5kVmVydGV4QnVmZmVycygpIik7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRpbmdDb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUocEJ1ZmZlcnNbaV0pOworICAgICAgICBhc3NlcnQoYnVmZmVyX3N0YXRlKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3MoYnVmZmVyX3N0YXRlLCBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcEJ1ZmZlcnMtMDA2MjciLCAidmtDbWRCaW5kVmVydGV4QnVmZmVycygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0JVRkZFUl9VU0FHRV9WRVJURVhfQlVGRkVSX0JJVCIpOworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0J1ZmZlcihidWZmZXJfc3RhdGUsICJ2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzKCkiLCAiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLXBCdWZmZXJzLTAwNjI4Iik7CisgICAgICAgIGlmIChwT2Zmc2V0c1tpXSA+PSBidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoYnVmZmVyX3N0YXRlLT5idWZmZXIpLCAiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLXBPZmZzZXRzLTAwNjI2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCaW5kVmVydGV4QnVmZmVycygpIG9mZnNldCAoMHglIiBQUkl4TEVBU1Q2NCAiKSBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiIsIHBPZmZzZXRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gVmFsaWRhdGUgdGhhdCBhbiBpbWFnZSdzIHNhbXBsZUNvdW50IG1hdGNoZXMgdGhlIHJlcXVpcmVtZW50IGZvciBhIHNwZWNpZmljIEFQSSBjYWxsCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlSW1hZ2VTYW1wbGVDb3VudChjb25zdCBJTUFHRV9TVEFURSAqaW1hZ2Vfc3RhdGUsIFZrU2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVfY291bnQsIGNvbnN0IGNoYXIgKmxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm1zZ0NvZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uc2FtcGxlcyAhPSBzYW1wbGVfY291bnQpIHsKKyAgICAgICAgc2tpcCA9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW1hZ2Vfc3RhdGUtPmltYWdlKSwgbXNnQ29kZSwgIiVzIGZvciAlcyB3YXMgY3JlYXRlZCB3aXRoIGEgc2FtcGxlIGNvdW50IG9mICVzIGJ1dCBtdXN0IGJlICVzLiIsCisgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3N0YXRlLT5pbWFnZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhpbWFnZV9zdGF0ZS0+Y3JlYXRlSW5mby5zYW1wbGVzKSwgc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhzYW1wbGVfY291bnQpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kVXBkYXRlQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgZGF0YVNpemUsIGNvbnN0IHZvaWQgKnBEYXRhKSBjb25zdCB7CisgICAgY29uc3QgYXV0byBjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBjb25zdCBhdXRvIGRzdF9idWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShkc3RCdWZmZXIpOworICAgIGFzc2VydChkc3RfYnVmZmVyX3N0YXRlKTsKKworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoZHN0X2J1ZmZlcl9zdGF0ZSwgInZrQ21kVXBkYXRlQnVmZmVyKCkiLCAiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kc3RCdWZmZXItMDAwMzUiKTsKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IERTVCBidWZmZXIgaGFzIGNvcnJlY3QgdXNhZ2UgZmxhZ3Mgc2V0CisgICAgc2tpcCB8PQorICAgICAgICBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3MoZHN0X2J1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsIHRydWUsICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWRzdEJ1ZmZlci0wMDAzNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRVcGRhdGVCdWZmZXIoKSIsICJWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCIpOworICAgIHNraXAgfD0KKyAgICAgICAgVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCAidmtDbWRVcGRhdGVCdWZmZXIoKSIsIFZLX1FVRVVFX1RSQU5TRkVSX0JJVCB8IFZLX1FVRVVFX0dSQVBISUNTX0JJVCB8IFZLX1FVRVVFX0NPTVBVVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1VQREFURUJVRkZFUiwgInZrQ21kVXBkYXRlQnVmZmVyKCkiKTsKKyAgICBza2lwIHw9IEluc2lkZVJlbmRlclBhc3MoY2Jfc3RhdGUsICJ2a0NtZFVwZGF0ZUJ1ZmZlcigpIiwgIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItcmVuZGVycGFzcyIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZFNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZFNldEV2ZW50KCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRTZXRFdmVudC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfU0VURVZFTlQsICJ2a0NtZFNldEV2ZW50KCkiKTsKKyAgICBza2lwIHw9IEluc2lkZVJlbmRlclBhc3MoY2Jfc3RhdGUsICJ2a0NtZFNldEV2ZW50KCkiLCAiVlVJRC12a0NtZFNldEV2ZW50LXJlbmRlcnBhc3MiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlU3RhZ2VNYXNrR3NUc0VuYWJsZXMoc3RhZ2VNYXNrLCAidmtDbWRTZXRFdmVudCgpIiwgIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDExNTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFNldEV2ZW50LXN0YWdlTWFzay0wMTE1MSIsICJWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLTAyMTA3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDIxMDgiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRSZXNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgInZrQ21kUmVzZXRFdmVudCgpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUmVzZXRFdmVudC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfUkVTRVRFVkVOVCwgInZrQ21kUmVzZXRFdmVudCgpIik7CisgICAgc2tpcCB8PSBJbnNpZGVSZW5kZXJQYXNzKGNiX3N0YXRlLCAidmtDbWRSZXNldEV2ZW50KCkiLCAiVlVJRC12a0NtZFJlc2V0RXZlbnQtcmVuZGVycGFzcyIpOworICAgIHNraXAgfD0gVmFsaWRhdGVTdGFnZU1hc2tHc1RzRW5hYmxlcyhzdGFnZU1hc2ssICJ2a0NtZFJlc2V0RXZlbnQoKSIsICJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDExNTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLTAxMTU1IiwgIlZVSUQtdmtDbWRSZXNldEV2ZW50LXN0YWdlTWFzay0wMjEwOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDIxMTAiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gUmV0dXJuIGlucHV0IHBpcGVsaW5lIHN0YWdlIGZsYWdzLCBleHBhbmRlZCBmb3IgaW5kaXZpZHVhbCBiaXRzIGlmIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9HUkFQSElDU19CSVQgaXMgc2V0CitzdGF0aWMgVmtQaXBlbGluZVN0YWdlRmxhZ3MgRXhwYW5kUGlwZWxpbmVTdGFnZUZsYWdzKGNvbnN0IERldmljZUV4dGVuc2lvbnMgJmV4dGVuc2lvbnMsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGluZmxhZ3MpIHsKKyAgICBpZiAofmluZmxhZ3MgJiBWS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklUKSByZXR1cm4gaW5mbGFnczsKKworICAgIHJldHVybiAoaW5mbGFncyAmIH5WS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklUKSB8CisgICAgICAgICAgIChWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9EUkFXX0lORElSRUNUX0JJVCB8CisgICAgICAgICAgICAoZXh0ZW5zaW9ucy52a19udl9tZXNoX3NoYWRlciA/IChWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYgfCBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYpIDogMCkgfAorICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX0lOUFVUX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9TSEFERVJfQklUIHwKKyAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUIHwKKyAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklUIHwKKyAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0VBUkxZX0ZSQUdNRU5UX1RFU1RTX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0xBVEVfRlJBR01FTlRfVEVTVFNfQklUIHwKKyAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCB8CisgICAgICAgICAgICAoZXh0ZW5zaW9ucy52a19leHRfY29uZGl0aW9uYWxfcmVuZGVyaW5nID8gVktfUElQRUxJTkVfU1RBR0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0JJVF9FWFQgOiAwKSB8CisgICAgICAgICAgICAoZXh0ZW5zaW9ucy52a19leHRfdHJhbnNmb3JtX2ZlZWRiYWNrID8gVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0JJVF9FWFQgOiAwKSB8CisgICAgICAgICAgICAoZXh0ZW5zaW9ucy52a19udl9zaGFkaW5nX3JhdGVfaW1hZ2UgPyBWS19QSVBFTElORV9TVEFHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WIDogMCkgfAorICAgICAgICAgICAgKGV4dGVuc2lvbnMudmtfZXh0X2ZyYWdtZW50X2RlbnNpdHlfbWFwID8gVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfREVOU0lUWV9QUk9DRVNTX0JJVF9FWFQgOiAwKSk7Cit9CisKK3N0YXRpYyBib29sIEhhc05vbkZyYW1lYnVmZmVyU3RhZ2VQaXBlbGluZVN0YWdlRmxhZ3MoVmtQaXBlbGluZVN0YWdlRmxhZ3MgaW5mbGFncykgeworICAgIHJldHVybiAoaW5mbGFncyAmIH4oVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0VBUkxZX0ZSQUdNRU5UX1RFU1RTX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9MQVRFX0ZSQUdNRU5UX1RFU1RTX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCkpICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgR2V0R3JhcGhpY3NQaXBlbGluZVN0YWdlTG9naWNhbE9yZGluYWwoVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgZmxhZykgeworICAgIC8vIE5vdGUgdGhhdCB0aGUgbGlzdCAoYW5kIGxvb2t1cCkgaWdub3JlIGludmFsaWQtZm9yLWVuYWJsZWQtZXh0ZW5zaW9uIGNvbmRpdGlvbi4gIFRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgZWxzZXdoZXJlCisgICAgLy8gYW5kIHdvdWxkIGdyZWF0bHkgY29tcGxpY2F0ZSB0aGlzIGludGVudGlvbmFsbHkgc2ltcGxlIGltcGxlbWVudGF0aW9uCisgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgIGNvbnN0IFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIG9yZGVyZWRfYXJyYXlbXSA9IHsKKyAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9EUkFXX0lORElSRUNUX0JJVCwKKyAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX0lOUFVUX0JJVCwKKyAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRk9STV9GRUVEQkFDS19CSVRfRVhULAorCisgICAgICAgIC8vIEluY2x1ZGluZyB0aGUgdGFzay9tZXNoIHNoYWRlcnMgaGVyZSBpcyBub3QgdGVjaG5pY2FsbHkgY29ycmVjdCwgYXMgdGhleSBhcmUgaW4gYQorICAgICAgICAvLyBzZXBhcmF0ZSBsb2dpY2FsIHBpcGVsaW5lIC0gYnV0IGl0IHdvcmtzIGZvciB0aGUgY2FzZSB0aGlzIGlzIGN1cnJlbnRseSB1c2VkLCBhbmQKKyAgICAgICAgLy8gZml4aW5nIGl0IHdvdWxkIHJlcXVpcmUgc2lnbmlmaWNhbnQgcmV3b3JrIGFuZCBlbmQgdXAgd2l0aCB0aGUgY29kZSBiZWluZyBmYXIgbW9yZQorICAgICAgICAvLyB2ZXJib3NlIGZvciBubyBwcmFjdGljYWwgZ2Fpbi4KKyAgICAgICAgLy8gSG93ZXZlciwgd29ydGggcGF5aW5nIGF0dGVudGlvbiB0byB0aGlzIGlmIHVzaW5nIHRoaXMgZnVuY3Rpb24gaW4gYSBuZXcgd2F5LgorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OViwKKworICAgICAgICBWS19QSVBFTElORV9TVEFHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WLAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9FQVJMWV9GUkFHTUVOVF9URVNUU19CSVQsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0xBVEVfRlJBR01FTlRfVEVTVFNfQklULAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVAorICAgIH07CisgICAgLy8gY2xhbmctZm9ybWF0IG9uCisKKyAgICBjb25zdCBpbnQgb3JkZXJlZF9hcnJheV9sZW5ndGggPSBzaXplb2Yob3JkZXJlZF9hcnJheSkgLyBzaXplb2YoVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkX2FycmF5X2xlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChvcmRlcmVkX2FycmF5W2ldID09IGZsYWcpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgdGVjaG5pY2FsbHkgaGF2ZSBPKE5eMikgY29tcGxleGl0eSwgYnV0IGl0J3MgZm9yIGEgdmFsdWUgb2YgTyB0aGF0J3MgbGFyZ2VseQorLy8gc3RhYmxlIGFuZCBhbHNvIHJhdGhlciB0aW55IC0gdGhpcyBjb3VsZCBkZWZpbml0ZWx5IGJlIHJlamlnZ2VkIHRvIHdvcmsgbW9yZSBlZmZpY2llbnRseSwgYnV0IHRoZSBpbXBhY3QKKy8vIG9uIHJ1bnRpbWUgaXMgY3VycmVudGx5IG5lZ2xpZ2libGUsIHNvIGl0IHdvdWxkbid0IGdhaW4gdmVyeSBtdWNoLgorLy8gSWYgd2UgYWRkIGEgbG90IG1vcmUgZ3JhcGhpY3MgcGlwZWxpbmUgc3RhZ2VzLCB0aGlzIHNldCBvZiBmdW5jdGlvbnMgc2hvdWxkIGJlIHJld3JpdHRlbiB0byBhY2NvbW9kYXRlLgorc3RhdGljIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIEdldExvZ2ljYWxseUVhcmxpZXN0R3JhcGhpY3NQaXBlbGluZVN0YWdlKFZrUGlwZWxpbmVTdGFnZUZsYWdzIGluZmxhZ3MpIHsKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyBlYXJsaWVzdF9iaXQgPSBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQ7CisgICAgaW50IGVhcmxpZXN0X2JpdF9vcmRlciA9IEdldEdyYXBoaWNzUGlwZWxpbmVTdGFnZUxvZ2ljYWxPcmRpbmFsKGVhcmxpZXN0X2JpdCk7CisKKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzKTsgKytpKSB7CisgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIGN1cnJlbnRfZmxhZyA9IChWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cykoKGluZmxhZ3MgJiAweDF1KSA8PCBpKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZmxhZykgeworICAgICAgICAgICAgaW50IG5ld19vcmRlciA9IEdldEdyYXBoaWNzUGlwZWxpbmVTdGFnZUxvZ2ljYWxPcmRpbmFsKGN1cnJlbnRfZmxhZyk7CisgICAgICAgICAgICBpZiAobmV3X29yZGVyICE9IC0xICYmIG5ld19vcmRlciA8IGVhcmxpZXN0X2JpdF9vcmRlcikgeworICAgICAgICAgICAgICAgIGVhcmxpZXN0X2JpdF9vcmRlciA9IG5ld19vcmRlcjsKKyAgICAgICAgICAgICAgICBlYXJsaWVzdF9iaXQgPSBjdXJyZW50X2ZsYWc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5mbGFncyA9IGluZmxhZ3MgPj4gMTsKKyAgICB9CisgICAgcmV0dXJuIGVhcmxpZXN0X2JpdDsKK30KKworc3RhdGljIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIEdldExvZ2ljYWxseUxhdGVzdEdyYXBoaWNzUGlwZWxpbmVTdGFnZShWa1BpcGVsaW5lU3RhZ2VGbGFncyBpbmZsYWdzKSB7CisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgbGF0ZXN0X2JpdCA9IFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVDsKKyAgICBpbnQgbGF0ZXN0X2JpdF9vcmRlciA9IEdldEdyYXBoaWNzUGlwZWxpbmVTdGFnZUxvZ2ljYWxPcmRpbmFsKGxhdGVzdF9iaXQpOworCisgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyk7ICsraSkgeworICAgICAgICBpZiAoaW5mbGFncyAmIDB4MXUpIHsKKyAgICAgICAgICAgIGludCBuZXdfb3JkZXIgPSBHZXRHcmFwaGljc1BpcGVsaW5lU3RhZ2VMb2dpY2FsT3JkaW5hbCgoVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMpKChpbmZsYWdzICYgMHgxdSkgPDwgaSkpOworICAgICAgICAgICAgaWYgKG5ld19vcmRlciAhPSAtMSAmJiBuZXdfb3JkZXIgPiBsYXRlc3RfYml0X29yZGVyKSB7CisgICAgICAgICAgICAgICAgbGF0ZXN0X2JpdF9vcmRlciA9IG5ld19vcmRlcjsKKyAgICAgICAgICAgICAgICBsYXRlc3RfYml0ID0gKFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzKSgoaW5mbGFncyAmIDB4MXUpIDw8IGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluZmxhZ3MgPSBpbmZsYWdzID4+IDE7CisgICAgfQorICAgIHJldHVybiBsYXRlc3RfYml0OworfQorCisvLyBWZXJpZnkgaW1hZ2UgYmFycmllciBpbWFnZSBzdGF0ZSBhbmQgdGhhdCB0aGUgaW1hZ2UgaXMgY29uc2lzdGVudCB3aXRoIEZCIGltYWdlCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlSW1hZ2VCYXJyaWVyQXR0YWNobWVudChjb25zdCBjaGFyICpmdW5jTmFtZSwgQ01EX0JVRkZFUl9TVEFURSBjb25zdCAqY2Jfc3RhdGUsIFZrRnJhbWVidWZmZXIgZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVfc3VicGFzcywgY29uc3Qgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgJnN1Yl9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgJnJwX2hhbmRsZSwgdWludDMyX3QgaW1nX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgJmltZ19iYXJyaWVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYXV0byAmZmJfc3RhdGUgPSBHZXRGcmFtZWJ1ZmZlclN0YXRlKGZyYW1lYnVmZmVyKTsKKyAgICBhc3NlcnQoZmJfc3RhdGUpOworICAgIGNvbnN0IGF1dG8gaW1nX2Jhcl9pbWFnZSA9IGltZ19iYXJyaWVyLmltYWdlOworICAgIGJvb2wgaW1hZ2VfbWF0Y2ggPSBmYWxzZTsKKyAgICBib29sIHN1Yl9pbWFnZV9mb3VuZCA9IGZhbHNlOyAgLy8gRG8gd2UgZmluZCBhIGNvcnJlc3BvbmRpbmcgc3VicGFzcyBkZXNjcmlwdGlvbgorICAgIFZrSW1hZ2VMYXlvdXQgc3ViX2ltYWdlX2xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgdWludDMyX3QgYXR0YWNoX2luZGV4ID0gMDsKKyAgICAvLyBWZXJpZnkgdGhhdCBhIGZyYW1lYnVmZmVyIGltYWdlIG1hdGNoZXMgYmFycmllciBpbWFnZQorICAgIGNvbnN0IGF1dG8gYXR0YWNobWVudENvdW50ID0gZmJfc3RhdGUtPmNyZWF0ZUluZm8uYXR0YWNobWVudENvdW50OworICAgIGZvciAodWludDMyX3QgYXR0YWNobWVudCA9IDA7IGF0dGFjaG1lbnQgPCBhdHRhY2htZW50Q291bnQ7ICsrYXR0YWNobWVudCkgeworICAgICAgICBhdXRvIHZpZXdfc3RhdGUgPSBHZXRBdHRhY2htZW50SW1hZ2VWaWV3U3RhdGUoZmJfc3RhdGUsIGF0dGFjaG1lbnQpOworICAgICAgICBpZiAodmlld19zdGF0ZSAmJiAoaW1nX2Jhcl9pbWFnZSA9PSB2aWV3X3N0YXRlLT5jcmVhdGVfaW5mby5pbWFnZSkpIHsKKyAgICAgICAgICAgIGltYWdlX21hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIGF0dGFjaF9pbmRleCA9IGF0dGFjaG1lbnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1hZ2VfbWF0Y2gpIHsgIC8vIE1ha2Ugc3VyZSBzdWJwYXNzIGlzIHJlZmVycmluZyB0byBtYXRjaGluZyBhdHRhY2htZW50CisgICAgICAgIGlmIChzdWJfZGVzYy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCAmJiBzdWJfZGVzYy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCA9PSBhdHRhY2hfaW5kZXgpIHsKKyAgICAgICAgICAgIHN1Yl9pbWFnZV9sYXlvdXQgPSBzdWJfZGVzYy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+bGF5b3V0OworICAgICAgICAgICAgc3ViX2ltYWdlX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1Yl9pbWFnZV9mb3VuZCAmJiBkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZGVwdGhfc3RlbmNpbF9yZXNvbHZlKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICpyZXNvbHZlID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSPihzdWJfZGVzYy5wTmV4dCk7CisgICAgICAgICAgICBpZiAocmVzb2x2ZSAmJiByZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgJiYKKyAgICAgICAgICAgICAgICByZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtPmF0dGFjaG1lbnQgPT0gYXR0YWNoX2luZGV4KSB7CisgICAgICAgICAgICAgICAgc3ViX2ltYWdlX2xheW91dCA9IHJlc29sdmUtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0+bGF5b3V0OworICAgICAgICAgICAgICAgIHN1Yl9pbWFnZV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdWJfaW1hZ2VfZm91bmQpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJfZGVzYy5jb2xvckF0dGFjaG1lbnRDb3VudDsgKytqKSB7CisgICAgICAgICAgICAgICAgaWYgKHN1Yl9kZXNjLnBDb2xvckF0dGFjaG1lbnRzICYmIHN1Yl9kZXNjLnBDb2xvckF0dGFjaG1lbnRzW2pdLmF0dGFjaG1lbnQgPT0gYXR0YWNoX2luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHN1Yl9pbWFnZV9sYXlvdXQgPSBzdWJfZGVzYy5wQ29sb3JBdHRhY2htZW50c1tqXS5sYXlvdXQ7CisgICAgICAgICAgICAgICAgICAgIHN1Yl9pbWFnZV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXN1Yl9pbWFnZV9mb3VuZCAmJiBzdWJfZGVzYy5wUmVzb2x2ZUF0dGFjaG1lbnRzICYmCisgICAgICAgICAgICAgICAgICAgIHN1Yl9kZXNjLnBSZXNvbHZlQXR0YWNobWVudHNbal0uYXR0YWNobWVudCA9PSBhdHRhY2hfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViX2ltYWdlX2xheW91dCA9IHN1Yl9kZXNjLnBSZXNvbHZlQXR0YWNobWVudHNbal0ubGF5b3V0OworICAgICAgICAgICAgICAgICAgICBzdWJfaW1hZ2VfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdWJfaW1hZ2VfZm91bmQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfaGFuZGxlLmhhbmRsZSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItaW1hZ2UtMDI2MzUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQmFycmllciBwSW1hZ2VNZW1vcnlCYXJyaWVyc1slZF0uJXMgaXMgbm90IHJlZmVyZW5jZWQgYnkgdGhlIFZrU3VicGFzc0Rlc2NyaXB0aW9uIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGl2ZSBzdWJwYXNzICglZCkgb2YgY3VycmVudCAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lLCBpbWdfaW5kZXgsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1nX2Jhcl9pbWFnZSkuY19zdHIoKSwgYWN0aXZlX3N1YnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShycF9oYW5kbGUpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsgIC8vICFpbWFnZV9tYXRjaAorICAgICAgICBhdXRvIGNvbnN0IGZiX2hhbmRsZSA9IEhhbmRsZVRvVWludDY0KGZiX3N0YXRlLT5mcmFtZWJ1ZmZlcik7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQsIGZiX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWltYWdlLTAyNjM1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogQmFycmllciBwSW1hZ2VNZW1vcnlCYXJyaWVyc1slZF0uJXMgZG9lcyBub3QgbWF0Y2ggYW4gaW1hZ2UgZnJvbSB0aGUgY3VycmVudCAlcy4iLCBmdW5jTmFtZSwgaW1nX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWdfYmFyX2ltYWdlKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGZiX3N0YXRlLT5mcmFtZWJ1ZmZlcikuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChpbWdfYmFycmllci5vbGRMYXlvdXQgIT0gaW1nX2JhcnJpZXIubmV3TGF5b3V0KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLW9sZExheW91dC0wMTE4MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEFzIHRoZSBJbWFnZSBCYXJyaWVyIGZvciAlcyBpcyBiZWluZyBleGVjdXRlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgb2xkTGF5b3V0IG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgImVxdWFsIG5ld0xheW91dCB5ZXQgdGhleSBhcmUgJXMgYW5kICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jTmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWdfYmFycmllci5pbWFnZSkuY19zdHIoKSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoaW1nX2JhcnJpZXIub2xkTGF5b3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0ltYWdlTGF5b3V0KGltZ19iYXJyaWVyLm5ld0xheW91dCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdWJfaW1hZ2VfZm91bmQgJiYgc3ViX2ltYWdlX2xheW91dCAhPSBpbWdfYmFycmllci5vbGRMYXlvdXQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfaGFuZGxlLmhhbmRsZSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItb2xkTGF5b3V0LTAyNjM2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJhcnJpZXIgcEltYWdlTWVtb3J5QmFycmllcnNbJWRdLiVzIGlzIHJlZmVyZW5jZWQgYnkgdGhlIFZrU3VicGFzc0Rlc2NyaXB0aW9uIGZvciBhY3RpdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJwYXNzICglZCkgb2YgY3VycmVudCAlcyBhcyBoYXZpbmcgbGF5b3V0ICVzLCBidXQgaW1hZ2UgYmFycmllciBoYXMgbGF5b3V0ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY05hbWUsIGltZ19pbmRleCwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWdfYmFyX2ltYWdlKS5jX3N0cigpLCBhY3RpdmVfc3VicGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHJwX2hhbmRsZSkuY19zdHIoKSwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoc3ViX2ltYWdlX2xheW91dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoaW1nX2JhcnJpZXIub2xkTGF5b3V0KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIFZhbGlkYXRlIGltYWdlIGJhcnJpZXJzIHdpdGhpbiBhIHJlbmRlclBhc3MKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVSZW5kZXJQYXNzSW1hZ2VCYXJyaWVycyhjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIHVpbnQzMl90IGFjdGl2ZV9zdWJwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICZzdWJfZGVzYywgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgJnJwX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSICpkZXBlbmRlbmNpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICZzZWxmX2RlcGVuZGVuY2llcywgdWludDMyX3QgaW1hZ2VfbWVtX2JhcnJpZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKmltYWdlX2JhcnJpZXJzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlX21lbV9iYXJyaWVyX2NvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXV0byAmaW1nX2JhcnJpZXIgPSBpbWFnZV9iYXJyaWVyc1tpXTsKKyAgICAgICAgY29uc3QgYXV0byAmaW1nX3NyY19hY2Nlc3NfbWFzayA9IGltZ19iYXJyaWVyLnNyY0FjY2Vzc01hc2s7CisgICAgICAgIGNvbnN0IGF1dG8gJmltZ19kc3RfYWNjZXNzX21hc2sgPSBpbWdfYmFycmllci5kc3RBY2Nlc3NNYXNrOworICAgICAgICBib29sIGFjY2Vzc19tYXNrX21hdGNoID0gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3QgYXV0byBzZWxmX2RlcF9pbmRleCA6IHNlbGZfZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZzdWJfZGVwID0gZGVwZW5kZW5jaWVzW3NlbGZfZGVwX2luZGV4XTsKKyAgICAgICAgICAgIGFjY2Vzc19tYXNrX21hdGNoID0gKGltZ19zcmNfYWNjZXNzX21hc2sgPT0gKHN1Yl9kZXAuc3JjQWNjZXNzTWFzayAmIGltZ19zcmNfYWNjZXNzX21hc2spKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1nX2RzdF9hY2Nlc3NfbWFzayA9PSAoc3ViX2RlcC5kc3RBY2Nlc3NNYXNrICYgaW1nX2RzdF9hY2Nlc3NfbWFzaykpOworICAgICAgICAgICAgaWYgKGFjY2Vzc19tYXNrX21hdGNoKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFjY2Vzc19tYXNrX21hdGNoKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzZWxmX2RlcF9zczsKKyAgICAgICAgICAgIHN0cmVhbV9qb2luKHNlbGZfZGVwX3NzLCAiLCAiLCBzZWxmX2RlcGVuZGVuY2llcyk7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwX2hhbmRsZS5oYW5kbGUsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBEZXBlbmRlbmNpZXMtMDIyODUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQmFycmllciBwSW1hZ2VNZW1vcnlCYXJyaWVyc1slZF0uc3JjQWNjZXNzTWFzaygweCVYKSBpcyBub3QgYSBzdWJzZXQgb2YgVmtTdWJwYXNzRGVwZW5kZW5jeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyY0FjY2Vzc01hc2sgb2Ygc3VicGFzcyAlZCBvZiAlcy4gQ2FuZGlkYXRlIFZrU3VicGFzc0RlcGVuZGVuY3kgYXJlIHBEZXBlbmRlbmNpZXMgZW50cmllcyBbJXNdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY05hbWUsIGksIGltZ19zcmNfYWNjZXNzX21hc2ssIGFjdGl2ZV9zdWJwYXNzLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHJwX2hhbmRsZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmX2RlcF9zcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfaGFuZGxlLmhhbmRsZSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBCYXJyaWVyIHBJbWFnZU1lbW9yeUJhcnJpZXJzWyVkXS5kc3RBY2Nlc3NNYXNrKDB4JVgpIGlzIG5vdCBhIHN1YnNldCBvZiBWa1N1YnBhc3NEZXBlbmRlbmN5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHN0QWNjZXNzTWFzayBvZiBzdWJwYXNzICVkIG9mICVzLiBDYW5kaWRhdGUgVmtTdWJwYXNzRGVwZW5kZW5jeSBhcmUgcERlcGVuZGVuY2llcyBlbnRyaWVzIFslc10uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jTmFtZSwgaSwgaW1nX2RzdF9hY2Nlc3NfbWFzaywgYWN0aXZlX3N1YnBhc3MsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocnBfaGFuZGxlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZfZGVwX3NzLnN0cigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCAhPSBpbWdfYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4IHx8CisgICAgICAgICAgICBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCAhPSBpbWdfYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4KSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwX2hhbmRsZS5oYW5kbGUsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1F1ZXVlRmFtaWx5SW5kZXgtMDExODIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQmFycmllciBwSW1hZ2VNZW1vcnlCYXJyaWVyc1slZF0uc3JjUXVldWVGYW1pbHlJbmRleCBpcyAlZCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwSW1hZ2VNZW1vcnlCYXJyaWVyc1slZF0uZHN0UXVldWVGYW1pbHlJbmRleCBpcyAlZCBidXQgYm90aCBtdXN0IGJlIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY05hbWUsIGksIGltZ19iYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXgsIGksIGltZ19iYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXgpOworICAgICAgICB9CisgICAgICAgIC8vIFNlY29uZGFyeSBDQnMgY2FuIGhhdmUgbnVsbCBmcmFtZWJ1ZmZlciBzbyByZWNvcmQgd2lsbCBxdWV1ZSB1cCB2YWxpZGF0aW9uIGluIHRoYXQgY2FzZSAndGlsIEZCIGlzIGtub3duCisgICAgICAgIGlmIChWS19OVUxMX0hBTkRMRSAhPSBjYl9zdGF0ZS0+YWN0aXZlRnJhbWVidWZmZXIpIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUJhcnJpZXJBdHRhY2htZW50KGZ1bmNOYW1lLCBjYl9zdGF0ZSwgY2Jfc3RhdGUtPmFjdGl2ZUZyYW1lYnVmZmVyLCBhY3RpdmVfc3VicGFzcywgc3ViX2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycF9oYW5kbGUsIGksIGltZ19iYXJyaWVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gVmFsaWRhdGUgVlVzIGZvciBQaXBlbGluZSBCYXJyaWVycyB0aGF0IGFyZSB3aXRoaW4gYSByZW5kZXJQYXNzCisvLyBQcmU6IGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzIG11c3QgYmUgYSBwb2ludGVyIHRvIHZhbGlkIHJlbmRlclBhc3Mgc3RhdGUKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVSZW5kZXJQYXNzUGlwZWxpbmVCYXJyaWVycyhjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjX3N0YWdlX21hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdF9zdGFnZV9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lfZmxhZ3MsIHVpbnQzMl90IG1lbV9iYXJyaWVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciAqbWVtX2JhcnJpZXJzLCB1aW50MzJfdCBidWZmZXJfbWVtX2JhcnJpZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyICpidWZmZXJfbWVtX2JhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlX21lbV9iYXJyaWVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICppbWFnZV9iYXJyaWVycykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGF1dG8gcnBfc3RhdGUgPSBjYl9zdGF0ZS0+YWN0aXZlUmVuZGVyUGFzczsKKyAgICBjb25zdCBhdXRvIGFjdGl2ZV9zdWJwYXNzID0gY2Jfc3RhdGUtPmFjdGl2ZVN1YnBhc3M7CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgcnBfaGFuZGxlKHJwX3N0YXRlLT5yZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MpOworICAgIGNvbnN0IGF1dG8gJnNlbGZfZGVwZW5kZW5jaWVzID0gcnBfc3RhdGUtPnNlbGZfZGVwZW5kZW5jaWVzW2FjdGl2ZV9zdWJwYXNzXTsKKyAgICBjb25zdCBhdXRvICZkZXBlbmRlbmNpZXMgPSBycF9zdGF0ZS0+Y3JlYXRlSW5mby5wRGVwZW5kZW5jaWVzOworICAgIGlmIChzZWxmX2RlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULCBycF9oYW5kbGUuaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJhcnJpZXJzIGNhbm5vdCBiZSBzZXQgZHVyaW5nIHN1YnBhc3MgJWQgb2YgJXMgd2l0aCBubyBzZWxmLWRlcGVuZGVuY3kgc3BlY2lmaWVkLiIsIGZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlX3N1YnBhc3MsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocnBfaGFuZGxlKS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBHcmFiIHJlZiB0byBjdXJyZW50IHN1YnBhc3NEZXNjcmlwdGlvbiB1cC1mcm9udCBmb3IgdXNlIGJlbG93CisgICAgICAgIGNvbnN0IGF1dG8gJnN1Yl9kZXNjID0gcnBfc3RhdGUtPmNyZWF0ZUluZm8ucFN1YnBhc3Nlc1thY3RpdmVfc3VicGFzc107CisgICAgICAgIC8vIExvb2sgZm9yIG1hdGNoaW5nIG1hc2sgaW4gYW55IHNlbGYtZGVwZW5kZW5jeQorICAgICAgICBib29sIHN0YWdlX21hc2tfbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHNlbGZfZGVwX2luZGV4IDogc2VsZl9kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJnN1Yl9kZXAgPSBkZXBlbmRlbmNpZXNbc2VsZl9kZXBfaW5kZXhdOworICAgICAgICAgICAgY29uc3QgYXV0byAmc3ViX3NyY19zdGFnZV9tYXNrID0gRXhwYW5kUGlwZWxpbmVTdGFnZUZsYWdzKGRldmljZV9leHRlbnNpb25zLCBzdWJfZGVwLnNyY1N0YWdlTWFzayk7CisgICAgICAgICAgICBjb25zdCBhdXRvICZzdWJfZHN0X3N0YWdlX21hc2sgPSBFeHBhbmRQaXBlbGluZVN0YWdlRmxhZ3MoZGV2aWNlX2V4dGVuc2lvbnMsIHN1Yl9kZXAuZHN0U3RhZ2VNYXNrKTsKKyAgICAgICAgICAgIHN0YWdlX21hc2tfbWF0Y2ggPSAoKHN1Yl9zcmNfc3RhZ2VfbWFzayA9PSBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjX3N0YWdlX21hc2sgPT0gKHN1Yl9zcmNfc3RhZ2VfbWFzayAmIHNyY19zdGFnZV9tYXNrKSkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdWJfZHN0X3N0YWdlX21hc2sgPT0gVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRzdF9zdGFnZV9tYXNrID09IChzdWJfZHN0X3N0YWdlX21hc2sgJiBkc3Rfc3RhZ2VfbWFzaykpKTsKKyAgICAgICAgICAgIGlmIChzdGFnZV9tYXNrX21hdGNoKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0YWdlX21hc2tfbWF0Y2gpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNlbGZfZGVwX3NzOworICAgICAgICAgICAgc3RyZWFtX2pvaW4oc2VsZl9kZXBfc3MsICIsICIsIHNlbGZfZGVwZW5kZW5jaWVzKTsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfaGFuZGxlLmhhbmRsZSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBCYXJyaWVyIHNyY1N0YWdlTWFzaygweCVYKSBpcyBub3QgYSBzdWJzZXQgb2YgVmtTdWJwYXNzRGVwZW5kZW5jeSBzcmNTdGFnZU1hc2sgb2YgYW55ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZi1kZXBlbmRlbmN5IG9mIHN1YnBhc3MgJWQgb2YgJXMgZm9yIHdoaWNoIGRzdFN0YWdlTWFzayBpcyBhbHNvIGEgc3Vic2V0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbmRpZGF0ZSBWa1N1YnBhc3NEZXBlbmRlbmN5IGFyZSBwRGVwZW5kZW5jaWVzIGVudHJpZXMgWyVzXS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lLCBzcmNfc3RhZ2VfbWFzaywgYWN0aXZlX3N1YnBhc3MsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocnBfaGFuZGxlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZfZGVwX3NzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBycF9oYW5kbGUuaGFuZGxlLCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wRGVwZW5kZW5jaWVzLTAyMjg1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJhcnJpZXIgZHN0U3RhZ2VNYXNrKDB4JVgpIGlzIG5vdCBhIHN1YnNldCBvZiBWa1N1YnBhc3NEZXBlbmRlbmN5IGRzdFN0YWdlTWFzayBvZiBhbnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLWRlcGVuZGVuY3kgb2Ygc3VicGFzcyAlZCBvZiAlcyBmb3Igd2hpY2ggc3JjU3RhZ2VNYXNrIGlzIGFsc28gYSBzdWJzZXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuZGlkYXRlIFZrU3VicGFzc0RlcGVuZGVuY3kgYXJlIHBEZXBlbmRlbmNpZXMgZW50cmllcyBbJXNdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY05hbWUsIGRzdF9zdGFnZV9tYXNrLCBhY3RpdmVfc3VicGFzcywgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShycF9oYW5kbGUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZl9kZXBfc3Muc3RyKCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCAhPSBidWZmZXJfbWVtX2JhcnJpZXJfY291bnQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfaGFuZGxlLmhhbmRsZSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItYnVmZmVyTWVtb3J5QmFycmllckNvdW50LTAxMTc4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCBpcyBub24temVybyAoJWQpIGZvciBzdWJwYXNzICVkIG9mICVzLiIsIGZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9tZW1fYmFycmllcl9jb3VudCwgYWN0aXZlX3N1YnBhc3MsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocnBfaGFuZGxlKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWVtX2JhcnJpZXJfY291bnQ7ICsraSkgeworICAgICAgICAgICAgY29uc3QgYXV0byAmbWJfc3JjX2FjY2Vzc19tYXNrID0gbWVtX2JhcnJpZXJzW2ldLnNyY0FjY2Vzc01hc2s7CisgICAgICAgICAgICBjb25zdCBhdXRvICZtYl9kc3RfYWNjZXNzX21hc2sgPSBtZW1fYmFycmllcnNbaV0uZHN0QWNjZXNzTWFzazsKKyAgICAgICAgICAgIGJvb2wgYWNjZXNzX21hc2tfbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBzZWxmX2RlcF9pbmRleCA6IHNlbGZfZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmc3ViX2RlcCA9IGRlcGVuZGVuY2llc1tzZWxmX2RlcF9pbmRleF07CisgICAgICAgICAgICAgICAgYWNjZXNzX21hc2tfbWF0Y2ggPSAobWJfc3JjX2FjY2Vzc19tYXNrID09IChzdWJfZGVwLnNyY0FjY2Vzc01hc2sgJiBtYl9zcmNfYWNjZXNzX21hc2spKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX2RzdF9hY2Nlc3NfbWFzayA9PSAoc3ViX2RlcC5kc3RBY2Nlc3NNYXNrICYgbWJfZHN0X2FjY2Vzc19tYXNrKSk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc19tYXNrX21hdGNoKSBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFhY2Nlc3NfbWFza19tYXRjaCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNlbGZfZGVwX3NzOworICAgICAgICAgICAgICAgIHN0cmVhbV9qb2luKHNlbGZfZGVwX3NzLCAiLCAiLCBzZWxmX2RlcGVuZGVuY2llcyk7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsIHJwX2hhbmRsZS5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBEZXBlbmRlbmNpZXMtMDIyODUiLAorICAgICAgICAgICAgICAgICAgICAiJXM6IEJhcnJpZXIgcE1lbW9yeUJhcnJpZXJzWyVkXS5zcmNBY2Nlc3NNYXNrKDB4JVgpIGlzIG5vdCBhIHN1YnNldCBvZiBWa1N1YnBhc3NEZXBlbmRlbmN5IHNyY0FjY2Vzc01hc2sgIgorICAgICAgICAgICAgICAgICAgICAiZm9yIGFueSBzZWxmLWRlcGVuZGVuY3kgb2Ygc3VicGFzcyAlZCBvZiAlcyBmb3Igd2hpY2ggZHN0QWNjZXNzTWFzayBpcyBhbHNvIGEgc3Vic2V0LiAiCisgICAgICAgICAgICAgICAgICAgICJDYW5kaWRhdGUgVmtTdWJwYXNzRGVwZW5kZW5jeSBhcmUgcERlcGVuZGVuY2llcyBlbnRyaWVzIFslc10uIiwKKyAgICAgICAgICAgICAgICAgICAgZnVuY05hbWUsIGksIG1iX3NyY19hY2Nlc3NfbWFzaywgYWN0aXZlX3N1YnBhc3MsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocnBfaGFuZGxlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBzZWxmX2RlcF9zcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwgcnBfaGFuZGxlLmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIsCisgICAgICAgICAgICAgICAgICAgICIlczogQmFycmllciBwTWVtb3J5QmFycmllcnNbJWRdLmRzdEFjY2Vzc01hc2soMHglWCkgaXMgbm90IGEgc3Vic2V0IG9mIFZrU3VicGFzc0RlcGVuZGVuY3kgZHN0QWNjZXNzTWFzayAiCisgICAgICAgICAgICAgICAgICAgICJmb3IgYW55IHNlbGYtZGVwZW5kZW5jeSBvZiBzdWJwYXNzICVkIG9mICVzIGZvciB3aGljaCBzcmNBY2Nlc3NNYXNrIGlzIGFsc28gYSBzdWJzZXQuICIKKyAgICAgICAgICAgICAgICAgICAgIkNhbmRpZGF0ZSBWa1N1YnBhc3NEZXBlbmRlbmN5IGFyZSBwRGVwZW5kZW5jaWVzIGVudHJpZXMgWyVzXS4iLAorICAgICAgICAgICAgICAgICAgICBmdW5jTmFtZSwgaSwgbWJfZHN0X2FjY2Vzc19tYXNrLCBhY3RpdmVfc3VicGFzcywgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShycF9oYW5kbGUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIHNlbGZfZGVwX3NzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVJlbmRlclBhc3NJbWFnZUJhcnJpZXJzKGZ1bmNOYW1lLCBjYl9zdGF0ZSwgYWN0aXZlX3N1YnBhc3MsIHN1Yl9kZXNjLCBycF9oYW5kbGUsIGRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZfZGVwZW5kZW5jaWVzLCBpbWFnZV9tZW1fYmFycmllcl9jb3VudCwgaW1hZ2VfYmFycmllcnMpOworCisgICAgICAgIGJvb2wgZmxhZ19tYXRjaCA9IGZhbHNlOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gc2VsZl9kZXBfaW5kZXggOiBzZWxmX2RlcGVuZGVuY2llcykgeworICAgICAgICAgICAgY29uc3QgYXV0byAmc3ViX2RlcCA9IGRlcGVuZGVuY2llc1tzZWxmX2RlcF9pbmRleF07CisgICAgICAgICAgICBmbGFnX21hdGNoID0gc3ViX2RlcC5kZXBlbmRlbmN5RmxhZ3MgPT0gZGVwZW5kZW5jeV9mbGFnczsKKyAgICAgICAgICAgIGlmIChmbGFnX21hdGNoKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZsYWdfbWF0Y2gpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNlbGZfZGVwX3NzOworICAgICAgICAgICAgc3RyZWFtX2pvaW4oc2VsZl9kZXBfc3MsICIsICIsIHNlbGZfZGVwZW5kZW5jaWVzKTsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfaGFuZGxlLmhhbmRsZSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBkZXBlbmRlbmN5RmxhZ3MgcGFyYW0gKDB4JVgpIGRvZXMgbm90IGVxdWFsIFZrU3VicGFzc0RlcGVuZGVuY3kgZGVwZW5kZW5jeUZsYWdzIHZhbHVlIGZvciBhbnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLWRlcGVuZGVuY3kgb2Ygc3VicGFzcyAlZCBvZiAlcy4gQ2FuZGlkYXRlIFZrU3VicGFzc0RlcGVuZGVuY3kgYXJlIHBEZXBlbmRlbmNpZXMgZW50cmllcyBbJXNdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY05hbWUsIGRlcGVuZGVuY3lfZmxhZ3MsIGNiX3N0YXRlLT5hY3RpdmVTdWJwYXNzLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHJwX2hhbmRsZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmX2RlcF9zcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gQXJyYXkgdG8gbWFzayBpbmRpdmlkdWFsIGFjY2Vzc01hc2sgdG8gY29ycmVzcG9uZGluZyBzdGFnZU1hc2sKKy8vICBhY2Nlc3NNYXNrIGFjdGl2ZSBiaXQgcG9zaXRpb24gKDAtMzEpIG1hcHMgdG8gaW5kZXgKK2NvbnN0IHN0YXRpYyBWa1BpcGVsaW5lU3RhZ2VGbGFncyBBY2Nlc3NNYXNrVG9QaXBlU3RhZ2VbMjhdID0geworICAgIC8vIFZLX0FDQ0VTU19JTkRJUkVDVF9DT01NQU5EX1JFQURfQklUID0gMAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0RSQVdfSU5ESVJFQ1RfQklULAorICAgIC8vIFZLX0FDQ0VTU19JTkRFWF9SRUFEX0JJVCA9IDEKKyAgICBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfSU5QVVRfQklULAorICAgIC8vIFZLX0FDQ0VTU19WRVJURVhfQVRUUklCVVRFX1JFQURfQklUID0gMgorICAgIFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9JTlBVVF9CSVQsCisgICAgLy8gVktfQUNDRVNTX1VOSUZPUk1fUkVBRF9CSVQgPSAzCisgICAgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUIHwKKyAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQgfAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIHwKKyAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIHwgVktfUElQRUxJTkVfU1RBR0VfUkFZX1RSQUNJTkdfU0hBREVSX0JJVF9OViwKKyAgICAvLyBWS19BQ0NFU1NfSU5QVVRfQVRUQUNITUVOVF9SRUFEX0JJVCA9IDQKKyAgICBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklULAorICAgIC8vIFZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQgPSA1CisgICAgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUIHwKKyAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQgfAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIHwKKyAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIHwgVktfUElQRUxJTkVfU1RBR0VfUkFZX1RSQUNJTkdfU0hBREVSX0JJVF9OViwKKyAgICAvLyBWS19BQ0NFU1NfU0hBREVSX1dSSVRFX0JJVCA9IDYKKyAgICBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQgfAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCB8CisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9DT01QVVRFX1NIQURFUl9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYgfAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYgfCBWS19QSVBFTElORV9TVEFHRV9SQVlfVFJBQ0lOR19TSEFERVJfQklUX05WLAorICAgIC8vIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfQklUID0gNworICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAvLyBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQgPSA4CisgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgIC8vIFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfUkVBRF9CSVQgPSA5CisgICAgVktfUElQRUxJTkVfU1RBR0VfRUFSTFlfRlJBR01FTlRfVEVTVFNfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfTEFURV9GUkFHTUVOVF9URVNUU19CSVQsCisgICAgLy8gVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9XUklURV9CSVQgPSAxMAorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0VBUkxZX0ZSQUdNRU5UX1RFU1RTX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0xBVEVfRlJBR01FTlRfVEVTVFNfQklULAorICAgIC8vIFZLX0FDQ0VTU19UUkFOU0ZFUl9SRUFEX0JJVCA9IDExCisgICAgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklULAorICAgIC8vIFZLX0FDQ0VTU19UUkFOU0ZFUl9XUklURV9CSVQgPSAxMgorICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCwKKyAgICAvLyBWS19BQ0NFU1NfSE9TVF9SRUFEX0JJVCA9IDEzCisgICAgVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQsCisgICAgLy8gVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUID0gMTQKKyAgICBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCwKKyAgICAvLyBWS19BQ0NFU1NfTUVNT1JZX1JFQURfQklUID0gMTUKKyAgICBWS19BQ0NFU1NfRkxBR19CSVRTX01BWF9FTlVNLCAgLy8gQWx3YXlzIG1hdGNoCisgICAgLy8gVktfQUNDRVNTX01FTU9SWV9XUklURV9CSVQgPSAxNgorICAgIFZLX0FDQ0VTU19GTEFHX0JJVFNfTUFYX0VOVU0sICAvLyBBbHdheXMgbWF0Y2gKKyAgICAvLyBWS19BQ0NFU1NfQ09NTUFORF9QUk9DRVNTX1JFQURfQklUX05WWCA9IDE3CisgICAgVktfUElQRUxJTkVfU1RBR0VfQ09NTUFORF9QUk9DRVNTX0JJVF9OVlgsCisgICAgLy8gVktfQUNDRVNTX0NPTU1BTkRfUFJPQ0VTU19XUklURV9CSVRfTlZYID0gMTgKKyAgICBWS19QSVBFTElORV9TVEFHRV9DT01NQU5EX1BST0NFU1NfQklUX05WWCwKKyAgICAvLyBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9SRUFEX05PTkNPSEVSRU5UX0JJVF9FWFQgPSAxOQorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAvLyBWS19BQ0NFU1NfQ09ORElUSU9OQUxfUkVOREVSSU5HX1JFQURfQklUX0VYVCA9IDIwCisgICAgVktfUElQRUxJTkVfU1RBR0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0JJVF9FWFQsCisgICAgLy8gVktfQUNDRVNTX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUkVBRF9CSVRfTlYgPSAyMQorICAgIFZLX1BJUEVMSU5FX1NUQUdFX1JBWV9UUkFDSU5HX1NIQURFUl9CSVRfTlYgfCBWS19QSVBFTElORV9TVEFHRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0JVSUxEX0JJVF9OViwKKyAgICAvLyBWS19BQ0NFU1NfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9XUklURV9CSVRfTlYgPSAyMgorICAgIFZLX1BJUEVMSU5FX1NUQUdFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQlVJTERfQklUX05WLAorICAgIC8vIFZLX0FDQ0VTU19TSEFESU5HX1JBVEVfSU1BR0VfUkVBRF9CSVRfTlYgPSAyMworICAgIFZLX1BJUEVMSU5FX1NUQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYsCisgICAgLy8gVktfQUNDRVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX1JFQURfQklUX0VYVCA9IDI0CisgICAgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfREVOU0lUWV9QUk9DRVNTX0JJVF9FWFQsCisgICAgLy8gVktfQUNDRVNTX1RSQU5TRk9STV9GRUVEQkFDS19XUklURV9CSVRfRVhUID0gMjUKKyAgICBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQklUX0VYVCwKKyAgICAvLyBWS19BQ0NFU1NfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfUkVBRF9CSVRfRVhUID0gMjYKKyAgICBWS19QSVBFTElORV9TVEFHRV9EUkFXX0lORElSRUNUX0JJVCwKKyAgICAvLyBWS19BQ0NFU1NfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfV1JJVEVfQklUX0VYVCA9IDI3CisgICAgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0JJVF9FWFQsCit9OworCisvLyBWZXJpZnkgdGhhdCBhbGwgYml0cyBvZiBhY2Nlc3NfbWFzayBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBzcmNfc3RhZ2VfbWFzaworc3RhdGljIGJvb2wgVmFsaWRhdGVBY2Nlc3NNYXNrUGlwZWxpbmVTdGFnZShjb25zdCBEZXZpY2VFeHRlbnNpb25zICZleHRlbnNpb25zLCBWa0FjY2Vzc0ZsYWdzIGFjY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZV9tYXNrKSB7CisgICAgLy8gRWFybHkgb3V0IGlmIGFsbCBjb21tYW5kcyBzZXQsIG9yIGFjY2Vzc19tYXNrIE5VTEwKKyAgICBpZiAoKHN0YWdlX21hc2sgJiBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUKSB8fCAoMCA9PSBhY2Nlc3NfbWFzaykpIHJldHVybiB0cnVlOworCisgICAgc3RhZ2VfbWFzayA9IEV4cGFuZFBpcGVsaW5lU3RhZ2VGbGFncyhleHRlbnNpb25zLCBzdGFnZV9tYXNrKTsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIC8vIGZvciBlYWNoIG9mIHRoZSBzZXQgYml0cyBpbiBhY2Nlc3NfbWFzaywgbWFrZSBzdXJlIHRoYXQgc3VwcG9ydGluZyBzdGFnZSBtYXNrIGJpdChzKSBhcmUgc2V0CisgICAgd2hpbGUgKGFjY2Vzc19tYXNrKSB7CisgICAgICAgIGluZGV4ID0gKHVfZmZzKGFjY2Vzc19tYXNrKSAtIDEpOworICAgICAgICBhc3NlcnQoaW5kZXggPj0gMCk7CisgICAgICAgIC8vIE11c3QgaGF2ZSAiIT0gMCIgY29tcGFyZSB0byBwcmV2ZW50IHdhcm5pbmcgZnJvbSBNU1ZDCisgICAgICAgIGlmICgoQWNjZXNzTWFza1RvUGlwZVN0YWdlW2luZGV4XSAmIHN0YWdlX21hc2spID09IDApIHJldHVybiBmYWxzZTsgIC8vIGVhcmx5IG91dAorICAgICAgICBhY2Nlc3NfbWFzayAmPSB+KDEgPDwgaW5kZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXNrIG9mZiBiaXQgdGhhdCdzIGJlZW4gY2hlY2tlZAorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIGJhcnJpZXJfcXVldWVfZmFtaWxpZXMgeworZW51bSBWdUluZGV4IHsKKyAgICBrU3JjT3JEc3RNdXN0QmVJZ25vcmUsCisgICAga1NwZWNpYWxPcklnbm9yZU9ubHksCisgICAga1NyY0lnbm9yZVJlcXVpcmVzRHN0SWdub3JlLAorICAgIGtEc3RWYWxpZE9yU3BlY2lhbElmTm90SWdub3JlLAorICAgIGtTcmNWYWxpZE9yU3BlY2lhbElmTm90SWdub3JlLAorICAgIGtTcmNBbmREZXN0TXVzdEJlSWdub3JlLAorICAgIGtCb3RoSWdub3JlT3JCb3RoVmFsaWQsCisgICAga1N1Ym1pdFF1ZXVlTXVzdE1hdGNoU3JjT3JEc3QKK307CitzdGF0aWMgY29uc3QgY2hhciAqdnVfc3VtbWFyeVtdID0geyJTb3VyY2Ugb3IgZGVzdGluYXRpb24gcXVldWUgZmFtaWx5IG11c3QgYmUgaWdub3JlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291cmNlIG9yIGRlc3RpbmF0aW9uIHF1ZXVlIGZhbWlseSBtdXN0IGJlIHNwZWNpYWwgb3IgaWdub3JlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVzdGluYXRpb24gcXVldWUgZmFtaWx5IG11c3QgYmUgaWdub3JlZCBpZiBzb3VyY2UgcXVldWUgZmFtaWx5IGlzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXN0aW5hdGlvbiBxdWV1ZSBmYW1pbHkgbXVzdCBiZSB2YWxpZCwgaWdub3JlZCwgb3Igc3BlY2lhbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291cmNlIHF1ZXVlIGZhbWlseSBtdXN0IGJlIHZhbGlkLCBpZ25vcmVkLCBvciBzcGVjaWFsLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHF1ZXVlIGZhbWlseSBtdXN0IGJvdGggYmUgaWdub3JlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291cmNlIGFuZCBkZXN0aW5hdGlvbiBxdWV1ZSBmYW1pbHkgbXVzdCBib3RoIGJlIGlnbm9yZSBvciBib3RoIHZhbGlkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3VyY2Ugb3IgZGVzdGluYXRpb24gcXVldWUgZmFtaWx5IG11c3QgbWF0Y2ggc3VibWl0IHF1ZXVlIGZhbWlseSwgaWYgbm90IGlnbm9yZWQuIn07CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBpbWFnZV9lcnJvcl9jb2Rlc1tdID0geworICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMzgxIiwgIC8vICAga1NyY09yRHN0TXVzdEJlSWdub3JlCisgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE3NjYiLCAgLy8gICBrU3BlY2lhbE9ySWdub3JlT25seQorICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjAxIiwgIC8vICAga1NyY0lnbm9yZVJlcXVpcmVzRHN0SWdub3JlCisgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE3NjgiLCAgLy8gICBrRHN0VmFsaWRPclNwZWNpYWxJZk5vdElnbm9yZQorICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxNzY3IiwgIC8vICAga1NyY1ZhbGlkT3JTcGVjaWFsSWZOb3RJZ25vcmUKKyAgICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTE5OSIsICAvLyAgIGtTcmNBbmREZXN0TXVzdEJlSWdub3JlCisgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEyMDAiLCAgLy8gICBrQm90aElnbm9yZU9yQm90aFZhbGlkCisgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEyMDUiLCAgLy8gICBrU3VibWl0UXVldWVNdXN0TWF0Y2hTcmNPckRzdAorfTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGJ1ZmZlcl9lcnJvcl9jb2Rlc1tdID0geworICAgICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTEiLCAgLy8gIGtTcmNPckRzdE11c3RCZUlnbm9yZQorICAgICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjMiLCAgLy8gIGtTcGVjaWFsT3JJZ25vcmVPbmx5CisgICAgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MyIsICAvLyAga1NyY0lnbm9yZVJlcXVpcmVzRHN0SWdub3JlCisgICAgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTc2NSIsICAvLyAga0RzdFZhbGlkT3JTcGVjaWFsSWZOb3RJZ25vcmUKKyAgICAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzY0IiwgIC8vICBrU3JjVmFsaWRPclNwZWNpYWxJZk5vdElnbm9yZQorICAgICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTAiLCAgLy8gIGtTcmNBbmREZXN0TXVzdEJlSWdub3JlCisgICAgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MiIsICAvLyAga0JvdGhJZ25vcmVPckJvdGhWYWxpZAorICAgICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTYiLCAgLy8gIGtTdWJtaXRRdWV1ZU11c3RNYXRjaFNyY09yRHN0Cit9OworCitjbGFzcyBWYWxpZGF0b3JTdGF0ZSB7CisgIHB1YmxpYzoKKyAgICBWYWxpZGF0b3JTdGF0ZShjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZpY2VfZGF0YSwgY29uc3QgY2hhciAqZnVuY19uYW1lLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmYmFycmllcl9oYW5kbGUsIGNvbnN0IFZrU2hhcmluZ01vZGUgc2hhcmluZ19tb2RlKQorICAgICAgICA6IHJlcG9ydF9kYXRhXyhkZXZpY2VfZGF0YS0+cmVwb3J0X2RhdGEpLAorICAgICAgICAgIGZ1bmNfbmFtZV8oZnVuY19uYW1lKSwKKyAgICAgICAgICBjYl9oYW5kbGU2NF8oSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpKSwKKyAgICAgICAgICBiYXJyaWVyX2hhbmRsZV8oYmFycmllcl9oYW5kbGUpLAorICAgICAgICAgIHNoYXJpbmdfbW9kZV8oc2hhcmluZ19tb2RlKSwKKyAgICAgICAgICB2YWxfY29kZXNfKGJhcnJpZXJfaGFuZGxlLnR5cGUgPT0ga1Z1bGthbk9iamVjdFR5cGVJbWFnZSA/IGltYWdlX2Vycm9yX2NvZGVzIDogYnVmZmVyX2Vycm9yX2NvZGVzKSwKKyAgICAgICAgICBsaW1pdF8oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRldmljZV9kYXRhLT5waHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzLnNpemUoKSkpLAorICAgICAgICAgIG1lbV9leHRfKElzRXh0RW5hYmxlZChkZXZpY2VfZGF0YS0+ZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2V4dGVybmFsX21lbW9yeSkpIHt9CisKKyAgICAvLyBMb2cgdGhlIG1lc3NhZ2VzIHVzaW5nIGJvaWxlcnBsYXRlIGZyb20gb2JqZWN0IHN0YXRlLCBhbmQgVnUgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGVtcGxhdGUgYXJnCisgICAgLy8gT25lIGFuZCB0d28gZmFtaWx5IHZlcnNpb25zLCBpbiB0aGUgc2luZ2xlIGZhbWlseSB2ZXJzaW9uLCBWdSBob2xkcyB0aGUgbmFtZSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcgorICAgIGJvb2wgTG9nTXNnKFZ1SW5kZXggdnVfaW5kZXgsIHVpbnQzMl90IGZhbWlseSwgY29uc3QgY2hhciAqcGFyYW1fbmFtZSkgY29uc3QgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdmFsX2NvZGUgPSB2YWxfY29kZXNfW3Z1X2luZGV4XTsKKyAgICAgICAgY29uc3QgY2hhciAqYW5ub3RhdGlvbiA9IEdldEZhbWlseUFubm90YXRpb24oZmFtaWx5KTsKKyAgICAgICAgcmV0dXJuIGxvZ19tc2cocmVwb3J0X2RhdGFfLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwgY2JfaGFuZGxlNjRfLAorICAgICAgICAgICAgICAgICAgICAgICB2YWxfY29kZSwgIiVzOiBCYXJyaWVyIHVzaW5nICVzICVzIGNyZWF0ZWQgd2l0aCBzaGFyaW5nTW9kZSAlcywgaGFzICVzICV1JXMuICVzIiwgZnVuY19uYW1lXywKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0VHlwZVN0cmluZygpLCByZXBvcnRfZGF0YV8tPkZvcm1hdEhhbmRsZShiYXJyaWVyX2hhbmRsZV8pLmNfc3RyKCksIEdldE1vZGVTdHJpbmcoKSwgcGFyYW1fbmFtZSwgZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCB2dV9zdW1tYXJ5W3Z1X2luZGV4XSk7CisgICAgfQorCisgICAgYm9vbCBMb2dNc2coVnVJbmRleCB2dV9pbmRleCwgdWludDMyX3Qgc3JjX2ZhbWlseSwgdWludDMyX3QgZHN0X2ZhbWlseSkgY29uc3QgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdmFsX2NvZGUgPSB2YWxfY29kZXNfW3Z1X2luZGV4XTsKKyAgICAgICAgY29uc3QgY2hhciAqc3JjX2Fubm90YXRpb24gPSBHZXRGYW1pbHlBbm5vdGF0aW9uKHNyY19mYW1pbHkpOworICAgICAgICBjb25zdCBjaGFyICpkc3RfYW5ub3RhdGlvbiA9IEdldEZhbWlseUFubm90YXRpb24oZHN0X2ZhbWlseSk7CisgICAgICAgIHJldHVybiBsb2dfbXNnKAorICAgICAgICAgICAgcmVwb3J0X2RhdGFfLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwgY2JfaGFuZGxlNjRfLCB2YWxfY29kZSwKKyAgICAgICAgICAgICIlczogQmFycmllciB1c2luZyAlcyAlcyBjcmVhdGVkIHdpdGggc2hhcmluZ01vZGUgJXMsIGhhcyBzcmNRdWV1ZUZhbWlseUluZGV4ICV1JXMgYW5kIGRzdFF1ZXVlRmFtaWx5SW5kZXggJXUlcy4gJXMiLAorICAgICAgICAgICAgZnVuY19uYW1lXywgR2V0VHlwZVN0cmluZygpLCByZXBvcnRfZGF0YV8tPkZvcm1hdEhhbmRsZShiYXJyaWVyX2hhbmRsZV8pLmNfc3RyKCksIEdldE1vZGVTdHJpbmcoKSwgc3JjX2ZhbWlseSwKKyAgICAgICAgICAgIHNyY19hbm5vdGF0aW9uLCBkc3RfZmFtaWx5LCBkc3RfYW5ub3RhdGlvbiwgdnVfc3VtbWFyeVt2dV9pbmRleF0pOworICAgIH0KKworICAgIC8vIFRoaXMgYWJzdHJhY3QgVnUgY2FuIG9ubHkgYmUgdGVzdGVkIGF0IHN1Ym1pdCB0aW1lLCB0aHVzIHdlIG5lZWQgYSBjYWxsYmFjayBmcm9tIHRoZSBjbG9zdXJlIGNvbnRhaW5pbmcgdGhlIG5lZWRlZAorICAgIC8vIGRhdGEuIE5vdGUgdGhhdCB0aGUgbWVtX2JhcnJpZXIgaXMgY29waWVkIHRvIHRoZSBjbG9zdXJlIGFzIHRoZSBsYW1iZGEgbGlmZXNwYW4gZXhjZWVkIHRoZSBndWFyYW50ZWVzIG9mIHZhbGlkaXR5IGZvcgorICAgIC8vIGFwcGxpY2F0aW9uIGlucHV0LgorICAgIHN0YXRpYyBib29sIFZhbGlkYXRlQXRRdWV1ZVN1Ym1pdChjb25zdCBRVUVVRV9TVEFURSAqcXVldWVfc3RhdGUsIGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldmljZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfZmFtaWx5LCB1aW50MzJfdCBkc3RfZmFtaWx5LCBjb25zdCBWYWxpZGF0b3JTdGF0ZSAmdmFsKSB7CisgICAgICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseSA9IHF1ZXVlX3N0YXRlLT5xdWV1ZUZhbWlseUluZGV4OworICAgICAgICBpZiAoKHNyY19mYW1pbHkgIT0gcXVldWVfZmFtaWx5KSAmJiAoZHN0X2ZhbWlseSAhPSBxdWV1ZV9mYW1pbHkpKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdmFsX2NvZGUgPSB2YWwudmFsX2NvZGVzX1trU3VibWl0UXVldWVNdXN0TWF0Y2hTcmNPckRzdF07CisgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNfYW5ub3RhdGlvbiA9IHZhbC5HZXRGYW1pbHlBbm5vdGF0aW9uKHNyY19mYW1pbHkpOworICAgICAgICAgICAgY29uc3QgY2hhciAqZHN0X2Fubm90YXRpb24gPSB2YWwuR2V0RmFtaWx5QW5ub3RhdGlvbihkc3RfZmFtaWx5KTsKKyAgICAgICAgICAgIHJldHVybiBsb2dfbXNnKGRldmljZV9kYXRhLT5yZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChxdWV1ZV9zdGF0ZS0+cXVldWUpLCB2YWxfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQmFycmllciBzdWJtaXR0ZWQgdG8gcXVldWUgd2l0aCBmYW1pbHkgaW5kZXggJXUsIHVzaW5nICVzICVzIGNyZWF0ZWQgd2l0aCBzaGFyaW5nTW9kZSAlcywgaGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmNRdWV1ZUZhbWlseUluZGV4ICV1JXMgYW5kIGRzdFF1ZXVlRmFtaWx5SW5kZXggJXUlcy4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrUXVldWVTdWJtaXQiLCBxdWV1ZV9mYW1pbHksIHZhbC5HZXRUeXBlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfZGF0YS0+cmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZSh2YWwuYmFycmllcl9oYW5kbGVfKS5jX3N0cigpLCB2YWwuR2V0TW9kZVN0cmluZygpLCBzcmNfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2Fubm90YXRpb24sIGRzdF9mYW1pbHksIGRzdF9hbm5vdGF0aW9uLCB2dV9zdW1tYXJ5W2tTdWJtaXRRdWV1ZU11c3RNYXRjaFNyY09yRHN0XSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBMb2dpY2FsIGhlbHBlcnMgZm9yIHNlbWFudGljIGNsYXJpdHkKKyAgICBpbmxpbmUgYm9vbCBLaHJFeHRlcm5hbE1lbSgpIGNvbnN0IHsgcmV0dXJuIG1lbV9leHRfOyB9CisgICAgaW5saW5lIGJvb2wgSXNWYWxpZCh1aW50MzJfdCBxdWV1ZV9mYW1pbHkpIGNvbnN0IHsgcmV0dXJuIChxdWV1ZV9mYW1pbHkgPCBsaW1pdF8pOyB9CisgICAgaW5saW5lIGJvb2wgSXNWYWxpZE9yU3BlY2lhbCh1aW50MzJfdCBxdWV1ZV9mYW1pbHkpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElzVmFsaWQocXVldWVfZmFtaWx5KSB8fCAobWVtX2V4dF8gJiYgUXVldWVGYW1pbHlJc1NwZWNpYWwocXVldWVfZmFtaWx5KSk7CisgICAgfQorCisgICAgLy8gSGVscGVycyBmb3IgTG9nTXNnIChhbmQgbG9nX21zZykKKyAgICBjb25zdCBjaGFyICpHZXRNb2RlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX1ZrU2hhcmluZ01vZGUoc2hhcmluZ19tb2RlXyk7IH0KKworICAgIC8vIERlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHF1ZXVlIGZhbWlseSBpbmRleAorICAgIGNvbnN0IGNoYXIgKkdldEZhbWlseUFubm90YXRpb24odWludDMyX3QgZmFtaWx5KSBjb25zdCB7CisgICAgICAgIGNvbnN0IGNoYXIgKmV4dGVybmFsID0gIiAoVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMX0tIUikiOworICAgICAgICBjb25zdCBjaGFyICpmb3JlaWduID0gIiAoVktfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhUKSI7CisgICAgICAgIGNvbnN0IGNoYXIgKmlnbm9yZWQgPSAiIChWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCkiOworICAgICAgICBjb25zdCBjaGFyICp2YWxpZCA9ICIgKFZBTElEKSI7CisgICAgICAgIGNvbnN0IGNoYXIgKmludmFsaWQgPSAiIChJTlZBTElEKSI7CisgICAgICAgIHN3aXRjaCAoZmFtaWx5KSB7CisgICAgICAgICAgICBjYXNlIFZLX1FVRVVFX0ZBTUlMWV9FWFRFUk5BTF9LSFI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsOworICAgICAgICAgICAgY2FzZSBWS19RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvcmVpZ247CisgICAgICAgICAgICBjYXNlIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOgorICAgICAgICAgICAgICAgIHJldHVybiBpZ25vcmVkOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoSXNWYWxpZChmYW1pbHkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGludmFsaWQ7CisgICAgICAgIH07CisgICAgfQorICAgIGNvbnN0IGNoYXIgKkdldFR5cGVTdHJpbmcoKSBjb25zdCB7IHJldHVybiBvYmplY3Rfc3RyaW5nW2JhcnJpZXJfaGFuZGxlXy50eXBlXTsgfQorICAgIFZrU2hhcmluZ01vZGUgR2V0U2hhcmluZ01vZGUoKSBjb25zdCB7IHJldHVybiBzaGFyaW5nX21vZGVfOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpjb25zdCByZXBvcnRfZGF0YV87CisgICAgY29uc3QgY2hhciAqY29uc3QgZnVuY19uYW1lXzsKKyAgICBjb25zdCB1aW50NjRfdCBjYl9oYW5kbGU2NF87CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgYmFycmllcl9oYW5kbGVfOworICAgIGNvbnN0IFZrU2hhcmluZ01vZGUgc2hhcmluZ19tb2RlXzsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAqdmFsX2NvZGVzXzsKKyAgICBjb25zdCB1aW50MzJfdCBsaW1pdF87CisgICAgY29uc3QgYm9vbCBtZW1fZXh0XzsKK307CisKK2Jvb2wgVmFsaWRhdGUoY29uc3QgQ29yZUNoZWNrcyAqZGV2aWNlX2RhdGEsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIGNvbnN0IFZhbGlkYXRvclN0YXRlICZ2YWwsCisgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNyY19xdWV1ZV9mYW1pbHksIGNvbnN0IHVpbnQzMl90IGRzdF9xdWV1ZV9mYW1pbHkpIHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IGJvb2wgbW9kZV9jb25jdXJyZW50ID0gdmFsLkdldFNoYXJpbmdNb2RlKCkgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQ7CisgICAgY29uc3QgYm9vbCBzcmNfaWdub3JlZCA9IFF1ZXVlRmFtaWx5SXNJZ25vcmVkKHNyY19xdWV1ZV9mYW1pbHkpOworICAgIGNvbnN0IGJvb2wgZHN0X2lnbm9yZWQgPSBRdWV1ZUZhbWlseUlzSWdub3JlZChkc3RfcXVldWVfZmFtaWx5KTsKKyAgICBpZiAodmFsLktockV4dGVybmFsTWVtKCkpIHsKKyAgICAgICAgaWYgKG1vZGVfY29uY3VycmVudCkgeworICAgICAgICAgICAgaWYgKCEoc3JjX2lnbm9yZWQgfHwgZHN0X2lnbm9yZWQpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWwuTG9nTXNnKGtTcmNPckRzdE11c3RCZUlnbm9yZSwgc3JjX3F1ZXVlX2ZhbWlseSwgZHN0X3F1ZXVlX2ZhbWlseSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHNyY19pZ25vcmVkICYmICEoZHN0X2lnbm9yZWQgfHwgUXVldWVGYW1pbHlJc1NwZWNpYWwoZHN0X3F1ZXVlX2ZhbWlseSkpKSB8fAorICAgICAgICAgICAgICAgIChkc3RfaWdub3JlZCAmJiAhKHNyY19pZ25vcmVkIHx8IFF1ZXVlRmFtaWx5SXNTcGVjaWFsKHNyY19xdWV1ZV9mYW1pbHkpKSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbC5Mb2dNc2coa1NwZWNpYWxPcklnbm9yZU9ubHksIHNyY19xdWV1ZV9mYW1pbHksIGRzdF9xdWV1ZV9mYW1pbHkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRQorICAgICAgICAgICAgaWYgKHNyY19pZ25vcmVkICYmICFkc3RfaWdub3JlZCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsLkxvZ01zZyhrU3JjSWdub3JlUmVxdWlyZXNEc3RJZ25vcmUsIHNyY19xdWV1ZV9mYW1pbHksIGRzdF9xdWV1ZV9mYW1pbHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkc3RfaWdub3JlZCAmJiAhdmFsLklzVmFsaWRPclNwZWNpYWwoZHN0X3F1ZXVlX2ZhbWlseSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbC5Mb2dNc2coa0RzdFZhbGlkT3JTcGVjaWFsSWZOb3RJZ25vcmUsIGRzdF9xdWV1ZV9mYW1pbHksICJkc3RRdWV1ZUZhbWlseUluZGV4Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNyY19pZ25vcmVkICYmICF2YWwuSXNWYWxpZE9yU3BlY2lhbChzcmNfcXVldWVfZmFtaWx5KSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsLkxvZ01zZyhrU3JjVmFsaWRPclNwZWNpYWxJZk5vdElnbm9yZSwgc3JjX3F1ZXVlX2ZhbWlseSwgInNyY1F1ZXVlRmFtaWx5SW5kZXgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vIG1lbW9yeSBleHRlbnNpb24KKyAgICAgICAgaWYgKG1vZGVfY29uY3VycmVudCkgeworICAgICAgICAgICAgaWYgKCFzcmNfaWdub3JlZCB8fCAhZHN0X2lnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbC5Mb2dNc2coa1NyY0FuZERlc3RNdXN0QmVJZ25vcmUsIHNyY19xdWV1ZV9mYW1pbHksIGRzdF9xdWV1ZV9mYW1pbHkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRQorICAgICAgICAgICAgaWYgKCEoKHNyY19pZ25vcmVkICYmIGRzdF9pZ25vcmVkKSB8fCAodmFsLklzVmFsaWQoc3JjX3F1ZXVlX2ZhbWlseSkgJiYgdmFsLklzVmFsaWQoZHN0X3F1ZXVlX2ZhbWlseSkpKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsLkxvZ01zZyhrQm90aElnbm9yZU9yQm90aFZhbGlkLCBzcmNfcXVldWVfZmFtaWx5LCBkc3RfcXVldWVfZmFtaWx5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KK30gIC8vIG5hbWVzcGFjZSBiYXJyaWVyX3F1ZXVlX2ZhbWlsaWVzCisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDb25jdXJyZW50QmFycmllckF0U3VibWl0KGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKnN0YXRlX2RhdGEsIGNvbnN0IFFVRVVFX1NUQVRFICpxdWV1ZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlLCB1aW50MzJfdCBzcmNfcXVldWVfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0X3F1ZXVlX2ZhbWlseSkgeworICAgIHVzaW5nIGJhcnJpZXJfcXVldWVfZmFtaWxpZXM6OlZhbGlkYXRvclN0YXRlOworICAgIFZhbGlkYXRvclN0YXRlIHZhbChzdGF0ZV9kYXRhLCBmdW5jX25hbWUsIGNiX3N0YXRlLCB0eXBlZF9oYW5kbGUsIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UKTsKKyAgICByZXR1cm4gVmFsaWRhdG9yU3RhdGU6OlZhbGlkYXRlQXRRdWV1ZVN1Ym1pdChxdWV1ZV9zdGF0ZSwgc3RhdGVfZGF0YSwgc3JjX3F1ZXVlX2ZhbWlseSwgZHN0X3F1ZXVlX2ZhbWlseSwgdmFsKTsKK30KKworLy8gVHlwZSBzcGVjaWZpYyB3cmFwcGVyIGZvciBpbWFnZSBiYXJyaWVycworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUJhcnJpZXJRdWV1ZUZhbWlsaWVzKGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgJmJhcnJpZXIsIGNvbnN0IElNQUdFX1NUQVRFICpzdGF0ZV9kYXRhKSBjb25zdCB7CisgICAgLy8gU3RhdGUgZGF0YSBpcyByZXF1aXJlZAorICAgIGlmICghc3RhdGVfZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSB2YWxpZGF0b3Igc3RhdGUgZnJvbSB0aGUgaW1hZ2Ugc3RhdGUKKyAgICBiYXJyaWVyX3F1ZXVlX2ZhbWlsaWVzOjpWYWxpZGF0b3JTdGF0ZSB2YWwodGhpcywgZnVuY19uYW1lLCBjYl9zdGF0ZSwgVnVsa2FuVHlwZWRIYW5kbGUoYmFycmllci5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX2RhdGEtPmNyZWF0ZUluZm8uc2hhcmluZ01vZGUpOworICAgIGNvbnN0IHVpbnQzMl90IHNyY19xdWV1ZV9mYW1pbHkgPSBiYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgY29uc3QgdWludDMyX3QgZHN0X3F1ZXVlX2ZhbWlseSA9IGJhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICByZXR1cm4gYmFycmllcl9xdWV1ZV9mYW1pbGllczo6VmFsaWRhdGUodGhpcywgZnVuY19uYW1lLCBjYl9zdGF0ZSwgdmFsLCBzcmNfcXVldWVfZmFtaWx5LCBkc3RfcXVldWVfZmFtaWx5KTsKK30KKworLy8gVHlwZSBzcGVjaWZpYyB3cmFwcGVyIGZvciBidWZmZXIgYmFycmllcnMKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVCYXJyaWVyUXVldWVGYW1pbGllcyhjb25zdCBjaGFyICpmdW5jX25hbWUsIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAmYmFycmllciwgY29uc3QgQlVGRkVSX1NUQVRFICpzdGF0ZV9kYXRhKSBjb25zdCB7CisgICAgLy8gU3RhdGUgZGF0YSBpcyByZXF1aXJlZAorICAgIGlmICghc3RhdGVfZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSB2YWxpZGF0b3Igc3RhdGUgZnJvbSB0aGUgYnVmZmVyIHN0YXRlCisgICAgYmFycmllcl9xdWV1ZV9mYW1pbGllczo6VmFsaWRhdG9yU3RhdGUgdmFsKAorICAgICAgICB0aGlzLCBmdW5jX25hbWUsIGNiX3N0YXRlLCBWdWxrYW5UeXBlZEhhbmRsZShiYXJyaWVyLmJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIpLCBzdGF0ZV9kYXRhLT5jcmVhdGVJbmZvLnNoYXJpbmdNb2RlKTsKKyAgICBjb25zdCB1aW50MzJfdCBzcmNfcXVldWVfZmFtaWx5ID0gYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4OworICAgIGNvbnN0IHVpbnQzMl90IGRzdF9xdWV1ZV9mYW1pbHkgPSBiYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXg7CisgICAgcmV0dXJuIGJhcnJpZXJfcXVldWVfZmFtaWxpZXM6OlZhbGlkYXRlKHRoaXMsIGZ1bmNfbmFtZSwgY2Jfc3RhdGUsIHZhbCwgc3JjX3F1ZXVlX2ZhbWlseSwgZHN0X3F1ZXVlX2ZhbWlseSk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVCYXJyaWVycyhjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY19zdGFnZV9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdF9zdGFnZV9tYXNrLCB1aW50MzJfdCBtZW1CYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyICpwTWVtQmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlckJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKnBCdWZmZXJNZW1CYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1CYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbUJhcnJpZXJzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1lbUJhcnJpZXJDb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJm1lbV9iYXJyaWVyID0gcE1lbUJhcnJpZXJzW2ldOworICAgICAgICBpZiAoIVZhbGlkYXRlQWNjZXNzTWFza1BpcGVsaW5lU3RhZ2UoZGV2aWNlX2V4dGVuc2lvbnMsIG1lbV9iYXJyaWVyLnNyY0FjY2Vzc01hc2ssIHNyY19zdGFnZV9tYXNrKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY0FjY2Vzc01hc2stMDI4MTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcE1lbUJhcnJpZXJzWyVkXS5zcmNBY2Nlc3NNYXNrICgweCVYKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHNyY1N0YWdlTWFzayAoMHglWCkuIiwgZnVuY05hbWUsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2JhcnJpZXIuc3JjQWNjZXNzTWFzaywgc3JjX3N0YWdlX21hc2spOworICAgICAgICB9CisgICAgICAgIGlmICghVmFsaWRhdGVBY2Nlc3NNYXNrUGlwZWxpbmVTdGFnZShkZXZpY2VfZXh0ZW5zaW9ucywgbWVtX2JhcnJpZXIuZHN0QWNjZXNzTWFzaywgZHN0X3N0YWdlX21hc2spKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0QWNjZXNzTWFzay0wMjgxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwTWVtQmFycmllcnNbJWRdLmRzdEFjY2Vzc01hc2sgKDB4JVgpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZHN0U3RhZ2VNYXNrICgweCVYKS4iLCBmdW5jTmFtZSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fYmFycmllci5kc3RBY2Nlc3NNYXNrLCBkc3Rfc3RhZ2VfbWFzayk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlTWVtQmFycmllckNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXV0byAmbWVtX2JhcnJpZXIgPSBwSW1hZ2VNZW1CYXJyaWVyc1tpXTsKKyAgICAgICAgaWYgKCFWYWxpZGF0ZUFjY2Vzc01hc2tQaXBlbGluZVN0YWdlKGRldmljZV9leHRlbnNpb25zLCBtZW1fYmFycmllci5zcmNBY2Nlc3NNYXNrLCBzcmNfc3RhZ2VfbWFzaykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNBY2Nlc3NNYXNrLTAyODE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHBJbWFnZU1lbUJhcnJpZXJzWyVkXS5zcmNBY2Nlc3NNYXNrICgweCVYKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHNyY1N0YWdlTWFzayAoMHglWCkuIiwgZnVuY05hbWUsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2JhcnJpZXIuc3JjQWNjZXNzTWFzaywgc3JjX3N0YWdlX21hc2spOworICAgICAgICB9CisgICAgICAgIGlmICghVmFsaWRhdGVBY2Nlc3NNYXNrUGlwZWxpbmVTdGFnZShkZXZpY2VfZXh0ZW5zaW9ucywgbWVtX2JhcnJpZXIuZHN0QWNjZXNzTWFzaywgZHN0X3N0YWdlX21hc2spKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0QWNjZXNzTWFzay0wMjgxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwSW1hZ2VNZW1CYXJyaWVyc1slZF0uZHN0QWNjZXNzTWFzayAoMHglWCkgaXMgbm90IHN1cHBvcnRlZCBieSBkc3RTdGFnZU1hc2sgKDB4JVgpLiIsIGZ1bmNOYW1lLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV9iYXJyaWVyLmRzdEFjY2Vzc01hc2ssIGRzdF9zdGFnZV9tYXNrKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaW1hZ2VfZGF0YSA9IEdldEltYWdlU3RhdGUobWVtX2JhcnJpZXIuaW1hZ2UpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQmFycmllclF1ZXVlRmFtaWxpZXMoZnVuY05hbWUsIGNiX3N0YXRlLCBtZW1fYmFycmllciwgaW1hZ2VfZGF0YSk7CisKKyAgICAgICAgaWYgKG1lbV9iYXJyaWVyLm5ld0xheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEIHx8IG1lbV9iYXJyaWVyLm5ld0xheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1uZXdMYXlvdXQtMDExOTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogSW1hZ2UgTGF5b3V0IGNhbm5vdCBiZSB0cmFuc2l0aW9uZWQgdG8gVU5ERUZJTkVEIG9yIFBSRUlOSVRJQUxJWkVELiIsIGZ1bmNOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbWFnZV9kYXRhKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBWVUlEIGZvciB0aGlzLCBidXQgdGhlcmUgaXMgYmxhbmtldCB0ZXh0OgorICAgICAgICAgICAgLy8gICAgICJOb24tc3BhcnNlIHJlc291cmNlcyBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgYmVmb3JlCisgICAgICAgICAgICAvLyAgICAgcmVjb3JkaW5nIGNvbW1hbmRzIGluIGEgY29tbWFuZCBidWZmZXIuIgorICAgICAgICAgICAgLy8gVE9ETzogVXBkYXRlIHRoaXMgd2hlbiBWVUlEIGlzIGRlZmluZWQKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9JbWFnZShpbWFnZV9kYXRhLCBmdW5jTmFtZSwga1ZVSURVbmRlZmluZWQpOworCisgICAgICAgICAgICBjb25zdCBhdXRvIGFzcGVjdF9tYXNrID0gbWVtX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUltYWdlQXNwZWN0TWFzayhpbWFnZV9kYXRhLT5pbWFnZSwgaW1hZ2VfZGF0YS0+Y3JlYXRlSW5mby5mb3JtYXQsIGFzcGVjdF9tYXNrLCBmdW5jTmFtZSk7CisKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhcmFtX25hbWUgPSAicEltYWdlTWVtb3J5QmFycmllcnNbIiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIl0uc3VicmVzb3VyY2VSYW5nZSI7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlSW1hZ2VCYXJyaWVyU3VicmVzb3VyY2VSYW5nZShpbWFnZV9kYXRhLCBtZW1fYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLCBmdW5jTmFtZSwgcGFyYW1fbmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBidWZmZXJCYXJyaWVyQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBhdXRvICZtZW1fYmFycmllciA9IHBCdWZmZXJNZW1CYXJyaWVyc1tpXTsKKworICAgICAgICBpZiAoIVZhbGlkYXRlQWNjZXNzTWFza1BpcGVsaW5lU3RhZ2UoZGV2aWNlX2V4dGVuc2lvbnMsIG1lbV9iYXJyaWVyLnNyY0FjY2Vzc01hc2ssIHNyY19zdGFnZV9tYXNrKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY0FjY2Vzc01hc2stMDI4MTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcEJ1ZmZlck1lbUJhcnJpZXJzWyVkXS5zcmNBY2Nlc3NNYXNrICgweCVYKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHNyY1N0YWdlTWFzayAoMHglWCkuIiwgZnVuY05hbWUsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2JhcnJpZXIuc3JjQWNjZXNzTWFzaywgc3JjX3N0YWdlX21hc2spOworICAgICAgICB9CisgICAgICAgIGlmICghVmFsaWRhdGVBY2Nlc3NNYXNrUGlwZWxpbmVTdGFnZShkZXZpY2VfZXh0ZW5zaW9ucywgbWVtX2JhcnJpZXIuZHN0QWNjZXNzTWFzaywgZHN0X3N0YWdlX21hc2spKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0QWNjZXNzTWFzay0wMjgxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwQnVmZmVyTWVtQmFycmllcnNbJWRdLmRzdEFjY2Vzc01hc2sgKDB4JVgpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZHN0U3RhZ2VNYXNrICgweCVYKS4iLCBmdW5jTmFtZSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fYmFycmllci5kc3RBY2Nlc3NNYXNrLCBkc3Rfc3RhZ2VfbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVmFsaWRhdGUgYnVmZmVyIGJhcnJpZXIgcXVldWUgZmFtaWx5IGluZGljZXMKKyAgICAgICAgYXV0byBidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShtZW1fYmFycmllci5idWZmZXIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQmFycmllclF1ZXVlRmFtaWxpZXMoZnVuY05hbWUsIGNiX3N0YXRlLCBtZW1fYmFycmllciwgYnVmZmVyX3N0YXRlKTsKKworICAgICAgICBpZiAoYnVmZmVyX3N0YXRlKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBWVUlEIGZvciB0aGlzLCBidXQgdGhlcmUgaXMgYmxhbmtldCB0ZXh0OgorICAgICAgICAgICAgLy8gICAgICJOb24tc3BhcnNlIHJlc291cmNlcyBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgYmVmb3JlCisgICAgICAgICAgICAvLyAgICAgcmVjb3JkaW5nIGNvbW1hbmRzIGluIGEgY29tbWFuZCBidWZmZXIiCisgICAgICAgICAgICAvLyBUT0RPOiBVcGRhdGUgdGhpcyB3aGVuIFZVSUQgaXMgZGVmaW5lZAorICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0J1ZmZlcihidWZmZXJfc3RhdGUsIGZ1bmNOYW1lLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICAgICAgICAgIGF1dG8gYnVmZmVyX3NpemUgPSBidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZTsKKyAgICAgICAgICAgIGlmIChtZW1fYmFycmllci5vZmZzZXQgPj0gYnVmZmVyX3NpemUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1vZmZzZXQtMDExODciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJ1ZmZlciBCYXJyaWVyICVzIGhhcyBvZmZzZXQgMHglIiBQUkl4NjQgIiB3aGljaCBpcyBub3QgbGVzcyB0aGFuIHRvdGFsIHNpemUgMHglIiBQUkl4NjQgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jTmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShtZW1fYmFycmllci5idWZmZXIpLmNfc3RyKCksIEhhbmRsZVRvVWludDY0KG1lbV9iYXJyaWVyLm9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGJ1ZmZlcl9zaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lbV9iYXJyaWVyLnNpemUgIT0gVktfV0hPTEVfU0laRSAmJiAobWVtX2JhcnJpZXIub2Zmc2V0ICsgbWVtX2JhcnJpZXIuc2l6ZSA+IGJ1ZmZlcl9zaXplKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLXNpemUtMDExODkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJ1ZmZlciBCYXJyaWVyICVzIGhhcyBvZmZzZXQgMHglIiBQUkl4NjQgIiBhbmQgc2l6ZSAweCUiIFBSSXg2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdob3NlIHN1bSBpcyBncmVhdGVyIHRoYW4gdG90YWwgc2l6ZSAweCUiIFBSSXg2NCAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1lbV9iYXJyaWVyLmJ1ZmZlcikuY19zdHIoKSwgSGFuZGxlVG9VaW50NjQobWVtX2JhcnJpZXIub2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtX2JhcnJpZXIuc2l6ZSksIEhhbmRsZVRvVWludDY0KGJ1ZmZlcl9zaXplKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBza2lwIHw9IFZhbGlkYXRlQmFycmllcnNRRk9UcmFuc2ZlclVuaXF1ZW5lc3MoZnVuY05hbWUsIGNiX3N0YXRlLCBidWZmZXJCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1CYXJyaWVycywgaW1hZ2VNZW1CYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZU1lbUJhcnJpZXJzKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlRXZlbnRTdGFnZU1hc2soY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqc3RhdGVfZGF0YSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqcENCLCBzaXplX3QgZXZlbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmlyc3RFdmVudEluZGV4LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzb3VyY2VTdGFnZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUb1N0YWdlTWFwICpsb2NhbEV2ZW50VG9TdGFnZU1hcCkgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzayA9IDA7CisgICAgY29uc3QgYXV0byBtYXhfZXZlbnQgPSBzdGQ6Om1pbigoZmlyc3RFdmVudEluZGV4ICsgZXZlbnRDb3VudCksIHBDQi0+ZXZlbnRzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgZXZlbnRfaW5kZXggPSBmaXJzdEV2ZW50SW5kZXg7IGV2ZW50X2luZGV4IDwgbWF4X2V2ZW50OyArK2V2ZW50X2luZGV4KSB7CisgICAgICAgIGF1dG8gZXZlbnQgPSBwQ0ItPmV2ZW50c1tldmVudF9pbmRleF07CisgICAgICAgIGF1dG8gZXZlbnRfZGF0YSA9IGxvY2FsRXZlbnRUb1N0YWdlTWFwLT5maW5kKGV2ZW50KTsKKyAgICAgICAgaWYgKGV2ZW50X2RhdGEgIT0gbG9jYWxFdmVudFRvU3RhZ2VNYXAtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGFnZU1hc2sgfD0gZXZlbnRfZGF0YS0+c2Vjb25kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXV0byBnbG9iYWxfZXZlbnRfZGF0YSA9IHN0YXRlX2RhdGEtPkdldEV2ZW50U3RhdGUoZXZlbnQpOworICAgICAgICAgICAgaWYgKCFnbG9iYWxfZXZlbnRfZGF0YSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhzdGF0ZV9kYXRhLT5yZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGV2ZW50KSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIHdhaXRlZCBvbiBpZiBpdCBoYXMgbmV2ZXIgYmVlbiBzZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfZGF0YS0+cmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShldmVudCkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YWdlTWFzayB8PSBnbG9iYWxfZXZlbnRfZGF0YS0+c3RhZ2VNYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFRPRE86IE5lZWQgdG8gdmFsaWRhdGUgdGhhdCBob3N0X2JpdCBpcyBvbmx5IHNldCBpZiBzZXQgZXZlbnQgaXMgY2FsbGVkCisgICAgLy8gYnV0IHNldCBldmVudCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lLgorICAgIGlmIChzb3VyY2VTdGFnZU1hc2sgIT0gc3RhZ2VNYXNrICYmIHNvdXJjZVN0YWdlTWFzayAhPSAoc3RhZ2VNYXNrIHwgVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhzdGF0ZV9kYXRhLT5yZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ0ItPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU3VibWl0dGluZyBjbWRidWZmZXIgd2l0aCBjYWxsIHRvIFZrQ21kV2FpdEV2ZW50cyB1c2luZyBzcmNTdGFnZU1hc2sgMHglWCB3aGljaCBtdXN0IGJlIHRoZSBiaXR3aXNlIE9SIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgc3RhZ2VNYXNrIHBhcmFtZXRlcnMgdXNlZCBpbiBjYWxscyB0byB2a0NtZFNldEV2ZW50IGFuZCBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCBpZiB1c2VkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgInZrU2V0RXZlbnQgYnV0IGluc3RlYWQgaXMgMHglWC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlU3RhZ2VNYXNrLCBzdGFnZU1hc2spOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gTm90ZSB0aGF0IHdlIG9ubHkgY2hlY2sgYml0cyB0aGF0IEhBVkUgcmVxdWlyZWQgcXVldWVmbGFncyAtLSBkb24ndCBjYXJlIGVudHJpZXMgYXJlIHNraXBwZWQKK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8VmtQaXBlbGluZVN0YWdlRmxhZ3MsIFZrUXVldWVGbGFncz4gc3VwcG9ydGVkX3BpcGVsaW5lX3N0YWdlc190YWJsZSA9IHsKKyAgICB7VktfUElQRUxJTkVfU1RBR0VfQ09NTUFORF9QUk9DRVNTX0JJVF9OVlgsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCB8IFZLX1FVRVVFX0NPTVBVVEVfQklUfSwKKyAgICB7VktfUElQRUxJTkVfU1RBR0VfRFJBV19JTkRJUkVDVF9CSVQsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCB8IFZLX1FVRVVFX0NPTVBVVEVfQklUfSwKKyAgICB7VktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX0lOUFVUX0JJVCwgVktfUVVFVUVfR1JBUEhJQ1NfQklUfSwKKyAgICB7VktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQsIFZLX1FVRVVFX0dSQVBISUNTX0JJVH0sCisgICAge1ZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQsIFZLX1FVRVVFX0dSQVBISUNTX0JJVH0sCisgICAge1ZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQsIFZLX1FVRVVFX0dSQVBISUNTX0JJVH0sCisgICAge1ZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQsIFZLX1FVRVVFX0dSQVBISUNTX0JJVH0sCisgICAge1ZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsIFZLX1FVRVVFX0dSQVBISUNTX0JJVH0sCisgICAge1ZLX1BJUEVMSU5FX1NUQUdFX0VBUkxZX0ZSQUdNRU5UX1RFU1RTX0JJVCwgVktfUVVFVUVfR1JBUEhJQ1NfQklUfSwKKyAgICB7VktfUElQRUxJTkVfU1RBR0VfTEFURV9GUkFHTUVOVF9URVNUU19CSVQsIFZLX1FVRVVFX0dSQVBISUNTX0JJVH0sCisgICAge1ZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwgVktfUVVFVUVfR1JBUEhJQ1NfQklUfSwKKyAgICB7VktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklULCBWS19RVUVVRV9DT01QVVRFX0JJVH0sCisgICAge1ZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCwgVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVQgfCBWS19RVUVVRV9UUkFOU0ZFUl9CSVR9LAorICAgIHtWS19QSVBFTElORV9TVEFHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCwgVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVR9LAorICAgIHtWS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklULCBWS19RVUVVRV9HUkFQSElDU19CSVR9fTsKKworc3RhdGljIGNvbnN0IFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlX2ZsYWdfYml0X2FycmF5W10gPSB7VktfUElQRUxJTkVfU1RBR0VfQ09NTUFORF9QUk9DRVNTX0JJVF9OVlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9EUkFXX0lORElSRUNUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9JTlBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9FQVJMWV9GUkFHTUVOVF9URVNUU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9MQVRFX0ZSQUdNRU5UX1RFU1RTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQUxMX0dSQVBISUNTX0JJVH07CisKK2Jvb2wgQ29yZUNoZWNrczo6Q2hlY2tTdGFnZU1hc2tRdWV1ZUNvbXBhdGliaWxpdHkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZV9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmxhZ3MgcXVldWVfZmxhZ3MsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpzcmNfb3JfZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JfY29kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIExvb2t1cCBlYWNoIGJpdCBpbiB0aGUgc3RhZ2VtYXNrIGFuZCBjaGVjayBmb3Igb3ZlcmxhcCBiZXR3ZWVuIGl0cyB0YWJsZSBiaXRzIGFuZCBxdWV1ZV9mbGFncworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHN0YWdlX2ZsYWdfYml0X2FycmF5KSB7CisgICAgICAgIGlmIChzdGFnZV9tYXNrICYgaXRlbSkgeworICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRfcGlwZWxpbmVfc3RhZ2VzX3RhYmxlW2l0ZW1dICYgcXVldWVfZmxhZ3MpID09IDApIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlciksIGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiAlcyBmbGFnICVzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHF1ZXVlIGZhbWlseSBwcm9wZXJ0aWVzIG9mIHRoaXMgY29tbWFuZCBidWZmZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIHNyY19vcl9kZXN0LCBzdHJpbmdfVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM+KGl0ZW0pKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIENoZWNrIGlmIGFsbCBiYXJyaWVycyBhcmUgb2YgYSBnaXZlbiBvcGVyYXRpb24gdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXJyaWVyLCB0eXBlbmFtZSBPcENoZWNrPgorYm9vbCBBbGxUcmFuc2Zlck9wKGNvbnN0IENPTU1BTkRfUE9PTF9TVEFURSAqcG9vbCwgT3BDaGVjayAmb3BfY2hlY2ssIHVpbnQzMl90IGNvdW50LCBjb25zdCBCYXJyaWVyICpiYXJyaWVycykgeworICAgIGlmICghcG9vbCkgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1aW50MzJfdCBiID0gMDsgYiA8IGNvdW50OyBiKyspIHsKKyAgICAgICAgaWYgKCFvcF9jaGVjayhwb29sLCBiYXJyaWVycyArIGIpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBMb29rIGF0IHRoZSBiYXJyaWVycyB0byBzZWUgaWYgd2UgdGhleSBhcmUgYWxsIHJlbGVhc2Ugb3IgYWxsIGFjcXVpcmUsIHRoZSByZXN1bHQgaW1wYWN0cyBxdWV1ZSBwcm9wZXJ0aWVzIHZhbGlkYXRpb24KK0JhcnJpZXJPcGVyYXRpb25zVHlwZSBDb3JlQ2hlY2tzOjpDb21wdXRlQmFycmllck9wZXJhdGlvbnNUeXBlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLCB1aW50MzJfdCBidWZmZXJfYmFycmllcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqYnVmZmVyX2JhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW1hZ2VfYmFycmllcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICppbWFnZV9iYXJyaWVycykgY29uc3QgeworICAgIGF1dG8gcG9vbCA9IGNiX3N0YXRlLT5jb21tYW5kX3Bvb2wuZ2V0KCk7CisgICAgQmFycmllck9wZXJhdGlvbnNUeXBlIG9wX3R5cGUgPSBrR2VuZXJhbDsKKworICAgIC8vIExvb2sgYXQgdGhlIGJhcnJpZXIgZGV0YWlscyBvbmx5IGlmIHRoZXkgZXhpc3QKKyAgICAvLyBOb3RlOiBBbGxUcmFuc2Zlck9wIHJldHVybnMgdHJ1ZSBmb3IgY291bnQgPT0gMAorICAgIGlmICgoYnVmZmVyX2JhcnJpZXJfY291bnQgKyBpbWFnZV9iYXJyaWVyX2NvdW50KSAhPSAwKSB7CisgICAgICAgIGlmIChBbGxUcmFuc2Zlck9wKHBvb2wsIFRlbXBJc1JlbGVhc2VPcDxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+LCBidWZmZXJfYmFycmllcl9jb3VudCwgYnVmZmVyX2JhcnJpZXJzKSAmJgorICAgICAgICAgICAgQWxsVHJhbnNmZXJPcChwb29sLCBUZW1wSXNSZWxlYXNlT3A8VmtJbWFnZU1lbW9yeUJhcnJpZXI+LCBpbWFnZV9iYXJyaWVyX2NvdW50LCBpbWFnZV9iYXJyaWVycykpIHsKKyAgICAgICAgICAgIG9wX3R5cGUgPSBrQWxsUmVsZWFzZTsKKyAgICAgICAgfSBlbHNlIGlmIChBbGxUcmFuc2Zlck9wKHBvb2wsIElzQWNxdWlyZU9wPFZrQnVmZmVyTWVtb3J5QmFycmllcj4sIGJ1ZmZlcl9iYXJyaWVyX2NvdW50LCBidWZmZXJfYmFycmllcnMpICYmCisgICAgICAgICAgICAgICAgICAgQWxsVHJhbnNmZXJPcChwb29sLCBJc0FjcXVpcmVPcDxWa0ltYWdlTWVtb3J5QmFycmllcj4sIGltYWdlX2JhcnJpZXJfY291bnQsIGltYWdlX2JhcnJpZXJzKSkgeworICAgICAgICAgICAgb3BfdHlwZSA9IGtBbGxBY3F1aXJlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9wX3R5cGU7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVTdGFnZU1hc2tzQWdhaW5zdFF1ZXVlQ2FwYWJpbGl0aWVzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc291cmNlX3N0YWdlX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkZXN0X3N0YWdlX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXJyaWVyT3BlcmF0aW9uc1R5cGUgYmFycmllcl9vcF90eXBlLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yX2NvZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICB1aW50MzJfdCBxdWV1ZV9mYW1pbHlfaW5kZXggPSBjYl9zdGF0ZS0+Y29tbWFuZF9wb29sLT5xdWV1ZUZhbWlseUluZGV4OworICAgIGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZSgpOworCisgICAgLy8gQW55IHBpcGVsaW5lIHN0YWdlIGluY2x1ZGVkIGluIHNyY1N0YWdlTWFzayBvciBkc3RTdGFnZU1hc2sgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgcXVldWUgZmFtaWx5CisgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBxdWV1ZUZhbWlseUluZGV4IG1lbWJlciBvZiB0aGUgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gc3RydWN0dXJlIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSBWa0NvbW1hbmRQb29sCisgICAgLy8gdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSwgYXMgc3BlY2lmaWVkIGluIHRoZSB0YWJsZSBvZiBzdXBwb3J0ZWQgcGlwZWxpbmUgc3RhZ2VzLgorCisgICAgaWYgKHF1ZXVlX2ZhbWlseV9pbmRleCA8IHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+cXVldWVfZmFtaWx5X3Byb3BlcnRpZXMuc2l6ZSgpKSB7CisgICAgICAgIFZrUXVldWVGbGFncyBzcGVjaWZpZWRfcXVldWVfZmxhZ3MgPSBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW3F1ZXVlX2ZhbWlseV9pbmRleF0ucXVldWVGbGFnczsKKworICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBzb3VyY2Ugc3RhZ2UgbWFzayBpZiBhbnkgYmFycmllcnMgYXJlbid0ICJhY3F1aXJlIG93bmVyc2hpcCIKKyAgICAgICAgaWYgKChiYXJyaWVyX29wX3R5cGUgIT0ga0FsbEFjcXVpcmUpICYmIChzb3VyY2Vfc3RhZ2VfbWFzayAmIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQpID09IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gQ2hlY2tTdGFnZU1hc2tRdWV1ZUNvbXBhdGliaWxpdHkoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIsIHNvdXJjZV9zdGFnZV9tYXNrLCBzcGVjaWZpZWRfcXVldWVfZmxhZ3MsIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjU3RhZ2VNYXNrIiwgZXJyb3JfY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gT25seSBjaGVjayB0aGUgZGVzdCBzdGFnZSBtYXNrIGlmIGFueSBiYXJyaWVycyBhcmVuJ3QgInJlbGVhc2Ugb3duZXJzaGlwIgorICAgICAgICBpZiAoKGJhcnJpZXJfb3BfdHlwZSAhPSBrQWxsUmVsZWFzZSkgJiYgKGRlc3Rfc3RhZ2VfbWFzayAmIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQpID09IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gQ2hlY2tTdGFnZU1hc2tRdWV1ZUNvbXBhdGliaWxpdHkoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIsIGRlc3Rfc3RhZ2VfbWFzaywgc3BlY2lmaWVkX3F1ZXVlX2ZsYWdzLCBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzdFN0YWdlTWFzayIsIGVycm9yX2NvZGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZFdhaXRFdmVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZrRXZlbnQgKnBFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc291cmNlU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIgKnBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICpwSW1hZ2VNZW1vcnlCYXJyaWVycykgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworCisgICAgYXV0byBiYXJyaWVyX29wX3R5cGUgPSBDb21wdXRlQmFycmllck9wZXJhdGlvbnNUeXBlKGNiX3N0YXRlLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZVN0YWdlTWFza3NBZ2FpbnN0UXVldWVDYXBhYmlsaXRpZXMoY2Jfc3RhdGUsIHNvdXJjZVN0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBiYXJyaWVyX29wX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFdhaXRFdmVudHMiLCAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLTAxMTY0Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZVN0YWdlTWFza0dzVHNFbmFibGVzKHNvdXJjZVN0YWdlTWFzaywgInZrQ21kV2FpdEV2ZW50cygpIiwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMTE1OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDExNjEiLCAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLTAyMTExIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMjExMiIpOworICAgIHNraXAgfD0gVmFsaWRhdGVTdGFnZU1hc2tHc1RzRW5hYmxlcyhkc3RTdGFnZU1hc2ssICJ2a0NtZFdhaXRFdmVudHMoKSIsICJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stMDExNjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0U3RhZ2VNYXNrLTAxMTYyIiwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay0wMjExMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stMDIxMTQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgInZrQ21kV2FpdEV2ZW50cygpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9XQUlURVZFTlRTLCAidmtDbWRXYWl0RXZlbnRzKCkiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQmFycmllcnNUb0ltYWdlcyhjYl9zdGF0ZSwgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzLCAidmtDbWRXYWl0RXZlbnRzKCkiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQmFycmllcnMoInZrQ21kV2FpdEV2ZW50cygpIiwgY2Jfc3RhdGUsIHNvdXJjZVN0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UHJlQ2FsbFJlY29yZENtZFdhaXRFdmVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZrRXZlbnQgKnBFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNvdXJjZVN0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciAqcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbW9yeUJhcnJpZXJzKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIC8vIFRoZSBTdGF0ZVRyYWNrZXIgYWRkZWQgd2lsbCBhZGQgdG8gdGhlIGV2ZW50cyB2ZWN0b3IuCisgICAgYXV0byBmaXJzdF9ldmVudF9pbmRleCA9IGNiX3N0YXRlLT5ldmVudHMuc2l6ZSgpOworICAgIFN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZFdhaXRFdmVudHMoY29tbWFuZEJ1ZmZlciwgZXZlbnRDb3VudCwgcEV2ZW50cywgc291cmNlU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIGF1dG8gZXZlbnRfYWRkZWRfY291bnQgPSBjYl9zdGF0ZS0+ZXZlbnRzLnNpemUoKSAtIGZpcnN0X2V2ZW50X2luZGV4OworCisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGVfY29uc3QgPSBjYl9zdGF0ZTsKKyAgICBjYl9zdGF0ZS0+ZXZlbnRVcGRhdGVzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgW2NiX3N0YXRlX2NvbnN0LCBldmVudF9hZGRlZF9jb3VudCwgZmlyc3RfZXZlbnRfaW5kZXgsIHNvdXJjZVN0YWdlTWFza10oCisgICAgICAgICAgICBjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZpY2VfZGF0YSwgYm9vbCBkb192YWxpZGF0ZSwgRXZlbnRUb1N0YWdlTWFwICpsb2NhbEV2ZW50VG9TdGFnZU1hcCkgeworICAgICAgICAgICAgaWYgKCFkb192YWxpZGF0ZSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRlRXZlbnRTdGFnZU1hc2soZGV2aWNlX2RhdGEsIGNiX3N0YXRlX2NvbnN0LCBldmVudF9hZGRlZF9jb3VudCwgZmlyc3RfZXZlbnRfaW5kZXgsIHNvdXJjZVN0YWdlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRXZlbnRUb1N0YWdlTWFwKTsKKyAgICAgICAgfSk7CisgICAgVHJhbnNpdGlvbkltYWdlTGF5b3V0cyhjYl9zdGF0ZSwgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQb3N0Q2FsbFJlY29yZENtZFdhaXRFdmVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZrRXZlbnQgKnBFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzb3VyY2VTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyICpwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICpwSW1hZ2VNZW1vcnlCYXJyaWVycykgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBSZWNvcmRCYXJyaWVyVmFsaWRhdGlvbkluZm8oInZrQ21kV2FpdEV2ZW50cyIsIGNiX3N0YXRlLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRQaXBlbGluZUJhcnJpZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgVmtEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIgKnBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciAqcEltYWdlTWVtb3J5QmFycmllcnMpIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGF1dG8gYmFycmllcl9vcF90eXBlID0gQ29tcHV0ZUJhcnJpZXJPcGVyYXRpb25zVHlwZShjYl9zdGF0ZSwgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZVN0YWdlTWFza3NBZ2FpbnN0UXVldWVDYXBhYmlsaXRpZXMoY2Jfc3RhdGUsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBiYXJyaWVyX29wX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kUGlwZWxpbmVCYXJyaWVyIiwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAxMTgzIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZFBpcGVsaW5lQmFycmllcigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19RVUVVRV9UUkFOU0ZFUl9CSVQgfCBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfUElQRUxJTkVCQVJSSUVSLCAidmtDbWRQaXBlbGluZUJhcnJpZXIoKSIpOworICAgIHNraXAgfD0KKyAgICAgICAgVmFsaWRhdGVTdGFnZU1hc2tHc1RzRW5hYmxlcyhzcmNTdGFnZU1hc2ssICJ2a0NtZFBpcGVsaW5lQmFycmllcigpIiwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAxMTY4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stMDExNzAiLCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stMDIxMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMjExNiIpOworICAgIHNraXAgfD0KKyAgICAgICAgVmFsaWRhdGVTdGFnZU1hc2tHc1RzRW5hYmxlcyhkc3RTdGFnZU1hc2ssICJ2a0NtZFBpcGVsaW5lQmFycmllcigpIiwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0U3RhZ2VNYXNrLTAxMTY5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RTdGFnZU1hc2stMDExNzEiLCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RTdGFnZU1hc2stMDIxMTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMjExOCIpOworICAgIGlmIChjYl9zdGF0ZS0+YWN0aXZlUmVuZGVyUGFzcykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlUmVuZGVyUGFzc1BpcGVsaW5lQmFycmllcnMoInZrQ21kUGlwZWxpbmVCYXJyaWVyKCkiLCBjYl9zdGF0ZSwgc3JjU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIGRlcGVuZGVuY3lGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gdHJ1ZTsgIC8vIEVhcmx5IHJldHVybiB0byBhdm9pZCByZWR1bmRhbnQgZXJyb3JzIGZyb20gYmVsb3cgY2FsbHMKKyAgICB9CisgICAgc2tpcCB8PSBWYWxpZGF0ZUJhcnJpZXJzVG9JbWFnZXMoY2Jfc3RhdGUsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycywgInZrQ21kUGlwZWxpbmVCYXJyaWVyKCkiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQmFycmllcnMoInZrQ21kUGlwZWxpbmVCYXJyaWVyKCkiLCBjYl9zdGF0ZSwgc3JjU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpFbnF1ZXVlU3VibWl0VGltZVZhbGlkYXRlSW1hZ2VCYXJyaWVyQXR0YWNobWVudChjb25zdCBjaGFyICpmdW5jX25hbWUsIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU1lbUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbUJhcnJpZXJzKSB7CisgICAgLy8gU2Vjb25kYXJ5IENCcyBjYW4gaGF2ZSBudWxsIGZyYW1lYnVmZmVyIHNvIHF1ZXVlIHVwIHZhbGlkYXRpb24gaW4gdGhhdCBjYXNlICd0aWwgRkIgaXMga25vd24KKyAgICBpZiAoKGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzKSAmJiAoVktfTlVMTF9IQU5ETEUgPT0gY2Jfc3RhdGUtPmFjdGl2ZUZyYW1lYnVmZmVyKSAmJgorICAgICAgICAoVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZID09IGNiX3N0YXRlLT5jcmVhdGVJbmZvLmxldmVsKSkgeworICAgICAgICBjb25zdCBhdXRvIGFjdGl2ZV9zdWJwYXNzID0gY2Jfc3RhdGUtPmFjdGl2ZVN1YnBhc3M7CisgICAgICAgIGNvbnN0IGF1dG8gcnBfc3RhdGUgPSBjYl9zdGF0ZS0+YWN0aXZlUmVuZGVyUGFzczsKKyAgICAgICAgY29uc3QgYXV0byAmc3ViX2Rlc2MgPSBycF9zdGF0ZS0+Y3JlYXRlSW5mby5wU3VicGFzc2VzW2FjdGl2ZV9zdWJwYXNzXTsKKyAgICAgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgcnBfaGFuZGxlKHJwX3N0YXRlLT5yZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW1hZ2VNZW1CYXJyaWVyQ291bnQ7ICsraSkgeworICAgICAgICAgICAgY29uc3QgYXV0byAmaW1nX2JhcnJpZXIgPSBwSW1hZ2VNZW1CYXJyaWVyc1tpXTsKKyAgICAgICAgICAgIC8vIFNlY29uZGFyeSBDQiBjYXNlIHcvbyBGQiBzcGVjaWZpZWQgZGVsYXkgdmFsaWRhdGlvbgorICAgICAgICAgICAgY2Jfc3RhdGUtPmNtZF9leGVjdXRlX2NvbW1hbmRzX2Z1bmN0aW9ucy5lbXBsYWNlX2JhY2soWz1dKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnByaW1hcnlfY2IsIFZrRnJhbWVidWZmZXIgZmIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGVJbWFnZUJhcnJpZXJBdHRhY2htZW50KGZ1bmNfbmFtZSwgY2Jfc3RhdGUsIGZiLCBhY3RpdmVfc3VicGFzcywgc3ViX2Rlc2MsIHJwX2hhbmRsZSwgaSwgaW1nX2JhcnJpZXIpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UHJlQ2FsbFJlY29yZENtZFBpcGVsaW5lQmFycmllcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgVmtEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyICpwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICpwSW1hZ2VNZW1vcnlCYXJyaWVycykgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBjb25zdCBjaGFyICpmdW5jX25hbWUgPSAidmtDbWRQaXBlbGluZUJhcnJpZXIiOworCisgICAgUmVjb3JkQmFycmllclZhbGlkYXRpb25JbmZvKGZ1bmNfbmFtZSwgY2Jfc3RhdGUsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpOworCisgICAgRW5xdWV1ZVN1Ym1pdFRpbWVWYWxpZGF0ZUltYWdlQmFycmllckF0dGFjaG1lbnQoZnVuY19uYW1lLCBjYl9zdGF0ZSwgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKyAgICBUcmFuc2l0aW9uSW1hZ2VMYXlvdXRzKGNiX3N0YXRlLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQmVnaW5RdWVyeShjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgY29uc3QgUXVlcnlPYmplY3QgJnF1ZXJ5X29iaiwgVmtGbGFncyBmbGFncywgQ01EX1RZUEUgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY21kX25hbWUsIGNvbnN0IGNoYXIgKnZ1aWRfcXVldWVfZmxhZ3MsIGNvbnN0IGNoYXIgKnZ1aWRfcXVldWVfZmVlZGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2dWlkX3F1ZXVlX29jY2x1c2lvbiwgY29uc3QgY2hhciAqdnVpZF9wcmVjaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdnVpZF9xdWVyeV9jb3VudCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGF1dG8gKnF1ZXJ5X3Bvb2xfc3RhdGUgPSBHZXRRdWVyeVBvb2xTdGF0ZShxdWVyeV9vYmoucG9vbCk7CisgICAgY29uc3QgYXV0byAmcXVlcnlfcG9vbF9jaSA9IHF1ZXJ5X3Bvb2xfc3RhdGUtPmNyZWF0ZUluZm87CisKKyAgICBpZiAocXVlcnlfcG9vbF9jaS5xdWVyeVR5cGUgPT0gVktfUVVFUllfVFlQRV9USU1FU1RBTVApIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMjgwNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFRoZSBxdWVyeXBvb2wncyBxdWVyeSB0eXBlIG11c3Qgbm90IGJlIFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QLiIsIGNtZF9uYW1lKTsKKyAgICB9CisKKyAgICAvLyBUaGVyZSBhcmUgdGlnaHRlciBxdWV1ZSBjb25zdHJhaW50cyB0byB0ZXN0IGZvciBjZXJ0YWluIHF1ZXJ5IHBvb2xzCisgICAgaWYgKHF1ZXJ5X3Bvb2xfY2kucXVlcnlUeXBlID09IFZLX1FVRVJZX1RZUEVfVFJBTlNGT1JNX0ZFRURCQUNLX1NUUkVBTV9FWFQpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsIGNtZF9uYW1lLCBWS19RVUVVRV9HUkFQSElDU19CSVQsIHZ1aWRfcXVldWVfZmVlZGJhY2spOworICAgIH0KKyAgICBpZiAocXVlcnlfcG9vbF9jaS5xdWVyeVR5cGUgPT0gVktfUVVFUllfVFlQRV9PQ0NMVVNJT04pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsIGNtZF9uYW1lLCBWS19RVUVVRV9HUkFQSElDU19CSVQsIHZ1aWRfcXVldWVfb2NjbHVzaW9uKTsKKyAgICB9CisgICAgaWYgKHF1ZXJ5X3Bvb2xfY2kucXVlcnlUeXBlID09IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSKSB7CisgICAgICAgIGlmICghY2Jfc3RhdGUtPnBlcmZvcm1hbmNlX2xvY2tfYWNxdWlyZWQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLAorICAgICAgICAgICAgICAgIHF1ZXJ5X29iai5pbmRleGVkID8gIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjMiIDogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC0wMzIyMyIsCisgICAgICAgICAgICAgICAgIiVzOiBwcm9maWxpbmcgbG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIHZrQmVnaW5Db21tYW5kQnVmZmVyIGlzIGNhbGxlZCBvbiAiCisgICAgICAgICAgICAgICAgImEgY29tbWFuZCBidWZmZXIgd2hlcmUgcGVyZm9ybWFuY2UgcXVlcmllcyBhcmUgcmVjb3JkZWQuIiwKKyAgICAgICAgICAgICAgICBjbWRfbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVlcnlfcG9vbF9zdGF0ZS0+aGFzX3BlcmZfc2NvcGVfY29tbWFuZF9idWZmZXIgJiYgY2Jfc3RhdGUtPmNvbW1hbmRDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLAorICAgICAgICAgICAgICAgIHF1ZXJ5X29iai5pbmRleGVkID8gIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjQiIDogIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC0wMzIyNCIsCisgICAgICAgICAgICAgICAgIiVzOiBRdWVyeSBwb29sICVzIHdhcyBjcmVhdGVkIHdpdGggYSBjb3VudGVyIG9mIHNjb3BlICIKKyAgICAgICAgICAgICAgICAiVktfUVVFUllfU0NPUEVfQ09NTUFORF9CVUZGRVJfS0hSIGJ1dCAlcyBpcyBub3QgdGhlIGZpcnN0IHJlY29yZGVkICIKKyAgICAgICAgICAgICAgICAiY29tbWFuZCBpbiB0aGUgY29tbWFuZCBidWZmZXIuIiwKKyAgICAgICAgICAgICAgICBjbWRfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShxdWVyeV9vYmoucG9vbCkuY19zdHIoKSwgY21kX25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHF1ZXJ5X3Bvb2xfc3RhdGUtPmhhc19wZXJmX3Njb3BlX3JlbmRlcl9wYXNzICYmIGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwKKyAgICAgICAgICAgICAgICBxdWVyeV9vYmouaW5kZXhlZCA/ICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlQb29sLTAzMjI1IiA6ICJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVBvb2wtMDMyMjUiLAorICAgICAgICAgICAgICAgICIlczogUXVlcnkgcG9vbCAlcyB3YXMgY3JlYXRlZCB3aXRoIGEgY291bnRlciBvZiBzY29wZSAiCisgICAgICAgICAgICAgICAgIlZLX1FVRVJZX1NDT1BFX1JFTkRFUl9QQVNTX0tIUiBidXQgJXMgaXMgaW5zaWRlIGEgcmVuZGVyIHBhc3MuIiwKKyAgICAgICAgICAgICAgICBjbWRfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShxdWVyeV9vYmoucG9vbCkuY19zdHIoKSwgY21kX25hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsIGNtZF9uYW1lLCBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCwgdnVpZF9xdWV1ZV9mbGFncyk7CisKKyAgICBpZiAoZmxhZ3MgJiBWS19RVUVSWV9DT05UUk9MX1BSRUNJU0VfQklUKSB7CisgICAgICAgIGlmICghZW5hYmxlZF9mZWF0dXJlcy5jb3JlLm9jY2x1c2lvblF1ZXJ5UHJlY2lzZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksIHZ1aWRfcHJlY2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQgcHJvdmlkZWQsIGJ1dCBwcmVjaXNlIG9jY2x1c2lvbiBxdWVyaWVzIG5vdCBlbmFibGVkIG9uIHRoZSBkZXZpY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRfbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVlcnlfcG9vbF9jaS5xdWVyeVR5cGUgIT0gVktfUVVFUllfVFlQRV9PQ0NMVVNJT04pIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgdnVpZF9wcmVjaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWS19RVUVSWV9DT05UUk9MX1BSRUNJU0VfQklUIHByb3ZpZGVkLCBidXQgcG9vbCBxdWVyeSB0eXBlIGlzIG5vdCBWS19RVUVSWV9UWVBFX09DQ0xVU0lPTiIsIGNtZF9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChxdWVyeV9vYmoucXVlcnkgPj0gcXVlcnlfcG9vbF9jaS5xdWVyeUNvdW50KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksIHZ1aWRfcXVlcnlfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFF1ZXJ5IGluZGV4ICUiIFBSSXUzMiAiIG11c3QgYmUgbGVzcyB0aGFuIHF1ZXJ5IGNvdW50ICUiIFBSSXUzMiAiIG9mICVzLiIsIGNtZF9uYW1lLCBxdWVyeV9vYmoucXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9wb29sX2NpLnF1ZXJ5Q291bnQsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlfb2JqLnBvb2wpLmNfc3RyKCkpOworICAgIH0KKworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIGNtZCwgY21kX25hbWUpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgaWYgKGRpc2FibGVkLnF1ZXJ5X3ZhbGlkYXRpb24pIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBRdWVyeU9iamVjdCBxdWVyeV9vYmoocXVlcnlQb29sLCBzbG90KTsKKyAgICByZXR1cm4gVmFsaWRhdGVCZWdpblF1ZXJ5KGNiX3N0YXRlLCBxdWVyeV9vYmosIGZsYWdzLCBDTURfQkVHSU5RVUVSWSwgInZrQ21kQmVnaW5RdWVyeSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmVnaW5RdWVyeS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlUeXBlLTAyMzI3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDA4MDMiLCAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlUeXBlLTAwODAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeS0wMDgwMiIpOworfQorCitib29sIENvcmVDaGVja3M6OlZlcmlmeVF1ZXJ5SXNSZXNldChjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpzdGF0ZV9kYXRhLCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgUXVlcnlPYmplY3QgcXVlcnlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY19uYW1lLCBRdWVyeU1hcCAqbG9jYWxRdWVyeVRvU3RhdGVNYXApIHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIFF1ZXJ5U3RhdGUgc3RhdGUgPSBzdGF0ZV9kYXRhLT5HZXRRdWVyeVN0YXRlKGxvY2FsUXVlcnlUb1N0YXRlTWFwLCBxdWVyeV9vYmoucG9vbCwgcXVlcnlfb2JqLnF1ZXJ5KTsKKyAgICBpZiAoc3RhdGUgIT0gUVVFUllTVEFURV9SRVNFVCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2coc3RhdGVfZGF0YS0+cmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX1F1ZXJ5Tm90UmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIGFuZCBxdWVyeSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICI6IHF1ZXJ5IG5vdCByZXNldC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkFmdGVyIHF1ZXJ5IHBvb2wgY3JlYXRpb24sIGVhY2ggcXVlcnkgbXVzdCBiZSByZXNldCBiZWZvcmUgaXQgaXMgdXNlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJpZXMgbXVzdCBhbHNvIGJlIHJlc2V0IGJldHdlZW4gdXNlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBzdGF0ZV9kYXRhLT5yZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXJ5X29iai5wb29sKS5jX3N0cigpLCBxdWVyeV9vYmoucXVlcnkpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIENvcmVDaGVja3M6OkVucXVldWVWZXJpZnlCZWdpblF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlciwgY29uc3QgUXVlcnlPYmplY3QgJnF1ZXJ5X29iaiwgY29uc3QgY2hhciAqZnVuY19uYW1lKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRfYnVmZmVyKTsKKworICAgIC8vIEVucXVldWUgdGhlIHN1Ym1pdCB0aW1lIHZhbGlkYXRpb24gaGVyZSwgYWhlYWQgb2YgdGhlIHN1Ym1pdCB0aW1lIHN0YXRlIHVwZGF0ZSBpbiB0aGUgU3RhdGVUcmFja2VyJ3MgUG9zdENhbGxSZWNvcmQKKyAgICBjYl9zdGF0ZS0+cXVlcnlVcGRhdGVzLmVtcGxhY2VfYmFjayhbY29tbWFuZF9idWZmZXIsIHF1ZXJ5X29iaiwgZnVuY19uYW1lXShjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZpY2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvX3ZhbGlkYXRlLCBRdWVyeU1hcCAqbG9jYWxRdWVyeVRvU3RhdGVNYXApIHsKKyAgICAgICAgaWYgKCFkb192YWxpZGF0ZSkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gVmVyaWZ5UXVlcnlJc1Jlc2V0KGRldmljZV9kYXRhLCBjb21tYW5kX2J1ZmZlciwgcXVlcnlfb2JqLCBmdW5jX25hbWUsIGxvY2FsUXVlcnlUb1N0YXRlTWFwKTsKKyAgICB9KTsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5RdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBzbG90LCBWa0ZsYWdzIGZsYWdzKSB7CisgICAgaWYgKGRpc2FibGVkLnF1ZXJ5X3ZhbGlkYXRpb24pIHJldHVybjsKKyAgICBRdWVyeU9iamVjdCBxdWVyeV9vYmogPSB7cXVlcnlQb29sLCBzbG90fTsKKyAgICBFbnF1ZXVlVmVyaWZ5QmVnaW5RdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeV9vYmosICJ2a0NtZEJlZ2luUXVlcnkoKSIpOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ21kRW5kUXVlcnkoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIGNvbnN0IFF1ZXJ5T2JqZWN0ICZxdWVyeV9vYmosIENNRF9UWVBFIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjbWRfbmFtZSwgY29uc3QgY2hhciAqdnVpZF9xdWV1ZV9mbGFncywgY29uc3QgY2hhciAqdnVpZF9hY3RpdmVfcXVlcmllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghY2Jfc3RhdGUtPmFjdGl2ZVF1ZXJpZXMuY291bnQocXVlcnlfb2JqKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCB2dWlkX2FjdGl2ZV9xdWVyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBFbmRpbmcgYSBxdWVyeSBiZWZvcmUgaXQgd2FzIHN0YXJ0ZWQ6ICVzLCBpbmRleCAlZC4iLCBjbWRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlfb2JqLnBvb2wpLmNfc3RyKCksIHF1ZXJ5X29iai5xdWVyeSk7CisgICAgfQorICAgIGNvbnN0IGF1dG8gKnF1ZXJ5X3Bvb2xfc3RhdGUgPSBHZXRRdWVyeVBvb2xTdGF0ZShxdWVyeV9vYmoucG9vbCk7CisgICAgY29uc3QgYXV0byAmcXVlcnlfcG9vbF9jaSA9IHF1ZXJ5X3Bvb2xfc3RhdGUtPmNyZWF0ZUluZm87CisgICAgaWYgKHF1ZXJ5X3Bvb2xfY2kucXVlcnlUeXBlID09IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSICYmIHF1ZXJ5X3Bvb2xfc3RhdGUtPmhhc19wZXJmX3Njb3BlX3JlbmRlcl9wYXNzICYmCisgICAgICAgIGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRW5kUXVlcnktcXVlcnlQb29sLTAzMjI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogUXVlcnkgcG9vbCAlcyB3YXMgY3JlYXRlZCB3aXRoIGEgY291bnRlciBvZiBzY29wZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfUVVFUllfU0NPUEVfUkVOREVSX1BBU1NfS0hSIGJ1dCAlcyBpcyBpbnNpZGUgYSByZW5kZXIgcGFzcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kX25hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlfb2JqLnBvb2wpLmNfc3RyKCksIGNtZF9uYW1lKTsKKyAgICB9CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsIGNtZF9uYW1lLCBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCwgdnVpZF9xdWV1ZV9mbGFncyk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgY21kLCBjbWRfbmFtZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCkgY29uc3QgeworICAgIGlmIChkaXNhYmxlZC5xdWVyeV92YWxpZGF0aW9uKSByZXR1cm4gZmFsc2U7CisgICAgUXVlcnlPYmplY3QgcXVlcnlfb2JqID0ge3F1ZXJ5UG9vbCwgc2xvdH07CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgcmV0dXJuIFZhbGlkYXRlQ21kRW5kUXVlcnkoY2Jfc3RhdGUsIHF1ZXJ5X29iaiwgQ01EX0VORFFVRVJZLCAidmtDbWRFbmRRdWVyeSgpIiwgIlZVSUQtdmtDbWRFbmRRdWVyeS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRW5kUXVlcnktTm9uZS0wMTkyMyIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZFJlc2V0UXVlcnlQb29sKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXJ5Q291bnQpIGNvbnN0IHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKworICAgIGJvb2wgc2tpcCA9IEluc2lkZVJlbmRlclBhc3MoY2Jfc3RhdGUsICJ2a0NtZFJlc2V0UXVlcnlQb29sKCkiLCAiVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLXJlbmRlcnBhc3MiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfUkVTRVRRVUVSWVBPT0wsICJWa0NtZFJlc2V0UXVlcnlQb29sKCkiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgIlZrQ21kUmVzZXRRdWVyeVBvb2woKSIsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCB8IFZLX1FVRVVFX0NPTVBVVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUmVzZXRRdWVyeVBvb2wtY29tbWFuZEJ1ZmZlci1jbWRwb29sIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3N0YXRpYyBRdWVyeVJlc3VsdFR5cGUgR2V0UXVlcnlSZXN1bHRUeXBlKFF1ZXJ5U3RhdGUgc3RhdGUsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncykgeworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBRVUVSWVNUQVRFX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4gUVVFUllSRVNVTFRfVU5LTk9XTjsKKyAgICAgICAgY2FzZSBRVUVSWVNUQVRFX1JFU0VUOgorICAgICAgICBjYXNlIFFVRVJZU1RBVEVfUlVOTklORzoKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFZLX1FVRVJZX1JFU1VMVF9XQUlUX0JJVCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKHN0YXRlID09IFFVRVJZU1RBVEVfUkVTRVQpID8gUVVFUllSRVNVTFRfV0FJVF9PTl9SRVNFVCA6IFFVRVJZUkVTVUxUX1dBSVRfT05fUlVOTklORyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIFZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVCkgfHwgKGZsYWdzICYgVktfUVVFUllfUkVTVUxUX1dJVEhfQVZBSUxBQklMSVRZX0JJVCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUVVFUllSRVNVTFRfU09NRV9EQVRBOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUVVFUllSRVNVTFRfTk9fREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBRVUVSWVNUQVRFX0VOREVEOgorICAgICAgICAgICAgaWYgKChmbGFncyAmIFZLX1FVRVJZX1JFU1VMVF9XQUlUX0JJVCkgfHwgKGZsYWdzICYgVktfUVVFUllfUkVTVUxUX1BBUlRJQUxfQklUKSB8fAorICAgICAgICAgICAgICAgIChmbGFncyAmIFZLX1FVRVJZX1JFU1VMVF9XSVRIX0FWQUlMQUJJTElUWV9CSVQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFFVRVJZUkVTVUxUX1NPTUVfREFUQTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFFVRVJZUkVTVUxUX01BWUJFX05PX0RBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgUVVFUllTVEFURV9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gUVVFUllSRVNVTFRfU09NRV9EQVRBOworICAgIH0KKyAgICBhc3NlcnQoZmFsc2UpOworICAgIHJldHVybiBRVUVSWVJFU1VMVF9VTktOT1dOOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ29weVF1ZXJ5UG9vbFJlc3VsdHMoY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqc3RhdGVfZGF0YSwgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncywgUXVlcnlNYXAgKmxvY2FsUXVlcnlUb1N0YXRlTWFwKSB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHF1ZXJ5Q291bnQ7IGkrKykgeworICAgICAgICBRdWVyeVN0YXRlIHN0YXRlID0gc3RhdGVfZGF0YS0+R2V0UXVlcnlTdGF0ZShsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5ICsgaSk7CisgICAgICAgIFF1ZXJ5UmVzdWx0VHlwZSByZXN1bHRfdHlwZSA9IEdldFF1ZXJ5UmVzdWx0VHlwZShzdGF0ZSwgZmxhZ3MpOworICAgICAgICBpZiAocmVzdWx0X3R5cGUgIT0gUVVFUllSRVNVTFRfU09NRV9EQVRBKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coc3RhdGVfZGF0YS0+cmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoKTogUmVxdWVzdGluZyBhIGNvcHkgZnJvbSBxdWVyeSB0byBidWZmZXIgb24gJXMgcXVlcnkgJSIgUFJJdTMyICI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9kYXRhLT5yZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXJ5UG9vbCkuY19zdHIoKSwgZmlyc3RRdWVyeSArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1F1ZXJ5UmVzdWx0VHlwZShyZXN1bHRfdHlwZSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZENvcHlRdWVyeVBvb2xSZXN1bHRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXJ5Q291bnQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHN0cmlkZSwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgaWYgKGRpc2FibGVkLnF1ZXJ5X3ZhbGlkYXRpb24pIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBhdXRvIGNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBjb25zdCBhdXRvIGRzdF9idWZmX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoZHN0QnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGFzc2VydChkc3RfYnVmZl9zdGF0ZSk7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoZHN0X2J1ZmZfc3RhdGUsICJ2a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZHN0QnVmZmVyLTAwODI2Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZVF1ZXJ5UG9vbFN0cmlkZSgiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAwODIyIiwgIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1mbGFncy0wMDgyMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsICJkc3RPZmZzZXQiLCBkc3RPZmZzZXQsIGZsYWdzKTsKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IERTVCBidWZmZXIgaGFzIGNvcnJlY3QgdXNhZ2UgZmxhZ3Mgc2V0CisgICAgc2tpcCB8PSBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3MoZHN0X2J1ZmZfc3RhdGUsIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZHN0QnVmZmVyLTAwODI1IiwgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzKCkiLCBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9DT1BZUVVFUllQT09MUkVTVUxUUywgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoKSIpOworICAgIHNraXAgfD0gSW5zaWRlUmVuZGVyUGFzcyhjYl9zdGF0ZSwgInZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoKSIsICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtcmVuZGVycGFzcyIpOworCisgICAgYXV0byBxdWVyeV9wb29sX3N0YXRlX2l0ZXIgPSBxdWVyeVBvb2xNYXAuZmluZChxdWVyeVBvb2wpOworICAgIGlmIChxdWVyeV9wb29sX3N0YXRlX2l0ZXIgIT0gcXVlcnlQb29sTWFwLmVuZCgpKSB7CisgICAgICAgIGF1dG8gcXVlcnlfcG9vbF9zdGF0ZSA9IHF1ZXJ5X3Bvb2xfc3RhdGVfaXRlci0+c2Vjb25kLmdldCgpOworICAgICAgICBpZiAocXVlcnlfcG9vbF9zdGF0ZS0+Y3JlYXRlSW5mby5xdWVyeVR5cGUgPT0gVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIpIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVQZXJmb3JtYW5jZVF1ZXJ5UmVzdWx0cygidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIsIHF1ZXJ5X3Bvb2xfc3RhdGUsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIGZsYWdzKTsKKyAgICAgICAgICAgIGlmICghcGh5c19kZXZfZXh0X3Byb3BzLnBlcmZvcm1hbmNlX3F1ZXJ5X3Byb3BzLmFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDMyMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyBjYWxsZWQgd2l0aCBxdWVyeSBwb29sICVzIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFI6OmFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBzZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShxdWVyeVBvb2wpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UHJlQ2FsbFJlY29yZENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWVyeUNvdW50LCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgc3RyaWRlLCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpIHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuOworICAgIGF1dG8gY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT5xdWVyeVVwZGF0ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICBbY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBmbGFnc10oY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2aWNlX2RhdGEsIGJvb2wgZG9fdmFsaWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeU1hcCAqbG9jYWxRdWVyeVRvU3RhdGVNYXApIHsKKyAgICAgICAgICAgIGlmICghZG9fdmFsaWRhdGUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBWYWxpZGF0ZUNvcHlRdWVyeVBvb2xSZXN1bHRzKGRldmljZV9kYXRhLCBjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxRdWVyeVRvU3RhdGVNYXApOworICAgICAgICB9KTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRQdXNoQ29uc3RhbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFncywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBWYWx1ZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgInZrQ21kUHVzaENvbnN0YW50cygpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9QVVNIQ09OU1RBTlRTLCAidmtDbWRQdXNoQ29uc3RhbnRzKCkiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlUHVzaENvbnN0YW50UmFuZ2Uob2Zmc2V0LCBzaXplLCAidmtDbWRQdXNoQ29uc3RhbnRzKCkiKTsKKyAgICBpZiAoMCA9PSBzdGFnZUZsYWdzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXN0YWdlRmxhZ3MtcmVxdWlyZWRiaXRtYXNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFB1c2hDb25zdGFudHMoKSBjYWxsIGhhcyBubyBzdGFnZUZsYWdzIHNldC4iKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBwaXBlbGluZV9sYXlvdXQgVmtQdXNoQ29uc3RhbnRSYW5nZShzKSBvdmVybGFwcGluZyBvZmZzZXQsIHNpemUgaGF2ZSBzdGFnZUZsYWdzIHNldCBmb3IgZWFjaCBzdGFnZSBpbiB0aGUgY29tbWFuZAorICAgIC8vIHN0YWdlRmxhZ3MgYXJndW1lbnQsICphbmQqIHRoYXQgdGhlIGNvbW1hbmQgc3RhZ2VGbGFncyBhcmd1bWVudCBoYXMgYml0cyBzZXQgZm9yIHRoZSBzdGFnZUZsYWdzIGluIGVhY2ggb3ZlcmxhcHBpbmcgcmFuZ2UuCisgICAgaWYgKCFza2lwKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnJhbmdlcyA9ICpHZXRQaXBlbGluZUxheW91dChsYXlvdXQpLT5wdXNoX2NvbnN0YW50X3JhbmdlczsKKyAgICAgICAgVmtTaGFkZXJTdGFnZUZsYWdzIGZvdW5kX3N0YWdlcyA9IDA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcmFuZ2UgOiByYW5nZXMpIHsKKyAgICAgICAgICAgIGlmICgob2Zmc2V0ID49IHJhbmdlLm9mZnNldCkgJiYgKG9mZnNldCArIHNpemUgPD0gcmFuZ2Uub2Zmc2V0ICsgcmFuZ2Uuc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ3MgbWF0Y2hpbmdfc3RhZ2VzID0gcmFuZ2Uuc3RhZ2VGbGFncyAmIHN0YWdlRmxhZ3M7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nX3N0YWdlcyAhPSByYW5nZS5zdGFnZUZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTYiIFZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMTc5NgorICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kUHVzaENvbnN0YW50cygpOiBzdGFnZUZsYWdzICgweCUiIFBSSXgzMiAiLCBvZmZzZXQgKCUiIFBSSXUzMiAiKSwgYW5kIHNpemUgKCUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksICBtdXN0IGNvbnRhaW4gYWxsIHN0YWdlcyBpbiBvdmVybGFwcGluZyBWa1B1c2hDb25zdGFudFJhbmdlIHN0YWdlRmxhZ3MgKDB4JSIgUFJJeDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSwgb2Zmc2V0ICglIiBQUkl1MzIgIiksIGFuZCBzaXplICglIiBQUkl1MzIgIikgaW4gJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzdGFnZUZsYWdzLCBvZmZzZXQsIHNpemUsICh1aW50MzJfdClyYW5nZS5zdGFnZUZsYWdzLCByYW5nZS5vZmZzZXQsIHJhbmdlLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGxheW91dCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQWNjdW11bGF0ZSBhbGwgc3RhZ2VzIHdlJ3ZlIGZvdW5kCisgICAgICAgICAgICAgICAgZm91bmRfc3RhZ2VzID0gbWF0Y2hpbmdfc3RhZ2VzIHwgZm91bmRfc3RhZ2VzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZF9zdGFnZXMgIT0gc3RhZ2VGbGFncykgeworICAgICAgICAgICAgLy8gIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMTc5NSIgVlVJRC12a0NtZFB1c2hDb25zdGFudHMtb2Zmc2V0LTAxNzk1CisgICAgICAgICAgICB1aW50MzJfdCBtaXNzaW5nX3N0YWdlcyA9IH5mb3VuZF9zdGFnZXMgJiBzdGFnZUZsYWdzOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMTc5NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kUHVzaENvbnN0YW50cygpOiBzdGFnZUZsYWdzID0gMHglIiBQUkl4MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBWa1B1c2hDb25zdGFudFJhbmdlIGluICVzIG92ZXJsYXBwaW5nIG9mZnNldCA9ICVkIGFuZCBzaXplID0gJWQsIGRvIG5vdCBjb250YWluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2VGbGFncyAweCUiIFBSSXgzMiAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXN0YWdlRmxhZ3MsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobGF5b3V0KS5jX3N0cigpLCBvZmZzZXQsIHNpemUsIG1pc3Npbmdfc3RhZ2VzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRXcml0ZVRpbWVzdGFtcChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBzbG90KSBjb25zdCB7CisgICAgaWYgKGRpc2FibGVkLnF1ZXJ5X3ZhbGlkYXRpb24pIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZFdyaXRlVGltZXN0YW1wKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCB8IFZLX1FVRVVFX1RSQU5TRkVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfV1JJVEVUSU1FU1RBTVAsICJ2a0NtZFdyaXRlVGltZXN0YW1wKCkiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQcmVDYWxsUmVjb3JkQ21kV3JpdGVUaW1lc3RhbXAoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHNsb3QpIHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuOworICAgIC8vIEVucXVldWUgdGhlIHN1Ym1pdCB0aW1lIHZhbGlkYXRpb24gY2hlY2sgaGVyZSwgYmVmb3JlIHRoZSBzdWJtaXQgdGltZSBzdGF0ZSB1cGRhdGUgaW4gU3RhdGVUcmFja2VyOjpQb3N0Q2FsbC4uLgorICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBRdWVyeU9iamVjdCBxdWVyeSA9IHtxdWVyeVBvb2wsIHNsb3R9OworICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSA9ICJ2a0NtZFdyaXRlVGltZXN0YW1wKCkiOworICAgIGNiX3N0YXRlLT5xdWVyeVVwZGF0ZXMuZW1wbGFjZV9iYWNrKFtjb21tYW5kQnVmZmVyLCBxdWVyeSwgZnVuY19uYW1lXShjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZpY2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb192YWxpZGF0ZSwgUXVlcnlNYXAgKmxvY2FsUXVlcnlUb1N0YXRlTWFwKSB7CisgICAgICAgIGlmICghZG9fdmFsaWRhdGUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIFZlcmlmeVF1ZXJ5SXNSZXNldChkZXZpY2VfZGF0YSwgY29tbWFuZEJ1ZmZlciwgcXVlcnksIGZ1bmNfbmFtZSwgbG9jYWxRdWVyeVRvU3RhdGVNYXApOworICAgIH0pOworfQorCitib29sIENvcmVDaGVja3M6Ok1hdGNoVXNhZ2UodWludDMyX3QgY291bnQsIGNvbnN0IFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgKmF0dGFjaG1lbnRzLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqZmJjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlVXNhZ2VGbGFnQml0cyB1c2FnZV9mbGFnLCBjb25zdCBjaGFyICplcnJvcl9jb2RlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoYXR0YWNobWVudHMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBhdHRhY2ggPSAwOyBhdHRhY2ggPCBjb3VudDsgYXR0YWNoKyspIHsKKyAgICAgICAgICAgIGlmIChhdHRhY2htZW50c1thdHRhY2hdLmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgICAgICAgICAvLyBBdHRhY2htZW50IGNvdW50cyBhcmUgdmVyaWZpZWQgZWxzZXdoZXJlLCBidXQgcHJldmVudCBhbiBpbnZhbGlkIGFjY2VzcworICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50c1thdHRhY2hdLmF0dGFjaG1lbnQgPCBmYmNpLT5hdHRhY2htZW50Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmYmNpLT5mbGFncyAmIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVZpZXcgKmltYWdlX3ZpZXcgPSAmZmJjaS0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRzW2F0dGFjaF0uYXR0YWNobWVudF07CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHZpZXdfc3RhdGUgPSBHZXRJbWFnZVZpZXdTdGF0ZSgqaW1hZ2Vfdmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld19zdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppY2kgPSAmR2V0SW1hZ2VTdGF0ZSh2aWV3X3N0YXRlLT5jcmVhdGVfaW5mby5pbWFnZSktPmNyZWF0ZUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGljaSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWNpLT51c2FnZSAmIHVzYWdlX2ZsYWcpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCBlcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyOiAgRnJhbWVidWZmZXIgQXR0YWNobWVudCAoJWQpIGNvbmZsaWN0cyB3aXRoIHRoZSBpbWFnZSdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU1BR0VfVVNBR0UgZmxhZ3MgKCVzKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzW2F0dGFjaF0uYXR0YWNobWVudCwgc3RyaW5nX1ZrSW1hZ2VVc2FnZUZsYWdCaXRzKHVzYWdlX2ZsYWcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgKmZiYWNpID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSPihmYmNpLT5wTmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmJhY2kgIT0gbnVsbHB0ciAmJiBmYmFjaS0+cEF0dGFjaG1lbnRJbWFnZUluZm9zICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmFjaS0+YXR0YWNobWVudEltYWdlSW5mb0NvdW50ID4gYXR0YWNobWVudHNbYXR0YWNoXS5hdHRhY2htZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW1hZ2VfdXNhZ2UgPSBmYmFjaS0+cEF0dGFjaG1lbnRJbWFnZUluZm9zW2F0dGFjaG1lbnRzW2F0dGFjaF0uYXR0YWNobWVudF0udXNhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbWFnZV91c2FnZSAmIHVzYWdlX2ZsYWcpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyOiAgRnJhbWVidWZmZXIgYXR0YWNobWVudCBpbmZvICglZCkgY29uZmxpY3RzIHdpdGggdGhlIGltYWdlJ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklNQUdFX1VTQUdFIGZsYWdzICglcykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzW2F0dGFjaF0uYXR0YWNobWVudCwgc3RyaW5nX1ZrSW1hZ2VVc2FnZUZsYWdCaXRzKHVzYWdlX2ZsYWcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIFZhbGlkYXRlIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIHdoaWNoIGluY2x1ZGVzOgorLy8gMS4gYXR0YWNobWVudENvdW50IGVxdWFscyByZW5kZXJQYXNzIGF0dGFjaG1lbnRDb3VudAorLy8gMi4gY29ycmVzcG9uZGluZyBmcmFtZWJ1ZmZlciBhbmQgcmVuZGVycGFzcyBhdHRhY2htZW50cyBoYXZlIG1hdGNoaW5nIGZvcm1hdHMKKy8vIDMuIGNvcnJlc3BvbmRpbmcgZnJhbWVidWZmZXIgYW5kIHJlbmRlcnBhc3MgYXR0YWNobWVudHMgaGF2ZSBtYXRjaGluZyBzYW1wbGUgY291bnRzCisvLyA0LiBmYiBhdHRhY2htZW50cyBvbmx5IGhhdmUgYSBzaW5nbGUgbWlwIGxldmVsCisvLyA1LiBmYiBhdHRhY2htZW50IGRpbWVuc2lvbnMgYXJlIGVhY2ggYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGZiCisvLyA2LiBmYiBhdHRhY2htZW50cyB1c2UgaWRlbml0eSBzd2l6emxlCisvLyA3LiBmYiBhdHRhY2htZW50cyB1c2VkIGJ5IHJlbmRlclBhc3MgZm9yIGNvbG9yL2lucHV0L2RzIGhhdmUgY29ycmVjdCB1c2FnZSBiaXQgc2V0CisvLyA4LiBmYiBkaW1lbnNpb25zIGFyZSB3aXRoaW4gcGh5c2ljYWwgZGV2aWNlIGxpbWl0cworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUZyYW1lYnVmZmVyQ3JlYXRlSW5mbyhjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgKnBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mbyA9CisgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIpICE9IDApIHsKKyAgICAgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmltYWdlbGVzc19mcmFtZWJ1ZmZlcl9mZWF0dXJlcy5pbWFnZWxlc3NGcmFtZWJ1ZmZlcikgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE4OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmbGFncyBpbmNsdWRlcyBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJidXQgdGhlIGltYWdlbGVzc0ZyYW1lYnVmZmVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRnJhbWVidWZmZXIoKTogVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmxhZ3MgaW5jbHVkZXMgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vIGluc3RhbmNlIG9mIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgaXMgcHJlc2VudCBpbiB0aGUgcE5leHQgY2hhaW4uIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLT5hdHRhY2htZW50SW1hZ2VJbmZvQ291bnQgIT0gMCAmJgorICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby0+YXR0YWNobWVudEltYWdlSW5mb0NvdW50ICE9IHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTkxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRnJhbWVidWZmZXIoKTogVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gYXR0YWNobWVudENvdW50IGlzICV1LCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQgaXMgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCwgcEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLT5hdHRhY2htZW50SW1hZ2VJbmZvQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBycF9zdGF0ZSA9IEdldFJlbmRlclBhc3NTdGF0ZShwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcyk7CisgICAgaWYgKHJwX3N0YXRlKSB7CisgICAgICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpycGNpID0gcnBfc3RhdGUtPmNyZWF0ZUluZm8ucHRyKCk7CisgICAgICAgIGlmIChycGNpLT5hdHRhY2htZW50Q291bnQgIT0gcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcyksICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWF0dGFjaG1lbnRDb3VudC0wMDg3NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRnJhbWVidWZmZXIoKTogVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gYXR0YWNobWVudENvdW50IG9mICV1IGRvZXMgbm90IG1hdGNoIGF0dGFjaG1lbnRDb3VudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mICV1IG9mICVzIGJlaW5nIHVzZWQgdG8gY3JlYXRlIEZyYW1lYnVmZmVyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCwgcnBjaS0+YXR0YWNobWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENyZWF0ZUluZm8tPnJlbmRlclBhc3MpLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYXR0YWNobWVudENvdW50cyBtYXRjaCwgc28gbWFrZSBzdXJlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBkZXRhaWxzIGxpbmUgdXAKKyAgICAgICAgICAgIGlmICgocENyZWF0ZUluZm8tPmZsYWdzICYgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVZpZXcgKmltYWdlX3ZpZXdzID0gcENyZWF0ZUluZm8tPnBBdHRhY2htZW50czsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gdmlld19zdGF0ZSA9IEdldEltYWdlVmlld1N0YXRlKGltYWdlX3ZpZXdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdfc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfVklFV19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV92aWV3c1tpXSksICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTg4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGF0dGFjaG1lbnQgIyV1IGlzIG5vdCBhIHZhbGlkIFZrSW1hZ2VWaWV3LiIsIGkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byAmaXZjaSA9IHZpZXdfc3RhdGUtPmNyZWF0ZV9pbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl2Y2kuZm9ybWF0ICE9IHJwY2ktPnBBdHRhY2htZW50c1tpXS5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENyZWF0ZUluZm8tPnJlbmRlclBhc3MpLCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBhdHRhY2htZW50ICMldSBoYXMgZm9ybWF0IG9mICVzIHRoYXQgZG9lcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2ggdGhlIGZvcm1hdCBvZiAlcyB1c2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgZm9yICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHN0cmluZ19Wa0Zvcm1hdChpdmNpLmZvcm1hdCksIHN0cmluZ19Wa0Zvcm1hdChycGNpLT5wQXR0YWNobWVudHNbaV0uZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcykuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqaWNpID0gJkdldEltYWdlU3RhdGUoaXZjaS5pbWFnZSktPmNyZWF0ZUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWNpLT5zYW1wbGVzICE9IHJwY2ktPnBBdHRhY2htZW50c1tpXS5zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcyksICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRnJhbWVidWZmZXIoKTogVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gYXR0YWNobWVudCAjJXUgaGFzICVzIHNhbXBsZXMgdGhhdCBkbyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaCB0aGUgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGVzIHVzZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBmb3IgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzdHJpbmdfVmtTYW1wbGVDb3VudEZsYWdCaXRzKGljaS0+c2FtcGxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhycGNpLT5wQXR0YWNobWVudHNbaV0uc2FtcGxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcykuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB2aWV3IG9ubHkgaGFzIGEgc2luZ2xlIG1pcCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBhdHRhY2htZW50ICMldSBoYXMgbWlwIGxldmVsQ291bnQgb2YgJXUgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgYSBzaW5nbGUgbWlwIGxldmVsIChsZXZlbENvdW50ID09ICAxKSBpcyBhbGxvd2VkIHdoZW4gY3JlYXRpbmcgYSBGcmFtZWJ1ZmZlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtaXBfbGV2ZWwgPSBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWlwX3dpZHRoID0gbWF4KDF1LCBpY2ktPmV4dGVudC53aWR0aCA+PiBtaXBfbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWlwX2hlaWdodCA9IG1heCgxdSwgaWNpLT5leHRlbnQuaGVpZ2h0ID4+IG1pcF9sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShycGNpLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfRlJBR01FTlRfREVOU0lUWV9NQVBfT1BUSU1BTF9FWFQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwY2ktPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfRlJBR01FTlRfREVOU0lUWV9NQVBfT1BUSU1BTF9FWFQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpdmNpLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA8IHBDcmVhdGVJbmZvLT5sYXllcnMpIHx8IChtaXBfd2lkdGggPCBwQ3JlYXRlSW5mby0+d2lkdGgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaXBfaGVpZ2h0IDwgcENyZWF0ZUluZm8tPmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRnJhbWVidWZmZXIoKTogVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gYXR0YWNobWVudCAjJXUgbWlwIGxldmVsICV1IGhhcyBkaW1lbnNpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbWFsbGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgZnJhbWVidWZmZXIgZGltZW5zaW9ucy4gSGVyZSBhcmUgdGhlIHJlc3BlY3RpdmUgZGltZW5zaW9ucyBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGFjaG1lbnQgIyV1LCBmcmFtZWJ1ZmZlcjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDogJXUsICV1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OiAldSwgJXVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXllckNvdW50OiAldSwgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsLCBpLCBtaXBfd2lkdGgsIHBDcmVhdGVJbmZvLT53aWR0aCwgbWlwX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5oZWlnaHQsIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50LCBwQ3JlYXRlSW5mby0+bGF5ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZnJhZ21lbnRfZGVuc2l0eV9tYXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2VpbGluZ193aWR0aCA9ICh1aW50MzJfdCljZWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KXBDcmVhdGVJbmZvLT53aWR0aCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heCgoZmxvYXQpcGh5c19kZXZfZXh0X3Byb3BzLmZyYWdtZW50X2RlbnNpdHlfbWFwX3Byb3BzLm1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pcF93aWR0aCA8IGNlaWxpbmdfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI1NTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGF0dGFjaG1lbnQgIyV1IG1pcCBsZXZlbCAldSBoYXMgd2lkdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbWFsbGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdGhlIGNlaWxpbmcgb2YgZnJhbWVidWZmZXIgd2lkdGggLyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZS53aWR0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlcmUgYXJlIHRoZSByZXNwZWN0aXZlIGRpbWVuc2lvbnMgZm9yIGF0dGFjaG1lbnQgIyV1LCB0aGUgY2VpbGluZyB2YWx1ZTpcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGFjaG1lbnQgIyV1LCBmcmFtZWJ1ZmZlcjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGg6ICV1LCB0aGUgY2VpbGluZyB2YWx1ZTogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCwgaSwgaSwgbWlwX3dpZHRoLCBjZWlsaW5nX3dpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjZWlsaW5nX2hlaWdodCA9ICh1aW50MzJfdCljZWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KXBDcmVhdGVJbmZvLT5oZWlnaHQgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KXBoeXNfZGV2X2V4dF9wcm9wcy5mcmFnbWVudF9kZW5zaXR5X21hcF9wcm9wcy5tYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemUuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pcF9oZWlnaHQgPCBjZWlsaW5nX2hlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjU1NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRnJhbWVidWZmZXIoKTogVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gYXR0YWNobWVudCAjJXUgbWlwIGxldmVsICV1IGhhcyBoZWlnaHQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbWFsbGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdGhlIGNlaWxpbmcgb2YgZnJhbWVidWZmZXIgaGVpZ2h0IC8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemUuaGVpZ2h0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVyZSBhcmUgdGhlIHJlc3BlY3RpdmUgZGltZW5zaW9ucyBmb3IgYXR0YWNobWVudCAjJXUsIHRoZSBjZWlsaW5nIHZhbHVlOlxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0YWNobWVudCAjJXUsIGZyYW1lYnVmZmVyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWlnaHQ6ICV1LCB0aGUgY2VpbGluZyB2YWx1ZTogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCwgaSwgaSwgbWlwX2hlaWdodCwgY2VpbGluZ19oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoaXZjaS5jb21wb25lbnRzLnIgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdmNpLmNvbXBvbmVudHMuciAhPSBWS19DT01QT05FTlRfU1dJWlpMRV9SKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl2Y2kuY29tcG9uZW50cy5nICE9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXZjaS5jb21wb25lbnRzLmcgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfRykpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpdmNpLmNvbXBvbmVudHMuYiAhPSBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl2Y2kuY29tcG9uZW50cy5iICE9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0IpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXZjaS5jb21wb25lbnRzLmEgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdmNpLmNvbXBvbmVudHMuYSAhPSBWS19DT01QT05FTlRfU1dJWlpMRV9BKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBhdHRhY2htZW50ICMldSBoYXMgbm9uLWlkZW50eSBzd2l6emxlLiBBbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVidWZmZXIgYXR0YWNobWVudHMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBpZGVudGl0eSBzd2l6emxlLiBIZXJlIGFyZSB0aGUgYWN0dWFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN3aXp6bGUgdmFsdWVzOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciBzd2l6emxlID0gJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImcgc3dpenpsZSA9ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiIHN3aXp6bGUgPSAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBzd2l6emxlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHN0cmluZ19Wa0NvbXBvbmVudFN3aXp6bGUoaXZjaS5jb21wb25lbnRzLnIpLCBzdHJpbmdfVmtDb21wb25lbnRTd2l6emxlKGl2Y2kuY29tcG9uZW50cy5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrQ29tcG9uZW50U3dpenpsZShpdmNpLmNvbXBvbmVudHMuYiksIHN0cmluZ19Wa0NvbXBvbmVudFN3aXp6bGUoaXZjaS5jb21wb25lbnRzLmEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICAgICAgLy8gVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSIGlzIHNldAorICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byAmYWlpID0gcEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLT5wQXR0YWNobWVudEltYWdlSW5mb3NbaV07CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9ybWF0Rm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGFpaS52aWV3Rm9ybWF0Q291bnQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpaS5wVmlld0Zvcm1hdHNbal0gPT0gcnBjaS0+cEF0dGFjaG1lbnRzW2ldLmZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdEZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDcmVhdGVJbmZvLT5yZW5kZXJQYXNzKSwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGF0dGFjaG1lbnQgaW5mbyAjJXUgZG9lcyBub3QgaW5jbHVkZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlcyB1c2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnkgdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBmb3IgcmVuZGVyUGFzcyAoJXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3RyaW5nX1ZrRm9ybWF0KHJwY2ktPnBBdHRhY2htZW50c1tpXS5mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENyZWF0ZUluZm8tPnJlbmRlclBhc3MpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWlzbWF0Y2hlZExheWVyc05vTXVsdGl2aWV3VnVpZCA9IGRldmljZV9leHRlbnNpb25zLnZrX2tocl9tdWx0aXZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDMxOTkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMCI7CisgICAgICAgICAgICAgICAgICAgIGlmICgocnBjaS0+c3VicGFzc0NvdW50ID09IDApIHx8IChycGNpLT5wU3VicGFzc2VzWzBdLnZpZXdNYXNrID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlpLmxheWVyQ291bnQgPCBwQ3JlYXRlSW5mby0+bGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZWRMYXllcnNOb011bHRpdmlld1Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRnJhbWVidWZmZXIoKTogVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gYXR0YWNobWVudCBpbmZvICMldSBoYXMgb25seSAjJXUgbGF5ZXJzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmcmFtZWJ1ZmZlciBoYXMgIyV1IGxheWVycy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGFpaS5sYXllckNvdW50LCBwQ3JlYXRlSW5mby0+bGF5ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2ZyYWdtZW50X2RlbnNpdHlfbWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlpLndpZHRoIDwgcENyZWF0ZUluZm8tPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBhdHRhY2htZW50IGluZm8gIyV1IGhhcyBhIHdpZHRoIG9mIG9ubHkgIyV1LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZnJhbWVidWZmZXIgaGFzIGEgd2lkdGggb2YgIyV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGFpaS53aWR0aCwgcENyZWF0ZUluZm8tPndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpaS5oZWlnaHQgPCBwQ3JlYXRlSW5mby0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBhdHRhY2htZW50IGluZm8gIyV1IGhhcyBhIGhlaWdodCBvZiBvbmx5ICMldSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZyYW1lYnVmZmVyIGhhcyBhIGhlaWdodCBvZiAjJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgYWlpLmhlaWdodCwgcENyZWF0ZUluZm8tPmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBpbWFnZSB1c2FnZQorICAgICAgICAgICAgICAgIHVpbnQzMl90IGF0dGFjaG1lbnRfaW5kZXggPSBWS19BVFRBQ0hNRU5UX1VOVVNFRDsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcnBjaS0+c3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBNYXRjaFVzYWdlKHJwY2ktPnBTdWJwYXNzZXNbaV0uY29sb3JBdHRhY2htZW50Q291bnQsIHJwY2ktPnBTdWJwYXNzZXNbaV0ucENvbG9yQXR0YWNobWVudHMsIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAxIik7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoVXNhZ2UocnBjaS0+cFN1YnBhc3Nlc1tpXS5jb2xvckF0dGFjaG1lbnRDb3VudCwgcnBjaS0+cFN1YnBhc3Nlc1tpXS5wUmVzb2x2ZUF0dGFjaG1lbnRzLCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAxIik7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gTWF0Y2hVc2FnZSgxLCBycGNpLT5wU3VicGFzc2VzW2ldLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAyIik7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gTWF0Y2hVc2FnZShycGNpLT5wU3VicGFzc2VzW2ldLmlucHV0QXR0YWNobWVudENvdW50LCBycGNpLT5wU3VicGFzc2VzW2ldLnBJbnB1dEF0dGFjaG1lbnRzLCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwNCIpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAqcERlcHRoU3RlbmNpbFJlc29sdmUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSPihycGNpLT5wU3VicGFzc2VzW2ldLnBOZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2tocl9kZXB0aF9zdGVuY2lsX3Jlc29sdmUgJiYgcERlcHRoU3RlbmNpbFJlc29sdmUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBNYXRjaFVzYWdlKDEsIHBEZXB0aFN0ZW5jaWxSZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQsIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX211bHRpdmlldykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHJwY2ktPnN1YnBhc3NDb3VudCA+IDApICYmIChycGNpLT5wU3VicGFzc2VzWzBdLnZpZXdNYXNrICE9IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcnBjaS0+c3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgKnBEZXB0aFN0ZW5jaWxSZXNvbHZlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSPihycGNpLT5wU3VicGFzc2VzW2ldLnBOZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2aWV3X2JpdHMgPSBycGNpLT5wU3VicGFzc2VzW2ldLnZpZXdNYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhpZ2hlc3Rfdmlld19iaXQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMjsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHZpZXdfYml0cyA+PiBqKSAmIDEpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3Rfdmlld19iaXQgPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHJwY2ktPnBTdWJwYXNzZXNbaV0uY29sb3JBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2luZGV4ID0gcnBjaS0+cFN1YnBhc3Nlc1tpXS5wQ29sb3JBdHRhY2htZW50c1tqXS5hdHRhY2htZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9pbmRleCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJfY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRJbWFnZUluZm9zW2F0dGFjaG1lbnRfaW5kZXhdLmxheWVyQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXJfY291bnQgPD0gaGlnaGVzdF92aWV3X2JpdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDMxOTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBhdHRhY2htZW50IGluZm8gJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSBzcGVjaWZpZXMgJXUgbGF5ZXJzLCBidXQgdGhlIHZpZXcgbWFzayBmb3Igc3VicGFzcyAldSBpbiByZW5kZXJQYXNzICglcykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZXMgbGF5ZXIgJXUsIHdpdGggdGhhdCBhdHRhY2htZW50IHNwZWNpZmllZCBhcyBhIGNvbG9yIGF0dGFjaG1lbnQgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9pbmRleCwgbGF5ZXJfY291bnQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENyZWF0ZUluZm8tPnJlbmRlclBhc3MpLmNfc3RyKCksIGhpZ2hlc3Rfdmlld19iaXQsIGopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChycGNpLT5wU3VicGFzc2VzW2ldLnBSZXNvbHZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfaW5kZXggPSBycGNpLT5wU3VicGFzc2VzW2ldLnBSZXNvbHZlQXR0YWNobWVudHNbal0uYXR0YWNobWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50X2luZGV4ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJfY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8tPnBBdHRhY2htZW50SW1hZ2VJbmZvc1thdHRhY2htZW50X2luZGV4XS5sYXllckNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXllcl9jb3VudCA8PSBoaWdoZXN0X3ZpZXdfYml0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAzMTk4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGF0dGFjaG1lbnQgaW5mbyAldSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSBzcGVjaWZpZXMgJXUgbGF5ZXJzLCBidXQgdGhlIHZpZXcgbWFzayBmb3Igc3VicGFzcyAldSBpbiByZW5kZXJQYXNzICglcykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVzIGxheWVyICV1LCB3aXRoIHRoYXQgYXR0YWNobWVudCBzcGVjaWZpZWQgYXMgYSByZXNvbHZlIGF0dGFjaG1lbnQgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfaW5kZXgsIGxheWVyX2NvdW50LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcykuY19zdHIoKSwgaGlnaGVzdF92aWV3X2JpdCwgaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHJwY2ktPnBTdWJwYXNzZXNbaV0uaW5wdXRBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2luZGV4ID0gcnBjaS0+cFN1YnBhc3Nlc1tpXS5wSW5wdXRBdHRhY2htZW50c1tqXS5hdHRhY2htZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9pbmRleCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJfY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRJbWFnZUluZm9zW2F0dGFjaG1lbnRfaW5kZXhdLmxheWVyQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXJfY291bnQgPD0gaGlnaGVzdF92aWV3X2JpdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDMxOTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBhdHRhY2htZW50IGluZm8gJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSBzcGVjaWZpZXMgJXUgbGF5ZXJzLCBidXQgdGhlIHZpZXcgbWFzayBmb3Igc3VicGFzcyAldSBpbiByZW5kZXJQYXNzICglcykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZXMgbGF5ZXIgJXUsIHdpdGggdGhhdCBhdHRhY2htZW50IHNwZWNpZmllZCBhcyBhbiBpbnB1dCBhdHRhY2htZW50ICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfaW5kZXgsIGxheWVyX2NvdW50LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDcmVhdGVJbmZvLT5yZW5kZXJQYXNzKS5jX3N0cigpLCBoaWdoZXN0X3ZpZXdfYml0LCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChycGNpLT5wU3VicGFzc2VzW2ldLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9pbmRleCA9IHJwY2ktPnBTdWJwYXNzZXNbaV0ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50X2luZGV4ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXllcl9jb3VudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLT5wQXR0YWNobWVudEltYWdlSW5mb3NbYXR0YWNobWVudF9pbmRleF0ubGF5ZXJDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXllcl9jb3VudCA8PSBoaWdoZXN0X3ZpZXdfYml0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDcmVhdGVJbmZvLT5yZW5kZXJQYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMzE5OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGF0dGFjaG1lbnQgaW5mbyAldSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IHNwZWNpZmllcyAldSBsYXllcnMsIGJ1dCB0aGUgdmlldyBtYXNrIGZvciBzdWJwYXNzICV1IGluIHJlbmRlclBhc3MgKCVzKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlcyBsYXllciAldSwgd2l0aCB0aGF0IGF0dGFjaG1lbnQgc3BlY2lmaWVkIGFzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfaW5kZXgsIGxheWVyX2NvdW50LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDcmVhdGVJbmZvLT5yZW5kZXJQYXNzKS5jX3N0cigpLCBoaWdoZXN0X3ZpZXdfYml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZGVwdGhfc3RlbmNpbF9yZXNvbHZlICYmIHBEZXB0aFN0ZW5jaWxSZXNvbHZlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXB0aFN0ZW5jaWxSZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9pbmRleCA9IHBEZXB0aFN0ZW5jaWxSZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtPmF0dGFjaG1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9pbmRleCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxheWVyX2NvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLT5wQXR0YWNobWVudEltYWdlSW5mb3NbYXR0YWNobWVudF9pbmRleF0ubGF5ZXJDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXJfY291bnQgPD0gaGlnaGVzdF92aWV3X2JpdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENyZWF0ZUluZm8tPnJlbmRlclBhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMzE5OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBhdHRhY2htZW50IGluZm8gJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgc3BlY2lmaWVzICV1IGxheWVycywgYnV0IHRoZSB2aWV3IG1hc2sgZm9yIHN1YnBhc3MgJXUgaW4gcmVuZGVyUGFzcyAoJXMpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlcyBsYXllciAldSwgd2l0aCB0aGF0IGF0dGFjaG1lbnQgc3BlY2lmaWVkIGFzIGEgZGVwdGgvc3RlbmNpbCByZXNvbHZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRhY2htZW50LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2luZGV4LCBsYXllcl9jb3VudCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENyZWF0ZUluZm8tPnJlbmRlclBhc3MpLmNfc3RyKCksIGhpZ2hlc3Rfdmlld19iaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgY29ycmVjdCBhdHRhY2htZW50IHVzYWdlIGZsYWdzCisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBzdWJwYXNzID0gMDsgc3VicGFzcyA8IHJwY2ktPnN1YnBhc3NDb3VudDsgc3VicGFzcysrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBpbnB1dCBhdHRhY2htZW50czoKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBNYXRjaFVzYWdlKHJwY2ktPnBTdWJwYXNzZXNbc3VicGFzc10uaW5wdXRBdHRhY2htZW50Q291bnQsIHJwY2ktPnBTdWJwYXNzZXNbc3VicGFzc10ucElucHV0QXR0YWNobWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4NzkiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IGNvbG9yIGF0dGFjaG1lbnRzOgorICAgICAgICAgICAgICAgICAgICBza2lwIHw9IE1hdGNoVXNhZ2UocnBjaS0+cFN1YnBhc3Nlc1tzdWJwYXNzXS5jb2xvckF0dGFjaG1lbnRDb3VudCwgcnBjaS0+cFN1YnBhc3Nlc1tzdWJwYXNzXS5wQ29sb3JBdHRhY2htZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg3NyIpOworICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50czoKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hVc2FnZSgxLCBycGNpLT5wU3VicGFzc2VzW3N1YnBhc3NdLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNjMzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFZlcmlmeSBGQiBkaW1lbnNpb25zIGFyZSB3aXRoaW4gcGh5c2ljYWwgZGV2aWNlIGxpbWl0cworICAgIGlmIChwQ3JlYXRlSW5mby0+d2lkdGggPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RnJhbWVidWZmZXJXaWR0aCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby13aWR0aC0wMDg4NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBSZXF1ZXN0ZWQgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gd2lkdGggZXhjZWVkcyBwaHlzaWNhbCBkZXZpY2UgbGltaXRzLiBSZXF1ZXN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoOiAldSwgZGV2aWNlIG1heDogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+d2lkdGgsIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhGcmFtZWJ1ZmZlcldpZHRoKTsKKyAgICB9CisgICAgaWYgKHBDcmVhdGVJbmZvLT5oZWlnaHQgPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RnJhbWVidWZmZXJIZWlnaHQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8taGVpZ2h0LTAwODg4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFJlcXVlc3RlZCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBoZWlnaHQgZXhjZWVkcyBwaHlzaWNhbCBkZXZpY2UgbGltaXRzLiBSZXF1ZXN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodDogJXUsIGRldmljZSBtYXg6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPmhlaWdodCwgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heEZyYW1lYnVmZmVySGVpZ2h0KTsKKyAgICB9CisgICAgaWYgKHBDcmVhdGVJbmZvLT5sYXllcnMgPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4RnJhbWVidWZmZXJMYXllcnMpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tbGF5ZXJzLTAwODkwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFJlcXVlc3RlZCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBsYXllcnMgZXhjZWVkcyBwaHlzaWNhbCBkZXZpY2UgbGltaXRzLiBSZXF1ZXN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImxheWVyczogJXUsIGRldmljZSBtYXg6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPmxheWVycywgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heEZyYW1lYnVmZmVyTGF5ZXJzKTsKKyAgICB9CisgICAgLy8gVmVyaWZ5IEZCIGRpbWVuc2lvbnMgYXJlIGdyZWF0ZXIgdGhhbiB6ZXJvCisgICAgaWYgKHBDcmVhdGVJbmZvLT53aWR0aCA8PSAwKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXdpZHRoLTAwODg1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFJlcXVlc3RlZCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyB3aWR0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOworICAgIH0KKyAgICBpZiAocENyZWF0ZUluZm8tPmhlaWdodCA8PSAwKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWhlaWdodC0wMDg4NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVGcmFtZWJ1ZmZlcigpOiBSZXF1ZXN0ZWQgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gaGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CisgICAgfQorICAgIGlmIChwQ3JlYXRlSW5mby0+bGF5ZXJzIDw9IDApIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tbGF5ZXJzLTAwODg5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUZyYW1lYnVmZmVyKCk6IFJlcXVlc3RlZCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBsYXllcnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtGcmFtZWJ1ZmZlciAqcEZyYW1lYnVmZmVyKSBjb25zdCB7CisgICAgLy8gVE9ETyA6IFZlcmlmeSB0aGF0IHJlbmRlclBhc3MgRkIgaXMgY3JlYXRlZCB3aXRoIGlzIGNvbXBhdGlibGUgd2l0aCBGQgorICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVGcmFtZWJ1ZmZlckNyZWF0ZUluZm8ocENyZWF0ZUluZm8pOworICAgIHJldHVybiBza2lwOworfQorCitzdGF0aWMgYm9vbCBGaW5kRGVwZW5kZW5jeShjb25zdCB1aW50MzJfdCBpbmRleCwgY29uc3QgdWludDMyX3QgZGVwZW5kZW50LCBjb25zdCBzdGQ6OnZlY3RvcjxEQUdOb2RlPiAmc3VicGFzc190b19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiAmcHJvY2Vzc2VkX25vZGVzKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhpcyBub2RlIHdlIGhhdmUgbm90IGZvdW5kIGEgZGVwZW5kZW5jeSBwYXRoIHNvIHJldHVybiBmYWxzZS4KKyAgICBpZiAocHJvY2Vzc2VkX25vZGVzLmNvdW50KGluZGV4KSkgcmV0dXJuIGZhbHNlOworICAgIHByb2Nlc3NlZF9ub2Rlcy5pbnNlcnQoaW5kZXgpOworICAgIGNvbnN0IERBR05vZGUgJm5vZGUgPSBzdWJwYXNzX3RvX25vZGVbaW5kZXhdOworICAgIC8vIExvb2sgZm9yIGEgZGVwZW5kZW5jeSBwYXRoLiBJZiBvbmUgZXhpc3RzIHJldHVybiB0cnVlIGVsc2UgcmVjdXJzZSBvbiB0aGUgcHJldmlvdXMgbm9kZXMuCisgICAgaWYgKHN0ZDo6ZmluZChub2RlLnByZXYuYmVnaW4oKSwgbm9kZS5wcmV2LmVuZCgpLCBkZXBlbmRlbnQpID09IG5vZGUucHJldi5lbmQoKSkgeworICAgICAgICBmb3IgKGF1dG8gZWxlbSA6IG5vZGUucHJldikgeworICAgICAgICAgICAgaWYgKEZpbmREZXBlbmRlbmN5KGVsZW0sIGRlcGVuZGVudCwgc3VicGFzc190b19ub2RlLCBwcm9jZXNzZWRfbm9kZXMpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6SXNJbWFnZUxheW91dFJlYWRPbmx5KFZrSW1hZ2VMYXlvdXQgbGF5b3V0KSBjb25zdCB7CisgICAgaWYgKChsYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwpIHx8IChsYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCkgfHwKKyAgICAgICAgKGxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMKSB8fAorICAgICAgICAobGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6Q2hlY2tEZXBlbmRlbmN5RXhpc3RzKGNvbnN0IHVpbnQzMl90IHN1YnBhc3MsIGNvbnN0IFZrSW1hZ2VMYXlvdXQgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3VicGFzc0xheW91dD4gJmRlcGVuZGVudF9zdWJwYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxEQUdOb2RlPiAmc3VicGFzc190b19ub2RlLCBib29sICZza2lwKSBjb25zdCB7CisgICAgYm9vbCByZXN1bHQgPSB0cnVlOworICAgIGJvb2wgYkltYWdlTGF5b3V0UmVhZE9ubHkgPSBJc0ltYWdlTGF5b3V0UmVhZE9ubHkobGF5b3V0KTsKKyAgICAvLyBMb29wIHRocm91Z2ggYWxsIHN1YnBhc3NlcyB0aGF0IHNoYXJlIHRoZSBzYW1lIGF0dGFjaG1lbnQgYW5kIG1ha2Ugc3VyZSBhIGRlcGVuZGVuY3kgZXhpc3RzCisgICAgZm9yICh1aW50MzJfdCBrID0gMDsgayA8IGRlcGVuZGVudF9zdWJwYXNzZXMuc2l6ZSgpOyArK2spIHsKKyAgICAgICAgY29uc3QgU3VicGFzc0xheW91dCAmc3AgPSBkZXBlbmRlbnRfc3VicGFzc2VzW2tdOworICAgICAgICBpZiAoc3VicGFzcyA9PSBzcC5pbmRleCkgY29udGludWU7CisgICAgICAgIGlmIChiSW1hZ2VMYXlvdXRSZWFkT25seSAmJiBJc0ltYWdlTGF5b3V0UmVhZE9ubHkoc3AubGF5b3V0KSkgY29udGludWU7CisKKyAgICAgICAgY29uc3QgREFHTm9kZSAmbm9kZSA9IHN1YnBhc3NfdG9fbm9kZVtzdWJwYXNzXTsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgc3BlY2lmaWVkIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgdHdvIG5vZGVzLiBJZiBvbmUgZXhpc3RzIHdlIGFyZSBkb25lLgorICAgICAgICBhdXRvIHByZXZfZWxlbSA9IHN0ZDo6ZmluZChub2RlLnByZXYuYmVnaW4oKSwgbm9kZS5wcmV2LmVuZCgpLCBzcC5pbmRleCk7CisgICAgICAgIGF1dG8gbmV4dF9lbGVtID0gc3RkOjpmaW5kKG5vZGUubmV4dC5iZWdpbigpLCBub2RlLm5leHQuZW5kKCksIHNwLmluZGV4KTsKKyAgICAgICAgaWYgKHByZXZfZWxlbSA9PSBub2RlLnByZXYuZW5kKCkgJiYgbmV4dF9lbGVtID09IG5vZGUubmV4dC5lbmQoKSkgeworICAgICAgICAgICAgLy8gSWYgbm8gZGVwZW5kZW5jeSBleGl0cyBhbiBpbXBsaWNpdCBkZXBlbmRlbmN5IHN0aWxsIG1pZ2h0LiBJZiBub3QsIHRocm93IGFuIGVycm9yLgorICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBwcm9jZXNzZWRfbm9kZXM7CisgICAgICAgICAgICBpZiAoIShGaW5kRGVwZW5kZW5jeShzdWJwYXNzLCBzcC5pbmRleCwgc3VicGFzc190b19ub2RlLCBwcm9jZXNzZWRfbm9kZXMpIHx8CisgICAgICAgICAgICAgICAgICBGaW5kRGVwZW5kZW5jeShzcC5pbmRleCwgc3VicGFzcywgc3VicGFzc190b19ub2RlLCBwcm9jZXNzZWRfbm9kZXMpKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFJlbmRlcnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIGRlcGVuZGVuY3kgYmV0d2VlbiBzdWJwYXNzZXMgJWQgYW5kICVkIG11c3QgZXhpc3QgYnV0IG9uZSBpcyBub3Qgc3BlY2lmaWVkLiIsIHN1YnBhc3MsIHNwLmluZGV4KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIENvcmVDaGVja3M6OkNoZWNrUHJlc2VydmVkKGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpwQ3JlYXRlSW5mbywgY29uc3QgaW50IGluZGV4LCBjb25zdCB1aW50MzJfdCBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxEQUdOb2RlPiAmc3VicGFzc190b19ub2RlLCBpbnQgZGVwdGgsIGJvb2wgJnNraXApIGNvbnN0IHsKKyAgICBjb25zdCBEQUdOb2RlICZub2RlID0gc3VicGFzc190b19ub2RlW2luZGV4XTsKKyAgICAvLyBJZiB0aGlzIG5vZGUgd3JpdGVzIHRvIHRoZSBhdHRhY2htZW50IHJldHVybiB0cnVlIGFzIG5leHQgbm9kZXMgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgYXR0YWNobWVudC4KKyAgICBjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgJnN1YnBhc3MgPSBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tpbmRleF07CisgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2pdLmF0dGFjaG1lbnQpIHJldHVybiB0cnVlOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgc3VicGFzcy5pbnB1dEF0dGFjaG1lbnRDb3VudDsgKytqKSB7CisgICAgICAgIGlmIChhdHRhY2htZW50ID09IHN1YnBhc3MucElucHV0QXR0YWNobWVudHNbal0uYXR0YWNobWVudCkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ICYmIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT0gc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgLy8gTG9vcCB0aHJvdWdoIHByZXZpb3VzIG5vZGVzIGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gd3JpdGUgdG8gdGhlIGF0dGFjaG1lbnQuCisgICAgZm9yIChhdXRvIGVsZW0gOiBub2RlLnByZXYpIHsKKyAgICAgICAgcmVzdWx0IHw9IENoZWNrUHJlc2VydmVkKHBDcmVhdGVJbmZvLCBlbGVtLCBhdHRhY2htZW50LCBzdWJwYXNzX3RvX25vZGUsIGRlcHRoICsgMSwgc2tpcCk7CisgICAgfQorICAgIC8vIElmIHRoZSBhdHRhY2htZW50IHdhcyB3cml0dGVuIHRvIGJ5IGEgcHJldmlvdXMgbm9kZSB0aGFuIHRoaXMgbm9kZSBuZWVkcyB0byBwcmVzZXJ2ZSBpdC4KKyAgICBpZiAocmVzdWx0ICYmIGRlcHRoID4gMCkgeworICAgICAgICBib29sIGhhc19wcmVzZXJ2ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHN1YnBhc3MucHJlc2VydmVBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICAgICAgaWYgKHN1YnBhc3MucFByZXNlcnZlQXR0YWNobWVudHNbal0gPT0gYXR0YWNobWVudCkgeworICAgICAgICAgICAgICAgIGhhc19wcmVzZXJ2ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaGFzX3ByZXNlcnZlZCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRSZW5kZXJwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRhY2htZW50ICVkIGlzIHVzZWQgYnkgYSBsYXRlciBzdWJwYXNzIGFuZCBtdXN0IGJlIHByZXNlcnZlZCBpbiBzdWJwYXNzICVkLiIsIGF0dGFjaG1lbnQsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgSXNSYW5nZU92ZXJsYXBwaW5nKFQgb2Zmc2V0MSwgVCBzaXplMSwgVCBvZmZzZXQyLCBUIHNpemUyKSB7CisgICAgcmV0dXJuICgoKG9mZnNldDEgKyBzaXplMSkgPiBvZmZzZXQyKSAmJiAoKG9mZnNldDEgKyBzaXplMSkgPCAob2Zmc2V0MiArIHNpemUyKSkpIHx8CisgICAgICAgICAgICgob2Zmc2V0MSA+IG9mZnNldDIpICYmIChvZmZzZXQxIDwgKG9mZnNldDIgKyBzaXplMikpKTsKK30KKworYm9vbCBJc1JlZ2lvbk92ZXJsYXBwaW5nKFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlMSwgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UyKSB7CisgICAgcmV0dXJuIChJc1JhbmdlT3ZlcmxhcHBpbmcocmFuZ2UxLmJhc2VNaXBMZXZlbCwgcmFuZ2UxLmxldmVsQ291bnQsIHJhbmdlMi5iYXNlTWlwTGV2ZWwsIHJhbmdlMi5sZXZlbENvdW50KSAmJgorICAgICAgICAgICAgSXNSYW5nZU92ZXJsYXBwaW5nKHJhbmdlMS5iYXNlQXJyYXlMYXllciwgcmFuZ2UxLmxheWVyQ291bnQsIHJhbmdlMi5iYXNlQXJyYXlMYXllciwgcmFuZ2UyLmxheWVyQ291bnQpKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZURlcGVuZGVuY2llcyhGUkFNRUJVRkZFUl9TVEFURSBjb25zdCAqZnJhbWVidWZmZXIsIFJFTkRFUl9QQVNTX1NUQVRFIGNvbnN0ICpyZW5kZXJQYXNzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgYXV0byBjb25zdCBwRnJhbWVidWZmZXJJbmZvID0gZnJhbWVidWZmZXItPmNyZWF0ZUluZm8ucHRyKCk7CisgICAgYXV0byBjb25zdCBwQ3JlYXRlSW5mbyA9IHJlbmRlclBhc3MtPmNyZWF0ZUluZm8ucHRyKCk7CisgICAgYXV0byBjb25zdCAmc3VicGFzc190b19ub2RlID0gcmVuZGVyUGFzcy0+c3VicGFzc1RvTm9kZTsKKworICAgIHN0cnVjdCBBdHRhY2htZW50IHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U3VicGFzc0xheW91dD4gb3V0cHV0czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U3VicGFzc0xheW91dD4gaW5wdXRzOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gb3ZlcmxhcHBpbmc7CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPEF0dGFjaG1lbnQ+IGF0dGFjaG1lbnRzKHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQpOworCisgICAgLy8gRmluZCBvdmVybGFwcGluZyBhdHRhY2htZW50cworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gaSArIDE7IGogPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIFZrSW1hZ2VWaWV3IHZpZXdpID0gcEZyYW1lYnVmZmVySW5mby0+cEF0dGFjaG1lbnRzW2ldOworICAgICAgICAgICAgVmtJbWFnZVZpZXcgdmlld2ogPSBwRnJhbWVidWZmZXJJbmZvLT5wQXR0YWNobWVudHNbal07CisgICAgICAgICAgICBpZiAodmlld2kgPT0gdmlld2opIHsKKyAgICAgICAgICAgICAgICBhdHRhY2htZW50c1tpXS5vdmVybGFwcGluZy5lbXBsYWNlX2JhY2soaik7CisgICAgICAgICAgICAgICAgYXR0YWNobWVudHNbal0ub3ZlcmxhcHBpbmcuZW1wbGFjZV9iYWNrKGkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byB2aWV3X3N0YXRlX2kgPSBHZXRJbWFnZVZpZXdTdGF0ZSh2aWV3aSk7CisgICAgICAgICAgICBhdXRvIHZpZXdfc3RhdGVfaiA9IEdldEltYWdlVmlld1N0YXRlKHZpZXdqKTsKKyAgICAgICAgICAgIGlmICghdmlld19zdGF0ZV9pIHx8ICF2aWV3X3N0YXRlX2opIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gdmlld19jaV9pID0gdmlld19zdGF0ZV9pLT5jcmVhdGVfaW5mbzsKKyAgICAgICAgICAgIGF1dG8gdmlld19jaV9qID0gdmlld19zdGF0ZV9qLT5jcmVhdGVfaW5mbzsKKyAgICAgICAgICAgIGlmICh2aWV3X2NpX2kuaW1hZ2UgPT0gdmlld19jaV9qLmltYWdlICYmIElzUmVnaW9uT3ZlcmxhcHBpbmcodmlld19jaV9pLnN1YnJlc291cmNlUmFuZ2UsIHZpZXdfY2lfai5zdWJyZXNvdXJjZVJhbmdlKSkgeworICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzW2ldLm92ZXJsYXBwaW5nLmVtcGxhY2VfYmFjayhqKTsKKyAgICAgICAgICAgICAgICBhdHRhY2htZW50c1tqXS5vdmVybGFwcGluZy5lbXBsYWNlX2JhY2soaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGltYWdlX2RhdGFfaSA9IEdldEltYWdlU3RhdGUodmlld19jaV9pLmltYWdlKTsKKyAgICAgICAgICAgIGF1dG8gaW1hZ2VfZGF0YV9qID0gR2V0SW1hZ2VTdGF0ZSh2aWV3X2NpX2ouaW1hZ2UpOworICAgICAgICAgICAgaWYgKCFpbWFnZV9kYXRhX2kgfHwgIWltYWdlX2RhdGFfaikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltYWdlX2RhdGFfaS0+YmluZGluZy5tZW0gPT0gaW1hZ2VfZGF0YV9qLT5iaW5kaW5nLm1lbSAmJgorICAgICAgICAgICAgICAgIElzUmFuZ2VPdmVybGFwcGluZyhpbWFnZV9kYXRhX2ktPmJpbmRpbmcub2Zmc2V0LCBpbWFnZV9kYXRhX2ktPmJpbmRpbmcuc2l6ZSwgaW1hZ2VfZGF0YV9qLT5iaW5kaW5nLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZGF0YV9qLT5iaW5kaW5nLnNpemUpKSB7CisgICAgICAgICAgICAgICAgYXR0YWNobWVudHNbaV0ub3ZlcmxhcHBpbmcuZW1wbGFjZV9iYWNrKGopOworICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzW2pdLm92ZXJsYXBwaW5nLmVtcGxhY2VfYmFjayhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGaW5kIGZvciBlYWNoIGF0dGFjaG1lbnQgdGhlIHN1YnBhc3NlcyB0aGF0IHVzZSB0aGVtLgorICAgIHVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IGF0dGFjaG1lbnRJbmRpY2VzOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICZzdWJwYXNzID0gcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbaV07CisgICAgICAgIGF0dGFjaG1lbnRJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLmlucHV0QXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGF0dGFjaG1lbnQgPSBzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmF0dGFjaG1lbnQ7CisgICAgICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgY29udGludWU7CisgICAgICAgICAgICBTdWJwYXNzTGF5b3V0IHNwID0ge2ksIHN1YnBhc3MucElucHV0QXR0YWNobWVudHNbal0ubGF5b3V0fTsKKyAgICAgICAgICAgIGF0dGFjaG1lbnRzW2F0dGFjaG1lbnRdLmlucHV0cy5lbXBsYWNlX2JhY2soc3ApOworICAgICAgICAgICAgZm9yIChhdXRvIG92ZXJsYXBwaW5nX2F0dGFjaG1lbnQgOiBhdHRhY2htZW50c1thdHRhY2htZW50XS5vdmVybGFwcGluZykgeworICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzW292ZXJsYXBwaW5nX2F0dGFjaG1lbnRdLmlucHV0cy5lbXBsYWNlX2JhY2soc3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGF0dGFjaG1lbnQgPSBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2pdLmF0dGFjaG1lbnQ7CisgICAgICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgY29udGludWU7CisgICAgICAgICAgICBTdWJwYXNzTGF5b3V0IHNwID0ge2ksIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0ubGF5b3V0fTsKKyAgICAgICAgICAgIGF0dGFjaG1lbnRzW2F0dGFjaG1lbnRdLm91dHB1dHMuZW1wbGFjZV9iYWNrKHNwKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBvdmVybGFwcGluZ19hdHRhY2htZW50IDogYXR0YWNobWVudHNbYXR0YWNobWVudF0ub3ZlcmxhcHBpbmcpIHsKKyAgICAgICAgICAgICAgICBhdHRhY2htZW50c1tvdmVybGFwcGluZ19hdHRhY2htZW50XS5vdXRwdXRzLmVtcGxhY2VfYmFjayhzcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRhY2htZW50SW5kaWNlcy5pbnNlcnQoYXR0YWNobWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgJiYgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgdWludDMyX3QgYXR0YWNobWVudCA9IHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQ7CisgICAgICAgICAgICBTdWJwYXNzTGF5b3V0IHNwID0ge2ksIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dH07CisgICAgICAgICAgICBhdHRhY2htZW50c1thdHRhY2htZW50XS5vdXRwdXRzLmVtcGxhY2VfYmFjayhzcCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gb3ZlcmxhcHBpbmdfYXR0YWNobWVudCA6IGF0dGFjaG1lbnRzW2F0dGFjaG1lbnRdLm92ZXJsYXBwaW5nKSB7CisgICAgICAgICAgICAgICAgYXR0YWNobWVudHNbb3ZlcmxhcHBpbmdfYXR0YWNobWVudF0ub3V0cHV0cy5lbXBsYWNlX2JhY2soc3ApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXR0YWNobWVudEluZGljZXMuY291bnQoYXR0YWNobWVudCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFJlbmRlcnBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCB1c2Ugc2FtZSBhdHRhY2htZW50ICgldSkgYXMgYm90aCBjb2xvciBhbmQgZGVwdGggb3V0cHV0IGluIHNhbWUgc3VicGFzcyAoJXUpLiIsIGF0dGFjaG1lbnQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIElmIHRoZXJlIGlzIGEgZGVwZW5kZW5jeSBuZWVkZWQgbWFrZSBzdXJlIG9uZSBleGlzdHMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPnN1YnBhc3NDb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiAmc3VicGFzcyA9IHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW2ldOworICAgICAgICAvLyBJZiB0aGUgYXR0YWNobWVudCBpcyBhbiBpbnB1dCB0aGVuIGFsbCBzdWJwYXNzZXMgdGhhdCBvdXRwdXQgbXVzdCBoYXZlIGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHN1YnBhc3MuaW5wdXRBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICAgICAgdWludDMyX3QgYXR0YWNobWVudCA9IHN1YnBhc3MucElucHV0QXR0YWNobWVudHNbal0uYXR0YWNobWVudDsKKyAgICAgICAgICAgIGlmIChhdHRhY2htZW50ID09IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSBjb250aW51ZTsKKyAgICAgICAgICAgIENoZWNrRGVwZW5kZW5jeUV4aXN0cyhpLCBzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmxheW91dCwgYXR0YWNobWVudHNbYXR0YWNobWVudF0ub3V0cHV0cywgc3VicGFzc190b19ub2RlLCBza2lwKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aGUgYXR0YWNobWVudCBpcyBhbiBvdXRwdXQgdGhlbiBhbGwgc3VicGFzc2VzIHRoYXQgdXNlIHRoZSBhdHRhY2htZW50IG11c3QgaGF2ZSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwCisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGF0dGFjaG1lbnQgPSBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2pdLmF0dGFjaG1lbnQ7CisgICAgICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgY29udGludWU7CisgICAgICAgICAgICBDaGVja0RlcGVuZGVuY3lFeGlzdHMoaSwgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXS5sYXlvdXQsIGF0dGFjaG1lbnRzW2F0dGFjaG1lbnRdLm91dHB1dHMsIHN1YnBhc3NfdG9fbm9kZSwgc2tpcCk7CisgICAgICAgICAgICBDaGVja0RlcGVuZGVuY3lFeGlzdHMoaSwgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXS5sYXlvdXQsIGF0dGFjaG1lbnRzW2F0dGFjaG1lbnRdLmlucHV0cywgc3VicGFzc190b19ub2RlLCBza2lwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCAmJiBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAmYXR0YWNobWVudCA9IHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQ7CisgICAgICAgICAgICBDaGVja0RlcGVuZGVuY3lFeGlzdHMoaSwgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+bGF5b3V0LCBhdHRhY2htZW50c1thdHRhY2htZW50XS5vdXRwdXRzLCBzdWJwYXNzX3RvX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCk7CisgICAgICAgICAgICBDaGVja0RlcGVuZGVuY3lFeGlzdHMoaSwgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+bGF5b3V0LCBhdHRhY2htZW50c1thdHRhY2htZW50XS5pbnB1dHMsIHN1YnBhc3NfdG9fbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBMb29wIHRocm91Z2ggaW1wbGljaXQgZGVwZW5kZW5jaWVzLCBpZiB0aGlzIHBhc3MgcmVhZHMgbWFrZSBzdXJlIHRoZSBhdHRhY2htZW50IGlzIHByZXNlcnZlZCBmb3IgYWxsIHBhc3NlcyBhZnRlciBpdCB3YXMKKyAgICAvLyB3cml0dGVuLgorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICZzdWJwYXNzID0gcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbaV07CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLmlucHV0QXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIENoZWNrUHJlc2VydmVkKHBDcmVhdGVJbmZvLCBpLCBzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdLmF0dGFjaG1lbnQsIHN1YnBhc3NfdG9fbm9kZSwgMCwgc2tpcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVSZW5kZXJQYXNzREFHKFJlbmRlclBhc3NDcmVhdGVWZXJzaW9uIHJwX3ZlcnNpb24sIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpwQ3JlYXRlSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIgKnZ1aWQ7CisgICAgY29uc3QgYm9vbCB1c2VfcnAyID0gKHJwX3ZlcnNpb24gPT0gUkVOREVSX1BBU1NfVkVSU0lPTl8yKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZGVwZW5kZW5jeUNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIgJmRlcGVuZGVuY3kgPSBwQ3JlYXRlSW5mby0+cERlcGVuZGVuY2llc1tpXTsKKyAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgbGF0ZXN0X3NyY19zdGFnZSA9IEdldExvZ2ljYWxseUxhdGVzdEdyYXBoaWNzUGlwZWxpbmVTdGFnZShkZXBlbmRlbmN5LnNyY1N0YWdlTWFzayk7CisgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIGVhcmxpZXN0X2RzdF9zdGFnZSA9IEdldExvZ2ljYWxseUVhcmxpZXN0R3JhcGhpY3NQaXBlbGluZVN0YWdlKGRlcGVuZGVuY3kuZHN0U3RhZ2VNYXNrKTsKKworICAgICAgICAvLyBUaGUgZmlyc3Qgc3VicGFzcyBoZXJlIHNlcnZlcyBhcyBhIGdvb2QgcHJveHkgZm9yICJpcyBtdWx0aXZpZXcgZW5hYmxlZCIgLSBzaW5jZSBhbGwgdmlldyBtYXNrcyBuZWVkIHRvIGJlIG5vbi16ZXJvIGlmCisgICAgICAgIC8vIGFueSBhcmUsIHdoaWNoIGVuYWJsZXMgbXVsdGl2aWV3LgorICAgICAgICBpZiAodXNlX3JwMiAmJiAoZGVwZW5kZW5jeS5kZXBlbmRlbmN5RmxhZ3MgJiBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUKSAmJiAocENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbMF0udmlld01hc2sgPT0gMCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi12aWV3TWFzay0wMzA1OSIsCisgICAgICAgICAgICAgICAgIkRlcGVuZGVuY3kgJXUgc3BlY2lmaWVzIHRoZSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklULCBidXQgbXVsdGl2aWV3IGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIHJlbmRlciBwYXNzLiIsIGkpOworICAgICAgICB9IGVsc2UgaWYgKHVzZV9ycDIgJiYgIShkZXBlbmRlbmN5LmRlcGVuZGVuY3lGbGFncyAmIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQpICYmIGRlcGVuZGVuY3kudmlld09mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZGVwZW5kZW5jeUZsYWdzLTAzMDkyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVwZW5kZW5jeSAldSBzcGVjaWZpZXMgdGhlIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQsIGJ1dCBhbHNvIHNwZWNpZmllcyBhIHZpZXcgb2Zmc2V0IG9mICV1LiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS52aWV3T2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIGlmIChkZXBlbmRlbmN5LnNyY1N1YnBhc3MgPT0gVktfU1VCUEFTU19FWFRFUk5BTCB8fCBkZXBlbmRlbmN5LmRzdFN1YnBhc3MgPT0gVktfU1VCUEFTU19FWFRFUk5BTCkgeworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kuc3JjU3VicGFzcyA9PSBkZXBlbmRlbmN5LmRzdFN1YnBhc3MpIHsKKyAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N1YnBhc3MtMDMwODUiIDogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY1IjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc3JjIGFuZCBkc3Qgc3VicGFzc2VzIGluIGRlcGVuZGVuY3kgJXUgYXJlIGJvdGggZXh0ZXJuYWwuIiwgaSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kuZGVwZW5kZW5jeUZsYWdzICYgVktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVCkgeworICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LnNyY1N1YnBhc3MgPT0gVktfU1VCUEFTU19FWFRFUk5BTCkgeworICAgICAgICAgICAgICAgICAgICB2dWlkID0gIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kZXBlbmRlbmN5RmxhZ3MtMDI1MjAiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBkZXBlbmRlbmN5LmRzdFN1YnBhc3MgPT0gVktfU1VCUEFTU19FWFRFUk5BTAorICAgICAgICAgICAgICAgICAgICB2dWlkID0gIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kZXBlbmRlbmN5RmxhZ3MtMDI1MjEiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodXNlX3JwMikgeworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgcmVuZGVyIHBhc3MgMiBkaXN0aW5ndWlzaGVzIGJldHdlZW4gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBleHRlcm5hbCBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LnNyY1N1YnBhc3MgPT0gVktfU1VCUEFTU19FWFRFUk5BTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdnVpZCA9ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRlcGVuZGVuY3lGbGFncy0wMzA5MCI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2dWlkID0gIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZGVwZW5kZW5jeUZsYWdzLTAzMDkxIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlcGVuZGVuY3kgJXUgc3BlY2lmaWVzIGFuIGV4dGVybmFsIGRlcGVuZGVuY3kgYnV0IGFsc28gc3BlY2lmaWVzIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQuIiwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGVwZW5kZW5jeS5zcmNTdWJwYXNzID4gZGVwZW5kZW5jeS5kc3RTdWJwYXNzKSB7CisgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N1YnBhc3MtMDMwODQiIDogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY0IjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVwZW5kZW5jeSAldSBzcGVjaWZpZXMgYSBkZXBlbmRlbmN5IGZyb20gYSBsYXRlciBzdWJwYXNzICgldSkgdG8gYW4gZWFybGllciBzdWJwYXNzICgldSksIHdoaWNoIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzYWxsb3dlZCB0byBwcmV2ZW50IGN5Y2xpYyBkZXBlbmRlbmNpZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkZXBlbmRlbmN5LnNyY1N1YnBhc3MsIGRlcGVuZGVuY3kuZHN0U3VicGFzcyk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVwZW5kZW5jeS5zcmNTdWJwYXNzID09IGRlcGVuZGVuY3kuZHN0U3VicGFzcykgeworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kudmlld09mZnNldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUmVuZGVycGFzcyA6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5MzAiOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlcGVuZGVuY3kgJXUgc3BlY2lmaWVzIGEgc2VsZi1kZXBlbmRlbmN5IGJ1dCBoYXMgYSBub24temVybyB2aWV3IG9mZnNldCBvZiAldSIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kudmlld09mZnNldCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChkZXBlbmRlbmN5LmRlcGVuZGVuY3lGbGFncyB8IFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQpICE9IGRlcGVuZGVuY3kuZGVwZW5kZW5jeUZsYWdzICYmCisgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW2RlcGVuZGVuY3kuc3JjU3VicGFzc10udmlld01hc2sgPiAxKSB7CisgICAgICAgICAgICAgICAgdnVpZCA9CisgICAgICAgICAgICAgICAgICAgIHVzZV9ycDIgPyAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLTAzMDYwIiA6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3VicGFzcy0wMDg3MiI7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVwZW5kZW5jeSAldSBzcGVjaWZpZXMgYSBzZWxmLWRlcGVuZGVuY3kgZm9yIHN1YnBhc3MgJXUgd2l0aCBhIG5vbi16ZXJvIHZpZXcgbWFzaywgYnV0IGRvZXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZnkgVktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkZXBlbmRlbmN5LnNyY1N1YnBhc3MpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoSGFzTm9uRnJhbWVidWZmZXJTdGFnZVBpcGVsaW5lU3RhZ2VGbGFncyhkZXBlbmRlbmN5LnNyY1N0YWdlTWFzaykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhc05vbkZyYW1lYnVmZmVyU3RhZ2VQaXBlbGluZVN0YWdlRmxhZ3MoZGVwZW5kZW5jeS5kc3RTdGFnZU1hc2spKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoR2V0R3JhcGhpY3NQaXBlbGluZVN0YWdlTG9naWNhbE9yZGluYWwobGF0ZXN0X3NyY19zdGFnZSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgR2V0R3JhcGhpY3NQaXBlbGluZVN0YWdlTG9naWNhbE9yZGluYWwoZWFybGllc3RfZHN0X3N0YWdlKSkpIHsKKyAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N1YnBhc3MtMDMwODciIDogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY3IjsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAiRGVwZW5kZW5jeSAldSBzcGVjaWZpZXMgYSBzZWxmLWRlcGVuZGVuY3kgZnJvbSBsb2dpY2FsbHktbGF0ZXIgc3RhZ2UgKCVzKSB0byBhIGxvZ2ljYWxseS1lYXJsaWVyIHN0YWdlICglcykuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgc3RyaW5nX1ZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzKGxhdGVzdF9zcmNfc3RhZ2UpLCBzdHJpbmdfVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMoZWFybGllc3RfZHN0X3N0YWdlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVBdHRhY2htZW50SW5kZXgoUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwgdWludDMyX3QgYXR0YWNobWVudCwgdWludDMyX3QgYXR0YWNobWVudF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGJvb2wgdXNlX3JwMiA9IChycF92ZXJzaW9uID09IFJFTkRFUl9QQVNTX1ZFUlNJT05fMik7CisgICAgY29uc3QgY2hhciAqY29uc3QgZnVuY3Rpb25fbmFtZSA9IHVzZV9ycDIgPyAidmtDcmVhdGVSZW5kZXJQYXNzMktIUigpIiA6ICJ2a0NyZWF0ZVJlbmRlclBhc3MoKSI7CisKKyAgICBpZiAoYXR0YWNobWVudCA+PSBhdHRhY2htZW50X2NvdW50ICYmIGF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqdnVpZCA9CisgICAgICAgICAgICB1c2VfcnAyID8gIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItYXR0YWNobWVudC0wMzA1MSIgOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLWF0dGFjaG1lbnQtMDA4MzQiOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIGF0dGFjaG1lbnQgJWQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiBhdHRhY2htZW50cyAlZC4iLCB0eXBlLCBmdW5jdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudCwgYXR0YWNobWVudF9jb3VudCk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitlbnVtIEF0dGFjaG1lbnRUeXBlIHsKKyAgICBBVFRBQ0hNRU5UX0NPTE9SID0gMSwKKyAgICBBVFRBQ0hNRU5UX0RFUFRIID0gMiwKKyAgICBBVFRBQ0hNRU5UX0lOUFVUID0gNCwKKyAgICBBVFRBQ0hNRU5UX1BSRVNFUlZFID0gOCwKKyAgICBBVFRBQ0hNRU5UX1JFU09MVkUgPSAxNiwKK307CisKK2NoYXIgY29uc3QgKlN0cmluZ0F0dGFjaG1lbnRUeXBlKHVpbnQ4X3QgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEFUVEFDSE1FTlRfQ09MT1I6CisgICAgICAgICAgICByZXR1cm4gImNvbG9yIjsKKyAgICAgICAgY2FzZSBBVFRBQ0hNRU5UX0RFUFRIOgorICAgICAgICAgICAgcmV0dXJuICJkZXB0aCI7CisgICAgICAgIGNhc2UgQVRUQUNITUVOVF9JTlBVVDoKKyAgICAgICAgICAgIHJldHVybiAiaW5wdXQiOworICAgICAgICBjYXNlIEFUVEFDSE1FTlRfUFJFU0VSVkU6CisgICAgICAgICAgICByZXR1cm4gInByZXNlcnZlIjsKKyAgICAgICAgY2FzZSBBVFRBQ0hNRU5UX1JFU09MVkU6CisgICAgICAgICAgICByZXR1cm4gInJlc29sdmUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICIobXVsdGlwbGUpIjsKKyAgICB9Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6QWRkQXR0YWNobWVudFVzZShSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCB1aW50MzJfdCBzdWJwYXNzLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYXR0YWNobWVudF91c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZrSW1hZ2VMYXlvdXQ+ICZhdHRhY2htZW50X2xheW91dHMsIHVpbnQzMl90IGF0dGFjaG1lbnQsIHVpbnQ4X3QgbmV3X3VzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IG5ld19sYXlvdXQpIGNvbnN0IHsKKyAgICBpZiAoYXR0YWNobWVudCA+PSBhdHRhY2htZW50X3VzZXMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7IC8qIG91dCBvZiByYW5nZSwgYnV0IGFscmVhZHkgcmVwb3J0ZWQgKi8KKworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGF1dG8gJnVzZXMgPSBhdHRhY2htZW50X3VzZXNbYXR0YWNobWVudF07CisgICAgY29uc3QgYm9vbCB1c2VfcnAyID0gKHJwX3ZlcnNpb24gPT0gUkVOREVSX1BBU1NfVkVSU0lPTl8yKTsKKyAgICBjb25zdCBjaGFyICp2dWlkOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGZ1bmN0aW9uX25hbWUgPSB1c2VfcnAyID8gInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoKSIgOiAidmtDcmVhdGVSZW5kZXJQYXNzKCkiOworCisgICAgaWYgKHVzZXMgJiBuZXdfdXNlKSB7CisgICAgICAgIGlmIChhdHRhY2htZW50X2xheW91dHNbYXR0YWNobWVudF0gIT0gbmV3X2xheW91dCkgeworICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItbGF5b3V0LTAyNTI4IiA6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWxheW91dC0wMjUxOSI7CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAiJXM6IHN1YnBhc3MgJXUgYWxyZWFkeSB1c2VzIGF0dGFjaG1lbnQgJXUgd2l0aCBhIGRpZmZlcmVudCBpbWFnZSBsYXlvdXQgKCVzIHZzICVzKS4iLCBmdW5jdGlvbl9uYW1lLCBzdWJwYXNzLAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LCBzdHJpbmdfVmtJbWFnZUxheW91dChhdHRhY2htZW50X2xheW91dHNbYXR0YWNobWVudF0pLCBzdHJpbmdfVmtJbWFnZUxheW91dChuZXdfbGF5b3V0KSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHVzZXMgJiB+QVRUQUNITUVOVF9JTlBVVCB8fCAodXNlcyAmJiAobmV3X3VzZSA9PSBBVFRBQ0hNRU5UX1JFU09MVkUgfHwgbmV3X3VzZSA9PSBBVFRBQ0hNRU5UX1BSRVNFUlZFKSkpIHsKKyAgICAgICAgLyogTm90ZTogaW5wdXQgYXR0YWNobWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgZG9uZSBmaXJzdC4gKi8KKyAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFByZXNlcnZlQXR0YWNobWVudHMtMDMwNzQiCisgICAgICAgICAgICAgICAgICAgICAgIDogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFByZXNlcnZlQXR0YWNobWVudHMtMDA4NTQiOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHN1YnBhc3MgJXUgdXNlcyBhdHRhY2htZW50ICV1IGFzIGJvdGggJXMgYW5kICVzIGF0dGFjaG1lbnQuIiwgZnVuY3Rpb25fbmFtZSwgc3VicGFzcywgYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0F0dGFjaG1lbnRUeXBlKHVzZXMpLCBTdHJpbmdBdHRhY2htZW50VHlwZShuZXdfdXNlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXR0YWNobWVudF9sYXlvdXRzW2F0dGFjaG1lbnRdID0gbmV3X2xheW91dDsKKyAgICAgICAgdXNlcyB8PSBuZXdfdXNlOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlUmVuZGVycGFzc0F0dGFjaG1lbnRVc2FnZShSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgKnBDcmVhdGVJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYm9vbCB1c2VfcnAyID0gKHJwX3ZlcnNpb24gPT0gUkVOREVSX1BBU1NfVkVSU0lPTl8yKTsKKyAgICBjb25zdCBjaGFyICp2dWlkOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGZ1bmN0aW9uX25hbWUgPSB1c2VfcnAyID8gInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoKSIgOiAidmtDcmVhdGVSZW5kZXJQYXNzKCkiOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgJnN1YnBhc3MgPSBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tpXTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXR0YWNobWVudF91c2VzKHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQpOworICAgICAgICBzdGQ6OnZlY3RvcjxWa0ltYWdlTGF5b3V0PiBhdHRhY2htZW50X2xheW91dHMocENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCk7CisKKyAgICAgICAgaWYgKHN1YnBhc3MucGlwZWxpbmVCaW5kUG9pbnQgIT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUykgeworICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcGlwZWxpbmVCaW5kUG9pbnQtMDMwNjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBpcGVsaW5lQmluZFBvaW50LTAwODQ0IjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFBpcGVsaW5lIGJpbmQgcG9pbnQgZm9yIHN1YnBhc3MgJWQgbXVzdCBiZSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLiIsIGZ1bmN0aW9uX25hbWUsIGkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHN1YnBhc3MuaW5wdXRBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICAgICAgYXV0byBjb25zdCAmYXR0YWNobWVudF9yZWYgPSBzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzW2pdOworICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQXR0YWNobWVudEluZGV4KHJwX3ZlcnNpb24sIGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQsIHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQsICJJbnB1dCIpOworCisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmLmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUKSB7CisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgdXNlX3JwMiA/IGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRSZW5kZXJwYXNzIDogIlZVSUQtVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UtYXNwZWN0TWFzay0wMTk2NCI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBBc3BlY3QgbWFzayBmb3IgaW5wdXQgYXR0YWNobWVudCByZWZlcmVuY2UgJWQgaW4gc3VicGFzcyAlZCBpbmNsdWRlcyBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklULiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLCBpLCBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9yZWYuYXR0YWNobWVudCA8IHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBBZGRBdHRhY2htZW50VXNlKHJwX3ZlcnNpb24sIGksIGF0dGFjaG1lbnRfdXNlcywgYXR0YWNobWVudF9sYXlvdXRzLCBhdHRhY2htZW50X3JlZi5hdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUQUNITUVOVF9JTlBVVCwgYXR0YWNobWVudF9yZWYubGF5b3V0KTsKKworICAgICAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/IGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRSZW5kZXJwYXNzIDogIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTk2MyI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbWFnZUFzcGVjdE1hc2soVktfTlVMTF9IQU5ETEUsIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudF9yZWYuYXR0YWNobWVudF0uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfcmVmLmFzcGVjdE1hc2ssIGZ1bmN0aW9uX25hbWUsIHZ1aWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChycF92ZXJzaW9uID09IFJFTkRFUl9QQVNTX1ZFUlNJT05fMikgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgdmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiBwYXJhbWV0ZXIgdmFsaWRhdGlvbiBmb3IgY3JlYXRlIHJlbmRlcnBhc3MgMQorICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGV5IGFyZSBpbiBhIHN0cnVjdCB0aGF0IG9ubHkgYXBwbGllcyB0byBpbnB1dCBhdHRhY2htZW50cyAtIG5vdCBzbyBmb3IgdjIuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmLmFzcGVjdE1hc2sgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1hdHRhY2htZW50LTAyODAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICBJbnB1dCBhdHRhY2htZW50ICglZCkgYXNwZWN0IG1hc2sgbXVzdCBub3QgYmUgMC4iLCBmdW5jdGlvbl9uYW1lLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VBc3BlY3RGbGFncyB2YWxpZF9iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUIHwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUIHwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUIHwgVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8wX0JJVF9FWFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzFfQklUX0VYVCB8IFZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfMl9CSVRfRVhUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8zX0JJVF9FWFQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdmFsaWQgYXNwZWN0IG1hc2sgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmLmFzcGVjdE1hc2sgJiB+dmFsaWRfYml0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWF0dGFjaG1lbnQtMDI3OTkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICBJbnB1dCBhdHRhY2htZW50ICglZCkgYXNwZWN0IG1hc2sgKDB4JSIgUFJJeDMyICIpaXMgaW52YWxpZC4iLCBmdW5jdGlvbl9uYW1lLCBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZi5hc3BlY3RNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLnByZXNlcnZlQXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGF0dGFjaG1lbnQgPSBzdWJwYXNzLnBQcmVzZXJ2ZUF0dGFjaG1lbnRzW2pdOworICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1hdHRhY2htZW50LTAzMDczIiA6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWF0dGFjaG1lbnQtMDA4NTMiOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAgUHJlc2VydmUgYXR0YWNobWVudCAoJWQpIG11c3Qgbm90IGJlIFZLX0FUVEFDSE1FTlRfVU5VU0VELiIsIGZ1bmN0aW9uX25hbWUsIGopOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQXR0YWNobWVudEluZGV4KHJwX3ZlcnNpb24sIGF0dGFjaG1lbnQsIHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQsICJQcmVzZXJ2ZSIpOworICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50IDwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IEFkZEF0dGFjaG1lbnRVc2UocnBfdmVyc2lvbiwgaSwgYXR0YWNobWVudF91c2VzLCBhdHRhY2htZW50X2xheW91dHMsIGF0dGFjaG1lbnQsIEFUVEFDSE1FTlRfUFJFU0VSVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0KDApIC8qIHByZXNlcnZlIGRvZXNuJ3QgaGF2ZSBhbnkgbGF5b3V0ICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIHN1YnBhc3NfcGVyZm9ybXNfcmVzb2x2ZSA9IGZhbHNlOworCisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIGlmIChzdWJwYXNzLnBSZXNvbHZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnN0ICZhdHRhY2htZW50X3JlZiA9IHN1YnBhc3MucFJlc29sdmVBdHRhY2htZW50c1tqXTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9yZWYuYXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlQXR0YWNobWVudEluZGV4KHJwX3ZlcnNpb24sIGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQsIHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQsICJSZXNvbHZlIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQgPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IEFkZEF0dGFjaG1lbnRVc2UocnBfdmVyc2lvbiwgaSwgYXR0YWNobWVudF91c2VzLCBhdHRhY2htZW50X2xheW91dHMsIGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUQUNITUVOVF9SRVNPTFZFLCBhdHRhY2htZW50X3JlZi5sYXlvdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXNzX3BlcmZvcm1zX3Jlc29sdmUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50X3JlZi5hdHRhY2htZW50XS5zYW1wbGVzICE9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBSZXNvbHZlQXR0YWNobWVudHMtMDMwNjciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAwODQ5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICBTdWJwYXNzICV1IHJlcXVlc3RzIG11bHRpc2FtcGxlIHJlc29sdmUgaW50byBhdHRhY2htZW50ICV1LCB3aGljaCBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhdmUgVktfU0FNUExFX0NPVU5UXzFfQklUIGJ1dCBoYXMgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSwgaSwgYXR0YWNobWVudF9yZWYuYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnRdLnNhbXBsZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSB7CisgICAgICAgICAgICBpZiAoc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVBdHRhY2htZW50SW5kZXgocnBfdmVyc2lvbiwgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQsICJEZXB0aCIpOworICAgICAgICAgICAgICAgIGlmIChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50IDwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IEFkZEF0dGFjaG1lbnRVc2UocnBfdmVyc2lvbiwgaSwgYXR0YWNobWVudF91c2VzLCBhdHRhY2htZW50X2xheW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50LCBBVFRBQ0hNRU5UX0RFUFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+bGF5b3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBsYXN0X3NhbXBsZV9jb3VudF9hdHRhY2htZW50ID0gVktfQVRUQUNITUVOVF9VTlVTRUQ7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIGF1dG8gY29uc3QgJmF0dGFjaG1lbnRfcmVmID0gc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tqXTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVBdHRhY2htZW50SW5kZXgocnBfdmVyc2lvbiwgYXR0YWNobWVudF9yZWYuYXR0YWNobWVudCwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCwgIkNvbG9yIik7CisgICAgICAgICAgICBpZiAoYXR0YWNobWVudF9yZWYuYXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCAmJiBhdHRhY2htZW50X3JlZi5hdHRhY2htZW50IDwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gQWRkQXR0YWNobWVudFVzZShycF92ZXJzaW9uLCBpLCBhdHRhY2htZW50X3VzZXMsIGF0dGFjaG1lbnRfbGF5b3V0cywgYXR0YWNobWVudF9yZWYuYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUQUNITUVOVF9DT0xPUiwgYXR0YWNobWVudF9yZWYubGF5b3V0KTsKKworICAgICAgICAgICAgICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyBjdXJyZW50X3NhbXBsZV9jb3VudCA9IHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudF9yZWYuYXR0YWNobWVudF0uc2FtcGxlczsKKyAgICAgICAgICAgICAgICBpZiAobGFzdF9zYW1wbGVfY291bnRfYXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgICAgICAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgbGFzdF9zYW1wbGVfY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2xhc3Rfc2FtcGxlX2NvdW50X2F0dGFjaG1lbnRdLmF0dGFjaG1lbnRdLnNhbXBsZXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3NhbXBsZV9jb3VudCAhPSBsYXN0X3NhbXBsZV9jb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcENvbG9yQXR0YWNobWVudHMtMDMwNjkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBDb2xvckF0dGFjaG1lbnRzLTAxNDE3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAgU3VicGFzcyAldSBhdHRlbXB0cyB0byByZW5kZXIgdG8gY29sb3IgYXR0YWNobWVudHMgd2l0aCBpbmNvbnNpc3RlbnQgc2FtcGxlIGNvdW50cy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29sb3IgYXR0YWNobWVudCByZWYgJXUgaGFzIHNhbXBsZSBjb3VudCAlcywgd2hlcmVhcyBwcmV2aW91cyBjb2xvciBhdHRhY2htZW50IHJlZiAldSBoYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZSBjb3VudCAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSwgaSwgaiwgc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhjdXJyZW50X3NhbXBsZV9jb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3NhbXBsZV9jb3VudF9hdHRhY2htZW50LCBzdHJpbmdfVmtTYW1wbGVDb3VudEZsYWdCaXRzKGxhc3Rfc2FtcGxlX2NvdW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF9zYW1wbGVfY291bnRfYXR0YWNobWVudCA9IGo7CisKKyAgICAgICAgICAgICAgICBpZiAoc3VicGFzc19wZXJmb3Jtc19yZXNvbHZlICYmIGN1cnJlbnRfc2FtcGxlX2NvdW50ID09IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCkgeworICAgICAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAzMDY2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NDgiOworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICBTdWJwYXNzICV1IHJlcXVlc3RzIG11bHRpc2FtcGxlIHJlc29sdmUgZnJvbSBhdHRhY2htZW50ICV1IHdoaWNoIGhhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU0FNUExFX0NPVU5UXzFfQklULiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLCBpLCBhdHRhY2htZW50X3JlZi5hdHRhY2htZW50KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCAmJiBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEICYmCisgICAgICAgICAgICAgICAgICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQgPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gZGVwdGhfc3RlbmNpbF9zYW1wbGVfY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50XS5zYW1wbGVzOworCisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19hbWRfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50X3JlZi5hdHRhY2htZW50XS5zYW1wbGVzID4gZGVwdGhfc3RlbmNpbF9zYW1wbGVfY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wQ29sb3JBdHRhY2htZW50cy0wMzA3MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBDb2xvckF0dGFjaG1lbnRzLTAxNTA2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICBTdWJwYXNzICV1IHBDb2xvckF0dGFjaG1lbnRzWyV1XSBoYXMgJXMgd2hpY2ggaXMgbGFyZ2VyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUsIGksIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa1NhbXBsZUNvdW50RmxhZ0JpdHMocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50X3JlZi5hdHRhY2htZW50XS5zYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhkZXB0aF9zdGVuY2lsX3NhbXBsZV9jb3VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19hbWRfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzICYmICFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NhbXBsZV9jb3VudCAhPSBkZXB0aF9zdGVuY2lsX3NhbXBsZV9jb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtMDMwNzEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LTAxNDE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICBTdWJwYXNzICV1IGF0dGVtcHRzIHRvIHJlbmRlciB0byB1c2UgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgd2l0aCBzYW1wbGUgY291bnQgdGhhdCBkaWZmZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBjb2xvciBhdHRhY2htZW50ICV1LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRlcHRoIGF0dGFjaG1lbnQgcmVmIGhhcyBzYW1wbGUgY291bnQgJXMsIHdoZXJlYXMgY29sb3IgYXR0YWNobWVudCByZWYgJXUgaGFzIHNhbXBsZSBjb3VudCAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUsIGksIGosIHN0cmluZ19Wa1NhbXBsZUNvdW50RmxhZ0JpdHMoZGVwdGhfc3RlbmNpbF9zYW1wbGVfY291bnQpLCBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa1NhbXBsZUNvdW50RmxhZ0JpdHMoY3VycmVudF9zYW1wbGVfY291bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3VicGFzc19wZXJmb3Jtc19yZXNvbHZlICYmIHN1YnBhc3MucFJlc29sdmVBdHRhY2htZW50c1tqXS5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEICYmCisgICAgICAgICAgICAgICAgc3VicGFzcy5wUmVzb2x2ZUF0dGFjaG1lbnRzW2pdLmF0dGFjaG1lbnQgPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQgPT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy0wMzA2NSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAwODQ3IjsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAgU3VicGFzcyAldSByZXF1ZXN0cyBtdWx0aXNhbXBsZSByZXNvbHZlIGZyb20gYXR0YWNobWVudCAldSB3aGljaCBoYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGFjaG1lbnQ9VktfQVRUQUNITUVOVF9VTlVTRUQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUsIGksIGF0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJmNvbG9yX2Rlc2MgPSBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRfcmVmLmF0dGFjaG1lbnRdOworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZyZXNvbHZlX2Rlc2MgPSBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW3N1YnBhc3MucFJlc29sdmVBdHRhY2htZW50c1tqXS5hdHRhY2htZW50XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yX2Rlc2MuZm9ybWF0ICE9IHJlc29sdmVfZGVzYy5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBSZXNvbHZlQXR0YWNobWVudHMtMDMwNjgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NTAiOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICBTdWJwYXNzICV1IHBDb2xvckF0dGFjaG1lbnRzWyV1XSByZXNvbHZlcyB0byBhbiBhdHRhY2htZW50IHdpdGggYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlmZmVyZW50IGZvcm1hdC4gY29sb3IgZm9ybWF0OiAldSwgcmVzb2x2ZSBmb3JtYXQ6ICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLCBpLCBqLCBjb2xvcl9kZXNjLmZvcm1hdCwgcmVzb2x2ZV9kZXNjLmZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDcmVhdGVSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpwQ3JlYXRlSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGJvb2wgdXNlX3JwMiA9IChycF92ZXJzaW9uID09IFJFTkRFUl9QQVNTX1ZFUlNJT05fMik7CisgICAgY29uc3QgY2hhciAqdnVpZDsKKyAgICBjb25zdCBjaGFyICpjb25zdCBmdW5jdGlvbl9uYW1lID0gdXNlX3JwMiA/ICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKCkiIDogInZrQ3JlYXRlUmVuZGVyUGFzcygpIjsKKworICAgIC8vIFRPRE86IEFzIHBhcnQgb2Ygd3JhcHBpbmcgdXAgdGhlIG1lbV90cmFja2VyL2NvcmVfdmFsaWRhdGlvbiBtZXJnZSB0aGUgZm9sbG93aW5nIHJvdXRpbmUgc2hvdWxkIGJlIGNvbnNvbGlkYXRlZCB3aXRoCisgICAgLy8gICAgICAgVmFsaWRhdGVMYXlvdXRzLgorICAgIHNraXAgfD0gVmFsaWRhdGVSZW5kZXJwYXNzQXR0YWNobWVudFVzYWdlKHJwX3ZlcnNpb24sIHBDcmVhdGVJbmZvKTsKKworICAgIHNraXAgfD0gVmFsaWRhdGVSZW5kZXJQYXNzREFHKHJwX3ZlcnNpb24sIHBDcmVhdGVJbmZvKTsKKworICAgIC8vIFZhbGlkYXRlIG11bHRpdmlldyBjb3JyZWxhdGlvbiBhbmQgdmlldyBtYXNrcworICAgIGJvb2wgdmlld01hc2taZXJvID0gZmFsc2U7CisgICAgYm9vbCB2aWV3TWFza05vblplcm8gPSBmYWxzZTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICZzdWJwYXNzID0gcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbaV07CisgICAgICAgIGlmIChzdWJwYXNzLnZpZXdNYXNrICE9IDApIHsKKyAgICAgICAgICAgIHZpZXdNYXNrTm9uWmVybyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2aWV3TWFza1plcm8gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzdWJwYXNzLmZsYWdzICYgVktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19QT1NJVElPTl9YX09OTFlfQklUX05WWCkgIT0gMCAmJgorICAgICAgICAgICAgKHN1YnBhc3MuZmxhZ3MgJiBWS19TVUJQQVNTX0RFU0NSSVBUSU9OX1BFUl9WSUVXX0FUVFJJQlVURVNfQklUX05WWCkgPT0gMCkgeworICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItZmxhZ3MtMDMwNzYiIDogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tZmxhZ3MtMDA4NTYiOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVGhlIGZsYWdzIHBhcmFtZXRlciBvZiBzdWJwYXNzIGRlc2NyaXB0aW9uICV1IGluY2x1ZGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19QT1NJVElPTl9YX09OTFlfQklUX05WWCBidXQgZG9lcyBub3QgYWxzbyBpbmNsdWRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19BVFRSSUJVVEVTX0JJVF9OVlguIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChycF92ZXJzaW9uID09IFJFTkRFUl9QQVNTX1ZFUlNJT05fMikgeworICAgICAgICBpZiAodmlld01hc2tOb25aZXJvICYmIHZpZXdNYXNrWmVybykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXZpZXdNYXNrLTAzMDU4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFNvbWUgdmlldyBtYXNrcyBhcmUgbm9uLXplcm8gd2hpbHN0IG90aGVycyBhcmUgemVyby4iLCBmdW5jdGlvbl9uYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWV3TWFza1plcm8gJiYgcENyZWF0ZUluZm8tPmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50ICE9IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi12aWV3TWFzay0wMzA1NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBNdWx0aXZpZXcgaXMgbm90IGVuYWJsZWQgYnV0IGNvcnJlbGF0aW9uIG1hc2tzIGFyZSBzdGlsbCBwcm92aWRlZCIsIGZ1bmN0aW9uX25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQzMl90IGFnZ3JlZ2F0ZWRfY3ZtcyA9IDA7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5jb3JyZWxhdGVkVmlld01hc2tDb3VudDsgKytpKSB7CisgICAgICAgIGlmIChhZ2dyZWdhdGVkX2N2bXMgJiBwQ3JlYXRlSW5mby0+cENvcnJlbGF0ZWRWaWV3TWFza3NbaV0pIHsKKyAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcENvcnJlbGF0ZWRWaWV3TWFza3MtMDMwNTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8tcENvcnJlbGF0aW9uTWFza3MtMDA4NDEiOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcENvcnJlbGF0ZWRWaWV3TWFza3NbJXVdIGNvbnRhaW5zIGEgcHJldmlvdXNseSBhcHBlYXJpbmcgdmlldyBiaXQuIiwgZnVuY3Rpb25fbmFtZSwgaSk7CisgICAgICAgIH0KKyAgICAgICAgYWdncmVnYXRlZF9jdm1zIHw9IHBDcmVhdGVJbmZvLT5wQ29ycmVsYXRlZFZpZXdNYXNrc1tpXTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmRlcGVuZGVuY3lDb3VudDsgKytpKSB7CisgICAgICAgIGF1dG8gY29uc3QgJmRlcGVuZGVuY3kgPSBwQ3JlYXRlSW5mby0+cERlcGVuZGVuY2llc1tpXTsKKyAgICAgICAgaWYgKHJwX3ZlcnNpb24gPT0gUkVOREVSX1BBU1NfVkVSU0lPTl8yKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlU3RhZ2VNYXNrR3NUc0VuYWJsZXMoCisgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5zcmNTdGFnZU1hc2ssIGZ1bmN0aW9uX25hbWUsICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay0wMzA4MCIsCisgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLTAzMDgyIiwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLTAyMTAzIiwKKyAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdGFnZU1hc2stMDIxMDQiKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVTdGFnZU1hc2tHc1RzRW5hYmxlcygKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LmRzdFN0YWdlTWFzaywgZnVuY3Rpb25fbmFtZSwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLTAzMDgxIiwKKyAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDMwODMiLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDIxMDUiLAorICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRzdFN0YWdlTWFzay0wMjEwNiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVN0YWdlTWFza0dzVHNFbmFibGVzKAorICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kuc3JjU3RhZ2VNYXNrLCBmdW5jdGlvbl9uYW1lLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N0YWdlTWFzay0wMDg2MCIsCisgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDA4NjIiLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N0YWdlTWFzay0wMjA5OSIsCisgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDIxMDAiKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVTdGFnZU1hc2tHc1RzRW5hYmxlcygKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LmRzdFN0YWdlTWFzaywgZnVuY3Rpb25fbmFtZSwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stMDA4NjEiLAorICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLTAwODYzIiwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stMDIxMDEiLAorICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLTAyMTAyIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIVZhbGlkYXRlQWNjZXNzTWFza1BpcGVsaW5lU3RhZ2UoZGV2aWNlX2V4dGVuc2lvbnMsIGRlcGVuZGVuY3kuc3JjQWNjZXNzTWFzaywgZGVwZW5kZW5jeS5zcmNTdGFnZU1hc2spKSB7CisgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY0FjY2Vzc01hc2stMDMwODgiIDogIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNBY2Nlc3NNYXNrLTAwODY4IjsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHBEZXBlbmRlbmNpZXNbJXVdLnNyY0FjY2Vzc01hc2sgKDB4JSIgUFJJeDMyICIpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc3JjU3RhZ2VNYXNrICgweCUiIFBSSXgzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUsIGksIGRlcGVuZGVuY3kuc3JjQWNjZXNzTWFzaywgZGVwZW5kZW5jeS5zcmNTdGFnZU1hc2spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFWYWxpZGF0ZUFjY2Vzc01hc2tQaXBlbGluZVN0YWdlKGRldmljZV9leHRlbnNpb25zLCBkZXBlbmRlbmN5LmRzdEFjY2Vzc01hc2ssIGRlcGVuZGVuY3kuZHN0U3RhZ2VNYXNrKSkgeworICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RBY2Nlc3NNYXNrLTAzMDg5IiA6ICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0QWNjZXNzTWFzay0wMDg2OSI7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwRGVwZW5kZW5jaWVzWyV1XS5kc3RBY2Nlc3NNYXNrICgweCUiIFBSSXgzMiAiKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRzdFN0YWdlTWFzayAoMHglIiBQUkl4MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLCBpLCBkZXBlbmRlbmN5LmRzdEFjY2Vzc01hc2ssIGRlcGVuZGVuY3kuZHN0U3RhZ2VNYXNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNraXApIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUxheW91dHMocnBfdmVyc2lvbiwgZGV2aWNlLCBwQ3JlYXRlSW5mbyk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyAqcFJlbmRlclBhc3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICAvLyBIYW5kbGUgZXh0ZW5zaW9uIHN0cnVjdHMgZnJvbSBLSFJfbXVsdGl2aWV3IGFuZCBLSFJfbWFpbnRlbmFuY2UyIHRoYXQgY2FuIG9ubHkgYmUgdmFsaWRhdGVkIGZvciBSUDEgKGluZGljZXMgb3V0IG9mIGJvdW5kcykKKyAgICBjb25zdCBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvICpwTXVsdGl2aWV3SW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHBNdWx0aXZpZXdJbmZvKSB7CisgICAgICAgIGlmIChwTXVsdGl2aWV3SW5mby0+c3VicGFzc0NvdW50ICYmIHBNdWx0aXZpZXdJbmZvLT5zdWJwYXNzQ291bnQgIT0gcENyZWF0ZUluZm8tPnN1YnBhc3NDb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5MjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJwYXNzIGNvdW50IGlzICV1IGJ1dCBtdWx0aXZpZXcgaW5mbyBoYXMgYSBzdWJwYXNzIGNvdW50IG9mICV1LiIsIHBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE11bHRpdmlld0luZm8tPnN1YnBhc3NDb3VudCk7CisgICAgICAgIH0gZWxzZSBpZiAocE11bHRpdmlld0luZm8tPmRlcGVuZGVuY3lDb3VudCAmJiBwTXVsdGl2aWV3SW5mby0+ZGVwZW5kZW5jeUNvdW50ICE9IHBDcmVhdGVJbmZvLT5kZXBlbmRlbmN5Q291bnQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAxOTI5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVwZW5kZW5jeSBjb3VudCBpcyAldSBidXQgbXVsdGl2aWV3IGluZm8gaGFzIGEgZGVwZW5kZW5jeSBjb3VudCBvZiAldS4iLCBwQ3JlYXRlSW5mby0+ZGVwZW5kZW5jeUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNdWx0aXZpZXdJbmZvLT5kZXBlbmRlbmN5Q291bnQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gKnBJbnB1dEF0dGFjaG1lbnRBc3BlY3RJbmZvID0KKyAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbz4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAocElucHV0QXR0YWNobWVudEFzcGVjdEluZm8pIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBJbnB1dEF0dGFjaG1lbnRBc3BlY3RJbmZvLT5hc3BlY3RSZWZlcmVuY2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50MzJfdCBzdWJwYXNzID0gcElucHV0QXR0YWNobWVudEFzcGVjdEluZm8tPnBBc3BlY3RSZWZlcmVuY2VzW2ldLnN1YnBhc3M7CisgICAgICAgICAgICB1aW50MzJfdCBhdHRhY2htZW50ID0gcElucHV0QXR0YWNobWVudEFzcGVjdEluZm8tPnBBc3BlY3RSZWZlcmVuY2VzW2ldLmlucHV0QXR0YWNobWVudEluZGV4OworICAgICAgICAgICAgaWYgKHN1YnBhc3MgPj0gcENyZWF0ZUluZm8tPnN1YnBhc3NDb3VudCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJwYXNzIGluZGV4ICV1IHNwZWNpZmllZCBieSBpbnB1dCBhdHRhY2htZW50IGFzcGVjdCBpbmZvICV1IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3VicGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudCBvZiAldSBmb3IgdGhpcyByZW5kZXIgcGFzcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXNzLCBpLCBwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocENyZWF0ZUluZm8tPnBTdWJwYXNzZXMgJiYgYXR0YWNobWVudCA+PSBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzXS5pbnB1dEF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnB1dCBhdHRhY2htZW50IGluZGV4ICV1IHNwZWNpZmllZCBieSBpbnB1dCBhdHRhY2htZW50IGFzcGVjdCBpbmZvICV1IGlzIGdyZWF0ZXIgdGhhbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgYXR0YWNobWVudCBjb3VudCBvZiAldSBmb3IgdGhpcyBzdWJwYXNzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQsIGksIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NdLmlucHV0QXR0YWNobWVudENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUICpwRnJhZ21lbnREZW5zaXR5TWFwSW5mbyA9CisgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHBGcmFnbWVudERlbnNpdHlNYXBJbmZvKSB7CisgICAgICAgIGlmIChwRnJhZ21lbnREZW5zaXR5TWFwSW5mby0+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICBpZiAocEZyYWdtZW50RGVuc2l0eU1hcEluZm8tPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQuYXR0YWNobWVudCA+PSBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhULWZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQtMDI1NDciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCAldSBtdXN0IGJlIGxlc3MgdGhhbiBhdHRhY2htZW50Q291bnQgJXUgb2YgZm9yIHRoaXMgcmVuZGVyIHBhc3MuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYWdtZW50RGVuc2l0eU1hcEluZm8tPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQuYXR0YWNobWVudCwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghKHBGcmFnbWVudERlbnNpdHlNYXBJbmZvLT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LmxheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfRlJBR01FTlRfREVOU0lUWV9NQVBfT1BUSU1BTF9FWFQgfHwKKyAgICAgICAgICAgICAgICAgICAgICBwRnJhZ21lbnREZW5zaXR5TWFwSW5mby0+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC5sYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC0wMjU0OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IG9mIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgJXUnIG11c3QgYmUgZXF1YWwgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVCwgb3IgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFnbWVudERlbnNpdHlNYXBJbmZvLT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LmF0dGFjaG1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIShwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW3BGcmFnbWVudERlbnNpdHlNYXBJbmZvLT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LmF0dGFjaG1lbnRdLmxvYWRPcCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCB8fAorICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbcEZyYWdtZW50RGVuc2l0eU1hcEluZm8tPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQuYXR0YWNobWVudF0ubG9hZE9wID09CisgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC0wMjU1MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCAldScgbXVzdCByZWZlcmVuY2UgYW4gYXR0YWNobWVudCB3aXRoIGEgbG9hZE9wICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcXVhbCB0byBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCBvciBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhZ21lbnREZW5zaXR5TWFwSW5mby0+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC5hdHRhY2htZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbcEZyYWdtZW50RGVuc2l0eU1hcEluZm8tPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQuYXR0YWNobWVudF0uc3RvcmVPcCAhPQorICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhULWZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQtMDI1NTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgJXUnIG11c3QgcmVmZXJlbmNlIGFuIGF0dGFjaG1lbnQgd2l0aCBhIHN0b3JlT3AgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVxdWFsIHRvIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhZ21lbnREZW5zaXR5TWFwSW5mby0+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC5hdHRhY2htZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNraXApIHsKKyAgICAgICAgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiBjcmVhdGVfaW5mb18yOworICAgICAgICBDb252ZXJ0VmtSZW5kZXJQYXNzQ3JlYXRlSW5mb1RvVjJLSFIoKnBDcmVhdGVJbmZvLCAmY3JlYXRlX2luZm9fMik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDcmVhdGVSZW5kZXJQYXNzKGRldmljZSwgUkVOREVSX1BBU1NfVkVSU0lPTl8xLCBjcmVhdGVfaW5mb18yLnB0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworc3RhdGljIGJvb2wgVmFsaWRhdGVEZXB0aFN0ZW5jaWxSZXNvbHZlKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgJmRlcHRoX3N0ZW5jaWxfcmVzb2x2ZV9wcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiAqcENyZWF0ZUluZm8pIHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIElmIHRoZSBwTmV4dCBsaXN0IG9mIFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiBpbmNsdWRlcyBhIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiBzdHJ1Y3R1cmUsCisgICAgLy8gdGhlbiB0aGF0IHN0cnVjdHVyZSBkZXNjcmliZXMgZGVwdGgvc3RlbmNpbCByZXNvbHZlIG9wZXJhdGlvbnMgZm9yIHRoZSBzdWJwYXNzLgorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICZzdWJwYXNzID0gcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbaV07CisgICAgICAgIGNvbnN0IGF1dG8gKnJlc29sdmUgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI+KHN1YnBhc3MucE5leHQpOworCisgICAgICAgIGlmIChyZXNvbHZlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgYm9vbCByZXNvbHZlX2F0dGFjaG1lbnRfbm90X3VudXNlZCA9IChyZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0+YXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCk7CisgICAgICAgIGNvbnN0IGJvb2wgdmFsaWRfcmVzb2x2ZV9hdHRhY2htZW50X2luZGV4ID0KKyAgICAgICAgICAgIChyZXNvbHZlX2F0dGFjaG1lbnRfbm90X3VudXNlZCAmJiByZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtPmF0dGFjaG1lbnQgPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50KTsKKworICAgICAgICBjb25zdCBib29sIGRzX2F0dGFjaG1lbnRfbm90X3VudXNlZCA9CisgICAgICAgICAgICAoc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCAhPSBudWxscHRyICYmIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpOworICAgICAgICBjb25zdCBib29sIHZhbGlkX2RzX2F0dGFjaG1lbnRfaW5kZXggPQorICAgICAgICAgICAgKGRzX2F0dGFjaG1lbnRfbm90X3VudXNlZCAmJiBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50IDwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCk7CisKKyAgICAgICAgaWYgKHJlc29sdmVfYXR0YWNobWVudF9ub3RfdW51c2VkICYmIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudCA9PSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxNzciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKCk6IFN1YnBhc3MgJXUgaW5jbHVkZXMgYSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3R1cmUgd2l0aCByZXNvbHZlIGF0dGFjaG1lbnQgJXUsIGJ1dCBwRGVwdGhTdGVuY2lsQXR0YWNobWVudD1WS19BVFRBQ0hNRU5UX1VOVVNFRC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlc29sdmUtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0+YXR0YWNobWVudCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzb2x2ZV9hdHRhY2htZW50X25vdF91bnVzZWQgJiYgcmVzb2x2ZS0+ZGVwdGhSZXNvbHZlTW9kZSA9PSBWS19SRVNPTFZFX01PREVfTk9ORV9LSFIgJiYKKyAgICAgICAgICAgIHJlc29sdmUtPnN0ZW5jaWxSZXNvbHZlTW9kZSA9PSBWS19SRVNPTFZFX01PREVfTk9ORV9LSFIpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTc4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVSZW5kZXJQYXNzMktIUigpOiBTdWJwYXNzICV1IGluY2x1ZGVzIGEgVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RydWN0dXJlIHdpdGggcmVzb2x2ZSBhdHRhY2htZW50ICV1LCBidXQgYm90aCBkZXB0aCBhbmQgc3RlbmNpbCByZXNvbHZlIG1vZGVzIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1JFU09MVkVfTU9ERV9OT05FX0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlc29sdmUtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0+YXR0YWNobWVudCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzb2x2ZV9hdHRhY2htZW50X25vdF91bnVzZWQgJiYgdmFsaWRfZHNfYXR0YWNobWVudF9pbmRleCAmJgorICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50XS5zYW1wbGVzID09IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxNzkiLAorICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKCk6IFN1YnBhc3MgJXUgaW5jbHVkZXMgYSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgIgorICAgICAgICAgICAgICAgICJzdHJ1Y3R1cmUgd2l0aCByZXNvbHZlIGF0dGFjaG1lbnQgJXUuIEhvd2V2ZXIgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgaGFzIHNhbXBsZSBjb3VudD1WS19TQU1QTEVfQ09VTlRfMV9CSVQuIiwKKyAgICAgICAgICAgICAgICBpLCByZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtPmF0dGFjaG1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbGlkX3Jlc29sdmVfYXR0YWNobWVudF9pbmRleCAmJgorICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tyZXNvbHZlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtPmF0dGFjaG1lbnRdLnNhbXBsZXMgIT0gVktfU0FNUExFX0NPVU5UXzFfQklUKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0wMzE4MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoKTogU3VicGFzcyAldSBpbmNsdWRlcyBhIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdHVyZSB3aXRoIHJlc29sdmUgYXR0YWNobWVudCAldSB3aGljaCBoYXMgc2FtcGxlIGNvdW50PVZLX1NBTVBMRV9DT1VOVF8xX0JJVC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlc29sdmUtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0+YXR0YWNobWVudCk7CisgICAgICAgIH0KKworICAgICAgICBWa0Zvcm1hdCBwRGVwdGhTdGVuY2lsQXR0YWNobWVudEZvcm1hdCA9CisgICAgICAgICAgICAodmFsaWRfZHNfYXR0YWNobWVudF9pbmRleCA/IHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudF0uZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZLX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgICBWa0Zvcm1hdCBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnRGb3JtYXQgPQorICAgICAgICAgICAgKHZhbGlkX3Jlc29sdmVfYXR0YWNobWVudF9pbmRleCA/IHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbcmVzb2x2ZS0+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LT5hdHRhY2htZW50XS5mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWS19GT1JNQVRfVU5ERUZJTkVEKTsKKworICAgICAgICBpZiAodmFsaWRfZHNfYXR0YWNobWVudF9pbmRleCAmJiB2YWxpZF9yZXNvbHZlX2F0dGFjaG1lbnRfaW5kZXggJiYKKyAgICAgICAgICAgICgoRm9ybWF0RGVwdGhTaXplKHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50Rm9ybWF0KSAhPSBGb3JtYXREZXB0aFNpemUocERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50Rm9ybWF0KSkgfHwKKyAgICAgICAgICAgICAoRm9ybWF0RGVwdGhOdW1lcmljYWxUeXBlKHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50Rm9ybWF0KSAhPQorICAgICAgICAgICAgICBGb3JtYXREZXB0aE51bWVyaWNhbFR5cGUocERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50Rm9ybWF0KSkpKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODEiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoKTogU3VicGFzcyAldSBpbmNsdWRlcyBhIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RydWN0dXJlIHdpdGggcmVzb2x2ZSBhdHRhY2htZW50ICV1IHdoaWNoIGhhcyBhIGRlcHRoIGNvbXBvbmVudCAoc2l6ZSAldSkuIFRoZSBkZXB0aCBjb21wb25lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYml0cyAoY3VycmVudGx5ICV1KSBhbmQgdGhlIHNhbWUgbnVtZXJpY2FsIHR5cGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJlc29sdmUtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0+YXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdERlcHRoU2l6ZShwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnRGb3JtYXQpLCBGb3JtYXREZXB0aFNpemUocERlcHRoU3RlbmNpbEF0dGFjaG1lbnRGb3JtYXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWxpZF9kc19hdHRhY2htZW50X2luZGV4ICYmIHZhbGlkX3Jlc29sdmVfYXR0YWNobWVudF9pbmRleCAmJgorICAgICAgICAgICAgKChGb3JtYXRTdGVuY2lsU2l6ZShwRGVwdGhTdGVuY2lsQXR0YWNobWVudEZvcm1hdCkgIT0gRm9ybWF0U3RlbmNpbFNpemUocERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50Rm9ybWF0KSkgfHwKKyAgICAgICAgICAgICAoRm9ybWF0U3RlbmNpbE51bWVyaWNhbFR5cGUocERlcHRoU3RlbmNpbEF0dGFjaG1lbnRGb3JtYXQpICE9CisgICAgICAgICAgICAgIEZvcm1hdFN0ZW5jaWxOdW1lcmljYWxUeXBlKHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudEZvcm1hdCkpKSkgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTgyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKCk6IFN1YnBhc3MgJXUgaW5jbHVkZXMgYSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdHVyZSB3aXRoIHJlc29sdmUgYXR0YWNobWVudCAldSB3aGljaCBoYXMgYSBzdGVuY2lsIGNvbXBvbmVudCAoc2l6ZSAldSkuIFRoZSBzdGVuY2lsIGNvbXBvbmVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib2YgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIChjdXJyZW50bHkgJXUpIGFuZCB0aGUgc2FtZSBudW1lcmljYWwgdHlwZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVzb2x2ZS0+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LT5hdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0U3RlbmNpbFNpemUocERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50Rm9ybWF0KSwgRm9ybWF0U3RlbmNpbFNpemUocERlcHRoU3RlbmNpbEF0dGFjaG1lbnRGb3JtYXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKHJlc29sdmUtPmRlcHRoUmVzb2x2ZU1vZGUgPT0gVktfUkVTT0xWRV9NT0RFX05PTkVfS0hSIHx8CisgICAgICAgICAgICAgIHJlc29sdmUtPmRlcHRoUmVzb2x2ZU1vZGUgJiBkZXB0aF9zdGVuY2lsX3Jlc29sdmVfcHJvcHMuc3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXMpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLWRlcHRoUmVzb2x2ZU1vZGUtMDMxODMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKCk6IFN1YnBhc3MgJXUgaW5jbHVkZXMgYSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3R1cmUgd2l0aCBpbnZhbGlkIGRlcHRoUmVzb2x2ZU1vZGU9JXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZXNvbHZlLT5kZXB0aFJlc29sdmVNb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKHJlc29sdmUtPnN0ZW5jaWxSZXNvbHZlTW9kZSA9PSBWS19SRVNPTFZFX01PREVfTk9ORV9LSFIgfHwKKyAgICAgICAgICAgICAgcmVzb2x2ZS0+c3RlbmNpbFJlc29sdmVNb2RlICYgZGVwdGhfc3RlbmNpbF9yZXNvbHZlX3Byb3BzLnN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXMpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXN0ZW5jaWxSZXNvbHZlTW9kZS0wMzE4NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoKTogU3VicGFzcyAldSBpbmNsdWRlcyBhIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdHVyZSB3aXRoIGludmFsaWQgc3RlbmNpbFJlc29sdmVNb2RlPSV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVzb2x2ZS0+c3RlbmNpbFJlc29sdmVNb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWxpZF9yZXNvbHZlX2F0dGFjaG1lbnRfaW5kZXggJiYgRm9ybWF0SXNEZXB0aEFuZFN0ZW5jaWwocERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50Rm9ybWF0KSAmJgorICAgICAgICAgICAgZGVwdGhfc3RlbmNpbF9yZXNvbHZlX3Byb3BzLmluZGVwZW5kZW50UmVzb2x2ZSA9PSBWS19GQUxTRSAmJgorICAgICAgICAgICAgZGVwdGhfc3RlbmNpbF9yZXNvbHZlX3Byb3BzLmluZGVwZW5kZW50UmVzb2x2ZU5vbmUgPT0gVktfRkFMU0UgJiYKKyAgICAgICAgICAgICEocmVzb2x2ZS0+ZGVwdGhSZXNvbHZlTW9kZSA9PSByZXNvbHZlLT5zdGVuY2lsUmVzb2x2ZU1vZGUpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0wMzE4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoKTogU3VicGFzcyAldSBpbmNsdWRlcyBhIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdHVyZS4gVGhlIHZhbHVlcyBvZiBkZXB0aFJlc29sdmVNb2RlICgldSkgYW5kIHN0ZW5jaWxSZXNvbHZlTW9kZSAoJXUpIG11c3QgYmUgaWRlbnRpY2FsLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVzb2x2ZS0+ZGVwdGhSZXNvbHZlTW9kZSwgcmVzb2x2ZS0+c3RlbmNpbFJlc29sdmVNb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWxpZF9yZXNvbHZlX2F0dGFjaG1lbnRfaW5kZXggJiYgRm9ybWF0SXNEZXB0aEFuZFN0ZW5jaWwocERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50Rm9ybWF0KSAmJgorICAgICAgICAgICAgZGVwdGhfc3RlbmNpbF9yZXNvbHZlX3Byb3BzLmluZGVwZW5kZW50UmVzb2x2ZSA9PSBWS19GQUxTRSAmJgorICAgICAgICAgICAgZGVwdGhfc3RlbmNpbF9yZXNvbHZlX3Byb3BzLmluZGVwZW5kZW50UmVzb2x2ZU5vbmUgPT0gVktfVFJVRSAmJgorICAgICAgICAgICAgIShyZXNvbHZlLT5kZXB0aFJlc29sdmVNb2RlID09IHJlc29sdmUtPnN0ZW5jaWxSZXNvbHZlTW9kZSB8fCByZXNvbHZlLT5kZXB0aFJlc29sdmVNb2RlID09IFZLX1JFU09MVkVfTU9ERV9OT05FX0tIUiB8fAorICAgICAgICAgICAgICByZXNvbHZlLT5zdGVuY2lsUmVzb2x2ZU1vZGUgPT0gVktfUkVTT0xWRV9NT0RFX05PTkVfS0hSKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKCk6IFN1YnBhc3MgJXUgaW5jbHVkZXMgYSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3R1cmUuIFRoZSB2YWx1ZXMgb2YgZGVwdGhSZXNvbHZlTW9kZSAoJXUpIGFuZCBzdGVuY2lsUmVzb2x2ZU1vZGUgKCV1KSBtdXN0IGJlIGlkZW50aWNhbCwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmUgb2YgdGhlbSBtdXN0IGJlICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVzb2x2ZS0+ZGVwdGhSZXNvbHZlTW9kZSwgcmVzb2x2ZS0+c3RlbmNpbFJlc29sdmVNb2RlLCBWS19SRVNPTFZFX01PREVfTk9ORV9LSFIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzczJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzICpwUmVuZGVyUGFzcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2tocl9kZXB0aF9zdGVuY2lsX3Jlc29sdmUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZURlcHRoU3RlbmNpbFJlc29sdmUocmVwb3J0X2RhdGEsIHBoeXNfZGV2X2V4dF9wcm9wcy5kZXB0aF9zdGVuY2lsX3Jlc29sdmVfcHJvcHMsIHBDcmVhdGVJbmZvKTsKKyAgICB9CisKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIGNyZWF0ZV9pbmZvXzIocENyZWF0ZUluZm8pOworICAgIHNraXAgfD0gVmFsaWRhdGVDcmVhdGVSZW5kZXJQYXNzKGRldmljZSwgUkVOREVSX1BBU1NfVkVSU0lPTl8yLCBjcmVhdGVfaW5mb18yLnB0cigpKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlUHJpbWFyeUNvbW1hbmRCdWZmZXIoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqcENCLCBjaGFyIGNvbnN0ICpjbWRfbmFtZSwgY29uc3QgY2hhciAqZXJyb3JfY29kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChwQ0ItPmNyZWF0ZUluZm8ubGV2ZWwgIT0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENCLT5jb21tYW5kQnVmZmVyKSwgZXJyb3JfY29kZSwgIkNhbm5vdCBleGVjdXRlIGNvbW1hbmQgJXMgb24gYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmVyaWZ5UmVuZGVyQXJlYUJvdW5kcyhjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gKnBSZW5kZXJQYXNzQmVnaW4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvICpwRnJhbWVidWZmZXJJbmZvID0gJkdldEZyYW1lYnVmZmVyU3RhdGUocFJlbmRlclBhc3NCZWdpbi0+ZnJhbWVidWZmZXIpLT5jcmVhdGVJbmZvOworICAgIGlmIChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJBcmVhLm9mZnNldC54IDwgMCB8fAorICAgICAgICAocFJlbmRlclBhc3NCZWdpbi0+cmVuZGVyQXJlYS5vZmZzZXQueCArIHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlckFyZWEuZXh0ZW50LndpZHRoKSA+IHBGcmFtZWJ1ZmZlckluZm8tPndpZHRoIHx8CisgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlckFyZWEub2Zmc2V0LnkgPCAwIHx8CisgICAgICAgIChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJBcmVhLm9mZnNldC55ICsgcFJlbmRlclBhc3NCZWdpbi0+cmVuZGVyQXJlYS5leHRlbnQuaGVpZ2h0KSA+IHBGcmFtZWJ1ZmZlckluZm8tPmhlaWdodCkgeworICAgICAgICBza2lwIHw9IHN0YXRpY19jYXN0PGJvb2w+KGxvZ19tc2coCisgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRSZW5kZXJBcmVhLAorICAgICAgICAgICAgIkNhbm5vdCBleGVjdXRlIGEgcmVuZGVyIHBhc3Mgd2l0aCByZW5kZXJBcmVhIG5vdCB3aXRoaW4gdGhlIGJvdW5kIG9mIHRoZSBmcmFtZWJ1ZmZlci4gUmVuZGVyQXJlYTogeCAlZCwgeSAlZCwgd2lkdGggIgorICAgICAgICAgICAgIiVkLCBoZWlnaHQgJWQuIEZyYW1lYnVmZmVyOiB3aWR0aCAlZCwgaGVpZ2h0ICVkLiIsCisgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJBcmVhLm9mZnNldC54LCBwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJBcmVhLm9mZnNldC55LCBwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJBcmVhLmV4dGVudC53aWR0aCwKKyAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlckFyZWEuZXh0ZW50LmhlaWdodCwgcEZyYW1lYnVmZmVySW5mby0+d2lkdGgsIHBGcmFtZWJ1ZmZlckluZm8tPmhlaWdodCkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWZXJpZnlGcmFtZWJ1ZmZlckFuZFJlbmRlclBhc3NJbWFnZVZpZXdzKGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyAqcFJlbmRlclBhc3NCZWdpbkluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSICpwUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm8gPQorICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSPihwUmVuZGVyUGFzc0JlZ2luSW5mby0+cE5leHQpOworCisgICAgaWYgKHBSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mbyAmJiBwUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm8tPmF0dGFjaG1lbnRDb3VudCAhPSAwKSB7CisgICAgICAgIGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gKnBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gPQorICAgICAgICAgICAgJkdldEZyYW1lYnVmZmVyU3RhdGUocFJlbmRlclBhc3NCZWdpbkluZm8tPmZyYW1lYnVmZmVyKS0+Y3JlYXRlSW5mbzsKKyAgICAgICAgY29uc3QgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAqcEZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvID0KKyAgICAgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI+KHBGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKChwRnJhbWVidWZmZXJDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUikgPT0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUmVuZGVyUGFzc0JlZ2luSW5mby0+cmVuZGVyUGFzcyksICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIwNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUmVuZGVyUGFzc0JlZ2luSW5mbzogSW1hZ2Ugdmlld3Mgc3BlY2lmaWVkIGF0IHJlbmRlciBwYXNzIGJlZ2luLCBidXQgZnJhbWVidWZmZXIgbm90IGNyZWF0ZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiIpOworICAgICAgICB9IGVsc2UgaWYgKHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mbykgeworICAgICAgICAgICAgaWYgKHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby0+YXR0YWNobWVudEltYWdlSW5mb0NvdW50ICE9IHBSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby0+YXR0YWNobWVudENvdW50KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFJlbmRlclBhc3NCZWdpbkluZm8tPnJlbmRlclBhc3MpLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtSZW5kZXJQYXNzQmVnaW5JbmZvOiAldSBpbWFnZSB2aWV3cyBzcGVjaWZpZWQgYXQgcmVuZGVyIHBhc3MgYmVnaW4sIGJ1dCBmcmFtZWJ1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVkIGV4cGVjdGluZyAldSBhdHRhY2htZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby0+YXR0YWNobWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8tPmF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgKnBSZW5kZXJQYXNzQ3JlYXRlSW5mbyA9CisgICAgICAgICAgICAgICAgICAgICZHZXRSZW5kZXJQYXNzU3RhdGUocFJlbmRlclBhc3NCZWdpbkluZm8tPnJlbmRlclBhc3MpLT5jcmVhdGVJbmZvOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm8tPmF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyAqcEltYWdlVmlld0NyZWF0ZUluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgJkdldEltYWdlVmlld1N0YXRlKHBSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby0+cEF0dGFjaG1lbnRzW2ldKS0+Y3JlYXRlX2luZm87CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSICpwRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICZwRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8tPnBBdHRhY2htZW50SW1hZ2VJbmZvc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKnBJbWFnZUNyZWF0ZUluZm8gPSAmR2V0SW1hZ2VTdGF0ZShwSW1hZ2VWaWV3Q3JlYXRlSW5mby0+aW1hZ2UpLT5jcmVhdGVJbmZvOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLT5mbGFncyAhPSBwSW1hZ2VDcmVhdGVJbmZvLT5mbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUmVuZGVyUGFzc0JlZ2luSW5mby0+cmVuZGVyUGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtSZW5kZXJQYXNzQmVnaW5JbmZvOiBJbWFnZSB2aWV3ICMldSBjcmVhdGVkIGZyb20gYW4gaW1hZ2Ugd2l0aCBmbGFncyBzZXQgYXMgMHglWCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgaW1hZ2UgaW5mbyAjJXUgdXNlZCB0byBjcmVhdGUgdGhlIGZyYW1lYnVmZmVyIGhhZCBmbGFncyBzZXQgYXMgMHglWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcEltYWdlQ3JlYXRlSW5mby0+ZmxhZ3MsIGksIHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8tPmZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLT51c2FnZSAhPSBwSW1hZ2VDcmVhdGVJbmZvLT51c2FnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUmVuZGVyUGFzc0JlZ2luSW5mby0+cmVuZGVyUGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtSZW5kZXJQYXNzQmVnaW5JbmZvOiBJbWFnZSB2aWV3ICMldSBjcmVhdGVkIGZyb20gYW4gaW1hZ2Ugd2l0aCB1c2FnZSBzZXQgYXMgMHglWCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgaW1hZ2UgaW5mbyAjJXUgdXNlZCB0byBjcmVhdGUgdGhlIGZyYW1lYnVmZmVyIGhhZCB1c2FnZSBzZXQgYXMgMHglWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcEltYWdlQ3JlYXRlSW5mby0+dXNhZ2UsIGksIHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8tPnVzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLT53aWR0aCAhPSBwSW1hZ2VDcmVhdGVJbmZvLT5leHRlbnQud2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFJlbmRlclBhc3NCZWdpbkluZm8tPnJlbmRlclBhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUmVuZGVyUGFzc0JlZ2luSW5mbzogSW1hZ2UgdmlldyAjJXUgY3JlYXRlZCBmcm9tIGFuIGltYWdlIHdpdGggd2lkdGggc2V0IGFzICV1LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBpbWFnZSBpbmZvICMldSB1c2VkIHRvIGNyZWF0ZSB0aGUgZnJhbWVidWZmZXIgaGFkIHdpZHRoIHNldCBhcyAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcEltYWdlQ3JlYXRlSW5mby0+ZXh0ZW50LndpZHRoLCBpLCBwRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLT53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocEZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby0+aGVpZ2h0ICE9IHBJbWFnZUNyZWF0ZUluZm8tPmV4dGVudC5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFJlbmRlclBhc3NCZWdpbkluZm8tPnJlbmRlclBhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUmVuZGVyUGFzc0JlZ2luSW5mbzogSW1hZ2UgdmlldyAjJXUgY3JlYXRlZCBmcm9tIGFuIGltYWdlIHdpdGggaGVpZ2h0IHNldCBhcyAldSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgaW1hZ2UgaW5mbyAjJXUgdXNlZCB0byBjcmVhdGUgdGhlIGZyYW1lYnVmZmVyIGhhZCBoZWlnaHQgc2V0IGFzICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwSW1hZ2VDcmVhdGVJbmZvLT5leHRlbnQuaGVpZ2h0LCBpLCBwRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLT5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8tPmxheWVyQ291bnQgIT0gcEltYWdlVmlld0NyZWF0ZUluZm8tPnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUmVuZGVyUGFzc0JlZ2luSW5mby0+cmVuZGVyUGFzcyksICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUmVuZGVyUGFzc0JlZ2luSW5mbzogSW1hZ2UgdmlldyAjJXUgY3JlYXRlZCB3aXRoIGEgc3VicmVzb3VyY2UgcmFuZ2Ugd2l0aCBhIGxheWVyQ291bnQgb2YgJXUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGltYWdlIGluZm8gIyV1IHVzZWQgdG8gY3JlYXRlIHRoZSBmcmFtZWJ1ZmZlciBoYWQgbGF5ZXJDb3VudCBzZXQgYXMgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQsIGksIHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8tPmxheWVyQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSICpwSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI+KHBJbWFnZUNyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm8tPnZpZXdGb3JtYXRDb3VudCAhPSBwRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLT52aWV3Rm9ybWF0Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFJlbmRlclBhc3NCZWdpbkluZm8tPnJlbmRlclBhc3MpLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtSZW5kZXJQYXNzQmVnaW5JbmZvOiBJbWFnZSB2aWV3ICMldSBjcmVhdGVkIHdpdGggYW4gaW1hZ2Ugd2l0aCBhIHZpZXdGb3JtYXRDb3VudCBvZiAldSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGltYWdlIGluZm8gIyV1IHVzZWQgdG8gY3JlYXRlIHRoZSBmcmFtZWJ1ZmZlciBoYWQgdmlld0Zvcm1hdENvdW50IHNldCBhcyAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvLT52aWV3Rm9ybWF0Q291bnQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8tPnZpZXdGb3JtYXRDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mby0+dmlld0Zvcm1hdENvdW50OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcm1hdEZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBrID0gMDsgayA8IHBGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8tPnZpZXdGb3JtYXRDb3VudDsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mby0+cFZpZXdGb3JtYXRzW2pdID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLT5wVmlld0Zvcm1hdHNba10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdEZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUmVuZGVyUGFzc0JlZ2luSW5mby0+cmVuZGVyUGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1JlbmRlclBhc3NCZWdpbkluZm86IEltYWdlIHZpZXcgIyV1IGNyZWF0ZWQgd2l0aCBhbiBpbWFnZSBpbmNsdWRpbmcgdGhlIGZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpbiBpdHMgdmlldyBmb3JtYXQgbGlzdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGltYWdlIGluZm8gIyV1IHVzZWQgdG8gY3JlYXRlIHRoZSBmcmFtZWJ1ZmZlciBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3RyaW5nX1ZrRm9ybWF0KHBJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvLT5wVmlld0Zvcm1hdHNbal0pLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocFJlbmRlclBhc3NDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZm9ybWF0ICE9IHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFJlbmRlclBhc3NCZWdpbkluZm8tPnJlbmRlclBhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUmVuZGVyUGFzc0JlZ2luSW5mbzogSW1hZ2UgdmlldyAjJXUgY3JlYXRlZCB3aXRoIGEgZm9ybWF0IG9mICVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCByZW5kZXIgcGFzcyBhdHRhY2htZW50IGRlc2NyaXB0aW9uICMldSBjcmVhdGVkIHdpdGggYSBmb3JtYXQgb2YgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHN0cmluZ19Wa0Zvcm1hdChwSW1hZ2VWaWV3Q3JlYXRlSW5mby0+Zm9ybWF0KSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtGb3JtYXQocFJlbmRlclBhc3NDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocFJlbmRlclBhc3NDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uc2FtcGxlcyAhPSBwSW1hZ2VDcmVhdGVJbmZvLT5zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBSZW5kZXJQYXNzQmVnaW5JbmZvLT5yZW5kZXJQYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1JlbmRlclBhc3NCZWdpbkluZm86IEltYWdlIHZpZXcgIyV1IGNyZWF0ZWQgd2l0aCBhbiBpbWFnZSB3aXRoICVzIHNhbXBsZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHJlbmRlciBwYXNzIGF0dGFjaG1lbnQgZGVzY3JpcHRpb24gIyV1IGNyZWF0ZWQgd2l0aCAlcyBzYW1wbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzdHJpbmdfVmtTYW1wbGVDb3VudEZsYWdCaXRzKHBJbWFnZUNyZWF0ZUluZm8tPnNhbXBsZXMpLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa1NhbXBsZUNvdW50RmxhZ0JpdHMocFJlbmRlclBhc3NDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uc2FtcGxlcykpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby0+cEF0dGFjaG1lbnRzW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLXBBdHRhY2htZW50cy0wMzIxOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm86IEltYWdlIHZpZXcgIyV1IGNyZWF0ZWQgd2l0aCBtdWx0aXBsZSAoJXUpIG1pcCBsZXZlbHMuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VWaWV3Q3JlYXRlSW5mby0+c3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgoKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLnIgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLnIgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfUikpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLmcgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLmcgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfRykpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLmIgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLmIgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQikpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLmEgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLmEgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby0+cEF0dGFjaG1lbnRzW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItcEF0dGFjaG1lbnRzLTAzMjE5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvOiBJbWFnZSB2aWV3ICMldSBjcmVhdGVkIHdpdGggbm9uLWlkZW50aXR5IHN3aXp6bGUuIEFsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVidWZmZXIgYXR0YWNobWVudHMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBpZGVudGl0eSBzd2l6emxlLiBIZXJlIGFyZSB0aGUgYWN0dWFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzd2l6emxlIHZhbHVlczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyIHN3aXp6bGUgPSAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImcgc3dpenpsZSA9ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYiBzd2l6emxlID0gJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIHN3aXp6bGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHN0cmluZ19Wa0NvbXBvbmVudFN3aXp6bGUocEltYWdlVmlld0NyZWF0ZUluZm8tPmNvbXBvbmVudHMuciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtDb21wb25lbnRTd2l6emxlKHBJbWFnZVZpZXdDcmVhdGVJbmZvLT5jb21wb25lbnRzLmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrQ29tcG9uZW50U3dpenpsZShwSW1hZ2VWaWV3Q3JlYXRlSW5mby0+Y29tcG9uZW50cy5iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0NvbXBvbmVudFN3aXp6bGUocEltYWdlVmlld0NyZWF0ZUluZm8tPmNvbXBvbmVudHMuYSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIElmIHRoaXMgaXMgYSBzdGVuY2lsIGZvcm1hdCwgbWFrZSBzdXJlIHRoZSBzdGVuY2lsW0xvYWR8U3RvcmVdT3AgZmxhZyBpcyBjaGVja2VkLCB3aGlsZSBpZiBpdCBpcyBhIGRlcHRoL2NvbG9yIGF0dGFjaG1lbnQgdGhlCisvLyBbbG9hZHxzdG9yZV1PcCBmbGFnIG11c3QgYmUgY2hlY2tlZAorLy8gVE9ETzogVGhlIG1lbW9yeSB2YWxpZCBmbGFnIGluIERFVklDRV9NRU1PUllfU1RBVEUgc2hvdWxkIHByb2JhYmx5IGJlIHNwbGl0IHRvIHRyYWNrIHRoZSB2YWxpZGl0eSBvZiBzdGVuY2lsIG1lbW9yeSBzZXBhcmF0ZWx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgYm9vbCBGb3JtYXRTcGVjaWZpY0xvYWRBbmRTdG9yZU9wU2V0dGluZ3MoVmtGb3JtYXQgZm9ybWF0LCBUIGNvbG9yX2RlcHRoX29wLCBUIHN0ZW5jaWxfb3AsIFQgb3ApIHsKKyAgICBpZiAoY29sb3JfZGVwdGhfb3AgIT0gb3AgJiYgc3RlbmNpbF9vcCAhPSBvcCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJvb2wgY2hlY2tfY29sb3JfZGVwdGhfbG9hZF9vcCA9ICFGb3JtYXRJc1N0ZW5jaWxPbmx5KGZvcm1hdCk7CisgICAgYm9vbCBjaGVja19zdGVuY2lsX2xvYWRfb3AgPSBGb3JtYXRJc0RlcHRoQW5kU3RlbmNpbChmb3JtYXQpIHx8ICFjaGVja19jb2xvcl9kZXB0aF9sb2FkX29wOworCisgICAgcmV0dXJuICgoY2hlY2tfY29sb3JfZGVwdGhfbG9hZF9vcCAmJiAoY29sb3JfZGVwdGhfb3AgPT0gb3ApKSB8fCAoY2hlY2tfc3RlbmNpbF9sb2FkX29wICYmIChzdGVuY2lsX29wID09IG9wKSkpOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ21kQmVnaW5SZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gKnBSZW5kZXJQYXNzQmVnaW4pIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICBhdXRvIHJlbmRlcl9wYXNzX3N0YXRlID0gcFJlbmRlclBhc3NCZWdpbiA/IEdldFJlbmRlclBhc3NTdGF0ZShwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKSA6IG51bGxwdHI7CisgICAgYXV0byBmcmFtZWJ1ZmZlciA9IHBSZW5kZXJQYXNzQmVnaW4gPyBHZXRGcmFtZWJ1ZmZlclN0YXRlKHBSZW5kZXJQYXNzQmVnaW4tPmZyYW1lYnVmZmVyKSA6IG51bGxwdHI7CisKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBib29sIHVzZV9ycDIgPSAocnBfdmVyc2lvbiA9PSBSRU5ERVJfUEFTU19WRVJTSU9OXzIpOworICAgIGNvbnN0IGNoYXIgKnZ1aWQ7CisgICAgY29uc3QgY2hhciAqY29uc3QgZnVuY3Rpb25fbmFtZSA9IHVzZV9ycDIgPyAidmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKCkiIDogInZrQ21kQmVnaW5SZW5kZXJQYXNzKCkiOworCisgICAgaWYgKHJlbmRlcl9wYXNzX3N0YXRlKSB7CisgICAgICAgIHVpbnQzMl90IGNsZWFyX29wX3NpemUgPSAwOyAgLy8gTWFrZSBzdXJlIHBDbGVhclZhbHVlcyBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyBsYXN0IExPQURfT1BfQ0xFQVIKKworICAgICAgICAvLyBIYW5kbGUgZXh0ZW5zaW9uIHN0cnVjdCBmcm9tIEVYVF9zYW1wbGVfbG9jYXRpb25zCisgICAgICAgIGNvbnN0IFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCAqcFNhbXBsZUxvY2F0aW9uc0JlZ2luSW5mbyA9CisgICAgICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQ+KHBSZW5kZXJQYXNzQmVnaW4tPnBOZXh0KTsKKyAgICAgICAgaWYgKHBTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm8pIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvLT5hdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAocFNhbXBsZUxvY2F0aW9uc0JlZ2luSW5mby0+cEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zW2ldLmF0dGFjaG1lbnRJbmRleCA+PQorICAgICAgICAgICAgICAgICAgICByZW5kZXJfcGFzc19zdGF0ZS0+Y3JlYXRlSW5mby5hdHRhY2htZW50Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhULWF0dGFjaG1lbnRJbmRleC0wMTUzMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0YWNobWVudCBpbmRleCAldSBzcGVjaWZpZWQgYnkgYXR0YWNobWVudCBzYW1wbGUgbG9jYXRpb25zICV1IGlzIGdyZWF0ZXIgdGhhbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGFjaG1lbnQgY291bnQgb2YgJXUgZm9yIHRoZSByZW5kZXIgcGFzcyBiZWluZyBiZWd1bi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZUxvY2F0aW9uc0JlZ2luSW5mby0+cEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zW2ldLmF0dGFjaG1lbnRJbmRleCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9wYXNzX3N0YXRlLT5jcmVhdGVJbmZvLmF0dGFjaG1lbnRDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFNhbXBsZUxvY2F0aW9uc0JlZ2luSW5mby0+cG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm8tPnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc1tpXS5zdWJwYXNzSW5kZXggPj0KKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyX3Bhc3Nfc3RhdGUtPmNyZWF0ZUluZm8uc3VicGFzc0NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVC1zdWJwYXNzSW5kZXgtMDE1MzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1YnBhc3MgaW5kZXggJXUgc3BlY2lmaWVkIGJ5IHN1YnBhc3Mgc2FtcGxlIGxvY2F0aW9ucyAldSBpcyBncmVhdGVyIHRoYW4gdGhlIHN1YnBhc3MgY291bnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mICV1IGZvciB0aGUgcmVuZGVyIHBhc3MgYmVpbmcgYmVndW4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm8tPnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc1tpXS5zdWJwYXNzSW5kZXgsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfcGFzc19zdGF0ZS0+Y3JlYXRlSW5mby5zdWJwYXNzQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZW5kZXJfcGFzc19zdGF0ZS0+Y3JlYXRlSW5mby5hdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgYXV0byBwQXR0YWNobWVudCA9ICZyZW5kZXJfcGFzc19zdGF0ZS0+Y3JlYXRlSW5mby5wQXR0YWNobWVudHNbaV07CisgICAgICAgICAgICBpZiAoRm9ybWF0U3BlY2lmaWNMb2FkQW5kU3RvcmVPcFNldHRpbmdzKHBBdHRhY2htZW50LT5mb3JtYXQsIHBBdHRhY2htZW50LT5sb2FkT3AsIHBBdHRhY2htZW50LT5zdGVuY2lsTG9hZE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIpKSB7CisgICAgICAgICAgICAgICAgY2xlYXJfb3Bfc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihpKSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xlYXJfb3Bfc2l6ZSA+IHBSZW5kZXJQYXNzQmVnaW4tPmNsZWFyVmFsdWVDb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChyZW5kZXJfcGFzc19zdGF0ZS0+cmVuZGVyUGFzcyksICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1jbGVhclZhbHVlQ291bnQtMDA5MDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcyB0aGUgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHN0cnVjdCBoYXMgYSBjbGVhclZhbHVlQ291bnQgb2YgJXUgYnV0IHRoZXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhdCBsZWFzdCAldSBlbnRyaWVzIGluIHBDbGVhclZhbHVlcyBhcnJheSB0byBhY2NvdW50IGZvciB0aGUgaGlnaGVzdCBpbmRleCBhdHRhY2htZW50IGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgdGhhdCB1c2VzIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiBpcyAldS4gTm90ZSB0aGF0IHRoZSBwQ2xlYXJWYWx1ZXMgYXJyYXkgaXMgaW5kZXhlZCBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGFjaG1lbnQgbnVtYmVyIHNvIGV2ZW4gaWYgc29tZSBwQ2xlYXJWYWx1ZXMgZW50cmllcyBiZXR3ZWVuIDAgYW5kICV1IGNvcnJlc3BvbmQgdG8gYXR0YWNobWVudHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IGFyZW4ndCBjbGVhcmVkIHRoZXkgd2lsbCBiZSBpZ25vcmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSwgcFJlbmRlclBhc3NCZWdpbi0+Y2xlYXJWYWx1ZUNvdW50LCBjbGVhcl9vcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocmVuZGVyX3Bhc3Nfc3RhdGUtPnJlbmRlclBhc3MpLmNfc3RyKCksIGNsZWFyX29wX3NpemUsIGNsZWFyX29wX3NpemUgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBza2lwIHw9IFZlcmlmeUZyYW1lYnVmZmVyQW5kUmVuZGVyUGFzc0ltYWdlVmlld3MocFJlbmRlclBhc3NCZWdpbik7CisgICAgICAgIHNraXAgfD0gVmVyaWZ5UmVuZGVyQXJlYUJvdW5kcyhwUmVuZGVyUGFzc0JlZ2luKTsKKyAgICAgICAgc2tpcCB8PSBWZXJpZnlGcmFtZWJ1ZmZlckFuZFJlbmRlclBhc3NMYXlvdXRzKHJwX3ZlcnNpb24sIGNiX3N0YXRlLCBwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RnJhbWVidWZmZXJTdGF0ZShwUmVuZGVyUGFzc0JlZ2luLT5mcmFtZWJ1ZmZlcikpOworICAgICAgICBpZiAoZnJhbWVidWZmZXItPnJwX3N0YXRlLT5yZW5kZXJQYXNzICE9IHJlbmRlcl9wYXNzX3N0YXRlLT5yZW5kZXJQYXNzKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlUmVuZGVyUGFzc0NvbXBhdGliaWxpdHkoInJlbmRlciBwYXNzIiwgcmVuZGVyX3Bhc3Nfc3RhdGUsICJmcmFtZWJ1ZmZlciIsIGZyYW1lYnVmZmVyLT5ycF9zdGF0ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcmVuZGVyUGFzcy0wMDkwNCIpOworICAgICAgICB9CisKKyAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItcmVuZGVycGFzcyIgOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1yZW5kZXJwYXNzIjsKKyAgICAgICAgc2tpcCB8PSBJbnNpZGVSZW5kZXJQYXNzKGNiX3N0YXRlLCBmdW5jdGlvbl9uYW1lLCB2dWlkKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZURlcGVuZGVuY2llcyhmcmFtZWJ1ZmZlciwgcmVuZGVyX3Bhc3Nfc3RhdGUpOworCisgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWJ1ZmZlcmxldmVsIiA6ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWJ1ZmZlcmxldmVsIjsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVByaW1hcnlDb21tYW5kQnVmZmVyKGNiX3N0YXRlLCBmdW5jdGlvbl9uYW1lLCB2dWlkKTsKKworICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiIDogIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1jbWRwb29sIjsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsIGZ1bmN0aW9uX25hbWUsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwgdnVpZCk7CisKKyAgICAgICAgY29uc3QgQ01EX1RZUEUgY21kX3R5cGUgPSB1c2VfcnAyID8gQ01EX0JFR0lOUkVOREVSUEFTUzJLSFIgOiBDTURfQkVHSU5SRU5ERVJQQVNTOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBjbWRfdHlwZSwgZnVuY3Rpb25fbmFtZSk7CisgICAgfQorCisgICAgYXV0byBjaGFpbmVkX2RldmljZV9ncm91cF9zdHJ1Y3QgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbz4ocFJlbmRlclBhc3NCZWdpbi0+cE5leHQpOworICAgIGlmIChjaGFpbmVkX2RldmljZV9ncm91cF9zdHJ1Y3QpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZURldmljZU1hc2tUb1BoeXNpY2FsRGV2aWNlQ291bnQoCisgICAgICAgICAgICBjaGFpbmVkX2RldmljZV9ncm91cF9zdHJ1Y3QtPmRldmljZU1hc2ssIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKSwgIlZVSUQtVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8tZGV2aWNlTWFzay0wMDkwNSIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlRGV2aWNlTWFza1RvWmVybyhjaGFpbmVkX2RldmljZV9ncm91cF9zdHJ1Y3QtPmRldmljZU1hc2ssIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlclBhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA2Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVEZXZpY2VNYXNrVG9Db21tYW5kQnVmZmVyKAorICAgICAgICAgICAgY2Jfc3RhdGUsIGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+ZGV2aWNlTWFzaywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlclBhc3MpLCAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA3Iik7CisKKyAgICAgICAgaWYgKGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+ZGV2aWNlUmVuZGVyQXJlYUNvdW50ICE9IDAgJiYKKyAgICAgICAgICAgIGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+ZGV2aWNlUmVuZGVyQXJlYUNvdW50ICE9IHBoeXNpY2FsX2RldmljZV9jb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VSZW5kZXJBcmVhQ291bnQtMDA5MDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXZpY2VSZW5kZXJBcmVhQ291bnRbJSIgUFJJdTMyICJdIGlzIGludmFpbGQuIFBoeXNpY2FsIGRldmljZSBjb3VudCBpcyAlIiBQUkl1MzIgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+ZGV2aWNlUmVuZGVyQXJlYUNvdW50LCBwaHlzaWNhbF9kZXZpY2VfY291bnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyLCBSRU5ERVJfUEFTU19WRVJTSU9OXzEsIHBSZW5kZXJQYXNzQmVnaW4pOworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyAqcFJlbmRlclBhc3NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIgKnBTdWJwYXNzQmVnaW5JbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgUkVOREVSX1BBU1NfVkVSU0lPTl8yLCBwUmVuZGVyUGFzc0JlZ2luKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpSZWNvcmRDbWRCZWdpblJlbmRlclBhc3NMYXlvdXRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gKnBSZW5kZXJQYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byByZW5kZXJfcGFzc19zdGF0ZSA9IHBSZW5kZXJQYXNzQmVnaW4gPyBHZXRSZW5kZXJQYXNzU3RhdGUocFJlbmRlclBhc3NCZWdpbi0+cmVuZGVyUGFzcykgOiBudWxscHRyOworICAgIGF1dG8gZnJhbWVidWZmZXIgPSBwUmVuZGVyUGFzc0JlZ2luID8gR2V0RnJhbWVidWZmZXJTdGF0ZShwUmVuZGVyUGFzc0JlZ2luLT5mcmFtZWJ1ZmZlcikgOiBudWxscHRyOworICAgIGlmIChyZW5kZXJfcGFzc19zdGF0ZSkgeworICAgICAgICAvLyB0cmFuc2l0aW9uIGF0dGFjaG1lbnRzIHRvIHRoZSBjb3JyZWN0IGxheW91dHMgZm9yIGJlZ2lubmluZyBvZiByZW5kZXJQYXNzIGFuZCBmaXJzdCBzdWJwYXNzCisgICAgICAgIFRyYW5zaXRpb25CZWdpblJlbmRlclBhc3NMYXlvdXRzKGNiX3N0YXRlLCByZW5kZXJfcGFzc19zdGF0ZSwgZnJhbWVidWZmZXIpOworICAgIH0KK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gKnBSZW5kZXJQYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIHsKKyAgICBTdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgY29udGVudHMpOworICAgIFJlY29yZENtZEJlZ2luUmVuZGVyUGFzc0xheW91dHMoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgY29udGVudHMpOworfQorCit2b2lkIENvcmVDaGVja3M6OlByZUNhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gKnBSZW5kZXJQYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiAqcFN1YnBhc3NCZWdpbkluZm8pIHsKKyAgICBTdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKGNvbW1hbmRCdWZmZXIsIHBSZW5kZXJQYXNzQmVnaW4sIHBTdWJwYXNzQmVnaW5JbmZvKTsKKyAgICBSZWNvcmRDbWRCZWdpblJlbmRlclBhc3NMYXlvdXRzKGNvbW1hbmRCdWZmZXIsIHBSZW5kZXJQYXNzQmVnaW4sIHBTdWJwYXNzQmVnaW5JbmZvLT5jb250ZW50cyk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDbWROZXh0U3VicGFzcyhSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGJvb2wgdXNlX3JwMiA9IChycF92ZXJzaW9uID09IFJFTkRFUl9QQVNTX1ZFUlNJT05fMik7CisgICAgY29uc3QgY2hhciAqdnVpZDsKKyAgICBjb25zdCBjaGFyICpjb25zdCBmdW5jdGlvbl9uYW1lID0gdXNlX3JwMiA/ICJ2a0NtZE5leHRTdWJwYXNzMktIUigpIiA6ICJ2a0NtZE5leHRTdWJwYXNzKCkiOworCisgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1idWZmZXJsZXZlbCIgOiAiVlVJRC12a0NtZE5leHRTdWJwYXNzLWJ1ZmZlcmxldmVsIjsKKyAgICBza2lwIHw9IFZhbGlkYXRlUHJpbWFyeUNvbW1hbmRCdWZmZXIoY2Jfc3RhdGUsIGZ1bmN0aW9uX25hbWUsIHZ1aWQpOworCisgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiIDogIlZVSUQtdmtDbWROZXh0U3VicGFzcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWRRdWV1ZUZsYWdzKGNiX3N0YXRlLCBmdW5jdGlvbl9uYW1lLCBWS19RVUVVRV9HUkFQSElDU19CSVQsIHZ1aWQpOworICAgIGNvbnN0IENNRF9UWVBFIGNtZF90eXBlID0gdXNlX3JwMiA/IENNRF9ORVhUU1VCUEFTUzJLSFIgOiBDTURfTkVYVFNVQlBBU1M7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgY21kX3R5cGUsIGZ1bmN0aW9uX25hbWUpOworCisgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1yZW5kZXJwYXNzIiA6ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MtcmVuZGVycGFzcyI7CisgICAgc2tpcCB8PSBPdXRzaWRlUmVuZGVyUGFzcyhjYl9zdGF0ZSwgZnVuY3Rpb25fbmFtZSwgdnVpZCk7CisKKyAgICBhdXRvIHN1YnBhc3NDb3VudCA9IGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzLT5jcmVhdGVJbmZvLnN1YnBhc3NDb3VudDsKKyAgICBpZiAoY2Jfc3RhdGUtPmFjdGl2ZVN1YnBhc3MgPT0gc3VicGFzc0NvdW50IC0gMSkgeworICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELXZrQ21kTmV4dFN1YnBhc3MyS0hSLU5vbmUtMDMxMDIiIDogIlZVSUQtdmtDbWROZXh0U3VicGFzcy1Ob25lLTAwOTA5IjsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCB2dWlkLCAiJXM6IEF0dGVtcHRlZCB0byBhZHZhbmNlIGJleW9uZCBmaW5hbCBzdWJwYXNzLiIsIGZ1bmN0aW9uX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWROZXh0U3VicGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsaWRhdGVDbWROZXh0U3VicGFzcyhSRU5ERVJfUEFTU19WRVJTSU9OXzEsIGNvbW1hbmRCdWZmZXIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZE5leHRTdWJwYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSICpwU3VicGFzc0JlZ2luSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIgKnBTdWJwYXNzRW5kSW5mbykgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZUNtZE5leHRTdWJwYXNzKFJFTkRFUl9QQVNTX1ZFUlNJT05fMiwgY29tbWFuZEJ1ZmZlcik7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UmVjb3JkQ21kTmV4dFN1YnBhc3NMYXlvdXRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBUcmFuc2l0aW9uU3VicGFzc0xheW91dHMoY2Jfc3RhdGUsIGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzLCBjYl9zdGF0ZS0+YWN0aXZlU3VicGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RnJhbWVidWZmZXJTdGF0ZShjYl9zdGF0ZS0+YWN0aXZlUmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlcikpOworfQorCit2b2lkIENvcmVDaGVja3M6OlBvc3RDYWxsUmVjb3JkQ21kTmV4dFN1YnBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzKSB7CisgICAgU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZE5leHRTdWJwYXNzKGNvbW1hbmRCdWZmZXIsIGNvbnRlbnRzKTsKKyAgICBSZWNvcmRDbWROZXh0U3VicGFzc0xheW91dHMoY29tbWFuZEJ1ZmZlciwgY29udGVudHMpOworfQorCit2b2lkIENvcmVDaGVja3M6OlBvc3RDYWxsUmVjb3JkQ21kTmV4dFN1YnBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIgKnBTdWJwYXNzQmVnaW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSICpwU3VicGFzc0VuZEluZm8pIHsKKyAgICBTdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kTmV4dFN1YnBhc3MyS0hSKGNvbW1hbmRCdWZmZXIsIHBTdWJwYXNzQmVnaW5JbmZvLCBwU3VicGFzc0VuZEluZm8pOworICAgIFJlY29yZENtZE5leHRTdWJwYXNzTGF5b3V0cyhjb21tYW5kQnVmZmVyLCBwU3VicGFzc0JlZ2luSW5mby0+Y29udGVudHMpOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ21kRW5kUmVuZGVyUGFzcyhSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGJvb2wgdXNlX3JwMiA9IChycF92ZXJzaW9uID09IFJFTkRFUl9QQVNTX1ZFUlNJT05fMik7CisgICAgY29uc3QgY2hhciAqdnVpZDsKKyAgICBjb25zdCBjaGFyICpjb25zdCBmdW5jdGlvbl9uYW1lID0gdXNlX3JwMiA/ICJ2a0NtZEVuZFJlbmRlclBhc3MyS0hSKCkiIDogInZrQ21kRW5kUmVuZGVyUGFzcygpIjsKKworICAgIFJFTkRFUl9QQVNTX1NUQVRFICpycF9zdGF0ZSA9IGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzOworICAgIGlmIChycF9zdGF0ZSkgeworICAgICAgICBpZiAoY2Jfc3RhdGUtPmFjdGl2ZVN1YnBhc3MgIT0gcnBfc3RhdGUtPmNyZWF0ZUluZm8uc3VicGFzc0NvdW50IC0gMSkgeworICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLU5vbmUtMDMxMDMiIDogIlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzLU5vbmUtMDA5MTAiOworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgdnVpZCwgIiVzOiBDYWxsZWQgYmVmb3JlIHJlYWNoaW5nIGZpbmFsIHN1YnBhc3MuIiwgZnVuY3Rpb25fbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItcmVuZGVycGFzcyIgOiAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtcmVuZGVycGFzcyI7CisgICAgc2tpcCB8PSBPdXRzaWRlUmVuZGVyUGFzcyhjYl9zdGF0ZSwgZnVuY3Rpb25fbmFtZSwgdnVpZCk7CisKKyAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItYnVmZmVybGV2ZWwiIDogIlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzLWJ1ZmZlcmxldmVsIjsKKyAgICBza2lwIHw9IFZhbGlkYXRlUHJpbWFyeUNvbW1hbmRCdWZmZXIoY2Jfc3RhdGUsIGZ1bmN0aW9uX25hbWUsIHZ1aWQpOworCisgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIgOiAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1jbWRwb29sIjsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kUXVldWVGbGFncyhjYl9zdGF0ZSwgZnVuY3Rpb25fbmFtZSwgVktfUVVFVUVfR1JBUEhJQ1NfQklULCB2dWlkKTsKKworICAgIGNvbnN0IENNRF9UWVBFIGNtZF90eXBlID0gdXNlX3JwMiA/IENNRF9FTkRSRU5ERVJQQVNTMktIUiA6IENNRF9FTkRSRU5ERVJQQVNTOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIGNtZF90eXBlLCBmdW5jdGlvbl9uYW1lKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWRFbmRSZW5kZXJQYXNzKFJFTkRFUl9QQVNTX1ZFUlNJT05fMSwgY29tbWFuZEJ1ZmZlcik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUmVuZGVyUGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIgKnBTdWJwYXNzRW5kSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kRW5kUmVuZGVyUGFzcyhSRU5ERVJfUEFTU19WRVJTSU9OXzIsIGNvbW1hbmRCdWZmZXIpOworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIENvcmVDaGVja3M6OlJlY29yZENtZEVuZFJlbmRlclBhc3NMYXlvdXRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIEZSQU1FQlVGRkVSX1NUQVRFICpmcmFtZWJ1ZmZlciA9IEdldEZyYW1lYnVmZmVyU3RhdGUoY2Jfc3RhdGUtPmFjdGl2ZUZyYW1lYnVmZmVyKTsKKyAgICBUcmFuc2l0aW9uRmluYWxTdWJwYXNzTGF5b3V0cyhjYl9zdGF0ZSwgJmNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzQmVnaW5JbmZvLCBmcmFtZWJ1ZmZlcik7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UG9zdENhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7CisgICAgLy8gUmVjb3JkIHRoZSBlbmQgYXQgdGhlIENvcmVMZXZlbCB0byBlbnN1cmUgU3RhdGVUcmFja2VyIGNsZWFudXAgZG9lc24ndCBzdGVwIG9uIGFueXRoaW5nIHdlIG5lZWQuCisgICAgUmVjb3JkQ21kRW5kUmVuZGVyUGFzc0xheW91dHMoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZEVuZFJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlcik7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UG9zdENhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiAqcFN1YnBhc3NFbmRJbmZvKSB7CisgICAgLy8gUmVjb3JkIHRoZSBlbmQgYXQgdGhlIENvcmVMZXZlbCB0byBlbnN1cmUgU3RhdGVUcmFja2VyIGNsZWFudXAgZG9lc24ndCBzdGVwIG9uIGFueXRoaW5nIHdlIG5lZWQuCisgICAgUmVjb3JkQ21kRW5kUmVuZGVyUGFzc0xheW91dHMoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZEVuZFJlbmRlclBhc3MyS0hSKGNvbW1hbmRCdWZmZXIsIHBTdWJwYXNzRW5kSW5mbyk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVGcmFtZWJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgcHJpbWFyeUJ1ZmZlciwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqcENCLCBWa0NvbW1hbmRCdWZmZXIgc2Vjb25kYXJ5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnBTdWJDQiwgY29uc3QgY2hhciAqY2FsbGVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFwU3ViQ0ItPmJlZ2luSW5mby5wSW5oZXJpdGFuY2VJbmZvKSB7CisgICAgICAgIHJldHVybiBza2lwOworICAgIH0KKyAgICBWa0ZyYW1lYnVmZmVyIHByaW1hcnlfZmIgPSBwQ0ItPmFjdGl2ZUZyYW1lYnVmZmVyOworICAgIFZrRnJhbWVidWZmZXIgc2Vjb25kYXJ5X2ZiID0gcFN1YkNCLT5iZWdpbkluZm8ucEluaGVyaXRhbmNlSW5mby0+ZnJhbWVidWZmZXI7CisgICAgaWYgKHNlY29uZGFyeV9mYiAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICBpZiAocHJpbWFyeV9mYiAhPSBzZWNvbmRhcnlfZmIpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocHJpbWFyeUJ1ZmZlciksICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRXhlY3V0ZUNvbW1hbmRzKCkgY2FsbGVkIHcvIGludmFsaWQgc2Vjb25kYXJ5ICVzIHdoaWNoIGhhcyBhICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhhdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkgY29tbWFuZCBidWZmZXIncyBjdXJyZW50IGFjdGl2ZSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc2Vjb25kYXJ5QnVmZmVyKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlY29uZGFyeV9mYikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHByaW1hcnlfZmIpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGF1dG8gZmIgPSBHZXRGcmFtZWJ1ZmZlclN0YXRlKHNlY29uZGFyeV9mYik7CisgICAgICAgIGlmICghZmIpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocHJpbWFyeUJ1ZmZlciksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRTZWNvbmRhcnlDb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEV4ZWN1dGVDb21tYW5kcygpIGNhbGxlZCB3LyBpbnZhbGlkICVzIHdoaWNoIGhhcyBpbnZhbGlkICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzZWNvbmRhcnlCdWZmZXIpLmNfc3RyKCksIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc2Vjb25kYXJ5X2ZiKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBza2lwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlU2Vjb25kYXJ5Q29tbWFuZEJ1ZmZlclN0YXRlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnBDQiwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqcFN1YkNCKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgdW5vcmRlcmVkX3NldDxpbnQ+IGFjdGl2ZVR5cGVzOworICAgIGlmICghZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgeworICAgICAgICBmb3IgKGF1dG8gcXVlcnlPYmplY3QgOiBwQ0ItPmFjdGl2ZVF1ZXJpZXMpIHsKKyAgICAgICAgICAgIGF1dG8gcXVlcnlfcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5T2JqZWN0LnBvb2wpOworICAgICAgICAgICAgaWYgKHF1ZXJ5X3Bvb2xfc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVlcnlfcG9vbF9zdGF0ZS0+Y3JlYXRlSW5mby5xdWVyeVR5cGUgPT0gVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTICYmCisgICAgICAgICAgICAgICAgICAgIHBTdWJDQi0+YmVnaW5JbmZvLnBJbmhlcml0YW5jZUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3MgY21kQnVmU3RhdGlzdGljcyA9IHBTdWJDQi0+YmVnaW5JbmZvLnBJbmhlcml0YW5jZUluZm8tPnBpcGVsaW5lU3RhdGlzdGljczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjbWRCdWZTdGF0aXN0aWNzICYgcXVlcnlfcG9vbF9zdGF0ZS0+Y3JlYXRlSW5mby5waXBlbGluZVN0YXRpc3RpY3MpICE9IGNtZEJ1ZlN0YXRpc3RpY3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENCLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMDEwNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRXhlY3V0ZUNvbW1hbmRzKCkgY2FsbGVkIHcvIGludmFsaWQgJXMgd2hpY2ggaGFzIGludmFsaWQgYWN0aXZlICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIFBpcGVsaW5lIHN0YXRpc3RpY3MgaXMgYmVpbmcgcXVlcmllZCBzbyB0aGUgY29tbWFuZCBidWZmZXIgbXVzdCBoYXZlIGFsbCBiaXRzIHNldCBvbiB0aGUgcXVlcnlQb29sLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ0ItPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShxdWVyeU9iamVjdC5wb29sKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY3RpdmVUeXBlcy5pbnNlcnQocXVlcnlfcG9vbF9zdGF0ZS0+Y3JlYXRlSW5mby5xdWVyeVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBxdWVyeU9iamVjdCA6IHBTdWJDQi0+c3RhcnRlZFF1ZXJpZXMpIHsKKyAgICAgICAgICAgIGF1dG8gcXVlcnlfcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5T2JqZWN0LnBvb2wpOworICAgICAgICAgICAgaWYgKHF1ZXJ5X3Bvb2xfc3RhdGUgJiYgYWN0aXZlVHlwZXMuY291bnQocXVlcnlfcG9vbF9zdGF0ZS0+Y3JlYXRlSW5mby5xdWVyeVR5cGUpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENCLT5jb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFNlY29uZGFyeUNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEV4ZWN1dGVDb21tYW5kcygpIGNhbGxlZCB3LyBpbnZhbGlkICVzIHdoaWNoIGhhcyBpbnZhbGlkIGFjdGl2ZSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvZiB0eXBlICVkIGJ1dCBhIHF1ZXJ5IG9mIHRoYXQgdHlwZSBoYXMgYmVlbiBzdGFydGVkIG9uIHNlY29uZGFyeSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDQi0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShxdWVyeU9iamVjdC5wb29sKS5jX3N0cigpLCBxdWVyeV9wb29sX3N0YXRlLT5jcmVhdGVJbmZvLnF1ZXJ5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwU3ViQ0ItPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGF1dG8gcHJpbWFyeV9wb29sID0gcENCLT5jb21tYW5kX3Bvb2wuZ2V0KCk7CisgICAgYXV0byBzZWNvbmRhcnlfcG9vbCA9IHBTdWJDQi0+Y29tbWFuZF9wb29sLmdldCgpOworICAgIGlmIChwcmltYXJ5X3Bvb2wgJiYgc2Vjb25kYXJ5X3Bvb2wgJiYgKHByaW1hcnlfcG9vbC0+cXVldWVGYW1pbHlJbmRleCAhPSBzZWNvbmRhcnlfcG9vbC0+cXVldWVGYW1pbHlJbmRleCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBTdWJDQi0+Y29tbWFuZEJ1ZmZlciksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRRdWV1ZUZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEV4ZWN1dGVDb21tYW5kcygpOiBQcmltYXJ5ICVzIGNyZWF0ZWQgaW4gcXVldWUgZmFtaWx5ICVkIGhhcyBzZWNvbmRhcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNyZWF0ZWQgaW4gcXVldWUgZmFtaWx5ICVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDQi0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSwgcHJpbWFyeV9wb29sLT5xdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwU3ViQ0ItPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCksIHNlY29uZGFyeV9wb29sLT5xdWV1ZUZhbWlseUluZGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRFeGVjdXRlQ29tbWFuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJzQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKnN1Yl9jYl9zdGF0ZSA9IE5VTEw7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKj4gbGlua2VkX2NvbW1hbmRfYnVmZmVyczsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb21tYW5kQnVmZmVyc0NvdW50OyBpKyspIHsKKyAgICAgICAgc3ViX2NiX3N0YXRlID0gR2V0Q0JTdGF0ZShwQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICBhc3NlcnQoc3ViX2NiX3N0YXRlKTsKKyAgICAgICAgaWYgKFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlkgPT0gc3ViX2NiX3N0YXRlLT5jcmVhdGVJbmZvLmxldmVsKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDb21tYW5kQnVmZmVyc1tpXSksICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA4OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRXhlY3V0ZUNvbW1hbmRzKCkgY2FsbGVkIHcvIFByaW1hcnkgJXMgaW4gZWxlbWVudCAldSBvZiBwQ29tbWFuZEJ1ZmZlcnMgYXJyYXkuIEFsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNtZCBidWZmZXJzIGluIHBDb21tYW5kQnVmZmVycyBhcnJheSBtdXN0IGJlIHNlY29uZGFyeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENvbW1hbmRCdWZmZXJzW2ldKS5jX3N0cigpLCBpKTsKKyAgICAgICAgfSBlbHNlIGlmIChWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkgPT0gc3ViX2NiX3N0YXRlLT5jcmVhdGVJbmZvLmxldmVsKSB7CisgICAgICAgICAgICBpZiAoc3ViX2NiX3N0YXRlLT5iZWdpbkluZm8ucEluaGVyaXRhbmNlSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBzZWNvbmRhcnlfcnBfc3RhdGUgPSBHZXRSZW5kZXJQYXNzU3RhdGUoc3ViX2NiX3N0YXRlLT5iZWdpbkluZm8ucEluaGVyaXRhbmNlSW5mby0+cmVuZGVyUGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzICYmCisgICAgICAgICAgICAgICAgICAgICEoc3ViX2NiX3N0YXRlLT5iZWdpbkluZm8uZmxhZ3MgJiBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ29tbWFuZEJ1ZmZlcnNbaV0pLCAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRXhlY3V0ZUNvbW1hbmRzKCk6IFNlY29uZGFyeSAlcyBpcyBleGVjdXRlZCB3aXRoaW4gYSAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2Ugc2NvcGUsIGJ1dCB0aGUgU2Vjb25kYXJ5IENvbW1hbmQgQnVmZmVyIGRvZXMgbm90IGhhdmUgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQgc2V0IGluIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzo6ZmxhZ3Mgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHZrQmVnaW5Db21tYW5kQnVmZmVyKCkgd2FzIGNhbGxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ29tbWFuZEJ1ZmZlcnNbaV0pLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzLT5yZW5kZXJQYXNzKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjYl9zdGF0ZS0+YWN0aXZlUmVuZGVyUGFzcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1Yl9jYl9zdGF0ZS0+YmVnaW5JbmZvLmZsYWdzICYgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUKSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENvbW1hbmRCdWZmZXJzW2ldKSwgIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMTAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEV4ZWN1dGVDb21tYW5kcygpOiBTZWNvbmRhcnkgJXMgaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIHJlbmRlciBwYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBzY29wZSwgYnV0IHRoZSBTZWNvbmRhcnkgQ29tbWFuZCBCdWZmZXIgZG9lcyBoYXZlIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUIHNldCBpbiBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm86OmZsYWdzIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSB2a0JlZ2luQ29tbWFuZEJ1ZmZlcigpIHdhcyBjYWxsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocENvbW1hbmRCdWZmZXJzW2ldKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3ViX2NiX3N0YXRlLT5iZWdpbkluZm8uZmxhZ3MgJiBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSByZW5kZXIgcGFzcyBpcyBjb21wYXRpYmxlIHdpdGggcGFyZW50IGNvbW1hbmQgYnVmZmVyIHBhc3MgaWYgaGFzIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIChjYl9zdGF0ZS0+YWN0aXZlUmVuZGVyUGFzcy0+cmVuZGVyUGFzcyAhPSBzZWNvbmRhcnlfcnBfc3RhdGUtPnJlbmRlclBhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVSZW5kZXJQYXNzQ29tcGF0aWJpbGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpbWFyeSBjb21tYW5kIGJ1ZmZlciIsIGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzLCAic2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyIiwgc2Vjb25kYXJ5X3JwX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEV4ZWN1dGVDb21tYW5kcygpIiwgIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcEluaGVyaXRhbmNlSW5mby0wMDA5OCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vICBJZiBmcmFtZWJ1ZmZlciBmb3Igc2Vjb25kYXJ5IENCIGlzIG5vdCBOVUxMLCB0aGVuIGl0IG11c3QgbWF0Y2ggYWN0aXZlIEZCIGZyb20gcHJpbWFyeUNCCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlRnJhbWVidWZmZXIoY29tbWFuZEJ1ZmZlciwgY2Jfc3RhdGUsIHBDb21tYW5kQnVmZmVyc1tpXSwgc3ViX2NiX3N0YXRlLCAidmtDbWRFeGVjdXRlQ29tbWFuZHMoKSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Yl9jYl9zdGF0ZS0+Y21kX2V4ZWN1dGVfY29tbWFuZHNfZnVuY3Rpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICBJbmhlcml0IHByaW1hcnkncyBhY3RpdmVGcmFtZWJ1ZmZlciBhbmQgd2hpbGUgcnVubmluZyB2YWxpZGF0ZSBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byAmZnVuY3Rpb24gOiBzdWJfY2Jfc3RhdGUtPmNtZF9leGVjdXRlX2NvbW1hbmRzX2Z1bmN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gZnVuY3Rpb24oY2Jfc3RhdGUsIGNiX3N0YXRlLT5hY3RpdmVGcmFtZWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPKG1sZW50aW5lKTogTW92ZSBtb3JlIGxvZ2ljIGludG8gdGhpcyBtZXRob2QKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVNlY29uZGFyeUNvbW1hbmRCdWZmZXJTdGF0ZShjYl9zdGF0ZSwgc3ViX2NiX3N0YXRlKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNvbW1hbmRCdWZmZXJTdGF0ZShzdWJfY2Jfc3RhdGUsICJ2a0NtZEV4ZWN1dGVDb21tYW5kcygpIiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwODkiKTsKKyAgICAgICAgaWYgKCEoc3ViX2NiX3N0YXRlLT5iZWdpbkluZm8uZmxhZ3MgJiBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCkpIHsKKyAgICAgICAgICAgIGlmIChzdWJfY2Jfc3RhdGUtPmluX3VzZS5sb2FkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaW5kIHNvbWUgd2F5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgLTAwMDkwIGFuZCAtMDAwOTEgY29uZGl0aW9ucworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDkwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBleGVjdXRlIHBlbmRpbmcgJXMgd2l0aG91dCBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCBzZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzdWJfY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gV2UgdXNlIGFuIGNvbnN0X2Nhc3QsIGJlY2F1c2Ugb25lIGNhbm5vdCBxdWVyeSBhIGNvbnRhaW5lciBrZXllZCBvbiBhIG5vbi1jb25zdCBwb2ludGVyIHVzaW5nIGEgY29uc3QgcG9pbnRlcgorICAgICAgICAgICAgaWYgKGNiX3N0YXRlLT5saW5rZWRDb21tYW5kQnVmZmVycy5jb3VudChjb25zdF9jYXN0PENNRF9CVUZGRVJfU1RBVEUgKj4oc3ViX2NiX3N0YXRlKSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTIiLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGV4ZWN1dGUgJXMgd2l0aG91dCBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCBzZXQgaWYgcHJldmlvdXNseSBleGVjdXRlZCBpbiAlcyIsCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc3ViX2NiX3N0YXRlLT5jb21tYW5kQnVmZmVyKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgYXV0byBpbnNlcnRfcGFpciA9IGxpbmtlZF9jb21tYW5kX2J1ZmZlcnMuaW5zZXJ0KHN1Yl9jYl9zdGF0ZSk7CisgICAgICAgICAgICBpZiAoIWluc2VydF9wYWlyLnNlY29uZCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDkzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBkdXBsaWNhdGUgJXMgaW4gcENvbW1hbmRCdWZmZXJzIHdpdGhvdXQgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQgc2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2Jfc3RhdGUtPmJlZ2luSW5mby5mbGFncyAmIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUKSB7CisgICAgICAgICAgICAgICAgLy8gV2FybiB0aGF0IG5vbi1zaW11bHRhbmVvdXMgc2Vjb25kYXJ5IGNtZCBidWZmZXIgcmVuZGVycyBwcmltYXJ5IG5vbi1zaW11bHRhbmVvdXMKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDb21tYW5kQnVmZmVyc1tpXSksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRDb21tYW5kQnVmZmVyU2ltdWx0YW5lb3VzVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRFeGVjdXRlQ29tbWFuZHMoKTogU2Vjb25kYXJ5ICVzIGRvZXMgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQgc2V0IGFuZCB3aWxsIGNhdXNlIHByaW1hcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgdG8gYmUgdHJlYXRlZCBhcyBpZiBpdCBkb2VzIG5vdCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUIHNldCwgZXZlbiB0aG91Z2ggaXQgZG9lcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBDb21tYW5kQnVmZmVyc1tpXSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlcikuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjYl9zdGF0ZS0+YWN0aXZlUXVlcmllcy5lbXB0eSgpICYmICFlbmFibGVkX2ZlYXR1cmVzLmNvcmUuaW5oZXJpdGVkUXVlcmllcykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ29tbWFuZEJ1ZmZlcnNbaV0pLCAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRFeGVjdXRlQ29tbWFuZHMoKTogU2Vjb25kYXJ5ICVzIGNhbm5vdCBiZSBzdWJtaXR0ZWQgd2l0aCBhIHF1ZXJ5IGluIGZsaWdodCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmhlcml0ZWQgcXVlcmllcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwQ29tbWFuZEJ1ZmZlcnNbaV0pLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIC8vIFZhbGlkYXRlIGluaXRpYWwgbGF5b3V0IHVzZXMgdnMuIHRoZSBwcmltYXJ5IGNtZCBidWZmZXIgc3RhdGUKKyAgICAgICAgLy8gTm92ZWwgVmFsaWQgdXNhZ2U6ICJVTkFTU0lHTkVELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXItMDAwMDEiCisgICAgICAgIC8vIGluaXRpYWwgbGF5b3V0IHVzYWdlIG9mIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlcnMgcmVzb3VyY2VzIG11c3QgbWF0Y2ggcGFyZW50IGNvbW1hbmQgYnVmZmVyCisgICAgICAgIGNvbnN0IGF1dG8gKmNvbnN0X2NiX3N0YXRlID0gc3RhdGljX2Nhc3Q8Y29uc3QgQ01EX0JVRkZFUl9TVEFURSAqPihjYl9zdGF0ZSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3ViX2xheW91dF9tYXBfZW50cnkgOiBzdWJfY2Jfc3RhdGUtPmltYWdlX2xheW91dF9tYXApIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gaW1hZ2UgPSBzdWJfbGF5b3V0X21hcF9lbnRyeS5maXJzdDsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gKmltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgICAgICAgICBpZiAoIWltYWdlX3N0YXRlKSBjb250aW51ZTsgIC8vIENhbid0IHNldCBsYXlvdXRzIG9mIGEgZGVhZCBpbWFnZQorCisgICAgICAgICAgICBjb25zdCBhdXRvICpjYl9zdWJyZXNfbWFwID0gR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcChjb25zdF9jYl9zdGF0ZSwgaW1hZ2UpOworICAgICAgICAgICAgLy8gQ29uc3QgZ2V0dGVyIGNhbiBiZSBudWxsIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSBub3RoaW5nIHRvIGNoZWNrIGFnYWluc3QgZm9yIHRoaXMgaW1hZ2UuLi4KKyAgICAgICAgICAgIGlmICghY2Jfc3VicmVzX21hcCkgY29udGludWU7CisKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJnN1Yl9jYl9zdWJyZXNfbWFwID0gc3ViX2xheW91dF9tYXBfZW50cnkuc2Vjb25kOworICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGluaXRpYWxfdXNlcywgdGhhdCB0aGV5IG1hdGNoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwcmltYXJ5IGNiLCBvciBhYnNlbnQgYSBjdXJyZW50IHN0YXRlLAorICAgICAgICAgICAgLy8gdGhhdCB0aGUgbWF0Y2ggYW55IGluaXRpYWxfbGF5b3V0LgorICAgICAgICAgICAgZm9yIChhdXRvIGl0X2luaXQgPSBzdWJfY2Jfc3VicmVzX21hcC0+QmVnaW5Jbml0aWFsVXNlKCk7ICFpdF9pbml0LkF0RW5kKCk7ICsraXRfaW5pdCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJnN1Yl9sYXlvdXQgPSAoKml0X2luaXQpLmxheW91dDsKKyAgICAgICAgICAgICAgICBpZiAoVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCA9PSBzdWJfbGF5b3V0KSBjb250aW51ZTsgIC8vIHNlY29uZGFyeSBkb2Vzbid0IGNhcmUgYWJvdXQgY3VycmVudCBvciBpbml0aWFsCisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmc3VicmVzb3VyY2UgPSAoKml0X2luaXQpLnN1YnJlc291cmNlOworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIGN1cnJlbnQgbGF5b3V0IChpZiBhbnkpCisgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBjYl9sYXlvdXQgPSBjYl9zdWJyZXNfbWFwLT5HZXRTdWJyZXNvdXJjZUxheW91dChzdWJyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGF5b3V0X3R5cGUgPSAiY3VycmVudCI7CisgICAgICAgICAgICAgICAgaWYgKGNiX2xheW91dCA9PSBrSW52YWxpZExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGluaXRpYWwgbGF5b3V0IChpZiBhbnkpCisgICAgICAgICAgICAgICAgICAgIGNiX2xheW91dCA9IGNiX3N1YnJlc19tYXAtPkdldFN1YnJlc291cmNlSW5pdGlhbExheW91dChzdWJyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGxheW91dF90eXBlID0gImluaXRpYWwiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGNiX2xheW91dCAhPSBrSW52YWxpZExheW91dCkgJiYgKGNiX2xheW91dCAhPSBzdWJfbGF5b3V0KSkgeworICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQ29tbWFuZEJ1ZmZlcnNbaV0pLCAiVU5BU1NJR05FRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMDAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEV4ZWN1dGVkIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciB1c2luZyAlcyAoc3VicmVzb3VyY2U6IGFzcGVjdE1hc2sgMHglWCBhcnJheSBsYXllciAldSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXAgbGV2ZWwgJXUpIHdoaWNoIGV4cGVjdHMgbGF5b3V0ICVzLS1pbnN0ZWFkLCBpbWFnZSAlcyBsYXlvdXQgaXMgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRFeGVjdXRlQ29tbWFuZHMoKToiLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlKS5jX3N0cigpLCBzdWJyZXNvdXJjZS5hc3BlY3RNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlc291cmNlLmFycmF5TGF5ZXIsIHN1YnJlc291cmNlLm1pcExldmVsLCBzdHJpbmdfVmtJbWFnZUxheW91dChzdWJfbGF5b3V0KSwgbGF5b3V0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoY2JfbGF5b3V0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2tpcCB8PSBWYWxpZGF0ZVByaW1hcnlDb21tYW5kQnVmZmVyKGNiX3N0YXRlLCAidmtDbWRFeGVjdXRlQ29tbWFuZHMoKSIsICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWJ1ZmZlcmxldmVsIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsICJ2a0NtZEV4ZWN1dGVDb21tYW5kcygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19RVUVVRV9UUkFOU0ZFUl9CSVQgfCBWS19RVUVVRV9HUkFQSElDU19CSVQgfCBWS19RVUVVRV9DT01QVVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfRVhFQ1VURUNPTU1BTkRTLCAidmtDbWRFeGVjdXRlQ29tbWFuZHMoKSIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZU1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ZsYWdzIGZsYWdzLCB2b2lkICoqcHBEYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW0pOworICAgIGlmIChtZW1faW5mbykgeworICAgICAgICBpZiAoKHBoeXNfZGV2X21lbV9wcm9wcy5tZW1vcnlUeXBlc1ttZW1faW5mby0+YWxsb2NfaW5mby5tZW1vcnlUeXBlSW5kZXhdLnByb3BlcnR5RmxhZ3MgJgorICAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUKSA9PSAwKSB7CisgICAgICAgICAgICBza2lwID0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KG1lbSksICJWVUlELXZrTWFwTWVtb3J5LW1lbW9yeS0wMDY4MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFwcGluZyBNZW1vcnkgd2l0aG91dCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCBzZXQ6ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1lbSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU1hcE1lbVJhbmdlKG1lbV9pbmZvLCBvZmZzZXQsIHNpemUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQb3N0Q2FsbFJlY29yZE1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsIFZrRmxhZ3MgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwcERhdGEsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRNYXBNZW1vcnkoZGV2aWNlLCBtZW0sIG9mZnNldCwgc2l6ZSwgZmxhZ3MsIHBwRGF0YSwgcmVzdWx0KTsKKyAgICBJbml0aWFsaXplU2hhZG93TWVtb3J5KG1lbSwgb2Zmc2V0LCBzaXplLCBwcERhdGEpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZVVubWFwTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYXV0byBtZW1faW5mbyA9IEdldERldk1lbVN0YXRlKG1lbSk7CisgICAgaWYgKG1lbV9pbmZvICYmICFtZW1faW5mby0+bWFwcGVkX3JhbmdlLnNpemUpIHsKKyAgICAgICAgLy8gVmFsaWQgVXNhZ2U6IG1lbW9yeSBtdXN0IGN1cnJlbnRseSBiZSBtYXBwZWQKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtKSwgIlZVSUQtdmtVbm1hcE1lbW9yeS1tZW1vcnktMDA2ODkiLCAiVW5tYXBwaW5nIE1lbW9yeSB3aXRob3V0IG1lbW9yeSBiZWluZyBtYXBwZWQ6ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1lbSkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit2b2lkIENvcmVDaGVja3M6OlByZUNhbGxSZWNvcmRVbm1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSkgeworICAgIC8vIE9ubHkgY29yZSBjaGVja3MgdXNlcyB0aGUgc2hhZG93IGNvcHksIGNsZWFyIHRoYXQgdXAgaGVyZQorICAgIGF1dG8gbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW0pOworICAgIGlmIChtZW1faW5mbyAmJiBtZW1faW5mby0+c2hhZG93X2NvcHlfYmFzZSkgeworICAgICAgICBmcmVlKG1lbV9pbmZvLT5zaGFkb3dfY29weV9iYXNlKTsKKyAgICAgICAgbWVtX2luZm8tPnNoYWRvd19jb3B5X2Jhc2UgPSBudWxscHRyOworICAgICAgICBtZW1faW5mby0+c2hhZG93X2NvcHkgPSBudWxscHRyOworICAgICAgICBtZW1faW5mby0+c2hhZG93X3BhZF9zaXplID0gMDsKKyAgICB9CisgICAgU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkVW5tYXBNZW1vcnkoZGV2aWNlLCBtZW0pOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlTWVtb3J5SXNNYXBwZWQoY29uc3QgY2hhciAqZnVuY05hbWUsIHVpbnQzMl90IG1lbVJhbmdlQ291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UgKnBNZW1SYW5nZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWVtUmFuZ2VDb3VudDsgKytpKSB7CisgICAgICAgIGF1dG8gbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShwTWVtUmFuZ2VzW2ldLm1lbW9yeSk7CisgICAgICAgIGlmIChtZW1faW5mbykgeworICAgICAgICAgICAgaWYgKHBNZW1SYW5nZXNbaV0uc2l6ZSA9PSBWS19XSE9MRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgaWYgKG1lbV9pbmZvLT5tYXBwZWRfcmFuZ2Uub2Zmc2V0ID4gcE1lbVJhbmdlc1tpXS5vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocE1lbVJhbmdlc1tpXS5tZW1vcnkpLCAiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLXNpemUtMDA2ODYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBGbHVzaC9JbnZhbGlkYXRlIG9mZnNldCAoIiBQUklOVEZfU0laRV9UX1NQRUNJRklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgbGVzcyB0aGFuIE1lbW9yeSBPYmplY3QncyBvZmZzZXQgKCIgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHBNZW1SYW5nZXNbaV0ub2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obWVtX2luZm8tPm1hcHBlZF9yYW5nZS5vZmZzZXQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IGRhdGFfZW5kID0gKG1lbV9pbmZvLT5tYXBwZWRfcmFuZ2Uuc2l6ZSA9PSBWS19XSE9MRV9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbWVtX2luZm8tPmFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChtZW1faW5mby0+bWFwcGVkX3JhbmdlLm9mZnNldCArIG1lbV9pbmZvLT5tYXBwZWRfcmFuZ2Uuc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKChtZW1faW5mby0+bWFwcGVkX3JhbmdlLm9mZnNldCA+IHBNZW1SYW5nZXNbaV0ub2Zmc2V0KSB8fAorICAgICAgICAgICAgICAgICAgICAoZGF0YV9lbmQgPCAocE1lbVJhbmdlc1tpXS5vZmZzZXQgKyBwTWVtUmFuZ2VzW2ldLnNpemUpKSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwTWVtUmFuZ2VzW2ldLm1lbW9yeSksICJWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utc2l6ZS0wMDY4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEZsdXNoL0ludmFsaWRhdGUgc2l6ZSBvciBvZmZzZXQgKCIgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIgIiwgIiBQUklOVEZfU0laRV9UX1NQRUNJRklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZXhjZWVkIHRoZSBNZW1vcnkgT2JqZWN0J3MgdXBwZXItYm91bmQgKCIgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHBNZW1SYW5nZXNbaV0ub2Zmc2V0ICsgcE1lbVJhbmdlc1tpXS5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocE1lbVJhbmdlc1tpXS5vZmZzZXQpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGFfZW5kKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQW5kQ29weU5vbmNvaGVyZW50TWVtb3J5VG9Ecml2ZXIodWludDMyX3QgbWVtX3JhbmdlX2NvdW50LCBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlICptZW1fcmFuZ2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1lbV9yYW5nZV9jb3VudDsgKytpKSB7CisgICAgICAgIGF1dG8gbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW1fcmFuZ2VzW2ldLm1lbW9yeSk7CisgICAgICAgIGlmIChtZW1faW5mbykgeworICAgICAgICAgICAgaWYgKG1lbV9pbmZvLT5zaGFkb3dfY29weSkgeworICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBzaXplID0gKG1lbV9pbmZvLT5tYXBwZWRfcmFuZ2Uuc2l6ZSAhPSBWS19XSE9MRV9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbWVtX2luZm8tPm1hcHBlZF9yYW5nZS5zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobWVtX2luZm8tPmFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgLSBtZW1faW5mby0+bWFwcGVkX3JhbmdlLm9mZnNldCk7CisgICAgICAgICAgICAgICAgY2hhciAqZGF0YSA9IHN0YXRpY19jYXN0PGNoYXIgKj4obWVtX2luZm8tPnNoYWRvd19jb3B5KTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQ2NF90IGogPSAwOyBqIDwgbWVtX2luZm8tPnNoYWRvd19wYWRfc2l6ZTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2pdICE9IE5vbmNvaGVyZW50TWVtb3J5RmlsbFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtX3Jhbmdlc1tpXS5tZW1vcnkpLCBrVlVJRF9Db3JlX01lbVRyYWNrX0ludmFsaWRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSB1bmRlcmZsb3cgd2FzIGRldGVjdGVkIG9uICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShtZW1fcmFuZ2VzW2ldLm1lbW9yeSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICh1aW50NjRfdCBqID0gKHNpemUgKyBtZW1faW5mby0+c2hhZG93X3BhZF9zaXplKTsgaiA8ICgyICogbWVtX2luZm8tPnNoYWRvd19wYWRfc2l6ZSArIHNpemUpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFbal0gIT0gTm9uY29oZXJlbnRNZW1vcnlGaWxsVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtX3Jhbmdlc1tpXS5tZW1vcnkpLCBrVlVJRF9Db3JlX01lbVRyYWNrX0ludmFsaWRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IG92ZXJmbG93IHdhcyBkZXRlY3RlZCBvbiAlcy4iLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1lbV9yYW5nZXNbaV0ubWVtb3J5KS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkobWVtX2luZm8tPnBfZHJpdmVyX2RhdGEsIHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSArIG1lbV9pbmZvLT5zaGFkb3dfcGFkX3NpemUpLCAoc2l6ZV90KShzaXplKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6Q29weU5vbmNvaGVyZW50TWVtb3J5RnJvbURyaXZlcih1aW50MzJfdCBtZW1fcmFuZ2VfY291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UgKm1lbV9yYW5nZXMpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWVtX3JhbmdlX2NvdW50OyArK2kpIHsKKyAgICAgICAgYXV0byBtZW1faW5mbyA9IEdldERldk1lbVN0YXRlKG1lbV9yYW5nZXNbaV0ubWVtb3J5KTsKKyAgICAgICAgaWYgKG1lbV9pbmZvICYmIG1lbV9pbmZvLT5zaGFkb3dfY29weSkgeworICAgICAgICAgICAgVmtEZXZpY2VTaXplIHNpemUgPSAobWVtX2luZm8tPm1hcHBlZF9yYW5nZS5zaXplICE9IFZLX1dIT0xFX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1lbV9pbmZvLT5tYXBwZWRfcmFuZ2Uuc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobWVtX2luZm8tPmFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgLSBtZW1fcmFuZ2VzW2ldLm9mZnNldCk7CisgICAgICAgICAgICBjaGFyICpkYXRhID0gc3RhdGljX2Nhc3Q8Y2hhciAqPihtZW1faW5mby0+c2hhZG93X2NvcHkpOworICAgICAgICAgICAgbWVtY3B5KGRhdGEgKyBtZW1faW5mby0+c2hhZG93X3BhZF9zaXplLCBtZW1faW5mby0+cF9kcml2ZXJfZGF0YSwgKHNpemVfdCkoc2l6ZSkpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VEZXZpY2VMaW1pdHMoY29uc3QgY2hhciAqZnVuY19uYW1lLCB1aW50MzJfdCBtZW1fcmFuZ2VfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSAqbWVtX3JhbmdlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtZW1fcmFuZ2VfY291bnQ7ICsraSkgeworICAgICAgICB1aW50NjRfdCBhdG9tX3NpemUgPSBwaHlzX2Rldl9wcm9wcy5saW1pdHMubm9uQ29oZXJlbnRBdG9tU2l6ZTsKKyAgICAgICAgaWYgKFNhZmVNb2R1bG8obWVtX3Jhbmdlc1tpXS5vZmZzZXQsIGF0b21fc2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KG1lbV9yYW5nZXMtPm1lbW9yeSksICJWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utb2Zmc2V0LTAwNjg3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IE9mZnNldCBpbiBwTWVtUmFuZ2VzWyVkXSBpcyAweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgd2hpY2ggaXMgbm90IGEgbXVsdGlwbGUgb2YgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bm9uQ29oZXJlbnRBdG9tU2l6ZSAoMHglIiBQUkl4TEVBU1Q2NCAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgaSwgbWVtX3Jhbmdlc1tpXS5vZmZzZXQsIGF0b21fc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBtZW1faW5mbyA9IEdldERldk1lbVN0YXRlKG1lbV9yYW5nZXNbaV0ubWVtb3J5KTsKKyAgICAgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgICAgICBpZiAoKG1lbV9yYW5nZXNbaV0uc2l6ZSAhPSBWS19XSE9MRV9TSVpFKSAmJgorICAgICAgICAgICAgICAgIChtZW1fcmFuZ2VzW2ldLnNpemUgKyBtZW1fcmFuZ2VzW2ldLm9mZnNldCAhPSBtZW1faW5mby0+YWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSkgJiYKKyAgICAgICAgICAgICAgICAoU2FmZU1vZHVsbyhtZW1fcmFuZ2VzW2ldLnNpemUsIGF0b21fc2l6ZSkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KG1lbV9yYW5nZXMtPm1lbW9yeSksICJWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utc2l6ZS0wMTM5MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogU2l6ZSBpbiBwTWVtUmFuZ2VzWyVkXSBpcyAweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHdoaWNoIGlzIG5vdCBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om5vbkNvaGVyZW50QXRvbVNpemUgKDB4JSIgUFJJeExFQVNUNjQgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBpLCBtZW1fcmFuZ2VzW2ldLnNpemUsIGF0b21fc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1SYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlICpwTWVtUmFuZ2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlRGV2aWNlTGltaXRzKCJ2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIiwgbWVtUmFuZ2VDb3VudCwgcE1lbVJhbmdlcyk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUFuZENvcHlOb25jb2hlcmVudE1lbW9yeVRvRHJpdmVyKG1lbVJhbmdlQ291bnQsIHBNZW1SYW5nZXMpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc01hcHBlZCgidmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyIsIG1lbVJhbmdlQ291bnQsIHBNZW1SYW5nZXMpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1SYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UgKnBNZW1SYW5nZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VEZXZpY2VMaW1pdHMoInZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIsIG1lbVJhbmdlQ291bnQsIHBNZW1SYW5nZXMpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc01hcHBlZCgidmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIiwgbWVtUmFuZ2VDb3VudCwgcE1lbVJhbmdlcyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UG9zdENhbGxSZWNvcmRJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgbWVtUmFuZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UgKnBNZW1SYW5nZXMsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAvLyBVcGRhdGUgb3VyIHNoYWRvdyBjb3B5IHdpdGggbW9kaWZpZWQgZHJpdmVyIGRhdGEKKyAgICAgICAgQ29weU5vbmNvaGVyZW50TWVtb3J5RnJvbURyaXZlcihtZW1SYW5nZUNvdW50LCBwTWVtUmFuZ2VzKTsKKyAgICB9Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudChWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplICpwQ29tbWl0dGVkTWVtKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYXV0byBtZW1faW5mbyA9IEdldERldk1lbVN0YXRlKG1lbSk7CisKKyAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgaWYgKChwaHlzX2Rldl9tZW1fcHJvcHMubWVtb3J5VHlwZXNbbWVtX2luZm8tPmFsbG9jX2luZm8ubWVtb3J5VHlwZUluZGV4XS5wcm9wZXJ0eUZsYWdzICYKKyAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfTEFaSUxZX0FMTE9DQVRFRF9CSVQpID09IDApIHsKKyAgICAgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQobWVtKSwgIlZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LW1lbW9yeS0wMDY5MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnlpbmcgY29tbWl0bWVudCBmb3IgbWVtb3J5IHdpdGhvdXQgVktfTUVNT1JZX1BST1BFUlRZX0xBWklMWV9BTExPQ0FURURfQklUIHNldDogJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobWVtKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeShjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8gJmJpbmRJbmZvLCBjb25zdCBjaGFyICphcGlfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoYmluZEluZm8uaW1hZ2UpOworICAgIGlmIChpbWFnZV9zdGF0ZSkgeworICAgICAgICAvLyBUcmFjayBvYmplY3RzIHRpZWQgdG8gbWVtb3J5CisgICAgICAgIHVpbnQ2NF90IGltYWdlX2hhbmRsZSA9IEhhbmRsZVRvVWludDY0KGJpbmRJbmZvLmltYWdlKTsKKyAgICAgICAgc2tpcCA9IFZhbGlkYXRlU2V0TWVtQmluZGluZyhiaW5kSW5mby5tZW1vcnksIFZ1bGthblR5cGVkSGFuZGxlKGJpbmRJbmZvLmltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlKSwgYXBpX25hbWUpOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUtPmV4dGVybmFsX2Zvcm1hdF9hbmRyb2lkKSB7CisgICAgICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUtPm1lbW9yeV9yZXF1aXJlbWVudHNfY2hlY2tlZCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIGltYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9CaW5kSW1hZ2VfSW52YWxpZE1lbVJlcVF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IE11c3Qgbm90IGNhbGwgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyBvbiAlcyB0aGF0IHdpbGwgYmUgYm91bmQgdG8gYW4gZXh0ZXJuYWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpX25hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYmluZEluZm8uaW1hZ2UpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNraXA7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyAgICAgICAgLy8gVmFsaWRhdGUgYm91bmQgbWVtb3J5IHJhbmdlIGluZm9ybWF0aW9uCisgICAgICAgIGNvbnN0IGF1dG8gbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShiaW5kSW5mby5tZW1vcnkpOworICAgICAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbnNlcnRJbWFnZU1lbW9yeVJhbmdlKGJpbmRJbmZvLmltYWdlLCBtZW1faW5mbywgYmluZEluZm8ubWVtb3J5T2Zmc2V0LCBpbWFnZV9zdGF0ZS0+cmVxdWlyZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udGlsaW5nID09IFZLX0lNQUdFX1RJTElOR19MSU5FQVIsIGFwaV9uYW1lKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlUeXBlcyhtZW1faW5mbywgaW1hZ2Vfc3RhdGUtPnJlcXVpcmVtZW50cy5tZW1vcnlUeXBlQml0cywgYXBpX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAxMDQ3Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFsaWdubWVudAorICAgICAgICBpZiAoU2FmZU1vZHVsbyhiaW5kSW5mby5tZW1vcnlPZmZzZXQsIGltYWdlX3N0YXRlLT5yZXF1aXJlbWVudHMuYWxpZ25tZW50KSAhPSAwKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBpbWFnZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IG1lbW9yeU9mZnNldCBpcyAweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBidXQgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50czo6YWxpZ25tZW50IHZhbHVlIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIHdpdGggaW1hZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSwgYmluZEluZm8ubWVtb3J5T2Zmc2V0LCBpbWFnZV9zdGF0ZS0+cmVxdWlyZW1lbnRzLmFsaWdubWVudCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIG1lbW9yeSByZXF1aXJlbWVudHMgc2l6ZQorICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlLT5yZXF1aXJlbWVudHMuc2l6ZSA+IG1lbV9pbmZvLT5hbGxvY19pbmZvLmFsbG9jYXRpb25TaXplIC0gYmluZEluZm8ubWVtb3J5T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgaW1hZ2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQmluZEltYWdlTWVtb3J5LXNpemUtMDEwNDkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogbWVtb3J5IHNpemUgbWludXMgbWVtb3J5T2Zmc2V0IGlzIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIFZrTWVtb3J5UmVxdWlyZW1lbnRzOjpzaXplIHZhbHVlIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIHdpdGggaW1hZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSwgbWVtX2luZm8tPmFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgLSBiaW5kSW5mby5tZW1vcnlPZmZzZXQsIGltYWdlX3N0YXRlLT5yZXF1aXJlbWVudHMuc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIGRlZGljYXRlZCBhbGxvY2F0aW9uCisgICAgICAgICAgICBpZiAobWVtX2luZm8tPmlzX2RlZGljYXRlZCkgeworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkX2ZlYXR1cmVzLmRlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nX2ZlYXR1cmVzLmRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gb3JpZ19pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUobWVtX2luZm8tPmRlZGljYXRlZF9pbWFnZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gY3VycmVudF9pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoYmluZEluZm8uaW1hZ2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGJpbmRJbmZvLm1lbW9yeU9mZnNldCAhPSAwKSB8fCAhb3JpZ19pbWFnZV9zdGF0ZSB8fCAhY3VycmVudF9pbWFnZV9zdGF0ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIWN1cnJlbnRfaW1hZ2Vfc3RhdGUtPklzQ3JlYXRlSW5mb0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nQ29tcGF0aWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnX2ltYWdlX3N0YXRlLT5jcmVhdGVJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsaWRhdGlvbl9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYXBpX25hbWUsICJ2a0JpbmRJbWFnZU1lbW9yeSgpIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZXJyb3IgPSAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktMDI2MjkiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uX2Vycm9yID0gIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMjYzMSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIGltYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGZvciBkZWRpY2F0ZWQgbWVtb3J5IGFsbG9jYXRpb24gJXMsIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvS0hSOjogJXMgbXVzdCBjb21wYXRpYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoICVzIGFuZCBtZW1vcnlPZmZzZXQgMHglIiBQUkl4TEVBU1Q2NCAiIG11c3QgYmUgemVyby4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpX25hbWUsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYmluZEluZm8ubWVtb3J5KS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShtZW1faW5mby0+ZGVkaWNhdGVkX2ltYWdlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShiaW5kSW5mby5pbWFnZSkuY19zdHIoKSwgYmluZEluZm8ubWVtb3J5T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYmluZEluZm8ubWVtb3J5T2Zmc2V0ICE9IDApIHx8IChtZW1faW5mby0+ZGVkaWNhdGVkX2ltYWdlICE9IGJpbmRJbmZvLmltYWdlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsaWRhdGlvbl9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYXBpX25hbWUsICJ2a0JpbmRJbWFnZU1lbW9yeSgpIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZXJyb3IgPSAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktMDE1MDkiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uX2Vycm9yID0gIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMTkwMyI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIGltYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGZvciBkZWRpY2F0ZWQgbWVtb3J5IGFsbG9jYXRpb24gJXMsIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvS0hSOjogJXMgbXVzdCBiZSBlcXVhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYW5kIG1lbW9yeU9mZnNldCAweCUiIFBSSXhMRUFTVDY0ICIgbXVzdCBiZSB6ZXJvLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShiaW5kSW5mby5tZW1vcnkpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1lbV9pbmZvLT5kZWRpY2F0ZWRfaW1hZ2UpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGJpbmRJbmZvLmltYWdlKS5jX3N0cigpLCBiaW5kSW5mby5tZW1vcnlPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3QgYXV0byBzd2FwY2hhaW5faW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUj4oYmluZEluZm8ucE5leHQpOworICAgICAgICBpZiAoc3dhcGNoYWluX2luZm8pIHsKKyAgICAgICAgICAgIGlmIChiaW5kSW5mby5tZW1vcnkgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBpbWFnZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYzMSIsICIlczogJXMgaXMgbm90IFZLX05VTExfSEFORExFLiIsIGFwaV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGJpbmRJbmZvLm1lbW9yeSkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUtPmNyZWF0ZV9mcm9tX3N3YXBjaGFpbiAhPSBzd2FwY2hhaW5faW5mby0+c3dhcGNoYWluKSB7CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbWFnZV9zdGF0ZS0+aW1hZ2UpLCBrVlVJRF9Db3JlX0JpbmRJbWFnZU1lbW9yeV9Td2FwY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIGlzIGNyZWF0ZWQgYnkgJXMsIGJ1dCB0aGUgaW1hZ2UgaXMgYm91bmQgYnkgJXMuIFRoZSBpbWFnZSBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYm91bmQgYnkgdGhlIHNhbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN3YXBjaGFpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV9zdGF0ZS0+aW1hZ2UpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3N0YXRlLT5jcmVhdGVfZnJvbV9zd2FwY2hhaW4pLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHN3YXBjaGFpbl9pbmZvLT5zd2FwY2hhaW4pLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgYXV0byBzd2FwY2hhaW5fc3RhdGUgPSBHZXRTd2FwY2hhaW5TdGF0ZShzd2FwY2hhaW5faW5mby0+c3dhcGNoYWluKTsKKyAgICAgICAgICAgIGlmIChzd2FwY2hhaW5fc3RhdGUgJiYgc3dhcGNoYWluX3N0YXRlLT5pbWFnZXMuc2l6ZSgpIDw9IHN3YXBjaGFpbl9pbmZvLT5pbWFnZUluZGV4KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgaW1hZ2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUi1pbWFnZUluZGV4LTAxNjQ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGltYWdlSW5kZXggKCVpKSBpcyBvdXQgb2YgYm91bmRzIG9mICVzIGltYWdlcyAoc2l6ZTogJWkpIiwgYXBpX25hbWUsIHN3YXBjaGFpbl9pbmZvLT5pbWFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc3dhcGNoYWluX2luZm8tPnN3YXBjaGFpbikuY19zdHIoKSwgKGludClzd2FwY2hhaW5fc3RhdGUtPmltYWdlcy5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlLT5jcmVhdGVfZnJvbV9zd2FwY2hhaW4pIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBpbWFnZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS0wMTYzMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcE5leHQgb2YgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIGRvZXNuJ3QgaW5jbHVkZSBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIuIiwgYXBpX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtZW1faW5mbykgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIGltYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjMyIiwgIiVzOiAlcyBpcyBpbnZhbGlkLiIsIGFwaV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGJpbmRJbmZvLm1lbW9yeSkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQmluZEltYWdlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgVmtEZXZpY2VNZW1vcnkgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgY29uc3QgeworICAgIFZrQmluZEltYWdlTWVtb3J5SW5mbyBiaW5kSW5mbyA9IHt9OworICAgIGJpbmRJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTzsKKyAgICBiaW5kSW5mby5pbWFnZSA9IGltYWdlOworICAgIGJpbmRJbmZvLm1lbW9yeSA9IG1lbTsKKyAgICBiaW5kSW5mby5tZW1vcnlPZmZzZXQgPSBtZW1vcnlPZmZzZXQ7CisgICAgcmV0dXJuIFZhbGlkYXRlQmluZEltYWdlTWVtb3J5KGJpbmRJbmZvLCAidmtCaW5kSW1hZ2VNZW1vcnkoKSIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mb0tIUiAqcEJpbmRJbmZvcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNoYXIgYXBpX25hbWVbMTI4XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIHNwcmludGYoYXBpX25hbWUsICJ2a0JpbmRJbWFnZU1lbW9yeTIoKSBwQmluZEluZm9zWyV1XSIsIGkpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQmluZEltYWdlTWVtb3J5KHBCaW5kSW5mb3NbaV0sIGFwaV9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQmluZEltYWdlTWVtb3J5MktIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvS0hSICpwQmluZEluZm9zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY2hhciBhcGlfbmFtZVsxMjhdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kSW5mb0NvdW50OyBpKyspIHsKKyAgICAgICAgc3ByaW50ZihhcGlfbmFtZSwgInZrQmluZEltYWdlTWVtb3J5MktIUigpIHBCaW5kSW5mb3NbJXVdIiwgaSk7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkocEJpbmRJbmZvc1tpXSwgYXBpX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVTZXRFdmVudChWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBhdXRvIGV2ZW50X3N0YXRlID0gR2V0RXZlbnRTdGF0ZShldmVudCk7CisgICAgaWYgKGV2ZW50X3N0YXRlKSB7CisgICAgICAgIGlmIChldmVudF9zdGF0ZS0+d3JpdGVfaW5fdXNlKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRVZFTlRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGV2ZW50KSwga1ZVSURfQ29yZV9EcmF3U3RhdGVfUXVldWVGb3J3YXJkUHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIHZrU2V0RXZlbnQoKSBvbiAlcyB0aGF0IGlzIGFscmVhZHkgaW4gdXNlIGJ5IGEgY29tbWFuZCBidWZmZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGV2ZW50KS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVRdWV1ZUJpbmRTcGFyc2UoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyAqcEJpbmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGZW5jZSBmZW5jZSkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gcXVldWVfZGF0YSA9IEdldFF1ZXVlU3RhdGUocXVldWUpOworICAgIGNvbnN0IGF1dG8gcEZlbmNlID0gR2V0RmVuY2VTdGF0ZShmZW5jZSk7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVGZW5jZUZvclN1Ym1pdChwRmVuY2UpOworICAgIGlmIChza2lwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gcXVldWVGbGFncyA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUoKS0+cXVldWVfZmFtaWx5X3Byb3BlcnRpZXNbcXVldWVfZGF0YS0+cXVldWVGYW1pbHlJbmRleF0ucXVldWVGbGFnczsKKyAgICBpZiAoIShxdWV1ZUZsYWdzICYgVktfUVVFVUVfU1BBUlNFX0JJTkRJTkdfQklUKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQsIEhhbmRsZVRvVWludDY0KHF1ZXVlKSwKKyAgICAgICAgICAgICJWVUlELXZrUXVldWVCaW5kU3BhcnNlLXF1ZXVldHlwZSIsCisgICAgICAgICAgICAiQXR0ZW1wdGluZyB2a1F1ZXVlQmluZFNwYXJzZSBvbiBhIG5vbi1tZW1vcnktbWFuYWdlbWVudCBjYXBhYmxlIHF1ZXVlIC0tIFZLX1FVRVVFX1NQQVJTRV9CSU5ESU5HX0JJVCBub3Qgc2V0LiIpOworICAgIH0KKworICAgIHVub3JkZXJlZF9zZXQ8VmtTZW1hcGhvcmU+IHNpZ25hbGVkX3NlbWFwaG9yZXM7CisgICAgdW5vcmRlcmVkX3NldDxWa1NlbWFwaG9yZT4gdW5zaWduYWxlZF9zZW1hcGhvcmVzOworICAgIHVub3JkZXJlZF9zZXQ8VmtTZW1hcGhvcmU+IGludGVybmFsX3NlbWFwaG9yZXM7CisgICAgdW5vcmRlcmVkX21hcDxWa1NlbWFwaG9yZSwgc3RkOjpzZXQ8dWludDY0X3Q+PiB0aW1lbGluZV92YWx1ZXM7CisgICAgZm9yICh1aW50MzJfdCBiaW5kSWR4ID0gMDsgYmluZElkeCA8IGJpbmRJbmZvQ291bnQ7ICsrYmluZElkeCkgeworICAgICAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvICZiaW5kSW5mbyA9IHBCaW5kSW5mb1tiaW5kSWR4XTsKKworICAgICAgICBhdXRvIHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPihwQmluZEluZm8tPnBOZXh0KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U0VNQVBIT1JFX1dBSVQ+IHNlbWFwaG9yZV93YWl0czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VmtTZW1hcGhvcmU+IHNlbWFwaG9yZV9zaWduYWxzOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm8ud2FpdFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSA9IGJpbmRJbmZvLnBXYWl0U2VtYXBob3Jlc1tpXTsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gcFNlbWFwaG9yZSA9IEdldFNlbWFwaG9yZVN0YXRlKHNlbWFwaG9yZSk7CisgICAgICAgICAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiAmJiAhdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNlbWFwaG9yZSksICJWVUlELVZrQmluZFNwYXJzZUluZm8tcFdhaXRTZW1hcGhvcmVzLTAzMjQ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUXVldWVCaW5kU3BhcnNlOiAlcyBpcyBhIHRpbWVsaW5lIHNlbWFwaG9yZSwgYnV0IHBCaW5kSW5mbyBkb2VzIG5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUgYW4gaW5zdGFuY2Ugb2YgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiAmJiB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8gJiYKKyAgICAgICAgICAgICAgICBiaW5kSW5mby53YWl0U2VtYXBob3JlQ291bnQgIT0gdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLT53YWl0U2VtYXBob3JlVmFsdWVDb3VudCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBOZXh0LTAzMjQ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUXVldWVCaW5kU3BhcnNlOiAlcyBpcyBhIHRpbWVsaW5lIHNlbWFwaG9yZSwgaXQgY29udGFpbnMgYW4gaW5zdGFuY2Ugb2YiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiwgYnV0IHdhaXRTZW1hcGhvcmVWYWx1ZUNvdW50IGlzIGRpZmZlcmVudCB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhaXRTZW1hcGhvcmVDb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc2VtYXBob3JlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwU2VtYXBob3JlICYmIHBTZW1hcGhvcmUtPnR5cGUgPT0gVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiAmJgorICAgICAgICAgICAgICAgIChwU2VtYXBob3JlLT5zY29wZSA9PSBrU3luY1Njb3BlSW50ZXJuYWwgfHwgaW50ZXJuYWxfc2VtYXBob3Jlcy5jb3VudChzZW1hcGhvcmUpKSkgeworICAgICAgICAgICAgICAgIGlmICh1bnNpZ25hbGVkX3NlbWFwaG9yZXMuY291bnQoc2VtYXBob3JlKSB8fAorICAgICAgICAgICAgICAgICAgICAoIShzaWduYWxlZF9zZW1hcGhvcmVzLmNvdW50KHNlbWFwaG9yZSkpICYmICEocFNlbWFwaG9yZS0+c2lnbmFsZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNlbWFwaG9yZSksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX1F1ZXVlRm9yd2FyZFByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGlzIHdhaXRpbmcgb24gJXMgdGhhdCBoYXMgbm8gd2F5IHRvIGJlIHNpZ25hbGVkLiIsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVldWUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsZWRfc2VtYXBob3Jlcy5lcmFzZShzZW1hcGhvcmUpOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25hbGVkX3NlbWFwaG9yZXMuaW5zZXJ0KHNlbWFwaG9yZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSICYmCisgICAgICAgICAgICAgICAgcFNlbWFwaG9yZS0+c2NvcGUgPT0ga1N5bmNTY29wZUV4dGVybmFsVGVtcG9yYXJ5KSB7CisgICAgICAgICAgICAgICAgaW50ZXJuYWxfc2VtYXBob3Jlcy5pbnNlcnQoc2VtYXBob3JlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2tpcCAmJiBwU2VtYXBob3JlICYmIHBTZW1hcGhvcmUtPnR5cGUgPT0gVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSKSB7CisgICAgICAgICAgICAgICAgYXV0byAmdmFsdWVzID0gdGltZWxpbmVfdmFsdWVzW3NlbWFwaG9yZV07CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5pbnNlcnQocFNlbWFwaG9yZS0+cGF5bG9hZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlcy5pbnNlcnQodGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLT5wV2FpdFNlbWFwaG9yZVZhbHVlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm8uc2lnbmFsU2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlID0gYmluZEluZm8ucFNpZ25hbFNlbWFwaG9yZXNbaV07CisgICAgICAgICAgICBjb25zdCBhdXRvIHBTZW1hcGhvcmUgPSBHZXRTZW1hcGhvcmVTdGF0ZShzZW1hcGhvcmUpOworICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIgJiYgIXRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mbykgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBXYWl0U2VtYXBob3Jlcy0wMzI0NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1F1ZXVlQmluZFNwYXJzZTogJXMgaXMgYSB0aW1lbGluZSBzZW1hcGhvcmUsIGJ1dCBwQmluZEluZm8gZG9lcyBub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlIGFuIGluc3RhbmNlIG9mIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzZW1hcGhvcmUpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIgJiYgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvICYmCisgICAgICAgICAgICAgICAgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzW2ldIDw9IHBTZW1hcGhvcmUtPnBheWxvYWQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc2VtYXBob3JlKSwgIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wU2lnbmFsU2VtYXBob3Jlcy0wMzI0OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1F1ZXVlQmluZFNwYXJzZTogc2lnbmFsIHZhbHVlIGluICVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgdGltZWxpbmUgc2VtYXBob3JlICVzIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShxdWV1ZSkuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzZW1hcGhvcmUpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSA9PSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIgJiYgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvICYmCisgICAgICAgICAgICAgICAgYmluZEluZm8uc2lnbmFsU2VtYXBob3JlQ291bnQgIT0gdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLT5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNlbWFwaG9yZSksICJWVUlELVZrQmluZFNwYXJzZUluZm8tcE5leHQtMDMyNDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtRdWV1ZUJpbmRTcGFyc2U6ICVzIGlzIGEgdGltZWxpbmUgc2VtYXBob3JlLCBpdCBjb250YWlucyBhbiBpbnN0YW5jZSBvZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSLCBidXQgc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudCBpcyBkaWZmZXJlbnQgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWduYWxTZW1hcGhvcmVDb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoc2VtYXBob3JlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwU2VtYXBob3JlICYmIHBTZW1hcGhvcmUtPnR5cGUgPT0gVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiAmJiBwU2VtYXBob3JlLT5zY29wZSA9PSBrU3luY1Njb3BlSW50ZXJuYWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsZWRfc2VtYXBob3Jlcy5jb3VudChzZW1hcGhvcmUpIHx8ICghKHVuc2lnbmFsZWRfc2VtYXBob3Jlcy5jb3VudChzZW1hcGhvcmUpKSAmJiBwU2VtYXBob3JlLT5zaWduYWxlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9RdWV1ZUZvcndhcmRQcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpcyBzaWduYWxpbmcgJXMgdGhhdCB3YXMgcHJldmlvdXNseSBzaWduYWxlZCBieSAlcyBidXQgaGFzIG5vdCBzaW5jZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVlbiB3YWl0ZWQgb24gYnkgYW55IHF1ZXVlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXVlKS5jX3N0cigpLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocFNlbWFwaG9yZS0+c2lnbmFsZXIuZmlyc3QpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmFsZWRfc2VtYXBob3Jlcy5lcmFzZShzZW1hcGhvcmUpOworICAgICAgICAgICAgICAgICAgICBzaWduYWxlZF9zZW1hcGhvcmVzLmluc2VydChzZW1hcGhvcmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2tpcCAmJiBwU2VtYXBob3JlICYmIHBTZW1hcGhvcmUtPnR5cGUgPT0gVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSKSB7CisgICAgICAgICAgICAgICAgYXV0byAmdmFsdWVzID0gdGltZWxpbmVfdmFsdWVzW3NlbWFwaG9yZV07CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5pbnNlcnQocFNlbWFwaG9yZS0+cGF5bG9hZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlcy5pbnNlcnQodGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgYmluZElkeCA9IDA7IGJpbmRJZHggPCBiaW5kSW5mb0NvdW50OyArK2JpbmRJZHgpIHsKKyAgICAgICAgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyAqYmluZEluZm8gPSAmcEJpbmRJbmZvW2JpbmRJZHhdOworICAgICAgICBhdXRvICppbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI+KGJpbmRJbmZvLT5wTmV4dCk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvLT53YWl0U2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlID0gYmluZEluZm8tPnBXYWl0U2VtYXBob3Jlc1tpXTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZShxdWV1ZSwgc2VtYXBob3JlLCBpbmZvID8gaW5mby0+cFdhaXRTZW1hcGhvcmVWYWx1ZXNbaV0gOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lbGluZV92YWx1ZXMsICJWa1F1ZXVlQmluZFNwYXJzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wV2FpdFNlbWFwaG9yZXMtMDMyNTAiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm8tPnNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSA9IGJpbmRJbmZvLT5wU2lnbmFsU2VtYXBob3Jlc1tpXTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZShxdWV1ZSwgc2VtYXBob3JlLCBpbmZvID8gaW5mby0+cFNpZ25hbFNlbWFwaG9yZVZhbHVlc1tpXSA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVsaW5lX3ZhbHVlcywgIlZrUXVldWVCaW5kU3BhcnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBTaWduYWxTZW1hcGhvcmVzLTAzMjUxIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVTaWduYWxTZW1hcGhvcmVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgKnBTaWduYWxJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYXV0byBwU2VtYXBob3JlID0gR2V0U2VtYXBob3JlU3RhdGUocFNpZ25hbEluZm8tPnNlbWFwaG9yZSk7CisgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSAhPSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwU2lnbmFsSW5mby0+c2VtYXBob3JlKSwgIlZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXNlbWFwaG9yZS0wMzI1NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtTaWduYWxTZW1hcGhvcmVLSFI6IHNlbWFwaG9yZSAlcyBtdXN0IGJlIG9mIFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocFNpZ25hbEluZm8tPnNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUltcG9ydFNlbWFwaG9yZShWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIGNvbnN0IGNoYXIgKmNhbGxlcl9uYW1lKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgU0VNQVBIT1JFX1NUQVRFICpzZW1hX25vZGUgPSBHZXRTZW1hcGhvcmVTdGF0ZShzZW1hcGhvcmUpOworICAgIGlmIChzZW1hX25vZGUpIHsKKyAgICAgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChzZW1hcGhvcmUsIGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdE5vdEluVXNlKHNlbWFfbm9kZSwgb2JqX3N0cnVjdCwgY2FsbGVyX25hbWUsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgKnBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsaWRhdGVJbXBvcnRTZW1hcGhvcmUocEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby0+c2VtYXBob3JlLCAidmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIpOworfQorCisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVJbXBvcnRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSICpwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlSW1wb3J0U2VtYXBob3JlKHBJbXBvcnRTZW1hcGhvcmVGZEluZm8tPnNlbWFwaG9yZSwgInZrSW1wb3J0U2VtYXBob3JlRmRLSFIiKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUltcG9ydEZlbmNlKFZrRmVuY2UgZmVuY2UsIGNvbnN0IGNoYXIgKmNhbGxlcl9uYW1lKSBjb25zdCB7CisgICAgY29uc3QgRkVOQ0VfU1RBVEUgKmZlbmNlX25vZGUgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZmVuY2Vfbm9kZSAmJiBmZW5jZV9ub2RlLT5zY29wZSA9PSBrU3luY1Njb3BlSW50ZXJuYWwgJiYgZmVuY2Vfbm9kZS0+c3RhdGUgPT0gRkVOQ0VfSU5GTElHSFQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZmVuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURVbmRlZmluZWQsICJDYW5ub3QgY2FsbCAlcyBvbiAlcyB0aGF0IGlzIGN1cnJlbnRseSBpbiB1c2UuIiwgY2FsbGVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGZlbmNlKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICpwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsaWRhdGVJbXBvcnRGZW5jZShwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8tPmZlbmNlLCAidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIik7Cit9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVJbXBvcnRGZW5jZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiAqcEltcG9ydEZlbmNlRmRJbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlSW1wb3J0RmVuY2UocEltcG9ydEZlbmNlRmRJbmZvLT5mZW5jZSwgInZrSW1wb3J0RmVuY2VGZEtIUiIpOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ3JlYXRlU3dhcGNoYWluKGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0ICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1VSRkFDRV9TVEFURSAqc3VyZmFjZV9zdGF0ZSwgY29uc3QgU1dBUENIQUlOX05PREUgKm9sZF9zd2FwY2hhaW5fc3RhdGUpIGNvbnN0IHsKKyAgICAvLyBBbGwgcGh5c2ljYWwgZGV2aWNlcyBhbmQgcXVldWUgZmFtaWxpZXMgYXJlIHJlcXVpcmVkIHRvIGJlIGFibGUgdG8gcHJlc2VudCB0byBhbnkgbmF0aXZlIHdpbmRvdyBvbiBBbmRyb2lkOyByZXF1aXJlIHRoZQorICAgIC8vIGFwcGxpY2F0aW9uIHRvIGhhdmUgZXN0YWJsaXNoZWQgc3VwcG9ydCBvbiBhbnkgb3RoZXIgcGxhdGZvcm0uCisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9hbmRyb2lkX3N1cmZhY2UpIHsKKyAgICAgICAgYXV0byBzdXBwb3J0X3ByZWRpY2F0ZSA9IFt0aGlzXShkZWNsdHlwZShzdXJmYWNlX3N0YXRlLT5ncHVfcXVldWVfc3VwcG9ydCk6OnZhbHVlX3R5cGUgcXMpIC0+IGJvb2wgeworICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHJlc3RyaWN0IHNlYXJjaCBvbmx5IHRvIHF1ZXVlIGZhbWlsaWVzIG9mIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvcywgbm90IHdob2xlIHBoeXMuIGRldmljZQorICAgICAgICAgICAgcmV0dXJuIChxcy5maXJzdC5ncHUgPT0gcGh5c2ljYWxfZGV2aWNlKSAmJiBxcy5zZWNvbmQ7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IGF1dG8gJnN1cHBvcnQgPSBzdXJmYWNlX3N0YXRlLT5ncHVfcXVldWVfc3VwcG9ydDsKKyAgICAgICAgYm9vbCBpc19zdXBwb3J0ZWQgPSBzdGQ6OmFueV9vZihzdXBwb3J0LmJlZ2luKCksIHN1cHBvcnQuZW5kKCksIHN1cHBvcnRfcHJlZGljYXRlKTsKKworICAgICAgICBpZiAoIWlzX3N1cHBvcnRlZCkgeworICAgICAgICAgICAgaWYgKGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zdXJmYWNlLTAxMjcwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogcENyZWF0ZUluZm8tPnN1cmZhY2UgaXMgbm90IGtub3duIGF0IHRoaXMgdGltZSB0byBiZSBzdXBwb3J0ZWQgZm9yIHByZXNlbnRhdGlvbiBieSB0aGlzIGRldmljZS4gVGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmVoYW5kLCBhbmQgaXQgbXVzdCByZXR1cm4gVktfVFJVRSBzdXBwb3J0IHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgc3VyZmFjZSBmb3IgYXQgbGVhc3Qgb25lIHF1ZXVlIGZhbWlseSBvZiB0aGlzIGRldmljZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvbGRfc3dhcGNoYWluX3N0YXRlKSB7CisgICAgICAgIGlmIChvbGRfc3dhcGNoYWluX3N0YXRlLT5jcmVhdGVJbmZvLnN1cmZhY2UgIT0gcENyZWF0ZUluZm8tPnN1cmZhY2UpIHsKKyAgICAgICAgICAgIGlmIChsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocENyZWF0ZUluZm8tPm9sZFN3YXBjaGFpbiksICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1vbGRTd2FwY2hhaW4tMDE5MzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwQ3JlYXRlSW5mby0+b2xkU3dhcGNoYWluJ3Mgc3VyZmFjZSBpcyBub3QgcENyZWF0ZUluZm8tPnN1cmZhY2UiLCBmdW5jX25hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvbGRfc3dhcGNoYWluX3N0YXRlLT5yZXRpcmVkKSB7CisgICAgICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBDcmVhdGVJbmZvLT5vbGRTd2FwY2hhaW4pLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItb2xkU3dhcGNoYWluLTAxOTMzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogcENyZWF0ZUluZm8tPm9sZFN3YXBjaGFpbiBpcyByZXRpcmVkIiwgZnVuY19uYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocENyZWF0ZUluZm8tPmltYWdlRXh0ZW50LndpZHRoID09IDApIHx8IChwQ3JlYXRlSW5mby0+aW1hZ2VFeHRlbnQuaGVpZ2h0ID09IDApKSB7CisgICAgICAgIGlmIChsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUV4dGVudC0wMTY4OSIsICIlczogcENyZWF0ZUluZm8tPmltYWdlRXh0ZW50ID0gKCVkLCAlZCkgd2hpY2ggaXMgaWxsZWdhbC4iLAorICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIHBDcmVhdGVJbmZvLT5pbWFnZUV4dGVudC53aWR0aCwgcENyZWF0ZUluZm8tPmltYWdlRXh0ZW50LmhlaWdodCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBhdXRvIHBoeXNpY2FsX2RldmljZV9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUoKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBjdXJyZW50VHJhbnNmb3JtID0gcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5zdXJmYWNlQ2FwYWJpbGl0aWVzLmN1cnJlbnRUcmFuc2Zvcm07CisgICAgaWYgKChwQ3JlYXRlSW5mby0+cHJlVHJhbnNmb3JtICYgY3VycmVudFRyYW5zZm9ybSkgIT0gcENyZWF0ZUluZm8tPnByZVRyYW5zZm9ybSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGh5c2ljYWxfZGV2aWNlKSwga1ZVSURfQ29yZV9Td2FwY2hhaW5fUHJlVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwQ3JlYXRlSW5mby0+cHJlVHJhbnNmb3JtICglcykgZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudFRyYW5zZm9ybSAoJXMpIHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiwgdGhlIHByZXNlbnRhdGlvbiBlbmdpbmUgd2lsbCB0cmFuc2Zvcm0gdGhlIGltYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50IGFzIHBhcnQgb2YgdGhlIHByZXNlbnRhdGlvbiBvcGVyYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgc3RyaW5nX1ZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSKHBDcmVhdGVJbmZvLT5wcmVUcmFuc2Zvcm0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSKGN1cnJlbnRUcmFuc2Zvcm0pKTsKKyAgICB9CisKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY2FwYWJpbGl0aWVze307CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5waHlzX2RldmljZSwgcENyZWF0ZUluZm8tPnN1cmZhY2UsICZjYXBhYmlsaXRpZXMpOworICAgIC8vIFZhbGlkYXRlIHBDcmVhdGVJbmZvLT5taW5JbWFnZUNvdW50IGFnYWluc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOjp7bWlufG1heH1JbWFnZUNvdW50OgorICAgIGlmIChwQ3JlYXRlSW5mby0+bWluSW1hZ2VDb3VudCA8IGNhcGFiaWxpdGllcy5taW5JbWFnZUNvdW50KSB7CisgICAgICAgIGlmIChsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1taW5JbWFnZUNvdW50LTAxMjcxIiwKKyAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGxlZCB3aXRoIG1pbkltYWdlQ291bnQgPSAlZCwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgYm91bmRzIHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCkgKGkuZS4gbWluSW1hZ2VDb3VudCA9ICVkLCBtYXhJbWFnZUNvdW50ID0gJWQpLiIsCisgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgcENyZWF0ZUluZm8tPm1pbkltYWdlQ291bnQsIGNhcGFiaWxpdGllcy5taW5JbWFnZUNvdW50LCBjYXBhYmlsaXRpZXMubWF4SW1hZ2VDb3VudCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoKGNhcGFiaWxpdGllcy5tYXhJbWFnZUNvdW50ID4gMCkgJiYgKHBDcmVhdGVJbmZvLT5taW5JbWFnZUNvdW50ID4gY2FwYWJpbGl0aWVzLm1heEltYWdlQ291bnQpKSB7CisgICAgICAgIGlmIChsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1taW5JbWFnZUNvdW50LTAxMjcyIiwKKyAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGxlZCB3aXRoIG1pbkltYWdlQ291bnQgPSAlZCwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgYm91bmRzIHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCkgKGkuZS4gbWluSW1hZ2VDb3VudCA9ICVkLCBtYXhJbWFnZUNvdW50ID0gJWQpLiIsCisgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgcENyZWF0ZUluZm8tPm1pbkltYWdlQ291bnQsIGNhcGFiaWxpdGllcy5taW5JbWFnZUNvdW50LCBjYXBhYmlsaXRpZXMubWF4SW1hZ2VDb3VudCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBwQ3JlYXRlSW5mby0+aW1hZ2VFeHRlbnQgYWdhaW5zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI6OntjdXJyZW50fG1pbnxtYXh9SW1hZ2VFeHRlbnQ6CisgICAgaWYgKChwQ3JlYXRlSW5mby0+aW1hZ2VFeHRlbnQud2lkdGggPCBjYXBhYmlsaXRpZXMubWluSW1hZ2VFeHRlbnQud2lkdGgpIHx8CisgICAgICAgIChwQ3JlYXRlSW5mby0+aW1hZ2VFeHRlbnQud2lkdGggPiBjYXBhYmlsaXRpZXMubWF4SW1hZ2VFeHRlbnQud2lkdGgpIHx8CisgICAgICAgIChwQ3JlYXRlSW5mby0+aW1hZ2VFeHRlbnQuaGVpZ2h0IDwgY2FwYWJpbGl0aWVzLm1pbkltYWdlRXh0ZW50LmhlaWdodCkgfHwKKyAgICAgICAgKHBDcmVhdGVJbmZvLT5pbWFnZUV4dGVudC5oZWlnaHQgPiBjYXBhYmlsaXRpZXMubWF4SW1hZ2VFeHRlbnQuaGVpZ2h0KSkgeworICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VFeHRlbnQtMDEyNzQiLAorICAgICAgICAgICAgICAgICAgICAiJXMgY2FsbGVkIHdpdGggaW1hZ2VFeHRlbnQgPSAoJWQsJWQpLCB3aGljaCBpcyBvdXRzaWRlIHRoZSBib3VuZHMgcmV0dXJuZWQgYnkgIgorICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoKTogY3VycmVudEV4dGVudCA9ICglZCwlZCksIG1pbkltYWdlRXh0ZW50ID0gKCVkLCVkKSwgIgorICAgICAgICAgICAgICAgICAgICAibWF4SW1hZ2VFeHRlbnQgPSAoJWQsJWQpLiIsCisgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgcENyZWF0ZUluZm8tPmltYWdlRXh0ZW50LndpZHRoLCBwQ3JlYXRlSW5mby0+aW1hZ2VFeHRlbnQuaGVpZ2h0LCBjYXBhYmlsaXRpZXMuY3VycmVudEV4dGVudC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmN1cnJlbnRFeHRlbnQuaGVpZ2h0LCBjYXBhYmlsaXRpZXMubWluSW1hZ2VFeHRlbnQud2lkdGgsIGNhcGFiaWxpdGllcy5taW5JbWFnZUV4dGVudC5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5tYXhJbWFnZUV4dGVudC53aWR0aCwgY2FwYWJpbGl0aWVzLm1heEltYWdlRXh0ZW50LmhlaWdodCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gcENyZWF0ZUluZm8tPnByZVRyYW5zZm9ybSBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBiaXQgc2V0LCBhbmQgdGhhdCBiaXQgbXVzdCBhbHNvIGJlIHNldCBpbgorICAgIC8vIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUjo6c3VwcG9ydGVkVHJhbnNmb3Jtcy4KKyAgICBpZiAoIXBDcmVhdGVJbmZvLT5wcmVUcmFuc2Zvcm0gfHwgKHBDcmVhdGVJbmZvLT5wcmVUcmFuc2Zvcm0gJiAocENyZWF0ZUluZm8tPnByZVRyYW5zZm9ybSAtIDEpKSB8fAorICAgICAgICAhKHBDcmVhdGVJbmZvLT5wcmVUcmFuc2Zvcm0gJiBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkVHJhbnNmb3JtcykpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhbiBlcnJvciBzaXR1YXRpb247IG9uZSBmb3Igd2hpY2ggd2UnZCBsaWtlIHRvIGdpdmUgdGhlIGRldmVsb3BlciBhIGhlbHBmdWwsIG11bHRpLWxpbmUgZXJyb3IgbWVzc2FnZS4gIEJ1aWxkCisgICAgICAgIC8vIGl0IHVwIGEgbGl0dGxlIGF0IGEgdGltZSwgYW5kIHRoZW4gbG9nIGl0OgorICAgICAgICBzdGQ6OnN0cmluZyBlcnJvclN0cmluZyA9ICIiOworICAgICAgICBjaGFyIHN0clsxMDI0XTsKKyAgICAgICAgLy8gSGVyZSdzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBtZXNzYWdlOgorICAgICAgICBzcHJpbnRmKHN0ciwgIiVzIGNhbGxlZCB3aXRoIGEgbm9uLXN1cHBvcnRlZCBwQ3JlYXRlSW5mby0+cHJlVHJhbnNmb3JtIChpLmUuICVzKS4gIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOlxuIiwgZnVuY19uYW1lLAorICAgICAgICAgICAgICAgIHN0cmluZ19Wa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUihwQ3JlYXRlSW5mby0+cHJlVHJhbnNmb3JtKSk7CisgICAgICAgIGVycm9yU3RyaW5nICs9IHN0cjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgICAgICAvLyBCdWlsZCB1cCB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZToKKyAgICAgICAgICAgIGlmICgoMSA8PCBpKSAmIGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRUcmFuc2Zvcm1zKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmV3U3RyID0gc3RyaW5nX1ZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSKChWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUikoMSA8PCBpKSk7CisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIgICAgJXNcbiIsIG5ld1N0cik7CisgICAgICAgICAgICAgICAgZXJyb3JTdHJpbmcgKz0gc3RyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSB0aGF0IHdlJ3ZlIGJ1aWx0IHVwOgorICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcHJlVHJhbnNmb3JtLTAxMjc5IiwgIiVzLiIsIGVycm9yU3RyaW5nLmNfc3RyKCkpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcENyZWF0ZUluZm8tPmNvbXBvc2l0ZUFscGhhIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGJpdCBzZXQsIGFuZCB0aGF0IGJpdCBtdXN0IGFsc28gYmUgc2V0IGluCisgICAgLy8gVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOjpzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYQorICAgIGlmICghcENyZWF0ZUluZm8tPmNvbXBvc2l0ZUFscGhhIHx8IChwQ3JlYXRlSW5mby0+Y29tcG9zaXRlQWxwaGEgJiAocENyZWF0ZUluZm8tPmNvbXBvc2l0ZUFscGhhIC0gMSkpIHx8CisgICAgICAgICEoKHBDcmVhdGVJbmZvLT5jb21wb3NpdGVBbHBoYSkgJiBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgYW4gZXJyb3Igc2l0dWF0aW9uOyBvbmUgZm9yIHdoaWNoIHdlJ2QgbGlrZSB0byBnaXZlIHRoZSBkZXZlbG9wZXIgYSBoZWxwZnVsLCBtdWx0aS1saW5lIGVycm9yIG1lc3NhZ2UuICBCdWlsZAorICAgICAgICAvLyBpdCB1cCBhIGxpdHRsZSBhdCBhIHRpbWUsIGFuZCB0aGVuIGxvZyBpdDoKKyAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3JTdHJpbmcgPSAiIjsKKyAgICAgICAgY2hhciBzdHJbMTAyNF07CisgICAgICAgIC8vIEhlcmUncyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgbWVzc2FnZToKKyAgICAgICAgc3ByaW50ZihzdHIsICIlcyBjYWxsZWQgd2l0aCBhIG5vbi1zdXBwb3J0ZWQgcENyZWF0ZUluZm8tPmNvbXBvc2l0ZUFscGhhIChpLmUuICVzKS4gIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOlxuIiwgZnVuY19uYW1lLAorICAgICAgICAgICAgICAgIHN0cmluZ19Wa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIocENyZWF0ZUluZm8tPmNvbXBvc2l0ZUFscGhhKSk7CisgICAgICAgIGVycm9yU3RyaW5nICs9IHN0cjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgICAgICAvLyBCdWlsZCB1cCB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZToKKyAgICAgICAgICAgIGlmICgoMSA8PCBpKSAmIGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5ld1N0ciA9IHN0cmluZ19Wa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIoKFZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUikoMSA8PCBpKSk7CisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIgICAgJXNcbiIsIG5ld1N0cik7CisgICAgICAgICAgICAgICAgZXJyb3JTdHJpbmcgKz0gc3RyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSB0aGF0IHdlJ3ZlIGJ1aWx0IHVwOgorICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItY29tcG9zaXRlQWxwaGEtMDEyODAiLCAiJXMuIiwgZXJyb3JTdHJpbmcuY19zdHIoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVmFsaWRhdGUgcENyZWF0ZUluZm8tPmltYWdlQXJyYXlMYXllcnMgYWdhaW5zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI6Om1heEltYWdlQXJyYXlMYXllcnM6CisgICAgaWYgKHBDcmVhdGVJbmZvLT5pbWFnZUFycmF5TGF5ZXJzID4gY2FwYWJpbGl0aWVzLm1heEltYWdlQXJyYXlMYXllcnMpIHsKKyAgICAgICAgaWYgKGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlQXJyYXlMYXllcnMtMDEyNzUiLAorICAgICAgICAgICAgICAgICAgICAiJXMgY2FsbGVkIHdpdGggYSBub24tc3VwcG9ydGVkIGltYWdlQXJyYXlMYXllcnMgKGkuZS4gJWQpLiAgTWF4aW11bSB2YWx1ZSBpcyAlZC4iLCBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5pbWFnZUFycmF5TGF5ZXJzLCBjYXBhYmlsaXRpZXMubWF4SW1hZ2VBcnJheUxheWVycykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVmFsaWRhdGUgcENyZWF0ZUluZm8tPmltYWdlVXNhZ2UgYWdhaW5zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI6OnN1cHBvcnRlZFVzYWdlRmxhZ3M6CisgICAgaWYgKHBDcmVhdGVJbmZvLT5pbWFnZVVzYWdlICE9IChwQ3JlYXRlSW5mby0+aW1hZ2VVc2FnZSAmIGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRVc2FnZUZsYWdzKSkgeworICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VVc2FnZS0wMTI3NiIsCisgICAgICAgICAgICAgICAgICAgICIlcyBjYWxsZWQgd2l0aCBhIG5vbi1zdXBwb3J0ZWQgcENyZWF0ZUluZm8tPmltYWdlVXNhZ2UgKGkuZS4gMHglMDh4KS4gIFN1cHBvcnRlZCBmbGFnIGJpdHMgYXJlIDB4JTA4eC4iLAorICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIHBDcmVhdGVJbmZvLT5pbWFnZVVzYWdlLCBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkVXNhZ2VGbGFncykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2VfcHJvdGVjdGVkX2NhcGFiaWxpdGllcyAmJiAocENyZWF0ZUluZm8tPmZsYWdzICYgVktfU1dBUENIQUlOX0NSRUFURV9QUk9URUNURURfQklUX0tIUikpIHsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBzdXJmYWNlSW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VSRkFDRV9JTkZPXzJfS0hSfTsKKyAgICAgICAgc3VyZmFjZUluZm8uc3VyZmFjZSA9IHBDcmVhdGVJbmZvLT5zdXJmYWNlOworICAgICAgICBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgc3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllcyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfS0hSfTsKKyAgICAgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiBzdXJmYWNlQ2FwYWJpbGl0aWVzID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfS0hSfTsKKyAgICAgICAgc3VyZmFjZUNhcGFiaWxpdGllcy5wTmV4dCA9ICZzdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzOworICAgICAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIocGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5waHlzX2RldmljZSwgJnN1cmZhY2VJbmZvLCAmc3VyZmFjZUNhcGFiaWxpdGllcyk7CisKKyAgICAgICAgaWYgKCFzdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzLnN1cHBvcnRzUHJvdGVjdGVkKSB7CisgICAgICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWZsYWdzLTAzMTg3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogcENyZWF0ZUluZm8tPmZsYWdzIGNvbnRhaW5zIFZLX1NXQVBDSEFJTl9DUkVBVEVfUFJPVEVDVEVEX0JJVF9LSFIgYnV0IHRoZSBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXRpZXMgZG9lcyBub3QgaGF2ZSBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIuc3VwcG9ydHNQcm90ZWN0ZWQgc2V0IHRvIFZLX1RSVUUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxWa1N1cmZhY2VGb3JtYXRLSFI+IHN1cmZhY2VfZm9ybWF0czsKKyAgICBjb25zdCBhdXRvICpzdXJmYWNlX2Zvcm1hdHNfcmVmID0gJnN1cmZhY2VfZm9ybWF0czsKKworICAgIC8vIFZhbGlkYXRlIHBDcmVhdGVJbmZvIHZhbHVlcyB3aXRoIHRoZSByZXN1bHRzIG9mIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUigpOgorICAgIGlmIChwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnN1cmZhY2VfZm9ybWF0cy5lbXB0eSgpKSB7CisgICAgICAgIHVpbnQzMl90IHN1cmZhY2VfZm9ybWF0X2NvdW50ID0gMDsKKyAgICAgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNpY2FsX2RldmljZSwgcENyZWF0ZUluZm8tPnN1cmZhY2UsICZzdXJmYWNlX2Zvcm1hdF9jb3VudCwgbnVsbHB0cik7CisgICAgICAgIHN1cmZhY2VfZm9ybWF0cy5yZXNpemUoc3VyZmFjZV9mb3JtYXRfY291bnQpOworICAgICAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIocGh5c2ljYWxfZGV2aWNlLCBwQ3JlYXRlSW5mby0+c3VyZmFjZSwgJnN1cmZhY2VfZm9ybWF0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1cmZhY2VfZm9ybWF0c1swXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VyZmFjZV9mb3JtYXRzX3JlZiA9ICZwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnN1cmZhY2VfZm9ybWF0czsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIFZhbGlkYXRlIHBDcmVhdGVJbmZvLT5pbWFnZUZvcm1hdCBhZ2FpbnN0IFZrU3VyZmFjZUZvcm1hdEtIUjo6Zm9ybWF0OgorICAgICAgICBib29sIGZvdW5kRm9ybWF0ID0gZmFsc2U7CisgICAgICAgIGJvb2wgZm91bmRDb2xvclNwYWNlID0gZmFsc2U7CisgICAgICAgIGJvb2wgZm91bmRNYXRjaCA9IGZhbHNlOworICAgICAgICBmb3IgKGF1dG8gY29uc3QgJmZvcm1hdCA6ICpzdXJmYWNlX2Zvcm1hdHNfcmVmKSB7CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPmltYWdlRm9ybWF0ID09IGZvcm1hdC5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBwQ3JlYXRlSW5mby0+aW1hZ2VDb2xvclNwYWNlIGFnYWluc3QgVmtTdXJmYWNlRm9ybWF0S0hSOjpjb2xvclNwYWNlOgorICAgICAgICAgICAgICAgIGZvdW5kRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPmltYWdlQ29sb3JTcGFjZSA9PSBmb3JtYXQuY29sb3JTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPmltYWdlQ29sb3JTcGFjZSA9PSBmb3JtYXQuY29sb3JTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZENvbG9yU3BhY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKKyAgICAgICAgICAgIGlmICghZm91bmRGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUZvcm1hdC0wMTI3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGxlZCB3aXRoIGEgbm9uLXN1cHBvcnRlZCBwQ3JlYXRlSW5mby0+aW1hZ2VGb3JtYXQgKGkuZS4gJWQpLiIsIGZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+aW1hZ2VGb3JtYXQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmRDb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VGb3JtYXQtMDEyNzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBjYWxsZWQgd2l0aCBhIG5vbi1zdXBwb3J0ZWQgcENyZWF0ZUluZm8tPmltYWdlQ29sb3JTcGFjZSAoaS5lLiAlZCkuIiwgZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5pbWFnZUNvbG9yU3BhY2UpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFZrUHJlc2VudE1vZGVLSFI+IHByZXNlbnRfbW9kZXM7CisgICAgY29uc3QgYXV0byAqcHJlc2VudF9tb2Rlc19yZWYgPSAmcHJlc2VudF9tb2RlczsKKworICAgIC8vIFZhbGlkYXRlIHBDcmVhdGVJbmZvIHZhbHVlcyB3aXRoIHRoZSByZXN1bHRzIG9mIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKCk6CisgICAgaWYgKHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+cHJlc2VudF9tb2Rlcy5lbXB0eSgpKSB7CisgICAgICAgIHVpbnQzMl90IHByZXNlbnRfbW9kZV9jb3VudCA9IDA7CisgICAgICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+cGh5c19kZXZpY2UsIHBDcmVhdGVJbmZvLT5zdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VudF9tb2RlX2NvdW50LCBudWxscHRyKTsKKyAgICAgICAgcHJlc2VudF9tb2Rlcy5yZXNpemUocHJlc2VudF9tb2RlX2NvdW50KTsKKyAgICAgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIocGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5waHlzX2RldmljZSwgcENyZWF0ZUluZm8tPnN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVzZW50X21vZGVfY291bnQsICZwcmVzZW50X21vZGVzWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmVzZW50X21vZGVzX3JlZiA9ICZwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnByZXNlbnRfbW9kZXM7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgcENyZWF0ZUluZm8tPnByZXNlbnRNb2RlIGFnYWluc3QgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoKToKKyAgICBib29sIGZvdW5kTWF0Y2ggPQorICAgICAgICBzdGQ6OmZpbmQocHJlc2VudF9tb2Rlc19yZWYtPmJlZ2luKCksIHByZXNlbnRfbW9kZXNfcmVmLT5lbmQoKSwgcENyZWF0ZUluZm8tPnByZXNlbnRNb2RlKSAhPSBwcmVzZW50X21vZGVzX3JlZi0+ZW5kKCk7CisgICAgaWYgKCFmb3VuZE1hdGNoKSB7CisgICAgICAgIGlmIChsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wcmVzZW50TW9kZS0wMTI4MSIsICIlcyBjYWxsZWQgd2l0aCBhIG5vbi1zdXBwb3J0ZWQgcHJlc2VudE1vZGUgKGkuZS4gJXMpLiIsCisgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgc3RyaW5nX1ZrUHJlc2VudE1vZGVLSFIocENyZWF0ZUluZm8tPnByZXNlbnRNb2RlKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBzdGF0ZSBmb3Igc2hhcmVkIHByZXNlbnRhYmxlIGNhc2UKKyAgICBpZiAoVktfUFJFU0VOVF9NT0RFX1NIQVJFRF9ERU1BTkRfUkVGUkVTSF9LSFIgPT0gcENyZWF0ZUluZm8tPnByZXNlbnRNb2RlIHx8CisgICAgICAgIFZLX1BSRVNFTlRfTU9ERV9TSEFSRURfQ09OVElOVU9VU19SRUZSRVNIX0tIUiA9PSBwQ3JlYXRlSW5mby0+cHJlc2VudE1vZGUpIHsKKyAgICAgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2hhcmVkX3ByZXNlbnRhYmxlX2ltYWdlKSB7CisgICAgICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfRXh0ZW5zaW9uTm90RW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyBjYWxsZWQgd2l0aCBwcmVzZW50TW9kZSAlcyB3aGljaCByZXF1aXJlcyB0aGUgVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSBleHRlbnNpb24sIHdoaWNoIGhhcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJlZW4gZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBzdHJpbmdfVmtQcmVzZW50TW9kZUtIUihwQ3JlYXRlSW5mby0+cHJlc2VudE1vZGUpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChwQ3JlYXRlSW5mby0+bWluSW1hZ2VDb3VudCAhPSAxKSB7CisgICAgICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1pbkltYWdlQ291bnQtMDEzODMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNhbGxlZCB3aXRoIHByZXNlbnRNb2RlICVzLCBidXQgbWluSW1hZ2VDb3VudCB2YWx1ZSBpcyAlZC4gRm9yIHNoYXJlZCBwcmVzZW50YWJsZSBpbWFnZSwgbWluSW1hZ2VDb3VudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSAxLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIHN0cmluZ19Wa1ByZXNlbnRNb2RlS0hSKHBDcmVhdGVJbmZvLT5wcmVzZW50TW9kZSksIHBDcmVhdGVJbmZvLT5taW5JbWFnZUNvdW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19TV0FQQ0hBSU5fQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVF9LSFIpIHsKKyAgICAgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3dhcGNoYWluX211dGFibGVfZm9ybWF0KSB7CisgICAgICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfRXh0ZW5zaW9uTm90RW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogcENyZWF0ZUluZm8tPmZsYWdzIGNvbnRhaW5zIFZLX1NXQVBDSEFJTl9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUX0tIUiB3aGljaCByZXF1aXJlcyB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0tIUl9zd2FwY2hhaW5fbXV0YWJsZV9mb3JtYXQgZXh0ZW5zaW9uLCB3aGljaCBoYXMgbm90IGJlZW4gZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gKmltYWdlX2Zvcm1hdF9saXN0ID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgICAgICAgICAgaWYgKGltYWdlX2Zvcm1hdF9saXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1mbGFncy0wMzE2OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwQ3JlYXRlSW5mby0+ZmxhZ3MgY29udGFpbnMgVktfU1dBUENIQUlOX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVRfS0hSIGJ1dCB0aGUgcE5leHQgY2hhaW4gb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mbyBkb2VzIG5vdCBjb250YWluIGFuIGluc3RhbmNlIG9mIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbWFnZV9mb3JtYXRfbGlzdC0+dmlld0Zvcm1hdENvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZSksICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1mbGFncy0wMzE2OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwQ3JlYXRlSW5mby0+ZmxhZ3MgY29udGFpbnMgVktfU1dBUENIQUlOX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVRfS0hSIGJ1dCB0aGUgdmlld0Zvcm1hdENvdW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVtYmVyIG9mIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiBpbiB0aGUgcE5leHQgY2hhaW4gaXMgemVyby4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kX2Jhc2VfZm9ybWF0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlX2Zvcm1hdF9saXN0LT52aWV3Rm9ybWF0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VfZm9ybWF0X2xpc3QtPnBWaWV3Rm9ybWF0c1tpXSA9PSBwQ3JlYXRlSW5mby0+aW1hZ2VGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Jhc2VfZm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZm91bmRfYmFzZV9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWZsYWdzLTAzMTY4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwQ3JlYXRlSW5mby0+ZmxhZ3MgY29udGFpbnMgVktfU1dBUENIQUlOX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVRfS0hSIGJ1dCBub25lIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50cyBvZiB0aGUgcFZpZXdGb3JtYXRzIG1lbWJlciBvZiBWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIgbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPmltYWdlRm9ybWF0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHBDcmVhdGVJbmZvLT5pbWFnZVNoYXJpbmdNb2RlID09IFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UKSAmJiBwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBib29sIHNraXAxID0KKyAgICAgICAgICAgIFZhbGlkYXRlUXVldWVGYW1pbGllcyhwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50LCBwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcywgInZrQ3JlYXRlQnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMiLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VTaGFyaW5nTW9kZS0wMTQyOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtMDE0MjgiLCBmYWxzZSk7CisgICAgICAgIGlmIChza2lwMSkgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIgKnBTd2FwY2hhaW4pIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIHN1cmZhY2Vfc3RhdGUgPSBHZXRTdXJmYWNlU3RhdGUocENyZWF0ZUluZm8tPnN1cmZhY2UpOworICAgIGNvbnN0IGF1dG8gb2xkX3N3YXBjaGFpbl9zdGF0ZSA9IEdldFN3YXBjaGFpblN0YXRlKHBDcmVhdGVJbmZvLT5vbGRTd2FwY2hhaW4pOworICAgIHJldHVybiBWYWxpZGF0ZUNyZWF0ZVN3YXBjaGFpbigidmtDcmVhdGVTd2FwY2hhaW5LSFIoKSIsIHBDcmVhdGVJbmZvLCBzdXJmYWNlX3N0YXRlLCBvbGRfc3dhcGNoYWluX3N0YXRlKTsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQcmVDYWxsUmVjb3JkRGVzdHJveVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKHN3YXBjaGFpbikgeworICAgICAgICBhdXRvIHN3YXBjaGFpbl9kYXRhID0gR2V0U3dhcGNoYWluU3RhdGUoc3dhcGNoYWluKTsKKyAgICAgICAgaWYgKHN3YXBjaGFpbl9kYXRhKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnN3YXBjaGFpbl9pbWFnZSA6IHN3YXBjaGFpbl9kYXRhLT5pbWFnZXMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGltYWdlX3N1YiA9IGltYWdlU3VicmVzb3VyY2VNYXAuZmluZChzd2FwY2hhaW5faW1hZ2UuaW1hZ2UpOworICAgICAgICAgICAgICAgIGlmIChpbWFnZV9zdWIgIT0gaW1hZ2VTdWJyZXNvdXJjZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaW1nc3VicGFpciA6IGltYWdlX3N1Yi0+c2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGltYWdlX2l0ZW0gPSBpbWFnZUxheW91dE1hcC5maW5kKGltZ3N1YnBhaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlX2l0ZW0gIT0gaW1hZ2VMYXlvdXRNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dE1hcC5lcmFzZShpbWFnZV9pdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbWFnZVN1YnJlc291cmNlTWFwLmVyYXNlKGltYWdlX3N1Yik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVyYXNlUUZPSW1hZ2VSZWxhc2VCYXJyaWVycyhzd2FwY2hhaW5faW1hZ2UuaW1hZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTd2FwY2hhaW5LSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBBbGxvY2F0b3IpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QgKnBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSAqcFN3YXBjaGFpbkltYWdlcykgY29uc3QgeworICAgIGF1dG8gc3dhcGNoYWluX3N0YXRlID0gR2V0U3dhcGNoYWluU3RhdGUoc3dhcGNoYWluKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoc3dhcGNoYWluX3N0YXRlICYmIHBTd2FwY2hhaW5JbWFnZXMpIHsKKyAgICAgICAgaWYgKCpwU3dhcGNoYWluSW1hZ2VDb3VudCA+IHN3YXBjaGFpbl9zdGF0ZS0+Z2V0X3N3YXBjaGFpbl9pbWFnZV9jb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU3dhcGNoYWluX0ludmFsaWRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUigpIGNhbGxlZCB3aXRoIG5vbi1OVUxMIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBhbmQgd2l0aCBwU3dhcGNoYWluSW1hZ2VzIHNldCB0byBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSAoJWQpIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSAoJWQpIHRoYXQgd2FzIHJldHVybmVkIHdoZW4gcFN3YXBjaGFpbkltYWdlQ291bnQgd2FzIE5VTEwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICpwU3dhcGNoYWluSW1hZ2VDb3VudCwgc3dhcGNoYWluX3N0YXRlLT5nZXRfc3dhcGNoYWluX2ltYWdlX2NvdW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpQb3N0Q2FsbFJlY29yZEdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QgKnBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlICpwU3dhcGNoYWluSW1hZ2VzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICAvLyBVc3VhbGx5IHdlJ2QgY2FsbCB0aGUgU3RhdGVUcmFja2VyIGZpcnN0LCBidXQKKyAgICAvLyAgICAgYSkgbm9uZSBvZiB0aGUgbmV3IHN0YXRlIG5lZWRlZCBiZWxvdyBpcyBmcm9tIHRoZSBTdGF0ZVRyYWNrZXIKKyAgICAvLyAgICAgYikgU3RhdGVUcmFja2VyICp3aWxsKiB1cGRhdGUgc3dhcGNoYWluX3N0YXRlLT5pbWFnZXMgd2hpY2ggd2UgdXNlIHRvIGd1YXJkIGFnYWluc3QgZG91YmxlIGluaXRpYWxpemF0aW9uCisgICAgLy8gc28gd2UnbGwgZG8gaXQgaW4gdGhlIG9wcG9zaXRlIG9yZGVyIC0tIENvcmVDaGVja3MgdGhlbiBTdGF0ZVRyYWNrZXIuCisgICAgLy8KKyAgICAvLyBOb3RlLCB0aGlzIHdpbGwgZ2V0IHRyaWNraWVyIGlmIHdlIHN0YXJ0IHN0b3JpbmcgaW1hZ2Ugc2hhcmVkIHBvaW50ZXJzIGluIHRoZSBpbWFnZSBsYXlvdXQgZGF0YSwgYXQgd2hpY2ggcG9pbnQKKyAgICAvLyB3ZSdsbCBoYXZlIHRvIHJldmVyc2UgdGhlIG9yZGVyICpiYWNrKiBhbmQgZmluZCBzb21lIG90aGVyIHNjaGVtZSB0byBwcmV2ZW50IGRvdWJsZSBpbml0aWFsaXphdGlvbi4KKworICAgIGlmICgoKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB8fCAocmVzdWx0ID09IFZLX0lOQ09NUExFVEUpKSAmJiBwU3dhcGNoYWluSW1hZ2VzKSB7CisgICAgICAgIC8vIEluaXRpYWx6ZSBpbWFnZSBsYXlvdXQgdHJhY2tpbmcgZGF0YQorICAgICAgICBhdXRvIHN3YXBjaGFpbl9zdGF0ZSA9IEdldFN3YXBjaGFpblN0YXRlKHN3YXBjaGFpbik7CisgICAgICAgIGNvbnN0IGF1dG8gaW1hZ2VfdmVjdG9yX3NpemUgPSBzd2FwY2hhaW5fc3RhdGUtPmltYWdlcy5zaXplKCk7CisgICAgICAgIElNQUdFX0xBWU9VVF9TVEFURSBpbWFnZV9sYXlvdXRfbm9kZTsKKyAgICAgICAgaW1hZ2VfbGF5b3V0X25vZGUubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICAgICAgaW1hZ2VfbGF5b3V0X25vZGUuZm9ybWF0ID0gc3dhcGNoYWluX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlRm9ybWF0OworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFN3YXBjaGFpbkltYWdlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBjaGVjayBtYWtlcyBzdXJlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbiBpbWFnZSBpbml0aWFsaXplZCBmb3IgdGhpcyBzd2FwY2hhaW4gaW5kZXgsIGJ1dAorICAgICAgICAgICAgLy8gZ2l2ZW4gdGhhdCBpdCdzIFN0YXRlVHJhY2tlciB0aGF0IHN0b3JlcyB0aGlzIGluZm9ybWF0aW9uLCBuZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBub24tZXh0YW50IGVudHJpZXMgaW4gdGhlIHZlY3RvcgorICAgICAgICAgICAgaWYgKChpIDwgaW1hZ2VfdmVjdG9yX3NpemUpICYmIChzd2FwY2hhaW5fc3RhdGUtPmltYWdlc1tpXS5pbWFnZSAhPSBWS19OVUxMX0hBTkRMRSkpIGNvbnRpbnVlOworCisgICAgICAgICAgICBJbWFnZVN1YnJlc291cmNlUGFpciBzdWJwYWlyID0ge3BTd2FwY2hhaW5JbWFnZXNbaV0sIGZhbHNlLCBWa0ltYWdlU3VicmVzb3VyY2UoKX07CisgICAgICAgICAgICBpbWFnZVN1YnJlc291cmNlTWFwW3BTd2FwY2hhaW5JbWFnZXNbaV1dLnB1c2hfYmFjayhzdWJwYWlyKTsKKyAgICAgICAgICAgIGltYWdlTGF5b3V0TWFwW3N1YnBhaXJdID0gaW1hZ2VfbGF5b3V0X25vZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgY2FsbCB0aGUgYmFzZSBjbGFzcworICAgIFN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBwU3dhcGNoYWluSW1hZ2VzLCByZXN1bHQpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZVF1ZXVlUHJlc2VudEtIUihWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1ByZXNlbnRJbmZvS0hSICpwUHJlc2VudEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBhdXRvIHF1ZXVlX3N0YXRlID0gR2V0UXVldWVTdGF0ZShxdWV1ZSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFByZXNlbnRJbmZvLT53YWl0U2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBhdXRvIHBTZW1hcGhvcmUgPSBHZXRTZW1hcGhvcmVTdGF0ZShwUHJlc2VudEluZm8tPnBXYWl0U2VtYXBob3Jlc1tpXSk7CisgICAgICAgIGlmIChwU2VtYXBob3JlICYmIHBTZW1hcGhvcmUtPnR5cGUgIT0gVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUikgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFByZXNlbnRJbmZvLT5wV2FpdFNlbWFwaG9yZXNbaV0pLAorICAgICAgICAgICAgICAgICJWVUlELXZrUXVldWVQcmVzZW50S0hSLXBXYWl0U2VtYXBob3Jlcy0wMzI2NyIsICAvLyBWVUlELVZrUHJlc2VudEluZm9LSFItcFdhaXRTZW1hcGhvcmVzLTAzMjY5IGNvdWxkIGZpdCBhbHNvISEKKyAgICAgICAgICAgICAgICAiVmtRdWV1ZVByZXNlbnQ6ICVzIGlzIG5vdCBhIFZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIiLAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocFByZXNlbnRJbmZvLT5wV2FpdFNlbWFwaG9yZXNbaV0pLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChwU2VtYXBob3JlICYmICFwU2VtYXBob3JlLT5zaWduYWxlZCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9RdWV1ZUZvcndhcmRQcm9ncmVzcywgIiVzIGlzIHdhaXRpbmcgb24gJXMgdGhhdCBoYXMgbm8gd2F5IHRvIGJlIHNpZ25hbGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShxdWV1ZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBQcmVzZW50SW5mby0+cFdhaXRTZW1hcGhvcmVzW2ldKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXV0byBzd2FwY2hhaW5fZGF0YSA9IEdldFN3YXBjaGFpblN0YXRlKHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaV0pOworICAgICAgICBpZiAoc3dhcGNoYWluX2RhdGEpIHsKKyAgICAgICAgICAgIGlmIChwUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXNbaV0gPj0gc3dhcGNoYWluX2RhdGEtPmltYWdlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFByZXNlbnRJbmZvLT5wU3dhcGNoYWluc1tpXSksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpbkludmFsaWRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZVByZXNlbnRLSFI6IFN3YXBjaGFpbiBpbWFnZSBpbmRleCB0b28gbGFyZ2UgKCV1KS4gVGhlcmUgYXJlIG9ubHkgJXUgaW1hZ2VzIGluIHRoaXMgc3dhcGNoYWluLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRJbmZvLT5wSW1hZ2VJbmRpY2VzW2ldLCAodWludDMyX3Qpc3dhcGNoYWluX2RhdGEtPmltYWdlcy5zaXplKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGltYWdlID0gc3dhcGNoYWluX2RhdGEtPmltYWdlc1twUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXNbaV1dLmltYWdlOworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGltYWdlKTsKKworICAgICAgICAgICAgICAgIGlmICghaW1hZ2Vfc3RhdGUtPmFjcXVpcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaV0pLCBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9Td2FwY2hhaW5JbWFnZU5vdEFjcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrUXVldWVQcmVzZW50S0hSOiBTd2FwY2hhaW4gaW1hZ2UgaW5kZXggJXUgaGFzIG5vdCBiZWVuIGFjcXVpcmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZlY3RvcjxWa0ltYWdlTGF5b3V0PiBsYXlvdXRzOworICAgICAgICAgICAgICAgIGlmIChGaW5kTGF5b3V0cyhpbWFnZSwgbGF5b3V0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGxheW91dCA6IGxheW91dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGF5b3V0ICE9IFZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFIpICYmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXlvdXQgIT0gVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocXVldWUpLCAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBJbWFnZUluZGljZXMtMDEyOTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1hZ2VzIHBhc3NlZCB0byBwcmVzZW50IG11c3QgYmUgaW4gbGF5b3V0IFZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFIgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUiBidXQgaXMgaW4gJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQobGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFsbCBwaHlzaWNhbCBkZXZpY2VzIGFuZCBxdWV1ZSBmYW1pbGllcyBhcmUgcmVxdWlyZWQgdG8gYmUgYWJsZSB0byBwcmVzZW50IHRvIGFueSBuYXRpdmUgd2luZG93IG9uIEFuZHJvaWQ7IHJlcXVpcmUKKyAgICAgICAgICAgIC8vIHRoZSBhcHBsaWNhdGlvbiB0byBoYXZlIGVzdGFibGlzaGVkIHN1cHBvcnQgb24gYW55IG90aGVyIHBsYXRmb3JtLgorICAgICAgICAgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9hbmRyb2lkX3N1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHN1cmZhY2Vfc3RhdGUgPSBHZXRTdXJmYWNlU3RhdGUoc3dhcGNoYWluX2RhdGEtPmNyZWF0ZUluZm8uc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgYXV0byBzdXBwb3J0X2l0ID0gc3VyZmFjZV9zdGF0ZS0+Z3B1X3F1ZXVlX3N1cHBvcnQuZmluZCh7cGh5c2ljYWxfZGV2aWNlLCBxdWV1ZV9zdGF0ZS0+cXVldWVGYW1pbHlJbmRleH0pOworCisgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRfaXQgPT0gc3VyZmFjZV9zdGF0ZS0+Z3B1X3F1ZXVlX3N1cHBvcnQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFByZXNlbnRJbmZvLT5wU3dhcGNoYWluc1tpXSksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpblVuc3VwcG9ydGVkUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZVByZXNlbnRLSFI6IFByZXNlbnRpbmcgaW1hZ2Ugd2l0aG91dCBjYWxsaW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN1cHBvcnRfaXQtPnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zW2ldKSwgIlZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcFN3YXBjaGFpbnMtMDEyOTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrUXVldWVQcmVzZW50S0hSOiBQcmVzZW50aW5nIGltYWdlIG9uIHF1ZXVlIHRoYXQgY2Fubm90IHByZXNlbnQgdG8gdGhpcyBzdXJmYWNlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocFByZXNlbnRJbmZvLT5wTmV4dCkgeworICAgICAgICAvLyBWZXJpZnkgZXh0IHN0cnVjdAorICAgICAgICBjb25zdCBhdXRvICpwcmVzZW50X3JlZ2lvbnMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1ByZXNlbnRSZWdpb25zS0hSPihwUHJlc2VudEluZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKHByZXNlbnRfcmVnaW9ucykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHByZXNlbnRfcmVnaW9ucy0+c3dhcGNoYWluQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gc3dhcGNoYWluX2RhdGEgPSBHZXRTd2FwY2hhaW5TdGF0ZShwUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zW2ldKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc3dhcGNoYWluX2RhdGEpOworICAgICAgICAgICAgICAgIFZrUHJlc2VudFJlZ2lvbktIUiByZWdpb24gPSBwcmVzZW50X3JlZ2lvbnMtPnBSZWdpb25zW2ldOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCByZWdpb24ucmVjdGFuZ2xlQ291bnQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICBWa1JlY3RMYXllcktIUiByZWN0ID0gcmVnaW9uLnBSZWN0YW5nbGVzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlY3Qub2Zmc2V0LnggKyByZWN0LmV4dGVudC53aWR0aCkgPiBzd2FwY2hhaW5fZGF0YS0+Y3JlYXRlSW5mby5pbWFnZUV4dGVudC53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaV0pLCAiVlVJRC1Wa1JlY3RMYXllcktIUi1vZmZzZXQtMDEyNjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a1F1ZXVlUHJlc2VudEtIUigpOiBGb3IgVmtQcmVzZW50UmVnaW9uS0hSIGRvd24gcE5leHQgY2hhaW4sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicFJlZ2lvblslaV0ucFJlY3RhbmdsZXNbJWldLCB0aGUgc3VtIG9mIG9mZnNldC54ICglaSkgYW5kIGV4dGVudC53aWR0aCAoJWkpIGlzIGdyZWF0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHN3YXBjaGFpbidzIGltYWdlRXh0ZW50LndpZHRoICglaSkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBqLCByZWN0Lm9mZnNldC54LCByZWN0LmV4dGVudC53aWR0aCwgc3dhcGNoYWluX2RhdGEtPmNyZWF0ZUluZm8uaW1hZ2VFeHRlbnQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgocmVjdC5vZmZzZXQueSArIHJlY3QuZXh0ZW50LmhlaWdodCkgPiBzd2FwY2hhaW5fZGF0YS0+Y3JlYXRlSW5mby5pbWFnZUV4dGVudC5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zW2ldKSwgIlZVSUQtVmtSZWN0TGF5ZXJLSFItb2Zmc2V0LTAxMjYxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZVByZXNlbnRLSFIoKTogRm9yIFZrUHJlc2VudFJlZ2lvbktIUiBkb3duIHBOZXh0IGNoYWluLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBSZWdpb25bJWldLnBSZWN0YW5nbGVzWyVpXSwgdGhlIHN1bSBvZiBvZmZzZXQueSAoJWkpIGFuZCBleHRlbnQuaGVpZ2h0ICglaSkgaXMgZ3JlYXRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgc3dhcGNoYWluJ3MgaW1hZ2VFeHRlbnQuaGVpZ2h0ICglaSkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBqLCByZWN0Lm9mZnNldC55LCByZWN0LmV4dGVudC5oZWlnaHQsIHN3YXBjaGFpbl9kYXRhLT5jcmVhdGVJbmZvLmltYWdlRXh0ZW50LmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QubGF5ZXIgPiBzd2FwY2hhaW5fZGF0YS0+Y3JlYXRlSW5mby5pbWFnZUFycmF5TGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocFByZXNlbnRJbmZvLT5wU3dhcGNoYWluc1tpXSksICJWVUlELVZrUmVjdExheWVyS0hSLWxheWVyLTAxMjYyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZVByZXNlbnRLSFIoKTogRm9yIFZrUHJlc2VudFJlZ2lvbktIUiBkb3duIHBOZXh0IGNoYWluLCBwUmVnaW9uWyVpXS5wUmVjdGFuZ2xlc1slaV0sIHRoZSBsYXllciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglaSkgaXMgZ3JlYXRlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHN3YXBjaGFpbidzIGltYWdlQXJyYXlMYXllcnMgKCVpKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIHJlY3QubGF5ZXIsIHN3YXBjaGFpbl9kYXRhLT5jcmVhdGVJbmZvLmltYWdlQXJyYXlMYXllcnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3QgYXV0byAqcHJlc2VudF90aW1lc19pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQcmVzZW50VGltZXNJbmZvR09PR0xFPihwUHJlc2VudEluZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKHByZXNlbnRfdGltZXNfaW5mbykgeworICAgICAgICAgICAgaWYgKHBQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQgIT0gcHJlc2VudF90aW1lc19pbmZvLT5zd2FwY2hhaW5Db3VudCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zWzBdKSwgIlZVSUQtVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLXN3YXBjaGFpbkNvdW50LTAxMjQ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtRdWV1ZVByZXNlbnRLSFIoKTogVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLnN3YXBjaGFpbkNvdW50IGlzICVpIGJ1dCBwUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgJWkuIEZvciBWa1ByZXNlbnRUaW1lc0luZm9HT09HTEUgZG93biBwTmV4dCBjaGFpbiBvZiBWa1ByZXNlbnRJbmZvS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRS5zd2FwY2hhaW5Db3VudCBtdXN0IGVxdWFsIFZrUHJlc2VudEluZm9LSFIuc3dhcGNoYWluQ291bnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50X3RpbWVzX2luZm8tPnN3YXBjaGFpbkNvdW50LCBwUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTd2FwY2hhaW5LSFIgKnBTd2FwY2hhaW5zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluQ291bnQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byBzdXJmYWNlX3N0YXRlID0gR2V0U3VyZmFjZVN0YXRlKHBDcmVhdGVJbmZvc1tpXS5zdXJmYWNlKTsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gb2xkX3N3YXBjaGFpbl9zdGF0ZSA9IEdldFN3YXBjaGFpblN0YXRlKHBDcmVhdGVJbmZvc1tpXS5vbGRTd2FwY2hhaW4pOworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZnVuY19uYW1lOworICAgICAgICAgICAgZnVuY19uYW1lIDw8ICJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFJbIiA8PCBzd2FwY2hhaW5Db3VudCA8PCAiXSgpIjsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDcmVhdGVTd2FwY2hhaW4oZnVuY19uYW1lLnN0cigpLmNfc3RyKCksICZwQ3JlYXRlSW5mb3NbaV0sIHN1cmZhY2Vfc3RhdGUsIG9sZF9zd2FwY2hhaW5fc3RhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IENvbW1hbmRWZXJzaW9uIGNtZF92ZXJzaW9uLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lb3V0LCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIFZrRmVuY2UgZmVuY2UsIHVpbnQzMl90ICpwSW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgY29uc3QgY2hhciAqc2VtYXBob3JlX3R5cGVfdnVpZCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgYXV0byBwU2VtYXBob3JlID0gR2V0U2VtYXBob3JlU3RhdGUoc2VtYXBob3JlKTsKKyAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT50eXBlICE9IFZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCBzZW1hcGhvcmVfdHlwZV92dWlkLCAiJXM6ICVzIGlzIG5vdCBhIFZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIiLCBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChwU2VtYXBob3JlICYmIHBTZW1hcGhvcmUtPnNjb3BlID09IGtTeW5jU2NvcGVJbnRlcm5hbCAmJiBwU2VtYXBob3JlLT5zaWduYWxlZCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNlbWFwaG9yZSksICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtMDEyODYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTZW1hcGhvcmUgbXVzdCBub3QgYmUgY3VycmVudGx5IHNpZ25hbGVkIG9yIGluIGEgd2FpdCBzdGF0ZS4iLCBmdW5jX25hbWUpOworICAgIH0KKworICAgIGF1dG8gcEZlbmNlID0gR2V0RmVuY2VTdGF0ZShmZW5jZSk7CisgICAgaWYgKHBGZW5jZSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlRmVuY2VGb3JTdWJtaXQocEZlbmNlKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIHN3YXBjaGFpbl9kYXRhID0gR2V0U3dhcGNoYWluU3RhdGUoc3dhcGNoYWluKTsKKyAgICBpZiAoc3dhcGNoYWluX2RhdGEpIHsKKyAgICAgICAgaWYgKHN3YXBjaGFpbl9kYXRhLT5yZXRpcmVkKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc3dhcGNoYWluKSwgIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXN3YXBjaGFpbi0wMTI4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBUaGlzIHN3YXBjaGFpbiBoYXMgYmVlbiByZXRpcmVkLiBUaGUgYXBwbGljYXRpb24gY2FuIHN0aWxsIHByZXNlbnQgYW55IGltYWdlcyBpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBhY3F1aXJlZCwgYnV0IGNhbm5vdCBhY3F1aXJlIGFueSBtb3JlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZSgpOworICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIHRlY2huaWNhbGx5IHdyb25nIG9uIG1hbnkgbGV2ZWxzLCBidXQgcmVxdWlyZXMgbWFzc2l2ZSBjbGVhbnVwCisgICAgICAgIGlmIChwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSX2NhbGxlZCkgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYWNxdWlyZWRfaW1hZ2VzID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpjb3VudF9pZihzd2FwY2hhaW5fZGF0YS0+aW1hZ2VzLmJlZ2luKCksIHN3YXBjaGFpbl9kYXRhLT5pbWFnZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKFNXQVBDSEFJTl9JTUFHRSBpbWFnZSkgeyByZXR1cm4gR2V0SW1hZ2VTdGF0ZShpbWFnZS5pbWFnZSktPmFjcXVpcmVkOyB9KSk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzd2FwY2hhaW5faW1hZ2VfY291bnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3dhcGNoYWluX2RhdGEtPmltYWdlcy5zaXplKCkpOworICAgICAgICAgICAgY29uc3QgYXV0byBtaW5faW1hZ2VfY291bnQgPSBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnN1cmZhY2VDYXBhYmlsaXRpZXMubWluSW1hZ2VDb3VudDsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgdG9vX21hbnlfYWxyZWFkeV9hY3F1aXJlZCA9IGFjcXVpcmVkX2ltYWdlcyA+IHN3YXBjaGFpbl9pbWFnZV9jb3VudCAtIG1pbl9pbWFnZV9jb3VudDsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IFVJTlQ2NF9NQVggJiYgdG9vX21hbnlfYWxyZWFkeV9hY3F1aXJlZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZ1aWQgPSAiSU5WQUxJRC12dWlkIjsKKyAgICAgICAgICAgICAgICBpZiAoY21kX3ZlcnNpb24gPT0gQ01EX1ZFUlNJT05fMSkKKyAgICAgICAgICAgICAgICAgICAgdnVpZCA9ICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zd2FwY2hhaW4tMDE4MDIiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNtZF92ZXJzaW9uID09IENNRF9WRVJTSU9OXzIpCisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2UyS0hSLXN3YXBjaGFpbi0wMTgwMyI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworCisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYWNxdWlyYWJsZSA9IHN3YXBjaGFpbl9pbWFnZV9jb3VudCAtIG1pbl9pbWFnZV9jb3VudCArIDE7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzd2FwY2hhaW4pLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IHByZXZpb3VzbHkgYWNxdWlyZWQgJSIgUFJJdTMyICIgaW1hZ2UlcyBmcm9tIHN3YXBjaGFpbi4gT25seSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyBhdmFpbGFibGUgdG8gYmUgYWNxdWlyZWQgdXNpbmcgYSB0aW1lb3V0IG9mIFVJTlQ2NF9NQVggKGdpdmVuIHRoZSBzd2FwY2hhaW4gaGFzICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBhbmQgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOjptaW5JbWFnZUNvdW50IGlzICUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIGFjcXVpcmVkX2ltYWdlcywgYWNxdWlyZWRfaW1hZ2VzID4gMSA/ICJzIiA6ICIiLCBhY3F1aXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJhYmxlID4gMSA/ICJhcmUiIDogImlzIiwgc3dhcGNoYWluX2ltYWdlX2NvdW50LCBtaW5faW1hZ2VfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN3YXBjaGFpbl9kYXRhLT5pbWFnZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHN3YXBjaGFpbiksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpbkltYWdlc05vdEZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogTm8gaW1hZ2VzIGZvdW5kIHRvIGFjcXVpcmUgZnJvbS4gQXBwbGljYXRpb24gcHJvYmFibHkgZGlkIG5vdCBjYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIgYWZ0ZXIgc3dhcGNoYWluIGNyZWF0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVBY3F1aXJlTmV4dEltYWdlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgVmtGZW5jZSBmZW5jZSwgdWludDMyX3QgKnBJbWFnZUluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZShkZXZpY2UsIENNRF9WRVJTSU9OXzEsIHN3YXBjaGFpbiwgdGltZW91dCwgc2VtYXBob3JlLCBmZW5jZSwgcEltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtBY3F1aXJlTmV4dEltYWdlS0hSIiwgIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS0wMzI2NSIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUFjcXVpcmVOZXh0SW1hZ2UyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiAqcEFjcXVpcmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcEltYWdlSW5kZXgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGV2aWNlTWFza1RvUGh5c2ljYWxEZXZpY2VDb3VudChwQWNxdWlyZUluZm8tPmRldmljZU1hc2ssIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwQWNxdWlyZUluZm8tPnN3YXBjaGFpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1kZXZpY2VNYXNrLTAxMjkwIik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURldmljZU1hc2tUb1plcm8ocEFjcXVpcmVJbmZvLT5kZXZpY2VNYXNrLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocEFjcXVpcmVJbmZvLT5zd2FwY2hhaW4pLCAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLWRldmljZU1hc2stMDEyOTEiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZShkZXZpY2UsIENNRF9WRVJTSU9OXzIsIHBBY3F1aXJlSW5mby0+c3dhcGNoYWluLCBwQWNxdWlyZUluZm8tPnRpbWVvdXQsIHBBY3F1aXJlSW5mby0+c2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBY3F1aXJlSW5mby0+ZmVuY2UsIHBJbWFnZUluZGV4LCAidmtBY3F1aXJlTmV4dEltYWdlMktIUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zZW1hcGhvcmUtMDMyNjYiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgY29uc3QgYXV0byBzdXJmYWNlX3N0YXRlID0gR2V0U3VyZmFjZVN0YXRlKHN1cmZhY2UpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICgoc3VyZmFjZV9zdGF0ZSkgJiYgKHN1cmZhY2Vfc3RhdGUtPnN3YXBjaGFpbikpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lOU1RBTkNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGluc3RhbmNlKSwgIlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLTAxMjY2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0Rlc3Ryb3lTdXJmYWNlS0hSKCkgY2FsbGVkIGJlZm9yZSBpdHMgYXNzb2NpYXRlZCBWa1N3YXBjaGFpbktIUiB3YXMgZGVzdHJveWVkLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xfZGlzcGxheSAqZGlzcGxheSkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gcGRfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICByZXR1cm4gVmFsaWRhdGVRdWV1ZUZhbWlseUluZGV4KHBkX3N0YXRlLCBxdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDEzMDYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsICJxdWV1ZUZhbWlseUluZGV4Iik7Cit9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4KSBjb25zdCB7CisgICAgY29uc3QgYXV0byBwZF9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUocGh5c2ljYWxEZXZpY2UpOworICAgIHJldHVybiBWYWxpZGF0ZVF1ZXVlRmFtaWx5SW5kZXgocGRfc3RhdGUsIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDEzMDkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCAicXVldWVGYW1pbHlJbmRleCIpOworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHhjYl9jb25uZWN0aW9uX3QgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdmlzdWFsaWRfdCB2aXN1YWxfaWQpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIHBkX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIFZhbGlkYXRlUXVldWVGYW1pbHlJbmRleChwZF9zdGF0ZSwgcXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDEzMTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgInF1ZXVlRmFtaWx5SW5kZXgiKTsKK30KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGxheSAqZHB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpc3VhbElEIHZpc3VhbElEKSBjb25zdCB7CisgICAgY29uc3QgYXV0byBwZF9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUocGh5c2ljYWxEZXZpY2UpOworICAgIHJldHVybiBWYWxpZGF0ZVF1ZXVlRmFtaWx5SW5kZXgocGRfc3RhdGUsIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFItcXVldWVGYW1pbHlJbmRleC0wMTMxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgInF1ZXVlRmFtaWx5SW5kZXgiKTsKK30KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa0Jvb2wzMiAqcFN1cHBvcnRlZCkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIFZhbGlkYXRlUXVldWVGYW1pbHlJbmRleChwaHlzaWNhbF9kZXZpY2Vfc3RhdGUsIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFItcXVldWVGYW1pbHlJbmRleC0wMTI2OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIiwgInF1ZXVlRmFtaWx5SW5kZXgiKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShjb25zdCBjaGFyICpmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBjb25zdCBhdXRvIGxheW91dCA9IEdldERlc2NyaXB0b3JTZXRMYXlvdXRTaGFyZWQocENyZWF0ZUluZm8tPmRlc2NyaXB0b3JTZXRMYXlvdXQpOworICAgIGlmIChWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUID09IHBDcmVhdGVJbmZvLT50ZW1wbGF0ZVR5cGUgJiYgIWxheW91dCkgeworICAgICAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSBkc190eXBlZChwQ3JlYXRlSW5mby0+ZGVzY3JpcHRvclNldExheW91dCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0TGF5b3V0KTsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhULCBkc190eXBlZC5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtMDAzNTAiLAorICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcENyZWF0ZUluZm8tPmRlc2NyaXB0b3JTZXRMYXlvdXQgKCVzKSIsIGZ1bmNfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShkc190eXBlZCkuY19zdHIoKSk7CisgICAgfSBlbHNlIGlmIChWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSID09IHBDcmVhdGVJbmZvLT50ZW1wbGF0ZVR5cGUpIHsKKyAgICAgICAgYXV0byBiaW5kX3BvaW50ID0gcENyZWF0ZUluZm8tPnBpcGVsaW5lQmluZFBvaW50OworICAgICAgICBib29sIHZhbGlkX2JwID0gKGJpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUykgfHwgKGJpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFKTsKKyAgICAgICAgaWYgKCF2YWxpZF9icCkgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tdGVtcGxhdGVUeXBlLTAwMzUxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwQ3JlYXRlSW5mby0+cGlwZWxpbmVCaW5kUG9pbnQgKCUiIFBSSXUzMiAiKS4iLCBmdW5jX25hbWUsIHN0YXRpY19jYXN0PHVpbnQzMl90PihiaW5kX3BvaW50KSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgYXV0byBwaXBlbGluZV9sYXlvdXQgPSBHZXRQaXBlbGluZUxheW91dChwQ3JlYXRlSW5mby0+cGlwZWxpbmVMYXlvdXQpOworICAgICAgICBpZiAoIXBpcGVsaW5lX2xheW91dCkgeworICAgICAgICAgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgcGxfdHlwZWQocENyZWF0ZUluZm8tPnBpcGVsaW5lTGF5b3V0LCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0KTsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsX3R5cGVkLmhhbmRsZSwgIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBDcmVhdGVJbmZvLT5waXBlbGluZUxheW91dCAoJXMpIiwgZnVuY19uYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBsX3R5cGVkKS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBkX3NldCA9IHBDcmVhdGVJbmZvLT5zZXQ7CisgICAgICAgICAgICBpZiAoKHBkX3NldCA+PSBwaXBlbGluZV9sYXlvdXQtPnNldF9sYXlvdXRzLnNpemUoKSkgfHwgIXBpcGVsaW5lX2xheW91dC0+c2V0X2xheW91dHNbcGRfc2V0XSB8fAorICAgICAgICAgICAgICAgICFwaXBlbGluZV9sYXlvdXQtPnNldF9sYXlvdXRzW3BkX3NldF0tPklzUHVzaERlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIHBsX3R5cGVkKHBDcmVhdGVJbmZvLT5waXBlbGluZUxheW91dCwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUxheW91dCk7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsX3R5cGVkLmhhbmRsZSwgIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcENyZWF0ZUluZm8tPnNldCAoJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGRvZXMgbm90IHJlZmVyIHRvIHRoZSBwdXNoIGRlc2NyaXB0b3Igc2V0IGxheW91dCBmb3IgcENyZWF0ZUluZm8tPnBpcGVsaW5lTGF5b3V0ICglcykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBwZF9zZXQsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocGxfdHlwZWQpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSgidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoKSIsIHBDcmVhdGVJbmZvKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSICpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKCkiLCBwQ3JlYXRlSW5mbyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvIGNvbnN0IHRlbXBsYXRlX21hcF9lbnRyeSA9IGRlc2NfdGVtcGxhdGVfbWFwLmZpbmQoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICBpZiAoKHRlbXBsYXRlX21hcF9lbnRyeSA9PSBkZXNjX3RlbXBsYXRlX21hcC5lbmQoKSkgfHwgKHRlbXBsYXRlX21hcF9lbnRyeS0+c2Vjb25kLmdldCgpID09IG51bGxwdHIpKSB7CisgICAgICAgIC8vIE9iamVjdCB0cmFja2VyIHdpbGwgcmVwb3J0IGVycm9ycyBmb3IgaW52YWxpZCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgdmFsdWVzLCBhdm9pZGluZyBhIGNyYXNoIGluIHJlbGVhc2UgYnVpbGRzCisgICAgICAgIC8vIGJ1dCByZXRhaW5pbmcgdGhlIGFzc2VydCBhcyB0ZW1wbGF0ZSBzdXBwb3J0IGlzIG5ldyBlbm91Z2ggdG8gd2FudCB0byBpbnZlc3RpZ2F0ZSB0aGVzZSBpbiBkZWJ1ZyBidWlsZHMuCisgICAgICAgIGFzc2VydCgwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBURU1QTEFURV9TVEFURSAqdGVtcGxhdGVfc3RhdGUgPSB0ZW1wbGF0ZV9tYXBfZW50cnktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGVtcGxhdGUgcHVzaCBkZXNjcmlwdG9yIHVwZGF0ZXMKKyAgICAgICAgaWYgKHRlbXBsYXRlX3N0YXRlLT5jcmVhdGVfaW5mby50ZW1wbGF0ZVR5cGUgPT0gVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9ERVNDUklQVE9SX1NFVCkgeworICAgICAgICAgICAgc2tpcCA9IFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldHNXaXRoVGVtcGxhdGVLSFIoZGVzY3JpcHRvclNldCwgdGVtcGxhdGVfc3RhdGUsIHBEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBEYXRhKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShkZXNjcmlwdG9yU2V0LCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBEYXRhKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBEYXRhKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShkZXNjcmlwdG9yU2V0LCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBEYXRhKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwRGF0YSkgY29uc3QgeworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoY2Jfc3RhdGUpOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGZ1bmNfbmFtZSA9ICJ2a1B1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKCkiOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9QVVNIREVTQ1JJUFRPUlNFVFdJVEhURU1QTEFURUtIUiwgZnVuY19uYW1lKTsKKworICAgIGNvbnN0IGF1dG8gbGF5b3V0X2RhdGEgPSBHZXRQaXBlbGluZUxheW91dChsYXlvdXQpOworICAgIGNvbnN0IGF1dG8gZHNsID0gR2V0RHNsRnJvbVBpcGVsaW5lTGF5b3V0KGxheW91dF9kYXRhLCBzZXQpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIGxheW91dF90eXBlZChsYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQpOworCisgICAgLy8gVmFsaWRhdGUgdGhlIHNldCBpbmRleCBwb2ludHMgdG8gYSBwdXNoIGRlc2NyaXB0b3Igc2V0IGFuZCBpcyBpbiByYW5nZQorICAgIGlmIChkc2wpIHsKKyAgICAgICAgaWYgKCFkc2wtPklzUHVzaERlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAgc2tpcCA9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dF90eXBlZC5oYW5kbGUsICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItc2V0LTAwMzY1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogU2V0IGluZGV4ICUiIFBSSXUzMiAiIGRvZXMgbm90IG1hdGNoIHB1c2ggZGVzY3JpcHRvciBzZXQgbGF5b3V0IGluZGV4IGZvciAlcy4iLCBmdW5jX25hbWUsIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobGF5b3V0X3R5cGVkKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobGF5b3V0X2RhdGEgJiYgKHNldCA+PSBsYXlvdXRfZGF0YS0+c2V0X2xheW91dHMuc2l6ZSgpKSkgeworICAgICAgICBza2lwID0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRfdHlwZWQuaGFuZGxlLCAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLXNldC0wMDM2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogU2V0IGluZGV4ICUiIFBSSXUzMiAiIGlzIG91dHNpZGUgb2YgcmFuZ2UgZm9yICVzIChzZXQgPCAlIiBQUkl1MzIgIikuIiwgZnVuY19uYW1lLCBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobGF5b3V0X3R5cGVkKS5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4obGF5b3V0X2RhdGEtPnNldF9sYXlvdXRzLnNpemUoKSkpOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gdGVtcGxhdGVfc3RhdGUgPSBHZXREZXNjcmlwdG9yVGVtcGxhdGVTdGF0ZShkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGlmICh0ZW1wbGF0ZV9zdGF0ZSkgeworICAgICAgICBjb25zdCBhdXRvICZ0ZW1wbGF0ZV9jaSA9IHRlbXBsYXRlX3N0YXRlLT5jcmVhdGVfaW5mbzsKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPFZrUGlwZWxpbmVCaW5kUG9pbnQsIHN0ZDo6c3RyaW5nPiBiaW5kX2Vycm9ycyA9IHsKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItY29tbWFuZEJ1ZmZlci0wMDM2NiIpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLCAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1hbmRCdWZmZXItMDAzNjYiKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1hbmRCdWZmZXItMDAzNjYiKX07CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVQaXBlbGluZUJpbmRQb2ludChjYl9zdGF0ZSwgdGVtcGxhdGVfY2kucGlwZWxpbmVCaW5kUG9pbnQsIGZ1bmNfbmFtZSwgYmluZF9lcnJvcnMpOworCisgICAgICAgIGlmICh0ZW1wbGF0ZV9jaS50ZW1wbGF0ZVR5cGUgIT0gVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9QVVNIX0RFU0NSSVBUT1JTX0tIUikgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlciksIGtWVUlEX0NvcmVfUHVzaERlc2NyaXB0b3JVcGRhdGVfVGVtcGxhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICVzIHdhcyBub3QgY3JlYXRlZCB3aXRoIGZsYWcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXBsYXRlX2NpLnNldCAhPSBzZXQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCBrVlVJRF9Db3JlX1B1c2hEZXNjcmlwdG9yVXBkYXRlX1RlbXBsYXRlX1NldE1pc21hdGNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgJXMgY3JlYXRlZCB3aXRoIHNldCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IG1hdGNoIGNvbW1hbmQgcGFyYW1ldGVyIHNldCAlIiBQUkl1MzIgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpLmNfc3RyKCksIHRlbXBsYXRlX2NpLnNldCwgc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUNvbXBhdEZvclNldChzZXQsIGxheW91dF9kYXRhLCBHZXRQaXBlbGluZUxheW91dCh0ZW1wbGF0ZV9jaS5waXBlbGluZUxheW91dCkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwga1ZVSURfQ29yZV9QdXNoRGVzY3JpcHRvclVwZGF0ZV9UZW1wbGF0ZV9MYXlvdXRNaXNtYXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICVzIGNyZWF0ZWQgd2l0aCAlcyBpcyBpbmNvbXBhdGlibGUgd2l0aCBjb21tYW5kIHBhcmFtZXRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGZvciBzZXQgJSIgUFJJdTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZSh0ZW1wbGF0ZV9jaS5waXBlbGluZUxheW91dCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGxheW91dCkuY19zdHIoKSwgc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkc2wgJiYgdGVtcGxhdGVfc3RhdGUpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IHByb3h5IGluIG9yZGVyIHRvIHVzZSB0aGUgZXhpc3RpbmcgZGVzY3JpcHRvciBzZXQgdXBkYXRlIHZhbGlkYXRpb24KKyAgICAgICAgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0IHByb3h5X2RzKFZLX05VTExfSEFORExFLCBudWxscHRyLCBkc2wsIDAsIG51bGxwdHIsIHJlcG9ydF9kYXRhKTsKKyAgICAgICAgLy8gRGVjb2RlIHRoZSB0ZW1wbGF0ZSBpbnRvIGEgc2V0IG9mIHdyaXRlIHVwZGF0ZXMKKyAgICAgICAgY3ZkZXNjcmlwdG9yc2V0OjpEZWNvZGVkVGVtcGxhdGVVcGRhdGUgZGVjb2RlZF90ZW1wbGF0ZSh0aGlzLCBWS19OVUxMX0hBTkRMRSwgdGVtcGxhdGVfc3RhdGUsIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzbC0+R2V0RGVzY3JpcHRvclNldExheW91dCgpKTsKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGRlY29kZWQgdXBkYXRlIGFnYWluc3QgdGhlIHByb3h5X2RzCisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVQdXNoRGVzY3JpcHRvcnNVcGRhdGUoJnByb3h5X2RzLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVjb2RlZF90ZW1wbGF0ZS5kZXNjX3dyaXRlcy5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRfdGVtcGxhdGUuZGVzY193cml0ZXMuZGF0YSgpLCBmdW5jX25hbWUpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSUXVlcnkoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcGxhbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcGlfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgaWYgKHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJfY2FsbGVkKSB7CisgICAgICAgIGlmIChwbGFuZUluZGV4ID49IHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+ZGlzcGxheV9wbGFuZV9wcm9wZXJ0eV9jb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGh5c2ljYWxEZXZpY2UpLCAiVlVJRC12a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSLXBsYW5lSW5kZXgtMDEyNDkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBwbGFuZUluZGV4IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLCAlZF0gdGhhdCB3YXMgcmV0dXJuZWQgYnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUi4gRG8geW91IGhhdmUgdGhlIHBsYW5lIGluZGV4IGhhcmRjb2RlZD8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9uYW1lLCBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPmRpc3BsYXlfcGxhbmVfcHJvcGVydHlfY291bnQgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHBsYW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRGlzcGxheUNvdW50LCBWa0Rpc3BsYXlLSFIgKnBEaXNwbGF5cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJRdWVyeShwaHlzaWNhbERldmljZSwgcGxhbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5TW9kZUtIUiBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxhbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSICpwQ2FwYWJpbGl0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUlF1ZXJ5KHBoeXNpY2FsRGV2aWNlLCBwbGFuZUluZGV4LCAidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiAqcERpc3BsYXlQbGFuZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSICpwQ2FwYWJpbGl0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUlF1ZXJ5KHBoeXNpY2FsRGV2aWNlLCBwRGlzcGxheVBsYW5lSW5mby0+cGxhbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZERlYnVnTWFya2VyQmVnaW5FWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgKnBNYXJrZXJJbmZvKSBjb25zdCB7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgcmV0dXJuIFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfREVCVUdNQVJLRVJCRUdJTkVYVCwgInZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCgpIik7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kRGVidWdNYXJrZXJFbmRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlKTsKKyAgICByZXR1cm4gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIENNRF9ERUJVR01BUktFUkVOREVYVCwgInZrQ21kRGVidWdNYXJrZXJFbmRFWFQoKSIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCB1aW50MzJfdCBpbmRleCkgY29uc3QgeworICAgIGlmIChkaXNhYmxlZC5xdWVyeV92YWxpZGF0aW9uKSByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgUXVlcnlPYmplY3QgcXVlcnlfb2JqKHF1ZXJ5UG9vbCwgcXVlcnksIGluZGV4KTsKKyAgICBjb25zdCBjaGFyICpjbWRfbmFtZSA9ICJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUKCkiOworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQmVnaW5RdWVyeSgKKyAgICAgICAgY2Jfc3RhdGUsIHF1ZXJ5X29iaiwgZmxhZ3MsIENNRF9CRUdJTlFVRVJZSU5ERVhFREVYVCwgY21kX25hbWUsICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDIzMzgiLCAiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMDgwMyIsCisgICAgICAgICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAwODAwIiwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeS0wMDgwMiIpOworCisgICAgLy8gRXh0ZW5zaW9uIHNwZWNpZmljIFZVJ3MKKyAgICBjb25zdCBhdXRvICZxdWVyeV9wb29sX2NpID0gR2V0UXVlcnlQb29sU3RhdGUocXVlcnlfb2JqLnBvb2wpLT5jcmVhdGVJbmZvOworICAgIGlmIChxdWVyeV9wb29sX2NpLnF1ZXJ5VHlwZSA9PSBWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUKSB7CisgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfdHJhbnNmb3JtX2ZlZWRiYWNrICYmCisgICAgICAgICAgICAoaW5kZXggPj0gcGh5c19kZXZfZXh0X3Byb3BzLnRyYW5zZm9ybV9mZWVkYmFja19wcm9wcy5tYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXMpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDIzMzkiLAorICAgICAgICAgICAgICAgICIlczogaW5kZXggJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgIiBtdXN0IGJlIGxlc3MgdGhhbiBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjptYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXMgJSIgUFJJdTMyICIuIiwKKyAgICAgICAgICAgICAgICBjbWRfbmFtZSwgaW5kZXgsIHBoeXNfZGV2X2V4dF9wcm9wcy50cmFuc2Zvcm1fZmVlZGJhY2tfcHJvcHMubWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjM0MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGluZGV4ICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBtdXN0IGJlIHplcm8gaWYgJXMgd2FzIG5vdCBjcmVhdGVkIHdpdGggdHlwZSBWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhULiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfbmFtZSwgaW5kZXgsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlQb29sKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UHJlQ2FsbFJlY29yZENtZEJlZ2luUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeUNvbnRyb2xGbGFncyBmbGFncywgdWludDMyX3QgaW5kZXgpIHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuOworICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5X29iaiA9IHtxdWVyeVBvb2wsIHF1ZXJ5LCBpbmRleH07CisgICAgRW5xdWV1ZVZlcmlmeUJlZ2luUXVlcnkoY29tbWFuZEJ1ZmZlciwgcXVlcnlfb2JqLCAidmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCgpIik7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuIGZhbHNlOworICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5X29iaiA9IHtxdWVyeVBvb2wsIHF1ZXJ5LCBpbmRleH07CisgICAgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisgICAgcmV0dXJuIFZhbGlkYXRlQ21kRW5kUXVlcnkoY2Jfc3RhdGUsIHF1ZXJ5X29iaiwgQ01EX0VORFFVRVJZSU5ERVhFREVYVCwgInZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULU5vbmUtMDIzNDIiKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGlzY2FyZFJlY3RhbmdsZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVjdDJEICpwRGlzY2FyZFJlY3RhbmdsZXMpIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gTWluaW1hbCB2YWxpZGF0aW9uIGZvciBjb21tYW5kIGJ1ZmZlciBzdGF0ZQorICAgIHJldHVybiBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1NFVERJU0NBUkRSRUNUQU5HTEVFWFQsICJ2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoKSIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZFNldFNhbXBsZUxvY2F0aW9uc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAqcFNhbXBsZUxvY2F0aW9uc0luZm8pIGNvbnN0IHsKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gTWluaW1hbCB2YWxpZGF0aW9uIGZvciBjb21tYW5kIGJ1ZmZlciBzdGF0ZQorICAgIHJldHVybiBWYWxpZGF0ZUNtZChjYl9zdGF0ZSwgQ01EX1NFVFNBTVBMRUxPQ0FUSU9OU0VYVCwgInZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKCkiKTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oY29uc3QgY2hhciAqZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAqY3JlYXRlX2luZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfYW5kcm9pZF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25BTkRST0lEKGNyZWF0ZV9pbmZvKTsKKyAgICB9IGVsc2UgeyAgLy8gTm90IGFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyCisgICAgICAgIGlmIChWS19GT1JNQVRfVU5ERUZJTkVEID09IGNyZWF0ZV9pbmZvLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tZm9ybWF0LTAxNjQ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENyZWF0ZUluZm8gZm9ybWF0IHR5cGUgaXMgVktfRk9STUFUX1VOREVGSU5FRC4iLCBmdW5jX25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICpwWWNiY3JDb252ZXJzaW9uKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCkiLCBwQ3JlYXRlSW5mbyk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUihWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAqcFljYmNyQ29udmVyc2lvbikgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUigpIiwgcENyZWF0ZUluZm8pOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSICpwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmJ1ZmZlcl9kZXZpY2VfYWRkcmVzcy5idWZmZXJEZXZpY2VBZGRyZXNzICYmCisgICAgICAgICFlbmFibGVkX2ZlYXR1cmVzLmJ1ZmZlcl9kZXZpY2VfYWRkcmVzc19leHQuYnVmZmVyRGV2aWNlQWRkcmVzcykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBJbmZvLT5idWZmZXIpLCAiVlVJRC12a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFItYnVmZmVyRGV2aWNlQWRkcmVzcy0wMzMyNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGJ1ZmZlckRldmljZUFkZHJlc3MgZmVhdHVyZSBtdXN0OiBiZSBlbmFibGVkLiIpOworICAgIH0KKworICAgIGlmIChwaHlzaWNhbF9kZXZpY2VfY291bnQgPiAxICYmICFlbmFibGVkX2ZlYXR1cmVzLmJ1ZmZlcl9kZXZpY2VfYWRkcmVzcy5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UgJiYKKyAgICAgICAgIWVuYWJsZWRfZmVhdHVyZXMuYnVmZmVyX2RldmljZV9hZGRyZXNzX2V4dC5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwSW5mby0+YnVmZmVyKSwgIlZVSUQtdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSLWRldmljZS0wMzMyNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSWYgZGV2aWNlIHdhcyBjcmVhdGVkIHdpdGggbXVsdGlwbGUgcGh5c2ljYWwgZGV2aWNlcywgdGhlbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSBmZWF0dXJlIG11c3Q6IGJlIGVuYWJsZWQuIik7CisgICAgfQorCisgICAgY29uc3QgYXV0byBidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShwSW5mby0+YnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyX3N0YXRlKSB7CisgICAgICAgIGlmICghKGJ1ZmZlcl9zdGF0ZS0+Y3JlYXRlSW5mby5mbGFncyAmIFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUikpIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoYnVmZmVyX3N0YXRlLCAidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSLWJ1ZmZlci0wMjYwMCIpOworICAgICAgICB9CisKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3MoYnVmZmVyX3N0YXRlLCBWS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9LSFIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItYnVmZmVyLTAyNjAxIiwgInZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0JVRkZFUl9VU0FHRV9TSEFERVJfREVWSUNFX0FERFJFU1NfQklUX0VYVCIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvRVhUICpwSW5mbykgY29uc3QgeworICAgIHJldHVybiBQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKGRldmljZSwgKGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgKilwSW5mbyk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSICpwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmJ1ZmZlcl9kZXZpY2VfYWRkcmVzcy5idWZmZXJEZXZpY2VBZGRyZXNzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocEluZm8tPmJ1ZmZlciksICJWVUlELXZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItTm9uZS0wMzMyNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGJ1ZmZlckRldmljZUFkZHJlc3MgZmVhdHVyZSBtdXN0OiBiZSBlbmFibGVkLiIpOworICAgIH0KKworICAgIGlmIChwaHlzaWNhbF9kZXZpY2VfY291bnQgPiAxICYmICFlbmFibGVkX2ZlYXR1cmVzLmJ1ZmZlcl9kZXZpY2VfYWRkcmVzcy5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwSW5mby0+YnVmZmVyKSwgIlZVSUQtdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUi1kZXZpY2UtMDMzMjciLAorICAgICAgICAgICAgICAgICAgICAgICAgIklmIGRldmljZSB3YXMgY3JlYXRlZCB3aXRoIG11bHRpcGxlIHBoeXNpY2FsIGRldmljZXMsIHRoZW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UgZmVhdHVyZSBtdXN0OiBiZSBlbmFibGVkLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSICpwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmJ1ZmZlcl9kZXZpY2VfYWRkcmVzcy5idWZmZXJEZXZpY2VBZGRyZXNzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBJbmZvLT5tZW1vcnkpLCAiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLU5vbmUtMDMzMzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBidWZmZXJEZXZpY2VBZGRyZXNzIGZlYXR1cmUgbXVzdDogYmUgZW5hYmxlZC4iKTsKKyAgICB9CisKKyAgICBpZiAocGh5c2ljYWxfZGV2aWNlX2NvdW50ID4gMSAmJiAhZW5hYmxlZF9mZWF0dXJlcy5idWZmZXJfZGV2aWNlX2FkZHJlc3MuYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBJbmZvLT5tZW1vcnkpLCAiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLWRldmljZS0wMzMzNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSWYgZGV2aWNlIHdhcyBjcmVhdGVkIHdpdGggbXVsdGlwbGUgcGh5c2ljYWwgZGV2aWNlcywgdGhlbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSBmZWF0dXJlIG11c3Q6IGJlIGVuYWJsZWQuIik7CisgICAgfQorCisgICAgY29uc3QgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShwSW5mby0+bWVtb3J5KTsKKyAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgYXV0byBjaGFpbmVkX2ZsYWdzX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8+KG1lbV9pbmZvLT5hbGxvY19pbmZvLnBOZXh0KTsKKyAgICAgICAgaWYgKCFjaGFpbmVkX2ZsYWdzX3N0cnVjdCB8fCAhKGNoYWluZWRfZmxhZ3Nfc3RydWN0LT5mbGFncyAmIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19CSVRfS0hSKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBJbmZvLT5tZW1vcnkpLCAiVlVJRC1Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUi1tZW1vcnktMDMzMzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0JJVF9LSFIuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVF1ZXJ5UmFuZ2UoVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHRvdGFsQ291bnQsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWVyeUNvdW50LCBjb25zdCBjaGFyICp2dWlkX2JhZGZpcnN0LCBjb25zdCBjaGFyICp2dWlkX2JhZHJhbmdlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZmlyc3RRdWVyeSA+PSB0b3RhbENvdW50KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgdnVpZF9iYWRmaXJzdCwgImZpcnN0UXVlcnkgKCUiIFBSSXUzMiAiKSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcXVlcnkgcG9vbCBjb3VudCAoJSIgUFJJdTMyICIpIGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LCB0b3RhbENvdW50LCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHF1ZXJ5UG9vbCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKChmaXJzdFF1ZXJ5ICsgcXVlcnlDb3VudCkgPiB0b3RhbENvdW50KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgdnVpZF9iYWRyYW5nZSwgIlF1ZXJ5IHJhbmdlIFslIiBQUkl1MzIgIiwgJSIgUFJJdTMyICIpIGdvZXMgYmV5b25kIHF1ZXJ5IHBvb2wgY291bnQgKCUiIFBSSXUzMiAiKSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwgZmlyc3RRdWVyeSArIHF1ZXJ5Q291bnQsIHRvdGFsQ291bnQsIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocXVlcnlQb29sKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVSZXNldFF1ZXJ5UG9vbEVYVChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVlcnlDb3VudCkgY29uc3QgeworICAgIGlmIChkaXNhYmxlZC5xdWVyeV92YWxpZGF0aW9uKSByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmICghZW5hYmxlZF9mZWF0dXJlcy5ob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVzLmhvc3RRdWVyeVJlc2V0KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1Ob25lLTAyNjY1IiwgIkhvc3QgcXVlcnkgcmVzZXQgbm90IGVuYWJsZWQgZm9yIGRldmljZSIpOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gcXVlcnlfcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5UG9vbCk7CisgICAgaWYgKHF1ZXJ5X3Bvb2xfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVF1ZXJ5UmFuZ2UoZGV2aWNlLCBxdWVyeVBvb2wsIHF1ZXJ5X3Bvb2xfc3RhdGUtPmNyZWF0ZUluZm8ucXVlcnlDb3VudCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1maXJzdFF1ZXJ5LTAyNjY2IiwgIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1maXJzdFF1ZXJ5LTAyNjY3Iik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK1ZrUmVzdWx0IENvcmVDaGVja3M6OkNvcmVMYXllckNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICpwVmFsaWRhdGlvbkNhY2hlKSB7CisgICAgKnBWYWxpZGF0aW9uQ2FjaGUgPSBWYWxpZGF0aW9uQ2FjaGU6OkNyZWF0ZShwQ3JlYXRlSW5mbyk7CisgICAgcmV0dXJuICpwVmFsaWRhdGlvbkNhY2hlID8gVktfU1VDQ0VTUyA6IFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKK30KKwordm9pZCBDb3JlQ2hlY2tzOjpDb3JlTGF5ZXJEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKFZrRGV2aWNlIGRldmljZSwgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgdmFsaWRhdGlvbkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGRlbGV0ZSBDYXN0RnJvbUhhbmRsZTxWYWxpZGF0aW9uQ2FjaGUgKj4odmFsaWRhdGlvbkNhY2hlKTsKK30KKworVmtSZXN1bHQgQ29yZUNoZWNrczo6Q29yZUxheWVyR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVChWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgc2l6ZV90ICpwRGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBEYXRhKSB7CisgICAgc2l6ZV90IGluU2l6ZSA9ICpwRGF0YVNpemU7CisgICAgQ2FzdEZyb21IYW5kbGU8VmFsaWRhdGlvbkNhY2hlICo+KHZhbGlkYXRpb25DYWNoZSktPldyaXRlKHBEYXRhU2l6ZSwgcERhdGEpOworICAgIHJldHVybiAocERhdGEgJiYgKnBEYXRhU2l6ZSAhPSBpblNpemUpID8gVktfSU5DT01QTEVURSA6IFZLX1NVQ0NFU1M7Cit9CisKK1ZrUmVzdWx0IENvcmVDaGVja3M6OkNvcmVMYXllck1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVChWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIGRzdENhY2hlLCB1aW50MzJfdCBzcmNDYWNoZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUICpwU3JjQ2FjaGVzKSB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgYXV0byBkc3QgPSBDYXN0RnJvbUhhbmRsZTxWYWxpZGF0aW9uQ2FjaGUgKj4oZHN0Q2FjaGUpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNyY0NhY2hlQ291bnQ7IGkrKykgeworICAgICAgICBhdXRvIHNyYyA9IENhc3RGcm9tSGFuZGxlPGNvbnN0IFZhbGlkYXRpb25DYWNoZSAqPihwU3JjQ2FjaGVzW2ldKTsKKyAgICAgICAgaWYgKHNyYyA9PSBkc3QpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1kc3RDYWNoZS0wMTUzNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUOiBkc3RDYWNoZSAoMHglIiBQUkl4NjQgIikgbXVzdCBub3QgYXBwZWFyIGluIHBTcmNDYWNoZXMgYXJyYXkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3RDYWNoZSkpOworICAgICAgICAgICAgcmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICB9CisgICAgICAgIGlmICghc2tpcCkgeworICAgICAgICAgICAgZHN0LT5NZXJnZShzcmMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNtZFNldERldmljZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGRldmljZU1hc2ssIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kKGNiX3N0YXRlLCBDTURfU0VUREVWSUNFTUFTSywgZnVuY19uYW1lKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGV2aWNlTWFza1RvUGh5c2ljYWxEZXZpY2VDb3VudChkZXZpY2VNYXNrLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldERldmljZU1hc2stZGV2aWNlTWFzay0wMDEwOCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVEZXZpY2VNYXNrVG9aZXJvKGRldmljZU1hc2ssIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0RGV2aWNlTWFzay1kZXZpY2VNYXNrLTAwMTA5Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURldmljZU1hc2tUb0NvbW1hbmRCdWZmZXIoY2Jfc3RhdGUsIGRldmljZU1hc2ssIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0RGV2aWNlTWFzay1kZXZpY2VNYXNrLTAwMTEwIik7CisgICAgaWYgKGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVEZXZpY2VNYXNrVG9SZW5kZXJQYXNzKGNiX3N0YXRlLCBkZXZpY2VNYXNrLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWRldmljZU1hc2stMDAxMTEiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGV2aWNlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzaykgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZUNtZFNldERldmljZU1hc2soY29tbWFuZEJ1ZmZlciwgZGV2aWNlTWFzaywgInZrU2V0RGV2aWNlTWFzaygpIik7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGV2aWNlTWFza0tIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzaykgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZUNtZFNldERldmljZU1hc2soY29tbWFuZEJ1ZmZlciwgZGV2aWNlTWFzaywgInZrU2V0RGV2aWNlTWFza0tIUigpIik7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCB1aW50NjRfdCAqcFZhbHVlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgY29uc3QgYXV0byAqcFNlbWFwaG9yZSA9IEdldFNlbWFwaG9yZVN0YXRlKHNlbWFwaG9yZSk7CisgICAgaWYgKHBTZW1hcGhvcmUgJiYgcFNlbWFwaG9yZS0+dHlwZSAhPSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChzZW1hcGhvcmUpLCAiVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1zZW1hcGhvcmUtMDMyNTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSOiBzZW1hcGhvcmUgJXMgbXVzdCBiZSBvZiBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNlbWFwaG9yZSkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVF1ZXJ5UG9vbFN0cmlkZShjb25zdCBzdGQ6OnN0cmluZyAmdnVpZF9ub3RfNjQsIGNvbnN0IHN0ZDo6c3RyaW5nICZ2dWlkXzY0LCBjb25zdCBWa0RldmljZVNpemUgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwgY29uc3QgdWludDY0X3QgcGFyYW1ldGVyX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZmxhZ3MgJiBWS19RVUVSWV9SRVNVTFRfNjRfQklUKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgY29uZGl0aW9uX211bHRpcGxlcyA9IDBiMDExMTsKKyAgICAgICAgaWYgKChzdHJpZGUgJiBjb25kaXRpb25fbXVsdGlwbGVzKSB8fCAocGFyYW1ldGVyX3ZhbHVlICYgY29uZGl0aW9uX211bHRpcGxlcykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZF82NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaWRlICUiIFBSSXg2NCAiIG9yICVzICUiIFBSSXg2NCAiIGlzIGludmFsaWQuIiwgc3RyaWRlLCBwYXJhbWV0ZXJfbmFtZSwgcGFyYW1ldGVyX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgY29uZGl0aW9uX211bHRpcGxlcyA9IDBiMDAxMTsKKyAgICAgICAgaWYgKChzdHJpZGUgJiBjb25kaXRpb25fbXVsdGlwbGVzKSB8fCAocGFyYW1ldGVyX3ZhbHVlICYgY29uZGl0aW9uX211bHRpcGxlcykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZF9ub3RfNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmlkZSAlIiBQUkl4NjQgIiBvciAlcyAlIiBQUkl4NjQgIiBpcyBpbnZhbGlkLiIsIHN0cmlkZSwgcGFyYW1ldGVyX25hbWUsIHBhcmFtZXRlcl92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDbWREcmF3U3RyaWRlV2l0aFN0cnVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3Qgc3RkOjpzdHJpbmcgJnZ1aWQsIGNvbnN0IHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHJ1Y3RfbmFtZSwgY29uc3QgdWludDMyX3Qgc3RydWN0X3NpemUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGNvbmRpdGlvbl9tdWx0aXBsZXMgPSAwYjAwMTE7CisgICAgaWYgKChzdHJpZGUgJiBjb25kaXRpb25fbXVsdGlwbGVzKSB8fCAoc3RyaWRlIDwgc3RydWN0X3NpemUpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgdnVpZCwgInN0cmlkZSAlZCBpcyBpbnZhbGlkIG9yIGxlc3MgdGhhbiBzaXplb2YoJXMpICVkLiIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9uYW1lLCBzdHJ1Y3Rfc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ21kRHJhd1N0cmlkZVdpdGhCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZ2dWlkLCBjb25zdCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RydWN0X25hbWUsIGNvbnN0IHVpbnQzMl90IHN0cnVjdF9zaXplLCBjb25zdCB1aW50MzJfdCBkcmF3Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIG9mZnNldCwgY29uc3QgQlVGRkVSX1NUQVRFICpidWZmZXJfc3RhdGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICB1aW50NjRfdCB2YWxpZGF0aW9uX3ZhbHVlID0gc3RyaWRlICogKGRyYXdDb3VudCAtIDEpICsgb2Zmc2V0ICsgc3RydWN0X3NpemU7CisgICAgaWYgKHZhbGlkYXRpb25fdmFsdWUgPiBidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyaWRlWyVkXSAqIChkcmF3Q291bnRbJWRdIC0gMSkgKyBvZmZzZXRbJSIgUFJJeDY0ICJdICsgc2l6ZW9mKCVzKVslZF0gPSAlIiBQUkl4NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplWyUiIFBSSXg2NCAiXSBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkcmF3Q291bnQsIG9mZnNldCwgc3RydWN0X25hbWUsIHN0cnVjdF9zaXplLCB2YWxpZGF0aW9uX3ZhbHVlLCBidWZmZXJfc3RhdGUtPmNyZWF0ZUluZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYnVmZmVyX3N0YXRlLT5idWZmZXIpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBQSVBFTElORV9TVEFURTo6aW5pdEdyYXBoaWNzUGlwZWxpbmUoY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqc3RhdGVfZGF0YSwgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUkVOREVSX1BBU1NfU1RBVEU+ICYmcnBzdGF0ZSkgeworICAgIHJlc2V0KCk7CisgICAgYm9vbCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQgPSBmYWxzZTsKKyAgICBib29sIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQgPSBmYWxzZTsKKyAgICBpZiAocENyZWF0ZUluZm8tPnN1YnBhc3MgPCBycHN0YXRlLT5jcmVhdGVJbmZvLnN1YnBhc3NDb3VudCkgeworICAgICAgICBjb25zdCBhdXRvICZzdWJwYXNzID0gcnBzdGF0ZS0+Y3JlYXRlSW5mby5wU3VicGFzc2VzW3BDcmVhdGVJbmZvLT5zdWJwYXNzXTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VicGFzcy5jb2xvckF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1tpXS5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgdXNlc19jb2xvcl9hdHRhY2htZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ICYmIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHsKKyAgICAgICAgICAgIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGdyYXBoaWNzUGlwZWxpbmVDSS5pbml0aWFsaXplKHBDcmVhdGVJbmZvLCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQsIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQpOworICAgIGlmIChncmFwaGljc1BpcGVsaW5lQ0kucElucHV0QXNzZW1ibHlTdGF0ZSkgeworICAgICAgICB0b3BvbG9neV9hdF9yYXN0ZXJpemVyID0gZ3JhcGhpY3NQaXBlbGluZUNJLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnRvcG9sb2d5OworICAgIH0KKworICAgIHN0YWdlX3N0YXRlLnJlc2l6ZShwQ3JlYXRlSW5mby0+c3RhZ2VDb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5zdGFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAqcFBTU0NJID0gJnBDcmVhdGVJbmZvLT5wU3RhZ2VzW2ldOworICAgICAgICB0aGlzLT5kdXBsaWNhdGVfc2hhZGVycyB8PSB0aGlzLT5hY3RpdmVfc2hhZGVycyAmIHBQU1NDSS0+c3RhZ2U7CisgICAgICAgIHRoaXMtPmFjdGl2ZV9zaGFkZXJzIHw9IHBQU1NDSS0+c3RhZ2U7CisgICAgICAgIHN0YXRlX2RhdGEtPlJlY29yZFBpcGVsaW5lU2hhZGVyU3RhZ2UocFBTU0NJLCB0aGlzLCAmc3RhZ2Vfc3RhdGVbaV0pOworICAgIH0KKworICAgIGlmIChncmFwaGljc1BpcGVsaW5lQ0kucFZlcnRleElucHV0U3RhdGUpIHsKKyAgICAgICAgY29uc3QgYXV0byBwVklDSSA9IGdyYXBoaWNzUGlwZWxpbmVDSS5wVmVydGV4SW5wdXRTdGF0ZTsKKyAgICAgICAgaWYgKHBWSUNJLT52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCkgeworICAgICAgICAgICAgdGhpcy0+dmVydGV4X2JpbmRpbmdfZGVzY3JpcHRpb25zXyA9IHN0ZDo6dmVjdG9yPFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24+KAorICAgICAgICAgICAgICAgIHBWSUNJLT5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucywgcFZJQ0ktPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zICsgcFZJQ0ktPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50KTsKKworICAgICAgICAgICAgdGhpcy0+dmVydGV4X2JpbmRpbmdfdG9faW5kZXhfbWFwXy5yZXNlcnZlKHBWSUNJLT52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFZJQ0ktPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICB0aGlzLT52ZXJ0ZXhfYmluZGluZ190b19pbmRleF9tYXBfW3BWSUNJLT5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uc1tpXS5iaW5kaW5nXSA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBWSUNJLT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50KSB7CisgICAgICAgICAgICB0aGlzLT52ZXJ0ZXhfYXR0cmlidXRlX2Rlc2NyaXB0aW9uc18gPSBzdGQ6OnZlY3RvcjxWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24+KAorICAgICAgICAgICAgICAgIHBWSUNJLT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLCBwVklDSS0+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyArIHBWSUNJLT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50KTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwVklDSS0+dmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBhdHRyaWJ1dGVfZm9ybWF0ID0gcFZJQ0ktPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnNbaV0uZm9ybWF0OworICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSB2dHhfYXR0cmliX3JlcV9hbGlnbm1lbnQgPSBGb3JtYXRFbGVtZW50U2l6ZShhdHRyaWJ1dGVfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpZiAoRm9ybWF0RWxlbWVudElzVGV4ZWwoYXR0cmlidXRlX2Zvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdnR4X2F0dHJpYl9yZXFfYWxpZ25tZW50ID0gU2FmZURpdmlzaW9uKHZ0eF9hdHRyaWJfcmVxX2FsaWdubWVudCwgRm9ybWF0Q2hhbm5lbENvdW50KGF0dHJpYnV0ZV9mb3JtYXQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy0+dmVydGV4X2F0dHJpYnV0ZV9hbGlnbm1lbnRzXy5wdXNoX2JhY2sodnR4X2F0dHJpYl9yZXFfYWxpZ25tZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZ3JhcGhpY3NQaXBlbGluZUNJLnBDb2xvckJsZW5kU3RhdGUpIHsKKyAgICAgICAgY29uc3QgYXV0byBwQ0JDSSA9IGdyYXBoaWNzUGlwZWxpbmVDSS5wQ29sb3JCbGVuZFN0YXRlOworICAgICAgICBpZiAocENCQ0ktPmF0dGFjaG1lbnRDb3VudCkgeworICAgICAgICAgICAgdGhpcy0+YXR0YWNobWVudHMgPQorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlPihwQ0JDSS0+cEF0dGFjaG1lbnRzLCBwQ0JDSS0+cEF0dGFjaG1lbnRzICsgcENCQ0ktPmF0dGFjaG1lbnRDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcnBfc3RhdGUgPSBycHN0YXRlOworfQorCit2b2lkIFBJUEVMSU5FX1NUQVRFOjppbml0Q29tcHV0ZVBpcGVsaW5lKGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKnN0YXRlX2RhdGEsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pIHsKKyAgICByZXNldCgpOworICAgIGNvbXB1dGVQaXBlbGluZUNJLmluaXRpYWxpemUocENyZWF0ZUluZm8pOworICAgIHN3aXRjaCAoY29tcHV0ZVBpcGVsaW5lQ0kuc3RhZ2Uuc3RhZ2UpIHsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQ6CisgICAgICAgICAgICB0aGlzLT5hY3RpdmVfc2hhZGVycyB8PSBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQ7CisgICAgICAgICAgICBzdGFnZV9zdGF0ZS5yZXNpemUoMSk7CisgICAgICAgICAgICBzdGF0ZV9kYXRhLT5SZWNvcmRQaXBlbGluZVNoYWRlclN0YWdlKCZwQ3JlYXRlSW5mby0+c3RhZ2UsIHRoaXMsICZzdGFnZV9zdGF0ZVswXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRPRE8gOiBGbGFnIGVycm9yCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgUElQRUxJTkVfU1RBVEU6OmluaXRSYXlUcmFjaW5nUGlwZWxpbmVOVihjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpzdGF0ZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICpwQ3JlYXRlSW5mbykgeworICAgIHJlc2V0KCk7CisgICAgcmF5dHJhY2luZ1BpcGVsaW5lQ0kuaW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisKKyAgICBzdGFnZV9zdGF0ZS5yZXNpemUocENyZWF0ZUluZm8tPnN0YWdlQ291bnQpOworICAgIGZvciAodWludDMyX3Qgc3RhZ2VfaW5kZXggPSAwOyBzdGFnZV9pbmRleCA8IHBDcmVhdGVJbmZvLT5zdGFnZUNvdW50OyBzdGFnZV9pbmRleCsrKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnNoYWRlcl9zdGFnZSA9IHBDcmVhdGVJbmZvLT5wU3RhZ2VzW3N0YWdlX2luZGV4XTsKKyAgICAgICAgc3dpdGNoIChzaGFkZXJfc3RhZ2Uuc3RhZ2UpIHsKKyAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlY6CisgICAgICAgICAgICAgICAgdGhpcy0+YWN0aXZlX3NoYWRlcnMgfD0gVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OVjoKKyAgICAgICAgICAgICAgICB0aGlzLT5hY3RpdmVfc2hhZGVycyB8PSBWS19TSEFERVJfU1RBR0VfQU5ZX0hJVF9CSVRfTlY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlY6CisgICAgICAgICAgICAgICAgdGhpcy0+YWN0aXZlX3NoYWRlcnMgfD0gVktfU0hBREVSX1NUQUdFX0NMT1NFU1RfSElUX0JJVF9OVjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX01JU1NfQklUX05WOgorICAgICAgICAgICAgICAgIHRoaXMtPmFjdGl2ZV9zaGFkZXJzIHw9IFZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OVjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0lOVEVSU0VDVElPTl9CSVRfTlY6CisgICAgICAgICAgICAgICAgdGhpcy0+YWN0aXZlX3NoYWRlcnMgfD0gVktfU0hBREVSX1NUQUdFX0lOVEVSU0VDVElPTl9CSVRfTlY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlY6CisgICAgICAgICAgICAgICAgdGhpcy0+YWN0aXZlX3NoYWRlcnMgfD0gVktfU0hBREVSX1NUQUdFX0NBTExBQkxFX0JJVF9OVjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gVE9ETyA6IEZsYWcgZXJyb3IKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZV9kYXRhLT5SZWNvcmRQaXBlbGluZVNoYWRlclN0YWdlKCZzaGFkZXJfc3RhZ2UsIHRoaXMsICZzdGFnZV9zdGF0ZVtzdGFnZV9pbmRleF0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb3JlX3ZhbGlkYXRpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb3JlX3ZhbGlkYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQyMjUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbi5oCkBAIC0wLDAgKzEsMTA1NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5Z29AZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZkBpancuY28ubno+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic3RhdGVfdHJhY2tlci5oIgorI2luY2x1ZGUgImdwdV92YWxpZGF0aW9uLmgiCisjaW5jbHVkZSAic2hhZGVyX3ZhbGlkYXRpb24uaCIKKworY2xhc3MgQ29yZUNoZWNrcyA6IHB1YmxpYyBWYWxpZGF0aW9uU3RhdGVUcmFja2VyIHsKKyAgcHVibGljOgorICAgIHVzaW5nIFN0YXRlVHJhY2tlciA9IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQ2NF90PiBhaGJfZXh0X2Zvcm1hdHNfc2V0OworICAgIEdsb2JhbFFGT1RyYW5zZmVyQmFycmllck1hcDxWa0ltYWdlTWVtb3J5QmFycmllcj4gcWZvX3JlbGVhc2VfaW1hZ2VfYmFycmllcl9tYXA7CisgICAgR2xvYmFsUUZPVHJhbnNmZXJCYXJyaWVyTWFwPFZrQnVmZmVyTWVtb3J5QmFycmllcj4gcWZvX3JlbGVhc2VfYnVmZmVyX2JhcnJpZXJfbWFwOworICAgIHVub3JkZXJlZF9tYXA8VmtJbWFnZSwgc3RkOjp2ZWN0b3I8SW1hZ2VTdWJyZXNvdXJjZVBhaXI+PiBpbWFnZVN1YnJlc291cmNlTWFwOworICAgIHVzaW5nIEltYWdlU3VicmVzUGFpckxheW91dE1hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxJbWFnZVN1YnJlc291cmNlUGFpciwgSU1BR0VfTEFZT1VUX1NUQVRFPjsKKyAgICBJbWFnZVN1YnJlc1BhaXJMYXlvdXRNYXAgaW1hZ2VMYXlvdXRNYXA7CisKKyAgICB2b2lkIEluY3JlbWVudENvbW1hbmRDb3VudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcik7CisKKyAgICBib29sIFZlcmlmeVF1ZXVlU3RhdGVUb1NlcShjb25zdCBRVUVVRV9TVEFURSogaW5pdGlhbF9xdWV1ZSwgdWludDY0X3QgaW5pdGlhbF9zZXEpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVTZXRNZW1CaW5kaW5nKFZrRGV2aWNlTWVtb3J5IG1lbSwgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUmIHR5cGVkX2hhbmRsZSwgY29uc3QgY2hhciogYXBpTmFtZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZURldmljZVF1ZXVlRmFtaWx5KHVpbnQzMl90IHF1ZXVlX2ZhbWlseSwgY29uc3QgY2hhciogY21kX25hbWUsIGNvbnN0IGNoYXIqIHBhcmFtZXRlcl9uYW1lLCBjb25zdCBjaGFyKiBlcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeShWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCwgY29uc3QgY2hhciogYXBpX25hbWUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbykgY29uc3Q7CisgICAgYm9vbCBDaGVja0NvbW1hbmRCdWZmZXJzSW5GbGlnaHQoY29uc3QgQ09NTUFORF9QT09MX1NUQVRFKiBwUG9vbCwgY29uc3QgY2hhciogYWN0aW9uLCBjb25zdCBjaGFyKiBlcnJvcl9jb2RlKSBjb25zdDsKKyAgICBib29sIENoZWNrQ29tbWFuZEJ1ZmZlckluRmxpZ2h0KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IGNoYXIqIGFjdGlvbiwgY29uc3QgY2hhciogZXJyb3JfY29kZSkgY29uc3Q7CisgICAgYm9vbCBWZXJpZnlRdWV1ZVN0YXRlVG9GZW5jZShWa0ZlbmNlIGZlbmNlKSBjb25zdDsKKyAgICB2b2lkIFN0b3JlTWVtUmFuZ2VzKFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpOworICAgIGJvb2wgVmFsaWRhdGVJZGxlRGVzY3JpcHRvclNldChWa0Rlc2NyaXB0b3JTZXQgc2V0LCBjb25zdCBjaGFyKiBmdW5jX3N0cikgY29uc3Q7CisgICAgdm9pZCBJbml0aWFsaXplU2hhZG93TWVtb3J5KFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsIHZvaWQqKiBwcERhdGEpOworICAgIGJvb2wgVmFsaWRhdGVQaXBlbGluZUxvY2tlZChzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8UElQRUxJTkVfU1RBVEU+PiBjb25zdCYgcFBpcGVsaW5lcywgaW50IHBpcGVsaW5lSW5kZXgpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVQaXBlbGluZVVubG9ja2VkKGNvbnN0IFBJUEVMSU5FX1NUQVRFKiBwUGlwZWxpbmUsIHVpbnQzMl90IHBpcGVsaW5lSW5kZXgpIGNvbnN0OworICAgIGJvb2wgVmFsaWRJbWFnZUJ1ZmZlclF1ZXVlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiBvYmplY3QsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IHVpbnQzMl90KiBpbmRpY2VzKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlRmVuY2VGb3JTdWJtaXQoY29uc3QgRkVOQ0VfU1RBVEUqIHBGZW5jZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVNlbWFwaG9yZXNGb3JTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtTdWJtaXRJbmZvKiBzdWJtaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PFZrU2VtYXBob3JlPiogdW5zaWduYWxlZF9zZW1hX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8VmtTZW1hcGhvcmU+KiBzaWduYWxlZF9zZW1hX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8VmtTZW1hcGhvcmU+KiBpbnRlcm5hbF9zZW1hX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bm9yZGVyZWRfbWFwPFZrU2VtYXBob3JlLCBzdGQ6OnNldDx1aW50NjRfdD4+KiB0aW1lbGluZV92YWx1ZXNfYXJnKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlTWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UoVmtRdWV1ZSBxdWV1ZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCB1aW50NjRfdCBzZW1hcGhvcmVIYW5kbGVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5vcmRlcmVkX21hcDxWa1NlbWFwaG9yZSwgc3RkOjpzZXQ8dWludDY0X3Q+PiogdGltZWxpbmVfdmFsdWVzX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY19uYW1lLCBjb25zdCBjaGFyKiB2dWlkKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnNGb3JTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtTdWJtaXRJbmZvKiBzdWJtaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlU3VicmVzUGFpckxheW91dE1hcCogbG9jYWxJbWFnZUxheW91dE1hcF9hcmcsIFF1ZXJ5TWFwKiBsb2NhbF9xdWVyeV90b19zdGF0ZV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZrQ29tbWFuZEJ1ZmZlcj4qIGN1cnJlbnRfY21kc19hcmcpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVTdGF0dXMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogcE5vZGUsIENCU3RhdHVzRmxhZ3Mgc3RhdHVzX21hc2ssIFZrRmxhZ3MgbXNnX2ZsYWdzLCBjb25zdCBjaGFyKiBmYWlsX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1zZ19jb2RlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlRHJhd1N0YXRlRmxhZ3MoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogcENCLCBjb25zdCBQSVBFTElORV9TVEFURSogcFBpcGUsIGJvb2wgaW5kZXhlZCwgY29uc3QgY2hhciogbXNnX2NvZGUpIGNvbnN0OworICAgIGJvb2wgTG9nSW52YWxpZEF0dGFjaG1lbnRNZXNzYWdlKGNvbnN0IGNoYXIqIHR5cGUxX3N0cmluZywgY29uc3QgUkVOREVSX1BBU1NfU1RBVEUqIHJwMV9zdGF0ZSwgY29uc3QgY2hhciogdHlwZTJfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFKiBycDJfc3RhdGUsIHVpbnQzMl90IHByaW1hcnlfYXR0YWNoLCB1aW50MzJfdCBzZWNvbmRhcnlfYXR0YWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1zZywgY29uc3QgY2hhciogY2FsbGVyLCBjb25zdCBjaGFyKiBlcnJvcl9jb2RlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlU3RhZ2VNYXNrR3NUc0VuYWJsZXMoVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrLCBjb25zdCBjaGFyKiBjYWxsZXIsIGNvbnN0IGNoYXIqIGdlb19lcnJvcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzc19lcnJvcl9pZCwgY29uc3QgY2hhciogbWVzaF9lcnJvcl9pZCwgY29uc3QgY2hhciogdGFza19lcnJvcl9pZCkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZU1hcE1lbVJhbmdlKGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVB1c2hDb25zdGFudFJhbmdlKGNvbnN0IHVpbnQzMl90IG9mZnNldCwgY29uc3QgdWludDMyX3Qgc2l6ZSwgY29uc3QgY2hhciogY2FsbGVyX25hbWUsIHVpbnQzMl90IGluZGV4KSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlUmVuZGVyUGFzc0RBRyhSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogcENyZWF0ZUluZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVBdHRhY2htZW50Q29tcGF0aWJpbGl0eShjb25zdCBjaGFyKiB0eXBlMV9zdHJpbmcsIGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFKiBycDFfc3RhdGUsIGNvbnN0IGNoYXIqIHR5cGUyX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkVOREVSX1BBU1NfU1RBVEUqIHJwMl9zdGF0ZSwgdWludDMyX3QgcHJpbWFyeV9hdHRhY2gsIHVpbnQzMl90IHNlY29uZGFyeV9hdHRhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbGxlciwgY29uc3QgY2hhciogZXJyb3JfY29kZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVN1YnBhc3NDb21wYXRpYmlsaXR5KGNvbnN0IGNoYXIqIHR5cGUxX3N0cmluZywgY29uc3QgUkVOREVSX1BBU1NfU1RBVEUqIHJwMV9zdGF0ZSwgY29uc3QgY2hhciogdHlwZTJfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRU5ERVJfUEFTU19TVEFURSogcnAyX3N0YXRlLCBjb25zdCBpbnQgc3VicGFzcywgY29uc3QgY2hhciogY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9jb2RlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlUmVuZGVyUGFzc0NvbXBhdGliaWxpdHkoY29uc3QgY2hhciogdHlwZTFfc3RyaW5nLCBjb25zdCBSRU5ERVJfUEFTU19TVEFURSogcnAxX3N0YXRlLCBjb25zdCBjaGFyKiB0eXBlMl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFKiBycDJfc3RhdGUsIGNvbnN0IGNoYXIqIGNhbGxlciwgY29uc3QgY2hhciogZXJyb3JfY29kZSkgY29uc3Q7CisgICAgYm9vbCBSZXBvcnRJbnZhbGlkQ29tbWFuZEJ1ZmZlcihjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgY29uc3QgY2hhciogY2FsbF9zb3VyY2UpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVRdWV1ZUZhbWlseUluZGV4KGNvbnN0IFBIWVNJQ0FMX0RFVklDRV9TVEFURSogcGRfc3RhdGUsIHVpbnQzMl90IHJlcXVlc3RlZF9xdWV1ZV9mYW1pbHksIGNvbnN0IGNoYXIqIGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNtZF9uYW1lLCBjb25zdCBjaGFyKiBxdWV1ZV9mYW1pbHlfdmFyX25hbWUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVEZXZpY2VRdWV1ZUNyZWF0ZUluZm9zKGNvbnN0IFBIWVNJQ0FMX0RFVklDRV9TVEFURSogcGRfc3RhdGUsIHVpbnQzMl90IGluZm9fY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8qIGluZm9zKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVQaXBlbGluZVZlcnRleERpdmlzb3JzKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxQSVBFTElORV9TVEFURT4+IGNvbnN0JiBwaXBlX3N0YXRlX3ZlYywgY29uc3QgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcGlwZV9jaXMpIGNvbnN0OworICAgIHZvaWQgRW5xdWV1ZVN1Ym1pdFRpbWVWYWxpZGF0ZUltYWdlQmFycmllckF0dGFjaG1lbnQoY29uc3QgY2hhciogZnVuY19uYW1lLCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtQmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbUJhcnJpZXJzKTsKKyAgICBib29sIFZhbGlkYXRlSW1hZ2VCYXJyaWVyQXR0YWNobWVudChjb25zdCBjaGFyKiBmdW5jTmFtZSwgQ01EX0JVRkZFUl9TVEFURSBjb25zdCogY2Jfc3RhdGUsIFZrRnJhbWVidWZmZXIgZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlX3N1YnBhc3MsIGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSJiBzdWJfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSYgcnBfaGFuZGxlLCB1aW50MzJfdCBpbWdfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXImIGltZ19iYXJyaWVyKSBjb25zdDsKKyAgICBzdGF0aWMgYm9vbCBWYWxpZGF0ZUNvbmN1cnJlbnRCYXJyaWVyQXRTdWJtaXQoY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciogc3RhdGVfZGF0YSwgY29uc3QgUVVFVUVfU1RBVEUqIHF1ZXVlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiB0eXBlZF9oYW5kbGUsIHVpbnQzMl90IHNyY19xdWV1ZV9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdF9xdWV1ZV9mYW1pbHkpOworICAgIGJvb2wgVmFsaWRhdGVDbWRCZWdpblJlbmRlclBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFJlbmRlclBhc3NDcmVhdGVWZXJzaW9uIHJwX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIHBSZW5kZXJQYXNzQmVnaW4pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVEZXBlbmRlbmNpZXMoRlJBTUVCVUZGRVJfU1RBVEUgY29uc3QqIGZyYW1lYnVmZmVyLCBSRU5ERVJfUEFTU19TVEFURSBjb25zdCogcmVuZGVyUGFzcykgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUJhcnJpZXJzKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjX3N0YWdlX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdF9zdGFnZV9tYXNrLCB1aW50MzJfdCBtZW1CYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciogcE1lbUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogcEJ1ZmZlck1lbUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU1lbUJhcnJpZXJDb3VudCwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbUJhcnJpZXJzKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQmFycmllclF1ZXVlRmFtaWxpZXMoY29uc3QgY2hhciogZnVuY19uYW1lLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXImIGJhcnJpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElNQUdFX1NUQVRFKiBzdGF0ZV9kYXRhKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQmFycmllclF1ZXVlRmFtaWxpZXMoY29uc3QgY2hhciogZnVuY19uYW1lLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyJiBiYXJyaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCVUZGRVJfU1RBVEUqIHN0YXRlX2RhdGEpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDcmVhdGVTd2FwY2hhaW4oY29uc3QgY2hhciogZnVuY19uYW1lLCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1VSRkFDRV9TVEFURSogc3VyZmFjZV9zdGF0ZSwgY29uc3QgU1dBUENIQUlOX05PREUqIG9sZF9zd2FwY2hhaW5fc3RhdGUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVQaXBlbGluZUJpbmRQb2ludChjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgVmtQaXBlbGluZUJpbmRQb2ludCBiaW5kX3BvaW50LCBjb25zdCBjaGFyKiBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPFZrUGlwZWxpbmVCaW5kUG9pbnQsIHN0ZDo6c3RyaW5nPiYgYmluZF9lcnJvcnMpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVNZW1vcnlJc01hcHBlZChjb25zdCBjaGFyKiBmdW5jTmFtZSwgdWludDMyX3QgbWVtUmFuZ2VDb3VudCwgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogcE1lbVJhbmdlcykgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUFuZENvcHlOb25jb2hlcmVudE1lbW9yeVRvRHJpdmVyKHVpbnQzMl90IG1lbV9yYW5nZV9jb3VudCwgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogbWVtX3JhbmdlcykgY29uc3Q7CisgICAgdm9pZCBDb3B5Tm9uY29oZXJlbnRNZW1vcnlGcm9tRHJpdmVyKHVpbnQzMl90IG1lbV9yYW5nZV9jb3VudCwgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogbWVtX3Jhbmdlcyk7CisgICAgYm9vbCBWYWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlRGV2aWNlTGltaXRzKGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgdWludDMyX3QgbWVtX3JhbmdlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBtZW1fcmFuZ2VzKSBjb25zdDsKKyAgICBCYXJyaWVyT3BlcmF0aW9uc1R5cGUgQ29tcHV0ZUJhcnJpZXJPcGVyYXRpb25zVHlwZShjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgdWludDMyX3QgYnVmZmVyX2JhcnJpZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBidWZmZXJfYmFycmllcnMsIHVpbnQzMl90IGltYWdlX2JhcnJpZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIGltYWdlX2JhcnJpZXJzKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlU3RhZ2VNYXNrc0FnYWluc3RRdWV1ZUNhcGFiaWxpdGllcyhjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc291cmNlX3N0YWdlX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZGVzdF9zdGFnZV9tYXNrLCBCYXJyaWVyT3BlcmF0aW9uc1R5cGUgYmFycmllcl9vcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBjb25zdCBjaGFyKiBlcnJvcl9jb2RlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlUmVuZGVyUGFzc0ltYWdlQmFycmllcnMoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCB1aW50MzJfdCBhY3RpdmVfc3VicGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFImIHN1Yl9kZXNjLCBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSYgcnBfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSKiBkZXBlbmRlbmNpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgc2VsZl9kZXBlbmRlbmNpZXMsIHVpbnQzMl90IGltYWdlX21lbV9iYXJyaWVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogaW1hZ2VfYmFycmllcnMpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVTZWNvbmRhcnlDb21tYW5kQnVmZmVyU3RhdGUoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogcENCLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBwU3ViQ0IpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVGcmFtZWJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgcHJpbWFyeUJ1ZmZlciwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSogcENCLCBWa0NvbW1hbmRCdWZmZXIgc2Vjb25kYXJ5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBwU3ViQ0IsIGNvbnN0IGNoYXIqIGNhbGxlcikgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShjb25zdCBjaGFyKiBmdW5jX25hbWUsIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogY3JlYXRlX2luZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVJbXBvcnRGZW5jZShWa0ZlbmNlIGZlbmNlLCBjb25zdCBjaGFyKiBjYWxsZXJfbmFtZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUFjcXVpcmVOZXh0SW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBDb21tYW5kVmVyc2lvbiBjbWRfdmVyc2lvbiwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgVmtGZW5jZSBmZW5jZSwgdWludDMyX3QqIHBJbWFnZUluZGV4LCBjb25zdCBjaGFyKiBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2VtYXBob3JlX3R5cGVfdnVpZCkgY29uc3Q7CisgICAgYm9vbCBWZXJpZnlSZW5kZXJBcmVhQm91bmRzKGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbikgY29uc3Q7CisgICAgYm9vbCBWZXJpZnlGcmFtZWJ1ZmZlckFuZFJlbmRlclBhc3NJbWFnZVZpZXdzKGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbkluZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVQcmltYXJ5Q29tbWFuZEJ1ZmZlcihjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBwQ0IsIGNoYXIgY29uc3QqIGNtZF9uYW1lLCBjb25zdCBjaGFyKiBlcnJvcl9jb2RlKSBjb25zdDsKKyAgICB2b2lkIFJlY29yZENtZE5leHRTdWJwYXNzTGF5b3V0cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpOworICAgIGJvb2wgVmFsaWRhdGVDbWRFbmRSZW5kZXJQYXNzKFJlbmRlclBhc3NDcmVhdGVWZXJzaW9uIHJwX3ZlcnNpb24sIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSBjb25zdDsKKyAgICB2b2lkIFJlY29yZENtZEVuZFJlbmRlclBhc3NMYXlvdXRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKKyAgICBib29sIFZhbGlkYXRlRnJhbWVidWZmZXJDcmVhdGVJbmZvKGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbykgY29uc3Q7CisgICAgYm9vbCBNYXRjaFVzYWdlKHVpbnQzMl90IGNvdW50LCBjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBhdHRhY2htZW50cywgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIGZiY2ksCisgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VVc2FnZUZsYWdCaXRzIHVzYWdlX2ZsYWcsIGNvbnN0IGNoYXIqIGVycm9yX2NvZGUpIGNvbnN0OworICAgIGJvb2wgSXNJbWFnZUxheW91dFJlYWRPbmx5KFZrSW1hZ2VMYXlvdXQgbGF5b3V0KSBjb25zdDsKKyAgICBib29sIENoZWNrRGVwZW5kZW5jeUV4aXN0cyhjb25zdCB1aW50MzJfdCBzdWJwYXNzLCBjb25zdCBWa0ltYWdlTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdWJwYXNzTGF5b3V0PiYgZGVwZW5kZW50X3N1YnBhc3NlcywgY29uc3Qgc3RkOjp2ZWN0b3I8REFHTm9kZT4mIHN1YnBhc3NfdG9fbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBza2lwKSBjb25zdDsKKyAgICBib29sIENoZWNrUHJlc2VydmVkKGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgaW50IGluZGV4LCBjb25zdCB1aW50MzJfdCBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8REFHTm9kZT4mIHN1YnBhc3NfdG9fbm9kZSwgaW50IGRlcHRoLCBib29sJiBza2lwKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQmluZEltYWdlTWVtb3J5KGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyYgYmluZEluZm8sIGNvbnN0IGNoYXIqIGFwaV9uYW1lKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSUXVlcnkoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcGxhbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXBpX25hbWUpIGNvbnN0OworICAgIHN0YXRpYyBib29sIFZhbGlkYXRlQ29weVF1ZXJ5UG9vbFJlc3VsdHMoY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciogc3RhdGVfZGF0YSwgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MsIFF1ZXJ5TWFwKiBsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCk7CisgICAgc3RhdGljIGJvb2wgVmVyaWZ5UXVlcnlJc1Jlc2V0KGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIqIHN0YXRlX2RhdGEsIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBRdWVyeU9iamVjdCBxdWVyeV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgUXVlcnlNYXAqIGxvY2FsUXVlcnlUb1N0YXRlTWFwKTsKKyAgICBib29sIFZhbGlkYXRlSW1wb3J0U2VtYXBob3JlKFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgY29uc3QgY2hhciogY2FsbGVyX25hbWUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVCZWdpblF1ZXJ5KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCBjb25zdCBRdWVyeU9iamVjdCYgcXVlcnlfb2JqLCBWa0ZsYWdzIGZsYWdzLCBDTURfVFlQRSBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY21kX25hbWUsIGNvbnN0IGNoYXIqIHZ1aWRfcXVldWVfZmxhZ3MsIGNvbnN0IGNoYXIqIHZ1aWRfcXVldWVfZmVlZGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdnVpZF9xdWV1ZV9vY2NsdXNpb24sIGNvbnN0IGNoYXIqIHZ1aWRfcHJlY2lzZSwgY29uc3QgY2hhciogdnVpZF9xdWVyeV9jb3VudCkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUNtZEVuZFF1ZXJ5KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCBjb25zdCBRdWVyeU9iamVjdCYgcXVlcnlfb2JqLCBDTURfVFlQRSBjbWQsIGNvbnN0IGNoYXIqIGNtZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2dWlkX3F1ZXVlX2ZsYWdzLCBjb25zdCBjaGFyKiB2dWlkX2FjdGl2ZV9xdWVyaWVzKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVDbWREcmF3VHlwZShWa0NvbW1hbmRCdWZmZXIgY21kX2J1ZmZlciwgYm9vbCBpbmRleGVkLCBWa1BpcGVsaW5lQmluZFBvaW50IGJpbmRfcG9pbnQsIENNRF9UWVBFIGNtZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXIsIFZrUXVldWVGbGFncyBxdWV1ZV9mbGFncywgY29uc3QgY2hhciogcXVldWVfZmxhZ19jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZW5kZXJwYXNzX21zZ19jb2RlLCBjb25zdCBjaGFyKiBwaXBlYm91bmRfbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGR5bmFtaWNfc3RhdGVfbXNnX2NvZGUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDbWROZXh0U3VicGFzcyhSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUluc2VydE1lbW9yeVJhbmdlKGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiB0eXBlZF9oYW5kbGUsIGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0LCBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyYgbWVtUmVxdWlyZW1lbnRzLCBib29sIGlzX2xpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXBpX25hbWUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVJbnNlcnRJbWFnZU1lbW9yeVJhbmdlKFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvLCBWa0RldmljZVNpemUgbWVtX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyYgbWVtX3JlcXMsIGJvb2wgaXNfbGluZWFyLCBjb25zdCBjaGFyKiBhcGlfbmFtZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUluc2VydEJ1ZmZlck1lbW9yeVJhbmdlKFZrQnVmZmVyIGJ1ZmZlciwgY29uc3QgREVWSUNFX01FTU9SWV9TVEFURSogbWVtX2luZm8sIFZrRGV2aWNlU2l6ZSBtZW1fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyYgbWVtX3JlcXMsIGNvbnN0IGNoYXIqIGFwaV9uYW1lKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlSW5zZXJ0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmFuZ2UoVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhcywgY29uc3QgREVWSUNFX01FTU9SWV9TVEFURSogbWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtZW1fb2Zmc2V0LCBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyYgbWVtX3JlcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFwaV9uYW1lKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVNZW1vcnlUeXBlcyhjb25zdCBERVZJQ0VfTUVNT1JZX1NUQVRFKiBtZW1faW5mbywgY29uc3QgdWludDMyX3QgbWVtb3J5X3R5cGVfYml0cywgY29uc3QgY2hhciogZnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1zZ0NvZGUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDb21tYW5kQnVmZmVyU3RhdGUoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIGNvbnN0IGNoYXIqIGNhbGxfc291cmNlLCBpbnQgY3VycmVudF9zdWJtaXRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2dV9pZCkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUNvbW1hbmRCdWZmZXJTaW11bHRhbmVvdXNVc2UoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogcENCLCBpbnQgY3VycmVudF9zdWJtaXRfY291bnQpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZXREZXZpY2VRdWV1ZSh1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCBxdWV1ZUluZGV4LCBWa1F1ZXVlKiBwUXVldWUsIGNvbnN0IGNoYXIqIHZhbGlkX3FmaV92dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBxZmlfaW5fcmFuZ2VfdnVpZCkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVJlbmRlcnBhc3NBdHRhY2htZW50VXNhZ2UoUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqIHBDcmVhdGVJbmZvKSBjb25zdDsKKyAgICBib29sIEFkZEF0dGFjaG1lbnRVc2UoUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwgdWludDMyX3Qgc3VicGFzcywgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGF0dGFjaG1lbnRfdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmtJbWFnZUxheW91dD4mIGF0dGFjaG1lbnRfbGF5b3V0cywgdWludDMyX3QgYXR0YWNobWVudCwgdWludDhfdCBuZXdfdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IG5ld19sYXlvdXQpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVBdHRhY2htZW50SW5kZXgoUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwgdWludDMyX3QgYXR0YWNobWVudCwgdWludDMyX3QgYXR0YWNobWVudF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDcmVhdGVSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogcENyZWF0ZUluZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVSZW5kZXJQYXNzUGlwZWxpbmVCYXJyaWVycyhjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY19zdGFnZV9tYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3Rfc3RhZ2VfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeV9mbGFncywgdWludDMyX3QgbWVtX2JhcnJpZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogbWVtX2JhcnJpZXJzLCB1aW50MzJfdCBidWZmZXJfbWVtX2JhcnJpZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogYnVmZmVyX21lbV9iYXJyaWVycywgdWludDMyX3QgaW1hZ2VfbWVtX2JhcnJpZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBpbWFnZV9iYXJyaWVycykgY29uc3Q7CisgICAgYm9vbCBDaGVja1N0YWdlTWFza1F1ZXVlQ29tcGF0aWJpbGl0eShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlX21hc2ssIFZrUXVldWVGbGFncyBxdWV1ZV9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBjb25zdCBjaGFyKiBzcmNfb3JfZGVzdCwgY29uc3QgY2hhciogZXJyb3JfY29kZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0J1ZmZlcihjb25zdCBCVUZGRVJfU1RBVEUqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9JbWFnZShjb25zdCBJTUFHRV9TVEFURSosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0FjY2VsZXJhdGlvblN0cnVjdHVyZShjb25zdCBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlT2JqZWN0Tm90SW5Vc2UoY29uc3QgQkFTRV9OT0RFKiBvYmpfbm9kZSwgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUmIG9ial9zdHJ1Y3QsIGNvbnN0IGNoYXIqIGNhbGxlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9jb2RlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQ21kUXVldWVGbGFncyhjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBjb25zdCBjaGFyKiBjYWxsZXJfbmFtZSwgVmtRdWV1ZUZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yX2NvZGUpIGNvbnN0OworICAgIGJvb2wgSW5zaWRlUmVuZGVyUGFzcyhjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBwQ0IsIGNvbnN0IGNoYXIqIGFwaU5hbWUsIGNvbnN0IGNoYXIqIG1zZ0NvZGUpIGNvbnN0OworICAgIGJvb2wgT3V0c2lkZVJlbmRlclBhc3MoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogcENCLCBjb25zdCBjaGFyKiBhcGlOYW1lLCBjb25zdCBjaGFyKiBtc2dDb2RlKSBjb25zdDsKKworICAgIHN0YXRpYyB2b2lkIFNldExheW91dChJbWFnZVN1YnJlc1BhaXJMYXlvdXRNYXAmIGltYWdlTGF5b3V0TWFwLCBJbWFnZVN1YnJlc291cmNlUGFpciBpbWdwYWlyLCBWa0ltYWdlTGF5b3V0IGxheW91dCk7CisKKyAgICBib29sIFZhbGlkYXRlSW1hZ2VTYW1wbGVDb3VudChjb25zdCBJTUFHRV9TVEFURSogaW1hZ2Vfc3RhdGUsIFZrU2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVfY291bnQsIGNvbnN0IGNoYXIqIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2dDb2RlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQ21kU3VicGFzc1N0YXRlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIHBDQiwgY29uc3QgQ01EX1RZUEUgY21kX3R5cGUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDbWQoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIGNvbnN0IENNRF9UWVBFIGNtZCwgY29uc3QgY2hhciogY2FsbGVyX25hbWUpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZURldmljZU1hc2tUb1BoeXNpY2FsRGV2aWNlQ291bnQodWludDMyX3QgZGV2aWNlTWFzaywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgVlVJRF9oYW5kbGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWVUlEX2hhbmRsZSwgY29uc3QgY2hhciogVlVJRCkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZURldmljZU1hc2tUb1plcm8odWludDMyX3QgZGV2aWNlTWFzaywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgVlVJRF9oYW5kbGVfdHlwZSwgdWludDY0X3QgVlVJRF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogVlVJRCkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZURldmljZU1hc2tUb0NvbW1hbmRCdWZmZXIoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogcENCLCB1aW50MzJfdCBkZXZpY2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIFZVSURfaGFuZGxlX3R5cGUsIHVpbnQ2NF90IFZVSURfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIFZVSUQpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVEZXZpY2VNYXNrVG9SZW5kZXJQYXNzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIHBDQiwgdWludDMyX3QgZGV2aWNlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBWVUlEX2hhbmRsZV90eXBlLCB1aW50NjRfdCBWVUlEX2hhbmRsZSwgY29uc3QgY2hhciogVlVJRCkgY29uc3Q7CisKKyAgICBib29sIFZhbGlkYXRlQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WJiBpbmZvKSBjb25zdDsKKyAgICAvLyBQcm90b3R5cGVzIGZvciBDb3JlQ2hlY2tzIGFjY2Vzc29yIGZ1bmN0aW9ucworICAgIFZrRm9ybWF0UHJvcGVydGllcyBHZXRQREZvcm1hdFByb3BlcnRpZXMoY29uc3QgVmtGb3JtYXQgZm9ybWF0KSBjb25zdDsKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKCk7CisKKyAgICBjb25zdCBHbG9iYWxRRk9UcmFuc2ZlckJhcnJpZXJNYXA8VmtJbWFnZU1lbW9yeUJhcnJpZXI+JiBHZXRHbG9iYWxRRk9SZWxlYXNlQmFycmllck1hcCgKKyAgICAgICAgY29uc3QgUUZPVHJhbnNmZXJCYXJyaWVyPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPjo6VGFnJiB0eXBlX3RhZykgY29uc3Q7CisgICAgY29uc3QgR2xvYmFsUUZPVHJhbnNmZXJCYXJyaWVyTWFwPFZrQnVmZmVyTWVtb3J5QmFycmllcj4mIEdldEdsb2JhbFFGT1JlbGVhc2VCYXJyaWVyTWFwKAorICAgICAgICBjb25zdCBRRk9UcmFuc2ZlckJhcnJpZXI8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPjo6VGFnJiB0eXBlX3RhZykgY29uc3Q7CisgICAgR2xvYmFsUUZPVHJhbnNmZXJCYXJyaWVyTWFwPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPiYgR2V0R2xvYmFsUUZPUmVsZWFzZUJhcnJpZXJNYXAoCisgICAgICAgIGNvbnN0IFFGT1RyYW5zZmVyQmFycmllcjxWa0ltYWdlTWVtb3J5QmFycmllcj46OlRhZyYgdHlwZV90YWcpOworICAgIEdsb2JhbFFGT1RyYW5zZmVyQmFycmllck1hcDxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+JiBHZXRHbG9iYWxRRk9SZWxlYXNlQmFycmllck1hcCgKKyAgICAgICAgY29uc3QgUUZPVHJhbnNmZXJCYXJyaWVyPFZrQnVmZmVyTWVtb3J5QmFycmllcj46OlRhZyYgdHlwZV90YWcpOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBCYXJyaWVyPgorICAgIHZvaWQgUmVjb3JkUXVldWVkUUZPVHJhbnNmZXJCYXJyaWVycyhDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSk7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXI+CisgICAgYm9vbCBWYWxpZGF0ZVF1ZXVlZFFGT1RyYW5zZmVyQmFycmllcnMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIFFGT1RyYW5zZmVyQ0JTY29yZWJvYXJkczxCYXJyaWVyPiogc2NvcmVib2FyZHMpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVRdWV1ZWRRRk9UcmFuc2ZlcnMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZHM8VmtJbWFnZU1lbW9yeUJhcnJpZXI+KiBxZm9faW1hZ2Vfc2NvcmVib2FyZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZHM8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPiogcWZvX2J1ZmZlcl9zY29yZWJvYXJkcykgY29uc3Q7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXJSZWNvcmQsIHR5cGVuYW1lIFNjb3JlYm9hcmQ+CisgICAgYm9vbCBWYWxpZGF0ZUFuZFVwZGF0ZVFGT1Njb3JlYm9hcmQoY29uc3QgZGVidWdfcmVwb3J0X2RhdGEqIHJlcG9ydF9kYXRhLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcGVyYXRpb24sIGNvbnN0IEJhcnJpZXJSZWNvcmQmIGJhcnJpZXIsIFNjb3JlYm9hcmQqIHNjb3JlYm9hcmQpIGNvbnN0OworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBCYXJyaWVyPgorICAgIHZvaWQgUmVjb3JkQmFycmllckFycmF5VmFsaWRhdGlvbkluZm8oY29uc3QgY2hhciogZnVuY19uYW1lLCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgdWludDMyX3QgYmFycmllcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhcnJpZXIqIGJhcnJpZXJzKTsKKyAgICB2b2lkIFJlY29yZEJhcnJpZXJWYWxpZGF0aW9uSW5mbyhjb25zdCBjaGFyKiBmdW5jX25hbWUsIENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCB1aW50MzJfdCBidWZmZXJCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtQmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtQmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1CYXJyaWVycyk7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXI+CisgICAgYm9vbCBWYWxpZGF0ZVFGT1RyYW5zZmVyQmFycmllclVuaXF1ZW5lc3MoY29uc3QgY2hhciogZnVuY19uYW1lLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgdWludDMyX3QgYmFycmllcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXJyaWVyKiBiYXJyaWVycykgY29uc3Q7CisgICAgYm9vbCBJc1JlbGVhc2VPcChDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXImIGJhcnJpZXIpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVCYXJyaWVyc1FGT1RyYW5zZmVyVW5pcXVlbmVzcyhjb25zdCBjaGFyKiBmdW5jX25hbWUsIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCB1aW50MzJfdCBidWZmZXJCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogcEJ1ZmZlck1lbUJhcnJpZXJzLCB1aW50MzJfdCBpbWFnZU1lbUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbUJhcnJpZXJzKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlUHJpbWFyeUNvbW1hbmRCdWZmZXJTdGF0ZShjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBwQ0IsIGludCBjdXJyZW50X3N1Ym1pdF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZHM8VmtJbWFnZU1lbW9yeUJhcnJpZXI+KiBxZm9faW1hZ2Vfc2NvcmVib2FyZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZPVHJhbnNmZXJDQlNjb3JlYm9hcmRzPFZrQnVmZmVyTWVtb3J5QmFycmllcj4qIHFmb19idWZmZXJfc2NvcmVib2FyZHMpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVQaXBlbGluZURyYXd0aW1lU3RhdGUoY29uc3QgTEFTVF9CT1VORF9TVEFURSYgc3RhdGUsIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIHBDQiwgQ01EX1RZUEUgY21kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQSVBFTElORV9TVEFURSogcFBpcGVsaW5lLCBjb25zdCBjaGFyKiBjYWxsZXIpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDbWRCdWZEcmF3U3RhdGUoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSwgQ01EX1RZUEUgY21kX3R5cGUsIGNvbnN0IGJvb2wgaW5kZXhlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCwgY29uc3QgY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIHBpcGVfZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdGF0ZV9lcnJfY29kZSkgY29uc3Q7CisgICAgc3RhdGljIGJvb2wgVmFsaWRhdGVFdmVudFN0YWdlTWFzayhjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyKiBzdGF0ZV9kYXRhLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBwQ0IsIHNpemVfdCBldmVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZpcnN0RXZlbnRJbmRleCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc291cmNlU3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUb1N0YWdlTWFwKiBsb2NhbEV2ZW50VG9TdGFnZU1hcCk7CisgICAgYm9vbCBWYWxpZGF0ZVF1ZXVlRmFtaWx5SW5kaWNlcyhjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBwQ0IsIFZrUXVldWUgcXVldWUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVQZXJmb3JtYW5jZVF1ZXJpZXMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogcENCLCBWa1F1ZXVlIHF1ZXVlLCBWa1F1ZXJ5UG9vbCYgZmlyc3RfcXVlcnlfcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50ZXJQYXNzSW5kZXgpIGNvbnN0OworICAgIFZrUmVzdWx0IENvcmVMYXllckNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqIHBWYWxpZGF0aW9uQ2FjaGUpOworICAgIHZvaWQgQ29yZUxheWVyRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVChWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKyAgICBWa1Jlc3VsdCBDb3JlTGF5ZXJNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCBkc3RDYWNoZSwgdWludDMyX3Qgc3JjQ2FjaGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqIHBTcmNDYWNoZXMpOworICAgIFZrUmVzdWx0IENvcmVMYXllckdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGUsIHNpemVfdCogcERhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEpOworICAgIC8vIEZvciBnaXZlbiBiaW5kaW5ncyB2YWxpZGF0ZSBzdGF0ZSBhdCB0aW1lIG9mIGRyYXcgaXMgY29ycmVjdCwgcmV0dXJuaW5nIGZhbHNlIG9uIGVycm9yIGFuZCB3cml0aW5nIGVycm9yIGRldGFpbHMgaW50byBzdHJpbmcqCisgICAgYm9vbCBWYWxpZGF0ZURyYXdTdGF0ZShjb25zdCBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQqIGRlc2NyaXB0b3Jfc2V0LCBjb25zdCBzdGQ6Om1hcDx1aW50MzJfdCwgZGVzY3JpcHRvcl9yZXE+JiBiaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgZHluYW1pY19vZmZzZXRzLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBjb25zdCBjaGFyKiBjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVEZXNjcmlwdG9yU2V0QmluZGluZ0RhdGEoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSwgY29uc3QgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0KiBkZXNjcmlwdG9yX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgZHluYW1pY19vZmZzZXRzLCB1aW50MzJfdCBiaW5kaW5nLCBkZXNjcmlwdG9yX3JlcSByZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2FsbGVyLCBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0OworCisgICAgLy8gVmFsaWRhdGUgY29udGVudHMgb2YgYSBDb3B5VXBkYXRlCisgICAgdXNpbmcgRGVzY3JpcHRvclNldCA9IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldDsKKyAgICBib29sIFZhbGlkYXRlQ29weVVwZGF0ZShjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiB1cGRhdGUsIGNvbnN0IERlc2NyaXB0b3JTZXQqIGRzdF9zZXQsIGNvbnN0IERlc2NyaXB0b3JTZXQqIHNyY19zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY19uYW1lLCBzdGQ6OnN0cmluZyogZXJyb3JfY29kZSwgc3RkOjpzdHJpbmcqIGVycm9yX21zZykgY29uc3Q7CisgICAgYm9vbCBWZXJpZnlDb3B5VXBkYXRlQ29udGVudHMoY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogdXBkYXRlLCBjb25zdCBEZXNjcmlwdG9yU2V0KiBzcmNfc2V0LCBWa0Rlc2NyaXB0b3JUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgsIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgc3RkOjpzdHJpbmcqIGVycm9yX2NvZGUsIHN0ZDo6c3RyaW5nKiBlcnJvcl9tc2cpIGNvbnN0OworICAgIC8vIFZhbGlkYXRlIGNvbnRlbnRzIG9mIGEgV3JpdGVVcGRhdGUKKyAgICBib29sIFZhbGlkYXRlV3JpdGVVcGRhdGUoY29uc3QgRGVzY3JpcHRvclNldCogZGVzY3JpcHRvcl9zZXQsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiB1cGRhdGUsIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yX2NvZGUsIHN0ZDo6c3RyaW5nKiBlcnJvcl9tc2cpIGNvbnN0OworICAgIGJvb2wgVmVyaWZ5V3JpdGVVcGRhdGVDb250ZW50cyhjb25zdCBEZXNjcmlwdG9yU2V0KiBkZXN0X3NldCwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIHVwZGF0ZSwgY29uc3QgdWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgc3RkOjpzdHJpbmcqIGVycm9yX2NvZGUsIHN0ZDo6c3RyaW5nKiBlcnJvcl9tc2cpIGNvbnN0OworICAgIC8vIFNoYXJlZCBoZWxwZXIgZnVuY3Rpb25zIC0gVGhlc2UgYXJlIHVzZWZ1bCBiZWNhdXNlIHRoZSBzaGFyZWQgc2FtcGxlciBpbWFnZSBkZXNjcmlwdG9yIHR5cGUKKyAgICAvLyAgcGVyZm9ybXMgY29tbW9uIGZ1bmN0aW9ucyB3aXRoIGJvdGggc2FtcGxlciBhbmQgaW1hZ2UgZGVzY3JpcHRvcnMgc28gdGhleSBjYW4gc2hhcmUgdGhlaXIgY29tbW9uIGZ1bmN0aW9ucworICAgIGJvb2wgVmFsaWRhdGVJbWFnZVVwZGF0ZShWa0ltYWdlVmlldywgVmtJbWFnZUxheW91dCwgVmtEZXNjcmlwdG9yVHlwZSwgY29uc3QgY2hhciogZnVuY19uYW1lLCBzdGQ6OnN0cmluZyosIHN0ZDo6c3RyaW5nKikgY29uc3Q7CisgICAgLy8gVmFsaWRhdGUgY29udGVudHMgb2YgYSBwdXNoIGRlc2NyaXB0b3IgdXBkYXRlCisgICAgYm9vbCBWYWxpZGF0ZVB1c2hEZXNjcmlwdG9yc1VwZGF0ZShjb25zdCBEZXNjcmlwdG9yU2V0KiBwdXNoX3NldCwgdWludDMyX3Qgd3JpdGVfY291bnQsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwX3dkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSkgY29uc3Q7CisgICAgLy8gRGVzY3JpcHRvciBTZXQgVmFsaWRhdGlvbiBGdW5jdGlvbnMKKyAgICBib29sIFZhbGlkYXRlU2FtcGxlcihWa1NhbXBsZXIpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVCdWZmZXJVcGRhdGUoVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBjb25zdCogYnVmZmVyX2luZm8sIFZrRGVzY3JpcHRvclR5cGUgdHlwZSwgY29uc3QgY2hhciogZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yX2NvZGUsIHN0ZDo6c3RyaW5nKiBlcnJvcl9tc2cpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0c1dpdGhUZW1wbGF0ZUtIUihWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgY29uc3QgVEVNUExBVEVfU1RBVEUqIHRlbXBsYXRlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwRGF0YSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUFsbG9jYXRlRGVzY3JpcHRvclNldHMoY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdmRlc2NyaXB0b3JzZXQ6OkFsbG9jYXRlRGVzY3JpcHRvclNldHNEYXRhKikgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRzKHVpbnQzMl90IHdyaXRlX2NvdW50LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogcF93ZHMsIHVpbnQzMl90IGNvcHlfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqIHBfY2RzLCBjb25zdCBjaGFyKiBmdW5jX25hbWUpIGNvbnN0OworCisgICAgLy8gU3R1ZmYgZnJvbSBzaGFkZXJfdmFsaWRhdGlvbgorICAgIGJvb2wgVmFsaWRhdGVHcmFwaGljc1BpcGVsaW5lU2hhZGVyU3RhdGUoY29uc3QgUElQRUxJTkVfU1RBVEUqIHBQaXBlbGluZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUNvbXB1dGVQaXBlbGluZShQSVBFTElORV9TVEFURSogcFBpcGVsaW5lKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlUmF5VHJhY2luZ1BpcGVsaW5lTlYoUElQRUxJTkVfU1RBVEUqIHBpcGVsaW5lKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVBpcGVsaW5lU2hhZGVyU3RhZ2UoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBjb25zdCogcFN0YWdlLCBjb25zdCBQSVBFTElORV9TVEFURSogcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUElQRUxJTkVfU1RBVEU6OlN0YWdlU3RhdGUmIHN0YWdlX3N0YXRlLCBjb25zdCBTSEFERVJfTU9EVUxFX1NUQVRFKiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BpcnZfaW5zdF9pdGVyJiBlbnRyeXBvaW50LCBib29sIGNoZWNrX3BvaW50X3NpemUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVQb2ludExpc3RTaGFkZXJTdGF0ZShjb25zdCBQSVBFTElORV9TVEFURSogcGlwZWxpbmUsIFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QqIHNyYywgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVNoYWRlckNhcGFiaWxpdGllcyhTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0KiBzcmMsIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVNoYWRlclN0YWdlV3JpdGFibGVEZXNjcmlwdG9yKFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSwgYm9vbCBoYXNfd3JpdGFibGVfZGVzY3JpcHRvcikgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVNoYWRlclN0YWdlSW5wdXRPdXRwdXRMaW1pdHMoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCogc3JjLCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0KiBwU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUElQRUxJTkVfU1RBVEUqIHBpcGVsaW5lLCBzcGlydl9pbnN0X2l0ZXIgZW50cnlwb2ludCkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVNoYWRlclN0YWdlR3JvdXBOb25Vbmlmb3JtKFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QqIHNyYywgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHN0YWdlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQ29vcGVyYXRpdmVNYXRyaXgoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCogc3JjLCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0KiBwU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBJUEVMSU5FX1NUQVRFKiBwaXBlbGluZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUV4ZWN1dGlvbk1vZGVzKFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QqIHNyYywgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQpIGNvbnN0OworCisgICAgLy8gQnVmZmVyIFZhbGlkYXRpb24gRnVuY3Rpb25zCisgICAgdGVtcGxhdGUgPGNsYXNzIE9CSkVDVCwgY2xhc3MgTEFZT1VUPgorICAgIHZvaWQgU2V0TGF5b3V0KE9CSkVDVCogcE9iamVjdCwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZVN1YnJlc291cmNlIHJhbmdlLCBjb25zdCBMQVlPVVQmIGxheW91dCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIE9CSkVDVCwgY2xhc3MgTEFZT1VUPgorICAgIHZvaWQgU2V0TGF5b3V0KE9CSkVDVCogcE9iamVjdCwgSW1hZ2VTdWJyZXNvdXJjZVBhaXIgaW1ncGFpciwgY29uc3QgTEFZT1VUJiBsYXlvdXQsIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrKTsKKyAgICAvLyBSZW1vdmUgdGhlIHBlbmRpbmcgUUZPIHJlbGVhc2UgcmVjb3JkcyBmcm9tIHRoZSBnbG9iYWwgc2V0CisgICAgLy8gTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSBoYW5kbGUgYXJndW1lbnQgY29uc3RyYWluZWQgdG8gbWF0Y2ggQmFycmllciB0eXBlCisgICAgLy8gVGhlIGRlZmF1bHRlZCBCYXJyaWVyUmVjb3JkIGFyZ3VtZW50IGFsbG93cyB1c2UgdG8gZGVjbGFyZSB0aGUgdHlwZSBvbmNlLCBidXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXIsIHR5cGVuYW1lIEJhcnJpZXJSZWNvcmQgPSBRRk9UcmFuc2ZlckJhcnJpZXI8QmFycmllcj4+CisgICAgdm9pZCBFcmFzZVFGT1JlbGVhc2VCYXJyaWVycyhjb25zdCB0eXBlbmFtZSBCYXJyaWVyUmVjb3JkOjpIYW5kbGVUeXBlJiBoYW5kbGUpIHsKKyAgICAgICAgR2xvYmFsUUZPVHJhbnNmZXJCYXJyaWVyTWFwPEJhcnJpZXI+JiBnbG9iYWxfcmVsZWFzZV9iYXJyaWVycyA9CisgICAgICAgICAgICBHZXRHbG9iYWxRRk9SZWxlYXNlQmFycmllck1hcCh0eXBlbmFtZSBCYXJyaWVyUmVjb3JkOjpUYWcoKSk7CisgICAgICAgIGdsb2JhbF9yZWxlYXNlX2JhcnJpZXJzLmVyYXNlKGhhbmRsZSk7CisgICAgfQorICAgIGJvb2wgVmFsaWRhdGVDb3B5SW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5UmVxdWlyZW1lbnRzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFKiBzcmNfaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElNQUdFX1NUQVRFKiBkc3RfaW1nLCBjb25zdCBWa0ltYWdlQ29weSogcmVnaW9uLCBjb25zdCB1aW50MzJfdCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlSWRsZUJ1ZmZlcihWa0J1ZmZlciBidWZmZXIpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVVc2FnZUZsYWdzKFZrRmxhZ3MgYWN0dWFsLCBWa0ZsYWdzIGRlc2lyZWQsIFZrQm9vbDMyIHN0cmljdCwgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUmIHR5cGVkX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtc2dDb2RlLCBjaGFyIGNvbnN0KiBmdW5jX25hbWUsIGNoYXIgY29uc3QqIHVzYWdlX3N0cikgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUltYWdlU3VicmVzb3VyY2VSYW5nZShjb25zdCB1aW50MzJfdCBpbWFnZV9taXBfY291bnQsIGNvbnN0IHVpbnQzMl90IGltYWdlX2xheWVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UmIHN1YnJlc291cmNlUmFuZ2UsIGNvbnN0IGNoYXIqIGNtZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFyYW1fbmFtZSwgY29uc3QgY2hhciogaW1hZ2VfbGF5ZXJfY291bnRfdmFyX25hbWUsIGNvbnN0IHVpbnQ2NF90IGltYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnJlc291cmNlUmFuZ2VFcnJvckNvZGVzIGVycm9yQ29kZXMpIGNvbnN0OworICAgIHZvaWQgU2V0SW1hZ2VMYXlvdXQoQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSwgY29uc3QgSU1BR0VfU1RBVEUmIGltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UmIGltYWdlX3N1YnJlc291cmNlX3JhbmdlLCBWa0ltYWdlTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZXhwZWN0ZWRfbGF5b3V0ID0ga0ludmFsaWRMYXlvdXQpOworICAgIHZvaWQgU2V0SW1hZ2VMYXlvdXQoQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSwgY29uc3QgSU1BR0VfU1RBVEUmIGltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzJiBpbWFnZV9zdWJyZXNvdXJjZV9sYXllcnMsIFZrSW1hZ2VMYXlvdXQgbGF5b3V0KTsKKyAgICBib29sIFZhbGlkYXRlUmVuZGVyUGFzc0xheW91dEFnYWluc3RGcmFtZWJ1ZmZlckltYWdlVXNhZ2UoUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwgVmtJbWFnZUxheW91dCBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VWaWV3IGltYWdlX3ZpZXcsIFZrRnJhbWVidWZmZXIgZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVuZGVyUGFzcyByZW5kZXJwYXNzLCB1aW50MzJfdCBhdHRhY2htZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZV9uYW1lKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQnVmZmVySW1hZ2VDb3B5RGF0YSh1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zLCBjb25zdCBJTUFHRV9TVEFURSogaW1hZ2Vfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY3Rpb24pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVCdWZmZXJWaWV3UmFuZ2UoY29uc3QgQlVGRkVSX1NUQVRFKiBidWZmZXJfc3RhdGUsIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUxpbWl0cyogZGV2aWNlX2xpbWl0cykgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUJ1ZmZlclZpZXdCdWZmZXIoY29uc3QgQlVGRkVSX1NUQVRFKiBidWZmZXJfc3RhdGUsIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvKSBjb25zdDsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UqIHBJbWFnZSkgY29uc3Q7CisKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSogcEltYWdlLCBWa1Jlc3VsdCByZXN1bHQpOworCisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUltYWdlKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUltYWdlKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVJbWFnZUF0dHJpYnV0ZXMoY29uc3QgSU1BR0VfU1RBVEUqIGltYWdlX3N0YXRlLCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSYgcmFuZ2UpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZUNsZWFyQXR0YWNobWVudEV4dGVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIsIHVpbnQzMl90IGF0dGFjaG1lbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGUkFNRUJVRkZFUl9TVEFURSogZnJhbWVidWZmZXIsIHVpbnQzMl90IGZiX2F0dGFjaG1lbnQsIGNvbnN0IFZrUmVjdDJEJiByZW5kZXJfYXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlY3RfY291bnQsIGNvbnN0IFZrQ2xlYXJSZWN0KiBjbGVhcl9yZWN0cykgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUltYWdlQ29weURhdGEoY29uc3QgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VDb3B5KiBpY19yZWdpb25zLCBjb25zdCBJTUFHRV9TVEFURSogc3JjX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElNQUdFX1NUQVRFKiBkc3Rfc3RhdGUpIGNvbnN0OworCisgICAgYm9vbCBWZXJpZnlDbGVhckltYWdlTGF5b3V0KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UmIHJhbmdlLCBWa0ltYWdlTGF5b3V0IGRlc3RfaW1hZ2VfbGF5b3V0LCBjb25zdCBjaGFyKiBmdW5jX25hbWUpIGNvbnN0OworCisgICAgYm9vbCBWZXJpZnlJbWFnZUxheW91dChjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBjb25zdCBJTUFHRV9TVEFURSogaW1hZ2Vfc3RhdGUsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlJiByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VBc3BlY3RGbGFncyB2aWV3X2FzcGVjdCwgVmtJbWFnZUxheW91dCBleHBsaWNpdF9sYXlvdXQsIFZrSW1hZ2VMYXlvdXQgb3B0aW1hbF9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXIsIGNvbnN0IGNoYXIqIGxheW91dF9pbnZhbGlkX21zZ19jb2RlLCBjb25zdCBjaGFyKiBsYXlvdXRfbWlzbWF0Y2hfbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBlcnJvcikgY29uc3Q7CisKKyAgICBib29sIFZlcmlmeUltYWdlTGF5b3V0KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UmIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBleHBsaWNpdF9sYXlvdXQsIFZrSW1hZ2VMYXlvdXQgb3B0aW1hbF9sYXlvdXQsIGNvbnN0IGNoYXIqIGNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxheW91dF9pbnZhbGlkX21zZ19jb2RlLCBjb25zdCBjaGFyKiBsYXlvdXRfbWlzbWF0Y2hfbXNnX2NvZGUsIGJvb2wqIGVycm9yKSBjb25zdCB7CisgICAgICAgIHJldHVybiBWZXJpZnlJbWFnZUxheW91dChjYl9ub2RlLCBpbWFnZV9zdGF0ZSwgcmFuZ2UsIDAsIGV4cGxpY2l0X2xheW91dCwgb3B0aW1hbF9sYXlvdXQsIGNhbGxlciwgbGF5b3V0X2ludmFsaWRfbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRfbWlzbWF0Y2hfbXNnX2NvZGUsIGVycm9yKTsKKyAgICB9CisKKyAgICBib29sIFZlcmlmeUltYWdlTGF5b3V0KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyYgc3ViTGF5ZXJzLCBWa0ltYWdlTGF5b3V0IGV4cGxpY2l0X2xheW91dCwgVmtJbWFnZUxheW91dCBvcHRpbWFsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbGxlciwgY29uc3QgY2hhciogbGF5b3V0X2ludmFsaWRfbXNnX2NvZGUsIGNvbnN0IGNoYXIqIGxheW91dF9taXNtYXRjaF9tc2dfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGVycm9yKSBjb25zdDsKKworICAgIGJvb2wgQ2hlY2tJdGdFeHRlbnQoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSwgY29uc3QgVmtFeHRlbnQzRCogZXh0ZW50LCBjb25zdCBWa09mZnNldDNEKiBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0V4dGVudDNEKiBncmFudWxhcml0eSwgY29uc3QgVmtFeHRlbnQzRCogc3VicmVzb3VyY2VfZXh0ZW50LCBjb25zdCBWa0ltYWdlVHlwZSBpbWFnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaSwgY29uc3QgY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIG1lbWJlciwgY29uc3QgY2hhciogdnVpZCkgY29uc3Q7CisKKyAgICBib29sIENoZWNrSXRnT2Zmc2V0KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IFZrT2Zmc2V0M0QqIG9mZnNldCwgY29uc3QgVmtFeHRlbnQzRCogZ3JhbnVsYXJpdHksIGNvbnN0IHVpbnQzMl90IGksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jdGlvbiwgY29uc3QgY2hhciogbWVtYmVyLCBjb25zdCBjaGFyKiB2dWlkKSBjb25zdDsKKyAgICBWa0V4dGVudDNEIEdldFNjYWxlZEl0Zyhjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBjb25zdCBJTUFHRV9TVEFURSogaW1nKSBjb25zdDsKKyAgICBib29sIENvcHlJbWFnZU11bHRpcGxhbmVWYWxpZGF0aW9uKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlciwgY29uc3QgSU1BR0VfU1RBVEUqIHNyY19pbWFnZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElNQUdFX1NUQVRFKiBkc3RfaW1hZ2Vfc3RhdGUsIGNvbnN0IFZrSW1hZ2VDb3B5IHJlZ2lvbikgY29uc3Q7CisKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQ29sb3JJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSogcENvbG9yLCB1aW50MzJfdCByYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKSBjb25zdDsKKworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZENsZWFyQ29sb3JJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUqIHBDb2xvciwgdWludDMyX3QgcmFuZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqIHBSYW5nZXMpOworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKSBjb25zdDsKKworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogcFJhbmdlcyk7CisKKyAgICBib29sIEZpbmRMYXlvdXRWZXJpZnlMYXlvdXQoSW1hZ2VTdWJyZXNvdXJjZVBhaXIgaW1ncGFpciwgVmtJbWFnZUxheW91dCYgbGF5b3V0LCBjb25zdCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFzayk7CisKKyAgICBib29sIEZpbmRHbG9iYWxMYXlvdXQoSW1hZ2VTdWJyZXNvdXJjZVBhaXIgaW1ncGFpciwgVmtJbWFnZUxheW91dCYgbGF5b3V0KTsKKworICAgIGJvb2wgRmluZExheW91dHMoVmtJbWFnZSBpbWFnZSwgc3RkOjp2ZWN0b3I8VmtJbWFnZUxheW91dD4mIGxheW91dHMpIGNvbnN0OworCisgICAgYm9vbCBGaW5kTGF5b3V0KGNvbnN0IEltYWdlU3VicmVzUGFpckxheW91dE1hcCYgaW1hZ2VMYXlvdXRNYXAsIEltYWdlU3VicmVzb3VyY2VQYWlyIGltZ3BhaXIsIFZrSW1hZ2VMYXlvdXQmIGxheW91dCkgY29uc3Q7CisKKyAgICBzdGF0aWMgYm9vbCBGaW5kTGF5b3V0KGNvbnN0IEltYWdlU3VicmVzUGFpckxheW91dE1hcCYgaW1hZ2VMYXlvdXRNYXAsIEltYWdlU3VicmVzb3VyY2VQYWlyIGltZ3BhaXIsIFZrSW1hZ2VMYXlvdXQmIGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RNYXNrKTsKKworICAgIHZvaWQgU2V0R2xvYmFsTGF5b3V0KEltYWdlU3VicmVzb3VyY2VQYWlyIGltZ3BhaXIsIGNvbnN0IFZrSW1hZ2VMYXlvdXQmIGxheW91dCk7CisKKyAgICB2b2lkIFNldEltYWdlVmlld0xheW91dChDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBjb25zdCBJTUFHRV9WSUVXX1NUQVRFJiB2aWV3X3N0YXRlLCBWa0ltYWdlTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGxheW91dFN0ZW5jaWwpOworICAgIHZvaWQgU2V0SW1hZ2VWaWV3SW5pdGlhbExheW91dChDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBjb25zdCBJTUFHRV9WSUVXX1NUQVRFJiB2aWV3X3N0YXRlLCBWa0ltYWdlTGF5b3V0IGxheW91dCk7CisKKyAgICB2b2lkIFNldEltYWdlSW5pdGlhbExheW91dChDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBWa0ltYWdlIGltYWdlLCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSYgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBsYXlvdXQpOworICAgIHZvaWQgU2V0SW1hZ2VJbml0aWFsTGF5b3V0KENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFJiBpbWFnZV9zdGF0ZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UmIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgbGF5b3V0KTsKKyAgICB2b2lkIFNldEltYWdlSW5pdGlhbExheW91dChDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBjb25zdCBJTUFHRV9TVEFURSYgaW1hZ2Vfc3RhdGUsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyYgbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgbGF5b3V0KTsKKworICAgIGJvb2wgVmVyaWZ5RnJhbWVidWZmZXJBbmRSZW5kZXJQYXNzTGF5b3V0cyhSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBwQ0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlJBTUVCVUZGRVJfU1RBVEUqIGZyYW1lYnVmZmVyX3N0YXRlKSBjb25zdDsKKyAgICB2b2lkIFJlY29yZENtZEJlZ2luUmVuZGVyUGFzc0xheW91dHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpOworICAgIHZvaWQgVHJhbnNpdGlvbkF0dGFjaG1lbnRSZWZMYXlvdXQoQ01EX0JVRkZFUl9TVEFURSogcENCLCBGUkFNRUJVRkZFUl9TVEFURSogcEZyYW1lYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSJiByZWYpOworCisgICAgdm9pZCBUcmFuc2l0aW9uU3VicGFzc0xheW91dHMoQ01EX0JVRkZFUl9TVEFURSosIGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFKiwgY29uc3QgaW50LCBGUkFNRUJVRkZFUl9TVEFURSopOworCisgICAgdm9pZCBUcmFuc2l0aW9uQmVnaW5SZW5kZXJQYXNzTGF5b3V0cyhDTURfQlVGRkVSX1NUQVRFKiwgY29uc3QgUkVOREVSX1BBU1NfU1RBVEUqLCBGUkFNRUJVRkZFUl9TVEFURSopOworCisgICAgYm9vbCBWYWxpZGF0ZUJhcnJpZXJMYXlvdXRUb0ltYWdlVXNhZ2UoY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXImIGltZ19iYXJyaWVyLCBib29sIG5ld19ub3Rfb2xkLCBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jX25hbWUsIGNvbnN0IGNoYXIqIGJhcnJpZXJfcG5hbWUpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZUJhcnJpZXJzVG9JbWFnZXMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycywgY29uc3QgY2hhciogZnVuY19uYW1lKSBjb25zdDsKKworICAgIHZvaWQgUmVjb3JkUXVldWVkUUZPVHJhbnNmZXJzKENNRF9CVUZGRVJfU1RBVEUqIHBDQik7CisgICAgdm9pZCBFcmFzZVFGT0ltYWdlUmVsYXNlQmFycmllcnMoY29uc3QgVmtJbWFnZSYgaW1hZ2UpOworCisgICAgdm9pZCBUcmFuc2l0aW9uSW1hZ2VMYXlvdXRzKENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCB1aW50MzJfdCBtZW1CYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1nTWVtQmFycmllcnMpOworCisgICAgdm9pZCBSZWNvcmRUcmFuc2l0aW9uSW1hZ2VMYXlvdXQoQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIGNvbnN0IElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciYgbWVtX2JhcnJpZXIpOworCisgICAgdm9pZCBUcmFuc2l0aW9uRmluYWxTdWJwYXNzTGF5b3V0cyhDTURfQlVGRkVSX1NUQVRFKiBwQ0IsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FQlVGRkVSX1NUQVRFKiBmcmFtZWJ1ZmZlcl9zdGF0ZSk7CisKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlQ29weSogcFJlZ2lvbnMpIGNvbnN0OworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckF0dGFjaG1lbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBhdHRhY2htZW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiBwQXR0YWNobWVudHMsIHVpbnQzMl90IHJlY3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDbGVhclJlY3QqIHBSZWN0cykgY29uc3Q7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQ2xlYXJBdHRhY2htZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYXR0YWNobWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqIHBBdHRhY2htZW50cywgdWludDMyX3QgcmVjdENvdW50LCBjb25zdCBWa0NsZWFyUmVjdCogcFJlY3RzKTsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUmVzb2x2ZUltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiBwUmVnaW9ucykgY29uc3Q7CisKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJsaXRJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlQmxpdCogcFJlZ2lvbnMsIFZrRmlsdGVyIGZpbHRlcikgY29uc3Q7CisKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRCbGl0SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQmxpdCogcFJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmlsdGVyIGZpbHRlcik7CisKKyAgICBib29sIFZhbGlkYXRlQ21kQnVmSW1hZ2VMYXlvdXRzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIHBDQiwgY29uc3QgSW1hZ2VTdWJyZXNQYWlyTGF5b3V0TWFwJiBnbG9iYWxJbWFnZUxheW91dE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlU3VicmVzUGFpckxheW91dE1hcCogb3ZlcmxheUxheW91dE1hcF9hcmcpIGNvbnN0OworCisgICAgdm9pZCBVcGRhdGVDbWRCdWZJbWFnZUxheW91dHMoQ01EX0JVRkZFUl9TVEFURSogcENCKTsKKworICAgIGJvb2wgVmVyaWZ5Qm91bmRNZW1vcnlJc1ZhbGlkKFZrRGV2aWNlTWVtb3J5IG1lbSwgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUmIHR5cGVkX2hhbmRsZSwgY29uc3QgY2hhciogYXBpX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXJyb3JfY29kZSkgY29uc3Q7CisKKyAgICBib29sIFZhbGlkYXRlTGF5b3V0VnNBdHRhY2htZW50RGVzY3JpcHRpb24oY29uc3QgZGVidWdfcmVwb3J0X2RhdGEqIHJlcG9ydF9kYXRhLCBSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTGF5b3V0IGZpcnN0X2xheW91dCwgY29uc3QgdWludDMyX3QgYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSJiBhdHRhY2htZW50X2Rlc2NyaXB0aW9uKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVMYXlvdXRzKFJlbmRlclBhc3NDcmVhdGVWZXJzaW9uIHJwX3ZlcnNpb24sIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqIHBDcmVhdGVJbmZvKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVJbWFnZVVzYWdlRmxhZ3MoSU1BR0VfU1RBVEUgY29uc3QqIGltYWdlX3N0YXRlLCBWa0ZsYWdzIGRlc2lyZWQsIGJvb2wgc3RyaWN0LCBjb25zdCBjaGFyKiBtc2dDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogZnVuY19uYW1lLCBjaGFyIGNvbnN0KiB1c2FnZV9zdHJpbmcpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZUltYWdlRm9ybWF0RmVhdHVyZUZsYWdzKElNQUdFX1NUQVRFIGNvbnN0KiBpbWFnZV9zdGF0ZSwgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZGVzaXJlZCwgY2hhciBjb25zdCogZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsaW5lYXJfdnVpZCwgY29uc3QgY2hhciogb3B0aW1hbF92dWlkKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVJbWFnZVN1YnJlc291cmNlTGF5ZXJzKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyogc3VicmVzb3VyY2VfbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIGZ1bmNfbmFtZSwgY2hhciBjb25zdCogbWVtYmVyLCB1aW50MzJfdCBpKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKEJVRkZFUl9TVEFURSBjb25zdCogYnVmZmVyX3N0YXRlLCBWa0ZsYWdzIGRlc2lyZWQsIGJvb2wgc3RyaWN0LCBjb25zdCBjaGFyKiBtc2dDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIGZ1bmNfbmFtZSwgY2hhciBjb25zdCogdXNhZ2Vfc3RyaW5nKSBjb25zdDsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQnVmZmVyKiBwQnVmZmVyKSBjb25zdDsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyVmlldyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQnVmZmVyVmlldyogcFZpZXcpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZUltYWdlQXNwZWN0TWFzayhWa0ltYWdlIGltYWdlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RfbWFzaywgY29uc3QgY2hhciogZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdnVpZCA9IGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZUFzcGVjdCkgY29uc3Q7CisKKyAgICBib29sIFZhbGlkYXRlQ3JlYXRlSW1hZ2VWaWV3U3VicmVzb3VyY2VSYW5nZShjb25zdCBJTUFHRV9TVEFURSogaW1hZ2Vfc3RhdGUsIGJvb2wgaXNfaW1hZ2V2aWV3XzJkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UmIHN1YnJlc291cmNlUmFuZ2UpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZUNtZENsZWFyQ29sb3JTdWJyZXNvdXJjZVJhbmdlKGNvbnN0IElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UmIHN1YnJlc291cmNlUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcmFtX25hbWUpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZUNtZENsZWFyRGVwdGhTdWJyZXNvdXJjZVJhbmdlKGNvbnN0IElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UmIHN1YnJlc291cmNlUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcmFtX25hbWUpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZUltYWdlQmFycmllclN1YnJlc291cmNlUmFuZ2UoY29uc3QgSU1BR0VfU1RBVEUqIGltYWdlX3N0YXRlLCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSYgc3VicmVzb3VyY2VSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbWRfbmFtZSwgY29uc3QgY2hhciogcGFyYW1fbmFtZSkgY29uc3Q7CisKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlVmlldyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ltYWdlVmlldyogcFZpZXcpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZUNvcHlCdWZmZXJJbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHlSZXF1aXJlbWVudHMoY29uc3QgQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSwgY29uc3QgSU1BR0VfU1RBVEUqIGltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogcmVnaW9uLCBjb25zdCB1aW50MzJfdCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBjb25zdCBjaGFyKiB2dWlkKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVJbWFnZU1pcExldmVsKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IElNQUdFX1NUQVRFKiBpbWcsIHVpbnQzMl90IG1pcF9sZXZlbCwgY29uc3QgdWludDMyX3QgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jdGlvbiwgY29uc3QgY2hhciogbWVtYmVyLCBjb25zdCBjaGFyKiB2dWlkKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVJbWFnZUFycmF5TGF5ZXJSYW5nZShjb25zdCBDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlLCBjb25zdCBJTUFHRV9TVEFURSogaW1nLCBjb25zdCB1aW50MzJfdCBiYXNlX2xheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBsYXllcl9jb3VudCwgY29uc3QgdWludDMyX3QgaSwgY29uc3QgY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIG1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdnVpZCkgY29uc3Q7CisKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSogcFJlZ2lvbnMpOworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5QnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBzcmNCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgdWludDMyX3QgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyQ29weSogcFJlZ2lvbnMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUltYWdlVmlldyhWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2VWaWV3IGltYWdlVmlldywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlclZpZXcgYnVmZmVyVmlldywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRmlsbEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YSkgY29uc3Q7CisKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlJbWFnZVRvQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKSBjb25zdDsKKworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlJbWFnZVRvQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGRzdEJ1ZmZlciwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucyk7CisKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlCdWZmZXJUb0ltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBzcmNCdWZmZXIsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucykgY29uc3Q7CisKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5QnVmZmVyVG9JbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0ltYWdlIGRzdEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogcFJlZ2lvbnMpOworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiBwU3VicmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VicmVzb3VyY2VMYXlvdXQqIHBMYXlvdXQpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDcmVhdGVJbWFnZUFORFJPSUQoY29uc3QgZGVidWdfcmVwb3J0X2RhdGEqIHJlcG9ydF9kYXRhLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogY3JlYXRlX2luZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDcmVhdGVJbWFnZVZpZXdBTkRST0lEKGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogY3JlYXRlX2luZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0QU5EUk9JRChjb25zdCBWa0ltYWdlIGltYWdlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlUXVldWVGYW1pbGllcyh1aW50MzJfdCBxdWV1ZV9mYW1pbHlfY291bnQsIGNvbnN0IHVpbnQzMl90KiBxdWV1ZV9mYW1pbGllcywgY29uc3QgY2hhciogY21kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJyYXlfcGFyYW1ldGVyX25hbWUsIGNvbnN0IGNoYXIqIHVuaXF1ZV9lcnJvcl9jb2RlLCBjb25zdCBjaGFyKiB2YWxpZF9lcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVBbGxvY2F0ZU1lbW9yeUFORFJPSUQoY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qIGFsbG9jX2luZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJBTkRST0lEKGNvbnN0IFZrSW1hZ2UgaW1hZ2UpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uQU5EUk9JRChjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBjcmVhdGVfaW5mbykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNncGxfc3RhdGUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGlwZV9zdGF0ZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqIHBQaXBlbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwRXhlY3V0YWJsZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlUGlwZWxpbmVFeGVjdXRhYmxlSW5mbyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogcEV4ZWN1dGFibGVJbmZvKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqIHBFeGVjdXRhYmxlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTdGF0aXN0aWNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqIHBTdGF0aXN0aWNzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKAorICAgICAgICBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogcEV4ZWN1dGFibGVJbmZvLCB1aW50MzJfdCogcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwKKyAgICAgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwU3RhdGlzdGljcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZUxheW91dCogcFBpcGVsaW5lTGF5b3V0KSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUFsbG9jYXRlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCB2b2lkKiBhZHNfc3RhdGUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBpcGVfc3RhdGUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kVHJhY2VSYXlzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGRlcHRoKSBjb25zdDsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kVHJhY2VSYXlzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIFZrQnVmZmVyIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGRlcHRoKTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIGdwdSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlKiBwRGV2aWNlKSBjb25zdDsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgZ3B1LCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZSogcERldmljZSwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFVwZGF0ZUJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBkYXRhU2l6ZSwgY29uc3Qgdm9pZCogcERhdGEpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlUXVldWUoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCBxdWV1ZUluZGV4LCBWa1F1ZXVlKiBwUXVldWUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogcFljYmNyQ29udmVyc2lvbikgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiBwWWNiY3JDb252ZXJzaW9uKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERlYnVnTWFya2VyQmVnaW5FWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiBwTWFya2VySW5mbykgY29uc3Q7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURldmljZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVRdWV1ZVN1Ym1pdChWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBzdWJtaXRDb3VudCwgY29uc3QgVmtTdWJtaXRJbmZvKiBwU3VibWl0cywgVmtGZW5jZSBmZW5jZSkgY29uc3Q7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlU3VibWl0KFZrUXVldWUgcXVldWUsIHVpbnQzMl90IHN1Ym1pdENvdW50LCBjb25zdCBWa1N1Ym1pdEluZm8qIHBTdWJtaXRzLCBWa0ZlbmNlIGZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXZpY2VNZW1vcnkqIHBNZW1vcnkpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRnJlZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVdhaXRGb3JGZW5jZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlKiBwRmVuY2VzLCBWa0Jvb2wzMiB3YWl0QWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lb3V0KSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlV2FpdElkbGUoVmtRdWV1ZSBxdWV1ZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXZpY2VXYWl0SWRsZShWa0RldmljZSBkZXZpY2UpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2VtYXBob3JlKiBwU2VtYXBob3JlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVdhaXRTZW1hcGhvcmVzS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiogcFdhaXRJbmZvLCB1aW50NjRfdCB0aW1lb3V0KSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lGZW5jZShWa0RldmljZSBkZXZpY2UsIFZrRmVuY2UgZmVuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lRdWVyeVBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUdldFF1ZXJ5UG9vbFJlc3VsdHNGbGFncyhWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncykgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUdldFF1ZXJ5UG9vbFJlc3VsdHNRdWVyaWVzKFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZVBlcmZvcm1hbmNlUXVlcnlSZXN1bHRzKGNvbnN0IGNoYXIqIGNtZF9uYW1lLCBjb25zdCBRVUVSWV9QT09MX1NUQVRFKiBxdWVyeV9wb29sX3N0YXRlLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWVyeUNvdW50LCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZXRRdWVyeVBvb2xQZXJmb3JtYW5jZVJlc3VsdHMoVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBzdHJpZGUsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRRdWVyeVBvb2xSZXN1bHRzKFZrRGV2aWNlIGRldmljZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhLCBWa0RldmljZVNpemUgc3RyaWRlLCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mb0tIUiogcEJpbmRJbmZvcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5MihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvS0hSKiBwQmluZEluZm9zKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRCdWZmZXJNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogcEltYWdlRm9ybWF0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqIHBJbWFnZUZvcm1hdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlcihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlciBzYW1wbGVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRnJlZUNvbW1hbmRCdWZmZXJzKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0NvbW1hbmRQb29sKiBwQ29tbWFuZFBvb2wpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUXVlcnlQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUXVlcnlQb29sKiBwUXVlcnlQb29sKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0Q29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyBmbGFncykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVSZXNldEZlbmNlcyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGZlbmNlQ291bnQsIGNvbnN0IFZrRmVuY2UqIHBGZW5jZXMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUZyYW1lYnVmZmVyKFZrRGV2aWNlIGRldmljZSwgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqIHBTZXRMYXlvdXQpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUmVzZXREZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUZyZWVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMsIHVpbnQzMl90IGRlc2NyaXB0b3JDb3B5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvckNvcGllcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogcEJlZ2luSW5mbykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVFbmRDb21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0Q29tbWFuZEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncyBmbGFncykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kUGlwZWxpbmUoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZSBwaXBlbGluZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrVmlld3BvcnQqIHBWaWV3cG9ydHMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0U2Npc3NvcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RTY2lzc29yLCB1aW50MzJfdCBzY2lzc29yQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVjdDJEKiBwU2Npc3NvcnMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcEV4Y2x1c2l2ZVNjaXNzb3JzKSBjb25zdDsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCB1aW50MzJfdCB2aWV3cG9ydENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiBwVmlld3BvcnRXU2NhbGluZ3MpIGNvbnN0OworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgdmlld3BvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogcFNoYWRpbmdSYXRlUGFsZXR0ZXMpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZW9tZXRyeVRyaWFuZ2xlc05WKGNvbnN0IFZrR2VvbWV0cnlUcmlhbmdsZXNOViYgdHJpYW5nbGVzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvYmplY3RfaGFuZGxlLCBjb25zdCBjaGFyKiBmdW5jX25hbWUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZW9tZXRyeUFBQkJOVihjb25zdCBWa0dlb21ldHJ5QUFCQk5WJiBnZW9tZXRyeSwgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUdlb21ldHJ5TlYoY29uc3QgVmtHZW9tZXRyeU5WJiBnZW9tZXRyeSwgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY19uYW1lKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogcEFjY2VsZXJhdGlvblN0cnVjdHVyZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVihWa0RldmljZSBkZXZpY2UsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGluc3RhbmNlRGF0YSwgVmtEZXZpY2VTaXplIGluc3RhbmNlT2Zmc2V0LCBWa0Jvb2wzMiB1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgc2NyYXRjaCwgVmtEZXZpY2VTaXplIHNjcmF0Y2hPZmZzZXQpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIG1vZGUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldExpbmVXaWR0aChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbGluZVdpZHRoKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldExpbmVTdGlwcGxlRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBsaW5lU3RpcHBsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxpbmVTdGlwcGxlUGF0dGVybikgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXB0aEJpYXMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBmbG9hdCBkZXB0aEJpYXNDbGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZXB0aEJpYXNTbG9wZUZhY3RvcikgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRCbGVuZENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgZmxvYXQgYmxlbmRDb25zdGFudHNbNF0pIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGVwdGhCb3VuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IG1pbkRlcHRoQm91bmRzLCBmbG9hdCBtYXhEZXB0aEJvdW5kcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb21wYXJlTWFzaykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlTWFzaykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZmVyZW5jZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kRGVzY3JpcHRvclNldHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IGZpcnN0U2V0LCB1aW50MzJfdCBzZXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgdWludDMyX3QgZHluYW1pY09mZnNldENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwRHluYW1pY09mZnNldHMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvcldyaXRlcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kSW5kZXhCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luZGV4VHlwZSBpbmRleFR5cGUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmluZFZlcnRleEJ1ZmZlcnMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0QmluZGluZywgdWludDMyX3QgYmluZGluZ0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXIqIHBCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBPZmZzZXRzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXcoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHZlcnRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdFZlcnRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgaW5kZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0SW5kZXgsIGludDMyX3QgdmVydGV4T2Zmc2V0LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUmVzZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFdhaXRFdmVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZrRXZlbnQqIHBFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNvdXJjZVN0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciogcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbW9yeUJhcnJpZXJzKSBjb25zdDsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRXYWl0RXZlbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc291cmNlU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciogcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRXYWl0RXZlbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNvdXJjZVN0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFBpcGVsaW5lQmFycmllcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgVmtEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpIGNvbnN0OworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZFBpcGVsaW5lQmFycmllcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZrRGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisKKyAgICB2b2lkIEVucXVldWVWZXJpZnlCZWdpblF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciwgY29uc3QgUXVlcnlPYmplY3QmIHF1ZXJ5X29iaiwgY29uc3QgY2hhciogZnVuYyk7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpblF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHNsb3QsIFZrRmxhZ3MgZmxhZ3MpIGNvbnN0OworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJlZ2luUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCwgVmtGbGFncyBmbGFncyk7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRFbmRRdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBzbG90KSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFJlc2V0UXVlcnlQb29sKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWVyeUNvdW50KSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlRdWVyeVBvb2xSZXN1bHRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWVyeUNvdW50LCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgc3RyaWRlLCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpIGNvbnN0OworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVlcnlDb3VudCwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncyk7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRQdXNoQ29uc3RhbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgVmtTaGFkZXJTdGFnZUZsYWdzIHN0YWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSwgY29uc3Qgdm9pZCogcFZhbHVlcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRXcml0ZVRpbWVzdGFtcChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCkgY29uc3Q7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kV3JpdGVUaW1lc3RhbXAoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzbG90KTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUZyYW1lYnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ZyYW1lYnVmZmVyKiBwRnJhbWVidWZmZXIpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyogcFJlbmRlclBhc3MpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudChWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplKiBwQ29tbWl0dGVkTWVtKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJlbmRlclBhc3MyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiBwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzKSBjb25zdDsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpOworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5SZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiBwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqIHBTdWJwYXNzQmVnaW5JbmZvKSBjb25zdDsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqIHBTdWJwYXNzQmVnaW5JbmZvKTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZE5leHRTdWJwYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykgY29uc3Q7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZE5leHRTdWJwYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cyk7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWROZXh0U3VicGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogcFN1YnBhc3NCZWdpbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogcFN1YnBhc3NFbmRJbmZvKSBjb25zdDsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kTmV4dFN1YnBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqIHBTdWJwYXNzQmVnaW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogcFN1YnBhc3NFbmRJbmZvKTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEVuZFJlbmRlclBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIGNvbnN0OworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEVuZFJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiBwU3VicGFzc0VuZEluZm8pIGNvbnN0OworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogcFN1YnBhc3NFbmRJbmZvKTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEV4ZWN1dGVDb21tYW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgY29tbWFuZEJ1ZmZlcnNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVNYXBNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW0sIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCBWa0ZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwcERhdGEpIGNvbnN0OworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRNYXBNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW0sIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCBWa0ZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBwRGF0YSwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVVubWFwTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtKSBjb25zdDsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRVbm1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSk7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IG1lbVJhbmdlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtUmFuZ2VzKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1SYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtUmFuZ2VzKSBjb25zdDsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IG1lbVJhbmdlQ291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1SYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvS0hSKiBwQmluZEluZm9zKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm9LSFIqIHBCaW5kSW5mb3MpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlU2V0RXZlbnQoVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50KSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlQmluZFNwYXJzZShWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiBwQmluZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGZW5jZSBmZW5jZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVTaWduYWxTZW1hcGhvcmVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqIHBTaWduYWxJbmZvKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydFNlbWFwaG9yZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8pIGNvbnN0OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgICAgICBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIGNvbnN0OworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVJbXBvcnRGZW5jZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogcEltcG9ydEZlbmNlRmRJbmZvKSBjb25zdDsKKworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWluKSBjb25zdDsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U3dhcGNoYWluSW1hZ2VzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50MzJfdCogcFN3YXBjaGFpbkltYWdlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSogcFN3YXBjaGFpbkltYWdlcykgY29uc3Q7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSogcFN3YXBjaGFpbkltYWdlcywgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlUHJlc2VudEtIUihWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiBwUHJlc2VudEluZm8pIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N3YXBjaGFpbktIUiogcFN3YXBjaGFpbnMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZUtIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDY0X3QgdGltZW91dCwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ZlbmNlIGZlbmNlLCB1aW50MzJfdCogcEltYWdlSW5kZXgpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZTJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiBwQWNxdWlyZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcEltYWdlSW5kZXgpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa0Jvb2wzMiogcFN1cHBvcnRlZCkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKiBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwRGF0YSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcERhdGEpIGNvbnN0OworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIGNvbnN0IHZvaWQqIHBEYXRhKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHBsYW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcERpc3BsYXlDb3VudCwgVmtEaXNwbGF5S0hSKiBwRGlzcGxheXMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheU1vZGVLSFIgbW9kZSwgdWludDMyX3QgcGxhbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogcENhcGFiaWxpdGllcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIqIHBEaXNwbGF5UGxhbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIqIHBDYXBhYmlsaXRpZXMpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRGVidWdNYXJrZXJFbmRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIGNvbnN0OworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgZmxhZ3MsIHVpbnQzMl90IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCB1aW50MzJfdCBpbmRleCk7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRFbmRRdWVyeUluZGV4ZWRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIGNvbnN0OworCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBEaXNjYXJkUmVjdGFuZ2xlcykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiBwU2FtcGxlTG9jYXRpb25zSW5mbykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RDb3VudEtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdGFza0NvdW50LCB1aW50MzJfdCBmaXJzdFRhc2spIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUpIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9FWFQqIHBJbmZvKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIHBJbmZvKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUNtZFNldERldmljZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGRldmljZU1hc2ssIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSkgY29uc3Q7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXZpY2VNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBkZXZpY2VNYXNrKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldERldmljZU1hc2tLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGRldmljZU1hc2spIGNvbnN0OworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtcGFob3JlLCB1aW50NjRfdCogcFZhbHVlKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQ29tcHV0ZVdvcmtHcm91cFNpemVzKGNvbnN0IFNIQURFUl9NT0RVTEVfU1RBVEUqIHNoYWRlcikgY29uc3Q7CisKKyAgICBib29sIFZhbGlkYXRlUXVlcnlSYW5nZShWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgdG90YWxDb3VudCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2dWlkX2JhZGZpcnN0LCBjb25zdCBjaGFyKiB2dWlkX2JhZHJhbmdlKSBjb25zdDsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0UXVlcnlQb29sRVhUKFZrRGV2aWNlIGRldmljZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50KSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMoQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdyb3VwQ291bnRaKTsKKyAgICBib29sIFZhbGlkYXRlUXVlcnlQb29sU3RyaWRlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2dWlkX25vdF82NCwgY29uc3Qgc3RkOjpzdHJpbmcmIHZ1aWRfNjQsIGNvbnN0IFZrRGV2aWNlU2l6ZSBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJhbWV0ZXJfbmFtZSwgY29uc3QgdWludDY0X3QgcGFyYW1ldGVyX3ZhbHVlLCBjb25zdCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVDbWREcmF3U3RyaWRlV2l0aFN0cnVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIHZ1aWQsIGNvbnN0IHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RydWN0X25hbWUsIGNvbnN0IHVpbnQzMl90IHN0cnVjdF9zaXplKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQ21kRHJhd1N0cmlkZVdpdGhCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2dWlkLCBjb25zdCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0cnVjdF9uYW1lLCBjb25zdCB1aW50MzJfdCBzdHJ1Y3Rfc2l6ZSwgY29uc3QgdWludDMyX3QgZHJhd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgb2Zmc2V0LCBjb25zdCBCVUZGRVJfU1RBVEUqIGJ1ZmZlcl9zdGF0ZSkgY29uc3Q7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKFZrRGV2aWNlIGRldmljZSwgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogcFByb3BlcnRpZXMpIGNvbnN0OworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRChWa0RldmljZSBkZXZpY2UsIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogcFByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiBwQnVmZmVyKSBjb25zdDsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3bF9kaXNwbGF5KiBkaXNwbGF5KSBjb25zdDsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgpIGNvbnN0OworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QqIGNvbm5lY3Rpb24sIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZCkgY29uc3Q7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkqIGRweSwgVmlzdWFsSUQgdmlzdWFsSUQpIGNvbnN0OworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworfTsgIC8vIENsYXNzIENvcmVDaGVja3MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb3JlX3ZhbGlkYXRpb25fZXJyb3JfZW51bXMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9jb3JlX3ZhbGlkYXRpb25fZXJyb3JfZW51bXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDZhMTkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbl9lcnJvcl9lbnVtcy5oCkBAIC0wLDAgKzEsMjg5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlnb0Bnb29nbGUuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvaG4gWnVsYXVmIDxqenVsYXVmQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENhbWRlbiBTdG9ja2VyIDxjYW1kZW5AbHVuYXJnLmNvbT4KKyAqLworI2lmbmRlZiBDT1JFX1ZBTElEQVRJT05fRVJST1JfRU5VTVNfSF8KKyNkZWZpbmUgQ09SRV9WQUxJREFUSU9OX0VSUk9SX0VOVU1TX0hfCisKKy8vIFN1cHByZXNzIHVudXNlZCB3YXJuaW5nIG9uIExpbnV4CisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgREVDT1JBVEVfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBERUNPUkFURV9VTlVTRUQKKyNlbmRpZgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9NZW1UcmFja19GZW5jZVN0YXRlID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tTWVtVHJhY2stRmVuY2VTdGF0ZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfTWVtVHJhY2tfSW52YWxpZE1hcCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLU1lbVRyYWNrLUludmFsaWRNYXAiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX01lbVRyYWNrX0ludmFsaWRTdGF0ZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLU1lbVRyYWNrLUludmFsaWRTdGF0ZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfTWVtVHJhY2tfSW52YWxpZFVzYWdlRmxhZyA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLU1lbVRyYWNrLUludmFsaWRVc2FnZUZsYWciOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX01lbVRyYWNrX1JlYmluZE9iamVjdCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLU1lbVRyYWNrLVJlYmluZE9iamVjdCI7CisvLyBQcmV2aW91c2x5IGRlZmluZWQgYnV0IHVudXNlZCAtIHVuY29tbWVudCBhcyBuZWVkZWQKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX01lbVRyYWNrX0ludGVybmFsRXJyb3IgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1NZW1UcmFjay1JbnRlcm5hbEVycm9yIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX01lbVRyYWNrX0ludmFsaWRDQiA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLU1lbVRyYWNrLUludmFsaWRDQiI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9NZW1UcmFja19JbnZhbGlkTWVtT2JqID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tTWVtVHJhY2stSW52YWxpZE1lbU9iaiI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9NZW1UcmFja19JbnZhbGlkTWVtUmVnaW9uID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tTWVtVHJhY2stSW52YWxpZE1lbVJlZ2lvbiI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9NZW1UcmFja19JbnZhbGlkTWVtVHlwZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLU1lbVRyYWNrLUludmFsaWRNZW1UeXBlIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX01lbVRyYWNrX0ludmFsaWRPYmplY3QgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1NZW1UcmFjay1JbnZhbGlkT2JqZWN0IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX01lbVRyYWNrX01lbW9yeUxlYWsgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1NZW1UcmFjay1NZW1vcnlMZWFrIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX01lbVRyYWNrX09iak5vdEJvdW5kID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tTWVtVHJhY2stT2JqTm90Qm91bmQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfTWVtVHJhY2tfUmVzZXRDQldoaWxlSW5GbGlnaHQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1NZW1UcmFjay1SZXNldENCV2hpbGVJbkZsaWdodCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9NZW1UcmFja19JbnZhbGlkQWxpYXNpbmcgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1NZW1UcmFjay1JbnZhbGlkQWxpYXNpbmciOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfTWVtVHJhY2tfRnJlZWRNZW1SZWYgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1NZW1UcmFjay1GcmVlZE1lbVJlZiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfQ2xlYXJDbWRCZWZvcmVEcmF3ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUNsZWFyQ21kQmVmb3JlRHJhdyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0NvbW1hbmRCdWZmZXJTaW5nbGVTdWJtaXRWaW9sYXRpb24gPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtQ29tbWFuZEJ1ZmZlclNpbmdsZVN1Ym1pdFZpb2xhdGlvbiI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0Rlc2NyaXB0b3JTZXROb3RCb3VuZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1EZXNjcmlwdG9yU2V0Tm90Qm91bmQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9EZXNjcmlwdG9yU2V0Tm90VXBkYXRlZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1EZXNjcmlwdG9yU2V0Tm90VXBkYXRlZCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0RvdWJsZURlc3Ryb3kgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtRG91YmxlRGVzdHJveSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0V4dGVuc2lvbk5vdEVuYWJsZWQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtRXh0ZW5zaW9uTm90RW5hYmxlZCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludGVybmFsRXJyb3IgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW50ZXJuYWxFcnJvciI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRCYXJyaWVyID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRCYXJyaWVyIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkQnVmZmVyID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRCdWZmZXIiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkQ29tbWFuZEJ1ZmZlciA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQ29tbWFuZEJ1ZmZlciI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRDb21tYW5kQnVmZmVyU2ltdWx0YW5lb3VzVXNlID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyU2ltdWx0YW5lb3VzVXNlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZERlc2NyaXB0b3JTZXQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZERlc2NyaXB0b3JTZXQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkRXZlbnQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEV2ZW50IjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEV4dGVudHMgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEV4dGVudHMiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkRmVhdHVyZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkRmVhdHVyZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRGZW5jZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkRmVuY2UiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2UiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkSW1hZ2VBc3BlY3QgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEltYWdlQXNwZWN0IjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEltYWdlTGF5b3V0ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRJbWFnZUxheW91dCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRMYXlvdXQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZExheW91dCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRQaXBlbGluZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkUGlwZWxpbmUiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUGlwZWxpbmVDcmVhdGVTdGF0ZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkUGlwZWxpbmVDcmVhdGVTdGF0ZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRRdWVyeSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkUXVlcnkiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9RdWVyeU5vdFJlc2V0ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVF1ZXJ5Tm90UmVzZXQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUXVldWVGYW1pbHkgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZFF1ZXVlRmFtaWx5IjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFJlbmRlckFyZWEgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZFJlbmRlckFyZWEiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUmVuZGVycGFzcyA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkUmVuZGVycGFzcyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRTZWNvbmRhcnlDb21tYW5kQnVmZmVyID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRTZWNvbmRhcnlDb21tYW5kQnVmZmVyIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFNldCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkU2V0IjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfTWlzbWF0Y2hlZEltYWdlRm9ybWF0ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLU1pc21hdGNoZWRJbWFnZUZvcm1hdCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX01pc21hdGNoZWRJbWFnZVR5cGUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtTWlzbWF0Y2hlZEltYWdlVHlwZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX01pc3NpbmdBdHRhY2htZW50UmVmZXJlbmNlID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLU1pc3NpbmdBdHRhY2htZW50UmVmZXJlbmNlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfTm9BY3RpdmVSZW5kZXJwYXNzID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLU5vQWN0aXZlUmVuZGVycGFzcyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX05vRW5kQ29tbWFuZEJ1ZmZlciA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1Ob0VuZENvbW1hbmRCdWZmZXIiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9OdW1TYW1wbGVzTWlzbWF0Y2ggPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtTnVtU2FtcGxlc01pc21hdGNoIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfT3V0T2ZNZW1vcnkgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtT3V0T2ZNZW1vcnkiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9QaXBlbGluZUxheW91dHNJbmNvbXBhdGlibGUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtUGlwZWxpbmVMYXlvdXRzSW5jb21wYXRpYmxlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfUXVldWVGb3J3YXJkUHJvZ3Jlc3MgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtUXVldWVGb3J3YXJkUHJvZ3Jlc3MiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9Td2FwY2hhaW5DcmVhdGVCZWZvcmVRdWVyeSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1Td2FwY2hhaW5DcmVhdGVCZWZvcmVRdWVyeSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpbkltYWdlTm90QWNxdWlyZWQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtU3dhcGNoYWluSW1hZ2VOb3RBY3F1aXJlZCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpbkltYWdlc05vdEZvdW5kID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVN3YXBjaGFpbkltYWdlc05vdEZvdW5kIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfU3dhcGNoYWluSW52YWxpZEltYWdlID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVN3YXBjaGFpbkludmFsaWRJbWFnZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpbk5vU3luY0ZvckFjcXVpcmUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtU3dhcGNoYWluTm9TeW5jRm9yQWNxdWlyZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpblJlcGxhY2VkID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVN3YXBjaGFpblJlcGxhY2VkIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9Td2FwY2hhaW5Ub29NYW55SW1hZ2VzID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVN3YXBjaGFpblRvb01hbnlJbWFnZXMiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9Td2FwY2hhaW5VbnN1cHBvcnRlZFF1ZXVlID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVN3YXBjaGFpblVuc3VwcG9ydGVkUXVldWUiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9WaWV3cG9ydFNjaXNzb3JNaXNtYXRjaCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1WaWV3cG9ydFNjaXNzb3JNaXNtYXRjaCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1Z0eEluZGV4T3V0T2ZCb3VuZHMgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtVnR4SW5kZXhPdXRPZkJvdW5kcyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRWdHhBdHRyaWJ1dGVBbGlnbm1lbnQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZFZ0eEF0dHJpYnV0ZUFsaWdubWVudCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZVZpZXcgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEltYWdlVmlldyI7CisvLyBQcmV2aW91c2x5IGRlZmluZWQgYnV0IHVudXNlZCAtIHVuY29tbWVudCBhcyBuZWVkZWQKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9CZWdpbkNvbW1hbmRCdWZmZXJJbnZhbGlkU3RhdGUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtQmVnaW5Db21tYW5kQnVmZmVySW52YWxpZFN0YXRlIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9CbGVuZE5vdEJvdW5kID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUJsZW5kTm90Qm91bmQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0J1ZmZlcmluZm9EZXNjcmlwdG9yRXJyb3IgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtQnVmZmVyaW5mb0Rlc2NyaXB0b3JFcnJvciI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfQnVmZmVydmlld0Rlc2NyaXB0b3JFcnJvciA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1CdWZmZXJ2aWV3RGVzY3JpcHRvckVycm9yIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9DYW50RnJlZUZyb21Ob25GcmVlUG9vbCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1DYW50RnJlZUZyb21Ob25GcmVlUG9vbCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfRGVwdGhCaWFzTm90Qm91bmQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtRGVwdGhCaWFzTm90Qm91bmQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0RlcHRoQm91bmRzTm90Qm91bmQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtRGVwdGhCb3VuZHNOb3RCb3VuZCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfRGVzY3JpcHRvclBvb2xFbXB0eSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1EZXNjcmlwdG9yUG9vbEVtcHR5IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9EZXNjcmlwdG9yU3RhZ2VmbGFnc01pc21hdGNoID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLURlc2NyaXB0b3JTdGFnZWZsYWdzTWlzbWF0Y2giOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0Rlc2NyaXB0b3JUeXBlTWlzbWF0Y2ggPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtRGVzY3JpcHRvclR5cGVNaXNtYXRjaCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfRGVzY3JpcHRvclVwZGF0ZU91dE9mQm91bmRzID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLURlc2NyaXB0b3JVcGRhdGVPdXRPZkJvdW5kcyI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfRGlzYWJsZWRMb2dpY09wID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLURpc2FibGVkTG9naWNPcCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfRHluYW1pY09mZnNldE92ZXJmbG93ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUR5bmFtaWNPZmZzZXRPdmVyZmxvdyI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfRnJhbWVidWZmZXJJbmNvbXBhdGlibGUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtRnJhbWVidWZmZXJJbmNvbXBhdGlibGUiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ltYWdlVHJhbnNmZXJHcmFudWxhcml0eSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ltYWdldmlld0Rlc2NyaXB0b3JFcnJvciA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbWFnZXZpZXdEZXNjcmlwdG9yRXJyb3IiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0luY29uc2lzdGVudEltbXV0YWJsZVNhbXBsZXJVcGRhdGUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW5jb25zaXN0ZW50SW1tdXRhYmxlU2FtcGxlclVwZGF0ZSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW5kZXBlbmRlbnRCbGVuZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbmRlcGVuZGVudEJsZW5kIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbmRleEJ1ZmZlck5vdEJvdW5kID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUluZGV4QnVmZmVyTm90Qm91bmQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRBdHRhY2htZW50SW5kZXggPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEF0dGFjaG1lbnRJbmRleCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEJ1ZmZlck1lbW9yeU9mZnNldCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQnVmZmVyTWVtb3J5T2Zmc2V0IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkQnVmZmVyVmlldyA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQnVmZmVyVmlldyI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZENvbW1hbmRCdWZmZXJSZXNldCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQ29tbWFuZEJ1ZmZlclJlc2V0IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkQ29tbWFuZFBvb2wgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRQb29sIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkQ29weVVwZGF0ZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQ29weVVwZGF0ZSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZERlc2NyaXB0b3JQb29sID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWREZXNjcmlwdG9yUG9vbCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZERldmljZU1lbW9yeSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkRGV2aWNlTWVtb3J5IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkRnJhbWVidWZmZXIgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEZyYW1lYnVmZmVyIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkRnJhbWVidWZmZXJDcmVhdGVJbmZvID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRGcmFtZWJ1ZmZlckNyZWF0ZUluZm8iOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZUZpbHRlciA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2VGaWx0ZXIiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRJbWFnZVN1YnJhbmdlID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRJbWFnZVN1YnJhbmdlIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkSW1hZ2VVc2FnZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2VVc2FnZSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZEltYWdlVmlldyA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2VWaWV3IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUXVlcnlQb29sID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRRdWVyeVBvb2wiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRRdWV1ZUluZGV4ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRRdWV1ZUluZGV4IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkUmVuZGVycGFzc0NtZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkUmVuZGVycGFzc0NtZCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfSW52YWxpZFNhbXBsZXIgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZFNhbXBsZXIiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRTdG9yYWdlQnVmZmVyT2Zmc2V0ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRTdG9yYWdlQnVmZmVyT2Zmc2V0IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkU3VicGFzc0luZGV4ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRTdWJwYXNzSW5kZXgiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRUZXhlbEJ1ZmZlck9mZnNldCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkVGV4ZWxCdWZmZXJPZmZzZXQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRVbmlmb3JtQnVmZmVyT2Zmc2V0ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRVbmlmb3JtQnVmZmVyT2Zmc2V0IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9JbnZhbGlkVXBkYXRlU3RydWN0ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRVcGRhdGVTdHJ1Y3QiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWRXcml0ZVVwZGF0ZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkV3JpdGVVcGRhdGUiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX0xpbmVXaWR0aE5vdEJvdW5kID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUxpbmVXaWR0aE5vdEJvdW5kIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9NaXNtYXRjaGVkSW1hZ2VBc3BlY3QgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtTWlzbWF0Y2hlZEltYWdlQXNwZWN0IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9Ob0JlZ2luQ29tbWFuZEJ1ZmZlciA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1Ob0JlZ2luQ29tbWFuZEJ1ZmZlciI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfT2JqZWN0SW5Vc2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtT2JqZWN0SW5Vc2UiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1B1c2hDb25zdGFudHNFcnJvciA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1QdXNoQ29uc3RhbnRzRXJyb3IiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1JlbmRlcnBhc3NJbmNvbXBhdGlibGUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtUmVuZGVycGFzc0luY29tcGF0aWJsZSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfUmVuZGVycGFzc1Rvb01hbnlDbGVhclZhbHVlcyA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1SZW5kZXJwYXNzVG9vTWFueUNsZWFyVmFsdWVzIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9TYW1wbGVyRGVzY3JpcHRvckVycm9yID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVNhbXBsZXJEZXNjcmlwdG9yRXJyb3IiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1NjaXNzb3JOb3RCb3VuZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1TY2lzc29yTm90Qm91bmQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1N0ZW5jaWxOb3RCb3VuZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1TdGVuY2lsTm90Qm91bmQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpbkJhZENvbXBvc2l0ZUFscGhhID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVN3YXBjaGFpbkJhZENvbXBvc2l0ZUFscGhhIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9Td2FwY2hhaW5CYWRFeHRlbnRzID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVN3YXBjaGFpbkJhZEV4dGVudHMiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpbkJhZEZvcm1hdCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1Td2FwY2hhaW5CYWRGb3JtYXQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1N3YXBjaGFpbkJhZEltYWdlQ291bnQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtU3dhcGNoYWluQmFkSW1hZ2VDb3VudCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfU3dhcGNoYWluQmFkTGF5ZXJDb3VudCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1Td2FwY2hhaW5CYWRMYXllckNvdW50IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9Td2FwY2hhaW5CYWRQcmVUcmFuc2Zvcm0gPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtU3dhcGNoYWluQmFkUHJlVHJhbnNmb3JtIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9Td2FwY2hhaW5CYWRQcmVzZW50TW9kZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1Td2FwY2hhaW5CYWRQcmVzZW50TW9kZSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9EcmF3U3RhdGVfU3dhcGNoYWluQmFkVXNhZ2VGbGFncyA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1Td2FwY2hhaW5CYWRVc2FnZUZsYWdzIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RyYXdTdGF0ZV9WaWV3cG9ydE5vdEJvdW5kID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLVZpZXdwb3J0Tm90Qm91bmQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRHJhd1N0YXRlX1Z0eEluZGV4QWxpZ25tZW50RXJyb3IgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtVnR4SW5kZXhBbGlnbm1lbnRFcnJvciI7CisKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9TaGFkZXJfRGVzY3JpcHRvck5vdEFjY2Vzc2libGVGcm9tU3RhZ2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItRGVzY3JpcHRvck5vdEFjY2Vzc2libGVGcm9tU3RhZ2UiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9EZXNjcmlwdG9yVHlwZU1pc21hdGNoID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU2hhZGVyLURlc2NyaXB0b3JUeXBlTWlzbWF0Y2giOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9FeGNlZWREZXZpY2VMaW1pdCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1FeGNlZWREZXZpY2VMaW1pdCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU2hhZGVyLUZlYXR1cmVOb3RFbmFibGVkIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9TaGFkZXJfSW5jb25zaXN0ZW50U3BpcnYgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItSW5jb25zaXN0ZW50U3BpcnYiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9JbmNvbnNpc3RlbnRWaSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1JbmNvbnNpc3RlbnRWaSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU2hhZGVyX0lucHV0QXR0YWNobWVudFR5cGVNaXNtYXRjaCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1JbnB1dEF0dGFjaG1lbnRUeXBlTWlzbWF0Y2giOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9JbnB1dE5vdFByb2R1Y2VkID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU2hhZGVyLUlucHV0Tm90UHJvZHVjZWQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9JbnRlcmZhY2VUeXBlTWlzbWF0Y2ggPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItSW50ZXJmYWNlVHlwZU1pc21hdGNoIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9TaGFkZXJfTWlzc2luZ0Rlc2NyaXB0b3IgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItTWlzc2luZ0Rlc2NyaXB0b3IiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9NaXNzaW5nSW5wdXRBdHRhY2htZW50ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU2hhZGVyLU1pc3NpbmdJbnB1dEF0dGFjaG1lbnQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9PdXRwdXROb3RDb25zdW1lZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1PdXRwdXROb3RDb25zdW1lZCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU2hhZGVyX1B1c2hDb25zdGFudE5vdEFjY2Vzc2libGVGcm9tU3RhZ2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItUHVzaENvbnN0YW50Tm90QWNjZXNzaWJsZUZyb21TdGFnZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU2hhZGVyX1B1c2hDb25zdGFudE91dE9mUmFuZ2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItUHVzaENvbnN0YW50T3V0T2ZSYW5nZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU2hhZGVyX01pc3NpbmdQb2ludFNpemVCdWlsdEluID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU2hhZGVyLVBvaW50U2l6ZU1pc3NpbmciOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9Qb2ludFNpemVCdWlsdEluT3ZlclNwZWNpZmllZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1Qb2ludFNpemVPdmVyU3BlY2lmaWVkIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9TaGFkZXJfTm9BbHBoYUF0TG9jYXRpb24wV2l0aEFscGhhVG9Db3ZlcmFnZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1Ob0FscGhhQXRMb2NhdGlvbjBXaXRoQWxwaGFUb0NvdmVyYWdlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9TaGFkZXJfQ29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXMgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItQ29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXMiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9Db29wZXJhdGl2ZU1hdHJpeFR5cGUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItQ29vcGVyYXRpdmVNYXRyaXhUeXBlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9TaGFkZXJfQ29vcGVyYXRpdmVNYXRyaXhNdWxBZGQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItQ29vcGVyYXRpdmVNYXRyaXhNdWxBZGQiOworLy8gUHJldmlvdXNseSBkZWZpbmVkIGJ1dCB1bnVzZWQgLSB1bmNvbW1lbnQgYXMgbmVlZGVkCisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9TaGFkZXJfQmFkQ2FwYWJpbGl0eSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1CYWRDYXBhYmlsaXR5IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9CYWRTcGVjaWFsaXphdGlvbiA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1CYWRTcGVjaWFsaXphdGlvbiI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9TaGFkZXJfTWlzc2luZ0VudHJ5cG9pbnQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItTWlzc2luZ0VudHJ5cG9pbnQiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU2hhZGVyX05vblNwaXJ2U2hhZGVyID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU2hhZGVyLU5vblNwaXJ2U2hhZGVyIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1NoYWRlcl9Vbmtub3duU3RhZ2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItVW5rbm93blN0YWdlIjsKKworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RldkxpbWl0X0NvdW50TWlzbWF0Y2ggPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EZXZMaW1pdENvdW50TWlzbWF0Y2giOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RldkxpbWl0X0ludmFsaWRGZWF0dXJlUmVxdWVzdGVkID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRGV2TGltaXQtSW52YWxpZEZlYXR1cmVSZXF1ZXN0ZWQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RldkxpbWl0X0ludmFsaWRJbnN0YW5jZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURldkxpbWl0LUludmFsaWRJbnN0YW5jZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRGV2TGltaXRfTWlzc2luZ1F1ZXJ5Q291bnQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EZXZMaW1pdC1NaXNzaW5nUXVlcnlDb3VudCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfRGV2TGltaXRfTXVzdFF1ZXJ5Q291bnQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EZXZMaW1pdC1NdXN0UXVlcnlDb3VudCI7CisvLyBQcmV2aW91c2x5IGRlZmluZWQgYnV0IHVudXNlZCAtIHVuY29tbWVudCBhcyBuZWVkZWQKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0RldkxpbWl0X0ludmFsaWRQaHlzaWNhbERldmljZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURldkxpbWl0LUludmFsaWRQaHlzaWNhbERldmljZSI7CisKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fR2V0U3VwcG9ydGVkRGlzcGxheXNXaXRob3V0UXVlcnkgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW4tR2V0U3VwcG9ydGVkRGlzcGxheXNXaXRob3V0UXVlcnkiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1N3YXBjaGFpbl9JbnZhbGlkQ291bnQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW5JbnZhbGlkQ291bnQiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1N3YXBjaGFpbl9QcmlvckNvdW50ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluUHJpb3JDb3VudCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX1ByZVRyYW5zZm9ybSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpblByZVRyYW5zZm9ybSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfQmluZEltYWdlTWVtb3J5X1N3YXBjaGFpbiA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLUJpbmRJbWFnZU1lbW9yeS1Td2FwY2hhaW4iOworCisvLyBQcmV2aW91c2x5IGRlZmluZWQgYnV0IHVudXNlZCAtIHVuY29tbWVudCBhcyBuZWVkZWQKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1N3YXBjaGFpbl9CYWRCb29sID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluQmFkQm9vbCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fQ3JlYXRlU3dhcEJhZENvbXBvc2l0ZUFscGhhID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluLUNyZWF0ZVN3YXBCYWRDb21wb3NpdGVBbHBoYSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fQ3JlYXRlU3dhcEJhZEltZ0FycmF5TGF5ZXJzID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluLUNyZWF0ZVN3YXBCYWRJbWdBcnJheUxheWVycyI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fQ3JlYXRlU3dhcEJhZEltZ0NvbG9yU3BhY2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW4tQ3JlYXRlU3dhcEJhZEltZ0NvbG9yU3BhY2UiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX0NyZWF0ZVN3YXBCYWRJbWdGbXRDbHJTcCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpbi1DcmVhdGVTd2FwQmFkSW1nRm10Q2xyU3AiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX0NyZWF0ZVN3YXBCYWRJbWdGb3JtYXQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW4tQ3JlYXRlU3dhcEJhZEltZ0Zvcm1hdCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fQ3JlYXRlU3dhcEJhZEltZ1VzYWdlRmxhZ3MgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW4tQ3JlYXRlU3dhcEJhZEltZ1VzYWdlRmxhZ3MiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX0NyZWF0ZVN3YXBCYWRQcmVUcmFuc2Zvcm0gPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW4tQ3JlYXRlU3dhcEJhZFByZVRyYW5zZm9ybSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fQ3JlYXRlU3dhcEJhZFByZXNlbnRNb2RlID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluLUNyZWF0ZVN3YXBCYWRQcmVzZW50TW9kZSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fQ3JlYXRlU3dhcEJhZFNoYXJpbmdNb2RlID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluLUNyZWF0ZVN3YXBCYWRTaGFyaW5nTW9kZSI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fQ3JlYXRlU3dhcEJhZFNoYXJpbmdWYWx1ZXMgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW4tQ3JlYXRlU3dhcEJhZFNoYXJpbmdWYWx1ZXMiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX0NyZWF0ZVN3YXBFeHRlbnRzTm9NYXRjaFdpbiA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpbi1DcmVhdGVTd2FwRXh0ZW50c05vTWF0Y2hXaW4iOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX0NyZWF0ZVN3YXBPdXRPZkJvdW5kc0V4dGVudHMgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW4tQ3JlYXRlU3dhcE91dE9mQm91bmRzRXh0ZW50cyI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fQ3JlYXRlU3dhcFdpdGhvdXRRdWVyeSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpbi1DcmVhdGVTd2FwV2l0aG91dFF1ZXJ5IjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1N3YXBjaGFpbl9DcmVhdGVVbnN1cHBvcnRlZFN1cmZhY2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1Td2FwY2hhaW5DcmVhdGVVbnN1cHBvcnRlZFN1cmZhY2UiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX0RlbE9iamVjdEJlZm9yZUNoaWxkcmVuID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluLURlbE9iamVjdEJlZm9yZUNoaWxkcmVuIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1N3YXBjaGFpbl9FeHROb3RFbmFibGVkQnV0VXNlZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpbi1FeHROb3RFbmFibGVkQnV0VXNlZCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fSW52YWxpZEhhbmRsZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpbkludmFsaWRIYW5kbGUiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX051bGxQb2ludGVyID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluTnVsbFBvaW50ZXIiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX1BsYW5lSW5kZXhUb29MYXJnZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpbi1QbGFuZUluZGV4VG9vTGFyZ2UiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX1dyb25nTmV4dCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpbldyb25nTmV4dCI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9Td2FwY2hhaW5fV3JvbmdTdHlwZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpbldyb25nU3R5cGUiOworLy9zdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfU3dhcGNoYWluX1plcm9WYWx1ZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVN3YXBjaGFpblplcm9WYWx1ZSI7CisKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9JbWFnZV9JbnZhbGlkRm9ybWF0TGltaXRzVmlvbGF0aW9uID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tSW1hZ2UtSW52YWxpZEZvcm1hdExpbWl0c1Zpb2xhdGlvbiI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfSW1hZ2VfWmVyb0FyZWFTdWJyZWdpb24gPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1JbWFnZS1aZXJvQXJlYVN1YnJlZ2lvbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9QdXNoRGVzY3JpcHRvclVwZGF0ZV9UZW1wbGF0ZVR5cGUgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS10ZW1wbGF0ZVR5cGUiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX1B1c2hEZXNjcmlwdG9yVXBkYXRlX1RlbXBsYXRlX1NldE1pc21hdGNoZWQgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLXNldCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfUHVzaERlc2NyaXB0b3JVcGRhdGVfVGVtcGxhdGVfTGF5b3V0TWlzbWF0Y2hlZCA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLXZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItbGF5b3V0IjsKKworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9Db3JlX0JpbmRJbWFnZV9JbnZhbGlkTWVtUmVxUXVlcnkgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi12a0JpbmRJbWFnZU1lbW9yeS1pbnZhbGlkLXJlcXVpcmVtZW50cyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfQmluZEltYWdlX05vTWVtUmVxUXVlcnkgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktcmVxdWlyZW1lbnRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9CaW5kQnVmZmVyX05vTWVtUmVxUXVlcnkgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LXJlcXVpcmVtZW50cyI7CisKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9CaW5kQWNjZWxOVl9Ob01lbVJlcVF1ZXJ5ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYtb2JqZWN0LXJlcXVpcmVtZW50cyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX0NvcmVfQ21kQnVpbGRBY2NlbE5WX05vU2NyYXRjaE1lbVJlcVF1ZXJ5ID0gIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNjcmF0Y2gtcmVxdWlyZW1lbnRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfQ29yZV9DbWRCdWlsZEFjY2VsTlZfTm9VcGRhdGVNZW1SZXFRdWVyeSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi11cGRhdGUtcmVxdWlyZW1lbnRzIjsKKworLy8gY2xhbmctZm9ybWF0IG9uCisKKyN1bmRlZiBERUNPUkFURV9VTlVTRUQKKworI2lmIDAgIC8vIFByZXNlcnZlIHRoZXNlIGNvbW1lbnRzIGZvciBwb3NzaWJsZSBpbmNsdXNpb24gaW4gdGhlIHNwZWMgcmVmZXJlbmNlIHN0cmluZyBkYXRhYmFzZQorZW51bSBTV0FQQ0hBSU5fRVJST1IgeworICAgIFNXQVBDSEFJTl9JTlZBTElEX0hBTkRMRSwgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdXNlZCB0aGF0IGlzbid0IGN1cnJlbnRseSB2YWxpZAorICAgIFNXQVBDSEFJTl9OVUxMX1BPSU5URVIsICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHNldCB0byBOVUxMLCBpbnN0ZWFkIG9mIGJlaW5nIGEgdmFsaWQgcG9pbnRlcgorICAgIFNXQVBDSEFJTl9FWFRfTk9UX0VOQUJMRURfQlVUX1VTRUQsICAgICAgICAgICAvLyBEaWQgbm90IGVuYWJsZSBXU0kgZXh0ZW5zaW9uLCBidXQgY2FsbGVkIFdTSSBmdW5jdGlvbgorICAgIFNXQVBDSEFJTl9ERUxfT0JKRUNUX0JFRk9SRV9DSElMRFJFTiwgICAgICAgICAvLyBDYWxsZWQgdmtEZXN0cm95RGV2aWNlKCkgYmVmb3JlIHZrRGVzdHJveVN3YXBjaGFpbktIUigpCisgICAgU1dBUENIQUlOX0NSRUFURV9VTlNVUFBPUlRFRF9TVVJGQUNFLCAgICAgICAgIC8vIENhbGxlZCB2a0NyZWF0ZVN3YXBjaGFpbktIUigpIHdpdGggYSBwQ3JlYXRlSW5mby0+c3VyZmFjZSB0aGF0IHdhc24ndCBzdXBwb3J0ZWQKKyAgICBTV0FQQ0hBSU5fQ1JFQVRFX1NXQVBfV0lUSE9VVF9RVUVSWSwgICAgICAgICAgLy8gQ2FsbGVkIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgd2l0aG91dCBjYWxsaW5nIGEgcXVlcnkKKyAgICBTV0FQQ0hBSU5fQ1JFQVRFX1NXQVBfT1VUX09GX0JPVU5EU19FWFRFTlRTLCAgLy8gQ2FsbGVkIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgd2l0aCBvdXQtb2YtYm91bmRzIGltYWdlRXh0ZW50CisgICAgU1dBUENIQUlOX0NSRUFURV9TV0FQX0VYVEVOVFNfTk9fTUFUQ0hfV0lOLCAgIC8vIENhbGxlZCB2a0NyZWF0ZVN3YXBjaGFpbktIUiB3L2ltYWdlRXh0ZW50IHRoYXQgZG9lc24ndCBtYXRjaCB3aW5kb3cncyBleHRlbnQKKyAgICBTV0FQQ0hBSU5fQ1JFQVRFX1NXQVBfQkFEX1BSRV9UUkFOU0ZPUk0sICAgICAgLy8gQ2FsbGVkIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgd2l0aCBhIG5vbi1zdXBwb3J0ZWQgcHJlVHJhbnNmb3JtCisgICAgU1dBUENIQUlOX0NSRUFURV9TV0FQX0JBRF9DT01QT1NJVEVfQUxQSEEsICAgIC8vIENhbGxlZCB2a0NyZWF0ZVN3YXBjaGFpbktIUigpIHdpdGggYSBub24tc3VwcG9ydGVkIGNvbXBvc2l0ZUFscGhhCisgICAgU1dBUENIQUlOX0NSRUFURV9TV0FQX0JBRF9JTUdfQVJSQVlfTEFZRVJTLCAgIC8vIENhbGxlZCB2a0NyZWF0ZVN3YXBjaGFpbktIUigpIHdpdGggYSBub24tc3VwcG9ydGVkIGltYWdlQXJyYXlMYXllcnMKKyAgICBTV0FQQ0hBSU5fQ1JFQVRFX1NXQVBfQkFEX0lNR19VU0FHRV9GTEFHUywgICAgLy8gQ2FsbGVkIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgd2l0aCBhIG5vbi1zdXBwb3J0ZWQgaW1hZ2VVc2FnZUZsYWdzCisgICAgU1dBUENIQUlOX0NSRUFURV9TV0FQX0JBRF9JTUdfQ09MT1JfU1BBQ0UsICAgIC8vIENhbGxlZCB2a0NyZWF0ZVN3YXBjaGFpbktIUigpIHdpdGggYSBub24tc3VwcG9ydGVkIGltYWdlQ29sb3JTcGFjZQorICAgIFNXQVBDSEFJTl9DUkVBVEVfU1dBUF9CQURfSU1HX0ZPUk1BVCwgICAgICAgICAvLyBDYWxsZWQgdmtDcmVhdGVTd2FwY2hhaW5LSFIoKSB3aXRoIGEgbm9uLXN1cHBvcnRlZCBpbWFnZUZvcm1hdAorICAgIFNXQVBDSEFJTl9DUkVBVEVfU1dBUF9CQURfSU1HX0ZNVF9DTFJfU1AsICAgICAvLyBDYWxsZWQgdmtDcmVhdGVTd2FwY2hhaW5LSFIoKSB3aXRoIGEgbm9uLXN1cHBvcnRlZCBpbWFnZUNvbG9yU3BhY2UKKyAgICBTV0FQQ0hBSU5fQ1JFQVRFX1NXQVBfQkFEX1BSRVNFTlRfTU9ERSwgICAgICAgLy8gQ2FsbGVkIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgd2l0aCBhIG5vbi1zdXBwb3J0ZWQgcHJlc2VudE1vZGUKKyAgICBTV0FQQ0hBSU5fQ1JFQVRFX1NXQVBfQkFEX1NIQVJJTkdfTU9ERSwgICAgICAgLy8gQ2FsbGVkIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgd2l0aCBhIG5vbi1zdXBwb3J0ZWQgaW1hZ2VTaGFyaW5nTW9kZQorICAgIFNXQVBDSEFJTl9DUkVBVEVfU1dBUF9CQURfU0hBUklOR19WQUxVRVMsICAgICAvLyBDYWxsZWQgdmtDcmVhdGVTd2FwY2hhaW5LSFIoKSB3aXRoIGJhZCB2YWx1ZXMgd2hlbiBpbWFnZVNoYXJpbmdNb2RlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UCisgICAgU1dBUENIQUlOX0JBRF9CT09MLCAgICAgICAvLyBWa0Jvb2wzMiB0aGF0IGRvZXNuJ3QgaGF2ZSB2YWx1ZSBvZiBWS19UUlVFIG9yIFZLX0ZBTFNFIChlLmcuIGlzIGEgbm9uLXplcm8gZm9ybSBvZiB0cnVlKQorICAgIFNXQVBDSEFJTl9QUklPUl9DT1VOVCwgICAgLy8gUXVlcnkgbXVzdCBiZSBjYWxsZWQgZmlyc3QgdG8gZ2V0IHZhbHVlIG9mIHBDb3VudCwgdGhlbiBjYWxsZWQgc2Vjb25kIHRpbWUKKyAgICBTV0FQQ0hBSU5fSU5WQUxJRF9DT1VOVCwgIC8vIFNlY29uZCB0aW1lIGEgcXVlcnkgY2FsbGVkLCB0aGUgcENvdW50IHZhbHVlIGRpZG4ndCBtYXRjaCBmaXJzdCB0aW1lCisgICAgU1dBUENIQUlOX1dST05HX1NUWVBFLCAgICAvLyBUaGUgc1R5cGUgZm9yIGEgc3RydWN0IGhhcyB0aGUgd3JvbmcgdmFsdWUKKyAgICBTV0FQQ0hBSU5fV1JPTkdfTkVYVCwgICAgIC8vIFRoZSBwTmV4dCBmb3IgYSBzdHJ1Y3QgaXMgbm90IE5VTEwKKyAgICBTV0FQQ0hBSU5fWkVST19WQUxVRSwgICAgIC8vIEEgdmFsdWUgc2hvdWxkIGJlIG5vbi16ZXJvCisgICAgU1dBUENIQUlOX0dFVF9TVVBQT1JURURfRElTUExBWVNfV0lUSE9VVF9RVUVSWSwgIC8vIHZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBxdWVyeWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UgZGlzcGxheSBwbGFuZSBwcm9wZXJ0aWVzCisgICAgU1dBUENIQUlOX1BMQU5FX0lOREVYX1RPT19MQVJHRSwgIC8vIGEgcGxhbmVJbmRleCB2YWx1ZSBpcyBsYXJnZXIgdGhhbiB3aGF0IHZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIgcmV0dXJucworfTsKKyNlbmRpZgorCisjZW5kaWYgIC8vIENPUkVfVkFMSURBVElPTl9FUlJPUl9FTlVNU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbl90eXBlcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbl90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOWQ5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvY29yZV92YWxpZGF0aW9uX3R5cGVzLmgKQEAgLTAsMCArMSwxNzE2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlnb0Bnb29nbGUuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvaG4gWnVsYXVmIDxqenVsYXVmQGx1bmFyZy5jb20+CisgKi8KKyNpZm5kZWYgQ09SRV9WQUxJREFUSU9OX1RZUEVTX0hfCisjZGVmaW5lIENPUkVfVkFMSURBVElPTl9UWVBFU19IXworCisjaW5jbHVkZSAiY2FzdF91dGlscy5oIgorI2luY2x1ZGUgImhhc2hfdmtfdHlwZXMuaCIKKyNpbmNsdWRlICJzcGFyc2VfY29udGFpbmVycy5oIgorI2luY2x1ZGUgInZrX3NhZmVfc3RydWN0LmgiCisjaW5jbHVkZSAidnVsa2FuL3Z1bGthbi5oIgorI2luY2x1ZGUgInZrX2xheWVyX2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ2a19vYmplY3RfdHlwZXMuaCIKKyNpbmNsdWRlICJ2a19leHRlbnNpb25faGVscGVyLmgiCisjaW5jbHVkZSAidmtfdHlwZW1hcF9oZWxwZXIuaCIKKyNpbmNsdWRlICJjb252ZXJ0X3RvX3JlbmRlcnBhc3MyLmgiCisjaW5jbHVkZSAibGF5ZXJfY2hhc3Npc19kaXNwYXRjaC5oIgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxsaXN0PgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaW5jbHVkZSAiYW5kcm9pZF9uZGtfdHlwZXMuaCIKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKy8vIEZ3ZCBkZWNsYXJhdGlvbnMgLS0gaW5jbHVkaW5nIGRlc2NyaXB0b3Jfc2V0LmggY3JlYXRlcyBhbiB1Z2x5IGluY2x1ZGUgbG9vcAorbmFtZXNwYWNlIGN2ZGVzY3JpcHRvcnNldCB7CitjbGFzcyBEZXNjcmlwdG9yU2V0TGF5b3V0RGVmOworY2xhc3MgRGVzY3JpcHRvclNldExheW91dDsKK2NsYXNzIERlc2NyaXB0b3JTZXQ7Cit9ICAvLyBuYW1lc3BhY2UgY3ZkZXNjcmlwdG9yc2V0CisKK3N0cnVjdCBDTURfQlVGRkVSX1NUQVRFOworY2xhc3MgQ29yZUNoZWNrczsKK2NsYXNzIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI7CisKK2VudW0gQ0FMTF9TVEFURSB7CisgICAgVU5DQUxMRUQsICAgICAgIC8vIEZ1bmN0aW9uIGhhcyBub3QgYmVlbiBjYWxsZWQKKyAgICBRVUVSWV9DT1VOVCwgICAgLy8gRnVuY3Rpb24gY2FsbGVkIG9uY2UgdG8gcXVlcnkgYSBjb3VudAorICAgIFFVRVJZX0RFVEFJTFMsICAvLyBGdW5jdGlvbiBjYWxsZWQgdy8gYSBjb3VudCB0byBxdWVyeSBkZXRhaWxzCit9OworCitjbGFzcyBCQVNFX05PREUgeworICBwdWJsaWM6CisgICAgLy8gVHJhY2sgd2hlbiBvYmplY3QgaXMgYmVpbmcgdXNlZCBieSBhbiBpbi1mbGlnaHQgY29tbWFuZCBidWZmZXIKKyAgICBzdGQ6OmF0b21pY19pbnQgaW5fdXNlOworICAgIC8vIFRyYWNrIGNvbW1hbmQgYnVmZmVycyB0aGF0IHRoaXMgb2JqZWN0IGlzIGJvdW5kIHRvCisgICAgLy8gIGJpbmRpbmcgaW5pdGlhbGl6ZWQgd2hlbiBjbWQgcmVmZXJlbmNpbmcgb2JqZWN0IGlzIGJvdW5kIHRvIGNvbW1hbmQgYnVmZmVyCisgICAgLy8gIGJpbmRpbmcgcmVtb3ZlZCB3aGVuIGNvbW1hbmQgYnVmZmVyIGlzIHJlc2V0IG9yIGRlc3Ryb3llZAorICAgIC8vIFdoZW4gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZCwgYW55IGJvdW5kIGNicyBhcmUgc2V0IHRvIElOVkFMSUQuCisgICAgLy8gImludCIgdmFsdWUgaXMgYW4gaW5kZXggaW50byBvYmplY3RfYmluZGluZ3Mgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyBiYWNrcG9pbnRlciB0byB0aGlzIG5vZGUgaXMgc3RvcmVkLgorICAgIHNtYWxsX3Vub3JkZXJlZF9tYXA8Q01EX0JVRkZFUl9TVEFURSAqLCBpbnQsIDg+IGNiX2JpbmRpbmdzOworICAgIC8vIFNldCB0byB0cnVlIHdoZW4gdGhlIEFQSS1sZXZlbCBvYmplY3QgaXMgZGVzdHJveWVkLCBidXQgdGhpcyBvYmplY3QgbWF5CisgICAgLy8gaGFuZyBhcm91bmQgdW50aWwgaXRzIHNoYXJlZF9wdHIgcmVmY291bnQgZ29lcyB0byB6ZXJvLgorICAgIGJvb2wgZGVzdHJveWVkOworCisgICAgQkFTRV9OT0RFKCkgeworICAgICAgICBpbl91c2Uuc3RvcmUoMCk7CisgICAgICAgIGRlc3Ryb3llZCA9IGZhbHNlOworICAgIH07Cit9OworCisvLyBUcmFjayBjb21tYW5kIHBvb2xzIGFuZCB0aGVpciBjb21tYW5kIGJ1ZmZlcnMKK3N0cnVjdCBDT01NQU5EX1BPT0xfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgY3JlYXRlRmxhZ3M7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleDsKKyAgICAvLyBDbWQgYnVmZmVycyBhbGxvY2F0ZWQgZnJvbSB0aGlzIHBvb2wKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8VmtDb21tYW5kQnVmZmVyPiBjb21tYW5kQnVmZmVyczsKK307CisKKy8vIFV0aWxpdGllcyBmb3IgYmFycmllcnMgYW5kIHRoZSBjb21tbWFuZCBwb29sCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFycmllcj4KK3N0YXRpYyBib29sIElzVHJhbnNmZXJPcChjb25zdCBCYXJyaWVyICpiYXJyaWVyKSB7CisgICAgcmV0dXJuIGJhcnJpZXItPnNyY1F1ZXVlRmFtaWx5SW5kZXggIT0gYmFycmllci0+ZHN0UXVldWVGYW1pbHlJbmRleDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXIsIGJvb2wgYXNzdW1lX3RyYW5zZmVyID0gZmFsc2U+CitzdGF0aWMgYm9vbCBUZW1wSXNSZWxlYXNlT3AoY29uc3QgQ09NTUFORF9QT09MX1NUQVRFICpwb29sLCBjb25zdCBCYXJyaWVyICpiYXJyaWVyKSB7CisgICAgcmV0dXJuIChhc3N1bWVfdHJhbnNmZXIgfHwgSXNUcmFuc2Zlck9wKGJhcnJpZXIpKSAmJiAocG9vbC0+cXVldWVGYW1pbHlJbmRleCA9PSBiYXJyaWVyLT5zcmNRdWV1ZUZhbWlseUluZGV4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXIsIGJvb2wgYXNzdW1lX3RyYW5zZmVyID0gZmFsc2U+CitzdGF0aWMgYm9vbCBJc0FjcXVpcmVPcChjb25zdCBDT01NQU5EX1BPT0xfU1RBVEUgKnBvb2wsIGNvbnN0IEJhcnJpZXIgKmJhcnJpZXIpIHsKKyAgICByZXR1cm4gKGFzc3VtZV90cmFuc2ZlciB8fCBJc1RyYW5zZmVyT3AoYmFycmllcikpICYmIChwb29sLT5xdWV1ZUZhbWlseUluZGV4ID09IGJhcnJpZXItPmRzdFF1ZXVlRmFtaWx5SW5kZXgpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgUXVldWVGYW1pbHlJc1NwZWNpYWwoY29uc3QgdWludDMyX3QgcXVldWVfZmFtaWx5X2luZGV4KSB7CisgICAgcmV0dXJuIChxdWV1ZV9mYW1pbHlfaW5kZXggPT0gVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMX0tIUikgfHwgKHF1ZXVlX2ZhbWlseV9pbmRleCA9PSBWS19RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFQpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgUXVldWVGYW1pbHlJc0lnbm9yZWQodWludDMyX3QgcXVldWVfZmFtaWx5X2luZGV4KSB7IHJldHVybiBxdWV1ZV9mYW1pbHlfaW5kZXggPT0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7IH0KKworLy8gSW50ZW50aW9uYWxseSBpZ25vcmUgVnVsa2FuVHlwZWRIYW5kbGU6Om5vZGUsIGl0IGlzIG9wdGlvbmFsCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlICZhLCBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmYikgTk9FWENFUFQgeworICAgIHJldHVybiBhLmhhbmRsZSA9PSBiLmhhbmRsZSAmJiBhLnR5cGUgPT0gYi50eXBlOworfQorbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8VnVsa2FuVHlwZWRIYW5kbGU+IHsKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShWdWxrYW5UeXBlZEhhbmRsZSBvYmopIGNvbnN0IE5PRVhDRVBUIHsgcmV0dXJuIGhhc2g8dWludDY0X3Q+KCkob2JqLmhhbmRsZSkgXiBoYXNoPHVpbnQzMl90PigpKG9iai50eXBlKTsgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworLy8gRmxhZ3MgZGVzY3JpYmluZyByZXF1aXJlbWVudHMgaW1wb3NlZCBieSB0aGUgcGlwZWxpbmUgb24gYSBkZXNjcmlwdG9yLiBUaGVzZQorLy8gY2FuJ3QgYmUgY2hlY2tlZCBhdCBwaXBlbGluZSBjcmVhdGlvbiB0aW1lIGFzIHRoZXkgZGVwZW5kIG9uIHRoZSBJbWFnZSBvcgorLy8gSW1hZ2VWaWV3IGJvdW5kLgorZW51bSBkZXNjcmlwdG9yX3JlcSB7CisgICAgREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFXzFEID0gMSA8PCBWS19JTUFHRV9WSUVXX1RZUEVfMUQsCisgICAgREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFXzFEX0FSUkFZID0gMSA8PCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksCisgICAgREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFXzJEID0gMSA8PCBWS19JTUFHRV9WSUVXX1RZUEVfMkQsCisgICAgREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFXzJEX0FSUkFZID0gMSA8PCBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVksCisgICAgREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFXzNEID0gMSA8PCBWS19JTUFHRV9WSUVXX1RZUEVfM0QsCisgICAgREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFX0NVQkUgPSAxIDw8IFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLAorICAgIERFU0NSSVBUT1JfUkVRX1ZJRVdfVFlQRV9DVUJFX0FSUkFZID0gMSA8PCBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwKKworICAgIERFU0NSSVBUT1JfUkVRX0FMTF9WSUVXX1RZUEVfQklUUyA9ICgxIDw8IChWS19JTUFHRV9WSUVXX1RZUEVfRU5EX1JBTkdFICsgMSkpIC0gMSwKKworICAgIERFU0NSSVBUT1JfUkVRX1NJTkdMRV9TQU1QTEUgPSAyIDw8IFZLX0lNQUdFX1ZJRVdfVFlQRV9FTkRfUkFOR0UsCisgICAgREVTQ1JJUFRPUl9SRVFfTVVMVElfU0FNUExFID0gREVTQ1JJUFRPUl9SRVFfU0lOR0xFX1NBTVBMRSA8PCAxLAorCisgICAgREVTQ1JJUFRPUl9SRVFfQ09NUE9ORU5UX1RZUEVfRkxPQVQgPSBERVNDUklQVE9SX1JFUV9NVUxUSV9TQU1QTEUgPDwgMSwKKyAgICBERVNDUklQVE9SX1JFUV9DT01QT05FTlRfVFlQRV9TSU5UID0gREVTQ1JJUFRPUl9SRVFfQ09NUE9ORU5UX1RZUEVfRkxPQVQgPDwgMSwKKyAgICBERVNDUklQVE9SX1JFUV9DT01QT05FTlRfVFlQRV9VSU5UID0gREVTQ1JJUFRPUl9SRVFfQ09NUE9ORU5UX1RZUEVfU0lOVCA8PCAxLAorfTsKKworZXh0ZXJuIHVuc2lnbmVkIERlc2NyaXB0b3JSZXF1aXJlbWVudHNCaXRzRnJvbUZvcm1hdChWa0Zvcm1hdCBmbXQpOworCit0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LCBkZXNjcmlwdG9yX3JlcT4gQmluZGluZ1JlcU1hcDsKKworc3RydWN0IERFU0NSSVBUT1JfUE9PTF9TVEFURSA6IEJBU0VfTk9ERSB7CisgICAgVmtEZXNjcmlwdG9yUG9vbCBwb29sOworICAgIHVpbnQzMl90IG1heFNldHM7ICAgICAgICAvLyBNYXggZGVzY3JpcHRvciBzZXRzIGFsbG93ZWQgaW4gdGhpcyBwb29sCisgICAgdWludDMyX3QgYXZhaWxhYmxlU2V0czsgIC8vIEF2YWlsYWJsZSBkZXNjcmlwdG9yIHNldHMgaW4gdGhpcyBwb29sCisKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIGNyZWF0ZUluZm87CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqPiBzZXRzOyAgLy8gQ29sbGVjdGlvbiBvZiBhbGwgc2V0cyBpbiB0aGlzIHBvb2wKKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IG1heERlc2NyaXB0b3JUeXBlQ291bnQ7ICAgICAgICAvLyBNYXggIyBvZiBkZXNjcmlwdG9ycyBvZiBlYWNoIHR5cGUgaW4gdGhpcyBwb29sCisgICAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBhdmFpbGFibGVEZXNjcmlwdG9yVHlwZUNvdW50OyAgLy8gQXZhaWxhYmxlICMgb2YgZGVzY3JpcHRvcnMgb2YgZWFjaCB0eXBlIGluIHRoaXMgcG9vbAorCisgICAgREVTQ1JJUFRPUl9QT09MX1NUQVRFKGNvbnN0IFZrRGVzY3JpcHRvclBvb2wgcG9vbCwgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKQorICAgICAgICA6IHBvb2wocG9vbCksCisgICAgICAgICAgbWF4U2V0cyhwQ3JlYXRlSW5mby0+bWF4U2V0cyksCisgICAgICAgICAgYXZhaWxhYmxlU2V0cyhwQ3JlYXRlSW5mby0+bWF4U2V0cyksCisgICAgICAgICAgY3JlYXRlSW5mbyhwQ3JlYXRlSW5mbyksCisgICAgICAgICAgbWF4RGVzY3JpcHRvclR5cGVDb3VudCgpLAorICAgICAgICAgIGF2YWlsYWJsZURlc2NyaXB0b3JUeXBlQ291bnQoKSB7CisgICAgICAgIC8vIENvbGxlY3QgbWF4aW11bXMgcGVyIGRlc2NyaXB0b3IgdHlwZS4KKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNyZWF0ZUluZm8ucG9vbFNpemVDb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0eXBlSW5kZXggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY3JlYXRlSW5mby5wUG9vbFNpemVzW2ldLnR5cGUpOworICAgICAgICAgICAgLy8gU2FtZSBkZXNjcmlwdG9yIHR5cGVzIGNhbiBhcHBlYXIgc2V2ZXJhbCB0aW1lcworICAgICAgICAgICAgbWF4RGVzY3JpcHRvclR5cGVDb3VudFt0eXBlSW5kZXhdICs9IGNyZWF0ZUluZm8ucFBvb2xTaXplc1tpXS5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICBhdmFpbGFibGVEZXNjcmlwdG9yVHlwZUNvdW50W3R5cGVJbmRleF0gPSBtYXhEZXNjcmlwdG9yVHlwZUNvdW50W3R5cGVJbmRleF07CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBHZW5lcmljIG1lbW9yeSBiaW5kaW5nIHN0cnVjdCB0byB0cmFjayBvYmplY3RzIGJvdW5kIHRvIG9iamVjdHMKK3N0cnVjdCBNRU1fQklORElORyB7CisgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQ7CisgICAgVmtEZXZpY2VTaXplIHNpemU7Cit9OworCitzdHJ1Y3QgQnVmZmVyQmluZGluZyB7CisgICAgVmtCdWZmZXIgYnVmZmVyOworICAgIFZrRGV2aWNlU2l6ZSBzaXplOworICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgSW5kZXhCdWZmZXJCaW5kaW5nIDogQnVmZmVyQmluZGluZyB7CisgICAgVmtJbmRleFR5cGUgaW5kZXhfdHlwZTsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oTUVNX0JJTkRJTkcgYSwgTUVNX0JJTkRJTkcgYikgTk9FWENFUFQgeyByZXR1cm4gYS5tZW0gPT0gYi5tZW0gJiYgYS5vZmZzZXQgPT0gYi5vZmZzZXQgJiYgYS5zaXplID09IGIuc2l6ZTsgfQorCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxNRU1fQklORElORz4geworICAgIHNpemVfdCBvcGVyYXRvcigpKE1FTV9CSU5ESU5HIG1iKSBjb25zdCBOT0VYQ0VQVCB7CisgICAgICAgIGF1dG8gaW50ZXJtZWRpYXRlID0gaGFzaDx1aW50NjRfdD4oKShyZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KG1iLm1lbSkpIF4gaGFzaDx1aW50NjRfdD4oKShtYi5vZmZzZXQpOworICAgICAgICByZXR1cm4gaW50ZXJtZWRpYXRlIF4gaGFzaDx1aW50NjRfdD4oKShtYi5zaXplKTsKKyAgICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIHN0ZAorCisvLyBTdXBlcmNsYXNzIGZvciBiaW5kYWJsZSBvYmplY3Qgc3RhdGUgKGN1cnJlbnRseSBpbWFnZXMgYW5kIGJ1ZmZlcnMpCitjbGFzcyBCSU5EQUJMRSA6IHB1YmxpYyBCQVNFX05PREUgeworICBwdWJsaWM6CisgICAgYm9vbCBzcGFyc2U7ICAvLyBJcyB0aGlzIG9iamVjdCBiZWluZyBib3VuZCB3aXRoIHNwYXJzZSBtZW1vcnkgb3Igbm90PworICAgIC8vIE5vbi1zcGFyc2UgYmluZGluZyBkYXRhCisgICAgTUVNX0JJTkRJTkcgYmluZGluZzsKKyAgICAvLyBNZW1vcnkgcmVxdWlyZW1lbnRzIGZvciB0aGlzIEJJTkRBQkxFCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgcmVxdWlyZW1lbnRzOworICAgIC8vIGJvb2wgdG8gdHJhY2sgaWYgbWVtb3J5IHJlcXVpcmVtZW50cyB3ZXJlIGNoZWNrZWQKKyAgICBib29sIG1lbW9yeV9yZXF1aXJlbWVudHNfY2hlY2tlZDsKKyAgICAvLyBUcmFja3MgZXh0ZXJuYWwgbWVtb3J5IHR5cGVzIGNyZWF0aW5nIHJlc291cmNlCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyBleHRlcm5hbF9tZW1vcnlfaGFuZGxlOworICAgIC8vIFNwYXJzZSBiaW5kaW5nIGRhdGEsIGluaXRpYWxseSBqdXN0IHRyYWNraW5nIE1FTV9CSU5ESU5HIHBlciBtZW0gb2JqZWN0CisgICAgLy8gIFRoZXJlJ3MgbW9yZSBkYXRhIGZvciBzcGFyc2UgYmluZGluZ3Mgc28gbmVlZCBiZXR0ZXIgbG9uZy10ZXJtIHNvbHV0aW9uCisgICAgLy8gVE9ETyA6IE5lZWQgdG8gdXBkYXRlIHNvbHV0aW9uIHRvIHRyYWNrIGFsbCBzcGFyc2UgYmluZGluZyBkYXRhCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PE1FTV9CSU5ESU5HPiBzcGFyc2VfYmluZGluZ3M7CisKKyAgICBzbWFsbF91bm9yZGVyZWRfc2V0PFZrRGV2aWNlTWVtb3J5LCAxPiBib3VuZF9tZW1vcnlfc2V0XzsKKworICAgIEJJTkRBQkxFKCkKKyAgICAgICAgOiBzcGFyc2UoZmFsc2UpLAorICAgICAgICAgIGJpbmRpbmd7fSwKKyAgICAgICAgICByZXF1aXJlbWVudHN7fSwKKyAgICAgICAgICBtZW1vcnlfcmVxdWlyZW1lbnRzX2NoZWNrZWQoZmFsc2UpLAorICAgICAgICAgIGV4dGVybmFsX21lbW9yeV9oYW5kbGUoMCksCisgICAgICAgICAgc3BhcnNlX2JpbmRpbmdze30sCisgICAgICAgICAgYm91bmRfbWVtb3J5X3NldF97fSB7fTsKKworICAgIC8vIFVwZGF0ZSB0aGUgY2FjaGVkIHNldCBvZiBtZW1vcnkgYmluZGluZ3MuCisgICAgLy8gQ29kZSB0aGF0IGNoYW5nZXMgYmluZGluZy5tZW0gb3Igc3BhcnNlX2JpbmRpbmdzIG11c3QgY2FsbCBVcGRhdGVCb3VuZE1lbW9yeVNldCgpCisgICAgdm9pZCBVcGRhdGVCb3VuZE1lbW9yeVNldCgpIHsKKyAgICAgICAgYm91bmRfbWVtb3J5X3NldF8uY2xlYXIoKTsKKyAgICAgICAgaWYgKCFzcGFyc2UpIHsKKyAgICAgICAgICAgIGJvdW5kX21lbW9yeV9zZXRfLmluc2VydChiaW5kaW5nLm1lbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gc2IgOiBzcGFyc2VfYmluZGluZ3MpIHsKKyAgICAgICAgICAgICAgICBib3VuZF9tZW1vcnlfc2V0Xy5pbnNlcnQoc2IubWVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybiB1bm9yZGVyZWQgc2V0IG9mIG1lbW9yeSBvYmplY3RzIHRoYXQgYXJlIGJvdW5kCisgICAgLy8gSW5zdGVhZCBvZiBjcmVhdGluZyBhIHNldCBmcm9tIHNjcmF0Y2ggZWFjaCBxdWVyeSwgcmV0dXJuIHRoZSBjYWNoZWQgb25lCisgICAgY29uc3Qgc21hbGxfdW5vcmRlcmVkX3NldDxWa0RldmljZU1lbW9yeSwgMT4gJkdldEJvdW5kTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gYm91bmRfbWVtb3J5X3NldF87IH0KK307CisKK2NsYXNzIEJVRkZFUl9TVEFURSA6IHB1YmxpYyBCSU5EQUJMRSB7CisgIHB1YmxpYzoKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGNyZWF0ZUluZm87CisgICAgVmtEZXZpY2VBZGRyZXNzIGRldmljZUFkZHJlc3M7CisgICAgQlVGRkVSX1NUQVRFKFZrQnVmZmVyIGJ1ZmYsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pIDogYnVmZmVyKGJ1ZmYpLCBjcmVhdGVJbmZvKCpwQ3JlYXRlSW5mbykgeworICAgICAgICBpZiAoKGNyZWF0ZUluZm8uc2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQpICYmIChjcmVhdGVJbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA+IDApKSB7CisgICAgICAgICAgICB1aW50MzJfdCAqcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG5ldyB1aW50MzJfdFtjcmVhdGVJbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseUluZGljZXNbaV0gPSBwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNyZWF0ZUluZm8ucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3JlYXRlSW5mby5mbGFncyAmIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUKSB7CisgICAgICAgICAgICBzcGFyc2UgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYXV0byAqZXh0ZXJuYWxNZW1vcnlJbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgICAgIGlmIChleHRlcm5hbE1lbW9yeUluZm8pIHsKKyAgICAgICAgICAgIGV4dGVybmFsX21lbW9yeV9oYW5kbGUgPSBleHRlcm5hbE1lbW9yeUluZm8tPmhhbmRsZVR5cGVzOworICAgICAgICB9CisgICAgfTsKKworICAgIEJVRkZFUl9TVEFURShCVUZGRVJfU1RBVEUgY29uc3QgJnJoX29iaikgPSBkZWxldGU7CisKKyAgICB+QlVGRkVSX1NUQVRFKCkgeworICAgICAgICBpZiAoKGNyZWF0ZUluZm8uc2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQpICYmIChjcmVhdGVJbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA+IDApKSB7CisgICAgICAgICAgICBkZWxldGVbXSBjcmVhdGVJbmZvLnBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgICAgICAgICBjcmVhdGVJbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSBudWxscHRyOworICAgICAgICB9CisgICAgfTsKK307CisKK2NsYXNzIEJVRkZFUl9WSUVXX1NUQVRFIDogcHVibGljIEJBU0VfTk9ERSB7CisgIHB1YmxpYzoKKyAgICBWa0J1ZmZlclZpZXcgYnVmZmVyX3ZpZXc7CisgICAgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyBjcmVhdGVfaW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QlVGRkVSX1NUQVRFPiBidWZmZXJfc3RhdGU7CisgICAgQlVGRkVSX1ZJRVdfU1RBVEUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJVRkZFUl9TVEFURT4gJmJmLCBWa0J1ZmZlclZpZXcgYnYsIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gKmNpKQorICAgICAgICA6IGJ1ZmZlcl92aWV3KGJ2KSwgY3JlYXRlX2luZm8oKmNpKSwgYnVmZmVyX3N0YXRlKGJmKXt9OworICAgIEJVRkZFUl9WSUVXX1NUQVRFKGNvbnN0IEJVRkZFUl9WSUVXX1NUQVRFICZyaF9vYmopID0gZGVsZXRlOworfTsKKworc3RydWN0IFNBTVBMRVJfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgICBWa1NhbXBsZXIgc2FtcGxlcjsKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIGNyZWF0ZUluZm87CisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHNhbXBsZXJDb252ZXJzaW9uID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICBTQU1QTEVSX1NUQVRFKGNvbnN0IFZrU2FtcGxlciAqcHMsIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8gKnBjaSkgOiBzYW1wbGVyKCpwcyksIGNyZWF0ZUluZm8oKnBjaSkgeworICAgICAgICBhdXRvICpjb252ZXJzaW9uSW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8+KHBjaS0+cE5leHQpOworICAgICAgICBpZiAoY29udmVyc2lvbkluZm8pIHNhbXBsZXJDb252ZXJzaW9uID0gY29udmVyc2lvbkluZm8tPmNvbnZlcnNpb247CisgICAgfQorfTsKKworY2xhc3MgSU1BR0VfU1RBVEUgOiBwdWJsaWMgQklOREFCTEUgeworICBwdWJsaWM6CisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBjcmVhdGVJbmZvOworICAgIGJvb2wgdmFsaWQ7ICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN3YXBjaGFpbiBpbWFnZSBiYWNraW5nIG1lbW9yeSB0cmFjayB2YWxpZCBoZXJlIGFzIGl0IGRvZXNuJ3QgaGF2ZSBERVZJQ0VfTUVNT1JZX1NUQVRFCisgICAgYm9vbCBhY3F1aXJlZDsgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3dhcGNoYWluIGltYWdlLCBoYXMgaXQgYmVlbiBhY3F1aXJlZCBieSB0aGUgYXBwLgorICAgIGJvb2wgc2hhcmVkX3ByZXNlbnRhYmxlOyAgLy8gVHJ1ZSBmb3IgYSBmcm9udC1idWZmZXJlZCBzd2FwY2hhaW4gaW1hZ2UKKyAgICBib29sIGxheW91dF9sb2NrZWQ7ICAgICAgIC8vIEEgZnJvbnQtYnVmZmVyZWQgaW1hZ2UgdGhhdCBoYXMgYmVlbiBwcmVzZW50ZWQgY2FuIG5ldmVyIGhhdmUgbGF5b3V0IHRyYW5zaXRpb25lZAorICAgIGJvb2wgZ2V0X3NwYXJzZV9yZXFzX2NhbGxlZDsgICAgICAgICAvLyBUcmFjayBpZiBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygpIGhhcyBiZWVuIGNhbGxlZCBmb3IgdGhpcyBpbWFnZQorICAgIGJvb2wgc3BhcnNlX21ldGFkYXRhX3JlcXVpcmVkOyAgICAgICAvLyBUcmFjayBpZiBzcGFyc2UgbWV0YWRhdGEgYXNwZWN0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGltYWdlCisgICAgYm9vbCBzcGFyc2VfbWV0YWRhdGFfYm91bmQ7ICAgICAgICAgIC8vIFRyYWNrIGlmIHNwYXJzZSBtZXRhZGF0YSBhc3BlY3QgaXMgYm91bmQgdG8gdGhpcyBpbWFnZQorICAgIGJvb2wgaW1wb3J0ZWRfYWhiOyAgICAgICAgICAgICAgICAgICAvLyBUcnVlIGlmIGltYWdlIHdhcyBpbXBvcnRlZCBmcm9tIGFuIEFuZHJvaWQgSGFyZHdhcmUgQnVmZmVyCisgICAgYm9vbCBoYXNfYWhiX2Zvcm1hdDsgICAgICAgICAgICAgICAgIC8vIFRydWUgaWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCBhbiBleHRlcm5hbCBBbmRyb2lkIGZvcm1hdAorICAgIHVpbnQ2NF90IGFoYl9mb3JtYXQ7ICAgICAgICAgICAgICAgICAvLyBFeHRlcm5hbCBBbmRyb2lkIGZvcm1hdCwgaWYgcHJvdmlkZWQKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBmdWxsX3JhbmdlOyAgLy8gVGhlIG5vcm1hbGl6ZWQgSVNSIGZvciBhbGwgbGV2ZWxzLCBsYXllcnMgKHNsaWNlcyksIGFuZCBhc3BlY3RzCisgICAgVmtTd2FwY2hhaW5LSFIgY3JlYXRlX2Zyb21fc3dhcGNoYWluOworICAgIFZrU3dhcGNoYWluS0hSIGJpbmRfc3dhcGNoYWluOworICAgIHVpbnQzMl90IGJpbmRfc3dhcGNoYWluX2ltYWdlSW5kZXg7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICB1aW50NjRfdCBleHRlcm5hbF9mb3JtYXRfYW5kcm9pZDsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyAgICBzdGQ6OnZlY3RvcjxWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzPiBzcGFyc2VfcmVxdWlyZW1lbnRzOworICAgIElNQUdFX1NUQVRFKFZrSW1hZ2UgaW1nLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pOworICAgIElNQUdFX1NUQVRFKElNQUdFX1NUQVRFIGNvbnN0ICZyaF9vYmopID0gZGVsZXRlOworCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PFZrSW1hZ2U+IGFsaWFzaW5nX2ltYWdlczsKKyAgICBib29sIElzQ29tcGF0aWJsZUFsaWFzaW5nKElNQUdFX1NUQVRFICpvdGhlcl9pbWFnZV9zdGF0ZSk7CisKKyAgICBib29sIElzQ3JlYXRlSW5mb0VxdWFsKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZvdGhlcl9jcmVhdGVJbmZvKSBjb25zdDsKKyAgICBib29sIElzQ3JlYXRlSW5mb0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nQ29tcGF0aWJsZShjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAmb3RoZXJfY3JlYXRlSW5mbykgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBJc0ltYWdlVHlwZUVxdWFsKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZvdGhlcl9jcmVhdGVJbmZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmZvLmltYWdlVHlwZSA9PSBvdGhlcl9jcmVhdGVJbmZvLmltYWdlVHlwZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgSXNGb3JtYXRFcXVhbChjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAmb3RoZXJfY3JlYXRlSW5mbykgY29uc3QgeworICAgICAgICByZXR1cm4gY3JlYXRlSW5mby5mb3JtYXQgPT0gb3RoZXJfY3JlYXRlSW5mby5mb3JtYXQ7CisgICAgfQorICAgIGlubGluZSBib29sIElzTWlwTGV2ZWxzRXF1YWwoY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gJm90aGVyX2NyZWF0ZUluZm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUluZm8ubWlwTGV2ZWxzID09IG90aGVyX2NyZWF0ZUluZm8ubWlwTGV2ZWxzOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBJc1VzYWdlRXF1YWwoY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gJm90aGVyX2NyZWF0ZUluZm8pIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZUluZm8udXNhZ2UgPT0gb3RoZXJfY3JlYXRlSW5mby51c2FnZTsgfQorICAgIGlubGluZSBib29sIElzU2FtcGxlc0VxdWFsKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZvdGhlcl9jcmVhdGVJbmZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmZvLnNhbXBsZXMgPT0gb3RoZXJfY3JlYXRlSW5mby5zYW1wbGVzOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBJc1RpbGluZ0VxdWFsKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZvdGhlcl9jcmVhdGVJbmZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmZvLnRpbGluZyA9PSBvdGhlcl9jcmVhdGVJbmZvLnRpbGluZzsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgSXNBcnJheUxheWVyc0VxdWFsKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZvdGhlcl9jcmVhdGVJbmZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmZvLmFycmF5TGF5ZXJzID09IG90aGVyX2NyZWF0ZUluZm8uYXJyYXlMYXllcnM7CisgICAgfQorICAgIGlubGluZSBib29sIElzSW5pdGlhbExheW91dEVxdWFsKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZvdGhlcl9jcmVhdGVJbmZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmZvLmluaXRpYWxMYXlvdXQgPT0gb3RoZXJfY3JlYXRlSW5mby5pbml0aWFsTGF5b3V0OworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBJc1NoYXJpbmdNb2RlRXF1YWwoY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gJm90aGVyX2NyZWF0ZUluZm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUluZm8uc2hhcmluZ01vZGUgPT0gb3RoZXJfY3JlYXRlSW5mby5zaGFyaW5nTW9kZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgSXNFeHRlbnRFcXVhbChjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAmb3RoZXJfY3JlYXRlSW5mbykgY29uc3QgeworICAgICAgICByZXR1cm4gKGNyZWF0ZUluZm8uZXh0ZW50LndpZHRoID09IG90aGVyX2NyZWF0ZUluZm8uZXh0ZW50LndpZHRoKSAmJgorICAgICAgICAgICAgICAgKGNyZWF0ZUluZm8uZXh0ZW50LmhlaWdodCA9PSBvdGhlcl9jcmVhdGVJbmZvLmV4dGVudC5oZWlnaHQpICYmCisgICAgICAgICAgICAgICAoY3JlYXRlSW5mby5leHRlbnQuZGVwdGggPT0gb3RoZXJfY3JlYXRlSW5mby5leHRlbnQuZGVwdGgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBJc1F1ZXVlRmFtaWx5SW5kaWNlc0VxdWFsKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZvdGhlcl9jcmVhdGVJbmZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoY3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPT0gb3RoZXJfY3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQpICYmCisgICAgICAgICAgICAgICAoY3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1lbWNtcChjcmVhdGVJbmZvLnBRdWV1ZUZhbWlseUluZGljZXMsIG90aGVyX2NyZWF0ZUluZm8ucFF1ZXVlRmFtaWx5SW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgKiBzaXplb2YoY3JlYXRlSW5mby5wUXVldWVGYW1pbHlJbmRpY2VzWzBdKSkgPT0gMCk7CisgICAgfQorCisgICAgfklNQUdFX1NUQVRFKCkgeworICAgICAgICBpZiAoKGNyZWF0ZUluZm8uc2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQpICYmIChjcmVhdGVJbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA+IDApKSB7CisgICAgICAgICAgICBkZWxldGVbXSBjcmVhdGVJbmZvLnBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgICAgICAgICBjcmVhdGVJbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSBudWxscHRyOworICAgICAgICB9CisgICAgfTsKK307CisKK2NsYXNzIElNQUdFX1ZJRVdfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgcHVibGljOgorICAgIFZrSW1hZ2VWaWV3IGltYWdlX3ZpZXc7CisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvOworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIG5vcm1hbGl6ZWRfc3VicmVzb3VyY2VfcmFuZ2U7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXM7CisgICAgdW5zaWduZWQgZGVzY3JpcHRvcl9mb3JtYXRfYml0czsKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gc2FtcGxlckNvbnZlcnNpb247ICAvLyBIYW5kbGUgb2YgdGhlIHljYmNyIHNhbXBsZXIgY29udmVyc2lvbiB0aGUgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCwgaWYgYW55CisgICAgc3RkOjpzaGFyZWRfcHRyPElNQUdFX1NUQVRFPiBpbWFnZV9zdGF0ZTsKKyAgICBJTUFHRV9WSUVXX1NUQVRFKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTUFHRV9TVEFURT4gJmltYWdlX3N0YXRlLCBWa0ltYWdlVmlldyBpdiwgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvICpjaSk7CisgICAgSU1BR0VfVklFV19TVEFURShjb25zdCBJTUFHRV9WSUVXX1NUQVRFICZyaF9vYmopID0gZGVsZXRlOworfTsKKworY2xhc3MgQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9TVEFURSA6IHB1YmxpYyBCSU5EQUJMRSB7CisgIHB1YmxpYzoKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmU7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBjcmVhdGVfaW5mbzsKKyAgICBib29sIG1lbW9yeV9yZXF1aXJlbWVudHNfY2hlY2tlZCA9IGZhbHNlOworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiBtZW1vcnlfcmVxdWlyZW1lbnRzOworICAgIGJvb2wgYnVpbGRfc2NyYXRjaF9tZW1vcnlfcmVxdWlyZW1lbnRzX2NoZWNrZWQgPSBmYWxzZTsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIgYnVpbGRfc2NyYXRjaF9tZW1vcnlfcmVxdWlyZW1lbnRzOworICAgIGJvb2wgdXBkYXRlX3NjcmF0Y2hfbWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2VkID0gZmFsc2U7CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSIHVwZGF0ZV9zY3JhdGNoX21lbW9yeV9yZXF1aXJlbWVudHM7CisgICAgYm9vbCBidWlsdCA9IGZhbHNlOworICAgIHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgYnVpbGRfaW5mbzsKKyAgICB1aW50NjRfdCBvcGFxdWVfaGFuZGxlID0gMDsKKyAgICBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFKFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYXMsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WICpjaSkKKyAgICAgICAgOiBhY2NlbGVyYXRpb25fc3RydWN0dXJlKGFzKSwKKyAgICAgICAgICBjcmVhdGVfaW5mbyhjaSksCisgICAgICAgICAgbWVtb3J5X3JlcXVpcmVtZW50c3t9LAorICAgICAgICAgIGJ1aWxkX3NjcmF0Y2hfbWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2Vke30sCisgICAgICAgICAgdXBkYXRlX3NjcmF0Y2hfbWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2Vke30ge30KKyAgICBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFKGNvbnN0IEFDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfU1RBVEUgJnJoX29iaikgPSBkZWxldGU7Cit9OworCitzdHJ1Y3QgTWVtUmFuZ2UgeworICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQgPSAwOworICAgIFZrRGV2aWNlU2l6ZSBzaXplID0gMDsKK307CisKKy8vIERhdGEgc3RydWN0IGZvciB0cmFja2luZyBtZW1vcnkgb2JqZWN0CitzdHJ1Y3QgREVWSUNFX01FTU9SWV9TVEFURSA6IHB1YmxpYyBCQVNFX05PREUgeworICAgIHZvaWQgKm9iamVjdDsgIC8vIERpc3BhdGNoYWJsZSBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBtZW1vcnkgKGRldmljZSBvZiBzd2FwY2hhaW4pCisgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgIHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbzsKKyAgICBib29sIGlzX2RlZGljYXRlZDsKKyAgICBWa0J1ZmZlciBkZWRpY2F0ZWRfYnVmZmVyOworICAgIFZrSW1hZ2UgZGVkaWNhdGVkX2ltYWdlOworICAgIGJvb2wgaXNfZXhwb3J0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgZXhwb3J0X2hhbmRsZV90eXBlX2ZsYWdzOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxWdWxrYW5UeXBlZEhhbmRsZT4gb2JqX2JpbmRpbmdzOyAgLy8gb2JqZWN0cyBib3VuZCB0byB0aGlzIG1lbW9yeQorICAgIC8vIENvbnZlbmllbmNlIHZlY3RvcnMgb2YgaGFuZGxlcyB0byBzcGVlZCB1cCBpdGVyYXRpbmcgb3ZlciBvYmplY3RzIGluZGVwZW5kZW50bHkKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8VmtJbWFnZT4gYm91bmRfaW1hZ2VzOworICAgIC8vIFRPRE86IENvbnZlcnQgdGhlIHR3byBzZXRzIHRvIHRoZSBjb3JyZWN0IHR5cGVzLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50NjRfdD4gYm91bmRfYnVmZmVyczsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDY0X3Q+IGJvdW5kX2FjY2VsZXJhdGlvbl9zdHJ1Y3R1cmVzOworCisgICAgTWVtUmFuZ2UgbWFwcGVkX3JhbmdlOworICAgIHZvaWQgKnNoYWRvd19jb3B5X2Jhc2U7ICAgIC8vIEJhc2Ugb2YgbGF5ZXIncyBhbGxvY2F0aW9uIGZvciBndWFyZCBiYW5kLCBkYXRhLCBhbmQgYWxpZ25tZW50IHNwYWNlCisgICAgdm9pZCAqc2hhZG93X2NvcHk7ICAgICAgICAgLy8gUG9pbnRlciB0byBzdGFydCBvZiBndWFyZC1iYW5kIGRhdGEgYmVmb3JlIG1hcHBlZCByZWdpb24KKyAgICB1aW50NjRfdCBzaGFkb3dfcGFkX3NpemU7ICAvLyBTaXplIG9mIHRoZSBndWFyZC1iYW5kIGRhdGEgYmVmb3JlIGFuZCBhZnRlciBhY3R1YWwgZGF0YS4gSXQgTVVTVCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgb2YgbGltaXRzLm1pbk1lbW9yeU1hcEFsaWdubWVudAorICAgIHZvaWQgKnBfZHJpdmVyX2RhdGE7ICAgICAgIC8vIFBvaW50ZXIgdG8gYXBwbGljYXRpb24ncyBhY3R1YWwgbWVtb3J5CisKKyAgICBERVZJQ0VfTUVNT1JZX1NUQVRFKHZvaWQgKmRpc3Bfb2JqZWN0LCBjb25zdCBWa0RldmljZU1lbW9yeSBpbl9tZW0sIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvICpwX2FsbG9jX2luZm8pCisgICAgICAgIDogb2JqZWN0KGRpc3Bfb2JqZWN0KSwKKyAgICAgICAgICBtZW0oaW5fbWVtKSwKKyAgICAgICAgICBhbGxvY19pbmZvKHBfYWxsb2NfaW5mbyksCisgICAgICAgICAgaXNfZGVkaWNhdGVkKGZhbHNlKSwKKyAgICAgICAgICBkZWRpY2F0ZWRfYnVmZmVyKFZLX05VTExfSEFORExFKSwKKyAgICAgICAgICBkZWRpY2F0ZWRfaW1hZ2UoVktfTlVMTF9IQU5ETEUpLAorICAgICAgICAgIGlzX2V4cG9ydChmYWxzZSksCisgICAgICAgICAgZXhwb3J0X2hhbmRsZV90eXBlX2ZsYWdzKDApLAorICAgICAgICAgIG1hcHBlZF9yYW5nZXt9LAorICAgICAgICAgIHNoYWRvd19jb3B5X2Jhc2UoMCksCisgICAgICAgICAgc2hhZG93X2NvcHkoMCksCisgICAgICAgICAgc2hhZG93X3BhZF9zaXplKDApLAorICAgICAgICAgIHBfZHJpdmVyX2RhdGEoMCl7fTsKK307CisKK3N0cnVjdCBTV0FQQ0hBSU5fSU1BR0UgeworICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PFZrSW1hZ2U+IGJvdW5kX2ltYWdlczsKK307CisKK2NsYXNzIFNXQVBDSEFJTl9OT0RFIDogcHVibGljIEJBU0VfTk9ERSB7CisgIHB1YmxpYzoKKyAgICBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbjsKKyAgICBzdGQ6OnZlY3RvcjxTV0FQQ0hBSU5fSU1BR0U+IGltYWdlczsKKyAgICBib29sIHJldGlyZWQgPSBmYWxzZTsKKyAgICBib29sIHNoYXJlZF9wcmVzZW50YWJsZSA9IGZhbHNlOworICAgIENBTExfU1RBVEUgdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFJTdGF0ZSA9IFVOQ0FMTEVEOworICAgIHVpbnQzMl90IGdldF9zd2FwY2hhaW5faW1hZ2VfY291bnQgPSAwOworICAgIFNXQVBDSEFJTl9OT0RFKGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbikKKyAgICAgICAgOiBjcmVhdGVJbmZvKHBDcmVhdGVJbmZvKSwgc3dhcGNoYWluKHN3YXBjaGFpbikge30KK307CisKK3N0cnVjdCBDb2xvckFzcGVjdFRyYWl0cyB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBc3BlY3RDb3VudCA9IDE7CisgICAgc3RhdGljIGludCBJbmRleChWa0ltYWdlQXNwZWN0RmxhZ3MgbWFzaykgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0aWMgVmtJbWFnZUFzcGVjdEZsYWdzIEFzcGVjdE1hc2soKSB7IHJldHVybiBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOyB9CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8VmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBrQXNwZWN0Q291bnQ+ICZBc3BlY3RCaXRzKCkgeworICAgICAgICBzdGF0aWMgc3RkOjphcnJheTxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIGtBc3BlY3RDb3VudD4ga0FzcGVjdEJpdHN7e1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVR9fTsKKyAgICAgICAgcmV0dXJuIGtBc3BlY3RCaXRzOworICAgIH0KK307CisKK3N0cnVjdCBEZXB0aEFzcGVjdFRyYWl0cyB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBc3BlY3RDb3VudCA9IDE7CisgICAgc3RhdGljIGludCBJbmRleChWa0ltYWdlQXNwZWN0RmxhZ3MgbWFzaykgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0aWMgVmtJbWFnZUFzcGVjdEZsYWdzIEFzcGVjdE1hc2soKSB7IHJldHVybiBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOyB9CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8VmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBrQXNwZWN0Q291bnQ+ICZBc3BlY3RCaXRzKCkgeworICAgICAgICBzdGF0aWMgc3RkOjphcnJheTxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIGtBc3BlY3RDb3VudD4ga0FzcGVjdEJpdHN7e1ZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVR9fTsKKyAgICAgICAgcmV0dXJuIGtBc3BlY3RCaXRzOworICAgIH0KK307CisKK3N0cnVjdCBTdGVuY2lsQXNwZWN0VHJhaXRzIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0FzcGVjdENvdW50ID0gMTsKKyAgICBzdGF0aWMgaW50IEluZGV4KFZrSW1hZ2VBc3BlY3RGbGFncyBtYXNrKSB7IHJldHVybiAwOyB9OworICAgIHN0YXRpYyBWa0ltYWdlQXNwZWN0RmxhZ3MgQXNwZWN0TWFzaygpIHsgcmV0dXJuIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsgfQorICAgIHN0YXRpYyBjb25zdCBzdGQ6OmFycmF5PFZrSW1hZ2VBc3BlY3RGbGFnQml0cywga0FzcGVjdENvdW50PiAmQXNwZWN0Qml0cygpIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6YXJyYXk8VmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBrQXNwZWN0Q291bnQ+IGtBc3BlY3RCaXRze3tWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVR9fTsKKyAgICAgICAgcmV0dXJuIGtBc3BlY3RCaXRzOworICAgIH0KK307CisKK3N0cnVjdCBEZXB0aFN0ZW5jaWxBc3BlY3RUcmFpdHMgeworICAgIC8vIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgPSAweDAwMDAwMDAyLCAgPj4gMSAtPiAxIC0xIC0+IDAKKyAgICAvLyBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgPSAweDAwMDAwMDA0LCA+PiAxIC0+IDIgLTEgPSAxCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBc3BlY3RDb3VudCA9IDI7CisgICAgc3RhdGljIHVpbnQzMl90IEluZGV4KFZrSW1hZ2VBc3BlY3RGbGFncyBtYXNrKSB7CisgICAgICAgIHVpbnQzMl90IGluZGV4ID0gKG1hc2sgPj4gMSkgLSAxOworICAgICAgICBhc3NlcnQoKGluZGV4ID09IDApIHx8IChpbmRleCA9PSAxKSk7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9OworICAgIHN0YXRpYyBWa0ltYWdlQXNwZWN0RmxhZ3MgQXNwZWN0TWFzaygpIHsgcmV0dXJuIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7IH0KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjphcnJheTxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIGtBc3BlY3RDb3VudD4gJkFzcGVjdEJpdHMoKSB7CisgICAgICAgIHN0YXRpYyBzdGQ6OmFycmF5PFZrSW1hZ2VBc3BlY3RGbGFnQml0cywga0FzcGVjdENvdW50PiBrQXNwZWN0Qml0c3sKKyAgICAgICAgICAgIHtWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklULCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVR9fTsKKyAgICAgICAgcmV0dXJuIGtBc3BlY3RCaXRzOworICAgIH0KK307CisKK3N0cnVjdCBNdWx0aXBsYW5lMkFzcGVjdFRyYWl0cyB7CisgICAgLy8gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUID0gMHgwMDAwMDAxMCwgPj4gNCAtIDEgLT4gMAorICAgIC8vIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCA9IDB4MDAwMDAwMjAsID4+IDQgLSAxIC0+IDEKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0FzcGVjdENvdW50ID0gMjsKKyAgICBzdGF0aWMgdWludDMyX3QgSW5kZXgoVmtJbWFnZUFzcGVjdEZsYWdzIG1hc2spIHsKKyAgICAgICAgdWludDMyX3QgaW5kZXggPSAobWFzayA+PiA0KSAtIDE7CisgICAgICAgIGFzc2VydCgoaW5kZXggPT0gMCkgfHwgKGluZGV4ID09IDEpKTsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH07CisgICAgc3RhdGljIFZrSW1hZ2VBc3BlY3RGbGFncyBBc3BlY3RNYXNrKCkgeyByZXR1cm4gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUIHwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUOyB9CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8VmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBrQXNwZWN0Q291bnQ+ICZBc3BlY3RCaXRzKCkgeworICAgICAgICBzdGF0aWMgc3RkOjphcnJheTxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIGtBc3BlY3RDb3VudD4ga0FzcGVjdEJpdHN7CisgICAgICAgICAgICB7VktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklULCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVR9fTsKKyAgICAgICAgcmV0dXJuIGtBc3BlY3RCaXRzOworICAgIH0KK307CisKK3N0cnVjdCBNdWx0aXBsYW5lM0FzcGVjdFRyYWl0cyB7CisgICAgLy8gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUID0gMHgwMDAwMDAxMCwgPj4gNCAtIDEgLT4gMAorICAgIC8vIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCA9IDB4MDAwMDAwMjAsID4+IDQgLSAxIC0+IDEKKyAgICAvLyBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQgPSAweDAwMDAwMDQwLCA+PiA0IC0gMSAtPiAzCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBc3BlY3RDb3VudCA9IDM7CisgICAgc3RhdGljIHVpbnQzMl90IEluZGV4KFZrSW1hZ2VBc3BlY3RGbGFncyBtYXNrKSB7CisgICAgICAgIHVpbnQzMl90IGluZGV4ID0gKG1hc2sgPj4gNCkgLSAxOworICAgICAgICBpbmRleCA9IGluZGV4ID4gMiA/IDIgOiBpbmRleDsKKyAgICAgICAgYXNzZXJ0KChpbmRleCA9PSAwKSB8fCAoaW5kZXggPT0gMSkgfHwgKGluZGV4ID09IDIpKTsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH07CisgICAgc3RhdGljIFZrSW1hZ2VBc3BlY3RGbGFncyBBc3BlY3RNYXNrKCkgeworICAgICAgICByZXR1cm4gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUIHwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUIHwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUOworICAgIH0KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjphcnJheTxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIGtBc3BlY3RDb3VudD4gJkFzcGVjdEJpdHMoKSB7CisgICAgICAgIHN0YXRpYyBzdGQ6OmFycmF5PFZrSW1hZ2VBc3BlY3RGbGFnQml0cywga0FzcGVjdENvdW50PiBrQXNwZWN0Qml0c3sKKyAgICAgICAgICAgIHtWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUfX07CisgICAgICAgIHJldHVybiBrQXNwZWN0Qml0czsKKyAgICB9Cit9OworCitzdGQ6OnN0cmluZyBGb3JtYXREZWJ1Z0xhYmVsKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgTG9nZ2luZ0xhYmVsICZsYWJlbCk7CisKK2NvbnN0IHN0YXRpYyBWa0ltYWdlTGF5b3V0IGtJbnZhbGlkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX01BWF9FTlVNOworLy8gSW50ZXJmYWNlIGNsYXNzLgorY2xhc3MgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcCB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UgJiwgVmtJbWFnZUxheW91dCwgVmtJbWFnZUxheW91dCk+IENhbGxiYWNrOworICAgIHN0cnVjdCBJbml0aWFsTGF5b3V0U3RhdGUgeworICAgICAgICBWa0ltYWdlVmlldyBpbWFnZV92aWV3OyAgICAgICAgICAvLyBGb3IgcmVsYXhlZCBtYXRjaGluZyBydWxlIGV2YWx1YXRpb24sIGVsc2UgVktfTlVMTF9IQU5ETEUKKyAgICAgICAgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdF9tYXNrOyAgLy8gRm9yIHJlbGF4ZWQgbWF0Y2hpbmcgcnVsZXMuLi4gZWxzZSAwCisgICAgICAgIExvZ2dpbmdMYWJlbCBsYWJlbDsKKyAgICAgICAgSW5pdGlhbExheW91dFN0YXRlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgJmNiX3N0YXRlXywgY29uc3QgSU1BR0VfVklFV19TVEFURSAqdmlld19zdGF0ZSk7CisgICAgICAgIEluaXRpYWxMYXlvdXRTdGF0ZSgpIDogaW1hZ2VfdmlldyhWS19OVUxMX0hBTkRMRSksIGFzcGVjdF9tYXNrKDApLCBsYWJlbCgpIHt9CisgICAgfTsKKworICAgIHN0cnVjdCBTdWJyZXNvdXJjZUxheW91dCB7CisgICAgICAgIFZrSW1hZ2VTdWJyZXNvdXJjZSBzdWJyZXNvdXJjZTsKKyAgICAgICAgVmtJbWFnZUxheW91dCBsYXlvdXQ7CisgICAgfTsKKworICAgIHN0cnVjdCBTdWJyZXNvdXJjZVJhbmdlTGF5b3V0IHsKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2U7CisgICAgICAgIFZrSW1hZ2VMYXlvdXQgbGF5b3V0OworICAgIH07CisKKyAgICBjbGFzcyBDb25zdEl0ZXJhdG9ySW50ZXJmYWNlIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgLy8gTWFrZSB0aGUgdmFsdWUgYWNjZXNzb3Igbm9uIHZpcnR1YWwKKyAgICAgICAgY29uc3QgU3VicmVzb3VyY2VMYXlvdXQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgICAgICAgIHZpcnR1YWwgQ29uc3RJdGVyYXRvckludGVyZmFjZSAmb3BlcmF0b3IrKygpID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIEF0RW5kKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIH5Db25zdEl0ZXJhdG9ySW50ZXJmYWNlKCl7fTsKKworICAgICAgcHJvdGVjdGVkOgorICAgICAgICBTdWJyZXNvdXJjZUxheW91dCB2YWx1ZV87CisgICAgfTsKKworICAgIGNsYXNzIENvbnN0SXRlcmF0b3IgeworICAgICAgcHVibGljOgorICAgICAgICBDb25zdEl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgICAgICAgKysoKml0Xyk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgU3VicmVzb3VyY2VMYXlvdXQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICooKml0Xyk7IH0KKyAgICAgICAgQ29uc3RJdGVyYXRvcihDb25zdEl0ZXJhdG9ySW50ZXJmYWNlICppdCkgOiBpdF8oaXQpe307CisgICAgICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7IHJldHVybiBpdF8tPkF0RW5kKCk7IH0KKworICAgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uc3RJdGVyYXRvckludGVyZmFjZT4gaXRfOworICAgIH07CisKKyAgICB2aXJ0dWFsIENvbnN0SXRlcmF0b3IgQmVnaW5Jbml0aWFsVXNlKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgQ29uc3RJdGVyYXRvciBCZWdpblNldExheW91dCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBTZXRTdWJyZXNvdXJjZVJhbmdlTGF5b3V0KGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgJmNiX3N0YXRlLCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBsYXlvdXQsIFZrSW1hZ2VMYXlvdXQgZXhwZWN0ZWRfbGF5b3V0ID0ga0ludmFsaWRMYXlvdXQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgU2V0U3VicmVzb3VyY2VSYW5nZUluaXRpYWxMYXlvdXQoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAmY2Jfc3RhdGUsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBsYXlvdXQsIGNvbnN0IElNQUdFX1ZJRVdfU1RBVEUgKnZpZXdfc3RhdGUgPSBudWxscHRyKSA9IDA7CisgICAgdmlydHVhbCBib29sIEZvclJhbmdlKGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZyYW5nZSwgY29uc3QgQ2FsbGJhY2sgJmNhbGxiYWNrLCBib29sIHNraXBfaW52YWxpZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWx3YXlzX2dldF9pbml0aWFsID0gZmFsc2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIFZrSW1hZ2VMYXlvdXQgR2V0U3VicmVzb3VyY2VMYXlvdXQoY29uc3QgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlc291cmNlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBWa0ltYWdlTGF5b3V0IEdldFN1YnJlc291cmNlSW5pdGlhbExheW91dChjb25zdCBWa0ltYWdlU3VicmVzb3VyY2Ugc3VicmVzb3VyY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGNvbnN0IEluaXRpYWxMYXlvdXRTdGF0ZSAqR2V0U3VicmVzb3VyY2VJbml0aWFsTGF5b3V0U3RhdGUoY29uc3QgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlc291cmNlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIFVwZGF0ZUZyb20oY29uc3QgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcCAmZnJvbSkgPSAwOworICAgIHZpcnR1YWwgdWludHB0cl90IENvbXBhdGliaWxpdHlLZXkoKSBjb25zdCA9IDA7CisgICAgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcCgpIHt9CisgICAgdmlydHVhbCB+SW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcCgpIHt9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXNwZWN0VHJhaXRzXywgc2l6ZV90IGtTcGFyc2VUaHJlc2hvbGQgPSA2NFU+CitjbGFzcyBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwSW1wbCA6IHB1YmxpYyBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcCBCYXNlOworICAgIHR5cGVkZWYgQXNwZWN0VHJhaXRzXyBBc3BlY3RUcmFpdHM7CisgICAgdHlwZWRlZiBCYXNlOjpTdWJyZXNvdXJjZUxheW91dCBTdWJyZXNvdXJjZUxheW91dDsKKyAgICB0eXBlZGVmIHNwYXJzZV9jb250YWluZXI6OlNwYXJzZVZlY3RvcjxzaXplX3QsIFZrSW1hZ2VMYXlvdXQsIHRydWUsIGtJbnZhbGlkTGF5b3V0LCBrU3BhcnNlVGhyZXNob2xkPiBMYXlvdXRNYXA7CisgICAgdHlwZWRlZiBzcGFyc2VfY29udGFpbmVyOjpTcGFyc2VWZWN0b3I8c2l6ZV90LCBWa0ltYWdlTGF5b3V0LCBmYWxzZSwga0ludmFsaWRMYXlvdXQsIGtTcGFyc2VUaHJlc2hvbGQ+IEluaXRpYWxMYXlvdXRNYXA7CisKKyAgICBzdHJ1Y3QgTGF5b3V0cyB7CisgICAgICAgIExheW91dE1hcCBjdXJyZW50OworICAgICAgICBJbml0aWFsTGF5b3V0TWFwIGluaXRpYWw7CisgICAgICAgIExheW91dHMoc2l6ZV90IHNpemUpIDogY3VycmVudCgwLCBzaXplKSwgaW5pdGlhbCgwLCBzaXplKSB7fQorICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICAgIGNsYXNzIENvbnN0SXRlcmF0b3JJbXBsIDogcHVibGljIEJhc2U6OkNvbnN0SXRlcmF0b3JJbnRlcmZhY2UgeworICAgICAgcHVibGljOgorICAgICAgICBDb25zdEl0ZXJhdG9ySW1wbCAmb3BlcmF0b3IrKygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICsraXRfOworICAgICAgICAgICAgVXBkYXRlVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICAvLyBKdXN0IGdvb2QgZW5vdWdoIGZvciBjZW5kIGNoZWNrcworICAgICAgICBDb25zdEl0ZXJhdG9ySW1wbChjb25zdCBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwSW1wbCAmbWFwLCBjb25zdCBDb250YWluZXIgJmNvbnRhaW5lcikKKyAgICAgICAgICAgIDogbWFwXygmbWFwKSwgY29udGFpbmVyXygmY29udGFpbmVyKSwgdGhlX2VuZF8oZmFsc2UpIHsKKyAgICAgICAgICAgIGl0XyA9IGNvbnRhaW5lcl8tPmNiZWdpbigpOworICAgICAgICAgICAgVXBkYXRlVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICB+Q29uc3RJdGVyYXRvckltcGwoKSBvdmVycmlkZSB7fQorICAgICAgICB2aXJ0dWFsIGJvb2wgQXRFbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0aGVfZW5kXzsgfQorCisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgVXBkYXRlVmFsdWUoKSB7CisgICAgICAgICAgICBpZiAoaXRfICE9IGNvbnRhaW5lcl8tPmNlbmQoKSkgeworICAgICAgICAgICAgICAgIHZhbHVlXy5zdWJyZXNvdXJjZSA9IG1hcF8tPkRlY29kZSgoKml0XykuZmlyc3QpOworICAgICAgICAgICAgICAgIHZhbHVlXy5sYXlvdXQgPSAoKml0Xykuc2Vjb25kOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGVfZW5kXyA9IHRydWU7CisgICAgICAgICAgICAgICAgdmFsdWVfLmxheW91dCA9IGtJbnZhbGlkTGF5b3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIENvbnRhaW5lckl0ZXJhdG9yOworICAgICAgICBjb25zdCBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwSW1wbCAqbWFwXzsKKyAgICAgICAgY29uc3QgQ29udGFpbmVyICpjb250YWluZXJfOworICAgICAgICBib29sIHRoZV9lbmRfOworICAgICAgICBDb250YWluZXJJdGVyYXRvciBpdF87CisgICAgfTsKKworICAgIEJhc2U6OkNvbnN0SXRlcmF0b3IgQmVnaW5Jbml0aWFsVXNlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQmFzZTo6Q29uc3RJdGVyYXRvcihuZXcgQ29uc3RJdGVyYXRvckltcGw8SW5pdGlhbExheW91dE1hcD4oKnRoaXMsIGxheW91dHNfLmluaXRpYWwpKTsKKyAgICB9CisKKyAgICBCYXNlOjpDb25zdEl0ZXJhdG9yIEJlZ2luU2V0TGF5b3V0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQmFzZTo6Q29uc3RJdGVyYXRvcihuZXcgQ29uc3RJdGVyYXRvckltcGw8TGF5b3V0TWFwPigqdGhpcywgbGF5b3V0c18uY3VycmVudCkpOworICAgIH0KKworICAgIGJvb2wgU2V0U3VicmVzb3VyY2VSYW5nZUxheW91dChjb25zdCBDTURfQlVGRkVSX1NUQVRFICZjYl9zdGF0ZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnJhbmdlLCBWa0ltYWdlTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBleHBlY3RlZF9sYXlvdXQgPSBrSW52YWxpZExheW91dCkgb3ZlcnJpZGUgeworICAgICAgICBib29sIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGV4cGVjdGVkX2xheW91dCA9PSBrSW52YWxpZExheW91dCkgeworICAgICAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIGxheW91dCB0byB0aGUgc2V0IGxheW91dCBhcyB3ZSBoYWQgbm8gb3RoZXIgbGF5b3V0IHRvIHJlZmVyZW5jZQorICAgICAgICAgICAgZXhwZWN0ZWRfbGF5b3V0ID0gbGF5b3V0OworICAgICAgICB9CisgICAgICAgIGlmICghSW5SYW5nZShyYW5nZSkpIHJldHVybiBmYWxzZTsgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIHRyYWNrIGJvZ3VzIHN1YnJlb3VyY2VzCisKKyAgICAgICAgSW5pdGlhbExheW91dFN0YXRlICppbml0aWFsX3N0YXRlID0gbnVsbHB0cjsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZW5kX21pcCA9IHJhbmdlLmJhc2VNaXBMZXZlbCArIHJhbmdlLmxldmVsQ291bnQ7CisgICAgICAgIGNvbnN0IGF1dG8gJmFzcGVjdHMgPSBBc3BlY3RUcmFpdHM6OkFzcGVjdEJpdHMoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBhc3BlY3RfaW5kZXggPSAwOyBhc3BlY3RfaW5kZXggPCBBc3BlY3RUcmFpdHM6OmtBc3BlY3RDb3VudDsgYXNwZWN0X2luZGV4KyspIHsKKyAgICAgICAgICAgIGlmICgwID09IChyYW5nZS5hc3BlY3RNYXNrICYgYXNwZWN0c1thc3BlY3RfaW5kZXhdKSkgY29udGludWU7CisgICAgICAgICAgICBzaXplX3QgYXJyYXlfb2Zmc2V0ID0gRW5jb2RlKGFzcGVjdF9pbmRleCwgcmFuZ2UuYmFzZU1pcExldmVsKTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgbWlwX2xldmVsID0gcmFuZ2UuYmFzZU1pcExldmVsOyBtaXBfbGV2ZWwgPCBlbmRfbWlwOyArK21pcF9sZXZlbCwgYXJyYXlfb2Zmc2V0ICs9IG1pcF9zaXplXykgeworICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydCA9IGFycmF5X29mZnNldCArIHJhbmdlLmJhc2VBcnJheUxheWVyOworICAgICAgICAgICAgICAgIHNpemVfdCBlbmQgPSBzdGFydCArIHJhbmdlLmxheWVyQ291bnQ7CisgICAgICAgICAgICAgICAgYm9vbCB1cGRhdGVkX2xldmVsID0gbGF5b3V0c18uY3VycmVudC5TZXRSYW5nZShzdGFydCwgZW5kLCBsYXlvdXQpOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkX2xldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byB0cnkgc2V0dGluZyB0aGUgaW5pdGlhbCBsYXlvdXQsIGlmIHdlIGNoYW5nZWQgYW55IG9mIHRoZSBsYXlvdXQgdmFsdWVzIGFib3ZlCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0c18uaW5pdGlhbC5TZXRSYW5nZShzdGFydCwgZW5kLCBleHBlY3RlZF9sYXlvdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gdHJ5IHNldHRpbmcgdGhlIGluaXRpYWwgbGF5b3V0ICpzdGF0ZSogaWYgdGhlIGluaXRpYWwgbGF5b3V0IHdhcyB1cGRhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3N0YXRlID0gVXBkYXRlSW5pdGlhbExheW91dFN0YXRlKHN0YXJ0LCBlbmQsIGluaXRpYWxfc3RhdGUsIGNiX3N0YXRlLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodXBkYXRlZCkgdmVyc2lvbl8rKzsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7CisgICAgfQorCisgICAgYm9vbCBTZXRTdWJyZXNvdXJjZVJhbmdlSW5pdGlhbExheW91dChjb25zdCBDTURfQlVGRkVSX1NUQVRFICZjYl9zdGF0ZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBsYXlvdXQsIGNvbnN0IElNQUdFX1ZJRVdfU1RBVEUgKnZpZXdfc3RhdGUgPSBudWxscHRyKSBvdmVycmlkZSB7CisgICAgICAgIGJvb2wgdXBkYXRlZCA9IGZhbHNlOworICAgICAgICBpZiAoIUluUmFuZ2UocmFuZ2UpKSByZXR1cm4gZmFsc2U7ICAvLyBEb24ndCBldmVuIHRyeSB0byB0cmFjayBib2d1cyBzdWJyZW91cmNlcworCisgICAgICAgIEluaXRpYWxMYXlvdXRTdGF0ZSAqaW5pdGlhbF9zdGF0ZSA9IG51bGxwdHI7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGVuZF9taXAgPSByYW5nZS5iYXNlTWlwTGV2ZWwgKyByYW5nZS5sZXZlbENvdW50OworICAgICAgICBjb25zdCBhdXRvICZhc3BlY3RzID0gQXNwZWN0VHJhaXRzOjpBc3BlY3RCaXRzKCk7CisgICAgICAgIGZvciAodWludDMyX3QgYXNwZWN0X2luZGV4ID0gMDsgYXNwZWN0X2luZGV4IDwgQXNwZWN0VHJhaXRzOjprQXNwZWN0Q291bnQ7IGFzcGVjdF9pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoMCA9PSAocmFuZ2UuYXNwZWN0TWFzayAmIGFzcGVjdHNbYXNwZWN0X2luZGV4XSkpIGNvbnRpbnVlOworICAgICAgICAgICAgc2l6ZV90IGFycmF5X29mZnNldCA9IEVuY29kZShhc3BlY3RfaW5kZXgsIHJhbmdlLmJhc2VNaXBMZXZlbCk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IG1pcF9sZXZlbCA9IHJhbmdlLmJhc2VNaXBMZXZlbDsgbWlwX2xldmVsIDwgZW5kX21pcDsgKyttaXBfbGV2ZWwsIGFycmF5X29mZnNldCArPSBtaXBfc2l6ZV8pIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnQgPSBhcnJheV9vZmZzZXQgKyByYW5nZS5iYXNlQXJyYXlMYXllcjsKKyAgICAgICAgICAgICAgICBzaXplX3QgZW5kID0gc3RhcnQgKyByYW5nZS5sYXllckNvdW50OworICAgICAgICAgICAgICAgIGJvb2wgdXBkYXRlZF9sZXZlbCA9IGxheW91dHNfLmluaXRpYWwuU2V0UmFuZ2Uoc3RhcnQsIGVuZCwgbGF5b3V0KTsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlZF9sZXZlbCkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHRyeSBzZXR0aW5nIHRoZSBpbml0aWFsIGxheW91dCAqc3RhdGUqIGlmIHRoZSBpbml0aWFsIGxheW91dCB3YXMgdXBkYXRlZAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3N0YXRlID0gVXBkYXRlSW5pdGlhbExheW91dFN0YXRlKHN0YXJ0LCBlbmQsIGluaXRpYWxfc3RhdGUsIGNiX3N0YXRlLCB2aWV3X3N0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVwZGF0ZWQpIHZlcnNpb25fKys7CisgICAgICAgIHJldHVybiB1cGRhdGVkOworICAgIH0KKworICAgIC8vIExvb3Agb3ZlciB0aGUgZ2l2ZW4gcmFuZ2UgY2FsbGluZyB0aGUgY2FsbGJhY2ssIHByaW1hcmlseSBmb3IKKyAgICAvLyB2YWxpZGF0aW9uIGNoZWNrcy4gIEJ5IGRlZmF1bHQgdGhlIGluaXRpYWxfdmFsdWUgaXMgb25seSBsb29rZWQKKyAgICAvLyB1cCBpZiB0aGUgc2V0IHZhbHVlIGlzbid0IGZvdW5kLgorICAgIGJvb2wgRm9yUmFuZ2UoY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnJhbmdlLCBjb25zdCBDYWxsYmFjayAmY2FsbGJhY2ssIGJvb2wgc2tpcF9pbnZhbGlkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYWx3YXlzX2dldF9pbml0aWFsID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKCFJblJhbmdlKHJhbmdlKSkgcmV0dXJuIGZhbHNlOyAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gcHJvY2VzcyBib2d1cyBzdWJyZW91cmNlcworCisgICAgICAgIFZrSW1hZ2VTdWJyZXNvdXJjZSBzdWJyZXM7CisgICAgICAgIGF1dG8gJmxldmVsID0gc3VicmVzLm1pcExldmVsOworICAgICAgICBhdXRvICZsYXllciA9IHN1YnJlcy5hcnJheUxheWVyOworICAgICAgICBhdXRvICZhc3BlY3QgPSBzdWJyZXMuYXNwZWN0TWFzazsKKyAgICAgICAgY29uc3QgYXV0byAmYXNwZWN0cyA9IEFzcGVjdFRyYWl0czo6QXNwZWN0Qml0cygpOworICAgICAgICBib29sIGtlZXBfb24gPSB0cnVlOworICAgICAgICBjb25zdCB1aW50MzJfdCBlbmRfbWlwID0gcmFuZ2UuYmFzZU1pcExldmVsICsgcmFuZ2UubGV2ZWxDb3VudDsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZW5kX2xheWVyID0gcmFuZ2UuYmFzZUFycmF5TGF5ZXIgKyByYW5nZS5sYXllckNvdW50OworICAgICAgICBmb3IgKHVpbnQzMl90IGFzcGVjdF9pbmRleCA9IDA7IGFzcGVjdF9pbmRleCA8IEFzcGVjdFRyYWl0czo6a0FzcGVjdENvdW50OyBhc3BlY3RfaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKDAgPT0gKHJhbmdlLmFzcGVjdE1hc2sgJiBhc3BlY3RzW2FzcGVjdF9pbmRleF0pKSBjb250aW51ZTsKKyAgICAgICAgICAgIGFzcGVjdCA9IGFzcGVjdHNbYXNwZWN0X2luZGV4XTsgIC8vIG5vdGluZyB0aGF0IHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgbG9vcCBpbmRpY2VzIGFyZSByZWZlcmVuY2VzCisgICAgICAgICAgICBzaXplX3QgYXJyYXlfb2Zmc2V0ID0gRW5jb2RlKGFzcGVjdF9pbmRleCwgcmFuZ2UuYmFzZU1pcExldmVsKTsKKyAgICAgICAgICAgIGZvciAobGV2ZWwgPSByYW5nZS5iYXNlTWlwTGV2ZWw7IGxldmVsIDwgZW5kX21pcDsgKytsZXZlbCwgYXJyYXlfb2Zmc2V0ICs9IG1pcF9zaXplXykgeworICAgICAgICAgICAgICAgIGZvciAobGF5ZXIgPSByYW5nZS5iYXNlQXJyYXlMYXllcjsgbGF5ZXIgPCBlbmRfbGF5ZXI7IGxheWVyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtLSB3b3VsZCBhbiBpbnRlcmF0b3Igd2l0aCByYW5nZSBjaGVjayBiZSBmYXN0ZXI/CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IGFycmF5X29mZnNldCArIGxheWVyOworICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGxheW91dCA9IGxheW91dHNfLmN1cnJlbnQuR2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBpbml0aWFsX2xheW91dCA9IGtJbnZhbGlkTGF5b3V0OworICAgICAgICAgICAgICAgICAgICBpZiAoYWx3YXlzX2dldF9pbml0aWFsIHx8IChsYXlvdXQgPT0ga0ludmFsaWRMYXlvdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2xheW91dCA9IGxheW91dHNfLmluaXRpYWwuR2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcF9pbnZhbGlkIHx8IChsYXlvdXQgIT0ga0ludmFsaWRMYXlvdXQpIHx8IChpbml0aWFsX2xheW91dCAhPSBrSW52YWxpZExheW91dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBfb24gPSBjYWxsYmFjayhzdWJyZXMsIGxheW91dCwgaW5pdGlhbF9sYXlvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZWVwX29uKSByZXR1cm4ga2VlcF9vbjsgIC8vIEZhbHNlIHZhbHVlIGZyb20gdGhlIGNhbGxiYWNrIGFib3J0cyB0aGUgcmFuZ2UgdHJhdmVyc2FsCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGtlZXBfb247CisgICAgfQorICAgIFZrSW1hZ2VMYXlvdXQgR2V0U3VicmVzb3VyY2VJbml0aWFsTGF5b3V0KGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSBzdWJyZXNvdXJjZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpZiAoIUluUmFuZ2Uoc3VicmVzb3VyY2UpKSByZXR1cm4ga0ludmFsaWRMYXlvdXQ7CisgICAgICAgIHVpbnQzMl90IGFzcGVjdF9pbmRleCA9IEFzcGVjdFRyYWl0czo6SW5kZXgoc3VicmVzb3VyY2UuYXNwZWN0TWFzayk7CisgICAgICAgIHNpemVfdCBpbmRleCA9IEVuY29kZShhc3BlY3RfaW5kZXgsIHN1YnJlc291cmNlLm1pcExldmVsLCBzdWJyZXNvdXJjZS5hcnJheUxheWVyKTsKKyAgICAgICAgcmV0dXJuIGxheW91dHNfLmluaXRpYWwuR2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBjb25zdCBJbml0aWFsTGF5b3V0U3RhdGUgKkdldFN1YnJlc291cmNlSW5pdGlhbExheW91dFN0YXRlKGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSBzdWJyZXNvdXJjZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpZiAoIUluUmFuZ2Uoc3VicmVzb3VyY2UpKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgdWludDMyX3QgYXNwZWN0X2luZGV4ID0gQXNwZWN0VHJhaXRzOjpJbmRleChzdWJyZXNvdXJjZS5hc3BlY3RNYXNrKTsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gRW5jb2RlKGFzcGVjdF9pbmRleCwgc3VicmVzb3VyY2UubWlwTGV2ZWwsIHN1YnJlc291cmNlLmFycmF5TGF5ZXIpOworICAgICAgICByZXR1cm4gaW5pdGlhbF9sYXlvdXRfc3RhdGVfbWFwXy5HZXQoaW5kZXgpOworICAgIH0KKworICAgIFZrSW1hZ2VMYXlvdXQgR2V0U3VicmVzb3VyY2VMYXlvdXQoY29uc3QgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlc291cmNlKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGlmICghSW5SYW5nZShzdWJyZXNvdXJjZSkpIHJldHVybiBrSW52YWxpZExheW91dDsKKyAgICAgICAgdWludDMyX3QgYXNwZWN0X2luZGV4ID0gQXNwZWN0VHJhaXRzOjpJbmRleChzdWJyZXNvdXJjZS5hc3BlY3RNYXNrKTsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gRW5jb2RlKGFzcGVjdF9pbmRleCwgc3VicmVzb3VyY2UubWlwTGV2ZWwsIHN1YnJlc291cmNlLmFycmF5TGF5ZXIpOworICAgICAgICByZXR1cm4gbGF5b3V0c18uY3VycmVudC5HZXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHBhcmFub2lhIGNoZWNrIGlzIHN1ZmZpY2llbnQgYW5kIG5vdCB0b28gbXVjaC4KKyAgICB1aW50cHRyX3QgQ29tcGF0aWJpbGl0eUtleSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnRwdHJfdD4oJmltYWdlX3N0YXRlXykgXiBBc3BlY3RUcmFpdHM6OkFzcGVjdE1hc2soKSBeIGtTcGFyc2VUaHJlc2hvbGQpOworICAgIH0KKworICAgIGJvb2wgVXBkYXRlRnJvbShjb25zdCBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwICZvdGhlcikgb3ZlcnJpZGUgeworICAgICAgICAvLyBNdXN0IGJlIGZyb20gbWF0Y2hpbmcgaW1hZ2VzIGZvciB0aGUgcmVpbnRlcnByZXQgY2FzdCB0byBiZSB2YWxpZAorICAgICAgICBhc3NlcnQoQ29tcGF0aWJpbGl0eUtleSgpID09IG90aGVyLkNvbXBhdGliaWxpdHlLZXkoKSk7CisgICAgICAgIGlmIChDb21wYXRpYmlsaXR5S2V5KCkgIT0gb3RoZXIuQ29tcGF0aWJpbGl0eUtleSgpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY29uc3QgYXV0byAmZnJvbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcEltcGwgJj4ob3RoZXIpOworICAgICAgICBib29sIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgdXBkYXRlZCB8PSBsYXlvdXRzXy5pbml0aWFsLk1lcmdlKGZyb20ubGF5b3V0c18uaW5pdGlhbCk7CisgICAgICAgIHVwZGF0ZWQgfD0gbGF5b3V0c18uY3VycmVudC5NZXJnZShmcm9tLmxheW91dHNfLmN1cnJlbnQpOworICAgICAgICBpbml0aWFsX2xheW91dF9zdGF0ZV9tYXBfLk1lcmdlKGZyb20uaW5pdGlhbF9sYXlvdXRfc3RhdGVfbWFwXyk7CisKKyAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7CisgICAgfQorCisgICAgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcEltcGwoKSA6IEJhc2UoKSB7fQorICAgIEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXBJbXBsKGNvbnN0IElNQUdFX1NUQVRFICZpbWFnZV9zdGF0ZSkKKyAgICAgICAgOiBCYXNlKCksCisgICAgICAgICAgaW1hZ2Vfc3RhdGVfKGltYWdlX3N0YXRlKSwKKyAgICAgICAgICBtaXBfc2l6ZV8oaW1hZ2Vfc3RhdGUuZnVsbF9yYW5nZS5sYXllckNvdW50KSwKKyAgICAgICAgICBhc3BlY3Rfc2l6ZV8obWlwX3NpemVfICogaW1hZ2Vfc3RhdGUuZnVsbF9yYW5nZS5sZXZlbENvdW50KSwKKyAgICAgICAgICB2ZXJzaW9uXygwKSwKKyAgICAgICAgICBsYXlvdXRzXyhhc3BlY3Rfc2l6ZV8gKiBBc3BlY3RUcmFpdHM6OmtBc3BlY3RDb3VudCksCisgICAgICAgICAgaW5pdGlhbF9sYXlvdXRfc3RhdGVzXygpLAorICAgICAgICAgIGluaXRpYWxfbGF5b3V0X3N0YXRlX21hcF8oMCwgYXNwZWN0X3NpemVfICogQXNwZWN0VHJhaXRzOjprQXNwZWN0Q291bnQpIHsKKyAgICAgICAgLy8gU2V0dXAgdGhlIHJvdyA8LT4gYXNwZWN0L21pcF9sZXZlbCBiYXNlIEVuY29kZS9EZWNvZGUgTFVULi4uCisgICAgICAgIGFzcGVjdF9vZmZzZXRzX1swXSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgYXNwZWN0X29mZnNldHNfLnNpemUoKTsgKytpKSB7ICAvLyBTaXplIGlzIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50CisgICAgICAgICAgICBhc3BlY3Rfb2Zmc2V0c19baV0gPSBhc3BlY3Rfb2Zmc2V0c19baSAtIDFdICsgYXNwZWN0X3NpemVfOworICAgICAgICB9CisgICAgfQorICAgIH5JbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwSW1wbCgpIG92ZXJyaWRlIHt9CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFRoaXMgbG9va3MgYSBiaXQgcG9uZGVyb3VzIGJ1dCBrQXNwZWN0Q291bnQgaXMgYSBjb21waWxlIHRpbWUgY29uc3RhbnQKKyAgICBWa0ltYWdlU3VicmVzb3VyY2UgRGVjb2RlKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgICAgICBWa0ltYWdlU3VicmVzb3VyY2Ugc3VicmVzOworICAgICAgICAvLyBmaW5kIGFzcGVjdCBpbmRleAorICAgICAgICB1aW50MzJfdCBhc3BlY3RfaW5kZXggPSAwOworICAgICAgICBpZiAoQXNwZWN0VHJhaXRzOjprQXNwZWN0Q291bnQgPT0gMikgeworICAgICAgICAgICAgaWYgKGluZGV4ID49IGFzcGVjdF9vZmZzZXRzX1sxXSkgeworICAgICAgICAgICAgICAgIGFzcGVjdF9pbmRleCA9IDE7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCAtIGFzcGVjdF9vZmZzZXRzX1thc3BlY3RfaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEFzcGVjdFRyYWl0czo6a0FzcGVjdENvdW50ID09IDMpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSBhc3BlY3Rfb2Zmc2V0c19bMl0pIHsKKyAgICAgICAgICAgICAgICBhc3BlY3RfaW5kZXggPSAyOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA+PSBhc3BlY3Rfb2Zmc2V0c19bMV0pIHsKKyAgICAgICAgICAgICAgICBhc3BlY3RfaW5kZXggPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBpbmRleCAtIGFzcGVjdF9vZmZzZXRzX1thc3BlY3RfaW5kZXhdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KEFzcGVjdFRyYWl0czo6a0FzcGVjdENvdW50ID09IDEpOyAgLy8gT25seSBhc3BlY3QgY291bnRzIG9mIDEsIDIsIGFuZCAzIHN1cHBvcnRlZAorICAgICAgICB9CisKKyAgICAgICAgc3VicmVzLmFzcGVjdE1hc2sgPSBBc3BlY3RUcmFpdHM6OkFzcGVjdEJpdHMoKVthc3BlY3RfaW5kZXhdOworICAgICAgICBzdWJyZXMubWlwTGV2ZWwgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4IC8gbWlwX3NpemVfKTsgIC8vIE9uZSBob3BlcyB0aGUgY29tcGlsZXIgd2l0aCBvcHRpbWl6ZSB0aGlzIHBhaXIgb2YgZGl2aXNpb25zLi4uCisgICAgICAgIHN1YnJlcy5hcnJheUxheWVyID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4ICUgbWlwX3NpemVfKTsKKworICAgICAgICByZXR1cm4gc3VicmVzOworICAgIH0KKworICAgIHVpbnQzMl90IExldmVsTGltaXQodWludDMyX3QgbGV2ZWwpIGNvbnN0IHsgcmV0dXJuIChzdGQ6Om1pbikoaW1hZ2Vfc3RhdGVfLmZ1bGxfcmFuZ2UubGV2ZWxDb3VudCwgbGV2ZWwpOyB9CisgICAgdWludDMyX3QgTGF5ZXJMaW1pdCh1aW50MzJfdCBsYXllcikgY29uc3QgeyByZXR1cm4gKHN0ZDo6bWluKShpbWFnZV9zdGF0ZV8uZnVsbF9yYW5nZS5sYXllckNvdW50LCBsYXllcik7IH0KKworICAgIGJvb2wgSW5SYW5nZShjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UgJnN1YnJlcykgY29uc3QgeworICAgICAgICBib29sIGluX3JhbmdlID0gKHN1YnJlcy5taXBMZXZlbCA8IGltYWdlX3N0YXRlXy5mdWxsX3JhbmdlLmxldmVsQ291bnQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc3VicmVzLmFycmF5TGF5ZXIgPCBpbWFnZV9zdGF0ZV8uZnVsbF9yYW5nZS5sYXllckNvdW50KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnJlcy5hc3BlY3RNYXNrICYgQXNwZWN0VHJhaXRzOjpBc3BlY3RNYXNrKCkpOworICAgICAgICByZXR1cm4gaW5fcmFuZ2U7CisgICAgfQorCisgICAgYm9vbCBJblJhbmdlKGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZyYW5nZSkgY29uc3QgeworICAgICAgICBib29sIGluX3JhbmdlID0gKHJhbmdlLmJhc2VNaXBMZXZlbCA8IGltYWdlX3N0YXRlXy5mdWxsX3JhbmdlLmxldmVsQ291bnQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKHJhbmdlLmJhc2VNaXBMZXZlbCArIHJhbmdlLmxldmVsQ291bnQpIDw9IGltYWdlX3N0YXRlXy5mdWxsX3JhbmdlLmxldmVsQ291bnQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2UuYmFzZUFycmF5TGF5ZXIgPCBpbWFnZV9zdGF0ZV8uZnVsbF9yYW5nZS5sYXllckNvdW50KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChyYW5nZS5iYXNlQXJyYXlMYXllciArIHJhbmdlLmxheWVyQ291bnQpIDw9IGltYWdlX3N0YXRlXy5mdWxsX3JhbmdlLmxheWVyQ291bnQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2UuYXNwZWN0TWFzayAmIEFzcGVjdFRyYWl0czo6QXNwZWN0TWFzaygpKTsKKyAgICAgICAgcmV0dXJuIGluX3JhbmdlOworICAgIH0KKworICAgIGlubGluZSBzaXplX3QgRW5jb2RlKHVpbnQzMl90IGFzcGVjdF9pbmRleCkgY29uc3QgeworICAgICAgICByZXR1cm4gKEFzcGVjdFRyYWl0czo6a0FzcGVjdENvdW50ID09IDEpID8gMCA6IGFzcGVjdF9vZmZzZXRzX1thc3BlY3RfaW5kZXhdOworICAgIH0KKyAgICBpbmxpbmUgc2l6ZV90IEVuY29kZSh1aW50MzJfdCBhc3BlY3RfaW5kZXgsIHVpbnQzMl90IG1pcF9sZXZlbCkgY29uc3QgeyByZXR1cm4gRW5jb2RlKGFzcGVjdF9pbmRleCkgKyBtaXBfbGV2ZWwgKiBtaXBfc2l6ZV87IH0KKyAgICBpbmxpbmUgc2l6ZV90IEVuY29kZSh1aW50MzJfdCBhc3BlY3RfaW5kZXgsIHVpbnQzMl90IG1pcF9sZXZlbCwgdWludDMyX3QgYXJyYXlfbGF5ZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEVuY29kZShhc3BlY3RfaW5kZXgsIG1pcF9sZXZlbCkgKyBhcnJheV9sYXllcjsKKyAgICB9CisKKyAgICBJbml0aWFsTGF5b3V0U3RhdGUgKlVwZGF0ZUluaXRpYWxMYXlvdXRTdGF0ZShzaXplX3Qgc3RhcnQsIHNpemVfdCBlbmQsIEluaXRpYWxMYXlvdXRTdGF0ZSAqaW5pdGlhbF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICZjYl9zdGF0ZSwgY29uc3QgSU1BR0VfVklFV19TVEFURSAqdmlld19zdGF0ZSkgeworICAgICAgICBpZiAoIWluaXRpYWxfc3RhdGUpIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIG9uIGRlbWFuZC4uLiAgaW5pdGlhbF9sYXlvdXRfc3RhdGVzXyBob2xkcyBvd25lcnNoaXAgYXMgYSB1bmlxdWVfcHRyLCB3aGlsZQorICAgICAgICAgICAgLy8gZWFjaCBzdWJyZXNvdXJjZSBoYXMgYSBub24tb3duaW5nIGNvcHkgb2YgdGhlIHBsYWluIHBvaW50ZXIuCisgICAgICAgICAgICBpbml0aWFsX3N0YXRlID0gbmV3IEluaXRpYWxMYXlvdXRTdGF0ZShjYl9zdGF0ZSwgdmlld19zdGF0ZSk7CisgICAgICAgICAgICBpbml0aWFsX2xheW91dF9zdGF0ZXNfLmVtcGxhY2VfYmFjayhpbml0aWFsX3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoaW5pdGlhbF9zdGF0ZSk7CisgICAgICAgIGluaXRpYWxfbGF5b3V0X3N0YXRlX21hcF8uU2V0UmFuZ2Uoc3RhcnQsIGVuZCwgaW5pdGlhbF9zdGF0ZSk7CisgICAgICAgIHJldHVybiBpbml0aWFsX3N0YXRlOworICAgIH0KKworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEluaXRpYWxMYXlvdXRTdGF0ZT4+IEluaXRpYWxMYXlvdXRTdGF0ZXM7CisgICAgLy8gVGhpcyBtYXAgKmFsc28qIG5lZWRzICJ3cml0ZSBvbmNlIiBzZW1hbnRpY3MKKyAgICB0eXBlZGVmIHNwYXJzZV9jb250YWluZXI6OlNwYXJzZVZlY3RvcjxzaXplX3QsIEluaXRpYWxMYXlvdXRTdGF0ZSAqLCBmYWxzZSwgbnVsbHB0ciwga1NwYXJzZVRocmVzaG9sZD4gSW5pdGlhbExheW91dFN0YXRlTWFwOworCisgICAgY29uc3QgSU1BR0VfU1RBVEUgJmltYWdlX3N0YXRlXzsKKyAgICBjb25zdCBzaXplX3QgbWlwX3NpemVfOworICAgIGNvbnN0IHNpemVfdCBhc3BlY3Rfc2l6ZV87CisgICAgdWludDY0X3QgdmVyc2lvbl8gPSAwOworICAgIExheW91dHMgbGF5b3V0c187CisgICAgSW5pdGlhbExheW91dFN0YXRlcyBpbml0aWFsX2xheW91dF9zdGF0ZXNfOworICAgIEluaXRpYWxMYXlvdXRTdGF0ZU1hcCBpbml0aWFsX2xheW91dF9zdGF0ZV9tYXBfOworICAgIHN0ZDo6YXJyYXk8c2l6ZV90LCBBc3BlY3RUcmFpdHM6OmtBc3BlY3RDb3VudD4gYXNwZWN0X29mZnNldHNfOworfTsKKworc3RhdGljIFZrSW1hZ2VMYXlvdXQgTm9ybWFsaXplSW1hZ2VMYXlvdXQoVmtJbWFnZUxheW91dCBsYXlvdXQsIFZrSW1hZ2VMYXlvdXQgbm9uX25vcm1hbCwgVmtJbWFnZUxheW91dCBub3JtYWwpIHsKKyAgICByZXR1cm4gKGxheW91dCA9PSBub25fbm9ybWFsKSA/IG5vcm1hbCA6IGxheW91dDsKK30KKworc3RhdGljIFZrSW1hZ2VMYXlvdXQgTm9ybWFsaXplRGVwdGhJbWFnZUxheW91dChWa0ltYWdlTGF5b3V0IGxheW91dCkgeworICAgIHJldHVybiBOb3JtYWxpemVJbWFnZUxheW91dChsYXlvdXQsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMKTsKK30KKworc3RhdGljIFZrSW1hZ2VMYXlvdXQgTm9ybWFsaXplU3RlbmNpbEltYWdlTGF5b3V0KFZrSW1hZ2VMYXlvdXQgbGF5b3V0KSB7CisgICAgcmV0dXJuIE5vcm1hbGl6ZUltYWdlTGF5b3V0KGxheW91dCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwpOworfQorCitzdGF0aWMgYm9vbCBJbWFnZUxheW91dE1hdGNoZXMoY29uc3QgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdF9tYXNrLCBWa0ltYWdlTGF5b3V0IGEsIFZrSW1hZ2VMYXlvdXQgYikgeworICAgIGJvb2wgbWF0Y2hlcyA9IChhID09IGIpOworICAgIGlmICghbWF0Y2hlcykgeworICAgICAgICAvLyBSZWxheGVkIHJ1bGVzIHdoZW4gcmVmZXJlbmNpbmcgKm9ubHkqIHRoZSBkZXB0aCBvciBzdGVuY2lsIGFzcGVjdHMKKyAgICAgICAgaWYgKGFzcGVjdF9tYXNrID09IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpIHsKKyAgICAgICAgICAgIG1hdGNoZXMgPSBOb3JtYWxpemVEZXB0aEltYWdlTGF5b3V0KGEpID09IE5vcm1hbGl6ZURlcHRoSW1hZ2VMYXlvdXQoYik7CisgICAgICAgIH0gZWxzZSBpZiAoYXNwZWN0X21hc2sgPT0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSB7CisgICAgICAgICAgICBtYXRjaGVzID0gTm9ybWFsaXplU3RlbmNpbEltYWdlTGF5b3V0KGEpID09IE5vcm1hbGl6ZVN0ZW5jaWxJbWFnZUxheW91dChiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF0Y2hlczsKK30KKworLy8gVXRpbGl0eSB0eXBlIGZvciBGb3JSYW5nZSBjYWxsYmFja3MKK3N0cnVjdCBMYXlvdXRVc2VDaGVja0FuZE1lc3NhZ2UgeworICAgIGNvbnN0IHN0YXRpYyBWa0ltYWdlQXNwZWN0RmxhZ3Mga0RlcHRoT3JTdGVuY2lsID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKyAgICBjb25zdCBJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwICpsYXlvdXRfbWFwOworICAgIGNvbnN0IFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RfbWFzazsKKyAgICBjb25zdCBjaGFyICptZXNzYWdlOworICAgIFZrSW1hZ2VMYXlvdXQgbGF5b3V0OworCisgICAgTGF5b3V0VXNlQ2hlY2tBbmRNZXNzYWdlKCkgPSBkZWxldGU7CisgICAgTGF5b3V0VXNlQ2hlY2tBbmRNZXNzYWdlKGNvbnN0IEltYWdlU3VicmVzb3VyY2VMYXlvdXRNYXAgKmxheW91dF9tYXBfLCBjb25zdCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0X21hc2tfID0gMCkKKyAgICAgICAgOiBsYXlvdXRfbWFwKGxheW91dF9tYXBfKSwgYXNwZWN0X21hc2t7YXNwZWN0X21hc2tffSwgbWVzc2FnZShudWxscHRyKSwgbGF5b3V0KGtJbnZhbGlkTGF5b3V0KSB7fQorICAgIGJvb2wgQ2hlY2soY29uc3QgVmtJbWFnZVN1YnJlc291cmNlICZzdWJyZXMsIFZrSW1hZ2VMYXlvdXQgY2hlY2ssIFZrSW1hZ2VMYXlvdXQgY3VycmVudF9sYXlvdXQsIFZrSW1hZ2VMYXlvdXQgaW5pdGlhbF9sYXlvdXQpIHsKKyAgICAgICAgbWVzc2FnZSA9IG51bGxwdHI7CisgICAgICAgIGxheW91dCA9IGtJbnZhbGlkTGF5b3V0OyAgLy8gU3VjY2VzcyBzdGF0dXMKKyAgICAgICAgaWYgKGN1cnJlbnRfbGF5b3V0ICE9IGtJbnZhbGlkTGF5b3V0ICYmICFJbWFnZUxheW91dE1hdGNoZXMoYXNwZWN0X21hc2ssIGNoZWNrLCBjdXJyZW50X2xheW91dCkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAicHJldmlvdXMga25vd24iOworICAgICAgICAgICAgbGF5b3V0ID0gY3VycmVudF9sYXlvdXQ7CisgICAgICAgIH0gZWxzZSBpZiAoKGluaXRpYWxfbGF5b3V0ICE9IGtJbnZhbGlkTGF5b3V0KSAmJiAhSW1hZ2VMYXlvdXRNYXRjaGVzKGFzcGVjdF9tYXNrLCBjaGVjaywgaW5pdGlhbF9sYXlvdXQpKSB7CisgICAgICAgICAgICAvLyBUbyBjaGVjayB0aGUgcmVsYXhlZCBydWxlIG1hdGNoaW5nIHdlIG5lZWQgdG8gc2VlIGhvdyB0aGUgaW5pdGlhbCB1c2Ugd2FzIHVzZWQKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gaW5pdGlhbF9sYXlvdXRfc3RhdGUgPSBsYXlvdXRfbWFwLT5HZXRTdWJyZXNvdXJjZUluaXRpYWxMYXlvdXRTdGF0ZShzdWJyZXMpOworICAgICAgICAgICAgYXNzZXJ0KGluaXRpYWxfbGF5b3V0X3N0YXRlKTsgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBsYXlvdXQsIHdlIGJldHRlciBoYXZlIGEgc3RhdGUgZm9yIGl0CisgICAgICAgICAgICBpZiAoISgoaW5pdGlhbF9sYXlvdXRfc3RhdGUtPmFzcGVjdF9tYXNrICYga0RlcHRoT3JTdGVuY2lsKSAmJgorICAgICAgICAgICAgICAgICAgSW1hZ2VMYXlvdXRNYXRjaGVzKGluaXRpYWxfbGF5b3V0X3N0YXRlLT5hc3BlY3RfbWFzaywgY2hlY2ssIGluaXRpYWxfbGF5b3V0KSkpIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gInByZXZpb3VzbHkgdXNlZCI7CisgICAgICAgICAgICAgICAgbGF5b3V0ID0gaW5pdGlhbF9sYXlvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxheW91dCA9PSBrSW52YWxpZExheW91dDsKKyAgICB9Cit9OworCisvLyBTdG9yZSB0aGUgREFHLgorc3RydWN0IERBR05vZGUgeworICAgIHVpbnQzMl90IHBhc3M7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHByZXY7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG5leHQ7Cit9OworCitzdHJ1Y3QgUkVOREVSX1BBU1NfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIGNyZWF0ZUluZm87CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dWludDMyX3Q+PiBzZWxmX2RlcGVuZGVuY2llczsKKyAgICBzdGQ6OnZlY3RvcjxEQUdOb2RlPiBzdWJwYXNzVG9Ob2RlOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgYm9vbD4gYXR0YWNobWVudF9maXJzdF9yZWFkOworCisgICAgUkVOREVSX1BBU1NfU1RBVEUoVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgY29uc3QgKnBDcmVhdGVJbmZvKSA6IGNyZWF0ZUluZm8ocENyZWF0ZUluZm8pIHt9CisgICAgUkVOREVSX1BBU1NfU1RBVEUoVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBjb25zdCAqcENyZWF0ZUluZm8pIHsKKyAgICAgICAgQ29udmVydFZrUmVuZGVyUGFzc0NyZWF0ZUluZm9Ub1YyS0hSKCpwQ3JlYXRlSW5mbywgJmNyZWF0ZUluZm8pOworICAgIH0KK307CisKKy8vIEF1dG9nZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGUgdmtfdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlLmggY29kZWdlbgorZW51bSBDTURfVFlQRSB7IFZVSURfQ01EX0VOVU1fTElTVChDTURfKSB9OworCitlbnVtIENCX1NUQVRFIHsKKyAgICBDQl9ORVcsICAgICAgICAgICAgICAgICAvLyBOZXdseSBjcmVhdGVkIENCIHcvbyBhbnkgY21kcworICAgIENCX1JFQ09SRElORywgICAgICAgICAgIC8vIEJlZ2luQ0IgaGFzIGJlZW4gY2FsbGVkIG9uIHRoaXMgQ0IKKyAgICBDQl9SRUNPUkRFRCwgICAgICAgICAgICAvLyBFbmRDQiBoYXMgYmVlbiBjYWxsZWQgb24gdGhpcyBDQgorICAgIENCX0lOVkFMSURfQ09NUExFVEUsICAgIC8vIGhhZCBhIGNvbXBsZXRlIHJlY29yZGluZywgYnV0IHdhcyBzaW5jZSBpbnZhbGlkYXRlZAorICAgIENCX0lOVkFMSURfSU5DT01QTEVURSwgIC8vIGZvdWxlZCBiZWZvcmUgcmVjb3JkaW5nIHdhcyBjb21wbGV0ZWQKK307CisKKy8vIENCIFN0YXR1cyAtLSB1c2VkIHRvIHRyYWNrIHN0YXR1cyBvZiB2YXJpb3VzIGJpbmRpbmdzIG9uIGNtZCBidWZmZXIgb2JqZWN0cwordHlwZWRlZiBWa0ZsYWdzIENCU3RhdHVzRmxhZ3M7CitlbnVtIENCU3RhdHVzRmxhZ0JpdHMgeworICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICBDQlNUQVRVU19OT05FICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwgICAvLyBObyBzdGF0dXMgaXMgc2V0CisgICAgQ0JTVEFUVVNfTElORV9XSURUSF9TRVQgICAgICAgICA9IDB4MDAwMDAwMDEsICAgLy8gTGluZSB3aWR0aCBoYXMgYmVlbiBzZXQKKyAgICBDQlNUQVRVU19ERVBUSF9CSUFTX1NFVCAgICAgICAgID0gMHgwMDAwMDAwMiwgICAvLyBEZXB0aCBiaWFzIGhhcyBiZWVuIHNldAorICAgIENCU1RBVFVTX0JMRU5EX0NPTlNUQU5UU19TRVQgICAgPSAweDAwMDAwMDA0LCAgIC8vIEJsZW5kIGNvbnN0YW50cyBzdGF0ZSBoYXMgYmVlbiBzZXQKKyAgICBDQlNUQVRVU19ERVBUSF9CT1VORFNfU0VUICAgICAgID0gMHgwMDAwMDAwOCwgICAvLyBEZXB0aCBib3VuZHMgc3RhdGUgb2JqZWN0IGhhcyBiZWVuIHNldAorICAgIENCU1RBVFVTX1NURU5DSUxfUkVBRF9NQVNLX1NFVCAgPSAweDAwMDAwMDEwLCAgIC8vIFN0ZW5jaWwgcmVhZCBtYXNrIGhhcyBiZWVuIHNldAorICAgIENCU1RBVFVTX1NURU5DSUxfV1JJVEVfTUFTS19TRVQgPSAweDAwMDAwMDIwLCAgIC8vIFN0ZW5jaWwgd3JpdGUgbWFzayBoYXMgYmVlbiBzZXQKKyAgICBDQlNUQVRVU19TVEVOQ0lMX1JFRkVSRU5DRV9TRVQgID0gMHgwMDAwMDA0MCwgICAvLyBTdGVuY2lsIHJlZmVyZW5jZSBoYXMgYmVlbiBzZXQKKyAgICBDQlNUQVRVU19WSUVXUE9SVF9TRVQgICAgICAgICAgID0gMHgwMDAwMDA4MCwKKyAgICBDQlNUQVRVU19TQ0lTU09SX1NFVCAgICAgICAgICAgID0gMHgwMDAwMDEwMCwKKyAgICBDQlNUQVRVU19JTkRFWF9CVUZGRVJfQk9VTkQgICAgID0gMHgwMDAwMDIwMCwgICAvLyBJbmRleCBidWZmZXIgaGFzIGJlZW4gc2V0CisgICAgQ0JTVEFUVVNfRVhDTFVTSVZFX1NDSVNTT1JfU0VUICA9IDB4MDAwMDA0MDAsCisgICAgQ0JTVEFUVVNfU0hBRElOR19SQVRFX1BBTEVUVEVfU0VUID0gMHgwMDAwMDgwMCwKKyAgICBDQlNUQVRVU19MSU5FX1NUSVBQTEVfU0VUICAgICAgID0gMHgwMDAwMTAwMCwKKyAgICBDQlNUQVRVU19WSUVXUE9SVF9XX1NDQUxJTkdfU0VUID0gMHgwMDAwMjAwMCwKKyAgICBDQlNUQVRVU19BTExfU1RBVEVfU0VUICAgICAgICAgID0gMHgwMDAwM0RGRiwgICAvLyBBbGwgc3RhdGUgc2V0IChpbnRlbnRpb25hbGx5IGV4Y2x1ZGUgaW5kZXggYnVmZmVyKQorICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorfTsKKworc3RydWN0IFF1ZXJ5T2JqZWN0IHsKKyAgICBWa1F1ZXJ5UG9vbCBwb29sOworICAgIHVpbnQzMl90IHF1ZXJ5OworICAgIC8vIFRoZXNlIG5leHQgdHdvIGZpZWxkcyBhcmUgKm5vdCogdXNlZCBpbiBoYXNoIG9yIGNvbXBhcmlzb24sIHRoZXkgYXJlIGVmZmVjdGl2ZWx5IGEgZGF0YSBwYXlsb2FkCisgICAgdWludDMyX3QgaW5kZXg7ICAvLyBtdXN0IGJlIHplcm8gaWYgIWluZGV4ZWQKKyAgICBib29sIGluZGV4ZWQ7CisgICAgLy8gQ29tbWFuZCBpbmRleCBpbiB0aGUgY29tbWFuZCBidWZmZXIgd2hlcmUgdGhlIGVuZCBvZiB0aGUgcXVlcnkgd2FzCisgICAgLy8gcmVjb3JkZWQgKGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY29tbWFuZHMgaW4gdGhlIGNvbW1hbmQgYnVmZmVyIGJlZm9yZQorICAgIC8vIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5KS4KKyAgICB1aW50NjRfdCBlbmRDb21tYW5kSW5kZXg7CisKKyAgICBRdWVyeU9iamVjdChWa1F1ZXJ5UG9vbCBwb29sXywgdWludDMyX3QgcXVlcnlfKSA6IHBvb2wocG9vbF8pLCBxdWVyeShxdWVyeV8pLCBpbmRleCgwKSwgaW5kZXhlZChmYWxzZSksIGVuZENvbW1hbmRJbmRleCgwKSB7fQorICAgIFF1ZXJ5T2JqZWN0KFZrUXVlcnlQb29sIHBvb2xfLCB1aW50MzJfdCBxdWVyeV8sIHVpbnQzMl90IGluZGV4XykKKyAgICAgICAgOiBwb29sKHBvb2xfKSwgcXVlcnkocXVlcnlfKSwgaW5kZXgoaW5kZXhfKSwgaW5kZXhlZCh0cnVlKSwgZW5kQ29tbWFuZEluZGV4KDApIHt9CisgICAgUXVlcnlPYmplY3QoY29uc3QgUXVlcnlPYmplY3QgJm9iaikKKyAgICAgICAgOiBwb29sKG9iai5wb29sKSwgcXVlcnkob2JqLnF1ZXJ5KSwgaW5kZXgob2JqLmluZGV4KSwgaW5kZXhlZChvYmouaW5kZXhlZCksIGVuZENvbW1hbmRJbmRleChvYmouZW5kQ29tbWFuZEluZGV4KSB7fQorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFF1ZXJ5T2JqZWN0ICZyaHMpIGNvbnN0IHsgcmV0dXJuIChwb29sID09IHJocy5wb29sKSA/IHF1ZXJ5IDwgcmhzLnF1ZXJ5IDogcG9vbCA8IHJocy5wb29sOyB9Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFF1ZXJ5T2JqZWN0ICZxdWVyeTEsIGNvbnN0IFF1ZXJ5T2JqZWN0ICZxdWVyeTIpIHsKKyAgICByZXR1cm4gKChxdWVyeTEucG9vbCA9PSBxdWVyeTIucG9vbCkgJiYgKHF1ZXJ5MS5xdWVyeSA9PSBxdWVyeTIucXVlcnkpKTsKK30KKworc3RydWN0IFF1ZXJ5T2JqZWN0UGFzcyB7CisgICAgUXVlcnlPYmplY3Qgb2JqOworICAgIHVpbnQzMl90IHBlcmZfcGFzczsKKworICAgIFF1ZXJ5T2JqZWN0UGFzcyhjb25zdCBRdWVyeU9iamVjdCAmb2JqXywgdWludDMyX3QgcGVyZl9wYXNzXykgOiBvYmoob2JqXyksIHBlcmZfcGFzcyhwZXJmX3Bhc3NfKSB7fQorICAgIFF1ZXJ5T2JqZWN0UGFzcyhjb25zdCBRdWVyeU9iamVjdFBhc3MgJm9ial8pIDogb2JqKG9ial8ub2JqKSwgcGVyZl9wYXNzKG9ial8ucGVyZl9wYXNzKSB7fQorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFF1ZXJ5T2JqZWN0UGFzcyAmcmhzKSBjb25zdCB7IHJldHVybiAob2JqID09IHJocy5vYmopID8gcGVyZl9wYXNzIDwgcmhzLnBlcmZfcGFzcyA6IG9iaiA8IHJocy5vYmo7IH0KK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUXVlcnlPYmplY3RQYXNzICZxdWVyeTEsIGNvbnN0IFF1ZXJ5T2JqZWN0UGFzcyAmcXVlcnkyKSB7CisgICAgcmV0dXJuICgocXVlcnkxLm9iaiA9PSBxdWVyeTIub2JqKSAmJiAocXVlcnkxLnBlcmZfcGFzcyA9PSBxdWVyeTIucGVyZl9wYXNzKSk7Cit9CisKK2VudW0gUXVlcnlTdGF0ZSB7CisgICAgUVVFUllTVEFURV9VTktOT1dOLCAgICAvLyBJbml0aWFsIHN0YXRlLgorICAgIFFVRVJZU1RBVEVfUkVTRVQsICAgICAgLy8gQWZ0ZXIgcmVzZXR0aW5nLgorICAgIFFVRVJZU1RBVEVfUlVOTklORywgICAgLy8gUXVlcnkgcnVubmluZy4KKyAgICBRVUVSWVNUQVRFX0VOREVELCAgICAgIC8vIFF1ZXJ5IGVuZGVkIGJ1dCByZXN1bHRzIG1heSBub3QgYmUgYXZhaWxhYmxlLgorICAgIFFVRVJZU1RBVEVfQVZBSUxBQkxFLCAgLy8gUmVzdWx0cyBhdmFpbGFibGUuCit9OworCitlbnVtIFF1ZXJ5UmVzdWx0VHlwZSB7CisgICAgUVVFUllSRVNVTFRfVU5LTk9XTiwKKyAgICBRVUVSWVJFU1VMVF9OT19EQVRBLAorICAgIFFVRVJZUkVTVUxUX01BWUJFX05PX0RBVEEsCisgICAgUVVFUllSRVNVTFRfU09NRV9EQVRBLAorICAgIFFVRVJZUkVTVUxUX1dBSVRfT05fUkVTRVQsCisgICAgUVVFUllSRVNVTFRfV0FJVF9PTl9SVU5OSU5HLAorfTsKKworaW5saW5lIGNvbnN0IGNoYXIgKnN0cmluZ19RdWVyeVJlc3VsdFR5cGUoUXVlcnlSZXN1bHRUeXBlIHJlc3VsdF90eXBlKSB7CisgICAgc3dpdGNoIChyZXN1bHRfdHlwZSkgeworICAgICAgICBjYXNlIFFVRVJZUkVTVUxUX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4gInF1ZXJ5IG1heSBiZSBpbiBhbiB1bmtub3duIHN0YXRlIjsKKyAgICAgICAgY2FzZSBRVUVSWVJFU1VMVF9OT19EQVRBOgorICAgICAgICBjYXNlIFFVRVJZUkVTVUxUX01BWUJFX05PX0RBVEE6CisgICAgICAgICAgICByZXR1cm4gInF1ZXJ5IG1heSByZXR1cm4gbm8gZGF0YSI7CisgICAgICAgIGNhc2UgUVVFUllSRVNVTFRfU09NRV9EQVRBOgorICAgICAgICAgICAgcmV0dXJuICJxdWVyeSB3aWxsIHJldHVybiBzb21lIGRhdGEgb3IgYXZhaWxhYmlsaXR5IGJpdCI7CisgICAgICAgIGNhc2UgUVVFUllSRVNVTFRfV0FJVF9PTl9SRVNFVDoKKyAgICAgICAgICAgIHJldHVybiAid2FpdGluZyBvbiBhIHF1ZXJ5IHRoYXQgaGFzIGJlZW4gcmVzZXQgYW5kIG5vdCBpc3N1ZWQgeWV0IjsKKyAgICAgICAgY2FzZSBRVUVSWVJFU1VMVF9XQUlUX09OX1JVTk5JTkc6CisgICAgICAgICAgICByZXR1cm4gIndhaXRpbmcgb24gYSBxdWVyeSB0aGF0IGhhcyBub3QgZW5kZWQgeWV0IjsKKyAgICB9CisgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICByZXR1cm4gIlVOS05PV04gUVVFUlkgU1RBVEUiOyAgLy8gVW5yZWFjaGFibGUuCit9CisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4KK3N0cnVjdCBoYXNoPFF1ZXJ5T2JqZWN0PiB7CisgICAgc2l6ZV90IG9wZXJhdG9yKCkoUXVlcnlPYmplY3QgcXVlcnkpIGNvbnN0IHRocm93KCkgeworICAgICAgICByZXR1cm4gaGFzaDx1aW50NjRfdD4oKSgodWludDY0X3QpKHF1ZXJ5LnBvb2wpKSBeIGhhc2g8dWludDMyX3Q+KCkocXVlcnkucXVlcnkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxRdWVyeU9iamVjdFBhc3M+IHsKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShRdWVyeU9iamVjdFBhc3MgcXVlcnkpIGNvbnN0IHRocm93KCkgeworICAgICAgICByZXR1cm4gaGFzaDxRdWVyeU9iamVjdD4oKShxdWVyeS5vYmopIF4gaGFzaDx1aW50MzJfdD4oKShxdWVyeS5wZXJmX3Bhc3MpOworICAgIH0KK307Cit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKK3N0cnVjdCBDQlZlcnRleEJ1ZmZlckJpbmRpbmdJbmZvIHsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJCaW5kaW5nPiB2ZXJ0ZXhfYnVmZmVyX2JpbmRpbmdzOworfTsKKworc3RydWN0IEltYWdlU3VicmVzb3VyY2VQYWlyIHsKKyAgICBWa0ltYWdlIGltYWdlOworICAgIGJvb2wgaGFzU3VicmVzb3VyY2U7CisgICAgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlc291cmNlOworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbWFnZVN1YnJlc291cmNlUGFpciAmaW1nMSwgY29uc3QgSW1hZ2VTdWJyZXNvdXJjZVBhaXIgJmltZzIpIHsKKyAgICBpZiAoaW1nMS5pbWFnZSAhPSBpbWcyLmltYWdlIHx8IGltZzEuaGFzU3VicmVzb3VyY2UgIT0gaW1nMi5oYXNTdWJyZXNvdXJjZSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAhaW1nMS5oYXNTdWJyZXNvdXJjZSB8fAorICAgICAgICAgICAoaW1nMS5zdWJyZXNvdXJjZS5hc3BlY3RNYXNrID09IGltZzIuc3VicmVzb3VyY2UuYXNwZWN0TWFzayAmJiBpbWcxLnN1YnJlc291cmNlLm1pcExldmVsID09IGltZzIuc3VicmVzb3VyY2UubWlwTGV2ZWwgJiYKKyAgICAgICAgICAgIGltZzEuc3VicmVzb3VyY2UuYXJyYXlMYXllciA9PSBpbWcyLnN1YnJlc291cmNlLmFycmF5TGF5ZXIpOworfQorCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxJbWFnZVN1YnJlc291cmNlUGFpcj4geworICAgIHNpemVfdCBvcGVyYXRvcigpKEltYWdlU3VicmVzb3VyY2VQYWlyIGltZykgY29uc3QgdGhyb3coKSB7CisgICAgICAgIHNpemVfdCBoYXNoVmFsID0gaGFzaDx1aW50NjRfdD4oKShyZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGltZy5pbWFnZSkpOworICAgICAgICBoYXNoVmFsIF49IGhhc2g8Ym9vbD4oKShpbWcuaGFzU3VicmVzb3VyY2UpOworICAgICAgICBpZiAoaW1nLmhhc1N1YnJlc291cmNlKSB7CisgICAgICAgICAgICBoYXNoVmFsIF49IGhhc2g8dWludDMyX3Q+KCkocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCAmPihpbWcuc3VicmVzb3VyY2UuYXNwZWN0TWFzaykpOworICAgICAgICAgICAgaGFzaFZhbCBePSBoYXNoPHVpbnQzMl90PigpKGltZy5zdWJyZXNvdXJjZS5taXBMZXZlbCk7CisgICAgICAgICAgICBoYXNoVmFsIF49IGhhc2g8dWludDMyX3Q+KCkoaW1nLnN1YnJlc291cmNlLmFycmF5TGF5ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoVmFsOworICAgIH0KK307Cit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKy8vIENhbm9uaWNhbCBkaWN0aW9uYXJ5IGZvciBQdXNoQ29uc3RhbnRSYW5nZXMKK3VzaW5nIFB1c2hDb25zdGFudFJhbmdlc0RpY3QgPSBoYXNoX3V0aWw6OkRpY3Rpb25hcnk8UHVzaENvbnN0YW50UmFuZ2VzPjsKK3VzaW5nIFB1c2hDb25zdGFudFJhbmdlc0lkID0gUHVzaENvbnN0YW50UmFuZ2VzRGljdDo6SWQ7CisKKy8vIENhbm9uaWNhbCBkaWN0aW9uYXJ5IGZvciB0aGUgcGlwZWxpbmUgbGF5b3V0J3MgbGF5b3V0IG9mIGRlc2NyaXB0b3JzZXRsYXlvdXRzCit1c2luZyBEZXNjcmlwdG9yU2V0TGF5b3V0RGVmID0gY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0RGVmOwordXNpbmcgRGVzY3JpcHRvclNldExheW91dElkID0gc3RkOjpzaGFyZWRfcHRyPGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXREZWY+OwordXNpbmcgUGlwZWxpbmVMYXlvdXRTZXRMYXlvdXRzRGVmID0gc3RkOjp2ZWN0b3I8RGVzY3JpcHRvclNldExheW91dElkPjsKK3VzaW5nIFBpcGVsaW5lTGF5b3V0U2V0TGF5b3V0c0RpY3QgPQorICAgIGhhc2hfdXRpbDo6RGljdGlvbmFyeTxQaXBlbGluZUxheW91dFNldExheW91dHNEZWYsIGhhc2hfdXRpbDo6SXNPcmRlcmVkQ29udGFpbmVyPFBpcGVsaW5lTGF5b3V0U2V0TGF5b3V0c0RlZj4+OwordXNpbmcgUGlwZWxpbmVMYXlvdXRTZXRMYXlvdXRzSWQgPSBQaXBlbGluZUxheW91dFNldExheW91dHNEaWN0OjpJZDsKKworLy8gRGVmaW5lcy9zdG9yZXMgYSBjb21wYXRpYmlsaXR5IGRlZmludGlvbiBmb3Igc2V0IE4KKy8vIFRoZSAibGF5b3V0IGxheW91dCIgbXVzdCBzdG9yZSBhdCBsZWFzdCBzZXQrMSBlbnRyaWVzLCBidXQgb25seSB0aGUgZmlyc3Qgc2V0KzEgYXJlIGNvbnNpZGVyZWQgZm9yIGhhc2ggYW5kIGVxdWFsaXR5IHRlc3RpbmcKKy8vIE5vdGU6IHRoZSAiY2Fubm9uaWNhbCIgZGF0YSBhcmUgcmVmZXJlbmNlZCBieSBJZCwgbm90IGluY2x1ZGluZyBoYW5kbGUgb3IgZGV2aWNlIHNwZWNpZmljIHN0YXRlCisvLyBOb3RlOiBoYXNoIGFuZCBlcXVhbGl0eSBvbmx5IGNvbnNpZGVyIGxheW91dF9pZCBlbnRyaWVzIFswLCBzZXRdIGZvciBkZXRlcm1pbmluZyB1bmlxdWVuZXNzCitzdHJ1Y3QgUGlwZWxpbmVMYXlvdXRDb21wYXREZWYgeworICAgIHVpbnQzMl90IHNldDsKKyAgICBQdXNoQ29uc3RhbnRSYW5nZXNJZCBwdXNoX2NvbnN0YW50X3JhbmdlczsKKyAgICBQaXBlbGluZUxheW91dFNldExheW91dHNJZCBzZXRfbGF5b3V0c19pZDsKKyAgICBQaXBlbGluZUxheW91dENvbXBhdERlZihjb25zdCB1aW50MzJfdCBzZXRfaW5kZXgsIGNvbnN0IFB1c2hDb25zdGFudFJhbmdlc0lkIHBjcl9pZCwgY29uc3QgUGlwZWxpbmVMYXlvdXRTZXRMYXlvdXRzSWQgc2xfaWQpCisgICAgICAgIDogc2V0KHNldF9pbmRleCksIHB1c2hfY29uc3RhbnRfcmFuZ2VzKHBjcl9pZCksIHNldF9sYXlvdXRzX2lkKHNsX2lkKSB7fQorICAgIHNpemVfdCBoYXNoKCkgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBpcGVsaW5lTGF5b3V0Q29tcGF0RGVmICZvdGhlcikgY29uc3Q7Cit9OworCisvLyBDYW5vbmljYWwgZGljdGlvbmFyeSBmb3IgUGlwZWxpbmVMYXlvdXRDb21wYXQgcmVjb3JkcwordXNpbmcgUGlwZWxpbmVMYXlvdXRDb21wYXREaWN0ID0gaGFzaF91dGlsOjpEaWN0aW9uYXJ5PFBpcGVsaW5lTGF5b3V0Q29tcGF0RGVmLCBoYXNoX3V0aWw6Okhhc0hhc2hNZW1iZXI8UGlwZWxpbmVMYXlvdXRDb21wYXREZWY+PjsKK3VzaW5nIFBpcGVsaW5lTGF5b3V0Q29tcGF0SWQgPSBQaXBlbGluZUxheW91dENvbXBhdERpY3Q6OklkOworCisvLyBTdG9yZSBsYXlvdXRzIGFuZCBwdXNoY29uc3RhbnRzIGZvciBQaXBlbGluZUxheW91dAorc3RydWN0IFBJUEVMSU5FX0xBWU9VVF9TVEFURSA6IHB1YmxpYyBCQVNFX05PREUgeworICAgIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXQgY29uc3Q+PiBzZXRfbGF5b3V0czsKKyAgICBQdXNoQ29uc3RhbnRSYW5nZXNJZCBwdXNoX2NvbnN0YW50X3JhbmdlczsKKyAgICBzdGQ6OnZlY3RvcjxQaXBlbGluZUxheW91dENvbXBhdElkPiBjb21wYXRfZm9yX3NldDsKKworICAgIFBJUEVMSU5FX0xBWU9VVF9TVEFURSgpIDogbGF5b3V0KFZLX05VTExfSEFORExFKSwgc2V0X2xheW91dHN7fSwgcHVzaF9jb25zdGFudF9yYW5nZXN7fSwgY29tcGF0X2Zvcl9zZXR7fSB7fQorCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIHNldF9sYXlvdXRzLmNsZWFyKCk7CisgICAgICAgIHB1c2hfY29uc3RhbnRfcmFuZ2VzLnJlc2V0KCk7CisgICAgICAgIGNvbXBhdF9mb3Jfc2V0LmNsZWFyKCk7CisgICAgfQorfTsKKy8vIFNoYWRlciB0eXBlZGVmcyBuZWVkZWQgdG8gc3RvcmUgU3RhZ2VTdGFnZSBiZWxvdworc3RydWN0IGludGVyZmFjZV92YXIgeworICAgIHVpbnQzMl90IGlkOworICAgIHVpbnQzMl90IHR5cGVfaWQ7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIGJvb2wgaXNfcGF0Y2g7CisgICAgYm9vbCBpc19ibG9ja19tZW1iZXI7CisgICAgYm9vbCBpc19yZWxheGVkX3ByZWNpc2lvbjsKKyAgICAvLyBUT0RPOiBjb2xsZWN0IHRoZSBuYW1lLCB0b28/IElzbid0IHJlcXVpcmVkIHRvIGJlIHByZXNlbnQuCit9OwordHlwZWRlZiBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBkZXNjcmlwdG9yX3Nsb3RfdDsKKworY2xhc3MgUElQRUxJTkVfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgcHVibGljOgorICAgIHN0cnVjdCBTdGFnZVN0YXRlIHsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBhY2Nlc3NpYmxlX2lkczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGRlc2NyaXB0b3Jfc2xvdF90LCBpbnRlcmZhY2VfdmFyPj4gZGVzY3JpcHRvcl91c2VzOworICAgICAgICBib29sIGhhc193cml0YWJsZV9kZXNjcmlwdG9yOworICAgIH07CisKKyAgICBWa1BpcGVsaW5lIHBpcGVsaW5lOworICAgIHNhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBncmFwaGljc1BpcGVsaW5lQ0k7CisgICAgc2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gY29tcHV0ZVBpcGVsaW5lQ0k7CisgICAgc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViByYXl0cmFjaW5nUGlwZWxpbmVDSTsKKyAgICAvLyBIb2xkIHNoYXJlZCBwdHIgdG8gUlAgaW4gY2FzZSBSUCBpdHNlbGYgaXMgZGVzdHJveWVkCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFPiBycF9zdGF0ZTsKKyAgICAvLyBGbGFnIG9mIHdoaWNoIHNoYWRlciBzdGFnZXMgYXJlIGFjdGl2ZSBmb3IgdGhpcyBwaXBlbGluZQorICAgIHVpbnQzMl90IGFjdGl2ZV9zaGFkZXJzOworICAgIHVpbnQzMl90IGR1cGxpY2F0ZV9zaGFkZXJzOworICAgIC8vIENhcHR1cmUgd2hpY2ggc2xvdHMgKHNldCMtPmJpbmRpbmdzKSBhcmUgYWN0dWFsbHkgdXNlZCBieSB0aGUgc2hhZGVycyBvZiB0aGlzIHBpcGVsaW5lCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBCaW5kaW5nUmVxTWFwPiBhY3RpdmVfc2xvdHM7CisgICAgdWludDMyX3QgbWF4X2FjdGl2ZV9zbG90OyAgLy8gdGhlIGhpZ2hlc3Qgc2V0IG51bWJlciBpbiBhY3RpdmVfc2xvdHMgZm9yIHBpcGVsaW5lIGxheW91dCBjb21wYXRpYmlsaXR5IGNoZWNrcworICAgIC8vIEFkZGl0aW9uYWwgbWV0YWRhdGEgbmVlZGVkIGJ5IHBpcGVsaW5lX3N0YXRlIGluaXRpYWxpemF0aW9uIGFuZCB2YWxpZGF0aW9uCisgICAgc3RkOjp2ZWN0b3I8U3RhZ2VTdGF0ZT4gc3RhZ2Vfc3RhdGU7CisgICAgLy8gVnR4IGlucHV0IGluZm8gKGlmIGFueSkKKyAgICBzdGQ6OnZlY3RvcjxWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uPiB2ZXJ0ZXhfYmluZGluZ19kZXNjcmlwdGlvbnNfOworICAgIHN0ZDo6dmVjdG9yPFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbj4gdmVydGV4X2F0dHJpYnV0ZV9kZXNjcmlwdGlvbnNfOworICAgIHN0ZDo6dmVjdG9yPFZrRGV2aWNlU2l6ZT4gdmVydGV4X2F0dHJpYnV0ZV9hbGlnbm1lbnRzXzsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIHVpbnQzMl90PiB2ZXJ0ZXhfYmluZGluZ190b19pbmRleF9tYXBfOworICAgIHN0ZDo6dmVjdG9yPFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlPiBhdHRhY2htZW50czsKKyAgICBib29sIGJsZW5kQ29uc3RhbnRzRW5hYmxlZDsgIC8vIEJsZW5kIGNvbnN0YW50cyBlbmFibGVkIGZvciBhbnkgYXR0YWNobWVudHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUElQRUxJTkVfTEFZT1VUX1NUQVRFPiBwaXBlbGluZV9sYXlvdXQ7CisgICAgVmtQcmltaXRpdmVUb3BvbG9neSB0b3BvbG9neV9hdF9yYXN0ZXJpemVyOworCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIFBJUEVMSU5FX1NUQVRFKCkKKyAgICAgICAgOiBwaXBlbGluZXt9LAorICAgICAgICAgIGdyYXBoaWNzUGlwZWxpbmVDSXt9LAorICAgICAgICAgIGNvbXB1dGVQaXBlbGluZUNJe30sCisgICAgICAgICAgcmF5dHJhY2luZ1BpcGVsaW5lQ0l7fSwKKyAgICAgICAgICBycF9zdGF0ZShudWxscHRyKSwKKyAgICAgICAgICBhY3RpdmVfc2hhZGVycygwKSwKKyAgICAgICAgICBkdXBsaWNhdGVfc2hhZGVycygwKSwKKyAgICAgICAgICBhY3RpdmVfc2xvdHMoKSwKKyAgICAgICAgICBtYXhfYWN0aXZlX3Nsb3QoMCksCisgICAgICAgICAgdmVydGV4X2JpbmRpbmdfZGVzY3JpcHRpb25zXygpLAorICAgICAgICAgIHZlcnRleF9hdHRyaWJ1dGVfZGVzY3JpcHRpb25zXygpLAorICAgICAgICAgIHZlcnRleF9iaW5kaW5nX3RvX2luZGV4X21hcF8oKSwKKyAgICAgICAgICBhdHRhY2htZW50cygpLAorICAgICAgICAgIGJsZW5kQ29uc3RhbnRzRW5hYmxlZChmYWxzZSksCisgICAgICAgICAgcGlwZWxpbmVfbGF5b3V0KCksCisgICAgICAgICAgdG9wb2xvZ3lfYXRfcmFzdGVyaXplcnt9IHt9CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIGVtcHR5R3JhcGhpY3NDSSA9IHt9OworICAgICAgICBncmFwaGljc1BpcGVsaW5lQ0kuaW5pdGlhbGl6ZSgmZW1wdHlHcmFwaGljc0NJLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gZW1wdHlDb21wdXRlQ0kgPSB7fTsKKyAgICAgICAgY29tcHV0ZVBpcGVsaW5lQ0kuaW5pdGlhbGl6ZSgmZW1wdHlDb21wdXRlQ0kpOworICAgICAgICBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViBlbXB0eVJheVRyYWNpbmdDSSA9IHt9OworICAgICAgICByYXl0cmFjaW5nUGlwZWxpbmVDSS5pbml0aWFsaXplKCZlbXB0eVJheVRyYWNpbmdDSSk7CisgICAgICAgIHN0YWdlX3N0YXRlLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBpbml0R3JhcGhpY3NQaXBlbGluZShjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpzdGF0ZV9kYXRhLCBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSRU5ERVJfUEFTU19TVEFURT4gJiZycHN0YXRlKTsKKyAgICB2b2lkIGluaXRDb21wdXRlUGlwZWxpbmUoY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqc3RhdGVfZGF0YSwgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbyk7CisgICAgdm9pZCBpbml0UmF5VHJhY2luZ1BpcGVsaW5lTlYoY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqc3RhdGVfZGF0YSwgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgKnBDcmVhdGVJbmZvKTsKKworICAgIGlubGluZSBWa1BpcGVsaW5lQmluZFBvaW50IGdldFBpcGVsaW5lVHlwZSgpIGNvbnN0IHsKKyAgICAgICAgaWYgKGdyYXBoaWNzUGlwZWxpbmVDSS5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTykKKyAgICAgICAgICAgIHJldHVybiBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTOworICAgICAgICBlbHNlIGlmIChjb21wdXRlUGlwZWxpbmVDSS5zVHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9DT01QVVRFX1BJUEVMSU5FX0NSRUFURV9JTkZPKQorICAgICAgICAgICAgcmV0dXJuIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURTsKKyAgICAgICAgZWxzZSBpZiAocmF5dHJhY2luZ1BpcGVsaW5lQ0kuc1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlYpCisgICAgICAgICAgICByZXR1cm4gVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfTUFYX0VOVU07CisgICAgfQorCisgICAgaW5saW5lIFZrUGlwZWxpbmVDcmVhdGVGbGFncyBnZXRQaXBlbGluZUNyZWF0ZUZsYWdzKCkgY29uc3QgeworICAgICAgICBpZiAoZ3JhcGhpY3NQaXBlbGluZUNJLnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPKQorICAgICAgICAgICAgcmV0dXJuIGdyYXBoaWNzUGlwZWxpbmVDSS5mbGFnczsKKyAgICAgICAgZWxzZSBpZiAoY29tcHV0ZVBpcGVsaW5lQ0kuc1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfQ09NUFVURV9QSVBFTElORV9DUkVBVEVfSU5GTykKKyAgICAgICAgICAgIHJldHVybiBjb21wdXRlUGlwZWxpbmVDSS5mbGFnczsKKyAgICAgICAgZWxzZSBpZiAocmF5dHJhY2luZ1BpcGVsaW5lQ0kuc1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlYpCisgICAgICAgICAgICByZXR1cm4gcmF5dHJhY2luZ1BpcGVsaW5lQ0kuZmxhZ3M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKKy8vIFRyYWNrIGxhc3Qgc3RhdGVzIHRoYXQgYXJlIGJvdW5kIHBlciBwaXBlbGluZSBiaW5kIHBvaW50IChHZnggJiBDb21wdXRlKQorc3RydWN0IExBU1RfQk9VTkRfU1RBVEUgeworICAgIExBU1RfQk9VTkRfU1RBVEUoKSB7IHJlc2V0KCk7IH0gIC8vIG11c3QgZGVmaW5lIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHBvcnRhYmlsaXR5IHJlYXNvbnMKKyAgICBQSVBFTElORV9TVEFURSAqcGlwZWxpbmVfc3RhdGU7CisgICAgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZV9sYXlvdXQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldD4gcHVzaF9kZXNjcmlwdG9yX3NldDsKKworICAgIC8vIE9yZGVyZWQgYm91bmQgc2V0IHRyYWNraW5nIHdoZXJlIGluZGV4IGlzIHNldCMgdGhhdCBnaXZlbiBzZXQgaXMgYm91bmQgdG8KKyAgICBzdHJ1Y3QgUEVSX1NFVCB7CisgICAgICAgIFBFUl9TRVQoKQorICAgICAgICAgICAgOiBib3VuZF9kZXNjcmlwdG9yX3NldChudWxscHRyKSwKKyAgICAgICAgICAgICAgY29tcGF0X2lkX2Zvcl9zZXQoMCksCisgICAgICAgICAgICAgIHZhbGlkYXRlZF9zZXQobnVsbHB0ciksCisgICAgICAgICAgICAgIHZhbGlkYXRlZF9zZXRfY2hhbmdlX2NvdW50KH4wVUxMKSwKKyAgICAgICAgICAgICAgdmFsaWRhdGVkX3NldF9pbWFnZV9sYXlvdXRfY2hhbmdlX2NvdW50KH4wVUxMKSwKKyAgICAgICAgICAgICAgdmFsaWRhdGVkX3NldF9iaW5kaW5nX3JlcV9tYXAoKSB7fQorCisgICAgICAgIGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqYm91bmRfZGVzY3JpcHRvcl9zZXQ7CisgICAgICAgIC8vIG9uZSBkeW5hbWljIG9mZnNldCBwZXIgZHluYW1pYyBkZXNjcmlwdG9yIGJvdW5kIHRvIHRoaXMgQ0IKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGR5bmFtaWNPZmZzZXRzOworICAgICAgICBQaXBlbGluZUxheW91dENvbXBhdElkIGNvbXBhdF9pZF9mb3Jfc2V0OworCisgICAgICAgIC8vIENhY2hlIG1vc3QgcmVjZW50bHkgdmFsaWRhdGVkIGRlc2NyaXB0b3Igc3RhdGUgZm9yIFZhbGlkYXRlQ21kQnVmRHJhd1N0YXRlL1VwZGF0ZURyYXdTdGF0ZQorICAgICAgICBjb25zdCBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQgKnZhbGlkYXRlZF9zZXQ7CisgICAgICAgIHVpbnQ2NF90IHZhbGlkYXRlZF9zZXRfY2hhbmdlX2NvdW50OworICAgICAgICB1aW50NjRfdCB2YWxpZGF0ZWRfc2V0X2ltYWdlX2xheW91dF9jaGFuZ2VfY291bnQ7CisgICAgICAgIEJpbmRpbmdSZXFNYXAgdmFsaWRhdGVkX3NldF9iaW5kaW5nX3JlcV9tYXA7CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPFBFUl9TRVQ+IHBlcl9zZXQ7CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBwaXBlbGluZV9zdGF0ZSA9IG51bGxwdHI7CisgICAgICAgIHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworICAgICAgICBwdXNoX2Rlc2NyaXB0b3Jfc2V0ID0gbnVsbHB0cjsKKyAgICAgICAgcGVyX3NldC5jbGVhcigpOworICAgIH0KKworICAgIHZvaWQgVW5iaW5kQW5kUmVzZXRQdXNoRGVzY3JpcHRvclNldChjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQgKmRzKSB7CisgICAgICAgIGlmIChwdXNoX2Rlc2NyaXB0b3Jfc2V0KSB7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcGVyX3NldC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwZXJfc2V0W2ldLmJvdW5kX2Rlc2NyaXB0b3Jfc2V0ID09IHB1c2hfZGVzY3JpcHRvcl9zZXQuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyX3NldFtpXS5ib3VuZF9kZXNjcmlwdG9yX3NldCA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1c2hfZGVzY3JpcHRvcl9zZXQucmVzZXQoZHMpOworICAgIH0KK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBDb21wYXRGb3JTZXQodWludDMyX3Qgc2V0LCBjb25zdCBMQVNUX0JPVU5EX1NUQVRFICZhLCBjb25zdCBzdGQ6OnZlY3RvcjxQaXBlbGluZUxheW91dENvbXBhdElkPiAmYikgeworICAgIGJvb2wgcmVzdWx0ID0gKHNldCA8IGEucGVyX3NldC5zaXplKCkpICYmIChzZXQgPCBiLnNpemUoKSkgJiYgKGEucGVyX3NldFtzZXRdLmNvbXBhdF9pZF9mb3Jfc2V0ID09IGJbc2V0XSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBib29sIENvbXBhdEZvclNldCh1aW50MzJfdCBzZXQsIGNvbnN0IFBJUEVMSU5FX0xBWU9VVF9TVEFURSAqYSwgY29uc3QgUElQRUxJTkVfTEFZT1VUX1NUQVRFICpiKSB7CisgICAgLy8gSW50ZW50aW9uYWxseSBoYXZlIGEgcmVzdWx0IHZhcmlhYmxlIHRvIHNpbXBsaWZ5IGRlYnVnZ2luZworICAgIGJvb2wgcmVzdWx0ID0gYSAmJiBiICYmIChzZXQgPCBhLT5jb21wYXRfZm9yX3NldC5zaXplKCkpICYmIChzZXQgPCBiLT5jb21wYXRfZm9yX3NldC5zaXplKCkpICYmCisgICAgICAgICAgICAgICAgICAoYS0+Y29tcGF0X2Zvcl9zZXRbc2V0XSA9PSBiLT5jb21wYXRfZm9yX3NldFtzZXRdKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUeXBlcyB0byBzdG9yZSBxdWV1ZSBmYW1pbHkgb3duZXJzaGlwIChRRk8pIFRyYW5zZmVycworCisvLyBDb21tb24gdG8gaW1hZ2UgYW5kIGJ1ZmZlciBtZW1vcnkgYmFycmllcnMKK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGUsIHR5cGVuYW1lIEJhcnJpZXI+CitzdHJ1Y3QgUUZPVHJhbnNmZXJCYXJyaWVyQmFzZSB7CisgICAgdXNpbmcgSGFuZGxlVHlwZSA9IEhhbmRsZTsKKyAgICB1c2luZyBCYXJyaWVyVHlwZSA9IEJhcnJpZXI7CisgICAgc3RydWN0IFRhZyB7fTsKKyAgICBIYW5kbGVUeXBlIGhhbmRsZSA9IFZLX05VTExfSEFORExFOworICAgIHVpbnQzMl90IHNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICB1aW50MzJfdCBkc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisKKyAgICBRRk9UcmFuc2ZlckJhcnJpZXJCYXNlKCkgPSBkZWZhdWx0OworICAgIFFGT1RyYW5zZmVyQmFycmllckJhc2UoY29uc3QgQmFycmllclR5cGUgJmJhcnJpZXIsIGNvbnN0IEhhbmRsZVR5cGUgJnJlc291cmNlX2hhbmRsZSkKKyAgICAgICAgOiBoYW5kbGUocmVzb3VyY2VfaGFuZGxlKSwKKyAgICAgICAgICBzcmNRdWV1ZUZhbWlseUluZGV4KGJhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCksCisgICAgICAgICAgZHN0UXVldWVGYW1pbHlJbmRleChiYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXgpIHt9CisKKyAgICBoYXNoX3V0aWw6Okhhc2hDb21iaW5lciBiYXNlX2hhc2hfY29tYmluZXIoKSBjb25zdCB7CisgICAgICAgIGhhc2hfdXRpbDo6SGFzaENvbWJpbmVyIGhjOworICAgICAgICBoYyA8PCBzcmNRdWV1ZUZhbWlseUluZGV4IDw8IGRzdFF1ZXVlRmFtaWx5SW5kZXggPDwgaGFuZGxlOworICAgICAgICByZXR1cm4gaGM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFFGT1RyYW5zZmVyQmFycmllckJhc2UgJnJocykgY29uc3QgeworICAgICAgICByZXR1cm4gKHNyY1F1ZXVlRmFtaWx5SW5kZXggPT0gcmhzLnNyY1F1ZXVlRmFtaWx5SW5kZXgpICYmIChkc3RRdWV1ZUZhbWlseUluZGV4ID09IHJocy5kc3RRdWV1ZUZhbWlseUluZGV4KSAmJgorICAgICAgICAgICAgICAgKGhhbmRsZSA9PSByaHMuaGFuZGxlKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFycmllcj4KK3N0cnVjdCBRRk9UcmFuc2ZlckJhcnJpZXIge307CisKKy8vIEltYWdlIGJhcnJpZXIgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24KK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUUZPVHJhbnNmZXJCYXJyaWVyPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPiA6IHB1YmxpYyBRRk9UcmFuc2ZlckJhcnJpZXJCYXNlPFZrSW1hZ2UsIFZrSW1hZ2VNZW1vcnlCYXJyaWVyPiB7CisgICAgdXNpbmcgQmFzZVR5cGUgPSBRRk9UcmFuc2ZlckJhcnJpZXJCYXNlPFZrSW1hZ2UsIFZrSW1hZ2VNZW1vcnlCYXJyaWVyPjsKKyAgICBWa0ltYWdlTGF5b3V0IG9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgVmtJbWFnZUxheW91dCBuZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN1YnJlc291cmNlUmFuZ2U7CisKKyAgICBRRk9UcmFuc2ZlckJhcnJpZXIoKSA9IGRlZmF1bHQ7CisgICAgUUZPVHJhbnNmZXJCYXJyaWVyKGNvbnN0IEJhcnJpZXJUeXBlICZiYXJyaWVyKQorICAgICAgICA6IEJhc2VUeXBlKGJhcnJpZXIsIGJhcnJpZXIuaW1hZ2UpLAorICAgICAgICAgIG9sZExheW91dChiYXJyaWVyLm9sZExheW91dCksCisgICAgICAgICAgbmV3TGF5b3V0KGJhcnJpZXIubmV3TGF5b3V0KSwKKyAgICAgICAgICBzdWJyZXNvdXJjZVJhbmdlKGJhcnJpZXIuc3VicmVzb3VyY2VSYW5nZSkge30KKyAgICBzaXplX3QgaGFzaCgpIGNvbnN0IHsKKyAgICAgICAgLy8gSWdub3JpbmcgdGhlIGxheW91dCBpbmZvcm1hdGlvbiBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIGhhc2gsIGFzIHdlJ3JlIGludGVyZXN0ZWQgaW4gUUZPIHJlbGVhc2UvYWNxdWlzaXRpb24gdy5yLnQuCisgICAgICAgIC8vIHRoZSBzdWJyZXNvdXJjZSBhZmZlY3RlZCwgYW4gbGF5b3V0IHRyYW5zaXRpb25zIGFyZSBjdXJyZW50IHZhbGlkYXRlZCBvbiBhbm90aGVyIHBhdGgKKyAgICAgICAgYXV0byBoYyA9IGJhc2VfaGFzaF9jb21iaW5lcigpIDw8IHN1YnJlc291cmNlUmFuZ2U7CisgICAgICAgIHJldHVybiBoYy5WYWx1ZSgpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUUZPVHJhbnNmZXJCYXJyaWVyPEJhcnJpZXJUeXBlPiAmcmhzKSBjb25zdCB7CisgICAgICAgIC8vIElnbm9yaW5nIGxheW91dCB3LnIudC4gZXF1YWxpdHkuIFNlZSBjb21tZW50IGluIGhhc2ggYWJvdmUuCisgICAgICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8QmFzZVR5cGU+KCp0aGlzKSA9PSBzdGF0aWNfY2FzdDxCYXNlVHlwZT4ocmhzKSkgJiYgKHN1YnJlc291cmNlUmFuZ2UgPT0gcmhzLnN1YnJlc291cmNlUmFuZ2UpOworICAgIH0KKyAgICAvLyBUT0RPOiBjb2RlZ2VuIGEgY29tcHJlaGVuc2l2ZSBjb21wbGllIHRpbWUgdHlwZSAtPiBzdHJpbmcgKGFuZCBvciBvdGhlciB0cmFpdHMpIHRlbXBsYXRlIGZhbWlseQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpCYXJyaWVyTmFtZSgpIHsgcmV0dXJuICJWa0ltYWdlTWVtb3J5QmFycmllciI7IH0KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqSGFuZGxlTmFtZSgpIHsgcmV0dXJuICJWa0ltYWdlIjsgfQorICAgIC8vIFVOQVNTSUdORUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDAwMDEgUUZPIHRyYW5zZmVyIGltYWdlIGJhcnJpZXIgbXVzdCBub3QgZHVwbGljYXRlIFFGTyByZWNvcmRlZCBpbiBjb21tYW5kIGJ1ZmZlcgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpFcnJNc2dEdXBsaWNhdGVRRk9JbkNCKCkgeyByZXR1cm4gIlVOQVNTSUdORUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDAwMDEiOyB9CisgICAgLy8gVU5BU1NJR05FRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMDAwMiBRRk8gdHJhbnNmZXIgaW1hZ2UgYmFycmllciBtdXN0IG5vdCBkdXBsaWNhdGUgUUZPIHN1Ym1pdHRlZCBpbiBiYXRjaAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpFcnJNc2dEdXBsaWNhdGVRRk9JblN1Ym1pdCgpIHsgcmV0dXJuICJVTkFTU0lHTkVELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAwMDAyIjsgfQorICAgIC8vIFVOQVNTSUdORUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDAwMDMgUUZPIHRyYW5zZmVyIGltYWdlIGJhcnJpZXIgbXVzdCBub3QgZHVwbGljYXRlIFFGTyBzdWJtaXR0ZWQgcHJldmlvdXNseQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpFcnJNc2dEdXBsaWNhdGVRRk9TdWJtaXR0ZWQoKSB7IHJldHVybiAiVU5BU1NJR05FRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMDAwMyI7IH0KKyAgICAvLyBVTkFTU0lHTkVELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAwMDA0IFFGTyBhY3F1aXJlIGltYWdlIGJhcnJpZXIgbXVzdCBoYXZlIG1hdGNoaW5nIFFGTyByZWxlYXNlIHN1Ym1pdHRlZCBwcmV2aW91c2x5CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKkVyck1zZ01pc3NpbmdRRk9SZWxlYXNlSW5TdWJtaXQoKSB7IHJldHVybiAiVU5BU1NJR05FRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMDAwNCI7IH0KK307CisKKy8vIEJ1ZmZlciBiYXJyaWVyIHNwZWNpZmljIGltcGxlbWVudGF0aW9uCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFFGT1RyYW5zZmVyQmFycmllcjxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+IDogcHVibGljIFFGT1RyYW5zZmVyQmFycmllckJhc2U8VmtCdWZmZXIsIFZrQnVmZmVyTWVtb3J5QmFycmllcj4geworICAgIHVzaW5nIEJhc2VUeXBlID0gUUZPVHJhbnNmZXJCYXJyaWVyQmFzZTxWa0J1ZmZlciwgVmtCdWZmZXJNZW1vcnlCYXJyaWVyPjsKKyAgICBWa0RldmljZVNpemUgb2Zmc2V0ID0gMDsKKyAgICBWa0RldmljZVNpemUgc2l6ZSA9IDA7CisgICAgUUZPVHJhbnNmZXJCYXJyaWVyKGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAmYmFycmllcikKKyAgICAgICAgOiBCYXNlVHlwZShiYXJyaWVyLCBiYXJyaWVyLmJ1ZmZlciksIG9mZnNldChiYXJyaWVyLm9mZnNldCksIHNpemUoYmFycmllci5zaXplKSB7fQorICAgIHNpemVfdCBoYXNoKCkgY29uc3QgeworICAgICAgICBhdXRvIGhjID0gYmFzZV9oYXNoX2NvbWJpbmVyKCkgPDwgb2Zmc2V0IDw8IHNpemU7CisgICAgICAgIHJldHVybiBoYy5WYWx1ZSgpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUUZPVHJhbnNmZXJCYXJyaWVyPEJhcnJpZXJUeXBlPiAmcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8QmFzZVR5cGU+KCp0aGlzKSA9PSBzdGF0aWNfY2FzdDxCYXNlVHlwZT4ocmhzKSkgJiYgKG9mZnNldCA9PSByaHMub2Zmc2V0KSAmJiAoc2l6ZSA9PSByaHMuc2l6ZSk7CisgICAgfQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpCYXJyaWVyTmFtZSgpIHsgcmV0dXJuICJWa0J1ZmZlck1lbW9yeUJhcnJpZXIiOyB9CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKkhhbmRsZU5hbWUoKSB7IHJldHVybiAiVmtCdWZmZXIiOyB9CisgICAgLy8gVU5BU1NJR05FRC1Wa0ltYWdlTWVtb3J5QmFycmllci1idWZmZXItMDAwMDEgUUZPIHRyYW5zZmVyIGJ1ZmZlciBiYXJyaWVyIG11c3Qgbm90IGR1cGxpY2F0ZSBRRk8gcmVjb3JkZWQgaW4gY29tbWFuZCBidWZmZXIKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqRXJyTXNnRHVwbGljYXRlUUZPSW5DQigpIHsgcmV0dXJuICJVTkFTU0lHTkVELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDAwMDEiOyB9CisgICAgLy8gVU5BU1NJR05FRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAwMDAyIFFGTyB0cmFuc2ZlciBidWZmZXIgYmFycmllciBtdXN0IG5vdCBkdXBsaWNhdGUgUUZPIHN1Ym1pdHRlZCBpbiBiYXRjaAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpFcnJNc2dEdXBsaWNhdGVRRk9JblN1Ym1pdCgpIHsgcmV0dXJuICJVTkFTU0lHTkVELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDAwMDIiOyB9CisgICAgLy8gVU5BU1NJR05FRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAwMDAzIFFGTyB0cmFuc2ZlciBidWZmZXIgYmFycmllciBtdXN0IG5vdCBkdXBsaWNhdGUgUUZPIHN1Ym1pdHRlZCBwcmV2aW91c2x5CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKkVyck1zZ0R1cGxpY2F0ZVFGT1N1Ym1pdHRlZCgpIHsgcmV0dXJuICJVTkFTU0lHTkVELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDAwMDMiOyB9CisgICAgLy8gVU5BU1NJR05FRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAwMDA0IFFGTyBhY3F1aXJlIGJ1ZmZlciBiYXJyaWVyIG11c3QgaGF2ZSBtYXRjaGluZyBRRk8gcmVsZWFzZSBzdWJtaXR0ZWQgcHJldmlvdXNseQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpFcnJNc2dNaXNzaW5nUUZPUmVsZWFzZUluU3VibWl0KCkgeyByZXR1cm4gIlVOQVNTSUdORUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMDAwNCI7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXJyaWVyPgordXNpbmcgUUZPVHJhbnNmZXJCYXJyaWVySGFzaCA9IGhhc2hfdXRpbDo6SGFzSGFzaE1lbWJlcjxRRk9UcmFuc2ZlckJhcnJpZXI8QmFycmllcj4+OworCisvLyBDb21tYW5kIGJ1ZmZlcnMgc3RvcmUgdGhlIHNldCBvZiBiYXJyaWVycyByZWNvcmRlZAordGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXI+Cit1c2luZyBRRk9UcmFuc2ZlckJhcnJpZXJTZXQgPSBzdGQ6OnVub3JkZXJlZF9zZXQ8UUZPVHJhbnNmZXJCYXJyaWVyPEJhcnJpZXI+LCBRRk9UcmFuc2ZlckJhcnJpZXJIYXNoPEJhcnJpZXI+PjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXJyaWVyPgorc3RydWN0IFFGT1RyYW5zZmVyQmFycmllclNldHMgeworICAgIFFGT1RyYW5zZmVyQmFycmllclNldDxCYXJyaWVyPiByZWxlYXNlOworICAgIFFGT1RyYW5zZmVyQmFycmllclNldDxCYXJyaWVyPiBhY3F1aXJlOworICAgIHZvaWQgUmVzZXQoKSB7CisgICAgICAgIGFjcXVpcmUuY2xlYXIoKTsKKyAgICAgICAgcmVsZWFzZS5jbGVhcigpOworICAgIH0KK307CisKKy8vIFRoZSBsYXllcl9kYXRhIHN0b3JlcyB0aGUgbWFwIG9mIHBlbmRpbmcgcmVsZWFzZSBiYXJyaWVycwordGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXI+Cit1c2luZyBHbG9iYWxRRk9UcmFuc2ZlckJhcnJpZXJNYXAgPQorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx0eXBlbmFtZSBRRk9UcmFuc2ZlckJhcnJpZXI8QmFycmllcj46OkhhbmRsZVR5cGUsIFFGT1RyYW5zZmVyQmFycmllclNldDxCYXJyaWVyPj47CisKKy8vIFN1Ym1pdCBxdWV1ZSB1c2VzIHRoZSBTY29yZWJvYXJkIHRvIHRyYWNrIGFsbCByZWxlYXNlL2FjcXVpcmUgb3BlcmF0aW9ucyBpbiBhIGJhdGNoLgordGVtcGxhdGUgPHR5cGVuYW1lIEJhcnJpZXI+Cit1c2luZyBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZCA9CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFFGT1RyYW5zZmVyQmFycmllcjxCYXJyaWVyPiwgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqLCBRRk9UcmFuc2ZlckJhcnJpZXJIYXNoPEJhcnJpZXI+PjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXJyaWVyPgorc3RydWN0IFFGT1RyYW5zZmVyQ0JTY29yZWJvYXJkcyB7CisgICAgUUZPVHJhbnNmZXJDQlNjb3JlYm9hcmQ8QmFycmllcj4gYWNxdWlyZTsKKyAgICBRRk9UcmFuc2ZlckNCU2NvcmVib2FyZDxCYXJyaWVyPiByZWxlYXNlOworfTsKKwordHlwZWRlZiBzdGQ6Om1hcDxRdWVyeU9iamVjdCwgUXVlcnlTdGF0ZT4gUXVlcnlNYXA7Cit0eXBlZGVmIHN0ZDo6bWFwPFF1ZXJ5T2JqZWN0UGFzcywgUXVlcnlTdGF0ZT4gUXVlcnlQYXNzTWFwOwordHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8VmtFdmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3M+IEV2ZW50VG9TdGFnZU1hcDsKKworLy8gQ21kIEJ1ZmZlciBXcmFwcGVyIFN0cnVjdCAtIFRPRE8gOiBUaGlzIGRlc3BlcmF0ZWx5IG5lZWRzIGl0cyBvd24gY2xhc3MKK3N0cnVjdCBDTURfQlVGRkVSX1NUQVRFIDogcHVibGljIEJBU0VfTk9ERSB7CisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXI7CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNyZWF0ZUluZm8gPSB7fTsKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5JbmZvOworICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBpbmhlcml0YW5jZUluZm87CisgICAgVmtEZXZpY2UgZGV2aWNlOyAgLy8gZGV2aWNlIHRoaXMgQ0IgYmVsb25ncyB0bworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDT01NQU5EX1BPT0xfU1RBVEU+IGNvbW1hbmRfcG9vbDsKKyAgICBib29sIGhhc0RyYXdDbWQ7CisgICAgYm9vbCBoYXNUcmFjZVJheXNDbWQ7CisgICAgYm9vbCBoYXNCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUNtZDsKKyAgICBib29sIGhhc0Rpc3BhdGNoQ21kOworCisgICAgQ0JfU1RBVEUgc3RhdGU7ICAgICAgICAgLy8gVHJhY2sgY21kIGJ1ZmZlciB1cGRhdGUgc3RhdGUKKyAgICB1aW50NjRfdCBjb21tYW5kQ291bnQ7ICAvLyBOdW1iZXIgb2YgY29tbWFuZHMgcmVjb3JkZWQKKyAgICB1aW50NjRfdCBzdWJtaXRDb3VudDsgICAvLyBOdW1iZXIgb2YgdGltZXMgQ0IgaGFzIGJlZW4gc3VibWl0dGVkCisgICAgdHlwZWRlZiB1aW50NjRfdCBJbWFnZUxheW91dFVwZGF0ZUNvdW50OworICAgIEltYWdlTGF5b3V0VXBkYXRlQ291bnQgaW1hZ2VfbGF5b3V0X2NoYW5nZV9jb3VudDsgIC8vIFRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIGNoYW5nZXMgdG8gaW1hZ2UgbGF5b3V0IChmb3IgY2FjaGVkIHZhbGlkYXRpb24pCisgICAgQ0JTdGF0dXNGbGFncyBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgc3RhdHVzIG9mIHZhcmlvdXMgYmluZGluZ3Mgb24gY21kIGJ1ZmZlcgorICAgIENCU3RhdHVzRmxhZ3Mgc3RhdGljX3N0YXR1czsgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBzdGF0ZSBiaXRzIHByb3ZpZGVkIGJ5IGN1cnJlbnQgZ3JhcGhpY3MgcGlwZWxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBkeW5hbWljIHN0YXRlCisgICAgLy8gQ3VycmVudGx5IHN0b3JpbmcgImxhc3RCb3VuZCIgb2JqZWN0cyBvbiBwZXItQ0IgYmFzaXMKKyAgICAvLyAgbG9uZy10ZXJtIG1heSB3YW50IHRvIGNyZWF0ZSBjYWNoZXMgb2YgImxhc3RCb3VuZCIgc3RhdGVzIGFuZCBjb3VsZCBoYXZlCisgICAgLy8gIGVhY2ggaW5kaXZpZHVhbCBDTURfTk9ERSByZWZlcmVuY2luZyBpdHMgb3duICJsYXN0Qm91bmQiIHN0YXRlCisgICAgLy8gU3RvcmUgbGFzdCBib3VuZCBzdGF0ZSBmb3IgR2Z4ICYgQ29tcHV0ZSBwaXBlbGluZSBiaW5kIHBvaW50cworICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBMQVNUX0JPVU5EX1NUQVRFPiBsYXN0Qm91bmQ7CisKKyAgICB1c2luZyBCaW5kaW5ncyA9IHN0ZDo6bWFwPHVpbnQzMl90LCBkZXNjcmlwdG9yX3JlcT47CisgICAgdXNpbmcgUGlwZWxpbmVzX0JpbmRpbmdzID0gc3RkOjptYXA8VmtQaXBlbGluZSwgQmluZGluZ3M+OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa0Rlc2NyaXB0b3JTZXQsIFBpcGVsaW5lc19CaW5kaW5ncz4gdmFsaWRhdGVfZGVzY3JpcHRvcnNldHNfaW5fcXVldWVzdWJtaXQ7CisKKyAgICB1aW50MzJfdCB2aWV3cG9ydE1hc2s7CisgICAgdWludDMyX3Qgc2Npc3Nvck1hc2s7CisgICAgdWludDMyX3QgaW5pdGlhbF9kZXZpY2VfbWFzazsKKworICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBhY3RpdmVSZW5kZXJQYXNzQmVnaW5JbmZvOworICAgIFJFTkRFUl9QQVNTX1NUQVRFICphY3RpdmVSZW5kZXJQYXNzOworICAgIFZrU3VicGFzc0NvbnRlbnRzIGFjdGl2ZVN1YnBhc3NDb250ZW50czsKKyAgICB1aW50MzJfdCBhY3RpdmVfcmVuZGVyX3Bhc3NfZGV2aWNlX21hc2s7CisgICAgdWludDMyX3QgYWN0aXZlU3VicGFzczsKKyAgICBWa0ZyYW1lYnVmZmVyIGFjdGl2ZUZyYW1lYnVmZmVyOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxWa0ZyYW1lYnVmZmVyPiBmcmFtZWJ1ZmZlcnM7CisgICAgLy8gVW5pZmllZCBkYXRhIHN0cnVjdHMgdG8gdHJhY2sgb2JqZWN0cyBib3VuZCB0byB0aGlzIGNvbW1hbmQgYnVmZmVyIGFzIHdlbGwgYXMgb2JqZWN0CisgICAgLy8gIGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBicm9rZW4gOiBlaXRoZXIgZGVzdHJveWVkIG9iamVjdHMsIG9yIHVwZGF0ZWQgZGVzY3JpcHRvciBzZXRzCisgICAgc3RkOjp2ZWN0b3I8VnVsa2FuVHlwZWRIYW5kbGU+IG9iamVjdF9iaW5kaW5nczsKKyAgICBzdGQ6OnZlY3RvcjxWdWxrYW5UeXBlZEhhbmRsZT4gYnJva2VuX2JpbmRpbmdzOworCisgICAgUUZPVHJhbnNmZXJCYXJyaWVyU2V0czxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+IHFmb190cmFuc2Zlcl9idWZmZXJfYmFycmllcnM7CisgICAgUUZPVHJhbnNmZXJCYXJyaWVyU2V0czxWa0ltYWdlTWVtb3J5QmFycmllcj4gcWZvX3RyYW5zZmVyX2ltYWdlX2JhcnJpZXJzOworCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PFZrRXZlbnQ+IHdhaXRlZEV2ZW50czsKKyAgICBzdGQ6OnZlY3RvcjxWa0V2ZW50PiB3cml0ZUV2ZW50c0JlZm9yZVdhaXQ7CisgICAgc3RkOjp2ZWN0b3I8VmtFdmVudD4gZXZlbnRzOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxRdWVyeU9iamVjdD4gYWN0aXZlUXVlcmllczsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8UXVlcnlPYmplY3Q+IHN0YXJ0ZWRRdWVyaWVzOworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPFZrSW1hZ2UsIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwPj4gSW1hZ2VMYXlvdXRNYXA7CisgICAgSW1hZ2VMYXlvdXRNYXAgaW1hZ2VfbGF5b3V0X21hcDsKKyAgICBDQlZlcnRleEJ1ZmZlckJpbmRpbmdJbmZvIGN1cnJlbnRfdmVydGV4X2J1ZmZlcl9iaW5kaW5nX2luZm87CisgICAgYm9vbCB2ZXJ0ZXhfYnVmZmVyX3VzZWQ7ICAvLyBUcmFjayBmb3IgcGVyZiB3YXJuaW5nIHRvIG1ha2Ugc3VyZSBhbnkgYm91bmQgdnR4IGJ1ZmZlciB1c2VkCisgICAgVmtDb21tYW5kQnVmZmVyIHByaW1hcnlDb21tYW5kQnVmZmVyOworICAgIC8vIElmIHByaW1hcnksIHRoZSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXJzIHdlIHdpbGwgY2FsbC4KKyAgICAvLyBJZiBzZWNvbmRhcnksIHRoZSBwcmltYXJ5IGNvbW1hbmQgYnVmZmVycyB3ZSB3aWxsIGJlIGNhbGxlZCBieS4KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8Q01EX0JVRkZFUl9TVEFURSAqPiBsaW5rZWRDb21tYW5kQnVmZmVyczsKKyAgICAvLyBWYWxpZGF0aW9uIGZ1bmN0aW9ucyBydW4gYXQgcHJpbWFyeSBDQiBxdWV1ZSBzdWJtaXQgdGltZQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZpY2VfZGF0YSwgY29uc3QgY2xhc3MgUVVFVUVfU1RBVEUgKnF1ZXVlX3N0YXRlKT4+CisgICAgICAgIHF1ZXVlX3N1Ym1pdF9mdW5jdGlvbnM7CisgICAgLy8gVmFsaWRhdGlvbiBmdW5jdGlvbnMgcnVuIHdoZW4gc2Vjb25kYXJ5IENCIGlzIGV4ZWN1dGVkIGluIHByaW1hcnkKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqLCBWa0ZyYW1lYnVmZmVyKT4+IGNtZF9leGVjdXRlX2NvbW1hbmRzX2Z1bmN0aW9uczsKKyAgICBzdGQ6OnZlY3RvcjwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldmljZV9kYXRhLCBib29sIGRvX3ZhbGlkYXRlLCBFdmVudFRvU3RhZ2VNYXAgKmxvY2FsRXZlbnRUb1N0YWdlTWFwKT4+CisgICAgICAgIGV2ZW50VXBkYXRlczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2aWNlX2RhdGEsIGJvb2wgZG9fdmFsaWRhdGUsIFF1ZXJ5TWFwICpsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCk+PgorICAgICAgICBxdWVyeVVwZGF0ZXM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqPiB2YWxpZGF0ZWRfZGVzY3JpcHRvcl9zZXRzOworICAgIC8vIENvbnRlbnRzIHZhbGlkIG9ubHkgYWZ0ZXIgYW4gaW5kZXggYnVmZmVyIGlzIGJvdW5kIChDQlNUQVRVU19JTkRFWF9CVUZGRVJfQk9VTkQgc2V0KQorICAgIEluZGV4QnVmZmVyQmluZGluZyBpbmRleF9idWZmZXJfYmluZGluZzsKKyAgICBib29sIHBlcmZvcm1hbmNlX2xvY2tfYWNxdWlyZWQgPSBmYWxzZTsKKyAgICBib29sIHBlcmZvcm1hbmNlX2xvY2tfcmVsZWFzZWQgPSBmYWxzZTsKKworICAgIC8vIENhY2hlIG9mIGN1cnJlbnQgaW5zZXJ0IGxhYmVsLi4uCisgICAgTG9nZ2luZ0xhYmVsIGRlYnVnX2xhYmVsOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcHVzaF9jb25zdGFudF9kYXRhOworICAgIFB1c2hDb25zdGFudFJhbmdlc0lkIHB1c2hfY29uc3RhbnRfZGF0YV9yYW5nZXM7Cit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IFFGT1RyYW5zZmVyQmFycmllclNldHM8VmtJbWFnZU1lbW9yeUJhcnJpZXI+ICZHZXRRRk9CYXJyaWVyU2V0cygKKyAgICBjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYiwgY29uc3QgUUZPVHJhbnNmZXJCYXJyaWVyPFZrSW1hZ2VNZW1vcnlCYXJyaWVyPjo6VGFnICZ0eXBlX3RhZykgeworICAgIHJldHVybiBjYi0+cWZvX3RyYW5zZmVyX2ltYWdlX2JhcnJpZXJzOworfQorc3RhdGljIGlubGluZSBjb25zdCBRRk9UcmFuc2ZlckJhcnJpZXJTZXRzPFZrQnVmZmVyTWVtb3J5QmFycmllcj4gJkdldFFGT0JhcnJpZXJTZXRzKAorICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiLCBjb25zdCBRRk9UcmFuc2ZlckJhcnJpZXI8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPjo6VGFnICZ0eXBlX3RhZykgeworICAgIHJldHVybiBjYi0+cWZvX3RyYW5zZmVyX2J1ZmZlcl9iYXJyaWVyczsKK30KK3N0YXRpYyBpbmxpbmUgUUZPVHJhbnNmZXJCYXJyaWVyU2V0czxWa0ltYWdlTWVtb3J5QmFycmllcj4gJkdldFFGT0JhcnJpZXJTZXRzKAorICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiLCBjb25zdCBRRk9UcmFuc2ZlckJhcnJpZXI8VmtJbWFnZU1lbW9yeUJhcnJpZXI+OjpUYWcgJnR5cGVfdGFnKSB7CisgICAgcmV0dXJuIGNiLT5xZm9fdHJhbnNmZXJfaW1hZ2VfYmFycmllcnM7Cit9CitzdGF0aWMgaW5saW5lIFFGT1RyYW5zZmVyQmFycmllclNldHM8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPiAmR2V0UUZPQmFycmllclNldHMoCisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2IsIGNvbnN0IFFGT1RyYW5zZmVyQmFycmllcjxWa0J1ZmZlck1lbW9yeUJhcnJpZXI+OjpUYWcgJnR5cGVfdGFnKSB7CisgICAgcmV0dXJuIGNiLT5xZm9fdHJhbnNmZXJfYnVmZmVyX2JhcnJpZXJzOworfQorCitzdHJ1Y3QgU0VNQVBIT1JFX1dBSVQgeworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBWa1F1ZXVlIHF1ZXVlOworICAgIHVpbnQ2NF90IHNlcTsKK307CisKK3N0cnVjdCBDQl9TVUJNSVNTSU9OIHsKKyAgICBDQl9TVUJNSVNTSU9OKHN0ZDo6dmVjdG9yPFZrQ29tbWFuZEJ1ZmZlcj4gY29uc3QgJmNicywgc3RkOjp2ZWN0b3I8U0VNQVBIT1JFX1dBSVQ+IGNvbnN0ICZ3YWl0U2VtYXBob3JlcywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZrU2VtYXBob3JlPiBjb25zdCAmc2lnbmFsU2VtYXBob3Jlcywgc3RkOjp2ZWN0b3I8VmtTZW1hcGhvcmU+IGNvbnN0ICZleHRlcm5hbFNlbWFwaG9yZXMsCisgICAgICAgICAgICAgICAgICBWa0ZlbmNlIGZlbmNlLCB1aW50MzJfdCBwZXJmX3N1Ym1pdF9wYXNzKQorICAgICAgICA6IGNicyhjYnMpLAorICAgICAgICAgIHdhaXRTZW1hcGhvcmVzKHdhaXRTZW1hcGhvcmVzKSwKKyAgICAgICAgICBzaWduYWxTZW1hcGhvcmVzKHNpZ25hbFNlbWFwaG9yZXMpLAorICAgICAgICAgIGV4dGVybmFsU2VtYXBob3JlcyhleHRlcm5hbFNlbWFwaG9yZXMpLAorICAgICAgICAgIGZlbmNlKGZlbmNlKSwKKyAgICAgICAgICBwZXJmX3N1Ym1pdF9wYXNzKHBlcmZfc3VibWl0X3Bhc3MpIHt9CisKKyAgICBzdGQ6OnZlY3RvcjxWa0NvbW1hbmRCdWZmZXI+IGNiczsKKyAgICBzdGQ6OnZlY3RvcjxTRU1BUEhPUkVfV0FJVD4gd2FpdFNlbWFwaG9yZXM7CisgICAgc3RkOjp2ZWN0b3I8VmtTZW1hcGhvcmU+IHNpZ25hbFNlbWFwaG9yZXM7CisgICAgc3RkOjp2ZWN0b3I8VmtTZW1hcGhvcmU+IGV4dGVybmFsU2VtYXBob3JlczsKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIHVpbnQzMl90IHBlcmZfc3VibWl0X3Bhc3M7Cit9OworCitzdHJ1Y3QgSU1BR0VfTEFZT1VUX1NUQVRFIHsKKyAgICBWa0ltYWdlTGF5b3V0IGxheW91dDsKKyAgICBWa0Zvcm1hdCBmb3JtYXQ7Cit9OworCitzdHJ1Y3QgTVRfRkJfQVRUQUNITUVOVF9JTkZPIHsKKyAgICBJTUFHRV9WSUVXX1NUQVRFICp2aWV3X3N0YXRlOworICAgIFZrSW1hZ2UgaW1hZ2U7Cit9OworCitjbGFzcyBGUkFNRUJVRkZFUl9TVEFURSA6IHB1YmxpYyBCQVNFX05PREUgeworICBwdWJsaWM6CisgICAgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcjsKKyAgICBzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGNyZWF0ZUluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJFTkRFUl9QQVNTX1NUQVRFPiBycF9zdGF0ZTsKKyAgICBGUkFNRUJVRkZFUl9TVEFURShWa0ZyYW1lYnVmZmVyIGZiLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIHN0ZDo6c2hhcmVkX3B0cjxSRU5ERVJfUEFTU19TVEFURT4gJiZycHN0YXRlKQorICAgICAgICA6IGZyYW1lYnVmZmVyKGZiKSwgY3JlYXRlSW5mbyhwQ3JlYXRlSW5mbyksIHJwX3N0YXRlKHJwc3RhdGUpe307Cit9OworCitzdHJ1Y3QgU0hBREVSX01PRFVMRV9TVEFURTsKK3N0cnVjdCBEZXZpY2VFeHRlbnNpb25zOworCitzdHJ1Y3QgRGV2aWNlRmVhdHVyZXMgeworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBjb3JlOworICAgIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCBkZXNjcmlwdG9yX2luZGV4aW5nOworICAgIFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIGVpZ2h0X2JpdF9zdG9yYWdlOworICAgIFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViBleGNsdXNpdmVfc2Npc3NvcjsKKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgc2hhZGluZ19yYXRlX2ltYWdlOworICAgIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViBtZXNoX3NoYWRlcjsKKyAgICBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgaW5saW5lX3VuaWZvcm1fYmxvY2s7CisgICAgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgdHJhbnNmb3JtX2ZlZWRiYWNrX2ZlYXR1cmVzOworICAgIFZrUGh5c2ljYWxEZXZpY2VGbG9hdDE2SW50OEZlYXR1cmVzS0hSIGZsb2F0MTZfaW50ODsKKyAgICBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIHZ0eF9hdHRyaWJfZGl2aXNvcl9mZWF0dXJlczsKKyAgICBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgdW5pZm9ybV9idWZmZXJfc3RhbmRhcmRfbGF5b3V0OworICAgIFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUIHNjYWxhcl9ibG9ja19sYXlvdXRfZmVhdHVyZXM7CisgICAgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiBidWZmZXJfZGV2aWNlX2FkZHJlc3M7CisgICAgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCBidWZmZXJfZGV2aWNlX2FkZHJlc3NfZXh0OworICAgIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgY29vcGVyYXRpdmVfbWF0cml4X2ZlYXR1cmVzOworICAgIFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIGhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXM7CisgICAgVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgY29tcHV0ZV9zaGFkZXJfZGVyaXZhdGl2ZXNfZmVhdHVyZXM7CisgICAgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIGZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpY19mZWF0dXJlczsKKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIHNoYWRlcl9pbWFnZV9mb290cHJpbnRfZmVhdHVyZXM7CisgICAgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgZnJhZ21lbnRfc2hhZGVyX2ludGVybG9ja19mZWF0dXJlczsKKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgZGVtb3RlX3RvX2hlbHBlcl9pbnZvY2F0aW9uX2ZlYXR1cmVzOworICAgIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIHRleGVsX2J1ZmZlcl9hbGlnbm1lbnRfZmVhdHVyZXM7CisgICAgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyX2ZlYXR1cmVzOworICAgIFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgcGlwZWxpbmVfZXhlX3Byb3BzX2ZlYXR1cmVzOworICAgIFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgZGVkaWNhdGVkX2FsbG9jYXRpb25faW1hZ2VfYWxpYXNpbmdfZmVhdHVyZXM7CisgICAgVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSIHN1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzX2ZlYXR1cmVzOworICAgIFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiBzZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHNfZmVhdHVyZXM7CisgICAgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiBwZXJmb3JtYW5jZV9xdWVyeV9mZWF0dXJlczsKKyAgICBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiB0aW1lbGluZV9zZW1hcGhvcmVfZmVhdHVyZXM7CisgICAgVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgZGV2aWNlX2NvaGVyZW50X21lbW9yeV9mZWF0dXJlczsKK307CisKK2VudW0gUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24geyBSRU5ERVJfUEFTU19WRVJTSU9OXzEgPSAwLCBSRU5ERVJfUEFTU19WRVJTSU9OXzIgPSAxIH07CitlbnVtIENvbW1hbmRWZXJzaW9uIHsgQ01EX1ZFUlNJT05fMSA9IDAsIENNRF9WRVJTSU9OXzIgPSAxIH07CisKK2VudW0gQmFycmllck9wZXJhdGlvbnNUeXBlIHsKKyAgICBrQWxsQWNxdWlyZSwgIC8vIEFsbCBCYXJyaWVyIG9wZXJhdGlvbnMgYXJlICJvd25lcnNoaXAgYWNxdWlyZSIgb3BlcmF0aW9ucworICAgIGtBbGxSZWxlYXNlLCAgLy8gQWxsIEJhcnJpZXIgb3BlcmF0aW9ucyBhcmUgIm93bmVyc2hpcCByZWxlYXNlIiBvcGVyYXRpb25zCisgICAga0dlbmVyYWwsICAgICAvLyBFaXRoZXIgbm8gb3duZXJzaGlwIG9wZXJhdGlvbnMgb3IgYSBtaXggb2Ygb3duZXJzaGlwIG9wZXJhdGlvbiB0eXBlcyBhbmQvb3Igbm9uLW93bmVyc2hpcCBvcGVyYXRpb25zCit9OworCitJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwICpHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwKENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLCBjb25zdCBJTUFHRV9TVEFURSAmaW1hZ2Vfc3RhdGUpOworY29uc3QgSW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcCAqR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dE1hcChjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgVmtJbWFnZSBpbWFnZSk7CisKKyNlbmRpZiAgLy8gQ09SRV9WQUxJREFUSU9OX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZGVzY3JpcHRvcl9zZXRzLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9kZXNjcmlwdG9yX3NldHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTA3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZGVzY3JpcHRvcl9zZXRzLmNwcApAQCAtMCwwICsxLDI2NTQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiAgICAgICAgIEpvaG4gWnVsYXVmIDxqenVsYXVmQGx1bmFyZy5jb20+CisgKi8KKworLy8gQWxsb3cgdXNlIG9mIFNUTCBtaW4gYW5kIG1heCBmdW5jdGlvbnMgaW4gV2luZG93cworI2RlZmluZSBOT01JTk1BWAorCisjaW5jbHVkZSAiY2hhc3Npcy5oIgorI2luY2x1ZGUgImNvcmVfdmFsaWRhdGlvbl9lcnJvcl9lbnVtcy5oIgorI2luY2x1ZGUgImNvcmVfdmFsaWRhdGlvbi5oIgorI2luY2x1ZGUgImRlc2NyaXB0b3Jfc2V0cy5oIgorI2luY2x1ZGUgImhhc2hfdmtfdHlwZXMuaCIKKyNpbmNsdWRlICJ2a19lbnVtX3N0cmluZ19oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19zYWZlX3N0cnVjdC5oIgorI2luY2x1ZGUgInZrX3R5cGVtYXBfaGVscGVyLmgiCisjaW5jbHVkZSAiYnVmZmVyX3ZhbGlkYXRpb24uaCIKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8vIEV4dGVuZGVkQmluZGluZyBjb2xsZWN0cyBhIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgYW5kIGFueSBleHRlbmRlZAorLy8gc3RhdGUgdGhhdCBjb21lcyBmcm9tIGEgZGlmZmVyZW50IGFycmF5L3N0cnVjdHVyZSBzbyB0aGV5IGNhbiBzdGF5IHRvZ2V0aGVyCisvLyB3aGlsZSBiZWluZyBzb3J0ZWQgYnkgYmluZGluZyBudW1iZXIuCitzdHJ1Y3QgRXh0ZW5kZWRCaW5kaW5nIHsKKyAgICBFeHRlbmRlZEJpbmRpbmcoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyAqbCwgVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUIGYpIDogbGF5b3V0X2JpbmRpbmcobCksIGJpbmRpbmdfZmxhZ3MoZikge30KKworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgKmxheW91dF9iaW5kaW5nOworICAgIFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCBiaW5kaW5nX2ZsYWdzOworfTsKKworc3RydWN0IEJpbmRpbmdOdW1DbXAgeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBFeHRlbmRlZEJpbmRpbmcgJmEsIGNvbnN0IEV4dGVuZGVkQmluZGluZyAmYikgY29uc3QgeworICAgICAgICByZXR1cm4gYS5sYXlvdXRfYmluZGluZy0+YmluZGluZyA8IGIubGF5b3V0X2JpbmRpbmctPmJpbmRpbmc7CisgICAgfQorfTsKKwordXNpbmcgRGVzY3JpcHRvclNldCA9IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldDsKK3VzaW5nIERlc2NyaXB0b3JTZXRMYXlvdXQgPSBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXQ7Cit1c2luZyBEZXNjcmlwdG9yU2V0TGF5b3V0RGVmID0gY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0RGVmOwordXNpbmcgRGVzY3JpcHRvclNldExheW91dElkID0gY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0SWQ7CisKKy8vIENhbm9uaWNhbCBkaWN0aW9uYXJ5IG9mIERlc2NyaXB0b3JTZXRMYXlvdXREZWYgKHdpdGhvdXQgYW55IGhhbmRsZS9kZXZpY2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24pCitjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREaWN0IGRlc2NyaXB0b3Jfc2V0X2xheW91dF9kaWN0OworCitEZXNjcmlwdG9yU2V0TGF5b3V0SWQgR2V0Q2Fub25pY2FsSWQoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcF9jcmVhdGVfaW5mbykgeworICAgIHJldHVybiBkZXNjcmlwdG9yX3NldF9sYXlvdXRfZGljdC5sb29rX3VwKERlc2NyaXB0b3JTZXRMYXlvdXREZWYocF9jcmVhdGVfaW5mbykpOworfQorCisvLyBDb25zdHJ1Y3QgRGVzY3JpcHRvclNldExheW91dCBpbnN0YW5jZSBmcm9tIGdpdmVuIGNyZWF0ZSBpbmZvCisvLyBQcm9hY3RpdmVseSByZXNlcnZlIGFuZCByZXNpemUgYXMgcG9zc2libGUsIGFzIHRoZSByZWFsbG9jYXRpb24gd2FzIHZpc2libGUgaW4gcHJvZmlsaW5nCitjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWY6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWYoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcF9jcmVhdGVfaW5mbykKKyAgICA6IGZsYWdzXyhwX2NyZWF0ZV9pbmZvLT5mbGFncyksIGJpbmRpbmdfY291bnRfKDApLCBkZXNjcmlwdG9yX2NvdW50XygwKSwgZHluYW1pY19kZXNjcmlwdG9yX2NvdW50XygwKSB7CisgICAgY29uc3QgYXV0byAqZmxhZ3NfY3JlYXRlX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUPihwX2NyZWF0ZV9pbmZvLT5wTmV4dCk7CisKKyAgICBiaW5kaW5nX3R5cGVfc3RhdHNfID0gezAsIDAsIDB9OworICAgIHN0ZDo6c2V0PEV4dGVuZGVkQmluZGluZywgQmluZGluZ051bUNtcD4gc29ydGVkX2JpbmRpbmdzOworICAgIGNvbnN0IHVpbnQzMl90IGlucHV0X2JpbmRpbmdzX2NvdW50ID0gcF9jcmVhdGVfaW5mby0+YmluZGluZ0NvdW50OworICAgIC8vIFNvcnQgdGhlIGlucHV0IGJpbmRpbmdzIGluIGJpbmRpbmcgbnVtYmVyIG9yZGVyLCBlbGltaW5hdGluZyBkdXBsaWNhdGVzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGlucHV0X2JpbmRpbmdzX2NvdW50OyBpKyspIHsKKyAgICAgICAgVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUIGZsYWdzID0gMDsKKyAgICAgICAgaWYgKGZsYWdzX2NyZWF0ZV9pbmZvICYmIGZsYWdzX2NyZWF0ZV9pbmZvLT5iaW5kaW5nQ291bnQgPT0gcF9jcmVhdGVfaW5mby0+YmluZGluZ0NvdW50KSB7CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzX2NyZWF0ZV9pbmZvLT5wQmluZGluZ0ZsYWdzW2ldOworICAgICAgICB9CisgICAgICAgIHNvcnRlZF9iaW5kaW5ncy5pbnNlcnQoRXh0ZW5kZWRCaW5kaW5nKHBfY3JlYXRlX2luZm8tPnBCaW5kaW5ncyArIGksIGZsYWdzKSk7CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIGNyZWF0ZSBpbmZvIGluIHRoZSBzb3J0ZWQgb3JkZXIgZnJvbSBhYm92ZQorICAgIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gYmluZGluZ190b19keW5fY291bnQ7CisgICAgdWludDMyX3QgaW5kZXggPSAwOworICAgIGJpbmRpbmdfY291bnRfID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNvcnRlZF9iaW5kaW5ncy5zaXplKCkpOworICAgIGJpbmRpbmdzXy5yZXNlcnZlKGJpbmRpbmdfY291bnRfKTsKKyAgICBiaW5kaW5nX2ZsYWdzXy5yZXNlcnZlKGJpbmRpbmdfY291bnRfKTsKKyAgICBiaW5kaW5nX3RvX2luZGV4X21hcF8ucmVzZXJ2ZShiaW5kaW5nX2NvdW50Xyk7CisgICAgZm9yIChhdXRvIGlucHV0X2JpbmRpbmcgOiBzb3J0ZWRfYmluZGluZ3MpIHsKKyAgICAgICAgLy8gQWRkIHRvIGJpbmRpbmcgYW5kIG1hcCwgcy50LiBpdCBpcyByb2J1c3QgdG8gaW52YWxpZCBkdXBsaWNhdGlvbiBvZiBiaW5kaW5nX251bQorICAgICAgICBjb25zdCBhdXRvIGJpbmRpbmdfbnVtID0gaW5wdXRfYmluZGluZy5sYXlvdXRfYmluZGluZy0+YmluZGluZzsKKyAgICAgICAgYmluZGluZ190b19pbmRleF9tYXBfW2JpbmRpbmdfbnVtXSA9IGluZGV4Kys7CisgICAgICAgIGJpbmRpbmdzXy5lbXBsYWNlX2JhY2soaW5wdXRfYmluZGluZy5sYXlvdXRfYmluZGluZyk7CisgICAgICAgIGF1dG8gJmJpbmRpbmdfaW5mbyA9IGJpbmRpbmdzXy5iYWNrKCk7CisgICAgICAgIGJpbmRpbmdfZmxhZ3NfLmVtcGxhY2VfYmFjayhpbnB1dF9iaW5kaW5nLmJpbmRpbmdfZmxhZ3MpOworCisgICAgICAgIGRlc2NyaXB0b3JfY291bnRfICs9IGJpbmRpbmdfaW5mby5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgIGlmIChiaW5kaW5nX2luZm8uZGVzY3JpcHRvckNvdW50ID4gMCkgeworICAgICAgICAgICAgbm9uX2VtcHR5X2JpbmRpbmdzXy5pbnNlcnQoYmluZGluZ19udW0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJpbmRpbmdfaW5mby5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyB8fAorICAgICAgICAgICAgYmluZGluZ19pbmZvLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDKSB7CisgICAgICAgICAgICBiaW5kaW5nX3RvX2R5bl9jb3VudFtiaW5kaW5nX251bV0gPSBiaW5kaW5nX2luZm8uZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgZHluYW1pY19kZXNjcmlwdG9yX2NvdW50XyArPSBiaW5kaW5nX2luZm8uZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgYmluZGluZ190eXBlX3N0YXRzXy5keW5hbWljX2J1ZmZlcl9jb3VudCsrOworICAgICAgICB9IGVsc2UgaWYgKChiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSKSB8fAorICAgICAgICAgICAgICAgICAgIChiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSKSkgeworICAgICAgICAgICAgYmluZGluZ190eXBlX3N0YXRzXy5ub25fZHluYW1pY19idWZmZXJfY291bnQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpbmRpbmdfdHlwZV9zdGF0c18uaW1hZ2Vfc2FtcGxlcl9jb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIGFzc2VydChiaW5kaW5nc18uc2l6ZSgpID09IGJpbmRpbmdfY291bnRfKTsKKyAgICBhc3NlcnQoYmluZGluZ19mbGFnc18uc2l6ZSgpID09IGJpbmRpbmdfY291bnRfKTsKKyAgICB1aW50MzJfdCBnbG9iYWxfaW5kZXggPSAwOworICAgIGdsb2JhbF9pbmRleF9yYW5nZV8ucmVzZXJ2ZShiaW5kaW5nX2NvdW50Xyk7CisgICAgLy8gVmVjdG9yIG9yZGVyIGlzIGZpbmFsaXplZCBzbyBidWlsZCB2ZWN0b3JzIG9mIGRlc2NyaXB0b3JzIGFuZCBkeW5hbWljIG9mZnNldHMgYnkgYmluZGluZyBpbmRleAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kaW5nX2NvdW50XzsgKytpKSB7CisgICAgICAgIGF1dG8gZmluYWxfaW5kZXggPSBnbG9iYWxfaW5kZXggKyBiaW5kaW5nc19baV0uZGVzY3JpcHRvckNvdW50OworICAgICAgICBnbG9iYWxfaW5kZXhfcmFuZ2VfLmVtcGxhY2VfYmFjayhnbG9iYWxfaW5kZXgsIGZpbmFsX2luZGV4KTsKKyAgICAgICAgZ2xvYmFsX2luZGV4ID0gZmluYWxfaW5kZXg7CisgICAgfQorCisgICAgLy8gTm93IGNyZWF0ZSBkeW4gb2Zmc2V0IGFycmF5IG1hcHBpbmcgZm9yIGFueSBkeW5hbWljIGRlc2NyaXB0b3JzCisgICAgdWludDMyX3QgZHluX2FycmF5X2lkeCA9IDA7CisgICAgYmluZGluZ190b19keW5hbWljX2FycmF5X2lkeF9tYXBfLnJlc2VydmUoYmluZGluZ190b19keW5fY291bnQuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmJjX3BhaXIgOiBiaW5kaW5nX3RvX2R5bl9jb3VudCkgeworICAgICAgICBiaW5kaW5nX3RvX2R5bmFtaWNfYXJyYXlfaWR4X21hcF9bYmNfcGFpci5maXJzdF0gPSBkeW5fYXJyYXlfaWR4OworICAgICAgICBkeW5fYXJyYXlfaWR4ICs9IGJjX3BhaXIuc2Vjb25kOworICAgIH0KK30KKworc2l6ZV90IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dERlZjo6aGFzaCgpIGNvbnN0IHsKKyAgICBoYXNoX3V0aWw6Okhhc2hDb21iaW5lciBoYzsKKyAgICBoYyA8PCBmbGFnc187CisgICAgaGMuQ29tYmluZShiaW5kaW5nc18pOworICAgIGhjLkNvbWJpbmUoYmluZGluZ19mbGFnc18pOworICAgIHJldHVybiBoYy5WYWx1ZSgpOworfQorLy8KKworLy8gUmV0dXJuIHZhbGlkIGluZGV4IG9yICJlbmQiIGkuZS4gYmluZGluZ19jb3VudF87CisvLyBUaGUgYXNzZXJ0cyBpbiAiR2V0IiBhcmUgcmVkdWNlZCB0byB0aGUgc2V0IHdoZXJlIG5vIHZhbGlkIGFuc3dlcihsaWtlIG51bGwgb3IgMCkgY291bGQgYmUgZ2l2ZW4KKy8vIENvbW1vbiBjb2RlIGZvciBhbGwgYmluZGluZyBsb29rdXBzLgordWludDMyX3QgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0RGVmOjpHZXRJbmRleEZyb21CaW5kaW5nKHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvICZiaV9pdHIgPSBiaW5kaW5nX3RvX2luZGV4X21hcF8uZmluZChiaW5kaW5nKTsKKyAgICBpZiAoYmlfaXRyICE9IGJpbmRpbmdfdG9faW5kZXhfbWFwXy5jZW5kKCkpIHJldHVybiBiaV9pdHItPnNlY29uZDsKKyAgICByZXR1cm4gR2V0QmluZGluZ0NvdW50KCk7Cit9CitWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGNvbnN0ICpjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWY6OkdldERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nUHRyRnJvbUluZGV4KAorICAgIGNvbnN0IHVpbnQzMl90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGluZGV4ID49IGJpbmRpbmdzXy5zaXplKCkpIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBiaW5kaW5nc19baW5kZXhdLnB0cigpOworfQorLy8gUmV0dXJuIGRlc2NyaXB0b3JDb3VudCBmb3IgZ2l2ZW4gaW5kZXgsIDAgaWYgaW5kZXggaXMgdW5hdmFpbGFibGUKK3VpbnQzMl90IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dERlZjo6R2V0RGVzY3JpcHRvckNvdW50RnJvbUluZGV4KGNvbnN0IHVpbnQzMl90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGluZGV4ID49IGJpbmRpbmdzXy5zaXplKCkpIHJldHVybiAwOworICAgIHJldHVybiBiaW5kaW5nc19baW5kZXhdLmRlc2NyaXB0b3JDb3VudDsKK30KKy8vIEZvciB0aGUgZ2l2ZW4gaW5kZXgsIHJldHVybiBkZXNjcmlwdG9yVHlwZQorVmtEZXNjcmlwdG9yVHlwZSBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWY6OkdldFR5cGVGcm9tSW5kZXgoY29uc3QgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaW5kZXggPCBiaW5kaW5nc18uc2l6ZSgpKTsKKyAgICBpZiAoaW5kZXggPCBiaW5kaW5nc18uc2l6ZSgpKSByZXR1cm4gYmluZGluZ3NfW2luZGV4XS5kZXNjcmlwdG9yVHlwZTsKKyAgICByZXR1cm4gVktfREVTQ1JJUFRPUl9UWVBFX01BWF9FTlVNOworfQorLy8gRm9yIHRoZSBnaXZlbiBpbmRleCwgcmV0dXJuIHN0YWdlRmxhZ3MKK1ZrU2hhZGVyU3RhZ2VGbGFncyBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWY6OkdldFN0YWdlRmxhZ3NGcm9tSW5kZXgoY29uc3QgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaW5kZXggPCBiaW5kaW5nc18uc2l6ZSgpKTsKKyAgICBpZiAoaW5kZXggPCBiaW5kaW5nc18uc2l6ZSgpKSByZXR1cm4gYmluZGluZ3NfW2luZGV4XS5zdGFnZUZsYWdzOworICAgIHJldHVybiBWa1NoYWRlclN0YWdlRmxhZ3MoMCk7Cit9CisvLyBSZXR1cm4gYmluZGluZyBmbGFncyBmb3IgZ2l2ZW4gaW5kZXgsIDAgaWYgaW5kZXggaXMgdW5hdmFpbGFibGUKK1ZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWY6OkdldERlc2NyaXB0b3JCaW5kaW5nRmxhZ3NGcm9tSW5kZXgoCisgICAgY29uc3QgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoaW5kZXggPj0gYmluZGluZ19mbGFnc18uc2l6ZSgpKSByZXR1cm4gMDsKKyAgICByZXR1cm4gYmluZGluZ19mbGFnc19baW5kZXhdOworfQorCitjb25zdCBjdmRlc2NyaXB0b3JzZXQ6OkluZGV4UmFuZ2UgJmN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dERlZjo6R2V0R2xvYmFsSW5kZXhSYW5nZUZyb21JbmRleCh1aW50MzJfdCBpbmRleCkgY29uc3QgeworICAgIGNvbnN0IHN0YXRpYyBJbmRleFJhbmdlIGtJbnZhbGlkUmFuZ2UgPSB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn07CisgICAgaWYgKGluZGV4ID49IGJpbmRpbmdfZmxhZ3NfLnNpemUoKSkgcmV0dXJuIGtJbnZhbGlkUmFuZ2U7CisgICAgcmV0dXJuIGdsb2JhbF9pbmRleF9yYW5nZV9baW5kZXhdOworfQorCisvLyBGb3IgdGhlIGdpdmVuIGJpbmRpbmcsIHJldHVybiB0aGUgZ2xvYmFsIGluZGV4IHJhbmdlIChoYWxmIG9wZW4pCisvLyBBcyBzdGFydCBhbmQgZW5kIGFyZSBvZnRlbiBuZWVkZWQgaW4gcGFpcnMsIGdldCBib3RoIHdpdGggYSBzaW5nbGUgbG9va3VwLgorY29uc3QgY3ZkZXNjcmlwdG9yc2V0OjpJbmRleFJhbmdlICZjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWY6OkdldEdsb2JhbEluZGV4UmFuZ2VGcm9tQmluZGluZygKKyAgICBjb25zdCB1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgdWludDMyX3QgaW5kZXggPSBHZXRJbmRleEZyb21CaW5kaW5nKGJpbmRpbmcpOworICAgIHJldHVybiBHZXRHbG9iYWxJbmRleFJhbmdlRnJvbUluZGV4KGluZGV4KTsKK30KKworLy8gRm9yIGdpdmVuIGJpbmRpbmcsIHJldHVybiBwdHIgdG8gSW1tdXRhYmxlU2FtcGxlciBhcnJheQorVmtTYW1wbGVyIGNvbnN0ICpjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWY6OkdldEltbXV0YWJsZVNhbXBsZXJQdHJGcm9tQmluZGluZyhjb25zdCB1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAmYmlfaXRyID0gYmluZGluZ190b19pbmRleF9tYXBfLmZpbmQoYmluZGluZyk7CisgICAgaWYgKGJpX2l0ciAhPSBiaW5kaW5nX3RvX2luZGV4X21hcF8uZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmdzX1tiaV9pdHItPnNlY29uZF0ucEltbXV0YWJsZVNhbXBsZXJzOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKy8vIE1vdmUgdG8gbmV4dCB2YWxpZCBiaW5kaW5nIGhhdmluZyBhIG5vbi16ZXJvIGJpbmRpbmcgY291bnQKK3VpbnQzMl90IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dERlZjo6R2V0TmV4dFZhbGlkQmluZGluZyhjb25zdCB1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgYXV0byBpdCA9IG5vbl9lbXB0eV9iaW5kaW5nc18udXBwZXJfYm91bmQoYmluZGluZyk7CisgICAgYXNzZXJ0KGl0ICE9IG5vbl9lbXB0eV9iaW5kaW5nc18uY2VuZCgpKTsKKyAgICBpZiAoaXQgIT0gbm9uX2VtcHR5X2JpbmRpbmdzXy5jZW5kKCkpIHJldHVybiAqaXQ7CisgICAgcmV0dXJuIEdldE1heEJpbmRpbmcoKSArIDE7Cit9CisvLyBGb3IgZ2l2ZW4gaW5kZXgsIHJldHVybiBwdHIgdG8gSW1tdXRhYmxlU2FtcGxlciBhcnJheQorVmtTYW1wbGVyIGNvbnN0ICpjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXREZWY6OkdldEltbXV0YWJsZVNhbXBsZXJQdHJGcm9tSW5kZXgoY29uc3QgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoaW5kZXggPCBiaW5kaW5nc18uc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBiaW5kaW5nc19baW5kZXhdLnBJbW11dGFibGVTYW1wbGVyczsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIElmIG91ciBsYXlvdXQgaXMgY29tcGF0aWJsZSB3aXRoIHJoX2RzX2xheW91dCwgcmV0dXJuIHRydWUuCitib29sIGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dDo6SXNDb21wYXRpYmxlKERlc2NyaXB0b3JTZXRMYXlvdXQgY29uc3QgKnJoX2RzX2xheW91dCkgY29uc3QgeworICAgIGJvb2wgY29tcGF0aWJsZSA9ICh0aGlzID09IHJoX2RzX2xheW91dCkgfHwgKEdldExheW91dERlZigpID09IHJoX2RzX2xheW91dC0+R2V0TGF5b3V0RGVmKCkpOworICAgIHJldHVybiBjb21wYXRpYmxlOworfQorCisvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIGFkZCBzbWFydHMgdG8gdGhlIGF1dG9nZW5lcmF0ZWQgdmVyc2lvbiBvZiB0aGlzCitzdGF0aWMgc3RkOjpzdHJpbmcgc21hcnRfc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFncyhWa1NoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VfZmxhZ3MpIHsKKyAgICBpZiAoc3RhZ2VfZmxhZ3MgPT0gVktfU0hBREVSX1NUQUdFX0FMTCkgeworICAgICAgICByZXR1cm4gc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFnQml0cyhWS19TSEFERVJfU1RBR0VfQUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFncyhzdGFnZV9mbGFncyk7Cit9CisKKy8vIElmIG91ciBsYXlvdXQgaXMgY29tcGF0aWJsZSB3aXRoIGJvdW5kX2RzbCwgcmV0dXJuIHRydWUsCisvLyAgZWxzZSByZXR1cm4gZmFsc2UgYW5kIGZpbGwgaW4gZXJyb3JfbXNnIHdpbGwgZGVzY3JpcHRpb24gb2Ygd2hhdCBjYXVzZXMgaW5jb21wYXRpYmlsaXR5Citib29sIGN2ZGVzY3JpcHRvcnNldDo6VmVyaWZ5U2V0TGF5b3V0Q29tcGF0aWJpbGl0eShjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIERlc2NyaXB0b3JTZXRMYXlvdXQgY29uc3QgKmxheW91dF9kc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbnN0ICpib3VuZF9kc2wsIHN0ZDo6c3RyaW5nICplcnJvcl9tc2cpIHsKKyAgICAvLyBTaG9ydCBjaXJjdWl0IHRoZSBkZXRhaWxlZCBjaGVjay4KKyAgICBpZiAobGF5b3V0X2RzbC0+SXNDb21wYXRpYmxlKGJvdW5kX2RzbCkpIHJldHVybiB0cnVlOworCisgICAgLy8gRG8gYSBkZXRhaWxlZCBjb21wYXRpYmlsaXR5IGNoZWNrIG9mIHRoaXMgbGhzIGRlZiAocmVmZXJlbmNlZCBieSBsYXlvdXRfZHNsKSwgdnMuIHRoZSByaHMgKGxheW91dCBhbmQgZGVmKQorICAgIC8vIFNob3VsZCBvbmx5IGJlIHJ1biBpZiB0cml2aWFsIGFjY2VwdCBoYXMgZmFpbGVkLCBhbmQgaW4gdGhhdCBjb250ZXh0IHNob3VsZCByZXR1cm4gZmFsc2UuCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGxheW91dF9kc2xfaGFuZGxlID0gbGF5b3V0X2RzbC0+R2V0RGVzY3JpcHRvclNldExheW91dCgpOworICAgIFZrRGVzY3JpcHRvclNldExheW91dCBib3VuZF9kc2xfaGFuZGxlID0gYm91bmRfZHNsLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0KCk7CisgICAgRGVzY3JpcHRvclNldExheW91dERlZiBjb25zdCAqbGF5b3V0X2RzX2xheW91dF9kZWYgPSBsYXlvdXRfZHNsLT5HZXRMYXlvdXREZWYoKTsKKyAgICBEZXNjcmlwdG9yU2V0TGF5b3V0RGVmIGNvbnN0ICpib3VuZF9kc19sYXlvdXRfZGVmID0gYm91bmRfZHNsLT5HZXRMYXlvdXREZWYoKTsKKworICAgIC8vIENoZWNrIGRlc2NyaXB0b3IgY291bnRzCisgICAgY29uc3QgYXV0byBib3VuZF90b3RhbF9jb3VudCA9IGJvdW5kX2RzX2xheW91dF9kZWYtPkdldFRvdGFsRGVzY3JpcHRvckNvdW50KCk7CisgICAgaWYgKGxheW91dF9kc19sYXlvdXRfZGVmLT5HZXRUb3RhbERlc2NyaXB0b3JDb3VudCgpICE9IGJvdW5kX2RzX2xheW91dF9kZWYtPkdldFRvdGFsRGVzY3JpcHRvckNvdW50KCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICBlcnJvcl9zdHIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShsYXlvdXRfZHNsX2hhbmRsZSkgPDwgIiBmcm9tIHBpcGVsaW5lIGxheW91dCBoYXMgIgorICAgICAgICAgICAgICAgICAgPDwgbGF5b3V0X2RzX2xheW91dF9kZWYtPkdldFRvdGFsRGVzY3JpcHRvckNvdW50KCkgPDwgIiB0b3RhbCBkZXNjcmlwdG9ycywgYnV0ICIKKyAgICAgICAgICAgICAgICAgIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYm91bmRfZHNsX2hhbmRsZSkgPDwgIiwgd2hpY2ggaXMgYm91bmQsIGhhcyAiIDw8IGJvdW5kX3RvdGFsX2NvdW50CisgICAgICAgICAgICAgICAgICA8PCAiIHRvdGFsIGRlc2NyaXB0b3JzLiI7CisgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIHRyaXZpYWwgZmFpbCBjYXNlCisgICAgfQorCisgICAgLy8gRGVzY3JpcHRvciBjb3VudHMgbWF0Y2ggc28gbmVlZCB0byBnbyB0aHJvdWdoIGJpbmRpbmdzIG9uZS1ieS1vbmUKKyAgICAvLyAgYW5kIHZlcmlmeSB0aGF0IHR5cGUgYW5kIHN0YWdlRmxhZ3MgbWF0Y2gKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmxheW91dF9iaW5kaW5nIDogbGF5b3V0X2RzX2xheW91dF9kZWYtPkdldEJpbmRpbmdzKCkpIHsKKyAgICAgICAgLy8gVE9ETyA6IERvIHdlIGFsc28gbmVlZCB0byBjaGVjayBpbW11dGFibGUgc2FtcGxlcnM/CisgICAgICAgIGNvbnN0IGF1dG8gYm91bmRfYmluZGluZyA9IGJvdW5kX2RzX2xheW91dF9kZWYtPkdldEJpbmRpbmdJbmZvRnJvbUJpbmRpbmcobGF5b3V0X2JpbmRpbmcuYmluZGluZyk7CisgICAgICAgIGlmIChsYXlvdXRfYmluZGluZy5kZXNjcmlwdG9yQ291bnQgIT0gYm91bmRfYmluZGluZy0+ZGVzY3JpcHRvckNvdW50KSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkJpbmRpbmcgIiA8PCBsYXlvdXRfYmluZGluZy5iaW5kaW5nIDw8ICIgZm9yICIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShsYXlvdXRfZHNsX2hhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZyb20gcGlwZWxpbmUgbGF5b3V0IGhhcyBhIGRlc2NyaXB0b3JDb3VudCBvZiAiIDw8IGxheW91dF9iaW5kaW5nLmRlc2NyaXB0b3JDb3VudCA8PCAiIGJ1dCBiaW5kaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBsYXlvdXRfYmluZGluZy5iaW5kaW5nIDw8ICIgZm9yICIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShib3VuZF9kc2xfaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHdoaWNoIGlzIGJvdW5kLCBoYXMgYSBkZXNjcmlwdG9yQ291bnQgb2YgIiA8PCBib3VuZF9iaW5kaW5nLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGxheW91dF9iaW5kaW5nLmRlc2NyaXB0b3JUeXBlICE9IGJvdW5kX2JpbmRpbmctPmRlc2NyaXB0b3JUeXBlKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkJpbmRpbmcgIiA8PCBsYXlvdXRfYmluZGluZy5iaW5kaW5nIDw8ICIgZm9yICIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShsYXlvdXRfZHNsX2hhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZyb20gcGlwZWxpbmUgbGF5b3V0IGlzIHR5cGUgJyIgPDwgc3RyaW5nX1ZrRGVzY3JpcHRvclR5cGUobGF5b3V0X2JpbmRpbmcuZGVzY3JpcHRvclR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIicgYnV0IGJpbmRpbmcgIiA8PCBsYXlvdXRfYmluZGluZy5iaW5kaW5nIDw8ICIgZm9yICIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShib3VuZF9kc2xfaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHdoaWNoIGlzIGJvdW5kLCBpcyB0eXBlICciIDw8IHN0cmluZ19Wa0Rlc2NyaXB0b3JUeXBlKGJvdW5kX2JpbmRpbmctPmRlc2NyaXB0b3JUeXBlKSA8PCAiJyI7CisgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGxheW91dF9iaW5kaW5nLnN0YWdlRmxhZ3MgIT0gYm91bmRfYmluZGluZy0+c3RhZ2VGbGFncykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJCaW5kaW5nICIgPDwgbGF5b3V0X2JpbmRpbmcuYmluZGluZyA8PCAiIGZvciAiIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobGF5b3V0X2RzbF9oYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmcm9tIHBpcGVsaW5lIGxheW91dCBoYXMgc3RhZ2VGbGFncyAiIDw8IHNtYXJ0X3N0cmluZ19Wa1NoYWRlclN0YWdlRmxhZ3MobGF5b3V0X2JpbmRpbmcuc3RhZ2VGbGFncykKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJ1dCBiaW5kaW5nICIgPDwgbGF5b3V0X2JpbmRpbmcuYmluZGluZyA8PCAiIGZvciAiIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYm91bmRfZHNsX2hhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiLCB3aGljaCBpcyBib3VuZCwgaGFzIHN0YWdlRmxhZ3MgIiA8PCBzbWFydF9zdHJpbmdfVmtTaGFkZXJTdGFnZUZsYWdzKGJvdW5kX2JpbmRpbmctPnN0YWdlRmxhZ3MpOworICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGF1dG8gJmRzX2xheW91dF9mbGFncyA9IGxheW91dF9kc19sYXlvdXRfZGVmLT5HZXRCaW5kaW5nRmxhZ3MoKTsKKyAgICBjb25zdCBhdXRvICZib3VuZF9sYXlvdXRfZmxhZ3MgPSBib3VuZF9kc19sYXlvdXRfZGVmLT5HZXRCaW5kaW5nRmxhZ3MoKTsKKyAgICBpZiAoYm91bmRfbGF5b3V0X2ZsYWdzICE9IGRzX2xheW91dF9mbGFncykgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgIGFzc2VydChkc19sYXlvdXRfZmxhZ3Muc2l6ZSgpID09IGJvdW5kX2xheW91dF9mbGFncy5zaXplKCkpOworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzX2xheW91dF9mbGFncy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGRzX2xheW91dF9mbGFnc1tpXSAhPSBib3VuZF9sYXlvdXRfZmxhZ3NbaV0pIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVycm9yX3N0ciA8PCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGxheW91dF9kc2xfaGFuZGxlKQorICAgICAgICAgICAgICAgICAgPDwgIiBmcm9tIHBpcGVsaW5lIGxheW91dCBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIGJpbmRpbmcgZmxhZ3MgYXQgYmluZGluZyAiIDw8IGkgPDwgIiAoICIKKyAgICAgICAgICAgICAgICAgIDw8IHN0cmluZ19Wa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQoZHNfbGF5b3V0X2ZsYWdzW2ldKSA8PCAiICkgYXMgIgorICAgICAgICAgICAgICAgICAgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShib3VuZF9kc2xfaGFuZGxlKSA8PCAiICggIgorICAgICAgICAgICAgICAgICAgPDwgc3RyaW5nX1ZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVChib3VuZF9sYXlvdXRfZmxhZ3NbaV0pIDw8ICIgKSwgd2hpY2ggaXMgYm91bmQiOworICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm8gZGV0YWlsZWQgY2hlY2sgc2hvdWxkIHN1Y2NlZWQgaWYgdGhlIHRyaXZpYWwgY2hlY2sgZmFpbGVkIC0tIG9yIHRoZSBkaWN0aW9uYXJ5IGhhcyBmYWlsZWQgc29tZWhvdy4KKyAgICBib29sIGNvbXBhdGlibGUgPSB0cnVlOworICAgIGFzc2VydCghY29tcGF0aWJsZSk7CisgICAgcmV0dXJuIGNvbXBhdGlibGU7Cit9CisKK2Jvb2wgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0RGVmOjpJc05leHRCaW5kaW5nQ29uc2lzdGVudChjb25zdCB1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgaWYgKCFiaW5kaW5nX3RvX2luZGV4X21hcF8uY291bnQoYmluZGluZyArIDEpKSByZXR1cm4gZmFsc2U7CisgICAgYXV0byBjb25zdCAmYmlfaXRyID0gYmluZGluZ190b19pbmRleF9tYXBfLmZpbmQoYmluZGluZyk7CisgICAgaWYgKGJpX2l0ciAhPSBiaW5kaW5nX3RvX2luZGV4X21hcF8uZW5kKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byAmbmV4dF9iaV9pdHIgPSBiaW5kaW5nX3RvX2luZGV4X21hcF8uZmluZChiaW5kaW5nICsgMSk7CisgICAgICAgIGlmIChuZXh0X2JpX2l0ciAhPSBiaW5kaW5nX3RvX2luZGV4X21hcF8uZW5kKCkpIHsKKyAgICAgICAgICAgIGF1dG8gdHlwZSA9IGJpbmRpbmdzX1tiaV9pdHItPnNlY29uZF0uZGVzY3JpcHRvclR5cGU7CisgICAgICAgICAgICBhdXRvIHN0YWdlX2ZsYWdzID0gYmluZGluZ3NfW2JpX2l0ci0+c2Vjb25kXS5zdGFnZUZsYWdzOworICAgICAgICAgICAgYXV0byBpbW11dF9zYW1wID0gYmluZGluZ3NfW2JpX2l0ci0+c2Vjb25kXS5wSW1tdXRhYmxlU2FtcGxlcnMgPyB0cnVlIDogZmFsc2U7CisgICAgICAgICAgICBhdXRvIGZsYWdzID0gYmluZGluZ19mbGFnc19bYmlfaXRyLT5zZWNvbmRdOworICAgICAgICAgICAgaWYgKCh0eXBlICE9IGJpbmRpbmdzX1tuZXh0X2JpX2l0ci0+c2Vjb25kXS5kZXNjcmlwdG9yVHlwZSkgfHwKKyAgICAgICAgICAgICAgICAoc3RhZ2VfZmxhZ3MgIT0gYmluZGluZ3NfW25leHRfYmlfaXRyLT5zZWNvbmRdLnN0YWdlRmxhZ3MpIHx8CisgICAgICAgICAgICAgICAgKGltbXV0X3NhbXAgIT0gKGJpbmRpbmdzX1tuZXh0X2JpX2l0ci0+c2Vjb25kXS5wSW1tdXRhYmxlU2FtcGxlcnMgPyB0cnVlIDogZmFsc2UpKSB8fAorICAgICAgICAgICAgICAgIChmbGFncyAhPSBiaW5kaW5nX2ZsYWdzX1tuZXh0X2JpX2l0ci0+c2Vjb25kXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFRoZSBEZXNjcmlwdG9yU2V0TGF5b3V0IHN0b3JlcyB0aGUgcGVyIGhhbmRsZSBkYXRhIGZvciBhIGRlc2NyaXB0b3Igc2V0IGxheW91dCwgYW5kIHJlZmVyZW5jZXMgdGhlIGNvbW1vbiBkZWZpbnRpb24gZm9yIHRoZQorLy8gaGFuZGxlIGludmFyaWFudCBwb3J0aW9uCitjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXQoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcF9jcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgbGF5b3V0KQorICAgIDogbGF5b3V0XyhsYXlvdXQpLCBsYXlvdXRfaWRfKEdldENhbm9uaWNhbElkKHBfY3JlYXRlX2luZm8pKSB7fQorCisvLyBWYWxpZGF0ZSBkZXNjcmlwdG9yIHNldCBsYXlvdXQgY3JlYXRlIGluZm8KK2Jvb2wgY3ZkZXNjcmlwdG9yc2V0OjpWYWxpZGF0ZURlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKAorICAgIGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqY3JlYXRlX2luZm8sIGNvbnN0IGJvb2wgcHVzaF9kZXNjcmlwdG9yX2V4dCwKKyAgICBjb25zdCB1aW50MzJfdCBtYXhfcHVzaF9kZXNjcmlwdG9ycywgY29uc3QgYm9vbCBkZXNjcmlwdG9yX2luZGV4aW5nX2V4dCwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgKmRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICppbmxpbmVfdW5pZm9ybV9ibG9ja19mZWF0dXJlcywKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCAqaW5saW5lX3VuaWZvcm1fYmxvY2tfcHJvcHMsIGNvbnN0IERldmljZUV4dGVuc2lvbnMgKmRldmljZV9leHRlbnNpb25zKSB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBiaW5kaW5nczsKKyAgICB1aW50NjRfdCB0b3RhbF9kZXNjcmlwdG9ycyA9IDA7CisKKyAgICBjb25zdCBhdXRvICpmbGFnc19jcmVhdGVfaW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQ+KGNyZWF0ZV9pbmZvLT5wTmV4dCk7CisKKyAgICBjb25zdCBib29sIHB1c2hfZGVzY3JpcHRvcl9zZXQgPSAhIShjcmVhdGVfaW5mby0+ZmxhZ3MgJiBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSKTsKKyAgICBpZiAocHVzaF9kZXNjcmlwdG9yX3NldCAmJiAhcHVzaF9kZXNjcmlwdG9yX2V4dCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX0RyYXdTdGF0ZV9FeHRlbnNpb25Ob3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byB1c2UgJXMgaW4gJXMgYnV0IGl0cyByZXF1aXJlZCBleHRlbnNpb24gJXMgaGFzIG5vdCBiZWVuIGVuYWJsZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIiLCAiVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbzo6ZmxhZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgY29uc3QgYm9vbCB1cGRhdGVfYWZ0ZXJfYmluZF9zZXQgPSAhIShjcmVhdGVfaW5mby0+ZmxhZ3MgJiBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCk7CisgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kX3NldCAmJiAhZGVzY3JpcHRvcl9pbmRleGluZ19leHQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9EcmF3U3RhdGVfRXh0ZW5zaW9uTm90RW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXBlZCB0byB1c2UgJXMgaW4gJXMgYnV0IGl0cyByZXF1aXJlZCBleHRlbnNpb24gJXMgaGFzIG5vdCBiZWVuIGVuYWJsZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUIiwgIlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm86OmZsYWdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVF9ERVNDUklQVE9SX0lOREVYSU5HX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBhdXRvIHZhbGlkX3R5cGUgPSBbcHVzaF9kZXNjcmlwdG9yX3NldF0oY29uc3QgVmtEZXNjcmlwdG9yVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiAhcHVzaF9kZXNjcmlwdG9yX3NldCB8fAorICAgICAgICAgICAgICAgKCh0eXBlICE9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDKSAmJiAodHlwZSAhPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQykgJiYKKyAgICAgICAgICAgICAgICAodHlwZSAhPSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUKSk7CisgICAgfTsKKworICAgIHVpbnQzMl90IG1heF9iaW5kaW5nID0gMDsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVfaW5mby0+YmluZGluZ0NvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXV0byAmYmluZGluZ19pbmZvID0gY3JlYXRlX2luZm8tPnBCaW5kaW5nc1tpXTsKKyAgICAgICAgbWF4X2JpbmRpbmcgPSBzdGQ6Om1heChtYXhfYmluZGluZywgYmluZGluZ19pbmZvLmJpbmRpbmcpOworCisgICAgICAgIGlmICghYmluZGluZ3MuaW5zZXJ0KGJpbmRpbmdfaW5mby5iaW5kaW5nKS5zZWNvbmQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWJpbmRpbmctMDAyNzkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGVkIGJpbmRpbmcgbnVtYmVyIGluIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF2YWxpZF90eXBlKGJpbmRpbmdfaW5mby5kZXNjcmlwdG9yVHlwZSkpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmluZGluZ19pbmZvLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy0wMjIwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLTAwMjgwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0eXBlICVzICxmb3IgcHVzaCBkZXNjcmlwdG9ycyBpbiBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGVudHJ5ICUiIFBSSXUzMiAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrRGVzY3JpcHRvclR5cGUoYmluZGluZ19pbmZvLmRlc2NyaXB0b3JUeXBlKSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmluZGluZ19pbmZvLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQpIHsKKyAgICAgICAgICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMtPnZrX2V4dF9pbmxpbmVfdW5pZm9ybV9ibG9jaykgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1FeHRlbnNpb24gbm90IGVuYWJsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRpbmcgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IHdpdGggZGVzY3JpcHRvciB0eXBlICBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBleHRlbnNpb24gJXMgaXMgbWlzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0VYVF9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoYmluZGluZ19pbmZvLmRlc2NyaXB0b3JDb3VudCAlIDQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZy1kZXNjcmlwdG9yVHlwZS0wMjIwOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvckNvdW50ID0oJSIgUFJJdTMyICIpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IiwgYmluZGluZ19pbmZvLmRlc2NyaXB0b3JDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nX2luZm8uZGVzY3JpcHRvckNvdW50ID4gaW5saW5lX3VuaWZvcm1fYmxvY2tfcHJvcHMtPm1heElubGluZVVuaWZvcm1CbG9ja1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZy1kZXNjcmlwdG9yVHlwZS0wMjIxMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvckNvdW50ID0oJSIgUFJJdTMyICIpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heElubGluZVVuaWZvcm1CbG9ja1NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ19pbmZvLmRlc2NyaXB0b3JDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG90YWxfZGVzY3JpcHRvcnMgKz0gYmluZGluZ19pbmZvLmRlc2NyaXB0b3JDb3VudDsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3NfY3JlYXRlX2luZm8pIHsKKyAgICAgICAgaWYgKGZsYWdzX2NyZWF0ZV9pbmZvLT5iaW5kaW5nQ291bnQgIT0gMCAmJiBmbGFnc19jcmVhdGVfaW5mby0+YmluZGluZ0NvdW50ICE9IGNyZWF0ZV9pbmZvLT5iaW5kaW5nQ291bnQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWJpbmRpbmdDb3VudC0wMzAwMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm86OmJpbmRpbmdDb3VudCAoJWQpICE9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVDo6YmluZGluZ0NvdW50ICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9pbmZvLT5iaW5kaW5nQ291bnQsIGZsYWdzX2NyZWF0ZV9pbmZvLT5iaW5kaW5nQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzX2NyZWF0ZV9pbmZvLT5iaW5kaW5nQ291bnQgPT0gY3JlYXRlX2luZm8tPmJpbmRpbmdDb3VudCkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNyZWF0ZV9pbmZvLT5iaW5kaW5nQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJmJpbmRpbmdfaW5mbyA9IGNyZWF0ZV9pbmZvLT5wQmluZGluZ3NbaV07CisKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3NfY3JlYXRlX2luZm8tPnBCaW5kaW5nRmxhZ3NbaV0gJiBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZV9hZnRlcl9iaW5kX3NldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtMDMwMDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZsYWdzIGZvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGVudHJ5ICUiIFBSSXUzMiwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ19pbmZvLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMtPmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQtMDMwMDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZsYWdzIGZvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGVudHJ5ICUiIFBSSXUzMiwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhZGVzY3JpcHRvcl9pbmRleGluZ19mZWF0dXJlcy0+ZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQtMDMwMDYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZsYWdzIGZvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGVudHJ5ICUiIFBSSXUzMiwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdfaW5mby5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMtPmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kLTAzMDA3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmbGFncyBmb3IgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBlbnRyeSAlIiBQUkl1MzIsIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhZGVzY3JpcHRvcl9pbmRleGluZ19mZWF0dXJlcy0+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZC0wMzAwOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZmxhZ3MgZm9yIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZW50cnkgJSIgUFJJdTMyLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ19pbmZvLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMtPmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kLTAzMDA5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmbGFncyBmb3IgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBlbnRyeSAlIiBQUkl1MzIsIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhZGVzY3JpcHRvcl9pbmRleGluZ19mZWF0dXJlcy0+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQtMDMwMTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZsYWdzIGZvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGVudHJ5ICUiIFBSSXUzMiwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nX2luZm8uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1Ob25lLTAzMDExIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmbGFncyBmb3IgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBlbnRyeSAlIiBQUkl1MzIsIGkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdfaW5mby5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhaW5saW5lX3VuaWZvcm1fYmxvY2tfZmVhdHVyZXMtPmRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kLTAyMjExIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmbGFncyAoVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQpIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZW50cnkgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kIG5vdCBlbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmbGFnc19jcmVhdGVfaW5mby0+cEJpbmRpbmdGbGFnc1tpXSAmIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMtPmRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZy0wMzAxMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZmxhZ3MgZm9yIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZW50cnkgJSIgUFJJdTMyLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmbGFnc19jcmVhdGVfaW5mby0+cEJpbmRpbmdGbGFnc1tpXSAmIFZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMtPmRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQtMDMwMTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZsYWdzIGZvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGVudHJ5ICUiIFBSSXUzMiwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3NfY3JlYXRlX2luZm8tPnBCaW5kaW5nRmxhZ3NbaV0gJiBWS19ERVNDUklQVE9SX0JJTkRJTkdfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9CSVRfRVhUKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nX2luZm8uYmluZGluZyAhPSBtYXhfYmluZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtcEJpbmRpbmdGbGFncy0wMzAwNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZmxhZ3MgZm9yIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZW50cnkgJSIgUFJJdTMyLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcl9pbmRleGluZ19mZWF0dXJlcy0+ZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudC0wMzAxNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZmxhZ3MgZm9yIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZW50cnkgJSIgUFJJdTMyLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGJpbmRpbmdfaW5mby5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdfaW5mby5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULXBCaW5kaW5nRmxhZ3MtMDMwMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZsYWdzIGZvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGVudHJ5ICUiIFBSSXUzMiwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHVzaF9kZXNjcmlwdG9yX3NldCAmJgorICAgICAgICAgICAgICAgICAgICAoZmxhZ3NfY3JlYXRlX2luZm8tPnBCaW5kaW5nRmxhZ3NbaV0gJgorICAgICAgICAgICAgICAgICAgICAgKFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUIHwgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9VTlVTRURfV0hJTEVfUEVORElOR19CSVRfRVhUIHwKKyAgICAgICAgICAgICAgICAgICAgICBWS19ERVNDUklQVE9SX0JJTkRJTkdfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9CSVRfRVhUKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1mbGFncy0wMzAwMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmbGFncyBmb3IgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBlbnRyeSAlIiBQUkl1MzIsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocHVzaF9kZXNjcmlwdG9yX3NldCkgJiYgKHRvdGFsX2Rlc2NyaXB0b3JzID4gbWF4X3B1c2hfZGVzY3JpcHRvcnMpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnVuZGVmaW5lZCA9IHB1c2hfZGVzY3JpcHRvcl9leHQgPyAiIiA6ICIgLS0gdW5kZWZpbmVkIjsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy0wMDI4MSIsCisgICAgICAgICAgICAgICAgICAgICJmb3IgcHVzaCBkZXNjcmlwdG9yLCB0b3RhbCBkZXNjcmlwdG9yIGNvdW50IGluIGxheW91dCAoJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAgICIpIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSOjptYXhQdXNoRGVzY3JpcHRvcnMgKCUiIFBSSXUzMiAiJXMpLiIsCisgICAgICAgICAgICAgICAgICAgIHRvdGFsX2Rlc2NyaXB0b3JzLCBtYXhfcHVzaF9kZXNjcmlwdG9ycywgdW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworY3ZkZXNjcmlwdG9yc2V0OjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzRGF0YTo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEodWludDMyX3QgY291bnQpCisgICAgOiByZXF1aXJlZF9kZXNjcmlwdG9yc19ieV90eXBle30sIGxheW91dF9ub2Rlcyhjb3VudCwgbnVsbHB0cikge30KKworY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0OjpEZXNjcmlwdG9yU2V0KGNvbnN0IFZrRGVzY3JpcHRvclNldCBzZXQsIERFU0NSSVBUT1JfUE9PTF9TVEFURSAqcG9vbF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RGVzY3JpcHRvclNldExheW91dCBjb25zdD4gJmxheW91dCwgdWludDMyX3QgdmFyaWFibGVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0OjpTdGF0ZVRyYWNrZXIgKnN0YXRlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhKQorICAgIDogc29tZV91cGRhdGVfKGZhbHNlKSwKKyAgICAgIHNldF8oc2V0KSwKKyAgICAgIHBvb2xfc3RhdGVfKHBvb2xfc3RhdGUpLAorICAgICAgcF9sYXlvdXRfKGxheW91dCksCisgICAgICByZXBvcnRfZGF0YV8ocmVwb3J0X2RhdGEpLAorICAgICAgdmFyaWFibGVfY291bnRfKHZhcmlhYmxlX2NvdW50KSwKKyAgICAgIGNoYW5nZV9jb3VudF8oMCkgeworICAgIC8vIEZvcmVhY2ggYmluZGluZywgY3JlYXRlIGRlZmF1bHQgZGVzY3JpcHRvcnMgb2YgZ2l2ZW4gdHlwZQorICAgIGRlc2NyaXB0b3JzXy5yZXNlcnZlKHBfbGF5b3V0Xy0+R2V0VG90YWxEZXNjcmlwdG9yQ291bnQoKSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBfbGF5b3V0Xy0+R2V0QmluZGluZ0NvdW50KCk7ICsraSkgeworICAgICAgICBhdXRvIHR5cGUgPSBwX2xheW91dF8tPkdldFR5cGVGcm9tSW5kZXgoaSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjogeworICAgICAgICAgICAgICAgIGF1dG8gaW1tdXRfc2FtcGxlciA9IHBfbGF5b3V0Xy0+R2V0SW1tdXRhYmxlU2FtcGxlclB0ckZyb21JbmRleChpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRpID0gMDsgZGkgPCBwX2xheW91dF8tPkdldERlc2NyaXB0b3JDb3VudEZyb21JbmRleChpKTsgKytkaSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW1tdXRfc2FtcGxlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNfLmVtcGxhY2VfYmFjayhuZXcgU2FtcGxlckRlc2NyaXB0b3Ioc3RhdGVfZGF0YSwgaW1tdXRfc2FtcGxlciArIGRpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzb21lX3VwZGF0ZV8gPSB0cnVlOyAgLy8gSW1tdXRhYmxlIHNhbXBsZXJzIGFyZSB1cGRhdGVkIGF0IGNyZWF0aW9uCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNfLmVtcGxhY2VfYmFjayhuZXcgU2FtcGxlckRlc2NyaXB0b3Ioc3RhdGVfZGF0YSwgbnVsbHB0cikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI6IHsKKyAgICAgICAgICAgICAgICBhdXRvIGltbXV0ID0gcF9sYXlvdXRfLT5HZXRJbW11dGFibGVTYW1wbGVyUHRyRnJvbUluZGV4KGkpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgZGkgPSAwOyBkaSA8IHBfbGF5b3V0Xy0+R2V0RGVzY3JpcHRvckNvdW50RnJvbUluZGV4KGkpOyArK2RpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbW11dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNfLmVtcGxhY2VfYmFjayhuZXcgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvcihzdGF0ZV9kYXRhLCBpbW11dCArIGRpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzb21lX3VwZGF0ZV8gPSB0cnVlOyAgLy8gSW1tdXRhYmxlIHNhbXBsZXJzIGFyZSB1cGRhdGVkIGF0IGNyZWF0aW9uCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNfLmVtcGxhY2VfYmFjayhuZXcgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvcihzdGF0ZV9kYXRhLCBudWxscHRyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW1hZ2VEZXNjcmlwdG9ycworICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRToKKyAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ6CisgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFOgorICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgZGkgPSAwOyBkaSA8IHBfbGF5b3V0Xy0+R2V0RGVzY3JpcHRvckNvdW50RnJvbUluZGV4KGkpOyArK2RpKQorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yc18uZW1wbGFjZV9iYWNrKG5ldyBJbWFnZURlc2NyaXB0b3IodHlwZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI6CisgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRpID0gMDsgZGkgPCBwX2xheW91dF8tPkdldERlc2NyaXB0b3JDb3VudEZyb21JbmRleChpKTsgKytkaSkKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNfLmVtcGxhY2VfYmFjayhuZXcgVGV4ZWxEZXNjcmlwdG9yKHR5cGUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOgorICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOgorICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRpID0gMDsgZGkgPCBwX2xheW91dF8tPkdldERlc2NyaXB0b3JDb3VudEZyb21JbmRleChpKTsgKytkaSkKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNfLmVtcGxhY2VfYmFjayhuZXcgQnVmZmVyRGVzY3JpcHRvcih0eXBlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ6CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkaSA9IDA7IGRpIDwgcF9sYXlvdXRfLT5HZXREZXNjcmlwdG9yQ291bnRGcm9tSW5kZXgoaSk7ICsrZGkpCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzXy5lbXBsYWNlX2JhY2sobmV3IElubGluZVVuaWZvcm1EZXNjcmlwdG9yKHR5cGUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY6CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkaSA9IDA7IGRpIDwgcF9sYXlvdXRfLT5HZXREZXNjcmlwdG9yQ291bnRGcm9tSW5kZXgoaSk7ICsrZGkpCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzXy5lbXBsYWNlX2JhY2sobmV3IEFjY2VsZXJhdGlvblN0cnVjdHVyZURlc2NyaXB0b3IodHlwZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7ICAvLyBCYWQgZGVzY3JpcHRvciB0eXBlIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQ6On5EZXNjcmlwdG9yU2V0KCkge30KKworc3RhdGljIHN0ZDo6c3RyaW5nIFN0cmluZ0Rlc2NyaXB0b3JSZXFWaWV3VHlwZShkZXNjcmlwdG9yX3JlcSByZXEpIHsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQoIiIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPD0gVktfSU1BR0VfVklFV19UWVBFX0VORF9SQU5HRTsgaSsrKSB7CisgICAgICAgIGlmIChyZXEgJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkpIHJlc3VsdCArPSAiLCAiOworICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZ19Wa0ltYWdlVmlld1R5cGUoVmtJbWFnZVZpZXdUeXBlKGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcmVzdWx0LnNpemUoKSkgcmVzdWx0ID0gIihub25lKSI7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgY2hhciBjb25zdCAqU3RyaW5nRGVzY3JpcHRvclJlcUNvbXBvbmVudFR5cGUoZGVzY3JpcHRvcl9yZXEgcmVxKSB7CisgICAgaWYgKHJlcSAmIERFU0NSSVBUT1JfUkVRX0NPTVBPTkVOVF9UWVBFX1NJTlQpIHJldHVybiAiU0lOVCI7CisgICAgaWYgKHJlcSAmIERFU0NSSVBUT1JfUkVRX0NPTVBPTkVOVF9UWVBFX1VJTlQpIHJldHVybiAiVUlOVCI7CisgICAgaWYgKHJlcSAmIERFU0NSSVBUT1JfUkVRX0NPTVBPTkVOVF9UWVBFX0ZMT0FUKSByZXR1cm4gIkZMT0FUIjsKKyAgICByZXR1cm4gIihub25lKSI7Cit9CisKK3Vuc2lnbmVkIERlc2NyaXB0b3JSZXF1aXJlbWVudHNCaXRzRnJvbUZvcm1hdChWa0Zvcm1hdCBmbXQpIHsKKyAgICBpZiAoRm9ybWF0SXNTSW50KGZtdCkpIHJldHVybiBERVNDUklQVE9SX1JFUV9DT01QT05FTlRfVFlQRV9TSU5UOworICAgIGlmIChGb3JtYXRJc1VJbnQoZm10KSkgcmV0dXJuIERFU0NSSVBUT1JfUkVRX0NPTVBPTkVOVF9UWVBFX1VJTlQ7CisgICAgaWYgKEZvcm1hdElzRGVwdGhBbmRTdGVuY2lsKGZtdCkpIHJldHVybiBERVNDUklQVE9SX1JFUV9DT01QT05FTlRfVFlQRV9GTE9BVCB8IERFU0NSSVBUT1JfUkVRX0NPTVBPTkVOVF9UWVBFX1VJTlQ7CisgICAgaWYgKGZtdCA9PSBWS19GT1JNQVRfVU5ERUZJTkVEKSByZXR1cm4gMDsKKyAgICAvLyBldmVyeXRoaW5nIGVsc2UgLS0gVU5PUk0vU05PUk0vRkxPQVQvVVNDQUxFRC9TU0NBTEVEIGlzIGFsbCBmbG9hdCBpbiB0aGUgc2hhZGVyLgorICAgIHJldHVybiBERVNDUklQVE9SX1JFUV9DT01QT05FTlRfVFlQRV9GTE9BVDsKK30KKworLy8gVmFsaWRhdGUgdGhhdCB0aGUgc3RhdGUgb2YgdGhpcyBzZXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBiaW5kaW5ncyBhbmQgZHluYW1pY19vZmZzZXRzIGF0IERyYXcgdGltZQorLy8gIFRoaXMgaW5jbHVkZXMgdmFsaWRhdGluZyB0aGF0IGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgZ2l2ZW4gYmluZGluZ3MgYXJlIHVwZGF0ZWQsCisvLyAgdGhhdCBhbnkgdXBkYXRlIGJ1ZmZlcnMgYXJlIHZhbGlkLCBhbmQgdGhhdCBhbnkgZHluYW1pYyBvZmZzZXRzIGFyZSB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGVpciBidWZmZXJzLgorLy8gUmV0dXJuIHRydWUgaWYgc3RhdGUgaXMgYWNjZXB0YWJsZSwgb3IgZmFsc2UgYW5kIHdyaXRlIGFuIGVycm9yIG1lc3NhZ2UgaW50byBlcnJvciBzdHJpbmcKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVEcmF3U3RhdGUoY29uc3QgRGVzY3JpcHRvclNldCAqZGVzY3JpcHRvcl9zZXQsIGNvbnN0IHN0ZDo6bWFwPHVpbnQzMl90LCBkZXNjcmlwdG9yX3JlcT4gJmJpbmRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gJmR5bmFtaWNfb2Zmc2V0cywgY29uc3QgQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY2FsbGVyLCBzdGQ6OnN0cmluZyAqZXJyb3IpIGNvbnN0IHsKKyAgICBmb3IgKGF1dG8gYmluZGluZ19wYWlyIDogYmluZGluZ3MpIHsKKyAgICAgICAgYXV0byBiaW5kaW5nID0gYmluZGluZ19wYWlyLmZpcnN0OworICAgICAgICBEZXNjcmlwdG9yU2V0TGF5b3V0OjpDb25zdEJpbmRpbmdJdGVyYXRvciBiaW5kaW5nX2l0KGRlc2NyaXB0b3Jfc2V0LT5HZXRMYXlvdXQoKS5nZXQoKSwgYmluZGluZyk7CisgICAgICAgIGlmIChiaW5kaW5nX2l0LkF0RW5kKCkpIHsgIC8vICBFbmQgYXQgY29uc3RydWN0aW9uIGlzIHRoZSBjb25kaXRpb24gZm9yIGFuIGludmFsaWQgYmluZGluZy4KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGluZyB0byB2YWxpZGF0ZSBEcmF3U3RhdGUgZm9yIGJpbmRpbmcgIyIgPDwgYmluZGluZworICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2hpY2ggaXMgYW4gaW52YWxpZCBiaW5kaW5nIGZvciB0aGlzIGRlc2NyaXB0b3Igc2V0LiI7CisgICAgICAgICAgICAqZXJyb3IgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmluZGluZ19pdC5HZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzKCkgJgorICAgICAgICAgICAgKFZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVCB8IFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUKSkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgdmFsaWRhdGUgdGhlIGRlc2NyaXB0b3IgYmVjYXVzZSBpdCBtYXkgbm90IGhhdmUgYmVlbiB1cGRhdGVkLAorICAgICAgICAgICAgLy8gb3IgdGhlIHZpZXcgY291bGQgaGF2ZSBiZWVuIGRlc3Ryb3llZAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFWYWxpZGF0ZURlc2NyaXB0b3JTZXRCaW5kaW5nRGF0YShjYl9ub2RlLCBkZXNjcmlwdG9yX3NldCwgZHluYW1pY19vZmZzZXRzLCBiaW5kaW5nLCBiaW5kaW5nX3BhaXIuc2Vjb25kLCBjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZURlc2NyaXB0b3JTZXRCaW5kaW5nRGF0YShjb25zdCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlLCBjb25zdCBEZXNjcmlwdG9yU2V0ICpkZXNjcmlwdG9yX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICZkeW5hbWljX29mZnNldHMsIHVpbnQzMl90IGJpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcmVxIHJlcXMsIGNvbnN0IGNoYXIgKmNhbGxlciwgc3RkOjpzdHJpbmcgKmVycm9yKSBjb25zdCB7CisgICAgdXNpbmcgRGVzY3JpcHRvckNsYXNzID0gY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yQ2xhc3M7CisgICAgdXNpbmcgQnVmZmVyRGVzY3JpcHRvciA9IGN2ZGVzY3JpcHRvcnNldDo6QnVmZmVyRGVzY3JpcHRvcjsKKyAgICB1c2luZyBJbWFnZURlc2NyaXB0b3IgPSBjdmRlc2NyaXB0b3JzZXQ6OkltYWdlRGVzY3JpcHRvcjsKKyAgICB1c2luZyBJbWFnZVNhbXBsZXJEZXNjcmlwdG9yID0gY3ZkZXNjcmlwdG9yc2V0OjpJbWFnZVNhbXBsZXJEZXNjcmlwdG9yOworICAgIHVzaW5nIFNhbXBsZXJEZXNjcmlwdG9yID0gY3ZkZXNjcmlwdG9yc2V0OjpTYW1wbGVyRGVzY3JpcHRvcjsKKyAgICB1c2luZyBUZXhlbERlc2NyaXB0b3IgPSBjdmRlc2NyaXB0b3JzZXQ6OlRleGVsRGVzY3JpcHRvcjsKKyAgICBEZXNjcmlwdG9yU2V0TGF5b3V0OjpDb25zdEJpbmRpbmdJdGVyYXRvciBiaW5kaW5nX2l0KGRlc2NyaXB0b3Jfc2V0LT5HZXRMYXlvdXQoKS5nZXQoKSwgYmluZGluZyk7CisgICAgeworICAgICAgICAvLyBDb3B5IHRoZSByYW5nZSwgdGhlIGVuZCByYW5nZSBpcyBzdWJqZWN0IHRvIHVwZGF0ZSBiYXNlZCBvbiB2YXJpYWJsZSBsZW5ndGggZGVzY3JpcHRvciBhcnJheXMuCisgICAgICAgIGN2ZGVzY3JpcHRvcnNldDo6SW5kZXhSYW5nZSBpbmRleF9yYW5nZSA9IGJpbmRpbmdfaXQuR2V0R2xvYmFsSW5kZXhSYW5nZSgpOworICAgICAgICBhdXRvIGFycmF5X2lkeCA9IDA7ICAvLyBUcmFjayBhcnJheSBpZHggaWYgd2UncmUgZGVhbGluZyB3aXRoIGFycmF5IGRlc2NyaXB0b3JzCisKKyAgICAgICAgaWYgKGJpbmRpbmdfaXQuSXNWYXJpYWJsZURlc2NyaXB0b3JDb3VudCgpKSB7CisgICAgICAgICAgICAvLyBPbmx5IHZhbGlkYXRlIHRoZSBmaXJzdCBOIGRlc2NyaXB0b3JzIGlmIGl0IHVzZXMgdmFyaWFibGVfY291bnQKKyAgICAgICAgICAgIGluZGV4X3JhbmdlLmVuZCA9IGluZGV4X3JhbmdlLnN0YXJ0ICsgZGVzY3JpcHRvcl9zZXQtPkdldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50KCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSBpbmRleF9yYW5nZS5zdGFydDsgaSA8IGluZGV4X3JhbmdlLmVuZDsgKytpLCArK2FycmF5X2lkeCkgeworICAgICAgICAgICAgdWludDMyX3QgaW5kZXggPSBpIC0gaW5kZXhfcmFuZ2Uuc3RhcnQ7CisgICAgICAgICAgICBjb25zdCBhdXRvICpkZXNjcmlwdG9yID0gZGVzY3JpcHRvcl9zZXQtPkdldERlc2NyaXB0b3JGcm9tR2xvYmFsSW5kZXgoaSk7CisKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLT5HZXRDbGFzcygpID09IERlc2NyaXB0b3JDbGFzczo6SW5saW5lVW5pZm9ybSkgeworICAgICAgICAgICAgICAgIC8vIENhbid0IHZhbGlkYXRlIHRoZSBkZXNjcmlwdG9yIGJlY2F1c2UgaXQgbWF5IG5vdCBoYXZlIGJlZW4gdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRlc2NyaXB0b3ItPnVwZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJEZXNjcmlwdG9yIGluIGJpbmRpbmcgIyIgPDwgYmluZGluZyA8PCAiIGluZGV4ICIgPDwgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBiZWluZyB1c2VkIGluIGRyYXcgYnV0IGhhcyBuZXZlciBiZWVuIHVwZGF0ZWQgdmlhIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoKSBvciBhIHNpbWlsYXIgY2FsbC4iOworICAgICAgICAgICAgICAgICplcnJvciA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dG8gZGVzY3JpcHRvcl9jbGFzcyA9IGRlc2NyaXB0b3ItPkdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfY2xhc3MgPT0gRGVzY3JpcHRvckNsYXNzOjpHZW5lcmFsQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGJ1ZmZlcnMgYXJlIHZhbGlkCisgICAgICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgQnVmZmVyRGVzY3JpcHRvciAqPihkZXNjcmlwdG9yKS0+R2V0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyX25vZGUgPSBzdGF0aWNfY2FzdDxjb25zdCBCdWZmZXJEZXNjcmlwdG9yICo+KGRlc2NyaXB0b3IpLT5HZXRCdWZmZXJTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcl9ub2RlIHx8IGJ1ZmZlcl9ub2RlLT5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiRGVzY3JpcHRvciBpbiBiaW5kaW5nICMiIDw8IGJpbmRpbmcgPDwgIiBpbmRleCAiIDw8IGluZGV4IDw8ICIgaXMgdXNpbmcgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGJ1ZmZlcikuY19zdHIoKSA8PCAiIHRoYXQgaXMgaW52YWxpZCBvciBoYXMgYmVlbiBkZXN0cm95ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnJvciA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYnVmZmVyX25vZGUtPnNwYXJzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIG1lbV9iaW5kaW5nIDogYnVmZmVyX25vZGUtPkdldEJvdW5kTWVtb3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUdldERldk1lbVN0YXRlKG1lbV9iaW5kaW5nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiRGVzY3JpcHRvciBpbiBiaW5kaW5nICMiIDw8IGJpbmRpbmcgPDwgIiBpbmRleCAiIDw8IGluZGV4IDw8ICIgdXNlcyBidWZmZXIgIiA8PCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdGhhdCByZWZlcmVuY2VzIGludmFsaWQgbWVtb3J5ICIgPDwgbWVtX2JpbmRpbmcgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3IgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3ItPklzRHluYW1pYygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IGR5bmFtaWMgb2Zmc2V0cyBhcmUgd2l0aGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyX3NpemUgPSBidWZmZXJfbm9kZS0+Y3JlYXRlSW5mby5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByYW5nZSA9IHN0YXRpY19jYXN0PGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3IgKj4oZGVzY3JpcHRvciktPkdldFJhbmdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGRlc2Nfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgQnVmZmVyRGVzY3JpcHRvciAqPihkZXNjcmlwdG9yKS0+R2V0T2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGR5bl9vZmZzZXQgPSBkeW5hbWljX29mZnNldHNbYmluZGluZ19pdC5HZXREeW5hbWljT2Zmc2V0SW5kZXgoKSArIGFycmF5X2lkeF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVktfV0hPTEVfU0laRSA9PSByYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZHluX29mZnNldCArIGRlc2Nfb2Zmc2V0KSA+IGJ1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJEeW5hbWljIGRlc2NyaXB0b3IgaW4gYmluZGluZyAjIiA8PCBiaW5kaW5nIDw8ICIgaW5kZXggIiA8PCBpbmRleCA8PCAiIHVzZXMgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJ1ZmZlciA8PCAiIHdpdGggdXBkYXRlIHJhbmdlIG9mIFZLX1dIT0xFX1NJWkUgaGFzIGR5bmFtaWMgb2Zmc2V0ICIgPDwgZHluX29mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBjb21iaW5lZCB3aXRoIG9mZnNldCAiIDw8IGRlc2Nfb2Zmc2V0IDw8ICIgdGhhdCBvdmVyc3RlcHMgdGhlIGJ1ZmZlciBzaXplIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJ1ZmZlcl9zaXplIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGR5bl9vZmZzZXQgKyBkZXNjX29mZnNldCArIHJhbmdlKSA+IGJ1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJEeW5hbWljIGRlc2NyaXB0b3IgaW4gYmluZGluZyAjIiA8PCBiaW5kaW5nIDw8ICIgaW5kZXggIiA8PCBpbmRleCA8PCAiIHVzZXMgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJ1ZmZlciA8PCAiIHdpdGggZHluYW1pYyBvZmZzZXQgIiA8PCBkeW5fb2Zmc2V0IDw8ICIgY29tYmluZWQgd2l0aCBvZmZzZXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGVzY19vZmZzZXQgPDwgIiBhbmQgcmFuZ2UgIiA8PCByYW5nZSA8PCAiIHRoYXQgb3ZlcnN0ZXBzIHRoZSBidWZmZXIgc2l6ZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBidWZmZXJfc2l6ZSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplcnJvciA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvcl9jbGFzcyA9PSBEZXNjcmlwdG9yQ2xhc3M6OkltYWdlU2FtcGxlciB8fCBkZXNjcmlwdG9yX2NsYXNzID09IERlc2NyaXB0b3JDbGFzczo6SW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgVmtJbWFnZVZpZXcgaW1hZ2VfdmlldzsKKyAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBpbWFnZV9sYXlvdXQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IElNQUdFX1ZJRVdfU1RBVEUgKmltYWdlX3ZpZXdfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yX2NsYXNzID09IERlc2NyaXB0b3JDbGFzczo6SW1hZ2VTYW1wbGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV92aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvciAqPihkZXNjcmlwdG9yKS0+R2V0SW1hZ2VWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV92aWV3X3N0YXRlID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvciAqPihkZXNjcmlwdG9yKS0+R2V0SW1hZ2VWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2xheW91dCA9IHN0YXRpY19jYXN0PGNvbnN0IEltYWdlU2FtcGxlckRlc2NyaXB0b3IgKj4oZGVzY3JpcHRvciktPkdldEltYWdlTGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV92aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW1hZ2VEZXNjcmlwdG9yICo+KGRlc2NyaXB0b3IpLT5HZXRJbWFnZVZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3ZpZXdfc3RhdGUgPSBzdGF0aWNfY2FzdDxjb25zdCBJbWFnZURlc2NyaXB0b3IgKj4oZGVzY3JpcHRvciktPkdldEltYWdlVmlld1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9sYXlvdXQgPSBzdGF0aWNfY2FzdDxjb25zdCBJbWFnZURlc2NyaXB0b3IgKj4oZGVzY3JpcHRvciktPkdldEltYWdlTGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWltYWdlX3ZpZXdfc3RhdGUgfHwgaW1hZ2Vfdmlld19zdGF0ZS0+ZGVzdHJveWVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbWFnZSB2aWV3IG11c3QgaGF2ZSBiZWVuIGRlc3Ryb3llZCBzaW5jZSBpbml0aWFsIHVwZGF0ZS4gQ291bGQgcG90ZW50aWFsbHkgZmxhZyB0aGUgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGFzICJpbnZhbGlkIiAodXBkYXRlZCA9IGZhbHNlKSBhdCBEZXN0cm95SW1hZ2VWaWV3KCkgdGltZSBhbmQgZGV0ZWN0IHRoaXMgZXJyb3IgYXQgYmluZCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkRlc2NyaXB0b3IgaW4gYmluZGluZyAjIiA8PCBiaW5kaW5nIDw8ICIgaW5kZXggIiA8PCBpbmRleCA8PCAiIGlzIHVzaW5nIGltYWdlVmlldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV92aWV3KS5jX3N0cigpIDw8ICIgdGhhdCBpcyBpbnZhbGlkIG9yIGhhcyBiZWVuIGRlc3Ryb3llZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJmltYWdlX3ZpZXdfY2kgPSBpbWFnZV92aWV3X3N0YXRlLT5jcmVhdGVfaW5mbzsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVxcyAmIERFU0NSSVBUT1JfUkVRX0FMTF9WSUVXX1RZUEVfQklUUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKH5yZXFzICYgKDEgPDwgaW1hZ2Vfdmlld19jaS52aWV3VHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWQgdmlldyB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiRGVzY3JpcHRvciBpbiBiaW5kaW5nICMiIDw8IGJpbmRpbmcgPDwgIiBpbmRleCAiIDw8IGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmVxdWlyZXMgYW4gaW1hZ2UgdmlldyBvZiB0eXBlICIgPDwgU3RyaW5nRGVzY3JpcHRvclJlcVZpZXdUeXBlKHJlcXMpIDw8ICIgYnV0IGdvdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0cmluZ19Wa0ltYWdlVmlld1R5cGUoaW1hZ2Vfdmlld19jaS52aWV3VHlwZSkgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICplcnJvciA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlcXMgJiBpbWFnZV92aWV3X3N0YXRlLT5kZXNjcmlwdG9yX2Zvcm1hdF9iaXRzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhZCBjb21wb25lbnQgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkRlc2NyaXB0b3IgaW4gYmluZGluZyAjIiA8PCBiaW5kaW5nIDw8ICIgaW5kZXggIiA8PCBpbmRleCA8PCAiIHJlcXVpcmVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgU3RyaW5nRGVzY3JpcHRvclJlcUNvbXBvbmVudFR5cGUocmVxcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBjb21wb25lbnQgdHlwZSwgYnV0IGJvdW5kIGRlc2NyaXB0b3IgZm9ybWF0IGlzICIgPDwgc3RyaW5nX1ZrRm9ybWF0KGltYWdlX3ZpZXdfY2kuZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZWQuaW1hZ2VfbGF5b3V0X3ZhbGlkYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2Vfbm9kZSA9IGltYWdlX3ZpZXdfc3RhdGUtPmltYWdlX3N0YXRlLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGltYWdlX25vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IEltYWdlIExheW91dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gImludmFsaWQgbGF5b3V0IiBWVUlEIHJlcXVpcmVkIGZvciB0aGlzIGNhbGwsIHNpbmNlIHRoZSBvcHRpbWFsX2xheW91dCBwYXJhbWV0ZXIgaXMgVU5ERUZJTkVELgorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoaXRfZXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlcmlmeUltYWdlTGF5b3V0KGNiX25vZGUsIGltYWdlX25vZGUsIGltYWdlX3ZpZXdfc3RhdGUtPm5vcm1hbGl6ZWRfc3VicmVzb3VyY2VfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV92aWV3X2NpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzaywgaW1hZ2VfbGF5b3V0LCBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWltYWdlTGF5b3V0LTAwMzQ0IiwgJmhpdF9lcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGl0X2Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltYWdlIGxheW91dCBzcGVjaWZpZWQgYXQgdmtVcGRhdGVEZXNjcmlwdG9yU2V0KiBvciB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0KiB0aW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggYWN0dWFsIGltYWdlIGxheW91dCBhdCB0aW1lIGRlc2NyaXB0b3IgaXMgdXNlZC4gU2VlIHByZXZpb3VzIGVycm9yIGNhbGxiYWNrIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjaWZpYyBkZXRhaWxzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IFNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXFzICYgREVTQ1JJUFRPUl9SRVFfU0lOR0xFX1NBTVBMRSkgJiYgaW1hZ2Vfdmlld19zdGF0ZS0+c2FtcGxlcyAhPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiRGVzY3JpcHRvciBpbiBiaW5kaW5nICMiIDw8IGJpbmRpbmcgPDwgIiBpbmRleCAiIDw8IGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXF1aXJlcyBib3VuZCBpbWFnZSB0byBoYXZlIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCBidXQgZ290ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmdfVmtTYW1wbGVDb3VudEZsYWdCaXRzKGltYWdlX3ZpZXdfc3RhdGUtPnNhbXBsZXMpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnJvciA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcXMgJiBERVNDUklQVE9SX1JFUV9NVUxUSV9TQU1QTEUpICYmIGltYWdlX3ZpZXdfc3RhdGUtPnNhbXBsZXMgPT0gVktfU0FNUExFX0NPVU5UXzFfQklUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkRlc2NyaXB0b3IgaW4gYmluZGluZyAjIiA8PCBiaW5kaW5nIDw8ICIgaW5kZXggIiA8PCBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmVxdWlyZXMgYm91bmQgaW1hZ2UgdG8gaGF2ZSBtdWx0aXBsZSBzYW1wbGVzLCBidXQgZ290IFZLX1NBTVBMRV9DT1VOVF8xX0JJVC4iOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yX2NsYXNzID09IERlc2NyaXB0b3JDbGFzczo6VGV4ZWxCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB0ZXhlbF9idWZmZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXhlbERlc2NyaXB0b3IgKj4oZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyX3ZpZXcgPSB0ZXhlbF9idWZmZXItPkdldEJ1ZmZlclZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBidWZmZXJfdmlld19zdGF0ZSA9IHRleGVsX2J1ZmZlci0+R2V0QnVmZmVyVmlld1N0YXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJfdmlld19zdGF0ZSB8fCBidWZmZXJfdmlld19zdGF0ZS0+ZGVzdHJveWVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkRlc2NyaXB0b3IgaW4gYmluZGluZyAjIiA8PCBiaW5kaW5nIDw8ICIgaW5kZXggIiA8PCBpbmRleCA8PCAiIGlzIHVzaW5nIGJ1ZmZlclZpZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYnVmZmVyX3ZpZXcpLmNfc3RyKCkgPDwgIiB0aGF0IGlzIGludmFsaWQgb3IgaGFzIGJlZW4gZGVzdHJveWVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3IgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXV0byBidWZmZXIgPSBidWZmZXJfdmlld19zdGF0ZS0+Y3JlYXRlX2luZm8uYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlcl9zdGF0ZSA9IGJ1ZmZlcl92aWV3X3N0YXRlLT5idWZmZXJfc3RhdGUuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJfc3RhdGUtPmRlc3Ryb3llZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJEZXNjcmlwdG9yIGluIGJpbmRpbmcgIyIgPDwgYmluZGluZyA8PCAiIGluZGV4ICIgPDwgaW5kZXggPDwgIiBpcyB1c2luZyBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoYnVmZmVyKS5jX3N0cigpIDw8ICIgdGhhdCBoYXMgYmVlbiBkZXN0cm95ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnJvciA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdXRvIGZvcm1hdF9iaXRzID0gRGVzY3JpcHRvclJlcXVpcmVtZW50c0JpdHNGcm9tRm9ybWF0KGJ1ZmZlcl92aWV3X3N0YXRlLT5jcmVhdGVfaW5mby5mb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghKHJlcXMgJiBmb3JtYXRfYml0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhZCBjb21wb25lbnQgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJEZXNjcmlwdG9yIGluIGJpbmRpbmcgIyIgPDwgYmluZGluZyA8PCAiIGluZGV4ICIgPDwgaW5kZXggPDwgIiByZXF1aXJlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgU3RyaW5nRGVzY3JpcHRvclJlcUNvbXBvbmVudFR5cGUocmVxcykgPDwgIiBjb21wb25lbnQgdHlwZSwgYnV0IGJvdW5kIGRlc2NyaXB0b3IgZm9ybWF0IGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmdfVmtGb3JtYXQoYnVmZmVyX3ZpZXdfc3RhdGUtPmNyZWF0ZV9pbmZvLmZvcm1hdCkgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yX2NsYXNzID09IERlc2NyaXB0b3JDbGFzczo6SW1hZ2VTYW1wbGVyIHx8IGRlc2NyaXB0b3JfY2xhc3MgPT0gRGVzY3JpcHRvckNsYXNzOjpQbGFpblNhbXBsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IFNhbXBsZXIgc3RpbGwgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNBTVBMRVJfU1RBVEUgKnNhbXBsZXJfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yX2NsYXNzID09IERlc2NyaXB0b3JDbGFzczo6SW1hZ2VTYW1wbGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvciAqPihkZXNjcmlwdG9yKS0+R2V0U2FtcGxlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl9zdGF0ZSA9IHN0YXRpY19jYXN0PGNvbnN0IEltYWdlU2FtcGxlckRlc2NyaXB0b3IgKj4oZGVzY3JpcHRvciktPkdldFNhbXBsZXJTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciA9IHN0YXRpY19jYXN0PGNvbnN0IFNhbXBsZXJEZXNjcmlwdG9yICo+KGRlc2NyaXB0b3IpLT5HZXRTYW1wbGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyX3N0YXRlID0gc3RhdGljX2Nhc3Q8Y29uc3QgU2FtcGxlckRlc2NyaXB0b3IgKj4oZGVzY3JpcHRvciktPkdldFNhbXBsZXJTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghc2FtcGxlcl9zdGF0ZSB8fCBzYW1wbGVyX3N0YXRlLT5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiRGVzY3JpcHRvciBpbiBiaW5kaW5nICMiIDw8IGJpbmRpbmcgPDwgIiBpbmRleCAiIDw8IGluZGV4IDw8ICIgaXMgdXNpbmcgc2FtcGxlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzYW1wbGVyKS5jX3N0cigpIDw8ICIgdGhhdCBpcyBpbnZhbGlkIG9yIGhhcyBiZWVuIGRlc3Ryb3llZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhbXBsZXJfc3RhdGUtPnNhbXBsZXJDb252ZXJzaW9uICYmICFkZXNjcmlwdG9yLT5Jc0ltbXV0YWJsZVNhbXBsZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgInNhbXBsZXIgKCIgPDwgc2FtcGxlciA8PCAiKSBpbiB0aGUgZGVzY3JpcHRvciBzZXQgKCIgPDwgZGVzY3JpcHRvcl9zZXQtPkdldFNldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIGNvbnRhaW5zIGEgWUNCQ1IgY29udmVyc2lvbiAoIiA8PCBzYW1wbGVyX3N0YXRlLT5zYW1wbGVyQ29udmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSAsIHRoZW4gdGhlIHNhbXBsZXIgTVVTVCBhbHNvIGV4aXN0cyBhcyBhbiBpbW11dGFibGUgc2FtcGxlci4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICplcnJvciA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU2V0IGlzIGJlaW5nIGRlbGV0ZWQgb3IgdXBkYXRlcyBzbyBpbnZhbGlkYXRlIGFsbCBib3VuZCBjbWQgYnVmZmVycwordm9pZCBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQ6OkludmFsaWRhdGVCb3VuZENtZEJ1ZmZlcnMoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqc3RhdGVfZGF0YSkgeworICAgIHN0YXRlX2RhdGEtPkludmFsaWRhdGVDb21tYW5kQnVmZmVycyhjYl9iaW5kaW5ncywgVnVsa2FuVHlwZWRIYW5kbGUoc2V0Xywga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0KSwgLyp1bmxpbmsqLyBmYWxzZSk7Cit9CisKKy8vIExvb3AgdGhyb3VnaCB0aGUgd3JpdGUgdXBkYXRlcyB0byBkbyBmb3IgYSBwdXNoIGRlc2NyaXB0b3Igc2V0LCBpZ25vcmluZyBkc3RTZXQKK3ZvaWQgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0OjpQZXJmb3JtUHVzaERlc2NyaXB0b3JzVXBkYXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCB1aW50MzJfdCB3cml0ZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICpwX3dkcykgeworICAgIGFzc2VydChJc1B1c2hEZXNjcmlwdG9yKCkpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZV9jb3VudDsgaSsrKSB7CisgICAgICAgIFBlcmZvcm1Xcml0ZVVwZGF0ZShkZXZfZGF0YSwgJnBfd2RzW2ldKTsKKyAgICB9CisKKyAgICBwdXNoX2Rlc2NyaXB0b3Jfc2V0X3dyaXRlcy5jbGVhcigpOworICAgIHB1c2hfZGVzY3JpcHRvcl9zZXRfd3JpdGVzLnJlc2VydmUoc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHdyaXRlX2NvdW50KSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdyaXRlX2NvdW50OyBpKyspIHsKKyAgICAgICAgcHVzaF9kZXNjcmlwdG9yX3NldF93cml0ZXMucHVzaF9iYWNrKHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQoJnBfd2RzW2ldKSk7CisgICAgfQorfQorCisvLyBQZXJmb3JtIHdyaXRlIHVwZGF0ZSBpbiBnaXZlbiB1cGRhdGUgc3RydWN0Cit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldDo6UGVyZm9ybVdyaXRlVXBkYXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqdXBkYXRlKSB7CisgICAgLy8gUGVyZm9ybSB1cGRhdGUgb24gYSBwZXItYmluZGluZyBiYXNpcyBhcyBjb25zZWN1dGl2ZSB1cGRhdGVzIHJvbGwgb3ZlciB0byBuZXh0IGJpbmRpbmcKKyAgICBhdXRvIGRlc2NyaXB0b3JzX3JlbWFpbmluZyA9IHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50OworICAgIGF1dG8gb2Zmc2V0ID0gdXBkYXRlLT5kc3RBcnJheUVsZW1lbnQ7CisgICAgYXV0byBvcmlnX2JpbmRpbmcgPSBEZXNjcmlwdG9yU2V0TGF5b3V0OjpDb25zdEJpbmRpbmdJdGVyYXRvcihwX2xheW91dF8uZ2V0KCksIHVwZGF0ZS0+ZHN0QmluZGluZyk7CisgICAgYXV0byBjdXJyZW50X2JpbmRpbmcgPSBvcmlnX2JpbmRpbmc7CisKKyAgICB1aW50MzJfdCB1cGRhdGVfaW5kZXggPSAwOworICAgIC8vIFZlcmlmeSBuZXh0IGNvbnNlY3V0aXZlIGJpbmRpbmcgbWF0Y2hlcyB0eXBlLCBzdGFnZSBmbGFncyAmIGltbXV0YWJsZSBzYW1wbGVyIHVzZSBhbmQgaWYgQXRFbmQKKyAgICB3aGlsZSAoZGVzY3JpcHRvcnNfcmVtYWluaW5nICYmIG9yaWdfYmluZGluZy5Jc0NvbnNpc3RlbnQoY3VycmVudF9iaW5kaW5nKSkgeworICAgICAgICBjb25zdCBhdXRvICZpbmRleF9yYW5nZSA9IGN1cnJlbnRfYmluZGluZy5HZXRHbG9iYWxJbmRleFJhbmdlKCk7CisgICAgICAgIGF1dG8gZ2xvYmFsX2lkeCA9IGluZGV4X3JhbmdlLnN0YXJ0ICsgb2Zmc2V0OworICAgICAgICAvLyBnbG9iYWxfaWR4IGlzIHdoaWNoIGRlc2NyaXB0b3IgaXMgbmVlZGVkIHRvIHVwZGF0ZS4gSWYgZ2xvYmFsX2lkeCA+IGluZGV4X3JhbmdlLmVuZCwgaXQgbWVhbnMgdGhlIGRlc2NyaXB0b3IgaXNuJ3QgaW4KKyAgICAgICAgLy8gdGhpcyBiaW5kaW5nLCBtYXliZSBpbiBuZXh0IGJpbmRpbmcuCisgICAgICAgIGlmIChnbG9iYWxfaWR4ID49IGluZGV4X3JhbmdlLmVuZCkgeworICAgICAgICAgICAgb2Zmc2V0IC09IGN1cnJlbnRfYmluZGluZy5HZXREZXNjcmlwdG9yQ291bnQoKTsKKyAgICAgICAgICAgICsrY3VycmVudF9iaW5kaW5nOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb29wIG92ZXIgdGhlIHVwZGF0ZXMgZm9yIGEgc2luZ2xlIGJpbmRpbmcgYXQgYSB0aW1lCisgICAgICAgIHVpbnQzMl90IHVwZGF0ZV9jb3VudCA9IHN0ZDo6bWluKGRlc2NyaXB0b3JzX3JlbWFpbmluZywgY3VycmVudF9iaW5kaW5nLkdldERlc2NyaXB0b3JDb3VudCgpIC0gb2Zmc2V0KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBkaSA9IDA7IGRpIDwgdXBkYXRlX2NvdW50OyArK2RpLCArK3VwZGF0ZV9pbmRleCkgeworICAgICAgICAgICAgZGVzY3JpcHRvcnNfW2dsb2JhbF9pZHggKyBkaV0tPldyaXRlVXBkYXRlKGRldl9kYXRhLCB1cGRhdGUsIHVwZGF0ZV9pbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUm9sbCBvdmVyIHRvIG5leHQgYmluZGluZyBpbiBjYXNlIG9mIGNvbnNlY3V0aXZlIHVwZGF0ZQorICAgICAgICBkZXNjcmlwdG9yc19yZW1haW5pbmcgLT0gdXBkYXRlX2NvdW50OworICAgICAgICBpZiAoZGVzY3JpcHRvcnNfcmVtYWluaW5nKSB7CisgICAgICAgICAgICAvLyBTdGFydGluZyBvZmZzZXQgaXMgYmV5b25kIHRoZSBjdXJyZW50IGJpbmRpbmcuIENoZWNrIGNvbnNpc3RlbmN5LCB1cGRhdGUgY291bnRlcnMgYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgYmluZGluZywKKyAgICAgICAgICAgIC8vIGxvb2tpbmcgZm9yIHRoZSBzdGFydCBwb2ludC4gQWxsIGJpbmRpbmdzIChldmVuIHRob3NlIHNraXBwZWQpIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSB1cGRhdGUgYW5kIHdpdGggdGhlCisgICAgICAgICAgICAvLyBvcmlnaW5hbCBiaW5kaW5nLgorICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICsrY3VycmVudF9iaW5kaW5nOworICAgICAgICB9CisgICAgfQorICAgIGlmICh1cGRhdGUtPmRlc2NyaXB0b3JDb3VudCkgeworICAgICAgICBzb21lX3VwZGF0ZV8gPSB0cnVlOworICAgICAgICBjaGFuZ2VfY291bnRfKys7CisgICAgfQorCisgICAgaWYgKCEocF9sYXlvdXRfLT5HZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzRnJvbUJpbmRpbmcodXBkYXRlLT5kc3RCaW5kaW5nKSAmCisgICAgICAgICAgKFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVCB8IFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUKSkpIHsKKyAgICAgICAgSW52YWxpZGF0ZUJvdW5kQ21kQnVmZmVycyhkZXZfZGF0YSk7CisgICAgfQorfQorLy8gVmFsaWRhdGUgQ29weSB1cGRhdGUKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVDb3B5VXBkYXRlKGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQgKnVwZGF0ZSwgY29uc3QgRGVzY3JpcHRvclNldCAqZHN0X3NldCwgY29uc3QgRGVzY3JpcHRvclNldCAqc3JjX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgc3RkOjpzdHJpbmcgKmVycm9yX2NvZGUsIHN0ZDo6c3RyaW5nICplcnJvcl9tc2cpIGNvbnN0IHsKKyAgICBhdXRvIGRzdF9sYXlvdXQgPSBkc3Rfc2V0LT5HZXRMYXlvdXQoKS5nZXQoKTsKKyAgICBhdXRvIHNyY19sYXlvdXQgPSBzcmNfc2V0LT5HZXRMYXlvdXQoKS5nZXQoKTsKKworICAgIC8vIFZlcmlmeSBkc3QgbGF5b3V0IHN0aWxsIHZhbGlkCisgICAgaWYgKGRzdF9sYXlvdXQtPmRlc3Ryb3llZCkgeworICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtZHN0U2V0LXBhcmFtZXRlciI7CisgICAgICAgIHN0cmluZ19zcHJpbnRmKGVycm9yX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsICVzIHRvIHBlcmZvcm0gY29weSB1cGRhdGUgb24gZHN0U2V0ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAiIGNyZWF0ZWQgd2l0aCBkZXN0cm95ZWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGRzdF9zZXQtPkdldFNldCgpKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGRzdF9sYXlvdXQtPkdldERlc2NyaXB0b3JTZXRMYXlvdXQoKSkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgc3JjIGxheW91dCBzdGlsbCB2YWxpZAorICAgIGlmIChzcmNfbGF5b3V0LT5kZXN0cm95ZWQpIHsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY1NldC1wYXJhbWV0ZXIiOworICAgICAgICBzdHJpbmdfc3ByaW50ZihlcnJvcl9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY2FsbCAlcyB0byBwZXJmb3JtIGNvcHkgdXBkYXRlIG9mIGRzdFNldCAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tIHNyY1NldCAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBjcmVhdGVkIHdpdGggZGVzdHJveWVkICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShkc3Rfc2V0LT5HZXRTZXQoKSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzcmNfc2V0LT5HZXRTZXQoKSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShzcmNfbGF5b3V0LT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0KCkpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFkc3RfbGF5b3V0LT5IYXNCaW5kaW5nKHVwZGF0ZS0+ZHN0QmluZGluZykpIHsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWRzdEJpbmRpbmctMDAzNDciOworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgIGVycm9yX3N0ciA8PCAiRGVzY3JpcHRvclNldCAiIDw8IGRzdF9zZXQtPkdldFNldCgpIDw8ICIgZG9lcyBub3QgaGF2ZSBjb3B5IHVwZGF0ZSBkZXN0IGJpbmRpbmcgb2YgIiA8PCB1cGRhdGUtPmRzdEJpbmRpbmc7CisgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFzcmNfc2V0LT5IYXNCaW5kaW5nKHVwZGF0ZS0+c3JjQmluZGluZykpIHsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY0JpbmRpbmctMDAzNDUiOworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgIGVycm9yX3N0ciA8PCAiRGVzY3JpcHRvclNldCAiIDw8IGRzdF9zZXQtPkdldFNldCgpIDw8ICIgZG9lcyBub3QgaGF2ZSBjb3B5IHVwZGF0ZSBzcmMgYmluZGluZyBvZiAiIDw8IHVwZGF0ZS0+c3JjQmluZGluZzsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBWZXJpZnkgaWRsZSBkcworICAgIGlmIChkc3Rfc2V0LT5pbl91c2UubG9hZCgpICYmCisgICAgICAgICEoZHN0X2xheW91dC0+R2V0RGVzY3JpcHRvckJpbmRpbmdGbGFnc0Zyb21CaW5kaW5nKHVwZGF0ZS0+ZHN0QmluZGluZykgJgorICAgICAgICAgIChWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX1VOVVNFRF9XSElMRV9QRU5ESU5HX0JJVF9FWFQgfCBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkpKSB7CisgICAgICAgIC8vIFRPRE8gOiBSZS11c2luZyBGcmVlIElkbGUgZXJyb3IgY29kZSwgbmVlZCBjb3B5IHVwZGF0ZSBpZGxlIGVycm9yIGNvZGUKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtMDAzMDkiOworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgIGVycm9yX3N0ciA8PCAiQ2Fubm90IGNhbGwgIiA8PCBmdW5jX25hbWUgPDwgIiB0byBwZXJmb3JtIGNvcHkgdXBkYXRlIG9uIGRlc2NyaXB0b3Igc2V0ICIgPDwgZHN0X3NldC0+R2V0U2V0KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgdGhhdCBpcyBpbiB1c2UgYnkgYSBjb21tYW5kIGJ1ZmZlciI7CisgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gc3JjICYgZHN0IHNldCBiaW5kaW5ncyBhcmUgdmFsaWQKKyAgICAvLyBDaGVjayBib3VuZHMgb2Ygc3JjICYgZHN0CisgICAgYXV0byBzcmNfc3RhcnRfaWR4ID0gc3JjX3NldC0+R2V0R2xvYmFsSW5kZXhSYW5nZUZyb21CaW5kaW5nKHVwZGF0ZS0+c3JjQmluZGluZykuc3RhcnQgKyB1cGRhdGUtPnNyY0FycmF5RWxlbWVudDsKKyAgICBpZiAoKHNyY19zdGFydF9pZHggKyB1cGRhdGUtPmRlc2NyaXB0b3JDb3VudCkgPiBzcmNfc2V0LT5HZXRUb3RhbERlc2NyaXB0b3JDb3VudCgpKSB7CisgICAgICAgIC8vIFNSQyB1cGRhdGUgb3V0IG9mIGJvdW5kcworICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjQXJyYXlFbGVtZW50LTAwMzQ2IjsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICBlcnJvcl9zdHIgPDwgIkF0dGVtcHRpbmcgY29weSB1cGRhdGUgZnJvbSBkZXNjcmlwdG9yU2V0ICIgPDwgdXBkYXRlLT5zcmNTZXQgPDwgIiBiaW5kaW5nIyIgPDwgdXBkYXRlLT5zcmNCaW5kaW5nCisgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggb2Zmc2V0IGluZGV4IG9mICIgPDwgc3JjX3NldC0+R2V0R2xvYmFsSW5kZXhSYW5nZUZyb21CaW5kaW5nKHVwZGF0ZS0+c3JjQmluZGluZykuc3RhcnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgcGx1cyB1cGRhdGUgYXJyYXkgb2Zmc2V0IG9mICIgPDwgdXBkYXRlLT5zcmNBcnJheUVsZW1lbnQgPDwgIiBhbmQgdXBkYXRlIG9mICIgPDwgdXBkYXRlLT5kZXNjcmlwdG9yQ291bnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgZGVzY3JpcHRvcnMgb3ZlcnN0ZXBzIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBzZXQ6ICIgPDwgc3JjX3NldC0+R2V0VG90YWxEZXNjcmlwdG9yQ291bnQoKTsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGRzdF9zdGFydF9pZHggPSBkc3RfbGF5b3V0LT5HZXRHbG9iYWxJbmRleFJhbmdlRnJvbUJpbmRpbmcodXBkYXRlLT5kc3RCaW5kaW5nKS5zdGFydCArIHVwZGF0ZS0+ZHN0QXJyYXlFbGVtZW50OworICAgIGlmICgoZHN0X3N0YXJ0X2lkeCArIHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50KSA+IGRzdF9sYXlvdXQtPkdldFRvdGFsRGVzY3JpcHRvckNvdW50KCkpIHsKKyAgICAgICAgLy8gRFNUIHVwZGF0ZSBvdXQgb2YgYm91bmRzCisgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RBcnJheUVsZW1lbnQtMDAzNDgiOworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGluZyBjb3B5IHVwZGF0ZSB0byBkZXNjcmlwdG9yU2V0ICIgPDwgZHN0X3NldC0+R2V0U2V0KCkgPDwgIiBiaW5kaW5nIyIgPDwgdXBkYXRlLT5kc3RCaW5kaW5nCisgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggb2Zmc2V0IGluZGV4IG9mICIgPDwgZHN0X2xheW91dC0+R2V0R2xvYmFsSW5kZXhSYW5nZUZyb21CaW5kaW5nKHVwZGF0ZS0+ZHN0QmluZGluZykuc3RhcnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgcGx1cyB1cGRhdGUgYXJyYXkgb2Zmc2V0IG9mICIgPDwgdXBkYXRlLT5kc3RBcnJheUVsZW1lbnQgPDwgIiBhbmQgdXBkYXRlIG9mICIgPDwgdXBkYXRlLT5kZXNjcmlwdG9yQ291bnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgZGVzY3JpcHRvcnMgb3ZlcnN0ZXBzIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBzZXQ6ICIgPDwgZHN0X2xheW91dC0+R2V0VG90YWxEZXNjcmlwdG9yQ291bnQoKTsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBDaGVjayB0aGF0IHR5cGVzIG1hdGNoCisgICAgLy8gVE9ETyA6IEJhc2UgZGVmYXVsdCBlcnJvciBjYXNlIGdvaW5nIGZyb20gaGVyZSBpcyAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIiMmJhIHdoaWNoIGNvdmVycyBhbGwKKyAgICAvLyBjb25zaXN0ZW5jeSBpc3N1ZXMsIG5lZWQgbW9yZSBmaW5lLWdyYWluZWQgZXJyb3IgY29kZXMKKyAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LTAwMzQ5IjsKKyAgICBhdXRvIHNyY190eXBlID0gc3JjX3NldC0+R2V0VHlwZUZyb21CaW5kaW5nKHVwZGF0ZS0+c3JjQmluZGluZyk7CisgICAgYXV0byBkc3RfdHlwZSA9IGRzdF9sYXlvdXQtPkdldFR5cGVGcm9tQmluZGluZyh1cGRhdGUtPmRzdEJpbmRpbmcpOworICAgIGlmIChzcmNfdHlwZSAhPSBkc3RfdHlwZSkgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGluZyBjb3B5IHVwZGF0ZSB0byBkZXNjcmlwdG9yU2V0ICIgPDwgZHN0X3NldC0+R2V0U2V0KCkgPDwgIiBiaW5kaW5nICMiIDw8IHVwZGF0ZS0+ZHN0QmluZGluZworICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIHR5cGUgIiA8PCBzdHJpbmdfVmtEZXNjcmlwdG9yVHlwZShkc3RfdHlwZSkgPDwgIiBmcm9tIGRlc2NyaXB0b3JTZXQgIiA8PCBzcmNfc2V0LT5HZXRTZXQoKQorICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kaW5nICMiIDw8IHVwZGF0ZS0+c3JjQmluZGluZyA8PCAiIHdpdGggdHlwZSAiIDw8IHN0cmluZ19Wa0Rlc2NyaXB0b3JUeXBlKHNyY190eXBlKQorICAgICAgICAgICAgICAgICAgPDwgIi4gVHlwZXMgZG8gbm90IG1hdGNoIjsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBWZXJpZnkgY29uc2lzdGVuY3kgb2Ygc3JjICYgZHN0IGJpbmRpbmdzIGlmIHVwZGF0ZSBjcm9zc2VzIGJpbmRpbmcgYm91bmRhcmllcworICAgIGlmICgoIVZlcmlmeVVwZGF0ZUNvbnNpc3RlbmN5KERlc2NyaXB0b3JTZXRMYXlvdXQ6OkNvbnN0QmluZGluZ0l0ZXJhdG9yKHNyY19sYXlvdXQsIHVwZGF0ZS0+c3JjQmluZGluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLT5zcmNBcnJheUVsZW1lbnQsIHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50LCAiY29weSB1cGRhdGUgZnJvbSIsIHNyY19zZXQtPkdldFNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21zZykpIHx8CisgICAgICAgICghVmVyaWZ5VXBkYXRlQ29uc2lzdGVuY3koRGVzY3JpcHRvclNldExheW91dDo6Q29uc3RCaW5kaW5nSXRlcmF0b3IoZHN0X2xheW91dCwgdXBkYXRlLT5kc3RCaW5kaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUtPmRzdEFycmF5RWxlbWVudCwgdXBkYXRlLT5kZXNjcmlwdG9yQ291bnQsICJjb3B5IHVwZGF0ZSB0byIsIGRzdF9zZXQtPkdldFNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21zZykpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoKHNyY19sYXlvdXQtPkdldENyZWF0ZUZsYWdzKCkgJiBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCkgJiYKKyAgICAgICAgIShkc3RfbGF5b3V0LT5HZXRDcmVhdGVGbGFncygpICYgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQpKSB7CisgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNTZXQtMDE5MTgiOworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgIGVycm9yX3N0ciA8PCAiSWYgcG5hbWU6c3JjU2V0J3MgKCIgPDwgdXBkYXRlLT5zcmNTZXQKKyAgICAgICAgICAgICAgICAgIDw8ICIpIGxheW91dCB3YXMgY3JlYXRlZCB3aXRoIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAiZW5hbWU6VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgZmxhZyAiCisgICAgICAgICAgICAgICAgICAgICAic2V0LCB0aGVuIHBuYW1lOmRzdFNldCdzICgiCisgICAgICAgICAgICAgICAgICA8PCB1cGRhdGUtPmRzdFNldAorICAgICAgICAgICAgICAgICAgPDwgIikgbGF5b3V0IG11c3Q6IGFsc28gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgImVuYW1lOlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUIGZsYWcgc2V0IjsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghKHNyY19sYXlvdXQtPkdldENyZWF0ZUZsYWdzKCkgJiBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCkgJiYKKyAgICAgICAgKGRzdF9sYXlvdXQtPkdldENyZWF0ZUZsYWdzKCkgJiBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCkpIHsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY1NldC0wMTkxOSI7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8ICJJZiBwbmFtZTpzcmNTZXQncyAoIiA8PCB1cGRhdGUtPnNyY1NldAorICAgICAgICAgICAgICAgICAgPDwgIikgbGF5b3V0IHdhcyBjcmVhdGVkIHdpdGhvdXQgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICJlbmFtZTpWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBmbGFnICIKKyAgICAgICAgICAgICAgICAgICAgICJzZXQsIHRoZW4gcG5hbWU6ZHN0U2V0J3MgKCIKKyAgICAgICAgICAgICAgICAgIDw8IHVwZGF0ZS0+ZHN0U2V0CisgICAgICAgICAgICAgICAgICA8PCAiKSBsYXlvdXQgbXVzdDogYWxzbyBoYXZlIGJlZW4gY3JlYXRlZCB3aXRob3V0IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAiZW5hbWU6VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgZmxhZyBzZXQiOworICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKChzcmNfc2V0LT5HZXRQb29sU3RhdGUoKS0+Y3JlYXRlSW5mby5mbGFncyAmIFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkgJiYKKyAgICAgICAgIShkc3Rfc2V0LT5HZXRQb29sU3RhdGUoKS0+Y3JlYXRlSW5mby5mbGFncyAmIFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkpIHsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY1NldC0wMTkyMCI7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8ICJJZiB0aGUgZGVzY3JpcHRvciBwb29sIGZyb20gd2hpY2ggcG5hbWU6c3JjU2V0ICgiIDw8IHVwZGF0ZS0+c3JjU2V0CisgICAgICAgICAgICAgICAgICA8PCAiKSB3YXMgYWxsb2NhdGVkIHdhcyBjcmVhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHRoZSBlbmFtZTpWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgZmxhZyAiCisgICAgICAgICAgICAgICAgICAgICAic2V0LCB0aGVuIHRoZSBkZXNjcmlwdG9yIHBvb2wgZnJvbSB3aGljaCBwbmFtZTpkc3RTZXQgKCIKKyAgICAgICAgICAgICAgICAgIDw8IHVwZGF0ZS0+ZHN0U2V0CisgICAgICAgICAgICAgICAgICA8PCAiKSB3YXMgYWxsb2NhdGVkIG11c3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICJhbHNvIGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIGVuYW1lOlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCBmbGFnIHNldCI7CisgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIShzcmNfc2V0LT5HZXRQb29sU3RhdGUoKS0+Y3JlYXRlSW5mby5mbGFncyAmIFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkgJiYKKyAgICAgICAgKGRzdF9zZXQtPkdldFBvb2xTdGF0ZSgpLT5jcmVhdGVJbmZvLmZsYWdzICYgVktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9CSVRfRVhUKSkgeworICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LTAxOTIxIjsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICBlcnJvcl9zdHIgPDwgIklmIHRoZSBkZXNjcmlwdG9yIHBvb2wgZnJvbSB3aGljaCBwbmFtZTpzcmNTZXQgKCIgPDwgdXBkYXRlLT5zcmNTZXQKKyAgICAgICAgICAgICAgICAgIDw8ICIpIHdhcyBhbGxvY2F0ZWQgd2FzIGNyZWF0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgdGhlIGVuYW1lOlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCBmbGFnICIKKyAgICAgICAgICAgICAgICAgICAgICJzZXQsIHRoZW4gdGhlIGRlc2NyaXB0b3IgcG9vbCBmcm9tIHdoaWNoIHBuYW1lOmRzdFNldCAoIgorICAgICAgICAgICAgICAgICAgPDwgdXBkYXRlLT5kc3RTZXQKKyAgICAgICAgICAgICAgICAgIDw8ICIpIHdhcyBhbGxvY2F0ZWQgbXVzdDogIgorICAgICAgICAgICAgICAgICAgICAgImFsc28gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aG91dCB0aGUgZW5hbWU6VktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9CSVRfRVhUIGZsYWcgc2V0IjsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzcmNfdHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUKSB7CisgICAgICAgIGlmICgodXBkYXRlLT5zcmNBcnJheUVsZW1lbnQgJSA0KSAhPSAwKSB7CisgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjQmluZGluZy0wMjIyMyI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkF0dGVtcHRpbmcgY29weSB1cGRhdGUgdG8gVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVCBiaW5kaW5nIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICJzcmNBcnJheUVsZW1lbnQgIiA8PCB1cGRhdGUtPnNyY0FycmF5RWxlbWVudCA8PCAiIG5vdCBhIG11bHRpcGxlIG9mIDQiOworICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHVwZGF0ZS0+ZHN0QXJyYXlFbGVtZW50ICUgNCkgIT0gMCkgeworICAgICAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWRzdEJpbmRpbmctMDIyMjQiOworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJBdHRlbXB0aW5nIGNvcHkgdXBkYXRlIHRvIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgYmluZGluZyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiZHN0QXJyYXlFbGVtZW50ICIgPDwgdXBkYXRlLT5kc3RBcnJheUVsZW1lbnQgPDwgIiBub3QgYSBtdWx0aXBsZSBvZiA0IjsKKyAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh1cGRhdGUtPmRlc2NyaXB0b3JDb3VudCAlIDQpICE9IDApIHsKKyAgICAgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNCaW5kaW5nLTAyMjI1IjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGluZyBjb3B5IHVwZGF0ZSB0byBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIGJpbmRpbmcgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgImRlc2NyaXB0b3JDb3VudCAiIDw8IHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50IDw8ICIgbm90IGEgbXVsdGlwbGUgb2YgNCI7CisgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXBkYXRlIHBhcmFtZXRlcnMgYWxsIGxvb2sgZ29vZCBhbmQgZGVzY3JpcHRvciB1cGRhdGVkIHNvIHZlcmlmeSB1cGRhdGUgY29udGVudHMKKyAgICBpZiAoIVZlcmlmeUNvcHlVcGRhdGVDb250ZW50cyh1cGRhdGUsIHNyY19zZXQsIHNyY190eXBlLCBzcmNfc3RhcnRfaWR4LCBmdW5jX25hbWUsIGVycm9yX2NvZGUsIGVycm9yX21zZykpIHJldHVybiBmYWxzZTsKKworICAgIC8vIEFsbCBjaGVja3MgcGFzc2VkIHNvIHVwZGF0ZSBpcyBnb29kCisgICAgcmV0dXJuIHRydWU7Cit9CisvLyBQZXJmb3JtIENvcHkgdXBkYXRlCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldDo6UGVyZm9ybUNvcHlVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQgKnVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yU2V0ICpzcmNfc2V0KSB7CisgICAgYXV0byBzcmNfc3RhcnRfaWR4ID0gc3JjX3NldC0+R2V0R2xvYmFsSW5kZXhSYW5nZUZyb21CaW5kaW5nKHVwZGF0ZS0+c3JjQmluZGluZykuc3RhcnQgKyB1cGRhdGUtPnNyY0FycmF5RWxlbWVudDsKKyAgICBhdXRvIGRzdF9zdGFydF9pZHggPSBwX2xheW91dF8tPkdldEdsb2JhbEluZGV4UmFuZ2VGcm9tQmluZGluZyh1cGRhdGUtPmRzdEJpbmRpbmcpLnN0YXJ0ICsgdXBkYXRlLT5kc3RBcnJheUVsZW1lbnQ7CisgICAgLy8gVXBkYXRlIHBhcmFtZXRlcnMgYWxsIGxvb2sgZ29vZCBzbyBwZXJmb3JtIHVwZGF0ZQorICAgIGZvciAodWludDMyX3QgZGkgPSAwOyBkaSA8IHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50OyArK2RpKSB7CisgICAgICAgIGF1dG8gc3JjID0gc3JjX3NldC0+ZGVzY3JpcHRvcnNfW3NyY19zdGFydF9pZHggKyBkaV0uZ2V0KCk7CisgICAgICAgIGF1dG8gZHN0ID0gZGVzY3JpcHRvcnNfW2RzdF9zdGFydF9pZHggKyBkaV0uZ2V0KCk7CisgICAgICAgIGlmIChzcmMtPnVwZGF0ZWQpIHsKKyAgICAgICAgICAgIGRzdC0+Q29weVVwZGF0ZShkZXZfZGF0YSwgc3JjKTsKKyAgICAgICAgICAgIHNvbWVfdXBkYXRlXyA9IHRydWU7CisgICAgICAgICAgICBjaGFuZ2VfY291bnRfKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3QtPnVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghKHBfbGF5b3V0Xy0+R2V0RGVzY3JpcHRvckJpbmRpbmdGbGFnc0Zyb21CaW5kaW5nKHVwZGF0ZS0+ZHN0QmluZGluZykgJgorICAgICAgICAgIChWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX1VOVVNFRF9XSElMRV9QRU5ESU5HX0JJVF9FWFQgfCBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkpKSB7CisgICAgICAgIEludmFsaWRhdGVCb3VuZENtZEJ1ZmZlcnMoZGV2X2RhdGEpOworICAgIH0KK30KKworLy8gVXBkYXRlIHRoZSBkcmF3aW5nIHN0YXRlIGZvciB0aGUgYWZmZWN0ZWQgZGVzY3JpcHRvcnMuCisvLyBTZXQgY2Jfbm9kZSB0byB0aGlzIHNldCBhbmQgdGhpcyBzZXQgdG8gY2Jfbm9kZS4KKy8vIEFkZCB0aGUgYmluZGluZ3Mgb2YgdGhlIGRlc2NyaXB0b3IKKy8vIFNldCB0aGUgbGF5b3V0IGJhc2VkIG9uIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgbGF5b3V0ICh3aWxsIG1hc2sgc3Vic2VxdWVudCBsYXllciBtaXNtYXRjaCBlcnJvcnMpCisvLyBUT0RPOiBNb2RpZnkgdGhlIFVwZGF0ZURyYXdTdGF0ZSB2aXJ0dXJhbCBmdW5jdGlvbnMgdG8gKm9ubHkqIHNldCBpbml0aWFsIGxheW91dCBhbmQgbm90IGNoYW5nZSBsYXlvdXRzCisvLyBQcmVyZXE6IFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmb3IgYSBzZXQgdGhhdCBoYXMgYmVlbiBjb25maXJtZWQgdG8gYmUgYWN0aXZlIGZvciB0aGUgZ2l2ZW4gY2Jfbm9kZSwgbWVhbmluZyBpdCdzIGdvaW5nCisvLyAgIHRvIGJlIHVzZWQgaW4gYSBkcmF3IGJ5IHRoZSBnaXZlbiBjYl9ub2RlCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldDo6VXBkYXRlRHJhd1N0YXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldmljZV9kYXRhLCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQSVBFTElORV9TVEFURSAqcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dWludDMyX3QsIGRlc2NyaXB0b3JfcmVxPiAmYmluZGluZ19yZXFfbWFwKSB7CisgICAgaWYgKCFkZXZpY2VfZGF0YS0+ZGlzYWJsZWQuY29tbWFuZF9idWZmZXJfc3RhdGUpIHsKKyAgICAgICAgLy8gYmluZCBjYiB0byB0aGlzIGRlc2NyaXB0b3Igc2V0CisgICAgICAgIC8vIEFkZCBiaW5kaW5ncyBmb3IgZGVzY3JpcHRvciBzZXQsIHRoZSBzZXQncyBwb29sLCBhbmQgaW5kaXZpZHVhbCBvYmplY3RzIGluIHRoZSBzZXQKKyAgICAgICAgaWYgKGRldmljZV9kYXRhLT5BZGRDb21tYW5kQnVmZmVyQmluZGluZyhjYl9iaW5kaW5ncywgVnVsa2FuVHlwZWRIYW5kbGUoc2V0Xywga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0LCB0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9ub2RlKSkgeworICAgICAgICAgICAgZGV2aWNlX2RhdGEtPkFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKHBvb2xfc3RhdGVfLT5jYl9iaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShwb29sX3N0YXRlXy0+cG9vbCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbCwgcG9vbF9zdGF0ZV8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX25vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRGVzY3JpcHRvciBVcGRhdGVEcmF3U3RhdGUgZnVuY3Rpb25zIGRvIHR3byB0aGluZ3MgLSBhc3NvY2lhdGUgcmVzb3VyY2VzIHRvIHRoZSBjb21tYW5kIGJ1ZmZlciwKKyAgICAvLyBhbmQgY2FsbCBpbWFnZSBsYXlvdXQgdmFsaWRhdGlvbiBjYWxsYmFja3MuIElmIGJvdGggYXJlIGRpc2FibGVkLCBza2lwIHRoZSBlbnRpcmUgbG9vcC4KKyAgICBpZiAoZGV2aWNlX2RhdGEtPmRpc2FibGVkLmNvbW1hbmRfYnVmZmVyX3N0YXRlICYmIGRldmljZV9kYXRhLT5kaXNhYmxlZC5pbWFnZV9sYXlvdXRfdmFsaWRhdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRm9yIHRoZSBhY3RpdmUgc2xvdHMsIHVzZSBzZXQjIHRvIGxvb2sgdXAgZGVzY3JpcHRvclNldCBmcm9tIGJvdW5kRGVzY3JpcHRvclNldHMsIGFuZCBiaW5kIGFsbCBvZiB0aGF0IGRlc2NyaXB0b3Igc2V0J3MKKyAgICAvLyByZXNvdXJjZXMKKyAgICBmb3IgKGF1dG8gYmluZGluZ19yZXFfcGFpciA6IGJpbmRpbmdfcmVxX21hcCkgeworICAgICAgICBhdXRvIGJpbmRpbmcgPSBiaW5kaW5nX3JlcV9wYWlyLmZpcnN0OworICAgICAgICBhdXRvIGluZGV4ID0gcF9sYXlvdXRfLT5HZXRJbmRleEZyb21CaW5kaW5nKGJpbmRpbmdfcmVxX3BhaXIuZmlyc3QpOworCisgICAgICAgIC8vIFdlIGFyZW4ndCB2YWxpZGF0aW5nIGRlc2NyaXB0b3JzIGNyZWF0ZWQgd2l0aCBQQVJUSUFMTFlfQk9VTkQgb3IgVVBEQVRFX0FGVEVSX0JJTkQsIHNvIGRvbid0IHJlY29yZCBzdGF0ZQorICAgICAgICBhdXRvIGZsYWdzID0gcF9sYXlvdXRfLT5HZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzRnJvbUluZGV4KGluZGV4KTsKKyAgICAgICAgaWYgKGZsYWdzICYgKFZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVCB8IFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUKSkgeworICAgICAgICAgICAgaWYgKGZsYWdzICYgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQpIHsKKyAgICAgICAgICAgICAgICBjYl9ub2RlLT52YWxpZGF0ZV9kZXNjcmlwdG9yc2V0c19pbl9xdWV1ZXN1Ym1pdFtzZXRfXVtwaXBlLT5waXBlbGluZV1bYmluZGluZ10gPSBiaW5kaW5nX3JlcV9wYWlyLnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gcmFuZ2UgPSBwX2xheW91dF8tPkdldEdsb2JhbEluZGV4UmFuZ2VGcm9tSW5kZXgoaW5kZXgpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSByYW5nZS5zdGFydDsgaSA8IHJhbmdlLmVuZDsgKytpKSB7CisgICAgICAgICAgICBkZXNjcmlwdG9yc19baV0tPlVwZGF0ZURyYXdTdGF0ZShkZXZpY2VfZGF0YSwgY2Jfbm9kZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0OjpGaWx0ZXJPbmVCaW5kaW5nUmVxKGNvbnN0IEJpbmRpbmdSZXFNYXA6OnZhbHVlX3R5cGUgJmJpbmRpbmdfcmVxX3BhaXIsIEJpbmRpbmdSZXFNYXAgKm91dF9yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFja2VkQmluZGluZ3MgJmJpbmRpbmdzLCB1aW50MzJfdCBsaW1pdCkgeworICAgIGlmIChiaW5kaW5ncy5zaXplKCkgPCBsaW1pdCkgeworICAgICAgICBjb25zdCBhdXRvIGl0ID0gYmluZGluZ3MuZmluZChiaW5kaW5nX3JlcV9wYWlyLmZpcnN0KTsKKyAgICAgICAgaWYgKGl0ID09IGJpbmRpbmdzLmNlbmQoKSkgb3V0X3JlcS0+ZW1wbGFjZShiaW5kaW5nX3JlcV9wYWlyKTsKKyAgICB9Cit9CisKK3ZvaWQgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0OjpGaWx0ZXJCaW5kaW5nUmVxcyhjb25zdCBDTURfQlVGRkVSX1NUQVRFICZjYl9zdGF0ZSwgY29uc3QgUElQRUxJTkVfU1RBVEUgJnBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJpbmRpbmdSZXFNYXAgJmluX3JlcSwgQmluZGluZ1JlcU1hcCAqb3V0X3JlcSkgY29uc3QgeworICAgIC8vIEZvciBjb25zdCBjbGVhbmxpbmVzcyB3ZSBoYXZlIHRvIGZpbmQgaW4gdGhlIG1hcHMuLi4KKyAgICBjb25zdCBhdXRvIHZhbGlkYXRlZF9pdCA9IGNhY2hlZF92YWxpZGF0aW9uXy5maW5kKCZjYl9zdGF0ZSk7CisgICAgaWYgKHZhbGlkYXRlZF9pdCA9PSBjYWNoZWRfdmFsaWRhdGlvbl8uY2VuZCgpKSB7CisgICAgICAgIC8vIFdlIGhhdmUgbm90aGluZyB2YWxpZGF0ZWQsIGNvcHkgaW4gdG8gb3V0CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmYmluZGluZ19yZXFfcGFpciA6IGluX3JlcSkgeworICAgICAgICAgICAgb3V0X3JlcS0+ZW1wbGFjZShiaW5kaW5nX3JlcV9wYWlyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IGF1dG8gJnZhbGlkYXRlZCA9IHZhbGlkYXRlZF9pdC0+c2Vjb25kOworCisgICAgY29uc3QgYXV0byBpbWFnZV9zYW1wbGVfdmVyc2lvbl9pdCA9IHZhbGlkYXRlZC5pbWFnZV9zYW1wbGVycy5maW5kKCZwaXBlbGluZSk7CisgICAgY29uc3QgVmVyc2lvbmVkQmluZGluZ3MgKmltYWdlX3NhbXBsZV92ZXJzaW9uID0gbnVsbHB0cjsKKyAgICBpZiAoaW1hZ2Vfc2FtcGxlX3ZlcnNpb25faXQgIT0gdmFsaWRhdGVkLmltYWdlX3NhbXBsZXJzLmNlbmQoKSkgeworICAgICAgICBpbWFnZV9zYW1wbGVfdmVyc2lvbiA9ICYoaW1hZ2Vfc2FtcGxlX3ZlcnNpb25faXQtPnNlY29uZCk7CisgICAgfQorICAgIGNvbnN0IGF1dG8gJmR5bmFtaWNfYnVmZmVycyA9IHZhbGlkYXRlZC5keW5hbWljX2J1ZmZlcnM7CisgICAgY29uc3QgYXV0byAmbm9uX2R5bmFtaWNfYnVmZmVycyA9IHZhbGlkYXRlZC5ub25fZHluYW1pY19idWZmZXJzOworICAgIGNvbnN0IGF1dG8gJnN0YXRzID0gcF9sYXlvdXRfLT5HZXRCaW5kaW5nVHlwZVN0YXRzKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZiaW5kaW5nX3JlcV9wYWlyIDogaW5fcmVxKSB7CisgICAgICAgIGF1dG8gYmluZGluZyA9IGJpbmRpbmdfcmVxX3BhaXIuZmlyc3Q7CisgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgY29uc3QgKmxheW91dF9iaW5kaW5nID0gcF9sYXlvdXRfLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1B0ckZyb21CaW5kaW5nKGJpbmRpbmcpOworICAgICAgICBpZiAoIWxheW91dF9iaW5kaW5nKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBDYWNoaW5nIGNyaXRlcmlhIGRpZmZlcnMgcGVyIHR5cGUuCisgICAgICAgIC8vIElmIGltYWdlX2xheW91dCBoYXZlIGNoYW5nZWQgLCB0aGUgaW1hZ2UgZGVzY3JpcHRvcnMgbmVlZCB0byBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGVtLgorICAgICAgICBpZiAoKGxheW91dF9iaW5kaW5nLT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQykgfHwKKyAgICAgICAgICAgIChsYXlvdXRfYmluZGluZy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMpKSB7CisgICAgICAgICAgICBGaWx0ZXJPbmVCaW5kaW5nUmVxKGJpbmRpbmdfcmVxX3BhaXIsIG91dF9yZXEsIGR5bmFtaWNfYnVmZmVycywgc3RhdHMuZHluYW1pY19idWZmZXJfY291bnQpOworICAgICAgICB9IGVsc2UgaWYgKChsYXlvdXRfYmluZGluZy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSKSB8fAorICAgICAgICAgICAgICAgICAgIChsYXlvdXRfYmluZGluZy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSKSkgeworICAgICAgICAgICAgRmlsdGVyT25lQmluZGluZ1JlcShiaW5kaW5nX3JlcV9wYWlyLCBvdXRfcmVxLCBub25fZHluYW1pY19idWZmZXJzLCBzdGF0cy5ub25fZHluYW1pY19idWZmZXJfY291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhpcyBpcyByYXRoZXIgY3J1ZGUsIGFzIHRoZSBjaGFuZ2VkIGxheW91dHMgbWF5IG5vdCBpbXBhY3QgdGhlIGJvdW5kIGRlc2NyaXB0b3JzLAorICAgICAgICAgICAgLy8gYnV0IHRoZSBzaW1wbGUgInZlcnNpb25pbmciIGlzIGEgc2ltcGxlICJkaXJ0IiB0ZXN0LgorICAgICAgICAgICAgYm9vbCBzdGFsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAoaW1hZ2Vfc2FtcGxlX3ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHZlcnNpb25faXQgPSBpbWFnZV9zYW1wbGVfdmVyc2lvbi0+ZmluZChiaW5kaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbl9pdCAhPSBpbWFnZV9zYW1wbGVfdmVyc2lvbi0+Y2VuZCgpICYmICh2ZXJzaW9uX2l0LT5zZWNvbmQgPT0gY2Jfc3RhdGUuaW1hZ2VfbGF5b3V0X2NoYW5nZV9jb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhbGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhbGUpIHsKKyAgICAgICAgICAgICAgICBvdXRfcmVxLT5lbXBsYWNlKGJpbmRpbmdfcmVxX3BhaXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldDo6VXBkYXRlVmFsaWRhdGlvbkNhY2hlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgJmNiX3N0YXRlLCBjb25zdCBQSVBFTElORV9TVEFURSAmcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJpbmRpbmdSZXFNYXAgJnVwZGF0ZWRfYmluZGluZ3MpIHsKKyAgICAvLyBGb3IgY29uc3QgY2xlYW5saW5lc3Mgd2UgaGF2ZSB0byBmaW5kIGluIHRoZSBtYXBzLi4uCisgICAgYXV0byAmdmFsaWRhdGVkID0gY2FjaGVkX3ZhbGlkYXRpb25fWyZjYl9zdGF0ZV07CisKKyAgICBhdXRvICZpbWFnZV9zYW1wbGVfdmVyc2lvbiA9IHZhbGlkYXRlZC5pbWFnZV9zYW1wbGVyc1smcGlwZWxpbmVdOworICAgIGF1dG8gJmR5bmFtaWNfYnVmZmVycyA9IHZhbGlkYXRlZC5keW5hbWljX2J1ZmZlcnM7CisgICAgYXV0byAmbm9uX2R5bmFtaWNfYnVmZmVycyA9IHZhbGlkYXRlZC5ub25fZHluYW1pY19idWZmZXJzOworICAgIGZvciAoY29uc3QgYXV0byAmYmluZGluZ19yZXFfcGFpciA6IHVwZGF0ZWRfYmluZGluZ3MpIHsKKyAgICAgICAgYXV0byBiaW5kaW5nID0gYmluZGluZ19yZXFfcGFpci5maXJzdDsKKyAgICAgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBjb25zdCAqbGF5b3V0X2JpbmRpbmcgPSBwX2xheW91dF8tPkdldERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nUHRyRnJvbUJpbmRpbmcoYmluZGluZyk7CisgICAgICAgIGlmICghbGF5b3V0X2JpbmRpbmcpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIENhY2hpbmcgY3JpdGVyaWEgZGlmZmVycyBwZXIgdHlwZS4KKyAgICAgICAgaWYgKChsYXlvdXRfYmluZGluZy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMpIHx8CisgICAgICAgICAgICAobGF5b3V0X2JpbmRpbmctPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDKSkgeworICAgICAgICAgICAgZHluYW1pY19idWZmZXJzLmVtcGxhY2UoYmluZGluZyk7CisgICAgICAgIH0gZWxzZSBpZiAoKGxheW91dF9iaW5kaW5nLT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIpIHx8CisgICAgICAgICAgICAgICAgICAgKGxheW91dF9iaW5kaW5nLT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIpKSB7CisgICAgICAgICAgICBub25fZHluYW1pY19idWZmZXJzLmVtcGxhY2UoYmluZGluZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTYXZlIHRoZSBsYXlvdXQgY2hhbmdlIHZlcnNpb24uLi4KKyAgICAgICAgICAgIGltYWdlX3NhbXBsZV92ZXJzaW9uW2JpbmRpbmddID0gY2Jfc3RhdGUuaW1hZ2VfbGF5b3V0X2NoYW5nZV9jb3VudDsKKyAgICAgICAgfQorICAgIH0KK30KKworY3ZkZXNjcmlwdG9yc2V0OjpTYW1wbGVyRGVzY3JpcHRvcjo6U2FtcGxlckRlc2NyaXB0b3IoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrU2FtcGxlciAqaW1tdXQpCisgICAgOiBzYW1wbGVyXyhWS19OVUxMX0hBTkRMRSksIGltbXV0YWJsZV8oZmFsc2UpIHsKKyAgICB1cGRhdGVkID0gZmFsc2U7CisgICAgZGVzY3JpcHRvcl9jbGFzcyA9IFBsYWluU2FtcGxlcjsKKyAgICBpZiAoaW1tdXQpIHsKKyAgICAgICAgc2FtcGxlcl8gPSAqaW1tdXQ7CisgICAgICAgIHNhbXBsZXJfc3RhdGVfID0gZGV2X2RhdGEtPkdldFNhbXBsZXJTaGFyZWQoc2FtcGxlcl8pOworICAgICAgICBpbW11dGFibGVfID0gdHJ1ZTsKKyAgICAgICAgdXBkYXRlZCA9IHRydWU7CisgICAgfQorfQorLy8gVmFsaWRhdGUgZ2l2ZW4gc2FtcGxlci4gQ3VycmVudGx5IHRoaXMgb25seSBjaGVja3MgdG8gbWFrZSBzdXJlIGl0IGV4aXN0cyBpbiB0aGUgc2FtcGxlck1hcAorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVNhbXBsZXIoY29uc3QgVmtTYW1wbGVyIHNhbXBsZXIpIGNvbnN0IHsgcmV0dXJuIChHZXRTYW1wbGVyU3RhdGUoc2FtcGxlcikgIT0gbnVsbHB0cik7IH0KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUltYWdlVXBkYXRlKFZrSW1hZ2VWaWV3IGltYWdlX3ZpZXcsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VfbGF5b3V0LCBWa0Rlc2NyaXB0b3JUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY19uYW1lLCBzdGQ6OnN0cmluZyAqZXJyb3JfY29kZSwgc3RkOjpzdHJpbmcgKmVycm9yX21zZykgY29uc3QgeworICAgIGF1dG8gaXZfc3RhdGUgPSBHZXRJbWFnZVZpZXdTdGF0ZShpbWFnZV92aWV3KTsKKyAgICBhc3NlcnQoaXZfc3RhdGUpOworCisgICAgLy8gTm90ZSB0aGF0IHdoZW4gYW4gaW1hZ2V2aWV3IGlzIGNyZWF0ZWQsIHdlIHZhbGlkYXRlZCB0aGF0IG1lbW9yeSBpcyBib3VuZCBzbyBubyBuZWVkIHRvIHJlLWNoZWNrIGhlcmUKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IGltYWdlTGF5b3V0IGlzIGNvbXBhdGlibGUgd2l0aCBhc3BlY3RfbWFzayBhbmQgaW1hZ2UgZm9ybWF0CisgICAgLy8gIGFuZCB2YWxpZGF0ZSB0aGF0IGltYWdlIHVzYWdlIGJpdHMgYXJlIGNvcnJlY3QgZm9yIGdpdmVuIHVzYWdlCisgICAgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdF9tYXNrID0gaXZfc3RhdGUtPmNyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzazsKKyAgICBWa0ltYWdlIGltYWdlID0gaXZfc3RhdGUtPmNyZWF0ZV9pbmZvLmltYWdlOworICAgIFZrRm9ybWF0IGZvcm1hdCA9IFZLX0ZPUk1BVF9NQVhfRU5VTTsKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZSA9IDA7CisgICAgYXV0byBpbWFnZV9ub2RlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgYXNzZXJ0KGltYWdlX25vZGUpOworCisgICAgZm9ybWF0ID0gaW1hZ2Vfbm9kZS0+Y3JlYXRlSW5mby5mb3JtYXQ7CisgICAgdXNhZ2UgPSBpbWFnZV9ub2RlLT5jcmVhdGVJbmZvLnVzYWdlOworICAgIC8vIFZhbGlkYXRlIHRoYXQgbWVtb3J5IGlzIGJvdW5kIHRvIGltYWdlCisgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgaGF2ZSBpdHMgb3duIHZhbGlkIHVzYWdlIGlkIGFwYXJ0IGZyb20gMjUyNCB3aGljaCBpcyBmcm9tIENyZWF0ZUltYWdlVmlldyBjYXNlLiBUaGUgb25seQorICAgIC8vICB0aGUgZXJyb3IgaGVyZSBvY2N1cnMgaXMgaWYgbWVtb3J5IGJvdW5kIHRvIGEgY3JlYXRlZCBpbWFnZVZpZXcgaGFzIGJlZW4gZnJlZWQuCisgICAgaWYgKFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvSW1hZ2UoaW1hZ2Vfbm9kZSwgZnVuY19uYW1lLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMjAiKSkgeworICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTAyMCI7CisgICAgICAgICplcnJvcl9tc2cgPSAiTm8gbWVtb3J5IGJvdW5kIHRvIGltYWdlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBLSFJfbWFpbnRlbmFuY2UxIGFsbG93cyByZW5kZXJpbmcgaW50byAyRCBvciAyREFycmF5IHZpZXdzIHdoaWNoIHNsaWNlIGEgM0QgaW1hZ2UsCisgICAgLy8gYnV0IG5vdCBiaW5kaW5nIHRoZW0gdG8gZGVzY3JpcHRvciBzZXRzLgorICAgIGlmIChpbWFnZV9ub2RlLT5jcmVhdGVJbmZvLmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzNEICYmIChpdl9zdGF0ZS0+Y3JlYXRlX2luZm8udmlld1R5cGUgPT0gVktfSU1BR0VfVklFV19UWVBFXzJEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2X3N0YXRlLT5jcmVhdGVfaW5mby52aWV3VHlwZSA9PSBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkpKSB7CisgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWltYWdlVmlldy0wMDM0MyI7CisgICAgICAgICplcnJvcl9tc2cgPSAiSW1hZ2VWaWV3IG11c3Qgbm90IGJlIGEgMkQgb3IgMkRBcnJheSB2aWV3IG9mIGEgM0QgaW1hZ2UiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVE9ETyA6IFRoZSB2YXJpb3VzIGltYWdlIGFzcGVjdCBhbmQgZm9ybWF0IGNoZWNrcyBoZXJlIGFyZSBiYXNlZCBvbiBnZW5lcmFsIHNwZWMgbGFuZ3VhZ2UgaW4gMTEuNSBJbWFnZSBWaWV3cyBzZWN0aW9uIHVuZGVyCisgICAgLy8gdmtDcmVhdGVJbWFnZVZpZXcoKS4gV2hhdCdzIHRoZSBiZXN0IHdheSB0byBjcmVhdGUgdW5pcXVlIGlkIGZvciB0aGVzZSBjYXNlcz8KKyAgICAqZXJyb3JfY29kZSA9ICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2VWaWV3IjsKKyAgICBib29sIGRzID0gRm9ybWF0SXNEZXB0aE9yU3RlbmNpbChmb3JtYXQpOworICAgIHN3aXRjaCAoaW1hZ2VfbGF5b3V0KSB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDoKKyAgICAgICAgICAgIC8vIE9ubHkgQ29sb3IgYml0IG11c3QgYmUgc2V0CisgICAgICAgICAgICBpZiAoKGFzcGVjdF9tYXNrICYgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCkgIT0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICBlcnJvcl9zdHIKKyAgICAgICAgICAgICAgICAgICAgPDwgIkltYWdlVmlldyAoIiA8PCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3ZpZXcpLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIikgdXNlcyBsYXlvdXQgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCBidXQgZG9lcyBub3QgaGF2ZSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIHNldC4iOworICAgICAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZm9ybWF0IG11c3QgTk9UIGJlIERTCisgICAgICAgICAgICBpZiAoZHMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJJbWFnZVZpZXcgKCIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV92aWV3KS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHVzZXMgbGF5b3V0IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgYnV0IHRoZSBpbWFnZSBmb3JtYXQgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmdfVmtGb3JtYXQoZm9ybWF0KSA8PCAiIHdoaWNoIGlzIG5vdCBhIGNvbG9yIGZvcm1hdC4iOworICAgICAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOgorICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOgorICAgICAgICAgICAgLy8gRGVwdGggb3Igc3RlbmNpbCBiaXQgbXVzdCBiZSBzZXQsIGJ1dCBib3RoIG11c3QgTk9UIGJlIHNldAorICAgICAgICAgICAgaWYgKGFzcGVjdF9tYXNrICYgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCkgeworICAgICAgICAgICAgICAgIGlmIChhc3BlY3RfbWFzayAmIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBib3RoICBtdXN0IE5PVCBiZSBzZXQKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkltYWdlVmlldyAoIiA8PCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3ZpZXcpLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIGhhcyBib3RoIFNURU5DSUwgYW5kIERFUFRIIGFzcGVjdHMgc2V0IjsKKyAgICAgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShhc3BlY3RfbWFzayAmIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOZWl0aGVyIHdlcmUgc2V0CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiSW1hZ2VWaWV3ICgiIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2VfdmlldykuY19zdHIoKSA8PCAiKSBoYXMgbGF5b3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RyaW5nX1ZrSW1hZ2VMYXlvdXQoaW1hZ2VfbGF5b3V0KSA8PCAiIGJ1dCBkb2VzIG5vdCBoYXZlIFNURU5DSUwgb3IgREVQVEggYXNwZWN0cyBzZXQiOworICAgICAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZm9ybWF0IG11c3QgYmUgRFMKKyAgICAgICAgICAgIGlmICghZHMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJJbWFnZVZpZXcgKCIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV92aWV3KS5jX3N0cigpIDw8ICIpIGhhcyBsYXlvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmdfVmtJbWFnZUxheW91dChpbWFnZV9sYXlvdXQpIDw8ICIgYnV0IHRoZSBpbWFnZSBmb3JtYXQgaXMgIiA8PCBzdHJpbmdfVmtGb3JtYXQoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdoaWNoIGlzIG5vdCBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0LiI7CisgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIEZvciBvdGhlciBsYXlvdXRzIGlmIHRoZSBzb3VyY2UgaXMgZGVwdGgvc3RlbmNpbCBpbWFnZSwgYm90aCBhc3BlY3QgYml0cyBtdXN0IG5vdCBiZSBzZXQKKyAgICAgICAgICAgIGlmIChkcykgeworICAgICAgICAgICAgICAgIGlmIChhc3BlY3RfbWFzayAmIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFzcGVjdF9tYXNrICYgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoICBtdXN0IE5PVCBiZSBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiSW1hZ2VWaWV3ICgiIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2VfdmlldykuY19zdHIoKSA8PCAiKSBoYXMgbGF5b3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmdfVmtJbWFnZUxheW91dChpbWFnZV9sYXlvdXQpIDw8ICIgYW5kIGlzIHVzaW5nIGRlcHRoL3N0ZW5jaWwgaW1hZ2Ugb2YgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmdfVmtGb3JtYXQoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnV0IGl0IGhhcyBib3RoIFNURU5DSUwgYW5kIERFUFRIIGFzcGVjdHMgc2V0LCB3aGljaCBpcyBpbGxlZ2FsLiBXaGVuIHVzaW5nIGEgZGVwdGgvc3RlbmNpbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlIGluIGEgZGVzY3JpcHRvciBzZXQsIHBsZWFzZSBvbmx5IHNldCBlaXRoZXIgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCB3aWxsIGJlIHVzZWQgZm9yIGRlcHRoIHJlYWRzIG9yIHN0ZW5jaWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkcyByZXNwZWN0aXZlbHkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWltYWdlVmlldy0wMTk3NiI7CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIE5vdyB2YWxpZGF0ZSB0aGF0IHVzYWdlIGZsYWdzIGFyZSBjb3JyZWN0bHkgc2V0IGZvciBnaXZlbiB0eXBlIG9mIHVwZGF0ZQorICAgIC8vICBBcyB3ZSdyZSBzd2l0Y2hpbmcgcGVyLXR5cGUsIGlmIGFueSB0eXBlIGhhcyBzcGVjaWZpYyBsYXlvdXQgcmVxdWlyZW1lbnRzLCBjaGVjayB0aG9zZSBoZXJlIGFzIHdlbGwKKyAgICAvLyBUT0RPIDogVGhlIHZhcmlvdXMgaW1hZ2UgdXNhZ2UgYml0IHJlcXVpcmVtZW50cyBhcmUgaW4gZ2VuZXJhbCBzcGVjIGxhbmd1YWdlIGZvciBWa0ltYWdlVXNhZ2VGbGFncyBiaXQgYmxvY2sgaW4gMTEuMyBJbWFnZXMKKyAgICAvLyB1bmRlciB2a0NyZWF0ZUltYWdlKCkKKyAgICAvLyBUT0RPIDogTmVlZCB0byBhbHNvIHZhbGlkYXRlIGNhc2UgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzYiIHdoZXJlIFNUT1JBR0VfSU1BR0UgJiBJTlBVVF9BVFRBQ0ggdHlwZXMKKyAgICAvLyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggaWRlbnRpZnkgc3dpenpsZQorICAgIGNvbnN0IGNoYXIgKmVycm9yX3VzYWdlX2JpdCA9IG51bGxwdHI7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U6CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI6IHsKKyAgICAgICAgICAgIGlmICghKHVzYWdlICYgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfdXNhZ2VfYml0ID0gIlZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0U6IHsKKyAgICAgICAgICAgIGlmICghKHVzYWdlICYgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfdXNhZ2VfYml0ID0gIlZLX0lNQUdFX1VTQUdFX1NUT1JBR0VfQklUIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgIT0gaW1hZ2VfbGF5b3V0KSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBOZWVkIHRvIGNyZWF0ZSBjdXN0b20gZW51bSBlcnJvciBjb2RlcyBmb3IgdGhlc2UgY2FzZXMKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2Vfbm9kZS0+c2hhcmVkX3ByZXNlbnRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSICE9IGltYWdlX2xheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJJbWFnZVZpZXcgKCIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV92aWV3KS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UgdHlwZSB3aXRoIGEgZnJvbnQtYnVmZmVyZWQgaW1hZ2UgaXMgYmVpbmcgdXBkYXRlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF5b3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmdfVmtJbWFnZUxheW91dChpbWFnZV9sYXlvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBidXQgYWNjb3JkaW5nIHRvIHNwZWMgc2VjdGlvbiAxMy4xIERlc2NyaXB0b3IgVHlwZXMsICdGcm9udC1idWZmZXJlZCBpbWFnZXMgdGhhdCByZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGZvciBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0JJVCBtdXN0IGJlIGluIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFIgbGF5b3V0LiciOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgIT0gaW1hZ2VfbGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiSW1hZ2VWaWV3ICgiIDw8IHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoaW1hZ2VfdmlldykuY19zdHIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UgdHlwZSBpcyBiZWluZyB1cGRhdGVkIHdpdGggbGF5b3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0cmluZ19Wa0ltYWdlTGF5b3V0KGltYWdlX2xheW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnV0IGFjY29yZGluZyB0byBzcGVjIHNlY3Rpb24gMTMuMSBEZXNjcmlwdG9yIFR5cGVzLCAnTG9hZCBhbmQgc3RvcmUgb3BlcmF0aW9ucyBvbiBzdG9yYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZXMgY2FuIG9ubHkgYmUgZG9uZSBvbiBpbWFnZXMgaW4gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgbGF5b3V0LiciOworICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVDogeworICAgICAgICAgICAgaWYgKCEodXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcl91c2FnZV9iaXQgPSAiVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZXJyb3JfdXNhZ2VfYml0KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8ICJJbWFnZVZpZXcgKCIgPDwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShpbWFnZV92aWV3KS5jX3N0cigpIDw8ICIpIHdpdGggdXNhZ2UgbWFzayAiIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnNob3diYXNlIDw8IHVzYWdlIDw8ICIgYmVpbmcgdXNlZCBmb3IgYSBkZXNjcmlwdG9yIHVwZGF0ZSBvZiB0eXBlICIgPDwgc3RyaW5nX1ZrRGVzY3JpcHRvclR5cGUodHlwZSkKKyAgICAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3QgaGF2ZSAiIDw8IGVycm9yX3VzYWdlX2JpdCA8PCAiIHNldC4iOworICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCh0eXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFKSB8fCAodHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUikpIHsKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBsYXlvdXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBkZXNjcmlwdG9yVHlwZSBmb3IgdGhlIHR3byBzYW1wbGVkIGltYWdlIHR5cGVzCisgICAgICAgIGNvbnN0IHN0YXRpYyBzdGQ6OmFycmF5PFZrSW1hZ2VMYXlvdXQsIDM+IHZhbGlkX2xheW91dHMgPSB7CisgICAgICAgICAgICB7VktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMfX07CisKKyAgICAgICAgc3RydWN0IEV4dGVuc2lvbkxheW91dCB7CisgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGxheW91dDsKKyAgICAgICAgICAgIEV4dEVuYWJsZWQgRGV2aWNlRXh0ZW5zaW9uczo6KmV4dGVuc2lvbjsKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBzdGF0aWMgc3RkOjphcnJheTxFeHRlbnNpb25MYXlvdXQsIDM+IGV4dGVuZGVkX2xheW91dHN7CisgICAgICAgICAgICB7Ly8gIE5vdGUgZG91YmxlIGJyYWNlIHJlcSdkIGZvciBhZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICB7VktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUiwgJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2V9LAorICAgICAgICAgICAgIHtWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX21haW50ZW5hbmNlMn0sCisgICAgICAgICAgICAge1ZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsICZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfbWFpbnRlbmFuY2UyfX19OworICAgICAgICBhdXRvIGlzX2xheW91dCA9IFtpbWFnZV9sYXlvdXQsIHRoaXNdKGNvbnN0IEV4dGVuc2lvbkxheW91dCAmZXh0X2xheW91dCkgeworICAgICAgICAgICAgcmV0dXJuIGRldmljZV9leHRlbnNpb25zLiooZXh0X2xheW91dC5leHRlbnNpb24pICYmIChleHRfbGF5b3V0LmxheW91dCA9PSBpbWFnZV9sYXlvdXQpOworICAgICAgICB9OworCisgICAgICAgIGJvb2wgdmFsaWRfbGF5b3V0ID0gKHN0ZDo6ZmluZCh2YWxpZF9sYXlvdXRzLmNiZWdpbigpLCB2YWxpZF9sYXlvdXRzLmNlbmQoKSwgaW1hZ2VfbGF5b3V0KSAhPSB2YWxpZF9sYXlvdXRzLmNlbmQoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFueV9vZihleHRlbmRlZF9sYXlvdXRzLmNiZWdpbigpLCBleHRlbmRlZF9sYXlvdXRzLmNlbmQoKSwgaXNfbGF5b3V0KTsKKworICAgICAgICBpZiAoIXZhbGlkX2xheW91dCkgeworICAgICAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMTQwMyI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkRlc2NyaXB0b3IgdXBkYXRlIHdpdGggZGVzY3JpcHRvclR5cGUgIiA8PCBzdHJpbmdfVmtEZXNjcmlwdG9yVHlwZSh0eXBlKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgYmVpbmcgdXBkYXRlZCB3aXRoIGludmFsaWQgaW1hZ2VMYXlvdXQgIiA8PCBzdHJpbmdfVmtJbWFnZUxheW91dChpbWFnZV9sYXlvdXQpIDw8ICIgZm9yIGltYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlKS5jX3N0cigpIDw8ICIgaW4gaW1hZ2VWaWV3ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGltYWdlX3ZpZXcpLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiLiBBbGxvd2VkIGxheW91dHMgYXJlOiBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICJWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCI7CisgICAgICAgICAgICBmb3IgKGF1dG8gJmV4dF9sYXlvdXQgOiBleHRlbmRlZF9sYXlvdXRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9leHRlbnNpb25zLiooZXh0X2xheW91dC5leHRlbnNpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiLCAiIDw8IHN0cmluZ19Wa0ltYWdlTGF5b3V0KGV4dF9sYXlvdXQubGF5b3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgY3ZkZXNjcmlwdG9yc2V0OjpTYW1wbGVyRGVzY3JpcHRvcjo6V3JpdGVVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICp1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGluZGV4KSB7CisgICAgaWYgKCFpbW11dGFibGVfKSB7CisgICAgICAgIHNhbXBsZXJfID0gdXBkYXRlLT5wSW1hZ2VJbmZvW2luZGV4XS5zYW1wbGVyOworICAgICAgICBzYW1wbGVyX3N0YXRlXyA9IGRldl9kYXRhLT5HZXRTYW1wbGVyU2hhcmVkKHNhbXBsZXJfKTsKKyAgICB9CisgICAgdXBkYXRlZCA9IHRydWU7Cit9CisKK3ZvaWQgY3ZkZXNjcmlwdG9yc2V0OjpTYW1wbGVyRGVzY3JpcHRvcjo6Q29weVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgRGVzY3JpcHRvciAqc3JjKSB7CisgICAgaWYgKCFpbW11dGFibGVfKSB7CisgICAgICAgIGF1dG8gdXBkYXRlX3NhbXBsZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBTYW1wbGVyRGVzY3JpcHRvciAqPihzcmMpLT5zYW1wbGVyXzsKKyAgICAgICAgc2FtcGxlcl8gPSB1cGRhdGVfc2FtcGxlcjsKKyAgICAgICAgc2FtcGxlcl9zdGF0ZV8gPSBkZXZfZGF0YS0+R2V0U2FtcGxlclNoYXJlZChzYW1wbGVyXyk7CisgICAgfQorICAgIHVwZGF0ZWQgPSB0cnVlOworfQorCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6U2FtcGxlckRlc2NyaXB0b3I6OlVwZGF0ZURyYXdTdGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSkgeworICAgIGlmICghaW1tdXRhYmxlXykgeworICAgICAgICBhdXRvIHNhbXBsZXJfc3RhdGUgPSBHZXRTYW1wbGVyU3RhdGUoKTsKKyAgICAgICAgaWYgKHNhbXBsZXJfc3RhdGUpIGRldl9kYXRhLT5BZGRDb21tYW5kQnVmZmVyQmluZGluZ1NhbXBsZXIoY2Jfbm9kZSwgc2FtcGxlcl9zdGF0ZSk7CisgICAgfQorfQorCitjdmRlc2NyaXB0b3JzZXQ6OkltYWdlU2FtcGxlckRlc2NyaXB0b3I6OkltYWdlU2FtcGxlckRlc2NyaXB0b3IoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrU2FtcGxlciAqaW1tdXQpCisgICAgOiBzYW1wbGVyXyhWS19OVUxMX0hBTkRMRSksIGltbXV0YWJsZV8oZmFsc2UpLCBpbWFnZV92aWV3XyhWS19OVUxMX0hBTkRMRSksIGltYWdlX2xheW91dF8oVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCkgeworICAgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICBkZXNjcmlwdG9yX2NsYXNzID0gSW1hZ2VTYW1wbGVyOworICAgIGlmIChpbW11dCkgeworICAgICAgICBzYW1wbGVyXyA9ICppbW11dDsKKyAgICAgICAgc2FtcGxlcl9zdGF0ZV8gPSBkZXZfZGF0YS0+R2V0U2FtcGxlclNoYXJlZChzYW1wbGVyXyk7CisgICAgICAgIGltbXV0YWJsZV8gPSB0cnVlOworICAgIH0KK30KKwordm9pZCBjdmRlc2NyaXB0b3JzZXQ6OkltYWdlU2FtcGxlckRlc2NyaXB0b3I6OldyaXRlVXBkYXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGluZGV4KSB7CisgICAgdXBkYXRlZCA9IHRydWU7CisgICAgY29uc3QgYXV0byAmaW1hZ2VfaW5mbyA9IHVwZGF0ZS0+cEltYWdlSW5mb1tpbmRleF07CisgICAgaWYgKCFpbW11dGFibGVfKSB7CisgICAgICAgIHNhbXBsZXJfID0gaW1hZ2VfaW5mby5zYW1wbGVyOworICAgICAgICBzYW1wbGVyX3N0YXRlXyA9IGRldl9kYXRhLT5HZXRTYW1wbGVyU2hhcmVkKHNhbXBsZXJfKTsKKyAgICB9CisgICAgaW1hZ2Vfdmlld18gPSBpbWFnZV9pbmZvLmltYWdlVmlldzsKKyAgICBpbWFnZV9sYXlvdXRfID0gaW1hZ2VfaW5mby5pbWFnZUxheW91dDsKKyAgICBpbWFnZV92aWV3X3N0YXRlXyA9IGRldl9kYXRhLT5HZXRJbWFnZVZpZXdTaGFyZWQoaW1hZ2Vfdmlld18pOworfQorCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6SW1hZ2VTYW1wbGVyRGVzY3JpcHRvcjo6Q29weVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgRGVzY3JpcHRvciAqc3JjKSB7CisgICAgaWYgKCFpbW11dGFibGVfKSB7CisgICAgICAgIGF1dG8gdXBkYXRlX3NhbXBsZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBJbWFnZVNhbXBsZXJEZXNjcmlwdG9yICo+KHNyYyktPnNhbXBsZXJfOworICAgICAgICBzYW1wbGVyXyA9IHVwZGF0ZV9zYW1wbGVyOworICAgICAgICBzYW1wbGVyX3N0YXRlXyA9IGRldl9kYXRhLT5HZXRTYW1wbGVyU2hhcmVkKHNhbXBsZXJfKTsKKyAgICB9CisgICAgYXV0byBpbWFnZV92aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvciAqPihzcmMpLT5pbWFnZV92aWV3XzsKKyAgICBhdXRvIGltYWdlX2xheW91dCA9IHN0YXRpY19jYXN0PGNvbnN0IEltYWdlU2FtcGxlckRlc2NyaXB0b3IgKj4oc3JjKS0+aW1hZ2VfbGF5b3V0XzsKKyAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICBpbWFnZV92aWV3XyA9IGltYWdlX3ZpZXc7CisgICAgaW1hZ2VfbGF5b3V0XyA9IGltYWdlX2xheW91dDsKKyAgICBpbWFnZV92aWV3X3N0YXRlXyA9IGRldl9kYXRhLT5HZXRJbWFnZVZpZXdTaGFyZWQoaW1hZ2Vfdmlld18pOworfQorCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6SW1hZ2VTYW1wbGVyRGVzY3JpcHRvcjo6VXBkYXRlRHJhd1N0YXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlKSB7CisgICAgLy8gRmlyc3QgYWRkIGJpbmRpbmcgZm9yIGFueSBub24taW1tdXRhYmxlIHNhbXBsZXIKKyAgICBpZiAoIWltbXV0YWJsZV8pIHsKKyAgICAgICAgYXV0byBzYW1wbGVyX3N0YXRlID0gR2V0U2FtcGxlclN0YXRlKCk7CisgICAgICAgIGlmIChzYW1wbGVyX3N0YXRlKSBkZXZfZGF0YS0+QWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdTYW1wbGVyKGNiX25vZGUsIHNhbXBsZXJfc3RhdGUpOworICAgIH0KKyAgICAvLyBBZGQgYmluZGluZyBmb3IgaW1hZ2UKKyAgICBhdXRvIGl2X3N0YXRlID0gR2V0SW1hZ2VWaWV3U3RhdGUoKTsKKyAgICBpZiAoaXZfc3RhdGUpIHsKKyAgICAgICAgZGV2X2RhdGEtPkFkZENvbW1hbmRCdWZmZXJCaW5kaW5nSW1hZ2VWaWV3KGNiX25vZGUsIGl2X3N0YXRlKTsKKyAgICAgICAgZGV2X2RhdGEtPkNhbGxTZXRJbWFnZVZpZXdJbml0aWFsTGF5b3V0Q2FsbGJhY2soY2Jfbm9kZSwgKml2X3N0YXRlLCBpbWFnZV9sYXlvdXRfKTsKKyAgICB9Cit9CisKK2N2ZGVzY3JpcHRvcnNldDo6SW1hZ2VEZXNjcmlwdG9yOjpJbWFnZURlc2NyaXB0b3IoY29uc3QgVmtEZXNjcmlwdG9yVHlwZSB0eXBlKQorICAgIDogc3RvcmFnZV8oZmFsc2UpLCBpbWFnZV92aWV3XyhWS19OVUxMX0hBTkRMRSksIGltYWdlX2xheW91dF8oVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCkgeworICAgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICBkZXNjcmlwdG9yX2NsYXNzID0gSW1hZ2U7CisgICAgaWYgKFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFID09IHR5cGUpIHN0b3JhZ2VfID0gdHJ1ZTsKK30KKwordm9pZCBjdmRlc2NyaXB0b3JzZXQ6OkltYWdlRGVzY3JpcHRvcjo6V3JpdGVVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICp1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBpbmRleCkgeworICAgIHVwZGF0ZWQgPSB0cnVlOworICAgIGNvbnN0IGF1dG8gJmltYWdlX2luZm8gPSB1cGRhdGUtPnBJbWFnZUluZm9baW5kZXhdOworICAgIGltYWdlX3ZpZXdfID0gaW1hZ2VfaW5mby5pbWFnZVZpZXc7CisgICAgaW1hZ2VfbGF5b3V0XyA9IGltYWdlX2luZm8uaW1hZ2VMYXlvdXQ7CisgICAgaW1hZ2Vfdmlld19zdGF0ZV8gPSBkZXZfZGF0YS0+R2V0SW1hZ2VWaWV3U2hhcmVkKGltYWdlX3ZpZXdfKTsKK30KKwordm9pZCBjdmRlc2NyaXB0b3JzZXQ6OkltYWdlRGVzY3JpcHRvcjo6Q29weVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgRGVzY3JpcHRvciAqc3JjKSB7CisgICAgYXV0byBpbWFnZV92aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW1hZ2VEZXNjcmlwdG9yICo+KHNyYyktPmltYWdlX3ZpZXdfOworICAgIGF1dG8gaW1hZ2VfbGF5b3V0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW1hZ2VEZXNjcmlwdG9yICo+KHNyYyktPmltYWdlX2xheW91dF87CisgICAgdXBkYXRlZCA9IHRydWU7CisgICAgaW1hZ2Vfdmlld18gPSBpbWFnZV92aWV3OworICAgIGltYWdlX2xheW91dF8gPSBpbWFnZV9sYXlvdXQ7CisgICAgaW1hZ2Vfdmlld19zdGF0ZV8gPSBkZXZfZGF0YS0+R2V0SW1hZ2VWaWV3U2hhcmVkKGltYWdlX3ZpZXdfKTsKK30KKwordm9pZCBjdmRlc2NyaXB0b3JzZXQ6OkltYWdlRGVzY3JpcHRvcjo6VXBkYXRlRHJhd1N0YXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlKSB7CisgICAgLy8gQWRkIGJpbmRpbmcgZm9yIGltYWdlCisgICAgYXV0byBpdl9zdGF0ZSA9IEdldEltYWdlVmlld1N0YXRlKCk7CisgICAgaWYgKGl2X3N0YXRlKSB7CisgICAgICAgIGRldl9kYXRhLT5BZGRDb21tYW5kQnVmZmVyQmluZGluZ0ltYWdlVmlldyhjYl9ub2RlLCBpdl9zdGF0ZSk7CisgICAgICAgIGRldl9kYXRhLT5DYWxsU2V0SW1hZ2VWaWV3SW5pdGlhbExheW91dENhbGxiYWNrKGNiX25vZGUsICppdl9zdGF0ZSwgaW1hZ2VfbGF5b3V0Xyk7CisgICAgfQorfQorCitjdmRlc2NyaXB0b3JzZXQ6OkJ1ZmZlckRlc2NyaXB0b3I6OkJ1ZmZlckRlc2NyaXB0b3IoY29uc3QgVmtEZXNjcmlwdG9yVHlwZSB0eXBlKQorICAgIDogc3RvcmFnZV8oZmFsc2UpLCBkeW5hbWljXyhmYWxzZSksIGJ1ZmZlcl8oVktfTlVMTF9IQU5ETEUpLCBvZmZzZXRfKDApLCByYW5nZV8oMCkgeworICAgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICBkZXNjcmlwdG9yX2NsYXNzID0gR2VuZXJhbEJ1ZmZlcjsKKyAgICBpZiAoVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMgPT0gdHlwZSkgeworICAgICAgICBkeW5hbWljXyA9IHRydWU7CisgICAgfSBlbHNlIGlmIChWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIgPT0gdHlwZSkgeworICAgICAgICBzdG9yYWdlXyA9IHRydWU7CisgICAgfSBlbHNlIGlmIChWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQyA9PSB0eXBlKSB7CisgICAgICAgIGR5bmFtaWNfID0gdHJ1ZTsKKyAgICAgICAgc3RvcmFnZV8gPSB0cnVlOworICAgIH0KK30KK3ZvaWQgY3ZkZXNjcmlwdG9yc2V0OjpCdWZmZXJEZXNjcmlwdG9yOjpXcml0ZVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBpbmRleCkgeworICAgIHVwZGF0ZWQgPSB0cnVlOworICAgIGNvbnN0IGF1dG8gJmJ1ZmZlcl9pbmZvID0gdXBkYXRlLT5wQnVmZmVySW5mb1tpbmRleF07CisgICAgYnVmZmVyXyA9IGJ1ZmZlcl9pbmZvLmJ1ZmZlcjsKKyAgICBvZmZzZXRfID0gYnVmZmVyX2luZm8ub2Zmc2V0OworICAgIHJhbmdlXyA9IGJ1ZmZlcl9pbmZvLnJhbmdlOworICAgIGJ1ZmZlcl9zdGF0ZV8gPSBkZXZfZGF0YS0+R2V0QnVmZmVyU2hhcmVkKGJ1ZmZlcl8pOworfQorCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6QnVmZmVyRGVzY3JpcHRvcjo6Q29weVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgRGVzY3JpcHRvciAqc3JjKSB7CisgICAgYXV0byBidWZmX2Rlc2MgPSBzdGF0aWNfY2FzdDxjb25zdCBCdWZmZXJEZXNjcmlwdG9yICo+KHNyYyk7CisgICAgdXBkYXRlZCA9IHRydWU7CisgICAgYnVmZmVyXyA9IGJ1ZmZfZGVzYy0+YnVmZmVyXzsKKyAgICBvZmZzZXRfID0gYnVmZl9kZXNjLT5vZmZzZXRfOworICAgIHJhbmdlXyA9IGJ1ZmZfZGVzYy0+cmFuZ2VfOworICAgIGJ1ZmZlcl9zdGF0ZV8gPSBkZXZfZGF0YS0+R2V0QnVmZmVyU2hhcmVkKGJ1ZmZlcl8pOworfQorCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6QnVmZmVyRGVzY3JpcHRvcjo6VXBkYXRlRHJhd1N0YXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlKSB7CisgICAgYXV0byBidWZmZXJfbm9kZSA9IEdldEJ1ZmZlclN0YXRlKCk7CisgICAgaWYgKGJ1ZmZlcl9ub2RlKSBkZXZfZGF0YS0+QWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfbm9kZSwgYnVmZmVyX25vZGUpOworfQorCitjdmRlc2NyaXB0b3JzZXQ6OlRleGVsRGVzY3JpcHRvcjo6VGV4ZWxEZXNjcmlwdG9yKGNvbnN0IFZrRGVzY3JpcHRvclR5cGUgdHlwZSkgOiBidWZmZXJfdmlld18oVktfTlVMTF9IQU5ETEUpLCBzdG9yYWdlXyhmYWxzZSkgeworICAgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICBkZXNjcmlwdG9yX2NsYXNzID0gVGV4ZWxCdWZmZXI7CisgICAgaWYgKFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiA9PSB0eXBlKSBzdG9yYWdlXyA9IHRydWU7Cit9CisKK3ZvaWQgY3ZkZXNjcmlwdG9yc2V0OjpUZXhlbERlc2NyaXB0b3I6OldyaXRlVXBkYXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaW5kZXgpIHsKKyAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICBidWZmZXJfdmlld18gPSB1cGRhdGUtPnBUZXhlbEJ1ZmZlclZpZXdbaW5kZXhdOworICAgIGJ1ZmZlcl92aWV3X3N0YXRlXyA9IGRldl9kYXRhLT5HZXRCdWZmZXJWaWV3U2hhcmVkKGJ1ZmZlcl92aWV3Xyk7Cit9CisKK3ZvaWQgY3ZkZXNjcmlwdG9yc2V0OjpUZXhlbERlc2NyaXB0b3I6OkNvcHlVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IERlc2NyaXB0b3IgKnNyYykgeworICAgIHVwZGF0ZWQgPSB0cnVlOworICAgIGJ1ZmZlcl92aWV3XyA9IHN0YXRpY19jYXN0PGNvbnN0IFRleGVsRGVzY3JpcHRvciAqPihzcmMpLT5idWZmZXJfdmlld187CisgICAgYnVmZmVyX3ZpZXdfc3RhdGVfID0gZGV2X2RhdGEtPkdldEJ1ZmZlclZpZXdTaGFyZWQoYnVmZmVyX3ZpZXdfKTsKK30KKwordm9pZCBjdmRlc2NyaXB0b3JzZXQ6OlRleGVsRGVzY3JpcHRvcjo6VXBkYXRlRHJhd1N0YXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlKSB7CisgICAgYXV0byBidl9zdGF0ZSA9IEdldEJ1ZmZlclZpZXdTdGF0ZSgpOworICAgIGlmIChidl9zdGF0ZSkgeworICAgICAgICBkZXZfZGF0YS0+QWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXJWaWV3KGNiX25vZGUsIGJ2X3N0YXRlKTsKKyAgICB9Cit9CisKKy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBpdGVyYXRlcyBvdmVyIGEgc2V0IG9mIFdyaXRlIGFuZCBDb3B5IHVwZGF0ZXMsIHB1bGxzIHRoZSBEZXNjcmlwdG9yU2V0KiBmb3IgdXBkYXRlZAorLy8gIHNldHMsIGFuZCB0aGVuIGNhbGxzIHRoZWlyIHJlc3BlY3RpdmUgVmFsaWRhdGVbV3JpdGV8Q29weV1VcGRhdGUgZnVuY3Rpb25zLgorLy8gSWYgdGhlIHVwZGF0ZSBoaXRzIGFuIGlzc3VlIGZvciB3aGljaCB0aGUgY2FsbGJhY2sgcmV0dXJucyAidHJ1ZSIsIG1lYW5pbmcgdGhhdCB0aGUgY2FsbCBkb3duIHRoZSBjaGFpbiBzaG91bGQKKy8vICBiZSBza2lwcGVkLCB0aGVuIHRydWUgaXMgcmV0dXJuZWQuCisvLyBJZiB0aGVyZSBpcyBubyBpc3N1ZSB3aXRoIHRoZSB1cGRhdGUsIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQuCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldHModWludDMyX3Qgd3JpdGVfY291bnQsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICpwX3dkcywgdWludDMyX3QgY29weV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0ICpwX2NkcywgY29uc3QgY2hhciAqZnVuY19uYW1lKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gVmFsaWRhdGUgV3JpdGUgdXBkYXRlcworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGF1dG8gZGVzdF9zZXQgPSBwX3dkc1tpXS5kc3RTZXQ7CisgICAgICAgIGF1dG8gc2V0X25vZGUgPSBHZXRTZXROb2RlKGRlc3Rfc2V0KTsKKyAgICAgICAgaWYgKCFzZXRfbm9kZSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkZXN0X3NldCksIGtWVUlEX0NvcmVfRHJhd1N0YXRlX0ludmFsaWREZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY2FsbCAlcyBvbiAlcyB0aGF0IGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQuIiwgZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoZGVzdF9zZXQpLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX3N0cjsKKyAgICAgICAgICAgIGlmICghVmFsaWRhdGVXcml0ZVVwZGF0ZShzZXRfbm9kZSwgJnBfd2RzW2ldLCBmdW5jX25hbWUsICZlcnJvcl9jb2RlLCAmZXJyb3Jfc3RyKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRlc3Rfc2V0KSwgZXJyb3JfY29kZSwgIiVzIGZhaWxlZCB3cml0ZSB1cGRhdGUgdmFsaWRhdGlvbiBmb3IgJXMgd2l0aCBlcnJvcjogJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGRlc3Rfc2V0KS5jX3N0cigpLCBlcnJvcl9zdHIuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTm93IHZhbGlkYXRlIGNvcHkgdXBkYXRlcworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3B5X2NvdW50OyArK2kpIHsKKyAgICAgICAgYXV0byBkc3Rfc2V0ID0gcF9jZHNbaV0uZHN0U2V0OworICAgICAgICBhdXRvIHNyY19zZXQgPSBwX2Nkc1tpXS5zcmNTZXQ7CisgICAgICAgIGF1dG8gc3JjX25vZGUgPSBHZXRTZXROb2RlKHNyY19zZXQpOworICAgICAgICBhdXRvIGRzdF9ub2RlID0gR2V0U2V0Tm9kZShkc3Rfc2V0KTsKKyAgICAgICAgLy8gT2JqZWN0X3RyYWNrZXIgdmVyaWZpZXMgdGhhdCBzcmMgJiBkZXN0IGRlc2NyaXB0b3Igc2V0IGFyZSB2YWxpZAorICAgICAgICBhc3NlcnQoc3JjX25vZGUpOworICAgICAgICBhc3NlcnQoZHN0X25vZGUpOworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlOworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9zdHI7CisgICAgICAgIGlmICghVmFsaWRhdGVDb3B5VXBkYXRlKCZwX2Nkc1tpXSwgZHN0X25vZGUsIHNyY19ub2RlLCBmdW5jX25hbWUsICZlcnJvcl9jb2RlLCAmZXJyb3Jfc3RyKSkgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZHN0X3NldCksIGVycm9yX2NvZGUsICIlcyBmYWlsZWQgY29weSB1cGRhdGUgZnJvbSAlcyB0byAlcyB3aXRoIGVycm9yOiAlcy4iLCBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNyY19zZXQpLmNfc3RyKCksIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoZHN0X3NldCkuY19zdHIoKSwgZXJyb3Jfc3RyLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYSBzZXQgb2YgV3JpdGUgYW5kIENvcHkgdXBkYXRlcywgcHVsbHMgdGhlIERlc2NyaXB0b3JTZXQqIGZvciB1cGRhdGVkCisvLyAgc2V0cywgYW5kIHRoZW4gY2FsbHMgdGhlaXIgcmVzcGVjdGl2ZSBQZXJmb3JtW1dyaXRlfENvcHldVXBkYXRlIGZ1bmN0aW9ucy4KKy8vIFByZXJlcXVpc2l0ZSA6IFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldHMoKSBzaG91bGQgYmUgY2FsbGVkIGFuZCByZXR1cm4gImZhbHNlIiBwcmlvciB0byBjYWxsaW5nIFBlcmZvcm1VcGRhdGVEZXNjcmlwdG9yU2V0cygpCisvLyAgd2l0aCB0aGUgc2FtZSBzZXQgb2YgdXBkYXRlcy4KKy8vIFRoaXMgaXMgc3BsaXQgZnJvbSB0aGUgdmFsaWRhdGUgY29kZSB0byBhbGxvdyB2YWxpZGF0aW9uIHByaW9yIHRvIGNhbGxpbmcgZG93biB0aGUgY2hhaW4sIGFuZCB0aGVuIHVwZGF0ZSBhZnRlcgorLy8gIGNhbGxpbmcgZG93biB0aGUgY2hhaW4uCit2b2lkIGN2ZGVzY3JpcHRvcnNldDo6UGVyZm9ybVVwZGF0ZURlc2NyaXB0b3JTZXRzKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCB1aW50MzJfdCB3cml0ZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnBfd2RzLCB1aW50MzJfdCBjb3B5X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0ICpwX2NkcykgeworICAgIC8vIFdyaXRlIHVwZGF0ZXMgZmlyc3QKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd3JpdGVfY291bnQ7ICsraSkgeworICAgICAgICBhdXRvIGRlc3Rfc2V0ID0gcF93ZHNbaV0uZHN0U2V0OworICAgICAgICBhdXRvIHNldF9ub2RlID0gZGV2X2RhdGEtPkdldFNldE5vZGUoZGVzdF9zZXQpOworICAgICAgICBpZiAoc2V0X25vZGUpIHsKKyAgICAgICAgICAgIHNldF9ub2RlLT5QZXJmb3JtV3JpdGVVcGRhdGUoZGV2X2RhdGEsICZwX3dkc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTm93IGNvcHkgdXBkYXRlcworICAgIGZvciAoaSA9IDA7IGkgPCBjb3B5X2NvdW50OyArK2kpIHsKKyAgICAgICAgYXV0byBkc3Rfc2V0ID0gcF9jZHNbaV0uZHN0U2V0OworICAgICAgICBhdXRvIHNyY19zZXQgPSBwX2Nkc1tpXS5zcmNTZXQ7CisgICAgICAgIGF1dG8gc3JjX25vZGUgPSBkZXZfZGF0YS0+R2V0U2V0Tm9kZShzcmNfc2V0KTsKKyAgICAgICAgYXV0byBkc3Rfbm9kZSA9IGRldl9kYXRhLT5HZXRTZXROb2RlKGRzdF9zZXQpOworICAgICAgICBpZiAoc3JjX25vZGUgJiYgZHN0X25vZGUpIHsKKyAgICAgICAgICAgIGRzdF9ub2RlLT5QZXJmb3JtQ29weVVwZGF0ZShkZXZfZGF0YSwgJnBfY2RzW2ldLCBzcmNfbm9kZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2N2ZGVzY3JpcHRvcnNldDo6RGVjb2RlZFRlbXBsYXRlVXBkYXRlOjpEZWNvZGVkVGVtcGxhdGVVcGRhdGUoY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2aWNlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBjb25zdCBURU1QTEFURV9TVEFURSAqdGVtcGxhdGVfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBEYXRhLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgcHVzaF9sYXlvdXQpIHsKKyAgICBhdXRvIGNvbnN0ICZjcmVhdGVfaW5mbyA9IHRlbXBsYXRlX3N0YXRlLT5jcmVhdGVfaW5mbzsKKyAgICBpbmxpbmVfaW5mb3MucmVzaXplKGNyZWF0ZV9pbmZvLmRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50KTsgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIG9uZSBpZiB3ZSBuZWVkIGl0CisgICAgZGVzY193cml0ZXMucmVzZXJ2ZShjcmVhdGVfaW5mby5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudCk7ICAvLyBlbXBsYWNlZCwgc28gcmVzZXJ2ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbgorICAgIFZrRGVzY3JpcHRvclNldExheW91dCBlZmZlY3RpdmVfZHNsID0gY3JlYXRlX2luZm8udGVtcGxhdGVUeXBlID09IFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNyZWF0ZV9pbmZvLmRlc2NyaXB0b3JTZXRMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHB1c2hfbGF5b3V0OworICAgIGF1dG8gbGF5b3V0X29iaiA9IGRldmljZV9kYXRhLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0U2hhcmVkKGVmZmVjdGl2ZV9kc2wpOworCisgICAgLy8gQ3JlYXRlIGEgV3JpdGVEZXNjcmlwdG9yU2V0IHN0cnVjdCBmb3IgZWFjaCB0ZW1wbGF0ZSB1cGRhdGUgZW50cnkKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3JlYXRlX2luZm8uZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQ7IGkrKykgeworICAgICAgICBhdXRvIGJpbmRpbmdfY291bnQgPSBsYXlvdXRfb2JqLT5HZXREZXNjcmlwdG9yQ291bnRGcm9tQmluZGluZyhjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0uZHN0QmluZGluZyk7CisgICAgICAgIGF1dG8gYmluZGluZ19iZWluZ191cGRhdGVkID0gY3JlYXRlX2luZm8ucERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzW2ldLmRzdEJpbmRpbmc7CisgICAgICAgIGF1dG8gZHN0X2FycmF5X2VsZW1lbnQgPSBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0uZHN0QXJyYXlFbGVtZW50OworCisgICAgICAgIGRlc2Nfd3JpdGVzLnJlc2VydmUoZGVzY193cml0ZXMuc2l6ZSgpICsgY3JlYXRlX2luZm8ucERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzW2ldLmRlc2NyaXB0b3JDb3VudCk7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0uZGVzY3JpcHRvckNvdW50OyBqKyspIHsKKyAgICAgICAgICAgIGRlc2Nfd3JpdGVzLmVtcGxhY2VfYmFjaygpOworICAgICAgICAgICAgYXV0byAmd3JpdGVfZW50cnkgPSBkZXNjX3dyaXRlcy5iYWNrKCk7CisKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0ub2Zmc2V0ICsgaiAqIGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tpXS5zdHJpZGU7CisgICAgICAgICAgICBjaGFyICp1cGRhdGVfZW50cnkgPSAoY2hhciAqKShwRGF0YSkgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChkc3RfYXJyYXlfZWxlbWVudCA+PSBiaW5kaW5nX2NvdW50KSB7CisgICAgICAgICAgICAgICAgZHN0X2FycmF5X2VsZW1lbnQgPSAwOworICAgICAgICAgICAgICAgIGJpbmRpbmdfYmVpbmdfdXBkYXRlZCA9IGxheW91dF9vYmotPkdldE5leHRWYWxpZEJpbmRpbmcoYmluZGluZ19iZWluZ191cGRhdGVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3JpdGVfZW50cnkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICAgICAgICAgIHdyaXRlX2VudHJ5LnBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIHdyaXRlX2VudHJ5LmRzdFNldCA9IGRlc2NyaXB0b3JTZXQ7CisgICAgICAgICAgICB3cml0ZV9lbnRyeS5kc3RCaW5kaW5nID0gYmluZGluZ19iZWluZ191cGRhdGVkOworICAgICAgICAgICAgd3JpdGVfZW50cnkuZHN0QXJyYXlFbGVtZW50ID0gZHN0X2FycmF5X2VsZW1lbnQ7CisgICAgICAgICAgICB3cml0ZV9lbnRyeS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgICAgICAgICAgd3JpdGVfZW50cnkuZGVzY3JpcHRvclR5cGUgPSBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0uZGVzY3JpcHRvclR5cGU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoY3JlYXRlX2luZm8ucERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzW2ldLmRlc2NyaXB0b3JUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOgorICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U6CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRToKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOgorICAgICAgICAgICAgICAgICAgICB3cml0ZV9lbnRyeS5wSW1hZ2VJbmZvID0gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JJbWFnZUluZm8gKj4odXBkYXRlX2VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2VudHJ5LnBCdWZmZXJJbmZvID0gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICo+KHVwZGF0ZV9lbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2VudHJ5LnBUZXhlbEJ1ZmZlclZpZXcgPSByZWludGVycHJldF9jYXN0PFZrQnVmZmVyVmlldyAqPih1cGRhdGVfZW50cnkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ6IHsKKyAgICAgICAgICAgICAgICAgICAgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgKmlubGluZV9pbmZvID0gJmlubGluZV9pbmZvc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaW5saW5lX2luZm8tPnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOworICAgICAgICAgICAgICAgICAgICBpbmxpbmVfaW5mby0+cE5leHQgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICBpbmxpbmVfaW5mby0+ZGF0YVNpemUgPSBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0uZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgICAgICAgICBpbmxpbmVfaW5mby0+cERhdGEgPSB1cGRhdGVfZW50cnk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2VudHJ5LnBOZXh0ID0gaW5saW5lX2luZm87CisgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3JDb3VudCBtdXN0IG1hdGNoIHRoZSBkYXRhU2l6ZSBtZW1iZXIgb2YgdGhlIFZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgICB3cml0ZV9lbnRyeS5kZXNjcmlwdG9yQ291bnQgPSBpbmxpbmVfaW5mby0+ZGF0YVNpemU7CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGFycmF5LCB0aGV5IGp1c3QgcmVwcmVzZW50IGJ5dGVzIGluIHRoZSB1cGRhdGUKKyAgICAgICAgICAgICAgICAgICAgaiA9IGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tpXS5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0X2FycmF5X2VsZW1lbnQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKy8vIFRoZXNlIGhlbHBlciBmdW5jdGlvbnMgY2Fycnkgb3V0IHRoZSB2YWxpZGF0ZSBhbmQgcmVjb3JkIGRlc2NyaXB0b3IgdXBkYXRlcyBwZWZvcm1lZCB2aWEgdXBkYXRlIHRlbXBsYXRlcy4gVGhleSBkZWNvZGUKKy8vIHRoZSB0ZW1wbGF0aXplZCBkYXRhIGFuZCBsZXZlcmFnZSB0aGUgbm9uLXRlbXBsYXRlIFVwZGF0ZURlc2NyaXB0b3IgaGVscGVyIGZ1bmN0aW9ucy4KK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0c1dpdGhUZW1wbGF0ZUtIUihWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgY29uc3QgVEVNUExBVEVfU1RBVEUgKnRlbXBsYXRlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBEYXRhKSBjb25zdCB7CisgICAgLy8gVHJhbnNsYXRlIHRoZSB0ZW1wbGF0ZWQgdXBkYXRlIGludG8gYSBub3JtYWwgdXBkYXRlIGZvciB2YWxpZGF0aW9uLi4uCisgICAgY3ZkZXNjcmlwdG9yc2V0OjpEZWNvZGVkVGVtcGxhdGVVcGRhdGUgZGVjb2RlZF91cGRhdGUodGhpcywgZGVzY3JpcHRvclNldCwgdGVtcGxhdGVfc3RhdGUsIHBEYXRhKTsKKyAgICByZXR1cm4gVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0cyhzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVjb2RlZF91cGRhdGUuZGVzY193cml0ZXMuc2l6ZSgpKSwgZGVjb2RlZF91cGRhdGUuZGVzY193cml0ZXMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoKSIpOworfQorCitzdGQ6OnN0cmluZyBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQ6OlN0cmluZ2lmeVNldEFuZExheW91dCgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBvdXQ7CisgICAgYXV0byBsYXlvdXRfaGFuZGxlID0gcF9sYXlvdXRfLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0KCk7CisgICAgaWYgKElzUHVzaERlc2NyaXB0b3IoKSkgeworICAgICAgICBzdHJpbmdfc3ByaW50Zigmb3V0LCAiUHVzaCBEZXNjcmlwdG9ycyBkZWZpbmVkIHdpdGggVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGFfLT5Gb3JtYXRIYW5kbGUobGF5b3V0X2hhbmRsZSkuY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaW5nX3NwcmludGYoJm91dCwgIlZrRGVzY3JpcHRvclNldCAlcyBhbGxvY2F0ZWQgd2l0aCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgJXMiLCByZXBvcnRfZGF0YV8tPkZvcm1hdEhhbmRsZShzZXRfKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YV8tPkZvcm1hdEhhbmRsZShsYXlvdXRfaGFuZGxlKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIG91dDsKK307CisKKy8vIExvb3AgdGhyb3VnaCB0aGUgd3JpdGUgdXBkYXRlcyB0byB2YWxpZGF0ZSBmb3IgYSBwdXNoIGRlc2NyaXB0b3Igc2V0LCBpZ25vcmluZyBkc3RTZXQKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVQdXNoRGVzY3JpcHRvcnNVcGRhdGUoY29uc3QgRGVzY3JpcHRvclNldCAqcHVzaF9zZXQsIHVpbnQzMl90IHdyaXRlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqcF93ZHMsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSkgY29uc3QgeworICAgIGFzc2VydChwdXNoX3NldC0+SXNQdXNoRGVzY3JpcHRvcigpKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd3JpdGVfY291bnQ7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlOworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9zdHI7CisgICAgICAgIGlmICghVmFsaWRhdGVXcml0ZVVwZGF0ZShwdXNoX3NldCwgJnBfd2RzW2ldLCBmdW5jX25hbWUsICZlcnJvcl9jb2RlLCAmZXJyb3Jfc3RyKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocHVzaF9zZXQtPkdldERlc2NyaXB0b3JTZXRMYXlvdXQoKSksIGVycm9yX2NvZGUsICIlcyBmYWlsZWQgdXBkYXRlIHZhbGlkYXRpb246ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBlcnJvcl9zdHIuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIEZvciB0aGUgZ2l2ZW4gYnVmZmVyLCB2ZXJpZnkgdGhhdCBpdHMgY3JlYXRpb24gcGFyYW1ldGVycyBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlCisvLyAgSWYgdGhlcmUncyBhbiBlcnJvciwgdXBkYXRlIHRoZSBlcnJvcl9tc2cgc3RyaW5nIHdpdGggZGV0YWlscyBhbmQgcmV0dXJuIGZhbHNlLCBlbHNlIHJldHVybiB0cnVlCitib29sIGN2ZGVzY3JpcHRvcnNldDo6VmFsaWRhdGVCdWZmZXJVc2FnZShCVUZGRVJfU1RBVEUgY29uc3QgKmJ1ZmZlcl9ub2RlLCBWa0Rlc2NyaXB0b3JUeXBlIHR5cGUsIHN0ZDo6c3RyaW5nICplcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmVycm9yX21zZykgeworICAgIC8vIFZlcmlmeSB0aGF0IHVzYWdlIGJpdHMgc2V0IGNvcnJlY3RseSBmb3IgZ2l2ZW4gdHlwZQorICAgIGF1dG8gdXNhZ2UgPSBidWZmZXJfbm9kZS0+Y3JlYXRlSW5mby51c2FnZTsKKyAgICBjb25zdCBjaGFyICplcnJvcl91c2FnZV9iaXQgPSBudWxscHRyOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgICAgIGlmICghKHVzYWdlICYgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCkpIHsKKyAgICAgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM0IjsKKyAgICAgICAgICAgICAgICBlcnJvcl91c2FnZV9iaXQgPSAiVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI6CisgICAgICAgICAgICBpZiAoISh1c2FnZSAmIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQpKSB7CisgICAgICAgICAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzNSI7CisgICAgICAgICAgICAgICAgZXJyb3JfdXNhZ2VfYml0ID0gIlZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICAgICAgaWYgKCEodXNhZ2UgJiBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUKSkgeworICAgICAgICAgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzAiOworICAgICAgICAgICAgICAgIGVycm9yX3VzYWdlX2JpdCA9ICJWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgICAgIGlmICghKHVzYWdlICYgVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfQlVGRkVSX0JJVCkpIHsKKyAgICAgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMxIjsKKyAgICAgICAgICAgICAgICBlcnJvcl91c2FnZV9iaXQgPSAiVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfQlVGRkVSX0JJVCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZXJyb3JfdXNhZ2VfYml0KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8ICJCdWZmZXIgKCIgPDwgYnVmZmVyX25vZGUtPmJ1ZmZlciA8PCAiKSB3aXRoIHVzYWdlIG1hc2sgIiA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNob3diYXNlIDw8IHVzYWdlCisgICAgICAgICAgICAgICAgICA8PCAiIGJlaW5nIHVzZWQgZm9yIGEgZGVzY3JpcHRvciB1cGRhdGUgb2YgdHlwZSAiIDw8IHN0cmluZ19Wa0Rlc2NyaXB0b3JUeXBlKHR5cGUpIDw8ICIgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICA8PCBlcnJvcl91c2FnZV9iaXQgPDwgIiBzZXQuIjsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKy8vIEZvciBidWZmZXIgZGVzY3JpcHRvciB1cGRhdGVzLCB2ZXJpZnkgdGhlIGJ1ZmZlciB1c2FnZSBhbmQgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBzdHJ1Y3Qgd2hpY2ggaW5jbHVkZXM6CisvLyAgMS4gYnVmZmVyIGlzIHZhbGlkCisvLyAgMi4gYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggY29ycmVjdCB1c2FnZSBmbGFncworLy8gIDMuIG9mZnNldCBpcyBsZXNzIHRoYW4gYnVmZmVyIHNpemUKKy8vICA0LiByYW5nZSBpcyBlaXRoZXIgVktfV0hPTEVfU0laRSBvciBmYWxscyBpbiAoMCwgKGJ1ZmZlciBzaXplIC0gb2Zmc2V0KV0KKy8vICA1LiByYW5nZSBhbmQgb2Zmc2V0IGFyZSB3aXRoaW4gdGhlIGRldmljZSdzIGxpbWl0cworLy8gSWYgdGhlcmUncyBhbiBlcnJvciwgdXBkYXRlIHRoZSBlcnJvcl9tc2cgc3RyaW5nIHdpdGggZGV0YWlscyBhbmQgcmV0dXJuIGZhbHNlLCBlbHNlIHJldHVybiB0cnVlCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQnVmZmVyVXBkYXRlKFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gY29uc3QgKmJ1ZmZlcl9pbmZvLCBWa0Rlc2NyaXB0b3JUeXBlIHR5cGUsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmVycm9yX2NvZGUsIHN0ZDo6c3RyaW5nICplcnJvcl9tc2cpIGNvbnN0IHsKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXMgdmFsaWQKKyAgICBhdXRvIGJ1ZmZlcl9ub2RlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyX2luZm8tPmJ1ZmZlcik7CisgICAgLy8gQW55IGludmFsaWQgYnVmZmVyIHNob3VsZCBhbHJlYWR5IGJlIGNhdWdodCBieSBvYmplY3RfdHJhY2tlcgorICAgIGFzc2VydChidWZmZXJfbm9kZSk7CisgICAgaWYgKFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvQnVmZmVyKGJ1ZmZlcl9ub2RlLCBmdW5jX25hbWUsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI5IikpIHsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyOSI7CisgICAgICAgICplcnJvcl9tc2cgPSAiTm8gbWVtb3J5IGJvdW5kIHRvIGJ1ZmZlci4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFZlcmlmeSB1c2FnZSBiaXRzCisgICAgaWYgKCFjdmRlc2NyaXB0b3JzZXQ6OlZhbGlkYXRlQnVmZmVyVXNhZ2UoYnVmZmVyX25vZGUsIHR5cGUsIGVycm9yX2NvZGUsIGVycm9yX21zZykpIHsKKyAgICAgICAgLy8gZXJyb3JfbXNnIHdpbGwgaGF2ZSBiZWVuIHVwZGF0ZWQgYnkgVmFsaWRhdGVCdWZmZXJVc2FnZSgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gb2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIGJ1ZmZlciBzaXplCisgICAgaWYgKGJ1ZmZlcl9pbmZvLT5vZmZzZXQgPj0gYnVmZmVyX25vZGUtPmNyZWF0ZUluZm8uc2l6ZSkgeworICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tb2Zmc2V0LTAwMzQwIjsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICBlcnJvcl9zdHIgPDwgIlZrRGVzY3JpcHRvckJ1ZmZlckluZm8gb2Zmc2V0IG9mICIgPDwgYnVmZmVyX2luZm8tPm9mZnNldCA8PCAiIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgPDwgYnVmZmVyX25vZGUtPmJ1ZmZlciA8PCAiIHNpemUgb2YgIiA8PCBidWZmZXJfbm9kZS0+Y3JlYXRlSW5mby5zaXplOworICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXJfaW5mby0+cmFuZ2UgIT0gVktfV0hPTEVfU0laRSkgeworICAgICAgICAvLyBSYW5nZSBtdXN0IGJlIFZLX1dIT0xFX1NJWkUgb3IgPiAwCisgICAgICAgIGlmICghYnVmZmVyX2luZm8tPnJhbmdlKSB7CisgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tcmFuZ2UtMDAzNDEiOworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIHJhbmdlIGlzIG5vdCBWS19XSE9MRV9TSVpFIGFuZCBpcyB6ZXJvLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iOworICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBSYW5nZSBtdXN0IGJlIFZLX1dIT0xFX1NJWkUgb3IgPD0gKGJ1ZmZlciBzaXplIC0gb2Zmc2V0KQorICAgICAgICBpZiAoYnVmZmVyX2luZm8tPnJhbmdlID4gKGJ1ZmZlcl9ub2RlLT5jcmVhdGVJbmZvLnNpemUgLSBidWZmZXJfaW5mby0+b2Zmc2V0KSkgeworICAgICAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa0Rlc2NyaXB0b3JCdWZmZXJJbmZvLXJhbmdlLTAwMzQyIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiVmtEZXNjcmlwdG9yQnVmZmVySW5mbyByYW5nZSBpcyAiIDw8IGJ1ZmZlcl9pbmZvLT5yYW5nZSA8PCAiIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBidWZmZXIgc2l6ZSAoIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGJ1ZmZlcl9ub2RlLT5jcmVhdGVJbmZvLnNpemUgPDwgIikgbWludXMgcmVxdWVzdGVkIG9mZnNldCBvZiAiIDw8IGJ1ZmZlcl9pbmZvLT5vZmZzZXQ7CisgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIC8vIENoZWNrIGJ1ZmZlciB1cGRhdGUgc2l6ZXMgYWdhaW5zdCBkZXZpY2UgbGltaXRzCisgICAgY29uc3QgYXV0byAmbGltaXRzID0gcGh5c19kZXZfcHJvcHMubGltaXRzOworICAgIGlmIChWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIgPT0gdHlwZSB8fCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyA9PSB0eXBlKSB7CisgICAgICAgIGF1dG8gbWF4X3ViX3JhbmdlID0gbGltaXRzLm1heFVuaWZvcm1CdWZmZXJSYW5nZTsKKyAgICAgICAgaWYgKGJ1ZmZlcl9pbmZvLT5yYW5nZSAhPSBWS19XSE9MRV9TSVpFICYmIGJ1ZmZlcl9pbmZvLT5yYW5nZSA+IG1heF91Yl9yYW5nZSkgeworICAgICAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzMiI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIlZrRGVzY3JpcHRvckJ1ZmZlckluZm8gcmFuZ2UgaXMgIiA8PCBidWZmZXJfaW5mby0+cmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGRldmljZSdzIG1heFVuaWZvcm1CdWZmZXJSYW5nZSAoIiA8PCBtYXhfdWJfcmFuZ2UgPDwgIikiOworICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXJfaW5mby0+cmFuZ2UgPT0gVktfV0hPTEVfU0laRSAmJiAoYnVmZmVyX25vZGUtPmNyZWF0ZUluZm8uc2l6ZSAtIGJ1ZmZlcl9pbmZvLT5vZmZzZXQpID4gbWF4X3ViX3JhbmdlKSB7CisgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMyIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiVmtEZXNjcmlwdG9yQnVmZmVySW5mbyByYW5nZSBpcyBWS19XSE9MRV9TSVpFIGJ1dCBlZmZlY3RpdmUgcmFuZ2UgIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCAoYnVmZmVyX25vZGUtPmNyZWF0ZUluZm8uc2l6ZSAtIGJ1ZmZlcl9pbmZvLT5vZmZzZXQpIDw8ICIpIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGRldmljZSdzICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAibWF4VW5pZm9ybUJ1ZmZlclJhbmdlICgiIDw8IG1heF91Yl9yYW5nZSA8PCAiKSI7CisgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIgPT0gdHlwZSB8fCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQyA9PSB0eXBlKSB7CisgICAgICAgIGF1dG8gbWF4X3NiX3JhbmdlID0gbGltaXRzLm1heFN0b3JhZ2VCdWZmZXJSYW5nZTsKKyAgICAgICAgaWYgKGJ1ZmZlcl9pbmZvLT5yYW5nZSAhPSBWS19XSE9MRV9TSVpFICYmIGJ1ZmZlcl9pbmZvLT5yYW5nZSA+IG1heF9zYl9yYW5nZSkgeworICAgICAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzMyI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIlZrRGVzY3JpcHRvckJ1ZmZlckluZm8gcmFuZ2UgaXMgIiA8PCBidWZmZXJfaW5mby0+cmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGRldmljZSdzIG1heFN0b3JhZ2VCdWZmZXJSYW5nZSAoIiA8PCBtYXhfc2JfcmFuZ2UgPDwgIikiOworICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXJfaW5mby0+cmFuZ2UgPT0gVktfV0hPTEVfU0laRSAmJiAoYnVmZmVyX25vZGUtPmNyZWF0ZUluZm8uc2l6ZSAtIGJ1ZmZlcl9pbmZvLT5vZmZzZXQpID4gbWF4X3NiX3JhbmdlKSB7CisgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMzIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiVmtEZXNjcmlwdG9yQnVmZmVySW5mbyByYW5nZSBpcyBWS19XSE9MRV9TSVpFIGJ1dCBlZmZlY3RpdmUgcmFuZ2UgIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCAoYnVmZmVyX25vZGUtPmNyZWF0ZUluZm8uc2l6ZSAtIGJ1ZmZlcl9pbmZvLT5vZmZzZXQpIDw8ICIpIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGRldmljZSdzICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAibWF4U3RvcmFnZUJ1ZmZlclJhbmdlICgiIDw8IG1heF9zYl9yYW5nZSA8PCAiKSI7CisgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cGRhdGUgYXJlIG9rLCBidXQgZG9uJ3QgcGVyZm9ybSBhY3R1YWwgdXBkYXRlCitib29sIENvcmVDaGVja3M6OlZlcmlmeUNvcHlVcGRhdGVDb250ZW50cyhjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0ICp1cGRhdGUsIGNvbnN0IERlc2NyaXB0b3JTZXQgKnNyY19zZXQsIFZrRGVzY3JpcHRvclR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4LCBjb25zdCBjaGFyICpmdW5jX25hbWUsIHN0ZDo6c3RyaW5nICplcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmVycm9yX21zZykgY29uc3QgeworICAgIC8vIE5vdGUgOiBSZXB1cnBvc2luZyBzb21lIFdyaXRlIHVwZGF0ZSBlcnJvciBjb2RlcyBoZXJlIGFzIHNwZWNpZmljIGRldGFpbHMgYXJlbid0IGNhbGxlZCBvdXQgZm9yIGNvcHkgdXBkYXRlcyBsaWtlIHRoZXkgYXJlCisgICAgLy8gZm9yIHdyaXRlIHVwZGF0ZXMKKyAgICB1c2luZyBEZXNjcmlwdG9yQ2xhc3MgPSBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JDbGFzczsKKyAgICB1c2luZyBCdWZmZXJEZXNjcmlwdG9yID0gY3ZkZXNjcmlwdG9yc2V0OjpCdWZmZXJEZXNjcmlwdG9yOworICAgIHVzaW5nIEltYWdlRGVzY3JpcHRvciA9IGN2ZGVzY3JpcHRvcnNldDo6SW1hZ2VEZXNjcmlwdG9yOworICAgIHVzaW5nIEltYWdlU2FtcGxlckRlc2NyaXB0b3IgPSBjdmRlc2NyaXB0b3JzZXQ6OkltYWdlU2FtcGxlckRlc2NyaXB0b3I7CisgICAgdXNpbmcgU2FtcGxlckRlc2NyaXB0b3IgPSBjdmRlc2NyaXB0b3JzZXQ6OlNhbXBsZXJEZXNjcmlwdG9yOworICAgIHVzaW5nIFRleGVsRGVzY3JpcHRvciA9IGN2ZGVzY3JpcHRvcnNldDo6VGV4ZWxEZXNjcmlwdG9yOworCisgICAgYXV0byBkZXZpY2VfZGF0YSA9IHRoaXM7CisgICAgc3dpdGNoIChzcmNfc2V0LT5HZXREZXNjcmlwdG9yRnJvbUdsb2JhbEluZGV4KGluZGV4KS0+ZGVzY3JpcHRvcl9jbGFzcykgeworICAgICAgICBjYXNlIERlc2NyaXB0b3JDbGFzczo6UGxhaW5TYW1wbGVyOiB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRpID0gMDsgZGkgPCB1cGRhdGUtPmRlc2NyaXB0b3JDb3VudDsgKytkaSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gc3JjX2Rlc2MgPSBzcmNfc2V0LT5HZXREZXNjcmlwdG9yRnJvbUdsb2JhbEluZGV4KGluZGV4ICsgZGkpOworICAgICAgICAgICAgICAgIGlmICghc3JjX2Rlc2MtPnVwZGF0ZWQpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICghc3JjX2Rlc2MtPklzSW1tdXRhYmxlU2FtcGxlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gdXBkYXRlX3NhbXBsZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBTYW1wbGVyRGVzY3JpcHRvciAqPihzcmNfZGVzYyktPkdldFNhbXBsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFWYWxpZGF0ZVNhbXBsZXIodXBkYXRlX3NhbXBsZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGVkIGNvcHkgdXBkYXRlIHRvIHNhbXBsZXIgZGVzY3JpcHRvciB3aXRoIGludmFsaWQgc2FtcGxlcjogIiA8PCB1cGRhdGVfc2FtcGxlciA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IFdhcm4gaGVyZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRGVzY3JpcHRvckNsYXNzOjpJbWFnZVNhbXBsZXI6IHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgZGkgPSAwOyBkaSA8IHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50OyArK2RpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBzcmNfZGVzYyA9IHNyY19zZXQtPkdldERlc2NyaXB0b3JGcm9tR2xvYmFsSW5kZXgoaW5kZXggKyBkaSk7CisgICAgICAgICAgICAgICAgaWYgKCFzcmNfZGVzYy0+dXBkYXRlZCkgY29udGludWU7CisgICAgICAgICAgICAgICAgYXV0byBpbWdfc2FtcF9kZXNjID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvciAqPihzcmNfZGVzYyk7CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgdmFsaWRhdGUgc2FtcGxlcgorICAgICAgICAgICAgICAgIGlmICghaW1nX3NhbXBfZGVzYy0+SXNJbW11dGFibGVTYW1wbGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB1cGRhdGVfc2FtcGxlciA9IGltZ19zYW1wX2Rlc2MtPkdldFNhbXBsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFWYWxpZGF0ZVNhbXBsZXIodXBkYXRlX3NhbXBsZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGVkIGNvcHkgdXBkYXRlIHRvIHNhbXBsZXIgZGVzY3JpcHRvciB3aXRoIGludmFsaWQgc2FtcGxlcjogIiA8PCB1cGRhdGVfc2FtcGxlciA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IFdhcm4gaGVyZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBpbWFnZQorICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfdmlldyA9IGltZ19zYW1wX2Rlc2MtPkdldEltYWdlVmlldygpOworICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfbGF5b3V0ID0gaW1nX3NhbXBfZGVzYy0+R2V0SW1hZ2VMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIVZhbGlkYXRlSW1hZ2VVcGRhdGUoaW1hZ2VfdmlldywgaW1hZ2VfbGF5b3V0LCB0eXBlLCBmdW5jX25hbWUsIGVycm9yX2NvZGUsIGVycm9yX21zZykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkF0dGVtcHRlZCBjb3B5IHVwZGF0ZSB0byBjb21iaW5lZCBpbWFnZSBzYW1wbGVyIGRlc2NyaXB0b3IgZmFpbGVkIGR1ZSB0bzogIiA8PCBlcnJvcl9tc2ctPmNfc3RyKCk7CisgICAgICAgICAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERlc2NyaXB0b3JDbGFzczo6SW1hZ2U6IHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgZGkgPSAwOyBkaSA8IHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50OyArK2RpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBzcmNfZGVzYyA9IHNyY19zZXQtPkdldERlc2NyaXB0b3JGcm9tR2xvYmFsSW5kZXgoaW5kZXggKyBkaSk7CisgICAgICAgICAgICAgICAgaWYgKCFzcmNfZGVzYy0+dXBkYXRlZCkgY29udGludWU7CisgICAgICAgICAgICAgICAgYXV0byBpbWdfZGVzYyA9IHN0YXRpY19jYXN0PGNvbnN0IEltYWdlRGVzY3JpcHRvciAqPihzcmNfZGVzYyk7CisgICAgICAgICAgICAgICAgYXV0byBpbWFnZV92aWV3ID0gaW1nX2Rlc2MtPkdldEltYWdlVmlldygpOworICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfbGF5b3V0ID0gaW1nX2Rlc2MtPkdldEltYWdlTGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFWYWxpZGF0ZUltYWdlVXBkYXRlKGltYWdlX3ZpZXcsIGltYWdlX2xheW91dCwgdHlwZSwgZnVuY19uYW1lLCBlcnJvcl9jb2RlLCBlcnJvcl9tc2cpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJBdHRlbXB0ZWQgY29weSB1cGRhdGUgdG8gaW1hZ2UgZGVzY3JpcHRvciBmYWlsZWQgZHVlIHRvOiAiIDw8IGVycm9yX21zZy0+Y19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRGVzY3JpcHRvckNsYXNzOjpUZXhlbEJ1ZmZlcjogeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkaSA9IDA7IGRpIDwgdXBkYXRlLT5kZXNjcmlwdG9yQ291bnQ7ICsrZGkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHNyY19kZXNjID0gc3JjX3NldC0+R2V0RGVzY3JpcHRvckZyb21HbG9iYWxJbmRleChpbmRleCArIGRpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNyY19kZXNjLT51cGRhdGVkKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlcl92aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGV4ZWxEZXNjcmlwdG9yICo+KHNyY19kZXNjKS0+R2V0QnVmZmVyVmlldygpOworICAgICAgICAgICAgICAgIGF1dG8gYnZfc3RhdGUgPSBkZXZpY2VfZGF0YS0+R2V0QnVmZmVyVmlld1N0YXRlKGJ1ZmZlcl92aWV3KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ2X3N0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjMiOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGVkIGNvcHkgdXBkYXRlIHRvIHRleGVsIGJ1ZmZlciBkZXNjcmlwdG9yIHdpdGggaW52YWxpZCBidWZmZXIgdmlldzogIiA8PCBidWZmZXJfdmlldzsKKyAgICAgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGJ2X3N0YXRlLT5jcmVhdGVfaW5mby5idWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKCFjdmRlc2NyaXB0b3JzZXQ6OlZhbGlkYXRlQnVmZmVyVXNhZ2UoR2V0QnVmZmVyU3RhdGUoYnVmZmVyKSwgdHlwZSwgZXJyb3JfY29kZSwgZXJyb3JfbXNnKSkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGVkIGNvcHkgdXBkYXRlIHRvIHRleGVsIGJ1ZmZlciBkZXNjcmlwdG9yIGZhaWxlZCBkdWUgdG86ICIgPDwgZXJyb3JfbXNnLT5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBEZXNjcmlwdG9yQ2xhc3M6OkdlbmVyYWxCdWZmZXI6IHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgZGkgPSAwOyBkaSA8IHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50OyArK2RpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBzcmNfZGVzYyA9IHNyY19zZXQtPkdldERlc2NyaXB0b3JGcm9tR2xvYmFsSW5kZXgoaW5kZXggKyBkaSk7CisgICAgICAgICAgICAgICAgaWYgKCFzcmNfZGVzYy0+dXBkYXRlZCkgY29udGludWU7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBCdWZmZXJEZXNjcmlwdG9yICo+KHNyY19kZXNjKS0+R2V0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKCFjdmRlc2NyaXB0b3JzZXQ6OlZhbGlkYXRlQnVmZmVyVXNhZ2UoR2V0QnVmZmVyU3RhdGUoYnVmZmVyKSwgdHlwZSwgZXJyb3JfY29kZSwgZXJyb3JfbXNnKSkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGVkIGNvcHkgdXBkYXRlIHRvIGJ1ZmZlciBkZXNjcmlwdG9yIGZhaWxlZCBkdWUgdG86ICIgPDwgZXJyb3JfbXNnLT5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBEZXNjcmlwdG9yQ2xhc3M6OklubGluZVVuaWZvcm06CisgICAgICAgIGNhc2UgRGVzY3JpcHRvckNsYXNzOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsgIC8vIFdlJ3ZlIGFscmVhZHkgdmVyaWZpZWQgdXBkYXRlIHR5cGUgc28gc2hvdWxkIG5ldmVyIGdldCBoZXJlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gQWxsIGNoZWNrcyBwYXNzZWQgc28gdXBkYXRlIGNvbnRlbnRzIGFyZSBnb29kCisgICAgcmV0dXJuIHRydWU7Cit9CisvLyBWZXJpZnkgdGhhdCB0aGUgc3RhdGUgYXQgYWxsb2NhdGUgdGltZSBpcyBjb3JyZWN0LCBidXQgZG9uJ3QgYWN0dWFsbHkgYWxsb2NhdGUgdGhlIHNldHMgeWV0Citib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gKnBfYWxsb2NfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN2ZGVzY3JpcHRvcnNldDo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEgKmRzX2RhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvIHBvb2xfc3RhdGUgPSBHZXREZXNjcmlwdG9yUG9vbFN0YXRlKHBfYWxsb2NfaW5mby0+ZGVzY3JpcHRvclBvb2wpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBfYWxsb2NfaW5mby0+ZGVzY3JpcHRvclNldENvdW50OyBpKyspIHsKKyAgICAgICAgYXV0byBsYXlvdXQgPSBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U2hhcmVkKHBfYWxsb2NfaW5mby0+cFNldExheW91dHNbaV0pOworICAgICAgICBpZiAobGF5b3V0KSB7ICAvLyBudWxscHRyIGxheW91dCBpbmRpY2F0ZXMgbm8gdmFsaWQgbGF5b3V0IGhhbmRsZSBmb3IgdGhpcyBkZXZpY2UsIHZhbGlkYXRlZC9sb2dnZWQgaW4gb2JqZWN0X3RyYWNrZXIKKyAgICAgICAgICAgIGlmIChsYXlvdXQtPklzUHVzaERlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwX2FsbG9jX2luZm8tPnBTZXRMYXlvdXRzW2ldKSwgIlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMzA4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHNwZWNpZmllZCBhdCBwU2V0TGF5b3V0c1slIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gaW4gdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCkgd2FzIGNyZWF0ZWQgd2l0aCBpbnZhbGlkIGZsYWcgJXMgc2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUocF9hbGxvY19pbmZvLT5wU2V0TGF5b3V0c1tpXSkuY19zdHIoKSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXlvdXQtPkdldENyZWF0ZUZsYWdzKCkgJiBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCAmJgorICAgICAgICAgICAgICAgICEocG9vbF9zdGF0ZS0+Y3JlYXRlSW5mby5mbGFncyAmIFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLXBTZXRMYXlvdXRzLTAzMDQ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlc2NyaXB0b3Igc2V0IGxheW91dCBjcmVhdGUgZmxhZ3MgYW5kIHBvb2wgY3JlYXRlIGZsYWdzIG1pc21hdGNoIGZvciBpbmRleCAoJWQpIiwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UxKSB7CisgICAgICAgIC8vIFRyYWNrIG51bWJlciBvZiBkZXNjcmlwdG9yU2V0cyBhbGxvd2FibGUgaW4gdGhpcyBwb29sCisgICAgICAgIGlmIChwb29sX3N0YXRlLT5hdmFpbGFibGVTZXRzIDwgcF9hbGxvY19pbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBvb2xfc3RhdGUtPnBvb2wpLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tZGVzY3JpcHRvclNldENvdW50LTAwMzA2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlICV1IGRlc2NyaXB0b3JTZXRzIGZyb20gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gVGhpcyBwb29sIG9ubHkgaGFzICVkIGRlc2NyaXB0b3JTZXRzIHJlbWFpbmluZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYWxsb2NfaW5mby0+ZGVzY3JpcHRvclNldENvdW50LCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBvb2xfc3RhdGUtPnBvb2wpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbF9zdGF0ZS0+YXZhaWxhYmxlU2V0cyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgZGVzY3JpcHRvciBjb3VudHMgYXJlIHNhdGlzZmlhYmxlCisgICAgICAgIGZvciAoYXV0byBpdCA9IGRzX2RhdGEtPnJlcXVpcmVkX2Rlc2NyaXB0b3JzX2J5X3R5cGUuYmVnaW4oKTsgaXQgIT0gZHNfZGF0YS0+cmVxdWlyZWRfZGVzY3JpcHRvcnNfYnlfdHlwZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgYXV0byBjb3VudF9pdGVyID0gcG9vbF9zdGF0ZS0+YXZhaWxhYmxlRGVzY3JpcHRvclR5cGVDb3VudC5maW5kKGl0LT5maXJzdCk7CisgICAgICAgICAgICB1aW50MzJfdCBhdmFpbGFibGVDb3VudCA9IChjb3VudF9pdGVyICE9IHBvb2xfc3RhdGUtPmF2YWlsYWJsZURlc2NyaXB0b3JUeXBlQ291bnQuZW5kKCkpID8gY291bnRfaXRlci0+c2Vjb25kIDogMDsKKworICAgICAgICAgICAgaWYgKGRzX2RhdGEtPnJlcXVpcmVkX2Rlc2NyaXB0b3JzX2J5X3R5cGUuYXQoaXQtPmZpcnN0KSA+IGF2YWlsYWJsZUNvdW50KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBvb2xfc3RhdGUtPnBvb2wpLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tZGVzY3JpcHRvclBvb2wtMDAzMDciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlICV1IGRlc2NyaXB0b3JzIG9mIHR5cGUgJXMgZnJvbSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gVGhpcyBwb29sIG9ubHkgaGFzICVkIGRlc2NyaXB0b3JzIG9mIHRoaXMgdHlwZSByZW1haW5pbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNfZGF0YS0+cmVxdWlyZWRfZGVzY3JpcHRvcnNfYnlfdHlwZS5hdChpdC0+Zmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtEZXNjcmlwdG9yVHlwZShWa0Rlc2NyaXB0b3JUeXBlKGl0LT5maXJzdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBvb2xfc3RhdGUtPnBvb2wpLmNfc3RyKCksIGF2YWlsYWJsZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGF1dG8gKmNvdW50X2FsbG9jYXRlX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVD4ocF9hbGxvY19pbmZvLT5wTmV4dCk7CisKKyAgICBpZiAoY291bnRfYWxsb2NhdGVfaW5mbykgeworICAgICAgICBpZiAoY291bnRfYWxsb2NhdGVfaW5mby0+ZGVzY3JpcHRvclNldENvdW50ICE9IDAgJiYKKyAgICAgICAgICAgIGNvdW50X2FsbG9jYXRlX2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudCAhPSBwX2FsbG9jX2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQtZGVzY3JpcHRvclNldENvdW50LTAzMDQ1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvOjpkZXNjcmlwdG9yU2V0Q291bnQgKCVkKSAhPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUOjpkZXNjcmlwdG9yU2V0Q291bnQgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hbGxvY19pbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQsIGNvdW50X2FsbG9jYXRlX2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50X2FsbG9jYXRlX2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudCA9PSBwX2FsbG9jX2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudCkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBfYWxsb2NfaW5mby0+ZGVzY3JpcHRvclNldENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdXRvIGxheW91dCA9IEdldERlc2NyaXB0b3JTZXRMYXlvdXRTaGFyZWQocF9hbGxvY19pbmZvLT5wU2V0TGF5b3V0c1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50X2FsbG9jYXRlX2luZm8tPnBEZXNjcmlwdG9yQ291bnRzW2ldID4gbGF5b3V0LT5HZXREZXNjcmlwdG9yQ291bnRGcm9tQmluZGluZyhsYXlvdXQtPkdldE1heEJpbmRpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhULXBTZXRMYXlvdXRzLTAzMDQ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwRGVzY3JpcHRvckNvdW50c1slZF0gPSAoJWQpLCBiaW5kaW5nJ3MgZGVzY3JpcHRvckNvdW50ID0gKCVkKSIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9hbGxvY2F0ZV9pbmZvLT5wRGVzY3JpcHRvckNvdW50c1tpXSwgbGF5b3V0LT5HZXREZXNjcmlwdG9yQ291bnRGcm9tQmluZGluZyhsYXlvdXQtPkdldE1heEJpbmRpbmcoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitjb25zdCBCaW5kaW5nUmVxTWFwICZjdmRlc2NyaXB0b3JzZXQ6OlByZWZpbHRlckJpbmRSZXF1ZXN0TWFwOjpGaWx0ZXJlZE1hcChjb25zdCBDTURfQlVGRkVSX1NUQVRFICZjYl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBJUEVMSU5FX1NUQVRFICZwaXBlbGluZSkgeworICAgIGlmIChJc01hbnlEZXNjcmlwdG9ycygpKSB7CisgICAgICAgIGZpbHRlcmVkX21hcF8ucmVzZXQobmV3IHN0ZDo6bWFwPHVpbnQzMl90LCBkZXNjcmlwdG9yX3JlcT4oKSk7CisgICAgICAgIGRlc2NyaXB0b3Jfc2V0Xy5GaWx0ZXJCaW5kaW5nUmVxcyhjYl9zdGF0ZSwgcGlwZWxpbmUsIG9yaWdfbWFwXywgZmlsdGVyZWRfbWFwXy5nZXQoKSk7CisgICAgICAgIHJldHVybiAqZmlsdGVyZWRfbWFwXzsKKyAgICB9CisgICAgcmV0dXJuIG9yaWdfbWFwXzsKK30KKworLy8gU3RhcnRpbmcgYXQgb2Zmc2V0IGRlc2NyaXB0b3Igb2YgZ2l2ZW4gYmluZGluZywgcGFyc2Ugb3ZlciB1cGRhdGVfY291bnQKKy8vICBkZXNjcmlwdG9yIHVwZGF0ZXMgYW5kIHZlcmlmeSB0aGF0IGZvciBhbnkgYmluZGluZyBib3VuZGFyaWVzIHRoYXQgYXJlIGNyb3NzZWQsIHRoZSBuZXh0IGJpbmRpbmcocykgYXJlIGFsbCBjb25zaXN0ZW50CisvLyAgQ29uc2lzdGVuY3kgbWVhbnMgdGhhdCB0aGVpciB0eXBlLCBzdGFnZSBmbGFncywgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXkgdXNlIGltbXV0YWJsZSBzYW1wbGVycyBtYXRjaGVzCisvLyAgSWYgc28sIHJldHVybiB0cnVlLiBJZiBub3QsIGZpbGwgaW4gZXJyb3JfbXNnIGFuZCByZXR1cm4gZmFsc2UKK2Jvb2wgY3ZkZXNjcmlwdG9yc2V0OjpWZXJpZnlVcGRhdGVDb25zaXN0ZW5jeShEZXNjcmlwdG9yU2V0TGF5b3V0OjpDb25zdEJpbmRpbmdJdGVyYXRvciBjdXJyZW50X2JpbmRpbmcsIHVpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1cGRhdGVfY291bnQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IFZrRGVzY3JpcHRvclNldCBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmVycm9yX21zZykgeworICAgIGJvb2wgcGFzcyA9IHRydWU7CisgICAgLy8gVmVyaWZ5IGNvbnNlY3V0aXZlIGJpbmRpbmdzIG1hdGNoIChpZiBuZWVkZWQpCisgICAgYXV0byBvcmlnX2JpbmRpbmcgPSBjdXJyZW50X2JpbmRpbmc7CisKKyAgICB3aGlsZSAocGFzcyAmJiB1cGRhdGVfY291bnQpIHsKKyAgICAgICAgLy8gRmlyc3QsIGl0J3MgbGVnYWwgdG8gb2Zmc2V0IGJleW9uZCB5b3VyIG93biBiaW5kaW5nIHNvIGhhbmRsZSB0aGF0IGNhc2UKKyAgICAgICAgaWYgKG9mZnNldCA+IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJmluZGV4X3JhbmdlID0gY3VycmVudF9iaW5kaW5nLkdldEdsb2JhbEluZGV4UmFuZ2UoKTsKKyAgICAgICAgICAgIC8vIGluZGV4X3JhbmdlLnN0YXJ0ICsgb2Zmc2V0IGlzIHdoaWNoIGRlc2NyaXB0b3IgaXMgbmVlZGVkIHRvIHVwZGF0ZS4gSWYgaXQgPiBpbmRleF9yYW5nZS5lbmQsIGl0IG1lYW5zIHRoZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAvLyBpc24ndCBpbiB0aGlzIGJpbmRpbmcsIG1heWJlIGluIG5leHQgYmluZGluZy4KKyAgICAgICAgICAgIGlmICgoaW5kZXhfcmFuZ2Uuc3RhcnQgKyBvZmZzZXQpID49IGluZGV4X3JhbmdlLmVuZCkgeworICAgICAgICAgICAgICAgIC8vIEFkdmFuY2UgdG8gbmV4dCBiaW5kaW5nLCBkZWNyZW1lbnQgb2Zmc2V0IGJ5IGJpbmRpbmcgc2l6ZQorICAgICAgICAgICAgICAgIG9mZnNldCAtPSBjdXJyZW50X2JpbmRpbmcuR2V0RGVzY3JpcHRvckNvdW50KCk7CisgICAgICAgICAgICAgICAgKytjdXJyZW50X2JpbmRpbmc7CisgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IG5leHQgY29uc2VjdXRpdmUgYmluZGluZyBtYXRjaGVzIHR5cGUsIHN0YWdlIGZsYWdzICYgaW1tdXRhYmxlIHNhbXBsZXIgdXNlIGFuZCBpZiBBdEVuZAorICAgICAgICAgICAgICAgIGlmICghb3JpZ19iaW5kaW5nLklzQ29uc2lzdGVudChjdXJyZW50X2JpbmRpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1cGRhdGVfY291bnQgLT0gc3RkOjptaW4odXBkYXRlX2NvdW50LCBjdXJyZW50X2JpbmRpbmcuR2V0RGVzY3JpcHRvckNvdW50KCkgLSBvZmZzZXQpOworICAgICAgICBpZiAodXBkYXRlX2NvdW50KSB7CisgICAgICAgICAgICAvLyBTdGFydGluZyBvZmZzZXQgaXMgYmV5b25kIHRoZSBjdXJyZW50IGJpbmRpbmcuIENoZWNrIGNvbnNpc3RlbmN5LCB1cGRhdGUgY291bnRlcnMgYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgYmluZGluZywKKyAgICAgICAgICAgIC8vIGxvb2tpbmcgZm9yIHRoZSBzdGFydCBwb2ludC4gQWxsIGJpbmRpbmdzIChldmVuIHRob3NlIHNraXBwZWQpIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSB1cGRhdGUgYW5kIHdpdGggdGhlCisgICAgICAgICAgICAvLyBvcmlnaW5hbCBiaW5kaW5nLgorICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICsrY3VycmVudF9iaW5kaW5nOworICAgICAgICAgICAgLy8gVmVyaWZ5IG5leHQgY29uc2VjdXRpdmUgYmluZGluZyBtYXRjaGVzIHR5cGUsIHN0YWdlIGZsYWdzICYgaW1tdXRhYmxlIHNhbXBsZXIgdXNlIGFuZCBpZiBBdEVuZAorICAgICAgICAgICAgaWYgKCFvcmlnX2JpbmRpbmcuSXNDb25zaXN0ZW50KGN1cnJlbnRfYmluZGluZykpIHsKKyAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICBlcnJvcl9zdHIgPDwgIkF0dGVtcHRpbmcgIiA8PCB0eXBlOworICAgICAgICBpZiAoY3VycmVudF9iaW5kaW5nLkxheW91dCgpLT5Jc1B1c2hEZXNjcmlwdG9yKCkpIHsKKyAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiIHB1c2ggZGVzY3JpcHRvcnMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICIgZGVzY3JpcHRvciBzZXQgIiA8PCBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3Jfc3RyIDw8ICIgYmluZGluZyAjIiA8PCBvcmlnX2JpbmRpbmcuQmluZGluZygpIDw8ICIgd2l0aCAjIiA8PCB1cGRhdGVfY291bnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgZGVzY3JpcHRvcnMgYmVpbmcgdXBkYXRlZCBidXQgdGhpcyB1cGRhdGUgb3ZlcnN0ZXBzIHRoZSBib3VuZHMgb2YgdGhpcyBiaW5kaW5nIGFuZCB0aGUgbmV4dCBiaW5kaW5nIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICJub3QgY29uc2lzdGVudCB3aXRoIGN1cnJlbnQgYmluZGluZyBzbyB0aGlzIHVwZGF0ZSBpcyBpbnZhbGlkLiI7CisgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgfQorICAgIHJldHVybiBwYXNzOworfQorCisvLyBWYWxpZGF0ZSB0aGUgc3RhdGUgZm9yIGEgZ2l2ZW4gd3JpdGUgdXBkYXRlIGJ1dCBkb24ndCBhY3R1YWxseSBwZXJmb3JtIHRoZSB1cGRhdGUKKy8vICBJZiBhbiBlcnJvciB3b3VsZCBvY2N1ciBmb3IgdGhpcyB1cGRhdGUsIHJldHVybiBmYWxzZSBhbmQgZmlsbCBpbiBkZXRhaWxzIGluIGVycm9yX21zZyBzdHJpbmcKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVXcml0ZVVwZGF0ZShjb25zdCBEZXNjcmlwdG9yU2V0ICpkZXN0X3NldCwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnVwZGF0ZSwgY29uc3QgY2hhciAqZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICplcnJvcl9jb2RlLCBzdGQ6OnN0cmluZyAqZXJyb3JfbXNnKSBjb25zdCB7CisgICAgY29uc3QgYXV0byBkZXN0X2xheW91dCA9IGRlc3Rfc2V0LT5HZXRMYXlvdXQoKS5nZXQoKTsKKworICAgIC8vIFZlcmlmeSBkc3QgbGF5b3V0IHN0aWxsIHZhbGlkCisgICAgaWYgKGRlc3RfbGF5b3V0LT5kZXN0cm95ZWQpIHsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kc3RTZXQtMDAzMjAiOworICAgICAgICBzdHJpbmdfc3ByaW50ZihlcnJvcl9tc2csICJDYW5ub3QgY2FsbCAlcyB0byBwZXJmb3JtIHdyaXRlIHVwZGF0ZSBvbiAlcyB3aGljaCBoYXMgYmVlbiBkZXN0cm95ZWQiLCBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2V0LT5TdHJpbmdpZnlTZXRBbmRMYXlvdXQoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBWZXJpZnkgZHN0IGJpbmRpbmcgZXhpc3RzCisgICAgaWYgKCFkZXN0X2xheW91dC0+SGFzQmluZGluZyh1cGRhdGUtPmRzdEJpbmRpbmcpKSB7CisgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDMxNSI7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8IGRlc3Rfc2V0LT5TdHJpbmdpZnlTZXRBbmRMYXlvdXQoKSA8PCAiIGRvZXMgbm90IGhhdmUgYmluZGluZyAiIDw8IHVwZGF0ZS0+ZHN0QmluZGluZzsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIERlc2NyaXB0b3JTZXRMYXlvdXQ6OkNvbnN0QmluZGluZ0l0ZXJhdG9yIGRlc3QoZGVzdF9sYXlvdXQsIHVwZGF0ZS0+ZHN0QmluZGluZyk7CisgICAgLy8gTWFrZSBzdXJlIGJpbmRpbmcgaXNuJ3QgZW1wdHkKKyAgICBpZiAoMCA9PSBkZXN0LkdldERlc2NyaXB0b3JDb3VudCgpKSB7CisgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDMxNiI7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8IGRlc3Rfc2V0LT5TdHJpbmdpZnlTZXRBbmRMYXlvdXQoKSA8PCAiIGNhbm5vdCB1cGRhdGVkIGJpbmRpbmcgIiA8PCB1cGRhdGUtPmRzdEJpbmRpbmcKKyAgICAgICAgICAgICAgICAgIDw8ICIgdGhhdCBoYXMgMCBkZXNjcmlwdG9ycyI7CisgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgaWRsZSBkcworICAgIGlmIChkZXN0X3NldC0+aW5fdXNlLmxvYWQoKSAmJiAhKGRlc3QuR2V0RGVzY3JpcHRvckJpbmRpbmdGbGFncygpICYgKFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQpKSkgeworICAgICAgICAvLyBUT0RPIDogUmUtdXNpbmcgRnJlZSBJZGxlIGVycm9yIGNvZGUsIG5lZWQgd3JpdGUgdXBkYXRlIGlkbGUgZXJyb3IgY29kZQorICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy0wMDMwOSI7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8ICJDYW5ub3QgY2FsbCAiIDw8IGZ1bmNfbmFtZSA8PCAiIHRvIHBlcmZvcm0gd3JpdGUgdXBkYXRlIG9uICIgPDwgZGVzdF9zZXQtPlN0cmluZ2lmeVNldEFuZExheW91dCgpCisgICAgICAgICAgICAgICAgICA8PCAiIHRoYXQgaXMgaW4gdXNlIGJ5IGEgY29tbWFuZCBidWZmZXIiOworICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFdlIGtub3cgdGhhdCBiaW5kaW5nIGlzIHZhbGlkLCB2ZXJpZnkgdXBkYXRlIGFuZCBkbyB1cGRhdGUgb24gZWFjaCBkZXNjcmlwdG9yCisgICAgYXV0byBzdGFydF9pZHggPSBkZXN0LkdldEdsb2JhbEluZGV4UmFuZ2UoKS5zdGFydCArIHVwZGF0ZS0+ZHN0QXJyYXlFbGVtZW50OworICAgIGF1dG8gdHlwZSA9IGRlc3QuR2V0VHlwZSgpOworICAgIGlmICh0eXBlICE9IHVwZGF0ZS0+ZGVzY3JpcHRvclR5cGUpIHsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMxOSI7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8ICJBdHRlbXB0aW5nIHdyaXRlIHVwZGF0ZSB0byAiIDw8IGRlc3Rfc2V0LT5TdHJpbmdpZnlTZXRBbmRMYXlvdXQoKSA8PCAiIGJpbmRpbmcgIyIgPDwgdXBkYXRlLT5kc3RCaW5kaW5nCisgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggdHlwZSAiIDw8IHN0cmluZ19Wa0Rlc2NyaXB0b3JUeXBlKHR5cGUpIDw8ICIgYnV0IHVwZGF0ZSB0eXBlIGlzICIKKyAgICAgICAgICAgICAgICAgIDw8IHN0cmluZ19Wa0Rlc2NyaXB0b3JUeXBlKHVwZGF0ZS0+ZGVzY3JpcHRvclR5cGUpOworICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh0eXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQpIHsKKyAgICAgICAgaWYgKCh1cGRhdGUtPmRzdEFycmF5RWxlbWVudCAlIDQpICE9IDApIHsKKyAgICAgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMTkiOworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJBdHRlbXB0aW5nIHdyaXRlIHVwZGF0ZSB0byAiIDw8IGRlc3Rfc2V0LT5TdHJpbmdpZnlTZXRBbmRMYXlvdXQoKSA8PCAiIGJpbmRpbmcgIyIgPDwgdXBkYXRlLT5kc3RCaW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiZHN0QXJyYXlFbGVtZW50ICIgPDwgdXBkYXRlLT5kc3RBcnJheUVsZW1lbnQgPDwgIiBub3QgYSBtdWx0aXBsZSBvZiA0IjsKKyAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh1cGRhdGUtPmRlc2NyaXB0b3JDb3VudCAlIDQpICE9IDApIHsKKyAgICAgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMjAiOworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJBdHRlbXB0aW5nIHdyaXRlIHVwZGF0ZSB0byAiIDw8IGRlc3Rfc2V0LT5TdHJpbmdpZnlTZXRBbmRMYXlvdXQoKSA8PCAiIGJpbmRpbmcgIyIgPDwgdXBkYXRlLT5kc3RCaW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiZGVzY3JpcHRvckNvdW50ICAiIDw8IHVwZGF0ZS0+ZGVzY3JpcHRvckNvdW50IDw8ICIgbm90IGEgbXVsdGlwbGUgb2YgNCI7CisgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGF1dG8gKndyaXRlX2lubGluZV9pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ+KHVwZGF0ZS0+cE5leHQpOworICAgICAgICBpZiAoIXdyaXRlX2lubGluZV9pbmZvIHx8IHdyaXRlX2lubGluZV9pbmZvLT5kYXRhU2l6ZSAhPSB1cGRhdGUtPmRlc2NyaXB0b3JDb3VudCkgeworICAgICAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMjIyMSI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICBpZiAoIXdyaXRlX2lubGluZV9pbmZvKSB7CisgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJBdHRlbXB0aW5nIHdyaXRlIHVwZGF0ZSB0byAiIDw8IGRlc3Rfc2V0LT5TdHJpbmdpZnlTZXRBbmRMYXlvdXQoKSA8PCAiIGJpbmRpbmcgIyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdXBkYXRlLT5kc3RCaW5kaW5nIDw8ICIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCBtaXNzaW5nIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJBdHRlbXB0aW5nIHdyaXRlIHVwZGF0ZSB0byAiIDw8IGRlc3Rfc2V0LT5TdHJpbmdpZnlTZXRBbmRMYXlvdXQoKSA8PCAiIGJpbmRpbmcgIyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdXBkYXRlLT5kc3RCaW5kaW5nIDw8ICIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCBkYXRhU2l6ZSAiIDw8IHdyaXRlX2lubGluZV9pbmZvLT5kYXRhU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG5vdCBlcXVhbCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yQ291bnQgIiA8PCB1cGRhdGUtPmRlc2NyaXB0b3JDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBlcnJvciBpcyBwcm9iYWJseSB1bnJlYWNoYWJsZSBkdWUgdG8gdGhlIHByZXZpb3VzIHR3byBlcnJvcnMKKyAgICAgICAgaWYgKHdyaXRlX2lubGluZV9pbmZvICYmICh3cml0ZV9pbmxpbmVfaW5mby0+ZGF0YVNpemUgJSA0KSAhPSAwKSB7CisgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhULWRhdGFTaXplLTAyMjIyIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGluZyB3cml0ZSB1cGRhdGUgdG8gIiA8PCBkZXN0X3NldC0+U3RyaW5naWZ5U2V0QW5kTGF5b3V0KCkgPDwgIiBiaW5kaW5nICMiIDw8IHVwZGF0ZS0+ZHN0QmluZGluZworICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUIGRhdGFTaXplICIgPDwgd3JpdGVfaW5saW5lX2luZm8tPmRhdGFTaXplCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBub3QgYSBtdWx0aXBsZSBvZiA0IjsKKyAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVmVyaWZ5IGNvbnNlY3V0aXZlIGJpbmRpbmdzIG1hdGNoIChpZiBuZWVkZWQpCisgICAgaWYgKCFWZXJpZnlVcGRhdGVDb25zaXN0ZW5jeShEZXNjcmlwdG9yU2V0TGF5b3V0OjpDb25zdEJpbmRpbmdJdGVyYXRvcihkZXN0X2xheW91dCwgdXBkYXRlLT5kc3RCaW5kaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZS0+ZHN0QXJyYXlFbGVtZW50LCB1cGRhdGUtPmRlc2NyaXB0b3JDb3VudCwgIndyaXRlIHVwZGF0ZSB0byIsIGRlc3Rfc2V0LT5HZXRTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21zZykpIHsKKyAgICAgICAgLy8gVE9ETyA6IFNob3VsZCBicmVhayBvdXQgImNvbnNlY3V0aXZlIGJpbmRpbmcgdXBkYXRlcyIgbGFuZ3VhZ2UgaW50byB2YWxpZCB1c2FnZSBzdGF0ZW1lbnRzCisgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QXJyYXlFbGVtZW50LTAwMzIxIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBVcGRhdGUgaXMgd2l0aGluIGJvdW5kcyBhbmQgY29uc2lzdGVudCBzbyBsYXN0IHN0ZXAgaXMgdG8gdmFsaWRhdGUgdXBkYXRlIGNvbnRlbnRzCisgICAgaWYgKCFWZXJpZnlXcml0ZVVwZGF0ZUNvbnRlbnRzKGRlc3Rfc2V0LCB1cGRhdGUsIHN0YXJ0X2lkeCwgZnVuY19uYW1lLCBlcnJvcl9jb2RlLCBlcnJvcl9tc2cpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgZXJyb3Jfc3RyIDw8ICJXcml0ZSB1cGRhdGUgdG8gIiA8PCBkZXN0X3NldC0+U3RyaW5naWZ5U2V0QW5kTGF5b3V0KCkgPDwgIiBiaW5kaW5nICMiIDw8IHVwZGF0ZS0+ZHN0QmluZGluZworICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQgd2l0aCBlcnJvciBtZXNzYWdlOiAiIDw8IGVycm9yX21zZy0+Y19zdHIoKTsKKyAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBBbGwgY2hlY2tzIHBhc3NlZCwgdXBkYXRlIGlzIGNsZWFuCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFZlcmlmeSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgdXBkYXRlIGFyZSBvaywgYnV0IGRvbid0IHBlcmZvcm0gYWN0dWFsIHVwZGF0ZQorYm9vbCBDb3JlQ2hlY2tzOjpWZXJpZnlXcml0ZVVwZGF0ZUNvbnRlbnRzKGNvbnN0IERlc2NyaXB0b3JTZXQgKmRlc3Rfc2V0LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqdXBkYXRlLCBjb25zdCB1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jX25hbWUsIHN0ZDo6c3RyaW5nICplcnJvcl9jb2RlLCBzdGQ6OnN0cmluZyAqZXJyb3JfbXNnKSBjb25zdCB7CisgICAgdXNpbmcgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvciA9IGN2ZGVzY3JpcHRvcnNldDo6SW1hZ2VTYW1wbGVyRGVzY3JpcHRvcjsKKyAgICB1c2luZyBTYW1wbGVyRGVzY3JpcHRvciA9IGN2ZGVzY3JpcHRvcnNldDo6U2FtcGxlckRlc2NyaXB0b3I7CisKKyAgICBzd2l0Y2ggKHVwZGF0ZS0+ZGVzY3JpcHRvclR5cGUpIHsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjogeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkaSA9IDA7IGRpIDwgdXBkYXRlLT5kZXNjcmlwdG9yQ291bnQ7ICsrZGkpIHsKKyAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBpbWFnZQorICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfdmlldyA9IHVwZGF0ZS0+cEltYWdlSW5mb1tkaV0uaW1hZ2VWaWV3OworICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfbGF5b3V0ID0gdXBkYXRlLT5wSW1hZ2VJbmZvW2RpXS5pbWFnZUxheW91dDsKKyAgICAgICAgICAgICAgICBpZiAoIVZhbGlkYXRlSW1hZ2VVcGRhdGUoaW1hZ2VfdmlldywgaW1hZ2VfbGF5b3V0LCB1cGRhdGUtPmRlc2NyaXB0b3JUeXBlLCBmdW5jX25hbWUsIGVycm9yX2NvZGUsIGVycm9yX21zZykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkF0dGVtcHRlZCB3cml0ZSB1cGRhdGUgdG8gY29tYmluZWQgaW1hZ2Ugc2FtcGxlciBkZXNjcmlwdG9yIGZhaWxlZCBkdWUgdG86ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVycm9yX21zZy0+Y19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICBJbWFnZVNhbXBsZXJEZXNjcmlwdG9yICpkZXNjID0gKEltYWdlU2FtcGxlckRlc2NyaXB0b3IgKilkZXN0X3NldC0+R2V0RGVzY3JpcHRvckZyb21HbG9iYWxJbmRleChpbmRleCArIGRpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MtPklzSW1tdXRhYmxlU2FtcGxlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHNhbXBsZXJfc3RhdGUgPSBHZXRTYW1wbGVyU3RhdGUoZGVzYy0+R2V0U2FtcGxlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXZfc3RhdGUgPSBHZXRJbWFnZVZpZXdTdGF0ZShpbWFnZV92aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdl9zdGF0ZSAmJiBzYW1wbGVyX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl2X3N0YXRlLT5zYW1wbGVyQ29udmVyc2lvbiAhPSBzYW1wbGVyX3N0YXRlLT5zYW1wbGVyQ29udmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAxOTQ4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkF0dGVtcHRlZCB3cml0ZSB1cGRhdGUgdG8gY29tYmluZWQgaW1hZ2Ugc2FtcGxlciBhbmQgaW1hZ2UgdmlldyBhbmQgc2FtcGxlciB5Y2JjciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udmVyc2lvbnMgYXJlIG5vdCBpZGVudGljYWwsIHNhbXBsZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRlc2MtPkdldFNhbXBsZXIoKSA8PCAiIGltYWdlIHZpZXc6ICIgPDwgaXZfc3RhdGUtPmltYWdlX3ZpZXcgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpdl9zdGF0ZSA9IEdldEltYWdlVmlld1N0YXRlKGltYWdlX3ZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl2X3N0YXRlICYmIChpdl9zdGF0ZS0+c2FtcGxlckNvbnZlcnNpb24gIT0gVktfTlVMTF9IQU5ETEUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yX2NvZGUgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMjczOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQmVjYXVzZSBkc3RTZXQgKCIgPDwgdXBkYXRlLT5kc3RTZXQgPDwgIikgaXMgYm91bmQgdG8gaW1hZ2UgdmlldyAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpdl9zdGF0ZS0+aW1hZ2VfdmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSB0aGF0IGluY2x1ZGVzIGEgWUNCQ1IgY29udmVyc2lvbiwgaXQgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggYSBsYXlvdXQgdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlcyBhbiBpbW11dGFibGUgc2FtcGxlci4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOiB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRpID0gMDsgZGkgPCB1cGRhdGUtPmRlc2NyaXB0b3JDb3VudDsgKytkaSkgeworICAgICAgICAgICAgICAgIFNhbXBsZXJEZXNjcmlwdG9yICpkZXNjID0gKFNhbXBsZXJEZXNjcmlwdG9yICopZGVzdF9zZXQtPkdldERlc2NyaXB0b3JGcm9tR2xvYmFsSW5kZXgoaW5kZXggKyBkaSk7CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5Jc0ltbXV0YWJsZVNhbXBsZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVZhbGlkYXRlU2FtcGxlcih1cGRhdGUtPnBJbWFnZUluZm9bZGldLnNhbXBsZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGVkIHdyaXRlIHVwZGF0ZSB0byBzYW1wbGVyIGRlc2NyaXB0b3Igd2l0aCBpbnZhbGlkIHNhbXBsZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB1cGRhdGUtPnBJbWFnZUluZm9bZGldLnNhbXBsZXIgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBXYXJuIGhlcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFOiB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRpID0gMDsgZGkgPCB1cGRhdGUtPmRlc2NyaXB0b3JDb3VudDsgKytkaSkgeworICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfdmlldyA9IHVwZGF0ZS0+cEltYWdlSW5mb1tkaV0uaW1hZ2VWaWV3OworICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfbGF5b3V0ID0gdXBkYXRlLT5wSW1hZ2VJbmZvW2RpXS5pbWFnZUxheW91dDsKKyAgICAgICAgICAgICAgICBpZiAoIVZhbGlkYXRlSW1hZ2VVcGRhdGUoaW1hZ2VfdmlldywgaW1hZ2VfbGF5b3V0LCB1cGRhdGUtPmRlc2NyaXB0b3JUeXBlLCBmdW5jX25hbWUsIGVycm9yX2NvZGUsIGVycm9yX21zZykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkF0dGVtcHRlZCB3cml0ZSB1cGRhdGUgdG8gaW1hZ2UgZGVzY3JpcHRvciBmYWlsZWQgZHVlIHRvOiAiIDw8IGVycm9yX21zZy0+Y19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjogeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkaSA9IDA7IGRpIDwgdXBkYXRlLT5kZXNjcmlwdG9yQ291bnQ7ICsrZGkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlcl92aWV3ID0gdXBkYXRlLT5wVGV4ZWxCdWZmZXJWaWV3W2RpXTsKKyAgICAgICAgICAgICAgICBhdXRvIGJ2X3N0YXRlID0gR2V0QnVmZmVyVmlld1N0YXRlKGJ1ZmZlcl92aWV3KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ2X3N0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICplcnJvcl9jb2RlID0gIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjMiOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGVkIHdyaXRlIHVwZGF0ZSB0byB0ZXhlbCBidWZmZXIgZGVzY3JpcHRvciB3aXRoIGludmFsaWQgYnVmZmVyIHZpZXc6ICIgPDwgYnVmZmVyX3ZpZXc7CisgICAgICAgICAgICAgICAgICAgICplcnJvcl9tc2cgPSBlcnJvcl9zdHIuc3RyKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXIgPSBidl9zdGF0ZS0+Y3JlYXRlX2luZm8uYnVmZmVyOworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCBidWZmZXIgdW5kZXJseWluZyB0aGUgdmlldyBoYXNuJ3QgYmVlbiBkZXN0cm95ZWQgcHJlbWF0dXJlbHkKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcl9zdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAqZXJyb3JfY29kZSA9ICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzIzIjsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3Jfc3RyOworICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPDwgIkF0dGVtcHRlZCB3cml0ZSB1cGRhdGUgdG8gdGV4ZWwgYnVmZmVyIGRlc2NyaXB0b3IgZmFpbGVkIGJlY2F1c2UgdW5kZXJseWluZyBidWZmZXIgKCIgPDwgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSBoYXMgYmVlbiBkZXN0cm95ZWQ6ICIgPDwgZXJyb3JfbXNnLT5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY3ZkZXNjcmlwdG9yc2V0OjpWYWxpZGF0ZUJ1ZmZlclVzYWdlKGJ1ZmZlcl9zdGF0ZSwgdXBkYXRlLT5kZXNjcmlwdG9yVHlwZSwgZXJyb3JfY29kZSwgZXJyb3JfbXNnKSkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcl9zdHI7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0ciA8PCAiQXR0ZW1wdGVkIHdyaXRlIHVwZGF0ZSB0byB0ZXhlbCBidWZmZXIgZGVzY3JpcHRvciBmYWlsZWQgZHVlIHRvOiAiIDw8IGVycm9yX21zZy0+Y19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgKmVycm9yX21zZyA9IGVycm9yX3N0ci5zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzogeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkaSA9IDA7IGRpIDwgdXBkYXRlLT5kZXNjcmlwdG9yQ291bnQ7ICsrZGkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVZhbGlkYXRlQnVmZmVyVXBkYXRlKHVwZGF0ZS0+cEJ1ZmZlckluZm8gKyBkaSwgdXBkYXRlLT5kZXNjcmlwdG9yVHlwZSwgZnVuY19uYW1lLCBlcnJvcl9jb2RlLCBlcnJvcl9tc2cpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX3N0cjsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyIDw8ICJBdHRlbXB0ZWQgd3JpdGUgdXBkYXRlIHRvIGJ1ZmZlciBkZXNjcmlwdG9yIGZhaWxlZCBkdWUgdG86ICIgPDwgZXJyb3JfbXNnLT5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gZXJyb3Jfc3RyLnN0cigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY6CisgICAgICAgICAgICAvLyBYWFggVE9ETworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMCk7ICAvLyBXZSd2ZSBhbHJlYWR5IHZlcmlmaWVkIHVwZGF0ZSB0eXBlIHNvIHNob3VsZCBuZXZlciBnZXQgaGVyZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIEFsbCBjaGVja3MgcGFzc2VkIHNvIHVwZGF0ZSBjb250ZW50cyBhcmUgZ29vZAorICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2Rlc2NyaXB0b3Jfc2V0cy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2Rlc2NyaXB0b3Jfc2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNzEzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZGVzY3JpcHRvcl9zZXRzLmgKQEAgLTAsMCArMSw2ODYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiAgICAgICAgIEpvaG4gWnVsYXVmIDxqenVsYXVmQGx1bmFyZy5jb20+CisgKi8KKyNpZm5kZWYgQ09SRV9WQUxJREFUSU9OX0RFU0NSSVBUT1JfU0VUU19IXworI2RlZmluZSBDT1JFX1ZBTElEQVRJT05fREVTQ1JJUFRPUl9TRVRTX0hfCisKKyNpbmNsdWRlICJoYXNoX3ZrX3R5cGVzLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfbG9nZ2luZy5oIgorI2luY2x1ZGUgInZrX2xheWVyX3V0aWxzLmgiCisjaW5jbHVkZSAidmtfc2FmZV9zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19vYmplY3RfdHlwZXMuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCitjbGFzcyBDb3JlQ2hlY2tzOworY2xhc3MgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjsKKworLy8gRGVzY3JpcHRvciBEYXRhIHN0cnVjdHVyZXMKK25hbWVzcGFjZSBjdmRlc2NyaXB0b3JzZXQgeworCisvLyBVdGlsaXR5IHN0cnVjdHMvY2xhc3Nlcy90eXBlcworLy8gSW5kZXggcmFuZ2UgZm9yIGdsb2JhbCBpbmRpY2VzIGJlbG93LCBlbmQgaXMgZXhjbHVzaXZlLCBpLmUuIFtzdGFydCxlbmQpCitzdHJ1Y3QgSW5kZXhSYW5nZSB7CisgICAgSW5kZXhSYW5nZSh1aW50MzJfdCBzdGFydF9pbiwgdWludDMyX3QgZW5kX2luKSA6IHN0YXJ0KHN0YXJ0X2luKSwgZW5kKGVuZF9pbikge30KKyAgICBJbmRleFJhbmdlKCkgPSBkZWZhdWx0OworICAgIHVpbnQzMl90IHN0YXJ0OworICAgIHVpbnQzMl90IGVuZDsKK307CisKKy8qCisgKiBEZXNjcmlwdG9yU2V0TGF5b3V0RGVmL0Rlc2NyaXB0b3JTZXRMYXlvdXQgY2xhc3NlcworICoKKyAqIE92ZXJ2aWV3IC0gVGhlc2UgdHdvIGNsYXNzZXMgZW5jYXBzdWxhdGUgdGhlIFZ1bGthbiBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZGF0YSAobGF5b3V0KS4KKyAqICAgQSBsYXlvdXQgY29uc2lzdHMgb2Ygc29tZSBudW1iZXIgb2YgYmluZGluZ3MsIGVhY2ggb2Ygd2hpY2ggaGFzIGEgYmluZGluZyMsIGEKKyAqICAgdHlwZSwgZGVzY3JpcHRvciBjb3VudCwgc3RhZ2UgZmxhZ3MsIGFuZCBwSW1tdXRhYmxlU2FtcGxlcnMuCisKKyAqICAgVGhlIERlc2NyaXB0b3JTZXRMYXlvdXREZWYgcmVwcmVzZW50cyBhIGNhbm9uaWNhbGl6YXRpb24gb2YgdGhlIGlucHV0IGRhdGEgYW5kIGNvbnRhaW5zCisgKiAgIG5laXRoZXIgcGVyIGhhbmRsZSBvciBwZXIgZGV2aWNlIHN0YXRlLiAgSXQgaXMgcG9zc2libGUgZm9yIGRpZmZlcmVudCBoYW5kbGVzIG9uCisgKiAgIGRpZmZlcmVudCBkZXZpY2VzIHRvIHNoYXJlIGEgY29tbW9uIGRlZi4gIFRoaXMgaXMgdXNlZCBhbmQgdXNlZnVsIGZvciBxdWljayBjb21wYXRpYmlsdGl5CisgKiAgIHZhbGlkYXRpb24uICBUaGUgRGVzY3JpcHRvclNldExheW91dCByZWZlcnMgdG8gYSBEZXNjcmlwdG9yU2V0TGF5b3V0RGVmIGFuZCBjb250YWlucworICogICBhbGwgcGVyIGhhbmRsZSBzdGF0ZS4KKyAqCisgKiBJbmRleCB2cyBCaW5kaW5nIC0gQSBsYXlvdXQgaXMgY3JlYXRlZCB3aXRoIGFuIGFycmF5IG9mIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcKKyAqICB3aGVyZSBlYWNoIGFycmF5IGluZGV4IHdpbGwgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmluZGluZyMgdGhhdCBpcyBkZWZpbmVkIGluIHRoYXQgc3RydWN0LgorICogIFRoZSBiaW5kaW5nIywgdGhlbiwgaXMgZGVjb3VwbGVkIGZyb20gVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBpbmRleCwgd2hpY2ggYWxsb3dzCisgKiAgYmluZGluZ3MgdG8gYmUgZGVmaW5lZCBvdXQtb2Ytb3JkZXIuIFRoaXMgRGVzY3JpcHRvclNldExheW91dCBjbGFzcywgaG93ZXZlciwgc3RvcmVzCisgKiAgdGhlIGJpbmRpbmdzIGludGVybmFsbHkgaW4tb3JkZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBvcGVyYXRpb25zIHdoaWNoIG1heSAicm9sbCBvdmVyIgorICogIGZyb20gYSBzaW5nbGUgYmluZGluZyB0byB0aGUgbmV4dCBjb25zZWN1dGl2ZSBiaW5kaW5nLgorICoKKyAqICBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIGJpbmRpbmdzIGFyZSBzdG9yZWQgaW4tb3JkZXIsIHRoZXJlIHN0aWxsIG1heSBiZSAiZ2FwcyIgaW4gdGhlCisgKiAgYmluZGluZyMuIEZvciBleGFtcGxlLCBpZiB0aGUgYmluZGluZyBjcmVhdGlvbiBvcmRlciBpcyA4LCA3LCAxMCwgMywgNCwgdGhlbiB0aGUKKyAqICBpbnRlcm5hbCBiaW5kaW5nIGFycmF5IHdpbGwgaGF2ZSBmaXZlIGVudHJpZXMgc3RvcmVkIGluIGJpbmRpbmcgb3JkZXIgMywgNCwgNywgOCwgMTAuCisgKiAgVG8gcHJvY2VzcyBhbGwgb2YgdGhlIGJpbmRpbmdzIGluIGEgbGF5b3V0IHlvdSBjYW4gaXRlcmF0ZSBmcm9tIDAgdG8gR2V0QmluZGluZ0NvdW50KCkKKyAqICBhbmQgdXNlIHRoZSBHZXQqRnJvbUluZGV4KCkgZnVuY3Rpb25zIGZvciBlYWNoIGluZGV4LiBUbyBqdXN0IHByb2Nlc3MgYSBzaW5nbGUgYmluZGluZywKKyAqICB1c2UgdGhlIEdldCpGcm9tQmluZGluZygpIGZ1bmN0aW9ucy4KKyAqCisgKiBHbG9iYWwgSW5kZXggLSBUaGUgYmluZGluZyB2ZWN0b3IgaW5kZXggaGFzIGFzIG1hbnkgaW5kaWNlcyBhcyB0aGVyZSBhcmUgYmluZGluZ3MuCisgKiAgVGhpcyBjbGFzcyBhbHNvIGhhcyB0aGUgY29uY2VwdCBvZiBhIEdsb2JhbCBJbmRleC4gRm9yIHRoZSBnbG9iYWwgaW5kZXggZnVuY3Rpb25zLAorICogIHRoZXJlIGFyZSBhcyBtYW55IGdsb2JhbCBpbmRpY2VzIGFzIHRoZXJlIGFyZSBkZXNjcmlwdG9ycyBpbiB0aGUgbGF5b3V0LgorICogIEZvciB0aGUgZ2xvYmFsIGluZGV4LCBjb25zaWRlciBhbGwgb2YgdGhlIGJpbmRpbmdzIHRvIGJlIGEgZmxhdCBhcnJheSB3aGVyZQorICogIGRlc2NyaXB0b3IgMCBvZiBvZiB0aGUgbG93ZXN0IGJpbmRpbmcjIGlzIGluZGV4IDAgYW5kIGVhY2ggZGVzY3JpcHRvciBpbiB0aGUgbGF5b3V0CisgKiAgaW5jcmVtZW50cyBmcm9tIHRoZXJlLiBTbyBpZiB0aGUgbG93ZXN0IGJpbmRpbmcjIGluIHRoaXMgZXhhbXBsZSBoYWQgZGVzY3JpcHRvckNvdW50IG9mCisgKiAgMTAsIHRoZW4gdGhlIEdsb2JhbFN0YXJ0SW5kZXggb2YgdGhlIDJuZCBsb3dlc3QgYmluZGluZyMgd2lsbCBiZSAxMCB3aGVyZSAwLTkgYXJlIHRoZQorICogIGdsb2JhbCBpbmRpY2VzIGZvciB0aGUgbG93ZXN0IGJpbmRpbmcjLgorICovCitjbGFzcyBEZXNjcmlwdG9yU2V0TGF5b3V0RGVmIHsKKyAgcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcgorICAgIERlc2NyaXB0b3JTZXRMYXlvdXREZWYoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcF9jcmVhdGVfaW5mbyk7CisgICAgc2l6ZV90IGhhc2goKSBjb25zdDsKKworICAgIHVpbnQzMl90IEdldFRvdGFsRGVzY3JpcHRvckNvdW50KCkgY29uc3QgeyByZXR1cm4gZGVzY3JpcHRvcl9jb3VudF87IH07CisgICAgdWludDMyX3QgR2V0RHluYW1pY0Rlc2NyaXB0b3JDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGR5bmFtaWNfZGVzY3JpcHRvcl9jb3VudF87IH07CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MgR2V0Q3JlYXRlRmxhZ3MoKSBjb25zdCB7IHJldHVybiBmbGFnc187IH0KKyAgICAvLyBGb3IgYSBnaXZlbiBiaW5kaW5nLCByZXR1cm4gdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGF0IGJpbmRpbmcgYW5kIGFsbCBzdWNjZXNzaXZlIGJpbmRpbmdzCisgICAgdWludDMyX3QgR2V0QmluZGluZ0NvdW50KCkgY29uc3QgeyByZXR1cm4gYmluZGluZ19jb3VudF87IH07CisgICAgLy8gTm9uLWVtcHR5IGJpbmRpbmcgbnVtYmVycyBpbiBvcmRlcgorICAgIGNvbnN0IHN0ZDo6c2V0PHVpbnQzMl90PiAmR2V0U29ydGVkQmluZGluZ1NldCgpIGNvbnN0IHsgcmV0dXJuIG5vbl9lbXB0eV9iaW5kaW5nc187IH0KKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBiaW5kaW5nIGlzIHByZXNlbnQgaW4gdGhpcyBsYXlvdXQKKyAgICBib29sIEhhc0JpbmRpbmcoY29uc3QgdWludDMyX3QgYmluZGluZykgY29uc3QgeyByZXR1cm4gYmluZGluZ190b19pbmRleF9tYXBfLmNvdW50KGJpbmRpbmcpID4gMDsgfTsKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBiaW5kaW5nIDEgYmV5b25kIGdpdmVuIGV4aXN0cyBhbmQgaGFzIHNhbWUgdHlwZSwgc3RhZ2VGbGFncyAmIGltbXV0YWJsZSBzYW1wbGVyIHVzZQorICAgIGJvb2wgSXNOZXh0QmluZGluZ0NvbnNpc3RlbnQoY29uc3QgdWludDMyX3QpIGNvbnN0OworICAgIHVpbnQzMl90IEdldEluZGV4RnJvbUJpbmRpbmcodWludDMyX3QgYmluZGluZykgY29uc3Q7CisgICAgLy8gVmFyaW91cyBHZXQgZnVuY3Rpb25zIHRoYXQgY2FuIGVpdGhlciBiZSBwYXNzZWQgYSBiaW5kaW5nIywgd2hpY2ggd2lsbAorICAgIC8vICBiZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgaW50byB0aGUgYXBwcm9wcmlhdGUgaW5kZXgsIG9yIHRoZSBpbmRleCMgY2FuIGJlIHBhc3NlZCBpbiBkaXJlY3RseQorICAgIHVpbnQzMl90IEdldE1heEJpbmRpbmcoKSBjb25zdCB7IHJldHVybiBiaW5kaW5nc19bYmluZGluZ3NfLnNpemUoKSAtIDFdLmJpbmRpbmc7IH0KKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGNvbnN0ICpHZXREZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1B0ckZyb21JbmRleChjb25zdCB1aW50MzJfdCkgY29uc3Q7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBjb25zdCAqR2V0RGVzY3JpcHRvclNldExheW91dEJpbmRpbmdQdHJGcm9tQmluZGluZyh1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgICAgIHJldHVybiBHZXREZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1B0ckZyb21JbmRleChHZXRJbmRleEZyb21CaW5kaW5nKGJpbmRpbmcpKTsKKyAgICB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiAmR2V0QmluZGluZ3MoKSBjb25zdCB7IHJldHVybiBiaW5kaW5nc187IH0KKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nICpHZXRCaW5kaW5nSW5mb0Zyb21JbmRleChjb25zdCB1aW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gYmluZGluZ3NfW2luZGV4XS5wdHIoKTsgfQorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgKkdldEJpbmRpbmdJbmZvRnJvbUJpbmRpbmcoY29uc3QgdWludDMyX3QgYmluZGluZykgY29uc3QgeworICAgICAgICByZXR1cm4gR2V0QmluZGluZ0luZm9Gcm9tSW5kZXgoR2V0SW5kZXhGcm9tQmluZGluZyhiaW5kaW5nKSk7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVD4gJkdldEJpbmRpbmdGbGFncygpIGNvbnN0IHsgcmV0dXJuIGJpbmRpbmdfZmxhZ3NfOyB9CisgICAgdWludDMyX3QgR2V0RGVzY3JpcHRvckNvdW50RnJvbUluZGV4KGNvbnN0IHVpbnQzMl90KSBjb25zdDsKKyAgICB1aW50MzJfdCBHZXREZXNjcmlwdG9yQ291bnRGcm9tQmluZGluZyhjb25zdCB1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgICAgIHJldHVybiBHZXREZXNjcmlwdG9yQ291bnRGcm9tSW5kZXgoR2V0SW5kZXhGcm9tQmluZGluZyhiaW5kaW5nKSk7CisgICAgfQorICAgIFZrRGVzY3JpcHRvclR5cGUgR2V0VHlwZUZyb21JbmRleChjb25zdCB1aW50MzJfdCkgY29uc3Q7CisgICAgVmtEZXNjcmlwdG9yVHlwZSBHZXRUeXBlRnJvbUJpbmRpbmcoY29uc3QgdWludDMyX3QgYmluZGluZykgY29uc3QgeyByZXR1cm4gR2V0VHlwZUZyb21JbmRleChHZXRJbmRleEZyb21CaW5kaW5nKGJpbmRpbmcpKTsgfQorICAgIFZrU2hhZGVyU3RhZ2VGbGFncyBHZXRTdGFnZUZsYWdzRnJvbUluZGV4KGNvbnN0IHVpbnQzMl90KSBjb25zdDsKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgR2V0U3RhZ2VGbGFnc0Zyb21CaW5kaW5nKGNvbnN0IHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEdldFN0YWdlRmxhZ3NGcm9tSW5kZXgoR2V0SW5kZXhGcm9tQmluZGluZyhiaW5kaW5nKSk7CisgICAgfQorICAgIFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCBHZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzRnJvbUluZGV4KGNvbnN0IHVpbnQzMl90KSBjb25zdDsKKyAgICBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQgR2V0RGVzY3JpcHRvckJpbmRpbmdGbGFnc0Zyb21CaW5kaW5nKGNvbnN0IHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEdldERlc2NyaXB0b3JCaW5kaW5nRmxhZ3NGcm9tSW5kZXgoR2V0SW5kZXhGcm9tQmluZGluZyhiaW5kaW5nKSk7CisgICAgfQorICAgIFZrU2FtcGxlciBjb25zdCAqR2V0SW1tdXRhYmxlU2FtcGxlclB0ckZyb21CaW5kaW5nKGNvbnN0IHVpbnQzMl90KSBjb25zdDsKKyAgICBWa1NhbXBsZXIgY29uc3QgKkdldEltbXV0YWJsZVNhbXBsZXJQdHJGcm9tSW5kZXgoY29uc3QgdWludDMyX3QpIGNvbnN0OworICAgIC8vIEZvciBhIGdpdmVuIGJpbmRpbmcgYW5kIGFycmF5IGluZGV4LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggaW50byB0aGUgZHluYW1pYyBvZmZzZXQgYXJyYXkKKyAgICBpbnQzMl90IEdldER5bmFtaWNPZmZzZXRJbmRleEZyb21CaW5kaW5nKHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICAgICAgYXV0byBkeW5fb2ZmID0gYmluZGluZ190b19keW5hbWljX2FycmF5X2lkeF9tYXBfLmZpbmQoYmluZGluZyk7CisgICAgICAgIGlmIChkeW5fb2ZmID09IGJpbmRpbmdfdG9fZHluYW1pY19hcnJheV9pZHhfbWFwXy5lbmQoKSkgeworICAgICAgICAgICAgYXNzZXJ0KDApOyAgLy8gUmVxdWVzdGluZyBkeW4gb2Zmc2V0IGZvciBpbnZhbGlkIGJpbmRpbmcvYXJyYXkgaWR4IHBhaXIKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHluX29mZi0+c2Vjb25kOworICAgIH0KKyAgICAvLyBGb3IgYSBwYXJ0aWN1bGFyIGJpbmRpbmcsIGdldCB0aGUgZ2xvYmFsIGluZGV4IHJhbmdlCisgICAgLy8gIFRoaXMgY2FsbCBzaG91bGQgYmUgZ3VhcmRlZCBieSBhIGNhbGwgdG8gIkhhc0JpbmRpbmcoYmluZGluZykiIHRvIHZlcmlmeSB0aGF0IHRoZSBnaXZlbiBiaW5kaW5nIGV4aXN0cworICAgIGNvbnN0IEluZGV4UmFuZ2UgJkdldEdsb2JhbEluZGV4UmFuZ2VGcm9tQmluZGluZyhjb25zdCB1aW50MzJfdCkgY29uc3Q7CisgICAgY29uc3QgY3ZkZXNjcmlwdG9yc2V0OjpJbmRleFJhbmdlICZHZXRHbG9iYWxJbmRleFJhbmdlRnJvbUluZGV4KHVpbnQzMl90IGluZGV4KSBjb25zdDsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIG5leHQgdmFsaWQgYmluZGluZyBmb3IgYSBkZXNjcmlwdG9yCisgICAgdWludDMyX3QgR2V0TmV4dFZhbGlkQmluZGluZyhjb25zdCB1aW50MzJfdCkgY29uc3Q7CisgICAgYm9vbCBJc1B1c2hEZXNjcmlwdG9yKCkgY29uc3QgeyByZXR1cm4gR2V0Q3JlYXRlRmxhZ3MoKSAmIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFI7IH07CisKKyAgICBzdHJ1Y3QgQmluZGluZ1R5cGVTdGF0cyB7CisgICAgICAgIHVpbnQzMl90IGR5bmFtaWNfYnVmZmVyX2NvdW50OworICAgICAgICB1aW50MzJfdCBub25fZHluYW1pY19idWZmZXJfY291bnQ7CisgICAgICAgIHVpbnQzMl90IGltYWdlX3NhbXBsZXJfY291bnQ7CisgICAgfTsKKyAgICBjb25zdCBCaW5kaW5nVHlwZVN0YXRzICZHZXRCaW5kaW5nVHlwZVN0YXRzKCkgY29uc3QgeyByZXR1cm4gYmluZGluZ190eXBlX3N0YXRzXzsgfQorCisgIHByaXZhdGU6CisgICAgLy8gT25seSB0aGUgZmlyc3QgdGhyZWUgZGF0YSBtZW1iZXJzIGFyZSB1c2VkIGZvciBoYXNoIGFuZCBlcXVhbGl0eSBjaGVja3MsIHRoZSBvdGhlciBtZW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gdGhlbSwgYW5kIGFyZQorICAgIC8vIHVzZWQgdG8gc3BlZWQgdXAgdGhlIHZhcmlvdXMgbG9va3Vwcy9xdWVyaWVzL3ZhbGlkYXRpb25zCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MgZmxhZ3NfOworICAgIHN0ZDo6dmVjdG9yPHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZz4gYmluZGluZ3NfOworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVD4gYmluZGluZ19mbGFnc187CisKKyAgICAvLyBDb252ZW5pZW5jZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHJhcGlkIGxvb2t1cCBvZiB2YXJpb3VzIGRlc2NyaXB0b3Igc2V0IGxheW91dCBwcm9wZXJ0aWVzCisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IG5vbl9lbXB0eV9iaW5kaW5nc187ICAvLyBDb250YWluaW5nIG5vbi1lbXRweSBiaW5kaW5ncyBpbiBudW1lcmljYWwgb3JkZXIKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIHVpbnQzMl90PiBiaW5kaW5nX3RvX2luZGV4X21hcF87CisgICAgLy8gVGhlIGZvbGxvd2luZyBtYXAgYWxsb3dzIGFuIG5vbi1pdGVyYXRpdmUgbG9va3VwIG9mIGEgYmluZGluZyBmcm9tIGEgZ2xvYmFsIGluZGV4Li4uCisgICAgc3RkOjp2ZWN0b3I8SW5kZXhSYW5nZT4gZ2xvYmFsX2luZGV4X3JhbmdlXzsgIC8vIHJhbmdlIGlzIGV4Y2x1c2l2ZSBvZiAuZW5kCisgICAgLy8gRm9yIGEgZ2l2ZW4gYmluZGluZyBtYXAgdG8gYXNzb2NpYXRlZCBpbmRleCBpbiB0aGUgZHluYW1pYyBvZmZzZXQgYXJyYXkKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIHVpbnQzMl90PiBiaW5kaW5nX3RvX2R5bmFtaWNfYXJyYXlfaWR4X21hcF87CisKKyAgICB1aW50MzJfdCBiaW5kaW5nX2NvdW50XzsgICAgIC8vICMgb2YgYmluZGluZ3MgaW4gdGhpcyBsYXlvdXQKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yX2NvdW50XzsgIC8vIHRvdGFsICMgZGVzY3JpcHRvcnMgaW4gdGhpcyBsYXlvdXQKKyAgICB1aW50MzJfdCBkeW5hbWljX2Rlc2NyaXB0b3JfY291bnRfOworICAgIEJpbmRpbmdUeXBlU3RhdHMgYmluZGluZ190eXBlX3N0YXRzXzsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXREZWYgJmxocywgY29uc3QgRGVzY3JpcHRvclNldExheW91dERlZiAmcmhzKSB7CisgICAgYm9vbCByZXN1bHQgPSAobGhzLkdldENyZWF0ZUZsYWdzKCkgPT0gcmhzLkdldENyZWF0ZUZsYWdzKCkpICYmIChsaHMuR2V0QmluZGluZ3MoKSA9PSByaHMuR2V0QmluZGluZ3MoKSkgJiYKKyAgICAgICAgICAgICAgICAgIChsaHMuR2V0QmluZGluZ0ZsYWdzKCkgPT0gcmhzLkdldEJpbmRpbmdGbGFncygpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBDYW5vbmljYWwgZGljdGlvbmFyeSBvZiBEU0wgZGVmaW5pdGlvbnMgLS0gaW5kZXBlbmRlbnQgb2YgZGV2aWNlIG9yIGhhbmRsZQordXNpbmcgRGVzY3JpcHRvclNldExheW91dERpY3QgPSBoYXNoX3V0aWw6OkRpY3Rpb25hcnk8RGVzY3JpcHRvclNldExheW91dERlZiwgaGFzaF91dGlsOjpIYXNIYXNoTWVtYmVyPERlc2NyaXB0b3JTZXRMYXlvdXREZWY+PjsKK3VzaW5nIERlc2NyaXB0b3JTZXRMYXlvdXRJZCA9IERlc2NyaXB0b3JTZXRMYXlvdXREaWN0OjpJZDsKKworY2xhc3MgRGVzY3JpcHRvclNldExheW91dCA6IHB1YmxpYyBCQVNFX05PREUgeworICBwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yCisgICAgRGVzY3JpcHRvclNldExheW91dChjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICpwX2NyZWF0ZV9pbmZvLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgbGF5b3V0KTsKKyAgICBib29sIEhhc0JpbmRpbmcoY29uc3QgdWludDMyX3QgYmluZGluZykgY29uc3QgeyByZXR1cm4gbGF5b3V0X2lkXy0+SGFzQmluZGluZyhiaW5kaW5nKTsgfQorICAgIC8vIFJldHVybiB0cnVlIGlmIHRoaXMgbGF5b3V0IGlzIGNvbXBhdGlibGUgd2l0aCBwYXNzZWQgaW4gbGF5b3V0IGZyb20gYSBwaXBlbGluZUxheW91dCwKKyAgICAvLyAgIGVsc2UgcmV0dXJuIGZhbHNlIGFuZCB1cGRhdGUgZXJyb3JfbXNnIHdpdGggZGVzY3JpcHRpb24gb2YgaW5jb21wYXRpYmlsaXR5CisgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBsYXlvdXQgaXMgY29tcGF0aWJsZSB3aXRoIHBhc3NlZCBpbiBsYXlvdXQKKyAgICBib29sIElzQ29tcGF0aWJsZShEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbnN0ICpyaF9kc19sYXlvdXQpIGNvbnN0OworICAgIC8vIFN0cmFpZ2h0Zm9yd2FyZCBHZXQgZnVuY3Rpb25zCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IEdldERlc2NyaXB0b3JTZXRMYXlvdXQoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfOyB9OworICAgIGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXREZWYgKkdldExheW91dERlZigpIGNvbnN0IHsgcmV0dXJuIGxheW91dF9pZF8uZ2V0KCk7IH0KKyAgICBEZXNjcmlwdG9yU2V0TGF5b3V0SWQgR2V0TGF5b3V0SWQoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfaWRfOyB9CisgICAgdWludDMyX3QgR2V0VG90YWxEZXNjcmlwdG9yQ291bnQoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfaWRfLT5HZXRUb3RhbERlc2NyaXB0b3JDb3VudCgpOyB9OworICAgIHVpbnQzMl90IEdldER5bmFtaWNEZXNjcmlwdG9yQ291bnQoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfaWRfLT5HZXREeW5hbWljRGVzY3JpcHRvckNvdW50KCk7IH07CisgICAgdWludDMyX3QgR2V0QmluZGluZ0NvdW50KCkgY29uc3QgeyByZXR1cm4gbGF5b3V0X2lkXy0+R2V0QmluZGluZ0NvdW50KCk7IH07CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MgR2V0Q3JlYXRlRmxhZ3MoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfaWRfLT5HZXRDcmVhdGVGbGFncygpOyB9CisgICAgYm9vbCBJc05leHRCaW5kaW5nQ29uc2lzdGVudChjb25zdCB1aW50MzJfdCkgY29uc3Q7CisgICAgdWludDMyX3QgR2V0SW5kZXhGcm9tQmluZGluZyh1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7IHJldHVybiBsYXlvdXRfaWRfLT5HZXRJbmRleEZyb21CaW5kaW5nKGJpbmRpbmcpOyB9CisgICAgLy8gVmFyaW91cyBHZXQgZnVuY3Rpb25zIHRoYXQgY2FuIGVpdGhlciBiZSBwYXNzZWQgYSBiaW5kaW5nIywgd2hpY2ggd2lsbAorICAgIC8vICBiZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgaW50byB0aGUgYXBwcm9wcmlhdGUgaW5kZXgsIG9yIHRoZSBpbmRleCMgY2FuIGJlIHBhc3NlZCBpbiBkaXJlY3RseQorICAgIHVpbnQzMl90IEdldE1heEJpbmRpbmcoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfaWRfLT5HZXRNYXhCaW5kaW5nKCk7IH0KKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGNvbnN0ICpHZXREZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1B0ckZyb21JbmRleChjb25zdCB1aW50MzJfdCBpbmRleCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGF5b3V0X2lkXy0+R2V0RGVzY3JpcHRvclNldExheW91dEJpbmRpbmdQdHJGcm9tSW5kZXgoaW5kZXgpOworICAgIH0KKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGNvbnN0ICpHZXREZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1B0ckZyb21CaW5kaW5nKHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxheW91dF9pZF8tPkdldERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nUHRyRnJvbUJpbmRpbmcoYmluZGluZyk7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZz4gJkdldEJpbmRpbmdzKCkgY29uc3QgeyByZXR1cm4gbGF5b3V0X2lkXy0+R2V0QmluZGluZ3MoKTsgfQorICAgIGNvbnN0IHN0ZDo6c2V0PHVpbnQzMl90PiAmR2V0U29ydGVkQmluZGluZ1NldCgpIGNvbnN0IHsgcmV0dXJuIGxheW91dF9pZF8tPkdldFNvcnRlZEJpbmRpbmdTZXQoKTsgfQorICAgIHVpbnQzMl90IEdldERlc2NyaXB0b3JDb3VudEZyb21JbmRleChjb25zdCB1aW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbGF5b3V0X2lkXy0+R2V0RGVzY3JpcHRvckNvdW50RnJvbUluZGV4KGluZGV4KTsgfQorICAgIHVpbnQzMl90IEdldERlc2NyaXB0b3JDb3VudEZyb21CaW5kaW5nKGNvbnN0IHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxheW91dF9pZF8tPkdldERlc2NyaXB0b3JDb3VudEZyb21CaW5kaW5nKGJpbmRpbmcpOworICAgIH0KKyAgICBWa0Rlc2NyaXB0b3JUeXBlIEdldFR5cGVGcm9tSW5kZXgoY29uc3QgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGxheW91dF9pZF8tPkdldFR5cGVGcm9tSW5kZXgoaW5kZXgpOyB9CisgICAgVmtEZXNjcmlwdG9yVHlwZSBHZXRUeXBlRnJvbUJpbmRpbmcoY29uc3QgdWludDMyX3QgYmluZGluZykgY29uc3QgeyByZXR1cm4gbGF5b3V0X2lkXy0+R2V0VHlwZUZyb21CaW5kaW5nKGJpbmRpbmcpOyB9CisgICAgVmtTaGFkZXJTdGFnZUZsYWdzIEdldFN0YWdlRmxhZ3NGcm9tSW5kZXgoY29uc3QgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGxheW91dF9pZF8tPkdldFN0YWdlRmxhZ3NGcm9tSW5kZXgoaW5kZXgpOyB9CisgICAgVmtTaGFkZXJTdGFnZUZsYWdzIEdldFN0YWdlRmxhZ3NGcm9tQmluZGluZyhjb25zdCB1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsYXlvdXRfaWRfLT5HZXRTdGFnZUZsYWdzRnJvbUJpbmRpbmcoYmluZGluZyk7CisgICAgfQorICAgIFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCBHZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzRnJvbUluZGV4KGNvbnN0IHVpbnQzMl90IGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBsYXlvdXRfaWRfLT5HZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzRnJvbUluZGV4KGluZGV4KTsKKyAgICB9CisgICAgVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUIEdldERlc2NyaXB0b3JCaW5kaW5nRmxhZ3NGcm9tQmluZGluZyhjb25zdCB1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsYXlvdXRfaWRfLT5HZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzRnJvbUJpbmRpbmcoYmluZGluZyk7CisgICAgfQorICAgIFZrU2FtcGxlciBjb25zdCAqR2V0SW1tdXRhYmxlU2FtcGxlclB0ckZyb21CaW5kaW5nKGNvbnN0IHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxheW91dF9pZF8tPkdldEltbXV0YWJsZVNhbXBsZXJQdHJGcm9tQmluZGluZyhiaW5kaW5nKTsKKyAgICB9CisgICAgVmtTYW1wbGVyIGNvbnN0ICpHZXRJbW11dGFibGVTYW1wbGVyUHRyRnJvbUluZGV4KGNvbnN0IHVpbnQzMl90IGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBsYXlvdXRfaWRfLT5HZXRJbW11dGFibGVTYW1wbGVyUHRyRnJvbUluZGV4KGluZGV4KTsKKyAgICB9CisgICAgLy8gRm9yIGEgZ2l2ZW4gYmluZGluZyBhbmQgYXJyYXkgaW5kZXgsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbnRvIHRoZSBkeW5hbWljIG9mZnNldCBhcnJheQorICAgIGludDMyX3QgR2V0RHluYW1pY09mZnNldEluZGV4RnJvbUJpbmRpbmcodWludDMyX3QgYmluZGluZykgY29uc3QgeworICAgICAgICByZXR1cm4gbGF5b3V0X2lkXy0+R2V0RHluYW1pY09mZnNldEluZGV4RnJvbUJpbmRpbmcoYmluZGluZyk7CisgICAgfQorICAgIC8vIEZvciBhIHBhcnRpY3VsYXIgYmluZGluZywgZ2V0IHRoZSBnbG9iYWwgaW5kZXggcmFuZ2UKKyAgICAvLyAgVGhpcyBjYWxsIHNob3VsZCBiZSBndWFyZGVkIGJ5IGEgY2FsbCB0byAiSGFzQmluZGluZyhiaW5kaW5nKSIgdG8gdmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGJpbmRpbmcgZXhpc3RzCisgICAgY29uc3QgSW5kZXhSYW5nZSAmR2V0R2xvYmFsSW5kZXhSYW5nZUZyb21CaW5kaW5nKGNvbnN0IHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxheW91dF9pZF8tPkdldEdsb2JhbEluZGV4UmFuZ2VGcm9tQmluZGluZyhiaW5kaW5nKTsKKyAgICB9CisgICAgY29uc3QgSW5kZXhSYW5nZSAmR2V0R2xvYmFsSW5kZXhSYW5nZUZyb21JbmRleCh1aW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbGF5b3V0X2lkXy0+R2V0R2xvYmFsSW5kZXhSYW5nZUZyb21JbmRleChpbmRleCk7IH0KKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIG5leHQgdmFsaWQgYmluZGluZyBmb3IgYSBkZXNjcmlwdG9yCisgICAgdWludDMyX3QgR2V0TmV4dFZhbGlkQmluZGluZyhjb25zdCB1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7IHJldHVybiBsYXlvdXRfaWRfLT5HZXROZXh0VmFsaWRCaW5kaW5nKGJpbmRpbmcpOyB9CisgICAgYm9vbCBJc1B1c2hEZXNjcmlwdG9yKCkgY29uc3QgeyByZXR1cm4gbGF5b3V0X2lkXy0+SXNQdXNoRGVzY3JpcHRvcigpOyB9CisgICAgYm9vbCBJc1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50RnJvbUluZGV4KHVpbnQzMl90IGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiAhIShHZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzRnJvbUluZGV4KGluZGV4KSAmIFZLX0RFU0NSSVBUT1JfQklORElOR19WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0JJVF9FWFQpOworICAgIH0KKyAgICBib29sIElzVmFyaWFibGVEZXNjcmlwdG9yQ291bnQodWludDMyX3QgYmluZGluZykgY29uc3QgeworICAgICAgICByZXR1cm4gSXNWYXJpYWJsZURlc2NyaXB0b3JDb3VudEZyb21JbmRleChHZXRJbmRleEZyb21CaW5kaW5nKGJpbmRpbmcpKTsKKyAgICB9CisKKyAgICB1c2luZyBCaW5kaW5nVHlwZVN0YXRzID0gRGVzY3JpcHRvclNldExheW91dERlZjo6QmluZGluZ1R5cGVTdGF0czsKKyAgICBjb25zdCBCaW5kaW5nVHlwZVN0YXRzICZHZXRCaW5kaW5nVHlwZVN0YXRzKCkgY29uc3QgeyByZXR1cm4gbGF5b3V0X2lkXy0+R2V0QmluZGluZ1R5cGVTdGF0cygpOyB9CisKKyAgICAvLyBCaW5kaW5nIEl0ZXJhdG9yCisgICAgY2xhc3MgQ29uc3RCaW5kaW5nSXRlcmF0b3IgeworICAgICAgcHVibGljOgorICAgICAgICBDb25zdEJpbmRpbmdJdGVyYXRvcigpID0gZGVsZXRlOworICAgICAgICBDb25zdEJpbmRpbmdJdGVyYXRvcihjb25zdCBDb25zdEJpbmRpbmdJdGVyYXRvciAmb3RoZXIpID0gZGVmYXVsdDsKKyAgICAgICAgQ29uc3RCaW5kaW5nSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBDb25zdEJpbmRpbmdJdGVyYXRvciAmcmhzKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgQ29uc3RCaW5kaW5nSXRlcmF0b3IoY29uc3QgRGVzY3JpcHRvclNldExheW91dCAqbGF5b3V0KSA6IGxheW91dF8obGF5b3V0KSwgaW5kZXhfKDApIHsgYXNzZXJ0KGxheW91dCk7IH0KKyAgICAgICAgQ29uc3RCaW5kaW5nSXRlcmF0b3IoY29uc3QgRGVzY3JpcHRvclNldExheW91dCAqbGF5b3V0LCB1aW50MzJfdCBiaW5kaW5nKSA6IENvbnN0QmluZGluZ0l0ZXJhdG9yKGxheW91dCkgeworICAgICAgICAgICAgaW5kZXhfID0gbGF5b3V0LT5HZXRJbmRleEZyb21CaW5kaW5nKGJpbmRpbmcpOworICAgICAgICB9CisKKyAgICAgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBjb25zdCAqR2V0RGVzY3JpcHRvclNldExheW91dEJpbmRpbmdQdHIoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbGF5b3V0Xy0+R2V0RGVzY3JpcHRvclNldExheW91dEJpbmRpbmdQdHJGcm9tSW5kZXgoaW5kZXhfKTsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBHZXREZXNjcmlwdG9yQ291bnQoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfLT5HZXREZXNjcmlwdG9yQ291bnRGcm9tSW5kZXgoaW5kZXhfKTsgfQorICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfLT5HZXRUeXBlRnJvbUluZGV4KGluZGV4Xyk7IH0KKyAgICAgICAgVmtTaGFkZXJTdGFnZUZsYWdzIEdldFN0YWdlRmxhZ3MoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfLT5HZXRTdGFnZUZsYWdzRnJvbUluZGV4KGluZGV4Xyk7IH0KKworICAgICAgICBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQgR2V0RGVzY3JpcHRvckJpbmRpbmdGbGFncygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXRfLT5HZXREZXNjcmlwdG9yQmluZGluZ0ZsYWdzRnJvbUluZGV4KGluZGV4Xyk7CisgICAgICAgIH0KKworICAgICAgICBib29sIElzVmFyaWFibGVEZXNjcmlwdG9yQ291bnQoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfLT5Jc1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50RnJvbUluZGV4KGluZGV4Xyk7IH0KKworICAgICAgICBWa1NhbXBsZXIgY29uc3QgKkdldEltbXV0YWJsZVNhbXBsZXJQdHIoKSBjb25zdCB7IHJldHVybiBsYXlvdXRfLT5HZXRJbW11dGFibGVTYW1wbGVyUHRyRnJvbUluZGV4KGluZGV4Xyk7IH0KKyAgICAgICAgY29uc3QgSW5kZXhSYW5nZSAmR2V0R2xvYmFsSW5kZXhSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIGxheW91dF8tPkdldEdsb2JhbEluZGV4UmFuZ2VGcm9tSW5kZXgoaW5kZXhfKTsgfQorICAgICAgICBib29sIEF0RW5kKCkgY29uc3QgeyByZXR1cm4gaW5kZXhfID09IGxheW91dF8tPkdldEJpbmRpbmdDb3VudCgpOyB9CisKKyAgICAgICAgLy8gUmV0dXJuIGluZGV4IGludG8gZHluYW1pYyBvZmZzZXQgYXJyYXkgZm9yIGdpdmVuIGJpbmRpbmcKKyAgICAgICAgaW50MzJfdCBHZXREeW5hbWljT2Zmc2V0SW5kZXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbGF5b3V0Xy0+R2V0RHluYW1pY09mZnNldEluZGV4RnJvbUJpbmRpbmcoQmluZGluZygpKTsgIC8vICBUaGVyZSBpcyBvbmx5IGJpbmRpbmcgbWFwcGVkIGFjY2VzcyBpbiBsYXlvdXRfCisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29uc3RCaW5kaW5nSXRlcmF0b3IgJnJocykgeyByZXR1cm4gKGluZGV4XyA9IHJocy5pbmRleF8pICYmIChsYXlvdXRfID09IHJocy5sYXlvdXRfKTsgfQorCisgICAgICAgIENvbnN0QmluZGluZ0l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgICAgICAgaWYgKCFBdEVuZCgpKSB7CisgICAgICAgICAgICAgICAgaW5kZXhfKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIElzQ29uc2lzdGVudChjb25zdCBDb25zdEJpbmRpbmdJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmIChBdEVuZCgpIHx8IG90aGVyLkF0RW5kKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBhdXRvICpiaW5kaW5nX2NpID0gR2V0RGVzY3JpcHRvclNldExheW91dEJpbmRpbmdQdHIoKTsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gKm90aGVyX2JpbmRpbmdfY2kgPSBvdGhlci5HZXREZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1B0cigpOworICAgICAgICAgICAgYXNzZXJ0KChiaW5kaW5nX2NpICE9IG51bGxwdHIpICYmIChvdGhlcl9iaW5kaW5nX2NpICE9IG51bGxwdHIpKTsKKworICAgICAgICAgICAgaWYgKChiaW5kaW5nX2NpLT5kZXNjcmlwdG9yVHlwZSAhPSBvdGhlcl9iaW5kaW5nX2NpLT5kZXNjcmlwdG9yVHlwZSkgfHwKKyAgICAgICAgICAgICAgICAoYmluZGluZ19jaS0+c3RhZ2VGbGFncyAhPSBvdGhlcl9iaW5kaW5nX2NpLT5zdGFnZUZsYWdzKSB8fAorICAgICAgICAgICAgICAgICghaGFzaF91dGlsOjpzaW1pbGFyX2Zvcl9udWxsaXR5KGJpbmRpbmdfY2ktPnBJbW11dGFibGVTYW1wbGVycywgb3RoZXJfYmluZGluZ19jaS0+cEltbXV0YWJsZVNhbXBsZXJzKSkgfHwKKyAgICAgICAgICAgICAgICAoR2V0RGVzY3JpcHRvckJpbmRpbmdGbGFncygpICE9IG90aGVyLkdldERlc2NyaXB0b3JCaW5kaW5nRmxhZ3MoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXQgKkxheW91dCgpIGNvbnN0IHsgcmV0dXJuIGxheW91dF87IH0KKyAgICAgICAgdWludDMyX3QgQmluZGluZygpIGNvbnN0IHsgcmV0dXJuIGxheW91dF8tPkdldEJpbmRpbmdzKClbaW5kZXhfXS5iaW5kaW5nOyB9CisgICAgICAgIENvbnN0QmluZGluZ0l0ZXJhdG9yIE5leHQoKSB7CisgICAgICAgICAgICBDb25zdEJpbmRpbmdJdGVyYXRvciBuZXh0KCp0aGlzKTsKKyAgICAgICAgICAgICsrbmV4dDsKKyAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICB9CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXQgKmxheW91dF87CisgICAgICAgIHVpbnQzMl90IGluZGV4XzsKKyAgICB9OworICAgIENvbnN0QmluZGluZ0l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIENvbnN0QmluZGluZ0l0ZXJhdG9yKHRoaXMsIEdldEJpbmRpbmdDb3VudCgpKTsgfQorCisgIHByaXZhdGU6CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGxheW91dF87CisgICAgRGVzY3JpcHRvclNldExheW91dElkIGxheW91dF9pZF87Cit9OworCisvKgorICogRGVzY3JpcHRvciBjbGFzc2VzCisgKiAgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZyb20gd2hpY2ggNSBzZXBhcmF0ZSBkZXNjcmlwdG9yIHR5cGVzIGFyZSBkZXJpdmVkLgorICogICBUaGlzIGFsbG93cyB0aGUgV3JpdGVVcGRhdGUoKSBhbmQgQ29weVVwZGF0ZSgpIG9wZXJhdGlvbnMgdG8gYmUgc3BlY2lhbGl6ZWQgcGVyCisgKiAgIGRlc2NyaXB0b3IgdHlwZSwgYnV0IGFsbCBkZXNjcmlwdG9ycyBpbiBhIHNldCBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBjb21tb24gRGVzY3JpcHRvciouCisgKi8KKworLy8gU2xpZ2h0bHkgYnJvYWRlciB0aGFuIHR5cGUsIGVhY2ggYysrICJjbGFzcyIgd2lsbCBoYXMgYSBjb3JyZXNwb25kaW5nICJEZXNjcmlwdG9yQ2xhc3MiCitlbnVtIERlc2NyaXB0b3JDbGFzcyB7IFBsYWluU2FtcGxlciwgSW1hZ2VTYW1wbGVyLCBJbWFnZSwgVGV4ZWxCdWZmZXIsIEdlbmVyYWxCdWZmZXIsIElubGluZVVuaWZvcm0sIEFjY2VsZXJhdGlvblN0cnVjdHVyZSB9OworCitjbGFzcyBEZXNjcmlwdG9yIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfkRlc2NyaXB0b3IoKXt9OworICAgIHZpcnR1YWwgdm9pZCBXcml0ZVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKiwgY29uc3QgdWludDMyX3QpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgQ29weVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgRGVzY3JpcHRvciAqKSA9IDA7CisgICAgLy8gQ3JlYXRlIGJpbmRpbmcgYmV0d2VlbiByZXNvdXJjZXMgb2YgdGhpcyBkZXNjcmlwdG9yIGFuZCBnaXZlbiBjYl9ub2RlCisgICAgdmlydHVhbCB2b2lkIFVwZGF0ZURyYXdTdGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICosIENNRF9CVUZGRVJfU1RBVEUgKikgPSAwOworICAgIHZpcnR1YWwgRGVzY3JpcHRvckNsYXNzIEdldENsYXNzKCkgY29uc3QgeyByZXR1cm4gZGVzY3JpcHRvcl9jbGFzczsgfTsKKyAgICAvLyBTcGVjaWFsIGZhc3QtcGF0aCBjaGVjayBmb3IgU2FtcGxlckRlc2NyaXB0b3JzIHRoYXQgYXJlIGltbXV0YWJsZQorICAgIHZpcnR1YWwgYm9vbCBJc0ltbXV0YWJsZVNhbXBsZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAvLyBDaGVjayBmb3IgZHluYW1pYyBkZXNjcmlwdG9yIHR5cGUKKyAgICB2aXJ0dWFsIGJvb2wgSXNEeW5hbWljKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgLy8gQ2hlY2sgZm9yIHN0b3JhZ2UgZGVzY3JpcHRvciB0eXBlCisgICAgdmlydHVhbCBib29sIElzU3RvcmFnZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgIGJvb2wgdXBkYXRlZDsgIC8vIEhhcyBkZXNjcmlwdG9yIGJlZW4gdXBkYXRlZD8KKyAgICBEZXNjcmlwdG9yQ2xhc3MgZGVzY3JpcHRvcl9jbGFzczsKK307CisKKy8vIFJldHVybiB0cnVlIGlmIHRoaXMgbGF5b3V0IGlzIGNvbXBhdGlibGUgd2l0aCBwYXNzZWQgaW4gbGF5b3V0IGZyb20gYSBwaXBlbGluZUxheW91dCwKKy8vICAgZWxzZSByZXR1cm4gZmFsc2UgYW5kIHVwZGF0ZSBlcnJvcl9tc2cgd2l0aCBkZXNjcmlwdGlvbiBvZiBpbmNvbXBhdGliaWxpdHkKK2Jvb2wgVmVyaWZ5U2V0TGF5b3V0Q29tcGF0aWJpbGl0eShjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIERlc2NyaXB0b3JTZXRMYXlvdXQgY29uc3QgKmxoX2RzX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbnN0ICpyaF9kc19sYXlvdXQsIHN0ZDo6c3RyaW5nICplcnJvcl9tc2cpOworYm9vbCBWYWxpZGF0ZURlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBwdXNoX2Rlc2NyaXB0b3JfZXh0LCBjb25zdCB1aW50MzJfdCBtYXhfcHVzaF9kZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGRlc2NyaXB0b3JfaW5kZXhpbmdfZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAqZGVzY3JpcHRvcl9pbmRleGluZ19mZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgKmlubGluZV91bmlmb3JtX2Jsb2NrX2ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUICppbmxpbmVfdW5pZm9ybV9ibG9ja19wcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VFeHRlbnNpb25zICpkZXZpY2VfZXh0ZW5zaW9ucyk7CisKK2NsYXNzIFNhbXBsZXJEZXNjcmlwdG9yIDogcHVibGljIERlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgU2FtcGxlckRlc2NyaXB0b3IoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrU2FtcGxlciAqKTsKKyAgICB2b2lkIFdyaXRlVXBkYXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqLCBjb25zdCB1aW50MzJfdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBDb3B5VXBkYXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBjb25zdCBEZXNjcmlwdG9yICopIG92ZXJyaWRlOworICAgIHZvaWQgVXBkYXRlRHJhd1N0YXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKiwgQ01EX0JVRkZFUl9TVEFURSAqKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgSXNJbW11dGFibGVTYW1wbGVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gaW1tdXRhYmxlXzsgfTsKKyAgICBWa1NhbXBsZXIgR2V0U2FtcGxlcigpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZXJfOyB9CisgICAgY29uc3QgU0FNUExFUl9TVEFURSAqR2V0U2FtcGxlclN0YXRlKCkgY29uc3QgeyByZXR1cm4gc2FtcGxlcl9zdGF0ZV8uZ2V0KCk7IH0KKyAgICBTQU1QTEVSX1NUQVRFICpHZXRTYW1wbGVyU3RhdGUoKSB7IHJldHVybiBzYW1wbGVyX3N0YXRlXy5nZXQoKTsgfQorCisgIHByaXZhdGU6CisgICAgVmtTYW1wbGVyIHNhbXBsZXJfOworICAgIGJvb2wgaW1tdXRhYmxlXzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U0FNUExFUl9TVEFURT4gc2FtcGxlcl9zdGF0ZV87Cit9OworCitjbGFzcyBJbWFnZVNhbXBsZXJEZXNjcmlwdG9yIDogcHVibGljIERlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgSW1hZ2VTYW1wbGVyRGVzY3JpcHRvcihWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgVmtTYW1wbGVyICopOworICAgIHZvaWQgV3JpdGVVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICosIGNvbnN0IHVpbnQzMl90KSBvdmVycmlkZTsKKyAgICB2b2lkIENvcHlVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IERlc2NyaXB0b3IgKikgb3ZlcnJpZGU7CisgICAgdm9pZCBVcGRhdGVEcmF3U3RhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqLCBDTURfQlVGRkVSX1NUQVRFICopIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBJc0ltbXV0YWJsZVNhbXBsZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBpbW11dGFibGVfOyB9OworICAgIFZrU2FtcGxlciBHZXRTYW1wbGVyKCkgY29uc3QgeyByZXR1cm4gc2FtcGxlcl87IH0KKyAgICBWa0ltYWdlVmlldyBHZXRJbWFnZVZpZXcoKSBjb25zdCB7IHJldHVybiBpbWFnZV92aWV3XzsgfQorICAgIGNvbnN0IElNQUdFX1ZJRVdfU1RBVEUgKkdldEltYWdlVmlld1N0YXRlKCkgY29uc3QgeyByZXR1cm4gaW1hZ2Vfdmlld19zdGF0ZV8uZ2V0KCk7IH0KKyAgICBJTUFHRV9WSUVXX1NUQVRFICpHZXRJbWFnZVZpZXdTdGF0ZSgpIHsgcmV0dXJuIGltYWdlX3ZpZXdfc3RhdGVfLmdldCgpOyB9CisgICAgVmtJbWFnZUxheW91dCBHZXRJbWFnZUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIGltYWdlX2xheW91dF87IH0KKyAgICBjb25zdCBTQU1QTEVSX1NUQVRFICpHZXRTYW1wbGVyU3RhdGUoKSBjb25zdCB7IHJldHVybiBzYW1wbGVyX3N0YXRlXy5nZXQoKTsgfQorICAgIFNBTVBMRVJfU1RBVEUgKkdldFNhbXBsZXJTdGF0ZSgpIHsgcmV0dXJuIHNhbXBsZXJfc3RhdGVfLmdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U0FNUExFUl9TVEFURT4gc2FtcGxlcl9zdGF0ZV87CisgICAgVmtTYW1wbGVyIHNhbXBsZXJfOworICAgIGJvb2wgaW1tdXRhYmxlXzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SU1BR0VfVklFV19TVEFURT4gaW1hZ2Vfdmlld19zdGF0ZV87CisgICAgVmtJbWFnZVZpZXcgaW1hZ2Vfdmlld187CisgICAgVmtJbWFnZUxheW91dCBpbWFnZV9sYXlvdXRfOworfTsKKworY2xhc3MgSW1hZ2VEZXNjcmlwdG9yIDogcHVibGljIERlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgSW1hZ2VEZXNjcmlwdG9yKGNvbnN0IFZrRGVzY3JpcHRvclR5cGUpOworICAgIHZvaWQgV3JpdGVVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICosIGNvbnN0IHVpbnQzMl90KSBvdmVycmlkZTsKKyAgICB2b2lkIENvcHlVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IERlc2NyaXB0b3IgKikgb3ZlcnJpZGU7CisgICAgdm9pZCBVcGRhdGVEcmF3U3RhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqLCBDTURfQlVGRkVSX1NUQVRFICopIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBJc1N0b3JhZ2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBzdG9yYWdlXzsgfQorICAgIFZrSW1hZ2VWaWV3IEdldEltYWdlVmlldygpIGNvbnN0IHsgcmV0dXJuIGltYWdlX3ZpZXdfOyB9CisgICAgY29uc3QgSU1BR0VfVklFV19TVEFURSAqR2V0SW1hZ2VWaWV3U3RhdGUoKSBjb25zdCB7IHJldHVybiBpbWFnZV92aWV3X3N0YXRlXy5nZXQoKTsgfQorICAgIElNQUdFX1ZJRVdfU1RBVEUgKkdldEltYWdlVmlld1N0YXRlKCkgeyByZXR1cm4gaW1hZ2Vfdmlld19zdGF0ZV8uZ2V0KCk7IH0KKyAgICBWa0ltYWdlTGF5b3V0IEdldEltYWdlTGF5b3V0KCkgY29uc3QgeyByZXR1cm4gaW1hZ2VfbGF5b3V0XzsgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBzdG9yYWdlXzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SU1BR0VfVklFV19TVEFURT4gaW1hZ2Vfdmlld19zdGF0ZV87CisgICAgVmtJbWFnZVZpZXcgaW1hZ2Vfdmlld187CisgICAgVmtJbWFnZUxheW91dCBpbWFnZV9sYXlvdXRfOworfTsKKworY2xhc3MgVGV4ZWxEZXNjcmlwdG9yIDogcHVibGljIERlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgVGV4ZWxEZXNjcmlwdG9yKGNvbnN0IFZrRGVzY3JpcHRvclR5cGUpOworICAgIHZvaWQgV3JpdGVVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICosIGNvbnN0IHVpbnQzMl90KSBvdmVycmlkZTsKKyAgICB2b2lkIENvcHlVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IERlc2NyaXB0b3IgKikgb3ZlcnJpZGU7CisgICAgdm9pZCBVcGRhdGVEcmF3U3RhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqLCBDTURfQlVGRkVSX1NUQVRFICopIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBJc1N0b3JhZ2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBzdG9yYWdlXzsgfQorICAgIFZrQnVmZmVyVmlldyBHZXRCdWZmZXJWaWV3KCkgY29uc3QgeyByZXR1cm4gYnVmZmVyX3ZpZXdfOyB9CisgICAgY29uc3QgQlVGRkVSX1ZJRVdfU1RBVEUgKkdldEJ1ZmZlclZpZXdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGJ1ZmZlcl92aWV3X3N0YXRlXy5nZXQoKTsgfQorICAgIEJVRkZFUl9WSUVXX1NUQVRFICpHZXRCdWZmZXJWaWV3U3RhdGUoKSB7IHJldHVybiBidWZmZXJfdmlld19zdGF0ZV8uZ2V0KCk7IH0KKworICBwcml2YXRlOgorICAgIFZrQnVmZmVyVmlldyBidWZmZXJfdmlld187CisgICAgYm9vbCBzdG9yYWdlXzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QlVGRkVSX1ZJRVdfU1RBVEU+IGJ1ZmZlcl92aWV3X3N0YXRlXzsKK307CisKK2NsYXNzIEJ1ZmZlckRlc2NyaXB0b3IgOiBwdWJsaWMgRGVzY3JpcHRvciB7CisgIHB1YmxpYzoKKyAgICBCdWZmZXJEZXNjcmlwdG9yKGNvbnN0IFZrRGVzY3JpcHRvclR5cGUpOworICAgIHZvaWQgV3JpdGVVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICosIGNvbnN0IHVpbnQzMl90KSBvdmVycmlkZTsKKyAgICB2b2lkIENvcHlVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IERlc2NyaXB0b3IgKikgb3ZlcnJpZGU7CisgICAgdm9pZCBVcGRhdGVEcmF3U3RhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqLCBDTURfQlVGRkVSX1NUQVRFICopIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBJc0R5bmFtaWMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBkeW5hbWljXzsgfQorICAgIHZpcnR1YWwgYm9vbCBJc1N0b3JhZ2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBzdG9yYWdlXzsgfQorICAgIFZrQnVmZmVyIEdldEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIGJ1ZmZlcl87IH0KKyAgICBjb25zdCBCVUZGRVJfU1RBVEUgKkdldEJ1ZmZlclN0YXRlKCkgY29uc3QgeyByZXR1cm4gYnVmZmVyX3N0YXRlXy5nZXQoKTsgfQorICAgIEJVRkZFUl9TVEFURSAqR2V0QnVmZmVyU3RhdGUoKSB7IHJldHVybiBidWZmZXJfc3RhdGVfLmdldCgpOyB9CisgICAgVmtEZXZpY2VTaXplIEdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG9mZnNldF87IH0KKyAgICBWa0RldmljZVNpemUgR2V0UmFuZ2UoKSBjb25zdCB7IHJldHVybiByYW5nZV87IH0KKworICBwcml2YXRlOgorICAgIGJvb2wgc3RvcmFnZV87CisgICAgYm9vbCBkeW5hbWljXzsKKyAgICBWa0J1ZmZlciBidWZmZXJfOworICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXRfOworICAgIFZrRGV2aWNlU2l6ZSByYW5nZV87CisgICAgc3RkOjpzaGFyZWRfcHRyPEJVRkZFUl9TVEFURT4gYnVmZmVyX3N0YXRlXzsKK307CisKK2NsYXNzIElubGluZVVuaWZvcm1EZXNjcmlwdG9yIDogcHVibGljIERlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgSW5saW5lVW5pZm9ybURlc2NyaXB0b3IoY29uc3QgVmtEZXNjcmlwdG9yVHlwZSkgeworICAgICAgICB1cGRhdGVkID0gZmFsc2U7CisgICAgICAgIGRlc2NyaXB0b3JfY2xhc3MgPSBJbmxpbmVVbmlmb3JtOworICAgIH0KKyAgICB2b2lkIFdyaXRlVXBkYXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqLCBjb25zdCB1aW50MzJfdCkgb3ZlcnJpZGUgeyB1cGRhdGVkID0gdHJ1ZTsgfQorICAgIHZvaWQgQ29weVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgRGVzY3JpcHRvciAqKSBvdmVycmlkZSB7IHVwZGF0ZWQgPSB0cnVlOyB9CisgICAgdm9pZCBVcGRhdGVEcmF3U3RhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqLCBDTURfQlVGRkVSX1NUQVRFICopIG92ZXJyaWRlIHt9Cit9OworCitjbGFzcyBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVEZXNjcmlwdG9yIDogcHVibGljIERlc2NyaXB0b3IgeworICBwdWJsaWM6CisgICAgQWNjZWxlcmF0aW9uU3RydWN0dXJlRGVzY3JpcHRvcihjb25zdCBWa0Rlc2NyaXB0b3JUeXBlKSB7CisgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgZGVzY3JpcHRvcl9jbGFzcyA9IEFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICB9CisgICAgdm9pZCBXcml0ZVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKiwgY29uc3QgdWludDMyX3QpIG92ZXJyaWRlIHsgdXBkYXRlZCA9IHRydWU7IH0KKyAgICB2b2lkIENvcHlVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIGNvbnN0IERlc2NyaXB0b3IgKikgb3ZlcnJpZGUgeyB1cGRhdGVkID0gdHJ1ZTsgfQorICAgIHZvaWQgVXBkYXRlRHJhd1N0YXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKiwgQ01EX0JVRkZFUl9TVEFURSAqKSBvdmVycmlkZSB7fQorfTsKKworLy8gU3RydWN0cyB0byBjb250YWluIGNvbW1vbiBlbGVtZW50cyB0aGF0IG5lZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4gVmFsaWRhdGUqIGFuZCBQZXJmb3JtKiBjYWxscyBiZWxvdworc3RydWN0IEFsbG9jYXRlRGVzY3JpcHRvclNldHNEYXRhIHsKKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IHJlcXVpcmVkX2Rlc2NyaXB0b3JzX2J5X3R5cGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPERlc2NyaXB0b3JTZXRMYXlvdXQgY29uc3Q+PiBsYXlvdXRfbm9kZXM7CisgICAgQWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEodWludDMyX3QpOworfTsKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGRlc2NyaXB0b3Igc2V0IGZ1bmN0aW9ucyB0aGF0IGNyb3NzIG11bHRpcGxlIHNldHMKKy8vICJWYWxpZGF0ZSIgd2lsbCBtYWtlIHN1cmUgYW4gdXBkYXRlIGlzIG9rIHdpdGhvdXQgYWN0dWFsbHkgcGVyZm9ybWluZyBpdAorYm9vbCBWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRzKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICosIGNvbnN0IENvcmVDaGVja3MgKiwgdWludDMyX3QsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICosIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQgKiwgY29uc3QgY2hhciAqZnVuY19uYW1lKTsKKy8vICJQZXJmb3JtIiBkb2VzIHRoZSB1cGRhdGUgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldHMoKSBoYXMgcGFzc2VkIGZvciB0aGUgZ2l2ZW4gdXBkYXRlCit2b2lkIFBlcmZvcm1VcGRhdGVEZXNjcmlwdG9yU2V0cyhWYWxpZGF0aW9uU3RhdGVUcmFja2VyICosIHVpbnQzMl90LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQgKik7CisKKy8vIENvcmUgVmFsaWRhdGlvbiBzcGVjaWZpYyB2YWxpZGF0aW9uIGNoZWNrcyB1c2luZyBEZXNjcmlwdG9yU2V0IGFuZCBEZXNjcmlwdG9yU2V0TGF5b3V0QWNjZXNzb3JzCisvLyBUT0RPOiBtaWdyYXRlIG91dCBvZiBkZXNjcmlwdG9yX3NldC5jcHAvaAorLy8gRm9yIGEgcGFydGljdWxhciBiaW5kaW5nIHN0YXJ0aW5nIGF0IG9mZnNldCBhbmQgaGF2aW5nIHVwZGF0ZV9jb3VudCBkZXNjcmlwdG9ycworLy8gdXBkYXRlZCwgdmVyaWZ5IHRoYXQgZm9yIGFueSBiaW5kaW5nIGJvdW5kYXJpZXMgY3Jvc3NlZCwgdGhlIHVwZGF0ZSBpcyBjb25zaXN0ZW50Citib29sIFZlcmlmeVVwZGF0ZUNvbnNpc3RlbmN5KERlc2NyaXB0b3JTZXRMYXlvdXQ6OkNvbnN0QmluZGluZ0l0ZXJhdG9yIGN1cnJlbnRfYmluZGluZywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB1cGRhdGVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IFZrRGVzY3JpcHRvclNldCBzZXQsIHN0ZDo6c3RyaW5nICplcnJvcl9tc2cpOworCisvLyBWYWxpZGF0ZSBidWZmZXIgZGVzY3JpcHRvciB1cGRhdGUgaW5mbworYm9vbCBWYWxpZGF0ZUJ1ZmZlclVzYWdlKEJVRkZFUl9TVEFURSBjb25zdCAqYnVmZmVyX25vZGUsIFZrRGVzY3JpcHRvclR5cGUgdHlwZSwgc3RkOjpzdHJpbmcgKmVycm9yX2NvZGUsIHN0ZDo6c3RyaW5nICplcnJvcl9tc2cpOworCisvLyBIZWxwZXIgY2xhc3MgdG8gZW5jYXBzdWxhdGUgdGhlIGRlc2NyaXB0b3IgdXBkYXRlIHRlbXBsYXRlIGRlY29kaW5nIGxvZ2ljCitzdHJ1Y3QgRGVjb2RlZFRlbXBsYXRlVXBkYXRlIHsKKyAgICBzdGQ6OnZlY3RvcjxWa1dyaXRlRGVzY3JpcHRvclNldD4gZGVzY193cml0ZXM7CisgICAgc3RkOjp2ZWN0b3I8VmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ+IGlubGluZV9pbmZvczsKKyAgICBEZWNvZGVkVGVtcGxhdGVVcGRhdGUoY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2aWNlX2RhdGEsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBURU1QTEFURV9TVEFURSAqdGVtcGxhdGVfc3RhdGUsIGNvbnN0IHZvaWQgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgcHVzaF9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRSk7Cit9OworCisvKgorICogRGVzY3JpcHRvclNldCBjbGFzcworICoKKyAqIE92ZXJ2aWV3IC0gVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIFZ1bGthbiBWa0Rlc2NyaXB0b3JTZXQgZGF0YSAoc2V0KS4KKyAqICAgQSBzZXQgaGFzIGFuIHVuZGVybHlpbmcgbGF5b3V0IHdoaWNoIGRlZmluZXMgdGhlIGJpbmRpbmdzIGluIHRoZSBzZXQgYW5kIHRoZQorICogICB0eXBlcyBhbmQgbnVtYmVycyBvZiBkZXNjcmlwdG9ycyBpbiBlYWNoIGRlc2NyaXB0b3Igc2xvdC4gTW9zdCBvZiB0aGUgbGF5b3V0CisgKiAgIGludGVyZmFjZXMgYXJlIGV4cG9zZWQgdGhyb3VnaCBpZGVudGljYWxseS1uYW1lZCBmdW5jdGlvbnMgaW4gdGhlIHNldCBjbGFzcy4KKyAqICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbW1lbnQgYWJvdmUgZm9yIGEgZGVzY3JpcHRpb24gb2YKKyAqICAgaW5kZXgsIGJpbmRpbmcsIGFuZCBnbG9iYWwgaW5kZXguCisgKgorICogQXQgY29uc3RydWN0aW9uIGEgdmVjdG9yIG9mIERlc2NyaXB0b3IqIGlzIGNyZWF0ZWQgd2l0aCB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogICBsYXlvdXQuIFRoZSBwcmltYXJ5IG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhlIGRlc2NyaXB0b3JzIGlzIHRvIHVwZGF0ZSB0aGVtCisgKiAgIHZpYSB3cml0ZSBvciBjb3B5IHVwZGF0ZXMsIGFuZCB2YWxpZGF0ZSB0aGF0IHRoZSB1cGRhdGUgY29udGVudHMgYXJlIGNvcnJlY3QuCisgKiAgIEluIG9yZGVyIHRvIHZhbGlkYXRlIHVwZGF0ZSBjb250ZW50cywgdGhlIERlc2NyaXB0b3JTZXQgc3RvcmVzIGEgYnVuY2ggb2YgcHRycworICogICB0byBkYXRhIG1hcHMgd2hlcmUgdmFyaW91cyBWdWxrYW4gb2JqZWN0cyBjYW4gYmUgbG9va2VkIHVwLiBUaGUgbWFuYWdlbWVudCBvZgorICogICB0aG9zZSBtYXBzIGlzIHBlcmZvcm1lZCBleHRlcm5hbGx5LiBUaGUgc2V0IGNsYXNzIHJlbGllcyBvbiB0aGVpciBjb250ZW50cyB0bworICogICBiZSBjb3JyZWN0IGF0IHRoZSB0aW1lIG9mIHVwZGF0ZS4KKyAqLworY2xhc3MgRGVzY3JpcHRvclNldCA6IHB1YmxpYyBCQVNFX05PREUgeworICBwdWJsaWM6CisgICAgdXNpbmcgU3RhdGVUcmFja2VyID0gVmFsaWRhdGlvblN0YXRlVHJhY2tlcjsKKyAgICBEZXNjcmlwdG9yU2V0KGNvbnN0IFZrRGVzY3JpcHRvclNldCwgREVTQ1JJUFRPUl9QT09MX1NUQVRFICosIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbnN0PiAmLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyaWFibGVfY291bnQsIFN0YXRlVHJhY2tlciAqc3RhdGVfZGF0YSwgY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhKTsKKyAgICB+RGVzY3JpcHRvclNldCgpOworICAgIC8vIEEgbnVtYmVyIG9mIGNvbW1vbiBHZXQqIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBkYXRhIGJhc2VkIG9uIGxheW91dCBmcm9tIHdoaWNoIHRoaXMgc2V0IHdhcyBjcmVhdGVkCisgICAgdWludDMyX3QgR2V0VG90YWxEZXNjcmlwdG9yQ291bnQoKSBjb25zdCB7IHJldHVybiBwX2xheW91dF8tPkdldFRvdGFsRGVzY3JpcHRvckNvdW50KCk7IH07CisgICAgdWludDMyX3QgR2V0RHluYW1pY0Rlc2NyaXB0b3JDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHBfbGF5b3V0Xy0+R2V0RHluYW1pY0Rlc2NyaXB0b3JDb3VudCgpOyB9OworICAgIHVpbnQzMl90IEdldEJpbmRpbmdDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHBfbGF5b3V0Xy0+R2V0QmluZGluZ0NvdW50KCk7IH07CisgICAgVmtEZXNjcmlwdG9yVHlwZSBHZXRUeXBlRnJvbUluZGV4KGNvbnN0IHVpbnQzMl90IGluZGV4KSBjb25zdCB7IHJldHVybiBwX2xheW91dF8tPkdldFR5cGVGcm9tSW5kZXgoaW5kZXgpOyB9OworICAgIFZrRGVzY3JpcHRvclR5cGUgR2V0VHlwZUZyb21CaW5kaW5nKGNvbnN0IHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsgcmV0dXJuIHBfbGF5b3V0Xy0+R2V0VHlwZUZyb21CaW5kaW5nKGJpbmRpbmcpOyB9OworICAgIHVpbnQzMl90IEdldERlc2NyaXB0b3JDb3VudEZyb21JbmRleChjb25zdCB1aW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gcF9sYXlvdXRfLT5HZXREZXNjcmlwdG9yQ291bnRGcm9tSW5kZXgoaW5kZXgpOyB9OworICAgIHVpbnQzMl90IEdldERlc2NyaXB0b3JDb3VudEZyb21CaW5kaW5nKGNvbnN0IHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHBfbGF5b3V0Xy0+R2V0RGVzY3JpcHRvckNvdW50RnJvbUJpbmRpbmcoYmluZGluZyk7CisgICAgfTsKKyAgICAvLyBSZXR1cm4gaW5kZXggaW50byBkeW5hbWljIG9mZnNldCBhcnJheSBmb3IgZ2l2ZW4gYmluZGluZworICAgIGludDMyX3QgR2V0RHluYW1pY09mZnNldEluZGV4RnJvbUJpbmRpbmcodWludDMyX3QgYmluZGluZykgY29uc3QgeworICAgICAgICByZXR1cm4gcF9sYXlvdXRfLT5HZXREeW5hbWljT2Zmc2V0SW5kZXhGcm9tQmluZGluZyhiaW5kaW5nKTsKKyAgICB9CisgICAgLy8gUmV0dXJuIHRydWUgaWYgZ2l2ZW4gYmluZGluZyBpcyBwcmVzZW50IGluIHRoaXMgc2V0CisgICAgYm9vbCBIYXNCaW5kaW5nKGNvbnN0IHVpbnQzMl90IGJpbmRpbmcpIGNvbnN0IHsgcmV0dXJuIHBfbGF5b3V0Xy0+SGFzQmluZGluZyhiaW5kaW5nKTsgfTsKKworICAgIHN0ZDo6c3RyaW5nIFN0cmluZ2lmeVNldEFuZExheW91dCgpIGNvbnN0OworCisgICAgLy8gUGVyZm9ybSBhIHB1c2ggdXBkYXRlIHdob3NlIGNvbnRlbnRzIHdlcmUganVzdCB2YWxpZGF0ZWQgdXNpbmcgVmFsaWRhdGVQdXNoRGVzY3JpcHRvcnNVcGRhdGUKKyAgICB2b2lkIFBlcmZvcm1QdXNoRGVzY3JpcHRvcnNVcGRhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2X2RhdGEsIHVpbnQzMl90IHdyaXRlX2NvdW50LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqcF93ZHMpOworICAgIC8vIFBlcmZvcm0gYSBXcml0ZVVwZGF0ZSB3aG9zZSBjb250ZW50cyB3ZXJlIGp1c3QgdmFsaWRhdGVkIHVzaW5nIFZhbGlkYXRlV3JpdGVVcGRhdGUKKyAgICB2b2lkIFBlcmZvcm1Xcml0ZVVwZGF0ZShWYWxpZGF0aW9uU3RhdGVUcmFja2VyICpkZXZfZGF0YSwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKik7CisgICAgLy8gUGVyZm9ybSBhIENvcHlVcGRhdGUgd2hvc2UgY29udGVudHMgd2VyZSBqdXN0IHZhbGlkYXRlZCB1c2luZyBWYWxpZGF0ZUNvcHlVcGRhdGUKKyAgICB2b2lkIFBlcmZvcm1Db3B5VXBkYXRlKFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldl9kYXRhLCBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0ICosIGNvbnN0IERlc2NyaXB0b3JTZXQgKik7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RGVzY3JpcHRvclNldExheW91dCBjb25zdD4gJkdldExheW91dCgpIGNvbnN0IHsgcmV0dXJuIHBfbGF5b3V0XzsgfTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgR2V0RGVzY3JpcHRvclNldExheW91dCgpIGNvbnN0IHsgcmV0dXJuIHBfbGF5b3V0Xy0+R2V0RGVzY3JpcHRvclNldExheW91dCgpOyB9CisgICAgVmtEZXNjcmlwdG9yU2V0IEdldFNldCgpIGNvbnN0IHsgcmV0dXJuIHNldF87IH07CisgICAgLy8gQmluZCBnaXZlbiBjbWRfYnVmZmVyIHRvIHRoaXMgZGVzY3JpcHRvciBzZXQgYW5kCisgICAgLy8gdXBkYXRlIENCIGltYWdlIGxheW91dCBtYXAgd2l0aCBpbWFnZS9pbWFnZXNhbXBsZXIgZGVzY3JpcHRvciBpbWFnZSBsYXlvdXRzCisgICAgdm9pZCBVcGRhdGVEcmF3U3RhdGUoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqLCBDTURfQlVGRkVSX1NUQVRFICosIGNvbnN0IFBJUEVMSU5FX1NUQVRFICosCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dWludDMyX3QsIGRlc2NyaXB0b3JfcmVxPiAmKTsKKworICAgIC8vIFRyYWNrIHdvcmsgdGhhdCBoYXMgYmVlbiBib3VuZCBvciB2YWxpZGF0ZWQgdG8gYXZvaWQgZHVwbGljYXRlIHdvcmssIGltcG9ydGFudCB3aGVuIGxhcmdlIGRlc2NyaXB0b3IgYXJyYXlzCisgICAgLy8gYXJlIHByZXNlbnQKKyAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gVHJhY2tlZEJpbmRpbmdzOworICAgIHN0YXRpYyB2b2lkIEZpbHRlck9uZUJpbmRpbmdSZXEoY29uc3QgQmluZGluZ1JlcU1hcDo6dmFsdWVfdHlwZSAmYmluZGluZ19yZXFfcGFpciwgQmluZGluZ1JlcU1hcCAqb3V0X3JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrZWRCaW5kaW5ncyAmc2V0LCB1aW50MzJfdCBsaW1pdCk7CisgICAgdm9pZCBGaWx0ZXJCaW5kaW5nUmVxcyhjb25zdCBDTURfQlVGRkVSX1NUQVRFICYsIGNvbnN0IFBJUEVMSU5FX1NUQVRFICYsIGNvbnN0IEJpbmRpbmdSZXFNYXAgJmluX3JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdSZXFNYXAgKm91dF9yZXEpIGNvbnN0OworICAgIHZvaWQgVXBkYXRlVmFsaWRhdGlvbkNhY2hlKGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgJmNiX3N0YXRlLCBjb25zdCBQSVBFTElORV9TVEFURSAmcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmluZGluZ1JlcU1hcCAmdXBkYXRlZF9iaW5kaW5ncyk7CisgICAgdm9pZCBDbGVhckNhY2hlZER5bmFtaWNEZXNjcmlwdG9yVmFsaWRhdGlvbihDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSkgeworICAgICAgICBjYWNoZWRfdmFsaWRhdGlvbl9bY2Jfc3RhdGVdLmR5bmFtaWNfYnVmZmVycy5jbGVhcigpOworICAgIH0KKyAgICB2b2lkIENsZWFyQ2FjaGVkVmFsaWRhdGlvbihDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSkgeyBjYWNoZWRfdmFsaWRhdGlvbl8uZXJhc2UoY2Jfc3RhdGUpOyB9CisgICAgVmtTYW1wbGVyIGNvbnN0ICpHZXRJbW11dGFibGVTYW1wbGVyUHRyRnJvbUJpbmRpbmcoY29uc3QgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHBfbGF5b3V0Xy0+R2V0SW1tdXRhYmxlU2FtcGxlclB0ckZyb21CaW5kaW5nKGluZGV4KTsKKyAgICB9OworICAgIC8vIEZvciBhIHBhcnRpY3VsYXIgYmluZGluZywgZ2V0IHRoZSBnbG9iYWwgaW5kZXgKKyAgICBjb25zdCBJbmRleFJhbmdlIEdldEdsb2JhbEluZGV4UmFuZ2VGcm9tQmluZGluZyhjb25zdCB1aW50MzJfdCBiaW5kaW5nLCBib29sIGFjdHVhbF9sZW5ndGggPSBmYWxzZSkgY29uc3QgeworICAgICAgICBpZiAoYWN0dWFsX2xlbmd0aCAmJiBiaW5kaW5nID09IHBfbGF5b3V0Xy0+R2V0TWF4QmluZGluZygpICYmIElzVmFyaWFibGVEZXNjcmlwdG9yQ291bnQoYmluZGluZykpIHsKKyAgICAgICAgICAgIEluZGV4UmFuZ2UgcmFuZ2UgPSBwX2xheW91dF8tPkdldEdsb2JhbEluZGV4UmFuZ2VGcm9tQmluZGluZyhiaW5kaW5nKTsKKyAgICAgICAgICAgIGF1dG8gZGlmZiA9IEdldERlc2NyaXB0b3JDb3VudEZyb21CaW5kaW5nKGJpbmRpbmcpIC0gR2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnQoKTsKKyAgICAgICAgICAgIHJhbmdlLmVuZCAtPSBkaWZmOworICAgICAgICAgICAgcmV0dXJuIHJhbmdlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwX2xheW91dF8tPkdldEdsb2JhbEluZGV4UmFuZ2VGcm9tQmluZGluZyhiaW5kaW5nKTsKKyAgICB9OworICAgIC8vIFJldHVybiB0cnVlIGlmIGFueSBwYXJ0IG9mIHNldCBoYXMgZXZlciBiZWVuIHVwZGF0ZWQKKyAgICBib29sIElzVXBkYXRlZCgpIGNvbnN0IHsgcmV0dXJuIHNvbWVfdXBkYXRlXzsgfTsKKyAgICBib29sIElzUHVzaERlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBwX2xheW91dF8tPklzUHVzaERlc2NyaXB0b3IoKTsgfTsKKyAgICBib29sIElzVmFyaWFibGVEZXNjcmlwdG9yQ291bnQodWludDMyX3QgYmluZGluZykgY29uc3QgeyByZXR1cm4gcF9sYXlvdXRfLT5Jc1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50KGJpbmRpbmcpOyB9CisgICAgYm9vbCBJc1VwZGF0ZUFmdGVyQmluZCh1aW50MzJfdCBiaW5kaW5nKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhIShwX2xheW91dF8tPkdldERlc2NyaXB0b3JCaW5kaW5nRmxhZ3NGcm9tQmluZGluZyhiaW5kaW5nKSAmIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUKTsKKyAgICB9CisgICAgdWludDMyX3QgR2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnQoKSBjb25zdCB7IHJldHVybiB2YXJpYWJsZV9jb3VudF87IH0KKyAgICBERVNDUklQVE9SX1BPT0xfU1RBVEUgKkdldFBvb2xTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHBvb2xfc3RhdGVfOyB9CisgICAgY29uc3QgRGVzY3JpcHRvciAqR2V0RGVzY3JpcHRvckZyb21HbG9iYWxJbmRleChjb25zdCB1aW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gZGVzY3JpcHRvcnNfW2luZGV4XS5nZXQoKTsgfQorICAgIHVpbnQ2NF90IEdldENoYW5nZUNvdW50KCkgY29uc3QgeyByZXR1cm4gY2hhbmdlX2NvdW50XzsgfQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldD4gJkdldFdyaXRlcygpIGNvbnN0IHsgcmV0dXJuIHB1c2hfZGVzY3JpcHRvcl9zZXRfd3JpdGVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICAvLyBQcml2YXRlIGhlbHBlciB0byBzZXQgYWxsIGJvdW5kIGNtZCBidWZmZXJzIHRvIElOVkFMSUQgc3RhdGUKKyAgICB2b2lkIEludmFsaWRhdGVCb3VuZENtZEJ1ZmZlcnMoVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqc3RhdGVfZGF0YSk7CisgICAgYm9vbCBzb21lX3VwZGF0ZV87ICAvLyBoYXMgYW55IHBhcnQgb2YgdGhlIHNldCBldmVyIGJlZW4gdXBkYXRlZD8KKyAgICBWa0Rlc2NyaXB0b3JTZXQgc2V0XzsKKyAgICBERVNDUklQVE9SX1BPT0xfU1RBVEUgKnBvb2xfc3RhdGVfOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxEZXNjcmlwdG9yU2V0TGF5b3V0IGNvbnN0PiBwX2xheW91dF87CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlc2NyaXB0b3I+PiBkZXNjcmlwdG9yc187CisgICAgY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhXzsKKyAgICB1aW50MzJfdCB2YXJpYWJsZV9jb3VudF87CisgICAgdWludDY0X3QgY2hhbmdlX2NvdW50XzsKKworICAgIC8vIElmIHRoaXMgZGVzY3JpcHRvciBzZXQgaXMgYSBwdXNoIGRlc2NyaXB0b3Igc2V0LCB0aGUgZGVzY3JpcHRvcgorICAgIC8vIHNldCB3cml0ZXMgdGhhdCB3ZXJlIGxhc3QgcHVzaGVkLgorICAgIHN0ZDo6dmVjdG9yPHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQ+IHB1c2hfZGVzY3JpcHRvcl9zZXRfd3JpdGVzOworCisgICAgLy8gQ2FjaGVkIGJpbmRpbmcgYW5kIHZhbGlkYXRpb24gc3VwcG9ydDoKKyAgICAvLworICAgIC8vIEZvciB0aGUgbGlmZXNwYW4gb2YgYSBnaXZlbiBjb21tYW5kIGJ1ZmZlciByZWNvcmRpbmcsIGRvIGxhenkgZXZhbHVhdGlvbiwgY2FjaGluZywgYW5kIGRpcnR5aW5nIG9mCisgICAgLy8gZXhwZW5zaXZlIHZhbGlkYXRpb24gb3BlcmF0aW9uICh0eXBpY2FsbHkgcGVyLWRyYXcpCisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8Q01EX0JVRkZFUl9TVEFURSAqLCBUcmFja2VkQmluZGluZ3M+IFRyYWNrZWRCaW5kaW5nTWFwOworICAgIC8vIFRyYWNrIHRoZSB2YWxpZGF0aW9uIGNhY2hpbmcgb2YgYmluZGluZ3MgdnMuIHRoZSBjb21tYW5kIGJ1ZmZlciBhbmQgZHJhdyBzdGF0ZQorICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBDTURfQlVGRkVSX1NUQVRFOjpJbWFnZUxheW91dFVwZGF0ZUNvdW50PiBWZXJzaW9uZWRCaW5kaW5nczsKKyAgICBzdHJ1Y3QgQ2FjaGVkVmFsaWRhdGlvbiB7CisgICAgICAgIFRyYWNrZWRCaW5kaW5ncyBjb21tYW5kX2JpbmRpbmdfYW5kX3VzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXJzaXN0ZW50IGZvciB0aGUgbGlmZSBvZiB0aGUgcmVjb3JkaW5nCisgICAgICAgIFRyYWNrZWRCaW5kaW5ncyBub25fZHluYW1pY19idWZmZXJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXJzaXN0ZW50IGZvciB0aGUgbGlmZSBvZiB0aGUgcmVjb3JkaW5nCisgICAgICAgIFRyYWNrZWRCaW5kaW5ncyBkeW5hbWljX2J1ZmZlcnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXJ0aWVkIChmbHVzaGVkKSBlYWNoIEJpbmREZXNjcmlwdG9yU2V0CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxjb25zdCBQSVBFTElORV9TVEFURSAqLCBWZXJzaW9uZWRCaW5kaW5ncz4gaW1hZ2Vfc2FtcGxlcnM7ICAvLyBUZXN0ZWQgdnMuIGNoYW5nZXMgdG8gQ0IncyBJbWFnZUxheW91dAorICAgIH07CisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3QgQ01EX0JVRkZFUl9TVEFURSAqLCBDYWNoZWRWYWxpZGF0aW9uPiBDYWNoZWRWYWxpZGF0aW9uTWFwOworICAgIC8vIEltYWdlIGFuZCBJbWFnZVZpZXcgYmluZGluZ3MgYXJlIHZhbGlkYXRlZCBwZXIgcGlwZWxpbmUgYW5kIG5vdCBpbnZhbGlkYXRlIGJ5IHJlcGVhdGVkIGJpbmRpbmcKKyAgICBDYWNoZWRWYWxpZGF0aW9uTWFwIGNhY2hlZF92YWxpZGF0aW9uXzsKK307CisvLyBGb3IgdGhlICJiaW5kbGVzcyIgc3R5bGUgcmVzb3VyY2UgdXNhZ2Ugd2l0aCBtYW55IGRlc2NyaXB0b3JzLCBuZWVkIHRvIG9wdGltaXplIGJpbmRpbmcgYW5kIHZhbGlkYXRpb24KK2NsYXNzIFByZWZpbHRlckJpbmRSZXF1ZXN0TWFwIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWFueURlc2NyaXB0b3JzXyA9IDY0OyAgLy8gVE9ETyBiYXNlIHRoaXMgbnVtYmVyIG9uIG1lYXN1cmVkIGRhdGEKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmluZGluZ1JlcU1hcD4gZmlsdGVyZWRfbWFwXzsKKyAgICBjb25zdCBCaW5kaW5nUmVxTWFwICZvcmlnX21hcF87CisgICAgY29uc3QgRGVzY3JpcHRvclNldCAmZGVzY3JpcHRvcl9zZXRfOworCisgICAgUHJlZmlsdGVyQmluZFJlcXVlc3RNYXAoY29uc3QgRGVzY3JpcHRvclNldCAmZHMsIGNvbnN0IEJpbmRpbmdSZXFNYXAgJmluX21hcCkKKyAgICAgICAgOiBmaWx0ZXJlZF9tYXBfKCksIG9yaWdfbWFwXyhpbl9tYXApLCBkZXNjcmlwdG9yX3NldF8oZHMpIHt9CisgICAgY29uc3QgQmluZGluZ1JlcU1hcCAmRmlsdGVyZWRNYXAoY29uc3QgQ01EX0JVRkZFUl9TVEFURSAmY2Jfc3RhdGUsIGNvbnN0IFBJUEVMSU5FX1NUQVRFICYpOworICAgIGJvb2wgSXNNYW55RGVzY3JpcHRvcnMoKSBjb25zdCB7IHJldHVybiBkZXNjcmlwdG9yX3NldF8uR2V0VG90YWxEZXNjcmlwdG9yQ291bnQoKSA+IGtNYW55RGVzY3JpcHRvcnNfOyB9Cit9OworfSAgLy8gbmFtZXNwYWNlIGN2ZGVzY3JpcHRvcnNldAorI2VuZGlmICAvLyBDT1JFX1ZBTElEQVRJT05fREVTQ1JJUFRPUl9TRVRTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZHJhd2Rpc3BhdGNoLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9kcmF3ZGlzcGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjZiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZHJhd2Rpc3BhdGNoLmNwcApAQCAtMCwwICsxLDM0NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNub3J0aHJvcEBnb29nbGUuY29tPgorICogQXV0aG9yOiBNaWNoYWVsIExlbnRpbmUgPG1sZW50aW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IElhbiBFbGxpb3R0IDxpYW5lbGxpb3R0QGdvb2dsZS5jb20+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogRHVzdGluIEdyYXZlcyA8ZHVzdGluQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEplcmVteSBIYXllcyA8amVyZW15QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogS2FybCBTY2h1bHR6IDxrYXJsQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1hcmsgWW91bmcgPG1hcmt5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgU2NodWNoYXJkdCA8bWlrZXNAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWlrZSBXZWlibGVuIDxtaWtld0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogSm9obiBadWxhdWYgPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogU2hhbm5vbiBNY1BoZXJzb24gPHNoYW5ub25AbHVuYXJnLmNvbT4KKyAqLworCisvLyBBbGxvdyB1c2Ugb2YgU1RMIG1pbiBhbmQgbWF4IGZ1bmN0aW9ucyBpbiBXaW5kb3dzCisjZGVmaW5lIE5PTUlOTUFYCisKKyNpbmNsdWRlICJjaGFzc2lzLmgiCisjaW5jbHVkZSAiY29yZV92YWxpZGF0aW9uLmgiCisKKy8vIEdlbmVyaWMgZnVuY3Rpb24gdG8gaGFuZGxlIHZhbGlkYXRpb24gZm9yIGFsbCBDbWREcmF3KiB0eXBlIGZ1bmN0aW9ucworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNtZERyYXdUeXBlKFZrQ29tbWFuZEJ1ZmZlciBjbWRfYnVmZmVyLCBib29sIGluZGV4ZWQsIFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCwgQ01EX1RZUEUgY21kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY2FsbGVyLCBWa1F1ZXVlRmxhZ3MgcXVldWVfZmxhZ3MsIGNvbnN0IGNoYXIgKnF1ZXVlX2ZsYWdfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZW5kZXJwYXNzX21zZ19jb2RlLCBjb25zdCBjaGFyICpwaXBlYm91bmRfbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZHluYW1pY19zdGF0ZV9tc2dfY29kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjbWRfYnVmZmVyKTsKKyAgICBpZiAoY2Jfc3RhdGUpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZFF1ZXVlRmxhZ3MoY2Jfc3RhdGUsIGNhbGxlciwgcXVldWVfZmxhZ3MsIHF1ZXVlX2ZsYWdfY29kZSk7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDbWQoY2Jfc3RhdGUsIGNtZF90eXBlLCBjYWxsZXIpOworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBWYWxpZGF0ZUNtZEJ1ZkRyYXdTdGF0ZShjYl9zdGF0ZSwgY21kX3R5cGUsIGluZGV4ZWQsIGJpbmRfcG9pbnQsIGNhbGxlciwgcGlwZWJvdW5kX21zZ19jb2RlLCBkeW5hbWljX3N0YXRlX21zZ19jb2RlKTsKKyAgICAgICAgc2tpcCB8PSAoVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyA9PSBiaW5kX3BvaW50KSA/IE91dHNpZGVSZW5kZXJQYXNzKGNiX3N0YXRlLCBjYWxsZXIsIHJlbmRlcnBhc3NfbXNnX2NvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbnNpZGVSZW5kZXJQYXNzKGNiX3N0YXRlLCBjYWxsZXIsIHJlbmRlcnBhc3NfbXNnX2NvZGUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdFZlcnRleCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZUNtZERyYXdUeXBlKGNvbW1hbmRCdWZmZXIsIGZhbHNlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBDTURfRFJBVywgInZrQ21kRHJhdygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19RVUVVRV9HUkFQSElDU19CSVQsICJWVUlELXZrQ21kRHJhdy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVlVJRC12a0NtZERyYXctcmVuZGVycGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDAiLCAiVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci0wMjcwMSIpOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kRHJhd1R5cGUoY29tbWFuZEJ1ZmZlciwgdHJ1ZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgQ01EX0RSQVdJTkRFWEVELCAidmtDbWREcmF3SW5kZXhlZCgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1yZW5kZXJwYXNzIiwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci0wMjcwMSIpOworICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAoIXNraXAgJiYgKGNiX3N0YXRlLT5zdGF0dXMgJiBDQlNUQVRVU19JTkRFWF9CVUZGRVJfQk9VTkQpKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBpbmRleF9zaXplID0gMDsKKyAgICAgICAgY29uc3QgYXV0byAmaW5kZXhfYnVmZmVyX2JpbmRpbmcgPSBjYl9zdGF0ZS0+aW5kZXhfYnVmZmVyX2JpbmRpbmc7CisgICAgICAgIGlmIChpbmRleF9idWZmZXJfYmluZGluZy5pbmRleF90eXBlID09IFZLX0lOREVYX1RZUEVfVUlOVDE2KSB7CisgICAgICAgICAgICBpbmRleF9zaXplID0gMjsKKyAgICAgICAgfSBlbHNlIGlmIChpbmRleF9idWZmZXJfYmluZGluZy5pbmRleF90eXBlID09IFZLX0lOREVYX1RZUEVfVUlOVDMyKSB7CisgICAgICAgICAgICBpbmRleF9zaXplID0gNDsKKyAgICAgICAgfSBlbHNlIGlmIChpbmRleF9idWZmZXJfYmluZGluZy5pbmRleF90eXBlID09IFZLX0lOREVYX1RZUEVfVUlOVDhfRVhUKSB7CisgICAgICAgICAgICBpbmRleF9zaXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBWa0RldmljZVNpemUgZW5kX29mZnNldCA9IChpbmRleF9zaXplICogKChWa0RldmljZVNpemUpZmlyc3RJbmRleCArIGluZGV4Q291bnQpKSArIGluZGV4X2J1ZmZlcl9iaW5kaW5nLm9mZnNldDsKKyAgICAgICAgaWYgKGVuZF9vZmZzZXQgPiBpbmRleF9idWZmZXJfYmluZGluZy5zaXplKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChpbmRleF9idWZmZXJfYmluZGluZy5idWZmZXIpLCAiVlVJRC12a0NtZERyYXdJbmRleGVkLWluZGV4U2l6ZS0wMDQ2MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRHJhd0luZGV4ZWQoKSBpbmRleCBzaXplICglZCkgKiAoZmlyc3RJbmRleCAoJWQpICsgaW5kZXhDb3VudCAoJWQpKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIisgYmluZGluZyBvZmZzZXQgKCUiIFBSSXVMRUFTVDY0ICIpID0gYW4gZW5kaW5nIG9mZnNldCBvZiAlIiBQUkl1TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggaXMgZ3JlYXRlciB0aGFuIHRoZSBpbmRleCBidWZmZXIgc2l6ZSAoJSIgUFJJdUxFQVNUNjQgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleF9zaXplLCBmaXJzdEluZGV4LCBpbmRleENvdW50LCBpbmRleF9idWZmZXJfYmluZGluZy5vZmZzZXQsIGVuZF9vZmZzZXQsIGluZGV4X2J1ZmZlcl9iaW5kaW5nLnNpemUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kRHJhd1R5cGUoY29tbWFuZEJ1ZmZlciwgZmFsc2UsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIENNRF9EUkFXSU5ESVJFQ1QsICJ2a0NtZERyYXdJbmRpcmVjdCgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LXJlbmRlcnBhc3MiLCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MDEiKTsKKyAgICBjb25zdCBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0J1ZmZlcihidWZmZXJfc3RhdGUsICJ2a0NtZERyYXdJbmRpcmVjdCgpIiwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtYnVmZmVyLTAyNzA4Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3MoYnVmZmVyX3N0YXRlLCBWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCwgdHJ1ZSwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtYnVmZmVyLTAyNzA5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREcmF3SW5kaXJlY3QoKSIsICJWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCIpOworICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZERyYXdTdHJpZGVXaXRoU3RydWN0KGNvbW1hbmRCdWZmZXIsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWRyYXdDb3VudC0wMDQ3NiIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0RyYXdJbmRpcmVjdENvbW1hbmQiLCBzaXplb2YoVmtEcmF3SW5kaXJlY3RDb21tYW5kKSk7CisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIFZhbGlkYXRlQ21kRHJhd1N0cmlkZVdpdGhCdWZmZXIoY29tbWFuZEJ1ZmZlciwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZHJhd0NvdW50LTAwNDg4Iiwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtEcmF3SW5kaXJlY3RDb21tYW5kIiwgc2l6ZW9mKFZrRHJhd0luZGlyZWN0Q29tbWFuZCksIGNvdW50LCBvZmZzZXQsIGJ1ZmZlcl9zdGF0ZSk7CisgICAgfQorICAgIC8vIFRPRE86IElmIHRoZSBkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFsbCB0aGUgZmlyc3RJbnN0YW5jZSBtZW1iZXJzIG9mIHRoZQorICAgIC8vIFZrRHJhd0luZGlyZWN0Q29tbWFuZCBzdHJ1Y3R1cmVzIGFjY2Vzc2VkIGJ5IHRoaXMgY29tbWFuZCBtdXN0IGJlIDAsIHdoaWNoIHdpbGwgcmVxdWlyZSBhY2Nlc3MgdG8gdGhlIGNvbnRlbnRzIG9mICdidWZmZXInLgorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWREcmF3VHlwZSgKKyAgICAgICAgY29tbWFuZEJ1ZmZlciwgdHJ1ZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgQ01EX0RSQVdJTkRFWEVESU5ESVJFQ1QsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QoKSIsCisgICAgICAgIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1yZW5kZXJwYXNzIiwKKyAgICAgICAgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI3MDAiLCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcwMSIpOworICAgIGNvbnN0IEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvQnVmZmVyKGJ1ZmZlcl9zdGF0ZSwgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCgpIiwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWJ1ZmZlci0wMjcwOCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKGJ1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWJ1ZmZlci0wMjcwOSIsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUIik7CisgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ21kRHJhd1N0cmlkZVdpdGhTdHJ1Y3QoY29tbWFuZEJ1ZmZlciwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWRyYXdDb3VudC0wMDUyOCIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kIiwgc2l6ZW9mKFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQpKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZERyYXdTdHJpZGVXaXRoQnVmZmVyKGNvbW1hbmRCdWZmZXIsICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1kcmF3Q291bnQtMDA1NDAiLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCIsIHNpemVvZihWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kKSwgY291bnQsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zdGF0ZSk7CisgICAgfQorICAgIC8vIFRPRE86IElmIHRoZSBkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFsbCB0aGUgZmlyc3RJbnN0YW5jZSBtZW1iZXJzIG9mIHRoZQorICAgIC8vIFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQgc3RydWN0dXJlcyBhY2Nlc3NlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBiZSAwLCB3aGljaCB3aWxsIHJlcXVpcmUgYWNjZXNzIHRvIHRoZSBjb250ZW50cyBvZgorICAgIC8vICdidWZmZXInLgorICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZERyYXdUeXBlKGNvbW1hbmRCdWZmZXIsIGZhbHNlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsIENNRF9ESVNQQVRDSCwgInZrQ21kRGlzcGF0Y2goKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX0NPTVBVVEVfQklULCAiVlVJRC12a0NtZERpc3BhdGNoLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJWVUlELXZrQ21kRGlzcGF0Y2gtcmVuZGVycGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjcwMCIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPQorICAgICAgICBWYWxpZGF0ZUNtZERyYXdUeXBlKGNvbW1hbmRCdWZmZXIsIGZhbHNlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsIENNRF9ESVNQQVRDSElORElSRUNULCAidmtDbWREaXNwYXRjaEluZGlyZWN0KCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX0NPTVBVVEVfQklULCAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtcmVuZGVycGFzcyIsICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNzAwIiwga1ZVSURVbmRlZmluZWQpOworICAgIGNvbnN0IEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvQnVmZmVyKGJ1ZmZlcl9zdGF0ZSwgInZrQ21kRGlzcGF0Y2hJbmRpcmVjdCgpIiwgIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWJ1ZmZlci0wMjcwOCIpOworICAgIHNraXAgfD0KKyAgICAgICAgVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKGJ1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQsIHRydWUsICJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1idWZmZXItMDI3MDkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRGlzcGF0Y2hJbmRpcmVjdCgpIiwgIlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAob2Zmc2V0ICYgMykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItb2Zmc2V0LTAyNzEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKCkgcGFyYW1ldGVyLCBWa0RldmljZVNpemUgb2Zmc2V0ICgweCUiIFBSSXhMRUFTVDY0ICIpLCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIH0KKworICAgIGlmIChjb3VudEJ1ZmZlck9mZnNldCAmIDMpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyT2Zmc2V0LTAyNzE2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKCkgcGFyYW1ldGVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQgKDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIpLCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCk7CisgICAgfQorICAgIHNraXAgfD0gVmFsaWRhdGVDbWREcmF3U3RyaWRlV2l0aFN0cnVjdChjb21tYW5kQnVmZmVyLCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLXN0cmlkZS0wMzExMCIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrRHJhd0luZGlyZWN0Q29tbWFuZCIsIHNpemVvZihWa0RyYXdJbmRpcmVjdENvbW1hbmQpKTsKKyAgICBpZiAobWF4RHJhd0NvdW50ID4gMSkgeworICAgICAgICBjb25zdCBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDbWREcmF3U3RyaWRlV2l0aEJ1ZmZlcihjb21tYW5kQnVmZmVyLCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLW1heERyYXdDb3VudC0wMzExMSIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0RyYXdJbmRpcmVjdENvbW1hbmQiLCBzaXplb2YoVmtEcmF3SW5kaXJlY3RDb21tYW5kKSwgbWF4RHJhd0NvdW50LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc3RhdGUpOworICAgIH0KKworICAgIHNraXAgfD0gVmFsaWRhdGVDbWREcmF3VHlwZShjb21tYW5kQnVmZmVyLCBmYWxzZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgQ01EX0RSQVdJTkRJUkVDVENPVU5US0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUigpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItcmVuZGVycGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMCIsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci0wMjcwMSIpOworICAgIGNvbnN0IEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICBjb25zdCBCVUZGRVJfU1RBVEUgKmNvdW50X2J1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGNvdW50QnVmZmVyKTsKKyAgICBza2lwIHw9CisgICAgICAgIFZhbGlkYXRlTWVtb3J5SXNCb3VuZFRvQnVmZmVyKGJ1ZmZlcl9zdGF0ZSwgInZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoKSIsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA4Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0J1ZmZlcihjb3VudF9idWZmZXJfc3RhdGUsICJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMjcxNCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKGJ1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1idWZmZXItMDI3MDkiLCAidmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQnVmZmVyVXNhZ2VGbGFncyhjb3VudF9idWZmZXJfc3RhdGUsIFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklULCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTUiLCAidmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChvZmZzZXQgJiAzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItb2Zmc2V0LTAyNzEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigpIHBhcmFtZXRlciwgVmtEZXZpY2VTaXplIG9mZnNldCAoMHglIiBQUkl4TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgIiksIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgfQorCisgICAgaWYgKGNvdW50QnVmZmVyT2Zmc2V0ICYgMykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyT2Zmc2V0LTAyNzE2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigpIHBhcmFtZXRlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0ICgweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiKSwgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQpOworICAgIH0KKworICAgIHNraXAgfD0gVmFsaWRhdGVDbWREcmF3U3RyaWRlV2l0aFN0cnVjdChjb21tYW5kQnVmZmVyLCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1zdHJpZGUtMDMxNDIiLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0RyYXdJbmRpcmVjdENvbW1hbmQiLCBzaXplb2YoVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCkpOworICAgIGlmIChtYXhEcmF3Q291bnQgPiAxKSB7CisgICAgICAgIGNvbnN0IEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZERyYXdTdHJpZGVXaXRoQnVmZmVyKGNvbW1hbmRCdWZmZXIsICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLW1heERyYXdDb3VudC0wMzE0MyIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0RyYXdJbmRpcmVjdENvbW1hbmQiLCBzaXplb2YoVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCksIG1heERyYXdDb3VudCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3N0YXRlKTsKKyAgICB9CisKKyAgICBza2lwIHw9IFZhbGlkYXRlQ21kRHJhd1R5cGUoCisgICAgICAgIGNvbW1hbmRCdWZmZXIsIHRydWUsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIENNRF9EUkFXSU5ERVhFRElORElSRUNUQ09VTlRLSFIsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigpIiwKKyAgICAgICAgVktfUVVFVUVfR1JBUEhJQ1NfQklULCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLAorICAgICAgICAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1yZW5kZXJwYXNzIiwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMCIsCisgICAgICAgICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItMDI3MDEiKTsKKyAgICBjb25zdCBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgY29uc3QgQlVGRkVSX1NUQVRFICpjb3VudF9idWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShjb3VudEJ1ZmZlcik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0J1ZmZlcihidWZmZXJfc3RhdGUsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWJ1ZmZlci0wMjcwOCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoY291bnRfYnVmZmVyX3N0YXRlLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMjcxNCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKGJ1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA5IiwgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKGNvdW50X2J1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigpIiwgIlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6UHJlQ2FsbFZhbGlkYXRlQ21kVHJhY2VSYXlzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIFZrQnVmZmVyIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGRlcHRoKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0KKyAgICAgICAgVmFsaWRhdGVDbWREcmF3VHlwZShjb21tYW5kQnVmZmVyLCB0cnVlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WLCBDTURfVFJBQ0VSQVlTTlYsICJ2a0NtZFRyYWNlUmF5c05WKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX0NPTVBVVEVfQklULCAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtcmVuZGVycGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNzAwIiwgIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tYW5kQnVmZmVyLTAyNzAxIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgQ29yZUNoZWNrczo6UG9zdENhbGxSZWNvcmRDbWRUcmFjZVJheXNOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZGVwdGgpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgVXBkYXRlU3RhdGVDbWREcmF3RGlzcGF0Y2hUeXBlKGNiX3N0YXRlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WKTsKKyAgICBjYl9zdGF0ZS0+aGFzVHJhY2VSYXlzQ21kID0gdHJ1ZTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHRhc2tDb3VudCwgdWludDMyX3QgZmlyc3RUYXNrKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWREcmF3VHlwZShjb21tYW5kQnVmZmVyLCBmYWxzZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgQ01EX0RSQVdNRVNIVEFTS1NOViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERyYXdNZXNoVGFza3NOVigpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtcmVuZGVycGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNzAwIiwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtY29tbWFuZEJ1ZmZlci0wMjcwMSIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVDbWREcmF3VHlwZShjb21tYW5kQnVmZmVyLCBmYWxzZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgQ01EX0RSQVdNRVNIVEFTS1NJTkRJUkVDVE5WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoKSIsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtcmVuZGVycGFzcyIsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjcwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1hbmRCdWZmZXItMDI3MDEiKTsKKyAgICBjb25zdCBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU1lbW9yeUlzQm91bmRUb0J1ZmZlcihidWZmZXJfc3RhdGUsICJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1idWZmZXItMDI3MDgiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQnVmZmVyVXNhZ2VGbGFncyhidWZmZXJfc3RhdGUsIFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklULCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtYnVmZmVyLTAyNzA5IiwgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUIik7CisgICAgaWYgKGRyYXdDb3VudCA+IDEpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNtZERyYXdTdHJpZGVXaXRoQnVmZmVyKGNvbW1hbmRCdWZmZXIsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZHJhd0NvdW50LTAyMTU3Iiwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WIiwgc2l6ZW9mKFZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwgb2Zmc2V0LCBidWZmZXJfc3RhdGUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlQ21kRHJhd1R5cGUoCisgICAgICAgIGNvbW1hbmRCdWZmZXIsIGZhbHNlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBDTURfRFJBV01FU0hUQVNLU0lORElSRUNUQ09VTlROViwKKyAgICAgICAgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVigpIiwgVktfUVVFVUVfR1JBUEhJQ1NfQklULAorICAgICAgICAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLXJlbmRlcnBhc3MiLAorICAgICAgICAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjcwMCIsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb21tYW5kQnVmZmVyLTAyNzAxIik7CisgICAgY29uc3QgQlVGRkVSX1NUQVRFICpidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShidWZmZXIpOworICAgIGNvbnN0IEJVRkZFUl9TVEFURSAqY291bnRfYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoY291bnRCdWZmZXIpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoYnVmZmVyX3N0YXRlLCAidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWJ1ZmZlci0wMjcwOCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVNZW1vcnlJc0JvdW5kVG9CdWZmZXIoY291bnRfYnVmZmVyX3N0YXRlLCAidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE0Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZUJ1ZmZlclVzYWdlRmxhZ3MoYnVmZmVyX3N0YXRlLCBWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtYnVmZmVyLTAyNzA5IiwgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVCdWZmZXJVc2FnZUZsYWdzKGNvdW50X2J1ZmZlcl9zdGF0ZSwgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoKSIsICJWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVDbWREcmF3U3RyaWRlV2l0aFN0cnVjdChjb21tYW5kQnVmZmVyLCAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtc3RyaWRlLTAyMTgyIiwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYiLCBzaXplb2YoVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYpKTsKKyAgICBpZiAobWF4RHJhd0NvdW50ID4gMSkgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlQ21kRHJhd1N0cmlkZVdpdGhCdWZmZXIoY29tbWFuZEJ1ZmZlciwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLW1heERyYXdDb3VudC0wMjE4MyIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViIsIHNpemVvZihWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROViksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsIG9mZnNldCwgYnVmZmVyX3N0YXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkLy5jbGFuZy1mb3JtYXQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkLy5jbGFuZy1mb3JtYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlZjhmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDYgQEAKKy0tLQorIyBEaXNhYmxlIGNsYW5nLWZvcm1hdCBmb3IgZ2VuZXJhdGVkIGNvZGUKK0Rpc2FibGVGb3JtYXQ6IHRydWUKKyMgQy1GIGhhcyBhIGJ1ZyBpbiB3aGljaCBpdCBpbnNpc3RzIG9uIHNvcnRpbmcgaW5jbHVkZXMgZXZlbiBpZiBkaXNhYmxlZAorU29ydEluY2x1ZGVzOiBmYWxzZQorLi4uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL2NoYXNzaXMuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9jaGFzc2lzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDJmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9jaGFzc2lzLmNwcApAQCAtMCwwICsxLDk5MzMgQEAKKworLy8gVGhpcyBmaWxlIGlzICoqKkdFTkVSQVRFRCoqKi4gIERvIE5vdCBFZGl0LgorLy8gU2VlIGxheWVyX2NoYXNzaXNfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zLgorCisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICovCisKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG11dGV4PgorCisjZGVmaW5lIFZBTElEQVRJT05fRVJST1JfTUFQX0lNUEwKKworI2luY2x1ZGUgImNoYXNzaXMuaCIKKyNpbmNsdWRlICJsYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmgiCisKK3NtYWxsX3Vub3JkZXJlZF9tYXA8dm9pZCosIFZhbGlkYXRpb25PYmplY3QqLCAyPiBsYXllcl9kYXRhX21hcDsKKworLy8gR2xvYmFsIHVuaXF1ZSBvYmplY3QgaWRlbnRpZmllci4KK3N0ZDo6YXRvbWljPHVpbnQ2NF90PiBnbG9iYWxfdW5pcXVlX2lkKDFVTEwpOworLy8gTWFwIHVuaXF1ZUlEIHRvIGFjdHVhbCBvYmplY3QgaGFuZGxlLiBBY2Nlc3NlcyB0byB0aGUgbWFwIGl0c2VsZiBhcmUKKy8vIGludGVybmFsbHkgc3luY2hyb25pemVkLgordmxfY29uY3VycmVudF91bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdCwgNCwgSGFzaGVkVWludDY0PiB1bmlxdWVfaWRfbWFwcGluZzsKKworYm9vbCB3cmFwX2hhbmRsZXMgPSB0cnVlOworCisjZGVmaW5lIE9CSkVDVF9MQVlFUl9OQU1FICJWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24iCisjZGVmaW5lIE9CSkVDVF9MQVlFUl9ERVNDUklQVElPTiAia2hyb25vc192YWxpZGF0aW9uIgorCisvLyBJbmNsdWRlIGxheWVyIHZhbGlkYXRpb24gb2JqZWN0IGRlZmluaXRpb25zCisjaW5jbHVkZSAiYmVzdF9wcmFjdGljZXMuaCIKKyNpbmNsdWRlICJjb3JlX3ZhbGlkYXRpb24uaCIKKyNpbmNsdWRlICJjb21tYW5kX2NvdW50ZXIuaCIKKyNpbmNsdWRlICJncHVfdmFsaWRhdGlvbi5oIgorI2luY2x1ZGUgIm9iamVjdF9saWZldGltZV92YWxpZGF0aW9uLmgiCisjaW5jbHVkZSAic3RhdGVsZXNzX3ZhbGlkYXRpb24uaCIKKyNpbmNsdWRlICJ0aHJlYWRfc2FmZXR5LmgiCisKK25hbWVzcGFjZSB2dWxrYW5fbGF5ZXJfY2hhc3NpcyB7CisKK3VzaW5nIHN0ZDo6dW5vcmRlcmVkX21hcDsKKworc3RhdGljIGNvbnN0IFZrTGF5ZXJQcm9wZXJ0aWVzIGdsb2JhbF9sYXllciA9IHsKKyAgICBPQkpFQ1RfTEFZRVJfTkFNRSwgVktfTEFZRVJfQVBJX1ZFUlNJT04sIDEsICJMdW5hckcgdmFsaWRhdGlvbiBMYXllciIsCit9OworCitzdGF0aWMgY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIGluc3RhbmNlX2V4dGVuc2lvbnNbXSA9IHt7VktfRVhUX0RFQlVHX1JFUE9SVF9FWFRFTlNJT05fTkFNRSwgVktfRVhUX0RFQlVHX1JFUE9SVF9TUEVDX1ZFUlNJT059LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1ZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSwgVktfRVhUX0RFQlVHX1VUSUxTX1NQRUNfVkVSU0lPTn19Oworc3RhdGljIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyBkZXZpY2VfZXh0ZW5zaW9uc1tdID0geworICAgIHtWS19FWFRfVkFMSURBVElPTl9DQUNIRV9FWFRFTlNJT05fTkFNRSwgVktfRVhUX1ZBTElEQVRJT05fQ0FDSEVfU1BFQ19WRVJTSU9OfSwKKyAgICB7VktfRVhUX0RFQlVHX01BUktFUl9FWFRFTlNJT05fTkFNRSwgVktfRVhUX0RFQlVHX01BUktFUl9TUEVDX1ZFUlNJT059LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGJvb2wgaXNfaW5zdGFuY2VfYXBpOworICAgIHZvaWQqIGZ1bmNwdHI7Cit9IGZ1bmN0aW9uX2RhdGE7CisKK2V4dGVybiBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGZ1bmN0aW9uX2RhdGE+IG5hbWVfdG9fZnVuY3B0cl9tYXA7CisKKy8vIE1hbnVhbGx5IHdyaXR0ZW4gZnVuY3Rpb25zCisKKy8vIENoZWNrIGVuYWJsZWQgaW5zdGFuY2UgZXh0ZW5zaW9ucyBhZ2FpbnN0IHN1cHBvcnRlZCBpbnN0YW5jZSBleHRlbnNpb24gd2hpdGVsaXN0CitzdGF0aWMgdm9pZCBJbnN0YW5jZUV4dGVuc2lvbldoaXRlbGlzdChWYWxpZGF0aW9uT2JqZWN0ICpsYXllcl9kYXRhLCBjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIFZrSW5zdGFuY2UgaW5zdGFuY2UpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgIC8vIENoZWNrIGZvciByZWNvZ25pemVkIGluc3RhbmNlIGV4dGVuc2lvbnMKKyAgICAgICAgaWYgKCF3aGl0ZV9saXN0KHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwga0luc3RhbmNlRXh0ZW5zaW9uTmFtZXMpKSB7CisgICAgICAgICAgICBsb2dfbXNnKGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAiSW5zdGFuY2UgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBsYXllci4gIFVzaW5nIHRoaXMgZXh0ZW5zaW9uIG1heSBhZHZlcnNlbHkgYWZmZWN0IHZhbGlkYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAicmVzdWx0cyBhbmQvb3IgcHJvZHVjZSB1bmRlZmluZWQgYmVoYXZpb3IuIiwKKyAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gQ2hlY2sgZW5hYmxlZCBkZXZpY2UgZXh0ZW5zaW9ucyBhZ2FpbnN0IHN1cHBvcnRlZCBkZXZpY2UgZXh0ZW5zaW9uIHdoaXRlbGlzdAorc3RhdGljIHZvaWQgRGV2aWNlRXh0ZW5zaW9uV2hpdGVsaXN0KFZhbGlkYXRpb25PYmplY3QgKmxheWVyX2RhdGEsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIFZrRGV2aWNlIGRldmljZSkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHJlY29nbml6ZWQgZGV2aWNlIGV4dGVuc2lvbnMKKyAgICAgICAgaWYgKCF3aGl0ZV9saXN0KHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSwga0RldmljZUV4dGVuc2lvbk5hbWVzKSkgeworICAgICAgICAgICAgbG9nX21zZyhsYXllcl9kYXRhLT5yZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICBrVlVJRFVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgIkRldmljZSBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGxheWVyLiAgVXNpbmcgdGhpcyBleHRlbnNpb24gbWF5IGFkdmVyc2VseSBhZmZlY3QgdmFsaWRhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICJyZXN1bHRzIGFuZC9vciBwcm9kdWNlIHVuZGVmaW5lZCBiZWhhdmlvci4iLAorICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vIFByb2Nlc3MgdmFsaWRhdGlvbiBmZWF0dXJlcywgZmxhZ3MgYW5kIHNldHRpbmdzIHNwZWNpZmllZCB0aHJvdWdoIGV4dGVuc2lvbnMsIGEgbGF5ZXIgc2V0dGluZ3MgZmlsZSwgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzCisKK3N0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUPiBWa1ZhbEZlYXR1cmVEaXNhYmxlTG9va3VwID0geworICAgIHsiVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfU0hBREVSU19FWFQiLCBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9TSEFERVJTX0VYVH0sCisgICAgeyJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9USFJFQURfU0FGRVRZX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1RIUkVBRF9TQUZFVFlfRVhUfSwKKyAgICB7IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FQSV9QQVJBTUVURVJTX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FQSV9QQVJBTUVURVJTX0VYVH0sCisgICAgeyJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9PQkpFQ1RfTElGRVRJTUVTX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX09CSkVDVF9MSUZFVElNRVNfRVhUfSwKKyAgICB7IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0NPUkVfQ0hFQ0tTX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0NPUkVfQ0hFQ0tTX0VYVH0sCisgICAgeyJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9VTklRVUVfSEFORExFU19FWFQiLCBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9VTklRVUVfSEFORExFU19FWFR9LAorICAgIHsiVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQUxMX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FMTF9FWFR9LAorfTsKKworc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVD4gVmtWYWxGZWF0dXJlRW5hYmxlTG9va3VwID0geworICAgIHsiVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhUIiwgVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhUfSwKKyAgICB7IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX1JFU0VSVkVfQklORElOR19TTE9UX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX1JFU0VSVkVfQklORElOR19TTE9UX0VYVH0sCisgICAgeyJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0JFU1RfUFJBQ1RJQ0VTX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfQkVTVF9QUkFDVElDRVNfRVhUfSwKK307CisKK3N0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFZhbGlkYXRpb25DaGVja0Rpc2FibGVzPiBWYWxpZGF0aW9uRGlzYWJsZUxvb2t1cCA9IHsKKyAgICB7IlZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9DT01NQU5EX0JVRkZFUl9TVEFURSIsIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9DT01NQU5EX0JVRkZFUl9TVEFURX0sCisgICAgeyJWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfT0JKRUNUX0lOX1VTRSIsIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9PQkpFQ1RfSU5fVVNFfSwKKyAgICB7IlZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9JRExFX0RFU0NSSVBUT1JfU0VUIiwgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0lETEVfREVTQ1JJUFRPUl9TRVR9LAorICAgIHsiVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX1BVU0hfQ09OU1RBTlRfUkFOR0UiLCBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfUFVTSF9DT05TVEFOVF9SQU5HRX0sCisgICAgeyJWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfUVVFUllfVkFMSURBVElPTiIsIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9RVUVSWV9WQUxJREFUSU9OfSwKKyAgICB7IlZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9JTUFHRV9MQVlPVVRfVkFMSURBVElPTiIsIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9JTUFHRV9MQVlPVVRfVkFMSURBVElPTn0sCit9OworCisvLyBTZXQgdGhlIGxvY2FsIGRpc2FibGUgZmxhZyBmb3IgdGhlIGFwcHJvcHJpYXRlIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRSBlbnVtCit2b2lkIFNldFZhbGlkYXRpb25EaXNhYmxlKENIRUNLX0RJU0FCTEVEKiBkaXNhYmxlX2RhdGEsIGNvbnN0IFZhbGlkYXRpb25DaGVja0Rpc2FibGVzIGRpc2FibGVfaWQpIHsKKyAgICBzd2l0Y2ggKGRpc2FibGVfaWQpIHsKKyAgICAgICAgY2FzZSBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfQ09NTUFORF9CVUZGRVJfU1RBVEU6CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPmNvbW1hbmRfYnVmZmVyX3N0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9PQkpFQ1RfSU5fVVNFOgorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT5vYmplY3RfaW5fdXNlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9JRExFX0RFU0NSSVBUT1JfU0VUOgorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT5pZGxlX2Rlc2NyaXB0b3Jfc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9QVVNIX0NPTlNUQU5UX1JBTkdFOgorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT5wdXNoX2NvbnN0YW50X3JhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9RVUVSWV9WQUxJREFUSU9OOgorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT5xdWVyeV92YWxpZGF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9JTUFHRV9MQVlPVVRfVkFMSURBVElPTjoKKyAgICAgICAgICAgIGRpc2FibGVfZGF0YS0+aW1hZ2VfbGF5b3V0X3ZhbGlkYXRpb24gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQodHJ1ZSk7CisgICAgfQorfQorCisvLyBTZXQgdGhlIGxvY2FsIGRpc2FibGUgZmxhZyBmb3IgYSBzaW5nbGUgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfKiBmbGFnCit2b2lkIFNldFZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZShDSEVDS19ESVNBQkxFRCogZGlzYWJsZV9kYXRhLCBjb25zdCBWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVCBmZWF0dXJlX2Rpc2FibGUpIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVfZGlzYWJsZSkgeworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1NIQURFUlNfRVhUOgorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT5zaGFkZXJfdmFsaWRhdGlvbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9USFJFQURfU0FGRVRZX0VYVDoKKyAgICAgICAgICAgIGRpc2FibGVfZGF0YS0+dGhyZWFkX3NhZmV0eSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BUElfUEFSQU1FVEVSU19FWFQ6CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPnN0YXRlbGVzc19jaGVja3MgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfT0JKRUNUX0xJRkVUSU1FU19FWFQ6CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPm9iamVjdF90cmFja2luZyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9DT1JFX0NIRUNLU19FWFQ6CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPmNvcmVfY2hlY2tzID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1VOSVFVRV9IQU5ETEVTX0VYVDoKKyAgICAgICAgICAgIGRpc2FibGVfZGF0YS0+aGFuZGxlX3dyYXBwaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FMTF9FWFQ6CisgICAgICAgICAgICAvLyBTZXQgYWxsIGRpc2FibGVkIGZsYWdzIHRvIHRydWUKKyAgICAgICAgICAgIGRpc2FibGVfZGF0YS0+U2V0QWxsKHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8vIFNldCB0aGUgbG9jYWwgZW5hYmxlIGZsYWcgZm9yIGEgc2luZ2xlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfKiBmbGFnCit2b2lkIFNldFZhbGlkYXRpb25GZWF0dXJlRW5hYmxlKENIRUNLX0VOQUJMRUQgKmVuYWJsZV9kYXRhLCBjb25zdCBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIGZlYXR1cmVfZW5hYmxlKSB7CisgICAgc3dpdGNoIChmZWF0dXJlX2VuYWJsZSkgeworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX0VYVDoKKyAgICAgICAgICAgIGVuYWJsZV9kYXRhLT5ncHVfdmFsaWRhdGlvbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9SRVNFUlZFX0JJTkRJTkdfU0xPVF9FWFQ6CisgICAgICAgICAgICBlbmFibGVfZGF0YS0+Z3B1X3ZhbGlkYXRpb25fcmVzZXJ2ZV9iaW5kaW5nX3Nsb3QgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9CRVNUX1BSQUNUSUNFU19FWFQ6CisgICAgICAgICAgICBlbmFibGVfZGF0YS0+YmVzdF9wcmFjdGljZXMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8vIFNldCB0aGUgbG9jYWwgZGlzYWJsZSBmbGFnIGZvciBzZXR0aW5ncyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgVktfRVhUX3ZhbGlkYXRpb25fZmxhZ3MgZXh0ZW5zaW9uCit2b2lkIFNldFZhbGlkYXRpb25GbGFncyhDSEVDS19ESVNBQkxFRCogZGlzYWJsZXMsIGNvbnN0IFZrVmFsaWRhdGlvbkZsYWdzRVhUKiB2YWxfZmxhZ3Nfc3RydWN0KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHZhbF9mbGFnc19zdHJ1Y3QtPmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQ7ICsraSkgeworICAgICAgICBzd2l0Y2ggKHZhbF9mbGFnc19zdHJ1Y3QtPnBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3NbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9DSEVDS19TSEFERVJTX0VYVDoKKyAgICAgICAgICAgICAgICBkaXNhYmxlcy0+c2hhZGVyX3ZhbGlkYXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0NIRUNLX0FMTF9FWFQ6CisgICAgICAgICAgICAgICAgLy8gU2V0IGFsbCBkaXNhYmxlZCBmbGFncyB0byB0cnVlCisgICAgICAgICAgICAgICAgZGlzYWJsZXMtPlNldEFsbCh0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFByb2Nlc3MgVmFsaWRhdGlvbiBGZWF0dXJlcyBmbGFncyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgVmFsaWRhdGlvbkZlYXR1cmUgZXh0ZW5zaW9uCit2b2lkIFNldFZhbGlkYXRpb25GZWF0dXJlcyhDSEVDS19ESVNBQkxFRCAqZGlzYWJsZV9kYXRhLCBDSEVDS19FTkFCTEVEICplbmFibGVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUICp2YWxfZmVhdHVyZXNfc3RydWN0KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHZhbF9mZWF0dXJlc19zdHJ1Y3QtPmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudDsgKytpKSB7CisgICAgICAgIFNldFZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZShkaXNhYmxlX2RhdGEsIHZhbF9mZWF0dXJlc19zdHJ1Y3QtPnBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlc1tpXSk7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2YWxfZmVhdHVyZXNfc3RydWN0LT5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudDsgKytpKSB7CisgICAgICAgIFNldFZhbGlkYXRpb25GZWF0dXJlRW5hYmxlKGVuYWJsZV9kYXRhLCB2YWxfZmVhdHVyZXNfc3RydWN0LT5wRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlc1tpXSk7CisgICAgfQorfQorCisvLyBHaXZlbiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxpc3Qgb2YgZW5hYmxlIGVudW0gdmFsdWVzLCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBzZXR0ZXIgZnVuY3Rpb24KK3ZvaWQgU2V0TG9jYWxFbmFibGVTZXR0aW5nKHN0ZDo6c3RyaW5nIGxpc3Rfb2ZfZW5hYmxlcywgc3RkOjpzdHJpbmcgZGVsaW1pdGVyLCBDSEVDS19FTkFCTEVEKiBlbmFibGVzKSB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgd2hpbGUgKGxpc3Rfb2ZfZW5hYmxlcy5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgIHBvcyA9IGxpc3Rfb2ZfZW5hYmxlcy5maW5kKGRlbGltaXRlcik7CisgICAgICAgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHRva2VuID0gbGlzdF9vZl9lbmFibGVzLnN1YnN0cigwLCBwb3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcG9zID0gbGlzdF9vZl9lbmFibGVzLmxlbmd0aCgpIC0gZGVsaW1pdGVyLmxlbmd0aCgpOworICAgICAgICAgICAgdG9rZW4gPSBsaXN0X29mX2VuYWJsZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRva2VuLmZpbmQoIlZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gVmtWYWxGZWF0dXJlRW5hYmxlTG9va3VwLmZpbmQodG9rZW4pOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBWa1ZhbEZlYXR1cmVFbmFibGVMb29rdXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBTZXRWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZShlbmFibGVzLCByZXN1bHQtPnNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGlzdF9vZl9lbmFibGVzLmVyYXNlKDAsIHBvcyArIGRlbGltaXRlci5sZW5ndGgoKSk7CisgICAgfQorfQorCisvLyBHaXZlbiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxpc3Qgb2YgZGlzYWJsZSBlbnVtIHZhbHVlcywgY2FsbCB0aGUgYXBwcm9wcmlhdGUgc2V0dGVyIGZ1bmN0aW9uCit2b2lkIFNldExvY2FsRGlzYWJsZVNldHRpbmcoc3RkOjpzdHJpbmcgbGlzdF9vZl9kaXNhYmxlcywgc3RkOjpzdHJpbmcgZGVsaW1pdGVyLCBDSEVDS19ESVNBQkxFRCogZGlzYWJsZXMpIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBzdGQ6OnN0cmluZyB0b2tlbjsKKyAgICB3aGlsZSAobGlzdF9vZl9kaXNhYmxlcy5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgIHBvcyA9IGxpc3Rfb2ZfZGlzYWJsZXMuZmluZChkZWxpbWl0ZXIpOworICAgICAgICBpZiAocG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICB0b2tlbiA9IGxpc3Rfb2ZfZGlzYWJsZXMuc3Vic3RyKDAsIHBvcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwb3MgPSBsaXN0X29mX2Rpc2FibGVzLmxlbmd0aCgpIC0gZGVsaW1pdGVyLmxlbmd0aCgpOworICAgICAgICAgICAgdG9rZW4gPSBsaXN0X29mX2Rpc2FibGVzOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlbi5maW5kKCJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBWa1ZhbEZlYXR1cmVEaXNhYmxlTG9va3VwLmZpbmQodG9rZW4pOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBWa1ZhbEZlYXR1cmVEaXNhYmxlTG9va3VwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgU2V0VmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlKGRpc2FibGVzLCByZXN1bHQtPnNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRva2VuLmZpbmQoIlZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBWYWxpZGF0aW9uRGlzYWJsZUxvb2t1cC5maW5kKHRva2VuKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gVmFsaWRhdGlvbkRpc2FibGVMb29rdXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBTZXRWYWxpZGF0aW9uRGlzYWJsZShkaXNhYmxlcywgcmVzdWx0LT5zZWNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxpc3Rfb2ZfZGlzYWJsZXMuZXJhc2UoMCwgcG9zICsgZGVsaW1pdGVyLmxlbmd0aCgpKTsKKyAgICB9Cit9CisKKy8vIFByb2Nlc3MgZW5hYmxlcyBhbmQgZGlzYWJsZXMgc2V0IHRob3VnaCB0aGUgdmtfbGF5ZXJfc2V0dGluZ3MudHh0IGNvbmZpZyBmaWxlIG9yIHRocm91Z2ggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKK3ZvaWQgUHJvY2Vzc0NvbmZpZ0FuZEVudlNldHRpbmdzKGNvbnN0IGNoYXIqIGxheWVyX2Rlc2NyaXB0aW9uLCBDSEVDS19FTkFCTEVEKiBlbmFibGVzLCBDSEVDS19ESVNBQkxFRCogZGlzYWJsZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBlbmFibGVfa2V5ID0gbGF5ZXJfZGVzY3JpcHRpb247CisgICAgc3RkOjpzdHJpbmcgZGlzYWJsZV9rZXkgPSBsYXllcl9kZXNjcmlwdGlvbjsKKyAgICBlbmFibGVfa2V5LmFwcGVuZCgiLmVuYWJsZXMiKTsKKyAgICBkaXNhYmxlX2tleS5hcHBlbmQoIi5kaXNhYmxlcyIpOworICAgIHN0ZDo6c3RyaW5nIGxpc3Rfb2ZfY29uZmlnX2VuYWJsZXMgPSBnZXRMYXllck9wdGlvbihlbmFibGVfa2V5LmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIGxpc3Rfb2ZfZW52X2VuYWJsZXMgPSBHZXRMYXllckVudlZhcigiVktfTEFZRVJfRU5BQkxFUyIpOworICAgIHN0ZDo6c3RyaW5nIGxpc3Rfb2ZfY29uZmlnX2Rpc2FibGVzID0gZ2V0TGF5ZXJPcHRpb24oZGlzYWJsZV9rZXkuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgbGlzdF9vZl9lbnZfZGlzYWJsZXMgPSBHZXRMYXllckVudlZhcigiVktfTEFZRVJfRElTQUJMRVMiKTsKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICBzdGQ6OnN0cmluZyBlbnZfZGVsaW1pdGVyID0gIjsiOworI2Vsc2UKKyAgICBzdGQ6OnN0cmluZyBlbnZfZGVsaW1pdGVyID0gIjoiOworI2VuZGlmCisgICAgU2V0TG9jYWxFbmFibGVTZXR0aW5nKGxpc3Rfb2ZfY29uZmlnX2VuYWJsZXMsICIsIiwgZW5hYmxlcyk7CisgICAgU2V0TG9jYWxFbmFibGVTZXR0aW5nKGxpc3Rfb2ZfZW52X2VuYWJsZXMsIGVudl9kZWxpbWl0ZXIsIGVuYWJsZXMpOworICAgIFNldExvY2FsRGlzYWJsZVNldHRpbmcobGlzdF9vZl9jb25maWdfZGlzYWJsZXMsICIsIiwgZGlzYWJsZXMpOworICAgIFNldExvY2FsRGlzYWJsZVNldHRpbmcobGlzdF9vZl9lbnZfZGlzYWJsZXMsIGVudl9kZWxpbWl0ZXIsIGRpc2FibGVzKTsKK30KKworCisvLyBOb24tY29kZS1nZW5lcmF0ZWQgY2hhc3NpcyBBUEkgZnVuY3Rpb25zCisKK1ZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgR2V0RGV2aWNlUHJvY0FkZHIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIUFwaVBhcmVudEV4dGVuc2lvbkVuYWJsZWQoZnVuY05hbWUsICZsYXllcl9kYXRhLT5kZXZpY2VfZXh0ZW5zaW9ucykpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IGF1dG8gJml0ZW0gPSBuYW1lX3RvX2Z1bmNwdHJfbWFwLmZpbmQoZnVuY05hbWUpOworICAgIGlmIChpdGVtICE9IG5hbWVfdG9fZnVuY3B0cl9tYXAuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZW0tPnNlY29uZC5pc19pbnN0YW5jZV9hcGkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihpdGVtLT5zZWNvbmQuZnVuY3B0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgYXV0byAmdGFibGUgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgaWYgKCF0YWJsZS5HZXREZXZpY2VQcm9jQWRkcikgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIHRhYmxlLkdldERldmljZVByb2NBZGRyKGRldmljZSwgZnVuY05hbWUpOworfQorCitWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIEdldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICBjb25zdCBhdXRvICZpdGVtID0gbmFtZV90b19mdW5jcHRyX21hcC5maW5kKGZ1bmNOYW1lKTsKKyAgICBpZiAoaXRlbSAhPSBuYW1lX3RvX2Z1bmNwdHJfbWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4oaXRlbS0+c2Vjb25kLmZ1bmNwdHIpOworICAgIH0KKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBhdXRvICZ0YWJsZSA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlOworICAgIGlmICghdGFibGUuR2V0SW5zdGFuY2VQcm9jQWRkcikgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIHRhYmxlLkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKHVpbnQzMl90ICpwQ291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiB1dGlsX0dldExheWVyUHJvcGVydGllcygxLCAmZ2xvYmFsX2xheWVyLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gdXRpbF9HZXRMYXllclByb3BlcnRpZXMoMSwgJmdsb2JhbF9sYXllciwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIGlmIChwTGF5ZXJOYW1lICYmICFzdHJjbXAocExheWVyTmFtZSwgZ2xvYmFsX2xheWVyLmxheWVyTmFtZSkpCisgICAgICAgIHJldHVybiB1dGlsX0dldEV4dGVuc2lvblByb3BlcnRpZXMoQVJSQVlfU0laRShpbnN0YW5jZV9leHRlbnNpb25zKSwgaW5zdGFuY2VfZXh0ZW5zaW9ucywgcENvdW50LCBwUHJvcGVydGllcyk7CisKKyAgICByZXR1cm4gVktfRVJST1JfTEFZRVJfTk9UX1BSRVNFTlQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IGNoYXIgKnBMYXllck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcENvdW50LCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgaWYgKHBMYXllck5hbWUgJiYgIXN0cmNtcChwTGF5ZXJOYW1lLCBnbG9iYWxfbGF5ZXIubGF5ZXJOYW1lKSkgcmV0dXJuIHV0aWxfR2V0RXh0ZW5zaW9uUHJvcGVydGllcyhBUlJBWV9TSVpFKGRldmljZV9leHRlbnNpb25zKSwgZGV2aWNlX2V4dGVuc2lvbnMsIHBDb3VudCwgcFByb3BlcnRpZXMpOworICAgIGFzc2VydChwaHlzaWNhbERldmljZSk7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBMYXllck5hbWUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbnN0YW5jZSAqcEluc3RhbmNlKSB7CisgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyogY2hhaW5faW5mbyA9IGdldF9jaGFpbl9pbmZvKHBDcmVhdGVJbmZvLCBWS19MQVlFUl9MSU5LX0lORk8pOworCisgICAgYXNzZXJ0KGNoYWluX2luZm8tPnUucExheWVySW5mbyk7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcEdldEluc3RhbmNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIFBGTl92a0NyZWF0ZUluc3RhbmNlIGZwQ3JlYXRlSW5zdGFuY2UgPSAoUEZOX3ZrQ3JlYXRlSW5zdGFuY2UpZnBHZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0NyZWF0ZUluc3RhbmNlIik7CisgICAgaWYgKGZwQ3JlYXRlSW5zdGFuY2UgPT0gTlVMTCkgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICBjaGFpbl9pbmZvLT51LnBMYXllckluZm8gPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBOZXh0OworICAgIHVpbnQzMl90IHNwZWNpZmllZF92ZXJzaW9uID0gKHBDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvID8gcENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8tPmFwaVZlcnNpb24gOiBWS19BUElfVkVSU0lPTl8xXzApOworICAgIHVpbnQzMl90IGFwaV92ZXJzaW9uID0gKHNwZWNpZmllZF92ZXJzaW9uIDwgVktfQVBJX1ZFUlNJT05fMV8xKSA/IFZLX0FQSV9WRVJTSU9OXzFfMCA6IFZLX0FQSV9WRVJTSU9OXzFfMTsKKyAgICBhdXRvIHJlcG9ydF9kYXRhID0gbmV3IGRlYnVnX3JlcG9ydF9kYXRhe307CisgICAgcmVwb3J0X2RhdGEtPmluc3RhbmNlX3BuZXh0X2NoYWluID0gU2FmZVBuZXh0Q29weShwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIEFjdGl2YXRlSW5zdGFuY2VEZWJ1Z0NhbGxiYWNrcyhyZXBvcnRfZGF0YSk7CisKKyAgICBDSEVDS19FTkFCTEVEIGxvY2FsX2VuYWJsZXMge307CisgICAgQ0hFQ0tfRElTQUJMRUQgbG9jYWxfZGlzYWJsZXMge307CisgICAgY29uc3QgYXV0byAqdmFsaWRhdGlvbl9mZWF0dXJlc19leHQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVD4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAodmFsaWRhdGlvbl9mZWF0dXJlc19leHQpIHsKKyAgICAgICAgU2V0VmFsaWRhdGlvbkZlYXR1cmVzKCZsb2NhbF9kaXNhYmxlcywgJmxvY2FsX2VuYWJsZXMsIHZhbGlkYXRpb25fZmVhdHVyZXNfZXh0KTsKKyAgICB9CisgICAgY29uc3QgYXV0byAqdmFsaWRhdGlvbl9mbGFnc19leHQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1ZhbGlkYXRpb25GbGFnc0VYVD4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAodmFsaWRhdGlvbl9mbGFnc19leHQpIHsKKyAgICAgICAgU2V0VmFsaWRhdGlvbkZsYWdzKCZsb2NhbF9kaXNhYmxlcywgdmFsaWRhdGlvbl9mbGFnc19leHQpOworICAgIH0KKyAgICBQcm9jZXNzQ29uZmlnQW5kRW52U2V0dGluZ3MoT0JKRUNUX0xBWUVSX0RFU0NSSVBUSU9OLCAmbG9jYWxfZW5hYmxlcywgJmxvY2FsX2Rpc2FibGVzKTsKKworICAgIC8vIENyZWF0ZSB0ZW1wb3JhcnkgZGlzcGF0Y2ggdmVjdG9yIGZvciBwcmUtY2FsbHMgdW50aWwgaW5zdGFuY2UgaXMgY3JlYXRlZAorICAgIHN0ZDo6dmVjdG9yPFZhbGlkYXRpb25PYmplY3QqPiBsb2NhbF9vYmplY3RfZGlzcGF0Y2g7CisgICAgLy8gQWRkIFZPcyB0byBkaXNwYXRjaCB2ZWN0b3IuIE9yZGVyIGhlcmUgd2lsbCBiZSB0aGUgdmFsaWRhdGlvbiBkaXNwYXRjaCBvcmRlciEKKyAgICBhdXRvIHRocmVhZF9jaGVja2VyID0gbmV3IFRocmVhZFNhZmV0eShudWxscHRyKTsKKyAgICBpZiAoIWxvY2FsX2Rpc2FibGVzLnRocmVhZF9zYWZldHkpIHsKKyAgICAgICAgbG9jYWxfb2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayh0aHJlYWRfY2hlY2tlcik7CisgICAgfQorICAgIHRocmVhZF9jaGVja2VyLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZVRocmVhZGluZzsKKyAgICB0aHJlYWRfY2hlY2tlci0+YXBpX3ZlcnNpb24gPSBhcGlfdmVyc2lvbjsKKyAgICB0aHJlYWRfY2hlY2tlci0+cmVwb3J0X2RhdGEgPSByZXBvcnRfZGF0YTsKKyAgICBhdXRvIHBhcmFtZXRlcl92YWxpZGF0aW9uID0gbmV3IFN0YXRlbGVzc1ZhbGlkYXRpb247CisgICAgaWYgKCFsb2NhbF9kaXNhYmxlcy5zdGF0ZWxlc3NfY2hlY2tzKSB7CisgICAgICAgIGxvY2FsX29iamVjdF9kaXNwYXRjaC5lbXBsYWNlX2JhY2socGFyYW1ldGVyX3ZhbGlkYXRpb24pOworICAgIH0KKyAgICBwYXJhbWV0ZXJfdmFsaWRhdGlvbi0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVQYXJhbWV0ZXJWYWxpZGF0aW9uOworICAgIHBhcmFtZXRlcl92YWxpZGF0aW9uLT5hcGlfdmVyc2lvbiA9IGFwaV92ZXJzaW9uOworICAgIHBhcmFtZXRlcl92YWxpZGF0aW9uLT5yZXBvcnRfZGF0YSA9IHJlcG9ydF9kYXRhOworICAgIGF1dG8gb2JqZWN0X3RyYWNrZXIgPSBuZXcgT2JqZWN0TGlmZXRpbWVzOworICAgIGlmICghbG9jYWxfZGlzYWJsZXMub2JqZWN0X3RyYWNraW5nKSB7CisgICAgICAgIGxvY2FsX29iamVjdF9kaXNwYXRjaC5lbXBsYWNlX2JhY2sob2JqZWN0X3RyYWNrZXIpOworICAgIH0KKyAgICBvYmplY3RfdHJhY2tlci0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVPYmplY3RUcmFja2VyOworICAgIG9iamVjdF90cmFja2VyLT5hcGlfdmVyc2lvbiA9IGFwaV92ZXJzaW9uOworICAgIG9iamVjdF90cmFja2VyLT5yZXBvcnRfZGF0YSA9IHJlcG9ydF9kYXRhOworICAgIGF1dG8gY29yZV9jaGVja3MgPSBuZXcgQ29yZUNoZWNrczsKKyAgICBpZiAoIWxvY2FsX2Rpc2FibGVzLmNvcmVfY2hlY2tzKSB7CisgICAgICAgIGxvY2FsX29iamVjdF9kaXNwYXRjaC5lbXBsYWNlX2JhY2soY29yZV9jaGVja3MpOworICAgIH0KKyAgICBjb3JlX2NoZWNrcy0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVDb3JlVmFsaWRhdGlvbjsKKyAgICBjb3JlX2NoZWNrcy0+YXBpX3ZlcnNpb24gPSBhcGlfdmVyc2lvbjsKKyAgICBjb3JlX2NoZWNrcy0+cmVwb3J0X2RhdGEgPSByZXBvcnRfZGF0YTsKKyAgICBhdXRvIGJlc3RfcHJhY3RpY2VzID0gbmV3IEJlc3RQcmFjdGljZXM7CisgICAgaWYgKGxvY2FsX2VuYWJsZXMuYmVzdF9wcmFjdGljZXMpIHsKKyAgICAgICAgbG9jYWxfb2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhiZXN0X3ByYWN0aWNlcyk7CisgICAgfQorICAgIGJlc3RfcHJhY3RpY2VzLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZUJlc3RQcmFjdGljZXM7CisgICAgYmVzdF9wcmFjdGljZXMtPmFwaV92ZXJzaW9uID0gYXBpX3ZlcnNpb247CisgICAgYmVzdF9wcmFjdGljZXMtPnJlcG9ydF9kYXRhID0gcmVwb3J0X2RhdGE7CisgICAgYXV0byBncHVfYXNzaXN0ZWQgPSBuZXcgR3B1QXNzaXN0ZWQ7CisgICAgaWYgKGxvY2FsX2VuYWJsZXMuZ3B1X3ZhbGlkYXRpb24pIHsKKyAgICAgICAgbG9jYWxfb2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhncHVfYXNzaXN0ZWQpOworICAgIH0KKyAgICBncHVfYXNzaXN0ZWQtPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlR3B1QXNzaXN0ZWQ7CisKKyAgICAvLyBJZiBoYW5kbGUgd3JhcHBpbmcgaXMgZGlzYWJsZWQgdmlhIHRoZSBWYWxpZGF0aW9uRmVhdHVyZXMgZXh0ZW5zaW9uLCBvdmVycmlkZSBidWlsZCBmbGFnCisgICAgaWYgKGxvY2FsX2Rpc2FibGVzLmhhbmRsZV93cmFwcGluZykgeworICAgICAgICB3cmFwX2hhbmRsZXMgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJbml0IGRpc3BhdGNoIGFycmF5IGFuZCBjYWxsIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbG9jYWxfb2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW5zdGFuY2UocENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSk7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsb2NhbF9vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlSW5zdGFuY2UocENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSk7CisgICAgfQorCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZnBDcmVhdGVJbnN0YW5jZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluc3RhbmNlKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybiByZXN1bHQ7CisKKyAgICBhdXRvIGZyYW1ld29yayA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KCpwSW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisKKyAgICBmcmFtZXdvcmstPm9iamVjdF9kaXNwYXRjaCA9IGxvY2FsX29iamVjdF9kaXNwYXRjaDsKKyAgICBmcmFtZXdvcmstPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlSW5zdGFuY2U7CisgICAgZnJhbWV3b3JrLT5kaXNhYmxlZCA9IGxvY2FsX2Rpc2FibGVzOworICAgIGZyYW1ld29yay0+ZW5hYmxlZCA9IGxvY2FsX2VuYWJsZXM7CisKKyAgICBmcmFtZXdvcmstPmluc3RhbmNlID0gKnBJbnN0YW5jZTsKKyAgICBsYXllcl9pbml0X2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKCpwSW5zdGFuY2UsICZmcmFtZXdvcmstPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLCBmcEdldEluc3RhbmNlUHJvY0FkZHIpOworICAgIGZyYW1ld29yay0+cmVwb3J0X2RhdGEgPSByZXBvcnRfZGF0YTsKKyAgICBmcmFtZXdvcmstPmFwaV92ZXJzaW9uID0gYXBpX3ZlcnNpb247CisgICAgZnJhbWV3b3JrLT5pbnN0YW5jZV9leHRlbnNpb25zLkluaXRGcm9tSW5zdGFuY2VDcmVhdGVJbmZvKHNwZWNpZmllZF92ZXJzaW9uLCBwQ3JlYXRlSW5mbyk7CisKKyAgICBsYXllcl9kZWJ1Z19tZXNzZW5nZXJfYWN0aW9ucyhmcmFtZXdvcmstPnJlcG9ydF9kYXRhLCBwQWxsb2NhdG9yLCBPQkpFQ1RfTEFZRVJfREVTQ1JJUFRJT04pOworCisgICAgb2JqZWN0X3RyYWNrZXItPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlID0gZnJhbWV3b3JrLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZTsKKyAgICBvYmplY3RfdHJhY2tlci0+ZW5hYmxlZCA9IGZyYW1ld29yay0+ZW5hYmxlZDsKKyAgICBvYmplY3RfdHJhY2tlci0+ZGlzYWJsZWQgPSBmcmFtZXdvcmstPmRpc2FibGVkOworICAgIHRocmVhZF9jaGVja2VyLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZSA9IGZyYW1ld29yay0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgdGhyZWFkX2NoZWNrZXItPmVuYWJsZWQgPSBmcmFtZXdvcmstPmVuYWJsZWQ7CisgICAgdGhyZWFkX2NoZWNrZXItPmRpc2FibGVkID0gZnJhbWV3b3JrLT5kaXNhYmxlZDsKKyAgICBwYXJhbWV0ZXJfdmFsaWRhdGlvbi0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUgPSBmcmFtZXdvcmstPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlOworICAgIHBhcmFtZXRlcl92YWxpZGF0aW9uLT5lbmFibGVkID0gZnJhbWV3b3JrLT5lbmFibGVkOworICAgIHBhcmFtZXRlcl92YWxpZGF0aW9uLT5kaXNhYmxlZCA9IGZyYW1ld29yay0+ZGlzYWJsZWQ7CisgICAgY29yZV9jaGVja3MtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlID0gZnJhbWV3b3JrLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZTsKKyAgICBjb3JlX2NoZWNrcy0+aW5zdGFuY2UgPSAqcEluc3RhbmNlOworICAgIGNvcmVfY2hlY2tzLT5lbmFibGVkID0gZnJhbWV3b3JrLT5lbmFibGVkOworICAgIGNvcmVfY2hlY2tzLT5kaXNhYmxlZCA9IGZyYW1ld29yay0+ZGlzYWJsZWQ7CisgICAgY29yZV9jaGVja3MtPmluc3RhbmNlX3N0YXRlID0gY29yZV9jaGVja3M7CisgICAgYmVzdF9wcmFjdGljZXMtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlID0gZnJhbWV3b3JrLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZTsKKyAgICBiZXN0X3ByYWN0aWNlcy0+ZW5hYmxlZCA9IGZyYW1ld29yay0+ZW5hYmxlZDsKKyAgICBiZXN0X3ByYWN0aWNlcy0+ZGlzYWJsZWQgPSBmcmFtZXdvcmstPmRpc2FibGVkOworICAgIGdwdV9hc3Npc3RlZC0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUgPSBmcmFtZXdvcmstPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlOworICAgIGdwdV9hc3Npc3RlZC0+ZW5hYmxlZCA9IGZyYW1ld29yay0+ZW5hYmxlZDsKKyAgICBncHVfYXNzaXN0ZWQtPmRpc2FibGVkID0gZnJhbWV3b3JrLT5kaXNhYmxlZDsKKworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBmcmFtZXdvcmstPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlSW5zdGFuY2UocENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBJbnN0YW5jZUV4dGVuc2lvbldoaXRlbGlzdChmcmFtZXdvcmssIHBDcmVhdGVJbmZvLCAqcEluc3RhbmNlKTsKKyAgICBEZWFjdGl2YXRlSW5zdGFuY2VEZWJ1Z0NhbGxiYWNrcyhyZXBvcnRfZGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUluc3RhbmNlKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKTsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoa2V5LCBsYXllcl9kYXRhX21hcCk7CisgICAgQWN0aXZhdGVJbnN0YW5jZURlYnVnQ2FsbGJhY2tzKGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhKTsKKworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIHBBbGxvY2F0b3IpOworICAgIH0KKworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgcEFsbG9jYXRvcik7CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBwQWxsb2NhdG9yKTsKKyAgICB9CisKKyAgICBEZWFjdGl2YXRlSW5zdGFuY2VEZWJ1Z0NhbGxiYWNrcyhsYXllcl9kYXRhLT5yZXBvcnRfZGF0YSk7CisgICAgRnJlZVBuZXh0Q2hhaW4obGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEtPmluc3RhbmNlX3BuZXh0X2NoYWluKTsKKworICAgIGxheWVyX2RlYnVnX3V0aWxzX2Rlc3Ryb3lfaW5zdGFuY2UobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEpOworCisgICAgZm9yIChhdXRvIGl0ZW0gPSBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2guYmVnaW4oKTsgaXRlbSAhPSBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2guZW5kKCk7IGl0ZW0rKykgeworICAgICAgICBkZWxldGUgKml0ZW07CisgICAgfQorICAgIEZyZWVMYXllckRhdGFQdHIoa2V5LCBsYXllcl9kYXRhX21hcCk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBncHUsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UpIHsKKyAgICBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyAqY2hhaW5faW5mbyA9IGdldF9jaGFpbl9pbmZvKHBDcmVhdGVJbmZvLCBWS19MQVlFUl9MSU5LX0lORk8pOworCisgICAgYXV0byBpbnN0YW5jZV9pbnRlcmNlcHRvciA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGdwdSksIGxheWVyX2RhdGFfbWFwKTsKKworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBHZXRJbnN0YW5jZVByb2NBZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBmcEdldERldmljZVByb2NBZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0RGV2aWNlUHJvY0FkZHI7CisgICAgUEZOX3ZrQ3JlYXRlRGV2aWNlIGZwQ3JlYXRlRGV2aWNlID0gKFBGTl92a0NyZWF0ZURldmljZSlmcEdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmluc3RhbmNlLCAidmtDcmVhdGVEZXZpY2UiKTsKKyAgICBpZiAoZnBDcmVhdGVEZXZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKyAgICBjaGFpbl9pbmZvLT51LnBMYXllckluZm8gPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBOZXh0OworCisgICAgLy8gR2V0IHBoeXNpY2FsIGRldmljZSBsaW1pdHMgZm9yIGRldmljZQorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIGRldmljZV9wcm9wZXJ0aWVzID0ge307CisgICAgaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhncHUsICZkZXZpY2VfcHJvcGVydGllcyk7CisKKyAgICAvLyBTZXR1cCB0aGUgdmFsaWRhdGlvbiB0YWJsZXMgYmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uIEFQSSB2ZXJzaW9uIGZyb20gdGhlIGluc3RhbmNlIGFuZCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2UgZHJpdmVyCisgICAgdWludDMyX3QgZWZmZWN0aXZlX2FwaV92ZXJzaW9uID0gc3RkOjptaW4oZGV2aWNlX3Byb3BlcnRpZXMuYXBpVmVyc2lvbiwgaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmFwaV92ZXJzaW9uKTsKKworICAgIERldmljZUV4dGVuc2lvbnMgZGV2aWNlX2V4dGVuc2lvbnMgPSB7fTsKKyAgICBkZXZpY2VfZXh0ZW5zaW9ucy5Jbml0RnJvbURldmljZUNyZWF0ZUluZm8oJmluc3RhbmNlX2ludGVyY2VwdG9yLT5pbnN0YW5jZV9leHRlbnNpb25zLCBlZmZlY3RpdmVfYXBpX3ZlcnNpb24sIHBDcmVhdGVJbmZvKTsKKyAgICBmb3IgKGF1dG8gaXRlbSA6IGluc3RhbmNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgaXRlbS0+ZGV2aWNlX2V4dGVuc2lvbnMgPSBkZXZpY2VfZXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICBzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbyBtb2RpZmllZF9jcmVhdGVfaW5mbyhwQ3JlYXRlSW5mbyk7CisKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogaW5zdGFuY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGV2aWNlKGdwdSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXZpY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGluc3RhbmNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZURldmljZShncHUsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRGV2aWNlLCAmbW9kaWZpZWRfY3JlYXRlX2luZm8pOworICAgIH0KKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGZwQ3JlYXRlRGV2aWNlKGdwdSwgcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUNyZWF0ZUluZm8gKj4oJm1vZGlmaWVkX2NyZWF0ZV9pbmZvKSwgcEFsbG9jYXRvciwgcERldmljZSk7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYXV0byBkZXZpY2VfaW50ZXJjZXB0b3IgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleSgqcERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlRGV2aWNlOworCisgICAgLy8gU2F2ZSBsb2NhbCBpbmZvIGluIGRldmljZSBvYmplY3QKKyAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPnBoeXNfZGV2X3Byb3BlcnRpZXMucHJvcGVydGllcyA9IGRldmljZV9wcm9wZXJ0aWVzOworICAgIGRldmljZV9pbnRlcmNlcHRvci0+YXBpX3ZlcnNpb24gPSBkZXZpY2VfaW50ZXJjZXB0b3ItPmRldmljZV9leHRlbnNpb25zLkluaXRGcm9tRGV2aWNlQ3JlYXRlSW5mbygKKyAgICAgICAgJmluc3RhbmNlX2ludGVyY2VwdG9yLT5pbnN0YW5jZV9leHRlbnNpb25zLCBlZmZlY3RpdmVfYXBpX3ZlcnNpb24sIHBDcmVhdGVJbmZvKTsKKyAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPmRldmljZV9leHRlbnNpb25zID0gZGV2aWNlX2V4dGVuc2lvbnM7CisKKyAgICBsYXllcl9pbml0X2RldmljZV9kaXNwYXRjaF90YWJsZSgqcERldmljZSwgJmRldmljZV9pbnRlcmNlcHRvci0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLCBmcEdldERldmljZVByb2NBZGRyKTsKKworICAgIGRldmljZV9pbnRlcmNlcHRvci0+ZGV2aWNlID0gKnBEZXZpY2U7CisgICAgZGV2aWNlX2ludGVyY2VwdG9yLT5waHlzaWNhbF9kZXZpY2UgPSBncHU7CisgICAgZGV2aWNlX2ludGVyY2VwdG9yLT5pbnN0YW5jZSA9IGluc3RhbmNlX2ludGVyY2VwdG9yLT5pbnN0YW5jZTsKKyAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPnJlcG9ydF9kYXRhID0gaW5zdGFuY2VfaW50ZXJjZXB0b3ItPnJlcG9ydF9kYXRhOworCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgZGVmaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGxheWVyIHZhbGlkYXRpb24gb2JqZWN0cyBhcmUgY2FsbGVkCisgICAgYXV0byB0aHJlYWRfc2FmZXR5ID0gbmV3IFRocmVhZFNhZmV0eShyZWludGVycHJldF9jYXN0PFRocmVhZFNhZmV0eSAqPihpbnN0YW5jZV9pbnRlcmNlcHRvci0+R2V0VmFsaWRhdGlvbk9iamVjdChpbnN0YW5jZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVUaHJlYWRpbmcpKSk7CisgICAgdGhyZWFkX3NhZmV0eS0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVUaHJlYWRpbmc7CisgICAgaWYgKCFpbnN0YW5jZV9pbnRlcmNlcHRvci0+ZGlzYWJsZWQudGhyZWFkX3NhZmV0eSkgeworICAgICAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaC5lbXBsYWNlX2JhY2sodGhyZWFkX3NhZmV0eSk7CisgICAgfQorICAgIGF1dG8gc3RhdGVsZXNzX3ZhbGlkYXRpb24gPSBuZXcgU3RhdGVsZXNzVmFsaWRhdGlvbjsKKyAgICBzdGF0ZWxlc3NfdmFsaWRhdGlvbi0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVQYXJhbWV0ZXJWYWxpZGF0aW9uOworICAgIGlmICghaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmRpc2FibGVkLnN0YXRlbGVzc19jaGVja3MpIHsKKyAgICAgICAgZGV2aWNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2guZW1wbGFjZV9iYWNrKHN0YXRlbGVzc192YWxpZGF0aW9uKTsKKyAgICB9CisgICAgYXV0byBvYmplY3RfdHJhY2tlciA9IG5ldyBPYmplY3RMaWZldGltZXM7CisgICAgb2JqZWN0X3RyYWNrZXItPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlT2JqZWN0VHJhY2tlcjsKKyAgICBpZiAoIWluc3RhbmNlX2ludGVyY2VwdG9yLT5kaXNhYmxlZC5vYmplY3RfdHJhY2tpbmcpIHsKKyAgICAgICAgZGV2aWNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2guZW1wbGFjZV9iYWNrKG9iamVjdF90cmFja2VyKTsKKyAgICB9CisgICAgYXV0byBjb3JlX2NoZWNrcyA9IG5ldyBDb3JlQ2hlY2tzOworICAgIGNvcmVfY2hlY2tzLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uOworICAgIGNvcmVfY2hlY2tzLT5pbnN0YW5jZV9zdGF0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29yZUNoZWNrcyAqPigKKyAgICAgICAgY29yZV9jaGVja3MtPkdldFZhbGlkYXRpb25PYmplY3QoaW5zdGFuY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaCwgTGF5ZXJPYmplY3RUeXBlQ29yZVZhbGlkYXRpb24pKTsKKyAgICBpZiAoIWluc3RhbmNlX2ludGVyY2VwdG9yLT5kaXNhYmxlZC5jb3JlX2NoZWNrcykgeworICAgICAgICAvLyBPbmx5IGVuYWJsZSB0aGUgY29tbWFuZCBjb3VudGVycyB3aGVuIG5lZWRlZC4KKyAgICAgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2tocl9wZXJmb3JtYW5jZV9xdWVyeSkgeworICAgICAgICAgICAgYXV0byBjb21tYW5kX2NvdW50ZXIgPSBuZXcgQ29tbWFuZENvdW50ZXIoY29yZV9jaGVja3MpOworICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZURldmljZTsKKyAgICAgICAgICAgIGRldmljZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhjb21tYW5kX2NvdW50ZXIpOworICAgICAgICB9CisgICAgICAgIGRldmljZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhjb3JlX2NoZWNrcyk7CisgICAgfQorICAgIGF1dG8gYmVzdF9wcmFjdGljZXMgPSBuZXcgQmVzdFByYWN0aWNlczsKKyAgICBiZXN0X3ByYWN0aWNlcy0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVCZXN0UHJhY3RpY2VzOworICAgIGJlc3RfcHJhY3RpY2VzLT5pbnN0YW5jZV9zdGF0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8QmVzdFByYWN0aWNlcyAqPigKKyAgICAgICAgYmVzdF9wcmFjdGljZXMtPkdldFZhbGlkYXRpb25PYmplY3QoaW5zdGFuY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaCwgTGF5ZXJPYmplY3RUeXBlQmVzdFByYWN0aWNlcykpOworICAgIGlmIChpbnN0YW5jZV9pbnRlcmNlcHRvci0+ZW5hYmxlZC5iZXN0X3ByYWN0aWNlcykgeworICAgICAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaC5lbXBsYWNlX2JhY2soYmVzdF9wcmFjdGljZXMpOworICAgIH0KKyAgICBhdXRvIGdwdV9hc3Npc3RlZCA9IG5ldyBHcHVBc3Npc3RlZDsKKyAgICBncHVfYXNzaXN0ZWQtPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlR3B1QXNzaXN0ZWQ7CisgICAgZ3B1X2Fzc2lzdGVkLT5pbnN0YW5jZV9zdGF0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8R3B1QXNzaXN0ZWQgKj4oCisgICAgICAgIGdwdV9hc3Npc3RlZC0+R2V0VmFsaWRhdGlvbk9iamVjdChpbnN0YW5jZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVHcHVBc3Npc3RlZCkpOworICAgIGlmIChpbnN0YW5jZV9pbnRlcmNlcHRvci0+ZW5hYmxlZC5ncHVfdmFsaWRhdGlvbikgeworICAgICAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaC5lbXBsYWNlX2JhY2soZ3B1X2Fzc2lzdGVkKTsKKyAgICB9CisKKyAgICAvLyBTZXQgcGVyLWludGVyY2VwdCBjb21tb24gZGF0YSBpdGVtcworICAgIGZvciAoYXV0byBkZXZfaW50ZXJjZXB0IDogZGV2aWNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+ZGV2aWNlID0gKnBEZXZpY2U7CisgICAgICAgIGRldl9pbnRlcmNlcHQtPnBoeXNpY2FsX2RldmljZSA9IGdwdTsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+aW5zdGFuY2UgPSBpbnN0YW5jZV9pbnRlcmNlcHRvci0+aW5zdGFuY2U7CisgICAgICAgIGRldl9pbnRlcmNlcHQtPnJlcG9ydF9kYXRhID0gZGV2aWNlX2ludGVyY2VwdG9yLT5yZXBvcnRfZGF0YTsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlID0gZGV2aWNlX2ludGVyY2VwdG9yLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgICAgIGRldl9pbnRlcmNlcHQtPmFwaV92ZXJzaW9uID0gZGV2aWNlX2ludGVyY2VwdG9yLT5hcGlfdmVyc2lvbjsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+ZGlzYWJsZWQgPSBpbnN0YW5jZV9pbnRlcmNlcHRvci0+ZGlzYWJsZWQ7CisgICAgICAgIGRldl9pbnRlcmNlcHQtPmVuYWJsZWQgPSBpbnN0YW5jZV9pbnRlcmNlcHRvci0+ZW5hYmxlZDsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUgPSBpbnN0YW5jZV9pbnRlcmNlcHRvci0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgICAgIGRldl9pbnRlcmNlcHQtPmluc3RhbmNlX2V4dGVuc2lvbnMgPSBpbnN0YW5jZV9pbnRlcmNlcHRvci0+aW5zdGFuY2VfZXh0ZW5zaW9uczsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+ZGV2aWNlX2V4dGVuc2lvbnMgPSBkZXZpY2VfaW50ZXJjZXB0b3ItPmRldmljZV9leHRlbnNpb25zOworICAgIH0KKworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBpbnN0YW5jZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKGdwdSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXZpY2UsIHJlc3VsdCk7CisgICAgfQorCisgICAgRGV2aWNlRXh0ZW5zaW9uV2hpdGVsaXN0KGRldmljZV9pbnRlcmNlcHRvciwgcENyZWF0ZUluZm8sICpwRGV2aWNlKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBkaXNwYXRjaF9rZXkga2V5ID0gZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpOworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihrZXksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURldmljZShkZXZpY2UsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95RGV2aWNlKGRldmljZSwgcEFsbG9jYXRvcik7CisgICAgfQorCisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZXZpY2UoZGV2aWNlLCBwQWxsb2NhdG9yKTsKKworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95RGV2aWNlKGRldmljZSwgcEFsbG9jYXRvcik7CisgICAgfQorCisgICAgZm9yIChhdXRvIGl0ZW0gPSBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2guYmVnaW4oKTsgaXRlbSAhPSBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2guZW5kKCk7IGl0ZW0rKykgeworICAgICAgICBkZWxldGUgKml0ZW07CisgICAgfQorICAgIEZyZWVMYXllckRhdGFQdHIoa2V5LCBsYXllcl9kYXRhX21hcCk7Cit9CisKKworLy8gU3BlY2lhbC1jYXNlIEFQSXMgZm9yIHdoaWNoIGNvcmVfdmFsaWRhdGlvbiBuZWVkcyBjdXN0b20gcGFyYW1ldGVyIGxpc3RzIGFuZC9vciBtb2RpZmllcyBwYXJhbWV0ZXJzCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNyZWF0ZV9ncmFwaGljc19waXBlbGluZV9hcGlfc3RhdGUgY2dwbF9zdGF0ZVtMYXllck9iamVjdFR5cGVNYXhFbnVtXXt9OworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBjZ3BsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdLnBDcmVhdGVJbmZvcyA9IHBDcmVhdGVJbmZvczsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsICYoY2dwbF9zdGF0ZVtpbnRlcmNlcHQtPmNvbnRhaW5lcl90eXBlXSkpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgJihjZ3BsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdKSk7CisgICAgfQorCisgICAgYXV0byB1c2VwQ3JlYXRlSW5mb3MgPSAoIWNncGxfc3RhdGVbTGF5ZXJPYmplY3RUeXBlR3B1QXNzaXN0ZWRdLnBDcmVhdGVJbmZvcykgPyBwQ3JlYXRlSW5mb3MgOiBjZ3BsX3N0YXRlW0xheWVyT2JqZWN0VHlwZUdwdUFzc2lzdGVkXS5wQ3JlYXRlSW5mb3M7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCB1c2VwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIHJlc3VsdCwgJihjZ3BsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgQVBJIHNhdmVzIHNvbWUgY29yZV92YWxpZGF0aW9uIHBpcGVsaW5lIHN0YXRlIHN0YXRlIG9uIHRoZSBzdGFjayBmb3IgcGVyZm9ybWFuY2UgcHVycG9zZXMKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgY3JlYXRlX2NvbXB1dGVfcGlwZWxpbmVfYXBpX3N0YXRlIGNjcGxfc3RhdGVbTGF5ZXJPYmplY3RUeXBlTWF4RW51bV17fTsKKworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgY2NwbF9zdGF0ZVtpbnRlcmNlcHQtPmNvbnRhaW5lcl90eXBlXS5wQ3JlYXRlSW5mb3MgPSBwQ3JlYXRlSW5mb3M7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsICYoY2NwbF9zdGF0ZVtpbnRlcmNlcHQtPmNvbnRhaW5lcl90eXBlXSkpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzLCAmKGNjcGxfc3RhdGVbaW50ZXJjZXB0LT5jb250YWluZXJfdHlwZV0pKTsKKyAgICB9CisKKyAgICBhdXRvIHVzZXBDcmVhdGVJbmZvcyA9ICghY2NwbF9zdGF0ZVtMYXllck9iamVjdFR5cGVHcHVBc3Npc3RlZF0ucENyZWF0ZUluZm9zKSA/IHBDcmVhdGVJbmZvcyA6IGNjcGxfc3RhdGVbTGF5ZXJPYmplY3RUeXBlR3B1QXNzaXN0ZWRdLnBDcmVhdGVJbmZvczsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgdXNlcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIHJlc3VsdCwgJihjY3BsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBjcmVhdGVfcmF5X3RyYWNpbmdfcGlwZWxpbmVfYXBpX3N0YXRlIGNydHBsX3N0YXRlW0xheWVyT2JqZWN0VHlwZU1heEVudW1de307CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGNydHBsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdLnBDcmVhdGVJbmZvcyA9IHBDcmVhdGVJbmZvczsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsICYoY3J0cGxfc3RhdGVbaW50ZXJjZXB0LT5jb250YWluZXJfdHlwZV0pKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcywgJihjcnRwbF9zdGF0ZVtpbnRlcmNlcHQtPmNvbnRhaW5lcl90eXBlXSkpOworICAgIH0KKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsIHJlc3VsdCwgJihjcnRwbF9zdGF0ZVtpbnRlcmNlcHQtPmNvbnRhaW5lcl90eXBlXSkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUaGlzIEFQSSBuZWVkcyB0aGUgYWJpbGl0eSB0byBtb2RpZnkgYSBkb3duLWNoYWluIHBhcmFtZXRlcgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lTGF5b3V0KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgY3JlYXRlX3BpcGVsaW5lX2xheW91dF9hcGlfc3RhdGUgY3BsX3N0YXRle307CisgICAgY3BsX3N0YXRlLm1vZGlmaWVkX2NyZWF0ZV9pbmZvID0gKnBDcmVhdGVJbmZvOworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVMYXlvdXQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFBpcGVsaW5lTGF5b3V0KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUxheW91dCwgJmNwbF9zdGF0ZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlUGlwZWxpbmVMYXlvdXQoZGV2aWNlLCAmY3BsX3N0YXRlLm1vZGlmaWVkX2NyZWF0ZV9pbmZvLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVMYXlvdXQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVMYXlvdXQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgQVBJIG5lZWRzIHNvbWUgbG9jYWwgc3RhY2sgZGF0YSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBhbmQgYWxzbyBtYXkgbW9kaWZ5IGEgcGFyYW1ldGVyCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2hhZGVyTW9kdWxlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRlck1vZHVsZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNyZWF0ZV9zaGFkZXJfbW9kdWxlX2FwaV9zdGF0ZSBjc21fc3RhdGV7fTsKKyAgICBjc21fc3RhdGUuaW5zdHJ1bWVudGVkX2NyZWF0ZV9pbmZvID0gKnBDcmVhdGVJbmZvOworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUsICZjc21fc3RhdGUpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUsICZjc21fc3RhdGUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZVNoYWRlck1vZHVsZShkZXZpY2UsICZjc21fc3RhdGUuaW5zdHJ1bWVudGVkX2NyZWF0ZV9pbmZvLCBwQWxsb2NhdG9yLCBwU2hhZGVyTW9kdWxlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUsIHJlc3VsdCwgJmNzbV9zdGF0ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGN2ZGVzY3JpcHRvcnNldDo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEgYWRzX3N0YXRlKHBBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JTZXRDb3VudCk7CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgcEFsbG9jYXRlSW5mbywgcERlc2NyaXB0b3JTZXRzLCAmYWRzX3N0YXRlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgcEFsbG9jYXRlSW5mbywgcERlc2NyaXB0b3JTZXRzLCByZXN1bHQsICZhZHNfc3RhdGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUaGlzIEFQSSBuZWVkcyB0aGUgYWJpbGl0eSB0byBtb2RpZnkgYSBkb3duLWNoYWluIHBhcmFtZXRlcgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBjcmVhdGVfYnVmZmVyX2FwaV9zdGF0ZSBjYl9zdGF0ZXt9OworICAgIGNiX3N0YXRlLm1vZGlmaWVkX2NyZWF0ZV9pbmZvID0gKnBDcmVhdGVJbmZvOworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIsICZjYl9zdGF0ZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlQnVmZmVyKGRldmljZSwgJmNiX3N0YXRlLm1vZGlmaWVkX2NyZWF0ZV9pbmZvLCBwQWxsb2NhdG9yLCBwQnVmZmVyKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisvLyBWYWxpZGF0aW9uQ2FjaGUgQVBJcyBkbyBub3QgZGlzcGF0Y2gKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgICAgICAgIHBWYWxpZGF0aW9uQ2FjaGUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfU1VDQ0VTUzsKKworICAgIFZhbGlkYXRpb25PYmplY3QgKnZhbGlkYXRpb25fZGF0YSA9IGxheWVyX2RhdGEtPkdldFZhbGlkYXRpb25PYmplY3QobGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVDb3JlVmFsaWRhdGlvbik7CisgICAgaWYgKHZhbGlkYXRpb25fZGF0YSkgeworICAgICAgICBhdXRvIGxvY2sgPSB2YWxpZGF0aW9uX2RhdGEtPndyaXRlX2xvY2soKTsKKyAgICAgICAgcmVzdWx0ID0gdmFsaWRhdGlvbl9kYXRhLT5Db3JlTGF5ZXJDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFZhbGlkYXRpb25DYWNoZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworCisgICAgVmFsaWRhdGlvbk9iamVjdCAqdmFsaWRhdGlvbl9kYXRhID0gbGF5ZXJfZGF0YS0+R2V0VmFsaWRhdGlvbk9iamVjdChsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gsIExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uKTsKKyAgICBpZiAodmFsaWRhdGlvbl9kYXRhKSB7CisgICAgICAgIGF1dG8gbG9jayA9IHZhbGlkYXRpb25fZGF0YS0+d3JpdGVfbG9jaygpOworICAgICAgICB2YWxpZGF0aW9uX2RhdGEtPkNvcmVMYXllckRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoZGV2aWNlLCB2YWxpZGF0aW9uQ2FjaGUsIHBBbGxvY2F0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIE1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIGRzdENhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQ2FjaGVDb3VudCwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgIHBTcmNDYWNoZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfU1VDQ0VTUzsKKworICAgIFZhbGlkYXRpb25PYmplY3QgKnZhbGlkYXRpb25fZGF0YSA9IGxheWVyX2RhdGEtPkdldFZhbGlkYXRpb25PYmplY3QobGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVDb3JlVmFsaWRhdGlvbik7CisgICAgaWYgKHZhbGlkYXRpb25fZGF0YSkgeworICAgICAgICBhdXRvIGxvY2sgPSB2YWxpZGF0aW9uX2RhdGEtPndyaXRlX2xvY2soKTsKKyAgICAgICAgcmVzdWx0ID0gdmFsaWRhdGlvbl9kYXRhLT5Db3JlTGF5ZXJNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoZGV2aWNlLCBkc3RDYWNoZSwgc3JjQ2FjaGVDb3VudCwgcFNyY0NhY2hlcyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfU1VDQ0VTUzsKKworICAgIFZhbGlkYXRpb25PYmplY3QgKnZhbGlkYXRpb25fZGF0YSA9IGxheWVyX2RhdGEtPkdldFZhbGlkYXRpb25PYmplY3QobGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVDb3JlVmFsaWRhdGlvbik7CisgICAgaWYgKHZhbGlkYXRpb25fZGF0YSkgeworICAgICAgICBhdXRvIGxvY2sgPSB2YWxpZGF0aW9uX2RhdGEtPndyaXRlX2xvY2soKTsKKyAgICAgICAgcmVzdWx0ID0gdmFsaWRhdGlvbl9kYXRhLT5Db3JlTGF5ZXJHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUKGRldmljZSwgdmFsaWRhdGlvbkNhY2hlLCBwRGF0YVNpemUsIHBEYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUNvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlQ291bnQsIHBQaHlzaWNhbERldmljZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCBwUGh5c2ljYWxEZXZpY2VDb3VudCwgcFBoeXNpY2FsRGV2aWNlcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3RhbmNlLCBwUGh5c2ljYWxEZXZpY2VDb3VudCwgcFBoeXNpY2FsRGV2aWNlcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlQ291bnQsIHBQaHlzaWNhbERldmljZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqICAgICAgICAgICAgICAgICAgIHBGZWF0dXJlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMocGh5c2ljYWxEZXZpY2UsIHBGZWF0dXJlcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMocGh5c2ljYWxEZXZpY2UsIHBGZWF0dXJlcyk7CisgICAgfQorICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgZm9ybWF0LCBwRm9ybWF0UHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgZm9ybWF0LCBwRm9ybWF0UHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHR5cGUsIHRpbGluZywgdXNhZ2UsIGZsYWdzLCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHR5cGUsIHRpbGluZywgdXNhZ2UsIGZsYWdzLCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgZm9ybWF0LCB0eXBlLCB0aWxpbmcsIHVzYWdlLCBmbGFncywgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHR5cGUsIHRpbGluZywgdXNhZ2UsIGZsYWdzLCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcFByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqICAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwTWVtb3J5UHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXZpY2VRdWV1ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUluZGV4LAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldERldmljZVF1ZXVlKGRldmljZSwgcXVldWVGYW1pbHlJbmRleCwgcXVldWVJbmRleCwgcFF1ZXVlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUoZGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBxdWV1ZUluZGV4LCBwUXVldWUpOworICAgIH0KKyAgICBEaXNwYXRjaEdldERldmljZVF1ZXVlKGRldmljZSwgcXVldWVGYW1pbHlJbmRleCwgcXVldWVJbmRleCwgcFF1ZXVlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUoZGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBxdWV1ZUluZGV4LCBwUXVldWUpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFF1ZXVlU3VibWl0KAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qICAgICAgICAgICAgICAgICAgICAgICAgIHBTdWJtaXRzLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShxdWV1ZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVRdWV1ZVN1Ym1pdChxdWV1ZSwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBmZW5jZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRRdWV1ZVN1Ym1pdChxdWV1ZSwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBmZW5jZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoUXVldWVTdWJtaXQocXVldWUsIHN1Ym1pdENvdW50LCBwU3VibWl0cywgZmVuY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRRdWV1ZVN1Ym1pdChxdWV1ZSwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBmZW5jZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFF1ZXVlV2FpdElkbGUoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHF1ZXVlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVF1ZXVlV2FpdElkbGUocXVldWUpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkUXVldWVXYWl0SWRsZShxdWV1ZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoUXVldWVXYWl0SWRsZShxdWV1ZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFF1ZXVlV2FpdElkbGUocXVldWUsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBEZXZpY2VXYWl0SWRsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXZpY2VXYWl0SWRsZShkZXZpY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGV2aWNlV2FpdElkbGUoZGV2aWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hEZXZpY2VXYWl0SWRsZShkZXZpY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXZpY2VXYWl0SWRsZShkZXZpY2UsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBbGxvY2F0ZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlTWVtb3J5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZU1lbW9yeShkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZW1vcnkpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQWxsb2NhdGVNZW1vcnkoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTWVtb3J5KTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hBbGxvY2F0ZU1lbW9yeShkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZW1vcnkpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRBbGxvY2F0ZU1lbW9yeShkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZW1vcnksIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUZyZWVNZW1vcnkoZGV2aWNlLCBtZW1vcnksIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRGcmVlTWVtb3J5KGRldmljZSwgbWVtb3J5LCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hGcmVlTWVtb3J5KGRldmljZSwgbWVtb3J5LCBwQWxsb2NhdG9yKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkRnJlZU1lbW9yeShkZXZpY2UsIG1lbW9yeSwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgTWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICBWa01lbW9yeU1hcEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBEYXRhKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZU1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSwgb2Zmc2V0LCBzaXplLCBmbGFncywgcHBEYXRhKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZE1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSwgb2Zmc2V0LCBzaXplLCBmbGFncywgcHBEYXRhKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hNYXBNZW1vcnkoZGV2aWNlLCBtZW1vcnksIG9mZnNldCwgc2l6ZSwgZmxhZ3MsIHBwRGF0YSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZE1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSwgb2Zmc2V0LCBzaXplLCBmbGFncywgcHBEYXRhLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBVbm1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVVbm1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFVubWFwTWVtb3J5KGRldmljZSwgbWVtb3J5KTsKKyAgICB9CisgICAgRGlzcGF0Y2hVbm1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFVubWFwTWVtb3J5KGRldmljZSwgbWVtb3J5KTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoZGV2aWNlLCBtZW1vcnksIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudChkZXZpY2UsIG1lbW9yeSwgcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoZGV2aWNlLCBtZW1vcnksIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudChkZXZpY2UsIG1lbW9yeSwgcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRCdWZmZXJNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeShkZXZpY2UsIGJ1ZmZlciwgbWVtb3J5LCBtZW1vcnlPZmZzZXQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeShkZXZpY2UsIGJ1ZmZlciwgbWVtb3J5LCBtZW1vcnlPZmZzZXQpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlLCBidWZmZXIsIG1lbW9yeSwgbWVtb3J5T2Zmc2V0KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeShkZXZpY2UsIGJ1ZmZlciwgbWVtb3J5LCBtZW1vcnlPZmZzZXQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kSW1hZ2VNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkoZGV2aWNlLCBpbWFnZSwgbWVtb3J5LCBtZW1vcnlPZmZzZXQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQmluZEltYWdlTWVtb3J5KGRldmljZSwgaW1hZ2UsIG1lbW9yeSwgbWVtb3J5T2Zmc2V0KTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkoZGV2aWNlLCBpbWFnZSwgbWVtb3J5LCBtZW1vcnlPZmZzZXQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkoZGV2aWNlLCBpbWFnZSwgbWVtb3J5LCBtZW1vcnlPZmZzZXQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSwgYnVmZmVyLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSwgYnVmZmVyLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBidWZmZXIsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBidWZmZXIsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBpbWFnZSwgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSwgaW1hZ2UsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSwgaW1hZ2UsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGltYWdlLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBpbWFnZSwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGltYWdlLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgfQorICAgIERpc3BhdGNoR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBpbWFnZSwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGltYWdlLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgZm9ybWF0LCB0eXBlLCBzYW1wbGVzLCB1c2FnZSwgdGlsaW5nLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgZm9ybWF0LCB0eXBlLCBzYW1wbGVzLCB1c2FnZSwgdGlsaW5nLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHR5cGUsIHNhbXBsZXMsIHVzYWdlLCB0aWxpbmcsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHR5cGUsIHNhbXBsZXMsIHVzYWdlLCB0aWxpbmcsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qICAgICAgICAgICAgICAgICAgICAgcEJpbmRJbmZvLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShxdWV1ZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVRdWV1ZUJpbmRTcGFyc2UocXVldWUsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mbywgZmVuY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkUXVldWVCaW5kU3BhcnNlKHF1ZXVlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm8sIGZlbmNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hRdWV1ZUJpbmRTcGFyc2UocXVldWUsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mbywgZmVuY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRRdWV1ZUJpbmRTcGFyc2UocXVldWUsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mbywgZmVuY2UsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVGZW5jZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlRmVuY2UoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVGZW5jZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVGZW5jZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95RmVuY2UoZGV2aWNlLCBmZW5jZSwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lGZW5jZShkZXZpY2UsIGZlbmNlLCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95RmVuY2UoZGV2aWNlLCBmZW5jZSwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lGZW5jZShkZXZpY2UsIGZlbmNlLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldEZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVJlc2V0RmVuY2VzKGRldmljZSwgZmVuY2VDb3VudCwgcEZlbmNlcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRSZXNldEZlbmNlcyhkZXZpY2UsIGZlbmNlQ291bnQsIHBGZW5jZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaFJlc2V0RmVuY2VzKGRldmljZSwgZmVuY2VDb3VudCwgcEZlbmNlcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFJlc2V0RmVuY2VzKGRldmljZSwgZmVuY2VDb3VudCwgcEZlbmNlcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEZlbmNlU3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VTdGF0dXMoZGV2aWNlLCBmZW5jZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRGZW5jZVN0YXR1cyhkZXZpY2UsIGZlbmNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRGZW5jZVN0YXR1cyhkZXZpY2UsIGZlbmNlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0RmVuY2VTdGF0dXMoZGV2aWNlLCBmZW5jZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFdhaXRGb3JGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcywKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBbGwsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVdhaXRGb3JGZW5jZXMoZGV2aWNlLCBmZW5jZUNvdW50LCBwRmVuY2VzLCB3YWl0QWxsLCB0aW1lb3V0KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFdhaXRGb3JGZW5jZXMoZGV2aWNlLCBmZW5jZUNvdW50LCBwRmVuY2VzLCB3YWl0QWxsLCB0aW1lb3V0KTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hXYWl0Rm9yRmVuY2VzKGRldmljZSwgZmVuY2VDb3VudCwgcEZlbmNlcywgd2FpdEFsbCwgdGltZW91dCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFdhaXRGb3JGZW5jZXMoZGV2aWNlLCBmZW5jZUNvdW50LCBwRmVuY2VzLCB3YWl0QWxsLCB0aW1lb3V0LCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2VtYXBob3JlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVTZW1hcGhvcmUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNlbWFwaG9yZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVTZW1hcGhvcmUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNlbWFwaG9yZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlU2VtYXBob3JlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTZW1hcGhvcmUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVTZW1hcGhvcmUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNlbWFwaG9yZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNlbWFwaG9yZShkZXZpY2UsIHNlbWFwaG9yZSwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lTZW1hcGhvcmUoZGV2aWNlLCBzZW1hcGhvcmUsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lTZW1hcGhvcmUoZGV2aWNlLCBzZW1hcGhvcmUsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95U2VtYXBob3JlKGRldmljZSwgc2VtYXBob3JlLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVFdmVudChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRXZlbnQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlRXZlbnQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEV2ZW50KTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVFdmVudChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRXZlbnQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVFdmVudChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRXZlbnQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95RXZlbnQoZGV2aWNlLCBldmVudCwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lFdmVudChkZXZpY2UsIGV2ZW50LCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95RXZlbnQoZGV2aWNlLCBldmVudCwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lFdmVudChkZXZpY2UsIGV2ZW50LCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldEV2ZW50U3RhdHVzKGRldmljZSwgZXZlbnQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0RXZlbnRTdGF0dXMoZGV2aWNlLCBldmVudCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0RXZlbnRTdGF0dXMoZGV2aWNlLCBldmVudCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldEV2ZW50U3RhdHVzKGRldmljZSwgZXZlbnQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVNldEV2ZW50KGRldmljZSwgZXZlbnQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkU2V0RXZlbnQoZGV2aWNlLCBldmVudCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoU2V0RXZlbnQoZGV2aWNlLCBldmVudCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFNldEV2ZW50KGRldmljZSwgZXZlbnQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldEV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlUmVzZXRFdmVudChkZXZpY2UsIGV2ZW50KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFJlc2V0RXZlbnQoZGV2aWNlLCBldmVudCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoUmVzZXRFdmVudChkZXZpY2UsIGV2ZW50KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkUmVzZXRFdmVudChkZXZpY2UsIGV2ZW50LCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUXVlcnlQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXJ5UG9vbCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVRdWVyeVBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFF1ZXJ5UG9vbCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVRdWVyeVBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFF1ZXJ5UG9vbCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlUXVlcnlQb29sKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBRdWVyeVBvb2wpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVRdWVyeVBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFF1ZXJ5UG9vbCwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVF1ZXJ5UG9vbChkZXZpY2UsIHF1ZXJ5UG9vbCwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lRdWVyeVBvb2woZGV2aWNlLCBxdWVyeVBvb2wsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lRdWVyeVBvb2woZGV2aWNlLCBxdWVyeVBvb2wsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95UXVlcnlQb29sKGRldmljZSwgcXVlcnlQb29sLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UXVlcnlQb29sUmVzdWx0cyhkZXZpY2UsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZGF0YVNpemUsIHBEYXRhLCBzdHJpZGUsIGZsYWdzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFF1ZXJ5UG9vbFJlc3VsdHMoZGV2aWNlLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIGRhdGFTaXplLCBwRGF0YSwgc3RyaWRlLCBmbGFncyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UXVlcnlQb29sUmVzdWx0cyhkZXZpY2UsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZGF0YVNpemUsIHBEYXRhLCBzdHJpZGUsIGZsYWdzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UXVlcnlQb29sUmVzdWx0cyhkZXZpY2UsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZGF0YVNpemUsIHBEYXRhLCBzdHJpZGUsIGZsYWdzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95QnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95QnVmZmVyKGRldmljZSwgYnVmZmVyLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlcihkZXZpY2UsIGJ1ZmZlciwgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveUJ1ZmZlcihkZXZpY2UsIGJ1ZmZlciwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lCdWZmZXIoZGV2aWNlLCBidWZmZXIsIHBBbGxvY2F0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXJWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVCdWZmZXJWaWV3KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWaWV3KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZUJ1ZmZlclZpZXcoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFZpZXcpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZUJ1ZmZlclZpZXcoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFZpZXcpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVCdWZmZXJWaWV3KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWaWV3LCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95QnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlclZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lCdWZmZXJWaWV3KGRldmljZSwgYnVmZmVyVmlldywgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lCdWZmZXJWaWV3KGRldmljZSwgYnVmZmVyVmlldywgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveUJ1ZmZlclZpZXcoZGV2aWNlLCBidWZmZXJWaWV3LCBwQWxsb2NhdG9yKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlclZpZXcoZGV2aWNlLCBidWZmZXJWaWV3LCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW1hZ2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlSW1hZ2UoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEltYWdlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVJbWFnZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW1hZ2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVJbWFnZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW1hZ2UsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95SW1hZ2UoZGV2aWNlLCBpbWFnZSwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lJbWFnZShkZXZpY2UsIGltYWdlLCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95SW1hZ2UoZGV2aWNlLCBpbWFnZSwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lJbWFnZShkZXZpY2UsIGltYWdlLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UqICAgICAgICAgICAgICAgICAgIHBTdWJyZXNvdXJjZSwKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXQpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChkZXZpY2UsIGltYWdlLCBwU3VicmVzb3VyY2UsIHBMYXlvdXQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KGRldmljZSwgaW1hZ2UsIHBTdWJyZXNvdXJjZSwgcExheW91dCk7CisgICAgfQorICAgIERpc3BhdGNoR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChkZXZpY2UsIGltYWdlLCBwU3VicmVzb3VyY2UsIHBMYXlvdXQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KGRldmljZSwgaW1hZ2UsIHBTdWJyZXNvdXJjZSwgcExheW91dCk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2VWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW1hZ2VWaWV3KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWaWV3KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZUltYWdlVmlldyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmlldyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlSW1hZ2VWaWV3KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWaWV3KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VWaWV3KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWaWV3LCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95SW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95SW1hZ2VWaWV3KGRldmljZSwgaW1hZ2VWaWV3LCBwQWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGVzdHJveUltYWdlVmlldyhkZXZpY2UsIGltYWdlVmlldywgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveUltYWdlVmlldyhkZXZpY2UsIGltYWdlVmlldywgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lJbWFnZVZpZXcoZGV2aWNlLCBpbWFnZVZpZXcsIHBBbGxvY2F0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNoYWRlck1vZHVsZShkZXZpY2UsIHNoYWRlck1vZHVsZSwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lTaGFkZXJNb2R1bGUoZGV2aWNlLCBzaGFkZXJNb2R1bGUsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lTaGFkZXJNb2R1bGUoZGV2aWNlLCBzaGFkZXJNb2R1bGUsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95U2hhZGVyTW9kdWxlKGRldmljZSwgc2hhZGVyTW9kdWxlLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lQ2FjaGUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVDYWNoZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVDYWNoZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUNhY2hlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUNhY2hlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVQaXBlbGluZUNhY2hlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUNhY2hlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVDYWNoZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVDYWNoZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95UGlwZWxpbmVDYWNoZShkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVDYWNoZShkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lQaXBlbGluZUNhY2hlKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZUNhY2hlKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGlwZWxpbmVDYWNoZURhdGEoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVDYWNoZURhdGEoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwRGF0YVNpemUsIHBEYXRhKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBpcGVsaW5lQ2FjaGVEYXRhKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgcERhdGFTaXplLCBwRGF0YSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UGlwZWxpbmVDYWNoZURhdGEoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwRGF0YVNpemUsIHBEYXRhKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGlwZWxpbmVDYWNoZURhdGEoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwRGF0YVNpemUsIHBEYXRhLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgTWVyZ2VQaXBlbGluZUNhY2hlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdENhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQ2FjaGVDb3VudCwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgIHBTcmNDYWNoZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlTWVyZ2VQaXBlbGluZUNhY2hlcyhkZXZpY2UsIGRzdENhY2hlLCBzcmNDYWNoZUNvdW50LCBwU3JjQ2FjaGVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZE1lcmdlUGlwZWxpbmVDYWNoZXMoZGV2aWNlLCBkc3RDYWNoZSwgc3JjQ2FjaGVDb3VudCwgcFNyY0NhY2hlcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoTWVyZ2VQaXBlbGluZUNhY2hlcyhkZXZpY2UsIGRzdENhY2hlLCBzcmNDYWNoZUNvdW50LCBwU3JjQ2FjaGVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkTWVyZ2VQaXBlbGluZUNhY2hlcyhkZXZpY2UsIGRzdENhY2hlLCBzcmNDYWNoZUNvdW50LCBwU3JjQ2FjaGVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lKGRldmljZSwgcGlwZWxpbmUsIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmUoZGV2aWNlLCBwaXBlbGluZSwgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveVBpcGVsaW5lKGRldmljZSwgcGlwZWxpbmUsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95UGlwZWxpbmUoZGV2aWNlLCBwaXBlbGluZSwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95UGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUxheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcGlwZWxpbmVMYXlvdXQsIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVMYXlvdXQoZGV2aWNlLCBwaXBlbGluZUxheW91dCwgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcGlwZWxpbmVMYXlvdXQsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVMYXlvdXQoZGV2aWNlLCBwaXBlbGluZUxheW91dCwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVyKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNhbXBsZXIpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2FtcGxlcik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlU2FtcGxlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2FtcGxlcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNhbXBsZXIsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNhbXBsZXIoZGV2aWNlLCBzYW1wbGVyLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXIoZGV2aWNlLCBzYW1wbGVyLCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95U2FtcGxlcihkZXZpY2UsIHNhbXBsZXIsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95U2FtcGxlcihkZXZpY2UsIHNhbXBsZXIsIHBBbGxvY2F0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICBwU2V0TGF5b3V0KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNldExheW91dCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTZXRMYXlvdXQpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNldExheW91dCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNldExheW91dCwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVzY3JpcHRvclNldExheW91dChkZXZpY2UsIGRlc2NyaXB0b3JTZXRMYXlvdXQsIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclNldExheW91dChkZXZpY2UsIGRlc2NyaXB0b3JTZXRMYXlvdXQsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KGRldmljZSwgZGVzY3JpcHRvclNldExheW91dCwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KGRldmljZSwgZGVzY3JpcHRvclNldExheW91dCwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclBvb2wpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JQb29sKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JQb29sKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXNjcmlwdG9yUG9vbCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlRGVzY3JpcHRvclBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JQb29sKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JQb29sLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JQb29sKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclBvb2woZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveURlc2NyaXB0b3JQb29sKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclBvb2woZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVzZXREZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgZmxhZ3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlUmVzZXREZXNjcmlwdG9yUG9vbChkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBmbGFncyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRSZXNldERlc2NyaXB0b3JQb29sKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIGZsYWdzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hSZXNldERlc2NyaXB0b3JQb29sKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIGZsYWdzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkUmVzZXREZXNjcmlwdG9yUG9vbChkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBmbGFncywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUZyZWVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBkZXNjcmlwdG9yU2V0Q291bnQsIHBEZXNjcmlwdG9yU2V0cyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRGcmVlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgZGVzY3JpcHRvclNldENvdW50LCBwRGVzY3JpcHRvclNldHMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEZyZWVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBkZXNjcmlwdG9yU2V0Q291bnQsIHBEZXNjcmlwdG9yU2V0cyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBkZXNjcmlwdG9yU2V0Q291bnQsIHBEZXNjcmlwdG9yU2V0cywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVXBkYXRlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yQ29waWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzLCBkZXNjcmlwdG9yQ29weUNvdW50LCBwRGVzY3JpcHRvckNvcGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzLCBkZXNjcmlwdG9yQ29weUNvdW50LCBwRGVzY3JpcHRvckNvcGllcyk7CisgICAgfQorICAgIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcERlc2NyaXB0b3JXcml0ZXMsIGRlc2NyaXB0b3JDb3B5Q291bnQsIHBEZXNjcmlwdG9yQ29waWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkVXBkYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcERlc2NyaXB0b3JXcml0ZXMsIGRlc2NyaXB0b3JDb3B5Q291bnQsIHBEZXNjcmlwdG9yQ29waWVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZyYW1lYnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRnJhbWVidWZmZXIpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEZyYW1lYnVmZmVyKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRnJhbWVidWZmZXIpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRnJhbWVidWZmZXIsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZyYW1lYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95RnJhbWVidWZmZXIoZGV2aWNlLCBmcmFtZWJ1ZmZlciwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lGcmFtZWJ1ZmZlcihkZXZpY2UsIGZyYW1lYnVmZmVyLCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95RnJhbWVidWZmZXIoZGV2aWNlLCBmcmFtZWJ1ZmZlciwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lGcmFtZWJ1ZmZlcihkZXZpY2UsIGZyYW1lYnVmZmVyLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzcyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUmVuZGVyUGFzcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVSZW5kZXJQYXNzKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVSZW5kZXJQYXNzKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzcyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUmVuZGVyUGFzcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95UmVuZGVyUGFzcyhkZXZpY2UsIHJlbmRlclBhc3MsIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95UmVuZGVyUGFzcyhkZXZpY2UsIHJlbmRlclBhc3MsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lSZW5kZXJQYXNzKGRldmljZSwgcmVuZGVyUGFzcywgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lSZW5kZXJQYXNzKGRldmljZSwgcmVuZGVyUGFzcywgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFJlbmRlckFyZWFHcmFudWxhcml0eShkZXZpY2UsIHJlbmRlclBhc3MsIHBHcmFudWxhcml0eSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFJlbmRlckFyZWFHcmFudWxhcml0eShkZXZpY2UsIHJlbmRlclBhc3MsIHBHcmFudWxhcml0eSk7CisgICAgfQorICAgIERpc3BhdGNoR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5KGRldmljZSwgcmVuZGVyUGFzcywgcEdyYW51bGFyaXR5KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5KGRldmljZSwgcmVuZGVyUGFzcywgcEdyYW51bGFyaXR5KTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kUG9vbCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21tYW5kUG9vbChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ29tbWFuZFBvb2wpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlQ29tbWFuZFBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcENvbW1hbmRQb29sKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVDb21tYW5kUG9vbChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ29tbWFuZFBvb2wpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVDb21tYW5kUG9vbChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ29tbWFuZFBvb2wsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95Q29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lDb21tYW5kUG9vbChkZXZpY2UsIGNvbW1hbmRQb29sLCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95Q29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lDb21tYW5kUG9vbChkZXZpY2UsIGNvbW1hbmRQb29sLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldENvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVSZXNldENvbW1hbmRQb29sKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFJlc2V0Q29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaFJlc2V0Q29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRSZXNldENvbW1hbmRQb29sKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWxsb2NhdGVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVDb21tYW5kQnVmZmVycyhkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBDb21tYW5kQnVmZmVycyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgcEFsbG9jYXRlSW5mbywgcENvbW1hbmRCdWZmZXJzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgcEFsbG9jYXRlSW5mbywgcENvbW1hbmRCdWZmZXJzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQWxsb2NhdGVDb21tYW5kQnVmZmVycyhkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBDb21tYW5kQnVmZmVycywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRnJlZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRnJlZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgY29tbWFuZFBvb2wsIGNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRnJlZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgY29tbWFuZFBvb2wsIGNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hGcmVlQ29tbWFuZEJ1ZmZlcnMoZGV2aWNlLCBjb21tYW5kUG9vbCwgY29tbWFuZEJ1ZmZlckNvdW50LCBwQ29tbWFuZEJ1ZmZlcnMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRGcmVlQ29tbWFuZEJ1ZmZlcnMoZGV2aWNlLCBjb21tYW5kUG9vbCwgY29tbWFuZEJ1ZmZlckNvdW50LCBwQ29tbWFuZEJ1ZmZlcnMpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJlZ2luQ29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiAgICAgICAgICAgICBwQmVnaW5JbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlciwgcEJlZ2luSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlciwgcEJlZ2luSW5mbyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIsIHBCZWdpbkluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlciwgcEJlZ2luSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRW5kQ29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICAgZmxhZ3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVJlc2V0Q29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBmbGFncyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRSZXNldENvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlciwgZmxhZ3MpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaFJlc2V0Q29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBmbGFncyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFJlc2V0Q29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBmbGFncywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZFBpcGVsaW5lKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZEJpbmRQaXBlbGluZShjb21tYW5kQnVmZmVyLCBwaXBlbGluZUJpbmRQb2ludCwgcGlwZWxpbmUpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRCaW5kUGlwZWxpbmUoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIHBpcGVsaW5lKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRCaW5kUGlwZWxpbmUoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIHBpcGVsaW5lKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kQmluZFBpcGVsaW5lKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBwaXBlbGluZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRWaWV3cG9ydCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3cG9ydHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0KGNvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBWaWV3cG9ydHMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydChjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXRWaWV3cG9ydChjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kU2V0Vmlld3BvcnQoY29tbWFuZEJ1ZmZlciwgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRDb3VudCwgcFZpZXdwb3J0cyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRTY2lzc29yKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2lzc29ycykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0U2Npc3Nvcihjb21tYW5kQnVmZmVyLCBmaXJzdFNjaXNzb3IsIHNjaXNzb3JDb3VudCwgcFNjaXNzb3JzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0U2Npc3Nvcihjb21tYW5kQnVmZmVyLCBmaXJzdFNjaXNzb3IsIHNjaXNzb3JDb3VudCwgcFNjaXNzb3JzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXRTY2lzc29yKGNvbW1hbmRCdWZmZXIsIGZpcnN0U2Npc3Nvciwgc2Npc3NvckNvdW50LCBwU2Npc3NvcnMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRTZXRTY2lzc29yKGNvbW1hbmRCdWZmZXIsIGZpcnN0U2Npc3Nvciwgc2Npc3NvckNvdW50LCBwU2Npc3NvcnMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0TGluZVdpZHRoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVdpZHRoKGNvbW1hbmRCdWZmZXIsIGxpbmVXaWR0aCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZFNldExpbmVXaWR0aChjb21tYW5kQnVmZmVyLCBsaW5lV2lkdGgpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldExpbmVXaWR0aChjb21tYW5kQnVmZmVyLCBsaW5lV2lkdGgpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRTZXRMaW5lV2lkdGgoY29tbWFuZEJ1ZmZlciwgbGluZVdpZHRoKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldERlcHRoQmlhcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NsYW1wLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFNldERlcHRoQmlhcyhjb21tYW5kQnVmZmVyLCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZGVwdGhCaWFzQ2xhbXAsIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0RGVwdGhCaWFzKGNvbW1hbmRCdWZmZXIsIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBkZXB0aEJpYXNDbGFtcCwgZGVwdGhCaWFzU2xvcGVGYWN0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldERlcHRoQmlhcyhjb21tYW5kQnVmZmVyLCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZGVwdGhCaWFzQ2xhbXAsIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kU2V0RGVwdGhCaWFzKGNvbW1hbmRCdWZmZXIsIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBkZXB0aEJpYXNDbGFtcCwgZGVwdGhCaWFzU2xvcGVGYWN0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFNldEJsZW5kQ29uc3RhbnRzKGNvbW1hbmRCdWZmZXIsIGJsZW5kQ29uc3RhbnRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0QmxlbmRDb25zdGFudHMoY29tbWFuZEJ1ZmZlciwgYmxlbmRDb25zdGFudHMpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldEJsZW5kQ29uc3RhbnRzKGNvbW1hbmRCdWZmZXIsIGJsZW5kQ29uc3RhbnRzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kU2V0QmxlbmRDb25zdGFudHMoY29tbWFuZEJ1ZmZlciwgYmxlbmRDb25zdGFudHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RGVwdGhCb3VuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRGVwdGhCb3VuZHMsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEZXB0aEJvdW5kcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGVwdGhCb3VuZHMoY29tbWFuZEJ1ZmZlciwgbWluRGVwdGhCb3VuZHMsIG1heERlcHRoQm91bmRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0RGVwdGhCb3VuZHMoY29tbWFuZEJ1ZmZlciwgbWluRGVwdGhCb3VuZHMsIG1heERlcHRoQm91bmRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXREZXB0aEJvdW5kcyhjb21tYW5kQnVmZmVyLCBtaW5EZXB0aEJvdW5kcywgbWF4RGVwdGhCb3VuZHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRTZXREZXB0aEJvdW5kcyhjb21tYW5kQnVmZmVyLCBtaW5EZXB0aEJvdW5kcywgbWF4RGVwdGhCb3VuZHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hc2spIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhjb21tYW5kQnVmZmVyLCBmYWNlTWFzaywgY29tcGFyZU1hc2spOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIGNvbXBhcmVNYXNrKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIGNvbXBhcmVNYXNrKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKGNvbW1hbmRCdWZmZXIsIGZhY2VNYXNrLCBjb21wYXJlTWFzayk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKGNvbW1hbmRCdWZmZXIsIGZhY2VNYXNrLCB3cml0ZU1hc2spOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKGNvbW1hbmRCdWZmZXIsIGZhY2VNYXNrLCB3cml0ZU1hc2spOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldFN0ZW5jaWxXcml0ZU1hc2soY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIHdyaXRlTWFzayk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFNldFN0ZW5jaWxXcml0ZU1hc2soY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIHdyaXRlTWFzayk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKGNvbW1hbmRCdWZmZXIsIGZhY2VNYXNrLCByZWZlcmVuY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKGNvbW1hbmRCdWZmZXIsIGZhY2VNYXNrLCByZWZlcmVuY2UpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldFN0ZW5jaWxSZWZlcmVuY2UoY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIHJlZmVyZW5jZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFNldFN0ZW5jaWxSZWZlcmVuY2UoY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIHJlZmVyZW5jZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCaW5kRGVzY3JpcHRvclNldHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNPZmZzZXRDb3VudCwKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEeW5hbWljT2Zmc2V0cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kQmluZERlc2NyaXB0b3JTZXRzKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIGZpcnN0U2V0LCBkZXNjcmlwdG9yU2V0Q291bnQsIHBEZXNjcmlwdG9yU2V0cywgZHluYW1pY09mZnNldENvdW50LCBwRHluYW1pY09mZnNldHMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRCaW5kRGVzY3JpcHRvclNldHMoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIGxheW91dCwgZmlyc3RTZXQsIGRlc2NyaXB0b3JTZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzLCBkeW5hbWljT2Zmc2V0Q291bnQsIHBEeW5hbWljT2Zmc2V0cyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kQmluZERlc2NyaXB0b3JTZXRzKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIGZpcnN0U2V0LCBkZXNjcmlwdG9yU2V0Q291bnQsIHBEZXNjcmlwdG9yU2V0cywgZHluYW1pY09mZnNldENvdW50LCBwRHluYW1pY09mZnNldHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRCaW5kRGVzY3JpcHRvclNldHMoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIGxheW91dCwgZmlyc3RTZXQsIGRlc2NyaXB0b3JTZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzLCBkeW5hbWljT2Zmc2V0Q291bnQsIHBEeW5hbWljT2Zmc2V0cyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCaW5kSW5kZXhCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrSW5kZXhUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhUeXBlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRCaW5kSW5kZXhCdWZmZXIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGluZGV4VHlwZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZEJpbmRJbmRleEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgaW5kZXhUeXBlKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRCaW5kSW5kZXhCdWZmZXIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGluZGV4VHlwZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEJpbmRJbmRleEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgaW5kZXhUeXBlKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZEJpbmRWZXJ0ZXhCdWZmZXJzKGNvbW1hbmRCdWZmZXIsIGZpcnN0QmluZGluZywgYmluZGluZ0NvdW50LCBwQnVmZmVycywgcE9mZnNldHMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRCaW5kVmVydGV4QnVmZmVycyhjb21tYW5kQnVmZmVyLCBmaXJzdEJpbmRpbmcsIGJpbmRpbmdDb3VudCwgcEJ1ZmZlcnMsIHBPZmZzZXRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRCaW5kVmVydGV4QnVmZmVycyhjb21tYW5kQnVmZmVyLCBmaXJzdEJpbmRpbmcsIGJpbmRpbmdDb3VudCwgcEJ1ZmZlcnMsIHBPZmZzZXRzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kQmluZFZlcnRleEJ1ZmZlcnMoY29tbWFuZEJ1ZmZlciwgZmlyc3RCaW5kaW5nLCBiaW5kaW5nQ291bnQsIHBCdWZmZXJzLCBwT2Zmc2V0cyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmVydGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kRHJhdyhjb21tYW5kQnVmZmVyLCB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RWZXJ0ZXgsIGZpcnN0SW5zdGFuY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWREcmF3KGNvbW1hbmRCdWZmZXIsIHZlcnRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleCwgZmlyc3RJbnN0YW5jZSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRHJhdyhjb21tYW5kQnVmZmVyLCB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RWZXJ0ZXgsIGZpcnN0SW5zdGFuY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWREcmF3KGNvbW1hbmRCdWZmZXIsIHZlcnRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleCwgZmlyc3RJbnN0YW5jZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kZXhlZCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXgsCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZChjb21tYW5kQnVmZmVyLCBpbmRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdEluZGV4LCB2ZXJ0ZXhPZmZzZXQsIGZpcnN0SW5zdGFuY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZChjb21tYW5kQnVmZmVyLCBpbmRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdEluZGV4LCB2ZXJ0ZXhPZmZzZXQsIGZpcnN0SW5zdGFuY2UpOworICAgIH0KKyAgICBEaXNwYXRjaENtZERyYXdJbmRleGVkKGNvbW1hbmRCdWZmZXIsIGluZGV4Q291bnQsIGluc3RhbmNlQ291bnQsIGZpcnN0SW5kZXgsIHZlcnRleE9mZnNldCwgZmlyc3RJbnN0YW5jZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERyYXdJbmRleGVkKGNvbW1hbmRCdWZmZXIsIGluZGV4Q291bnQsIGluc3RhbmNlQ291bnQsIGZpcnN0SW5kZXgsIHZlcnRleE9mZnNldCwgZmlyc3RJbnN0YW5jZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRHJhd0luZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkSW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworICAgIH0KKyAgICBEaXNwYXRjaENtZERyYXdJbmRleGVkSW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRGlzcGF0Y2goCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaChjb21tYW5kQnVmZmVyLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRGlzcGF0Y2goY29tbWFuZEJ1ZmZlciwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisgICAgfQorICAgIERpc3BhdGNoQ21kRGlzcGF0Y2goY29tbWFuZEJ1ZmZlciwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERpc3BhdGNoKGNvbW1hbmRCdWZmZXIsIGdyb3VwQ291bnRYLCBncm91cENvdW50WSwgZ3JvdXBDb3VudFopOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRGlzcGF0Y2hJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoSW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEluZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0KTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWREaXNwYXRjaEluZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kRGlzcGF0Y2hJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDb3B5QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZENvcHlCdWZmZXIoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RCdWZmZXIsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZENvcHlCdWZmZXIoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RCdWZmZXIsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kQ29weUJ1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZENvcHlJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kQ29weUltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworICAgIH0KKyAgICBEaXNwYXRjaENtZENvcHlJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kQ29weUltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmxpdEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZUJsaXQqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucywKKyAgICBWa0ZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kQmxpdEltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMsIGZpbHRlcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZEJsaXRJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zLCBmaWx0ZXIpOworICAgIH0KKyAgICBEaXNwYXRjaENtZEJsaXRJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zLCBmaWx0ZXIpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRCbGl0SW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucywgZmlsdGVyKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlCdWZmZXJUb0ltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRDb3B5QnVmZmVyVG9JbWFnZShjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlclRvSW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kQ29weUJ1ZmZlclRvSW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZENvcHlCdWZmZXJUb0ltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0J1ZmZlciwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ29weUltYWdlVG9CdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZENvcHlJbWFnZVRvQnVmZmVyKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0QnVmZmVyLCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2VUb0J1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRDb3B5SW1hZ2VUb0J1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kQ29weUltYWdlVG9CdWZmZXIoY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RCdWZmZXIsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRVcGRhdGVCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kVXBkYXRlQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBkYXRhU2l6ZSwgcERhdGEpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRVcGRhdGVCdWZmZXIoY29tbWFuZEJ1ZmZlciwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIGRhdGFTaXplLCBwRGF0YSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kVXBkYXRlQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBkYXRhU2l6ZSwgcERhdGEpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRVcGRhdGVCdWZmZXIoY29tbWFuZEJ1ZmZlciwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIGRhdGFTaXplLCBwRGF0YSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRGaWxsQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRGaWxsQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBzaXplLCBkYXRhKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRmlsbEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc2l6ZSwgZGF0YSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRmlsbEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc2l6ZSwgZGF0YSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEZpbGxCdWZmZXIoY29tbWFuZEJ1ZmZlciwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIHNpemUsIGRhdGEpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ2xlYXJDb2xvckltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUqICAgICAgICAgICAgICAgICAgICBwQ29sb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiAgICAgICAgICAgICAgcFJhbmdlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kQ2xlYXJDb2xvckltYWdlKGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcENvbG9yLCByYW5nZUNvdW50LCBwUmFuZ2VzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kQ2xlYXJDb2xvckltYWdlKGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcENvbG9yLCByYW5nZUNvdW50LCBwUmFuZ2VzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRDbGVhckNvbG9ySW1hZ2UoY29tbWFuZEJ1ZmZlciwgaW1hZ2UsIGltYWdlTGF5b3V0LCBwQ29sb3IsIHJhbmdlQ291bnQsIHBSYW5nZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRDbGVhckNvbG9ySW1hZ2UoY29tbWFuZEJ1ZmZlciwgaW1hZ2UsIGltYWdlTGF5b3V0LCBwQ29sb3IsIHJhbmdlQ291bnQsIHBSYW5nZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSogICAgICAgICAgICAgcERlcHRoU3RlbmNpbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcERlcHRoU3RlbmNpbCwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoY29tbWFuZEJ1ZmZlciwgaW1hZ2UsIGltYWdlTGF5b3V0LCBwRGVwdGhTdGVuY2lsLCByYW5nZUNvdW50LCBwUmFuZ2VzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcERlcHRoU3RlbmNpbCwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoY29tbWFuZEJ1ZmZlciwgaW1hZ2UsIGltYWdlTGF5b3V0LCBwRGVwdGhTdGVuY2lsLCByYW5nZUNvdW50LCBwUmFuZ2VzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENsZWFyQXR0YWNobWVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRDbGVhckF0dGFjaG1lbnRzKGNvbW1hbmRCdWZmZXIsIGF0dGFjaG1lbnRDb3VudCwgcEF0dGFjaG1lbnRzLCByZWN0Q291bnQsIHBSZWN0cyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZENsZWFyQXR0YWNobWVudHMoY29tbWFuZEJ1ZmZlciwgYXR0YWNobWVudENvdW50LCBwQXR0YWNobWVudHMsIHJlY3RDb3VudCwgcFJlY3RzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRDbGVhckF0dGFjaG1lbnRzKGNvbW1hbmRCdWZmZXIsIGF0dGFjaG1lbnRDb3VudCwgcEF0dGFjaG1lbnRzLCByZWN0Q291bnQsIHBSZWN0cyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZENsZWFyQXR0YWNobWVudHMoY29tbWFuZEJ1ZmZlciwgYXR0YWNobWVudENvdW50LCBwQXR0YWNobWVudHMsIHJlY3RDb3VudCwgcFJlY3RzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFJlc29sdmVJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFJlc29sdmVJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kUmVzb2x2ZUltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFJlc29sdmVJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kUmVzb2x2ZUltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RXZlbnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFNldEV2ZW50KGNvbW1hbmRCdWZmZXIsIGV2ZW50LCBzdGFnZU1hc2spOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRFdmVudChjb21tYW5kQnVmZmVyLCBldmVudCwgc3RhZ2VNYXNrKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXRFdmVudChjb21tYW5kQnVmZmVyLCBldmVudCwgc3RhZ2VNYXNrKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kU2V0RXZlbnQoY29tbWFuZEJ1ZmZlciwgZXZlbnQsIHN0YWdlTWFzayk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRSZXNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VNYXNrKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRSZXNldEV2ZW50KGNvbW1hbmRCdWZmZXIsIGV2ZW50LCBzdGFnZU1hc2spOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRSZXNldEV2ZW50KGNvbW1hbmRCdWZmZXIsIGV2ZW50LCBzdGFnZU1hc2spOworICAgIH0KKyAgICBEaXNwYXRjaENtZFJlc2V0RXZlbnQoY29tbWFuZEJ1ZmZlciwgZXZlbnQsIHN0YWdlTWFzayk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFJlc2V0RXZlbnQoY29tbWFuZEJ1ZmZlciwgZXZlbnQsIHN0YWdlTWFzayk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRXYWl0RXZlbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQsCisgICAgY29uc3QgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRzLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RhZ2VNYXNrLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICBwSW1hZ2VNZW1vcnlCYXJyaWVycykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kV2FpdEV2ZW50cyhjb21tYW5kQnVmZmVyLCBldmVudENvdW50LCBwRXZlbnRzLCBzcmNTdGFnZU1hc2ssIGRzdFN0YWdlTWFzaywgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRXYWl0RXZlbnRzKGNvbW1hbmRCdWZmZXIsIGV2ZW50Q291bnQsIHBFdmVudHMsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kV2FpdEV2ZW50cyhjb21tYW5kQnVmZmVyLCBldmVudENvdW50LCBwRXZlbnRzLCBzcmNTdGFnZU1hc2ssIGRzdFN0YWdlTWFzaywgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRXYWl0RXZlbnRzKGNvbW1hbmRCdWZmZXIsIGV2ZW50Q291bnQsIHBFdmVudHMsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRQaXBlbGluZUJhcnJpZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RhZ2VNYXNrLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgIFZrRGVwZW5kZW5jeUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUZsYWdzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICBwSW1hZ2VNZW1vcnlCYXJyaWVycykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRCdWZmZXIsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBkZXBlbmRlbmN5RmxhZ3MsIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRCdWZmZXIsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBkZXBlbmRlbmN5RmxhZ3MsIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRQaXBlbGluZUJhcnJpZXIoY29tbWFuZEJ1ZmZlciwgc3JjU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIGRlcGVuZGVuY3lGbGFncywgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRQaXBlbGluZUJhcnJpZXIoY29tbWFuZEJ1ZmZlciwgc3JjU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIGRlcGVuZGVuY3lGbGFncywgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5RdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRCZWdpblF1ZXJ5KGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnksIGZsYWdzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kQmVnaW5RdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5LCBmbGFncyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kQmVnaW5RdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5LCBmbGFncyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEJlZ2luUXVlcnkoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgZmxhZ3MpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZEVuZFF1ZXJ5KGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnkpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRFbmRRdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5KTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRFbmRRdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kRW5kUXVlcnkoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kUmVzZXRRdWVyeVBvb2woY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kUmVzZXRRdWVyeVBvb2woY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRSZXNldFF1ZXJ5UG9vbChjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRSZXNldFF1ZXJ5UG9vbChjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRXcml0ZVRpbWVzdGFtcChjb21tYW5kQnVmZmVyLCBwaXBlbGluZVN0YWdlLCBxdWVyeVBvb2wsIHF1ZXJ5KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kV3JpdGVUaW1lc3RhbXAoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVTdGFnZSwgcXVlcnlQb29sLCBxdWVyeSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kV3JpdGVUaW1lc3RhbXAoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVTdGFnZSwgcXVlcnlQb29sLCBxdWVyeSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFdyaXRlVGltZXN0YW1wKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lU3RhZ2UsIHF1ZXJ5UG9vbCwgcXVlcnkpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc3RyaWRlLCBmbGFncyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIHN0cmlkZSwgZmxhZ3MpOworICAgIH0KKyAgICBEaXNwYXRjaENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIHN0cmlkZSwgZmxhZ3MpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyhjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBzdHJpZGUsIGZsYWdzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFB1c2hDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIFZrU2hhZGVyU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRQdXNoQ29uc3RhbnRzKGNvbW1hbmRCdWZmZXIsIGxheW91dCwgc3RhZ2VGbGFncywgb2Zmc2V0LCBzaXplLCBwVmFsdWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kUHVzaENvbnN0YW50cyhjb21tYW5kQnVmZmVyLCBsYXlvdXQsIHN0YWdlRmxhZ3MsIG9mZnNldCwgc2l6ZSwgcFZhbHVlcyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kUHVzaENvbnN0YW50cyhjb21tYW5kQnVmZmVyLCBsYXlvdXQsIHN0YWdlRmxhZ3MsIG9mZnNldCwgc2l6ZSwgcFZhbHVlcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFB1c2hDb25zdGFudHMoY29tbWFuZEJ1ZmZlciwgbGF5b3V0LCBzdGFnZUZsYWdzLCBvZmZzZXQsIHNpemUsIHBWYWx1ZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5SZW5kZXJQYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5SZW5kZXJQYXNzKGNvbW1hbmRCdWZmZXIsIHBSZW5kZXJQYXNzQmVnaW4sIGNvbnRlbnRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzKGNvbW1hbmRCdWZmZXIsIHBSZW5kZXJQYXNzQmVnaW4sIGNvbnRlbnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgY29udGVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgY29udGVudHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kTmV4dFN1YnBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZE5leHRTdWJwYXNzKGNvbW1hbmRCdWZmZXIsIGNvbnRlbnRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kTmV4dFN1YnBhc3MoY29tbWFuZEJ1ZmZlciwgY29udGVudHMpOworICAgIH0KKyAgICBEaXNwYXRjaENtZE5leHRTdWJwYXNzKGNvbW1hbmRCdWZmZXIsIGNvbnRlbnRzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kTmV4dFN1YnBhc3MoY29tbWFuZEJ1ZmZlciwgY29udGVudHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZEVuZFJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZEVuZFJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlcik7CisgICAgfQorICAgIERpc3BhdGNoQ21kRW5kUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEV4ZWN1dGVDb21tYW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZEV4ZWN1dGVDb21tYW5kcyhjb21tYW5kQnVmZmVyLCBjb21tYW5kQnVmZmVyQ291bnQsIHBDb21tYW5kQnVmZmVycyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZEV4ZWN1dGVDb21tYW5kcyhjb21tYW5kQnVmZmVyLCBjb21tYW5kQnVmZmVyQ291bnQsIHBDb21tYW5kQnVmZmVycyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRXhlY3V0ZUNvbW1hbmRzKGNvbW1hbmRCdWZmZXIsIGNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kRXhlY3V0ZUNvbW1hbmRzKGNvbW1hbmRCdWZmZXIsIGNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzKTsKKyAgICB9Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyKGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQmluZEJ1ZmZlck1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmluZEltYWdlTWVtb3J5MigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiAgICAgICAgICAgICAgICBwQmluZEluZm9zKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkyKGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoZGV2aWNlLCBoZWFwSW5kZXgsIGxvY2FsRGV2aWNlSW5kZXgsIHJlbW90ZURldmljZUluZGV4LCBwUGVlck1lbW9yeUZlYXR1cmVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoZGV2aWNlLCBoZWFwSW5kZXgsIGxvY2FsRGV2aWNlSW5kZXgsIHJlbW90ZURldmljZUluZGV4LCBwUGVlck1lbW9yeUZlYXR1cmVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyhkZXZpY2UsIGhlYXBJbmRleCwgbG9jYWxEZXZpY2VJbmRleCwgcmVtb3RlRGV2aWNlSW5kZXgsIHBQZWVyTWVtb3J5RmVhdHVyZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyhkZXZpY2UsIGhlYXBJbmRleCwgbG9jYWxEZXZpY2VJbmRleCwgcmVtb3RlRGV2aWNlSW5kZXgsIHBQZWVyTWVtb3J5RmVhdHVyZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RGV2aWNlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRTZXREZXZpY2VNYXNrKGNvbW1hbmRCdWZmZXIsIGRldmljZU1hc2spOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXREZXZpY2VNYXNrKGNvbW1hbmRCdWZmZXIsIGRldmljZU1hc2spOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldERldmljZU1hc2soY29tbWFuZEJ1ZmZlciwgZGV2aWNlTWFzayk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFNldERldmljZU1hc2soY29tbWFuZEJ1ZmZlciwgZGV2aWNlTWFzayk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaEJhc2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEJhc2UoY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZERpc3BhdGNoQmFzZShjb21tYW5kQnVmZmVyLCBiYXNlR3JvdXBYLCBiYXNlR3JvdXBZLCBiYXNlR3JvdXBaLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWREaXNwYXRjaEJhc2UoY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERpc3BhdGNoQmFzZShjb21tYW5kQnVmZmVyLCBiYXNlR3JvdXBYLCBiYXNlR3JvdXBZLCBiYXNlR3JvdXBaLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKGluc3RhbmNlLCBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoaW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoaW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKGluc3RhbmNlLCBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKGRldmljZSwgcEluZm8sIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKGRldmljZSwgcEluZm8sIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoZGV2aWNlLCBwSW5mbywgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoZGV2aWNlLCBwSW5mbywgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiAgICAgICAgICAgICAgICAgIHBGZWF0dXJlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKHBoeXNpY2FsRGV2aWNlLCBwRmVhdHVyZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMihwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMihwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIocGh5c2ljYWxEZXZpY2UsIHBGZWF0dXJlcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcFByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcFByb3BlcnRpZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHBGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgZm9ybWF0LCBwRm9ybWF0UHJvcGVydGllcyk7CisgICAgfQorICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgZm9ybWF0LCBwRm9ybWF0UHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKHBoeXNpY2FsRGV2aWNlLCBwSW1hZ2VGb3JtYXRJbmZvLCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcEZvcm1hdEluZm8sIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcEZvcm1hdEluZm8sIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKHBoeXNpY2FsRGV2aWNlLCBwRm9ybWF0SW5mbywgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKHBoeXNpY2FsRGV2aWNlLCBwRm9ybWF0SW5mbywgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFRyaW1Db21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlVHJpbUNvbW1hbmRQb29sKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkVHJpbUNvbW1hbmRQb29sKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hUcmltQ29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRUcmltQ29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlUXVldWUyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlSW5mbywKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VRdWV1ZTIoZGV2aWNlLCBwUXVldWVJbmZvLCBwUXVldWUpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXREZXZpY2VRdWV1ZTIoZGV2aWNlLCBwUXVldWVJbmZvLCBwUXVldWUpOworICAgIH0KKyAgICBEaXNwYXRjaEdldERldmljZVF1ZXVlMihkZXZpY2UsIHBRdWV1ZUluZm8sIHBRdWV1ZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlMihkZXZpY2UsIHBRdWV1ZUluZm8sIHBRdWV1ZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwWWNiY3JDb252ZXJzaW9uKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFljYmNyQ29udmVyc2lvbik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwWWNiY3JDb252ZXJzaW9uKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwWWNiY3JDb252ZXJzaW9uLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oZGV2aWNlLCB5Y2JjckNvbnZlcnNpb24sIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbihkZXZpY2UsIHljYmNyQ29udmVyc2lvbiwgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oZGV2aWNlLCB5Y2JjckNvbnZlcnNpb24sIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbihkZXZpY2UsIHljYmNyQ29udmVyc2lvbiwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShkZXZpY2UsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShkZXZpY2UsIGRlc2NyaXB0b3JTZXQsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcERhdGEpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwRGF0YSk7CisgICAgfQorICAgIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShkZXZpY2UsIGRlc2NyaXB0b3JTZXQsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcERhdGEpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwRGF0YSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qICAgcEV4dGVybmFsQnVmZmVySW5mbywKKyAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcEV4dGVybmFsQnVmZmVySW5mbywgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcEV4dGVybmFsQnVmZmVySW5mbywgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEZlbmNlSW5mbywgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcEV4dGVybmFsRmVuY2VJbmZvLCBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEZlbmNlSW5mbywgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcEV4dGVybmFsRmVuY2VJbmZvLCBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KGRldmljZSwgcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcFN1cHBvcnQpOworICAgIH0KKyAgICBEaXNwYXRjaEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KGRldmljZSwgcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcFN1cHBvcnQpOworICAgIH0KK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95U3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95U3VyZmFjZUtIUihpbnN0YW5jZSwgc3VyZmFjZSwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lTdXJmYWNlS0hSKGluc3RhbmNlLCBzdXJmYWNlLCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95U3VyZmFjZUtIUihpbnN0YW5jZSwgc3VyZmFjZSwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lTdXJmYWNlS0hSKGluc3RhbmNlLCBzdXJmYWNlLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0Jvb2wzMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBzdXJmYWNlLCBwU3VwcG9ydGVkKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHN1cmZhY2UsIHBTdXBwb3J0ZWQpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHN1cmZhY2UsIHBTdXBwb3J0ZWQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBzdXJmYWNlLCBwU3VwcG9ydGVkLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgVmtTdXJmYWNlRm9ybWF0S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFN1cmZhY2VGb3JtYXRDb3VudCwgcFN1cmZhY2VGb3JtYXRzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBQcmVzZW50TW9kZUNvdW50LCBwUHJlc2VudE1vZGVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFByZXNlbnRNb2RlQ291bnQsIHBQcmVzZW50TW9kZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFByZXNlbnRNb2RlQ291bnQsIHBQcmVzZW50TW9kZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBQcmVzZW50TW9kZUNvdW50LCBwUHJlc2VudE1vZGVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVTd2FwY2hhaW5LSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN3YXBjaGFpbik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95U3dhcGNoYWluS0hSKGRldmljZSwgc3dhcGNoYWluLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGVzdHJveVN3YXBjaGFpbktIUihkZXZpY2UsIHN3YXBjaGFpbiwgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveVN3YXBjaGFpbktIUihkZXZpY2UsIHN3YXBjaGFpbiwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lTd2FwY2hhaW5LSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBBbGxvY2F0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFN3YXBjaGFpbkltYWdlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBwU3dhcGNoYWluSW1hZ2VzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFN3YXBjaGFpbkltYWdlc0tIUihkZXZpY2UsIHN3YXBjaGFpbiwgcFN3YXBjaGFpbkltYWdlQ291bnQsIHBTd2FwY2hhaW5JbWFnZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFN3YXBjaGFpbkltYWdlc0tIUihkZXZpY2UsIHN3YXBjaGFpbiwgcFN3YXBjaGFpbkltYWdlQ291bnQsIHBTd2FwY2hhaW5JbWFnZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBwU3dhcGNoYWluSW1hZ2VzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUFjcXVpcmVOZXh0SW1hZ2VLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHRpbWVvdXQsIHNlbWFwaG9yZSwgZmVuY2UsIHBJbWFnZUluZGV4KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2VLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHRpbWVvdXQsIHNlbWFwaG9yZSwgZmVuY2UsIHBJbWFnZUluZGV4KTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hBY3F1aXJlTmV4dEltYWdlS0hSKGRldmljZSwgc3dhcGNoYWluLCB0aW1lb3V0LCBzZW1hcGhvcmUsIGZlbmNlLCBwSW1hZ2VJbmRleCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2VLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHRpbWVvdXQsIHNlbWFwaG9yZSwgZmVuY2UsIHBJbWFnZUluZGV4LCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVQcmVzZW50S0hSKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJlc2VudEluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShxdWV1ZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVRdWV1ZVByZXNlbnRLSFIocXVldWUsIHBQcmVzZW50SW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRRdWV1ZVByZXNlbnRLSFIocXVldWUsIHBQcmVzZW50SW5mbyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoUXVldWVQcmVzZW50S0hSKHF1ZXVlLCBwUHJlc2VudEluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRRdWV1ZVByZXNlbnRLSFIocXVldWUsIHBQcmVzZW50SW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogICAgICAgIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKGRldmljZSwgcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoZGV2aWNlLCBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoZGV2aWNlLCBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKGRldmljZSwgcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKGRldmljZSwgc3VyZmFjZSwgcE1vZGVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihkZXZpY2UsIHN1cmZhY2UsIHBNb2Rlcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKGRldmljZSwgc3VyZmFjZSwgcE1vZGVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKGRldmljZSwgc3VyZmFjZSwgcE1vZGVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0Q291bnQsCisgICAgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwUmVjdENvdW50LCBwUmVjdHMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFJlY3RDb3VudCwgcFJlY3RzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwUmVjdENvdW50LCBwUmVjdHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwUmVjdENvdW50LCBwUmVjdHMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlTmV4dEltYWdlMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiAgICAgICAgICAgIHBBY3F1aXJlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUFjcXVpcmVOZXh0SW1hZ2UyS0hSKGRldmljZSwgcEFjcXVpcmVJbmZvLCBwSW1hZ2VJbmRleCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRBY3F1aXJlTmV4dEltYWdlMktIUihkZXZpY2UsIHBBY3F1aXJlSW5mbywgcEltYWdlSW5kZXgpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEFjcXVpcmVOZXh0SW1hZ2UyS0hSKGRldmljZSwgcEFjcXVpcmVJbmZvLCBwSW1hZ2VJbmRleCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2UyS0hSKGRldmljZSwgcEFjcXVpcmVJbmZvLCBwSW1hZ2VJbmRleCwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheUNvdW50LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIocGh5c2ljYWxEZXZpY2UsIHBsYW5lSW5kZXgsIHBEaXNwbGF5Q291bnQsIHBEaXNwbGF5cyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUihwaHlzaWNhbERldmljZSwgcGxhbmVJbmRleCwgcERpc3BsYXlDb3VudCwgcERpc3BsYXlzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUihwaHlzaWNhbERldmljZSwgcGxhbmVJbmRleCwgcERpc3BsYXlDb3VudCwgcERpc3BsYXlzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIocGh5c2ljYWxEZXZpY2UsIHBsYW5lSW5kZXgsIHBEaXNwbGF5Q291bnQsIHBEaXNwbGF5cywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURpc3BsYXlNb2RlS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGlzcGxheU1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZGUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVEaXNwbGF5TW9kZUtIUihwaHlzaWNhbERldmljZSwgZGlzcGxheSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBNb2RlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZURpc3BsYXlNb2RlS0hSKHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1vZGUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZURpc3BsYXlNb2RlS0hSKHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1vZGUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVEaXNwbGF5TW9kZUtIUihwaHlzaWNhbERldmljZSwgZGlzcGxheSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBNb2RlLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5TW9kZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIG1vZGUsIHBsYW5lSW5kZXgsIHBDYXBhYmlsaXRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBtb2RlLCBwbGFuZUluZGV4LCBwQ2FwYWJpbGl0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIG1vZGUsIHBsYW5lSW5kZXgsIHBDYXBhYmlsaXRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIG1vZGUsIHBsYW5lSW5kZXgsIHBDYXBhYmlsaXRpZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWlucyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKGRldmljZSwgc3dhcGNoYWluQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFN3YXBjaGFpbnMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWlucyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWlucywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlWGxpYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlWGxpYlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVYbGliU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVYbGliU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlWGxpYlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmlzdWFsSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxJRCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGRweSwgdmlzdWFsSUQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0ZBTFNFOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBkcHksIHZpc3VhbElEKTsKKyAgICB9CisgICAgVmtCb29sMzIgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBkcHksIHZpc3VhbElEKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgZHB5LCB2aXN1YWxJRCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVYY2JTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlWGNiU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVYY2JTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVYY2JTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgeGNiX2Nvbm5lY3Rpb25fdCogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgIHhjYl92aXN1YWxpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsX2lkKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBjb25uZWN0aW9uLCB2aXN1YWxfaWQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0ZBTFNFOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGNvbm5lY3Rpb24sIHZpc3VhbF9pZCk7CisgICAgfQorICAgIFZrQm9vbDMyIHJlc3VsdCA9IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBjb25uZWN0aW9uLCB2aXN1YWxfaWQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGNvbm5lY3Rpb24sIHZpc3VhbF9pZCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgc3RydWN0IHdsX2Rpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgZGlzcGxheSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRkFMU0U7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGRpc3BsYXkpOworICAgIH0KKyAgICBWa0Jvb2wzMiByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGRpc3BsYXkpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBkaXNwbGF5KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVXaW4zMlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVXaW4zMlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlV2luMzJTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVXaW4zMlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0ZBTFNFOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCk7CisgICAgfQorICAgIFZrQm9vbDMyIHJlc3VsdCA9IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIocGh5c2ljYWxEZXZpY2UsIHBGZWF0dXJlcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwRmVhdHVyZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwRmVhdHVyZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydGllcyk7CisgICAgfQorICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHBGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHBGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgZm9ybWF0LCBwRm9ybWF0UHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcEltYWdlRm9ybWF0SW5mbywgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcEltYWdlRm9ybWF0SW5mbywgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcEltYWdlRm9ybWF0SW5mbywgcEltYWdlRm9ybWF0UHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisgICAgfQorICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqICAgICAgICAgIHBNZW1vcnlQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwTWVtb3J5UHJvcGVydGllcyk7CisgICAgfQorICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwTWVtb3J5UHJvcGVydGllcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwRm9ybWF0SW5mbywgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwRm9ybWF0SW5mbywgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBGb3JtYXRJbmZvLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBGb3JtYXRJbmZvLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIH0KK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoZGV2aWNlLCBoZWFwSW5kZXgsIGxvY2FsRGV2aWNlSW5kZXgsIHJlbW90ZURldmljZUluZGV4LCBwUGVlck1lbW9yeUZlYXR1cmVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoZGV2aWNlLCBoZWFwSW5kZXgsIGxvY2FsRGV2aWNlSW5kZXgsIHJlbW90ZURldmljZUluZGV4LCBwUGVlck1lbW9yeUZlYXR1cmVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUihkZXZpY2UsIGhlYXBJbmRleCwgbG9jYWxEZXZpY2VJbmRleCwgcmVtb3RlRGV2aWNlSW5kZXgsIHBQZWVyTWVtb3J5RmVhdHVyZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUihkZXZpY2UsIGhlYXBJbmRleCwgbG9jYWxEZXZpY2VJbmRleCwgcmVtb3RlRGV2aWNlSW5kZXgsIHBQZWVyTWVtb3J5RmVhdHVyZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RGV2aWNlTWFza0tIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRTZXREZXZpY2VNYXNrS0hSKGNvbW1hbmRCdWZmZXIsIGRldmljZU1hc2spOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXREZXZpY2VNYXNrS0hSKGNvbW1hbmRCdWZmZXIsIGRldmljZU1hc2spOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldERldmljZU1hc2tLSFIoY29tbWFuZEJ1ZmZlciwgZGV2aWNlTWFzayk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFNldERldmljZU1hc2tLSFIoY29tbWFuZEJ1ZmZlciwgZGV2aWNlTWFzayk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEJhc2VLSFIoY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZERpc3BhdGNoQmFzZUtIUihjb21tYW5kQnVmZmVyLCBiYXNlR3JvdXBYLCBiYXNlR3JvdXBZLCBiYXNlR3JvdXBaLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWREaXNwYXRjaEJhc2VLSFIoY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERpc3BhdGNoQmFzZUtIUihjb21tYW5kQnVmZmVyLCBiYXNlR3JvdXBYLCBiYXNlR3JvdXBZLCBiYXNlR3JvdXBaLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaKTsKKyAgICB9Cit9CisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBUcmltQ29tbWFuZFBvb2xLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVRyaW1Db21tYW5kUG9vbEtIUihkZXZpY2UsIGNvbW1hbmRQb29sLCBmbGFncyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFRyaW1Db21tYW5kUG9vbEtIUihkZXZpY2UsIGNvbW1hbmRQb29sLCBmbGFncyk7CisgICAgfQorICAgIERpc3BhdGNoVHJpbUNvbW1hbmRQb29sS0hSKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkVHJpbUNvbW1hbmRQb29sS0hSKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzKTsKKyAgICB9Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoaW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUihpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUihpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoaW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qICAgcEV4dGVybmFsQnVmZmVySW5mbywKKyAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcEV4dGVybmFsQnVmZmVySW5mbywgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcEV4dGVybmFsQnVmZmVySW5mbywgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldE1lbW9yeVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKKyAgICBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiogICAgICAgICAgIHBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKGRldmljZSwgaGFuZGxlVHlwZSwgaGFuZGxlLCBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUihkZXZpY2UsIGhhbmRsZVR5cGUsIGhhbmRsZSwgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKGRldmljZSwgaGFuZGxlVHlwZSwgaGFuZGxlLCBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKGRldmljZSwgaGFuZGxlVHlwZSwgaGFuZGxlLCBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5RmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUZkS0hSKGRldmljZSwgcEdldEZkSW5mbywgcEZkKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldE1lbW9yeUZkS0hSKGRldmljZSwgcEdldEZkSW5mbywgcEZkKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRNZW1vcnlGZEtIUihkZXZpY2UsIHBHZXRGZEluZm8sIHBGZCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldE1lbW9yeUZkS0hSKGRldmljZSwgcEdldEZkSW5mbywgcEZkLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLAorICAgIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUZkUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoZGV2aWNlLCBoYW5kbGVUeXBlLCBmZCwgcE1lbW9yeUZkUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoZGV2aWNlLCBoYW5kbGVUeXBlLCBmZCwgcE1lbW9yeUZkUHJvcGVydGllcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKGRldmljZSwgaGFuZGxlVHlwZSwgZmQsIHBNZW1vcnlGZFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoZGV2aWNlLCBoYW5kbGVUeXBlLCBmZCwgcE1lbW9yeUZkUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworICAgIH0KK30KKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqICBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgSW1wb3J0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqICAgICAgICAgICBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUltcG9ydFNlbWFwaG9yZUZkS0hSKGRldmljZSwgcEltcG9ydFNlbWFwaG9yZUZkSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRJbXBvcnRTZW1hcGhvcmVGZEtIUihkZXZpY2UsIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEltcG9ydFNlbWFwaG9yZUZkS0hSKGRldmljZSwgcEltcG9ydFNlbWFwaG9yZUZkSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZUZkS0hSKGRldmljZSwgcEltcG9ydFNlbWFwaG9yZUZkSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRTZW1hcGhvcmVGZEtIUihkZXZpY2UsIHBHZXRGZEluZm8sIHBGZCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRTZW1hcGhvcmVGZEtIUihkZXZpY2UsIHBHZXRGZEluZm8sIHBGZCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0U2VtYXBob3JlRmRLSFIoZGV2aWNlLCBwR2V0RmRJbmZvLCBwRmQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVGZEtIUihkZXZpY2UsIHBHZXRGZEluZm8sIHBGZCwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRQdXNoRGVzY3JpcHRvclNldEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIHNldCwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIGxheW91dCwgc2V0LCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcERlc2NyaXB0b3JXcml0ZXMpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIHNldCwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIGxheW91dCwgc2V0LCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcERlc2NyaXB0b3JXcml0ZXMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKGNvbW1hbmRCdWZmZXIsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgbGF5b3V0LCBzZXQsIHBEYXRhKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoY29tbWFuZEJ1ZmZlciwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBsYXlvdXQsIHNldCwgcERhdGEpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKGNvbW1hbmRCdWZmZXIsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgbGF5b3V0LCBzZXQsIHBEYXRhKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoY29tbWFuZEJ1ZmZlciwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBsYXlvdXQsIHNldCwgcERhdGEpOworICAgIH0KK30KKworCisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihkZXZpY2UsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihkZXZpY2UsIGRlc2NyaXB0b3JTZXQsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcERhdGEpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwRGF0YSk7CisgICAgfQorICAgIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihkZXZpY2UsIGRlc2NyaXB0b3JTZXQsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcERhdGEpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwRGF0YSk7CisgICAgfQorfQorCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzczJLSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFJlbmRlclBhc3MpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzczJLSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFJlbmRlclBhc3MpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZVJlbmRlclBhc3MyS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzczJLSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFJlbmRlclBhc3MsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRCZWdpblJlbmRlclBhc3MyS0hSKGNvbW1hbmRCdWZmZXIsIHBSZW5kZXJQYXNzQmVnaW4sIHBTdWJwYXNzQmVnaW5JbmZvKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzMktIUihjb21tYW5kQnVmZmVyLCBwUmVuZGVyUGFzc0JlZ2luLCBwU3VicGFzc0JlZ2luSW5mbyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kQmVnaW5SZW5kZXJQYXNzMktIUihjb21tYW5kQnVmZmVyLCBwUmVuZGVyUGFzc0JlZ2luLCBwU3VicGFzc0JlZ2luSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEJlZ2luUmVuZGVyUGFzczJLSFIoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgcFN1YnBhc3NCZWdpbkluZm8pOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kTmV4dFN1YnBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWROZXh0U3VicGFzczJLSFIoY29tbWFuZEJ1ZmZlciwgcFN1YnBhc3NCZWdpbkluZm8sIHBTdWJwYXNzRW5kSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZE5leHRTdWJwYXNzMktIUihjb21tYW5kQnVmZmVyLCBwU3VicGFzc0JlZ2luSW5mbywgcFN1YnBhc3NFbmRJbmZvKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWROZXh0U3VicGFzczJLSFIoY29tbWFuZEJ1ZmZlciwgcFN1YnBhc3NCZWdpbkluZm8sIHBTdWJwYXNzRW5kSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZE5leHRTdWJwYXNzMktIUihjb21tYW5kQnVmZmVyLCBwU3VicGFzc0JlZ2luSW5mbywgcFN1YnBhc3NFbmRJbmZvKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUmVuZGVyUGFzczJLSFIoY29tbWFuZEJ1ZmZlciwgcFN1YnBhc3NFbmRJbmZvKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzczJLSFIoY29tbWFuZEJ1ZmZlciwgcFN1YnBhc3NFbmRJbmZvKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRFbmRSZW5kZXJQYXNzMktIUihjb21tYW5kQnVmZmVyLCBwU3VicGFzc0VuZEluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzMktIUihjb21tYW5kQnVmZmVyLCBwU3VicGFzc0VuZEluZm8pOworICAgIH0KK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0U3dhcGNoYWluU3RhdHVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpblN0YXR1c0tIUihkZXZpY2UsIHN3YXBjaGFpbik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRTd2FwY2hhaW5TdGF0dXNLSFIoZGV2aWNlLCBzd2FwY2hhaW4pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFN3YXBjaGFpblN0YXR1c0tIUihkZXZpY2UsIHN3YXBjaGFpbik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFN3YXBjaGFpblN0YXR1c0tIUihkZXZpY2UsIHN3YXBjaGFpbiwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxGZW5jZUluZm8sIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEZlbmNlSW5mbywgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxGZW5jZUluZm8sIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEZlbmNlSW5mbywgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogICAgICBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRGZW5jZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRGZW5jZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0RmVuY2VXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBHZXRXaW4zMkhhbmRsZUluZm8sIHBIYW5kbGUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRGZW5jZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogICAgICAgICAgICAgICBwSW1wb3J0RmVuY2VGZEluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlSW1wb3J0RmVuY2VGZEtIUihkZXZpY2UsIHBJbXBvcnRGZW5jZUZkSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRJbXBvcnRGZW5jZUZkS0hSKGRldmljZSwgcEltcG9ydEZlbmNlRmRJbmZvKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hJbXBvcnRGZW5jZUZkS0hSKGRldmljZSwgcEltcG9ydEZlbmNlRmRJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkSW1wb3J0RmVuY2VGZEtIUihkZXZpY2UsIHBJbXBvcnRGZW5jZUZkSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldEZlbmNlRmRLSFIoZGV2aWNlLCBwR2V0RmRJbmZvLCBwRmQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0RmVuY2VGZEtIUihkZXZpY2UsIHBHZXRGZEluZm8sIHBGZCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0RmVuY2VGZEtIUihkZXZpY2UsIHBHZXRGZEluZm8sIHBGZCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldEZlbmNlRmRLSFIoZGV2aWNlLCBwR2V0RmRJbmZvLCBwRmQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckNvdW50LAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJzLAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqICAgICAgICAgcENvdW50ZXJEZXNjcmlwdGlvbnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBwQ291bnRlckNvdW50LCBwQ291bnRlcnMsIHBDb3VudGVyRGVzY3JpcHRpb25zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHBDb3VudGVyQ291bnQsIHBDb3VudGVycywgcENvdW50ZXJEZXNjcmlwdGlvbnMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHBDb3VudGVyQ291bnQsIHBDb3VudGVycywgcENvdW50ZXJEZXNjcmlwdGlvbnMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBwQ291bnRlckNvdW50LCBwQ291bnRlcnMsIHBDb3VudGVyRGVzY3JpcHRpb25zLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiAgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVBhc3NlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKHBoeXNpY2FsRGV2aWNlLCBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sIHBOdW1QYXNzZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUihwaHlzaWNhbERldmljZSwgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLCBwTnVtUGFzc2VzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUihwaHlzaWNhbERldmljZSwgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLCBwTnVtUGFzc2VzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBQZXJmb3JtYW5jZVF1ZXJ5Q3JlYXRlSW5mbywgcE51bVBhc3Nlcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqICAgICAgICBwSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUihkZXZpY2UsIHBJbmZvKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKGRldmljZSwgcEluZm8pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKGRldmljZSwgcEluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUihkZXZpY2UsIHBJbmZvLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihkZXZpY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihkZXZpY2UpOworICAgIH0KKyAgICBEaXNwYXRjaFJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKGRldmljZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKGRldmljZSk7CisgICAgfQorfQorCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFN1cmZhY2VJbmZvLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwU3VyZmFjZUluZm8sIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwU3VyZmFjZUluZm8sIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFN1cmZhY2VJbmZvLCBwU3VyZmFjZUNhcGFiaWxpdGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdDJLSFIqICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIocGh5c2ljYWxEZXZpY2UsIHBTdXJmYWNlSW5mbywgcFN1cmZhY2VGb3JtYXRDb3VudCwgcFN1cmZhY2VGb3JtYXRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwU3VyZmFjZUluZm8sIHBTdXJmYWNlRm9ybWF0Q291bnQsIHBTdXJmYWNlRm9ybWF0cyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIocGh5c2ljYWxEZXZpY2UsIHBTdXJmYWNlSW5mbywgcFN1cmZhY2VGb3JtYXRDb3VudCwgcFN1cmZhY2VGb3JtYXRzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIocGh5c2ljYWxEZXZpY2UsIHBTdXJmYWNlSW5mbywgcFN1cmZhY2VGb3JtYXRDb3VudCwgcFN1cmZhY2VGb3JtYXRzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKiAgICAgICAgICAgICAgIHBEaXNwbGF5UGxhbmVJbmZvLAorICAgIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiogICAgICAgICAgICAgcENhcGFiaWxpdGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBEaXNwbGF5UGxhbmVJbmZvLCBwQ2FwYWJpbGl0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBEaXNwbGF5UGxhbmVJbmZvLCBwQ2FwYWJpbGl0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwRGlzcGxheVBsYW5lSW5mbywgcENhcGFiaWxpdGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIocGh5c2ljYWxEZXZpY2UsIHBEaXNwbGF5UGxhbmVJbmZvLCBwQ2FwYWJpbGl0aWVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKGRldmljZSwgcEluZm8sIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKGRldmljZSwgcEluZm8sIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCBwSW5mbywgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCBwSW5mbywgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KK30KKworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBZY2JjckNvbnZlcnNpb24pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwWWNiY3JDb252ZXJzaW9uKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBZY2JjckNvbnZlcnNpb24pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBZY2JjckNvbnZlcnNpb24sIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihkZXZpY2UsIHljYmNyQ29udmVyc2lvbiwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKGRldmljZSwgeWNiY3JDb252ZXJzaW9uLCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihkZXZpY2UsIHljYmNyQ29udmVyc2lvbiwgcEFsbG9jYXRvcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKGRldmljZSwgeWNiY3JDb252ZXJzaW9uLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRCdWZmZXJNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTJLSFIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyS0hSKGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQmluZEJ1ZmZlck1lbW9yeTJLSFIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeTJLSFIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmluZEltYWdlTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiAgICAgICAgICAgICAgICBwQmluZEluZm9zKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTJLSFIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTJLSFIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkyS0hSKGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTJLSFIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwU3VwcG9ydCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwU3VwcG9ydCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKKyAgICB9Cit9CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RDb3VudEtIUihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RDb3VudEtIUihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworICAgIH0KK30KKworCisKKworCisKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoZGV2aWNlLCBzZW1hcGhvcmUsIHBWYWx1ZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoZGV2aWNlLCBzZW1hcGhvcmUsIHBWYWx1ZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKGRldmljZSwgc2VtYXBob3JlLCBwVmFsdWUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoZGV2aWNlLCBzZW1hcGhvcmUsIHBWYWx1ZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFdhaXRTZW1hcGhvcmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqICAgICAgICAgICAgICAgcFdhaXRJbmZvLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVXYWl0U2VtYXBob3Jlc0tIUihkZXZpY2UsIHBXYWl0SW5mbywgdGltZW91dCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRXYWl0U2VtYXBob3Jlc0tIUihkZXZpY2UsIHBXYWl0SW5mbywgdGltZW91dCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoV2FpdFNlbWFwaG9yZXNLSFIoZGV2aWNlLCBwV2FpdEluZm8sIHRpbWVvdXQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRXYWl0U2VtYXBob3Jlc0tIUihkZXZpY2UsIHBXYWl0SW5mbywgdGltZW91dCwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFNpZ25hbFNlbWFwaG9yZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqICAgICAgICAgICAgIHBTaWduYWxJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVNpZ25hbFNlbWFwaG9yZUtIUihkZXZpY2UsIHBTaWduYWxJbmZvKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFNpZ25hbFNlbWFwaG9yZUtIUihkZXZpY2UsIHBTaWduYWxJbmZvKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hTaWduYWxTZW1hcGhvcmVLSFIoZGV2aWNlLCBwU2lnbmFsSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFNpZ25hbFNlbWFwaG9yZUtIUihkZXZpY2UsIHBTaWduYWxJbmZvLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworCisKKworCitWS0FQSV9BVFRSIFZrRGV2aWNlQWRkcmVzcyBWS0FQSV9DQUxMIEdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKGRldmljZSwgcEluZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIDA7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoZGV2aWNlLCBwSW5mbyk7CisgICAgfQorICAgIFZrRGV2aWNlQWRkcmVzcyByZXN1bHQgPSBEaXNwYXRjaEdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoZGV2aWNlLCBwSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoZGV2aWNlLCBwSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB1aW50NjRfdCBWS0FQSV9DQUxMIEdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoZGV2aWNlLCBwSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoZGV2aWNlLCBwSW5mbyk7CisgICAgfQorICAgIHVpbnQ2NF90IHJlc3VsdCA9IERpc3BhdGNoR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoZGV2aWNlLCBwSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKGRldmljZSwgcEluZm8pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHVpbnQ2NF90IFZLQVBJX0NBTEwgR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKGRldmljZSwgcEluZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIDA7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKGRldmljZSwgcEluZm8pOworICAgIH0KKyAgICB1aW50NjRfdCByZXN1bHQgPSBEaXNwYXRjaEdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKGRldmljZSwgcEluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUihkZXZpY2UsIHBJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiogICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXhlY3V0YWJsZUNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogICAgICAgICAgcFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihkZXZpY2UsIHBQaXBlbGluZUluZm8sIHBFeGVjdXRhYmxlQ291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoZGV2aWNlLCBwUGlwZWxpbmVJbmZvLCBwRXhlY3V0YWJsZUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihkZXZpY2UsIHBQaXBlbGluZUluZm8sIHBFeGVjdXRhYmxlQ291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihkZXZpY2UsIHBQaXBlbGluZUluZm8sIHBFeGVjdXRhYmxlQ291bnQsIHBQcm9wZXJ0aWVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogICAgICAgICAgIHBTdGF0aXN0aWNzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoZGV2aWNlLCBwRXhlY3V0YWJsZUluZm8sIHBTdGF0aXN0aWNDb3VudCwgcFN0YXRpc3RpY3MpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUihkZXZpY2UsIHBFeGVjdXRhYmxlSW5mbywgcFN0YXRpc3RpY0NvdW50LCBwU3RhdGlzdGljcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUihkZXZpY2UsIHBFeGVjdXRhYmxlSW5mbywgcFN0YXRpc3RpY0NvdW50LCBwU3RhdGlzdGljcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoZGV2aWNlLCBwRXhlY3V0YWJsZUluZm8sIHBTdGF0aXN0aWNDb3VudCwgcFN0YXRpc3RpY3MsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoZGV2aWNlLCBwRXhlY3V0YWJsZUluZm8sIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUihkZXZpY2UsIHBFeGVjdXRhYmxlSW5mbywgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgcEludGVybmFsUmVwcmVzZW50YXRpb25zKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUihkZXZpY2UsIHBFeGVjdXRhYmxlSW5mbywgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgcEludGVybmFsUmVwcmVzZW50YXRpb25zKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoZGV2aWNlLCBwRXhlY3V0YWJsZUluZm8sIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCogICAgICAgICAgICAgICAgICAgcENhbGxiYWNrKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBDYWxsYmFjayk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcENhbGxiYWNrKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcENhbGxiYWNrKTsKKyAgICBsYXllcl9jcmVhdGVfcmVwb3J0X2NhbGxiYWNrKGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhLCBmYWxzZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBDYWxsYmFjayk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ2FsbGJhY2ssIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChpbnN0YW5jZSwgY2FsbGJhY2ssIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChpbnN0YW5jZSwgY2FsbGJhY2ssIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKGluc3RhbmNlLCBjYWxsYmFjaywgcEFsbG9jYXRvcik7CisgICAgbGF5ZXJfZGVzdHJveV9jYWxsYmFjayhsYXllcl9kYXRhLT5yZXBvcnRfZGF0YSwgY2FsbGJhY2ssIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChpbnN0YW5jZSwgY2FsbGJhY2ssIHBBbGxvY2F0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVidWdSZXBvcnRNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb2RlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoaW5zdGFuY2UsIGZsYWdzLCBvYmplY3RUeXBlLCBvYmplY3QsIGxvY2F0aW9uLCBtZXNzYWdlQ29kZSwgcExheWVyUHJlZml4LCBwTWVzc2FnZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlYnVnUmVwb3J0TWVzc2FnZUVYVChpbnN0YW5jZSwgZmxhZ3MsIG9iamVjdFR5cGUsIG9iamVjdCwgbG9jYXRpb24sIG1lc3NhZ2VDb2RlLCBwTGF5ZXJQcmVmaXgsIHBNZXNzYWdlKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoaW5zdGFuY2UsIGZsYWdzLCBvYmplY3RUeXBlLCBvYmplY3QsIGxvY2F0aW9uLCBtZXNzYWdlQ29kZSwgcExheWVyUHJlZml4LCBwTWVzc2FnZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlYnVnUmVwb3J0TWVzc2FnZUVYVChpbnN0YW5jZSwgZmxhZ3MsIG9iamVjdFR5cGUsIG9iamVjdCwgbG9jYXRpb24sIG1lc3NhZ2VDb2RlLCBwTGF5ZXJQcmVmaXgsIHBNZXNzYWdlKTsKKyAgICB9Cit9CisKKworCisKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgcFRhZ0luZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoZGV2aWNlLCBwVGFnSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVChkZXZpY2UsIHBUYWdJbmZvKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVChkZXZpY2UsIHBUYWdJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoZGV2aWNlLCBwVGFnSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqICAgICAgIHBOYW1lSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoZGV2aWNlLCBwTmFtZUluZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKGRldmljZSwgcE5hbWVJbmZvKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEtPkRlYnVnUmVwb3J0U2V0TWFya2VyT2JqZWN0TmFtZShwTmFtZUluZm8pOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKGRldmljZSwgcE5hbWVJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKGRldmljZSwgcE5hbWVJbmZvLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREZWJ1Z01hcmtlckJlZ2luRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogICAgICAgICAgIHBNYXJrZXJJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREZWJ1Z01hcmtlckJlZ2luRVhUKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJCZWdpbkVYVChjb21tYW5kQnVmZmVyLCBwTWFya2VySW5mbyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRGVidWdNYXJrZXJCZWdpbkVYVChjb21tYW5kQnVmZmVyLCBwTWFya2VySW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERlYnVnTWFya2VyQmVnaW5FWFQoY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8pOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRGVidWdNYXJrZXJFbmRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREZWJ1Z01hcmtlckVuZEVYVChjb21tYW5kQnVmZmVyKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJFbmRFWFQoY29tbWFuZEJ1ZmZlcik7CisgICAgfQorICAgIERpc3BhdGNoQ21kRGVidWdNYXJrZXJFbmRFWFQoY29tbWFuZEJ1ZmZlcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERlYnVnTWFya2VyRW5kRVhUKGNvbW1hbmRCdWZmZXIpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZERlYnVnTWFya2VySW5zZXJ0RVhUKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8pOworICAgIH0KKyAgICBEaXNwYXRjaENtZERlYnVnTWFya2VySW5zZXJ0RVhUKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8pOworICAgIH0KK30KKworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcFNpemVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKGNvbW1hbmRCdWZmZXIsIGZpcnN0QmluZGluZywgYmluZGluZ0NvdW50LCBwQnVmZmVycywgcE9mZnNldHMsIHBTaXplcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoY29tbWFuZEJ1ZmZlciwgZmlyc3RCaW5kaW5nLCBiaW5kaW5nQ291bnQsIHBCdWZmZXJzLCBwT2Zmc2V0cywgcFNpemVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKGNvbW1hbmRCdWZmZXIsIGZpcnN0QmluZGluZywgYmluZGluZ0NvdW50LCBwQnVmZmVycywgcE9mZnNldHMsIHBTaXplcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoY29tbWFuZEJ1ZmZlciwgZmlyc3RCaW5kaW5nLCBiaW5kaW5nQ291bnQsIHBCdWZmZXJzLCBwT2Zmc2V0cywgcFNpemVzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKGNvbW1hbmRCdWZmZXIsIGZpcnN0Q291bnRlckJ1ZmZlciwgY291bnRlckJ1ZmZlckNvdW50LCBwQ291bnRlckJ1ZmZlcnMsIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoY29tbWFuZEJ1ZmZlciwgZmlyc3RDb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyQ291bnQsIHBDb3VudGVyQnVmZmVycywgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKGNvbW1hbmRCdWZmZXIsIGZpcnN0Q291bnRlckJ1ZmZlciwgY291bnRlckJ1ZmZlckNvdW50LCBwQ291bnRlckJ1ZmZlcnMsIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoY29tbWFuZEJ1ZmZlciwgZmlyc3RDb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyQ291bnQsIHBDb3VudGVyQnVmZmVycywgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q291bnRlckJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVyT2Zmc2V0cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoY29tbWFuZEJ1ZmZlciwgZmlyc3RDb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyQ291bnQsIHBDb3VudGVyQnVmZmVycywgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoY29tbWFuZEJ1ZmZlciwgZmlyc3RDb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyQ291bnQsIHBDb3VudGVyQnVmZmVycywgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVChjb21tYW5kQnVmZmVyLCBmaXJzdENvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJDb3VudCwgcENvdW50ZXJCdWZmZXJzLCBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVChjb21tYW5kQnVmZmVyLCBmaXJzdENvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJDb3VudCwgcENvdW50ZXJCdWZmZXJzLCBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVChjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5LCBmbGFncywgaW5kZXgpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVChjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5LCBmbGFncywgaW5kZXgpOworICAgIH0KKyAgICBEaXNwYXRjaENtZEJlZ2luUXVlcnlJbmRleGVkRVhUKGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnksIGZsYWdzLCBpbmRleCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEJlZ2luUXVlcnlJbmRleGVkRVhUKGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnksIGZsYWdzLCBpbmRleCk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRFbmRRdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnlJbmRleGVkRVhUKGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnksIGluZGV4KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRW5kUXVlcnlJbmRleGVkRVhUKGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnksIGluZGV4KTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRFbmRRdWVyeUluZGV4ZWRFWFQoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgaW5kZXgpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRFbmRRdWVyeUluZGV4ZWRFWFQoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgaW5kZXgpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4U3RyaWRlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoY29tbWFuZEJ1ZmZlciwgaW5zdGFuY2VDb3VudCwgZmlyc3RJbnN0YW5jZSwgY291bnRlckJ1ZmZlciwgY291bnRlckJ1ZmZlck9mZnNldCwgY291bnRlck9mZnNldCwgdmVydGV4U3RyaWRlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKGNvbW1hbmRCdWZmZXIsIGluc3RhbmNlQ291bnQsIGZpcnN0SW5zdGFuY2UsIGNvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJPZmZzZXQsIGNvdW50ZXJPZmZzZXQsIHZlcnRleFN0cmlkZSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKGNvbW1hbmRCdWZmZXIsIGluc3RhbmNlQ291bnQsIGZpcnN0SW5zdGFuY2UsIGNvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJPZmZzZXQsIGNvdW50ZXJPZmZzZXQsIHZlcnRleFN0cmlkZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVChjb21tYW5kQnVmZmVyLCBpbnN0YW5jZUNvdW50LCBmaXJzdEluc3RhbmNlLCBjb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyT2Zmc2V0LCBjb3VudGVyT2Zmc2V0LCB2ZXJ0ZXhTdHJpZGUpOworICAgIH0KK30KKworCitWS0FQSV9BVFRSIHVpbnQzMl90IFZLQVBJX0NBTEwgR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCogICAgICAgICAgICAgcEluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKGRldmljZSwgcEluZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIDA7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldEltYWdlVmlld0hhbmRsZU5WWChkZXZpY2UsIHBJbmZvKTsKKyAgICB9CisgICAgdWludDMyX3QgcmVzdWx0ID0gRGlzcGF0Y2hHZXRJbWFnZVZpZXdIYW5kbGVOVlgoZGV2aWNlLCBwSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldEltYWdlVmlld0hhbmRsZU5WWChkZXZpY2UsIHBJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RDb3VudEFNRChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50QU1EKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWREcmF3SW5kaXJlY3RDb3VudEFNRChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50QU1EKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworICAgIH0KKyAgICBEaXNwYXRjaENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgfQorfQorCisKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFNoYWRlckluZm9BTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0YWdlLAorICAgIFZrU2hhZGVySW5mb1R5cGVBTUQgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mb1NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRTaGFkZXJJbmZvQU1EKGRldmljZSwgcGlwZWxpbmUsIHNoYWRlclN0YWdlLCBpbmZvVHlwZSwgcEluZm9TaXplLCBwSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRTaGFkZXJJbmZvQU1EKGRldmljZSwgcGlwZWxpbmUsIHNoYWRlclN0YWdlLCBpbmZvVHlwZSwgcEluZm9TaXplLCBwSW5mbyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0U2hhZGVySW5mb0FNRChkZXZpY2UsIHBpcGVsaW5lLCBzaGFkZXJTdGFnZSwgaW5mb1R5cGUsIHBJbmZvU2l6ZSwgcEluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRTaGFkZXJJbmZvQU1EKGRldmljZSwgcGlwZWxpbmUsIHNoYWRlclN0YWdlLCBpbmZvVHlwZSwgcEluZm9TaXplLCBwSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VDcmVhdGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBleHRlcm5hbEhhbmRsZVR5cGUsCisgICAgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKiAgICAgICAgICBwRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYocGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgdHlwZSwgdGlsaW5nLCB1c2FnZSwgZmxhZ3MsIGV4dGVybmFsSGFuZGxlVHlwZSwgcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVihwaHlzaWNhbERldmljZSwgZm9ybWF0LCB0eXBlLCB0aWxpbmcsIHVzYWdlLCBmbGFncywgZXh0ZXJuYWxIYW5kbGVUeXBlLCBwRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVihwaHlzaWNhbERldmljZSwgZm9ybWF0LCB0eXBlLCB0aWxpbmcsIHVzYWdlLCBmbGFncywgZXh0ZXJuYWxIYW5kbGVUeXBlLCBwRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYocGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgdHlwZSwgdGlsaW5nLCB1c2FnZSwgZmxhZ3MsIGV4dGVybmFsSGFuZGxlVHlwZSwgcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5V2luMzJIYW5kbGVOVihkZXZpY2UsIG1lbW9yeSwgaGFuZGxlVHlwZSwgcEhhbmRsZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKGRldmljZSwgbWVtb3J5LCBoYW5kbGVUeXBlLCBwSGFuZGxlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKGRldmljZSwgbWVtb3J5LCBoYW5kbGVUeXBlLCBwSGFuZGxlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVOVihkZXZpY2UsIG1lbW9yeSwgaGFuZGxlVHlwZSwgcEhhbmRsZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVZpU3VyZmFjZU5OKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVZpU3VyZmFjZU5OKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlVmlTdXJmYWNlTk4oaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlVmlTdXJmYWNlTk4oaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZVZpU3VyZmFjZU5OKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKKworCisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiAgIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKGNvbW1hbmRCdWZmZXIsIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVChjb21tYW5kQnVmZmVyLCBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbik7CisgICAgfQorICAgIERpc3BhdGNoQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVChjb21tYW5kQnVmZmVyLCBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoY29tbWFuZEJ1ZmZlciwgcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVChjb21tYW5kQnVmZmVyKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoY29tbWFuZEJ1ZmZlcik7CisgICAgfQorICAgIERpc3BhdGNoQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoY29tbWFuZEJ1ZmZlcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKGNvbW1hbmRCdWZmZXIpOworICAgIH0KK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRQcm9jZXNzQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogICAgICAgICAgcFByb2Nlc3NDb21tYW5kc0luZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFByb2Nlc3NDb21tYW5kc05WWChjb21tYW5kQnVmZmVyLCBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZFByb2Nlc3NDb21tYW5kc05WWChjb21tYW5kQnVmZmVyLCBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKGNvbW1hbmRCdWZmZXIsIHBQcm9jZXNzQ29tbWFuZHNJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKGNvbW1hbmRCdWZmZXIsIHBQcm9jZXNzQ29tbWFuZHNJbmZvKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogIHBSZXNlcnZlU3BhY2VJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWChjb21tYW5kQnVmZmVyLCBwUmVzZXJ2ZVNwYWNlSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKGNvbW1hbmRCdWZmZXIsIHBSZXNlcnZlU3BhY2VJbmZvKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWChjb21tYW5kQnVmZmVyLCBwUmVzZXJ2ZVNwYWNlSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKGNvbW1hbmRCdWZmZXIsIHBSZXNlcnZlU3BhY2VJbmZvKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqICAgICAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW5kaXJlY3RDb21tYW5kc0xheW91dCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW5kaXJlY3RDb21tYW5kc0xheW91dCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAgICAgICAgICAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoZGV2aWNlLCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBwQWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoZGV2aWNlLCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChkZXZpY2UsIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChkZXZpY2UsIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIHBBbGxvY2F0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrT2JqZWN0VGFibGVOVlgqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdFRhYmxlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZU9iamVjdFRhYmxlTlZYKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBPYmplY3RUYWJsZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVPYmplY3RUYWJsZU5WWChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwT2JqZWN0VGFibGUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZU9iamVjdFRhYmxlTlZYKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBPYmplY3RUYWJsZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZU9iamVjdFRhYmxlTlZYKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBPYmplY3RUYWJsZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lPYmplY3RUYWJsZU5WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGVzdHJveU9iamVjdFRhYmxlTlZYKGRldmljZSwgb2JqZWN0VGFibGUsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICBEaXNwYXRjaERlc3Ryb3lPYmplY3RUYWJsZU5WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBwQWxsb2NhdG9yKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkRGVzdHJveU9iamVjdFRhYmxlTlZYKGRldmljZSwgb2JqZWN0VGFibGUsIHBBbGxvY2F0b3IpOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVJlZ2lzdGVyT2JqZWN0c05WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBvYmplY3RDb3VudCwgcHBPYmplY3RUYWJsZUVudHJpZXMsIHBPYmplY3RJbmRpY2VzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFJlZ2lzdGVyT2JqZWN0c05WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBvYmplY3RDb3VudCwgcHBPYmplY3RUYWJsZUVudHJpZXMsIHBPYmplY3RJbmRpY2VzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hSZWdpc3Rlck9iamVjdHNOVlgoZGV2aWNlLCBvYmplY3RUYWJsZSwgb2JqZWN0Q291bnQsIHBwT2JqZWN0VGFibGVFbnRyaWVzLCBwT2JqZWN0SW5kaWNlcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFJlZ2lzdGVyT2JqZWN0c05WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBvYmplY3RDb3VudCwgcHBPYmplY3RUYWJsZUVudHJpZXMsIHBPYmplY3RJbmRpY2VzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVVbnJlZ2lzdGVyT2JqZWN0c05WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBvYmplY3RDb3VudCwgcE9iamVjdEVudHJ5VHlwZXMsIHBPYmplY3RJbmRpY2VzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFVucmVnaXN0ZXJPYmplY3RzTlZYKGRldmljZSwgb2JqZWN0VGFibGUsIG9iamVjdENvdW50LCBwT2JqZWN0RW50cnlUeXBlcywgcE9iamVjdEluZGljZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaFVucmVnaXN0ZXJPYmplY3RzTlZYKGRldmljZSwgb2JqZWN0VGFibGUsIG9iamVjdENvdW50LCBwT2JqZWN0RW50cnlUeXBlcywgcE9iamVjdEluZGljZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRVbnJlZ2lzdGVyT2JqZWN0c05WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBvYmplY3RDb3VudCwgcE9iamVjdEVudHJ5VHlwZXMsIHBPYmplY3RJbmRpY2VzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCogICAgICAgcEZlYXR1cmVzLAorICAgIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgqICAgICAgICAgcExpbWl0cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKHBoeXNpY2FsRGV2aWNlLCBwRmVhdHVyZXMsIHBMaW1pdHMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWChwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzLCBwTGltaXRzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWChwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzLCBwTGltaXRzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgocGh5c2ljYWxEZXZpY2UsIHBGZWF0dXJlcywgcExpbWl0cyk7CisgICAgfQorfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogICAgICAgICAgICAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKGNvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBWaWV3cG9ydFdTY2FsaW5ncyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVihjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRXU2NhbGluZ3MpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVihjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRXU2NhbGluZ3MpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoY29tbWFuZEJ1ZmZlciwgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRDb3VudCwgcFZpZXdwb3J0V1NjYWxpbmdzKTsKKyAgICB9Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlbGVhc2VEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlUmVsZWFzZURpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXkpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkUmVsZWFzZURpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXkpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaFJlbGVhc2VEaXNwbGF5RVhUKHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkUmVsZWFzZURpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlWGxpYkRpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVBY3F1aXJlWGxpYkRpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRweSwgZGlzcGxheSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRBY3F1aXJlWGxpYkRpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRweSwgZGlzcGxheSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQWNxdWlyZVhsaWJEaXNwbGF5RVhUKHBoeXNpY2FsRGV2aWNlLCBkcHksIGRpc3BsYXkpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRBY3F1aXJlWGxpYkRpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRweSwgZGlzcGxheSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFJhbmRST3V0cHV0RGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFJST3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnJPdXRwdXQsCisgICAgVmtEaXNwbGF5S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFJhbmRST3V0cHV0RGlzcGxheUVYVChwaHlzaWNhbERldmljZSwgZHB5LCByck91dHB1dCwgcERpc3BsYXkpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKHBoeXNpY2FsRGV2aWNlLCBkcHksIHJyT3V0cHV0LCBwRGlzcGxheSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKHBoeXNpY2FsRGV2aWNlLCBkcHksIHJyT3V0cHV0LCBwRGlzcGxheSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFJhbmRST3V0cHV0RGlzcGxheUVYVChwaHlzaWNhbERldmljZSwgZHB5LCByck91dHB1dCwgcERpc3BsYXksIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVChwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUNhcGFiaWxpdGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRGlzcGxheVBvd2VyQ29udHJvbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5UG93ZXJJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheVBvd2VySW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEaXNwbGF5UG93ZXJDb250cm9sRVhUKGRldmljZSwgZGlzcGxheSwgcERpc3BsYXlQb3dlckluZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkRGlzcGxheVBvd2VyQ29udHJvbEVYVChkZXZpY2UsIGRpc3BsYXksIHBEaXNwbGF5UG93ZXJJbmZvKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hEaXNwbGF5UG93ZXJDb250cm9sRVhUKGRldmljZSwgZGlzcGxheSwgcERpc3BsYXlQb3dlckluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREaXNwbGF5UG93ZXJDb250cm9sRVhUKGRldmljZSwgZGlzcGxheSwgcERpc3BsYXlQb3dlckluZm8sIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWdpc3RlckRldmljZUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICAgcERldmljZUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlUmVnaXN0ZXJEZXZpY2VFdmVudEVYVChkZXZpY2UsIHBEZXZpY2VFdmVudEluZm8sIHBBbGxvY2F0b3IsIHBGZW5jZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRSZWdpc3RlckRldmljZUV2ZW50RVhUKGRldmljZSwgcERldmljZUV2ZW50SW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hSZWdpc3RlckRldmljZUV2ZW50RVhUKGRldmljZSwgcERldmljZUV2ZW50SW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkUmVnaXN0ZXJEZXZpY2VFdmVudEVYVChkZXZpY2UsIHBEZXZpY2VFdmVudEluZm8sIHBBbGxvY2F0b3IsIHBGZW5jZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5RXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVSZWdpc3RlckRpc3BsYXlFdmVudEVYVChkZXZpY2UsIGRpc3BsYXksIHBEaXNwbGF5RXZlbnRJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoZGV2aWNlLCBkaXNwbGF5LCBwRGlzcGxheUV2ZW50SW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hSZWdpc3RlckRpc3BsYXlFdmVudEVYVChkZXZpY2UsIGRpc3BsYXksIHBEaXNwbGF5RXZlbnRJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRSZWdpc3RlckRpc3BsYXlFdmVudEVYVChkZXZpY2UsIGRpc3BsYXksIHBEaXNwbGF5RXZlbnRJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTd2FwY2hhaW5Db3VudGVyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCAgICAgICAgICAgICAgICAgY291bnRlciwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyVmFsdWUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0U3dhcGNoYWluQ291bnRlckVYVChkZXZpY2UsIHN3YXBjaGFpbiwgY291bnRlciwgcENvdW50ZXJWYWx1ZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRTd2FwY2hhaW5Db3VudGVyRVhUKGRldmljZSwgc3dhcGNoYWluLCBjb3VudGVyLCBwQ291bnRlclZhbHVlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRTd2FwY2hhaW5Db3VudGVyRVhUKGRldmljZSwgc3dhcGNoYWluLCBjb3VudGVyLCBwQ291bnRlclZhbHVlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0U3dhcGNoYWluQ291bnRlckVYVChkZXZpY2UsIHN3YXBjaGFpbiwgY291bnRlciwgcENvdW50ZXJWYWx1ZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogICAgICAgICAgICAgICBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoZGV2aWNlLCBzd2FwY2hhaW4sIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRShkZXZpY2UsIHN3YXBjaGFpbiwgcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRShkZXZpY2UsIHN3YXBjaGFpbiwgcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoZGV2aWNlLCBzd2FwY2hhaW4sIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsCisgICAgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5ncykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKGRldmljZSwgc3dhcGNoYWluLCBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsIHBQcmVzZW50YXRpb25UaW1pbmdzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoZGV2aWNlLCBzd2FwY2hhaW4sIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCwgcFByZXNlbnRhdGlvblRpbWluZ3MpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoZGV2aWNlLCBzd2FwY2hhaW4sIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCwgcFByZXNlbnRhdGlvblRpbWluZ3MpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKGRldmljZSwgc3dhcGNoYWluLCBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsIHBQcmVzZW50YXRpb25UaW1pbmdzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworCisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNjYXJkUmVjdGFuZ2xlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVChjb21tYW5kQnVmZmVyLCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgcERpc2NhcmRSZWN0YW5nbGVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVChjb21tYW5kQnVmZmVyLCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgcERpc2NhcmRSZWN0YW5nbGVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKGNvbW1hbmRCdWZmZXIsIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgZGlzY2FyZFJlY3RhbmdsZUNvdW50LCBwRGlzY2FyZFJlY3RhbmdsZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKGNvbW1hbmRCdWZmZXIsIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgZGlzY2FyZFJlY3RhbmdsZUNvdW50LCBwRGlzY2FyZFJlY3RhbmdsZXMpOworICAgIH0KK30KKworCisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTZXRIZHJNZXRhZGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMsCisgICAgY29uc3QgVmtIZHJNZXRhZGF0YUVYVCogICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlU2V0SGRyTWV0YWRhdGFFWFQoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgcFN3YXBjaGFpbnMsIHBNZXRhZGF0YSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFNldEhkck1ldGFkYXRhRVhUKGRldmljZSwgc3dhcGNoYWluQ291bnQsIHBTd2FwY2hhaW5zLCBwTWV0YWRhdGEpOworICAgIH0KKyAgICBEaXNwYXRjaFNldEhkck1ldGFkYXRhRVhUKGRldmljZSwgc3dhcGNoYWluQ291bnQsIHBTd2FwY2hhaW5zLCBwTWV0YWRhdGEpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRTZXRIZHJNZXRhZGF0YUVYVChkZXZpY2UsIHN3YXBjaGFpbkNvdW50LCBwU3dhcGNoYWlucywgcE1ldGFkYXRhKTsKKyAgICB9Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSU9TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVJT1NTdXJmYWNlTVZLKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlSU9TU3VyZmFjZU1WSyhpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVJT1NTdXJmYWNlTVZLKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVJT1NTdXJmYWNlTVZLKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZU1hY09TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVNYWNPU1N1cmZhY2VNVksoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVNYWNPU1N1cmZhY2VNVksoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVNYWNPU1N1cmZhY2VNVksoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKKworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogICAgICAgIHBOYW1lSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UsIHBOYW1lSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UsIHBOYW1lSW5mbyk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhLT5EZWJ1Z1JlcG9ydFNldFV0aWxzT2JqZWN0TmFtZShwTmFtZUluZm8pOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoZGV2aWNlLCBwTmFtZUluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UsIHBOYW1lSW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogICAgICAgICBwVGFnSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKGRldmljZSwgcFRhZ0luZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVChkZXZpY2UsIHBUYWdJbmZvKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKGRldmljZSwgcFRhZ0luZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKGRldmljZSwgcFRhZ0luZm8sIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShxdWV1ZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKHF1ZXVlLCBwTGFiZWxJbmZvKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVChxdWV1ZSwgcExhYmVsSW5mbyk7CisgICAgfQorICAgIEJlZ2luUXVldWVEZWJ1Z1V0aWxzTGFiZWwobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEsIHF1ZXVlLCBwTGFiZWxJbmZvKTsKKyAgICBEaXNwYXRjaFF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQocXVldWUsIHBMYWJlbEluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKHF1ZXVlLCBwTGFiZWxJbmZvKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShxdWV1ZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVChxdWV1ZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKHF1ZXVlKTsKKyAgICB9CisgICAgRGlzcGF0Y2hRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVChxdWV1ZSk7CisgICAgRW5kUXVldWVEZWJ1Z1V0aWxzTGFiZWwobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEsIHF1ZXVlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQocXVldWUpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShxdWV1ZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVChxdWV1ZSwgcExhYmVsSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKHF1ZXVlLCBwTGFiZWxJbmZvKTsKKyAgICB9CisgICAgSW5zZXJ0UXVldWVEZWJ1Z1V0aWxzTGFiZWwobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEsIHF1ZXVlLCBwTGFiZWxJbmZvKTsKKyAgICBEaXNwYXRjaFF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKHF1ZXVlLCBwTGFiZWxJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQocXVldWUsIHBMYWJlbEluZm8pOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoY29tbWFuZEJ1ZmZlciwgcExhYmVsSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKGNvbW1hbmRCdWZmZXIsIHBMYWJlbEluZm8pOworICAgIH0KKyAgICBEaXNwYXRjaENtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKGNvbW1hbmRCdWZmZXIsIHBMYWJlbEluZm8pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyLCBwTGFiZWxJbmZvKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKGNvbW1hbmRCdWZmZXIpOworICAgIH0KKyAgICBEaXNwYXRjaENtZEVuZERlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKGNvbW1hbmRCdWZmZXIpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyLCBwTGFiZWxJbmZvKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKGNvbW1hbmRCdWZmZXIsIHBMYWJlbEluZm8pOworICAgIH0KKyAgICBEaXNwYXRjaENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyLCBwTGFiZWxJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKGNvbW1hbmRCdWZmZXIsIHBMYWJlbEluZm8pOworICAgIH0KK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQqICAgICAgICAgICAgICAgICAgIHBNZXNzZW5nZXIpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1lc3Nlbmdlcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1lc3Nlbmdlcik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZXNzZW5nZXIpOworICAgIGxheWVyX2NyZWF0ZV9tZXNzZW5nZXJfY2FsbGJhY2sobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEsIGZhbHNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1lc3Nlbmdlcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTWVzc2VuZ2VyLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKGluc3RhbmNlLCBtZXNzZW5nZXIsIHBBbGxvY2F0b3IpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmREZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVChpbnN0YW5jZSwgbWVzc2VuZ2VyLCBwQWxsb2NhdG9yKTsKKyAgICB9CisgICAgRGlzcGF0Y2hEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVChpbnN0YW5jZSwgbWVzc2VuZ2VyLCBwQWxsb2NhdG9yKTsKKyAgICBsYXllcl9kZXN0cm95X2NhbGxiYWNrKGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhLCBtZXNzZW5nZXIsIHBBbGxvY2F0b3IpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVChpbnN0YW5jZSwgbWVzc2VuZ2VyLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgICAgICBtZXNzYWdlU2V2ZXJpdHksCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCAgICAgICAgICAgICBtZXNzYWdlVHlwZXMsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKiBwQ2FsbGJhY2tEYXRhKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoaW5zdGFuY2UsIG1lc3NhZ2VTZXZlcml0eSwgbWVzc2FnZVR5cGVzLCBwQ2FsbGJhY2tEYXRhKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoaW5zdGFuY2UsIG1lc3NhZ2VTZXZlcml0eSwgbWVzc2FnZVR5cGVzLCBwQ2FsbGJhY2tEYXRhKTsKKyAgICB9CisgICAgRGlzcGF0Y2hTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVChpbnN0YW5jZSwgbWVzc2FnZVNldmVyaXR5LCBtZXNzYWdlVHlwZXMsIHBDYWxsYmFja0RhdGEpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVChpbnN0YW5jZSwgbWVzc2FnZVNldmVyaXR5LCBtZXNzYWdlVHlwZXMsIHBDYWxsYmFja0RhdGEpOworICAgIH0KK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogICBwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRChkZXZpY2UsIGJ1ZmZlciwgcFByb3BlcnRpZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoZGV2aWNlLCBidWZmZXIsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRChkZXZpY2UsIGJ1ZmZlciwgcFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRChkZXZpY2UsIGJ1ZmZlciwgcFByb3BlcnRpZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHBJbmZvLAorICAgIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKGRldmljZSwgcEluZm8sIHBCdWZmZXIpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRChkZXZpY2UsIHBJbmZvLCBwQnVmZmVyKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKGRldmljZSwgcEluZm8sIHBCdWZmZXIpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKGRldmljZSwgcEluZm8sIHBCdWZmZXIsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKworCisKKworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoY29tbWFuZEJ1ZmZlciwgcFNhbXBsZUxvY2F0aW9uc0luZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoY29tbWFuZEJ1ZmZlciwgcFNhbXBsZUxvY2F0aW9uc0luZm8pOworICAgIH0KKyAgICBEaXNwYXRjaENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVChjb21tYW5kQnVmZmVyLCBwU2FtcGxlTG9jYXRpb25zSW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVChjb21tYW5kQnVmZmVyLCBwU2FtcGxlTG9jYXRpb25zSW5mbyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogICAgICAgICAgICAgICAgIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVChwaHlzaWNhbERldmljZSwgc2FtcGxlcywgcE11bHRpc2FtcGxlUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKHBoeXNpY2FsRGV2aWNlLCBzYW1wbGVzLCBwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVChwaHlzaWNhbERldmljZSwgc2FtcGxlcywgcE11bHRpc2FtcGxlUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKHBoeXNpY2FsRGV2aWNlLCBzYW1wbGVzLCBwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKKworCisKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogICAgICBwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChkZXZpY2UsIGltYWdlLCBwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChkZXZpY2UsIGltYWdlLCBwUHJvcGVydGllcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoZGV2aWNlLCBpbWFnZSwgcFByb3BlcnRpZXMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChkZXZpY2UsIGltYWdlLCBwUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKGNvbW1hbmRCdWZmZXIsIGltYWdlVmlldywgaW1hZ2VMYXlvdXQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKGNvbW1hbmRCdWZmZXIsIGltYWdlVmlldywgaW1hZ2VMYXlvdXQpOworICAgIH0KKyAgICBEaXNwYXRjaENtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoY29tbWFuZEJ1ZmZlciwgaW1hZ2VWaWV3LCBpbWFnZUxheW91dCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoY29tbWFuZEJ1ZmZlciwgaW1hZ2VWaWV3LCBpbWFnZUxheW91dCk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqICAgICAgICAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoY29tbWFuZEJ1ZmZlciwgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRDb3VudCwgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKGNvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKGNvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVihjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwU2hhZGluZ1JhdGVQYWxldHRlcyk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WICAgICAgICAgICAgICAgICAgIHNhbXBsZU9yZGVyVHlwZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsCisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKGNvbW1hbmRCdWZmZXIsIHNhbXBsZU9yZGVyVHlwZSwgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgcEN1c3RvbVNhbXBsZU9yZGVycyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoY29tbWFuZEJ1ZmZlciwgc2FtcGxlT3JkZXJUeXBlLCBjdXN0b21TYW1wbGVPcmRlckNvdW50LCBwQ3VzdG9tU2FtcGxlT3JkZXJzKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKGNvbW1hbmRCdWZmZXIsIHNhbXBsZU9yZGVyVHlwZSwgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgcEN1c3RvbVNhbXBsZU9yZGVycyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoY29tbWFuZEJ1ZmZlciwgc2FtcGxlT3JkZXJUeXBlLCBjdXN0b21TYW1wbGVPcmRlckNvdW50LCBwQ3VzdG9tU2FtcGxlT3JkZXJzKTsKKyAgICB9Cit9CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQWNjZWxlcmF0aW9uU3RydWN0dXJlLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihkZXZpY2UsIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgcEFsbG9jYXRvcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihkZXZpY2UsIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgcEFsbG9jYXRvcik7CisgICAgfQorICAgIERpc3BhdGNoRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGRldmljZSwgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBwQWxsb2NhdG9yKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGRldmljZSwgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBwQWxsb2NhdG9yKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KKyAgICBEaXNwYXRjaEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXZpY2UsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXZpY2UsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogICAgICAgIHBJbmZvLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZmZzZXQsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaE9mZnNldCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kQnVmZmVyLCBwSW5mbywgaW5zdGFuY2VEYXRhLCBpbnN0YW5jZU9mZnNldCwgdXBkYXRlLCBkc3QsIHNyYywgc2NyYXRjaCwgc2NyYXRjaE9mZnNldCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoY29tbWFuZEJ1ZmZlciwgcEluZm8sIGluc3RhbmNlRGF0YSwgaW5zdGFuY2VPZmZzZXQsIHVwZGF0ZSwgZHN0LCBzcmMsIHNjcmF0Y2gsIHNjcmF0Y2hPZmZzZXQpOworICAgIH0KKyAgICBEaXNwYXRjaENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoY29tbWFuZEJ1ZmZlciwgcEluZm8sIGluc3RhbmNlRGF0YSwgaW5zdGFuY2VPZmZzZXQsIHVwZGF0ZSwgZHN0LCBzcmMsIHNjcmF0Y2gsIHNjcmF0Y2hPZmZzZXQpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGNvbW1hbmRCdWZmZXIsIHBJbmZvLCBpbnN0YW5jZURhdGEsIGluc3RhbmNlT2Zmc2V0LCB1cGRhdGUsIGRzdCwgc3JjLCBzY3JhdGNoLCBzY3JhdGNoT2Zmc2V0KTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WICAgICAgICAgICBtb2RlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoY29tbWFuZEJ1ZmZlciwgZHN0LCBzcmMsIG1vZGUpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoY29tbWFuZEJ1ZmZlciwgZHN0LCBzcmMsIG1vZGUpOworICAgIH0KKyAgICBEaXNwYXRjaENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kQnVmZmVyLCBkc3QsIHNyYywgbW9kZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kQnVmZmVyLCBkc3QsIHNyYywgbW9kZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRUcmFjZVJheXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kVHJhY2VSYXlzTlYoY29tbWFuZEJ1ZmZlciwgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgaGl0U2hhZGVyQmluZGluZ09mZnNldCwgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZFRyYWNlUmF5c05WKGNvbW1hbmRCdWZmZXIsIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLCBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwgd2lkdGgsIGhlaWdodCwgZGVwdGgpOworICAgIH0KKyAgICBEaXNwYXRjaENtZFRyYWNlUmF5c05WKGNvbW1hbmRCdWZmZXIsIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLCBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwgd2lkdGgsIGhlaWdodCwgZGVwdGgpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRUcmFjZVJheXNOVihjb21tYW5kQnVmZmVyLCByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LCBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LCBoaXRTaGFkZXJCaW5kaW5nU3RyaWRlLCBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0R3JvdXAsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoZGV2aWNlLCBwaXBlbGluZSwgZmlyc3RHcm91cCwgZ3JvdXBDb3VudCwgZGF0YVNpemUsIHBEYXRhKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVihkZXZpY2UsIHBpcGVsaW5lLCBmaXJzdEdyb3VwLCBncm91cENvdW50LCBkYXRhU2l6ZSwgcERhdGEpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVihkZXZpY2UsIHBpcGVsaW5lLCBmaXJzdEdyb3VwLCBncm91cENvdW50LCBkYXRhU2l6ZSwgcERhdGEpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoZGV2aWNlLCBwaXBlbGluZSwgZmlyc3RHcm91cCwgZ3JvdXBDb3VudCwgZGF0YVNpemUsIHBEYXRhLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKGRldmljZSwgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBkYXRhU2l6ZSwgcERhdGEpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoZGV2aWNlLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGRhdGFTaXplLCBwRGF0YSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoZGV2aWNlLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGRhdGFTaXplLCBwRGF0YSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKGRldmljZSwgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBkYXRhU2l6ZSwgcERhdGEsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLAorICAgIFZrUXVlcnlUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKGNvbW1hbmRCdWZmZXIsIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LCBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywgcXVlcnlUeXBlLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnkpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoY29tbWFuZEJ1ZmZlciwgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCBxdWVyeVR5cGUsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKGNvbW1hbmRCdWZmZXIsIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LCBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywgcXVlcnlUeXBlLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnkpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoY29tbWFuZEJ1ZmZlciwgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCBxdWVyeVR5cGUsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDb21waWxlRGVmZXJyZWROVihkZXZpY2UsIHBpcGVsaW5lLCBzaGFkZXIpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ29tcGlsZURlZmVycmVkTlYoZGV2aWNlLCBwaXBlbGluZSwgc2hhZGVyKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDb21waWxlRGVmZXJyZWROVihkZXZpY2UsIHBpcGVsaW5lLCBzaGFkZXIpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDb21waWxlRGVmZXJyZWROVihkZXZpY2UsIHBpcGVsaW5lLCBzaGFkZXIsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXIsCisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqICAgICAgICAgICBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVChkZXZpY2UsIGhhbmRsZVR5cGUsIHBIb3N0UG9pbnRlciwgcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoZGV2aWNlLCBoYW5kbGVUeXBlLCBwSG9zdFBvaW50ZXIsIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVChkZXZpY2UsIGhhbmRsZVR5cGUsIHBIb3N0UG9pbnRlciwgcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVChkZXZpY2UsIGhhbmRsZVR5cGUsIHBIb3N0UG9pbnRlciwgcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZVN0YWdlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRChjb21tYW5kQnVmZmVyLCBwaXBlbGluZVN0YWdlLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgbWFya2VyKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVTdGFnZSwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIG1hcmtlcik7CisgICAgfQorICAgIERpc3BhdGNoQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVTdGFnZSwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIG1hcmtlcik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFdyaXRlQnVmZmVyTWFya2VyQU1EKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lU3RhZ2UsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBtYXJrZXIpOworICAgIH0KK30KKworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEb21haW5Db3VudCwKKyAgICBWa1RpbWVEb21haW5FWFQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWlucykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKHBoeXNpY2FsRGV2aWNlLCBwVGltZURvbWFpbkNvdW50LCBwVGltZURvbWFpbnMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQocGh5c2ljYWxEZXZpY2UsIHBUaW1lRG9tYWluQ291bnQsIHBUaW1lRG9tYWlucyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQocGh5c2ljYWxEZXZpY2UsIHBUaW1lRG9tYWluQ291bnQsIHBUaW1lRG9tYWlucyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKHBoeXNpY2FsRGV2aWNlLCBwVGltZURvbWFpbkNvdW50LCBwVGltZURvbWFpbnMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcENvdW50LAorICAgIGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqICAgICAgICAgcFRpbWVzdGFtcEluZm9zLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVzdGFtcHMsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF4RGV2aWF0aW9uKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKGRldmljZSwgdGltZXN0YW1wQ291bnQsIHBUaW1lc3RhbXBJbmZvcywgcFRpbWVzdGFtcHMsIHBNYXhEZXZpYXRpb24pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoZGV2aWNlLCB0aW1lc3RhbXBDb3VudCwgcFRpbWVzdGFtcEluZm9zLCBwVGltZXN0YW1wcywgcE1heERldmlhdGlvbik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoZGV2aWNlLCB0aW1lc3RhbXBDb3VudCwgcFRpbWVzdGFtcEluZm9zLCBwVGltZXN0YW1wcywgcE1heERldmlhdGlvbik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKGRldmljZSwgdGltZXN0YW1wQ291bnQsIHBUaW1lc3RhbXBJbmZvcywgcFRpbWVzdGFtcHMsIHBNYXhEZXZpYXRpb24sIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCisKKworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NOVihjb21tYW5kQnVmZmVyLCB0YXNrQ291bnQsIGZpcnN0VGFzayk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NOVihjb21tYW5kQnVmZmVyLCB0YXNrQ291bnQsIGZpcnN0VGFzayk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRHJhd01lc2hUYXNrc05WKGNvbW1hbmRCdWZmZXIsIHRhc2tDb3VudCwgZmlyc3RUYXNrKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc05WKGNvbW1hbmRCdWZmZXIsIHRhc2tDb3VudCwgZmlyc3RUYXNrKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgfQorICAgIERpc3BhdGNoQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworICAgIH0KK30KKworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKGNvbW1hbmRCdWZmZXIsIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBwRXhjbHVzaXZlU2Npc3NvcnMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoY29tbWFuZEJ1ZmZlciwgZmlyc3RFeGNsdXNpdmVTY2lzc29yLCBleGNsdXNpdmVTY2lzc29yQ291bnQsIHBFeGNsdXNpdmVTY2lzc29ycyk7CisgICAgfQorICAgIERpc3BhdGNoQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKGNvbW1hbmRCdWZmZXIsIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBwRXhjbHVzaXZlU2Npc3NvcnMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoY29tbWFuZEJ1ZmZlciwgZmlyc3RFeGNsdXNpdmVTY2lzc29yLCBleGNsdXNpdmVTY2lzc29yQ291bnQsIHBFeGNsdXNpdmVTY2lzc29ycyk7CisgICAgfQorfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldENoZWNrcG9pbnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludE1hcmtlcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0Q2hlY2twb2ludE5WKGNvbW1hbmRCdWZmZXIsIHBDaGVja3BvaW50TWFya2VyKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0Q2hlY2twb2ludE5WKGNvbW1hbmRCdWZmZXIsIHBDaGVja3BvaW50TWFya2VyKTsKKyAgICB9CisgICAgRGlzcGF0Y2hDbWRTZXRDaGVja3BvaW50TlYoY29tbWFuZEJ1ZmZlciwgcENoZWNrcG9pbnRNYXJrZXIpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDbWRTZXRDaGVja3BvaW50TlYoY29tbWFuZEJ1ZmZlciwgcENoZWNrcG9pbnRNYXJrZXIpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGFDb3VudCwKKyAgICBWa0NoZWNrcG9pbnREYXRhTlYqICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHF1ZXVlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFF1ZXVlQ2hlY2twb2ludERhdGFOVihxdWV1ZSwgcENoZWNrcG9pbnREYXRhQ291bnQsIHBDaGVja3BvaW50RGF0YSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFF1ZXVlQ2hlY2twb2ludERhdGFOVihxdWV1ZSwgcENoZWNrcG9pbnREYXRhQ291bnQsIHBDaGVja3BvaW50RGF0YSk7CisgICAgfQorICAgIERpc3BhdGNoR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKHF1ZXVlLCBwQ2hlY2twb2ludERhdGFDb3VudCwgcENoZWNrcG9pbnREYXRhKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKHF1ZXVlLCBwQ2hlY2twb2ludERhdGFDb3VudCwgcENoZWNrcG9pbnREYXRhKTsKKyAgICB9Cit9CisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqICBwSW5pdGlhbGl6ZUluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoZGV2aWNlLCBwSW5pdGlhbGl6ZUluZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoZGV2aWNlLCBwSW5pdGlhbGl6ZUluZm8pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKGRldmljZSwgcEluaXRpYWxpemVJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoZGV2aWNlLCBwSW5pdGlhbGl6ZUluZm8sIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTChkZXZpY2UpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKGRldmljZSk7CisgICAgfQorICAgIERpc3BhdGNoVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTChkZXZpY2UpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKGRldmljZSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogICAgICAgICBwTWFya2VySW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTChjb21tYW5kQnVmZmVyLCBwTWFya2VySW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTChjb21tYW5kQnVmZmVyLCBwTWFya2VySW5mbywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwqICAgcE1hcmtlckluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTChjb21tYW5kQnVmZmVyLCBwTWFya2VySW5mbyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTChjb21tYW5kQnVmZmVyLCBwTWFya2VySW5mbyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8sIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogICAgICAgcE92ZXJyaWRlSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKGNvbW1hbmRCdWZmZXIsIHBPdmVycmlkZUluZm8pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKGNvbW1hbmRCdWZmZXIsIHBPdmVycmlkZUluZm8pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaENtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTChjb21tYW5kQnVmZmVyLCBwT3ZlcnJpZGVJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKGNvbW1hbmRCdWZmZXIsIHBPdmVycmlkZUluZm8sIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoZGV2aWNlLCBwQWNxdWlyZUluZm8sIHBDb25maWd1cmF0aW9uKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChkZXZpY2UsIHBBY3F1aXJlSW5mbywgcENvbmZpZ3VyYXRpb24pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChkZXZpY2UsIHBBY3F1aXJlSW5mbywgcENvbmZpZ3VyYXRpb24pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoZGV2aWNlLCBwQWNxdWlyZUluZm8sIHBDb25maWd1cmF0aW9uLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoZGV2aWNlLCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChkZXZpY2UsIGNvbmZpZ3VyYXRpb24pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChkZXZpY2UsIGNvbmZpZ3VyYXRpb24pOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoZGV2aWNlLCBjb25maWd1cmF0aW9uLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHF1ZXVlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwocXVldWUsIGNvbmZpZ3VyYXRpb24pOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChxdWV1ZSwgY29uZmlndXJhdGlvbik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChxdWV1ZSwgY29uZmlndXJhdGlvbik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwocXVldWUsIGNvbmZpZ3VyYXRpb24sIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgICAgICAgICAgICAgcGFyYW1ldGVyLAorICAgIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiAgICAgICAgICAgICAgICAgICAgcFZhbHVlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoZGV2aWNlLCBwYXJhbWV0ZXIsIHBWYWx1ZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKGRldmljZSwgcGFyYW1ldGVyLCBwVmFsdWUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoZGV2aWNlLCBwYXJhbWV0ZXIsIHBWYWx1ZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoZGV2aWNlLCBwYXJhbWV0ZXIsIHBWYWx1ZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVTZXRMb2NhbERpbW1pbmdBTUQoZGV2aWNlLCBzd2FwQ2hhaW4sIGxvY2FsRGltbWluZ0VuYWJsZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZFNldExvY2FsRGltbWluZ0FNRChkZXZpY2UsIHN3YXBDaGFpbiwgbG9jYWxEaW1taW5nRW5hYmxlKTsKKyAgICB9CisgICAgRGlzcGF0Y2hTZXRMb2NhbERpbW1pbmdBTUQoZGV2aWNlLCBzd2FwQ2hhaW4sIGxvY2FsRGltbWluZ0VuYWJsZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFNldExvY2FsRGltbWluZ0FNRChkZXZpY2UsIHN3YXBDaGFpbiwgbG9jYWxEaW1taW5nRW5hYmxlKTsKKyAgICB9Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQShpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQShpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZU1ldGFsU3VyZmFjZUVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZU1ldGFsU3VyZmFjZUVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVNZXRhbFN1cmZhY2VFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZU1ldGFsU3VyZmFjZUVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworCisKKworCisKKworCisKKworCisKK1ZLQVBJX0FUVFIgVmtEZXZpY2VBZGRyZXNzIFZLQVBJX0NBTEwgR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoZGV2aWNlLCBwSW5mbyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChkZXZpY2UsIHBJbmZvKTsKKyAgICB9CisgICAgVmtEZXZpY2VBZGRyZXNzIHJlc3VsdCA9IERpc3BhdGNoR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChkZXZpY2UsIHBJbmZvKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChkZXZpY2UsIHBJbmZvLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9vbENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogICAgICAgICAgcFRvb2xQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVChwaHlzaWNhbERldmljZSwgcFRvb2xDb3VudCwgcFRvb2xQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQocGh5c2ljYWxEZXZpY2UsIHBUb29sQ291bnQsIHBUb29sUHJvcGVydGllcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVChwaHlzaWNhbERldmljZSwgcFRvb2xDb3VudCwgcFRvb2xQcm9wZXJ0aWVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVChwaHlzaWNhbERldmljZSwgcFRvb2xDb3VudCwgcFRvb2xQcm9wZXJ0aWVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tYmluYXRpb25Db3VudCwKKyAgICBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogICAgIHBDb21iaW5hdGlvbnMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYocGh5c2ljYWxEZXZpY2UsIHBDb21iaW5hdGlvbkNvdW50LCBwQ29tYmluYXRpb25zKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVihwaHlzaWNhbERldmljZSwgcENvbWJpbmF0aW9uQ291bnQsIHBDb21iaW5hdGlvbnMpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVihwaHlzaWNhbERldmljZSwgcENvbWJpbmF0aW9uQ291bnQsIHBDb21iaW5hdGlvbnMpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYocGh5c2ljYWxEZXZpY2UsIHBDb21iaW5hdGlvbkNvdW50LCBwQ29tYmluYXRpb25zLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQocGh5c2ljYWxEZXZpY2UsIHBTdXJmYWNlSW5mbywgcFByZXNlbnRNb2RlQ291bnQsIHBQcmVzZW50TW9kZXMpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChwaHlzaWNhbERldmljZSwgcFN1cmZhY2VJbmZvLCBwUHJlc2VudE1vZGVDb3VudCwgcFByZXNlbnRNb2Rlcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChwaHlzaWNhbERldmljZSwgcFN1cmZhY2VJbmZvLCBwUHJlc2VudE1vZGVDb3VudCwgcFByZXNlbnRNb2Rlcyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQocGh5c2ljYWxEZXZpY2UsIHBTdXJmYWNlSW5mbywgcFByZXNlbnRNb2RlQ291bnQsIHBQcmVzZW50TW9kZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKGRldmljZSwgc3dhcGNoYWluKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKGRldmljZSwgc3dhcGNoYWluKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKGRldmljZSwgc3dhcGNoYWluLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoZGV2aWNlLCBzd2FwY2hhaW4pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaFJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZFJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbiwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChkZXZpY2UsIHBTdXJmYWNlSW5mbywgcE1vZGVzKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoZGV2aWNlLCBwU3VyZmFjZUluZm8sIHBNb2Rlcyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChkZXZpY2UsIHBTdXJmYWNlSW5mbywgcE1vZGVzKTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChkZXZpY2UsIHBTdXJmYWNlSW5mbywgcE1vZGVzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZENyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldExpbmVTdGlwcGxlRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlRmFjdG9yLAorICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVQYXR0ZXJuKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDbWRTZXRMaW5lU3RpcHBsZUVYVChjb21tYW5kQnVmZmVyLCBsaW5lU3RpcHBsZUZhY3RvciwgbGluZVN0aXBwbGVQYXR0ZXJuKTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ21kU2V0TGluZVN0aXBwbGVFWFQoY29tbWFuZEJ1ZmZlciwgbGluZVN0aXBwbGVGYWN0b3IsIGxpbmVTdGlwcGxlUGF0dGVybik7CisgICAgfQorICAgIERpc3BhdGNoQ21kU2V0TGluZVN0aXBwbGVFWFQoY29tbWFuZEJ1ZmZlciwgbGluZVN0aXBwbGVGYWN0b3IsIGxpbmVTdGlwcGxlUGF0dGVybik7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENtZFNldExpbmVTdGlwcGxlRVhUKGNvbW1hbmRCdWZmZXIsIGxpbmVTdGlwcGxlRmFjdG9yLCBsaW5lU3RpcHBsZVBhdHRlcm4pOworICAgIH0KK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBSZXNldFF1ZXJ5UG9vbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50KSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZVJlc2V0UXVlcnlQb29sRVhUKGRldmljZSwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKKyAgICAgICAgaWYgKHNraXApIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkUmVzZXRRdWVyeVBvb2xFWFQoZGV2aWNlLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQpOworICAgIH0KKyAgICBEaXNwYXRjaFJlc2V0UXVlcnlQb29sRVhUKGRldmljZSwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkUmVzZXRRdWVyeVBvb2xFWFQoZGV2aWNlLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQpOworICAgIH0KK30KKworCisKKworCisvLyBNYXAgb2YgaW50ZXJjZXB0ZWQgQXBpTmFtZSB0byBpdHMgYXNzb2NpYXRlZCBmdW5jdGlvbiBkYXRhCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggc3VwcHJlc3M6IDYyNjIgKSAvLyBWUyBhbmFseXNpczogdGhpcyB1c2VzIG1vcmUgdGhhbiAxNiBraUIsIHdoaWNoIGlzIGZpbmUgaGVyZSBhdCBnbG9iYWwgc2NvcGUKKyNlbmRpZgorY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBmdW5jdGlvbl9kYXRhPiBuYW1lX3RvX2Z1bmNwdHJfbWFwID0geworICAgIHsidmtDcmVhdGVJbnN0YW5jZSIsIHt0cnVlLCAodm9pZCopQ3JlYXRlSW5zdGFuY2V9fSwKKyAgICB7InZrRGVzdHJveUluc3RhbmNlIiwge3RydWUsICh2b2lkKilEZXN0cm95SW5zdGFuY2V9fSwKKyAgICB7InZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzIiwge3RydWUsICh2b2lkKilFbnVtZXJhdGVQaHlzaWNhbERldmljZXN9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlc319LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc319LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXN9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXN9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzfX0sCisgICAgeyJ2a0dldEluc3RhbmNlUHJvY0FkZHIiLCB7dHJ1ZSwgKHZvaWQqKUdldEluc3RhbmNlUHJvY0FkZHJ9fSwKKyAgICB7InZrR2V0RGV2aWNlUHJvY0FkZHIiLCB7ZmFsc2UsICh2b2lkKilHZXREZXZpY2VQcm9jQWRkcn19LAorICAgIHsidmtDcmVhdGVEZXZpY2UiLCB7dHJ1ZSwgKHZvaWQqKUNyZWF0ZURldmljZX19LAorICAgIHsidmtEZXN0cm95RGV2aWNlIiwge2ZhbHNlLCAodm9pZCopRGVzdHJveURldmljZX19LAorICAgIHsidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMiLCB7ZmFsc2UsICh2b2lkKilFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXN9fSwKKyAgICB7InZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyIsIHt0cnVlLCAodm9pZCopRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllc319LAorICAgIHsidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIsIHtmYWxzZSwgKHZvaWQqKUVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzfX0sCisgICAgeyJ2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyIsIHt0cnVlLCAodm9pZCopRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzfX0sCisgICAgeyJ2a0dldERldmljZVF1ZXVlIiwge2ZhbHNlLCAodm9pZCopR2V0RGV2aWNlUXVldWV9fSwKKyAgICB7InZrUXVldWVTdWJtaXQiLCB7ZmFsc2UsICh2b2lkKilRdWV1ZVN1Ym1pdH19LAorICAgIHsidmtRdWV1ZVdhaXRJZGxlIiwge2ZhbHNlLCAodm9pZCopUXVldWVXYWl0SWRsZX19LAorICAgIHsidmtEZXZpY2VXYWl0SWRsZSIsIHtmYWxzZSwgKHZvaWQqKURldmljZVdhaXRJZGxlfX0sCisgICAgeyJ2a0FsbG9jYXRlTWVtb3J5Iiwge2ZhbHNlLCAodm9pZCopQWxsb2NhdGVNZW1vcnl9fSwKKyAgICB7InZrRnJlZU1lbW9yeSIsIHtmYWxzZSwgKHZvaWQqKUZyZWVNZW1vcnl9fSwKKyAgICB7InZrTWFwTWVtb3J5Iiwge2ZhbHNlLCAodm9pZCopTWFwTWVtb3J5fX0sCisgICAgeyJ2a1VubWFwTWVtb3J5Iiwge2ZhbHNlLCAodm9pZCopVW5tYXBNZW1vcnl9fSwKKyAgICB7InZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiLCB7ZmFsc2UsICh2b2lkKilGbHVzaE1hcHBlZE1lbW9yeVJhbmdlc319LAorICAgIHsidmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIiwge2ZhbHNlLCAodm9pZCopSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlc319LAorICAgIHsidmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50Iiwge2ZhbHNlLCAodm9pZCopR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudH19LAorICAgIHsidmtCaW5kQnVmZmVyTWVtb3J5Iiwge2ZhbHNlLCAodm9pZCopQmluZEJ1ZmZlck1lbW9yeX19LAorICAgIHsidmtCaW5kSW1hZ2VNZW1vcnkiLCB7ZmFsc2UsICh2b2lkKilCaW5kSW1hZ2VNZW1vcnl9fSwKKyAgICB7InZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIiwge2ZhbHNlLCAodm9pZCopR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzfX0sCisgICAgeyJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIiwge2ZhbHNlLCAodm9pZCopR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHN9fSwKKyAgICB7InZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiLCB7ZmFsc2UsICh2b2lkKilHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c319LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXN9fSwKKyAgICB7InZrUXVldWVCaW5kU3BhcnNlIiwge2ZhbHNlLCAodm9pZCopUXVldWVCaW5kU3BhcnNlfX0sCisgICAgeyJ2a0NyZWF0ZUZlbmNlIiwge2ZhbHNlLCAodm9pZCopQ3JlYXRlRmVuY2V9fSwKKyAgICB7InZrRGVzdHJveUZlbmNlIiwge2ZhbHNlLCAodm9pZCopRGVzdHJveUZlbmNlfX0sCisgICAgeyJ2a1Jlc2V0RmVuY2VzIiwge2ZhbHNlLCAodm9pZCopUmVzZXRGZW5jZXN9fSwKKyAgICB7InZrR2V0RmVuY2VTdGF0dXMiLCB7ZmFsc2UsICh2b2lkKilHZXRGZW5jZVN0YXR1c319LAorICAgIHsidmtXYWl0Rm9yRmVuY2VzIiwge2ZhbHNlLCAodm9pZCopV2FpdEZvckZlbmNlc319LAorICAgIHsidmtDcmVhdGVTZW1hcGhvcmUiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVTZW1hcGhvcmV9fSwKKyAgICB7InZrRGVzdHJveVNlbWFwaG9yZSIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lTZW1hcGhvcmV9fSwKKyAgICB7InZrQ3JlYXRlRXZlbnQiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVFdmVudH19LAorICAgIHsidmtEZXN0cm95RXZlbnQiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95RXZlbnR9fSwKKyAgICB7InZrR2V0RXZlbnRTdGF0dXMiLCB7ZmFsc2UsICh2b2lkKilHZXRFdmVudFN0YXR1c319LAorICAgIHsidmtTZXRFdmVudCIsIHtmYWxzZSwgKHZvaWQqKVNldEV2ZW50fX0sCisgICAgeyJ2a1Jlc2V0RXZlbnQiLCB7ZmFsc2UsICh2b2lkKilSZXNldEV2ZW50fX0sCisgICAgeyJ2a0NyZWF0ZVF1ZXJ5UG9vbCIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZVF1ZXJ5UG9vbH19LAorICAgIHsidmtEZXN0cm95UXVlcnlQb29sIiwge2ZhbHNlLCAodm9pZCopRGVzdHJveVF1ZXJ5UG9vbH19LAorICAgIHsidmtHZXRRdWVyeVBvb2xSZXN1bHRzIiwge2ZhbHNlLCAodm9pZCopR2V0UXVlcnlQb29sUmVzdWx0c319LAorICAgIHsidmtDcmVhdGVCdWZmZXIiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVCdWZmZXJ9fSwKKyAgICB7InZrRGVzdHJveUJ1ZmZlciIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lCdWZmZXJ9fSwKKyAgICB7InZrQ3JlYXRlQnVmZmVyVmlldyIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZUJ1ZmZlclZpZXd9fSwKKyAgICB7InZrRGVzdHJveUJ1ZmZlclZpZXciLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95QnVmZmVyVmlld319LAorICAgIHsidmtDcmVhdGVJbWFnZSIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZUltYWdlfX0sCisgICAgeyJ2a0Rlc3Ryb3lJbWFnZSIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lJbWFnZX19LAorICAgIHsidmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0Iiwge2ZhbHNlLCAodm9pZCopR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dH19LAorICAgIHsidmtDcmVhdGVJbWFnZVZpZXciLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVJbWFnZVZpZXd9fSwKKyAgICB7InZrRGVzdHJveUltYWdlVmlldyIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lJbWFnZVZpZXd9fSwKKyAgICB7InZrQ3JlYXRlU2hhZGVyTW9kdWxlIiwge2ZhbHNlLCAodm9pZCopQ3JlYXRlU2hhZGVyTW9kdWxlfX0sCisgICAgeyJ2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95U2hhZGVyTW9kdWxlfX0sCisgICAgeyJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVQaXBlbGluZUNhY2hlfX0sCisgICAgeyJ2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlIiwge2ZhbHNlLCAodm9pZCopRGVzdHJveVBpcGVsaW5lQ2FjaGV9fSwKKyAgICB7InZrR2V0UGlwZWxpbmVDYWNoZURhdGEiLCB7ZmFsc2UsICh2b2lkKilHZXRQaXBlbGluZUNhY2hlRGF0YX19LAorICAgIHsidmtNZXJnZVBpcGVsaW5lQ2FjaGVzIiwge2ZhbHNlLCAodm9pZCopTWVyZ2VQaXBlbGluZUNhY2hlc319LAorICAgIHsidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzfX0sCisgICAgeyJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVDb21wdXRlUGlwZWxpbmVzfX0sCisgICAgeyJ2a0Rlc3Ryb3lQaXBlbGluZSIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lQaXBlbGluZX19LAorICAgIHsidmtDcmVhdGVQaXBlbGluZUxheW91dCIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZVBpcGVsaW5lTGF5b3V0fX0sCisgICAgeyJ2a0Rlc3Ryb3lQaXBlbGluZUxheW91dCIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lQaXBlbGluZUxheW91dH19LAorICAgIHsidmtDcmVhdGVTYW1wbGVyIiwge2ZhbHNlLCAodm9pZCopQ3JlYXRlU2FtcGxlcn19LAorICAgIHsidmtEZXN0cm95U2FtcGxlciIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lTYW1wbGVyfX0sCisgICAgeyJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0fX0sCisgICAgeyJ2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0Iiwge2ZhbHNlLCAodm9pZCopRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXR9fSwKKyAgICB7InZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVEZXNjcmlwdG9yUG9vbH19LAorICAgIHsidmtEZXN0cm95RGVzY3JpcHRvclBvb2wiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95RGVzY3JpcHRvclBvb2x9fSwKKyAgICB7InZrUmVzZXREZXNjcmlwdG9yUG9vbCIsIHtmYWxzZSwgKHZvaWQqKVJlc2V0RGVzY3JpcHRvclBvb2x9fSwKKyAgICB7InZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyIsIHtmYWxzZSwgKHZvaWQqKUFsbG9jYXRlRGVzY3JpcHRvclNldHN9fSwKKyAgICB7InZrRnJlZURlc2NyaXB0b3JTZXRzIiwge2ZhbHNlLCAodm9pZCopRnJlZURlc2NyaXB0b3JTZXRzfX0sCisgICAgeyJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRzIiwge2ZhbHNlLCAodm9pZCopVXBkYXRlRGVzY3JpcHRvclNldHN9fSwKKyAgICB7InZrQ3JlYXRlRnJhbWVidWZmZXIiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVGcmFtZWJ1ZmZlcn19LAorICAgIHsidmtEZXN0cm95RnJhbWVidWZmZXIiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95RnJhbWVidWZmZXJ9fSwKKyAgICB7InZrQ3JlYXRlUmVuZGVyUGFzcyIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZVJlbmRlclBhc3N9fSwKKyAgICB7InZrRGVzdHJveVJlbmRlclBhc3MiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95UmVuZGVyUGFzc319LAorICAgIHsidmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiLCB7ZmFsc2UsICh2b2lkKilHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHl9fSwKKyAgICB7InZrQ3JlYXRlQ29tbWFuZFBvb2wiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVDb21tYW5kUG9vbH19LAorICAgIHsidmtEZXN0cm95Q29tbWFuZFBvb2wiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95Q29tbWFuZFBvb2x9fSwKKyAgICB7InZrUmVzZXRDb21tYW5kUG9vbCIsIHtmYWxzZSwgKHZvaWQqKVJlc2V0Q29tbWFuZFBvb2x9fSwKKyAgICB7InZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyIsIHtmYWxzZSwgKHZvaWQqKUFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnN9fSwKKyAgICB7InZrRnJlZUNvbW1hbmRCdWZmZXJzIiwge2ZhbHNlLCAodm9pZCopRnJlZUNvbW1hbmRCdWZmZXJzfX0sCisgICAgeyJ2a0JlZ2luQ29tbWFuZEJ1ZmZlciIsIHtmYWxzZSwgKHZvaWQqKUJlZ2luQ29tbWFuZEJ1ZmZlcn19LAorICAgIHsidmtFbmRDb21tYW5kQnVmZmVyIiwge2ZhbHNlLCAodm9pZCopRW5kQ29tbWFuZEJ1ZmZlcn19LAorICAgIHsidmtSZXNldENvbW1hbmRCdWZmZXIiLCB7ZmFsc2UsICh2b2lkKilSZXNldENvbW1hbmRCdWZmZXJ9fSwKKyAgICB7InZrQ21kQmluZFBpcGVsaW5lIiwge2ZhbHNlLCAodm9pZCopQ21kQmluZFBpcGVsaW5lfX0sCisgICAgeyJ2a0NtZFNldFZpZXdwb3J0Iiwge2ZhbHNlLCAodm9pZCopQ21kU2V0Vmlld3BvcnR9fSwKKyAgICB7InZrQ21kU2V0U2Npc3NvciIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldFNjaXNzb3J9fSwKKyAgICB7InZrQ21kU2V0TGluZVdpZHRoIiwge2ZhbHNlLCAodm9pZCopQ21kU2V0TGluZVdpZHRofX0sCisgICAgeyJ2a0NtZFNldERlcHRoQmlhcyIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldERlcHRoQmlhc319LAorICAgIHsidmtDbWRTZXRCbGVuZENvbnN0YW50cyIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldEJsZW5kQ29uc3RhbnRzfX0sCisgICAgeyJ2a0NtZFNldERlcHRoQm91bmRzIiwge2ZhbHNlLCAodm9pZCopQ21kU2V0RGVwdGhCb3VuZHN9fSwKKyAgICB7InZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrIiwge2ZhbHNlLCAodm9pZCopQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrfX0sCisgICAgeyJ2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2siLCB7ZmFsc2UsICh2b2lkKilDbWRTZXRTdGVuY2lsV3JpdGVNYXNrfX0sCisgICAgeyJ2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UiLCB7ZmFsc2UsICh2b2lkKilDbWRTZXRTdGVuY2lsUmVmZXJlbmNlfX0sCisgICAgeyJ2a0NtZEJpbmREZXNjcmlwdG9yU2V0cyIsIHtmYWxzZSwgKHZvaWQqKUNtZEJpbmREZXNjcmlwdG9yU2V0c319LAorICAgIHsidmtDbWRCaW5kSW5kZXhCdWZmZXIiLCB7ZmFsc2UsICh2b2lkKilDbWRCaW5kSW5kZXhCdWZmZXJ9fSwKKyAgICB7InZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiLCB7ZmFsc2UsICh2b2lkKilDbWRCaW5kVmVydGV4QnVmZmVyc319LAorICAgIHsidmtDbWREcmF3Iiwge2ZhbHNlLCAodm9pZCopQ21kRHJhd319LAorICAgIHsidmtDbWREcmF3SW5kZXhlZCIsIHtmYWxzZSwgKHZvaWQqKUNtZERyYXdJbmRleGVkfX0sCisgICAgeyJ2a0NtZERyYXdJbmRpcmVjdCIsIHtmYWxzZSwgKHZvaWQqKUNtZERyYXdJbmRpcmVjdH19LAorICAgIHsidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Iiwge2ZhbHNlLCAodm9pZCopQ21kRHJhd0luZGV4ZWRJbmRpcmVjdH19LAorICAgIHsidmtDbWREaXNwYXRjaCIsIHtmYWxzZSwgKHZvaWQqKUNtZERpc3BhdGNofX0sCisgICAgeyJ2a0NtZERpc3BhdGNoSW5kaXJlY3QiLCB7ZmFsc2UsICh2b2lkKilDbWREaXNwYXRjaEluZGlyZWN0fX0sCisgICAgeyJ2a0NtZENvcHlCdWZmZXIiLCB7ZmFsc2UsICh2b2lkKilDbWRDb3B5QnVmZmVyfX0sCisgICAgeyJ2a0NtZENvcHlJbWFnZSIsIHtmYWxzZSwgKHZvaWQqKUNtZENvcHlJbWFnZX19LAorICAgIHsidmtDbWRCbGl0SW1hZ2UiLCB7ZmFsc2UsICh2b2lkKilDbWRCbGl0SW1hZ2V9fSwKKyAgICB7InZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UiLCB7ZmFsc2UsICh2b2lkKilDbWRDb3B5QnVmZmVyVG9JbWFnZX19LAorICAgIHsidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciIsIHtmYWxzZSwgKHZvaWQqKUNtZENvcHlJbWFnZVRvQnVmZmVyfX0sCisgICAgeyJ2a0NtZFVwZGF0ZUJ1ZmZlciIsIHtmYWxzZSwgKHZvaWQqKUNtZFVwZGF0ZUJ1ZmZlcn19LAorICAgIHsidmtDbWRGaWxsQnVmZmVyIiwge2ZhbHNlLCAodm9pZCopQ21kRmlsbEJ1ZmZlcn19LAorICAgIHsidmtDbWRDbGVhckNvbG9ySW1hZ2UiLCB7ZmFsc2UsICh2b2lkKilDbWRDbGVhckNvbG9ySW1hZ2V9fSwKKyAgICB7InZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIsIHtmYWxzZSwgKHZvaWQqKUNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2V9fSwKKyAgICB7InZrQ21kQ2xlYXJBdHRhY2htZW50cyIsIHtmYWxzZSwgKHZvaWQqKUNtZENsZWFyQXR0YWNobWVudHN9fSwKKyAgICB7InZrQ21kUmVzb2x2ZUltYWdlIiwge2ZhbHNlLCAodm9pZCopQ21kUmVzb2x2ZUltYWdlfX0sCisgICAgeyJ2a0NtZFNldEV2ZW50Iiwge2ZhbHNlLCAodm9pZCopQ21kU2V0RXZlbnR9fSwKKyAgICB7InZrQ21kUmVzZXRFdmVudCIsIHtmYWxzZSwgKHZvaWQqKUNtZFJlc2V0RXZlbnR9fSwKKyAgICB7InZrQ21kV2FpdEV2ZW50cyIsIHtmYWxzZSwgKHZvaWQqKUNtZFdhaXRFdmVudHN9fSwKKyAgICB7InZrQ21kUGlwZWxpbmVCYXJyaWVyIiwge2ZhbHNlLCAodm9pZCopQ21kUGlwZWxpbmVCYXJyaWVyfX0sCisgICAgeyJ2a0NtZEJlZ2luUXVlcnkiLCB7ZmFsc2UsICh2b2lkKilDbWRCZWdpblF1ZXJ5fX0sCisgICAgeyJ2a0NtZEVuZFF1ZXJ5Iiwge2ZhbHNlLCAodm9pZCopQ21kRW5kUXVlcnl9fSwKKyAgICB7InZrQ21kUmVzZXRRdWVyeVBvb2wiLCB7ZmFsc2UsICh2b2lkKilDbWRSZXNldFF1ZXJ5UG9vbH19LAorICAgIHsidmtDbWRXcml0ZVRpbWVzdGFtcCIsIHtmYWxzZSwgKHZvaWQqKUNtZFdyaXRlVGltZXN0YW1wfX0sCisgICAgeyJ2a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzIiwge2ZhbHNlLCAodm9pZCopQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHN9fSwKKyAgICB7InZrQ21kUHVzaENvbnN0YW50cyIsIHtmYWxzZSwgKHZvaWQqKUNtZFB1c2hDb25zdGFudHN9fSwKKyAgICB7InZrQ21kQmVnaW5SZW5kZXJQYXNzIiwge2ZhbHNlLCAodm9pZCopQ21kQmVnaW5SZW5kZXJQYXNzfX0sCisgICAgeyJ2a0NtZE5leHRTdWJwYXNzIiwge2ZhbHNlLCAodm9pZCopQ21kTmV4dFN1YnBhc3N9fSwKKyAgICB7InZrQ21kRW5kUmVuZGVyUGFzcyIsIHtmYWxzZSwgKHZvaWQqKUNtZEVuZFJlbmRlclBhc3N9fSwKKyAgICB7InZrQ21kRXhlY3V0ZUNvbW1hbmRzIiwge2ZhbHNlLCAodm9pZCopQ21kRXhlY3V0ZUNvbW1hbmRzfX0sCisgICAgeyJ2a0JpbmRCdWZmZXJNZW1vcnkyIiwge2ZhbHNlLCAodm9pZCopQmluZEJ1ZmZlck1lbW9yeTJ9fSwKKyAgICB7InZrQmluZEltYWdlTWVtb3J5MiIsIHtmYWxzZSwgKHZvaWQqKUJpbmRJbWFnZU1lbW9yeTJ9fSwKKyAgICB7InZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMiLCB7ZmFsc2UsICh2b2lkKilHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc319LAorICAgIHsidmtDbWRTZXREZXZpY2VNYXNrIiwge2ZhbHNlLCAodm9pZCopQ21kU2V0RGV2aWNlTWFza319LAorICAgIHsidmtDbWREaXNwYXRjaEJhc2UiLCB7ZmFsc2UsICh2b2lkKilDbWREaXNwYXRjaEJhc2V9fSwKKyAgICB7InZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMiLCB7dHJ1ZSwgKHZvaWQqKUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzfX0sCisgICAgeyJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiIsIHtmYWxzZSwgKHZvaWQqKUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMn19LAorICAgIHsidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIiwge2ZhbHNlLCAodm9pZCopR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMn19LAorICAgIHsidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiLCB7ZmFsc2UsICh2b2lkKilHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyfX0sCisgICAgeyJ2a1RyaW1Db21tYW5kUG9vbCIsIHtmYWxzZSwgKHZvaWQqKVRyaW1Db21tYW5kUG9vbH19LAorICAgIHsidmtHZXREZXZpY2VRdWV1ZTIiLCB7ZmFsc2UsICh2b2lkKilHZXREZXZpY2VRdWV1ZTJ9fSwKKyAgICB7InZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb259fSwKKyAgICB7InZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbn19LAorICAgIHsidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGV9fSwKKyAgICB7InZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGV9fSwKKyAgICB7InZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSIsIHtmYWxzZSwgKHZvaWQqKVVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGV9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXN9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzfX0sCisgICAgeyJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Iiwge2ZhbHNlLCAodm9pZCopR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnR9fSwKKyAgICB7InZrRGVzdHJveVN1cmZhY2VLSFIiLCB7dHJ1ZSwgKHZvaWQqKURlc3Ryb3lTdXJmYWNlS0hSfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUn19LAorICAgIHsidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVTd2FwY2hhaW5LSFJ9fSwKKyAgICB7InZrRGVzdHJveVN3YXBjaGFpbktIUiIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lTd2FwY2hhaW5LSFJ9fSwKKyAgICB7InZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0U3dhcGNoYWluSW1hZ2VzS0hSfX0sCisgICAgeyJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiLCB7ZmFsc2UsICh2b2lkKilBY3F1aXJlTmV4dEltYWdlS0hSfX0sCisgICAgeyJ2a1F1ZXVlUHJlc2VudEtIUiIsIHtmYWxzZSwgKHZvaWQqKVF1ZXVlUHJlc2VudEtIUn19LAorICAgIHsidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiLCB7ZmFsc2UsICh2b2lkKilHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFJ9fSwKKyAgICB7InZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFJ9fSwKKyAgICB7InZrQWNxdWlyZU5leHRJbWFnZTJLSFIiLCB7ZmFsc2UsICh2b2lkKilBY3F1aXJlTmV4dEltYWdlMktIUn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSfX0sCisgICAgeyJ2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIiwge3RydWUsICh2b2lkKilHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUn19LAorICAgIHsidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUn19LAorICAgIHsidmtDcmVhdGVEaXNwbGF5TW9kZUtIUiIsIHt0cnVlLCAodm9pZCopQ3JlYXRlRGlzcGxheU1vZGVLSFJ9fSwKKyAgICB7InZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIiwge3RydWUsICh2b2lkKilHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFJ9fSwKKyAgICB7InZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIsIHt0cnVlLCAodm9pZCopQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUn19LAorICAgIHsidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwge2ZhbHNlLCAodm9pZCopQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUn19LAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIHsidmtDcmVhdGVYbGliU3VyZmFjZUtIUiIsIHt0cnVlLCAodm9pZCopQ3JlYXRlWGxpYlN1cmZhY2VLSFJ9fSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSfX0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIHsidmtDcmVhdGVYY2JTdXJmYWNlS0hSIiwge3RydWUsICh2b2lkKilDcmVhdGVYY2JTdXJmYWNlS0hSfX0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUn19LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgeyJ2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIiwge3RydWUsICh2b2lkKilDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUn19LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFJ9fSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHsidmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiIsIHt0cnVlLCAodm9pZCopQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFJ9fSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwge3RydWUsICh2b2lkKilDcmVhdGVXaW4zMlN1cmZhY2VLSFJ9fSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSfX0sCisjZW5kaWYKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSfX0sCisgICAgeyJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFJ9fSwKKyAgICB7InZrQ21kU2V0RGV2aWNlTWFza0tIUiIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldERldmljZU1hc2tLSFJ9fSwKKyAgICB7InZrQ21kRGlzcGF0Y2hCYXNlS0hSIiwge2ZhbHNlLCAodm9pZCopQ21kRGlzcGF0Y2hCYXNlS0hSfX0sCisgICAgeyJ2a1RyaW1Db21tYW5kUG9vbEtIUiIsIHtmYWxzZSwgKHZvaWQqKVRyaW1Db21tYW5kUG9vbEtIUn19LAorICAgIHsidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUiIsIHt0cnVlLCAodm9pZCopRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSfX0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHsidmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiIsIHtmYWxzZSwgKHZvaWQqKUdldE1lbW9yeVdpbjMySGFuZGxlS0hSfX0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiIsIHtmYWxzZSwgKHZvaWQqKUdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUn19LAorI2VuZGlmCisgICAgeyJ2a0dldE1lbW9yeUZkS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0TWVtb3J5RmRLSFJ9fSwKKyAgICB7InZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUn19LAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiLCB7ZmFsc2UsICh2b2lkKilJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUn19LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHsidmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIsIHtmYWxzZSwgKHZvaWQqKUdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSfX0sCisjZW5kaWYKKyAgICB7InZrSW1wb3J0U2VtYXBob3JlRmRLSFIiLCB7ZmFsc2UsICh2b2lkKilJbXBvcnRTZW1hcGhvcmVGZEtIUn19LAorICAgIHsidmtHZXRTZW1hcGhvcmVGZEtIUiIsIHtmYWxzZSwgKHZvaWQqKUdldFNlbWFwaG9yZUZkS0hSfX0sCisgICAgeyJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIiwge2ZhbHNlLCAodm9pZCopQ21kUHVzaERlc2NyaXB0b3JTZXRLSFJ9fSwKKyAgICB7InZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCB7ZmFsc2UsICh2b2lkKilDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUn19LAorICAgIHsidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFJ9fSwKKyAgICB7InZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFJ9fSwKKyAgICB7InZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIsIHtmYWxzZSwgKHZvaWQqKVVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFJ9fSwKKyAgICB7InZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVSZW5kZXJQYXNzMktIUn19LAorICAgIHsidmtDbWRCZWdpblJlbmRlclBhc3MyS0hSIiwge2ZhbHNlLCAodm9pZCopQ21kQmVnaW5SZW5kZXJQYXNzMktIUn19LAorICAgIHsidmtDbWROZXh0U3VicGFzczJLSFIiLCB7ZmFsc2UsICh2b2lkKilDbWROZXh0U3VicGFzczJLSFJ9fSwKKyAgICB7InZrQ21kRW5kUmVuZGVyUGFzczJLSFIiLCB7ZmFsc2UsICh2b2lkKilDbWRFbmRSZW5kZXJQYXNzMktIUn19LAorICAgIHsidmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIiLCB7ZmFsc2UsICh2b2lkKilHZXRTd2FwY2hhaW5TdGF0dXNLSFJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUn19LAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiIsIHtmYWxzZSwgKHZvaWQqKUltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFJ9fSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIsIHtmYWxzZSwgKHZvaWQqKUdldEZlbmNlV2luMzJIYW5kbGVLSFJ9fSwKKyNlbmRpZgorICAgIHsidmtJbXBvcnRGZW5jZUZkS0hSIiwge2ZhbHNlLCAodm9pZCopSW1wb3J0RmVuY2VGZEtIUn19LAorICAgIHsidmtHZXRGZW5jZUZkS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0RmVuY2VGZEtIUn19LAorICAgIHsidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSIiwge3RydWUsICh2b2lkKilFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUn19LAorICAgIHsidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIsIHtmYWxzZSwgKHZvaWQqKUFjcXVpcmVQcm9maWxpbmdMb2NrS0hSfX0sCisgICAgeyJ2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIiwge2ZhbHNlLCAodm9pZCopUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUn19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFJ9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiLCB7dHJ1ZSwgKHZvaWQqKUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFJ9fSwKKyAgICB7InZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiIsIHt0cnVlLCAodm9pZCopR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUn19LAorICAgIHsidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIiwge3RydWUsICh2b2lkKilHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSfX0sCisgICAgeyJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIsIHtmYWxzZSwgKHZvaWQqKUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUn19LAorICAgIHsidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUn19LAorICAgIHsidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiLCB7ZmFsc2UsICh2b2lkKilHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFJ9fSwKKyAgICB7InZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFJ9fSwKKyAgICB7InZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUn19LAorICAgIHsidmtCaW5kQnVmZmVyTWVtb3J5MktIUiIsIHtmYWxzZSwgKHZvaWQqKUJpbmRCdWZmZXJNZW1vcnkyS0hSfX0sCisgICAgeyJ2a0JpbmRJbWFnZU1lbW9yeTJLSFIiLCB7ZmFsc2UsICh2b2lkKilCaW5kSW1hZ2VNZW1vcnkyS0hSfX0sCisgICAgeyJ2a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIiwge2ZhbHNlLCAodm9pZCopR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFJ9fSwKKyAgICB7InZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIiLCB7ZmFsc2UsICh2b2lkKilDbWREcmF3SW5kaXJlY3RDb3VudEtIUn19LAorICAgIHsidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiLCB7ZmFsc2UsICh2b2lkKilDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFJ9fSwKKyAgICB7InZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSfX0sCisgICAgeyJ2a1dhaXRTZW1hcGhvcmVzS0hSIiwge2ZhbHNlLCAodm9pZCopV2FpdFNlbWFwaG9yZXNLSFJ9fSwKKyAgICB7InZrU2lnbmFsU2VtYXBob3JlS0hSIiwge2ZhbHNlLCAodm9pZCopU2lnbmFsU2VtYXBob3JlS0hSfX0sCisgICAgeyJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIiLCB7ZmFsc2UsICh2b2lkKilHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSfX0sCisgICAgeyJ2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFJ9fSwKKyAgICB7InZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiLCB7ZmFsc2UsICh2b2lkKilHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUn19LAorICAgIHsidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUn19LAorICAgIHsidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIiwge2ZhbHNlLCAodm9pZCopR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUn19LAorICAgIHsidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIsIHtmYWxzZSwgKHZvaWQqKUdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSfX0sCisgICAgeyJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCB7dHJ1ZSwgKHZvaWQqKUNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFR9fSwKKyAgICB7InZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCB7dHJ1ZSwgKHZvaWQqKURlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUfX0sCisgICAgeyJ2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCIsIHt0cnVlLCAodm9pZCopRGVidWdSZXBvcnRNZXNzYWdlRVhUfX0sCisgICAgeyJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUIiwge2ZhbHNlLCAodm9pZCopRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFR9fSwKKyAgICB7InZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIiwge2ZhbHNlLCAodm9pZCopRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUfX0sCisgICAgeyJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiLCB7ZmFsc2UsICh2b2lkKilDbWREZWJ1Z01hcmtlckJlZ2luRVhUfX0sCisgICAgeyJ2a0NtZERlYnVnTWFya2VyRW5kRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kRGVidWdNYXJrZXJFbmRFWFR9fSwKKyAgICB7InZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiLCB7ZmFsc2UsICh2b2lkKilDbWREZWJ1Z01hcmtlckluc2VydEVYVH19LAorICAgIHsidmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVH19LAorICAgIHsidmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVH19LAorICAgIHsidmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCIsIHtmYWxzZSwgKHZvaWQqKUNtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUfX0sCisgICAgeyJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFR9fSwKKyAgICB7InZrQ21kRW5kUXVlcnlJbmRleGVkRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kRW5kUXVlcnlJbmRleGVkRVhUfX0sCisgICAgeyJ2a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCIsIHtmYWxzZSwgKHZvaWQqKUNtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVH19LAorICAgIHsidmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgiLCB7ZmFsc2UsICh2b2lkKilHZXRJbWFnZVZpZXdIYW5kbGVOVlh9fSwKKyAgICB7InZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQiLCB7ZmFsc2UsICh2b2lkKilDbWREcmF3SW5kaXJlY3RDb3VudEFNRH19LAorICAgIHsidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiLCB7ZmFsc2UsICh2b2lkKilDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUR9fSwKKyAgICB7InZrR2V0U2hhZGVySW5mb0FNRCIsIHtmYWxzZSwgKHZvaWQqKUdldFNoYWRlckluZm9BTUR9fSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgeyJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiwge3RydWUsICh2b2lkKilDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUH19LAorI2VuZGlmCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WfX0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHsidmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WIiwge2ZhbHNlLCAodm9pZCopR2V0TWVtb3J5V2luMzJIYW5kbGVOVn19LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisgICAgeyJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwge3RydWUsICh2b2lkKilDcmVhdGVWaVN1cmZhY2VOTn19LAorI2VuZGlmCisgICAgeyJ2a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiLCB7ZmFsc2UsICh2b2lkKilDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUfX0sCisgICAgeyJ2a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFR9fSwKKyAgICB7InZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIiwge2ZhbHNlLCAodm9pZCopQ21kUHJvY2Vzc0NvbW1hbmRzTlZYfX0sCisgICAgeyJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIiwge2ZhbHNlLCAodm9pZCopQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlh9fSwKKyAgICB7InZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlh9fSwKKyAgICB7InZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWH19LAorICAgIHsidmtDcmVhdGVPYmplY3RUYWJsZU5WWCIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZU9iamVjdFRhYmxlTlZYfX0sCisgICAgeyJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCIsIHtmYWxzZSwgKHZvaWQqKURlc3Ryb3lPYmplY3RUYWJsZU5WWH19LAorICAgIHsidmtSZWdpc3Rlck9iamVjdHNOVlgiLCB7ZmFsc2UsICh2b2lkKilSZWdpc3Rlck9iamVjdHNOVlh9fSwKKyAgICB7InZrVW5yZWdpc3Rlck9iamVjdHNOVlgiLCB7ZmFsc2UsICh2b2lkKilVbnJlZ2lzdGVyT2JqZWN0c05WWH19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlh9fSwKKyAgICB7InZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WIiwge2ZhbHNlLCAodm9pZCopQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WfX0sCisgICAgeyJ2a1JlbGVhc2VEaXNwbGF5RVhUIiwge3RydWUsICh2b2lkKilSZWxlYXNlRGlzcGxheUVYVH19LAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICB7InZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIiwge3RydWUsICh2b2lkKilBY3F1aXJlWGxpYkRpc3BsYXlFWFR9fSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICB7InZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUIiwge3RydWUsICh2b2lkKilHZXRSYW5kUk91dHB1dERpc3BsYXlFWFR9fSwKKyNlbmRpZgorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUfX0sCisgICAgeyJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiLCB7ZmFsc2UsICh2b2lkKilEaXNwbGF5UG93ZXJDb250cm9sRVhUfX0sCisgICAgeyJ2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQiLCB7ZmFsc2UsICh2b2lkKilSZWdpc3RlckRldmljZUV2ZW50RVhUfX0sCisgICAgeyJ2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIiwge2ZhbHNlLCAodm9pZCopUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFR9fSwKKyAgICB7InZrR2V0U3dhcGNoYWluQ291bnRlckVYVCIsIHtmYWxzZSwgKHZvaWQqKUdldFN3YXBjaGFpbkNvdW50ZXJFWFR9fSwKKyAgICB7InZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUiLCB7ZmFsc2UsICh2b2lkKilHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRX19LAorICAgIHsidmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFIiwge2ZhbHNlLCAodm9pZCopR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRX19LAorICAgIHsidmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVH19LAorICAgIHsidmtTZXRIZHJNZXRhZGF0YUVYVCIsIHtmYWxzZSwgKHZvaWQqKVNldEhkck1ldGFkYXRhRVhUfX0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyAgICB7InZrQ3JlYXRlSU9TU3VyZmFjZU1WSyIsIHt0cnVlLCAodm9pZCopQ3JlYXRlSU9TU3VyZmFjZU1WS319LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIHsidmtDcmVhdGVNYWNPU1N1cmZhY2VNVksiLCB7dHJ1ZSwgKHZvaWQqKUNyZWF0ZU1hY09TU3VyZmFjZU1WS319LAorI2VuZGlmCisgICAgeyJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIiwge2ZhbHNlLCAodm9pZCopU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFR9fSwKKyAgICB7InZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCIsIHtmYWxzZSwgKHZvaWQqKVNldERlYnVnVXRpbHNPYmplY3RUYWdFWFR9fSwKKyAgICB7InZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIsIHtmYWxzZSwgKHZvaWQqKVF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFR9fSwKKyAgICB7InZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiLCB7ZmFsc2UsICh2b2lkKilRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVH19LAorICAgIHsidmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIsIHtmYWxzZSwgKHZvaWQqKVF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUfX0sCisgICAgeyJ2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFR9fSwKKyAgICB7InZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUfX0sCisgICAgeyJ2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIsIHtmYWxzZSwgKHZvaWQqKUNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVH19LAorICAgIHsidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwge3RydWUsICh2b2lkKilDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUfX0sCisgICAgeyJ2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwge3RydWUsICh2b2lkKilEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVH19LAorICAgIHsidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIsIHt0cnVlLCAodm9pZCopU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFR9fSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICB7InZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiLCB7ZmFsc2UsICh2b2lkKilHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRH19LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgeyJ2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQiLCB7ZmFsc2UsICh2b2lkKilHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEfX0sCisjZW5kaWYKKyAgICB7InZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUIiwge2ZhbHNlLCAodm9pZCopQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVH19LAorICAgIHsidmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCIsIHtmYWxzZSwgKHZvaWQqKUdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUfX0sCisgICAgeyJ2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCIsIHtmYWxzZSwgKHZvaWQqKUNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVH19LAorICAgIHsidmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUIiwge2ZhbHNlLCAodm9pZCopRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVH19LAorICAgIHsidmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQiLCB7ZmFsc2UsICh2b2lkKilNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFR9fSwKKyAgICB7InZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCIsIHtmYWxzZSwgKHZvaWQqKUdldFZhbGlkYXRpb25DYWNoZURhdGFFWFR9fSwKKyAgICB7InZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViIsIHtmYWxzZSwgKHZvaWQqKUNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlZ9fSwKKyAgICB7InZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlZ9fSwKKyAgICB7InZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlZ9fSwKKyAgICB7InZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCB7ZmFsc2UsICh2b2lkKilDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVn19LAorICAgIHsidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCB7ZmFsc2UsICh2b2lkKilEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlZ9fSwKKyAgICB7InZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiLCB7ZmFsc2UsICh2b2lkKilHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVn19LAorICAgIHsidmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYiLCB7ZmFsc2UsICh2b2lkKilCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlZ9fSwKKyAgICB7InZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIHtmYWxzZSwgKHZvaWQqKUNtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZ9fSwKKyAgICB7InZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwge2ZhbHNlLCAodm9pZCopQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WfX0sCisgICAgeyJ2a0NtZFRyYWNlUmF5c05WIiwge2ZhbHNlLCAodm9pZCopQ21kVHJhY2VSYXlzTlZ9fSwKKyAgICB7InZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIiwge2ZhbHNlLCAodm9pZCopQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WfX0sCisgICAgeyJ2a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViIsIHtmYWxzZSwgKHZvaWQqKUdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVn19LAorICAgIHsidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIsIHtmYWxzZSwgKHZvaWQqKUdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WfX0sCisgICAgeyJ2a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViIsIHtmYWxzZSwgKHZvaWQqKUNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVn19LAorICAgIHsidmtDb21waWxlRGVmZXJyZWROViIsIHtmYWxzZSwgKHZvaWQqKUNvbXBpbGVEZWZlcnJlZE5WfX0sCisgICAgeyJ2a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCIsIHtmYWxzZSwgKHZvaWQqKUdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVH19LAorICAgIHsidmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCIsIHtmYWxzZSwgKHZvaWQqKUNtZFdyaXRlQnVmZmVyTWFya2VyQU1EfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVH19LAorICAgIHsidmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCIsIHtmYWxzZSwgKHZvaWQqKUdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUfX0sCisgICAgeyJ2a0NtZERyYXdNZXNoVGFza3NOViIsIHtmYWxzZSwgKHZvaWQqKUNtZERyYXdNZXNoVGFza3NOVn19LAorICAgIHsidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViIsIHtmYWxzZSwgKHZvaWQqKUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WfX0sCisgICAgeyJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYiLCB7ZmFsc2UsICh2b2lkKilDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WfX0sCisgICAgeyJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVn19LAorICAgIHsidmtDbWRTZXRDaGVja3BvaW50TlYiLCB7ZmFsc2UsICh2b2lkKilDbWRTZXRDaGVja3BvaW50TlZ9fSwKKyAgICB7InZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WIiwge2ZhbHNlLCAodm9pZCopR2V0UXVldWVDaGVja3BvaW50RGF0YU5WfX0sCisgICAgeyJ2a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIiwge2ZhbHNlLCAodm9pZCopSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUx9fSwKKyAgICB7InZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIsIHtmYWxzZSwgKHZvaWQqKVVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUx9fSwKKyAgICB7InZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUx9fSwKKyAgICB7InZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUx9fSwKKyAgICB7InZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMIiwge2ZhbHNlLCAodm9pZCopQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMfX0sCisgICAgeyJ2a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsIHtmYWxzZSwgKHZvaWQqKUFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTH19LAorICAgIHsidmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiLCB7ZmFsc2UsICh2b2lkKilSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUx9fSwKKyAgICB7InZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsIHtmYWxzZSwgKHZvaWQqKVF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUx9fSwKKyAgICB7InZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIsIHtmYWxzZSwgKHZvaWQqKUdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUx9fSwKKyAgICB7InZrU2V0TG9jYWxEaW1taW5nQU1EIiwge2ZhbHNlLCAodm9pZCopU2V0TG9jYWxEaW1taW5nQU1EfX0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICB7InZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEiLCB7dHJ1ZSwgKHZvaWQqKUNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBfX0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgeyJ2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCIsIHt0cnVlLCAodm9pZCopQ3JlYXRlTWV0YWxTdXJmYWNlRVhUfX0sCisjZW5kaWYKKyAgICB7InZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIsIHtmYWxzZSwgKHZvaWQqKUdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFR9fSwKKyAgICB7InZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVH19LAorICAgIHsidmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WfX0sCisgICAgeyJ2a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViIsIHt0cnVlLCAodm9pZCopR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WfX0sCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHsidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIiwge3RydWUsICh2b2lkKilHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUfX0sCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgeyJ2a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIsIHtmYWxzZSwgKHZvaWQqKUFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVH19LAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHsidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCB7ZmFsc2UsICh2b2lkKilSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFR9fSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB7InZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIsIHtmYWxzZSwgKHZvaWQqKUdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFR9fSwKKyNlbmRpZgorICAgIHsidmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQiLCB7dHJ1ZSwgKHZvaWQqKUNyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVH19LAorICAgIHsidmtDbWRTZXRMaW5lU3RpcHBsZUVYVCIsIHtmYWxzZSwgKHZvaWQqKUNtZFNldExpbmVTdGlwcGxlRVhUfX0sCisgICAgeyJ2a1Jlc2V0UXVlcnlQb29sRVhUIiwge2ZhbHNlLCAodm9pZCopUmVzZXRRdWVyeVBvb2xFWFR9fSwKK307CisKKworfSAvLyBuYW1lc3BhY2UgdnVsa2FuX2xheWVyX2NoYXNzaXMKKworLy8gbG9hZGVyLWxheWVyIGludGVyZmFjZSB2MCwganVzdCB3cmFwcGVycyBzaW5jZSB0aGVyZSBpcyBvbmx5IGEgbGF5ZXIKKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgcmV0dXJuIHZ1bGthbl9sYXllcl9jaGFzc2lzOjpFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMocExheWVyTmFtZSwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiB2dWxrYW5fbGF5ZXJfY2hhc3Npczo6RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMocENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgLy8gdGhlIGxheWVyIGNvbW1hbmQgaGFuZGxlcyBWS19OVUxMX0hBTkRMRSBqdXN0IGZpbmUgaW50ZXJuYWxseQorICAgIGFzc2VydChwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSk7CisgICAgcmV0dXJuIHZ1bGthbl9sYXllcl9jaGFzc2lzOjpFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVktfTlVMTF9IQU5ETEUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICAvLyB0aGUgbGF5ZXIgY29tbWFuZCBoYW5kbGVzIFZLX05VTExfSEFORExFIGp1c3QgZmluZSBpbnRlcm5hbGx5CisgICAgYXNzZXJ0KHBoeXNpY2FsRGV2aWNlID09IFZLX05VTExfSEFORExFKTsKKyAgICByZXR1cm4gdnVsa2FuX2xheWVyX2NoYXNzaXM6OkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoVktfTlVMTF9IQU5ETEUsIHBMYXllck5hbWUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldERldmljZVByb2NBZGRyKFZrRGV2aWNlIGRldiwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gdnVsa2FuX2xheWVyX2NoYXNzaXM6OkdldERldmljZVByb2NBZGRyKGRldiwgZnVuY05hbWUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gdnVsa2FuX2xheWVyX2NoYXNzaXM6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbihWa05lZ290aWF0ZUxheWVySW50ZXJmYWNlICpwVmVyc2lvblN0cnVjdCkgeworICAgIGFzc2VydChwVmVyc2lvblN0cnVjdCAhPSBOVUxMKTsKKyAgICBhc3NlcnQocFZlcnNpb25TdHJ1Y3QtPnNUeXBlID09IExBWUVSX05FR09USUFURV9JTlRFUkZBQ0VfU1RSVUNUKTsKKworICAgIC8vIEZpbGwgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGlmIG91ciB2ZXJzaW9uIGlzIGF0IGxlYXN0IGNhcGFibGUgb2YgaGF2aW5nIHRoZSBzdHJ1Y3R1cmUgY29udGFpbiB0aGVtLgorICAgIGlmIChwVmVyc2lvblN0cnVjdC0+bG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uID49IDIpIHsKKyAgICAgICAgcFZlcnNpb25TdHJ1Y3QtPnBmbkdldEluc3RhbmNlUHJvY0FkZHIgPSB2a0dldEluc3RhbmNlUHJvY0FkZHI7CisgICAgICAgIHBWZXJzaW9uU3RydWN0LT5wZm5HZXREZXZpY2VQcm9jQWRkciA9IHZrR2V0RGV2aWNlUHJvY0FkZHI7CisgICAgICAgIHBWZXJzaW9uU3RydWN0LT5wZm5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvY2hhc3Npcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9jaGFzc2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2NGVjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvY2hhc3Npcy5oCkBAIC0wLDAgKzEsMzg1MSBAQAorCisvLyBUaGlzIGZpbGUgaXMgKioqR0VORVJBVEVEKioqLiAgRG8gTm90IEVkaXQuCisvLyBTZWUgbGF5ZXJfY2hhc3Npc19nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMuCisKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKi8KKyNwcmFnbWEgb25jZQorCisKKyNkZWZpbmUgTk9NSU5NQVgKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2dWxrYW4vdnVsa2FuLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfY29uZmlnLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfZGF0YS5oIgorI2luY2x1ZGUgInZrX2xheWVyX2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ2a19vYmplY3RfdHlwZXMuaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19lbnVtX3N0cmluZ19oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9leHRlbnNpb25fdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl91dGlscy5oIgorI2luY2x1ZGUgInZ1bGthbi92a19sYXllci5oIgorI2luY2x1ZGUgInZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oIgorI2luY2x1ZGUgInZrX2V4dGVuc2lvbl9oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19zYWZlX3N0cnVjdC5oIgorI2luY2x1ZGUgInZrX3R5cGVtYXBfaGVscGVyLmgiCisKKworZXh0ZXJuIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBnbG9iYWxfdW5pcXVlX2lkOworCisvLyBUbyBhdm9pZCByZS1oYXNoaW5nIHVuaXF1ZSBpZHMgb24gZWFjaCB1c2UsIHdlIHByZWNvbXB1dGUgdGhlIGhhc2ggYW5kIHN0b3JlIHRoZQorLy8gaGFzaCdzIExTQnMgaW4gdGhlIGhpZ2ggMjQgYml0cy4KK3N0cnVjdCBIYXNoZWRVaW50NjQgeworICAgIHN0YXRpYyBjb25zdCBpbnQgSEFTSEVEX1VJTlQ2NF9TSElGVCA9IDQwOworICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHVpbnQ2NF90ICZ0KSBjb25zdCB7IHJldHVybiB0ID4+IEhBU0hFRF9VSU5UNjRfU0hJRlQ7IH0KKworICAgIHN0YXRpYyB1aW50NjRfdCBoYXNoKHVpbnQ2NF90IGlkKSB7CisgICAgICAgIHVpbnQ2NF90IGggPSAodWludDY0X3Qpc3RkOjpoYXNoPHVpbnQ2NF90PigpKGlkKTsKKyAgICAgICAgaWQgfD0gaCA8PCBIQVNIRURfVUlOVDY0X1NISUZUOworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorfTsKKworZXh0ZXJuIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdWludDY0X3QsIDQsIEhhc2hlZFVpbnQ2ND4gdW5pcXVlX2lkX21hcHBpbmc7CisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbnN0YW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95SW5zdGFuY2UoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqICAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworCitWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIEdldERldmljZVByb2NBZGRyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGV2aWNlKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyTmFtZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyTmFtZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtMYXllclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERldmljZVF1ZXVlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXgsCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVTdWJtaXQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdENvdW50LAorICAgIGNvbnN0IFZrU3VibWl0SW5mbyogICAgICAgICAgICAgICAgICAgICAgICAgcFN1Ym1pdHMsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBRdWV1ZVdhaXRJZGxlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRGV2aWNlV2FpdElkbGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBGcmVlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBNYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIFZrTWVtb3J5TWFwRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdm9pZCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcERhdGEpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBVbm1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQnVmZmVyTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRJbWFnZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBRdWV1ZUJpbmRTcGFyc2UoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyogICAgICAgICAgICAgICAgICAgICBwQmluZEluZm8sCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldEZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEZlbmNlU3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgV2FpdEZvckZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzLAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEFsbCwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2VtYXBob3JlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEV2ZW50U3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZXNldEV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUXVlcnlQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXJ5UG9vbCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVCdWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVyKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlQnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlclZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXJWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UqICAgICAgICAgICAgICAgICAgIHBTdWJyZXNvdXJjZSwKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2VWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95SW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTaGFkZXJNb2R1bGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGVyTW9kdWxlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUNhY2hlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBNZXJnZVBpcGVsaW5lQ2FjaGVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVBpcGVsaW5lKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lTGF5b3V0KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgIHBTZXRMYXlvdXQpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JQb29sKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlc2V0RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFsbG9jYXRlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVXBkYXRlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yQ29waWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRnJhbWVidWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtSZW5kZXJQYXNzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVuZGVyUGFzcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUmVuZGVyUGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQ29tbWFuZFBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRQb29sKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlc2V0Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKiAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRnJlZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmVnaW5Db21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qICAgICAgICAgICAgIHBCZWdpbkluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW5kQ29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVzZXRDb21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZFBpcGVsaW5lKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRWaWV3cG9ydCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3cG9ydHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRTY2lzc29yKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2lzc29ycyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldExpbmVXaWR0aCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREZXB0aEJpYXMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDbGFtcCwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hc2spOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmREZXNjcmlwdG9yU2V0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY09mZnNldENvdW50LAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcER5bmFtaWNPZmZzZXRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0luZGV4VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VHlwZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmVydGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRleGVkKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQmxpdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLAorICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ29weUJ1ZmZlclRvSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDb3B5SW1hZ2VUb0J1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRmlsbEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENsZWFyQ29sb3JJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiAgICAgICAgICAgICAgICAgICAgcENvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRDbGVhckF0dGFjaG1lbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb3VudCwKKyAgICBjb25zdCBWa0NsZWFyQXR0YWNobWVudCogICAgICAgICAgICAgICAgICAgIHBBdHRhY2htZW50cywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RDb3VudCwKKyAgICBjb25zdCBWa0NsZWFyUmVjdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFJlc29sdmVJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFJlc2V0RXZlbnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRXYWl0RXZlbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQsCisgICAgY29uc3QgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRzLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RhZ2VNYXNrLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5RdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFdyaXRlVGltZXN0YW1wKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RhZ2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWROZXh0U3VicGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRXhlY3V0ZUNvbW1hbmRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycyk7CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmluZEltYWdlTWVtb3J5MigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiAgICAgICAgICAgICAgICBwQmluZEluZm9zKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERldmljZUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGV2aWNlSW5kZXgsCisgICAgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiAgICAgICAgICAgICAgICAgICBwUGVlck1lbW9yeUZlYXR1cmVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0RGV2aWNlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRGlzcGF0Y2hCYXNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWiwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50Wik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVHJpbUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERldmljZVF1ZXVlMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUluZm8sCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogICBwRXh0ZXJuYWxCdWZmZXJJbmZvLAorICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogICAgICAgICAgICAgIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqICAgICAgICAgICAgICAgcFN1cHBvcnQpOworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0Jvb2wzMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgVmtTdXJmYWNlRm9ybWF0S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlQ291bnQsCisgICAgVmtQcmVzZW50TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKTsKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFN3YXBjaGFpbkltYWdlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlTmV4dEltYWdlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVQcmVzZW50S0hSKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJlc2VudEluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiAgICAgICAgcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVOZXh0SW1hZ2UyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqICAgICAgICAgICAgcEFjcXVpcmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgpOworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5Q291bnQsCisgICAgVmtEaXNwbGF5S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheU1vZGVLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlWGxpYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmlzdWFsSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxJRCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCitWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHhjYl9jb25uZWN0aW9uX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICB4Y2JfdmlzdWFsaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbF9pZCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgc3RydWN0IHdsX2Rpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCitWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiAgICAgICAgICAgICAgICAgIHBGZWF0dXJlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldERldmljZU1hc2tLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzayk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERpc3BhdGNoQmFzZUtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopOworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVHJpbUNvbW1hbmRQb29sS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qICAgcEV4dGVybmFsQnVmZmVySW5mbywKKyAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpOworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCisgICAgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqICAgICAgICAgICBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsCisgICAgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICBwTWVtb3J5RmRQcm9wZXJ0aWVzKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyk7CisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiAgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTZW1hcGhvcmVGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworCisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUmVuZGVyUGFzczJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtSZW5kZXJQYXNzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVuZGVyUGFzcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kTmV4dFN1YnBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKTsKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0U3dhcGNoYWluU3RhdHVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKTsKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBJbXBvcnRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqICAgICAgICAgICAgICAgcEltcG9ydEZlbmNlRmRJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKTsKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQ291bnQsCisgICAgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqICAgICAgICAgICAgICAgICAgICBwQ291bnRlcnMsCisgICAgVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiogICAgICAgICBwQ291bnRlckRlc2NyaXB0aW9ucyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqICBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtUGFzc2VzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiAgICAgICAgcEluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgVmtTdXJmYWNlRm9ybWF0MktIUiogICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpOworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIqICAgICAgICAgICAgICAgcERpc3BsYXlQbGFuZUluZm8sCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKTsKKworCisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQmluZEJ1ZmZlck1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qICAgICAgICAgICAgICAgcEJpbmRJbmZvcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kSW1hZ2VNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCk7CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworCisKKworCisKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBXYWl0U2VtYXBob3Jlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiAgICAgICAgICAgICAgIHBXYWl0SW5mbywKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU2lnbmFsU2VtYXBob3JlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogICAgICAgICAgICAgcFNpZ25hbEluZm8pOworCisKKworCisKKworCitWS0FQSV9BVFRSIFZrRGV2aWNlQWRkcmVzcyBWS0FQSV9DQUxMIEdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbyk7CisKK1ZLQVBJX0FUVFIgdWludDY0X3QgVktBUElfQ0FMTCBHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKTsKKworVktBUElfQVRUUiB1aW50NjRfdCBWS0FQSV9DQUxMIEdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbyk7CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4ZWN1dGFibGVDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdGlzdGljQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqICAgICAgICAgICBwU3RhdGlzdGljcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMpOworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2spOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVidWdSZXBvcnRNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb2RlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2UpOworCisKKworCisKKworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogICAgICAgIHBUYWdJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqICAgICAgIHBOYW1lSW5mbyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERlYnVnTWFya2VyQmVnaW5FWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREZWJ1Z01hcmtlckVuZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREZWJ1Z01hcmtlckluc2VydEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqICAgICAgICAgICBwTWFya2VySW5mbyk7CisKKworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXplcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpOworCisKK1ZLQVBJX0FUVFIgdWludDMyX3QgVktBUElfQ0FMTCBHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbyk7CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKworCisKKworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTaGFkZXJJbmZvQU1EKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgVmtTaGFkZXJTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdGFnZSwKKyAgICBWa1NoYWRlckluZm9UeXBlQU1EICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm9TaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm8pOworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGV4dGVybmFsSGFuZGxlVHlwZSwKKyAgICBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqICAgICAgICAgIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldE1lbW9yeVdpbjMySGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCisKKworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogICBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqICAgICAgICAgIHBQcm9jZXNzQ29tbWFuZHNJbmZvKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiAgcFJlc2VydmVTcGFjZUluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKiAgICAgICAgICAgICAgICBwSW5kaXJlY3RDb21tYW5kc0xheW91dCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAgICAgICAgICAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95T2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVnaXN0ZXJPYmplY3RzTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RDb3VudCwKKyAgICBjb25zdCBWa09iamVjdFRhYmxlRW50cnlOVlgqIGNvbnN0KiAgICAgICAgIHBwT2JqZWN0VGFibGVFbnRyaWVzLAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdEluZGljZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKiAgICAgICBwRmVhdHVyZXMsCisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogICAgICAgICBwTGltaXRzKTsKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqICAgICAgICAgICAgICAgICBwVmlld3BvcnRXU2NhbGluZ3MpOworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWxlYXNlRGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBBY3F1aXJlWGxpYkRpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgUlJPdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByck91dHB1dCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIERpc3BsYXlQb3dlckNvbnRyb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlQb3dlckluZm8pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgIHBEZXZpY2VFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5RXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRTd2FwY2hhaW5Db3VudGVyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCAgICAgICAgICAgICAgICAgY291bnRlciwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyVmFsdWUpOworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiAgICAgICAgICAgICAgIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LAorICAgIFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSogICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ3MpOworCisKKworCisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNjYXJkUmVjdGFuZ2xlcyk7CisKKworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU2V0SGRyTWV0YWRhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zLAorICAgIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZU1hY09TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFNldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKiAgICAgICAgcE5hbWVJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogICAgICAgICBwVGFnSW5mbyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQqICAgICAgICAgICAgICAgICAgIHBNZXNzZW5nZXIpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgICAgICBtZXNzYWdlU2V2ZXJpdHksCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCAgICAgICAgICAgICBtZXNzYWdlVHlwZXMsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKiBwQ2FsbGJhY2tEYXRhKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogICBwUHJvcGVydGllcyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHBJbmZvLAorICAgIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKworCisKKworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNJbmZvKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqICAgICAgICAgICAgICAgICBwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzKTsKKworCisKKworCisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKTsKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgICAgICAgcFZhbGlkYXRpb25DYWNoZSk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIE1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIGRzdENhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQ2FjaGVDb3VudCwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgIHBTcmNDYWNoZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworCisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogICAgICAgICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgICAgICAgICAgICAgICAgICAgc2FtcGxlT3JkZXJUeXBlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwKKyAgICBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqICAgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnMpOworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiogICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiAgICAgICAgcEluZm8sCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZURhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZU9mZnNldCwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2gsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoT2Zmc2V0KTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgICAgICAgICAgIG1vZGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRUcmFjZVJheXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEdyb3VwLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsCisgICAgVmtRdWVyeVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5KTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENvbXBpbGVEZWZlcnJlZE5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXIpOworCisKKworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhvc3RQb2ludGVyLAorICAgIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiAgICAgICAgICAgcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcyk7CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcik7CisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWluQ291bnQsCisgICAgVmtUaW1lRG9tYWluRVhUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbnMpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbik7CisKKworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCisKKworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIENtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCisKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzKTsKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRDaGVja3BvaW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnRNYXJrZXIpOworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YUNvdW50LAorICAgIFZrQ2hlY2twb2ludERhdGFOViogICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhKTsKKworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogIHBJbml0aWFsaXplSW5mbyk7CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogICAgICAgICBwTWFya2VySW5mbyk7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiAgIHBNYXJrZXJJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiAgICAgICBwT3ZlcnJpZGVJbmZvKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHBBY3F1aXJlSW5mbywKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKiAgICAgICAgICAgIHBDb25maWd1cmF0aW9uKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgICAgICAgICAgICAgcGFyYW1ldGVyLAorICAgIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiAgICAgICAgICAgICAgICAgICAgcFZhbHVlKTsKKworCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCisKKworCisKKworCisKKworCisKKworVktBUElfQVRUUiBWa0RldmljZUFkZHJlc3MgVktBUElfQ0FMTCBHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pOworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9vbENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogICAgICAgICAgcFRvb2xQcm9wZXJ0aWVzKTsKKworCisKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqICAgICAgICAgICAgcFByb3BlcnRpZXMpOworCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21iaW5hdGlvbkNvdW50LAorICAgIFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKiAgICAgcENvbWJpbmF0aW9ucyk7CisKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlQ291bnQsCisgICAgVmtQcmVzZW50TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbik7CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pOworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2Rlcyk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBDbWRTZXRMaW5lU3RpcHBsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZUZhY3RvciwKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlUGF0dGVybik7CisKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgUmVzZXRRdWVyeVBvb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCk7CisKKworCisKKworCisKKworLy8gTGF5ZXIgb2JqZWN0IHR5cGUgaWRlbnRpZmllcnMKK2VudW0gTGF5ZXJPYmplY3RUeXBlSWQgeworICAgIExheWVyT2JqZWN0VHlwZUluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgLy8gQ29udGFpbmVyIGZvciBhbiBpbnN0YW5jZSBkaXNwYXRjaCBvYmplY3QKKyAgICBMYXllck9iamVjdFR5cGVEZXZpY2UsICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRhaW5lciBmb3IgYSBkZXZpY2UgZGlzcGF0Y2ggb2JqZWN0CisgICAgTGF5ZXJPYmplY3RUeXBlVGhyZWFkaW5nLCAgICAgICAgICAgICAgICAgICAvLyBJbnN0YW5jZSBvciBkZXZpY2UgdGhyZWFkaW5nIGxheWVyIG9iamVjdAorICAgIExheWVyT2JqZWN0VHlwZVBhcmFtZXRlclZhbGlkYXRpb24sICAgICAgICAgLy8gSW5zdGFuY2Ugb3IgZGV2aWNlIHBhcmFtZXRlciB2YWxpZGF0aW9uIGxheWVyIG9iamVjdAorICAgIExheWVyT2JqZWN0VHlwZU9iamVjdFRyYWNrZXIsICAgICAgICAgICAgICAgLy8gSW5zdGFuY2Ugb3IgZGV2aWNlIG9iamVjdCB0cmFja2VyIGxheWVyIG9iamVjdAorICAgIExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uLCAgICAgICAgICAgICAgLy8gSW5zdGFuY2Ugb3IgZGV2aWNlIGNvcmUgdmFsaWRhdGlvbiBsYXllciBvYmplY3QKKyAgICBMYXllck9iamVjdFR5cGVCZXN0UHJhY3RpY2VzLCAgICAgICAgICAgICAgIC8vIEluc3RhbmNlIG9yIGRldmljZSBiZXN0IHByYWN0aWNlcyBsYXllciBvYmplY3QKKyAgICBMYXllck9iamVjdFR5cGVHcHVBc3Npc3RlZCwgICAgICAgICAgICAgICAgIC8vIEluc3RhbmNlIG9yIGRldmljZSBncHUgYXNzaXN0ZWQgdmFsaWRhdGlvbiBsYXllciBvYmplY3QKKyAgICBMYXllck9iamVjdFR5cGVNYXhFbnVtLCAgICAgICAgICAgICAgICAgICAgIC8vIE1heCBlbnVtIGNvdW50Cit9OworCitzdHJ1Y3QgVEVNUExBVEVfU1RBVEUgeworICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NfdXBkYXRlX3RlbXBsYXRlOworICAgIHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvOworICAgIGJvb2wgZGVzdHJveWVkOworCisgICAgVEVNUExBVEVfU1RBVEUoVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgdXBkYXRlX3RlbXBsYXRlLCBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pCisgICAgICAgIDogZGVzY191cGRhdGVfdGVtcGxhdGUodXBkYXRlX3RlbXBsYXRlKSwgY3JlYXRlX2luZm8oKnBDcmVhdGVJbmZvKSwgZGVzdHJveWVkKGZhbHNlKSB7fQorfTsKKworY2xhc3MgTEFZRVJfUEhZU19ERVZfUFJPUEVSVElFUyB7CitwdWJsaWM6CisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgcHJvcGVydGllczsKKyAgICBzdGQ6OnZlY3RvcjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllcz4gcXVldWVfZmFtaWx5X3Byb3BlcnRpZXM7Cit9OworCit0eXBlZGVmIGVudW0gVmFsaWRhdGlvbkNoZWNrRGlzYWJsZXMgeworICAgIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9DT01NQU5EX0JVRkZFUl9TVEFURSwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfT0JKRUNUX0lOX1VTRSwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfSURMRV9ERVNDUklQVE9SX1NFVCwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfUFVTSF9DT05TVEFOVF9SQU5HRSwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfUVVFUllfVkFMSURBVElPTiwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfSU1BR0VfTEFZT1VUX1ZBTElEQVRJT04sCit9IFZhbGlkYXRpb25DaGVja0Rpc2FibGVzOworCisvLyBDSEVDS19ESVNBQkxFRCBzdHJ1Y3QgaXMgYSBjb250YWluZXIgZm9yIGJvb2xzIHRoYXQgY2FuIGJsb2NrIHZhbGlkYXRpb24gY2hlY2tzIGZyb20gYmVpbmcgcGVyZm9ybWVkLgorLy8gVGhlc2UgYm9vbHMgYXJlIGFsbCAiZmFsc2UiIGJ5IGRlZmF1bHQgbWVhbmluZyB0aGF0IGFsbCBjaGVja3MgYXJlIGVuYWJsZWQuIEVudW0gdmFsdWVzIGNhbiBiZSBzcGVjaWZpZWQKKy8vIHZpYSB0aGUgdmtfbGF5ZXJfc2V0dGluZy50eHQgY29uZmlnIGZpbGUgb3IgYXQgQ3JlYXRlSW5zdGFuY2UgdGltZSB2aWEgdGhlIFZLX0VYVF92YWxpZGF0aW9uX2ZlYXR1cmVzIGV4dGVuc2lvbgorLy8gdGhhdCBjYW4gc2VsZWN0aXZlbHkgZGlzYWJsZSBjaGVja3MuCitzdHJ1Y3QgQ0hFQ0tfRElTQUJMRUQgeworICAgIGJvb2wgY29tbWFuZF9idWZmZXJfc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgY29tbWFuZCBidWZmZXIgc3RhdGUgdmFsaWRhdGlvbgorICAgIGJvb2wgb2JqZWN0X2luX3VzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIG9iamVjdCBpbl91c2UgY2hlY2tpbmcKKyAgICBib29sIGlkbGVfZGVzY3JpcHRvcl9zZXQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGNoZWNrIHRvIHZlcmlmeSB0aGF0IGRlc2NyaXB0b3Igc2V0IGlzIG5vdCBpbi11c2UKKyAgICBib29sIHB1c2hfY29uc3RhbnRfcmFuZ2U7ICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHB1c2ggY29uc3RhbnQgcmFuZ2UgY2hlY2tzCisgICAgYm9vbCBxdWVyeV92YWxpZGF0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBhbGwgY29yZSB2YWxpZGF0aW9uIHF1ZXJ5LXJlbGF0ZWQgY2hlY2tzCisgICAgYm9vbCBpbWFnZV9sYXlvdXRfdmFsaWRhdGlvbjsgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBpbWFnZSBsYXlvdXQgdmFsaWRhdGlvbgorICAgIGJvb2wgb2JqZWN0X3RyYWNraW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgb2JqZWN0IGxpZmV0aW1lIHZhbGlkYXRpb24KKyAgICBib29sIGNvcmVfY2hlY2tzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGNvcmUgdmFsaWRhdGlvbiBjaGVja3MKKyAgICBib29sIHRocmVhZF9zYWZldHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRocmVhZCBzYWZldHkgdmFsaWRhdGlvbgorICAgIGJvb2wgc3RhdGVsZXNzX2NoZWNrczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgc3RhdGVsZXNzIHZhbGlkYXRpb24gY2hlY2tzCisgICAgYm9vbCBoYW5kbGVfd3JhcHBpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB1bmlxdWUgaGFuZGxlcy9oYW5kbGUgd3JhcHBpbmcKKyAgICBib29sIHNoYWRlcl92YWxpZGF0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gZm9yIHNoYWRlcnMKKworICAgIHZvaWQgU2V0QWxsKGJvb2wgdmFsdWUpIHsgc3RkOjpmaWxsKCZjb21tYW5kX2J1ZmZlcl9zdGF0ZSwgJnNoYWRlcl92YWxpZGF0aW9uICsgMSwgdmFsdWUpOyB9Cit9OworCitzdHJ1Y3QgQ0hFQ0tfRU5BQkxFRCB7CisgICAgYm9vbCBncHVfdmFsaWRhdGlvbjsKKyAgICBib29sIGdwdV92YWxpZGF0aW9uX3Jlc2VydmVfYmluZGluZ19zbG90OworICAgIGJvb2wgYmVzdF9wcmFjdGljZXM7CisKKyAgICB2b2lkIFNldEFsbChib29sIHZhbHVlKSB7IHN0ZDo6ZmlsbCgmZ3B1X3ZhbGlkYXRpb24sICZncHVfdmFsaWRhdGlvbl9yZXNlcnZlX2JpbmRpbmdfc2xvdCArIDEsIHZhbHVlKTsgfQorfTsKKworLy8gTGF5ZXIgY2hhc3NpcyB2YWxpZGF0aW9uIG9iamVjdCBiYXNlIGNsYXNzIGRlZmluaXRpb24KK2NsYXNzIFZhbGlkYXRpb25PYmplY3QgeworICAgIHB1YmxpYzoKKyAgICAgICAgdWludDMyX3QgYXBpX3ZlcnNpb247CisgICAgICAgIGRlYnVnX3JlcG9ydF9kYXRhKiByZXBvcnRfZGF0YSA9IG51bGxwdHI7CisKKyAgICAgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZTsKKyAgICAgICAgVmtMYXllckRpc3BhdGNoVGFibGUgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlOworCisgICAgICAgIEluc3RhbmNlRXh0ZW5zaW9ucyBpbnN0YW5jZV9leHRlbnNpb25zOworICAgICAgICBEZXZpY2VFeHRlbnNpb25zIGRldmljZV9leHRlbnNpb25zID0ge307CisgICAgICAgIENIRUNLX0RJU0FCTEVEIGRpc2FibGVkID0ge307CisgICAgICAgIENIRUNLX0VOQUJMRUQgZW5hYmxlZCA9IHt9OworCisgICAgICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbF9kZXZpY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgVmtEZXZpY2UgZGV2aWNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIExBWUVSX1BIWVNfREVWX1BST1BFUlRJRVMgcGh5c19kZXZfcHJvcGVydGllcyA9IHt9OworCisgICAgICAgIHN0ZDo6dmVjdG9yPFZhbGlkYXRpb25PYmplY3QqPiBvYmplY3RfZGlzcGF0Y2g7CisgICAgICAgIExheWVyT2JqZWN0VHlwZUlkIGNvbnRhaW5lcl90eXBlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGxheWVyX25hbWUgPSAiQ0hBU1NJUyI7CisKKyAgICAgICAgLy8gQ29uc3RydWN0b3IKKyAgICAgICAgVmFsaWRhdGlvbk9iamVjdCgpe307CisgICAgICAgIC8vIERlc3RydWN0b3IKKyAgICAgICAgdmlydHVhbCB+VmFsaWRhdGlvbk9iamVjdCgpIHt9OworCisgICAgICAgIFJlYWRXcml0ZUxvY2sgdmFsaWRhdGlvbl9vYmplY3RfbXV0ZXg7CisgICAgICAgIHZpcnR1YWwgcmVhZF9sb2NrX2d1YXJkX3QgcmVhZF9sb2NrKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRfbG9ja19ndWFyZF90KHZhbGlkYXRpb25fb2JqZWN0X211dGV4KTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHdyaXRlX2xvY2tfZ3VhcmRfdCB3cml0ZV9sb2NrKCkgeworICAgICAgICAgICAgcmV0dXJuIHdyaXRlX2xvY2tfZ3VhcmRfdCh2YWxpZGF0aW9uX29iamVjdF9tdXRleCk7CisgICAgICAgIH0KKworICAgICAgICBWYWxpZGF0aW9uT2JqZWN0KiBHZXRWYWxpZGF0aW9uT2JqZWN0KHN0ZDo6dmVjdG9yPFZhbGlkYXRpb25PYmplY3QqPiYgb2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVJZCBvYmplY3RfdHlwZSkgeworICAgICAgICAgICAgZm9yIChhdXRvIHZhbGlkYXRpb25fb2JqZWN0IDogb2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25fb2JqZWN0LT5jb250YWluZXJfdHlwZSA9PSBvYmplY3RfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvbl9vYmplY3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gSGFuZGxlIFdyYXBwaW5nIERhdGEKKyAgICAgICAgLy8gUmV2ZXJzZSBtYXAgZGlzcGxheSBoYW5kbGVzCisgICAgICAgIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcDxWa0Rpc3BsYXlLSFIsIHVpbnQ2NF90LCAwPiBkaXNwbGF5X2lkX3JldmVyc2VfbWFwcGluZzsKKyAgICAgICAgLy8gV3JhcHBpbmcgRGVzY3JpcHRvciBUZW1wbGF0ZSBVcGRhdGUgc3RydWN0dXJlcyByZXF1aXJlcyBhY2Nlc3MgdG8gdGhlIHRlbXBsYXRlIGNyZWF0ZWluZm8gc3RydWN0cworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dW5pcXVlX3B0cjxURU1QTEFURV9TVEFURT4+IGRlc2NfdGVtcGxhdGVfY3JlYXRlaW5mb19tYXA7CisgICAgICAgIHN0cnVjdCBTdWJwYXNzZXNVc2FnZVN0YXRlcyB7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHN1YnBhc3Nlc191c2luZ19jb2xvcl9hdHRhY2htZW50OworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBzdWJwYXNzZXNfdXNpbmdfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQ7CisgICAgICAgIH07CisgICAgICAgIC8vIFVzZXMgdW53cmFwcGVkIGhhbmRsZXMKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZrUmVuZGVyUGFzcywgU3VicGFzc2VzVXNhZ2VTdGF0ZXM+IHJlbmRlcnBhc3Nlc19zdGF0ZXM7CisgICAgICAgIC8vIE1hcCBvZiB3cmFwcGVkIHN3YXBjaGFpbiBoYW5kbGVzIHRvIGFycmF5cyBvZiB3cmFwcGVkIHN3YXBjaGFpbiBpbWFnZSBJRHMKKyAgICAgICAgLy8gRWFjaCBzd2FwY2hhaW4gaGFzIGFuIGltbXV0YWJsZSBsaXN0IG9mIHdyYXBwZWQgc3dhcGNoYWluIGltYWdlIElEcyAtLSBhbHdheXMgcmV0dXJuIHRoZXNlIElEcyBpZiB0aGV5IGV4aXN0CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa1N3YXBjaGFpbktIUiwgc3RkOjp2ZWN0b3I8VmtJbWFnZT4+IHN3YXBjaGFpbl93cmFwcGVkX2ltYWdlX2hhbmRsZV9tYXA7CisgICAgICAgIC8vIE1hcCBvZiB3cmFwcGVkIGRlc2NyaXB0b3IgcG9vbHMgdG8gc2V0IG9mIHdyYXBwZWQgZGVzY3JpcHRvciBzZXRzIGFsbG9jYXRlZCBmcm9tIGVhY2ggcG9vbAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtEZXNjcmlwdG9yUG9vbCwgc3RkOjp1bm9yZGVyZWRfc2V0PFZrRGVzY3JpcHRvclNldD4+IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcDsKKworCisgICAgICAgIC8vIFVud3JhcCBhIGhhbmRsZS4KKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZVR5cGU+CisgICAgICAgIEhhbmRsZVR5cGUgVW53cmFwKEhhbmRsZVR5cGUgd3JhcHBlZEhhbmRsZSkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcuZmluZChyZWludGVycHJldF9jYXN0PHVpbnQ2NF90IGNvbnN0ICY+KHdyYXBwZWRIYW5kbGUpKTsKKyAgICAgICAgICAgIGlmIChpdGVyID09IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAoSGFuZGxlVHlwZSkwOworICAgICAgICAgICAgcmV0dXJuIChIYW5kbGVUeXBlKWl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdyYXAgYSBuZXdseSBjcmVhdGVkIGhhbmRsZSB3aXRoIGEgbmV3IHVuaXF1ZSBJRCwgYW5kIHJldHVybiB0aGUgbmV3IElELgorICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlVHlwZT4KKyAgICAgICAgSGFuZGxlVHlwZSBXcmFwTmV3KEhhbmRsZVR5cGUgbmV3bHlDcmVhdGVkSGFuZGxlKSB7CisgICAgICAgICAgICBhdXRvIHVuaXF1ZV9pZCA9IGdsb2JhbF91bmlxdWVfaWQrKzsKKyAgICAgICAgICAgIHVuaXF1ZV9pZCA9IEhhc2hlZFVpbnQ2NDo6aGFzaCh1bmlxdWVfaWQpOworICAgICAgICAgICAgdW5pcXVlX2lkX21hcHBpbmcuaW5zZXJ0X29yX2Fzc2lnbih1bmlxdWVfaWQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgY29uc3QgJj4obmV3bHlDcmVhdGVkSGFuZGxlKSk7CisgICAgICAgICAgICByZXR1cm4gKEhhbmRsZVR5cGUpdW5pcXVlX2lkOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3BlY2lhbGl6ZWQgaGFuZGxpbmcgZm9yIFZrRGlzcGxheUtIUi4gQWRkcyBhbiBlbnRyeSB0byBlbmFibGUgcmV2ZXJzZS1sb29rdXAuCisgICAgICAgIFZrRGlzcGxheUtIUiBXcmFwRGlzcGxheShWa0Rpc3BsYXlLSFIgbmV3bHlDcmVhdGVkSGFuZGxlLCBWYWxpZGF0aW9uT2JqZWN0ICptYXBfZGF0YSkgeworICAgICAgICAgICAgYXV0byB1bmlxdWVfaWQgPSBnbG9iYWxfdW5pcXVlX2lkKys7CisgICAgICAgICAgICB1bmlxdWVfaWQgPSBIYXNoZWRVaW50NjQ6Omhhc2godW5pcXVlX2lkKTsKKyAgICAgICAgICAgIHVuaXF1ZV9pZF9tYXBwaW5nLmluc2VydF9vcl9hc3NpZ24odW5pcXVlX2lkLCByZWludGVycHJldF9jYXN0PHVpbnQ2NF90IGNvbnN0ICY+KG5ld2x5Q3JlYXRlZEhhbmRsZSkpOworICAgICAgICAgICAgbWFwX2RhdGEtPmRpc3BsYXlfaWRfcmV2ZXJzZV9tYXBwaW5nLmluc2VydF9vcl9hc3NpZ24obmV3bHlDcmVhdGVkSGFuZGxlLCB1bmlxdWVfaWQpOworICAgICAgICAgICAgcmV0dXJuIChWa0Rpc3BsYXlLSFIpdW5pcXVlX2lkOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmtEaXNwbGF5S0hSIG9iamVjdHMgZG9uJ3QgaGF2ZSBhIHNpbmdsZSBwb2ludCBvZiBjcmVhdGlvbiwgc28gd2UgbmVlZCB0byBzZWUgaWYgb25lIGFscmVhZHkgZXhpc3RzIGluIHRoZSBtYXAgYmVmb3JlCisgICAgICAgIC8vIGNyZWF0aW5nIGFub3RoZXIuCisgICAgICAgIFZrRGlzcGxheUtIUiBNYXliZVdyYXBEaXNwbGF5KFZrRGlzcGxheUtIUiBoYW5kbGUsIFZhbGlkYXRpb25PYmplY3QgKm1hcF9kYXRhKSB7CisgICAgICAgICAgICAvLyBTZWUgaWYgdGhpcyBkaXNwbGF5IGlzIGFscmVhZHkga25vd24KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtYXBfZGF0YS0+ZGlzcGxheV9pZF9yZXZlcnNlX21hcHBpbmcuZmluZChoYW5kbGUpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1hcF9kYXRhLT5kaXNwbGF5X2lkX3JldmVyc2VfbWFwcGluZy5lbmQoKSkgcmV0dXJuIChWa0Rpc3BsYXlLSFIpaXQtPnNlY29uZDsKKyAgICAgICAgICAgIC8vIFVua25vd24sIHNvIHdyYXAKKyAgICAgICAgICAgIHJldHVybiBXcmFwRGlzcGxheShoYW5kbGUsIG1hcF9kYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZS9wb3N0IGhvb2sgcG9pbnQgZGVjbGFyYXRpb25zCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbnN0YW5jZSogcEluc3RhbmNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbnN0YW5jZSogcEluc3RhbmNlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrSW5zdGFuY2UqIHBJbnN0YW5jZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lJbnN0YW5jZShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lJbnN0YW5jZShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95SW5zdGFuY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCogcFBoeXNpY2FsRGV2aWNlQ291bnQsIFZrUGh5c2ljYWxEZXZpY2UqIHBQaHlzaWNhbERldmljZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCogcFBoeXNpY2FsRGV2aWNlQ291bnQsIFZrUGh5c2ljYWxEZXZpY2UqIHBQaHlzaWNhbERldmljZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QqIHBQaHlzaWNhbERldmljZUNvdW50LCBWa1BoeXNpY2FsRGV2aWNlKiBwUGh5c2ljYWxEZXZpY2VzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqIHBGZWF0dXJlcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqIHBGZWF0dXJlcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiBwRmVhdHVyZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtGb3JtYXRQcm9wZXJ0aWVzKiBwRm9ybWF0UHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtGb3JtYXRQcm9wZXJ0aWVzKiBwRm9ybWF0UHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrRm9ybWF0UHJvcGVydGllcyogcEZvcm1hdFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa0ltYWdlVGlsaW5nIHRpbGluZywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VDcmVhdGVGbGFncyBmbGFncywgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVR5cGUgdHlwZSwgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa0ltYWdlVGlsaW5nIHRpbGluZywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VDcmVhdGVGbGFncyBmbGFncywgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyogcFF1ZXVlRmFtaWx5UHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyogcFF1ZXVlRmFtaWx5UHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqIHBNZW1vcnlQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqIHBNZW1vcnlQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKiBwTWVtb3J5UHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBOYW1lKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBOYW1lKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyKiBwTmFtZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VQcm9jQWRkcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IGNoYXIqIHBOYW1lKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXREZXZpY2VQcm9jQWRkcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IGNoYXIqIHBOYW1lKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlUHJvY0FkZHIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBjaGFyKiBwTmFtZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZSogcERldmljZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXZpY2UqIHBEZXZpY2UpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZSogcERldmljZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95RGV2aWNlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciogcExheWVyTmFtZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0V4dGVuc2lvblByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgY2hhciogcExheWVyTmFtZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0V4dGVuc2lvblByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBjaGFyKiBwTGF5ZXJOYW1lLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXModWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0xheWVyUHJvcGVydGllcyogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzKiBwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtMYXllclByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtMYXllclByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlUXVldWUoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCBxdWV1ZUluZGV4LCBWa1F1ZXVlKiBwUXVldWUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldERldmljZVF1ZXVlKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgdWludDMyX3QgcXVldWVJbmRleCwgVmtRdWV1ZSogcFF1ZXVlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCBxdWV1ZUluZGV4LCBWa1F1ZXVlKiBwUXVldWUpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyogcFN1Ym1pdHMsIFZrRmVuY2UgZmVuY2UpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFF1ZXVlU3VibWl0KFZrUXVldWUgcXVldWUsIHVpbnQzMl90IHN1Ym1pdENvdW50LCBjb25zdCBWa1N1Ym1pdEluZm8qIHBTdWJtaXRzLCBWa0ZlbmNlIGZlbmNlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkUXVldWVTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyogcFN1Ym1pdHMsIFZrRmVuY2UgZmVuY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVRdWV1ZVdhaXRJZGxlKFZrUXVldWUgcXVldWUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFF1ZXVlV2FpdElkbGUoVmtRdWV1ZSBxdWV1ZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlV2FpdElkbGUoVmtRdWV1ZSBxdWV1ZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURldmljZVdhaXRJZGxlKFZrRGV2aWNlIGRldmljZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGV2aWNlV2FpdElkbGUoVmtEZXZpY2UgZGV2aWNlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGV2aWNlV2FpdElkbGUoVmtEZXZpY2UgZGV2aWNlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZU1lbW9yeSogcE1lbW9yeSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQWxsb2NhdGVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZU1lbW9yeSogcE1lbW9yeSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEFsbG9jYXRlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXZpY2VNZW1vcnkqIHBNZW1vcnksIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVGcmVlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEZyZWVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEZyZWVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVNYXBNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCBWa01lbW9yeU1hcEZsYWdzIGZsYWdzLCB2b2lkKiogcHBEYXRhKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRNYXBNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCBWa01lbW9yeU1hcEZsYWdzIGZsYWdzLCB2b2lkKiogcHBEYXRhKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkTWFwTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgVmtNZW1vcnlNYXBGbGFncyBmbGFncywgdm9pZCoqIHBwRGF0YSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVVubWFwTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRVbm1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFVubWFwTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogcE1lbW9yeVJhbmdlcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IG1lbW9yeVJhbmdlQ291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IG1lbW9yeVJhbmdlQ291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUqIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUqIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudChWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplKiBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQmluZEltYWdlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQmluZEltYWdlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0LCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBWa01lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBWa01lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgVmtNZW1vcnlSZXF1aXJlbWVudHMqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa01lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa01lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgVmtNZW1vcnlSZXF1aXJlbWVudHMqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCB1aW50MzJfdCogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCB1aW50MzJfdCogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlVHlwZSB0eXBlLCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVR5cGUgdHlwZSwgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXMsIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ltYWdlVGlsaW5nIHRpbGluZywgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVCaW5kU3BhcnNlKFZrUXVldWUgcXVldWUsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qIHBCaW5kSW5mbywgVmtGZW5jZSBmZW5jZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkUXVldWVCaW5kU3BhcnNlKFZrUXVldWUgcXVldWUsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qIHBCaW5kSW5mbywgVmtGZW5jZSBmZW5jZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlQmluZFNwYXJzZShWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiBwQmluZEluZm8sIFZrRmVuY2UgZmVuY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVGZW5jZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ZlbmNlKiBwRmVuY2UpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUZlbmNlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUZlbmNlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lGZW5jZShWa0RldmljZSBkZXZpY2UsIFZrRmVuY2UgZmVuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUZlbmNlKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUZlbmNlKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0RmVuY2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVmtGZW5jZSogcEZlbmNlcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkUmVzZXRGZW5jZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlKiBwRmVuY2VzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkUmVzZXRGZW5jZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlKiBwRmVuY2VzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VTdGF0dXMoVmtEZXZpY2UgZGV2aWNlLCBWa0ZlbmNlIGZlbmNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRGZW5jZVN0YXR1cyhWa0RldmljZSBkZXZpY2UsIFZrRmVuY2UgZmVuY2UpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRGZW5jZVN0YXR1cyhWa0RldmljZSBkZXZpY2UsIFZrRmVuY2UgZmVuY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVXYWl0Rm9yRmVuY2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVmtGZW5jZSogcEZlbmNlcywgVmtCb29sMzIgd2FpdEFsbCwgdWludDY0X3QgdGltZW91dCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkV2FpdEZvckZlbmNlcyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGZlbmNlQ291bnQsIGNvbnN0IFZrRmVuY2UqIHBGZW5jZXMsIFZrQm9vbDMyIHdhaXRBbGwsIHVpbnQ2NF90IHRpbWVvdXQpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRXYWl0Rm9yRmVuY2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVmtGZW5jZSogcEZlbmNlcywgVmtCb29sMzIgd2FpdEFsbCwgdWludDY0X3QgdGltZW91dCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNlbWFwaG9yZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTZW1hcGhvcmUqIHBTZW1hcGhvcmUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVNlbWFwaG9yZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTZW1hcGhvcmUqIHBTZW1hcGhvcmUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVTZW1hcGhvcmUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2VtYXBob3JlKiBwU2VtYXBob3JlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNlbWFwaG9yZShWa0RldmljZSBkZXZpY2UsIFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRXZlbnQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtFdmVudCogcEV2ZW50KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVFdmVudChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0V2ZW50KiBwRXZlbnQpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVFdmVudChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0V2ZW50KiBwRXZlbnQsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RXZlbnQoVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lFdmVudChWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lFdmVudChWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRFdmVudFN0YXR1cyhWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldEV2ZW50U3RhdHVzKFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEV2ZW50U3RhdHVzKFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVNldEV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkU2V0RXZlbnQoVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkU2V0RXZlbnQoVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50LCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUmVzZXRFdmVudChWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFJlc2V0RXZlbnQoVmtEZXZpY2UgZGV2aWNlLCBWa0V2ZW50IGV2ZW50KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkUmVzZXRFdmVudChWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVRdWVyeVBvb2woVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUXVlcnlQb29sKiBwUXVlcnlQb29sKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVRdWVyeVBvb2woVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUXVlcnlQb29sKiBwUXVlcnlQb29sKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUXVlcnlQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1F1ZXJ5UG9vbCogcFF1ZXJ5UG9vbCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lRdWVyeVBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVF1ZXJ5UG9vbChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVF1ZXJ5UG9vbChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFF1ZXJ5UG9vbFJlc3VsdHMoVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCogcERhdGEsIFZrRGV2aWNlU2l6ZSBzdHJpZGUsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UXVlcnlQb29sUmVzdWx0cyhWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSwgVmtEZXZpY2VTaXplIHN0cmlkZSwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UXVlcnlQb29sUmVzdWx0cyhWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSwgVmtEZXZpY2VTaXplIHN0cmlkZSwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0J1ZmZlciogcEJ1ZmZlcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0J1ZmZlciogcEJ1ZmZlcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtCdWZmZXIqIHBCdWZmZXIsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95QnVmZmVyKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lCdWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lCdWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVCdWZmZXJWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtCdWZmZXJWaWV3KiBwVmlldykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyVmlldyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQnVmZmVyVmlldyogcFZpZXcpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVCdWZmZXJWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtCdWZmZXJWaWV3KiBwVmlldywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lCdWZmZXJWaWV3KFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXJWaWV3IGJ1ZmZlclZpZXcsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlclZpZXcgYnVmZmVyVmlldywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlclZpZXcgYnVmZmVyVmlldywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrSW1hZ2UqIHBJbWFnZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlSW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbWFnZSogcEltYWdlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbWFnZSogcEltYWdlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUltYWdlKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95SW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95SW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSogcFN1YnJlc291cmNlLCBWa1N1YnJlc291cmNlTGF5b3V0KiBwTGF5b3V0KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiBwU3VicmVzb3VyY2UsIFZrU3VicmVzb3VyY2VMYXlvdXQqIHBMYXlvdXQpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiBwU3VicmVzb3VyY2UsIFZrU3VicmVzb3VyY2VMYXlvdXQqIHBMYXlvdXQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW1hZ2VWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ltYWdlVmlldyogcFZpZXcpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUltYWdlVmlldyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbWFnZVZpZXcqIHBWaWV3KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ltYWdlVmlldyogcFZpZXcsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95SW1hZ2VWaWV3KFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lJbWFnZVZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lJbWFnZVZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVTaGFkZXJNb2R1bGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2hhZGVyTW9kdWxlKiBwU2hhZGVyTW9kdWxlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVTaGFkZXJNb2R1bGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2hhZGVyTW9kdWxlKiBwU2hhZGVyTW9kdWxlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2hhZGVyTW9kdWxlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTaGFkZXJNb2R1bGUoVmtEZXZpY2UgZGV2aWNlLCBWa1NoYWRlck1vZHVsZSBzaGFkZXJNb2R1bGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIFZrU2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIFZrU2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVBpcGVsaW5lQ2FjaGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lQ2FjaGUqIHBQaXBlbGluZUNhY2hlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUNhY2hlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZUNhY2hlKiBwUGlwZWxpbmVDYWNoZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lQ2FjaGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lQ2FjaGUqIHBQaXBlbGluZUNhY2hlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lQ2FjaGUoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVDYWNoZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVDYWNoZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVDYWNoZURhdGEoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgc2l6ZV90KiBwRGF0YVNpemUsIHZvaWQqIHBEYXRhKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaXBlbGluZUNhY2hlRGF0YShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaXBlbGluZUNhY2hlRGF0YShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVNZXJnZVBpcGVsaW5lQ2FjaGVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIGRzdENhY2hlLCB1aW50MzJfdCBzcmNDYWNoZUNvdW50LCBjb25zdCBWa1BpcGVsaW5lQ2FjaGUqIHBTcmNDYWNoZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZE1lcmdlUGlwZWxpbmVDYWNoZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgZHN0Q2FjaGUsIHVpbnQzMl90IHNyY0NhY2hlQ291bnQsIGNvbnN0IFZrUGlwZWxpbmVDYWNoZSogcFNyY0NhY2hlcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZE1lcmdlUGlwZWxpbmVDYWNoZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgZHN0Q2FjaGUsIHVpbnQzMl90IHNyY0NhY2hlQ291bnQsIGNvbnN0IFZrUGlwZWxpbmVDYWNoZSogcFNyY0NhY2hlcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95UGlwZWxpbmUoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lTGF5b3V0KiBwUGlwZWxpbmVMYXlvdXQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmVMYXlvdXQqIHBQaXBlbGluZUxheW91dCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmVMYXlvdXQqIHBQaXBlbGluZUxheW91dCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXIqIHBTYW1wbGVyKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVTYW1wbGVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTYW1wbGVyKiBwU2FtcGxlcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXIqIHBTYW1wbGVyLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNhbXBsZXIoVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXIgc2FtcGxlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U2FtcGxlcihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlciBzYW1wbGVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U2FtcGxlcihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlciBzYW1wbGVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclNldExheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclNldExheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqIHBTZXRMYXlvdXQsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVzY3JpcHRvclNldExheW91dChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldExheW91dCBkZXNjcmlwdG9yU2V0TGF5b3V0LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRlc2NyaXB0b3JTZXRMYXlvdXQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRlc2NyaXB0b3JTZXRMYXlvdXQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JQb29sKiBwRGVzY3JpcHRvclBvb2wpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclBvb2wqIHBEZXNjcmlwdG9yUG9vbCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclBvb2wqIHBEZXNjcmlwdG9yUG9vbCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0RGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCBWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncyBmbGFncykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkUmVzZXREZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkUmVzZXREZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEFsbG9jYXRlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sIFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVGcmVlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsIGNvbnN0IFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRGcmVlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsIGNvbnN0IFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRnJlZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvcldyaXRlcywgdWludDMyX3QgZGVzY3JpcHRvckNvcHlDb3VudCwgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JDb3BpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvcldyaXRlcywgdWludDMyX3QgZGVzY3JpcHRvckNvcHlDb3VudCwgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JDb3BpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMsIHVpbnQzMl90IGRlc2NyaXB0b3JDb3B5Q291bnQsIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yQ29waWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUZyYW1lYnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRnJhbWVidWZmZXIqIHBGcmFtZWJ1ZmZlcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtGcmFtZWJ1ZmZlciogcEZyYW1lYnVmZmVyKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtGcmFtZWJ1ZmZlciogcEZyYW1lYnVmZmVyLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUZyYW1lYnVmZmVyKFZrRGV2aWNlIGRldmljZSwgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95RnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95RnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyogcFJlbmRlclBhc3MpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyogcFJlbmRlclBhc3MsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95UmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgVmtFeHRlbnQyRCogcEdyYW51bGFyaXR5KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgVmtFeHRlbnQyRCogcEdyYW51bGFyaXR5KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5KFZrRGV2aWNlIGRldmljZSwgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3MsIFZrRXh0ZW50MkQqIHBHcmFudWxhcml0eSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0NvbW1hbmRQb29sKiBwQ29tbWFuZFBvb2wpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQ29tbWFuZFBvb2wqIHBDb21tYW5kUG9vbCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQ29tbWFuZFBvb2wqIHBDb21tYW5kUG9vbCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0Q29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyBmbGFncykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkUmVzZXRDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdzIGZsYWdzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkUmVzZXRDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdzIGZsYWdzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sIFZrQ29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQWxsb2NhdGVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVGcmVlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRGcmVlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRnJlZUNvbW1hbmRCdWZmZXJzKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogcEJlZ2luSW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQmVnaW5Db21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qIHBCZWdpbkluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogcEJlZ2luSW5mbywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUVuZENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEVuZENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRFbmRDb21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUmVzZXRDb21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRSZXNldENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgZmxhZ3MpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRSZXNldENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgZmxhZ3MsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kUGlwZWxpbmUoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmUgcGlwZWxpbmUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmRQaXBlbGluZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZSBwaXBlbGluZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEJpbmRQaXBlbGluZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZSBwaXBlbGluZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydCogcFZpZXdwb3J0cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0Vmlld3BvcnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnQqIHBWaWV3cG9ydHMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydCogcFZpZXdwb3J0cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTY2lzc29yKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFNjaXNzb3IsIHVpbnQzMl90IHNjaXNzb3JDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBTY2lzc29ycykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0U2Npc3NvcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RTY2lzc29yLCB1aW50MzJfdCBzY2lzc29yQ291bnQsIGNvbnN0IFZrUmVjdDJEKiBwU2Npc3NvcnMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRTY2lzc29yKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFNjaXNzb3IsIHVpbnQzMl90IHNjaXNzb3JDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBTY2lzc29ycykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRMaW5lV2lkdGgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IGxpbmVXaWR0aCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVdpZHRoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBsaW5lV2lkdGgpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRMaW5lV2lkdGgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IGxpbmVXaWR0aCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXB0aEJpYXMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBmbG9hdCBkZXB0aEJpYXNDbGFtcCwgZmxvYXQgZGVwdGhCaWFzU2xvcGVGYWN0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldERlcHRoQmlhcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsIGZsb2F0IGRlcHRoQmlhc0NsYW1wLCBmbG9hdCBkZXB0aEJpYXNTbG9wZUZhY3Rvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldERlcHRoQmlhcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsIGZsb2F0IGRlcHRoQmlhc0NsYW1wLCBmbG9hdCBkZXB0aEJpYXNTbG9wZUZhY3Rvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRCbGVuZENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgZmxvYXQgYmxlbmRDb25zdGFudHNbNF0pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldEJsZW5kQ29uc3RhbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBmbG9hdCBibGVuZENvbnN0YW50c1s0XSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldEJsZW5kQ29uc3RhbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBmbG9hdCBibGVuZENvbnN0YW50c1s0XSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXB0aEJvdW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbWluRGVwdGhCb3VuZHMsIGZsb2F0IG1heERlcHRoQm91bmRzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXREZXB0aEJvdW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbWluRGVwdGhCb3VuZHMsIGZsb2F0IG1heERlcHRoQm91bmRzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0RGVwdGhCb3VuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IG1pbkRlcHRoQm91bmRzLCBmbG9hdCBtYXhEZXB0aEJvdW5kcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3QgY29tcGFyZU1hc2spIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCBjb21wYXJlTWFzaykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCBjb21wYXJlTWFzaykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHdyaXRlTWFzaykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFdyaXRlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCB3cml0ZU1hc2spIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHdyaXRlTWFzaykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHJlZmVyZW5jZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFJlZmVyZW5jZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCByZWZlcmVuY2UpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHJlZmVyZW5jZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kRGVzY3JpcHRvclNldHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgdWludDMyX3QgZHluYW1pY09mZnNldENvdW50LCBjb25zdCB1aW50MzJfdCogcER5bmFtaWNPZmZzZXRzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRCaW5kRGVzY3JpcHRvclNldHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgdWludDMyX3QgZHluYW1pY09mZnNldENvdW50LCBjb25zdCB1aW50MzJfdCogcER5bmFtaWNPZmZzZXRzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmluZERlc2NyaXB0b3JTZXRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3QgZmlyc3RTZXQsIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIHVpbnQzMl90IGR5bmFtaWNPZmZzZXRDb3VudCwgY29uc3QgdWludDMyX3QqIHBEeW5hbWljT2Zmc2V0cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kSW5kZXhCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtJbmRleFR5cGUgaW5kZXhUeXBlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRCaW5kSW5kZXhCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtJbmRleFR5cGUgaW5kZXhUeXBlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmluZEluZGV4QnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrSW5kZXhUeXBlIGluZGV4VHlwZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kVmVydGV4QnVmZmVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwT2Zmc2V0cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQmluZFZlcnRleEJ1ZmZlcnMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0QmluZGluZywgdWludDMyX3QgYmluZGluZ0NvdW50LCBjb25zdCBWa0J1ZmZlciogcEJ1ZmZlcnMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcE9mZnNldHMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRCaW5kVmVydGV4QnVmZmVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwT2Zmc2V0cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RWZXJ0ZXgsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXcoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHZlcnRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdFZlcnRleCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXcoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHZlcnRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdFZlcnRleCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgaW5kZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRleGVkKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgZHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLCB1aW50MzJfdCBncm91cENvdW50WikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRGlzcGF0Y2goVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREaXNwYXRjaChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLCB1aW50MzJfdCBncm91cENvdW50Wikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERpc3BhdGNoSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZERpc3BhdGNoSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5QnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBzcmNCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVyQ29weSogcFJlZ2lvbnMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJDb3B5KiBwUmVnaW9ucykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZENvcHlCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJDb3B5KiBwUmVnaW9ucykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSogcFJlZ2lvbnMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VDb3B5KiBwUmVnaW9ucykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZENvcHlJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VDb3B5KiBwUmVnaW9ucykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCbGl0SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQmxpdCogcFJlZ2lvbnMsIFZrRmlsdGVyIGZpbHRlcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQmxpdEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZUJsaXQqIHBSZWdpb25zLCBWa0ZpbHRlciBmaWx0ZXIpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRCbGl0SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQmxpdCogcFJlZ2lvbnMsIFZrRmlsdGVyIGZpbHRlcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5QnVmZmVyVG9JbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5QnVmZmVyVG9JbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlclRvSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5SW1hZ2VUb0J1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2VUb0J1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQ29weUltYWdlVG9CdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRVcGRhdGVCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIGRhdGFTaXplLCBjb25zdCB2b2lkKiBwRGF0YSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kVXBkYXRlQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBkYXRhU2l6ZSwgY29uc3Qgdm9pZCogcERhdGEpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRVcGRhdGVCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIGRhdGFTaXplLCBjb25zdCB2b2lkKiBwRGF0YSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRGaWxsQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBkYXRhKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRGaWxsQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBkYXRhKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRmlsbEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgdWludDMyX3QgZGF0YSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckNvbG9ySW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiBwQ29sb3IsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRDbGVhckNvbG9ySW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiBwQ29sb3IsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQ2xlYXJDb2xvckltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSogcENvbG9yLCB1aW50MzJfdCByYW5nZUNvdW50LCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogcFJhbmdlcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiBwRGVwdGhTdGVuY2lsLCB1aW50MzJfdCByYW5nZUNvdW50LCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogcFJhbmdlcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckF0dGFjaG1lbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBhdHRhY2htZW50Q291bnQsIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiBwQXR0YWNobWVudHMsIHVpbnQzMl90IHJlY3RDb3VudCwgY29uc3QgVmtDbGVhclJlY3QqIHBSZWN0cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQ2xlYXJBdHRhY2htZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYXR0YWNobWVudENvdW50LCBjb25zdCBWa0NsZWFyQXR0YWNobWVudCogcEF0dGFjaG1lbnRzLCB1aW50MzJfdCByZWN0Q291bnQsIGNvbnN0IFZrQ2xlYXJSZWN0KiBwUmVjdHMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRDbGVhckF0dGFjaG1lbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBhdHRhY2htZW50Q291bnQsIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiBwQXR0YWNobWVudHMsIHVpbnQzMl90IHJlY3RDb3VudCwgY29uc3QgVmtDbGVhclJlY3QqIHBSZWN0cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRSZXNvbHZlSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlUmVzb2x2ZSogcFJlZ2lvbnMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFJlc29sdmVJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiBwUmVnaW9ucykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFJlc29sdmVJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiBwUmVnaW9ucykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0RXZlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRXZlbnQgZXZlbnQsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzaykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRSZXNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFJlc2V0RXZlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRXZlbnQgZXZlbnQsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzaykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFJlc2V0RXZlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRXZlbnQgZXZlbnQsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzaykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRXYWl0RXZlbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kV2FpdEV2ZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZXZlbnRDb3VudCwgY29uc3QgVmtFdmVudCogcEV2ZW50cywgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRXYWl0RXZlbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRQaXBlbGluZUJhcnJpZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBWa0RlcGVuZGVuY3lGbGFncyBkZXBlbmRlbmN5RmxhZ3MsIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFBpcGVsaW5lQmFycmllcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZrRGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFncywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFBpcGVsaW5lQmFycmllcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZrRGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFncywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpblF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmVnaW5RdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVmtRdWVyeUNvbnRyb2xGbGFncyBmbGFncykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRFbmRRdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRFbmRRdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRSZXNldFF1ZXJ5UG9vbChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRSZXNldFF1ZXJ5UG9vbChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kUmVzZXRRdWVyeVBvb2woVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRXcml0ZVRpbWVzdGFtcChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kV3JpdGVUaW1lc3RhbXAoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRXcml0ZVRpbWVzdGFtcChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzdHJpZGUsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc3RyaWRlLCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzdHJpZGUsIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRQdXNoQ29uc3RhbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgVmtTaGFkZXJTdGFnZUZsYWdzIHN0YWdlRmxhZ3MsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSwgY29uc3Qgdm9pZCogcFZhbHVlcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kUHVzaENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIFZrU2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUsIGNvbnN0IHZvaWQqIHBWYWx1ZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRQdXNoQ29uc3RhbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgVmtTaGFkZXJTdGFnZUZsYWdzIHN0YWdlRmxhZ3MsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSwgY29uc3Qgdm9pZCogcFZhbHVlcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpblJlbmRlclBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJlZ2luUmVuZGVyUGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiBwUmVuZGVyUGFzc0JlZ2luLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEJlZ2luUmVuZGVyUGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiBwUmVuZGVyUGFzc0JlZ2luLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWROZXh0U3VicGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZE5leHRTdWJwYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZE5leHRTdWJwYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRFeGVjdXRlQ29tbWFuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwgY29uc3QgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEV4ZWN1dGVDb21tYW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEV4ZWN1dGVDb21tYW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5MihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiBwQmluZEluZm9zLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqIHBQZWVyTWVtb3J5RmVhdHVyZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgaGVhcEluZGV4LCB1aW50MzJfdCBsb2NhbERldmljZUluZGV4LCB1aW50MzJfdCByZW1vdGVEZXZpY2VJbmRleCwgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiBwUGVlck1lbW9yeUZlYXR1cmVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqIHBQZWVyTWVtb3J5RmVhdHVyZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGV2aWNlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzaykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RGV2aWNlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzaykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldERldmljZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGRldmljZU1hc2spIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRGlzcGF0Y2hCYXNlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBiYXNlR3JvdXBYLCB1aW50MzJfdCBiYXNlR3JvdXBZLCB1aW50MzJfdCBiYXNlR3JvdXBaLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEJhc2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREaXNwYXRjaEJhc2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKFZrSW5zdGFuY2UgaW5zdGFuY2UsIHVpbnQzMl90KiBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCB1aW50MzJfdCogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCB1aW50MzJfdCogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiBwRmVhdHVyZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqIHBGZWF0dXJlcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqIHBGZWF0dXJlcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogcFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtGb3JtYXRQcm9wZXJ0aWVzMiogcEZvcm1hdFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0Zvcm1hdFByb3BlcnRpZXMyKiBwRm9ybWF0UHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0Zvcm1hdFByb3BlcnRpZXMyKiBwRm9ybWF0UHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqIHBJbWFnZUZvcm1hdEluZm8sIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiBwSW1hZ2VGb3JtYXRJbmZvLCBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqIHBJbWFnZUZvcm1hdEluZm8sIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogcFF1ZXVlRmFtaWx5UHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiBwTWVtb3J5UHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIHBNZW1vcnlQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIHBNZW1vcnlQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVRyaW1Db21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFRyaW1Db21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRUcmltQ29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWa0NvbW1hbmRQb29sVHJpbUZsYWdzIGZsYWdzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldERldmljZVF1ZXVlMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogcFF1ZXVlSW5mbywgVmtRdWV1ZSogcFF1ZXVlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXREZXZpY2VRdWV1ZTIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqIHBRdWV1ZUluZm8sIFZrUXVldWUqIHBRdWV1ZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogcFF1ZXVlSW5mbywgVmtRdWV1ZSogcFF1ZXVlKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qIHBZY2JjckNvbnZlcnNpb24pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qIHBZY2JjckNvbnZlcnNpb24pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiBwWWNiY3JDb252ZXJzaW9uLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKFZrRGV2aWNlIGRldmljZSwgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyQ29udmVyc2lvbiwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3Qgdm9pZCogcERhdGEpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogcEV4dGVybmFsQnVmZmVySW5mbywgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogcEV4dGVybmFsRmVuY2VJbmZvLCBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiBwRXh0ZXJuYWxGZW5jZUluZm8sIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiBwRXh0ZXJuYWxGZW5jZUluZm8sIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiBwU3VwcG9ydCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogcFN1cHBvcnQpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiBwU3VwcG9ydCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa0Jvb2wzMiogcFN1cHBvcnRlZCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtCb29sMzIqIHBTdXBwb3J0ZWQpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa0Jvb2wzMiogcFN1cHBvcnRlZCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIqIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIqIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgdWludDMyX3QqIHBTdXJmYWNlRm9ybWF0Q291bnQsIFZrU3VyZmFjZUZvcm1hdEtIUiogcFN1cmZhY2VGb3JtYXRzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVmtTdXJmYWNlRm9ybWF0S0hSKiBwU3VyZmFjZUZvcm1hdHMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVmtTdXJmYWNlRm9ybWF0S0hSKiBwU3VyZmFjZUZvcm1hdHMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwUHJlc2VudE1vZGVDb3VudCwgVmtQcmVzZW50TW9kZUtIUiogcFByZXNlbnRNb2RlcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFByZXNlbnRNb2RlQ291bnQsIFZrUHJlc2VudE1vZGVLSFIqIHBQcmVzZW50TW9kZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwUHJlc2VudE1vZGVDb3VudCwgVmtQcmVzZW50TW9kZUtIUiogcFByZXNlbnRNb2RlcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW4pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW4pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVTd2FwY2hhaW5LSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWluLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U3dhcGNoYWluSW1hZ2VzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50MzJfdCogcFN3YXBjaGFpbkltYWdlQ291bnQsIFZrSW1hZ2UqIHBTd2FwY2hhaW5JbWFnZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBWa0ltYWdlKiBwU3dhcGNoYWluSW1hZ2VzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0U3dhcGNoYWluSW1hZ2VzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50MzJfdCogcFN3YXBjaGFpbkltYWdlQ291bnQsIFZrSW1hZ2UqIHBTd2FwY2hhaW5JbWFnZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVBY3F1aXJlTmV4dEltYWdlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIFZrRmVuY2UgZmVuY2UsIHVpbnQzMl90KiBwSW1hZ2VJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQWNxdWlyZU5leHRJbWFnZUtIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDY0X3QgdGltZW91dCwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBWa0ZlbmNlIGZlbmNlLCB1aW50MzJfdCogcEltYWdlSW5kZXgpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRBY3F1aXJlTmV4dEltYWdlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIFZrRmVuY2UgZmVuY2UsIHVpbnQzMl90KiBwSW1hZ2VJbmRleCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlUHJlc2VudEtIUihWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiBwUHJlc2VudEluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFF1ZXVlUHJlc2VudEtIUihWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiBwUHJlc2VudEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZVByZXNlbnRLSFIoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogcFByZXNlbnRJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUihWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiBwTW9kZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwUmVjdENvdW50LCBWa1JlY3QyRCogcFJlY3RzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCB1aW50MzJfdCogcFJlY3RDb3VudCwgVmtSZWN0MkQqIHBSZWN0cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIHVpbnQzMl90KiBwUmVjdENvdW50LCBWa1JlY3QyRCogcFJlY3RzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZTJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiBwQWNxdWlyZUluZm8sIHVpbnQzMl90KiBwSW1hZ2VJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQWNxdWlyZU5leHRJbWFnZTJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiBwQWNxdWlyZUluZm8sIHVpbnQzMl90KiBwSW1hZ2VJbmRleCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2UyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogcEFjcXVpcmVJbmZvLCB1aW50MzJfdCogcEltYWdlSW5kZXgsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5UHJvcGVydGllc0tIUiogcFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiogcFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcGxhbmVJbmRleCwgdWludDMyX3QqIHBEaXNwbGF5Q291bnQsIFZrRGlzcGxheUtIUiogcERpc3BsYXlzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBwbGFuZUluZGV4LCB1aW50MzJfdCogcERpc3BsYXlDb3VudCwgVmtEaXNwbGF5S0hSKiBwRGlzcGxheXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBwbGFuZUluZGV4LCB1aW50MzJfdCogcERpc3BsYXlDb3VudCwgVmtEaXNwbGF5S0hSKiBwRGlzcGxheXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZURpc3BsYXlNb2RlS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEaXNwbGF5TW9kZUtIUiogcE1vZGUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZURpc3BsYXlNb2RlS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEaXNwbGF5TW9kZUtIUiogcE1vZGUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEaXNwbGF5TW9kZUtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGlzcGxheU1vZGVLSFIqIHBNb2RlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheU1vZGVLSFIgbW9kZSwgdWludDMyX3QgcGxhbmVJbmRleCwgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqIHBDYXBhYmlsaXRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlNb2RlS0hSIG1vZGUsIHVpbnQzMl90IHBsYW5lSW5kZXgsIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKiBwQ2FwYWJpbGl0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheU1vZGVLSFIgbW9kZSwgdWludDMyX3QgcGxhbmVJbmRleCwgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqIHBDYXBhYmlsaXRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3Qgc3dhcGNoYWluQ291bnQsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWlucykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlWGxpYlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVhsaWJTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlWGxpYlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGxheSogZHB5LCBWaXN1YWxJRCB2aXN1YWxJRCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBEaXNwbGF5KiBkcHksIFZpc3VhbElEIHZpc3VhbElEKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBEaXNwbGF5KiBkcHksIFZpc3VhbElEIHZpc3VhbElEKSB7fTsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVYY2JTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVhjYlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVhjYlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgeGNiX2Nvbm5lY3Rpb25fdCogY29ubmVjdGlvbiwgeGNiX3Zpc3VhbGlkX3QgdmlzdWFsX2lkKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgeGNiX2Nvbm5lY3Rpb25fdCogY29ubmVjdGlvbiwgeGNiX3Zpc3VhbGlkX3QgdmlzdWFsX2lkKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHhjYl9jb25uZWN0aW9uX3QqIGNvbm5lY3Rpb24sIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZCkge307CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHN0cnVjdCB3bF9kaXNwbGF5KiBkaXNwbGF5KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHN0cnVjdCB3bF9kaXNwbGF5KiBkaXNwbGF5KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCBzdHJ1Y3Qgd2xfZGlzcGxheSogZGlzcGxheSkge307CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlV2luMzJTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlV2luMzJTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVdpbjMyU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCkge307CisjZW5kaWYKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqIHBGZWF0dXJlcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogcEZlYXR1cmVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogcEZlYXR1cmVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0Zvcm1hdFByb3BlcnRpZXMyKiBwRm9ybWF0UHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrRm9ybWF0UHJvcGVydGllczIqIHBGb3JtYXRQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrRm9ybWF0UHJvcGVydGllczIqIHBGb3JtYXRQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogcEltYWdlRm9ybWF0SW5mbywgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqIHBJbWFnZUZvcm1hdEluZm8sIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcEltYWdlRm9ybWF0UHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogcEltYWdlRm9ybWF0SW5mbywgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIHBNZW1vcnlQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogcE1lbW9yeVByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogcE1lbW9yeVByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqIHBQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqIHBQZWVyTWVtb3J5RmVhdHVyZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgaGVhcEluZGV4LCB1aW50MzJfdCBsb2NhbERldmljZUluZGV4LCB1aW50MzJfdCByZW1vdGVEZXZpY2VJbmRleCwgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiBwUGVlck1lbW9yeUZlYXR1cmVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBoZWFwSW5kZXgsIHVpbnQzMl90IGxvY2FsRGV2aWNlSW5kZXgsIHVpbnQzMl90IHJlbW90ZURldmljZUluZGV4LCBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqIHBQZWVyTWVtb3J5RmVhdHVyZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGV2aWNlTWFza0tIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzaykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RGV2aWNlTWFza0tIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzaykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldERldmljZU1hc2tLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGRldmljZU1hc2spIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRGlzcGF0Y2hCYXNlS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBiYXNlR3JvdXBYLCB1aW50MzJfdCBiYXNlR3JvdXBZLCB1aW50MzJfdCBiYXNlR3JvdXBaLCB1aW50MzJfdCBncm91cENvdW50WCwgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEJhc2VLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREaXNwYXRjaEJhc2VLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlVHJpbUNvbW1hbmRQb29sS0hSKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVmtDb21tYW5kUG9vbFRyaW1GbGFncyBmbGFncykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkVHJpbUNvbW1hbmRQb29sS0hSKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVmtDb21tYW5kUG9vbFRyaW1GbGFncyBmbGFncykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFRyaW1Db21tYW5kUG9vbEtIUihWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIHVpbnQzMl90KiBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogcEV4dGVybmFsQnVmZmVySW5mbywgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykge307CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiBwR2V0V2luMzJIYW5kbGVJbmZvLCBIQU5ETEUqIHBIYW5kbGUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiBwR2V0V2luMzJIYW5kbGVJbmZvLCBIQU5ETEUqIHBIYW5kbGUsIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIEhBTkRMRSBoYW5kbGUsIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIEhBTkRMRSBoYW5kbGUsIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBIQU5ETEUgaGFuZGxlLCBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiogcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNlbmRpZgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5RmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldE1lbW9yeUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5RmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIGludCBmZCwgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqIHBNZW1vcnlGZFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldE1lbW9yeUZkUHJvcGVydGllc0tIUihWa0RldmljZSBkZXZpY2UsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgaW50IGZkLCBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogcE1lbW9yeUZkUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldE1lbW9yeUZkUHJvcGVydGllc0tIUihWa0RldmljZSBkZXZpY2UsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgaW50IGZkLCBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogcE1lbW9yeUZkUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKSB7fTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHBHZXRXaW4zMkhhbmRsZUluZm8sIEhBTkRMRSogcEhhbmRsZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVJbXBvcnRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRJbXBvcnRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkSW1wb3J0U2VtYXBob3JlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiogcEltcG9ydFNlbWFwaG9yZUZkSW5mbywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFNlbWFwaG9yZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiBwR2V0RmRJbmZvLCBpbnQqIHBGZCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFNlbWFwaG9yZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yV3JpdGVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgY29uc3Qgdm9pZCogcERhdGEpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIGNvbnN0IHZvaWQqIHBEYXRhKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgY29uc3Qgdm9pZCogcERhdGEpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3Qgdm9pZCogcERhdGEpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVSZW5kZXJQYXNzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVSZW5kZXJQYXNzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzczJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzKiBwUmVuZGVyUGFzcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICBwUmVuZGVyUGFzc0JlZ2luLCBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgcFN1YnBhc3NCZWdpbkluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJlZ2luUmVuZGVyUGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICBwUmVuZGVyUGFzc0JlZ2luLCBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgcFN1YnBhc3NCZWdpbkluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgcFJlbmRlclBhc3NCZWdpbiwgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZE5leHRTdWJwYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWROZXh0U3VicGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICBwU3VicGFzc0JlZ2luSW5mbywgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgIHBTdWJwYXNzRW5kSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZE5leHRTdWJwYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEVuZFJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgIHBTdWJwYXNzRW5kSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEVuZFJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpblN0YXR1c0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0U3dhcGNoYWluU3RhdHVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0U3dhcGNoYWluU3RhdHVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qIHBFeHRlcm5hbEZlbmNlSW5mbywgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogcEV4dGVybmFsRmVuY2VJbmZvLCBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogcEV4dGVybmFsRmVuY2VJbmZvLCBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpIHt9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VXaW4zMkhhbmRsZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHBHZXRXaW4zMkhhbmRsZUluZm8sIEhBTkRMRSogcEhhbmRsZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0RmVuY2VXaW4zMkhhbmRsZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHBHZXRXaW4zMkhhbmRsZUluZm8sIEhBTkRMRSogcEhhbmRsZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEZlbmNlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBwR2V0V2luMzJIYW5kbGVJbmZvLCBIQU5ETEUqIHBIYW5kbGUsIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKiBwSW1wb3J0RmVuY2VGZEluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEltcG9ydEZlbmNlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKiBwSW1wb3J0RmVuY2VGZEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRJbXBvcnRGZW5jZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogcEltcG9ydEZlbmNlRmRJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRGZW5jZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRGZW5jZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90KiBwQ291bnRlckNvdW50LCBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogcENvdW50ZXJzLCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiBwQ291bnRlckRlc2NyaXB0aW9ucykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCogcENvdW50ZXJDb3VudCwgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqIHBDb3VudGVycywgVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiogcENvdW50ZXJEZXNjcmlwdGlvbnMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90KiBwQ291bnRlckNvdW50LCBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogcENvdW50ZXJzLCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiBwQ291bnRlckRlc2NyaXB0aW9ucywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sIHVpbnQzMl90KiBwTnVtUGFzc2VzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiogcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLCB1aW50MzJfdCogcE51bVBhc3Nlcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sIHVpbnQzMl90KiBwTnVtUGFzc2VzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqIHBJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiBwSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqIHBJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoVmtEZXZpY2UgZGV2aWNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihWa0RldmljZSBkZXZpY2UpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihWa0RldmljZSBkZXZpY2UpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiogcFN1cmZhY2VDYXBhYmlsaXRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiogcFN1cmZhY2VDYXBhYmlsaXRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIHVpbnQzMl90KiBwU3VyZmFjZUZvcm1hdENvdW50LCBWa1N1cmZhY2VGb3JtYXQyS0hSKiBwU3VyZmFjZUZvcm1hdHMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgdWludDMyX3QqIHBTdXJmYWNlRm9ybWF0Q291bnQsIFZrU3VyZmFjZUZvcm1hdDJLSFIqIHBTdXJmYWNlRm9ybWF0cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgdWludDMyX3QqIHBTdXJmYWNlRm9ybWF0Q291bnQsIFZrU3VyZmFjZUZvcm1hdDJLSFIqIHBTdXJmYWNlRm9ybWF0cywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5UHJvcGVydGllczJLSFIqIHBQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5UHJvcGVydGllczJLSFIqIHBQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqIHBQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiogcFByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiBwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogcERpc3BsYXlQbGFuZUluZm8sIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiogcENhcGFiaWxpdGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKiBwRGlzcGxheVBsYW5lSW5mbywgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBwQ2FwYWJpbGl0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKiBwRGlzcGxheVBsYW5lSW5mbywgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBwQ2FwYWJpbGl0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogcFljYmNyQ29udmVyc2lvbikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogcFljYmNyQ29udmVyc2lvbikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qIHBZY2JjckNvbnZlcnNpb24sIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5MktIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkyS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiBwQmluZEluZm9zLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogcFN1cHBvcnQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHBTdXBwb3J0KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogcFN1cHBvcnQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCB1aW50NjRfdCogcFZhbHVlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIHVpbnQ2NF90KiBwVmFsdWUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIHVpbnQ2NF90KiBwVmFsdWUsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVXYWl0U2VtYXBob3Jlc0tIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqIHBXYWl0SW5mbywgdWludDY0X3QgdGltZW91dCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkV2FpdFNlbWFwaG9yZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiBwV2FpdEluZm8sIHVpbnQ2NF90IHRpbWVvdXQpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRXYWl0U2VtYXBob3Jlc0tIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqIHBXYWl0SW5mbywgdWludDY0X3QgdGltZW91dCwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVNpZ25hbFNlbWFwaG9yZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogcFNpZ25hbEluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFNpZ25hbFNlbWFwaG9yZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogcFNpZ25hbEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRTaWduYWxTZW1hcGhvcmVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqIHBTaWduYWxJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIHBJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8sIFZrRGV2aWNlQWRkcmVzcyByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiogcEluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiogcEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICBwUGlwZWxpbmVJbmZvLCB1aW50MzJfdCogcEV4ZWN1dGFibGVDb3VudCwgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICBwUGlwZWxpbmVJbmZvLCB1aW50MzJfdCogcEV4ZWN1dGFibGVDb3VudCwgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKiAgICAgICAgcFBpcGVsaW5lSW5mbywgdWludDMyX3QqIHBFeGVjdXRhYmxlQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICBwRXhlY3V0YWJsZUluZm8sIHVpbnQzMl90KiBwU3RhdGlzdGljQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiBwU3RhdGlzdGljcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUihWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgcEV4ZWN1dGFibGVJbmZvLCB1aW50MzJfdCogcFN0YXRpc3RpY0NvdW50LCBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogcFN0YXRpc3RpY3MpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICBwRXhlY3V0YWJsZUluZm8sIHVpbnQzMl90KiBwU3RhdGlzdGljQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiBwU3RhdGlzdGljcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICBwRXhlY3V0YWJsZUluZm8sIHVpbnQzMl90KiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LCBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogIHBFeGVjdXRhYmxlSW5mbywgdWludDMyX3QqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogIHBFeGVjdXRhYmxlSW5mbywgdWludDMyX3QqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqIHBDYWxsYmFjaykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqIHBDYWxsYmFjaykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiBwQ2FsbGJhY2ssIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGNhbGxiYWNrLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2ssIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUIGZsYWdzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlLCB1aW50NjRfdCBvYmplY3QsIHNpemVfdCBsb2NhdGlvbiwgaW50MzJfdCBtZXNzYWdlQ29kZSwgY29uc3QgY2hhciogcExheWVyUHJlZml4LCBjb25zdCBjaGFyKiBwTWVzc2FnZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVidWdSZXBvcnRNZXNzYWdlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrRGVidWdSZXBvcnRGbGFnc0VYVCBmbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZSwgdWludDY0X3Qgb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbWVzc2FnZUNvZGUsIGNvbnN0IGNoYXIqIHBMYXllclByZWZpeCwgY29uc3QgY2hhciogcE1lc3NhZ2UpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUIGZsYWdzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlLCB1aW50NjRfdCBvYmplY3QsIHNpemVfdCBsb2NhdGlvbiwgaW50MzJfdCBtZXNzYWdlQ29kZSwgY29uc3QgY2hhciogcExheWVyUHJlZml4LCBjb25zdCBjaGFyKiBwTWVzc2FnZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiBwVGFnSW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogcFRhZ0luZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiBwVGFnSW5mbywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCogcE5hbWVJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqIHBOYW1lSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCogcE5hbWVJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRGVidWdNYXJrZXJCZWdpbkVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqIHBNYXJrZXJJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWREZWJ1Z01hcmtlckJlZ2luRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREZWJ1Z01hcmtlckJlZ2luRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRGVidWdNYXJrZXJFbmRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERlYnVnTWFya2VyRW5kRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJFbmRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiBwTWFya2VySW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiBwTWFya2VySW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZERlYnVnTWFya2VySW5zZXJ0RVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwT2Zmc2V0cywgY29uc3QgVmtEZXZpY2VTaXplKiBwU2l6ZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0QmluZGluZywgdWludDMyX3QgYmluZGluZ0NvdW50LCBjb25zdCBWa0J1ZmZlciogcEJ1ZmZlcnMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcE9mZnNldHMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcFNpemVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwT2Zmc2V0cywgY29uc3QgVmtEZXZpY2VTaXplKiBwU2l6ZXMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RDb3VudGVyQnVmZmVyLCB1aW50MzJfdCBjb3VudGVyQnVmZmVyQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQ291bnRlckJ1ZmZlcnMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcENvdW50ZXJCdWZmZXJPZmZzZXRzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgdWludDMyX3QgY291bnRlckJ1ZmZlckNvdW50LCBjb25zdCBWa0J1ZmZlciogcENvdW50ZXJCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBDb3VudGVyQnVmZmVyT2Zmc2V0cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgdWludDMyX3QgY291bnRlckJ1ZmZlckNvdW50LCBjb25zdCBWa0J1ZmZlciogcENvdW50ZXJCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBDb3VudGVyQnVmZmVyT2Zmc2V0cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksIFZrUXVlcnlDb250cm9sRmxhZ3MgZmxhZ3MsIHVpbnQzMl90IGluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVmtRdWVyeUNvbnRyb2xGbGFncyBmbGFncywgdWludDMyX3QgaW5kZXgpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVmtRdWVyeUNvbnRyb2xGbGFncyBmbGFncywgdWludDMyX3QgaW5kZXgpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCB1aW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCB1aW50MzJfdCBpbmRleCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEVuZFF1ZXJ5SW5kZXhlZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgdWludDMyX3QgaW5kZXgpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlLCBWa0J1ZmZlciBjb3VudGVyQnVmZmVyLCBWa0RldmljZVNpemUgY291bnRlckJ1ZmZlck9mZnNldCwgdWludDMyX3QgY291bnRlck9mZnNldCwgdWludDMyX3QgdmVydGV4U3RyaWRlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIFZrQnVmZmVyIGNvdW50ZXJCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudGVyQnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBjb3VudGVyT2Zmc2V0LCB1aW50MzJfdCB2ZXJ0ZXhTdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIFZrQnVmZmVyIGNvdW50ZXJCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudGVyQnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBjb3VudGVyT2Zmc2V0LCB1aW50MzJfdCB2ZXJ0ZXhTdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBwSW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBwSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlVmlld0hhbmRsZU5WWChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCogcEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50QU1EKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U2hhZGVySW5mb0FNRChWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzaGFkZXJTdGFnZSwgVmtTaGFkZXJJbmZvVHlwZUFNRCBpbmZvVHlwZSwgc2l6ZV90KiBwSW5mb1NpemUsIHZvaWQqIHBJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRTaGFkZXJJbmZvQU1EKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHNoYWRlclN0YWdlLCBWa1NoYWRlckluZm9UeXBlQU1EIGluZm9UeXBlLCBzaXplX3QqIHBJbmZvU2l6ZSwgdm9pZCogcEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRTaGFkZXJJbmZvQU1EKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZSBwaXBlbGluZSwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHNoYWRlclN0YWdlLCBWa1NoYWRlckluZm9UeXBlQU1EIGluZm9UeXBlLCBzaXplX3QqIHBJbmZvU2l6ZSwgdm9pZCogcEluZm8sIFZrUmVzdWx0IHJlc3VsdCkge307CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VUeXBlIHR5cGUsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZSwgVmtJbWFnZUNyZWF0ZUZsYWdzIGZsYWdzLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgZXh0ZXJuYWxIYW5kbGVUeXBlLCBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVR5cGUgdHlwZSwgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBleHRlcm5hbEhhbmRsZVR5cGUsIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViogcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVR5cGUgdHlwZSwgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlLCBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3MsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBleHRlcm5hbEhhbmRsZVR5cGUsIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViogcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeVdpbjMySGFuZGxlTlYoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBoYW5kbGVUeXBlLCBIQU5ETEUqIHBIYW5kbGUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldE1lbW9yeVdpbjMySGFuZGxlTlYoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBoYW5kbGVUeXBlLCBIQU5ETEUqIHBIYW5kbGUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgaGFuZGxlVHlwZSwgSEFORExFKiBwSGFuZGxlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVWaVN1cmZhY2VOTihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlVmlTdXJmYWNlTk4oVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVWaVN1cmZhY2VOTihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNlbmRpZgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQqIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqIHBQcm9jZXNzQ29tbWFuZHNJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRQcm9jZXNzQ29tbWFuZHNOVlgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogcFByb2Nlc3NDb21tYW5kc0luZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRQcm9jZXNzQ29tbWFuZHNOVlgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogcFByb2Nlc3NDb21tYW5kc0luZm8pIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiBwUmVzZXJ2ZVNwYWNlSW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiBwUmVzZXJ2ZVNwYWNlSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogcFJlc2VydmVTcGFjZUluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChWa0RldmljZSBkZXZpY2UsIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKFZrRGV2aWNlIGRldmljZSwgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKFZrRGV2aWNlIGRldmljZSwgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVPYmplY3RUYWJsZU5WWChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa09iamVjdFRhYmxlTlZYKiBwT2JqZWN0VGFibGUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZU9iamVjdFRhYmxlTlZYKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrT2JqZWN0VGFibGVOVlgqIHBPYmplY3RUYWJsZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZU9iamVjdFRhYmxlTlZYKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrT2JqZWN0VGFibGVOVlgqIHBPYmplY3RUYWJsZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lPYmplY3RUYWJsZU5WWChWa0RldmljZSBkZXZpY2UsIFZrT2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveU9iamVjdFRhYmxlTlZYKFZrRGV2aWNlIGRldmljZSwgVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveU9iamVjdFRhYmxlTlZYKFZrRGV2aWNlIGRldmljZSwgVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVJlZ2lzdGVyT2JqZWN0c05WWChWa0RldmljZSBkZXZpY2UsIFZrT2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIHVpbnQzMl90IG9iamVjdENvdW50LCBjb25zdCBWa09iamVjdFRhYmxlRW50cnlOVlgqIGNvbnN0KiAgICBwcE9iamVjdFRhYmxlRW50cmllcywgY29uc3QgdWludDMyX3QqIHBPYmplY3RJbmRpY2VzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRSZWdpc3Rlck9iamVjdHNOVlgoVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgcHBPYmplY3RUYWJsZUVudHJpZXMsIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0SW5kaWNlcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFJlZ2lzdGVyT2JqZWN0c05WWChWa0RldmljZSBkZXZpY2UsIFZrT2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGUsIHVpbnQzMl90IG9iamVjdENvdW50LCBjb25zdCBWa09iamVjdFRhYmxlRW50cnlOVlgqIGNvbnN0KiAgICBwcE9iamVjdFRhYmxlRW50cmllcywgY29uc3QgdWludDMyX3QqIHBPYmplY3RJbmRpY2VzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlVW5yZWdpc3Rlck9iamVjdHNOVlgoVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqIHBPYmplY3RFbnRyeVR5cGVzLCBjb25zdCB1aW50MzJfdCogcE9iamVjdEluZGljZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFVucmVnaXN0ZXJPYmplY3RzTlZYKFZrRGV2aWNlIGRldmljZSwgVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgdWludDMyX3Qgb2JqZWN0Q291bnQsIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiBwT2JqZWN0RW50cnlUeXBlcywgY29uc3QgdWludDMyX3QqIHBPYmplY3RJbmRpY2VzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkVW5yZWdpc3Rlck9iamVjdHNOVlgoVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqIHBPYmplY3RFbnRyeVR5cGVzLCBjb25zdCB1aW50MzJfdCogcE9iamVjdEluZGljZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqIHBGZWF0dXJlcywgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogcExpbWl0cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKiBwRmVhdHVyZXMsIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgqIHBMaW1pdHMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqIHBGZWF0dXJlcywgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogcExpbWl0cykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiBwVmlld3BvcnRXU2NhbGluZ3MpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqIHBWaWV3cG9ydFdTY2FsaW5ncykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqIHBWaWV3cG9ydFdTY2FsaW5ncykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVSZWxlYXNlRGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkUmVsZWFzZURpc3BsYXlFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXkpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRSZWxlYXNlRGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVBY3F1aXJlWGxpYkRpc3BsYXlFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgRGlzcGxheSogZHB5LCBWa0Rpc3BsYXlLSFIgZGlzcGxheSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQWNxdWlyZVhsaWJEaXNwbGF5RVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIERpc3BsYXkqIGRweSwgVmtEaXNwbGF5S0hSIGRpc3BsYXkpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRBY3F1aXJlWGxpYkRpc3BsYXlFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgRGlzcGxheSogZHB5LCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFJhbmRST3V0cHV0RGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5KiBkcHksIFJST3V0cHV0IHJyT3V0cHV0LCBWa0Rpc3BsYXlLSFIqIHBEaXNwbGF5KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgRGlzcGxheSogZHB5LCBSUk91dHB1dCByck91dHB1dCwgVmtEaXNwbGF5S0hSKiBwRGlzcGxheSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFJhbmRST3V0cHV0RGlzcGxheUVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBEaXNwbGF5KiBkcHksIFJST3V0cHV0IHJyT3V0cHV0LCBWa0Rpc3BsYXlLSFIqIHBEaXNwbGF5LCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBwU3VyZmFjZUNhcGFiaWxpdGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogcFN1cmZhY2VDYXBhYmlsaXRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBwU3VyZmFjZUNhcGFiaWxpdGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZURpc3BsYXlQb3dlckNvbnRyb2xFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgY29uc3QgVmtEaXNwbGF5UG93ZXJJbmZvRVhUKiBwRGlzcGxheVBvd2VySW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGlzcGxheVBvd2VyQ29udHJvbEVYVChWa0RldmljZSBkZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqIHBEaXNwbGF5UG93ZXJJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkRGlzcGxheVBvd2VyQ29udHJvbEVYVChWa0RldmljZSBkZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqIHBEaXNwbGF5UG93ZXJJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUmVnaXN0ZXJEZXZpY2VFdmVudEVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiBwRGV2aWNlRXZlbnRJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkUmVnaXN0ZXJEZXZpY2VFdmVudEVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiBwRGV2aWNlRXZlbnRJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogcERldmljZUV2ZW50SW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ZlbmNlKiBwRmVuY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVSZWdpc3RlckRpc3BsYXlFdmVudEVYVChWa0RldmljZSBkZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqIHBEaXNwbGF5RXZlbnRJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiBwRGlzcGxheUV2ZW50SW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ZlbmNlKiBwRmVuY2UpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRSZWdpc3RlckRpc3BsYXlFdmVudEVYVChWa0RldmljZSBkZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqIHBEaXNwbGF5RXZlbnRJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRmVuY2UqIHBGZW5jZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpbkNvdW50ZXJFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCBjb3VudGVyLCB1aW50NjRfdCogcENvdW50ZXJWYWx1ZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0U3dhcGNoYWluQ291bnRlckVYVChWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUIGNvdW50ZXIsIHVpbnQ2NF90KiBwQ291bnRlclZhbHVlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0U3dhcGNoYWluQ291bnRlckVYVChWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUIGNvdW50ZXIsIHVpbnQ2NF90KiBwQ291bnRlclZhbHVlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUqIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUqIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50MzJfdCogcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LCBWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUqIHBQcmVzZW50YXRpb25UaW1pbmdzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50MzJfdCogcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LCBWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUqIHBQcmVzZW50YXRpb25UaW1pbmdzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRShWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCwgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiBwUHJlc2VudGF0aW9uVGltaW5ncywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgdWludDMyX3QgZGlzY2FyZFJlY3RhbmdsZUNvdW50LCBjb25zdCBWa1JlY3QyRCogcERpc2NhcmRSZWN0YW5nbGVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsIHVpbnQzMl90IGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBEaXNjYXJkUmVjdGFuZ2xlcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwgdWludDMyX3QgZGlzY2FyZFJlY3RhbmdsZUNvdW50LCBjb25zdCBWa1JlY3QyRCogcERpc2NhcmRSZWN0YW5nbGVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVNldEhkck1ldGFkYXRhRVhUKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3Qgc3dhcGNoYWluQ291bnQsIGNvbnN0IFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWlucywgY29uc3QgVmtIZHJNZXRhZGF0YUVYVCogcE1ldGFkYXRhKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRTZXRIZHJNZXRhZGF0YUVYVChWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50LCBjb25zdCBWa1N3YXBjaGFpbktIUiogcFN3YXBjaGFpbnMsIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqIHBNZXRhZGF0YSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFNldEhkck1ldGFkYXRhRVhUKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3Qgc3dhcGNoYWluQ291bnQsIGNvbnN0IFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWlucywgY29uc3QgVmtIZHJNZXRhZGF0YUVYVCogcE1ldGFkYXRhKSB7fTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSU9TU3VyZmFjZU1WSyhWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVJT1NTdXJmYWNlTVZLKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVJT1NTdXJmYWNlTVZLKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVNYWNPU1N1cmZhY2VNVksoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVNYWNPU1N1cmZhY2VNVksoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNlbmRpZgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogcE5hbWVJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKiBwTmFtZUluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKiBwTmFtZUluZm8sIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogcFRhZ0luZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiBwVGFnSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiBwVGFnSW5mbywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKFZrUXVldWUgcXVldWUsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKFZrUXVldWUgcXVldWUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKFZrUXVldWUgcXVldWUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVChWa1F1ZXVlIHF1ZXVlKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKFZrUXVldWUgcXVldWUsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVChWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKFZrUXVldWUgcXVldWUsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKiBwTWVzc2VuZ2VyKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogcE1lc3Nlbmdlcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKiBwTWVzc2VuZ2VyLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG1lc3NlbmdlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgbWVzc2VuZ2VyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgbWVzc2VuZ2VyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZVNldmVyaXR5LCBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlcywgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKiBwQ2FsbGJhY2tEYXRhKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBtZXNzYWdlU2V2ZXJpdHksIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgbWVzc2FnZVR5cGVzLCBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBtZXNzYWdlU2V2ZXJpdHksIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgbWVzc2FnZVR5cGVzLCBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEpIHt9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXIsIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqIHBQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRChWa0RldmljZSBkZXZpY2UsIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciwgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRChWa0RldmljZSBkZXZpY2UsIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciwgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlcioqIHBCdWZmZXIpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlcioqIHBCdWZmZXIpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogcEluZm8sIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiBwQnVmZmVyLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogcFNhbXBsZUxvY2F0aW9uc0luZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiBwU2FtcGxlTG9jYXRpb25zSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiBwU2FtcGxlTG9jYXRpb25zSW5mbykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcywgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLCBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogcE11bHRpc2FtcGxlUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzLCBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogcE11bHRpc2FtcGxlUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqIHBQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqIHBQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiBwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2VWaWV3IGltYWdlVmlldywgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3LCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0KSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3LCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKiBwU2hhZGluZ1JhdGVQYWxldHRlcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgc2FtcGxlT3JkZXJUeXBlLCB1aW50MzJfdCBjdXN0b21TYW1wbGVPcmRlckNvdW50LCBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqIHBDdXN0b21TYW1wbGVPcmRlcnMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgc2FtcGxlT3JkZXJUeXBlLCB1aW50MzJfdCBjdXN0b21TYW1wbGVPcmRlckNvdW50LCBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqIHBDdXN0b21TYW1wbGVPcmRlcnMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZSwgdWludDMyX3QgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiBwQ3VzdG9tU2FtcGxlT3JkZXJzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBwQWNjZWxlcmF0aW9uU3RydWN0dXJlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0RldmljZSBkZXZpY2UsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiogcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiogcE1lbW9yeVJlcXVpcmVtZW50cykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBwQmluZEluZm9zKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIHBCaW5kSW5mb3MpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIHBCaW5kSW5mb3MsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogcEluZm8sIFZrQnVmZmVyIGluc3RhbmNlRGF0YSwgVmtEZXZpY2VTaXplIGluc3RhbmNlT2Zmc2V0LCBWa0Jvb2wzMiB1cGRhdGUsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywgVmtCdWZmZXIgc2NyYXRjaCwgVmtEZXZpY2VTaXplIHNjcmF0Y2hPZmZzZXQpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBwSW5mbywgVmtCdWZmZXIgaW5zdGFuY2VEYXRhLCBWa0RldmljZVNpemUgaW5zdGFuY2VPZmZzZXQsIFZrQm9vbDMyIHVwZGF0ZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0J1ZmZlciBzY3JhdGNoLCBWa0RldmljZVNpemUgc2NyYXRjaE9mZnNldCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBwSW5mbywgVmtCdWZmZXIgaW5zdGFuY2VEYXRhLCBWa0RldmljZVNpemUgaW5zdGFuY2VPZmZzZXQsIFZrQm9vbDMyIHVwZGF0ZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0J1ZmZlciBzY3JhdGNoLCBWa0RldmljZVNpemUgc2NyYXRjaE9mZnNldCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIG1vZGUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgbW9kZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgbW9kZSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRUcmFjZVJheXNOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwgVmtCdWZmZXIgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nU3RyaWRlLCBWa0J1ZmZlciBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVmtEZXZpY2VTaXplIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZGVwdGgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFRyYWNlUmF5c05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkZXB0aCkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFRyYWNlUmF5c05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkZXB0aCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IGZpcnN0R3JvdXAsIHVpbnQzMl90IGdyb3VwQ291bnQsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCogcERhdGEpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IGZpcnN0R3JvdXAsIHVpbnQzMl90IGdyb3VwQ291bnQsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCogcERhdGEpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCB1aW50MzJfdCBmaXJzdEdyb3VwLCB1aW50MzJfdCBncm91cENvdW50LCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoVmtEZXZpY2UgZGV2aWNlLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoVmtEZXZpY2UgZGV2aWNlLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgc2l6ZV90IGRhdGFTaXplLCB2b2lkKiBwRGF0YSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCogcERhdGEsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywgVmtRdWVyeVR5cGUgcXVlcnlUeXBlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnkpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCBWa1F1ZXJ5VHlwZSBxdWVyeVR5cGUsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCBWa1F1ZXJ5VHlwZSBxdWVyeVR5cGUsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDb21waWxlRGVmZXJyZWROVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IHNoYWRlcikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ29tcGlsZURlZmVycmVkTlYoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCB1aW50MzJfdCBzaGFkZXIpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDb21waWxlRGVmZXJyZWROVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IHNoYWRlciwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVChWa0RldmljZSBkZXZpY2UsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgY29uc3Qgdm9pZCogcEhvc3RQb2ludGVyLCBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCogcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKFZrRGV2aWNlIGRldmljZSwgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBjb25zdCB2b2lkKiBwSG9zdFBvaW50ZXIsIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKFZrRGV2aWNlIGRldmljZSwgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBjb25zdCB2b2lkKiBwSG9zdFBvaW50ZXIsIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgdWludDMyX3QgbWFya2VyKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCB1aW50MzJfdCBtYXJrZXIpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCB1aW50MzJfdCBtYXJrZXIpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBUaW1lRG9tYWluQ291bnQsIFZrVGltZURvbWFpbkVYVCogcFRpbWVEb21haW5zKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFRpbWVEb21haW5Db3VudCwgVmtUaW1lRG9tYWluRVhUKiBwVGltZURvbWFpbnMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFRpbWVEb21haW5Db3VudCwgVmtUaW1lRG9tYWluRVhUKiBwVGltZURvbWFpbnMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVChWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHRpbWVzdGFtcENvdW50LCBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiBwVGltZXN0YW1wSW5mb3MsIHVpbnQ2NF90KiBwVGltZXN0YW1wcywgdWludDY0X3QqIHBNYXhEZXZpYXRpb24pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZEdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgdGltZXN0YW1wQ291bnQsIGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqIHBUaW1lc3RhbXBJbmZvcywgdWludDY0X3QqIHBUaW1lc3RhbXBzLCB1aW50NjRfdCogcE1heERldmlhdGlvbikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgdGltZXN0YW1wQ291bnQsIGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqIHBUaW1lc3RhbXBJbmZvcywgdWludDY0X3QqIHBUaW1lc3RhbXBzLCB1aW50NjRfdCogcE1heERldmlhdGlvbiwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdGFza0NvdW50LCB1aW50MzJfdCBmaXJzdFRhc2spIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdGFza0NvdW50LCB1aW50MzJfdCBmaXJzdFRhc2spIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHRhc2tDb3VudCwgdWludDMyX3QgZmlyc3RUYXNrKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RFeGNsdXNpdmVTY2lzc29yLCB1aW50MzJfdCBleGNsdXNpdmVTY2lzc29yQ291bnQsIGNvbnN0IFZrUmVjdDJEKiBwRXhjbHVzaXZlU2Npc3NvcnMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RFeGNsdXNpdmVTY2lzc29yLCB1aW50MzJfdCBleGNsdXNpdmVTY2lzc29yQ291bnQsIGNvbnN0IFZrUmVjdDJEKiBwRXhjbHVzaXZlU2Npc3NvcnMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgdWludDMyX3QgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcEV4Y2x1c2l2ZVNjaXNzb3JzKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldENoZWNrcG9pbnROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3Qgdm9pZCogcENoZWNrcG9pbnRNYXJrZXIpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldENoZWNrcG9pbnROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3Qgdm9pZCogcENoZWNrcG9pbnRNYXJrZXIpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRDaGVja3BvaW50TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IHZvaWQqIHBDaGVja3BvaW50TWFya2VyKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFF1ZXVlQ2hlY2twb2ludERhdGFOVihWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCogcENoZWNrcG9pbnREYXRhQ291bnQsIFZrQ2hlY2twb2ludERhdGFOViogcENoZWNrcG9pbnREYXRhKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3QqIHBDaGVja3BvaW50RGF0YUNvdW50LCBWa0NoZWNrcG9pbnREYXRhTlYqIHBDaGVja3BvaW50RGF0YSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFF1ZXVlQ2hlY2twb2ludERhdGFOVihWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCogcENoZWNrcG9pbnREYXRhQ291bnQsIFZrQ2hlY2twb2ludERhdGFOViogcENoZWNrcG9pbnREYXRhKSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqIHBJbml0aWFsaXplSW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogcEluaXRpYWxpemVJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogcEluaXRpYWxpemVJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTChWa0RldmljZSBkZXZpY2UpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoVmtEZXZpY2UgZGV2aWNlKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTChWa0RldmljZSBkZXZpY2UpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqIHBNYXJrZXJJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8sIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBwTWFya2VySW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBwTWFya2VySW5mbywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiBwT3ZlcnJpZGVJbmZvKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogcE92ZXJyaWRlSW5mbykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiBwT3ZlcnJpZGVJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwqIHBDb25maWd1cmF0aW9uKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHBBY3F1aXJlSW5mbywgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogcENvbmZpZ3VyYXRpb24pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHBBY3F1aXJlSW5mbywgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogcENvbmZpZ3VyYXRpb24sIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoVmtEZXZpY2UgZGV2aWNlLCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbmZpZ3VyYXRpb24pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChWa0RldmljZSBkZXZpY2UsIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uZmlndXJhdGlvbikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChWa0RldmljZSBkZXZpY2UsIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uZmlndXJhdGlvbiwgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoVmtRdWV1ZSBxdWV1ZSwgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKFZrUXVldWUgcXVldWUsIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uZmlndXJhdGlvbikge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoVmtRdWV1ZSBxdWV1ZSwgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTChWa0RldmljZSBkZXZpY2UsIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgcGFyYW1ldGVyLCBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCogcFZhbHVlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKFZrRGV2aWNlIGRldmljZSwgVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCBwYXJhbWV0ZXIsIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiBwVmFsdWUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKFZrRGV2aWNlIGRldmljZSwgVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCBwYXJhbWV0ZXIsIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiBwVmFsdWUsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVTZXRMb2NhbERpbW1pbmdBTUQoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwQ2hhaW4sIFZrQm9vbDMyIGxvY2FsRGltbWluZ0VuYWJsZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkU2V0TG9jYWxEaW1taW5nQU1EKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcENoYWluLCBWa0Jvb2wzMiBsb2NhbERpbW1pbmdFbmFibGUpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRTZXRMb2NhbERpbW1pbmdBTUQoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwQ2hhaW4sIFZrQm9vbDMyIGxvY2FsRGltbWluZ0VuYWJsZSkge307CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZU1ldGFsU3VyZmFjZUVYVChWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIHBJbmZvKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIHBJbmZvLCBWa0RldmljZUFkZHJlc3MgcmVzdWx0KSB7fTsKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBUb29sQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogcFRvb2xQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwVG9vbENvdW50LCBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQqIHBUb29sUHJvcGVydGllcykge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBUb29sQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogcFRvb2xQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqIHBQcm9wZXJ0aWVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogcFByb3BlcnRpZXMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwUHJvcGVydHlDb3VudCwgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBDb21iaW5hdGlvbkNvdW50LCBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogcENvbWJpbmF0aW9ucykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90KiBwQ29tYmluYXRpb25Db3VudCwgVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqIHBDb21iaW5hdGlvbnMpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBDb21iaW5hdGlvbkNvdW50LCBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogcENvbWJpbmF0aW9ucywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgdWludDMyX3QqIHBQcmVzZW50TW9kZUNvdW50LCBWa1ByZXNlbnRNb2RlS0hSKiBwUHJlc2VudE1vZGVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgdWludDMyX3QqIHBQcmVzZW50TW9kZUNvdW50LCBWa1ByZXNlbnRNb2RlS0hSKiBwUHJlc2VudE1vZGVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBwU3VyZmFjZUluZm8sIHVpbnQzMl90KiBwUHJlc2VudE1vZGVDb3VudCwgVmtQcmVzZW50TW9kZUtIUiogcFByZXNlbnRNb2RlcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgdmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZUFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBWa1Jlc3VsdCByZXN1bHQpIHt9OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIFZrUmVzdWx0IHJlc3VsdCkge307CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLCBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogcE1vZGVzKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLCBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogcE1vZGVzKSB7fTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcywgVmtSZXN1bHQgcmVzdWx0KSB7fTsKKyNlbmRpZgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSkge307CisgICAgICAgIHZpcnR1YWwgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVChWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UsIFZrUmVzdWx0IHJlc3VsdCkge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRMaW5lU3RpcHBsZUVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgbGluZVN0aXBwbGVGYWN0b3IsIHVpbnQxNl90IGxpbmVTdGlwcGxlUGF0dGVybikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVN0aXBwbGVFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGxpbmVTdGlwcGxlRmFjdG9yLCB1aW50MTZfdCBsaW5lU3RpcHBsZVBhdHRlcm4pIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRMaW5lU3RpcHBsZUVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgbGluZVN0aXBwbGVGYWN0b3IsIHVpbnQxNl90IGxpbmVTdGlwcGxlUGF0dGVybikge307CisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVSZXNldFF1ZXJ5UG9vbEVYVChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkUmVzZXRRdWVyeVBvb2xFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQpIHt9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRSZXNldFF1ZXJ5UG9vbEVYVChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkge307CisKKyAgICAgICAgdmlydHVhbCBWa1Jlc3VsdCBDb3JlTGF5ZXJDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiBwVmFsaWRhdGlvbkNhY2hlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgQ29yZUxheWVyRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVChWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBWa1Jlc3VsdCBDb3JlTGF5ZXJNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCBkc3RDYWNoZSwgdWludDMyX3Qgc3JjQ2FjaGVDb3VudCwgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqIHBTcmNDYWNoZXMpICB7IHJldHVybiBWS19TVUNDRVNTOyB9OworICAgICAgICB2aXJ0dWFsIFZrUmVzdWx0IENvcmVMYXllckdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGUsIHNpemVfdCogcERhdGFTaXplLCB2b2lkKiBwRGF0YSkgIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisKKyAgICAgICAgLy8gQWxsb3cgYWRkaXRpb25hbCBzdGF0ZSBwYXJhbWV0ZXIgZm9yIENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCB2b2lkKiBjZ3BsX3N0YXRlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyk7CisgICAgICAgIH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywgdm9pZCogY2dwbF9zdGF0ZSkgeworICAgICAgICAgICAgUHJlQ2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCBWa1Jlc3VsdCByZXN1bHQsIHZvaWQqIGNncGxfc3RhdGUpIHsKKyAgICAgICAgICAgIFBvc3RDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgcmVzdWx0KTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBBbGxvdyBhZGRpdGlvbmFsIHN0YXRlIHBhcmFtZXRlciBmb3IgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsIHZvaWQqIHBpcGVfc3RhdGUpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBQcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCB2b2lkKiBjY3BsX3N0YXRlKSB7CisgICAgICAgICAgICBQcmVDYWxsUmVjb3JkQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICAgICAgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsIFZrUmVzdWx0IHJlc3VsdCwgdm9pZCogcGlwZV9zdGF0ZSkgeworICAgICAgICAgICAgUG9zdENhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIHJlc3VsdCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWxsb3cgYWRkaXRpb25hbCBzdGF0ZSBwYXJhbWV0ZXIgZm9yIENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCB2b2lkKiBwaXBlX3N0YXRlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywgdm9pZCogY2NwbF9zdGF0ZSkgeworICAgICAgICAgICAgUHJlQ2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICAgICAgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCBWa1Jlc3VsdCByZXN1bHQsIHZvaWQqIHBpcGVfc3RhdGUpIHsKKyAgICAgICAgICAgIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIHJlc3VsdCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWxsb3cgbW9kaWZpY2F0aW9uIG9mIGEgZG93bi1jaGFpbiBwYXJhbWV0ZXIgZm9yIENyZWF0ZVBpcGVsaW5lTGF5b3V0CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZUxheW91dCogcFBpcGVsaW5lTGF5b3V0LCB2b2lkICpjcGxfc3RhdGUpIHsKKyAgICAgICAgICAgIFByZUNhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVMYXlvdXQpOworICAgICAgICB9OworCisgICAgICAgIC8vIEVuYWJsZSB0aGUgQ3JlYXRlU2hhZGVyTW9kdWxlIEFQSSB0byB0YWtlIGFuIGV4dHJhIGFyZ3VtZW50IGZvciBzdGF0ZSBwcmVzZXJ2YXRpb24gYW5kIHBhcmFtdGVyIG1vZGlmaWNhdGlvbgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhZGVyTW9kdWxlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSwgdm9pZCogY3NtX3N0YXRlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTaGFkZXJNb2R1bGUqIHBTaGFkZXJNb2R1bGUsIHZvaWQqIGNzbV9zdGF0ZSkgeworICAgICAgICAgICAgUHJlQ2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2hhZGVyTW9kdWxlKTsKKyAgICAgICAgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2hhZGVyTW9kdWxlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSwgVmtSZXN1bHQgcmVzdWx0LCB2b2lkKiBjc21fc3RhdGUpIHsKKyAgICAgICAgICAgIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUsIHJlc3VsdCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWxsb3cgQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyB0byB1c2Ugc29tZSBsb2NhbCBzdGFjayBzdG9yYWdlIGZvciBwZXJmb3JtYW5jZSBwdXJwb3NlcworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIHZvaWQqIGFkc19zdGF0ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFByZUNhbGxWYWxpZGF0ZUFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgVmtSZXN1bHQgcmVzdWx0LCB2b2lkKiBhZHNfc3RhdGUpICB7CisgICAgICAgICAgICBQb3N0Q2FsbFJlY29yZEFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMsIHJlc3VsdCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWxsb3cgbW9kaWZpY2F0aW9uIG9mIGEgZG93bi1jaGFpbiBwYXJhbWV0ZXIgZm9yIENyZWF0ZUJ1ZmZlcgorICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtCdWZmZXIqIHBCdWZmZXIsIHZvaWQgKmNiX3N0YXRlKSB7CisgICAgICAgICAgICBQcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIpOworICAgICAgICB9OworCisgICAgICAgIC8vIE1vZGlmeSBhIHBhcmFtZXRlciB0byBDcmVhdGVEZXZpY2UKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZSogcERldmljZSwgc2FmZV9Wa0RldmljZUNyZWF0ZUluZm8gKm1vZGlmaWVkX2NyZWF0ZV9pbmZvKSB7CisgICAgICAgICAgICBQcmVDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKHBoeXNpY2FsRGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSk7CisgICAgICAgIH07Cit9OworCitleHRlcm4gc21hbGxfdW5vcmRlcmVkX21hcDx2b2lkKiwgVmFsaWRhdGlvbk9iamVjdCosIDI+IGxheWVyX2RhdGFfbWFwOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9jb21tYW5kX2NvdW50ZXJfaGVscGVyLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvY29tbWFuZF9jb3VudGVyX2hlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2NGUyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvY29tbWFuZF9jb3VudGVyX2hlbHBlci5jcHAKQEAgLTAsMCArMSwzMDggQEAKKy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqCisvLyBTZWUgY29tbWFuZF9jb3VudGVyX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE5ICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlICJjaGFzc2lzLmgiCisjaW5jbHVkZSAic3RhdGVfdHJhY2tlci5oIgorI2luY2x1ZGUgImNvbW1hbmRfY291bnRlci5oIgorCit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmluZFBpcGVsaW5lKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lIHBpcGVsaW5lKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFNldFZpZXdwb3J0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWa1ZpZXdwb3J0KiBwVmlld3BvcnRzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFNldFNjaXNzb3IoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0U2Npc3NvciwgdWludDMyX3Qgc2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcFNjaXNzb3JzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFNldExpbmVXaWR0aChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbGluZVdpZHRoKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFNldERlcHRoQmlhcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsIGZsb2F0IGRlcHRoQmlhc0NsYW1wLCBmbG9hdCBkZXB0aEJpYXNTbG9wZUZhY3RvcikgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRCbGVuZENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgZmxvYXQgYmxlbmRDb25zdGFudHNbNF0pIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0RGVwdGhCb3VuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IG1pbkRlcHRoQm91bmRzLCBmbG9hdCBtYXhEZXB0aEJvdW5kcykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3QgY29tcGFyZU1hc2spIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFdyaXRlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCB3cml0ZU1hc2spIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFJlZmVyZW5jZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCByZWZlcmVuY2UpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmluZERlc2NyaXB0b3JTZXRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3QgZmlyc3RTZXQsIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIHVpbnQzMl90IGR5bmFtaWNPZmZzZXRDb3VudCwgY29uc3QgdWludDMyX3QqIHBEeW5hbWljT2Zmc2V0cykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRCaW5kSW5kZXhCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtJbmRleFR5cGUgaW5kZXhUeXBlKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZEJpbmRWZXJ0ZXhCdWZmZXJzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdEJpbmRpbmcsIHVpbnQzMl90IGJpbmRpbmdDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBPZmZzZXRzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZERyYXcoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHZlcnRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdFZlcnRleCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgaW5kZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgZHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kRGlzcGF0Y2goVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kRGlzcGF0Y2hJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0KSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZENvcHlCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJDb3B5KiBwUmVnaW9ucykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSogcFJlZ2lvbnMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmxpdEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZUJsaXQqIHBSZWdpb25zLCBWa0ZpbHRlciBmaWx0ZXIpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlclRvSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2VUb0J1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFVwZGF0ZUJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgZGF0YVNpemUsIGNvbnN0IHZvaWQqIHBEYXRhKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZEZpbGxCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsIHVpbnQzMl90IGRhdGEpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQ2xlYXJDb2xvckltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSogcENvbG9yLCB1aW50MzJfdCByYW5nZUNvdW50LCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogcFJhbmdlcykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqIHBEZXB0aFN0ZW5jaWwsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZENsZWFyQXR0YWNobWVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudCwgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqIHBBdHRhY2htZW50cywgdWludDMyX3QgcmVjdENvdW50LCBjb25zdCBWa0NsZWFyUmVjdCogcFJlY3RzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFJlc29sdmVJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiBwUmVnaW9ucykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFJlc2V0RXZlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRXZlbnQgZXZlbnQsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzaykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRXYWl0RXZlbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRQaXBlbGluZUJhcnJpZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBWa0RlcGVuZGVuY3lGbGFncyBkZXBlbmRlbmN5RmxhZ3MsIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBwQnVmZmVyTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5RdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVmtRdWVyeUNvbnRyb2xGbGFncyBmbGFncykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRFbmRRdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSkgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRSZXNldFF1ZXJ5UG9vbChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50KSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFdyaXRlVGltZXN0YW1wKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyBwaXBlbGluZVN0YWdlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5KSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIHN0cmlkZSwgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFB1c2hDb25zdGFudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCBWa1NoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFncywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLCBjb25zdCB2b2lkKiBwVmFsdWVzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZEJlZ2luUmVuZGVyUGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiBwUmVuZGVyUGFzc0JlZ2luLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWROZXh0U3VicGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRFeGVjdXRlQ29tbWFuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwgY29uc3QgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0RGV2aWNlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzaykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEJhc2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0RGV2aWNlTWFza0tIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZGV2aWNlTWFzaykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEJhc2VLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LCBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgY29uc3Qgdm9pZCogcERhdGEpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgIHBSZW5kZXJQYXNzQmVnaW4sIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICBwU3VicGFzc0JlZ2luSW5mbykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWROZXh0U3VicGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICBwU3VicGFzc0JlZ2luSW5mbywgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgIHBTdWJwYXNzRW5kSW5mbykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgIHBTdWJwYXNzRW5kSW5mbykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RDb3VudEtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJCZWdpbkVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqIHBNYXJrZXJJbmZvKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZERlYnVnTWFya2VyRW5kRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZERlYnVnTWFya2VySW5zZXJ0RVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8pIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwT2Zmc2V0cywgY29uc3QgVmtEZXZpY2VTaXplKiBwU2l6ZXMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RDb3VudGVyQnVmZmVyLCB1aW50MzJfdCBjb3VudGVyQnVmZmVyQ291bnQsIGNvbnN0IFZrQnVmZmVyKiBwQ291bnRlckJ1ZmZlcnMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcENvdW50ZXJCdWZmZXJPZmZzZXRzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnksIFZrUXVlcnlDb250cm9sRmxhZ3MgZmxhZ3MsIHVpbnQzMl90IGluZGV4KSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZEVuZFF1ZXJ5SW5kZXhlZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgdWludDMyX3QgaW5kZXgpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlLCBWa0J1ZmZlciBjb3VudGVyQnVmZmVyLCBWa0RldmljZVNpemUgY291bnRlckJ1ZmZlck9mZnNldCwgdWludDMyX3QgY291bnRlck9mZnNldCwgdWludDMyX3QgdmVydGV4U3RyaWRlKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50QU1EKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbikgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRQcm9jZXNzQ29tbWFuZHNOVlgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogcFByb2Nlc3NDb21tYW5kc0luZm8pIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiBwUmVzZXJ2ZVNwYWNlSW5mbykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiBwVmlld3BvcnRXU2NhbGluZ3MpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLCB1aW50MzJfdCBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsIGNvbnN0IFZrUmVjdDJEKiBwRGlzY2FyZFJlY3RhbmdsZXMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZEVuZERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiBwU2FtcGxlTG9jYXRpb25zSW5mbykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogcFNoYWRpbmdSYXRlUGFsZXR0ZXMpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViBzYW1wbGVPcmRlclR5cGUsIHVpbnQzMl90IGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsIGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogcEN1c3RvbVNhbXBsZU9yZGVycykgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogcEluZm8sIFZrQnVmZmVyIGluc3RhbmNlRGF0YSwgVmtEZXZpY2VTaXplIGluc3RhbmNlT2Zmc2V0LCBWa0Jvb2wzMiB1cGRhdGUsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywgVmtCdWZmZXIgc2NyYXRjaCwgVmtEZXZpY2VTaXplIHNjcmF0Y2hPZmZzZXQpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsIFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViBtb2RlKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFRyYWNlUmF5c05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkZXB0aCkgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywgVmtRdWVyeVR5cGUgcXVlcnlUeXBlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnkpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgdWludDMyX3QgbWFya2VyKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdGFza0NvdW50LCB1aW50MzJfdCBmaXJzdFRhc2spIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgZHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeworICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudChjb21tYW5kQnVmZmVyKTsKK30KK3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgdWludDMyX3QgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcEV4Y2x1c2l2ZVNjaXNzb3JzKSB7CisgICAgY29yZUNoZWNrcy0+SW5jcmVtZW50Q29tbWFuZENvdW50KGNvbW1hbmRCdWZmZXIpOworfQordm9pZCBDb21tYW5kQ291bnRlcjo6UHJlQ2FsbFJlY29yZENtZFNldENoZWNrcG9pbnROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3Qgdm9pZCogcENoZWNrcG9pbnRNYXJrZXIpIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8pIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8pIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqIHBPdmVycmlkZUluZm8pIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9Cit2b2lkIENvbW1hbmRDb3VudGVyOjpQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVN0aXBwbGVFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGxpbmVTdGlwcGxlRmFjdG9yLCB1aW50MTZfdCBsaW5lU3RpcHBsZVBhdHRlcm4pIHsKKyAgICBjb3JlQ2hlY2tzLT5JbmNyZW1lbnRDb21tYW5kQ291bnQoY29tbWFuZEJ1ZmZlcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL2NvbW1hbmRfY291bnRlcl9oZWxwZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvY29tbWFuZF9jb3VudGVyX2hlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmQyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL2NvbW1hbmRfY291bnRlcl9oZWxwZXIuaApAQCAtMCwwICsxLDExOSBAQAorI3ByYWdtYSBvbmNlCisvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKgorLy8gU2VlIGNvbW1hbmRfY291bnRlcl9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMKKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxOSAgICAgIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IExpb25lbCBMYW5kd2VybGluIDxsaW9uZWwuZy5sYW5kd2VybGluQGludGVsLmNvbT4KKyAqLworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRCaW5kUGlwZWxpbmUoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmUgcGlwZWxpbmUpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0Vmlld3BvcnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnQqIHBWaWV3cG9ydHMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0U2Npc3NvcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RTY2lzc29yLCB1aW50MzJfdCBzY2lzc29yQ291bnQsIGNvbnN0IFZrUmVjdDJEKiBwU2Npc3NvcnMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVdpZHRoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBsaW5lV2lkdGgpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RGVwdGhCaWFzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZmxvYXQgZGVwdGhCaWFzQ2xhbXAsIGZsb2F0IGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldEJsZW5kQ29uc3RhbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBmbG9hdCBibGVuZENvbnN0YW50c1s0XSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXREZXB0aEJvdW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbWluRGVwdGhCb3VuZHMsIGZsb2F0IG1heERlcHRoQm91bmRzKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCBjb21wYXJlTWFzayk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHdyaXRlTWFzayk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHJlZmVyZW5jZSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRCaW5kRGVzY3JpcHRvclNldHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LCBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgdWludDMyX3QgZHluYW1pY09mZnNldENvdW50LCBjb25zdCB1aW50MzJfdCogcER5bmFtaWNPZmZzZXRzKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmRJbmRleEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0luZGV4VHlwZSBpbmRleFR5cGUpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQmluZFZlcnRleEJ1ZmZlcnMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0QmluZGluZywgdWludDMyX3QgYmluZGluZ0NvdW50LCBjb25zdCBWa0J1ZmZlciogcEJ1ZmZlcnMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcE9mZnNldHMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhdyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdmVydGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgZHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWREaXNwYXRjaChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLCB1aW50MzJfdCBncm91cENvdW50Wik7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckNvcHkqIHBSZWdpb25zKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VDb3B5KiBwUmVnaW9ucyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRCbGl0SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQmxpdCogcFJlZ2lvbnMsIFZrRmlsdGVyIGZpbHRlcik7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5QnVmZmVyVG9JbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlJbWFnZVRvQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0J1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogcFJlZ2lvbnMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kVXBkYXRlQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBkYXRhU2l6ZSwgY29uc3Qgdm9pZCogcERhdGEpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRmlsbEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgdWludDMyX3QgZGF0YSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRDbGVhckNvbG9ySW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiBwQ29sb3IsIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSogcERlcHRoU3RlbmNpbCwgdWludDMyX3QgcmFuZ2VDb3VudCwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqIHBSYW5nZXMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQ2xlYXJBdHRhY2htZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYXR0YWNobWVudENvdW50LCBjb25zdCBWa0NsZWFyQXR0YWNobWVudCogcEF0dGFjaG1lbnRzLCB1aW50MzJfdCByZWN0Q291bnQsIGNvbnN0IFZrQ2xlYXJSZWN0KiBwUmVjdHMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kUmVzb2x2ZUltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZVJlc29sdmUqIHBSZWdpb25zKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kUmVzZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFdhaXRFdmVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZrRXZlbnQqIHBFdmVudHMsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciogcE1lbW9yeUJhcnJpZXJzLCB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFBpcGVsaW5lQmFycmllcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZrRGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFncywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEVuZFF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5KTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFJlc2V0UXVlcnlQb29sKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kV3JpdGVUaW1lc3RhbXAoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgcXVlcnkpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc3RyaWRlLCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kUHVzaENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIFZrU2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUsIGNvbnN0IHZvaWQqIHBWYWx1ZXMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIHBSZW5kZXJQYXNzQmVnaW4sIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZE5leHRTdWJwYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEV4ZWN1dGVDb21tYW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXREZXZpY2VNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBkZXZpY2VNYXNrKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERpc3BhdGNoQmFzZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYmFzZUdyb3VwWCwgdWludDMyX3QgYmFzZUdyb3VwWSwgdWludDMyX3QgYmFzZUdyb3VwWiwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLCB1aW50MzJfdCBncm91cENvdW50Wik7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXREZXZpY2VNYXNrS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBkZXZpY2VNYXNrKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERpc3BhdGNoQmFzZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYmFzZUdyb3VwWCwgdWludDMyX3QgYmFzZUdyb3VwWSwgdWludDMyX3QgYmFzZUdyb3VwWiwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLCB1aW50MzJfdCBncm91cENvdW50Wik7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRQdXNoRGVzY3JpcHRvclNldEtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvcldyaXRlcyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCBjb25zdCB2b2lkKiBwRGF0YSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgcFJlbmRlclBhc3NCZWdpbiwgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZE5leHRTdWJwYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEVuZFJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWREZWJ1Z01hcmtlckJlZ2luRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8pOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJFbmRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiBwTWFya2VySW5mbyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdEJpbmRpbmcsIHVpbnQzMl90IGJpbmRpbmdDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBPZmZzZXRzLCBjb25zdCBWa0RldmljZVNpemUqIHBTaXplcyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Q291bnRlckJ1ZmZlciwgdWludDMyX3QgY291bnRlckJ1ZmZlckNvdW50LCBjb25zdCBWa0J1ZmZlciogcENvdW50ZXJCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgVmtRdWVyeUNvbnRyb2xGbGFncyBmbGFncywgdWludDMyX3QgaW5kZXgpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCB1aW50MzJfdCBpbmRleCk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIFZrQnVmZmVyIGNvdW50ZXJCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudGVyQnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBjb3VudGVyT2Zmc2V0LCB1aW50MzJfdCB2ZXJ0ZXhTdHJpZGUpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQqIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFByb2Nlc3NDb21tYW5kc05WWChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqIHBSZXNlcnZlU3BhY2VJbmZvKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqIHBWaWV3cG9ydFdTY2FsaW5ncyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsIHVpbnQzMl90IGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBEaXNjYXJkUmVjdGFuZ2xlcyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqIHBTYW1wbGVMb2NhdGlvbnNJbmZvKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2VWaWV3IGltYWdlVmlldywgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKiBwU2hhZGluZ1JhdGVQYWxldHRlcyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZSwgdWludDMyX3QgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiBwQ3VzdG9tU2FtcGxlT3JkZXJzKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBwSW5mbywgVmtCdWZmZXIgaW5zdGFuY2VEYXRhLCBWa0RldmljZVNpemUgaW5zdGFuY2VPZmZzZXQsIFZrQm9vbDMyIHVwZGF0ZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0J1ZmZlciBzY3JhdGNoLCBWa0RldmljZVNpemUgc2NyYXRjaE9mZnNldCk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIG1vZGUpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kVHJhY2VSYXlzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVmtEZXZpY2VTaXplIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIFZrQnVmZmVyIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLCBWa0J1ZmZlciBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGRlcHRoKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCBWa1F1ZXJ5VHlwZSBxdWVyeVR5cGUsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCB1aW50MzJfdCBtYXJrZXIpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB0YXNrQ291bnQsIHVpbnQzMl90IGZpcnN0VGFzayk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RFeGNsdXNpdmVTY2lzc29yLCB1aW50MzJfdCBleGNsdXNpdmVTY2lzc29yQ291bnQsIGNvbnN0IFZrUmVjdDJEKiBwRXhjbHVzaXZlU2Npc3NvcnMpOwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0Q2hlY2twb2ludE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCB2b2lkKiBwQ2hlY2twb2ludE1hcmtlcik7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiBwTWFya2VySW5mbyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBwTWFya2VySW5mbyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogcE92ZXJyaWRlSW5mbyk7Cit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRMaW5lU3RpcHBsZUVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgbGluZVN0aXBwbGVGYWN0b3IsIHVpbnQxNl90IGxpbmVTdGlwcGxlUGF0dGVybik7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL2xheWVyX2NoYXNzaXNfZGlzcGF0Y2guY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9sYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzNlMjNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9sYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmNwcApAQCAtMCwwICsxLDY5ODcgQEAKKworLy8gVGhpcyBmaWxlIGlzICoqKkdFTkVSQVRFRCoqKi4gIERvIE5vdCBFZGl0LgorLy8gU2VlIGxheWVyX2NoYXNzaXNfZGlzcGF0Y2hfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zLgorCisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlICJjaGFzc2lzLmgiCisjaW5jbHVkZSAibGF5ZXJfY2hhc3Npc19kaXNwYXRjaC5oIgorI2luY2x1ZGUgInZrX2xheWVyX3V0aWxzLmgiCisKKy8vIFRoaXMgaW50ZW50aW9uYWxseSBpbmNsdWRlcyBhIGNwcCBmaWxlCisjaW5jbHVkZSAidmtfc2FmZV9zdHJ1Y3QuY3BwIgorCitSZWFkV3JpdGVMb2NrIGRpc3BhdGNoX2xvY2s7CisKKy8vIFVuaXF1ZSBPYmplY3RzIHBOZXh0IGV4dGVuc2lvbiBoYW5kbGluZyBmdW5jdGlvbgordm9pZCBXcmFwUG5leHRDaGFpbkhhbmRsZXMoVmFsaWRhdGlvbk9iamVjdCAqbGF5ZXJfZGF0YSwgY29uc3Qgdm9pZCAqcE5leHQpIHsKKyAgICB2b2lkICpjdXJfcG5leHQgPSBjb25zdF9jYXN0PHZvaWQgKj4ocE5leHQpOworICAgIHdoaWxlIChjdXJfcG5leHQgIT0gTlVMTCkgeworICAgICAgICBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtCYXNlT3V0U3RydWN0dXJlICo+KGN1cl9wbmV4dCk7CisKKyAgICAgICAgc3dpdGNoIChoZWFkZXItPnNUeXBlKSB7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiAKKyAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fS0hSOiB7CisgICAgICAgICAgICAgICAgICAgIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIgKnNhZmVfc3RydWN0ID0gcmVpbnRlcnByZXRfY2FzdDxzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSICo+KGN1cl9wbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYWZlX3N0cnVjdC0+cEFjcXVpcmVTeW5jcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBzYWZlX3N0cnVjdC0+YWNxdWlyZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0LT5wQWNxdWlyZVN5bmNzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5VbndyYXAoc2FmZV9zdHJ1Y3QtPnBBY3F1aXJlU3luY3NbaW5kZXgwXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhZmVfc3RydWN0LT5wUmVsZWFzZVN5bmNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IHNhZmVfc3RydWN0LT5yZWxlYXNlQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3QtPnBSZWxlYXNlU3luY3NbaW5kZXgwXSA9IGxheWVyX2RhdGEtPlVud3JhcChzYWZlX3N0cnVjdC0+cFJlbGVhc2VTeW5jc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUiAKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgCisgICAgICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WOiB7CisgICAgICAgICAgICAgICAgICAgIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViAqc2FmZV9zdHJ1Y3QgPSByZWludGVycHJldF9jYXN0PHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViAqPihjdXJfcG5leHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2FmZV9zdHJ1Y3QtPnBBY3F1aXJlU3luY3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgc2FmZV9zdHJ1Y3QtPmFjcXVpcmVDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdC0+cEFjcXVpcmVTeW5jc1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+VW53cmFwKHNhZmVfc3RydWN0LT5wQWNxdWlyZVN5bmNzW2luZGV4MF0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzYWZlX3N0cnVjdC0+cFJlbGVhc2VTeW5jcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBzYWZlX3N0cnVjdC0+cmVsZWFzZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0LT5wUmVsZWFzZVN5bmNzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5VbndyYXAoc2FmZV9zdHJ1Y3QtPnBSZWxlYXNlU3luY3NbaW5kZXgwXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIgCisKKyAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY6IHsKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViAqc2FmZV9zdHJ1Y3QgPSByZWludGVycHJldF9jYXN0PHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgKj4oY3VyX3BuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhZmVfc3RydWN0LT5pbWFnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3QtPmltYWdlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHNhZmVfc3RydWN0LT5pbWFnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhZmVfc3RydWN0LT5idWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0LT5idWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoc2FmZV9zdHJ1Y3QtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfQUxMT0NBVEVfSU5GTzogeworICAgICAgICAgICAgICAgICAgICBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICpzYWZlX3N0cnVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2FmZV9Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyAqPihjdXJfcG5leHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2FmZV9zdHJ1Y3QtPmltYWdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdC0+aW1hZ2UgPSBsYXllcl9kYXRhLT5VbndyYXAoc2FmZV9zdHJ1Y3QtPmltYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2FmZV9zdHJ1Y3QtPmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3QtPmJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChzYWZlX3N0cnVjdC0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUjogeworICAgICAgICAgICAgICAgICAgICBzYWZlX1ZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpzYWZlX3N0cnVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2FmZV9Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqPihjdXJfcG5leHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2FmZV9zdHJ1Y3QtPnN3YXBjaGFpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3QtPnN3YXBjaGFpbiA9IGxheWVyX2RhdGEtPlVud3JhcChzYWZlX3N0cnVjdC0+c3dhcGNoYWluKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk86IHsKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvICpzYWZlX3N0cnVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvICo+KGN1cl9wbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYWZlX3N0cnVjdC0+Y29udmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3QtPmNvbnZlcnNpb24gPSBsYXllcl9kYXRhLT5VbndyYXAoc2FmZV9zdHJ1Y3QtPmNvbnZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX1ZBTElEQVRJT05fQ0FDSEVfQ1JFQVRFX0lORk9fRVhUOiB7CisgICAgICAgICAgICAgICAgICAgIHNhZmVfVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUICpzYWZlX3N0cnVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2FmZV9Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgKj4oY3VyX3BuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhZmVfc3RydWN0LT52YWxpZGF0aW9uQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0LT52YWxpZGF0aW9uQ2FjaGUgPSBsYXllcl9kYXRhLT5VbndyYXAoc2FmZV9zdHJ1Y3QtPnZhbGlkYXRpb25DYWNoZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY6IHsKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WICpzYWZlX3N0cnVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WICo+KGN1cl9wbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYWZlX3N0cnVjdC0+cEFjY2VsZXJhdGlvblN0cnVjdHVyZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgc2FmZV9zdHJ1Y3QtPmFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0LT5wQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+VW53cmFwKHNhZmVfc3RydWN0LT5wQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQVRUQUNITUVOVF9CRUdJTl9JTkZPX0tIUjogeworICAgICAgICAgICAgICAgICAgICBzYWZlX1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgKnNhZmVfc3RydWN0ID0gcmVpbnRlcnByZXRfY2FzdDxzYWZlX1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgKj4oY3VyX3BuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhZmVfc3RydWN0LT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgc2FmZV9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdC0+cEF0dGFjaG1lbnRzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5VbndyYXAoc2FmZV9zdHJ1Y3QtPnBBdHRhY2htZW50c1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfU1dBUENIQUlOX0lORk9fS0hSOiB7CisgICAgICAgICAgICAgICAgICAgIHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSICpzYWZlX3N0cnVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgKj4oY3VyX3BuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhZmVfc3RydWN0LT5zd2FwY2hhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0LT5zd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5VbndyYXAoc2FmZV9zdHJ1Y3QtPnN3YXBjaGFpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgbmV4dCBzdHJ1Y3R1cmUgaW4gdGhlIGNoYWluCisgICAgICAgIGN1cl9wbmV4dCA9IGhlYWRlci0+cE5leHQ7CisgICAgfQorfQorCisKKy8vIE1hbnVhbGx5IHdyaXR0ZW4gRGlzcGF0Y2ggcm91dGluZXMKKworCisjZGVmaW5lIERJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OUyAzMgorCisvLyBUaGUgVktfRVhUX3BpcGVsaW5lX2NyZWF0aW9uX2ZlZWRiYWNrIGV4dGVuc2lvbiByZXR1cm5zIGRhdGEgZnJvbSB0aGUgZHJpdmVyIC0tIHdlJ3ZlIGNyZWF0ZWQgYSBjb3B5IG9mIHRoZSBwbmV4dCBjaGFpbiwgc28KKy8vIGNvcHkgdGhlIHJldHVybmVkIGRhdGEgdG8gdGhlIGNhbGxlciBiZWZvcmUgZnJlZWluZyB0aGUgY29weSdzIGRhdGEuCit2b2lkIENvcHlDcmVhdGVQaXBlbGluZUZlZWRiYWNrRGF0YShjb25zdCB2b2lkICpzcmNfY2hhaW4sIGNvbnN0IHZvaWQgKmRzdF9jaGFpbikgeworICAgIGF1dG8gc3JjX2ZlZWRiYWNrX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVD4oc3JjX2NoYWluKTsKKyAgICBpZiAoIXNyY19mZWVkYmFja19zdHJ1Y3QpIHJldHVybjsKKyAgICBhdXRvIGRzdF9mZWVkYmFja19zdHJ1Y3QgPSBjb25zdF9jYXN0PFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCAqPigKKyAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUPihkc3RfY2hhaW4pKTsKKyAgICAqZHN0X2ZlZWRiYWNrX3N0cnVjdC0+cFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9ICpzcmNfZmVlZGJhY2tfc3RydWN0LT5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzcmNfZmVlZGJhY2tfc3RydWN0LT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50OyBpKyspIHsKKyAgICAgICAgZHN0X2ZlZWRiYWNrX3N0cnVjdC0+cFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrc1tpXSA9IHNyY19mZWVkYmFja19zdHJ1Y3QtPnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3NbaV07CisgICAgfQorfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvcyA9IG51bGxwdHI7CisgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mb3MgPSBuZXcgc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvW2NyZWF0ZUluZm9Db3VudF07CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIGZvciAodWludDMyX3QgaWR4MCA9IDA7IGlkeDAgPCBjcmVhdGVJbmZvQ291bnQ7ICsraWR4MCkgeworICAgICAgICAgICAgYm9vbCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2wgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCA9IGZhbHNlOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gc3VicGFzc2VzX3VzZXNfaXQgPSBsYXllcl9kYXRhLT5yZW5kZXJwYXNzZXNfc3RhdGVzLmZpbmQobGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvc1tpZHgwXS5yZW5kZXJQYXNzKSk7CisgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3Nlc191c2VzX2l0ICE9IGxheWVyX2RhdGEtPnJlbmRlcnBhc3Nlc19zdGF0ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmc3VicGFzc2VzX3VzZXMgPSBzdWJwYXNzZXNfdXNlc19pdC0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VicGFzc2VzX3VzZXMuc3VicGFzc2VzX3VzaW5nX2NvbG9yX2F0dGFjaG1lbnQuY291bnQocENyZWF0ZUluZm9zW2lkeDBdLnN1YnBhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgdXNlc19jb2xvcl9hdHRhY2htZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3Nlc191c2VzLnN1YnBhc3Nlc191c2luZ19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudC5jb3VudChwQ3JlYXRlSW5mb3NbaWR4MF0uc3VicGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VzX2RlcHRoc3RlbmNpbF9hdHRhY2htZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvc1tpZHgwXS5pbml0aWFsaXplKCZwQ3JlYXRlSW5mb3NbaWR4MF0sIHVzZXNfY29sb3JfYXR0YWNobWVudCwgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCk7CisKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaWR4MF0uYmFzZVBpcGVsaW5lSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2lkeDBdLmJhc2VQaXBlbGluZUhhbmRsZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mb3NbaWR4MF0uYmFzZVBpcGVsaW5lSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaWR4MF0ubGF5b3V0KSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2lkeDBdLmxheW91dCA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mb3NbaWR4MF0ubGF5b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaWR4MF0ucFN0YWdlcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaWR4MSA9IDA7IGlkeDEgPCBwQ3JlYXRlSW5mb3NbaWR4MF0uc3RhZ2VDb3VudDsgKytpZHgxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaWR4MF0ucFN0YWdlc1tpZHgxXS5tb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvc1tpZHgwXS5wU3RhZ2VzW2lkeDFdLm1vZHVsZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mb3NbaWR4MF0ucFN0YWdlc1tpZHgxXS5tb2R1bGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpZHgwXS5yZW5kZXJQYXNzKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2lkeDBdLnJlbmRlclBhc3MgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm9zW2lkeDBdLnJlbmRlclBhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwaXBlbGluZUNhY2hlKSB7CisgICAgICAgIHBpcGVsaW5lQ2FjaGUgPSBsYXllcl9kYXRhLT5VbndyYXAocGlwZWxpbmVDYWNoZSk7CisgICAgfQorCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mb3MtPnB0cigpLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3JlYXRlSW5mb0NvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wTmV4dCAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgQ29weUNyZWF0ZVBpcGVsaW5lRmVlZGJhY2tEYXRhKGxvY2FsX3BDcmVhdGVJbmZvc1tpXS5wTmV4dCwgcENyZWF0ZUluZm9zW2ldLnBOZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZVtdIGxvY2FsX3BDcmVhdGVJbmZvczsKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHBQaXBlbGluZXNbaV0gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICBwUGlwZWxpbmVzW2ldID0gbGF5ZXJfZGF0YS0+V3JhcE5ldyhwUGlwZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIFVwZGF0ZUNyZWF0ZVJlbmRlclBhc3NTdGF0ZShWYWxpZGF0aW9uT2JqZWN0ICpsYXllcl9kYXRhLCBjb25zdCBUICpwQ3JlYXRlSW5mbywgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3MpIHsKKyAgICBhdXRvICZyZW5kZXJwYXNzX3N0YXRlID0gbGF5ZXJfZGF0YS0+cmVuZGVycGFzc2VzX3N0YXRlc1tyZW5kZXJQYXNzXTsKKworICAgIGZvciAodWludDMyX3Qgc3VicGFzcyA9IDA7IHN1YnBhc3MgPCBwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50OyArK3N1YnBhc3MpIHsKKyAgICAgICAgYm9vbCB1c2VzX2NvbG9yID0gZmFsc2U7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzXS5jb2xvckF0dGFjaG1lbnRDb3VudCAmJiAhdXNlc19jb2xvcjsgKytpKQorICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NdLnBDb2xvckF0dGFjaG1lbnRzW2ldLmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHVzZXNfY29sb3IgPSB0cnVlOworCisgICAgICAgIGJvb2wgdXNlc19kZXB0aHN0ZW5jaWwgPSBmYWxzZTsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NdLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KQorICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NdLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKQorICAgICAgICAgICAgICAgIHVzZXNfZGVwdGhzdGVuY2lsID0gdHJ1ZTsKKworICAgICAgICBpZiAodXNlc19jb2xvcikgcmVuZGVycGFzc19zdGF0ZS5zdWJwYXNzZXNfdXNpbmdfY29sb3JfYXR0YWNobWVudC5pbnNlcnQoc3VicGFzcyk7CisgICAgICAgIGlmICh1c2VzX2RlcHRoc3RlbmNpbCkgcmVuZGVycGFzc19zdGF0ZS5zdWJwYXNzZXNfdXNpbmdfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQuaW5zZXJ0KHN1YnBhc3MpOworICAgIH0KK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MgKnBSZW5kZXJQYXNzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVSZW5kZXJQYXNzKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgd3JpdGVfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIFVwZGF0ZUNyZWF0ZVJlbmRlclBhc3NTdGF0ZShsYXllcl9kYXRhLCBwQ3JlYXRlSW5mbywgKnBSZW5kZXJQYXNzKTsKKyAgICAgICAgKnBSZW5kZXJQYXNzID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFJlbmRlclBhc3MpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVJlbmRlclBhc3MyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyAqcFJlbmRlclBhc3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVJlbmRlclBhc3MyS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgd3JpdGVfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIFVwZGF0ZUNyZWF0ZVJlbmRlclBhc3NTdGF0ZShsYXllcl9kYXRhLCBwQ3JlYXRlSW5mbywgKnBSZW5kZXJQYXNzKTsKKyAgICAgICAgKnBSZW5kZXJQYXNzID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFJlbmRlclBhc3MpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lSZW5kZXJQYXNzKGRldmljZSwgcmVuZGVyUGFzcywgcEFsbG9jYXRvcik7CisgICAgdWludDY0X3QgcmVuZGVyUGFzc19pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4ocmVuZGVyUGFzcyk7CisKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AocmVuZGVyUGFzc19pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgcmVuZGVyUGFzcyA9IChWa1JlbmRlclBhc3MpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlclBhc3MgPSAoVmtSZW5kZXJQYXNzKTA7CisgICAgfQorCisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lSZW5kZXJQYXNzKGRldmljZSwgcmVuZGVyUGFzcywgcEFsbG9jYXRvcik7CisKKyAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICBsYXllcl9kYXRhLT5yZW5kZXJwYXNzZXNfc3RhdGVzLmVyYXNlKHJlbmRlclBhc3MpOworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSICpwU3dhcGNoYWluKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKyAgICBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9IG5ldyBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUihwQ3JlYXRlSW5mbyk7CisgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5vbGRTd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm8tPm9sZFN3YXBjaGFpbik7CisgICAgICAgIC8vIFN1cmZhY2UgaXMgaW5zdGFuY2UtbGV2ZWwgb2JqZWN0CisgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5zdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5zdXJmYWNlKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlU3dhcGNoYWluS0hSKGRldmljZSwgbG9jYWxfcENyZWF0ZUluZm8tPnB0cigpLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKyAgICBkZWxldGUgbG9jYWxfcENyZWF0ZUluZm87CisKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBTd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU3dhcGNoYWluKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3Qgc3dhcGNoYWluQ291bnQsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIgKnBTd2FwY2hhaW5zKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMpOworICAgIHNhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpsb2NhbF9wQ3JlYXRlSW5mb3MgPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zID0gbmV3IHNhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSW3N3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5Db3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2ldLmluaXRpYWxpemUoJnBDcmVhdGVJbmZvc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5zdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN1cmZhY2UgaXMgaW5zdGFuY2UtbGV2ZWwgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvc1tpXS5zdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvc1tpXS5zdXJmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5vbGRTd2FwY2hhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2ldLm9sZFN3YXBjaGFpbiA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mb3NbaV0ub2xkU3dhcGNoYWluKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgbG9jYWxfcENyZWF0ZUluZm9zLT5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLCBwU3dhcGNoYWlucyk7CisgICAgZGVsZXRlW10gbG9jYWxfcENyZWF0ZUluZm9zOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcFN3YXBjaGFpbnNbaV0gPSBsYXllcl9kYXRhLT5XcmFwTmV3KHBTd2FwY2hhaW5zW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QgKnBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSAqcFN3YXBjaGFpbkltYWdlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBwU3dhcGNoYWluSW1hZ2VzKTsKKyAgICBWa1N3YXBjaGFpbktIUiB3cmFwcGVkX3N3YXBjaGFpbl9oYW5kbGUgPSBzd2FwY2hhaW47CisgICAgaWYgKFZLX05VTExfSEFORExFICE9IHN3YXBjaGFpbikgeworICAgICAgICBzd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5VbndyYXAoc3dhcGNoYWluKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFN3YXBjaGFpbkltYWdlc0tIUihkZXZpY2UsIHN3YXBjaGFpbiwgcFN3YXBjaGFpbkltYWdlQ291bnQsIHBTd2FwY2hhaW5JbWFnZXMpOworICAgIGlmICgoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHx8IChWS19JTkNPTVBMRVRFID09IHJlc3VsdCkpIHsKKyAgICAgICAgaWYgKCgqcFN3YXBjaGFpbkltYWdlQ291bnQgPiAwKSAmJiBwU3dhcGNoYWluSW1hZ2VzKSB7CisgICAgICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICAgICAgICAgIGF1dG8gJndyYXBwZWRfc3dhcGNoYWluX2ltYWdlX2hhbmRsZXMgPSBsYXllcl9kYXRhLT5zd2FwY2hhaW5fd3JhcHBlZF9pbWFnZV9oYW5kbGVfbWFwW3dyYXBwZWRfc3dhcGNoYWluX2hhbmRsZV07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od3JhcHBlZF9zd2FwY2hhaW5faW1hZ2VfaGFuZGxlcy5zaXplKCkpOyBpIDwgKnBTd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVkX3N3YXBjaGFpbl9pbWFnZV9oYW5kbGVzLmVtcGxhY2VfYmFjayhsYXllcl9kYXRhLT5XcmFwTmV3KHBTd2FwY2hhaW5JbWFnZXNbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFN3YXBjaGFpbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZXNbaV0gPSB3cmFwcGVkX3N3YXBjaGFpbl9pbWFnZV9oYW5kbGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVN3YXBjaGFpbktIUihkZXZpY2UsIHN3YXBjaGFpbiwgcEFsbG9jYXRvcik7CisgICAgd3JpdGVfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisKKyAgICBhdXRvICZpbWFnZV9hcnJheSA9IGxheWVyX2RhdGEtPnN3YXBjaGFpbl93cmFwcGVkX2ltYWdlX2hhbmRsZV9tYXBbc3dhcGNoYWluXTsKKyAgICBmb3IgKGF1dG8gJmltYWdlX2hhbmRsZSA6IGltYWdlX2FycmF5KSB7CisgICAgICAgIHVuaXF1ZV9pZF9tYXBwaW5nLmVyYXNlKEhhbmRsZVRvVWludDY0KGltYWdlX2hhbmRsZSkpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5zd2FwY2hhaW5fd3JhcHBlZF9pbWFnZV9oYW5kbGVfbWFwLmVyYXNlKHN3YXBjaGFpbik7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHVpbnQ2NF90IHN3YXBjaGFpbl9pZCA9IEhhbmRsZVRvVWludDY0KHN3YXBjaGFpbik7CisKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3Aoc3dhcGNoYWluX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBzd2FwY2hhaW4gPSAoVmtTd2FwY2hhaW5LSFIpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3YXBjaGFpbiA9IChWa1N3YXBjaGFpbktIUikwOworICAgIH0KKworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95U3dhcGNoYWluS0hSKGRldmljZSwgc3dhcGNoYWluLCBwQWxsb2NhdG9yKTsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hRdWV1ZVByZXNlbnRLSFIoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb0tIUiAqcFByZXNlbnRJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocXVldWUpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVQcmVzZW50S0hSKHF1ZXVlLCBwUHJlc2VudEluZm8pOworICAgIHNhZmVfVmtQcmVzZW50SW5mb0tIUiAqbG9jYWxfcFByZXNlbnRJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwUHJlc2VudEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BQcmVzZW50SW5mbyA9IG5ldyBzYWZlX1ZrUHJlc2VudEluZm9LSFIocFByZXNlbnRJbmZvKTsKKyAgICAgICAgICAgIGlmIChsb2NhbF9wUHJlc2VudEluZm8tPnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcFByZXNlbnRJbmZvLT53YWl0U2VtYXBob3JlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BQcmVzZW50SW5mby0+cFdhaXRTZW1hcGhvcmVzW2luZGV4MV0gPSBsYXllcl9kYXRhLT5VbndyYXAocFByZXNlbnRJbmZvLT5wV2FpdFNlbWFwaG9yZXNbaW5kZXgxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2FsX3BQcmVzZW50SW5mby0+cFN3YXBjaGFpbnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaW5kZXgxXSA9IGxheWVyX2RhdGEtPlVud3JhcChwUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zW2luZGV4MV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVQcmVzZW50S0hSKHF1ZXVlLCBsb2NhbF9wUHJlc2VudEluZm8tPnB0cigpKTsKKworICAgIC8vIHBSZXN1bHRzIGlzIGFuIG91dHB1dCBhcnJheSBlbWJlZGRlZCBpbiBhIHN0cnVjdHVyZS4gVGhlIGNvZGUgZ2VuZXJhdG9yIG5lZ2xlY3RzIHRvIGNvcHkgYmFjayBmcm9tIHRoZSBzYWZlXyogdmVyc2lvbiwKKyAgICAvLyBzbyBoYW5kbGUgaXQgYXMgYSBzcGVjaWFsIGNhc2UgaGVyZToKKyAgICBpZiAocFByZXNlbnRJbmZvICYmIHBQcmVzZW50SW5mby0+cFJlc3VsdHMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcFByZXNlbnRJbmZvLT5wUmVzdWx0c1tpXSA9IGxvY2FsX3BQcmVzZW50SW5mby0+cFJlc3VsdHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIGxvY2FsX3BQcmVzZW50SW5mbzsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZXNjcmlwdG9yUG9vbChkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBwQWxsb2NhdG9yKTsKKyAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKworICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGltcGxpY2l0bHkgZnJlZWQgZGVzY3JpcHRvciBzZXRzCisgICAgZm9yKGF1dG8gZGVzY3JpcHRvcl9zZXQgOiBsYXllcl9kYXRhLT5wb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXBbZGVzY3JpcHRvclBvb2xdKSB7CisgICAgICAgIHVuaXF1ZV9pZF9tYXBwaW5nLmVyYXNlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvcl9zZXQpKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+cG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwLmVyYXNlKGRlc2NyaXB0b3JQb29sKTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgdWludDY0X3QgZGVzY3JpcHRvclBvb2xfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGRlc2NyaXB0b3JQb29sKTsKKworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChkZXNjcmlwdG9yUG9vbF9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgZGVzY3JpcHRvclBvb2wgPSAoVmtEZXNjcmlwdG9yUG9vbClpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRvclBvb2wgPSAoVmtEZXNjcmlwdG9yUG9vbCkwOworICAgIH0KKworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVzY3JpcHRvclBvb2woZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgcEFsbG9jYXRvcik7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoUmVzZXREZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlJlc2V0RGVzY3JpcHRvclBvb2woZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgZmxhZ3MpOworICAgIFZrRGVzY3JpcHRvclBvb2wgbG9jYWxfZGVzY3JpcHRvcl9wb29sID0gVktfTlVMTF9IQU5ETEU7CisgICAgeworICAgICAgICBsb2NhbF9kZXNjcmlwdG9yX3Bvb2wgPSBsYXllcl9kYXRhLT5VbndyYXAoZGVzY3JpcHRvclBvb2wpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVzZXREZXNjcmlwdG9yUG9vbChkZXZpY2UsIGxvY2FsX2Rlc2NyaXB0b3JfcG9vbCwgZmxhZ3MpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICAgICAgLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gaW1wbGljaXRseSBmcmVlZCBkZXNjcmlwdG9yIHNldHMKKyAgICAgICAgZm9yKGF1dG8gZGVzY3JpcHRvcl9zZXQgOiBsYXllcl9kYXRhLT5wb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXBbZGVzY3JpcHRvclBvb2xdKSB7CisgICAgICAgICAgICB1bmlxdWVfaWRfbWFwcGluZy5lcmFzZShyZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGRlc2NyaXB0b3Jfc2V0KSk7CisgICAgICAgIH0KKyAgICAgICAgbGF5ZXJfZGF0YS0+cG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwW2Rlc2NyaXB0b3JQb29sXS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5BbGxvY2F0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgcEFsbG9jYXRlSW5mbywgcERlc2NyaXB0b3JTZXRzKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqbG9jYWxfcEFsbG9jYXRlSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEFsbG9jYXRlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEFsbG9jYXRlSW5mbyA9IG5ldyBzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyhwQWxsb2NhdGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2NhbF9wQWxsb2NhdGVJbmZvLT5wU2V0TGF5b3V0cykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQWxsb2NhdGVJbmZvLT5wU2V0TGF5b3V0c1tpbmRleDFdID0gbGF5ZXJfZGF0YS0+VW53cmFwKGxvY2FsX3BBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzW2luZGV4MV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygKKyAgICAgICAgZGV2aWNlLCAoY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICopbG9jYWxfcEFsbG9jYXRlSW5mbywgcERlc2NyaXB0b3JTZXRzKTsKKyAgICBpZiAobG9jYWxfcEFsbG9jYXRlSW5mbykgeworICAgICAgICBkZWxldGUgbG9jYWxfcEFsbG9jYXRlSW5mbzsKKyAgICB9CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgIHdyaXRlX2xvY2tfZ3VhcmRfdCBsb2NrKGRpc3BhdGNoX2xvY2spOworICAgICAgICBhdXRvICZwb29sX2Rlc2NyaXB0b3Jfc2V0cyA9IGxheWVyX2RhdGEtPnBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbF07CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgcEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyBpbmRleDArKykgeworICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5XcmFwTmV3KHBEZXNjcmlwdG9yU2V0c1tpbmRleDBdKTsKKyAgICAgICAgICAgIHBvb2xfZGVzY3JpcHRvcl9zZXRzLmluc2VydChwRGVzY3JpcHRvclNldHNbaW5kZXgwXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hGcmVlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5GcmVlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgZGVzY3JpcHRvclNldENvdW50LCBwRGVzY3JpcHRvclNldHMpOworICAgIFZrRGVzY3JpcHRvclNldCAqbG9jYWxfcERlc2NyaXB0b3JTZXRzID0gTlVMTDsKKyAgICBWa0Rlc2NyaXB0b3JQb29sIGxvY2FsX2Rlc2NyaXB0b3JfcG9vbCA9IFZLX05VTExfSEFORExFOworICAgIHsKKyAgICAgICAgbG9jYWxfZGVzY3JpcHRvcl9wb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRlc2NyaXB0b3JQb29sKTsKKyAgICAgICAgaWYgKHBEZXNjcmlwdG9yU2V0cykgeworICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JTZXRzID0gbmV3IFZrRGVzY3JpcHRvclNldFtkZXNjcmlwdG9yU2V0Q291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBkZXNjcmlwdG9yU2V0Q291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JTZXRzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5VbndyYXAocERlc2NyaXB0b3JTZXRzW2luZGV4MF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5GcmVlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBsb2NhbF9kZXNjcmlwdG9yX3Bvb2wsIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBWa0Rlc2NyaXB0b3JTZXQgKilsb2NhbF9wRGVzY3JpcHRvclNldHMpOworICAgIGlmIChsb2NhbF9wRGVzY3JpcHRvclNldHMpIGRlbGV0ZVtdIGxvY2FsX3BEZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSAmJiAocERlc2NyaXB0b3JTZXRzKSkgeworICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICAgICAgYXV0byAmcG9vbF9kZXNjcmlwdG9yX3NldHMgPSBsYXllcl9kYXRhLT5wb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXBbZGVzY3JpcHRvclBvb2xdOworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGRlc2NyaXB0b3JTZXRDb3VudDsgaW5kZXgwKyspIHsKKyAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldCBoYW5kbGUgPSBwRGVzY3JpcHRvclNldHNbaW5kZXgwXTsKKyAgICAgICAgICAgIHBvb2xfZGVzY3JpcHRvcl9zZXRzLmVyYXNlKGhhbmRsZSk7CisgICAgICAgICAgICB1aW50NjRfdCB1bmlxdWVfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGhhbmRsZSk7CisgICAgICAgICAgICB1bmlxdWVfaWRfbWFwcGluZy5lcmFzZSh1bmlxdWVfaWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGNvcmUgdmVyc2lvbiBvZiB0aGlzIHJvdXRpbmUuICBUaGUgZXh0ZW5zaW9uIHZlcnNpb24gaXMgYmVsb3cuCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiAqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICpsb2NhbF9wQ3JlYXRlSW5mbyA9IE5VTEw7CisgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvID0gJnZhcl9sb2NhbF9wQ3JlYXRlSW5mbzsKKyAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmluaXRpYWxpemUocENyZWF0ZUluZm8pOworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnRlbXBsYXRlVHlwZSA9PSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+ZGVzY3JpcHRvclNldExheW91dCA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mby0+ZGVzY3JpcHRvclNldExheW91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT50ZW1wbGF0ZVR5cGUgPT0gVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9QVVNIX0RFU0NSSVBUT1JTX0tIUikgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPnBpcGVsaW5lTGF5b3V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5waXBlbGluZUxheW91dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShkZXZpY2UsIGxvY2FsX3BDcmVhdGVJbmZvLT5wdHIoKSwgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCisgICAgICAgIC8vIFNoYWRvdyB0ZW1wbGF0ZSBjcmVhdGVJbmZvIGZvciBsYXRlciB1cGRhdGVzCisgICAgICAgIGlmIChsb2NhbF9wQ3JlYXRlSW5mbykgeworICAgICAgICAgICAgd3JpdGVfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VEVNUExBVEVfU1RBVEU+IHRlbXBsYXRlX3N0YXRlKG5ldyBURU1QTEFURV9TVEFURSgqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgbG9jYWxfcENyZWF0ZUluZm8pKTsKKyAgICAgICAgICAgIGxheWVyX2RhdGEtPmRlc2NfdGVtcGxhdGVfY3JlYXRlaW5mb19tYXBbKHVpbnQ2NF90KSpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlXSA9IHN0ZDo6bW92ZSh0ZW1wbGF0ZV9zdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIHZlcnNpb24gb2YgdGhpcyByb3V0aW5lLiAgVGhlIGNvcmUgdmVyc2lvbiBpcyBhYm92ZS4KK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSICpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyB2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvID0gTlVMTDsKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8gPSAmdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+dGVtcGxhdGVUeXBlID09IFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQpIHsKKyAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5kZXNjcmlwdG9yU2V0TGF5b3V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5kZXNjcmlwdG9yU2V0TGF5b3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocENyZWF0ZUluZm8tPnRlbXBsYXRlVHlwZSA9PSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+cGlwZWxpbmVMYXlvdXQgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm8tPnBpcGVsaW5lTGF5b3V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKGRldmljZSwgbG9jYWxfcENyZWF0ZUluZm8tPnB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKworICAgICAgICAvLyBTaGFkb3cgdGVtcGxhdGUgY3JlYXRlSW5mbyBmb3IgbGF0ZXIgdXBkYXRlcworICAgICAgICBpZiAobG9jYWxfcENyZWF0ZUluZm8pIHsKKyAgICAgICAgICAgIHdyaXRlX2xvY2tfZ3VhcmRfdCBsb2NrKGRpc3BhdGNoX2xvY2spOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRFTVBMQVRFX1NUQVRFPiB0ZW1wbGF0ZV9zdGF0ZShuZXcgVEVNUExBVEVfU1RBVEUoKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGxvY2FsX3BDcmVhdGVJbmZvKSk7CisgICAgICAgICAgICBsYXllcl9kYXRhLT5kZXNjX3RlbXBsYXRlX2NyZWF0ZWluZm9fbWFwWyh1aW50NjRfdCkqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZV0gPSBzdGQ6Om1vdmUodGVtcGxhdGVfc3RhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGNvcmUgdmVyc2lvbiBvZiB0aGlzIHJvdXRpbmUuICBUaGUgZXh0ZW5zaW9uIHZlcnNpb24gaXMgYmVsb3cuCit2b2lkIERpc3BhdGNoRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKKyAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICB1aW50NjRfdCBkZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICBsYXllcl9kYXRhLT5kZXNjX3RlbXBsYXRlX2NyZWF0ZWluZm9fbWFwLmVyYXNlKGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlX2lkKTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcucG9wKGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSAoVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkwOworICAgIH0KKworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKK30KKworLy8gVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIHZlcnNpb24gb2YgdGhpcyByb3V0aW5lLiAgVGhlIGNvcmUgdmVyc2lvbiBpcyBhYm92ZS4KK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworICAgIHdyaXRlX2xvY2tfZ3VhcmRfdCBsb2NrKGRpc3BhdGNoX2xvY2spOworICAgIHVpbnQ2NF90IGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGxheWVyX2RhdGEtPmRlc2NfdGVtcGxhdGVfY3JlYXRlaW5mb19tYXAuZXJhc2UoZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGVfaWQpOworICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AoZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGVfaWQpOworICAgIGlmIChpdGVyICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSlpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTA7CisgICAgfQorCisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworfQorCit2b2lkICpCdWlsZFVud3JhcHBlZFVwZGF0ZVRlbXBsYXRlQnVmZmVyKFZhbGlkYXRpb25PYmplY3QgKmxheWVyX2RhdGEsIHVpbnQ2NF90IGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3Qgdm9pZCAqcERhdGEpIHsKKyAgICBhdXRvIGNvbnN0IHRlbXBsYXRlX21hcF9lbnRyeSA9IGxheWVyX2RhdGEtPmRlc2NfdGVtcGxhdGVfY3JlYXRlaW5mb19tYXAuZmluZChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGF1dG8gY29uc3QgJmNyZWF0ZV9pbmZvID0gdGVtcGxhdGVfbWFwX2VudHJ5LT5zZWNvbmQtPmNyZWF0ZV9pbmZvOworICAgIHNpemVfdCBhbGxvY2F0aW9uX3NpemUgPSAwOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBWdWxrYW5PYmplY3RUeXBlLCB1aW50NjRfdCwgc2l6ZV90Pj4gdGVtcGxhdGVfZW50cmllczsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVfaW5mby5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0uZGVzY3JpcHRvckNvdW50OyBqKyspIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0ub2Zmc2V0ICsgaiAqIGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tpXS5zdHJpZGU7CisgICAgICAgICAgICBjaGFyICp1cGRhdGVfZW50cnkgPSAoY2hhciAqKShwRGF0YSkgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAoY3JlYXRlX2luZm8ucERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzW2ldLmRlc2NyaXB0b3JUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOgorICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U6CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRToKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfZW50cnkgPSByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvckltYWdlSW5mbyAqPih1cGRhdGVfZW50cnkpOworICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uX3NpemUgPSBzdGQ6Om1heChhbGxvY2F0aW9uX3NpemUsIG9mZnNldCArIHNpemVvZihWa0Rlc2NyaXB0b3JJbWFnZUluZm8pKTsKKworICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gKndyYXBwZWRfZW50cnkgPSBuZXcgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvKCppbWFnZV9lbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRfZW50cnktPnNhbXBsZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoaW1hZ2VfZW50cnktPnNhbXBsZXIpOworICAgICAgICAgICAgICAgICAgICB3cmFwcGVkX2VudHJ5LT5pbWFnZVZpZXcgPSBsYXllcl9kYXRhLT5VbndyYXAoaW1hZ2VfZW50cnktPmltYWdlVmlldyk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2VudHJpZXMuZW1wbGFjZV9iYWNrKG9mZnNldCwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgQ2FzdFRvVWludDY0KHdyYXBwZWRfZW50cnkpLCAwKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyX2VudHJ5ID0gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICo+KHVwZGF0ZV9lbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25fc2l6ZSA9IHN0ZDo6bWF4KGFsbG9jYXRpb25fc2l6ZSwgb2Zmc2V0ICsgc2l6ZW9mKFZrRGVzY3JpcHRvckJ1ZmZlckluZm8pKTsKKworICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICp3cmFwcGVkX2VudHJ5ID0gbmV3IFZrRGVzY3JpcHRvckJ1ZmZlckluZm8oKmJ1ZmZlcl9lbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRfZW50cnktPmJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChidWZmZXJfZW50cnktPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2VudHJpZXMuZW1wbGFjZV9iYWNrKG9mZnNldCwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIENhc3RUb1VpbnQ2NCh3cmFwcGVkX2VudHJ5KSwgMCk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyX3ZpZXdfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlclZpZXcgKj4odXBkYXRlX2VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbl9zaXplID0gc3RkOjptYXgoYWxsb2NhdGlvbl9zaXplLCBvZmZzZXQgKyBzaXplb2YoVmtCdWZmZXJWaWV3KSk7CisKKyAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXJWaWV3IHdyYXBwZWRfZW50cnkgPSBsYXllcl9kYXRhLT5VbndyYXAoKmJ1ZmZlcl92aWV3X2hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2VudHJpZXMuZW1wbGFjZV9iYWNrKG9mZnNldCwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXJWaWV3LCBDYXN0VG9VaW50NjQod3JhcHBlZF9lbnRyeSksIDApOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOiB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1CeXRlcyA9IGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tpXS5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25fc2l6ZSA9IHN0ZDo6bWF4KGFsbG9jYXRpb25fc2l6ZSwgb2Zmc2V0ICsgbnVtQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIHVud3JhcCwganVzdCBwbGFpbiBkYXRhCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2VudHJpZXMuZW1wbGFjZV9iYWNrKG9mZnNldCwga1Z1bGthbk9iamVjdFR5cGVVbmtub3duLCBDYXN0VG9VaW50NjQodXBkYXRlX2VudHJ5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAvLyB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgaiA9IGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tpXS5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIEFsbG9jYXRlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGFuZCBwb3B1bGF0ZSB3aXRoIHNvdXJjZS91bndyYXBwZWQgZGF0YQorICAgIHZvaWQgKnVud3JhcHBlZF9kYXRhID0gbWFsbG9jKGFsbG9jYXRpb25fc2l6ZSk7CisgICAgZm9yIChhdXRvICZ0aGlzX2VudHJ5IDogdGVtcGxhdGVfZW50cmllcykgeworICAgICAgICBWdWxrYW5PYmplY3RUeXBlIHR5cGUgPSBzdGQ6OmdldDwxPih0aGlzX2VudHJ5KTsKKyAgICAgICAgdm9pZCAqZGVzdGluYXRpb24gPSAoY2hhciAqKXVud3JhcHBlZF9kYXRhICsgc3RkOjpnZXQ8MD4odGhpc19lbnRyeSk7CisgICAgICAgIHVpbnQ2NF90IHNvdXJjZSA9IHN0ZDo6Z2V0PDI+KHRoaXNfZW50cnkpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0ZDo6Z2V0PDM+KHRoaXNfZW50cnkpOworCisgICAgICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgICAgICAgIGFzc2VydCh0eXBlID09IGtWdWxrYW5PYmplY3RUeXBlVW5rbm93bik7CisgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24sIENhc3RGcm9tVWludDY0PHZvaWQgKj4oc291cmNlKSwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2U6CisgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JJbWFnZUluZm8gKj4oZGVzdGluYXRpb24pKSA9CisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9ySW1hZ2VJbmZvICo+KHNvdXJjZSkpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgQ2FzdEZyb21VaW50NjQ8VmtEZXNjcmlwdG9ySW1hZ2VJbmZvICo+KHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1Z1bGthbk9iamVjdFR5cGVCdWZmZXI6CisgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICo+KGRlc3RpbmF0aW9uKSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKihDYXN0RnJvbVVpbnQ2NDxWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICo+KHNvdXJjZSkpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgQ2FzdEZyb21VaW50NjQ8VmtEZXNjcmlwdG9yQnVmZmVySW5mbyAqPihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldzoKKyAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PFZrQnVmZmVyVmlldyAqPihkZXN0aW5hdGlvbikpID0gQ2FzdEZyb21VaW50NjQ8VmtCdWZmZXJWaWV3Pihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAodm9pZCAqKXVud3JhcHBlZF9kYXRhOworfQorCit2b2lkIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkICpwRGF0YSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworICAgIHVpbnQ2NF90IHRlbXBsYXRlX2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICB2b2lkICp1bndyYXBwZWRfYnVmZmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIGRlc2NyaXB0b3JTZXQgPSBsYXllcl9kYXRhLT5VbndyYXAoZGVzY3JpcHRvclNldCk7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSlsYXllcl9kYXRhLT5VbndyYXAoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICAgICAgdW53cmFwcGVkX2J1ZmZlciA9IEJ1aWxkVW53cmFwcGVkVXBkYXRlVGVtcGxhdGVCdWZmZXIobGF5ZXJfZGF0YSwgdGVtcGxhdGVfaGFuZGxlLCBwRGF0YSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCB1bndyYXBwZWRfYnVmZmVyKTsKKyAgICBmcmVlKHVud3JhcHBlZF9idWZmZXIpOworfQorCit2b2lkIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkICpwRGF0YSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworICAgIHVpbnQ2NF90IHRlbXBsYXRlX2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICB2b2lkICp1bndyYXBwZWRfYnVmZmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIGRlc2NyaXB0b3JTZXQgPSBsYXllcl9kYXRhLT5VbndyYXAoZGVzY3JpcHRvclNldCk7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IGxheWVyX2RhdGEtPlVud3JhcChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgICAgICB1bndyYXBwZWRfYnVmZmVyID0gQnVpbGRVbndyYXBwZWRVcGRhdGVUZW1wbGF0ZUJ1ZmZlcihsYXllcl9kYXRhLCB0ZW1wbGF0ZV9oYW5kbGUsIHBEYXRhKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yU2V0LCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHVud3JhcHBlZF9idWZmZXIpOworICAgIGZyZWUodW53cmFwcGVkX2J1ZmZlcik7Cit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNldCwgY29uc3Qgdm9pZCAqcERhdGEpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKGNvbW1hbmRCdWZmZXIsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsIHNldCwgcERhdGEpOworICAgIHVpbnQ2NF90IHRlbXBsYXRlX2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICB2b2lkICp1bndyYXBwZWRfYnVmZmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IGxheWVyX2RhdGEtPlVud3JhcChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgICAgICBsYXlvdXQgPSBsYXllcl9kYXRhLT5VbndyYXAobGF5b3V0KTsKKyAgICAgICAgdW53cmFwcGVkX2J1ZmZlciA9IEJ1aWxkVW53cmFwcGVkVXBkYXRlVGVtcGxhdGVCdWZmZXIobGF5ZXJfZGF0YSwgdGVtcGxhdGVfaGFuZGxlLCBwRGF0YSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihjb21tYW5kQnVmZmVyLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGxheW91dCwgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBwZWRfYnVmZmVyKTsKKyAgICBmcmVlKHVud3JhcHBlZF9idWZmZXIpOworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgKnBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXkgPSBsYXllcl9kYXRhLT5NYXliZVdyYXBEaXNwbGF5KHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXksIGxheWVyX2RhdGEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPQorICAgICAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXlQcm9wZXJ0aWVzLmRpc3BsYXkgPQorICAgICAgICAgICAgICAgIGxheWVyX2RhdGEtPk1heWJlV3JhcERpc3BsYXkocFByb3BlcnRpZXNbaWR4MF0uZGlzcGxheVByb3BlcnRpZXMuZGlzcGxheSwgbGF5ZXJfZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9CisgICAgICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIFZrRGlzcGxheUtIUiAmb3B0X2Rpc3BsYXkgPSBwUHJvcGVydGllc1tpZHgwXS5jdXJyZW50RGlzcGxheTsKKyAgICAgICAgICAgIGlmIChvcHRfZGlzcGxheSkgb3B0X2Rpc3BsYXkgPSBsYXllcl9kYXRhLT5NYXliZVdyYXBEaXNwbGF5KG9wdF9kaXNwbGF5LCBsYXllcl9kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgKnBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiByZXN1bHQ7CisgICAgaWYgKChyZXN1bHQgPT0gVktfU1VDQ0VTUyB8fCByZXN1bHQgPT0gVktfSU5DT01QTEVURSkgJiYgcFByb3BlcnRpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpZHgwID0gMDsgaWR4MCA8ICpwUHJvcGVydHlDb3VudDsgKytpZHgwKSB7CisgICAgICAgICAgICBWa0Rpc3BsYXlLSFIgJm9wdF9kaXNwbGF5ID0gcFByb3BlcnRpZXNbaWR4MF0uZGlzcGxheVBsYW5lUHJvcGVydGllcy5jdXJyZW50RGlzcGxheTsKKyAgICAgICAgICAgIGlmIChvcHRfZGlzcGxheSkgb3B0X2Rpc3BsYXkgPSBsYXllcl9kYXRhLT5NYXliZVdyYXBEaXNwbGF5KG9wdF9kaXNwbGF5LCBsYXllcl9kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHBsYW5lSW5kZXgsIHVpbnQzMl90ICpwRGlzcGxheUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlLSFIgKnBEaXNwbGF5cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKHBoeXNpY2FsRGV2aWNlLCBwbGFuZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5Q291bnQsIHBEaXNwbGF5cyk7CisgICAgaWYgKChyZXN1bHQgPT0gVktfU1VDQ0VTUyB8fCByZXN1bHQgPT0gVktfSU5DT01QTEVURSkgJiYgcERpc3BsYXlzKSB7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiByZXN1bHQ7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcERpc3BsYXlDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAocERpc3BsYXlzW2ldKSBwRGlzcGxheXNbaV0gPSBsYXllcl9kYXRhLT5NYXliZVdyYXBEaXNwbGF5KHBEaXNwbGF5c1tpXSwgbGF5ZXJfZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisgICAgeworICAgICAgICBkaXNwbGF5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRpc3BsYXkpOworICAgIH0KKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgZGlzcGxheSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXlNb2RlID0gbGF5ZXJfZGF0YS0+V3JhcE5ldyhwUHJvcGVydGllc1tpZHgwXS5kaXNwbGF5TW9kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSICpwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgZGlzcGxheSwgcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKyAgICB7CisgICAgICAgIGRpc3BsYXkgPSBsYXllcl9kYXRhLT5VbndyYXAoZGlzcGxheSk7CisgICAgfQorCisgICAgVmtSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgZGlzcGxheSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXlNb2RlUHJvcGVydGllcy5kaXNwbGF5TW9kZSA9IGxheWVyX2RhdGEtPldyYXBOZXcocFByb3BlcnRpZXNbaWR4MF0uZGlzcGxheU1vZGVQcm9wZXJ0aWVzLmRpc3BsYXlNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaERlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgKnBUYWdJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKGRldmljZSwgcFRhZ0luZm8pOworICAgIHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgbG9jYWxfdGFnX2luZm8ocFRhZ0luZm8pOworICAgIHsKKyAgICAgICAgYXV0byBpdCA9IHVuaXF1ZV9pZF9tYXBwaW5nLmZpbmQocmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihsb2NhbF90YWdfaW5mby5vYmplY3QpKTsKKyAgICAgICAgaWYgKGl0ICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgICAgICBsb2NhbF90YWdfaW5mby5vYmplY3QgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVChkZXZpY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUICo+KCZsb2NhbF90YWdfaW5mbykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUICpwTmFtZUluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKGRldmljZSwgcE5hbWVJbmZvKTsKKyAgICBzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBsb2NhbF9uYW1lX2luZm8ocE5hbWVJbmZvKTsKKyAgICB7CisgICAgICAgIGF1dG8gaXQgPSB1bmlxdWVfaWRfbWFwcGluZy5maW5kKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4obG9jYWxfbmFtZV9pbmZvLm9iamVjdCkpOworICAgICAgICBpZiAoaXQgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgICAgIGxvY2FsX25hbWVfaW5mby5vYmplY3QgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoCisgICAgICAgIGRldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgKj4oJmxvY2FsX25hbWVfaW5mbykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFZLX0VYVF9kZWJ1Z191dGlscworVmtSZXN1bHQgRGlzcGF0Y2hTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCAqcFRhZ0luZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVChkZXZpY2UsIHBUYWdJbmZvKTsKKyAgICBzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgbG9jYWxfdGFnX2luZm8ocFRhZ0luZm8pOworICAgIHsKKyAgICAgICAgYXV0byBpdCA9IHVuaXF1ZV9pZF9tYXBwaW5nLmZpbmQocmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihsb2NhbF90YWdfaW5mby5vYmplY3RIYW5kbGUpKTsKKyAgICAgICAgaWYgKGl0ICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgICAgICBsb2NhbF90YWdfaW5mby5vYmplY3RIYW5kbGUgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKAorICAgICAgICBkZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCAqPigmbG9jYWxfdGFnX2luZm8pKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFNldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgKnBOYW1lSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UsIHBOYW1lSW5mbyk7CisgICAgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBsb2NhbF9uYW1lX2luZm8ocE5hbWVJbmZvKTsKKyAgICB7CisgICAgICAgIGF1dG8gaXQgPSB1bmlxdWVfaWRfbWFwcGluZy5maW5kKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4obG9jYWxfbmFtZV9pbmZvLm9iamVjdEhhbmRsZSkpOworICAgICAgICBpZiAoaXQgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgICAgIGxvY2FsX25hbWVfaW5mby5vYmplY3RIYW5kbGUgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICAgICAgZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUICo+KCZsb2NhbF9uYW1lX2luZm8pKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworCisvLyBTa2lwIHZrQ3JlYXRlSW5zdGFuY2UgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrRGVzdHJveUluc3RhbmNlIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworVmtSZXN1bHQgRGlzcGF0Y2hFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUNvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5FbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUNvdW50LCBwUGh5c2ljYWxEZXZpY2VzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgZm9ybWF0LCB0eXBlLCB0aWxpbmcsIHVzYWdlLCBmbGFncywgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0aWVzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqICAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKworfQorCitQRk5fdmtWb2lkRnVuY3Rpb24gRGlzcGF0Y2hHZXRJbnN0YW5jZVByb2NBZGRyKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmFtZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgcE5hbWUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworUEZOX3ZrVm9pZEZ1bmN0aW9uIERpc3BhdGNoR2V0RGV2aWNlUHJvY0FkZHIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmFtZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIHBOYW1lKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFNraXAgdmtDcmVhdGVEZXZpY2UgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrRGVzdHJveURldmljZSBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKKy8vIFNraXAgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKKy8vIFNraXAgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKKy8vIFNraXAgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCit2b2lkIERpc3BhdGNoR2V0RGV2aWNlUXVldWUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVJbmRleCwKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldERldmljZVF1ZXVlKGRldmljZSwgcXVldWVGYW1pbHlJbmRleCwgcXVldWVJbmRleCwgcFF1ZXVlKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFF1ZXVlU3VibWl0KAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qICAgICAgICAgICAgICAgICAgICAgICAgIHBTdWJtaXRzLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocXVldWUpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVTdWJtaXQocXVldWUsIHN1Ym1pdENvdW50LCBwU3VibWl0cywgZmVuY2UpOworICAgIHNhZmVfVmtTdWJtaXRJbmZvICpsb2NhbF9wU3VibWl0cyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocFN1Ym1pdHMpIHsKKyAgICAgICAgICAgIGxvY2FsX3BTdWJtaXRzID0gbmV3IHNhZmVfVmtTdWJtaXRJbmZvW3N1Ym1pdENvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgc3VibWl0Q291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFN1Ym1pdHNbaW5kZXgwXS5pbml0aWFsaXplKCZwU3VibWl0c1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcFN1Ym1pdHNbaW5kZXgwXS5wTmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BTdWJtaXRzW2luZGV4MF0ucFdhaXRTZW1hcGhvcmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcFN1Ym1pdHNbaW5kZXgwXS53YWl0U2VtYXBob3JlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wU3VibWl0c1tpbmRleDBdLnBXYWl0U2VtYXBob3Jlc1tpbmRleDFdID0gbGF5ZXJfZGF0YS0+VW53cmFwKGxvY2FsX3BTdWJtaXRzW2luZGV4MF0ucFdhaXRTZW1hcGhvcmVzW2luZGV4MV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2NhbF9wU3VibWl0c1tpbmRleDBdLnBTaWduYWxTZW1hcGhvcmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcFN1Ym1pdHNbaW5kZXgwXS5zaWduYWxTZW1hcGhvcmVDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BTdWJtaXRzW2luZGV4MF0ucFNpZ25hbFNlbWFwaG9yZXNbaW5kZXgxXSA9IGxheWVyX2RhdGEtPlVud3JhcChsb2NhbF9wU3VibWl0c1tpbmRleDBdLnBTaWduYWxTZW1hcGhvcmVzW2luZGV4MV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZlbmNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKGZlbmNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlF1ZXVlU3VibWl0KHF1ZXVlLCBzdWJtaXRDb3VudCwgKGNvbnN0IFZrU3VibWl0SW5mbyopbG9jYWxfcFN1Ym1pdHMsIGZlbmNlKTsKKyAgICBpZiAobG9jYWxfcFN1Ym1pdHMpIHsKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcFN1Ym1pdHM7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoUXVldWVXYWl0SWRsZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHF1ZXVlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5RdWV1ZVdhaXRJZGxlKHF1ZXVlKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoRGV2aWNlV2FpdElkbGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXZpY2VXYWl0SWRsZShkZXZpY2UpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hBbGxvY2F0ZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlTWVtb3J5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQWxsb2NhdGVNZW1vcnkoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTWVtb3J5KTsKKyAgICBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVJbmZvIHZhcl9sb2NhbF9wQWxsb2NhdGVJbmZvOworICAgIHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm8gKmxvY2FsX3BBbGxvY2F0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBBbGxvY2F0ZUluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BBbGxvY2F0ZUluZm8gPSAmdmFyX2xvY2FsX3BBbGxvY2F0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQWxsb2NhdGVJbmZvLT5pbml0aWFsaXplKHBBbGxvY2F0ZUluZm8pOworICAgICAgICAgICAgV3JhcFBuZXh0Q2hhaW5IYW5kbGVzKGxheWVyX2RhdGEsIGxvY2FsX3BBbGxvY2F0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQWxsb2NhdGVNZW1vcnkoZGV2aWNlLCAoY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qKWxvY2FsX3BBbGxvY2F0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZW1vcnkpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcE1lbW9yeSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBNZW1vcnkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRnJlZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkZyZWVNZW1vcnkoZGV2aWNlLCBtZW1vcnksIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IG1lbW9yeV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4obWVtb3J5KTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AobWVtb3J5X2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBtZW1vcnkgPSAoVmtEZXZpY2VNZW1vcnkpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbW9yeSA9IChWa0RldmljZU1lbW9yeSkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRnJlZU1lbW9yeShkZXZpY2UsIG1lbW9yeSwgcEFsbG9jYXRvcik7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hNYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIFZrTWVtb3J5TWFwRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdm9pZCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcERhdGEpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLk1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSwgb2Zmc2V0LCBzaXplLCBmbGFncywgcHBEYXRhKTsKKyAgICB7CisgICAgICAgIG1lbW9yeSA9IGxheWVyX2RhdGEtPlVud3JhcChtZW1vcnkpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuTWFwTWVtb3J5KGRldmljZSwgbWVtb3J5LCBvZmZzZXQsIHNpemUsIGZsYWdzLCBwcERhdGEpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaFVubWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5Vbm1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSk7CisgICAgeworICAgICAgICBtZW1vcnkgPSBsYXllcl9kYXRhLT5VbndyYXAobWVtb3J5KTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlVubWFwTWVtb3J5KGRldmljZSwgbWVtb3J5KTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcyk7CisgICAgc2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlICpsb2NhbF9wTWVtb3J5UmFuZ2VzID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwTWVtb3J5UmFuZ2VzKSB7CisgICAgICAgICAgICBsb2NhbF9wTWVtb3J5UmFuZ2VzID0gbmV3IHNhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZVttZW1vcnlSYW5nZUNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgbWVtb3J5UmFuZ2VDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wTWVtb3J5UmFuZ2VzW2luZGV4MF0uaW5pdGlhbGl6ZSgmcE1lbW9yeVJhbmdlc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBpZiAocE1lbW9yeVJhbmdlc1tpbmRleDBdLm1lbW9yeSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wTWVtb3J5UmFuZ2VzW2luZGV4MF0ubWVtb3J5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBNZW1vcnlSYW5nZXNbaW5kZXgwXS5tZW1vcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoZGV2aWNlLCBtZW1vcnlSYW5nZUNvdW50LCAoY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSopbG9jYWxfcE1lbW9yeVJhbmdlcyk7CisgICAgaWYgKGxvY2FsX3BNZW1vcnlSYW5nZXMpIHsKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcE1lbW9yeVJhbmdlczsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoZGV2aWNlLCBtZW1vcnlSYW5nZUNvdW50LCBwTWVtb3J5UmFuZ2VzKTsKKyAgICBzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2UgKmxvY2FsX3BNZW1vcnlSYW5nZXMgPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlSYW5nZXMpIHsKKyAgICAgICAgICAgIGxvY2FsX3BNZW1vcnlSYW5nZXMgPSBuZXcgc2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlW21lbW9yeVJhbmdlQ291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBtZW1vcnlSYW5nZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BNZW1vcnlSYW5nZXNbaW5kZXgwXS5pbml0aWFsaXplKCZwTWVtb3J5UmFuZ2VzW2luZGV4MF0pOworICAgICAgICAgICAgICAgIGlmIChwTWVtb3J5UmFuZ2VzW2luZGV4MF0ubWVtb3J5KSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BNZW1vcnlSYW5nZXNbaW5kZXgwXS5tZW1vcnkgPSBsYXllcl9kYXRhLT5VbndyYXAocE1lbW9yeVJhbmdlc1tpbmRleDBdLm1lbW9yeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5JbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgKGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqKWxvY2FsX3BNZW1vcnlSYW5nZXMpOworICAgIGlmIChsb2NhbF9wTWVtb3J5UmFuZ2VzKSB7CisgICAgICAgIGRlbGV0ZVtdIGxvY2FsX3BNZW1vcnlSYW5nZXM7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoZGV2aWNlLCBtZW1vcnksIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKTsKKyAgICB7CisgICAgICAgIG1lbW9yeSA9IGxheWVyX2RhdGEtPlVud3JhcChtZW1vcnkpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudChkZXZpY2UsIG1lbW9yeSwgcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQmluZEJ1ZmZlck1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQmluZEJ1ZmZlck1lbW9yeShkZXZpY2UsIGJ1ZmZlciwgbWVtb3J5LCBtZW1vcnlPZmZzZXQpOworICAgIHsKKyAgICAgICAgYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKGJ1ZmZlcik7CisgICAgICAgIG1lbW9yeSA9IGxheWVyX2RhdGEtPlVud3JhcChtZW1vcnkpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQmluZEJ1ZmZlck1lbW9yeShkZXZpY2UsIGJ1ZmZlciwgbWVtb3J5LCBtZW1vcnlPZmZzZXQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQmluZEltYWdlTWVtb3J5KGRldmljZSwgaW1hZ2UsIG1lbW9yeSwgbWVtb3J5T2Zmc2V0KTsKKyAgICB7CisgICAgICAgIGltYWdlID0gbGF5ZXJfZGF0YS0+VW53cmFwKGltYWdlKTsKKyAgICAgICAgbWVtb3J5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKG1lbW9yeSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5CaW5kSW1hZ2VNZW1vcnkoZGV2aWNlLCBpbWFnZSwgbWVtb3J5LCBtZW1vcnlPZmZzZXQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGJ1ZmZlciwgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgeworICAgICAgICBidWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoYnVmZmVyKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGJ1ZmZlciwgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK30KKwordm9pZCBEaXNwYXRjaEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGltYWdlLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB7CisgICAgICAgIGltYWdlID0gbGF5ZXJfZGF0YS0+VW53cmFwKGltYWdlKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSwgaW1hZ2UsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGltYWdlLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgeworICAgICAgICBpbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChpbWFnZSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsIGltYWdlLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisKK30KKwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgZm9ybWF0LCB0eXBlLCBzYW1wbGVzLCB1c2FnZSwgdGlsaW5nLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qICAgICAgICAgICAgICAgICAgICAgcEJpbmRJbmZvLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocXVldWUpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVCaW5kU3BhcnNlKHF1ZXVlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm8sIGZlbmNlKTsKKyAgICBzYWZlX1ZrQmluZFNwYXJzZUluZm8gKmxvY2FsX3BCaW5kSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEJpbmRJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQmluZEluZm8gPSBuZXcgc2FmZV9Wa0JpbmRTcGFyc2VJbmZvW2JpbmRJbmZvQ291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBiaW5kSW5mb0NvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLmluaXRpYWxpemUoJnBCaW5kSW5mb1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcEJpbmRJbmZvW2luZGV4MF0ucE5leHQpOworICAgICAgICAgICAgICAgIGlmIChsb2NhbF9wQmluZEluZm9baW5kZXgwXS5wV2FpdFNlbWFwaG9yZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBsb2NhbF9wQmluZEluZm9baW5kZXgwXS53YWl0U2VtYXBob3JlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9baW5kZXgwXS5wV2FpdFNlbWFwaG9yZXNbaW5kZXgxXSA9IGxheWVyX2RhdGEtPlVud3JhcChsb2NhbF9wQmluZEluZm9baW5kZXgwXS5wV2FpdFNlbWFwaG9yZXNbaW5kZXgxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLnBCdWZmZXJCaW5kcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLmJ1ZmZlckJpbmRDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQmluZEluZm9baW5kZXgwXS5wQnVmZmVyQmluZHNbaW5kZXgxXS5idWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9baW5kZXgwXS5wQnVmZmVyQmluZHNbaW5kZXgxXS5idWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAocEJpbmRJbmZvW2luZGV4MF0ucEJ1ZmZlckJpbmRzW2luZGV4MV0uYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbF9wQmluZEluZm9baW5kZXgwXS5wQnVmZmVyQmluZHNbaW5kZXgxXS5wQmluZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MiA9IDA7IGluZGV4MiA8IGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLnBCdWZmZXJCaW5kc1tpbmRleDFdLmJpbmRDb3VudDsgKytpbmRleDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleDBdLnBCdWZmZXJCaW5kc1tpbmRleDFdLnBCaW5kc1tpbmRleDJdLm1lbW9yeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcEJpbmRJbmZvW2luZGV4MF0ucEJ1ZmZlckJpbmRzW2luZGV4MV0ucEJpbmRzW2luZGV4Ml0ubWVtb3J5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCaW5kSW5mb1tpbmRleDBdLnBCdWZmZXJCaW5kc1tpbmRleDFdLnBCaW5kc1tpbmRleDJdLm1lbW9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLnBJbWFnZU9wYXF1ZUJpbmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcEJpbmRJbmZvW2luZGV4MF0uaW1hZ2VPcGFxdWVCaW5kQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvW2luZGV4MF0ucEltYWdlT3BhcXVlQmluZHNbaW5kZXgxXS5pbWFnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLnBJbWFnZU9wYXF1ZUJpbmRzW2luZGV4MV0uaW1hZ2UgPSBsYXllcl9kYXRhLT5VbndyYXAocEJpbmRJbmZvW2luZGV4MF0ucEltYWdlT3BhcXVlQmluZHNbaW5kZXgxXS5pbWFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfcEJpbmRJbmZvW2luZGV4MF0ucEltYWdlT3BhcXVlQmluZHNbaW5kZXgxXS5wQmluZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MiA9IDA7IGluZGV4MiA8IGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLnBJbWFnZU9wYXF1ZUJpbmRzW2luZGV4MV0uYmluZENvdW50OyArK2luZGV4MikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvW2luZGV4MF0ucEltYWdlT3BhcXVlQmluZHNbaW5kZXgxXS5wQmluZHNbaW5kZXgyXS5tZW1vcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLnBJbWFnZU9wYXF1ZUJpbmRzW2luZGV4MV0ucEJpbmRzW2luZGV4Ml0ubWVtb3J5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCaW5kSW5mb1tpbmRleDBdLnBJbWFnZU9wYXF1ZUJpbmRzW2luZGV4MV0ucEJpbmRzW2luZGV4Ml0ubWVtb3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobG9jYWxfcEJpbmRJbmZvW2luZGV4MF0ucEltYWdlQmluZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBsb2NhbF9wQmluZEluZm9baW5kZXgwXS5pbWFnZUJpbmRDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQmluZEluZm9baW5kZXgwXS5wSW1hZ2VCaW5kc1tpbmRleDFdLmltYWdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcEJpbmRJbmZvW2luZGV4MF0ucEltYWdlQmluZHNbaW5kZXgxXS5pbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQmluZEluZm9baW5kZXgwXS5wSW1hZ2VCaW5kc1tpbmRleDFdLmltYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbF9wQmluZEluZm9baW5kZXgwXS5wSW1hZ2VCaW5kc1tpbmRleDFdLnBCaW5kcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyID0gMDsgaW5kZXgyIDwgbG9jYWxfcEJpbmRJbmZvW2luZGV4MF0ucEltYWdlQmluZHNbaW5kZXgxXS5iaW5kQ291bnQ7ICsraW5kZXgyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQmluZEluZm9baW5kZXgwXS5wSW1hZ2VCaW5kc1tpbmRleDFdLnBCaW5kc1tpbmRleDJdLm1lbW9yeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcEJpbmRJbmZvW2luZGV4MF0ucEltYWdlQmluZHNbaW5kZXgxXS5wQmluZHNbaW5kZXgyXS5tZW1vcnkgPSBsYXllcl9kYXRhLT5VbndyYXAocEJpbmRJbmZvW2luZGV4MF0ucEltYWdlQmluZHNbaW5kZXgxXS5wQmluZHNbaW5kZXgyXS5tZW1vcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2NhbF9wQmluZEluZm9baW5kZXgwXS5wU2lnbmFsU2VtYXBob3JlcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BCaW5kSW5mb1tpbmRleDBdLnNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcEJpbmRJbmZvW2luZGV4MF0ucFNpZ25hbFNlbWFwaG9yZXNbaW5kZXgxXSA9IGxheWVyX2RhdGEtPlVud3JhcChsb2NhbF9wQmluZEluZm9baW5kZXgwXS5wU2lnbmFsU2VtYXBob3Jlc1tpbmRleDFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmZW5jZSA9IGxheWVyX2RhdGEtPlVud3JhcChmZW5jZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5RdWV1ZUJpbmRTcGFyc2UocXVldWUsIGJpbmRJbmZvQ291bnQsIChjb25zdCBWa0JpbmRTcGFyc2VJbmZvKilsb2NhbF9wQmluZEluZm8sIGZlbmNlKTsKKyAgICBpZiAobG9jYWxfcEJpbmRJbmZvKSB7CisgICAgICAgIGRlbGV0ZVtdIGxvY2FsX3BCaW5kSW5mbzsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRmVuY2UoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRmVuY2UoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBGZW5jZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBGZW5jZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lGZW5jZShkZXZpY2UsIGZlbmNlLCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCBmZW5jZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZmVuY2UpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChmZW5jZV9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgZmVuY2UgPSAoVmtGZW5jZSlpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmVuY2UgPSAoVmtGZW5jZSkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveUZlbmNlKGRldmljZSwgZmVuY2UsIHBBbGxvY2F0b3IpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoUmVzZXRGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVzZXRGZW5jZXMoZGV2aWNlLCBmZW5jZUNvdW50LCBwRmVuY2VzKTsKKyAgICBWa0ZlbmNlIHZhcl9sb2NhbF9wRmVuY2VzW0RJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OU107CisgICAgVmtGZW5jZSAqbG9jYWxfcEZlbmNlcyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEZlbmNlcykgeworICAgICAgICAgICAgbG9jYWxfcEZlbmNlcyA9IGZlbmNlQ291bnQgPiBESVNQQVRDSF9NQVhfU1RBQ0tfQUxMT0NBVElPTlMgPyBuZXcgVmtGZW5jZVtmZW5jZUNvdW50XSA6IHZhcl9sb2NhbF9wRmVuY2VzOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBmZW5jZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BGZW5jZXNbaW5kZXgwXSA9IGxheWVyX2RhdGEtPlVud3JhcChwRmVuY2VzW2luZGV4MF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZXNldEZlbmNlcyhkZXZpY2UsIGZlbmNlQ291bnQsIChjb25zdCBWa0ZlbmNlKilsb2NhbF9wRmVuY2VzKTsKKyAgICBpZiAobG9jYWxfcEZlbmNlcyAhPSB2YXJfbG9jYWxfcEZlbmNlcykKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcEZlbmNlczsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldEZlbmNlU3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEZlbmNlU3RhdHVzKGRldmljZSwgZmVuY2UpOworICAgIHsKKyAgICAgICAgZmVuY2UgPSBsYXllcl9kYXRhLT5VbndyYXAoZmVuY2UpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0RmVuY2VTdGF0dXMoZGV2aWNlLCBmZW5jZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFdhaXRGb3JGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcywKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBbGwsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5XYWl0Rm9yRmVuY2VzKGRldmljZSwgZmVuY2VDb3VudCwgcEZlbmNlcywgd2FpdEFsbCwgdGltZW91dCk7CisgICAgVmtGZW5jZSB2YXJfbG9jYWxfcEZlbmNlc1tESVNQQVRDSF9NQVhfU1RBQ0tfQUxMT0NBVElPTlNdOworICAgIFZrRmVuY2UgKmxvY2FsX3BGZW5jZXMgPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBGZW5jZXMpIHsKKyAgICAgICAgICAgIGxvY2FsX3BGZW5jZXMgPSBmZW5jZUNvdW50ID4gRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TID8gbmV3IFZrRmVuY2VbZmVuY2VDb3VudF0gOiB2YXJfbG9jYWxfcEZlbmNlczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgZmVuY2VDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wRmVuY2VzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5VbndyYXAocEZlbmNlc1tpbmRleDBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuV2FpdEZvckZlbmNlcyhkZXZpY2UsIGZlbmNlQ291bnQsIChjb25zdCBWa0ZlbmNlKilsb2NhbF9wRmVuY2VzLCB3YWl0QWxsLCB0aW1lb3V0KTsKKyAgICBpZiAobG9jYWxfcEZlbmNlcyAhPSB2YXJfbG9jYWxfcEZlbmNlcykKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcEZlbmNlczsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVNlbWFwaG9yZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2VtYXBob3JlKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlU2VtYXBob3JlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTZW1hcGhvcmUpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFNlbWFwaG9yZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBTZW1hcGhvcmUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lTZW1hcGhvcmUoZGV2aWNlLCBzZW1hcGhvcmUsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IHNlbWFwaG9yZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oc2VtYXBob3JlKTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3Aoc2VtYXBob3JlX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBzZW1hcGhvcmUgPSAoVmtTZW1hcGhvcmUpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlbWFwaG9yZSA9IChWa1NlbWFwaG9yZSkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVNlbWFwaG9yZShkZXZpY2UsIHNlbWFwaG9yZSwgcEFsbG9jYXRvcik7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRXZlbnQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEV2ZW50KTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRXZlbnQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEV2ZW50KTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBFdmVudCA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBFdmVudCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lFdmVudChkZXZpY2UsIGV2ZW50LCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCBldmVudF9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZXZlbnQpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChldmVudF9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgZXZlbnQgPSAoVmtFdmVudClpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXZlbnQgPSAoVmtFdmVudCkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveUV2ZW50KGRldmljZSwgZXZlbnQsIHBBbGxvY2F0b3IpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0RXZlbnRTdGF0dXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0RXZlbnRTdGF0dXMoZGV2aWNlLCBldmVudCk7CisgICAgeworICAgICAgICBldmVudCA9IGxheWVyX2RhdGEtPlVud3JhcChldmVudCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRFdmVudFN0YXR1cyhkZXZpY2UsIGV2ZW50KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuU2V0RXZlbnQoZGV2aWNlLCBldmVudCk7CisgICAgeworICAgICAgICBldmVudCA9IGxheWVyX2RhdGEtPlVud3JhcChldmVudCk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXRFdmVudChkZXZpY2UsIGV2ZW50KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoUmVzZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZXNldEV2ZW50KGRldmljZSwgZXZlbnQpOworICAgIHsKKyAgICAgICAgZXZlbnQgPSBsYXllcl9kYXRhLT5VbndyYXAoZXZlbnQpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVzZXRFdmVudChkZXZpY2UsIGV2ZW50KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlUXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUXVlcnlQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXJ5UG9vbCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlUXVlcnlQb29sKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBRdWVyeVBvb2wpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVRdWVyeVBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFF1ZXJ5UG9vbCk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwUXVlcnlQb29sID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFF1ZXJ5UG9vbCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95UXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVF1ZXJ5UG9vbChkZXZpY2UsIHF1ZXJ5UG9vbCwgcEFsbG9jYXRvcik7CisgICAgdWludDY0X3QgcXVlcnlQb29sX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihxdWVyeVBvb2wpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChxdWVyeVBvb2xfaWQpOworICAgIGlmIChpdGVyICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgIHF1ZXJ5UG9vbCA9IChWa1F1ZXJ5UG9vbClpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcXVlcnlQb29sID0gKFZrUXVlcnlQb29sKTA7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95UXVlcnlQb29sKGRldmljZSwgcXVlcnlQb29sLCBwQWxsb2NhdG9yKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0UXVlcnlQb29sUmVzdWx0cyhkZXZpY2UsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZGF0YVNpemUsIHBEYXRhLCBzdHJpZGUsIGZsYWdzKTsKKyAgICB7CisgICAgICAgIHF1ZXJ5UG9vbCA9IGxheWVyX2RhdGEtPlVud3JhcChxdWVyeVBvb2wpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0UXVlcnlQb29sUmVzdWx0cyhkZXZpY2UsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgZGF0YVNpemUsIHBEYXRhLCBzdHJpZGUsIGZsYWdzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVCdWZmZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEJ1ZmZlcik7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwQnVmZmVyID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcEJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95QnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveUJ1ZmZlcihkZXZpY2UsIGJ1ZmZlciwgcEFsbG9jYXRvcik7CisgICAgdWludDY0X3QgYnVmZmVyX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihidWZmZXIpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChidWZmZXJfaWQpOworICAgIGlmIChpdGVyICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgIGJ1ZmZlciA9IChWa0J1ZmZlcilpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyID0gKFZrQnVmZmVyKTA7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95QnVmZmVyKGRldmljZSwgYnVmZmVyLCBwQWxsb2NhdG9yKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXJWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlQnVmZmVyVmlldyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmlldyk7CisgICAgc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvIHZhcl9sb2NhbF9wQ3JlYXRlSW5mbzsKKyAgICBzYWZlX1ZrQnVmZmVyVmlld0NyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8gPSAmdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmluaXRpYWxpemUocENyZWF0ZUluZm8pOworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5idWZmZXIpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+YnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5idWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVCdWZmZXJWaWV3KGRldmljZSwgKGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qKWxvY2FsX3BDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmlldyk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwVmlldyA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBWaWV3KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaERlc3Ryb3lCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lCdWZmZXJWaWV3KGRldmljZSwgYnVmZmVyVmlldywgcEFsbG9jYXRvcik7CisgICAgdWludDY0X3QgYnVmZmVyVmlld19pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oYnVmZmVyVmlldyk7CisgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcucG9wKGJ1ZmZlclZpZXdfaWQpOworICAgIGlmIChpdGVyICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgIGJ1ZmZlclZpZXcgPSAoVmtCdWZmZXJWaWV3KWl0ZXItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBidWZmZXJWaWV3ID0gKFZrQnVmZmVyVmlldykwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveUJ1ZmZlclZpZXcoZGV2aWNlLCBidWZmZXJWaWV3LCBwQWxsb2NhdG9yKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVJbWFnZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW1hZ2UpOworICAgIHNhZmVfVmtJbWFnZUNyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtJbWFnZUNyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8gPSAmdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmluaXRpYWxpemUocENyZWF0ZUluZm8pOworICAgICAgICAgICAgV3JhcFBuZXh0Q2hhaW5IYW5kbGVzKGxheWVyX2RhdGEsIGxvY2FsX3BDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUltYWdlKGRldmljZSwgKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKilsb2NhbF9wQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEltYWdlKTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBJbWFnZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBJbWFnZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95SW1hZ2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lJbWFnZShkZXZpY2UsIGltYWdlLCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCBpbWFnZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oaW1hZ2UpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChpbWFnZV9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgaW1hZ2UgPSAoVmtJbWFnZSlpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW1hZ2UgPSAoVmtJbWFnZSkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveUltYWdlKGRldmljZSwgaW1hZ2UsIHBBbGxvY2F0b3IpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiAgICAgICAgICAgICAgICAgICBwU3VicmVzb3VyY2UsCisgICAgVmtTdWJyZXNvdXJjZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KGRldmljZSwgaW1hZ2UsIHBTdWJyZXNvdXJjZSwgcExheW91dCk7CisgICAgeworICAgICAgICBpbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChpbWFnZSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KGRldmljZSwgaW1hZ2UsIHBTdWJyZXNvdXJjZSwgcExheW91dCk7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbWFnZVZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlSW1hZ2VWaWV3KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWaWV3KTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyB2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgc2FmZV9Wa0ltYWdlVmlld0NyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8gPSAmdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmluaXRpYWxpemUocENyZWF0ZUluZm8pOworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5pbWFnZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5pbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mby0+aW1hZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgV3JhcFBuZXh0Q2hhaW5IYW5kbGVzKGxheWVyX2RhdGEsIGxvY2FsX3BDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUltYWdlVmlldyhkZXZpY2UsIChjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qKWxvY2FsX3BDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmlldyk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwVmlldyA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBWaWV3KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaERlc3Ryb3lJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95SW1hZ2VWaWV3KGRldmljZSwgaW1hZ2VWaWV3LCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCBpbWFnZVZpZXdfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGltYWdlVmlldyk7CisgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcucG9wKGltYWdlVmlld19pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgaW1hZ2VWaWV3ID0gKFZrSW1hZ2VWaWV3KWl0ZXItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbWFnZVZpZXcgPSAoVmtJbWFnZVZpZXcpMDsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lJbWFnZVZpZXcoZGV2aWNlLCBpbWFnZVZpZXcsIHBBbGxvY2F0b3IpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlU2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2hhZGVyTW9kdWxlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRlck1vZHVsZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUpOworICAgIHNhZmVfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIHZhcl9sb2NhbF9wQ3JlYXRlSW5mbzsKKyAgICBzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9ICZ2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgKGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyopbG9jYWxfcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFNoYWRlck1vZHVsZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBTaGFkZXJNb2R1bGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lTaGFkZXJNb2R1bGUoZGV2aWNlLCBzaGFkZXJNb2R1bGUsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IHNoYWRlck1vZHVsZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oc2hhZGVyTW9kdWxlKTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3Aoc2hhZGVyTW9kdWxlX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBzaGFkZXJNb2R1bGUgPSAoVmtTaGFkZXJNb2R1bGUpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHNoYWRlck1vZHVsZSA9IChWa1NoYWRlck1vZHVsZSkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVNoYWRlck1vZHVsZShkZXZpY2UsIHNoYWRlck1vZHVsZSwgcEFsbG9jYXRvcik7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lQ2FjaGUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVBpcGVsaW5lQ2FjaGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFBpcGVsaW5lQ2FjaGUpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVQaXBlbGluZUNhY2hlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUNhY2hlKTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBQaXBlbGluZUNhY2hlID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFBpcGVsaW5lQ2FjaGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVBpcGVsaW5lQ2FjaGUoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCBwaXBlbGluZUNhY2hlX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihwaXBlbGluZUNhY2hlKTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AocGlwZWxpbmVDYWNoZV9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgcGlwZWxpbmVDYWNoZSA9IChWa1BpcGVsaW5lQ2FjaGUpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHBpcGVsaW5lQ2FjaGUgPSAoVmtQaXBlbGluZUNhY2hlKTA7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95UGlwZWxpbmVDYWNoZShkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIHBBbGxvY2F0b3IpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGlwZWxpbmVDYWNoZURhdGEoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFBpcGVsaW5lQ2FjaGVEYXRhKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgcERhdGFTaXplLCBwRGF0YSk7CisgICAgeworICAgICAgICBwaXBlbGluZUNhY2hlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBpcGVsaW5lQ2FjaGUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGlwZWxpbmVDYWNoZURhdGEoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwRGF0YVNpemUsIHBEYXRhKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoTWVyZ2VQaXBlbGluZUNhY2hlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdENhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQ2FjaGVDb3VudCwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgIHBTcmNDYWNoZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLk1lcmdlUGlwZWxpbmVDYWNoZXMoZGV2aWNlLCBkc3RDYWNoZSwgc3JjQ2FjaGVDb3VudCwgcFNyY0NhY2hlcyk7CisgICAgVmtQaXBlbGluZUNhY2hlIHZhcl9sb2NhbF9wU3JjQ2FjaGVzW0RJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OU107CisgICAgVmtQaXBlbGluZUNhY2hlICpsb2NhbF9wU3JjQ2FjaGVzID0gTlVMTDsKKyAgICB7CisgICAgICAgIGRzdENhY2hlID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRzdENhY2hlKTsKKyAgICAgICAgaWYgKHBTcmNDYWNoZXMpIHsKKyAgICAgICAgICAgIGxvY2FsX3BTcmNDYWNoZXMgPSBzcmNDYWNoZUNvdW50ID4gRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TID8gbmV3IFZrUGlwZWxpbmVDYWNoZVtzcmNDYWNoZUNvdW50XSA6IHZhcl9sb2NhbF9wU3JjQ2FjaGVzOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBzcmNDYWNoZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BTcmNDYWNoZXNbaW5kZXgwXSA9IGxheWVyX2RhdGEtPlVud3JhcChwU3JjQ2FjaGVzW2luZGV4MF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5NZXJnZVBpcGVsaW5lQ2FjaGVzKGRldmljZSwgZHN0Q2FjaGUsIHNyY0NhY2hlQ291bnQsIChjb25zdCBWa1BpcGVsaW5lQ2FjaGUqKWxvY2FsX3BTcmNDYWNoZXMpOworICAgIGlmIChsb2NhbF9wU3JjQ2FjaGVzICE9IHZhcl9sb2NhbF9wU3JjQ2FjaGVzKQorICAgICAgICBkZWxldGVbXSBsb2NhbF9wU3JjQ2FjaGVzOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFNraXAgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICBzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAqbG9jYWxfcENyZWF0ZUluZm9zID0gTlVMTDsKKyAgICB7CisgICAgICAgIHBpcGVsaW5lQ2FjaGUgPSBsYXllcl9kYXRhLT5VbndyYXAocGlwZWxpbmVDYWNoZSk7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mb3MpIHsKKyAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvcyA9IG5ldyBzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mb1tjcmVhdGVJbmZvQ291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBjcmVhdGVJbmZvQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2luZGV4MF0uaW5pdGlhbGl6ZSgmcENyZWF0ZUluZm9zW2luZGV4MF0pOworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5zdGFnZS5tb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2luZGV4MF0uc3RhZ2UubW9kdWxlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvc1tpbmRleDBdLnN0YWdlLm1vZHVsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5sYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2luZGV4MF0ubGF5b3V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvc1tpbmRleDBdLmxheW91dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5iYXNlUGlwZWxpbmVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2luZGV4MF0uYmFzZVBpcGVsaW5lSGFuZGxlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvc1tpbmRleDBdLmJhc2VQaXBlbGluZUhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCAoY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKilsb2NhbF9wQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBOZXh0ICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICBDb3B5Q3JlYXRlUGlwZWxpbmVGZWVkYmFja0RhdGEobG9jYWxfcENyZWF0ZUluZm9zW2ldLnBOZXh0LCBwQ3JlYXRlSW5mb3NbaV0ucE5leHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvY2FsX3BDcmVhdGVJbmZvcykgeworICAgICAgICBkZWxldGVbXSBsb2NhbF9wQ3JlYXRlSW5mb3M7CisgICAgfQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBjcmVhdGVJbmZvQ291bnQ7IGluZGV4MCsrKSB7CisgICAgICAgICAgICBpZiAocFBpcGVsaW5lc1tpbmRleDBdICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICAgICAgcFBpcGVsaW5lc1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+V3JhcE5ldyhwUGlwZWxpbmVzW2luZGV4MF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lQaXBlbGluZShkZXZpY2UsIHBpcGVsaW5lLCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCBwaXBlbGluZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4ocGlwZWxpbmUpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChwaXBlbGluZV9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgcGlwZWxpbmUgPSAoVmtQaXBlbGluZSlpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGlwZWxpbmUgPSAoVmtQaXBlbGluZSkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVBpcGVsaW5lKGRldmljZSwgcGlwZWxpbmUsIHBBbGxvY2F0b3IpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUxheW91dCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyB2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9ICZ2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgICAgICBpZiAobG9jYWxfcENyZWF0ZUluZm8tPnBTZXRMYXlvdXRzKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBsb2NhbF9wQ3JlYXRlSW5mby0+c2V0TGF5b3V0Q291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5wU2V0TGF5b3V0c1tpbmRleDFdID0gbGF5ZXJfZGF0YS0+VW53cmFwKGxvY2FsX3BDcmVhdGVJbmZvLT5wU2V0TGF5b3V0c1tpbmRleDFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVBpcGVsaW5lTGF5b3V0KGRldmljZSwgKGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKilsb2NhbF9wQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFBpcGVsaW5lTGF5b3V0KTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBQaXBlbGluZUxheW91dCA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBQaXBlbGluZUxheW91dCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95UGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUxheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lQaXBlbGluZUxheW91dChkZXZpY2UsIHBpcGVsaW5lTGF5b3V0LCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCBwaXBlbGluZUxheW91dF9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4ocGlwZWxpbmVMYXlvdXQpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChwaXBlbGluZUxheW91dF9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgcGlwZWxpbmVMYXlvdXQgPSAoVmtQaXBlbGluZUxheW91dClpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGlwZWxpbmVMYXlvdXQgPSAoVmtQaXBlbGluZUxheW91dCkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcGlwZWxpbmVMYXlvdXQsIHBBbGxvY2F0b3IpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlU2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVyKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVTYW1wbGVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTYW1wbGVyKTsKKyAgICBzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbyAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9ICZ2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlU2FtcGxlcihkZXZpY2UsIChjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKilsb2NhbF9wQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNhbXBsZXIpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFNhbXBsZXIgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU2FtcGxlcik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95U2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95U2FtcGxlcihkZXZpY2UsIHNhbXBsZXIsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IHNhbXBsZXJfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KHNhbXBsZXIpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChzYW1wbGVyX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBzYW1wbGVyID0gKFZrU2FtcGxlcilpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2FtcGxlciA9IChWa1NhbXBsZXIpMDsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lTYW1wbGVyKGRldmljZSwgc2FtcGxlciwgcEFsbG9jYXRvcik7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCogICAgICAgICAgICAgICAgICAgICAgcFNldExheW91dCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRGVzY3JpcHRvclNldExheW91dChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2V0TGF5b3V0KTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9ICZ2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgICAgICBpZiAobG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5ncykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcENyZWF0ZUluZm8tPmJpbmRpbmdDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BDcmVhdGVJbmZvLT5wQmluZGluZ3NbaW5kZXgxXS5wSW1tdXRhYmxlU2FtcGxlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyID0gMDsgaW5kZXgyIDwgbG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpbmRleDFdLmRlc2NyaXB0b3JDb3VudDsgKytpbmRleDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2luZGV4MV0ucEltbXV0YWJsZVNhbXBsZXJzW2luZGV4Ml0gPSBsYXllcl9kYXRhLT5VbndyYXAobG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpbmRleDFdLnBJbW11dGFibGVTYW1wbGVyc1tpbmRleDJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRGVzY3JpcHRvclNldExheW91dChkZXZpY2UsIChjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKilsb2NhbF9wQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNldExheW91dCk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwU2V0TGF5b3V0ID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFNldExheW91dCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVzY3JpcHRvclNldExheW91dChkZXZpY2UsIGRlc2NyaXB0b3JTZXRMYXlvdXQsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IGRlc2NyaXB0b3JTZXRMYXlvdXRfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGRlc2NyaXB0b3JTZXRMYXlvdXQpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChkZXNjcmlwdG9yU2V0TGF5b3V0X2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0ID0gKFZrRGVzY3JpcHRvclNldExheW91dClpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRvclNldExheW91dCA9IChWa0Rlc2NyaXB0b3JTZXRMYXlvdXQpMDsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KGRldmljZSwgZGVzY3JpcHRvclNldExheW91dCwgcEFsbG9jYXRvcik7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yUG9vbCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRGVzY3JpcHRvclBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JQb29sKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRGVzY3JpcHRvclBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JQb29sKTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBEZXNjcmlwdG9yUG9vbCA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBEZXNjcmlwdG9yUG9vbCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFNraXAgdmtEZXN0cm95RGVzY3JpcHRvclBvb2wgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrUmVzZXREZXNjcmlwdG9yUG9vbCBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKKy8vIFNraXAgdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworLy8gU2tpcCB2a0ZyZWVEZXNjcmlwdG9yU2V0cyBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKK3ZvaWQgRGlzcGF0Y2hVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlVwZGF0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzLCBkZXNjcmlwdG9yQ29weUNvdW50LCBwRGVzY3JpcHRvckNvcGllcyk7CisgICAgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldCAqbG9jYWxfcERlc2NyaXB0b3JXcml0ZXMgPSBOVUxMOworICAgIHNhZmVfVmtDb3B5RGVzY3JpcHRvclNldCAqbG9jYWxfcERlc2NyaXB0b3JDb3BpZXMgPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzKSB7CisgICAgICAgICAgICBsb2NhbF9wRGVzY3JpcHRvcldyaXRlcyA9IG5ldyBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0W2Rlc2NyaXB0b3JXcml0ZUNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgZGVzY3JpcHRvcldyaXRlQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5pbml0aWFsaXplKCZwRGVzY3JpcHRvcldyaXRlc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wTmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZHN0U2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZHN0U2V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZHN0U2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mbykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZGVzY3JpcHRvckNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mb1tpbmRleDFdLnNhbXBsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wRGVzY3JpcHRvcldyaXRlc1tpbmRleDBdLnBJbWFnZUluZm9baW5kZXgxXS5zYW1wbGVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mb1tpbmRleDFdLnNhbXBsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mb1tpbmRleDFdLmltYWdlVmlldykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mb1tpbmRleDFdLmltYWdlVmlldyA9IGxheWVyX2RhdGEtPlVud3JhcChwRGVzY3JpcHRvcldyaXRlc1tpbmRleDBdLnBJbWFnZUluZm9baW5kZXgxXS5pbWFnZVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2NhbF9wRGVzY3JpcHRvcldyaXRlc1tpbmRleDBdLnBCdWZmZXJJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5kZXNjcmlwdG9yQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wQnVmZmVySW5mb1tpbmRleDFdLmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEJ1ZmZlckluZm9baW5kZXgxXS5idWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAocERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wQnVmZmVySW5mb1tpbmRleDFdLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucFRleGVsQnVmZmVyVmlldykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZGVzY3JpcHRvckNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wVGV4ZWxCdWZmZXJWaWV3W2luZGV4MV0gPSBsYXllcl9kYXRhLT5VbndyYXAobG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wVGV4ZWxCdWZmZXJWaWV3W2luZGV4MV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwRGVzY3JpcHRvckNvcGllcykgeworICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JDb3BpZXMgPSBuZXcgc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0W2Rlc2NyaXB0b3JDb3B5Q291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBkZXNjcmlwdG9yQ29weUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yQ29waWVzW2luZGV4MF0uaW5pdGlhbGl6ZSgmcERlc2NyaXB0b3JDb3BpZXNbaW5kZXgwXSk7CisgICAgICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yQ29waWVzW2luZGV4MF0uc3JjU2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yQ29waWVzW2luZGV4MF0uc3JjU2V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBEZXNjcmlwdG9yQ29waWVzW2luZGV4MF0uc3JjU2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yQ29waWVzW2luZGV4MF0uZHN0U2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yQ29waWVzW2luZGV4MF0uZHN0U2V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBEZXNjcmlwdG9yQ29waWVzW2luZGV4MF0uZHN0U2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlVwZGF0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvcldyaXRlQ291bnQsIChjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCopbG9jYWxfcERlc2NyaXB0b3JXcml0ZXMsIGRlc2NyaXB0b3JDb3B5Q291bnQsIChjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0Kilsb2NhbF9wRGVzY3JpcHRvckNvcGllcyk7CisgICAgaWYgKGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzKSB7CisgICAgICAgIGRlbGV0ZVtdIGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzOworICAgIH0KKyAgICBpZiAobG9jYWxfcERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcERlc2NyaXB0b3JDb3BpZXM7CisgICAgfQorfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRnJhbWVidWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRnJhbWVidWZmZXIpOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8gPSAmdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmluaXRpYWxpemUocENyZWF0ZUluZm8pOworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5yZW5kZXJQYXNzKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPnJlbmRlclBhc3MgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm8tPnJlbmRlclBhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2FsX3BDcmVhdGVJbmZvLT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaW5kZXgxXSA9IGxheWVyX2RhdGEtPlVud3JhcChsb2NhbF9wQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2luZGV4MV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlLCAoY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qKWxvY2FsX3BDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRnJhbWVidWZmZXIpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcEZyYW1lYnVmZmVyID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcEZyYW1lYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaERlc3Ryb3lGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZyYW1lYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveUZyYW1lYnVmZmVyKGRldmljZSwgZnJhbWVidWZmZXIsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IGZyYW1lYnVmZmVyX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihmcmFtZWJ1ZmZlcik7CisgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcucG9wKGZyYW1lYnVmZmVyX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBmcmFtZWJ1ZmZlciA9IChWa0ZyYW1lYnVmZmVyKWl0ZXItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZWJ1ZmZlciA9IChWa0ZyYW1lYnVmZmVyKTA7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RnJhbWVidWZmZXIoZGV2aWNlLCBmcmFtZWJ1ZmZlciwgcEFsbG9jYXRvcik7CisKK30KKworLy8gU2tpcCB2a0NyZWF0ZVJlbmRlclBhc3MgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrRGVzdHJveVJlbmRlclBhc3MgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCit2b2lkIERpc3BhdGNoR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUmVuZGVyUGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzcywKKyAgICBWa0V4dGVudDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFudWxhcml0eSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5KGRldmljZSwgcmVuZGVyUGFzcywgcEdyYW51bGFyaXR5KTsKKyAgICB7CisgICAgICAgIHJlbmRlclBhc3MgPSBsYXllcl9kYXRhLT5VbndyYXAocmVuZGVyUGFzcyk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoZGV2aWNlLCByZW5kZXJQYXNzLCBwR3JhbnVsYXJpdHkpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtDb21tYW5kUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZFBvb2wpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUNvbW1hbmRQb29sKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBDb21tYW5kUG9vbCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUNvbW1hbmRQb29sKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBDb21tYW5kUG9vbCk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwQ29tbWFuZFBvb2wgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwQ29tbWFuZFBvb2wpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95Q29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgcEFsbG9jYXRvcik7CisgICAgdWludDY0X3QgY29tbWFuZFBvb2xfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGNvbW1hbmRQb29sKTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AoY29tbWFuZFBvb2xfaWQpOworICAgIGlmIChpdGVyICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgIGNvbW1hbmRQb29sID0gKFZrQ29tbWFuZFBvb2wpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbW1hbmRQb29sID0gKFZrQ29tbWFuZFBvb2wpMDsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lDb21tYW5kUG9vbChkZXZpY2UsIGNvbW1hbmRQb29sLCBwQWxsb2NhdG9yKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFJlc2V0Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZXNldENvbW1hbmRQb29sKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzKTsKKyAgICB7CisgICAgICAgIGNvbW1hbmRQb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKGNvbW1hbmRQb29sKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlJlc2V0Q29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQWxsb2NhdGVDb21tYW5kQnVmZmVycyhkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBDb21tYW5kQnVmZmVycyk7CisgICAgc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gdmFyX2xvY2FsX3BBbGxvY2F0ZUluZm87CisgICAgc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gKmxvY2FsX3BBbGxvY2F0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBBbGxvY2F0ZUluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BBbGxvY2F0ZUluZm8gPSAmdmFyX2xvY2FsX3BBbGxvY2F0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQWxsb2NhdGVJbmZvLT5pbml0aWFsaXplKHBBbGxvY2F0ZUluZm8pOworICAgICAgICAgICAgaWYgKHBBbGxvY2F0ZUluZm8tPmNvbW1hbmRQb29sKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEFsbG9jYXRlSW5mby0+Y29tbWFuZFBvb2wgPSBsYXllcl9kYXRhLT5VbndyYXAocEFsbG9jYXRlSW5mby0+Y29tbWFuZFBvb2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5BbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyopbG9jYWxfcEFsbG9jYXRlSW5mbywgcENvbW1hbmRCdWZmZXJzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hGcmVlQ29tbWFuZEJ1ZmZlcnMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRnJlZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgY29tbWFuZFBvb2wsIGNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzKTsKKyAgICB7CisgICAgICAgIGNvbW1hbmRQb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKGNvbW1hbmRQb29sKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkZyZWVDb21tYW5kQnVmZmVycyhkZXZpY2UsIGNvbW1hbmRQb29sLCBjb21tYW5kQnVmZmVyQ291bnQsIHBDb21tYW5kQnVmZmVycyk7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hCZWdpbkNvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogICAgICAgICAgICAgcEJlZ2luSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBwQmVnaW5JbmZvKTsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyB2YXJfbG9jYWxfcEJlZ2luSW5mbzsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAqbG9jYWxfcEJlZ2luSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEJlZ2luSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEJlZ2luSW5mbyA9ICZ2YXJfbG9jYWxfcEJlZ2luSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BCZWdpbkluZm8tPmluaXRpYWxpemUocEJlZ2luSW5mbyk7CisgICAgICAgICAgICBpZiAobG9jYWxfcEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mbykgeworICAgICAgICAgICAgICAgIGlmIChwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvLT5yZW5kZXJQYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BCZWdpbkluZm8tPnBJbmhlcml0YW5jZUluZm8tPnJlbmRlclBhc3MgPSBsYXllcl9kYXRhLT5VbndyYXAocEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mby0+cmVuZGVyUGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvLT5mcmFtZWJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvLT5mcmFtZWJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvLT5mcmFtZWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5CZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlciwgKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyopbG9jYWxfcEJlZ2luSW5mbyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlcik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFJlc2V0Q29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICBmbGFncykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZXNldENvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlciwgZmxhZ3MpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaENtZEJpbmRQaXBlbGluZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmluZFBpcGVsaW5lKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBwaXBlbGluZSk7CisgICAgeworICAgICAgICBwaXBlbGluZSA9IGxheWVyX2RhdGEtPlVud3JhcChwaXBlbGluZSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCaW5kUGlwZWxpbmUoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIHBpcGVsaW5lKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kU2V0Vmlld3BvcnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtWaWV3cG9ydCogICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlld3BvcnRzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldFZpZXdwb3J0KGNvbW1hbmRCdWZmZXIsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBWaWV3cG9ydHMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRTY2lzc29yKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2lzc29ycykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRTZXRTY2lzc29yKGNvbW1hbmRCdWZmZXIsIGZpcnN0U2Npc3Nvciwgc2Npc3NvckNvdW50LCBwU2Npc3NvcnMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRMaW5lV2lkdGgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdpZHRoKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldExpbmVXaWR0aChjb21tYW5kQnVmZmVyLCBsaW5lV2lkdGgpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXREZXB0aEJpYXMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDbGFtcCwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldERlcHRoQmlhcyhjb21tYW5kQnVmZmVyLCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwgZGVwdGhCaWFzQ2xhbXAsIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kU2V0QmxlbmRDb25zdGFudHMoY29tbWFuZEJ1ZmZlciwgYmxlbmRDb25zdGFudHMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldERlcHRoQm91bmRzKGNvbW1hbmRCdWZmZXIsIG1pbkRlcHRoQm91bmRzLCBtYXhEZXB0aEJvdW5kcyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFNldFN0ZW5jaWxDb21wYXJlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVNYXNrKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhjb21tYW5kQnVmZmVyLCBmYWNlTWFzaywgY29tcGFyZU1hc2spOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldFN0ZW5jaWxXcml0ZU1hc2soY29tbWFuZEJ1ZmZlciwgZmFjZU1hc2ssIHdyaXRlTWFzayk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFNldFN0ZW5jaWxSZWZlcmVuY2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kU2V0U3RlbmNpbFJlZmVyZW5jZShjb21tYW5kQnVmZmVyLCBmYWNlTWFzaywgcmVmZXJlbmNlKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kQmluZERlc2NyaXB0b3JTZXRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljT2Zmc2V0Q291bnQsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHluYW1pY09mZnNldHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCaW5kRGVzY3JpcHRvclNldHMoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIGxheW91dCwgZmlyc3RTZXQsIGRlc2NyaXB0b3JTZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzLCBkeW5hbWljT2Zmc2V0Q291bnQsIHBEeW5hbWljT2Zmc2V0cyk7CisgICAgVmtEZXNjcmlwdG9yU2V0IHZhcl9sb2NhbF9wRGVzY3JpcHRvclNldHNbRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TXTsKKyAgICBWa0Rlc2NyaXB0b3JTZXQgKmxvY2FsX3BEZXNjcmlwdG9yU2V0cyA9IE5VTEw7CisgICAgeworICAgICAgICBsYXlvdXQgPSBsYXllcl9kYXRhLT5VbndyYXAobGF5b3V0KTsKKyAgICAgICAgaWYgKHBEZXNjcmlwdG9yU2V0cykgeworICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JTZXRzID0gZGVzY3JpcHRvclNldENvdW50ID4gRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TID8gbmV3IFZrRGVzY3JpcHRvclNldFtkZXNjcmlwdG9yU2V0Q291bnRdIDogdmFyX2xvY2FsX3BEZXNjcmlwdG9yU2V0czsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgZGVzY3JpcHRvclNldENvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yU2V0c1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBEZXNjcmlwdG9yU2V0c1tpbmRleDBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmluZERlc2NyaXB0b3JTZXRzKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIGZpcnN0U2V0LCBkZXNjcmlwdG9yU2V0Q291bnQsIChjb25zdCBWa0Rlc2NyaXB0b3JTZXQqKWxvY2FsX3BEZXNjcmlwdG9yU2V0cywgZHluYW1pY09mZnNldENvdW50LCBwRHluYW1pY09mZnNldHMpOworICAgIGlmIChsb2NhbF9wRGVzY3JpcHRvclNldHMgIT0gdmFyX2xvY2FsX3BEZXNjcmlwdG9yU2V0cykKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcERlc2NyaXB0b3JTZXRzOworfQorCit2b2lkIERpc3BhdGNoQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0luZGV4VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VHlwZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJpbmRJbmRleEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgaW5kZXhUeXBlKTsKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChidWZmZXIpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmluZEluZGV4QnVmZmVyKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBpbmRleFR5cGUpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRCaW5kVmVydGV4QnVmZmVycygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmluZFZlcnRleEJ1ZmZlcnMoY29tbWFuZEJ1ZmZlciwgZmlyc3RCaW5kaW5nLCBiaW5kaW5nQ291bnQsIHBCdWZmZXJzLCBwT2Zmc2V0cyk7CisgICAgVmtCdWZmZXIgdmFyX2xvY2FsX3BCdWZmZXJzW0RJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OU107CisgICAgVmtCdWZmZXIgKmxvY2FsX3BCdWZmZXJzID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQnVmZmVycykgeworICAgICAgICAgICAgbG9jYWxfcEJ1ZmZlcnMgPSBiaW5kaW5nQ291bnQgPiBESVNQQVRDSF9NQVhfU1RBQ0tfQUxMT0NBVElPTlMgPyBuZXcgVmtCdWZmZXJbYmluZGluZ0NvdW50XSA6IHZhcl9sb2NhbF9wQnVmZmVyczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgYmluZGluZ0NvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BCdWZmZXJzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5VbndyYXAocEJ1ZmZlcnNbaW5kZXgwXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJpbmRWZXJ0ZXhCdWZmZXJzKGNvbW1hbmRCdWZmZXIsIGZpcnN0QmluZGluZywgYmluZGluZ0NvdW50LCAoY29uc3QgVmtCdWZmZXIqKWxvY2FsX3BCdWZmZXJzLCBwT2Zmc2V0cyk7CisgICAgaWYgKGxvY2FsX3BCdWZmZXJzICE9IHZhcl9sb2NhbF9wQnVmZmVycykKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcEJ1ZmZlcnM7Cit9CisKK3ZvaWQgRGlzcGF0Y2hDbWREcmF3KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmVydGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREcmF3KGNvbW1hbmRCdWZmZXIsIHZlcnRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleCwgZmlyc3RJbnN0YW5jZSk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZERyYXdJbmRleGVkKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRHJhd0luZGV4ZWQoY29tbWFuZEJ1ZmZlciwgaW5kZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RJbmRleCwgdmVydGV4T2Zmc2V0LCBmaXJzdEluc3RhbmNlKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRHJhd0luZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworICAgIHsKKyAgICAgICAgYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKGJ1ZmZlcik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREcmF3SW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREcmF3SW5kZXhlZEluZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7CisgICAgeworICAgICAgICBidWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoYnVmZmVyKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdJbmRleGVkSW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGRyYXdDb3VudCwgc3RyaWRlKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRGlzcGF0Y2goCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERpc3BhdGNoKGNvbW1hbmRCdWZmZXIsIGdyb3VwQ291bnRYLCBncm91cENvdW50WSwgZ3JvdXBDb3VudFopOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERpc3BhdGNoSW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQpOworICAgIHsKKyAgICAgICAgYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKGJ1ZmZlcik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREaXNwYXRjaEluZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0KTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kQ29weUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckNvcHkqICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQ29weUJ1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICB7CisgICAgICAgIHNyY0J1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChzcmNCdWZmZXIpOworICAgICAgICBkc3RCdWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoZHN0QnVmZmVyKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZENvcHlCdWZmZXIoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RCdWZmZXIsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZENvcHlJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDb3B5SW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisgICAgeworICAgICAgICBzcmNJbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChzcmNJbWFnZSk7CisgICAgICAgIGRzdEltYWdlID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRzdEltYWdlKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZENvcHlJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kQmxpdEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZUJsaXQqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucywKKyAgICBWa0ZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJsaXRJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zLCBmaWx0ZXIpOworICAgIHsKKyAgICAgICAgc3JjSW1hZ2UgPSBsYXllcl9kYXRhLT5VbndyYXAoc3JjSW1hZ2UpOworICAgICAgICBkc3RJbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChkc3RJbWFnZSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCbGl0SW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucywgZmlsdGVyKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kQ29weUJ1ZmZlclRvSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDb3B5QnVmZmVyVG9JbWFnZShjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICB7CisgICAgICAgIHNyY0J1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChzcmNCdWZmZXIpOworICAgICAgICBkc3RJbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChkc3RJbWFnZSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDb3B5QnVmZmVyVG9JbWFnZShjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kQ29weUltYWdlVG9CdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDb3B5SW1hZ2VUb0J1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICB7CisgICAgICAgIHNyY0ltYWdlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHNyY0ltYWdlKTsKKyAgICAgICAgZHN0QnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRzdEJ1ZmZlcik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDb3B5SW1hZ2VUb0J1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kVXBkYXRlQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRVcGRhdGVCdWZmZXIoY29tbWFuZEJ1ZmZlciwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIGRhdGFTaXplLCBwRGF0YSk7CisgICAgeworICAgICAgICBkc3RCdWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoZHN0QnVmZmVyKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFVwZGF0ZUJ1ZmZlcihjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgZGF0YVNpemUsIHBEYXRhKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRmlsbEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEZpbGxCdWZmZXIoY29tbWFuZEJ1ZmZlciwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIHNpemUsIGRhdGEpOworICAgIHsKKyAgICAgICAgZHN0QnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRzdEJ1ZmZlcik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRGaWxsQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBzaXplLCBkYXRhKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kQ2xlYXJDb2xvckltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUqICAgICAgICAgICAgICAgICAgICBwQ29sb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiAgICAgICAgICAgICAgcFJhbmdlcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZENsZWFyQ29sb3JJbWFnZShjb21tYW5kQnVmZmVyLCBpbWFnZSwgaW1hZ2VMYXlvdXQsIHBDb2xvciwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7CisgICAgeworICAgICAgICBpbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChpbWFnZSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDbGVhckNvbG9ySW1hZ2UoY29tbWFuZEJ1ZmZlciwgaW1hZ2UsIGltYWdlTGF5b3V0LCBwQ29sb3IsIHJhbmdlQ291bnQsIHBSYW5nZXMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcERlcHRoU3RlbmNpbCwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7CisgICAgeworICAgICAgICBpbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChpbWFnZSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKGNvbW1hbmRCdWZmZXIsIGltYWdlLCBpbWFnZUxheW91dCwgcERlcHRoU3RlbmNpbCwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZENsZWFyQXR0YWNobWVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZENsZWFyQXR0YWNobWVudHMoY29tbWFuZEJ1ZmZlciwgYXR0YWNobWVudENvdW50LCBwQXR0YWNobWVudHMsIHJlY3RDb3VudCwgcFJlY3RzKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kUmVzb2x2ZUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVJlc29sdmUqICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFJlc29sdmVJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKKyAgICB7CisgICAgICAgIHNyY0ltYWdlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHNyY0ltYWdlKTsKKyAgICAgICAgZHN0SW1hZ2UgPSBsYXllcl9kYXRhLT5VbndyYXAoZHN0SW1hZ2UpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kUmVzb2x2ZUltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldEV2ZW50KGNvbW1hbmRCdWZmZXIsIGV2ZW50LCBzdGFnZU1hc2spOworICAgIHsKKyAgICAgICAgZXZlbnQgPSBsYXllcl9kYXRhLT5VbndyYXAoZXZlbnQpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kU2V0RXZlbnQoY29tbWFuZEJ1ZmZlciwgZXZlbnQsIHN0YWdlTWFzayk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFJlc2V0RXZlbnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRSZXNldEV2ZW50KGNvbW1hbmRCdWZmZXIsIGV2ZW50LCBzdGFnZU1hc2spOworICAgIHsKKyAgICAgICAgZXZlbnQgPSBsYXllcl9kYXRhLT5VbndyYXAoZXZlbnQpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kUmVzZXRFdmVudChjb21tYW5kQnVmZmVyLCBldmVudCwgc3RhZ2VNYXNrKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kV2FpdEV2ZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50LAorICAgIGNvbnN0IFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50cywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRXYWl0RXZlbnRzKGNvbW1hbmRCdWZmZXIsIGV2ZW50Q291bnQsIHBFdmVudHMsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisgICAgVmtFdmVudCB2YXJfbG9jYWxfcEV2ZW50c1tESVNQQVRDSF9NQVhfU1RBQ0tfQUxMT0NBVElPTlNdOworICAgIFZrRXZlbnQgKmxvY2FsX3BFdmVudHMgPSBOVUxMOworICAgIHNhZmVfVmtCdWZmZXJNZW1vcnlCYXJyaWVyICpsb2NhbF9wQnVmZmVyTWVtb3J5QmFycmllcnMgPSBOVUxMOworICAgIHNhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXIgKmxvY2FsX3BJbWFnZU1lbW9yeUJhcnJpZXJzID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwRXZlbnRzKSB7CisgICAgICAgICAgICBsb2NhbF9wRXZlbnRzID0gZXZlbnRDb3VudCA+IERJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OUyA/IG5ldyBWa0V2ZW50W2V2ZW50Q291bnRdIDogdmFyX2xvY2FsX3BFdmVudHM7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGV2ZW50Q291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEV2ZW50c1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBFdmVudHNbaW5kZXgwXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBCdWZmZXJNZW1vcnlCYXJyaWVycykgeworICAgICAgICAgICAgbG9jYWxfcEJ1ZmZlck1lbW9yeUJhcnJpZXJzID0gbmV3IHNhZmVfVmtCdWZmZXJNZW1vcnlCYXJyaWVyW2J1ZmZlck1lbW9yeUJhcnJpZXJDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQnVmZmVyTWVtb3J5QmFycmllcnNbaW5kZXgwXS5pbml0aWFsaXplKCZwQnVmZmVyTWVtb3J5QmFycmllcnNbaW5kZXgwXSk7CisgICAgICAgICAgICAgICAgaWYgKHBCdWZmZXJNZW1vcnlCYXJyaWVyc1tpbmRleDBdLmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQnVmZmVyTWVtb3J5QmFycmllcnNbaW5kZXgwXS5idWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAocEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2luZGV4MF0uYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBJbWFnZU1lbW9yeUJhcnJpZXJzKSB7CisgICAgICAgICAgICBsb2NhbF9wSW1hZ2VNZW1vcnlCYXJyaWVycyA9IG5ldyBzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyW2ltYWdlTWVtb3J5QmFycmllckNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEltYWdlTWVtb3J5QmFycmllcnNbaW5kZXgwXS5pbml0aWFsaXplKCZwSW1hZ2VNZW1vcnlCYXJyaWVyc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBpZiAocEltYWdlTWVtb3J5QmFycmllcnNbaW5kZXgwXS5pbWFnZSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wSW1hZ2VNZW1vcnlCYXJyaWVyc1tpbmRleDBdLmltYWdlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbWFnZU1lbW9yeUJhcnJpZXJzW2luZGV4MF0uaW1hZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kV2FpdEV2ZW50cyhjb21tYW5kQnVmZmVyLCBldmVudENvdW50LCAoY29uc3QgVmtFdmVudCopbG9jYWxfcEV2ZW50cywgc3JjU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIChjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqKWxvY2FsX3BCdWZmZXJNZW1vcnlCYXJyaWVycywgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIChjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciopbG9jYWxfcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIGlmIChsb2NhbF9wRXZlbnRzICE9IHZhcl9sb2NhbF9wRXZlbnRzKQorICAgICAgICBkZWxldGVbXSBsb2NhbF9wRXZlbnRzOworICAgIGlmIChsb2NhbF9wQnVmZmVyTWVtb3J5QmFycmllcnMpIHsKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcEJ1ZmZlck1lbW9yeUJhcnJpZXJzOworICAgIH0KKyAgICBpZiAobG9jYWxfcEltYWdlTWVtb3J5QmFycmllcnMpIHsKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcEltYWdlTWVtb3J5QmFycmllcnM7CisgICAgfQorfQorCit2b2lkIERpc3BhdGNoQ21kUGlwZWxpbmVCYXJyaWVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICBWa0RlcGVuZGVuY3lGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRQaXBlbGluZUJhcnJpZXIoY29tbWFuZEJ1ZmZlciwgc3JjU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIGRlcGVuZGVuY3lGbGFncywgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIHNhZmVfVmtCdWZmZXJNZW1vcnlCYXJyaWVyICpsb2NhbF9wQnVmZmVyTWVtb3J5QmFycmllcnMgPSBOVUxMOworICAgIHNhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXIgKmxvY2FsX3BJbWFnZU1lbW9yeUJhcnJpZXJzID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQnVmZmVyTWVtb3J5QmFycmllcnMpIHsKKyAgICAgICAgICAgIGxvY2FsX3BCdWZmZXJNZW1vcnlCYXJyaWVycyA9IG5ldyBzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcltidWZmZXJNZW1vcnlCYXJyaWVyQ291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2luZGV4MF0uaW5pdGlhbGl6ZSgmcEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2luZGV4MF0pOworICAgICAgICAgICAgICAgIGlmIChwQnVmZmVyTWVtb3J5QmFycmllcnNbaW5kZXgwXS5idWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2luZGV4MF0uYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCdWZmZXJNZW1vcnlCYXJyaWVyc1tpbmRleDBdLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwSW1hZ2VNZW1vcnlCYXJyaWVycykgeworICAgICAgICAgICAgbG9jYWxfcEltYWdlTWVtb3J5QmFycmllcnMgPSBuZXcgc2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllcltpbWFnZU1lbW9yeUJhcnJpZXJDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGltYWdlTWVtb3J5QmFycmllckNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbWFnZU1lbW9yeUJhcnJpZXJzW2luZGV4MF0uaW5pdGlhbGl6ZSgmcEltYWdlTWVtb3J5QmFycmllcnNbaW5kZXgwXSk7CisgICAgICAgICAgICAgICAgaWYgKHBJbWFnZU1lbW9yeUJhcnJpZXJzW2luZGV4MF0uaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcEltYWdlTWVtb3J5QmFycmllcnNbaW5kZXgwXS5pbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChwSW1hZ2VNZW1vcnlCYXJyaWVyc1tpbmRleDBdLmltYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFBpcGVsaW5lQmFycmllcihjb21tYW5kQnVmZmVyLCBzcmNTdGFnZU1hc2ssIGRzdFN0YWdlTWFzaywgZGVwZW5kZW5jeUZsYWdzLCBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCAoY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKilsb2NhbF9wQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCAoY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqKWxvY2FsX3BJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKyAgICBpZiAobG9jYWxfcEJ1ZmZlck1lbW9yeUJhcnJpZXJzKSB7CisgICAgICAgIGRlbGV0ZVtdIGxvY2FsX3BCdWZmZXJNZW1vcnlCYXJyaWVyczsKKyAgICB9CisgICAgaWYgKGxvY2FsX3BJbWFnZU1lbW9yeUJhcnJpZXJzKSB7CisgICAgICAgIGRlbGV0ZVtdIGxvY2FsX3BJbWFnZU1lbW9yeUJhcnJpZXJzOworICAgIH0KK30KKwordm9pZCBEaXNwYXRjaENtZEJlZ2luUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJlZ2luUXVlcnkoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgZmxhZ3MpOworICAgIHsKKyAgICAgICAgcXVlcnlQb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKHF1ZXJ5UG9vbCk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCZWdpblF1ZXJ5KGNvbW1hbmRCdWZmZXIsIHF1ZXJ5UG9vbCwgcXVlcnksIGZsYWdzKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRW5kUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRFbmRRdWVyeShjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIHF1ZXJ5KTsKKyAgICB7CisgICAgICAgIHF1ZXJ5UG9vbCA9IGxheWVyX2RhdGEtPlVud3JhcChxdWVyeVBvb2wpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRW5kUXVlcnkoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFJlc2V0UXVlcnlQb29sKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kUmVzZXRRdWVyeVBvb2woY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKKyAgICB7CisgICAgICAgIHF1ZXJ5UG9vbCA9IGxheWVyX2RhdGEtPlVud3JhcChxdWVyeVBvb2wpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kUmVzZXRRdWVyeVBvb2woY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kV3JpdGVUaW1lc3RhbXAoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVTdGFnZSwgcXVlcnlQb29sLCBxdWVyeSk7CisgICAgeworICAgICAgICBxdWVyeVBvb2wgPSBsYXllcl9kYXRhLT5VbndyYXAocXVlcnlQb29sKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFdyaXRlVGltZXN0YW1wKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lU3RhZ2UsIHF1ZXJ5UG9vbCwgcXVlcnkpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRDb3B5UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc3RyaWRlLCBmbGFncyk7CisgICAgeworICAgICAgICBxdWVyeVBvb2wgPSBsYXllcl9kYXRhLT5VbndyYXAocXVlcnlQb29sKTsKKyAgICAgICAgZHN0QnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRzdEJ1ZmZlcik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDb3B5UXVlcnlQb29sUmVzdWx0cyhjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBzdHJpZGUsIGZsYWdzKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kUHVzaENvbnN0YW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgVmtTaGFkZXJTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZUZsYWdzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRQdXNoQ29uc3RhbnRzKGNvbW1hbmRCdWZmZXIsIGxheW91dCwgc3RhZ2VGbGFncywgb2Zmc2V0LCBzaXplLCBwVmFsdWVzKTsKKyAgICB7CisgICAgICAgIGxheW91dCA9IGxheWVyX2RhdGEtPlVud3JhcChsYXlvdXQpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kUHVzaENvbnN0YW50cyhjb21tYW5kQnVmZmVyLCBsYXlvdXQsIHN0YWdlRmxhZ3MsIG9mZnNldCwgc2l6ZSwgcFZhbHVlcyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZEJlZ2luUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgY29udGVudHMpOworICAgIHNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHZhcl9sb2NhbF9wUmVuZGVyUGFzc0JlZ2luOworICAgIHNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpsb2NhbF9wUmVuZGVyUGFzc0JlZ2luID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwUmVuZGVyUGFzc0JlZ2luKSB7CisgICAgICAgICAgICBsb2NhbF9wUmVuZGVyUGFzc0JlZ2luID0gJnZhcl9sb2NhbF9wUmVuZGVyUGFzc0JlZ2luOworICAgICAgICAgICAgbG9jYWxfcFJlbmRlclBhc3NCZWdpbi0+aW5pdGlhbGl6ZShwUmVuZGVyUGFzc0JlZ2luKTsKKyAgICAgICAgICAgIGlmIChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFJlbmRlclBhc3NCZWdpbi0+cmVuZGVyUGFzcyA9IGxheWVyX2RhdGEtPlVud3JhcChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwUmVuZGVyUGFzc0JlZ2luLT5mcmFtZWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGxvY2FsX3BSZW5kZXJQYXNzQmVnaW4tPmZyYW1lYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBSZW5kZXJQYXNzQmVnaW4tPmZyYW1lYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdyYXBQbmV4dENoYWluSGFuZGxlcyhsYXllcl9kYXRhLCBsb2NhbF9wUmVuZGVyUGFzc0JlZ2luLT5wTmV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJlZ2luUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyLCAoY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKilsb2NhbF9wUmVuZGVyUGFzc0JlZ2luLCBjb250ZW50cyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZE5leHRTdWJwYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZE5leHRTdWJwYXNzKGNvbW1hbmRCdWZmZXIsIGNvbnRlbnRzKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRW5kUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRW5kUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRXhlY3V0ZUNvbW1hbmRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRFeGVjdXRlQ29tbWFuZHMoY29tbWFuZEJ1ZmZlciwgY29tbWFuZEJ1ZmZlckNvdW50LCBwQ29tbWFuZEJ1ZmZlcnMpOworCit9CisKKy8vIFNraXAgdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24gZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCitWa1Jlc3VsdCBEaXNwYXRjaEJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkJpbmRCdWZmZXJNZW1vcnkyKGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyk7CisgICAgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvICpsb2NhbF9wQmluZEluZm9zID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQmluZEluZm9zKSB7CisgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zID0gbmV3IHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5SW5mb1tiaW5kSW5mb0NvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgYmluZEluZm9Db3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0uaW5pdGlhbGl6ZSgmcEJpbmRJbmZvc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvc1tpbmRleDBdLmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0uYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCaW5kSW5mb3NbaW5kZXgwXS5idWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvc1tpbmRleDBdLm1lbW9yeSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0ubWVtb3J5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCaW5kSW5mb3NbaW5kZXgwXS5tZW1vcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQmluZEJ1ZmZlck1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCAoY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyopbG9jYWxfcEJpbmRJbmZvcyk7CisgICAgaWYgKGxvY2FsX3BCaW5kSW5mb3MpIHsKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcEJpbmRJbmZvczsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkJpbmRJbWFnZU1lbW9yeTIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICBzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbyAqbG9jYWxfcEJpbmRJbmZvcyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEJpbmRJbmZvcykgeworICAgICAgICAgICAgbG9jYWxfcEJpbmRJbmZvcyA9IG5ldyBzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mb1tiaW5kSW5mb0NvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgYmluZEluZm9Db3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0uaW5pdGlhbGl6ZSgmcEJpbmRJbmZvc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcEJpbmRJbmZvc1tpbmRleDBdLnBOZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvc1tpbmRleDBdLmltYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BCaW5kSW5mb3NbaW5kZXgwXS5pbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQmluZEluZm9zW2luZGV4MF0uaW1hZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvc1tpbmRleDBdLm1lbW9yeSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0ubWVtb3J5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCaW5kSW5mb3NbaW5kZXgwXS5tZW1vcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQmluZEltYWdlTWVtb3J5MihkZXZpY2UsIGJpbmRJbmZvQ291bnQsIChjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qKWxvY2FsX3BCaW5kSW5mb3MpOworICAgIGlmIChsb2NhbF9wQmluZEluZm9zKSB7CisgICAgICAgIGRlbGV0ZVtdIGxvY2FsX3BCaW5kSW5mb3M7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyhkZXZpY2UsIGhlYXBJbmRleCwgbG9jYWxEZXZpY2VJbmRleCwgcmVtb3RlRGV2aWNlSW5kZXgsIHBQZWVyTWVtb3J5RmVhdHVyZXMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXREZXZpY2VNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU1hc2spCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kU2V0RGV2aWNlTWFzayhjb21tYW5kQnVmZmVyLCBkZXZpY2VNYXNrKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRGlzcGF0Y2hCYXNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWiwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREaXNwYXRjaEJhc2UoY29tbWFuZEJ1ZmZlciwgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgYmFzZUdyb3VwWiwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyhpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICBzYWZlX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB2YXJfbG9jYWxfcEluZm87CisgICAgc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKmxvY2FsX3BJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEluZm8gPSAmdmFyX2xvY2FsX3BJbmZvOworICAgICAgICAgICAgbG9jYWxfcEluZm8tPmluaXRpYWxpemUocEluZm8pOworICAgICAgICAgICAgaWYgKHBJbmZvLT5pbWFnZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5pbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChwSW5mby0+aW1hZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoZGV2aWNlLCAoY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKilsb2NhbF9wSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK30KKwordm9pZCBEaXNwYXRjaEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoZGV2aWNlLCBwSW5mbywgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgc2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yIHZhcl9sb2NhbF9wSW5mbzsKKyAgICBzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKmxvY2FsX3BJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEluZm8gPSAmdmFyX2xvY2FsX3BJbmZvOworICAgICAgICAgICAgbG9jYWxfcEluZm8tPmluaXRpYWxpemUocEluZm8pOworICAgICAgICAgICAgaWYgKHBJbmZvLT5idWZmZXIpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wSW5mby0+YnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbmZvLT5idWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKGRldmljZSwgKGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqKWxvY2FsX3BJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMihkZXZpY2UsIHBJbmZvLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgdmFyX2xvY2FsX3BJbmZvOworICAgIHNhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICpsb2NhbF9wSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvID0gJnZhcl9sb2NhbF9wSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5pbml0aWFsaXplKHBJbmZvKTsKKyAgICAgICAgICAgIGlmIChwSW5mby0+aW1hZ2UpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wSW5mby0+aW1hZ2UgPSBsYXllcl9kYXRhLT5VbndyYXAocEluZm8tPmltYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKGRldmljZSwgKGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiopbG9jYWxfcEluZm8sIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiAgICAgICAgICAgICAgICAgIHBGZWF0dXJlcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMihwaHlzaWNhbERldmljZSwgcEZlYXR1cmVzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcFByb3BlcnRpZXMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHBGb3JtYXRQcm9wZXJ0aWVzKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgdmFyX2xvY2FsX3BJbWFnZUZvcm1hdEluZm87CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAqbG9jYWxfcEltYWdlRm9ybWF0SW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEltYWdlRm9ybWF0SW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEltYWdlRm9ybWF0SW5mbyA9ICZ2YXJfbG9jYWxfcEltYWdlRm9ybWF0SW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BJbWFnZUZvcm1hdEluZm8tPmluaXRpYWxpemUocEltYWdlRm9ybWF0SW5mbyk7CisgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcEltYWdlRm9ybWF0SW5mby0+cE5leHQpOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKilsb2NhbF9wSW1hZ2VGb3JtYXRJbmZvLCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihwaHlzaWNhbERldmljZSwgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7CisKK30KKwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqICAgICAgICAgIHBNZW1vcnlQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBNZW1vcnlQcm9wZXJ0aWVzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIocGh5c2ljYWxEZXZpY2UsIHBGb3JtYXRJbmZvLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hUcmltQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5UcmltQ29tbWFuZFBvb2woZGV2aWNlLCBjb21tYW5kUG9vbCwgZmxhZ3MpOworICAgIHsKKyAgICAgICAgY29tbWFuZFBvb2wgPSBsYXllcl9kYXRhLT5VbndyYXAoY29tbWFuZFBvb2wpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuVHJpbUNvbW1hbmRQb29sKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0RGV2aWNlUXVldWUyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlSW5mbywKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldERldmljZVF1ZXVlMihkZXZpY2UsIHBRdWV1ZUluZm8sIHBRdWV1ZSk7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwWWNiY3JDb252ZXJzaW9uKTsKKyAgICBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9ICZ2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihkZXZpY2UsIChjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKilsb2NhbF9wQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFljYmNyQ29udmVyc2lvbik7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwWWNiY3JDb252ZXJzaW9uID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFljYmNyQ29udmVyc2lvbik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKGRldmljZSwgeWNiY3JDb252ZXJzaW9uLCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCB5Y2JjckNvbnZlcnNpb25faWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KHljYmNyQ29udmVyc2lvbik7CisgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcucG9wKHljYmNyQ29udmVyc2lvbl9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgeWNiY3JDb252ZXJzaW9uID0gKFZrU2FtcGxlclljYmNyQ29udmVyc2lvbilpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeWNiY3JDb252ZXJzaW9uID0gKFZrU2FtcGxlclljYmNyQ29udmVyc2lvbikwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oZGV2aWNlLCB5Y2JjckNvbnZlcnNpb24sIHBBbGxvY2F0b3IpOworCit9CisKKy8vIFNraXAgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKKy8vIFNraXAgdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogICBwRXh0ZXJuYWxCdWZmZXJJbmZvLAorICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcEV4dGVybmFsQnVmZmVySW5mbywgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisKK30KKwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxGZW5jZUluZm8sIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyk7CisKK30KKwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogICAgICAgICAgICAgIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqICAgICAgICAgICAgICAgcFN1cHBvcnQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KGRldmljZSwgcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9ICZ2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgICAgICBpZiAobG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5ncykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcENyZWF0ZUluZm8tPmJpbmRpbmdDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BDcmVhdGVJbmZvLT5wQmluZGluZ3NbaW5kZXgxXS5wSW1tdXRhYmxlU2FtcGxlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyID0gMDsgaW5kZXgyIDwgbG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpbmRleDFdLmRlc2NyaXB0b3JDb3VudDsgKytpbmRleDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2luZGV4MV0ucEltbXV0YWJsZVNhbXBsZXJzW2luZGV4Ml0gPSBsYXllcl9kYXRhLT5VbndyYXAobG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpbmRleDFdLnBJbW11dGFibGVTYW1wbGVyc1tpbmRleDJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoZGV2aWNlLCAoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyopbG9jYWxfcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKKworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVN1cmZhY2VLSFIoaW5zdGFuY2UsIHN1cmZhY2UsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IHN1cmZhY2VfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KHN1cmZhY2UpOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChzdXJmYWNlX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBzdXJmYWNlID0gKFZrU3VyZmFjZUtIUilpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VyZmFjZSA9IChWa1N1cmZhY2VLSFIpMDsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVN1cmZhY2VLSFIoaW5zdGFuY2UsIHN1cmZhY2UsIHBBbGxvY2F0b3IpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgc3VyZmFjZSwgcFN1cHBvcnRlZCk7CisgICAgeworICAgICAgICBzdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHN1cmZhY2UpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBzdXJmYWNlLCBwU3VwcG9ydGVkKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICB7CisgICAgICAgIHN1cmZhY2UgPSBsYXllcl9kYXRhLT5VbndyYXAoc3VyZmFjZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBTdXJmYWNlRm9ybWF0Q291bnQsIHBTdXJmYWNlRm9ybWF0cyk7CisgICAgeworICAgICAgICBzdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHN1cmZhY2UpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBQcmVzZW50TW9kZUNvdW50LCBwUHJlc2VudE1vZGVzKTsKKyAgICB7CisgICAgICAgIHN1cmZhY2UgPSBsYXllcl9kYXRhLT5VbndyYXAoc3VyZmFjZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFByZXNlbnRNb2RlQ291bnQsIHBQcmVzZW50TW9kZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gU2tpcCB2a0NyZWF0ZVN3YXBjaGFpbktIUiBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKKy8vIFNraXAgdmtEZXN0cm95U3dhcGNoYWluS0hSIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworLy8gU2tpcCB2a0dldFN3YXBjaGFpbkltYWdlc0tIUiBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKK1ZrUmVzdWx0IERpc3BhdGNoQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5BY3F1aXJlTmV4dEltYWdlS0hSKGRldmljZSwgc3dhcGNoYWluLCB0aW1lb3V0LCBzZW1hcGhvcmUsIGZlbmNlLCBwSW1hZ2VJbmRleCk7CisgICAgeworICAgICAgICBzd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5VbndyYXAoc3dhcGNoYWluKTsKKyAgICAgICAgc2VtYXBob3JlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHNlbWFwaG9yZSk7CisgICAgICAgIGZlbmNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKGZlbmNlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkFjcXVpcmVOZXh0SW1hZ2VLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHRpbWVvdXQsIHNlbWFwaG9yZSwgZmVuY2UsIHBJbWFnZUluZGV4KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFNraXAgdmtRdWV1ZVByZXNlbnRLSFIgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCitWa1Jlc3VsdCBEaXNwYXRjaEdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogICAgICAgIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoZGV2aWNlLCBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKGRldmljZSwgc3VyZmFjZSwgcE1vZGVzKTsKKyAgICB7CisgICAgICAgIHN1cmZhY2UgPSBsYXllcl9kYXRhLT5VbndyYXAoc3VyZmFjZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoZGV2aWNlLCBzdXJmYWNlLCBwTW9kZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RDb3VudCwKKyAgICBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0cykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBSZWN0Q291bnQsIHBSZWN0cyk7CisgICAgeworICAgICAgICBzdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHN1cmZhY2UpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwUmVjdENvdW50LCBwUmVjdHMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hBY3F1aXJlTmV4dEltYWdlMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiAgICAgICAgICAgIHBBY3F1aXJlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5BY3F1aXJlTmV4dEltYWdlMktIUihkZXZpY2UsIHBBY3F1aXJlSW5mbywgcEltYWdlSW5kZXgpOworICAgIHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiB2YXJfbG9jYWxfcEFjcXVpcmVJbmZvOworICAgIHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiAqbG9jYWxfcEFjcXVpcmVJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQWNxdWlyZUluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BBY3F1aXJlSW5mbyA9ICZ2YXJfbG9jYWxfcEFjcXVpcmVJbmZvOworICAgICAgICAgICAgbG9jYWxfcEFjcXVpcmVJbmZvLT5pbml0aWFsaXplKHBBY3F1aXJlSW5mbyk7CisgICAgICAgICAgICBpZiAocEFjcXVpcmVJbmZvLT5zd2FwY2hhaW4pIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQWNxdWlyZUluZm8tPnN3YXBjaGFpbiA9IGxheWVyX2RhdGEtPlVud3JhcChwQWNxdWlyZUluZm8tPnN3YXBjaGFpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocEFjcXVpcmVJbmZvLT5zZW1hcGhvcmUpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQWNxdWlyZUluZm8tPnNlbWFwaG9yZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQWNxdWlyZUluZm8tPnNlbWFwaG9yZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocEFjcXVpcmVJbmZvLT5mZW5jZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BBY3F1aXJlSW5mby0+ZmVuY2UgPSBsYXllcl9kYXRhLT5VbndyYXAocEFjcXVpcmVJbmZvLT5mZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkFjcXVpcmVOZXh0SW1hZ2UyS0hSKGRldmljZSwgKGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqKWxvY2FsX3BBY3F1aXJlSW5mbywgcEltYWdlSW5kZXgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gU2tpcCB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworLy8gU2tpcCB2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworLy8gU2tpcCB2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlRGlzcGxheU1vZGVLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEaXNwbGF5TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9kZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURpc3BsYXlNb2RlS0hSKHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1vZGUpOworICAgIHsKKyAgICAgICAgZGlzcGxheSA9IGxheWVyX2RhdGEtPlVud3JhcChkaXNwbGF5KTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRGlzcGxheU1vZGVLSFIocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXksIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTW9kZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwTW9kZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBNb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZUluZGV4LAorICAgIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKiAgICAgICAgICAgICAgcENhcGFiaWxpdGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUihwaHlzaWNhbERldmljZSwgbW9kZSwgcGxhbmVJbmRleCwgcENhcGFiaWxpdGllcyk7CisgICAgeworICAgICAgICBtb2RlID0gbGF5ZXJfZGF0YS0+VW53cmFwKG1vZGUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIG1vZGUsIHBsYW5lSW5kZXgsIHBDYXBhYmlsaXRpZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiB2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9ICZ2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPmRpc3BsYXlNb2RlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmRpc3BsYXlNb2RlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5kaXNwbGF5TW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUihpbnN0YW5jZSwgKGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKilsb2NhbF9wQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFN1cmZhY2UgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU3VyZmFjZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFNraXAgdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVhsaWJTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVhsaWJTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVhsaWJTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFN1cmZhY2UgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU3VyZmFjZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworVmtCb29sMzIgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZpc3VhbElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsSUQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtCb29sMzIgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgZHB5LCB2aXN1YWxJRCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVYY2JTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVhjYlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlWGNiU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBTdXJmYWNlID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFN1cmZhY2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCitWa0Jvb2wzMiBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB4Y2JfY29ubmVjdGlvbl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgeGNiX3Zpc3VhbGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxfaWQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtCb29sMzIgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBjb25uZWN0aW9uLCB2aXN1YWxfaWQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwU3VyZmFjZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBTdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCitWa0Jvb2wzMiBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgc3RydWN0IHdsX2Rpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrQm9vbDMyIHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIGRpc3BsYXkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFN1cmZhY2UgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU3VyZmFjZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlV2luMzJTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVdpbjMyU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVXaW4zMlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwU3VyZmFjZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBTdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZrQm9vbDMyIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtCb29sMzIgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwRmVhdHVyZXMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydGllcyk7CisKK30KKwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsIGZvcm1hdCwgcEZvcm1hdFByb3BlcnRpZXMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcEltYWdlRm9ybWF0SW5mbywgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiB2YXJfbG9jYWxfcEltYWdlRm9ybWF0SW5mbzsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yICpsb2NhbF9wSW1hZ2VGb3JtYXRJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwSW1hZ2VGb3JtYXRJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wSW1hZ2VGb3JtYXRJbmZvID0gJnZhcl9sb2NhbF9wSW1hZ2VGb3JtYXRJbmZvOworICAgICAgICAgICAgbG9jYWxfcEltYWdlRm9ybWF0SW5mby0+aW5pdGlhbGl6ZShwSW1hZ2VGb3JtYXRJbmZvKTsKKyAgICAgICAgICAgIFdyYXBQbmV4dENoYWluSGFuZGxlcyhsYXllcl9kYXRhLCBsb2NhbF9wSW1hZ2VGb3JtYXRJbmZvLT5wTmV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCAoY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqKWxvY2FsX3BJbWFnZUZvcm1hdEluZm8sIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcEZvcm1hdEluZm8sIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisKK30KKwordm9pZCBEaXNwYXRjaEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKGRldmljZSwgaGVhcEluZGV4LCBsb2NhbERldmljZUluZGV4LCByZW1vdGVEZXZpY2VJbmRleCwgcFBlZXJNZW1vcnlGZWF0dXJlcyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFNldERldmljZU1hc2tLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzaykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRTZXREZXZpY2VNYXNrS0hSKGNvbW1hbmRCdWZmZXIsIGRldmljZU1hc2spOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERpc3BhdGNoQmFzZUtIUihjb21tYW5kQnVmZmVyLCBiYXNlR3JvdXBYLCBiYXNlR3JvdXBZLCBiYXNlR3JvdXBaLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaKTsKKworfQorCit2b2lkIERpc3BhdGNoVHJpbUNvbW1hbmRQb29sS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuVHJpbUNvbW1hbmRQb29sS0hSKGRldmljZSwgY29tbWFuZFBvb2wsIGZsYWdzKTsKKyAgICB7CisgICAgICAgIGNvbW1hbmRQb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKGNvbW1hbmRQb29sKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlRyaW1Db21tYW5kUG9vbEtIUihkZXZpY2UsIGNvbW1hbmRQb29sLCBmbGFncyk7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5FbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUihpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qICAgcEV4dGVybmFsQnVmZmVySW5mbywKKyAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIocGh5c2ljYWxEZXZpY2UsIHBFeHRlcm5hbEJ1ZmZlckluZm8sIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpOworCit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlKTsKKyAgICBzYWZlX1ZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIHZhcl9sb2NhbF9wR2V0V2luMzJIYW5kbGVJbmZvOworICAgIHNhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgKmxvY2FsX3BHZXRXaW4zMkhhbmRsZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBHZXRXaW4zMkhhbmRsZUluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BHZXRXaW4zMkhhbmRsZUluZm8gPSAmdmFyX2xvY2FsX3BHZXRXaW4zMkhhbmRsZUluZm87CisgICAgICAgICAgICBsb2NhbF9wR2V0V2luMzJIYW5kbGVJbmZvLT5pbml0aWFsaXplKHBHZXRXaW4zMkhhbmRsZUluZm8pOworICAgICAgICAgICAgaWYgKHBHZXRXaW4zMkhhbmRsZUluZm8tPm1lbW9yeSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BHZXRXaW4zMkhhbmRsZUluZm8tPm1lbW9yeSA9IGxheWVyX2RhdGEtPlVud3JhcChwR2V0V2luMzJIYW5kbGVJbmZvLT5tZW1vcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRNZW1vcnlXaW4zMkhhbmRsZUtIUihkZXZpY2UsIChjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiopbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUihkZXZpY2UsIGhhbmRsZVR5cGUsIGhhbmRsZSwgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRNZW1vcnlGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldE1lbW9yeUZkS0hSKGRldmljZSwgcEdldEZkSW5mbywgcEZkKTsKKyAgICBzYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSIHZhcl9sb2NhbF9wR2V0RmRJbmZvOworICAgIHNhZmVfVmtNZW1vcnlHZXRGZEluZm9LSFIgKmxvY2FsX3BHZXRGZEluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBHZXRGZEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BHZXRGZEluZm8gPSAmdmFyX2xvY2FsX3BHZXRGZEluZm87CisgICAgICAgICAgICBsb2NhbF9wR2V0RmRJbmZvLT5pbml0aWFsaXplKHBHZXRGZEluZm8pOworICAgICAgICAgICAgaWYgKHBHZXRGZEluZm8tPm1lbW9yeSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BHZXRGZEluZm8tPm1lbW9yeSA9IGxheWVyX2RhdGEtPlVud3JhcChwR2V0RmRJbmZvLT5tZW1vcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRNZW1vcnlGZEtIUihkZXZpY2UsIChjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiopbG9jYWxfcEdldEZkSW5mbywgcEZkKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLAorICAgIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUZkUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldE1lbW9yeUZkUHJvcGVydGllc0tIUihkZXZpY2UsIGhhbmRsZVR5cGUsIGZkLCBwTWVtb3J5RmRQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sCisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqICAgICAgICAgICAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKKworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitWa1Jlc3VsdCBEaXNwYXRjaEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiAgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoZGV2aWNlLCBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvKTsKKyAgICBzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHZhcl9sb2NhbF9wSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvOworICAgIHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgKmxvY2FsX3BJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8gPSAmdmFyX2xvY2FsX3BJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm87CisgICAgICAgICAgICBsb2NhbF9wSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvLT5pbml0aWFsaXplKHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pOworICAgICAgICAgICAgaWYgKHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8tPnNlbWFwaG9yZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8tPnNlbWFwaG9yZSA9IGxheWVyX2RhdGEtPlVud3JhcChwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvLT5zZW1hcGhvcmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5JbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihkZXZpY2UsIChjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiopbG9jYWxfcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBHZXRXaW4zMkhhbmRsZUluZm8sIHBIYW5kbGUpOworICAgIHNhZmVfVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgdmFyX2xvY2FsX3BHZXRXaW4zMkhhbmRsZUluZm87CisgICAgc2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiAqbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEdldFdpbjMySGFuZGxlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mbyA9ICZ2YXJfbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BHZXRXaW4zMkhhbmRsZUluZm8tPmluaXRpYWxpemUocEdldFdpbjMySGFuZGxlSW5mbyk7CisgICAgICAgICAgICBpZiAocEdldFdpbjMySGFuZGxlSW5mby0+c2VtYXBob3JlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mby0+c2VtYXBob3JlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBHZXRXaW4zMkhhbmRsZUluZm8tPnNlbWFwaG9yZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKGRldmljZSwgKGNvbnN0IFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKilsb2NhbF9wR2V0V2luMzJIYW5kbGVJbmZvLCBwSGFuZGxlKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitWa1Jlc3VsdCBEaXNwYXRjaEltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuSW1wb3J0U2VtYXBob3JlRmRLSFIoZGV2aWNlLCBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKTsKKyAgICBzYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSIHZhcl9sb2NhbF9wSW1wb3J0U2VtYXBob3JlRmRJbmZvOworICAgIHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgKmxvY2FsX3BJbXBvcnRTZW1hcGhvcmVGZEluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBJbXBvcnRTZW1hcGhvcmVGZEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BJbXBvcnRTZW1hcGhvcmVGZEluZm8gPSAmdmFyX2xvY2FsX3BJbXBvcnRTZW1hcGhvcmVGZEluZm87CisgICAgICAgICAgICBsb2NhbF9wSW1wb3J0U2VtYXBob3JlRmRJbmZvLT5pbml0aWFsaXplKHBJbXBvcnRTZW1hcGhvcmVGZEluZm8pOworICAgICAgICAgICAgaWYgKHBJbXBvcnRTZW1hcGhvcmVGZEluZm8tPnNlbWFwaG9yZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbXBvcnRTZW1hcGhvcmVGZEluZm8tPnNlbWFwaG9yZSA9IGxheWVyX2RhdGEtPlVud3JhcChwSW1wb3J0U2VtYXBob3JlRmRJbmZvLT5zZW1hcGhvcmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5JbXBvcnRTZW1hcGhvcmVGZEtIUihkZXZpY2UsIChjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiopbG9jYWxfcEltcG9ydFNlbWFwaG9yZUZkSW5mbyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0U2VtYXBob3JlRmRLSFIoZGV2aWNlLCBwR2V0RmRJbmZvLCBwRmQpOworICAgIHNhZmVfVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIgdmFyX2xvY2FsX3BHZXRGZEluZm87CisgICAgc2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUiAqbG9jYWxfcEdldEZkSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEdldEZkSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEdldEZkSW5mbyA9ICZ2YXJfbG9jYWxfcEdldEZkSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BHZXRGZEluZm8tPmluaXRpYWxpemUocEdldEZkSW5mbyk7CisgICAgICAgICAgICBpZiAocEdldEZkSW5mby0+c2VtYXBob3JlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEdldEZkSW5mby0+c2VtYXBob3JlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBHZXRGZEluZm8tPnNlbWFwaG9yZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFNlbWFwaG9yZUZkS0hSKGRldmljZSwgKGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKilsb2NhbF9wR2V0RmRJbmZvLCBwRmQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIHNldCwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzKTsKKyAgICBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0ICpsb2NhbF9wRGVzY3JpcHRvcldyaXRlcyA9IE5VTEw7CisgICAgeworICAgICAgICBsYXlvdXQgPSBsYXllcl9kYXRhLT5VbndyYXAobGF5b3V0KTsKKyAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzKSB7CisgICAgICAgICAgICBsb2NhbF9wRGVzY3JpcHRvcldyaXRlcyA9IG5ldyBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0W2Rlc2NyaXB0b3JXcml0ZUNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgZGVzY3JpcHRvcldyaXRlQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5pbml0aWFsaXplKCZwRGVzY3JpcHRvcldyaXRlc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wTmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZHN0U2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZHN0U2V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZHN0U2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mbykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZGVzY3JpcHRvckNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mb1tpbmRleDFdLnNhbXBsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wRGVzY3JpcHRvcldyaXRlc1tpbmRleDBdLnBJbWFnZUluZm9baW5kZXgxXS5zYW1wbGVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mb1tpbmRleDFdLnNhbXBsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mb1tpbmRleDFdLmltYWdlVmlldykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEltYWdlSW5mb1tpbmRleDFdLmltYWdlVmlldyA9IGxheWVyX2RhdGEtPlVud3JhcChwRGVzY3JpcHRvcldyaXRlc1tpbmRleDBdLnBJbWFnZUluZm9baW5kZXgxXS5pbWFnZVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2NhbF9wRGVzY3JpcHRvcldyaXRlc1tpbmRleDBdLnBCdWZmZXJJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5kZXNjcmlwdG9yQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wQnVmZmVySW5mb1tpbmRleDFdLmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucEJ1ZmZlckluZm9baW5kZXgxXS5idWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAocERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wQnVmZmVySW5mb1tpbmRleDFdLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0ucFRleGVsQnVmZmVyVmlldykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0uZGVzY3JpcHRvckNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wVGV4ZWxCdWZmZXJWaWV3W2luZGV4MV0gPSBsYXllcl9kYXRhLT5VbndyYXAobG9jYWxfcERlc2NyaXB0b3JXcml0ZXNbaW5kZXgwXS5wVGV4ZWxCdWZmZXJWaWV3W2luZGV4MV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRQdXNoRGVzY3JpcHRvclNldEtIUihjb21tYW5kQnVmZmVyLCBwaXBlbGluZUJpbmRQb2ludCwgbGF5b3V0LCBzZXQsIGRlc2NyaXB0b3JXcml0ZUNvdW50LCAoY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqKWxvY2FsX3BEZXNjcmlwdG9yV3JpdGVzKTsKKyAgICBpZiAobG9jYWxfcERlc2NyaXB0b3JXcml0ZXMpIHsKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcERlc2NyaXB0b3JXcml0ZXM7CisgICAgfQorfQorCisvLyBTa2lwIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworLy8gU2tpcCB2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKKy8vIFNraXAgdmtDcmVhdGVSZW5kZXJQYXNzMktIUiBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKK3ZvaWQgRGlzcGF0Y2hDbWRCZWdpblJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJlZ2luUmVuZGVyUGFzczJLSFIoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgcFN1YnBhc3NCZWdpbkluZm8pOworICAgIHNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHZhcl9sb2NhbF9wUmVuZGVyUGFzc0JlZ2luOworICAgIHNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpsb2NhbF9wUmVuZGVyUGFzc0JlZ2luID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwUmVuZGVyUGFzc0JlZ2luKSB7CisgICAgICAgICAgICBsb2NhbF9wUmVuZGVyUGFzc0JlZ2luID0gJnZhcl9sb2NhbF9wUmVuZGVyUGFzc0JlZ2luOworICAgICAgICAgICAgbG9jYWxfcFJlbmRlclBhc3NCZWdpbi0+aW5pdGlhbGl6ZShwUmVuZGVyUGFzc0JlZ2luKTsKKyAgICAgICAgICAgIGlmIChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFJlbmRlclBhc3NCZWdpbi0+cmVuZGVyUGFzcyA9IGxheWVyX2RhdGEtPlVud3JhcChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwUmVuZGVyUGFzc0JlZ2luLT5mcmFtZWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGxvY2FsX3BSZW5kZXJQYXNzQmVnaW4tPmZyYW1lYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBSZW5kZXJQYXNzQmVnaW4tPmZyYW1lYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdyYXBQbmV4dENoYWluSGFuZGxlcyhsYXllcl9kYXRhLCBsb2NhbF9wUmVuZGVyUGFzc0JlZ2luLT5wTmV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJlZ2luUmVuZGVyUGFzczJLSFIoY29tbWFuZEJ1ZmZlciwgKGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyopbG9jYWxfcFJlbmRlclBhc3NCZWdpbiwgcFN1YnBhc3NCZWdpbkluZm8pOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWROZXh0U3VicGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICAgICAgICAgICAgcFN1YnBhc3NCZWdpbkluZm8sCisgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgICAgICAgICAgICBwU3VicGFzc0VuZEluZm8pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kTmV4dFN1YnBhc3MyS0hSKGNvbW1hbmRCdWZmZXIsIHBTdWJwYXNzQmVnaW5JbmZvLCBwU3VicGFzc0VuZEluZm8pOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRFbmRSZW5kZXJQYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgICAgICAgICAgICBwU3VicGFzc0VuZEluZm8pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRW5kUmVuZGVyUGFzczJLSFIoY29tbWFuZEJ1ZmZlciwgcFN1YnBhc3NFbmRJbmZvKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFN3YXBjaGFpblN0YXR1c0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0U3dhcGNoYWluU3RhdHVzS0hSKGRldmljZSwgc3dhcGNoYWluKTsKKyAgICB7CisgICAgICAgIHN3YXBjaGFpbiA9IGxheWVyX2RhdGEtPlVud3JhcChzd2FwY2hhaW4pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0U3dhcGNoYWluU3RhdHVzS0hSKGRldmljZSwgc3dhcGNoYWluKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcEV4dGVybmFsRmVuY2VJbmZvLCBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOworCit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZrUmVzdWx0IERpc3BhdGNoSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiAgICAgIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUihkZXZpY2UsIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbyk7CisgICAgc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIHZhcl9sb2NhbF9wSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm87CisgICAgc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICpsb2NhbF9wSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvID0gJnZhcl9sb2NhbF9wSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm87CisgICAgICAgICAgICBsb2NhbF9wSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8tPmluaXRpYWxpemUocEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8tPmZlbmNlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLT5mZW5jZSA9IGxheWVyX2RhdGEtPlVud3JhcChwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8tPmZlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUihkZXZpY2UsIChjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKilsb2NhbF9wSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRGZW5jZVdpbjMySGFuZGxlS0hSKGRldmljZSwgcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSk7CisgICAgc2FmZV9Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSIHZhcl9sb2NhbF9wR2V0V2luMzJIYW5kbGVJbmZvOworICAgIHNhZmVfVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiAqbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEdldFdpbjMySGFuZGxlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mbyA9ICZ2YXJfbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BHZXRXaW4zMkhhbmRsZUluZm8tPmluaXRpYWxpemUocEdldFdpbjMySGFuZGxlSW5mbyk7CisgICAgICAgICAgICBpZiAocEdldFdpbjMySGFuZGxlSW5mby0+ZmVuY2UpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wR2V0V2luMzJIYW5kbGVJbmZvLT5mZW5jZSA9IGxheWVyX2RhdGEtPlVud3JhcChwR2V0V2luMzJIYW5kbGVJbmZvLT5mZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEZlbmNlV2luMzJIYW5kbGVLSFIoZGV2aWNlLCAoY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiopbG9jYWxfcEdldFdpbjMySGFuZGxlSW5mbywgcEhhbmRsZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hJbXBvcnRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqICAgICAgICAgICAgICAgcEltcG9ydEZlbmNlRmRJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5JbXBvcnRGZW5jZUZkS0hSKGRldmljZSwgcEltcG9ydEZlbmNlRmRJbmZvKTsKKyAgICBzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFIgdmFyX2xvY2FsX3BJbXBvcnRGZW5jZUZkSW5mbzsKKyAgICBzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFIgKmxvY2FsX3BJbXBvcnRGZW5jZUZkSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEltcG9ydEZlbmNlRmRJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wSW1wb3J0RmVuY2VGZEluZm8gPSAmdmFyX2xvY2FsX3BJbXBvcnRGZW5jZUZkSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BJbXBvcnRGZW5jZUZkSW5mby0+aW5pdGlhbGl6ZShwSW1wb3J0RmVuY2VGZEluZm8pOworICAgICAgICAgICAgaWYgKHBJbXBvcnRGZW5jZUZkSW5mby0+ZmVuY2UpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wSW1wb3J0RmVuY2VGZEluZm8tPmZlbmNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbXBvcnRGZW5jZUZkSW5mby0+ZmVuY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5JbXBvcnRGZW5jZUZkS0hSKGRldmljZSwgKGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqKWxvY2FsX3BJbXBvcnRGZW5jZUZkSW5mbyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRGZW5jZUZkS0hSKGRldmljZSwgcEdldEZkSW5mbywgcEZkKTsKKyAgICBzYWZlX1ZrRmVuY2VHZXRGZEluZm9LSFIgdmFyX2xvY2FsX3BHZXRGZEluZm87CisgICAgc2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSICpsb2NhbF9wR2V0RmRJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwR2V0RmRJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wR2V0RmRJbmZvID0gJnZhcl9sb2NhbF9wR2V0RmRJbmZvOworICAgICAgICAgICAgbG9jYWxfcEdldEZkSW5mby0+aW5pdGlhbGl6ZShwR2V0RmRJbmZvKTsKKyAgICAgICAgICAgIGlmIChwR2V0RmRJbmZvLT5mZW5jZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BHZXRGZEluZm8tPmZlbmNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBHZXRGZEluZm8tPmZlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0RmVuY2VGZEtIUihkZXZpY2UsIChjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKilsb2NhbF9wR2V0RmRJbmZvLCBwRmQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJDb3VudCwKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogICAgICAgICAgICAgICAgICAgIHBDb3VudGVycywKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiAgICAgICAgIHBDb3VudGVyRGVzY3JpcHRpb25zKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHBDb3VudGVyQ291bnQsIHBDb3VudGVycywgcENvdW50ZXJEZXNjcmlwdGlvbnMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqICBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtUGFzc2VzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKHBoeXNpY2FsRGV2aWNlLCBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sIHBOdW1QYXNzZXMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqICAgICAgICBwSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKGRldmljZSwgcEluZm8pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaFJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoZGV2aWNlKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFN1cmZhY2VJbmZvLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIHZhcl9sb2NhbF9wU3VyZmFjZUluZm87CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICpsb2NhbF9wU3VyZmFjZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBTdXJmYWNlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcFN1cmZhY2VJbmZvID0gJnZhcl9sb2NhbF9wU3VyZmFjZUluZm87CisgICAgICAgICAgICBsb2NhbF9wU3VyZmFjZUluZm8tPmluaXRpYWxpemUocFN1cmZhY2VJbmZvKTsKKyAgICAgICAgICAgIGlmIChwU3VyZmFjZUluZm8tPnN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wU3VyZmFjZUluZm8tPnN1cmZhY2UgPSBsYXllcl9kYXRhLT5VbndyYXAocFN1cmZhY2VJbmZvLT5zdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCAoY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiopbG9jYWxfcFN1cmZhY2VJbmZvLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdDJLSFIqICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIocGh5c2ljYWxEZXZpY2UsIHBTdXJmYWNlSW5mbywgcFN1cmZhY2VGb3JtYXRDb3VudCwgcFN1cmZhY2VGb3JtYXRzKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgdmFyX2xvY2FsX3BTdXJmYWNlSW5mbzsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgKmxvY2FsX3BTdXJmYWNlSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocFN1cmZhY2VJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wU3VyZmFjZUluZm8gPSAmdmFyX2xvY2FsX3BTdXJmYWNlSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BTdXJmYWNlSW5mby0+aW5pdGlhbGl6ZShwU3VyZmFjZUluZm8pOworICAgICAgICAgICAgaWYgKHBTdXJmYWNlSW5mby0+c3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BTdXJmYWNlSW5mby0+c3VyZmFjZSA9IGxheWVyX2RhdGEtPlVud3JhcChwU3VyZmFjZUluZm8tPnN1cmZhY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKHBoeXNpY2FsRGV2aWNlLCAoY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiopbG9jYWxfcFN1cmZhY2VJbmZvLCBwU3VyZmFjZUZvcm1hdENvdW50LCBwU3VyZmFjZUZvcm1hdHMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gU2tpcCB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworLy8gU2tpcCB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIqICAgICAgICAgICAgICAgcERpc3BsYXlQbGFuZUluZm8sCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUihwaHlzaWNhbERldmljZSwgcERpc3BsYXlQbGFuZUluZm8sIHBDYXBhYmlsaXRpZXMpOworICAgIHNhZmVfVmtEaXNwbGF5UGxhbmVJbmZvMktIUiB2YXJfbG9jYWxfcERpc3BsYXlQbGFuZUluZm87CisgICAgc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSICpsb2NhbF9wRGlzcGxheVBsYW5lSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocERpc3BsYXlQbGFuZUluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BEaXNwbGF5UGxhbmVJbmZvID0gJnZhcl9sb2NhbF9wRGlzcGxheVBsYW5lSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BEaXNwbGF5UGxhbmVJbmZvLT5pbml0aWFsaXplKHBEaXNwbGF5UGxhbmVJbmZvKTsKKyAgICAgICAgICAgIGlmIChwRGlzcGxheVBsYW5lSW5mby0+bW9kZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BEaXNwbGF5UGxhbmVJbmZvLT5tb2RlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBEaXNwbGF5UGxhbmVJbmZvLT5tb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKHBoeXNpY2FsRGV2aWNlLCAoY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiopbG9jYWxfcERpc3BsYXlQbGFuZUluZm8sIHBDYXBhYmlsaXRpZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHNhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIHZhcl9sb2NhbF9wSW5mbzsKKyAgICBzYWZlX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAqbG9jYWxfcEluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wSW5mbyA9ICZ2YXJfbG9jYWxfcEluZm87CisgICAgICAgICAgICBsb2NhbF9wSW5mby0+aW5pdGlhbGl6ZShwSW5mbyk7CisgICAgICAgICAgICBpZiAocEluZm8tPmltYWdlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEluZm8tPmltYWdlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbmZvLT5pbWFnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihkZXZpY2UsIChjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqKWxvY2FsX3BJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKworfQorCit2b2lkIERpc3BhdGNoR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUihkZXZpY2UsIHBJbmZvLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICBzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgdmFyX2xvY2FsX3BJbmZvOworICAgIHNhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAqbG9jYWxfcEluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wSW5mbyA9ICZ2YXJfbG9jYWxfcEluZm87CisgICAgICAgICAgICBsb2NhbF9wSW5mby0+aW5pdGlhbGl6ZShwSW5mbyk7CisgICAgICAgICAgICBpZiAocEluZm8tPmJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5idWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAocEluZm8tPmJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCAoY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiopbG9jYWxfcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKGRldmljZSwgcEluZm8sIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICBzYWZlX1ZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB2YXJfbG9jYWxfcEluZm87CisgICAgc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKmxvY2FsX3BJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEluZm8gPSAmdmFyX2xvY2FsX3BJbmZvOworICAgICAgICAgICAgbG9jYWxfcEluZm8tPmluaXRpYWxpemUocEluZm8pOworICAgICAgICAgICAgaWYgKHBJbmZvLT5pbWFnZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5pbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChwSW5mby0+aW1hZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoZGV2aWNlLCAoY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKilsb2NhbF9wSW5mbywgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFljYmNyQ29udmVyc2lvbik7CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvIHZhcl9sb2NhbF9wQ3JlYXRlSW5mbzsKKyAgICBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8gPSAmdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmluaXRpYWxpemUocENyZWF0ZUluZm8pOworICAgICAgICAgICAgV3JhcFBuZXh0Q2hhaW5IYW5kbGVzKGxheWVyX2RhdGEsIGxvY2FsX3BDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoZGV2aWNlLCAoY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyopbG9jYWxfcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBZY2JjckNvbnZlcnNpb24pOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFljYmNyQ29udmVyc2lvbiA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBZY2JjckNvbnZlcnNpb24pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihkZXZpY2UsIHljYmNyQ29udmVyc2lvbiwgcEFsbG9jYXRvcik7CisgICAgdWludDY0X3QgeWNiY3JDb252ZXJzaW9uX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPih5Y2JjckNvbnZlcnNpb24pOworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcCh5Y2JjckNvbnZlcnNpb25faWQpOworICAgIGlmIChpdGVyICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgIHljYmNyQ29udmVyc2lvbiA9IChWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24paXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHljYmNyQ29udmVyc2lvbiA9IChWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24pMDsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKGRldmljZSwgeWNiY3JDb252ZXJzaW9uLCBwQWxsb2NhdG9yKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEJpbmRCdWZmZXJNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkJpbmRCdWZmZXJNZW1vcnkyS0hSKGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcyk7CisgICAgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvICpsb2NhbF9wQmluZEluZm9zID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQmluZEluZm9zKSB7CisgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zID0gbmV3IHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5SW5mb1tiaW5kSW5mb0NvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgYmluZEluZm9Db3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0uaW5pdGlhbGl6ZSgmcEJpbmRJbmZvc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvc1tpbmRleDBdLmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0uYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCaW5kSW5mb3NbaW5kZXgwXS5idWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvc1tpbmRleDBdLm1lbW9yeSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0ubWVtb3J5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCaW5kSW5mb3NbaW5kZXgwXS5tZW1vcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQmluZEJ1ZmZlck1lbW9yeTJLSFIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCAoY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyopbG9jYWxfcEJpbmRJbmZvcyk7CisgICAgaWYgKGxvY2FsX3BCaW5kSW5mb3MpIHsKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcEJpbmRJbmZvczsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkJpbmRJbWFnZU1lbW9yeTJLSFIoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zKTsKKyAgICBzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbyAqbG9jYWxfcEJpbmRJbmZvcyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEJpbmRJbmZvcykgeworICAgICAgICAgICAgbG9jYWxfcEJpbmRJbmZvcyA9IG5ldyBzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mb1tiaW5kSW5mb0NvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgYmluZEluZm9Db3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0uaW5pdGlhbGl6ZSgmcEJpbmRJbmZvc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfcEJpbmRJbmZvc1tpbmRleDBdLnBOZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvc1tpbmRleDBdLmltYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BCaW5kSW5mb3NbaW5kZXgwXS5pbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQmluZEluZm9zW2luZGV4MF0uaW1hZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvc1tpbmRleDBdLm1lbW9yeSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zW2luZGV4MF0ubWVtb3J5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCaW5kSW5mb3NbaW5kZXgwXS5tZW1vcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQmluZEltYWdlTWVtb3J5MktIUihkZXZpY2UsIGJpbmRJbmZvQ291bnQsIChjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qKWxvY2FsX3BCaW5kSW5mb3MpOworICAgIGlmIChsb2NhbF9wQmluZEluZm9zKSB7CisgICAgICAgIGRlbGV0ZVtdIGxvY2FsX3BCaW5kSW5mb3M7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqICAgICAgICAgICAgICAgcFN1cHBvcnQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9ICZ2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgICAgICBpZiAobG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5ncykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcENyZWF0ZUluZm8tPmJpbmRpbmdDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BDcmVhdGVJbmZvLT5wQmluZGluZ3NbaW5kZXgxXS5wSW1tdXRhYmxlU2FtcGxlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyID0gMDsgaW5kZXgyIDwgbG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpbmRleDFdLmRlc2NyaXB0b3JDb3VudDsgKytpbmRleDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2luZGV4MV0ucEltbXV0YWJsZVNhbXBsZXJzW2luZGV4Ml0gPSBsYXllcl9kYXRhLT5VbndyYXAobG9jYWxfcENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpbmRleDFdLnBJbW11dGFibGVTYW1wbGVyc1tpbmRleDJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoZGV2aWNlLCAoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyopbG9jYWxfcENyZWF0ZUluZm8sIHBTdXBwb3J0KTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdJbmRpcmVjdENvdW50S0hSKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChidWZmZXIpOworICAgICAgICBjb3VudEJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChjb3VudEJ1ZmZlcik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREcmF3SW5kaXJlY3RDb3VudEtIUihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChidWZmZXIpOworICAgICAgICBjb3VudEJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChjb3VudEJ1ZmZlcik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoZGV2aWNlLCBzZW1hcGhvcmUsIHBWYWx1ZSk7CisgICAgeworICAgICAgICBzZW1hcGhvcmUgPSBsYXllcl9kYXRhLT5VbndyYXAoc2VtYXBob3JlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUihkZXZpY2UsIHNlbWFwaG9yZSwgcFZhbHVlKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoV2FpdFNlbWFwaG9yZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiogICAgICAgICAgICAgICBwV2FpdEluZm8sCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5XYWl0U2VtYXBob3Jlc0tIUihkZXZpY2UsIHBXYWl0SW5mbywgdGltZW91dCk7CisgICAgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSIHZhcl9sb2NhbF9wV2FpdEluZm87CisgICAgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSICpsb2NhbF9wV2FpdEluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBXYWl0SW5mbykgeworICAgICAgICAgICAgbG9jYWxfcFdhaXRJbmZvID0gJnZhcl9sb2NhbF9wV2FpdEluZm87CisgICAgICAgICAgICBsb2NhbF9wV2FpdEluZm8tPmluaXRpYWxpemUocFdhaXRJbmZvKTsKKyAgICAgICAgICAgIGlmIChsb2NhbF9wV2FpdEluZm8tPnBTZW1hcGhvcmVzKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBsb2NhbF9wV2FpdEluZm8tPnNlbWFwaG9yZUNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wV2FpdEluZm8tPnBTZW1hcGhvcmVzW2luZGV4MV0gPSBsYXllcl9kYXRhLT5VbndyYXAobG9jYWxfcFdhaXRJbmZvLT5wU2VtYXBob3Jlc1tpbmRleDFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLldhaXRTZW1hcGhvcmVzS0hSKGRldmljZSwgKGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqKWxvY2FsX3BXYWl0SW5mbywgdGltZW91dCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFNpZ25hbFNlbWFwaG9yZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqICAgICAgICAgICAgIHBTaWduYWxJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TaWduYWxTZW1hcGhvcmVLSFIoZGV2aWNlLCBwU2lnbmFsSW5mbyk7CisgICAgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgdmFyX2xvY2FsX3BTaWduYWxJbmZvOworICAgIHNhZmVfVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSICpsb2NhbF9wU2lnbmFsSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocFNpZ25hbEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BTaWduYWxJbmZvID0gJnZhcl9sb2NhbF9wU2lnbmFsSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BTaWduYWxJbmZvLT5pbml0aWFsaXplKHBTaWduYWxJbmZvKTsKKyAgICAgICAgICAgIGlmIChwU2lnbmFsSW5mby0+c2VtYXBob3JlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFNpZ25hbEluZm8tPnNlbWFwaG9yZSA9IGxheWVyX2RhdGEtPlVud3JhcChwU2lnbmFsSW5mby0+c2VtYXBob3JlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuU2lnbmFsU2VtYXBob3JlS0hSKGRldmljZSwgKGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiopbG9jYWxfcFNpZ25hbEluZm8pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtEZXZpY2VBZGRyZXNzIERpc3BhdGNoR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKGRldmljZSwgcEluZm8pOworICAgIHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiB2YXJfbG9jYWxfcEluZm87CisgICAgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSICpsb2NhbF9wSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvID0gJnZhcl9sb2NhbF9wSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5pbml0aWFsaXplKHBJbmZvKTsKKyAgICAgICAgICAgIGlmIChwSW5mby0+YnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEluZm8tPmJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChwSW5mby0+YnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa0RldmljZUFkZHJlc3MgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoZGV2aWNlLCAoY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiopbG9jYWxfcEluZm8pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDY0X3QgRGlzcGF0Y2hHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUihkZXZpY2UsIHBJbmZvKTsKKyAgICBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgdmFyX2xvY2FsX3BJbmZvOworICAgIHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiAqbG9jYWxfcEluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wSW5mbyA9ICZ2YXJfbG9jYWxfcEluZm87CisgICAgICAgICAgICBsb2NhbF9wSW5mby0+aW5pdGlhbGl6ZShwSW5mbyk7CisgICAgICAgICAgICBpZiAocEluZm8tPmJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5idWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAocEluZm8tPmJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDY0X3QgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKGRldmljZSwgKGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqKWxvY2FsX3BJbmZvKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQ2NF90IERpc3BhdGNoR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUihkZXZpY2UsIHBJbmZvKTsKKyAgICBzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSIHZhcl9sb2NhbF9wSW5mbzsKKyAgICBzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSICpsb2NhbF9wSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvID0gJnZhcl9sb2NhbF9wSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5pbml0aWFsaXplKHBJbmZvKTsKKyAgICAgICAgICAgIGlmIChwSW5mby0+bWVtb3J5KSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEluZm8tPm1lbW9yeSA9IGxheWVyX2RhdGEtPlVud3JhcChwSW5mby0+bWVtb3J5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50NjRfdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoZGV2aWNlLCAoY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqKWxvY2FsX3BJbmZvKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiogICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXhlY3V0YWJsZUNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogICAgICAgICAgcFByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoZGV2aWNlLCBwUGlwZWxpbmVJbmZvLCBwRXhlY3V0YWJsZUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lSW5mb0tIUiB2YXJfbG9jYWxfcFBpcGVsaW5lSW5mbzsKKyAgICBzYWZlX1ZrUGlwZWxpbmVJbmZvS0hSICpsb2NhbF9wUGlwZWxpbmVJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwUGlwZWxpbmVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wUGlwZWxpbmVJbmZvID0gJnZhcl9sb2NhbF9wUGlwZWxpbmVJbmZvOworICAgICAgICAgICAgbG9jYWxfcFBpcGVsaW5lSW5mby0+aW5pdGlhbGl6ZShwUGlwZWxpbmVJbmZvKTsKKyAgICAgICAgICAgIGlmIChwUGlwZWxpbmVJbmZvLT5waXBlbGluZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BQaXBlbGluZUluZm8tPnBpcGVsaW5lID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBQaXBlbGluZUluZm8tPnBpcGVsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihkZXZpY2UsIChjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiopbG9jYWxfcFBpcGVsaW5lSW5mbywgcEV4ZWN1dGFibGVDb3VudCwgcFByb3BlcnRpZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogICAgICAgICAgcEV4ZWN1dGFibGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YXRpc3RpY0NvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiAgICAgICAgICAgcFN0YXRpc3RpY3MpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoZGV2aWNlLCBwRXhlY3V0YWJsZUluZm8sIHBTdGF0aXN0aWNDb3VudCwgcFN0YXRpc3RpY3MpOworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIHZhcl9sb2NhbF9wRXhlY3V0YWJsZUluZm87CisgICAgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgKmxvY2FsX3BFeGVjdXRhYmxlSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEV4ZWN1dGFibGVJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wRXhlY3V0YWJsZUluZm8gPSAmdmFyX2xvY2FsX3BFeGVjdXRhYmxlSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BFeGVjdXRhYmxlSW5mby0+aW5pdGlhbGl6ZShwRXhlY3V0YWJsZUluZm8pOworICAgICAgICAgICAgaWYgKHBFeGVjdXRhYmxlSW5mby0+cGlwZWxpbmUpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wRXhlY3V0YWJsZUluZm8tPnBpcGVsaW5lID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBFeGVjdXRhYmxlSW5mby0+cGlwZWxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKGRldmljZSwgKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiopbG9jYWxfcEV4ZWN1dGFibGVJbmZvLCBwU3RhdGlzdGljQ291bnQsIHBTdGF0aXN0aWNzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUihkZXZpY2UsIHBFeGVjdXRhYmxlSW5mbywgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgcEludGVybmFsUmVwcmVzZW50YXRpb25zKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiB2YXJfbG9jYWxfcEV4ZWN1dGFibGVJbmZvOworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSICpsb2NhbF9wRXhlY3V0YWJsZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBFeGVjdXRhYmxlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEV4ZWN1dGFibGVJbmZvID0gJnZhcl9sb2NhbF9wRXhlY3V0YWJsZUluZm87CisgICAgICAgICAgICBsb2NhbF9wRXhlY3V0YWJsZUluZm8tPmluaXRpYWxpemUocEV4ZWN1dGFibGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChwRXhlY3V0YWJsZUluZm8tPnBpcGVsaW5lKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEV4ZWN1dGFibGVJbmZvLT5waXBlbGluZSA9IGxheWVyX2RhdGEtPlVud3JhcChwRXhlY3V0YWJsZUluZm8tPnBpcGVsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoZGV2aWNlLCAoY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKilsb2NhbF9wRXhlY3V0YWJsZUluZm8sIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqICAgICAgICAgICAgICAgICAgIHBDYWxsYmFjaykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ2FsbGJhY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ2FsbGJhY2spOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcENhbGxiYWNrID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcENhbGxiYWNrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaERlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChpbnN0YW5jZSwgY2FsbGJhY2ssIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IGNhbGxiYWNrX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihjYWxsYmFjayk7CisgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcucG9wKGNhbGxiYWNrX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBjYWxsYmFjayA9IChWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGxiYWNrID0gKFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChpbnN0YW5jZSwgY2FsbGJhY2ssIHBBbGxvY2F0b3IpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvZGUsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJQcmVmaXgsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVzc2FnZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5EZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoaW5zdGFuY2UsIGZsYWdzLCBvYmplY3RUeXBlLCBvYmplY3QsIGxvY2F0aW9uLCBtZXNzYWdlQ29kZSwgcExheWVyUHJlZml4LCBwTWVzc2FnZSk7CisKK30KKworLy8gU2tpcCB2a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUIGRpc3BhdGNoLCBtYW51YWxseSBnZW5lcmF0ZWQKKworLy8gU2tpcCB2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKK3ZvaWQgRGlzcGF0Y2hDbWREZWJ1Z01hcmtlckJlZ2luRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogICAgICAgICAgIHBNYXJrZXJJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERlYnVnTWFya2VyQmVnaW5FWFQoY29tbWFuZEJ1ZmZlciwgcE1hcmtlckluZm8pOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWREZWJ1Z01hcmtlckVuZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRGVidWdNYXJrZXJFbmRFWFQoY29tbWFuZEJ1ZmZlcik7CisKK30KKwordm9pZCBEaXNwYXRjaENtZERlYnVnTWFya2VySW5zZXJ0RVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogICAgICAgICAgIHBNYXJrZXJJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERlYnVnTWFya2VySW5zZXJ0RVhUKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcFNpemVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVChjb21tYW5kQnVmZmVyLCBmaXJzdEJpbmRpbmcsIGJpbmRpbmdDb3VudCwgcEJ1ZmZlcnMsIHBPZmZzZXRzLCBwU2l6ZXMpOworICAgIFZrQnVmZmVyIHZhcl9sb2NhbF9wQnVmZmVyc1tESVNQQVRDSF9NQVhfU1RBQ0tfQUxMT0NBVElPTlNdOworICAgIFZrQnVmZmVyICpsb2NhbF9wQnVmZmVycyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGxvY2FsX3BCdWZmZXJzID0gYmluZGluZ0NvdW50ID4gRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TID8gbmV3IFZrQnVmZmVyW2JpbmRpbmdDb3VudF0gOiB2YXJfbG9jYWxfcEJ1ZmZlcnM7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGJpbmRpbmdDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wQnVmZmVyc1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBCdWZmZXJzW2luZGV4MF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKGNvbW1hbmRCdWZmZXIsIGZpcnN0QmluZGluZywgYmluZGluZ0NvdW50LCAoY29uc3QgVmtCdWZmZXIqKWxvY2FsX3BCdWZmZXJzLCBwT2Zmc2V0cywgcFNpemVzKTsKKyAgICBpZiAobG9jYWxfcEJ1ZmZlcnMgIT0gdmFyX2xvY2FsX3BCdWZmZXJzKQorICAgICAgICBkZWxldGVbXSBsb2NhbF9wQnVmZmVyczsKK30KKwordm9pZCBEaXNwYXRjaENtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVChjb21tYW5kQnVmZmVyLCBmaXJzdENvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJDb3VudCwgcENvdW50ZXJCdWZmZXJzLCBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworICAgIFZrQnVmZmVyIHZhcl9sb2NhbF9wQ291bnRlckJ1ZmZlcnNbRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TXTsKKyAgICBWa0J1ZmZlciAqbG9jYWxfcENvdW50ZXJCdWZmZXJzID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQ291bnRlckJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGxvY2FsX3BDb3VudGVyQnVmZmVycyA9IGNvdW50ZXJCdWZmZXJDb3VudCA+IERJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OUyA/IG5ldyBWa0J1ZmZlcltjb3VudGVyQnVmZmVyQ291bnRdIDogdmFyX2xvY2FsX3BDb3VudGVyQnVmZmVyczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgY291bnRlckJ1ZmZlckNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BDb3VudGVyQnVmZmVyc1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDb3VudGVyQnVmZmVyc1tpbmRleDBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVChjb21tYW5kQnVmZmVyLCBmaXJzdENvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJDb3VudCwgKGNvbnN0IFZrQnVmZmVyKilsb2NhbF9wQ291bnRlckJ1ZmZlcnMsIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyk7CisgICAgaWYgKGxvY2FsX3BDb3VudGVyQnVmZmVycyAhPSB2YXJfbG9jYWxfcENvdW50ZXJCdWZmZXJzKQorICAgICAgICBkZWxldGVbXSBsb2NhbF9wQ291bnRlckJ1ZmZlcnM7Cit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVChjb21tYW5kQnVmZmVyLCBmaXJzdENvdW50ZXJCdWZmZXIsIGNvdW50ZXJCdWZmZXJDb3VudCwgcENvdW50ZXJCdWZmZXJzLCBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworICAgIFZrQnVmZmVyIHZhcl9sb2NhbF9wQ291bnRlckJ1ZmZlcnNbRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TXTsKKyAgICBWa0J1ZmZlciAqbG9jYWxfcENvdW50ZXJCdWZmZXJzID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQ291bnRlckJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGxvY2FsX3BDb3VudGVyQnVmZmVycyA9IGNvdW50ZXJCdWZmZXJDb3VudCA+IERJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OUyA/IG5ldyBWa0J1ZmZlcltjb3VudGVyQnVmZmVyQ291bnRdIDogdmFyX2xvY2FsX3BDb3VudGVyQnVmZmVyczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgY291bnRlckJ1ZmZlckNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BDb3VudGVyQnVmZmVyc1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDb3VudGVyQnVmZmVyc1tpbmRleDBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoY29tbWFuZEJ1ZmZlciwgZmlyc3RDb3VudGVyQnVmZmVyLCBjb3VudGVyQnVmZmVyQ291bnQsIChjb25zdCBWa0J1ZmZlciopbG9jYWxfcENvdW50ZXJCdWZmZXJzLCBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworICAgIGlmIChsb2NhbF9wQ291bnRlckJ1ZmZlcnMgIT0gdmFyX2xvY2FsX3BDb3VudGVyQnVmZmVycykKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcENvdW50ZXJCdWZmZXJzOworfQorCit2b2lkIERpc3BhdGNoQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgZmxhZ3MsIGluZGV4KTsKKyAgICB7CisgICAgICAgIHF1ZXJ5UG9vbCA9IGxheWVyX2RhdGEtPlVud3JhcChxdWVyeVBvb2wpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgZmxhZ3MsIGluZGV4KTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRFbmRRdWVyeUluZGV4ZWRFWFQoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgaW5kZXgpOworICAgIHsKKyAgICAgICAgcXVlcnlQb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKHF1ZXJ5UG9vbCk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRFbmRRdWVyeUluZGV4ZWRFWFQoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBxdWVyeSwgaW5kZXgpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoY29tbWFuZEJ1ZmZlciwgaW5zdGFuY2VDb3VudCwgZmlyc3RJbnN0YW5jZSwgY291bnRlckJ1ZmZlciwgY291bnRlckJ1ZmZlck9mZnNldCwgY291bnRlck9mZnNldCwgdmVydGV4U3RyaWRlKTsKKyAgICB7CisgICAgICAgIGNvdW50ZXJCdWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoY291bnRlckJ1ZmZlcik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoY29tbWFuZEJ1ZmZlciwgaW5zdGFuY2VDb3VudCwgZmlyc3RJbnN0YW5jZSwgY291bnRlckJ1ZmZlciwgY291bnRlckJ1ZmZlck9mZnNldCwgY291bnRlck9mZnNldCwgdmVydGV4U3RyaWRlKTsKKworfQorCit1aW50MzJfdCBEaXNwYXRjaEdldEltYWdlVmlld0hhbmRsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqICAgICAgICAgICAgIHBJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZVZpZXdIYW5kbGVOVlgoZGV2aWNlLCBwSW5mbyk7CisgICAgc2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlggdmFyX2xvY2FsX3BJbmZvOworICAgIHNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYICpsb2NhbF9wSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvID0gJnZhcl9sb2NhbF9wSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5pbml0aWFsaXplKHBJbmZvKTsKKyAgICAgICAgICAgIGlmIChwSW5mby0+aW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEluZm8tPmltYWdlVmlldyA9IGxheWVyX2RhdGEtPlVud3JhcChwSW5mby0+aW1hZ2VWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwSW5mby0+c2FtcGxlcikgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5zYW1wbGVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbmZvLT5zYW1wbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKGRldmljZSwgKGNvbnN0IFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCopbG9jYWxfcEluZm8pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaENtZERyYXdJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWREcmF3SW5kaXJlY3RDb3VudEFNRChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgeworICAgICAgICBidWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoYnVmZmVyKTsKKyAgICAgICAgY291bnRCdWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoY291bnRCdWZmZXIpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgeworICAgICAgICBidWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoYnVmZmVyKTsKKyAgICAgICAgY291bnRCdWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoY291bnRCdWZmZXIpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudEJ1ZmZlciwgY291bnRCdWZmZXJPZmZzZXQsIG1heERyYXdDb3VudCwgc3RyaWRlKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFNoYWRlckluZm9BTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0YWdlLAorICAgIFZrU2hhZGVySW5mb1R5cGVBTUQgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mb1NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0U2hhZGVySW5mb0FNRChkZXZpY2UsIHBpcGVsaW5lLCBzaGFkZXJTdGFnZSwgaW5mb1R5cGUsIHBJbmZvU2l6ZSwgcEluZm8pOworICAgIHsKKyAgICAgICAgcGlwZWxpbmUgPSBsYXllcl9kYXRhLT5VbndyYXAocGlwZWxpbmUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0U2hhZGVySW5mb0FNRChkZXZpY2UsIHBpcGVsaW5lLCBzaGFkZXJTdGFnZSwgaW5mb1R5cGUsIHBJbmZvU2l6ZSwgcEluZm8pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFN1cmZhY2UgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU3VyZmFjZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VDcmVhdGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBleHRlcm5hbEhhbmRsZVR5cGUsCisgICAgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKiAgICAgICAgICBwRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHR5cGUsIHRpbGluZywgdXNhZ2UsIGZsYWdzLCBleHRlcm5hbEhhbmRsZVR5cGUsIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitWa1Jlc3VsdCBEaXNwYXRjaEdldE1lbW9yeVdpbjMySGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0TWVtb3J5V2luMzJIYW5kbGVOVihkZXZpY2UsIG1lbW9yeSwgaGFuZGxlVHlwZSwgcEhhbmRsZSk7CisgICAgeworICAgICAgICBtZW1vcnkgPSBsYXllcl9kYXRhLT5VbndyYXAobWVtb3J5KTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldE1lbW9yeVdpbjMySGFuZGxlTlYoZGV2aWNlLCBtZW1vcnksIGhhbmRsZVR5cGUsIHBIYW5kbGUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVWaVN1cmZhY2VOTihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVWaVN1cmZhY2VOTihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBTdXJmYWNlID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFN1cmZhY2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCit2b2lkIERpc3BhdGNoQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogICBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoY29tbWFuZEJ1ZmZlciwgcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pOworICAgIHNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCB2YXJfbG9jYWxfcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW47CisgICAgc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUICpsb2NhbF9wQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbiA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pIHsKKyAgICAgICAgICAgIGxvY2FsX3BDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luID0gJnZhcl9sb2NhbF9wQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbjsKKyAgICAgICAgICAgIGxvY2FsX3BDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLT5pbml0aWFsaXplKHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKTsKKyAgICAgICAgICAgIGlmIChwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbi0+YnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4tPmJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbi0+YnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVChjb21tYW5kQnVmZmVyLCAoY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCopbG9jYWxfcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoY29tbWFuZEJ1ZmZlcik7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFByb2Nlc3NDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiAgICAgICAgICBwUHJvY2Vzc0NvbW1hbmRzSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFByb2Nlc3NDb21tYW5kc05WWChjb21tYW5kQnVmZmVyLCBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7CisgICAgc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggdmFyX2xvY2FsX3BQcm9jZXNzQ29tbWFuZHNJbmZvOworICAgIHNhZmVfVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYICpsb2NhbF9wUHJvY2Vzc0NvbW1hbmRzSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocFByb2Nlc3NDb21tYW5kc0luZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BQcm9jZXNzQ29tbWFuZHNJbmZvID0gJnZhcl9sb2NhbF9wUHJvY2Vzc0NvbW1hbmRzSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BQcm9jZXNzQ29tbWFuZHNJbmZvLT5pbml0aWFsaXplKHBQcm9jZXNzQ29tbWFuZHNJbmZvKTsKKyAgICAgICAgICAgIGlmIChwUHJvY2Vzc0NvbW1hbmRzSW5mby0+b2JqZWN0VGFibGUpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wUHJvY2Vzc0NvbW1hbmRzSW5mby0+b2JqZWN0VGFibGUgPSBsYXllcl9kYXRhLT5VbndyYXAocFByb2Nlc3NDb21tYW5kc0luZm8tPm9iamVjdFRhYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwUHJvY2Vzc0NvbW1hbmRzSW5mby0+aW5kaXJlY3RDb21tYW5kc0xheW91dCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BQcm9jZXNzQ29tbWFuZHNJbmZvLT5pbmRpcmVjdENvbW1hbmRzTGF5b3V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5pbmRpcmVjdENvbW1hbmRzTGF5b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2NhbF9wUHJvY2Vzc0NvbW1hbmRzSW5mby0+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BQcm9jZXNzQ29tbWFuZHNJbmZvLT5pbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5wSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpbmRleDFdLmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcFByb2Nlc3NDb21tYW5kc0luZm8tPnBJbmRpcmVjdENvbW1hbmRzVG9rZW5zW2luZGV4MV0uYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5wSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpbmRleDFdLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFByb2Nlc3NDb21tYW5kc0luZm8tPnNlcXVlbmNlc0NvdW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFByb2Nlc3NDb21tYW5kc0luZm8tPnNlcXVlbmNlc0NvdW50QnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5zZXF1ZW5jZXNDb3VudEJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFByb2Nlc3NDb21tYW5kc0luZm8tPnNlcXVlbmNlc0luZGV4QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFByb2Nlc3NDb21tYW5kc0luZm8tPnNlcXVlbmNlc0luZGV4QnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5zZXF1ZW5jZXNJbmRleEJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFByb2Nlc3NDb21tYW5kc05WWChjb21tYW5kQnVmZmVyLCAoY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKilsb2NhbF9wUHJvY2Vzc0NvbW1hbmRzSW5mbyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogIHBSZXNlcnZlU3BhY2VJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoY29tbWFuZEJ1ZmZlciwgcFJlc2VydmVTcGFjZUluZm8pOworICAgIHNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggdmFyX2xvY2FsX3BSZXNlcnZlU3BhY2VJbmZvOworICAgIHNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggKmxvY2FsX3BSZXNlcnZlU3BhY2VJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwUmVzZXJ2ZVNwYWNlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcFJlc2VydmVTcGFjZUluZm8gPSAmdmFyX2xvY2FsX3BSZXNlcnZlU3BhY2VJbmZvOworICAgICAgICAgICAgbG9jYWxfcFJlc2VydmVTcGFjZUluZm8tPmluaXRpYWxpemUocFJlc2VydmVTcGFjZUluZm8pOworICAgICAgICAgICAgaWYgKHBSZXNlcnZlU3BhY2VJbmZvLT5vYmplY3RUYWJsZSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BSZXNlcnZlU3BhY2VJbmZvLT5vYmplY3RUYWJsZSA9IGxheWVyX2RhdGEtPlVud3JhcChwUmVzZXJ2ZVNwYWNlSW5mby0+b2JqZWN0VGFibGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBSZXNlcnZlU3BhY2VJbmZvLT5pbmRpcmVjdENvbW1hbmRzTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFJlc2VydmVTcGFjZUluZm8tPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQgPSBsYXllcl9kYXRhLT5VbndyYXAocFJlc2VydmVTcGFjZUluZm8tPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWChjb21tYW5kQnVmZmVyLCAoY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqKWxvY2FsX3BSZXNlcnZlU3BhY2VJbmZvKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogICAgICAgICAgICAgICAgcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0KTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBJbmRpcmVjdENvbW1hbmRzTGF5b3V0ID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYICAgICAgICAgICAgICAgICBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoZGV2aWNlLCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBwQWxsb2NhdG9yKTsKKyAgICB1aW50NjRfdCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0X2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihpbmRpcmVjdENvbW1hbmRzTGF5b3V0KTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AoaW5kaXJlY3RDb21tYW5kc0xheW91dF9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCA9IChWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQgPSAoVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKTA7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWChkZXZpY2UsIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIHBBbGxvY2F0b3IpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZU9iamVjdFRhYmxlTlZYKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBPYmplY3RUYWJsZSk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZU9iamVjdFRhYmxlTlZYKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBPYmplY3RUYWJsZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwT2JqZWN0VGFibGUgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwT2JqZWN0VGFibGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95T2JqZWN0VGFibGVOVlgoZGV2aWNlLCBvYmplY3RUYWJsZSwgcEFsbG9jYXRvcik7CisgICAgdWludDY0X3Qgb2JqZWN0VGFibGVfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KG9iamVjdFRhYmxlKTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3Aob2JqZWN0VGFibGVfaWQpOworICAgIGlmIChpdGVyICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgIG9iamVjdFRhYmxlID0gKFZrT2JqZWN0VGFibGVOVlgpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIG9iamVjdFRhYmxlID0gKFZrT2JqZWN0VGFibGVOVlgpMDsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lPYmplY3RUYWJsZU5WWChkZXZpY2UsIG9iamVjdFRhYmxlLCBwQWxsb2NhdG9yKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZWdpc3Rlck9iamVjdHNOVlgoZGV2aWNlLCBvYmplY3RUYWJsZSwgb2JqZWN0Q291bnQsIHBwT2JqZWN0VGFibGVFbnRyaWVzLCBwT2JqZWN0SW5kaWNlcyk7CisgICAgeworICAgICAgICBvYmplY3RUYWJsZSA9IGxheWVyX2RhdGEtPlVud3JhcChvYmplY3RUYWJsZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZWdpc3Rlck9iamVjdHNOVlgoZGV2aWNlLCBvYmplY3RUYWJsZSwgb2JqZWN0Q291bnQsIHBwT2JqZWN0VGFibGVFbnRyaWVzLCBwT2JqZWN0SW5kaWNlcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFVucmVnaXN0ZXJPYmplY3RzTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RDb3VudCwKKyAgICBjb25zdCBWa09iamVjdEVudHJ5VHlwZU5WWCogICAgICAgICAgICAgICAgIHBPYmplY3RFbnRyeVR5cGVzLAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdEluZGljZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlVucmVnaXN0ZXJPYmplY3RzTlZYKGRldmljZSwgb2JqZWN0VGFibGUsIG9iamVjdENvdW50LCBwT2JqZWN0RW50cnlUeXBlcywgcE9iamVjdEluZGljZXMpOworICAgIHsKKyAgICAgICAgb2JqZWN0VGFibGUgPSBsYXllcl9kYXRhLT5VbndyYXAob2JqZWN0VGFibGUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuVW5yZWdpc3Rlck9iamVjdHNOVlgoZGV2aWNlLCBvYmplY3RUYWJsZSwgb2JqZWN0Q291bnQsIHBPYmplY3RFbnRyeVR5cGVzLCBwT2JqZWN0SW5kaWNlcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqICAgICAgIHBGZWF0dXJlcywKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiAgICAgICAgIHBMaW1pdHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgocGh5c2ljYWxEZXZpY2UsIHBGZWF0dXJlcywgcExpbWl0cyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogICAgICAgICAgICAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoY29tbWFuZEJ1ZmZlciwgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRDb3VudCwgcFZpZXdwb3J0V1NjYWxpbmdzKTsKKworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFJlbGVhc2VEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuUmVsZWFzZURpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXkpOworICAgIHsKKyAgICAgICAgZGlzcGxheSA9IGxheWVyX2RhdGEtPlVud3JhcChkaXNwbGF5KTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuUmVsZWFzZURpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRpc3BsYXkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworVmtSZXN1bHQgRGlzcGF0Y2hBY3F1aXJlWGxpYkRpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5BY3F1aXJlWGxpYkRpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRweSwgZGlzcGxheSk7CisgICAgeworICAgICAgICBkaXNwbGF5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRpc3BsYXkpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5BY3F1aXJlWGxpYkRpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRweSwgZGlzcGxheSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBSUk91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyT3V0cHV0LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXkpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRSYW5kUk91dHB1dERpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRweSwgcnJPdXRwdXQsIHBEaXNwbGF5KTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRSYW5kUk91dHB1dERpc3BsYXlFWFQocGh5c2ljYWxEZXZpY2UsIGRweSwgcnJPdXRwdXQsIHBEaXNwbGF5KTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBEaXNwbGF5ID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcERpc3BsYXkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisgICAgeworICAgICAgICBzdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHN1cmZhY2UpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKHBoeXNpY2FsRGV2aWNlLCBzdXJmYWNlLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaERpc3BsYXlQb3dlckNvbnRyb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlQb3dlckluZm8pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRpc3BsYXlQb3dlckNvbnRyb2xFWFQoZGV2aWNlLCBkaXNwbGF5LCBwRGlzcGxheVBvd2VySW5mbyk7CisgICAgeworICAgICAgICBkaXNwbGF5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRpc3BsYXkpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGlzcGxheVBvd2VyQ29udHJvbEVYVChkZXZpY2UsIGRpc3BsYXksIHBEaXNwbGF5UG93ZXJJbmZvKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgIHBEZXZpY2VFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZWdpc3RlckRldmljZUV2ZW50RVhUKGRldmljZSwgcERldmljZUV2ZW50SW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVnaXN0ZXJEZXZpY2VFdmVudEVYVChkZXZpY2UsIHBEZXZpY2VFdmVudEluZm8sIHBBbGxvY2F0b3IsIHBGZW5jZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwRmVuY2UgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwRmVuY2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5RXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoZGV2aWNlLCBkaXNwbGF5LCBwRGlzcGxheUV2ZW50SW5mbywgcEFsbG9jYXRvciwgcEZlbmNlKTsKKyAgICB7CisgICAgICAgIGRpc3BsYXkgPSBsYXllcl9kYXRhLT5VbndyYXAoZGlzcGxheSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZWdpc3RlckRpc3BsYXlFdmVudEVYVChkZXZpY2UsIGRpc3BsYXksIHBEaXNwbGF5RXZlbnRJbmZvLCBwQWxsb2NhdG9yLCBwRmVuY2UpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcEZlbmNlID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcEZlbmNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRTd2FwY2hhaW5Db3VudGVyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCAgICAgICAgICAgICAgICAgY291bnRlciwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyVmFsdWUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFN3YXBjaGFpbkNvdW50ZXJFWFQoZGV2aWNlLCBzd2FwY2hhaW4sIGNvdW50ZXIsIHBDb3VudGVyVmFsdWUpOworICAgIHsKKyAgICAgICAgc3dhcGNoYWluID0gbGF5ZXJfZGF0YS0+VW53cmFwKHN3YXBjaGFpbik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRTd2FwY2hhaW5Db3VudGVyRVhUKGRldmljZSwgc3dhcGNoYWluLCBjb3VudGVyLCBwQ291bnRlclZhbHVlKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogICAgICAgICAgICAgICBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKGRldmljZSwgc3dhcGNoYWluLCBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMpOworICAgIHsKKyAgICAgICAgc3dhcGNoYWluID0gbGF5ZXJfZGF0YS0+VW53cmFwKHN3YXBjaGFpbik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRShkZXZpY2UsIHN3YXBjaGFpbiwgcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCwKKyAgICBWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUqICAgICAgICAgICAgIHBQcmVzZW50YXRpb25UaW1pbmdzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKGRldmljZSwgc3dhcGNoYWluLCBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsIHBQcmVzZW50YXRpb25UaW1pbmdzKTsKKyAgICB7CisgICAgICAgIHN3YXBjaGFpbiA9IGxheWVyX2RhdGEtPlVud3JhcChzd2FwY2hhaW4pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRShkZXZpY2UsIHN3YXBjaGFpbiwgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LCBwUHJlc2VudGF0aW9uVGltaW5ncyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERpc2NhcmRSZWN0YW5nbGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVChjb21tYW5kQnVmZmVyLCBmaXJzdERpc2NhcmRSZWN0YW5nbGUsIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgcERpc2NhcmRSZWN0YW5nbGVzKTsKKworfQorCit2b2lkIERpc3BhdGNoU2V0SGRyTWV0YWRhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zLAorICAgIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXRIZHJNZXRhZGF0YUVYVChkZXZpY2UsIHN3YXBjaGFpbkNvdW50LCBwU3dhcGNoYWlucywgcE1ldGFkYXRhKTsKKyAgICBWa1N3YXBjaGFpbktIUiB2YXJfbG9jYWxfcFN3YXBjaGFpbnNbRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TXTsKKyAgICBWa1N3YXBjaGFpbktIUiAqbG9jYWxfcFN3YXBjaGFpbnMgPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBTd2FwY2hhaW5zKSB7CisgICAgICAgICAgICBsb2NhbF9wU3dhcGNoYWlucyA9IHN3YXBjaGFpbkNvdW50ID4gRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TID8gbmV3IFZrU3dhcGNoYWluS0hSW3N3YXBjaGFpbkNvdW50XSA6IHZhcl9sb2NhbF9wU3dhcGNoYWluczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgc3dhcGNoYWluQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFN3YXBjaGFpbnNbaW5kZXgwXSA9IGxheWVyX2RhdGEtPlVud3JhcChwU3dhcGNoYWluc1tpbmRleDBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuU2V0SGRyTWV0YWRhdGFFWFQoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgKGNvbnN0IFZrU3dhcGNoYWluS0hSKilsb2NhbF9wU3dhcGNoYWlucywgcE1ldGFkYXRhKTsKKyAgICBpZiAobG9jYWxfcFN3YXBjaGFpbnMgIT0gdmFyX2xvY2FsX3BTd2FwY2hhaW5zKQorICAgICAgICBkZWxldGVbXSBsb2NhbF9wU3dhcGNoYWluczsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlSU9TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVJT1NTdXJmYWNlTVZLKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUlPU1N1cmZhY2VNVksoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwU3VyZmFjZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBTdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZU1hY09TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVNYWNPU1N1cmZhY2VNVksoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFN1cmZhY2UgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU3VyZmFjZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCisvLyBTa2lwIHZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgZGlzcGF0Y2gsIG1hbnVhbGx5IGdlbmVyYXRlZAorCisvLyBTa2lwIHZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkCisKK3ZvaWQgRGlzcGF0Y2hRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHF1ZXVlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5RdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKHF1ZXVlLCBwTGFiZWxJbmZvKTsKKworfQorCit2b2lkIERpc3BhdGNoUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShxdWV1ZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQocXVldWUpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShxdWV1ZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQocXVldWUsIHBMYWJlbEluZm8pOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKGNvbW1hbmRCdWZmZXIsIHBMYWJlbEluZm8pOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKGNvbW1hbmRCdWZmZXIsIHBMYWJlbEluZm8pOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogICAgICAgICAgICAgICAgICAgcE1lc3NlbmdlcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTWVzc2VuZ2VyKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcE1lc3Nlbmdlcik7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwTWVzc2VuZ2VyID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcE1lc3Nlbmdlcik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKGluc3RhbmNlLCBtZXNzZW5nZXIsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IG1lc3Nlbmdlcl9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4obWVzc2VuZ2VyKTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AobWVzc2VuZ2VyX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBtZXNzZW5nZXIgPSAoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKWl0ZXItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtZXNzZW5nZXIgPSAoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKTA7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKGluc3RhbmNlLCBtZXNzZW5nZXIsIHBBbGxvY2F0b3IpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUICAgICAgbWVzc2FnZVNldmVyaXR5LAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgICAgICAgICAgICAgbWVzc2FnZVR5cGVzLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogcENhbGxiYWNrRGF0YSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5TdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVChpbnN0YW5jZSwgbWVzc2FnZVNldmVyaXR5LCBtZXNzYWdlVHlwZXMsIHBDYWxsYmFja0RhdGEpOworCit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKiAgIHBQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoZGV2aWNlLCBidWZmZXIsIHBQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHBJbmZvLAorICAgIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRChkZXZpY2UsIHBJbmZvLCBwQnVmZmVyKTsKKyAgICBzYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgdmFyX2xvY2FsX3BJbmZvOworICAgIHNhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCAqbG9jYWxfcEluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBJbmZvKSB7CisgICAgICAgICAgICBsb2NhbF9wSW5mbyA9ICZ2YXJfbG9jYWxfcEluZm87CisgICAgICAgICAgICBsb2NhbF9wSW5mby0+aW5pdGlhbGl6ZShwSW5mbyk7CisgICAgICAgICAgICBpZiAocEluZm8tPm1lbW9yeSkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5tZW1vcnkgPSBsYXllcl9kYXRhLT5VbndyYXAocEluZm8tPm1lbW9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoZGV2aWNlLCAoY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCopbG9jYWxfcEluZm8sIHBCdWZmZXIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKwordm9pZCBEaXNwYXRjaENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiAgICAgICAgICAgICBwU2FtcGxlTG9jYXRpb25zSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoY29tbWFuZEJ1ZmZlciwgcFNhbXBsZUxvY2F0aW9uc0luZm8pOworCit9CisKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogICAgICAgICAgICAgICAgIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQocGh5c2ljYWxEZXZpY2UsIHNhbXBsZXMsIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChkZXZpY2UsIGltYWdlLCBwUHJvcGVydGllcyk7CisgICAgeworICAgICAgICBpbWFnZSA9IGxheWVyX2RhdGEtPlVud3JhcChpbWFnZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChkZXZpY2UsIGltYWdlLCBwUHJvcGVydGllcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgICAgICAgIHBWYWxpZGF0aW9uQ2FjaGUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmFsaWRhdGlvbkNhY2hlKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBWYWxpZGF0aW9uQ2FjaGUpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFZhbGlkYXRpb25DYWNoZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBWYWxpZGF0aW9uQ2FjaGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoZGV2aWNlLCB2YWxpZGF0aW9uQ2FjaGUsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IHZhbGlkYXRpb25DYWNoZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4odmFsaWRhdGlvbkNhY2hlKTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AodmFsaWRhdGlvbkNhY2hlX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICB2YWxpZGF0aW9uQ2FjaGUgPSAoVmtWYWxpZGF0aW9uQ2FjaGVFWFQpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbGlkYXRpb25DYWNoZSA9IChWa1ZhbGlkYXRpb25DYWNoZUVYVCkwOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVChkZXZpY2UsIHZhbGlkYXRpb25DYWNoZSwgcEFsbG9jYXRvcik7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5NZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoZGV2aWNlLCBkc3RDYWNoZSwgc3JjQ2FjaGVDb3VudCwgcFNyY0NhY2hlcyk7CisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgdmFyX2xvY2FsX3BTcmNDYWNoZXNbRElTUEFUQ0hfTUFYX1NUQUNLX0FMTE9DQVRJT05TXTsKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAqbG9jYWxfcFNyY0NhY2hlcyA9IE5VTEw7CisgICAgeworICAgICAgICBkc3RDYWNoZSA9IGxheWVyX2RhdGEtPlVud3JhcChkc3RDYWNoZSk7CisgICAgICAgIGlmIChwU3JjQ2FjaGVzKSB7CisgICAgICAgICAgICBsb2NhbF9wU3JjQ2FjaGVzID0gc3JjQ2FjaGVDb3VudCA+IERJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OUyA/IG5ldyBWa1ZhbGlkYXRpb25DYWNoZUVYVFtzcmNDYWNoZUNvdW50XSA6IHZhcl9sb2NhbF9wU3JjQ2FjaGVzOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBzcmNDYWNoZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BTcmNDYWNoZXNbaW5kZXgwXSA9IGxheWVyX2RhdGEtPlVud3JhcChwU3JjQ2FjaGVzW2luZGV4MF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5NZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoZGV2aWNlLCBkc3RDYWNoZSwgc3JjQ2FjaGVDb3VudCwgKGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKilsb2NhbF9wU3JjQ2FjaGVzKTsKKyAgICBpZiAobG9jYWxfcFNyY0NhY2hlcyAhPSB2YXJfbG9jYWxfcFNyY0NhY2hlcykKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcFNyY0NhY2hlczsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVChkZXZpY2UsIHZhbGlkYXRpb25DYWNoZSwgcERhdGFTaXplLCBwRGF0YSk7CisgICAgeworICAgICAgICB2YWxpZGF0aW9uQ2FjaGUgPSBsYXllcl9kYXRhLT5VbndyYXAodmFsaWRhdGlvbkNhY2hlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoZGV2aWNlLCB2YWxpZGF0aW9uQ2FjaGUsIHBEYXRhU2l6ZSwgcERhdGEpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaENtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKGNvbW1hbmRCdWZmZXIsIGltYWdlVmlldywgaW1hZ2VMYXlvdXQpOworICAgIHsKKyAgICAgICAgaW1hZ2VWaWV3ID0gbGF5ZXJfZGF0YS0+VW53cmFwKGltYWdlVmlldyk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKGNvbW1hbmRCdWZmZXIsIGltYWdlVmlldywgaW1hZ2VMYXlvdXQpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqICAgICAgICAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVihjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwU2hhZGluZ1JhdGVQYWxldHRlcyk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgICAgICAgICAgICAgICAgICAgc2FtcGxlT3JkZXJUeXBlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwKKyAgICBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqICAgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVihjb21tYW5kQnVmZmVyLCBzYW1wbGVPcmRlclR5cGUsIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsIHBDdXN0b21TYW1wbGVPcmRlcnMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIHZhcl9sb2NhbF9wQ3JlYXRlSW5mbzsKKyAgICBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WICpsb2NhbF9wQ3JlYXRlSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvID0gJnZhcl9sb2NhbF9wQ3JlYXRlSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5pbml0aWFsaXplKHBDcmVhdGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChsb2NhbF9wQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyID0gMDsgaW5kZXgyIDwgbG9jYWxfcENyZWF0ZUluZm8tPmluZm8uZ2VvbWV0cnlDb3VudDsgKytpbmRleDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2luZGV4Ml0uZ2VvbWV0cnkudHJpYW5nbGVzLnZlcnRleERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2luZGV4Ml0uZ2VvbWV0cnkudHJpYW5nbGVzLnZlcnRleERhdGEgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbaW5kZXgyXS5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4RGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2luZGV4Ml0uZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4RGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbaW5kZXgyXS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhEYXRhID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2luZGV4Ml0uZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4RGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2luZGV4Ml0uZ2VvbWV0cnkudHJpYW5nbGVzLnRyYW5zZm9ybURhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2luZGV4Ml0uZ2VvbWV0cnkudHJpYW5nbGVzLnRyYW5zZm9ybURhdGEgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbaW5kZXgyXS5nZW9tZXRyeS50cmlhbmdsZXMudHJhbnNmb3JtRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2luZGV4Ml0uZ2VvbWV0cnkuYWFiYnMuYWFiYkRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2luZGV4Ml0uZ2VvbWV0cnkuYWFiYnMuYWFiYkRhdGEgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbaW5kZXgyXS5nZW9tZXRyeS5hYWJicy5hYWJiRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGRldmljZSwgKGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKilsb2NhbF9wQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwQWNjZWxlcmF0aW9uU3RydWN0dXJlID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcEFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoZGV2aWNlLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIHBBbGxvY2F0b3IpOworICAgIHVpbnQ2NF90IGFjY2VsZXJhdGlvblN0cnVjdHVyZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oYWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AoYWNjZWxlcmF0aW9uU3RydWN0dXJlX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSAoVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVilpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlID0gKFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpMDsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihkZXZpY2UsIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgcEFsbG9jYXRvcik7CisKK30KKwordm9pZCBEaXNwYXRjaEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKGRldmljZSwgcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgdmFyX2xvY2FsX3BJbmZvOworICAgIHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgKmxvY2FsX3BJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEluZm8gPSAmdmFyX2xvY2FsX3BJbmZvOworICAgICAgICAgICAgbG9jYWxfcEluZm8tPmluaXRpYWxpemUocEluZm8pOworICAgICAgICAgICAgaWYgKHBJbmZvLT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wSW5mby0+YWNjZWxlcmF0aW9uU3RydWN0dXJlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbmZvLT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVihkZXZpY2UsIChjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViopbG9jYWxfcEluZm8sIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIHBCaW5kSW5mb3MpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXZpY2UsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MpOworICAgIHNhZmVfVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WICpsb2NhbF9wQmluZEluZm9zID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQmluZEluZm9zKSB7CisgICAgICAgICAgICBsb2NhbF9wQmluZEluZm9zID0gbmV3IHNhZmVfVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WW2JpbmRJbmZvQ291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBiaW5kSW5mb0NvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BCaW5kSW5mb3NbaW5kZXgwXS5pbml0aWFsaXplKCZwQmluZEluZm9zW2luZGV4MF0pOworICAgICAgICAgICAgICAgIGlmIChwQmluZEluZm9zW2luZGV4MF0uYWNjZWxlcmF0aW9uU3RydWN0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BCaW5kSW5mb3NbaW5kZXgwXS5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBsYXllcl9kYXRhLT5VbndyYXAocEJpbmRJbmZvc1tpbmRleDBdLmFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwQmluZEluZm9zW2luZGV4MF0ubWVtb3J5KSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BCaW5kSW5mb3NbaW5kZXgwXS5tZW1vcnkgPSBsYXllcl9kYXRhLT5VbndyYXAocEJpbmRJbmZvc1tpbmRleDBdLm1lbW9yeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5CaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoZGV2aWNlLCBiaW5kSW5mb0NvdW50LCAoY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKilsb2NhbF9wQmluZEluZm9zKTsKKyAgICBpZiAobG9jYWxfcEJpbmRJbmZvcykgeworICAgICAgICBkZWxldGVbXSBsb2NhbF9wQmluZEluZm9zOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqICAgICAgICBwSW5mbywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlT2Zmc2V0LAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hPZmZzZXQpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGNvbW1hbmRCdWZmZXIsIHBJbmZvLCBpbnN0YW5jZURhdGEsIGluc3RhbmNlT2Zmc2V0LCB1cGRhdGUsIGRzdCwgc3JjLCBzY3JhdGNoLCBzY3JhdGNoT2Zmc2V0KTsKKyAgICBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIHZhcl9sb2NhbF9wSW5mbzsKKyAgICBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICpsb2NhbF9wSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvID0gJnZhcl9sb2NhbF9wSW5mbzsKKyAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5pbml0aWFsaXplKHBJbmZvKTsKKyAgICAgICAgICAgIGlmIChsb2NhbF9wSW5mby0+cEdlb21ldHJpZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BJbmZvLT5nZW9tZXRyeUNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocEluZm8tPnBHZW9tZXRyaWVzW2luZGV4MV0uZ2VvbWV0cnkudHJpYW5nbGVzLnZlcnRleERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5wR2VvbWV0cmllc1tpbmRleDFdLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhEYXRhID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbmZvLT5wR2VvbWV0cmllc1tpbmRleDFdLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocEluZm8tPnBHZW9tZXRyaWVzW2luZGV4MV0uZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4RGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcEluZm8tPnBHZW9tZXRyaWVzW2luZGV4MV0uZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4RGF0YSA9IGxheWVyX2RhdGEtPlVud3JhcChwSW5mby0+cEdlb21ldHJpZXNbaW5kZXgxXS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocEluZm8tPnBHZW9tZXRyaWVzW2luZGV4MV0uZ2VvbWV0cnkudHJpYW5nbGVzLnRyYW5zZm9ybURhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5wR2VvbWV0cmllc1tpbmRleDFdLmdlb21ldHJ5LnRyaWFuZ2xlcy50cmFuc2Zvcm1EYXRhID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbmZvLT5wR2VvbWV0cmllc1tpbmRleDFdLmdlb21ldHJ5LnRyaWFuZ2xlcy50cmFuc2Zvcm1EYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocEluZm8tPnBHZW9tZXRyaWVzW2luZGV4MV0uZ2VvbWV0cnkuYWFiYnMuYWFiYkRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BJbmZvLT5wR2VvbWV0cmllc1tpbmRleDFdLmdlb21ldHJ5LmFhYmJzLmFhYmJEYXRhID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbmZvLT5wR2VvbWV0cmllc1tpbmRleDFdLmdlb21ldHJ5LmFhYmJzLmFhYmJEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnN0YW5jZURhdGEgPSBsYXllcl9kYXRhLT5VbndyYXAoaW5zdGFuY2VEYXRhKTsKKyAgICAgICAgZHN0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRzdCk7CisgICAgICAgIHNyYyA9IGxheWVyX2RhdGEtPlVud3JhcChzcmMpOworICAgICAgICBzY3JhdGNoID0gbGF5ZXJfZGF0YS0+VW53cmFwKHNjcmF0Y2gpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kQnVmZmVyLCAoY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqKWxvY2FsX3BJbmZvLCBpbnN0YW5jZURhdGEsIGluc3RhbmNlT2Zmc2V0LCB1cGRhdGUsIGRzdCwgc3JjLCBzY3JhdGNoLCBzY3JhdGNoT2Zmc2V0KTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgICAgICAgICAgIG1vZGUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoY29tbWFuZEJ1ZmZlciwgZHN0LCBzcmMsIG1vZGUpOworICAgIHsKKyAgICAgICAgZHN0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRzdCk7CisgICAgICAgIHNyYyA9IGxheWVyX2RhdGEtPlVud3JhcChzcmMpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGNvbW1hbmRCdWZmZXIsIGRzdCwgc3JjLCBtb2RlKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kVHJhY2VSYXlzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRUcmFjZVJheXNOVihjb21tYW5kQnVmZmVyLCByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LCBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LCBoaXRTaGFkZXJCaW5kaW5nU3RyaWRlLCBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKKyAgICB7CisgICAgICAgIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChyYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIpOworICAgICAgICBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIpOworICAgICAgICBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyKTsKKyAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kVHJhY2VSYXlzTlYoY29tbWFuZEJ1ZmZlciwgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgaGl0U2hhZGVyQmluZGluZ09mZnNldCwgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICBzYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICpsb2NhbF9wQ3JlYXRlSW5mb3MgPSBOVUxMOworICAgIHsKKyAgICAgICAgcGlwZWxpbmVDYWNoZSA9IGxheWVyX2RhdGEtPlVud3JhcChwaXBlbGluZUNhY2hlKTsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zID0gbmV3IHNhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlZbY3JlYXRlSW5mb0NvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgY3JlYXRlSW5mb0NvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvc1tpbmRleDBdLmluaXRpYWxpemUoJnBDcmVhdGVJbmZvc1tpbmRleDBdKTsKKyAgICAgICAgICAgICAgICBpZiAobG9jYWxfcENyZWF0ZUluZm9zW2luZGV4MF0ucFN0YWdlcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BDcmVhdGVJbmZvc1tpbmRleDBdLnN0YWdlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2luZGV4MF0ucFN0YWdlc1tpbmRleDFdLm1vZHVsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvc1tpbmRleDBdLnBTdGFnZXNbaW5kZXgxXS5tb2R1bGUgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm9zW2luZGV4MF0ucFN0YWdlc1tpbmRleDFdLm1vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpbmRleDBdLmxheW91dCkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mb3NbaW5kZXgwXS5sYXlvdXQgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm9zW2luZGV4MF0ubGF5b3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpbmRleDBdLmJhc2VQaXBlbGluZUhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mb3NbaW5kZXgwXS5iYXNlUGlwZWxpbmVIYW5kbGUgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm9zW2luZGV4MF0uYmFzZVBpcGVsaW5lSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgKGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKilsb2NhbF9wQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBOZXh0ICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICBDb3B5Q3JlYXRlUGlwZWxpbmVGZWVkYmFja0RhdGEobG9jYWxfcENyZWF0ZUluZm9zW2ldLnBOZXh0LCBwQ3JlYXRlSW5mb3NbaV0ucE5leHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvY2FsX3BDcmVhdGVJbmZvcykgeworICAgICAgICBkZWxldGVbXSBsb2NhbF9wQ3JlYXRlSW5mb3M7CisgICAgfQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBjcmVhdGVJbmZvQ291bnQ7IGluZGV4MCsrKSB7CisgICAgICAgICAgICBpZiAocFBpcGVsaW5lc1tpbmRleDBdICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICAgICAgcFBpcGVsaW5lc1tpbmRleDBdID0gbGF5ZXJfZGF0YS0+V3JhcE5ldyhwUGlwZWxpbmVzW2luZGV4MF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEdyb3VwLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVihkZXZpY2UsIHBpcGVsaW5lLCBmaXJzdEdyb3VwLCBncm91cENvdW50LCBkYXRhU2l6ZSwgcERhdGEpOworICAgIHsKKyAgICAgICAgcGlwZWxpbmUgPSBsYXllcl9kYXRhLT5VbndyYXAocGlwZWxpbmUpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKGRldmljZSwgcGlwZWxpbmUsIGZpcnN0R3JvdXAsIGdyb3VwQ291bnQsIGRhdGFTaXplLCBwRGF0YSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoZGV2aWNlLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGRhdGFTaXplLCBwRGF0YSk7CisgICAgeworICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBsYXllcl9kYXRhLT5VbndyYXAoYWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKGRldmljZSwgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBkYXRhU2l6ZSwgcERhdGEpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaENtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLAorICAgIFZrUXVlcnlUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVihjb21tYW5kQnVmZmVyLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsIHF1ZXJ5VHlwZSwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5KTsKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZhcl9sb2NhbF9wQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tESVNQQVRDSF9NQVhfU1RBQ0tfQUxMT0NBVElPTlNdOworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgKmxvY2FsX3BBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwQWNjZWxlcmF0aW9uU3RydWN0dXJlcykgeworICAgICAgICAgICAgbG9jYWxfcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPSBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCA+IERJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OUyA/IG5ldyBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WW2FjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50XSA6IHZhcl9sb2NhbF9wQWNjZWxlcmF0aW9uU3RydWN0dXJlczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcEFjY2VsZXJhdGlvblN0cnVjdHVyZXNbaW5kZXgwXSA9IGxheWVyX2RhdGEtPlVud3JhcChwQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpbmRleDBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBxdWVyeVBvb2wgPSBsYXllcl9kYXRhLT5VbndyYXAocXVlcnlQb29sKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVihjb21tYW5kQnVmZmVyLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwgKGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqKWxvY2FsX3BBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCBxdWVyeVR5cGUsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSk7CisgICAgaWYgKGxvY2FsX3BBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzICE9IHZhcl9sb2NhbF9wQWNjZWxlcmF0aW9uU3RydWN0dXJlcykKKyAgICAgICAgZGVsZXRlW10gbG9jYWxfcEFjY2VsZXJhdGlvblN0cnVjdHVyZXM7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ29tcGlsZURlZmVycmVkTlYoZGV2aWNlLCBwaXBlbGluZSwgc2hhZGVyKTsKKyAgICB7CisgICAgICAgIHBpcGVsaW5lID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBpcGVsaW5lKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNvbXBpbGVEZWZlcnJlZE5WKGRldmljZSwgcGlwZWxpbmUsIHNoYWRlcik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXIsCisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqICAgICAgICAgICBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKGRldmljZSwgaGFuZGxlVHlwZSwgcEhvc3RQb2ludGVyLCBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZVN0YWdlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVTdGFnZSwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIG1hcmtlcik7CisgICAgeworICAgICAgICBkc3RCdWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoZHN0QnVmZmVyKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFdyaXRlQnVmZmVyTWFya2VyQU1EKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lU3RhZ2UsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBtYXJrZXIpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWluQ291bnQsCisgICAgVmtUaW1lRG9tYWluRVhUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbnMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQocGh5c2ljYWxEZXZpY2UsIHBUaW1lRG9tYWluQ291bnQsIHBUaW1lRG9tYWlucyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wQ291bnQsCisgICAgY29uc3QgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCogICAgICAgICBwVGltZXN0YW1wSW5mb3MsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZXN0YW1wcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXhEZXZpYXRpb24pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVChkZXZpY2UsIHRpbWVzdGFtcENvdW50LCBwVGltZXN0YW1wSW5mb3MsIHBUaW1lc3RhbXBzLCBwTWF4RGV2aWF0aW9uKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hDbWREcmF3TWVzaFRhc2tzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUYXNrKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdNZXNoVGFza3NOVihjb21tYW5kQnVmZmVyLCB0YXNrQ291bnQsIGZpcnN0VGFzayk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7CisgICAgeworICAgICAgICBidWZmZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoYnVmZmVyKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7CisKK30KKwordm9pZCBEaXNwYXRjaENtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworICAgIHsKKyAgICAgICAgYnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKGJ1ZmZlcik7CisgICAgICAgIGNvdW50QnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKGNvdW50QnVmZmVyKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50QnVmZmVyLCBjb3VudEJ1ZmZlck9mZnNldCwgbWF4RHJhd0NvdW50LCBzdHJpZGUpOworCit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVihjb21tYW5kQnVmZmVyLCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwgcEV4Y2x1c2l2ZVNjaXNzb3JzKTsKKworfQorCit2b2lkIERpc3BhdGNoQ21kU2V0Q2hlY2twb2ludE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50TWFya2VyKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldENoZWNrcG9pbnROVihjb21tYW5kQnVmZmVyLCBwQ2hlY2twb2ludE1hcmtlcik7CisKK30KKwordm9pZCBEaXNwYXRjaEdldFF1ZXVlQ2hlY2twb2ludERhdGFOVigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhQ291bnQsCisgICAgVmtDaGVja3BvaW50RGF0YU5WKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGEpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocXVldWUpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFF1ZXVlQ2hlY2twb2ludERhdGFOVihxdWV1ZSwgcENoZWNrcG9pbnREYXRhQ291bnQsIHBDaGVja3BvaW50RGF0YSk7CisKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogIHBJbml0aWFsaXplSW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKGRldmljZSwgcEluaXRpYWxpemVJbmZvKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTChkZXZpY2UpOworCit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogICAgICAgICBwTWFya2VySW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogICBwTWFya2VySW5mbykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKGNvbW1hbmRCdWZmZXIsIHBNYXJrZXJJbmZvKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqICAgICAgIHBPdmVycmlkZUluZm8pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoY29tbWFuZEJ1ZmZlciksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKGNvbW1hbmRCdWZmZXIsIHBPdmVycmlkZUluZm8pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKGRldmljZSwgcEFjcXVpcmVJbmZvLCBwQ29uZmlndXJhdGlvbik7CisgICAgeworICAgICAgICBwQ29uZmlndXJhdGlvbiA9IGxheWVyX2RhdGEtPlVud3JhcChwQ29uZmlndXJhdGlvbik7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5BY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoZGV2aWNlLCBwQWNxdWlyZUluZm8sIHBDb25maWd1cmF0aW9uKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbikKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKGRldmljZSwgY29uZmlndXJhdGlvbik7CisgICAgeworICAgICAgICBjb25maWd1cmF0aW9uID0gbGF5ZXJfZGF0YS0+VW53cmFwKGNvbmZpZ3VyYXRpb24pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKGRldmljZSwgY29uZmlndXJhdGlvbik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocXVldWUpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChxdWV1ZSwgY29uZmlndXJhdGlvbik7CisgICAgeworICAgICAgICBjb25maWd1cmF0aW9uID0gbGF5ZXJfZGF0YS0+VW53cmFwKGNvbmZpZ3VyYXRpb24pOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChxdWV1ZSwgY29uZmlndXJhdGlvbik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCAgICAgICAgICAgICBwYXJhbWV0ZXIsCisgICAgVmtQZXJmb3JtYW5jZVZhbHVlSU5URUwqICAgICAgICAgICAgICAgICAgICBwVmFsdWUpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKGRldmljZSwgcGFyYW1ldGVyLCBwVmFsdWUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaFNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuU2V0TG9jYWxEaW1taW5nQU1EKGRldmljZSwgc3dhcENoYWluLCBsb2NhbERpbW1pbmdFbmFibGUpOworICAgIHsKKyAgICAgICAgc3dhcENoYWluID0gbGF5ZXJfZGF0YS0+VW53cmFwKHN3YXBDaGFpbik7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXRMb2NhbERpbW1pbmdBTUQoZGV2aWNlLCBzd2FwQ2hhaW4sIGxvY2FsRGltbWluZ0VuYWJsZSk7CisKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwU3VyZmFjZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBTdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZU1ldGFsU3VyZmFjZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVNZXRhbFN1cmZhY2VFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN1cmZhY2UpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcFN1cmZhY2UgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU3VyZmFjZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCitWa0RldmljZUFkZHJlc3MgRGlzcGF0Y2hHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoZGV2aWNlLCBwSW5mbyk7CisgICAgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIHZhcl9sb2NhbF9wSW5mbzsKKyAgICBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgKmxvY2FsX3BJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEluZm8gPSAmdmFyX2xvY2FsX3BJbmZvOworICAgICAgICAgICAgbG9jYWxfcEluZm8tPmluaXRpYWxpemUocEluZm8pOworICAgICAgICAgICAgaWYgKHBJbmZvLT5idWZmZXIpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wSW5mby0+YnVmZmVyID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBJbmZvLT5idWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrRGV2aWNlQWRkcmVzcyByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChkZXZpY2UsIChjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKilsb2NhbF9wSW5mbyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb29sQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKiAgICAgICAgICBwVG9vbFByb3BlcnRpZXMpCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVChwaHlzaWNhbERldmljZSwgcFRvb2xDb3VudCwgcFRvb2xQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21iaW5hdGlvbkNvdW50LAorICAgIFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKiAgICAgcENvbWJpbmF0aW9ucykKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYocGh5c2ljYWxEZXZpY2UsIHBDb21iaW5hdGlvbkNvdW50LCBwQ29tYmluYXRpb25zKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlQ291bnQsCisgICAgVmtQcmVzZW50TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChwaHlzaWNhbERldmljZSwgcFN1cmZhY2VJbmZvLCBwUHJlc2VudE1vZGVDb3VudCwgcFByZXNlbnRNb2Rlcyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIHZhcl9sb2NhbF9wU3VyZmFjZUluZm87CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICpsb2NhbF9wU3VyZmFjZUluZm8gPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBTdXJmYWNlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcFN1cmZhY2VJbmZvID0gJnZhcl9sb2NhbF9wU3VyZmFjZUluZm87CisgICAgICAgICAgICBsb2NhbF9wU3VyZmFjZUluZm8tPmluaXRpYWxpemUocFN1cmZhY2VJbmZvKTsKKyAgICAgICAgICAgIGlmIChwU3VyZmFjZUluZm8tPnN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBsb2NhbF9wU3VyZmFjZUluZm8tPnN1cmZhY2UgPSBsYXllcl9kYXRhLT5VbndyYXAocFN1cmZhY2VJbmZvLT5zdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKHBoeXNpY2FsRGV2aWNlLCAoY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiopbG9jYWxfcFN1cmZhY2VJbmZvLCBwUHJlc2VudE1vZGVDb3VudCwgcFByZXNlbnRNb2Rlcyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbik7CisgICAgeworICAgICAgICBzd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5VbndyYXAoc3dhcGNoYWluKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pCit7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbik7CisgICAgeworICAgICAgICBzd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5VbndyYXAoc3dhcGNoYWluKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChkZXZpY2UsIHN3YXBjaGFpbik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworVmtSZXN1bHQgRGlzcGF0Y2hHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKGRldmljZSwgcFN1cmZhY2VJbmZvLCBwTW9kZXMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiB2YXJfbG9jYWxfcFN1cmZhY2VJbmZvOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAqbG9jYWxfcFN1cmZhY2VJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwU3VyZmFjZUluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BTdXJmYWNlSW5mbyA9ICZ2YXJfbG9jYWxfcFN1cmZhY2VJbmZvOworICAgICAgICAgICAgbG9jYWxfcFN1cmZhY2VJbmZvLT5pbml0aWFsaXplKHBTdXJmYWNlSW5mbyk7CisgICAgICAgICAgICBpZiAocFN1cmZhY2VJbmZvLT5zdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcFN1cmZhY2VJbmZvLT5zdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBTdXJmYWNlSW5mby0+c3VyZmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoZGV2aWNlLCAoY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiopbG9jYWxfcFN1cmZhY2VJbmZvLCBwTW9kZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVChpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgICpwU3VyZmFjZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBTdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEaXNwYXRjaENtZFNldExpbmVTdGlwcGxlRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlRmFjdG9yLAorICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVQYXR0ZXJuKQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGNvbW1hbmRCdWZmZXIpLCBsYXllcl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFNldExpbmVTdGlwcGxlRVhUKGNvbW1hbmRCdWZmZXIsIGxpbmVTdGlwcGxlRmFjdG9yLCBsaW5lU3RpcHBsZVBhdHRlcm4pOworCit9CisKK3ZvaWQgRGlzcGF0Y2hSZXNldFF1ZXJ5UG9vbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50KQoreworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5SZXNldFF1ZXJ5UG9vbEVYVChkZXZpY2UsIHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCk7CisgICAgeworICAgICAgICBxdWVyeVBvb2wgPSBsYXllcl9kYXRhLT5VbndyYXAocXVlcnlQb29sKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlJlc2V0UXVlcnlQb29sRVhUKGRldmljZSwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50KTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvbGF5ZXJfY2hhc3Npc19kaXNwYXRjaC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9sYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ZTk4NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvbGF5ZXJfY2hhc3Npc19kaXNwYXRjaC5oCkBAIC0wLDAgKzEsMTgzMiBAQAorCisKKy8vIFRoaXMgZmlsZSBpcyAqKipHRU5FUkFURUQqKiouICBEbyBOb3QgRWRpdC4KKy8vIFNlZSBsYXllcl9jaGFzc2lzX2Rpc3BhdGNoX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucy4KKworLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpZiBkZWZpbmVkKExBWUVSX0NIQVNTSVNfQ0FOX1dSQVBfSEFORExFUykKK2V4dGVybiBib29sIHdyYXBfaGFuZGxlczsKKyNlbHNlCitleHRlcm4gYm9vbCB3cmFwX2hhbmRsZXM7CisjZW5kaWYKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbnN0YW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lJbnN0YW5jZSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CitWa1Jlc3VsdCBEaXNwYXRjaEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpOwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VDcmVhdGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKiAgICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpOworUEZOX3ZrVm9pZEZ1bmN0aW9uIERpc3BhdGNoR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworUEZOX3ZrVm9pZEZ1bmN0aW9uIERpc3BhdGNoR2V0RGV2aWNlUHJvY0FkZHIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmFtZSk7CitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZURldmljZSgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZSk7Cit2b2lkIERpc3BhdGNoRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJOYW1lLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CitWa1Jlc3VsdCBEaXNwYXRjaEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllck5hbWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXREZXZpY2VRdWV1ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUluZGV4LAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKTsKK1ZrUmVzdWx0IERpc3BhdGNoUXVldWVTdWJtaXQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdENvdW50LAorICAgIGNvbnN0IFZrU3VibWl0SW5mbyogICAgICAgICAgICAgICAgICAgICAgICAgcFN1Ym1pdHMsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSk7CitWa1Jlc3VsdCBEaXNwYXRjaFF1ZXVlV2FpdElkbGUoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSk7CitWa1Jlc3VsdCBEaXNwYXRjaERldmljZVdhaXRJZGxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKK1ZrUmVzdWx0IERpc3BhdGNoQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpOwordm9pZCBEaXNwYXRjaEZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoTWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICBWa01lbW9yeU1hcEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBEYXRhKTsKK3ZvaWQgRGlzcGF0Y2hVbm1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSk7CitWa1Jlc3VsdCBEaXNwYXRjaEZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpOwordm9pZCBEaXNwYXRjaEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcyk7CitWa1Jlc3VsdCBEaXNwYXRjaEJpbmRCdWZmZXJNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQpOworVmtSZXN1bHQgRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCk7Cit2b2lkIERpc3BhdGNoR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit2b2lkIERpc3BhdGNoR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOwordm9pZCBEaXNwYXRjaEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CitWa1Jlc3VsdCBEaXNwYXRjaFF1ZXVlQmluZFNwYXJzZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiAgICAgICAgICAgICAgICAgICAgIHBCaW5kSW5mbywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlRmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CitWa1Jlc3VsdCBEaXNwYXRjaFJlc2V0RmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRGZW5jZVN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKTsKK1ZrUmVzdWx0IERpc3BhdGNoV2FpdEZvckZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzLAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEFsbCwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTZW1hcGhvcmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlKTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95U2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50KTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKK1ZrUmVzdWx0IERpc3BhdGNoU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CitWa1Jlc3VsdCBEaXNwYXRjaFJlc2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcik7Cit2b2lkIERpc3BhdGNoRGVzdHJveUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyVmlldyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSk7Cit2b2lkIERpc3BhdGNoRGVzdHJveUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK3ZvaWQgRGlzcGF0Y2hHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiAgICAgICAgICAgICAgICAgICBwU3VicmVzb3VyY2UsCisgICAgVmtTdWJyZXNvdXJjZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0KTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2VWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlU2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2hhZGVyTW9kdWxlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRlck1vZHVsZSk7Cit2b2lkIERpc3BhdGNoRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lQ2FjaGUpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CitWa1Jlc3VsdCBEaXNwYXRjaE1lcmdlUGlwZWxpbmVDYWNoZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUxheW91dCk7Cit2b2lkIERpc3BhdGNoRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlU2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVyKTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95U2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgIHBTZXRMYXlvdXQpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yUG9vbCk7Cit2b2lkIERpc3BhdGNoRGVzdHJveURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoUmVzZXREZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgZmxhZ3MpOworVmtSZXN1bHQgRGlzcGF0Y2hBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cyk7CitWa1Jlc3VsdCBEaXNwYXRjaEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKTsKK3ZvaWQgRGlzcGF0Y2hVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZyYW1lYnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlcik7Cit2b2lkIERpc3BhdGNoRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95UmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK3ZvaWQgRGlzcGF0Y2hHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtDb21tYW5kUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZFBvb2wpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CitWa1Jlc3VsdCBEaXNwYXRjaFJlc2V0Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQWxsb2NhdGVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpOwordm9pZCBEaXNwYXRjaEZyZWVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQmVnaW5Db21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qICAgICAgICAgICAgIHBCZWdpbkluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hFbmRDb21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CitWa1Jlc3VsdCBEaXNwYXRjaFJlc2V0Q29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICBmbGFncyk7Cit2b2lkIERpc3BhdGNoQ21kQmluZFBpcGVsaW5lKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpOwordm9pZCBEaXNwYXRjaENtZFNldFZpZXdwb3J0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cyk7Cit2b2lkIERpc3BhdGNoQ21kU2V0U2Npc3NvcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNjaXNzb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lzc29yQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Npc3NvcnMpOwordm9pZCBEaXNwYXRjaENtZFNldExpbmVXaWR0aCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgpOwordm9pZCBEaXNwYXRjaENtZFNldERlcHRoQmlhcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NsYW1wLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IpOwordm9pZCBEaXNwYXRjaENtZFNldEJsZW5kQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kQ29uc3RhbnRzWzRdKTsKK3ZvaWQgRGlzcGF0Y2hDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKTsKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFzayk7Cit2b2lkIERpc3BhdGNoQ21kU2V0U3RlbmNpbFdyaXRlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTWFzayk7Cit2b2lkIERpc3BhdGNoQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSk7Cit2b2lkIERpc3BhdGNoQ21kQmluZERlc2NyaXB0b3JTZXRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljT2Zmc2V0Q291bnQsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHluYW1pY09mZnNldHMpOwordm9pZCBEaXNwYXRjaENtZEJpbmRJbmRleEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtJbmRleFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFR5cGUpOwordm9pZCBEaXNwYXRjaENtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpOwordm9pZCBEaXNwYXRjaENtZERyYXcoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWZXJ0ZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKTsKK3ZvaWQgRGlzcGF0Y2hDbWREcmF3SW5kZXhlZCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXgsCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKTsKK3ZvaWQgRGlzcGF0Y2hDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKK3ZvaWQgRGlzcGF0Y2hDbWREcmF3SW5kZXhlZEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7Cit2b2lkIERpc3BhdGNoQ21kRGlzcGF0Y2goCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKTsKK3ZvaWQgRGlzcGF0Y2hDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Cit2b2lkIERpc3BhdGNoQ21kQ29weUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckNvcHkqICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKK3ZvaWQgRGlzcGF0Y2hDbWRDb3B5SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKK3ZvaWQgRGlzcGF0Y2hDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQmxpdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLAorICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKTsKK3ZvaWQgRGlzcGF0Y2hDbWRDb3B5QnVmZmVyVG9JbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7Cit2b2lkIERpc3BhdGNoQ21kQ29weUltYWdlVG9CdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOwordm9pZCBEaXNwYXRjaENtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKK3ZvaWQgRGlzcGF0Y2hDbWRGaWxsQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKK3ZvaWQgRGlzcGF0Y2hDbWRDbGVhckNvbG9ySW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSogICAgICAgICAgICAgICAgICAgIHBDb2xvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKTsKK3ZvaWQgRGlzcGF0Y2hDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpOwordm9pZCBEaXNwYXRjaENtZENsZWFyQXR0YWNobWVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKTsKK3ZvaWQgRGlzcGF0Y2hDbWRSZXNvbHZlSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlUmVzb2x2ZSogICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7Cit2b2lkIERpc3BhdGNoQ21kUmVzZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7Cit2b2lkIERpc3BhdGNoQ21kV2FpdEV2ZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50LAorICAgIGNvbnN0IFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50cywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpOwordm9pZCBEaXNwYXRjaENtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKK3ZvaWQgRGlzcGF0Y2hDbWRCZWdpblF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwordm9pZCBEaXNwYXRjaENtZEVuZFF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KTsKK3ZvaWQgRGlzcGF0Y2hDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCk7Cit2b2lkIERpc3BhdGNoQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KTsKK3ZvaWQgRGlzcGF0Y2hDbWRDb3B5UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK3ZvaWQgRGlzcGF0Y2hDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcyk7Cit2b2lkIERpc3BhdGNoQ21kQmVnaW5SZW5kZXJQYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyk7Cit2b2lkIERpc3BhdGNoQ21kTmV4dFN1YnBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpOwordm9pZCBEaXNwYXRjaENtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKK3ZvaWQgRGlzcGF0Y2hDbWRFeGVjdXRlQ29tbWFuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKTsKK1ZrUmVzdWx0IERpc3BhdGNoRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uKAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFwaVZlcnNpb24pOworVmtSZXN1bHQgRGlzcGF0Y2hCaW5kQnVmZmVyTWVtb3J5MigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zKTsKK1ZrUmVzdWx0IERpc3BhdGNoQmluZEltYWdlTWVtb3J5MigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiAgICAgICAgICAgICAgICBwQmluZEluZm9zKTsKK3ZvaWQgRGlzcGF0Y2hHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpOwordm9pZCBEaXNwYXRjaENtZFNldERldmljZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzayk7Cit2b2lkIERpc3BhdGNoQ21kRGlzcGF0Y2hCYXNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWiwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50Wik7CitWa1Jlc3VsdCBEaXNwYXRjaEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOwordm9pZCBEaXNwYXRjaEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOwordm9pZCBEaXNwYXRjaEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogICAgIHBJbWFnZUZvcm1hdEluZm8sCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcyk7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICBwUHJvcGVydGllcyk7Cit2b2lkIERpc3BhdGNoVHJpbUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Cit2b2lkIERpc3BhdGNoR2V0RGV2aWNlUXVldWUyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlSW5mbywKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSk7CitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Cit2b2lkIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpOwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogICAgICAgICAgICAgIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpOwordm9pZCBEaXNwYXRjaEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCk7Cit2b2lkIERpc3BhdGNoRGVzdHJveVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2Rlcyk7CitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVN3YXBjaGFpbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW4pOwordm9pZCBEaXNwYXRjaERlc3Ryb3lTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0U3dhcGNoYWluSW1hZ2VzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlQ291bnQsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KTsKK1ZrUmVzdWx0IERpc3BhdGNoUXVldWVQcmVzZW50S0hSKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJlc2VudEluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqICAgICAgICBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2Rlcyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQWNxdWlyZU5leHRJbWFnZTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogICAgICAgICAgICBwQWNxdWlyZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VJbmRleCk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5Q291bnQsCisgICAgVmtEaXNwbGF5S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlRGlzcGxheU1vZGVLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEaXNwbGF5TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9kZSk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheU1vZGVLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMpOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorVmtCb29sMzIgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZpc3VhbElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsSUQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVhjYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCitWa0Jvb2wzMiBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB4Y2JfY29ubmVjdGlvbl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgeGNiX3Zpc3VhbGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxfaWQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCitWa0Jvb2wzMiBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgc3RydWN0IHdsX2Rpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWa0Jvb2wzMiBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiAgICAgICAgICAgICAgICAgIHBGZWF0dXJlcyk7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpOwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcyk7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpOwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgcFByb3BlcnRpZXMpOwordm9pZCBEaXNwYXRjaEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcyk7Cit2b2lkIERpc3BhdGNoQ21kU2V0RGV2aWNlTWFza0tIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKTsKK3ZvaWQgRGlzcGF0Y2hDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKTsKK3ZvaWQgRGlzcGF0Y2hUcmltQ29tbWFuZFBvb2xLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK1ZrUmVzdWx0IERpc3BhdGNoRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpOwordm9pZCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogICBwRXh0ZXJuYWxCdWZmZXJJbmZvLAorICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcyk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcyk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hHZXRNZW1vcnlGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsCisgICAgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICBwTWVtb3J5RmRQcm9wZXJ0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sCisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqICAgICAgICAgICAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWa1Jlc3VsdCBEaXNwYXRjaEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiAgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK1ZrUmVzdWx0IERpc3BhdGNoR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hJbXBvcnRTZW1hcGhvcmVGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiogICAgICAgICAgIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRTZW1hcGhvcmVGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOwordm9pZCBEaXNwYXRjaENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcyk7Cit2b2lkIERpc3BhdGNoQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Cit2b2lkIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpOwordm9pZCBEaXNwYXRjaENtZEJlZ2luUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKTsKK3ZvaWQgRGlzcGF0Y2hDbWROZXh0U3VicGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICAgICAgICAgICAgcFN1YnBhc3NCZWdpbkluZm8sCisgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgICAgICAgICAgICBwU3VicGFzc0VuZEluZm8pOwordm9pZCBEaXNwYXRjaENtZEVuZFJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldFN3YXBjaGFpblN0YXR1c0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbik7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogICAgcEV4dGVybmFsRmVuY2VJbmZvLAorICAgIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWa1Jlc3VsdCBEaXNwYXRjaEltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogICAgICBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWa1Jlc3VsdCBEaXNwYXRjaEdldEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hJbXBvcnRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqICAgICAgICAgICAgICAgcEltcG9ydEZlbmNlRmRJbmZvKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOworVmtSZXN1bHQgRGlzcGF0Y2hFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJDb3VudCwKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogICAgICAgICAgICAgICAgICAgIHBDb3VudGVycywKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiAgICAgICAgIHBDb3VudGVyRGVzY3JpcHRpb25zKTsKK3ZvaWQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiAgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVBhc3Nlcyk7CitWa1Jlc3VsdCBEaXNwYXRjaEFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiAgICAgICAgcEluZm8pOwordm9pZCBEaXNwYXRjaFJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXQyS0hSKiAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIqICAgICAgICAgICAgICAgcERpc3BsYXlQbGFuZUluZm8sCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKTsKK3ZvaWQgRGlzcGF0Y2hHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOwordm9pZCBEaXNwYXRjaEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOwordm9pZCBEaXNwYXRjaEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24pOwordm9pZCBEaXNwYXRjaERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CitWa1Jlc3VsdCBEaXNwYXRjaEJpbmRCdWZmZXJNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworVmtSZXN1bHQgRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOwordm9pZCBEaXNwYXRjaEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCk7Cit2b2lkIERpc3BhdGNoQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7Cit2b2lkIERpc3BhdGNoQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUpOworVmtSZXN1bHQgRGlzcGF0Y2hXYWl0U2VtYXBob3Jlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiAgICAgICAgICAgICAgIHBXYWl0SW5mbywKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOworVmtSZXN1bHQgRGlzcGF0Y2hTaWduYWxTZW1hcGhvcmVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKiAgICAgICAgICAgICBwU2lnbmFsSW5mbyk7CitWa0RldmljZUFkZHJlc3MgRGlzcGF0Y2hHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pOwordWludDY0X3QgRGlzcGF0Y2hHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKTsKK3VpbnQ2NF90IERpc3BhdGNoR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiogICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXhlY3V0YWJsZUNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogICAgICAgICAgcFByb3BlcnRpZXMpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogICAgICAgICAgcEV4ZWN1dGFibGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YXRpc3RpY0NvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiAgICAgICAgICAgcFN0YXRpc3RpY3MpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2spOwordm9pZCBEaXNwYXRjaERlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOwordm9pZCBEaXNwYXRjaERlYnVnUmVwb3J0TWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRGbGFnc0VYVCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29kZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllclByZWZpeCwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXNzYWdlKTsKK1ZrUmVzdWx0IERpc3BhdGNoRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQqICAgICAgICBwVGFnSW5mbyk7CitWa1Jlc3VsdCBEaXNwYXRjaERlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqICAgICAgIHBOYW1lSW5mbyk7Cit2b2lkIERpc3BhdGNoQ21kRGVidWdNYXJrZXJCZWdpbkVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqICAgICAgICAgICBwTWFya2VySW5mbyk7Cit2b2lkIERpc3BhdGNoQ21kRGVidWdNYXJrZXJFbmRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKK3ZvaWQgRGlzcGF0Y2hDbWREZWJ1Z01hcmtlckluc2VydEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqICAgICAgICAgICBwTWFya2VySW5mbyk7Cit2b2lkIERpc3BhdGNoQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcFNpemVzKTsKK3ZvaWQgRGlzcGF0Y2hDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q291bnRlckJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyk7Cit2b2lkIERpc3BhdGNoQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKK3ZvaWQgRGlzcGF0Y2hDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwordm9pZCBEaXNwYXRjaENtZEVuZFF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKK3ZvaWQgRGlzcGF0Y2hDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpOwordWludDMyX3QgRGlzcGF0Y2hHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbyk7Cit2b2lkIERpc3BhdGNoQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7Cit2b2lkIERpc3BhdGNoQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRTaGFkZXJJbmZvQU1EKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgVmtTaGFkZXJTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdGFnZSwKKyAgICBWa1NoYWRlckluZm9UeXBlQU1EICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm9TaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm8pOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGV4dGVybmFsSGFuZGxlVHlwZSwKKyAgICBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqICAgICAgICAgIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlVmlTdXJmYWNlTk4oCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fVklfTk4KK3ZvaWQgRGlzcGF0Y2hDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiAgIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKTsKK3ZvaWQgRGlzcGF0Y2hDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOwordm9pZCBEaXNwYXRjaENtZFByb2Nlc3NDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiAgICAgICAgICBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7Cit2b2lkIERpc3BhdGNoQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiAgcFJlc2VydmVTcGFjZUluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqICAgICAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0KTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggICAgICAgICAgICAgICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CitWa1Jlc3VsdCBEaXNwYXRjaFJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKTsKK1ZrUmVzdWx0IERpc3BhdGNoVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcyk7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqICAgICAgIHBGZWF0dXJlcywKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiAgICAgICAgIHBMaW1pdHMpOwordm9pZCBEaXNwYXRjaENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogICAgICAgICAgICAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncyk7CitWa1Jlc3VsdCBEaXNwYXRjaFJlbGVhc2VEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCitWa1Jlc3VsdCBEaXNwYXRjaEFjcXVpcmVYbGliRGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgUlJPdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByck91dHB1dCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcyk7CitWa1Jlc3VsdCBEaXNwYXRjaERpc3BsYXlQb3dlckNvbnRyb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlQb3dlckluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hSZWdpc3RlckRldmljZUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICAgcERldmljZUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpOworVmtSZXN1bHQgRGlzcGF0Y2hSZWdpc3RlckRpc3BsYXlFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRTd2FwY2hhaW5Db3VudGVyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCAgICAgICAgICAgICAgICAgY291bnRlciwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyVmFsdWUpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiAgICAgICAgICAgICAgIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsCisgICAgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5ncyk7Cit2b2lkIERpc3BhdGNoQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERpc2NhcmRSZWN0YW5nbGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXMpOwordm9pZCBEaXNwYXRjaFNldEhkck1ldGFkYXRhRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWlucywKKyAgICBjb25zdCBWa0hkck1ldGFkYXRhRVhUKiAgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YSk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlSU9TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVNYWNPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCitWa1Jlc3VsdCBEaXNwYXRjaFNldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUKiAgICAgICAgcE5hbWVJbmZvKTsKK1ZrUmVzdWx0IERpc3BhdGNoU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgIHBUYWdJbmZvKTsKK3ZvaWQgRGlzcGF0Y2hRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKTsKK3ZvaWQgRGlzcGF0Y2hRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKTsKK3ZvaWQgRGlzcGF0Y2hRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbyk7Cit2b2lkIERpc3BhdGNoQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbyk7Cit2b2lkIERpc3BhdGNoQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7Cit2b2lkIERpc3BhdGNoQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKiAgICAgICAgICAgICAgICAgICBwTWVzc2VuZ2VyKTsKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Cit2b2lkIERpc3BhdGNoU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCAgICAgIG1lc3NhZ2VTZXZlcml0eSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICAgICAgICAgICAgIG1lc3NhZ2VUeXBlcywKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEpOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKiAgIHBQcm9wZXJ0aWVzKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK1ZrUmVzdWx0IERpc3BhdGNoR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgordm9pZCBEaXNwYXRjaENtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiAgICAgICAgICAgICBwU2FtcGxlTG9jYXRpb25zSW5mbyk7Cit2b2lkIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqICAgICAgICAgICAgICAgICBwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgICAgICAgcFZhbGlkYXRpb25DYWNoZSk7Cit2b2lkIERpc3BhdGNoRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworVmtSZXN1bHQgRGlzcGF0Y2hNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKK3ZvaWQgRGlzcGF0Y2hDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0KTsKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqICAgICAgICAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpOwordm9pZCBEaXNwYXRjaENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgICAgICAgICAgICAgICAgICAgc2FtcGxlT3JkZXJUeXBlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwKKyAgICBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqICAgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnMpOworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOwordm9pZCBEaXNwYXRjaERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOwordm9pZCBEaXNwYXRjaEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworVmtSZXN1bHQgRGlzcGF0Y2hCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcyk7Cit2b2lkIERpc3BhdGNoQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqICAgICAgICBwSW5mbywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlT2Zmc2V0LAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hPZmZzZXQpOwordm9pZCBEaXNwYXRjaENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WICAgICAgICAgICBtb2RlKTsKK3ZvaWQgRGlzcGF0Y2hDbWRUcmFjZVJheXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7CitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RHcm91cCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKK3ZvaWQgRGlzcGF0Y2hDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywKKyAgICBWa1F1ZXJ5VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnkpOworVmtSZXN1bHQgRGlzcGF0Y2hDb21waWxlRGVmZXJyZWROVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIb3N0UG9pbnRlciwKKyAgICBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCogICAgICAgICAgIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMpOwordm9pZCBEaXNwYXRjaENtZFdyaXRlQnVmZmVyTWFya2VyQU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RhZ2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIpOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEb21haW5Db3VudCwKKyAgICBWa1RpbWVEb21haW5FWFQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWlucyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wQ291bnQsCisgICAgY29uc3QgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCogICAgICAgICBwVGltZXN0YW1wSW5mb3MsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZXN0YW1wcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXhEZXZpYXRpb24pOwordm9pZCBEaXNwYXRjaENtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spOwordm9pZCBEaXNwYXRjaENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7Cit2b2lkIERpc3BhdGNoQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzKTsKK3ZvaWQgRGlzcGF0Y2hDbWRTZXRDaGVja3BvaW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnRNYXJrZXIpOwordm9pZCBEaXNwYXRjaEdldFF1ZXVlQ2hlY2twb2ludERhdGFOVigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhQ291bnQsCisgICAgVmtDaGVja3BvaW50RGF0YU5WKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGEpOworVmtSZXN1bHQgRGlzcGF0Y2hJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogIHBJbml0aWFsaXplSW5mbyk7Cit2b2lkIERpc3BhdGNoVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CitWa1Jlc3VsdCBEaXNwYXRjaENtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqICAgICAgICAgcE1hcmtlckluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiAgIHBNYXJrZXJJbmZvKTsKK1ZrUmVzdWx0IERpc3BhdGNoQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqICAgICAgIHBPdmVycmlkZUluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbik7CitWa1Jlc3VsdCBEaXNwYXRjaFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pOworVmtSZXN1bHQgRGlzcGF0Y2hRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAgICAgICAgICAgICBjb25maWd1cmF0aW9uKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMICAgICAgICAgICAgIHBhcmFtZXRlciwKKyAgICBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCogICAgICAgICAgICAgICAgICAgIHBWYWx1ZSk7Cit2b2lkIERpc3BhdGNoU2V0TG9jYWxEaW1taW5nQU1EKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcENoYWluLAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEaW1taW5nRW5hYmxlKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVNZXRhbFN1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCitWa0RldmljZUFkZHJlc3MgRGlzcGF0Y2hHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pOworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9vbENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogICAgICAgICAgcFRvb2xQcm9wZXJ0aWVzKTsKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogICAgICAgICAgICBwUHJvcGVydGllcyk7CitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbWJpbmF0aW9uQ291bnQsCisgICAgVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqICAgICBwQ29tYmluYXRpb25zKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2Rlcyk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK1ZrUmVzdWx0IERpc3BhdGNoQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVmtSZXN1bHQgRGlzcGF0Y2hSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitWa1Jlc3VsdCBEaXNwYXRjaEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7Cit2b2lkIERpc3BhdGNoQ21kU2V0TGluZVN0aXBwbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVGYWN0b3IsCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZVBhdHRlcm4pOwordm9pZCBEaXNwYXRjaFJlc2V0UXVlcnlQb29sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvbHZ0X2Z1bmN0aW9uX3BvaW50ZXJzLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvbHZ0X2Z1bmN0aW9uX3BvaW50ZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTc1YTlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9sdnRfZnVuY3Rpb25fcG9pbnRlcnMuY3BwCkBAIC0wLDAgKzEsNDgzIEBACisvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKgorLy8gU2VlIGx2dF9maWxlX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICovCisKKworI2luY2x1ZGUgImx2dF9mdW5jdGlvbl9wb2ludGVycy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSB2ayB7CisKK1BGTl92a0NyZWF0ZUluc3RhbmNlIENyZWF0ZUluc3RhbmNlOworUEZOX3ZrRGVzdHJveUluc3RhbmNlIERlc3Ryb3lJbnN0YW5jZTsKK1BGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyBFbnVtZXJhdGVQaHlzaWNhbERldmljZXM7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXM7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXM7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBHZXRJbnN0YW5jZVByb2NBZGRyOworUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgR2V0RGV2aWNlUHJvY0FkZHI7CitQRk5fdmtDcmVhdGVEZXZpY2UgQ3JlYXRlRGV2aWNlOworUEZOX3ZrRGVzdHJveURldmljZSBEZXN0cm95RGV2aWNlOworUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllczsKK1BGTl92a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMgRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllczsKK1BGTl92a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzOworUEZOX3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIEVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllczsKK1BGTl92a0dldERldmljZVF1ZXVlIEdldERldmljZVF1ZXVlOworUEZOX3ZrUXVldWVTdWJtaXQgUXVldWVTdWJtaXQ7CitQRk5fdmtRdWV1ZVdhaXRJZGxlIFF1ZXVlV2FpdElkbGU7CitQRk5fdmtEZXZpY2VXYWl0SWRsZSBEZXZpY2VXYWl0SWRsZTsKK1BGTl92a0FsbG9jYXRlTWVtb3J5IEFsbG9jYXRlTWVtb3J5OworUEZOX3ZrRnJlZU1lbW9yeSBGcmVlTWVtb3J5OworUEZOX3ZrTWFwTWVtb3J5IE1hcE1lbW9yeTsKK1BGTl92a1VubWFwTWVtb3J5IFVubWFwTWVtb3J5OworUEZOX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXM7CitQRk5fdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXM7CitQRk5fdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQ7CitQRk5fdmtCaW5kQnVmZmVyTWVtb3J5IEJpbmRCdWZmZXJNZW1vcnk7CitQRk5fdmtCaW5kSW1hZ2VNZW1vcnkgQmluZEltYWdlTWVtb3J5OworUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czsKK1BGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzOworUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHM7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczsKK1BGTl92a1F1ZXVlQmluZFNwYXJzZSBRdWV1ZUJpbmRTcGFyc2U7CitQRk5fdmtDcmVhdGVGZW5jZSBDcmVhdGVGZW5jZTsKK1BGTl92a0Rlc3Ryb3lGZW5jZSBEZXN0cm95RmVuY2U7CitQRk5fdmtSZXNldEZlbmNlcyBSZXNldEZlbmNlczsKK1BGTl92a0dldEZlbmNlU3RhdHVzIEdldEZlbmNlU3RhdHVzOworUEZOX3ZrV2FpdEZvckZlbmNlcyBXYWl0Rm9yRmVuY2VzOworUEZOX3ZrQ3JlYXRlU2VtYXBob3JlIENyZWF0ZVNlbWFwaG9yZTsKK1BGTl92a0Rlc3Ryb3lTZW1hcGhvcmUgRGVzdHJveVNlbWFwaG9yZTsKK1BGTl92a0NyZWF0ZUV2ZW50IENyZWF0ZUV2ZW50OworUEZOX3ZrRGVzdHJveUV2ZW50IERlc3Ryb3lFdmVudDsKK1BGTl92a0dldEV2ZW50U3RhdHVzIEdldEV2ZW50U3RhdHVzOworUEZOX3ZrU2V0RXZlbnQgU2V0RXZlbnQ7CitQRk5fdmtSZXNldEV2ZW50IFJlc2V0RXZlbnQ7CitQRk5fdmtDcmVhdGVRdWVyeVBvb2wgQ3JlYXRlUXVlcnlQb29sOworUEZOX3ZrRGVzdHJveVF1ZXJ5UG9vbCBEZXN0cm95UXVlcnlQb29sOworUEZOX3ZrR2V0UXVlcnlQb29sUmVzdWx0cyBHZXRRdWVyeVBvb2xSZXN1bHRzOworUEZOX3ZrQ3JlYXRlQnVmZmVyIENyZWF0ZUJ1ZmZlcjsKK1BGTl92a0Rlc3Ryb3lCdWZmZXIgRGVzdHJveUJ1ZmZlcjsKK1BGTl92a0NyZWF0ZUJ1ZmZlclZpZXcgQ3JlYXRlQnVmZmVyVmlldzsKK1BGTl92a0Rlc3Ryb3lCdWZmZXJWaWV3IERlc3Ryb3lCdWZmZXJWaWV3OworUEZOX3ZrQ3JlYXRlSW1hZ2UgQ3JlYXRlSW1hZ2U7CitQRk5fdmtEZXN0cm95SW1hZ2UgRGVzdHJveUltYWdlOworUEZOX3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCBHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0OworUEZOX3ZrQ3JlYXRlSW1hZ2VWaWV3IENyZWF0ZUltYWdlVmlldzsKK1BGTl92a0Rlc3Ryb3lJbWFnZVZpZXcgRGVzdHJveUltYWdlVmlldzsKK1BGTl92a0NyZWF0ZVNoYWRlck1vZHVsZSBDcmVhdGVTaGFkZXJNb2R1bGU7CitQRk5fdmtEZXN0cm95U2hhZGVyTW9kdWxlIERlc3Ryb3lTaGFkZXJNb2R1bGU7CitQRk5fdmtDcmVhdGVQaXBlbGluZUNhY2hlIENyZWF0ZVBpcGVsaW5lQ2FjaGU7CitQRk5fdmtEZXN0cm95UGlwZWxpbmVDYWNoZSBEZXN0cm95UGlwZWxpbmVDYWNoZTsKK1BGTl92a0dldFBpcGVsaW5lQ2FjaGVEYXRhIEdldFBpcGVsaW5lQ2FjaGVEYXRhOworUEZOX3ZrTWVyZ2VQaXBlbGluZUNhY2hlcyBNZXJnZVBpcGVsaW5lQ2FjaGVzOworUEZOX3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM7CitQRk5fdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIENyZWF0ZUNvbXB1dGVQaXBlbGluZXM7CitQRk5fdmtEZXN0cm95UGlwZWxpbmUgRGVzdHJveVBpcGVsaW5lOworUEZOX3ZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQgQ3JlYXRlUGlwZWxpbmVMYXlvdXQ7CitQRk5fdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQgRGVzdHJveVBpcGVsaW5lTGF5b3V0OworUEZOX3ZrQ3JlYXRlU2FtcGxlciBDcmVhdGVTYW1wbGVyOworUEZOX3ZrRGVzdHJveVNhbXBsZXIgRGVzdHJveVNhbXBsZXI7CitQRk5fdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQ7CitQRk5fdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCBEZXN0cm95RGVzY3JpcHRvclNldExheW91dDsKK1BGTl92a0NyZWF0ZURlc2NyaXB0b3JQb29sIENyZWF0ZURlc2NyaXB0b3JQb29sOworUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JQb29sIERlc3Ryb3lEZXNjcmlwdG9yUG9vbDsKK1BGTl92a1Jlc2V0RGVzY3JpcHRvclBvb2wgUmVzZXREZXNjcmlwdG9yUG9vbDsKK1BGTl92a0FsbG9jYXRlRGVzY3JpcHRvclNldHMgQWxsb2NhdGVEZXNjcmlwdG9yU2V0czsKK1BGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cyBGcmVlRGVzY3JpcHRvclNldHM7CitQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0cyBVcGRhdGVEZXNjcmlwdG9yU2V0czsKK1BGTl92a0NyZWF0ZUZyYW1lYnVmZmVyIENyZWF0ZUZyYW1lYnVmZmVyOworUEZOX3ZrRGVzdHJveUZyYW1lYnVmZmVyIERlc3Ryb3lGcmFtZWJ1ZmZlcjsKK1BGTl92a0NyZWF0ZVJlbmRlclBhc3MgQ3JlYXRlUmVuZGVyUGFzczsKK1BGTl92a0Rlc3Ryb3lSZW5kZXJQYXNzIERlc3Ryb3lSZW5kZXJQYXNzOworUEZOX3ZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5IEdldFJlbmRlckFyZWFHcmFudWxhcml0eTsKK1BGTl92a0NyZWF0ZUNvbW1hbmRQb29sIENyZWF0ZUNvbW1hbmRQb29sOworUEZOX3ZrRGVzdHJveUNvbW1hbmRQb29sIERlc3Ryb3lDb21tYW5kUG9vbDsKK1BGTl92a1Jlc2V0Q29tbWFuZFBvb2wgUmVzZXRDb21tYW5kUG9vbDsKK1BGTl92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMgQWxsb2NhdGVDb21tYW5kQnVmZmVyczsKK1BGTl92a0ZyZWVDb21tYW5kQnVmZmVycyBGcmVlQ29tbWFuZEJ1ZmZlcnM7CitQRk5fdmtCZWdpbkNvbW1hbmRCdWZmZXIgQmVnaW5Db21tYW5kQnVmZmVyOworUEZOX3ZrRW5kQ29tbWFuZEJ1ZmZlciBFbmRDb21tYW5kQnVmZmVyOworUEZOX3ZrUmVzZXRDb21tYW5kQnVmZmVyIFJlc2V0Q29tbWFuZEJ1ZmZlcjsKK1BGTl92a0NtZEJpbmRQaXBlbGluZSBDbWRCaW5kUGlwZWxpbmU7CitQRk5fdmtDbWRTZXRWaWV3cG9ydCBDbWRTZXRWaWV3cG9ydDsKK1BGTl92a0NtZFNldFNjaXNzb3IgQ21kU2V0U2Npc3NvcjsKK1BGTl92a0NtZFNldExpbmVXaWR0aCBDbWRTZXRMaW5lV2lkdGg7CitQRk5fdmtDbWRTZXREZXB0aEJpYXMgQ21kU2V0RGVwdGhCaWFzOworUEZOX3ZrQ21kU2V0QmxlbmRDb25zdGFudHMgQ21kU2V0QmxlbmRDb25zdGFudHM7CitQRk5fdmtDbWRTZXREZXB0aEJvdW5kcyBDbWRTZXREZXB0aEJvdW5kczsKK1BGTl92a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayBDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2s7CitQRk5fdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrIENtZFNldFN0ZW5jaWxXcml0ZU1hc2s7CitQRk5fdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIENtZFNldFN0ZW5jaWxSZWZlcmVuY2U7CitQRk5fdmtDbWRCaW5kRGVzY3JpcHRvclNldHMgQ21kQmluZERlc2NyaXB0b3JTZXRzOworUEZOX3ZrQ21kQmluZEluZGV4QnVmZmVyIENtZEJpbmRJbmRleEJ1ZmZlcjsKK1BGTl92a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzIENtZEJpbmRWZXJ0ZXhCdWZmZXJzOworUEZOX3ZrQ21kRHJhdyBDbWREcmF3OworUEZOX3ZrQ21kRHJhd0luZGV4ZWQgQ21kRHJhd0luZGV4ZWQ7CitQRk5fdmtDbWREcmF3SW5kaXJlY3QgQ21kRHJhd0luZGlyZWN0OworUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCBDbWREcmF3SW5kZXhlZEluZGlyZWN0OworUEZOX3ZrQ21kRGlzcGF0Y2ggQ21kRGlzcGF0Y2g7CitQRk5fdmtDbWREaXNwYXRjaEluZGlyZWN0IENtZERpc3BhdGNoSW5kaXJlY3Q7CitQRk5fdmtDbWRDb3B5QnVmZmVyIENtZENvcHlCdWZmZXI7CitQRk5fdmtDbWRDb3B5SW1hZ2UgQ21kQ29weUltYWdlOworUEZOX3ZrQ21kQmxpdEltYWdlIENtZEJsaXRJbWFnZTsKK1BGTl92a0NtZENvcHlCdWZmZXJUb0ltYWdlIENtZENvcHlCdWZmZXJUb0ltYWdlOworUEZOX3ZrQ21kQ29weUltYWdlVG9CdWZmZXIgQ21kQ29weUltYWdlVG9CdWZmZXI7CitQRk5fdmtDbWRVcGRhdGVCdWZmZXIgQ21kVXBkYXRlQnVmZmVyOworUEZOX3ZrQ21kRmlsbEJ1ZmZlciBDbWRGaWxsQnVmZmVyOworUEZOX3ZrQ21kQ2xlYXJDb2xvckltYWdlIENtZENsZWFyQ29sb3JJbWFnZTsKK1BGTl92a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UgQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZTsKK1BGTl92a0NtZENsZWFyQXR0YWNobWVudHMgQ21kQ2xlYXJBdHRhY2htZW50czsKK1BGTl92a0NtZFJlc29sdmVJbWFnZSBDbWRSZXNvbHZlSW1hZ2U7CitQRk5fdmtDbWRTZXRFdmVudCBDbWRTZXRFdmVudDsKK1BGTl92a0NtZFJlc2V0RXZlbnQgQ21kUmVzZXRFdmVudDsKK1BGTl92a0NtZFdhaXRFdmVudHMgQ21kV2FpdEV2ZW50czsKK1BGTl92a0NtZFBpcGVsaW5lQmFycmllciBDbWRQaXBlbGluZUJhcnJpZXI7CitQRk5fdmtDbWRCZWdpblF1ZXJ5IENtZEJlZ2luUXVlcnk7CitQRk5fdmtDbWRFbmRRdWVyeSBDbWRFbmRRdWVyeTsKK1BGTl92a0NtZFJlc2V0UXVlcnlQb29sIENtZFJlc2V0UXVlcnlQb29sOworUEZOX3ZrQ21kV3JpdGVUaW1lc3RhbXAgQ21kV3JpdGVUaW1lc3RhbXA7CitQRk5fdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyBDbWRDb3B5UXVlcnlQb29sUmVzdWx0czsKK1BGTl92a0NtZFB1c2hDb25zdGFudHMgQ21kUHVzaENvbnN0YW50czsKK1BGTl92a0NtZEJlZ2luUmVuZGVyUGFzcyBDbWRCZWdpblJlbmRlclBhc3M7CitQRk5fdmtDbWROZXh0U3VicGFzcyBDbWROZXh0U3VicGFzczsKK1BGTl92a0NtZEVuZFJlbmRlclBhc3MgQ21kRW5kUmVuZGVyUGFzczsKK1BGTl92a0NtZEV4ZWN1dGVDb21tYW5kcyBDbWRFeGVjdXRlQ29tbWFuZHM7CitQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24gRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uOworUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTIgQmluZEJ1ZmZlck1lbW9yeTI7CitQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyIEJpbmRJbWFnZU1lbW9yeTI7CitQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyBHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlczsKK1BGTl92a0NtZFNldERldmljZU1hc2sgQ21kU2V0RGV2aWNlTWFzazsKK1BGTl92a0NtZERpc3BhdGNoQmFzZSBDbWREaXNwYXRjaEJhc2U7CitQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwczsKK1BGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI7CitQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czI7CitQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczI7CitQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI7CitQRk5fdmtUcmltQ29tbWFuZFBvb2wgVHJpbUNvbW1hbmRQb29sOworUEZOX3ZrR2V0RGV2aWNlUXVldWUyIEdldERldmljZVF1ZXVlMjsKK1BGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24gQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKK1BGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uIERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uOworUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKK1BGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKK1BGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUgVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZTsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CitQRk5fdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydDsKK1BGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSIERlc3Ryb3lTdXJmYWNlS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFI7CitQRk5fdmtDcmVhdGVTd2FwY2hhaW5LSFIgQ3JlYXRlU3dhcGNoYWluS0hSOworUEZOX3ZrRGVzdHJveVN3YXBjaGFpbktIUiBEZXN0cm95U3dhcGNoYWluS0hSOworUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIEdldFN3YXBjaGFpbkltYWdlc0tIUjsKK1BGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIgQWNxdWlyZU5leHRJbWFnZUtIUjsKK1BGTl92a1F1ZXVlUHJlc2VudEtIUiBRdWV1ZVByZXNlbnRLSFI7CitQRk5fdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSOworUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUjsKK1BGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUjsKK1BGTl92a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIEFjcXVpcmVOZXh0SW1hZ2UyS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSOworUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUjsKK1BGTl92a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSOworUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIEdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUjsKK1BGTl92a0NyZWF0ZURpc3BsYXlNb2RlS0hSIENyZWF0ZURpc3BsYXlNb2RlS0hSOworUEZOX3ZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUjsKK1BGTl92a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIgQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUjsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKK1BGTl92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIENyZWF0ZVhsaWJTdXJmYWNlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCitQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSIENyZWF0ZVhjYlN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorUEZOX3ZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIgQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCitQRk5fdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitQRk5fdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiBDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitQRk5fdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIgQ3JlYXRlV2luMzJTdXJmYWNlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitQRk5fdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworUEZOX3ZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIENyZWF0ZU1hY09TU3VyZmFjZU1WSzsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKKwordm9pZCBJbml0RGlzcGF0Y2hUYWJsZSgpIHsKKworI2lmKFdJTjMyKQorICAgIGNvbnN0IGNoYXIgZmlsZW5hbWVbXSA9ICJ2dWxrYW4tMS5kbGwiOworI2VsaWYoX19BUFBMRV9fKQorICAgIGNvbnN0IGNoYXIgZmlsZW5hbWVbXSA9ICJsaWJ2dWxrYW4uZHlsaWIiOworI2Vsc2UKKyAgICBjb25zdCBjaGFyIGZpbGVuYW1lW10gPSAibGlidnVsa2FuLnNvIjsKKyNlbmRpZgorCisgICAgYXV0byBsb2FkZXJfaGFuZGxlID0gbG9hZGVyX3BsYXRmb3JtX29wZW5fbGlicmFyeShmaWxlbmFtZSk7CisKKyAgICBpZiAobG9hZGVyX2hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHByaW50ZigiJXNcbiIsIGxvYWRlcl9wbGF0Zm9ybV9vcGVuX2xpYnJhcnlfZXJyb3IoZmlsZW5hbWUpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBDcmVhdGVJbnN0YW5jZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlSW5zdGFuY2U+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZUluc3RhbmNlIikpOworICAgIERlc3Ryb3lJbnN0YW5jZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveUluc3RhbmNlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95SW5zdGFuY2UiKSk7CisgICAgRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzIikpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiKSk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIikpOworICAgIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMiKSk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIpKTsKKyAgICBHZXRJbnN0YW5jZVByb2NBZGRyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRJbnN0YW5jZVByb2NBZGRyIikpOworICAgIEdldERldmljZVByb2NBZGRyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREZXZpY2VQcm9jQWRkcj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0RGV2aWNlUHJvY0FkZHIiKSk7CisgICAgQ3JlYXRlRGV2aWNlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVEZXZpY2U+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZURldmljZSIpKTsKKyAgICBEZXN0cm95RGV2aWNlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95RGV2aWNlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95RGV2aWNlIikpOworICAgIEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMiKSk7CisgICAgRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyIpKTsKKyAgICBFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIikpOworICAgIEVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMiKSk7CisgICAgR2V0RGV2aWNlUXVldWUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldERldmljZVF1ZXVlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXREZXZpY2VRdWV1ZSIpKTsKKyAgICBRdWV1ZVN1Ym1pdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrUXVldWVTdWJtaXQ+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a1F1ZXVlU3VibWl0IikpOworICAgIFF1ZXVlV2FpdElkbGUgPSByZWludGVycHJldF9jYXN0PFBGTl92a1F1ZXVlV2FpdElkbGU+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a1F1ZXVlV2FpdElkbGUiKSk7CisgICAgRGV2aWNlV2FpdElkbGUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0RldmljZVdhaXRJZGxlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXZpY2VXYWl0SWRsZSIpKTsKKyAgICBBbGxvY2F0ZU1lbW9yeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQWxsb2NhdGVNZW1vcnk+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0FsbG9jYXRlTWVtb3J5IikpOworICAgIEZyZWVNZW1vcnkgPSByZWludGVycHJldF9jYXN0PFBGTl92a0ZyZWVNZW1vcnk+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0ZyZWVNZW1vcnkiKSk7CisgICAgTWFwTWVtb3J5ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtNYXBNZW1vcnk+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a01hcE1lbW9yeSIpKTsKKyAgICBVbm1hcE1lbW9yeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVW5tYXBNZW1vcnk+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a1VubWFwTWVtb3J5IikpOworICAgIEZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiKSk7CisgICAgSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIpKTsKKyAgICBHZXREZXZpY2VNZW1vcnlDb21taXRtZW50ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50Pihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IikpOworICAgIEJpbmRCdWZmZXJNZW1vcnkgPSByZWludGVycHJldF9jYXN0PFBGTl92a0JpbmRCdWZmZXJNZW1vcnk+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0JpbmRCdWZmZXJNZW1vcnkiKSk7CisgICAgQmluZEltYWdlTWVtb3J5ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtCaW5kSW1hZ2VNZW1vcnk+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0JpbmRJbWFnZU1lbW9yeSIpKTsKKyAgICBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIikpOworICAgIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMiKSk7CisgICAgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIikpOworICAgIFF1ZXVlQmluZFNwYXJzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrUXVldWVCaW5kU3BhcnNlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtRdWV1ZUJpbmRTcGFyc2UiKSk7CisgICAgQ3JlYXRlRmVuY2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZUZlbmNlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVGZW5jZSIpKTsKKyAgICBEZXN0cm95RmVuY2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lGZW5jZT4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRGVzdHJveUZlbmNlIikpOworICAgIFJlc2V0RmVuY2VzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtSZXNldEZlbmNlcz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrUmVzZXRGZW5jZXMiKSk7CisgICAgR2V0RmVuY2VTdGF0dXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldEZlbmNlU3RhdHVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRGZW5jZVN0YXR1cyIpKTsKKyAgICBXYWl0Rm9yRmVuY2VzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtXYWl0Rm9yRmVuY2VzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtXYWl0Rm9yRmVuY2VzIikpOworICAgIENyZWF0ZVNlbWFwaG9yZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlU2VtYXBob3JlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVTZW1hcGhvcmUiKSk7CisgICAgRGVzdHJveVNlbWFwaG9yZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVNlbWFwaG9yZT4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRGVzdHJveVNlbWFwaG9yZSIpKTsKKyAgICBDcmVhdGVFdmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRXZlbnQ+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZUV2ZW50IikpOworICAgIERlc3Ryb3lFdmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveUV2ZW50Pihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95RXZlbnQiKSk7CisgICAgR2V0RXZlbnRTdGF0dXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldEV2ZW50U3RhdHVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRFdmVudFN0YXR1cyIpKTsKKyAgICBTZXRFdmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrU2V0RXZlbnQ+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a1NldEV2ZW50IikpOworICAgIFJlc2V0RXZlbnQgPSByZWludGVycHJldF9jYXN0PFBGTl92a1Jlc2V0RXZlbnQ+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a1Jlc2V0RXZlbnQiKSk7CisgICAgQ3JlYXRlUXVlcnlQb29sID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVRdWVyeVBvb2w+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZVF1ZXJ5UG9vbCIpKTsKKyAgICBEZXN0cm95UXVlcnlQb29sID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95UXVlcnlQb29sPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95UXVlcnlQb29sIikpOworICAgIEdldFF1ZXJ5UG9vbFJlc3VsdHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFF1ZXJ5UG9vbFJlc3VsdHM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFF1ZXJ5UG9vbFJlc3VsdHMiKSk7CisgICAgQ3JlYXRlQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVCdWZmZXI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZUJ1ZmZlciIpKTsKKyAgICBEZXN0cm95QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95QnVmZmVyPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95QnVmZmVyIikpOworICAgIENyZWF0ZUJ1ZmZlclZpZXcgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZUJ1ZmZlclZpZXc+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZUJ1ZmZlclZpZXciKSk7CisgICAgRGVzdHJveUJ1ZmZlclZpZXcgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lCdWZmZXJWaWV3Pihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95QnVmZmVyVmlldyIpKTsKKyAgICBDcmVhdGVJbWFnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlSW1hZ2U+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZUltYWdlIikpOworICAgIERlc3Ryb3lJbWFnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveUltYWdlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95SW1hZ2UiKSk7CisgICAgR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIpKTsKKyAgICBDcmVhdGVJbWFnZVZpZXcgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZUltYWdlVmlldz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ3JlYXRlSW1hZ2VWaWV3IikpOworICAgIERlc3Ryb3lJbWFnZVZpZXcgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lJbWFnZVZpZXc+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0Rlc3Ryb3lJbWFnZVZpZXciKSk7CisgICAgQ3JlYXRlU2hhZGVyTW9kdWxlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVTaGFkZXJNb2R1bGU+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIpKTsKKyAgICBEZXN0cm95U2hhZGVyTW9kdWxlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95U2hhZGVyTW9kdWxlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95U2hhZGVyTW9kdWxlIikpOworICAgIENyZWF0ZVBpcGVsaW5lQ2FjaGUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVBpcGVsaW5lQ2FjaGU+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiKSk7CisgICAgRGVzdHJveVBpcGVsaW5lQ2FjaGUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lQaXBlbGluZUNhY2hlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95UGlwZWxpbmVDYWNoZSIpKTsKKyAgICBHZXRQaXBlbGluZUNhY2hlRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGlwZWxpbmVDYWNoZURhdGE+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBpcGVsaW5lQ2FjaGVEYXRhIikpOworICAgIE1lcmdlUGlwZWxpbmVDYWNoZXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a01lcmdlUGlwZWxpbmVDYWNoZXM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a01lcmdlUGlwZWxpbmVDYWNoZXMiKSk7CisgICAgQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIpKTsKKyAgICBDcmVhdGVDb21wdXRlUGlwZWxpbmVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIikpOworICAgIERlc3Ryb3lQaXBlbGluZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVBpcGVsaW5lPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95UGlwZWxpbmUiKSk7CisgICAgQ3JlYXRlUGlwZWxpbmVMYXlvdXQgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVBpcGVsaW5lTGF5b3V0Pihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVQaXBlbGluZUxheW91dCIpKTsKKyAgICBEZXN0cm95UGlwZWxpbmVMYXlvdXQgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lQaXBlbGluZUxheW91dD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRGVzdHJveVBpcGVsaW5lTGF5b3V0IikpOworICAgIENyZWF0ZVNhbXBsZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVNhbXBsZXI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZVNhbXBsZXIiKSk7CisgICAgRGVzdHJveVNhbXBsZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lTYW1wbGVyPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95U2FtcGxlciIpKTsKKyAgICBDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0Pihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IikpOworICAgIERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiKSk7CisgICAgQ3JlYXRlRGVzY3JpcHRvclBvb2wgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZURlc2NyaXB0b3JQb29sPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVEZXNjcmlwdG9yUG9vbCIpKTsKKyAgICBEZXN0cm95RGVzY3JpcHRvclBvb2wgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRGVzdHJveURlc2NyaXB0b3JQb29sIikpOworICAgIFJlc2V0RGVzY3JpcHRvclBvb2wgPSByZWludGVycHJldF9jYXN0PFBGTl92a1Jlc2V0RGVzY3JpcHRvclBvb2w+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a1Jlc2V0RGVzY3JpcHRvclBvb2wiKSk7CisgICAgQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyIpKTsKKyAgICBGcmVlRGVzY3JpcHRvclNldHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRnJlZURlc2NyaXB0b3JTZXRzIikpOworICAgIFVwZGF0ZURlc2NyaXB0b3JTZXRzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0cz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrVXBkYXRlRGVzY3JpcHRvclNldHMiKSk7CisgICAgQ3JlYXRlRnJhbWVidWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZUZyYW1lYnVmZmVyPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVGcmFtZWJ1ZmZlciIpKTsKKyAgICBEZXN0cm95RnJhbWVidWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lGcmFtZWJ1ZmZlcj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRGVzdHJveUZyYW1lYnVmZmVyIikpOworICAgIENyZWF0ZVJlbmRlclBhc3MgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVJlbmRlclBhc3M+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZVJlbmRlclBhc3MiKSk7CisgICAgRGVzdHJveVJlbmRlclBhc3MgPSByZWludGVycHJldF9jYXN0PFBGTl92a0Rlc3Ryb3lSZW5kZXJQYXNzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95UmVuZGVyUGFzcyIpKTsKKyAgICBHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFJlbmRlckFyZWFHcmFudWxhcml0eT4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5IikpOworICAgIENyZWF0ZUNvbW1hbmRQb29sID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVDb21tYW5kUG9vbD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ3JlYXRlQ29tbWFuZFBvb2wiKSk7CisgICAgRGVzdHJveUNvbW1hbmRQb29sID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95Q29tbWFuZFBvb2w+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0Rlc3Ryb3lDb21tYW5kUG9vbCIpKTsKKyAgICBSZXNldENvbW1hbmRQb29sID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtSZXNldENvbW1hbmRQb29sPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtSZXNldENvbW1hbmRQb29sIikpOworICAgIEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiKSk7CisgICAgRnJlZUNvbW1hbmRCdWZmZXJzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtGcmVlQ29tbWFuZEJ1ZmZlcnM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0ZyZWVDb21tYW5kQnVmZmVycyIpKTsKKyAgICBCZWdpbkNvbW1hbmRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0JlZ2luQ29tbWFuZEJ1ZmZlcj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQmVnaW5Db21tYW5kQnVmZmVyIikpOworICAgIEVuZENvbW1hbmRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0VuZENvbW1hbmRCdWZmZXI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0VuZENvbW1hbmRCdWZmZXIiKSk7CisgICAgUmVzZXRDb21tYW5kQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtSZXNldENvbW1hbmRCdWZmZXI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a1Jlc2V0Q29tbWFuZEJ1ZmZlciIpKTsKKyAgICBDbWRCaW5kUGlwZWxpbmUgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJpbmRQaXBlbGluZT4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kQmluZFBpcGVsaW5lIikpOworICAgIENtZFNldFZpZXdwb3J0ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRTZXRWaWV3cG9ydD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kU2V0Vmlld3BvcnQiKSk7CisgICAgQ21kU2V0U2Npc3NvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0U2Npc3Nvcj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kU2V0U2Npc3NvciIpKTsKKyAgICBDbWRTZXRMaW5lV2lkdGggPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFNldExpbmVXaWR0aD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kU2V0TGluZVdpZHRoIikpOworICAgIENtZFNldERlcHRoQmlhcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0RGVwdGhCaWFzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRTZXREZXB0aEJpYXMiKSk7CisgICAgQ21kU2V0QmxlbmRDb25zdGFudHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFNldEJsZW5kQ29uc3RhbnRzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRTZXRCbGVuZENvbnN0YW50cyIpKTsKKyAgICBDbWRTZXREZXB0aEJvdW5kcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0RGVwdGhCb3VuZHM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZFNldERlcHRoQm91bmRzIikpOworICAgIENtZFNldFN0ZW5jaWxDb21wYXJlTWFzayA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2siKSk7CisgICAgQ21kU2V0U3RlbmNpbFdyaXRlTWFzayA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzaz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayIpKTsKKyAgICBDbWRTZXRTdGVuY2lsUmVmZXJlbmNlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIikpOworICAgIENtZEJpbmREZXNjcmlwdG9yU2V0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQmluZERlc2NyaXB0b3JTZXRzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRCaW5kRGVzY3JpcHRvclNldHMiKSk7CisgICAgQ21kQmluZEluZGV4QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRCaW5kSW5kZXhCdWZmZXI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZEJpbmRJbmRleEJ1ZmZlciIpKTsKKyAgICBDbWRCaW5kVmVydGV4QnVmZmVycyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzIikpOworICAgIENtZERyYXcgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERyYXc+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZERyYXciKSk7CisgICAgQ21kRHJhd0luZGV4ZWQgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERyYXdJbmRleGVkPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWREcmF3SW5kZXhlZCIpKTsKKyAgICBDbWREcmF3SW5kaXJlY3QgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERyYXdJbmRpcmVjdD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kRHJhd0luZGlyZWN0IikpOworICAgIENtZERyYXdJbmRleGVkSW5kaXJlY3QgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3Q+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QiKSk7CisgICAgQ21kRGlzcGF0Y2ggPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZERpc3BhdGNoPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWREaXNwYXRjaCIpKTsKKyAgICBDbWREaXNwYXRjaEluZGlyZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWREaXNwYXRjaEluZGlyZWN0Pihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWREaXNwYXRjaEluZGlyZWN0IikpOworICAgIENtZENvcHlCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZENvcHlCdWZmZXI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZENvcHlCdWZmZXIiKSk7CisgICAgQ21kQ29weUltYWdlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRDb3B5SW1hZ2U+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZENvcHlJbWFnZSIpKTsKKyAgICBDbWRCbGl0SW1hZ2UgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJsaXRJbWFnZT4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kQmxpdEltYWdlIikpOworICAgIENtZENvcHlCdWZmZXJUb0ltYWdlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRDb3B5QnVmZmVyVG9JbWFnZT4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UiKSk7CisgICAgQ21kQ29weUltYWdlVG9CdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZENvcHlJbWFnZVRvQnVmZmVyPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciIpKTsKKyAgICBDbWRVcGRhdGVCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFVwZGF0ZUJ1ZmZlcj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kVXBkYXRlQnVmZmVyIikpOworICAgIENtZEZpbGxCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEZpbGxCdWZmZXI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZEZpbGxCdWZmZXIiKSk7CisgICAgQ21kQ2xlYXJDb2xvckltYWdlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRDbGVhckNvbG9ySW1hZ2U+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZENsZWFyQ29sb3JJbWFnZSIpKTsKKyAgICBDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlIikpOworICAgIENtZENsZWFyQXR0YWNobWVudHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZENsZWFyQXR0YWNobWVudHM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZENsZWFyQXR0YWNobWVudHMiKSk7CisgICAgQ21kUmVzb2x2ZUltYWdlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRSZXNvbHZlSW1hZ2U+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZFJlc29sdmVJbWFnZSIpKTsKKyAgICBDbWRTZXRFdmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0RXZlbnQ+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZFNldEV2ZW50IikpOworICAgIENtZFJlc2V0RXZlbnQgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFJlc2V0RXZlbnQ+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZFJlc2V0RXZlbnQiKSk7CisgICAgQ21kV2FpdEV2ZW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kV2FpdEV2ZW50cz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kV2FpdEV2ZW50cyIpKTsKKyAgICBDbWRQaXBlbGluZUJhcnJpZXIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZFBpcGVsaW5lQmFycmllcj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kUGlwZWxpbmVCYXJyaWVyIikpOworICAgIENtZEJlZ2luUXVlcnkgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJlZ2luUXVlcnk+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZEJlZ2luUXVlcnkiKSk7CisgICAgQ21kRW5kUXVlcnkgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEVuZFF1ZXJ5Pihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRFbmRRdWVyeSIpKTsKKyAgICBDbWRSZXNldFF1ZXJ5UG9vbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kUmVzZXRRdWVyeVBvb2w+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NtZFJlc2V0UXVlcnlQb29sIikpOworICAgIENtZFdyaXRlVGltZXN0YW1wID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRXcml0ZVRpbWVzdGFtcD4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ21kV3JpdGVUaW1lc3RhbXAiKSk7CisgICAgQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIpKTsKKyAgICBDbWRQdXNoQ29uc3RhbnRzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRQdXNoQ29uc3RhbnRzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRQdXNoQ29uc3RhbnRzIikpOworICAgIENtZEJlZ2luUmVuZGVyUGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQmVnaW5SZW5kZXJQYXNzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRCZWdpblJlbmRlclBhc3MiKSk7CisgICAgQ21kTmV4dFN1YnBhc3MgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NtZE5leHRTdWJwYXNzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWROZXh0U3VicGFzcyIpKTsKKyAgICBDbWRFbmRSZW5kZXJQYXNzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRFbmRSZW5kZXJQYXNzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRFbmRSZW5kZXJQYXNzIikpOworICAgIENtZEV4ZWN1dGVDb21tYW5kcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kRXhlY3V0ZUNvbW1hbmRzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRFeGVjdXRlQ29tbWFuZHMiKSk7CisgICAgRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiIpKTsKKyAgICBCaW5kQnVmZmVyTWVtb3J5MiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0JpbmRCdWZmZXJNZW1vcnkyIikpOworICAgIEJpbmRJbWFnZU1lbW9yeTIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0JpbmRJbWFnZU1lbW9yeTI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0JpbmRJbWFnZU1lbW9yeTIiKSk7CisgICAgR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIpKTsKKyAgICBDbWRTZXREZXZpY2VNYXNrID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRTZXREZXZpY2VNYXNrPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWRTZXREZXZpY2VNYXNrIikpOworICAgIENtZERpc3BhdGNoQmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kRGlzcGF0Y2hCYXNlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDbWREaXNwYXRjaEJhc2UiKSk7CisgICAgRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyIpKTsKKyAgICBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIikpOworICAgIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIiKSk7CisgICAgR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIikpOworICAgIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiKSk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIikpOworICAgIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIiKSk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIikpOworICAgIFRyaW1Db21tYW5kUG9vbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVHJpbUNvbW1hbmRQb29sPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtUcmltQ29tbWFuZFBvb2wiKSk7CisgICAgR2V0RGV2aWNlUXVldWUyID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREZXZpY2VRdWV1ZTI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldERldmljZVF1ZXVlMiIpKTsKKyAgICBDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIikpOworICAgIERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKSk7CisgICAgQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIpKTsKKyAgICBEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIikpOworICAgIFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUgPSByZWludGVycHJldF9jYXN0PFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGU+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUiKSk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIikpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcz4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiKSk7CisgICAgR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Pihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCIpKTsKKyAgICBEZXN0cm95U3VyZmFjZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrRGVzdHJveVN1cmZhY2VLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0Rlc3Ryb3lTdXJmYWNlS0hSIikpOworICAgIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIiKSk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIikpOworICAgIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiKSk7CisgICAgQ3JlYXRlU3dhcGNoYWluS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVTd2FwY2hhaW5LSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIpKTsKKyAgICBEZXN0cm95U3dhcGNoYWluS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtEZXN0cm95U3dhcGNoYWluS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtEZXN0cm95U3dhcGNoYWluS0hSIikpOworICAgIEdldFN3YXBjaGFpbkltYWdlc0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIiKSk7CisgICAgQWNxdWlyZU5leHRJbWFnZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQWNxdWlyZU5leHRJbWFnZUtIUiIpKTsKKyAgICBRdWV1ZVByZXNlbnRLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a1F1ZXVlUHJlc2VudEtIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrUXVldWVQcmVzZW50S0hSIikpOworICAgIEdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiKSk7CisgICAgR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSIikpOworICAgIEFjcXVpcmVOZXh0SW1hZ2UyS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtBY3F1aXJlTmV4dEltYWdlMktIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQWNxdWlyZU5leHRJbWFnZTJLSFIiKSk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiIpKTsKKyAgICBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIikpOworICAgIEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIiKSk7CisgICAgR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiIpKTsKKyAgICBDcmVhdGVEaXNwbGF5TW9kZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRGlzcGxheU1vZGVLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIikpOworICAgIEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIiKSk7CisgICAgQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIpKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBDcmVhdGVYbGliU3VyZmFjZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIikpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIEdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiKSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICBDcmVhdGVYY2JTdXJmYWNlS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVYY2JTdXJmYWNlS0hSIikpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICBHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIikpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIgPSByZWludGVycHJldF9jYXN0PFBGTl92a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIpKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICBHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIikpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUj4obG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX2hhbmRsZSwgInZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIiKSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIENyZWF0ZVdpbjMyU3VyZmFjZUtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSPihsb2FkZXJfcGxhdGZvcm1fZ2V0X3Byb2NfYWRkcmVzcyhsb2FkZXJfaGFuZGxlLCAidmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIiKSk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFI+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIikpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgQ3JlYXRlTWFjT1NTdXJmYWNlTVZLID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDcmVhdGVNYWNPU1N1cmZhY2VNVks+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIpKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCit9CisKK30gLy8gbmFtZXNwYWNlIHZrCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL2x2dF9mdW5jdGlvbl9wb2ludGVycy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9sdnRfZnVuY3Rpb25fcG9pbnRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVmN2VmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9sdnRfZnVuY3Rpb25fcG9pbnRlcnMuaApAQCAtMCwwICsxLDI1MCBAQAorI3ByYWdtYSBvbmNlCisvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKgorLy8gU2VlIGx2dF9maWxlX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICovCisKKworI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKworbmFtZXNwYWNlIHZrIHsKKworZXh0ZXJuIFBGTl92a0NyZWF0ZUluc3RhbmNlIENyZWF0ZUluc3RhbmNlOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lJbnN0YW5jZSBEZXN0cm95SW5zdGFuY2U7CitleHRlcm4gUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlczsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXM7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBHZXRJbnN0YW5jZVByb2NBZGRyOworZXh0ZXJuIFBGTl92a0dldERldmljZVByb2NBZGRyIEdldERldmljZVByb2NBZGRyOworZXh0ZXJuIFBGTl92a0NyZWF0ZURldmljZSBDcmVhdGVEZXZpY2U7CitleHRlcm4gUEZOX3ZrRGVzdHJveURldmljZSBEZXN0cm95RGV2aWNlOworZXh0ZXJuIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyBFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyBFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrR2V0RGV2aWNlUXVldWUgR2V0RGV2aWNlUXVldWU7CitleHRlcm4gUEZOX3ZrUXVldWVTdWJtaXQgUXVldWVTdWJtaXQ7CitleHRlcm4gUEZOX3ZrUXVldWVXYWl0SWRsZSBRdWV1ZVdhaXRJZGxlOworZXh0ZXJuIFBGTl92a0RldmljZVdhaXRJZGxlIERldmljZVdhaXRJZGxlOworZXh0ZXJuIFBGTl92a0FsbG9jYXRlTWVtb3J5IEFsbG9jYXRlTWVtb3J5OworZXh0ZXJuIFBGTl92a0ZyZWVNZW1vcnkgRnJlZU1lbW9yeTsKK2V4dGVybiBQRk5fdmtNYXBNZW1vcnkgTWFwTWVtb3J5OworZXh0ZXJuIFBGTl92a1VubWFwTWVtb3J5IFVubWFwTWVtb3J5OworZXh0ZXJuIFBGTl92a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIEZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzOworZXh0ZXJuIFBGTl92a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMgSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlczsKK2V4dGVybiBQRk5fdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQ7CitleHRlcm4gUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeSBCaW5kQnVmZmVyTWVtb3J5OworZXh0ZXJuIFBGTl92a0JpbmRJbWFnZU1lbW9yeSBCaW5kSW1hZ2VNZW1vcnk7CitleHRlcm4gUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czsKK2V4dGVybiBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czsKK2V4dGVybiBQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczsKK2V4dGVybiBQRk5fdmtRdWV1ZUJpbmRTcGFyc2UgUXVldWVCaW5kU3BhcnNlOworZXh0ZXJuIFBGTl92a0NyZWF0ZUZlbmNlIENyZWF0ZUZlbmNlOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lGZW5jZSBEZXN0cm95RmVuY2U7CitleHRlcm4gUEZOX3ZrUmVzZXRGZW5jZXMgUmVzZXRGZW5jZXM7CitleHRlcm4gUEZOX3ZrR2V0RmVuY2VTdGF0dXMgR2V0RmVuY2VTdGF0dXM7CitleHRlcm4gUEZOX3ZrV2FpdEZvckZlbmNlcyBXYWl0Rm9yRmVuY2VzOworZXh0ZXJuIFBGTl92a0NyZWF0ZVNlbWFwaG9yZSBDcmVhdGVTZW1hcGhvcmU7CitleHRlcm4gUEZOX3ZrRGVzdHJveVNlbWFwaG9yZSBEZXN0cm95U2VtYXBob3JlOworZXh0ZXJuIFBGTl92a0NyZWF0ZUV2ZW50IENyZWF0ZUV2ZW50OworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lFdmVudCBEZXN0cm95RXZlbnQ7CitleHRlcm4gUEZOX3ZrR2V0RXZlbnRTdGF0dXMgR2V0RXZlbnRTdGF0dXM7CitleHRlcm4gUEZOX3ZrU2V0RXZlbnQgU2V0RXZlbnQ7CitleHRlcm4gUEZOX3ZrUmVzZXRFdmVudCBSZXNldEV2ZW50OworZXh0ZXJuIFBGTl92a0NyZWF0ZVF1ZXJ5UG9vbCBDcmVhdGVRdWVyeVBvb2w7CitleHRlcm4gUEZOX3ZrRGVzdHJveVF1ZXJ5UG9vbCBEZXN0cm95UXVlcnlQb29sOworZXh0ZXJuIFBGTl92a0dldFF1ZXJ5UG9vbFJlc3VsdHMgR2V0UXVlcnlQb29sUmVzdWx0czsKK2V4dGVybiBQRk5fdmtDcmVhdGVCdWZmZXIgQ3JlYXRlQnVmZmVyOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lCdWZmZXIgRGVzdHJveUJ1ZmZlcjsKK2V4dGVybiBQRk5fdmtDcmVhdGVCdWZmZXJWaWV3IENyZWF0ZUJ1ZmZlclZpZXc7CitleHRlcm4gUEZOX3ZrRGVzdHJveUJ1ZmZlclZpZXcgRGVzdHJveUJ1ZmZlclZpZXc7CitleHRlcm4gUEZOX3ZrQ3JlYXRlSW1hZ2UgQ3JlYXRlSW1hZ2U7CitleHRlcm4gUEZOX3ZrRGVzdHJveUltYWdlIERlc3Ryb3lJbWFnZTsKK2V4dGVybiBQRk5fdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0IEdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQ7CitleHRlcm4gUEZOX3ZrQ3JlYXRlSW1hZ2VWaWV3IENyZWF0ZUltYWdlVmlldzsKK2V4dGVybiBQRk5fdmtEZXN0cm95SW1hZ2VWaWV3IERlc3Ryb3lJbWFnZVZpZXc7CitleHRlcm4gUEZOX3ZrQ3JlYXRlU2hhZGVyTW9kdWxlIENyZWF0ZVNoYWRlck1vZHVsZTsKK2V4dGVybiBQRk5fdmtEZXN0cm95U2hhZGVyTW9kdWxlIERlc3Ryb3lTaGFkZXJNb2R1bGU7CitleHRlcm4gUEZOX3ZrQ3JlYXRlUGlwZWxpbmVDYWNoZSBDcmVhdGVQaXBlbGluZUNhY2hlOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lQaXBlbGluZUNhY2hlIERlc3Ryb3lQaXBlbGluZUNhY2hlOworZXh0ZXJuIFBGTl92a0dldFBpcGVsaW5lQ2FjaGVEYXRhIEdldFBpcGVsaW5lQ2FjaGVEYXRhOworZXh0ZXJuIFBGTl92a01lcmdlUGlwZWxpbmVDYWNoZXMgTWVyZ2VQaXBlbGluZUNhY2hlczsKK2V4dGVybiBQRk5fdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyBDcmVhdGVHcmFwaGljc1BpcGVsaW5lczsKK2V4dGVybiBQRk5fdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIENyZWF0ZUNvbXB1dGVQaXBlbGluZXM7CitleHRlcm4gUEZOX3ZrRGVzdHJveVBpcGVsaW5lIERlc3Ryb3lQaXBlbGluZTsKK2V4dGVybiBQRk5fdmtDcmVhdGVQaXBlbGluZUxheW91dCBDcmVhdGVQaXBlbGluZUxheW91dDsKK2V4dGVybiBQRk5fdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQgRGVzdHJveVBpcGVsaW5lTGF5b3V0OworZXh0ZXJuIFBGTl92a0NyZWF0ZVNhbXBsZXIgQ3JlYXRlU2FtcGxlcjsKK2V4dGVybiBQRk5fdmtEZXN0cm95U2FtcGxlciBEZXN0cm95U2FtcGxlcjsKK2V4dGVybiBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQ7CitleHRlcm4gUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQgRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQ7CitleHRlcm4gUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclBvb2wgQ3JlYXRlRGVzY3JpcHRvclBvb2w7CitleHRlcm4gUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JQb29sIERlc3Ryb3lEZXNjcmlwdG9yUG9vbDsKK2V4dGVybiBQRk5fdmtSZXNldERlc2NyaXB0b3JQb29sIFJlc2V0RGVzY3JpcHRvclBvb2w7CitleHRlcm4gUEZOX3ZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyBBbGxvY2F0ZURlc2NyaXB0b3JTZXRzOworZXh0ZXJuIFBGTl92a0ZyZWVEZXNjcmlwdG9yU2V0cyBGcmVlRGVzY3JpcHRvclNldHM7CitleHRlcm4gUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldHMgVXBkYXRlRGVzY3JpcHRvclNldHM7CitleHRlcm4gUEZOX3ZrQ3JlYXRlRnJhbWVidWZmZXIgQ3JlYXRlRnJhbWVidWZmZXI7CitleHRlcm4gUEZOX3ZrRGVzdHJveUZyYW1lYnVmZmVyIERlc3Ryb3lGcmFtZWJ1ZmZlcjsKK2V4dGVybiBQRk5fdmtDcmVhdGVSZW5kZXJQYXNzIENyZWF0ZVJlbmRlclBhc3M7CitleHRlcm4gUEZOX3ZrRGVzdHJveVJlbmRlclBhc3MgRGVzdHJveVJlbmRlclBhc3M7CitleHRlcm4gUEZOX3ZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5IEdldFJlbmRlckFyZWFHcmFudWxhcml0eTsKK2V4dGVybiBQRk5fdmtDcmVhdGVDb21tYW5kUG9vbCBDcmVhdGVDb21tYW5kUG9vbDsKK2V4dGVybiBQRk5fdmtEZXN0cm95Q29tbWFuZFBvb2wgRGVzdHJveUNvbW1hbmRQb29sOworZXh0ZXJuIFBGTl92a1Jlc2V0Q29tbWFuZFBvb2wgUmVzZXRDb21tYW5kUG9vbDsKK2V4dGVybiBQRk5fdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzIEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnM7CitleHRlcm4gUEZOX3ZrRnJlZUNvbW1hbmRCdWZmZXJzIEZyZWVDb21tYW5kQnVmZmVyczsKK2V4dGVybiBQRk5fdmtCZWdpbkNvbW1hbmRCdWZmZXIgQmVnaW5Db21tYW5kQnVmZmVyOworZXh0ZXJuIFBGTl92a0VuZENvbW1hbmRCdWZmZXIgRW5kQ29tbWFuZEJ1ZmZlcjsKK2V4dGVybiBQRk5fdmtSZXNldENvbW1hbmRCdWZmZXIgUmVzZXRDb21tYW5kQnVmZmVyOworZXh0ZXJuIFBGTl92a0NtZEJpbmRQaXBlbGluZSBDbWRCaW5kUGlwZWxpbmU7CitleHRlcm4gUEZOX3ZrQ21kU2V0Vmlld3BvcnQgQ21kU2V0Vmlld3BvcnQ7CitleHRlcm4gUEZOX3ZrQ21kU2V0U2Npc3NvciBDbWRTZXRTY2lzc29yOworZXh0ZXJuIFBGTl92a0NtZFNldExpbmVXaWR0aCBDbWRTZXRMaW5lV2lkdGg7CitleHRlcm4gUEZOX3ZrQ21kU2V0RGVwdGhCaWFzIENtZFNldERlcHRoQmlhczsKK2V4dGVybiBQRk5fdmtDbWRTZXRCbGVuZENvbnN0YW50cyBDbWRTZXRCbGVuZENvbnN0YW50czsKK2V4dGVybiBQRk5fdmtDbWRTZXREZXB0aEJvdW5kcyBDbWRTZXREZXB0aEJvdW5kczsKK2V4dGVybiBQRk5fdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2sgQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrOworZXh0ZXJuIFBGTl92a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2sgQ21kU2V0U3RlbmNpbFdyaXRlTWFzazsKK2V4dGVybiBQRk5fdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIENtZFNldFN0ZW5jaWxSZWZlcmVuY2U7CitleHRlcm4gUEZOX3ZrQ21kQmluZERlc2NyaXB0b3JTZXRzIENtZEJpbmREZXNjcmlwdG9yU2V0czsKK2V4dGVybiBQRk5fdmtDbWRCaW5kSW5kZXhCdWZmZXIgQ21kQmluZEluZGV4QnVmZmVyOworZXh0ZXJuIFBGTl92a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzIENtZEJpbmRWZXJ0ZXhCdWZmZXJzOworZXh0ZXJuIFBGTl92a0NtZERyYXcgQ21kRHJhdzsKK2V4dGVybiBQRk5fdmtDbWREcmF3SW5kZXhlZCBDbWREcmF3SW5kZXhlZDsKK2V4dGVybiBQRk5fdmtDbWREcmF3SW5kaXJlY3QgQ21kRHJhd0luZGlyZWN0OworZXh0ZXJuIFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3QgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdDsKK2V4dGVybiBQRk5fdmtDbWREaXNwYXRjaCBDbWREaXNwYXRjaDsKK2V4dGVybiBQRk5fdmtDbWREaXNwYXRjaEluZGlyZWN0IENtZERpc3BhdGNoSW5kaXJlY3Q7CitleHRlcm4gUEZOX3ZrQ21kQ29weUJ1ZmZlciBDbWRDb3B5QnVmZmVyOworZXh0ZXJuIFBGTl92a0NtZENvcHlJbWFnZSBDbWRDb3B5SW1hZ2U7CitleHRlcm4gUEZOX3ZrQ21kQmxpdEltYWdlIENtZEJsaXRJbWFnZTsKK2V4dGVybiBQRk5fdmtDbWRDb3B5QnVmZmVyVG9JbWFnZSBDbWRDb3B5QnVmZmVyVG9JbWFnZTsKK2V4dGVybiBQRk5fdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciBDbWRDb3B5SW1hZ2VUb0J1ZmZlcjsKK2V4dGVybiBQRk5fdmtDbWRVcGRhdGVCdWZmZXIgQ21kVXBkYXRlQnVmZmVyOworZXh0ZXJuIFBGTl92a0NtZEZpbGxCdWZmZXIgQ21kRmlsbEJ1ZmZlcjsKK2V4dGVybiBQRk5fdmtDbWRDbGVhckNvbG9ySW1hZ2UgQ21kQ2xlYXJDb2xvckltYWdlOworZXh0ZXJuIFBGTl92a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UgQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZTsKK2V4dGVybiBQRk5fdmtDbWRDbGVhckF0dGFjaG1lbnRzIENtZENsZWFyQXR0YWNobWVudHM7CitleHRlcm4gUEZOX3ZrQ21kUmVzb2x2ZUltYWdlIENtZFJlc29sdmVJbWFnZTsKK2V4dGVybiBQRk5fdmtDbWRTZXRFdmVudCBDbWRTZXRFdmVudDsKK2V4dGVybiBQRk5fdmtDbWRSZXNldEV2ZW50IENtZFJlc2V0RXZlbnQ7CitleHRlcm4gUEZOX3ZrQ21kV2FpdEV2ZW50cyBDbWRXYWl0RXZlbnRzOworZXh0ZXJuIFBGTl92a0NtZFBpcGVsaW5lQmFycmllciBDbWRQaXBlbGluZUJhcnJpZXI7CitleHRlcm4gUEZOX3ZrQ21kQmVnaW5RdWVyeSBDbWRCZWdpblF1ZXJ5OworZXh0ZXJuIFBGTl92a0NtZEVuZFF1ZXJ5IENtZEVuZFF1ZXJ5OworZXh0ZXJuIFBGTl92a0NtZFJlc2V0UXVlcnlQb29sIENtZFJlc2V0UXVlcnlQb29sOworZXh0ZXJuIFBGTl92a0NtZFdyaXRlVGltZXN0YW1wIENtZFdyaXRlVGltZXN0YW1wOworZXh0ZXJuIFBGTl92a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzIENtZENvcHlRdWVyeVBvb2xSZXN1bHRzOworZXh0ZXJuIFBGTl92a0NtZFB1c2hDb25zdGFudHMgQ21kUHVzaENvbnN0YW50czsKK2V4dGVybiBQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MgQ21kQmVnaW5SZW5kZXJQYXNzOworZXh0ZXJuIFBGTl92a0NtZE5leHRTdWJwYXNzIENtZE5leHRTdWJwYXNzOworZXh0ZXJuIFBGTl92a0NtZEVuZFJlbmRlclBhc3MgQ21kRW5kUmVuZGVyUGFzczsKK2V4dGVybiBQRk5fdmtDbWRFeGVjdXRlQ29tbWFuZHMgQ21kRXhlY3V0ZUNvbW1hbmRzOworZXh0ZXJuIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiBFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb247CitleHRlcm4gUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTIgQmluZEJ1ZmZlck1lbW9yeTI7CitleHRlcm4gUEZOX3ZrQmluZEltYWdlTWVtb3J5MiBCaW5kSW1hZ2VNZW1vcnkyOworZXh0ZXJuIFBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzIEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzOworZXh0ZXJuIFBGTl92a0NtZFNldERldmljZU1hc2sgQ21kU2V0RGV2aWNlTWFzazsKK2V4dGVybiBQRk5fdmtDbWREaXNwYXRjaEJhc2UgQ21kRGlzcGF0Y2hCYXNlOworZXh0ZXJuIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzOworZXh0ZXJuIFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI7CitleHRlcm4gUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyOworZXh0ZXJuIFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI7CitleHRlcm4gUEZOX3ZrVHJpbUNvbW1hbmRQb29sIFRyaW1Db21tYW5kUG9vbDsKK2V4dGVybiBQRk5fdmtHZXREZXZpY2VRdWV1ZTIgR2V0RGV2aWNlUXVldWUyOworZXh0ZXJuIFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24gQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKK2V4dGVybiBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiBEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbjsKK2V4dGVybiBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlOworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKK2V4dGVybiBQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlIFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGU7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzOworZXh0ZXJuIFBGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0OworZXh0ZXJuIFBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSIERlc3Ryb3lTdXJmYWNlS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworZXh0ZXJuIFBGTl92a0NyZWF0ZVN3YXBjaGFpbktIUiBDcmVhdGVTd2FwY2hhaW5LSFI7CitleHRlcm4gUEZOX3ZrRGVzdHJveVN3YXBjaGFpbktIUiBEZXN0cm95U3dhcGNoYWluS0hSOworZXh0ZXJuIFBGTl92a0dldFN3YXBjaGFpbkltYWdlc0tIUiBHZXRTd2FwY2hhaW5JbWFnZXNLSFI7CitleHRlcm4gUEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUiBBY3F1aXJlTmV4dEltYWdlS0hSOworZXh0ZXJuIFBGTl92a1F1ZXVlUHJlc2VudEtIUiBRdWV1ZVByZXNlbnRLSFI7CitleHRlcm4gUEZOX3ZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIEdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUjsKK2V4dGVybiBQRk5fdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIgR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUjsKK2V4dGVybiBQRk5fdmtBY3F1aXJlTmV4dEltYWdlMktIUiBBY3F1aXJlTmV4dEltYWdlMktIUjsKK2V4dGVybiBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFI7CitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUjsKK2V4dGVybiBQRk5fdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiBHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUjsKK2V4dGVybiBQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIgR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSOworZXh0ZXJuIFBGTl92a0NyZWF0ZURpc3BsYXlNb2RlS0hSIENyZWF0ZURpc3BsYXlNb2RlS0hSOworZXh0ZXJuIFBGTl92a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiBHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFI7CitleHRlcm4gUEZOX3ZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiBDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorZXh0ZXJuIFBGTl92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIENyZWF0ZVhsaWJTdXJmYWNlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorZXh0ZXJuIFBGTl92a0NyZWF0ZVhjYlN1cmZhY2VLSFIgQ3JlYXRlWGNiU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCitleHRlcm4gUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorZXh0ZXJuIFBGTl92a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK2V4dGVybiBQRk5fdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiBDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitleHRlcm4gUEZOX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIENyZWF0ZVdpbjMyU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorZXh0ZXJuIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCitleHRlcm4gUEZOX3ZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIENyZWF0ZU1hY09TU3VyZmFjZU1WSzsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKK3ZvaWQgSW5pdERpc3BhdGNoVGFibGUoKTsKKworfSAvLyBuYW1lc3BhY2UgdmsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvb2JqZWN0X3RyYWNrZXIuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9vYmplY3RfdHJhY2tlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwMDc2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvb2JqZWN0X3RyYWNrZXIuY3BwCkBAIC0wLDAgKzEsNTI1MiBAQAorLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKioKKy8vIFNlZSBvYmplY3RfdHJhY2tlcl9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJjaGFzc2lzLmgiCisjaW5jbHVkZSAib2JqZWN0X2xpZmV0aW1lX3ZhbGlkYXRpb24uaCIKKworCisKKy8vIE9iamVjdFRyYWNrZXIgdW5kZXN0cm95ZWQgb2JqZWN0cyB2YWxpZGF0aW9uIGZ1bmN0aW9uCitib29sIE9iamVjdExpZmV0aW1lczo6UmVwb3J0VW5kZXN0cm95ZWRJbnN0YW5jZU9iamVjdHMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX2NvZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZEluc3RhbmNlT2JqZWN0cyhpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBlcnJvcl9jb2RlKTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZEluc3RhbmNlT2JqZWN0cyhpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkSW5zdGFuY2VPYmplY3RzKGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlLSFIsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkSW5zdGFuY2VPYmplY3RzKGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlNb2RlS0hSLCBlcnJvcl9jb2RlKTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZEluc3RhbmNlT2JqZWN0cyhpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULCBlcnJvcl9jb2RlKTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZEluc3RhbmNlT2JqZWN0cyhpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULCBlcnJvcl9jb2RlKTsKKyAgICByZXR1cm4gc2tpcDsKK30KK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpSZXBvcnRVbmRlc3Ryb3llZERldmljZU9iamVjdHMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfY29kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRmVuY2UsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCBlcnJvcl9jb2RlKTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZERldmljZU9iamVjdHMoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVFdmVudCwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldywgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZVZpZXcsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlU2hhZGVyTW9kdWxlLCBlcnJvcl9jb2RlKTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZERldmljZU9iamVjdHMoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lQ2FjaGUsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUmVuZGVyUGFzcywgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZSwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0TGF5b3V0LCBlcnJvcl9jb2RlKTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZERldmljZU9iamVjdHMoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXIsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wsIGVycm9yX2NvZGUpOworICAgIHNraXAgfD0gUmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldCwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVGcmFtZWJ1ZmZlciwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kUG9vbCwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLCBlcnJvcl9jb2RlKTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZERldmljZU9iamVjdHMoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWCwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLCBlcnJvcl9jb2RlKTsKKyAgICBza2lwIHw9IFJlcG9ydExlYWtlZERldmljZU9iamVjdHMoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVZhbGlkYXRpb25DYWNoZUVYVCwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgZXJyb3JfY29kZSk7CisgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWREZXZpY2VPYmplY3RzKGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCwgZXJyb3JfY29kZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpEZXN0cm95TGVha2VkSW5zdGFuY2VPYmplY3RzKCkgeworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSKTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSKTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUik7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlNb2RlS0hSKTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlRGVidWdSZXBvcnRDYWxsYmFja0VYVCk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQpOworfQordm9pZCBPYmplY3RMaWZldGltZXM6OkRlc3Ryb3lMZWFrZWREZXZpY2VPYmplY3RzKCkgeworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyKTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlKTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlRmVuY2UpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnkpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVCdWZmZXIpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVJbWFnZSk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZUV2ZW50KTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sKTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldyk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZUltYWdlVmlldyk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZVNoYWRlck1vZHVsZSk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lQ2FjaGUpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUxheW91dCk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZSk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXRMYXlvdXQpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyKTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0KTsKKyAgICBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKGtWdWxrYW5PYmplY3RUeXBlRnJhbWVidWZmZXIpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVDb21tYW5kUG9vbCk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXJZY2JjckNvbnZlcnNpb24pOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWCk7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVWYWxpZGF0aW9uQ2FjaGVFWFQpOworICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVik7CisgICAgRGVzdHJveVVuZGVzdHJveWVkT2JqZWN0cyhrVnVsa2FuT2JqZWN0VHlwZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKTsKK30KKworCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogICAgICAgICAgIHBNZW1vcnlQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCB0cnVlLCAiVlVJRC12a0dldEluc3RhbmNlUHJvY0FkZHItaW5zdGFuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VQcm9jQWRkcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOYW1lKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXREZXZpY2VQcm9jQWRkci1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXZpY2UoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVEZXZpY2UtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZURldmljZSgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcERldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJOYW1lLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrTGF5ZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVRdWV1ZVN1Ym1pdCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0Q291bnQsCisgICAgY29uc3QgVmtTdWJtaXRJbmZvKiAgICAgICAgICAgICAgICAgICAgICAgICBwU3VibWl0cywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChxdWV1ZSwga1Z1bGthbk9iamVjdFR5cGVRdWV1ZSwgZmFsc2UsICJWVUlELXZrUXVldWVTdWJtaXQtcXVldWUtcGFyYW1ldGVyIiwgIlZVSUQtdmtRdWV1ZVN1Ym1pdC1jb21tb25wYXJlbnQiKTsKKyAgICBpZiAocFN1Ym1pdHMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBzdWJtaXRDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIGlmIChwU3VibWl0c1tpbmRleDBdLnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgcFN1Ym1pdHNbaW5kZXgwXS53YWl0U2VtYXBob3JlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFN1Ym1pdHNbaW5kZXgwXS5wV2FpdFNlbWFwaG9yZXNbaW5kZXgxXSwga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUsIGZhbHNlLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVzLXBhcmFtZXRlciIsICJWVUlELVZrU3VibWl0SW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFN1Ym1pdHNbaW5kZXgwXS5wQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IHBTdWJtaXRzW2luZGV4MF0uY29tbWFuZEJ1ZmZlckNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBTdWJtaXRzW2luZGV4MF0ucENvbW1hbmRCdWZmZXJzW2luZGV4MV0sIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELVZrU3VibWl0SW5mby1wQ29tbWFuZEJ1ZmZlcnMtcGFyYW1ldGVyIiwgIlZVSUQtVmtTdWJtaXRJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwU3VibWl0c1tpbmRleDBdLnBTaWduYWxTZW1hcGhvcmVzKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBwU3VibWl0c1tpbmRleDBdLnNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBTdWJtaXRzW2luZGV4MF0ucFNpZ25hbFNlbWFwaG9yZXNbaW5kZXgxXSwga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUsIGZhbHNlLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtTdWJtaXRJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGZlbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlLCB0cnVlLCAiVlVJRC12a1F1ZXVlU3VibWl0LWZlbmNlLXBhcmFtZXRlciIsICJWVUlELXZrUXVldWVTdWJtaXQtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVF1ZXVlV2FpdElkbGUoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocXVldWUsIGtWdWxrYW5PYmplY3RUeXBlUXVldWUsIGZhbHNlLCAiVlVJRC12a1F1ZXVlV2FpdElkbGUtcXVldWUtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZXZpY2VXYWl0SWRsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGV2aWNlV2FpdElkbGUtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0FsbG9jYXRlTWVtb3J5LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnksCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBNZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRnJlZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0ZyZWVNZW1vcnktZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KG1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIHRydWUsICJWVUlELXZrRnJlZU1lbW9yeS1tZW1vcnktcGFyYW1ldGVyIiwgIlZVSUQtdmtGcmVlTWVtb3J5LW1lbW9yeS1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChtZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCBwQWxsb2NhdG9yLCBrVlVJRFVuZGVmaW5lZCwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRnJlZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KG1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnkpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVNYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIFZrTWVtb3J5TWFwRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdm9pZCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a01hcE1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QobWVtb3J5LCBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeSwgZmFsc2UsICJWVUlELXZrTWFwTWVtb3J5LW1lbW9yeS1wYXJhbWV0ZXIiLCAiVlVJRC12a01hcE1lbW9yeS1tZW1vcnktcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVVubWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtVbm1hcE1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QobWVtb3J5LCBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeSwgZmFsc2UsICJWVUlELXZrVW5tYXBNZW1vcnktbWVtb3J5LXBhcmFtZXRlciIsICJWVUlELXZrVW5tYXBNZW1vcnktbWVtb3J5LXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcy1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwTWVtb3J5UmFuZ2VzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgbWVtb3J5UmFuZ2VDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocE1lbW9yeVJhbmdlc1tpbmRleDBdLm1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIGZhbHNlLCAiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLW1lbW9yeS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcy1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwTWVtb3J5UmFuZ2VzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgbWVtb3J5UmFuZ2VDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocE1lbW9yeVJhbmdlc1tpbmRleDBdLm1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIGZhbHNlLCAiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLW1lbW9yeS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QobWVtb3J5LCBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeSwgZmFsc2UsICJWVUlELXZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudC1tZW1vcnktcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LW1lbW9yeS1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KG1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIGZhbHNlLCAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LXBhcmFtZXRlciIsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnktcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlLCBmYWxzZSwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChtZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCBmYWxzZSwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LXBhcmFtZXRlciIsICJWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMtYnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzLWJ1ZmZlci1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtaW1hZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cy1pbWFnZS1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlLCBmYWxzZSwgIlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1pbWFnZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLWltYWdlLXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVF1ZXVlQmluZFNwYXJzZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiAgICAgICAgICAgICAgICAgICAgIHBCaW5kSW5mbywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChxdWV1ZSwga1Z1bGthbk9iamVjdFR5cGVRdWV1ZSwgZmFsc2UsICJWVUlELXZrUXVldWVCaW5kU3BhcnNlLXF1ZXVlLXBhcmFtZXRlciIsICJWVUlELXZrUXVldWVCaW5kU3BhcnNlLWNvbW1vbnBhcmVudCIpOworICAgIGlmIChwQmluZEluZm8pIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBiaW5kSW5mb0NvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleDBdLnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgcEJpbmRJbmZvW2luZGV4MF0ud2FpdFNlbWFwaG9yZUNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb1tpbmRleDBdLnBXYWl0U2VtYXBob3Jlc1tpbmRleDFdLCBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZSwgZmFsc2UsICJWVUlELVZrQmluZFNwYXJzZUluZm8tcFdhaXRTZW1hcGhvcmVzLXBhcmFtZXRlciIsICJWVUlELVZrQmluZFNwYXJzZUluZm8tY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleDBdLnBCdWZmZXJCaW5kcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgcEJpbmRJbmZvW2luZGV4MF0uYnVmZmVyQmluZENvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb1tpbmRleDBdLnBCdWZmZXJCaW5kc1tpbmRleDFdLmJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGZhbHNlLCAiVlVJRC1Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvLWJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQmluZEluZm9baW5kZXgwXS5wQnVmZmVyQmluZHNbaW5kZXgxXS5wQmluZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyID0gMDsgaW5kZXgyIDwgcEJpbmRJbmZvW2luZGV4MF0ucEJ1ZmZlckJpbmRzW2luZGV4MV0uYmluZENvdW50OyArK2luZGV4MikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEJpbmRJbmZvW2luZGV4MF0ucEJ1ZmZlckJpbmRzW2luZGV4MV0ucEJpbmRzW2luZGV4Ml0ubWVtb3J5LCBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeSwgdHJ1ZSwgIlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLW1lbW9yeS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocEJpbmRJbmZvW2luZGV4MF0ucEltYWdlT3BhcXVlQmluZHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IHBCaW5kSW5mb1tpbmRleDBdLmltYWdlT3BhcXVlQmluZENvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb1tpbmRleDBdLnBJbWFnZU9wYXF1ZUJpbmRzW2luZGV4MV0uaW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIGZhbHNlLCAiVlVJRC1Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8taW1hZ2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvW2luZGV4MF0ucEltYWdlT3BhcXVlQmluZHNbaW5kZXgxXS5wQmluZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyID0gMDsgaW5kZXgyIDwgcEJpbmRJbmZvW2luZGV4MF0ucEltYWdlT3BhcXVlQmluZHNbaW5kZXgxXS5iaW5kQ291bnQ7ICsraW5kZXgyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQmluZEluZm9baW5kZXgwXS5wSW1hZ2VPcGFxdWVCaW5kc1tpbmRleDFdLnBCaW5kc1tpbmRleDJdLm1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIHRydWUsICJWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1tZW1vcnktcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleDBdLnBJbWFnZUJpbmRzKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBwQmluZEluZm9baW5kZXgwXS5pbWFnZUJpbmRDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQmluZEluZm9baW5kZXgwXS5wSW1hZ2VCaW5kc1tpbmRleDFdLmltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlLCBmYWxzZSwgIlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvLWltYWdlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleDBdLnBJbWFnZUJpbmRzW2luZGV4MV0ucEJpbmRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MiA9IDA7IGluZGV4MiA8IHBCaW5kSW5mb1tpbmRleDBdLnBJbWFnZUJpbmRzW2luZGV4MV0uYmluZENvdW50OyArK2luZGV4MikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEJpbmRJbmZvW2luZGV4MF0ucEltYWdlQmluZHNbaW5kZXgxXS5wQmluZHNbaW5kZXgyXS5tZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCB0cnVlLCAiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1tZW1vcnktcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleDBdLnBTaWduYWxTZW1hcGhvcmVzKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBwQmluZEluZm9baW5kZXgwXS5zaWduYWxTZW1hcGhvcmVDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQmluZEluZm9baW5kZXgwXS5wU2lnbmFsU2VtYXBob3Jlc1tpbmRleDFdLCBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZSwgZmFsc2UsICJWVUlELVZrQmluZFNwYXJzZUluZm8tcFNpZ25hbFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChmZW5jZSwga1Z1bGthbk9iamVjdFR5cGVGZW5jZSwgdHJ1ZSwgIlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtZmVuY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUZlbmNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVGZW5jZS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUZlbmNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwRmVuY2UsIGtWdWxrYW5PYmplY3RUeXBlRmVuY2UsIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lGZW5jZS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZmVuY2UsIGtWdWxrYW5PYmplY3RUeXBlRmVuY2UsIHRydWUsICJWVUlELXZrRGVzdHJveUZlbmNlLWZlbmNlLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveUZlbmNlLWZlbmNlLXBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVEZXN0cm95T2JqZWN0KGZlbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lGZW5jZS1mZW5jZS0wMTEyMSIsICJWVUlELXZrRGVzdHJveUZlbmNlLWZlbmNlLTAxMTIyIik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KGZlbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlUmVzZXRGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrUmVzZXRGZW5jZXMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEZlbmNlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGZlbmNlQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBGZW5jZXNbaW5kZXgwXSwga1Z1bGthbk9iamVjdFR5cGVGZW5jZSwgZmFsc2UsICJWVUlELXZrUmVzZXRGZW5jZXMtcEZlbmNlcy1wYXJhbWV0ZXIiLCAiVlVJRC12a1Jlc2V0RmVuY2VzLXBGZW5jZXMtcGFyZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldEZlbmNlU3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldEZlbmNlU3RhdHVzLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChmZW5jZSwga1Z1bGthbk9iamVjdFR5cGVGZW5jZSwgZmFsc2UsICJWVUlELXZrR2V0RmVuY2VTdGF0dXMtZmVuY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRGZW5jZVN0YXR1cy1mZW5jZS1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlV2FpdEZvckZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzLAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEFsbCwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a1dhaXRGb3JGZW5jZXMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEZlbmNlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGZlbmNlQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBGZW5jZXNbaW5kZXgwXSwga1Z1bGthbk9iamVjdFR5cGVGZW5jZSwgZmFsc2UsICJWVUlELXZrV2FpdEZvckZlbmNlcy1wRmVuY2VzLXBhcmFtZXRlciIsICJWVUlELXZrV2FpdEZvckZlbmNlcy1wRmVuY2VzLXBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTZW1hcGhvcmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVTZW1hcGhvcmUtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTZW1hcGhvcmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU2VtYXBob3JlLCBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZSwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtEZXN0cm95U2VtYXBob3JlLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChzZW1hcGhvcmUsIGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlLCB0cnVlLCAiVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtc2VtYXBob3JlLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1zZW1hcGhvcmUtcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3Qoc2VtYXBob3JlLCBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZSwgcEFsbG9jYXRvciwgIlZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS0wMTEzOCIsICJWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1zZW1hcGhvcmUtMDExMzkiKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgUmVjb3JkRGVzdHJveU9iamVjdChzZW1hcGhvcmUsIGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZUV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBFdmVudCwga1Z1bGthbk9iamVjdFR5cGVFdmVudCwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveUV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChldmVudCwga1Z1bGthbk9iamVjdFR5cGVFdmVudCwgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QoZXZlbnQsIGtWdWxrYW5PYmplY3RUeXBlRXZlbnQsIHBBbGxvY2F0b3IsICJWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LTAxMTQ2IiwgIlZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtMDExNDciKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QoZXZlbnQsIGtWdWxrYW5PYmplY3RUeXBlRXZlbnQpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRFdmVudFN0YXR1cy1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZXZlbnQsIGtWdWxrYW5PYmplY3RUeXBlRXZlbnQsIGZhbHNlLCAiVlVJRC12a0dldEV2ZW50U3RhdHVzLWV2ZW50LXBhcmFtZXRlciIsICJWVUlELXZrR2V0RXZlbnRTdGF0dXMtZXZlbnQtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVNldEV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a1NldEV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChldmVudCwga1Z1bGthbk9iamVjdFR5cGVFdmVudCwgZmFsc2UsICJWVUlELXZrU2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyIiwgIlZVSUQtdmtTZXRFdmVudC1ldmVudC1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlUmVzZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtSZXNldEV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChldmVudCwga1Z1bGthbk9iamVjdFR5cGVFdmVudCwgZmFsc2UsICJWVUlELXZrUmVzZXRFdmVudC1ldmVudC1wYXJhbWV0ZXIiLCAiVlVJRC12a1Jlc2V0RXZlbnQtZXZlbnQtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZVF1ZXJ5UG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBRdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIHRydWUsICJWVUlELXZrRGVzdHJveVF1ZXJ5UG9vbC1xdWVyeVBvb2wtcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChxdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtcXVlcnlQb29sLTAwNzk0IiwgIlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC0wMDc5NSIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIGZhbHNlLCAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlQb29sLXBhcmFtZXRlciIsICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1xdWVyeVBvb2wtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZUJ1ZmZlci1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lCdWZmZXItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIHRydWUsICJWVUlELXZrRGVzdHJveUJ1ZmZlci1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lCdWZmZXItYnVmZmVyLTAwOTIzIiwgIlZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci0wMDkyNCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KGJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyVmlldyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZUJ1ZmZlclZpZXctZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mby0+YnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlclZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwVmlldywga1Z1bGthbk9iamVjdFR5cGVCdWZmZXJWaWV3LCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXJWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveUJ1ZmZlclZpZXctZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGJ1ZmZlclZpZXcsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldywgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveUJ1ZmZlclZpZXctYnVmZmVyVmlldy1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChidWZmZXJWaWV3LCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlclZpZXcsIHBBbGxvY2F0b3IsICJWVUlELXZrRGVzdHJveUJ1ZmZlclZpZXctYnVmZmVyVmlldy0wMDkzNyIsICJWVUlELXZrRGVzdHJveUJ1ZmZlclZpZXctYnVmZmVyVmlldy0wMDkzOCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXJWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QoYnVmZmVyVmlldywga1Z1bGthbk9iamVjdFR5cGVCdWZmZXJWaWV3KTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW1hZ2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZUltYWdlLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBJbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveUltYWdlLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QoaW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIHBBbGxvY2F0b3IsICJWVUlELXZrRGVzdHJveUltYWdlLWltYWdlLTAxMDAxIiwgIlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtMDEwMDIiKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QoaW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiAgICAgICAgICAgICAgICAgICBwU3VicmVzb3VyY2UsCisgICAgVmtTdWJyZXNvdXJjZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1pbWFnZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtaW1hZ2UtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlVmlldyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVJbWFnZVZpZXctZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mby0+aW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIGZhbHNlLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbWFnZVZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcFZpZXcsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2VWaWV3LCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGltYWdlVmlldywga1Z1bGthbk9iamVjdFR5cGVJbWFnZVZpZXcsIHRydWUsICJWVUlELXZrRGVzdHJveUltYWdlVmlldy1pbWFnZVZpZXctcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95SW1hZ2VWaWV3LWltYWdlVmlldy1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChpbWFnZVZpZXcsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2VWaWV3LCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LTAxMDI3IiwgIlZVSUQtdmtEZXN0cm95SW1hZ2VWaWV3LWltYWdlVmlldy0wMTAyOCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KGltYWdlVmlldywga1Z1bGthbk9iamVjdFR5cGVJbWFnZVZpZXcpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTaGFkZXJNb2R1bGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGVyTW9kdWxlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVTaGFkZXJNb2R1bGUtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTaGFkZXJNb2R1bGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGVyTW9kdWxlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU2hhZGVyTW9kdWxlLCBrVnVsa2FuT2JqZWN0VHlwZVNoYWRlck1vZHVsZSwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTaGFkZXJNb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJNb2R1bGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChzaGFkZXJNb2R1bGUsIGtWdWxrYW5PYmplY3RUeXBlU2hhZGVyTW9kdWxlLCB0cnVlLCAiVlVJRC12a0Rlc3Ryb3lTaGFkZXJNb2R1bGUtc2hhZGVyTW9kdWxlLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveVNoYWRlck1vZHVsZS1zaGFkZXJNb2R1bGUtcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3Qoc2hhZGVyTW9kdWxlLCBrVnVsa2FuT2JqZWN0VHlwZVNoYWRlck1vZHVsZSwgcEFsbG9jYXRvciwgIlZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXNoYWRlck1vZHVsZS0wMTA5MiIsICJWVUlELXZrRGVzdHJveVNoYWRlck1vZHVsZS1zaGFkZXJNb2R1bGUtMDEwOTMiKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTaGFkZXJNb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJNb2R1bGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgUmVjb3JkRGVzdHJveU9iamVjdChzaGFkZXJNb2R1bGUsIGtWdWxrYW5PYmplY3RUeXBlU2hhZGVyTW9kdWxlKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUNhY2hlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVQaXBlbGluZUNhY2hlLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUNhY2hlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwUGlwZWxpbmVDYWNoZSwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUNhY2hlLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBpcGVsaW5lQ2FjaGUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZSwgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95UGlwZWxpbmVDYWNoZS1waXBlbGluZUNhY2hlLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtcGlwZWxpbmVDYWNoZS1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChwaXBlbGluZUNhY2hlLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lQ2FjaGUsIHBBbGxvY2F0b3IsICJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtcGlwZWxpbmVDYWNoZS0wMDc3MSIsICJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtcGlwZWxpbmVDYWNoZS0wMDc3MiIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QocGlwZWxpbmVDYWNoZSwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUNhY2hlKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVDYWNoZURhdGEoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBpcGVsaW5lQ2FjaGVEYXRhLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaXBlbGluZUNhY2hlLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lQ2FjaGUsIGZhbHNlLCAiVlVJRC12a0dldFBpcGVsaW5lQ2FjaGVEYXRhLXBpcGVsaW5lQ2FjaGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaXBlbGluZUNhY2hlRGF0YS1waXBlbGluZUNhY2hlLXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVNZXJnZVBpcGVsaW5lQ2FjaGVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZHN0Q2FjaGUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZSwgZmFsc2UsICJWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1kc3RDYWNoZS1wYXJhbWV0ZXIiLCAiVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtZHN0Q2FjaGUtcGFyZW50Iik7CisgICAgaWYgKHBTcmNDYWNoZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBzcmNDYWNoZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwU3JjQ2FjaGVzW2luZGV4MF0sIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZSwgZmFsc2UsICJWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1wU3JjQ2FjaGVzLXBhcmFtZXRlciIsICJWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1wU3JjQ2FjaGVzLXBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBpcGVsaW5lQ2FjaGUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZSwgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1waXBlbGluZUNhY2hlLXBhcmFtZXRlciIsICJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcGlwZWxpbmVDYWNoZS1wYXJlbnQiKTsKKyAgICBpZiAocENyZWF0ZUluZm9zKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgY3JlYXRlSW5mb0NvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpbmRleDBdLnBTdGFnZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IHBDcmVhdGVJbmZvc1tpbmRleDBdLnN0YWdlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm9zW2luZGV4MF0ucFN0YWdlc1tpbmRleDFdLm1vZHVsZSwga1Z1bGthbk9iamVjdFR5cGVTaGFkZXJNb2R1bGUsIGZhbHNlLCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1vZHVsZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5sYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQsIGZhbHNlLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWxheW91dC1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5yZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MsIGZhbHNlLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXJlbmRlclBhc3MtcGFyYW1ldGVyIiwgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgIGlmICgocENyZWF0ZUluZm9zW2luZGV4MF0uZmxhZ3MgJiBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQpICYmIChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5iYXNlUGlwZWxpbmVJbmRleCA9PSAtMSkpCisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5iYXNlUGlwZWxpbmVIYW5kbGUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmUsIGZhbHNlLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNzIyIiwgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQgPT0gcmVzdWx0KSByZXR1cm47CisgICAgaWYgKHBQaXBlbGluZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgY3JlYXRlSW5mb0NvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoIXBQaXBlbGluZXNbaW5kZXhdKSBjb250aW51ZTsKKyAgICAgICAgICAgIENyZWF0ZU9iamVjdChwUGlwZWxpbmVzW2luZGV4XSwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZSwgcEFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBpcGVsaW5lQ2FjaGUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZSwgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLXBpcGVsaW5lQ2FjaGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLXBpcGVsaW5lQ2FjaGUtcGFyZW50Iik7CisgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGNyZWF0ZUluZm9Db3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm9zW2luZGV4MF0uc3RhZ2UubW9kdWxlLCBrVnVsa2FuT2JqZWN0VHlwZVNoYWRlck1vZHVsZSwgZmFsc2UsICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tbW9kdWxlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm9zW2luZGV4MF0ubGF5b3V0LCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0LCBmYWxzZSwgIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWxheW91dC1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICBpZiAoKHBDcmVhdGVJbmZvc1tpbmRleDBdLmZsYWdzICYgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUKSAmJiAocENyZWF0ZUluZm9zW2luZGV4MF0uYmFzZVBpcGVsaW5lSW5kZXggPT0gLTEpKQorICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm9zW2luZGV4MF0uYmFzZVBpcGVsaW5lSGFuZGxlLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lLCBmYWxzZSwgIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNjk3IiwgIlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAoVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUID09IHJlc3VsdCkgcmV0dXJuOworICAgIGlmIChwUGlwZWxpbmVzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNyZWF0ZUluZm9Db3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKCFwUGlwZWxpbmVzW2luZGV4XSkgY29udGludWU7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocFBpcGVsaW5lc1tpbmRleF0sIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmUsIHBBbGxvY2F0b3IpOworICAgICAgICB9CisgICAgfQorCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGlwZWxpbmUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmUsIHRydWUsICJWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLXBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVEZXN0cm95T2JqZWN0KHBpcGVsaW5lLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1waXBlbGluZS0wMDc2NiIsICJWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLTAwNzY3Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KHBpcGVsaW5lLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZVBpcGVsaW5lTGF5b3V0LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFNldExheW91dHMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgcENyZWF0ZUluZm8tPnNldExheW91dENvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm8tPnBTZXRMYXlvdXRzW2luZGV4MV0sIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldExheW91dCwgZmFsc2UsICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUxheW91dCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcFBpcGVsaW5lTGF5b3V0LCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0LCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBpcGVsaW5lTGF5b3V0LCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0LCB0cnVlLCAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC1wYXJhbWV0ZXIiLCAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChwaXBlbGluZUxheW91dCwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUxheW91dCwgcEFsbG9jYXRvciwgIlZVSUQtdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQtcGlwZWxpbmVMYXlvdXQtMDAyOTkiLCAiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC0wMDMwMCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgUmVjb3JkRGVzdHJveU9iamVjdChwaXBlbGluZUxheW91dCwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUxheW91dCk7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlU2FtcGxlci1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlciwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcFNhbXBsZXIsIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlciwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChzYW1wbGVyLCBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXIsIHRydWUsICJWVUlELXZrRGVzdHJveVNhbXBsZXItc2FtcGxlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3Qoc2FtcGxlciwga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItMDEwODMiLCAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItMDEwODQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KHNhbXBsZXIsIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXNjcmlwdG9yU2V0TGF5b3V0LCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXRMYXlvdXQsIHRydWUsICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGVzY3JpcHRvclNldExheW91dC1wYXJhbWV0ZXIiLCAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRlc2NyaXB0b3JTZXRMYXlvdXQtcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QoZGVzY3JpcHRvclNldExheW91dCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0TGF5b3V0LCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAyODQiLCAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAyODUiKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KGRlc2NyaXB0b3JTZXRMYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldExheW91dCk7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JQb29sKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JQb29sLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwRGVzY3JpcHRvclBvb2wsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wsIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RnJhbWVidWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGcmFtZWJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZnJhbWVidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlRnJhbWVidWZmZXIsIHRydWUsICJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLXBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVEZXN0cm95T2JqZWN0KGZyYW1lYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1mcmFtZWJ1ZmZlci0wMDg5MyIsICJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLTAwODk0Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95RnJhbWVidWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGcmFtZWJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KGZyYW1lYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwUmVuZGVyUGFzcywga1Z1bGthbk9iamVjdFR5cGVSZW5kZXJQYXNzLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHJlbmRlclBhc3MsIGtWdWxrYW5PYmplY3RUeXBlUmVuZGVyUGFzcywgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChyZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MsIHBBbGxvY2F0b3IsICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy0wMDg3NCIsICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy0wMDg3NSIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QocmVuZGVyUGFzcywga1Z1bGthbk9iamVjdFR5cGVSZW5kZXJQYXNzKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUmVuZGVyUGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzcywKKyAgICBWa0V4dGVudDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFudWxhcml0eSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5LWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChyZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MsIGZhbHNlLCAiVlVJRC12a0dldFJlbmRlckFyZWFHcmFudWxhcml0eS1yZW5kZXJQYXNzLXBhcmFtZXRlciIsICJWVUlELXZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5LXJlbmRlclBhc3MtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQ29tbWFuZFBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRQb29sKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVDb21tYW5kUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQ29tbWFuZFBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRQb29sLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwQ29tbWFuZFBvb2wsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZFBvb2wsIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVSZXNldENvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZFBvb2wsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZFBvb2wsIGZhbHNlLCAiVlVJRC12a1Jlc2V0Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyYW1ldGVyIiwgIlZVSUQtdmtSZXNldENvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVFbmRDb21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVSZXNldENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICAgZmxhZ3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrUmVzZXRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRCaW5kUGlwZWxpbmUoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBpcGVsaW5lLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lLCBmYWxzZSwgIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmUtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0U2Npc3NvcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNjaXNzb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lzc29yQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Npc3NvcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0U2Npc3Nvci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVdpZHRoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldERlcHRoQmlhcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NsYW1wLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0RGVwdGhCaWFzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRCbGVuZENvbnN0YW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZENvbnN0YW50c1s0XSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXRCbGVuZENvbnN0YW50cy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGVwdGhCb3VuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRGVwdGhCb3VuZHMsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEZXB0aEJvdW5kcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXREZXB0aEJvdW5kcy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hc2spIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2stY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldFN0ZW5jaWxSZWZlcmVuY2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQmluZERlc2NyaXB0b3JTZXRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljT2Zmc2V0Q291bnQsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHluYW1pY09mZnNldHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChsYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQsIGZhbHNlLCAiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1sYXlvdXQtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtY29tbW9ucGFyZW50Iik7CisgICAgaWYgKHBEZXNjcmlwdG9yU2V0cykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGRlc2NyaXB0b3JTZXRDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4MF0sIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldCwgZmFsc2UsICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0luZGV4VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VHlwZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLWNvbW1vbnBhcmVudCIpOworICAgIGlmIChwQnVmZmVycykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGJpbmRpbmdDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEJ1ZmZlcnNbaW5kZXgwXSwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLXBCdWZmZXJzLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtY29tbW9ucGFyZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXcoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWZXJ0ZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtYnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoSW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZENvcHlCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3JjQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ29weUJ1ZmZlci1zcmNCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZHN0QnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ29weUJ1ZmZlci1kc3RCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRDb3B5SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZENvcHlJbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQ29weUltYWdlLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3JjSW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIGZhbHNlLCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZENvcHlJbWFnZS1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRzdEltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlLCBmYWxzZSwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEJsaXRJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VCbGl0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMsCisgICAgVmtGaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChzcmNJbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZHN0SW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIGZhbHNlLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQ29weUJ1ZmZlclRvSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3JjQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2Utc3JjQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkc3RJbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQ29weUltYWdlVG9CdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3JjSW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIGZhbHNlLCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkc3RCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1kc3RCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kVXBkYXRlQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkc3RCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0QnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRGaWxsQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEZpbGxCdWZmZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEZpbGxCdWZmZXItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkc3RCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRGaWxsQnVmZmVyLWRzdEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEZpbGxCdWZmZXItY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQ29sb3JJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiAgICAgICAgICAgICAgICAgICAgcENvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlLCBmYWxzZSwgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQ2xlYXJBdHRhY2htZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50Q291bnQsCisgICAgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqICAgICAgICAgICAgICAgICAgICBwQXR0YWNobWVudHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Q291bnQsCisgICAgY29uc3QgVmtDbGVhclJlY3QqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kUmVzb2x2ZUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVJlc29sdmUqICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHNyY0ltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlLCBmYWxzZSwgIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkc3RJbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlLXBhcmFtZXRlciIsICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXRFdmVudC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kU2V0RXZlbnQtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChldmVudCwga1Z1bGthbk9iamVjdFR5cGVFdmVudCwgZmFsc2UsICJWVUlELXZrQ21kU2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRTZXRFdmVudC1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kUmVzZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRSZXNldEV2ZW50LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRSZXNldEV2ZW50LWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZXZlbnQsIGtWdWxrYW5PYmplY3RUeXBlRXZlbnQsIGZhbHNlLCAiVlVJRC12a0NtZFJlc2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRSZXNldEV2ZW50LWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRXYWl0RXZlbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQsCisgICAgY29uc3QgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRzLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RhZ2VNYXNrLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICBwSW1hZ2VNZW1vcnlCYXJyaWVycykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1vbnBhcmVudCIpOworICAgIGlmIChwRXZlbnRzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgZXZlbnRDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEV2ZW50c1tpbmRleDBdLCBrVnVsa2FuT2JqZWN0VHlwZUV2ZW50LCBmYWxzZSwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXBFdmVudHMtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1vbnBhcmVudCIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwQnVmZmVyTWVtb3J5QmFycmllcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCdWZmZXJNZW1vcnlCYXJyaWVyc1tpbmRleDBdLmJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGZhbHNlLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocEltYWdlTWVtb3J5QmFycmllcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEltYWdlTWVtb3J5QmFycmllcnNbaW5kZXgwXS5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kUGlwZWxpbmVCYXJyaWVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICBWa0RlcGVuZGVuY3lGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwQnVmZmVyTWVtb3J5QmFycmllcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCdWZmZXJNZW1vcnlCYXJyaWVyc1tpbmRleDBdLmJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGZhbHNlLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocEltYWdlTWVtb3J5QmFycmllcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEltYWdlTWVtb3J5QmFycmllcnNbaW5kZXgwXS5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5RdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChxdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBmYWxzZSwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEVuZFF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEVuZFF1ZXJ5LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRFbmRRdWVyeS1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIGZhbHNlLCAiVlVJRC12a0NtZEVuZFF1ZXJ5LXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEVuZFF1ZXJ5LWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kUmVzZXRRdWVyeVBvb2wtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChxdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBmYWxzZSwgIlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1xdWVyeVBvb2wtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIGZhbHNlLCAiVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRDb3B5UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIGZhbHNlLCAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZHN0QnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZHN0QnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFB1c2hDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIFZrU2hhZGVyU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChsYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQsIGZhbHNlLCAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtbGF5b3V0LXBhcmFtZXRlciIsICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5SZW5kZXJQYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBSZW5kZXJQYXNzQmVnaW4pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MsIGZhbHNlLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcmVuZGVyUGFzcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tY29tbW9ucGFyZW50Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFJlbmRlclBhc3NCZWdpbi0+ZnJhbWVidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlRnJhbWVidWZmZXIsIGZhbHNlLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWNvbW1vbnBhcmVudCIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kTmV4dFN1YnBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kTmV4dFN1YnBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEV4ZWN1dGVDb21tYW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbW9ucGFyZW50Iik7CisgICAgaWYgKHBDb21tYW5kQnVmZmVycykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGNvbW1hbmRCdWZmZXJDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENvbW1hbmRCdWZmZXJzW2luZGV4MF0sIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qICAgICAgICAgICAgICAgcEJpbmRJbmZvcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEJpbmRJbmZvcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGJpbmRJbmZvQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb3NbaW5kZXgwXS5idWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEJpbmRJbmZvc1tpbmRleDBdLm1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIGZhbHNlLCAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeTItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEJpbmRJbmZvcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGJpbmRJbmZvQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb3NbaW5kZXgwXS5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb3NbaW5kZXgwXS5tZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldERldmljZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzaykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEJhc2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCBmYWxzZSwgIlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwcy1pbnN0YW5jZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEluZm8tPmltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlLCBmYWxzZSwgIlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwSW5mby0+YnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItYnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwSW5mby0+aW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIGZhbHNlLCAiVlVJRC1Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItaW1hZ2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiAgICAgICAgICAgICAgICAgIHBGZWF0dXJlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqICAgICAgICAgIHBNZW1vcnlQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVUcmltQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtUcmltQ29tbWFuZFBvb2wtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRQb29sLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sLCBmYWxzZSwgIlZVSUQtdmtUcmltQ29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyYW1ldGVyIiwgIlZVSUQtdmtUcmltQ29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBZY2JjckNvbnZlcnNpb24sIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlclljYmNyQ29udmVyc2lvbiwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24tZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHljYmNyQ29udmVyc2lvbiwga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLCB0cnVlLCAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXljYmNyQ29udmVyc2lvbi1wYXJhbWV0ZXIiLCAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXljYmNyQ29udmVyc2lvbi1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdCh5Y2JjckNvbnZlcnNpb24sIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlclljYmNyQ29udmVyc2lvbiwgcEFsbG9jYXRvciwga1ZVSURVbmRlZmluZWQsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QoeWNiY3JDb252ZXJzaW9uLCBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXJZY2JjckNvbnZlcnNpb24pOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mby0+ZGVzY3JpcHRvclNldExheW91dCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0TGF5b3V0LCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBDcmVhdGVJbmZvLT5waXBlbGluZUxheW91dCwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUxheW91dCwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVEZXN0cm95T2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IsICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yU2V0TGF5b3V0LTAwMzU2IiwgIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAzNTciKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgUmVjb3JkRGVzdHJveU9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGVzY3JpcHRvclNldCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0LCBmYWxzZSwgIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlLWRlc2NyaXB0b3JTZXQtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgZmFsc2UsICJWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCB0cnVlLCAiVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLXBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVEZXN0cm95T2JqZWN0KHN1cmZhY2UsIGtWdWxrYW5PYmplY3RUeXBlU3VyZmFjZUtIUiwgcEFsbG9jYXRvciwgIlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLTAxMjY3IiwgIlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLTAxMjY4Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95U3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KHN1cmZhY2UsIGtWdWxrYW5PYmplY3RUeXBlU3VyZmFjZUtIUik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrQm9vbDMyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cHBvcnRlZCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN1cmZhY2UsIGtWdWxrYW5PYmplY3RUeXBlU3VyZmFjZUtIUiwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFItY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdEtIUiogICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChzdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFItY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN1cmZhY2UsIGtWdWxrYW5PYmplY3RUeXBlU3VyZmFjZUtIUiwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFItY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVN3YXBjaGFpbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZVN3YXBjaGFpbktIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBDcmVhdGVJbmZvLT5zdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIGZhbHNlLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItc3VyZmFjZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItY29tbW9ucGFyZW50Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm8tPm9sZFN3YXBjaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIHRydWUsICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1vbGRTd2FwY2hhaW4tcGFyYW1ldGVyIiwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW9sZFN3YXBjaGFpbi1wYXJlbnQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlU3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcFN3YXBjaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVBY3F1aXJlTmV4dEltYWdlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItZGV2aWNlLXBhcmFtZXRlciIsICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN3YXBjaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGZhbHNlLCAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItc3dhcGNoYWluLXBhcmFtZXRlciIsICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHNlbWFwaG9yZSwga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUsIHRydWUsICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtcGFyYW1ldGVyIiwgIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGZlbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlLCB0cnVlLCAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItZmVuY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLWZlbmNlLXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVRdWV1ZVByZXNlbnRLSFIoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50SW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocXVldWUsIGtWdWxrYW5PYmplY3RUeXBlUXVldWUsIGZhbHNlLCAiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1xdWV1ZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBQcmVzZW50SW5mbykgeworICAgICAgICBpZiAocFByZXNlbnRJbmZvLT5wV2FpdFNlbWFwaG9yZXMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgcFByZXNlbnRJbmZvLT53YWl0U2VtYXBob3JlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwUHJlc2VudEluZm8tPnBXYWl0U2VtYXBob3Jlc1tpbmRleDFdLCBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZSwgZmFsc2UsICJWVUlELVZrUHJlc2VudEluZm9LSFItcFdhaXRTZW1hcGhvcmVzLXBhcmFtZXRlciIsICJWVUlELVZrUHJlc2VudEluZm9LSFItY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgcFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaW5kZXgxXSwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGZhbHNlLCAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBTd2FwY2hhaW5zLXBhcmFtZXRlciIsICJWVUlELVZrUHJlc2VudEluZm9LSFItY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogICAgICAgIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFItZGV2aWNlLXBhcmFtZXRlciIsICJWVUlELXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBmYWxzZSwgIlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0Q291bnQsCisgICAgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN1cmZhY2UsIGtWdWxrYW5PYmplY3RUeXBlU3VyZmFjZUtIUiwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1zdXJmYWNlLXBhcmFtZXRlciIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogICAgICAgICAgICBwQWNxdWlyZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VJbmRleCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZTJLSFItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEFjcXVpcmVJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEFjcXVpcmVJbmZvLT5zd2FwY2hhaW4sIGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSLCBmYWxzZSwgIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zd2FwY2hhaW4tcGFyYW1ldGVyIiwgIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQWNxdWlyZUluZm8tPnNlbWFwaG9yZSwga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUsIHRydWUsICJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsICJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItY29tbW9ucGFyZW50Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEFjcXVpcmVJbmZvLT5mZW5jZSwga1Z1bGthbk9iamVjdFR5cGVGZW5jZSwgdHJ1ZSwgIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1mZW5jZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLWNvbW1vbnBhcmVudCIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheUNvdW50LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlDb3VudCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5cywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIGlmIChwRGlzcGxheXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgKnBEaXNwbGF5Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIENyZWF0ZU9iamVjdChwRGlzcGxheXNbaW5kZXhdLCBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlLSFIsIG51bGxwdHIpOworICAgICAgICB9CisgICAgfQorCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGlzcGxheSwga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5S0hSLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVEaXNwbGF5TW9kZUtIUi1kaXNwbGF5LXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwTW9kZSwga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5TW9kZUtIUiwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheU1vZGVLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KG1vZGUsIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheU1vZGVLSFIsIGZhbHNlLCAiVlVJRC12a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUi1tb2RlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mby0+ZGlzcGxheU1vZGUsIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheU1vZGVLSFIsIGZhbHNlLCAiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1kaXNwbGF5TW9kZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IHN3YXBjaGFpbkNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5zdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIGZhbHNlLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItc3VyZmFjZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBDcmVhdGVJbmZvc1tpbmRleDBdLm9sZFN3YXBjaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIHRydWUsICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1vbGRTd2FwY2hhaW4tcGFyYW1ldGVyIiwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW9sZFN3YXBjaGFpbi1wYXJlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBpZiAocFN3YXBjaGFpbnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgc3dhcGNoYWluQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIENyZWF0ZU9iamVjdChwU3dhcGNoYWluc1tpbmRleF0sIGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSLCBwQWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVYbGliU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlWGxpYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBwQWxsb2NhdG9yKTsKKworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZpc3VhbElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsSUQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVhjYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlWGNiU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBTdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIHBBbGxvY2F0b3IpOworCit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgeGNiX2Nvbm5lY3Rpb25fdCogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgIHhjYl92aXN1YWxpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsX2lkKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoaW5zdGFuY2UsIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBTdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIHBBbGxvY2F0b3IpOworCit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgc3RydWN0IHdsX2Rpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcFN1cmZhY2UsIGtWdWxrYW5PYmplY3RUeXBlU3VyZmFjZUtIUiwgcEFsbG9jYXRvcik7CisKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBTdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIHBBbGxvY2F0b3IpOworCit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogICAgIHBJbWFnZUZvcm1hdEluZm8sCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIqIHBGb3JtYXRJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGV2aWNlTWFza0tIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZFNldERldmljZU1hc2stY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoQmFzZUtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVUcmltQ29tbWFuZFBvb2xLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtUcmltQ29tbWFuZFBvb2wtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRQb29sLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sLCBmYWxzZSwgIlZVSUQtdmtUcmltQ29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyYW1ldGVyIiwgIlZVSUQtdmtUcmltQ29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgZmFsc2UsICJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMtaW5zdGFuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qICAgcEV4dGVybmFsQnVmZmVySW5mbywKKyAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBHZXRXaW4zMkhhbmRsZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwR2V0V2luMzJIYW5kbGVJbmZvLT5tZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCBmYWxzZSwgIlZVSUQtVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFItbWVtb3J5LXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldE1lbW9yeUZkS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBHZXRGZEluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwR2V0RmRJbmZvLT5tZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCBmYWxzZSwgIlZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItbWVtb3J5LXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUZkUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwKKyAgICBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlGZFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sCisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqICAgICAgICAgICAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvLT5zZW1hcGhvcmUsIGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlLCBmYWxzZSwgIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwR2V0V2luMzJIYW5kbGVJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEdldFdpbjMySGFuZGxlSW5mby0+c2VtYXBob3JlLCBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZSwgZmFsc2UsICJWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlSW1wb3J0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqICAgICAgICAgICBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtJbXBvcnRTZW1hcGhvcmVGZEtIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEltcG9ydFNlbWFwaG9yZUZkSW5mby0+c2VtYXBob3JlLCBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZSwgZmFsc2UsICJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRTZW1hcGhvcmVGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFNlbWFwaG9yZUZkS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBHZXRGZEluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwR2V0RmRJbmZvLT5zZW1hcGhvcmUsIGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlLCBmYWxzZSwgIlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGZhbHNlLCAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QobGF5b3V0LCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0LCBmYWxzZSwgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1sYXlvdXQtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm8tPmRlc2NyaXB0b3JTZXRMYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldExheW91dCwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mby0+cGlwZWxpbmVMYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tY29tbW9ucGFyZW50Iik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHRydWUsICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGVzY3JpcHRvclNldExheW91dC0wMDM1NiIsICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yU2V0TGF5b3V0LTAwMzU3Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRlc2NyaXB0b3JTZXQsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldCwgZmFsc2UsICJWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXNjcmlwdG9yU2V0LXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGZhbHNlLCAiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBhcmFtZXRlciIsICJWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MyS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzczJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtSZW5kZXJQYXNzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVuZGVyUGFzcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcFJlbmRlclBhc3MsIGtWdWxrYW5PYmplY3RUeXBlUmVuZGVyUGFzcywgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBSZW5kZXJQYXNzQmVnaW4pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MsIGZhbHNlLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcmVuZGVyUGFzcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tY29tbW9ucGFyZW50Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFJlbmRlclBhc3NCZWdpbi0+ZnJhbWVidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlRnJhbWVidWZmZXIsIGZhbHNlLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWNvbW1vbnBhcmVudCIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kTmV4dFN1YnBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRTd2FwY2hhaW5TdGF0dXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFN3YXBjaGFpblN0YXR1c0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChzd2FwY2hhaW4sIGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSLCBmYWxzZSwgIlZVSUQtdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFItc3dhcGNoYWluLXBhcmFtZXRlciIsICJWVUlELXZrR2V0U3dhcGNoYWluU3RhdHVzS0hSLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiAgICAgIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8tPmZlbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlLCBmYWxzZSwgIlZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1mZW5jZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBHZXRXaW4zMkhhbmRsZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwR2V0V2luMzJIYW5kbGVJbmZvLT5mZW5jZSwga1Z1bGthbk9iamVjdFR5cGVGZW5jZSwgZmFsc2UsICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItZmVuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogICAgICAgICAgICAgICBwSW1wb3J0RmVuY2VGZEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0ltcG9ydEZlbmNlRmRLSFItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEltcG9ydEZlbmNlRmRJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEltcG9ydEZlbmNlRmRJbmZvLT5mZW5jZSwga1Z1bGthbk9iamVjdFR5cGVGZW5jZSwgZmFsc2UsICJWVUlELVZrSW1wb3J0RmVuY2VGZEluZm9LSFItZmVuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldEZlbmNlRmRLSFItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEdldEZkSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBHZXRGZEluZm8tPmZlbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlLCBmYWxzZSwgIlZVSUQtVmtGZW5jZUdldEZkSW5mb0tIUi1mZW5jZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJDb3VudCwKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogICAgICAgICAgICAgICAgICAgIHBDb3VudGVycywKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiAgICAgICAgIHBDb3VudGVyRGVzY3JpcHRpb25zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIqICBwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtUGFzc2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiogICAgICAgIHBJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocFN1cmZhY2VJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFN1cmZhY2VJbmZvLT5zdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIGZhbHNlLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgVmtTdXJmYWNlRm9ybWF0MktIUiogICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBTdXJmYWNlSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBTdXJmYWNlSW5mby0+c3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBmYWxzZSwgIlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zdXJmYWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIqICAgICAgICAgICAgICAgcERpc3BsYXlQbGFuZUluZm8sCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBEaXNwbGF5UGxhbmVJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocERpc3BsYXlQbGFuZUluZm8tPm1vZGUsIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheU1vZGVLSFIsIGZhbHNlLCAiVlVJRC1Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSLW1vZGUtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwSW5mby0+aW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIGZhbHNlLCAiVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItaW1hZ2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBJbmZvLT5idWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1idWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBJbmZvLT5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELVZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwWWNiY3JDb252ZXJzaW9uLCBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXJZY2JjckNvbnZlcnNpb24sIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdCh5Y2JjckNvbnZlcnNpb24sIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlclljYmNyQ29udmVyc2lvbiwgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbi15Y2JjckNvbnZlcnNpb24tcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbi15Y2JjckNvbnZlcnNpb24tcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QoeWNiY3JDb252ZXJzaW9uLCBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXJZY2JjckNvbnZlcnNpb24sIHBBbGxvY2F0b3IsIGtWVUlEVW5kZWZpbmVkLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KHljYmNyQ29udmVyc2lvbiwga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qICAgICAgICAgICAgICAgcEJpbmRJbmZvcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEJpbmRJbmZvcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGJpbmRJbmZvQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb3NbaW5kZXgwXS5idWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEJpbmRJbmZvc1tpbmRleDBdLm1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIGZhbHNlLCAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeTItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEJpbmRJbmZvcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGJpbmRJbmZvQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb3NbaW5kZXgwXS5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgZmFsc2UsICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBCaW5kSW5mb3NbaW5kZXgwXS5tZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWNvbW1vbnBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY291bnRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb3VudEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHNlbWFwaG9yZSwga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUsIGZhbHNlLCAiVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1zZW1hcGhvcmUtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFItc2VtYXBob3JlLXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVXYWl0U2VtYXBob3Jlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiAgICAgICAgICAgICAgIHBXYWl0SW5mbywKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a1dhaXRTZW1hcGhvcmVzS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBXYWl0SW5mbykgeworICAgICAgICBpZiAocFdhaXRJbmZvLT5wU2VtYXBob3JlcykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBwV2FpdEluZm8tPnNlbWFwaG9yZUNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFdhaXRJbmZvLT5wU2VtYXBob3Jlc1tpbmRleDFdLCBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZSwgZmFsc2UsICJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVTaWduYWxTZW1hcGhvcmVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKiAgICAgICAgICAgICBwU2lnbmFsSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrU2lnbmFsU2VtYXBob3JlS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBTaWduYWxJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFNpZ25hbEluZm8tPnNlbWFwaG9yZSwga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUsIGZhbHNlLCAiVlVJRC1Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiogcEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4ZWN1dGFibGVDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBQaXBlbGluZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwUGlwZWxpbmVJbmZvLT5waXBlbGluZSwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZSwgZmFsc2UsICJWVUlELVZrUGlwZWxpbmVJbmZvS0hSLXBpcGVsaW5lLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdGlzdGljQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqICAgICAgICAgICBwU3RhdGlzdGljcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwRXhlY3V0YWJsZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwRXhlY3V0YWJsZUluZm8tPnBpcGVsaW5lLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lLCBmYWxzZSwgIlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLXBpcGVsaW5lLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogICAgICAgICAgcEV4ZWN1dGFibGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEV4ZWN1dGFibGVJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEV4ZWN1dGFibGVJbmZvLT5waXBlbGluZSwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZSwgZmFsc2UsICJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUi1waXBlbGluZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2spIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2ssCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBDYWxsYmFjaywga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoaW5zdGFuY2UsIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNhbGxiYWNrLCBrVnVsa2FuT2JqZWN0VHlwZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWNhbGxiYWNrLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtY2FsbGJhY2stcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QoY2FsbGJhY2ssIGtWdWxrYW5PYmplY3RUeXBlRGVidWdSZXBvcnRDYWxsYmFja0VYVCwgcEFsbG9jYXRvciwga1ZVSURVbmRlZmluZWQsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KGNhbGxiYWNrLCBrVnVsa2FuT2JqZWN0VHlwZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvZGUsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJQcmVmaXgsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVzc2FnZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoaW5zdGFuY2UsIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UsIGZhbHNlLCAiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1pbnN0YW5jZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgcFRhZ0luZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqICAgICAgIHBOYW1lSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERlYnVnTWFya2VyQmVnaW5FWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kRGVidWdNYXJrZXJFbmRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZERlYnVnTWFya2VyRW5kRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWREZWJ1Z01hcmtlckluc2VydEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqICAgICAgICAgICBwTWFya2VySW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcFNpemVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtY29tbW9ucGFyZW50Iik7CisgICAgaWYgKHBCdWZmZXJzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgYmluZGluZ0NvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQnVmZmVyc1tpbmRleDBdLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wQnVmZmVycy1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtY29tbW9ucGFyZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbW9ucGFyZW50Iik7CisgICAgaWYgKHBDb3VudGVyQnVmZmVycykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGNvdW50ZXJCdWZmZXJDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENvdW50ZXJCdWZmZXJzW2luZGV4MF0sIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1vbnBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1vbnBhcmVudCIpOworICAgIGlmIChwQ291bnRlckJ1ZmZlcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBjb3VudGVyQnVmZmVyQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBDb3VudGVyQnVmZmVyc1tpbmRleDBdLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbW9ucGFyZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChxdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBmYWxzZSwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChxdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBmYWxzZSwgIlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtcXVlcnlQb29sLXBhcmFtZXRlciIsICJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb3VudGVyQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvdW50ZXJCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldEltYWdlVmlld0hhbmRsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqICAgICAgICAgICAgIHBJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvdW50QnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItYnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY291bnRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFNoYWRlckluZm9BTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0YWdlLAorICAgIFZrU2hhZGVySW5mb1R5cGVBTUQgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mb1NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGlwZWxpbmUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmUsIGZhbHNlLCAiVlVJRC12a0dldFNoYWRlckluZm9BTUQtcGlwZWxpbmUtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELXBpcGVsaW5lLXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoaW5zdGFuY2UsIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQLWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcFN1cmZhY2UsIGtWdWxrYW5PYmplY3RUeXBlU3VyZmFjZUtIUiwgcEFsbG9jYXRvcik7CisKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICAgICAgICAgZXh0ZXJuYWxIYW5kbGVUeXBlLAorICAgIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViogICAgICAgICAgcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5V2luMzJIYW5kbGVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChtZW1vcnksIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlTWVtb3J5LCBmYWxzZSwgIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLW1lbW9yeS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlTlYtbWVtb3J5LXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVWaVN1cmZhY2VOTi1pbnN0YW5jZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlVmlTdXJmYWNlTk4oCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBwQWxsb2NhdG9yKTsKKworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogICBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbikgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLT5idWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVC1idWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRQcm9jZXNzQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogICAgICAgICAgcFByb2Nlc3NDb21tYW5kc0luZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwUHJvY2Vzc0NvbW1hbmRzSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5vYmplY3RUYWJsZSwga1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWCwgZmFsc2UsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1vYmplY3RUYWJsZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtY29tbW9ucGFyZW50Iik7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFByb2Nlc3NDb21tYW5kc0luZm8tPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCwgZmFsc2UsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1pbmRpcmVjdENvbW1hbmRzTGF5b3V0LXBhcmFtZXRlciIsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgaWYgKHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5wSW5kaXJlY3RDb21tYW5kc1Rva2VucykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDEgPSAwOyBpbmRleDEgPCBwUHJvY2Vzc0NvbW1hbmRzSW5mby0+aW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwUHJvY2Vzc0NvbW1hbmRzSW5mby0+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnNbaW5kZXgxXS5idWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlgtYnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBQcm9jZXNzQ29tbWFuZHNJbmZvLT50YXJnZXRDb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIHRydWUsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC10YXJnZXRDb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwUHJvY2Vzc0NvbW1hbmRzSW5mby0+c2VxdWVuY2VzQ291bnRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCB0cnVlLCAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtc2VxdWVuY2VzQ291bnRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLWNvbW1vbnBhcmVudCIpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5zZXF1ZW5jZXNJbmRleEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIHRydWUsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zZXF1ZW5jZXNJbmRleEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtY29tbW9ucGFyZW50Iik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqICBwUmVzZXJ2ZVNwYWNlSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocFJlc2VydmVTcGFjZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwUmVzZXJ2ZVNwYWNlSW5mby0+b2JqZWN0VGFibGUsIGtWdWxrYW5PYmplY3RUeXBlT2JqZWN0VGFibGVOVlgsIGZhbHNlLCAiVlVJRC1Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWC1vYmplY3RUYWJsZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwUmVzZXJ2ZVNwYWNlSW5mby0+aW5kaXJlY3RDb21tYW5kc0xheW91dCwga1Z1bGthbk9iamVjdFR5cGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLCBmYWxzZSwgIlZVSUQtVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgtaW5kaXJlY3RDb21tYW5kc0xheW91dC1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogICAgICAgICAgICAgICAgcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqICAgICAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwSW5kaXJlY3RDb21tYW5kc0xheW91dCwga1Z1bGthbk9iamVjdFR5cGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYICAgICAgICAgICAgICAgICBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCwgZmFsc2UsICJWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtaW5kaXJlY3RDb21tYW5kc0xheW91dC1wYXJhbWV0ZXIiLCAiVlVJRC12a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLWluZGlyZWN0Q29tbWFuZHNMYXlvdXQtcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QoaW5kaXJlY3RDb21tYW5kc0xheW91dCwga1Z1bGthbk9iamVjdFR5cGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLCBwQWxsb2NhdG9yLCBrVlVJRFVuZGVmaW5lZCwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYICAgICAgICAgICAgICAgICBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QoaW5kaXJlY3RDb21tYW5kc0xheW91dCwga1Z1bGthbk9iamVjdFR5cGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZU9iamVjdFRhYmxlTlZYLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBPYmplY3RUYWJsZSwga1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWCwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveU9iamVjdFRhYmxlTlZYLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChvYmplY3RUYWJsZSwga1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWCwgZmFsc2UsICJWVUlELXZrRGVzdHJveU9iamVjdFRhYmxlTlZYLW9iamVjdFRhYmxlLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveU9iamVjdFRhYmxlTlZYLW9iamVjdFRhYmxlLXBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVEZXN0cm95T2JqZWN0KG9iamVjdFRhYmxlLCBrVnVsa2FuT2JqZWN0VHlwZU9iamVjdFRhYmxlTlZYLCBwQWxsb2NhdG9yLCBrVlVJRFVuZGVmaW5lZCwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgUmVjb3JkRGVzdHJveU9iamVjdChvYmplY3RUYWJsZSwga1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWCk7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KG9iamVjdFRhYmxlLCBrVnVsa2FuT2JqZWN0VHlwZU9iamVjdFRhYmxlTlZYLCBmYWxzZSwgIlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0VGFibGUtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVVucmVnaXN0ZXJPYmplY3RzTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RDb3VudCwKKyAgICBjb25zdCBWa09iamVjdEVudHJ5VHlwZU5WWCogICAgICAgICAgICAgICAgIHBPYmplY3RFbnRyeVR5cGVzLAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdEluZGljZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChvYmplY3RUYWJsZSwga1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWCwgZmFsc2UsICJWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1vYmplY3RUYWJsZS1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqICAgICAgIHBGZWF0dXJlcywKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiAgICAgICAgIHBMaW1pdHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogICAgICAgICAgICAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVJlbGVhc2VEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrUmVsZWFzZURpc3BsYXlFWFQtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGlzcGxheSwga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5S0hSLCBmYWxzZSwgIlZVSUQtdmtSZWxlYXNlRGlzcGxheUVYVC1kaXNwbGF5LXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQWNxdWlyZVhsaWJEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrQWNxdWlyZVhsaWJEaXNwbGF5RVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRpc3BsYXksIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUiwgZmFsc2UsICJWVUlELXZrQWNxdWlyZVhsaWJEaXNwbGF5RVhULWRpc3BsYXktcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgUlJPdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByck91dHB1dCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBSUk91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyT3V0cHV0LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXksCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBEaXNwbGF5LCBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlLSFIsIG51bGxwdHIpOworCit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChzdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIGZhbHNlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtc3VyZmFjZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURpc3BsYXlQb3dlckNvbnRyb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlQb3dlckluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRpc3BsYXksIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUiwgZmFsc2UsICJWVUlELXZrRGlzcGxheVBvd2VyQ29udHJvbEVYVC1kaXNwbGF5LXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgIHBEZXZpY2VFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtSZWdpc3RlckRldmljZUV2ZW50RVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgIHBEZXZpY2VFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwRmVuY2UsIGtWdWxrYW5PYmplY3RUeXBlRmVuY2UsIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVSZWdpc3RlckRpc3BsYXlFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkaXNwbGF5LCBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlLSFIsIGZhbHNlLCAiVlVJRC12a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhULWRpc3BsYXktcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZFJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5RXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcEZlbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUZlbmNlLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0U3dhcGNoYWluQ291bnRlckVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgICAgICAgICAgICAgICAgIGNvdW50ZXIsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlclZhbHVlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChzd2FwY2hhaW4sIGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSLCBmYWxzZSwgIlZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULXN3YXBjaGFpbi1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUqICAgICAgICAgICAgICAgcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRS1kZXZpY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRS1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN3YXBjaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGZhbHNlLCAiVlVJRC12a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LAorICAgIFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSogICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtZGV2aWNlLXBhcmFtZXRlciIsICJWVUlELXZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRS1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN3YXBjaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGZhbHNlLCAiVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtc3dhcGNoYWluLXBhcmFtZXRlciIsICJWVUlELXZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRS1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERpc2NhcmRSZWN0YW5nbGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlU2V0SGRyTWV0YWRhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zLAorICAgIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtTZXRIZHJNZXRhZGF0YUVYVC1kZXZpY2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtTZXRIZHJNZXRhZGF0YUVYVC1jb21tb25wYXJlbnQiKTsKKyAgICBpZiAocFN3YXBjaGFpbnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBzd2FwY2hhaW5Db3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFN3YXBjaGFpbnNbaW5kZXgwXSwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGZhbHNlLCAiVlVJRC12a1NldEhkck1ldGFkYXRhRVhULXBTd2FwY2hhaW5zLXBhcmFtZXRlciIsICJWVUlELXZrU2V0SGRyTWV0YWRhdGFFWFQtY29tbW9ucGFyZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVJT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoaW5zdGFuY2UsIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZUlPU1N1cmZhY2VNVkstaW5zdGFuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBwQWxsb2NhdG9yKTsKKworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVNYWNPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLLWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVNYWNPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBwQWxsb2NhdG9yKTsKKworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHF1ZXVlLCBrVnVsa2FuT2JqZWN0VHlwZVF1ZXVlLCBmYWxzZSwgIlZVSUQtdmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhULXF1ZXVlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocXVldWUsIGtWdWxrYW5PYmplY3RUeXBlUXVldWUsIGZhbHNlLCAiVlVJRC12a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhULXF1ZXVlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHF1ZXVlLCBrVnVsa2FuT2JqZWN0VHlwZVF1ZXVlLCBmYWxzZSwgIlZVSUQtdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1xdWV1ZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQqICAgICAgICAgICAgICAgICAgIHBNZXNzZW5nZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKiAgICAgICAgICAgICAgICAgICBwTWVzc2VuZ2VyLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwTWVzc2VuZ2VyLCBrVnVsa2FuT2JqZWN0VHlwZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQsIHBBbGxvY2F0b3IpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoaW5zdGFuY2UsIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KG1lc3Nlbmdlciwga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULCBmYWxzZSwgIlZVSUQtdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVC1tZXNzZW5nZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVC1tZXNzZW5nZXItcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QobWVzc2VuZ2VyLCBrVnVsa2FuT2JqZWN0VHlwZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQsIHBBbGxvY2F0b3IsIGtWVUlEVW5kZWZpbmVkLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3QobWVzc2VuZ2VyLCBrVnVsa2FuT2JqZWN0VHlwZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUICAgICAgbWVzc2FnZVNldmVyaXR5LAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgICAgICAgICAgICAgbWVzc2FnZVR5cGVzLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogcENhbGxiYWNrRGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoaW5zdGFuY2UsIGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2UsIGZhbHNlLCAiVlVJRC12a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhULWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKiAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogcEluZm8sCisgICAgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlcioqICAgICAgICAgICAgICAgICAgICBwQnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lELWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEluZm8tPm1lbW9yeSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIGZhbHNlLCAiVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELW1lbW9yeS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogICAgICAgICAgICAgcFNhbXBsZUxvY2F0aW9uc0luZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogICAgICAgICAgICAgICAgIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogICAgICBwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGltYWdlLCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlLCBmYWxzZSwgIlZVSUQtdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVC1pbWFnZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULWltYWdlLXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICAgICAgICBwVmFsaWRhdGlvbkNhY2hlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICAgICAgICBwVmFsaWRhdGlvbkNhY2hlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwVmFsaWRhdGlvbkNhY2hlLCBrVnVsa2FuT2JqZWN0VHlwZVZhbGlkYXRpb25DYWNoZUVYVCwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdCh2YWxpZGF0aW9uQ2FjaGUsIGtWdWxrYW5PYmplY3RUeXBlVmFsaWRhdGlvbkNhY2hlRVhULCB0cnVlLCAiVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtdmFsaWRhdGlvbkNhY2hlLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVC12YWxpZGF0aW9uQ2FjaGUtcGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QodmFsaWRhdGlvbkNhY2hlLCBrVnVsa2FuT2JqZWN0VHlwZVZhbGlkYXRpb25DYWNoZUVYVCwgcEFsbG9jYXRvciwga1ZVSURVbmRlZmluZWQsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgUmVjb3JkRGVzdHJveU9iamVjdCh2YWxpZGF0aW9uQ2FjaGUsIGtWdWxrYW5PYmplY3RUeXBlVmFsaWRhdGlvbkNhY2hlRVhUKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkc3RDYWNoZSwga1Z1bGthbk9iamVjdFR5cGVWYWxpZGF0aW9uQ2FjaGVFWFQsIGZhbHNlLCAiVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1kc3RDYWNoZS1wYXJhbWV0ZXIiLCAiVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1kc3RDYWNoZS1wYXJlbnQiKTsKKyAgICBpZiAocFNyY0NhY2hlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IHNyY0NhY2hlQ291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBTcmNDYWNoZXNbaW5kZXgwXSwga1Z1bGthbk9iamVjdFR5cGVWYWxpZGF0aW9uQ2FjaGVFWFQsIGZhbHNlLCAiVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1wU3JjQ2FjaGVzLXBhcmFtZXRlciIsICJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULXBTcmNDYWNoZXMtcGFyZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QodmFsaWRhdGlvbkNhY2hlLCBrVnVsa2FuT2JqZWN0VHlwZVZhbGlkYXRpb25DYWNoZUVYVCwgZmFsc2UsICJWVUlELXZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVC12YWxpZGF0aW9uQ2FjaGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhULXZhbGlkYXRpb25DYWNoZS1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoaW1hZ2VWaWV3LCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlVmlldywgdHJ1ZSwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogICAgICAgICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WICAgICAgICAgICAgICAgICAgIHNhbXBsZU9yZGVyVHlwZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsCisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MiA9IDA7IGluZGV4MiA8IHBDcmVhdGVJbmZvLT5pbmZvLmdlb21ldHJ5Q291bnQ7ICsraW5kZXgyKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllc1tpbmRleDJdLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhEYXRhLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgdHJ1ZSwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleERhdGEtcGFyYW1ldGVyIiwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWNvbW1vbnBhcmVudCIpOworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbaW5kZXgyXS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhEYXRhLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgdHJ1ZSwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4RGF0YS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllc1tpbmRleDJdLmdlb21ldHJ5LnRyaWFuZ2xlcy50cmFuc2Zvcm1EYXRhLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgdHJ1ZSwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXRyYW5zZm9ybURhdGEtcGFyYW1ldGVyIiwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWNvbW1vbnBhcmVudCIpOworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbaW5kZXgyXS5nZW9tZXRyeS5hYWJicy5hYWJiRGF0YSwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIHRydWUsICJWVUlELVZrR2VvbWV0cnlBQUJCTlYtYWFiYkRhdGEtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcEFjY2VsZXJhdGlvblN0cnVjdHVyZSwga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgcEFsbG9jYXRvcik7CisKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLCBmYWxzZSwgIlZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmFtZXRlciIsICJWVUlELXZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYsIHBBbGxvY2F0b3IsIGtWVUlEVW5kZWZpbmVkLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgUmVjb3JkRGVzdHJveU9iamVjdChhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpOworCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBJbmZvLT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYsIGZhbHNlLCAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIHBCaW5kSW5mb3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwQmluZEluZm9zKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgYmluZEluZm9Db3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEJpbmRJbmZvc1tpbmRleDBdLmFjY2VsZXJhdGlvblN0cnVjdHVyZSwga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgZmFsc2UsICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyYW1ldGVyIiwgIlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLWNvbW1vbnBhcmVudCIpOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQmluZEluZm9zW2luZGV4MF0ubWVtb3J5LCBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeSwgZmFsc2UsICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnktcGFyYW1ldGVyIiwgIlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLWNvbW1vbnBhcmVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogICAgICAgIHBJbmZvLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZmZzZXQsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaE9mZnNldCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1vbnBhcmVudCIpOworICAgIGlmIChwSW5mbykgeworICAgICAgICBpZiAocEluZm8tPnBHZW9tZXRyaWVzKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IHBJbmZvLT5nZW9tZXRyeUNvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocEluZm8tPnBHZW9tZXRyaWVzW2luZGV4MV0uZ2VvbWV0cnkudHJpYW5nbGVzLnZlcnRleERhdGEsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCB0cnVlLCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdmVydGV4RGF0YS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwSW5mby0+cEdlb21ldHJpZXNbaW5kZXgxXS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhEYXRhLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgdHJ1ZSwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4RGF0YS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwSW5mby0+cEdlb21ldHJpZXNbaW5kZXgxXS5nZW9tZXRyeS50cmlhbmdsZXMudHJhbnNmb3JtRGF0YSwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIHRydWUsICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi10cmFuc2Zvcm1EYXRhLXBhcmFtZXRlciIsICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBJbmZvLT5wR2VvbWV0cmllc1tpbmRleDFdLmdlb21ldHJ5LmFhYmJzLmFhYmJEYXRhLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgdHJ1ZSwgIlZVSUQtVmtHZW9tZXRyeUFBQkJOVi1hYWJiRGF0YS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZURhdGEsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCB0cnVlLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtaW5zdGFuY2VEYXRhLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRzdCwga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgZmFsc2UsICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kc3QtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3JjLCBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLCB0cnVlLCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtc3JjLXBhcmFtZXRlciIsICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHNjcmF0Y2gsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNjcmF0Y2gtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViAgICAgICAgICAgbW9kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRzdCwga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgZmFsc2UsICJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRzdC1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHNyYywga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgZmFsc2UsICJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNyYy1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kVHJhY2VSYXlzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgdHJ1ZSwgIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1taXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCB0cnVlLCAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCB0cnVlLCAiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaXBlbGluZUNhY2hlLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lQ2FjaGUsIHRydWUsICJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLXBpcGVsaW5lQ2FjaGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtcGlwZWxpbmVDYWNoZS1wYXJlbnQiKTsKKyAgICBpZiAocENyZWF0ZUluZm9zKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgY3JlYXRlSW5mb0NvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpbmRleDBdLnBTdGFnZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IHBDcmVhdGVJbmZvc1tpbmRleDBdLnN0YWdlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm9zW2luZGV4MF0ucFN0YWdlc1tpbmRleDFdLm1vZHVsZSwga1Z1bGthbk9iamVjdFR5cGVTaGFkZXJNb2R1bGUsIGZhbHNlLCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1vZHVsZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mb3NbaW5kZXgwXS5sYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQsIGZhbHNlLCAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1sYXlvdXQtcGFyYW1ldGVyIiwgIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICBpZiAoKHBDcmVhdGVJbmZvc1tpbmRleDBdLmZsYWdzICYgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUKSAmJiAocENyZWF0ZUluZm9zW2luZGV4MF0uYmFzZVBpcGVsaW5lSW5kZXggPT0gLTEpKQorICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm9zW2luZGV4MF0uYmFzZVBpcGVsaW5lSGFuZGxlLCBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lLCBmYWxzZSwgIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtZmxhZ3MtMDI0MDQiLCAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBpZiAoVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUID09IHJlc3VsdCkgcmV0dXJuOworICAgIGlmIChwUGlwZWxpbmVzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNyZWF0ZUluZm9Db3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKCFwUGlwZWxpbmVzW2luZGV4XSkgY29udGludWU7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocFBpcGVsaW5lc1tpbmRleF0sIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmUsIHBBbGxvY2F0b3IpOworICAgICAgICB9CisgICAgfQorCit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0R3JvdXAsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaXBlbGluZSwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZSwgZmFsc2UsICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLXBpcGVsaW5lLXBhcmFtZXRlciIsICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLXBpcGVsaW5lLXBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYsIGZhbHNlLCAiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsCisgICAgVmtRdWVyeVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWNvbW1vbnBhcmVudCIpOworICAgIGlmIChwQWNjZWxlcmF0aW9uU3RydWN0dXJlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50OyArK2luZGV4MCkgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpbmRleDBdLCBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLCBmYWxzZSwgIlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtY29tbW9ucGFyZW50Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChxdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBmYWxzZSwgIlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtcXVlcnlQb29sLXBhcmFtZXRlciIsICJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWNvbW1vbnBhcmVudCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDb21waWxlRGVmZXJyZWROVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtDb21waWxlRGVmZXJyZWROVi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocGlwZWxpbmUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmUsIGZhbHNlLCAiVlVJRC12a0NvbXBpbGVEZWZlcnJlZE5WLXBpcGVsaW5lLXBhcmFtZXRlciIsICJWVUlELXZrQ29tcGlsZURlZmVycmVkTlYtcGlwZWxpbmUtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXIsCisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqICAgICAgICAgICBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkc3RCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1kc3RCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWluQ291bnQsCisgICAgVmtUaW1lRG9tYWluRVhUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wQ291bnQsCisgICAgY29uc3QgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCogICAgICAgICBwVGltZXN0YW1wSW5mb3MsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZXN0YW1wcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXhEZXZpYXRpb24pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtYnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1idWZmZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1vbnBhcmVudCIpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY291bnRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldENoZWNrcG9pbnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludE1hcmtlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZEJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLCBmYWxzZSwgIlZVSUQtdmtDbWRTZXRDaGVja3BvaW50TlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFF1ZXVlQ2hlY2twb2ludERhdGFOVigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhQ291bnQsCisgICAgVmtDaGVja3BvaW50RGF0YU5WKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHF1ZXVlLCBrVnVsa2FuT2JqZWN0VHlwZVF1ZXVlLCBmYWxzZSwgIlZVSUQtdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYtcXVldWUtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogIHBJbml0aWFsaXplSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiAgICAgICAgIHBNYXJrZXJJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLCAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwqICAgcE1hcmtlckluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqICAgICAgIHBPdmVycmlkZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgICAgICAgICAgICAgcGFyYW1ldGVyLAorICAgIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiAgICAgICAgICAgICAgICAgICAgcFZhbHVlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrU2V0TG9jYWxEaW1taW5nQU1ELWRldmljZS1wYXJhbWV0ZXIiLCAiVlVJRC12a1NldExvY2FsRGltbWluZ0FNRC1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN3YXBDaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGZhbHNlLCAiVlVJRC12a1NldExvY2FsRGltbWluZ0FNRC1zd2FwQ2hhaW4tcGFyYW1ldGVyIiwgIlZVSUQtdmtTZXRMb2NhbERpbW1pbmdBTUQtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlLCBmYWxzZSwgIlZVSUQtdmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQS1pbnN0YW5jZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBwQWxsb2NhdG9yKTsKKworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVNZXRhbFN1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhULWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVNZXRhbFN1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBwQWxsb2NhdG9yKTsKKworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9vbENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogICAgICAgICAgcFRvb2xQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tYmluYXRpb25Db3VudCwKKyAgICBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogICAgIHBDb21iaW5hdGlvbnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocFN1cmZhY2VJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocFN1cmZhY2VJbmZvLT5zdXJmYWNlLCBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIsIGZhbHNlLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVC1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN3YXBjaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGZhbHNlLCAiVlVJRC12a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVC1zd2FwY2hhaW4tcGFyYW1ldGVyIiwgIlZVSUQtdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtY29tbW9ucGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3Qoc3dhcGNoYWluLCBrVnVsa2FuT2JqZWN0VHlwZVN3YXBjaGFpbktIUiwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBTdXJmYWNlSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBTdXJmYWNlSW5mby0+c3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBmYWxzZSwgIlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zdXJmYWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhULWluc3RhbmNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgQ3JlYXRlT2JqZWN0KCpwU3VyZmFjZSwga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSLCBwQWxsb2NhdG9yKTsKKworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVN0aXBwbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVGYWN0b3IsCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZVBhdHRlcm4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgZmFsc2UsICJWVUlELXZrQ21kU2V0TGluZVN0aXBwbGVFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVJlc2V0UXVlcnlQb29sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChxdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBmYWxzZSwgIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1xdWVyeVBvb2wtcGFyYW1ldGVyIiwgIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1xdWVyeVBvb2wtcGFyZW50Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL29iamVjdF90cmFja2VyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL29iamVjdF90cmFja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4NmQwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvb2JqZWN0X3RyYWNrZXIuaApAQCAtMCwwICsxLDIzNTQgQEAKKy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqCisvLyBTZWUgb2JqZWN0X3RyYWNrZXJfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUluc3RhbmNlKAorICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5zdGFuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUluc3RhbmNlKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lJbnN0YW5jZSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VzKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUNvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqICAgICAgICAgICAgICAgICAgIHBGZWF0dXJlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VDcmVhdGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKiAgICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbnN0YW5jZVByb2NBZGRyKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmFtZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERldmljZVByb2NBZGRyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXZpY2UoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURldmljZSgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXZpY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXZpY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyTmFtZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrTGF5ZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VRdWV1ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUluZGV4LAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXREZXZpY2VRdWV1ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUluZGV4LAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVTdWJtaXQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdENvdW50LAorICAgIGNvbnN0IFZrU3VibWl0SW5mbyogICAgICAgICAgICAgICAgICAgICAgICAgcFN1Ym1pdHMsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlV2FpdElkbGUoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURldmljZVdhaXRJZGxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZEFsbG9jYXRlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKiAgICAgICAgICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXZpY2VNZW1vcnkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRnJlZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0Owordm9pZCBQcmVDYWxsUmVjb3JkRnJlZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVNYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIFZrTWVtb3J5TWFwRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdm9pZCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcERhdGEpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVVbm1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEltYWdlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qICAgICAgICAgICAgICAgICAgICAgcEJpbmRJbmZvLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0Owordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUZlbmNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUmVzZXRGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEZlbmNlU3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVXYWl0Rm9yRmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QWxsLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50KSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95UXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95QnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95QnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXJWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlclZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXJWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95QnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlclZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW1hZ2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UqICAgICAgICAgICAgICAgICAgIHBTdWJyZXNvdXJjZSwKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbWFnZVZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2VWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95SW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95SW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NoYWRlck1vZHVsZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaGFkZXJNb2R1bGUpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NoYWRlck1vZHVsZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaGFkZXJNb2R1bGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2hhZGVyTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyTW9kdWxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2hhZGVyTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyTW9kdWxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVDYWNoZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUNhY2hlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVDYWNoZURhdGEoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVNZXJnZVBpcGVsaW5lQ2FjaGVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0Owordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lTGF5b3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlcikgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVyLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgIHBTZXRMYXlvdXQpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICBwU2V0TGF5b3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclBvb2wpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JQb29sLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZEFsbG9jYXRlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRnJlZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZyYW1lYnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlcikgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRnJhbWVidWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGcmFtZWJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWVidWZmZXIsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RnJhbWVidWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGcmFtZWJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0Owordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95UmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUmVuZGVyUGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtDb21tYW5kUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZFBvb2wpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQ29tbWFuZFBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRQb29sLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKiAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRnJlZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVCZWdpbkNvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogICAgICAgICAgICAgcEJlZ2luSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUmVzZXRDb21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmluZFBpcGVsaW5lKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3cG9ydHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTY2lzc29yKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2lzc29ycykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldExpbmVXaWR0aCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXB0aEJpYXMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDbGFtcCwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hc2spIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJpbmREZXNjcmlwdG9yU2V0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY09mZnNldENvdW50LAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcER5bmFtaWNPZmZzZXRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0luZGV4VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VHlwZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmVydGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQmxpdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLAorICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUJ1ZmZlclRvSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5SW1hZ2VUb0J1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRmlsbEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQ29sb3JJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiAgICAgICAgICAgICAgICAgICAgcENvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckF0dGFjaG1lbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb3VudCwKKyAgICBjb25zdCBWa0NsZWFyQXR0YWNobWVudCogICAgICAgICAgICAgICAgICAgIHBBdHRhY2htZW50cywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RDb3VudCwKKyAgICBjb25zdCBWa0NsZWFyUmVjdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFJlc29sdmVJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFJlc2V0RXZlbnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRXYWl0RXZlbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQsCisgICAgY29uc3QgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRzLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RhZ2VNYXNrLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICBwSW1hZ2VNZW1vcnlCYXJyaWVycykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5RdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFdyaXRlVGltZXN0YW1wKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RhZ2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWROZXh0U3VicGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRXhlY3V0ZUNvbW1hbmRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXZpY2VNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU1hc2spIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEJhc2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVHJpbUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERldmljZVF1ZXVlMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUluZm8sCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUluZm8sCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0Owordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogICBwRXh0ZXJuYWxCdWZmZXJJbmZvLAorICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogICAgICAgICAgICAgIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqICAgICAgICAgICAgICAgcFN1cHBvcnQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0Owordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVN3YXBjaGFpbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW4pIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVN3YXBjaGFpbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW4sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpbkltYWdlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlcykgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0U3dhcGNoYWluSW1hZ2VzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlQ291bnQsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVQcmVzZW50S0hSKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJlc2VudEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqICAgICAgICBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogICAgICAgICAgICBwQWNxdWlyZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VJbmRleCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5Q291bnQsCisgICAgVmtEaXNwbGF5S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheXMpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlDb3VudCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5cywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5TW9kZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWlucywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlWGxpYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmlzdWFsSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxJRCkgY29uc3Q7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVYY2JTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgeGNiX2Nvbm5lY3Rpb25fdCogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgIHhjYl92aXN1YWxpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsX2lkKSBjb25zdDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHN0cnVjdCB3bF9kaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSkgY29uc3Q7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVXaW4zMlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVXaW4zMlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4KSBjb25zdDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXZpY2VNYXNrS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU1hc2spIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVHJpbUNvbW1hbmRQb29sS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKSBjb25zdDsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgY29uc3Q7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcykgY29uc3Q7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsCisgICAgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICBwTWVtb3J5RmRQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykgY29uc3Q7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiAgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbykgY29uc3Q7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSBjb25zdDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpblJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZE5leHRTdWJwYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbywKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEVuZFJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpblN0YXR1c0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykgY29uc3Q7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogICAgICBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIGNvbnN0OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSBjb25zdDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogICAgICAgICAgICAgICBwSW1wb3J0RmVuY2VGZEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckNvdW50LAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJzLAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqICAgICAgICAgcENvdW50ZXJEZXNjcmlwdGlvbnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiAgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVBhc3NlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiAgICAgICAgcEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgVmtTdXJmYWNlRm9ybWF0MktIUiogICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKiAgICAgICAgICAgICAgIHBEaXNwbGF5UGxhbmVJbmZvLAorICAgIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiogICAgICAgICAgICAgcENhcGFiaWxpdGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEltYWdlTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiAgICAgICAgICAgICAgICBwQmluZEluZm9zKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlV2FpdFNlbWFwaG9yZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiogICAgICAgICAgICAgICBwV2FpdEluZm8sCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlU2lnbmFsU2VtYXBob3JlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogICAgICAgICAgICAgcFNpZ25hbEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiogICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXhlY3V0YWJsZUNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogICAgICAgICAgcEV4ZWN1dGFibGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YXRpc3RpY0NvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiAgICAgICAgICAgcFN0YXRpc3RpY3MpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2spIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqICAgICAgICAgICAgICAgICAgIHBDYWxsYmFjaywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0Owordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZURlYnVnUmVwb3J0TWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRGbGFnc0VYVCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29kZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllclByZWZpeCwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXNzYWdlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQqICAgICAgICBwVGFnSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqICAgICAgIHBOYW1lSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERlYnVnTWFya2VyQmVnaW5FWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREZWJ1Z01hcmtlckVuZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREZWJ1Z01hcmtlckluc2VydEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqICAgICAgICAgICBwTWFya2VySW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXplcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFNoYWRlckluZm9BTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0YWdlLAorICAgIFZrU2hhZGVySW5mb1R5cGVBTUQgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mb1NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mbykgY29uc3Q7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCitib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICAgICAgICAgZXh0ZXJuYWxIYW5kbGVUeXBlLAorICAgIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViogICAgICAgICAgcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdDsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5V2luMzJIYW5kbGVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSBjb25zdDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlVmlTdXJmYWNlTk4oCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiAgIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqICAgICAgICAgIHBQcm9jZXNzQ29tbWFuZHNJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiAgcFJlc2VydmVTcGFjZUluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqICAgICAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0KSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqICAgICAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYICAgICAgICAgICAgICAgICBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Cit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggICAgICAgICAgICAgICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrT2JqZWN0VGFibGVOVlgqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdFRhYmxlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKiAgICAgICBwRmVhdHVyZXMsCisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogICAgICAgICBwTGltaXRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiAgICAgICAgICAgICAgICAgcFZpZXdwb3J0V1NjYWxpbmdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUmVsZWFzZURpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpIGNvbnN0OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorYm9vbCBQcmVDYWxsVmFsaWRhdGVBY3F1aXJlWGxpYkRpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpIGNvbnN0OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgUlJPdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByck91dHB1dCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5KSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBSUk91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyT3V0cHV0LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXksCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGlzcGxheVBvd2VyQ29udHJvbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5UG93ZXJJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheVBvd2VySW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgICBwRGV2aWNlRXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgIHBEZXZpY2VFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRSZWdpc3RlckRpc3BsYXlFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRTd2FwY2hhaW5Db3VudGVyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCAgICAgICAgICAgICAgICAgY291bnRlciwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyVmFsdWUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiAgICAgICAgICAgICAgIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsCisgICAgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5ncykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc2NhcmRSZWN0YW5nbGVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlU2V0SGRyTWV0YWRhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zLAorICAgIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhKSBjb25zdDsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCitib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVJT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworYm9vbCBQcmVDYWxsVmFsaWRhdGVTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogICAgICAgIHBOYW1lSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogICAgICAgICBwVGFnSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogICAgICAgICAgICAgICAgICAgcE1lc3NlbmdlcikgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogICAgICAgICAgICAgICAgICAgcE1lc3NlbmdlciwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCAgICAgIG1lc3NhZ2VTZXZlcml0eSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICAgICAgICAgICAgIG1lc3NhZ2VUeXBlcywKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEpIGNvbnN0OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqICAgcFByb3BlcnRpZXMpIGNvbnN0OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogcEluZm8sCisgICAgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlcioqICAgICAgICAgICAgICAgICAgICBwQnVmZmVyKSBjb25zdDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqICAgICAgICAgICAgICAgICBwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgICAgICAgcFZhbGlkYXRpb25DYWNoZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgICAgICAgcFZhbGlkYXRpb25DYWNoZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqICAgICAgICAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WICAgICAgICAgICAgICAgICAgIHNhbXBsZU9yZGVyVHlwZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsCisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIHBCaW5kSW5mb3MpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogICAgICAgIHBJbmZvLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZmZzZXQsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaE9mZnNldCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WICAgICAgICAgICBtb2RlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kVHJhY2VSYXlzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RHcm91cCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsCisgICAgVmtRdWVyeVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXIsCisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqICAgICAgICAgICBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbkNvdW50LAorICAgIFZrVGltZURvbWFpbkVYVCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEb21haW5zKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Q2hlY2twb2ludE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50TWFya2VyKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGFDb3VudCwKKyAgICBWa0NoZWNrcG9pbnREYXRhTlYqICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiAgcEluaXRpYWxpemVJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqICAgICAgICAgcE1hcmtlckluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiAgIHBNYXJrZXJJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqICAgICAgIHBPdmVycmlkZUluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAgICAgICAgICAgICBjb25maWd1cmF0aW9uKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMICAgICAgICAgICAgIHBhcmFtZXRlciwKKyAgICBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCogICAgICAgICAgICAgICAgICAgIHBWYWx1ZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkgY29uc3Q7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0Owordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7Cit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9vbENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogICAgICAgICAgcFRvb2xQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbWJpbmF0aW9uQ291bnQsCisgICAgVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqICAgICBwQ29tYmluYXRpb25zKSBjb25zdDsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlQ291bnQsCisgICAgVmtQcmVzZW50TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKSBjb25zdDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbikgY29uc3Q7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIGNvbnN0OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcykgY29uc3Q7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVN0aXBwbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVGYWN0b3IsCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZVBhdHRlcm4pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVSZXNldFF1ZXJ5UG9vbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50KSBjb25zdDsKKworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUluc3RhbmNlKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcik7Cit2b2lkIFByZUNhbGxSZWNvcmRSZXNldERlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgZmxhZ3MpOwordm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAqcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7Cit2b2lkIFByZUNhbGxSZWNvcmRGcmVlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzKTsKK3ZvaWQgUHJlQ2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvclNldHMpOwordm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSICpwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiAqcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7Cit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgKnBQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpOwordm9pZCBQb3N0Q2FsbFJlY29yZEdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCk7Cit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCk7Cit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgKnBQcm9wZXJ0aWVzLCBWa1Jlc3VsdCByZXN1bHQpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9wYXJhbWV0ZXJfdmFsaWRhdGlvbi5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3BhcmFtZXRlcl92YWxpZGF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWZmMzFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9wYXJhbWV0ZXJfdmFsaWRhdGlvbi5jcHAKQEAgLTAsMCArMSwxMDY3MCBAQAorLyogKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCEgKioqCisgKiBTZWUgcGFyYW1ldGVyX3ZhbGlkYXRpb25fZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBMdW5hckcuY29tPgorICovCisKKworI2luY2x1ZGUgImNoYXNzaXMuaCIKKworI2luY2x1ZGUgInN0YXRlbGVzc192YWxpZGF0aW9uLmgiCisKK2NvbnN0IHVpbnQzMl90IEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24gPSAxMzA7CisKK2NvbnN0IFZrQWNjZXNzRmxhZ3MgQWxsVmtBY2Nlc3NGbGFnQml0cyA9IFZLX0FDQ0VTU19JTkRJUkVDVF9DT01NQU5EX1JFQURfQklUfFZLX0FDQ0VTU19JTkRFWF9SRUFEX0JJVHxWS19BQ0NFU1NfVkVSVEVYX0FUVFJJQlVURV9SRUFEX0JJVHxWS19BQ0NFU1NfVU5JRk9STV9SRUFEX0JJVHxWS19BQ0NFU1NfSU5QVVRfQVRUQUNITUVOVF9SRUFEX0JJVHxWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUfFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUfFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfQklUfFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVHxWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1JFQURfQklUfFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklUfFZLX0FDQ0VTU19UUkFOU0ZFUl9SRUFEX0JJVHxWS19BQ0NFU1NfVFJBTlNGRVJfV1JJVEVfQklUfFZLX0FDQ0VTU19IT1NUX1JFQURfQklUfFZLX0FDQ0VTU19IT1NUX1dSSVRFX0JJVHxWS19BQ0NFU1NfTUVNT1JZX1JFQURfQklUfFZLX0FDQ0VTU19NRU1PUllfV1JJVEVfQklUfFZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfV1JJVEVfQklUX0VYVHxWS19BQ0NFU1NfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfUkVBRF9CSVRfRVhUfFZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9XUklURV9CSVRfRVhUfFZLX0FDQ0VTU19DT05ESVRJT05BTF9SRU5ERVJJTkdfUkVBRF9CSVRfRVhUfFZLX0FDQ0VTU19DT01NQU5EX1BST0NFU1NfUkVBRF9CSVRfTlZYfFZLX0FDQ0VTU19DT01NQU5EX1BST0NFU1NfV1JJVEVfQklUX05WWHxWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9SRUFEX05PTkNPSEVSRU5UX0JJVF9FWFR8VktfQUNDRVNTX1NIQURJTkdfUkFURV9JTUFHRV9SRUFEX0JJVF9OVnxWS19BQ0NFU1NfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9SRUFEX0JJVF9OVnxWS19BQ0NFU1NfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9XUklURV9CSVRfTlZ8VktfQUNDRVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX1JFQURfQklUX0VYVDsKK2NvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ3MgQWxsVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cyA9IFZLX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fTUFZX0FMSUFTX0JJVDsKK2NvbnN0IFZrQnVmZmVyQ3JlYXRlRmxhZ3MgQWxsVmtCdWZmZXJDcmVhdGVGbGFnQml0cyA9IFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUfFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVR8VktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVR8VktfQlVGRkVSX0NSRUFURV9QUk9URUNURURfQklUfFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0VYVHxWS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFI7Citjb25zdCBWa0J1ZmZlclVzYWdlRmxhZ3MgQWxsVmtCdWZmZXJVc2FnZUZsYWdCaXRzID0gVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVR8VktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVR8VktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVHxWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUfFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVR8VktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfQlVGRkVSX0JJVHxWS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVHxWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVR8VktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVR8VktfQlVGRkVSX1VTQUdFX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklUX0VYVHxWS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfQlVGRkVSX0JJVF9FWFR8VktfQlVGRkVSX1VTQUdFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CSVRfRVhUfFZLX0JVRkZFUl9VU0FHRV9SQVlfVFJBQ0lOR19CSVRfTlZ8VktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfRVhUfFZLX0JVRkZFUl9VU0FHRV9TSEFERVJfREVWSUNFX0FERFJFU1NfQklUX0tIUjsKK2NvbnN0IFZrQ29sb3JDb21wb25lbnRGbGFncyBBbGxWa0NvbG9yQ29tcG9uZW50RmxhZ0JpdHMgPSBWS19DT0xPUl9DT01QT05FTlRfUl9CSVR8VktfQ09MT1JfQ09NUE9ORU5UX0dfQklUfFZLX0NPTE9SX0NPTVBPTkVOVF9CX0JJVHxWS19DT0xPUl9DT01QT05FTlRfQV9CSVQ7Citjb25zdCBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIEFsbFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHMgPSBWS19DT01NQU5EX0JVRkZFUl9SRVNFVF9SRUxFQVNFX1JFU09VUkNFU19CSVQ7Citjb25zdCBWa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdzIEFsbFZrQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHMgPSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUfFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVHxWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVDsKK2NvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVGbGFncyBBbGxWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1RSQU5TSUVOVF9CSVR8VktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVR8VktfQ09NTUFORF9QT09MX0NSRUFURV9QUk9URUNURURfQklUOworY29uc3QgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgQWxsVmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMgPSBWS19DT01NQU5EX1BPT0xfUkVTRVRfUkVMRUFTRV9SRVNPVVJDRVNfQklUOworY29uc3QgVmtDdWxsTW9kZUZsYWdzIEFsbFZrQ3VsbE1vZGVGbGFnQml0cyA9IFZLX0NVTExfTU9ERV9OT05FfFZLX0NVTExfTU9ERV9GUk9OVF9CSVR8VktfQ1VMTF9NT0RFX0JBQ0tfQklUfFZLX0NVTExfTU9ERV9GUk9OVF9BTkRfQkFDSzsKK2NvbnN0IFZrRGVwZW5kZW5jeUZsYWdzIEFsbFZrRGVwZW5kZW5jeUZsYWdCaXRzID0gVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUfFZLX0RFUEVOREVOQ1lfREVWSUNFX0dST1VQX0JJVHxWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUfFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVRfS0hSfFZLX0RFUEVOREVOQ1lfREVWSUNFX0dST1VQX0JJVF9LSFI7Citjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ3MgQWxsVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzID0gVktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9GUkVFX0RFU0NSSVBUT1JfU0VUX0JJVHxWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQ7Citjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFncyBBbGxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cyA9IFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFJ8VktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQ7Citjb25zdCBWa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ3MgQWxsVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzID0gVktfREVWSUNFX1FVRVVFX0NSRUFURV9QUk9URUNURURfQklUOworY29uc3QgVmtGZW5jZUNyZWF0ZUZsYWdzIEFsbFZrRmVuY2VDcmVhdGVGbGFnQml0cyA9IFZLX0ZFTkNFX0NSRUFURV9TSUdOQUxFRF9CSVQ7Citjb25zdCBWa0Zvcm1hdEZlYXR1cmVGbGFncyBBbGxWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUfFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklUfFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVHxWS19GT1JNQVRfRkVBVFVSRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVR8VktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUfFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0FUT01JQ19CSVR8VktfRk9STUFUX0ZFQVRVUkVfVkVSVEVYX0JVRkZFUl9CSVR8VktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVR8VktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CTEVORF9CSVR8VktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVHxWS19GT1JNQVRfRkVBVFVSRV9CTElUX1NSQ19CSVR8VktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUfFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVR8VktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVHxWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUfFZLX0ZPUk1BVF9GRUFUVVJFX01JRFBPSU5UX0NIUk9NQV9TQU1QTEVTX0JJVHxWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fTElORUFSX0ZJTFRFUl9CSVR8VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX1NFUEFSQVRFX1JFQ09OU1RSVUNUSU9OX0ZJTFRFUl9CSVR8VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9CSVR8VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9GT1JDRUFCTEVfQklUfFZLX0ZPUk1BVF9GRUFUVVJFX0RJU0pPSU5UX0JJVHxWS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVHxWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfSU1HfFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVRfS0hSfFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVRfS0hSfFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX01JTk1BWF9CSVRfRVhUfFZLX0ZPUk1BVF9GRUFUVVJFX01JRFBPSU5UX0NIUk9NQV9TQU1QTEVTX0JJVF9LSFJ8VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0xJTkVBUl9GSUxURVJfQklUX0tIUnxWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVF9LSFJ8VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9CSVRfS0hSfFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfRk9SQ0VBQkxFX0JJVF9LSFJ8VktfRk9STUFUX0ZFQVRVUkVfRElTSk9JTlRfQklUX0tIUnxWS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVF9LSFJ8VktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVHxWS19GT1JNQVRfRkVBVFVSRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUOworY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzIEFsbFZrRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cyA9IFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjsKK2NvbnN0IFZrSW1hZ2VBc3BlY3RGbGFncyBBbGxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUfFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVR8VktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUfFZLX0lNQUdFX0FTUEVDVF9NRVRBREFUQV9CSVR8VktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUfFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVHxWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVR8VktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUnxWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVRfS0hSfFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVF9LSFJ8VktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8wX0JJVF9FWFR8VktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8xX0JJVF9FWFR8VktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8yX0JJVF9FWFR8VktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8zX0JJVF9FWFQ7Citjb25zdCBWa0ltYWdlQ3JlYXRlRmxhZ3MgQWxsVmtJbWFnZUNyZWF0ZUZsYWdCaXRzID0gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVHxWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVR8VktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVHxWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUfFZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklUfFZLX0lNQUdFX0NSRUFURV9BTElBU19CSVR8VktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVR8VktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUfFZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklUfFZLX0lNQUdFX0NSRUFURV9FWFRFTkRFRF9VU0FHRV9CSVR8VktfSU1BR0VfQ1JFQVRFX1BST1RFQ1RFRF9CSVR8VktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVHxWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WfFZLX0lNQUdFX0NSRUFURV9TUExJVF9JTlNUQU5DRV9CSU5EX1JFR0lPTlNfQklUX0tIUnxWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSfFZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklUX0tIUnxWS19JTUFHRV9DUkVBVEVfRVhURU5ERURfVVNBR0VfQklUX0tIUnxWS19JTUFHRV9DUkVBVEVfU0FNUExFX0xPQ0FUSU9OU19DT01QQVRJQkxFX0RFUFRIX0JJVF9FWFR8VktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVF9LSFJ8VktfSU1BR0VfQ1JFQVRFX0FMSUFTX0JJVF9LSFJ8VktfSU1BR0VfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVDsKK2NvbnN0IFZrSW1hZ2VVc2FnZUZsYWdzIEFsbFZrSW1hZ2VVc2FnZUZsYWdCaXRzID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVHxWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUfFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUfFZLX0lNQUdFX1VTQUdFX1NUT1JBR0VfQklUfFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUfFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVR8VktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUfFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUfFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlZ8VktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVDsKK2NvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ3MgQWxsVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cyA9IFZLX0lNQUdFX1ZJRVdfQ1JFQVRFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0RZTkFNSUNfQklUX0VYVDsKK2NvbnN0IFZrTWVtb3J5SGVhcEZsYWdzIEFsbFZrTWVtb3J5SGVhcEZsYWdCaXRzID0gVktfTUVNT1JZX0hFQVBfREVWSUNFX0xPQ0FMX0JJVHxWS19NRU1PUllfSEVBUF9NVUxUSV9JTlNUQU5DRV9CSVR8VktfTUVNT1JZX0hFQVBfTVVMVElfSU5TVEFOQ0VfQklUX0tIUjsKK2NvbnN0IFZrTWVtb3J5UHJvcGVydHlGbGFncyBBbGxWa01lbW9yeVByb3BlcnR5RmxhZ0JpdHMgPSBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVHxWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVHxWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVR8VktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ0FDSEVEX0JJVHxWS19NRU1PUllfUFJPUEVSVFlfTEFaSUxZX0FMTE9DQVRFRF9CSVR8VktfTUVNT1JZX1BST1BFUlRZX1BST1RFQ1RFRF9CSVR8VktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9DT0hFUkVOVF9CSVRfQU1EfFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfVU5DQUNIRURfQklUX0FNRDsKK2NvbnN0IFZrUGlwZWxpbmVDcmVhdGVGbGFncyBBbGxWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMgPSBWS19QSVBFTElORV9DUkVBVEVfRElTQUJMRV9PUFRJTUlaQVRJT05fQklUfFZLX1BJUEVMSU5FX0NSRUFURV9BTExPV19ERVJJVkFUSVZFU19CSVR8VktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUfFZLX1BJUEVMSU5FX0NSRUFURV9WSUVXX0lOREVYX0ZST01fREVWSUNFX0lOREVYX0JJVHxWS19QSVBFTElORV9DUkVBVEVfRElTUEFUQ0hfQkFTRV9CSVR8VktfUElQRUxJTkVfQ1JFQVRFX0RJU1BBVENIX0JBU0V8VktfUElQRUxJTkVfQ1JFQVRFX1ZJRVdfSU5ERVhfRlJPTV9ERVZJQ0VfSU5ERVhfQklUX0tIUnxWS19QSVBFTElORV9DUkVBVEVfRElTUEFUQ0hfQkFTRV9LSFJ8VktfUElQRUxJTkVfQ1JFQVRFX0RFRkVSX0NPTVBJTEVfQklUX05WfFZLX1BJUEVMSU5FX0NSRUFURV9DQVBUVVJFX1NUQVRJU1RJQ1NfQklUX0tIUnxWS19QSVBFTElORV9DUkVBVEVfQ0FQVFVSRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTlNfQklUX0tIUjsKK2NvbnN0IFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdzIEFsbFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzID0gVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9BTExPV19WQVJZSU5HX1NVQkdST1VQX1NJWkVfQklUX0VYVHxWS19QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX1JFUVVJUkVfRlVMTF9TVUJHUk9VUFNfQklUX0VYVDsKK2NvbnN0IFZrUGlwZWxpbmVTdGFnZUZsYWdzIEFsbFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzID0gVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklUfFZLX1BJUEVMSU5FX1NUQUdFX0RSQVdfSU5ESVJFQ1RfQklUfFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9JTlBVVF9CSVR8VktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVR8VktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVHxWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUfFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVR8VktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVHxWS19QSVBFTElORV9TVEFHRV9FQVJMWV9GUkFHTUVOVF9URVNUU19CSVR8VktfUElQRUxJTkVfU1RBR0VfTEFURV9GUkFHTUVOVF9URVNUU19CSVR8VktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklUfFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVHxWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZFUl9CSVR8VktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklUfFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUfFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9HUkFQSElDU19CSVR8VktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVHxWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQklUX0VYVHxWS19QSVBFTElORV9TVEFHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVHxWS19QSVBFTElORV9TVEFHRV9DT01NQU5EX1BST0NFU1NfQklUX05WWHxWS19QSVBFTElORV9TVEFHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WfFZLX1BJUEVMSU5FX1NUQUdFX1JBWV9UUkFDSU5HX1NIQURFUl9CSVRfTlZ8VktfUElQRUxJTkVfU1RBR0VfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9CVUlMRF9CSVRfTlZ8VktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WfFZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OVnxWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9ERU5TSVRZX1BST0NFU1NfQklUX0VYVDsKK2NvbnN0IFZrUXVlcnlDb250cm9sRmxhZ3MgQWxsVmtRdWVyeUNvbnRyb2xGbGFnQml0cyA9IFZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQ7Citjb25zdCBWa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFncyBBbGxWa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cyA9IFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19JTlBVVF9BU1NFTUJMWV9WRVJUSUNFU19CSVR8VktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0lOUFVUX0FTU0VNQkxZX1BSSU1JVElWRVNfQklUfFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19WRVJURVhfU0hBREVSX0lOVk9DQVRJT05TX0JJVHxWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfR0VPTUVUUllfU0hBREVSX0lOVk9DQVRJT05TX0JJVHxWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfR0VPTUVUUllfU0hBREVSX1BSSU1JVElWRVNfQklUfFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19DTElQUElOR19JTlZPQ0FUSU9OU19CSVR8VktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NMSVBQSU5HX1BSSU1JVElWRVNfQklUfFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19GUkFHTUVOVF9TSEFERVJfSU5WT0NBVElPTlNfQklUfFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfUEFUQ0hFU19CSVR8VktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9JTlZPQ0FUSU9OU19CSVR8VktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NPTVBVVEVfU0hBREVSX0lOVk9DQVRJT05TX0JJVDsKK2NvbnN0IFZrUXVlcnlSZXN1bHRGbGFncyBBbGxWa1F1ZXJ5UmVzdWx0RmxhZ0JpdHMgPSBWS19RVUVSWV9SRVNVTFRfNjRfQklUfFZLX1FVRVJZX1JFU1VMVF9XQUlUX0JJVHxWS19RVUVSWV9SRVNVTFRfV0lUSF9BVkFJTEFCSUxJVFlfQklUfFZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVDsKK2NvbnN0IFZrUXVldWVGbGFncyBBbGxWa1F1ZXVlRmxhZ0JpdHMgPSBWS19RVUVVRV9HUkFQSElDU19CSVR8VktfUVVFVUVfQ09NUFVURV9CSVR8VktfUVVFVUVfVFJBTlNGRVJfQklUfFZLX1FVRVVFX1NQQVJTRV9CSU5ESU5HX0JJVHxWS19RVUVVRV9QUk9URUNURURfQklUOworY29uc3QgVmtTYW1wbGVDb3VudEZsYWdzIEFsbFZrU2FtcGxlQ291bnRGbGFnQml0cyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVHxWS19TQU1QTEVfQ09VTlRfMl9CSVR8VktfU0FNUExFX0NPVU5UXzRfQklUfFZLX1NBTVBMRV9DT1VOVF84X0JJVHxWS19TQU1QTEVfQ09VTlRfMTZfQklUfFZLX1NBTVBMRV9DT1VOVF8zMl9CSVR8VktfU0FNUExFX0NPVU5UXzY0X0JJVDsKK2NvbnN0IFZrU2FtcGxlckNyZWF0ZUZsYWdzIEFsbFZrU2FtcGxlckNyZWF0ZUZsYWdCaXRzID0gVktfU0FNUExFUl9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUfFZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQ09BUlNFX1JFQ09OU1RSVUNUSU9OX0JJVF9FWFQ7Citjb25zdCBWa1NoYWRlclN0YWdlRmxhZ3MgQWxsVmtTaGFkZXJTdGFnZUZsYWdCaXRzID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVR8VktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVHxWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUfFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVR8VktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVHxWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVR8VktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDU3xWS19TSEFERVJfU1RBR0VfQUxMfFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WfFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OVnxWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WfFZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OVnxWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OVnxWS19TSEFERVJfU1RBR0VfQ0FMTEFCTEVfQklUX05WfFZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OVnxWS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlY7Citjb25zdCBWa1NwYXJzZUltYWdlRm9ybWF0RmxhZ3MgQWxsVmtTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzID0gVktfU1BBUlNFX0lNQUdFX0ZPUk1BVF9TSU5HTEVfTUlQVEFJTF9CSVR8VktfU1BBUlNFX0lNQUdFX0ZPUk1BVF9BTElHTkVEX01JUF9TSVpFX0JJVHxWS19TUEFSU0VfSU1BR0VfRk9STUFUX05PTlNUQU5EQVJEX0JMT0NLX1NJWkVfQklUOworY29uc3QgVmtTcGFyc2VNZW1vcnlCaW5kRmxhZ3MgQWxsVmtTcGFyc2VNZW1vcnlCaW5kRmxhZ0JpdHMgPSBWS19TUEFSU0VfTUVNT1JZX0JJTkRfTUVUQURBVEFfQklUOworY29uc3QgVmtTdGVuY2lsRmFjZUZsYWdzIEFsbFZrU3RlbmNpbEZhY2VGbGFnQml0cyA9IFZLX1NURU5DSUxfRkFDRV9GUk9OVF9CSVR8VktfU1RFTkNJTF9GQUNFX0JBQ0tfQklUfFZLX1NURU5DSUxfRkFDRV9GUk9OVF9BTkRfQkFDS3xWS19TVEVOQ0lMX0ZST05UX0FORF9CQUNLOworY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFncyBBbGxWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzID0gVktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19BVFRSSUJVVEVTX0JJVF9OVlh8VktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19QT1NJVElPTl9YX09OTFlfQklUX05WWDsKK2NvbnN0IFZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncyBBbGxWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMgPSBWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUfFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9LSFJ8VktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVF9LSFI7Citjb25zdCBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgQWxsVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVHxWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUfFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUfFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUfFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVRfS0hSfFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfS0hSfFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUnxWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVF9LSFI7Citjb25zdCBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzIEFsbFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHMgPSBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfREVESUNBVEVEX09OTFlfQklUX0tIUnxWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9LSFJ8VktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfS0hSOworY29uc3QgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0JJVHxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9LTVRfQklUfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVHxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfUkVTT1VSQ0VfQklUfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUnxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFJ8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUnxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVRfS0hSfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVRfS0hSfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVF9LSFJ8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVF9LSFJ8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0RNQV9CVUZfQklUX0VYVHxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUR8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfQUxMT0NBVElPTl9CSVRfRVhUfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX01BUFBFRF9GT1JFSUdOX01FTU9SWV9CSVRfRVhUOworY29uc3QgVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFncyBBbGxWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVRfS0hSfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX0tIUjsKK2NvbnN0IFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MgQWxsVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVHxWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfRDNEMTJfRkVOQ0VfQklUfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVHxWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVF9LSFJ8VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfS0hSfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVF9LSFJ8VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX0QzRDEyX0ZFTkNFX0JJVF9LSFJ8VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUX0tIUjsKK2NvbnN0IFZrRmVuY2VJbXBvcnRGbGFncyBBbGxWa0ZlbmNlSW1wb3J0RmxhZ0JpdHMgPSBWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVHxWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVF9LSFI7Citjb25zdCBWa01lbW9yeUFsbG9jYXRlRmxhZ3MgQWxsVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzID0gVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9NQVNLX0JJVHxWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUX0tIUnxWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUnxWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUjsKK2NvbnN0IFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyBBbGxWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHMgPSBWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfU1JDX0JJVHxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfRFNUX0JJVHxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfU1JDX0JJVHxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfRFNUX0JJVHxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfU1JDX0JJVF9LSFJ8VktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX0RTVF9CSVRfS0hSfFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklUX0tIUnxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfRFNUX0JJVF9LSFI7Citjb25zdCBWa1NlbWFwaG9yZUltcG9ydEZsYWdzIEFsbFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMgPSBWS19TRU1BUEhPUkVfSU1QT1JUX1RFTVBPUkFSWV9CSVR8VktfU0VNQVBIT1JFX0lNUE9SVF9URU1QT1JBUllfQklUX0tIUjsKK2NvbnN0IFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ3MgQWxsVmtTdWJncm91cEZlYXR1cmVGbGFnQml0cyA9IFZLX1NVQkdST1VQX0ZFQVRVUkVfQkFTSUNfQklUfFZLX1NVQkdST1VQX0ZFQVRVUkVfVk9URV9CSVR8VktfU1VCR1JPVVBfRkVBVFVSRV9BUklUSE1FVElDX0JJVHxWS19TVUJHUk9VUF9GRUFUVVJFX0JBTExPVF9CSVR8VktfU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX0JJVHxWS19TVUJHUk9VUF9GRUFUVVJFX1NIVUZGTEVfUkVMQVRJVkVfQklUfFZLX1NVQkdST1VQX0ZFQVRVUkVfQ0xVU1RFUkVEX0JJVHxWS19TVUJHUk9VUF9GRUFUVVJFX1FVQURfQklUfFZLX1NVQkdST1VQX0ZFQVRVUkVfUEFSVElUSU9ORURfQklUX05WOworY29uc3QgVmtDb21wb3NpdGVBbHBoYUZsYWdzS0hSIEFsbFZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUiA9IFZLX0NPTVBPU0lURV9BTFBIQV9PUEFRVUVfQklUX0tIUnxWS19DT01QT1NJVEVfQUxQSEFfUFJFX01VTFRJUExJRURfQklUX0tIUnxWS19DT01QT1NJVEVfQUxQSEFfUE9TVF9NVUxUSVBMSUVEX0JJVF9LSFJ8VktfQ09NUE9TSVRFX0FMUEhBX0lOSEVSSVRfQklUX0tIUjsKK2NvbnN0IFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSIEFsbFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSID0gVktfU1VSRkFDRV9UUkFOU0ZPUk1fSURFTlRJVFlfQklUX0tIUnxWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfOTBfQklUX0tIUnxWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfMTgwX0JJVF9LSFJ8VktfU1VSRkFDRV9UUkFOU0ZPUk1fUk9UQVRFXzI3MF9CSVRfS0hSfFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX0JJVF9LSFJ8VktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzkwX0JJVF9LSFJ8VktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzE4MF9CSVRfS0hSfFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8yNzBfQklUX0tIUnxWS19TVVJGQUNFX1RSQU5TRk9STV9JTkhFUklUX0JJVF9LSFI7Citjb25zdCBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiBBbGxWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiA9IFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfTE9DQUxfQklUX0tIUnxWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX1JFTU9URV9CSVRfS0hSfFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfU1VNX0JJVF9LSFJ8VktfREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9MT0NBTF9NVUxUSV9ERVZJQ0VfQklUX0tIUjsKK2NvbnN0IFZrU3dhcGNoYWluQ3JlYXRlRmxhZ3NLSFIgQWxsVmtTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUiA9IFZLX1NXQVBDSEFJTl9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVF9LSFJ8VktfU1dBUENIQUlOX0NSRUFURV9QUk9URUNURURfQklUX0tIUnxWS19TV0FQQ0hBSU5fQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVRfS0hSfFZLX1NXQVBDSEFJTl9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUX0tIUjsKK2NvbnN0IFZrRGlzcGxheVBsYW5lQWxwaGFGbGFnc0tIUiBBbGxWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgPSBWS19ESVNQTEFZX1BMQU5FX0FMUEhBX09QQVFVRV9CSVRfS0hSfFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfR0xPQkFMX0JJVF9LSFJ8VktfRElTUExBWV9QTEFORV9BTFBIQV9QRVJfUElYRUxfQklUX0tIUnxWS19ESVNQTEFZX1BMQU5FX0FMUEhBX1BFUl9QSVhFTF9QUkVNVUxUSVBMSUVEX0JJVF9LSFI7Citjb25zdCBWa01lbW9yeUFsbG9jYXRlRmxhZ3NLSFIgQWxsVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzS0hSID0gVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9NQVNLX0JJVHxWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUX0tIUnxWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUnxWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUjsKK2NvbnN0IFZrUGVlck1lbW9yeUZlYXR1cmVGbGFnc0tIUiBBbGxWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFIgPSBWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfU1JDX0JJVHxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfRFNUX0JJVHxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfU1JDX0JJVHxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfRFNUX0JJVHxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfU1JDX0JJVF9LSFJ8VktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX0RTVF9CSVRfS0hSfFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklUX0tIUnxWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfRFNUX0JJVF9LSFI7Citjb25zdCBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzS0hSIEFsbFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFIgPSBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfREVESUNBVEVEX09OTFlfQklUX0tIUnxWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9LSFJ8VktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfS0hSOworY29uc3QgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc0tIUiBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzS0hSID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVR8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0JJVHxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9LTVRfQklUfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVHxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfUkVTT1VSQ0VfQklUfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUnxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFJ8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUnxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVRfS0hSfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVRfS0hSfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVF9LSFJ8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVF9LSFJ8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0RNQV9CVUZfQklUX0VYVHxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUR8VktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfQUxMT0NBVElPTl9CSVRfRVhUfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX01BUFBFRF9GT1JFSUdOX01FTU9SWV9CSVRfRVhUOworY29uc3QgVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnc0tIUiBBbGxWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzS0hSID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVRfS0hSfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX0tIUjsKK2NvbnN0IFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3NLSFIgQWxsVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0c0tIUiA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVHxWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfRDNEMTJfRkVOQ0VfQklUfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVHxWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVF9LSFJ8VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfS0hSfFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVF9LSFJ8VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX0QzRDEyX0ZFTkNFX0JJVF9LSFJ8VktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUX0tIUjsKK2NvbnN0IFZrU2VtYXBob3JlSW1wb3J0RmxhZ3NLSFIgQWxsVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0c0tIUiA9IFZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVHxWS19TRU1BUEhPUkVfSU1QT1JUX1RFTVBPUkFSWV9CSVRfS0hSOworY29uc3QgVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzS0hSIEFsbFZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0c0tIUiA9IFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVR8VktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVHxWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX0tIUnxWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX0tIUjsKK2NvbnN0IFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnc0tIUiBBbGxWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFIgPSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUfFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVR8VktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVR8VktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfU1lOQ19GRF9CSVR8VktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVF9LSFJ8VktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFJ8VktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfS0hSfFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUX0tIUjsKK2NvbnN0IFZrRmVuY2VJbXBvcnRGbGFnc0tIUiBBbGxWa0ZlbmNlSW1wb3J0RmxhZ0JpdHNLSFIgPSBWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVHxWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVF9LSFI7Citjb25zdCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ3NLSFIgQWxsVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSID0gVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9QRVJGT1JNQU5DRV9JTVBBQ1RJTkdfS0hSfFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fQ09OQ1VSUkVOVExZX0lNUEFDVEVEX0tIUjsKK2NvbnN0IFZrUmVzb2x2ZU1vZGVGbGFnc0tIUiBBbGxWa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFIgPSBWS19SRVNPTFZFX01PREVfTk9ORV9LSFJ8VktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFJ8VktfUkVTT0xWRV9NT0RFX0FWRVJBR0VfQklUX0tIUnxWS19SRVNPTFZFX01PREVfTUlOX0JJVF9LSFJ8VktfUkVTT0xWRV9NT0RFX01BWF9CSVRfS0hSOworY29uc3QgVmtTZW1hcGhvcmVXYWl0RmxhZ3NLSFIgQWxsVmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIgPSBWS19TRU1BUEhPUkVfV0FJVF9BTllfQklUX0tIUjsKK2NvbnN0IFZrRGVidWdSZXBvcnRGbGFnc0VYVCBBbGxWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQgPSBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVHxWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUfFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFR8VktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFR8VktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQ7Citjb25zdCBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzTlYgQWxsVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WID0gVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfREVESUNBVEVEX09OTFlfQklUX05WfFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX05WfFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX05WOworY29uc3QgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIEFsbFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViA9IFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUX05WfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVF9OVnxWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfSU1BR0VfQklUX05WfFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9JTUFHRV9LTVRfQklUX05WOworY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdzRVhUIEFsbFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVCA9IFZLX0NPTkRJVElPTkFMX1JFTkRFUklOR19JTlZFUlRFRF9CSVRfRVhUOworY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnc05WWCBBbGxWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYID0gVktfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX1VTQUdFX1VOT1JERVJFRF9TRVFVRU5DRVNfQklUX05WWHxWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfU1BBUlNFX1NFUVVFTkNFU19CSVRfTlZYfFZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9FTVBUWV9FWEVDVVRJT05TX0JJVF9OVlh8VktfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX1VTQUdFX0lOREVYRURfU0VRVUVOQ0VTX0JJVF9OVlg7Citjb25zdCBWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCBBbGxWa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWCA9IFZLX09CSkVDVF9FTlRSWV9VU0FHRV9HUkFQSElDU19CSVRfTlZYfFZLX09CSkVDVF9FTlRSWV9VU0FHRV9DT01QVVRFX0JJVF9OVlg7Citjb25zdCBWa1N1cmZhY2VDb3VudGVyRmxhZ3NFWFQgQWxsVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUID0gVktfU1VSRkFDRV9DT1VOVEVSX1ZCTEFOS19FWFQ7Citjb25zdCBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCBBbGxWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfVkVSQk9TRV9CSVRfRVhUfFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUfFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUfFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVDsKK2NvbnN0IFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgQWxsVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9HRU5FUkFMX0JJVF9FWFR8VktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1ZBTElEQVRJT05fQklUX0VYVHxWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfUEVSRk9STUFOQ0VfQklUX0VYVDsKK2NvbnN0IFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCBBbGxWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQgPSBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVHxWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX1VOVVNFRF9XSElMRV9QRU5ESU5HX0JJVF9FWFR8VktfREVTQ1JJUFRPUl9CSU5ESU5HX1BBUlRJQUxMWV9CT1VORF9CSVRfRVhUfFZLX0RFU0NSSVBUT1JfQklORElOR19WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0JJVF9FWFQ7Citjb25zdCBWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOViBBbGxWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViA9IFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfVVBEQVRFX0JJVF9OVnxWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX0NPTVBBQ1RJT05fQklUX05WfFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUFJFRkVSX0ZBU1RfVFJBQ0VfQklUX05WfFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUFJFRkVSX0ZBU1RfQlVJTERfQklUX05WfFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTE9XX01FTU9SWV9CSVRfTlY7Citjb25zdCBWa0dlb21ldHJ5RmxhZ3NOViBBbGxWa0dlb21ldHJ5RmxhZ0JpdHNOViA9IFZLX0dFT01FVFJZX09QQVFVRV9CSVRfTlZ8VktfR0VPTUVUUllfTk9fRFVQTElDQVRFX0FOWV9ISVRfSU5WT0NBVElPTl9CSVRfTlY7Citjb25zdCBWa0dlb21ldHJ5SW5zdGFuY2VGbGFnc05WIEFsbFZrR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlYgPSBWS19HRU9NRVRSWV9JTlNUQU5DRV9UUklBTkdMRV9DVUxMX0RJU0FCTEVfQklUX05WfFZLX0dFT01FVFJZX0lOU1RBTkNFX1RSSUFOR0xFX0ZST05UX0NPVU5URVJDTE9DS1dJU0VfQklUX05WfFZLX0dFT01FVFJZX0lOU1RBTkNFX0ZPUkNFX09QQVFVRV9CSVRfTlZ8VktfR0VPTUVUUllfSU5TVEFOQ0VfRk9SQ0VfTk9fT1BBUVVFX0JJVF9OVjsKK2NvbnN0IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ3NFWFQgQWxsVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVCA9IFZLX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX1ZBTElEX0JJVF9FWFR8VktfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQVBQTElDQVRJT05fUElQRUxJTkVfQ0FDSEVfSElUX0JJVF9FWFR8VktfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQkFTRV9QSVBFTElORV9BQ0NFTEVSQVRJT05fQklUX0VYVDsKK2NvbnN0IFZrVG9vbFB1cnBvc2VGbGFnc0VYVCBBbGxWa1Rvb2xQdXJwb3NlRmxhZ0JpdHNFWFQgPSBWS19UT09MX1BVUlBPU0VfVkFMSURBVElPTl9CSVRfRVhUfFZLX1RPT0xfUFVSUE9TRV9QUk9GSUxJTkdfQklUX0VYVHxWS19UT09MX1BVUlBPU0VfVFJBQ0lOR19CSVRfRVhUfFZLX1RPT0xfUFVSUE9TRV9BRERJVElPTkFMX0ZFQVRVUkVTX0JJVF9FWFR8VktfVE9PTF9QVVJQT1NFX01PRElGWUlOR19GRUFUVVJFU19CSVRfRVhUfFZLX1RPT0xfUFVSUE9TRV9ERUJVR19SRVBPUlRJTkdfQklUX0VYVHxWS19UT09MX1BVUlBPU0VfREVCVUdfTUFSS0VSU19CSVRfRVhUfFZLX1RPT0xfUFVSUE9TRV9ERUJVR19SRVBPUlRJTkdfQklUX0VYVHxWS19UT09MX1BVUlBPU0VfREVCVUdfTUFSS0VSU19CSVRfRVhUOworCitjb25zdCBzdGQ6OnZlY3RvcjxWa1BpcGVsaW5lQ2FjaGVIZWFkZXJWZXJzaW9uPiBBbGxWa1BpcGVsaW5lQ2FjaGVIZWFkZXJWZXJzaW9uRW51bXMgPSB7VktfUElQRUxJTkVfQ0FDSEVfSEVBREVSX1ZFUlNJT05fT05FLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtSZXN1bHQ+IEFsbFZrUmVzdWx0RW51bXMgPSB7VktfU1VDQ0VTUywgVktfTk9UX1JFQURZLCBWS19USU1FT1VULCBWS19FVkVOVF9TRVQsIFZLX0VWRU5UX1JFU0VULCBWS19JTkNPTVBMRVRFLCBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlksIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZLCBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQsIFZLX0VSUk9SX0RFVklDRV9MT1NULCBWS19FUlJPUl9NRU1PUllfTUFQX0ZBSUxFRCwgVktfRVJST1JfTEFZRVJfTk9UX1BSRVNFTlQsIFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVCwgVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVCwgVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUiwgVktfRVJST1JfVE9PX01BTllfT0JKRUNUUywgVktfRVJST1JfRk9STUFUX05PVF9TVVBQT1JURUQsIFZLX0VSUk9SX0ZSQUdNRU5URURfUE9PTCwgVktfRVJST1JfT1VUX09GX1BPT0xfTUVNT1JZLCBWS19FUlJPUl9JTlZBTElEX0VYVEVSTkFMX0hBTkRMRSwgVktfRVJST1JfU1VSRkFDRV9MT1NUX0tIUiwgVktfRVJST1JfTkFUSVZFX1dJTkRPV19JTl9VU0VfS0hSLCBWS19TVUJPUFRJTUFMX0tIUiwgVktfRVJST1JfT1VUX09GX0RBVEVfS0hSLCBWS19FUlJPUl9JTkNPTVBBVElCTEVfRElTUExBWV9LSFIsIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVCwgVktfRVJST1JfSU5WQUxJRF9TSEFERVJfTlYsIFZLX0VSUk9SX09VVF9PRl9QT09MX01FTU9SWV9LSFIsIFZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFX0tIUiwgVktfRVJST1JfSU5WQUxJRF9EUk1fRk9STUFUX01PRElGSUVSX1BMQU5FX0xBWU9VVF9FWFQsIFZLX0VSUk9SX0ZSQUdNRU5UQVRJT05fRVhULCBWS19FUlJPUl9OT1RfUEVSTUlUVEVEX0VYVCwgVktfRVJST1JfSU5WQUxJRF9ERVZJQ0VfQUREUkVTU19FWFQsIFZLX0VSUk9SX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9NT0RFX0xPU1RfRVhULCBWS19FUlJPUl9JTlZBTElEX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfS0hSLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGU+IEFsbFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlRW51bXMgPSB7VktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNULCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DQUNIRSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfREVWSUNFLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrSW50ZXJuYWxBbGxvY2F0aW9uVHlwZT4gQWxsVmtJbnRlcm5hbEFsbG9jYXRpb25UeXBlRW51bXMgPSB7VktfSU5URVJOQUxfQUxMT0NBVElPTl9UWVBFX0VYRUNVVEFCTEUsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0Zvcm1hdD4gQWxsVmtGb3JtYXRFbnVtcyA9IHtWS19GT1JNQVRfVU5ERUZJTkVELCBWS19GT1JNQVRfUjRHNF9VTk9STV9QQUNLOCwgVktfRk9STUFUX1I0RzRCNEE0X1VOT1JNX1BBQ0sxNiwgVktfRk9STUFUX0I0RzRSNEE0X1VOT1JNX1BBQ0sxNiwgVktfRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTYsIFZLX0ZPUk1BVF9CNUc2UjVfVU5PUk1fUEFDSzE2LCBWS19GT1JNQVRfUjVHNUI1QTFfVU5PUk1fUEFDSzE2LCBWS19GT1JNQVRfQjVHNVI1QTFfVU5PUk1fUEFDSzE2LCBWS19GT1JNQVRfQTFSNUc1QjVfVU5PUk1fUEFDSzE2LCBWS19GT1JNQVRfUjhfVU5PUk0sIFZLX0ZPUk1BVF9SOF9TTk9STSwgVktfRk9STUFUX1I4X1VTQ0FMRUQsIFZLX0ZPUk1BVF9SOF9TU0NBTEVELCBWS19GT1JNQVRfUjhfVUlOVCwgVktfRk9STUFUX1I4X1NJTlQsIFZLX0ZPUk1BVF9SOF9TUkdCLCBWS19GT1JNQVRfUjhHOF9VTk9STSwgVktfRk9STUFUX1I4RzhfU05PUk0sIFZLX0ZPUk1BVF9SOEc4X1VTQ0FMRUQsIFZLX0ZPUk1BVF9SOEc4X1NTQ0FMRUQsIFZLX0ZPUk1BVF9SOEc4X1VJTlQsIFZLX0ZPUk1BVF9SOEc4X1NJTlQsIFZLX0ZPUk1BVF9SOEc4X1NSR0IsIFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk0sIFZLX0ZPUk1BVF9SOEc4QjhfU05PUk0sIFZLX0ZPUk1BVF9SOEc4QjhfVVNDQUxFRCwgVktfRk9STUFUX1I4RzhCOF9TU0NBTEVELCBWS19GT1JNQVRfUjhHOEI4X1VJTlQsIFZLX0ZPUk1BVF9SOEc4QjhfU0lOVCwgVktfRk9STUFUX1I4RzhCOF9TUkdCLCBWS19GT1JNQVRfQjhHOFI4X1VOT1JNLCBWS19GT1JNQVRfQjhHOFI4X1NOT1JNLCBWS19GT1JNQVRfQjhHOFI4X1VTQ0FMRUQsIFZLX0ZPUk1BVF9COEc4UjhfU1NDQUxFRCwgVktfRk9STUFUX0I4RzhSOF9VSU5ULCBWS19GT1JNQVRfQjhHOFI4X1NJTlQsIFZLX0ZPUk1BVF9COEc4UjhfU1JHQiwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19GT1JNQVRfUjhHOEI4QThfU05PUk0sIFZLX0ZPUk1BVF9SOEc4QjhBOF9VU0NBTEVELCBWS19GT1JNQVRfUjhHOEI4QThfU1NDQUxFRCwgVktfRk9STUFUX1I4RzhCOEE4X1VJTlQsIFZLX0ZPUk1BVF9SOEc4QjhBOF9TSU5ULCBWS19GT1JNQVRfUjhHOEI4QThfU1JHQiwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19GT1JNQVRfQjhHOFI4QThfU05PUk0sIFZLX0ZPUk1BVF9COEc4UjhBOF9VU0NBTEVELCBWS19GT1JNQVRfQjhHOFI4QThfU1NDQUxFRCwgVktfRk9STUFUX0I4RzhSOEE4X1VJTlQsIFZLX0ZPUk1BVF9COEc4UjhBOF9TSU5ULCBWS19GT1JNQVRfQjhHOFI4QThfU1JHQiwgVktfRk9STUFUX0E4QjhHOFI4X1VOT1JNX1BBQ0szMiwgVktfRk9STUFUX0E4QjhHOFI4X1NOT1JNX1BBQ0szMiwgVktfRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyLCBWS19GT1JNQVRfQThCOEc4UjhfU1NDQUxFRF9QQUNLMzIsIFZLX0ZPUk1BVF9BOEI4RzhSOF9VSU5UX1BBQ0szMiwgVktfRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyLCBWS19GT1JNQVRfQThCOEc4UjhfU1JHQl9QQUNLMzIsIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VTk9STV9QQUNLMzIsIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TTk9STV9QQUNLMzIsIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VU0NBTEVEX1BBQ0szMiwgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NTQ0FMRURfUEFDSzMyLCBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVUlOVF9QQUNLMzIsIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TSU5UX1BBQ0szMiwgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VOT1JNX1BBQ0szMiwgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMiwgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VTQ0FMRURfUEFDSzMyLCBWS19GT1JNQVRfQTJCMTBHMTBSMTBfU1NDQUxFRF9QQUNLMzIsIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VSU5UX1BBQ0szMiwgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NJTlRfUEFDSzMyLCBWS19GT1JNQVRfUjE2X1VOT1JNLCBWS19GT1JNQVRfUjE2X1NOT1JNLCBWS19GT1JNQVRfUjE2X1VTQ0FMRUQsIFZLX0ZPUk1BVF9SMTZfU1NDQUxFRCwgVktfRk9STUFUX1IxNl9VSU5ULCBWS19GT1JNQVRfUjE2X1NJTlQsIFZLX0ZPUk1BVF9SMTZfU0ZMT0FULCBWS19GT1JNQVRfUjE2RzE2X1VOT1JNLCBWS19GT1JNQVRfUjE2RzE2X1NOT1JNLCBWS19GT1JNQVRfUjE2RzE2X1VTQ0FMRUQsIFZLX0ZPUk1BVF9SMTZHMTZfU1NDQUxFRCwgVktfRk9STUFUX1IxNkcxNl9VSU5ULCBWS19GT1JNQVRfUjE2RzE2X1NJTlQsIFZLX0ZPUk1BVF9SMTZHMTZfU0ZMT0FULCBWS19GT1JNQVRfUjE2RzE2QjE2X1VOT1JNLCBWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNLCBWS19GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQsIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRCwgVktfRk9STUFUX1IxNkcxNkIxNl9VSU5ULCBWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlQsIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU0ZMT0FULCBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNLCBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNLCBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRUQsIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU1NDQUxFRCwgVktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5ULCBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NJTlQsIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FULCBWS19GT1JNQVRfUjMyX1VJTlQsIFZLX0ZPUk1BVF9SMzJfU0lOVCwgVktfRk9STUFUX1IzMl9TRkxPQVQsIFZLX0ZPUk1BVF9SMzJHMzJfVUlOVCwgVktfRk9STUFUX1IzMkczMl9TSU5ULCBWS19GT1JNQVRfUjMyRzMyX1NGTE9BVCwgVktfRk9STUFUX1IzMkczMkIzMl9VSU5ULCBWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlQsIFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FULCBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQsIFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVCwgVktfRk9STUFUX1IzMkczMkIzMkEzMl9TRkxPQVQsIFZLX0ZPUk1BVF9SNjRfVUlOVCwgVktfRk9STUFUX1I2NF9TSU5ULCBWS19GT1JNQVRfUjY0X1NGTE9BVCwgVktfRk9STUFUX1I2NEc2NF9VSU5ULCBWS19GT1JNQVRfUjY0RzY0X1NJTlQsIFZLX0ZPUk1BVF9SNjRHNjRfU0ZMT0FULCBWS19GT1JNQVRfUjY0RzY0QjY0X1VJTlQsIFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0lOVCwgVktfRk9STUFUX1I2NEc2NEI2NF9TRkxPQVQsIFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfVUlOVCwgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TSU5ULCBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVCwgVktfRk9STUFUX0IxMEcxMVIxMV9VRkxPQVRfUEFDSzMyLCBWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMiwgVktfRk9STUFUX0QxNl9VTk9STSwgVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzIsIFZLX0ZPUk1BVF9EMzJfU0ZMT0FULCBWS19GT1JNQVRfUzhfVUlOVCwgVktfRk9STUFUX0QxNl9VTk9STV9TOF9VSU5ULCBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQsIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQsIFZLX0ZPUk1BVF9CQzFfUkdCX1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQkMxX1JHQl9TUkdCX0JMT0NLLCBWS19GT1JNQVRfQkMxX1JHQkFfVU5PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9CQzFfUkdCQV9TUkdCX0JMT0NLLCBWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0ssIFZLX0ZPUk1BVF9CQzNfVU5PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9CQzNfU1JHQl9CTE9DSywgVktfRk9STUFUX0JDNF9VTk9STV9CTE9DSywgVktfRk9STUFUX0JDNF9TTk9STV9CTE9DSywgVktfRk9STUFUX0JDNV9VTk9STV9CTE9DSywgVktfRk9STUFUX0JDNV9TTk9STV9CTE9DSywgVktfRk9STUFUX0JDNkhfVUZMT0FUX0JMT0NLLCBWS19GT1JNQVRfQkM2SF9TRkxPQVRfQkxPQ0ssIFZLX0ZPUk1BVF9CQzdfVU5PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9CQzdfU1JHQl9CTE9DSywgVktfRk9STUFUX0VUQzJfUjhHOEI4X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfRVRDMl9SOEc4QjhfU1JHQl9CTE9DSywgVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1NSR0JfQkxPQ0ssIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9TUkdCX0JMT0NLLCBWS19GT1JNQVRfRUFDX1IxMV9VTk9STV9CTE9DSywgVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9FQUNfUjExRzExX1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfRUFDX1IxMUcxMV9TTk9STV9CTE9DSywgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfNXg0X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfNXg1X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ181eDVfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfNng2X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfOHg1X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ184eDVfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfOHg4X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSywgVktfRk9STUFUX0FTVENfMTB4NV9TUkdCX0JMT0NLLCBWS19GT1JNQVRfQVNUQ18xMHg2X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ18xMHg2X1NSR0JfQkxPQ0ssIFZLX0ZPUk1BVF9BU1RDXzEweDhfVU5PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9BU1RDXzEweDhfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfMTB4MTBfVU5PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9BU1RDXzEweDEwX1NSR0JfQkxPQ0ssIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ18xMngxMF9TUkdCX0JMT0NLLCBWS19GT1JNQVRfQVNUQ18xMngxMl9VTk9STV9CTE9DSywgVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSywgVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STSwgVktfRk9STUFUX0I4RzhSOEc4XzQyMl9VTk9STSwgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk0sIFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk0sIFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNLCBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIyX1VOT1JNLCBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STSwgVktfRk9STUFUX1IxMFg2X1VOT1JNX1BBQ0sxNiwgVktfRk9STUFUX1IxMFg2RzEwWDZfVU5PUk1fMlBBQ0sxNiwgVktfRk9STUFUX1IxMFg2RzEwWDZCMTBYNkExMFg2X1VOT1JNXzRQQUNLMTYsIFZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNiwgVktfRk9STUFUX0IxMFg2RzEwWDZSMTBYNkcxMFg2XzQyMl9VTk9STV80UEFDSzE2LCBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2LCBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYsIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiwgVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNiwgVktfRk9STUFUX1IxMlg0X1VOT1JNX1BBQ0sxNiwgVktfRk9STUFUX1IxMlg0RzEyWDRfVU5PUk1fMlBBQ0sxNiwgVktfRk9STUFUX1IxMlg0RzEyWDRCMTJYNEExMlg0X1VOT1JNXzRQQUNLMTYsIFZLX0ZPUk1BVF9HMTJYNEIxMlg0RzEyWDRSMTJYNF80MjJfVU5PUk1fNFBBQ0sxNiwgVktfRk9STUFUX0IxMlg0RzEyWDRSMTJYNEcxMlg0XzQyMl9VTk9STV80UEFDSzE2LCBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2LCBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYsIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiwgVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNiwgVktfRk9STUFUX0cxNkIxNkcxNlIxNl80MjJfVU5PUk0sIFZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNLCBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMF9VTk9STSwgVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STSwgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjJfVU5PUk0sIFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjJfVU5PUk0sIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNLCBWS19GT1JNQVRfUFZSVEMxXzJCUFBfVU5PUk1fQkxPQ0tfSU1HLCBWS19GT1JNQVRfUFZSVEMxXzRCUFBfVU5PUk1fQkxPQ0tfSU1HLCBWS19GT1JNQVRfUFZSVEMyXzJCUFBfVU5PUk1fQkxPQ0tfSU1HLCBWS19GT1JNQVRfUFZSVEMyXzRCUFBfVU5PUk1fQkxPQ0tfSU1HLCBWS19GT1JNQVRfUFZSVEMxXzJCUFBfU1JHQl9CTE9DS19JTUcsIFZLX0ZPUk1BVF9QVlJUQzFfNEJQUF9TUkdCX0JMT0NLX0lNRywgVktfRk9STUFUX1BWUlRDMl8yQlBQX1NSR0JfQkxPQ0tfSU1HLCBWS19GT1JNQVRfUFZSVEMyXzRCUFBfU1JHQl9CTE9DS19JTUcsIFZLX0ZPUk1BVF9BU1RDXzR4NF9TRkxPQVRfQkxPQ0tfRVhULCBWS19GT1JNQVRfQVNUQ181eDRfU0ZMT0FUX0JMT0NLX0VYVCwgVktfRk9STUFUX0FTVENfNXg1X1NGTE9BVF9CTE9DS19FWFQsIFZLX0ZPUk1BVF9BU1RDXzZ4NV9TRkxPQVRfQkxPQ0tfRVhULCBWS19GT1JNQVRfQVNUQ182eDZfU0ZMT0FUX0JMT0NLX0VYVCwgVktfRk9STUFUX0FTVENfOHg1X1NGTE9BVF9CTE9DS19FWFQsIFZLX0ZPUk1BVF9BU1RDXzh4Nl9TRkxPQVRfQkxPQ0tfRVhULCBWS19GT1JNQVRfQVNUQ184eDhfU0ZMT0FUX0JMT0NLX0VYVCwgVktfRk9STUFUX0FTVENfMTB4NV9TRkxPQVRfQkxPQ0tfRVhULCBWS19GT1JNQVRfQVNUQ18xMHg2X1NGTE9BVF9CTE9DS19FWFQsIFZLX0ZPUk1BVF9BU1RDXzEweDhfU0ZMT0FUX0JMT0NLX0VYVCwgVktfRk9STUFUX0FTVENfMTB4MTBfU0ZMT0FUX0JMT0NLX0VYVCwgVktfRk9STUFUX0FTVENfMTJ4MTBfU0ZMT0FUX0JMT0NLX0VYVCwgVktfRk9STUFUX0FTVENfMTJ4MTJfU0ZMT0FUX0JMT0NLX0VYVCwgVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STV9LSFIsIFZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk1fS0hSLCBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STV9LSFIsIFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk1fS0hSLCBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMl9VTk9STV9LSFIsIFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjJfVU5PUk1fS0hSLCBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STV9LSFIsIFZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTZfS0hSLCBWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2X0tIUiwgVktfRk9STUFUX1IxMFg2RzEwWDZCMTBYNkExMFg2X1VOT1JNXzRQQUNLMTZfS0hSLCBWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTZfS0hSLCBWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTZfS0hSLCBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUiwgVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUiwgVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFIsIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFIsIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTZfS0hSLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2X0tIUiwgVktfRk9STUFUX1IxMlg0RzEyWDRfVU5PUk1fMlBBQ0sxNl9LSFIsIFZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2X0tIUiwgVktfRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2X0tIUiwgVktfRk9STUFUX0IxMlg0RzEyWDRSMTJYNEcxMlg0XzQyMl9VTk9STV80UEFDSzE2X0tIUiwgVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFIsIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFIsIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSLCBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSLCBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2X0tIUiwgVktfRk9STUFUX0cxNkIxNkcxNlIxNl80MjJfVU5PUk1fS0hSLCBWS19GT1JNQVRfQjE2RzE2UjE2RzE2XzQyMl9VTk9STV9LSFIsIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNX0tIUiwgVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STV9LSFIsIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIyX1VOT1JNX0tIUiwgVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STV9LSFIsIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNX0tIUiwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrSW1hZ2VUeXBlPiBBbGxWa0ltYWdlVHlwZUVudW1zID0ge1ZLX0lNQUdFX1RZUEVfMUQsIFZLX0lNQUdFX1RZUEVfMkQsIFZLX0lNQUdFX1RZUEVfM0QsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0ltYWdlVGlsaW5nPiBBbGxWa0ltYWdlVGlsaW5nRW51bXMgPSB7VktfSU1BR0VfVElMSU5HX09QVElNQUwsIFZLX0lNQUdFX1RJTElOR19MSU5FQVIsIFZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrUGh5c2ljYWxEZXZpY2VUeXBlPiBBbGxWa1BoeXNpY2FsRGV2aWNlVHlwZUVudW1zID0ge1ZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX09USEVSLCBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9JTlRFR1JBVEVEX0dQVSwgVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfRElTQ1JFVEVfR1BVLCBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9WSVJUVUFMX0dQVSwgVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfQ1BVLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtRdWVyeVR5cGU+IEFsbFZrUXVlcnlUeXBlRW51bXMgPSB7VktfUVVFUllfVFlQRV9PQ0NMVVNJT04sIFZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUywgVktfUVVFUllfVFlQRV9USU1FU1RBTVAsIFZLX1FVRVJZX1RZUEVfVFJBTlNGT1JNX0ZFRURCQUNLX1NUUkVBTV9FWFQsIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSLCBWS19RVUVSWV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ09NUEFDVEVEX1NJWkVfTlYsIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfSU5URUwsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1NoYXJpbmdNb2RlPiBBbGxWa1NoYXJpbmdNb2RlRW51bXMgPSB7VktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0ltYWdlTGF5b3V0PiBBbGxWa0ltYWdlTGF5b3V0RW51bXMgPSB7VktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFIsIFZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX1NIQURJTkdfUkFURV9PUFRJTUFMX05WLCBWS19JTUFHRV9MQVlPVVRfRlJBR01FTlRfREVOU0lUWV9NQVBfT1BUSU1BTF9FWFQsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0ltYWdlVmlld1R5cGU+IEFsbFZrSW1hZ2VWaWV3VHlwZUVudW1zID0ge1ZLX0lNQUdFX1ZJRVdfVFlQRV8xRCwgVktfSU1BR0VfVklFV19UWVBFXzJELCBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSwgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVksIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0NvbXBvbmVudFN3aXp6bGU+IEFsbFZrQ29tcG9uZW50U3dpenpsZUVudW1zID0ge1ZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLCBWS19DT01QT05FTlRfU1dJWlpMRV9aRVJPLCBWS19DT01QT05FTlRfU1dJWlpMRV9PTkUsIFZLX0NPTVBPTkVOVF9TV0laWkxFX1IsIFZLX0NPTVBPTkVOVF9TV0laWkxFX0csIFZLX0NPTVBPTkVOVF9TV0laWkxFX0IsIFZLX0NPTVBPTkVOVF9TV0laWkxFX0EsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1ZlcnRleElucHV0UmF0ZT4gQWxsVmtWZXJ0ZXhJbnB1dFJhdGVFbnVtcyA9IHtWS19WRVJURVhfSU5QVVRfUkFURV9WRVJURVgsIFZLX1ZFUlRFWF9JTlBVVF9SQVRFX0lOU1RBTkNFLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQcmltaXRpdmVUb3BvbG9neT4gQWxsVmtQcmltaXRpdmVUb3BvbG9neUVudW1zID0ge1ZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNULCBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9MSVNULCBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUCwgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1QsIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9TVFJJUCwgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0ZBTiwgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVF9XSVRIX0FESkFDRU5DWSwgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfU1RSSVBfV0lUSF9BREpBQ0VOQ1ksIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZLCBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfU1RSSVBfV0lUSF9BREpBQ0VOQ1ksIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNULCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQb2x5Z29uTW9kZT4gQWxsVmtQb2x5Z29uTW9kZUVudW1zID0ge1ZLX1BPTFlHT05fTU9ERV9GSUxMLCBWS19QT0xZR09OX01PREVfTElORSwgVktfUE9MWUdPTl9NT0RFX1BPSU5ULCBWS19QT0xZR09OX01PREVfRklMTF9SRUNUQU5HTEVfTlYsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0Zyb250RmFjZT4gQWxsVmtGcm9udEZhY2VFbnVtcyA9IHtWS19GUk9OVF9GQUNFX0NPVU5URVJfQ0xPQ0tXSVNFLCBWS19GUk9OVF9GQUNFX0NMT0NLV0lTRSwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQ29tcGFyZU9wPiBBbGxWa0NvbXBhcmVPcEVudW1zID0ge1ZLX0NPTVBBUkVfT1BfTkVWRVIsIFZLX0NPTVBBUkVfT1BfTEVTUywgVktfQ09NUEFSRV9PUF9FUVVBTCwgVktfQ09NUEFSRV9PUF9MRVNTX09SX0VRVUFMLCBWS19DT01QQVJFX09QX0dSRUFURVIsIFZLX0NPTVBBUkVfT1BfTk9UX0VRVUFMLCBWS19DT01QQVJFX09QX0dSRUFURVJfT1JfRVFVQUwsIFZLX0NPTVBBUkVfT1BfQUxXQVlTLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtTdGVuY2lsT3A+IEFsbFZrU3RlbmNpbE9wRW51bXMgPSB7VktfU1RFTkNJTF9PUF9LRUVQLCBWS19TVEVOQ0lMX09QX1pFUk8sIFZLX1NURU5DSUxfT1BfUkVQTEFDRSwgVktfU1RFTkNJTF9PUF9JTkNSRU1FTlRfQU5EX0NMQU1QLCBWS19TVEVOQ0lMX09QX0RFQ1JFTUVOVF9BTkRfQ0xBTVAsIFZLX1NURU5DSUxfT1BfSU5WRVJULCBWS19TVEVOQ0lMX09QX0lOQ1JFTUVOVF9BTkRfV1JBUCwgVktfU1RFTkNJTF9PUF9ERUNSRU1FTlRfQU5EX1dSQVAsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0xvZ2ljT3A+IEFsbFZrTG9naWNPcEVudW1zID0ge1ZLX0xPR0lDX09QX0NMRUFSLCBWS19MT0dJQ19PUF9BTkQsIFZLX0xPR0lDX09QX0FORF9SRVZFUlNFLCBWS19MT0dJQ19PUF9DT1BZLCBWS19MT0dJQ19PUF9BTkRfSU5WRVJURUQsIFZLX0xPR0lDX09QX05PX09QLCBWS19MT0dJQ19PUF9YT1IsIFZLX0xPR0lDX09QX09SLCBWS19MT0dJQ19PUF9OT1IsIFZLX0xPR0lDX09QX0VRVUlWQUxFTlQsIFZLX0xPR0lDX09QX0lOVkVSVCwgVktfTE9HSUNfT1BfT1JfUkVWRVJTRSwgVktfTE9HSUNfT1BfQ09QWV9JTlZFUlRFRCwgVktfTE9HSUNfT1BfT1JfSU5WRVJURUQsIFZLX0xPR0lDX09QX05BTkQsIFZLX0xPR0lDX09QX1NFVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQmxlbmRGYWN0b3I+IEFsbFZrQmxlbmRGYWN0b3JFbnVtcyA9IHtWS19CTEVORF9GQUNUT1JfWkVSTywgVktfQkxFTkRfRkFDVE9SX09ORSwgVktfQkxFTkRfRkFDVE9SX1NSQ19DT0xPUiwgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkNfQ09MT1IsIFZLX0JMRU5EX0ZBQ1RPUl9EU1RfQ09MT1IsIFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfRFNUX0NPTE9SLCBWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBLCBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQ19BTFBIQSwgVktfQkxFTkRfRkFDVE9SX0RTVF9BTFBIQSwgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19EU1RfQUxQSEEsIFZLX0JMRU5EX0ZBQ1RPUl9DT05TVEFOVF9DT0xPUiwgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiwgVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0FMUEhBLCBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBLCBWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBX1NBVFVSQVRFLCBWS19CTEVORF9GQUNUT1JfU1JDMV9DT0xPUiwgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0NPTE9SLCBWS19CTEVORF9GQUNUT1JfU1JDMV9BTFBIQSwgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0FMUEhBLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtCbGVuZE9wPiBBbGxWa0JsZW5kT3BFbnVtcyA9IHtWS19CTEVORF9PUF9BREQsIFZLX0JMRU5EX09QX1NVQlRSQUNULCBWS19CTEVORF9PUF9SRVZFUlNFX1NVQlRSQUNULCBWS19CTEVORF9PUF9NSU4sIFZLX0JMRU5EX09QX01BWCwgVktfQkxFTkRfT1BfWkVST19FWFQsIFZLX0JMRU5EX09QX1NSQ19FWFQsIFZLX0JMRU5EX09QX0RTVF9FWFQsIFZLX0JMRU5EX09QX1NSQ19PVkVSX0VYVCwgVktfQkxFTkRfT1BfRFNUX09WRVJfRVhULCBWS19CTEVORF9PUF9TUkNfSU5fRVhULCBWS19CTEVORF9PUF9EU1RfSU5fRVhULCBWS19CTEVORF9PUF9TUkNfT1VUX0VYVCwgVktfQkxFTkRfT1BfRFNUX09VVF9FWFQsIFZLX0JMRU5EX09QX1NSQ19BVE9QX0VYVCwgVktfQkxFTkRfT1BfRFNUX0FUT1BfRVhULCBWS19CTEVORF9PUF9YT1JfRVhULCBWS19CTEVORF9PUF9NVUxUSVBMWV9FWFQsIFZLX0JMRU5EX09QX1NDUkVFTl9FWFQsIFZLX0JMRU5EX09QX09WRVJMQVlfRVhULCBWS19CTEVORF9PUF9EQVJLRU5fRVhULCBWS19CTEVORF9PUF9MSUdIVEVOX0VYVCwgVktfQkxFTkRfT1BfQ09MT1JET0RHRV9FWFQsIFZLX0JMRU5EX09QX0NPTE9SQlVSTl9FWFQsIFZLX0JMRU5EX09QX0hBUkRMSUdIVF9FWFQsIFZLX0JMRU5EX09QX1NPRlRMSUdIVF9FWFQsIFZLX0JMRU5EX09QX0RJRkZFUkVOQ0VfRVhULCBWS19CTEVORF9PUF9FWENMVVNJT05fRVhULCBWS19CTEVORF9PUF9JTlZFUlRfRVhULCBWS19CTEVORF9PUF9JTlZFUlRfUkdCX0VYVCwgVktfQkxFTkRfT1BfTElORUFSRE9ER0VfRVhULCBWS19CTEVORF9PUF9MSU5FQVJCVVJOX0VYVCwgVktfQkxFTkRfT1BfVklWSURMSUdIVF9FWFQsIFZLX0JMRU5EX09QX0xJTkVBUkxJR0hUX0VYVCwgVktfQkxFTkRfT1BfUElOTElHSFRfRVhULCBWS19CTEVORF9PUF9IQVJETUlYX0VYVCwgVktfQkxFTkRfT1BfSFNMX0hVRV9FWFQsIFZLX0JMRU5EX09QX0hTTF9TQVRVUkFUSU9OX0VYVCwgVktfQkxFTkRfT1BfSFNMX0NPTE9SX0VYVCwgVktfQkxFTkRfT1BfSFNMX0xVTUlOT1NJVFlfRVhULCBWS19CTEVORF9PUF9QTFVTX0VYVCwgVktfQkxFTkRfT1BfUExVU19DTEFNUEVEX0VYVCwgVktfQkxFTkRfT1BfUExVU19DTEFNUEVEX0FMUEhBX0VYVCwgVktfQkxFTkRfT1BfUExVU19EQVJLRVJfRVhULCBWS19CTEVORF9PUF9NSU5VU19FWFQsIFZLX0JMRU5EX09QX01JTlVTX0NMQU1QRURfRVhULCBWS19CTEVORF9PUF9DT05UUkFTVF9FWFQsIFZLX0JMRU5EX09QX0lOVkVSVF9PVkdfRVhULCBWS19CTEVORF9PUF9SRURfRVhULCBWS19CTEVORF9PUF9HUkVFTl9FWFQsIFZLX0JMRU5EX09QX0JMVUVfRVhULCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtEeW5hbWljU3RhdGU+IEFsbFZrRHluYW1pY1N0YXRlRW51bXMgPSB7VktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCwgVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SLCBWS19EWU5BTUlDX1NUQVRFX0xJTkVfV0lEVEgsIFZLX0RZTkFNSUNfU1RBVEVfREVQVEhfQklBUywgVktfRFlOQU1JQ19TVEFURV9CTEVORF9DT05TVEFOVFMsIFZLX0RZTkFNSUNfU1RBVEVfREVQVEhfQk9VTkRTLCBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfQ09NUEFSRV9NQVNLLCBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfV1JJVEVfTUFTSywgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1JFRkVSRU5DRSwgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9XX1NDQUxJTkdfTlYsIFZLX0RZTkFNSUNfU1RBVEVfRElTQ0FSRF9SRUNUQU5HTEVfRVhULCBWS19EWU5BTUlDX1NUQVRFX1NBTVBMRV9MT0NBVElPTlNfRVhULCBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9QQUxFVFRFX05WLCBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfTlYsIFZLX0RZTkFNSUNfU1RBVEVfRVhDTFVTSVZFX1NDSVNTT1JfTlYsIFZLX0RZTkFNSUNfU1RBVEVfTElORV9TVElQUExFX0VYVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrRmlsdGVyPiBBbGxWa0ZpbHRlckVudW1zID0ge1ZLX0ZJTFRFUl9ORUFSRVNULCBWS19GSUxURVJfTElORUFSLCBWS19GSUxURVJfQ1VCSUNfSU1HLCBWS19GSUxURVJfQ1VCSUNfRVhULCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtTYW1wbGVyTWlwbWFwTW9kZT4gQWxsVmtTYW1wbGVyTWlwbWFwTW9kZUVudW1zID0ge1ZLX1NBTVBMRVJfTUlQTUFQX01PREVfTkVBUkVTVCwgVktfU0FNUExFUl9NSVBNQVBfTU9ERV9MSU5FQVIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1NhbXBsZXJBZGRyZXNzTW9kZT4gQWxsVmtTYW1wbGVyQWRkcmVzc01vZGVFbnVtcyA9IHtWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9SRVBFQVQsIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUkVEX1JFUEVBVCwgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRSwgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSLCBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRSwgVktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SX0NMQU1QX1RPX0VER0VfS0hSLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtCb3JkZXJDb2xvcj4gQWxsVmtCb3JkZXJDb2xvckVudW1zID0ge1ZLX0JPUkRFUl9DT0xPUl9GTE9BVF9UUkFOU1BBUkVOVF9CTEFDSywgVktfQk9SREVSX0NPTE9SX0lOVF9UUkFOU1BBUkVOVF9CTEFDSywgVktfQk9SREVSX0NPTE9SX0ZMT0FUX09QQVFVRV9CTEFDSywgVktfQk9SREVSX0NPTE9SX0lOVF9PUEFRVUVfQkxBQ0ssIFZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfV0hJVEUsIFZLX0JPUkRFUl9DT0xPUl9JTlRfT1BBUVVFX1dISVRFLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yVHlwZT4gQWxsVmtEZXNjcmlwdG9yVHlwZUVudW1zID0ge1ZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQywgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQsIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQsIFZLX0RFU0NSSVBUT1JfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtBdHRhY2htZW50TG9hZE9wPiBBbGxWa0F0dGFjaG1lbnRMb2FkT3BFbnVtcyA9IHtWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCwgVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSLCBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtBdHRhY2htZW50U3RvcmVPcD4gQWxsVmtBdHRhY2htZW50U3RvcmVPcEVudW1zID0ge1ZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQaXBlbGluZUJpbmRQb2ludD4gQWxsVmtQaXBlbGluZUJpbmRQb2ludEVudW1zID0ge1ZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OViwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQ29tbWFuZEJ1ZmZlckxldmVsPiBBbGxWa0NvbW1hbmRCdWZmZXJMZXZlbEVudW1zID0ge1ZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlksIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrSW5kZXhUeXBlPiBBbGxWa0luZGV4VHlwZUVudW1zID0ge1ZLX0lOREVYX1RZUEVfVUlOVDE2LCBWS19JTkRFWF9UWVBFX1VJTlQzMiwgVktfSU5ERVhfVFlQRV9OT05FX05WLCBWS19JTkRFWF9UWVBFX1VJTlQ4X0VYVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrU3VicGFzc0NvbnRlbnRzPiBBbGxWa1N1YnBhc3NDb250ZW50c0VudW1zID0ge1ZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FLCBWS19TVUJQQVNTX0NPTlRFTlRTX1NFQ09OREFSWV9DT01NQU5EX0JVRkZFUlMsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa09iamVjdFR5cGU+IEFsbFZrT2JqZWN0VHlwZUVudW1zID0ge1ZLX09CSkVDVF9UWVBFX1VOS05PV04sIFZLX09CSkVDVF9UWVBFX0lOU1RBTkNFLCBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0UsIFZLX09CSkVDVF9UWVBFX0RFVklDRSwgVktfT0JKRUNUX1RZUEVfUVVFVUUsIFZLX09CSkVDVF9UWVBFX1NFTUFQSE9SRSwgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVIsIFZLX09CSkVDVF9UWVBFX0ZFTkNFLCBWS19PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZLCBWS19PQkpFQ1RfVFlQRV9CVUZGRVIsIFZLX09CSkVDVF9UWVBFX0lNQUdFLCBWS19PQkpFQ1RfVFlQRV9FVkVOVCwgVktfT0JKRUNUX1RZUEVfUVVFUllfUE9PTCwgVktfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVcsIFZLX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVcsIFZLX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEUsIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFLCBWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVQsIFZLX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTLCBWS19PQkpFQ1RfVFlQRV9QSVBFTElORSwgVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VULCBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSLCBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0wsIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VULCBWS19PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUiwgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MLCBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT04sIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFLCBWS19PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUiwgVktfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUiwgVktfT0JKRUNUX1RZUEVfRElTUExBWV9LSFIsIFZLX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFIsIFZLX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFQsIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0tIUiwgVktfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWCwgVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWCwgVktfT0JKRUNUX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0VYVCwgVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0tIUiwgVktfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFQsIFZLX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYsIFZLX09CSkVDVF9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fSU5URUwsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1ZlbmRvcklkPiBBbGxWa1ZlbmRvcklkRW51bXMgPSB7VktfVkVORE9SX0lEX1ZJViwgVktfVkVORE9SX0lEX1ZTSSwgVktfVkVORE9SX0lEX0tBWkFOLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQb2ludENsaXBwaW5nQmVoYXZpb3I+IEFsbFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yRW51bXMgPSB7VktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfQUxMX0NMSVBfUExBTkVTLCBWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9VU0VSX0NMSVBfUExBTkVTX09OTFksIFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX0FMTF9DTElQX1BMQU5FU19LSFIsIFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX1VTRVJfQ0xJUF9QTEFORVNfT05MWV9LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1Rlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbj4gQWxsVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5FbnVtcyA9IHtWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZULCBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9MT1dFUl9MRUZULCBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZUX0tIUiwgVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fTE9XRVJfTEVGVF9LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbj4gQWxsVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb25FbnVtcyA9IHtWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZLCBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfSURFTlRJVFksIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl83MDksIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl82MDEsIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwLCBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZX0tIUiwgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSX0lERU5USVRZX0tIUiwgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzcwOV9LSFIsIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl82MDFfS0hSLCBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfMjAyMF9LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1NhbXBsZXJZY2JjclJhbmdlPiBBbGxWa1NhbXBsZXJZY2JjclJhbmdlRW51bXMgPSB7VktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfRlVMTCwgVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XLCBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMX0tIUiwgVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XX0tIUiwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQ2hyb21hTG9jYXRpb24+IEFsbFZrQ2hyb21hTG9jYXRpb25FbnVtcyA9IHtWS19DSFJPTUFfTE9DQVRJT05fQ09TSVRFRF9FVkVOLCBWS19DSFJPTUFfTE9DQVRJT05fTUlEUE9JTlQsIFZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU5fS0hSLCBWS19DSFJPTUFfTE9DQVRJT05fTUlEUE9JTlRfS0hSLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlPiBBbGxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGVFbnVtcyA9IHtWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VULCBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSLCBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUX0tIUiwgVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9QVVNIX0RFU0NSSVBUT1JTX0tIUiwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQ29sb3JTcGFjZUtIUj4gQWxsVmtDb2xvclNwYWNlS0hSRW51bXMgPSB7VktfQ09MT1JfU1BBQ0VfU1JHQl9OT05MSU5FQVJfS0hSLCBWS19DT0xPUlNQQUNFX1NSR0JfTk9OTElORUFSX0tIUiwgVktfQ09MT1JfU1BBQ0VfRElTUExBWV9QM19OT05MSU5FQVJfRVhULCBWS19DT0xPUl9TUEFDRV9FWFRFTkRFRF9TUkdCX0xJTkVBUl9FWFQsIFZLX0NPTE9SX1NQQUNFX0RJU1BMQVlfUDNfTElORUFSX0VYVCwgVktfQ09MT1JfU1BBQ0VfRENJX1AzX05PTkxJTkVBUl9FWFQsIFZLX0NPTE9SX1NQQUNFX0JUNzA5X0xJTkVBUl9FWFQsIFZLX0NPTE9SX1NQQUNFX0JUNzA5X05PTkxJTkVBUl9FWFQsIFZLX0NPTE9SX1NQQUNFX0JUMjAyMF9MSU5FQVJfRVhULCBWS19DT0xPUl9TUEFDRV9IRFIxMF9TVDIwODRfRVhULCBWS19DT0xPUl9TUEFDRV9ET0xCWVZJU0lPTl9FWFQsIFZLX0NPTE9SX1NQQUNFX0hEUjEwX0hMR19FWFQsIFZLX0NPTE9SX1NQQUNFX0FET0JFUkdCX0xJTkVBUl9FWFQsIFZLX0NPTE9SX1NQQUNFX0FET0JFUkdCX05PTkxJTkVBUl9FWFQsIFZLX0NPTE9SX1NQQUNFX1BBU1NfVEhST1VHSF9FWFQsIFZLX0NPTE9SX1NQQUNFX0VYVEVOREVEX1NSR0JfTk9OTElORUFSX0VYVCwgVktfQ09MT1JfU1BBQ0VfRENJX1AzX0xJTkVBUl9FWFQsIFZLX0NPTE9SX1NQQUNFX0RJU1BMQVlfTkFUSVZFX0FNRCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrUHJlc2VudE1vZGVLSFI+IEFsbFZrUHJlc2VudE1vZGVLSFJFbnVtcyA9IHtWS19QUkVTRU5UX01PREVfSU1NRURJQVRFX0tIUiwgVktfUFJFU0VOVF9NT0RFX01BSUxCT1hfS0hSLCBWS19QUkVTRU5UX01PREVfRklGT19LSFIsIFZLX1BSRVNFTlRfTU9ERV9GSUZPX1JFTEFYRURfS0hSLCBWS19QUkVTRU5UX01PREVfU0hBUkVEX0RFTUFORF9SRUZSRVNIX0tIUiwgVktfUFJFU0VOVF9NT0RFX1NIQVJFRF9DT05USU5VT1VTX1JFRlJFU0hfS0hSLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlS0hSPiBBbGxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGVLSFJFbnVtcyA9IHtWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VULCBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSLCBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUX0tIUiwgVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9QVVNIX0RFU0NSSVBUT1JTX0tIUiwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUj4gQWxsVmtQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSRW51bXMgPSB7VktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0dFTkVSSUNfS0hSLCBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfUEVSQ0VOVEFHRV9LSFIsIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9OQU5PU0VDT05EU19LSFIsIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9CWVRFU19LSFIsIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9CWVRFU19QRVJfU0VDT05EX0tIUiwgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0tFTFZJTl9LSFIsIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9XQVRUU19LSFIsIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9WT0xUU19LSFIsIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9BTVBTX0tIUiwgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0hFUlRaX0tIUiwgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0NZQ0xFU19LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1BlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSPiBBbGxWa1BlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSRW51bXMgPSB7VktfUVVFUllfU0NPUEVfQ09NTUFORF9CVUZGRVJfS0hSLCBWS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFIsIFZLX1FVRVJZX1NDT1BFX0NPTU1BTkRfS0hSLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSPiBBbGxWa1BlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFJFbnVtcyA9IHtWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfSU5UMzJfS0hSLCBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfSU5UNjRfS0hSLCBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfVUlOVDMyX0tIUiwgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX1VJTlQ2NF9LSFIsIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9GTE9BVDMyX0tIUiwgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX0ZMT0FUNjRfS0hSLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQb2ludENsaXBwaW5nQmVoYXZpb3JLSFI+IEFsbFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yS0hSRW51bXMgPSB7VktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfQUxMX0NMSVBfUExBTkVTLCBWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9VU0VSX0NMSVBfUExBTkVTX09OTFksIFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX0FMTF9DTElQX1BMQU5FU19LSFIsIFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX1VTRVJfQ0xJUF9QTEFORVNfT05MWV9LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1Rlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbktIUj4gQWxsVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5LSFJFbnVtcyA9IHtWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZULCBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9MT1dFUl9MRUZULCBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZUX0tIUiwgVktfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fTE9XRVJfTEVGVF9LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbktIUj4gQWxsVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb25LSFJFbnVtcyA9IHtWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZLCBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfSURFTlRJVFksIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl83MDksIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl82MDEsIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwLCBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZX0tIUiwgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSX0lERU5USVRZX0tIUiwgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzcwOV9LSFIsIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl82MDFfS0hSLCBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfMjAyMF9LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1NhbXBsZXJZY2JjclJhbmdlS0hSPiBBbGxWa1NhbXBsZXJZY2JjclJhbmdlS0hSRW51bXMgPSB7VktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfRlVMTCwgVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XLCBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMX0tIUiwgVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XX0tIUiwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQ2hyb21hTG9jYXRpb25LSFI+IEFsbFZrQ2hyb21hTG9jYXRpb25LSFJFbnVtcyA9IHtWS19DSFJPTUFfTE9DQVRJT05fQ09TSVRFRF9FVkVOLCBWS19DSFJPTUFfTE9DQVRJT05fTUlEUE9JTlQsIFZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU5fS0hSLCBWS19DSFJPTUFfTE9DQVRJT05fTUlEUE9JTlRfS0hSLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtEcml2ZXJJZEtIUj4gQWxsVmtEcml2ZXJJZEtIUkVudW1zID0ge1ZLX0RSSVZFUl9JRF9BTURfUFJPUFJJRVRBUllfS0hSLCBWS19EUklWRVJfSURfQU1EX09QRU5fU09VUkNFX0tIUiwgVktfRFJJVkVSX0lEX01FU0FfUkFEVl9LSFIsIFZLX0RSSVZFUl9JRF9OVklESUFfUFJPUFJJRVRBUllfS0hSLCBWS19EUklWRVJfSURfSU5URUxfUFJPUFJJRVRBUllfV0lORE9XU19LSFIsIFZLX0RSSVZFUl9JRF9JTlRFTF9PUEVOX1NPVVJDRV9NRVNBX0tIUiwgVktfRFJJVkVSX0lEX0lNQUdJTkFUSU9OX1BST1BSSUVUQVJZX0tIUiwgVktfRFJJVkVSX0lEX1FVQUxDT01NX1BST1BSSUVUQVJZX0tIUiwgVktfRFJJVkVSX0lEX0FSTV9QUk9QUklFVEFSWV9LSFIsIFZLX0RSSVZFUl9JRF9HT09HTEVfU1dJRlRTSEFERVJfS0hSLCBWS19EUklWRVJfSURfR0dQX1BST1BSSUVUQVJZX0tIUiwgVktfRFJJVkVSX0lEX0JST0FEQ09NX1BST1BSSUVUQVJZX0tIUiwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUj4gQWxsVmtTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSRW51bXMgPSB7VktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV8zMl9CSVRfT05MWV9LSFIsIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfQUxMX0tIUiwgVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9OT05FX0tIUiwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrU2VtYXBob3JlVHlwZUtIUj4gQWxsVmtTZW1hcGhvcmVUeXBlS0hSRW51bXMgPSB7VktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiwgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNGb3JtYXRLSFI+IEFsbFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljRm9ybWF0S0hSRW51bXMgPSB7VktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX0JPT0wzMl9LSFIsIFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9JTlQ2NF9LSFIsIFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9VSU5UNjRfS0hSLCBWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfRkxPQVQ2NF9LSFIsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVD4gQWxsVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFRFbnVtcyA9IHtWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTlNUQU5DRV9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GRU5DRV9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVSWV9QT09MX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRV9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFJfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0tIUl9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fS0hSX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrUmFzdGVyaXphdGlvbk9yZGVyQU1EPiBBbGxWa1Jhc3Rlcml6YXRpb25PcmRlckFNREVudW1zID0ge1ZLX1JBU1RFUklaQVRJT05fT1JERVJfU1RSSUNUX0FNRCwgVktfUkFTVEVSSVpBVElPTl9PUkRFUl9SRUxBWEVEX0FNRCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrU2hhZGVySW5mb1R5cGVBTUQ+IEFsbFZrU2hhZGVySW5mb1R5cGVBTURFbnVtcyA9IHtWS19TSEFERVJfSU5GT19UWVBFX1NUQVRJU1RJQ1NfQU1ELCBWS19TSEFERVJfSU5GT19UWVBFX0JJTkFSWV9BTUQsIFZLX1NIQURFUl9JTkZPX1RZUEVfRElTQVNTRU1CTFlfQU1ELCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtWYWxpZGF0aW9uQ2hlY2tFWFQ+IEFsbFZrVmFsaWRhdGlvbkNoZWNrRVhURW51bXMgPSB7VktfVkFMSURBVElPTl9DSEVDS19BTExfRVhULCBWS19WQUxJREFUSU9OX0NIRUNLX1NIQURFUlNfRVhULCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYPiBBbGxWa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlhFbnVtcyA9IHtWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX1BJUEVMSU5FX05WWCwgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ERVNDUklQVE9SX1NFVF9OVlgsIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfSU5ERVhfQlVGRkVSX05WWCwgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9WRVJURVhfQlVGRkVSX05WWCwgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9QVVNIX0NPTlNUQU5UX05WWCwgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9EUkFXX0lOREVYRURfTlZYLCBWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0RSQVdfTlZYLCBWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0RJU1BBVENIX05WWCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrT2JqZWN0RW50cnlUeXBlTlZYPiBBbGxWa09iamVjdEVudHJ5VHlwZU5WWEVudW1zID0ge1ZLX09CSkVDVF9FTlRSWV9UWVBFX0RFU0NSSVBUT1JfU0VUX05WWCwgVktfT0JKRUNUX0VOVFJZX1RZUEVfUElQRUxJTkVfTlZYLCBWS19PQkpFQ1RfRU5UUllfVFlQRV9JTkRFWF9CVUZGRVJfTlZYLCBWS19PQkpFQ1RfRU5UUllfVFlQRV9WRVJURVhfQlVGRkVSX05WWCwgVktfT0JKRUNUX0VOVFJZX1RZUEVfUFVTSF9DT05TVEFOVF9OVlgsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0Rpc3BsYXlQb3dlclN0YXRlRVhUPiBBbGxWa0Rpc3BsYXlQb3dlclN0YXRlRVhURW51bXMgPSB7VktfRElTUExBWV9QT1dFUl9TVEFURV9PRkZfRVhULCBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX1NVU1BFTkRfRVhULCBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX09OX0VYVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrRGV2aWNlRXZlbnRUeXBlRVhUPiBBbGxWa0RldmljZUV2ZW50VHlwZUVYVEVudW1zID0ge1ZLX0RFVklDRV9FVkVOVF9UWVBFX0RJU1BMQVlfSE9UUExVR19FWFQsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0Rpc3BsYXlFdmVudFR5cGVFWFQ+IEFsbFZrRGlzcGxheUV2ZW50VHlwZUVYVEVudW1zID0ge1ZLX0RJU1BMQVlfRVZFTlRfVFlQRV9GSVJTVF9QSVhFTF9PVVRfRVhULCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlY+IEFsbFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WRW51bXMgPSB7VktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1hfTlYsIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9ORUdBVElWRV9YX05WLCBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfWV9OViwgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX05FR0FUSVZFX1lfTlYsIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9aX05WLCBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfWl9OViwgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1dfTlYsIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9ORUdBVElWRV9XX05WLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVD4gQWxsVmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVEVudW1zID0ge1ZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfSU5DTFVTSVZFX0VYVCwgVktfRElTQ0FSRF9SRUNUQU5HTEVfTU9ERV9FWENMVVNJVkVfRVhULCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVD4gQWxsVmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVEVudW1zID0ge1ZLX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX01PREVfRElTQUJMRURfRVhULCBWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX09WRVJFU1RJTUFURV9FWFQsIFZLX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX01PREVfVU5ERVJFU1RJTUFURV9FWFQsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUPiBBbGxWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhURW51bXMgPSB7VktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9XRUlHSFRFRF9BVkVSQUdFX0VYVCwgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhULCBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0JsZW5kT3ZlcmxhcEVYVD4gQWxsVmtCbGVuZE92ZXJsYXBFWFRFbnVtcyA9IHtWS19CTEVORF9PVkVSTEFQX1VOQ09SUkVMQVRFRF9FWFQsIFZLX0JMRU5EX09WRVJMQVBfRElTSk9JTlRfRVhULCBWS19CTEVORF9PVkVSTEFQX0NPTkpPSU5UX0VYVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQ292ZXJhZ2VNb2R1bGF0aW9uTW9kZU5WPiBBbGxWa0NvdmVyYWdlTW9kdWxhdGlvbk1vZGVOVkVudW1zID0ge1ZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9OT05FX05WLCBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfUkdCX05WLCBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfQUxQSEFfTlYsIFZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9SR0JBX05WLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtWYWxpZGF0aW9uQ2FjaGVIZWFkZXJWZXJzaW9uRVhUPiBBbGxWa1ZhbGlkYXRpb25DYWNoZUhlYWRlclZlcnNpb25FWFRFbnVtcyA9IHtWS19WQUxJREFUSU9OX0NBQ0hFX0hFQURFUl9WRVJTSU9OX09ORV9FWFQsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlY+IEFsbFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVkVudW1zID0ge1ZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZX05PX0lOVk9DQVRJT05TX05WLCBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xNl9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYsIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzhfSU5WT0NBVElPTlNfUEVSX1BJWEVMX05WLCBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV80X0lOVk9DQVRJT05TX1BFUl9QSVhFTF9OViwgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMl9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYsIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfUElYRUxfTlYsIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfMlgxX1BJWEVMU19OViwgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8xWDJfUElYRUxTX05WLCBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYMl9QSVhFTFNfTlYsIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfNFgyX1BJWEVMU19OViwgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8yWDRfUElYRUxTX05WLCBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzRYNF9QSVhFTFNfTlYsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WPiBBbGxWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WRW51bXMgPSB7VktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX0RFRkFVTFRfTlYsIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9DVVNUT01fTlYsIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9QSVhFTF9NQUpPUl9OViwgVktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX1NBTVBMRV9NQUpPUl9OViwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WPiBBbGxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOVkVudW1zID0ge1ZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9UT1BfTEVWRUxfTlYsIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlYsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOVj4gQWxsVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBUeXBlTlZFbnVtcyA9IHtWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WLCBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9UUklBTkdMRVNfSElUX0dST1VQX05WLCBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9QUk9DRURVUkFMX0hJVF9HUk9VUF9OViwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrR2VvbWV0cnlUeXBlTlY+IEFsbFZrR2VvbWV0cnlUeXBlTlZFbnVtcyA9IHtWS19HRU9NRVRSWV9UWVBFX1RSSUFOR0xFU19OViwgVktfR0VPTUVUUllfVFlQRV9BQUJCU19OViwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOVj4gQWxsVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WRW51bXMgPSB7VktfQ09QWV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01PREVfQ0xPTkVfTlYsIFZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NPTVBBQ1RfTlYsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOVj4gQWxsVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlZFbnVtcyA9IHtWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9PQkpFQ1RfTlYsIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX0JVSUxEX1NDUkFUQ0hfTlYsIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX1VQREFURV9TQ1JBVENIX05WLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtRdWV1ZUdsb2JhbFByaW9yaXR5RVhUPiBBbGxWa1F1ZXVlR2xvYmFsUHJpb3JpdHlFWFRFbnVtcyA9IHtWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfTE9XX0VYVCwgVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX01FRElVTV9FWFQsIFZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9ISUdIX0VYVCwgVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX1JFQUxUSU1FX0VYVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrVGltZURvbWFpbkVYVD4gQWxsVmtUaW1lRG9tYWluRVhURW51bXMgPSB7VktfVElNRV9ET01BSU5fREVWSUNFX0VYVCwgVktfVElNRV9ET01BSU5fQ0xPQ0tfTU9OT1RPTklDX0VYVCwgVktfVElNRV9ET01BSU5fQ0xPQ0tfTU9OT1RPTklDX1JBV19FWFQsIFZLX1RJTUVfRE9NQUlOX1FVRVJZX1BFUkZPUk1BTkNFX0NPVU5URVJfRVhULCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EPiBBbGxWa01lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTURFbnVtcyA9IHtWS19NRU1PUllfT1ZFUkFMTE9DQVRJT05fQkVIQVZJT1JfREVGQVVMVF9BTUQsIFZLX01FTU9SWV9PVkVSQUxMT0NBVElPTl9CRUhBVklPUl9BTExPV0VEX0FNRCwgVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RJU0FMTE9XRURfQU1ELCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUw+IEFsbFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uVHlwZUlOVEVMRW51bXMgPSB7VktfUEVSRk9STUFOQ0VfQ09ORklHVVJBVElPTl9UWVBFX0NPTU1BTkRfUVVFVUVfTUVUUklDU19ESVNDT1ZFUllfQUNUSVZBVEVEX0lOVEVMLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTD4gQWxsVmtRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTEVudW1zID0ge1ZLX1FVRVJZX1BPT0xfU0FNUExJTkdfTU9ERV9NQU5VQUxfSU5URUwsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1BlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUw+IEFsbFZrUGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTEVudW1zID0ge1ZLX1BFUkZPUk1BTkNFX09WRVJSSURFX1RZUEVfTlVMTF9IQVJEV0FSRV9JTlRFTCwgVktfUEVSRk9STUFOQ0VfT1ZFUlJJREVfVFlQRV9GTFVTSF9HUFVfQ0FDSEVTX0lOVEVMLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTD4gQWxsVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTEVudW1zID0ge1ZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX0hXX0NPVU5URVJTX1NVUFBPUlRFRF9JTlRFTCwgVktfUEVSRk9STUFOQ0VfUEFSQU1FVEVSX1RZUEVfU1RSRUFNX01BUktFUl9WQUxJRF9CSVRTX0lOVEVMLCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMPiBBbGxWa1BlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUxFbnVtcyA9IHtWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX1VJTlQzMl9JTlRFTCwgVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9VSU5UNjRfSU5URUwsIFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfRkxPQVRfSU5URUwsIFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfQk9PTF9JTlRFTCwgVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9TVFJJTkdfSU5URUwsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUPiBBbGxWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhURW51bXMgPSB7VktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhULCBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9SRVNFUlZFX0JJTkRJTkdfU0xPVF9FWFQsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfQkVTVF9QUkFDVElDRVNfRVhULCB9OworY29uc3Qgc3RkOjp2ZWN0b3I8VmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQ+IEFsbFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhURW51bXMgPSB7VktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQUxMX0VYVCwgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfU0hBREVSU19FWFQsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1RIUkVBRF9TQUZFVFlfRVhULCBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BUElfUEFSQU1FVEVSU19FWFQsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX09CSkVDVF9MSUZFVElNRVNfRVhULCBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9DT1JFX0NIRUNLU19FWFQsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1VOSVFVRV9IQU5ETEVTX0VYVCwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrQ29tcG9uZW50VHlwZU5WPiBBbGxWa0NvbXBvbmVudFR5cGVOVkVudW1zID0ge1ZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUMTZfTlYsIFZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUMzJfTlYsIFZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUNjRfTlYsIFZLX0NPTVBPTkVOVF9UWVBFX1NJTlQ4X05WLCBWS19DT01QT05FTlRfVFlQRV9TSU5UMTZfTlYsIFZLX0NPTVBPTkVOVF9UWVBFX1NJTlQzMl9OViwgVktfQ09NUE9ORU5UX1RZUEVfU0lOVDY0X05WLCBWS19DT01QT05FTlRfVFlQRV9VSU5UOF9OViwgVktfQ09NUE9ORU5UX1RZUEVfVUlOVDE2X05WLCBWS19DT01QT05FTlRfVFlQRV9VSU5UMzJfTlYsIFZLX0NPTVBPTkVOVF9UWVBFX1VJTlQ2NF9OViwgfTsKK2NvbnN0IHN0ZDo6dmVjdG9yPFZrU2NvcGVOVj4gQWxsVmtTY29wZU5WRW51bXMgPSB7VktfU0NPUEVfREVWSUNFX05WLCBWS19TQ09QRV9XT1JLR1JPVVBfTlYsIFZLX1NDT1BFX1NVQkdST1VQX05WLCBWS19TQ09QRV9RVUVVRV9GQU1JTFlfTlYsIH07Citjb25zdCBzdGQ6OnZlY3RvcjxWa0NvdmVyYWdlUmVkdWN0aW9uTW9kZU5WPiBBbGxWa0NvdmVyYWdlUmVkdWN0aW9uTW9kZU5WRW51bXMgPSB7VktfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfTUVSR0VfTlYsIFZLX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX1RSVU5DQVRFX05WLCB9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorY29uc3Qgc3RkOjp2ZWN0b3I8VmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUPiBBbGxWa0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFRFbnVtcyA9IHtWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfREVGQVVMVF9FWFQsIFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BTExPV0VEX0VYVCwgVktfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0RJU0FMTE9XRURfRVhULCBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQVBQTElDQVRJT05fQ09OVFJPTExFRF9FWFQsIH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorY29uc3Qgc3RkOjp2ZWN0b3I8VmtMaW5lUmFzdGVyaXphdGlvbk1vZGVFWFQ+IEFsbFZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhURW51bXMgPSB7VktfTElORV9SQVNURVJJWkFUSU9OX01PREVfREVGQVVMVF9FWFQsIFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX0VYVCwgVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfQlJFU0VOSEFNX0VYVCwgVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfU01PT1RIX0VYVCwgfTsKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlZhbGlkYXRlUG5leHRTdHJ1Y3RDb250ZW50cyhjb25zdCBjaGFyICphcGlfbmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmcGFyYW1ldGVyX25hbWUsIGNvbnN0IFZrQmFzZU91dFN0cnVjdHVyZSogaGVhZGVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc3dpdGNoKGhlYWRlci0+c1R5cGUpIHsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyIsICJzdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MiLCBzdHJ1Y3R1cmUtPnN0b3JhZ2VCdWZmZXIxNkJpdEFjY2Vzcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMiLCAidW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyIsIHN0cnVjdHVyZS0+dW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2Vzcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMiLCAic3RvcmFnZVB1c2hDb25zdGFudDE2Iiwgc3RydWN0dXJlLT5zdG9yYWdlUHVzaENvbnN0YW50MTYpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzIiwgInN0b3JhZ2VJbnB1dE91dHB1dDE2Iiwgc3RydWN0dXJlLT5zdG9yYWdlSW5wdXRPdXRwdXQxNik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk86IHsKKyAgICAgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gKnN0cnVjdHVyZSA9IChWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8iLCAiZmxhZ3MiLCAiVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIiwgQWxsVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mby1mbGFncy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk86IHsKKyAgICAgICAgICAgIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvICpzdHJ1Y3R1cmUgPSAoVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8iLCAiZGV2aWNlUmVuZGVyQXJlYUNvdW50IiwgInBEZXZpY2VSZW5kZXJBcmVhcyIsIHN0cnVjdHVyZS0+ZGV2aWNlUmVuZGVyQXJlYUNvdW50LCAmc3RydWN0dXJlLT5wRGV2aWNlUmVuZGVyQXJlYXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8tcERldmljZVJlbmRlckFyZWFzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5wRGV2aWNlUmVuZGVyQXJlYXMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRldmljZVJlbmRlckFyZWFJbmRleCA9IDA7IGRldmljZVJlbmRlckFyZWFJbmRleCA8IHN0cnVjdHVyZS0+ZGV2aWNlUmVuZGVyQXJlYUNvdW50OyArK2RldmljZVJlbmRlckFyZWFJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1VCTUlUX0lORk86IHsKKyAgICAgICAgICAgIFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvICpzdHJ1Y3R1cmUgPSAoVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8iLCAid2FpdFNlbWFwaG9yZUNvdW50IiwgInBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyIsIHN0cnVjdHVyZS0+d2FpdFNlbWFwaG9yZUNvdW50LCAmc3RydWN0dXJlLT5wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa0RldmljZUdyb3VwU3VibWl0SW5mbyIsICJjb21tYW5kQnVmZmVyQ291bnQiLCAicENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcyIsIHN0cnVjdHVyZS0+Y29tbWFuZEJ1ZmZlckNvdW50LCAmc3RydWN0dXJlLT5wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLXBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvIiwgInNpZ25hbFNlbWFwaG9yZUNvdW50IiwgInBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzIiwgc3RydWN0dXJlLT5zaWduYWxTZW1hcGhvcmVDb3VudCwgJnN0cnVjdHVyZS0+cFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfREVWSUNFX0dST1VQX0lORk86IHsKKyAgICAgICAgICAgIFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyAqc3RydWN0dXJlID0gKFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8iLCAiZGV2aWNlSW5kZXhDb3VudCIsICJwRGV2aWNlSW5kaWNlcyIsIHN0cnVjdHVyZS0+ZGV2aWNlSW5kZXhDb3VudCwgJnN0cnVjdHVyZS0+cERldmljZUluZGljZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvLXBEZXZpY2VJbmRpY2VzLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzogeworICAgICAgICAgICAgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gKnN0cnVjdHVyZSA9IChWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyIsICJkZXZpY2VJbmRleENvdW50IiwgInBEZXZpY2VJbmRpY2VzIiwgc3RydWN0dXJlLT5kZXZpY2VJbmRleENvdW50LCAmc3RydWN0dXJlLT5wRGV2aWNlSW5kaWNlcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1wRGV2aWNlSW5kaWNlcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8iLCAic3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCIsICJwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zIiwgc3RydWN0dXJlLT5zcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50LCAmc3RydWN0dXJlLT5wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLXBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uSW5kZXggPSAwOyBzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkluZGV4IDwgc3RydWN0dXJlLT5zcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50OyArK3NwbGl0SW5zdGFuY2VCaW5kUmVnaW9uSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTzogeworICAgICAgICAgICAgVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gKnN0cnVjdHVyZSA9IChWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyIsICJwaHlzaWNhbERldmljZUNvdW50IiwgInBQaHlzaWNhbERldmljZXMiLCBzdHJ1Y3R1cmUtPnBoeXNpY2FsRGV2aWNlQ291bnQsICZzdHJ1Y3R1cmUtPnBQaHlzaWNhbERldmljZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8tcFBoeXNpY2FsRGV2aWNlcy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMucm9idXN0QnVmZmVyQWNjZXNzIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5yb2J1c3RCdWZmZXJBY2Nlc3MpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5mdWxsRHJhd0luZGV4VWludDMyIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5mdWxsRHJhd0luZGV4VWludDMyKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuaW1hZ2VDdWJlQXJyYXkiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLmltYWdlQ3ViZUFycmF5KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuaW5kZXBlbmRlbnRCbGVuZCIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuaW5kZXBlbmRlbnRCbGVuZCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLmdlb21ldHJ5U2hhZGVyIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5nZW9tZXRyeVNoYWRlcik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnRlc3NlbGxhdGlvblNoYWRlciIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMudGVzc2VsbGF0aW9uU2hhZGVyKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc2FtcGxlUmF0ZVNoYWRpbmciLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNhbXBsZVJhdGVTaGFkaW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuZHVhbFNyY0JsZW5kIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5kdWFsU3JjQmxlbmQpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5sb2dpY09wIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5sb2dpY09wKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMubXVsdGlEcmF3SW5kaXJlY3QiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLm11bHRpRHJhd0luZGlyZWN0KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLmRlcHRoQ2xhbXAiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLmRlcHRoQ2xhbXApOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5kZXB0aEJpYXNDbGFtcCIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuZGVwdGhCaWFzQ2xhbXApOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5maWxsTW9kZU5vblNvbGlkIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5maWxsTW9kZU5vblNvbGlkKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuZGVwdGhCb3VuZHMiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLmRlcHRoQm91bmRzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMud2lkZUxpbmVzIiwgc3RydWN0dXJlLT5mZWF0dXJlcy53aWRlTGluZXMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5sYXJnZVBvaW50cyIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMubGFyZ2VQb2ludHMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5hbHBoYVRvT25lIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5hbHBoYVRvT25lKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMubXVsdGlWaWV3cG9ydCIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMubXVsdGlWaWV3cG9ydCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNhbXBsZXJBbmlzb3Ryb3B5Iiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zYW1wbGVyQW5pc290cm9weSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnRleHR1cmVDb21wcmVzc2lvbkVUQzIiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnRleHR1cmVDb21wcmVzc2lvbkVUQzIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy50ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUiIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMudGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy50ZXh0dXJlQ29tcHJlc3Npb25CQyIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMudGV4dHVyZUNvbXByZXNzaW9uQkMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5vY2NsdXNpb25RdWVyeVByZWNpc2UiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLm9jY2x1c2lvblF1ZXJ5UHJlY2lzZSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5Iiwgc3RydWN0dXJlLT5mZWF0dXJlcy5waXBlbGluZVN0YXRpc3RpY3NRdWVyeSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMudmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5mcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuc2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zaGFkZXJJbWFnZUdhdGhlckV4dGVuZGVkIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zaGFkZXJJbWFnZUdhdGhlckV4dGVuZGVkKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zaGFkZXJTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZSIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuc2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdCIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuc2hhZGVyU3RvcmFnZUltYWdlUmVhZFdpdGhvdXRGb3JtYXQpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXQiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNoYWRlclNhbXBsZWRJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zaGFkZXJTdG9yYWdlSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmcpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zaGFkZXJDbGlwRGlzdGFuY2UiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNoYWRlckNsaXBEaXN0YW5jZSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNoYWRlckN1bGxEaXN0YW5jZSIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuc2hhZGVyQ3VsbERpc3RhbmNlKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc2hhZGVyRmxvYXQ2NCIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuc2hhZGVyRmxvYXQ2NCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNoYWRlckludDY0Iiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zaGFkZXJJbnQ2NCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNoYWRlckludDE2Iiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zaGFkZXJJbnQxNik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNoYWRlclJlc291cmNlUmVzaWRlbmN5Iiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNoYWRlclJlc291cmNlTWluTG9kIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zaGFkZXJSZXNvdXJjZU1pbkxvZCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNwYXJzZUJpbmRpbmciLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNwYXJzZUJpbmRpbmcpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3lCdWZmZXIiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeUJ1ZmZlcik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIiwgImZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeUltYWdlMkQiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeUltYWdlMkQpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3lJbWFnZTNEIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3lJbWFnZTNEKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5MlNhbXBsZXMiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeTRTYW1wbGVzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeThTYW1wbGVzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJmZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3lBbGlhc2VkIiwgc3RydWN0dXJlLT5mZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3lBbGlhc2VkKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMudmFyaWFibGVNdWx0aXNhbXBsZVJhdGUiLCBzdHJ1Y3R1cmUtPmZlYXR1cmVzLnZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIiLCAiZmVhdHVyZXMuaW5oZXJpdGVkUXVlcmllcyIsIHN0cnVjdHVyZS0+ZmVhdHVyZXMuaW5oZXJpdGVkUXVlcmllcyk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk86IHsKKyAgICAgICAgICAgIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gKnN0cnVjdHVyZSA9IChWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8iLCAiYXNwZWN0UmVmZXJlbmNlQ291bnQiLCAicEFzcGVjdFJlZmVyZW5jZXMiLCBzdHJ1Y3R1cmUtPmFzcGVjdFJlZmVyZW5jZUNvdW50LCAmc3RydWN0dXJlLT5wQXNwZWN0UmVmZXJlbmNlcywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mby1hc3BlY3RSZWZlcmVuY2VDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELVZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8tcEFzcGVjdFJlZmVyZW5jZXMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnBBc3BlY3RSZWZlcmVuY2VzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBhc3BlY3RSZWZlcmVuY2VJbmRleCA9IDA7IGFzcGVjdFJlZmVyZW5jZUluZGV4IDwgc3RydWN0dXJlLT5hc3BlY3RSZWZlcmVuY2VDb3VudDsgKythc3BlY3RSZWZlcmVuY2VJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8iLCBQYXJhbWV0ZXJOYW1lKCJwQXNwZWN0UmVmZXJlbmNlc1slaV0uYXNwZWN0TWFzayIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhc3BlY3RSZWZlcmVuY2VJbmRleCB9KSwgIlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIsIEFsbFZrSW1hZ2VBc3BlY3RGbGFnQml0cywgc3RydWN0dXJlLT5wQXNwZWN0UmVmZXJlbmNlc1thc3BlY3RSZWZlcmVuY2VJbmRleF0uYXNwZWN0TWFzaywga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlLWFzcGVjdE1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2siKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfVVNBR0VfQ1JFQVRFX0lORk86IHsKKyAgICAgICAgICAgIFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvICpzdHJ1Y3R1cmUgPSAoVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8iLCAidXNhZ2UiLCAiVmtJbWFnZVVzYWdlRmxhZ0JpdHMiLCBBbGxWa0ltYWdlVXNhZ2VGbGFnQml0cywgc3RydWN0dXJlLT51c2FnZSwga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvLXVzYWdlLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzayIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPOiB7CisgICAgICAgICAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIiwgImRvbWFpbk9yaWdpbiIsICJWa1Rlc3NlbGxhdGlvbkRvbWFpbk9yaWdpbiIsIEFsbFZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luRW51bXMsIHN0cnVjdHVyZS0+ZG9tYWluT3JpZ2luLCAiVlVJRC1Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvLWRvbWFpbk9yaWdpbi1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk86IHsKKyAgICAgICAgICAgIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gKnN0cnVjdHVyZSA9IChWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8iLCAic3VicGFzc0NvdW50IiwgInBWaWV3TWFza3MiLCBzdHJ1Y3R1cmUtPnN1YnBhc3NDb3VudCwgJnN0cnVjdHVyZS0+cFZpZXdNYXNrcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvLXBWaWV3TWFza3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8iLCAiZGVwZW5kZW5jeUNvdW50IiwgInBWaWV3T2Zmc2V0cyIsIHN0cnVjdHVyZS0+ZGVwZW5kZW5jeUNvdW50LCAmc3RydWN0dXJlLT5wVmlld09mZnNldHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby1wVmlld09mZnNldHMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8iLCAiY29ycmVsYXRpb25NYXNrQ291bnQiLCAicENvcnJlbGF0aW9uTWFza3MiLCBzdHJ1Y3R1cmUtPmNvcnJlbGF0aW9uTWFza0NvdW50LCAmc3RydWN0dXJlLT5wQ29ycmVsYXRpb25NYXNrcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvLXBDb3JyZWxhdGlvbk1hc2tzLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFUzogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMiLCAibXVsdGl2aWV3Iiwgc3RydWN0dXJlLT5tdWx0aXZpZXcpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzIiwgIm11bHRpdmlld0dlb21ldHJ5U2hhZGVyIiwgc3RydWN0dXJlLT5tdWx0aXZpZXdHZW9tZXRyeVNoYWRlcik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMiLCAibXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyIiwgc3RydWN0dXJlLT5tdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFUzogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMiLCAidmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXIiLCBzdHJ1Y3R1cmUtPnZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMiLCAidmFyaWFibGVQb2ludGVycyIsIHN0cnVjdHVyZS0+dmFyaWFibGVQb2ludGVycyk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUzogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMiLCAicHJvdGVjdGVkTWVtb3J5Iiwgc3RydWN0dXJlLT5wcm90ZWN0ZWRNZW1vcnkpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUFJPVEVDVEVEX1NVQk1JVF9JTkZPOiB7CisgICAgICAgICAgICBWa1Byb3RlY3RlZFN1Ym1pdEluZm8gKnN0cnVjdHVyZSA9IChWa1Byb3RlY3RlZFN1Ym1pdEluZm8gKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUHJvdGVjdGVkU3VibWl0SW5mbyIsICJwcm90ZWN0ZWRTdWJtaXQiLCBzdHJ1Y3R1cmUtPnByb3RlY3RlZFN1Ym1pdCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk86IHsKKyAgICAgICAgICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gKnN0cnVjdHVyZSA9IChWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIiwgImNvbnZlcnNpb24iLCBzdHJ1Y3R1cmUtPmNvbnZlcnNpb24pOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPOiB7CisgICAgICAgICAgICBWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyAqc3RydWN0dXJlID0gKFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIiwgInBsYW5lQXNwZWN0IiwgIlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIsIEFsbFZrSW1hZ2VBc3BlY3RGbGFnQml0cywgc3RydWN0dXJlLT5wbGFuZUFzcGVjdCwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1wbGFuZUFzcGVjdC1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1wbGFuZUFzcGVjdC1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9QTEFORV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk86IHsKKyAgICAgICAgICAgIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gKnN0cnVjdHVyZSA9IChWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8iLCAicGxhbmVBc3BlY3QiLCAiVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiwgQWxsVmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBzdHJ1Y3R1cmUtPnBsYW5lQXNwZWN0LCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8tcGxhbmVBc3BlY3QtcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mby1wbGFuZUFzcGVjdC1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyIsICJzYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgc3RydWN0dXJlLT5zYW1wbGVyWWNiY3JDb252ZXJzaW9uKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTzogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyIsICJoYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPmhhbmRsZVR5cGUsIGtPcHRpb25hbFNpbmdsZUJpdCwgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPOiB7CisgICAgICAgICAgICBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvICpzdHJ1Y3R1cmUgPSAoVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIiwgImhhbmRsZVR5cGVzIiwgIlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPmhhbmRsZVR5cGVzLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvLWhhbmRsZVR5cGVzLXJlcXVpcmVkYml0bWFzayIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfQlVGRkVSX0NSRUFURV9JTkZPOiB7CisgICAgICAgICAgICBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyAqc3RydWN0dXJlID0gKFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvIiwgImhhbmRsZVR5cGVzIiwgIlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPmhhbmRsZVR5cGVzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8taGFuZGxlVHlwZXMtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTzogeworICAgICAgICAgICAgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gKnN0cnVjdHVyZSA9IChWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyIsICJoYW5kbGVUeXBlcyIsICJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cywgc3RydWN0dXJlLT5oYW5kbGVUeXBlcywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvLWhhbmRsZVR5cGVzLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk86IHsKKyAgICAgICAgICAgIFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvICpzdHJ1Y3R1cmUgPSAoVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8iLCAiaGFuZGxlVHlwZXMiLCAiVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPmhhbmRsZVR5cGVzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX0NSRUFURV9JTkZPOiB7CisgICAgICAgICAgICBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gKnN0cnVjdHVyZSA9IChWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvIiwgImhhbmRsZVR5cGVzIiwgIlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPmhhbmRsZVR5cGVzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvLWhhbmRsZVR5cGVzLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19GRUFUVVJFUzogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMiLCAic2hhZGVyRHJhd1BhcmFtZXRlcnMiLCBzdHJ1Y3R1cmUtPnNoYWRlckRyYXdQYXJhbWV0ZXJzKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX1NXQVBDSEFJTl9JTkZPX0tIUjogeworICAgICAgICAgICAgVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSICpzdHJ1Y3R1cmUgPSAoVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIiLCAic3dhcGNoYWluIiwgc3RydWN0dXJlLT5zd2FwY2hhaW4pOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFI6IHsKKyAgICAgICAgICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiAqc3RydWN0dXJlID0gKFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIiLCAic3dhcGNoYWluQ291bnQiLCAicERldmljZU1hc2tzIiwgc3RydWN0dXJlLT5zd2FwY2hhaW5Db3VudCwgJnN0cnVjdHVyZS0+cERldmljZU1hc2tzLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1wRGV2aWNlTWFza3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiIsICJtb2RlIiwgIlZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIiwgQWxsVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIsIHN0cnVjdHVyZS0+bW9kZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItbW9kZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItbW9kZS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFI6IHsKKyAgICAgICAgICAgIFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpzdHJ1Y3R1cmUgPSAoVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIiLCAibW9kZXMiLCAiVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIiLCBBbGxWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiwgc3RydWN0dXJlLT5tb2Rlcywga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1vZGVzLXBhcmFtZXRlciIsICJWVUlELVZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1vZGVzLXJlcXVpcmVkYml0bWFzayIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BSRVNFTlRfSU5GT19LSFI6IHsKKyAgICAgICAgICAgIFZrRGlzcGxheVByZXNlbnRJbmZvS0hSICpzdHJ1Y3R1cmUgPSAoVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrRGlzcGxheVByZXNlbnRJbmZvS0hSIiwgInBlcnNpc3RlbnQiLCBzdHJ1Y3R1cmUtPnBlcnNpc3RlbnQpOworICAgICAgICB9IGJyZWFrOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI6IHsKKyAgICAgICAgICAgIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSICpzdHJ1Y3R1cmUgPSAoVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIiLCAiaGFuZGxlVHlwZSIsICJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cywgc3RydWN0dXJlLT5oYW5kbGVUeXBlLCBrT3B0aW9uYWxTaW5nbGVCaXQsICJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0ZEX0lORk9fS0hSOiB7CisgICAgICAgICAgICBWa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiAqc3RydWN0dXJlID0gKFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSIiwgImhhbmRsZVR5cGUiLCAiVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyIsIEFsbFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMsIHN0cnVjdHVyZS0+aGFuZGxlVHlwZSwga09wdGlvbmFsU2luZ2xlQml0LCAiVlVJRC1Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fS0hSOiB7CisgICAgICAgICAgICBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiAqc3RydWN0dXJlID0gKFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIiwgImFjcXVpcmVDb3VudCIsICJwQWNxdWlyZVN5bmNzIiwgc3RydWN0dXJlLT5hY3F1aXJlQ291bnQsICZzdHJ1Y3R1cmUtPnBBY3F1aXJlU3luY3MsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItcEFjcXVpcmVTeW5jcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIiLCAiYWNxdWlyZUNvdW50IiwgInBBY3F1aXJlS2V5cyIsIHN0cnVjdHVyZS0+YWNxdWlyZUNvdW50LCAmc3RydWN0dXJlLT5wQWNxdWlyZUtleXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItcEFjcXVpcmVLZXlzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiIsICJhY3F1aXJlQ291bnQiLCAicEFjcXVpcmVUaW1lb3V0cyIsIHN0cnVjdHVyZS0+YWNxdWlyZUNvdW50LCAmc3RydWN0dXJlLT5wQWNxdWlyZVRpbWVvdXRzLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBBY3F1aXJlVGltZW91dHMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIiwgInJlbGVhc2VDb3VudCIsICJwUmVsZWFzZVN5bmNzIiwgc3RydWN0dXJlLT5yZWxlYXNlQ291bnQsICZzdHJ1Y3R1cmUtPnBSZWxlYXNlU3luY3MsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItcFJlbGVhc2VTeW5jcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIiLCAicmVsZWFzZUNvdW50IiwgInBSZWxlYXNlS2V5cyIsIHN0cnVjdHVyZS0+cmVsZWFzZUNvdW50LCAmc3RydWN0dXJlLT5wUmVsZWFzZUtleXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItcFJlbGVhc2VLZXlzLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiIsICJzaGFkZXJGbG9hdDE2Iiwgc3RydWN0dXJlLT5zaGFkZXJGbG9hdDE2KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIiwgInNoYWRlckludDgiLCBzdHJ1Y3R1cmUtPnNoYWRlckludDgpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQcmVzZW50UmVnaW9uc0tIUiBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfUkVHSU9OU19LSFI6IHsKKyAgICAgICAgICAgIFZrUHJlc2VudFJlZ2lvbnNLSFIgKnN0cnVjdHVyZSA9IChWa1ByZXNlbnRSZWdpb25zS0hSICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrUHJlc2VudFJlZ2lvbnNLSFIiLCAic3dhcGNoYWluQ291bnQiLCAicFJlZ2lvbnMiLCBzdHJ1Y3R1cmUtPnN3YXBjaGFpbkNvdW50LCAmc3RydWN0dXJlLT5wUmVnaW9ucywgdHJ1ZSwgZmFsc2UsICJWVUlELVZrUHJlc2VudFJlZ2lvbnNLSFItc3dhcGNoYWluQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC1Wa1ByZXNlbnRSZWdpb25zS0hSLXBSZWdpb25zLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5wUmVnaW9ucyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgc3dhcGNoYWluSW5kZXggPSAwOyBzd2FwY2hhaW5JbmRleCA8IHN0cnVjdHVyZS0+c3dhcGNoYWluQ291bnQ7ICsrc3dhcGNoYWluSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5wUmVnaW9uc1tzd2FwY2hhaW5JbmRleF0ucFJlY3RhbmdsZXMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCByZWN0YW5nbGVJbmRleCA9IDA7IHJlY3RhbmdsZUluZGV4IDwgc3RydWN0dXJlLT5wUmVnaW9uc1tzd2FwY2hhaW5JbmRleF0ucmVjdGFuZ2xlQ291bnQ7ICsrcmVjdGFuZ2xlSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiIsICJpbWFnZWxlc3NGcmFtZWJ1ZmZlciIsIHN0cnVjdHVyZS0+aW1hZ2VsZXNzRnJhbWVidWZmZXIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRTX0NSRUFURV9JTkZPX0tIUjogeworICAgICAgICAgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAqc3RydWN0dXJlID0gKFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgiVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiIsICJhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQiLCAicEF0dGFjaG1lbnRJbWFnZUluZm9zIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfSU1BR0VfSU5GT19LSFIiLCBzdHJ1Y3R1cmUtPmF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCwgc3RydWN0dXJlLT5wQXR0YWNobWVudEltYWdlSW5mb3MsIFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfSU1BR0VfSU5GT19LSFIsIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFItcEF0dGFjaG1lbnRJbWFnZUluZm9zLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS0+cEF0dGFjaG1lbnRJbWFnZUluZm9zICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBhdHRhY2htZW50SW1hZ2VJbmZvSW5kZXggPSAwOyBhdHRhY2htZW50SW1hZ2VJbmZvSW5kZXggPCBzdHJ1Y3R1cmUtPmF0dGFjaG1lbnRJbWFnZUluZm9Db3VudDsgKythdHRhY2htZW50SW1hZ2VJbmZvSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIiwgUGFyYW1ldGVyTmFtZSgicEF0dGFjaG1lbnRJbWFnZUluZm9zWyVpXS5mbGFncyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW1hZ2VJbmZvSW5kZXggfSksICJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiLCBBbGxWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMsIHN0cnVjdHVyZS0+cEF0dGFjaG1lbnRJbWFnZUluZm9zW2F0dGFjaG1lbnRJbWFnZUluZm9JbmRleF0uZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIiwgUGFyYW1ldGVyTmFtZSgicEF0dGFjaG1lbnRJbWFnZUluZm9zWyVpXS51c2FnZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW1hZ2VJbmZvSW5kZXggfSksICJWa0ltYWdlVXNhZ2VGbGFnQml0cyIsIEFsbFZrSW1hZ2VVc2FnZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPnBBdHRhY2htZW50SW1hZ2VJbmZvc1thdHRhY2htZW50SW1hZ2VJbmZvSW5kZXhdLnVzYWdlLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFItdXNhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFItdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bV9hcnJheSgiVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiIsIFBhcmFtZXRlck5hbWUoInBBdHRhY2htZW50SW1hZ2VJbmZvc1slaV0udmlld0Zvcm1hdENvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbWFnZUluZm9JbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicEF0dGFjaG1lbnRJbWFnZUluZm9zWyVpXS5wVmlld0Zvcm1hdHMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYXR0YWNobWVudEltYWdlSW5mb0luZGV4IH0pLCAiVmtGb3JtYXQiLCBBbGxWa0Zvcm1hdEVudW1zLCBzdHJ1Y3R1cmUtPnBBdHRhY2htZW50SW1hZ2VJbmZvc1thdHRhY2htZW50SW1hZ2VJbmZvSW5kZXhdLnZpZXdGb3JtYXRDb3VudCwgc3RydWN0dXJlLT5wQXR0YWNobWVudEltYWdlSW5mb3NbYXR0YWNobWVudEltYWdlSW5mb0luZGV4XS5wVmlld0Zvcm1hdHMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQVRUQUNITUVOVF9CRUdJTl9JTkZPX0tIUjogeworICAgICAgICAgICAgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiAqc3RydWN0dXJlID0gKFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiIsICJhdHRhY2htZW50Q291bnQiLCAicEF0dGFjaG1lbnRzIiwgc3RydWN0dXJlLT5hdHRhY2htZW50Q291bnQsICZzdHJ1Y3R1cmUtPnBBdHRhY2htZW50cywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLXBBdHRhY2htZW50cy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfRkVBVFVSRVNfS0hSOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiIsICJwZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzIiwgc3RydWN0dXJlLT5wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIiLCAicGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzIiwgc3RydWN0dXJlLT5wZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHMpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUjogeworICAgICAgICAgICAgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgKnN0cnVjdHVyZSA9IChWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiIsICJjb3VudGVySW5kZXhDb3VudCIsICJwQ291bnRlckluZGljZXMiLCBzdHJ1Y3R1cmUtPmNvdW50ZXJJbmRleENvdW50LCAmc3RydWN0dXJlLT5wQ291bnRlckluZGljZXMsIHRydWUsIHRydWUsICJWVUlELVZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLWNvdW50ZXJJbmRleENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItcENvdW50ZXJJbmRpY2VzLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSOiB7CisgICAgICAgICAgICBWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIgKnN0cnVjdHVyZSA9IChWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bV9hcnJheSgiVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIiwgInZpZXdGb3JtYXRDb3VudCIsICJwVmlld0Zvcm1hdHMiLCAiVmtGb3JtYXQiLCBBbGxWa0Zvcm1hdEVudW1zLCBzdHJ1Y3R1cmUtPnZpZXdGb3JtYXRDb3VudCwgc3RydWN0dXJlLT5wVmlld0Zvcm1hdHMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzhCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFI6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIiwgInN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzIiwgc3RydWN0dXJlLT5zdG9yYWdlQnVmZmVyOEJpdEFjY2Vzcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiIsICJ1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MiLCBzdHJ1Y3R1cmUtPnVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2Vzcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiIsICJzdG9yYWdlUHVzaENvbnN0YW50OCIsIHN0cnVjdHVyZS0+c3RvcmFnZVB1c2hDb25zdGFudDgpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0FUT01JQ19JTlQ2NF9GRUFUVVJFU19LSFI6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIiwgInNoYWRlckJ1ZmZlckludDY0QXRvbWljcyIsIHN0cnVjdHVyZS0+c2hhZGVyQnVmZmVySW50NjRBdG9taWNzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIiwgInNoYWRlclNoYXJlZEludDY0QXRvbWljcyIsIHN0cnVjdHVyZS0+c2hhZGVyU2hhcmVkSW50NjRBdG9taWNzKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DTE9DS19GRUFUVVJFU19LSFI6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSIiwgInNoYWRlclN1Ymdyb3VwQ2xvY2siLCBzdHJ1Y3R1cmUtPnNoYWRlclN1Ymdyb3VwQ2xvY2spOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIiLCAic2hhZGVyRGV2aWNlQ2xvY2siLCBzdHJ1Y3R1cmUtPnNoYWRlckRldmljZUNsb2NrKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fREVQVEhfU1RFTkNJTF9SRVNPTFZFX0tIUjogeworICAgICAgICAgICAgVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSICpzdHJ1Y3R1cmUgPSAoVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiIsICJkZXB0aFJlc29sdmVNb2RlIiwgIlZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiIsIEFsbFZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiwgc3RydWN0dXJlLT5kZXB0aFJlc29sdmVNb2RlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1kZXB0aFJlc29sdmVNb2RlLXBhcmFtZXRlciIsICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1kZXB0aFJlc29sdmVNb2RlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIiLCAic3RlbmNpbFJlc29sdmVNb2RlIiwgIlZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiIsIEFsbFZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiwgc3RydWN0dXJlLT5zdGVuY2lsUmVzb2x2ZU1vZGUsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXN0ZW5jaWxSZXNvbHZlTW9kZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItc3RlbmNpbFJlc29sdmVNb2RlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIiLCAicERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50IiwgIlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSIiwgc3RydWN0dXJlLT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQsIFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSLCBmYWxzZSwgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLXNUeXBlLXNUeXBlIik7CisKKyAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oIlZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiIsICJwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtPmxheW91dCIsICJWa0ltYWdlTGF5b3V0IiwgQWxsVmtJbWFnZUxheW91dEVudW1zLCBzdHJ1Y3R1cmUtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0+bGF5b3V0LCAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9GRUFUVVJFU19LSFI6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIiwgInRpbWVsaW5lU2VtYXBob3JlIiwgc3RydWN0dXJlLT50aW1lbGluZVNlbWFwaG9yZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1RZUEVfQ1JFQVRFX0lORk9fS0hSOiB7CisgICAgICAgICAgICBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSICpzdHJ1Y3R1cmUgPSAoVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSIiwgInNlbWFwaG9yZVR5cGUiLCAiVmtTZW1hcGhvcmVUeXBlS0hSIiwgQWxsVmtTZW1hcGhvcmVUeXBlS0hSRW51bXMsIHN0cnVjdHVyZS0+c2VtYXBob3JlVHlwZSwgIlZVSUQtVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUi1zZW1hcGhvcmVUeXBlLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFI6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIiwgInZ1bGthbk1lbW9yeU1vZGVsIiwgc3RydWN0dXJlLT52dWxrYW5NZW1vcnlNb2RlbCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiIsICJ2dWxrYW5NZW1vcnlNb2RlbERldmljZVNjb3BlIiwgc3RydWN0dXJlLT52dWxrYW5NZW1vcnlNb2RlbERldmljZVNjb3BlKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIiwgInZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWlucyIsIHN0cnVjdHVyZS0+dnVsa2FuTWVtb3J5TW9kZWxBdmFpbGFiaWxpdHlWaXNpYmlsaXR5Q2hhaW5zKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19LSFI6IHsKKyAgICAgICAgICAgIFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiAqc3RydWN0dXJlID0gKFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIiwgInN1cHBvcnRzUHJvdGVjdGVkIiwgc3RydWN0dXJlLT5zdXBwb3J0c1Byb3RlY3RlZCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0VQQVJBVEVfREVQVEhfU1RFTkNJTF9MQVlPVVRTX0ZFQVRVUkVTX0tIUjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIiLCAic2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzIiwgc3RydWN0dXJlLT5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFX1NURU5DSUxfTEFZT1VUX0tIUjogeworICAgICAgICAgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiAqc3RydWN0dXJlID0gKFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgiVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiIsICJzdGVuY2lsTGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHN0cnVjdHVyZS0+c3RlbmNpbExheW91dCwgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUi1zdGVuY2lsTGF5b3V0LXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFI6IHsKKyAgICAgICAgICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiAqc3RydWN0dXJlID0gKFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIiLCAic3RlbmNpbEluaXRpYWxMYXlvdXQiLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgc3RydWN0dXJlLT5zdGVuY2lsSW5pdGlhbExheW91dCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxJbml0aWFsTGF5b3V0LXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIiLCAic3RlbmNpbEZpbmFsTGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHN0cnVjdHVyZS0+c3RlbmNpbEZpbmFsTGF5b3V0LCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEZpbmFsTGF5b3V0LXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1VOSUZPUk1fQlVGRkVSX1NUQU5EQVJEX0xBWU9VVF9GRUFUVVJFU19LSFI6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSIiwgInVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dCIsIHN0cnVjdHVyZS0+dW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0KTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0RFVklDRV9BRERSRVNTX0ZFQVRVUkVTX0tIUjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIiLCAiYnVmZmVyRGV2aWNlQWRkcmVzcyIsIHN0cnVjdHVyZS0+YnVmZmVyRGV2aWNlQWRkcmVzcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIiwgImJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5Iiwgc3RydWN0dXJlLT5idWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIiwgImJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSIsIHN0cnVjdHVyZS0+YnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0ZFQVRVUkVTX0tIUjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIiLCAicGlwZWxpbmVFeGVjdXRhYmxlSW5mbyIsIHN0cnVjdHVyZS0+cGlwZWxpbmVFeGVjdXRhYmxlSW5mbyk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0NSRUFURV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCIsICJmbGFncyIsICJWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQiLCBBbGxWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQsIHN0cnVjdHVyZS0+ZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhULWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoIlZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQiLCAicGZuQ2FsbGJhY2siLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihzdHJ1Y3R1cmUtPnBmbkNhbGxiYWNrKSwgIlZVSUQtVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVC1wZm5DYWxsYmFjay1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1JBU1RFUklaQVRJT05fT1JERVJfQU1EOiB7CisgICAgICAgICAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EIiwgInJhc3Rlcml6YXRpb25PcmRlciIsICJWa1Jhc3Rlcml6YXRpb25PcmRlckFNRCIsIEFsbFZrUmFzdGVyaXphdGlvbk9yZGVyQU1ERW51bXMsIHN0cnVjdHVyZS0+cmFzdGVyaXphdGlvbk9yZGVyLCAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1ELXJhc3Rlcml6YXRpb25PcmRlci1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQ1JFQVRFX0lORk9fTlY6IHsKKyAgICAgICAgICAgIFZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WICpzdHJ1Y3R1cmUgPSAoVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WIiwgImRlZGljYXRlZEFsbG9jYXRpb24iLCBzdHJ1Y3R1cmUtPmRlZGljYXRlZEFsbG9jYXRpb24pOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fQlVGRkVSX0NSRUFURV9JTkZPX05WOiB7CisgICAgICAgICAgICBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgKnN0cnVjdHVyZSA9IChWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViIsICJkZWRpY2F0ZWRBbGxvY2F0aW9uIiwgc3RydWN0dXJlLT5kZWRpY2F0ZWRBbGxvY2F0aW9uKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19GRUFUVVJFU19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUIiwgInRyYW5zZm9ybUZlZWRiYWNrIiwgc3RydWN0dXJlLT50cmFuc2Zvcm1GZWVkYmFjayk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCIsICJnZW9tZXRyeVN0cmVhbXMiLCBzdHJ1Y3R1cmUtPmdlb21ldHJ5U3RyZWFtcyk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfU1RSRUFNX0NSRUFURV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCIsICJmbGFncyIsIHN0cnVjdHVyZS0+ZmxhZ3MsICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1JORVJfU0FNUExFRF9JTUFHRV9GRUFUVVJFU19OVjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYiLCAiY29ybmVyU2FtcGxlZEltYWdlIiwgc3RydWN0dXJlLT5jb3JuZXJTYW1wbGVkSW1hZ2UpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WOiB7CisgICAgICAgICAgICBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgKnN0cnVjdHVyZSA9IChWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIiwgImhhbmRsZVR5cGVzIiwgIlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViIsIEFsbFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViwgc3RydWN0dXJlLT5oYW5kbGVUeXBlcywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVi1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY6IHsKKyAgICAgICAgICAgIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgKnN0cnVjdHVyZSA9IChWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYiLCAiaGFuZGxlVHlwZXMiLCAiVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WIiwgQWxsVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WLCBzdHJ1Y3R1cmUtPmhhbmRsZVR5cGVzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVi1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OVjogeworICAgICAgICAgICAgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViAqc3RydWN0dXJlID0gKFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViIsICJoYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViIsIEFsbFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViwgc3RydWN0dXJlLT5oYW5kbGVUeXBlLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVi1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fTlY6IHsKKyAgICAgICAgICAgIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgKnN0cnVjdHVyZSA9IChWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYiLCAiYWNxdWlyZUNvdW50IiwgInBBY3F1aXJlU3luY3MiLCBzdHJ1Y3R1cmUtPmFjcXVpcmVDb3VudCwgJnN0cnVjdHVyZS0+cEFjcXVpcmVTeW5jcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBBY3F1aXJlU3luY3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYiLCAiYWNxdWlyZUNvdW50IiwgInBBY3F1aXJlS2V5cyIsIHN0cnVjdHVyZS0+YWNxdWlyZUNvdW50LCAmc3RydWN0dXJlLT5wQWNxdWlyZUtleXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1wQWNxdWlyZUtleXMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYiLCAiYWNxdWlyZUNvdW50IiwgInBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcyIsIHN0cnVjdHVyZS0+YWNxdWlyZUNvdW50LCAmc3RydWN0dXJlLT5wQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1wQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYiLCAicmVsZWFzZUNvdW50IiwgInBSZWxlYXNlU3luY3MiLCBzdHJ1Y3R1cmUtPnJlbGVhc2VDb3VudCwgJnN0cnVjdHVyZS0+cFJlbGVhc2VTeW5jcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBSZWxlYXNlU3luY3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYiLCAicmVsZWFzZUNvdW50IiwgInBSZWxlYXNlS2V5cyIsIHN0cnVjdHVyZS0+cmVsZWFzZUNvdW50LCAmc3RydWN0dXJlLT5wUmVsZWFzZUtleXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1wUmVsZWFzZUtleXMtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtWYWxpZGF0aW9uRmxhZ3NFWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZMQUdTX0VYVDogeworICAgICAgICAgICAgVmtWYWxpZGF0aW9uRmxhZ3NFWFQgKnN0cnVjdHVyZSA9IChWa1ZhbGlkYXRpb25GbGFnc0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtX2FycmF5KCJWa1ZhbGlkYXRpb25GbGFnc0VYVCIsICJkaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50IiwgInBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MiLCAiVmtWYWxpZGF0aW9uQ2hlY2tFWFQiLCBBbGxWa1ZhbGlkYXRpb25DaGVja0VYVEVudW1zLCBzdHJ1Y3R1cmUtPmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQsIHN0cnVjdHVyZS0+cERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcywgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWFRVUkVfQ09NUFJFU1NJT05fQVNUQ19IRFJfRkVBVFVSRVNfRVhUOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCIsICJ0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUiIsIHN0cnVjdHVyZS0+dGV4dHVyZUNvbXByZXNzaW9uQVNUQ19IRFIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQ6IHsKKyAgICAgICAgICAgIFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgKnN0cnVjdHVyZSA9IChWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oIlZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQiLCAiZGVjb2RlTW9kZSIsICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIHN0cnVjdHVyZS0+ZGVjb2RlTW9kZSwgIlZVSUQtVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVC1kZWNvZGVNb2RlLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUIiwgImRlY29kZU1vZGVTaGFyZWRFeHBvbmVudCIsIHN0cnVjdHVyZS0+ZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50KTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19GRUFUVVJFU19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIiwgImNvbmRpdGlvbmFsUmVuZGVyaW5nIiwgc3RydWN0dXJlLT5jb25kaXRpb25hbFJlbmRlcmluZyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCIsICJpbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZyIsIHN0cnVjdHVyZS0+aW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmcpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5GT19FWFQ6IHsKKyAgICAgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUICpzdHJ1Y3R1cmUgPSAoVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUIiwgImNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlIiwgc3RydWN0dXJlLT5jb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfV19TQ0FMSU5HX1NUQVRFX0NSRUFURV9JTkZPX05WOiB7CisgICAgICAgICAgICBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViIsICJ2aWV3cG9ydFdTY2FsaW5nRW5hYmxlIiwgc3RydWN0dXJlLT52aWV3cG9ydFdTY2FsaW5nRW5hYmxlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ09VTlRFUl9DUkVBVEVfSU5GT19FWFQ6IHsKKyAgICAgICAgICAgIFZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQiLCAic3VyZmFjZUNvdW50ZXJzIiwgIlZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCIsIEFsbFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCwgc3RydWN0dXJlLT5zdXJmYWNlQ291bnRlcnMsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhULXN1cmZhY2VDb3VudGVycy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEU6IHsKKyAgICAgICAgICAgIFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSAqc3RydWN0dXJlID0gKFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa1ByZXNlbnRUaW1lc0luZm9HT09HTEUiLCAic3dhcGNoYWluQ291bnQiLCAicFRpbWVzIiwgc3RydWN0dXJlLT5zd2FwY2hhaW5Db3VudCwgJnN0cnVjdHVyZS0+cFRpbWVzLCB0cnVlLCBmYWxzZSwgIlZVSUQtVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLXBUaW1lcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS0+cFRpbWVzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBzd2FwY2hhaW5JbmRleCA9IDA7IHN3YXBjaGFpbkluZGV4IDwgc3RydWN0dXJlLT5zd2FwY2hhaW5Db3VudDsgKytzd2FwY2hhaW5JbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1dJWlpMRV9TVEFURV9DUkVBVEVfSU5GT19OVjogeworICAgICAgICAgICAgVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoIlZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViIsICJmbGFncyIsIHN0cnVjdHVyZS0+ZmxhZ3MsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVi1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYiLCAidmlld3BvcnRDb3VudCIsICJwVmlld3BvcnRTd2l6emxlcyIsIHN0cnVjdHVyZS0+dmlld3BvcnRDb3VudCwgJnN0cnVjdHVyZS0+cFZpZXdwb3J0U3dpenpsZXMsIHRydWUsIHRydWUsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVi12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLXBWaWV3cG9ydFN3aXp6bGVzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5wVmlld3BvcnRTd2l6emxlcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgdmlld3BvcnRJbmRleCA9IDA7IHZpZXdwb3J0SW5kZXggPCBzdHJ1Y3R1cmUtPnZpZXdwb3J0Q291bnQ7ICsrdmlld3BvcnRJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oIlZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViIsIFBhcmFtZXRlck5hbWUoInBWaWV3cG9ydFN3aXp6bGVzWyVpXS54IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHZpZXdwb3J0SW5kZXggfSksICJWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViIsIEFsbFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WRW51bXMsIHN0cnVjdHVyZS0+cFZpZXdwb3J0U3dpenpsZXNbdmlld3BvcnRJbmRleF0ueCwgIlZVSUQtVmtWaWV3cG9ydFN3aXp6bGVOVi14LXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oIlZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViIsIFBhcmFtZXRlck5hbWUoInBWaWV3cG9ydFN3aXp6bGVzWyVpXS55IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHZpZXdwb3J0SW5kZXggfSksICJWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViIsIEFsbFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WRW51bXMsIHN0cnVjdHVyZS0+cFZpZXdwb3J0U3dpenpsZXNbdmlld3BvcnRJbmRleF0ueSwgIlZVSUQtVmtWaWV3cG9ydFN3aXp6bGVOVi15LXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oIlZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViIsIFBhcmFtZXRlck5hbWUoInBWaWV3cG9ydFN3aXp6bGVzWyVpXS56IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHZpZXdwb3J0SW5kZXggfSksICJWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViIsIEFsbFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WRW51bXMsIHN0cnVjdHVyZS0+cFZpZXdwb3J0U3dpenpsZXNbdmlld3BvcnRJbmRleF0ueiwgIlZVSUQtVmtWaWV3cG9ydFN3aXp6bGVOVi16LXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oIlZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViIsIFBhcmFtZXRlck5hbWUoInBWaWV3cG9ydFN3aXp6bGVzWyVpXS53IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHZpZXdwb3J0SW5kZXggfSksICJWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViIsIEFsbFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WRW51bXMsIHN0cnVjdHVyZS0+cFZpZXdwb3J0U3dpenpsZXNbdmlld3BvcnRJbmRleF0udywgIlZVSUQtVmtWaWV3cG9ydFN3aXp6bGVOVi13LXBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRElTQ0FSRF9SRUNUQU5HTEVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoIlZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUIiwgImZsYWdzIiwgc3RydWN0dXJlLT5mbGFncywgIlZVSUQtVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgiVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQiLCAiZGlzY2FyZFJlY3RhbmdsZU1vZGUiLCAiVmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVCIsIEFsbFZrRGlzY2FyZFJlY3RhbmdsZU1vZGVFWFRFbnVtcywgc3RydWN0dXJlLT5kaXNjYXJkUmVjdGFuZ2xlTW9kZSwgIlZVSUQtVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQtZGlzY2FyZFJlY3RhbmdsZU1vZGUtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fQ09OU0VSVkFUSVZFX1NUQVRFX0NSRUFURV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCIsICJmbGFncyIsIHN0cnVjdHVyZS0+ZmxhZ3MsICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oIlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUIiwgImNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlIiwgIlZrQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVFWFQiLCBBbGxWa0NvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlRVhURW51bXMsIHN0cnVjdHVyZS0+Y29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGUsICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhULWNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX0NMSVBfRU5BQkxFX0ZFQVRVUkVTX0VYVDogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQiLCAiZGVwdGhDbGlwRW5hYmxlIiwgc3RydWN0dXJlLT5kZXB0aENsaXBFbmFibGUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0RFUFRIX0NMSVBfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoIlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUIiwgImZsYWdzIiwgc3RydWN0dXJlLT5mbGFncywgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUIiwgImRlcHRoQ2xpcEVuYWJsZSIsIHN0cnVjdHVyZS0+ZGVwdGhDbGlwRW5hYmxlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ1JFQVRFX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICpzdHJ1Y3R1cmUgPSAoVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIiwgImZsYWdzIiwgc3RydWN0dXJlLT5mbGFncywgIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIiwgIm1lc3NhZ2VTZXZlcml0eSIsICJWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCIsIEFsbFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhULCBzdHJ1Y3R1cmUtPm1lc3NhZ2VTZXZlcml0eSwga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQtbWVzc2FnZVNldmVyaXR5LXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQtbWVzc2FnZVNldmVyaXR5LXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIiwgIm1lc3NhZ2VUeXBlIiwgIlZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQiLCBBbGxWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhULCBzdHJ1Y3R1cmUtPm1lc3NhZ2VUeXBlLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1tZXNzYWdlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VUeXBlLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoIlZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQiLCAicGZuVXNlckNhbGxiYWNrIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oc3RydWN0dXJlLT5wZm5Vc2VyQ2FsbGJhY2spLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULXBmblVzZXJDYWxsYmFjay1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfSU5GT19BTkRST0lEOiB7CisgICAgICAgICAgICBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICpzdHJ1Y3R1cmUgPSAoVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoIlZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQiLCAiYnVmZmVyIiwgc3RydWN0dXJlLT5idWZmZXIsICJWVUlELVZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtYnVmZmVyLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1JFRFVDVElPTl9NT0RFX0NSRUFURV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCIsICJyZWR1Y3Rpb25Nb2RlIiwgIlZrU2FtcGxlclJlZHVjdGlvbk1vZGVFWFQiLCBBbGxWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhURW51bXMsIHN0cnVjdHVyZS0+cmVkdWN0aW9uTW9kZSwgIlZVSUQtVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQtcmVkdWN0aW9uTW9kZS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUIiwgImlubGluZVVuaWZvcm1CbG9jayIsIHN0cnVjdHVyZS0+aW5saW5lVW5pZm9ybUJsb2NrKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCIsICJkZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZCIsIHN0cnVjdHVyZS0+ZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVF9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ6IHsKKyAgICAgICAgICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUICpzdHJ1Y3R1cmUgPSAoVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQiLCAiZGF0YVNpemUiLCAicERhdGEiLCBzdHJ1Y3R1cmUtPmRhdGFTaXplLCAmc3RydWN0dXJlLT5wRGF0YSwgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQtZGF0YVNpemUtYXJyYXlsZW5ndGgiLCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVC1wRGF0YS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQ6IHsKKyAgICAgICAgICAgIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQiLCAic2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwiLCAiVmtTYW1wbGVDb3VudEZsYWdCaXRzIiwgQWxsVmtTYW1wbGVDb3VudEZsYWdCaXRzLCBzdHJ1Y3R1cmUtPnNhbXBsZUxvY2F0aW9uc1BlclBpeGVsLCBrT3B0aW9uYWxTaW5nbGVCaXQsICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbC1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIiwgInNhbXBsZUxvY2F0aW9uc0NvdW50IiwgInBTYW1wbGVMb2NhdGlvbnMiLCBzdHJ1Y3R1cmUtPnNhbXBsZUxvY2F0aW9uc0NvdW50LCAmc3RydWN0dXJlLT5wU2FtcGxlTG9jYXRpb25zLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1wU2FtcGxlTG9jYXRpb25zLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5wU2FtcGxlTG9jYXRpb25zICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBzYW1wbGVMb2NhdGlvbnNJbmRleCA9IDA7IHNhbXBsZUxvY2F0aW9uc0luZGV4IDwgc3RydWN0dXJlLT5zYW1wbGVMb2NhdGlvbnNDb3VudDsgKytzYW1wbGVMb2NhdGlvbnNJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfU0FNUExFX0xPQ0FUSU9OU19CRUdJTl9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUICpzdHJ1Y3R1cmUgPSAoVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCIsICJhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50IiwgInBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyIsIHN0cnVjdHVyZS0+YXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudCwgJnN0cnVjdHVyZS0+cEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVC1wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNJbmRleCA9IDA7IGF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zSW5kZXggPCBzdHJ1Y3R1cmUtPmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQ7ICsrYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoIlZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCIsIFBhcmFtZXRlck5hbWUoInBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc1slaV0uc2FtcGxlTG9jYXRpb25zSW5mbyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0luZGV4IH0pLCAiVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVCIsICYoc3RydWN0dXJlLT5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNbYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNJbmRleF0uc2FtcGxlTG9jYXRpb25zSW5mbyksIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXNUeXBlLXNUeXBlIik7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygiVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIiwgUGFyYW1ldGVyTmFtZSgicEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zWyVpXS5zYW1wbGVMb2NhdGlvbnNJbmZvLnNhbXBsZUxvY2F0aW9uc1BlclBpeGVsIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zSW5kZXggfSksICJWa1NhbXBsZUNvdW50RmxhZ0JpdHMiLCBBbGxWa1NhbXBsZUNvdW50RmxhZ0JpdHMsIHN0cnVjdHVyZS0+cEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zW2F0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zSW5kZXhdLnNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwsIGtPcHRpb25hbFNpbmdsZUJpdCwgIlZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXNhbXBsZUxvY2F0aW9uc1BlclBpeGVsLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCIsIFBhcmFtZXRlck5hbWUoInBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc1slaV0uc2FtcGxlTG9jYXRpb25zSW5mby5zYW1wbGVMb2NhdGlvbnNDb3VudCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNbJWldLnNhbXBsZUxvY2F0aW9uc0luZm8ucFNhbXBsZUxvY2F0aW9ucyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0luZGV4IH0pLCBzdHJ1Y3R1cmUtPnBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc1thdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0luZGV4XS5zYW1wbGVMb2NhdGlvbnNJbmZvLnNhbXBsZUxvY2F0aW9uc0NvdW50LCAmc3RydWN0dXJlLT5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNbYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNJbmRleF0uc2FtcGxlTG9jYXRpb25zSW5mby5wU2FtcGxlTG9jYXRpb25zLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1wU2FtcGxlTG9jYXRpb25zLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc1thdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0luZGV4XS5zYW1wbGVMb2NhdGlvbnNJbmZvLnBTYW1wbGVMb2NhdGlvbnMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBzYW1wbGVMb2NhdGlvbnNJbmRleCA9IDA7IHNhbXBsZUxvY2F0aW9uc0luZGV4IDwgc3RydWN0dXJlLT5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNbYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNJbmRleF0uc2FtcGxlTG9jYXRpb25zSW5mby5zYW1wbGVMb2NhdGlvbnNDb3VudDsgKytzYW1wbGVMb2NhdGlvbnNJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIiwgInBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQiLCAicFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zIiwgc3RydWN0dXJlLT5wb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0NvdW50LCAmc3RydWN0dXJlLT5wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhULXBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS0+cFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBwb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0luZGV4ID0gMDsgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNJbmRleCA8IHN0cnVjdHVyZS0+cG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDsgKytwb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0luZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgiVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIiwgUGFyYW1ldGVyTmFtZSgicFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zWyVpXS5zYW1wbGVMb2NhdGlvbnNJbmZvIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zSW5kZXggfSksICJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhUIiwgJihzdHJ1Y3R1cmUtPnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc1twb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0luZGV4XS5zYW1wbGVMb2NhdGlvbnNJbmZvKSwgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVCwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQtc1R5cGUtc1R5cGUiKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQiLCBQYXJhbWV0ZXJOYW1lKCJwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNbJWldLnNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNJbmRleCB9KSwgIlZrU2FtcGxlQ291bnRGbGFnQml0cyIsIEFsbFZrU2FtcGxlQ291bnRGbGFnQml0cywgc3RydWN0dXJlLT5wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNbcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNJbmRleF0uc2FtcGxlTG9jYXRpb25zSW5mby5zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbCwga09wdGlvbmFsU2luZ2xlQml0LCAiVlVJRC1Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQtc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIiwgUGFyYW1ldGVyTmFtZSgicFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zWyVpXS5zYW1wbGVMb2NhdGlvbnNJbmZvLnNhbXBsZUxvY2F0aW9uc0NvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zSW5kZXggfSksIFBhcmFtZXRlck5hbWUoInBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc1slaV0uc2FtcGxlTG9jYXRpb25zSW5mby5wU2FtcGxlTG9jYXRpb25zIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zSW5kZXggfSksIHN0cnVjdHVyZS0+cFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zW3Bvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zSW5kZXhdLnNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25zQ291bnQsICZzdHJ1Y3R1cmUtPnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc1twb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0luZGV4XS5zYW1wbGVMb2NhdGlvbnNJbmZvLnBTYW1wbGVMb2NhdGlvbnMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXBTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS0+cFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zW3Bvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zSW5kZXhdLnNhbXBsZUxvY2F0aW9uc0luZm8ucFNhbXBsZUxvY2F0aW9ucyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNhbXBsZUxvY2F0aW9uc0luZGV4ID0gMDsgc2FtcGxlTG9jYXRpb25zSW5kZXggPCBzdHJ1Y3R1cmUtPnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc1twb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0luZGV4XS5zYW1wbGVMb2NhdGlvbnNJbmZvLnNhbXBsZUxvY2F0aW9uc0NvdW50OyArK3NhbXBsZUxvY2F0aW9uc0luZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NBTVBMRV9MT0NBVElPTlNfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCIsICJzYW1wbGVMb2NhdGlvbnNFbmFibGUiLCBzdHJ1Y3R1cmUtPnNhbXBsZUxvY2F0aW9uc0VuYWJsZSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoIlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQiLCAic2FtcGxlTG9jYXRpb25zSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhUIiwgJihzdHJ1Y3R1cmUtPnNhbXBsZUxvY2F0aW9uc0luZm8pLCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhULCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1zVHlwZS1zVHlwZSIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIiwgInNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwiLCAiVmtTYW1wbGVDb3VudEZsYWdCaXRzIiwgQWxsVmtTYW1wbGVDb3VudEZsYWdCaXRzLCBzdHJ1Y3R1cmUtPnNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwsIGtPcHRpb25hbFNpbmdsZUJpdCwgIlZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXNhbXBsZUxvY2F0aW9uc1BlclBpeGVsLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIiwgInNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25zQ291bnQiLCAic2FtcGxlTG9jYXRpb25zSW5mby5wU2FtcGxlTG9jYXRpb25zIiwgc3RydWN0dXJlLT5zYW1wbGVMb2NhdGlvbnNJbmZvLnNhbXBsZUxvY2F0aW9uc0NvdW50LCAmc3RydWN0dXJlLT5zYW1wbGVMb2NhdGlvbnNJbmZvLnBTYW1wbGVMb2NhdGlvbnMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXBTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnNhbXBsZUxvY2F0aW9uc0luZm8ucFNhbXBsZUxvY2F0aW9ucyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgc2FtcGxlTG9jYXRpb25zSW5kZXggPSAwOyBzYW1wbGVMb2NhdGlvbnNJbmRleCA8IHN0cnVjdHVyZS0+c2FtcGxlTG9jYXRpb25zSW5mby5zYW1wbGVMb2NhdGlvbnNDb3VudDsgKytzYW1wbGVMb2NhdGlvbnNJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhUOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCIsICJhZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zIiwgc3RydWN0dXJlLT5hZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUIiwgInNyY1ByZW11bHRpcGxpZWQiLCBzdHJ1Y3R1cmUtPnNyY1ByZW11bHRpcGxpZWQpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCIsICJkc3RQcmVtdWx0aXBsaWVkIiwgc3RydWN0dXJlLT5kc3RQcmVtdWx0aXBsaWVkKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgiVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCIsICJibGVuZE92ZXJsYXAiLCAiVmtCbGVuZE92ZXJsYXBFWFQiLCBBbGxWa0JsZW5kT3ZlcmxhcEVYVEVudW1zLCBzdHJ1Y3R1cmUtPmJsZW5kT3ZlcmxhcCwgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVC1ibGVuZE92ZXJsYXAtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OVjogeworICAgICAgICAgICAgVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoIlZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViIsICJmbGFncyIsIHN0cnVjdHVyZS0+ZmxhZ3MsICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVi1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WIiwgImNvdmVyYWdlVG9Db2xvckVuYWJsZSIsIHN0cnVjdHVyZS0+Y292ZXJhZ2VUb0NvbG9yRW5hYmxlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX01PRFVMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlY6IHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViAqc3RydWN0dXJlID0gKFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYiLCAiZmxhZ3MiLCBzdHJ1Y3R1cmUtPmZsYWdzLCAiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYtZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgiVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIiwgImNvdmVyYWdlTW9kdWxhdGlvbk1vZGUiLCAiVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYiLCBBbGxWa0NvdmVyYWdlTW9kdWxhdGlvbk1vZGVOVkVudW1zLCBzdHJ1Y3R1cmUtPmNvdmVyYWdlTW9kdWxhdGlvbk1vZGUsICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVi1jb3ZlcmFnZU1vZHVsYXRpb25Nb2RlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WIiwgImNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlIiwgc3RydWN0dXJlLT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViIsICJzaGFkZXJTTUJ1aWx0aW5zIiwgc3RydWN0dXJlLT5zaGFkZXJTTUJ1aWx0aW5zKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgiVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIiwgInNoYXJpbmdNb2RlIiwgIlZrU2hhcmluZ01vZGUiLCBBbGxWa1NoYXJpbmdNb2RlRW51bXMsIHN0cnVjdHVyZS0+c2hhcmluZ01vZGUsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVC1zaGFyaW5nTW9kZS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9MSVNUX0NSRUFURV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCIsICJkcm1Gb3JtYXRNb2RpZmllckNvdW50IiwgInBEcm1Gb3JtYXRNb2RpZmllcnMiLCBzdHJ1Y3R1cmUtPmRybUZvcm1hdE1vZGlmaWVyQ291bnQsICZzdHJ1Y3R1cmUtPnBEcm1Gb3JtYXRNb2RpZmllcnMsIHRydWUsIHRydWUsICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhULWRybUZvcm1hdE1vZGlmaWVyQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVC1wRHJtRm9ybWF0TW9kaWZpZXJzLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQ6IHsKKyAgICAgICAgICAgIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQiLCAiZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50IiwgInBQbGFuZUxheW91dHMiLCBzdHJ1Y3R1cmUtPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCwgJnN0cnVjdHVyZS0+cFBsYW5lTGF5b3V0cywgdHJ1ZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1wUGxhbmVMYXlvdXRzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5wUGxhbmVMYXlvdXRzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkcm1Gb3JtYXRNb2RpZmllclBsYW5lSW5kZXggPSAwOyBkcm1Gb3JtYXRNb2RpZmllclBsYW5lSW5kZXggPCBzdHJ1Y3R1cmUtPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudDsgKytkcm1Gb3JtYXRNb2RpZmllclBsYW5lSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfVkFMSURBVElPTl9DQUNIRV9DUkVBVEVfSU5GT19FWFQ6IHsKKyAgICAgICAgICAgIFZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgiVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIiwgInZhbGlkYXRpb25DYWNoZSIsIHN0cnVjdHVyZS0+dmFsaWRhdGlvbkNhY2hlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQ6IHsKKyAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3NfYXJyYXkoIlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQiLCAiYmluZGluZ0NvdW50IiwgInBCaW5kaW5nRmxhZ3MiLCAiVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUIiwgQWxsVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhULCBzdHJ1Y3R1cmUtPmJpbmRpbmdDb3VudCwgc3RydWN0dXJlLT5wQmluZGluZ0ZsYWdzLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfRkVBVFVSRVNfRVhUOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyIsIHN0cnVjdHVyZS0+c2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmcpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIiwgInNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIiwgc3RydWN0dXJlLT5zaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQiLCAic2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciLCBzdHJ1Y3R1cmUtPnNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmciLCBzdHJ1Y3R1cmUtPnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQiLCAic2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmciLCBzdHJ1Y3R1cmUtPnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmciLCBzdHJ1Y3R1cmUtPnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQiLCAic2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmciLCBzdHJ1Y3R1cmUtPnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZyIsIHN0cnVjdHVyZS0+c2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIiwgInNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nIiwgc3RydWN0dXJlLT5zaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQiLCAic2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmciLCBzdHJ1Y3R1cmUtPnNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQiLCBzdHJ1Y3R1cmUtPmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQiLCAiZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQiLCBzdHJ1Y3R1cmUtPmRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZCIsIHN0cnVjdHVyZS0+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmQpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIiwgImRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCIsIHN0cnVjdHVyZS0+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCIsIHN0cnVjdHVyZS0+ZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIiwgImRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kIiwgc3RydWN0dXJlLT5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQiLCAiZGVzY3JpcHRvckJpbmRpbmdVcGRhdGVVbnVzZWRXaGlsZVBlbmRpbmciLCBzdHJ1Y3R1cmUtPmRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJkZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kIiwgc3RydWN0dXJlLT5kZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJkZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50Iiwgc3RydWN0dXJlLT5kZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCIsICJydW50aW1lRGVzY3JpcHRvckFycmF5Iiwgc3RydWN0dXJlLT5ydW50aW1lRGVzY3JpcHRvckFycmF5KTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9BTExPQ0FURV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCIsICJkZXNjcmlwdG9yU2V0Q291bnQiLCAicERlc2NyaXB0b3JDb3VudHMiLCBzdHJ1Y3R1cmUtPmRlc2NyaXB0b3JTZXRDb3VudCwgJnN0cnVjdHVyZS0+cERlc2NyaXB0b3JDb3VudHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQtcERlc2NyaXB0b3JDb3VudHMtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfSU1BR0VfU1RBVEVfQ1JFQVRFX0lORk9fTlY6IHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViAqc3RydWN0dXJlID0gKFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WIiwgInNoYWRpbmdSYXRlSW1hZ2VFbmFibGUiLCBzdHJ1Y3R1cmUtPnNoYWRpbmdSYXRlSW1hZ2VFbmFibGUpOworCisgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5wU2hhZGluZ1JhdGVQYWxldHRlcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgdmlld3BvcnRJbmRleCA9IDA7IHZpZXdwb3J0SW5kZXggPCBzdHJ1Y3R1cmUtPnZpZXdwb3J0Q291bnQ7ICsrdmlld3BvcnRJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW1fYXJyYXkoIlZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViIsIFBhcmFtZXRlck5hbWUoInBTaGFkaW5nUmF0ZVBhbGV0dGVzWyVpXS5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHZpZXdwb3J0SW5kZXggfSksIFBhcmFtZXRlck5hbWUoInBTaGFkaW5nUmF0ZVBhbGV0dGVzWyVpXS5wU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyB2aWV3cG9ydEluZGV4IH0pLCAiVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WIiwgQWxsVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WRW51bXMsIHN0cnVjdHVyZS0+cFNoYWRpbmdSYXRlUGFsZXR0ZXNbdmlld3BvcnRJbmRleF0uc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudCwgc3RydWN0dXJlLT5wU2hhZGluZ1JhdGVQYWxldHRlc1t2aWV3cG9ydEluZGV4XS5wU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcywgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9GRUFUVVJFU19OVjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYiLCAic2hhZGluZ1JhdGVJbWFnZSIsIHN0cnVjdHVyZS0+c2hhZGluZ1JhdGVJbWFnZSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYiLCAic2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlciIsIHN0cnVjdHVyZS0+c2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlcik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfQ09BUlNFX1NBTVBMRV9PUkRFUl9TVEFURV9DUkVBVEVfSU5GT19OVjogeworICAgICAgICAgICAgVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViAqc3RydWN0dXJlID0gKFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgiVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViIsICJzYW1wbGVPcmRlclR5cGUiLCAiVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViIsIEFsbFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlZFbnVtcywgc3RydWN0dXJlLT5zYW1wbGVPcmRlclR5cGUsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtc2FtcGxlT3JkZXJUeXBlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIiwgImN1c3RvbVNhbXBsZU9yZGVyQ291bnQiLCAicEN1c3RvbVNhbXBsZU9yZGVycyIsIHN0cnVjdHVyZS0+Y3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgJnN0cnVjdHVyZS0+cEN1c3RvbVNhbXBsZU9yZGVycywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WLXBDdXN0b21TYW1wbGVPcmRlcnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnBDdXN0b21TYW1wbGVPcmRlcnMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGN1c3RvbVNhbXBsZU9yZGVySW5kZXggPSAwOyBjdXN0b21TYW1wbGVPcmRlckluZGV4IDwgc3RydWN0dXJlLT5jdXN0b21TYW1wbGVPcmRlckNvdW50OyArK2N1c3RvbVNhbXBsZU9yZGVySW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIiwgUGFyYW1ldGVyTmFtZSgicEN1c3RvbVNhbXBsZU9yZGVyc1slaV0uc2hhZGluZ1JhdGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3VzdG9tU2FtcGxlT3JkZXJJbmRleCB9KSwgIlZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViIsIEFsbFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVkVudW1zLCBzdHJ1Y3R1cmUtPnBDdXN0b21TYW1wbGVPcmRlcnNbY3VzdG9tU2FtcGxlT3JkZXJJbmRleF0uc2hhZGluZ1JhdGUsICJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zaGFkaW5nUmF0ZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIiwgUGFyYW1ldGVyTmFtZSgicEN1c3RvbVNhbXBsZU9yZGVyc1slaV0uc2FtcGxlTG9jYXRpb25Db3VudCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjdXN0b21TYW1wbGVPcmRlckluZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3VzdG9tU2FtcGxlT3JkZXJzWyVpXS5wU2FtcGxlTG9jYXRpb25zIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGN1c3RvbVNhbXBsZU9yZGVySW5kZXggfSksIHN0cnVjdHVyZS0+cEN1c3RvbVNhbXBsZU9yZGVyc1tjdXN0b21TYW1wbGVPcmRlckluZGV4XS5zYW1wbGVMb2NhdGlvbkNvdW50LCAmc3RydWN0dXJlLT5wQ3VzdG9tU2FtcGxlT3JkZXJzW2N1c3RvbVNhbXBsZU9yZGVySW5kZXhdLnBTYW1wbGVMb2NhdGlvbnMsIHRydWUsIHRydWUsICJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zYW1wbGVMb2NhdGlvbkNvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXBTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS0+cEN1c3RvbVNhbXBsZU9yZGVyc1tjdXN0b21TYW1wbGVPcmRlckluZGV4XS5wU2FtcGxlTG9jYXRpb25zICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgc2FtcGxlTG9jYXRpb25JbmRleCA9IDA7IHNhbXBsZUxvY2F0aW9uSW5kZXggPCBzdHJ1Y3R1cmUtPnBDdXN0b21TYW1wbGVPcmRlcnNbY3VzdG9tU2FtcGxlT3JkZXJJbmRleF0uc2FtcGxlTG9jYXRpb25Db3VudDsgKytzYW1wbGVMb2NhdGlvbkluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY6IHsKKyAgICAgICAgICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgKnN0cnVjdHVyZSA9IChWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfaGFuZGxlX2FycmF5KCJWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgImFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50IiwgInBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzIiwgc3RydWN0dXJlLT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwgc3RydWN0dXJlLT5wQWNjZWxlcmF0aW9uU3RydWN0dXJlcywgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfRkVBVFVSRVNfTlY6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIiwgInJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0Iiwgc3RydWN0dXJlLT5yZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfU1RBVEVfQ1JFQVRFX0lORk9fTlY6IHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WIiwgInJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RW5hYmxlIiwgc3RydWN0dXJlLT5yZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIiwgImltYWdlVmlld1R5cGUiLCAiVmtJbWFnZVZpZXdUeXBlIiwgQWxsVmtJbWFnZVZpZXdUeXBlRW51bXMsIHN0cnVjdHVyZS0+aW1hZ2VWaWV3VHlwZSwgIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVC1pbWFnZVZpZXdUeXBlLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9HTE9CQUxfUFJJT1JJVFlfQ1JFQVRFX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUICpzdHJ1Y3R1cmUgPSAoVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUIiwgImdsb2JhbFByaW9yaXR5IiwgIlZrUXVldWVHbG9iYWxQcmlvcml0eUVYVCIsIEFsbFZrUXVldWVHbG9iYWxQcmlvcml0eUVYVEVudW1zLCBzdHJ1Y3R1cmUtPmdsb2JhbFByaW9yaXR5LCAiVlVJRC1Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhULWdsb2JhbFByaW9yaXR5LXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0hPU1RfUE9JTlRFUl9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgKnN0cnVjdHVyZSA9IChWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCIsICJoYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPmhhbmRsZVR5cGUsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQtaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoIlZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUIiwgInBIb3N0UG9pbnRlciIsIHN0cnVjdHVyZS0+cEhvc3RQb2ludGVyLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTVBJTEVSX0NPTlRST0xfQ1JFQVRFX0lORk9fQU1EOiB7CisgICAgICAgICAgICBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCAqc3RydWN0dXJlID0gKFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoIlZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIiwgImNvbXBpbGVyQ29udHJvbEZsYWdzIiwgc3RydWN0dXJlLT5jb21waWxlckNvbnRyb2xGbGFncywgIlZVSUQtVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQtY29tcGlsZXJDb250cm9sRmxhZ3MtemVyb2JpdG1hc2siKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQ6IHsKKyAgICAgICAgICAgIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EICpzdHJ1Y3R1cmUgPSAoVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgiVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQiLCAib3ZlcmFsbG9jYXRpb25CZWhhdmlvciIsICJWa01lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTUQiLCBBbGxWa01lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTURFbnVtcywgc3RydWN0dXJlLT5vdmVyYWxsb2NhdGlvbkJlaGF2aW9yLCAiVlVJRC1Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRC1vdmVyYWxsb2NhdGlvbkJlaGF2aW9yLXBhcmFtZXRlciIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9ESVZJU09SX1NUQVRFX0NSRUFURV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCIsICJ2ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50IiwgInBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMiLCBzdHJ1Y3R1cmUtPnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQsICZzdHJ1Y3R1cmUtPnBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMsIHRydWUsIHRydWUsICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQtdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQtcFZlcnRleEJpbmRpbmdEaXZpc29ycy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS0+cFZlcnRleEJpbmRpbmdEaXZpc29ycyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgdmVydGV4QmluZGluZ0Rpdmlzb3JJbmRleCA9IDA7IHZlcnRleEJpbmRpbmdEaXZpc29ySW5kZXggPCBzdHJ1Y3R1cmUtPnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQ7ICsrdmVydGV4QmluZGluZ0Rpdmlzb3JJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCIsICJ2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yIiwgc3RydWN0dXJlLT52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQiLCAidmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3IiLCBzdHJ1Y3R1cmUtPnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0NSRUFURV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigiVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUIiwgInBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2siLCBzdHJ1Y3R1cmUtPnBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2ssICJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBpZiAoc3RydWN0dXJlLT5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoIlZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCIsICJwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50IiwgInBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MiLCBzdHJ1Y3R1cmUtPnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQsICZzdHJ1Y3R1cmUtPnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MsIHRydWUsIHRydWUsICJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUtPnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrSW5kZXggPSAwOyBwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0luZGV4IDwgc3RydWN0dXJlLT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50OyArK3BpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViIsICJjb21wdXRlRGVyaXZhdGl2ZUdyb3VwUXVhZHMiLCBzdHJ1Y3R1cmUtPmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViIsICJjb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyIiwgc3RydWN0dXJlLT5jb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9GRUFUVVJFU19OVjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYiLCAidGFza1NoYWRlciIsIHN0cnVjdHVyZS0+dGFza1NoYWRlcik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYiLCAibWVzaFNoYWRlciIsIHN0cnVjdHVyZS0+bWVzaFNoYWRlcik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViIsICJmcmFnbWVudFNoYWRlckJhcnljZW50cmljIiwgc3RydWN0dXJlLT5mcmFnbWVudFNoYWRlckJhcnljZW50cmljKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lNQUdFX0ZPT1RQUklOVF9GRUFUVVJFU19OVjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYiLCAiaW1hZ2VGb290cHJpbnQiLCBzdHJ1Y3R1cmUtPmltYWdlRm9vdHByaW50KTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0VYQ0xVU0lWRV9TQ0lTU09SX1NUQVRFX0NSRUFURV9JTkZPX05WOiB7CisgICAgICAgICAgICBWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgKnN0cnVjdHVyZSA9IChWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgKikgaGVhZGVyOworICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS0+cEV4Y2x1c2l2ZVNjaXNzb3JzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBleGNsdXNpdmVTY2lzc29ySW5kZXggPSAwOyBleGNsdXNpdmVTY2lzc29ySW5kZXggPCBzdHJ1Y3R1cmUtPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudDsgKytleGNsdXNpdmVTY2lzc29ySW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWENMVVNJVkVfU0NJU1NPUl9GRUFUVVJFU19OVjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYiLCAiZXhjbHVzaXZlU2Npc3NvciIsIHN0cnVjdHVyZS0+ZXhjbHVzaXZlU2Npc3Nvcik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTlRFR0VSX0ZVTkNUSU9OU18yX0ZFQVRVUkVTX0lOVEVMOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCIsICJzaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMiIsIHN0cnVjdHVyZS0+c2hhZGVySW50ZWdlckZ1bmN0aW9uczIpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9ESVNQTEFZX05BVElWRV9IRFJfQ1JFQVRFX0lORk9fQU1EOiB7CisgICAgICAgICAgICBWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EICpzdHJ1Y3R1cmUgPSAoVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCIsICJsb2NhbERpbW1pbmdFbmFibGUiLCBzdHJ1Y3R1cmUtPmxvY2FsRGltbWluZ0VuYWJsZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfQ1JFQVRFX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUICpzdHJ1Y3R1cmUgPSAoVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIiwgImZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQubGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHN0cnVjdHVyZS0+ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC5sYXlvdXQsICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZS1sYXlvdXQtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0ZFQVRVUkVTX0VYVDogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQiLCAic2NhbGFyQmxvY2tMYXlvdXQiLCBzdHJ1Y3R1cmUtPnNjYWxhckJsb2NrTGF5b3V0KTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX0ZFQVRVUkVTX0VYVDogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQiLCAic3ViZ3JvdXBTaXplQ29udHJvbCIsIHN0cnVjdHVyZS0+c3ViZ3JvdXBTaXplQ29udHJvbCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUIiwgImNvbXB1dGVGdWxsU3ViZ3JvdXBzIiwgc3RydWN0dXJlLT5jb21wdXRlRnVsbFN1Ymdyb3Vwcyk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1EOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCIsICJkZXZpY2VDb2hlcmVudE1lbW9yeSIsIHN0cnVjdHVyZS0+ZGV2aWNlQ29oZXJlbnRNZW1vcnkpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BSSU9SSVRZX0ZFQVRVUkVTX0VYVDogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQiLCAibWVtb3J5UHJpb3JpdHkiLCBzdHJ1Y3R1cmUtPm1lbW9yeVByaW9yaXR5KTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlY6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WIiwgImRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nIiwgc3RydWN0dXJlLT5kZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZyk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIiwgImJ1ZmZlckRldmljZUFkZHJlc3MiLCBzdHJ1Y3R1cmUtPmJ1ZmZlckRldmljZUFkZHJlc3MpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCIsICJidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSIsIHN0cnVjdHVyZS0+YnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCIsICJidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UiLCBzdHJ1Y3R1cmUtPmJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NURU5DSUxfVVNBR0VfQ1JFQVRFX0lORk9fRVhUOiB7CisgICAgICAgICAgICBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoIlZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIiwgInN0ZW5jaWxVc2FnZSIsICJWa0ltYWdlVXNhZ2VGbGFnQml0cyIsIEFsbFZrSW1hZ2VVc2FnZUZsYWdCaXRzLCBzdHJ1Y3R1cmUtPnN0ZW5jaWxVc2FnZSwga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhULXN0ZW5jaWxVc2FnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVC1zdGVuY2lsVXNhZ2UtcmVxdWlyZWRiaXRtYXNrIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUOiB7CisgICAgICAgICAgICBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCAqc3RydWN0dXJlID0gKFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW1fYXJyYXkoIlZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUIiwgImVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50IiwgInBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzIiwgIlZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQiLCBBbGxWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhURW51bXMsIHN0cnVjdHVyZS0+ZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQsIHN0cnVjdHVyZS0+cEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMsIGZhbHNlLCB0cnVlKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bV9hcnJheSgiVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQiLCAiZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50IiwgInBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcyIsICJWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVCIsIEFsbFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhURW51bXMsIHN0cnVjdHVyZS0+ZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50LCBzdHJ1Y3R1cmUtPnBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcywgZmFsc2UsIHRydWUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfRkVBVFVSRVNfTlY6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIiwgImNvb3BlcmF0aXZlTWF0cml4Iiwgc3RydWN0dXJlLT5jb29wZXJhdGl2ZU1hdHJpeCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIiwgImNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzIiwgc3RydWN0dXJlLT5jb29wZXJhdGl2ZU1hdHJpeFJvYnVzdEJ1ZmZlckFjY2Vzcyk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9GRUFUVVJFU19OVjogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYiLCAiY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlIiwgc3RydWN0dXJlLT5jb3ZlcmFnZVJlZHVjdGlvbk1vZGUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9SRURVQ1RJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlY6IHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WICpzdHJ1Y3R1cmUgPSAoVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygiVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYiLCAiZmxhZ3MiLCBzdHJ1Y3R1cmUtPmZsYWdzLCAiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OVi1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViIsICJjb3ZlcmFnZVJlZHVjdGlvbk1vZGUiLCAiVmtDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOViIsIEFsbFZrQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlZFbnVtcywgc3RydWN0dXJlLT5jb3ZlcmFnZVJlZHVjdGlvbk1vZGUsICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WLWNvdmVyYWdlUmVkdWN0aW9uTW9kZS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUIHN0cnVjdHVyZSBtZW1iZXJzCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCIsICJmcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jayIsIHN0cnVjdHVyZS0+ZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2spOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQiLCAiZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9jayIsIHN0cnVjdHVyZS0+ZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9jayk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCIsICJmcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrIiwgc3RydWN0dXJlLT5mcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfWUNCQ1JfSU1BR0VfQVJSQVlTX0ZFQVRVUkVTX0VYVDogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQiLCAieWNiY3JJbWFnZUFycmF5cyIsIHN0cnVjdHVyZS0+eWNiY3JJbWFnZUFycmF5cyk7CisgICAgICAgIH0gYnJlYWs7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVDogeworICAgICAgICAgICAgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgKnN0cnVjdHVyZSA9IChWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCIsICJmdWxsU2NyZWVuRXhjbHVzaXZlIiwgIlZrRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCIsIEFsbFZrRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVEVudW1zLCBzdHJ1Y3R1cmUtPmZ1bGxTY3JlZW5FeGNsdXNpdmUsICJWVUlELVZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhULWZ1bGxTY3JlZW5FeGNsdXNpdmUtcGFyYW1ldGVyIik7CisgICAgICAgIH0gYnJlYWs7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhUOiB7CisgICAgICAgICAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUICpzdHJ1Y3R1cmUgPSAoVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCIsICJmdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkIiwgc3RydWN0dXJlLT5mdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkKTsKKyAgICAgICAgfSBicmVhazsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fRkVBVFVSRVNfRVhUOiB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCAqc3RydWN0dXJlID0gKFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCIsICJyZWN0YW5ndWxhckxpbmVzIiwgc3RydWN0dXJlLT5yZWN0YW5ndWxhckxpbmVzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUIiwgImJyZXNlbmhhbUxpbmVzIiwgc3RydWN0dXJlLT5icmVzZW5oYW1MaW5lcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCIsICJzbW9vdGhMaW5lcyIsIHN0cnVjdHVyZS0+c21vb3RoTGluZXMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQiLCAic3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzIiwgc3RydWN0dXJlLT5zdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQiLCAic3RpcHBsZWRCcmVzZW5oYW1MaW5lcyIsIHN0cnVjdHVyZS0+c3RpcHBsZWRCcmVzZW5oYW1MaW5lcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCIsICJzdGlwcGxlZFNtb290aExpbmVzIiwgc3RydWN0dXJlLT5zdGlwcGxlZFNtb290aExpbmVzKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fTElORV9TVEFURV9DUkVBVEVfSU5GT19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCAqc3RydWN0dXJlID0gKFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQiLCAibGluZVJhc3Rlcml6YXRpb25Nb2RlIiwgIlZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIiwgQWxsVmtMaW5lUmFzdGVyaXphdGlvbk1vZGVFWFRFbnVtcywgc3RydWN0dXJlLT5saW5lUmFzdGVyaXphdGlvbk1vZGUsICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1saW5lUmFzdGVyaXphdGlvbk1vZGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQiLCAic3RpcHBsZWRMaW5lRW5hYmxlIiwgc3RydWN0dXJlLT5zdGlwcGxlZExpbmVFbmFibGUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSE9TVF9RVUVSWV9SRVNFVF9GRUFUVVJFU19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIiwgImhvc3RRdWVyeVJlc2V0Iiwgc3RydWN0dXJlLT5ob3N0UXVlcnlSZXNldCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjb2RlIGZvciBWa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkRFWF9UWVBFX1VJTlQ4X0ZFQVRVUkVTX0VYVDogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgKnN0cnVjdHVyZSA9IChWa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCAqKSBoZWFkZXI7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigiVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQiLCAiaW5kZXhUeXBlVWludDgiLCBzdHJ1Y3R1cmUtPmluZGV4VHlwZVVpbnQ4KTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCBzdHJ1Y3R1cmUgbWVtYmVycworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0ZFQVRVUkVTX0VYVDogeworICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUICopIGhlYWRlcjsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQiLCAic2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uIiwgc3RydWN0dXJlLT5zaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb24pOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gY29kZSBmb3IgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgc3RydWN0dXJlIG1lbWJlcnMKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9GRUFUVVJFU19FWFQ6IHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUICpzdHJ1Y3R1cmUgPSAoVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgKikgaGVhZGVyOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoIlZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIiwgInRleGVsQnVmZmVyQWxpZ25tZW50Iiwgc3RydWN0dXJlLT50ZXhlbEJ1ZmZlckFsaWdubWVudCk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBza2lwID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6T3V0cHV0RXh0ZW5zaW9uRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmFwaV9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyAmZXh0ZW5zaW9uX25hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX0V4dGVuc2lvbk5vdEVuYWJsZWQsICJBdHRlbXBlZCB0byBjYWxsICVzKCkgYnV0IGl0cyByZXF1aXJlZCBleHRlbnNpb24gJXMgaGFzIG5vdCBiZWVuIGVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgYXBpX25hbWUuY19zdHIoKSwgZXh0ZW5zaW9uX25hbWUuY19zdHIoKSk7Cit9CisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbnN0YW5jZSgKKyAgICBjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luc3RhbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlSW5zdGFuY2UiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfSU5TVEFOQ0VfQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfSU5TVEFOQ0VfQ1JFQVRFX0lORk8sIHRydWUsICJWVUlELXZrQ3JlYXRlSW5zdGFuY2UtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtJbnN0YW5jZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtJbnN0YW5jZUNyZWF0ZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GRUFUVVJFU19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkxBR1NfRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlSW5zdGFuY2UiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQsIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQsIFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhULCBWa1ZhbGlkYXRpb25GbGFnc0VYVCIsIHBDcmVhdGVJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtJbnN0YW5jZUNyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtJbnN0YW5jZUNyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVJbnN0YW5jZSIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsICJWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVJbnN0YW5jZSIsICJwQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPIiwgcENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8sIGZhbHNlLCAiVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1wQXBwbGljYXRpb25JbmZvLXBhcmFtZXRlciIsICJWVUlELVZrQXBwbGljYXRpb25JbmZvLXNUeXBlLXNUeXBlIik7CisKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUluc3RhbmNlIiwgInBDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtBcHBsaWNhdGlvbkluZm8tcE5leHQtcE5leHQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RyaW5nX2FycmF5KCJ2a0NyZWF0ZUluc3RhbmNlIiwgInBDcmVhdGVJbmZvLT5lbmFibGVkTGF5ZXJDb3VudCIsICJwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcyIsIHBDcmVhdGVJbmZvLT5lbmFibGVkTGF5ZXJDb3VudCwgcENyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtJbnN0YW5jZUNyZWF0ZUluZm8tcHBFbmFibGVkTGF5ZXJOYW1lcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cmluZ19hcnJheSgidmtDcmVhdGVJbnN0YW5jZSIsICJwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50IiwgInBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyIsIHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQsIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbnN0YW5jZSIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUluc3RhbmNlIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW5zdGFuY2UiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUluc3RhbmNlIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW5zdGFuY2UiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUluc3RhbmNlIiwgInBJbnN0YW5jZSIsIHBJbnN0YW5jZSwgIlZVSUQtdmtDcmVhdGVJbnN0YW5jZS1wSW5zdGFuY2UtcGFyYW1ldGVyIik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVJbnN0YW5jZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluc3RhbmNlKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95SW5zdGFuY2UoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lJbnN0YW5jZSIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lJbnN0YW5jZSIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lJbnN0YW5jZSIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUluc3RhbmNlIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUluc3RhbmNlIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiLCAicFBoeXNpY2FsRGV2aWNlQ291bnQiLCAicFBoeXNpY2FsRGV2aWNlcyIsIHBQaHlzaWNhbERldmljZUNvdW50LCAmcFBoeXNpY2FsRGV2aWNlcywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMtcFBoeXNpY2FsRGV2aWNlcy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyIsICJwRmVhdHVyZXMiLCBwRmVhdHVyZXMsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcy1wRmVhdHVyZXMtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIiwgImZvcm1hdCIsICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIGZvcm1hdCwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMtZm9ybWF0LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMiLCAicEZvcm1hdFByb3BlcnRpZXMiLCBwRm9ybWF0UHJvcGVydGllcywgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMtcEZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBGb3JtYXRQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiLCAiZm9ybWF0IiwgIlZrRm9ybWF0IiwgQWxsVmtGb3JtYXRFbnVtcywgZm9ybWF0LCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLWZvcm1hdC1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIiwgInR5cGUiLCAiVmtJbWFnZVR5cGUiLCBBbGxWa0ltYWdlVHlwZUVudW1zLCB0eXBlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXR5cGUtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyIsICJ0aWxpbmciLCAiVmtJbWFnZVRpbGluZyIsIEFsbFZrSW1hZ2VUaWxpbmdFbnVtcywgdGlsaW5nLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXRpbGluZy1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIiwgInVzYWdlIiwgIlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiwgQWxsVmtJbWFnZVVzYWdlRmxhZ0JpdHMsIHVzYWdlLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy11c2FnZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXVzYWdlLXJlcXVpcmVkYml0bWFzayIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiLCAiZmxhZ3MiLCAiVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtJbWFnZUNyZWF0ZUZsYWdCaXRzLCBmbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIiwgInBJbWFnZUZvcm1hdFByb3BlcnRpZXMiLCBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBJbWFnZUZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBJbWFnZUZvcm1hdFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyIsICJwUHJvcGVydGllcyIsIHBQcm9wZXJ0aWVzLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcy1wUHJvcGVydGllcy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIiwgInBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQiLCAicFF1ZXVlRmFtaWx5UHJvcGVydGllcyIsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsICZwUXVldWVGYW1pbHlQcm9wZXJ0aWVzLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLXBRdWV1ZUZhbWlseVByb3BlcnRpZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBRdWV1ZUZhbWlseVByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFF1ZXVlRmFtaWx5UHJvcGVydHlJbmRleCA9IDA7IHBRdWV1ZUZhbWlseVByb3BlcnR5SW5kZXggPCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDsgKytwUXVldWVGYW1pbHlQcm9wZXJ0eUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyogICAgICAgICAgIHBNZW1vcnlQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIsICJwTWVtb3J5UHJvcGVydGllcyIsIHBNZW1vcnlQcm9wZXJ0aWVzLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcy1wTWVtb3J5UHJvcGVydGllcy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocE1lbW9yeVByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXZpY2UoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZURldmljZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtEZXZpY2VDcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQ1JFQVRFX0lORk9fQU1ELCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfMTZCSVRfU1RPUkFHRV9GRUFUVVJFUywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzhCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFIsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0RFVklDRV9BRERSRVNTX0ZFQVRVUkVTX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19LSFIsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1ELCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09NUFVURV9TSEFERVJfREVSSVZBVElWRVNfRkVBVFVSRVNfTlYsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX0ZFQVRVUkVTX05WLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09STkVSX1NBTVBMRURfSU1BR0VfRkVBVFVSRVNfTlYsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9GRUFUVVJFU19OViwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0FMSUFTSU5HX0ZFQVRVUkVTX05WLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfQ0xJUF9FTkFCTEVfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWENMVVNJVkVfU0NJU1NPUl9GRUFUVVJFU19OViwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzIsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRkVBVFVSRVNfTlYsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfSU5URVJMT0NLX0ZFQVRVUkVTX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOREVYX1RZUEVfVUlOVDhfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9GRUFUVVJFU19OViwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFUywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19GRUFUVVJFU19LSFIsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9URUNURURfTUVNT1JZX0ZFQVRVUkVTLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9GRUFUVVJFU19OViwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0VQQVJBVEVfREVQVEhfU1RFTkNJTF9MQVlPVVRTX0ZFQVRVUkVTX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9BVE9NSUNfSU5UNjRfRkVBVFVSRVNfS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NMT0NLX0ZFQVRVUkVTX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19GRUFUVVJFUywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lNQUdFX0ZPT1RQUklOVF9GRUFUVVJFU19OViwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTlRFR0VSX0ZVTkNUSU9OU18yX0ZFQVRVUkVTX0lOVEVMLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX0ZFQVRVUkVTX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9GRUFUVVJFU19OViwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0ZFQVRVUkVTX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWFRVUkVfQ09NUFJFU1NJT05fQVNUQ19IRFJfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX0ZFQVRVUkVTX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19GRUFUVVJFU19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFIsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsICJWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbywgVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQsIFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcywgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1ELCBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYsIFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiwgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYsIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMsIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcywgVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcywgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCwgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSLCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSLCBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzLCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCIsIHBDcmVhdGVJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtEZXZpY2VDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrRGV2aWNlQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cXVldWVDcmVhdGVJbmZvQ291bnQiLCAicENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLT5xdWV1ZUNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zLCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfQ1JFQVRFX0lORk8sIHRydWUsIHRydWUsICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBRdWV1ZUNyZWF0ZUluZm9zLXBhcmFtZXRlciIsICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1xdWV1ZUNyZWF0ZUluZm9Db3VudC1hcnJheWxlbmd0aCIpOworCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3MgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBxdWV1ZUNyZWF0ZUluZm9JbmRleCA9IDA7IHF1ZXVlQ3JlYXRlSW5mb0luZGV4IDwgcENyZWF0ZUluZm8tPnF1ZXVlQ3JlYXRlSW5mb0NvdW50OyArK3F1ZXVlQ3JlYXRlSW5mb0luZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0dMT0JBTF9QUklPUklUWV9DUkVBVEVfSU5GT19FWFQgfTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZURldmljZSIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcXVldWVDcmVhdGVJbmZvSW5kZXggfSksICJWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zW3F1ZXVlQ3JlYXRlSW5mb0luZGV4XS5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZURldmljZSIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1slaV0uZmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcXVldWVDcmVhdGVJbmZvSW5kZXggfSksICJWa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMiLCBBbGxWa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1txdWV1ZUNyZWF0ZUluZm9JbmRleF0uZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlRGV2aWNlIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zWyVpXS5xdWV1ZUNvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHF1ZXVlQ3JlYXRlSW5mb0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbJWldLnBRdWV1ZVByaW9yaXRpZXMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcXVldWVDcmVhdGVJbmZvSW5kZXggfSksIHBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1txdWV1ZUNyZWF0ZUluZm9JbmRleF0ucXVldWVDb3VudCwgJnBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1txdWV1ZUNyZWF0ZUluZm9JbmRleF0ucFF1ZXVlUHJpb3JpdGllcywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8tcXVldWVDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXBRdWV1ZVByaW9yaXRpZXMtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cmluZ19hcnJheSgidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPmVuYWJsZWRMYXllckNvdW50IiwgInBDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzIiwgcENyZWF0ZUluZm8tPmVuYWJsZWRMYXllckNvdW50LCBwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcHBFbmFibGVkTGF5ZXJOYW1lcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cmluZ19hcnJheSgidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudCIsICJwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMiLCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50LCBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLXBhcmFtZXRlciIpOworCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnJvYnVzdEJ1ZmZlckFjY2VzcyIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5yb2J1c3RCdWZmZXJBY2Nlc3MpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmZ1bGxEcmF3SW5kZXhVaW50MzIiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZnVsbERyYXdJbmRleFVpbnQzMik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+aW1hZ2VDdWJlQXJyYXkiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+aW1hZ2VDdWJlQXJyYXkpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmluZGVwZW5kZW50QmxlbmQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+aW5kZXBlbmRlbnRCbGVuZCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+Z2VvbWV0cnlTaGFkZXIiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+Z2VvbWV0cnlTaGFkZXIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnRlc3NlbGxhdGlvblNoYWRlciIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT50ZXNzZWxsYXRpb25TaGFkZXIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNhbXBsZVJhdGVTaGFkaW5nIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNhbXBsZVJhdGVTaGFkaW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5kdWFsU3JjQmxlbmQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZHVhbFNyY0JsZW5kKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5sb2dpY09wIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmxvZ2ljT3ApOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPm11bHRpRHJhd0luZGlyZWN0IiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPm11bHRpRHJhd0luZGlyZWN0KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5kcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2UpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmRlcHRoQ2xhbXAiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZGVwdGhDbGFtcCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZGVwdGhCaWFzQ2xhbXAiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZGVwdGhCaWFzQ2xhbXApOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmZpbGxNb2RlTm9uU29saWQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZmlsbE1vZGVOb25Tb2xpZCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZGVwdGhCb3VuZHMiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZGVwdGhCb3VuZHMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPndpZGVMaW5lcyIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT53aWRlTGluZXMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmxhcmdlUG9pbnRzIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmxhcmdlUG9pbnRzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5hbHBoYVRvT25lIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmFscGhhVG9PbmUpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPm11bHRpVmlld3BvcnQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+bXVsdGlWaWV3cG9ydCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2FtcGxlckFuaXNvdHJvcHkiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2FtcGxlckFuaXNvdHJvcHkpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnRleHR1cmVDb21wcmVzc2lvbkVUQzIiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+dGV4dHVyZUNvbXByZXNzaW9uRVRDMik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+dGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+dGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnRleHR1cmVDb21wcmVzc2lvbkJDIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnRleHR1cmVDb21wcmVzc2lvbkJDKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5vY2NsdXNpb25RdWVyeVByZWNpc2UiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+b2NjbHVzaW9uUXVlcnlQcmVjaXNlKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5waXBlbGluZVN0YXRpc3RpY3NRdWVyeSIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5waXBlbGluZVN0YXRpc3RpY3NRdWVyeSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+dmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+ZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0cyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0IiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmcpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlckNsaXBEaXN0YW5jZSIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zaGFkZXJDbGlwRGlzdGFuY2UpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlckN1bGxEaXN0YW5jZSIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zaGFkZXJDdWxsRGlzdGFuY2UpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlckZsb2F0NjQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyRmxvYXQ2NCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVySW50NjQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVySW50NjQpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlckludDE2IiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNoYWRlckludDE2KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyUmVzb3VyY2VNaW5Mb2QiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c2hhZGVyUmVzb3VyY2VNaW5Mb2QpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNwYXJzZUJpbmRpbmciLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c3BhcnNlQmluZGluZyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c3BhcnNlUmVzaWRlbmN5QnVmZmVyIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNwYXJzZVJlc2lkZW5jeUJ1ZmZlcik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zcGFyc2VSZXNpZGVuY3lJbWFnZTJEKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zcGFyc2VSZXNpZGVuY3lJbWFnZTNEIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNwYXJzZVJlc2lkZW5jeUltYWdlM0QpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzIiwgcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zcGFyc2VSZXNpZGVuY3k0U2FtcGxlcyIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zcGFyc2VSZXNpZGVuY3k0U2FtcGxlcyk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlcyIsIHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzLT5zcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPnNwYXJzZVJlc2lkZW5jeUFsaWFzZWQiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+c3BhcnNlUmVzaWRlbmN5QWxpYXNlZCk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZURldmljZSIsICJwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+dmFyaWFibGVNdWx0aXNhbXBsZVJhdGUiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+dmFyaWFibGVNdWx0aXNhbXBsZVJhdGUpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMtPmluaGVyaXRlZFF1ZXJpZXMiLCBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcy0+aW5oZXJpdGVkUXVlcmllcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXZpY2UiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXZpY2UiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXZpY2UiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURldmljZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURldmljZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGV2aWNlIiwgInBEZXZpY2UiLCBwRGV2aWNlLCAiVlVJRC12a0NyZWF0ZURldmljZS1wRGV2aWNlLXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGV2aWNlKHBoeXNpY2FsRGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXZpY2UiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGV2aWNlIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURldmljZSIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURldmljZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXZpY2UiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlUXVldWUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVJbmRleCwKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXREZXZpY2VRdWV1ZSIsICJwUXVldWUiLCBwUXVldWUsICJWVUlELXZrR2V0RGV2aWNlUXVldWUtcFF1ZXVlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVF1ZXVlU3VibWl0KAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qICAgICAgICAgICAgICAgICAgICAgICAgIHBTdWJtaXRzLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a1F1ZXVlU3VibWl0IiwgInN1Ym1pdENvdW50IiwgInBTdWJtaXRzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPIiwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgZmFsc2UsIHRydWUsICJWVUlELVZrU3VibWl0SW5mby1zVHlwZS1zVHlwZSIsICJWVUlELXZrUXVldWVTdWJtaXQtcFN1Ym1pdHMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwU3VibWl0cyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBzdWJtaXRJbmRleCA9IDA7IHN1Ym1pdEluZGV4IDwgc3VibWl0Q291bnQ7ICsrc3VibWl0SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtTdWJtaXRJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0QzRDEyX0ZFTkNFX1NVQk1JVF9JTkZPX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPLCBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9TVUJNSVRfSU5GT19LSFIsIFZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTywgVktfU1RSVUNUVVJFX1RZUEVfVElNRUxJTkVfU0VNQVBIT1JFX1NVQk1JVF9JTkZPX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19OViB9OworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtRdWV1ZVN1Ym1pdCIsIFBhcmFtZXRlck5hbWUoInBTdWJtaXRzWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzdWJtaXRJbmRleCB9KSwgIlZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIsIFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLCBWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSLCBWa1Byb3RlY3RlZFN1Ym1pdEluZm8sIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSLCBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiwgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViIsIHBTdWJtaXRzW3N1Ym1pdEluZGV4XS5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtTdWJtaXRJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrU3VibWl0SW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtTdWJtaXRJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrUXVldWVTdWJtaXQiLCBQYXJhbWV0ZXJOYW1lKCJwU3VibWl0c1slaV0ud2FpdFNlbWFwaG9yZUNvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1Ym1pdEluZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwU3VibWl0c1slaV0ucFdhaXRTZW1hcGhvcmVzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1Ym1pdEluZGV4IH0pLCBwU3VibWl0c1tzdWJtaXRJbmRleF0ud2FpdFNlbWFwaG9yZUNvdW50LCAmcFN1Ym1pdHNbc3VibWl0SW5kZXhdLnBXYWl0U2VtYXBob3JlcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzX2FycmF5KCJ2a1F1ZXVlU3VibWl0IiwgUGFyYW1ldGVyTmFtZSgicFN1Ym1pdHNbJWldLndhaXRTZW1hcGhvcmVDb3VudCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzdWJtaXRJbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicFN1Ym1pdHNbJWldLnBXYWl0RHN0U3RhZ2VNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1Ym1pdEluZGV4IH0pLCAiVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiLCBBbGxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cywgcFN1Ym1pdHNbc3VibWl0SW5kZXhdLndhaXRTZW1hcGhvcmVDb3VudCwgcFN1Ym1pdHNbc3VibWl0SW5kZXhdLnBXYWl0RHN0U3RhZ2VNYXNrLCBmYWxzZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrUXVldWVTdWJtaXQiLCBQYXJhbWV0ZXJOYW1lKCJwU3VibWl0c1slaV0uY29tbWFuZEJ1ZmZlckNvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1Ym1pdEluZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwU3VibWl0c1slaV0ucENvbW1hbmRCdWZmZXJzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1Ym1pdEluZGV4IH0pLCBwU3VibWl0c1tzdWJtaXRJbmRleF0uY29tbWFuZEJ1ZmZlckNvdW50LCAmcFN1Ym1pdHNbc3VibWl0SW5kZXhdLnBDb21tYW5kQnVmZmVycywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcENvbW1hbmRCdWZmZXJzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a1F1ZXVlU3VibWl0IiwgUGFyYW1ldGVyTmFtZSgicFN1Ym1pdHNbJWldLnNpZ25hbFNlbWFwaG9yZUNvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1Ym1pdEluZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwU3VibWl0c1slaV0ucFNpZ25hbFNlbWFwaG9yZXMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VibWl0SW5kZXggfSksIHBTdWJtaXRzW3N1Ym1pdEluZGV4XS5zaWduYWxTZW1hcGhvcmVDb3VudCwgJnBTdWJtaXRzW3N1Ym1pdEluZGV4XS5wU2lnbmFsU2VtYXBob3JlcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtcGFyYW1ldGVyIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlUXVldWVXYWl0SWRsZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGV2aWNlV2FpdElkbGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlTWVtb3J5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQWxsb2NhdGVNZW1vcnkiLCAicEFsbG9jYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTyIsIHBBbGxvY2F0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPLCB0cnVlLCAiVlVJRC12a0FsbG9jYXRlTWVtb3J5LXBBbGxvY2F0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEFsbG9jYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa01lbW9yeUFsbG9jYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9NRU1PUllfQUxMT0NBVEVfSU5GT19OViwgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPLCBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYsIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX05WLCBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfSU5GT19BTkRST0lELCBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0ZEX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0hPU1RfUE9JTlRFUl9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFIsIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYsIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9GTEFHU19JTkZPLCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX0FMTE9DQVRFX0lORk8sIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0FMTE9DQVRFX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUFJJT1JJVFlfQUxMT0NBVEVfSU5GT19FWFQgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtBbGxvY2F0ZU1lbW9yeSIsICJwQWxsb2NhdGVJbmZvLT5wTmV4dCIsICJWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViwgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8sIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYsIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLCBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELCBWa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiwgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQsIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLCBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvLCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbywgVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiwgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCIsIHBBbGxvY2F0ZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa01lbW9yeUFsbG9jYXRlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa01lbW9yeUFsbG9jYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtcE5leHQiKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtBbGxvY2F0ZU1lbW9yeSIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0FsbG9jYXRlTWVtb3J5IiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQWxsb2NhdGVNZW1vcnkiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0FsbG9jYXRlTWVtb3J5IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQWxsb2NhdGVNZW1vcnkiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0FsbG9jYXRlTWVtb3J5IiwgInBNZW1vcnkiLCBwTWVtb3J5LCAiVlVJRC12a0FsbG9jYXRlTWVtb3J5LXBNZW1vcnktcGFyYW1ldGVyIik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZU1lbW9yeShkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZW1vcnkpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtGcmVlTWVtb3J5IiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRnJlZU1lbW9yeSIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0ZyZWVNZW1vcnkiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0ZyZWVNZW1vcnkiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtGcmVlTWVtb3J5IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZU1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgVmtNZW1vcnlNYXBGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB2b2lkKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwRGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a01hcE1lbW9yeSIsICJtZW1vcnkiLCBtZW1vcnkpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrTWFwTWVtb3J5IiwgImZsYWdzIiwgZmxhZ3MsICJWVUlELXZrTWFwTWVtb3J5LWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlVW5tYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtVbm1hcE1lbW9yeSIsICJtZW1vcnkiLCBtZW1vcnkpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIiwgIm1lbW9yeVJhbmdlQ291bnQiLCAicE1lbW9yeVJhbmdlcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFIiwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcywgVktfU1RSVUNUVVJFX1RZUEVfTUFQUEVEX01FTU9SWV9SQU5HRSwgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zVHlwZS1zVHlwZSIsICJWVUlELXZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMtcE1lbW9yeVJhbmdlcy1wYXJhbWV0ZXIiLCAiVlVJRC12a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzLW1lbW9yeVJhbmdlQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocE1lbW9yeVJhbmdlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBtZW1vcnlSYW5nZUluZGV4ID0gMDsgbWVtb3J5UmFuZ2VJbmRleCA8IG1lbW9yeVJhbmdlQ291bnQ7ICsrbWVtb3J5UmFuZ2VJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMiLCBQYXJhbWV0ZXJOYW1lKCJwTWVtb3J5UmFuZ2VzWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBtZW1vcnlSYW5nZUluZGV4IH0pLCBOVUxMLCBwTWVtb3J5UmFuZ2VzW21lbW9yeVJhbmdlSW5kZXhdLnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIiwgUGFyYW1ldGVyTmFtZSgicE1lbW9yeVJhbmdlc1slaV0ubWVtb3J5IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IG1lbW9yeVJhbmdlSW5kZXggfSksIHBNZW1vcnlSYW5nZXNbbWVtb3J5UmFuZ2VJbmRleF0ubWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMiLCAibWVtb3J5UmFuZ2VDb3VudCIsICJwTWVtb3J5UmFuZ2VzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0UiLCBtZW1vcnlSYW5nZUNvdW50LCBwTWVtb3J5UmFuZ2VzLCBWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLXBNZW1vcnlSYW5nZXMtcGFyYW1ldGVyIiwgIlZVSUQtdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLW1lbW9yeVJhbmdlQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocE1lbW9yeVJhbmdlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBtZW1vcnlSYW5nZUluZGV4ID0gMDsgbWVtb3J5UmFuZ2VJbmRleCA8IG1lbW9yeVJhbmdlQ291bnQ7ICsrbWVtb3J5UmFuZ2VJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIsIFBhcmFtZXRlck5hbWUoInBNZW1vcnlSYW5nZXNbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IG1lbW9yeVJhbmdlSW5kZXggfSksIE5VTEwsIHBNZW1vcnlSYW5nZXNbbWVtb3J5UmFuZ2VJbmRleF0ucE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2UtcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIsIFBhcmFtZXRlck5hbWUoInBNZW1vcnlSYW5nZXNbJWldLm1lbW9yeSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBtZW1vcnlSYW5nZUluZGV4IH0pLCBwTWVtb3J5UmFuZ2VzW21lbW9yeVJhbmdlSW5kZXhdLm1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCIsICJtZW1vcnkiLCBtZW1vcnkpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IiwgInBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzIiwgcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMsICJWVUlELXZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudC1wQ29tbWl0dGVkTWVtb3J5SW5CeXRlcy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQmluZEJ1ZmZlck1lbW9yeSIsICJidWZmZXIiLCBidWZmZXIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0JpbmRCdWZmZXJNZW1vcnkiLCAibWVtb3J5IiwgbWVtb3J5KTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0JpbmRJbWFnZU1lbW9yeSIsICJpbWFnZSIsIGltYWdlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtCaW5kSW1hZ2VNZW1vcnkiLCAibWVtb3J5IiwgbWVtb3J5KTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIiwgImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyIsICJwTWVtb3J5UmVxdWlyZW1lbnRzIiwgcE1lbW9yeVJlcXVpcmVtZW50cywgIlZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMtcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocE1lbW9yeVJlcXVpcmVtZW50cyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMiLCAiaW1hZ2UiLCBpbWFnZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIiwgInBNZW1vcnlSZXF1aXJlbWVudHMiLCBwTWVtb3J5UmVxdWlyZW1lbnRzLCAiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBNZW1vcnlSZXF1aXJlbWVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiLCAiaW1hZ2UiLCBpbWFnZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyIsICJwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCIsICJwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzIiwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsICZwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLXBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50SW5kZXggPSAwOyBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRJbmRleCA8ICpwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudDsgKytwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIsICJmb3JtYXQiLCAiVmtGb3JtYXQiLCBBbGxWa0Zvcm1hdEVudW1zLCBmb3JtYXQsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtZm9ybWF0LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiLCAidHlwZSIsICJWa0ltYWdlVHlwZSIsIEFsbFZrSW1hZ2VUeXBlRW51bXMsIHR5cGUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdHlwZS1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIiwgInNhbXBsZXMiLCAiVmtTYW1wbGVDb3VudEZsYWdCaXRzIiwgQWxsVmtTYW1wbGVDb3VudEZsYWdCaXRzLCBzYW1wbGVzLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtc2FtcGxlcy1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXNhbXBsZXMtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIsICJ1c2FnZSIsICJWa0ltYWdlVXNhZ2VGbGFnQml0cyIsIEFsbFZrSW1hZ2VVc2FnZUZsYWdCaXRzLCB1c2FnZSwga1JlcXVpcmVkRmxhZ3MsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdXNhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy11c2FnZS1yZXF1aXJlZGJpdG1hc2siKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIiwgInRpbGluZyIsICJWa0ltYWdlVGlsaW5nIiwgQWxsVmtJbWFnZVRpbGluZ0VudW1zLCB0aWxpbmcsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdGlsaW5nLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMiLCAicFByb3BlcnR5Q291bnQiLCAicFByb3BlcnRpZXMiLCBwUHJvcGVydHlDb3VudCwgJnBQcm9wZXJ0aWVzLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIpOworICAgIGlmIChwUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwUHJvcGVydHlJbmRleCA9IDA7IHBQcm9wZXJ0eUluZGV4IDwgKnBQcm9wZXJ0eUNvdW50OyArK3BQcm9wZXJ0eUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVRdWV1ZUJpbmRTcGFyc2UoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyogICAgICAgICAgICAgICAgICAgICBwQmluZEluZm8sCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrUXVldWVCaW5kU3BhcnNlIiwgImJpbmRJbmZvQ291bnQiLCAicEJpbmRJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk8iLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk8sIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtcEJpbmRJbmZvLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEJpbmRJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGJpbmRJbmZvSW5kZXggPSAwOyBiaW5kSW5mb0luZGV4IDwgYmluZEluZm9Db3VudDsgKytiaW5kSW5mb0luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrQmluZFNwYXJzZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0JJTkRfU1BBUlNFX0lORk8sIFZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFIgfTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrUXVldWVCaW5kU3BhcnNlIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCAiVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvLCBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiIsIHBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtCaW5kU3BhcnNlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa0JpbmRTcGFyc2VJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrUXVldWVCaW5kU3BhcnNlIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS53YWl0U2VtYXBob3JlQ291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5wV2FpdFNlbWFwaG9yZXMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgcEJpbmRJbmZvW2JpbmRJbmZvSW5kZXhdLndhaXRTZW1hcGhvcmVDb3VudCwgJnBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wV2FpdFNlbWFwaG9yZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wV2FpdFNlbWFwaG9yZXMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrUXVldWVCaW5kU3BhcnNlIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5idWZmZXJCaW5kQ291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5wQnVmZmVyQmluZHMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgcEJpbmRJbmZvW2JpbmRJbmZvSW5kZXhdLmJ1ZmZlckJpbmRDb3VudCwgJnBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wQnVmZmVyQmluZHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wQnVmZmVyQmluZHMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEJ1ZmZlckJpbmRzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBidWZmZXJCaW5kSW5kZXggPSAwOyBidWZmZXJCaW5kSW5kZXggPCBwQmluZEluZm9bYmluZEluZm9JbmRleF0uYnVmZmVyQmluZENvdW50OyArK2J1ZmZlckJpbmRJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0ucEJ1ZmZlckJpbmRzWyVpXS5idWZmZXIiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCwgYnVmZmVyQmluZEluZGV4IH0pLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEJ1ZmZlckJpbmRzW2J1ZmZlckJpbmRJbmRleF0uYnVmZmVyKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0ucEJ1ZmZlckJpbmRzWyVpXS5iaW5kQ291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCwgYnVmZmVyQmluZEluZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQmluZEluZm9bJWldLnBCdWZmZXJCaW5kc1slaV0ucEJpbmRzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXgsIGJ1ZmZlckJpbmRJbmRleCB9KSwgcEJpbmRJbmZvW2JpbmRJbmZvSW5kZXhdLnBCdWZmZXJCaW5kc1tidWZmZXJCaW5kSW5kZXhdLmJpbmRDb3VudCwgJnBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wQnVmZmVyQmluZHNbYnVmZmVyQmluZEluZGV4XS5wQmluZHMsIHRydWUsIHRydWUsICJWVUlELVZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8tYmluZENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mby1wQmluZHMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wQnVmZmVyQmluZHNbYnVmZmVyQmluZEluZGV4XS5wQmluZHMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kSW5kZXggPSAwOyBiaW5kSW5kZXggPCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEJ1ZmZlckJpbmRzW2J1ZmZlckJpbmRJbmRleF0uYmluZENvdW50OyArK2JpbmRJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0ucEJ1ZmZlckJpbmRzWyVpXS5wQmluZHNbJWldLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXgsIGJ1ZmZlckJpbmRJbmRleCwgYmluZEluZGV4IH0pLCAiVmtTcGFyc2VNZW1vcnlCaW5kRmxhZ0JpdHMiLCBBbGxWa1NwYXJzZU1lbW9yeUJpbmRGbGFnQml0cywgcEJpbmRJbmZvW2JpbmRJbmZvSW5kZXhdLnBCdWZmZXJCaW5kc1tidWZmZXJCaW5kSW5kZXhdLnBCaW5kc1tiaW5kSW5kZXhdLmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLWZsYWdzLXBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0uaW1hZ2VPcGFxdWVCaW5kQ291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5wSW1hZ2VPcGFxdWVCaW5kcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0uaW1hZ2VPcGFxdWVCaW5kQ291bnQsICZwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlT3BhcXVlQmluZHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wSW1hZ2VPcGFxdWVCaW5kcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wSW1hZ2VPcGFxdWVCaW5kcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW1hZ2VPcGFxdWVCaW5kSW5kZXggPSAwOyBpbWFnZU9wYXF1ZUJpbmRJbmRleCA8IHBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5pbWFnZU9wYXF1ZUJpbmRDb3VudDsgKytpbWFnZU9wYXF1ZUJpbmRJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0ucEltYWdlT3BhcXVlQmluZHNbJWldLmltYWdlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXgsIGltYWdlT3BhcXVlQmluZEluZGV4IH0pLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlT3BhcXVlQmluZHNbaW1hZ2VPcGFxdWVCaW5kSW5kZXhdLmltYWdlKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0ucEltYWdlT3BhcXVlQmluZHNbJWldLmJpbmRDb3VudCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4LCBpbWFnZU9wYXF1ZUJpbmRJbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5wSW1hZ2VPcGFxdWVCaW5kc1slaV0ucEJpbmRzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXgsIGltYWdlT3BhcXVlQmluZEluZGV4IH0pLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlT3BhcXVlQmluZHNbaW1hZ2VPcGFxdWVCaW5kSW5kZXhdLmJpbmRDb3VudCwgJnBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wSW1hZ2VPcGFxdWVCaW5kc1tpbWFnZU9wYXF1ZUJpbmRJbmRleF0ucEJpbmRzLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8tYmluZENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvLXBCaW5kcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvW2JpbmRJbmZvSW5kZXhdLnBJbWFnZU9wYXF1ZUJpbmRzW2ltYWdlT3BhcXVlQmluZEluZGV4XS5wQmluZHMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kSW5kZXggPSAwOyBiaW5kSW5kZXggPCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlT3BhcXVlQmluZHNbaW1hZ2VPcGFxdWVCaW5kSW5kZXhdLmJpbmRDb3VudDsgKytiaW5kSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtRdWV1ZUJpbmRTcGFyc2UiLCBQYXJhbWV0ZXJOYW1lKCJwQmluZEluZm9bJWldLnBJbWFnZU9wYXF1ZUJpbmRzWyVpXS5wQmluZHNbJWldLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXgsIGltYWdlT3BhcXVlQmluZEluZGV4LCBiaW5kSW5kZXggfSksICJWa1NwYXJzZU1lbW9yeUJpbmRGbGFnQml0cyIsIEFsbFZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlT3BhcXVlQmluZHNbaW1hZ2VPcGFxdWVCaW5kSW5kZXhdLnBCaW5kc1tiaW5kSW5kZXhdLmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLWZsYWdzLXBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0uaW1hZ2VCaW5kQ291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5wSW1hZ2VCaW5kcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0uaW1hZ2VCaW5kQ291bnQsICZwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlQmluZHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wSW1hZ2VCaW5kcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wSW1hZ2VCaW5kcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW1hZ2VCaW5kSW5kZXggPSAwOyBpbWFnZUJpbmRJbmRleCA8IHBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5pbWFnZUJpbmRDb3VudDsgKytpbWFnZUJpbmRJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0ucEltYWdlQmluZHNbJWldLmltYWdlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXgsIGltYWdlQmluZEluZGV4IH0pLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlQmluZHNbaW1hZ2VCaW5kSW5kZXhdLmltYWdlKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a1F1ZXVlQmluZFNwYXJzZSIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb1slaV0ucEltYWdlQmluZHNbJWldLmJpbmRDb3VudCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4LCBpbWFnZUJpbmRJbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5wSW1hZ2VCaW5kc1slaV0ucEJpbmRzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXgsIGltYWdlQmluZEluZGV4IH0pLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlQmluZHNbaW1hZ2VCaW5kSW5kZXhdLmJpbmRDb3VudCwgJnBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wSW1hZ2VCaW5kc1tpbWFnZUJpbmRJbmRleF0ucEJpbmRzLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8tYmluZENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvLXBCaW5kcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocEJpbmRJbmZvW2JpbmRJbmZvSW5kZXhdLnBJbWFnZUJpbmRzW2ltYWdlQmluZEluZGV4XS5wQmluZHMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kSW5kZXggPSAwOyBiaW5kSW5kZXggPCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlQmluZHNbaW1hZ2VCaW5kSW5kZXhdLmJpbmRDb3VudDsgKytiaW5kSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtRdWV1ZUJpbmRTcGFyc2UiLCBQYXJhbWV0ZXJOYW1lKCJwQmluZEluZm9bJWldLnBJbWFnZUJpbmRzWyVpXS5wQmluZHNbJWldLnN1YnJlc291cmNlLmFzcGVjdE1hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCwgaW1hZ2VCaW5kSW5kZXgsIGJpbmRJbmRleCB9KSwgIlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIsIEFsbFZrSW1hZ2VBc3BlY3RGbGFnQml0cywgcEJpbmRJbmZvW2JpbmRJbmZvSW5kZXhdLnBJbWFnZUJpbmRzW2ltYWdlQmluZEluZGV4XS5wQmluZHNbYmluZEluZGV4XS5zdWJyZXNvdXJjZS5hc3BlY3RNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlLWFzcGVjdE1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtRdWV1ZUJpbmRTcGFyc2UiLCBQYXJhbWV0ZXJOYW1lKCJwQmluZEluZm9bJWldLnBJbWFnZUJpbmRzWyVpXS5wQmluZHNbJWldLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXgsIGltYWdlQmluZEluZGV4LCBiaW5kSW5kZXggfSksICJWa1NwYXJzZU1lbW9yeUJpbmRGbGFnQml0cyIsIEFsbFZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzLCBwQmluZEluZm9bYmluZEluZm9JbmRleF0ucEltYWdlQmluZHNbaW1hZ2VCaW5kSW5kZXhdLnBCaW5kc1tiaW5kSW5kZXhdLmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrUXVldWVCaW5kU3BhcnNlIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvWyVpXS5zaWduYWxTZW1hcGhvcmVDb3VudCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQmluZEluZm9bJWldLnBTaWduYWxTZW1hcGhvcmVzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXggfSksIHBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5zaWduYWxTZW1hcGhvcmVDb3VudCwgJnBCaW5kSW5mb1tiaW5kSW5mb0luZGV4XS5wU2lnbmFsU2VtYXBob3JlcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBTaWduYWxTZW1hcGhvcmVzLXBhcmFtZXRlciIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUZlbmNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVGZW5jZSIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVGZW5jZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ZlbmNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0ZlbmNlQ3JlYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk8sIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVGZW5jZSIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCAiVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8sIFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIiLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrRmVuY2VDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrRmVuY2VDcmVhdGVJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0ZlbmNlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlRmVuY2UiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgIlZrRmVuY2VDcmVhdGVGbGFnQml0cyIsIEFsbFZrRmVuY2VDcmVhdGVGbGFnQml0cywgcENyZWF0ZUluZm8tPmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtGZW5jZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRmVuY2UiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVGZW5jZSIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUZlbmNlIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVGZW5jZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUZlbmNlIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVGZW5jZSIsICJwRmVuY2UiLCBwRmVuY2UsICJWVUlELXZrQ3JlYXRlRmVuY2UtcEZlbmNlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUZlbmNlIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUZlbmNlIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUZlbmNlIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RmVuY2UiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RmVuY2UiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlUmVzZXRGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfaGFuZGxlX2FycmF5KCJ2a1Jlc2V0RmVuY2VzIiwgImZlbmNlQ291bnQiLCAicEZlbmNlcyIsIGZlbmNlQ291bnQsIHBGZW5jZXMsIHRydWUsIHRydWUpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldEZlbmNlU3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRGZW5jZVN0YXR1cyIsICJmZW5jZSIsIGZlbmNlKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVXYWl0Rm9yRmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QWxsLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfaGFuZGxlX2FycmF5KCJ2a1dhaXRGb3JGZW5jZXMiLCAiZmVuY2VDb3VudCIsICJwRmVuY2VzIiwgZmVuY2VDb3VudCwgcEZlbmNlcywgdHJ1ZSwgdHJ1ZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrV2FpdEZvckZlbmNlcyIsICJ3YWl0QWxsIiwgd2FpdEFsbCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2VtYXBob3JlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlU2VtYXBob3JlIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8sIHRydWUsICJWVUlELXZrQ3JlYXRlU2VtYXBob3JlLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrU2VtYXBob3JlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1NlbWFwaG9yZUNyZWF0ZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9DUkVBVEVfSU5GTywgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIsIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUiB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVNlbWFwaG9yZSIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCAiVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvLCBWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiwgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiIsIHBDcmVhdGVJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtTZW1hcGhvcmVDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtTZW1hcGhvcmVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVTZW1hcGhvcmUiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa1NlbWFwaG9yZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTZW1hcGhvcmUiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTZW1hcGhvcmUiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTZW1hcGhvcmUiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNlbWFwaG9yZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNlbWFwaG9yZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2VtYXBob3JlIiwgInBTZW1hcGhvcmUiLCBwU2VtYXBob3JlLCAiVlVJRC12a0NyZWF0ZVNlbWFwaG9yZS1wU2VtYXBob3JlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U2VtYXBob3JlIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVNlbWFwaG9yZSIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTZW1hcGhvcmUiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTZW1hcGhvcmUiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U2VtYXBob3JlIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVFdmVudCIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVFdmVudC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0V2ZW50Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlRXZlbnQiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0V2ZW50Q3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlRXZlbnQiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa0V2ZW50Q3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUV2ZW50IiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRXZlbnQiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVFdmVudCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRXZlbnQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVFdmVudCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRXZlbnQiLCAicEV2ZW50IiwgcEV2ZW50LCAiVlVJRC12a0NyZWF0ZUV2ZW50LXBFdmVudC1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lFdmVudCIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lFdmVudCIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lFdmVudCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUV2ZW50IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUV2ZW50IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldEV2ZW50U3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRFdmVudFN0YXR1cyIsICJldmVudCIsIGV2ZW50KTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVTZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrU2V0RXZlbnQiLCAiZXZlbnQiLCBldmVudCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlUmVzZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrUmVzZXRFdmVudCIsICJldmVudCIsIGV2ZW50KTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtRdWVyeVBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVlcnlQb29sKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVRdWVyeVBvb2wiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVF1ZXJ5UG9vbC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtRdWVyeVBvb2xDcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlUXVlcnlQb29sIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsICJWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiIsIHBDcmVhdGVJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtRdWVyeVBvb2xDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVRdWVyeVBvb2wiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVF1ZXJ5UG9vbCIsICJwQ3JlYXRlSW5mby0+cXVlcnlUeXBlIiwgIlZrUXVlcnlUeXBlIiwgQWxsVmtRdWVyeVR5cGVFbnVtcywgcENyZWF0ZUluZm8tPnF1ZXJ5VHlwZSwgIlZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLXF1ZXJ5VHlwZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVRdWVyeVBvb2wiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVRdWVyeVBvb2wiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVRdWVyeVBvb2wiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVF1ZXJ5UG9vbCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVF1ZXJ5UG9vbCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlUXVlcnlQb29sIiwgInBRdWVyeVBvb2wiLCBwUXVlcnlQb29sLCAiVlVJRC12a0NyZWF0ZVF1ZXJ5UG9vbC1wUXVlcnlQb29sLXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUXVlcnlQb29sKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBRdWVyeVBvb2wpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UXVlcnlQb29sIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVF1ZXJ5UG9vbCIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lRdWVyeVBvb2wiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lRdWVyeVBvb2wiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UXVlcnlQb29sIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFF1ZXJ5UG9vbFJlc3VsdHMiLCAicXVlcnlQb29sIiwgcXVlcnlQb29sKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0dldFF1ZXJ5UG9vbFJlc3VsdHMiLCAiZGF0YVNpemUiLCAicERhdGEiLCBkYXRhU2l6ZSwgJnBEYXRhLCB0cnVlLCB0cnVlLCAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZGF0YVNpemUtYXJyYXlsZW5ndGgiLCAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcERhdGEtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRRdWVyeVBvb2xSZXN1bHRzIiwgImZsYWdzIiwgIlZrUXVlcnlSZXN1bHRGbGFnQml0cyIsIEFsbFZrUXVlcnlSZXN1bHRGbGFnQml0cywgZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlQnVmZmVyIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8sIHRydWUsICJWVUlELXZrQ3JlYXRlQnVmZmVyLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0J1ZmZlckNyZWF0ZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQ1JFQVRFX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9CVUZGRVJfQ1JFQVRFX0lORk9fTlYsIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk8gfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVCdWZmZXIiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQsIFZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSLCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYsIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvIiwgcENyZWF0ZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa0J1ZmZlckNyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtCdWZmZXJDcmVhdGVJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZUJ1ZmZlciIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCAiVmtCdWZmZXJDcmVhdGVGbGFnQml0cyIsIEFsbFZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZUJ1ZmZlciIsICJwQ3JlYXRlSW5mby0+dXNhZ2UiLCAiVmtCdWZmZXJVc2FnZUZsYWdCaXRzIiwgQWxsVmtCdWZmZXJVc2FnZUZsYWdCaXRzLCBwQ3JlYXRlSW5mby0+dXNhZ2UsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tdXNhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlQnVmZmVyIiwgInBDcmVhdGVJbmZvLT5zaGFyaW5nTW9kZSIsICJWa1NoYXJpbmdNb2RlIiwgQWxsVmtTaGFyaW5nTW9kZUVudW1zLCBwQ3JlYXRlSW5mby0+c2hhcmluZ01vZGUsICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVCdWZmZXIiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVCdWZmZXIiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVCdWZmZXIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUJ1ZmZlciIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUJ1ZmZlciIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQnVmZmVyIiwgInBCdWZmZXIiLCBwQnVmZmVyLCAiVlVJRC12a0NyZWF0ZUJ1ZmZlci1wQnVmZmVyLXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lCdWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95QnVmZmVyIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUJ1ZmZlciIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lCdWZmZXIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lCdWZmZXIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95QnVmZmVyIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXJWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlQnVmZmVyVmlldyIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVCdWZmZXJWaWV3LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUJ1ZmZlclZpZXciLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVCdWZmZXJWaWV3IiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NyZWF0ZUJ1ZmZlclZpZXciLCAicENyZWF0ZUluZm8tPmJ1ZmZlciIsIHBDcmVhdGVJbmZvLT5idWZmZXIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlQnVmZmVyVmlldyIsICJwQ3JlYXRlSW5mby0+Zm9ybWF0IiwgIlZrRm9ybWF0IiwgQWxsVmtGb3JtYXRFbnVtcywgcENyZWF0ZUluZm8tPmZvcm1hdCwgIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQnVmZmVyVmlldyIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUJ1ZmZlclZpZXciLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVCdWZmZXJWaWV3IiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVCdWZmZXJWaWV3IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQnVmZmVyVmlldyIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQnVmZmVyVmlldyIsICJwVmlldyIsIHBWaWV3LCAiVlVJRC12a0NyZWF0ZUJ1ZmZlclZpZXctcFZpZXctcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXJWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUJ1ZmZlclZpZXciLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95QnVmZmVyVmlldyIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lCdWZmZXJWaWV3IiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95QnVmZmVyVmlldyIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lCdWZmZXJWaWV3IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVJbWFnZSIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVJbWFnZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0ltYWdlQ3JlYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9DUkVBVEVfSU5GT19OViwgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQsIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GTywgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WLCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0VYUExJQ0lUX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9MSVNUX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TVEVOQ0lMX1VTQUdFX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUltYWdlIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsICJWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViwgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQsIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8sIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViwgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhULCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCwgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSLCBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCwgVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIiLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VDcmVhdGVJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlSW1hZ2UiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgIlZrSW1hZ2VDcmVhdGVGbGFnQml0cyIsIEFsbFZrSW1hZ2VDcmVhdGVGbGFnQml0cywgcENyZWF0ZUluZm8tPmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVJbWFnZSIsICJwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlIiwgIlZrSW1hZ2VUeXBlIiwgQWxsVmtJbWFnZVR5cGVFbnVtcywgcENyZWF0ZUluZm8tPmltYWdlVHlwZSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlSW1hZ2UiLCAicENyZWF0ZUluZm8tPmZvcm1hdCIsICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIHBDcmVhdGVJbmZvLT5mb3JtYXQsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC1wYXJhbWV0ZXIiKTsKKworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZUltYWdlIiwgInBDcmVhdGVJbmZvLT5zYW1wbGVzIiwgIlZrU2FtcGxlQ291bnRGbGFnQml0cyIsIEFsbFZrU2FtcGxlQ291bnRGbGFnQml0cywgcENyZWF0ZUluZm8tPnNhbXBsZXMsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2FtcGxlcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlSW1hZ2UiLCAicENyZWF0ZUluZm8tPnRpbGluZyIsICJWa0ltYWdlVGlsaW5nIiwgQWxsVmtJbWFnZVRpbGluZ0VudW1zLCBwQ3JlYXRlSW5mby0+dGlsaW5nLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby10aWxpbmctcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVJbWFnZSIsICJwQ3JlYXRlSW5mby0+dXNhZ2UiLCAiVmtJbWFnZVVzYWdlRmxhZ0JpdHMiLCBBbGxWa0ltYWdlVXNhZ2VGbGFnQml0cywgcENyZWF0ZUluZm8tPnVzYWdlLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVJbWFnZSIsICJwQ3JlYXRlSW5mby0+c2hhcmluZ01vZGUiLCAiVmtTaGFyaW5nTW9kZSIsIEFsbFZrU2hhcmluZ01vZGVFbnVtcywgcENyZWF0ZUluZm8tPnNoYXJpbmdNb2RlLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZUltYWdlIiwgInBDcmVhdGVJbmZvLT5pbml0aWFsTGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHBDcmVhdGVJbmZvLT5pbml0aWFsTGF5b3V0LCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbml0aWFsTGF5b3V0LXBhcmFtZXRlciIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUltYWdlIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW1hZ2UiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbWFnZSIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW1hZ2UiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbWFnZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW1hZ2UiLCAicEltYWdlIiwgcEltYWdlLCAiVlVJRC12a0NyZWF0ZUltYWdlLXBJbWFnZS1wYXJhbWV0ZXIiKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbWFnZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95SW1hZ2UiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95SW1hZ2UiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95SW1hZ2UiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lJbWFnZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lJbWFnZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiAgICAgICAgICAgICAgICAgICBwU3VicmVzb3VyY2UsCisgICAgVmtTdWJyZXNvdXJjZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIsICJpbWFnZSIsIGltYWdlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIsICJwU3VicmVzb3VyY2UiLCBwU3VicmVzb3VyY2UsICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1wU3VicmVzb3VyY2UtcGFyYW1ldGVyIik7CisgICAgaWYgKHBTdWJyZXNvdXJjZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0IiwgInBTdWJyZXNvdXJjZS0+YXNwZWN0TWFzayIsICJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiLCBBbGxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIHBTdWJyZXNvdXJjZS0+YXNwZWN0TWFzaywga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZS1hc3BlY3RNYXNrLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZS1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIsICJwTGF5b3V0IiwgcExheW91dCwgIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LXBMYXlvdXQtcGFyYW1ldGVyIik7CisgICAgaWYgKHBMYXlvdXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbWFnZVZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlSW1hZ2VWaWV3IiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVJbWFnZVZpZXctcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0FTVENfREVDT0RFX01PREVfRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPLCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU5GTyB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUltYWdlVmlldyIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCAiVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCwgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8sIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8iLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa0ltYWdlVmlld0NyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlSW1hZ2VWaWV3IiwgInBDcmVhdGVJbmZvLT5mbGFncyIsICJWa0ltYWdlVmlld0NyZWF0ZUZsYWdCaXRzIiwgQWxsVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cywgcENyZWF0ZUluZm8tPmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NyZWF0ZUltYWdlVmlldyIsICJwQ3JlYXRlSW5mby0+aW1hZ2UiLCBwQ3JlYXRlSW5mby0+aW1hZ2UpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlSW1hZ2VWaWV3IiwgInBDcmVhdGVJbmZvLT52aWV3VHlwZSIsICJWa0ltYWdlVmlld1R5cGUiLCBBbGxWa0ltYWdlVmlld1R5cGVFbnVtcywgcENyZWF0ZUluZm8tPnZpZXdUeXBlLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdmlld1R5cGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVJbWFnZVZpZXciLCAicENyZWF0ZUluZm8tPmZvcm1hdCIsICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIHBDcmVhdGVJbmZvLT5mb3JtYXQsICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVJbWFnZVZpZXciLCAicENyZWF0ZUluZm8tPmNvbXBvbmVudHMuciIsICJWa0NvbXBvbmVudFN3aXp6bGUiLCBBbGxWa0NvbXBvbmVudFN3aXp6bGVFbnVtcywgcENyZWF0ZUluZm8tPmNvbXBvbmVudHMuciwgIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLXItcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVJbWFnZVZpZXciLCAicENyZWF0ZUluZm8tPmNvbXBvbmVudHMuZyIsICJWa0NvbXBvbmVudFN3aXp6bGUiLCBBbGxWa0NvbXBvbmVudFN3aXp6bGVFbnVtcywgcENyZWF0ZUluZm8tPmNvbXBvbmVudHMuZywgIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLWctcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVJbWFnZVZpZXciLCAicENyZWF0ZUluZm8tPmNvbXBvbmVudHMuYiIsICJWa0NvbXBvbmVudFN3aXp6bGUiLCBBbGxWa0NvbXBvbmVudFN3aXp6bGVFbnVtcywgcENyZWF0ZUluZm8tPmNvbXBvbmVudHMuYiwgIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLWItcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVJbWFnZVZpZXciLCAicENyZWF0ZUluZm8tPmNvbXBvbmVudHMuYSIsICJWa0NvbXBvbmVudFN3aXp6bGUiLCBBbGxWa0NvbXBvbmVudFN3aXp6bGVFbnVtcywgcENyZWF0ZUluZm8tPmNvbXBvbmVudHMuYSwgIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLWEtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVJbWFnZVZpZXciLCAicENyZWF0ZUluZm8tPnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayIsICJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiLCBBbGxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW1hZ2VWaWV3IiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW1hZ2VWaWV3IiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW1hZ2VWaWV3IiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbWFnZVZpZXciLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbWFnZVZpZXciLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUltYWdlVmlldyIsICJwVmlldyIsIHBWaWV3LCAiVlVJRC12a0NyZWF0ZUltYWdlVmlldy1wVmlldy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95SW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUltYWdlVmlldyIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lJbWFnZVZpZXciLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95SW1hZ2VWaWV3IiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95SW1hZ2VWaWV3IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUltYWdlVmlldyIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTaGFkZXJNb2R1bGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGVyTW9kdWxlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVTaGFkZXJNb2R1bGUiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVNoYWRlck1vZHVsZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfVkFMSURBVElPTl9DQUNIRV9DUkVBVEVfSU5GT19FWFQgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVTaGFkZXJNb2R1bGUiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCIsIHBDcmVhdGVJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVTaGFkZXJNb2R1bGUiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIsICJwQ3JlYXRlSW5mby0+Y29kZVNpemUiLCAicENyZWF0ZUluZm8tPnBDb2RlIiwgcENyZWF0ZUluZm8tPmNvZGVTaXplLCAmcENyZWF0ZUluZm8tPnBDb2RlLCB0cnVlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2hhZGVyTW9kdWxlIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2hhZGVyTW9kdWxlIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTaGFkZXJNb2R1bGUiLCAicFNoYWRlck1vZHVsZSIsIHBTaGFkZXJNb2R1bGUsICJWVUlELXZrQ3JlYXRlU2hhZGVyTW9kdWxlLXBTaGFkZXJNb2R1bGUtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U2hhZGVyTW9kdWxlIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVNoYWRlck1vZHVsZSIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVNoYWRlck1vZHVsZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUNhY2hlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVQaXBlbGluZUNhY2hlIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NBQ0hFX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NBQ0hFX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVBpcGVsaW5lQ2FjaGUtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlUGlwZWxpbmVDYWNoZSIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCBOVUxMLCBwQ3JlYXRlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDcmVhdGVQaXBlbGluZUNhY2hlIiwgInBDcmVhdGVJbmZvLT5pbml0aWFsRGF0YVNpemUiLCAicENyZWF0ZUluZm8tPnBJbml0aWFsRGF0YSIsIHBDcmVhdGVJbmZvLT5pbml0aWFsRGF0YVNpemUsICZwQ3JlYXRlSW5mby0+cEluaXRpYWxEYXRhLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8tcEluaXRpYWxEYXRhLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVQaXBlbGluZUNhY2hlIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlUGlwZWxpbmVDYWNoZSIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlUGlwZWxpbmVDYWNoZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUiLCAicFBpcGVsaW5lQ2FjaGUiLCBwUGlwZWxpbmVDYWNoZSwgIlZVSUQtdmtDcmVhdGVQaXBlbGluZUNhY2hlLXBQaXBlbGluZUNhY2hlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVBpcGVsaW5lQ2FjaGUiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UGlwZWxpbmVDYWNoZSIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVBpcGVsaW5lQ2FjaGUiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UGlwZWxpbmVDYWNoZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFBpcGVsaW5lQ2FjaGVEYXRhIiwgInBpcGVsaW5lQ2FjaGUiLCBwaXBlbGluZUNhY2hlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0dldFBpcGVsaW5lQ2FjaGVEYXRhIiwgInBEYXRhU2l6ZSIsICJwRGF0YSIsIHBEYXRhU2l6ZSwgJnBEYXRhLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC12a0dldFBpcGVsaW5lQ2FjaGVEYXRhLXBEYXRhLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZU1lcmdlUGlwZWxpbmVDYWNoZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrTWVyZ2VQaXBlbGluZUNhY2hlcyIsICJkc3RDYWNoZSIsIGRzdENhY2hlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2hhbmRsZV9hcnJheSgidmtNZXJnZVBpcGVsaW5lQ2FjaGVzIiwgInNyY0NhY2hlQ291bnQiLCAicFNyY0NhY2hlcyIsIHNyY0NhY2hlQ291bnQsIHBTcmNDYWNoZXMsIHRydWUsIHRydWUpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJjcmVhdGVJbmZvQ291bnQiLCAicENyZWF0ZUluZm9zIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPIiwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1wQ3JlYXRlSW5mb3MtcGFyYW1ldGVyIiwgIlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1jcmVhdGVJbmZvQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocENyZWF0ZUluZm9zICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGNyZWF0ZUluZm9JbmRleCA9IDA7IGNyZWF0ZUluZm9JbmRleCA8IGNyZWF0ZUluZm9Db3VudDsgKytjcmVhdGVJbmZvSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT01QSUxFUl9DT05UUk9MX0NSRUFURV9JTkZPX0FNRCwgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9ESVNDQVJEX1JFQ1RBTkdMRV9TVEFURV9DUkVBVEVfSU5GT19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfU1RBVEVfQ1JFQVRFX0lORk9fTlYgfTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgIlZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1ELCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQsIFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhULCBWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViIsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0uZmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCAiVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnN0YWdlQ291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0uc3RhZ2VDb3VudCwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlcywgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLXBhcmFtZXRlciIsICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2VDb3VudC1hcnJheWxlbmd0aCIpOworCisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgc3RhZ2VJbmRleCA9IDA7IHN0YWdlSW5kZXggPCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5zdGFnZUNvdW50OyArK3N0YWdlSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX1JFUVVJUkVEX1NVQkdST1VQX1NJWkVfQ1JFQVRFX0lORk9fRVhUIH07CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgIlZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCIsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0ucE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgIlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0uZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLnN0YWdlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgIlZrU2hhZGVyU3RhZ2VGbGFnQml0cyIsIEFsbFZrU2hhZGVyU3RhZ2VGbGFnQml0cywgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5zdGFnZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLXBhcmFtZXRlciIsICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLm1vZHVsZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXgsIHN0YWdlSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0ubW9kdWxlKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLnBOYW1lIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wTmFtZSwgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmFtZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wU3BlY2lhbGl6YXRpb25JbmZvICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLnBTcGVjaWFsaXphdGlvbkluZm8tPm1hcEVudHJ5Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4LCBzdGFnZUluZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLnBTcGVjaWFsaXphdGlvbkluZm8tPnBNYXBFbnRyaWVzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wU3BlY2lhbGl6YXRpb25JbmZvLT5tYXBFbnRyeUNvdW50LCAmcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wTWFwRW50cmllcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1NwZWNpYWxpemF0aW9uSW5mby1wTWFwRW50cmllcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0ucFNwZWNpYWxpemF0aW9uSW5mby0+cE1hcEVudHJpZXMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IG1hcEVudHJ5SW5kZXggPSAwOyBtYXBFbnRyeUluZGV4IDwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wU3BlY2lhbGl6YXRpb25JbmZvLT5tYXBFbnRyeUNvdW50OyArK21hcEVudHJ5SW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLnBTcGVjaWFsaXphdGlvbkluZm8tPmRhdGFTaXplIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wU3RhZ2VzWyVpXS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wRGF0YSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXgsIHN0YWdlSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0ucFNwZWNpYWxpemF0aW9uSW5mby0+ZGF0YVNpemUsICZwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wU3RhZ2VzW3N0YWdlSW5kZXhdLnBTcGVjaWFsaXphdGlvbkluZm8tPnBEYXRhLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrU3BlY2lhbGl6YXRpb25JbmZvLXBEYXRhLXBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wUmFzdGVyaXphdGlvblN0YXRlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wUmFzdGVyaXphdGlvblN0YXRlLCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBSYXN0ZXJpemF0aW9uU3RhdGUtcGFyYW1ldGVyIiwgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBSYXN0ZXJpemF0aW9uU3RhdGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fQ09OU0VSVkFUSVZFX1NUQVRFX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9ERVBUSF9DTElQX1NUQVRFX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9MSU5FX1NUQVRFX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9SQVNURVJJWkFUSU9OX09SREVSX0FNRCwgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9TVFJFQU1fQ1JFQVRFX0lORk9fRVhUIH07CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+cE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCAiVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhULCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+ZmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wUmFzdGVyaXphdGlvblN0YXRlLT5mbGFncywgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5kZXB0aENsYW1wRW5hYmxlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+ZGVwdGhDbGFtcEVuYWJsZSk7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+cmFzdGVyaXplckRpc2NhcmRFbmFibGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wUmFzdGVyaXphdGlvblN0YXRlLT5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSk7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5wb2x5Z29uTW9kZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksICJWa1BvbHlnb25Nb2RlIiwgQWxsVmtQb2x5Z29uTW9kZUVudW1zLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wUmFzdGVyaXphdGlvblN0YXRlLT5wb2x5Z29uTW9kZSwgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tcG9seWdvbk1vZGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5jdWxsTW9kZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksICJWa0N1bGxNb2RlRmxhZ0JpdHMiLCBBbGxWa0N1bGxNb2RlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBSYXN0ZXJpemF0aW9uU3RhdGUtPmN1bGxNb2RlLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tY3VsbE1vZGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5mcm9udEZhY2UiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCAiVmtGcm9udEZhY2UiLCBBbGxWa0Zyb250RmFjZUVudW1zLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wUmFzdGVyaXphdGlvblN0YXRlLT5mcm9udEZhY2UsICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLWZyb250RmFjZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5kZXB0aEJpYXNFbmFibGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wUmFzdGVyaXphdGlvblN0YXRlLT5kZXB0aEJpYXNFbmFibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wRHluYW1pY1N0YXRlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wRHluYW1pY1N0YXRlLCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPLCBmYWxzZSwgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlLXBhcmFtZXRlciIsICJWVUlELVZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wRHluYW1pY1N0YXRlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEeW5hbWljU3RhdGUtPnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgTlVMTCwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucER5bmFtaWNTdGF0ZS0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wRHluYW1pY1N0YXRlLT5mbGFncyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBEeW5hbWljU3RhdGUtPmZsYWdzLCAiVlVJRC1Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bV9hcnJheSgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucER5bmFtaWNTdGF0ZS0+ZHluYW1pY1N0YXRlQ291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgIlZrRHluYW1pY1N0YXRlIiwgQWxsVmtEeW5hbWljU3RhdGVFbnVtcywgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucER5bmFtaWNTdGF0ZS0+ZHluYW1pY1N0YXRlQ291bnQsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5sYXlvdXQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5sYXlvdXQpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucmVuZGVyUGFzcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnJlbmRlclBhc3MpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCAiY3JlYXRlSW5mb0NvdW50IiwgInBQaXBlbGluZXMiLCBjcmVhdGVJbmZvQ291bnQsICZwUGlwZWxpbmVzLCB0cnVlLCB0cnVlLCAiVlVJRC12a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLWNyZWF0ZUluZm9Db3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcFBpcGVsaW5lcy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCAiY3JlYXRlSW5mb0NvdW50IiwgInBDcmVhdGVJbmZvcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9DT01QVVRFX1BJUEVMSU5FX0NSRUFURV9JTkZPIiwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIFZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk8sIHRydWUsIHRydWUsICJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1wQ3JlYXRlSW5mb3MtcGFyYW1ldGVyIiwgIlZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLWNyZWF0ZUluZm9Db3VudC1hcnJheWxlbmd0aCIpOworICAgIGlmIChwQ3JlYXRlSW5mb3MgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgY3JlYXRlSW5mb0luZGV4ID0gMDsgY3JlYXRlSW5mb0luZGV4IDwgY3JlYXRlSW5mb0NvdW50OyArK2NyZWF0ZUluZm9JbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQsIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0NSRUFURV9JTkZPX0VYVCB9OworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksICJWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCwgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgIlZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyIsIEFsbFZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cywgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0uZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0uc3RhZ2UiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPIiwgJihwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5zdGFnZSksIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTywgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisKKyAgICAgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfUkVRVUlSRURfU1VCR1JPVVBfU0laRV9DUkVBVEVfSU5GT19FWFQgfTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0uc3RhZ2UucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCAiVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0uc3RhZ2UucE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnN0YWdlLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgIlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnN0YWdlLmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5zdGFnZS5zdGFnZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksICJWa1NoYWRlclN0YWdlRmxhZ0JpdHMiLCBBbGxWa1NoYWRlclN0YWdlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnN0YWdlLnN0YWdlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0uc3RhZ2UubW9kdWxlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0uc3RhZ2UubW9kdWxlKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnN0YWdlLnBOYW1lIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0uc3RhZ2UucE5hbWUsICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5hbWUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvLT5tYXBFbnRyeUNvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wTWFwRW50cmllcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8tPm1hcEVudHJ5Q291bnQsICZwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wTWFwRW50cmllcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1NwZWNpYWxpemF0aW9uSW5mby1wTWFwRW50cmllcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wTWFwRW50cmllcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBtYXBFbnRyeUluZGV4ID0gMDsgbWFwRW50cnlJbmRleCA8IHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8tPm1hcEVudHJ5Q291bnQ7ICsrbWFwRW50cnlJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8tPmRhdGFTaXplIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wRGF0YSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8tPmRhdGFTaXplLCAmcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0uc3RhZ2UucFNwZWNpYWxpemF0aW9uSW5mby0+cERhdGEsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tcERhdGEtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLmxheW91dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLmxheW91dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyIsICJjcmVhdGVJbmZvQ291bnQiLCAicFBpcGVsaW5lcyIsIGNyZWF0ZUluZm9Db3VudCwgJnBQaXBlbGluZXMsIHRydWUsIHRydWUsICJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1jcmVhdGVJbmZvQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtcFBpcGVsaW5lcy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UGlwZWxpbmUiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UGlwZWxpbmUiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UGlwZWxpbmUiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lQaXBlbGluZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lQaXBlbGluZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUxheW91dCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVQaXBlbGluZUxheW91dC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiLCAicENyZWF0ZUluZm8tPnNldExheW91dENvdW50IiwgInBDcmVhdGVJbmZvLT5wU2V0TGF5b3V0cyIsIHBDcmVhdGVJbmZvLT5zZXRMYXlvdXRDb3VudCwgJnBDcmVhdGVJbmZvLT5wU2V0TGF5b3V0cywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0IiwgInBDcmVhdGVJbmZvLT5wdXNoQ29uc3RhbnRSYW5nZUNvdW50IiwgInBDcmVhdGVJbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzIiwgcENyZWF0ZUluZm8tPnB1c2hDb25zdGFudFJhbmdlQ291bnQsICZwQ3JlYXRlSW5mby0+cFB1c2hDb25zdGFudFJhbmdlcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wUHVzaENvbnN0YW50UmFuZ2VzLXBhcmFtZXRlciIpOworCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFB1c2hDb25zdGFudFJhbmdlcyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHB1c2hDb25zdGFudFJhbmdlSW5kZXggPSAwOyBwdXNoQ29uc3RhbnRSYW5nZUluZGV4IDwgcENyZWF0ZUluZm8tPnB1c2hDb25zdGFudFJhbmdlQ291bnQ7ICsrcHVzaENvbnN0YW50UmFuZ2VJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0IiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBQdXNoQ29uc3RhbnRSYW5nZXNbJWldLnN0YWdlRmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcHVzaENvbnN0YW50UmFuZ2VJbmRleCB9KSwgIlZrU2hhZGVyU3RhZ2VGbGFnQml0cyIsIEFsbFZrU2hhZGVyU3RhZ2VGbGFnQml0cywgcENyZWF0ZUluZm8tPnBQdXNoQ29uc3RhbnRSYW5nZXNbcHVzaENvbnN0YW50UmFuZ2VJbmRleF0uc3RhZ2VGbGFncywga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utc3RhZ2VGbGFncy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLXN0YWdlRmxhZ3MtcmVxdWlyZWRiaXRtYXNrIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVQaXBlbGluZUxheW91dCIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0IiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0IiwgInBQaXBlbGluZUxheW91dCIsIHBQaXBlbGluZUxheW91dCwgIlZVSUQtdmtDcmVhdGVQaXBlbGluZUxheW91dC1wUGlwZWxpbmVMYXlvdXQtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UGlwZWxpbmVMYXlvdXQiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UGlwZWxpbmVMYXlvdXQiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UGlwZWxpbmVMYXlvdXQiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lQaXBlbGluZUxheW91dCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lQaXBlbGluZUxheW91dCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZVNhbXBsZXIiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVNhbXBsZXItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1NhbXBsZXJDcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfQ1JFQVRFX0lORk9fRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU5GTyB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVNhbXBsZXIiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhULCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIiwgcENyZWF0ZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1NhbXBsZXJDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrU2FtcGxlckNyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVNhbXBsZXIiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgIlZrU2FtcGxlckNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyIiwgInBDcmVhdGVJbmZvLT5tYWdGaWx0ZXIiLCAiVmtGaWx0ZXIiLCBBbGxWa0ZpbHRlckVudW1zLCBwQ3JlYXRlSW5mby0+bWFnRmlsdGVyLCAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1hZ0ZpbHRlci1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNhbXBsZXIiLCAicENyZWF0ZUluZm8tPm1pbkZpbHRlciIsICJWa0ZpbHRlciIsIEFsbFZrRmlsdGVyRW51bXMsIHBDcmVhdGVJbmZvLT5taW5GaWx0ZXIsICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWluRmlsdGVyLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2FtcGxlciIsICJwQ3JlYXRlSW5mby0+bWlwbWFwTW9kZSIsICJWa1NhbXBsZXJNaXBtYXBNb2RlIiwgQWxsVmtTYW1wbGVyTWlwbWFwTW9kZUVudW1zLCBwQ3JlYXRlSW5mby0+bWlwbWFwTW9kZSwgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1taXBtYXBNb2RlLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2FtcGxlciIsICJwQ3JlYXRlSW5mby0+YWRkcmVzc01vZGVVIiwgIlZrU2FtcGxlckFkZHJlc3NNb2RlIiwgQWxsVmtTYW1wbGVyQWRkcmVzc01vZGVFbnVtcywgcENyZWF0ZUluZm8tPmFkZHJlc3NNb2RlVSwgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyIiwgInBDcmVhdGVJbmZvLT5hZGRyZXNzTW9kZVYiLCAiVmtTYW1wbGVyQWRkcmVzc01vZGUiLCBBbGxWa1NhbXBsZXJBZGRyZXNzTW9kZUVudW1zLCBwQ3JlYXRlSW5mby0+YWRkcmVzc01vZGVWLCAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWFkZHJlc3NNb2RlVi1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNhbXBsZXIiLCAicENyZWF0ZUluZm8tPmFkZHJlc3NNb2RlVyIsICJWa1NhbXBsZXJBZGRyZXNzTW9kZSIsIEFsbFZrU2FtcGxlckFkZHJlc3NNb2RlRW51bXMsIHBDcmVhdGVJbmZvLT5hZGRyZXNzTW9kZVcsICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYWRkcmVzc01vZGVXLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZVNhbXBsZXIiLCAicENyZWF0ZUluZm8tPmFuaXNvdHJvcHlFbmFibGUiLCBwQ3JlYXRlSW5mby0+YW5pc290cm9weUVuYWJsZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoInZrQ3JlYXRlU2FtcGxlciIsICJwQ3JlYXRlSW5mby0+Y29tcGFyZUVuYWJsZSIsIHBDcmVhdGVJbmZvLT5jb21wYXJlRW5hYmxlKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVTYW1wbGVyIiwgInBDcmVhdGVJbmZvLT51bm5vcm1hbGl6ZWRDb29yZGluYXRlcyIsIHBDcmVhdGVJbmZvLT51bm5vcm1hbGl6ZWRDb29yZGluYXRlcyk7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2FtcGxlciIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNhbXBsZXIiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTYW1wbGVyIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTYW1wbGVyIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2FtcGxlciIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2FtcGxlciIsICJwU2FtcGxlciIsIHBTYW1wbGVyLCAiVlVJRC12a0NyZWF0ZVNhbXBsZXItcFNhbXBsZXItcGFyYW1ldGVyIik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTYW1wbGVyKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U2FtcGxlciIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTYW1wbGVyIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVNhbXBsZXIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTYW1wbGVyIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVNhbXBsZXIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgIHBTZXRMYXlvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsICJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgIlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIiwgQWxsVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IiwgInBDcmVhdGVJbmZvLT5iaW5kaW5nQ291bnQiLCAicENyZWF0ZUluZm8tPnBCaW5kaW5ncyIsIHBDcmVhdGVJbmZvLT5iaW5kaW5nQ291bnQsICZwQ3JlYXRlSW5mby0+cEJpbmRpbmdzLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tcEJpbmRpbmdzLXBhcmFtZXRlciIpOworCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cEJpbmRpbmdzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgYmluZGluZ0luZGV4ID0gMDsgYmluZGluZ0luZGV4IDwgcENyZWF0ZUluZm8tPmJpbmRpbmdDb3VudDsgKytiaW5kaW5nSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBCaW5kaW5nc1slaV0uZGVzY3JpcHRvclR5cGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZGluZ0luZGV4IH0pLCAiVmtEZXNjcmlwdG9yVHlwZSIsIEFsbFZrRGVzY3JpcHRvclR5cGVFbnVtcywgcENyZWF0ZUluZm8tPnBCaW5kaW5nc1tiaW5kaW5nSW5kZXhdLmRlc2NyaXB0b3JUeXBlLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JUeXBlLXBhcmFtZXRlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCIsICJwU2V0TGF5b3V0IiwgcFNldExheW91dCwgIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0LXBTZXRMYXlvdXQtcGFyYW1ldGVyIik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTZXRMYXlvdXQpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0IiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yUG9vbCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yUG9vbC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfQ1JFQVRFX0lORk9fRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZURlc2NyaXB0b3JQb29sIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsICJWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMiLCBBbGxWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiLCAicENyZWF0ZUluZm8tPnBvb2xTaXplQ291bnQiLCAicENyZWF0ZUluZm8tPnBQb29sU2l6ZXMiLCBwQ3JlYXRlSW5mby0+cG9vbFNpemVDb3VudCwgJnBDcmVhdGVJbmZvLT5wUG9vbFNpemVzLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1wb29sU2l6ZUNvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8tcFBvb2xTaXplcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBQb29sU2l6ZXMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBwb29sU2l6ZUluZGV4ID0gMDsgcG9vbFNpemVJbmRleCA8IHBDcmVhdGVJbmZvLT5wb29sU2l6ZUNvdW50OyArK3Bvb2xTaXplSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVEZXNjcmlwdG9yUG9vbCIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wUG9vbFNpemVzWyVpXS50eXBlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHBvb2xTaXplSW5kZXggfSksICJWa0Rlc2NyaXB0b3JUeXBlIiwgQWxsVmtEZXNjcmlwdG9yVHlwZUVudW1zLCBwQ3JlYXRlSW5mby0+cFBvb2xTaXplc1twb29sU2l6ZUluZGV4XS50eXBlLCAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS10eXBlLXBhcmFtZXRlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclBvb2wiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXNjcmlwdG9yUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlc2NyaXB0b3JQb29sIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXNjcmlwdG9yUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlc2NyaXB0b3JQb29sIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXNjcmlwdG9yUG9vbCIsICJwRGVzY3JpcHRvclBvb2wiLCBwRGVzY3JpcHRvclBvb2wsICJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclBvb2wtcERlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JQb29sKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlc2NyaXB0b3JQb29sIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlc2NyaXB0b3JQb29sIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVJlc2V0RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrUmVzZXREZXNjcmlwdG9yUG9vbCIsICJkZXNjcmlwdG9yUG9vbCIsIGRlc2NyaXB0b3JQb29sKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a1Jlc2V0RGVzY3JpcHRvclBvb2wiLCAiZmxhZ3MiLCBmbGFncywgIlZVSUQtdmtSZXNldERlc2NyaXB0b3JQb29sLWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiLCAicEFsbG9jYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPIiwgcEFsbG9jYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzLXBBbGxvY2F0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBBbGxvY2F0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQUxMT0NBVEVfSU5GT19FWFQgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzIiwgInBBbGxvY2F0ZUluZm8tPnBOZXh0IiwgIlZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUIiwgcEFsbG9jYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiLCAicEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclBvb2wiLCBwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbCk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9oYW5kbGVfYXJyYXkoInZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyIsICJwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQiLCAicEFsbG9jYXRlSW5mby0+cFNldExheW91dHMiLCBwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQsIHBBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzLCB0cnVlLCB0cnVlKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0ZUluZm8gIT0gTlVMTCkgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMiLCAicEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50IiwgInBEZXNjcmlwdG9yU2V0cyIsIHBBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JTZXRDb3VudCwgJnBEZXNjcmlwdG9yU2V0cywgdHJ1ZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELXZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrRnJlZURlc2NyaXB0b3JTZXRzIiwgImRlc2NyaXB0b3JQb29sIiwgZGVzY3JpcHRvclBvb2wpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlRnJlZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIGRlc2NyaXB0b3JTZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRzIiwgImRlc2NyaXB0b3JXcml0ZUNvdW50IiwgInBEZXNjcmlwdG9yV3JpdGVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUIiwgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzLCBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVCwgZmFsc2UsIHRydWUsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvcldyaXRlcy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUluZGV4ID0gMDsgZGVzY3JpcHRvcldyaXRlSW5kZXggPCBkZXNjcmlwdG9yV3JpdGVDb3VudDsgKytkZXNjcmlwdG9yV3JpdGVJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1dyaXRlRGVzY3JpcHRvclNldFtdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WLCBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVF9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgfTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrVXBkYXRlRGVzY3JpcHRvclNldHMiLCBQYXJhbWV0ZXJOYW1lKCJwRGVzY3JpcHRvcldyaXRlc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVzY3JpcHRvcldyaXRlSW5kZXggfSksICJWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLCBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCIsIHBEZXNjcmlwdG9yV3JpdGVzW2Rlc2NyaXB0b3JXcml0ZUluZGV4XS5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtXcml0ZURlc2NyaXB0b3JTZXQpLCBhbGxvd2VkX3N0cnVjdHNfVmtXcml0ZURlc2NyaXB0b3JTZXQsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrVXBkYXRlRGVzY3JpcHRvclNldHMiLCBQYXJhbWV0ZXJOYW1lKCJwRGVzY3JpcHRvcldyaXRlc1slaV0uZGVzY3JpcHRvclR5cGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVzY3JpcHRvcldyaXRlSW5kZXggfSksICJWa0Rlc2NyaXB0b3JUeXBlIiwgQWxsVmtEZXNjcmlwdG9yVHlwZUVudW1zLCBwRGVzY3JpcHRvcldyaXRlc1tkZXNjcmlwdG9yV3JpdGVJbmRleF0uZGVzY3JpcHRvclR5cGUsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLXBhcmFtZXRlciIpOworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrVXBkYXRlRGVzY3JpcHRvclNldHMiLCAiZGVzY3JpcHRvckNvcHlDb3VudCIsICJwRGVzY3JpcHRvckNvcGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9DT1BZX0RFU0NSSVBUT1JfU0VUIiwgZGVzY3JpcHRvckNvcHlDb3VudCwgcERlc2NyaXB0b3JDb3BpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX0NPUFlfREVTQ1JJUFRPUl9TRVQsIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvckNvcGllcy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBEZXNjcmlwdG9yQ29waWVzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGRlc2NyaXB0b3JDb3B5SW5kZXggPSAwOyBkZXNjcmlwdG9yQ29weUluZGV4IDwgZGVzY3JpcHRvckNvcHlDb3VudDsgKytkZXNjcmlwdG9yQ29weUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtVcGRhdGVEZXNjcmlwdG9yU2V0cyIsIFBhcmFtZXRlck5hbWUoInBEZXNjcmlwdG9yQ29waWVzWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBkZXNjcmlwdG9yQ29weUluZGV4IH0pLCBOVUxMLCBwRGVzY3JpcHRvckNvcGllc1tkZXNjcmlwdG9yQ29weUluZGV4XS5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtVcGRhdGVEZXNjcmlwdG9yU2V0cyIsIFBhcmFtZXRlck5hbWUoInBEZXNjcmlwdG9yQ29waWVzWyVpXS5zcmNTZXQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVzY3JpcHRvckNvcHlJbmRleCB9KSwgcERlc2NyaXB0b3JDb3BpZXNbZGVzY3JpcHRvckNvcHlJbmRleF0uc3JjU2V0KTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrVXBkYXRlRGVzY3JpcHRvclNldHMiLCBQYXJhbWV0ZXJOYW1lKCJwRGVzY3JpcHRvckNvcGllc1slaV0uZHN0U2V0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGRlc2NyaXB0b3JDb3B5SW5kZXggfSksIHBEZXNjcmlwdG9yQ29waWVzW2Rlc2NyaXB0b3JDb3B5SW5kZXhdLmRzdFNldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIGRlc2NyaXB0b3JXcml0ZUNvdW50LCBwRGVzY3JpcHRvcldyaXRlcywgZGVzY3JpcHRvckNvcHlDb3VudCwgcERlc2NyaXB0b3JDb3BpZXMpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRnJhbWVidWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVGcmFtZWJ1ZmZlciIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVGcmFtZWJ1ZmZlci1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFIgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVGcmFtZWJ1ZmZlciIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCAiVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiIsIHBDcmVhdGVJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVGcmFtZWJ1ZmZlciIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCAiVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDcmVhdGVGcmFtZWJ1ZmZlciIsICJwQ3JlYXRlSW5mby0+cmVuZGVyUGFzcyIsIHBDcmVhdGVJbmZvLT5yZW5kZXJQYXNzKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVGcmFtZWJ1ZmZlciIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUZyYW1lYnVmZmVyIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRnJhbWVidWZmZXIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUZyYW1lYnVmZmVyIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRnJhbWVidWZmZXIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUZyYW1lYnVmZmVyIiwgInBGcmFtZWJ1ZmZlciIsIHBGcmFtZWJ1ZmZlciwgIlZVSUQtdmtDcmVhdGVGcmFtZWJ1ZmZlci1wRnJhbWVidWZmZXItcGFyYW1ldGVyIik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwRnJhbWVidWZmZXIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZyYW1lYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUZyYW1lYnVmZmVyIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUZyYW1lYnVmZmVyIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUZyYW1lYnVmZmVyIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RnJhbWVidWZmZXIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RnJhbWVidWZmZXIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVSZW5kZXJQYXNzIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1JlbmRlclBhc3NDcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk8sIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GTyB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQsIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8sIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8iLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlUmVuZGVyUGFzcyIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCAicENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCIsICJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzIiwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCwgJnBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBhdHRhY2htZW50SW5kZXggPSAwOyBhdHRhY2htZW50SW5kZXggPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50OyArK2F0dGFjaG1lbnRJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVpXS5mbGFncyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzIiwgQWxsVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cywgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVpXS5mb3JtYXQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYXR0YWNobWVudEluZGV4IH0pLCAiVmtGb3JtYXQiLCBBbGxWa0Zvcm1hdEVudW1zLCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0uZm9ybWF0LCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVpXS5zYW1wbGVzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbmRleCB9KSwgIlZrU2FtcGxlQ291bnRGbGFnQml0cyIsIEFsbFZrU2FtcGxlQ291bnRGbGFnQml0cywgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLnNhbXBsZXMsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc2FtcGxlcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zYW1wbGVzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVSZW5kZXJQYXNzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slaV0ubG9hZE9wIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbmRleCB9KSwgIlZrQXR0YWNobWVudExvYWRPcCIsIEFsbFZrQXR0YWNobWVudExvYWRPcEVudW1zLCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0ubG9hZE9wLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1sb2FkT3AtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVpXS5zdG9yZU9wIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbmRleCB9KSwgIlZrQXR0YWNobWVudFN0b3JlT3AiLCBBbGxWa0F0dGFjaG1lbnRTdG9yZU9wRW51bXMsIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XS5zdG9yZU9wLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zdG9yZU9wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVSZW5kZXJQYXNzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slaV0uc3RlbmNpbExvYWRPcCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa0F0dGFjaG1lbnRMb2FkT3AiLCBBbGxWa0F0dGFjaG1lbnRMb2FkT3BFbnVtcywgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLnN0ZW5jaWxMb2FkT3AsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXN0ZW5jaWxMb2FkT3AtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVpXS5zdGVuY2lsU3RvcmVPcCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa0F0dGFjaG1lbnRTdG9yZU9wIiwgQWxsVmtBdHRhY2htZW50U3RvcmVPcEVudW1zLCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0uc3RlbmNpbFN0b3JlT3AsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXN0ZW5jaWxTdG9yZU9wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVSZW5kZXJQYXNzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slaV0uaW5pdGlhbExheW91dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa0ltYWdlTGF5b3V0IiwgQWxsVmtJbWFnZUxheW91dEVudW1zLCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0uaW5pdGlhbExheW91dCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24taW5pdGlhbExheW91dC1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbJWldLmZpbmFsTGF5b3V0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbmRleCB9KSwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XS5maW5hbExheW91dCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZmluYWxMYXlvdXQtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCAicENyZWF0ZUluZm8tPnN1YnBhc3NDb3VudCIsICJwQ3JlYXRlSW5mby0+cFN1YnBhc3NlcyIsIHBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQsICZwQ3JlYXRlSW5mby0+cFN1YnBhc3NlcywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1zdWJwYXNzQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBTdWJwYXNzZXMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3Qgc3VicGFzc0luZGV4ID0gMDsgc3VicGFzc0luZGV4IDwgcENyZWF0ZUluZm8tPnN1YnBhc3NDb3VudDsgKytzdWJwYXNzSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVSZW5kZXJQYXNzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbJWldLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1YnBhc3NJbmRleCB9KSwgIlZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMiLCBBbGxWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzLCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucGlwZWxpbmVCaW5kUG9pbnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCAiVmtQaXBlbGluZUJpbmRQb2ludCIsIEFsbFZrUGlwZWxpbmVCaW5kUG9pbnRFbnVtcywgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5waXBlbGluZUJpbmRQb2ludCwgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0uaW5wdXRBdHRhY2htZW50Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucElucHV0QXR0YWNobWVudHMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLmlucHV0QXR0YWNobWVudENvdW50LCAmcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5wSW5wdXRBdHRhY2htZW50cywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wSW5wdXRBdHRhY2htZW50cy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnBJbnB1dEF0dGFjaG1lbnRzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGlucHV0QXR0YWNobWVudEluZGV4ID0gMDsgaW5wdXRBdHRhY2htZW50SW5kZXggPCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLmlucHV0QXR0YWNobWVudENvdW50OyArK2lucHV0QXR0YWNobWVudEluZGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucElucHV0QXR0YWNobWVudHNbJWldLmxheW91dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzdWJwYXNzSW5kZXgsIGlucHV0QXR0YWNobWVudEluZGV4IH0pLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5wSW5wdXRBdHRhY2htZW50c1tpbnB1dEF0dGFjaG1lbnRJbmRleF0ubGF5b3V0LCAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UtbGF5b3V0LXBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDcmVhdGVSZW5kZXJQYXNzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbJWldLmNvbG9yQXR0YWNobWVudENvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1YnBhc3NJbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbJWldLnBDb2xvckF0dGFjaG1lbnRzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1YnBhc3NJbmRleCB9KSwgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5jb2xvckF0dGFjaG1lbnRDb3VudCwgJnBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucENvbG9yQXR0YWNobWVudHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcENvbG9yQXR0YWNobWVudHMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5wQ29sb3JBdHRhY2htZW50cyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2xvckF0dGFjaG1lbnRJbmRleCA9IDA7IGNvbG9yQXR0YWNobWVudEluZGV4IDwgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5jb2xvckF0dGFjaG1lbnRDb3VudDsgKytjb2xvckF0dGFjaG1lbnRJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVSZW5kZXJQYXNzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbJWldLnBDb2xvckF0dGFjaG1lbnRzWyVpXS5sYXlvdXQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4LCBjb2xvckF0dGFjaG1lbnRJbmRleCB9KSwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucENvbG9yQXR0YWNobWVudHNbY29sb3JBdHRhY2htZW50SW5kZXhdLmxheW91dCwgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlLWxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnBSZXNvbHZlQXR0YWNobWVudHMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgY29sb3JBdHRhY2htZW50SW5kZXggPSAwOyBjb2xvckF0dGFjaG1lbnRJbmRleCA8IHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0uY29sb3JBdHRhY2htZW50Q291bnQ7ICsrY29sb3JBdHRhY2htZW50SW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wU3VicGFzc2VzWyVpXS5wUmVzb2x2ZUF0dGFjaG1lbnRzWyVpXS5sYXlvdXQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4LCBjb2xvckF0dGFjaG1lbnRJbmRleCB9KSwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucFJlc29sdmVBdHRhY2htZW50c1tjb2xvckF0dGFjaG1lbnRJbmRleF0ubGF5b3V0LCAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UtbGF5b3V0LXBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wU3VicGFzc2VzWyVpXS5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+bGF5b3V0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1YnBhc3NJbmRleCB9KSwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCwgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlLWxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucHJlc2VydmVBdHRhY2htZW50Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucFByZXNlcnZlQXR0YWNobWVudHMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnByZXNlcnZlQXR0YWNobWVudENvdW50LCAmcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5wUHJlc2VydmVBdHRhY2htZW50cywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUHJlc2VydmVBdHRhY2htZW50cy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlUmVuZGVyUGFzcyIsICJwQ3JlYXRlSW5mby0+ZGVwZW5kZW5jeUNvdW50IiwgInBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzIiwgcENyZWF0ZUluZm8tPmRlcGVuZGVuY3lDb3VudCwgJnBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcERlcGVuZGVuY2llcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkZXBlbmRlbmN5SW5kZXggPSAwOyBkZXBlbmRlbmN5SW5kZXggPCBwQ3JlYXRlSW5mby0+ZGVwZW5kZW5jeUNvdW50OyArK2RlcGVuZGVuY3lJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cERlcGVuZGVuY2llc1slaV0uc3JjU3RhZ2VNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGRlcGVuZGVuY3lJbmRleCB9KSwgIlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lJbmRleF0uc3JjU3RhZ2VNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cERlcGVuZGVuY2llc1slaV0uZHN0U3RhZ2VNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGRlcGVuZGVuY3lJbmRleCB9KSwgIlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lJbmRleF0uZHN0U3RhZ2VNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cERlcGVuZGVuY2llc1slaV0uc3JjQWNjZXNzTWFzayIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBkZXBlbmRlbmN5SW5kZXggfSksICJWa0FjY2Vzc0ZsYWdCaXRzIiwgQWxsVmtBY2Nlc3NGbGFnQml0cywgcENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeUluZGV4XS5zcmNBY2Nlc3NNYXNrLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNBY2Nlc3NNYXNrLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVSZW5kZXJQYXNzIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXNbJWldLmRzdEFjY2Vzc01hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVwZW5kZW5jeUluZGV4IH0pLCAiVmtBY2Nlc3NGbGFnQml0cyIsIEFsbFZrQWNjZXNzRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lJbmRleF0uZHN0QWNjZXNzTWFzaywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0QWNjZXNzTWFzay1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlUmVuZGVyUGFzcyIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzWyVpXS5kZXBlbmRlbmN5RmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVwZW5kZW5jeUluZGV4IH0pLCAiVmtEZXBlbmRlbmN5RmxhZ0JpdHMiLCBBbGxWa0RlcGVuZGVuY3lGbGFnQml0cywgcENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeUluZGV4XS5kZXBlbmRlbmN5RmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRlcGVuZGVuY3lGbGFncy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVSZW5kZXJQYXNzIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlUmVuZGVyUGFzcyIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlUmVuZGVyUGFzcyIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVJlbmRlclBhc3MiLCAicFJlbmRlclBhc3MiLCBwUmVuZGVyUGFzcywgIlZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzLXBSZW5kZXJQYXNzLXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzcyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUmVuZGVyUGFzcyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVJlbmRlclBhc3MiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UmVuZGVyUGFzcyIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lSZW5kZXJQYXNzIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95UmVuZGVyUGFzcyIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lSZW5kZXJQYXNzIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFJlbmRlckFyZWFHcmFudWxhcml0eSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgVmtFeHRlbnQyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhbnVsYXJpdHkpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiLCAicmVuZGVyUGFzcyIsIHJlbmRlclBhc3MpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiLCAicEdyYW51bGFyaXR5IiwgcEdyYW51bGFyaXR5LCAiVlVJRC12a0dldFJlbmRlckFyZWFHcmFudWxhcml0eS1wR3JhbnVsYXJpdHktcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtDb21tYW5kUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZFBvb2wpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZUNvbW1hbmRQb29sIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8sIHRydWUsICJWVUlELXZrQ3JlYXRlQ29tbWFuZFBvb2wtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtDb21tYW5kUG9vbENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUNvbW1hbmRQb29sIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtDb21tYW5kUG9vbENyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZUNvbW1hbmRQb29sIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsICJWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMiLCBBbGxWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUNvbW1hbmRQb29sIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQ29tbWFuZFBvb2wiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVDb21tYW5kUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQ29tbWFuZFBvb2wiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVDb21tYW5kUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQ29tbWFuZFBvb2wiLCAicENvbW1hbmRQb29sIiwgcENvbW1hbmRQb29sLCAiVlVJRC12a0NyZWF0ZUNvbW1hbmRQb29sLXBDb21tYW5kUG9vbC1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lDb21tYW5kUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lDb21tYW5kUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lDb21tYW5kUG9vbCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUNvbW1hbmRQb29sIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUNvbW1hbmRQb29sIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVJlc2V0Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrUmVzZXRDb21tYW5kUG9vbCIsICJjb21tYW5kUG9vbCIsIGNvbW1hbmRQb29sKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a1Jlc2V0Q29tbWFuZFBvb2wiLCAiZmxhZ3MiLCAiVmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMiLCBBbGxWa0NvbW1hbmRQb29sUmVzZXRGbGFnQml0cywgZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC12a1Jlc2V0Q29tbWFuZFBvb2wtZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiLCAicEFsbG9jYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPIiwgcEFsbG9jYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzLXBBbGxvY2F0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBBbGxvY2F0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiLCAicEFsbG9jYXRlSW5mby0+cE5leHQiLCBOVUxMLCBwQWxsb2NhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyIsICJwQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbCIsIHBBbGxvY2F0ZUluZm8tPmNvbW1hbmRQb29sKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMiLCAicEFsbG9jYXRlSW5mby0+bGV2ZWwiLCAiVmtDb21tYW5kQnVmZmVyTGV2ZWwiLCBBbGxWa0NvbW1hbmRCdWZmZXJMZXZlbEVudW1zLCBwQWxsb2NhdGVJbmZvLT5sZXZlbCwgIlZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLWxldmVsLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRlSW5mbyAhPSBOVUxMKSB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyIsICJwQWxsb2NhdGVJbmZvLT5jb21tYW5kQnVmZmVyQ291bnQiLCAicENvbW1hbmRCdWZmZXJzIiwgcEFsbG9jYXRlSW5mby0+Y29tbWFuZEJ1ZmZlckNvdW50LCAmcENvbW1hbmRCdWZmZXJzLCB0cnVlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzLXBDb21tYW5kQnVmZmVycy1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRnJlZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtGcmVlQ29tbWFuZEJ1ZmZlcnMiLCAiY29tbWFuZFBvb2wiLCBjb21tYW5kUG9vbCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQmVnaW5Db21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qICAgICAgICAgICAgIHBCZWdpbkluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0JlZ2luQ29tbWFuZEJ1ZmZlciIsICJwQmVnaW5JbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8iLCBwQmVnaW5JbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPLCB0cnVlLCAiVlVJRC12a0JlZ2luQ29tbWFuZEJ1ZmZlci1wQmVnaW5JbmZvLXBhcmFtZXRlciIsICJWVUlELVZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQmVnaW5JbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTyB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0JlZ2luQ29tbWFuZEJ1ZmZlciIsICJwQmVnaW5JbmZvLT5wTmV4dCIsICJWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyIsIHBCZWdpbkluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0JlZ2luQ29tbWFuZEJ1ZmZlciIsICJwQmVnaW5JbmZvLT5mbGFncyIsICJWa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIiwgQWxsVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0cywgcEJlZ2luSW5mby0+ZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgfQorICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIsIHBCZWdpbkluZm8pOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlUmVzZXRDb21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtSZXNldENvbW1hbmRCdWZmZXIiLCAiZmxhZ3MiLCAiVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyIsIEFsbFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHMsIGZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtdmtSZXNldENvbW1hbmRCdWZmZXItZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kQmluZFBpcGVsaW5lKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZEJpbmRQaXBlbGluZSIsICJwaXBlbGluZUJpbmRQb2ludCIsICJWa1BpcGVsaW5lQmluZFBvaW50IiwgQWxsVmtQaXBlbGluZUJpbmRQb2ludEVudW1zLCBwaXBlbGluZUJpbmRQb2ludCwgIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQmluZFBpcGVsaW5lIiwgInBpcGVsaW5lIiwgcGlwZWxpbmUpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kU2V0Vmlld3BvcnQiLCAidmlld3BvcnRDb3VudCIsICJwVmlld3BvcnRzIiwgdmlld3BvcnRDb3VudCwgJnBWaWV3cG9ydHMsIHRydWUsIHRydWUsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtcFZpZXdwb3J0cy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFZpZXdwb3J0cyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCB2aWV3cG9ydEluZGV4ID0gMDsgdmlld3BvcnRJbmRleCA8IHZpZXdwb3J0Q291bnQ7ICsrdmlld3BvcnRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydChjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRzKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRTY2lzc29yKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2lzc29ycykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kU2V0U2Npc3NvciIsICJzY2lzc29yQ291bnQiLCAicFNjaXNzb3JzIiwgc2Npc3NvckNvdW50LCAmcFNjaXNzb3JzLCB0cnVlLCB0cnVlLCAiVlVJRC12a0NtZFNldFNjaXNzb3Itc2Npc3NvckNvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLXBTY2lzc29ycy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFNjaXNzb3JzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHNjaXNzb3JJbmRleCA9IDA7IHNjaXNzb3JJbmRleCA8IHNjaXNzb3JDb3VudDsgKytzY2lzc29ySW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorCisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZFNldFNjaXNzb3IoY29tbWFuZEJ1ZmZlciwgZmlyc3RTY2lzc29yLCBzY2lzc29yQ291bnQsIHBTY2lzc29ycyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVdpZHRoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVdpZHRoKGNvbW1hbmRCdWZmZXIsIGxpbmVXaWR0aCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RGVwdGhCaWFzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ2xhbXAsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNTbG9wZUZhY3RvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldEJsZW5kQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kQ29uc3RhbnRzWzRdKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NtZFNldEJsZW5kQ29uc3RhbnRzIiwgImJsZW5kQ29uc3RhbnRzIiwgYmxlbmRDb25zdGFudHMsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hc2spIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayIsICJmYWNlTWFzayIsICJWa1N0ZW5jaWxGYWNlRmxhZ0JpdHMiLCBBbGxWa1N0ZW5jaWxGYWNlRmxhZ0JpdHMsIGZhY2VNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stZmFjZU1hc2stcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stZmFjZU1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0U3RlbmNpbFdyaXRlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTWFzaykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayIsICJmYWNlTWFzayIsICJWa1N0ZW5jaWxGYWNlRmxhZ0JpdHMiLCBBbGxWa1N0ZW5jaWxGYWNlRmxhZ0JpdHMsIGZhY2VNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLWZhY2VNYXNrLXBhcmFtZXRlciIsICJWVUlELXZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzay1mYWNlTWFzay1yZXF1aXJlZGJpdG1hc2siKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlIiwgImZhY2VNYXNrIiwgIlZrU3RlbmNpbEZhY2VGbGFnQml0cyIsIEFsbFZrU3RlbmNpbEZhY2VGbGFnQml0cywgZmFjZU1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC12a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UtZmFjZU1hc2stcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLWZhY2VNYXNrLXJlcXVpcmVkYml0bWFzayIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEJpbmREZXNjcmlwdG9yU2V0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY09mZnNldENvdW50LAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcER5bmFtaWNPZmZzZXRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCaW5kRGVzY3JpcHRvclNldHMiLCAicGlwZWxpbmVCaW5kUG9pbnQiLCAiVmtQaXBlbGluZUJpbmRQb2ludCIsIEFsbFZrUGlwZWxpbmVCaW5kUG9pbnRFbnVtcywgcGlwZWxpbmVCaW5kUG9pbnQsICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBpcGVsaW5lQmluZFBvaW50LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZEJpbmREZXNjcmlwdG9yU2V0cyIsICJsYXlvdXQiLCBsYXlvdXQpOworICAgIHNraXAgfD0gdmFsaWRhdGVfaGFuZGxlX2FycmF5KCJ2a0NtZEJpbmREZXNjcmlwdG9yU2V0cyIsICJkZXNjcmlwdG9yU2V0Q291bnQiLCAicERlc2NyaXB0b3JTZXRzIiwgZGVzY3JpcHRvclNldENvdW50LCBwRGVzY3JpcHRvclNldHMsIHRydWUsIHRydWUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kQmluZERlc2NyaXB0b3JTZXRzIiwgImR5bmFtaWNPZmZzZXRDb3VudCIsICJwRHluYW1pY09mZnNldHMiLCBkeW5hbWljT2Zmc2V0Q291bnQsICZwRHluYW1pY09mZnNldHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcER5bmFtaWNPZmZzZXRzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEJpbmRJbmRleEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtJbmRleFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFR5cGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRCaW5kSW5kZXhCdWZmZXIiLCAiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZEJpbmRJbmRleEJ1ZmZlciIsICJpbmRleFR5cGUiLCAiVmtJbmRleFR5cGUiLCBBbGxWa0luZGV4VHlwZUVudW1zLCBpbmRleFR5cGUsICJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWluZGV4VHlwZS1wYXJhbWV0ZXIiKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZEJpbmRJbmRleEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgaW5kZXhUeXBlKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRCaW5kVmVydGV4QnVmZmVycygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9oYW5kbGVfYXJyYXkoInZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiLCAiYmluZGluZ0NvdW50IiwgInBCdWZmZXJzIiwgYmluZGluZ0NvdW50LCBwQnVmZmVycywgdHJ1ZSwgdHJ1ZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRCaW5kVmVydGV4QnVmZmVycyIsICJiaW5kaW5nQ291bnQiLCAicE9mZnNldHMiLCBiaW5kaW5nQ291bnQsICZwT2Zmc2V0cywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1iaW5kaW5nQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLXBPZmZzZXRzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZERyYXcoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWZXJ0ZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWREcmF3KGNvbW1hbmRCdWZmZXIsIHZlcnRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleCwgZmlyc3RJbnN0YW5jZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluZGV4LAorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4T2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWREcmF3SW5kaXJlY3QiLCAiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkSW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCIsICJidWZmZXIiLCBidWZmZXIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgZHJhd0NvdW50LCBzdHJpZGUpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRGlzcGF0Y2goY29tbWFuZEJ1ZmZlciwgZ3JvdXBDb3VudFgsIGdyb3VwQ291bnRZLCBncm91cENvdW50Wik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRGlzcGF0Y2hJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWREaXNwYXRjaEluZGlyZWN0IiwgImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEluZGlyZWN0KGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0KTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRDb3B5QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRDb3B5QnVmZmVyIiwgInNyY0J1ZmZlciIsIHNyY0J1ZmZlcik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQ29weUJ1ZmZlciIsICJkc3RCdWZmZXIiLCBkc3RCdWZmZXIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kQ29weUJ1ZmZlciIsICJyZWdpb25Db3VudCIsICJwUmVnaW9ucyIsIHJlZ2lvbkNvdW50LCAmcFJlZ2lvbnMsIHRydWUsIHRydWUsICJWVUlELXZrQ21kQ29weUJ1ZmZlci1yZWdpb25Db3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kQ29weUJ1ZmZlci1wUmVnaW9ucy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFJlZ2lvbnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcmVnaW9uSW5kZXggPSAwOyByZWdpb25JbmRleCA8IHJlZ2lvbkNvdW50OyArK3JlZ2lvbkluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRDb3B5SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQ29weUltYWdlIiwgInNyY0ltYWdlIiwgc3JjSW1hZ2UpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ21kQ29weUltYWdlIiwgInNyY0ltYWdlTGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHNyY0ltYWdlTGF5b3V0LCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZUxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRDb3B5SW1hZ2UiLCAiZHN0SW1hZ2UiLCBkc3RJbWFnZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRDb3B5SW1hZ2UiLCAiZHN0SW1hZ2VMYXlvdXQiLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgZHN0SW1hZ2VMYXlvdXQsICJWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlTGF5b3V0LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kQ29weUltYWdlIiwgInJlZ2lvbkNvdW50IiwgInBSZWdpb25zIiwgcmVnaW9uQ291bnQsICZwUmVnaW9ucywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC12a0NtZENvcHlJbWFnZS1wUmVnaW9ucy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFJlZ2lvbnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcmVnaW9uSW5kZXggPSAwOyByZWdpb25JbmRleCA8IHJlZ2lvbkNvdW50OyArK3JlZ2lvbkluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZENvcHlJbWFnZSIsIFBhcmFtZXRlck5hbWUoInBSZWdpb25zWyVpXS5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHJlZ2lvbkluZGV4IH0pLCAiVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiwgQWxsVmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBwUmVnaW9uc1tyZWdpb25JbmRleF0uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzaywga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRDb3B5SW1hZ2UiLCBQYXJhbWV0ZXJOYW1lKCJwUmVnaW9uc1slaV0uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyByZWdpb25JbmRleCB9KSwgIlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIsIEFsbFZrSW1hZ2VBc3BlY3RGbGFnQml0cywgcFJlZ2lvbnNbcmVnaW9uSW5kZXhdLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEJsaXRJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VCbGl0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMsCisgICAgVmtGaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRCbGl0SW1hZ2UiLCAic3JjSW1hZ2UiLCBzcmNJbWFnZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCbGl0SW1hZ2UiLCAic3JjSW1hZ2VMYXlvdXQiLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgc3JjSW1hZ2VMYXlvdXQsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlTGF5b3V0LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZEJsaXRJbWFnZSIsICJkc3RJbWFnZSIsIGRzdEltYWdlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZEJsaXRJbWFnZSIsICJkc3RJbWFnZUxheW91dCIsICJWa0ltYWdlTGF5b3V0IiwgQWxsVmtJbWFnZUxheW91dEVudW1zLCBkc3RJbWFnZUxheW91dCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRCbGl0SW1hZ2UiLCAicmVnaW9uQ291bnQiLCAicFJlZ2lvbnMiLCByZWdpb25Db3VudCwgJnBSZWdpb25zLCB0cnVlLCB0cnVlLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1yZWdpb25Db3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kQmxpdEltYWdlLXBSZWdpb25zLXBhcmFtZXRlciIpOworICAgIGlmIChwUmVnaW9ucyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCByZWdpb25JbmRleCA9IDA7IHJlZ2lvbkluZGV4IDwgcmVnaW9uQ291bnQ7ICsrcmVnaW9uSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kQmxpdEltYWdlIiwgUGFyYW1ldGVyTmFtZSgicFJlZ2lvbnNbJWldLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcmVnaW9uSW5kZXggfSksICJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiLCBBbGxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIHBSZWdpb25zW3JlZ2lvbkluZGV4XS5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kQmxpdEltYWdlIiwgUGFyYW1ldGVyTmFtZSgicFJlZ2lvbnNbJWldLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcmVnaW9uSW5kZXggfSksICJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiLCBBbGxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIHBSZWdpb25zW3JlZ2lvbkluZGV4XS5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCbGl0SW1hZ2UiLCAiZmlsdGVyIiwgIlZrRmlsdGVyIiwgQWxsVmtGaWx0ZXJFbnVtcywgZmlsdGVyLCAiVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItcGFyYW1ldGVyIik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRCbGl0SW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucywgZmlsdGVyKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRDb3B5QnVmZmVyVG9JbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlIiwgInNyY0J1ZmZlciIsIHNyY0J1ZmZlcik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UiLCAiZHN0SW1hZ2UiLCBkc3RJbWFnZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSIsICJkc3RJbWFnZUxheW91dCIsICJWa0ltYWdlTGF5b3V0IiwgQWxsVmtJbWFnZUxheW91dEVudW1zLCBkc3RJbWFnZUxheW91dCwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZUxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlIiwgInJlZ2lvbkNvdW50IiwgInBSZWdpb25zIiwgcmVnaW9uQ291bnQsICZwUmVnaW9ucywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1yZWdpb25Db3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBSZWdpb25zICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHJlZ2lvbkluZGV4ID0gMDsgcmVnaW9uSW5kZXggPCByZWdpb25Db3VudDsgKytyZWdpb25JbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRDb3B5QnVmZmVyVG9JbWFnZSIsIFBhcmFtZXRlck5hbWUoInBSZWdpb25zWyVpXS5pbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcmVnaW9uSW5kZXggfSksICJWa0ltYWdlQXNwZWN0RmxhZ0JpdHMiLCBBbGxWa0ltYWdlQXNwZWN0RmxhZ0JpdHMsIHBSZWdpb25zW3JlZ2lvbkluZGV4XS5pbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUJ1ZmZlclRvSW1hZ2UoY29tbWFuZEJ1ZmZlciwgc3JjQnVmZmVyLCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kQ29weUltYWdlVG9CdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciIsICJzcmNJbWFnZSIsIHNyY0ltYWdlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZENvcHlJbWFnZVRvQnVmZmVyIiwgInNyY0ltYWdlTGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHNyY0ltYWdlTGF5b3V0LCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlTGF5b3V0LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZENvcHlJbWFnZVRvQnVmZmVyIiwgImRzdEJ1ZmZlciIsIGRzdEJ1ZmZlcik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciIsICJyZWdpb25Db3VudCIsICJwUmVnaW9ucyIsIHJlZ2lvbkNvdW50LCAmcFJlZ2lvbnMsIHRydWUsIHRydWUsICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLXBhcmFtZXRlciIpOworICAgIGlmIChwUmVnaW9ucyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCByZWdpb25JbmRleCA9IDA7IHJlZ2lvbkluZGV4IDwgcmVnaW9uQ291bnQ7ICsrcmVnaW9uSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kQ29weUltYWdlVG9CdWZmZXIiLCBQYXJhbWV0ZXJOYW1lKCJwUmVnaW9uc1slaV0uaW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHJlZ2lvbkluZGV4IH0pLCAiVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiwgQWxsVmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBwUmVnaW9uc1tyZWdpb25JbmRleF0uaW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorCisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZENvcHlJbWFnZVRvQnVmZmVyKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0QnVmZmVyLCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kVXBkYXRlQnVmZmVyIiwgImRzdEJ1ZmZlciIsIGRzdEJ1ZmZlcik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRVcGRhdGVCdWZmZXIiLCAiZGF0YVNpemUiLCAicERhdGEiLCBkYXRhU2l6ZSwgJnBEYXRhLCB0cnVlLCB0cnVlLCAiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kYXRhU2l6ZS1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLXBEYXRhLXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kVXBkYXRlQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBkYXRhU2l6ZSwgcERhdGEpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEZpbGxCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRGaWxsQnVmZmVyIiwgImRzdEJ1ZmZlciIsIGRzdEJ1ZmZlcik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRGaWxsQnVmZmVyKGNvbW1hbmRCdWZmZXIsIGRzdEJ1ZmZlciwgZHN0T2Zmc2V0LCBzaXplLCBkYXRhKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRDbGVhckNvbG9ySW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSogICAgICAgICAgICAgICAgICAgIHBDb2xvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQ2xlYXJDb2xvckltYWdlIiwgImltYWdlIiwgaW1hZ2UpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ21kQ2xlYXJDb2xvckltYWdlIiwgImltYWdlTGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIGltYWdlTGF5b3V0LCAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZUxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ21kQ2xlYXJDb2xvckltYWdlIiwgInBDb2xvciIsIHBDb2xvciwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcENvbG9yLXBhcmFtZXRlciIpOworICAgIGlmIChwQ29sb3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NtZENsZWFyQ29sb3JJbWFnZSIsICJyYW5nZUNvdW50IiwgInBSYW5nZXMiLCByYW5nZUNvdW50LCAmcFJhbmdlcywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcmFuZ2VDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBSYW5nZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBSYW5nZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcmFuZ2VJbmRleCA9IDA7IHJhbmdlSW5kZXggPCByYW5nZUNvdW50OyArK3JhbmdlSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kQ2xlYXJDb2xvckltYWdlIiwgUGFyYW1ldGVyTmFtZSgicFJhbmdlc1slaV0uYXNwZWN0TWFzayIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyByYW5nZUluZGV4IH0pLCAiVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiwgQWxsVmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBwUmFuZ2VzW3JhbmdlSW5kZXhdLmFzcGVjdE1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSogICAgICAgICAgICAgcERlcHRoU3RlbmNpbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIsICJpbWFnZSIsIGltYWdlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiLCAiaW1hZ2VMYXlvdXQiLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgaW1hZ2VMYXlvdXQsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZUxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIsICJwRGVwdGhTdGVuY2lsIiwgcERlcHRoU3RlbmNpbCwgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBEZXB0aFN0ZW5jaWwtcGFyYW1ldGVyIik7CisgICAgaWYgKHBEZXB0aFN0ZW5jaWwgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiLCAicmFuZ2VDb3VudCIsICJwUmFuZ2VzIiwgcmFuZ2VDb3VudCwgJnBSYW5nZXMsIHRydWUsIHRydWUsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1yYW5nZUNvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBSYW5nZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcmFuZ2VJbmRleCA9IDA7IHJhbmdlSW5kZXggPCByYW5nZUNvdW50OyArK3JhbmdlSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIsIFBhcmFtZXRlck5hbWUoInBSYW5nZXNbJWldLmFzcGVjdE1hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcmFuZ2VJbmRleCB9KSwgIlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIsIEFsbFZrSW1hZ2VBc3BlY3RGbGFnQml0cywgcFJhbmdlc1tyYW5nZUluZGV4XS5hc3BlY3RNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQXR0YWNobWVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRDbGVhckF0dGFjaG1lbnRzIiwgImF0dGFjaG1lbnRDb3VudCIsICJwQXR0YWNobWVudHMiLCBhdHRhY2htZW50Q291bnQsICZwQXR0YWNobWVudHMsIHRydWUsIHRydWUsICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1hdHRhY2htZW50Q291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcEF0dGFjaG1lbnRzLXBhcmFtZXRlciIpOworICAgIGlmIChwQXR0YWNobWVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgYXR0YWNobWVudEluZGV4ID0gMDsgYXR0YWNobWVudEluZGV4IDwgYXR0YWNobWVudENvdW50OyArK2F0dGFjaG1lbnRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRDbGVhckF0dGFjaG1lbnRzIiwgUGFyYW1ldGVyTmFtZSgicEF0dGFjaG1lbnRzWyVpXS5hc3BlY3RNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbmRleCB9KSwgIlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIsIEFsbFZrSW1hZ2VBc3BlY3RGbGFnQml0cywgcEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0uYXNwZWN0TWFzaywga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrQ2xlYXJBdHRhY2htZW50LWFzcGVjdE1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtDbGVhckF0dGFjaG1lbnQtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kQ2xlYXJBdHRhY2htZW50cyIsICJyZWN0Q291bnQiLCAicFJlY3RzIiwgcmVjdENvdW50LCAmcFJlY3RzLCB0cnVlLCB0cnVlLCAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcmVjdENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXBSZWN0cy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFJlY3RzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHJlY3RJbmRleCA9IDA7IHJlY3RJbmRleCA8IHJlY3RDb3VudDsgKytyZWN0SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorCisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQXR0YWNobWVudHMoY29tbWFuZEJ1ZmZlciwgYXR0YWNobWVudENvdW50LCBwQXR0YWNobWVudHMsIHJlY3RDb3VudCwgcFJlY3RzKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRSZXNvbHZlSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlUmVzb2x2ZSogICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kUmVzb2x2ZUltYWdlIiwgInNyY0ltYWdlIiwgc3JjSW1hZ2UpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ21kUmVzb2x2ZUltYWdlIiwgInNyY0ltYWdlTGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIHNyY0ltYWdlTGF5b3V0LCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZUxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRSZXNvbHZlSW1hZ2UiLCAiZHN0SW1hZ2UiLCBkc3RJbWFnZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRSZXNvbHZlSW1hZ2UiLCAiZHN0SW1hZ2VMYXlvdXQiLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgZHN0SW1hZ2VMYXlvdXQsICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlTGF5b3V0LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kUmVzb2x2ZUltYWdlIiwgInJlZ2lvbkNvdW50IiwgInBSZWdpb25zIiwgcmVnaW9uQ291bnQsICZwUmVnaW9ucywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1wUmVnaW9ucy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFJlZ2lvbnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcmVnaW9uSW5kZXggPSAwOyByZWdpb25JbmRleCA8IHJlZ2lvbkNvdW50OyArK3JlZ2lvbkluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZFJlc29sdmVJbWFnZSIsIFBhcmFtZXRlck5hbWUoInBSZWdpb25zWyVpXS5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHJlZ2lvbkluZGV4IH0pLCAiVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiwgQWxsVmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBwUmVnaW9uc1tyZWdpb25JbmRleF0uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzaywga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRSZXNvbHZlSW1hZ2UiLCBQYXJhbWV0ZXJOYW1lKCJwUmVnaW9uc1slaV0uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyByZWdpb25JbmRleCB9KSwgIlZrSW1hZ2VBc3BlY3RGbGFnQml0cyIsIEFsbFZrSW1hZ2VBc3BlY3RGbGFnQml0cywgcFJlZ2lvbnNbcmVnaW9uSW5kZXhdLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VNYXNrKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kU2V0RXZlbnQiLCAiZXZlbnQiLCBldmVudCk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRTZXRFdmVudCIsICJzdGFnZU1hc2siLCAiVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiLCBBbGxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cywgc3RhZ2VNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kUmVzZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFJlc2V0RXZlbnQiLCAiZXZlbnQiLCBldmVudCk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRSZXNldEV2ZW50IiwgInN0YWdlTWFzayIsICJWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyIsIEFsbFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzLCBzdGFnZU1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLXBhcmFtZXRlciIsICJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kV2FpdEV2ZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50LAorICAgIGNvbnN0IFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50cywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2hhbmRsZV9hcnJheSgidmtDbWRXYWl0RXZlbnRzIiwgImV2ZW50Q291bnQiLCAicEV2ZW50cyIsIGV2ZW50Q291bnQsIHBFdmVudHMsIHRydWUsIHRydWUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kV2FpdEV2ZW50cyIsICJzcmNTdGFnZU1hc2siLCAiVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiLCBBbGxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cywgc3JjU3RhZ2VNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kV2FpdEV2ZW50cyIsICJkc3RTdGFnZU1hc2siLCAiVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiLCBBbGxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cywgZHN0U3RhZ2VNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0U3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ21kV2FpdEV2ZW50cyIsICJtZW1vcnlCYXJyaWVyQ291bnQiLCAicE1lbW9yeUJhcnJpZXJzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9CQVJSSUVSIiwgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9CQVJSSUVSLCBmYWxzZSwgdHJ1ZSwgIlZVSUQtVmtNZW1vcnlCYXJyaWVyLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXBNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBNZW1vcnlCYXJyaWVycyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBtZW1vcnlCYXJyaWVySW5kZXggPSAwOyBtZW1vcnlCYXJyaWVySW5kZXggPCBtZW1vcnlCYXJyaWVyQ291bnQ7ICsrbWVtb3J5QmFycmllckluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDbWRXYWl0RXZlbnRzIiwgUGFyYW1ldGVyTmFtZSgicE1lbW9yeUJhcnJpZXJzWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBtZW1vcnlCYXJyaWVySW5kZXggfSksIE5VTEwsIHBNZW1vcnlCYXJyaWVyc1ttZW1vcnlCYXJyaWVySW5kZXhdLnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa01lbW9yeUJhcnJpZXItcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRXYWl0RXZlbnRzIiwgUGFyYW1ldGVyTmFtZSgicE1lbW9yeUJhcnJpZXJzWyVpXS5zcmNBY2Nlc3NNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IG1lbW9yeUJhcnJpZXJJbmRleCB9KSwgIlZrQWNjZXNzRmxhZ0JpdHMiLCBBbGxWa0FjY2Vzc0ZsYWdCaXRzLCBwTWVtb3J5QmFycmllcnNbbWVtb3J5QmFycmllckluZGV4XS5zcmNBY2Nlc3NNYXNrLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtNZW1vcnlCYXJyaWVyLXNyY0FjY2Vzc01hc2stcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kV2FpdEV2ZW50cyIsIFBhcmFtZXRlck5hbWUoInBNZW1vcnlCYXJyaWVyc1slaV0uZHN0QWNjZXNzTWFzayIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBtZW1vcnlCYXJyaWVySW5kZXggfSksICJWa0FjY2Vzc0ZsYWdCaXRzIiwgQWxsVmtBY2Nlc3NGbGFnQml0cywgcE1lbW9yeUJhcnJpZXJzW21lbW9yeUJhcnJpZXJJbmRleF0uZHN0QWNjZXNzTWFzaywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrTWVtb3J5QmFycmllci1kc3RBY2Nlc3NNYXNrLXBhcmFtZXRlciIpOworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ21kV2FpdEV2ZW50cyIsICJidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQiLCAicEJ1ZmZlck1lbW9yeUJhcnJpZXJzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUiIsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX0JBUlJJRVIsIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItc1R5cGUtc1R5cGUiLCAiVlVJRC12a0NtZFdhaXRFdmVudHMtcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEJ1ZmZlck1lbW9yeUJhcnJpZXJzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJJbmRleCA9IDA7IGJ1ZmZlck1lbW9yeUJhcnJpZXJJbmRleCA8IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudDsgKytidWZmZXJNZW1vcnlCYXJyaWVySW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFdhaXRFdmVudHMiLCBQYXJhbWV0ZXJOYW1lKCJwQnVmZmVyTWVtb3J5QmFycmllcnNbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJ1ZmZlck1lbW9yeUJhcnJpZXJJbmRleCB9KSwgTlVMTCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2J1ZmZlck1lbW9yeUJhcnJpZXJJbmRleF0ucE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRXYWl0RXZlbnRzIiwgUGFyYW1ldGVyTmFtZSgicEJ1ZmZlck1lbW9yeUJhcnJpZXJzWyVpXS5idWZmZXIiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYnVmZmVyTWVtb3J5QmFycmllckluZGV4IH0pLCBwQnVmZmVyTWVtb3J5QmFycmllcnNbYnVmZmVyTWVtb3J5QmFycmllckluZGV4XS5idWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ21kV2FpdEV2ZW50cyIsICJpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCIsICJwSW1hZ2VNZW1vcnlCYXJyaWVycyIsICJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUiIsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycywgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVIsIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zVHlwZS1zVHlwZSIsICJWVUlELXZrQ21kV2FpdEV2ZW50cy1wSW1hZ2VNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBJbWFnZU1lbW9yeUJhcnJpZXJzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckluZGV4ID0gMDsgaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXggPCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudDsgKytpbWFnZU1lbW9yeUJhcnJpZXJJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0ltYWdlTWVtb3J5QmFycmllcltdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhUIH07CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFdhaXRFdmVudHMiLCBQYXJhbWV0ZXJOYW1lKCJwSW1hZ2VNZW1vcnlCYXJyaWVyc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXggfSksICJWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQiLCBwSW1hZ2VNZW1vcnlCYXJyaWVyc1tpbWFnZU1lbW9yeUJhcnJpZXJJbmRleF0ucE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZFdhaXRFdmVudHMiLCBQYXJhbWV0ZXJOYW1lKCJwSW1hZ2VNZW1vcnlCYXJyaWVyc1slaV0ub2xkTGF5b3V0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGltYWdlTWVtb3J5QmFycmllckluZGV4IH0pLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgcEltYWdlTWVtb3J5QmFycmllcnNbaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXhdLm9sZExheW91dCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZFdhaXRFdmVudHMiLCBQYXJhbWV0ZXJOYW1lKCJwSW1hZ2VNZW1vcnlCYXJyaWVyc1slaV0ubmV3TGF5b3V0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGltYWdlTWVtb3J5QmFycmllckluZGV4IH0pLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgcEltYWdlTWVtb3J5QmFycmllcnNbaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXhdLm5ld0xheW91dCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItbmV3TGF5b3V0LXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRXYWl0RXZlbnRzIiwgUGFyYW1ldGVyTmFtZSgicEltYWdlTWVtb3J5QmFycmllcnNbJWldLmltYWdlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGltYWdlTWVtb3J5QmFycmllckluZGV4IH0pLCBwSW1hZ2VNZW1vcnlCYXJyaWVyc1tpbWFnZU1lbW9yeUJhcnJpZXJJbmRleF0uaW1hZ2UpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZFdhaXRFdmVudHMiLCBQYXJhbWV0ZXJOYW1lKCJwSW1hZ2VNZW1vcnlCYXJyaWVyc1slaV0uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGltYWdlTWVtb3J5QmFycmllckluZGV4IH0pLCAiVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiwgQWxsVmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBwSW1hZ2VNZW1vcnlCYXJyaWVyc1tpbWFnZU1lbW9yeUJhcnJpZXJJbmRleF0uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRQaXBlbGluZUJhcnJpZXIiLCAic3JjU3RhZ2VNYXNrIiwgIlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMsIHNyY1N0YWdlTWFzaywga1JlcXVpcmVkRmxhZ3MsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRQaXBlbGluZUJhcnJpZXIiLCAiZHN0U3RhZ2VNYXNrIiwgIlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMsIGRzdFN0YWdlTWFzaywga1JlcXVpcmVkRmxhZ3MsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRQaXBlbGluZUJhcnJpZXIiLCAiZGVwZW5kZW5jeUZsYWdzIiwgIlZrRGVwZW5kZW5jeUZsYWdCaXRzIiwgQWxsVmtEZXBlbmRlbmN5RmxhZ0JpdHMsIGRlcGVuZGVuY3lGbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRlcGVuZGVuY3lGbGFncy1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NtZFBpcGVsaW5lQmFycmllciIsICJtZW1vcnlCYXJyaWVyQ291bnQiLCAicE1lbW9yeUJhcnJpZXJzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9CQVJSSUVSIiwgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9CQVJSSUVSLCBmYWxzZSwgdHJ1ZSwgIlZVSUQtVmtNZW1vcnlCYXJyaWVyLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcE1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocE1lbW9yeUJhcnJpZXJzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IG1lbW9yeUJhcnJpZXJJbmRleCA9IDA7IG1lbW9yeUJhcnJpZXJJbmRleCA8IG1lbW9yeUJhcnJpZXJDb3VudDsgKyttZW1vcnlCYXJyaWVySW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFBpcGVsaW5lQmFycmllciIsIFBhcmFtZXRlck5hbWUoInBNZW1vcnlCYXJyaWVyc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgbWVtb3J5QmFycmllckluZGV4IH0pLCBOVUxMLCBwTWVtb3J5QmFycmllcnNbbWVtb3J5QmFycmllckluZGV4XS5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtNZW1vcnlCYXJyaWVyLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kUGlwZWxpbmVCYXJyaWVyIiwgUGFyYW1ldGVyTmFtZSgicE1lbW9yeUJhcnJpZXJzWyVpXS5zcmNBY2Nlc3NNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IG1lbW9yeUJhcnJpZXJJbmRleCB9KSwgIlZrQWNjZXNzRmxhZ0JpdHMiLCBBbGxWa0FjY2Vzc0ZsYWdCaXRzLCBwTWVtb3J5QmFycmllcnNbbWVtb3J5QmFycmllckluZGV4XS5zcmNBY2Nlc3NNYXNrLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtNZW1vcnlCYXJyaWVyLXNyY0FjY2Vzc01hc2stcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kUGlwZWxpbmVCYXJyaWVyIiwgUGFyYW1ldGVyTmFtZSgicE1lbW9yeUJhcnJpZXJzWyVpXS5kc3RBY2Nlc3NNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IG1lbW9yeUJhcnJpZXJJbmRleCB9KSwgIlZrQWNjZXNzRmxhZ0JpdHMiLCBBbGxWa0FjY2Vzc0ZsYWdCaXRzLCBwTWVtb3J5QmFycmllcnNbbWVtb3J5QmFycmllckluZGV4XS5kc3RBY2Nlc3NNYXNrLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtNZW1vcnlCYXJyaWVyLWRzdEFjY2Vzc01hc2stcGFyYW1ldGVyIik7CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtDbWRQaXBlbGluZUJhcnJpZXIiLCAiYnVmZmVyTWVtb3J5QmFycmllckNvdW50IiwgInBCdWZmZXJNZW1vcnlCYXJyaWVycyIsICJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX0JBUlJJRVIiLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBCdWZmZXJNZW1vcnlCYXJyaWVycywgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9CQVJSSUVSLCBmYWxzZSwgdHJ1ZSwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEJ1ZmZlck1lbW9yeUJhcnJpZXJzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJJbmRleCA9IDA7IGJ1ZmZlck1lbW9yeUJhcnJpZXJJbmRleCA8IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudDsgKytidWZmZXJNZW1vcnlCYXJyaWVySW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFBpcGVsaW5lQmFycmllciIsIFBhcmFtZXRlck5hbWUoInBCdWZmZXJNZW1vcnlCYXJyaWVyc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYnVmZmVyTWVtb3J5QmFycmllckluZGV4IH0pLCBOVUxMLCBwQnVmZmVyTWVtb3J5QmFycmllcnNbYnVmZmVyTWVtb3J5QmFycmllckluZGV4XS5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFBpcGVsaW5lQmFycmllciIsIFBhcmFtZXRlck5hbWUoInBCdWZmZXJNZW1vcnlCYXJyaWVyc1slaV0uYnVmZmVyIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJ1ZmZlck1lbW9yeUJhcnJpZXJJbmRleCB9KSwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2J1ZmZlck1lbW9yeUJhcnJpZXJJbmRleF0uYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NtZFBpcGVsaW5lQmFycmllciIsICJpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCIsICJwSW1hZ2VNZW1vcnlCYXJyaWVycyIsICJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUiIsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycywgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVIsIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zVHlwZS1zVHlwZSIsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBJbWFnZU1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocEltYWdlTWVtb3J5QmFycmllcnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXggPSAwOyBpbWFnZU1lbW9yeUJhcnJpZXJJbmRleCA8IGltYWdlTWVtb3J5QmFycmllckNvdW50OyArK2ltYWdlTWVtb3J5QmFycmllckluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQgfTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kUGlwZWxpbmVCYXJyaWVyIiwgUGFyYW1ldGVyTmFtZSgicEltYWdlTWVtb3J5QmFycmllcnNbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGltYWdlTWVtb3J5QmFycmllckluZGV4IH0pLCAiVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIiwgcEltYWdlTWVtb3J5QmFycmllcnNbaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXhdLnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa0ltYWdlTWVtb3J5QmFycmllciksIGFsbG93ZWRfc3RydWN0c19Wa0ltYWdlTWVtb3J5QmFycmllciwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRQaXBlbGluZUJhcnJpZXIiLCBQYXJhbWV0ZXJOYW1lKCJwSW1hZ2VNZW1vcnlCYXJyaWVyc1slaV0ub2xkTGF5b3V0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGltYWdlTWVtb3J5QmFycmllckluZGV4IH0pLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgcEltYWdlTWVtb3J5QmFycmllcnNbaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXhdLm9sZExheW91dCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZFBpcGVsaW5lQmFycmllciIsIFBhcmFtZXRlck5hbWUoInBJbWFnZU1lbW9yeUJhcnJpZXJzWyVpXS5uZXdMYXlvdXQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXggfSksICJWa0ltYWdlTGF5b3V0IiwgQWxsVmtJbWFnZUxheW91dEVudW1zLCBwSW1hZ2VNZW1vcnlCYXJyaWVyc1tpbWFnZU1lbW9yeUJhcnJpZXJJbmRleF0ubmV3TGF5b3V0LCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1uZXdMYXlvdXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFBpcGVsaW5lQmFycmllciIsIFBhcmFtZXRlck5hbWUoInBJbWFnZU1lbW9yeUJhcnJpZXJzWyVpXS5pbWFnZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBpbWFnZU1lbW9yeUJhcnJpZXJJbmRleCB9KSwgcEltYWdlTWVtb3J5QmFycmllcnNbaW1hZ2VNZW1vcnlCYXJyaWVySW5kZXhdLmltYWdlKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRQaXBlbGluZUJhcnJpZXIiLCBQYXJhbWV0ZXJOYW1lKCJwSW1hZ2VNZW1vcnlCYXJyaWVyc1slaV0uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGltYWdlTWVtb3J5QmFycmllckluZGV4IH0pLCAiVmtJbWFnZUFzcGVjdEZsYWdCaXRzIiwgQWxsVmtJbWFnZUFzcGVjdEZsYWdCaXRzLCBwSW1hZ2VNZW1vcnlCYXJyaWVyc1tpbWFnZU1lbW9yeUJhcnJpZXJJbmRleF0uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZEJlZ2luUXVlcnkiLCAicXVlcnlQb29sIiwgcXVlcnlQb29sKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZEJlZ2luUXVlcnkiLCAiZmxhZ3MiLCAiVmtRdWVyeUNvbnRyb2xGbGFnQml0cyIsIEFsbFZrUXVlcnlDb250cm9sRmxhZ0JpdHMsIGZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LWZsYWdzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEVuZFF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kRW5kUXVlcnkiLCAicXVlcnlQb29sIiwgcXVlcnlQb29sKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFJlc2V0UXVlcnlQb29sIiwgInF1ZXJ5UG9vbCIsIHF1ZXJ5UG9vbCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRXcml0ZVRpbWVzdGFtcCIsICJwaXBlbGluZVN0YWdlIiwgIlZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMsIHBpcGVsaW5lU3RhZ2UsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1waXBlbGluZVN0YWdlLXBhcmFtZXRlciIsICJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcGlwZWxpbmVTdGFnZS1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRXcml0ZVRpbWVzdGFtcCIsICJxdWVyeVBvb2wiLCBxdWVyeVBvb2wpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZENvcHlRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIsICJxdWVyeVBvb2wiLCBxdWVyeVBvb2wpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzIiwgImRzdEJ1ZmZlciIsIGRzdEJ1ZmZlcik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIsICJmbGFncyIsICJWa1F1ZXJ5UmVzdWx0RmxhZ0JpdHMiLCBBbGxWa1F1ZXJ5UmVzdWx0RmxhZ0JpdHMsIGZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1mbGFncy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFB1c2hDb25zdGFudHMiLCAibGF5b3V0IiwgbGF5b3V0KTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZFB1c2hDb25zdGFudHMiLCAic3RhZ2VGbGFncyIsICJWa1NoYWRlclN0YWdlRmxhZ0JpdHMiLCBBbGxWa1NoYWRlclN0YWdlRmxhZ0JpdHMsIHN0YWdlRmxhZ3MsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc3RhZ2VGbGFncy1wYXJhbWV0ZXIiLCAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc3RhZ2VGbGFncy1yZXF1aXJlZGJpdG1hc2siKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NtZFB1c2hDb25zdGFudHMiLCAic2l6ZSIsICJwVmFsdWVzIiwgc2l6ZSwgJnBWYWx1ZXMsIHRydWUsIHRydWUsICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1zaXplLWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXBWYWx1ZXMtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5SZW5kZXJQYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ21kQmVnaW5SZW5kZXJQYXNzIiwgInBSZW5kZXJQYXNzQmVnaW4iLCAiVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTyIsIHBSZW5kZXJQYXNzQmVnaW4sIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sIHRydWUsICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLXBSZW5kZXJQYXNzQmVnaW4tcGFyYW1ldGVyIiwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBSZW5kZXJQYXNzQmVnaW4gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtSZW5kZXJQYXNzQmVnaW5JbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19BVFRBQ0hNRU5UX0JFR0lOX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19TQU1QTEVfTE9DQVRJT05TX0JFR0lOX0lORk9fRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kQmVnaW5SZW5kZXJQYXNzIiwgInBSZW5kZXJQYXNzQmVnaW4tPnBOZXh0IiwgIlZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvLCBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLCBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQiLCBwUmVuZGVyUGFzc0JlZ2luLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtSZW5kZXJQYXNzQmVnaW5JbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQmVnaW5SZW5kZXJQYXNzIiwgInBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlclBhc3MiLCBwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRCZWdpblJlbmRlclBhc3MiLCAicFJlbmRlclBhc3NCZWdpbi0+ZnJhbWVidWZmZXIiLCBwUmVuZGVyUGFzc0JlZ2luLT5mcmFtZWJ1ZmZlcik7CisKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRCZWdpblJlbmRlclBhc3MiLCAicFJlbmRlclBhc3NCZWdpbi0+Y2xlYXJWYWx1ZUNvdW50IiwgInBSZW5kZXJQYXNzQmVnaW4tPnBDbGVhclZhbHVlcyIsIHBSZW5kZXJQYXNzQmVnaW4tPmNsZWFyVmFsdWVDb3VudCwgJnBSZW5kZXJQYXNzQmVnaW4tPnBDbGVhclZhbHVlcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcENsZWFyVmFsdWVzLXBhcmFtZXRlciIpOworCisgICAgICAgIGlmIChwUmVuZGVyUGFzc0JlZ2luLT5wQ2xlYXJWYWx1ZXMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjbGVhclZhbHVlSW5kZXggPSAwOyBjbGVhclZhbHVlSW5kZXggPCBwUmVuZGVyUGFzc0JlZ2luLT5jbGVhclZhbHVlQ291bnQ7ICsrY2xlYXJWYWx1ZUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorCisgICAgICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCZWdpblJlbmRlclBhc3MiLCAiY29udGVudHMiLCAiVmtTdWJwYXNzQ29udGVudHMiLCBBbGxWa1N1YnBhc3NDb250ZW50c0VudW1zLCBjb250ZW50cywgIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtY29udGVudHMtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kTmV4dFN1YnBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZE5leHRTdWJwYXNzIiwgImNvbnRlbnRzIiwgIlZrU3VicGFzc0NvbnRlbnRzIiwgQWxsVmtTdWJwYXNzQ29udGVudHNFbnVtcywgY29udGVudHMsICJWVUlELXZrQ21kTmV4dFN1YnBhc3MtY29udGVudHMtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRFeGVjdXRlQ29tbWFuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9oYW5kbGVfYXJyYXkoInZrQ21kRXhlY3V0ZUNvbW1hbmRzIiwgImNvbW1hbmRCdWZmZXJDb3VudCIsICJwQ29tbWFuZEJ1ZmZlcnMiLCBjb21tYW5kQnVmZmVyQ291bnQsIHBDb21tYW5kQnVmZmVycywgdHJ1ZSwgdHJ1ZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0JpbmRCdWZmZXJNZW1vcnkyIiwgImJpbmRJbmZvQ291bnQiLCAicEJpbmRJbmZvcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfSU5GTyIsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MsIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5Mi1wQmluZEluZm9zLXBhcmFtZXRlciIsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItYmluZEluZm9Db3VudC1hcnJheWxlbmd0aCIpOworICAgIGlmIChwQmluZEluZm9zICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGJpbmRJbmZvSW5kZXggPSAwOyBiaW5kSW5mb0luZGV4IDwgYmluZEluZm9Db3VudDsgKytiaW5kSW5mb0luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPIH07CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0JpbmRCdWZmZXJNZW1vcnkyIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgIlZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyIsIHBCaW5kSW5mb3NbYmluZEluZm9JbmRleF0ucE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtCaW5kQnVmZmVyTWVtb3J5SW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtCaW5kQnVmZmVyTWVtb3J5MiIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb3NbJWldLmJ1ZmZlciIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBwQmluZEluZm9zW2JpbmRJbmZvSW5kZXhdLmJ1ZmZlcik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0JpbmRCdWZmZXJNZW1vcnkyIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvc1slaV0ubWVtb3J5IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXggfSksIHBCaW5kSW5mb3NbYmluZEluZm9JbmRleF0ubWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0JpbmRJbWFnZU1lbW9yeTIiLCAiYmluZEluZm9Db3VudCIsICJwQmluZEluZm9zIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0lORk8iLCBiaW5kSW5mb0NvdW50LCBwQmluZEluZm9zLCBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tc1R5cGUtc1R5cGUiLCAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeTItcEJpbmRJbmZvcy1wYXJhbWV0ZXIiLCAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeTItYmluZEluZm9Db3VudC1hcnJheWxlbmd0aCIpOworICAgIGlmIChwQmluZEluZm9zICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGJpbmRJbmZvSW5kZXggPSAwOyBiaW5kSW5mb0luZGV4IDwgYmluZEluZm9Db3VudDsgKytiaW5kSW5mb0luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrQmluZEltYWdlTWVtb3J5SW5mb1tdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTywgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfU1dBUENIQUlOX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPIH07CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0JpbmRJbWFnZU1lbW9yeTIiLCBQYXJhbWV0ZXJOYW1lKCJwQmluZEluZm9zWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCAiVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8sIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiwgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8iLCBwQmluZEluZm9zW2JpbmRJbmZvSW5kZXhdLnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa0JpbmRJbWFnZU1lbW9yeUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQmluZEltYWdlTWVtb3J5MiIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb3NbJWldLmltYWdlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXggfSksIHBCaW5kSW5mb3NbYmluZEluZm9JbmRleF0uaW1hZ2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIsICJwUGVlck1lbW9yeUZlYXR1cmVzIiwgcFBlZXJNZW1vcnlGZWF0dXJlcywgIlZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1wUGVlck1lbW9yeUZlYXR1cmVzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldERldmljZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzaykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoQmFzZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMiLCAicFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCIsICJwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0dST1VQX1BST1BFUlRJRVMiLCBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTLCB0cnVlLCBmYWxzZSwgZmFsc2UsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMtc1R5cGUtc1R5cGUiLCAiVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzLXBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwUGh5c2ljYWxEZXZpY2VHcm91cEluZGV4ID0gMDsgcFBoeXNpY2FsRGV2aWNlR3JvdXBJbmRleCA8ICpwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50OyArK3BQaHlzaWNhbERldmljZUdyb3VwSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIiwgInBJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIiwgcEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yLCB0cnVlLCAiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1wSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTyB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiIsICJwSW5mby0+cE5leHQiLCAiVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyIsIHBJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIiwgInBJbmZvLT5pbWFnZSIsIHBJbmZvLT5pbWFnZSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIiwgInBNZW1vcnlSZXF1aXJlbWVudHMiLCAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yIiwgcE1lbW9yeVJlcXVpcmVtZW50cywgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yLCB0cnVlLCAiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1wTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlciIsICJWVUlELVZrTWVtb3J5UmVxdWlyZW1lbnRzMi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwTWVtb3J5UmVxdWlyZW1lbnRzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiIsICJwSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIiLCBwSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yLCB0cnVlLCAiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czItcEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiIsICJwSW5mby0+cE5leHQiLCBOVUxMLCBwSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIiwgInBJbmZvLT5idWZmZXIiLCBwSW5mby0+YnVmZmVyKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIiwgInBNZW1vcnlSZXF1aXJlbWVudHMiLCAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yIiwgcE1lbW9yeVJlcXVpcmVtZW50cywgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yLCB0cnVlLCAiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czItcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa01lbW9yeVJlcXVpcmVtZW50czItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocE1lbW9yeVJlcXVpcmVtZW50cyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiLCAicEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1BBUlNFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIiwgcEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiwgdHJ1ZSwgIlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czItcEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiLCAicEluZm8tPnBOZXh0IiwgTlVMTCwgcEluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiLCAicEluZm8tPmltYWdlIiwgcEluZm8tPmltYWdlKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiLCAicFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQiLCAicFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyIsICJWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU18yIiwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMsIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzIsIHRydWUsIGZhbHNlLCBmYWxzZSwgIlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItc1R5cGUtc1R5cGUiLCAiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMi1wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRJbmRleCA9IDA7IHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudEluZGV4IDwgKnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50OyArK3BTcGFyc2VNZW1vcnlSZXF1aXJlbWVudEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiIsICJwRmVhdHVyZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzIiLCBwRmVhdHVyZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXBGZWF0dXJlcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXNUeXBlLXNUeXBlIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIiLCAicFByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMiIsIHBQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczItcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIiLCAiZm9ybWF0IiwgIlZrRm9ybWF0IiwgQWxsVmtGb3JtYXRFbnVtcywgZm9ybWF0LCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczItZm9ybWF0LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwRm9ybWF0UHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yIiwgcEZvcm1hdFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX0ZPUk1BVF9QUk9QRVJUSUVTXzIsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMi1wRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Zvcm1hdFByb3BlcnRpZXMyLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBGb3JtYXRQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIiwgInBJbWFnZUZvcm1hdEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIiLCBwSW1hZ2VGb3JtYXRJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMiwgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcEltYWdlRm9ybWF0SW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwSW1hZ2VGb3JtYXRJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfSU5GT19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9JTkZPX0VYVCB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwSW1hZ2VGb3JtYXRJbmZvLT5wTmV4dCIsICJWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIsIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhULCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8sIFZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCwgVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCIsIHBJbWFnZUZvcm1hdEluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiksIGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwSW1hZ2VGb3JtYXRJbmZvLT5mb3JtYXQiLCAiVmtGb3JtYXQiLCBBbGxWa0Zvcm1hdEVudW1zLCBwSW1hZ2VGb3JtYXRJbmZvLT5mb3JtYXQsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLWZvcm1hdC1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwSW1hZ2VGb3JtYXRJbmZvLT50eXBlIiwgIlZrSW1hZ2VUeXBlIiwgQWxsVmtJbWFnZVR5cGVFbnVtcywgcEltYWdlRm9ybWF0SW5mby0+dHlwZSwgIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzItdHlwZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwSW1hZ2VGb3JtYXRJbmZvLT50aWxpbmciLCAiVmtJbWFnZVRpbGluZyIsIEFsbFZrSW1hZ2VUaWxpbmdFbnVtcywgcEltYWdlRm9ybWF0SW5mby0+dGlsaW5nLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi10aWxpbmctcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIiLCAicEltYWdlRm9ybWF0SW5mby0+dXNhZ2UiLCAiVmtJbWFnZVVzYWdlRmxhZ0JpdHMiLCBBbGxWa0ltYWdlVXNhZ2VGbGFnQml0cywgcEltYWdlRm9ybWF0SW5mby0+dXNhZ2UsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwSW1hZ2VGb3JtYXRJbmZvLT5mbGFncyIsICJWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMiLCBBbGxWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMsIHBJbWFnZUZvcm1hdEluZm8tPmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzItZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIiwgInBJbWFnZUZvcm1hdFByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMiIsIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzIsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBJbWFnZUZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBJbWFnZUZvcm1hdFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIiLCAicFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCIsICJwUXVldWVGYW1pbHlQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9QUk9QRVJUSUVTXzIiLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yLCB0cnVlLCBmYWxzZSwgZmFsc2UsICJWVUlELVZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyLXBRdWV1ZUZhbWlseVByb3BlcnRpZXMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwUXVldWVGYW1pbHlQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHBRdWV1ZUZhbWlseVByb3BlcnR5SW5kZXggPSAwOyBwUXVldWVGYW1pbHlQcm9wZXJ0eUluZGV4IDwgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ7ICsrcFF1ZXVlRmFtaWx5UHJvcGVydHlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIiLCAicE1lbW9yeVByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzIiLCBwTWVtb3J5UHJvcGVydGllcywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzIsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMi1wTWVtb3J5UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocE1lbW9yeVByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogcEZvcm1hdEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIiLCAicEZvcm1hdEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NQQVJTRV9JTUFHRV9GT1JNQVRfSU5GT18yIiwgcEZvcm1hdEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMiwgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczItcEZvcm1hdEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEZvcm1hdEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwRm9ybWF0SW5mby0+cE5leHQiLCBOVUxMLCBwRm9ybWF0SW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIiLCAicEZvcm1hdEluZm8tPmZvcm1hdCIsICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIHBGb3JtYXRJbmZvLT5mb3JtYXQsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLWZvcm1hdC1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwRm9ybWF0SW5mby0+dHlwZSIsICJWa0ltYWdlVHlwZSIsIEFsbFZrSW1hZ2VUeXBlRW51bXMsIHBGb3JtYXRJbmZvLT50eXBlLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi10eXBlLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIiwgInBGb3JtYXRJbmZvLT5zYW1wbGVzIiwgIlZrU2FtcGxlQ291bnRGbGFnQml0cyIsIEFsbFZrU2FtcGxlQ291bnRGbGFnQml0cywgcEZvcm1hdEluZm8tPnNhbXBsZXMsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItc2FtcGxlcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi1zYW1wbGVzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIiwgInBGb3JtYXRJbmZvLT51c2FnZSIsICJWa0ltYWdlVXNhZ2VGbGFnQml0cyIsIEFsbFZrSW1hZ2VVc2FnZUZsYWdCaXRzLCBwRm9ybWF0SW5mby0+dXNhZ2UsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiIsICJwRm9ybWF0SW5mby0+dGlsaW5nIiwgIlZrSW1hZ2VUaWxpbmciLCBBbGxWa0ltYWdlVGlsaW5nRW51bXMsIHBGb3JtYXRJbmZvLT50aWxpbmcsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIiLCAicFByb3BlcnR5Q291bnQiLCAicFByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzIiLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yLCB0cnVlLCBmYWxzZSwgZmFsc2UsICJWVUlELVZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFByb3BlcnR5SW5kZXggPSAwOyBwUHJvcGVydHlJbmRleCA8ICpwUHJvcGVydHlDb3VudDsgKytwUHJvcGVydHlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlVHJpbUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1RyaW1Db21tYW5kUG9vbCIsICJjb21tYW5kUG9vbCIsIGNvbW1hbmRQb29sKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a1RyaW1Db21tYW5kUG9vbCIsICJmbGFncyIsIGZsYWdzLCAiVlVJRC12a1RyaW1Db21tYW5kUG9vbC1mbGFncy16ZXJvYml0bWFzayIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERldmljZVF1ZXVlMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUluZm8sCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldERldmljZVF1ZXVlMiIsICJwUXVldWVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9JTkZPXzIiLCBwUXVldWVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfSU5GT18yLCB0cnVlLCAiVlVJRC12a0dldERldmljZVF1ZXVlMi1wUXVldWVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGV2aWNlUXVldWVJbmZvMi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwUXVldWVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXREZXZpY2VRdWV1ZTIiLCAicFF1ZXVlSW5mby0+cE5leHQiLCBOVUxMLCBwUXVldWVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZXZpY2VRdWV1ZUluZm8yLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXREZXZpY2VRdWV1ZTIiLCAicFF1ZXVlSW5mby0+ZmxhZ3MiLCAiVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzLCBwUXVldWVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrRGV2aWNlUXVldWVJbmZvMi1mbGFncy1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldERldmljZVF1ZXVlMiIsICJwUXVldWUiLCBwUXVldWUsICJWVUlELXZrR2V0RGV2aWNlUXVldWUyLXBRdWV1ZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24tcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZPUk1BVF9BTkRST0lEIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCAiVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQiLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIsICJwQ3JlYXRlSW5mby0+Zm9ybWF0IiwgIlZrRm9ybWF0IiwgQWxsVmtGb3JtYXRFbnVtcywgcENyZWF0ZUluZm8tPmZvcm1hdCwgIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBDcmVhdGVJbmZvLT55Y2Jjck1vZGVsIiwgIlZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIiwgQWxsVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb25FbnVtcywgcENyZWF0ZUluZm8tPnljYmNyTW9kZWwsICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JNb2RlbC1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCAicENyZWF0ZUluZm8tPnljYmNyUmFuZ2UiLCAiVmtTYW1wbGVyWWNiY3JSYW5nZSIsIEFsbFZrU2FtcGxlclljYmNyUmFuZ2VFbnVtcywgcENyZWF0ZUluZm8tPnljYmNyUmFuZ2UsICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JSYW5nZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCAicENyZWF0ZUluZm8tPmNvbXBvbmVudHMuciIsICJWa0NvbXBvbmVudFN3aXp6bGUiLCBBbGxWa0NvbXBvbmVudFN3aXp6bGVFbnVtcywgcENyZWF0ZUluZm8tPmNvbXBvbmVudHMuciwgIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLXItcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBDcmVhdGVJbmZvLT5jb21wb25lbnRzLmciLCAiVmtDb21wb25lbnRTd2l6emxlIiwgQWxsVmtDb21wb25lbnRTd2l6emxlRW51bXMsIHBDcmVhdGVJbmZvLT5jb21wb25lbnRzLmcsICJWVUlELVZrQ29tcG9uZW50TWFwcGluZy1nLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIsICJwQ3JlYXRlSW5mby0+Y29tcG9uZW50cy5iIiwgIlZrQ29tcG9uZW50U3dpenpsZSIsIEFsbFZrQ29tcG9uZW50U3dpenpsZUVudW1zLCBwQ3JlYXRlSW5mby0+Y29tcG9uZW50cy5iLCAiVlVJRC1Wa0NvbXBvbmVudE1hcHBpbmctYi1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCAicENyZWF0ZUluZm8tPmNvbXBvbmVudHMuYSIsICJWa0NvbXBvbmVudFN3aXp6bGUiLCBBbGxWa0NvbXBvbmVudFN3aXp6bGVFbnVtcywgcENyZWF0ZUluZm8tPmNvbXBvbmVudHMuYSwgIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLWEtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBDcmVhdGVJbmZvLT54Q2hyb21hT2Zmc2V0IiwgIlZrQ2hyb21hTG9jYXRpb24iLCBBbGxWa0Nocm9tYUxvY2F0aW9uRW51bXMsIHBDcmVhdGVJbmZvLT54Q2hyb21hT2Zmc2V0LCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXhDaHJvbWFPZmZzZXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBDcmVhdGVJbmZvLT55Q2hyb21hT2Zmc2V0IiwgIlZrQ2hyb21hTG9jYXRpb24iLCBBbGxWa0Nocm9tYUxvY2F0aW9uRW51bXMsIHBDcmVhdGVJbmZvLT55Q2hyb21hT2Zmc2V0LCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXlDaHJvbWFPZmZzZXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBDcmVhdGVJbmZvLT5jaHJvbWFGaWx0ZXIiLCAiVmtGaWx0ZXIiLCBBbGxWa0ZpbHRlckVudW1zLCBwQ3JlYXRlSW5mby0+Y2hyb21hRmlsdGVyLCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNocm9tYUZpbHRlci1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBDcmVhdGVJbmZvLT5mb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb24iLCBwQ3JlYXRlSW5mby0+Zm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBZY2JjckNvbnZlcnNpb24iLCBwWWNiY3JDb252ZXJzaW9uLCAiVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24tcFljYmNyQ29udmVyc2lvbi1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk8sIHRydWUsICJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIsICJwQ3JlYXRlSW5mby0+ZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQiLCAicENyZWF0ZUluZm8tPnBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyIsIHBDcmVhdGVJbmZvLT5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudCwgJnBDcmVhdGVJbmZvLT5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMsIHRydWUsIHRydWUsICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkZXNjcmlwdG9yVXBkYXRlRW50cnlJbmRleCA9IDA7IGRlc2NyaXB0b3JVcGRhdGVFbnRyeUluZGV4IDwgcENyZWF0ZUluZm8tPmRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50OyArK2Rlc2NyaXB0b3JVcGRhdGVFbnRyeUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1slaV0uZGVzY3JpcHRvclR5cGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVzY3JpcHRvclVwZGF0ZUVudHJ5SW5kZXggfSksICJWa0Rlc2NyaXB0b3JUeXBlIiwgQWxsVmtEZXNjcmlwdG9yVHlwZUVudW1zLCBwQ3JlYXRlSW5mby0+cERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzW2Rlc2NyaXB0b3JVcGRhdGVFbnRyeUluZGV4XS5kZXNjcmlwdG9yVHlwZSwgIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeS1kZXNjcmlwdG9yVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgInBDcmVhdGVJbmZvLT50ZW1wbGF0ZVR5cGUiLCAiVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIiwgQWxsVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlRW51bXMsIHBDcmVhdGVJbmZvLT50ZW1wbGF0ZVR5cGUsICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtcGFyYW1ldGVyIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIsICJwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgIlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldCwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSIsICJkZXNjcmlwdG9yU2V0IiwgZGVzY3JpcHRvclNldCk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSIsICJkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogICBwRXh0ZXJuYWxCdWZmZXJJbmZvLAorICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiLCAicEV4dGVybmFsQnVmZmVySW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk8iLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk8sIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcEV4dGVybmFsQnVmZmVySW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBFeHRlcm5hbEJ1ZmZlckluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIiwgInBFeHRlcm5hbEJ1ZmZlckluZm8tPnBOZXh0IiwgTlVMTCwgcEV4dGVybmFsQnVmZmVySW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIiwgInBFeHRlcm5hbEJ1ZmZlckluZm8tPmZsYWdzIiwgIlZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMiLCBBbGxWa0J1ZmZlckNyZWF0ZUZsYWdCaXRzLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyIsICJwRXh0ZXJuYWxCdWZmZXJJbmZvLT51c2FnZSIsICJWa0J1ZmZlclVzYWdlRmxhZ0JpdHMiLCBBbGxWa0J1ZmZlclVzYWdlRmxhZ0JpdHMsIHBFeHRlcm5hbEJ1ZmZlckluZm8tPnVzYWdlLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby11c2FnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiLCAicEV4dGVybmFsQnVmZmVySW5mby0+aGFuZGxlVHlwZSIsICJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cywgcEV4dGVybmFsQnVmZmVySW5mby0+aGFuZGxlVHlwZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIiwgInBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVMiLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUywgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1wRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJWVUlELVZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiAgICBwRXh0ZXJuYWxGZW5jZUluZm8sCisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiLCAicEV4dGVybmFsRmVuY2VJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9GRU5DRV9JTkZPIiwgcEV4dGVybmFsRmVuY2VJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfRkVOQ0VfSU5GTywgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBFeHRlcm5hbEZlbmNlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEV4dGVybmFsRmVuY2VJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIiwgInBFeHRlcm5hbEZlbmNlSW5mby0+cE5leHQiLCBOVUxMLCBwRXh0ZXJuYWxGZW5jZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiLCAicEV4dGVybmFsRmVuY2VJbmZvLT5oYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyIsIEFsbFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cywgcEV4dGVybmFsRmVuY2VJbmZvLT5oYW5kbGVUeXBlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mby1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mby1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiLCAicEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZFTkNFX1BST1BFUlRJRVMiLCBwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZFTkNFX1BST1BFUlRJRVMsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1wRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sCisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqICAgICAgICAgICAgICBwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyIsICJwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9TRU1BUEhPUkVfSU5GTyIsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9TRU1BUEhPUkVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1wRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEV4dGVybmFsU2VtYXBob3JlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUiB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIiwgInBFeHRlcm5hbFNlbWFwaG9yZUluZm8tPnBOZXh0IiwgIlZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIiLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyIsICJwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLT5oYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzLCBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLT5oYW5kbGVUeXBlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8taGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiLCAicEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9TRU1BUEhPUkVfUFJPUEVSVElFUyIsIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0JJTkRJTkdfRkxBR1NfQ1JFQVRFX0lORk9fRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQiLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgIlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIiwgQWxsVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCIsICJwQ3JlYXRlSW5mby0+YmluZGluZ0NvdW50IiwgInBDcmVhdGVJbmZvLT5wQmluZGluZ3MiLCBwQ3JlYXRlSW5mby0+YmluZGluZ0NvdW50LCAmcENyZWF0ZUluZm8tPnBCaW5kaW5ncywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLXBCaW5kaW5ncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBCaW5kaW5ncyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGJpbmRpbmdJbmRleCA9IDA7IGJpbmRpbmdJbmRleCA8IHBDcmVhdGVJbmZvLT5iaW5kaW5nQ291bnQ7ICsrYmluZGluZ0luZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEJpbmRpbmdzWyVpXS5kZXNjcmlwdG9yVHlwZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kaW5nSW5kZXggfSksICJWa0Rlc2NyaXB0b3JUeXBlIiwgQWxsVmtEZXNjcmlwdG9yVHlwZUVudW1zLCBwQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2JpbmRpbmdJbmRleF0uZGVzY3JpcHRvclR5cGUsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCIsICJwU3VwcG9ydCIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVCIsIHBTdXBwb3J0LCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVCwgdHJ1ZSwgIlZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1wU3VwcG9ydC1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBTdXBwb3J0ICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEZXN0cm95U3VyZmFjZUtIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0Jvb2wzMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIiwgInN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiIsICJwU3VwcG9ydGVkIiwgcFN1cHBvcnRlZCwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLXBTdXBwb3J0ZWQtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiIsICJzdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiIsICJwU3VyZmFjZUNhcGFiaWxpdGllcyIsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUi1wU3VyZmFjZUNhcGFiaWxpdGllcy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFN1cmZhY2VDYXBhYmlsaXRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIiLCAic3VyZmFjZSIsIHN1cmZhY2UpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiIsICJwU3VyZmFjZUZvcm1hdENvdW50IiwgInBTdXJmYWNlRm9ybWF0cyIsIHBTdXJmYWNlRm9ybWF0Q291bnQsICZwU3VyZmFjZUZvcm1hdHMsIHRydWUsIGZhbHNlLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1wU3VyZmFjZUZvcm1hdHMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBTdXJmYWNlRm9ybWF0cyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwU3VyZmFjZUZvcm1hdEluZGV4ID0gMDsgcFN1cmZhY2VGb3JtYXRJbmRleCA8ICpwU3VyZmFjZUZvcm1hdENvdW50OyArK3BTdXJmYWNlRm9ybWF0SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiwgInN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiIsICJwUHJlc2VudE1vZGVDb3VudCIsICJwUHJlc2VudE1vZGVzIiwgcFByZXNlbnRNb2RlQ291bnQsICZwUHJlc2VudE1vZGVzLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1wUHJlc2VudE1vZGVzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3dhcGNoYWluKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIiLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVTd2FwY2hhaW5LSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUltdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DT1VOVEVSX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLCBWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIsIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhULCBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhULCBWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhULCBWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EIiwgcENyZWF0ZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIpLCBhbGxvd2VkX3N0cnVjdHNfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCAiVmtTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUiIsIEFsbFZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFIsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCAicENyZWF0ZUluZm8tPnN1cmZhY2UiLCBwQ3JlYXRlSW5mby0+c3VyZmFjZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCAicENyZWF0ZUluZm8tPmltYWdlRm9ybWF0IiwgIlZrRm9ybWF0IiwgQWxsVmtGb3JtYXRFbnVtcywgcENyZWF0ZUluZm8tPmltYWdlRm9ybWF0LCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VGb3JtYXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCAicENyZWF0ZUluZm8tPmltYWdlQ29sb3JTcGFjZSIsICJWa0NvbG9yU3BhY2VLSFIiLCBBbGxWa0NvbG9yU3BhY2VLSFJFbnVtcywgcENyZWF0ZUluZm8tPmltYWdlQ29sb3JTcGFjZSwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlQ29sb3JTcGFjZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIsICJwQ3JlYXRlSW5mby0+aW1hZ2VVc2FnZSIsICJWa0ltYWdlVXNhZ2VGbGFnQml0cyIsIEFsbFZrSW1hZ2VVc2FnZUZsYWdCaXRzLCBwQ3JlYXRlSW5mby0+aW1hZ2VVc2FnZSwga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVVzYWdlLXBhcmFtZXRlciIsICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVVzYWdlLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgInBDcmVhdGVJbmZvLT5pbWFnZVNoYXJpbmdNb2RlIiwgIlZrU2hhcmluZ01vZGUiLCBBbGxWa1NoYXJpbmdNb2RlRW51bXMsIHBDcmVhdGVJbmZvLT5pbWFnZVNoYXJpbmdNb2RlLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VTaGFyaW5nTW9kZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIsICJwQ3JlYXRlSW5mby0+cHJlVHJhbnNmb3JtIiwgIlZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIiwgQWxsVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIsIHBDcmVhdGVJbmZvLT5wcmVUcmFuc2Zvcm0sIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZVRyYW5zZm9ybS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcHJlVHJhbnNmb3JtLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgInBDcmVhdGVJbmZvLT5jb21wb3NpdGVBbHBoYSIsICJWa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIiLCBBbGxWa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIsIHBDcmVhdGVJbmZvLT5jb21wb3NpdGVBbHBoYSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItY29tcG9zaXRlQWxwaGEtcGFyYW1ldGVyIiwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWNvbXBvc2l0ZUFscGhhLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgInBDcmVhdGVJbmZvLT5wcmVzZW50TW9kZSIsICJWa1ByZXNlbnRNb2RlS0hSIiwgQWxsVmtQcmVzZW50TW9kZUtIUkVudW1zLCBwQ3JlYXRlSW5mby0+cHJlc2VudE1vZGUsICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wcmVzZW50TW9kZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCAicENyZWF0ZUluZm8tPmNsaXBwZWQiLCBwQ3JlYXRlSW5mby0+Y2xpcHBlZCk7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTd2FwY2hhaW5LSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIsICJwU3dhcGNoYWluIiwgcFN3YXBjaGFpbiwgIlZVSUQtdmtDcmVhdGVTd2FwY2hhaW5LSFItcFN3YXBjaGFpbi1wYXJhbWV0ZXIiKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGVzdHJveVN3YXBjaGFpbktIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGVzdHJveVN3YXBjaGFpbktIUiIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVN3YXBjaGFpbktIUiIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U3dhcGNoYWluS0hSIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U3dhcGNoYWluS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVN3YXBjaGFpbktIUiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRTd2FwY2hhaW5JbWFnZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIiwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIiwgInN3YXBjaGFpbiIsIHN3YXBjaGFpbik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIiLCAicFN3YXBjaGFpbkltYWdlQ291bnQiLCAicFN3YXBjaGFpbkltYWdlcyIsIHBTd2FwY2hhaW5JbWFnZUNvdW50LCAmcFN3YXBjaGFpbkltYWdlcywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFItcFN3YXBjaGFpbkltYWdlcy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVBY3F1aXJlTmV4dEltYWdlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3dhcGNoYWluKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtBY3F1aXJlTmV4dEltYWdlS0hSIiwgInN3YXBjaGFpbiIsIHN3YXBjaGFpbik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiLCAicEltYWdlSW5kZXgiLCBwSW1hZ2VJbmRleCwgIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXBJbWFnZUluZGV4LXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZUtIUihkZXZpY2UsIHN3YXBjaGFpbiwgdGltZW91dCwgc2VtYXBob3JlLCBmZW5jZSwgcEltYWdlSW5kZXgpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVF1ZXVlUHJlc2VudEtIUigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrUHJlc2VudEluZm9LSFIqICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtRdWV1ZVByZXNlbnRLSFIiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3dhcGNoYWluKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1F1ZXVlUHJlc2VudEtIUiIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrUXVldWVQcmVzZW50S0hSIiwgInBQcmVzZW50SW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSIiwgcFByZXNlbnRJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wUHJlc2VudEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwUHJlc2VudEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtQcmVzZW50SW5mb0tIUltdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9JTkZPX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUkVTRU5UX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0ZSQU1FX1RPS0VOX0dHUCwgVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9SRUdJT05TX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9USU1FU19JTkZPX0dPT0dMRSB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a1F1ZXVlUHJlc2VudEtIUiIsICJwUHJlc2VudEluZm8tPnBOZXh0IiwgIlZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiwgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIsIFZrUHJlc2VudEZyYW1lVG9rZW5HR1AsIFZrUHJlc2VudFJlZ2lvbnNLSFIsIFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSIsIHBQcmVzZW50SW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUHJlc2VudEluZm9LSFIpLCBhbGxvd2VkX3N0cnVjdHNfVmtQcmVzZW50SW5mb0tIUiwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrUXVldWVQcmVzZW50S0hSIiwgInBQcmVzZW50SW5mby0+d2FpdFNlbWFwaG9yZUNvdW50IiwgInBQcmVzZW50SW5mby0+cFdhaXRTZW1hcGhvcmVzIiwgcFByZXNlbnRJbmZvLT53YWl0U2VtYXBob3JlQ291bnQsICZwUHJlc2VudEluZm8tPnBXYWl0U2VtYXBob3JlcywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBXYWl0U2VtYXBob3Jlcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2hhbmRsZV9hcnJheSgidmtRdWV1ZVByZXNlbnRLSFIiLCAicFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudCIsICJwUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zIiwgcFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudCwgcFByZXNlbnRJbmZvLT5wU3dhcGNoYWlucywgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtRdWV1ZVByZXNlbnRLSFIiLCAicFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudCIsICJwUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXMiLCBwUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50LCAmcFByZXNlbnRJbmZvLT5wSW1hZ2VJbmRpY2VzLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wSW1hZ2VJbmRpY2VzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrUXVldWVQcmVzZW50S0hSIiwgInBQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQiLCAicFByZXNlbnRJbmZvLT5wUmVzdWx0cyIsIHBQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQsICZwUHJlc2VudEluZm8tPnBSZXN1bHRzLCB0cnVlLCBmYWxzZSwgIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1zd2FwY2hhaW5Db3VudC1hcnJheWxlbmd0aCIsICJWVUlELVZrUHJlc2VudEluZm9LSFItcFJlc3VsdHMtcGFyYW1ldGVyIik7CisgICAgfQorICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlUXVldWVQcmVzZW50S0hSKHF1ZXVlLCBwUHJlc2VudEluZm8pOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogICAgICAgIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIiwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiLCAicERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSIiwgcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcywgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfQ0FQQUJJTElUSUVTX0tIUiwgdHJ1ZSwgIlZVSUQtdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFItcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiLCAicERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcy0+cE5leHQiLCBOVUxMLCBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFItcE5leHQtcE5leHQiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3N3YXBjaGFpbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIiLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIiLCAic3VyZmFjZSIsIHN1cmZhY2UpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUiIsICJzdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSIiwgInBSZWN0Q291bnQiLCAicFJlY3RzIiwgcFJlY3RDb3VudCwgJnBSZWN0cywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSLXBSZWN0cy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVBY3F1aXJlTmV4dEltYWdlMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiAgICAgICAgICAgIHBBY3F1aXJlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtBY3F1aXJlTmV4dEltYWdlMktIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQWNxdWlyZU5leHRJbWFnZTJLSFIiLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIiwgInBBY3F1aXJlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX05FWFRfSU1BR0VfSU5GT19LSFIiLCBwQWNxdWlyZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfTkVYVF9JTUFHRV9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlMktIUi1wQWNxdWlyZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQWNxdWlyZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIiwgInBBY3F1aXJlSW5mby0+cE5leHQiLCBOVUxMLCBwQWNxdWlyZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQWNxdWlyZU5leHRJbWFnZTJLSFIiLCAicEFjcXVpcmVJbmZvLT5zd2FwY2hhaW4iLCBwQWNxdWlyZUluZm8tPnN3YXBjaGFpbik7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtBY3F1aXJlTmV4dEltYWdlMktIUiIsICJwSW1hZ2VJbmRleCIsIHBJbWFnZUluZGV4LCAiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2UyS0hSLXBJbWFnZUluZGV4LXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZTJLSFIoZGV2aWNlLCBwQWNxdWlyZUluZm8sIHBJbWFnZUluZGV4KTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZGlzcGxheSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiIsICJwUHJvcGVydHlDb3VudCIsICJwUHJvcGVydGllcyIsIHBQcm9wZXJ0eUNvdW50LCAmcFByb3BlcnRpZXMsIHRydWUsIGZhbHNlLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFByb3BlcnR5SW5kZXggPSAwOyBwUHJvcGVydHlJbmRleCA8ICpwUHJvcGVydHlDb3VudDsgKytwUHJvcGVydHlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2Rpc3BsYXkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIiwgInBQcm9wZXJ0eUNvdW50IiwgInBQcm9wZXJ0aWVzIiwgcFByb3BlcnR5Q291bnQsICZwUHJvcGVydGllcywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHBQcm9wZXJ0eUluZGV4ID0gMDsgcFByb3BlcnR5SW5kZXggPCAqcFByb3BlcnR5Q291bnQ7ICsrcFByb3BlcnR5SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlDb3VudCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2Rpc3BsYXkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIiLCBWS19LSFJfRElTUExBWV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUiIsICJwRGlzcGxheUNvdW50IiwgInBEaXNwbGF5cyIsIHBEaXNwbGF5Q291bnQsICZwRGlzcGxheXMsIHRydWUsIGZhbHNlLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELXZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFItcERpc3BsYXlzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZGlzcGxheSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIiLCBWS19LSFJfRElTUExBWV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIiwgImRpc3BsYXkiLCBkaXNwbGF5KTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiIsICJwUHJvcGVydHlDb3VudCIsICJwUHJvcGVydGllcyIsIHBQcm9wZXJ0eUNvdW50LCAmcFByb3BlcnRpZXMsIHRydWUsIGZhbHNlLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIpOworICAgIGlmIChwUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwUHJvcGVydHlJbmRleCA9IDA7IHBQcm9wZXJ0eUluZGV4IDwgKnBQcm9wZXJ0eUNvdW50OyArK3BQcm9wZXJ0eUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZGlzcGxheSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVEaXNwbGF5TW9kZUtIUiIsIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDcmVhdGVEaXNwbGF5TW9kZUtIUiIsICJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVEaXNwbGF5TW9kZUtIUiIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfQ1JFQVRFX0lORk9fS0hSIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9DUkVBVEVfSU5GT19LSFIsIHRydWUsICJWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFItZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEaXNwbGF5TW9kZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGlzcGxheU1vZGVLSFIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGlzcGxheU1vZGVLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIiwgInBNb2RlIiwgcE1vZGUsICJWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItcE1vZGUtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5TW9kZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZGlzcGxheSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIiLCBWS19LSFJfRElTUExBWV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIiwgIm1vZGUiLCBtb2RlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIiwgInBDYXBhYmlsaXRpZXMiLCBwQ2FwYWJpbGl0aWVzLCAiVlVJRC12a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUi1wQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIpOworICAgIGlmIChwQ2FwYWJpbGl0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2Rpc3BsYXkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIsIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsICJWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIsICJwQ3JlYXRlSW5mby0+ZGlzcGxheU1vZGUiLCBwQ3JlYXRlSW5mby0+ZGlzcGxheU1vZGUpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIsICJwQ3JlYXRlSW5mby0+dHJhbnNmb3JtIiwgIlZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIiwgQWxsVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIsIHBDcmVhdGVJbmZvLT50cmFuc2Zvcm0sIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItdHJhbnNmb3JtLXBhcmFtZXRlciIsICJWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLXRyYW5zZm9ybS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiLCAicENyZWF0ZUluZm8tPmFscGhhTW9kZSIsICJWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIiLCBBbGxWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIsIHBDcmVhdGVJbmZvLT5hbHBoYU1vZGUsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItYWxwaGFNb2RlLXBhcmFtZXRlciIsICJWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLWFscGhhTW9kZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIiwgInBTdXJmYWNlIiwgcFN1cmZhY2UsICJWVUlELXZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUi1wU3VyZmFjZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZGlzcGxheSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3N3YXBjaGFpbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZGlzcGxheV9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIsIFZLX0tIUl9ESVNQTEFZX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgInN3YXBjaGFpbkNvdW50IiwgInBDcmVhdGVJbmZvcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSIiwgc3dhcGNoYWluQ291bnQsIHBDcmVhdGVJbmZvcywgVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiwgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXBDcmVhdGVJbmZvcy1wYXJhbWV0ZXIiLCAiVlVJRC12a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFItc3dhcGNoYWluQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocENyZWF0ZUluZm9zICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHN3YXBjaGFpbkluZGV4ID0gMDsgc3dhcGNoYWluSW5kZXggPCBzd2FwY2hhaW5Db3VudDsgKytzd2FwY2hhaW5JbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFJbXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIsIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfSU5GT19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX1dJTjMyX0lORk9fRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ09VTlRFUl9DUkVBVEVfSU5GT19FWFQsIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9ESVNQTEFZX05BVElWRV9IRFJfQ1JFQVRFX0lORk9fQU1EIH07CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN3YXBjaGFpbkluZGV4IH0pLCAiVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIsIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiwgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQsIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQsIFZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQsIFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQiLCBwQ3JlYXRlSW5mb3Nbc3dhcGNoYWluSW5kZXhdLnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIpLCBhbGxvd2VkX3N0cnVjdHNfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5mbGFncyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzd2FwY2hhaW5JbmRleCB9KSwgIlZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFIiLCBBbGxWa1N3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSLCBwQ3JlYXRlSW5mb3Nbc3dhcGNoYWluSW5kZXhdLmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5zdXJmYWNlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN3YXBjaGFpbkluZGV4IH0pLCBwQ3JlYXRlSW5mb3Nbc3dhcGNoYWluSW5kZXhdLnN1cmZhY2UpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLmltYWdlRm9ybWF0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN3YXBjaGFpbkluZGV4IH0pLCAiVmtGb3JtYXQiLCBBbGxWa0Zvcm1hdEVudW1zLCBwQ3JlYXRlSW5mb3Nbc3dhcGNoYWluSW5kZXhdLmltYWdlRm9ybWF0LCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VGb3JtYXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0uaW1hZ2VDb2xvclNwYWNlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN3YXBjaGFpbkluZGV4IH0pLCAiVmtDb2xvclNwYWNlS0hSIiwgQWxsVmtDb2xvclNwYWNlS0hSRW51bXMsIHBDcmVhdGVJbmZvc1tzd2FwY2hhaW5JbmRleF0uaW1hZ2VDb2xvclNwYWNlLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VDb2xvclNwYWNlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5pbWFnZVVzYWdlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN3YXBjaGFpbkluZGV4IH0pLCAiVmtJbWFnZVVzYWdlRmxhZ0JpdHMiLCBBbGxWa0ltYWdlVXNhZ2VGbGFnQml0cywgcENyZWF0ZUluZm9zW3N3YXBjaGFpbkluZGV4XS5pbWFnZVVzYWdlLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlVXNhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlVXNhZ2UtcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0uaW1hZ2VTaGFyaW5nTW9kZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzd2FwY2hhaW5JbmRleCB9KSwgIlZrU2hhcmluZ01vZGUiLCBBbGxWa1NoYXJpbmdNb2RlRW51bXMsIHBDcmVhdGVJbmZvc1tzd2FwY2hhaW5JbmRleF0uaW1hZ2VTaGFyaW5nTW9kZSwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucHJlVHJhbnNmb3JtIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN3YXBjaGFpbkluZGV4IH0pLCAiVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIiLCBBbGxWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiwgcENyZWF0ZUluZm9zW3N3YXBjaGFpbkluZGV4XS5wcmVUcmFuc2Zvcm0sIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZVRyYW5zZm9ybS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcHJlVHJhbnNmb3JtLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLmNvbXBvc2l0ZUFscGhhIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN3YXBjaGFpbkluZGV4IH0pLCAiVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIiwgQWxsVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSLCBwQ3JlYXRlSW5mb3Nbc3dhcGNoYWluSW5kZXhdLmNvbXBvc2l0ZUFscGhhLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1jb21wb3NpdGVBbHBoYS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItY29tcG9zaXRlQWxwaGEtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucHJlc2VudE1vZGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3dhcGNoYWluSW5kZXggfSksICJWa1ByZXNlbnRNb2RlS0hSIiwgQWxsVmtQcmVzZW50TW9kZUtIUkVudW1zLCBwQ3JlYXRlSW5mb3Nbc3dhcGNoYWluSW5kZXhdLnByZXNlbnRNb2RlLCAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcHJlc2VudE1vZGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLmNsaXBwZWQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3dhcGNoYWluSW5kZXggfSksIHBDcmVhdGVJbmZvc1tzd2FwY2hhaW5JbmRleF0uY2xpcHBlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIsICJzd2FwY2hhaW5Db3VudCIsICJwU3dhcGNoYWlucyIsIHN3YXBjaGFpbkNvdW50LCAmcFN3YXBjaGFpbnMsIHRydWUsIHRydWUsICJWVUlELXZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUi1zd2FwY2hhaW5Db3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUi1wU3dhcGNoYWlucy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl94bGliX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLCBWS19LSFJfWExJQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIiLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfWExJQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVYbGliU3VyZmFjZUtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzayIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVYbGliU3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVYbGliU3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLCAicFN1cmZhY2UiLCBwU3VyZmFjZSwgIlZVSUQtdmtDcmVhdGVYbGliU3VyZmFjZUtIUi1wU3VyZmFjZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZpc3VhbElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsSUQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3hsaWJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgVktfS0hSX1hMSUJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCAiZHB5IiwgZHB5LCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFItZHB5LXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVhjYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl94Y2Jfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVYY2JTdXJmYWNlS0hSIiwgVktfS0hSX1hDQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1hDQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVYY2JTdXJmYWNlS0hSIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzayIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVYY2JTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlWGNiU3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlWGNiU3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiLCAicFN1cmZhY2UiLCBwU3VyZmFjZSwgIlZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB4Y2JfY29ubmVjdGlvbl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgeGNiX3Zpc3VhbGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxfaWQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfeGNiX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgVktfS0hSX1hDQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgImNvbm5lY3Rpb24iLCBjb25uZWN0aW9uLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1jb25uZWN0aW9uLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3dheWxhbmRfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsIFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfV0FZTEFORF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9XQVlMQU5EX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCBOVUxMLCBwQ3JlYXRlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsICJWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsICJwU3VyZmFjZSIsIHBTdXJmYWNlLCAiVlVJRC12a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgc3RydWN0IHdsX2Rpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl93YXlsYW5kX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsIFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgImRpc3BsYXkiLCBkaXNwbGF5LCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFItZGlzcGxheS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfYW5kcm9pZF9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgVktfS0hSX0FORFJPSURfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIsIHRydWUsICJWVUlELXZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFItZmxhZ3MtemVyb2JpdG1hc2siKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwgInBTdXJmYWNlIiwgcFN1cmZhY2UsICJWVUlELXZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFItcFN1cmZhY2UtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVXaW4zMlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3dpbjMyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgVktfS0hSX1dJTjMyX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCBOVUxMLCBwQ3JlYXRlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiIsICJwU3VyZmFjZSIsIHBTdXJmYWNlLCAiVlVJRC12a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUi1wU3VyZmFjZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3dpbjMyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCBWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqICAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIsICJwRmVhdHVyZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzIiLCBwRmVhdHVyZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXBGZWF0dXJlcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXNUeXBlLXNUeXBlIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiIsICJwUHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yIiwgcFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzIsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0UHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgImZvcm1hdCIsICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIGZvcm1hdCwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyLWZvcm1hdC1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIiLCAicEZvcm1hdFByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMiIsIHBGb3JtYXRQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczItcEZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwRm9ybWF0UHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiAgICAgcEltYWdlRm9ybWF0SW5mbywKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiLCAicEltYWdlRm9ybWF0SW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMiIsIHBJbWFnZUZvcm1hdEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9GT1JNQVRfSU5GT18yLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wSW1hZ2VGb3JtYXRJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBJbWFnZUZvcm1hdEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzJbXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TVEVOQ0lMX1VTQUdFX0NSRUFURV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgInBJbWFnZUZvcm1hdEluZm8tPnBOZXh0IiwgIlZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiwgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQsIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbywgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIiwgcEltYWdlRm9ybWF0SW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgInBJbWFnZUZvcm1hdEluZm8tPmZvcm1hdCIsICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIHBJbWFnZUZvcm1hdEluZm8tPmZvcm1hdCwgIlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzItZm9ybWF0LXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgInBJbWFnZUZvcm1hdEluZm8tPnR5cGUiLCAiVmtJbWFnZVR5cGUiLCBBbGxWa0ltYWdlVHlwZUVudW1zLCBwSW1hZ2VGb3JtYXRJbmZvLT50eXBlLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi10eXBlLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgInBJbWFnZUZvcm1hdEluZm8tPnRpbGluZyIsICJWa0ltYWdlVGlsaW5nIiwgQWxsVmtJbWFnZVRpbGluZ0VudW1zLCBwSW1hZ2VGb3JtYXRJbmZvLT50aWxpbmcsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsICJwSW1hZ2VGb3JtYXRJbmZvLT51c2FnZSIsICJWa0ltYWdlVXNhZ2VGbGFnQml0cyIsIEFsbFZrSW1hZ2VVc2FnZUZsYWdCaXRzLCBwSW1hZ2VGb3JtYXRJbmZvLT51c2FnZSwga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXVzYWdlLXBhcmFtZXRlciIsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXVzYWdlLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgInBJbWFnZUZvcm1hdEluZm8tPmZsYWdzIiwgIlZrSW1hZ2VDcmVhdGVGbGFnQml0cyIsIEFsbFZrSW1hZ2VDcmVhdGVGbGFnQml0cywgcEltYWdlRm9ybWF0SW5mby0+ZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1mbGFncy1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiLCAicEltYWdlRm9ybWF0UHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yIiwgcEltYWdlRm9ybWF0UHJvcGVydGllcywgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMiwgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcEltYWdlRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlRm9ybWF0UHJvcGVydGllczItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEltYWdlRm9ybWF0UHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIiLCAicFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCIsICJwUXVldWVGYW1pbHlQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9QUk9QRVJUSUVTXzIiLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yLCB0cnVlLCBmYWxzZSwgZmFsc2UsICJWVUlELVZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyLXBRdWV1ZUZhbWlseVByb3BlcnRpZXMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwUXVldWVGYW1pbHlQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHBRdWV1ZUZhbWlseVByb3BlcnR5SW5kZXggPSAwOyBwUXVldWVGYW1pbHlQcm9wZXJ0eUluZGV4IDwgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ7ICsrcFF1ZXVlRmFtaWx5UHJvcGVydHlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiogICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUiIsICJwTWVtb3J5UHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BST1BFUlRJRVNfMiIsIHBNZW1vcnlQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BST1BFUlRJRVNfMiwgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBNZW1vcnlQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwTWVtb3J5UHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiLCAicEZvcm1hdEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NQQVJTRV9JTUFHRV9GT1JNQVRfSU5GT18yIiwgcEZvcm1hdEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMiwgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczItcEZvcm1hdEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEZvcm1hdEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsICJwRm9ybWF0SW5mby0+cE5leHQiLCBOVUxMLCBwRm9ybWF0SW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiLCAicEZvcm1hdEluZm8tPmZvcm1hdCIsICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIHBGb3JtYXRJbmZvLT5mb3JtYXQsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLWZvcm1hdC1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsICJwRm9ybWF0SW5mby0+dHlwZSIsICJWa0ltYWdlVHlwZSIsIEFsbFZrSW1hZ2VUeXBlRW51bXMsIHBGb3JtYXRJbmZvLT50eXBlLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi10eXBlLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgInBGb3JtYXRJbmZvLT5zYW1wbGVzIiwgIlZrU2FtcGxlQ291bnRGbGFnQml0cyIsIEFsbFZrU2FtcGxlQ291bnRGbGFnQml0cywgcEZvcm1hdEluZm8tPnNhbXBsZXMsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItc2FtcGxlcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi1zYW1wbGVzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIiwgInBGb3JtYXRJbmZvLT51c2FnZSIsICJWa0ltYWdlVXNhZ2VGbGFnQml0cyIsIEFsbFZrSW1hZ2VVc2FnZUZsYWdCaXRzLCBwRm9ybWF0SW5mby0+dXNhZ2UsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiIsICJwRm9ybWF0SW5mby0+dGlsaW5nIiwgIlZrSW1hZ2VUaWxpbmciLCBBbGxWa0ltYWdlVGlsaW5nRW51bXMsIHBGb3JtYXRJbmZvLT50aWxpbmcsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiLCAicFByb3BlcnR5Q291bnQiLCAicFByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzIiLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yLCB0cnVlLCBmYWxzZSwgZmFsc2UsICJWVUlELVZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFByb3BlcnR5SW5kZXggPSAwOyBwUHJvcGVydHlJbmRleCA8ICpwUHJvcGVydHlDb3VudDsgKytwUHJvcGVydHlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2RldmljZV9ncm91cF9jcmVhdGlvbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiIsIFZLX0tIUl9ERVZJQ0VfR1JPVVBfQ1JFQVRJT05fRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2RldmljZV9ncm91cCkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiIsIFZLX0tIUl9ERVZJQ0VfR1JPVVBfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiIsICJwUGVlck1lbW9yeUZlYXR1cmVzIiwgcFBlZXJNZW1vcnlGZWF0dXJlcywgIlZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1wUGVlck1lbW9yeUZlYXR1cmVzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldERldmljZU1hc2tLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzaykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2RldmljZV9ncm91cF9jcmVhdGlvbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRTZXREZXZpY2VNYXNrS0hSIiwgVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZGV2aWNlX2dyb3VwKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFNldERldmljZU1hc2tLSFIiLCBWS19LSFJfREVWSUNFX0dST1VQX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZERpc3BhdGNoQmFzZUtIUiIsIFZLX0tIUl9ERVZJQ0VfR1JPVVBfQ1JFQVRJT05fRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2RldmljZV9ncm91cCkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWREaXNwYXRjaEJhc2VLSFIiLCBWS19LSFJfREVWSUNFX0dST1VQX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoQmFzZUtIUihjb21tYW5kQnVmZmVyLCBiYXNlR3JvdXBYLCBiYXNlR3JvdXBZLCBiYXNlR3JvdXBaLCBncm91cENvdW50WCwgZ3JvdXBDb3VudFksIGdyb3VwQ291bnRaKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVRyaW1Db21tYW5kUG9vbEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTEpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrVHJpbUNvbW1hbmRQb29sS0hSIiwgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrVHJpbUNvbW1hbmRQb29sS0hSIiwgImNvbW1hbmRQb29sIiwgY29tbWFuZFBvb2wpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrVHJpbUNvbW1hbmRQb29sS0hSIiwgImZsYWdzIiwgZmxhZ3MsICJWVUlELXZrVHJpbUNvbW1hbmRQb29sLWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIiLCBWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIiwgInBQaHlzaWNhbERldmljZUdyb3VwQ291bnQiLCAicFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTIiwgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfR1JPVVBfUFJPUEVSVElFUywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwcy1wUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFBoeXNpY2FsRGV2aWNlR3JvdXBJbmRleCA9IDA7IHBQaHlzaWNhbERldmljZUdyb3VwSW5kZXggPCAqcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudDsgKytwUGh5c2ljYWxEZXZpY2VHcm91cEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIiLCAicEV4dGVybmFsQnVmZmVySW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk8iLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk8sIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcEV4dGVybmFsQnVmZmVySW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBFeHRlcm5hbEJ1ZmZlckluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSIiwgInBFeHRlcm5hbEJ1ZmZlckluZm8tPnBOZXh0IiwgTlVMTCwgcEV4dGVybmFsQnVmZmVySW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSIiwgInBFeHRlcm5hbEJ1ZmZlckluZm8tPmZsYWdzIiwgIlZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMiLCBBbGxWa0J1ZmZlckNyZWF0ZUZsYWdCaXRzLCBwRXh0ZXJuYWxCdWZmZXJJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIsICJwRXh0ZXJuYWxCdWZmZXJJbmZvLT51c2FnZSIsICJWa0J1ZmZlclVzYWdlRmxhZ0JpdHMiLCBBbGxWa0J1ZmZlclVzYWdlRmxhZ0JpdHMsIHBFeHRlcm5hbEJ1ZmZlckluZm8tPnVzYWdlLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby11c2FnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIiLCAicEV4dGVybmFsQnVmZmVySW5mby0+aGFuZGxlVHlwZSIsICJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cywgcEV4dGVybmFsQnVmZmVySW5mby0+aGFuZGxlVHlwZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSIiwgInBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVMiLCBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUywgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1wRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJWVUlELVZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9tZW1vcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiLCBWS19LSFJfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9tZW1vcnlfd2luMzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiLCBWS19LSFJfRVhURVJOQUxfTUVNT1JZX1dJTjMyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSIiwgInBHZXRXaW4zMkhhbmRsZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIiLCBwR2V0V2luMzJIYW5kbGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUi1wR2V0V2luMzJIYW5kbGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBHZXRXaW4zMkhhbmRsZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSIiwgInBHZXRXaW4zMkhhbmRsZUluZm8tPnBOZXh0IiwgTlVMTCwgcEdldFdpbjMySGFuZGxlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiLCAicEdldFdpbjMySGFuZGxlSW5mby0+bWVtb3J5IiwgcEdldFdpbjMySGFuZGxlSW5mby0+bWVtb3J5KTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSIiwgInBHZXRXaW4zMkhhbmRsZUluZm8tPmhhbmRsZVR5cGUiLCAiVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyIsIEFsbFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMsIHBHZXRXaW4zMkhhbmRsZUluZm8tPmhhbmRsZVR5cGUsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiLCAicEhhbmRsZSIsIHBIYW5kbGUsICJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFItcEhhbmRsZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2V4dGVybmFsX21lbW9yeSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiLCBWS19LSFJfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9tZW1vcnlfd2luMzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9XSU4zMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiLCAiaGFuZGxlVHlwZSIsICJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cywgaGFuZGxlVHlwZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIiLCAicE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfV0lOMzJfSEFORExFX1BST1BFUlRJRVNfS0hSIiwgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcywgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1dJTjMyX0hBTkRMRV9QUk9QRVJUSUVTX0tIUiwgdHJ1ZSwgIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFItcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5RmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfbWVtb3J5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldE1lbW9yeUZkS0hSIiwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfbWVtb3J5X2ZkKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldE1lbW9yeUZkS0hSIiwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9GRF9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRNZW1vcnlGZEtIUiIsICJwR2V0RmRJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfRkRfSU5GT19LSFIiLCBwR2V0RmRJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0ZEX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0dldE1lbW9yeUZkS0hSLXBHZXRGZEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEdldEZkSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0TWVtb3J5RmRLSFIiLCAicEdldEZkSW5mby0+cE5leHQiLCBOVUxMLCBwR2V0RmRJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRNZW1vcnlGZEtIUiIsICJwR2V0RmRJbmZvLT5tZW1vcnkiLCBwR2V0RmRJbmZvLT5tZW1vcnkpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0TWVtb3J5RmRLSFIiLCAicEdldEZkSW5mby0+aGFuZGxlVHlwZSIsICJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cywgcEdldEZkSW5mby0+aGFuZGxlVHlwZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa01lbW9yeUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJWVUlELVZrTWVtb3J5R2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRNZW1vcnlGZEtIUiIsICJwRmQiLCBwRmQsICJWVUlELXZrR2V0TWVtb3J5RmRLSFItcEZkLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUZkUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwKKyAgICBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlGZFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9tZW1vcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfbWVtb3J5X2ZkKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUiIsIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRkRfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIiwgImhhbmRsZVR5cGUiLCAiVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyIsIEFsbFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMsIGhhbmRsZVR5cGUsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIiwgInBNZW1vcnlGZFByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0ZEX1BST1BFUlRJRVNfS0hSIiwgcE1lbW9yeUZkUHJvcGVydGllcywgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0ZEX1BST1BFUlRJRVNfS0hSLCB0cnVlLCAiVlVJRC12a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUi1wTWVtb3J5RmRQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJWVUlELVZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBNZW1vcnlGZFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLAorICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiIsIFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIiwgInBFeHRlcm5hbFNlbWFwaG9yZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX1NFTUFQSE9SRV9JTkZPIiwgcEV4dGVybmFsU2VtYXBob3JlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX1NFTUFQSE9SRV9JTkZPLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBFeHRlcm5hbFNlbWFwaG9yZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwRXh0ZXJuYWxTZW1hcGhvcmVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1RZUEVfQ1JFQVRFX0lORk9fS0hSIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIiLCAicEV4dGVybmFsU2VtYXBob3JlSW5mby0+cE5leHQiLCAiVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiIsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIiwgInBFeHRlcm5hbFNlbWFwaG9yZUluZm8tPmhhbmRsZVR5cGUiLCAiVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyIsIEFsbFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMsIHBFeHRlcm5hbFNlbWFwaG9yZUluZm8tPmhhbmRsZVR5cGUsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mby1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8taGFuZGxlVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiIsICJwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTIiwgcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcywgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVMsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9zZW1hcGhvcmUpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiLCBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiLCBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX1dJTjMyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgInBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiLCBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUi1wSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgInBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8tPnBOZXh0IiwgTlVMTCwgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiLCAicEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby0+c2VtYXBob3JlIiwgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby0+c2VtYXBob3JlKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgInBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8tPmZsYWdzIiwgIlZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMiLCBBbGxWa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzLCBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiLCAicEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby0+aGFuZGxlVHlwZSIsICJWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cywgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby0+aGFuZGxlVHlwZSwga09wdGlvbmFsU2luZ2xlQml0LCAiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9XSU4zMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIsICJwR2V0V2luMzJIYW5kbGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSIiwgcEdldFdpbjMySGFuZGxlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIsIHRydWUsICJWVUlELXZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFItcEdldFdpbjMySGFuZGxlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwR2V0V2luMzJIYW5kbGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIsICJwR2V0V2luMzJIYW5kbGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBHZXRXaW4zMkhhbmRsZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgInBHZXRXaW4zMkhhbmRsZUluZm8tPnNlbWFwaG9yZSIsIHBHZXRXaW4zMkhhbmRsZUluZm8tPnNlbWFwaG9yZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIsICJwR2V0V2luMzJIYW5kbGVJbmZvLT5oYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzLCBwR2V0V2luMzJIYW5kbGVJbmZvLT5oYW5kbGVUeXBlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgIlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgInBIYW5kbGUiLCBwSGFuZGxlLCAiVlVJRC12a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSLXBIYW5kbGUtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlSW1wb3J0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqICAgICAgICAgICBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0ltcG9ydFNlbWFwaG9yZUZkS0hSIiwgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0ltcG9ydFNlbWFwaG9yZUZkS0hSIiwgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9GRF9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtJbXBvcnRTZW1hcGhvcmVGZEtIUiIsICJwSW1wb3J0U2VtYXBob3JlRmRJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9TRU1BUEhPUkVfRkRfSU5GT19LSFIiLCBwSW1wb3J0U2VtYXBob3JlRmRJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX0ZEX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0ltcG9ydFNlbWFwaG9yZUZkS0hSLXBJbXBvcnRTZW1hcGhvcmVGZEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEltcG9ydFNlbWFwaG9yZUZkSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrSW1wb3J0U2VtYXBob3JlRmRLSFIiLCAicEltcG9ydFNlbWFwaG9yZUZkSW5mby0+cE5leHQiLCBOVUxMLCBwSW1wb3J0U2VtYXBob3JlRmRJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtJbXBvcnRTZW1hcGhvcmVGZEtIUiIsICJwSW1wb3J0U2VtYXBob3JlRmRJbmZvLT5zZW1hcGhvcmUiLCBwSW1wb3J0U2VtYXBob3JlRmRJbmZvLT5zZW1hcGhvcmUpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrSW1wb3J0U2VtYXBob3JlRmRLSFIiLCAicEltcG9ydFNlbWFwaG9yZUZkSW5mby0+ZmxhZ3MiLCAiVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyIsIEFsbFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMsIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8tPmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFItZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtJbXBvcnRTZW1hcGhvcmVGZEtIUiIsICJwSW1wb3J0U2VtYXBob3JlRmRJbmZvLT5oYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzLCBwSW1wb3J0U2VtYXBob3JlRmRJbmZvLT5oYW5kbGVUeXBlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgIlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFNlbWFwaG9yZUZkS0hSIiwgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFNlbWFwaG9yZUZkS0hSIiwgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9GRF9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRTZW1hcGhvcmVGZEtIUiIsICJwR2V0RmRJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfRkRfSU5GT19LSFIiLCBwR2V0RmRJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfR0VUX0ZEX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0dldFNlbWFwaG9yZUZkS0hSLXBHZXRGZEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEdldEZkSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0U2VtYXBob3JlRmRLSFIiLCAicEdldEZkSW5mby0+cE5leHQiLCBOVUxMLCBwR2V0RmRJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRTZW1hcGhvcmVGZEtIUiIsICJwR2V0RmRJbmZvLT5zZW1hcGhvcmUiLCBwR2V0RmRJbmZvLT5zZW1hcGhvcmUpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0U2VtYXBob3JlRmRLSFIiLCAicEdldEZkSW5mby0+aGFuZGxlVHlwZSIsICJWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cywgcEdldEZkSW5mby0+aGFuZGxlVHlwZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRTZW1hcGhvcmVGZEtIUiIsICJwRmQiLCBwRmQsICJWVUlELXZrR2V0U2VtYXBob3JlRmRLSFItcEZkLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRQdXNoRGVzY3JpcHRvclNldEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfcHVzaF9kZXNjcmlwdG9yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIiwgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIsICJwaXBlbGluZUJpbmRQb2ludCIsICJWa1BpcGVsaW5lQmluZFBvaW50IiwgQWxsVmtQaXBlbGluZUJpbmRQb2ludEVudW1zLCBwaXBlbGluZUJpbmRQb2ludCwgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1waXBlbGluZUJpbmRQb2ludC1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIsICJsYXlvdXQiLCBsYXlvdXQpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIiLCAiZGVzY3JpcHRvcldyaXRlQ291bnQiLCAicERlc2NyaXB0b3JXcml0ZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQiLCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcERlc2NyaXB0b3JXcml0ZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VULCB0cnVlLCB0cnVlLCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1zVHlwZS1zVHlwZSIsICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItcERlc2NyaXB0b3JXcml0ZXMtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1kZXNjcmlwdG9yV3JpdGVDb3VudC1hcnJheWxlbmd0aCIpOworICAgIGlmIChwRGVzY3JpcHRvcldyaXRlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVJbmRleCA9IDA7IGRlc2NyaXB0b3JXcml0ZUluZGV4IDwgZGVzY3JpcHRvcldyaXRlQ291bnQ7ICsrZGVzY3JpcHRvcldyaXRlSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtXcml0ZURlc2NyaXB0b3JTZXRbXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViwgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIH07CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIiwgUGFyYW1ldGVyTmFtZSgicERlc2NyaXB0b3JXcml0ZXNbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGRlc2NyaXB0b3JXcml0ZUluZGV4IH0pLCAiVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQiLCBwRGVzY3JpcHRvcldyaXRlc1tkZXNjcmlwdG9yV3JpdGVJbmRleF0ucE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrV3JpdGVEZXNjcmlwdG9yU2V0KSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrV3JpdGVEZXNjcmlwdG9yU2V0LCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIiwgUGFyYW1ldGVyTmFtZSgicERlc2NyaXB0b3JXcml0ZXNbJWldLmRlc2NyaXB0b3JUeXBlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGRlc2NyaXB0b3JXcml0ZUluZGV4IH0pLCAiVmtEZXNjcmlwdG9yVHlwZSIsIEFsbFZrRGVzY3JpcHRvclR5cGVFbnVtcywgcERlc2NyaXB0b3JXcml0ZXNbZGVzY3JpcHRvcldyaXRlSW5kZXhdLmRlc2NyaXB0b3JUeXBlLCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9wdXNoX2Rlc2NyaXB0b3IpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCBWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIsICJkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSIiwgImxheW91dCIsIGxheW91dCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9kZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCBWS19LSFJfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCBOVUxMLCBwQ3JlYXRlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCAicENyZWF0ZUluZm8tPmRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50IiwgInBDcmVhdGVJbmZvLT5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMiLCBwQ3JlYXRlSW5mby0+ZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQsICZwQ3JlYXRlSW5mby0+cERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzLXBhcmFtZXRlciIpOworCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgZGVzY3JpcHRvclVwZGF0ZUVudHJ5SW5kZXggPSAwOyBkZXNjcmlwdG9yVXBkYXRlRW50cnlJbmRleCA8IHBDcmVhdGVJbmZvLT5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudDsgKytkZXNjcmlwdG9yVXBkYXRlRW50cnlJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbJWldLmRlc2NyaXB0b3JUeXBlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGRlc2NyaXB0b3JVcGRhdGVFbnRyeUluZGV4IH0pLCAiVmtEZXNjcmlwdG9yVHlwZSIsIEFsbFZrRGVzY3JpcHRvclR5cGVFbnVtcywgcENyZWF0ZUluZm8tPnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tkZXNjcmlwdG9yVXBkYXRlRW50cnlJbmRleF0uZGVzY3JpcHRvclR5cGUsICJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnktZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsICJwQ3JlYXRlSW5mby0+dGVtcGxhdGVUeXBlIiwgIlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVHlwZSIsIEFsbFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVHlwZUVudW1zLCBwQ3JlYXRlSW5mby0+dGVtcGxhdGVUeXBlLCAiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tdGVtcGxhdGVUeXBlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCAicERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIsIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsICJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9kZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIiwgVktfS0hSX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCBWS19LSFJfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCAiZGVzY3JpcHRvclNldCIsIGRlc2NyaXB0b3JTZXQpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCAiZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9tdWx0aXZpZXcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9jcmVhdGVfcmVuZGVycGFzc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgVktfS0hSX0NSRUFURV9SRU5ERVJQQVNTXzJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk9fMl9LSFIiLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk9fMl9LSFIsIHRydWUsICJWVUlELXZrQ3JlYXRlUmVuZGVyUGFzczJLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFJbXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfQ1JFQVRFX0lORk9fRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQiLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgcENyZWF0ZUluZm8tPmZsYWdzLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCAicENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCIsICJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fMl9LSFIiLCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50LCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzLCBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OXzJfS0hSLCBmYWxzZSwgdHJ1ZSwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLXNUeXBlLXNUeXBlIiwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcEF0dGFjaG1lbnRzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50cyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGF0dGFjaG1lbnRJbmRleCA9IDA7IGF0dGFjaG1lbnRJbmRleCA8IHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQ7ICsrYXR0YWNobWVudEluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVpXS5mbGFncyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzIiwgQWxsVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cywgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbJWldLmZvcm1hdCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XS5mb3JtYXQsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slaV0uc2FtcGxlcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa1NhbXBsZUNvdW50RmxhZ0JpdHMiLCBBbGxWa1NhbXBsZUNvdW50RmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XS5zYW1wbGVzLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zYW1wbGVzLXBhcmFtZXRlciIsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zYW1wbGVzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbJWldLmxvYWRPcCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa0F0dGFjaG1lbnRMb2FkT3AiLCBBbGxWa0F0dGFjaG1lbnRMb2FkT3BFbnVtcywgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLmxvYWRPcCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWxvYWRPcC1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVpXS5zdG9yZU9wIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbmRleCB9KSwgIlZrQXR0YWNobWVudFN0b3JlT3AiLCBBbGxWa0F0dGFjaG1lbnRTdG9yZU9wRW51bXMsIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XS5zdG9yZU9wLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc3RvcmVPcC1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVpXS5zdGVuY2lsTG9hZE9wIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGF0dGFjaG1lbnRJbmRleCB9KSwgIlZrQXR0YWNobWVudExvYWRPcCIsIEFsbFZrQXR0YWNobWVudExvYWRPcEVudW1zLCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0uc3RlbmNpbExvYWRPcCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLXN0ZW5jaWxMb2FkT3AtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slaV0uc3RlbmNpbFN0b3JlT3AiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYXR0YWNobWVudEluZGV4IH0pLCAiVmtBdHRhY2htZW50U3RvcmVPcCIsIEFsbFZrQXR0YWNobWVudFN0b3JlT3BFbnVtcywgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLnN0ZW5jaWxTdG9yZU9wLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc3RlbmNpbFN0b3JlT3AtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slaV0uaW5pdGlhbExheW91dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBhdHRhY2htZW50SW5kZXggfSksICJWa0ltYWdlTGF5b3V0IiwgQWxsVmtJbWFnZUxheW91dEVudW1zLCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0uaW5pdGlhbExheW91dCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWluaXRpYWxMYXlvdXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slaV0uZmluYWxMYXlvdXQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYXR0YWNobWVudEluZGV4IH0pLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLmZpbmFsTGF5b3V0LCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZmluYWxMYXlvdXQtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgInBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQiLCAicENyZWF0ZUluZm8tPnBTdWJwYXNzZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl8yX0tIUiIsIHBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQsIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzLCBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OXzJfS0hSLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItc1R5cGUtc1R5cGUiLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wU3VicGFzc2VzLXBhcmFtZXRlciIsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXN1YnBhc3NDb3VudC1hcnJheWxlbmd0aCIpOworCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFN1YnBhc3NlcyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHN1YnBhc3NJbmRleCA9IDA7IHN1YnBhc3NJbmRleCA8IHBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQ7ICsrc3VicGFzc0luZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0uZmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCAiVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0cyIsIEFsbFZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0uZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbJWldLnBpcGVsaW5lQmluZFBvaW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1YnBhc3NJbmRleCB9KSwgIlZrUGlwZWxpbmVCaW5kUG9pbnQiLCBBbGxWa1BpcGVsaW5lQmluZFBvaW50RW51bXMsIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucGlwZWxpbmVCaW5kUG9pbnQsICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1waXBlbGluZUJpbmRQb2ludC1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0uaW5wdXRBdHRhY2htZW50Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucElucHV0QXR0YWNobWVudHMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCAiVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFIiLCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLmlucHV0QXR0YWNobWVudENvdW50LCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnBJbnB1dEF0dGFjaG1lbnRzLCBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV8yX0tIUiwgZmFsc2UsIHRydWUsICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItc1R5cGUtc1R5cGUiLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcElucHV0QXR0YWNobWVudHMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucElucHV0QXR0YWNobWVudHMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5wdXRBdHRhY2htZW50SW5kZXggPSAwOyBpbnB1dEF0dGFjaG1lbnRJbmRleCA8IHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0uaW5wdXRBdHRhY2htZW50Q291bnQ7ICsraW5wdXRBdHRhY2htZW50SW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucElucHV0QXR0YWNobWVudHNbJWldLmxheW91dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzdWJwYXNzSW5kZXgsIGlucHV0QXR0YWNobWVudEluZGV4IH0pLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5wSW5wdXRBdHRhY2htZW50c1tpbnB1dEF0dGFjaG1lbnRJbmRleF0ubGF5b3V0LCAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0uY29sb3JBdHRhY2htZW50Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucENvbG9yQXR0YWNobWVudHMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCAiVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFIiLCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLmNvbG9yQXR0YWNobWVudENvdW50LCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnBDb2xvckF0dGFjaG1lbnRzLCBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV8yX0tIUiwgZmFsc2UsIHRydWUsICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItc1R5cGUtc1R5cGUiLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcENvbG9yQXR0YWNobWVudHMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucENvbG9yQXR0YWNobWVudHMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgY29sb3JBdHRhY2htZW50SW5kZXggPSAwOyBjb2xvckF0dGFjaG1lbnRJbmRleCA8IHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0uY29sb3JBdHRhY2htZW50Q291bnQ7ICsrY29sb3JBdHRhY2htZW50SW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucENvbG9yQXR0YWNobWVudHNbJWldLmxheW91dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzdWJwYXNzSW5kZXgsIGNvbG9yQXR0YWNobWVudEluZGV4IH0pLCAiVmtJbWFnZUxheW91dCIsIEFsbFZrSW1hZ2VMYXlvdXRFbnVtcywgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5wQ29sb3JBdHRhY2htZW50c1tjb2xvckF0dGFjaG1lbnRJbmRleF0ubGF5b3V0LCAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWxheW91dC1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0uY29sb3JBdHRhY2htZW50Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucFJlc29sdmVBdHRhY2htZW50cyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzdWJwYXNzSW5kZXggfSksICJWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV8yX0tIUiIsIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0uY29sb3JBdHRhY2htZW50Q291bnQsIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucFJlc29sdmVBdHRhY2htZW50cywgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFIsIGZhbHNlLCBmYWxzZSwgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1zVHlwZS1zVHlwZSIsICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUmVzb2x2ZUF0dGFjaG1lbnRzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnBSZXNvbHZlQXR0YWNobWVudHMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgY29sb3JBdHRhY2htZW50SW5kZXggPSAwOyBjb2xvckF0dGFjaG1lbnRJbmRleCA8IHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0uY29sb3JBdHRhY2htZW50Q291bnQ7ICsrY29sb3JBdHRhY2htZW50SW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucFJlc29sdmVBdHRhY2htZW50c1slaV0ubGF5b3V0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1YnBhc3NJbmRleCwgY29sb3JBdHRhY2htZW50SW5kZXggfSksICJWa0ltYWdlTGF5b3V0IiwgQWxsVmtJbWFnZUxheW91dEVudW1zLCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnBSZXNvbHZlQXR0YWNobWVudHNbY29sb3JBdHRhY2htZW50SW5kZXhdLmxheW91dCwgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1sYXlvdXQtcGFyYW1ldGVyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbJWldLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN1YnBhc3NJbmRleCB9KSwgIlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSIiwgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCwgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFIsIGZhbHNlLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtcGFyYW1ldGVyIiwgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1zVHlwZS1zVHlwZSIpOworCisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NJbmRleF0ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmxheW91dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBzdWJwYXNzSW5kZXggfSksICJWa0ltYWdlTGF5b3V0IiwgQWxsVmtJbWFnZUxheW91dEVudW1zLCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5sYXlvdXQsICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItbGF5b3V0LXBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucHJlc2VydmVBdHRhY2htZW50Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1slaV0ucFByZXNlcnZlQXR0YWNobWVudHMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgc3VicGFzc0luZGV4IH0pLCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzSW5kZXhdLnByZXNlcnZlQXR0YWNobWVudENvdW50LCAmcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc0luZGV4XS5wUHJlc2VydmVBdHRhY2htZW50cywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFByZXNlcnZlQXR0YWNobWVudHMtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgInBDcmVhdGVJbmZvLT5kZXBlbmRlbmN5Q291bnQiLCAicENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVBFTkRFTkNZXzJfS0hSIiwgcENyZWF0ZUluZm8tPmRlcGVuZGVuY3lDb3VudCwgcENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUiwgZmFsc2UsIHRydWUsICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNUeXBlLXNUeXBlIiwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcERlcGVuZGVuY2llcy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgZGVwZW5kZW5jeUluZGV4ID0gMDsgZGVwZW5kZW5jeUluZGV4IDwgcENyZWF0ZUluZm8tPmRlcGVuZGVuY3lDb3VudDsgKytkZXBlbmRlbmN5SW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzWyVpXS5zcmNTdGFnZU1hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVwZW5kZW5jeUluZGV4IH0pLCAiVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiLCBBbGxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cywgcENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeUluZGV4XS5zcmNTdGFnZU1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdGFnZU1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzWyVpXS5kc3RTdGFnZU1hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVwZW5kZW5jeUluZGV4IH0pLCAiVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiLCBBbGxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cywgcENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeUluZGV4XS5kc3RTdGFnZU1hc2ssIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stcGFyYW1ldGVyIiwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzWyVpXS5zcmNBY2Nlc3NNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGRlcGVuZGVuY3lJbmRleCB9KSwgIlZrQWNjZXNzRmxhZ0JpdHMiLCBBbGxWa0FjY2Vzc0ZsYWdCaXRzLCBwQ3JlYXRlSW5mby0+cERlcGVuZGVuY2llc1tkZXBlbmRlbmN5SW5kZXhdLnNyY0FjY2Vzc01hc2ssIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNBY2Nlc3NNYXNrLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzWyVpXS5kc3RBY2Nlc3NNYXNrIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGRlcGVuZGVuY3lJbmRleCB9KSwgIlZrQWNjZXNzRmxhZ0JpdHMiLCBBbGxWa0FjY2Vzc0ZsYWdCaXRzLCBwQ3JlYXRlSW5mby0+cERlcGVuZGVuY2llc1tkZXBlbmRlbmN5SW5kZXhdLmRzdEFjY2Vzc01hc2ssIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RBY2Nlc3NNYXNrLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzWyVpXS5kZXBlbmRlbmN5RmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZGVwZW5kZW5jeUluZGV4IH0pLCAiVmtEZXBlbmRlbmN5RmxhZ0JpdHMiLCBBbGxWa0RlcGVuZGVuY3lGbGFnQml0cywgcENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeUluZGV4XS5kZXBlbmRlbmN5RmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kZXBlbmRlbmN5RmxhZ3MtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgInBDcmVhdGVJbmZvLT5jb3JyZWxhdGVkVmlld01hc2tDb3VudCIsICJwQ3JlYXRlSW5mby0+cENvcnJlbGF0ZWRWaWV3TWFza3MiLCBwQ3JlYXRlSW5mby0+Y29ycmVsYXRlZFZpZXdNYXNrQ291bnQsICZwQ3JlYXRlSW5mby0+cENvcnJlbGF0ZWRWaWV3TWFza3MsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcENvcnJlbGF0ZWRWaWV3TWFza3MtcGFyYW1ldGVyIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIsICJwUmVuZGVyUGFzcyIsIHBSZW5kZXJQYXNzLCAiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MyS0hSLXBSZW5kZXJQYXNzLXBhcmFtZXRlciIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzczJLSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFJlbmRlclBhc3MpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UyKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiLCBWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9tdWx0aXZpZXcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIsIFZLX0tIUl9NVUxUSVZJRVdfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2NyZWF0ZV9yZW5kZXJwYXNzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIsIFZLX0tIUl9DUkVBVEVfUkVOREVSUEFTU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiLCAicFJlbmRlclBhc3NCZWdpbiIsICJWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPIiwgcFJlbmRlclBhc3NCZWdpbiwgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTywgdHJ1ZSwgIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLXBSZW5kZXJQYXNzQmVnaW4tcGFyYW1ldGVyIiwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBSZW5kZXJQYXNzQmVnaW4gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtSZW5kZXJQYXNzQmVnaW5JbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19BVFRBQ0hNRU5UX0JFR0lOX0lORk9fS0hSLCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19TQU1QTEVfTE9DQVRJT05TX0JFR0lOX0lORk9fRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIsICJwUmVuZGVyUGFzc0JlZ2luLT5wTmV4dCIsICJWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbywgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiwgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIiwgcFJlbmRlclBhc3NCZWdpbi0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa1JlbmRlclBhc3NCZWdpbkluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiLCAicFJlbmRlclBhc3NCZWdpbi0+cmVuZGVyUGFzcyIsIHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlclBhc3MpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiLCAicFJlbmRlclBhc3NCZWdpbi0+ZnJhbWVidWZmZXIiLCBwUmVuZGVyUGFzc0JlZ2luLT5mcmFtZWJ1ZmZlcik7CisKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRCZWdpblJlbmRlclBhc3MyS0hSIiwgInBSZW5kZXJQYXNzQmVnaW4tPmNsZWFyVmFsdWVDb3VudCIsICJwUmVuZGVyUGFzc0JlZ2luLT5wQ2xlYXJWYWx1ZXMiLCBwUmVuZGVyUGFzc0JlZ2luLT5jbGVhclZhbHVlQ291bnQsICZwUmVuZGVyUGFzc0JlZ2luLT5wQ2xlYXJWYWx1ZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXBDbGVhclZhbHVlcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBpZiAocFJlbmRlclBhc3NCZWdpbi0+cENsZWFyVmFsdWVzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgY2xlYXJWYWx1ZUluZGV4ID0gMDsgY2xlYXJWYWx1ZUluZGV4IDwgcFJlbmRlclBhc3NCZWdpbi0+Y2xlYXJWYWx1ZUNvdW50OyArK2NsZWFyVmFsdWVJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKworICAgICAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIsICJwU3VicGFzc0JlZ2luSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0JFR0lOX0lORk9fS0hSIiwgcFN1YnBhc3NCZWdpbkluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFIsIHRydWUsICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1wU3VicGFzc0JlZ2luSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1N1YnBhc3NCZWdpbkluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFN1YnBhc3NCZWdpbkluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiLCAicFN1YnBhc3NCZWdpbkluZm8tPnBOZXh0IiwgTlVMTCwgcFN1YnBhc3NCZWdpbkluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1N1YnBhc3NCZWdpbkluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiLCAicFN1YnBhc3NCZWdpbkluZm8tPmNvbnRlbnRzIiwgIlZrU3VicGFzc0NvbnRlbnRzIiwgQWxsVmtTdWJwYXNzQ29udGVudHNFbnVtcywgcFN1YnBhc3NCZWdpbkluZm8tPmNvbnRlbnRzLCAiVlVJRC1Wa1N1YnBhc3NCZWdpbkluZm9LSFItY29udGVudHMtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZE5leHRTdWJwYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbywKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX21haW50ZW5hbmNlMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWROZXh0U3VicGFzczJLSFIiLCBWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9tdWx0aXZpZXcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kTmV4dFN1YnBhc3MyS0hSIiwgVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfY3JlYXRlX3JlbmRlcnBhc3NfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWROZXh0U3VicGFzczJLSFIiLCBWS19LSFJfQ1JFQVRFX1JFTkRFUlBBU1NfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWROZXh0U3VicGFzczJLSFIiLCAicFN1YnBhc3NCZWdpbkluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19CRUdJTl9JTkZPX0tIUiIsIHBTdWJwYXNzQmVnaW5JbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0JFR0lOX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1wU3VicGFzc0JlZ2luSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1N1YnBhc3NCZWdpbkluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFN1YnBhc3NCZWdpbkluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZE5leHRTdWJwYXNzMktIUiIsICJwU3VicGFzc0JlZ2luSW5mby0+cE5leHQiLCBOVUxMLCBwU3VicGFzc0JlZ2luSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrU3VicGFzc0JlZ2luSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ21kTmV4dFN1YnBhc3MyS0hSIiwgInBTdWJwYXNzQmVnaW5JbmZvLT5jb250ZW50cyIsICJWa1N1YnBhc3NDb250ZW50cyIsIEFsbFZrU3VicGFzc0NvbnRlbnRzRW51bXMsIHBTdWJwYXNzQmVnaW5JbmZvLT5jb250ZW50cywgIlZVSUQtVmtTdWJwYXNzQmVnaW5JbmZvS0hSLWNvbnRlbnRzLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NtZE5leHRTdWJwYXNzMktIUiIsICJwU3VicGFzc0VuZEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFIiLCBwU3VicGFzc0VuZEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfRU5EX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1wU3VicGFzc0VuZEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtTdWJwYXNzRW5kSW5mb0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwU3VicGFzc0VuZEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZE5leHRTdWJwYXNzMktIUiIsICJwU3VicGFzc0VuZEluZm8tPnBOZXh0IiwgTlVMTCwgcFN1YnBhc3NFbmRJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtTdWJwYXNzRW5kSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRFbmRSZW5kZXJQYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgICAgICAgICAgICBwU3VicGFzc0VuZEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRW5kUmVuZGVyUGFzczJLSFIiLCBWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9tdWx0aXZpZXcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRW5kUmVuZGVyUGFzczJLSFIiLCBWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9jcmVhdGVfcmVuZGVycGFzc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZEVuZFJlbmRlclBhc3MyS0hSIiwgVktfS0hSX0NSRUFURV9SRU5ERVJQQVNTXzJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ21kRW5kUmVuZGVyUGFzczJLSFIiLCAicFN1YnBhc3NFbmRJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfRU5EX0lORk9fS0hSIiwgcFN1YnBhc3NFbmRJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0VORF9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1wU3VicGFzc0VuZEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtTdWJwYXNzRW5kSW5mb0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwU3VicGFzc0VuZEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZEVuZFJlbmRlclBhc3MyS0hSIiwgInBTdWJwYXNzRW5kSW5mby0+cE5leHQiLCBOVUxMLCBwU3VicGFzc0VuZEluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1N1YnBhc3NFbmRJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRTd2FwY2hhaW5TdGF0dXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIiLCBWS19LSFJfR0VUX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFN3YXBjaGFpblN0YXR1c0tIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3dhcGNoYWluKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFN3YXBjaGFpblN0YXR1c0tIUiIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIiLCBWS19LSFJfU0hBUkVEX1BSRVNFTlRBQkxFX0lNQUdFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIiLCAic3dhcGNoYWluIiwgc3dhcGNoYWluKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogICAgcEV4dGVybmFsRmVuY2VJbmZvLAorICAgIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIiwgInBFeHRlcm5hbEZlbmNlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfRkVOQ0VfSU5GTyIsIHBFeHRlcm5hbEZlbmNlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8sIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1wRXh0ZXJuYWxGZW5jZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBFeHRlcm5hbEZlbmNlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiIsICJwRXh0ZXJuYWxGZW5jZUluZm8tPnBOZXh0IiwgTlVMTCwgcEV4dGVybmFsRmVuY2VJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIiwgInBFeHRlcm5hbEZlbmNlSW5mby0+aGFuZGxlVHlwZSIsICJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMsIHBFeHRlcm5hbEZlbmNlSW5mby0+aGFuZGxlVHlwZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8taGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8taGFuZGxlVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIiwgInBFeHRlcm5hbEZlbmNlUHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTIiwgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJWVUlELVZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfZmVuY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiIsIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiIsIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9XSU4zMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIiwgInBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSIiwgcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFItcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIiwgInBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mby0+cE5leHQiLCBOVUxMLCBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiIsICJwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8tPmZlbmNlIiwgcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLT5mZW5jZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIiwgInBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mby0+ZmxhZ3MiLCAiVmtGZW5jZUltcG9ydEZsYWdCaXRzIiwgQWxsVmtGZW5jZUltcG9ydEZsYWdCaXRzLCBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8tPmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIiLCAicEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLT5oYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyIsIEFsbFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cywgcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLT5oYW5kbGVUeXBlLCBrT3B0aW9uYWxTaW5nbGVCaXQsICJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfZmVuY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIsIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIsIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9XSU4zMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSIiwgInBHZXRXaW4zMkhhbmRsZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfR0VUX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiIsIHBHZXRXaW4zMkhhbmRsZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIsIHRydWUsICJWVUlELXZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUi1wR2V0V2luMzJIYW5kbGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEdldFdpbjMySGFuZGxlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIsICJwR2V0V2luMzJIYW5kbGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBHZXRXaW4zMkhhbmRsZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIsICJwR2V0V2luMzJIYW5kbGVJbmZvLT5mZW5jZSIsIHBHZXRXaW4zMkhhbmRsZUluZm8tPmZlbmNlKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIiLCAicEdldFdpbjMySGFuZGxlSW5mby0+aGFuZGxlVHlwZSIsICJWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMsIHBHZXRXaW4zMkhhbmRsZUluZm8tPmhhbmRsZVR5cGUsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIiLCAicEhhbmRsZSIsIHBIYW5kbGUsICJWVUlELXZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUi1wSGFuZGxlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogICAgICAgICAgICAgICBwSW1wb3J0RmVuY2VGZEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9mZW5jZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtJbXBvcnRGZW5jZUZkS0hSIiwgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9mZW5jZV9mZCkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtJbXBvcnRGZW5jZUZkS0hSIiwgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0ZEX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0ltcG9ydEZlbmNlRmRLSFIiLCAicEltcG9ydEZlbmNlRmRJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9GRF9JTkZPX0tIUiIsIHBJbXBvcnRGZW5jZUZkSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0ltcG9ydEZlbmNlRmRLSFItcEltcG9ydEZlbmNlRmRJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrSW1wb3J0RmVuY2VGZEluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEltcG9ydEZlbmNlRmRJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtJbXBvcnRGZW5jZUZkS0hSIiwgInBJbXBvcnRGZW5jZUZkSW5mby0+cE5leHQiLCBOVUxMLCBwSW1wb3J0RmVuY2VGZEluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrSW1wb3J0RmVuY2VGZEtIUiIsICJwSW1wb3J0RmVuY2VGZEluZm8tPmZlbmNlIiwgcEltcG9ydEZlbmNlRmRJbmZvLT5mZW5jZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtJbXBvcnRGZW5jZUZkS0hSIiwgInBJbXBvcnRGZW5jZUZkSW5mby0+ZmxhZ3MiLCAiVmtGZW5jZUltcG9ydEZsYWdCaXRzIiwgQWxsVmtGZW5jZUltcG9ydEZsYWdCaXRzLCBwSW1wb3J0RmVuY2VGZEluZm8tPmZsYWdzLCBrT3B0aW9uYWxGbGFncywgIlZVSUQtVmtJbXBvcnRGZW5jZUZkSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0ltcG9ydEZlbmNlRmRLSFIiLCAicEltcG9ydEZlbmNlRmRJbmZvLT5oYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyIsIEFsbFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cywgcEltcG9ydEZlbmNlRmRJbmZvLT5oYW5kbGVUeXBlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrSW1wb3J0RmVuY2VGZEluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfZmVuY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RmVuY2VGZEtIUiIsIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZXh0ZXJuYWxfZmVuY2VfZmQpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RmVuY2VGZEtIUiIsIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9GRF9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRGZW5jZUZkS0hSIiwgInBHZXRGZEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfR0VUX0ZEX0lORk9fS0hSIiwgcEdldEZkSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfR0VUX0ZEX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0dldEZlbmNlRmRLSFItcEdldEZkSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBHZXRGZEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldEZlbmNlRmRLSFIiLCAicEdldEZkSW5mby0+cE5leHQiLCBOVUxMLCBwR2V0RmRJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtGZW5jZUdldEZkSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldEZlbmNlRmRLSFIiLCAicEdldEZkSW5mby0+ZmVuY2UiLCBwR2V0RmRJbmZvLT5mZW5jZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRGZW5jZUZkS0hSIiwgInBHZXRGZEluZm8tPmhhbmRsZVR5cGUiLCAiVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIiwgQWxsVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzLCBwR2V0RmRJbmZvLT5oYW5kbGVUeXBlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRGZW5jZUZkS0hSIiwgInBGZCIsIHBGZCwgIlZVSUQtdmtHZXRGZW5jZUZkS0hSLXBGZC1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQ291bnQsCisgICAgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqICAgICAgICAgICAgICAgICAgICBwQ291bnRlcnMsCisgICAgVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiogICAgICAgICBwQ291bnRlckRlc2NyaXB0aW9ucykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIsICJwQ291bnRlckNvdW50IiwgInBDb3VudGVycyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUiIsIHBDb3VudGVyQ291bnQsIHBDb3VudGVycywgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9LSFIsIHRydWUsIGZhbHNlLCBmYWxzZSwgIlZVSUQtVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFItc1R5cGUtc1R5cGUiLCAiVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFItcENvdW50ZXJzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENvdW50ZXJzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHBJbmRleGVySW5kZXggPSAwOyBwSW5kZXhlckluZGV4IDwgKnBDb3VudGVyQ291bnQ7ICsrcEluZGV4ZXJJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIsIFBhcmFtZXRlck5hbWUoInBDb3VudGVyc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcEluZGV4ZXJJbmRleCB9KSwgTlVMTCwgcENvdW50ZXJzW3BJbmRleGVySW5kZXhdLnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BlcmZvcm1hbmNlQ291bnRlcktIUi1wTmV4dC1wTmV4dCIpOworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIsICJwQ291bnRlckNvdW50IiwgInBDb3VudGVyRGVzY3JpcHRpb25zIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSIiwgcENvdW50ZXJDb3VudCwgcENvdW50ZXJEZXNjcmlwdGlvbnMsIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSLCB0cnVlLCBmYWxzZSwgZmFsc2UsICJWVUlELVZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFItc1R5cGUtc1R5cGUiLCAiVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFItcENvdW50ZXJEZXNjcmlwdGlvbnMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwQ291bnRlckRlc2NyaXB0aW9ucyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwSW5kZXhlckluZGV4ID0gMDsgcEluZGV4ZXJJbmRleCA8ICpwQ291bnRlckNvdW50OyArK3BJbmRleGVySW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ291bnRlckRlc2NyaXB0aW9uc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcEluZGV4ZXJJbmRleCB9KSwgTlVMTCwgcENvdW50ZXJEZXNjcmlwdGlvbnNbcEluZGV4ZXJJbmRleF0ucE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFItcE5leHQtcE5leHQiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiAgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVBhc3NlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiLCAicFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSIiwgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUi1wUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiIsICJwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwga1ZVSURVbmRlZmluZWQpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiLCAicFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLT5jb3VudGVySW5kZXhDb3VudCIsICJwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8tPnBDb3VudGVySW5kaWNlcyIsIHBQZXJmb3JtYW5jZVF1ZXJ5Q3JlYXRlSW5mby0+Y291bnRlckluZGV4Q291bnQsICZwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8tPnBDb3VudGVySW5kaWNlcywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItY291bnRlckluZGV4Q291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1wQ291bnRlckluZGljZXMtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiIsICJwTnVtUGFzc2VzIiwgcE51bVBhc3NlcywgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUi1wTnVtUGFzc2VzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiAgICAgICAgcEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfcGVyZm9ybWFuY2VfcXVlcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIiLCBWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIiLCAicEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUiIsIHBJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX1BST0ZJTElOR19MT0NLX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSLXBJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIsICJwSW5mby0+cE5leHQiLCBOVUxMLCBwSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIsICJwSW5mby0+ZmxhZ3MiLCBwSW5mby0+ZmxhZ3MsICJWVUlELVZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3BlcmZvcm1hbmNlX3F1ZXJ5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIiwgVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIiwgVktfS0hSX0dFVF9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIiLCAicFN1cmZhY2VJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIiLCBwU3VyZmFjZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUi1wU3VyZmFjZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwU3VyZmFjZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUltdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIiwgInBTdXJmYWNlSW5mby0+cE5leHQiLCAiVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQsIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQiLCBwU3VyZmFjZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIiwgInBTdXJmYWNlSW5mby0+c3VyZmFjZSIsIHBTdXJmYWNlSW5mby0+c3VyZmFjZSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiIsICJwU3VyZmFjZUNhcGFiaWxpdGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0tIUiIsIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0tIUiwgdHJ1ZSwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXBTdXJmYWNlQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIsICJWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFN1cmZhY2VDYXBhYmlsaXRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXQyS0hSKiAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIiwgVktfS0hSX0dFVF9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIiwgInBTdXJmYWNlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VSRkFDRV9JTkZPXzJfS0hSIiwgcFN1cmZhY2VJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VSRkFDRV9JTkZPXzJfS0hSLCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSLXBTdXJmYWNlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBTdXJmYWNlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0lORk9fRVhULCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9XSU4zMl9JTkZPX0VYVCB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIiwgInBTdXJmYWNlSW5mby0+cE5leHQiLCAiVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQsIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQiLCBwU3VyZmFjZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUiIsICJwU3VyZmFjZUluZm8tPnN1cmZhY2UiLCBwU3VyZmFjZUluZm8tPnN1cmZhY2UpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIiwgInBTdXJmYWNlRm9ybWF0Q291bnQiLCAicFN1cmZhY2VGb3JtYXRzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRk9STUFUXzJfS0hSIiwgcFN1cmZhY2VGb3JtYXRDb3VudCwgcFN1cmZhY2VGb3JtYXRzLCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZPUk1BVF8yX0tIUiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAiVlVJRC1Wa1N1cmZhY2VGb3JtYXQyS0hSLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1wU3VyZmFjZUZvcm1hdHMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwU3VyZmFjZUZvcm1hdHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFN1cmZhY2VGb3JtYXRJbmRleCA9IDA7IHBTdXJmYWNlRm9ybWF0SW5kZXggPCAqcFN1cmZhY2VGb3JtYXRDb3VudDsgKytwU3VyZmFjZUZvcm1hdEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9kaXNwbGF5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSIiwgVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSIiwgVktfS0hSX0dFVF9ESVNQTEFZX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiIsICJwUHJvcGVydHlDb3VudCIsICJwUHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BST1BFUlRJRVNfMl9LSFIiLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJPUEVSVElFU18yX0tIUiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAiVlVJRC1Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUi1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwUHJvcGVydHlJbmRleCA9IDA7IHBQcm9wZXJ0eUluZGV4IDwgKnBQcm9wZXJ0eUNvdW50OyArK3BQcm9wZXJ0eUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9kaXNwbGF5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIiLCBWS19LSFJfRElTUExBWV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiIsIFZLX0tIUl9HRVRfRElTUExBWV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiIsICJwUHJvcGVydHlDb3VudCIsICJwUHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFIiLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfUFJPUEVSVElFU18yX0tIUiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAiVlVJRC1Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFByb3BlcnR5SW5kZXggPSAwOyBwUHJvcGVydHlJbmRleCA8ICpwUHJvcGVydHlDb3VudDsgKytwUHJvcGVydHlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2Rpc3BsYXkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiIsIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9kaXNwbGF5X3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIiwgVktfS0hSX0dFVF9ESVNQTEFZX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiIsICJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIiwgInBQcm9wZXJ0eUNvdW50IiwgInBQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9QUk9QRVJUSUVTXzJfS0hSIiwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAiVlVJRC1Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFItc1R5cGUtc1R5cGUiLCAiVlVJRC12a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwUHJvcGVydHlJbmRleCA9IDA7IHBQcm9wZXJ0eUluZGV4IDwgKnBQcm9wZXJ0eUNvdW50OyArK3BQcm9wZXJ0eUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogICAgICAgICAgICAgICBwRGlzcGxheVBsYW5lSW5mbywKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIqICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2Rpc3BsYXkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiIsIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9kaXNwbGF5X3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIiwgVktfS0hSX0dFVF9ESVNQTEFZX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIiwgInBEaXNwbGF5UGxhbmVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfSU5GT18yX0tIUiIsIHBEaXNwbGF5UGxhbmVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX0lORk9fMl9LSFIsIHRydWUsICJWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1wRGlzcGxheVBsYW5lSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBEaXNwbGF5UGxhbmVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIiwgInBEaXNwbGF5UGxhbmVJbmZvLT5wTmV4dCIsIE5VTEwsIHBEaXNwbGF5UGxhbmVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEaXNwbGF5UGxhbmVJbmZvMktIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIiLCAicERpc3BsYXlQbGFuZUluZm8tPm1vZGUiLCBwRGlzcGxheVBsYW5lSW5mby0+bW9kZSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiIsICJwQ2FwYWJpbGl0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSIiwgcENhcGFiaWxpdGllcywgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9DQVBBQklMSVRJRVNfMl9LSFIsIHRydWUsICJWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1wQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIsICJWVUlELVZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ2FwYWJpbGl0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgInBJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIiwgcEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yLCB0cnVlLCAiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1wSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTyB9OworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIsICJwSW5mby0+cE5leHQiLCAiVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyIsIHBJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgInBJbmZvLT5pbWFnZSIsIHBJbmZvLT5pbWFnZSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgInBNZW1vcnlSZXF1aXJlbWVudHMiLCAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yIiwgcE1lbW9yeVJlcXVpcmVtZW50cywgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yLCB0cnVlLCAiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1wTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlciIsICJWVUlELVZrTWVtb3J5UmVxdWlyZW1lbnRzMi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwTWVtb3J5UmVxdWlyZW1lbnRzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIiLCAicEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIiwgcEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiwgdHJ1ZSwgIlZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyLXBJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIiLCAicEluZm8tPnBOZXh0IiwgTlVMTCwgcEluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIsICJwSW5mby0+YnVmZmVyIiwgcEluZm8tPmJ1ZmZlcik7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIsICJwTWVtb3J5UmVxdWlyZW1lbnRzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiIsIHBNZW1vcnlSZXF1aXJlbWVudHMsIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiwgdHJ1ZSwgIlZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIiwgIlZVSUQtVmtNZW1vcnlSZXF1aXJlbWVudHMyLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBNZW1vcnlSZXF1aXJlbWVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgInBJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiIsIHBJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TUEFSU0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIsIHRydWUsICJWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyLXBJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgInBJbmZvLT5wTmV4dCIsIE5VTEwsIHBJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgInBJbmZvLT5pbWFnZSIsIHBJbmZvLT5pbWFnZSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgInBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50IiwgInBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiLCAiVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiIsIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLCBWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU18yLCB0cnVlLCBmYWxzZSwgZmFsc2UsICJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czItcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50SW5kZXggPSAwOyBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRJbmRleCA8ICpwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudDsgKytwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9iaW5kX21lbW9yeV8yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfbWFpbnRlbmFuY2UxKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCBWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsIFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPLCB0cnVlLCAiVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24tcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZPUk1BVF9BTkRST0lEIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCAiVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQiLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICJwQ3JlYXRlSW5mby0+Zm9ybWF0IiwgIlZrRm9ybWF0IiwgQWxsVmtGb3JtYXRFbnVtcywgcENyZWF0ZUluZm8tPmZvcm1hdCwgIlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBDcmVhdGVJbmZvLT55Y2Jjck1vZGVsIiwgIlZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIiwgQWxsVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb25FbnVtcywgcENyZWF0ZUluZm8tPnljYmNyTW9kZWwsICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JNb2RlbC1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCAicENyZWF0ZUluZm8tPnljYmNyUmFuZ2UiLCAiVmtTYW1wbGVyWWNiY3JSYW5nZSIsIEFsbFZrU2FtcGxlclljYmNyUmFuZ2VFbnVtcywgcENyZWF0ZUluZm8tPnljYmNyUmFuZ2UsICJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JSYW5nZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCAicENyZWF0ZUluZm8tPmNvbXBvbmVudHMuciIsICJWa0NvbXBvbmVudFN3aXp6bGUiLCBBbGxWa0NvbXBvbmVudFN3aXp6bGVFbnVtcywgcENyZWF0ZUluZm8tPmNvbXBvbmVudHMuciwgIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLXItcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBDcmVhdGVJbmZvLT5jb21wb25lbnRzLmciLCAiVmtDb21wb25lbnRTd2l6emxlIiwgQWxsVmtDb21wb25lbnRTd2l6emxlRW51bXMsIHBDcmVhdGVJbmZvLT5jb21wb25lbnRzLmcsICJWVUlELVZrQ29tcG9uZW50TWFwcGluZy1nLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICJwQ3JlYXRlSW5mby0+Y29tcG9uZW50cy5iIiwgIlZrQ29tcG9uZW50U3dpenpsZSIsIEFsbFZrQ29tcG9uZW50U3dpenpsZUVudW1zLCBwQ3JlYXRlSW5mby0+Y29tcG9uZW50cy5iLCAiVlVJRC1Wa0NvbXBvbmVudE1hcHBpbmctYi1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCAicENyZWF0ZUluZm8tPmNvbXBvbmVudHMuYSIsICJWa0NvbXBvbmVudFN3aXp6bGUiLCBBbGxWa0NvbXBvbmVudFN3aXp6bGVFbnVtcywgcENyZWF0ZUluZm8tPmNvbXBvbmVudHMuYSwgIlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLWEtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBDcmVhdGVJbmZvLT54Q2hyb21hT2Zmc2V0IiwgIlZrQ2hyb21hTG9jYXRpb24iLCBBbGxWa0Nocm9tYUxvY2F0aW9uRW51bXMsIHBDcmVhdGVJbmZvLT54Q2hyb21hT2Zmc2V0LCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXhDaHJvbWFPZmZzZXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBDcmVhdGVJbmZvLT55Q2hyb21hT2Zmc2V0IiwgIlZrQ2hyb21hTG9jYXRpb24iLCBBbGxWa0Nocm9tYUxvY2F0aW9uRW51bXMsIHBDcmVhdGVJbmZvLT55Q2hyb21hT2Zmc2V0LCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXlDaHJvbWFPZmZzZXQtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBDcmVhdGVJbmZvLT5jaHJvbWFGaWx0ZXIiLCAiVmtGaWx0ZXIiLCBBbGxWa0ZpbHRlckVudW1zLCBwQ3JlYXRlSW5mby0+Y2hyb21hRmlsdGVyLCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNocm9tYUZpbHRlci1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBDcmVhdGVJbmZvLT5mb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb24iLCBwQ3JlYXRlSW5mby0+Zm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBZY2JjckNvbnZlcnNpb24iLCBwWWNiY3JDb252ZXJzaW9uLCAiVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24tcFljYmNyQ29udmVyc2lvbi1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9iaW5kX21lbW9yeV8yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX21haW50ZW5hbmNlMSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsIFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVCaW5kQnVmZmVyTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfYmluZF9tZW1vcnlfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtCaW5kQnVmZmVyTWVtb3J5MktIUiIsIFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0JpbmRCdWZmZXJNZW1vcnkyS0hSIiwgImJpbmRJbmZvQ291bnQiLCAicEJpbmRJbmZvcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfSU5GTyIsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mb3MsIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5Mi1wQmluZEluZm9zLXBhcmFtZXRlciIsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItYmluZEluZm9Db3VudC1hcnJheWxlbmd0aCIpOworICAgIGlmIChwQmluZEluZm9zICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGJpbmRJbmZvSW5kZXggPSAwOyBiaW5kSW5mb0luZGV4IDwgYmluZEluZm9Db3VudDsgKytiaW5kSW5mb0luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPIH07CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0JpbmRCdWZmZXJNZW1vcnkyS0hSIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgIlZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyIsIHBCaW5kSW5mb3NbYmluZEluZm9JbmRleF0ucE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtCaW5kQnVmZmVyTWVtb3J5SW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtCaW5kQnVmZmVyTWVtb3J5MktIUiIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb3NbJWldLmJ1ZmZlciIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBwQmluZEluZm9zW2JpbmRJbmZvSW5kZXhdLmJ1ZmZlcik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0JpbmRCdWZmZXJNZW1vcnkyS0hSIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvc1slaV0ubWVtb3J5IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGJpbmRJbmZvSW5kZXggfSksIHBCaW5kSW5mb3NbYmluZEluZm9JbmRleF0ubWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVCaW5kSW1hZ2VNZW1vcnkyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9iaW5kX21lbW9yeV8yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0JpbmRJbWFnZU1lbW9yeTJLSFIiLCBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtCaW5kSW1hZ2VNZW1vcnkyS0hSIiwgImJpbmRJbmZvQ291bnQiLCAicEJpbmRJbmZvcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPIiwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcywgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnkyLXBCaW5kSW5mb3MtcGFyYW1ldGVyIiwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnkyLWJpbmRJbmZvQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocEJpbmRJbmZvcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kSW5mb0luZGV4ID0gMDsgYmluZEluZm9JbmRleCA8IGJpbmRJbmZvQ291bnQ7ICsrYmluZEluZm9JbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0JpbmRJbWFnZU1lbW9yeUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfREVWSUNFX0dST1VQX0lORk8sIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX1NXQVBDSEFJTl9JTkZPX0tIUiwgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9QTEFORV9NRU1PUllfSU5GTyB9OworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtCaW5kSW1hZ2VNZW1vcnkyS0hSIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgIlZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLCBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIsIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIiwgcEJpbmRJbmZvc1tiaW5kSW5mb0luZGV4XS5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrQmluZEltYWdlTWVtb3J5SW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0JpbmRJbWFnZU1lbW9yeTJLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQmluZEluZm9zWyVpXS5pbWFnZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBwQmluZEluZm9zW2JpbmRJbmZvSW5kZXhdLmltYWdlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX21haW50ZW5hbmNlMykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiIsIFZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTywgdHJ1ZSwgIlZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm9bXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0JJTkRJTkdfRkxBR1NfQ1JFQVRFX0lORk9fRVhUIH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgIlZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQiLCBwQ3JlYXRlSW5mby0+cE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8pLCBhbGxvd2VkX3N0cnVjdHNfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbywgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiLCAicENyZWF0ZUluZm8tPmZsYWdzIiwgIlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIiwgQWxsVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiIsICJwQ3JlYXRlSW5mby0+YmluZGluZ0NvdW50IiwgInBDcmVhdGVJbmZvLT5wQmluZGluZ3MiLCBwQ3JlYXRlSW5mby0+YmluZGluZ0NvdW50LCAmcENyZWF0ZUluZm8tPnBCaW5kaW5ncywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLXBCaW5kaW5ncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBCaW5kaW5ncyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGJpbmRpbmdJbmRleCA9IDA7IGJpbmRpbmdJbmRleCA8IHBDcmVhdGVJbmZvLT5iaW5kaW5nQ291bnQ7ICsrYmluZGluZ0luZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+cEJpbmRpbmdzWyVpXS5kZXNjcmlwdG9yVHlwZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kaW5nSW5kZXggfSksICJWa0Rlc2NyaXB0b3JUeXBlIiwgQWxsVmtEZXNjcmlwdG9yVHlwZUVudW1zLCBwQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2JpbmRpbmdJbmRleF0uZGVzY3JpcHRvclR5cGUsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiIsICJwU3VwcG9ydCIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVCIsIHBTdXBwb3J0LCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVCwgdHJ1ZSwgIlZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1wU3VwcG9ydC1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBTdXBwb3J0ICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9kcmF3X2luZGlyZWN0X2NvdW50KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSIiwgVktfS0hSX0RSQVdfSU5ESVJFQ1RfQ09VTlRfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSIiwgImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIiLCAiY291bnRCdWZmZXIiLCBjb3VudEJ1ZmZlcik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9kcmF3X2luZGlyZWN0X2NvdW50KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiIsIFZLX0tIUl9EUkFXX0lORElSRUNUX0NPVU5UX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiLCAiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiLCAiY291bnRCdWZmZXIiLCBjb3VudEJ1ZmZlcik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl90aW1lbGluZV9zZW1hcGhvcmUpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSIiwgVktfS0hSX1RJTUVMSU5FX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSIiwgInNlbWFwaG9yZSIsIHNlbWFwaG9yZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiIsICJwVmFsdWUiLCBwVmFsdWUsICJWVUlELXZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSLXBWYWx1ZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVXYWl0U2VtYXBob3Jlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiAgICAgICAgICAgICAgIHBXYWl0SW5mbywKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtXYWl0U2VtYXBob3Jlc0tIUiIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfdGltZWxpbmVfc2VtYXBob3JlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1dhaXRTZW1hcGhvcmVzS0hSIiwgVktfS0hSX1RJTUVMSU5FX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtXYWl0U2VtYXBob3Jlc0tIUiIsICJwV2FpdEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1dBSVRfSU5GT19LSFIiLCBwV2FpdEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9XQUlUX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a1dhaXRTZW1hcGhvcmVzS0hSLXBXYWl0SW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBXYWl0SW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrV2FpdFNlbWFwaG9yZXNLSFIiLCAicFdhaXRJbmZvLT5wTmV4dCIsIE5VTEwsIHBXYWl0SW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a1dhaXRTZW1hcGhvcmVzS0hSIiwgInBXYWl0SW5mby0+ZmxhZ3MiLCAiVmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIiLCBBbGxWa1NlbWFwaG9yZVdhaXRGbGFnQml0c0tIUiwgcFdhaXRJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9oYW5kbGVfYXJyYXkoInZrV2FpdFNlbWFwaG9yZXNLSFIiLCAicFdhaXRJbmZvLT5zZW1hcGhvcmVDb3VudCIsICJwV2FpdEluZm8tPnBTZW1hcGhvcmVzIiwgcFdhaXRJbmZvLT5zZW1hcGhvcmVDb3VudCwgcFdhaXRJbmZvLT5wU2VtYXBob3JlcywgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtXYWl0U2VtYXBob3Jlc0tIUiIsICJwV2FpdEluZm8tPnNlbWFwaG9yZUNvdW50IiwgInBXYWl0SW5mby0+cFZhbHVlcyIsIHBXYWl0SW5mby0+c2VtYXBob3JlQ291bnQsICZwV2FpdEluZm8tPnBWYWx1ZXMsIHRydWUsIHRydWUsICJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItc2VtYXBob3JlQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC1Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSLXBWYWx1ZXMtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVNpZ25hbFNlbWFwaG9yZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqICAgICAgICAgICAgIHBTaWduYWxJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrU2lnbmFsU2VtYXBob3JlS0hSIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl90aW1lbGluZV9zZW1hcGhvcmUpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrU2lnbmFsU2VtYXBob3JlS0hSIiwgVktfS0hSX1RJTUVMSU5FX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtTaWduYWxTZW1hcGhvcmVLSFIiLCAicFNpZ25hbEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1NJR05BTF9JTkZPX0tIUiIsIHBTaWduYWxJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfU0lHTkFMX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a1NpZ25hbFNlbWFwaG9yZUtIUi1wU2lnbmFsSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFNpZ25hbEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a1NpZ25hbFNlbWFwaG9yZUtIUiIsICJwU2lnbmFsSW5mby0+cE5leHQiLCBOVUxMLCBwU2lnbmFsSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1NpZ25hbFNlbWFwaG9yZUtIUiIsICJwU2lnbmFsSW5mby0+c2VtYXBob3JlIiwgcFNpZ25hbEluZm8tPnNlbWFwaG9yZSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworCisKKworCisKKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIiwgVktfS0hSX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIiwgInBJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUiIsIHBJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19LSFIsIHRydWUsICJWVUlELXZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUi1wSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIiwgInBJbmZvLT5wTmV4dCIsIE5VTEwsIHBJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIiLCAicEluZm8tPmJ1ZmZlciIsIHBJbmZvLT5idWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiIsIFZLX0tIUl9CVUZGRVJfREVWSUNFX0FERFJFU1NfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiLCAicEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fS0hSIiwgcEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUi1wSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiIsICJwSW5mby0+cE5leHQiLCBOVUxMLCBwSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiIsICJwSW5mby0+YnVmZmVyIiwgcEluZm8tPmJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9idWZmZXJfZGV2aWNlX2FkZHJlc3MpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiLCBWS19LSFJfQlVGRkVSX0RFVklDRV9BRERSRVNTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIiwgInBJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19JTkZPX0tIUiIsIHBJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFIsIHRydWUsICJWVUlELXZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItcEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIiwgInBJbmZvLT5wTmV4dCIsIE5VTEwsIHBJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiIsICJwSW5mby0+bWVtb3J5IiwgcEluZm8tPm1lbW9yeSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKiAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGVjdXRhYmxlQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICBwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3BpcGVsaW5lX2V4ZWN1dGFibGVfcHJvcGVydGllcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIiwgVktfS0hSX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIiwgInBQaXBlbGluZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFIiLCBwUGlwZWxpbmVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXBQaXBlbGluZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQaXBlbGluZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFBpcGVsaW5lSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiIsICJwUGlwZWxpbmVJbmZvLT5wTmV4dCIsIE5VTEwsIHBQaXBlbGluZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BpcGVsaW5lSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIiLCAicFBpcGVsaW5lSW5mby0+cGlwZWxpbmUiLCBwUGlwZWxpbmVJbmZvLT5waXBlbGluZSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiIsICJwRXhlY3V0YWJsZUNvdW50IiwgInBQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19LSFIiLCBwRXhlY3V0YWJsZUNvdW50LCBwUHJvcGVydGllcywgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0tIUiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUiLCAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwRXhlY3V0YWJsZUluZGV4ID0gMDsgcEV4ZWN1dGFibGVJbmRleCA8ICpwRXhlY3V0YWJsZUNvdW50OyArK3BFeGVjdXRhYmxlSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdGlzdGljQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqICAgICAgICAgICBwU3RhdGlzdGljcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3BpcGVsaW5lX2V4ZWN1dGFibGVfcHJvcGVydGllcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIiwgVktfS0hSX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIiwgInBFeGVjdXRhYmxlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lORk9fS0hSIiwgcEV4ZWN1dGFibGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFItcEV4ZWN1dGFibGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwRXhlY3V0YWJsZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIiLCAicEV4ZWN1dGFibGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBFeGVjdXRhYmxlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIiLCAicEV4ZWN1dGFibGVJbmZvLT5waXBlbGluZSIsIHBFeGVjdXRhYmxlSW5mby0+cGlwZWxpbmUpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIiLCAicFN0YXRpc3RpY0NvdW50IiwgInBTdGF0aXN0aWNzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUiIsIHBTdGF0aXN0aWNDb3VudCwgcFN0YXRpc3RpY3MsIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUi1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1wU3RhdGlzdGljcy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBTdGF0aXN0aWNzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHBTdGF0aXN0aWNJbmRleCA9IDA7IHBTdGF0aXN0aWNJbmRleCA8ICpwU3RhdGlzdGljQ291bnQ7ICsrcFN0YXRpc3RpY0luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIiLCBWS19LSFJfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSIiwgInBFeGVjdXRhYmxlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lORk9fS0hSIiwgcEV4ZWN1dGFibGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lORk9fS0hSLCB0cnVlLCAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSLXBFeGVjdXRhYmxlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEV4ZWN1dGFibGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIsICJwRXhlY3V0YWJsZUluZm8tPnBOZXh0IiwgTlVMTCwgcEV4ZWN1dGFibGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIiLCAicEV4ZWN1dGFibGVJbmZvLT5waXBlbGluZSIsIHBFeGVjdXRhYmxlSW5mby0+cGlwZWxpbmUpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSIiwgInBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQiLCAicEludGVybmFsUmVwcmVzZW50YXRpb25zIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfSU5URVJOQUxfUkVQUkVTRU5UQVRJT05fS0hSIiwgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwgcEludGVybmFsUmVwcmVzZW50YXRpb25zLCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lOVEVSTkFMX1JFUFJFU0VOVEFUSU9OX0tIUiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFItc1R5cGUtc1R5cGUiLCAiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSLXBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkluZGV4ID0gMDsgcEludGVybmFsUmVwcmVzZW50YXRpb25JbmRleCA8ICpwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50OyArK3BJbnRlcm5hbFJlcHJlc2VudGF0aW9uSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2spIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfZXh0X2RlYnVnX3JlcG9ydCkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIiwgVktfRVhUX0RFQlVHX1JFUE9SVF9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19DUkVBVEVfSU5GT19FWFQiLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0NSRUFURV9JTkZPX0VYVCwgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsICJWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQiLCBBbGxWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQsIHBDcmVhdGVJbmZvLT5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQtZmxhZ3MtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCAicENyZWF0ZUluZm8tPnBmbkNhbGxiYWNrIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocENyZWF0ZUluZm8tPnBmbkNhbGxiYWNrKSwgIlZVSUQtVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVC1wZm5DYWxsYmFjay1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIiwgInBDYWxsYmFjayIsIHBDYWxsYmFjaywgIlZVSUQtdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULXBDYWxsYmFjay1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2V4dF9kZWJ1Z19yZXBvcnQpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCBWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCIsICJjYWxsYmFjayIsIGNhbGxiYWNrKTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvZGUsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJQcmVmaXgsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVzc2FnZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfcmVwb3J0KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCIsIFZLX0VYVF9ERUJVR19SRVBPUlRfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrRGVidWdSZXBvcnRNZXNzYWdlRVhUIiwgImZsYWdzIiwgIlZrRGVidWdSZXBvcnRGbGFnQml0c0VYVCIsIEFsbFZrRGVidWdSZXBvcnRGbGFnQml0c0VYVCwgZmxhZ3MsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1mbGFncy1wYXJhbWV0ZXIiLCAiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1mbGFncy1yZXF1aXJlZGJpdG1hc2siKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCIsICJvYmplY3RUeXBlIiwgIlZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIiwgQWxsVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFRFbnVtcywgb2JqZWN0VHlwZSwgIlZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVidWdSZXBvcnRNZXNzYWdlRVhUIiwgInBMYXllclByZWZpeCIsIHBMYXllclByZWZpeCwgIlZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtcExheWVyUHJlZml4LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQiLCAicE1lc3NhZ2UiLCBwTWVzc2FnZSwgIlZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtcE1lc3NhZ2UtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgcFRhZ0luZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZWJ1Z19yZXBvcnQpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiLCBWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZWJ1Z19tYXJrZXIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiLCBWS19FWFRfREVCVUdfTUFSS0VSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUIiwgInBUYWdJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfVEFHX0lORk9fRVhUIiwgcFRhZ0luZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfVEFHX0lORk9fRVhULCB0cnVlLCAiVlVJRC12a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhULXBUYWdJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBUYWdJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCIsICJwVGFnSW5mby0+cE5leHQiLCBOVUxMLCBwVGFnSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCIsICJwVGFnSW5mby0+b2JqZWN0VHlwZSIsICJWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCIsIEFsbFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhURW51bXMsIHBUYWdJbmZvLT5vYmplY3RUeXBlLCAiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC1vYmplY3RUeXBlLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQiLCAicFRhZ0luZm8tPnRhZ1NpemUiLCAicFRhZ0luZm8tPnBUYWciLCBwVGFnSW5mby0+dGFnU2l6ZSwgJnBUYWdJbmZvLT5wVGFnLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC10YWdTaXplLWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQtcFRhZy1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCogICAgICAgcE5hbWVJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfcmVwb3J0KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCIsIFZLX0VYVF9ERUJVR19SRVBPUlRfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2RlYnVnX21hcmtlcikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiLCBWS19FWFRfREVCVUdfTUFSS0VSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCIsICJwTmFtZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9OQU1FX0lORk9fRVhUIiwgcE5hbWVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX05BTUVfSU5GT19FWFQsIHRydWUsICJWVUlELXZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhULXBOYW1lSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocE5hbWVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiLCAicE5hbWVJbmZvLT5wTmV4dCIsIE5VTEwsIHBOYW1lSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUIiwgInBOYW1lSW5mby0+b2JqZWN0VHlwZSIsICJWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCIsIEFsbFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhURW51bXMsIHBOYW1lSW5mby0+b2JqZWN0VHlwZSwgIlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCIsICJwTmFtZUluZm8tPnBPYmplY3ROYW1lIiwgcE5hbWVJbmZvLT5wT2JqZWN0TmFtZSwgIlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULXBPYmplY3ROYW1lLXBhcmFtZXRlciIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWREZWJ1Z01hcmtlckJlZ2luRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogICAgICAgICAgIHBNYXJrZXJJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfcmVwb3J0KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiLCBWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZWJ1Z19tYXJrZXIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCIsIFZLX0VYVF9ERUJVR19NQVJLRVJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCIsICJwTWFya2VySW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfTUFSS0VSX0lORk9fRVhUIiwgcE1hcmtlckluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9NQVJLRVJfSU5GT19FWFQsIHRydWUsICJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1wTWFya2VySW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVC1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwTWFya2VySW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCIsICJwTWFya2VySW5mby0+cE5leHQiLCBOVUxMLCBwTWFya2VySW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiLCAicE1hcmtlckluZm8tPnBNYXJrZXJOYW1lIiwgcE1hcmtlckluZm8tPnBNYXJrZXJOYW1lLCAiVlVJRC1Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVC1wTWFya2VyTmFtZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRGVidWdNYXJrZXJFbmRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfcmVwb3J0KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZERlYnVnTWFya2VyRW5kRVhUIiwgVktfRVhUX0RFQlVHX1JFUE9SVF9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfbWFya2VyKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZERlYnVnTWFya2VyRW5kRVhUIiwgVktfRVhUX0RFQlVHX01BUktFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZWJ1Z19yZXBvcnQpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiLCBWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZWJ1Z19tYXJrZXIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiLCBWS19FWFRfREVCVUdfTUFSS0VSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUIiwgInBNYXJrZXJJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9NQVJLRVJfSU5GT19FWFQiLCBwTWFya2VySW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX01BUktFUl9JTkZPX0VYVCwgdHJ1ZSwgIlZVSUQtdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVC1wTWFya2VySW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVC1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwTWFya2VySW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQiLCAicE1hcmtlckluZm8tPnBOZXh0IiwgTlVMTCwgcE1hcmtlckluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCIsICJwTWFya2VySW5mby0+cE1hcmtlck5hbWUiLCBwTWFya2VySW5mby0+cE1hcmtlck5hbWUsICJWVUlELVZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhULXBNYXJrZXJOYW1lLXBhcmFtZXRlciIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwU2l6ZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF90cmFuc2Zvcm1fZmVlZGJhY2spIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCIsIFZLX0VYVF9UUkFOU0ZPUk1fRkVFREJBQ0tfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfaGFuZGxlX2FycmF5KCJ2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQiLCAiYmluZGluZ0NvdW50IiwgInBCdWZmZXJzIiwgYmluZGluZ0NvdW50LCBwQnVmZmVycywgdHJ1ZSwgdHJ1ZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUIiwgImJpbmRpbmdDb3VudCIsICJwT2Zmc2V0cyIsIGJpbmRpbmdDb3VudCwgJnBPZmZzZXRzLCB0cnVlLCB0cnVlLCAiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtYmluZGluZ0NvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBPZmZzZXRzLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCIsICJiaW5kaW5nQ291bnQiLCAicFNpemVzIiwgYmluZGluZ0NvdW50LCAmcFNpemVzLCB0cnVlLCBmYWxzZSwgIlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULWJpbmRpbmdDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wU2l6ZXMtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF90cmFuc2Zvcm1fZmVlZGJhY2spIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCIsIFZLX0VYVF9UUkFOU0ZPUk1fRkVFREJBQ0tfRVhURU5TSU9OX05BTUUpOworICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q291bnRlckJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyQnVmZmVyT2Zmc2V0cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF90cmFuc2Zvcm1fZmVlZGJhY2spIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQiLCBWS19FWFRfVFJBTlNGT1JNX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfdHJhbnNmb3JtX2ZlZWRiYWNrKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIiwgVktfRVhUX1RSQU5TRk9STV9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQiLCAicXVlcnlQb29sIiwgcXVlcnlQb29sKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIiwgImZsYWdzIiwgIlZrUXVlcnlDb250cm9sRmxhZ0JpdHMiLCBBbGxWa1F1ZXJ5Q29udHJvbEZsYWdCaXRzLCBmbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtZmxhZ3MtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X3RyYW5zZm9ybV9mZWVkYmFjaykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQiLCBWS19FWFRfVFJBTlNGT1JNX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQiLCAicXVlcnlQb29sIiwgcXVlcnlQb29sKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X3RyYW5zZm9ybV9mZWVkYmFjaykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQiLCBWS19FWFRfVFJBTlNGT1JNX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQiLCAiY291bnRlckJ1ZmZlciIsIGNvdW50ZXJCdWZmZXIpOworICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZ4X2ltYWdlX3ZpZXdfaGFuZGxlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldEltYWdlVmlld0hhbmRsZU5WWCIsIFZLX05WWF9JTUFHRV9WSUVXX0hBTkRMRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgiLCAicEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19IQU5ETEVfSU5GT19OVlgiLCBwSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19IQU5ETEVfSU5GT19OVlgsIHRydWUsICJWVUlELXZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYLXBJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYIiwgInBJbmZvLT5wTmV4dCIsIE5VTEwsIHBJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYIiwgInBJbmZvLT5pbWFnZVZpZXciLCBwSW5mby0+aW1hZ2VWaWV3KTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldEltYWdlVmlld0hhbmRsZU5WWCIsICJwSW5mby0+ZGVzY3JpcHRvclR5cGUiLCAiVmtEZXNjcmlwdG9yVHlwZSIsIEFsbFZrRGVzY3JpcHRvclR5cGVFbnVtcywgcEluZm8tPmRlc2NyaXB0b3JUeXBlLCAiVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19hbWRfZHJhd19pbmRpcmVjdF9jb3VudCkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCIsIFZLX0FNRF9EUkFXX0lORElSRUNUX0NPVU5UX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCIsICJidWZmZXIiLCBidWZmZXIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZERyYXdJbmRpcmVjdENvdW50QU1EIiwgImNvdW50QnVmZmVyIiwgY291bnRCdWZmZXIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19hbWRfZHJhd19pbmRpcmVjdF9jb3VudCkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiLCBWS19BTURfRFJBV19JTkRJUkVDVF9DT1VOVF9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EIiwgImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EIiwgImNvdW50QnVmZmVyIiwgY291bnRCdWZmZXIpOworICAgIHJldHVybiBza2lwOworfQorCisKKworCisKKworCisKKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0U2hhZGVySW5mb0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3RhZ2UsCisgICAgVmtTaGFkZXJJbmZvVHlwZUFNRCAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvVHlwZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19hbWRfc2hhZGVyX2luZm8pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0U2hhZGVySW5mb0FNRCIsIFZLX0FNRF9TSEFERVJfSU5GT19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0U2hhZGVySW5mb0FNRCIsICJwaXBlbGluZSIsIHBpcGVsaW5lKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFNoYWRlckluZm9BTUQiLCAic2hhZGVyU3RhZ2UiLCAiVmtTaGFkZXJTdGFnZUZsYWdCaXRzIiwgQWxsVmtTaGFkZXJTdGFnZUZsYWdCaXRzLCBzaGFkZXJTdGFnZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC12a0dldFNoYWRlckluZm9BTUQtc2hhZGVyU3RhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELXNoYWRlclN0YWdlLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0U2hhZGVySW5mb0FNRCIsICJpbmZvVHlwZSIsICJWa1NoYWRlckluZm9UeXBlQU1EIiwgQWxsVmtTaGFkZXJJbmZvVHlwZUFNREVudW1zLCBpbmZvVHlwZSwgIlZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELWluZm9UeXBlLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0U2hhZGVySW5mb0FNRCIsICJwSW5mb1NpemUiLCAicEluZm8iLCBwSW5mb1NpemUsICZwSW5mbywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELXBJbmZvLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisKKworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2dncF9zdHJlYW1fZGVzY3JpcHRvcl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiwgVktfR0dQX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9DUkVBVEVfSU5GT19HR1AiLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9DUkVBVEVfSU5GT19HR1AsIHRydWUsICJWVUlELXZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1Atc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AtZmxhZ3MtemVyb2JpdG1hc2siKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIiwgInBTdXJmYWNlIiwgcFN1cmZhY2UsICJWVUlELXZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AtcFN1cmZhY2UtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICAgICAgICAgZXh0ZXJuYWxIYW5kbGVUeXBlLAorICAgIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViogICAgICAgICAgcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX252X2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIiwgVktfTlZfRVhURVJOQUxfTUVNT1JZX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiLCAiZm9ybWF0IiwgIlZrRm9ybWF0IiwgQWxsVmtGb3JtYXRFbnVtcywgZm9ybWF0LCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVi1mb3JtYXQtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiLCAidHlwZSIsICJWa0ltYWdlVHlwZSIsIEFsbFZrSW1hZ2VUeXBlRW51bXMsIHR5cGUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLXR5cGUtcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiLCAidGlsaW5nIiwgIlZrSW1hZ2VUaWxpbmciLCBBbGxWa0ltYWdlVGlsaW5nRW51bXMsIHRpbGluZywgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdGlsaW5nLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIiwgInVzYWdlIiwgIlZrSW1hZ2VVc2FnZUZsYWdCaXRzIiwgQWxsVmtJbWFnZVVzYWdlRmxhZ0JpdHMsIHVzYWdlLCBrUmVxdWlyZWRGbGFncywgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdXNhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiLCAiZmxhZ3MiLCAiVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtJbWFnZUNyZWF0ZUZsYWdCaXRzLCBmbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLWZsYWdzLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIiwgImV4dGVybmFsSGFuZGxlVHlwZSIsICJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYiLCBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYsIGV4dGVybmFsSGFuZGxlVHlwZSwga09wdGlvbmFsRmxhZ3MsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLWV4dGVybmFsSGFuZGxlVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIiwgInBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyIsIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcywgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtcEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBhcmFtZXRlciIpOworICAgIGlmIChwRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeVdpbjMySGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfZXh0ZXJuYWxfbWVtb3J5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYiLCBWS19OVl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYiLCBWS19OVl9FWFRFUk5BTF9NRU1PUllfV0lOMzJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYiLCAibWVtb3J5IiwgbWVtb3J5KTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldE1lbW9yeVdpbjMySGFuZGxlTlYiLCAiaGFuZGxlVHlwZSIsICJWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYiLCBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYsIGhhbmRsZVR5cGUsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlTlYtaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlTlYtaGFuZGxlVHlwZS1yZXF1aXJlZGJpdG1hc2siKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViIsICJwSGFuZGxlIiwgcEhhbmRsZSwgIlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLXBIYW5kbGUtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlVmlTdXJmYWNlTk4oCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19ubl92aV9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwgVktfTk5fVklfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVWaVN1cmZhY2VOTiIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9WSV9TVVJGQUNFX0NSRUFURV9JTkZPX05OIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1ZJX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTk4sIHRydWUsICJWVUlELXZrQ3JlYXRlVmlTdXJmYWNlTk4tcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4tc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4tZmxhZ3MtemVyb2JpdG1hc2siKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVWaVN1cmZhY2VOTiIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlVmlTdXJmYWNlTk4iLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlVmlTdXJmYWNlTk4iLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVZpU3VyZmFjZU5OIiwgInBTdXJmYWNlIiwgcFN1cmZhY2UsICJWVUlELXZrQ3JlYXRlVmlTdXJmYWNlTk4tcFN1cmZhY2UtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fVklfTk4KKworCisKKworCisKKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogICBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2NvbmRpdGlvbmFsX3JlbmRlcmluZykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIiwgVktfRVhUX0NPTkRJVElPTkFMX1JFTkRFUklOR19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIiwgInBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CRUdJTl9JTkZPX0VYVCIsIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLCBWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQsIHRydWUsICJWVUlELXZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVC1wQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbi1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIiwgInBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLT5wTmV4dCIsIE5VTEwsIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiLCAicENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4tPmJ1ZmZlciIsIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luLT5idWZmZXIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCIsICJwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbi0+ZmxhZ3MiLCAiVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUIiwgQWxsVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhULCBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbi0+ZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULWZsYWdzLXBhcmFtZXRlciIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9jb25kaXRpb25hbF9yZW5kZXJpbmcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiLCBWS19FWFRfQ09ORElUSU9OQUxfUkVOREVSSU5HX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqICAgICAgICAgIHBQcm9jZXNzQ29tbWFuZHNJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udnhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiLCBWS19OVlhfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiLCAicFByb2Nlc3NDb21tYW5kc0luZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfQ01EX1BST0NFU1NfQ09NTUFORFNfSU5GT19OVlgiLCBwUHJvY2Vzc0NvbW1hbmRzSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfQ01EX1BST0NFU1NfQ09NTUFORFNfSU5GT19OVlgsIHRydWUsICJWVUlELXZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYLXBQcm9jZXNzQ29tbWFuZHNJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwUHJvY2Vzc0NvbW1hbmRzSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIiwgInBQcm9jZXNzQ29tbWFuZHNJbmZvLT5wTmV4dCIsIE5VTEwsIHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIiwgInBQcm9jZXNzQ29tbWFuZHNJbmZvLT5vYmplY3RUYWJsZSIsIHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5vYmplY3RUYWJsZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIiwgInBQcm9jZXNzQ29tbWFuZHNJbmZvLT5pbmRpcmVjdENvbW1hbmRzTGF5b3V0IiwgcFByb2Nlc3NDb21tYW5kc0luZm8tPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIiwgInBQcm9jZXNzQ29tbWFuZHNJbmZvLT5pbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudCIsICJwUHJvY2Vzc0NvbW1hbmRzSW5mby0+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnMiLCBwUHJvY2Vzc0NvbW1hbmRzSW5mby0+aW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQsICZwUHJvY2Vzc0NvbW1hbmRzSW5mby0+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnMsIHRydWUsIHRydWUsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1pbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudC1hcnJheWxlbmd0aCIsICJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1wSW5kaXJlY3RDb21tYW5kc1Rva2Vucy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBpZiAocFByb2Nlc3NDb21tYW5kc0luZm8tPnBJbmRpcmVjdENvbW1hbmRzVG9rZW5zICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kaXJlY3RDb21tYW5kc1Rva2VuSW5kZXggPSAwOyBpbmRpcmVjdENvbW1hbmRzVG9rZW5JbmRleCA8IHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5pbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudDsgKytpbmRpcmVjdENvbW1hbmRzVG9rZW5JbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZFByb2Nlc3NDb21tYW5kc05WWCIsIFBhcmFtZXRlck5hbWUoInBQcm9jZXNzQ29tbWFuZHNJbmZvLT5wSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1slaV0udG9rZW5UeXBlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGluZGlyZWN0Q29tbWFuZHNUb2tlbkluZGV4IH0pLCAiVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYIiwgQWxsVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYRW51bXMsIHBQcm9jZXNzQ29tbWFuZHNJbmZvLT5wSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpbmRpcmVjdENvbW1hbmRzVG9rZW5JbmRleF0udG9rZW5UeXBlLCAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWC10b2tlblR5cGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiLCBQYXJhbWV0ZXJOYW1lKCJwUHJvY2Vzc0NvbW1hbmRzSW5mby0+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnNbJWldLmJ1ZmZlciIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBpbmRpcmVjdENvbW1hbmRzVG9rZW5JbmRleCB9KSwgcFByb2Nlc3NDb21tYW5kc0luZm8tPnBJbmRpcmVjdENvbW1hbmRzVG9rZW5zW2luZGlyZWN0Q29tbWFuZHNUb2tlbkluZGV4XS5idWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogIHBSZXNlcnZlU3BhY2VJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udnhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCIsIFZLX05WWF9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIiwgInBSZXNlcnZlU3BhY2VJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWCIsIHBSZXNlcnZlU3BhY2VJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9DTURfUkVTRVJWRV9TUEFDRV9GT1JfQ09NTUFORFNfSU5GT19OVlgsIHRydWUsICJWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtcFJlc2VydmVTcGFjZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFJlc2VydmVTcGFjZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIiwgInBSZXNlcnZlU3BhY2VJbmZvLT5wTmV4dCIsIE5VTEwsIHBSZXNlcnZlU3BhY2VJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCIsICJwUmVzZXJ2ZVNwYWNlSW5mby0+b2JqZWN0VGFibGUiLCBwUmVzZXJ2ZVNwYWNlSW5mby0+b2JqZWN0VGFibGUpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIiwgInBSZXNlcnZlU3BhY2VJbmZvLT5pbmRpcmVjdENvbW1hbmRzTGF5b3V0IiwgcFJlc2VydmVTcGFjZUluZm8tPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqICAgICAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udnhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwgVktfTlZYX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfQ1JFQVRFX0lORk9fTlZYIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlgsIHRydWUsICJWVUlELXZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsICJwQ3JlYXRlSW5mby0+cGlwZWxpbmVCaW5kUG9pbnQiLCAiVmtQaXBlbGluZUJpbmRQb2ludCIsIEFsbFZrUGlwZWxpbmVCaW5kUG9pbnRFbnVtcywgcENyZWF0ZUluZm8tPnBpcGVsaW5lQmluZFBvaW50LCAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXBpcGVsaW5lQmluZFBvaW50LXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCAiVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWCIsIEFsbFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlgsIHBDcmVhdGVJbmZvLT5mbGFncywga1JlcXVpcmVkRmxhZ3MsICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtZmxhZ3MtcGFyYW1ldGVyIiwgIlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1mbGFncy1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAicENyZWF0ZUluZm8tPnRva2VuQ291bnQiLCAicENyZWF0ZUluZm8tPnBUb2tlbnMiLCBwQ3JlYXRlSW5mby0+dG9rZW5Db3VudCwgJnBDcmVhdGVJbmZvLT5wVG9rZW5zLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXRva2VuQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXBUb2tlbnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wVG9rZW5zICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgdG9rZW5JbmRleCA9IDA7IHRva2VuSW5kZXggPCBwQ3JlYXRlSW5mby0+dG9rZW5Db3VudDsgKyt0b2tlbkluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5wVG9rZW5zWyVpXS50b2tlblR5cGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgdG9rZW5JbmRleCB9KSwgIlZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWCIsIEFsbFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWEVudW1zLCBwQ3JlYXRlSW5mby0+cFRva2Vuc1t0b2tlbkluZGV4XS50b2tlblR5cGUsICJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYLXRva2VuVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAicEluZGlyZWN0Q29tbWFuZHNMYXlvdXQiLCBwSW5kaXJlY3RDb21tYW5kc0xheW91dCwgIlZVSUQtdmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLXBJbmRpcmVjdENvbW1hbmRzTGF5b3V0LXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAgICAgICAgICAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX252eF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwgVktfTlZYX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwgImluZGlyZWN0Q29tbWFuZHNMYXlvdXQiLCBpbmRpcmVjdENvbW1hbmRzTGF5b3V0KTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa09iamVjdFRhYmxlTlZYKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RUYWJsZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZ4X2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiLCBWS19OVlhfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVPYmplY3RUYWJsZU5WWCIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9PQkpFQ1RfVEFCTEVfQ1JFQVRFX0lORk9fTlZYIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX09CSkVDVF9UQUJMRV9DUkVBVEVfSU5GT19OVlgsIHRydWUsICJWVUlELXZrQ3JlYXRlT2JqZWN0VGFibGVOVlgtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZU9iamVjdFRhYmxlTlZYIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtX2FycmF5KCJ2a0NyZWF0ZU9iamVjdFRhYmxlTlZYIiwgInBDcmVhdGVJbmZvLT5vYmplY3RDb3VudCIsICJwQ3JlYXRlSW5mby0+cE9iamVjdEVudHJ5VHlwZXMiLCAiVmtPYmplY3RFbnRyeVR5cGVOVlgiLCBBbGxWa09iamVjdEVudHJ5VHlwZU5WWEVudW1zLCBwQ3JlYXRlSW5mby0+b2JqZWN0Q291bnQsIHBDcmVhdGVJbmZvLT5wT2JqZWN0RW50cnlUeXBlcywgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDcmVhdGVPYmplY3RUYWJsZU5WWCIsICJwQ3JlYXRlSW5mby0+b2JqZWN0Q291bnQiLCAicENyZWF0ZUluZm8tPnBPYmplY3RFbnRyeUNvdW50cyIsIHBDcmVhdGVJbmZvLT5vYmplY3RDb3VudCwgJnBDcmVhdGVJbmZvLT5wT2JqZWN0RW50cnlDb3VudHMsIHRydWUsIHRydWUsICJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLW9iamVjdENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE9iamVjdEVudHJ5Q291bnRzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3NfYXJyYXkoInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiLCAicENyZWF0ZUluZm8tPm9iamVjdENvdW50IiwgInBDcmVhdGVJbmZvLT5wT2JqZWN0RW50cnlVc2FnZUZsYWdzIiwgIlZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIiwgQWxsVmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlgsIHBDcmVhdGVJbmZvLT5vYmplY3RDb3VudCwgcENyZWF0ZUluZm8tPnBPYmplY3RFbnRyeVVzYWdlRmxhZ3MsIHRydWUsIHRydWUpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZU9iamVjdFRhYmxlTlZYIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVPYmplY3RUYWJsZU5WWCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVPYmplY3RUYWJsZU5WWCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiLCAicE9iamVjdFRhYmxlIiwgcE9iamVjdFRhYmxlLCAiVlVJRC12a0NyZWF0ZU9iamVjdFRhYmxlTlZYLXBPYmplY3RUYWJsZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95T2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX252eF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCIsIFZLX05WWF9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtEZXN0cm95T2JqZWN0VGFibGVOVlgiLCAib2JqZWN0VGFibGUiLCBvYmplY3RUYWJsZSk7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95T2JqZWN0VGFibGVOVlgiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95T2JqZWN0VGFibGVOVlgiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95T2JqZWN0VGFibGVOVlgiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVSZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVFbnRyeU5WWCogY29uc3QqICAgICAgICAgcHBPYmplY3RUYWJsZUVudHJpZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZ4X2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrUmVnaXN0ZXJPYmplY3RzTlZYIiwgVktfTlZYX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1JlZ2lzdGVyT2JqZWN0c05WWCIsICJvYmplY3RUYWJsZSIsIG9iamVjdFRhYmxlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a1JlZ2lzdGVyT2JqZWN0c05WWCIsICJvYmplY3RDb3VudCIsICJwcE9iamVjdFRhYmxlRW50cmllcyIsIG9iamVjdENvdW50LCAmcHBPYmplY3RUYWJsZUVudHJpZXMsIHRydWUsIHRydWUsICJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLW9iamVjdENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtcHBPYmplY3RUYWJsZUVudHJpZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBwT2JqZWN0VGFibGVFbnRyaWVzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IG9iamVjdEluZGV4ID0gMDsgb2JqZWN0SW5kZXggPCBvYmplY3RDb3VudDsgKytvYmplY3RJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtSZWdpc3Rlck9iamVjdHNOVlgiLCBQYXJhbWV0ZXJOYW1lKCJwcE9iamVjdFRhYmxlRW50cmllc1slaV0tPnR5cGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgb2JqZWN0SW5kZXggfSksICJWa09iamVjdEVudHJ5VHlwZU5WWCIsIEFsbFZrT2JqZWN0RW50cnlUeXBlTlZYRW51bXMsIHBwT2JqZWN0VGFibGVFbnRyaWVzW29iamVjdEluZGV4XS0+dHlwZSwgIlZVSUQtVmtPYmplY3RUYWJsZUVudHJ5TlZYLXR5cGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrUmVnaXN0ZXJPYmplY3RzTlZYIiwgUGFyYW1ldGVyTmFtZSgicHBPYmplY3RUYWJsZUVudHJpZXNbJWldLT5mbGFncyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBvYmplY3RJbmRleCB9KSwgIlZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIiwgQWxsVmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlgsIHBwT2JqZWN0VGFibGVFbnRyaWVzW29iamVjdEluZGV4XS0+ZmxhZ3MsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa09iamVjdFRhYmxlRW50cnlOVlgtZmxhZ3MtcGFyYW1ldGVyIiwgIlZVSUQtVmtPYmplY3RUYWJsZUVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzayIpOworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrUmVnaXN0ZXJPYmplY3RzTlZYIiwgIm9iamVjdENvdW50IiwgInBPYmplY3RJbmRpY2VzIiwgb2JqZWN0Q291bnQsICZwT2JqZWN0SW5kaWNlcywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0Q291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC12a1JlZ2lzdGVyT2JqZWN0c05WWC1wT2JqZWN0SW5kaWNlcy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVVbnJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqICAgICAgICAgICAgICAgICBwT2JqZWN0RW50cnlUeXBlcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udnhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtVbnJlZ2lzdGVyT2JqZWN0c05WWCIsIFZLX05WWF9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtVbnJlZ2lzdGVyT2JqZWN0c05WWCIsICJvYmplY3RUYWJsZSIsIG9iamVjdFRhYmxlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtX2FycmF5KCJ2a1VucmVnaXN0ZXJPYmplY3RzTlZYIiwgIm9iamVjdENvdW50IiwgInBPYmplY3RFbnRyeVR5cGVzIiwgIlZrT2JqZWN0RW50cnlUeXBlTlZYIiwgQWxsVmtPYmplY3RFbnRyeVR5cGVOVlhFbnVtcywgb2JqZWN0Q291bnQsIHBPYmplY3RFbnRyeVR5cGVzLCB0cnVlLCB0cnVlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a1VucmVnaXN0ZXJPYmplY3RzTlZYIiwgIm9iamVjdENvdW50IiwgInBPYmplY3RJbmRpY2VzIiwgb2JqZWN0Q291bnQsICZwT2JqZWN0SW5kaWNlcywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1vYmplY3RDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEluZGljZXMtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqICAgICAgIHBGZWF0dXJlcywKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiAgICAgICAgIHBMaW1pdHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYIiwgInBGZWF0dXJlcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0ZFQVRVUkVTX05WWCIsIHBGZWF0dXJlcywgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19GRUFUVVJFU19OVlgsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgtcEZlYXR1cmVzLXBhcmFtZXRlciIsICJWVUlELVZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWC1zVHlwZS1zVHlwZSIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgiLCAicExpbWl0cyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0xJTUlUU19OVlgiLCBwTGltaXRzLCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0xJTUlUU19OVlgsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgtcExpbWl0cy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYLXNUeXBlLXNUeXBlIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogICAgICAgICAgICAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfY2xpcF9zcGFjZV93X3NjYWxpbmcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WIiwgVktfTlZfQ0xJUF9TUEFDRV9XX1NDQUxJTkdfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WIiwgInZpZXdwb3J0Q291bnQiLCAicFZpZXdwb3J0V1NjYWxpbmdzIiwgdmlld3BvcnRDb3VudCwgJnBWaWV3cG9ydFdTY2FsaW5ncywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLXBWaWV3cG9ydFdTY2FsaW5ncy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFZpZXdwb3J0V1NjYWxpbmdzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHZpZXdwb3J0SW5kZXggPSAwOyB2aWV3cG9ydEluZGV4IDwgdmlld3BvcnRDb3VudDsgKyt2aWV3cG9ydEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0V1NjYWxpbmdOVihjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRXU2NhbGluZ3MpOworICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVSZWxlYXNlRGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZGlzcGxheSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtSZWxlYXNlRGlzcGxheUVYVCIsIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfZXh0X2RpcmVjdF9tb2RlX2Rpc3BsYXkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrUmVsZWFzZURpc3BsYXlFWFQiLCBWS19FWFRfRElSRUNUX01PREVfRElTUExBWV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrUmVsZWFzZURpc3BsYXlFWFQiLCAiZGlzcGxheSIsIGRpc3BsYXkpOworICAgIHJldHVybiBza2lwOworfQorCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVBY3F1aXJlWGxpYkRpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfZXh0X2RpcmVjdF9tb2RlX2Rpc3BsYXkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIiwgVktfRVhUX0RJUkVDVF9NT0RFX0RJU1BMQVlfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19leHRfYWNxdWlyZV94bGliX2Rpc3BsYXkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIiwgVktfRVhUX0FDUVVJUkVfWExJQl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIiwgImRweSIsIGRweSwgIlZVSUQtdmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQtZHB5LXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0FjcXVpcmVYbGliRGlzcGxheUVYVCIsICJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgUlJPdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByck91dHB1dCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2V4dF9kaXJlY3RfbW9kZV9kaXNwbGF5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCIsIFZLX0VYVF9ESVJFQ1RfTU9ERV9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfZXh0X2FjcXVpcmVfeGxpYl9kaXNwbGF5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCIsIFZLX0VYVF9BQ1FVSVJFX1hMSUJfRElTUExBWV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCIsICJkcHkiLCBkcHksICJWVUlELXZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULWRweS1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUIiwgInBEaXNwbGF5IiwgcERpc3BsYXksICJWVUlELXZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULXBEaXNwbGF5LXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfZGlzcGxheSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIiwgVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19leHRfZGlzcGxheV9zdXJmYWNlX2NvdW50ZXIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCIsIFZLX0VYVF9ESVNQTEFZX1NVUkZBQ0VfQ09VTlRFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCIsICJzdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIiwgInBTdXJmYWNlQ2FwYWJpbGl0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhUIiwgcFN1cmZhY2VDYXBhYmlsaXRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhULCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtcFN1cmZhY2VDYXBhYmlsaXRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVC1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwU3VyZmFjZUNhcGFiaWxpdGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEaXNwbGF5UG93ZXJDb250cm9sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5UG93ZXJJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3dhcGNoYWluKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kaXNwbGF5X3N1cmZhY2VfY291bnRlcikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEaXNwbGF5UG93ZXJDb250cm9sRVhUIiwgVktfRVhUX0RJU1BMQVlfU1VSRkFDRV9DT1VOVEVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kaXNwbGF5X2NvbnRyb2wpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCIsIFZLX0VYVF9ESVNQTEFZX0NPTlRST0xfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiLCAiZGlzcGxheSIsIGRpc3BsYXkpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCIsICJwRGlzcGxheVBvd2VySW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BPV0VSX0lORk9fRVhUIiwgcERpc3BsYXlQb3dlckluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUE9XRVJfSU5GT19FWFQsIHRydWUsICJWVUlELXZrRGlzcGxheVBvd2VyQ29udHJvbEVYVC1wRGlzcGxheVBvd2VySW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0Rpc3BsYXlQb3dlckluZm9FWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocERpc3BsYXlQb3dlckluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiLCAicERpc3BsYXlQb3dlckluZm8tPnBOZXh0IiwgTlVMTCwgcERpc3BsYXlQb3dlckluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0Rpc3BsYXlQb3dlckluZm9FWFQtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiLCAicERpc3BsYXlQb3dlckluZm8tPnBvd2VyU3RhdGUiLCAiVmtEaXNwbGF5UG93ZXJTdGF0ZUVYVCIsIEFsbFZrRGlzcGxheVBvd2VyU3RhdGVFWFRFbnVtcywgcERpc3BsYXlQb3dlckluZm8tPnBvd2VyU3RhdGUsICJWVUlELVZrRGlzcGxheVBvd2VySW5mb0VYVC1wb3dlclN0YXRlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVSZWdpc3RlckRldmljZUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICAgcERldmljZUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQiLCBWS19FWFRfRElTUExBWV9TVVJGQUNFX0NPVU5URVJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2Rpc3BsYXlfY29udHJvbCkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtSZWdpc3RlckRldmljZUV2ZW50RVhUIiwgVktfRVhUX0RJU1BMQVlfQ09OVFJPTF9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtSZWdpc3RlckRldmljZUV2ZW50RVhUIiwgInBEZXZpY2VFdmVudEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhUIiwgcERldmljZUV2ZW50SW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhULCB0cnVlLCAiVlVJRC12a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQtcERldmljZUV2ZW50SW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RldmljZUV2ZW50SW5mb0VYVC1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwRGV2aWNlRXZlbnRJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtSZWdpc3RlckRldmljZUV2ZW50RVhUIiwgInBEZXZpY2VFdmVudEluZm8tPnBOZXh0IiwgTlVMTCwgcERldmljZUV2ZW50SW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGV2aWNlRXZlbnRJbmZvRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtSZWdpc3RlckRldmljZUV2ZW50RVhUIiwgInBEZXZpY2VFdmVudEluZm8tPmRldmljZUV2ZW50IiwgIlZrRGV2aWNlRXZlbnRUeXBlRVhUIiwgQWxsVmtEZXZpY2VFdmVudFR5cGVFWFRFbnVtcywgcERldmljZUV2ZW50SW5mby0+ZGV2aWNlRXZlbnQsICJWVUlELVZrRGV2aWNlRXZlbnRJbmZvRVhULWRldmljZUV2ZW50LXBhcmFtZXRlciIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtSZWdpc3RlckRldmljZUV2ZW50RVhUIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQiLCAicEZlbmNlIiwgcEZlbmNlLCAiVlVJRC12a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQtcEZlbmNlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5RXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3N3YXBjaGFpbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIiwgVktfRVhUX0RJU1BMQVlfU1VSRkFDRV9DT1VOVEVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kaXNwbGF5X2NvbnRyb2wpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQiLCBWS19FWFRfRElTUExBWV9DT05UUk9MX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIsICJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIsICJwRGlzcGxheUV2ZW50SW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX0VWRU5UX0lORk9fRVhUIiwgcERpc3BsYXlFdmVudEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfRVZFTlRfSU5GT19FWFQsIHRydWUsICJWVUlELXZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQtcERpc3BsYXlFdmVudEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtEaXNwbGF5RXZlbnRJbmZvRVhULXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBEaXNwbGF5RXZlbnRJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIsICJwRGlzcGxheUV2ZW50SW5mby0+cE5leHQiLCBOVUxMLCBwRGlzcGxheUV2ZW50SW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGlzcGxheUV2ZW50SW5mb0VYVC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQiLCAicERpc3BsYXlFdmVudEluZm8tPmRpc3BsYXlFdmVudCIsICJWa0Rpc3BsYXlFdmVudFR5cGVFWFQiLCBBbGxWa0Rpc3BsYXlFdmVudFR5cGVFWFRFbnVtcywgcERpc3BsYXlFdmVudEluZm8tPmRpc3BsYXlFdmVudCwgIlZVSUQtVmtEaXNwbGF5RXZlbnRJbmZvRVhULWRpc3BsYXlFdmVudC1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIiwgInBGZW5jZSIsIHBGZW5jZSwgIlZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1wRmVuY2UtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0U3dhcGNoYWluQ291bnRlckVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgICAgICAgICAgICAgICAgIGNvdW50ZXIsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlclZhbHVlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3dhcGNoYWluKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQiLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kaXNwbGF5X3N1cmZhY2VfY291bnRlcikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIiwgVktfRVhUX0RJU1BMQVlfU1VSRkFDRV9DT1VOVEVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kaXNwbGF5X2NvbnRyb2wpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0U3dhcGNoYWluQ291bnRlckVYVCIsIFZLX0VYVF9ESVNQTEFZX0NPTlRST0xfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQiLCAic3dhcGNoYWluIiwgc3dhcGNoYWluKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQiLCAiY291bnRlciIsICJWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQiLCBBbGxWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQsIGNvdW50ZXIsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULWNvdW50ZXItcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULWNvdW50ZXItcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQiLCAicENvdW50ZXJWYWx1ZSIsIHBDb3VudGVyVmFsdWUsICJWVUlELXZrR2V0U3dhcGNoYWluQ291bnRlckVYVC1wQ291bnRlclZhbHVlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiAgICAgICAgICAgICAgIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3N3YXBjaGFpbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZ29vZ2xlX2Rpc3BsYXlfdGltaW5nKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIiwgVktfR09PR0xFX0RJU1BMQVlfVElNSU5HX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSIsICJzd2FwY2hhaW4iLCBzd2FwY2hhaW4pOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSIsICJwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMiLCBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMsICJWVUlELXZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUtcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzLXBhcmFtZXRlciIpOworICAgIGlmIChwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LAorICAgIFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSogICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ3MpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZ29vZ2xlX2Rpc3BsYXlfdGltaW5nKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiLCBWS19HT09HTEVfRElTUExBWV9USU1JTkdfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiLCAic3dhcGNoYWluIiwgc3dhcGNoYWluKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiLCAicFByZXNlbnRhdGlvblRpbWluZ0NvdW50IiwgInBQcmVzZW50YXRpb25UaW1pbmdzIiwgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LCAmcFByZXNlbnRhdGlvblRpbWluZ3MsIHRydWUsIGZhbHNlLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELXZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRS1wUHJlc2VudGF0aW9uVGltaW5ncy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocFByZXNlbnRhdGlvblRpbWluZ3MgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgcFByZXNlbnRhdGlvblRpbWluZ0luZGV4ID0gMDsgcFByZXNlbnRhdGlvblRpbWluZ0luZGV4IDwgKnBQcmVzZW50YXRpb25UaW1pbmdDb3VudDsgKytwUHJlc2VudGF0aW9uVGltaW5nSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworCisKKworCisKKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc2NhcmRSZWN0YW5nbGVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZGlzY2FyZF9yZWN0YW5nbGVzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQiLCBWS19FWFRfRElTQ0FSRF9SRUNUQU5HTEVTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQiLCAiZGlzY2FyZFJlY3RhbmdsZUNvdW50IiwgInBEaXNjYXJkUmVjdGFuZ2xlcyIsIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwgJnBEaXNjYXJkUmVjdGFuZ2xlcywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULWRpc2NhcmRSZWN0YW5nbGVDb3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1wRGlzY2FyZFJlY3RhbmdsZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKHBEaXNjYXJkUmVjdGFuZ2xlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBkaXNjYXJkUmVjdGFuZ2xlSW5kZXggPSAwOyBkaXNjYXJkUmVjdGFuZ2xlSW5kZXggPCBkaXNjYXJkUmVjdGFuZ2xlQ291bnQ7ICsrZGlzY2FyZFJlY3RhbmdsZUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVNldEhkck1ldGFkYXRhRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWlucywKKyAgICBjb25zdCBWa0hkck1ldGFkYXRhRVhUKiAgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3N3YXBjaGFpbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtTZXRIZHJNZXRhZGF0YUVYVCIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2hkcl9tZXRhZGF0YSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtTZXRIZHJNZXRhZGF0YUVYVCIsIFZLX0VYVF9IRFJfTUVUQURBVEFfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfaGFuZGxlX2FycmF5KCJ2a1NldEhkck1ldGFkYXRhRVhUIiwgInN3YXBjaGFpbkNvdW50IiwgInBTd2FwY2hhaW5zIiwgc3dhcGNoYWluQ291bnQsIHBTd2FwY2hhaW5zLCB0cnVlLCB0cnVlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a1NldEhkck1ldGFkYXRhRVhUIiwgInN3YXBjaGFpbkNvdW50IiwgInBNZXRhZGF0YSIsICJWS19TVFJVQ1RVUkVfVFlQRV9IRFJfTUVUQURBVEFfRVhUIiwgc3dhcGNoYWluQ291bnQsIHBNZXRhZGF0YSwgVktfU1RSVUNUVVJFX1RZUEVfSERSX01FVEFEQVRBX0VYVCwgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtIZHJNZXRhZGF0YUVYVC1zVHlwZS1zVHlwZSIsICJWVUlELXZrU2V0SGRyTWV0YWRhdGFFWFQtcE1ldGFkYXRhLXBhcmFtZXRlciIsICJWVUlELXZrU2V0SGRyTWV0YWRhdGFFWFQtc3dhcGNoYWluQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocE1ldGFkYXRhICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHN3YXBjaGFpbkluZGV4ID0gMDsgc3dhcGNoYWluSW5kZXggPCBzd2FwY2hhaW5Db3VudDsgKytzd2FwY2hhaW5JbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrU2V0SGRyTWV0YWRhdGFFWFQiLCBQYXJhbWV0ZXJOYW1lKCJwTWV0YWRhdGFbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHN3YXBjaGFpbkluZGV4IH0pLCBOVUxMLCBwTWV0YWRhdGFbc3dhcGNoYWluSW5kZXhdLnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0hkck1ldGFkYXRhRVhULXBOZXh0LXBOZXh0Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVJT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVJT1NTdXJmYWNlTVZLIiwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19tdmtfaW9zX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlSU9TU3VyZmFjZU1WSyIsIFZLX01WS19JT1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVJT1NTdXJmYWNlTVZLIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9JT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVkssIHRydWUsICJWVUlELXZrQ3JlYXRlSU9TU3VyZmFjZU1WSy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVJT1NTdXJmYWNlTVZLIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlSU9TU3VyZmFjZU1WSyIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsICJWVUlELVZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVkstZmxhZ3MtemVyb2JpdG1hc2siKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJT1NTdXJmYWNlTVZLIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSU9TU3VyZmFjZU1WSyIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUlPU1N1cmZhY2VNVksiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUlPU1N1cmZhY2VNVksiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJT1NTdXJmYWNlTVZLIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJT1NTdXJmYWNlTVZLIiwgInBTdXJmYWNlIiwgcFN1cmZhY2UsICJWVUlELXZrQ3JlYXRlSU9TU3VyZmFjZU1WSy1wU3VyZmFjZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlTWFjT1NTdXJmYWNlTVZLKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVNYWNPU1N1cmZhY2VNVksiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX212a19tYWNvc19zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIsIFZLX01WS19NQUNPU19TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSyIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSywgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVNYWNPU1N1cmZhY2VNVkstcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVNYWNPU1N1cmZhY2VNVksiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVkstcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsICJWVUlELVZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1mbGFncy16ZXJvYml0bWFzayIpOworICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVNYWNPU1N1cmZhY2VNVksiLCAicFN1cmZhY2UiLCBwU3VyZmFjZSwgIlZVSUQtdmtDcmVhdGVNYWNPU1N1cmZhY2VNVkstcFN1cmZhY2UtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogICAgICAgIHBOYW1lSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2RlYnVnX3V0aWxzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIiwgVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIiwgInBOYW1lSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVCIsIHBOYW1lSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX05BTUVfSU5GT19FWFQsIHRydWUsICJWVUlELXZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQtcE5hbWVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBOYW1lSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQiLCAicE5hbWVJbmZvLT5wTmV4dCIsIE5VTEwsIHBOYW1lSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCIsICJwTmFtZUluZm8tPm9iamVjdFR5cGUiLCAiVmtPYmplY3RUeXBlIiwgQWxsVmtPYmplY3RUeXBlRW51bXMsIHBOYW1lSW5mby0+b2JqZWN0VHlwZSwgIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UsIHBOYW1lSW5mbyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiAgICAgICAgIHBUYWdJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfdXRpbHMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCIsIFZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUIiwgInBUYWdJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9UQUdfSU5GT19FWFQiLCBwVGFnSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVCwgdHJ1ZSwgIlZVSUQtdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhULXBUYWdJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFRhZ0luZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQiLCAicFRhZ0luZm8tPnBOZXh0IiwgTlVMTCwgcFRhZ0luZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUIiwgInBUYWdJbmZvLT5vYmplY3RUeXBlIiwgIlZrT2JqZWN0VHlwZSIsIEFsbFZrT2JqZWN0VHlwZUVudW1zLCBwVGFnSW5mby0+b2JqZWN0VHlwZSwgIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVC1vYmplY3RUeXBlLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCIsICJwVGFnSW5mby0+dGFnU2l6ZSIsICJwVGFnSW5mby0+cFRhZyIsIHBUYWdJbmZvLT50YWdTaXplLCAmcFRhZ0luZm8tPnBUYWcsIHRydWUsIHRydWUsICJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtdGFnU2l6ZS1hcnJheWxlbmd0aCIsICJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtcFRhZy1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKGRldmljZSwgcFRhZ0luZm8pOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZWJ1Z191dGlscykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIiwgVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiLCAicExhYmVsSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQiLCBwTGFiZWxJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQsIHRydWUsICJWVUlELXZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdVdGlsc0xhYmVsRVhULXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBMYWJlbEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiLCAicExhYmVsSW5mby0+cE5leHQiLCBOVUxMLCBwTGFiZWxJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIsICJwTGFiZWxJbmZvLT5wTGFiZWxOYW1lIiwgcExhYmVsSW5mby0+cExhYmVsTmFtZSwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsTmFtZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2RlYnVnX3V0aWxzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUIiwgVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2RlYnVnX3V0aWxzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIiwgVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIiwgInBMYWJlbEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTEFCRUxfRVhUIiwgcExhYmVsSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTEFCRUxfRVhULCB0cnVlLCAiVlVJRC12a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhULXBMYWJlbEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocExhYmVsSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiLCAicExhYmVsSW5mby0+cE5leHQiLCBOVUxMLCBwTGFiZWxJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiLCAicExhYmVsSW5mby0+cExhYmVsTmFtZSIsIHBMYWJlbEluZm8tPnBMYWJlbE5hbWUsICJWVUlELVZrRGVidWdVdGlsc0xhYmVsRVhULXBMYWJlbE5hbWUtcGFyYW1ldGVyIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZWJ1Z191dGlscykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIsIFZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIsICJwTGFiZWxJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX0xBQkVMX0VYVCIsIHBMYWJlbEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX0xBQkVMX0VYVCwgdHJ1ZSwgIlZVSUQtdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdVdGlsc0xhYmVsRVhULXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBMYWJlbEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIiwgInBMYWJlbEluZm8tPnBOZXh0IiwgTlVMTCwgcExhYmVsSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVidWdVdGlsc0xhYmVsRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIiwgInBMYWJlbEluZm8tPnBMYWJlbE5hbWUiLCBwTGFiZWxJbmZvLT5wTGFiZWxOYW1lLCAiVlVJRC1Wa0RlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxOYW1lLXBhcmFtZXRlciIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfdXRpbHMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUIiwgVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2RlYnVnX3V0aWxzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIsIFZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiLCAicExhYmVsSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQiLCBwTGFiZWxJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQsIHRydWUsICJWVUlELXZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhULXBMYWJlbEluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocExhYmVsSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIiwgInBMYWJlbEluZm8tPnBOZXh0IiwgTlVMTCwgcExhYmVsSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVidWdVdGlsc0xhYmVsRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIsICJwTGFiZWxJbmZvLT5wTGFiZWxOYW1lIiwgcExhYmVsSW5mby0+cExhYmVsTmFtZSwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsTmFtZS1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogICAgICAgICAgICAgICAgICAgcE1lc3NlbmdlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfdXRpbHMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIsIFZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DUkVBVEVfSU5GT19FWFQiLCBwQ3JlYXRlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVCwgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIsICJwQ3JlYXRlSW5mby0+bWVzc2FnZVNldmVyaXR5IiwgIlZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIiwgQWxsVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQsIHBDcmVhdGVJbmZvLT5tZXNzYWdlU2V2ZXJpdHksIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VTZXZlcml0eS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VTZXZlcml0eS1yZXF1aXJlZGJpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCAicENyZWF0ZUluZm8tPm1lc3NhZ2VUeXBlIiwgIlZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQiLCBBbGxWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhULCBwQ3JlYXRlSW5mby0+bWVzc2FnZVR5cGUsIGtSZXF1aXJlZEZsYWdzLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VUeXBlLXBhcmFtZXRlciIsICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQtbWVzc2FnZVR5cGUtcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCAicENyZWF0ZUluZm8tPnBmblVzZXJDYWxsYmFjayIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBDcmVhdGVJbmZvLT5wZm5Vc2VyQ2FsbGJhY2spLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULXBmblVzZXJDYWxsYmFjay1wYXJhbWV0ZXIiKTsKKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgInBNZXNzZW5nZXIiLCBwTWVzc2VuZ2VyLCAiVlVJRC12a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtcE1lc3Nlbmdlci1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19leHRfZGVidWdfdXRpbHMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCBWS19FWFRfREVCVUdfVVRJTFNfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgIm1lc3NlbmdlciIsIG1lc3Nlbmdlcik7CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCIsICJwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsRnJlZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCAgICAgIG1lc3NhZ2VTZXZlcml0eSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICAgICAgICAgICAgIG1lc3NhZ2VUeXBlcywKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfZXh0X2RlYnVnX3V0aWxzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIiwgVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIiwgIm1lc3NhZ2VTZXZlcml0eSIsICJWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCIsIEFsbFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhULCBtZXNzYWdlU2V2ZXJpdHksIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVC1tZXNzYWdlU2V2ZXJpdHktcGFyYW1ldGVyIiwgIlZVSUQtdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVC1tZXNzYWdlU2V2ZXJpdHktcGFyYW1ldGVyIik7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIsICJtZXNzYWdlVHlwZXMiLCAiVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCIsIEFsbFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQsIG1lc3NhZ2VUeXBlcywga1JlcXVpcmVkRmxhZ3MsICJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtbWVzc2FnZVR5cGVzLXBhcmFtZXRlciIsICJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtbWVzc2FnZVR5cGVzLXJlcXVpcmVkYml0bWFzayIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQiLCAicENhbGxiYWNrRGF0YSIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQiLCBwQ2FsbGJhY2tEYXRhLCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQsIHRydWUsICJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtcENhbGxiYWNrRGF0YS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENhbGxiYWNrRGF0YSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQiLCAicENhbGxiYWNrRGF0YS0+cE5leHQiLCBOVUxMLCBwQ2FsbGJhY2tEYXRhLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIsICJwQ2FsbGJhY2tEYXRhLT5mbGFncyIsIHBDYWxsYmFja0RhdGEtPmZsYWdzLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQiLCAicENhbGxiYWNrRGF0YS0+cE1lc3NhZ2UiLCBwQ2FsbGJhY2tEYXRhLT5wTWVzc2FnZSwgIlZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULXBNZXNzYWdlLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQiLCAicENhbGxiYWNrRGF0YS0+cXVldWVMYWJlbENvdW50IiwgInBDYWxsYmFja0RhdGEtPnBRdWV1ZUxhYmVscyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQiLCBwQ2FsbGJhY2tEYXRhLT5xdWV1ZUxhYmVsQ291bnQsIHBDYWxsYmFja0RhdGEtPnBRdWV1ZUxhYmVscywgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTEFCRUxfRVhULCBmYWxzZSwgdHJ1ZSwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtc1R5cGUtc1R5cGUiLCAiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtcFF1ZXVlTGFiZWxzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgICAgICBpZiAocENhbGxiYWNrRGF0YS0+cFF1ZXVlTGFiZWxzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgcXVldWVMYWJlbEluZGV4ID0gMDsgcXVldWVMYWJlbEluZGV4IDwgcENhbGxiYWNrRGF0YS0+cXVldWVMYWJlbENvdW50OyArK3F1ZXVlTGFiZWxJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIsIFBhcmFtZXRlck5hbWUoInBDYWxsYmFja0RhdGEtPnBRdWV1ZUxhYmVsc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgcXVldWVMYWJlbEluZGV4IH0pLCBOVUxMLCBwQ2FsbGJhY2tEYXRhLT5wUXVldWVMYWJlbHNbcXVldWVMYWJlbEluZGV4XS5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIsIFBhcmFtZXRlck5hbWUoInBDYWxsYmFja0RhdGEtPnBRdWV1ZUxhYmVsc1slaV0ucExhYmVsTmFtZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBxdWV1ZUxhYmVsSW5kZXggfSksIHBDYWxsYmFja0RhdGEtPnBRdWV1ZUxhYmVsc1txdWV1ZUxhYmVsSW5kZXhdLnBMYWJlbE5hbWUsICJWVUlELVZrRGVidWdVdGlsc0xhYmVsRVhULXBMYWJlbE5hbWUtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIiwgInBDYWxsYmFja0RhdGEtPmNtZEJ1ZkxhYmVsQ291bnQiLCAicENhbGxiYWNrRGF0YS0+cENtZEJ1ZkxhYmVscyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQiLCBwQ2FsbGJhY2tEYXRhLT5jbWRCdWZMYWJlbENvdW50LCBwQ2FsbGJhY2tEYXRhLT5wQ21kQnVmTGFiZWxzLCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQsIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0RlYnVnVXRpbHNMYWJlbEVYVC1zVHlwZS1zVHlwZSIsICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wQ21kQnVmTGFiZWxzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgICAgICBpZiAocENhbGxiYWNrRGF0YS0+cENtZEJ1ZkxhYmVscyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNtZEJ1ZkxhYmVsSW5kZXggPSAwOyBjbWRCdWZMYWJlbEluZGV4IDwgcENhbGxiYWNrRGF0YS0+Y21kQnVmTGFiZWxDb3VudDsgKytjbWRCdWZMYWJlbEluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIiwgUGFyYW1ldGVyTmFtZSgicENhbGxiYWNrRGF0YS0+cENtZEJ1ZkxhYmVsc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY21kQnVmTGFiZWxJbmRleCB9KSwgTlVMTCwgcENhbGxiYWNrRGF0YS0+cENtZEJ1ZkxhYmVsc1tjbWRCdWZMYWJlbEluZGV4XS5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIsIFBhcmFtZXRlck5hbWUoInBDYWxsYmFja0RhdGEtPnBDbWRCdWZMYWJlbHNbJWldLnBMYWJlbE5hbWUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY21kQnVmTGFiZWxJbmRleCB9KSwgcENhbGxiYWNrRGF0YS0+cENtZEJ1ZkxhYmVsc1tjbWRCdWZMYWJlbEluZGV4XS5wTGFiZWxOYW1lLCAiVlVJRC1Wa0RlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxOYW1lLXBhcmFtZXRlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCIsICJwQ2FsbGJhY2tEYXRhLT5vYmplY3RDb3VudCIsICJwQ2FsbGJhY2tEYXRhLT5wT2JqZWN0cyIsICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVCIsIHBDYWxsYmFja0RhdGEtPm9iamVjdENvdW50LCBwQ2FsbGJhY2tEYXRhLT5wT2JqZWN0cywgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX05BTUVfSU5GT19FWFQsIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wT2JqZWN0cy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICAgICAgaWYgKHBDYWxsYmFja0RhdGEtPnBPYmplY3RzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3Qgb2JqZWN0SW5kZXggPSAwOyBvYmplY3RJbmRleCA8IHBDYWxsYmFja0RhdGEtPm9iamVjdENvdW50OyArK29iamVjdEluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIiwgUGFyYW1ldGVyTmFtZSgicENhbGxiYWNrRGF0YS0+cE9iamVjdHNbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IG9iamVjdEluZGV4IH0pLCBOVUxMLCBwQ2FsbGJhY2tEYXRhLT5wT2JqZWN0c1tvYmplY3RJbmRleF0ucE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIiwgUGFyYW1ldGVyTmFtZSgicENhbGxiYWNrRGF0YS0+cE9iamVjdHNbJWldLm9iamVjdFR5cGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgb2JqZWN0SW5kZXggfSksICJWa09iamVjdFR5cGUiLCBBbGxWa09iamVjdFR5cGVFbnVtcywgcENhbGxiYWNrRGF0YS0+cE9iamVjdHNbb2JqZWN0SW5kZXhdLm9iamVjdFR5cGUsICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtcGFyYW1ldGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogICBwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X3F1ZXVlX2ZhbWlseV9mb3JlaWduKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIiwgVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9tZW1vcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiLCBWS19LSFJfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiLCBWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2FuZHJvaWRfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIiwgVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCIsICJidWZmZXIiLCBidWZmZXIsICJWVUlELXZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQtYnVmZmVyLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQiLCAicFByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfUFJPUEVSVElFU19BTkRST0lEIiwgcFByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1BST1BFUlRJRVNfQU5EUk9JRCwgdHJ1ZSwgIlZVSUQtdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRC1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9xdWV1ZV9mYW1pbHlfZm9yZWlnbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIiwgVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9tZW1vcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCIsIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIiwgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19hbmRyb2lkX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlcikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIiwgVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCIsICJwSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRCIsIHBJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRCwgdHJ1ZSwgIlZVSUQtdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lELXBJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQiLCAicEluZm8tPnBOZXh0IiwgTlVMTCwgcEluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCIsICJwSW5mby0+bWVtb3J5IiwgcEluZm8tPm1lbW9yeSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIiwgInBCdWZmZXIiLCBwQnVmZmVyLCAiVlVJRC12a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQtcEJ1ZmZlci1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisKKworCisKKworCisKKworCisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiAgICAgICAgICAgICBwU2FtcGxlTG9jYXRpb25zSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfc2FtcGxlX2xvY2F0aW9ucykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQiLCBWS19FWFRfU0FNUExFX0xPQ0FUSU9OU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQiLCAicFNhbXBsZUxvY2F0aW9uc0luZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVCIsIHBTYW1wbGVMb2NhdGlvbnNJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhULCB0cnVlLCAiVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1wU2FtcGxlTG9jYXRpb25zSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocFNhbXBsZUxvY2F0aW9uc0luZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCIsICJwU2FtcGxlTG9jYXRpb25zSW5mby0+cE5leHQiLCBOVUxMLCBwU2FtcGxlTG9jYXRpb25zSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sIGtWVUlEVW5kZWZpbmVkKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCIsICJwU2FtcGxlTG9jYXRpb25zSW5mby0+c2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwiLCAiVmtTYW1wbGVDb3VudEZsYWdCaXRzIiwgQWxsVmtTYW1wbGVDb3VudEZsYWdCaXRzLCBwU2FtcGxlTG9jYXRpb25zSW5mby0+c2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwsIGtPcHRpb25hbFNpbmdsZUJpdCwgIlZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXNhbXBsZUxvY2F0aW9uc1BlclBpeGVsLXBhcmFtZXRlciIpOworCisgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUIiwgInBTYW1wbGVMb2NhdGlvbnNJbmZvLT5zYW1wbGVMb2NhdGlvbnNDb3VudCIsICJwU2FtcGxlTG9jYXRpb25zSW5mby0+cFNhbXBsZUxvY2F0aW9ucyIsIHBTYW1wbGVMb2NhdGlvbnNJbmZvLT5zYW1wbGVMb2NhdGlvbnNDb3VudCwgJnBTYW1wbGVMb2NhdGlvbnNJbmZvLT5wU2FtcGxlTG9jYXRpb25zLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1wU2FtcGxlTG9jYXRpb25zLXBhcmFtZXRlciIpOworCisgICAgICAgIGlmIChwU2FtcGxlTG9jYXRpb25zSW5mby0+cFNhbXBsZUxvY2F0aW9ucyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNhbXBsZUxvY2F0aW9uc0luZGV4ID0gMDsgc2FtcGxlTG9jYXRpb25zSW5kZXggPCBwU2FtcGxlTG9jYXRpb25zSW5mby0+c2FtcGxlTG9jYXRpb25zQ291bnQ7ICsrc2FtcGxlTG9jYXRpb25zSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqICAgICAgICAgICAgICAgICBwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCIsICJzYW1wbGVzIiwgIlZrU2FtcGxlQ291bnRGbGFnQml0cyIsIEFsbFZrU2FtcGxlQ291bnRGbGFnQml0cywgc2FtcGxlcywga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhULXNhbXBsZXMtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVC1zYW1wbGVzLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQiLCAicE11bHRpc2FtcGxlUHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVCIsIHBNdWx0aXNhbXBsZVByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX01VTFRJU0FNUExFX1BST1BFUlRJRVNfRVhULCB0cnVlLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhULXBNdWx0aXNhbXBsZVByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocE11bHRpc2FtcGxlUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworCisKKworCisKKworCisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqICAgICAgcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiLCBWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9pbWFnZV9mb3JtYXRfbGlzdCkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCIsIFZLX0tIUl9JTUFHRV9GT1JNQVRfTElTVF9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2JpbmRfbWVtb3J5XzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQiLCBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllcikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCIsIFZLX0VYVF9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCIsICJpbWFnZSIsIGltYWdlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIiwgInBQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19FWFQiLCBwUHJvcGVydGllcywgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0VYVCwgdHJ1ZSwgIlZVSUQtdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVC1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgICAgICAgIHBWYWxpZGF0aW9uQ2FjaGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF92YWxpZGF0aW9uX2NhY2hlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCIsIFZLX0VYVF9WQUxJREFUSU9OX0NBQ0hFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCwgdHJ1ZSwgIlZVSUQtdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQiLCAicENyZWF0ZUluZm8tPnBOZXh0IiwgTlVMTCwgcENyZWF0ZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKCJ2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsICJWVUlELVZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIiwgInBDcmVhdGVJbmZvLT5pbml0aWFsRGF0YVNpemUiLCAicENyZWF0ZUluZm8tPnBJbml0aWFsRGF0YSIsIHBDcmVhdGVJbmZvLT5pbml0aWFsRGF0YVNpemUsICZwQ3JlYXRlSW5mby0+cEluaXRpYWxEYXRhLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC1wSW5pdGlhbERhdGEtcGFyYW1ldGVyIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCIsICJwVmFsaWRhdGlvbkNhY2hlIiwgcFZhbGlkYXRpb25DYWNoZSwgIlZVSUQtdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQtcFZhbGlkYXRpb25DYWNoZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X3ZhbGlkYXRpb25fY2FjaGUpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCIsIFZLX0VYVF9WQUxJREFUSU9OX0NBQ0hFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X3ZhbGlkYXRpb25fY2FjaGUpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUIiwgVktfRVhUX1ZBTElEQVRJT05fQ0FDSEVfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCIsICJkc3RDYWNoZSIsIGRzdENhY2hlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2hhbmRsZV9hcnJheSgidmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQiLCAic3JjQ2FjaGVDb3VudCIsICJwU3JjQ2FjaGVzIiwgc3JjQ2FjaGVDb3VudCwgcFNyY0NhY2hlcywgdHJ1ZSwgdHJ1ZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfdmFsaWRhdGlvbl9jYWNoZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIiwgVktfRVhUX1ZBTElEQVRJT05fQ0FDSEVfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQiLCAidmFsaWRhdGlvbkNhY2hlIiwgdmFsaWRhdGlvbkNhY2hlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQiLCAicERhdGFTaXplIiwgInBEYXRhIiwgcERhdGFTaXplLCAmcERhdGEsIHRydWUsIGZhbHNlLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELXZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVC1wRGF0YS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9zaGFkaW5nX3JhdGVfaW1hZ2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViIsIFZLX05WX1NIQURJTkdfUkFURV9JTUFHRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIiwgImltYWdlTGF5b3V0IiwgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsIGltYWdlTGF5b3V0LCAiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtaW1hZ2VMYXlvdXQtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKiAgICAgICAgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9zaGFkaW5nX3JhdGVfaW1hZ2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViIsIFZLX05WX1NIQURJTkdfUkFURV9JTUFHRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WIiwgInZpZXdwb3J0Q291bnQiLCAicFNoYWRpbmdSYXRlUGFsZXR0ZXMiLCB2aWV3cG9ydENvdW50LCAmcFNoYWRpbmdSYXRlUGFsZXR0ZXMsIHRydWUsIHRydWUsICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLXBTaGFkaW5nUmF0ZVBhbGV0dGVzLXBhcmFtZXRlciIpOworICAgIGlmIChwU2hhZGluZ1JhdGVQYWxldHRlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCB2aWV3cG9ydEluZGV4ID0gMDsgdmlld3BvcnRJbmRleCA8IHZpZXdwb3J0Q291bnQ7ICsrdmlld3BvcnRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bV9hcnJheSgidmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WIiwgUGFyYW1ldGVyTmFtZSgicFNoYWRpbmdSYXRlUGFsZXR0ZXNbJWldLnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnsgdmlld3BvcnRJbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicFNoYWRpbmdSYXRlUGFsZXR0ZXNbJWldLnBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHZpZXdwb3J0SW5kZXggfSksICJWa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlYiLCBBbGxWa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlZFbnVtcywgcFNoYWRpbmdSYXRlUGFsZXR0ZXNbdmlld3BvcnRJbmRleF0uc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudCwgcFNoYWRpbmdSYXRlUGFsZXR0ZXNbdmlld3BvcnRJbmRleF0ucFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMsIHRydWUsIHRydWUpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVihjb21tYW5kQnVmZmVyLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwU2hhZGluZ1JhdGVQYWxldHRlcyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViAgICAgICAgICAgICAgICAgICBzYW1wbGVPcmRlclR5cGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TYW1wbGVPcmRlckNvdW50LAorICAgIGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogICAgICAgICAgcEN1c3RvbVNhbXBsZU9yZGVycykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfc2hhZGluZ19yYXRlX2ltYWdlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYiLCBWS19OVl9TSEFESU5HX1JBVEVfSU1BR0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViIsICJzYW1wbGVPcmRlclR5cGUiLCAiVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViIsIEFsbFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlZFbnVtcywgc2FtcGxlT3JkZXJUeXBlLCAiVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtc2FtcGxlT3JkZXJUeXBlLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViIsICJjdXN0b21TYW1wbGVPcmRlckNvdW50IiwgInBDdXN0b21TYW1wbGVPcmRlcnMiLCBjdXN0b21TYW1wbGVPcmRlckNvdW50LCAmcEN1c3RvbVNhbXBsZU9yZGVycywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtcEN1c3RvbVNhbXBsZU9yZGVycy1wYXJhbWV0ZXIiKTsKKyAgICBpZiAocEN1c3RvbVNhbXBsZU9yZGVycyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdXN0b21TYW1wbGVPcmRlckluZGV4ID0gMDsgY3VzdG9tU2FtcGxlT3JkZXJJbmRleCA8IGN1c3RvbVNhbXBsZU9yZGVyQ291bnQ7ICsrY3VzdG9tU2FtcGxlT3JkZXJJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WIiwgUGFyYW1ldGVyTmFtZSgicEN1c3RvbVNhbXBsZU9yZGVyc1slaV0uc2hhZGluZ1JhdGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3VzdG9tU2FtcGxlT3JkZXJJbmRleCB9KSwgIlZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViIsIEFsbFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVkVudW1zLCBwQ3VzdG9tU2FtcGxlT3JkZXJzW2N1c3RvbVNhbXBsZU9yZGVySW5kZXhdLnNoYWRpbmdSYXRlLCAiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2hhZGluZ1JhdGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViIsIFBhcmFtZXRlck5hbWUoInBDdXN0b21TYW1wbGVPcmRlcnNbJWldLnNhbXBsZUxvY2F0aW9uQ291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3VzdG9tU2FtcGxlT3JkZXJJbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicEN1c3RvbVNhbXBsZU9yZGVyc1slaV0ucFNhbXBsZUxvY2F0aW9ucyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjdXN0b21TYW1wbGVPcmRlckluZGV4IH0pLCBwQ3VzdG9tU2FtcGxlT3JkZXJzW2N1c3RvbVNhbXBsZU9yZGVySW5kZXhdLnNhbXBsZUxvY2F0aW9uQ291bnQsICZwQ3VzdG9tU2FtcGxlT3JkZXJzW2N1c3RvbVNhbXBsZU9yZGVySW5kZXhdLnBTYW1wbGVMb2NhdGlvbnMsIHRydWUsIHRydWUsICJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zYW1wbGVMb2NhdGlvbkNvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXBTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgIGlmIChwQ3VzdG9tU2FtcGxlT3JkZXJzW2N1c3RvbVNhbXBsZU9yZGVySW5kZXhdLnBTYW1wbGVMb2NhdGlvbnMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNhbXBsZUxvY2F0aW9uSW5kZXggPSAwOyBzYW1wbGVMb2NhdGlvbkluZGV4IDwgcEN1c3RvbVNhbXBsZU9yZGVyc1tjdXN0b21TYW1wbGVPcmRlckluZGV4XS5zYW1wbGVMb2NhdGlvbkNvdW50OyArK3NhbXBsZUxvY2F0aW9uSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKGNvbW1hbmRCdWZmZXIsIHNhbXBsZU9yZGVyVHlwZSwgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgcEN1c3RvbVNhbXBsZU9yZGVycyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfcmF5X3RyYWNpbmcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJwQ3JlYXRlSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NSRUFURV9JTkZPX05WIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlYsIHRydWUsICJWVUlELXZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBDcmVhdGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBDcmVhdGVJbmZvLT5pbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OViIsICYocENyZWF0ZUluZm8tPmluZm8pLCBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlYsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtc1R5cGUtc1R5cGUiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJwQ3JlYXRlSW5mby0+aW5mby5wTmV4dCIsIE5VTEwsIHBDcmVhdGVJbmZvLT5pbmZvLnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAicENyZWF0ZUluZm8tPmluZm8udHlwZSIsICJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOViIsIEFsbFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WRW51bXMsIHBDcmVhdGVJbmZvLT5pbmZvLnR5cGUsICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXR5cGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJwQ3JlYXRlSW5mby0+aW5mby5mbGFncyIsICJWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViIsIEFsbFZrQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WLCBwQ3JlYXRlSW5mby0+aW5mby5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAicENyZWF0ZUluZm8tPmluZm8uZ2VvbWV0cnlDb3VudCIsICJwQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OViIsIHBDcmVhdGVJbmZvLT5pbmZvLmdlb21ldHJ5Q291bnQsIHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OViwgZmFsc2UsIHRydWUsICJWVUlELVZrR2VvbWV0cnlOVi1zVHlwZS1zVHlwZSIsICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXBHZW9tZXRyaWVzLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBnZW9tZXRyeUluZGV4ID0gMDsgZ2VvbWV0cnlJbmRleCA8IHBDcmVhdGVJbmZvLT5pbmZvLmdlb21ldHJ5Q291bnQ7ICsrZ2VvbWV0cnlJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBnZW9tZXRyeUluZGV4IH0pLCBOVUxMLCBwQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllc1tnZW9tZXRyeUluZGV4XS5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtHZW9tZXRyeU5WLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbJWldLmdlb21ldHJ5VHlwZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBnZW9tZXRyeUluZGV4IH0pLCAiVmtHZW9tZXRyeVR5cGVOViIsIEFsbFZrR2VvbWV0cnlUeXBlTlZFbnVtcywgcENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbZ2VvbWV0cnlJbmRleF0uZ2VvbWV0cnlUeXBlLCAiVlVJRC1Wa0dlb21ldHJ5TlYtZ2VvbWV0cnlUeXBlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzWyVpXS5nZW9tZXRyeS50cmlhbmdsZXMiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZ2VvbWV0cnlJbmRleCB9KSwgIlZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX1RSSUFOR0xFU19OViIsICYocENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbZ2VvbWV0cnlJbmRleF0uZ2VvbWV0cnkudHJpYW5nbGVzKSwgVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1zVHlwZS1zVHlwZSIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllc1slaV0uZ2VvbWV0cnkudHJpYW5nbGVzLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGdlb21ldHJ5SW5kZXggfSksIE5VTEwsIHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2dlb21ldHJ5SW5kZXhdLmdlb21ldHJ5LnRyaWFuZ2xlcy5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbJWldLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZ2VvbWV0cnlJbmRleCB9KSwgIlZrRm9ybWF0IiwgQWxsVmtGb3JtYXRFbnVtcywgcENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbZ2VvbWV0cnlJbmRleF0uZ2VvbWV0cnkudHJpYW5nbGVzLnZlcnRleEZvcm1hdCwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleEZvcm1hdC1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllc1slaV0uZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4VHlwZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBnZW9tZXRyeUluZGV4IH0pLCAiVmtJbmRleFR5cGUiLCBBbGxWa0luZGV4VHlwZUVudW1zLCBwQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllc1tnZW9tZXRyeUluZGV4XS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhUeXBlLCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhUeXBlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzWyVpXS5nZW9tZXRyeS5hYWJicyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBnZW9tZXRyeUluZGV4IH0pLCAiVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfQUFCQl9OViIsICYocENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbZ2VvbWV0cnlJbmRleF0uZ2VvbWV0cnkuYWFiYnMpLCBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrR2VvbWV0cnlBQUJCTlYtc1R5cGUtc1R5cGUiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbJWldLmdlb21ldHJ5LmFhYmJzLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGdlb21ldHJ5SW5kZXggfSksIE5VTEwsIHBDcmVhdGVJbmZvLT5pbmZvLnBHZW9tZXRyaWVzW2dlb21ldHJ5SW5kZXhdLmdlb21ldHJ5LmFhYmJzLnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0dlb21ldHJ5QUFCQk5WLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm8tPmluZm8ucEdlb21ldHJpZXNbJWldLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGdlb21ldHJ5SW5kZXggfSksICJWa0dlb21ldHJ5RmxhZ0JpdHNOViIsIEFsbFZrR2VvbWV0cnlGbGFnQml0c05WLCBwQ3JlYXRlSW5mby0+aW5mby5wR2VvbWV0cmllc1tnZW9tZXRyeUluZGV4XS5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrR2VvbWV0cnlOVi1mbGFncy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocEFsbG9jYXRvciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJwQWxsb2NhdG9yLT5wZm5GcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuRnJlZSksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5GcmVlLTAwNjM0Iik7CisKKyAgICAgICAgaWYgKHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAicEFjY2VsZXJhdGlvblN0cnVjdHVyZSIsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUsICJWVUlELXZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcEFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJhbWV0ZXIiKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50c18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfcmF5X3RyYWNpbmcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgVktfTlZfUkFZX1RSQUNJTkdfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJhY2NlbGVyYXRpb25TdHJ1Y3R1cmUiLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiogICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfcmF5X3RyYWNpbmcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiLCBWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViIsICJwSW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OViIsIHBJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OViwgdHJ1ZSwgIlZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVi1wSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiLCAicEluZm8tPnBOZXh0IiwgTlVMTCwgcEluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiLCAicEluZm8tPnR5cGUiLCAiVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlYiLCBBbGxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOVkVudW1zLCBwSW5mby0+dHlwZSwgIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYtdHlwZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViIsICJwSW5mby0+YWNjZWxlcmF0aW9uU3RydWN0dXJlIiwgcEluZm8tPmFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViIsICJwTWVtb3J5UmVxdWlyZW1lbnRzIiwgcE1lbW9yeVJlcXVpcmVtZW50cywgIlZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVi1wTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBwQmluZEluZm9zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYiLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX252X3JheV90cmFjaW5nKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIsIFZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIsICJiaW5kSW5mb0NvdW50IiwgInBCaW5kSW5mb3MiLCAiVktfU1RSVUNUVVJFX1RZUEVfQklORF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9JTkZPX05WIiwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcywgVktfU1RSVUNUVVJFX1RZUEVfQklORF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9JTkZPX05WLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtc1R5cGUtc1R5cGUiLCAiVlVJRC12a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVi1wQmluZEluZm9zLXBhcmFtZXRlciIsICJWVUlELXZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WLWJpbmRJbmZvQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocEJpbmRJbmZvcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kSW5mb0luZGV4ID0gMDsgYmluZEluZm9JbmRleCA8IGJpbmRJbmZvQ291bnQ7ICsrYmluZEluZm9JbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgYmluZEluZm9JbmRleCB9KSwgTlVMTCwgcEJpbmRJbmZvc1tiaW5kSW5mb0luZGV4XS5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb3NbJWldLmFjY2VsZXJhdGlvblN0cnVjdHVyZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBwQmluZEluZm9zW2JpbmRJbmZvSW5kZXhdLmFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIsIFBhcmFtZXRlck5hbWUoInBCaW5kSW5mb3NbJWldLm1lbW9yeSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBwQmluZEluZm9zW2JpbmRJbmZvSW5kZXhdLm1lbW9yeSk7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIiwgUGFyYW1ldGVyTmFtZSgicEJpbmRJbmZvc1slaV0uZGV2aWNlSW5kZXhDb3VudCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQmluZEluZm9zWyVpXS5wRGV2aWNlSW5kaWNlcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBiaW5kSW5mb0luZGV4IH0pLCBwQmluZEluZm9zW2JpbmRJbmZvSW5kZXhdLmRldmljZUluZGV4Q291bnQsICZwQmluZEluZm9zW2JpbmRJbmZvSW5kZXhdLnBEZXZpY2VJbmRpY2VzLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1wRGV2aWNlSW5kaWNlcy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogICAgICAgIHBJbmZvLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZmZzZXQsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaE9mZnNldCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX252X3JheV90cmFjaW5nKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OViIsIHBJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlYsIHRydWUsICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1wSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJwSW5mby0+cE5leHQiLCBOVUxMLCBwSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBJbmZvLT50eXBlIiwgIlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlVHlwZU5WIiwgQWxsVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlZFbnVtcywgcEluZm8tPnR5cGUsICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXR5cGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInBJbmZvLT5mbGFncyIsICJWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViIsIEFsbFZrQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WLCBwSW5mby0+ZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1mbGFncy1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAicEluZm8tPmdlb21ldHJ5Q291bnQiLCAicEluZm8tPnBHZW9tZXRyaWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WIiwgcEluZm8tPmdlb21ldHJ5Q291bnQsIHBJbmZvLT5wR2VvbWV0cmllcywgVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfTlYsIGZhbHNlLCB0cnVlLCAiVlVJRC1Wa0dlb21ldHJ5TlYtc1R5cGUtc1R5cGUiLCAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1wR2VvbWV0cmllcy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICAgICAgaWYgKHBJbmZvLT5wR2VvbWV0cmllcyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGdlb21ldHJ5SW5kZXggPSAwOyBnZW9tZXRyeUluZGV4IDwgcEluZm8tPmdlb21ldHJ5Q291bnQ7ICsrZ2VvbWV0cnlJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicEluZm8tPnBHZW9tZXRyaWVzWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBnZW9tZXRyeUluZGV4IH0pLCBOVUxMLCBwSW5mby0+cEdlb21ldHJpZXNbZ2VvbWV0cnlJbmRleF0ucE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrR2VvbWV0cnlOVi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicEluZm8tPnBHZW9tZXRyaWVzWyVpXS5nZW9tZXRyeVR5cGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZ2VvbWV0cnlJbmRleCB9KSwgIlZrR2VvbWV0cnlUeXBlTlYiLCBBbGxWa0dlb21ldHJ5VHlwZU5WRW51bXMsIHBJbmZvLT5wR2VvbWV0cmllc1tnZW9tZXRyeUluZGV4XS5nZW9tZXRyeVR5cGUsICJWVUlELVZrR2VvbWV0cnlOVi1nZW9tZXRyeVR5cGUtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBQYXJhbWV0ZXJOYW1lKCJwSW5mby0+cEdlb21ldHJpZXNbJWldLmdlb21ldHJ5LnRyaWFuZ2xlcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBnZW9tZXRyeUluZGV4IH0pLCAiVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WIiwgJihwSW5mby0+cEdlb21ldHJpZXNbZ2VvbWV0cnlJbmRleF0uZ2VvbWV0cnkudHJpYW5nbGVzKSwgVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1zVHlwZS1zVHlwZSIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIFBhcmFtZXRlck5hbWUoInBJbmZvLT5wR2VvbWV0cmllc1slaV0uZ2VvbWV0cnkudHJpYW5nbGVzLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGdlb21ldHJ5SW5kZXggfSksIE5VTEwsIHBJbmZvLT5wR2VvbWV0cmllc1tnZW9tZXRyeUluZGV4XS5nZW9tZXRyeS50cmlhbmdsZXMucE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicEluZm8tPnBHZW9tZXRyaWVzWyVpXS5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4Rm9ybWF0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGdlb21ldHJ5SW5kZXggfSksICJWa0Zvcm1hdCIsIEFsbFZrRm9ybWF0RW51bXMsIHBJbmZvLT5wR2VvbWV0cmllc1tnZW9tZXRyeUluZGV4XS5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4Rm9ybWF0LCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdmVydGV4Rm9ybWF0LXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicEluZm8tPnBHZW9tZXRyaWVzWyVpXS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhUeXBlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGdlb21ldHJ5SW5kZXggfSksICJWa0luZGV4VHlwZSIsIEFsbFZrSW5kZXhUeXBlRW51bXMsIHBJbmZvLT5wR2VvbWV0cmllc1tnZW9tZXRyeUluZGV4XS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhUeXBlLCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhUeXBlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicEluZm8tPnBHZW9tZXRyaWVzWyVpXS5nZW9tZXRyeS5hYWJicyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBnZW9tZXRyeUluZGV4IH0pLCAiVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfQUFCQl9OViIsICYocEluZm8tPnBHZW9tZXRyaWVzW2dlb21ldHJ5SW5kZXhdLmdlb21ldHJ5LmFhYmJzKSwgVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfQUFCQl9OViwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC1Wa0dlb21ldHJ5QUFCQk5WLXNUeXBlLXNUeXBlIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgUGFyYW1ldGVyTmFtZSgicEluZm8tPnBHZW9tZXRyaWVzWyVpXS5nZW9tZXRyeS5hYWJicy5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBnZW9tZXRyeUluZGV4IH0pLCBOVUxMLCBwSW5mby0+cEdlb21ldHJpZXNbZ2VvbWV0cnlJbmRleF0uZ2VvbWV0cnkuYWFiYnMucE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrR2VvbWV0cnlBQUJCTlYtcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIFBhcmFtZXRlck5hbWUoInBJbmZvLT5wR2VvbWV0cmllc1slaV0uZmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgZ2VvbWV0cnlJbmRleCB9KSwgIlZrR2VvbWV0cnlGbGFnQml0c05WIiwgQWxsVmtHZW9tZXRyeUZsYWdCaXRzTlYsIHBJbmZvLT5wR2VvbWV0cmllc1tnZW9tZXRyeUluZGV4XS5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrR2VvbWV0cnlOVi1mbGFncy1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgInVwZGF0ZSIsIHVwZGF0ZSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJkc3QiLCBkc3QpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAic2NyYXRjaCIsIHNjcmF0Y2gpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kQnVmZmVyLCBwSW5mbywgaW5zdGFuY2VEYXRhLCBpbnN0YW5jZU9mZnNldCwgdXBkYXRlLCBkc3QsIHNyYywgc2NyYXRjaCwgc2NyYXRjaE9mZnNldCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgICAgICAgICAgIG1vZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50c18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfcmF5X3RyYWNpbmcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgVktfTlZfUkFZX1RSQUNJTkdfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJkc3QiLCBkc3QpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJzcmMiLCBzcmMpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgIm1vZGUiLCAiVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIiwgQWxsVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WRW51bXMsIG1vZGUsICJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLW1vZGUtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kVHJhY2VSYXlzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50c18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFRyYWNlUmF5c05WIiwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFRyYWNlUmF5c05WIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX252X3JheV90cmFjaW5nKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFRyYWNlUmF5c05WIiwgVktfTlZfUkFZX1RSQUNJTkdfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFRyYWNlUmF5c05WIiwgInJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciIsIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlcik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX252X3JheV90cmFjaW5nKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsIFZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsICJjcmVhdGVJbmZvQ291bnQiLCAicENyZWF0ZUluZm9zIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WIiwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WLCB0cnVlLCB0cnVlLCAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSIsICJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLXBDcmVhdGVJbmZvcy1wYXJhbWV0ZXIiLCAiVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1jcmVhdGVJbmZvQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocENyZWF0ZUluZm9zICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGNyZWF0ZUluZm9JbmRleCA9IDA7IGNyZWF0ZUluZm9JbmRleCA8IGNyZWF0ZUluZm9Db3VudDsgKytjcmVhdGVJbmZvSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlZbXSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUIH07CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCAiVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucE5leHQsIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0uZmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4IH0pLCAiVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5mbGFncywga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0uc3RhZ2VDb3VudCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFN0YWdlcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk8iLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5zdGFnZUNvdW50LCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wU3RhZ2VzLCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk8sIHRydWUsIHRydWUsICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1wU3RhZ2VzLXBhcmFtZXRlciIsICJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLXN0YWdlQ291bnQtYXJyYXlsZW5ndGgiKTsKKworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHN0YWdlSW5kZXggPSAwOyBzdGFnZUluZGV4IDwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0uc3RhZ2VDb3VudDsgKytzdGFnZUluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvW10gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9SRVFVSVJFRF9TVUJHUk9VUF9TSVpFX0NSRUFURV9JTkZPX0VYVCB9OworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFN0YWdlc1slaV0ucE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4LCBzdGFnZUluZGV4IH0pLCAiVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgIlZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdCaXRzIiwgQWxsVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0uZmxhZ3MsIGtPcHRpb25hbEZsYWdzLCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoInZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wU3RhZ2VzWyVpXS5zdGFnZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXgsIHN0YWdlSW5kZXggfSksICJWa1NoYWRlclN0YWdlRmxhZ0JpdHMiLCBBbGxWa1NoYWRlclN0YWdlRmxhZ0JpdHMsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0uc3RhZ2UsIGtSZXF1aXJlZFNpbmdsZUJpdCwgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFN0YWdlc1slaV0ubW9kdWxlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5tb2R1bGUpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLnBOYW1lIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wTmFtZSwgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmFtZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wU3BlY2lhbGl6YXRpb25JbmZvICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wU3RhZ2VzWyVpXS5wU3BlY2lhbGl6YXRpb25JbmZvLT5tYXBFbnRyeUNvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wU3RhZ2VzWyVpXS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wTWFwRW50cmllcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXgsIHN0YWdlSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0ucFNwZWNpYWxpemF0aW9uSW5mby0+bWFwRW50cnlDb3VudCwgJnBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0ucFNwZWNpYWxpemF0aW9uSW5mby0+cE1hcEVudHJpZXMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tcE1hcEVudHJpZXMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wU3RhZ2VzW3N0YWdlSW5kZXhdLnBTcGVjaWFsaXphdGlvbkluZm8tPnBNYXBFbnRyaWVzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBtYXBFbnRyeUluZGV4ID0gMDsgbWFwRW50cnlJbmRleCA8IHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0ucFNwZWNpYWxpemF0aW9uSW5mby0+bWFwRW50cnlDb3VudDsgKyttYXBFbnRyeUluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFN0YWdlc1slaV0ucFNwZWNpYWxpemF0aW9uSW5mby0+ZGF0YVNpemUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4LCBzdGFnZUluZGV4IH0pLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBTdGFnZXNbJWldLnBTcGVjaWFsaXphdGlvbkluZm8tPnBEYXRhIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCwgc3RhZ2VJbmRleCB9KSwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0ucFN0YWdlc1tzdGFnZUluZGV4XS5wU3BlY2lhbGl6YXRpb25JbmZvLT5kYXRhU2l6ZSwgJnBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBTdGFnZXNbc3RhZ2VJbmRleF0ucFNwZWNpYWxpemF0aW9uSW5mby0+cERhdGEsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tcERhdGEtcGFyYW1ldGVyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5ncm91cENvdW50IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wR3JvdXBzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IGNyZWF0ZUluZm9JbmRleCB9KSwgIlZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OViIsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLmdyb3VwQ291bnQsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBHcm91cHMsIFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OViwgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1wR3JvdXBzLXBhcmFtZXRlciIsICJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWdyb3VwQ291bnQtYXJyYXlsZW5ndGgiKTsKKworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBHcm91cHMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgcENyZWF0ZUluZm9zW2NyZWF0ZUluZm9JbmRleF0uZ3JvdXBDb3VudDsgKytncm91cEluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIiwgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wR3JvdXBzWyVpXS5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXgsIGdyb3VwSW5kZXggfSksIE5VTEwsIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLnBHcm91cHNbZ3JvdXBJbmRleF0ucE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBHcm91cHNbJWldLnR5cGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgY3JlYXRlSW5mb0luZGV4LCBncm91cEluZGV4IH0pLCAiVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBUeXBlTlYiLCBBbGxWa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOVkVudW1zLCBwQ3JlYXRlSW5mb3NbY3JlYXRlSW5mb0luZGV4XS5wR3JvdXBzW2dyb3VwSW5kZXhdLnR5cGUsICJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXR5cGUtcGFyYW1ldGVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLmxheW91dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9yeyBjcmVhdGVJbmZvSW5kZXggfSksIHBDcmVhdGVJbmZvc1tjcmVhdGVJbmZvSW5kZXhdLmxheW91dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBBbGxvY2F0b3IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCAicEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuUmVhbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiLCAicEFsbG9jYXRvci0+cGZuRnJlZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuRnJlZS0wMDYzNCIpOworCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsICJjcmVhdGVJbmZvQ291bnQiLCAicFBpcGVsaW5lcyIsIGNyZWF0ZUluZm9Db3VudCwgJnBQaXBlbGluZXMsIHRydWUsIHRydWUsICJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLWNyZWF0ZUluZm9Db3VudC1hcnJheWxlbmd0aCIsICJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLXBQaXBlbGluZXMtcGFyYW1ldGVyIik7CisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEdyb3VwLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50c18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfcmF5X3RyYWNpbmcpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIiwgVktfTlZfUkFZX1RSQUNJTkdfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViIsICJwaXBlbGluZSIsIHBpcGVsaW5lKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOViIsICJkYXRhU2l6ZSIsICJwRGF0YSIsIGRhdGFTaXplLCAmcERhdGEsIHRydWUsIHRydWUsICJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLWRhdGFTaXplLWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYtcERhdGEtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9yYXlfdHJhY2luZykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIsIFZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIsICJhY2NlbGVyYXRpb25TdHJ1Y3R1cmUiLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYiLCAiZGF0YVNpemUiLCAicERhdGEiLCBkYXRhU2l6ZSwgJnBEYXRhLCB0cnVlLCB0cnVlLCAiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWRhdGFTaXplLWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1wRGF0YS1wYXJhbWV0ZXIiKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKGRldmljZSwgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBkYXRhU2l6ZSwgcERhdGEpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLAorICAgIFZrUXVlcnlUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIiwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9yYXlfdHJhY2luZykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYiLCBWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9oYW5kbGVfYXJyYXkoInZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIiwgImFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50IiwgInBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzIiwgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLCB0cnVlLCB0cnVlKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViIsICJxdWVyeVR5cGUiLCAiVmtRdWVyeVR5cGUiLCBBbGxWa1F1ZXJ5VHlwZUVudW1zLCBxdWVyeVR5cGUsICJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLXF1ZXJ5VHlwZS1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYiLCAicXVlcnlQb29sIiwgcXVlcnlQb29sKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDb21waWxlRGVmZXJyZWROVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDb21waWxlRGVmZXJyZWROViIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDb21waWxlRGVmZXJyZWROViIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9yYXlfdHJhY2luZykgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDb21waWxlRGVmZXJyZWROViIsIFZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDb21waWxlRGVmZXJyZWROViIsICJwaXBlbGluZSIsIHBpcGVsaW5lKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCisKKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIb3N0UG9pbnRlciwKKyAgICBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCogICAgICAgICAgIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9leHRlcm5hbF9tZW1vcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIiwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIiwgVktfRVhUX0VYVEVSTkFMX01FTU9SWV9IT1NUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCIsICJoYW5kbGVUeXBlIiwgIlZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMiLCBBbGxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzLCBoYW5kbGVUeXBlLCBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQtaGFuZGxlVHlwZS1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIiwgInBIb3N0UG9pbnRlciIsIHBIb3N0UG9pbnRlciwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIiwgInBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMiLCAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0hPU1RfUE9JTlRFUl9QUk9QRVJUSUVTX0VYVCIsIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMsIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9IT1NUX1BPSU5URVJfUFJPUEVSVElFU19FWFQsIHRydWUsICJWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULXBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZVN0YWdlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19hbWRfYnVmZmVyX21hcmtlcikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCIsIFZLX0FNRF9CVUZGRVJfTUFSS0VSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EIiwgInBpcGVsaW5lU3RhZ2UiLCAiVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiLCBBbGxWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cywgcGlwZWxpbmVTdGFnZSwga1JlcXVpcmVkU2luZ2xlQml0LCAiVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELXBpcGVsaW5lU3RhZ2UtcGFyYW1ldGVyIiwgIlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1waXBlbGluZVN0YWdlLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EIiwgImRzdEJ1ZmZlciIsIGRzdEJ1ZmZlcik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEb21haW5Db3VudCwKKyAgICBWa1RpbWVEb21haW5FWFQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRG9tYWlucykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQiLCAicFRpbWVEb21haW5Db3VudCIsICJwVGltZURvbWFpbnMiLCBwVGltZURvbWFpbkNvdW50LCAmcFRpbWVEb21haW5zLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhULXBUaW1lRG9tYWlucy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcENvdW50LAorICAgIGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqICAgICAgICAgcFRpbWVzdGFtcEluZm9zLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVzdGFtcHMsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF4RGV2aWF0aW9uKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfY2FsaWJyYXRlZF90aW1lc3RhbXBzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUIiwgVktfRVhUX0NBTElCUkFURURfVElNRVNUQU1QU19FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCIsICJ0aW1lc3RhbXBDb3VudCIsICJwVGltZXN0YW1wSW5mb3MiLCAiVktfU1RSVUNUVVJFX1RZUEVfQ0FMSUJSQVRFRF9USU1FU1RBTVBfSU5GT19FWFQiLCB0aW1lc3RhbXBDb3VudCwgcFRpbWVzdGFtcEluZm9zLCBWS19TVFJVQ1RVUkVfVFlQRV9DQUxJQlJBVEVEX1RJTUVTVEFNUF9JTkZPX0VYVCwgdHJ1ZSwgdHJ1ZSwgIlZVSUQtVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQtcFRpbWVzdGFtcEluZm9zLXBhcmFtZXRlciIsICJWVUlELXZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQtdGltZXN0YW1wQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocFRpbWVzdGFtcEluZm9zICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHRpbWVzdGFtcEluZGV4ID0gMDsgdGltZXN0YW1wSW5kZXggPCB0aW1lc3RhbXBDb3VudDsgKyt0aW1lc3RhbXBJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQiLCBQYXJhbWV0ZXJOYW1lKCJwVGltZXN0YW1wSW5mb3NbJWldLnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7IHRpbWVzdGFtcEluZGV4IH0pLCBOVUxMLCBwVGltZXN0YW1wSW5mb3NbdGltZXN0YW1wSW5kZXhdLnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQiLCBQYXJhbWV0ZXJOYW1lKCJwVGltZXN0YW1wSW5mb3NbJWldLnRpbWVEb21haW4iLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcnsgdGltZXN0YW1wSW5kZXggfSksICJWa1RpbWVEb21haW5FWFQiLCBBbGxWa1RpbWVEb21haW5FWFRFbnVtcywgcFRpbWVzdGFtcEluZm9zW3RpbWVzdGFtcEluZGV4XS50aW1lRG9tYWluLCAiVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXRpbWVEb21haW4tcGFyYW1ldGVyIik7CisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCIsICJ0aW1lc3RhbXBDb3VudCIsICJwVGltZXN0YW1wcyIsIHRpbWVzdGFtcENvdW50LCAmcFRpbWVzdGFtcHMsIHRydWUsIHRydWUsICJWVUlELXZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQtdGltZXN0YW1wQ291bnQtYXJyYXlsZW5ndGgiLCAiVlVJRC12a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhULXBUaW1lc3RhbXBzLXBhcmFtZXRlciIpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCIsICJwTWF4RGV2aWF0aW9uIiwgcE1heERldmlhdGlvbiwgIlZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1wTWF4RGV2aWF0aW9uLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisKKworCisKKworCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKworCisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUYXNrKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRHJhd01lc2hUYXNrc05WIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX252X21lc2hfc2hhZGVyKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZERyYXdNZXNoVGFza3NOViIsIFZLX05WX01FU0hfU0hBREVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NOVihjb21tYW5kQnVmZmVyLCB0YXNrQ291bnQsIGZpcnN0VGFzayk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfbWVzaF9zaGFkZXIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYiLCBWS19OVl9NRVNIX1NIQURFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYiLCAiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKGNvbW1hbmRCdWZmZXIsIGJ1ZmZlciwgb2Zmc2V0LCBkcmF3Q291bnQsIHN0cmlkZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9tZXNoX3NoYWRlcikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIiwgVktfTlZfTUVTSF9TSEFERVJfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYiLCAiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WIiwgImNvdW50QnVmZmVyIiwgY291bnRCdWZmZXIpOworICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVihjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnRCdWZmZXIsIGNvdW50QnVmZmVyT2Zmc2V0LCBtYXhEcmF3Q291bnQsIHN0cmlkZSk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9zY2lzc29yX2V4Y2x1c2l2ZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYiLCBWS19OVl9TQ0lTU09SX0VYQ0xVU0lWRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYiLCAiZXhjbHVzaXZlU2Npc3NvckNvdW50IiwgInBFeGNsdXNpdmVTY2lzc29ycyIsIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwgJnBFeGNsdXNpdmVTY2lzc29ycywgdHJ1ZSwgdHJ1ZSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LWFycmF5bGVuZ3RoIiwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtcEV4Y2x1c2l2ZVNjaXNzb3JzLXBhcmFtZXRlciIpOworICAgIGlmIChwRXhjbHVzaXZlU2Npc3NvcnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgZXhjbHVzaXZlU2Npc3NvckluZGV4ID0gMDsgZXhjbHVzaXZlU2Npc3NvckluZGV4IDwgZXhjbHVzaXZlU2Npc3NvckNvdW50OyArK2V4Y2x1c2l2ZVNjaXNzb3JJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIGlmICghc2tpcCkgc2tpcCB8PSBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKGNvbW1hbmRCdWZmZXIsIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgZXhjbHVzaXZlU2Npc3NvckNvdW50LCBwRXhjbHVzaXZlU2Npc3NvcnMpOworICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRDaGVja3BvaW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnRNYXJrZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRTZXRDaGVja3BvaW50TlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfZGV2aWNlX2RpYWdub3N0aWNfY2hlY2twb2ludHMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kU2V0Q2hlY2twb2ludE5WIiwgVktfTlZfREVWSUNFX0RJQUdOT1NUSUNfQ0hFQ0tQT0lOVFNfRVhURU5TSU9OX05BTUUpOworICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFF1ZXVlQ2hlY2twb2ludERhdGFOVigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhQ291bnQsCisgICAgVmtDaGVja3BvaW50RGF0YU5WKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGEpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfZGV2aWNlX2RpYWdub3N0aWNfY2hlY2twb2ludHMpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WIiwgVktfTlZfREVWSUNFX0RJQUdOT1NUSUNfQ0hFQ0tQT0lOVFNfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WIiwgInBDaGVja3BvaW50RGF0YUNvdW50IiwgInBDaGVja3BvaW50RGF0YSIsICJWS19TVFJVQ1RVUkVfVFlQRV9DSEVDS1BPSU5UX0RBVEFfTlYiLCBwQ2hlY2twb2ludERhdGFDb3VudCwgcENoZWNrcG9pbnREYXRhLCBWS19TVFJVQ1RVUkVfVFlQRV9DSEVDS1BPSU5UX0RBVEFfTlYsIHRydWUsIGZhbHNlLCBmYWxzZSwgIlZVSUQtVmtDaGVja3BvaW50RGF0YU5WLXNUeXBlLXNUeXBlIiwgIlZVSUQtdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYtcENoZWNrcG9pbnREYXRhLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENoZWNrcG9pbnREYXRhICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHBDaGVja3BvaW50RGF0YUluZGV4ID0gMDsgcENoZWNrcG9pbnREYXRhSW5kZXggPCAqcENoZWNrcG9pbnREYXRhQ291bnQ7ICsrcENoZWNrcG9pbnREYXRhSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvbgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqICBwSW5pdGlhbGl6ZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2ludGVsX3BlcmZvcm1hbmNlX3F1ZXJ5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIiwgVktfSU5URUxfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwiLCAicEluaXRpYWxpemVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUwiLCBwSW5pdGlhbGl6ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUwsIHRydWUsICJWVUlELXZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwtcEluaXRpYWxpemVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBJbml0aWFsaXplSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwiLCAicEluaXRpYWxpemVJbmZvLT5wTmV4dCIsIE5VTEwsIHBJbml0aWFsaXplSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIiwgInBJbml0aWFsaXplSW5mby0+cFVzZXJEYXRhIiwgcEluaXRpYWxpemVJbmZvLT5wVXNlckRhdGEsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfaW50ZWxfcGVyZm9ybWFuY2VfcXVlcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIsIFZLX0lOVEVMX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiAgICAgICAgIHBNYXJrZXJJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19pbnRlbF9wZXJmb3JtYW5jZV9xdWVyeSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMIiwgVktfSU5URUxfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCIsICJwTWFya2VySW5mbyIsICJWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9NQVJLRVJfSU5GT19JTlRFTCIsIHBNYXJrZXJJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9NQVJLRVJfSU5GT19JTlRFTCwgdHJ1ZSwgIlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMLXBNYXJrZXJJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocE1hcmtlckluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwiLCAicE1hcmtlckluZm8tPnBOZXh0IiwgTlVMTCwgcE1hcmtlckluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMLXBOZXh0LXBOZXh0Iik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwqICAgcE1hcmtlckluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2ludGVsX3BlcmZvcm1hbmNlX3F1ZXJ5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwiLCBWS19JTlRFTF9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMIiwgInBNYXJrZXJJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX1NUUkVBTV9NQVJLRVJfSU5GT19JTlRFTCIsIHBNYXJrZXJJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9TVFJFQU1fTUFSS0VSX0lORk9fSU5URUwsIHRydWUsICJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTC1wTWFya2VySW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBNYXJrZXJJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMIiwgInBNYXJrZXJJbmZvLT5wTmV4dCIsIE5VTEwsIHBNYXJrZXJJbmZvLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTC1wTmV4dC1wTmV4dCIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogICAgICAgcE92ZXJyaWRlSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfaW50ZWxfcGVyZm9ybWFuY2VfcXVlcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMIiwgVktfSU5URUxfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMIiwgInBPdmVycmlkZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfT1ZFUlJJREVfSU5GT19JTlRFTCIsIHBPdmVycmlkZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX09WRVJSSURFX0lORk9fSU5URUwsIHRydWUsICJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMLXBPdmVycmlkZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBPdmVycmlkZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCIsICJwT3ZlcnJpZGVJbmZvLT5wTmV4dCIsIE5VTEwsIHBPdmVycmlkZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCIsICJwT3ZlcnJpZGVJbmZvLT50eXBlIiwgIlZrUGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTCIsIEFsbFZrUGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTEVudW1zLCBwT3ZlcnJpZGVJbmZvLT50eXBlLCAiVlVJRC1Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwtdHlwZS1wYXJhbWV0ZXIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwiLCAicE92ZXJyaWRlSW5mby0+ZW5hYmxlIiwgcE92ZXJyaWRlSW5mby0+ZW5hYmxlKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCogcEFjcXVpcmVJbmZvLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwqICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2ludGVsX3BlcmZvcm1hbmNlX3F1ZXJ5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsIFZLX0lOVEVMX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsICJwQWNxdWlyZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09ORklHVVJBVElPTl9BQ1FVSVJFX0lORk9fSU5URUwiLCBwQWNxdWlyZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMLCB0cnVlLCAiVlVJRC12a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1wQWNxdWlyZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBBY3F1aXJlSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIiwgInBBY3F1aXJlSW5mby0+cE5leHQiLCBOVUxMLCBwQWNxdWlyZUluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwtcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsICJwQWNxdWlyZUluZm8tPnR5cGUiLCAiVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUwiLCBBbGxWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTEVudW1zLCBwQWNxdWlyZUluZm8tPnR5cGUsICJWVUlELVZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTC10eXBlLXBhcmFtZXRlciIpOworICAgIH0KKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIiwgInBDb25maWd1cmF0aW9uIiwgcENvbmZpZ3VyYXRpb24sICJWVUlELXZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLXBDb25maWd1cmF0aW9uLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2ludGVsX3BlcmZvcm1hbmNlX3F1ZXJ5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsIFZLX0lOVEVMX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiLCAiY29uZmlndXJhdGlvbiIsIGNvbmZpZ3VyYXRpb24pOworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZVF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2ludGVsX3BlcmZvcm1hbmNlX3F1ZXJ5KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiLCBWS19JTlRFTF9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsICJjb25maWd1cmF0aW9uIiwgY29uZmlndXJhdGlvbik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMICAgICAgICAgICAgIHBhcmFtZXRlciwKKyAgICBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCogICAgICAgICAgICAgICAgICAgIHBWYWx1ZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfaW50ZWxfcGVyZm9ybWFuY2VfcXVlcnkpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIsIFZLX0lOVEVMX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ2a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwiLCAicGFyYW1ldGVyIiwgIlZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwiLCBBbGxWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMRW51bXMsIHBhcmFtZXRlciwgIlZVSUQtdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMLXBhcmFtZXRlci1wYXJhbWV0ZXIiKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCIsICJwVmFsdWUiLCBwVmFsdWUsICJWVUlELXZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTC1wVmFsdWUtcGFyYW1ldGVyIik7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVTZXRMb2NhbERpbW1pbmdBTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwQ2hhaW4sCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpbW1pbmdFbmFibGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrU2V0TG9jYWxEaW1taW5nQU1EIiwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrU2V0TG9jYWxEaW1taW5nQU1EIiwgVktfS0hSX0dFVF9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtTZXRMb2NhbERpbW1pbmdBTUQiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfYW1kX2Rpc3BsYXlfbmF0aXZlX2hkcikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtTZXRMb2NhbERpbW1pbmdBTUQiLCBWS19BTURfRElTUExBWV9OQVRJVkVfSERSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtTZXRMb2NhbERpbW1pbmdBTUQiLCAic3dhcENoYWluIiwgc3dhcENoYWluKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtTZXRMb2NhbERpbW1pbmdBTUQiLCAibG9jYWxEaW1taW5nRW5hYmxlIiwgbG9jYWxEaW1taW5nRW5hYmxlKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghaW5zdGFuY2VfZXh0ZW5zaW9ucy52a19raHJfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfZnVjaHNpYV9pbWFnZXBpcGVfc3VyZmFjZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIsIFZLX0ZVQ0hTSUFfSU1BR0VQSVBFX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEiLCAicENyZWF0ZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQSIsIHBDcmVhdGVJbmZvLCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRVBJUEVfU1VSRkFDRV9DUkVBVEVfSU5GT19GVUNIU0lBLCB0cnVlLCAiVlVJRC12a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBDcmVhdGVJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCBOVUxMLCBwQ3JlYXRlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIsICJwQ3JlYXRlSW5mby0+ZmxhZ3MiLCBwQ3JlYXRlSW5mby0+ZmxhZ3MsICJWVUlELVZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBLWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEiLCAicEFsbG9jYXRvci0+cGZuQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIsICJwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5SZWFsbG9jYXRpb24pLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIsICJwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUpLCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWxsb2NhdG9yLT5wZm5JbnRlcm5hbEZyZWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBIiwgInBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmbkludGVybmFsQWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKworICAgICAgICB9CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSIsICJwU3VyZmFjZSIsIHBTdXJmYWNlLCAiVlVJRC12a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBLXBTdXJmYWNlLXBhcmFtZXRlciIpOworICAgIHJldHVybiBza2lwOworfQorCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVNZXRhbFN1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfZXh0X21ldGFsX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIiwgVktfRVhUX01FVEFMX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX01FVEFMX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhUIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX01FVEFMX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhULCB0cnVlLCAiVlVJRC12a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCBOVUxMLCBwQ3JlYXRlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhUIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCIsICJwU3VyZmFjZSIsIHBTdXJmYWNlLCAiVlVJRC12a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVC1wU3VyZmFjZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfYnVmZmVyX2RldmljZV9hZGRyZXNzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQiLCBWS19FWFRfQlVGRkVSX0RFVklDRV9BRERSRVNTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQiLCAicEluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fS0hSIiwgcEluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUiwgdHJ1ZSwgIlZVSUQtdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSLXBJbmZvLXBhcmFtZXRlciIsICJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocEluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQiLCAicEluZm8tPnBOZXh0IiwgTlVMTCwgcEluZm8tPnBOZXh0LCAwLCBOVUxMLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIsICJwSW5mby0+YnVmZmVyIiwgcEluZm8tPmJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCisKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9vbENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogICAgICAgICAgcFRvb2xQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUIiwgInBUb29sQ291bnQiLCAicFRvb2xQcm9wZXJ0aWVzIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UT09MX1BST1BFUlRJRVNfRVhUIiwgcFRvb2xDb3VudCwgcFRvb2xQcm9wZXJ0aWVzLCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVE9PTF9QUk9QRVJUSUVTX0VYVCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsICJWVUlELVZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVC1wVG9vbFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhULXBUb29sQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICBpZiAocFRvb2xQcm9wZXJ0aWVzICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IHBUb29sSW5kZXggPSAwOyBwVG9vbEluZGV4IDwgKnBUb29sQ291bnQ7ICsrcFRvb2xJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViIsICJwUHJvcGVydHlDb3VudCIsICJwUHJvcGVydGllcyIsICJWS19TVFJVQ1RVUkVfVFlQRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OViIsIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcywgVktfU1RSVUNUVVJFX1RZUEVfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlYsIHRydWUsIGZhbHNlLCBmYWxzZSwgIlZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1zVHlwZS1zVHlwZSIsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbWJpbmF0aW9uQ291bnQsCisgICAgVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqICAgICBwQ29tYmluYXRpb25zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgidmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYiLCAicENvbWJpbmF0aW9uQ291bnQiLCAicENvbWJpbmF0aW9ucyIsICJWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WIiwgcENvbWJpbmF0aW9uQ291bnQsIHBDb21iaW5hdGlvbnMsIFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX01JWEVEX1NBTVBMRVNfQ09NQklOQVRJT05fTlYsIHRydWUsIGZhbHNlLCBmYWxzZSwgIlZVSUQtVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYtc1R5cGUtc1R5cGUiLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOVi1wQ29tYmluYXRpb25zLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENvbWJpbmF0aW9ucyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBwQ29tYmluYXRpb25JbmRleCA9IDA7IHBDb21iaW5hdGlvbkluZGV4IDwgKnBDb21iaW5hdGlvbkNvdW50OyArK3BDb21iaW5hdGlvbkluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyB4bWwtZHJpdmVuIHZhbGlkYXRpb24KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKKworCisKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiLCAicFN1cmZhY2VJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIiLCBwU3VyZmFjZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIsIHRydWUsICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVC1wU3VyZmFjZUluZm8tcGFyYW1ldGVyIiwgIlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zVHlwZS1zVHlwZSIpOworICAgIGlmIChwU3VyZmFjZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUltdID0geyBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVCwgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQgfTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIiwgInBTdXJmYWNlSW5mby0+cE5leHQiLCAiVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQsIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQiLCBwU3VyZmFjZUluZm8tPnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKSwgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFItcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIiwgInBTdXJmYWNlSW5mby0+c3VyZmFjZSIsIHBTdXJmYWNlSW5mby0+c3VyZmFjZSk7CisgICAgfQorICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIsICJwUHJlc2VudE1vZGVDb3VudCIsICJwUHJlc2VudE1vZGVzIiwgcFByZXNlbnRNb2RlQ291bnQsICZwUHJlc2VudE1vZGVzLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLCAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcFByZXNlbnRNb2Rlcy1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIiwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIiwgVktfS0hSX0dFVF9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCBWS19FWFRfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCAic3dhcGNoYWluIiwgc3dhcGNoYWluKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zd2FwY2hhaW4pIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIiwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzXzIpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUIiwgVktfS0hSX0dFVF9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSkgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCBWS19FWFRfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiLCAic3dhcGNoYWluIiwgc3dhcGNoYWluKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGVDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFpbnN0YW5jZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCIsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfZXh0X2hlYWRsZXNzX3N1cmZhY2UpIHNraXAgfD0gT3V0cHV0RXh0ZW5zaW9uRXJyb3IoInZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIiwgVktfRVhUX0hFQURMRVNTX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIiwgInBDcmVhdGVJbmZvIiwgIlZLX1NUUlVDVFVSRV9UWVBFX0hFQURMRVNTX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhUIiwgcENyZWF0ZUluZm8sIFZLX1NUUlVDVFVSRV9UWVBFX0hFQURMRVNTX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhULCB0cnVlLCAiVlVJRC12a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiKTsKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCIsICJwQ3JlYXRlSW5mby0+cE5leHQiLCBOVUxMLCBwQ3JlYXRlSW5mby0+cE5leHQsIDAsIE5VTEwsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVC1wTmV4dC1wTmV4dCIpOworCisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoInZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIiwgInBDcmVhdGVJbmZvLT5mbGFncyIsIHBDcmVhdGVJbmZvLT5mbGFncywgIlZVSUQtVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIik7CisgICAgfQorICAgIGlmIChwQWxsb2NhdG9yICE9IE5VTEwpCisgICAgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIiwgInBBbGxvY2F0b3ItPnBmbkFsbG9jYXRpb24iLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5BbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkFsbG9jYXRpb24tMDA2MzIiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIiwgInBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBBbGxvY2F0b3ItPnBmblJlYWxsb2NhdGlvbiksICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUIiwgInBBbGxvY2F0b3ItPnBmbkZyZWUiLCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwQWxsb2NhdG9yLT5wZm5GcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxGcmVlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfcG9pbnRlcigidmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQiLCAicEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uIiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocEFsbG9jYXRvci0+cGZuSW50ZXJuYWxBbGxvY2F0aW9uKSwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSIpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ2a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCIsICJwU3VyZmFjZSIsIHBTdXJmYWNlLCAiVlVJRC12a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVC1wU3VyZmFjZS1wYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVN0aXBwbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVGYWN0b3IsCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZVBhdHRlcm4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMikgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtDbWRTZXRMaW5lU3RpcHBsZUVYVCIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfbGluZV9yYXN0ZXJpemF0aW9uKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0NtZFNldExpbmVTdGlwcGxlRVhUIiwgVktfRVhUX0xJTkVfUkFTVEVSSVpBVElPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgLy8gTm8geG1sLWRyaXZlbiB2YWxpZGF0aW9uCisgICAgaWYgKCFza2lwKSBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRTZXRMaW5lU3RpcHBsZUVYVChjb21tYW5kQnVmZmVyLCBsaW5lU3RpcHBsZUZhY3RvciwgbGluZVN0aXBwbGVQYXR0ZXJuKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UHJlQ2FsbFZhbGlkYXRlUmVzZXRRdWVyeVBvb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1Jlc2V0UXVlcnlQb29sRVhUIiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9ob3N0X3F1ZXJ5X3Jlc2V0KSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a1Jlc2V0UXVlcnlQb29sRVhUIiwgVktfRVhUX0hPU1RfUVVFUllfUkVTRVRfRVhURU5TSU9OX05BTUUpOworICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1Jlc2V0UXVlcnlQb29sRVhUIiwgInF1ZXJ5UG9vbCIsIHF1ZXJ5UG9vbCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3BhcmFtZXRlcl92YWxpZGF0aW9uLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3BhcmFtZXRlcl92YWxpZGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiOGRhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvcGFyYW1ldGVyX3ZhbGlkYXRpb24uaApAQCAtMCwwICsxLDE3OTYgQEAKKy8qICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQhICoqKgorICogU2VlIHBhcmFtZXRlcl92YWxpZGF0aW9uX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3IFZhbHZlIENvcnBvcmF0aW9uCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQEx1bmFyRy5jb20+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhATHVuYXJHLmNvbT4KKyAqLworCisKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbnN0YW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95SW5zdGFuY2UoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUNvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqICAgICAgICAgICAgICAgICAgIHBGZWF0dXJlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgIFZrSW1hZ2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICBWa0ltYWdlVGlsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGluZywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VDcmVhdGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKiAgICAgICAgICAgcE1lbW9yeVByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXZpY2UoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RGV2aWNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERldmljZVF1ZXVlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXgsCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVRdWV1ZVN1Ym1pdCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0Q291bnQsCisgICAgY29uc3QgVmtTdWJtaXRJbmZvKiAgICAgICAgICAgICAgICAgICAgICAgICBwU3VibWl0cywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVXYWl0SWRsZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGV2aWNlV2FpdElkbGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlTWVtb3J5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlTWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICBWa01lbW9yeU1hcEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVW5tYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlQmluZFNwYXJzZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiAgICAgICAgICAgICAgICAgICAgIHBCaW5kSW5mbywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVSZXNldEZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RmVuY2VTdGF0dXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVdhaXRGb3JGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcywKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBbGwsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2VtYXBob3JlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95UXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95QnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXJWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UqICAgICAgICAgICAgICAgICAgIHBTdWJyZXNvdXJjZSwKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbWFnZVZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2hhZGVyTW9kdWxlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRlck1vZHVsZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTaGFkZXJNb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJNb2R1bGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUNhY2hlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lQ2FjaGVEYXRhKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlTWVyZ2VQaXBlbGluZUNhY2hlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdENhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQ2FjaGVDb3VudCwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgIHBTcmNDYWNoZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUxheW91dCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCogICAgICAgICAgICAgICAgICAgICAgcFNldExheW91dCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yUG9vbCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVGcmVlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVVwZGF0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JDb3B5Q291bnQsCisgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvckNvcGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRnJhbWVidWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFJlbmRlckFyZWFHcmFudWxhcml0eSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgVmtFeHRlbnQyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhbnVsYXJpdHkpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kUG9vbCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVGcmVlQ29tbWFuZEJ1ZmZlcnMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUJlZ2luQ29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiAgICAgICAgICAgICBwQmVnaW5JbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRW5kQ29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVSZXNldENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICAgZmxhZ3MpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kUGlwZWxpbmUoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldFNjaXNzb3IoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjaXNzb3JzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVdpZHRoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldERlcHRoQmlhcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NsYW1wLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRCbGVuZENvbnN0YW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZENvbnN0YW50c1s0XSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldERlcHRoQm91bmRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRlcHRoQm91bmRzLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGVwdGhCb3VuZHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFzaykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldFN0ZW5jaWxXcml0ZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1hc2spIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmluZERlc2NyaXB0b3JTZXRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljT2Zmc2V0Q291bnQsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHluYW1pY09mZnNldHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCaW5kSW5kZXhCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrSW5kZXhUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhUeXBlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmluZFZlcnRleEJ1ZmZlcnMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXcoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWZXJ0ZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGV4ZWQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluZGV4LAorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4T2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoSW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckNvcHkqICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJsaXRJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VCbGl0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMsCisgICAgVmtGaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRDb3B5QnVmZmVyVG9JbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZENvcHlJbWFnZVRvQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kVXBkYXRlQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRGaWxsQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQ2xlYXJDb2xvckltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUqICAgICAgICAgICAgICAgICAgICBwQ29sb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiAgICAgICAgICAgICAgcFJhbmdlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqICAgICAgICAgICAgIHBEZXB0aFN0ZW5jaWwsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiAgICAgICAgICAgICAgcFJhbmdlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQXR0YWNobWVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUmVzb2x2ZUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVJlc29sdmUqICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VNYXNrKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUmVzZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFdhaXRFdmVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudCwKKyAgICBjb25zdCBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudHMsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUGlwZWxpbmVCYXJyaWVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICBWa0RlcGVuZGVuY3lGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpblF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRFbmRRdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFJlc2V0UXVlcnlQb29sKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFB1c2hDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIFZrU2hhZGVyU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5SZW5kZXJQYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZE5leHRTdWJwYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRFeGVjdXRlQ29tbWFuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qICAgICAgICAgICAgICAgcEJpbmRJbmZvcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogICAgICAgICAgICAgICAgcEJpbmRJbmZvcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldERldmljZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzaykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoQmFzZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVUcmltQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlUXVldWUyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlSW5mbywKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogICBwRXh0ZXJuYWxCdWZmZXJJbmZvLAorICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qICAgIHBFeHRlcm5hbEZlbmNlSW5mbywKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgIHBFeHRlcm5hbEZlbmNlUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogICAgICAgICAgICAgIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqICAgICAgICAgICAgICAgcFN1cHBvcnQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEZXN0cm95U3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0Jvb2wzMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdEtIUiogICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlQ291bnQsCisgICAgVmtQcmVzZW50TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U3dhcGNoYWluSW1hZ2VzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlQ291bnQsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVQcmVzZW50S0hSKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogICAgICAgICAgICAgICAgICAgICBwUHJlc2VudEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqICAgICAgICBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogICAgICAgICAgICBwQWNxdWlyZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VJbmRleCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5Q291bnQsCisgICAgVmtEaXNwbGF5S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGlzcGxheU1vZGVLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEaXNwbGF5TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9kZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheU1vZGVLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMpIGNvbnN0OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmlzdWFsSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxJRCkgY29uc3Q7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVYY2JTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgeGNiX2Nvbm5lY3Rpb25fdCogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgIHhjYl92aXN1YWxpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsX2lkKSBjb25zdDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgc3RydWN0IHdsX2Rpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KSBjb25zdDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVXaW4zMlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgpIGNvbnN0OworI2VuZGlmCitib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogICAgICAgICAgICAgICAgICBwRmVhdHVyZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqICAgICBwSW1hZ2VGb3JtYXRJbmZvLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiAgICAgICAgICBwTWVtb3J5UHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBwRm9ybWF0SW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREZXZpY2VNYXNrS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU1hc2spIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEJhc2VLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVHJpbUNvbW1hbmRQb29sS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKiAgIHBFeHRlcm5hbEJ1ZmZlckluZm8sCisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICBwRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKSBjb25zdDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcykgY29uc3Q7CisjZW5kaWYKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5RmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLAorICAgIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUZkUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogcEV4dGVybmFsU2VtYXBob3JlSW5mbywKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogICAgICAgICAgICAgIHBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMpIGNvbnN0OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqICBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvKSBjb25zdDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgY29uc3Q7CisjZW5kaWYKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlSW1wb3J0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqICAgICAgICAgICBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldCwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmVuZGVyUGFzczJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtSZW5kZXJQYXNzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVuZGVyUGFzcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kTmV4dFN1YnBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgICAgICAgICAgIHBTdWJwYXNzQmVnaW5JbmZvLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U3dhcGNoYWluU3RhdHVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogICAgcEV4dGVybmFsRmVuY2VJbmZvLAorICAgIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKSBjb25zdDsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogICAgICBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRGZW5jZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIGNvbnN0OworI2VuZGlmCitib29sIFByZUNhbGxWYWxpZGF0ZUltcG9ydEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogICAgICAgICAgICAgICBwSW1wb3J0RmVuY2VGZEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckNvdW50LAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJzLAorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqICAgICAgICAgcENvdW50ZXJEZXNjcmlwdGlvbnMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiAgcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVBhc3NlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiAgICAgICAgcEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgVmtTdXJmYWNlRm9ybWF0MktIUiogICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5UHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKiAgICAgICAgICAgICAgIHBEaXNwbGF5UGxhbmVJbmZvLAorICAgIFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiogICAgICAgICAgICAgcENhcGFiaWxpdGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQmluZEJ1ZmZlck1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qICAgICAgICAgICAgICAgcEJpbmRJbmZvcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUJpbmRJbWFnZU1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogICAgICAgICAgICAgICAgcEJpbmRJbmZvcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVdhaXRTZW1hcGhvcmVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqICAgICAgICAgICAgICAgcFdhaXRJbmZvLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVNpZ25hbFNlbWFwaG9yZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqICAgICAgICAgICAgIHBTaWduYWxJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4ZWN1dGFibGVDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqICAgICAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogICAgICAgICAgIHBTdGF0aXN0aWNzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCogICAgICAgICAgICAgICAgICAgcENhbGxiYWNrKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlYnVnUmVwb3J0TWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRGbGFnc0VYVCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29kZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllclByZWZpeCwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXNzYWdlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQqICAgICAgICBwVGFnSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQqICAgICAgIHBOYW1lSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERlYnVnTWFya2VyQmVnaW5FWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiAgICAgICAgICAgcE1hcmtlckluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREZWJ1Z01hcmtlckVuZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREZWJ1Z01hcmtlckluc2VydEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqICAgICAgICAgICBwTWFya2VySW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXplcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFNoYWRlckluZm9BTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0YWdlLAorICAgIFZrU2hhZGVySW5mb1R5cGVBTUQgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mb1NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mbykgY29uc3Q7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7CisjZW5kaWYKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGV4dGVybmFsSGFuZGxlVHlwZSwKKyAgICBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYqICAgICAgICAgIHBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcykgY29uc3Q7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViAgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCitib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVZpU3VyZmFjZU5OKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7CisjZW5kaWYKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogICBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFByb2Nlc3NDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiAgICAgICAgICBwUHJvY2Vzc0NvbW1hbmRzSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogIHBSZXNlcnZlU3BhY2VJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKiAgICAgICAgICAgICAgICBwSW5kaXJlY3RDb21tYW5kc0xheW91dCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAgICAgICAgICAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa09iamVjdFRhYmxlTlZYKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RUYWJsZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKiAgICAgICBwRmVhdHVyZXMsCisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogICAgICAgICBwTGltaXRzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiAgICAgICAgICAgICAgICAgcFZpZXdwb3J0V1NjYWxpbmdzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUmVsZWFzZURpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkpIGNvbnN0OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZVhsaWJEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KSBjb25zdDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgUlJPdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByck91dHB1dCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5KSBjb25zdDsKKyNlbmRpZgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVEaXNwbGF5UG93ZXJDb250cm9sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5UG93ZXJJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgIHBEZXZpY2VFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0U3dhcGNoYWluQ291bnRlckVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgICAgICAgICAgICAgICAgIGNvdW50ZXIsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlclZhbHVlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogICAgICAgICAgICAgICBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LAorICAgIFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSogICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ3MpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNjYXJkUmVjdGFuZ2xlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVNldEhkck1ldGFkYXRhRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWlucywKKyAgICBjb25zdCBWa0hkck1ldGFkYXRhRVhUKiAgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YSkgY29uc3Q7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSU9TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVNYWNPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKKyNlbmRpZgorYm9vbCBQcmVDYWxsVmFsaWRhdGVTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogICAgICAgIHBOYW1lSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogICAgICAgICBwVGFnSW5mbykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogICAgICAgICAgICAgICAgICAgcE1lc3NlbmdlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCAgICAgIG1lc3NhZ2VTZXZlcml0eSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICAgICAgICAgICAgIG1lc3NhZ2VUeXBlcywKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEpIGNvbnN0OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKiAgIHBQcm9wZXJ0aWVzKSBjb25zdDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHBJbmZvLAorICAgIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikgY29uc3Q7CisjZW5kaWYKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqICAgICAgICAgICAgICAgICBwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgICAgICAgcFZhbGlkYXRpb25DYWNoZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZURlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqICAgICAgICAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WICAgICAgICAgICAgICAgICAgIHNhbXBsZU9yZGVyVHlwZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsCisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiAgICAgICAgcEluZm8sCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZURhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZU9mZnNldCwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2gsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoT2Zmc2V0KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgICAgICAgICAgIG1vZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRUcmFjZVJheXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RHcm91cCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsCisgICAgVmtRdWVyeVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5KSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXIsCisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqICAgICAgICAgICBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURvbWFpbkNvdW50LAorICAgIFZrVGltZURvbWFpbkVYVCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEb21haW5zKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Q2hlY2twb2ludE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50TWFya2VyKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGFDb3VudCwKKyAgICBWa0NoZWNrcG9pbnREYXRhTlYqICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiAgcEluaXRpYWxpemVJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUNtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqICAgICAgICAgcE1hcmtlckluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiAgIHBNYXJrZXJJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqICAgICAgIHBPdmVycmlkZUluZm8pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAgICAgICAgICAgICBjb25maWd1cmF0aW9uKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMICAgICAgICAgICAgIHBhcmFtZXRlciwKKyAgICBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCogICAgICAgICAgICAgICAgICAgIHBWYWx1ZSkgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkgY29uc3Q7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSBjb25zdDsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgY29uc3Q7CisjZW5kaWYKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSBjb25zdDsKK2Jvb2wgUHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvb2xDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQqICAgICAgICAgIHBUb29sUHJvcGVydGllcykgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqICAgICAgICAgICAgcFByb3BlcnRpZXMpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21iaW5hdGlvbkNvdW50LAorICAgIFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKiAgICAgcENvbWJpbmF0aW9ucykgY29uc3Q7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMpIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIGNvbnN0OworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorYm9vbCBQcmVDYWxsVmFsaWRhdGVSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pIGNvbnN0OworI2VuZGlmCitib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIGNvbnN0OworYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRTZXRMaW5lU3RpcHBsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZUZhY3RvciwKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlUGF0dGVybikgY29uc3Q7Citib29sIFByZUNhbGxWYWxpZGF0ZVJlc2V0UXVlcnlQb29sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC9zcGlydl90b29sc19jb21taXRfaWQuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvc3BpcnZfdG9vbHNfY29tbWl0X2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5YWRjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvc3BpcnZfdG9vbHNfY29tbWl0X2lkLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKioKKy8vIFNlZSBleHRlcm5hbF9yZXZpc2lvbl9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZm9yYmVzQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IENvcnQgU3RyYXR0b24gPGNvcnRAZ29vZ2xlLmNvbT4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCisjZGVmaW5lIFNQSVJWX1RPT0xTX0NPTU1JVF9JRCAiYjEzMTYzMGU3Yzc0OWE1ZGMxOWZhYTQ1ODAyNDI2MGM3MWZiMTcwZiIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdGhyZWFkX3NhZmV0eS5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3RocmVhZF9zYWZldHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzVkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3RocmVhZF9zYWZldHkuY3BwCkBAIC0wLDAgKzEsNjM0NiBAQAorCisvLyBUaGlzIGZpbGUgaXMgKioqR0VORVJBVEVEKioqLiAgRG8gTm90IEVkaXQuCisvLyBTZWUgdGhyZWFkX3NhZmV0eV9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMuCisKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKi8KKyNpbmNsdWRlICJjaGFzc2lzLmgiCisjaW5jbHVkZSAidGhyZWFkX3NhZmV0eS5oIgorCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQWxsb2NhdGVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChwQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gKnBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChwQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbCk7CisKKyAgICAvLyBSZWNvcmQgbWFwcGluZyBmcm9tIGNvbW1hbmQgYnVmZmVyIHRvIGNvbW1hbmQgcG9vbAorICAgIGlmKHBDb21tYW5kQnVmZmVycykgeworICAgICAgICBhdXRvIGxvY2sgPSB3cml0ZV9sb2NrX2d1YXJkX3QodGhyZWFkX3NhZmV0eV9sb2NrKTsKKyAgICAgICAgYXV0byAmcG9vbF9jb21tYW5kX2J1ZmZlcnMgPSBwb29sX2NvbW1hbmRfYnVmZmVyc19tYXBbcEFsbG9jYXRlSW5mby0+Y29tbWFuZFBvb2xdOworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBwQWxsb2NhdGVJbmZvLT5jb21tYW5kQnVmZmVyQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGNvbW1hbmRfcG9vbF9tYXAuaW5zZXJ0X29yX2Fzc2lnbihwQ29tbWFuZEJ1ZmZlcnNbaW5kZXhdLCBwQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbCk7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgICAgICBwb29sX2NvbW1hbmRfYnVmZmVycy5pbnNlcnQocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCogICAgICAgICAgICAgICAgICAgICAgcFNldExheW91dCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICBwU2V0TGF5b3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcFNldExheW91dCk7CisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgYmluZGluZyB1c2VzIFVQREFURV9BRlRFUl9CSU5ECisgICAgICAgIGJvb2wgdXBkYXRlX2FmdGVyX2JpbmQgPSBmYWxzZTsKKyAgICAgICAgY29uc3QgYXV0byAqZmxhZ3NfY3JlYXRlX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgICAgICBpZiAoZmxhZ3NfY3JlYXRlX2luZm8pIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmbGFnc19jcmVhdGVfaW5mby0+YmluZGluZ0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3NfY3JlYXRlX2luZm8tPnBCaW5kaW5nRmxhZ3NbaV0gJiBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVfYWZ0ZXJfYmluZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc2xfdXBkYXRlX2FmdGVyX2JpbmRfbWFwLmluc2VydF9vcl9hc3NpZ24oKnBTZXRMYXlvdXQsIHVwZGF0ZV9hZnRlcl9iaW5kKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcEFsbG9jYXRlSW5mbzo6ZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICpwQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QocEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHBBbGxvY2F0ZUluZm86OmRlc2NyaXB0b3JQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgICAgIGF1dG8gJnBvb2xfZGVzY3JpcHRvcl9zZXRzID0gcG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwW3BBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sXTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQ7IGluZGV4MCsrKSB7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4MF0pOworICAgICAgICAgICAgcG9vbF9kZXNjcmlwdG9yX3NldHMuaW5zZXJ0KHBEZXNjcmlwdG9yU2V0c1tpbmRleDBdKTsKKworICAgICAgICAgICAgYXV0byBpdGVyID0gZHNsX3VwZGF0ZV9hZnRlcl9iaW5kX21hcC5maW5kKHBBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzW2luZGV4MF0pOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZHNsX3VwZGF0ZV9hZnRlcl9iaW5kX21hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGRzX3VwZGF0ZV9hZnRlcl9iaW5kX21hcC5pbnNlcnRfb3JfYXNzaWduKHBEZXNjcmlwdG9yU2V0c1tpbmRleDBdLCBpdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCAmJiAiZGVzY3JpcHRvciBzZXQgbGF5b3V0IG5vdCBmb3VuZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGRlc2NyaXB0b3JQb29sKTsKKyAgICBpZiAocERlc2NyaXB0b3JTZXRzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXg9MDsgaW5kZXggPCBkZXNjcmlwdG9yU2V0Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGVhY2ggbWVtYmVyIG9mIHBEZXNjcmlwdG9yU2V0cyBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvclBvb2wpOworICAgIGlmIChwRGVzY3JpcHRvclNldHMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGRlc2NyaXB0b3JTZXRDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGVhY2ggbWVtYmVyIG9mIHBEZXNjcmlwdG9yU2V0cyBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcEFsbG9jYXRlSW5mbzo6ZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICBhdXRvIGxvY2sgPSB3cml0ZV9sb2NrX2d1YXJkX3QodGhyZWFkX3NhZmV0eV9sb2NrKTsKKyAgICAgICAgYXV0byAmcG9vbF9kZXNjcmlwdG9yX3NldHMgPSBwb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXBbZGVzY3JpcHRvclBvb2xdOworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGRlc2NyaXB0b3JTZXRDb3VudDsgaW5kZXgwKyspIHsKKyAgICAgICAgICAgIERlc3Ryb3lPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4MF0pOworICAgICAgICAgICAgcG9vbF9kZXNjcmlwdG9yX3NldHMuZXJhc2UocERlc2NyaXB0b3JTZXRzW2luZGV4MF0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIGF1dG8gbG9jayA9IHJlYWRfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgYXV0byBpdGVyYXRvciA9IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcC5maW5kKGRlc2NyaXB0b3JQb29sKTsKKyAgICAvLyBQb3NzaWJsZSB0byBoYXZlIG5vIGRlc2NyaXB0b3Igc2V0cyBhbGxvY2F0ZWQgZnJvbSBwb29sCisgICAgaWYgKGl0ZXJhdG9yICE9IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcC5lbmQoKSkgeworICAgICAgICBmb3IoYXV0byBkZXNjcmlwdG9yX3NldCA6IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtkZXNjcmlwdG9yUG9vbF0pIHsKKyAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChkZXNjcmlwdG9yUG9vbCk7CisgICAgRGVzdHJveU9iamVjdChkZXNjcmlwdG9yUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIHsKKyAgICAgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGltcGxpY2l0bHkgZnJlZWQgZGVzY3JpcHRvciBzZXRzCisgICAgICAgIGZvcihhdXRvIGRlc2NyaXB0b3Jfc2V0IDogcG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwW2Rlc2NyaXB0b3JQb29sXSkgeworICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICAgICAgRGVzdHJveU9iamVjdChkZXNjcmlwdG9yX3NldCk7CisgICAgICAgIH0KKyAgICAgICAgcG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwW2Rlc2NyaXB0b3JQb29sXS5jbGVhcigpOworICAgICAgICBwb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXAuZXJhc2UoZGVzY3JpcHRvclBvb2wpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRSZXNldERlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIC8vIGFueSBzbmFtZTpWa0Rlc2NyaXB0b3JTZXQgb2JqZWN0cyBhbGxvY2F0ZWQgZnJvbSBwbmFtZTpkZXNjcmlwdG9yUG9vbCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkIGJldHdlZW4gaG9zdCBhY2Nlc3NlcworICAgIGF1dG8gbG9jayA9IHJlYWRfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgYXV0byBpdGVyYXRvciA9IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcC5maW5kKGRlc2NyaXB0b3JQb29sKTsKKyAgICAvLyBQb3NzaWJsZSB0byBoYXZlIG5vIGRlc2NyaXB0b3Igc2V0cyBhbGxvY2F0ZWQgZnJvbSBwb29sCisgICAgaWYgKGl0ZXJhdG9yICE9IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcC5lbmQoKSkgeworICAgICAgICBmb3IoYXV0byBkZXNjcmlwdG9yX3NldCA6IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtkZXNjcmlwdG9yUG9vbF0pIHsKKyAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRSZXNldERlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGRlc2NyaXB0b3JQb29sKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBkZXNjcmlwdG9yUG9vbCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gYW55IHNuYW1lOlZrRGVzY3JpcHRvclNldCBvYmplY3RzIGFsbG9jYXRlZCBmcm9tIHBuYW1lOmRlc2NyaXB0b3JQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiBob3N0IGFjY2Vzc2VzCisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGltcGxpY2l0bHkgZnJlZWQgZGVzY3JpcHRvciBzZXRzCisgICAgICAgIGF1dG8gbG9jayA9IHdyaXRlX2xvY2tfZ3VhcmRfdCh0aHJlYWRfc2FmZXR5X2xvY2spOworICAgICAgICBmb3IoYXV0byBkZXNjcmlwdG9yX3NldCA6IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtkZXNjcmlwdG9yUG9vbF0pIHsKKyAgICAgICAgICAgIEZpbmlzaFdyaXRlT2JqZWN0KGRlc2NyaXB0b3Jfc2V0KTsKKyAgICAgICAgICAgIERlc3Ryb3lPYmplY3QoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICB9CisgICAgICAgIHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtkZXNjcmlwdG9yUG9vbF0uY2xlYXIoKTsKKyAgICB9Cit9CisKK2Jvb2wgVGhyZWFkU2FmZXR5OjpEc1VwZGF0ZUFmdGVyQmluZChWa0Rlc2NyaXB0b3JTZXQgc2V0KSBjb25zdAoreworICAgIGF1dG8gaXRlciA9IGRzX3VwZGF0ZV9hZnRlcl9iaW5kX21hcC5maW5kKHNldCk7CisgICAgaWYgKGl0ZXIgIT0gZHNfdXBkYXRlX2FmdGVyX2JpbmRfbWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChwRGVzY3JpcHRvcldyaXRlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4PTA7IGluZGV4IDwgZGVzY3JpcHRvcldyaXRlQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGF1dG8gZHN0U2V0ID0gcERlc2NyaXB0b3JXcml0ZXNbaW5kZXhdLmRzdFNldDsKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlX2FmdGVyX2JpbmQgPSBEc1VwZGF0ZUFmdGVyQmluZChkc3RTZXQpOworICAgICAgICAgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgICAgICAgICAgU3RhcnRSZWFkT2JqZWN0KGRzdFNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QoZHN0U2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGRlc2NyaXB0b3JDb3B5Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGF1dG8gZHN0U2V0ID0gcERlc2NyaXB0b3JDb3BpZXNbaW5kZXhdLmRzdFNldDsKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlX2FmdGVyX2JpbmQgPSBEc1VwZGF0ZUFmdGVyQmluZChkc3RTZXQpOworICAgICAgICAgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgICAgICAgICAgU3RhcnRSZWFkT2JqZWN0KGRzdFNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QoZHN0U2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXJ0UmVhZE9iamVjdChwRGVzY3JpcHRvckNvcGllc1tpbmRleF0uc3JjU2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIb3N0IGFjY2VzcyB0byBwRGVzY3JpcHRvcldyaXRlc1tdLmRzdFNldCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcERlc2NyaXB0b3JDb3BpZXNbXS5kc3RTZXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocERlc2NyaXB0b3JXcml0ZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGRlc2NyaXB0b3JXcml0ZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBhdXRvIGRzdFNldCA9IHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4XS5kc3RTZXQ7CisgICAgICAgICAgICBib29sIHVwZGF0ZV9hZnRlcl9iaW5kID0gRHNVcGRhdGVBZnRlckJpbmQoZHN0U2V0KTsKKyAgICAgICAgICAgIGlmICh1cGRhdGVfYWZ0ZXJfYmluZCkgeworICAgICAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QoZHN0U2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoZHN0U2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGRlc2NyaXB0b3JDb3B5Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGF1dG8gZHN0U2V0ID0gcERlc2NyaXB0b3JDb3BpZXNbaW5kZXhdLmRzdFNldDsKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlX2FmdGVyX2JpbmQgPSBEc1VwZGF0ZUFmdGVyQmluZChkc3RTZXQpOworICAgICAgICAgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgICAgICAgICAgRmluaXNoUmVhZE9iamVjdChkc3RTZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGaW5pc2hXcml0ZU9iamVjdChkc3RTZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmluaXNoUmVhZE9iamVjdChwRGVzY3JpcHRvckNvcGllc1tpbmRleF0uc3JjU2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIb3N0IGFjY2VzcyB0byBwRGVzY3JpcHRvcldyaXRlc1tdLmRzdFNldCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcERlc2NyaXB0b3JDb3BpZXNbXS5kc3RTZXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCisgICAgYm9vbCB1cGRhdGVfYWZ0ZXJfYmluZCA9IERzVXBkYXRlQWZ0ZXJCaW5kKGRlc2NyaXB0b3JTZXQpOworICAgIGlmICh1cGRhdGVfYWZ0ZXJfYmluZCkgeworICAgICAgICBTdGFydFJlYWRPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yU2V0KTsKKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclNldCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKKyAgICBib29sIHVwZGF0ZV9hZnRlcl9iaW5kID0gRHNVcGRhdGVBZnRlckJpbmQoZGVzY3JpcHRvclNldCk7CisgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgIEZpbmlzaFJlYWRPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRlc2NyaXB0b3JTZXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCisgICAgYm9vbCB1cGRhdGVfYWZ0ZXJfYmluZCA9IERzVXBkYXRlQWZ0ZXJCaW5kKGRlc2NyaXB0b3JTZXQpOworICAgIGlmICh1cGRhdGVfYWZ0ZXJfYmluZCkgeworICAgICAgICBTdGFydFJlYWRPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yU2V0KTsKKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclNldCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKKyAgICBib29sIHVwZGF0ZV9hZnRlcl9iaW5kID0gRHNVcGRhdGVBZnRlckJpbmQoZGVzY3JpcHRvclNldCk7CisgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgIEZpbmlzaFJlYWRPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRlc2NyaXB0b3JTZXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEZyZWVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzKSB7CisgICAgY29uc3QgYm9vbCBsb2NrQ29tbWFuZFBvb2wgPSBmYWxzZTsgIC8vIHBvb2wgaXMgYWxyZWFkeSBkaXJlY3RseSBsb2NrZWQKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIGlmKHBDb21tYW5kQnVmZmVycykgeworICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSdyZSBpbW1lZGlhdGVseSAiZmluaXNoaW5nIiBiZWxvdywgd2Ugc3RpbGwgYXJlIHRlc3RpbmcgZm9yIGNvbmN1cnJlbmN5IHdpdGggYW55IGNhbGwgaW4gcHJvY2VzcworICAgICAgICAvLyBzbyB0aGlzIGlzbid0IGEgbm8tb3AKKyAgICAgICAgLy8gVGhlIGRyaXZlciBtYXkgaW1tZWRpYXRlbHkgcmV1c2UgY29tbWFuZCBidWZmZXJzIGluIGFub3RoZXIgdGhyZWFkLgorICAgICAgICAvLyBUaGVzZSB1cGRhdGVzIG5lZWQgdG8gYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBkb3duIHRvIHRoZSBkcml2ZXIuCisgICAgICAgIGF1dG8gbG9jayA9IHdyaXRlX2xvY2tfZ3VhcmRfdCh0aHJlYWRfc2FmZXR5X2xvY2spOworICAgICAgICBhdXRvICZwb29sX2NvbW1hbmRfYnVmZmVycyA9IHBvb2xfY29tbWFuZF9idWZmZXJzX21hcFtjb21tYW5kUG9vbF07CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvbW1hbmRCdWZmZXJDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgU3RhcnRXcml0ZU9iamVjdChwQ29tbWFuZEJ1ZmZlcnNbaW5kZXhdLCBsb2NrQ29tbWFuZFBvb2wpOworICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QocENvbW1hbmRCdWZmZXJzW2luZGV4XSwgbG9ja0NvbW1hbmRQb29sKTsKKyAgICAgICAgICAgIERlc3Ryb3lPYmplY3QocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgICAgICBwb29sX2NvbW1hbmRfYnVmZmVycy5lcmFzZShwQ29tbWFuZEJ1ZmZlcnNbaW5kZXhdKTsKKyAgICAgICAgICAgIGNvbW1hbmRfcG9vbF9tYXAuZXJhc2UocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEZyZWVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRQb29sKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kUG9vbCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQ29tbWFuZFBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRQb29sLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcENvbW1hbmRQb29sKTsKKyAgICAgICAgY19Wa0NvbW1hbmRQb29sQ29udGVudHMuQ3JlYXRlT2JqZWN0KCpwQ29tbWFuZFBvb2wpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRSZXNldENvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgZmxhZ3MpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIC8vIENoZWNrIGZvciBhbnkgdXNlcyBvZiBub24tZXh0ZXJuYWxseSBzeW5jJ2QgY29tbWFuZCBidWZmZXJzIChmb3IgZXhhbXBsZSBmcm9tIHZrQ21kRXhlY3V0ZUNvbW1hbmRzKQorICAgIGNfVmtDb21tYW5kUG9vbENvbnRlbnRzLlN0YXJ0V3JpdGUoY29tbWFuZFBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUmVzZXRDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdzIGZsYWdzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kUG9vbCk7CisgICAgY19Wa0NvbW1hbmRQb29sQ29udGVudHMuRmluaXNoV3JpdGUoY29tbWFuZFBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95Q29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIC8vIENoZWNrIGZvciBhbnkgdXNlcyBvZiBub24tZXh0ZXJuYWxseSBzeW5jJ2QgY29tbWFuZCBidWZmZXJzIChmb3IgZXhhbXBsZSBmcm9tIHZrQ21kRXhlY3V0ZUNvbW1hbmRzKQorICAgIGNfVmtDb21tYW5kUG9vbENvbnRlbnRzLlN0YXJ0V3JpdGUoY29tbWFuZFBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKworICAgIGF1dG8gbG9jayA9IHdyaXRlX2xvY2tfZ3VhcmRfdCh0aHJlYWRfc2FmZXR5X2xvY2spOworICAgIC8vIFRoZSBkcml2ZXIgbWF5IGltbWVkaWF0ZWx5IHJldXNlIGNvbW1hbmQgYnVmZmVycyBpbiBhbm90aGVyIHRocmVhZC4KKyAgICAvLyBUaGVzZSB1cGRhdGVzIG5lZWQgdG8gYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBkb3duIHRvIHRoZSBkcml2ZXIuCisgICAgLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gaW1wbGljaXRseSBmcmVlZCBjb21tYW5kIHBvb2xzCisgICAgZm9yKGF1dG8gY29tbWFuZF9idWZmZXIgOiBwb29sX2NvbW1hbmRfYnVmZmVyc19tYXBbY29tbWFuZFBvb2xdKSB7CisgICAgICAgIERlc3Ryb3lPYmplY3QoY29tbWFuZF9idWZmZXIpOworICAgIH0KKyAgICBwb29sX2NvbW1hbmRfYnVmZmVyc19tYXBbY29tbWFuZFBvb2xdLmNsZWFyKCk7CisgICAgcG9vbF9jb21tYW5kX2J1ZmZlcnNfbWFwLmVyYXNlKGNvbW1hbmRQb29sKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIERlc3Ryb3lPYmplY3QoY29tbWFuZFBvb2wpOworICAgIGNfVmtDb21tYW5kUG9vbENvbnRlbnRzLkZpbmlzaFdyaXRlKGNvbW1hbmRQb29sKTsKKyAgICBjX1ZrQ29tbWFuZFBvb2xDb250ZW50cy5EZXN0cm95T2JqZWN0KGNvbW1hbmRQb29sKTsKK30KKworLy8gR2V0U3dhcGNoYWluSW1hZ2VzIGNhbiByZXR1cm4gYSBub24temVybyBjb3VudCB3aXRoIGEgTlVMTCBwU3dhcGNoYWluSW1hZ2VzIHBvaW50ZXIuICBMZXQncyBhdm9pZCBjcmFzaGVzIGJ5IGlnbm9yaW5nCisvLyBwU3dhcGNoYWluSW1hZ2VzLgordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90ICpwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UgKnBTd2FwY2hhaW5JbWFnZXMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChzd2FwY2hhaW4pOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90ICpwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlICpwU3dhcGNoYWluSW1hZ2VzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHN3YXBjaGFpbik7CisgICAgaWYgKHBTd2FwY2hhaW5JbWFnZXMgIT0gTlVMTCkgeworICAgICAgICBhdXRvIGxvY2sgPSB3cml0ZV9sb2NrX2d1YXJkX3QodGhyZWFkX3NhZmV0eV9sb2NrKTsKKyAgICAgICAgYXV0byAmd3JhcHBlZF9zd2FwY2hhaW5faW1hZ2VfaGFuZGxlcyA9IHN3YXBjaGFpbl93cmFwcGVkX2ltYWdlX2hhbmRsZV9tYXBbc3dhcGNoYWluXTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdyYXBwZWRfc3dhcGNoYWluX2ltYWdlX2hhbmRsZXMuc2l6ZSgpKTsgaSA8ICpwU3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocFN3YXBjaGFpbkltYWdlc1tpXSk7CisgICAgICAgICAgICB3cmFwcGVkX3N3YXBjaGFpbl9pbWFnZV9oYW5kbGVzLmVtcGxhY2VfYmFjayhwU3dhcGNoYWluSW1hZ2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChzd2FwY2hhaW4pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN3YXBjaGFpbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgYXV0byBsb2NrID0gcmVhZF9sb2NrX2d1YXJkX3QodGhyZWFkX3NhZmV0eV9sb2NrKTsKKyAgICBmb3IgKGF1dG8gJmltYWdlX2hhbmRsZSA6IHN3YXBjaGFpbl93cmFwcGVkX2ltYWdlX2hhbmRsZV9tYXBbc3dhcGNoYWluXSkgeworICAgICAgICBTdGFydFdyaXRlT2JqZWN0KGltYWdlX2hhbmRsZSk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KHN3YXBjaGFpbik7CisgICAgRGVzdHJveU9iamVjdChzd2FwY2hhaW4pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN3YXBjaGFpbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgZm9yIChhdXRvICZpbWFnZV9oYW5kbGUgOiBzd2FwY2hhaW5fd3JhcHBlZF9pbWFnZV9oYW5kbGVfbWFwW3N3YXBjaGFpbl0pIHsKKyAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoaW1hZ2VfaGFuZGxlKTsKKyAgICAgICAgRGVzdHJveU9iamVjdChpbWFnZV9oYW5kbGUpOworICAgIH0KKyAgICBzd2FwY2hhaW5fd3JhcHBlZF9pbWFnZV9oYW5kbGVfbWFwLmVyYXNlKHN3YXBjaGFpbik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBkZXZpY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95RGV2aWNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBEZXN0cm95T2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBkZXZpY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIGF1dG8gbG9jayA9IHdyaXRlX2xvY2tfZ3VhcmRfdCh0aHJlYWRfc2FmZXR5X2xvY2spOworICAgIGZvciAoYXV0byAmcXVldWUgOiBkZXZpY2VfcXVldWVzX21hcFtkZXZpY2VdKSB7CisgICAgICAgIERlc3Ryb3lPYmplY3QocXVldWUpOworICAgIH0KKyAgICBkZXZpY2VfcXVldWVzX21hcFtkZXZpY2VdLmNsZWFyKCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVJbmRleCwKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXgsCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBDcmVhdGVPYmplY3QoKnBRdWV1ZSk7CisgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgZGV2aWNlX3F1ZXVlc19tYXBbZGV2aWNlXS5pbnNlcnQoKnBRdWV1ZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlSW5mbywKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUluZm8sCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBDcmVhdGVPYmplY3QoKnBRdWV1ZSk7CisgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgZGV2aWNlX3F1ZXVlc19tYXBbZGV2aWNlXS5pbnNlcnQoKnBRdWV1ZSk7Cit9CisKKworCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZUluc3RhbmNlKAorICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5zdGFuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlKSB7CisgICAgCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUluc3RhbmNlKAorICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5zdGFuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdFBhcmVudEluc3RhbmNlKCpwSW5zdGFuY2UpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95SW5zdGFuY2UoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGluc3RhbmNlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveUluc3RhbmNlKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7CisgICAgRGVzdHJveU9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBpbnN0YW5jZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaHlzaWNhbERldmljZXMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRJbnN0YW5jZVByb2NBZGRyKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmFtZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldERldmljZVByb2NBZGRyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXREZXZpY2VQcm9jQWRkcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOYW1lKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlKSB7CisgICAgCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZURldmljZSgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcERldmljZSk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFF1ZXVlU3VibWl0KAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qICAgICAgICAgICAgICAgICAgICAgICAgIHBTdWJtaXRzLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KHF1ZXVlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGZlbmNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBxdWV1ZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZmVuY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRRdWV1ZVN1Ym1pdCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0Q291bnQsCisgICAgY29uc3QgVmtTdWJtaXRJbmZvKiAgICAgICAgICAgICAgICAgICAgICAgICBwU3VibWl0cywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QocXVldWUpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGZlbmNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBxdWV1ZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZmVuY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFF1ZXVlV2FpdElkbGUoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QocXVldWUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHF1ZXVlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUXVldWVXYWl0SWRsZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QocXVldWUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHF1ZXVlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXZpY2VXYWl0SWRsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgLy8gYWxsIHNuYW1lOlZrUXVldWUgb2JqZWN0cyBjcmVhdGVkIGZyb20gcG5hbWU6ZGV2aWNlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiBob3N0IGFjY2Vzc2VzCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERldmljZVdhaXRJZGxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgLy8gYWxsIHNuYW1lOlZrUXVldWUgb2JqZWN0cyBjcmVhdGVkIGZyb20gcG5hbWU6ZGV2aWNlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiBob3N0IGFjY2Vzc2VzCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRBbGxvY2F0ZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlTWVtb3J5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3QoKnBNZW1vcnkpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRGcmVlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChtZW1vcnkpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIG1lbW9yeSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QobWVtb3J5KTsKKyAgICBEZXN0cm95T2JqZWN0KG1lbW9yeSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gbWVtb3J5IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRNYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIFZrTWVtb3J5TWFwRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdm9pZCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcERhdGEpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QobWVtb3J5KTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBtZW1vcnkgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRNYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIFZrTWVtb3J5TWFwRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdm9pZCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcERhdGEsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChtZW1vcnkpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIG1lbW9yeSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkVW5tYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QobWVtb3J5KTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBtZW1vcnkgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRVbm1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KG1lbW9yeSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gbWVtb3J5IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KG1lbW9yeSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcykgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QobWVtb3J5KTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRCaW5kQnVmZmVyTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KG1lbW9yeSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gYnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChtZW1vcnkpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQmluZEltYWdlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoaW1hZ2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChtZW1vcnkpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGltYWdlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQmluZEltYWdlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChpbWFnZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChtZW1vcnkpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGltYWdlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QoYnVmZmVyKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QoYnVmZmVyKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KGltYWdlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGltYWdlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QoaW1hZ2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChpbWFnZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qICAgICAgICAgICAgICAgICAgICAgcEJpbmRJbmZvLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KHF1ZXVlKTsKKyAgICBpZiAocEJpbmRJbmZvKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXg9MDsgaW5kZXggPCBiaW5kSW5mb0NvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBpZiAocEJpbmRJbmZvW2luZGV4XS5wQnVmZmVyQmluZHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4Mj0wOyBpbmRleDIgPCBwQmluZEluZm9baW5kZXhdLmJ1ZmZlckJpbmRDb3VudDsgaW5kZXgyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhcnRXcml0ZU9iamVjdChwQmluZEluZm9baW5kZXhdLnBCdWZmZXJCaW5kc1tpbmRleDJdLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleF0ucEltYWdlT3BhcXVlQmluZHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4Mj0wOyBpbmRleDIgPCBwQmluZEluZm9baW5kZXhdLmltYWdlT3BhcXVlQmluZENvdW50OyBpbmRleDIrKykgeworICAgICAgICAgICAgICAgICAgICBTdGFydFdyaXRlT2JqZWN0KHBCaW5kSW5mb1tpbmRleF0ucEltYWdlT3BhcXVlQmluZHNbaW5kZXgyXS5pbWFnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleF0ucEltYWdlQmluZHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4Mj0wOyBpbmRleDIgPCBwQmluZEluZm9baW5kZXhdLmltYWdlQmluZENvdW50OyBpbmRleDIrKykgeworICAgICAgICAgICAgICAgICAgICBTdGFydFdyaXRlT2JqZWN0KHBCaW5kSW5mb1tpbmRleF0ucEltYWdlQmluZHNbaW5kZXgyXS5pbWFnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFN0YXJ0V3JpdGVPYmplY3QoZmVuY2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHF1ZXVlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBwQmluZEluZm9bXS5wQnVmZmVyQmluZHNbXS5idWZmZXIscEJpbmRJbmZvW10ucEltYWdlT3BhcXVlQmluZHNbXS5pbWFnZSxwQmluZEluZm9bXS5wSW1hZ2VCaW5kc1tdLmltYWdlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBmZW5jZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFF1ZXVlQmluZFNwYXJzZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiAgICAgICAgICAgICAgICAgICAgIHBCaW5kSW5mbywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QocXVldWUpOworICAgIGlmIChwQmluZEluZm8pIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGJpbmRJbmZvQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChwQmluZEluZm9baW5kZXhdLnBCdWZmZXJCaW5kcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyPTA7IGluZGV4MiA8IHBCaW5kSW5mb1tpbmRleF0uYnVmZmVyQmluZENvdW50OyBpbmRleDIrKykgeworICAgICAgICAgICAgICAgICAgICBGaW5pc2hXcml0ZU9iamVjdChwQmluZEluZm9baW5kZXhdLnBCdWZmZXJCaW5kc1tpbmRleDJdLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBCaW5kSW5mb1tpbmRleF0ucEltYWdlT3BhcXVlQmluZHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4Mj0wOyBpbmRleDIgPCBwQmluZEluZm9baW5kZXhdLmltYWdlT3BhcXVlQmluZENvdW50OyBpbmRleDIrKykgeworICAgICAgICAgICAgICAgICAgICBGaW5pc2hXcml0ZU9iamVjdChwQmluZEluZm9baW5kZXhdLnBJbWFnZU9wYXF1ZUJpbmRzW2luZGV4Ml0uaW1hZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQmluZEluZm9baW5kZXhdLnBJbWFnZUJpbmRzKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDI9MDsgaW5kZXgyIDwgcEJpbmRJbmZvW2luZGV4XS5pbWFnZUJpbmRDb3VudDsgaW5kZXgyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QocEJpbmRJbmZvW2luZGV4XS5wSW1hZ2VCaW5kc1tpbmRleDJdLmltYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgRmluaXNoV3JpdGVPYmplY3QoZmVuY2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHF1ZXVlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBwQmluZEluZm9bXS5wQnVmZmVyQmluZHNbXS5idWZmZXIscEJpbmRJbmZvW10ucEltYWdlT3BhcXVlQmluZHNbXS5pbWFnZSxwQmluZEluZm9bXS5wSW1hZ2VCaW5kc1tdLmltYWdlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBmZW5jZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlRmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3QoKnBGZW5jZSk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChmZW5jZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZmVuY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChmZW5jZSk7CisgICAgRGVzdHJveU9iamVjdChmZW5jZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZmVuY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFJlc2V0RmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChwRmVuY2VzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXg9MDsgaW5kZXggPCBmZW5jZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdGFydFdyaXRlT2JqZWN0KHBGZW5jZXNbaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIb3N0IGFjY2VzcyB0byBlYWNoIG1lbWJlciBvZiBwRmVuY2VzIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUmVzZXRGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChwRmVuY2VzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXg9MDsgaW5kZXggPCBmZW5jZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBGaW5pc2hXcml0ZU9iamVjdChwRmVuY2VzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZWFjaCBtZW1iZXIgb2YgcEZlbmNlcyBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RmVuY2VTdGF0dXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KGZlbmNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0RmVuY2VTdGF0dXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QoZmVuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFdhaXRGb3JGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcywKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBbGwsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocEZlbmNlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBmZW5jZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdGFydFJlYWRPYmplY3QocEZlbmNlc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRXYWl0Rm9yRmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QWxsLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChwRmVuY2VzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGZlbmNlQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QocEZlbmNlc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTZW1hcGhvcmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcFNlbWFwaG9yZSk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KHNlbWFwaG9yZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gc2VtYXBob3JlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChzZW1hcGhvcmUpOworICAgIERlc3Ryb3lPYmplY3Qoc2VtYXBob3JlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBzZW1hcGhvcmUgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwRXZlbnQpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoZXZlbnQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGV2ZW50IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoZXZlbnQpOworICAgIERlc3Ryb3lPYmplY3QoZXZlbnQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGV2ZW50IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QoZXZlbnQpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChldmVudCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChldmVudCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZXZlbnQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRTZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoZXZlbnQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGV2ZW50IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRSZXNldEV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoZXZlbnQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGV2ZW50IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUmVzZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoZXZlbnQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGV2ZW50IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtRdWVyeVBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVlcnlQb29sKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUXVlcnlQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXJ5UG9vbCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3QoKnBRdWVyeVBvb2wpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95UXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChxdWVyeVBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHF1ZXJ5UG9vbCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QocXVlcnlQb29sKTsKKyAgICBEZXN0cm95T2JqZWN0KHF1ZXJ5UG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcXVlcnlQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChxdWVyeVBvb2wpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHF1ZXJ5UG9vbCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwQnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoYnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBidWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95QnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGJ1ZmZlcik7CisgICAgRGVzdHJveU9iamVjdChidWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlclZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlclZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcFZpZXcpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95QnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlclZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGJ1ZmZlclZpZXcpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGJ1ZmZlclZpZXcgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95QnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlclZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoYnVmZmVyVmlldyk7CisgICAgRGVzdHJveU9iamVjdChidWZmZXJWaWV3KTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBidWZmZXJWaWV3IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcEltYWdlKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGltYWdlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBpbWFnZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGltYWdlKTsKKyAgICBEZXN0cm95T2JqZWN0KGltYWdlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBpbWFnZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSogICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLAorICAgIFZrU3VicmVzb3VyY2VMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KGltYWdlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSogICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLAorICAgIFZrU3VicmVzb3VyY2VMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QoaW1hZ2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlVmlldyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2VWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXcsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwVmlldyk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lJbWFnZVZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGltYWdlVmlldyk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gaW1hZ2VWaWV3IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChpbWFnZVZpZXcpOworICAgIERlc3Ryb3lPYmplY3QoaW1hZ2VWaWV3KTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBpbWFnZVZpZXcgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NoYWRlck1vZHVsZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaGFkZXJNb2R1bGUpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTaGFkZXJNb2R1bGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGVyTW9kdWxlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcFNoYWRlck1vZHVsZSk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTaGFkZXJNb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJNb2R1bGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KHNoYWRlck1vZHVsZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gc2hhZGVyTW9kdWxlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChzaGFkZXJNb2R1bGUpOworICAgIERlc3Ryb3lPYmplY3Qoc2hhZGVyTW9kdWxlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBzaGFkZXJNb2R1bGUgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVDYWNoZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVDYWNoZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3QoKnBQaXBlbGluZUNhY2hlKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChwaXBlbGluZUNhY2hlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBwaXBlbGluZUNhY2hlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KHBpcGVsaW5lQ2FjaGUpOworICAgIERlc3Ryb3lPYmplY3QocGlwZWxpbmVDYWNoZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcGlwZWxpbmVDYWNoZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0UGlwZWxpbmVDYWNoZURhdGEoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChwaXBlbGluZUNhY2hlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0UGlwZWxpbmVDYWNoZURhdGEoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHBpcGVsaW5lQ2FjaGUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZE1lcmdlUGlwZWxpbmVDYWNoZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGRzdENhY2hlKTsKKyAgICBpZiAocFNyY0NhY2hlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBzcmNDYWNoZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdGFydFJlYWRPYmplY3QocFNyY0NhY2hlc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRzdENhY2hlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkTWVyZ2VQaXBlbGluZUNhY2hlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdENhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQ2FjaGVDb3VudCwKKyAgICBjb25zdCBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgIHBTcmNDYWNoZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChkc3RDYWNoZSk7CisgICAgaWYgKHBTcmNDYWNoZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgc3JjQ2FjaGVDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgRmluaXNoUmVhZE9iamVjdChwU3JjQ2FjaGVzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZHN0Q2FjaGUgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QocGlwZWxpbmVDYWNoZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChwaXBlbGluZUNhY2hlKTsKKyAgICBpZiAocFBpcGVsaW5lcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBjcmVhdGVJbmZvQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmICghcFBpcGVsaW5lc1tpbmRleF0pIGNvbnRpbnVlOworICAgICAgICAgICAgQ3JlYXRlT2JqZWN0KHBQaXBlbGluZXNbaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QocGlwZWxpbmVDYWNoZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHBpcGVsaW5lQ2FjaGUpOworICAgIGlmIChwUGlwZWxpbmVzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNyZWF0ZUluZm9Db3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKCFwUGlwZWxpbmVzW2luZGV4XSkgY29udGludWU7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocFBpcGVsaW5lc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChwaXBlbGluZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcGlwZWxpbmUgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChwaXBlbGluZSk7CisgICAgRGVzdHJveU9iamVjdChwaXBlbGluZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcGlwZWxpbmUgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lTGF5b3V0KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwUGlwZWxpbmVMYXlvdXQpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUxheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QocGlwZWxpbmVMYXlvdXQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHBpcGVsaW5lTGF5b3V0IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QocGlwZWxpbmVMYXlvdXQpOworICAgIERlc3Ryb3lPYmplY3QocGlwZWxpbmVMYXlvdXQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHBpcGVsaW5lTGF5b3V0IG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXIpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXIsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwU2FtcGxlcik7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3Qoc2FtcGxlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gc2FtcGxlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChzYW1wbGVyKTsKKyAgICBEZXN0cm95T2JqZWN0KHNhbXBsZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHNhbXBsZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoZGVzY3JpcHRvclNldExheW91dCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclNldExheW91dCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChkZXNjcmlwdG9yU2V0TGF5b3V0KTsKKyAgICBEZXN0cm95T2JqZWN0KGRlc2NyaXB0b3JTZXRMYXlvdXQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRlc2NyaXB0b3JTZXRMYXlvdXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JQb29sKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclBvb2wsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwRGVzY3JpcHRvclBvb2wpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZyYW1lYnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRnJhbWVidWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcEZyYW1lYnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGZyYW1lYnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBmcmFtZWJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZyYW1lYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGZyYW1lYnVmZmVyKTsKKyAgICBEZXN0cm95T2JqZWN0KGZyYW1lYnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBmcmFtZWJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcFJlbmRlclBhc3MpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95UmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KHJlbmRlclBhc3MpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHJlbmRlclBhc3MgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95UmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QocmVuZGVyUGFzcyk7CisgICAgRGVzdHJveU9iamVjdChyZW5kZXJQYXNzKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byByZW5kZXJQYXNzIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QocmVuZGVyUGFzcyk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFJlbmRlckFyZWFHcmFudWxhcml0eSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgVmtFeHRlbnQyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhbnVsYXJpdHkpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHJlbmRlclBhc3MpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEJlZ2luQ29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiAgICAgICAgICAgICBwQmVnaW5JbmZvKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICAvLyB0aGUgc25hbWU6VmtDb21tYW5kUG9vbCB0aGF0IHBuYW1lOmNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiBob3N0IGFjY2Vzc2VzCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEJlZ2luQ29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiAgICAgICAgICAgICBwQmVnaW5JbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gdGhlIHNuYW1lOlZrQ29tbWFuZFBvb2wgdGhhdCBwbmFtZTpjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkIGJldHdlZW4gaG9zdCBhY2Nlc3NlcworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICAvLyB0aGUgc25hbWU6VmtDb21tYW5kUG9vbCB0aGF0IHBuYW1lOmNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiBob3N0IGFjY2Vzc2VzCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gdGhlIHNuYW1lOlZrQ29tbWFuZFBvb2wgdGhhdCBwbmFtZTpjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkIGJldHdlZW4gaG9zdCBhY2Nlc3NlcworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFJlc2V0Q29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFJlc2V0Q29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEJpbmRQaXBlbGluZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3QocGlwZWxpbmUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCaW5kUGlwZWxpbmUoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QocGlwZWxpbmUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldFZpZXdwb3J0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFNldFZpZXdwb3J0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldFNjaXNzb3IoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjaXNzb3JzKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kU2V0U2Npc3NvcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNjaXNzb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lzc29yQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Npc3NvcnMpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRTZXRMaW5lV2lkdGgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdpZHRoKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kU2V0TGluZVdpZHRoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aCkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldERlcHRoQmlhcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NsYW1wLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXREZXB0aEJpYXMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDbGFtcCwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXRCbGVuZENvbnN0YW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZENvbnN0YW50c1s0XSkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldERlcHRoQm91bmRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRlcHRoQm91bmRzLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGVwdGhCb3VuZHMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hc2spIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFzaykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldFN0ZW5jaWxXcml0ZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1hc2spIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXRTdGVuY2lsV3JpdGVNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFNldFN0ZW5jaWxSZWZlcmVuY2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRCaW5kRGVzY3JpcHRvclNldHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNPZmZzZXRDb3VudCwKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEeW5hbWljT2Zmc2V0cykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGxheW91dCk7CisgICAgaWYgKHBEZXNjcmlwdG9yU2V0cykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBkZXNjcmlwdG9yU2V0Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIFN0YXJ0UmVhZE9iamVjdChwRGVzY3JpcHRvclNldHNbaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kQmluZERlc2NyaXB0b3JTZXRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljT2Zmc2V0Q291bnQsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHluYW1pY09mZnNldHMpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGxheW91dCk7CisgICAgaWYgKHBEZXNjcmlwdG9yU2V0cykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBkZXNjcmlwdG9yU2V0Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0luZGV4VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VHlwZSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZEJpbmRJbmRleEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtJbmRleFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFR5cGUpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kQmluZFZlcnRleEJ1ZmZlcnMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgaWYgKHBCdWZmZXJzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGJpbmRpbmdDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgU3RhcnRSZWFkT2JqZWN0KHBCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocEJ1ZmZlcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgYmluZGluZ0NvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBGaW5pc2hSZWFkT2JqZWN0KHBCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRHJhdygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZlcnRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWREcmF3KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmVydGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWREcmF3SW5kZXhlZCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXgsCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChidWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoYnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWREaXNwYXRjaCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWREaXNwYXRjaCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZERpc3BhdGNoSW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChidWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZENvcHlCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KHNyY0J1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGRzdEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZENvcHlCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3Qoc3JjQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRzdEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kQ29weUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KHNyY0ltYWdlKTsKKyAgICBTdGFydFJlYWRPYmplY3QoZHN0SW1hZ2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRDb3B5SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChzcmNJbWFnZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChkc3RJbWFnZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kQmxpdEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZUJsaXQqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucywKKyAgICBWa0ZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcikgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KHNyY0ltYWdlKTsKKyAgICBTdGFydFJlYWRPYmplY3QoZHN0SW1hZ2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQmxpdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLAorICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChzcmNJbWFnZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChkc3RJbWFnZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlclRvSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChzcmNCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChkc3RJbWFnZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZENvcHlCdWZmZXJUb0ltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChzcmNCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoZHN0SW1hZ2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZENvcHlJbWFnZVRvQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3Qoc3JjSW1hZ2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChkc3RCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRDb3B5SW1hZ2VUb0J1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3Qoc3JjSW1hZ2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QoZHN0QnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRVcGRhdGVCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGRzdEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChkc3RCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEZpbGxCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChkc3RCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRGaWxsQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChkc3RCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZENsZWFyQ29sb3JJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiAgICAgICAgICAgICAgICAgICAgcENvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChpbWFnZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZENsZWFyQ29sb3JJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiAgICAgICAgICAgICAgICAgICAgcENvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGltYWdlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChpbWFnZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUqICAgICAgICAgICAgIHBEZXB0aFN0ZW5jaWwsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiAgICAgICAgICAgICAgcFJhbmdlcykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoaW1hZ2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZENsZWFyQXR0YWNobWVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kQ2xlYXJBdHRhY2htZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50Q291bnQsCisgICAgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqICAgICAgICAgICAgICAgICAgICBwQXR0YWNobWVudHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Q291bnQsCisgICAgY29uc3QgVmtDbGVhclJlY3QqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRSZXNvbHZlSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlUmVzb2x2ZSogICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3Qoc3JjSW1hZ2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChkc3RJbWFnZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFJlc29sdmVJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHNyY0ltYWdlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRzdEltYWdlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGV2ZW50KTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kU2V0RXZlbnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGV2ZW50KTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRSZXNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VNYXNrKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3QoZXZlbnQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRSZXNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VNYXNrKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChldmVudCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kV2FpdEV2ZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50LAorICAgIGNvbnN0IFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50cywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIGlmIChwRXZlbnRzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIFN0YXJ0UmVhZE9iamVjdChwRXZlbnRzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFdhaXRFdmVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudCwKKyAgICBjb25zdCBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudHMsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgaWYgKHBFdmVudHMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgZXZlbnRDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgRmluaXNoUmVhZE9iamVjdChwRXZlbnRzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kUGlwZWxpbmVCYXJyaWVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICBWa0RlcGVuZGVuY3lGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRQaXBlbGluZUJhcnJpZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RhZ2VNYXNrLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgIFZrRGVwZW5kZW5jeUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUZsYWdzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICBwSW1hZ2VNZW1vcnlCYXJyaWVycykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEJlZ2luUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KHF1ZXJ5UG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZEJlZ2luUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QocXVlcnlQb29sKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRFbmRRdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KHF1ZXJ5UG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZEVuZFF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChxdWVyeVBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFJlc2V0UXVlcnlQb29sKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50KSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3QocXVlcnlQb29sKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kUmVzZXRRdWVyeVBvb2woCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHF1ZXJ5UG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3QocXVlcnlQb29sKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kV3JpdGVUaW1lc3RhbXAoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChxdWVyeVBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChxdWVyeVBvb2wpOworICAgIFN0YXJ0UmVhZE9iamVjdChkc3RCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRDb3B5UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChxdWVyeVBvb2wpOworICAgIEZpbmlzaFJlYWRPYmplY3QoZHN0QnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGxheW91dCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFB1c2hDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIFZrU2hhZGVyU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWVzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChsYXlvdXQpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEJlZ2luUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogICAgICAgICAgICAgICAgcFJlbmRlclBhc3NCZWdpbiwKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kTmV4dFN1YnBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWROZXh0U3VicGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRFeGVjdXRlQ29tbWFuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocENvbW1hbmRCdWZmZXJzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvbW1hbmRCdWZmZXJDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgU3RhcnRSZWFkT2JqZWN0KHBDb21tYW5kQnVmZmVyc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRFeGVjdXRlQ29tbWFuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgaWYgKHBDb21tYW5kQnVmZmVycykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBjb21tYW5kQnVmZmVyQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeTIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qICAgICAgICAgICAgICAgcEJpbmRJbmZvcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRTZXREZXZpY2VNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU1hc2spIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXREZXZpY2VNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU1hc2spIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEJhc2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kRGlzcGF0Y2hCYXNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWiwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WikgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkVHJpbUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZFBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRUcmltQ29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogICAgICAgICAgICAgICAgICAgcFljYmNyQ29udmVyc2lvbikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcFljYmNyQ29udmVyc2lvbik7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdCh5Y2JjckNvbnZlcnNpb24pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHljYmNyQ29udmVyc2lvbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KHljYmNyQ29udmVyc2lvbik7CisgICAgRGVzdHJveU9iamVjdCh5Y2JjckNvbnZlcnNpb24pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHljYmNyQ29udmVyc2lvbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgRGVzdHJveU9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3RQYXJlbnRJbnN0YW5jZShzdXJmYWNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBzdXJmYWNlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveVN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdFBhcmVudEluc3RhbmNlKHN1cmZhY2UpOworICAgIERlc3Ryb3lPYmplY3RQYXJlbnRJbnN0YW5jZShzdXJmYWNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBzdXJmYWNlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0Jvb2wzMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShzdXJmYWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKHN1cmZhY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIqICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIqICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKHN1cmZhY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdEtIUiogICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdEtIUiogICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKHN1cmZhY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKHN1cmZhY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlU3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgICAgIFN0YXJ0V3JpdGVPYmplY3RQYXJlbnRJbnN0YW5jZShwQ3JlYXRlSW5mby0+c3VyZmFjZSk7CisgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QocENyZWF0ZUluZm8tPm9sZFN3YXBjaGFpbik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcENyZWF0ZUluZm8uc3VyZmFjZSxwQ3JlYXRlSW5mby5vbGRTd2FwY2hhaW4gbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgICAgIEZpbmlzaFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UocENyZWF0ZUluZm8tPnN1cmZhY2UpOworICAgICAgICBGaW5pc2hXcml0ZU9iamVjdChwQ3JlYXRlSW5mby0+b2xkU3dhcGNoYWluKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwU3dhcGNoYWluKTsKKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcENyZWF0ZUluZm8uc3VyZmFjZSxwQ3JlYXRlSW5mby5vbGRTd2FwY2hhaW4gbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2VLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VJbmRleCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChzd2FwY2hhaW4pOworICAgIFN0YXJ0V3JpdGVPYmplY3Qoc2VtYXBob3JlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGZlbmNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBzd2FwY2hhaW4gbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIC8vIEhvc3QgYWNjZXNzIHRvIHNlbWFwaG9yZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZmVuY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRBY3F1aXJlTmV4dEltYWdlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChzd2FwY2hhaW4pOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KHNlbWFwaG9yZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoZmVuY2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN3YXBjaGFpbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gc2VtYXBob3JlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBmZW5jZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiAgICAgICAgcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogICAgICAgIHBEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2Uoc3VyZmFjZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gc3VyZmFjZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdFBhcmVudEluc3RhbmNlKHN1cmZhY2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN1cmZhY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdENvdW50LAorICAgIFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdFBhcmVudEluc3RhbmNlKHN1cmZhY2UpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN1cmZhY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RDb3VudCwKKyAgICBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0cywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2Uoc3VyZmFjZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gc3VyZmFjZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQWNxdWlyZU5leHRJbWFnZTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogICAgICAgICAgICBwQWNxdWlyZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VJbmRleCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2UyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqICAgICAgICAgICAgcEFjcXVpcmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5Q291bnQsCisgICAgVmtEaXNwbGF5S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheXMpIHsKKyAgICBpZiAocERpc3BsYXlzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8ICpwRGlzcGxheUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdGFydFJlYWRPYmplY3QocERpc3BsYXlzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZUluZGV4LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlDb3VudCwKKyAgICBWa0Rpc3BsYXlLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5cywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIGlmIChwRGlzcGxheXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgKnBEaXNwbGF5Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QocERpc3BsYXlzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIFN0YXJ0UmVhZE9iamVjdChkaXNwbGF5KTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICBwUHJvcGVydGllcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3QoZGlzcGxheSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlRGlzcGxheU1vZGVLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEaXNwbGF5TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9kZSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoZGlzcGxheSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGlzcGxheSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZURpc3BsYXlNb2RlS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGlzcGxheU1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChkaXNwbGF5KTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwTW9kZSk7CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRpc3BsYXkgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheU1vZGVLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIqICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChtb2RlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBtb2RlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5TW9kZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChtb2RlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBtb2RlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcFN1cmZhY2UpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChwQ3JlYXRlSW5mb3MpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IHN3YXBjaGFpbkNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdGFydFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UocENyZWF0ZUluZm9zW2luZGV4XS5zdXJmYWNlKTsKKyAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QocENyZWF0ZUluZm9zW2luZGV4XS5vbGRTd2FwY2hhaW4pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwU3dhcGNoYWlucykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBzd2FwY2hhaW5Db3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgU3RhcnRSZWFkT2JqZWN0KHBTd2FwY2hhaW5zW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcENyZWF0ZUluZm9zW10uc3VyZmFjZSxwQ3JlYXRlSW5mb3NbXS5vbGRTd2FwY2hhaW4gbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocENyZWF0ZUluZm9zKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXg9MDsgaW5kZXggPCBzd2FwY2hhaW5Db3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3RQYXJlbnRJbnN0YW5jZShwQ3JlYXRlSW5mb3NbaW5kZXhdLnN1cmZhY2UpOworICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QocENyZWF0ZUluZm9zW2luZGV4XS5vbGRTd2FwY2hhaW4pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBpZiAocFN3YXBjaGFpbnMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IHN3YXBjaGFpbkNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgQ3JlYXRlT2JqZWN0KHBTd2FwY2hhaW5zW2luZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcENyZWF0ZUluZm9zW10uc3VyZmFjZSxwQ3JlYXRlSW5mb3NbXS5vbGRTd2FwY2hhaW4gbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlWGxpYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcFN1cmZhY2UpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZVhjYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoKnBTdXJmYWNlKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoKnBTdXJmYWNlKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdFBhcmVudEluc3RhbmNlKCpwU3VyZmFjZSk7CisgICAgfQorfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcFN1cmZhY2UpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERldmljZUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGV2aWNlSW5kZXgsCisgICAgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiAgICAgICAgICAgICAgICAgICBwUGVlck1lbW9yeUZlYXR1cmVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERldmljZUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGV2aWNlSW5kZXgsCisgICAgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiAgICAgICAgICAgICAgICAgICBwUGVlck1lbW9yeUZlYXR1cmVzKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kU2V0RGV2aWNlTWFza0tIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kU2V0RGV2aWNlTWFza0tIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRGlzcGF0Y2hCYXNlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWiwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WikgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZERpc3BhdGNoQmFzZUtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRUcmltQ29tbWFuZFBvb2xLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sVHJpbUZsYWdzICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRQb29sKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kUG9vbCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFRyaW1Db21tYW5kUG9vbEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZFBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldE1lbW9yeVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgcE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCisgICAgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqICAgICAgICAgICBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldE1lbW9yeUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldE1lbW9yeUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldE1lbW9yeUZkUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwKKyAgICBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlGZFByb3BlcnRpZXMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsCisgICAgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICAgICBwTWVtb3J5RmRQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiAgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiAgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGxheW91dCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QobGF5b3V0KTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KGxheW91dCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIEZpbmlzaFJlYWRPYmplY3QobGF5b3V0KTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3QoKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICBEZXN0cm95T2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVSZW5kZXJQYXNzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzczJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtSZW5kZXJQYXNzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVuZGVyUGFzcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3QoKnBSZW5kZXJQYXNzKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLAorICAgIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICAgICAgICAgICAgcFN1YnBhc3NCZWdpbkluZm8pIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZE5leHRTdWJwYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbywKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZE5leHRTdWJwYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbywKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEVuZFJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZEVuZFJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFN3YXBjaGFpblN0YXR1c0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChzd2FwY2hhaW4pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN3YXBjaGFpbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFN3YXBjaGFpblN0YXR1c0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KHN3YXBjaGFpbik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gc3dhcGNoYWluIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiAgICAgIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRJbXBvcnRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqICAgICAgICAgICAgICAgcEltcG9ydEZlbmNlRmRJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkSW1wb3J0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKiAgICAgICAgICAgICAgIHBJbXBvcnRGZW5jZUZkSW5mbywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldEZlbmNlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiogICAgICAgIHBJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqICAgICAgICBwSW5mbywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiAgICAgICAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIFN0YXJ0UmVhZE9iamVjdChkaXNwbGF5KTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiogICAgICAgICAgICAgICAgcFByb3BlcnRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRpc3BsYXkpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwWWNiY3JDb252ZXJzaW9uKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KHljYmNyQ29udmVyc2lvbik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8geWNiY3JDb252ZXJzaW9uIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoeWNiY3JDb252ZXJzaW9uKTsKKyAgICBEZXN0cm95T2JqZWN0KHljYmNyQ29udmVyc2lvbik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8geWNiY3JDb252ZXJzaW9uIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRCaW5kQnVmZmVyTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qICAgICAgICAgICAgICAgcEJpbmRJbmZvcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogICAgICAgICAgICAgICAgcEJpbmRJbmZvcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogICAgICAgICAgICAgICAgcEJpbmRJbmZvcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChidWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChjb3VudEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChjb3VudEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChidWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChjb3VudEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChidWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoY291bnRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KHNlbWFwaG9yZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3Qoc2VtYXBob3JlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRXYWl0U2VtYXBob3Jlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiAgICAgICAgICAgICAgIHBXYWl0SW5mbywKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRXYWl0U2VtYXBob3Jlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiAgICAgICAgICAgICAgIHBXYWl0SW5mbywKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRTaWduYWxTZW1hcGhvcmVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKiAgICAgICAgICAgICBwU2lnbmFsSW5mbykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFNpZ25hbFNlbWFwaG9yZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqICAgICAgICAgICAgIHBTaWduYWxJbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvLAorICAgIFZrRGV2aWNlQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiogcEluZm8pIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiogcEluZm8pIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKiAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGVjdXRhYmxlQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKiAgICAgICAgICBwUHJvcGVydGllcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4ZWN1dGFibGVDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqICAgICAgICAgIHBQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogICAgICAgICAgIHBTdGF0aXN0aWNzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogICAgICAgICAgIHBTdGF0aXN0aWNzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LAorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogcEludGVybmFsUmVwcmVzZW50YXRpb25zLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCogICAgICAgICAgICAgICAgICAgcENhbGxiYWNrKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2ssCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcENhbGxiYWNrKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoY2FsbGJhY2spOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNhbGxiYWNrIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3RQYXJlbnRJbnN0YW5jZShjYWxsYmFjayk7CisgICAgRGVzdHJveU9iamVjdFBhcmVudEluc3RhbmNlKGNhbGxiYWNrKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjYWxsYmFjayBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVidWdSZXBvcnRNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb2RlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2UpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlYnVnUmVwb3J0TWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRGbGFnc0VYVCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29kZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllclByZWZpeCwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXNzYWdlKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKK30KKy8vIFRPRE8gLSBub3Qgd3JhcHBpbmcgRVhUIGZ1bmN0aW9uIHZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQKKy8vIFRPRE8gLSBub3Qgd3JhcHBpbmcgRVhUIGZ1bmN0aW9uIHZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUCisvLyBUT0RPIC0gbm90IHdyYXBwaW5nIEVYVCBmdW5jdGlvbiB2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQKKy8vIFRPRE8gLSBub3Qgd3JhcHBpbmcgRVhUIGZ1bmN0aW9uIHZrQ21kRGVidWdNYXJrZXJFbmRFWFQKKy8vIFRPRE8gLSBub3Qgd3JhcHBpbmcgRVhUIGZ1bmN0aW9uIHZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwU2l6ZXMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIGlmIChwQnVmZmVycykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBiaW5kaW5nQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIFN0YXJ0UmVhZE9iamVjdChwQnVmZmVyc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwU2l6ZXMpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocEJ1ZmZlcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgYmluZGluZ0NvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBGaW5pc2hSZWFkT2JqZWN0KHBCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIGlmIChwQ291bnRlckJ1ZmZlcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgY291bnRlckJ1ZmZlckNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdGFydFJlYWRPYmplY3QocENvdW50ZXJCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgaWYgKHBDb3VudGVyQnVmZmVycykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudGVyQnVmZmVyQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QocENvdW50ZXJCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocENvdW50ZXJCdWZmZXJzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50ZXJCdWZmZXJDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgU3RhcnRSZWFkT2JqZWN0KHBDb3VudGVyQnVmZmVyc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocENvdW50ZXJCdWZmZXJzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50ZXJCdWZmZXJDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgRmluaXNoUmVhZE9iamVjdChwQ291bnRlckJ1ZmZlcnNbaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChxdWVyeVBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHF1ZXJ5UG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRW5kUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChxdWVyeVBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRFbmRRdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QocXVlcnlQb29sKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTdHJpZGUpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChjb3VudGVyQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4U3RyaWRlKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChjb3VudGVyQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRJbWFnZVZpZXdIYW5kbGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiAgICAgICAgICAgICBwSW5mbykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldEltYWdlVmlld0hhbmRsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqICAgICAgICAgICAgIHBJbmZvKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGNvdW50QnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoYnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGNvdW50QnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGNvdW50QnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChjb3VudEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0U2hhZGVySW5mb0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3RhZ2UsCisgICAgVmtTaGFkZXJJbmZvVHlwZUFNRCAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvVHlwZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QocGlwZWxpbmUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRTaGFkZXJJbmZvQU1EKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgVmtTaGFkZXJTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdGFnZSwKKyAgICBWa1NoYWRlckluZm9UeXBlQU1EICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm9TaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHBpcGVsaW5lKTsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcFN1cmZhY2UpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QobWVtb3J5KTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChtZW1vcnkpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZVZpU3VyZmFjZU5OKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdFBhcmVudEluc3RhbmNlKCpwU3VyZmFjZSk7CisgICAgfQorfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQqICAgcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiAgIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqICAgICAgICAgIHBQcm9jZXNzQ29tbWFuZHNJbmZvKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqICAgICAgICAgIHBQcm9jZXNzQ29tbWFuZHNJbmZvKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiAgcFJlc2VydmVTcGFjZUluZm8pIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqICBwUmVzZXJ2ZVNwYWNlSW5mbykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogICAgICAgICAgICAgICAgcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgqICAgICAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzTGF5b3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggICAgICAgICAgICAgICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QoaW5kaXJlY3RDb21tYW5kc0xheW91dCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAgICAgICAgICAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrT2JqZWN0VGFibGVOVlgqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdFRhYmxlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlT2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtPYmplY3RUYWJsZU5WWCogICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0VGFibGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0KCpwT2JqZWN0VGFibGUpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95T2JqZWN0VGFibGVOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3Qob2JqZWN0VGFibGUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIG9iamVjdFRhYmxlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3Qob2JqZWN0VGFibGUpOworICAgIERlc3Ryb3lPYmplY3Qob2JqZWN0VGFibGUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIG9iamVjdFRhYmxlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRSZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVFbnRyeU5WWCogY29uc3QqICAgICAgICAgcHBPYmplY3RUYWJsZUVudHJpZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChvYmplY3RUYWJsZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gb2JqZWN0VGFibGUgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRSZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVFbnRyeU5WWCogY29uc3QqICAgICAgICAgcHBPYmplY3RUYWJsZUVudHJpZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KG9iamVjdFRhYmxlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBvYmplY3RUYWJsZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChvYmplY3RUYWJsZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gb2JqZWN0VGFibGUgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRVbnJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqICAgICAgICAgICAgICAgICBwT2JqZWN0RW50cnlUeXBlcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3Qob2JqZWN0VGFibGUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIG9iamVjdFRhYmxlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqICAgICAgICAgICAgICAgICBwVmlld3BvcnRXU2NhbGluZ3MpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqICAgICAgICAgICAgICAgICBwVmlld3BvcnRXU2NhbGluZ3MpIHsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRSZWxlYXNlRGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSkgeworICAgIFN0YXJ0UmVhZE9iamVjdChkaXNwbGF5KTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUmVsZWFzZURpc3BsYXlFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRpc3BsYXkpOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEFjcXVpcmVYbGliRGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSkgeworICAgIFN0YXJ0UmVhZE9iamVjdChkaXNwbGF5KTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQWNxdWlyZVhsaWJEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdChkaXNwbGF5KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogICAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShzdXJmYWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREaXNwbGF5UG93ZXJDb250cm9sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5UG93ZXJJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QoZGlzcGxheSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERpc3BsYXlQb3dlckNvbnRyb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogICAgICAgICAgICAgICAgcERpc3BsYXlQb3dlckluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRpc3BsYXkpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgICBwRGV2aWNlRXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgICBwRGV2aWNlRXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5RXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KGRpc3BsYXkpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRSZWdpc3RlckRpc3BsYXlFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRpc3BsYXkpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFN3YXBjaGFpbkNvdW50ZXJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUICAgICAgICAgICAgICAgICBjb3VudGVyLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJWYWx1ZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KHN3YXBjaGFpbik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFN3YXBjaGFpbkNvdW50ZXJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUICAgICAgICAgICAgICAgICBjb3VudGVyLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJWYWx1ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3Qoc3dhcGNoYWluKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKiAgICAgICAgICAgICAgIHBEaXNwbGF5VGltaW5nUHJvcGVydGllcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChzd2FwY2hhaW4pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN3YXBjaGFpbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrUmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUqICAgICAgICAgICAgICAgcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3Qoc3dhcGNoYWluKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBzd2FwY2hhaW4gbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsCisgICAgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5ncykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChzd2FwY2hhaW4pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN3YXBjaGFpbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5nQ291bnQsCisgICAgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiAgICAgICAgICAgICBwUHJlc2VudGF0aW9uVGltaW5ncywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KHN3YXBjaGFpbik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gc3dhcGNoYWluIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRSZWN0YW5nbGVDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNjYXJkUmVjdGFuZ2xlcykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc2NhcmRSZWN0YW5nbGVzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkU2V0SGRyTWV0YWRhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zLAorICAgIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocFN3YXBjaGFpbnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgc3dhcGNoYWluQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIFN0YXJ0UmVhZE9iamVjdChwU3dhcGNoYWluc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRTZXRIZHJNZXRhZGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMsCisgICAgY29uc3QgVmtIZHJNZXRhZGF0YUVYVCogICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocFN3YXBjaGFpbnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgc3dhcGNoYWluQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QocFN3YXBjaGFpbnNbaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlSU9TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoKnBTdXJmYWNlKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVNYWNPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVNYWNPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoKnBTdXJmYWNlKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworLy8gVE9ETyAtIG5vdCB3cmFwcGluZyBFWFQgZnVuY3Rpb24gdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVAorLy8gVE9ETyAtIG5vdCB3cmFwcGluZyBFWFQgZnVuY3Rpb24gdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykgeworICAgIFN0YXJ0UmVhZE9iamVjdChxdWV1ZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHF1ZXVlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0KHF1ZXVlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSkgeworICAgIEZpbmlzaFJlYWRPYmplY3QocXVldWUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0KHF1ZXVlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHF1ZXVlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKSB7CisgICAgRmluaXNoUmVhZE9iamVjdChjb21tYW5kQnVmZmVyKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKSB7CisgICAgRmluaXNoUmVhZE9iamVjdChjb21tYW5kQnVmZmVyKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbykgeworICAgIFN0YXJ0UmVhZE9iamVjdChjb21tYW5kQnVmZmVyKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQqICAgICAgICAgICAgICAgICAgIHBNZXNzZW5nZXIpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQqICAgICAgICAgICAgICAgICAgIHBNZXNzZW5nZXIsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcE1lc3Nlbmdlcik7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3RQYXJlbnRJbnN0YW5jZShtZXNzZW5nZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIG1lc3NlbmdlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdFBhcmVudEluc3RhbmNlKG1lc3Nlbmdlcik7CisgICAgRGVzdHJveU9iamVjdFBhcmVudEluc3RhbmNlKG1lc3Nlbmdlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gbWVzc2VuZ2VyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUICAgICAgbWVzc2FnZVNldmVyaXR5LAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgICAgICAgICAgICAgbWVzc2FnZVR5cGVzLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogcENhbGxiYWNrRGF0YSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCAgICAgIG1lc3NhZ2VTZXZlcml0eSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICAgICAgICAgICAgIG1lc3NhZ2VUeXBlcywKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHBDYWxsYmFja0RhdGEpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogICBwUHJvcGVydGllcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqICAgcFByb3BlcnRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHBJbmZvLAorICAgIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogcEluZm8sCisgICAgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlcioqICAgICAgICAgICAgICAgICAgICBwQnVmZmVyLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNJbmZvKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNJbmZvKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QoaW1hZ2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqICAgICAgcFByb3BlcnRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGltYWdlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICAgICAgICBwVmFsaWRhdGlvbkNhY2hlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgICAgICAgcFZhbGlkYXRpb25DYWNoZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3QoKnBWYWxpZGF0aW9uQ2FjaGUpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhY2hlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdCh2YWxpZGF0aW9uQ2FjaGUpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHZhbGlkYXRpb25DYWNoZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QodmFsaWRhdGlvbkNhY2hlKTsKKyAgICBEZXN0cm95T2JqZWN0KHZhbGlkYXRpb25DYWNoZSk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gdmFsaWRhdGlvbkNhY2hlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGRzdENhY2hlKTsKKyAgICBpZiAocFNyY0NhY2hlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBzcmNDYWNoZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdGFydFJlYWRPYmplY3QocFNyY0NhY2hlc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRzdENhY2hlIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGRzdENhY2hlKTsKKyAgICBpZiAocFNyY0NhY2hlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBzcmNDYWNoZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBGaW5pc2hSZWFkT2JqZWN0KHBTcmNDYWNoZXNbaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIb3N0IGFjY2VzcyB0byBkc3RDYWNoZSBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QodmFsaWRhdGlvbkNhY2hlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoUmVhZE9iamVjdCh2YWxpZGF0aW9uQ2FjaGUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChpbWFnZVZpZXcpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0KSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChpbWFnZVZpZXcpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogICAgICAgICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcykgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogICAgICAgICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgICAgICAgICAgICAgICAgICAgc2FtcGxlT3JkZXJUeXBlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwKKyAgICBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqICAgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnMpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WICAgICAgICAgICAgICAgICAgIHNhbXBsZU9yZGVyVHlwZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsCisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzKSB7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcEFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChhY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChhY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIHBCaW5kSW5mb3MpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiAgICAgICAgcEluZm8sCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZURhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZU9mZnNldCwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2gsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoT2Zmc2V0KSB7CisgICAgU3RhcnRSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChpbnN0YW5jZURhdGEpOworICAgIFN0YXJ0UmVhZE9iamVjdChkc3QpOworICAgIFN0YXJ0UmVhZE9iamVjdChzcmMpOworICAgIFN0YXJ0UmVhZE9iamVjdChzY3JhdGNoKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqICAgICAgICBwSW5mbywKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlT2Zmc2V0LAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgZHN0LAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgc3JjLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hPZmZzZXQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoaW5zdGFuY2VEYXRhKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRzdCk7CisgICAgRmluaXNoUmVhZE9iamVjdChzcmMpOworICAgIEZpbmlzaFJlYWRPYmplY3Qoc2NyYXRjaCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgICAgICAgICAgIG1vZGUpIHsKKyAgICBTdGFydFJlYWRPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGRzdCk7CisgICAgU3RhcnRSZWFkT2JqZWN0KHNyYyk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WICAgICAgICAgICBtb2RlKSB7CisgICAgRmluaXNoUmVhZE9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRzdCk7CisgICAgRmluaXNoUmVhZE9iamVjdChzcmMpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFRyYWNlUmF5c05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChyYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3QoaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3QoY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRUcmFjZVJheXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCkgeworICAgIEZpbmlzaFJlYWRPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChyYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QobWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlcik7CisgICAgRmluaXNoUmVhZE9iamVjdChoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KHBpcGVsaW5lQ2FjaGUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHBpcGVsaW5lQ2FjaGUpOworICAgIGlmIChwUGlwZWxpbmVzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNyZWF0ZUluZm9Db3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKCFwUGlwZWxpbmVzW2luZGV4XSkgY29udGludWU7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocFBpcGVsaW5lc1tpbmRleF0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RHcm91cCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3QocGlwZWxpbmUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0R3JvdXAsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QocGlwZWxpbmUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KGFjY2VsZXJhdGlvblN0cnVjdHVyZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QoYWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywKKyAgICBWa1F1ZXJ5VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnkpIHsKKyAgICBTdGFydFJlYWRPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgaWYgKHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdGFydFJlYWRPYmplY3QocEFjY2VsZXJhdGlvblN0cnVjdHVyZXNbaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBTdGFydFJlYWRPYmplY3QocXVlcnlQb29sKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsCisgICAgVmtRdWVyeVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5KSB7CisgICAgRmluaXNoUmVhZE9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocEFjY2VsZXJhdGlvblN0cnVjdHVyZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QocEFjY2VsZXJhdGlvblN0cnVjdHVyZXNbaW5kZXhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBGaW5pc2hSZWFkT2JqZWN0KHF1ZXJ5UG9vbCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KHBpcGVsaW5lKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlciwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QocGlwZWxpbmUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXIsCisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqICAgICAgICAgICBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIb3N0UG9pbnRlciwKKyAgICBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCogICAgICAgICAgIHBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZVN0YWdlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICBTdGFydFJlYWRPYmplY3QoZHN0QnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcikgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoZHN0QnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcENvdW50LAorICAgIGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqICAgICAgICAgcFRpbWVzdGFtcEluZm9zLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVzdGFtcHMsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF4RGV2aWF0aW9uKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUYXNrKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGFzaykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZEJ1ZmZlcik7CisgICAgU3RhcnRSZWFkT2JqZWN0KGJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoYnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChidWZmZXIpOworICAgIFN0YXJ0UmVhZE9iamVjdChjb3VudEJ1ZmZlcik7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSkgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIEZpbmlzaFJlYWRPYmplY3QoYnVmZmVyKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGNvdW50QnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzKSB7CisgICAgU3RhcnRXcml0ZU9iamVjdChjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBjb21tYW5kQnVmZmVyIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycykgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldENoZWNrcG9pbnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludE1hcmtlcikgeworICAgIFN0YXJ0UmVhZE9iamVjdChjb21tYW5kQnVmZmVyKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQ21kU2V0Q2hlY2twb2ludE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50TWFya2VyKSB7CisgICAgRmluaXNoUmVhZE9iamVjdChjb21tYW5kQnVmZmVyKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YUNvdW50LAorICAgIFZrQ2hlY2twb2ludERhdGFOViogICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0KHF1ZXVlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGFDb3VudCwKKyAgICBWa0NoZWNrcG9pbnREYXRhTlYqICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YSkgeworICAgIEZpbmlzaFJlYWRPYmplY3QocXVldWUpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiAgcEluaXRpYWxpemVJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqICBwSW5pdGlhbGl6ZUluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqICAgICAgICAgcE1hcmtlckluZm8pIHsKKyAgICBTdGFydFJlYWRPYmplY3QoY29tbWFuZEJ1ZmZlcik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqICAgICAgICAgcE1hcmtlckluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwqICAgcE1hcmtlckluZm8pIHsKKyAgICBTdGFydFJlYWRPYmplY3QoY29tbWFuZEJ1ZmZlcik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwqICAgcE1hcmtlckluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiAgICAgICBwT3ZlcnJpZGVJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogICAgICAgcE92ZXJyaWRlSW5mbywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3QoY29tbWFuZEJ1ZmZlcik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCogcEFjcXVpcmVJbmZvLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwqICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24pIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChjb25maWd1cmF0aW9uKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3QoY29uZmlndXJhdGlvbik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbikgeworICAgIFN0YXJ0UmVhZE9iamVjdChxdWV1ZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KGNvbmZpZ3VyYXRpb24pOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAgICAgICAgICAgICBjb25maWd1cmF0aW9uLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdChxdWV1ZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChjb25maWd1cmF0aW9uKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwgICAgICAgICAgICAgcGFyYW1ldGVyLAorICAgIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiAgICAgICAgICAgICAgICAgICAgcFZhbHVlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMICAgICAgICAgICAgIHBhcmFtZXRlciwKKyAgICBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCogICAgICAgICAgICAgICAgICAgIHBWYWx1ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KHN3YXBDaGFpbik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3Qoc3dhcENoYWluKTsKK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcFN1cmZhY2UpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZENyZWF0ZU1ldGFsU3VyZmFjZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZU1ldGFsU3VyZmFjZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBDcmVhdGVPYmplY3RQYXJlbnRJbnN0YW5jZSgqcFN1cmZhY2UpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvLAorICAgIFZrRGV2aWNlQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFJlYWRPYmplY3Qoc3dhcGNoYWluKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChzd2FwY2hhaW4pOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRSZWFkT2JqZWN0KHN3YXBjaGFpbik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFJlYWRPYmplY3Qoc3dhcGNoYWluKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqICAgICAgcFN1cmZhY2VJbmZvLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgQ3JlYXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoKnBTdXJmYWNlKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVN0aXBwbGVFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0aXBwbGVGYWN0b3IsCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZVBhdHRlcm4pIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRDbWRTZXRMaW5lU3RpcHBsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZUZhY3RvciwKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlUGF0dGVybikgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRCdWZmZXIpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFJlc2V0UXVlcnlQb29sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChxdWVyeVBvb2wpOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRSZXNldFF1ZXJ5UG9vbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoUmVhZE9iamVjdChxdWVyeVBvb2wpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC90aHJlYWRfc2FmZXR5LmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3RocmVhZF9zYWZldHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM0YWZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC90aHJlYWRfc2FmZXR5LmgKQEAgLTAsMCArMSw0MzkwIEBACisKKy8vIFRoaXMgZmlsZSBpcyAqKipHRU5FUkFURUQqKiouICBEbyBOb3QgRWRpdC4KKy8vIFNlZSB0aHJlYWRfc2FmZXR5X2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucy4KKworLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9QSE9OWV9IQU5ETEUpCisvLyBUaGUgZm9sbG93aW5nIGxpbmUgbXVzdCBtYXRjaCB0aGUgdnVsa2FuX2NvcmUuaCBjb25kaXRpb24gZ3VhcmRpbmcgVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFCisjaWYgZGVmaW5lZChfX0xQNjRfXykgfHwgZGVmaW5lZChfV0lONjQpIHx8IChkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKF9fSUxQMzJfXykpIHx8IGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9faWE2NCkgfHwgICAgIGRlZmluZWQoX01fSUE2NCkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorLy8gSWYgcG9pbnRlcnMgYXJlIDY0LWJpdCwgdGhlbiB0aGVyZSBjYW4gYmUgc2VwYXJhdGUgY291bnRlcnMgZm9yIGVhY2gKKy8vIE5PTkRJU1BBVENIQUJMRV9IQU5ETEUgdHlwZS4gIE90aGVyd2lzZSB0aGV5IGFyZSBhbGwgdHlwZWRlZiB1aW50NjRfdC4KKyNkZWZpbmUgRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKKy8vIE1ha2Ugc3VyZSB3ZSBjYXRjaCBhbnkgZGlzYWdyZWVtZW50IGJldHdlZW4gdXMgYW5kIHRoZSB2dWxrYW4gZGVmaW5pdGlvbgorc3RhdGljX2Fzc2VydChzdGQ6OmlzX3BvaW50ZXI8RElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX1BIT05ZX0hBTkRMRT46OnZhbHVlLAorICAgICAgICAgICAgICAiTWlzbWF0Y2hlZCBub24tZGlzcGF0Y2hhYmxlIGhhbmRsZSBoYW5kbGUsIGV4cGVjdGVkIHBvaW50ZXIgdHlwZS4iKTsKKyNlbHNlCisvLyBNYWtlIHN1cmUgd2UgY2F0Y2ggYW55IGRpc2FncmVlbWVudCBiZXR3ZWVuIHVzIGFuZCB0aGUgdnVsa2FuIGRlZmluaXRpb24KK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPHVpbnQ2NF90LCBESVNUSU5DVF9OT05ESVNQQVRDSEFCTEVfUEhPTllfSEFORExFPjo6dmFsdWUsCisgICAgICAgICAgICAgICJNaXNtYXRjaGVkIG5vbi1kaXNwYXRjaGFibGUgaGFuZGxlIGhhbmRsZSwgZXhwZWN0ZWQgdWludDY0X3QuIik7CisjZW5kaWYKKworLy8gU3VwcHJlc3MgdW51c2VkIHdhcm5pbmcgb24gTGludXgKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBERUNPUkFURV9VTlVTRUQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIERFQ09SQVRFX1VOVVNFRAorI2VuZGlmCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfVGhyZWFkaW5nX0luZm8gPSAiVU5BU1NJR05FRC1UaHJlYWRpbmctSW5mbyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX1RocmVhZGluZ19NdWx0aXBsZVRocmVhZHMgPSAiVU5BU1NJR05FRC1UaHJlYWRpbmctTXVsdGlwbGVUaHJlYWRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfVGhyZWFkaW5nX1NpbmdsZVRocmVhZFJldXNlID0gIlVOQVNTSUdORUQtVGhyZWFkaW5nLVNpbmdsZVRocmVhZFJldXNlIjsKKy8vIGNsYW5nLWZvcm1hdCBvbgorCisjdW5kZWYgREVDT1JBVEVfVU5VU0VECisKK2NsYXNzIE9iamVjdFVzZURhdGEKK3sKK3B1YmxpYzoKKyAgICBjbGFzcyBXcml0ZVJlYWRDb3VudAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdyaXRlUmVhZENvdW50KGludDY0X3QgdikgOiBjb3VudCh2KSB7fQorCisgICAgICAgIGludDMyX3QgR2V0UmVhZENvdW50KCkgY29uc3QgeyByZXR1cm4gKGludDMyX3QpKGNvdW50ICYgMHhGRkZGRkZGRik7IH0KKyAgICAgICAgaW50MzJfdCBHZXRXcml0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gKGludDMyX3QpKGNvdW50ID4+IDMyKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50NjRfdCBjb3VudDsKKyAgICB9OworCisgICAgT2JqZWN0VXNlRGF0YSgpIDogdGhyZWFkKDApLCB3cml0ZXJfcmVhZGVyX2NvdW50KDApIHsKKyAgICAgICAgLy8gc2lsZW5jZSAtV3VudXNlZC1wcml2YXRlLWZpZWxkIHdhcm5pbmcKKyAgICAgICAgcGFkZGluZ1swXSA9IDA7CisgICAgfQorCisgICAgV3JpdGVSZWFkQ291bnQgQWRkV3JpdGVyKCkgeworICAgICAgICBpbnQ2NF90IHByZXYgPSB3cml0ZXJfcmVhZGVyX2NvdW50LmZldGNoX2FkZCgxVUxMIDw8IDMyKTsKKyAgICAgICAgcmV0dXJuIFdyaXRlUmVhZENvdW50KHByZXYpOworICAgIH0KKyAgICBXcml0ZVJlYWRDb3VudCBBZGRSZWFkZXIoKSB7CisgICAgICAgIGludDY0X3QgcHJldiA9IHdyaXRlcl9yZWFkZXJfY291bnQuZmV0Y2hfYWRkKDFVTEwpOworICAgICAgICByZXR1cm4gV3JpdGVSZWFkQ291bnQocHJldik7CisgICAgfQorICAgIFdyaXRlUmVhZENvdW50IFJlbW92ZVdyaXRlcigpIHsKKyAgICAgICAgaW50NjRfdCBwcmV2ID0gd3JpdGVyX3JlYWRlcl9jb3VudC5mZXRjaF9hZGQoLSgxTEwgPDwgMzIpKTsKKyAgICAgICAgcmV0dXJuIFdyaXRlUmVhZENvdW50KHByZXYpOworICAgIH0KKyAgICBXcml0ZVJlYWRDb3VudCBSZW1vdmVSZWFkZXIoKSB7CisgICAgICAgIGludDY0X3QgcHJldiA9IHdyaXRlcl9yZWFkZXJfY291bnQuZmV0Y2hfYWRkKC0xTEwpOworICAgICAgICByZXR1cm4gV3JpdGVSZWFkQ291bnQocHJldik7CisgICAgfQorICAgIFdyaXRlUmVhZENvdW50IEdldENvdW50KCkgeworICAgICAgICByZXR1cm4gV3JpdGVSZWFkQ291bnQod3JpdGVyX3JlYWRlcl9jb3VudCk7CisgICAgfQorCisgICAgdm9pZCBXYWl0Rm9yT2JqZWN0SWRsZShib29sIGlzX3dyaXRlcikgIHsKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhyZWFkLXNhZmUgYWNjZXNzIHRvIG9iamVjdCBpbnN0ZWFkIG9mIHNraXBwaW5nIGNhbGwuCisgICAgICAgIHdoaWxlIChHZXRDb3VudCgpLkdldFJlYWRDb3VudCgpID4gKGludCkoIWlzX3dyaXRlcikgfHwgR2V0Q291bnQoKS5HZXRXcml0ZUNvdW50KCkgPiAoaW50KWlzX3dyaXRlcikgeworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMoMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjphdG9taWM8bG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pZD4gdGhyZWFkOworCitwcml2YXRlOgorICAgIC8vIG5lZWQgdG8gdXBkYXRlIHdyaXRlIGFuZCByZWFkIGNvdW50cyBhdG9taWNhbGx5LiBXcml0ZXIgaW4gaGlnaAorICAgIC8vIDMyIGJpdHMsIHJlYWRlciBpbiBsb3cgMzIgYml0cy4KKyAgICBzdGQ6OmF0b21pYzxpbnQ2NF90PiB3cml0ZXJfcmVhZGVyX2NvdW50OworCisgICAgLy8gUHV0IGVhY2ggbG9jayBvbiBpdHMgb3duIGNhY2hlIGxpbmUgdG8gYXZvaWQgZmFsc2UgY2FjaGUgbGluZSBzaGFyaW5nLgorICAgIGNoYXIgcGFkZGluZ1soLWludChzaXplb2Yoc3RkOjphdG9taWM8bG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pZD4pICsgc2l6ZW9mKHN0ZDo6YXRvbWljPGludDY0X3Q+KSkpICYgNjNdOworfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIGNvdW50ZXIgeworcHVibGljOgorICAgIGNvbnN0IGNoYXIgKnR5cGVOYW1lOworICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdFR5cGU7CisgICAgZGVidWdfcmVwb3J0X2RhdGEgKipyZXBvcnRfZGF0YTsKKworICAgIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcDxULCBzdGQ6OnNoYXJlZF9wdHI8T2JqZWN0VXNlRGF0YT4sIDY+IG9iamVjdF90YWJsZTsKKworICAgIHZvaWQgQ3JlYXRlT2JqZWN0KFQgb2JqZWN0KSB7CisgICAgICAgIG9iamVjdF90YWJsZS5pbnNlcnRfb3JfYXNzaWduKG9iamVjdCwgc3RkOjptYWtlX3NoYXJlZDxPYmplY3RVc2VEYXRhPigpKTsKKyAgICB9CisKKyAgICB2b2lkIERlc3Ryb3lPYmplY3QoVCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCkgeworICAgICAgICAgICAgb2JqZWN0X3RhYmxlLmVyYXNlKG9iamVjdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8T2JqZWN0VXNlRGF0YT4gRmluZE9iamVjdChUIG9iamVjdCkgeworICAgICAgICBhc3NlcnQob2JqZWN0X3RhYmxlLmNvbnRhaW5zKG9iamVjdCkpOworICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6Om1vdmUob2JqZWN0X3RhYmxlLmZpbmQob2JqZWN0KSk7CisgICAgICAgIGlmIChpdGVyICE9IG9iamVjdF90YWJsZS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShpdGVyLT5zZWNvbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nX21zZygqcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RUeXBlLCAodWludDY0X3QpKG9iamVjdCksIGtWVUlEX1RocmVhZGluZ19JbmZvLAorICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCAlcyBPYmplY3QgMHglIiBQUkl4TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAiLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGFuZCBtYXkgaW5kaWNhdGUgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgIG9iamVjdF9zdHJpbmdbb2JqZWN0VHlwZV0sICh1aW50NjRfdCkob2JqZWN0KSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgU3RhcnRXcml0ZShUIG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaWQgdGlkID0gbG9hZGVyX3BsYXRmb3JtX2dldF90aHJlYWRfaWQoKTsKKworICAgICAgICBhdXRvIHVzZV9kYXRhID0gRmluZE9iamVjdChvYmplY3QpOworICAgICAgICBpZiAoIXVzZV9kYXRhKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgT2JqZWN0VXNlRGF0YTo6V3JpdGVSZWFkQ291bnQgcHJldkNvdW50ID0gdXNlX2RhdGEtPkFkZFdyaXRlcigpOworCisgICAgICAgIGlmIChwcmV2Q291bnQuR2V0UmVhZENvdW50KCkgPT0gMCAmJiBwcmV2Q291bnQuR2V0V3JpdGVDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGN1cnJlbnQgdXNlIG9mIHRoZSBvYmplY3QuICBSZWNvcmQgd3JpdGVyIHRocmVhZC4KKyAgICAgICAgICAgIHVzZV9kYXRhLT50aHJlYWQgPSB0aWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocHJldkNvdW50LkdldFJlYWRDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQocHJldkNvdW50LkdldFdyaXRlQ291bnQoKSAhPSAwKTsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gcmVhZGVycy4gIFR3byB3cml0ZXJzIGp1c3QgY29sbGlkZWQuCisgICAgICAgICAgICAgICAgaWYgKHVzZV9kYXRhLT50aHJlYWQgIT0gdGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygqcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RUeXBlLCAodWludDY0X3QpKG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9UaHJlYWRpbmdfTXVsdGlwbGVUaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRIUkVBRElORyBFUlJPUiA6IG9iamVjdCBvZiB0eXBlICVzIGlzIHNpbXVsdGFuZW91c2x5IHVzZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCAweCUiIFBSSXg2NCAiIGFuZCB0aHJlYWQgMHglIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZSwgKHVpbnQ2NF90KXVzZV9kYXRhLT50aHJlYWQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSwgKHVpbnQ2NF90KXRpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChza2lwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aHJlYWQtc2FmZSBhY2Nlc3MgdG8gb2JqZWN0IGluc3RlYWQgb2Ygc2tpcHBpbmcgY2FsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9kYXRhLT5XYWl0Rm9yT2JqZWN0SWRsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vdyBubyBjdXJyZW50IHVzZSBvZiB0aGUgb2JqZWN0LiAgUmVjb3JkIHdyaXRlciB0aHJlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZGF0YS0+dGhyZWFkID0gdGlkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm93IG5vIGN1cnJlbnQgdXNlIG9mIHRoZSBvYmplY3QuICBSZWNvcmQgd3JpdGVyIHRocmVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9kYXRhLT50aHJlYWQgPSB0aWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGVpdGhlciBzYWZlIG11bHRpcGxlIHVzZSBpbiBvbmUgY2FsbCwgb3IgcmVjdXJzaXZlIHVzZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIG1ha2UgcmVjdXJzaW9uIHNhZmUuICBKdXN0IGZvcmdlIGFoZWFkLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHJlYWRlcnMuICBUaGlzIHdyaXRlciBjb2xsaWRlZCB3aXRoIHRoZW0uCisgICAgICAgICAgICAgICAgaWYgKHVzZV9kYXRhLT50aHJlYWQgIT0gdGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygqcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RUeXBlLCAodWludDY0X3QpKG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9UaHJlYWRpbmdfTXVsdGlwbGVUaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRIUkVBRElORyBFUlJPUiA6IG9iamVjdCBvZiB0eXBlICVzIGlzIHNpbXVsdGFuZW91c2x5IHVzZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCAweCUiIFBSSXg2NCAiIGFuZCB0aHJlYWQgMHglIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZSwgKHVpbnQ2NF90KXVzZV9kYXRhLT50aHJlYWQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSwgKHVpbnQ2NF90KXRpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChza2lwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aHJlYWQtc2FmZSBhY2Nlc3MgdG8gb2JqZWN0IGluc3RlYWQgb2Ygc2tpcHBpbmcgY2FsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9kYXRhLT5XYWl0Rm9yT2JqZWN0SWRsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vdyBubyBjdXJyZW50IHVzZSBvZiB0aGUgb2JqZWN0LiAgUmVjb3JkIHdyaXRlciB0aHJlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZGF0YS0+dGhyZWFkID0gdGlkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgd2l0aCBhbiB1bnNhZmUgdXNlIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZGF0YS0+dGhyZWFkID0gdGlkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBlaXRoZXIgc2FmZSBtdWx0aXBsZSB1c2UgaW4gb25lIGNhbGwsIG9yIHJlY3Vyc2l2ZSB1c2UuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBtYWtlIHJlY3Vyc2lvbiBzYWZlLiAgSnVzdCBmb3JnZSBhaGVhZC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIEZpbmlzaFdyaXRlKFQgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBPYmplY3QgaXMgbm8gbG9uZ2VyIGluIHVzZQorICAgICAgICBhdXRvIHVzZV9kYXRhID0gRmluZE9iamVjdChvYmplY3QpOworICAgICAgICBpZiAoIXVzZV9kYXRhKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdXNlX2RhdGEtPlJlbW92ZVdyaXRlcigpOworICAgIH0KKworICAgIHZvaWQgU3RhcnRSZWFkKFQgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pZCB0aWQgPSBsb2FkZXJfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpOworCisgICAgICAgIGF1dG8gdXNlX2RhdGEgPSBGaW5kT2JqZWN0KG9iamVjdCk7CisgICAgICAgIGlmICghdXNlX2RhdGEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBPYmplY3RVc2VEYXRhOjpXcml0ZVJlYWRDb3VudCBwcmV2Q291bnQgPSB1c2VfZGF0YS0+QWRkUmVhZGVyKCk7CisKKyAgICAgICAgaWYgKHByZXZDb3VudC5HZXRSZWFkQ291bnQoKSA9PSAwICYmIHByZXZDb3VudC5HZXRXcml0ZUNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gY3VycmVudCB1c2Ugb2YgdGhlIG9iamVjdC4KKyAgICAgICAgICAgIHVzZV9kYXRhLT50aHJlYWQgPSB0aWQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJldkNvdW50LkdldFdyaXRlQ291bnQoKSA+IDAgJiYgdXNlX2RhdGEtPnRocmVhZCAhPSB0aWQpIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgd3JpdGVyIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coKnJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0VHlwZSwgKHVpbnQ2NF90KShvYmplY3QpLAorICAgICAgICAgICAgICAgIGtWVUlEX1RocmVhZGluZ19NdWx0aXBsZVRocmVhZHMsCisgICAgICAgICAgICAgICAgIlRIUkVBRElORyBFUlJPUiA6IG9iamVjdCBvZiB0eXBlICVzIGlzIHNpbXVsdGFuZW91c2x5IHVzZWQgaW4gIgorICAgICAgICAgICAgICAgICJ0aHJlYWQgMHglIiBQUkl4NjQgIiBhbmQgdGhyZWFkIDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgICAgIHR5cGVOYW1lLCAodWludDY0X3QpdXNlX2RhdGEtPnRocmVhZC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpLCAodWludDY0X3QpdGlkKTsKKyAgICAgICAgICAgIGlmIChza2lwKSB7CisgICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhyZWFkLXNhZmUgYWNjZXNzIHRvIG9iamVjdCBpbnN0ZWFkIG9mIHNraXBwaW5nIGNhbGwuCisgICAgICAgICAgICAgICAgdXNlX2RhdGEtPldhaXRGb3JPYmplY3RJZGxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB1c2VfZGF0YS0+dGhyZWFkID0gdGlkOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG90aGVyIHJlYWRlcnMgb2YgdGhlIG9iamVjdC4KKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIEZpbmlzaFJlYWQoVCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXV0byB1c2VfZGF0YSA9IEZpbmRPYmplY3Qob2JqZWN0KTsKKyAgICAgICAgaWYgKCF1c2VfZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHVzZV9kYXRhLT5SZW1vdmVSZWFkZXIoKTsKKyAgICB9CisgICAgY291bnRlcihjb25zdCBjaGFyICpuYW1lID0gIiIsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIHR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIGRlYnVnX3JlcG9ydF9kYXRhICoqcmVwX2RhdGEgPSBudWxscHRyKSB7CisgICAgICAgIHR5cGVOYW1lID0gbmFtZTsKKyAgICAgICAgb2JqZWN0VHlwZSA9IHR5cGU7CisgICAgICAgIHJlcG9ydF9kYXRhID0gcmVwX2RhdGE7CisgICAgfQorCitwcml2YXRlOgorfTsKKworY2xhc3MgVGhyZWFkU2FmZXR5IDogcHVibGljIFZhbGlkYXRpb25PYmplY3QgeworcHVibGljOgorCisgICAgUmVhZFdyaXRlTG9jayB0aHJlYWRfc2FmZXR5X2xvY2s7CisKKyAgICAvLyBPdmVycmlkZSBjaGFzc2lzIHJlYWQvd3JpdGUgbG9ja3MgZm9yIHRoaXMgdmFsaWRhdGlvbiBvYmplY3QKKyAgICAvLyBUaGlzIG92ZXJyaWRlIHRha2VzIGEgZGVmZXJyZWQgbG9jay4gaS5lLiBpdCBpcyBub3QgYWNxdWlyZWQuCisgICAgdmlydHVhbCByZWFkX2xvY2tfZ3VhcmRfdCByZWFkX2xvY2soKSB7CisgICAgICAgIHJldHVybiByZWFkX2xvY2tfZ3VhcmRfdCh2YWxpZGF0aW9uX29iamVjdF9tdXRleCwgc3RkOjpkZWZlcl9sb2NrKTsKKyAgICB9CisgICAgdmlydHVhbCB3cml0ZV9sb2NrX2d1YXJkX3Qgd3JpdGVfbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIHdyaXRlX2xvY2tfZ3VhcmRfdCh2YWxpZGF0aW9uX29iamVjdF9tdXRleCwgc3RkOjpkZWZlcl9sb2NrKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIFRocmVhZFNhZmV0eSBpcyBmb3IgYSBWa0RldmljZSwgdGhlbiBwYXJlbnRfaW5zdGFuY2UgcG9pbnRzIHRvIHRoZQorICAgIC8vIFRocmVhZFNhZmV0eSBvYmplY3Qgb2YgaXRzIHBhcmVudCBWa0luc3RhbmNlLiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRvIHRoZSBjb3VudGVycworICAgIC8vIGZvciBvYmplY3RzIGNyZWF0ZWQgd2l0aCB0aGUgaW5zdGFuY2UgYXMgcGFyZW50LgorICAgIFRocmVhZFNhZmV0eSAqcGFyZW50X2luc3RhbmNlOworCisgICAgdmxfY29uY3VycmVudF91bm9yZGVyZWRfbWFwPFZrQ29tbWFuZEJ1ZmZlciwgVmtDb21tYW5kUG9vbCwgNj4gY29tbWFuZF9wb29sX21hcDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtDb21tYW5kUG9vbCwgc3RkOjp1bm9yZGVyZWRfc2V0PFZrQ29tbWFuZEJ1ZmZlcj4+IHBvb2xfY29tbWFuZF9idWZmZXJzX21hcDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtEZXZpY2UsIHN0ZDo6dW5vcmRlcmVkX3NldDxWa1F1ZXVlPj4gZGV2aWNlX3F1ZXVlc19tYXA7CisKKyAgICAvLyBUcmFjayBwZXItZGVzY3JpcHRvcnNldGxheW91dCBhbmQgcGVyLWRlc2NyaXB0b3JzZXQgd2hldGhlciBVUERBVEVfQUZURVJfQklORCBpcyB1c2VkLgorICAgIC8vIFRoaXMgaXMgdXNlZCB0byAoc2xvcHBpbHkpIGltcGxlbWVudCB0aGUgcmVsYXhlZCBleHRlcm5zeW5jIHJ1bGVzIGZvciBVUERBVEVfQUZURVJfQklORAorICAgIC8vIGRlc2NyaXB0b3JzLiBXZSBtb2RlbCB1cGRhdGVzIG9mIFVQREFURV9BRlRFUl9CSU5EIGRlc2NyaXB0b3JzIGFzIGlmIHRoZXkgd2VyZSByZWFkcworICAgIC8vIHJhdGhlciB0aGFuIHdyaXRlcywgYmVjYXVzZSB0aGV5IG9ubHkgY29uZmxpY3Qgd2l0aCB0aGUgc2V0IGJlaW5nIGZyZWVkIG9yIHJlc2V0LgorICAgIC8vCisgICAgLy8gV2UgZG9uJ3QgdHJhY2sgdGhlIFVQREFURV9BRlRFUl9CSU5EIHN0YXRlIHBlci1iaW5kaW5nIGZvciBhIGNvdXBsZSByZWFzb25zOgorICAgIC8vICgxKSBXZSBvbmx5IGhhdmUgb25lIGNvdW50ZXIgcGVyIG9iamVjdCwgYW5kIGlmIHdlIHRyZWF0ZWQgbm9uLVVBQiBhcyB3cml0ZXMKKyAgICAvLyAgICAgYW5kIFVBQiBhcyByZWFkcyB0aGVuIHRoZXknZCBhcHBlYXIgdG8gY29uZmxpY3Qgd2l0aCBlYWNoIG90aGVyLgorICAgIC8vICgyKSBBdm9pZCBhZGRpdGlvbmFsIHRyYWNraW5nIG9mIGRlc2NyaXB0b3IgYmluZGluZyBzdGF0ZSBpbiB0aGUgZGVzY3JpcHRvciBzZXQKKyAgICAvLyAgICAgbGF5b3V0LCBhbmQgdHJhY2tpbmcgb2Ygd2hpY2ggYmluZGluZ3MgYXJlIGFjY2Vzc2VkIGJ5IGEgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUuCisgICAgdmxfY29uY3VycmVudF91bm9yZGVyZWRfbWFwPFZrRGVzY3JpcHRvclNldExheW91dCwgYm9vbCwgND4gZHNsX3VwZGF0ZV9hZnRlcl9iaW5kX21hcDsKKyAgICB2bF9jb25jdXJyZW50X3Vub3JkZXJlZF9tYXA8VmtEZXNjcmlwdG9yU2V0LCBib29sLCA2PiBkc191cGRhdGVfYWZ0ZXJfYmluZF9tYXA7CisgICAgYm9vbCBEc1VwZGF0ZUFmdGVyQmluZChWa0Rlc2NyaXB0b3JTZXQpIGNvbnN0OworCisgICAgY291bnRlcjxWa0NvbW1hbmRCdWZmZXI+IGNfVmtDb21tYW5kQnVmZmVyOworICAgIGNvdW50ZXI8VmtEZXZpY2U+IGNfVmtEZXZpY2U7CisgICAgY291bnRlcjxWa0luc3RhbmNlPiBjX1ZrSW5zdGFuY2U7CisgICAgY291bnRlcjxWa1F1ZXVlPiBjX1ZrUXVldWU7CisjaWZkZWYgRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKKworICAgIC8vIFNwZWNpYWwgZW50cnkgdG8gYWxsb3cgdHJhY2tpbmcgb2YgY29tbWFuZCBwb29sIFJlc2V0IGFuZCBEZXN0cm95CisgICAgY291bnRlcjxWa0NvbW1hbmRQb29sPiBjX1ZrQ29tbWFuZFBvb2xDb250ZW50czsKKyAgICBjb3VudGVyPFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+IGNfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICBjb3VudGVyPFZrQnVmZmVyPiBjX1ZrQnVmZmVyOworICAgIGNvdW50ZXI8VmtCdWZmZXJWaWV3PiBjX1ZrQnVmZmVyVmlldzsKKyAgICBjb3VudGVyPFZrQ29tbWFuZFBvb2w+IGNfVmtDb21tYW5kUG9vbDsKKyAgICBjb3VudGVyPFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVD4gY19Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisgICAgY291bnRlcjxWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQ+IGNfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgIGNvdW50ZXI8VmtEZXNjcmlwdG9yUG9vbD4gY19Wa0Rlc2NyaXB0b3JQb29sOworICAgIGNvdW50ZXI8VmtEZXNjcmlwdG9yU2V0PiBjX1ZrRGVzY3JpcHRvclNldDsKKyAgICBjb3VudGVyPFZrRGVzY3JpcHRvclNldExheW91dD4gY19Wa0Rlc2NyaXB0b3JTZXRMYXlvdXQ7CisgICAgY291bnRlcjxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZT4gY19Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICBjb3VudGVyPFZrRGV2aWNlTWVtb3J5PiBjX1ZrRGV2aWNlTWVtb3J5OworICAgIGNvdW50ZXI8VmtEaXNwbGF5S0hSPiBjX1ZrRGlzcGxheUtIUjsKKyAgICBjb3VudGVyPFZrRGlzcGxheU1vZGVLSFI+IGNfVmtEaXNwbGF5TW9kZUtIUjsKKyAgICBjb3VudGVyPFZrRXZlbnQ+IGNfVmtFdmVudDsKKyAgICBjb3VudGVyPFZrRmVuY2U+IGNfVmtGZW5jZTsKKyAgICBjb3VudGVyPFZrRnJhbWVidWZmZXI+IGNfVmtGcmFtZWJ1ZmZlcjsKKyAgICBjb3VudGVyPFZrSW1hZ2U+IGNfVmtJbWFnZTsKKyAgICBjb3VudGVyPFZrSW1hZ2VWaWV3PiBjX1ZrSW1hZ2VWaWV3OworICAgIGNvdW50ZXI8VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPiBjX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsKKyAgICBjb3VudGVyPFZrT2JqZWN0VGFibGVOVlg+IGNfVmtPYmplY3RUYWJsZU5WWDsKKyAgICBjb3VudGVyPFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw+IGNfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsKKyAgICBjb3VudGVyPFZrUGlwZWxpbmU+IGNfVmtQaXBlbGluZTsKKyAgICBjb3VudGVyPFZrUGlwZWxpbmVDYWNoZT4gY19Wa1BpcGVsaW5lQ2FjaGU7CisgICAgY291bnRlcjxWa1BpcGVsaW5lTGF5b3V0PiBjX1ZrUGlwZWxpbmVMYXlvdXQ7CisgICAgY291bnRlcjxWa1F1ZXJ5UG9vbD4gY19Wa1F1ZXJ5UG9vbDsKKyAgICBjb3VudGVyPFZrUmVuZGVyUGFzcz4gY19Wa1JlbmRlclBhc3M7CisgICAgY291bnRlcjxWa1NhbXBsZXI+IGNfVmtTYW1wbGVyOworICAgIGNvdW50ZXI8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uPiBjX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICBjb3VudGVyPFZrU2VtYXBob3JlPiBjX1ZrU2VtYXBob3JlOworICAgIGNvdW50ZXI8VmtTaGFkZXJNb2R1bGU+IGNfVmtTaGFkZXJNb2R1bGU7CisgICAgY291bnRlcjxWa1N1cmZhY2VLSFI+IGNfVmtTdXJmYWNlS0hSOworICAgIGNvdW50ZXI8VmtTd2FwY2hhaW5LSFI+IGNfVmtTd2FwY2hhaW5LSFI7CisgICAgY291bnRlcjxWa1ZhbGlkYXRpb25DYWNoZUVYVD4gY19Wa1ZhbGlkYXRpb25DYWNoZUVYVDsKKworCisjZWxzZSAgIC8vIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisgICAgLy8gU3BlY2lhbCBlbnRyeSB0byBhbGxvdyB0cmFja2luZyBvZiBjb21tYW5kIHBvb2wgUmVzZXQgYW5kIERlc3Ryb3kKKyAgICBjb3VudGVyPHVpbnQ2NF90PiBjX1ZrQ29tbWFuZFBvb2xDb250ZW50czsKKworICAgIGNvdW50ZXI8dWludDY0X3Q+IGNfdWludDY0X3Q7CisjZW5kaWYgIC8vIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisKKyAgICBUaHJlYWRTYWZldHkoVGhyZWFkU2FmZXR5ICpwYXJlbnQpCisgICAgICAgIDogcGFyZW50X2luc3RhbmNlKHBhcmVudCksCisgICAgICAgICAgY19Wa0NvbW1hbmRCdWZmZXIoIlZrQ29tbWFuZEJ1ZmZlciIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0RldmljZSgiVmtEZXZpY2UiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrSW5zdGFuY2UoIlZrSW5zdGFuY2UiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtRdWV1ZSgiVmtRdWV1ZSIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0NvbW1hbmRQb29sQ29udGVudHMoIlZrQ29tbWFuZFBvb2wiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MX0VYVCwgJnJlcG9ydF9kYXRhKSwKKworI2lmZGVmIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisgICAgICAgICAgY19Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlZfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtCdWZmZXIoIlZrQnVmZmVyIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0J1ZmZlclZpZXcoIlZrQnVmZmVyVmlldyIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfVklFV19FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0NvbW1hbmRQb29sKCJWa0NvbW1hbmRQb29sIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTF9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoIlZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKCJWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0Rlc2NyaXB0b3JQb29sKCJWa0Rlc2NyaXB0b3JQb29sIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0Rlc2NyaXB0b3JTZXQoIlZrRGVzY3JpcHRvclNldCIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0Rlc2NyaXB0b3JTZXRMYXlvdXQoIlZrRGVzY3JpcHRvclNldExheW91dCIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoIlZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrRGV2aWNlTWVtb3J5KCJWa0RldmljZU1lbW9yeSIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrRGlzcGxheUtIUigiVmtEaXNwbGF5S0hSIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrRGlzcGxheU1vZGVLSFIoIlZrRGlzcGxheU1vZGVLSFIiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUl9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0V2ZW50KCJWa0V2ZW50IiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VWRU5UX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrRmVuY2UoIlZrRmVuY2UiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtGcmFtZWJ1ZmZlcigiVmtGcmFtZWJ1ZmZlciIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa0ltYWdlKCJWa0ltYWdlIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrSW1hZ2VWaWV3KCJWa0ltYWdlVmlldyIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgiVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlhfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtPYmplY3RUYWJsZU5WWCgiVmtPYmplY3RUYWJsZU5WWCIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoIlZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa1BpcGVsaW5lKCJWa1BpcGVsaW5lIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrUGlwZWxpbmVDYWNoZSgiVmtQaXBlbGluZUNhY2hlIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrUGlwZWxpbmVMYXlvdXQoIlZrUGlwZWxpbmVMYXlvdXQiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrUXVlcnlQb29sKCJWa1F1ZXJ5UG9vbCIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVSWV9QT09MX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrUmVuZGVyUGFzcygiVmtSZW5kZXJQYXNzIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrU2FtcGxlcigiVmtTYW1wbGVyIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKCJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24iLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrU2VtYXBob3JlKCJWa1NlbWFwaG9yZSIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtTaGFkZXJNb2R1bGUoIlZrU2hhZGVyTW9kdWxlIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtTdXJmYWNlS0hSKCJWa1N1cmZhY2VLSFIiLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFJfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtTd2FwY2hhaW5LSFIoIlZrU3dhcGNoYWluS0hSIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtWYWxpZGF0aW9uQ2FjaGVFWFQoIlZrVmFsaWRhdGlvbkNhY2hlRVhUIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhULCAmcmVwb3J0X2RhdGEpCisKKworI2Vsc2UgICAvLyBESVNUSU5DVF9OT05ESVNQQVRDSEFCTEVfSEFORExFUworICAgICAgICAgIGNfdWludDY0X3QoIk5PTl9ESVNQQVRDSEFCTEVfSEFORExFIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAmcmVwb3J0X2RhdGEpCisjZW5kaWYgIC8vIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisgICAgICAgICAgICAgIHt9OworCisjZGVmaW5lIFdSQVBQRVIodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBTdGFydFdyaXRlT2JqZWN0KHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNfIyN0eXBlLlN0YXJ0V3JpdGUob2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBGaW5pc2hXcml0ZU9iamVjdCh0eXBlIG9iamVjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNfIyN0eXBlLkZpbmlzaFdyaXRlKG9iamVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBTdGFydFJlYWRPYmplY3QodHlwZSBvYmplY3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNfIyN0eXBlLlN0YXJ0UmVhZChvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBGaW5pc2hSZWFkT2JqZWN0KHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNfIyN0eXBlLkZpbmlzaFJlYWQob2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBDcmVhdGVPYmplY3QodHlwZSBvYmplY3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNfIyN0eXBlLkNyZWF0ZU9iamVjdChvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBEZXN0cm95T2JqZWN0KHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNfIyN0eXBlLkRlc3Ryb3lPYmplY3Qob2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIFdSQVBQRVJfUEFSRU5UX0lOU1RBTkNFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgU3RhcnRXcml0ZU9iamVjdFBhcmVudEluc3RhbmNlKHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHBhcmVudF9pbnN0YW5jZSA/IHBhcmVudF9pbnN0YW5jZSA6IHRoaXMpLT5jXyMjdHlwZS5TdGFydFdyaXRlKG9iamVjdCk7ICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgRmluaXNoV3JpdGVPYmplY3RQYXJlbnRJbnN0YW5jZSh0eXBlIG9iamVjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHBhcmVudF9pbnN0YW5jZSA/IHBhcmVudF9pbnN0YW5jZSA6IHRoaXMpLT5jXyMjdHlwZS5GaW5pc2hXcml0ZShvYmplY3QpOyAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UodHlwZSBvYmplY3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHBhcmVudF9pbnN0YW5jZSA/IHBhcmVudF9pbnN0YW5jZSA6IHRoaXMpLT5jXyMjdHlwZS5TdGFydFJlYWQob2JqZWN0KTsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHBhcmVudF9pbnN0YW5jZSA/IHBhcmVudF9pbnN0YW5jZSA6IHRoaXMpLT5jXyMjdHlwZS5GaW5pc2hSZWFkKG9iamVjdCk7ICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgQ3JlYXRlT2JqZWN0UGFyZW50SW5zdGFuY2UodHlwZSBvYmplY3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHBhcmVudF9pbnN0YW5jZSA/IHBhcmVudF9pbnN0YW5jZSA6IHRoaXMpLT5jXyMjdHlwZS5DcmVhdGVPYmplY3Qob2JqZWN0KTsgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgRGVzdHJveU9iamVjdFBhcmVudEluc3RhbmNlKHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHBhcmVudF9pbnN0YW5jZSA/IHBhcmVudF9pbnN0YW5jZSA6IHRoaXMpLT5jXyMjdHlwZS5EZXN0cm95T2JqZWN0KG9iamVjdCk7ICAgICBcCisgICAgfQorCitXUkFQUEVSX1BBUkVOVF9JTlNUQU5DRShWa0RldmljZSkKK1dSQVBQRVJfUEFSRU5UX0lOU1RBTkNFKFZrSW5zdGFuY2UpCitXUkFQUEVSKFZrUXVldWUpCisjaWZkZWYgRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKK1dSQVBQRVIoVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikKK1dSQVBQRVIoVmtCdWZmZXIpCitXUkFQUEVSKFZrQnVmZmVyVmlldykKK1dSQVBQRVIoVmtDb21tYW5kUG9vbCkKK1dSQVBQRVJfUEFSRU5UX0lOU1RBTkNFKFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCkKK1dSQVBQRVJfUEFSRU5UX0lOU1RBTkNFKFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCkKK1dSQVBQRVIoVmtEZXNjcmlwdG9yUG9vbCkKK1dSQVBQRVIoVmtEZXNjcmlwdG9yU2V0KQorV1JBUFBFUihWa0Rlc2NyaXB0b3JTZXRMYXlvdXQpCitXUkFQUEVSKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKQorV1JBUFBFUihWa0RldmljZU1lbW9yeSkKK1dSQVBQRVIoVmtEaXNwbGF5S0hSKQorV1JBUFBFUihWa0Rpc3BsYXlNb2RlS0hSKQorV1JBUFBFUihWa0V2ZW50KQorV1JBUFBFUihWa0ZlbmNlKQorV1JBUFBFUihWa0ZyYW1lYnVmZmVyKQorV1JBUFBFUihWa0ltYWdlKQorV1JBUFBFUihWa0ltYWdlVmlldykKK1dSQVBQRVIoVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKQorV1JBUFBFUihWa09iamVjdFRhYmxlTlZYKQorV1JBUFBFUihWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKQorV1JBUFBFUihWa1BpcGVsaW5lKQorV1JBUFBFUihWa1BpcGVsaW5lQ2FjaGUpCitXUkFQUEVSKFZrUGlwZWxpbmVMYXlvdXQpCitXUkFQUEVSKFZrUXVlcnlQb29sKQorV1JBUFBFUihWa1JlbmRlclBhc3MpCitXUkFQUEVSKFZrU2FtcGxlcikKK1dSQVBQRVIoVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKQorV1JBUFBFUihWa1NlbWFwaG9yZSkKK1dSQVBQRVIoVmtTaGFkZXJNb2R1bGUpCitXUkFQUEVSX1BBUkVOVF9JTlNUQU5DRShWa1N1cmZhY2VLSFIpCitXUkFQUEVSKFZrU3dhcGNoYWluS0hSKQorV1JBUFBFUihWa1ZhbGlkYXRpb25DYWNoZUVYVCkKKworCisjZWxzZSAgIC8vIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCitXUkFQUEVSKHVpbnQ2NF90KQorV1JBUFBFUl9QQVJFTlRfSU5TVEFOQ0UodWludDY0X3QpCisjZW5kaWYgIC8vIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisKKyAgICB2b2lkIENyZWF0ZU9iamVjdChWa0NvbW1hbmRCdWZmZXIgb2JqZWN0KSB7CisgICAgICAgIGNfVmtDb21tYW5kQnVmZmVyLkNyZWF0ZU9iamVjdChvYmplY3QpOworICAgIH0KKyAgICB2b2lkIERlc3Ryb3lPYmplY3QoVmtDb21tYW5kQnVmZmVyIG9iamVjdCkgeworICAgICAgICBjX1ZrQ29tbWFuZEJ1ZmZlci5EZXN0cm95T2JqZWN0KG9iamVjdCk7CisgICAgfQorCisgICAgLy8gVmtDb21tYW5kQnVmZmVyIG5lZWRzIGNoZWNrIGZvciBpbXBsaWNpdCB1c2Ugb2YgY29tbWFuZCBwb29sCisgICAgdm9pZCBTdGFydFdyaXRlT2JqZWN0KFZrQ29tbWFuZEJ1ZmZlciBvYmplY3QsIGJvb2wgbG9ja1Bvb2wgPSB0cnVlKSB7CisgICAgICAgIGlmIChsb2NrUG9vbCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gY29tbWFuZF9wb29sX21hcC5maW5kKG9iamVjdCk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBjb21tYW5kX3Bvb2xfbWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmtDb21tYW5kUG9vbCBwb29sID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QocG9vbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY19Wa0NvbW1hbmRCdWZmZXIuU3RhcnRXcml0ZShvYmplY3QpOworICAgIH0KKyAgICB2b2lkIEZpbmlzaFdyaXRlT2JqZWN0KFZrQ29tbWFuZEJ1ZmZlciBvYmplY3QsIGJvb2wgbG9ja1Bvb2wgPSB0cnVlKSB7CisgICAgICAgIGNfVmtDb21tYW5kQnVmZmVyLkZpbmlzaFdyaXRlKG9iamVjdCk7CisgICAgICAgIGlmIChsb2NrUG9vbCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gY29tbWFuZF9wb29sX21hcC5maW5kKG9iamVjdCk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBjb21tYW5kX3Bvb2xfbWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmtDb21tYW5kUG9vbCBwb29sID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgICAgIEZpbmlzaFdyaXRlT2JqZWN0KHBvb2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgU3RhcnRSZWFkT2JqZWN0KFZrQ29tbWFuZEJ1ZmZlciBvYmplY3QpIHsKKyAgICAgICAgYXV0byBpdGVyID0gY29tbWFuZF9wb29sX21hcC5maW5kKG9iamVjdCk7CisgICAgICAgIGlmIChpdGVyICE9IGNvbW1hbmRfcG9vbF9tYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIFZrQ29tbWFuZFBvb2wgcG9vbCA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIC8vIFdlIHNldCB1cCBhIHJlYWQgZ3VhcmQgYWdhaW5zdCB0aGUgIkNvbnRlbnRzIiBjb3VudGVyIHRvIGNhdGNoIGNvbmZsaWN0IHZzLiB2a1Jlc2V0Q29tbWFuZFBvb2wgYW5kIHZrRGVzdHJveUNvbW1hbmRQb29sCisgICAgICAgICAgICAvLyB3aGlsZSAqbm90KiBlc3RhYmxpc2hpbmcgYSByZWFkIGd1YXJkIGFnYWluc3QgdGhlIGNvbW1hbmQgcG9vbCBjb3VudGVyIGl0c2VsZiB0byBhdm9pZCBmYWxzZSBwb3N0aXZlcyBmb3IKKyAgICAgICAgICAgIC8vIG5vbi1leHRlcm5hbGx5IHN5bmMnZCBjb21tYW5kIGJ1ZmZlcnMKKyAgICAgICAgICAgIGNfVmtDb21tYW5kUG9vbENvbnRlbnRzLlN0YXJ0UmVhZChwb29sKTsKKyAgICAgICAgfQorICAgICAgICBjX1ZrQ29tbWFuZEJ1ZmZlci5TdGFydFJlYWQob2JqZWN0KTsKKyAgICB9CisgICAgdm9pZCBGaW5pc2hSZWFkT2JqZWN0KFZrQ29tbWFuZEJ1ZmZlciBvYmplY3QpIHsKKyAgICAgICAgY19Wa0NvbW1hbmRCdWZmZXIuRmluaXNoUmVhZChvYmplY3QpOworICAgICAgICBhdXRvIGl0ZXIgPSBjb21tYW5kX3Bvb2xfbWFwLmZpbmQob2JqZWN0KTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gY29tbWFuZF9wb29sX21hcC5lbmQoKSkgeworICAgICAgICAgICAgVmtDb21tYW5kUG9vbCBwb29sID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgY19Wa0NvbW1hbmRQb29sQ29udGVudHMuRmluaXNoUmVhZChwb29sKTsKKyAgICAgICAgfQorICAgIH0gCisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUluc3RhbmNlKAorICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5zdGFuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUluc3RhbmNlKAorICAgIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5zdGFuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUluc3RhbmNlKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lJbnN0YW5jZSgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgVmtQaHlzaWNhbERldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXREZXZpY2VQcm9jQWRkcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOYW1lKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldERldmljZVByb2NBZGRyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5hbWUpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVEZXZpY2UoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXREZXZpY2VRdWV1ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUluZGV4LAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXgsCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpOworCit2b2lkIFByZUNhbGxSZWNvcmRRdWV1ZVN1Ym1pdCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0Q291bnQsCisgICAgY29uc3QgVmtTdWJtaXRJbmZvKiAgICAgICAgICAgICAgICAgICAgICAgICBwU3VibWl0cywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlU3VibWl0KAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qICAgICAgICAgICAgICAgICAgICAgICAgIHBTdWJtaXRzLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRRdWV1ZVdhaXRJZGxlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkUXVldWVXYWl0SWRsZSgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGV2aWNlV2FpdElkbGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGV2aWNlV2FpdElkbGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRBbGxvY2F0ZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlTWVtb3J5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRBbGxvY2F0ZU1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlTWVtb3J5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkTWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICBWa01lbW9yeU1hcEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBEYXRhKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZE1hcE1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgVmtNZW1vcnlNYXBGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB2b2lkKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwRGF0YSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFVubWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFVubWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMpOworCit2b2lkIFByZUNhbGxSZWNvcmRCaW5kQnVmZmVyTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU9mZnNldCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qICAgICAgICAgICAgICAgICAgICAgcEJpbmRJbmZvLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qICAgICAgICAgICAgICAgICAgICAgcEJpbmRJbmZvLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRSZXNldEZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFJlc2V0RmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRGZW5jZVN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldEZlbmNlU3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRXYWl0Rm9yRmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QWxsLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRXYWl0Rm9yRmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZXMsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QWxsLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2VtYXBob3JlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtFdmVudENyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RXZlbnRTdGF0dXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRFdmVudFN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRTZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkUmVzZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFJlc2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVF1ZXJ5UG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUXVlcnlQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXJ5UG9vbCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldFF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCisgICAgVmtRdWVyeVJlc3VsdEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlciwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lCdWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lCdWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0J1ZmZlclZpZXcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXJWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXJWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2UqICAgICAgICAgICAgICAgICAgIHBTdWJyZXNvdXJjZSwKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSogICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLAorICAgIFZrU3VicmVzb3VyY2VMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlVmlldyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlVmlldyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUltYWdlVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmlldywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTaGFkZXJNb2R1bGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGVyTW9kdWxlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NoYWRlck1vZHVsZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaGFkZXJNb2R1bGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2hhZGVyTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyTW9kdWxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2hhZGVyTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyTW9kdWxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVDYWNoZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVDYWNoZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lQ2FjaGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZE1lcmdlUGlwZWxpbmVDYWNoZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZE1lcmdlUGlwZWxpbmVDYWNoZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUxheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVyKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlciwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICBwU2V0TGF5b3V0KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICBwU2V0TGF5b3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclBvb2wpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yUG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclBvb2wsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkUmVzZXREZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkUmVzZXREZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkVXBkYXRlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yQ29waWVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JDb3B5Q291bnQsCisgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvckNvcGllcyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRnJhbWVidWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRnJhbWVidWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lYnVmZmVyLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRnJhbWVidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ZyYW1lYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtSZW5kZXJQYXNzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVuZGVyUGFzcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUmVuZGVyUGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldFJlbmRlckFyZWFHcmFudWxhcml0eSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1JlbmRlclBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MsCisgICAgVmtFeHRlbnQyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhbnVsYXJpdHkpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kUG9vbCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kUG9vbCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRSZXNldENvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRSZXNldENvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKiAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKiAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRnJlZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRnJlZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpOworCit2b2lkIFByZUNhbGxSZWNvcmRCZWdpbkNvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogICAgICAgICAgICAgcEJlZ2luSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRCZWdpbkNvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogICAgICAgICAgICAgcEJlZ2luSW5mbywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEVuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkUmVzZXRDb21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFJlc2V0Q29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmRQaXBlbGluZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEJpbmRQaXBlbGluZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0Vmlld3BvcnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtWaWV3cG9ydCogICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlld3BvcnRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldFZpZXdwb3J0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFNjaXNzb3IoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjaXNzb3JzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldFNjaXNzb3IoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjaXNzb3JzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVdpZHRoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRMaW5lV2lkdGgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdpZHRoKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RGVwdGhCaWFzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ2xhbXAsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNTbG9wZUZhY3Rvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXREZXB0aEJpYXMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEJpYXNDbGFtcCwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERlcHRoQm91bmRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldERlcHRoQm91bmRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRlcHRoQm91bmRzLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGVwdGhCb3VuZHMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFzayk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFzayk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFN0ZW5jaWxXcml0ZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1hc2spOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFdyaXRlTWFzaygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTWFzayk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFN0ZW5jaWxSZWZlcmVuY2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmREZXNjcmlwdG9yU2V0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY09mZnNldENvdW50LAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcER5bmFtaWNPZmZzZXRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEJpbmREZXNjcmlwdG9yU2V0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZUJpbmRQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY09mZnNldENvdW50LAorICAgIGNvbnN0IHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcER5bmFtaWNPZmZzZXRzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0luZGV4VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VHlwZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRCaW5kSW5kZXhCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrSW5kZXhUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhUeXBlKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQmluZFZlcnRleEJ1ZmZlcnMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRCaW5kVmVydGV4QnVmZmVycygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhdygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZlcnRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRHJhdygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZlcnRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleENvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXgsCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRleGVkKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERpc3BhdGNoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50Wik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWREaXNwYXRjaCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWREaXNwYXRjaEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRDb3B5QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQ29weSogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZENvcHlJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQmxpdCogICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zLAorICAgIFZrRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEJsaXRJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VCbGl0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMsCisgICAgVmtGaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5QnVmZmVyVG9JbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRDb3B5QnVmZmVyVG9JbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlJbWFnZVRvQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZENvcHlJbWFnZVRvQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSogICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kVXBkYXRlQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kVXBkYXRlQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRGaWxsQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEZpbGxCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRDbGVhckNvbG9ySW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSogICAgICAgICAgICAgICAgICAgIHBDb2xvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZENsZWFyQ29sb3JJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlKiAgICAgICAgICAgICAgICAgICAgcENvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogICAgICAgICAgICAgIHBSYW5nZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSogICAgICAgICAgICAgcERlcHRoU3RlbmNpbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQ2xlYXJBdHRhY2htZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50Q291bnQsCisgICAgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqICAgICAgICAgICAgICAgICAgICBwQXR0YWNobWVudHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Q291bnQsCisgICAgY29uc3QgVmtDbGVhclJlY3QqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQ2xlYXJBdHRhY2htZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50Q291bnQsCisgICAgY29uc3QgVmtDbGVhckF0dGFjaG1lbnQqICAgICAgICAgICAgICAgICAgICBwQXR0YWNobWVudHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Q291bnQsCisgICAgY29uc3QgVmtDbGVhclJlY3QqICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRSZXNvbHZlSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlUmVzb2x2ZSogICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFJlc29sdmVJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VSZXNvbHZlKiAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFJlc2V0RXZlbnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kUmVzZXRFdmVudCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzayk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFdhaXRFdmVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudCwKKyAgICBjb25zdCBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudHMsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFdhaXRFdmVudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudCwKKyAgICBjb25zdCBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudHMsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kUGlwZWxpbmVCYXJyaWVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICBWa0RlcGVuZGVuY3lGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kUGlwZWxpbmVCYXJyaWVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICBWa0RlcGVuZGVuY3lGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lGbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmVnaW5RdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFdyaXRlVGltZXN0YW1wKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RhZ2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRXcml0ZVRpbWVzdGFtcCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZVN0YWdlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJlZ2luUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgICAgICAgICAgICBwUmVuZGVyUGFzc0JlZ2luLAorICAgIFZrU3VicGFzc0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZE5leHRTdWJwYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZE5leHRTdWJwYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRFeGVjdXRlQ29tbWFuZHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEV4ZWN1dGVDb21tYW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpOworCit2b2lkIFByZUNhbGxSZWNvcmRCaW5kQnVmZmVyTWVtb3J5MigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiAgICAgICAgICAgICAgIHBCaW5kSW5mb3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qICAgICAgICAgICAgICAgIHBCaW5kSW5mb3MpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQmluZEltYWdlTWVtb3J5MigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiAgICAgICAgICAgICAgICBwQmluZEluZm9zLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERldmljZUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGV2aWNlSW5kZXgsCisgICAgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiAgICAgICAgICAgICAgICAgICBwUGVlck1lbW9yeUZlYXR1cmVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcEluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEZXZpY2VJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZURldmljZUluZGV4LAorICAgIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFncyogICAgICAgICAgICAgICAgICAgcFBlZXJNZW1vcnlGZWF0dXJlcyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldERldmljZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzayk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXREZXZpY2VNYXNrKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU1hc2spOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEJhc2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBaLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRaKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZERpc3BhdGNoQmFzZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopOworCit2b2lkIFByZUNhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiAgICAgICAgICAgIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBwSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFRyaW1Db21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkVHJpbUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldERldmljZVF1ZXVlMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUluZm8sCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlSW5mbywKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiAgICAgICAgICAgICAgICAgICBwWWNiY3JDb252ZXJzaW9uLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgeWNiY3JDb252ZXJzaW9uLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXQsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldCwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiAgICAgICAgICAgICAgIHBTdXBwb3J0KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0Jvb2wzMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VwcG9ydGVkLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0cywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2Rlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVN3YXBjaGFpbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW4sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldFN3YXBjaGFpbkltYWdlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICBWa0ltYWdlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRBY3F1aXJlTmV4dEltYWdlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiAgICAgICAgcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqICAgICAgICBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2Rlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiAgICAgICAgICAgcE1vZGVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0Q291bnQsCisgICAgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0Q291bnQsCisgICAgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdHMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRBY3F1aXJlTmV4dEltYWdlMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiAgICAgICAgICAgIHBBY3F1aXJlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2UyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqICAgICAgICAgICAgcEFjcXVpcmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlSW5kZXgsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5Q291bnQsCisgICAgVmtEaXNwbGF5S0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lSW5kZXgsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzcGxheUNvdW50LAorICAgIFZrRGlzcGxheUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc3BsYXlzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIqICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGlzcGxheU1vZGVLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEaXNwbGF5TW9kZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9kZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEaXNwbGF5TW9kZUtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rpc3BsYXlNb2RlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5TW9kZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5TW9kZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVJbmRleCwKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWlucyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluQ291bnQsCisgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiAgICAgICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVhsaWJTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlV2luMzJTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCit2b2lkIFByZUNhbGxSZWNvcmRHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGV2aWNlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXZpY2VJbmRleCwKKyAgICBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MqICAgICAgICAgICAgICAgICAgIHBQZWVyTWVtb3J5RmVhdHVyZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERldmljZUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGV2aWNlSW5kZXgsCisgICAgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiAgICAgICAgICAgICAgICAgICBwUGVlck1lbW9yeUZlYXR1cmVzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RGV2aWNlTWFza0tIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXNrKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldERldmljZU1hc2tLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFzayk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERpc3BhdGNoQmFzZUtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFopOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRGlzcGF0Y2hCYXNlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXBZLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwWiwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENvdW50Wik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFRyaW1Db21tYW5kUG9vbEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkVHJpbUNvbW1hbmRQb29sS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQ29tbWFuZFBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgVmtDb21tYW5kUG9vbFRyaW1GbGFncyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKKyAgICBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiogICAgICAgICAgIHBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKKyAgICBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiogICAgICAgICAgIHBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0TWVtb3J5RmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqICAgICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldE1lbW9yeUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgcEdldEZkSW5mbywKKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldE1lbW9yeUZkUHJvcGVydGllc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwKKyAgICBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlGZFByb3BlcnRpZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLAorICAgIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKiAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUZkUHJvcGVydGllcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCit2b2lkIFByZUNhbGxSZWNvcmRJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqICBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3ZvaWQgUHJlQ2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRJbXBvcnRTZW1hcGhvcmVGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiogICAgICAgICAgIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRTZW1hcGhvcmVGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiogICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0U2VtYXBob3JlRmRLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqICAgICAgICAgICAgICBwR2V0RmRJbmZvLAorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZkLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmVMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldCwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVSZW5kZXJQYXNzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVJlbmRlclBhc3MyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUmVuZGVyUGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclBhc3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZE5leHRTdWJwYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiAgICAgICAgICAgICAgICBwU3VicGFzc0JlZ2luSW5mbywKKyAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBTdWJwYXNzRW5kSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWROZXh0U3VicGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICAgICAgICAgICAgcFN1YnBhc3NCZWdpbkluZm8sCisgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgICAgICAgICAgICBwU3VicGFzc0VuZEluZm8pOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzMktIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogICAgICAgICAgICAgICAgICBwU3VicGFzc0VuZEluZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzczJLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFN1YnBhc3NFbmRJbmZvKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0U3dhcGNoYWluU3RhdHVzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldFN3YXBjaGFpblN0YXR1c0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3ZvaWQgUHJlQ2FsbFJlY29yZEltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogICAgICBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiAgICAgIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mbywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEZlbmNlV2luMzJIYW5kbGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogICAgICAgICBwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRGZW5jZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIqICAgICAgICAgcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICBIQU5ETEUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIYW5kbGUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKwordm9pZCBQcmVDYWxsUmVjb3JkSW1wb3J0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKiAgICAgICAgICAgICAgIHBJbXBvcnRGZW5jZUZkSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRJbXBvcnRGZW5jZUZkS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqICAgICAgICAgICAgICAgcEltcG9ydEZlbmNlRmRJbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RmVuY2VGZEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBHZXRGZEluZm8sCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmQsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiogICAgICAgIHBJbmZvKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiAgICAgICAgcEluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICAgcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqICAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogICAgICBwSW5mbywKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiAgICAgIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24qICAgICAgICAgICAgICAgICAgIHBZY2JjckNvbnZlcnNpb24sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgIHljYmNyQ29udmVyc2lvbiwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICB5Y2JjckNvbnZlcnNpb24sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeUluZm8qICAgICAgICAgICAgICAgcEJpbmRJbmZvcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRCaW5kQnVmZmVyTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogICAgICAgICAgICAgICBwQmluZEluZm9zLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQmluZEltYWdlTWVtb3J5MktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiAgICAgICAgICAgICAgICBwQmluZEluZm9zKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTJLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogICAgICAgICAgICAgICAgcEJpbmRJbmZvcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogICAgICAgICAgICAgICBwU3VwcG9ydCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiAgICAgIHBDcmVhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqICAgICAgICAgICAgICAgcFN1cHBvcnQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RDb3VudEtIUigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50S0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRXYWl0U2VtYXBob3Jlc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiAgICAgICAgICAgICAgIHBXYWl0SW5mbywKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkV2FpdFNlbWFwaG9yZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiogICAgICAgICAgICAgICBwV2FpdEluZm8sCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkU2lnbmFsU2VtYXBob3JlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogICAgICAgICAgICAgcFNpZ25hbEluZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkU2lnbmFsU2VtYXBob3JlS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogICAgICAgICAgICAgcFNpZ25hbEluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvLAorICAgIFZrRGV2aWNlQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiAgICAgICAgIHBJbmZvKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIHBJbmZvKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4ZWN1dGFibGVDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUluZm9LSFIqICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4ZWN1dGFibGVDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqICAgICAgICAgIHBQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNDb3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiogICAgICAgICAgIHBTdGF0aXN0aWNzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiAgICAgICAgICBwRXhlY3V0YWJsZUluZm8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdGlzdGljQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqICAgICAgICAgICBwU3RhdGlzdGljcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogICAgICAgICAgcEV4ZWN1dGFibGVJbmZvLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEludGVybmFsUmVwcmVzZW50YXRpb25Db3VudCwKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICAgICAgICAgIHBFeGVjdXRhYmxlSW5mbywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQsCisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2spOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCogICAgICAgICAgICAgICAgICAgcENhbGxiYWNrLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVidWdSZXBvcnRNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb2RlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVidWdSZXBvcnRNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb2RlLAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2UpOworLy8gVE9ETyAtIG5vdCB3cmFwcGluZyBFWFQgZnVuY3Rpb24gdmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVAorLy8gVE9ETyAtIG5vdCB3cmFwcGluZyBFWFQgZnVuY3Rpb24gdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQKKy8vIFRPRE8gLSBub3Qgd3JhcHBpbmcgRVhUIGZ1bmN0aW9uIHZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVAorLy8gVE9ETyAtIG5vdCB3cmFwcGluZyBFWFQgZnVuY3Rpb24gdmtDbWREZWJ1Z01hcmtlckVuZEVYVAorLy8gVE9ETyAtIG5vdCB3cmFwcGluZyBFWFQgZnVuY3Rpb24gdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVAorCit2b2lkIFByZUNhbGxSZWNvcmRDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QmluZGluZywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcE9mZnNldHMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwU2l6ZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcFNpemVzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvdW50ZXJCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlcnMsCisgICAgY29uc3QgVmtEZXZpY2VTaXplKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlckJ1ZmZlck9mZnNldHMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb3VudGVyQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50ZXJCdWZmZXJPZmZzZXRzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksCisgICAgVmtRdWVyeUNvbnRyb2xGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEJlZ2luUXVlcnlJbmRleGVkRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEVuZFF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEVuZFF1ZXJ5SW5kZXhlZEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4U3RyaWRlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleFN0cmlkZSk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEltYWdlVmlld0hhbmRsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqICAgICAgICAgICAgIHBJbmZvKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlVmlld0hhbmRsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqICAgICAgICAgICAgIHBJbmZvKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RDb3VudEFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRTaGFkZXJJbmZvQU1EKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgVmtTaGFkZXJTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdGFnZSwKKyAgICBWa1NoYWRlckluZm9UeXBlQU1EICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgIHNpemVfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm9TaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0U2hhZGVySW5mb0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLAorICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3RhZ2UsCisgICAgVmtTaGFkZXJJbmZvVHlwZUFNRCAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvVHlwZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0TWVtb3J5V2luMzJIYW5kbGVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgSEFORExFKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGFuZGxlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldE1lbW9yeVdpbjMySGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WICAgICAgICAgICBoYW5kbGVUeXBlLAorICAgIEhBTkRMRSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhhbmRsZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVWaVN1cmZhY2VOTigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlVmlTdXJmYWNlTk4oCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fVklfTk4KKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogICBwQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiAgIHBDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFByb2Nlc3NDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiAgICAgICAgICBwUHJvY2Vzc0NvbW1hbmRzSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRQcm9jZXNzQ29tbWFuZHNOVlgoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogICAgICAgICAgcFByb2Nlc3NDb21tYW5kc0luZm8pOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqICBwUmVzZXJ2ZVNwYWNlSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqICBwUmVzZXJ2ZVNwYWNlSW5mbyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCogICAgICAgICAgICAgICAgcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKiAgICAgICAgICAgICAgICBwSW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCAgICAgICAgICAgICAgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYICAgICAgICAgICAgICAgICBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrT2JqZWN0VGFibGVOVlgqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdFRhYmxlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrT2JqZWN0VGFibGVOVlgqICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdFRhYmxlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveU9iamVjdFRhYmxlTlZYKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrT2JqZWN0VGFibGVOVlggICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lPYmplY3RUYWJsZU5WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgICAgICBwcE9iamVjdFRhYmxlRW50cmllcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkVW5yZWdpc3Rlck9iamVjdHNOVlgoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtPYmplY3RUYWJsZU5WWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdENvdW50LAorICAgIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiAgICAgICAgICAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0SW5kaWNlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRVbnJlZ2lzdGVyT2JqZWN0c05WWCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa09iamVjdFRhYmxlTlZYICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRhYmxlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQsCisgICAgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqICAgICAgICAgICAgICAgICBwT2JqZWN0RW50cnlUeXBlcywKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3RJbmRpY2VzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiAgICAgICAgICAgICAgICAgcFZpZXdwb3J0V1NjYWxpbmdzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViogICAgICAgICAgICAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFJlbGVhc2VEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFJlbGVhc2VEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKwordm9pZCBQcmVDYWxsUmVjb3JkQWNxdWlyZVhsaWJEaXNwbGF5RVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmtEaXNwbGF5S0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEFjcXVpcmVYbGliRGlzcGxheUVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIERpc3BsYXkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB5LAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCit2b2lkIFByZUNhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqICAgICAgICAgICAgICAgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiAgICAgICAgICAgICAgICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGlzcGxheVBvd2VyQ29udHJvbEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5UG93ZXJJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheVBvd2VySW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREaXNwbGF5UG93ZXJDb250cm9sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5UG93ZXJJbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogICAgICAgICAgICAgICAgIHBEZXZpY2VFdmVudEluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgICBwRGV2aWNlRXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGlzcGxheUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwKKyAgICBjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqICAgICAgICAgICAgICAgIHBEaXNwbGF5RXZlbnRJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGZW5jZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRSZWdpc3RlckRpc3BsYXlFdmVudEVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rpc3BsYXlLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCisgICAgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiAgICAgICAgICAgICAgICBwRGlzcGxheUV2ZW50SW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRTd2FwY2hhaW5Db3VudGVyRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCAgICAgICAgICAgICAgICAgY291bnRlciwKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudGVyVmFsdWUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0U3dhcGNoYWluQ291bnRlckVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgICAgICAgICAgICAgICAgIGNvdW50ZXIsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRlclZhbHVlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogICAgICAgICAgICAgICBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogICAgICAgICAgICAgICBwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50LAorICAgIFZrUGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSogICAgICAgICAgICAgcFByZXNlbnRhdGlvblRpbWluZ3MpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCwKKyAgICBWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUqICAgICAgICAgICAgIHBQcmVzZW50YXRpb25UaW1pbmdzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERpc2NhcmRSZWN0YW5nbGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERpc2NhcmRSZWN0YW5nbGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsCisgICAgY29uc3QgVmtSZWN0MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXMpOworCit2b2lkIFByZUNhbGxSZWNvcmRTZXRIZHJNZXRhZGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbkNvdW50LAorICAgIGNvbnN0IFZrU3dhcGNoYWluS0hSKiAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMsCisgICAgY29uc3QgVmtIZHJNZXRhZGF0YUVYVCogICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkU2V0SGRyTWV0YWRhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW5Db3VudCwKKyAgICBjb25zdCBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5zLAorICAgIGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUlPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVNYWNPU1N1cmZhY2VNVksoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZU1hY09TU3VyZmFjZU1WSygKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKy8vIFRPRE8gLSBub3Qgd3JhcHBpbmcgRVhUIGZ1bmN0aW9uIHZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQKKy8vIFRPRE8gLSBub3Qgd3JhcHBpbmcgRVhUIGZ1bmN0aW9uIHZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVAorCit2b2lkIFByZUNhbGxSZWNvcmRRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworCit2b2lkIFByZUNhbGxSZWNvcmRRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUpOworCit2b2lkIFByZUNhbGxSZWNvcmRRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogICAgICAgICAgICAgICAgIHBMYWJlbEluZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiAgICAgICAgICAgICAgICAgcExhYmVsSW5mbyk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqICAgICAgICAgICAgICAgICBwTGFiZWxJbmZvKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCogICAgICAgICAgICAgICAgICAgcE1lc3Nlbmdlcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKiAgICAgICAgICAgICAgICAgICBwTWVzc2VuZ2VyLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpOworCit2b2lkIFByZUNhbGxSZWNvcmRTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUICAgICAgbWVzc2FnZVNldmVyaXR5LAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgICAgICAgICAgICAgbWVzc2FnZVR5cGVzLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogcENhbGxiYWNrRGF0YSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUICAgICAgbWVzc2FnZVNldmVyaXR5LAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgICAgICAgICAgICAgbWVzc2FnZVR5cGVzLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogcENhbGxiYWNrRGF0YSk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3Qgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogICBwUHJvcGVydGllcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKiAgIHBQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBwSW5mbywKKyAgICBzdHJ1Y3QgQUhhcmR3YXJlQnVmZmVyKiogICAgICAgICAgICAgICAgICAgIHBCdWZmZXIsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogICAgICAgICAgICAgcFNhbXBsZUxvY2F0aW9uc0luZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqICAgICAgICAgICAgIHBTYW1wbGVMb2NhdGlvbnNJbmZvKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiAgICAgIHBQcm9wZXJ0aWVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCogICAgICBwUHJvcGVydGllcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCogICAgICAgICAgICAgICAgICAgICAgIHBWYWxpZGF0aW9uQ2FjaGUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgICAgICAgcFZhbGlkYXRpb25DYWNoZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2VWaWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZVZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQsCisgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogICAgICAgICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydENvdW50LAorICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqICAgICAgICAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WICAgICAgICAgICAgICAgICAgIHNhbXBsZU9yZGVyVHlwZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsCisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYgICAgICAgICAgICAgICAgICAgc2FtcGxlT3JkZXJUeXBlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwKKyAgICBjb25zdCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqICAgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnMpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogICAgICAgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqIHBJbmZvLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiogICAgICAgICAgICAgICAgICAgcE1lbW9yeVJlcXVpcmVtZW50cyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSKiAgICAgICAgICAgICAgICAgICBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIHBCaW5kSW5mb3MpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIHBCaW5kSW5mb3MsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogICAgICAgIHBJbmZvLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZmZzZXQsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaE9mZnNldCk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogICAgICAgIHBJbmZvLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZmZzZXQsCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaE9mZnNldCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WICAgICAgICAgICBtb2RlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WICAgICAgICAgICBtb2RlKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kVHJhY2VSYXlzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kVHJhY2VSYXlzTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0U2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpOworCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEdyb3VwLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEdyb3VwLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudCwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LAorICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMsCisgICAgVmtRdWVyeVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5KTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCwKKyAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiAgICAgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLAorICAgIFZrUXVlcnlUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENvbXBpbGVEZWZlcnJlZE5WKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXIpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ29tcGlsZURlZmVycmVkTlYoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlciwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXIsCisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqICAgICAgICAgICBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSG9zdFBvaW50ZXIsCisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqICAgICAgICAgICBwTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZVN0YWdlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCwKKyAgICBjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiAgICAgICAgIHBUaW1lc3RhbXBJbmZvcywKKyAgICB1aW50NjRfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lc3RhbXBzLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1heERldmlhdGlvbik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcENvdW50LAorICAgIGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqICAgICAgICAgcFRpbWVzdGFtcEluZm9zLAorICAgIHVpbnQ2NF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVzdGFtcHMsCisgICAgdWludDY0X3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF4RGV2aWF0aW9uLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhc2spOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc05WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGFzayk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJPZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwKKyAgICBjb25zdCBWa1JlY3QyRCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0Q2hlY2twb2ludE5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50TWFya2VyKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENtZFNldENoZWNrcG9pbnROVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludE1hcmtlcik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldFF1ZXVlQ2hlY2twb2ludERhdGFOVigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrcG9pbnREYXRhQ291bnQsCisgICAgVmtDaGVja3BvaW50RGF0YU5WKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGEpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2twb2ludERhdGFDb3VudCwKKyAgICBWa0NoZWNrcG9pbnREYXRhTlYqICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja3BvaW50RGF0YSk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiAgcEluaXRpYWxpemVJbmZvKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiAgcEluaXRpYWxpemVJbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogICAgICAgICBwTWFya2VySW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiAgICAgICAgIHBNYXJrZXJJbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogICBwTWFya2VySW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiAgIHBNYXJrZXJJbmZvLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqICAgICAgIHBPdmVycmlkZUluZm8pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqICAgICAgIHBPdmVycmlkZUluZm8sCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCogICAgICAgICAgICBwQ29uZmlndXJhdGlvbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCgKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLAorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgICAgICAgICAgICAgY29uZmlndXJhdGlvbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCAgICAgICAgICAgICBwYXJhbWV0ZXIsCisgICAgVmtQZXJmb3JtYW5jZVZhbHVlSU5URUwqICAgICAgICAgICAgICAgICAgICBwVmFsdWUpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMICAgICAgICAgICAgIHBhcmFtZXRlciwKKyAgICBWa1BlcmZvcm1hbmNlVmFsdWVJTlRFTCogICAgICAgICAgICAgICAgICAgIHBWYWx1ZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFNldExvY2FsRGltbWluZ0FNRCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbiwKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGltbWluZ0VuYWJsZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRTZXRMb2NhbERpbW1pbmdBTUQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwQ2hhaW4sCisgICAgVmtCb29sMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbERpbW1pbmdFbmFibGUpOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEqICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKwordm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlTWV0YWxTdXJmYWNlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTdXJmYWNlS0hSKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVNZXRhbFN1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogICAgICAgICBwSW5mbyk7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqICAgICAgICAgcEluZm8sCisgICAgVmtEZXZpY2VBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCit2b2lkIFByZUNhbGxSZWNvcmRBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4pOworCit2b2lkIFBvc3RDYWxsUmVjb3JkQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKwordm9pZCBQcmVDYWxsUmVjb3JkUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZFJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZEdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogICAgICBwU3VyZmFjZUluZm8sCisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqICAgICAgICAgICBwTW9kZXMpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiAgICAgIHBTdXJmYWNlSW5mbywKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiogICAgICAgICAgIHBNb2RlcywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCit2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKTsKKwordm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UsCisgICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworCit2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRMaW5lU3RpcHBsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZUZhY3RvciwKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlUGF0dGVybik7CisKK3ZvaWQgUG9zdENhbGxSZWNvcmRDbWRTZXRMaW5lU3RpcHBsZUVYVCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RpcHBsZUZhY3RvciwKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGlwcGxlUGF0dGVybik7CisKK3ZvaWQgUHJlQ2FsbFJlY29yZFJlc2V0UXVlcnlQb29sRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpOworCit2b2lkIFBvc3RDYWxsUmVjb3JkUmVzZXRRdWVyeVBvb2xFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC92a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhZTgzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgKQEAgLTAsMCArMSwxMDE2IEBACisjcHJhZ21hIG9uY2UKKy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqCisvLyBTZWUgZGlzcGF0Y2hfaGVscGVyX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKi8KKworI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKyNpbmNsdWRlIDx2dWxrYW4vdmtfbGF5ZXIuaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSAidmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCIKKyNpbmNsdWRlICJ2a19leHRlbnNpb25faGVscGVyLmgiCisKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkJpbmRCdWZmZXJNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkJpbmRJbWFnZU1lbW9yeTIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgaGVhcEluZGV4LCB1aW50MzJfdCBsb2NhbERldmljZUluZGV4LCB1aW50MzJfdCByZW1vdGVEZXZpY2VJbmRleCwgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiBwUGVlck1lbW9yeUZlYXR1cmVzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRTZXREZXZpY2VNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBkZXZpY2VNYXNrKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREaXNwYXRjaEJhc2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YlRyaW1Db21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldERldmljZVF1ZXVlMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogcFF1ZXVlSW5mbywgVmtRdWV1ZSogcFF1ZXVlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiogcFljYmNyQ29udmVyc2lvbikgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oVmtEZXZpY2UgZGV2aWNlLCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JDb252ZXJzaW9uLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKiBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogcFN1cHBvcnQpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDcmVhdGVTd2FwY2hhaW5LSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWluKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJEZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRTd2FwY2hhaW5JbWFnZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90KiBwU3dhcGNoYWluSW1hZ2VDb3VudCwgVmtJbWFnZSogcFN3YXBjaGFpbkltYWdlcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkFjcXVpcmVOZXh0SW1hZ2VLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQ2NF90IHRpbWVvdXQsIFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgVmtGZW5jZSBmZW5jZSwgdWludDMyX3QqIHBJbWFnZUluZGV4KSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViUXVldWVQcmVzZW50S0hSKFZrUXVldWUgcXVldWUsIGNvbnN0IFZrUHJlc2VudEluZm9LSFIqIHBQcmVzZW50SW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUihWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiBwRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKiBwTW9kZXMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJBY3F1aXJlTmV4dEltYWdlMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqIHBBY3F1aXJlSW5mbywgdWludDMyX3QqIHBJbWFnZUluZGV4KSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHN3YXBjaGFpbkNvdW50LCBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N3YXBjaGFpbktIUiogcFN3YXBjaGFpbnMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgaGVhcEluZGV4LCB1aW50MzJfdCBsb2NhbERldmljZUluZGV4LCB1aW50MzJfdCByZW1vdGVEZXZpY2VJbmRleCwgVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzKiBwUGVlck1lbW9yeUZlYXR1cmVzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRTZXREZXZpY2VNYXNrS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBkZXZpY2VNYXNrKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREaXNwYXRjaEJhc2VLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YlRyaW1Db21tYW5kUG9vbEtIUihWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xUcmltRmxhZ3MgZmxhZ3MpIHsgIH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywgSEFORExFKiBwSGFuZGxlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGUsIEhBTkRMRSBoYW5kbGUsIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldE1lbW9yeUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlLCBpbnQgZmQsIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKiBwTWVtb3J5RmRQcm9wZXJ0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHBHZXRXaW4zMkhhbmRsZUluZm8sIEhBTkRMRSogcEhhbmRsZSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJJbXBvcnRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlRmRJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0U2VtYXBob3JlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiogcEdldEZkSW5mbywgaW50KiBwRmQpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yV3JpdGVzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgdWludDMyX3Qgc2V0LCBjb25zdCB2b2lkKiBwRGF0YSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUqIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IHZvaWQqIHBEYXRhKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlUmVuZGVyUGFzczJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzKiBwUmVuZGVyUGFzcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kQmVnaW5SZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiAgICAgIHBSZW5kZXJQYXNzQmVnaW4sIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogICAgICBwU3VicGFzc0JlZ2luSW5mbykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kTmV4dFN1YnBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqICAgICAgcFN1YnBhc3NCZWdpbkluZm8sIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqICAgICAgICBwU3VicGFzc0VuZEluZm8pIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEVuZFJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiAgICAgICAgcFN1YnBhc3NFbmRJbmZvKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0U3dhcGNoYWluU3RhdHVzS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldEZlbmNlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBwR2V0V2luMzJIYW5kbGVJbmZvLCBIQU5ETEUqIHBIYW5kbGUpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViSW1wb3J0RmVuY2VGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqIHBJbXBvcnRGZW5jZUZkSW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldEZlbmNlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSKiBwR2V0RmRJbmZvLCBpbnQqIHBGZCkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqIHBJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihWa0RldmljZSBkZXZpY2UpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogcE1lbW9yeVJlcXVpcmVtZW50cykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLCBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sIHVpbnQzMl90KiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiBwWWNiY3JDb252ZXJzaW9uKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkJpbmRCdWZmZXJNZW1vcnkyS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogcEJpbmRJbmZvcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkJpbmRJbWFnZU1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIHBCaW5kSW5mb3MpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHBTdXBwb3J0KSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREcmF3SW5kaXJlY3RDb3VudEtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLCBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCB1aW50NjRfdCogcFZhbHVlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViV2FpdFNlbWFwaG9yZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiBwV2FpdEluZm8sIHVpbnQ2NF90IHRpbWVvdXQpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJTaWduYWxTZW1hcGhvcmVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqIHBTaWduYWxJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtEZXZpY2VBZGRyZXNzIFZLQVBJX0NBTEwgU3R1YkdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgeyByZXR1cm4gMDsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHVpbnQ2NF90IFZLQVBJX0NBTEwgU3R1YkdldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogcEluZm8pIHsgcmV0dXJuIDA7IH07CitzdGF0aWMgVktBUElfQVRUUiB1aW50NjRfdCBWS0FQSV9DQUxMIFN0dWJHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgeyByZXR1cm4gMDsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIoVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKiAgICAgICAgcFBpcGVsaW5lSW5mbywgdWludDMyX3QqIHBFeGVjdXRhYmxlQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogcFByb3BlcnRpZXMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICBwRXhlY3V0YWJsZUluZm8sIHVpbnQzMl90KiBwU3RhdGlzdGljQ291bnQsIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiBwU3RhdGlzdGljcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqICBwRXhlY3V0YWJsZUluZm8sIHVpbnQzMl90KiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LCBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQqIHBUYWdJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiBwTmFtZUluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZERlYnVnTWFya2VyQmVnaW5FWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiBwTWFya2VySW5mbykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRGVidWdNYXJrZXJFbmRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZERlYnVnTWFya2VySW5zZXJ0RVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogcE1hcmtlckluZm8pIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0QmluZGluZywgdWludDMyX3QgYmluZGluZ0NvdW50LCBjb25zdCBWa0J1ZmZlciogcEJ1ZmZlcnMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcE9mZnNldHMsIGNvbnN0IFZrRGV2aWNlU2l6ZSogcFNpemVzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdENvdW50ZXJCdWZmZXIsIHVpbnQzMl90IGNvdW50ZXJCdWZmZXJDb3VudCwgY29uc3QgVmtCdWZmZXIqIHBDb3VudGVyQnVmZmVycywgY29uc3QgVmtEZXZpY2VTaXplKiBwQ291bnRlckJ1ZmZlck9mZnNldHMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEJlZ2luUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCB1aW50MzJfdCBpbmRleCkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRW5kUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LCB1aW50MzJfdCBpbmRleCkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlLCBWa0J1ZmZlciBjb3VudGVyQnVmZmVyLCBWa0RldmljZVNpemUgY291bnRlckJ1ZmZlck9mZnNldCwgdWludDMyX3QgY291bnRlck9mZnNldCwgdWludDMyX3QgdmVydGV4U3RyaWRlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdWludDMyX3QgVktBUElfQ0FMTCBTdHViR2V0SW1hZ2VWaWV3SGFuZGxlTlZYKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBwSW5mbykgeyByZXR1cm4gMDsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRHJhd0luZGlyZWN0Q291bnRBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFNoYWRlckluZm9BTUQoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc2hhZGVyU3RhZ2UsIFZrU2hhZGVySW5mb1R5cGVBTUQgaW5mb1R5cGUsIHNpemVfdCogcEluZm9TaXplLCB2b2lkKiBwSW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgaGFuZGxlVHlwZSwgSEFORExFKiBwSGFuZGxlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4pIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRQcm9jZXNzQ29tbWFuZHNOVlgoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogcFByb2Nlc3NDb21tYW5kc0luZm8pIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogcFJlc2VydmVTcGFjZUluZm8pIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKiBwSW5kaXJlY3RDb21tYW5kc0xheW91dCkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgoVmtEZXZpY2UgZGV2aWNlLCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaW5kaXJlY3RDb21tYW5kc0xheW91dCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlT2JqZWN0VGFibGVOVlgoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtPYmplY3RUYWJsZU5WWCogcE9iamVjdFRhYmxlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJEZXN0cm95T2JqZWN0VGFibGVOVlgoVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJSZWdpc3Rlck9iamVjdHNOVlgoVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFRhYmxlTlZYIG9iamVjdFRhYmxlLCB1aW50MzJfdCBvYmplY3RDb3VudCwgY29uc3QgVmtPYmplY3RUYWJsZUVudHJ5TlZYKiBjb25zdCogICAgcHBPYmplY3RUYWJsZUVudHJpZXMsIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0SW5kaWNlcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YlVucmVnaXN0ZXJPYmplY3RzTlZYKFZrRGV2aWNlIGRldmljZSwgVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZSwgdWludDMyX3Qgb2JqZWN0Q291bnQsIGNvbnN0IFZrT2JqZWN0RW50cnlUeXBlTlZYKiBwT2JqZWN0RW50cnlUeXBlcywgY29uc3QgdWludDMyX3QqIHBPYmplY3RJbmRpY2VzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiBwVmlld3BvcnRXU2NhbGluZ3MpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJEaXNwbGF5UG93ZXJDb250cm9sRVhUKFZrRGV2aWNlIGRldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogcERpc3BsYXlQb3dlckluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJSZWdpc3RlckRldmljZUV2ZW50RVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqIHBEZXZpY2VFdmVudEluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtGZW5jZSogcEZlbmNlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwgY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiBwRGlzcGxheUV2ZW50SW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0ZlbmNlKiBwRmVuY2UpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRTd2FwY2hhaW5Db3VudGVyRVhUKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgY291bnRlciwgdWludDY0X3QqIHBDb3VudGVyVmFsdWUpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRShWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgVmtSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSogcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRShWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QqIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCwgVmtQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKiBwUHJlc2VudGF0aW9uVGltaW5ncykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3REaXNjYXJkUmVjdGFuZ2xlLCB1aW50MzJfdCBkaXNjYXJkUmVjdGFuZ2xlQ291bnQsIGNvbnN0IFZrUmVjdDJEKiBwRGlzY2FyZFJlY3RhbmdsZXMpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YlNldEhkck1ldGFkYXRhRVhUKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3Qgc3dhcGNoYWluQ291bnQsIGNvbnN0IFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWlucywgY29uc3QgVmtIZHJNZXRhZGF0YUVYVCogcE1ldGFkYXRhKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogcE5hbWVJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQqIHBUYWdJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKFZrUXVldWUgcXVldWUsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVChWa1F1ZXVlIHF1ZXVlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVChWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBwTGFiZWxJbmZvKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pIHsgIH07CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRChWa0RldmljZSBkZXZpY2UsIGNvbnN0IHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciwgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogcFByb3BlcnRpZXMpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogcEluZm8sIHN0cnVjdCBBSGFyZHdhcmVCdWZmZXIqKiBwQnVmZmVyKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogcFNhbXBsZUxvY2F0aW9uc0luZm8pIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqIHBQcm9wZXJ0aWVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCogcFZhbGlkYXRpb25DYWNoZSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVChWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKFZrRGV2aWNlIGRldmljZSwgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgZHN0Q2FjaGUsIHVpbnQzMl90IHNyY0NhY2hlQ291bnQsIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiBwU3JjQ2FjaGVzKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVChWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgc2l6ZV90KiBwRGF0YVNpemUsIHZvaWQqIHBEYXRhKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZSwgdWludDMyX3QgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCwgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiBwQ3VzdG9tU2FtcGxlT3JkZXJzKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogcEFjY2VsZXJhdGlvblN0cnVjdHVyZSkgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogcEluZm8sIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiogcE1lbW9yeVJlcXVpcmVtZW50cykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogcEJpbmRJbmZvcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqIHBJbmZvLCBWa0J1ZmZlciBpbnN0YW5jZURhdGEsIFZrRGV2aWNlU2l6ZSBpbnN0YW5jZU9mZnNldCwgVmtCb29sMzIgdXBkYXRlLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsIFZrQnVmZmVyIHNjcmF0Y2gsIFZrRGV2aWNlU2l6ZSBzY3JhdGNoT2Zmc2V0KSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywgVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIG1vZGUpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFRyYWNlUmF5c05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkZXB0aCkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IGZpcnN0R3JvdXAsIHVpbnQzMl90IGdyb3VwQ291bnQsIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCogcERhdGEpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVihWa0RldmljZSBkZXZpY2UsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLCBzaXplX3QgZGF0YVNpemUsIHZvaWQqIHBEYXRhKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcywgVmtRdWVyeVR5cGUgcXVlcnlUeXBlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnkpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDb21waWxlRGVmZXJyZWROVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIHVpbnQzMl90IHNoYWRlcikgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVChWa0RldmljZSBkZXZpY2UsIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZSwgY29uc3Qgdm9pZCogcEhvc3RQb2ludGVyLCBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCogcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHBpcGVsaW5lU3RhZ2UsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgdWludDMyX3QgbWFya2VyKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCB0aW1lc3RhbXBDb3VudCwgY29uc3QgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCogcFRpbWVzdGFtcEluZm9zLCB1aW50NjRfdCogcFRpbWVzdGFtcHMsIHVpbnQ2NF90KiBwTWF4RGV2aWF0aW9uKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREcmF3TWVzaFRhc2tzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHRhc2tDb3VudCwgdWludDMyX3QgZmlyc3RUYXNrKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBkcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsIHVpbnQzMl90IHN0cmlkZSkgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsIHVpbnQzMl90IGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBFeGNsdXNpdmVTY2lzc29ycykgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViQ21kU2V0Q2hlY2twb2ludE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCB2b2lkKiBwQ2hlY2twb2ludE1hcmtlcikgeyAgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTdHViR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKFZrUXVldWUgcXVldWUsIHVpbnQzMl90KiBwQ2hlY2twb2ludERhdGFDb3VudCwgVmtDaGVja3BvaW50RGF0YU5WKiBwQ2hlY2twb2ludERhdGEpIHsgIH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiBwSW5pdGlhbGl6ZUluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YlVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwoVmtEZXZpY2UgZGV2aWNlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogcE1hcmtlckluZm8pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBwTWFya2VySW5mbykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YkNtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiBwT3ZlcnJpZGVJbmZvKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBwQWNxdWlyZUluZm8sIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwqIHBDb25maWd1cmF0aW9uKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKFZrRGV2aWNlIGRldmljZSwgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uKSB7IHJldHVybiBWS19TVUNDRVNTOyB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTChWa1F1ZXVlIHF1ZXVlLCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIGNvbmZpZ3VyYXRpb24pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKFZrRGV2aWNlIGRldmljZSwgVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTCBwYXJhbWV0ZXIsIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMKiBwVmFsdWUpIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YlNldExvY2FsRGltbWluZ0FNRChWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBDaGFpbiwgVmtCb29sMzIgbG9jYWxEaW1taW5nRW5hYmxlKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgVmtEZXZpY2VBZGRyZXNzIFZLQVBJX0NBTEwgU3R1YkdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBwSW5mbykgeyByZXR1cm4gMDsgfTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIFN0dWJBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4pIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgU3R1YlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVChWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbikgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBTdHViR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIqIHBNb2RlcykgeyByZXR1cm4gVktfU1VDQ0VTUzsgfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU3R1YkNtZFNldExpbmVTdGlwcGxlRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBsaW5lU3RpcHBsZUZhY3RvciwgdWludDE2X3QgbGluZVN0aXBwbGVQYXR0ZXJuKSB7ICB9Oworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIFN0dWJSZXNldFF1ZXJ5UG9vbEVYVChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkgeyAgfTsKKworCisKK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFwaV9leHRlbnNpb25fbWFwIHsKKyAgICB7InZrQmluZEJ1ZmZlck1lbW9yeTIiLCAiVktfVkVSU0lPTl8xXzEifSwKKyAgICB7InZrQmluZEltYWdlTWVtb3J5MiIsICJWS19WRVJTSU9OXzFfMSJ9LAorICAgIHsidmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyIsICJWS19WRVJTSU9OXzFfMSJ9LAorICAgIHsidmtDbWRTZXREZXZpY2VNYXNrIiwgIlZLX1ZFUlNJT05fMV8xIn0sCisgICAgeyJ2a0NtZERpc3BhdGNoQmFzZSIsICJWS19WRVJTSU9OXzFfMSJ9LAorICAgIHsidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIiLCAiVktfVkVSU0lPTl8xXzEifSwKKyAgICB7InZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiIsICJWS19WRVJTSU9OXzFfMSJ9LAorICAgIHsidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIiLCAiVktfVkVSU0lPTl8xXzEifSwKKyAgICB7InZrVHJpbUNvbW1hbmRQb29sIiwgIlZLX1ZFUlNJT05fMV8xIn0sCisgICAgeyJ2a0dldERldmljZVF1ZXVlMiIsICJWS19WRVJTSU9OXzFfMSJ9LAorICAgIHsidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgIlZLX1ZFUlNJT05fMV8xIn0sCisgICAgeyJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwgIlZLX1ZFUlNJT05fMV8xIn0sCisgICAgeyJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSIsICJWS19WRVJTSU9OXzFfMSJ9LAorICAgIHsidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIiwgIlZLX1ZFUlNJT05fMV8xIn0sCisgICAgeyJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUiLCAiVktfVkVSU0lPTl8xXzEifSwKKyAgICB7InZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQiLCAiVktfVkVSU0lPTl8xXzEifSwKKyAgICB7InZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgIlZLX0tIUl9zd2FwY2hhaW4ifSwKKyAgICB7InZrRGVzdHJveVN3YXBjaGFpbktIUiIsICJWS19LSFJfc3dhcGNoYWluIn0sCisgICAgeyJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIsICJWS19LSFJfc3dhcGNoYWluIn0sCisgICAgeyJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiLCAiVktfS0hSX3N3YXBjaGFpbiJ9LAorICAgIHsidmtRdWV1ZVByZXNlbnRLSFIiLCAiVktfS0hSX3N3YXBjaGFpbiJ9LAorICAgIHsidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiLCAiVktfS0hSX3N3YXBjaGFpbiJ9LAorICAgIHsidmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIiLCAiVktfS0hSX3N3YXBjaGFpbiJ9LAorICAgIHsidmtBY3F1aXJlTmV4dEltYWdlMktIUiIsICJWS19LSFJfc3dhcGNoYWluIn0sCisgICAgeyJ2a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIiLCAiVktfS0hSX2Rpc3BsYXlfc3dhcGNoYWluIn0sCisgICAgeyJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSIiwgIlZLX0tIUl9kZXZpY2VfZ3JvdXAifSwKKyAgICB7InZrQ21kU2V0RGV2aWNlTWFza0tIUiIsICJWS19LSFJfZGV2aWNlX2dyb3VwIn0sCisgICAgeyJ2a0NtZERpc3BhdGNoQmFzZUtIUiIsICJWS19LSFJfZGV2aWNlX2dyb3VwIn0sCisgICAgeyJ2a1RyaW1Db21tYW5kUG9vbEtIUiIsICJWS19LSFJfbWFpbnRlbmFuY2UxIn0sCisgICAgeyJ2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSIiwgIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIifSwKKyAgICB7InZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIiwgIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfd2luMzIifSwKKyAgICB7InZrR2V0TWVtb3J5RmRLSFIiLCAiVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCJ9LAorICAgIHsidmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIiLCAiVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCJ9LAorICAgIHsidmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIsICJWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyIn0sCisgICAgeyJ2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIiwgIlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIifSwKKyAgICB7InZrSW1wb3J0U2VtYXBob3JlRmRLSFIiLCAiVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCJ9LAorICAgIHsidmtHZXRTZW1hcGhvcmVGZEtIUiIsICJWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkIn0sCisgICAgeyJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIiwgIlZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IifSwKKyAgICB7InZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCAiVktfS0hSX3B1c2hfZGVzY3JpcHRvciJ9LAorICAgIHsidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCAiVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIn0sCisgICAgeyJ2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiLCAiVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIn0sCisgICAgeyJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLCAiVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIn0sCisgICAgeyJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiwgIlZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIifSwKKyAgICB7InZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIsICJWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIn0sCisgICAgeyJ2a0NtZE5leHRTdWJwYXNzMktIUiIsICJWS19LSFJfY3JlYXRlX3JlbmRlcnBhc3MyIn0sCisgICAgeyJ2a0NtZEVuZFJlbmRlclBhc3MyS0hSIiwgIlZLX0tIUl9jcmVhdGVfcmVuZGVycGFzczIifSwKKyAgICB7InZrR2V0U3dhcGNoYWluU3RhdHVzS0hSIiwgIlZLX0tIUl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UifSwKKyAgICB7InZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiIsICJWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIifSwKKyAgICB7InZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIsICJWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIifSwKKyAgICB7InZrSW1wb3J0RmVuY2VGZEtIUiIsICJWS19LSFJfZXh0ZXJuYWxfZmVuY2VfZmQifSwKKyAgICB7InZrR2V0RmVuY2VGZEtIUiIsICJWS19LSFJfZXh0ZXJuYWxfZmVuY2VfZmQifSwKKyAgICB7InZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIiLCAiVktfS0hSX3BlcmZvcm1hbmNlX3F1ZXJ5In0sCisgICAgeyJ2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIiwgIlZLX0tIUl9wZXJmb3JtYW5jZV9xdWVyeSJ9LAorICAgIHsidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiLCAiVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiJ9LAorICAgIHsidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgIlZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIifSwKKyAgICB7InZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIiwgIlZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIifSwKKyAgICB7InZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiIsICJWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uIn0sCisgICAgeyJ2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIiwgIlZLX0tIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24ifSwKKyAgICB7InZrQmluZEJ1ZmZlck1lbW9yeTJLSFIiLCAiVktfS0hSX2JpbmRfbWVtb3J5MiJ9LAorICAgIHsidmtCaW5kSW1hZ2VNZW1vcnkyS0hSIiwgIlZLX0tIUl9iaW5kX21lbW9yeTIifSwKKyAgICB7InZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIiLCAiVktfS0hSX21haW50ZW5hbmNlMyJ9LAorICAgIHsidmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiIsICJWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCJ9LAorICAgIHsidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiLCAiVktfS0hSX2RyYXdfaW5kaXJlY3RfY291bnQifSwKKyAgICB7InZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSIiwgIlZLX0tIUl90aW1lbGluZV9zZW1hcGhvcmUifSwKKyAgICB7InZrV2FpdFNlbWFwaG9yZXNLSFIiLCAiVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSJ9LAorICAgIHsidmtTaWduYWxTZW1hcGhvcmVLSFIiLCAiVktfS0hSX3RpbWVsaW5lX3NlbWFwaG9yZSJ9LAorICAgIHsidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIiwgIlZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MifSwKKyAgICB7InZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiLCAiVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyJ9LAorICAgIHsidmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiIsICJWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzIn0sCisgICAgeyJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIiLCAiVktfS0hSX3BpcGVsaW5lX2V4ZWN1dGFibGVfcHJvcGVydGllcyJ9LAorICAgIHsidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSIiwgIlZLX0tIUl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMifSwKKyAgICB7InZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIiLCAiVktfS0hSX3BpcGVsaW5lX2V4ZWN1dGFibGVfcHJvcGVydGllcyJ9LAorICAgIHsidmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCIsICJWS19FWFRfZGVidWdfbWFya2VyIn0sCisgICAgeyJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCIsICJWS19FWFRfZGVidWdfbWFya2VyIn0sCisgICAgeyJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiLCAiVktfRVhUX2RlYnVnX21hcmtlciJ9LAorICAgIHsidmtDbWREZWJ1Z01hcmtlckVuZEVYVCIsICJWS19FWFRfZGVidWdfbWFya2VyIn0sCisgICAgeyJ2a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUIiwgIlZLX0VYVF9kZWJ1Z19tYXJrZXIifSwKKyAgICB7InZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCIsICJWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrIn0sCisgICAgeyJ2a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQiLCAiVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjayJ9LAorICAgIHsidmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCIsICJWS19FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrIn0sCisgICAgeyJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIiwgIlZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sifSwKKyAgICB7InZrQ21kRW5kUXVlcnlJbmRleGVkRVhUIiwgIlZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sifSwKKyAgICB7InZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUIiwgIlZLX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sifSwKKyAgICB7InZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYIiwgIlZLX05WWF9pbWFnZV92aWV3X2hhbmRsZSJ9LAorICAgIHsidmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCIsICJWS19BTURfZHJhd19pbmRpcmVjdF9jb3VudCJ9LAorICAgIHsidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiLCAiVktfQU1EX2RyYXdfaW5kaXJlY3RfY291bnQifSwKKyAgICB7InZrR2V0U2hhZGVySW5mb0FNRCIsICJWS19BTURfc2hhZGVyX2luZm8ifSwKKyAgICB7InZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViIsICJWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIifSwKKyAgICB7InZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCIsICJWS19FWFRfY29uZGl0aW9uYWxfcmVuZGVyaW5nIn0sCisgICAgeyJ2a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIiwgIlZLX0VYVF9jb25kaXRpb25hbF9yZW5kZXJpbmcifSwKKyAgICB7InZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIiwgIlZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIn0sCisgICAgeyJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIiwgIlZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIn0sCisgICAgeyJ2a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAiVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMifSwKKyAgICB7InZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiLCAiVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMifSwKKyAgICB7InZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiLCAiVktfTlZYX2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHMifSwKKyAgICB7InZrRGVzdHJveU9iamVjdFRhYmxlTlZYIiwgIlZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIn0sCisgICAgeyJ2a1JlZ2lzdGVyT2JqZWN0c05WWCIsICJWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyJ9LAorICAgIHsidmtVbnJlZ2lzdGVyT2JqZWN0c05WWCIsICJWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyJ9LAorICAgIHsidmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYiLCAiVktfTlZfY2xpcF9zcGFjZV93X3NjYWxpbmcifSwKKyAgICB7InZrRGlzcGxheVBvd2VyQ29udHJvbEVYVCIsICJWS19FWFRfZGlzcGxheV9jb250cm9sIn0sCisgICAgeyJ2a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQiLCAiVktfRVhUX2Rpc3BsYXlfY29udHJvbCJ9LAorICAgIHsidmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVCIsICJWS19FWFRfZGlzcGxheV9jb250cm9sIn0sCisgICAgeyJ2a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQiLCAiVktfRVhUX2Rpc3BsYXlfY29udHJvbCJ9LAorICAgIHsidmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSIsICJWS19HT09HTEVfZGlzcGxheV90aW1pbmcifSwKKyAgICB7InZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSIsICJWS19HT09HTEVfZGlzcGxheV90aW1pbmcifSwKKyAgICB7InZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCIsICJWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzIn0sCisgICAgeyJ2a1NldEhkck1ldGFkYXRhRVhUIiwgIlZLX0VYVF9oZHJfbWV0YWRhdGEifSwKKyAgICB7InZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQiLCAiVktfRVhUX2RlYnVnX3V0aWxzIn0sCisgICAgeyJ2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQiLCAiVktfRVhUX2RlYnVnX3V0aWxzIn0sCisgICAgeyJ2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiLCAiVktfRVhUX2RlYnVnX3V0aWxzIn0sCisgICAgeyJ2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUIiwgIlZLX0VYVF9kZWJ1Z191dGlscyJ9LAorICAgIHsidmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIsICJWS19FWFRfZGVidWdfdXRpbHMifSwKKyAgICB7InZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiLCAiVktfRVhUX2RlYnVnX3V0aWxzIn0sCisgICAgeyJ2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCIsICJWS19FWFRfZGVidWdfdXRpbHMifSwKKyAgICB7InZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIiwgIlZLX0VYVF9kZWJ1Z191dGlscyJ9LAorICAgIHsidmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCIsICJWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciJ9LAorICAgIHsidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIiwgIlZLX0FORFJPSURfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyIn0sCisgICAgeyJ2a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCIsICJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyJ9LAorICAgIHsidmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCIsICJWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllciJ9LAorICAgIHsidmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQiLCAiVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUifSwKKyAgICB7InZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCIsICJWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSJ9LAorICAgIHsidmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQiLCAiVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUifSwKKyAgICB7InZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCIsICJWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSJ9LAorICAgIHsidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIiwgIlZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSJ9LAorICAgIHsidmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WIiwgIlZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSJ9LAorICAgIHsidmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WIiwgIlZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSJ9LAorICAgIHsidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsICJWS19OVl9yYXlfdHJhY2luZyJ9LAorICAgIHsidmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAiVktfTlZfcmF5X3RyYWNpbmcifSwKKyAgICB7InZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiLCAiVktfTlZfcmF5X3RyYWNpbmcifSwKKyAgICB7InZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIiwgIlZLX05WX3JheV90cmFjaW5nIn0sCisgICAgeyJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiLCAiVktfTlZfcmF5X3RyYWNpbmcifSwKKyAgICB7InZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwgIlZLX05WX3JheV90cmFjaW5nIn0sCisgICAgeyJ2a0NtZFRyYWNlUmF5c05WIiwgIlZLX05WX3JheV90cmFjaW5nIn0sCisgICAgeyJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViIsICJWS19OVl9yYXlfdHJhY2luZyJ9LAorICAgIHsidmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYiLCAiVktfTlZfcmF5X3RyYWNpbmcifSwKKyAgICB7InZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYiLCAiVktfTlZfcmF5X3RyYWNpbmcifSwKKyAgICB7InZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WIiwgIlZLX05WX3JheV90cmFjaW5nIn0sCisgICAgeyJ2a0NvbXBpbGVEZWZlcnJlZE5WIiwgIlZLX05WX3JheV90cmFjaW5nIn0sCisgICAgeyJ2a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCIsICJWS19FWFRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QifSwKKyAgICB7InZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQiLCAiVktfQU1EX2J1ZmZlcl9tYXJrZXIifSwKKyAgICB7InZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQiLCAiVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyJ9LAorICAgIHsidmtDbWREcmF3TWVzaFRhc2tzTlYiLCAiVktfTlZfbWVzaF9zaGFkZXIifSwKKyAgICB7InZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYiLCAiVktfTlZfbWVzaF9zaGFkZXIifSwKKyAgICB7InZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViIsICJWS19OVl9tZXNoX3NoYWRlciJ9LAorICAgIHsidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYiLCAiVktfTlZfc2Npc3Nvcl9leGNsdXNpdmUifSwKKyAgICB7InZrQ21kU2V0Q2hlY2twb2ludE5WIiwgIlZLX05WX2RldmljZV9kaWFnbm9zdGljX2NoZWNrcG9pbnRzIn0sCisgICAgeyJ2a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViIsICJWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cyJ9LAorICAgIHsidmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCIsICJWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSJ9LAorICAgIHsidmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIiwgIlZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5In0sCisgICAgeyJ2a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwiLCAiVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkifSwKKyAgICB7InZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCIsICJWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSJ9LAorICAgIHsidmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwiLCAiVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkifSwKKyAgICB7InZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIiwgIlZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5In0sCisgICAgeyJ2a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsICJWS19JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSJ9LAorICAgIHsidmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIiwgIlZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5In0sCisgICAgeyJ2a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwiLCAiVktfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkifSwKKyAgICB7InZrU2V0TG9jYWxEaW1taW5nQU1EIiwgIlZLX0FNRF9kaXNwbGF5X25hdGl2ZV9oZHIifSwKKyAgICB7InZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIsICJWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzIn0sCisgICAgeyJ2a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIsICJWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlIn0sCisgICAgeyJ2a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCIsICJWS19FWFRfZnVsbF9zY3JlZW5fZXhjbHVzaXZlIn0sCisgICAgeyJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiLCAiVktfRVhUX2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSJ9LAorICAgIHsidmtDbWRTZXRMaW5lU3RpcHBsZUVYVCIsICJWS19FWFRfbGluZV9yYXN0ZXJpemF0aW9uIn0sCisgICAgeyJ2a1Jlc2V0UXVlcnlQb29sRVhUIiwgIlZLX0VYVF9ob3N0X3F1ZXJ5X3Jlc2V0In0sCit9OworCisvLyBVc2luZyB0aGUgYWJvdmUgY29kZS1nZW5lcmF0ZWQgbWFwIG9mIEFQSU5hbWVzLXRvLXBhcmVudCBleHRlbnNpb24gbmFtZXMsIHRoaXMgZnVuY3Rpb24gd2lsbDoKKy8vICAgbyAgRGV0ZXJtaW5lIGlmIHRoZSBBUEkgaGFzIGFuIGFzc29jaWF0ZWQgZXh0ZW5zaW9uCisvLyAgIG8gIElmIGl0IGRvZXMsIGRldGVybWluZSBpZiB0aGF0IGV4dGVuc2lvbiBuYW1lIGlzIHByZXNlbnQgaW4gdGhlIHBhc3NlZC1pbiBzZXQgb2YgZW5hYmxlZF9leHRfbmFtZXMgCisvLyAgIElmIHRoZSBBUEluYW1lIGhhcyBubyBwYXJlbnQgZXh0ZW5zaW9uLCBPUiBpdHMgcGFyZW50IGV4dGVuc2lvbiBuYW1lIGlzIElOIHRoZSBzZXQsIHJldHVybiBUUlVFLCBlbHNlIEZBTFNFCitzdGF0aWMgaW5saW5lIGJvb2wgQXBpUGFyZW50RXh0ZW5zaW9uRW5hYmxlZChjb25zdCBzdGQ6OnN0cmluZyBhcGlfbmFtZSwgY29uc3QgRGV2aWNlRXh0ZW5zaW9ucyAqZGV2aWNlX2V4dGVuc2lvbl9pbmZvKSB7CisgICAgYXV0byBoYXNfZXh0ID0gYXBpX2V4dGVuc2lvbl9tYXAuZmluZChhcGlfbmFtZSk7CisgICAgLy8gSXMgdGhpcyBBUEkgcGFydCBvZiBhbiBleHRlbnNpb24gb3IgZmVhdHVyZSBncm91cD8KKyAgICBpZiAoaGFzX2V4dCAhPSBhcGlfZXh0ZW5zaW9uX21hcC5lbmQoKSkgeworICAgICAgICAvLyBXYXMgdGhlIGV4dGVuc2lvbiBmb3IgdGhpcyBBUEkgZW5hYmxlZCBpbiB0aGUgQ3JlYXRlRGV2aWNlIGNhbGw/CisgICAgICAgIGF1dG8gaW5mbyA9IGRldmljZV9leHRlbnNpb25faW5mby0+Z2V0X2luZm8oaGFzX2V4dC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgICBpZiAoKCFpbmZvLnN0YXRlKSB8fCAoZGV2aWNlX2V4dGVuc2lvbl9pbmZvLT4qKGluZm8uc3RhdGUpICE9IGtFbmFibGVkQnlDcmVhdGVpbmZvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKKworc3RhdGljIGlubGluZSB2b2lkIGxheWVyX2luaXRfZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKFZrRGV2aWNlIGRldmljZSwgVmtMYXllckRpc3BhdGNoVGFibGUgKnRhYmxlLCBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBncGEpIHsKKyAgICBtZW1zZXQodGFibGUsIDAsIHNpemVvZigqdGFibGUpKTsKKyAgICAvLyBEZXZpY2UgZnVuY3Rpb24gcG9pbnRlcnMKKyAgICB0YWJsZS0+R2V0RGV2aWNlUHJvY0FkZHIgPSBncGE7CisgICAgdGFibGUtPkRlc3Ryb3lEZXZpY2UgPSAoUEZOX3ZrRGVzdHJveURldmljZSkgZ3BhKGRldmljZSwgInZrRGVzdHJveURldmljZSIpOworICAgIHRhYmxlLT5HZXREZXZpY2VRdWV1ZSA9IChQRk5fdmtHZXREZXZpY2VRdWV1ZSkgZ3BhKGRldmljZSwgInZrR2V0RGV2aWNlUXVldWUiKTsKKyAgICB0YWJsZS0+UXVldWVTdWJtaXQgPSAoUEZOX3ZrUXVldWVTdWJtaXQpIGdwYShkZXZpY2UsICJ2a1F1ZXVlU3VibWl0Iik7CisgICAgdGFibGUtPlF1ZXVlV2FpdElkbGUgPSAoUEZOX3ZrUXVldWVXYWl0SWRsZSkgZ3BhKGRldmljZSwgInZrUXVldWVXYWl0SWRsZSIpOworICAgIHRhYmxlLT5EZXZpY2VXYWl0SWRsZSA9IChQRk5fdmtEZXZpY2VXYWl0SWRsZSkgZ3BhKGRldmljZSwgInZrRGV2aWNlV2FpdElkbGUiKTsKKyAgICB0YWJsZS0+QWxsb2NhdGVNZW1vcnkgPSAoUEZOX3ZrQWxsb2NhdGVNZW1vcnkpIGdwYShkZXZpY2UsICJ2a0FsbG9jYXRlTWVtb3J5Iik7CisgICAgdGFibGUtPkZyZWVNZW1vcnkgPSAoUEZOX3ZrRnJlZU1lbW9yeSkgZ3BhKGRldmljZSwgInZrRnJlZU1lbW9yeSIpOworICAgIHRhYmxlLT5NYXBNZW1vcnkgPSAoUEZOX3ZrTWFwTWVtb3J5KSBncGEoZGV2aWNlLCAidmtNYXBNZW1vcnkiKTsKKyAgICB0YWJsZS0+VW5tYXBNZW1vcnkgPSAoUEZOX3ZrVW5tYXBNZW1vcnkpIGdwYShkZXZpY2UsICJ2a1VubWFwTWVtb3J5Iik7CisgICAgdGFibGUtPkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzID0gKFBGTl92a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKSBncGEoZGV2aWNlLCAidmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyIpOworICAgIHRhYmxlLT5JbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzID0gKFBGTl92a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMpIGdwYShkZXZpY2UsICJ2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMiKTsKKyAgICB0YWJsZS0+R2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCA9IChQRk5fdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50KSBncGEoZGV2aWNlLCAidmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50Iik7CisgICAgdGFibGUtPkJpbmRCdWZmZXJNZW1vcnkgPSAoUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeSkgZ3BhKGRldmljZSwgInZrQmluZEJ1ZmZlck1lbW9yeSIpOworICAgIHRhYmxlLT5CaW5kSW1hZ2VNZW1vcnkgPSAoUEZOX3ZrQmluZEltYWdlTWVtb3J5KSBncGEoZGV2aWNlLCAidmtCaW5kSW1hZ2VNZW1vcnkiKTsKKyAgICB0YWJsZS0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzID0gKFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cykgZ3BhKGRldmljZSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIik7CisgICAgdGFibGUtPkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzID0gKFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKSBncGEoZGV2aWNlLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyIpOworICAgIHRhYmxlLT5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyA9IChQRk5fdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgZ3BhKGRldmljZSwgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMiKTsKKyAgICB0YWJsZS0+UXVldWVCaW5kU3BhcnNlID0gKFBGTl92a1F1ZXVlQmluZFNwYXJzZSkgZ3BhKGRldmljZSwgInZrUXVldWVCaW5kU3BhcnNlIik7CisgICAgdGFibGUtPkNyZWF0ZUZlbmNlID0gKFBGTl92a0NyZWF0ZUZlbmNlKSBncGEoZGV2aWNlLCAidmtDcmVhdGVGZW5jZSIpOworICAgIHRhYmxlLT5EZXN0cm95RmVuY2UgPSAoUEZOX3ZrRGVzdHJveUZlbmNlKSBncGEoZGV2aWNlLCAidmtEZXN0cm95RmVuY2UiKTsKKyAgICB0YWJsZS0+UmVzZXRGZW5jZXMgPSAoUEZOX3ZrUmVzZXRGZW5jZXMpIGdwYShkZXZpY2UsICJ2a1Jlc2V0RmVuY2VzIik7CisgICAgdGFibGUtPkdldEZlbmNlU3RhdHVzID0gKFBGTl92a0dldEZlbmNlU3RhdHVzKSBncGEoZGV2aWNlLCAidmtHZXRGZW5jZVN0YXR1cyIpOworICAgIHRhYmxlLT5XYWl0Rm9yRmVuY2VzID0gKFBGTl92a1dhaXRGb3JGZW5jZXMpIGdwYShkZXZpY2UsICJ2a1dhaXRGb3JGZW5jZXMiKTsKKyAgICB0YWJsZS0+Q3JlYXRlU2VtYXBob3JlID0gKFBGTl92a0NyZWF0ZVNlbWFwaG9yZSkgZ3BhKGRldmljZSwgInZrQ3JlYXRlU2VtYXBob3JlIik7CisgICAgdGFibGUtPkRlc3Ryb3lTZW1hcGhvcmUgPSAoUEZOX3ZrRGVzdHJveVNlbWFwaG9yZSkgZ3BhKGRldmljZSwgInZrRGVzdHJveVNlbWFwaG9yZSIpOworICAgIHRhYmxlLT5DcmVhdGVFdmVudCA9IChQRk5fdmtDcmVhdGVFdmVudCkgZ3BhKGRldmljZSwgInZrQ3JlYXRlRXZlbnQiKTsKKyAgICB0YWJsZS0+RGVzdHJveUV2ZW50ID0gKFBGTl92a0Rlc3Ryb3lFdmVudCkgZ3BhKGRldmljZSwgInZrRGVzdHJveUV2ZW50Iik7CisgICAgdGFibGUtPkdldEV2ZW50U3RhdHVzID0gKFBGTl92a0dldEV2ZW50U3RhdHVzKSBncGEoZGV2aWNlLCAidmtHZXRFdmVudFN0YXR1cyIpOworICAgIHRhYmxlLT5TZXRFdmVudCA9IChQRk5fdmtTZXRFdmVudCkgZ3BhKGRldmljZSwgInZrU2V0RXZlbnQiKTsKKyAgICB0YWJsZS0+UmVzZXRFdmVudCA9IChQRk5fdmtSZXNldEV2ZW50KSBncGEoZGV2aWNlLCAidmtSZXNldEV2ZW50Iik7CisgICAgdGFibGUtPkNyZWF0ZVF1ZXJ5UG9vbCA9IChQRk5fdmtDcmVhdGVRdWVyeVBvb2wpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZVF1ZXJ5UG9vbCIpOworICAgIHRhYmxlLT5EZXN0cm95UXVlcnlQb29sID0gKFBGTl92a0Rlc3Ryb3lRdWVyeVBvb2wpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lRdWVyeVBvb2wiKTsKKyAgICB0YWJsZS0+R2V0UXVlcnlQb29sUmVzdWx0cyA9IChQRk5fdmtHZXRRdWVyeVBvb2xSZXN1bHRzKSBncGEoZGV2aWNlLCAidmtHZXRRdWVyeVBvb2xSZXN1bHRzIik7CisgICAgdGFibGUtPkNyZWF0ZUJ1ZmZlciA9IChQRk5fdmtDcmVhdGVCdWZmZXIpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZUJ1ZmZlciIpOworICAgIHRhYmxlLT5EZXN0cm95QnVmZmVyID0gKFBGTl92a0Rlc3Ryb3lCdWZmZXIpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlQnVmZmVyVmlldyA9IChQRk5fdmtDcmVhdGVCdWZmZXJWaWV3KSBncGEoZGV2aWNlLCAidmtDcmVhdGVCdWZmZXJWaWV3Iik7CisgICAgdGFibGUtPkRlc3Ryb3lCdWZmZXJWaWV3ID0gKFBGTl92a0Rlc3Ryb3lCdWZmZXJWaWV3KSBncGEoZGV2aWNlLCAidmtEZXN0cm95QnVmZmVyVmlldyIpOworICAgIHRhYmxlLT5DcmVhdGVJbWFnZSA9IChQRk5fdmtDcmVhdGVJbWFnZSkgZ3BhKGRldmljZSwgInZrQ3JlYXRlSW1hZ2UiKTsKKyAgICB0YWJsZS0+RGVzdHJveUltYWdlID0gKFBGTl92a0Rlc3Ryb3lJbWFnZSkgZ3BhKGRldmljZSwgInZrRGVzdHJveUltYWdlIik7CisgICAgdGFibGUtPkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQgPSAoUEZOX3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCkgZ3BhKGRldmljZSwgInZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCIpOworICAgIHRhYmxlLT5DcmVhdGVJbWFnZVZpZXcgPSAoUEZOX3ZrQ3JlYXRlSW1hZ2VWaWV3KSBncGEoZGV2aWNlLCAidmtDcmVhdGVJbWFnZVZpZXciKTsKKyAgICB0YWJsZS0+RGVzdHJveUltYWdlVmlldyA9IChQRk5fdmtEZXN0cm95SW1hZ2VWaWV3KSBncGEoZGV2aWNlLCAidmtEZXN0cm95SW1hZ2VWaWV3Iik7CisgICAgdGFibGUtPkNyZWF0ZVNoYWRlck1vZHVsZSA9IChQRk5fdmtDcmVhdGVTaGFkZXJNb2R1bGUpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZVNoYWRlck1vZHVsZSIpOworICAgIHRhYmxlLT5EZXN0cm95U2hhZGVyTW9kdWxlID0gKFBGTl92a0Rlc3Ryb3lTaGFkZXJNb2R1bGUpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUiKTsKKyAgICB0YWJsZS0+Q3JlYXRlUGlwZWxpbmVDYWNoZSA9IChQRk5fdmtDcmVhdGVQaXBlbGluZUNhY2hlKSBncGEoZGV2aWNlLCAidmtDcmVhdGVQaXBlbGluZUNhY2hlIik7CisgICAgdGFibGUtPkRlc3Ryb3lQaXBlbGluZUNhY2hlID0gKFBGTl92a0Rlc3Ryb3lQaXBlbGluZUNhY2hlKSBncGEoZGV2aWNlLCAidmtEZXN0cm95UGlwZWxpbmVDYWNoZSIpOworICAgIHRhYmxlLT5HZXRQaXBlbGluZUNhY2hlRGF0YSA9IChQRk5fdmtHZXRQaXBlbGluZUNhY2hlRGF0YSkgZ3BhKGRldmljZSwgInZrR2V0UGlwZWxpbmVDYWNoZURhdGEiKTsKKyAgICB0YWJsZS0+TWVyZ2VQaXBlbGluZUNhY2hlcyA9IChQRk5fdmtNZXJnZVBpcGVsaW5lQ2FjaGVzKSBncGEoZGV2aWNlLCAidmtNZXJnZVBpcGVsaW5lQ2FjaGVzIik7CisgICAgdGFibGUtPkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzID0gKFBGTl92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKSBncGEoZGV2aWNlLCAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIpOworICAgIHRhYmxlLT5DcmVhdGVDb21wdXRlUGlwZWxpbmVzID0gKFBGTl92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMiKTsKKyAgICB0YWJsZS0+RGVzdHJveVBpcGVsaW5lID0gKFBGTl92a0Rlc3Ryb3lQaXBlbGluZSkgZ3BhKGRldmljZSwgInZrRGVzdHJveVBpcGVsaW5lIik7CisgICAgdGFibGUtPkNyZWF0ZVBpcGVsaW5lTGF5b3V0ID0gKFBGTl92a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KSBncGEoZGV2aWNlLCAidmtDcmVhdGVQaXBlbGluZUxheW91dCIpOworICAgIHRhYmxlLT5EZXN0cm95UGlwZWxpbmVMYXlvdXQgPSAoUEZOX3ZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KSBncGEoZGV2aWNlLCAidmtEZXN0cm95UGlwZWxpbmVMYXlvdXQiKTsKKyAgICB0YWJsZS0+Q3JlYXRlU2FtcGxlciA9IChQRk5fdmtDcmVhdGVTYW1wbGVyKSBncGEoZGV2aWNlLCAidmtDcmVhdGVTYW1wbGVyIik7CisgICAgdGFibGUtPkRlc3Ryb3lTYW1wbGVyID0gKFBGTl92a0Rlc3Ryb3lTYW1wbGVyKSBncGEoZGV2aWNlLCAidmtEZXN0cm95U2FtcGxlciIpOworICAgIHRhYmxlLT5DcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0ID0gKFBGTl92a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQiKTsKKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQgPSAoUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0Iik7CisgICAgdGFibGUtPkNyZWF0ZURlc2NyaXB0b3JQb29sID0gKFBGTl92a0NyZWF0ZURlc2NyaXB0b3JQb29sKSBncGEoZGV2aWNlLCAidmtDcmVhdGVEZXNjcmlwdG9yUG9vbCIpOworICAgIHRhYmxlLT5EZXN0cm95RGVzY3JpcHRvclBvb2wgPSAoUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JQb29sKSBncGEoZGV2aWNlLCAidmtEZXN0cm95RGVzY3JpcHRvclBvb2wiKTsKKyAgICB0YWJsZS0+UmVzZXREZXNjcmlwdG9yUG9vbCA9IChQRk5fdmtSZXNldERlc2NyaXB0b3JQb29sKSBncGEoZGV2aWNlLCAidmtSZXNldERlc2NyaXB0b3JQb29sIik7CisgICAgdGFibGUtPkFsbG9jYXRlRGVzY3JpcHRvclNldHMgPSAoUEZOX3ZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cykgZ3BhKGRldmljZSwgInZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyIpOworICAgIHRhYmxlLT5GcmVlRGVzY3JpcHRvclNldHMgPSAoUEZOX3ZrRnJlZURlc2NyaXB0b3JTZXRzKSBncGEoZGV2aWNlLCAidmtGcmVlRGVzY3JpcHRvclNldHMiKTsKKyAgICB0YWJsZS0+VXBkYXRlRGVzY3JpcHRvclNldHMgPSAoUEZOX3ZrVXBkYXRlRGVzY3JpcHRvclNldHMpIGdwYShkZXZpY2UsICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRzIik7CisgICAgdGFibGUtPkNyZWF0ZUZyYW1lYnVmZmVyID0gKFBGTl92a0NyZWF0ZUZyYW1lYnVmZmVyKSBncGEoZGV2aWNlLCAidmtDcmVhdGVGcmFtZWJ1ZmZlciIpOworICAgIHRhYmxlLT5EZXN0cm95RnJhbWVidWZmZXIgPSAoUEZOX3ZrRGVzdHJveUZyYW1lYnVmZmVyKSBncGEoZGV2aWNlLCAidmtEZXN0cm95RnJhbWVidWZmZXIiKTsKKyAgICB0YWJsZS0+Q3JlYXRlUmVuZGVyUGFzcyA9IChQRk5fdmtDcmVhdGVSZW5kZXJQYXNzKSBncGEoZGV2aWNlLCAidmtDcmVhdGVSZW5kZXJQYXNzIik7CisgICAgdGFibGUtPkRlc3Ryb3lSZW5kZXJQYXNzID0gKFBGTl92a0Rlc3Ryb3lSZW5kZXJQYXNzKSBncGEoZGV2aWNlLCAidmtEZXN0cm95UmVuZGVyUGFzcyIpOworICAgIHRhYmxlLT5HZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkgPSAoUEZOX3ZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5KSBncGEoZGV2aWNlLCAidmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkiKTsKKyAgICB0YWJsZS0+Q3JlYXRlQ29tbWFuZFBvb2wgPSAoUEZOX3ZrQ3JlYXRlQ29tbWFuZFBvb2wpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZUNvbW1hbmRQb29sIik7CisgICAgdGFibGUtPkRlc3Ryb3lDb21tYW5kUG9vbCA9IChQRk5fdmtEZXN0cm95Q29tbWFuZFBvb2wpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lDb21tYW5kUG9vbCIpOworICAgIHRhYmxlLT5SZXNldENvbW1hbmRQb29sID0gKFBGTl92a1Jlc2V0Q29tbWFuZFBvb2wpIGdwYShkZXZpY2UsICJ2a1Jlc2V0Q29tbWFuZFBvb2wiKTsKKyAgICB0YWJsZS0+QWxsb2NhdGVDb21tYW5kQnVmZmVycyA9IChQRk5fdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKSBncGEoZGV2aWNlLCAidmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzIik7CisgICAgdGFibGUtPkZyZWVDb21tYW5kQnVmZmVycyA9IChQRk5fdmtGcmVlQ29tbWFuZEJ1ZmZlcnMpIGdwYShkZXZpY2UsICJ2a0ZyZWVDb21tYW5kQnVmZmVycyIpOworICAgIHRhYmxlLT5CZWdpbkNvbW1hbmRCdWZmZXIgPSAoUEZOX3ZrQmVnaW5Db21tYW5kQnVmZmVyKSBncGEoZGV2aWNlLCAidmtCZWdpbkNvbW1hbmRCdWZmZXIiKTsKKyAgICB0YWJsZS0+RW5kQ29tbWFuZEJ1ZmZlciA9IChQRk5fdmtFbmRDb21tYW5kQnVmZmVyKSBncGEoZGV2aWNlLCAidmtFbmRDb21tYW5kQnVmZmVyIik7CisgICAgdGFibGUtPlJlc2V0Q29tbWFuZEJ1ZmZlciA9IChQRk5fdmtSZXNldENvbW1hbmRCdWZmZXIpIGdwYShkZXZpY2UsICJ2a1Jlc2V0Q29tbWFuZEJ1ZmZlciIpOworICAgIHRhYmxlLT5DbWRCaW5kUGlwZWxpbmUgPSAoUEZOX3ZrQ21kQmluZFBpcGVsaW5lKSBncGEoZGV2aWNlLCAidmtDbWRCaW5kUGlwZWxpbmUiKTsKKyAgICB0YWJsZS0+Q21kU2V0Vmlld3BvcnQgPSAoUEZOX3ZrQ21kU2V0Vmlld3BvcnQpIGdwYShkZXZpY2UsICJ2a0NtZFNldFZpZXdwb3J0Iik7CisgICAgdGFibGUtPkNtZFNldFNjaXNzb3IgPSAoUEZOX3ZrQ21kU2V0U2Npc3NvcikgZ3BhKGRldmljZSwgInZrQ21kU2V0U2Npc3NvciIpOworICAgIHRhYmxlLT5DbWRTZXRMaW5lV2lkdGggPSAoUEZOX3ZrQ21kU2V0TGluZVdpZHRoKSBncGEoZGV2aWNlLCAidmtDbWRTZXRMaW5lV2lkdGgiKTsKKyAgICB0YWJsZS0+Q21kU2V0RGVwdGhCaWFzID0gKFBGTl92a0NtZFNldERlcHRoQmlhcykgZ3BhKGRldmljZSwgInZrQ21kU2V0RGVwdGhCaWFzIik7CisgICAgdGFibGUtPkNtZFNldEJsZW5kQ29uc3RhbnRzID0gKFBGTl92a0NtZFNldEJsZW5kQ29uc3RhbnRzKSBncGEoZGV2aWNlLCAidmtDbWRTZXRCbGVuZENvbnN0YW50cyIpOworICAgIHRhYmxlLT5DbWRTZXREZXB0aEJvdW5kcyA9IChQRk5fdmtDbWRTZXREZXB0aEJvdW5kcykgZ3BhKGRldmljZSwgInZrQ21kU2V0RGVwdGhCb3VuZHMiKTsKKyAgICB0YWJsZS0+Q21kU2V0U3RlbmNpbENvbXBhcmVNYXNrID0gKFBGTl92a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzaykgZ3BhKGRldmljZSwgInZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrIik7CisgICAgdGFibGUtPkNtZFNldFN0ZW5jaWxXcml0ZU1hc2sgPSAoUEZOX3ZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzaykgZ3BhKGRldmljZSwgInZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayIpOworICAgIHRhYmxlLT5DbWRTZXRTdGVuY2lsUmVmZXJlbmNlID0gKFBGTl92a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UpIGdwYShkZXZpY2UsICJ2a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UiKTsKKyAgICB0YWJsZS0+Q21kQmluZERlc2NyaXB0b3JTZXRzID0gKFBGTl92a0NtZEJpbmREZXNjcmlwdG9yU2V0cykgZ3BhKGRldmljZSwgInZrQ21kQmluZERlc2NyaXB0b3JTZXRzIik7CisgICAgdGFibGUtPkNtZEJpbmRJbmRleEJ1ZmZlciA9IChQRk5fdmtDbWRCaW5kSW5kZXhCdWZmZXIpIGdwYShkZXZpY2UsICJ2a0NtZEJpbmRJbmRleEJ1ZmZlciIpOworICAgIHRhYmxlLT5DbWRCaW5kVmVydGV4QnVmZmVycyA9IChQRk5fdmtDbWRCaW5kVmVydGV4QnVmZmVycykgZ3BhKGRldmljZSwgInZrQ21kQmluZFZlcnRleEJ1ZmZlcnMiKTsKKyAgICB0YWJsZS0+Q21kRHJhdyA9IChQRk5fdmtDbWREcmF3KSBncGEoZGV2aWNlLCAidmtDbWREcmF3Iik7CisgICAgdGFibGUtPkNtZERyYXdJbmRleGVkID0gKFBGTl92a0NtZERyYXdJbmRleGVkKSBncGEoZGV2aWNlLCAidmtDbWREcmF3SW5kZXhlZCIpOworICAgIHRhYmxlLT5DbWREcmF3SW5kaXJlY3QgPSAoUEZOX3ZrQ21kRHJhd0luZGlyZWN0KSBncGEoZGV2aWNlLCAidmtDbWREcmF3SW5kaXJlY3QiKTsKKyAgICB0YWJsZS0+Q21kRHJhd0luZGV4ZWRJbmRpcmVjdCA9IChQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KSBncGEoZGV2aWNlLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Iik7CisgICAgdGFibGUtPkNtZERpc3BhdGNoID0gKFBGTl92a0NtZERpc3BhdGNoKSBncGEoZGV2aWNlLCAidmtDbWREaXNwYXRjaCIpOworICAgIHRhYmxlLT5DbWREaXNwYXRjaEluZGlyZWN0ID0gKFBGTl92a0NtZERpc3BhdGNoSW5kaXJlY3QpIGdwYShkZXZpY2UsICJ2a0NtZERpc3BhdGNoSW5kaXJlY3QiKTsKKyAgICB0YWJsZS0+Q21kQ29weUJ1ZmZlciA9IChQRk5fdmtDbWRDb3B5QnVmZmVyKSBncGEoZGV2aWNlLCAidmtDbWRDb3B5QnVmZmVyIik7CisgICAgdGFibGUtPkNtZENvcHlJbWFnZSA9IChQRk5fdmtDbWRDb3B5SW1hZ2UpIGdwYShkZXZpY2UsICJ2a0NtZENvcHlJbWFnZSIpOworICAgIHRhYmxlLT5DbWRCbGl0SW1hZ2UgPSAoUEZOX3ZrQ21kQmxpdEltYWdlKSBncGEoZGV2aWNlLCAidmtDbWRCbGl0SW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQ29weUJ1ZmZlclRvSW1hZ2UgPSAoUEZOX3ZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UpIGdwYShkZXZpY2UsICJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlIik7CisgICAgdGFibGUtPkNtZENvcHlJbWFnZVRvQnVmZmVyID0gKFBGTl92a0NtZENvcHlJbWFnZVRvQnVmZmVyKSBncGEoZGV2aWNlLCAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciIpOworICAgIHRhYmxlLT5DbWRVcGRhdGVCdWZmZXIgPSAoUEZOX3ZrQ21kVXBkYXRlQnVmZmVyKSBncGEoZGV2aWNlLCAidmtDbWRVcGRhdGVCdWZmZXIiKTsKKyAgICB0YWJsZS0+Q21kRmlsbEJ1ZmZlciA9IChQRk5fdmtDbWRGaWxsQnVmZmVyKSBncGEoZGV2aWNlLCAidmtDbWRGaWxsQnVmZmVyIik7CisgICAgdGFibGUtPkNtZENsZWFyQ29sb3JJbWFnZSA9IChQRk5fdmtDbWRDbGVhckNvbG9ySW1hZ2UpIGdwYShkZXZpY2UsICJ2a0NtZENsZWFyQ29sb3JJbWFnZSIpOworICAgIHRhYmxlLT5DbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlID0gKFBGTl92a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UpIGdwYShkZXZpY2UsICJ2a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UiKTsKKyAgICB0YWJsZS0+Q21kQ2xlYXJBdHRhY2htZW50cyA9IChQRk5fdmtDbWRDbGVhckF0dGFjaG1lbnRzKSBncGEoZGV2aWNlLCAidmtDbWRDbGVhckF0dGFjaG1lbnRzIik7CisgICAgdGFibGUtPkNtZFJlc29sdmVJbWFnZSA9IChQRk5fdmtDbWRSZXNvbHZlSW1hZ2UpIGdwYShkZXZpY2UsICJ2a0NtZFJlc29sdmVJbWFnZSIpOworICAgIHRhYmxlLT5DbWRTZXRFdmVudCA9IChQRk5fdmtDbWRTZXRFdmVudCkgZ3BhKGRldmljZSwgInZrQ21kU2V0RXZlbnQiKTsKKyAgICB0YWJsZS0+Q21kUmVzZXRFdmVudCA9IChQRk5fdmtDbWRSZXNldEV2ZW50KSBncGEoZGV2aWNlLCAidmtDbWRSZXNldEV2ZW50Iik7CisgICAgdGFibGUtPkNtZFdhaXRFdmVudHMgPSAoUEZOX3ZrQ21kV2FpdEV2ZW50cykgZ3BhKGRldmljZSwgInZrQ21kV2FpdEV2ZW50cyIpOworICAgIHRhYmxlLT5DbWRQaXBlbGluZUJhcnJpZXIgPSAoUEZOX3ZrQ21kUGlwZWxpbmVCYXJyaWVyKSBncGEoZGV2aWNlLCAidmtDbWRQaXBlbGluZUJhcnJpZXIiKTsKKyAgICB0YWJsZS0+Q21kQmVnaW5RdWVyeSA9IChQRk5fdmtDbWRCZWdpblF1ZXJ5KSBncGEoZGV2aWNlLCAidmtDbWRCZWdpblF1ZXJ5Iik7CisgICAgdGFibGUtPkNtZEVuZFF1ZXJ5ID0gKFBGTl92a0NtZEVuZFF1ZXJ5KSBncGEoZGV2aWNlLCAidmtDbWRFbmRRdWVyeSIpOworICAgIHRhYmxlLT5DbWRSZXNldFF1ZXJ5UG9vbCA9IChQRk5fdmtDbWRSZXNldFF1ZXJ5UG9vbCkgZ3BhKGRldmljZSwgInZrQ21kUmVzZXRRdWVyeVBvb2wiKTsKKyAgICB0YWJsZS0+Q21kV3JpdGVUaW1lc3RhbXAgPSAoUEZOX3ZrQ21kV3JpdGVUaW1lc3RhbXApIGdwYShkZXZpY2UsICJ2a0NtZFdyaXRlVGltZXN0YW1wIik7CisgICAgdGFibGUtPkNtZENvcHlRdWVyeVBvb2xSZXN1bHRzID0gKFBGTl92a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzKSBncGEoZGV2aWNlLCAidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIpOworICAgIHRhYmxlLT5DbWRQdXNoQ29uc3RhbnRzID0gKFBGTl92a0NtZFB1c2hDb25zdGFudHMpIGdwYShkZXZpY2UsICJ2a0NtZFB1c2hDb25zdGFudHMiKTsKKyAgICB0YWJsZS0+Q21kQmVnaW5SZW5kZXJQYXNzID0gKFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzcykgZ3BhKGRldmljZSwgInZrQ21kQmVnaW5SZW5kZXJQYXNzIik7CisgICAgdGFibGUtPkNtZE5leHRTdWJwYXNzID0gKFBGTl92a0NtZE5leHRTdWJwYXNzKSBncGEoZGV2aWNlLCAidmtDbWROZXh0U3VicGFzcyIpOworICAgIHRhYmxlLT5DbWRFbmRSZW5kZXJQYXNzID0gKFBGTl92a0NtZEVuZFJlbmRlclBhc3MpIGdwYShkZXZpY2UsICJ2a0NtZEVuZFJlbmRlclBhc3MiKTsKKyAgICB0YWJsZS0+Q21kRXhlY3V0ZUNvbW1hbmRzID0gKFBGTl92a0NtZEV4ZWN1dGVDb21tYW5kcykgZ3BhKGRldmljZSwgInZrQ21kRXhlY3V0ZUNvbW1hbmRzIik7CisgICAgdGFibGUtPkJpbmRCdWZmZXJNZW1vcnkyID0gKFBGTl92a0JpbmRCdWZmZXJNZW1vcnkyKSBncGEoZGV2aWNlLCAidmtCaW5kQnVmZmVyTWVtb3J5MiIpOworICAgIGlmICh0YWJsZS0+QmluZEJ1ZmZlck1lbW9yeTIgPT0gbnVsbHB0cikgeyB0YWJsZS0+QmluZEJ1ZmZlck1lbW9yeTIgPSAoUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTIpU3R1YkJpbmRCdWZmZXJNZW1vcnkyOyB9CisgICAgdGFibGUtPkJpbmRJbWFnZU1lbW9yeTIgPSAoUEZOX3ZrQmluZEltYWdlTWVtb3J5MikgZ3BhKGRldmljZSwgInZrQmluZEltYWdlTWVtb3J5MiIpOworICAgIGlmICh0YWJsZS0+QmluZEltYWdlTWVtb3J5MiA9PSBudWxscHRyKSB7IHRhYmxlLT5CaW5kSW1hZ2VNZW1vcnkyID0gKFBGTl92a0JpbmRJbWFnZU1lbW9yeTIpU3R1YkJpbmRJbWFnZU1lbW9yeTI7IH0KKyAgICB0YWJsZS0+R2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMpIGdwYShkZXZpY2UsICJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzIik7CisgICAgaWYgKHRhYmxlLT5HZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcyA9IChQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcylTdHViR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXM7IH0KKyAgICB0YWJsZS0+Q21kU2V0RGV2aWNlTWFzayA9IChQRk5fdmtDbWRTZXREZXZpY2VNYXNrKSBncGEoZGV2aWNlLCAidmtDbWRTZXREZXZpY2VNYXNrIik7CisgICAgaWYgKHRhYmxlLT5DbWRTZXREZXZpY2VNYXNrID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldERldmljZU1hc2sgPSAoUEZOX3ZrQ21kU2V0RGV2aWNlTWFzaylTdHViQ21kU2V0RGV2aWNlTWFzazsgfQorICAgIHRhYmxlLT5DbWREaXNwYXRjaEJhc2UgPSAoUEZOX3ZrQ21kRGlzcGF0Y2hCYXNlKSBncGEoZGV2aWNlLCAidmtDbWREaXNwYXRjaEJhc2UiKTsKKyAgICBpZiAodGFibGUtPkNtZERpc3BhdGNoQmFzZSA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWREaXNwYXRjaEJhc2UgPSAoUEZOX3ZrQ21kRGlzcGF0Y2hCYXNlKVN0dWJDbWREaXNwYXRjaEJhc2U7IH0KKyAgICB0YWJsZS0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMikgZ3BhKGRldmljZSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIik7CisgICAgaWYgKHRhYmxlLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMilTdHViR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyOyB9CisgICAgdGFibGUtPkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIgPSAoUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMikgZ3BhKGRldmljZSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiIpOworICAgIGlmICh0YWJsZS0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIpU3R1YkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czI7IH0KKyAgICB0YWJsZS0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMikgZ3BhKGRldmljZSwgInZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyIik7CisgICAgaWYgKHRhYmxlLT5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyID0gKFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMilTdHViR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyOyB9CisgICAgdGFibGUtPlRyaW1Db21tYW5kUG9vbCA9IChQRk5fdmtUcmltQ29tbWFuZFBvb2wpIGdwYShkZXZpY2UsICJ2a1RyaW1Db21tYW5kUG9vbCIpOworICAgIGlmICh0YWJsZS0+VHJpbUNvbW1hbmRQb29sID09IG51bGxwdHIpIHsgdGFibGUtPlRyaW1Db21tYW5kUG9vbCA9IChQRk5fdmtUcmltQ29tbWFuZFBvb2wpU3R1YlRyaW1Db21tYW5kUG9vbDsgfQorICAgIHRhYmxlLT5HZXREZXZpY2VRdWV1ZTIgPSAoUEZOX3ZrR2V0RGV2aWNlUXVldWUyKSBncGEoZGV2aWNlLCAidmtHZXREZXZpY2VRdWV1ZTIiKTsKKyAgICBpZiAodGFibGUtPkdldERldmljZVF1ZXVlMiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXREZXZpY2VRdWV1ZTIgPSAoUEZOX3ZrR2V0RGV2aWNlUXVldWUyKVN0dWJHZXREZXZpY2VRdWV1ZTI7IH0KKyAgICB0YWJsZS0+Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbiA9IChQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKSBncGEoZGV2aWNlLCAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24gPSAoUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbilTdHViQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsgfQorICAgIHRhYmxlLT5EZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiA9IChQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbikgZ3BhKGRldmljZSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24iKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uID09IG51bGxwdHIpIHsgdGFibGUtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gKFBGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKVN0dWJEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbjsgfQorICAgIHRhYmxlLT5DcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBncGEoZGV2aWNlLCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiKTsKKyAgICBpZiAodGFibGUtPkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9PSBudWxscHRyKSB7IHRhYmxlLT5DcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKVN0dWJDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7IH0KKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSBncGEoZGV2aWNlLCAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIik7CisgICAgaWYgKHRhYmxlLT5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID09IG51bGxwdHIpIHsgdGFibGUtPkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSAoUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSlTdHViRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsgfQorICAgIHRhYmxlLT5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlID0gKFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUpIGdwYShkZXZpY2UsICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUiKTsKKyAgICBpZiAodGFibGUtPlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUgPT0gbnVsbHB0cikgeyB0YWJsZS0+VXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZSA9IChQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKVN0dWJVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlOyB9CisgICAgdGFibGUtPkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0ID0gKFBGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KSBncGEoZGV2aWNlLCAidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCIpOworICAgIGlmICh0YWJsZS0+R2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgPSAoUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQpU3R1YkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0OyB9CisgICAgdGFibGUtPkNyZWF0ZVN3YXBjaGFpbktIUiA9IChQRk5fdmtDcmVhdGVTd2FwY2hhaW5LSFIpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIpOworICAgIGlmICh0YWJsZS0+Q3JlYXRlU3dhcGNoYWluS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZVN3YXBjaGFpbktIUiA9IChQRk5fdmtDcmVhdGVTd2FwY2hhaW5LSFIpU3R1YkNyZWF0ZVN3YXBjaGFpbktIUjsgfQorICAgIHRhYmxlLT5EZXN0cm95U3dhcGNoYWluS0hSID0gKFBGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFIpIGdwYShkZXZpY2UsICJ2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIiKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lTd2FwY2hhaW5LSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+RGVzdHJveVN3YXBjaGFpbktIUiA9IChQRk5fdmtEZXN0cm95U3dhcGNoYWluS0hSKVN0dWJEZXN0cm95U3dhcGNoYWluS0hSOyB9CisgICAgdGFibGUtPkdldFN3YXBjaGFpbkltYWdlc0tIUiA9IChQRk5fdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIpIGdwYShkZXZpY2UsICJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIpOworICAgIGlmICh0YWJsZS0+R2V0U3dhcGNoYWluSW1hZ2VzS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldFN3YXBjaGFpbkltYWdlc0tIUiA9IChQRk5fdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIpU3R1YkdldFN3YXBjaGFpbkltYWdlc0tIUjsgfQorICAgIHRhYmxlLT5BY3F1aXJlTmV4dEltYWdlS0hSID0gKFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIpIGdwYShkZXZpY2UsICJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiKTsKKyAgICBpZiAodGFibGUtPkFjcXVpcmVOZXh0SW1hZ2VLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+QWNxdWlyZU5leHRJbWFnZUtIUiA9IChQRk5fdmtBY3F1aXJlTmV4dEltYWdlS0hSKVN0dWJBY3F1aXJlTmV4dEltYWdlS0hSOyB9CisgICAgdGFibGUtPlF1ZXVlUHJlc2VudEtIUiA9IChQRk5fdmtRdWV1ZVByZXNlbnRLSFIpIGdwYShkZXZpY2UsICJ2a1F1ZXVlUHJlc2VudEtIUiIpOworICAgIGlmICh0YWJsZS0+UXVldWVQcmVzZW50S0hSID09IG51bGxwdHIpIHsgdGFibGUtPlF1ZXVlUHJlc2VudEtIUiA9IChQRk5fdmtRdWV1ZVByZXNlbnRLSFIpU3R1YlF1ZXVlUHJlc2VudEtIUjsgfQorICAgIHRhYmxlLT5HZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKSBncGEoZGV2aWNlLCAidmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKVN0dWJHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI7IH0KKyAgICB0YWJsZS0+R2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSID0gKFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUikgZ3BhKGRldmljZSwgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSID0gKFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUilTdHViR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSOyB9CisgICAgdGFibGUtPkFjcXVpcmVOZXh0SW1hZ2UyS0hSID0gKFBGTl92a0FjcXVpcmVOZXh0SW1hZ2UyS0hSKSBncGEoZGV2aWNlLCAidmtBY3F1aXJlTmV4dEltYWdlMktIUiIpOworICAgIGlmICh0YWJsZS0+QWNxdWlyZU5leHRJbWFnZTJLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+QWNxdWlyZU5leHRJbWFnZTJLSFIgPSAoUEZOX3ZrQWNxdWlyZU5leHRJbWFnZTJLSFIpU3R1YkFjcXVpcmVOZXh0SW1hZ2UyS0hSOyB9CisgICAgdGFibGUtPkNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIgPSAoUEZOX3ZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUikgZ3BhKGRldmljZSwgInZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiIpOworICAgIGlmICh0YWJsZS0+Q3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5DcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSID0gKFBGTl92a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIpU3R1YkNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFI7IH0KKyAgICB0YWJsZS0+R2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIgPSAoUEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIpIGdwYShkZXZpY2UsICJ2a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUiA9IChQRk5fdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlc0tIUilTdHViR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFI7IH0KKyAgICB0YWJsZS0+Q21kU2V0RGV2aWNlTWFza0tIUiA9IChQRk5fdmtDbWRTZXREZXZpY2VNYXNrS0hSKSBncGEoZGV2aWNlLCAidmtDbWRTZXREZXZpY2VNYXNrS0hSIik7CisgICAgaWYgKHRhYmxlLT5DbWRTZXREZXZpY2VNYXNrS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldERldmljZU1hc2tLSFIgPSAoUEZOX3ZrQ21kU2V0RGV2aWNlTWFza0tIUilTdHViQ21kU2V0RGV2aWNlTWFza0tIUjsgfQorICAgIHRhYmxlLT5DbWREaXNwYXRjaEJhc2VLSFIgPSAoUEZOX3ZrQ21kRGlzcGF0Y2hCYXNlS0hSKSBncGEoZGV2aWNlLCAidmtDbWREaXNwYXRjaEJhc2VLSFIiKTsKKyAgICBpZiAodGFibGUtPkNtZERpc3BhdGNoQmFzZUtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWREaXNwYXRjaEJhc2VLSFIgPSAoUEZOX3ZrQ21kRGlzcGF0Y2hCYXNlS0hSKVN0dWJDbWREaXNwYXRjaEJhc2VLSFI7IH0KKyAgICB0YWJsZS0+VHJpbUNvbW1hbmRQb29sS0hSID0gKFBGTl92a1RyaW1Db21tYW5kUG9vbEtIUikgZ3BhKGRldmljZSwgInZrVHJpbUNvbW1hbmRQb29sS0hSIik7CisgICAgaWYgKHRhYmxlLT5UcmltQ29tbWFuZFBvb2xLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+VHJpbUNvbW1hbmRQb29sS0hSID0gKFBGTl92a1RyaW1Db21tYW5kUG9vbEtIUilTdHViVHJpbUNvbW1hbmRQb29sS0hSOyB9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5HZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiA9IChQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUikgZ3BhKGRldmljZSwgInZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlS0hSID0gKFBGTl92a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSKVN0dWJHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUjsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIpIGdwYShkZXZpY2UsICJ2a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiIpOworICAgIGlmICh0YWJsZS0+R2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIpU3R1YkdldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUjsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0TWVtb3J5RmRLSFIgPSAoUEZOX3ZrR2V0TWVtb3J5RmRLSFIpIGdwYShkZXZpY2UsICJ2a0dldE1lbW9yeUZkS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRNZW1vcnlGZEtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRNZW1vcnlGZEtIUiA9IChQRk5fdmtHZXRNZW1vcnlGZEtIUilTdHViR2V0TWVtb3J5RmRLSFI7IH0KKyAgICB0YWJsZS0+R2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUikgZ3BhKGRldmljZSwgInZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldE1lbW9yeUZkUHJvcGVydGllc0tIUilTdHViR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSOyB9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5JbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiA9IChQRk5fdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUikgZ3BhKGRldmljZSwgInZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiKTsKKyAgICBpZiAodGFibGUtPkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSID0gKFBGTl92a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKVN0dWJJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUjsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSID0gKFBGTl92a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKSBncGEoZGV2aWNlLCAidmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIpOworICAgIGlmICh0YWJsZS0+R2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIpU3R1YkdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSOyB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5JbXBvcnRTZW1hcGhvcmVGZEtIUiA9IChQRk5fdmtJbXBvcnRTZW1hcGhvcmVGZEtIUikgZ3BhKGRldmljZSwgInZrSW1wb3J0U2VtYXBob3JlRmRLSFIiKTsKKyAgICBpZiAodGFibGUtPkltcG9ydFNlbWFwaG9yZUZkS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkltcG9ydFNlbWFwaG9yZUZkS0hSID0gKFBGTl92a0ltcG9ydFNlbWFwaG9yZUZkS0hSKVN0dWJJbXBvcnRTZW1hcGhvcmVGZEtIUjsgfQorICAgIHRhYmxlLT5HZXRTZW1hcGhvcmVGZEtIUiA9IChQRk5fdmtHZXRTZW1hcGhvcmVGZEtIUikgZ3BhKGRldmljZSwgInZrR2V0U2VtYXBob3JlRmRLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldFNlbWFwaG9yZUZkS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldFNlbWFwaG9yZUZkS0hSID0gKFBGTl92a0dldFNlbWFwaG9yZUZkS0hSKVN0dWJHZXRTZW1hcGhvcmVGZEtIUjsgfQorICAgIHRhYmxlLT5DbWRQdXNoRGVzY3JpcHRvclNldEtIUiA9IChQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUikgZ3BhKGRldmljZSwgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIiKTsKKyAgICBpZiAodGFibGUtPkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFB1c2hEZXNjcmlwdG9yU2V0S0hSID0gKFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKVN0dWJDbWRQdXNoRGVzY3JpcHRvclNldEtIUjsgfQorICAgIHRhYmxlLT5DbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiA9IChQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUikgZ3BhKGRldmljZSwgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiKTsKKyAgICBpZiAodGFibGUtPkNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0gKFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKVN0dWJDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUjsgfQorICAgIHRhYmxlLT5DcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPSAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKSBncGEoZGV2aWNlLCAidmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIiKTsKKyAgICBpZiAodGFibGUtPkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5DcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPSAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKVN0dWJDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFI7IH0KKyAgICB0YWJsZS0+RGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiA9IChQRk5fdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKSBncGEoZGV2aWNlLCAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIik7CisgICAgaWYgKHRhYmxlLT5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPSAoUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUilTdHViRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUjsgfQorICAgIHRhYmxlLT5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0gKFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIpIGdwYShkZXZpY2UsICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiKTsKKyAgICBpZiAodGFibGUtPlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+VXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiA9IChQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKVN0dWJVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSOyB9CisgICAgdGFibGUtPkNyZWF0ZVJlbmRlclBhc3MyS0hSID0gKFBGTl92a0NyZWF0ZVJlbmRlclBhc3MyS0hSKSBncGEoZGV2aWNlLCAidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIpOworICAgIGlmICh0YWJsZS0+Q3JlYXRlUmVuZGVyUGFzczJLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q3JlYXRlUmVuZGVyUGFzczJLSFIgPSAoUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzczJLSFIpU3R1YkNyZWF0ZVJlbmRlclBhc3MyS0hSOyB9CisgICAgdGFibGUtPkNtZEJlZ2luUmVuZGVyUGFzczJLSFIgPSAoUEZOX3ZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUikgZ3BhKGRldmljZSwgInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIpOworICAgIGlmICh0YWJsZS0+Q21kQmVnaW5SZW5kZXJQYXNzMktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRCZWdpblJlbmRlclBhc3MyS0hSID0gKFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIpU3R1YkNtZEJlZ2luUmVuZGVyUGFzczJLSFI7IH0KKyAgICB0YWJsZS0+Q21kTmV4dFN1YnBhc3MyS0hSID0gKFBGTl92a0NtZE5leHRTdWJwYXNzMktIUikgZ3BhKGRldmljZSwgInZrQ21kTmV4dFN1YnBhc3MyS0hSIik7CisgICAgaWYgKHRhYmxlLT5DbWROZXh0U3VicGFzczJLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kTmV4dFN1YnBhc3MyS0hSID0gKFBGTl92a0NtZE5leHRTdWJwYXNzMktIUilTdHViQ21kTmV4dFN1YnBhc3MyS0hSOyB9CisgICAgdGFibGUtPkNtZEVuZFJlbmRlclBhc3MyS0hSID0gKFBGTl92a0NtZEVuZFJlbmRlclBhc3MyS0hSKSBncGEoZGV2aWNlLCAidmtDbWRFbmRSZW5kZXJQYXNzMktIUiIpOworICAgIGlmICh0YWJsZS0+Q21kRW5kUmVuZGVyUGFzczJLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRW5kUmVuZGVyUGFzczJLSFIgPSAoUEZOX3ZrQ21kRW5kUmVuZGVyUGFzczJLSFIpU3R1YkNtZEVuZFJlbmRlclBhc3MyS0hSOyB9CisgICAgdGFibGUtPkdldFN3YXBjaGFpblN0YXR1c0tIUiA9IChQRk5fdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIpIGdwYShkZXZpY2UsICJ2a0dldFN3YXBjaGFpblN0YXR1c0tIUiIpOworICAgIGlmICh0YWJsZS0+R2V0U3dhcGNoYWluU3RhdHVzS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldFN3YXBjaGFpblN0YXR1c0tIUiA9IChQRk5fdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIpU3R1YkdldFN3YXBjaGFpblN0YXR1c0tIUjsgfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+SW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiA9IChQRk5fdmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKSBncGEoZGV2aWNlLCAidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIik7CisgICAgaWYgKHRhYmxlLT5JbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUilTdHViSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUjsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldEZlbmNlV2luMzJIYW5kbGVLSFIgPSAoUEZOX3ZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUikgZ3BhKGRldmljZSwgInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIpOworICAgIGlmICh0YWJsZS0+R2V0RmVuY2VXaW4zMkhhbmRsZUtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRGZW5jZVdpbjMySGFuZGxlS0hSID0gKFBGTl92a0dldEZlbmNlV2luMzJIYW5kbGVLSFIpU3R1YkdldEZlbmNlV2luMzJIYW5kbGVLSFI7IH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkltcG9ydEZlbmNlRmRLSFIgPSAoUEZOX3ZrSW1wb3J0RmVuY2VGZEtIUikgZ3BhKGRldmljZSwgInZrSW1wb3J0RmVuY2VGZEtIUiIpOworICAgIGlmICh0YWJsZS0+SW1wb3J0RmVuY2VGZEtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5JbXBvcnRGZW5jZUZkS0hSID0gKFBGTl92a0ltcG9ydEZlbmNlRmRLSFIpU3R1YkltcG9ydEZlbmNlRmRLSFI7IH0KKyAgICB0YWJsZS0+R2V0RmVuY2VGZEtIUiA9IChQRk5fdmtHZXRGZW5jZUZkS0hSKSBncGEoZGV2aWNlLCAidmtHZXRGZW5jZUZkS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRGZW5jZUZkS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldEZlbmNlRmRLSFIgPSAoUEZOX3ZrR2V0RmVuY2VGZEtIUilTdHViR2V0RmVuY2VGZEtIUjsgfQorICAgIHRhYmxlLT5BY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiA9IChQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUikgZ3BhKGRldmljZSwgInZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIiKTsKKyAgICBpZiAodGFibGUtPkFjcXVpcmVQcm9maWxpbmdMb2NrS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkFjcXVpcmVQcm9maWxpbmdMb2NrS0hSID0gKFBGTl92a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKVN0dWJBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUjsgfQorICAgIHRhYmxlLT5SZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiA9IChQRk5fdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUikgZ3BhKGRldmljZSwgInZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIiKTsKKyAgICBpZiAodGFibGUtPlJlbGVhc2VQcm9maWxpbmdMb2NrS0hSID09IG51bGxwdHIpIHsgdGFibGUtPlJlbGVhc2VQcm9maWxpbmdMb2NrS0hSID0gKFBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKVN0dWJSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUjsgfQorICAgIHRhYmxlLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSAoUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKSBncGEoZGV2aWNlLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSAoUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKVN0dWJHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFI7IH0KKyAgICB0YWJsZS0+R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IChQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKSBncGEoZGV2aWNlLCAidmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSAoUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUilTdHViR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsgfQorICAgIHRhYmxlLT5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSAoUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKSBncGEoZGV2aWNlLCAidmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgPSAoUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKVN0dWJHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFI7IH0KKyAgICB0YWJsZS0+Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiA9IChQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKSBncGEoZGV2aWNlLCAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPSAoUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUilTdHViQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUjsgfQorICAgIHRhYmxlLT5EZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiA9IChQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUikgZ3BhKGRldmljZSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID0gKFBGTl92a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKVN0dWJEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUjsgfQorICAgIHRhYmxlLT5CaW5kQnVmZmVyTWVtb3J5MktIUiA9IChQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MktIUikgZ3BhKGRldmljZSwgInZrQmluZEJ1ZmZlck1lbW9yeTJLSFIiKTsKKyAgICBpZiAodGFibGUtPkJpbmRCdWZmZXJNZW1vcnkyS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkJpbmRCdWZmZXJNZW1vcnkyS0hSID0gKFBGTl92a0JpbmRCdWZmZXJNZW1vcnkyS0hSKVN0dWJCaW5kQnVmZmVyTWVtb3J5MktIUjsgfQorICAgIHRhYmxlLT5CaW5kSW1hZ2VNZW1vcnkyS0hSID0gKFBGTl92a0JpbmRJbWFnZU1lbW9yeTJLSFIpIGdwYShkZXZpY2UsICJ2a0JpbmRJbWFnZU1lbW9yeTJLSFIiKTsKKyAgICBpZiAodGFibGUtPkJpbmRJbWFnZU1lbW9yeTJLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+QmluZEltYWdlTWVtb3J5MktIUiA9IChQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyS0hSKVN0dWJCaW5kSW1hZ2VNZW1vcnkyS0hSOyB9CisgICAgdGFibGUtPkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSID0gKFBGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSKSBncGEoZGV2aWNlLCAidmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUiIpOworICAgIGlmICh0YWJsZS0+R2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIpU3R1YkdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSOyB9CisgICAgdGFibGUtPkNtZERyYXdJbmRpcmVjdENvdW50S0hSID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKSBncGEoZGV2aWNlLCAidmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiIpOworICAgIGlmICh0YWJsZS0+Q21kRHJhd0luZGlyZWN0Q291bnRLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRHJhd0luZGlyZWN0Q291bnRLSFIgPSAoUEZOX3ZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIpU3R1YkNtZERyYXdJbmRpcmVjdENvdW50S0hSOyB9CisgICAgdGFibGUtPkNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiA9IChQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIpIGdwYShkZXZpY2UsICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiIpOworICAgIGlmICh0YWJsZS0+Q21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSID09IG51bGxwdHIpIHsgdGFibGUtPkNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiA9IChQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIpU3R1YkNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUjsgfQorICAgIHRhYmxlLT5HZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIgPSAoUEZOX3ZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKSBncGEoZGV2aWNlLCAidmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFIgPSAoUEZOX3ZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSKVN0dWJHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFI7IH0KKyAgICB0YWJsZS0+V2FpdFNlbWFwaG9yZXNLSFIgPSAoUEZOX3ZrV2FpdFNlbWFwaG9yZXNLSFIpIGdwYShkZXZpY2UsICJ2a1dhaXRTZW1hcGhvcmVzS0hSIik7CisgICAgaWYgKHRhYmxlLT5XYWl0U2VtYXBob3Jlc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5XYWl0U2VtYXBob3Jlc0tIUiA9IChQRk5fdmtXYWl0U2VtYXBob3Jlc0tIUilTdHViV2FpdFNlbWFwaG9yZXNLSFI7IH0KKyAgICB0YWJsZS0+U2lnbmFsU2VtYXBob3JlS0hSID0gKFBGTl92a1NpZ25hbFNlbWFwaG9yZUtIUikgZ3BhKGRldmljZSwgInZrU2lnbmFsU2VtYXBob3JlS0hSIik7CisgICAgaWYgKHRhYmxlLT5TaWduYWxTZW1hcGhvcmVLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+U2lnbmFsU2VtYXBob3JlS0hSID0gKFBGTl92a1NpZ25hbFNlbWFwaG9yZUtIUilTdHViU2lnbmFsU2VtYXBob3JlS0hSOyB9CisgICAgdGFibGUtPkdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIgPSAoUEZOX3ZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUikgZ3BhKGRldmljZSwgInZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUiIpOworICAgIGlmICh0YWJsZS0+R2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSID0gKFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIpU3R1YkdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFI7IH0KKyAgICB0YWJsZS0+R2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgPSAoUEZOX3ZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIpIGdwYShkZXZpY2UsICJ2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiA9IChQRk5fdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUilTdHViR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFI7IH0KKyAgICB0YWJsZS0+R2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgPSAoUEZOX3ZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIpIGdwYShkZXZpY2UsICJ2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiA9IChQRk5fdmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUilTdHViR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFI7IH0KKyAgICB0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKSBncGEoZGV2aWNlLCAidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSIik7CisgICAgaWYgKHRhYmxlLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSID09IG51bGxwdHIpIHsgdGFibGUtPkdldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUilTdHViR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjsgfQorICAgIHRhYmxlLT5HZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSID0gKFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIpIGdwYShkZXZpY2UsICJ2a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIiKTsKKyAgICBpZiAodGFibGUtPkdldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUiA9IChQRk5fdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSKVN0dWJHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSOyB9CisgICAgdGFibGUtPkdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSID0gKFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSKSBncGEoZGV2aWNlLCAidmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiIpOworICAgIGlmICh0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIgPSAoUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFIpU3R1YkdldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSOyB9CisgICAgdGFibGUtPkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUID0gKFBGTl92a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKSBncGEoZGV2aWNlLCAidmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCIpOworICAgIGlmICh0YWJsZS0+RGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+RGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQgPSAoUEZOX3ZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQpU3R1YkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUOyB9CisgICAgdGFibGUtPkRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCA9IChQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQpIGdwYShkZXZpY2UsICJ2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCIpOworICAgIGlmICh0YWJsZS0+RGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCA9IChQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQpU3R1YkRlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVDsgfQorICAgIHRhYmxlLT5DbWREZWJ1Z01hcmtlckJlZ2luRVhUID0gKFBGTl92a0NtZERlYnVnTWFya2VyQmVnaW5FWFQpIGdwYShkZXZpY2UsICJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZERlYnVnTWFya2VyQmVnaW5FWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRGVidWdNYXJrZXJCZWdpbkVYVCA9IChQRk5fdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUKVN0dWJDbWREZWJ1Z01hcmtlckJlZ2luRVhUOyB9CisgICAgdGFibGUtPkNtZERlYnVnTWFya2VyRW5kRVhUID0gKFBGTl92a0NtZERlYnVnTWFya2VyRW5kRVhUKSBncGEoZGV2aWNlLCAidmtDbWREZWJ1Z01hcmtlckVuZEVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kRGVidWdNYXJrZXJFbmRFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRGVidWdNYXJrZXJFbmRFWFQgPSAoUEZOX3ZrQ21kRGVidWdNYXJrZXJFbmRFWFQpU3R1YkNtZERlYnVnTWFya2VyRW5kRVhUOyB9CisgICAgdGFibGUtPkNtZERlYnVnTWFya2VySW5zZXJ0RVhUID0gKFBGTl92a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUKSBncGEoZGV2aWNlLCAidmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kRGVidWdNYXJrZXJJbnNlcnRFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRGVidWdNYXJrZXJJbnNlcnRFWFQgPSAoUEZOX3ZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQpU3R1YkNtZERlYnVnTWFya2VySW5zZXJ0RVhUOyB9CisgICAgdGFibGUtPkNtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQgPSAoUEZOX3ZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCkgZ3BhKGRldmljZSwgInZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCIpOworICAgIGlmICh0YWJsZS0+Q21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUID0gKFBGTl92a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQpU3R1YkNtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQ7IH0KKyAgICB0YWJsZS0+Q21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCA9IChQRk5fdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKSBncGEoZGV2aWNlLCAidmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUIik7CisgICAgaWYgKHRhYmxlLT5DbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQgPSAoUEZOX3ZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVClTdHViQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVDsgfQorICAgIHRhYmxlLT5DbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCA9IChQRk5fdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVCkgZ3BhKGRldmljZSwgInZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUID0gKFBGTl92a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKVN0dWJDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVDsgfQorICAgIHRhYmxlLT5DbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCA9IChQRk5fdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVCkgZ3BhKGRldmljZSwgInZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEJlZ2luUXVlcnlJbmRleGVkRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEJlZ2luUXVlcnlJbmRleGVkRVhUID0gKFBGTl92a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUKVN0dWJDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVDsgfQorICAgIHRhYmxlLT5DbWRFbmRRdWVyeUluZGV4ZWRFWFQgPSAoUEZOX3ZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKSBncGEoZGV2aWNlLCAidmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEVuZFF1ZXJ5SW5kZXhlZEVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRFbmRRdWVyeUluZGV4ZWRFWFQgPSAoUEZOX3ZrQ21kRW5kUXVlcnlJbmRleGVkRVhUKVN0dWJDbWRFbmRRdWVyeUluZGV4ZWRFWFQ7IH0KKyAgICB0YWJsZS0+Q21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCkgZ3BhKGRldmljZSwgInZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUIik7CisgICAgaWYgKHRhYmxlLT5DbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVClTdHViQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUOyB9CisgICAgdGFibGUtPkdldEltYWdlVmlld0hhbmRsZU5WWCA9IChQRk5fdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgpIGdwYShkZXZpY2UsICJ2a0dldEltYWdlVmlld0hhbmRsZU5WWCIpOworICAgIGlmICh0YWJsZS0+R2V0SW1hZ2VWaWV3SGFuZGxlTlZYID09IG51bGxwdHIpIHsgdGFibGUtPkdldEltYWdlVmlld0hhbmRsZU5WWCA9IChQRk5fdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgpU3R1YkdldEltYWdlVmlld0hhbmRsZU5WWDsgfQorICAgIHRhYmxlLT5DbWREcmF3SW5kaXJlY3RDb3VudEFNRCA9IChQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEFNRCkgZ3BhKGRldmljZSwgInZrQ21kRHJhd0luZGlyZWN0Q291bnRBTUQiKTsKKyAgICBpZiAodGFibGUtPkNtZERyYXdJbmRpcmVjdENvdW50QU1EID09IG51bGxwdHIpIHsgdGFibGUtPkNtZERyYXdJbmRpcmVjdENvdW50QU1EID0gKFBGTl92a0NtZERyYXdJbmRpcmVjdENvdW50QU1EKVN0dWJDbWREcmF3SW5kaXJlY3RDb3VudEFNRDsgfQorICAgIHRhYmxlLT5DbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQgPSAoUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKSBncGEoZGV2aWNlLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQiKTsKKyAgICBpZiAodGFibGUtPkNtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQgPSAoUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50QU1EKVN0dWJDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQ7IH0KKyAgICB0YWJsZS0+R2V0U2hhZGVySW5mb0FNRCA9IChQRk5fdmtHZXRTaGFkZXJJbmZvQU1EKSBncGEoZGV2aWNlLCAidmtHZXRTaGFkZXJJbmZvQU1EIik7CisgICAgaWYgKHRhYmxlLT5HZXRTaGFkZXJJbmZvQU1EID09IG51bGxwdHIpIHsgdGFibGUtPkdldFNoYWRlckluZm9BTUQgPSAoUEZOX3ZrR2V0U2hhZGVySW5mb0FNRClTdHViR2V0U2hhZGVySW5mb0FNRDsgfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0TWVtb3J5V2luMzJIYW5kbGVOViA9IChQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WKSBncGEoZGV2aWNlLCAidmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WIik7CisgICAgaWYgKHRhYmxlLT5HZXRNZW1vcnlXaW4zMkhhbmRsZU5WID09IG51bGxwdHIpIHsgdGFibGUtPkdldE1lbW9yeVdpbjMySGFuZGxlTlYgPSAoUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVilTdHViR2V0TWVtb3J5V2luMzJIYW5kbGVOVjsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+Q21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IChQRk5fdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKSBncGEoZGV2aWNlLCAidmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIik7CisgICAgaWYgKHRhYmxlLT5DbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgPSAoUEZOX3ZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVClTdHViQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVDsgfQorICAgIHRhYmxlLT5DbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCA9IChQRk5fdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVCkgZ3BhKGRldmljZSwgInZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUID0gKFBGTl92a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhUKVN0dWJDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVDsgfQorICAgIHRhYmxlLT5DbWRQcm9jZXNzQ29tbWFuZHNOVlggPSAoUEZOX3ZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKSBncGEoZGV2aWNlLCAidmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgiKTsKKyAgICBpZiAodGFibGUtPkNtZFByb2Nlc3NDb21tYW5kc05WWCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRQcm9jZXNzQ29tbWFuZHNOVlggPSAoUEZOX3ZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYKVN0dWJDbWRQcm9jZXNzQ29tbWFuZHNOVlg7IH0KKyAgICB0YWJsZS0+Q21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlggPSAoUEZOX3ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgpIGdwYShkZXZpY2UsICJ2a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYIik7CisgICAgaWYgKHRhYmxlLT5DbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCA9IChQRk5fdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWClTdHViQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlg7IH0KKyAgICB0YWJsZS0+Q3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IChQRk5fdmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKSBncGEoZGV2aWNlLCAidmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggPSAoUEZOX3ZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWClTdHViQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsgfQorICAgIHRhYmxlLT5EZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCA9IChQRk5fdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCkgZ3BhKGRldmljZSwgInZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgiKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID09IG51bGxwdHIpIHsgdGFibGUtPkRlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID0gKFBGTl92a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYKVN0dWJEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWDsgfQorICAgIHRhYmxlLT5DcmVhdGVPYmplY3RUYWJsZU5WWCA9IChQRk5fdmtDcmVhdGVPYmplY3RUYWJsZU5WWCkgZ3BhKGRldmljZSwgInZrQ3JlYXRlT2JqZWN0VGFibGVOVlgiKTsKKyAgICBpZiAodGFibGUtPkNyZWF0ZU9iamVjdFRhYmxlTlZYID09IG51bGxwdHIpIHsgdGFibGUtPkNyZWF0ZU9iamVjdFRhYmxlTlZYID0gKFBGTl92a0NyZWF0ZU9iamVjdFRhYmxlTlZYKVN0dWJDcmVhdGVPYmplY3RUYWJsZU5WWDsgfQorICAgIHRhYmxlLT5EZXN0cm95T2JqZWN0VGFibGVOVlggPSAoUEZOX3ZrRGVzdHJveU9iamVjdFRhYmxlTlZYKSBncGEoZGV2aWNlLCAidmtEZXN0cm95T2JqZWN0VGFibGVOVlgiKTsKKyAgICBpZiAodGFibGUtPkRlc3Ryb3lPYmplY3RUYWJsZU5WWCA9PSBudWxscHRyKSB7IHRhYmxlLT5EZXN0cm95T2JqZWN0VGFibGVOVlggPSAoUEZOX3ZrRGVzdHJveU9iamVjdFRhYmxlTlZYKVN0dWJEZXN0cm95T2JqZWN0VGFibGVOVlg7IH0KKyAgICB0YWJsZS0+UmVnaXN0ZXJPYmplY3RzTlZYID0gKFBGTl92a1JlZ2lzdGVyT2JqZWN0c05WWCkgZ3BhKGRldmljZSwgInZrUmVnaXN0ZXJPYmplY3RzTlZYIik7CisgICAgaWYgKHRhYmxlLT5SZWdpc3Rlck9iamVjdHNOVlggPT0gbnVsbHB0cikgeyB0YWJsZS0+UmVnaXN0ZXJPYmplY3RzTlZYID0gKFBGTl92a1JlZ2lzdGVyT2JqZWN0c05WWClTdHViUmVnaXN0ZXJPYmplY3RzTlZYOyB9CisgICAgdGFibGUtPlVucmVnaXN0ZXJPYmplY3RzTlZYID0gKFBGTl92a1VucmVnaXN0ZXJPYmplY3RzTlZYKSBncGEoZGV2aWNlLCAidmtVbnJlZ2lzdGVyT2JqZWN0c05WWCIpOworICAgIGlmICh0YWJsZS0+VW5yZWdpc3Rlck9iamVjdHNOVlggPT0gbnVsbHB0cikgeyB0YWJsZS0+VW5yZWdpc3Rlck9iamVjdHNOVlggPSAoUEZOX3ZrVW5yZWdpc3Rlck9iamVjdHNOVlgpU3R1YlVucmVnaXN0ZXJPYmplY3RzTlZYOyB9CisgICAgdGFibGUtPkNtZFNldFZpZXdwb3J0V1NjYWxpbmdOViA9IChQRk5fdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYpIGdwYShkZXZpY2UsICJ2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0Vmlld3BvcnRXU2NhbGluZ05WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldFZpZXdwb3J0V1NjYWxpbmdOViA9IChQRk5fdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYpU3R1YkNtZFNldFZpZXdwb3J0V1NjYWxpbmdOVjsgfQorICAgIHRhYmxlLT5EaXNwbGF5UG93ZXJDb250cm9sRVhUID0gKFBGTl92a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQpIGdwYShkZXZpY2UsICJ2a0Rpc3BsYXlQb3dlckNvbnRyb2xFWFQiKTsKKyAgICBpZiAodGFibGUtPkRpc3BsYXlQb3dlckNvbnRyb2xFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+RGlzcGxheVBvd2VyQ29udHJvbEVYVCA9IChQRk5fdmtEaXNwbGF5UG93ZXJDb250cm9sRVhUKVN0dWJEaXNwbGF5UG93ZXJDb250cm9sRVhUOyB9CisgICAgdGFibGUtPlJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQgPSAoUEZOX3ZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCkgZ3BhKGRldmljZSwgInZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCIpOworICAgIGlmICh0YWJsZS0+UmVnaXN0ZXJEZXZpY2VFdmVudEVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5SZWdpc3RlckRldmljZUV2ZW50RVhUID0gKFBGTl92a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQpU3R1YlJlZ2lzdGVyRGV2aWNlRXZlbnRFWFQ7IH0KKyAgICB0YWJsZS0+UmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQgPSAoUEZOX3ZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQpIGdwYShkZXZpY2UsICJ2a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIik7CisgICAgaWYgKHRhYmxlLT5SZWdpc3RlckRpc3BsYXlFdmVudEVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5SZWdpc3RlckRpc3BsYXlFdmVudEVYVCA9IChQRk5fdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVClTdHViUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQ7IH0KKyAgICB0YWJsZS0+R2V0U3dhcGNoYWluQ291bnRlckVYVCA9IChQRk5fdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUKSBncGEoZGV2aWNlLCAidmtHZXRTd2FwY2hhaW5Db3VudGVyRVhUIik7CisgICAgaWYgKHRhYmxlLT5HZXRTd2FwY2hhaW5Db3VudGVyRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkdldFN3YXBjaGFpbkNvdW50ZXJFWFQgPSAoUEZOX3ZrR2V0U3dhcGNoYWluQ291bnRlckVYVClTdHViR2V0U3dhcGNoYWluQ291bnRlckVYVDsgfQorICAgIHRhYmxlLT5HZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSA9IChQRk5fdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRSkgZ3BhKGRldmljZSwgInZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUiKTsKKyAgICBpZiAodGFibGUtPkdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFID09IG51bGxwdHIpIHsgdGFibGUtPkdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFID0gKFBGTl92a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFKVN0dWJHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRTsgfQorICAgIHRhYmxlLT5HZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFID0gKFBGTl92a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUpIGdwYShkZXZpY2UsICJ2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUiKTsKKyAgICBpZiAodGFibGUtPkdldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRSA9IChQRk5fdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFKVN0dWJHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFOyB9CisgICAgdGFibGUtPkNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQgPSAoUEZOX3ZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCkgZ3BhKGRldmljZSwgInZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUID0gKFBGTl92a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQpU3R1YkNtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQ7IH0KKyAgICB0YWJsZS0+U2V0SGRyTWV0YWRhdGFFWFQgPSAoUEZOX3ZrU2V0SGRyTWV0YWRhdGFFWFQpIGdwYShkZXZpY2UsICJ2a1NldEhkck1ldGFkYXRhRVhUIik7CisgICAgaWYgKHRhYmxlLT5TZXRIZHJNZXRhZGF0YUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5TZXRIZHJNZXRhZGF0YUVYVCA9IChQRk5fdmtTZXRIZHJNZXRhZGF0YUVYVClTdHViU2V0SGRyTWV0YWRhdGFFWFQ7IH0KKyAgICB0YWJsZS0+U2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgPSAoUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQpIGdwYShkZXZpY2UsICJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUIik7CisgICAgaWYgKHRhYmxlLT5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCA9IChQRk5fdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVClTdHViU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQ7IH0KKyAgICB0YWJsZS0+U2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCA9IChQRk5fdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKSBncGEoZGV2aWNlLCAidmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUIik7CisgICAgaWYgKHRhYmxlLT5TZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUID09IG51bGxwdHIpIHsgdGFibGUtPlNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQgPSAoUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVClTdHViU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVDsgfQorICAgIHRhYmxlLT5RdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQpIGdwYShkZXZpY2UsICJ2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQiKTsKKyAgICBpZiAodGFibGUtPlF1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+UXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCA9IChQRk5fdmtRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKVN0dWJRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUOyB9CisgICAgdGFibGUtPlF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUKSBncGEoZGV2aWNlLCAidmtRdWV1ZUVuZERlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgIGlmICh0YWJsZS0+UXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+UXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQpU3R1YlF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUOyB9CisgICAgdGFibGUtPlF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKSBncGEoZGV2aWNlLCAidmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgIGlmICh0YWJsZS0+UXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+UXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQpU3R1YlF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUOyB9CisgICAgdGFibGUtPkNtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUID0gKFBGTl92a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKSBncGEoZGV2aWNlLCAidmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQpU3R1YkNtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUOyB9CisgICAgdGFibGUtPkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCA9IChQRk5fdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQpIGdwYShkZXZpY2UsICJ2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgIGlmICh0YWJsZS0+Q21kRW5kRGVidWdVdGlsc0xhYmVsRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCA9IChQRk5fdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQpU3R1YkNtZEVuZERlYnVnVXRpbHNMYWJlbEVYVDsgfQorICAgIHRhYmxlLT5DbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKSBncGEoZGV2aWNlLCAidmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgPSAoUEZOX3ZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKVN0dWJDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQ7IH0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICB0YWJsZS0+R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgPSAoUEZOX3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQpIGdwYShkZXZpY2UsICJ2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIik7CisgICAgaWYgKHRhYmxlLT5HZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCA9IChQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRClTdHViR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ7IH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICB0YWJsZS0+R2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCA9IChQRk5fdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKSBncGEoZGV2aWNlLCAidmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEIik7CisgICAgaWYgKHRhYmxlLT5HZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEID09IG51bGxwdHIpIHsgdGFibGUtPkdldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQgPSAoUEZOX3ZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRClTdHViR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRDsgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHRhYmxlLT5DbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQgPSAoUEZOX3ZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKSBncGEoZGV2aWNlLCAidmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZFNldFNhbXBsZUxvY2F0aW9uc0VYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQgPSAoUEZOX3ZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUKVN0dWJDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQ7IH0KKyAgICB0YWJsZS0+R2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgPSAoUEZOX3ZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQpIGdwYShkZXZpY2UsICJ2a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIik7CisgICAgaWYgKHRhYmxlLT5HZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCA9IChQRk5fdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVClTdHViR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ7IH0KKyAgICB0YWJsZS0+Q3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUID0gKFBGTl92a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCkgZ3BhKGRldmljZSwgInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUID0gKFBGTl92a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVClTdHViQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUOyB9CisgICAgdGFibGUtPkRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQgPSAoUEZOX3ZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCkgZ3BhKGRldmljZSwgInZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCIpOworICAgIGlmICh0YWJsZS0+RGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5EZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUID0gKFBGTl92a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQpU3R1YkRlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQ7IH0KKyAgICB0YWJsZS0+TWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUID0gKFBGTl92a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCkgZ3BhKGRldmljZSwgInZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUIik7CisgICAgaWYgKHRhYmxlLT5NZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+TWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUID0gKFBGTl92a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVClTdHViTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUOyB9CisgICAgdGFibGUtPkdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQgPSAoUEZOX3ZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCkgZ3BhKGRldmljZSwgInZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCIpOworICAgIGlmICh0YWJsZS0+R2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUID0gKFBGTl92a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQpU3R1YkdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQ7IH0KKyAgICB0YWJsZS0+Q21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOViA9IChQRk5fdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKSBncGEoZGV2aWNlLCAidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIik7CisgICAgaWYgKHRhYmxlLT5DbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYgPSAoUEZOX3ZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVilTdHViQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVjsgfQorICAgIHRhYmxlLT5DbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WID0gKFBGTl92a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYpIGdwYShkZXZpY2UsICJ2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYiKTsKKyAgICBpZiAodGFibGUtPkNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViA9IChQRk5fdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKVN0dWJDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WOyB9CisgICAgdGFibGUtPkNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYgPSAoUEZOX3ZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVikgZ3BhKGRldmljZSwgInZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WID0gKFBGTl92a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYpU3R1YkNtZFNldENvYXJzZVNhbXBsZU9yZGVyTlY7IH0KKyAgICB0YWJsZS0+Q3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPSAoUEZOX3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpIGdwYShkZXZpY2UsICJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIik7CisgICAgaWYgKHRhYmxlLT5DcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9PSBudWxscHRyKSB7IHRhYmxlLT5DcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IChQRk5fdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVilTdHViQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7IH0KKyAgICB0YWJsZS0+RGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikgZ3BhKGRldmljZSwgInZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIik7CisgICAgaWYgKHRhYmxlLT5EZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+RGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVilTdHViRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOyB9CisgICAgdGFibGUtPkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WID0gKFBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKSBncGEoZGV2aWNlLCAidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViIpOworICAgIGlmICh0YWJsZS0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgPSAoUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYpU3R1YkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WOyB9CisgICAgdGFibGUtPkJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViA9IChQRk5fdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYpIGdwYShkZXZpY2UsICJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIpOworICAgIGlmICh0YWJsZS0+QmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WID09IG51bGxwdHIpIHsgdGFibGUtPkJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViA9IChQRk5fdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYpU3R1YkJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVjsgfQorICAgIHRhYmxlLT5DbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gKFBGTl92a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpIGdwYShkZXZpY2UsICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKTsKKyAgICBpZiAodGFibGUtPkNtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IChQRk5fdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKVN0dWJDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOyB9CisgICAgdGFibGUtPkNtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IChQRk5fdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpIGdwYShkZXZpY2UsICJ2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpOworICAgIGlmICh0YWJsZS0+Q21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IChQRk5fdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpU3R1YkNtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsgfQorICAgIHRhYmxlLT5DbWRUcmFjZVJheXNOViA9IChQRk5fdmtDbWRUcmFjZVJheXNOVikgZ3BhKGRldmljZSwgInZrQ21kVHJhY2VSYXlzTlYiKTsKKyAgICBpZiAodGFibGUtPkNtZFRyYWNlUmF5c05WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFRyYWNlUmF5c05WID0gKFBGTl92a0NtZFRyYWNlUmF5c05WKVN0dWJDbWRUcmFjZVJheXNOVjsgfQorICAgIHRhYmxlLT5DcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYgPSAoUEZOX3ZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKSBncGEoZGV2aWNlLCAidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiKTsKKyAgICBpZiAodGFibGUtPkNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViA9PSBudWxscHRyKSB7IHRhYmxlLT5DcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYgPSAoUEZOX3ZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKVN0dWJDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlY7IH0KKyAgICB0YWJsZS0+R2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WID0gKFBGTl92a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVikgZ3BhKGRldmljZSwgInZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIik7CisgICAgaWYgKHRhYmxlLT5HZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WID0gKFBGTl92a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVilTdHViR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WOyB9CisgICAgdGFibGUtPkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WID0gKFBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKSBncGEoZGV2aWNlLCAidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIpOworICAgIGlmICh0YWJsZS0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYgPSAoUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYpU3R1YkdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WOyB9CisgICAgdGFibGUtPkNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViA9IChQRk5fdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYpIGdwYShkZXZpY2UsICJ2a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViIpOworICAgIGlmICh0YWJsZS0+Q21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOViA9IChQRk5fdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYpU3R1YkNtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVjsgfQorICAgIHRhYmxlLT5Db21waWxlRGVmZXJyZWROViA9IChQRk5fdmtDb21waWxlRGVmZXJyZWROVikgZ3BhKGRldmljZSwgInZrQ29tcGlsZURlZmVycmVkTlYiKTsKKyAgICBpZiAodGFibGUtPkNvbXBpbGVEZWZlcnJlZE5WID09IG51bGxwdHIpIHsgdGFibGUtPkNvbXBpbGVEZWZlcnJlZE5WID0gKFBGTl92a0NvbXBpbGVEZWZlcnJlZE5WKVN0dWJDb21waWxlRGVmZXJyZWROVjsgfQorICAgIHRhYmxlLT5HZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgPSAoUEZOX3ZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKSBncGEoZGV2aWNlLCAidmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQiKTsKKyAgICBpZiAodGFibGUtPkdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgPSAoUEZOX3ZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKVN0dWJHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQ7IH0KKyAgICB0YWJsZS0+Q21kV3JpdGVCdWZmZXJNYXJrZXJBTUQgPSAoUEZOX3ZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQpIGdwYShkZXZpY2UsICJ2a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1EIik7CisgICAgaWYgKHRhYmxlLT5DbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCA9IChQRk5fdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRClTdHViQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQ7IH0KKyAgICB0YWJsZS0+R2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQgPSAoUEZOX3ZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQpIGdwYShkZXZpY2UsICJ2a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhUIik7CisgICAgaWYgKHRhYmxlLT5HZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVCA9IChQRk5fdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVClTdHViR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQ7IH0KKyAgICB0YWJsZS0+Q21kRHJhd01lc2hUYXNrc05WID0gKFBGTl92a0NtZERyYXdNZXNoVGFza3NOVikgZ3BhKGRldmljZSwgInZrQ21kRHJhd01lc2hUYXNrc05WIik7CisgICAgaWYgKHRhYmxlLT5DbWREcmF3TWVzaFRhc2tzTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRHJhd01lc2hUYXNrc05WID0gKFBGTl92a0NtZERyYXdNZXNoVGFza3NOVilTdHViQ21kRHJhd01lc2hUYXNrc05WOyB9CisgICAgdGFibGUtPkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WID0gKFBGTl92a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKSBncGEoZGV2aWNlLCAidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViIpOworICAgIGlmICh0YWJsZS0+Q21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYpU3R1YkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WOyB9CisgICAgdGFibGUtPkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYgPSAoUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVikgZ3BhKGRldmljZSwgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViIpOworICAgIGlmICh0YWJsZS0+Q21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WID0gKFBGTl92a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYpU3R1YkNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlY7IH0KKyAgICB0YWJsZS0+Q21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WID0gKFBGTl92a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVikgZ3BhKGRldmljZSwgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WIik7CisgICAgaWYgKHRhYmxlLT5DbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WID0gKFBGTl92a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVilTdHViQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WOyB9CisgICAgdGFibGUtPkNtZFNldENoZWNrcG9pbnROViA9IChQRk5fdmtDbWRTZXRDaGVja3BvaW50TlYpIGdwYShkZXZpY2UsICJ2a0NtZFNldENoZWNrcG9pbnROViIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0Q2hlY2twb2ludE5WID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldENoZWNrcG9pbnROViA9IChQRk5fdmtDbWRTZXRDaGVja3BvaW50TlYpU3R1YkNtZFNldENoZWNrcG9pbnROVjsgfQorICAgIHRhYmxlLT5HZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYgPSAoUEZOX3ZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKSBncGEoZGV2aWNlLCAidmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYiKTsKKyAgICBpZiAodGFibGUtPkdldFF1ZXVlQ2hlY2twb2ludERhdGFOViA9PSBudWxscHRyKSB7IHRhYmxlLT5HZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYgPSAoUEZOX3ZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WKVN0dWJHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlY7IH0KKyAgICB0YWJsZS0+SW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwgPSAoUEZOX3ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwpIGdwYShkZXZpY2UsICJ2a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIik7CisgICAgaWYgKHRhYmxlLT5Jbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9PSBudWxscHRyKSB7IHRhYmxlLT5Jbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IChQRk5fdmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTClTdHViSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUw7IH0KKyAgICB0YWJsZS0+VW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTCA9IChQRk5fdmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMKSBncGEoZGV2aWNlLCAidmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIik7CisgICAgaWYgKHRhYmxlLT5VbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMID09IG51bGxwdHIpIHsgdGFibGUtPlVuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwgPSAoUEZOX3ZrVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTClTdHViVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTDsgfQorICAgIHRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMID0gKFBGTl92a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwpIGdwYShkZXZpY2UsICJ2a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwiKTsKKyAgICBpZiAodGFibGUtPkNtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCA9IChQRk5fdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMKVN0dWJDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMOyB9CisgICAgdGFibGUtPkNtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwgPSAoUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCkgZ3BhKGRldmljZSwgInZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCIpOworICAgIGlmICh0YWJsZS0+Q21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCA9PSBudWxscHRyKSB7IHRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMID0gKFBGTl92a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwpU3R1YkNtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUw7IH0KKyAgICB0YWJsZS0+Q21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMID0gKFBGTl92a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCkgZ3BhKGRldmljZSwgInZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMIik7CisgICAgaWYgKHRhYmxlLT5DbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwgPT0gbnVsbHB0cikgeyB0YWJsZS0+Q21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMID0gKFBGTl92a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTClTdHViQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMOyB9CisgICAgdGFibGUtPkFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IChQRk5fdmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpIGdwYShkZXZpY2UsICJ2a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIpOworICAgIGlmICh0YWJsZS0+QWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID09IG51bGxwdHIpIHsgdGFibGUtPkFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IChQRk5fdmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwpU3R1YkFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsgfQorICAgIHRhYmxlLT5SZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSAoUEZOX3ZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKSBncGEoZGV2aWNlLCAidmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwiKTsKKyAgICBpZiAodGFibGUtPlJlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9PSBudWxscHRyKSB7IHRhYmxlLT5SZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSAoUEZOX3ZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKVN0dWJSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw7IH0KKyAgICB0YWJsZS0+UXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IChQRk5fdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKSBncGEoZGV2aWNlLCAidmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIik7CisgICAgaWYgKHRhYmxlLT5RdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMID09IG51bGxwdHIpIHsgdGFibGUtPlF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgPSAoUEZOX3ZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTClTdHViUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsgfQorICAgIHRhYmxlLT5HZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMID0gKFBGTl92a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwpIGdwYShkZXZpY2UsICJ2a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwiKTsKKyAgICBpZiAodGFibGUtPkdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTCA9IChQRk5fdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMKVN0dWJHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMOyB9CisgICAgdGFibGUtPlNldExvY2FsRGltbWluZ0FNRCA9IChQRk5fdmtTZXRMb2NhbERpbW1pbmdBTUQpIGdwYShkZXZpY2UsICJ2a1NldExvY2FsRGltbWluZ0FNRCIpOworICAgIGlmICh0YWJsZS0+U2V0TG9jYWxEaW1taW5nQU1EID09IG51bGxwdHIpIHsgdGFibGUtPlNldExvY2FsRGltbWluZ0FNRCA9IChQRk5fdmtTZXRMb2NhbERpbW1pbmdBTUQpU3R1YlNldExvY2FsRGltbWluZ0FNRDsgfQorICAgIHRhYmxlLT5HZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUID0gKFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQpIGdwYShkZXZpY2UsICJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQiKTsKKyAgICBpZiAodGFibGUtPkdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCA9IChQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKVN0dWJHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUOyB9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5BY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgPSAoUEZOX3ZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKSBncGEoZGV2aWNlLCAidmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiKTsKKyAgICBpZiAodGFibGUtPkFjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5BY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgPSAoUEZOX3ZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKVN0dWJBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQ7IH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5SZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgPSAoUEZOX3ZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKSBncGEoZGV2aWNlLCAidmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQiKTsKKyAgICBpZiAodGFibGUtPlJlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCA9PSBudWxscHRyKSB7IHRhYmxlLT5SZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgPSAoUEZOX3ZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUKVN0dWJSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQ7IH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5HZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUID0gKFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQpIGdwYShkZXZpY2UsICJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiKTsKKyAgICBpZiAodGFibGUtPkdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgPT0gbnVsbHB0cikgeyB0YWJsZS0+R2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCA9IChQRk5fdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUKVN0dWJHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUOyB9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5DbWRTZXRMaW5lU3RpcHBsZUVYVCA9IChQRk5fdmtDbWRTZXRMaW5lU3RpcHBsZUVYVCkgZ3BhKGRldmljZSwgInZrQ21kU2V0TGluZVN0aXBwbGVFWFQiKTsKKyAgICBpZiAodGFibGUtPkNtZFNldExpbmVTdGlwcGxlRVhUID09IG51bGxwdHIpIHsgdGFibGUtPkNtZFNldExpbmVTdGlwcGxlRVhUID0gKFBGTl92a0NtZFNldExpbmVTdGlwcGxlRVhUKVN0dWJDbWRTZXRMaW5lU3RpcHBsZUVYVDsgfQorICAgIHRhYmxlLT5SZXNldFF1ZXJ5UG9vbEVYVCA9IChQRk5fdmtSZXNldFF1ZXJ5UG9vbEVYVCkgZ3BhKGRldmljZSwgInZrUmVzZXRRdWVyeVBvb2xFWFQiKTsKKyAgICBpZiAodGFibGUtPlJlc2V0UXVlcnlQb29sRVhUID09IG51bGxwdHIpIHsgdGFibGUtPlJlc2V0UXVlcnlQb29sRVhUID0gKFBGTl92a1Jlc2V0UXVlcnlQb29sRVhUKVN0dWJSZXNldFF1ZXJ5UG9vbEVYVDsgfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXllcl9pbml0X2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnRhYmxlLCBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGdwYSkgeworICAgIG1lbXNldCh0YWJsZSwgMCwgc2l6ZW9mKCp0YWJsZSkpOworICAgIC8vIEluc3RhbmNlIGZ1bmN0aW9uIHBvaW50ZXJzCisgICAgdGFibGUtPkRlc3Ryb3lJbnN0YW5jZSA9IChQRk5fdmtEZXN0cm95SW5zdGFuY2UpIGdwYShpbnN0YW5jZSwgInZrRGVzdHJveUluc3RhbmNlIik7CisgICAgdGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyA9IChQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMpIGdwYShpbnN0YW5jZSwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcykgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIgPSBncGE7CisgICAgdGFibGUtPkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMgPSAoUEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcykgZ3BhKGluc3RhbmNlLCAidmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyA9IChQRk5fdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMpIGdwYShpbnN0YW5jZSwgInZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzID0gKFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKSBncGEoaW5zdGFuY2UsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcykgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIik7CisgICAgdGFibGUtPkRlc3Ryb3lTdXJmYWNlS0hSID0gKFBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSKSBncGEoaW5zdGFuY2UsICJ2a0Rlc3Ryb3lTdXJmYWNlS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIik7CisgICAgdGFibGUtPkdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSID0gKFBGTl92a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSIik7CisgICAgdGFibGUtPkdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIik7CisgICAgdGFibGUtPkNyZWF0ZURpc3BsYXlNb2RlS0hSID0gKFBGTl92a0NyZWF0ZURpc3BsYXlNb2RlS0hSKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZURpc3BsYXlNb2RlS0hSIik7CisgICAgdGFibGUtPkdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiA9IChQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSIik7CisgICAgdGFibGUtPkNyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIgPSAoUEZOX3ZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUikgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSIik7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgdGFibGUtPkNyZWF0ZVhsaWJTdXJmYWNlS0hSID0gKFBGTl92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICB0YWJsZS0+Q3JlYXRlWGNiU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZVhjYlN1cmZhY2VLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICB0YWJsZS0+Q3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIgPSAoUEZOX3ZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIpIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICB0YWJsZS0+Q3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIgPSAoUEZOX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIpIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkNyZWF0ZVdpbjMyU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIpIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSID0gKFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIik7CisgICAgdGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIgPSAoUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUikgZ3BhKGluc3RhbmNlLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgPSAoUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIik7CisgICAgdGFibGUtPkdldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgPSAoUEZOX3ZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUikgZ3BhKGluc3RhbmNlLCAidmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIik7CisgICAgdGFibGUtPkNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPSAoUEZOX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCkgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIik7CisgICAgdGFibGUtPkRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUID0gKFBGTl92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSBncGEoaW5zdGFuY2UsICJ2a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIik7CisgICAgdGFibGUtPkRlYnVnUmVwb3J0TWVzc2FnZUVYVCA9IChQRk5fdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQpIGdwYShpbnN0YW5jZSwgInZrRGVidWdSZXBvcnRNZXNzYWdlRVhUIik7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgIHRhYmxlLT5DcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCA9IChQRk5fdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCkgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUCIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYiKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKyAgICB0YWJsZS0+Q3JlYXRlVmlTdXJmYWNlTk4gPSAoUEZOX3ZrQ3JlYXRlVmlTdXJmYWNlTk4pIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlVmlTdXJmYWNlTk4iKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fVklfTk4KKyAgICB0YWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlggPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgiKTsKKyAgICB0YWJsZS0+UmVsZWFzZURpc3BsYXlFWFQgPSAoUEZOX3ZrUmVsZWFzZURpc3BsYXlFWFQpIGdwYShpbnN0YW5jZSwgInZrUmVsZWFzZURpc3BsYXlFWFQiKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgdGFibGUtPkFjcXVpcmVYbGliRGlzcGxheUVYVCA9IChQRk5fdmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQpIGdwYShpbnN0YW5jZSwgInZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICB0YWJsZS0+R2V0UmFuZFJPdXRwdXREaXNwbGF5RVhUID0gKFBGTl92a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCkgZ3BhKGluc3RhbmNlLCAidmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCkgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIik7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyAgICB0YWJsZS0+Q3JlYXRlSU9TU3VyZmFjZU1WSyA9IChQRk5fdmtDcmVhdGVJT1NTdXJmYWNlTVZLKSBncGEoaW5zdGFuY2UsICJ2a0NyZWF0ZUlPU1N1cmZhY2VNVksiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyAgICB0YWJsZS0+Q3JlYXRlTWFjT1NTdXJmYWNlTVZLID0gKFBGTl92a0NyZWF0ZU1hY09TU3VyZmFjZU1WSykgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVNYWNPU1N1cmZhY2VNVksiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgdGFibGUtPkNyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgPSAoUEZOX3ZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCkgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIik7CisgICAgdGFibGUtPkRlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0gKFBGTl92a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKSBncGEoaW5zdGFuY2UsICJ2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIik7CisgICAgdGFibGUtPlN1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUID0gKFBGTl92a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUKSBncGEoaW5zdGFuY2UsICJ2a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUKSBncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhUIik7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICB0YWJsZS0+Q3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEgPSAoUEZOX3ZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEpIGdwYShpbnN0YW5jZSwgInZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyAgICB0YWJsZS0+Q3JlYXRlTWV0YWxTdXJmYWNlRVhUID0gKFBGTl92a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVCkgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQiKTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCkgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVikgZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIik7CisgICAgdGFibGUtPkdldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WIik7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHRhYmxlLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhUID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQpIGdwYShpbnN0YW5jZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB0YWJsZS0+Q3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhUID0gKFBGTl92a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCkgZ3BhKGluc3RhbmNlLCAidmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQiKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdmtfZW51bV9zdHJpbmdfaGVscGVyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX2VudW1fc3RyaW5nX2hlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NGI5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX2VudW1fc3RyaW5nX2hlbHBlci5oCkBAIC0wLDAgKzEsNjIzMyBAQAorLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKioKKy8vIFNlZSBoZWxwZXJfZmlsZV9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlnb0Bnb29nbGUuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmb3JiZXNAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogSm9obiBadWxhdWY8anp1bGF1ZkBsdW5hcmcuY29tPgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNwcmFnbWEgb25jZQorI2lmZGVmIF9XSU4zMgorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDA2NSApCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+CisKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQaXBlbGluZUNhY2hlSGVhZGVyVmVyc2lvbihWa1BpcGVsaW5lQ2FjaGVIZWFkZXJWZXJzaW9uIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUGlwZWxpbmVDYWNoZUhlYWRlclZlcnNpb24paW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0NBQ0hFX0hFQURFUl9WRVJTSU9OX09ORToKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfQ0FDSEVfSEVBREVSX1ZFUlNJT05fT05FIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUGlwZWxpbmVDYWNoZUhlYWRlclZlcnNpb24iOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtSZXN1bHQoVmtSZXN1bHQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtSZXN1bHQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0VSUk9SX0RFVklDRV9MT1NUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FUlJPUl9ERVZJQ0VfTE9TVCI7CisgICAgICAgIGNhc2UgVktfRVJST1JfRVhURU5TSU9OX05PVF9QUkVTRU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQiOworICAgICAgICBjYXNlIFZLX0VSUk9SX0ZFQVRVUkVfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX0ZFQVRVUkVfTk9UX1BSRVNFTlQiOworICAgICAgICBjYXNlIFZLX0VSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19FUlJPUl9GT1JNQVRfTk9UX1NVUFBPUlRFRCI7CisgICAgICAgIGNhc2UgVktfRVJST1JfRlJBR01FTlRBVElPTl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX0ZSQUdNRU5UQVRJT05fRVhUIjsKKyAgICAgICAgY2FzZSBWS19FUlJPUl9GUkFHTUVOVEVEX1BPT0w6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX0ZSQUdNRU5URURfUE9PTCI7CisgICAgICAgIGNhc2UgVktfRVJST1JfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX01PREVfTE9TVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9NT0RFX0xPU1RfRVhUIjsKKyAgICAgICAgY2FzZSBWS19FUlJPUl9JTkNPTVBBVElCTEVfRElTUExBWV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX0lOQ09NUEFUSUJMRV9ESVNQTEFZX0tIUiI7CisgICAgICAgIGNhc2UgVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUiI7CisgICAgICAgIGNhc2UgVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQiOworICAgICAgICBjYXNlIFZLX0VSUk9SX0lOVkFMSURfRFJNX0ZPUk1BVF9NT0RJRklFUl9QTEFORV9MQVlPVVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FUlJPUl9JTlZBTElEX0RSTV9GT1JNQVRfTU9ESUZJRVJfUExBTkVfTEFZT1VUX0VYVCI7CisgICAgICAgIGNhc2UgVktfRVJST1JfSU5WQUxJRF9FWFRFUk5BTF9IQU5ETEU6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX0lOVkFMSURfRVhURVJOQUxfSEFORExFIjsKKyAgICAgICAgY2FzZSBWS19FUlJPUl9JTlZBTElEX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19FUlJPUl9JTlZBTElEX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfS0hSIjsKKyAgICAgICAgY2FzZSBWS19FUlJPUl9JTlZBTElEX1NIQURFUl9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVJST1JfSU5WQUxJRF9TSEFERVJfTlYiOworICAgICAgICBjYXNlIFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVCI7CisgICAgICAgIGNhc2UgVktfRVJST1JfTUVNT1JZX01BUF9GQUlMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX01FTU9SWV9NQVBfRkFJTEVEIjsKKyAgICAgICAgY2FzZSBWS19FUlJPUl9OQVRJVkVfV0lORE9XX0lOX1VTRV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX05BVElWRV9XSU5ET1dfSU5fVVNFX0tIUiI7CisgICAgICAgIGNhc2UgVktfRVJST1JfTk9UX1BFUk1JVFRFRF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX05PVF9QRVJNSVRURURfRVhUIjsKKyAgICAgICAgY2FzZSBWS19FUlJPUl9PVVRfT0ZfREFURV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX09VVF9PRl9EQVRFX0tIUiI7CisgICAgICAgIGNhc2UgVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlk6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZIjsKKyAgICAgICAgY2FzZSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSI7CisgICAgICAgIGNhc2UgVktfRVJST1JfT1VUX09GX1BPT0xfTUVNT1JZOgorICAgICAgICAgICAgcmV0dXJuICJWS19FUlJPUl9PVVRfT0ZfUE9PTF9NRU1PUlkiOworICAgICAgICBjYXNlIFZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX1NVUkZBQ0VfTE9TVF9LSFIiOworICAgICAgICBjYXNlIFZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFM6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VSUk9SX1RPT19NQU5ZX09CSkVDVFMiOworICAgICAgICBjYXNlIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUIjsKKyAgICAgICAgY2FzZSBWS19FVkVOVF9SRVNFVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVZFTlRfUkVTRVQiOworICAgICAgICBjYXNlIFZLX0VWRU5UX1NFVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVZFTlRfU0VUIjsKKyAgICAgICAgY2FzZSBWS19JTkNPTVBMRVRFOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTkNPTVBMRVRFIjsKKyAgICAgICAgY2FzZSBWS19OT1RfUkVBRFk6CisgICAgICAgICAgICByZXR1cm4gIlZLX05PVF9SRUFEWSI7CisgICAgICAgIGNhc2UgVktfU1VCT1BUSU1BTF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVQk9QVElNQUxfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVUNDRVNTOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVUNDRVNTIjsKKyAgICAgICAgY2FzZSBWS19USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJWS19USU1FT1VUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUmVzdWx0IjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU3RydWN0dXJlVHlwZShWa1N0cnVjdHVyZVR5cGUgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTdHJ1Y3R1cmVUeXBlKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NSRUFURV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX05FWFRfSU1BR0VfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfTkVYVF9JTUFHRV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRk9STUFUX1BST1BFUlRJRVNfQU5EUk9JRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRk9STUFUX1BST1BFUlRJRVNfQU5EUk9JRCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfUFJPUEVSVElFU19BTkRST0lEOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1VTQUdFX0FORFJPSUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1VTQUdFX0FORFJPSUQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fMl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fMl9LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fU1RFTkNJTF9MQVlPVVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX1NURU5DSUxfTEFZT1VUX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV9TVEVOQ0lMX0xBWU9VVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFX1NURU5DSUxfTEFZT1VUX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQklORF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX0lORk9fTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfU1dBUENIQUlOX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9TV0FQQ0hBSU5fSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfUExBTkVfTUVNT1JZX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfUExBTkVfTUVNT1JZX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfQ1JFQVRFX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9CQVJSSUVSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX0JBUlJJRVIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0NSRUFURV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX1ZJRVdfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9WSUVXX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9DQUxJQlJBVEVEX1RJTUVTVEFNUF9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQ0FMSUJSQVRFRF9USU1FU1RBTVBfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0NIRUNLUE9JTlRfREFUQV9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQ0hFQ0tQT0lOVF9EQVRBX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9DTURfUFJPQ0VTU19DT01NQU5EU19JTkZPX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQ01EX1BST0NFU1NfQ09NTUFORFNfSU5GT19OVlgiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQ01EX1JFU0VSVkVfU1BBQ0VfRk9SX0NPTU1BTkRTX0lORk9fTlZYIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CRUdJTl9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQ09ORElUSU9OQUxfUkVOREVSSU5HX0JFR0lOX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0NPUFlfREVTQ1JJUFRPUl9TRVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0NPUFlfREVTQ1JJUFRPUl9TRVQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0QzRDEyX0ZFTkNFX1NVQk1JVF9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRDNEMTJfRkVOQ0VfU1VCTUlUX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfTUFSS0VSX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfTUFSS0VSX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX05BTUVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfTkFNRV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9UQUdfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfVEFHX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX0xBQkVMX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NBTExCQUNLX0RBVEFfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9OQU1FX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fQlVGRkVSX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9CVUZGRVJfQ1JFQVRFX0lORk9fTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9DUkVBVEVfSU5GT19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX01FTU9SWV9BTExPQ0FURV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0lOTElORV9VTklGT1JNX0JMT0NLX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0lOTElORV9VTklGT1JNX0JMT0NLX0NSRUFURV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0JJTkRJTkdfRkxBR1NfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQUxMT0NBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQUxMT0NBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfTEFZT1VUX1NVUFBPUlRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfRVZFTlRfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRkVBVFVSRVNfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0ZFQVRVUkVTX05WWCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0xJTUlUU19OVlgiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9CSU5EX1NQQVJTRV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9SRU5ERVJfUEFTU19CRUdJTl9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUkVOREVSX1BBU1NfQkVHSU5fSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1VCTUlUX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQ1JFQVRFX0lORk9fQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0NSRUFURV9JTkZPX0FNRCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9HTE9CQUxfUFJJT1JJVFlfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0NSRUFURV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0lORk9fMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0lORk9fMiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9FVkVOVF9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9FVkVOVF9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9NT0RFX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9NT0RFX0NSRUFURV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9NT0RFX1BST1BFUlRJRVNfMl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9QUk9QRVJUSUVTXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX05BVElWRV9IRFJfU1VSRkFDRV9DQVBBQklMSVRJRVNfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX05BVElWRV9IRFJfU1VSRkFDRV9DQVBBQklMSVRJRVNfQU1EIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX0NBUEFCSUxJVElFU18yX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9DQVBBQklMSVRJRVNfMl9LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfSU5GT18yX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9JTkZPXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfUFJPUEVSVElFU18yX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QT1dFUl9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QT1dFUl9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUkVTRU5UX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BSRVNFTlRfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJPUEVSVElFU18yX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUk9QRVJUSUVTXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfTElTVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19MSVNUX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX0ZFTkNFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX0ZFTkNFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfV0lOMzJfSEFORExFX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0JVRkZFUl9QUk9QRVJUSUVTIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GT1JNQVRfQU5EUk9JRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfUFJPUEVSVElFUyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9TRU1BUEhPUkVfUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVMiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfR0VUX0ZEX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0ZJTFRFUl9DVUJJQ19JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRklMVEVSX0NVQklDX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRTX0NSRUFURV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX1RSSUFOR0xFU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0hEUl9NRVRBREFUQV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0hEUl9NRVRBREFUQV9FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0hFQURMRVNTX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9IRUFETEVTU19TVVJGQUNFX0NSRUFURV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQToKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQSI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0VYUExJQ0lUX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfUExBTkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9QTEFORV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1BBUlNFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TVEVOQ0lMX1VTQUdFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfSEFORExFX0lORk9fTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0hBTkRMRV9JTkZPX05WWCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19VU0FHRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19VU0FHRV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfRkRfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfSE9TVF9QT0lOVEVSX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0hPU1RfUE9JTlRFUl9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX0ZEX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX0ZEX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlgiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUwiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU9TX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTVZLOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9JT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVksiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9ERVZJQ0VfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9ERVZJQ0VfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfTUFDT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVksiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0UiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9GTEFHU19JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfRkxBR1NfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQkFSUklFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfQUxMT0NBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX1JFUVVJUkVNRU5UUzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFMiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9GRF9QUk9QRVJUSUVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0ZEX1BST1BFUlRJRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfRkRfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfRkRfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0hPU1RfUE9JTlRFUl9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0hPU1RfUE9JTlRFUl9QUk9QRVJUSUVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQUxMT0NBVEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0FMTE9DQVRFX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUFJJT1JJVFlfQUxMT0NBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9QUklPUklUWV9BTExPQ0FURV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9XSU4zMl9IQU5ETEVfUFJPUEVSVElFU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9XSU4zMl9IQU5ETEVfUFJPUEVSVElFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FVEFMX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTVVMVElTQU1QTEVfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX01VTFRJU0FNUExFX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9PQkpFQ1RfVEFCTEVfQ1JFQVRFX0lORk9fTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9PQkpFQ1RfVEFCTEVfQ1JFQVRFX0lORk9fTlZYIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX0FDUVVJUkVfSU5GT19JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09ORklHVVJBVElPTl9BQ1FVSVJFX0lORk9fSU5URUwiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0RFU0NSSVBUSU9OX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9NQVJLRVJfSU5GT19JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfTUFSS0VSX0lORk9fSU5URUwiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX09WRVJSSURFX0lORk9fSU5URUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX09WRVJSSURFX0lORk9fSU5URUwiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX1NVQk1JVF9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9TVFJFQU1fTUFSS0VSX0lORk9fSU5URUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX1NUUkVBTV9NQVJLRVJfSU5GT19JTlRFTCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzE2QklUX1NUT1JBR0VfRkVBVFVSRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzhCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX0ZFQVRVUkVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9QUk9QRVJUSUVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0RFVklDRV9BRERSRVNTX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0ZFQVRVUkVTX0FNRCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09NUFVURV9TSEFERVJfREVSSVZBVElWRVNfRkVBVFVSRVNfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0ZFQVRVUkVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfRkVBVFVSRVNfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9QUk9QRVJUSUVTX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09STkVSX1NBTVBMRURfSU1BR0VfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1JORVJfU0FNUExFRF9JTUFHRV9GRUFUVVJFU19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfRkVBVFVSRVNfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0FMSUFTSU5HX0ZFQVRVUkVTX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfQ0xJUF9FTkFCTEVfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfQ0xJUF9FTkFCTEVfRkVBVFVSRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfU1RFTkNJTF9SRVNPTFZFX1BST1BFUlRJRVNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfU1RFTkNJTF9SRVNPTFZFX1BST1BFUlRJRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX0ZFQVRVUkVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRElTQ0FSRF9SRUNUQU5HTEVfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ESVNDQVJEX1JFQ1RBTkdMRV9QUk9QRVJUSUVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYQ0xVU0lWRV9TQ0lTU09SX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhDTFVTSVZFX1NDSVNTT1JfRkVBVFVSRVNfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0JVRkZFUl9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfRkVOQ0VfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfTUVNT1JZX0hPU1RfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9NRU1PUllfSE9TVF9QUk9QRVJUSUVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX1NFTUFQSE9SRV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUX0NPTlRST0xTX1BST1BFUlRJRVNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkxPQVRfQ09OVFJPTFNfUFJPUEVSVElFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0lOVEVSTE9DS19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfSU5URVJMT0NLX0ZFQVRVUkVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0dST1VQX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSE9TVF9RVUVSWV9SRVNFVF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9IT1NUX1FVRVJZX1JFU0VUX0ZFQVRVUkVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JRF9QUk9QRVJUSUVTIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9GRUFUVVJFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9GT1JNQVRfSU5GT18yIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfVklFV19JTUFHRV9GT1JNQVRfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOREVYX1RZUEVfVUlOVDhfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5ERVhfVFlQRV9VSU5UOF9GRUFUVVJFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9GRUFUVVJFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVMiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfQlVER0VUX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJJT1JJVFlfRkVBVFVSRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BST1BFUlRJRVNfMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX0ZFQVRVUkVTX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfUFJPUEVSVElFU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX1BST1BFUlRJRVNfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVMiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19QUk9QRVJUSUVTX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUFJPUEVSVElFUyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BDSV9CVVNfSU5GT19QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BDSV9CVVNfSU5GT19QUk9QRVJUSUVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX1BST1BFUlRJRVNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfUFJPUEVSVElFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0ZFQVRVUkVTX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QT0lOVF9DTElQUElOR19QUk9QRVJUSUVTIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfRkVBVFVSRVMiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9URUNURURfTUVNT1JZX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9URUNURURfTUVNT1JZX1BST1BFUlRJRVMiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QVVNIX0RFU0NSSVBUT1JfUFJPUEVSVElFU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QVVNIX0RFU0NSSVBUT1JfUFJPUEVSVElFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SQVlfVFJBQ0lOR19QUk9QRVJUSUVTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkFZX1RSQUNJTkdfUFJPUEVSVElFU19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX0ZFQVRVUkVTX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9GSUxURVJfTUlOTUFYX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9GSUxURVJfTUlOTUFYX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFX0xPQ0FUSU9OU19QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRV9MT0NBVElPTlNfUFJPUEVSVElFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0VQQVJBVEVfREVQVEhfU1RFTkNJTF9MQVlPVVRTX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19GRUFUVVJFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQVRPTUlDX0lOVDY0X0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9BVE9NSUNfSU5UNjRfRkVBVFVSRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NMT0NLX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DTE9DS19GRUFUVVJFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NPUkVfUFJPUEVSVElFU18yX0FNRCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NPUkVfUFJPUEVSVElFU19BTUQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRkVBVFVSRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19GRUFUVVJFUzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVMiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lNQUdFX0ZPT1RQUklOVF9GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfRkVBVFVSRVNfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU5URUdFUl9GVU5DVElPTlNfMl9GRUFUVVJFU19JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTlRFR0VSX0ZVTkNUSU9OU18yX0ZFQVRVUkVTX0lOVEVMIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX1BST1BFUlRJRVNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU01fQlVJTFRJTlNfUFJPUEVSVElFU19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRkVBVFVSRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX0ZFQVRVUkVTX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX1BST1BFUlRJRVNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfUFJPUEVSVElFU19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NQQVJTRV9JTUFHRV9GT1JNQVRfSU5GT18yOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1BBUlNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfUFJPUEVSVElFUyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfRkVBVFVSRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VSRkFDRV9JTkZPXzJfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VSRkFDRV9JTkZPXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0ZFQVRVUkVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX0ZFQVRVUkVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9GRUFUVVJFU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfRkVBVFVSRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVE9PTF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RPT0xfUFJPUEVSVElFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX0ZFQVRVUkVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19QUk9QRVJUSUVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1VOSUZPUk1fQlVGRkVSX1NUQU5EQVJEX0xBWU9VVF9GRUFUVVJFU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFUyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX1BST1BFUlRJRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1lDQkNSX0lNQUdFX0FSUkFZU19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ0FDSEVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX0FEVkFOQ0VEX1NUQVRFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfQURWQU5DRURfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfU1RBVEVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTVBJTEVSX0NPTlRST0xfQ1JFQVRFX0lORk9fQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT01QSUxFUl9DT05UUk9MX0NSRUFURV9JTkZPX0FNRCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfTU9EVUxBVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfTU9EVUxBVElPTl9TVEFURV9DUkVBVEVfSU5GT19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfUkVEVUNUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9SRURVQ1RJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1RPX0NPTE9SX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RJU0NBUkRfUkVDVEFOR0xFX1NUQVRFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRElTQ0FSRF9SRUNUQU5HTEVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lOVEVSTkFMX1JFUFJFU0VOVEFUSU9OX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX01VTFRJU0FNUExFX1NUQVRFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0NPTlNFUlZBVElWRV9TVEFURV9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fREVQVEhfQ0xJUF9TVEFURV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fREVQVEhfQ0xJUF9TVEFURV9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fTElORV9TVEFURV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fTElORV9TVEFURV9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfUkFTVEVSSVpBVElPTl9PUkRFUl9BTUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfUkFTVEVSSVpBVElPTl9PUkRFUl9BTUQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfU1RSRUFNX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9TVFJFQU1fQ1JFQVRFX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX1NUQVRFX0NSRUFURV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TQU1QTEVfTE9DQVRJT05TX1NUQVRFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0FNUExFX0xPQ0FUSU9OU19TVEFURV9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfUkVRVUlSRURfU1VCR1JPVVBfU0laRV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9SRVFVSVJFRF9TVUJHUk9VUF9TSVpFX0NSRUFURV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fU1RBVEVfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9TVEFURV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX0RJVklTT1JfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfRElWSVNPUl9TVEFURV9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9TVEFURV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX1NUQVRFX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9DT0FSU0VfU0FNUExFX09SREVSX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9DT0FSU0VfU0FNUExFX09SREVSX1NUQVRFX0NSRUFURV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9FWENMVVNJVkVfU0NJU1NPUl9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9JTUFHRV9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU0hBRElOR19SQVRFX0lNQUdFX1NUQVRFX0NSRUFURV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TVEFURV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NXSVpaTEVfU1RBVEVfQ1JFQVRFX0lORk9fTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NXSVpaTEVfU1RBVEVfQ1JFQVRFX0lORk9fTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1dfU0NBTElOR19TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfV19TQ0FMSU5HX1NUQVRFX0NSRUFURV9JTkZPX05WIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0ZSQU1FX1RPS0VOX0dHUDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9GUkFNRV9UT0tFTl9HR1AiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfUkVHSU9OU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfUkVHSU9OU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEU6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEUiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUFJPVEVDVEVEX1NVQk1JVF9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9QRVJGT1JNQU5DRV9DUkVBVEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9DSEVDS1BPSU5UX1BST1BFUlRJRVNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9DSEVDS1BPSU5UX1BST1BFUlRJRVNfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9QUk9QRVJUSUVTXzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9QUk9QRVJUSUVTXzIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19QSVBFTElORV9DUkVBVEVfSU5GT19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0FUVEFDSE1FTlRfQkVHSU5fSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0FUVEFDSE1FTlRfQkVHSU5fSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk9fMl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19GUkFHTUVOVF9ERU5TSVRZX01BUF9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0lOUFVUX0FUVEFDSE1FTlRfQVNQRUNUX0NSRUFURV9JTkZPIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfU0FNUExFX0xPQ0FUSU9OU19CRUdJTl9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfU0FNUExFX0xPQ0FUSU9OU19CRUdJTl9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfQ1JFQVRFX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fQ1JFQVRFX0lORk86CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU1BR0VfRk9STUFUX1BST1BFUlRJRVMiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfRkRfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfRkRfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfR0VUX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1NJR05BTF9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1NJR05BTF9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1RZUEVfQ1JFQVRFX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfVFlQRV9DUkVBVEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9XQUlUX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfV0FJVF9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTyI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TSEFSRURfUFJFU0VOVF9TVVJGQUNFX0NBUEFCSUxJVElFU19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU1BBUlNFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfMiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9DUkVBVEVfSU5GT19HR1A6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfQ1JFQVRFX0lORk9fR0dQIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8iOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVBFTkRFTkNZXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OXzJfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fREVQVEhfU1RFTkNJTF9SRVNPTFZFX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfRU5EX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GT1JNQVRfMl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRk9STUFUXzJfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX1dJTjMyX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9XSU4zMl9JTkZPX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NPVU5URVJfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ09VTlRFUl9DUkVBVEVfSU5GT19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9ESVNQTEFZX05BVElWRV9IRFJfQ1JFQVRFX0lORk9fQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fRElTUExBWV9OQVRJVkVfSERSX0NSRUFURV9JTkZPX0FNRCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVEVYVFVSRV9MT0RfR0FUSEVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FNRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfVEVYVFVSRV9MT0RfR0FUSEVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FNRCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVElNRUxJTkVfU0VNQVBIT1JFX1NVQk1JVF9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfVElNRUxJTkVfU0VNQVBIT1JFX1NVQk1JVF9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9DQUNIRV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfQ1JFQVRFX0lORk9fRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GRUFUVVJFU19FWFQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkxBR1NfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZMQUdTX0VYVCI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVklfU1VSRkFDRV9DUkVBVEVfSU5GT19OTjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfVklfU1VSRkFDRV9DUkVBVEVfSU5GT19OTiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV0FZTEFORF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfV0FZTEFORF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19LSFIiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19OViI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYiOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9YQ0JfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NUUlVDVFVSRV9UWVBFX1hDQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfWExJQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RSVUNUVVJFX1RZUEVfWExJQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1N0cnVjdHVyZVR5cGUiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUoVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0NBQ0hFOgorICAgICAgICAgICAgcmV0dXJuICJWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9DQUNIRSI7CisgICAgICAgIGNhc2UgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfQ09NTUFORCI7CisgICAgICAgIGNhc2UgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfREVWSUNFOgorICAgICAgICAgICAgcmV0dXJuICJWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9ERVZJQ0UiOworICAgICAgICBjYXNlIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFOgorICAgICAgICAgICAgcmV0dXJuICJWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSI7CisgICAgICAgIGNhc2UgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtJbnRlcm5hbEFsbG9jYXRpb25UeXBlKFZrSW50ZXJuYWxBbGxvY2F0aW9uVHlwZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0ludGVybmFsQWxsb2NhdGlvblR5cGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0lOVEVSTkFMX0FMTE9DQVRJT05fVFlQRV9FWEVDVVRBQkxFOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTlRFUk5BTF9BTExPQ0FUSU9OX1RZUEVfRVhFQ1VUQUJMRSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0ludGVybmFsQWxsb2NhdGlvblR5cGUiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtGb3JtYXQoVmtGb3JtYXQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtGb3JtYXQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMVI1RzVCNV9VTk9STV9QQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BMVI1RzVCNV9VTk9STV9QQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TSU5UX1BBQ0szMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0EyQjEwRzEwUjEwX1NJTlRfUEFDSzMyIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfU05PUk1fUEFDSzMyOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQTJCMTBHMTBSMTBfU05PUk1fUEFDSzMyIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfU1NDQUxFRF9QQUNLMzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TU0NBTEVEX1BBQ0szMiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VJTlRfUEFDSzMyOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQTJCMTBHMTBSMTBfVUlOVF9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VTk9STV9QQUNLMzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VTk9STV9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0EyQjEwRzEwUjEwX1VTQ0FMRURfUEFDSzMyIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfU0lOVF9QQUNLMzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TSU5UX1BBQ0szMiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NOT1JNX1BBQ0szMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0EyUjEwRzEwQjEwX1NOT1JNX1BBQ0szMiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NTQ0FMRURfUEFDSzMyOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQTJSMTBHMTBCMTBfU1NDQUxFRF9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VSU5UX1BBQ0szMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0EyUjEwRzEwQjEwX1VJTlRfUEFDSzMyIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVVNDQUxFRF9QQUNLMzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VU0NBTEVEX1BBQ0szMiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQThCOEc4UjhfU0lOVF9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9TTk9STV9QQUNLMzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BOEI4RzhSOF9TTk9STV9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9TUkdCX1BBQ0szMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0E4QjhHOFI4X1NSR0JfUEFDSzMyIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfU1NDQUxFRF9QQUNLMzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BOEI4RzhSOF9TU0NBTEVEX1BBQ0szMiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0E4QjhHOFI4X1VJTlRfUEFDSzMyOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQThCOEc4UjhfVUlOVF9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9VU0NBTEVEX1BBQ0szMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHgxMF9TRkxPQVRfQkxPQ0tfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ18xMHgxMF9TRkxPQVRfQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHgxMF9TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ18xMHgxMF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHgxMF9VTk9STV9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfMTB4MTBfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDVfU0ZMT0FUX0JMT0NLX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfMTB4NV9TRkxPQVRfQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg1X1NSR0JfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzEweDVfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4Nl9TRkxPQVRfQkxPQ0tfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ18xMHg2X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDZfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfMTB4Nl9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg2X1VOT1JNX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ18xMHg2X1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg4X1NGTE9BVF9CTE9DS19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzEweDhfU0ZMT0FUX0JMT0NLX0VYVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4OF9TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ18xMHg4X1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDhfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzEweDhfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NGTE9BVF9CTE9DS19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1VOT1JNX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTJ4MTJfU0ZMT0FUX0JMT0NLX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfMTJ4MTJfU0ZMT0FUX0JMT0NLX0VYVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTJ4MTJfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzEyeDEyX1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ180eDRfU0ZMT0FUX0JMT0NLX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfNHg0X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzR4NF9TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ180eDRfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NF9TRkxPQVRfQkxPQ0tfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ181eDRfU0ZMT0FUX0JMT0NLX0VYVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNXg0X1NSR0JfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzV4NF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDRfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzV4NF9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNXg1X1NGTE9BVF9CTE9DS19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzV4NV9TRkxPQVRfQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDVfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfNXg1X1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NV9VTk9STV9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfNXg1X1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDVfU0ZMT0FUX0JMT0NLX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfNng1X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzZ4NV9TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ182eDVfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzZ4Nl9TRkxPQVRfQkxPQ0tfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ182eDZfU0ZMT0FUX0JMT0NLX0VYVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng2X1NSR0JfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzZ4Nl9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDZfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzZ4Nl9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg1X1NGTE9BVF9CTE9DS19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzh4NV9TRkxPQVRfQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDVfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfOHg1X1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4NV9VTk9STV9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfOHg1X1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDZfU0ZMT0FUX0JMT0NLX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0FTVENfOHg2X1NGTE9BVF9CTE9DS19FWFQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4Nl9TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ184eDZfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4OF9TRkxPQVRfQkxPQ0tfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQVNUQ184eDhfU0ZMT0FUX0JMT0NLX0VYVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg4X1NSR0JfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzh4OF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDhfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9BU1RDXzh4OF9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0IxMEcxMVIxMV9VRkxPQVRfUEFDSzMyOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjEwRzExUjExX1VGTE9BVF9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CMTBYNkcxMFg2UjEwWDZHMTBYNl80MjJfVU5PUk1fNFBBQ0sxNjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0IxMFg2RzEwWDZSMTBYNkcxMFg2XzQyMl9VTk9STV80UEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjEyWDRHMTJYNFIxMlg0RzEyWDRfNDIyX1VOT1JNXzRQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0IxNkcxNlIxNkcxNl80MjJfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjRHNFI0QTRfVU5PUk1fUEFDSzE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjRHNFI0QTRfVU5PUk1fUEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjVHNVI1QTFfVU5PUk1fUEFDSzE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjVHNVI1QTFfVU5PUk1fUEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjVHNlI1X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0I1RzZSNV9VTk9STV9QQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9TSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjhHOFI4QThfU0lOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOEE4X1NOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjhHOFI4QThfU05PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9TUkdCOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjhHOFI4QThfU1JHQiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOEE4X1NTQ0FMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9COEc4UjhBOF9TU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4QThfVUlOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0I4RzhSOEE4X1VJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4QThfVVNDQUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0I4RzhSOEE4X1VTQ0FMRUQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0I4RzhSOF9TSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1NOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjhHOFI4X1NOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1NSR0I6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9COEc4UjhfU1JHQiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOF9TU0NBTEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjhHOFI4X1NTQ0FMRUQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhfVUlOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0I4RzhSOF9VSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1VOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQjhHOFI4X1VOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1VTQ0FMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9COEc4UjhfVVNDQUxFRCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JBX1NSR0JfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzFfUkdCQV9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkMxX1JHQkFfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzFfUkdCQV9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0JDMV9SR0JfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzFfUkdCX1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzJfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMl9VTk9STV9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0JDMl9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDM19TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzNfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzNfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzRfU05PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzRfU05PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzRfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzRfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzVfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzZIX1NGTE9BVF9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0JDNkhfU0ZMT0FUX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzZIX1VGTE9BVF9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDN19TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfQkM3X1NSR0JfQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzdfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9CQzdfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMTZfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9EMTZfVU5PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMTZfVU5PUk1fUzhfVUlOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0QxNl9VTk9STV9TOF9VSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0QzMl9TRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9EMzJfU0ZMT0FUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzIiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FQUNfUjExRzExX1NOT1JNX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRUFDX1IxMUcxMV9TTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFHMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9FQUNfUjExRzExX1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRUFDX1IxMV9TTk9STV9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FQUNfUjExX1VOT1JNX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRUFDX1IxMV9VTk9STV9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1VOT1JNX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9TUkdCX0JMT0NLIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9VTk9STV9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0VUQzJfUjhHOEI4QThfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9TUkdCX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRVRDMl9SOEc4QjhfU1JHQl9CTE9DSyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4X1VOT1JNX0JMT0NLOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRVRDMl9SOEc4QjhfVU5PUk1fQkxPQ0siOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0cxMFg2QjEwWDZHMTBYNlIxMFg2XzQyMl9VTk9STV80UEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNEIxMlg0RzEyWDRSMTJYNF80MjJfVU5PUk1fNFBBQ0sxNjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTZCMTZHMTZSMTZfNDIyX1VOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRzE2QjE2RzE2UjE2XzQyMl9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjJfVU5PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMF9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMF9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMl9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjJfVU5PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDQ0X1VOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1BWUlRDMV8yQlBQX1NSR0JfQkxPQ0tfSU1HOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUFZSVEMxXzJCUFBfU1JHQl9CTE9DS19JTUciOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzFfMkJQUF9VTk9STV9CTE9DS19JTUc6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9QVlJUQzFfMkJQUF9VTk9STV9CTE9DS19JTUciOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzFfNEJQUF9TUkdCX0JMT0NLX0lNRzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1BWUlRDMV80QlBQX1NSR0JfQkxPQ0tfSU1HIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUFZSVEMxXzRCUFBfVU5PUk1fQkxPQ0tfSU1HOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUFZSVEMxXzRCUFBfVU5PUk1fQkxPQ0tfSU1HIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUFZSVEMyXzJCUFBfU1JHQl9CTE9DS19JTUc6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9TUkdCX0JMT0NLX0lNRyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1BWUlRDMl8yQlBQX1VOT1JNX0JMT0NLX0lNRzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1BWUlRDMl8yQlBQX1VOT1JNX0JMT0NLX0lNRyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1BWUlRDMl80QlBQX1NSR0JfQkxPQ0tfSU1HOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUFZSVEMyXzRCUFBfU1JHQl9CTE9DS19JTUciOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzJfNEJQUF9VTk9STV9CTE9DS19JTUc6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9QVlJUQzJfNEJQUF9VTk9STV9CTE9DS19JTUciOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjEwWDZHMTBYNkIxMFg2QTEwWDZfVU5PUk1fNFBBQ0sxNiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxMFg2RzEwWDZfVU5PUk1fMlBBQ0sxNjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxMFg2RzEwWDZfVU5PUk1fMlBBQ0sxNiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxMFg2X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxMFg2X1VOT1JNX1BBQ0sxNiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxMlg0RzEyWDRCMTJYNEExMlg0X1VOT1JNXzRQQUNLMTY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjEyWDRHMTJYNF9VTk9STV8yUEFDSzE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjEyWDRHMTJYNF9VTk9STV8yUEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNkIxNkExNl9TRkxPQVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NTQ0FMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVVNDQUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNkIxNkExNl9VU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1NGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNkIxNl9TRkxPQVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNkIxNl9TSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1NTQ0FMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9VSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjE2RzE2QjE2X1VJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTZHMTZCMTZfVU5PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZfVVNDQUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNkIxNl9VU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1NGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNl9TRkxPQVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNl9TSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1NOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjE2RzE2X1NOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1NTQ0FMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTZHMTZfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9VSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjE2RzE2X1VJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTZHMTZfVU5PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfVVNDQUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNkcxNl9VU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNl9TRkxPQVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNl9TSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjE2X1NOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NTQ0FMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTZfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNl9VSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjE2X1VJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMTZfVU5PUk0iOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfVVNDQUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IxNl9VU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IzMkczMkIzMkEzMl9TRkxPQVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IzMkczMkIzMkEzMl9TSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IzMkczMkIzMl9TRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMzJHMzJCMzJfU0lOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IzMkczMkIzMl9VSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjMyRzMyQjMyX1VJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJfU0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjMyRzMyX1NGTE9BVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IzMkczMl9TSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjMyRzMyX1NJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJfVUlOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IzMkczMl9VSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyX1NGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IzMl9TRkxPQVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1IzMl9TSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyX1VJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SMzJfVUlOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I0RzRCNEE0X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I0RzRCNEE0X1VOT1JNX1BBQ0sxNiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I0RzRfVU5PUk1fUEFDSzg6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SNEc0X1VOT1JNX1BBQ0s4IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjVHNUI1QTFfVU5PUk1fUEFDSzE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjVHNUI1QTFfVU5PUk1fUEFDSzE2IjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjVHNkI1X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTYiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfVUlOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I2NEc2NEI2NEE2NF9VSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0X1NGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I2NEc2NEI2NF9TRkxPQVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I2NEc2NEI2NF9TSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0X1VJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SNjRHNjRCNjRfVUlOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NF9TRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SNjRHNjRfU0ZMT0FUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0X1NJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SNjRHNjRfU0lOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NF9VSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjY0RzY0X1VJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRfU0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjY0X1NGTE9BVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NF9TSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjY0X1NJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRfVUlOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I2NF9VSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhCOEE4X1NJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9TTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhCOEE4X1NOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfU1JHQjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhCOEE4X1NSR0IiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9TU0NBTEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjhHOEI4QThfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1VJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOEc4QjhBOF9VSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1VTQ0FMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOEc4QjhBOF9VU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1NJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOEc4QjhfU0lOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9TTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhCOF9TTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9TUkdCOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjhHOEI4X1NSR0IiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfU1NDQUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhCOF9TU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1VJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOEc4QjhfVUlOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9VTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhCOF9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9VU0NBTEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjhHOEI4X1VTQ0FMRUQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1NJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOEc4X1NJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1NOT1JNOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjhHOF9TTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhfU1JHQjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhfU1JHQiI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhfU1NDQUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhfVUlOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4RzhfVUlOVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOEc4X1VOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOF9VU0NBTEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjhHOF9VU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhfU0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4X1NJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOF9TTk9STToKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4X1NOT1JNIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhfU1JHQjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1I4X1NSR0IiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOF9TU0NBTEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfUjhfU1NDQUxFRCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4X1VJTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOF9VSU5UIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOF9VTk9STSI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4X1VTQ0FMRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9SOF9VU0NBTEVEIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUzhfVUlOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX1M4X1VJTlQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9VTkRFRklORUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9VTkRFRklORUQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfWDhfRDI0X1VOT1JNX1BBQ0szMiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Zvcm1hdCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyhWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRkVBVFVSRV9CTElUX0RTVF9CSVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9GRUFUVVJFX0JMSVRfU1JDX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9TUkNfQklUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQkxFTkRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JMRU5EX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfQ09TSVRFRF9DSFJPTUFfU0FNUExFU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9GRUFUVVJFX0NPU0lURURfQ0hST01BX1NBTVBMRVNfQklUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRkVBVFVSRV9ESVNKT0lOVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9GRUFUVVJFX0RJU0pPSU5UX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfTUlEUE9JTlRfQ0hST01BX1NBTVBMRVNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRkVBVFVSRV9NSURQT0lOVF9DSFJPTUFfU0FNUExFU19CSVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0lNRzoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0lNRyI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTUlOTUFYX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX01JTk1BWF9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9CSVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfRk9SQ0VBQkxFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX0NIUk9NQV9SRUNPTlNUUlVDVElPTl9FWFBMSUNJVF9GT1JDRUFCTEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fTElORUFSX0ZJTFRFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9MSU5FQVJfRklMVEVSX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9ZQ0JDUl9DT05WRVJTSU9OX1NFUEFSQVRFX1JFQ09OU1RSVUNUSU9OX0ZJTFRFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9TRVBBUkFURV9SRUNPTlNUUlVDVElPTl9GSUxURVJfQklUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9BVE9NSUNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9BVE9NSUNfQklUIjsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCI7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0ZFQVRVUkVfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRkVBVFVSRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQiOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9GRUFUVVJFX1ZFUlRFWF9CVUZGRVJfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GT1JNQVRfRkVBVFVSRV9WRVJURVhfQlVGRkVSX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0Zvcm1hdEZlYXR1cmVGbGFncyhWa0Zvcm1hdEZlYXR1cmVGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0Zvcm1hdEZlYXR1cmVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0Zvcm1hdEZlYXR1cmVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0ltYWdlVHlwZShWa0ltYWdlVHlwZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0ltYWdlVHlwZSlpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8xRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVFlQRV8xRCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8yRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVFlQRV8yRCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8zRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVFlQRV8zRCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0ltYWdlVHlwZSI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0ltYWdlVGlsaW5nKFZrSW1hZ2VUaWxpbmcgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtJbWFnZVRpbGluZylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1RJTElOR19MSU5FQVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX1RJTElOR19MSU5FQVIiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9USUxJTkdfT1BUSU1BTCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0ltYWdlVGlsaW5nIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrSW1hZ2VVc2FnZUZsYWdCaXRzKFZrSW1hZ2VVc2FnZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrSW1hZ2VVc2FnZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1VTQUdFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX1VTQUdFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrSW1hZ2VVc2FnZUZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrSW1hZ2VVc2FnZUZsYWdzKFZrSW1hZ2VVc2FnZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrSW1hZ2VVc2FnZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrSW1hZ2VVc2FnZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrSW1hZ2VVc2FnZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrSW1hZ2VVc2FnZUZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrSW1hZ2VDcmVhdGVGbGFnQml0cyhWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtJbWFnZUNyZWF0ZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQ1JFQVRFX0FMSUFTX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfQ1JFQVRFX0FMSUFTX0JJVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0NSRUFURV9FWFRFTkRFRF9VU0FHRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0NSRUFURV9FWFRFTkRFRF9VU0FHRV9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0NSRUFURV9QUk9URUNURURfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9DUkVBVEVfUFJPVEVDVEVEX0JJVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9DUkVBVEVfU0FNUExFX0xPQ0FUSU9OU19DT01QQVRJQkxFX0RFUFRIX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrSW1hZ2VDcmVhdGVGbGFncyhWa0ltYWdlQ3JlYXRlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtJbWFnZUNyZWF0ZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrSW1hZ2VDcmVhdGVGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0ltYWdlQ3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtJbWFnZUNyZWF0ZUZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhWa1NhbXBsZUNvdW50RmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTYW1wbGVDb3VudEZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVfQ09VTlRfMTZfQklUIjsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRV9DT1VOVF8xX0JJVCI7CisgICAgICAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzJfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVfQ09VTlRfMl9CSVQiOworICAgICAgICBjYXNlIFZLX1NBTVBMRV9DT1VOVF8zMl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRV9DT1VOVF8zMl9CSVQiOworICAgICAgICBjYXNlIFZLX1NBTVBMRV9DT1VOVF80X0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFX0NPVU5UXzRfQklUIjsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfNjRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVfQ09VTlRfNjRfQklUIjsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfOF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRV9DT1VOVF84X0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtTYW1wbGVDb3VudEZsYWdzKFZrU2FtcGxlQ291bnRGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa1NhbXBsZUNvdW50RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtTYW1wbGVDb3VudEZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrU2FtcGxlQ291bnRGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1NhbXBsZUNvdW50RmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQaHlzaWNhbERldmljZVR5cGUoVmtQaHlzaWNhbERldmljZVR5cGUgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQaHlzaWNhbERldmljZVR5cGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0NQVToKKyAgICAgICAgICAgIHJldHVybiAiVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfQ1BVIjsKKyAgICAgICAgY2FzZSBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9ESVNDUkVURV9HUFU6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0RJU0NSRVRFX0dQVSI7CisgICAgICAgIGNhc2UgVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfSU5URUdSQVRFRF9HUFU6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0lOVEVHUkFURURfR1BVIjsKKyAgICAgICAgY2FzZSBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9PVEhFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfT1RIRVIiOworICAgICAgICBjYXNlIFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX1ZJUlRVQUxfR1BVOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9WSVJUVUFMX0dQVSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BoeXNpY2FsRGV2aWNlVHlwZSI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1F1ZXVlRmxhZ0JpdHMoVmtRdWV1ZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUXVldWVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUVVFVUVfQ09NUFVURV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVVFX0NPTVBVVEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19RVUVVRV9HUkFQSElDU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVVFX0dSQVBISUNTX0JJVCI7CisgICAgICAgIGNhc2UgVktfUVVFVUVfUFJPVEVDVEVEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUVVFVUVfUFJPVEVDVEVEX0JJVCI7CisgICAgICAgIGNhc2UgVktfUVVFVUVfU1BBUlNFX0JJTkRJTkdfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVVRV9TUEFSU0VfQklORElOR19CSVQiOworICAgICAgICBjYXNlIFZLX1FVRVVFX1RSQU5TRkVSX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUVVFVUVfVFJBTlNGRVJfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUXVldWVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1F1ZXVlRmxhZ3MoVmtRdWV1ZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrUXVldWVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1F1ZXVlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtRdWV1ZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrUXVldWVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa01lbW9yeVByb3BlcnR5RmxhZ0JpdHMoVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrTWVtb3J5UHJvcGVydHlGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9DT0hFUkVOVF9CSVRfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0NPSEVSRU5UX0JJVF9BTUQiOworICAgICAgICBjYXNlIFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCI7CisgICAgICAgIGNhc2UgVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9VTkNBQ0hFRF9CSVRfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX1VOQ0FDSEVEX0JJVF9BTUQiOworICAgICAgICBjYXNlIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NBQ0hFRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NBQ0hFRF9CSVQiOworICAgICAgICBjYXNlIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUIjsKKyAgICAgICAgY2FzZSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQiOworICAgICAgICBjYXNlIFZLX01FTU9SWV9QUk9QRVJUWV9MQVpJTFlfQUxMT0NBVEVEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTUVNT1JZX1BST1BFUlRZX0xBWklMWV9BTExPQ0FURURfQklUIjsKKyAgICAgICAgY2FzZSBWS19NRU1PUllfUFJPUEVSVFlfUFJPVEVDVEVEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTUVNT1JZX1BST1BFUlRZX1BST1RFQ1RFRF9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrTWVtb3J5UHJvcGVydHlGbGFncyhWa01lbW9yeVByb3BlcnR5RmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrTWVtb3J5UHJvcGVydHlGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa01lbW9yeVByb3BlcnR5RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtNZW1vcnlQcm9wZXJ0eUZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrTWVtb3J5SGVhcEZsYWdCaXRzKFZrTWVtb3J5SGVhcEZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrTWVtb3J5SGVhcEZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19NRU1PUllfSEVBUF9ERVZJQ0VfTE9DQUxfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19NRU1PUllfSEVBUF9ERVZJQ0VfTE9DQUxfQklUIjsKKyAgICAgICAgY2FzZSBWS19NRU1PUllfSEVBUF9NVUxUSV9JTlNUQU5DRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX01FTU9SWV9IRUFQX01VTFRJX0lOU1RBTkNFX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa01lbW9yeUhlYXBGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa01lbW9yeUhlYXBGbGFncyhWa01lbW9yeUhlYXBGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa01lbW9yeUhlYXBGbGFnQml0cyhzdGF0aWNfY2FzdDxWa01lbW9yeUhlYXBGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa01lbW9yeUhlYXBGbGFnQml0cyhzdGF0aWNfY2FzdDxWa01lbW9yeUhlYXBGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMoVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfREVWSUNFX1FVRVVFX0NSRUFURV9QUk9URUNURURfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVZJQ0VfUVVFVUVfQ1JFQVRFX1BST1RFQ1RFRF9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrRGV2aWNlUXVldWVDcmVhdGVGbGFncyhWa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0RldmljZVF1ZXVlQ3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzKFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0JVSUxEX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9CVUlMRF9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9HUkFQSElDU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0FMTF9HUkFQSElDU19CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfU1RBR0VfQ09NTUFORF9QUk9DRVNTX0JJVF9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0NPTU1BTkRfUFJPQ0VTU19CSVRfTlZYIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9DT01QVVRFX1NIQURFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfU1RBR0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9EUkFXX0lORElSRUNUX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfRFJBV19JTkRJUkVDVF9CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX0VBUkxZX0ZSQUdNRU5UX1RFU1RTX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfRUFSTFlfRlJBR01FTlRfVEVTVFNfQklUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9ERU5TSVRZX1BST0NFU1NfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfREVOU0lUWV9QUk9DRVNTX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfU1RBR0VfTEFURV9GUkFHTUVOVF9URVNUU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX0xBVEVfRlJBR01FTlRfVEVTVFNfQklUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfU1RBR0VfUkFZX1RSQUNJTkdfU0hBREVSX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfUkFZX1RSQUNJTkdfU0hBREVSX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfU1RBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRk9STV9GRUVEQkFDS19CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfSU5QVVRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9TVEFHRV9WRVJURVhfSU5QVVRfQklUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtQaXBlbGluZVN0YWdlRmxhZ3MoVmtQaXBlbGluZVN0YWdlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtQaXBlbGluZVN0YWdlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtJbWFnZUFzcGVjdEZsYWdCaXRzKFZrSW1hZ2VBc3BlY3RGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0ltYWdlQXNwZWN0RmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfMF9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzBfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8xX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfMV9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzJfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV8yX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfM19CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9BU1BFQ1RfTUVNT1JZX1BMQU5FXzNfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtJbWFnZUFzcGVjdEZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrSW1hZ2VBc3BlY3RGbGFncyhWa0ltYWdlQXNwZWN0RmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtJbWFnZUFzcGVjdEZsYWdCaXRzKHN0YXRpY19jYXN0PFZrSW1hZ2VBc3BlY3RGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0ltYWdlQXNwZWN0RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtJbWFnZUFzcGVjdEZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0cyhWa1NwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TUEFSU0VfSU1BR0VfRk9STUFUX0FMSUdORURfTUlQX1NJWkVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TUEFSU0VfSU1BR0VfRk9STUFUX0FMSUdORURfTUlQX1NJWkVfQklUIjsKKyAgICAgICAgY2FzZSBWS19TUEFSU0VfSU1BR0VfRk9STUFUX05PTlNUQU5EQVJEX0JMT0NLX1NJWkVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TUEFSU0VfSU1BR0VfRk9STUFUX05PTlNUQU5EQVJEX0JMT0NLX1NJWkVfQklUIjsKKyAgICAgICAgY2FzZSBWS19TUEFSU0VfSU1BR0VfRk9STUFUX1NJTkdMRV9NSVBUQUlMX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1BBUlNFX0lNQUdFX0ZPUk1BVF9TSU5HTEVfTUlQVEFJTF9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrU3BhcnNlSW1hZ2VGb3JtYXRGbGFncyhWa1NwYXJzZUltYWdlRm9ybWF0RmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzKHN0YXRpY19jYXN0PFZrU3BhcnNlSW1hZ2VGb3JtYXRGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1NwYXJzZUltYWdlRm9ybWF0RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtTcGFyc2VJbWFnZUZvcm1hdEZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzKFZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TUEFSU0VfTUVNT1JZX0JJTkRfTUVUQURBVEFfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TUEFSU0VfTUVNT1JZX0JJTkRfTUVUQURBVEFfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrU3BhcnNlTWVtb3J5QmluZEZsYWdzKFZrU3BhcnNlTWVtb3J5QmluZEZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzKHN0YXRpY19jYXN0PFZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzKHN0YXRpY19jYXN0PFZrU3BhcnNlTWVtb3J5QmluZEZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRmVuY2VDcmVhdGVGbGFnQml0cyhWa0ZlbmNlQ3JlYXRlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtGZW5jZUNyZWF0ZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19GRU5DRV9DUkVBVEVfU0lHTkFMRURfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GRU5DRV9DUkVBVEVfU0lHTkFMRURfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRmVuY2VDcmVhdGVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0ZlbmNlQ3JlYXRlRmxhZ3MoVmtGZW5jZUNyZWF0ZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRmVuY2VDcmVhdGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0ZlbmNlQ3JlYXRlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtGZW5jZUNyZWF0ZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrRmVuY2VDcmVhdGVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1F1ZXJ5VHlwZShWa1F1ZXJ5VHlwZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1F1ZXJ5VHlwZSlpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUVVFUllfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NPTVBBQ1RFRF9TSVpFX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ09NUEFDVEVEX1NJWkVfTlYiOworICAgICAgICBjYXNlIFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9UWVBFX09DQ0xVU0lPTiI7CisgICAgICAgIGNhc2UgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9JTlRFTCI7CisgICAgICAgIGNhc2UgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9UWVBFX1BJUEVMSU5FX1NUQVRJU1RJQ1M6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUyI7CisgICAgICAgIGNhc2UgVktfUVVFUllfVFlQRV9USU1FU1RBTVA6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1RZUEVfVElNRVNUQU1QIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUXVlcnlUeXBlIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzKFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfQ0xJUFBJTkdfSU5WT0NBVElPTlNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfQ0xJUFBJTkdfSU5WT0NBVElPTlNfQklUIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfQ0xJUFBJTkdfUFJJTUlUSVZFU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19DTElQUElOR19QUklNSVRJVkVTX0JJVCI7CisgICAgICAgIGNhc2UgVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NPTVBVVEVfU0hBREVSX0lOVk9DQVRJT05TX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NPTVBVVEVfU0hBREVSX0lOVk9DQVRJT05TX0JJVCI7CisgICAgICAgIGNhc2UgVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0ZSQUdNRU5UX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19GUkFHTUVOVF9TSEFERVJfSU5WT0NBVElPTlNfQklUIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfR0VPTUVUUllfU0hBREVSX0lOVk9DQVRJT05TX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQiOworICAgICAgICBjYXNlIFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19HRU9NRVRSWV9TSEFERVJfUFJJTUlUSVZFU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19HRU9NRVRSWV9TSEFERVJfUFJJTUlUSVZFU19CSVQiOworICAgICAgICBjYXNlIFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19JTlBVVF9BU1NFTUJMWV9QUklNSVRJVkVTX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0lOUFVUX0FTU0VNQkxZX1BSSU1JVElWRVNfQklUIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfSU5QVVRfQVNTRU1CTFlfVkVSVElDRVNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfSU5QVVRfQVNTRU1CTFlfVkVSVElDRVNfQklUIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX1BBVENIRVNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX1BBVENIRVNfQklUIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0lOVk9DQVRJT05TX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQiOworICAgICAgICBjYXNlIFZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19WRVJURVhfU0hBREVSX0lOVk9DQVRJT05TX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1ZFUlRFWF9TSEFERVJfSU5WT0NBVElPTlNfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzKFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzKHN0YXRpY19jYXN0PFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzKHN0YXRpY19jYXN0PFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUXVlcnlSZXN1bHRGbGFnQml0cyhWa1F1ZXJ5UmVzdWx0RmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtRdWVyeVJlc3VsdEZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9SRVNVTFRfNjRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9SRVNVTFRfNjRfQklUIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9SRVNVTFRfUEFSVElBTF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVCI7CisgICAgICAgIGNhc2UgVktfUVVFUllfUkVTVUxUX1dBSVRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9SRVNVTFRfV0FJVF9CSVQiOworICAgICAgICBjYXNlIFZLX1FVRVJZX1JFU1VMVF9XSVRIX0FWQUlMQUJJTElUWV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1JFU1VMVF9XSVRIX0FWQUlMQUJJTElUWV9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtRdWVyeVJlc3VsdEZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrUXVlcnlSZXN1bHRGbGFncyhWa1F1ZXJ5UmVzdWx0RmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtRdWVyeVJlc3VsdEZsYWdCaXRzKHN0YXRpY19jYXN0PFZrUXVlcnlSZXN1bHRGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1F1ZXJ5UmVzdWx0RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtRdWVyeVJlc3VsdEZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMoVmtCdWZmZXJDcmVhdGVGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0J1ZmZlckNyZWF0ZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUiI7CisgICAgICAgIGNhc2UgVktfQlVGRkVSX0NSRUFURV9QUk9URUNURURfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUZGRVJfQ1JFQVRFX1BST1RFQ1RFRF9CSVQiOworICAgICAgICBjYXNlIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVCI7CisgICAgICAgIGNhc2UgVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUIjsKKyAgICAgICAgY2FzZSBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtCdWZmZXJDcmVhdGVGbGFncyhWa0J1ZmZlckNyZWF0ZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtCdWZmZXJDcmVhdGVGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0J1ZmZlckNyZWF0ZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtCdWZmZXJVc2FnZUZsYWdCaXRzKFZrQnVmZmVyVXNhZ2VGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0J1ZmZlclVzYWdlRmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0JVRkZFUl9VU0FHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQlVGRkVSX1VTQUdFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQlVGRkVSX1VTQUdFX0lOREVYX0JVRkZFUl9CSVQiOworICAgICAgICBjYXNlIFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCI7CisgICAgICAgIGNhc2UgVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQiOworICAgICAgICBjYXNlIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQiOworICAgICAgICBjYXNlIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCI7CisgICAgICAgIGNhc2UgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIjsKKyAgICAgICAgY2FzZSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGT1JNX0ZFRURCQUNLX0NPVU5URVJfQlVGRkVSX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9CVUZGRVJfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVCI7CisgICAgICAgIGNhc2UgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCI7CisgICAgICAgIGNhc2UgVktfQlVGRkVSX1VTQUdFX1ZFUlRFWF9CVUZGRVJfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtCdWZmZXJVc2FnZUZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrQnVmZmVyVXNhZ2VGbGFncyhWa0J1ZmZlclVzYWdlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtCdWZmZXJVc2FnZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrQnVmZmVyVXNhZ2VGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0J1ZmZlclVzYWdlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtCdWZmZXJVc2FnZUZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU2hhcmluZ01vZGUoVmtTaGFyaW5nTW9kZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1NoYXJpbmdNb2RlKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQiOworICAgICAgICBjYXNlIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTaGFyaW5nTW9kZSI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0ltYWdlTGF5b3V0KFZrSW1hZ2VMYXlvdXQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtJbWFnZUxheW91dClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfRlJBR01FTlRfREVOU0lUWV9NQVBfT1BUSU1BTF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUiI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NIQURJTkdfUkFURV9PUFRJTUFMX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9MQVlPVVRfU0hBRElOR19SQVRFX09QVElNQUxfTlYiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFIiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwiOworICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtJbWFnZUxheW91dCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0ltYWdlVmlld0NyZWF0ZUZsYWdCaXRzKFZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVklFV19DUkVBVEVfRlJBR01FTlRfREVOU0lUWV9NQVBfRFlOQU1JQ19CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9WSUVXX0NSRUFURV9GUkFHTUVOVF9ERU5TSVRZX01BUF9EWU5BTUlDX0JJVF9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0ltYWdlVmlld0NyZWF0ZUZsYWdzKFZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0ltYWdlVmlld0NyZWF0ZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrSW1hZ2VWaWV3Q3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0ltYWdlVmlld1R5cGUoVmtJbWFnZVZpZXdUeXBlIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrSW1hZ2VWaWV3VHlwZSlpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVklFV19UWVBFXzFEOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9WSUVXX1RZUEVfMUQiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWToKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lNQUdFX1ZJRVdfVFlQRV8yRCI7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVklFV19UWVBFXzNEIjsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRToKKyAgICAgICAgICAgIHJldHVybiAiVktfSU1BR0VfVklFV19UWVBFX0NVQkUiOworICAgICAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0ltYWdlVmlld1R5cGUiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtDb21wb25lbnRTd2l6emxlKFZrQ29tcG9uZW50U3dpenpsZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0NvbXBvbmVudFN3aXp6bGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0E6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBPTkVOVF9TV0laWkxFX0EiOworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0I6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBPTkVOVF9TV0laWkxFX0IiOworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0c6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBPTkVOVF9TV0laWkxFX0ciOworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSI7CisgICAgICAgIGNhc2UgVktfQ09NUE9ORU5UX1NXSVpaTEVfT05FOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT05FTlRfU1dJWlpMRV9PTkUiOworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9TV0laWkxFX1I6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBPTkVOVF9TV0laWkxFX1IiOworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9TV0laWkxFX1pFUk86CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBPTkVOVF9TV0laWkxFX1pFUk8iOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtDb21wb25lbnRTd2l6emxlIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyhWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9DUkVBVEVfQUxMT1dfREVSSVZBVElWRVNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9DUkVBVEVfQUxMT1dfREVSSVZBVElWRVNfQklUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9DUkVBVEVfQ0FQVFVSRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTlNfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfQ1JFQVRFX0NBUFRVUkVfSU5URVJOQUxfUkVQUkVTRU5UQVRJT05TX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0NSRUFURV9DQVBUVVJFX1NUQVRJU1RJQ1NfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfQ1JFQVRFX0NBUFRVUkVfU1RBVElTVElDU19CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9DUkVBVEVfREVGRVJfQ09NUElMRV9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX0NSRUFURV9ERUZFUl9DT01QSUxFX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0NSRUFURV9ESVNBQkxFX09QVElNSVpBVElPTl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX0NSRUFURV9ESVNBQkxFX09QVElNSVpBVElPTl9CSVQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0NSRUFURV9ESVNQQVRDSF9CQVNFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUElQRUxJTkVfQ1JFQVRFX0RJU1BBVENIX0JBU0VfQklUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9DUkVBVEVfVklFV19JTkRFWF9GUk9NX0RFVklDRV9JTkRFWF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX0NSRUFURV9WSUVXX0lOREVYX0ZST01fREVWSUNFX0lOREVYX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtQaXBlbGluZUNyZWF0ZUZsYWdzKFZrUGlwZWxpbmVDcmVhdGVGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1BpcGVsaW5lQ3JlYXRlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfQUxMT1dfVkFSWUlOR19TVUJHUk9VUF9TSVpFX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfQUxMT1dfVkFSWUlOR19TVUJHUk9VUF9TSVpFX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfUkVRVUlSRV9GVUxMX1NVQkdST1VQU19CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX1JFUVVJUkVfRlVMTF9TVUJHUk9VUFNfQklUX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyhWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1NoYWRlclN0YWdlRmxhZ0JpdHMoVmtTaGFkZXJTdGFnZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2hhZGVyU3RhZ2VGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0FMTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX1NUQUdFX0FMTCI7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDUzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDUyI7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0FOWV9ISVRfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFERVJfU1RBR0VfQU5ZX0hJVF9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUIjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUIjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX1NUQUdFX0lOVEVSU0VDVElPTl9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9NRVNIX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfTUlTU19CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfVEFTS19CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCI7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCI7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1NoYWRlclN0YWdlRmxhZ3MoVmtTaGFkZXJTdGFnZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1NoYWRlclN0YWdlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtTaGFkZXJTdGFnZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrU2hhZGVyU3RhZ2VGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1ZlcnRleElucHV0UmF0ZShWa1ZlcnRleElucHV0UmF0ZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1ZlcnRleElucHV0UmF0ZSlpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfVkVSVEVYX0lOUFVUX1JBVEVfSU5TVEFOQ0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX1ZFUlRFWF9JTlBVVF9SQVRFX0lOU1RBTkNFIjsKKyAgICAgICAgY2FzZSBWS19WRVJURVhfSU5QVVRfUkFURV9WRVJURVg6CisgICAgICAgICAgICByZXR1cm4gIlZLX1ZFUlRFWF9JTlBVVF9SQVRFX1ZFUlRFWCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1ZlcnRleElucHV0UmF0ZSI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1ByaW1pdGl2ZVRvcG9sb2d5KFZrUHJpbWl0aXZlVG9wb2xvZ3kgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQcmltaXRpdmVUb3BvbG9neSlpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVCI7CisgICAgICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVF9XSVRIX0FESkFDRU5DWToKKyAgICAgICAgICAgIHJldHVybiAiVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVF9XSVRIX0FESkFDRU5DWSI7CisgICAgICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfU1RSSVA6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX1NUUklQIjsKKyAgICAgICAgY2FzZSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUF9XSVRIX0FESkFDRU5DWToKKyAgICAgICAgICAgIHJldHVybiAiVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfU1RSSVBfV0lUSF9BREpBQ0VOQ1kiOworICAgICAgICBjYXNlIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVCI7CisgICAgICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BPSU5UX0xJU1Q6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUIjsKKyAgICAgICAgY2FzZSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfRkFOOgorICAgICAgICAgICAgcmV0dXJuICJWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfRkFOIjsKKyAgICAgICAgY2FzZSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfTElTVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1QiOworICAgICAgICBjYXNlIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZOgorICAgICAgICAgICAgcmV0dXJuICJWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfTElTVF9XSVRIX0FESkFDRU5DWSI7CisgICAgICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQOgorICAgICAgICAgICAgcmV0dXJuICJWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfU1RSSVAiOworICAgICAgICBjYXNlIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9TVFJJUF9XSVRIX0FESkFDRU5DWToKKyAgICAgICAgICAgIHJldHVybiAiVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQX1dJVEhfQURKQUNFTkNZIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUHJpbWl0aXZlVG9wb2xvZ3kiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQb2x5Z29uTW9kZShWa1BvbHlnb25Nb2RlIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUG9seWdvbk1vZGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BPTFlHT05fTU9ERV9GSUxMOgorICAgICAgICAgICAgcmV0dXJuICJWS19QT0xZR09OX01PREVfRklMTCI7CisgICAgICAgIGNhc2UgVktfUE9MWUdPTl9NT0RFX0ZJTExfUkVDVEFOR0xFX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19QT0xZR09OX01PREVfRklMTF9SRUNUQU5HTEVfTlYiOworICAgICAgICBjYXNlIFZLX1BPTFlHT05fTU9ERV9MSU5FOgorICAgICAgICAgICAgcmV0dXJuICJWS19QT0xZR09OX01PREVfTElORSI7CisgICAgICAgIGNhc2UgVktfUE9MWUdPTl9NT0RFX1BPSU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19QT0xZR09OX01PREVfUE9JTlQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtQb2x5Z29uTW9kZSI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0N1bGxNb2RlRmxhZ0JpdHMoVmtDdWxsTW9kZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQ3VsbE1vZGVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQ1VMTF9NT0RFX0JBQ0tfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DVUxMX01PREVfQkFDS19CSVQiOworICAgICAgICBjYXNlIFZLX0NVTExfTU9ERV9GUk9OVF9BTkRfQkFDSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ1VMTF9NT0RFX0ZST05UX0FORF9CQUNLIjsKKyAgICAgICAgY2FzZSBWS19DVUxMX01PREVfRlJPTlRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DVUxMX01PREVfRlJPTlRfQklUIjsKKyAgICAgICAgY2FzZSBWS19DVUxMX01PREVfTk9ORToKKyAgICAgICAgICAgIHJldHVybiAiVktfQ1VMTF9NT0RFX05PTkUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtDdWxsTW9kZUZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrQ3VsbE1vZGVGbGFncyhWa0N1bGxNb2RlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtDdWxsTW9kZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrQ3VsbE1vZGVGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0N1bGxNb2RlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtDdWxsTW9kZUZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRnJvbnRGYWNlKFZrRnJvbnRGYWNlIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRnJvbnRGYWNlKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19GUk9OVF9GQUNFX0NMT0NLV0lTRToKKyAgICAgICAgICAgIHJldHVybiAiVktfRlJPTlRfRkFDRV9DTE9DS1dJU0UiOworICAgICAgICBjYXNlIFZLX0ZST05UX0ZBQ0VfQ09VTlRFUl9DTE9DS1dJU0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZST05UX0ZBQ0VfQ09VTlRFUl9DTE9DS1dJU0UiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtGcm9udEZhY2UiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtDb21wYXJlT3AoVmtDb21wYXJlT3AgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb21wYXJlT3ApaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0NPTVBBUkVfT1BfQUxXQVlTOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QQVJFX09QX0FMV0FZUyI7CisgICAgICAgIGNhc2UgVktfQ09NUEFSRV9PUF9FUVVBTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NUEFSRV9PUF9FUVVBTCI7CisgICAgICAgIGNhc2UgVktfQ09NUEFSRV9PUF9HUkVBVEVSOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QQVJFX09QX0dSRUFURVIiOworICAgICAgICBjYXNlIFZLX0NPTVBBUkVfT1BfR1JFQVRFUl9PUl9FUVVBTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NUEFSRV9PUF9HUkVBVEVSX09SX0VRVUFMIjsKKyAgICAgICAgY2FzZSBWS19DT01QQVJFX09QX0xFU1M6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBBUkVfT1BfTEVTUyI7CisgICAgICAgIGNhc2UgVktfQ09NUEFSRV9PUF9MRVNTX09SX0VRVUFMOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QQVJFX09QX0xFU1NfT1JfRVFVQUwiOworICAgICAgICBjYXNlIFZLX0NPTVBBUkVfT1BfTkVWRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBBUkVfT1BfTkVWRVIiOworICAgICAgICBjYXNlIFZLX0NPTVBBUkVfT1BfTk9UX0VRVUFMOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QQVJFX09QX05PVF9FUVVBTCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0NvbXBhcmVPcCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1N0ZW5jaWxPcChWa1N0ZW5jaWxPcCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1N0ZW5jaWxPcClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfU1RFTkNJTF9PUF9ERUNSRU1FTlRfQU5EX0NMQU1QOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVEVOQ0lMX09QX0RFQ1JFTUVOVF9BTkRfQ0xBTVAiOworICAgICAgICBjYXNlIFZLX1NURU5DSUxfT1BfREVDUkVNRU5UX0FORF9XUkFQOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVEVOQ0lMX09QX0RFQ1JFTUVOVF9BTkRfV1JBUCI7CisgICAgICAgIGNhc2UgVktfU1RFTkNJTF9PUF9JTkNSRU1FTlRfQU5EX0NMQU1QOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVEVOQ0lMX09QX0lOQ1JFTUVOVF9BTkRfQ0xBTVAiOworICAgICAgICBjYXNlIFZLX1NURU5DSUxfT1BfSU5DUkVNRU5UX0FORF9XUkFQOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVEVOQ0lMX09QX0lOQ1JFTUVOVF9BTkRfV1JBUCI7CisgICAgICAgIGNhc2UgVktfU1RFTkNJTF9PUF9JTlZFUlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NURU5DSUxfT1BfSU5WRVJUIjsKKyAgICAgICAgY2FzZSBWS19TVEVOQ0lMX09QX0tFRVA6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NURU5DSUxfT1BfS0VFUCI7CisgICAgICAgIGNhc2UgVktfU1RFTkNJTF9PUF9SRVBMQUNFOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVEVOQ0lMX09QX1JFUExBQ0UiOworICAgICAgICBjYXNlIFZLX1NURU5DSUxfT1BfWkVSTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RFTkNJTF9PUF9aRVJPIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU3RlbmNpbE9wIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrTG9naWNPcChWa0xvZ2ljT3AgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtMb2dpY09wKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9BTkQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0xPR0lDX09QX0FORCI7CisgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfQU5EX0lOVkVSVEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19MT0dJQ19PUF9BTkRfSU5WRVJURUQiOworICAgICAgICBjYXNlIFZLX0xPR0lDX09QX0FORF9SRVZFUlNFOgorICAgICAgICAgICAgcmV0dXJuICJWS19MT0dJQ19PUF9BTkRfUkVWRVJTRSI7CisgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfQ0xFQVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0xPR0lDX09QX0NMRUFSIjsKKyAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9DT1BZOgorICAgICAgICAgICAgcmV0dXJuICJWS19MT0dJQ19PUF9DT1BZIjsKKyAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9DT1BZX0lOVkVSVEVEOgorICAgICAgICAgICAgcmV0dXJuICJWS19MT0dJQ19PUF9DT1BZX0lOVkVSVEVEIjsKKyAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9FUVVJVkFMRU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19MT0dJQ19PUF9FUVVJVkFMRU5UIjsKKyAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9JTlZFUlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0xPR0lDX09QX0lOVkVSVCI7CisgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfTkFORDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTE9HSUNfT1BfTkFORCI7CisgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfTk9SOgorICAgICAgICAgICAgcmV0dXJuICJWS19MT0dJQ19PUF9OT1IiOworICAgICAgICBjYXNlIFZLX0xPR0lDX09QX05PX09QOgorICAgICAgICAgICAgcmV0dXJuICJWS19MT0dJQ19PUF9OT19PUCI7CisgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfT1I6CisgICAgICAgICAgICByZXR1cm4gIlZLX0xPR0lDX09QX09SIjsKKyAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9PUl9JTlZFUlRFRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTE9HSUNfT1BfT1JfSU5WRVJURUQiOworICAgICAgICBjYXNlIFZLX0xPR0lDX09QX09SX1JFVkVSU0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX0xPR0lDX09QX09SX1JFVkVSU0UiOworICAgICAgICBjYXNlIFZLX0xPR0lDX09QX1NFVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTE9HSUNfT1BfU0VUIjsKKyAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9YT1I6CisgICAgICAgICAgICByZXR1cm4gIlZLX0xPR0lDX09QX1hPUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0xvZ2ljT3AiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtCbGVuZEZhY3RvcihWa0JsZW5kRmFjdG9yIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQmxlbmRGYWN0b3IpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9DT05TVEFOVF9BTFBIQToKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0FMUEhBIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9GQUNUT1JfQ09OU1RBTlRfQ09MT1I6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX0ZBQ1RPUl9DT05TVEFOVF9DT0xPUiI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX0RTVF9BTFBIQToKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX0RTVF9BTFBIQSI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX0RTVF9DT0xPUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX0RTVF9DT0xPUiI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX09ORToKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX09ORSI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQToKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQSI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19EU1RfQUxQSEE6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfRFNUX0FMUEhBIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX0RTVF9DT0xPUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19EU1RfQ09MT1IiOworICAgICAgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9BTFBIQToKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0FMUEhBIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQ09MT1I6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9DT0xPUiI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDX0FMUEhBIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkNfQ09MT1IiOworICAgICAgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0FMUEhBOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9GQUNUT1JfU1JDMV9BTFBIQSI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX1NSQzFfQ09MT1I6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0NPTE9SIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBX1NBVFVSQVRFOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBX1NBVFVSQVRFIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9GQUNUT1JfU1JDX0NPTE9SOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9GQUNUT1JfU1JDX0NPTE9SIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9GQUNUT1JfWkVSTzoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfRkFDVE9SX1pFUk8iOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtCbGVuZEZhY3RvciI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0JsZW5kT3AoVmtCbGVuZE9wIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQmxlbmRPcClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfQUREOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9BREQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX0JMVUVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9CTFVFX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfQ09MT1JCVVJOX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfQ09MT1JCVVJOX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfQ09MT1JET0RHRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0NPTE9SRE9ER0VfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9DT05UUkFTVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0NPTlRSQVNUX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfREFSS0VOX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfREFSS0VOX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfRElGRkVSRU5DRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0RJRkZFUkVOQ0VfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9EU1RfQVRPUF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0RTVF9BVE9QX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfRFNUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfRFNUX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfRFNUX0lOX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfRFNUX0lOX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfRFNUX09VVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0RTVF9PVVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9EU1RfT1ZFUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0RTVF9PVkVSX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfRVhDTFVTSU9OX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfRVhDTFVTSU9OX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfR1JFRU5fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9HUkVFTl9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX0hBUkRMSUdIVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0hBUkRMSUdIVF9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX0hBUkRNSVhfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9IQVJETUlYX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfSFNMX0NPTE9SX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfSFNMX0NPTE9SX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfSFNMX0hVRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0hTTF9IVUVfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9IU0xfTFVNSU5PU0lUWV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0hTTF9MVU1JTk9TSVRZX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfSFNMX1NBVFVSQVRJT05fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9IU0xfU0FUVVJBVElPTl9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX0lOVkVSVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0lOVkVSVF9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX0lOVkVSVF9PVkdfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9JTlZFUlRfT1ZHX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfSU5WRVJUX1JHQl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX0lOVkVSVF9SR0JfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9MSUdIVEVOX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfTElHSFRFTl9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX0xJTkVBUkJVUk5fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9MSU5FQVJCVVJOX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfTElORUFSRE9ER0VfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9MSU5FQVJET0RHRV9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX0xJTkVBUkxJR0hUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfTElORUFSTElHSFRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9NQVg6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX01BWCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfTUlOOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9NSU4iOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX01JTlVTX0NMQU1QRURfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9NSU5VU19DTEFNUEVEX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfTUlOVVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9NSU5VU19FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX01VTFRJUExZX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfTVVMVElQTFlfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9PVkVSTEFZX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfT1ZFUkxBWV9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX1BJTkxJR0hUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfUElOTElHSFRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9QTFVTX0NMQU1QRURfQUxQSEFfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9QTFVTX0NMQU1QRURfQUxQSEFfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9QTFVTX0NMQU1QRURfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9QTFVTX0NMQU1QRURfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9QTFVTX0RBUktFUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX1BMVVNfREFSS0VSX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfUExVU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX1BMVVNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9SRURfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9SRURfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9SRVZFUlNFX1NVQlRSQUNUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9SRVZFUlNFX1NVQlRSQUNUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9TQ1JFRU5fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9TQ1JFRU5fRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9TT0ZUTElHSFRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9TT0ZUTElHSFRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9TUkNfQVRPUF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX1NSQ19BVE9QX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfU1JDX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfU1JDX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfU1JDX0lOX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfU1JDX0lOX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfU1JDX09VVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX1NSQ19PVVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9TUkNfT1ZFUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX1NSQ19PVkVSX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1BfU1VCVFJBQ1Q6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX1NVQlRSQUNUIjsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PUF9WSVZJRExJR0hUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1BfVklWSURMSUdIVF9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX1hPUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JMRU5EX09QX1hPUl9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09QX1pFUk9fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PUF9aRVJPX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0JsZW5kT3AiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtDb2xvckNvbXBvbmVudEZsYWdCaXRzKFZrQ29sb3JDb21wb25lbnRGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0NvbG9yQ29tcG9uZW50RmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0NPTE9SX0NPTVBPTkVOVF9BX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09MT1JfQ09NUE9ORU5UX0FfQklUIjsKKyAgICAgICAgY2FzZSBWS19DT0xPUl9DT01QT05FTlRfQl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTE9SX0NPTVBPTkVOVF9CX0JJVCI7CisgICAgICAgIGNhc2UgVktfQ09MT1JfQ09NUE9ORU5UX0dfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0xPUl9DT01QT05FTlRfR19CSVQiOworICAgICAgICBjYXNlIFZLX0NPTE9SX0NPTVBPTkVOVF9SX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09MT1JfQ09NUE9ORU5UX1JfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrQ29sb3JDb21wb25lbnRGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0NvbG9yQ29tcG9uZW50RmxhZ3MoVmtDb2xvckNvbXBvbmVudEZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrQ29sb3JDb21wb25lbnRGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0NvbG9yQ29tcG9uZW50RmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtDb2xvckNvbXBvbmVudEZsYWdCaXRzKHN0YXRpY19jYXN0PFZrQ29sb3JDb21wb25lbnRGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0R5bmFtaWNTdGF0ZShWa0R5bmFtaWNTdGF0ZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0R5bmFtaWNTdGF0ZSlpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9CTEVORF9DT05TVEFOVFM6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RZTkFNSUNfU1RBVEVfQkxFTkRfQ09OU1RBTlRTIjsKKyAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JJQVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RZTkFNSUNfU1RBVEVfREVQVEhfQklBUyI7CisgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9ERVBUSF9CT1VORFM6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RZTkFNSUNfU1RBVEVfREVQVEhfQk9VTkRTIjsKKyAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX0RJU0NBUkRfUkVDVEFOR0xFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFlOQU1JQ19TVEFURV9ESVNDQVJEX1JFQ1RBTkdMRV9FWFQiOworICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfRVhDTFVTSVZFX1NDSVNTT1JfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RZTkFNSUNfU1RBVEVfRVhDTFVTSVZFX1NDSVNTT1JfTlYiOworICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfTElORV9TVElQUExFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFlOQU1JQ19TVEFURV9MSU5FX1NUSVBQTEVfRVhUIjsKKyAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX0xJTkVfV0lEVEg6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RZTkFNSUNfU1RBVEVfTElORV9XSURUSCI7CisgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVCI7CisgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SOgorICAgICAgICAgICAgcmV0dXJuICJWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1IiOworICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9DT01QQVJFX01BU0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9DT01QQVJFX01BU0siOworICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9SRUZFUkVOQ0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9SRUZFUkVOQ0UiOworICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfU1RFTkNJTF9XUklURV9NQVNLOgorICAgICAgICAgICAgcmV0dXJuICJWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfV1JJVEVfTUFTSyI7CisgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCI7CisgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9DT0FSU0VfU0FNUExFX09SREVSX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfTlYiOworICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfU0hBRElOR19SQVRFX1BBTEVUVEVfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfU0hBRElOR19SQVRFX1BBTEVUVEVfTlYiOworICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfV19TQ0FMSU5HX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1dfU0NBTElOR19OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0R5bmFtaWNTdGF0ZSI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1NhbXBsZXJDcmVhdGVGbGFnQml0cyhWa1NhbXBsZXJDcmVhdGVGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1NhbXBsZXJDcmVhdGVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQ09BUlNFX1JFQ09OU1RSVUNUSU9OX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQ09BUlNFX1JFQ09OU1RSVUNUSU9OX0JJVF9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtTYW1wbGVyQ3JlYXRlRmxhZ3MoVmtTYW1wbGVyQ3JlYXRlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtGaWx0ZXIoVmtGaWx0ZXIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtGaWx0ZXIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0ZJTFRFUl9DVUJJQ19JTUc6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZJTFRFUl9DVUJJQ19JTUciOworICAgICAgICBjYXNlIFZLX0ZJTFRFUl9MSU5FQVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZJTFRFUl9MSU5FQVIiOworICAgICAgICBjYXNlIFZLX0ZJTFRFUl9ORUFSRVNUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GSUxURVJfTkVBUkVTVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0ZpbHRlciI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1NhbXBsZXJNaXBtYXBNb2RlKFZrU2FtcGxlck1pcG1hcE1vZGUgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTYW1wbGVyTWlwbWFwTW9kZSlpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9NSVBNQVBfTU9ERV9MSU5FQVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfTUlQTUFQX01PREVfTElORUFSIjsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVSX01JUE1BUF9NT0RFX05FQVJFU1Q6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfTUlQTUFQX01PREVfTkVBUkVTVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1NhbXBsZXJNaXBtYXBNb2RlIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU2FtcGxlckFkZHJlc3NNb2RlKFZrU2FtcGxlckFkZHJlc3NNb2RlIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2FtcGxlckFkZHJlc3NNb2RlKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19CT1JERVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0JPUkRFUiI7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRSI7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SRURfUkVQRUFUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JFRF9SRVBFQVQiOworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRSI7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9BRERSRVNTX01PREVfUkVQRUFUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9SRVBFQVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTYW1wbGVyQWRkcmVzc01vZGUiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtCb3JkZXJDb2xvcihWa0JvcmRlckNvbG9yIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQm9yZGVyQ29sb3IpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfQkxBQ0s6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfQkxBQ0siOworICAgICAgICBjYXNlIFZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfV0hJVEU6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JPUkRFUl9DT0xPUl9GTE9BVF9PUEFRVUVfV0hJVEUiOworICAgICAgICBjYXNlIFZLX0JPUkRFUl9DT0xPUl9GTE9BVF9UUkFOU1BBUkVOVF9CTEFDSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfQk9SREVSX0NPTE9SX0ZMT0FUX1RSQU5TUEFSRU5UX0JMQUNLIjsKKyAgICAgICAgY2FzZSBWS19CT1JERVJfQ09MT1JfSU5UX09QQVFVRV9CTEFDSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfQk9SREVSX0NPTE9SX0lOVF9PUEFRVUVfQkxBQ0siOworICAgICAgICBjYXNlIFZLX0JPUkRFUl9DT0xPUl9JTlRfT1BBUVVFX1dISVRFOgorICAgICAgICAgICAgcmV0dXJuICJWS19CT1JERVJfQ09MT1JfSU5UX09QQVFVRV9XSElURSI7CisgICAgICAgIGNhc2UgVktfQk9SREVSX0NPTE9SX0lOVF9UUkFOU1BBUkVOVF9CTEFDSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfQk9SREVSX0NPTE9SX0lOVF9UUkFOU1BBUkVOVF9CTEFDSyI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0JvcmRlckNvbG9yIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzKFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MoVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtEZXNjcmlwdG9yVHlwZShWa0Rlc2NyaXB0b3JUeXBlIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRGVzY3JpcHRvclR5cGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVNDUklQVE9SX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViI7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQiOworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSI7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiI7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRToKKyAgICAgICAgICAgIHJldHVybiAiVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UiOworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiI7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Rlc2NyaXB0b3JUeXBlIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0cyhWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0ZSRUVfREVTQ1JJUFRPUl9TRVRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0ZSRUVfREVTQ1JJUFRPUl9TRVRfQklUIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzKFZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzKFZrRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0ZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0ZyYW1lYnVmZmVyQ3JlYXRlRmxhZ3MoVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0ZyYW1lYnVmZmVyQ3JlYXRlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtGcmFtZWJ1ZmZlckNyZWF0ZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzKFZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQVRUQUNITUVOVF9ERVNDUklQVElPTl9NQVlfQUxJQVNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX01BWV9BTElBU19CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdzKFZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cyhzdGF0aWNfY2FzdDxWa0F0dGFjaG1lbnREZXNjcmlwdGlvbkZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0F0dGFjaG1lbnRMb2FkT3AoVmtBdHRhY2htZW50TG9hZE9wIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQXR0YWNobWVudExvYWRPcClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSOgorICAgICAgICAgICAgcmV0dXJuICJWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIiOworICAgICAgICBjYXNlIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkU6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUiOworICAgICAgICBjYXNlIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FEOgorICAgICAgICAgICAgcmV0dXJuICJWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0F0dGFjaG1lbnRMb2FkT3AiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtBdHRhY2htZW50U3RvcmVPcChWa0F0dGFjaG1lbnRTdG9yZU9wIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQXR0YWNobWVudFN0b3JlT3ApaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFOgorICAgICAgICAgICAgcmV0dXJuICJWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSI7CisgICAgICAgIGNhc2UgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRToKKyAgICAgICAgICAgIHJldHVybiAiVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0F0dGFjaG1lbnRTdG9yZU9wIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMoVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TVUJQQVNTX0RFU0NSSVBUSU9OX1BFUl9WSUVXX0FUVFJJQlVURVNfQklUX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19BVFRSSUJVVEVTX0JJVF9OVlgiOworICAgICAgICBjYXNlIFZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfUE9TSVRJT05fWF9PTkxZX0JJVF9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfUE9TSVRJT05fWF9PTkxZX0JJVF9OVlgiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdzKFZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0cyhzdGF0aWNfY2FzdDxWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtTdWJwYXNzRGVzY3JpcHRpb25GbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1BpcGVsaW5lQmluZFBvaW50KFZrUGlwZWxpbmVCaW5kUG9pbnQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQaXBlbGluZUJpbmRQb2ludClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtQaXBlbGluZUJpbmRQb2ludCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0FjY2Vzc0ZsYWdCaXRzKFZrQWNjZXNzRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtBY2Nlc3NGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUkVBRF9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1JFQURfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9XUklURV9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1dSSVRFX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfUkVBRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfQklUIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9SRUFEX05PTkNPSEVSRU5UX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfTk9OQ09IRVJFTlRfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQiOworICAgICAgICBjYXNlIFZLX0FDQ0VTU19DT01NQU5EX1BST0NFU1NfUkVBRF9CSVRfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFU1NfQ09NTUFORF9QUk9DRVNTX1JFQURfQklUX05WWCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX0NPTU1BTkRfUFJPQ0VTU19XUklURV9CSVRfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFU1NfQ09NTUFORF9QUk9DRVNTX1dSSVRFX0JJVF9OVlgiOworICAgICAgICBjYXNlIFZLX0FDQ0VTU19DT05ESVRJT05BTF9SRU5ERVJJTkdfUkVBRF9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFU1NfQ09ORElUSU9OQUxfUkVOREVSSU5HX1JFQURfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9SRUFEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9SRUFEX0JJVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9XUklURV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfUkVBRF9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfUkVBRF9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfSE9TVF9SRUFEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRVNTX0hPU1RfUkVBRF9CSVQiOworICAgICAgICBjYXNlIFZLX0FDQ0VTU19IT1NUX1dSSVRFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfSU5ERVhfUkVBRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19JTkRFWF9SRUFEX0JJVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX0lORElSRUNUX0NPTU1BTkRfUkVBRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19JTkRJUkVDVF9DT01NQU5EX1JFQURfQklUIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfSU5QVVRfQVRUQUNITUVOVF9SRUFEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRVNTX0lOUFVUX0FUVEFDSE1FTlRfUkVBRF9CSVQiOworICAgICAgICBjYXNlIFZLX0FDQ0VTU19NRU1PUllfUkVBRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19NRU1PUllfUkVBRF9CSVQiOworICAgICAgICBjYXNlIFZLX0FDQ0VTU19NRU1PUllfV1JJVEVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFU1NfTUVNT1JZX1dSSVRFX0JJVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX1NIQURFUl9SRUFEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRVNTX1NIQURFUl9SRUFEX0JJVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfU0hBRElOR19SQVRFX0lNQUdFX1JFQURfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFU1NfU0hBRElOR19SQVRFX0lNQUdFX1JFQURfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfVFJBTlNGRVJfUkVBRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19UUkFOU0ZFUl9SRUFEX0JJVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX1RSQU5TRk9STV9GRUVEQkFDS19DT1VOVEVSX1JFQURfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRVNTX1RSQU5TRk9STV9GRUVEQkFDS19DT1VOVEVSX1JFQURfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX1RSQU5TRk9STV9GRUVEQkFDS19DT1VOVEVSX1dSSVRFX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9XUklURV9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfVFJBTlNGT1JNX0ZFRURCQUNLX1dSSVRFX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19UUkFOU0ZPUk1fRkVFREJBQ0tfV1JJVEVfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfQUNDRVNTX1VOSUZPUk1fUkVBRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VTU19VTklGT1JNX1JFQURfQklUIjsKKyAgICAgICAgY2FzZSBWS19BQ0NFU1NfVkVSVEVYX0FUVFJJQlVURV9SRUFEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRVNTX1ZFUlRFWF9BVFRSSUJVVEVfUkVBRF9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtBY2Nlc3NGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0FjY2Vzc0ZsYWdzKFZrQWNjZXNzRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtBY2Nlc3NGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0FjY2Vzc0ZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrQWNjZXNzRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtBY2Nlc3NGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0RlcGVuZGVuY3lGbGFnQml0cyhWa0RlcGVuZGVuY3lGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0RlcGVuZGVuY3lGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQiOworICAgICAgICBjYXNlIFZLX0RFUEVOREVOQ1lfREVWSUNFX0dST1VQX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVQRU5ERU5DWV9ERVZJQ0VfR1JPVVBfQklUIjsKKyAgICAgICAgY2FzZSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRGVwZW5kZW5jeUZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrRGVwZW5kZW5jeUZsYWdzKFZrRGVwZW5kZW5jeUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGVwZW5kZW5jeUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrRGVwZW5kZW5jeUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGVwZW5kZW5jeUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrRGVwZW5kZW5jeUZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQ29tbWFuZFBvb2xDcmVhdGVGbGFnQml0cyhWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1BST1RFQ1RFRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUFJPVEVDVEVEX0JJVCI7CisgICAgICAgIGNhc2UgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUIjsKKyAgICAgICAgY2FzZSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1RSQU5TSUVOVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfVFJBTlNJRU5UX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzKFZrQ29tbWFuZFBvb2xDcmVhdGVGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbENyZWF0ZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrQ29tbWFuZFBvb2xDcmVhdGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMoVmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0NPTU1BTkRfUE9PTF9SRVNFVF9SRUxFQVNFX1JFU09VUkNFU19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTU1BTkRfUE9PTF9SRVNFVF9SRUxFQVNFX1JFU09VUkNFU19CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MoVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtDb21tYW5kUG9vbFJlc2V0RmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtDb21tYW5kQnVmZmVyTGV2ZWwoVmtDb21tYW5kQnVmZmVyTGV2ZWwgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb21tYW5kQnVmZmVyTGV2ZWwpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlk6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlkiOworICAgICAgICBjYXNlIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWToKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrQ29tbWFuZEJ1ZmZlckxldmVsIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHMoVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUIjsKKyAgICAgICAgY2FzZSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCI7CisgICAgICAgIGNhc2UgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFncyhWa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtDb21tYW5kQnVmZmVyVXNhZ2VGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtRdWVyeUNvbnRyb2xGbGFnQml0cyhWa1F1ZXJ5Q29udHJvbEZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUXVlcnlDb250cm9sRmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtRdWVyeUNvbnRyb2xGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1F1ZXJ5Q29udHJvbEZsYWdzKFZrUXVlcnlDb250cm9sRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtRdWVyeUNvbnRyb2xGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1F1ZXJ5Q29udHJvbEZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrUXVlcnlDb250cm9sRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtRdWVyeUNvbnRyb2xGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdCaXRzKFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQ09NTUFORF9CVUZGRVJfUkVTRVRfUkVMRUFTRV9SRVNPVVJDRVNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01NQU5EX0JVRkZFUl9SRVNFVF9SRUxFQVNFX1JFU09VUkNFU19CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzKFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtDb21tYW5kQnVmZmVyUmVzZXRGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1N0ZW5jaWxGYWNlRmxhZ0JpdHMoVmtTdGVuY2lsRmFjZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU3RlbmNpbEZhY2VGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfU1RFTkNJTF9GQUNFX0JBQ0tfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVEVOQ0lMX0ZBQ0VfQkFDS19CSVQiOworICAgICAgICBjYXNlIFZLX1NURU5DSUxfRkFDRV9GUk9OVF9BTkRfQkFDSzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1RFTkNJTF9GQUNFX0ZST05UX0FORF9CQUNLIjsKKyAgICAgICAgY2FzZSBWS19TVEVOQ0lMX0ZBQ0VfRlJPTlRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVEVOQ0lMX0ZBQ0VfRlJPTlRfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU3RlbmNpbEZhY2VGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1N0ZW5jaWxGYWNlRmxhZ3MoVmtTdGVuY2lsRmFjZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrU3RlbmNpbEZhY2VGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1N0ZW5jaWxGYWNlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtTdGVuY2lsRmFjZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrU3RlbmNpbEZhY2VGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0luZGV4VHlwZShWa0luZGV4VHlwZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0luZGV4VHlwZSlpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfSU5ERVhfVFlQRV9OT05FX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTkRFWF9UWVBFX05PTkVfTlYiOworICAgICAgICBjYXNlIFZLX0lOREVYX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgcmV0dXJuICJWS19JTkRFWF9UWVBFX1VJTlQxNiI7CisgICAgICAgIGNhc2UgVktfSU5ERVhfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lOREVYX1RZUEVfVUlOVDMyIjsKKyAgICAgICAgY2FzZSBWS19JTkRFWF9UWVBFX1VJTlQ4X0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU5ERVhfVFlQRV9VSU5UOF9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtJbmRleFR5cGUiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTdWJwYXNzQ29udGVudHMoVmtTdWJwYXNzQ29udGVudHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTdWJwYXNzQ29udGVudHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSI7CisgICAgICAgIGNhc2UgVktfU1VCUEFTU19DT05URU5UU19TRUNPTkRBUllfQ09NTUFORF9CVUZGRVJTOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVUJQQVNTX0NPTlRFTlRTX1NFQ09OREFSWV9DT01NQU5EX0JVRkZFUlMiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTdWJwYXNzQ29udGVudHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtPYmplY3RUeXBlKFZrT2JqZWN0VHlwZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa09iamVjdFR5cGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0JVRkZFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfQlVGRkVSIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9CVUZGRVJfVklFVzoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVciOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUiI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0wiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFQiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9FWFQiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVQiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEUiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFVklDRToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfREVWSUNFIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfRElTUExBWV9LSFIiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFIiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0VWRU5UOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9FVkVOVCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfRkVOQ0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0ZFTkNFIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVIiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0lNQUdFOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9JTUFHRSI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU1BR0VfVklFVzoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfSU1BR0VfVklFVyI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU5TVEFOQ0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX0lOU1RBTkNFIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX0lOVEVMOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX0lOVEVMIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0U6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRSI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfUElQRUxJTkU6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1BJUEVMSU5FIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEUiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9RVUVSWV9QT09MOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9RVUVSWV9QT09MIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9RVUVVRToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfUVVFVUUiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTUyI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU0FNUExFUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfU0FNUExFUiI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT04iOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NFTUFQSE9SRToKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfU0VNQVBIT1JFIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFIjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFIiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFIiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9UWVBFX1VOS05PV04iOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa09iamVjdFR5cGUiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtWZW5kb3JJZChWa1ZlbmRvcklkIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrVmVuZG9ySWQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1ZFTkRPUl9JRF9LQVpBTjoKKyAgICAgICAgICAgIHJldHVybiAiVktfVkVORE9SX0lEX0tBWkFOIjsKKyAgICAgICAgY2FzZSBWS19WRU5ET1JfSURfVklWOgorICAgICAgICAgICAgcmV0dXJuICJWS19WRU5ET1JfSURfVklWIjsKKyAgICAgICAgY2FzZSBWS19WRU5ET1JfSURfVlNJOgorICAgICAgICAgICAgcmV0dXJuICJWS19WRU5ET1JfSURfVlNJIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrVmVuZG9ySWQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTdWJncm91cEZlYXR1cmVGbGFnQml0cyhWa1N1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NVQkdST1VQX0ZFQVRVUkVfQVJJVEhNRVRJQ19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVQkdST1VQX0ZFQVRVUkVfQVJJVEhNRVRJQ19CSVQiOworICAgICAgICBjYXNlIFZLX1NVQkdST1VQX0ZFQVRVUkVfQkFMTE9UX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VCR1JPVVBfRkVBVFVSRV9CQUxMT1RfQklUIjsKKyAgICAgICAgY2FzZSBWS19TVUJHUk9VUF9GRUFUVVJFX0JBU0lDX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VCR1JPVVBfRkVBVFVSRV9CQVNJQ19CSVQiOworICAgICAgICBjYXNlIFZLX1NVQkdST1VQX0ZFQVRVUkVfQ0xVU1RFUkVEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VCR1JPVVBfRkVBVFVSRV9DTFVTVEVSRURfQklUIjsKKyAgICAgICAgY2FzZSBWS19TVUJHUk9VUF9GRUFUVVJFX1BBUlRJVElPTkVEX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VCR1JPVVBfRkVBVFVSRV9QQVJUSVRJT05FRF9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX1NVQkdST1VQX0ZFQVRVUkVfUVVBRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVQkdST1VQX0ZFQVRVUkVfUVVBRF9CSVQiOworICAgICAgICBjYXNlIFZLX1NVQkdST1VQX0ZFQVRVUkVfU0hVRkZMRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVQkdST1VQX0ZFQVRVUkVfU0hVRkZMRV9CSVQiOworICAgICAgICBjYXNlIFZLX1NVQkdST1VQX0ZFQVRVUkVfU0hVRkZMRV9SRUxBVElWRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVQkdST1VQX0ZFQVRVUkVfU0hVRkZMRV9SRUxBVElWRV9CSVQiOworICAgICAgICBjYXNlIFZLX1NVQkdST1VQX0ZFQVRVUkVfVk9URV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVQkdST1VQX0ZFQVRVUkVfVk9URV9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTdWJncm91cEZlYXR1cmVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1N1Ymdyb3VwRmVhdHVyZUZsYWdzKFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtTdWJncm91cEZlYXR1cmVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1N1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrU3ViZ3JvdXBGZWF0dXJlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtTdWJncm91cEZlYXR1cmVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHMoVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX0RTVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9EU1RfQklUIjsKKyAgICAgICAgY2FzZSBWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfU1JDX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX1NSQ19CSVQiOworICAgICAgICBjYXNlIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19EU1RfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfRFNUX0JJVCI7CisgICAgICAgIGNhc2UgVktfUEVFUl9NRU1PUllfRkVBVFVSRV9HRU5FUklDX1NSQ19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MoVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHMoVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrTWVtb3J5QWxsb2NhdGVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0JJVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfTUFTS19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfTUFTS19CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrTWVtb3J5QWxsb2NhdGVGbGFncyhWa01lbW9yeUFsbG9jYXRlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrTWVtb3J5QWxsb2NhdGVGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yKFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9BTExfQ0xJUF9QTEFORVM6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX0FMTF9DTElQX1BMQU5FUyI7CisgICAgICAgIGNhc2UgVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfVVNFUl9DTElQX1BMQU5FU19PTkxZOgorICAgICAgICAgICAgcmV0dXJuICJWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9VU0VSX0NMSVBfUExBTkVTX09OTFkiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtQb2ludENsaXBwaW5nQmVoYXZpb3IiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4oVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4gaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4paW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX0xPV0VSX0xFRlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX0xPV0VSX0xFRlQiOworICAgICAgICBjYXNlIFZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1VQUEVSX0xFRlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1VQUEVSX0xFRlQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4iOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24oVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24gaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24paW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SR0JfSURFTlRJVFk6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SR0JfSURFTlRJVFkiOworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl8yMDIwOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfMjAyMCI7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzYwMToKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzYwMSI7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzcwOToKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzcwOSI7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSX0lERU5USVRZOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfSURFTlRJVFkiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTYW1wbGVyWWNiY3JNb2RlbENvbnZlcnNpb24iOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTYW1wbGVyWWNiY3JSYW5nZShWa1NhbXBsZXJZY2JjclJhbmdlIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2FtcGxlclljYmNyUmFuZ2UpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX0ZVTEw6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX0ZVTEwiOworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX05BUlJPVzoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfTkFSUk9XIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU2FtcGxlclljYmNyUmFuZ2UiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtDaHJvbWFMb2NhdGlvbihWa0Nocm9tYUxvY2F0aW9uIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQ2hyb21hTG9jYXRpb24paW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU46CisgICAgICAgICAgICByZXR1cm4gIlZLX0NIUk9NQV9MT0NBVElPTl9DT1NJVEVEX0VWRU4iOworICAgICAgICBjYXNlIFZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ0hST01BX0xPQ0FUSU9OX01JRFBPSU5UIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrQ2hyb21hTG9jYXRpb24iOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVHlwZSBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGUpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQiOworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfUFVTSF9ERVNDUklQVE9SU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfUFVTSF9ERVNDUklQVE9SU19LSFIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMoVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX0hFQVBfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfUkVTT1VSQ0VfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfUkVTT1VSQ0VfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRE1BX0JVRl9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRE1BX0JVRl9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX0FMTE9DQVRJT05fQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfTUFQUEVEX0ZPUkVJR05fTUVNT1JZX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX01BUFBFRF9GT1JFSUdOX01FTU9SWV9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzKFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzKFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfREVESUNBVEVEX09OTFlfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFncyhWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzKFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MoVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHM+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzKHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMoVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdzKFZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtGZW5jZUltcG9ydEZsYWdCaXRzKFZrRmVuY2VJbXBvcnRGbGFnQml0cyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0ZlbmNlSW1wb3J0RmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0ZFTkNFX0lNUE9SVF9URU1QT1JBUllfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0ZlbmNlSW1wb3J0RmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtGZW5jZUltcG9ydEZsYWdzKFZrRmVuY2VJbXBvcnRGbGFncyBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0ZlbmNlSW1wb3J0RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtGZW5jZUltcG9ydEZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRmVuY2VJbXBvcnRGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0ZlbmNlSW1wb3J0RmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0cyhWa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0VNQVBIT1JFX0lNUE9SVF9URU1QT1JBUllfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtTZW1hcGhvcmVJbXBvcnRGbGFncyhWa1NlbWFwaG9yZUltcG9ydEZsYWdzIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0cz4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzKHN0YXRpY19jYXN0PFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHM+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyhWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzKFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzKFZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHMgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0cylpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0cyI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzKFZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3MgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0cyhzdGF0aWNfY2FzdDxWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHMoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0cz4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUihWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfQklUX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzE4MF9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVVJGQUNFX1RSQU5TRk9STV9IT1JJWk9OVEFMX01JUlJPUl9ST1RBVEVfMTgwX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0hPUklaT05UQUxfTUlSUk9SX1JPVEFURV8yNzBfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzI3MF9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVVJGQUNFX1RSQU5TRk9STV9IT1JJWk9OVEFMX01JUlJPUl9ST1RBVEVfOTBfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzkwX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0lERU5USVRZX0JJVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVUkZBQ0VfVFJBTlNGT1JNX0lERU5USVRZX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0lOSEVSSVRfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VSRkFDRV9UUkFOU0ZPUk1fSU5IRVJJVF9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfMTgwX0JJVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV8xODBfQklUX0tIUiI7CisgICAgICAgIGNhc2UgVktfU1VSRkFDRV9UUkFOU0ZPUk1fUk9UQVRFXzI3MF9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfMjcwX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV85MF9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TVVJGQUNFX1RSQU5TRk9STV9ST1RBVEVfOTBfQklUX0tIUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1N1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUihWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnc0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUj4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIoVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQ09NUE9TSVRFX0FMUEhBX0lOSEVSSVRfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NUE9TSVRFX0FMUEhBX0lOSEVSSVRfQklUX0tIUiI7CisgICAgICAgIGNhc2UgVktfQ09NUE9TSVRFX0FMUEhBX09QQVFVRV9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT1NJVEVfQUxQSEFfT1BBUVVFX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX0NPTVBPU0lURV9BTFBIQV9QT1NUX01VTFRJUExJRURfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NUE9TSVRFX0FMUEhBX1BPU1RfTVVMVElQTElFRF9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19DT01QT1NJVEVfQUxQSEFfUFJFX01VTFRJUExJRURfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NUE9TSVRFX0FMUEhBX1BSRV9NVUxUSVBMSUVEX0JJVF9LSFIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrQ29tcG9zaXRlQWxwaGFGbGFnc0tIUihWa0NvbXBvc2l0ZUFscGhhRmxhZ3NLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrQ29tcG9zaXRlQWxwaGFGbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQ29sb3JTcGFjZUtIUihWa0NvbG9yU3BhY2VLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb2xvclNwYWNlS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19DT0xPUl9TUEFDRV9BRE9CRVJHQl9MSU5FQVJfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0xPUl9TUEFDRV9BRE9CRVJHQl9MSU5FQVJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19DT0xPUl9TUEFDRV9BRE9CRVJHQl9OT05MSU5FQVJfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0xPUl9TUEFDRV9BRE9CRVJHQl9OT05MSU5FQVJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19DT0xPUl9TUEFDRV9CVDIwMjBfTElORUFSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09MT1JfU1BBQ0VfQlQyMDIwX0xJTkVBUl9FWFQiOworICAgICAgICBjYXNlIFZLX0NPTE9SX1NQQUNFX0JUNzA5X0xJTkVBUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTE9SX1NQQUNFX0JUNzA5X0xJTkVBUl9FWFQiOworICAgICAgICBjYXNlIFZLX0NPTE9SX1NQQUNFX0JUNzA5X05PTkxJTkVBUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTE9SX1NQQUNFX0JUNzA5X05PTkxJTkVBUl9FWFQiOworICAgICAgICBjYXNlIFZLX0NPTE9SX1NQQUNFX0RDSV9QM19OT05MSU5FQVJfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0xPUl9TUEFDRV9EQ0lfUDNfTk9OTElORUFSX0VYVCI7CisgICAgICAgIGNhc2UgVktfQ09MT1JfU1BBQ0VfRElTUExBWV9OQVRJVkVfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0xPUl9TUEFDRV9ESVNQTEFZX05BVElWRV9BTUQiOworICAgICAgICBjYXNlIFZLX0NPTE9SX1NQQUNFX0RJU1BMQVlfUDNfTElORUFSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09MT1JfU1BBQ0VfRElTUExBWV9QM19MSU5FQVJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19DT0xPUl9TUEFDRV9ESVNQTEFZX1AzX05PTkxJTkVBUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTE9SX1NQQUNFX0RJU1BMQVlfUDNfTk9OTElORUFSX0VYVCI7CisgICAgICAgIGNhc2UgVktfQ09MT1JfU1BBQ0VfRE9MQllWSVNJT05fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0xPUl9TUEFDRV9ET0xCWVZJU0lPTl9FWFQiOworICAgICAgICBjYXNlIFZLX0NPTE9SX1NQQUNFX0VYVEVOREVEX1NSR0JfTElORUFSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09MT1JfU1BBQ0VfRVhURU5ERURfU1JHQl9MSU5FQVJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19DT0xPUl9TUEFDRV9FWFRFTkRFRF9TUkdCX05PTkxJTkVBUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTE9SX1NQQUNFX0VYVEVOREVEX1NSR0JfTk9OTElORUFSX0VYVCI7CisgICAgICAgIGNhc2UgVktfQ09MT1JfU1BBQ0VfSERSMTBfSExHX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09MT1JfU1BBQ0VfSERSMTBfSExHX0VYVCI7CisgICAgICAgIGNhc2UgVktfQ09MT1JfU1BBQ0VfSERSMTBfU1QyMDg0X0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09MT1JfU1BBQ0VfSERSMTBfU1QyMDg0X0VYVCI7CisgICAgICAgIGNhc2UgVktfQ09MT1JfU1BBQ0VfUEFTU19USFJPVUdIX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09MT1JfU1BBQ0VfUEFTU19USFJPVUdIX0VYVCI7CisgICAgICAgIGNhc2UgVktfQ09MT1JfU1BBQ0VfU1JHQl9OT05MSU5FQVJfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0xPUl9TUEFDRV9TUkdCX05PTkxJTkVBUl9LSFIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtDb2xvclNwYWNlS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUHJlc2VudE1vZGVLSFIoVmtQcmVzZW50TW9kZUtIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1ByZXNlbnRNb2RlS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19QUkVTRU5UX01PREVfRklGT19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BSRVNFTlRfTU9ERV9GSUZPX0tIUiI7CisgICAgICAgIGNhc2UgVktfUFJFU0VOVF9NT0RFX0ZJRk9fUkVMQVhFRF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BSRVNFTlRfTU9ERV9GSUZPX1JFTEFYRURfS0hSIjsKKyAgICAgICAgY2FzZSBWS19QUkVTRU5UX01PREVfSU1NRURJQVRFX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUFJFU0VOVF9NT0RFX0lNTUVESUFURV9LSFIiOworICAgICAgICBjYXNlIFZLX1BSRVNFTlRfTU9ERV9NQUlMQk9YX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUFJFU0VOVF9NT0RFX01BSUxCT1hfS0hSIjsKKyAgICAgICAgY2FzZSBWS19QUkVTRU5UX01PREVfU0hBUkVEX0NPTlRJTlVPVVNfUkVGUkVTSF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BSRVNFTlRfTU9ERV9TSEFSRURfQ09OVElOVU9VU19SRUZSRVNIX0tIUiI7CisgICAgICAgIGNhc2UgVktfUFJFU0VOVF9NT0RFX1NIQVJFRF9ERU1BTkRfUkVGUkVTSF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BSRVNFTlRfTU9ERV9TSEFSRURfREVNQU5EX1JFRlJFU0hfS0hSIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUHJlc2VudE1vZGVLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUihWa1N3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NXQVBDSEFJTl9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1dBUENIQUlOX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TV0FQQ0hBSU5fQ1JFQVRFX1BST1RFQ1RFRF9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TV0FQQ0hBSU5fQ1JFQVRFX1BST1RFQ1RFRF9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TV0FQQ0hBSU5fQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TV0FQQ0hBSU5fQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVRfS0hSIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtTd2FwY2hhaW5DcmVhdGVGbGFnc0tIUihWa1N3YXBjaGFpbkNyZWF0ZUZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtTd2FwY2hhaW5DcmVhdGVGbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1N3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrU3dhcGNoYWluQ3JlYXRlRmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIoVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ0JpdHNLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfTE9DQUxfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9MT0NBTF9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX0xPQ0FMX01VTFRJX0RFVklDRV9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX0xPQ0FMX01VTFRJX0RFVklDRV9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX1JFTU9URV9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX1JFTU9URV9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX1NVTV9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX1NVTV9CSVRfS0hSIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSKFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUihWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19ESVNQTEFZX1BMQU5FX0FMUEhBX0dMT0JBTF9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19ESVNQTEFZX1BMQU5FX0FMUEhBX0dMT0JBTF9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19ESVNQTEFZX1BMQU5FX0FMUEhBX09QQVFVRV9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19ESVNQTEFZX1BMQU5FX0FMUEhBX09QQVFVRV9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19ESVNQTEFZX1BMQU5FX0FMUEhBX1BFUl9QSVhFTF9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19ESVNQTEFZX1BMQU5FX0FMUEhBX1BFUl9QSVhFTF9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19ESVNQTEFZX1BMQU5FX0FMUEhBX1BFUl9QSVhFTF9QUkVNVUxUSVBMSUVEX0JJVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RJU1BMQVlfUExBTkVfQUxQSEFfUEVSX1BJWEVMX1BSRU1VTFRJUExJRURfQklUX0tIUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtEaXNwbGF5UGxhbmVBbHBoYUZsYWdzS0hSKFZrRGlzcGxheVBsYW5lQWxwaGFGbGFnc0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtEaXNwbGF5UGxhbmVBbHBoYUZsYWdCaXRzS0hSPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGlzcGxheVBsYW5lQWxwaGFGbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzS0hSKFZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0c0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9EU1RfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRUVSX01FTU9SWV9GRUFUVVJFX0NPUFlfRFNUX0JJVCI7CisgICAgICAgIGNhc2UgVktfUEVFUl9NRU1PUllfRkVBVFVSRV9DT1BZX1NSQ19CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfQ09QWV9TUkNfQklUIjsKKyAgICAgICAgY2FzZSBWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfRFNUX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVFUl9NRU1PUllfRkVBVFVSRV9HRU5FUklDX0RTVF9CSVQiOworICAgICAgICBjYXNlIFZLX1BFRVJfTUVNT1JZX0ZFQVRVUkVfR0VORVJJQ19TUkNfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRUVSX01FTU9SWV9GRUFUVVJFX0dFTkVSSUNfU1JDX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdzS0hSKFZrUGVlck1lbW9yeUZlYXR1cmVGbGFnc0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtQZWVyTWVtb3J5RmVhdHVyZUZsYWdCaXRzS0hSPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrUGVlck1lbW9yeUZlYXR1cmVGbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzS0hSKFZrTWVtb3J5QWxsb2NhdGVGbGFnQml0c0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHNLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUiI7CisgICAgICAgIGNhc2UgVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrTWVtb3J5QWxsb2NhdGVGbGFnQml0c0tIUiI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa01lbW9yeUFsbG9jYXRlRmxhZ3NLSFIoVmtNZW1vcnlBbGxvY2F0ZUZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrTWVtb3J5QWxsb2NhdGVGbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa01lbW9yeUFsbG9jYXRlRmxhZ0JpdHNLSFI+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrTWVtb3J5QWxsb2NhdGVGbGFnQml0c0tIUj4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzS0hSKFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c0tIUilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9LTVRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9LTVRfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfSEVBUF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0RNQV9CVUZfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0RNQV9CVUZfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfQUxMT0NBVElPTl9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX01BUFBFRF9GT1JFSUdOX01FTU9SWV9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9NQVBQRURfRk9SRUlHTl9NRU1PUllfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc0tIUihWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c0tIUihWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0RFRElDQVRFRF9PTkxZX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfREVESUNBVEVEX09OTFlfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NLSFIoVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnc0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNLSFI+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzS0hSPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNLSFIoVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0c0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfRDNEMTJfRkVOQ0VfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfRDNEMTJfRkVOQ0VfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnc0tIUihWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0c0tIUihWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHNLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVCI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnc0tIUihWa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVGbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsU2VtYXBob3JlRmVhdHVyZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0c0tIUihWa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHNLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0VNQVBIT1JFX0lNUE9SVF9URU1QT1JBUllfQklUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtTZW1hcGhvcmVJbXBvcnRGbGFnc0tIUihWa1NlbWFwaG9yZUltcG9ydEZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmVJbXBvcnRGbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlS0hSKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlVHlwZUtIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVR5cGVLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQiOworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfUFVTSF9ERVNDUklQVE9SU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfUFVTSF9ERVNDUklQVE9SU19LSFIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c0tIUihWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdzS0hSKFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnc0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzS0hSPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzS0hSKFZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0c0tIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHNLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVQiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnc0tIUihWa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ3NLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsRmVuY2VGZWF0dXJlRmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbEZlbmNlRmVhdHVyZUZsYWdCaXRzS0hSPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRmVuY2VJbXBvcnRGbGFnQml0c0tIUihWa0ZlbmNlSW1wb3J0RmxhZ0JpdHNLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtGZW5jZUltcG9ydEZsYWdCaXRzS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRkVOQ0VfSU1QT1JUX1RFTVBPUkFSWV9CSVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtGZW5jZUltcG9ydEZsYWdCaXRzS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrRmVuY2VJbXBvcnRGbGFnc0tIUihWa0ZlbmNlSW1wb3J0RmxhZ3NLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtGZW5jZUltcG9ydEZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrRmVuY2VJbXBvcnRGbGFnQml0c0tIUj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0ZlbmNlSW1wb3J0RmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtGZW5jZUltcG9ydEZsYWdCaXRzS0hSPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUGVyZm9ybWFuY2VDb3VudGVyVW5pdEtIUihWa1BlcmZvcm1hbmNlQ291bnRlclVuaXRLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQU1QU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9BTVBTX0tIUiI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0JZVEVTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0JZVEVTX0tIUiI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0JZVEVTX1BFUl9TRUNPTkRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQllURVNfUEVSX1NFQ09ORF9LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9DWUNMRVNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfQ1lDTEVTX0tIUiI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX0dFTkVSSUNfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfR0VORVJJQ19LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9IRVJUWl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9IRVJUWl9LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9LRUxWSU5fS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfS0VMVklOX0tIUiI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX05BTk9TRUNPTkRTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX05BTk9TRUNPTkRTX0tIUiI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9VTklUX1BFUkNFTlRBR0VfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1VOSVRfUEVSQ0VOVEFHRV9LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9WT0xUU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9WT0xUU19LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9XQVRUU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfVU5JVF9XQVRUU19LSFIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUGVyZm9ybWFuY2VDb3VudGVyU2NvcGVLSFIoVmtQZXJmb3JtYW5jZUNvdW50ZXJTY29wZUtIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1BlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9TQ09QRV9DT01NQU5EX0JVRkZFUl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1NDT1BFX0NPTU1BTkRfQlVGRkVSX0tIUiI7CisgICAgICAgIGNhc2UgVktfUVVFUllfU0NPUEVfQ09NTUFORF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1NDT1BFX0NPTU1BTkRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVJZX1NDT1BFX1JFTkRFUl9QQVNTX0tIUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BlcmZvcm1hbmNlQ291bnRlclNjb3BlS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUGVyZm9ybWFuY2VDb3VudGVyU3RvcmFnZUtIUihWa1BlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQZXJmb3JtYW5jZUNvdW50ZXJTdG9yYWdlS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfRkxPQVQzMl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9GTE9BVDMyX0tIUiI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX0ZMT0FUNjRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfRkxPQVQ2NF9LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9JTlQzMl9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9JTlQzMl9LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9JTlQ2NF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9JTlQ2NF9LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9VSU5UMzJfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX1NUT1JBR0VfVUlOVDMyX0tIUiI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9TVE9SQUdFX1VJTlQ2NF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX0NPVU5URVJfU1RPUkFHRV9VSU5UNjRfS0hSIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUGVyZm9ybWFuY2VDb3VudGVyU3RvcmFnZUtIUiI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ0JpdHNLSFIoVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9DT05DVVJSRU5UTFlfSU1QQUNURURfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9DT1VOVEVSX0RFU0NSSVBUSU9OX0NPTkNVUlJFTlRMWV9JTVBBQ1RFRF9LSFIiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fUEVSRk9STUFOQ0VfSU1QQUNUSU5HX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9QRVJGT1JNQU5DRV9JTVBBQ1RJTkdfS0hSIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUiI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ3NLSFIoVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uRmxhZ0JpdHNLSFI+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbkZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnQml0c0tIUj4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1BvaW50Q2xpcHBpbmdCZWhhdmlvcktIUihWa1BvaW50Q2xpcHBpbmdCZWhhdmlvcktIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1BvaW50Q2xpcHBpbmdCZWhhdmlvcktIUilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfQUxMX0NMSVBfUExBTkVTOgorICAgICAgICAgICAgcmV0dXJuICJWS19QT0lOVF9DTElQUElOR19CRUhBVklPUl9BTExfQ0xJUF9QTEFORVMiOworICAgICAgICBjYXNlIFZLX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SX1VTRVJfQ0xJUF9QTEFORVNfT05MWToKKyAgICAgICAgICAgIHJldHVybiAiVktfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1JfVVNFUl9DTElQX1BMQU5FU19PTkxZIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luS0hSKFZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9MT1dFUl9MRUZUOgorICAgICAgICAgICAgcmV0dXJuICJWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9MT1dFUl9MRUZUIjsKKyAgICAgICAgY2FzZSBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZUOgorICAgICAgICAgICAgcmV0dXJuICJWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uS0hSKFZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZIjsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fWUNCQ1JfMjAyMDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSXzIwMjAiOworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl82MDE6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl82MDEiOworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl83MDk6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl83MDkiOworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9ZQ0JDUl9JREVOVElUWToKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1lDQkNSX0lERU5USVRZIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU2FtcGxlclljYmNyUmFuZ2VLSFIoVmtTYW1wbGVyWWNiY3JSYW5nZUtIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1NhbXBsZXJZY2JjclJhbmdlS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMIjsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9OQVJST1c6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX05BUlJPVyI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1NhbXBsZXJZY2JjclJhbmdlS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQ2hyb21hTG9jYXRpb25LSFIoVmtDaHJvbWFMb2NhdGlvbktIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0Nocm9tYUxvY2F0aW9uS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19DSFJPTUFfTE9DQVRJT05fQ09TSVRFRF9FVkVOOgorICAgICAgICAgICAgcmV0dXJuICJWS19DSFJPTUFfTE9DQVRJT05fQ09TSVRFRF9FVkVOIjsKKyAgICAgICAgY2FzZSBWS19DSFJPTUFfTE9DQVRJT05fTUlEUE9JTlQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Nocm9tYUxvY2F0aW9uS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRHJpdmVySWRLSFIoVmtEcml2ZXJJZEtIUiBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0RyaXZlcklkS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19EUklWRVJfSURfQU1EX09QRU5fU09VUkNFX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFJJVkVSX0lEX0FNRF9PUEVOX1NPVVJDRV9LSFIiOworICAgICAgICBjYXNlIFZLX0RSSVZFUl9JRF9BTURfUFJPUFJJRVRBUllfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19EUklWRVJfSURfQU1EX1BST1BSSUVUQVJZX0tIUiI7CisgICAgICAgIGNhc2UgVktfRFJJVkVSX0lEX0FSTV9QUk9QUklFVEFSWV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RSSVZFUl9JRF9BUk1fUFJPUFJJRVRBUllfS0hSIjsKKyAgICAgICAgY2FzZSBWS19EUklWRVJfSURfQlJPQURDT01fUFJPUFJJRVRBUllfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19EUklWRVJfSURfQlJPQURDT01fUFJPUFJJRVRBUllfS0hSIjsKKyAgICAgICAgY2FzZSBWS19EUklWRVJfSURfR0dQX1BST1BSSUVUQVJZX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFJJVkVSX0lEX0dHUF9QUk9QUklFVEFSWV9LSFIiOworICAgICAgICBjYXNlIFZLX0RSSVZFUl9JRF9HT09HTEVfU1dJRlRTSEFERVJfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19EUklWRVJfSURfR09PR0xFX1NXSUZUU0hBREVSX0tIUiI7CisgICAgICAgIGNhc2UgVktfRFJJVkVSX0lEX0lNQUdJTkFUSU9OX1BST1BSSUVUQVJZX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFJJVkVSX0lEX0lNQUdJTkFUSU9OX1BST1BSSUVUQVJZX0tIUiI7CisgICAgICAgIGNhc2UgVktfRFJJVkVSX0lEX0lOVEVMX09QRU5fU09VUkNFX01FU0FfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19EUklWRVJfSURfSU5URUxfT1BFTl9TT1VSQ0VfTUVTQV9LSFIiOworICAgICAgICBjYXNlIFZLX0RSSVZFUl9JRF9JTlRFTF9QUk9QUklFVEFSWV9XSU5ET1dTX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFJJVkVSX0lEX0lOVEVMX1BST1BSSUVUQVJZX1dJTkRPV1NfS0hSIjsKKyAgICAgICAgY2FzZSBWS19EUklWRVJfSURfTUVTQV9SQURWX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFJJVkVSX0lEX01FU0FfUkFEVl9LSFIiOworICAgICAgICBjYXNlIFZLX0RSSVZFUl9JRF9OVklESUFfUFJPUFJJRVRBUllfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19EUklWRVJfSURfTlZJRElBX1BST1BSSUVUQVJZX0tIUiI7CisgICAgICAgIGNhc2UgVktfRFJJVkVSX0lEX1FVQUxDT01NX1BST1BSSUVUQVJZX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRFJJVkVSX0lEX1FVQUxDT01NX1BST1BSSUVUQVJZX0tIUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0RyaXZlcklkS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUihWa1NoYWRlckZsb2F0Q29udHJvbHNJbmRlcGVuZGVuY2VLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFXzMyX0JJVF9PTkxZX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV8zMl9CSVRfT05MWV9LSFIiOworICAgICAgICBjYXNlIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfQUxMX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9BTExfS0hSIjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFX05PTkVfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFX05PTkVfS0hSIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUiI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFIoVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUkVTT0xWRV9NT0RFX0FWRVJBR0VfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUkVTT0xWRV9NT0RFX0FWRVJBR0VfQklUX0tIUiI7CisgICAgICAgIGNhc2UgVktfUkVTT0xWRV9NT0RFX01BWF9CSVRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19SRVNPTFZFX01PREVfTUFYX0JJVF9LSFIiOworICAgICAgICBjYXNlIFZLX1JFU09MVkVfTU9ERV9NSU5fQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUkVTT0xWRV9NT0RFX01JTl9CSVRfS0hSIjsKKyAgICAgICAgY2FzZSBWS19SRVNPTFZFX01PREVfTk9ORV9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1JFU09MVkVfTU9ERV9OT05FX0tIUiI7CisgICAgICAgIGNhc2UgVktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1JFU09MVkVfTU9ERV9TQU1QTEVfWkVST19CSVRfS0hSIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa1Jlc29sdmVNb2RlRmxhZ3NLSFIoVmtSZXNvbHZlTW9kZUZsYWdzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUihzdGF0aWNfY2FzdDxWa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFI+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSKHN0YXRpY19jYXN0PFZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUj4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1NlbWFwaG9yZVR5cGVLSFIoVmtTZW1hcGhvcmVUeXBlS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2VtYXBob3JlVHlwZUtIUilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiI7CisgICAgICAgIGNhc2UgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTZW1hcGhvcmVUeXBlS0hSIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSKFZrU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2VtYXBob3JlV2FpdEZsYWdCaXRzS0hSKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TRU1BUEhPUkVfV0FJVF9BTllfQklUX0tIUjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0VNQVBIT1JFX1dBSVRfQU5ZX0JJVF9LSFIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtTZW1hcGhvcmVXYWl0RmxhZ3NLSFIoVmtTZW1hcGhvcmVXYWl0RmxhZ3NLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFI+KDEgPDwgaW5kZXgpKSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaW5wdXRfdmFsdWUgPj49IDE7CisgICAgfQorICAgIGlmKCByZXQuZW1wdHkoKSkgcmV0LmFwcGVuZChzdHJpbmdfVmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFIoc3RhdGljX2Nhc3Q8VmtTZW1hcGhvcmVXYWl0RmxhZ0JpdHNLSFI+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNGb3JtYXRLSFIoVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNGb3JtYXRLSFIgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNGb3JtYXRLSFIpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9CT09MMzJfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfQk9PTDMyX0tIUiI7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfRVhFQ1VUQUJMRV9TVEFUSVNUSUNfRk9STUFUX0ZMT0FUNjRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfRkxPQVQ2NF9LSFIiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9JTlQ2NF9LSFI6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9JTlQ2NF9LSFIiOworICAgICAgICBjYXNlIFZLX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0ZPUk1BVF9VSU5UNjRfS0hSOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19GT1JNQVRfVUlOVDY0X0tIUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0Zvcm1hdEtIUiI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVChWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlZfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVl9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0xfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0VYVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfRVhUX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUl9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRVZFTlRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRVZFTlRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVJfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfVklFV19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlhfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWF9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTlNUQU5DRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTlNUQU5DRV9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlhfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRV9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTU19FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQoVmtEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRGVidWdSZXBvcnRGbGFnQml0c0VYVClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUKFZrRGVidWdSZXBvcnRGbGFnc0VYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQoc3RhdGljX2Nhc3Q8VmtEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGVidWdSZXBvcnRGbGFnQml0c0VYVChzdGF0aWNfY2FzdDxWa0RlYnVnUmVwb3J0RmxhZ0JpdHNFWFQ+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtSYXN0ZXJpemF0aW9uT3JkZXJBTUQoVmtSYXN0ZXJpemF0aW9uT3JkZXJBTUQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtSYXN0ZXJpemF0aW9uT3JkZXJBTUQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1JBU1RFUklaQVRJT05fT1JERVJfUkVMQVhFRF9BTUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1JBU1RFUklaQVRJT05fT1JERVJfUkVMQVhFRF9BTUQiOworICAgICAgICBjYXNlIFZLX1JBU1RFUklaQVRJT05fT1JERVJfU1RSSUNUX0FNRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUkFTVEVSSVpBVElPTl9PUkRFUl9TVFJJQ1RfQU1EIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUmFzdGVyaXphdGlvbk9yZGVyQU1EIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU2hhZGVySW5mb1R5cGVBTUQoVmtTaGFkZXJJbmZvVHlwZUFNRCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1NoYWRlckluZm9UeXBlQU1EKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfSU5GT19UWVBFX0JJTkFSWV9BTUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURFUl9JTkZPX1RZUEVfQklOQVJZX0FNRCI7CisgICAgICAgIGNhc2UgVktfU0hBREVSX0lORk9fVFlQRV9ESVNBU1NFTUJMWV9BTUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURFUl9JTkZPX1RZUEVfRElTQVNTRU1CTFlfQU1EIjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfSU5GT19UWVBFX1NUQVRJU1RJQ1NfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFERVJfSU5GT19UWVBFX1NUQVRJU1RJQ1NfQU1EIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU2hhZGVySW5mb1R5cGVBTUQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WKFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9JTUFHRV9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9JTUFHRV9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9JTUFHRV9LTVRfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfSU1BR0VfS01UX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVF9OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WKFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOVihzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlY+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WKFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0RFRElDQVRFRF9PTkxZX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfREVESUNBVEVEX09OTFlfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfRVhQT1JUQUJMRV9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX0VYVEVSTkFMX01FTU9SWV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVF9OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlYiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnc05WKFZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ3NOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlYoc3RhdGljX2Nhc3Q8VmtFeHRlcm5hbE1lbW9yeUZlYXR1cmVGbGFnQml0c05WPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRXh0ZXJuYWxNZW1vcnlGZWF0dXJlRmxhZ0JpdHNOVihzdGF0aWNfY2FzdDxWa0V4dGVybmFsTWVtb3J5RmVhdHVyZUZsYWdCaXRzTlY+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtWYWxpZGF0aW9uQ2hlY2tFWFQoVmtWYWxpZGF0aW9uQ2hlY2tFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtWYWxpZGF0aW9uQ2hlY2tFWFQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fQ0hFQ0tfQUxMX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfVkFMSURBVElPTl9DSEVDS19BTExfRVhUIjsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0NIRUNLX1NIQURFUlNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19WQUxJREFUSU9OX0NIRUNLX1NIQURFUlNfRVhUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrVmFsaWRhdGlvbkNoZWNrRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVChWa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5WRVJURURfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lOVkVSVEVEX0JJVF9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnc0VYVChWa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ3NFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUKHN0YXRpY19jYXN0PFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdGbGFnQml0c0VYVD4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQoc3RhdGljX2Nhc3Q8VmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdCaXRzRVhUPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlgoVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfRU1QVFlfRVhFQ1VUSU9OU19CSVRfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfRU1QVFlfRVhFQ1VUSU9OU19CSVRfTlZYIjsKKyAgICAgICAgY2FzZSBWS19JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfVVNBR0VfSU5ERVhFRF9TRVFVRU5DRVNfQklUX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX1VTQUdFX0lOREVYRURfU0VRVUVOQ0VTX0JJVF9OVlgiOworICAgICAgICBjYXNlIFZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9TUEFSU0VfU0VRVUVOQ0VTX0JJVF9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9TUEFSU0VfU0VRVUVOQ0VTX0JJVF9OVlgiOworICAgICAgICBjYXNlIFZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9VTk9SREVSRURfU0VRVUVOQ0VTX0JJVF9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9VU0FHRV9VTk9SREVSRURfU0VRVUVOQ0VTX0JJVF9OVlgiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdzTlZYKFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ3NOVlggaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWChzdGF0aWNfY2FzdDxWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dFVzYWdlRmxhZ0JpdHNOVlgoc3RhdGljX2Nhc3Q8VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnQml0c05WWD4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWChWa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX0VOVFJZX1VTQUdFX0NPTVBVVEVfQklUX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX0VOVFJZX1VTQUdFX0NPTVBVVEVfQklUX05WWCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX0VOVFJZX1VTQUdFX0dSQVBISUNTX0JJVF9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9FTlRSWV9VU0FHRV9HUkFQSElDU19CSVRfTlZYIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYKFZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYKHN0YXRpY19jYXN0PFZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYKHN0YXRpY19jYXN0PFZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrSW5kaXJlY3RDb21tYW5kc1Rva2VuVHlwZU5WWChWa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlggaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0RFU0NSSVBUT1JfU0VUX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ERVNDUklQVE9SX1NFVF9OVlgiOworICAgICAgICBjYXNlIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRElTUEFUQ0hfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0RJU1BBVENIX05WWCI7CisgICAgICAgIGNhc2UgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9EUkFXX0lOREVYRURfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX0RSQVdfSU5ERVhFRF9OVlgiOworICAgICAgICBjYXNlIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19OVlgiOworICAgICAgICBjYXNlIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfSU5ERVhfQlVGRkVSX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9JTkRFWF9CVUZGRVJfTlZYIjsKKyAgICAgICAgY2FzZSBWS19JTkRJUkVDVF9DT01NQU5EU19UT0tFTl9UWVBFX1BJUEVMSU5FX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9QSVBFTElORV9OVlgiOworICAgICAgICBjYXNlIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfUFVTSF9DT05TVEFOVF9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfUFVTSF9DT05TVEFOVF9OVlgiOworICAgICAgICBjYXNlIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfVkVSVEVYX0JVRkZFUl9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfVkVSVEVYX0JVRkZFUl9OVlgiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5UeXBlTlZYIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrT2JqZWN0RW50cnlUeXBlTlZYKFZrT2JqZWN0RW50cnlUeXBlTlZYIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrT2JqZWN0RW50cnlUeXBlTlZYKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfRU5UUllfVFlQRV9ERVNDUklQVE9SX1NFVF9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9FTlRSWV9UWVBFX0RFU0NSSVBUT1JfU0VUX05WWCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX0VOVFJZX1RZUEVfSU5ERVhfQlVGRkVSX05WWDoKKyAgICAgICAgICAgIHJldHVybiAiVktfT0JKRUNUX0VOVFJZX1RZUEVfSU5ERVhfQlVGRkVSX05WWCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX0VOVFJZX1RZUEVfUElQRUxJTkVfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfRU5UUllfVFlQRV9QSVBFTElORV9OVlgiOworICAgICAgICBjYXNlIFZLX09CSkVDVF9FTlRSWV9UWVBFX1BVU0hfQ09OU1RBTlRfTlZYOgorICAgICAgICAgICAgcmV0dXJuICJWS19PQkpFQ1RfRU5UUllfVFlQRV9QVVNIX0NPTlNUQU5UX05WWCI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX0VOVFJZX1RZUEVfVkVSVEVYX0JVRkZFUl9OVlg6CisgICAgICAgICAgICByZXR1cm4gIlZLX09CSkVDVF9FTlRSWV9UWVBFX1ZFUlRFWF9CVUZGRVJfTlZYIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrT2JqZWN0RW50cnlUeXBlTlZYIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVChWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19TVVJGQUNFX0NPVU5URVJfVkJMQU5LX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU1VSRkFDRV9DT1VOVEVSX1ZCTEFOS19FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrU3VyZmFjZUNvdW50ZXJGbGFnc0VYVChWa1N1cmZhY2VDb3VudGVyRmxhZ3NFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUKHN0YXRpY19jYXN0PFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVD4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQoc3RhdGljX2Nhc3Q8VmtTdXJmYWNlQ291bnRlckZsYWdCaXRzRVhUPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRGlzcGxheVBvd2VyU3RhdGVFWFQoVmtEaXNwbGF5UG93ZXJTdGF0ZUVYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0Rpc3BsYXlQb3dlclN0YXRlRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX09GRl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RJU1BMQVlfUE9XRVJfU1RBVEVfT0ZGX0VYVCI7CisgICAgICAgIGNhc2UgVktfRElTUExBWV9QT1dFUl9TVEFURV9PTl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RJU1BMQVlfUE9XRVJfU1RBVEVfT05fRVhUIjsKKyAgICAgICAgY2FzZSBWS19ESVNQTEFZX1BPV0VSX1NUQVRFX1NVU1BFTkRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ESVNQTEFZX1BPV0VSX1NUQVRFX1NVU1BFTkRfRVhUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRGlzcGxheVBvd2VyU3RhdGVFWFQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtEZXZpY2VFdmVudFR5cGVFWFQoVmtEZXZpY2VFdmVudFR5cGVFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtEZXZpY2VFdmVudFR5cGVFWFQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0RFVklDRV9FVkVOVF9UWVBFX0RJU1BMQVlfSE9UUExVR19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFVklDRV9FVkVOVF9UWVBFX0RJU1BMQVlfSE9UUExVR19FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtEZXZpY2VFdmVudFR5cGVFWFQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtEaXNwbGF5RXZlbnRUeXBlRVhUKFZrRGlzcGxheUV2ZW50VHlwZUVYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0Rpc3BsYXlFdmVudFR5cGVFWFQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0RJU1BMQVlfRVZFTlRfVFlQRV9GSVJTVF9QSVhFTF9PVVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ESVNQTEFZX0VWRU5UX1RZUEVfRklSU1RfUElYRUxfT1VUX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Rpc3BsYXlFdmVudFR5cGVFWFQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYoVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9ORUdBVElWRV9XX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfV19OViI7CisgICAgICAgIGNhc2UgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX05FR0FUSVZFX1hfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9ORUdBVElWRV9YX05WIjsKKyAgICAgICAgY2FzZSBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfWV9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX05FR0FUSVZFX1lfTlYiOworICAgICAgICBjYXNlIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9ORUdBVElWRV9aX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfTkVHQVRJVkVfWl9OViI7CisgICAgICAgIGNhc2UgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1dfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9XX05WIjsKKyAgICAgICAgY2FzZSBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfWF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1hfTlYiOworICAgICAgICBjYXNlIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9ZX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfWV9OViI7CisgICAgICAgIGNhc2UgVktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1pfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9aX05WIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRGlzY2FyZFJlY3RhbmdsZU1vZGVFWFQoVmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0Rpc2NhcmRSZWN0YW5nbGVNb2RlRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19ESVNDQVJEX1JFQ1RBTkdMRV9NT0RFX0VYQ0xVU0lWRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RJU0NBUkRfUkVDVEFOR0xFX01PREVfRVhDTFVTSVZFX0VYVCI7CisgICAgICAgIGNhc2UgVktfRElTQ0FSRF9SRUNUQU5HTEVfTU9ERV9JTkNMVVNJVkVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ESVNDQVJEX1JFQ1RBTkdMRV9NT0RFX0lOQ0xVU0lWRV9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0NvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlRVhUKFZrQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9ESVNBQkxFRF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX01PREVfRElTQUJMRURfRVhUIjsKKyAgICAgICAgY2FzZSBWS19DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9NT0RFX09WRVJFU1RJTUFURV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX01PREVfT1ZFUkVTVElNQVRFX0VYVCI7CisgICAgICAgIGNhc2UgVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9VTkRFUkVTVElNQVRFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fTU9ERV9VTkRFUkVTVElNQVRFX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0NvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUKFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0VSUk9SX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9JTkZPX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1ZFUkJPU0VfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9WRVJCT1NFX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1dBUk5JTkdfQklUX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVChWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVChzdGF0aWNfY2FzdDxWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVD4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVChzdGF0aWNfY2FzdDxWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVD4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUKFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX0dFTkVSQUxfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX0dFTkVSQUxfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1BFUkZPUk1BTkNFX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9QRVJGT1JNQU5DRV9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfVkFMSURBVElPTl9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfVkFMSURBVElPTl9CSVRfRVhUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVChWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQoc3RhdGljX2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVD4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUKHN0YXRpY19jYXN0PFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ0JpdHNFWFQ+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUVYVChWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2FtcGxlclJlZHVjdGlvbk1vZGVFWFQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUIjsKKyAgICAgICAgY2FzZSBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVCI7CisgICAgICAgIGNhc2UgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9XRUlHSFRFRF9BVkVSQUdFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9XRUlHSFRFRF9BVkVSQUdFX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQmxlbmRPdmVybGFwRVhUKFZrQmxlbmRPdmVybGFwRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQmxlbmRPdmVybGFwRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19CTEVORF9PVkVSTEFQX0NPTkpPSU5UX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfQkxFTkRfT1ZFUkxBUF9DT05KT0lOVF9FWFQiOworICAgICAgICBjYXNlIFZLX0JMRU5EX09WRVJMQVBfRElTSk9JTlRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PVkVSTEFQX0RJU0pPSU5UX0VYVCI7CisgICAgICAgIGNhc2UgVktfQkxFTkRfT1ZFUkxBUF9VTkNPUlJFTEFURURfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19CTEVORF9PVkVSTEFQX1VOQ09SUkVMQVRFRF9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtCbGVuZE92ZXJsYXBFWFQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYoVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb3ZlcmFnZU1vZHVsYXRpb25Nb2RlTlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9BTFBIQV9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX0FMUEhBX05WIjsKKyAgICAgICAgY2FzZSBWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfTk9ORV9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX05PTkVfTlYiOworICAgICAgICBjYXNlIFZLX0NPVkVSQUdFX01PRFVMQVRJT05fTU9ERV9SR0JBX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT1ZFUkFHRV9NT0RVTEFUSU9OX01PREVfUkdCQV9OViI7CisgICAgICAgIGNhc2UgVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX1JHQl9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09WRVJBR0VfTU9EVUxBVElPTl9NT0RFX1JHQl9OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0NvdmVyYWdlTW9kdWxhdGlvbk1vZGVOViI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1ZhbGlkYXRpb25DYWNoZUhlYWRlclZlcnNpb25FWFQoVmtWYWxpZGF0aW9uQ2FjaGVIZWFkZXJWZXJzaW9uRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrVmFsaWRhdGlvbkNhY2hlSGVhZGVyVmVyc2lvbkVYVClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19WQUxJREFUSU9OX0NBQ0hFX0hFQURFUl9WRVJTSU9OX09ORV9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtWYWxpZGF0aW9uQ2FjaGVIZWFkZXJWZXJzaW9uRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVChWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX0JJTkRJTkdfUEFSVElBTExZX0JPVU5EX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX1VOVVNFRF9XSElMRV9QRU5ESU5HX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfREVTQ1JJUFRPUl9CSU5ESU5HX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQklUX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUKFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQoc3RhdGljX2Nhc3Q8VmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhUPigxIDw8IGluZGV4KSkpOworICAgICAgICB9CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxOworICAgIH0KKyAgICBpZiggcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoc3RyaW5nX1ZrRGVzY3JpcHRvckJpbmRpbmdGbGFnQml0c0VYVChzdGF0aWNfY2FzdDxWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQ+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WKFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzE2X0lOVk9DQVRJT05TX1BFUl9QSVhFTF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMTZfSU5WT0NBVElPTlNfUEVSX1BJWEVMX05WIjsKKyAgICAgICAgY2FzZSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzFYMl9QSVhFTFNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfMVgyX1BJWEVMU19OViI7CisgICAgICAgIGNhc2UgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8yWDFfUElYRUxTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYMV9QSVhFTFNfTlYiOworICAgICAgICBjYXNlIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfMlgyX1BJWEVMU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8yWDJfUElYRUxTX05WIjsKKyAgICAgICAgY2FzZSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYNF9QSVhFTFNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfMlg0X1BJWEVMU19OViI7CisgICAgICAgIGNhc2UgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl80WDJfUElYRUxTX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzRYMl9QSVhFTFNfTlYiOworICAgICAgICBjYXNlIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfNFg0X1BJWEVMU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl80WDRfUElYRUxTX05WIjsKKyAgICAgICAgY2FzZSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSX1BJWEVMX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSX1BJWEVMX05WIjsKKyAgICAgICAgY2FzZSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8yX0lOVk9DQVRJT05TX1BFUl9QSVhFTF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMl9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlYiOworICAgICAgICBjYXNlIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzRfSU5WT0NBVElPTlNfUEVSX1BJWEVMX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV80X0lOVk9DQVRJT05TX1BFUl9QSVhFTF9OViI7CisgICAgICAgIGNhc2UgVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfOF9JTlZPQ0FUSU9OU19QRVJfUElYRUxfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzhfSU5WT0NBVElPTlNfUEVSX1BJWEVMX05WIjsKKyAgICAgICAgY2FzZSBWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV9OT19JTlZPQ0FUSU9OU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfTk9fSU5WT0NBVElPTlNfTlYiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYoVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfQ1VTVE9NX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfQ1VTVE9NX05WIjsKKyAgICAgICAgY2FzZSBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfREVGQVVMVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX0RFRkFVTFRfTlYiOworICAgICAgICBjYXNlIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9QSVhFTF9NQUpPUl9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX1BJWEVMX01BSk9SX05WIjsKKyAgICAgICAgY2FzZSBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfU0FNUExFX01BSk9SX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfU0FNUExFX01BSk9SX05WIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrQ29hcnNlU2FtcGxlT3JkZXJUeXBlTlYiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlYoVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlYiOworICAgICAgICBjYXNlIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9UT1BfTEVWRUxfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9UT1BfTEVWRUxfTlYiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUeXBlTlYiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBUeXBlTlYoVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBUeXBlTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBUeXBlTlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlYiOworICAgICAgICBjYXNlIFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1BST0NFRFVSQUxfSElUX0dST1VQX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9QUk9DRURVUkFMX0hJVF9HUk9VUF9OViI7CisgICAgICAgIGNhc2UgVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOViI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0dlb21ldHJ5VHlwZU5WKFZrR2VvbWV0cnlUeXBlTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtHZW9tZXRyeVR5cGVOVilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfR0VPTUVUUllfVFlQRV9BQUJCU19OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfR0VPTUVUUllfVFlQRV9BQUJCU19OViI7CisgICAgICAgIGNhc2UgVktfR0VPTUVUUllfVFlQRV9UUklBTkdMRVNfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0dFT01FVFJZX1RZUEVfVFJJQU5HTEVTX05WIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrR2VvbWV0cnlUeXBlTlYiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtHZW9tZXRyeUZsYWdCaXRzTlYoVmtHZW9tZXRyeUZsYWdCaXRzTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtHZW9tZXRyeUZsYWdCaXRzTlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0dFT01FVFJZX05PX0RVUExJQ0FURV9BTllfSElUX0lOVk9DQVRJT05fQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19HRU9NRVRSWV9OT19EVVBMSUNBVEVfQU5ZX0hJVF9JTlZPQ0FUSU9OX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfR0VPTUVUUllfT1BBUVVFX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfR0VPTUVUUllfT1BBUVVFX0JJVF9OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0dlb21ldHJ5RmxhZ0JpdHNOViI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0dlb21ldHJ5RmxhZ3NOVihWa0dlb21ldHJ5RmxhZ3NOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0dlb21ldHJ5RmxhZ0JpdHNOVihzdGF0aWNfY2FzdDxWa0dlb21ldHJ5RmxhZ0JpdHNOVj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0dlb21ldHJ5RmxhZ0JpdHNOVihzdGF0aWNfY2FzdDxWa0dlb21ldHJ5RmxhZ0JpdHNOVj4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0dlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WKFZrR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOVilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfR0VPTUVUUllfSU5TVEFOQ0VfRk9SQ0VfTk9fT1BBUVVFX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfR0VPTUVUUllfSU5TVEFOQ0VfRk9SQ0VfTk9fT1BBUVVFX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfR0VPTUVUUllfSU5TVEFOQ0VfRk9SQ0VfT1BBUVVFX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfR0VPTUVUUllfSU5TVEFOQ0VfRk9SQ0VfT1BBUVVFX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfR0VPTUVUUllfSU5TVEFOQ0VfVFJJQU5HTEVfQ1VMTF9ESVNBQkxFX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfR0VPTUVUUllfSU5TVEFOQ0VfVFJJQU5HTEVfQ1VMTF9ESVNBQkxFX0JJVF9OViI7CisgICAgICAgIGNhc2UgVktfR0VPTUVUUllfSU5TVEFOQ0VfVFJJQU5HTEVfRlJPTlRfQ09VTlRFUkNMT0NLV0lTRV9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0dFT01FVFJZX0lOU1RBTkNFX1RSSUFOR0xFX0ZST05UX0NPVU5URVJDTE9DS1dJU0VfQklUX05WIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlYiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtHZW9tZXRyeUluc3RhbmNlRmxhZ3NOVihWa0dlb21ldHJ5SW5zdGFuY2VGbGFnc05WIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlYoc3RhdGljX2Nhc3Q8VmtHZW9tZXRyeUluc3RhbmNlRmxhZ0JpdHNOVj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0dlb21ldHJ5SW5zdGFuY2VGbGFnQml0c05WKHN0YXRpY19jYXN0PFZrR2VvbWV0cnlJbnN0YW5jZUZsYWdCaXRzTlY+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlYoVmtCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUZsYWdCaXRzTlYpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfQ09NUEFDVElPTl9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfQ09NUEFDVElPTl9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfVVBEQVRFX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9BTExPV19VUERBVEVfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0xPV19NRU1PUllfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0xPV19NRU1PUllfQklUX05WIjsKKyAgICAgICAgY2FzZSBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1BSRUZFUl9GQVNUX0JVSUxEX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9CVUlMRF9CSVRfTlYiOworICAgICAgICBjYXNlIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUFJFRkVSX0ZBU1RfVFJBQ0VfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1BSRUZFUl9GQVNUX1RSQUNFX0JJVF9OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOViI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHN0cmluZ19Wa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOVihWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ3NOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZShpbnB1dF92YWx1ZSkgeworICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7CisgICAgICAgICAgICBpZiggIXJldC5lbXB0eSgpKSByZXQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICByZXQuYXBwZW5kKHN0cmluZ19Wa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVihzdGF0aWNfY2FzdDxWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVj4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVihzdGF0aWNfY2FzdDxWa0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlRmxhZ0JpdHNOVj4oMCkpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYoVmtDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTW9kZU5WIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOVilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQ09QWV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01PREVfQ0xPTkVfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NMT05FX05WIjsKKyAgICAgICAgY2FzZSBWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DT01QQUNUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DT01QQUNUX05WIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOVihWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOViBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOVilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfQlVJTERfU0NSQVRDSF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfQlVJTERfU0NSQVRDSF9OViI7CisgICAgICAgIGNhc2UgVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9PQkpFQ1RfTlYiOworICAgICAgICBjYXNlIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX1VQREFURV9TQ1JBVENIX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9VUERBVEVfU0NSQVRDSF9OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c1R5cGVOViI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1F1ZXVlR2xvYmFsUHJpb3JpdHlFWFQoVmtRdWV1ZUdsb2JhbFByaW9yaXR5RVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUXVldWVHbG9iYWxQcmlvcml0eUVYVClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0hJR0hfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfSElHSF9FWFQiOworICAgICAgICBjYXNlIFZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9MT1dfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfTE9XX0VYVCI7CisgICAgICAgIGNhc2UgVktfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX01FRElVTV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1FVRVVFX0dMT0JBTF9QUklPUklUWV9NRURJVU1fRVhUIjsKKyAgICAgICAgY2FzZSBWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfUkVBTFRJTUVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVVRV9HTE9CQUxfUFJJT1JJVFlfUkVBTFRJTUVfRVhUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUXVldWVHbG9iYWxQcmlvcml0eUVYVCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1RpbWVEb21haW5FWFQoVmtUaW1lRG9tYWluRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrVGltZURvbWFpbkVYVClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfVElNRV9ET01BSU5fQ0xPQ0tfTU9OT1RPTklDX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfVElNRV9ET01BSU5fQ0xPQ0tfTU9OT1RPTklDX0VYVCI7CisgICAgICAgIGNhc2UgVktfVElNRV9ET01BSU5fQ0xPQ0tfTU9OT1RPTklDX1JBV19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1RJTUVfRE9NQUlOX0NMT0NLX01PTk9UT05JQ19SQVdfRVhUIjsKKyAgICAgICAgY2FzZSBWS19USU1FX0RPTUFJTl9ERVZJQ0VfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19USU1FX0RPTUFJTl9ERVZJQ0VfRVhUIjsKKyAgICAgICAgY2FzZSBWS19USU1FX0RPTUFJTl9RVUVSWV9QRVJGT1JNQU5DRV9DT1VOVEVSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfVElNRV9ET01BSU5fUVVFUllfUEVSRk9STUFOQ0VfQ09VTlRFUl9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtUaW1lRG9tYWluRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrTWVtb3J5T3ZlcmFsbG9jYXRpb25CZWhhdmlvckFNRChWa01lbW9yeU92ZXJhbGxvY2F0aW9uQmVoYXZpb3JBTUQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19NRU1PUllfT1ZFUkFMTE9DQVRJT05fQkVIQVZJT1JfQUxMT1dFRF9BTUQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX01FTU9SWV9PVkVSQUxMT0NBVElPTl9CRUhBVklPUl9BTExPV0VEX0FNRCI7CisgICAgICAgIGNhc2UgVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RFRkFVTFRfQU1EOgorICAgICAgICAgICAgcmV0dXJuICJWS19NRU1PUllfT1ZFUkFMTE9DQVRJT05fQkVIQVZJT1JfREVGQVVMVF9BTUQiOworICAgICAgICBjYXNlIFZLX01FTU9SWV9PVkVSQUxMT0NBVElPTl9CRUhBVklPUl9ESVNBTExPV0VEX0FNRDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0JFSEFWSU9SX0RJU0FMTE9XRURfQU1EIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrTWVtb3J5T3ZlcmFsbG9jYXRpb25CZWhhdmlvckFNRCI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdCaXRzRVhUKFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVClpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQVBQTElDQVRJT05fUElQRUxJTkVfQ0FDSEVfSElUX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0FQUExJQ0FUSU9OX1BJUEVMSU5FX0NBQ0hFX0hJVF9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19CQVNFX1BJUEVMSU5FX0FDQ0VMRVJBVElPTl9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19CQVNFX1BJUEVMSU5FX0FDQ0VMRVJBVElPTl9CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19WQUxJRF9CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19WQUxJRF9CSVRfRVhUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnc0VYVChWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdzRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlKGlucHV0X3ZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dF92YWx1ZSAmIDEpIHsKKyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nX1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQoc3RhdGljX2Nhc3Q8VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tGbGFnQml0c0VYVD4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0ZsYWdCaXRzRVhUKHN0YXRpY19jYXN0PFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRmxhZ0JpdHNFWFQ+KDApKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUwoVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUwgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25UeXBlSU5URUwpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fVFlQRV9DT01NQU5EX1FVRVVFX01FVFJJQ1NfRElTQ09WRVJZX0FDVElWQVRFRF9JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVSRk9STUFOQ0VfQ09ORklHVVJBVElPTl9UWVBFX0NPTU1BTkRfUVVFVUVfTUVUUklDU19ESVNDT1ZFUllfQUNUSVZBVEVEX0lOVEVMIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uVHlwZUlOVEVMIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUXVlcnlQb29sU2FtcGxpbmdNb2RlSU5URUwoVmtRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1F1ZXJ5UG9vbFNhbXBsaW5nTW9kZUlOVEVMKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19RVUVSWV9QT09MX1NBTVBMSU5HX01PREVfTUFOVUFMX0lOVEVMOgorICAgICAgICAgICAgcmV0dXJuICJWS19RVUVSWV9QT09MX1NBTVBMSU5HX01PREVfTUFOVUFMX0lOVEVMIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrUXVlcnlQb29sU2FtcGxpbmdNb2RlSU5URUwiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMKFZrUGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1BlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUwpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX09WRVJSSURFX1RZUEVfRkxVU0hfR1BVX0NBQ0hFU19JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVSRk9STUFOQ0VfT1ZFUlJJREVfVFlQRV9GTFVTSF9HUFVfQ0FDSEVTX0lOVEVMIjsKKyAgICAgICAgY2FzZSBWS19QRVJGT1JNQU5DRV9PVkVSUklERV9UWVBFX05VTExfSEFSRFdBUkVfSU5URUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX09WRVJSSURFX1RZUEVfTlVMTF9IQVJEV0FSRV9JTlRFTCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUwiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtQZXJmb3JtYW5jZVBhcmFtZXRlclR5cGVJTlRFTChWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrUGVyZm9ybWFuY2VQYXJhbWV0ZXJUeXBlSU5URUwpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX0hXX0NPVU5URVJTX1NVUFBPUlRFRF9JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVSRk9STUFOQ0VfUEFSQU1FVEVSX1RZUEVfSFdfQ09VTlRFUlNfU1VQUE9SVEVEX0lOVEVMIjsKKyAgICAgICAgY2FzZSBWS19QRVJGT1JNQU5DRV9QQVJBTUVURVJfVFlQRV9TVFJFQU1fTUFSS0VSX1ZBTElEX0JJVFNfSU5URUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX1BBUkFNRVRFUl9UWVBFX1NUUkVBTV9NQVJLRVJfVkFMSURfQklUU19JTlRFTCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrUGVyZm9ybWFuY2VWYWx1ZVR5cGVJTlRFTChWa1BlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUwgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtQZXJmb3JtYW5jZVZhbHVlVHlwZUlOVEVMKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX0JPT0xfSU5URUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfQk9PTF9JTlRFTCI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9GTE9BVF9JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9GTE9BVF9JTlRFTCI7CisgICAgICAgIGNhc2UgVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9TVFJJTkdfSU5URUw6CisgICAgICAgICAgICByZXR1cm4gIlZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfU1RSSU5HX0lOVEVMIjsKKyAgICAgICAgY2FzZSBWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX1VJTlQzMl9JTlRFTDoKKyAgICAgICAgICAgIHJldHVybiAiVktfUEVSRk9STUFOQ0VfVkFMVUVfVFlQRV9VSU5UMzJfSU5URUwiOworICAgICAgICBjYXNlIFZLX1BFUkZPUk1BTkNFX1ZBTFVFX1RZUEVfVUlOVDY0X0lOVEVMOgorICAgICAgICAgICAgcmV0dXJuICJWS19QRVJGT1JNQU5DRV9WQUxVRV9UWVBFX1VJTlQ2NF9JTlRFTCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1BlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUwiOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfVmtUb29sUHVycG9zZUZsYWdCaXRzRVhUKFZrVG9vbFB1cnBvc2VGbGFnQml0c0VYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1Rvb2xQdXJwb3NlRmxhZ0JpdHNFWFQpaW5wdXRfdmFsdWUpCisgICAgeworICAgICAgICBjYXNlIFZLX1RPT0xfUFVSUE9TRV9BRERJVElPTkFMX0ZFQVRVUkVTX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1RPT0xfUFVSUE9TRV9BRERJVElPTkFMX0ZFQVRVUkVTX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX1RPT0xfUFVSUE9TRV9ERUJVR19NQVJLRVJTX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1RPT0xfUFVSUE9TRV9ERUJVR19NQVJLRVJTX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX1RPT0xfUFVSUE9TRV9ERUJVR19SRVBPUlRJTkdfQklUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfVE9PTF9QVVJQT1NFX0RFQlVHX1JFUE9SVElOR19CSVRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19UT09MX1BVUlBPU0VfTU9ESUZZSU5HX0ZFQVRVUkVTX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1RPT0xfUFVSUE9TRV9NT0RJRllJTkdfRkVBVFVSRVNfQklUX0VYVCI7CisgICAgICAgIGNhc2UgVktfVE9PTF9QVVJQT1NFX1BST0ZJTElOR19CSVRfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19UT09MX1BVUlBPU0VfUFJPRklMSU5HX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX1RPT0xfUFVSUE9TRV9UUkFDSU5HX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1RPT0xfUFVSUE9TRV9UUkFDSU5HX0JJVF9FWFQiOworICAgICAgICBjYXNlIFZLX1RPT0xfUFVSUE9TRV9WQUxJREFUSU9OX0JJVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1RPT0xfUFVSUE9TRV9WQUxJREFUSU9OX0JJVF9FWFQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtUb29sUHVycG9zZUZsYWdCaXRzRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5nX1ZrVG9vbFB1cnBvc2VGbGFnc0VYVChWa1Rvb2xQdXJwb3NlRmxhZ3NFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHsKKyAgICAgICAgaWYgKGlucHV0X3ZhbHVlICYgMSkgeworICAgICAgICAgICAgaWYoICFyZXQuZW1wdHkoKSkgcmV0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfVmtUb29sUHVycG9zZUZsYWdCaXRzRVhUKHN0YXRpY19jYXN0PFZrVG9vbFB1cnBvc2VGbGFnQml0c0VYVD4oMSA8PCBpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICArK2luZGV4OworICAgICAgICBpbnB1dF92YWx1ZSA+Pj0gMTsKKyAgICB9CisgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ19Wa1Rvb2xQdXJwb3NlRmxhZ0JpdHNFWFQoc3RhdGljX2Nhc3Q8VmtUb29sUHVycG9zZUZsYWdCaXRzRVhUPigwKSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQoVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCBpbnB1dF92YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKChWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0JFU1RfUFJBQ1RJQ0VTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9CRVNUX1BSQUNUSUNFU19FWFQiOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhUIjsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9SRVNFUlZFX0JJTkRJTkdfU0xPVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX1JFU0VSVkVfQklORElOR19TTE9UX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUKFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BTExfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BTExfRVhUIjsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BUElfUEFSQU1FVEVSU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FQSV9QQVJBTUVURVJTX0VYVCI7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQ09SRV9DSEVDS1NfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9DT1JFX0NIRUNLU19FWFQiOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX09CSkVDVF9MSUZFVElNRVNfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9PQkpFQ1RfTElGRVRJTUVTX0VYVCI7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfU0hBREVSU19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1NIQURFUlNfRVhUIjsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9USFJFQURfU0FGRVRZX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVEhSRUFEX1NBRkVUWV9FWFQiOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1VOSVFVRV9IQU5ETEVTX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVU5JUVVFX0hBTkRMRVNfRVhUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrQ29tcG9uZW50VHlwZU5WKFZrQ29tcG9uZW50VHlwZU5WIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrQ29tcG9uZW50VHlwZU5WKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19DT01QT05FTlRfVFlQRV9GTE9BVDE2X05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT05FTlRfVFlQRV9GTE9BVDE2X05WIjsKKyAgICAgICAgY2FzZSBWS19DT01QT05FTlRfVFlQRV9GTE9BVDMyX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT05FTlRfVFlQRV9GTE9BVDMyX05WIjsKKyAgICAgICAgY2FzZSBWS19DT01QT05FTlRfVFlQRV9GTE9BVDY0X05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT05FTlRfVFlQRV9GTE9BVDY0X05WIjsKKyAgICAgICAgY2FzZSBWS19DT01QT05FTlRfVFlQRV9TSU5UMTZfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBPTkVOVF9UWVBFX1NJTlQxNl9OViI7CisgICAgICAgIGNhc2UgVktfQ09NUE9ORU5UX1RZUEVfU0lOVDMyX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT05FTlRfVFlQRV9TSU5UMzJfTlYiOworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9UWVBFX1NJTlQ2NF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NUE9ORU5UX1RZUEVfU0lOVDY0X05WIjsKKyAgICAgICAgY2FzZSBWS19DT01QT05FTlRfVFlQRV9TSU5UOF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NUE9ORU5UX1RZUEVfU0lOVDhfTlYiOworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9UWVBFX1VJTlQxNl9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09NUE9ORU5UX1RZUEVfVUlOVDE2X05WIjsKKyAgICAgICAgY2FzZSBWS19DT01QT05FTlRfVFlQRV9VSU5UMzJfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPTVBPTkVOVF9UWVBFX1VJTlQzMl9OViI7CisgICAgICAgIGNhc2UgVktfQ09NUE9ORU5UX1RZUEVfVUlOVDY0X05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT05FTlRfVFlQRV9VSU5UNjRfTlYiOworICAgICAgICBjYXNlIFZLX0NPTVBPTkVOVF9UWVBFX1VJTlQ4X05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19DT01QT05FTlRfVFlQRV9VSU5UOF9OViI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0NvbXBvbmVudFR5cGVOViI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa1Njb3BlTlYoVmtTY29wZU5WIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrU2NvcGVOVilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfU0NPUEVfREVWSUNFX05WOgorICAgICAgICAgICAgcmV0dXJuICJWS19TQ09QRV9ERVZJQ0VfTlYiOworICAgICAgICBjYXNlIFZLX1NDT1BFX1FVRVVFX0ZBTUlMWV9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0NPUEVfUVVFVUVfRkFNSUxZX05WIjsKKyAgICAgICAgY2FzZSBWS19TQ09QRV9TVUJHUk9VUF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0NPUEVfU1VCR1JPVVBfTlYiOworICAgICAgICBjYXNlIFZLX1NDT1BFX1dPUktHUk9VUF9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfU0NPUEVfV09SS0dST1VQX05WIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrU2NvcGVOViI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHN0cmluZ19Wa0NvdmVyYWdlUmVkdWN0aW9uTW9kZU5WKFZrQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlYgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOVilpbnB1dF92YWx1ZSkKKyAgICB7CisgICAgICAgIGNhc2UgVktfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfTUVSR0VfTlY6CisgICAgICAgICAgICByZXR1cm4gIlZLX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX01FUkdFX05WIjsKKyAgICAgICAgY2FzZSBWS19DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9UUlVOQ0FURV9OVjoKKyAgICAgICAgICAgIHJldHVybiAiVktfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfVFJVTkNBVEVfTlYiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmhhbmRsZWQgVmtDb3ZlcmFnZVJlZHVjdGlvbk1vZGVOViI7CisgICAgfQorfQorCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVChWa0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQgaW5wdXRfdmFsdWUpCit7CisgICAgc3dpdGNoICgoVmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQUxMT1dFRF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BTExPV0VEX0VYVCI7CisgICAgICAgIGNhc2UgVktfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0FQUExJQ0FUSU9OX0NPTlRST0xMRURfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQVBQTElDQVRJT05fQ09OVFJPTExFRF9FWFQiOworICAgICAgICBjYXNlIFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9ERUZBVUxUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX0RFRkFVTFRfRVhUIjsKKyAgICAgICAgY2FzZSBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRElTQUxMT1dFRF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9ESVNBTExPV0VEX0VYVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVuaGFuZGxlZCBWa0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQiOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nX1ZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUKFZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIGlucHV0X3ZhbHVlKQoreworICAgIHN3aXRjaCAoKFZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUKWlucHV0X3ZhbHVlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CUkVTRU5IQU1fRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CUkVTRU5IQU1fRVhUIjsKKyAgICAgICAgY2FzZSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfREVGQVVMVF9FWFQiOworICAgICAgICBjYXNlIFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfRVhUIjsKKyAgICAgICAgY2FzZSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9TTU9PVEhfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9TTU9PVEhfRVhUIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkIFZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqIEdldFBoeXNEZXZGZWF0dXJlU3RyaW5nKHVpbnQzMl90IGluZGV4KSB7CisgICAgY29uc3QgY2hhciAqIEluZGV4VG9QaHlzRGV2RmVhdHVyZVN0cmluZ1tdID0geworICAgICAgICAicm9idXN0QnVmZmVyQWNjZXNzIiwKKyAgICAgICAgImZ1bGxEcmF3SW5kZXhVaW50MzIiLAorICAgICAgICAiaW1hZ2VDdWJlQXJyYXkiLAorICAgICAgICAiaW5kZXBlbmRlbnRCbGVuZCIsCisgICAgICAgICJnZW9tZXRyeVNoYWRlciIsCisgICAgICAgICJ0ZXNzZWxsYXRpb25TaGFkZXIiLAorICAgICAgICAic2FtcGxlUmF0ZVNoYWRpbmciLAorICAgICAgICAiZHVhbFNyY0JsZW5kIiwKKyAgICAgICAgImxvZ2ljT3AiLAorICAgICAgICAibXVsdGlEcmF3SW5kaXJlY3QiLAorICAgICAgICAiZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSIsCisgICAgICAgICJkZXB0aENsYW1wIiwKKyAgICAgICAgImRlcHRoQmlhc0NsYW1wIiwKKyAgICAgICAgImZpbGxNb2RlTm9uU29saWQiLAorICAgICAgICAiZGVwdGhCb3VuZHMiLAorICAgICAgICAid2lkZUxpbmVzIiwKKyAgICAgICAgImxhcmdlUG9pbnRzIiwKKyAgICAgICAgImFscGhhVG9PbmUiLAorICAgICAgICAibXVsdGlWaWV3cG9ydCIsCisgICAgICAgICJzYW1wbGVyQW5pc290cm9weSIsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25FVEMyIiwKKyAgICAgICAgInRleHR1cmVDb21wcmVzc2lvbkFTVENfTERSIiwKKyAgICAgICAgInRleHR1cmVDb21wcmVzc2lvbkJDIiwKKyAgICAgICAgIm9jY2x1c2lvblF1ZXJ5UHJlY2lzZSIsCisgICAgICAgICJwaXBlbGluZVN0YXRpc3RpY3NRdWVyeSIsCisgICAgICAgICJ2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3MiLAorICAgICAgICAiZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzIiwKKyAgICAgICAgInNoYWRlclRlc3NlbGxhdGlvbkFuZEdlb21ldHJ5UG9pbnRTaXplIiwKKyAgICAgICAgInNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQiLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIiwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlIiwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0IiwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdCIsCisgICAgICAgICJzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciLAorICAgICAgICAic2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciLAorICAgICAgICAic2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIiwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nIiwKKyAgICAgICAgInNoYWRlckNsaXBEaXN0YW5jZSIsCisgICAgICAgICJzaGFkZXJDdWxsRGlzdGFuY2UiLAorICAgICAgICAic2hhZGVyRmxvYXQ2NCIsCisgICAgICAgICJzaGFkZXJJbnQ2NCIsCisgICAgICAgICJzaGFkZXJJbnQxNiIsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSIsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZU1pbkxvZCIsCisgICAgICAgICJzcGFyc2VCaW5kaW5nIiwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUJ1ZmZlciIsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lJbWFnZTJEIiwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUltYWdlM0QiLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MlNhbXBsZXMiLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMiLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzIiwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUFsaWFzZWQiLAorICAgICAgICAidmFyaWFibGVNdWx0aXNhbXBsZVJhdGUiLAorICAgICAgICAiaW5oZXJpdGVkUXVlcmllcyIsCisgICAgfTsKKworICAgIHJldHVybiBJbmRleFRvUGh5c0RldkZlYXR1cmVTdHJpbmdbaW5kZXhdOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC92a19leHRlbnNpb25faGVscGVyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX2V4dGVuc2lvbl9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzI4NjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC92a19leHRlbnNpb25faGVscGVyLmgKQEAgLTAsMCArMSwxMDI3IEBACisvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKgorLy8gU2VlIGhlbHBlcl9maWxlX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leWdvQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZvcmJlc0Bnb29nbGUuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZjxqenVsYXVmQGx1bmFyZy5jb20+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBWS19FWFRFTlNJT05fSEVMUEVSX0hfCisjZGVmaW5lIFZLX0VYVEVOU0lPTl9IRUxQRVJfSF8KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCisjZGVmaW5lIFZLX1ZFUlNJT05fMV8xX05BTUUgIlZLX1ZFUlNJT05fMV8xIgorCitlbnVtIEV4dEVuYWJsZWQgOiB1bnNpZ25lZCBjaGFyIHsKKyAgICBrTm90RW5hYmxlZCwKKyAgICBrRW5hYmxlZEJ5Q3JlYXRlaW5mbywKKyAgICBrRW5hYmxlZEJ5QXBpTGV2ZWwsCit9OworCitzdGF0aWMgYm9vbCBJc0V4dEVuYWJsZWQoRXh0RW5hYmxlZCBmZWF0dXJlKSB7CisgICAgaWYgKGZlYXR1cmUgPT0ga05vdEVuYWJsZWQpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK307CisKK3N0cnVjdCBJbnN0YW5jZUV4dGVuc2lvbnMgeworICAgIEV4dEVuYWJsZWQgdmtfZmVhdHVyZV92ZXJzaW9uXzFfMXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfYWNxdWlyZV94bGliX2Rpc3BsYXl7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X2RlYnVnX3JlcG9ydHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfZGVidWdfdXRpbHN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X2RpcmVjdF9tb2RlX2Rpc3BsYXl7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9oZWFkbGVzc19zdXJmYWNle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9tZXRhbF9zdXJmYWNle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9zd2FwY2hhaW5fY29sb3Jfc3BhY2V7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3ZhbGlkYXRpb25fZmVhdHVyZXN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3ZhbGlkYXRpb25fZmxhZ3N7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZnVjaHNpYV9pbWFnZXBpcGVfc3VyZmFjZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19nZ3Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfYW5kcm9pZF9zdXJmYWNle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9kZXZpY2VfZ3JvdXBfY3JlYXRpb257a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2Rpc3BsYXl7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2V4dGVybmFsX2ZlbmNlX2NhcGFiaWxpdGllc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZ2V0X2Rpc3BsYXlfcHJvcGVydGllc18ye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzXzJ7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3N1cmZhY2V7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3N1cmZhY2VfcHJvdGVjdGVkX2NhcGFiaWxpdGllc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfd2F5bGFuZF9zdXJmYWNle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl93aW4zMl9zdXJmYWNle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl94Y2Jfc3VyZmFjZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfeGxpYl9zdXJmYWNle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX212a19pb3Nfc3VyZmFjZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19tdmtfbWFjb3Nfc3VyZmFjZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19ubl92aV9zdXJmYWNle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX252X2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXN7a05vdEVuYWJsZWR9OworCisgICAgc3RydWN0IEluc3RhbmNlUmVxIHsKKyAgICAgICAgY29uc3QgRXh0RW5hYmxlZCBJbnN0YW5jZUV4dGVuc2lvbnM6OiogZW5hYmxlZDsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8SW5zdGFuY2VSZXE+IEluc3RhbmNlUmVxVmVjOworICAgIHN0cnVjdCBJbnN0YW5jZUluZm8geworICAgICAgIEluc3RhbmNlSW5mbyhFeHRFbmFibGVkIEluc3RhbmNlRXh0ZW5zaW9uczo6KiBzdGF0ZV8sIGNvbnN0IEluc3RhbmNlUmVxVmVjIHJlcXVpcmVzXyk6IHN0YXRlKHN0YXRlXyksIHJlcXVpcmVzKHJlcXVpcmVzXykge30KKyAgICAgICBFeHRFbmFibGVkIEluc3RhbmNlRXh0ZW5zaW9uczo6KiBzdGF0ZTsKKyAgICAgICBJbnN0YW5jZVJlcVZlYyByZXF1aXJlczsKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsSW5zdGFuY2VJbmZvPiBJbnN0YW5jZUluZm9NYXA7CisgICAgc3RhdGljIGNvbnN0IEluc3RhbmNlSW5mbyAmZ2V0X2luZm8oY29uc3QgY2hhciAqbmFtZSkgeworICAgICAgICBzdGF0aWMgY29uc3QgSW5zdGFuY2VJbmZvTWFwIGluZm9fbWFwID0geworICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoIlZLX1ZFUlNJT05fMV8xIiwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2ZlYXR1cmVfdmVyc2lvbl8xXzEsIHt9KSksCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX0FDUVVJUkVfWExJQl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfZXh0X2FjcXVpcmVfeGxpYl9kaXNwbGF5LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2V4dF9kaXJlY3RfbW9kZV9kaXNwbGF5LCBWS19FWFRfRElSRUNUX01PREVfRElTUExBWV9FWFRFTlNJT05fTkFNRX19fSkpLAorI2VuZGlmCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfZXh0X2RlYnVnX3JlcG9ydCwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2V4dF9kZWJ1Z191dGlscywge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9ESVJFQ1RfTU9ERV9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfZXh0X2RpcmVjdF9tb2RlX2Rpc3BsYXksIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX2Rpc3BsYXksIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfRElTUExBWV9TVVJGQUNFX0NPVU5URVJfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19leHRfZGlzcGxheV9zdXJmYWNlX2NvdW50ZXIsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX2Rpc3BsYXksIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfSEVBRExFU1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2V4dF9oZWFkbGVzc19zdXJmYWNlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9zdXJmYWNlLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRX19fSkpLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9NRVRBTF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfZXh0X21ldGFsX3N1cmZhY2UsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2UsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9TV0FQQ0hBSU5fQ09MT1JfU1BBQ0VfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19leHRfc3dhcGNoYWluX2NvbG9yX3NwYWNlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9zdXJmYWNlLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19leHRfdmFsaWRhdGlvbl9mZWF0dXJlcywge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9WQUxJREFUSU9OX0ZMQUdTX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfZXh0X3ZhbGlkYXRpb25fZmxhZ3MsIHt9KSksCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0ZVQ0hTSUFfSU1BR0VQSVBFX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19mdWNoc2lhX2ltYWdlcGlwZV9zdXJmYWNlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9zdXJmYWNlLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRX19fSkpLAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfR0dQX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19nZ3Bfc3RyZWFtX2Rlc2NyaXB0b3Jfc3VyZmFjZSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfc3VyZmFjZSwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUV9fX0pKSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX0FORFJPSURfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9hbmRyb2lkX3N1cmZhY2UsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2UsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9ERVZJQ0VfR1JPVVBfQ1JFQVRJT05fRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfZGlzcGxheSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfc3VyZmFjZSwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRVhURVJOQUxfTUVNT1JZX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfR0VUX0RJU1BMQVlfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9kaXNwbGF5X3Byb3BlcnRpZXNfMiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfZGlzcGxheSwgVktfS0hSX0RJU1BMQVlfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXNfMiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfc3VyZmFjZSwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2UsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2VfcHJvdGVjdGVkX2NhcGFiaWxpdGllcywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzXzIsIFZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFRFTlNJT05fTkFNRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfZmVhdHVyZV92ZXJzaW9uXzFfMSwgVktfVkVSU0lPTl8xXzFfTkFNRX19fSkpLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1dBWUxBTkRfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl93YXlsYW5kX3N1cmZhY2UsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2UsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl93aW4zMl9zdXJmYWNlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9zdXJmYWNlLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRX19fSkpLAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl94Y2Jfc3VyZmFjZSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfc3VyZmFjZSwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUV9fX0pKSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1hMSUJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl94bGliX3N1cmZhY2UsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2UsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfTVZLX0lPU19TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLCBJbnN0YW5jZUluZm8oJkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfbXZrX2lvc19zdXJmYWNlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX2tocl9zdXJmYWNlLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRX19fSkpLAorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfTVZLX01BQ09TX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19tdmtfbWFjb3Nfc3VyZmFjZSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19raHJfc3VyZmFjZSwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUV9fX0pKSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfTk5fVklfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwgSW5zdGFuY2VJbmZvKCZJbnN0YW5jZUV4dGVuc2lvbnM6OnZrX25uX3ZpX3N1cmZhY2UsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jkluc3RhbmNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2UsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUsIEluc3RhbmNlSW5mbygmSW5zdGFuY2VFeHRlbnNpb25zOjp2a19udl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzLCB7fSkpLAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBJbnN0YW5jZUluZm8gZW1wdHlfaW5mbyB7bnVsbHB0ciwgSW5zdGFuY2VSZXFWZWMoKX07CisgICAgICAgIEluc3RhbmNlSW5mb01hcDo6Y29uc3RfaXRlcmF0b3IgaW5mbyA9IGluZm9fbWFwLmZpbmQobmFtZSk7CisgICAgICAgIGlmICggaW5mbyAhPSBpbmZvX21hcC5jZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmZvLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVtcHR5X2luZm87CisgICAgfQorCisgICAgdWludDMyX3QgTm9ybWFsaXplQXBpVmVyc2lvbih1aW50MzJfdCBzcGVjaWZpZWRfdmVyc2lvbikgeworICAgICAgICB1aW50MzJfdCBhcGlfdmVyc2lvbiA9IChzcGVjaWZpZWRfdmVyc2lvbiA8IFZLX0FQSV9WRVJTSU9OXzFfMSkgPyBWS19BUElfVkVSU0lPTl8xXzAgOiBWS19BUElfVkVSU0lPTl8xXzE7CisgICAgICAgIHJldHVybiBhcGlfdmVyc2lvbjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBJbml0RnJvbUluc3RhbmNlQ3JlYXRlSW5mbyh1aW50MzJfdCByZXF1ZXN0ZWRfYXBpX3ZlcnNpb24sIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbykgeworCisgICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IFZfMV8xX3Byb21vdGVkX2luc3RhbmNlX2FwaXMgPSB7CisgICAgICAgICAgICBWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUsCisgICAgICAgIH07CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdHJ1Y3QgZGF0YSwgcm9idXN0IHRvIGludmFsaWQgcENyZWF0ZUluZm8KKyAgICAgICAgdWludDMyX3QgYXBpX3ZlcnNpb24gPSBOb3JtYWxpemVBcGlWZXJzaW9uKHJlcXVlc3RlZF9hcGlfdmVyc2lvbik7CisgICAgICAgIGlmIChhcGlfdmVyc2lvbiA+PSBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgICAgIGF1dG8gaW5mbyA9IGdldF9pbmZvKCJWS19WRVJTSU9OXzFfMSIpOworICAgICAgICAgICAgaWYgKGluZm8uc3RhdGUpIHRoaXMtPiooaW5mby5zdGF0ZSkgPSBrRW5hYmxlZEJ5Q3JlYXRlaW5mbzsKKyAgICAgICAgICAgIGZvciAoYXV0byBwcm9tb3RlZF9leHQgOiBWXzFfMV9wcm9tb3RlZF9pbnN0YW5jZV9hcGlzKSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IGdldF9pbmZvKHByb21vdGVkX2V4dCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGluZm8uc3RhdGUpOworICAgICAgICAgICAgICAgIGlmIChpbmZvLnN0YXRlKSB0aGlzLT4qKGluZm8uc3RhdGUpID0ga0VuYWJsZWRCeUFwaUxldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENyZWF0ZUluZm8gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHByb21vdGVkCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSkgY29udGludWU7CisgICAgICAgICAgICAgICAgYXV0byBpbmZvID0gZ2V0X2luZm8ocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby5zdGF0ZSkgdGhpcy0+KihpbmZvLnN0YXRlKSA9IGtFbmFibGVkQnlDcmVhdGVpbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhcGlfdmVyc2lvbjsKKyAgICB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtJbnN0YW5jZUV4dGVuc2lvbk5hbWVzID0geworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX1hSQU5EUl9FWFQKKyAgICBWS19FWFRfQUNRVUlSRV9YTElCX0RJU1BMQVlfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyAgICBWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9ERUJVR19VVElMU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfRElSRUNUX01PREVfRElTUExBWV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfRElTUExBWV9TVVJGQUNFX0NPVU5URVJfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0hFQURMRVNTX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorICAgIFZLX0VYVF9NRVRBTF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmCisgICAgVktfRVhUX1NXQVBDSEFJTl9DT0xPUl9TUEFDRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfVkFMSURBVElPTl9GRUFUVVJFU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfVkFMSURBVElPTl9GTEFHU19FWFRFTlNJT05fTkFNRSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorICAgIFZLX0ZVQ0hTSUFfSU1BR0VQSVBFX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgVktfR0dQX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBWS19LSFJfQU5EUk9JRF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmCisgICAgVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfRElTUExBWV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfRVhURVJOQUxfRkVOQ0VfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9HRVRfRElTUExBWV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9HRVRfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgVktfS0hSX1dJTjMyX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIFZLX0tIUl9YTElCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgIFZLX01WS19JT1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKyAgICBWS19NVktfTUFDT1NfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIFZLX05OX1ZJX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyAgICBWS19OVl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FLAorfTsKKworc3RydWN0IERldmljZUV4dGVuc2lvbnMgOiBwdWJsaWMgSW5zdGFuY2VFeHRlbnNpb25zIHsKKyAgICBFeHRFbmFibGVkIHZrX2ZlYXR1cmVfdmVyc2lvbl8xXzF7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfYW1kX2J1ZmZlcl9tYXJrZXJ7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfYW1kX2RldmljZV9jb2hlcmVudF9tZW1vcnl7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfYW1kX2Rpc3BsYXlfbmF0aXZlX2hkcntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19hbWRfZHJhd19pbmRpcmVjdF9jb3VudHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19hbWRfZ2NuX3NoYWRlcntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19hbWRfZ3B1X3NoYWRlcl9oYWxmX2Zsb2F0e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9ncHVfc2hhZGVyX2ludDE2e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9tZW1vcnlfb3ZlcmFsbG9jYXRpb25fYmVoYXZpb3J7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfYW1kX21peGVkX2F0dGFjaG1lbnRfc2FtcGxlc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19hbWRfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9waXBlbGluZV9jb21waWxlcl9jb250cm9se2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9yYXN0ZXJpemF0aW9uX29yZGVye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9zaGFkZXJfYmFsbG90e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9zaGFkZXJfY29yZV9wcm9wZXJ0aWVze2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9zaGFkZXJfY29yZV9wcm9wZXJ0aWVzXzJ7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfYW1kX3NoYWRlcl9leHBsaWNpdF92ZXJ0ZXhfcGFyYW1ldGVye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9zaGFkZXJfZnJhZ21lbnRfbWFza3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19hbWRfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfbG9ke2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF9zaGFkZXJfaW5mb3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19hbWRfc2hhZGVyX3RyaW5hcnlfbWlubWF4e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2FtZF90ZXh0dXJlX2dhdGhlcl9iaWFzX2xvZHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19hbmRyb2lkX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlcntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfYXN0Y19kZWNvZGVfbW9kZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2Vke2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9idWZmZXJfZGV2aWNlX2FkZHJlc3N7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X2NhbGlicmF0ZWRfdGltZXN0YW1wc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfY29uZGl0aW9uYWxfcmVuZGVyaW5ne2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9jb25zZXJ2YXRpdmVfcmFzdGVyaXphdGlvbntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfZGVidWdfbWFya2Vye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9kZXB0aF9jbGlwX2VuYWJsZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVke2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9kZXNjcmlwdG9yX2luZGV4aW5ne2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9kaXNjYXJkX3JlY3RhbmdsZXN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X2Rpc3BsYXlfY29udHJvbHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfZXh0ZXJuYWxfbWVtb3J5X2RtYV9idWZ7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X2V4dGVybmFsX21lbW9yeV9ob3N0e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9maWx0ZXJfY3ViaWN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X2ZyYWdtZW50X2RlbnNpdHlfbWFwe2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9mcmFnbWVudF9zaGFkZXJfaW50ZXJsb2Nre2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9mdWxsX3NjcmVlbl9leGNsdXNpdmV7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X2dsb2JhbF9wcmlvcml0eXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfaGRyX21ldGFkYXRhe2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9ob3N0X3F1ZXJ5X3Jlc2V0e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9pbWFnZV9kcm1fZm9ybWF0X21vZGlmaWVye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9pbmRleF90eXBlX3VpbnQ4e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9pbmxpbmVfdW5pZm9ybV9ibG9ja3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfbGluZV9yYXN0ZXJpemF0aW9ue2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9tZW1vcnlfYnVkZ2V0e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9tZW1vcnlfcHJpb3JpdHl7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3BjaV9idXNfaW5mb3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfcGlwZWxpbmVfY3JlYXRpb25fZmVlZGJhY2t7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3Bvc3RfZGVwdGhfY292ZXJhZ2V7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3F1ZXVlX2ZhbWlseV9mb3JlaWdue2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9zYW1wbGVfbG9jYXRpb25ze2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF9zYW1wbGVyX2ZpbHRlcl9taW5tYXh7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3NjYWxhcl9ibG9ja19sYXlvdXR7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3NlcGFyYXRlX3N0ZW5jaWxfdXNhZ2V7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3NoYWRlcl9kZW1vdGVfdG9faGVscGVyX2ludm9jYXRpb257a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3NoYWRlcl9zdGVuY2lsX2V4cG9ydHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfc2hhZGVyX3N1Ymdyb3VwX2JhbGxvdHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfc2hhZGVyX3N1Ymdyb3VwX3ZvdGV7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3NoYWRlcl92aWV3cG9ydF9pbmRleF9sYXllcntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfc3ViZ3JvdXBfc2l6ZV9jb250cm9se2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF90ZXhlbF9idWZmZXJfYWxpZ25tZW50e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF90ZXh0dXJlX2NvbXByZXNzaW9uX2FzdGNfaGRye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF90b29saW5nX2luZm97a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZXh0X3RyYW5zZm9ybV9mZWVkYmFja3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfdmFsaWRhdGlvbl9jYWNoZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19leHRfdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29ye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2V4dF95Y2Jjcl9pbWFnZV9hcnJheXN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZ2dwX2ZyYW1lX3Rva2Vue2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2dvb2dsZV9kZWNvcmF0ZV9zdHJpbmd7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfZ29vZ2xlX2Rpc3BsYXlfdGltaW5ne2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2dvb2dsZV9obHNsX2Z1bmN0aW9uYWxpdHkxe2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2dvb2dsZV91c2VyX3R5cGV7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfaW1nX2ZpbHRlcl9jdWJpY3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19pbWdfZm9ybWF0X3B2cnRje2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2ludGVsX3BlcmZvcm1hbmNlX3F1ZXJ5e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2ludGVsX3NoYWRlcl9pbnRlZ2VyX2Z1bmN0aW9uc18ye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl8xNmJpdF9zdG9yYWdle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl84Yml0X3N0b3JhZ2V7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2JpbmRfbWVtb3J5XzJ7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2J1ZmZlcl9kZXZpY2VfYWRkcmVzc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfY3JlYXRlX3JlbmRlcnBhc3NfMntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZGVkaWNhdGVkX2FsbG9jYXRpb257a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2RlcHRoX3N0ZW5jaWxfcmVzb2x2ZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGV7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2RldmljZV9ncm91cHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZGlzcGxheV9zd2FwY2hhaW57a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2RyYXdfaW5kaXJlY3RfY291bnR7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2RyaXZlcl9wcm9wZXJ0aWVze2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9leHRlcm5hbF9mZW5jZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZXh0ZXJuYWxfZmVuY2VfZmR7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2V4dGVybmFsX2ZlbmNlX3dpbjMye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9leHRlcm5hbF9tZW1vcnl7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2V4dGVybmFsX21lbW9yeV9mZHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9leHRlcm5hbF9zZW1hcGhvcmV7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX2V4dGVybmFsX3NlbWFwaG9yZV9mZHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50c18ye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9pbWFnZV9mb3JtYXRfbGlzdHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfaW1hZ2VsZXNzX2ZyYW1lYnVmZmVye2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9pbmNyZW1lbnRhbF9wcmVzZW50e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9tYWludGVuYW5jZTF7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX21haW50ZW5hbmNlMntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfbWFpbnRlbmFuY2Uze2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9tdWx0aXZpZXd7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3BlcmZvcm1hbmNlX3F1ZXJ5e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3B1c2hfZGVzY3JpcHRvcntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfcmVsYXhlZF9ibG9ja19sYXlvdXR7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2V7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRze2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9zaGFkZXJfYXRvbWljX2ludDY0e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9zaGFkZXJfY2xvY2t7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3NoYWRlcl9mbG9hdDE2X2ludDh7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3NoYWRlcl9mbG9hdF9jb250cm9sc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfc2hhZGVyX3N1Ymdyb3VwX2V4dGVuZGVkX3R5cGVze2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2V7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3NwaXJ2XzFfNHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfc3dhcGNoYWlue2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl9zd2FwY2hhaW5fbXV0YWJsZV9mb3JtYXR7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfa2hyX3RpbWVsaW5lX3NlbWFwaG9yZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfdW5pZm9ybV9idWZmZXJfc3RhbmRhcmRfbGF5b3V0e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX2tocl92YXJpYWJsZV9wb2ludGVyc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfdnVsa2FuX21lbW9yeV9tb2RlbHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19raHJfd2luMzJfa2V5ZWRfbXV0ZXh7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZ4X2RldmljZV9nZW5lcmF0ZWRfY29tbWFuZHN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZ4X2ltYWdlX3ZpZXdfaGFuZGxle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX252eF9tdWx0aXZpZXdfcGVyX3ZpZXdfYXR0cmlidXRlc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9jbGlwX3NwYWNlX3dfc2NhbGluZ3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9jb29wZXJhdGl2ZV9tYXRyaXh7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfY29ybmVyX3NhbXBsZWRfaW1hZ2V7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfY292ZXJhZ2VfcmVkdWN0aW9uX21vZGV7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfZGVkaWNhdGVkX2FsbG9jYXRpb257a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfZGVkaWNhdGVkX2FsbG9jYXRpb25faW1hZ2VfYWxpYXNpbmd7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfZGV2aWNlX2RpYWdub3N0aWNfY2hlY2twb2ludHN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfZXh0ZXJuYWxfbWVtb3J5e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX252X2V4dGVybmFsX21lbW9yeV93aW4zMntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9maWxsX3JlY3RhbmdsZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9mcmFnbWVudF9jb3ZlcmFnZV90b19jb2xvcntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9mcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWN7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9nZW9tZXRyeV9zaGFkZXJfcGFzc3Rocm91Z2h7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfZ2xzbF9zaGFkZXJ7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfbWVzaF9zaGFkZXJ7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfcmF5X3RyYWNpbmd7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfcmVwcmVzZW50YXRpdmVfZnJhZ21lbnRfdGVzdHtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9zYW1wbGVfbWFza19vdmVycmlkZV9jb3ZlcmFnZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9zY2lzc29yX2V4Y2x1c2l2ZXtrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9zaGFkZXJfaW1hZ2VfZm9vdHByaW50e2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX252X3NoYWRlcl9zbV9idWlsdGluc3trTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl9zaGFkZXJfc3ViZ3JvdXBfcGFydGl0aW9uZWR7a05vdEVuYWJsZWR9OworICAgIEV4dEVuYWJsZWQgdmtfbnZfc2hhZGluZ19yYXRlX2ltYWdle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX252X3ZpZXdwb3J0X2FycmF5MntrTm90RW5hYmxlZH07CisgICAgRXh0RW5hYmxlZCB2a19udl92aWV3cG9ydF9zd2l6emxle2tOb3RFbmFibGVkfTsKKyAgICBFeHRFbmFibGVkIHZrX252X3dpbjMyX2tleWVkX211dGV4e2tOb3RFbmFibGVkfTsKKworICAgIHN0cnVjdCBEZXZpY2VSZXEgeworICAgICAgICBjb25zdCBFeHRFbmFibGVkIERldmljZUV4dGVuc2lvbnM6OiogZW5hYmxlZDsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8RGV2aWNlUmVxPiBEZXZpY2VSZXFWZWM7CisgICAgc3RydWN0IERldmljZUluZm8geworICAgICAgIERldmljZUluZm8oRXh0RW5hYmxlZCBEZXZpY2VFeHRlbnNpb25zOjoqIHN0YXRlXywgY29uc3QgRGV2aWNlUmVxVmVjIHJlcXVpcmVzXyk6IHN0YXRlKHN0YXRlXyksIHJlcXVpcmVzKHJlcXVpcmVzXykge30KKyAgICAgICBFeHRFbmFibGVkIERldmljZUV4dGVuc2lvbnM6Oiogc3RhdGU7CisgICAgICAgRGV2aWNlUmVxVmVjIHJlcXVpcmVzOworICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZyxEZXZpY2VJbmZvPiBEZXZpY2VJbmZvTWFwOworICAgIHN0YXRpYyBjb25zdCBEZXZpY2VJbmZvICZnZXRfaW5mbyhjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBEZXZpY2VJbmZvTWFwIGluZm9fbWFwID0geworICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoIlZLX1ZFUlNJT05fMV8xIiwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZmVhdHVyZV92ZXJzaW9uXzFfMSwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0FNRF9CVUZGRVJfTUFSS0VSX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19hbWRfYnVmZmVyX21hcmtlciwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0FNRF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19hbWRfZGV2aWNlX2NvaGVyZW50X21lbW9yeSwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0FNRF9ESVNQTEFZX05BVElWRV9IRFJfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FtZF9kaXNwbGF5X25hdGl2ZV9oZHIsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllc18yLCBWS19LSFJfR0VUX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3dhcGNoYWluLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19BTURfRFJBV19JTkRJUkVDVF9DT1VOVF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX2RyYXdfaW5kaXJlY3RfY291bnQsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19BTURfR0NOX1NIQURFUl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX2djbl9zaGFkZXIsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19BTURfR1BVX1NIQURFUl9IQUxGX0ZMT0FUX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19hbWRfZ3B1X3NoYWRlcl9oYWxmX2Zsb2F0LCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX0dQVV9TSEFERVJfSU5UMTZfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FtZF9ncHVfc2hhZGVyX2ludDE2LCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX01FTU9SWV9PVkVSQUxMT0NBVElPTl9CRUhBVklPUl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX21lbW9yeV9vdmVyYWxsb2NhdGlvbl9iZWhhdmlvciwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0FNRF9NSVhFRF9BVFRBQ0hNRU5UX1NBTVBMRVNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FtZF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19BTURfTkVHQVRJVkVfVklFV1BPUlRfSEVJR0hUX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19hbWRfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0LCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX1BJUEVMSU5FX0NPTVBJTEVSX0NPTlRST0xfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FtZF9waXBlbGluZV9jb21waWxlcl9jb250cm9sLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX1JBU1RFUklaQVRJT05fT1JERVJfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FtZF9yYXN0ZXJpemF0aW9uX29yZGVyLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX1NIQURFUl9CQUxMT1RfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FtZF9zaGFkZXJfYmFsbG90LCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FtZF9zaGFkZXJfY29yZV9wcm9wZXJ0aWVzLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXNfMiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMsIFZLX0FNRF9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19BTURfU0hBREVSX0VYUExJQ0lUX1ZFUlRFWF9QQVJBTUVURVJfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FtZF9zaGFkZXJfZXhwbGljaXRfdmVydGV4X3BhcmFtZXRlciwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0FNRF9TSEFERVJfRlJBR01FTlRfTUFTS19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX3NoYWRlcl9mcmFnbWVudF9tYXNrLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX1NIQURFUl9JTUFHRV9MT0FEX1NUT1JFX0xPRF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2xvZCwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0FNRF9TSEFERVJfSU5GT19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX3NoYWRlcl9pbmZvLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU1EX1NIQURFUl9UUklOQVJZX01JTk1BWF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX3NoYWRlcl90cmluYXJ5X21pbm1heCwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0FNRF9URVhUVVJFX0dBVEhFUl9CSUFTX0xPRF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfYW1kX3RleHR1cmVfZ2F0aGVyX2JpYXNfbG9kLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2FuZHJvaWRfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uLCBWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX21lbW9yeSwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9xdWV1ZV9mYW1pbHlfZm9yZWlnbiwgVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9BU1RDX0RFQ09ERV9NT0RFX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfYXN0Y19kZWNvZGVfbW9kZSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9ibGVuZF9vcGVyYXRpb25fYWR2YW5jZWQsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfQlVGRkVSX0RFVklDRV9BRERSRVNTX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfYnVmZmVyX2RldmljZV9hZGRyZXNzLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX0NBTElCUkFURURfVElNRVNUQU1QU19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2NhbGlicmF0ZWRfdGltZXN0YW1wcywge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9DT05ESVRJT05BTF9SRU5ERVJJTkdfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9jb25kaXRpb25hbF9yZW5kZXJpbmcsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9jb25zZXJ2YXRpdmVfcmFzdGVyaXphdGlvbiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9ERUJVR19NQVJLRVJfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9kZWJ1Z19tYXJrZXIsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9kZWJ1Z19yZXBvcnQsIFZLX0VYVF9ERUJVR19SRVBPUlRfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9ERVBUSF9DTElQX0VOQUJMRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2RlcHRoX2NsaXBfZW5hYmxlLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX0RFUFRIX1JBTkdFX1VOUkVTVFJJQ1RFRF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9ERVNDUklQVE9SX0lOREVYSU5HX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfZGVzY3JpcHRvcl9pbmRleGluZywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfbWFpbnRlbmFuY2UzLCBWS19LSFJfTUFJTlRFTkFOQ0UzX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfRElTQ0FSRF9SRUNUQU5HTEVTX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfZGlzY2FyZF9yZWN0YW5nbGVzLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX0RJU1BMQVlfQ09OVFJPTF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2Rpc3BsYXlfY29udHJvbCwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2Rpc3BsYXlfc3VyZmFjZV9jb3VudGVyLCBWS19FWFRfRElTUExBWV9TVVJGQUNFX0NPVU5URVJfRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3dhcGNoYWluLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfRVhURVJOQUxfTUVNT1JZX0RNQV9CVUZfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9leHRlcm5hbF9tZW1vcnlfZG1hX2J1Ziwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX21lbW9yeV9mZCwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9GRF9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX0VYVEVSTkFMX01FTU9SWV9IT1NUX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9leHRlcm5hbF9tZW1vcnksIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9GSUxURVJfQ1VCSUNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9maWx0ZXJfY3ViaWMsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2ltZ19maWx0ZXJfY3ViaWMsIFZLX0lNR19GSUxURVJfQ1VCSUNfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2ZyYWdtZW50X2RlbnNpdHlfbWFwLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9mcmFnbWVudF9zaGFkZXJfaW50ZXJsb2NrLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9mdWxsX3NjcmVlbl9leGNsdXNpdmUsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2UsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllc18yLCBWS19LSFJfR0VUX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3dhcGNoYWluLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9HTE9CQUxfUFJJT1JJVFlfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9nbG9iYWxfcHJpb3JpdHksIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfSERSX01FVEFEQVRBX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfaGRyX21ldGFkYXRhLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3dhcGNoYWluLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2hvc3RfcXVlcnlfcmVzZXQsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2ltYWdlX2RybV9mb3JtYXRfbW9kaWZpZXIsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9iaW5kX21lbW9yeV8yLCBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2ltYWdlX2Zvcm1hdF9saXN0LCBWS19LSFJfSU1BR0VfRk9STUFUX0xJU1RfRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uLCBWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfSU5ERVhfVFlQRV9VSU5UOF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2luZGV4X3R5cGVfdWludDgsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9pbmxpbmVfdW5pZm9ybV9ibG9jaywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfbWFpbnRlbmFuY2UxLCBWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfTElORV9SQVNURVJJWkFUSU9OX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfbGluZV9yYXN0ZXJpemF0aW9uLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX01FTU9SWV9CVURHRVRfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9tZW1vcnlfYnVkZ2V0LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX01FTU9SWV9QUklPUklUWV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X21lbW9yeV9wcmlvcml0eSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9QQ0lfQlVTX0lORk9fRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9wY2lfYnVzX2luZm8sIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9waXBlbGluZV9jcmVhdGlvbl9mZWVkYmFjaywge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9QT1NUX0RFUFRIX0NPVkVSQUdFX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfcG9zdF9kZXB0aF9jb3ZlcmFnZSwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3F1ZXVlX2ZhbWlseV9mb3JlaWduLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfbWVtb3J5LCBWS19LSFJfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfU0FNUExFX0xPQ0FUSU9OU19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3NhbXBsZV9sb2NhdGlvbnMsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfU0FNUExFUl9GSUxURVJfTUlOTUFYX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfc2FtcGxlcl9maWx0ZXJfbWlubWF4LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX1NDQUxBUl9CTE9DS19MQVlPVVRfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9zY2FsYXJfYmxvY2tfbGF5b3V0LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX1NFUEFSQVRFX1NURU5DSUxfVVNBR0VfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9zZXBhcmF0ZV9zdGVuY2lsX3VzYWdlLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9zaGFkZXJfZGVtb3RlX3RvX2hlbHBlcl9pbnZvY2F0aW9uLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX1NIQURFUl9TVEVOQ0lMX0VYUE9SVF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3NoYWRlcl9zdGVuY2lsX2V4cG9ydCwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9TSEFERVJfU1VCR1JPVVBfQkFMTE9UX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfc2hhZGVyX3N1Ymdyb3VwX2JhbGxvdCwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9TSEFERVJfU1VCR1JPVVBfVk9URV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3NoYWRlcl9zdWJncm91cF92b3RlLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX1NIQURFUl9WSUVXUE9SVF9JTkRFWF9MQVlFUl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3NoYWRlcl92aWV3cG9ydF9pbmRleF9sYXllciwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9TVUJHUk9VUF9TSVpFX0NPTlRST0xfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9zdWJncm91cF9zaXplX2NvbnRyb2wsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2ZlYXR1cmVfdmVyc2lvbl8xXzEsIFZLX1ZFUlNJT05fMV8xX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfdGV4ZWxfYnVmZmVyX2FsaWdubWVudCwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfdGV4dHVyZV9jb21wcmVzc2lvbl9hc3RjX2hkciwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9UT09MSU5HX0lORk9fRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF90b29saW5nX2luZm8sIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19FWFRfVFJBTlNGT1JNX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfdHJhbnNmb3JtX2ZlZWRiYWNrLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX1ZBTElEQVRJT05fQ0FDSEVfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF92YWxpZGF0aW9uX2NhY2hlLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfRVhUX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3ZlcnRleF9hdHRyaWJ1dGVfZGl2aXNvciwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0VYVF9ZQ0JDUl9JTUFHRV9BUlJBWVNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF95Y2Jjcl9pbWFnZV9hcnJheXMsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24sIFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUV9fX0pKSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19HR1BfRlJBTUVfVE9LRU5fRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2dncF9mcmFtZV90b2tlbiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3N3YXBjaGFpbiwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2dncF9zdHJlYW1fZGVzY3JpcHRvcl9zdXJmYWNlLCBWS19HR1BfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRX19fSkpLAorI2VuZGlmCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19HT09HTEVfREVDT1JBVEVfU1RSSU5HX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19nb29nbGVfZGVjb3JhdGVfc3RyaW5nLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfR09PR0xFX0RJU1BMQVlfVElNSU5HX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19nb29nbGVfZGlzcGxheV90aW1pbmcsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zd2FwY2hhaW4sIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0dPT0dMRV9ITFNMX0ZVTkNUSU9OQUxJVFkxX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19nb29nbGVfaGxzbF9mdW5jdGlvbmFsaXR5MSwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0dPT0dMRV9VU0VSX1RZUEVfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2dvb2dsZV91c2VyX3R5cGUsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19JTUdfRklMVEVSX0NVQklDX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19pbWdfZmlsdGVyX2N1YmljLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfSU1HX0ZPUk1BVF9QVlJUQ19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfaW1nX2Zvcm1hdF9wdnJ0Yywge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0lOVEVMX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19pbnRlbF9wZXJmb3JtYW5jZV9xdWVyeSwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0lOVEVMX1NIQURFUl9JTlRFR0VSX0ZVTkNUSU9OU18yX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19pbnRlbF9zaGFkZXJfaW50ZWdlcl9mdW5jdGlvbnNfMiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl8xNkJJVF9TVE9SQUdFX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfMTZiaXRfc3RvcmFnZSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcywgVktfS0hSX1NUT1JBR0VfQlVGRkVSX1NUT1JBR0VfQ0xBU1NfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl84QklUX1NUT1JBR0VfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl84Yml0X3N0b3JhZ2UsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3N0b3JhZ2VfYnVmZmVyX3N0b3JhZ2VfY2xhc3MsIFZLX0tIUl9TVE9SQUdFX0JVRkZFUl9TVE9SQUdFX0NMQVNTX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2JpbmRfbWVtb3J5XzIsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfQlVGRkVSX0RFVklDRV9BRERSRVNTX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfYnVmZmVyX2RldmljZV9hZGRyZXNzLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX0NSRUFURV9SRU5ERVJQQVNTXzJfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9jcmVhdGVfcmVuZGVycGFzc18yLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfbXVsdGl2aWV3LCBWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX21haW50ZW5hbmNlMiwgVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZGVkaWNhdGVkX2FsbG9jYXRpb24sIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50c18yLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2RlcHRoX3N0ZW5jaWxfcmVzb2x2ZSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2NyZWF0ZV9yZW5kZXJwYXNzXzIsIFZLX0tIUl9DUkVBVEVfUkVOREVSUEFTU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9kZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZSwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9ERVZJQ0VfR1JPVVBfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9kZXZpY2VfZ3JvdXAsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9kZXZpY2VfZ3JvdXBfY3JlYXRpb24sIFZLX0tIUl9ERVZJQ0VfR1JPVVBfQ1JFQVRJT05fRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9ESVNQTEFZX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2Rpc3BsYXlfc3dhcGNoYWluLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3dhcGNoYWluLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2Rpc3BsYXksIFZLX0tIUl9ESVNQTEFZX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRFJBV19JTkRJUkVDVF9DT1VOVF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2RyYXdfaW5kaXJlY3RfY291bnQsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRFJJVkVSX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9kcml2ZXJfcHJvcGVydGllcywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX2ZlbmNlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzLCBWS19LSFJfRVhURVJOQUxfRkVOQ0VfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRVhURVJOQUxfRkVOQ0VfRkRfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9leHRlcm5hbF9mZW5jZV9mZCwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX2ZlbmNlLCBWS19LSFJfRVhURVJOQUxfRkVOQ0VfRVhURU5TSU9OX05BTUV9fX0pKSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRVhURVJOQUxfRkVOQ0VfV0lOMzJfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9leHRlcm5hbF9mZW5jZV93aW4zMiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX2ZlbmNlLCBWS19LSFJfRVhURVJOQUxfRkVOQ0VfRVhURU5TSU9OX05BTUV9fX0pKSwKKyNlbmRpZgorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX21lbW9yeSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMsIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRVhURVJOQUxfTUVNT1JZX0ZEX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfbWVtb3J5X2ZkLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfbWVtb3J5LCBWS19LSFJfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FfX19KSksCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX0VYVEVSTkFMX01FTU9SWV9XSU4zMl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX21lbW9yeV93aW4zMiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2V4dGVybmFsX21lbW9yeSwgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRX19fSkpLAorI2VuZGlmCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcywgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRkRfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9leHRlcm5hbF9zZW1hcGhvcmVfZmQsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9leHRlcm5hbF9zZW1hcGhvcmUsIFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRVhURU5TSU9OX05BTUV9fX0pKSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX1dJTjMyX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfc2VtYXBob3JlLCBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHNfMiwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9JTUFHRV9GT1JNQVRfTElTVF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2ltYWdlX2Zvcm1hdF9saXN0LCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2ltYWdlbGVzc19mcmFtZWJ1ZmZlciwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX21haW50ZW5hbmNlMiwgVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9pbWFnZV9mb3JtYXRfbGlzdCwgVktfS0hSX0lNQUdFX0ZPUk1BVF9MSVNUX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfSU5DUkVNRU5UQUxfUFJFU0VOVF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2luY3JlbWVudGFsX3ByZXNlbnQsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zd2FwY2hhaW4sIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9tYWludGVuYW5jZTEsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfbWFpbnRlbmFuY2UyLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX01BSU5URU5BTkNFM19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX21haW50ZW5hbmNlMywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9NVUxUSVZJRVdfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9tdWx0aXZpZXcsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9wZXJmb3JtYW5jZV9xdWVyeSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfcHVzaF9kZXNjcmlwdG9yLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1JFTEFYRURfQkxPQ0tfTEFZT1VUX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfcmVsYXhlZF9ibG9ja19sYXlvdXQsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfU0FNUExFUl9NSVJST1JfQ0xBTVBfVE9fRURHRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfbWFpbnRlbmFuY2UxLCBWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2JpbmRfbWVtb3J5XzIsIFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzXzIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHMsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2NyZWF0ZV9yZW5kZXJwYXNzXzIsIFZLX0tIUl9DUkVBVEVfUkVOREVSUEFTU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfU0hBREVSX0FUT01JQ19JTlQ2NF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3NoYWRlcl9hdG9taWNfaW50NjQsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfU0hBREVSX0NMT0NLX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2hhZGVyX2Nsb2NrLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zaGFkZXJfZHJhd19wYXJhbWV0ZXJzLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1NIQURFUl9GTE9BVDE2X0lOVDhfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zaGFkZXJfZmxvYXQxNl9pbnQ4LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1NIQURFUl9GTE9BVF9DT05UUk9MU19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3NoYWRlcl9mbG9hdF9jb250cm9scywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zaGFkZXJfc3ViZ3JvdXBfZXh0ZW5kZWRfdHlwZXMsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2ZlYXR1cmVfdmVyc2lvbl8xXzEsIFZLX1ZFUlNJT05fMV8xX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9TSEFSRURfUFJFU0VOVEFCTEVfSU1BR0VfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zaGFyZWRfcHJlc2VudGFibGVfaW1hZ2UsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zd2FwY2hhaW4sIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXNfMiwgVktfS0hSX0dFVF9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfU1BJUlZfMV80X0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3BpcnZfMV80LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2hhZGVyX2Zsb2F0X2NvbnRyb2xzLCBWS19LSFJfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZmVhdHVyZV92ZXJzaW9uXzFfMSwgVktfVkVSU0lPTl8xXzFfTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1NUT1JBR0VfQlVGRkVSX1NUT1JBR0VfQ0xBU1NfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zdG9yYWdlX2J1ZmZlcl9zdG9yYWdlX2NsYXNzLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3N3YXBjaGFpbiwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3N1cmZhY2UsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfU1dBUENIQUlOX01VVEFCTEVfRk9STUFUX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3dhcGNoYWluX211dGFibGVfZm9ybWF0LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc3dhcGNoYWluLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX21haW50ZW5hbmNlMiwgVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9pbWFnZV9mb3JtYXRfbGlzdCwgVktfS0hSX0lNQUdFX0ZPUk1BVF9MSVNUX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19LSFJfVElNRUxJTkVfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfdGltZWxpbmVfc2VtYXBob3JlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1VOSUZPUk1fQlVGRkVSX1NUQU5EQVJEX0xBWU9VVF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3VuaWZvcm1fYnVmZmVyX3N0YW5kYXJkX2xheW91dCwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9WQVJJQUJMRV9QT0lOVEVSU19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3ZhcmlhYmxlX3BvaW50ZXJzLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zdG9yYWdlX2J1ZmZlcl9zdG9yYWdlX2NsYXNzLCBWS19LSFJfU1RPUkFHRV9CVUZGRVJfU1RPUkFHRV9DTEFTU19FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfS0hSX1ZVTEtBTl9NRU1PUllfTU9ERUxfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl92dWxrYW5fbWVtb3J5X21vZGVsLCB7fSkpLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX0tIUl9XSU4zMl9LRVlFRF9NVVRFWF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3dpbjMyX2tleWVkX211dGV4LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyLCBWS19LSFJfRVhURVJOQUxfTUVNT1JZX1dJTjMyX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WWF9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udnhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcywge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WWF9JTUFHRV9WSUVXX0hBTkRMRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZ4X2ltYWdlX3ZpZXdfaGFuZGxlLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfTlZYX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udnhfbXVsdGl2aWV3X3Blcl92aWV3X2F0dHJpYnV0ZXMsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9tdWx0aXZpZXcsIFZLX0tIUl9NVUxUSVZJRVdfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX0NMSVBfU1BBQ0VfV19TQ0FMSU5HX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9jbGlwX3NwYWNlX3dfc2NhbGluZywge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlcywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX0NPT1BFUkFUSVZFX01BVFJJWF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfY29vcGVyYXRpdmVfbWF0cml4LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfTlZfQ09STkVSX1NBTVBMRURfSU1BR0VfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX252X2Nvcm5lcl9zYW1wbGVkX2ltYWdlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfTlZfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX252X2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzLCBWS19OVl9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfZGVkaWNhdGVkX2FsbG9jYXRpb24sIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfZGVkaWNhdGVkX2FsbG9jYXRpb25faW1hZ2VfYWxpYXNpbmcsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiwgVktfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9ERVZJQ0VfRElBR05PU1RJQ19DSEVDS1BPSU5UU19FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfZGV2aWNlX2RpYWdub3N0aWNfY2hlY2twb2ludHMsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX252X2V4dGVybmFsX21lbW9yeSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcywgVktfTlZfRVhURVJOQUxfTUVNT1JZX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRX19fSkpLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX0VYVEVSTkFMX01FTU9SWV9XSU4zMl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9leHRlcm5hbF9tZW1vcnksIFZLX05WX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRX19fSkpLAorI2VuZGlmCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9GSUxMX1JFQ1RBTkdMRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfZmlsbF9yZWN0YW5nbGUsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9GUkFHTUVOVF9DT1ZFUkFHRV9UT19DT0xPUl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfZnJhZ21lbnRfY292ZXJhZ2VfdG9fY29sb3IsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX252X2ZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpYywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX0ZSQU1FQlVGRkVSX01JWEVEX1NBTVBMRVNfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX252X2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXMsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9HRU9NRVRSWV9TSEFERVJfUEFTU1RIUk9VR0hfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX252X2dlb21ldHJ5X3NoYWRlcl9wYXNzdGhyb3VnaCwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX0dMU0xfU0hBREVSX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9nbHNsX3NoYWRlciwge30pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX01FU0hfU0hBREVSX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9tZXNoX3NoYWRlciwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9yYXlfdHJhY2luZywge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHNfMiwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX252X3JlcHJlc2VudGF0aXZlX2ZyYWdtZW50X3Rlc3QsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9TQU1QTEVfTUFTS19PVkVSUklERV9DT1ZFUkFHRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfc2FtcGxlX21hc2tfb3ZlcnJpZGVfY292ZXJhZ2UsIHt9KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9TQ0lTU09SX0VYQ0xVU0lWRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfc2Npc3Nvcl9leGNsdXNpdmUsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMiwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9zaGFkZXJfaW1hZ2VfZm9vdHByaW50LCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRX19fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfTlZfU0hBREVSX1NNX0JVSUxUSU5TX0VYVEVOU0lPTl9OQU1FLCBEZXZpY2VJbmZvKCZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9zaGFkZXJfc21fYnVpbHRpbnMsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX2ZlYXR1cmVfdmVyc2lvbl8xXzEsIFZLX1ZFUlNJT05fMV8xX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX1NIQURFUl9TVUJHUk9VUF9QQVJUSVRJT05FRF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfc2hhZGVyX3N1Ymdyb3VwX3BhcnRpdGlvbmVkLCB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZEZXZpY2VFeHRlbnNpb25zOjp2a19mZWF0dXJlX3ZlcnNpb25fMV8xLCBWS19WRVJTSU9OXzFfMV9OQU1FfX19KSksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9TSEFESU5HX1JBVEVfSU1BR0VfRVhURU5TSU9OX05BTUUsIERldmljZUluZm8oJkRldmljZUV4dGVuc2lvbnM6OnZrX252X3NoYWRpbmdfcmF0ZV9pbWFnZSwge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9fX0pKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFZLX05WX1ZJRVdQT1JUX0FSUkFZMl9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfdmlld3BvcnRfYXJyYXkyLCB7fSkpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoVktfTlZfVklFV1BPUlRfU1dJWlpMRV9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfdmlld3BvcnRfc3dpenpsZSwge30pKSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihWS19OVl9XSU4zMl9LRVlFRF9NVVRFWF9FWFRFTlNJT05fTkFNRSwgRGV2aWNlSW5mbygmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfd2luMzJfa2V5ZWRfbXV0ZXgsIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB7JkRldmljZUV4dGVuc2lvbnM6OnZrX252X2V4dGVybmFsX21lbW9yeV93aW4zMiwgVktfTlZfRVhURVJOQUxfTUVNT1JZX1dJTjMyX0VYVEVOU0lPTl9OQU1FfX19KSksCisjZW5kaWYKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgRGV2aWNlSW5mbyBlbXB0eV9pbmZvIHtudWxscHRyLCBEZXZpY2VSZXFWZWMoKX07CisgICAgICAgIERldmljZUluZm9NYXA6OmNvbnN0X2l0ZXJhdG9yIGluZm8gPSBpbmZvX21hcC5maW5kKG5hbWUpOworICAgICAgICBpZiAoIGluZm8gIT0gaW5mb19tYXAuY2VuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gaW5mby0+c2Vjb25kOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbXB0eV9pbmZvOworICAgIH0KKworICAgIERldmljZUV4dGVuc2lvbnMoKSA9IGRlZmF1bHQ7CisgICAgRGV2aWNlRXh0ZW5zaW9ucyhjb25zdCBJbnN0YW5jZUV4dGVuc2lvbnMmIGluc3RhbmNlX2V4dCkgOiBJbnN0YW5jZUV4dGVuc2lvbnMoaW5zdGFuY2VfZXh0KSB7fQorCisgICAgdWludDMyX3QgSW5pdEZyb21EZXZpY2VDcmVhdGVJbmZvKGNvbnN0IEluc3RhbmNlRXh0ZW5zaW9ucyAqaW5zdGFuY2VfZXh0ZW5zaW9ucywgdWludDMyX3QgcmVxdWVzdGVkX2FwaV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKSB7CisgICAgICAgIC8vIEluaXRpYWxpemU6IHRoaXMgdG8gZGVmYXVsdHMsICBiYXNlIGNsYXNzIGZpZWxkcyB0byBpbnB1dC4KKyAgICAgICAgYXNzZXJ0KGluc3RhbmNlX2V4dGVuc2lvbnMpOworICAgICAgICAqdGhpcyA9IERldmljZUV4dGVuc2lvbnMoKmluc3RhbmNlX2V4dGVuc2lvbnMpOworCisKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gVl8xXzFfcHJvbW90ZWRfZGV2aWNlX2FwaXMgPSB7CisgICAgICAgICAgICBWS19LSFJfMTZCSVRfU1RPUkFHRV9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgIFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX0RFVklDRV9HUk9VUF9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICBWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgIFZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICBWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX1JFTEFYRURfQkxPQ0tfTEFZT1VUX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgIFZLX0tIUl9TSEFERVJfRFJBV19QQVJBTUVURVJTX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgVktfS0hSX1NUT1JBR0VfQlVGRkVSX1NUT1JBR0VfQ0xBU1NfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICBWS19LSFJfVkFSSUFCTEVfUE9JTlRFUlNfRVhURU5TSU9OX05BTUUsCisgICAgICAgIH07CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdHJ1Y3QgZGF0YSwgcm9idXN0IHRvIGludmFsaWQgcENyZWF0ZUluZm8KKyAgICAgICAgdWludDMyX3QgYXBpX3ZlcnNpb24gPSBOb3JtYWxpemVBcGlWZXJzaW9uKHJlcXVlc3RlZF9hcGlfdmVyc2lvbik7CisgICAgICAgIGlmIChhcGlfdmVyc2lvbiA+PSBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgICAgIGF1dG8gaW5mbyA9IGdldF9pbmZvKCJWS19WRVJTSU9OXzFfMSIpOworICAgICAgICAgICAgaWYgKGluZm8uc3RhdGUpIHRoaXMtPiooaW5mby5zdGF0ZSkgPSBrRW5hYmxlZEJ5Q3JlYXRlaW5mbzsKKyAgICAgICAgICAgIGZvciAoYXV0byBwcm9tb3RlZF9leHQgOiBWXzFfMV9wcm9tb3RlZF9kZXZpY2VfYXBpcykgeworICAgICAgICAgICAgICAgIGluZm8gPSBnZXRfaW5mbyhwcm9tb3RlZF9leHQpOworICAgICAgICAgICAgICAgIGFzc2VydChpbmZvLnN0YXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby5zdGF0ZSkgdGhpcy0+KihpbmZvLnN0YXRlKSA9IGtFbmFibGVkQnlBcGlMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDcmVhdGVJbmZvIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwcm9tb3RlZAorICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9IGdldF9pbmZvKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8uc3RhdGUpIHRoaXMtPiooaW5mby5zdGF0ZSkgPSBrRW5hYmxlZEJ5Q3JlYXRlaW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXBpX3ZlcnNpb247CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrRGV2aWNlRXh0ZW5zaW9uTmFtZXMgPSB7CisgICAgVktfQU1EX0JVRkZFUl9NQVJLRVJfRVhURU5TSU9OX05BTUUsCisgICAgVktfQU1EX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRVhURU5TSU9OX05BTUUsCisgICAgVktfQU1EX0RJU1BMQVlfTkFUSVZFX0hEUl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19BTURfRFJBV19JTkRJUkVDVF9DT1VOVF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19BTURfR0NOX1NIQURFUl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19BTURfR1BVX1NIQURFUl9IQUxGX0ZMT0FUX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9HUFVfU0hBREVSX0lOVDE2X0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQkVIQVZJT1JfRVhURU5TSU9OX05BTUUsCisgICAgVktfQU1EX01JWEVEX0FUVEFDSE1FTlRfU0FNUExFU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19BTURfTkVHQVRJVkVfVklFV1BPUlRfSEVJR0hUX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9QSVBFTElORV9DT01QSUxFUl9DT05UUk9MX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9SQVNURVJJWkFUSU9OX09SREVSX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9TSEFERVJfQkFMTE9UX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUsCisgICAgVktfQU1EX1NIQURFUl9FWFBMSUNJVF9WRVJURVhfUEFSQU1FVEVSX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9TSEFERVJfRlJBR01FTlRfTUFTS19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19BTURfU0hBREVSX0lNQUdFX0xPQURfU1RPUkVfTE9EX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9TSEFERVJfSU5GT19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19BTURfU0hBREVSX1RSSU5BUllfTUlOTUFYX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0FNRF9URVhUVVJFX0dBVEhFUl9CSUFTX0xPRF9FWFRFTlNJT05fTkFNRSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSwKKyNlbmRpZgorICAgIFZLX0VYVF9BU1RDX0RFQ09ERV9NT0RFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfQ0FMSUJSQVRFRF9USU1FU1RBTVBTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9DT05ESVRJT05BTF9SRU5ERVJJTkdfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9ERUJVR19NQVJLRVJfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0RFUFRIX0NMSVBfRU5BQkxFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9ERVBUSF9SQU5HRV9VTlJFU1RSSUNURURfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0RFU0NSSVBUT1JfSU5ERVhJTkdfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0RJU0NBUkRfUkVDVEFOR0xFU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfRElTUExBWV9DT05UUk9MX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9FWFRFUk5BTF9NRU1PUllfRE1BX0JVRl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfRVhURVJOQUxfTUVNT1JZX0hPU1RfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0ZJTFRFUl9DVUJJQ19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfRlJBR01FTlRfREVOU0lUWV9NQVBfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRVhURU5TSU9OX05BTUUsCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFZLX0VYVF9GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyAgICBWS19FWFRfR0xPQkFMX1BSSU9SSVRZX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9IRFJfTUVUQURBVEFfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0hPU1RfUVVFUllfUkVTRVRfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0lOREVYX1RZUEVfVUlOVDhfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9MSU5FX1JBU1RFUklaQVRJT05fRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX01FTU9SWV9CVURHRVRfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX01FTU9SWV9QUklPUklUWV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfUENJX0JVU19JTkZPX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfUE9TVF9ERVBUSF9DT1ZFUkFHRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX1NBTVBMRV9MT0NBVElPTlNfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX1NBTVBMRVJfRklMVEVSX01JTk1BWF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfU0NBTEFSX0JMT0NLX0xBWU9VVF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfU0VQQVJBVEVfU1RFTkNJTF9VU0FHRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfU0hBREVSX0RFTU9URV9UT19IRUxQRVJfSU5WT0NBVElPTl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfU0hBREVSX1NURU5DSUxfRVhQT1JUX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9TSEFERVJfU1VCR1JPVVBfQkFMTE9UX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9TSEFERVJfU1VCR1JPVVBfVk9URV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfU0hBREVSX1ZJRVdQT1JUX0lOREVYX0xBWUVSX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9TVUJHUk9VUF9TSVpFX0NPTlRST0xfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX1RFWFRVUkVfQ09NUFJFU1NJT05fQVNUQ19IRFJfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX1RPT0xJTkdfSU5GT19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19FWFRfVFJBTlNGT1JNX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9WQUxJREFUSU9OX0NBQ0hFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0VYVF9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRVhURU5TSU9OX05BTUUsCisgICAgVktfRVhUX1lDQkNSX0lNQUdFX0FSUkFZU19FWFRFTlNJT05fTkFNRSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisgICAgVktfR0dQX0ZSQU1FX1RPS0VOX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmCisgICAgVktfR09PR0xFX0RFQ09SQVRFX1NUUklOR19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19HT09HTEVfRElTUExBWV9USU1JTkdfRVhURU5TSU9OX05BTUUsCisgICAgVktfR09PR0xFX0hMU0xfRlVOQ1RJT05BTElUWTFfRVhURU5TSU9OX05BTUUsCisgICAgVktfR09PR0xFX1VTRVJfVFlQRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19JTUdfRklMVEVSX0NVQklDX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0lNR19GT1JNQVRfUFZSVENfRVhURU5TSU9OX05BTUUsCisgICAgVktfSU5URUxfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUsCisgICAgVktfSU5URUxfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSXzE2QklUX1NUT1JBR0VfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSXzhCSVRfU1RPUkFHRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfQlVGRkVSX0RFVklDRV9BRERSRVNTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9DUkVBVEVfUkVOREVSUEFTU18yX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfREVQVEhfU1RFTkNJTF9SRVNPTFZFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfREVWSUNFX0dST1VQX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9ESVNQTEFZX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfRFJBV19JTkRJUkVDVF9DT1VOVF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfRFJJVkVSX1BST1BFUlRJRVNfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9GRF9FWFRFTlNJT05fTkFNRSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgVktfS0hSX0VYVEVSTkFMX0ZFTkNFX1dJTjMyX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmCisgICAgVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfRVhURVJOQUxfTUVNT1JZX0ZEX0VYVEVOU0lPTl9OQU1FLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWS19LSFJfRVhURVJOQUxfTUVNT1JZX1dJTjMyX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmCisgICAgVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0ZEX0VYVEVOU0lPTl9OQU1FLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX1dJTjMyX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmCisgICAgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX0lNQUdFX0ZPUk1BVF9MSVNUX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX0lOQ1JFTUVOVEFMX1BSRVNFTlRfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9SRUxBWEVEX0JMT0NLX0xBWU9VVF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfU0FNUExFUl9NSVJST1JfQ0xBTVBfVE9fRURHRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX1NIQURFUl9BVE9NSUNfSU5UNjRfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX1NIQURFUl9DTE9DS19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfU0hBREVSX0ZMT0FUMTZfSU5UOF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX1NIQVJFRF9QUkVTRU5UQUJMRV9JTUFHRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfU1BJUlZfMV80X0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9TVE9SQUdFX0JVRkZFUl9TVE9SQUdFX0NMQVNTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX1NXQVBDSEFJTl9NVVRBQkxFX0ZPUk1BVF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19LSFJfVElNRUxJTkVfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRVhURU5TSU9OX05BTUUsCisgICAgVktfS0hSX1ZBUklBQkxFX1BPSU5URVJTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX0tIUl9WVUxLQU5fTUVNT1JZX01PREVMX0VYVEVOU0lPTl9OQU1FLAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBWS19LSFJfV0lOMzJfS0VZRURfTVVURVhfRVhURU5TSU9OX05BTUUsCisjZW5kaWYKKyAgICBWS19OVlhfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVlhfSU1BR0VfVklFV19IQU5ETEVfRVhURU5TSU9OX05BTUUsCisgICAgVktfTlZYX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX0NMSVBfU1BBQ0VfV19TQ0FMSU5HX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX0NPT1BFUkFUSVZFX01BVFJJWF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9DT1JORVJfU0FNUExFRF9JTUFHRV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9ERVZJQ0VfRElBR05PU1RJQ19DSEVDS1BPSU5UU19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUsCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFZLX05WX0VYVEVSTkFMX01FTU9SWV9XSU4zMl9FWFRFTlNJT05fTkFNRSwKKyNlbmRpZgorICAgIFZLX05WX0ZJTExfUkVDVEFOR0xFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX0ZSQUdNRU5UX0NPVkVSQUdFX1RPX0NPTE9SX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX0ZSQUdNRU5UX1NIQURFUl9CQVJZQ0VOVFJJQ19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX0dFT01FVFJZX1NIQURFUl9QQVNTVEhST1VHSF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9HTFNMX1NIQURFUl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9NRVNIX1NIQURFUl9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX1NBTVBMRV9NQVNLX09WRVJSSURFX0NPVkVSQUdFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX1NDSVNTT1JfRVhDTFVTSVZFX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfRVhURU5TSU9OX05BTUUsCisgICAgVktfTlZfU0hBREVSX1NNX0JVSUxUSU5TX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX1NIQURFUl9TVUJHUk9VUF9QQVJUSVRJT05FRF9FWFRFTlNJT05fTkFNRSwKKyAgICBWS19OVl9TSEFESU5HX1JBVEVfSU1BR0VfRVhURU5TSU9OX05BTUUsCisgICAgVktfTlZfVklFV1BPUlRfQVJSQVkyX0VYVEVOU0lPTl9OQU1FLAorICAgIFZLX05WX1ZJRVdQT1JUX1NXSVpaTEVfRVhURU5TSU9OX05BTUUsCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFZLX05WX1dJTjMyX0tFWUVEX01VVEVYX0VYVEVOU0lPTl9OQU1FLAorI2VuZGlmCit9OworCisKKyNlbmRpZiAvLyBWS19FWFRFTlNJT05fSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX2xheWVyX2Rpc3BhdGNoX3RhYmxlLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX2xheWVyX2Rpc3BhdGNoX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzMDkwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaApAQCAtMCwwICsxLDY2NyBAQAorLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKioKKy8vIFNlZSBsYXllcl9kaXNwYXRjaF90YWJsZV9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnMKKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBZb3VuZyA8bWFya3lAbHVuYXJnLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKwordHlwZWRlZiBQRk5fdmtWb2lkRnVuY3Rpb24gKFZLQVBJX1BUUiAqUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBOYW1lKTsKKworLy8gSW5zdGFuY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZV8geworICAgIC8vIE1hbnVhbGx5IGFkZCBpbiBHZXRQaHlzaWNhbERldmljZVByb2NBZGRyIGVudHJ5CisgICAgUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIgR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcjsKKworICAgIC8vIC0tLS0gQ29yZSAxXzAgY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBDcmVhdGVJbnN0YW5jZTsKKyAgICBQRk5fdmtEZXN0cm95SW5zdGFuY2UgRGVzdHJveUluc3RhbmNlOworICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyBFbnVtZXJhdGVQaHlzaWNhbERldmljZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgR2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVEZXZpY2UgQ3JlYXRlRGV2aWNlOworICAgIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXM7CisgICAgUEZOX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyBFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworICAgIFBGTl92a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzOworICAgIFBGTl92a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyBFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM7CisKKyAgICAvLyAtLS0tIENvcmUgMV8xIGNvbW1hbmRzCisgICAgUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uIEVudW1lcmF0ZUluc3RhbmNlVmVyc2lvbjsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyBFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiBHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIEdldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllczsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIEdldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSIERlc3Ryb3lTdXJmYWNlS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfc3dhcGNoYWluIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFI7CisgICAgUEZOX3ZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFIgR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFI7CisgICAgUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIEdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUjsKKyAgICBQRk5fdmtDcmVhdGVEaXNwbGF5TW9kZUtIUiBDcmVhdGVEaXNwbGF5TW9kZUtIUjsKKyAgICBQRk5fdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSOworICAgIFBGTl92a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIgQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX3hsaWJfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBQRk5fdmtDcmVhdGVYbGliU3VyZmFjZUtIUiBDcmVhdGVYbGliU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl94Y2Jfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIFBGTl92a0NyZWF0ZVhjYlN1cmZhY2VLSFIgQ3JlYXRlWGNiU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIEdldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorCisgICAgLy8gLS0tLSBWS19LSFJfd2F5bGFuZF9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIFBGTl92a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIENyZWF0ZVdheWxhbmRTdXJmYWNlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIgR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2FuZHJvaWRfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBQRk5fdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiBDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX3dpbjMyX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiBDcmVhdGVXaW4zMlN1cmZhY2VLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiBHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIgR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSIEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV9jYXBhYmlsaXRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiBHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiBFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFI7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfZGlzcGxheV9wcm9wZXJ0aWVzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUiBHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUjsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI7CisgICAgUEZOX3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiBHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSOworICAgIFBGTl92a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjsKKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX3JlcG9ydCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIENyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisgICAgUEZOX3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisgICAgUEZOX3ZrRGVidWdSZXBvcnRNZXNzYWdlRVhUIERlYnVnUmVwb3J0TWVzc2FnZUVYVDsKKworICAgIC8vIC0tLS0gVktfR0dQX3N0cmVhbV9kZXNjcmlwdG9yX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgIFBGTl92a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQIENyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKworICAgIC8vIC0tLS0gVktfTlZfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYgR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WOworCisgICAgLy8gLS0tLSBWS19OTl92aV9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorICAgIFBGTl92a0NyZWF0ZVZpU3VyZmFjZU5OIENyZWF0ZVZpU3VyZmFjZU5OOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCisgICAgLy8gLS0tLSBWS19OVlhfZGV2aWNlX2dlbmVyYXRlZF9jb21tYW5kcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWCBHZXRQaHlzaWNhbERldmljZUdlbmVyYXRlZENvbW1hbmRzUHJvcGVydGllc05WWDsKKworICAgIC8vIC0tLS0gVktfRVhUX2RpcmVjdF9tb2RlX2Rpc3BsYXkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrUmVsZWFzZURpc3BsYXlFWFQgUmVsZWFzZURpc3BsYXlFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9hY3F1aXJlX3hsaWJfZGlzcGxheSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisgICAgUEZOX3ZrQWNxdWlyZVhsaWJEaXNwbGF5RVhUIEFjcXVpcmVYbGliRGlzcGxheUVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorICAgIFBGTl92a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCBHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQ7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfWFJBTkRSX0VYVAorCisgICAgLy8gLS0tLSBWS19FWFRfZGlzcGxheV9zdXJmYWNlX2NvdW50ZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhUOworCisgICAgLy8gLS0tLSBWS19NVktfaW9zX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyAgICBQRk5fdmtDcmVhdGVJT1NTdXJmYWNlTVZLIENyZWF0ZUlPU1N1cmZhY2VNVks7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworICAgIC8vIC0tLS0gVktfTVZLX21hY29zX3N1cmZhY2UgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworICAgIFBGTl92a0NyZWF0ZU1hY09TU3VyZmFjZU1WSyBDcmVhdGVNYWNPU1N1cmZhY2VNVks7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCisgICAgLy8gLS0tLSBWS19FWFRfZGVidWdfdXRpbHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCBDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgIFBGTl92a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIERlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUOworICAgIFBGTl92a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUIFN1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCBHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX2NhbGlicmF0ZWRfdGltZXN0YW1wcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCBHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVDsKKworICAgIC8vIC0tLS0gVktfRlVDSFNJQV9pbWFnZXBpcGVfc3VyZmFjZSBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorICAgIFBGTl92a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBIENyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKKyAgICAvLyAtLS0tIFZLX0VYVF9tZXRhbF9zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKyAgICBQRk5fdmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQgQ3JlYXRlTWV0YWxTdXJmYWNlRVhUOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworICAgIC8vIC0tLS0gVktfRVhUX3Rvb2xpbmdfaW5mbyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUIEdldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ7CisKKyAgICAvLyAtLS0tIFZLX05WX2Nvb3BlcmF0aXZlX21hdHJpeCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIEdldFBoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY7CisKKyAgICAvLyAtLS0tIFZLX05WX2NvdmVyYWdlX3JlZHVjdGlvbl9tb2RlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViBHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlY7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQgR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVDsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0VYVF9oZWFkbGVzc19zdXJmYWNlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVCBDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQ7Cit9IFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGU7CisKKy8vIERldmljZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlCit0eXBlZGVmIHN0cnVjdCBWa0xheWVyRGlzcGF0Y2hUYWJsZV8geworCisgICAgLy8gLS0tLSBDb3JlIDFfMCBjb21tYW5kcworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIEdldERldmljZVByb2NBZGRyOworICAgIFBGTl92a0Rlc3Ryb3lEZXZpY2UgRGVzdHJveURldmljZTsKKyAgICBQRk5fdmtHZXREZXZpY2VRdWV1ZSBHZXREZXZpY2VRdWV1ZTsKKyAgICBQRk5fdmtRdWV1ZVN1Ym1pdCBRdWV1ZVN1Ym1pdDsKKyAgICBQRk5fdmtRdWV1ZVdhaXRJZGxlIFF1ZXVlV2FpdElkbGU7CisgICAgUEZOX3ZrRGV2aWNlV2FpdElkbGUgRGV2aWNlV2FpdElkbGU7CisgICAgUEZOX3ZrQWxsb2NhdGVNZW1vcnkgQWxsb2NhdGVNZW1vcnk7CisgICAgUEZOX3ZrRnJlZU1lbW9yeSBGcmVlTWVtb3J5OworICAgIFBGTl92a01hcE1lbW9yeSBNYXBNZW1vcnk7CisgICAgUEZOX3ZrVW5tYXBNZW1vcnkgVW5tYXBNZW1vcnk7CisgICAgUEZOX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXM7CisgICAgUEZOX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyBJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzOworICAgIFBGTl92a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQgR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudDsKKyAgICBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5IEJpbmRCdWZmZXJNZW1vcnk7CisgICAgUEZOX3ZrQmluZEltYWdlTWVtb3J5IEJpbmRJbWFnZU1lbW9yeTsKKyAgICBQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMgR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzIEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIFBGTl92a1F1ZXVlQmluZFNwYXJzZSBRdWV1ZUJpbmRTcGFyc2U7CisgICAgUEZOX3ZrQ3JlYXRlRmVuY2UgQ3JlYXRlRmVuY2U7CisgICAgUEZOX3ZrRGVzdHJveUZlbmNlIERlc3Ryb3lGZW5jZTsKKyAgICBQRk5fdmtSZXNldEZlbmNlcyBSZXNldEZlbmNlczsKKyAgICBQRk5fdmtHZXRGZW5jZVN0YXR1cyBHZXRGZW5jZVN0YXR1czsKKyAgICBQRk5fdmtXYWl0Rm9yRmVuY2VzIFdhaXRGb3JGZW5jZXM7CisgICAgUEZOX3ZrQ3JlYXRlU2VtYXBob3JlIENyZWF0ZVNlbWFwaG9yZTsKKyAgICBQRk5fdmtEZXN0cm95U2VtYXBob3JlIERlc3Ryb3lTZW1hcGhvcmU7CisgICAgUEZOX3ZrQ3JlYXRlRXZlbnQgQ3JlYXRlRXZlbnQ7CisgICAgUEZOX3ZrRGVzdHJveUV2ZW50IERlc3Ryb3lFdmVudDsKKyAgICBQRk5fdmtHZXRFdmVudFN0YXR1cyBHZXRFdmVudFN0YXR1czsKKyAgICBQRk5fdmtTZXRFdmVudCBTZXRFdmVudDsKKyAgICBQRk5fdmtSZXNldEV2ZW50IFJlc2V0RXZlbnQ7CisgICAgUEZOX3ZrQ3JlYXRlUXVlcnlQb29sIENyZWF0ZVF1ZXJ5UG9vbDsKKyAgICBQRk5fdmtEZXN0cm95UXVlcnlQb29sIERlc3Ryb3lRdWVyeVBvb2w7CisgICAgUEZOX3ZrR2V0UXVlcnlQb29sUmVzdWx0cyBHZXRRdWVyeVBvb2xSZXN1bHRzOworICAgIFBGTl92a0NyZWF0ZUJ1ZmZlciBDcmVhdGVCdWZmZXI7CisgICAgUEZOX3ZrRGVzdHJveUJ1ZmZlciBEZXN0cm95QnVmZmVyOworICAgIFBGTl92a0NyZWF0ZUJ1ZmZlclZpZXcgQ3JlYXRlQnVmZmVyVmlldzsKKyAgICBQRk5fdmtEZXN0cm95QnVmZmVyVmlldyBEZXN0cm95QnVmZmVyVmlldzsKKyAgICBQRk5fdmtDcmVhdGVJbWFnZSBDcmVhdGVJbWFnZTsKKyAgICBQRk5fdmtEZXN0cm95SW1hZ2UgRGVzdHJveUltYWdlOworICAgIFBGTl92a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQgR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dDsKKyAgICBQRk5fdmtDcmVhdGVJbWFnZVZpZXcgQ3JlYXRlSW1hZ2VWaWV3OworICAgIFBGTl92a0Rlc3Ryb3lJbWFnZVZpZXcgRGVzdHJveUltYWdlVmlldzsKKyAgICBQRk5fdmtDcmVhdGVTaGFkZXJNb2R1bGUgQ3JlYXRlU2hhZGVyTW9kdWxlOworICAgIFBGTl92a0Rlc3Ryb3lTaGFkZXJNb2R1bGUgRGVzdHJveVNoYWRlck1vZHVsZTsKKyAgICBQRk5fdmtDcmVhdGVQaXBlbGluZUNhY2hlIENyZWF0ZVBpcGVsaW5lQ2FjaGU7CisgICAgUEZOX3ZrRGVzdHJveVBpcGVsaW5lQ2FjaGUgRGVzdHJveVBpcGVsaW5lQ2FjaGU7CisgICAgUEZOX3ZrR2V0UGlwZWxpbmVDYWNoZURhdGEgR2V0UGlwZWxpbmVDYWNoZURhdGE7CisgICAgUEZOX3ZrTWVyZ2VQaXBlbGluZUNhY2hlcyBNZXJnZVBpcGVsaW5lQ2FjaGVzOworICAgIFBGTl92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOworICAgIFBGTl92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lczsKKyAgICBQRk5fdmtEZXN0cm95UGlwZWxpbmUgRGVzdHJveVBpcGVsaW5lOworICAgIFBGTl92a0NyZWF0ZVBpcGVsaW5lTGF5b3V0IENyZWF0ZVBpcGVsaW5lTGF5b3V0OworICAgIFBGTl92a0Rlc3Ryb3lQaXBlbGluZUxheW91dCBEZXN0cm95UGlwZWxpbmVMYXlvdXQ7CisgICAgUEZOX3ZrQ3JlYXRlU2FtcGxlciBDcmVhdGVTYW1wbGVyOworICAgIFBGTl92a0Rlc3Ryb3lTYW1wbGVyIERlc3Ryb3lTYW1wbGVyOworICAgIFBGTl92a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQgQ3JlYXRlRGVzY3JpcHRvclNldExheW91dDsKKyAgICBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCBEZXN0cm95RGVzY3JpcHRvclNldExheW91dDsKKyAgICBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCBDcmVhdGVEZXNjcmlwdG9yUG9vbDsKKyAgICBQRk5fdmtEZXN0cm95RGVzY3JpcHRvclBvb2wgRGVzdHJveURlc2NyaXB0b3JQb29sOworICAgIFBGTl92a1Jlc2V0RGVzY3JpcHRvclBvb2wgUmVzZXREZXNjcmlwdG9yUG9vbDsKKyAgICBQRk5fdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzIEFsbG9jYXRlRGVzY3JpcHRvclNldHM7CisgICAgUEZOX3ZrRnJlZURlc2NyaXB0b3JTZXRzIEZyZWVEZXNjcmlwdG9yU2V0czsKKyAgICBQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0cyBVcGRhdGVEZXNjcmlwdG9yU2V0czsKKyAgICBQRk5fdmtDcmVhdGVGcmFtZWJ1ZmZlciBDcmVhdGVGcmFtZWJ1ZmZlcjsKKyAgICBQRk5fdmtEZXN0cm95RnJhbWVidWZmZXIgRGVzdHJveUZyYW1lYnVmZmVyOworICAgIFBGTl92a0NyZWF0ZVJlbmRlclBhc3MgQ3JlYXRlUmVuZGVyUGFzczsKKyAgICBQRk5fdmtEZXN0cm95UmVuZGVyUGFzcyBEZXN0cm95UmVuZGVyUGFzczsKKyAgICBQRk5fdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkgR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5OworICAgIFBGTl92a0NyZWF0ZUNvbW1hbmRQb29sIENyZWF0ZUNvbW1hbmRQb29sOworICAgIFBGTl92a0Rlc3Ryb3lDb21tYW5kUG9vbCBEZXN0cm95Q29tbWFuZFBvb2w7CisgICAgUEZOX3ZrUmVzZXRDb21tYW5kUG9vbCBSZXNldENvbW1hbmRQb29sOworICAgIFBGTl92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMgQWxsb2NhdGVDb21tYW5kQnVmZmVyczsKKyAgICBQRk5fdmtGcmVlQ29tbWFuZEJ1ZmZlcnMgRnJlZUNvbW1hbmRCdWZmZXJzOworICAgIFBGTl92a0JlZ2luQ29tbWFuZEJ1ZmZlciBCZWdpbkNvbW1hbmRCdWZmZXI7CisgICAgUEZOX3ZrRW5kQ29tbWFuZEJ1ZmZlciBFbmRDb21tYW5kQnVmZmVyOworICAgIFBGTl92a1Jlc2V0Q29tbWFuZEJ1ZmZlciBSZXNldENvbW1hbmRCdWZmZXI7CisgICAgUEZOX3ZrQ21kQmluZFBpcGVsaW5lIENtZEJpbmRQaXBlbGluZTsKKyAgICBQRk5fdmtDbWRTZXRWaWV3cG9ydCBDbWRTZXRWaWV3cG9ydDsKKyAgICBQRk5fdmtDbWRTZXRTY2lzc29yIENtZFNldFNjaXNzb3I7CisgICAgUEZOX3ZrQ21kU2V0TGluZVdpZHRoIENtZFNldExpbmVXaWR0aDsKKyAgICBQRk5fdmtDbWRTZXREZXB0aEJpYXMgQ21kU2V0RGVwdGhCaWFzOworICAgIFBGTl92a0NtZFNldEJsZW5kQ29uc3RhbnRzIENtZFNldEJsZW5kQ29uc3RhbnRzOworICAgIFBGTl92a0NtZFNldERlcHRoQm91bmRzIENtZFNldERlcHRoQm91bmRzOworICAgIFBGTl92a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzayBDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2s7CisgICAgUEZOX3ZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayBDbWRTZXRTdGVuY2lsV3JpdGVNYXNrOworICAgIFBGTl92a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UgQ21kU2V0U3RlbmNpbFJlZmVyZW5jZTsKKyAgICBQRk5fdmtDbWRCaW5kRGVzY3JpcHRvclNldHMgQ21kQmluZERlc2NyaXB0b3JTZXRzOworICAgIFBGTl92a0NtZEJpbmRJbmRleEJ1ZmZlciBDbWRCaW5kSW5kZXhCdWZmZXI7CisgICAgUEZOX3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnMgQ21kQmluZFZlcnRleEJ1ZmZlcnM7CisgICAgUEZOX3ZrQ21kRHJhdyBDbWREcmF3OworICAgIFBGTl92a0NtZERyYXdJbmRleGVkIENtZERyYXdJbmRleGVkOworICAgIFBGTl92a0NtZERyYXdJbmRpcmVjdCBDbWREcmF3SW5kaXJlY3Q7CisgICAgUEZOX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCBDbWREcmF3SW5kZXhlZEluZGlyZWN0OworICAgIFBGTl92a0NtZERpc3BhdGNoIENtZERpc3BhdGNoOworICAgIFBGTl92a0NtZERpc3BhdGNoSW5kaXJlY3QgQ21kRGlzcGF0Y2hJbmRpcmVjdDsKKyAgICBQRk5fdmtDbWRDb3B5QnVmZmVyIENtZENvcHlCdWZmZXI7CisgICAgUEZOX3ZrQ21kQ29weUltYWdlIENtZENvcHlJbWFnZTsKKyAgICBQRk5fdmtDbWRCbGl0SW1hZ2UgQ21kQmxpdEltYWdlOworICAgIFBGTl92a0NtZENvcHlCdWZmZXJUb0ltYWdlIENtZENvcHlCdWZmZXJUb0ltYWdlOworICAgIFBGTl92a0NtZENvcHlJbWFnZVRvQnVmZmVyIENtZENvcHlJbWFnZVRvQnVmZmVyOworICAgIFBGTl92a0NtZFVwZGF0ZUJ1ZmZlciBDbWRVcGRhdGVCdWZmZXI7CisgICAgUEZOX3ZrQ21kRmlsbEJ1ZmZlciBDbWRGaWxsQnVmZmVyOworICAgIFBGTl92a0NtZENsZWFyQ29sb3JJbWFnZSBDbWRDbGVhckNvbG9ySW1hZ2U7CisgICAgUEZOX3ZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSBDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlOworICAgIFBGTl92a0NtZENsZWFyQXR0YWNobWVudHMgQ21kQ2xlYXJBdHRhY2htZW50czsKKyAgICBQRk5fdmtDbWRSZXNvbHZlSW1hZ2UgQ21kUmVzb2x2ZUltYWdlOworICAgIFBGTl92a0NtZFNldEV2ZW50IENtZFNldEV2ZW50OworICAgIFBGTl92a0NtZFJlc2V0RXZlbnQgQ21kUmVzZXRFdmVudDsKKyAgICBQRk5fdmtDbWRXYWl0RXZlbnRzIENtZFdhaXRFdmVudHM7CisgICAgUEZOX3ZrQ21kUGlwZWxpbmVCYXJyaWVyIENtZFBpcGVsaW5lQmFycmllcjsKKyAgICBQRk5fdmtDbWRCZWdpblF1ZXJ5IENtZEJlZ2luUXVlcnk7CisgICAgUEZOX3ZrQ21kRW5kUXVlcnkgQ21kRW5kUXVlcnk7CisgICAgUEZOX3ZrQ21kUmVzZXRRdWVyeVBvb2wgQ21kUmVzZXRRdWVyeVBvb2w7CisgICAgUEZOX3ZrQ21kV3JpdGVUaW1lc3RhbXAgQ21kV3JpdGVUaW1lc3RhbXA7CisgICAgUEZOX3ZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMgQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHM7CisgICAgUEZOX3ZrQ21kUHVzaENvbnN0YW50cyBDbWRQdXNoQ29uc3RhbnRzOworICAgIFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzcyBDbWRCZWdpblJlbmRlclBhc3M7CisgICAgUEZOX3ZrQ21kTmV4dFN1YnBhc3MgQ21kTmV4dFN1YnBhc3M7CisgICAgUEZOX3ZrQ21kRW5kUmVuZGVyUGFzcyBDbWRFbmRSZW5kZXJQYXNzOworICAgIFBGTl92a0NtZEV4ZWN1dGVDb21tYW5kcyBDbWRFeGVjdXRlQ29tbWFuZHM7CisKKyAgICAvLyAtLS0tIENvcmUgMV8xIGNvbW1hbmRzCisgICAgUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTIgQmluZEJ1ZmZlck1lbW9yeTI7CisgICAgUEZOX3ZrQmluZEltYWdlTWVtb3J5MiBCaW5kSW1hZ2VNZW1vcnkyOworICAgIFBGTl92a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzIEdldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzOworICAgIFBGTl92a0NtZFNldERldmljZU1hc2sgQ21kU2V0RGV2aWNlTWFzazsKKyAgICBQRk5fdmtDbWREaXNwYXRjaEJhc2UgQ21kRGlzcGF0Y2hCYXNlOworICAgIFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiBHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI7CisgICAgUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyOworICAgIFBGTl92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMiBHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czI7CisgICAgUEZOX3ZrVHJpbUNvbW1hbmRQb29sIFRyaW1Db21tYW5kUG9vbDsKKyAgICBQRk5fdmtHZXREZXZpY2VRdWV1ZTIgR2V0RGV2aWNlUXVldWUyOworICAgIFBGTl92a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24gQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbiBEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlOworICAgIFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZTsKKyAgICBQRk5fdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlIFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGU7CisgICAgUEZOX3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQ7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9zd2FwY2hhaW4gZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ3JlYXRlU3dhcGNoYWluS0hSIENyZWF0ZVN3YXBjaGFpbktIUjsKKyAgICBQRk5fdmtEZXN0cm95U3dhcGNoYWluS0hSIERlc3Ryb3lTd2FwY2hhaW5LSFI7CisgICAgUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIEdldFN3YXBjaGFpbkltYWdlc0tIUjsKKyAgICBQRk5fdmtBY3F1aXJlTmV4dEltYWdlS0hSIEFjcXVpcmVOZXh0SW1hZ2VLSFI7CisgICAgUEZOX3ZrUXVldWVQcmVzZW50S0hSIFF1ZXVlUHJlc2VudEtIUjsKKyAgICBQRk5fdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSOworICAgIFBGTl92a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiBHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFI7CisgICAgUEZOX3ZrQWNxdWlyZU5leHRJbWFnZTJLSFIgQWNxdWlyZU5leHRJbWFnZTJLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kaXNwbGF5X3N3YXBjaGFpbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSIENyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9kZXZpY2VfZ3JvdXAgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFIgR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXNLSFI7CisgICAgUEZOX3ZrQ21kU2V0RGV2aWNlTWFza0tIUiBDbWRTZXREZXZpY2VNYXNrS0hSOworICAgIFBGTl92a0NtZERpc3BhdGNoQmFzZUtIUiBDbWREaXNwYXRjaEJhc2VLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9tYWludGVuYW5jZTEgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrVHJpbUNvbW1hbmRQb29sS0hSIFRyaW1Db21tYW5kUG9vbEtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX21lbW9yeV93aW4zMiBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIgR2V0TWVtb3J5V2luMzJIYW5kbGVLSFI7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX21lbW9yeV9mZCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRNZW1vcnlGZEtIUiBHZXRNZW1vcnlGZEtIUjsKKyAgICBQRk5fdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIgR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX3dpbjMyIGV4dGVuc2lvbiBjb21tYW5kcworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIEdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtJbXBvcnRTZW1hcGhvcmVGZEtIUiBJbXBvcnRTZW1hcGhvcmVGZEtIUjsKKyAgICBQRk5fdmtHZXRTZW1hcGhvcmVGZEtIUiBHZXRTZW1hcGhvcmVGZEtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX3B1c2hfZGVzY3JpcHRvciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiBDbWRQdXNoRGVzY3JpcHRvclNldEtIUjsKKyAgICBQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiBDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiBDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFI7CisgICAgUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiBEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSOworICAgIFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIgVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2NyZWF0ZV9yZW5kZXJwYXNzMiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUiBDcmVhdGVSZW5kZXJQYXNzMktIUjsKKyAgICBQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSIENtZEJlZ2luUmVuZGVyUGFzczJLSFI7CisgICAgUEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSIENtZE5leHRTdWJwYXNzMktIUjsKKyAgICBQRk5fdmtDbWRFbmRSZW5kZXJQYXNzMktIUiBDbWRFbmRSZW5kZXJQYXNzMktIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFIgR2V0U3dhcGNoYWluU3RhdHVzS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFIgSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0dldEZlbmNlV2luMzJIYW5kbGVLSFIgR2V0RmVuY2VXaW4zMkhhbmRsZUtIUjsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICAvLyAtLS0tIFZLX0tIUl9leHRlcm5hbF9mZW5jZV9mZCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtJbXBvcnRGZW5jZUZkS0hSIEltcG9ydEZlbmNlRmRLSFI7CisgICAgUEZOX3ZrR2V0RmVuY2VGZEtIUiBHZXRGZW5jZUZkS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfcGVyZm9ybWFuY2VfcXVlcnkgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFI7CisgICAgUEZOX3ZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIgUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKKyAgICBQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSIEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFI7CisgICAgUEZOX3ZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFI7CisgICAgUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9iaW5kX21lbW9yeTIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeTJLSFIgQmluZEJ1ZmZlck1lbW9yeTJLSFI7CisgICAgUEZOX3ZrQmluZEltYWdlTWVtb3J5MktIUiBCaW5kSW1hZ2VNZW1vcnkyS0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfbWFpbnRlbmFuY2UzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSIEdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiBDbWREcmF3SW5kaXJlY3RDb3VudEtIUjsKKyAgICBQRk5fdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIgQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSOworCisgICAgLy8gLS0tLSBWS19LSFJfdGltZWxpbmVfc2VtYXBob3JlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUiBHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFI7CisgICAgUEZOX3ZrV2FpdFNlbWFwaG9yZXNLSFIgV2FpdFNlbWFwaG9yZXNLSFI7CisgICAgUEZOX3ZrU2lnbmFsU2VtYXBob3JlS0hSIFNpZ25hbFNlbWFwaG9yZUtIUjsKKworICAgIC8vIC0tLS0gVktfS0hSX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIEdldEJ1ZmZlckRldmljZUFkZHJlc3NLSFI7CisgICAgUEZOX3ZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFI7CisgICAgUEZOX3ZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFI7CisKKyAgICAvLyAtLS0tIFZLX0tIUl9waXBlbGluZV9leGVjdXRhYmxlX3Byb3BlcnRpZXMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiBHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSOworICAgIFBGTl92a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFIgR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUjsKKyAgICBQRk5fdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUiBHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUjsKKworICAgIC8vIC0tLS0gVktfRVhUX2RlYnVnX21hcmtlciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCBEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVDsKKyAgICBQRk5fdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQgRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUOworICAgIFBGTl92a0NtZERlYnVnTWFya2VyQmVnaW5FWFQgQ21kRGVidWdNYXJrZXJCZWdpbkVYVDsKKyAgICBQRk5fdmtDbWREZWJ1Z01hcmtlckVuZEVYVCBDbWREZWJ1Z01hcmtlckVuZEVYVDsKKyAgICBQRk5fdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCBDbWREZWJ1Z01hcmtlckluc2VydEVYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX3RyYW5zZm9ybV9mZWVkYmFjayBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhUIENtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQ7CisgICAgUEZOX3ZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCBDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUOworICAgIFBGTl92a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUIENtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUOworICAgIFBGTl92a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIENtZEJlZ2luUXVlcnlJbmRleGVkRVhUOworICAgIFBGTl92a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVCBDbWRFbmRRdWVyeUluZGV4ZWRFWFQ7CisgICAgUEZOX3ZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhUIENtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVDsKKworICAgIC8vIC0tLS0gVktfTlZYX2ltYWdlX3ZpZXdfaGFuZGxlIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldEltYWdlVmlld0hhbmRsZU5WWCBHZXRJbWFnZVZpZXdIYW5kbGVOVlg7CisKKyAgICAvLyAtLS0tIFZLX0FNRF9kcmF3X2luZGlyZWN0X2NvdW50IGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NtZERyYXdJbmRpcmVjdENvdW50QU1EIENtZERyYXdJbmRpcmVjdENvdW50QU1EOworICAgIFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEFNRCBDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRBTUQ7CisKKyAgICAvLyAtLS0tIFZLX0FNRF9zaGFkZXJfaW5mbyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRTaGFkZXJJbmZvQU1EIEdldFNoYWRlckluZm9BTUQ7CisKKyAgICAvLyAtLS0tIFZLX05WX2V4dGVybmFsX21lbW9yeV93aW4zMiBleHRlbnNpb24gY29tbWFuZHMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVOViBHZXRNZW1vcnlXaW4zMkhhbmRsZU5WOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX2NvbmRpdGlvbmFsX3JlbmRlcmluZyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhUIENtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQ7CisgICAgUEZOX3ZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQgQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQ7CisKKyAgICAvLyAtLS0tIFZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NtZFByb2Nlc3NDb21tYW5kc05WWCBDbWRQcm9jZXNzQ29tbWFuZHNOVlg7CisgICAgUEZOX3ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlggQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlg7CisgICAgUEZOX3ZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYOworICAgIFBGTl92a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIERlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYOworICAgIFBGTl92a0NyZWF0ZU9iamVjdFRhYmxlTlZYIENyZWF0ZU9iamVjdFRhYmxlTlZYOworICAgIFBGTl92a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWCBEZXN0cm95T2JqZWN0VGFibGVOVlg7CisgICAgUEZOX3ZrUmVnaXN0ZXJPYmplY3RzTlZYIFJlZ2lzdGVyT2JqZWN0c05WWDsKKyAgICBQRk5fdmtVbnJlZ2lzdGVyT2JqZWN0c05WWCBVbnJlZ2lzdGVyT2JqZWN0c05WWDsKKworICAgIC8vIC0tLS0gVktfTlZfY2xpcF9zcGFjZV93X3NjYWxpbmcgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WIENtZFNldFZpZXdwb3J0V1NjYWxpbmdOVjsKKworICAgIC8vIC0tLS0gVktfRVhUX2Rpc3BsYXlfY29udHJvbCBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtEaXNwbGF5UG93ZXJDb250cm9sRVhUIERpc3BsYXlQb3dlckNvbnRyb2xFWFQ7CisgICAgUEZOX3ZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVCBSZWdpc3RlckRldmljZUV2ZW50RVhUOworICAgIFBGTl92a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhUIFJlZ2lzdGVyRGlzcGxheUV2ZW50RVhUOworICAgIFBGTl92a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQgR2V0U3dhcGNoYWluQ291bnRlckVYVDsKKworICAgIC8vIC0tLS0gVktfR09PR0xFX2Rpc3BsYXlfdGltaW5nIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIEdldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFOworICAgIFBGTl92a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRTsKKworICAgIC8vIC0tLS0gVktfRVhUX2Rpc2NhcmRfcmVjdGFuZ2xlcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhUIENtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9oZHJfbWV0YWRhdGEgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrU2V0SGRyTWV0YWRhdGFFWFQgU2V0SGRyTWV0YWRhdGFFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9kZWJ1Z191dGlscyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCBTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVDsKKyAgICBQRk5fdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUIFNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQ7CisgICAgUEZOX3ZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCBRdWV1ZUJlZ2luRGVidWdVdGlsc0xhYmVsRVhUOworICAgIFBGTl92a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUIFF1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUOworICAgIFBGTl92a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIFF1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUOworICAgIFBGTl92a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIENtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUOworICAgIFBGTl92a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVCBDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQ7CisgICAgUEZOX3ZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVDsKKworICAgIC8vIC0tLS0gVktfQU5EUk9JRF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgUEZOX3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgUEZOX3ZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRCBHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisgICAgLy8gLS0tLSBWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQgQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhUOworCisgICAgLy8gLS0tLSBWS19FWFRfaW1hZ2VfZHJtX2Zvcm1hdF9tb2RpZmllciBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCBHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX3ZhbGlkYXRpb25fY2FjaGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIENyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVDsKKyAgICBQRk5fdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUIERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQ7CisgICAgUEZOX3ZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUIE1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVDsKKyAgICBQRk5fdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIEdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQ7CisKKyAgICAvLyAtLS0tIFZLX05WX3NoYWRpbmdfcmF0ZV9pbWFnZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIENtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlY7CisgICAgUEZOX3ZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViBDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WOworICAgIFBGTl92a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYgQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVjsKKworICAgIC8vIC0tLS0gVktfTlZfcmF5X3RyYWNpbmcgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY7CisgICAgUEZOX3ZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICBQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVjsKKyAgICBQRk5fdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYgQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WOworICAgIFBGTl92a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjsKKyAgICBQRk5fdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgIFBGTl92a0NtZFRyYWNlUmF5c05WIENtZFRyYWNlUmF5c05WOworICAgIFBGTl92a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViBDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlY7CisgICAgUEZOX3ZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIEdldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVjsKKyAgICBQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVjsKKyAgICBQRk5fdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYgQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WOworICAgIFBGTl92a0NvbXBpbGVEZWZlcnJlZE5WIENvbXBpbGVEZWZlcnJlZE5WOworCisgICAgLy8gLS0tLSBWS19FWFRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIEdldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDsKKworICAgIC8vIC0tLS0gVktfQU1EX2J1ZmZlcl9tYXJrZXIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQgQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9jYWxpYnJhdGVkX3RpbWVzdGFtcHMgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQgR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQ7CisKKyAgICAvLyAtLS0tIFZLX05WX21lc2hfc2hhZGVyIGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0NtZERyYXdNZXNoVGFza3NOViBDbWREcmF3TWVzaFRhc2tzTlY7CisgICAgUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYgQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlY7CisgICAgUEZOX3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViBDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WOworCisgICAgLy8gLS0tLSBWS19OVl9zY2lzc29yX2V4Y2x1c2l2ZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYgQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WOworCisgICAgLy8gLS0tLSBWS19OVl9kZXZpY2VfZGlhZ25vc3RpY19jaGVja3BvaW50cyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRTZXRDaGVja3BvaW50TlYgQ21kU2V0Q2hlY2twb2ludE5WOworICAgIFBGTl92a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOViBHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlY7CisKKyAgICAvLyAtLS0tIFZLX0lOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5IGV4dGVuc2lvbiBjb21tYW5kcworICAgIFBGTl92a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMIEluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMOworICAgIFBGTl92a1VuaW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwgVW5pbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTDsKKyAgICBQRk5fdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMIENtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUw7CisgICAgUEZOX3ZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTCBDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMOworICAgIFBGTl92a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCBDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUw7CisgICAgUEZOX3ZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIEFjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsKKyAgICBQRk5fdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworICAgIFBGTl92a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsKKyAgICBQRk5fdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMIEdldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUw7CisKKyAgICAvLyAtLS0tIFZLX0FNRF9kaXNwbGF5X25hdGl2ZV9oZHIgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrU2V0TG9jYWxEaW1taW5nQU1EIFNldExvY2FsRGltbWluZ0FNRDsKKworICAgIC8vIC0tLS0gVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIEdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQ7CisKKyAgICAvLyAtLS0tIFZLX0VYVF9mdWxsX3NjcmVlbl9leGNsdXNpdmUgZXh0ZW5zaW9uIGNvbW1hbmRzCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIFBGTl92a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVCBBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQ7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBQRk5fdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQgUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhUOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgUEZOX3ZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCBHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworICAgIC8vIC0tLS0gVktfRVhUX2xpbmVfcmFzdGVyaXphdGlvbiBleHRlbnNpb24gY29tbWFuZHMKKyAgICBQRk5fdmtDbWRTZXRMaW5lU3RpcHBsZUVYVCBDbWRTZXRMaW5lU3RpcHBsZUVYVDsKKworICAgIC8vIC0tLS0gVktfRVhUX2hvc3RfcXVlcnlfcmVzZXQgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgUEZOX3ZrUmVzZXRRdWVyeVBvb2xFWFQgUmVzZXRRdWVyeVBvb2xFWFQ7Cit9IFZrTGF5ZXJEaXNwYXRjaFRhYmxlOworCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdmtfb2JqZWN0X3R5cGVzLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX29iamVjdF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjZhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX29iamVjdF90eXBlcy5oCkBAIC0wLDAgKzEsODE2IEBACisvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKgorLy8gU2VlIGhlbHBlcl9maWxlX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leWdvQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZvcmJlc0Bnb29nbGUuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZjxqenVsYXVmQGx1bmFyZy5jb20+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJjYXN0X3V0aWxzLmgiCisKKy8vIE9iamVjdCBUeXBlIGVudW0gZm9yIHZhbGlkYXRpb24gbGF5ZXIgaW50ZXJuYWwgb2JqZWN0IGhhbmRsaW5nCit0eXBlZGVmIGVudW0gVnVsa2FuT2JqZWN0VHlwZSB7CisgICAga1Z1bGthbk9iamVjdFR5cGVVbmtub3duID0gMCwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlID0gMSwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlID0gMiwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZURldmljZSA9IDMsCisgICAga1Z1bGthbk9iamVjdFR5cGVRdWV1ZSA9IDQsCisgICAga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUgPSA1LAorICAgIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciA9IDYsCisgICAga1Z1bGthbk9iamVjdFR5cGVGZW5jZSA9IDcsCisgICAga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnkgPSA4LAorICAgIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyID0gOSwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZUltYWdlID0gMTAsCisgICAga1Z1bGthbk9iamVjdFR5cGVFdmVudCA9IDExLAorICAgIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sID0gMTIsCisgICAga1Z1bGthbk9iamVjdFR5cGVCdWZmZXJWaWV3ID0gMTMsCisgICAga1Z1bGthbk9iamVjdFR5cGVJbWFnZVZpZXcgPSAxNCwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVNoYWRlck1vZHVsZSA9IDE1LAorICAgIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZSA9IDE2LAorICAgIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQgPSAxNywKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MgPSAxOCwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lID0gMTksCisgICAga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0TGF5b3V0ID0gMjAsCisgICAga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyID0gMjEsCisgICAga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbCA9IDIyLAorICAgIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldCA9IDIzLAorICAgIGtWdWxrYW5PYmplY3RUeXBlRnJhbWVidWZmZXIgPSAyNCwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sID0gMjUsCisgICAga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gMjYsCisgICAga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSAyNywKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIgPSAyOCwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVN3YXBjaGFpbktIUiA9IDI5LAorICAgIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUiA9IDMwLAorICAgIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheU1vZGVLSFIgPSAzMSwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPSAzMiwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZU9iamVjdFRhYmxlTlZYID0gMzMsCisgICAga1Z1bGthbk9iamVjdFR5cGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYID0gMzQsCisgICAga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0gMzUsCisgICAga1Z1bGthbk9iamVjdFR5cGVWYWxpZGF0aW9uQ2FjaGVFWFQgPSAzNiwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gMzcsCisgICAga1Z1bGthbk9iamVjdFR5cGVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCA9IDM4LAorICAgIGtWdWxrYW5PYmplY3RUeXBlTWF4ID0gMzksCisgICAgLy8gQWxpYXNlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWx0eSBvZiAicHJvbW90ZWQiIHR5cGVzCisgICAga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPSBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgPSBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXJZY2JjckNvbnZlcnNpb24sCit9IFZ1bGthbk9iamVjdFR5cGU7CisKKy8vIEFycmF5IG9mIG9iamVjdCBuYW1lIHN0cmluZ3MgZm9yIE9CSkVDVF9UWVBFIGVudW0gY29udmVyc2lvbgorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvYmplY3Rfc3RyaW5nW2tWdWxrYW5PYmplY3RUeXBlTWF4XSA9IHsKKyAgICAiVmtOb25EaXNwYXRjaGFibGVIYW5kbGUiLAorICAgICJWa0luc3RhbmNlIiwKKyAgICAiVmtQaHlzaWNhbERldmljZSIsCisgICAgIlZrRGV2aWNlIiwKKyAgICAiVmtRdWV1ZSIsCisgICAgIlZrU2VtYXBob3JlIiwKKyAgICAiVmtDb21tYW5kQnVmZmVyIiwKKyAgICAiVmtGZW5jZSIsCisgICAgIlZrRGV2aWNlTWVtb3J5IiwKKyAgICAiVmtCdWZmZXIiLAorICAgICJWa0ltYWdlIiwKKyAgICAiVmtFdmVudCIsCisgICAgIlZrUXVlcnlQb29sIiwKKyAgICAiVmtCdWZmZXJWaWV3IiwKKyAgICAiVmtJbWFnZVZpZXciLAorICAgICJWa1NoYWRlck1vZHVsZSIsCisgICAgIlZrUGlwZWxpbmVDYWNoZSIsCisgICAgIlZrUGlwZWxpbmVMYXlvdXQiLAorICAgICJWa1JlbmRlclBhc3MiLAorICAgICJWa1BpcGVsaW5lIiwKKyAgICAiVmtEZXNjcmlwdG9yU2V0TGF5b3V0IiwKKyAgICAiVmtTYW1wbGVyIiwKKyAgICAiVmtEZXNjcmlwdG9yUG9vbCIsCisgICAgIlZrRGVzY3JpcHRvclNldCIsCisgICAgIlZrRnJhbWVidWZmZXIiLAorICAgICJWa0NvbW1hbmRQb29sIiwKKyAgICAiVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uIiwKKyAgICAiVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUiLAorICAgICJWa1N1cmZhY2VLSFIiLAorICAgICJWa1N3YXBjaGFpbktIUiIsCisgICAgIlZrRGlzcGxheUtIUiIsCisgICAgIlZrRGlzcGxheU1vZGVLSFIiLAorICAgICJWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLAorICAgICJWa09iamVjdFRhYmxlTlZYIiwKKyAgICAiVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIiwKKyAgICAiVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIiwKKyAgICAiVmtWYWxpZGF0aW9uQ2FjaGVFWFQiLAorICAgICJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIiwKKyAgICAiVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCIsCit9OworCisvLyBIZWxwZXIgYXJyYXkgdG8gZ2V0IFZ1bGthbiBWS19FWFRfZGVidWdfcmVwb3J0IG9iamVjdCB0eXBlIGVudW0gZnJvbSB0aGUgaW50ZXJuYWwgbGF5ZXJzIHZlcnNpb24KK2NvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGdldF9kZWJ1Z19yZXBvcnRfZW51bVtdID0geworICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgLy8ga1Z1bGthbk9iamVjdFR5cGVVbmtub3duCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lOU1RBTkNFX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZQorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVF1ZXVlCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmUKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlcgorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GRU5DRV9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVGZW5jZQorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeQorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUltYWdlCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VWRU5UX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUV2ZW50CisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlclZpZXcKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfVklFV19FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVJbWFnZVZpZXcKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTaGFkZXJNb2R1bGUKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEVfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZQorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUmVuZGVyUGFzcworICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZQorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldExheW91dAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXIKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVJfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRnJhbWVidWZmZXIKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZQorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlLSFIKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5TW9kZUtIUgorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfRVhUX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWF9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgKKyAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVZhbGlkYXRpb25DYWNoZUVYVAorICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WCisgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwKK307CisKKy8vIEhlbHBlciBhcnJheSB0byBnZXQgT2ZmaWNpYWwgVnVsa2FuIFZrT2JqZWN0VHlwZSBlbnVtIGZyb20gdGhlIGludGVybmFsIGxheWVycyB2ZXJzaW9uCitjb25zdCBWa09iamVjdFR5cGUgZ2V0X29iamVjdF90eXBlX2VudW1bXSA9IHsKKyAgICBWS19PQkpFQ1RfVFlQRV9VTktOT1dOLCAvLyBrVnVsa2FuT2JqZWN0VHlwZVVua25vd24KKyAgICBWS19PQkpFQ1RfVFlQRV9JTlNUQU5DRSwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlCisgICAgVktfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UKKyAgICBWS19PQkpFQ1RfVFlQRV9ERVZJQ0UsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UKKyAgICBWS19PQkpFQ1RfVFlQRV9RVUVVRSwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVF1ZXVlCisgICAgVktfT0JKRUNUX1RZUEVfU0VNQVBIT1JFLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlCisgICAgVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVIsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyCisgICAgVktfT0JKRUNUX1RZUEVfRkVOQ0UsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVGZW5jZQorICAgIFZLX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUlksICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnkKKyAgICBWS19PQkpFQ1RfVFlQRV9CVUZGRVIsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIKKyAgICBWS19PQkpFQ1RfVFlQRV9JTUFHRSwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUltYWdlCisgICAgVktfT0JKRUNUX1RZUEVfRVZFTlQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVFdmVudAorICAgIFZLX09CSkVDVF9UWVBFX1FVRVJZX1BPT0wsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wKKyAgICBWS19PQkpFQ1RfVFlQRV9CVUZGRVJfVklFVywgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlclZpZXcKKyAgICBWS19PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2VWaWV3CisgICAgVktfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRSwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVNoYWRlck1vZHVsZQorICAgIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZQorICAgIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0CisgICAgVktfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1MsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVSZW5kZXJQYXNzCisgICAgVktfT0JKRUNUX1RZUEVfUElQRUxJTkUsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZQorICAgIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXRMYXlvdXQKKyAgICBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlcgorICAgIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sCisgICAgVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0CisgICAgVktfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVIsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVGcmFtZWJ1ZmZlcgorICAgIFZLX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sCisgICAgVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlclljYmNyQ29udmVyc2lvbgorICAgIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlCisgICAgVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFIsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSCisgICAgVktfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUiwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVN3YXBjaGFpbktIUgorICAgIFZLX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSLCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUgorICAgIFZLX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFIsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5TW9kZUtIUgorICAgIFZLX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFQsICAgLy8ga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUCisgICAgVktfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZU9iamVjdFRhYmxlTlZYCisgICAgVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgKKyAgICBWS19PQkpFQ1RfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlRGVidWdVdGlsc01lc3NlbmdlckVYVAorICAgIFZLX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhULCAgIC8vIGtWdWxrYW5PYmplY3RUeXBlVmFsaWRhdGlvbkNhY2hlRVhUCisgICAgVktfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WCisgICAgVktfT0JKRUNUX1RZUEVfUEVSRk9STUFOQ0VfQ09ORklHVVJBVElPTl9JTlRFTCwgICAvLyBrVnVsa2FuT2JqZWN0VHlwZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMCit9OworCisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGludGVybmFsIGxheWVycyBvYmplY3QgaWRzIGZyb20gdGhlIG9mZmljaWFsIFZ1bGthbiBWa09iamVjdFR5cGUgZW51bQorc3RhdGljIGlubGluZSBWdWxrYW5PYmplY3RUeXBlIENvbnZlcnRDb3JlT2JqZWN0VG9WdWxrYW5PYmplY3QoVmtPYmplY3RUeXBlIHZ1bGthbl9vYmplY3RfdHlwZSkgeworICAgIHN3aXRjaCAodnVsa2FuX29iamVjdF90eXBlKSB7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU5TVEFOQ0U6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRTogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2U7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfREVWSUNFOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVEZXZpY2U7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfUVVFVUU6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZVF1ZXVlOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NFTUFQSE9SRTogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlU2VtYXBob3JlOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0ZFTkNFOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVGZW5jZTsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnk7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfQlVGRkVSOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVCdWZmZXI7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU1BR0U6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZUltYWdlOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0VWRU5UOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVFdmVudDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9RVUVSWV9QT09MOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2w7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVc6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlclZpZXc7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU1BR0VfVklFVzogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2VWaWV3OworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEU6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZVNoYWRlck1vZHVsZTsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRTogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZTsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVQ6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0OworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVSZW5kZXJQYXNzOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZTsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVQ6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXRMYXlvdXQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU0FNUExFUjogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlcjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0w6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0OworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVGcmFtZWJ1ZmZlcjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0w6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTjogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURTogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVTdXJmYWNlS0hSOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFI6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZVN3YXBjaGFpbktIUjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUjogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5TW9kZUtIUjsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfRVhUOiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlg6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZU9iamVjdFRhYmxlTlZYOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlg6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0VYVDogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlRGVidWdVdGlsc01lc3NlbmdlckVYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVDogcmV0dXJuIGtWdWxrYW5PYmplY3RUeXBlVmFsaWRhdGlvbkNhY2hlRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fSU5URUw6IHJldHVybiBrVnVsa2FuT2JqZWN0VHlwZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMOworICAgICAgICBkZWZhdWx0OiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVVbmtub3duOworICAgIH0KK307CisKK3N0YXRpYyBpbmxpbmUgVmtPYmplY3RUeXBlIGNvbnZlcnREZWJ1Z1JlcG9ydE9iamVjdFRvQ29yZU9iamVjdChWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBkZWJ1Z19yZXBvcnRfb2JqKSB7CisgICAgc3dpdGNoIChkZWJ1Z19yZXBvcnRfb2JqKSB7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfSU5TVEFOQ0U7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0U7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9ERVZJQ0U7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX1FVRVVFOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfU0VNQVBIT1JFOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfRkVOQ0U7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWTsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX0JVRkZFUjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfSU1BR0U7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VWRU5UX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX0VWRU5UOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVSWV9QT09MX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX1FVRVJZX1BPT0w7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVc7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRTsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEVfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEU7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVF9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVQ7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9QSVBFTElORTsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVDsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVDsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVJfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTF9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0w7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfREVCVUdfUkVQT1JUX0NBTExCQUNLX0VYVDsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9LSFJfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfRElTUExBWV9LSFI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFJfRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWF9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9OVlg7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUX0VYVDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhUOiByZXR1cm4gVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURTsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVl9FWFQ6IHJldHVybiBWS19PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gVktfT0JKRUNUX1RZUEVfVU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgY29udmVydENvcmVPYmplY3RUb0RlYnVnUmVwb3J0T2JqZWN0KFZrT2JqZWN0VHlwZSBjb3JlX3JlcG9ydF9vYmopIHsKKyAgICBzd2l0Y2ggKGNvcmVfcmVwb3J0X29iaikgeworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1VOS05PV046IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU5TVEFOQ0U6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRTogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFVklDRTogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1FVRVVFOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9TRU1BUEhPUkU6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUjogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfRkVOQ0U6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUlk6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfQlVGRkVSOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU1BR0U6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0VWRU5UOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VWRU5UX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9RVUVSWV9QT09MOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEU6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEU6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEVfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVDogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9QSVBFTElORTogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU0FNUExFUjogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0w6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVDogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVI6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVJfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTDogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0xfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTjogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUjogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUjogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUjogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUl9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUjogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX01PREVfS0hSX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfRVhUOiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhUOworICAgICAgICBjYXNlIFZLX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlg6IHJldHVybiBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfT0JKRUNUX1RBQkxFX05WWF9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWDogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTkRJUkVDVF9DT01NQU5EU19MQVlPVVRfTlZYX0VYVDsKKyAgICAgICAgY2FzZSBWS19PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVDogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVF9FWFQ7CisgICAgICAgIGNhc2UgVktfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVjogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVDsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVDsKKyAgICB9Cit9CisKKy8vIFRyYWl0cyBvYmplY3RzIGZyb20gZWFjaCB0eXBlIHN0YXRpY2FsbHkgbWFwIGZyb20gVms8aGFuZGxlVHlwZT4gdG8gdGhlIHZhcmlvdXMgZW51bXMKK3RlbXBsYXRlIDx0eXBlbmFtZSBWa1R5cGU+IHN0cnVjdCBWa0hhbmRsZUluZm8ge307Cit0ZW1wbGF0ZSA8VnVsa2FuT2JqZWN0VHlwZSBpZD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGxpbmUgbXVzdCBtYXRjaCB0aGUgdnVsa2FuX2NvcmUuaCBjb25kaXRpb24gZ3VhcmRpbmcgVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFCisjaWYgZGVmaW5lZChfX0xQNjRfXykgfHwgZGVmaW5lZChfV0lONjQpIHx8IChkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKF9fSUxQMzJfXykpIHx8IGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9faWE2NCkgfHwgICAgICAgICAgICAgICAgIGRlZmluZWQoX01fSUE2NCkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorI2RlZmluZSBUWVBFU0FGRV9OT05ESVNQQVRDSEFCTEVfSEFORExFUworI2Vsc2UKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShWa05vbkRpc3BhdGNoYWJsZUhhbmRsZSkKKwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa05vbkRpc3BhdGNoYWJsZUhhbmRsZT4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVVbmtub3duOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX1VOS05PV047CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrTm9uRGlzcGF0Y2hhYmxlSGFuZGxlIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlVW5rbm93bj4geworICAgIHR5cGVkZWYgVmtOb25EaXNwYXRjaGFibGVIYW5kbGUgVHlwZTsKK307CisKKyNlbmRpZiAvLyAgVktfREVGSU5FX0hBTkRMRSBsb2dpYyBkdXBsaWNhdGlvbgordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa0NvbW1hbmRCdWZmZXI+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlcjsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrQ29tbWFuZEJ1ZmZlciI7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWdWxrYW5PYmplY3RUeXBlSW5mbzxrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXI+IHsKKyAgICB0eXBlZGVmIFZrQ29tbWFuZEJ1ZmZlciBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtEZXZpY2U+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfREVWSUNFOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa0RldmljZSI7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWdWxrYW5PYmplY3RUeXBlSW5mbzxrVnVsa2FuT2JqZWN0VHlwZURldmljZT4geworICAgIHR5cGVkZWYgVmtEZXZpY2UgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrSW5zdGFuY2U+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2U7CisgICAgc3RhdGljIGNvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGtEZWJ1Z1JlcG9ydE9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0lOU1RBTkNFOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa0luc3RhbmNlIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlSW5zdGFuY2U+IHsKKyAgICB0eXBlZGVmIFZrSW5zdGFuY2UgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrUGh5c2ljYWxEZXZpY2U+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2U7CisgICAgc3RhdGljIGNvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGtEZWJ1Z1JlcG9ydE9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0U7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrUGh5c2ljYWxEZXZpY2UiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZT4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZSBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtRdWV1ZT4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVRdWV1ZTsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfUVVFVUU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrUXVldWUiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVRdWV1ZT4geworICAgIHR5cGVkZWYgVmtRdWV1ZSBUeXBlOworfTsKKyNpZmRlZiBUWVBFU0FGRV9OT05ESVNQQVRDSEFCTEVfSEFORExFUwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlZfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4geworICAgIHR5cGVkZWYgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtCdWZmZXI+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfQlVGRkVSOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa0J1ZmZlciI7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWdWxrYW5PYmplY3RUeXBlSW5mbzxrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcj4geworICAgIHR5cGVkZWYgVmtCdWZmZXIgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrQnVmZmVyVmlldz4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVCdWZmZXJWaWV3OworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9CVUZGRVJfVklFVzsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtCdWZmZXJWaWV3IjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldz4geworICAgIHR5cGVkZWYgVmtCdWZmZXJWaWV3IFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa0NvbW1hbmRQb29sPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTF9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa0NvbW1hbmRQb29sIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZFBvb2w+IHsKKyAgICB0eXBlZGVmIFZrQ29tbWFuZFBvb2wgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFRfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19FWFQ7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCI7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWdWxrYW5PYmplY3RUeXBlSW5mbzxrVnVsa2FuT2JqZWN0VHlwZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGtEZWJ1Z1JlcG9ydE9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlRGVidWdVdGlsc01lc3NlbmdlckVYVD4geworICAgIHR5cGVkZWYgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa0Rlc2NyaXB0b3JQb29sPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa0Rlc2NyaXB0b3JQb29sIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2w+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclBvb2wgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrRGVzY3JpcHRvclNldD4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0OworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtEZXNjcmlwdG9yU2V0IjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldD4geworICAgIHR5cGVkZWYgVmtEZXNjcmlwdG9yU2V0IFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa0Rlc2NyaXB0b3JTZXRMYXlvdXQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldExheW91dDsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtEZXNjcmlwdG9yU2V0TGF5b3V0IjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldExheW91dD4geworICAgIHR5cGVkZWYgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZT4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGU7CisgICAgc3RhdGljIGNvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGtEZWJ1Z1JlcG9ydE9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSI7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWdWxrYW5PYmplY3RUeXBlSW5mbzxrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZT4geworICAgIHR5cGVkZWYgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrRGV2aWNlTWVtb3J5PiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeTsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa0RldmljZU1lbW9yeSI7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWdWxrYW5PYmplY3RUeXBlSW5mbzxrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeT4geworICAgIHR5cGVkZWYgVmtEZXZpY2VNZW1vcnkgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrRGlzcGxheUtIUj4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5S0hSOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfS0hSX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9ESVNQTEFZX0tIUjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtEaXNwbGF5S0hSIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUj4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5S0hSIFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa0Rpc3BsYXlNb2RlS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlNb2RlS0hSOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFJfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0RJU1BMQVlfTU9ERV9LSFI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrRGlzcGxheU1vZGVLSFIiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5TW9kZUtIUj4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5TW9kZUtIUiBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtFdmVudD4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVFdmVudDsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfRVZFTlQ7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrRXZlbnQiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVFdmVudD4geworICAgIHR5cGVkZWYgVmtFdmVudCBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtGZW5jZT4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVGZW5jZTsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GRU5DRV9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfRkVOQ0U7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrRmVuY2UiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVGZW5jZT4geworICAgIHR5cGVkZWYgVmtGZW5jZSBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtGcmFtZWJ1ZmZlcj4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVGcmFtZWJ1ZmZlcjsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrRnJhbWVidWZmZXIiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVGcmFtZWJ1ZmZlcj4geworICAgIHR5cGVkZWYgVmtGcmFtZWJ1ZmZlciBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtJbWFnZT4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVJbWFnZTsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfSU1BR0U7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrSW1hZ2UiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVJbWFnZT4geworICAgIHR5cGVkZWYgVmtJbWFnZSBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtJbWFnZVZpZXc+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlSW1hZ2VWaWV3OworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVc7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrSW1hZ2VWaWV3IjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlSW1hZ2VWaWV3PiB7CisgICAgdHlwZWRlZiBWa0ltYWdlVmlldyBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlg7CisgICAgc3RhdGljIGNvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGtEZWJ1Z1JlcG9ydE9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWF9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWD4geworICAgIHR5cGVkZWYgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa09iamVjdFRhYmxlTlZYPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZU9iamVjdFRhYmxlTlZYOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlhfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX09CSkVDVF9UQUJMRV9OVlg7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrT2JqZWN0VGFibGVOVlgiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVPYmplY3RUYWJsZU5WWD4geworICAgIHR5cGVkZWYgVmtPYmplY3RUYWJsZU5WWCBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTD4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTDsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9QRVJGT1JNQU5DRV9DT05GSUdVUkFUSU9OX0lOVEVMOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrUGlwZWxpbmU+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmU7CisgICAgc3RhdGljIGNvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGtEZWJ1Z1JlcG9ydE9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX1BJUEVMSU5FOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa1BpcGVsaW5lIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmU+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmUgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrUGlwZWxpbmVDYWNoZT4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZUNhY2hlOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9QSVBFTElORV9DQUNIRTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtQaXBlbGluZUNhY2hlIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVDYWNoZT4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZUNhY2hlIFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa1BpcGVsaW5lTGF5b3V0PiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lTGF5b3V0OworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0xBWU9VVF9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa1BpcGVsaW5lTGF5b3V0IjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVMYXlvdXQgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrUXVlcnlQb29sPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZVF1ZXJ5UG9vbDsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVSWV9QT09MX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9RVUVSWV9QT09MOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa1F1ZXJ5UG9vbCI7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWdWxrYW5PYmplY3RUeXBlSW5mbzxrVnVsa2FuT2JqZWN0VHlwZVF1ZXJ5UG9vbD4geworICAgIHR5cGVkZWYgVmtRdWVyeVBvb2wgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrUmVuZGVyUGFzcz4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVSZW5kZXJQYXNzOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9SRU5ERVJfUEFTUzsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtSZW5kZXJQYXNzIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlUmVuZGVyUGFzcz4geworICAgIHR5cGVkZWYgVmtSZW5kZXJQYXNzIFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa1NhbXBsZXI+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlcjsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9TQU1QTEVSOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa1NhbXBsZXIiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyPiB7CisgICAgdHlwZWRlZiBWa1NhbXBsZXIgVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrU2FtcGxlclljYmNyQ29udmVyc2lvbj4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24iOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uPiB7CisgICAgdHlwZWRlZiBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gVHlwZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmtIYW5kbGVJbmZvPFZrU2VtYXBob3JlPiB7CisgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZVNlbWFwaG9yZTsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX1NFTUFQSE9SRTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtTZW1hcGhvcmUiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVTZW1hcGhvcmU+IHsKKyAgICB0eXBlZGVmIFZrU2VtYXBob3JlIFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa1NoYWRlck1vZHVsZT4geworICAgIHN0YXRpYyBjb25zdCBWdWxrYW5PYmplY3RUeXBlIGtWdWxrYW5PYmplY3RUeXBlID0ga1Z1bGthbk9iamVjdFR5cGVTaGFkZXJNb2R1bGU7CisgICAgc3RhdGljIGNvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGtEZWJ1Z1JlcG9ydE9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtTaGFkZXJNb2R1bGUiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVTaGFkZXJNb2R1bGU+IHsKKyAgICB0eXBlZGVmIFZrU2hhZGVyTW9kdWxlIFR5cGU7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzxWa1N1cmZhY2VLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlU3VyZmFjZUtIUjsKKyAgICBzdGF0aWMgY29uc3QgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQga0RlYnVnUmVwb3J0T2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQ7CisgICAgc3RhdGljIGNvbnN0IFZrT2JqZWN0VHlwZSBrVmtPYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfU1VSRkFDRV9LSFI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrU3VyZmFjZUtIUiI7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWdWxrYW5PYmplY3RUeXBlSW5mbzxrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZUtIUiBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtTd2FwY2hhaW5LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhUOworICAgIHN0YXRpYyBjb25zdCBWa09iamVjdFR5cGUga1ZrT2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVuYW1lKCkgeworICAgICAgICByZXR1cm4gIlZrU3dhcGNoYWluS0hSIjsKKyAgICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IFZ1bGthbk9iamVjdFR5cGVJbmZvPGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSPiB7CisgICAgdHlwZWRlZiBWa1N3YXBjaGFpbktIUiBUeXBlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBWa0hhbmRsZUluZm88VmtWYWxpZGF0aW9uQ2FjaGVFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVnVsa2FuT2JqZWN0VHlwZSBrVnVsa2FuT2JqZWN0VHlwZSA9IGtWdWxrYW5PYmplY3RUeXBlVmFsaWRhdGlvbkNhY2hlRVhUOworICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfRVhUX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0VYVDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogVHlwZW5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVmtWYWxpZGF0aW9uQ2FjaGVFWFQiOworICAgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88a1Z1bGthbk9iamVjdFR5cGVWYWxpZGF0aW9uQ2FjaGVFWFQ+IHsKKyAgICB0eXBlZGVmIFZrVmFsaWRhdGlvbkNhY2hlRVhUIFR5cGU7Cit9OworI2VuZGlmIC8vIFRZUEVTQUZFX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCitzdHJ1Y3QgVnVsa2FuVHlwZWRIYW5kbGUgeworICAgIHVpbnQ2NF90IGhhbmRsZTsKKyAgICBWdWxrYW5PYmplY3RUeXBlIHR5cGU7CisgICAgLy8gbm9kZSBpcyBvcHRpb25hbCwgYW5kIGlmIG5vbi1OVUxMIGlzIHVzZWQgdG8gYXZvaWQgYSBoYXNoIHRhYmxlIGxvb2t1cAorICAgIGNsYXNzIEJBU0VfTk9ERSAqbm9kZTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlPgorICAgIFZ1bGthblR5cGVkSGFuZGxlKEhhbmRsZSBoYW5kbGVfLCBWdWxrYW5PYmplY3RUeXBlIHR5cGVfLCBjbGFzcyBCQVNFX05PREUgKm5vZGVfID0gbnVsbHB0cikgOgorICAgICAgICBoYW5kbGUoQ2FzdFRvVWludDY0KGhhbmRsZV8pKSwKKyAgICAgICAgdHlwZSh0eXBlXyksCisgICAgICAgIG5vZGUobm9kZV8pIHsKKyNpZmRlZiBUWVBFU0FGRV9OT05ESVNQQVRDSEFCTEVfSEFORExFUworICAgICAgICAvLyBGb3IgMzIgYml0IGl0J3Mgbm90IGFsd2F5cyBzYWZlIHRvIGNoZWNrIGZvciB0cmFpdHMgPC0+IHR5cGUKKyAgICAgICAgLy8gYXMgYWxsIG5vbi1kaXNwYXRjaGFibGUgaGFuZGxlcyBoYXZlIHRoZSBzYW1lIHR5cGUtaWQgYW5kIHRodXMgdHJhaXRzLAorICAgICAgICAvLyBidXQgb24gNjQgYml0IHdlIGNhbiB2YWxpZGF0ZSB0aGUgcGFzc2VkIHR5cGUgbWF0Y2hlcyB0aGUgcGFzc2VkIGhhbmRsZQorICAgICAgICBhc3NlcnQodHlwZSA9PSBWa0hhbmRsZUluZm88SGFuZGxlPjo6a1Z1bGthbk9iamVjdFR5cGUpOworI2VuZGlmIC8vIFRZUEVTQUZFX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGU+CisgICAgSGFuZGxlIENhc3QoKSBjb25zdCB7CisjaWZkZWYgVFlQRVNBRkVfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKKyAgICAgICAgYXNzZXJ0KHR5cGUgPT0gVmtIYW5kbGVJbmZvPEhhbmRsZT46OmtWdWxrYW5PYmplY3RUeXBlKTsKKyNlbmRpZiAvLyBUWVBFU0FGRV9OT05ESVNQQVRDSEFCTEVfSEFORExFUworICAgICAgICByZXR1cm4gQ2FzdEZyb21VaW50NjQ8SGFuZGxlPihoYW5kbGUpOworICAgIH0KKyAgICBWdWxrYW5UeXBlZEhhbmRsZSgpIDoKKyAgICAgICAgaGFuZGxlKFZLX05VTExfSEFORExFKSwKKyAgICAgICAgdHlwZShrVnVsa2FuT2JqZWN0VHlwZVVua25vd24pLAorICAgICAgICBub2RlKG51bGxwdHIpIHt9Cit9OworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX3NhZmVfc3RydWN0LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdmtfc2FmZV9zdHJ1Y3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZWU5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX3NhZmVfc3RydWN0LmNwcApAQCAtMCwwICsxLDMxMzIxIEBACisvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKgorLy8gU2VlIGhlbHBlcl9maWxlX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leWdvQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZvcmJlc0Bnb29nbGUuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZjxqenVsYXVmQGx1bmFyZy5jb20+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgInZrX3NhZmVfc3RydWN0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDx2dWxrYW4vdmtfbGF5ZXIuaD4KKworCitzYWZlX1ZrQXBwbGljYXRpb25JbmZvOjpzYWZlX1ZrQXBwbGljYXRpb25JbmZvKGNvbnN0IFZrQXBwbGljYXRpb25JbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBhcHBsaWNhdGlvblZlcnNpb24oaW5fc3RydWN0LT5hcHBsaWNhdGlvblZlcnNpb24pLAorICAgIGVuZ2luZVZlcnNpb24oaW5fc3RydWN0LT5lbmdpbmVWZXJzaW9uKSwKKyAgICBhcGlWZXJzaW9uKGluX3N0cnVjdC0+YXBpVmVyc2lvbikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgcEFwcGxpY2F0aW9uTmFtZSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cEFwcGxpY2F0aW9uTmFtZSk7CisgICAgcEVuZ2luZU5hbWUgPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnBFbmdpbmVOYW1lKTsKK30KKworc2FmZV9Wa0FwcGxpY2F0aW9uSW5mbzo6c2FmZV9Wa0FwcGxpY2F0aW9uSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwQXBwbGljYXRpb25OYW1lKG51bGxwdHIpLAorICAgIHBFbmdpbmVOYW1lKG51bGxwdHIpCit7fQorCitzYWZlX1ZrQXBwbGljYXRpb25JbmZvOjpzYWZlX1ZrQXBwbGljYXRpb25JbmZvKGNvbnN0IHNhZmVfVmtBcHBsaWNhdGlvbkluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhcHBsaWNhdGlvblZlcnNpb24gPSBzcmMuYXBwbGljYXRpb25WZXJzaW9uOworICAgIGVuZ2luZVZlcnNpb24gPSBzcmMuZW5naW5lVmVyc2lvbjsKKyAgICBhcGlWZXJzaW9uID0gc3JjLmFwaVZlcnNpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgcEFwcGxpY2F0aW9uTmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wQXBwbGljYXRpb25OYW1lKTsKKyAgICBwRW5naW5lTmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wRW5naW5lTmFtZSk7Cit9CisKK3NhZmVfVmtBcHBsaWNhdGlvbkluZm8mIHNhZmVfVmtBcHBsaWNhdGlvbkluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQXBwbGljYXRpb25JbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBBcHBsaWNhdGlvbk5hbWUpIGRlbGV0ZSBbXSBwQXBwbGljYXRpb25OYW1lOworICAgIGlmIChwRW5naW5lTmFtZSkgZGVsZXRlIFtdIHBFbmdpbmVOYW1lOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYXBwbGljYXRpb25WZXJzaW9uID0gc3JjLmFwcGxpY2F0aW9uVmVyc2lvbjsKKyAgICBlbmdpbmVWZXJzaW9uID0gc3JjLmVuZ2luZVZlcnNpb247CisgICAgYXBpVmVyc2lvbiA9IHNyYy5hcGlWZXJzaW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIHBBcHBsaWNhdGlvbk5hbWUgPSBTYWZlU3RyaW5nQ29weShzcmMucEFwcGxpY2F0aW9uTmFtZSk7CisgICAgcEVuZ2luZU5hbWUgPSBTYWZlU3RyaW5nQ29weShzcmMucEVuZ2luZU5hbWUpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQXBwbGljYXRpb25JbmZvOjp+c2FmZV9Wa0FwcGxpY2F0aW9uSW5mbygpCit7CisgICAgaWYgKHBBcHBsaWNhdGlvbk5hbWUpIGRlbGV0ZSBbXSBwQXBwbGljYXRpb25OYW1lOworICAgIGlmIChwRW5naW5lTmFtZSkgZGVsZXRlIFtdIHBFbmdpbmVOYW1lOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBcHBsaWNhdGlvbkluZm86OmluaXRpYWxpemUoY29uc3QgVmtBcHBsaWNhdGlvbkluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYXBwbGljYXRpb25WZXJzaW9uID0gaW5fc3RydWN0LT5hcHBsaWNhdGlvblZlcnNpb247CisgICAgZW5naW5lVmVyc2lvbiA9IGluX3N0cnVjdC0+ZW5naW5lVmVyc2lvbjsKKyAgICBhcGlWZXJzaW9uID0gaW5fc3RydWN0LT5hcGlWZXJzaW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBwQXBwbGljYXRpb25OYW1lID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wQXBwbGljYXRpb25OYW1lKTsKKyAgICBwRW5naW5lTmFtZSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cEVuZ2luZU5hbWUpOworfQorCit2b2lkIHNhZmVfVmtBcHBsaWNhdGlvbkluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0FwcGxpY2F0aW9uSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBhcHBsaWNhdGlvblZlcnNpb24gPSBzcmMtPmFwcGxpY2F0aW9uVmVyc2lvbjsKKyAgICBlbmdpbmVWZXJzaW9uID0gc3JjLT5lbmdpbmVWZXJzaW9uOworICAgIGFwaVZlcnNpb24gPSBzcmMtPmFwaVZlcnNpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIHBBcHBsaWNhdGlvbk5hbWUgPSBTYWZlU3RyaW5nQ29weShzcmMtPnBBcHBsaWNhdGlvbk5hbWUpOworICAgIHBFbmdpbmVOYW1lID0gU2FmZVN0cmluZ0NvcHkoc3JjLT5wRW5naW5lTmFtZSk7Cit9CisKK3NhZmVfVmtJbnN0YW5jZUNyZWF0ZUluZm86OnNhZmVfVmtJbnN0YW5jZUNyZWF0ZUluZm8oY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHBBcHBsaWNhdGlvbkluZm8obnVsbHB0ciksCisgICAgZW5hYmxlZExheWVyQ291bnQoaW5fc3RydWN0LT5lbmFibGVkTGF5ZXJDb3VudCksCisgICAgZW5hYmxlZEV4dGVuc2lvbkNvdW50KGluX3N0cnVjdC0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBjaGFyICoqdG1wX3BwRW5hYmxlZExheWVyTmFtZXMgPSBuZXcgY2hhciAqW2luX3N0cnVjdC0+ZW5hYmxlZExheWVyQ291bnRdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbmFibGVkTGF5ZXJDb3VudDsgKytpKSB7CisgICAgICAgIHRtcF9wcEVuYWJsZWRMYXllck5hbWVzW2ldID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wcEVuYWJsZWRMYXllck5hbWVzW2ldKTsKKyAgICB9CisgICAgcHBFbmFibGVkTGF5ZXJOYW1lcyA9IHRtcF9wcEVuYWJsZWRMYXllck5hbWVzOworICAgIGNoYXIgKip0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBuZXcgY2hhciAqW2luX3N0cnVjdC0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZEV4dGVuc2lvbkNvdW50OyArK2kpIHsKKyAgICAgICAgdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgfQorICAgIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgIGlmIChpbl9zdHJ1Y3QtPnBBcHBsaWNhdGlvbkluZm8pCisgICAgICAgIHBBcHBsaWNhdGlvbkluZm8gPSBuZXcgc2FmZV9Wa0FwcGxpY2F0aW9uSW5mbyhpbl9zdHJ1Y3QtPnBBcHBsaWNhdGlvbkluZm8pOworfQorCitzYWZlX1ZrSW5zdGFuY2VDcmVhdGVJbmZvOjpzYWZlX1ZrSW5zdGFuY2VDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBBcHBsaWNhdGlvbkluZm8obnVsbHB0ciksCisgICAgcHBFbmFibGVkTGF5ZXJOYW1lcyhudWxscHRyKSwKKyAgICBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyhudWxscHRyKQore30KKworc2FmZV9Wa0luc3RhbmNlQ3JlYXRlSW5mbzo6c2FmZV9Wa0luc3RhbmNlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrSW5zdGFuY2VDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcEFwcGxpY2F0aW9uSW5mbyA9IG51bGxwdHI7CisgICAgZW5hYmxlZExheWVyQ291bnQgPSBzcmMuZW5hYmxlZExheWVyQ291bnQ7CisgICAgZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gc3JjLmVuYWJsZWRFeHRlbnNpb25Db3VudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBjaGFyICoqdG1wX3BwRW5hYmxlZExheWVyTmFtZXMgPSBuZXcgY2hhciAqW3NyYy5lbmFibGVkTGF5ZXJDb3VudF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRMYXllckNvdW50OyArK2kpIHsKKyAgICAgICAgdG1wX3BwRW5hYmxlZExheWVyTmFtZXNbaV0gPSBTYWZlU3RyaW5nQ29weShzcmMucHBFbmFibGVkTGF5ZXJOYW1lc1tpXSk7CisgICAgfQorICAgIHBwRW5hYmxlZExheWVyTmFtZXMgPSB0bXBfcHBFbmFibGVkTGF5ZXJOYW1lczsKKyAgICBjaGFyICoqdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gbmV3IGNoYXIgKltzcmMuZW5hYmxlZEV4dGVuc2lvbkNvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZEV4dGVuc2lvbkNvdW50OyArK2kpIHsKKyAgICAgICAgdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldID0gU2FmZVN0cmluZ0NvcHkoc3JjLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICB9CisgICAgcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSB0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXM7CisgICAgaWYgKHNyYy5wQXBwbGljYXRpb25JbmZvKQorICAgICAgICBwQXBwbGljYXRpb25JbmZvID0gbmV3IHNhZmVfVmtBcHBsaWNhdGlvbkluZm8oKnNyYy5wQXBwbGljYXRpb25JbmZvKTsKK30KKworc2FmZV9Wa0luc3RhbmNlQ3JlYXRlSW5mbyYgc2FmZV9Wa0luc3RhbmNlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbnN0YW5jZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEFwcGxpY2F0aW9uSW5mbykKKyAgICAgICAgZGVsZXRlIHBBcHBsaWNhdGlvbkluZm87CisgICAgaWYgKHBwRW5hYmxlZExheWVyTmFtZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRMYXllckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBwcEVuYWJsZWRMYXllck5hbWVzW2ldOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBbXSBwcEVuYWJsZWRMYXllck5hbWVzOworICAgIH0KKyAgICBpZiAocHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRFeHRlbnNpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBkZWxldGUgW10gcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIFtdIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgIH0KKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBBcHBsaWNhdGlvbkluZm8gPSBudWxscHRyOworICAgIGVuYWJsZWRMYXllckNvdW50ID0gc3JjLmVuYWJsZWRMYXllckNvdW50OworICAgIGVuYWJsZWRFeHRlbnNpb25Db3VudCA9IHNyYy5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgY2hhciAqKnRtcF9wcEVuYWJsZWRMYXllck5hbWVzID0gbmV3IGNoYXIgKltzcmMuZW5hYmxlZExheWVyQ291bnRdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbmFibGVkTGF5ZXJDb3VudDsgKytpKSB7CisgICAgICAgIHRtcF9wcEVuYWJsZWRMYXllck5hbWVzW2ldID0gU2FmZVN0cmluZ0NvcHkoc3JjLnBwRW5hYmxlZExheWVyTmFtZXNbaV0pOworICAgIH0KKyAgICBwcEVuYWJsZWRMYXllck5hbWVzID0gdG1wX3BwRW5hYmxlZExheWVyTmFtZXM7CisgICAgY2hhciAqKnRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IG5ldyBjaGFyICpbc3JjLmVuYWJsZWRFeHRlbnNpb25Db3VudF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRFeHRlbnNpb25Db3VudDsgKytpKSB7CisgICAgICAgIHRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgfQorICAgIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgIGlmIChzcmMucEFwcGxpY2F0aW9uSW5mbykKKyAgICAgICAgcEFwcGxpY2F0aW9uSW5mbyA9IG5ldyBzYWZlX1ZrQXBwbGljYXRpb25JbmZvKCpzcmMucEFwcGxpY2F0aW9uSW5mbyk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtJbnN0YW5jZUNyZWF0ZUluZm86On5zYWZlX1ZrSW5zdGFuY2VDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocEFwcGxpY2F0aW9uSW5mbykKKyAgICAgICAgZGVsZXRlIHBBcHBsaWNhdGlvbkluZm87CisgICAgaWYgKHBwRW5hYmxlZExheWVyTmFtZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRMYXllckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBwcEVuYWJsZWRMYXllck5hbWVzW2ldOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBbXSBwcEVuYWJsZWRMYXllck5hbWVzOworICAgIH0KKyAgICBpZiAocHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRFeHRlbnNpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBkZWxldGUgW10gcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIFtdIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgIH0KKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW5zdGFuY2VDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBwQXBwbGljYXRpb25JbmZvID0gbnVsbHB0cjsKKyAgICBlbmFibGVkTGF5ZXJDb3VudCA9IGluX3N0cnVjdC0+ZW5hYmxlZExheWVyQ291bnQ7CisgICAgZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gaW5fc3RydWN0LT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGNoYXIgKip0bXBfcHBFbmFibGVkTGF5ZXJOYW1lcyA9IG5ldyBjaGFyICpbaW5fc3RydWN0LT5lbmFibGVkTGF5ZXJDb3VudF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRMYXllckNvdW50OyArK2kpIHsKKyAgICAgICAgdG1wX3BwRW5hYmxlZExheWVyTmFtZXNbaV0gPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnBwRW5hYmxlZExheWVyTmFtZXNbaV0pOworICAgIH0KKyAgICBwcEVuYWJsZWRMYXllck5hbWVzID0gdG1wX3BwRW5hYmxlZExheWVyTmFtZXM7CisgICAgY2hhciAqKnRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IG5ldyBjaGFyICpbaW5fc3RydWN0LT5lbmFibGVkRXh0ZW5zaW9uQ291bnRdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbmFibGVkRXh0ZW5zaW9uQ291bnQ7ICsraSkgeworICAgICAgICB0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0gPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICB9CisgICAgcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSB0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXM7CisgICAgaWYgKGluX3N0cnVjdC0+cEFwcGxpY2F0aW9uSW5mbykKKyAgICAgICAgcEFwcGxpY2F0aW9uSW5mbyA9IG5ldyBzYWZlX1ZrQXBwbGljYXRpb25JbmZvKGluX3N0cnVjdC0+cEFwcGxpY2F0aW9uSW5mbyk7Cit9CisKK3ZvaWQgc2FmZV9Wa0luc3RhbmNlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW5zdGFuY2VDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBwQXBwbGljYXRpb25JbmZvID0gbnVsbHB0cjsKKyAgICBlbmFibGVkTGF5ZXJDb3VudCA9IHNyYy0+ZW5hYmxlZExheWVyQ291bnQ7CisgICAgZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gc3JjLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGNoYXIgKip0bXBfcHBFbmFibGVkTGF5ZXJOYW1lcyA9IG5ldyBjaGFyICpbc3JjLT5lbmFibGVkTGF5ZXJDb3VudF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRMYXllckNvdW50OyArK2kpIHsKKyAgICAgICAgdG1wX3BwRW5hYmxlZExheWVyTmFtZXNbaV0gPSBTYWZlU3RyaW5nQ29weShzcmMtPnBwRW5hYmxlZExheWVyTmFtZXNbaV0pOworICAgIH0KKyAgICBwcEVuYWJsZWRMYXllck5hbWVzID0gdG1wX3BwRW5hYmxlZExheWVyTmFtZXM7CisgICAgY2hhciAqKnRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IG5ldyBjaGFyICpbc3JjLT5lbmFibGVkRXh0ZW5zaW9uQ291bnRdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbmFibGVkRXh0ZW5zaW9uQ291bnQ7ICsraSkgeworICAgICAgICB0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0gPSBTYWZlU3RyaW5nQ29weShzcmMtPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICB9CisgICAgcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSB0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXM7CisgICAgaWYgKHNyYy0+cEFwcGxpY2F0aW9uSW5mbykKKyAgICAgICAgcEFwcGxpY2F0aW9uSW5mbyA9IG5ldyBzYWZlX1ZrQXBwbGljYXRpb25JbmZvKCpzcmMtPnBBcHBsaWNhdGlvbkluZm8pOworfQorCitzYWZlX1ZrQWxsb2NhdGlvbkNhbGxiYWNrczo6c2FmZV9Wa0FsbG9jYXRpb25DYWxsYmFja3MoY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBpbl9zdHJ1Y3QpIDoKKyAgICBwVXNlckRhdGEoaW5fc3RydWN0LT5wVXNlckRhdGEpLAorICAgIHBmbkFsbG9jYXRpb24oaW5fc3RydWN0LT5wZm5BbGxvY2F0aW9uKSwKKyAgICBwZm5SZWFsbG9jYXRpb24oaW5fc3RydWN0LT5wZm5SZWFsbG9jYXRpb24pLAorICAgIHBmbkZyZWUoaW5fc3RydWN0LT5wZm5GcmVlKSwKKyAgICBwZm5JbnRlcm5hbEFsbG9jYXRpb24oaW5fc3RydWN0LT5wZm5JbnRlcm5hbEFsbG9jYXRpb24pLAorICAgIHBmbkludGVybmFsRnJlZShpbl9zdHJ1Y3QtPnBmbkludGVybmFsRnJlZSkKK3sKK30KKworc2FmZV9Wa0FsbG9jYXRpb25DYWxsYmFja3M6OnNhZmVfVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKCkgOgorICAgIHBVc2VyRGF0YShudWxscHRyKQore30KKworc2FmZV9Wa0FsbG9jYXRpb25DYWxsYmFja3M6OnNhZmVfVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKGNvbnN0IHNhZmVfVmtBbGxvY2F0aW9uQ2FsbGJhY2tzJiBzcmMpCit7CisgICAgcFVzZXJEYXRhID0gc3JjLnBVc2VyRGF0YTsKKyAgICBwZm5BbGxvY2F0aW9uID0gc3JjLnBmbkFsbG9jYXRpb247CisgICAgcGZuUmVhbGxvY2F0aW9uID0gc3JjLnBmblJlYWxsb2NhdGlvbjsKKyAgICBwZm5GcmVlID0gc3JjLnBmbkZyZWU7CisgICAgcGZuSW50ZXJuYWxBbGxvY2F0aW9uID0gc3JjLnBmbkludGVybmFsQWxsb2NhdGlvbjsKKyAgICBwZm5JbnRlcm5hbEZyZWUgPSBzcmMucGZuSW50ZXJuYWxGcmVlOworfQorCitzYWZlX1ZrQWxsb2NhdGlvbkNhbGxiYWNrcyYgc2FmZV9Wa0FsbG9jYXRpb25DYWxsYmFja3M6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQWxsb2NhdGlvbkNhbGxiYWNrcyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworCisgICAgcFVzZXJEYXRhID0gc3JjLnBVc2VyRGF0YTsKKyAgICBwZm5BbGxvY2F0aW9uID0gc3JjLnBmbkFsbG9jYXRpb247CisgICAgcGZuUmVhbGxvY2F0aW9uID0gc3JjLnBmblJlYWxsb2NhdGlvbjsKKyAgICBwZm5GcmVlID0gc3JjLnBmbkZyZWU7CisgICAgcGZuSW50ZXJuYWxBbGxvY2F0aW9uID0gc3JjLnBmbkludGVybmFsQWxsb2NhdGlvbjsKKyAgICBwZm5JbnRlcm5hbEZyZWUgPSBzcmMucGZuSW50ZXJuYWxGcmVlOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQWxsb2NhdGlvbkNhbGxiYWNrczo6fnNhZmVfVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKCkKK3sKK30KKwordm9pZCBzYWZlX1ZrQWxsb2NhdGlvbkNhbGxiYWNrczo6aW5pdGlhbGl6ZShjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIGluX3N0cnVjdCkKK3sKKyAgICBwVXNlckRhdGEgPSBpbl9zdHJ1Y3QtPnBVc2VyRGF0YTsKKyAgICBwZm5BbGxvY2F0aW9uID0gaW5fc3RydWN0LT5wZm5BbGxvY2F0aW9uOworICAgIHBmblJlYWxsb2NhdGlvbiA9IGluX3N0cnVjdC0+cGZuUmVhbGxvY2F0aW9uOworICAgIHBmbkZyZWUgPSBpbl9zdHJ1Y3QtPnBmbkZyZWU7CisgICAgcGZuSW50ZXJuYWxBbGxvY2F0aW9uID0gaW5fc3RydWN0LT5wZm5JbnRlcm5hbEFsbG9jYXRpb247CisgICAgcGZuSW50ZXJuYWxGcmVlID0gaW5fc3RydWN0LT5wZm5JbnRlcm5hbEZyZWU7Cit9CisKK3ZvaWQgc2FmZV9Wa0FsbG9jYXRpb25DYWxsYmFja3M6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0FsbG9jYXRpb25DYWxsYmFja3MqIHNyYykKK3sKKyAgICBwVXNlckRhdGEgPSBzcmMtPnBVc2VyRGF0YTsKKyAgICBwZm5BbGxvY2F0aW9uID0gc3JjLT5wZm5BbGxvY2F0aW9uOworICAgIHBmblJlYWxsb2NhdGlvbiA9IHNyYy0+cGZuUmVhbGxvY2F0aW9uOworICAgIHBmbkZyZWUgPSBzcmMtPnBmbkZyZWU7CisgICAgcGZuSW50ZXJuYWxBbGxvY2F0aW9uID0gc3JjLT5wZm5JbnRlcm5hbEFsbG9jYXRpb247CisgICAgcGZuSW50ZXJuYWxGcmVlID0gc3JjLT5wZm5JbnRlcm5hbEZyZWU7Cit9CisKK3NhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm86OnNhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8oY29uc3QgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHF1ZXVlRmFtaWx5SW5kZXgoaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4KSwKKyAgICBxdWV1ZUNvdW50KGluX3N0cnVjdC0+cXVldWVDb3VudCksCisgICAgcFF1ZXVlUHJpb3JpdGllcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wUXVldWVQcmlvcml0aWVzKSB7CisgICAgICAgIHBRdWV1ZVByaW9yaXRpZXMgPSBuZXcgZmxvYXRbaW5fc3RydWN0LT5xdWV1ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZVByaW9yaXRpZXMsICh2b2lkICopaW5fc3RydWN0LT5wUXVldWVQcmlvcml0aWVzLCBzaXplb2YoZmxvYXQpKmluX3N0cnVjdC0+cXVldWVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvOjpzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBRdWV1ZVByaW9yaXRpZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm86OnNhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHF1ZXVlRmFtaWx5SW5kZXggPSBzcmMucXVldWVGYW1pbHlJbmRleDsKKyAgICBxdWV1ZUNvdW50ID0gc3JjLnF1ZXVlQ291bnQ7CisgICAgcFF1ZXVlUHJpb3JpdGllcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wUXVldWVQcmlvcml0aWVzKSB7CisgICAgICAgIHBRdWV1ZVByaW9yaXRpZXMgPSBuZXcgZmxvYXRbc3JjLnF1ZXVlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlUHJpb3JpdGllcywgKHZvaWQgKilzcmMucFF1ZXVlUHJpb3JpdGllcywgc2l6ZW9mKGZsb2F0KSpzcmMucXVldWVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvJiBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwUXVldWVQcmlvcml0aWVzKQorICAgICAgICBkZWxldGVbXSBwUXVldWVQcmlvcml0aWVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcXVldWVGYW1pbHlJbmRleCA9IHNyYy5xdWV1ZUZhbWlseUluZGV4OworICAgIHF1ZXVlQ291bnQgPSBzcmMucXVldWVDb3VudDsKKyAgICBwUXVldWVQcmlvcml0aWVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBRdWV1ZVByaW9yaXRpZXMpIHsKKyAgICAgICAgcFF1ZXVlUHJpb3JpdGllcyA9IG5ldyBmbG9hdFtzcmMucXVldWVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUXVldWVQcmlvcml0aWVzLCAodm9pZCAqKXNyYy5wUXVldWVQcmlvcml0aWVzLCBzaXplb2YoZmxvYXQpKnNyYy5xdWV1ZUNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm86On5zYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocFF1ZXVlUHJpb3JpdGllcykKKyAgICAgICAgZGVsZXRlW10gcFF1ZXVlUHJpb3JpdGllczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBxdWV1ZUZhbWlseUluZGV4ID0gaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4OworICAgIHF1ZXVlQ291bnQgPSBpbl9zdHJ1Y3QtPnF1ZXVlQ291bnQ7CisgICAgcFF1ZXVlUHJpb3JpdGllcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBRdWV1ZVByaW9yaXRpZXMpIHsKKyAgICAgICAgcFF1ZXVlUHJpb3JpdGllcyA9IG5ldyBmbG9hdFtpbl9zdHJ1Y3QtPnF1ZXVlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlUHJpb3JpdGllcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBRdWV1ZVByaW9yaXRpZXMsIHNpemVvZihmbG9hdCkqaW5fc3RydWN0LT5xdWV1ZUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBxdWV1ZUZhbWlseUluZGV4ID0gc3JjLT5xdWV1ZUZhbWlseUluZGV4OworICAgIHF1ZXVlQ291bnQgPSBzcmMtPnF1ZXVlQ291bnQ7CisgICAgcFF1ZXVlUHJpb3JpdGllcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBRdWV1ZVByaW9yaXRpZXMpIHsKKyAgICAgICAgcFF1ZXVlUHJpb3JpdGllcyA9IG5ldyBmbG9hdFtzcmMtPnF1ZXVlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlUHJpb3JpdGllcywgKHZvaWQgKilzcmMtPnBRdWV1ZVByaW9yaXRpZXMsIHNpemVvZihmbG9hdCkqc3JjLT5xdWV1ZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXZpY2VDcmVhdGVJbmZvOjpzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbyhjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHF1ZXVlQ3JlYXRlSW5mb0NvdW50KGluX3N0cnVjdC0+cXVldWVDcmVhdGVJbmZvQ291bnQpLAorICAgIHBRdWV1ZUNyZWF0ZUluZm9zKG51bGxwdHIpLAorICAgIGVuYWJsZWRMYXllckNvdW50KGluX3N0cnVjdC0+ZW5hYmxlZExheWVyQ291bnQpLAorICAgIGVuYWJsZWRFeHRlbnNpb25Db3VudChpbl9zdHJ1Y3QtPmVuYWJsZWRFeHRlbnNpb25Db3VudCksCisgICAgcEVuYWJsZWRGZWF0dXJlcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBjaGFyICoqdG1wX3BwRW5hYmxlZExheWVyTmFtZXMgPSBuZXcgY2hhciAqW2luX3N0cnVjdC0+ZW5hYmxlZExheWVyQ291bnRdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbmFibGVkTGF5ZXJDb3VudDsgKytpKSB7CisgICAgICAgIHRtcF9wcEVuYWJsZWRMYXllck5hbWVzW2ldID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wcEVuYWJsZWRMYXllck5hbWVzW2ldKTsKKyAgICB9CisgICAgcHBFbmFibGVkTGF5ZXJOYW1lcyA9IHRtcF9wcEVuYWJsZWRMYXllck5hbWVzOworICAgIGNoYXIgKip0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBuZXcgY2hhciAqW2luX3N0cnVjdC0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZEV4dGVuc2lvbkNvdW50OyArK2kpIHsKKyAgICAgICAgdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgfQorICAgIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgIGlmIChxdWV1ZUNyZWF0ZUluZm9Db3VudCAmJiBpbl9zdHJ1Y3QtPnBRdWV1ZUNyZWF0ZUluZm9zKSB7CisgICAgICAgIHBRdWV1ZUNyZWF0ZUluZm9zID0gbmV3IHNhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm9bcXVldWVDcmVhdGVJbmZvQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVDcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFF1ZXVlQ3JlYXRlSW5mb3NbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wUXVldWVDcmVhdGVJbmZvc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cEVuYWJsZWRGZWF0dXJlcykgeworICAgICAgICBwRW5hYmxlZEZlYXR1cmVzID0gbmV3IFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcygqaW5fc3RydWN0LT5wRW5hYmxlZEZlYXR1cmVzKTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXZpY2VDcmVhdGVJbmZvOjpzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwUXVldWVDcmVhdGVJbmZvcyhudWxscHRyKSwKKyAgICBwcEVuYWJsZWRMYXllck5hbWVzKG51bGxwdHIpLAorICAgIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKG51bGxwdHIpLAorICAgIHBFbmFibGVkRmVhdHVyZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXZpY2VDcmVhdGVJbmZvOjpzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gc3JjLnF1ZXVlQ3JlYXRlSW5mb0NvdW50OworICAgIHBRdWV1ZUNyZWF0ZUluZm9zID0gbnVsbHB0cjsKKyAgICBlbmFibGVkTGF5ZXJDb3VudCA9IHNyYy5lbmFibGVkTGF5ZXJDb3VudDsKKyAgICBlbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBzcmMuZW5hYmxlZEV4dGVuc2lvbkNvdW50OworICAgIHBFbmFibGVkRmVhdHVyZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGNoYXIgKip0bXBfcHBFbmFibGVkTGF5ZXJOYW1lcyA9IG5ldyBjaGFyICpbc3JjLmVuYWJsZWRMYXllckNvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZExheWVyQ291bnQ7ICsraSkgeworICAgICAgICB0bXBfcHBFbmFibGVkTGF5ZXJOYW1lc1tpXSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wcEVuYWJsZWRMYXllck5hbWVzW2ldKTsKKyAgICB9CisgICAgcHBFbmFibGVkTGF5ZXJOYW1lcyA9IHRtcF9wcEVuYWJsZWRMYXllck5hbWVzOworICAgIGNoYXIgKip0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBuZXcgY2hhciAqW3NyYy5lbmFibGVkRXh0ZW5zaW9uQ291bnRdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbmFibGVkRXh0ZW5zaW9uQ291bnQ7ICsraSkgeworICAgICAgICB0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0gPSBTYWZlU3RyaW5nQ29weShzcmMucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgIH0KKyAgICBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IHRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lczsKKyAgICBpZiAocXVldWVDcmVhdGVJbmZvQ291bnQgJiYgc3JjLnBRdWV1ZUNyZWF0ZUluZm9zKSB7CisgICAgICAgIHBRdWV1ZUNyZWF0ZUluZm9zID0gbmV3IHNhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm9bcXVldWVDcmVhdGVJbmZvQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVDcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFF1ZXVlQ3JlYXRlSW5mb3NbaV0uaW5pdGlhbGl6ZSgmc3JjLnBRdWV1ZUNyZWF0ZUluZm9zW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3JjLnBFbmFibGVkRmVhdHVyZXMpIHsKKyAgICAgICAgcEVuYWJsZWRGZWF0dXJlcyA9IG5ldyBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMoKnNyYy5wRW5hYmxlZEZlYXR1cmVzKTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXZpY2VDcmVhdGVJbmZvJiBzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBRdWV1ZUNyZWF0ZUluZm9zKQorICAgICAgICBkZWxldGVbXSBwUXVldWVDcmVhdGVJbmZvczsKKyAgICBpZiAocHBFbmFibGVkTGF5ZXJOYW1lcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZExheWVyQ291bnQ7ICsraSkgeworICAgICAgICAgICAgZGVsZXRlIFtdIHBwRW5hYmxlZExheWVyTmFtZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIFtdIHBwRW5hYmxlZExheWVyTmFtZXM7CisgICAgfQorICAgIGlmIChwcEVuYWJsZWRFeHRlbnNpb25OYW1lcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZEV4dGVuc2lvbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBwcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgW10gcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXM7CisgICAgfQorICAgIGlmIChwRW5hYmxlZEZlYXR1cmVzKQorICAgICAgICBkZWxldGUgcEVuYWJsZWRGZWF0dXJlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gc3JjLnF1ZXVlQ3JlYXRlSW5mb0NvdW50OworICAgIHBRdWV1ZUNyZWF0ZUluZm9zID0gbnVsbHB0cjsKKyAgICBlbmFibGVkTGF5ZXJDb3VudCA9IHNyYy5lbmFibGVkTGF5ZXJDb3VudDsKKyAgICBlbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBzcmMuZW5hYmxlZEV4dGVuc2lvbkNvdW50OworICAgIHBFbmFibGVkRmVhdHVyZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGNoYXIgKip0bXBfcHBFbmFibGVkTGF5ZXJOYW1lcyA9IG5ldyBjaGFyICpbc3JjLmVuYWJsZWRMYXllckNvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZExheWVyQ291bnQ7ICsraSkgeworICAgICAgICB0bXBfcHBFbmFibGVkTGF5ZXJOYW1lc1tpXSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wcEVuYWJsZWRMYXllck5hbWVzW2ldKTsKKyAgICB9CisgICAgcHBFbmFibGVkTGF5ZXJOYW1lcyA9IHRtcF9wcEVuYWJsZWRMYXllck5hbWVzOworICAgIGNoYXIgKip0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBuZXcgY2hhciAqW3NyYy5lbmFibGVkRXh0ZW5zaW9uQ291bnRdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbmFibGVkRXh0ZW5zaW9uQ291bnQ7ICsraSkgeworICAgICAgICB0bXBfcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0gPSBTYWZlU3RyaW5nQ29weShzcmMucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgIH0KKyAgICBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IHRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lczsKKyAgICBpZiAocXVldWVDcmVhdGVJbmZvQ291bnQgJiYgc3JjLnBRdWV1ZUNyZWF0ZUluZm9zKSB7CisgICAgICAgIHBRdWV1ZUNyZWF0ZUluZm9zID0gbmV3IHNhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm9bcXVldWVDcmVhdGVJbmZvQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVDcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFF1ZXVlQ3JlYXRlSW5mb3NbaV0uaW5pdGlhbGl6ZSgmc3JjLnBRdWV1ZUNyZWF0ZUluZm9zW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3JjLnBFbmFibGVkRmVhdHVyZXMpIHsKKyAgICAgICAgcEVuYWJsZWRGZWF0dXJlcyA9IG5ldyBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMoKnNyYy5wRW5hYmxlZEZlYXR1cmVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXZpY2VDcmVhdGVJbmZvOjp+c2FmZV9Wa0RldmljZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwUXVldWVDcmVhdGVJbmZvcykKKyAgICAgICAgZGVsZXRlW10gcFF1ZXVlQ3JlYXRlSW5mb3M7CisgICAgaWYgKHBwRW5hYmxlZExheWVyTmFtZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRMYXllckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBwcEVuYWJsZWRMYXllck5hbWVzW2ldOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBbXSBwcEVuYWJsZWRMYXllck5hbWVzOworICAgIH0KKyAgICBpZiAocHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRFeHRlbnNpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBkZWxldGUgW10gcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIFtdIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgIH0KKyAgICBpZiAocEVuYWJsZWRGZWF0dXJlcykKKyAgICAgICAgZGVsZXRlIHBFbmFibGVkRmVhdHVyZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBxdWV1ZUNyZWF0ZUluZm9Db3VudCA9IGluX3N0cnVjdC0+cXVldWVDcmVhdGVJbmZvQ291bnQ7CisgICAgcFF1ZXVlQ3JlYXRlSW5mb3MgPSBudWxscHRyOworICAgIGVuYWJsZWRMYXllckNvdW50ID0gaW5fc3RydWN0LT5lbmFibGVkTGF5ZXJDb3VudDsKKyAgICBlbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBpbl9zdHJ1Y3QtPmVuYWJsZWRFeHRlbnNpb25Db3VudDsKKyAgICBwRW5hYmxlZEZlYXR1cmVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgY2hhciAqKnRtcF9wcEVuYWJsZWRMYXllck5hbWVzID0gbmV3IGNoYXIgKltpbl9zdHJ1Y3QtPmVuYWJsZWRMYXllckNvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZExheWVyQ291bnQ7ICsraSkgeworICAgICAgICB0bXBfcHBFbmFibGVkTGF5ZXJOYW1lc1tpXSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cHBFbmFibGVkTGF5ZXJOYW1lc1tpXSk7CisgICAgfQorICAgIHBwRW5hYmxlZExheWVyTmFtZXMgPSB0bXBfcHBFbmFibGVkTGF5ZXJOYW1lczsKKyAgICBjaGFyICoqdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gbmV3IGNoYXIgKltpbl9zdHJ1Y3QtPmVuYWJsZWRFeHRlbnNpb25Db3VudF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRFeHRlbnNpb25Db3VudDsgKytpKSB7CisgICAgICAgIHRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgIH0KKyAgICBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IHRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lczsKKyAgICBpZiAocXVldWVDcmVhdGVJbmZvQ291bnQgJiYgaW5fc3RydWN0LT5wUXVldWVDcmVhdGVJbmZvcykgeworICAgICAgICBwUXVldWVDcmVhdGVJbmZvcyA9IG5ldyBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvW3F1ZXVlQ3JlYXRlSW5mb0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHF1ZXVlQ3JlYXRlSW5mb0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBRdWV1ZUNyZWF0ZUluZm9zW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBFbmFibGVkRmVhdHVyZXMpIHsKKyAgICAgICAgcEVuYWJsZWRGZWF0dXJlcyA9IG5ldyBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMoKmluX3N0cnVjdC0+cEVuYWJsZWRGZWF0dXJlcyk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtEZXZpY2VDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBxdWV1ZUNyZWF0ZUluZm9Db3VudCA9IHNyYy0+cXVldWVDcmVhdGVJbmZvQ291bnQ7CisgICAgcFF1ZXVlQ3JlYXRlSW5mb3MgPSBudWxscHRyOworICAgIGVuYWJsZWRMYXllckNvdW50ID0gc3JjLT5lbmFibGVkTGF5ZXJDb3VudDsKKyAgICBlbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBzcmMtPmVuYWJsZWRFeHRlbnNpb25Db3VudDsKKyAgICBwRW5hYmxlZEZlYXR1cmVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgY2hhciAqKnRtcF9wcEVuYWJsZWRMYXllck5hbWVzID0gbmV3IGNoYXIgKltzcmMtPmVuYWJsZWRMYXllckNvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5hYmxlZExheWVyQ291bnQ7ICsraSkgeworICAgICAgICB0bXBfcHBFbmFibGVkTGF5ZXJOYW1lc1tpXSA9IFNhZmVTdHJpbmdDb3B5KHNyYy0+cHBFbmFibGVkTGF5ZXJOYW1lc1tpXSk7CisgICAgfQorICAgIHBwRW5hYmxlZExheWVyTmFtZXMgPSB0bXBfcHBFbmFibGVkTGF5ZXJOYW1lczsKKyAgICBjaGFyICoqdG1wX3BwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gbmV3IGNoYXIgKltzcmMtPmVuYWJsZWRFeHRlbnNpb25Db3VudF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuYWJsZWRFeHRlbnNpb25Db3VudDsgKytpKSB7CisgICAgICAgIHRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSA9IFNhZmVTdHJpbmdDb3B5KHNyYy0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgIH0KKyAgICBwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IHRtcF9wcEVuYWJsZWRFeHRlbnNpb25OYW1lczsKKyAgICBpZiAocXVldWVDcmVhdGVJbmZvQ291bnQgJiYgc3JjLT5wUXVldWVDcmVhdGVJbmZvcykgeworICAgICAgICBwUXVldWVDcmVhdGVJbmZvcyA9IG5ldyBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvW3F1ZXVlQ3JlYXRlSW5mb0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHF1ZXVlQ3JlYXRlSW5mb0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBRdWV1ZUNyZWF0ZUluZm9zW2ldLmluaXRpYWxpemUoJnNyYy0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMtPnBFbmFibGVkRmVhdHVyZXMpIHsKKyAgICAgICAgcEVuYWJsZWRGZWF0dXJlcyA9IG5ldyBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMoKnNyYy0+cEVuYWJsZWRGZWF0dXJlcyk7CisgICAgfQorfQorCitzYWZlX1ZrU3VibWl0SW5mbzo6c2FmZV9Wa1N1Ym1pdEluZm8oY29uc3QgVmtTdWJtaXRJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB3YWl0U2VtYXBob3JlQ291bnQoaW5fc3RydWN0LT53YWl0U2VtYXBob3JlQ291bnQpLAorICAgIHBXYWl0U2VtYXBob3JlcyhudWxscHRyKSwKKyAgICBwV2FpdERzdFN0YWdlTWFzayhudWxscHRyKSwKKyAgICBjb21tYW5kQnVmZmVyQ291bnQoaW5fc3RydWN0LT5jb21tYW5kQnVmZmVyQ291bnQpLAorICAgIHBDb21tYW5kQnVmZmVycyhudWxscHRyKSwKKyAgICBzaWduYWxTZW1hcGhvcmVDb3VudChpbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZUNvdW50KSwKKyAgICBwU2lnbmFsU2VtYXBob3JlcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAod2FpdFNlbWFwaG9yZUNvdW50ICYmIGluX3N0cnVjdC0+cFdhaXRTZW1hcGhvcmVzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlcyA9IG5ldyBWa1NlbWFwaG9yZVt3YWl0U2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2FpdFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBXYWl0U2VtYXBob3Jlc1tpXSA9IGluX3N0cnVjdC0+cFdhaXRTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBXYWl0RHN0U3RhZ2VNYXNrKSB7CisgICAgICAgIHBXYWl0RHN0U3RhZ2VNYXNrID0gbmV3IFZrUGlwZWxpbmVTdGFnZUZsYWdzW2luX3N0cnVjdC0+d2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBXYWl0RHN0U3RhZ2VNYXNrLCAodm9pZCAqKWluX3N0cnVjdC0+cFdhaXREc3RTdGFnZU1hc2ssIHNpemVvZihWa1BpcGVsaW5lU3RhZ2VGbGFncykqaW5fc3RydWN0LT53YWl0U2VtYXBob3JlQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICAgICAgcENvbW1hbmRCdWZmZXJzID0gbmV3IFZrQ29tbWFuZEJ1ZmZlcltpbl9zdHJ1Y3QtPmNvbW1hbmRCdWZmZXJDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ29tbWFuZEJ1ZmZlcnMsICh2b2lkICopaW5fc3RydWN0LT5wQ29tbWFuZEJ1ZmZlcnMsIHNpemVvZihWa0NvbW1hbmRCdWZmZXIpKmluX3N0cnVjdC0+Y29tbWFuZEJ1ZmZlckNvdW50KTsKKyAgICB9CisgICAgaWYgKHNpZ25hbFNlbWFwaG9yZUNvdW50ICYmIGluX3N0cnVjdC0+cFNpZ25hbFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFNpZ25hbFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbc2lnbmFsU2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2lnbmFsU2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNpZ25hbFNlbWFwaG9yZXNbaV0gPSBpbl9zdHJ1Y3QtPnBTaWduYWxTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrU3VibWl0SW5mbzo6c2FmZV9Wa1N1Ym1pdEluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFdhaXRTZW1hcGhvcmVzKG51bGxwdHIpLAorICAgIHBXYWl0RHN0U3RhZ2VNYXNrKG51bGxwdHIpLAorICAgIHBDb21tYW5kQnVmZmVycyhudWxscHRyKSwKKyAgICBwU2lnbmFsU2VtYXBob3JlcyhudWxscHRyKQore30KKworc2FmZV9Wa1N1Ym1pdEluZm86OnNhZmVfVmtTdWJtaXRJbmZvKGNvbnN0IHNhZmVfVmtTdWJtaXRJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgd2FpdFNlbWFwaG9yZUNvdW50ID0gc3JjLndhaXRTZW1hcGhvcmVDb3VudDsKKyAgICBwV2FpdFNlbWFwaG9yZXMgPSBudWxscHRyOworICAgIHBXYWl0RHN0U3RhZ2VNYXNrID0gbnVsbHB0cjsKKyAgICBjb21tYW5kQnVmZmVyQ291bnQgPSBzcmMuY29tbWFuZEJ1ZmZlckNvdW50OworICAgIHBDb21tYW5kQnVmZmVycyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlQ291bnQgPSBzcmMuc2lnbmFsU2VtYXBob3JlQ291bnQ7CisgICAgcFNpZ25hbFNlbWFwaG9yZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmICh3YWl0U2VtYXBob3JlQ291bnQgJiYgc3JjLnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbd2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdhaXRTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwV2FpdFNlbWFwaG9yZXNbaV0gPSBzcmMucFdhaXRTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucFdhaXREc3RTdGFnZU1hc2spIHsKKyAgICAgICAgcFdhaXREc3RTdGFnZU1hc2sgPSBuZXcgVmtQaXBlbGluZVN0YWdlRmxhZ3Nbc3JjLndhaXRTZW1hcGhvcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwV2FpdERzdFN0YWdlTWFzaywgKHZvaWQgKilzcmMucFdhaXREc3RTdGFnZU1hc2ssIHNpemVvZihWa1BpcGVsaW5lU3RhZ2VGbGFncykqc3JjLndhaXRTZW1hcGhvcmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucENvbW1hbmRCdWZmZXJzKSB7CisgICAgICAgIHBDb21tYW5kQnVmZmVycyA9IG5ldyBWa0NvbW1hbmRCdWZmZXJbc3JjLmNvbW1hbmRCdWZmZXJDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ29tbWFuZEJ1ZmZlcnMsICh2b2lkICopc3JjLnBDb21tYW5kQnVmZmVycywgc2l6ZW9mKFZrQ29tbWFuZEJ1ZmZlcikqc3JjLmNvbW1hbmRCdWZmZXJDb3VudCk7CisgICAgfQorICAgIGlmIChzaWduYWxTZW1hcGhvcmVDb3VudCAmJiBzcmMucFNpZ25hbFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFNpZ25hbFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbc2lnbmFsU2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2lnbmFsU2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNpZ25hbFNlbWFwaG9yZXNbaV0gPSBzcmMucFNpZ25hbFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtTdWJtaXRJbmZvJiBzYWZlX1ZrU3VibWl0SW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdWJtaXRJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBXYWl0U2VtYXBob3JlcykKKyAgICAgICAgZGVsZXRlW10gcFdhaXRTZW1hcGhvcmVzOworICAgIGlmIChwV2FpdERzdFN0YWdlTWFzaykKKyAgICAgICAgZGVsZXRlW10gcFdhaXREc3RTdGFnZU1hc2s7CisgICAgaWYgKHBDb21tYW5kQnVmZmVycykKKyAgICAgICAgZGVsZXRlW10gcENvbW1hbmRCdWZmZXJzOworICAgIGlmIChwU2lnbmFsU2VtYXBob3JlcykKKyAgICAgICAgZGVsZXRlW10gcFNpZ25hbFNlbWFwaG9yZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB3YWl0U2VtYXBob3JlQ291bnQgPSBzcmMud2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgcFdhaXREc3RTdGFnZU1hc2sgPSBudWxscHRyOworICAgIGNvbW1hbmRCdWZmZXJDb3VudCA9IHNyYy5jb21tYW5kQnVmZmVyQ291bnQ7CisgICAgcENvbW1hbmRCdWZmZXJzID0gbnVsbHB0cjsKKyAgICBzaWduYWxTZW1hcGhvcmVDb3VudCA9IHNyYy5zaWduYWxTZW1hcGhvcmVDb3VudDsKKyAgICBwU2lnbmFsU2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHdhaXRTZW1hcGhvcmVDb3VudCAmJiBzcmMucFdhaXRTZW1hcGhvcmVzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlcyA9IG5ldyBWa1NlbWFwaG9yZVt3YWl0U2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2FpdFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBXYWl0U2VtYXBob3Jlc1tpXSA9IHNyYy5wV2FpdFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wV2FpdERzdFN0YWdlTWFzaykgeworICAgICAgICBwV2FpdERzdFN0YWdlTWFzayA9IG5ldyBWa1BpcGVsaW5lU3RhZ2VGbGFnc1tzcmMud2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBXYWl0RHN0U3RhZ2VNYXNrLCAodm9pZCAqKXNyYy5wV2FpdERzdFN0YWdlTWFzaywgc2l6ZW9mKFZrUGlwZWxpbmVTdGFnZUZsYWdzKSpzcmMud2FpdFNlbWFwaG9yZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICAgICAgcENvbW1hbmRCdWZmZXJzID0gbmV3IFZrQ29tbWFuZEJ1ZmZlcltzcmMuY29tbWFuZEJ1ZmZlckNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb21tYW5kQnVmZmVycywgKHZvaWQgKilzcmMucENvbW1hbmRCdWZmZXJzLCBzaXplb2YoVmtDb21tYW5kQnVmZmVyKSpzcmMuY29tbWFuZEJ1ZmZlckNvdW50KTsKKyAgICB9CisgICAgaWYgKHNpZ25hbFNlbWFwaG9yZUNvdW50ICYmIHNyYy5wU2lnbmFsU2VtYXBob3JlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlcyA9IG5ldyBWa1NlbWFwaG9yZVtzaWduYWxTZW1hcGhvcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzaWduYWxTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU2lnbmFsU2VtYXBob3Jlc1tpXSA9IHNyYy5wU2lnbmFsU2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1N1Ym1pdEluZm86On5zYWZlX1ZrU3VibWl0SW5mbygpCit7CisgICAgaWYgKHBXYWl0U2VtYXBob3JlcykKKyAgICAgICAgZGVsZXRlW10gcFdhaXRTZW1hcGhvcmVzOworICAgIGlmIChwV2FpdERzdFN0YWdlTWFzaykKKyAgICAgICAgZGVsZXRlW10gcFdhaXREc3RTdGFnZU1hc2s7CisgICAgaWYgKHBDb21tYW5kQnVmZmVycykKKyAgICAgICAgZGVsZXRlW10gcENvbW1hbmRCdWZmZXJzOworICAgIGlmIChwU2lnbmFsU2VtYXBob3JlcykKKyAgICAgICAgZGVsZXRlW10gcFNpZ25hbFNlbWFwaG9yZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1N1Ym1pdEluZm86OmluaXRpYWxpemUoY29uc3QgVmtTdWJtaXRJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVDb3VudCA9IGluX3N0cnVjdC0+d2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgcFdhaXREc3RTdGFnZU1hc2sgPSBudWxscHRyOworICAgIGNvbW1hbmRCdWZmZXJDb3VudCA9IGluX3N0cnVjdC0+Y29tbWFuZEJ1ZmZlckNvdW50OworICAgIHBDb21tYW5kQnVmZmVycyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlQ291bnQgPSBpbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZUNvdW50OworICAgIHBTaWduYWxTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKHdhaXRTZW1hcGhvcmVDb3VudCAmJiBpbl9zdHJ1Y3QtPnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbd2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdhaXRTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwV2FpdFNlbWFwaG9yZXNbaV0gPSBpbl9zdHJ1Y3QtPnBXYWl0U2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wV2FpdERzdFN0YWdlTWFzaykgeworICAgICAgICBwV2FpdERzdFN0YWdlTWFzayA9IG5ldyBWa1BpcGVsaW5lU3RhZ2VGbGFnc1tpbl9zdHJ1Y3QtPndhaXRTZW1hcGhvcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwV2FpdERzdFN0YWdlTWFzaywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBXYWl0RHN0U3RhZ2VNYXNrLCBzaXplb2YoVmtQaXBlbGluZVN0YWdlRmxhZ3MpKmluX3N0cnVjdC0+d2FpdFNlbWFwaG9yZUNvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cENvbW1hbmRCdWZmZXJzKSB7CisgICAgICAgIHBDb21tYW5kQnVmZmVycyA9IG5ldyBWa0NvbW1hbmRCdWZmZXJbaW5fc3RydWN0LT5jb21tYW5kQnVmZmVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvbW1hbmRCdWZmZXJzLCAodm9pZCAqKWluX3N0cnVjdC0+cENvbW1hbmRCdWZmZXJzLCBzaXplb2YoVmtDb21tYW5kQnVmZmVyKSppbl9zdHJ1Y3QtPmNvbW1hbmRCdWZmZXJDb3VudCk7CisgICAgfQorICAgIGlmIChzaWduYWxTZW1hcGhvcmVDb3VudCAmJiBpbl9zdHJ1Y3QtPnBTaWduYWxTZW1hcGhvcmVzKSB7CisgICAgICAgIHBTaWduYWxTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3NpZ25hbFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTaWduYWxTZW1hcGhvcmVzW2ldID0gaW5fc3RydWN0LT5wU2lnbmFsU2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrU3VibWl0SW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VibWl0SW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICB3YWl0U2VtYXBob3JlQ291bnQgPSBzcmMtPndhaXRTZW1hcGhvcmVDb3VudDsKKyAgICBwV2FpdFNlbWFwaG9yZXMgPSBudWxscHRyOworICAgIHBXYWl0RHN0U3RhZ2VNYXNrID0gbnVsbHB0cjsKKyAgICBjb21tYW5kQnVmZmVyQ291bnQgPSBzcmMtPmNvbW1hbmRCdWZmZXJDb3VudDsKKyAgICBwQ29tbWFuZEJ1ZmZlcnMgPSBudWxscHRyOworICAgIHNpZ25hbFNlbWFwaG9yZUNvdW50ID0gc3JjLT5zaWduYWxTZW1hcGhvcmVDb3VudDsKKyAgICBwU2lnbmFsU2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmICh3YWl0U2VtYXBob3JlQ291bnQgJiYgc3JjLT5wV2FpdFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3dhaXRTZW1hcGhvcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3YWl0U2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFdhaXRTZW1hcGhvcmVzW2ldID0gc3JjLT5wV2FpdFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy0+cFdhaXREc3RTdGFnZU1hc2spIHsKKyAgICAgICAgcFdhaXREc3RTdGFnZU1hc2sgPSBuZXcgVmtQaXBlbGluZVN0YWdlRmxhZ3Nbc3JjLT53YWl0U2VtYXBob3JlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFdhaXREc3RTdGFnZU1hc2ssICh2b2lkICopc3JjLT5wV2FpdERzdFN0YWdlTWFzaywgc2l6ZW9mKFZrUGlwZWxpbmVTdGFnZUZsYWdzKSpzcmMtPndhaXRTZW1hcGhvcmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMtPnBDb21tYW5kQnVmZmVycykgeworICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMgPSBuZXcgVmtDb21tYW5kQnVmZmVyW3NyYy0+Y29tbWFuZEJ1ZmZlckNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb21tYW5kQnVmZmVycywgKHZvaWQgKilzcmMtPnBDb21tYW5kQnVmZmVycywgc2l6ZW9mKFZrQ29tbWFuZEJ1ZmZlcikqc3JjLT5jb21tYW5kQnVmZmVyQ291bnQpOworICAgIH0KKyAgICBpZiAoc2lnbmFsU2VtYXBob3JlQ291bnQgJiYgc3JjLT5wU2lnbmFsU2VtYXBob3JlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlcyA9IG5ldyBWa1NlbWFwaG9yZVtzaWduYWxTZW1hcGhvcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzaWduYWxTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU2lnbmFsU2VtYXBob3Jlc1tpXSA9IHNyYy0+cFNpZ25hbFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm86OnNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm8oY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGFsbG9jYXRpb25TaXplKGluX3N0cnVjdC0+YWxsb2NhdGlvblNpemUpLAorICAgIG1lbW9yeVR5cGVJbmRleChpbl9zdHJ1Y3QtPm1lbW9yeVR5cGVJbmRleCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm86OnNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm86OnNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm8oY29uc3Qgc2FmZV9Wa01lbW9yeUFsbG9jYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGFsbG9jYXRpb25TaXplID0gc3JjLmFsbG9jYXRpb25TaXplOworICAgIG1lbW9yeVR5cGVJbmRleCA9IHNyYy5tZW1vcnlUeXBlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm8mIHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhbGxvY2F0aW9uU2l6ZSA9IHNyYy5hbGxvY2F0aW9uU2l6ZTsKKyAgICBtZW1vcnlUeXBlSW5kZXggPSBzcmMubWVtb3J5VHlwZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5QWxsb2NhdGVJbmZvOjp+c2FmZV9Wa01lbW9yeUFsbG9jYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeUFsbG9jYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBhbGxvY2F0aW9uU2l6ZSA9IGluX3N0cnVjdC0+YWxsb2NhdGlvblNpemU7CisgICAgbWVtb3J5VHlwZUluZGV4ID0gaW5fc3RydWN0LT5tZW1vcnlUeXBlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeUFsbG9jYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBhbGxvY2F0aW9uU2l6ZSA9IHNyYy0+YWxsb2NhdGlvblNpemU7CisgICAgbWVtb3J5VHlwZUluZGV4ID0gc3JjLT5tZW1vcnlUeXBlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2U6OnNhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZShjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtZW1vcnkoaW5fc3RydWN0LT5tZW1vcnkpLAorICAgIG9mZnNldChpbl9zdHJ1Y3QtPm9mZnNldCksCisgICAgc2l6ZShpbl9zdHJ1Y3QtPnNpemUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2U6OnNhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZSgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlOjpzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2UoY29uc3Qgc2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5ID0gc3JjLm1lbW9yeTsKKyAgICBvZmZzZXQgPSBzcmMub2Zmc2V0OworICAgIHNpemUgPSBzcmMuc2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlJiBzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2U6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2UmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1lbW9yeSA9IHNyYy5tZW1vcnk7CisgICAgb2Zmc2V0ID0gc3JjLm9mZnNldDsKKyAgICBzaXplID0gc3JjLnNpemU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZTo6fnNhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZSgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlOjppbml0aWFsaXplKGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWVtb3J5ID0gaW5fc3RydWN0LT5tZW1vcnk7CisgICAgb2Zmc2V0ID0gaW5fc3RydWN0LT5vZmZzZXQ7CisgICAgc2l6ZSA9IGluX3N0cnVjdC0+c2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZSogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtZW1vcnkgPSBzcmMtPm1lbW9yeTsKKyAgICBvZmZzZXQgPSBzcmMtPm9mZnNldDsKKyAgICBzaXplID0gc3JjLT5zaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvOjpzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8oY29uc3QgVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyogaW5fc3RydWN0KSA6CisgICAgYnVmZmVyKGluX3N0cnVjdC0+YnVmZmVyKSwKKyAgICBiaW5kQ291bnQoaW5fc3RydWN0LT5iaW5kQ291bnQpLAorICAgIHBCaW5kcyhudWxscHRyKQoreworICAgIGlmIChiaW5kQ291bnQgJiYgaW5fc3RydWN0LT5wQmluZHMpIHsKKyAgICAgICAgcEJpbmRzID0gbmV3IFZrU3BhcnNlTWVtb3J5QmluZFtiaW5kQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBCaW5kc1tpXSA9IGluX3N0cnVjdC0+cEJpbmRzW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm86OnNhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbygpIDoKKyAgICBwQmluZHMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbzo6c2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKGNvbnN0IHNhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyYgc3JjKQoreworICAgIGJ1ZmZlciA9IHNyYy5idWZmZXI7CisgICAgYmluZENvdW50ID0gc3JjLmJpbmRDb3VudDsKKyAgICBwQmluZHMgPSBudWxscHRyOworICAgIGlmIChiaW5kQ291bnQgJiYgc3JjLnBCaW5kcykgeworICAgICAgICBwQmluZHMgPSBuZXcgVmtTcGFyc2VNZW1vcnlCaW5kW2JpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJpbmRzW2ldID0gc3JjLnBCaW5kc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvJiBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEJpbmRzKQorICAgICAgICBkZWxldGVbXSBwQmluZHM7CisKKyAgICBidWZmZXIgPSBzcmMuYnVmZmVyOworICAgIGJpbmRDb3VudCA9IHNyYy5iaW5kQ291bnQ7CisgICAgcEJpbmRzID0gbnVsbHB0cjsKKyAgICBpZiAoYmluZENvdW50ICYmIHNyYy5wQmluZHMpIHsKKyAgICAgICAgcEJpbmRzID0gbmV3IFZrU3BhcnNlTWVtb3J5QmluZFtiaW5kQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBCaW5kc1tpXSA9IHNyYy5wQmluZHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbzo6fnNhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbygpCit7CisgICAgaWYgKHBCaW5kcykKKyAgICAgICAgZGVsZXRlW10gcEJpbmRzOworfQorCit2b2lkIHNhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgYnVmZmVyID0gaW5fc3RydWN0LT5idWZmZXI7CisgICAgYmluZENvdW50ID0gaW5fc3RydWN0LT5iaW5kQ291bnQ7CisgICAgcEJpbmRzID0gbnVsbHB0cjsKKyAgICBpZiAoYmluZENvdW50ICYmIGluX3N0cnVjdC0+cEJpbmRzKSB7CisgICAgICAgIHBCaW5kcyA9IG5ldyBWa1NwYXJzZU1lbW9yeUJpbmRbYmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZHNbaV0gPSBpbl9zdHJ1Y3QtPnBCaW5kc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKiBzcmMpCit7CisgICAgYnVmZmVyID0gc3JjLT5idWZmZXI7CisgICAgYmluZENvdW50ID0gc3JjLT5iaW5kQ291bnQ7CisgICAgcEJpbmRzID0gbnVsbHB0cjsKKyAgICBpZiAoYmluZENvdW50ICYmIHNyYy0+cEJpbmRzKSB7CisgICAgICAgIHBCaW5kcyA9IG5ldyBWa1NwYXJzZU1lbW9yeUJpbmRbYmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZHNbaV0gPSBzcmMtPnBCaW5kc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm86OnNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKGNvbnN0IFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyogaW5fc3RydWN0KSA6CisgICAgaW1hZ2UoaW5fc3RydWN0LT5pbWFnZSksCisgICAgYmluZENvdW50KGluX3N0cnVjdC0+YmluZENvdW50KSwKKyAgICBwQmluZHMobnVsbHB0cikKK3sKKyAgICBpZiAoYmluZENvdW50ICYmIGluX3N0cnVjdC0+cEJpbmRzKSB7CisgICAgICAgIHBCaW5kcyA9IG5ldyBWa1NwYXJzZU1lbW9yeUJpbmRbYmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZHNbaV0gPSBpbl9zdHJ1Y3QtPnBCaW5kc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm86OnNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKCkgOgorICAgIHBCaW5kcyhudWxscHRyKQore30KKworc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm86OnNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKGNvbnN0IHNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvJiBzcmMpCit7CisgICAgaW1hZ2UgPSBzcmMuaW1hZ2U7CisgICAgYmluZENvdW50ID0gc3JjLmJpbmRDb3VudDsKKyAgICBwQmluZHMgPSBudWxscHRyOworICAgIGlmIChiaW5kQ291bnQgJiYgc3JjLnBCaW5kcykgeworICAgICAgICBwQmluZHMgPSBuZXcgVmtTcGFyc2VNZW1vcnlCaW5kW2JpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJpbmRzW2ldID0gc3JjLnBCaW5kc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8mIHNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEJpbmRzKQorICAgICAgICBkZWxldGVbXSBwQmluZHM7CisKKyAgICBpbWFnZSA9IHNyYy5pbWFnZTsKKyAgICBiaW5kQ291bnQgPSBzcmMuYmluZENvdW50OworICAgIHBCaW5kcyA9IG51bGxwdHI7CisgICAgaWYgKGJpbmRDb3VudCAmJiBzcmMucEJpbmRzKSB7CisgICAgICAgIHBCaW5kcyA9IG5ldyBWa1NwYXJzZU1lbW9yeUJpbmRbYmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZHNbaV0gPSBzcmMucEJpbmRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbzo6fnNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKCkKK3sKKyAgICBpZiAocEJpbmRzKQorICAgICAgICBkZWxldGVbXSBwQmluZHM7Cit9CisKK3ZvaWQgc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm86OmluaXRpYWxpemUoY29uc3QgVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgaW1hZ2UgPSBpbl9zdHJ1Y3QtPmltYWdlOworICAgIGJpbmRDb3VudCA9IGluX3N0cnVjdC0+YmluZENvdW50OworICAgIHBCaW5kcyA9IG51bGxwdHI7CisgICAgaWYgKGJpbmRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBCaW5kcykgeworICAgICAgICBwQmluZHMgPSBuZXcgVmtTcGFyc2VNZW1vcnlCaW5kW2JpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJpbmRzW2ldID0gaW5fc3RydWN0LT5wQmluZHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8qIHNyYykKK3sKKyAgICBpbWFnZSA9IHNyYy0+aW1hZ2U7CisgICAgYmluZENvdW50ID0gc3JjLT5iaW5kQ291bnQ7CisgICAgcEJpbmRzID0gbnVsbHB0cjsKKyAgICBpZiAoYmluZENvdW50ICYmIHNyYy0+cEJpbmRzKSB7CisgICAgICAgIHBCaW5kcyA9IG5ldyBWa1NwYXJzZU1lbW9yeUJpbmRbYmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZHNbaV0gPSBzcmMtPnBCaW5kc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm86OnNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvKGNvbnN0IFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyogaW5fc3RydWN0KSA6CisgICAgaW1hZ2UoaW5fc3RydWN0LT5pbWFnZSksCisgICAgYmluZENvdW50KGluX3N0cnVjdC0+YmluZENvdW50KSwKKyAgICBwQmluZHMobnVsbHB0cikKK3sKKyAgICBpZiAoYmluZENvdW50ICYmIGluX3N0cnVjdC0+cEJpbmRzKSB7CisgICAgICAgIHBCaW5kcyA9IG5ldyBWa1NwYXJzZUltYWdlTWVtb3J5QmluZFtiaW5kQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBCaW5kc1tpXSA9IGluX3N0cnVjdC0+cEJpbmRzW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbzo6c2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8oKSA6CisgICAgcEJpbmRzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbzo6c2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8oY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8mIHNyYykKK3sKKyAgICBpbWFnZSA9IHNyYy5pbWFnZTsKKyAgICBiaW5kQ291bnQgPSBzcmMuYmluZENvdW50OworICAgIHBCaW5kcyA9IG51bGxwdHI7CisgICAgaWYgKGJpbmRDb3VudCAmJiBzcmMucEJpbmRzKSB7CisgICAgICAgIHBCaW5kcyA9IG5ldyBWa1NwYXJzZUltYWdlTWVtb3J5QmluZFtiaW5kQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBCaW5kc1tpXSA9IHNyYy5wQmluZHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvJiBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBCaW5kcykKKyAgICAgICAgZGVsZXRlW10gcEJpbmRzOworCisgICAgaW1hZ2UgPSBzcmMuaW1hZ2U7CisgICAgYmluZENvdW50ID0gc3JjLmJpbmRDb3VudDsKKyAgICBwQmluZHMgPSBudWxscHRyOworICAgIGlmIChiaW5kQ291bnQgJiYgc3JjLnBCaW5kcykgeworICAgICAgICBwQmluZHMgPSBuZXcgVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRbYmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZHNbaV0gPSBzcmMucEJpbmRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbzo6fnNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvKCkKK3sKKyAgICBpZiAocEJpbmRzKQorICAgICAgICBkZWxldGVbXSBwQmluZHM7Cit9CisKK3ZvaWQgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm86OmluaXRpYWxpemUoY29uc3QgVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgaW1hZ2UgPSBpbl9zdHJ1Y3QtPmltYWdlOworICAgIGJpbmRDb3VudCA9IGluX3N0cnVjdC0+YmluZENvdW50OworICAgIHBCaW5kcyA9IG51bGxwdHI7CisgICAgaWYgKGJpbmRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBCaW5kcykgeworICAgICAgICBwQmluZHMgPSBuZXcgVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRbYmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZHNbaV0gPSBpbl9zdHJ1Y3QtPnBCaW5kc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyogc3JjKQoreworICAgIGltYWdlID0gc3JjLT5pbWFnZTsKKyAgICBiaW5kQ291bnQgPSBzcmMtPmJpbmRDb3VudDsKKyAgICBwQmluZHMgPSBudWxscHRyOworICAgIGlmIChiaW5kQ291bnQgJiYgc3JjLT5wQmluZHMpIHsKKyAgICAgICAgcEJpbmRzID0gbmV3IFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kW2JpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJpbmRzW2ldID0gc3JjLT5wQmluZHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtCaW5kU3BhcnNlSW5mbzo6c2FmZV9Wa0JpbmRTcGFyc2VJbmZvKGNvbnN0IFZrQmluZFNwYXJzZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHdhaXRTZW1hcGhvcmVDb3VudChpbl9zdHJ1Y3QtPndhaXRTZW1hcGhvcmVDb3VudCksCisgICAgcFdhaXRTZW1hcGhvcmVzKG51bGxwdHIpLAorICAgIGJ1ZmZlckJpbmRDb3VudChpbl9zdHJ1Y3QtPmJ1ZmZlckJpbmRDb3VudCksCisgICAgcEJ1ZmZlckJpbmRzKG51bGxwdHIpLAorICAgIGltYWdlT3BhcXVlQmluZENvdW50KGluX3N0cnVjdC0+aW1hZ2VPcGFxdWVCaW5kQ291bnQpLAorICAgIHBJbWFnZU9wYXF1ZUJpbmRzKG51bGxwdHIpLAorICAgIGltYWdlQmluZENvdW50KGluX3N0cnVjdC0+aW1hZ2VCaW5kQ291bnQpLAorICAgIHBJbWFnZUJpbmRzKG51bGxwdHIpLAorICAgIHNpZ25hbFNlbWFwaG9yZUNvdW50KGluX3N0cnVjdC0+c2lnbmFsU2VtYXBob3JlQ291bnQpLAorICAgIHBTaWduYWxTZW1hcGhvcmVzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmICh3YWl0U2VtYXBob3JlQ291bnQgJiYgaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3dhaXRTZW1hcGhvcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3YWl0U2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFdhaXRTZW1hcGhvcmVzW2ldID0gaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckJpbmRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBCdWZmZXJCaW5kcykgeworICAgICAgICBwQnVmZmVyQmluZHMgPSBuZXcgc2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvW2J1ZmZlckJpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBidWZmZXJCaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJ1ZmZlckJpbmRzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cEJ1ZmZlckJpbmRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1hZ2VPcGFxdWVCaW5kQ291bnQgJiYgaW5fc3RydWN0LT5wSW1hZ2VPcGFxdWVCaW5kcykgeworICAgICAgICBwSW1hZ2VPcGFxdWVCaW5kcyA9IG5ldyBzYWZlX1ZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mb1tpbWFnZU9wYXF1ZUJpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbWFnZU9wYXF1ZUJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW1hZ2VPcGFxdWVCaW5kc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBJbWFnZU9wYXF1ZUJpbmRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1hZ2VCaW5kQ291bnQgJiYgaW5fc3RydWN0LT5wSW1hZ2VCaW5kcykgeworICAgICAgICBwSW1hZ2VCaW5kcyA9IG5ldyBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mb1tpbWFnZUJpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbWFnZUJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW1hZ2VCaW5kc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBJbWFnZUJpbmRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2lnbmFsU2VtYXBob3JlQ291bnQgJiYgaW5fc3RydWN0LT5wU2lnbmFsU2VtYXBob3JlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlcyA9IG5ldyBWa1NlbWFwaG9yZVtzaWduYWxTZW1hcGhvcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzaWduYWxTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU2lnbmFsU2VtYXBob3Jlc1tpXSA9IGluX3N0cnVjdC0+cFNpZ25hbFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtCaW5kU3BhcnNlSW5mbzo6c2FmZV9Wa0JpbmRTcGFyc2VJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBXYWl0U2VtYXBob3JlcyhudWxscHRyKSwKKyAgICBwQnVmZmVyQmluZHMobnVsbHB0ciksCisgICAgcEltYWdlT3BhcXVlQmluZHMobnVsbHB0ciksCisgICAgcEltYWdlQmluZHMobnVsbHB0ciksCisgICAgcFNpZ25hbFNlbWFwaG9yZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtCaW5kU3BhcnNlSW5mbzo6c2FmZV9Wa0JpbmRTcGFyc2VJbmZvKGNvbnN0IHNhZmVfVmtCaW5kU3BhcnNlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVDb3VudCA9IHNyYy53YWl0U2VtYXBob3JlQ291bnQ7CisgICAgcFdhaXRTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBidWZmZXJCaW5kQ291bnQgPSBzcmMuYnVmZmVyQmluZENvdW50OworICAgIHBCdWZmZXJCaW5kcyA9IG51bGxwdHI7CisgICAgaW1hZ2VPcGFxdWVCaW5kQ291bnQgPSBzcmMuaW1hZ2VPcGFxdWVCaW5kQ291bnQ7CisgICAgcEltYWdlT3BhcXVlQmluZHMgPSBudWxscHRyOworICAgIGltYWdlQmluZENvdW50ID0gc3JjLmltYWdlQmluZENvdW50OworICAgIHBJbWFnZUJpbmRzID0gbnVsbHB0cjsKKyAgICBzaWduYWxTZW1hcGhvcmVDb3VudCA9IHNyYy5zaWduYWxTZW1hcGhvcmVDb3VudDsKKyAgICBwU2lnbmFsU2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHdhaXRTZW1hcGhvcmVDb3VudCAmJiBzcmMucFdhaXRTZW1hcGhvcmVzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlcyA9IG5ldyBWa1NlbWFwaG9yZVt3YWl0U2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2FpdFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBXYWl0U2VtYXBob3Jlc1tpXSA9IHNyYy5wV2FpdFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckJpbmRDb3VudCAmJiBzcmMucEJ1ZmZlckJpbmRzKSB7CisgICAgICAgIHBCdWZmZXJCaW5kcyA9IG5ldyBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm9bYnVmZmVyQmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJ1ZmZlckJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQnVmZmVyQmluZHNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBCdWZmZXJCaW5kc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGltYWdlT3BhcXVlQmluZENvdW50ICYmIHNyYy5wSW1hZ2VPcGFxdWVCaW5kcykgeworICAgICAgICBwSW1hZ2VPcGFxdWVCaW5kcyA9IG5ldyBzYWZlX1ZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mb1tpbWFnZU9wYXF1ZUJpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbWFnZU9wYXF1ZUJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW1hZ2VPcGFxdWVCaW5kc1tpXS5pbml0aWFsaXplKCZzcmMucEltYWdlT3BhcXVlQmluZHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbWFnZUJpbmRDb3VudCAmJiBzcmMucEltYWdlQmluZHMpIHsKKyAgICAgICAgcEltYWdlQmluZHMgPSBuZXcgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm9baW1hZ2VCaW5kQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW1hZ2VCaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEltYWdlQmluZHNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBJbWFnZUJpbmRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2lnbmFsU2VtYXBob3JlQ291bnQgJiYgc3JjLnBTaWduYWxTZW1hcGhvcmVzKSB7CisgICAgICAgIHBTaWduYWxTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3NpZ25hbFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTaWduYWxTZW1hcGhvcmVzW2ldID0gc3JjLnBTaWduYWxTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrQmluZFNwYXJzZUluZm8mIHNhZmVfVmtCaW5kU3BhcnNlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtCaW5kU3BhcnNlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwV2FpdFNlbWFwaG9yZXMpCisgICAgICAgIGRlbGV0ZVtdIHBXYWl0U2VtYXBob3JlczsKKyAgICBpZiAocEJ1ZmZlckJpbmRzKQorICAgICAgICBkZWxldGVbXSBwQnVmZmVyQmluZHM7CisgICAgaWYgKHBJbWFnZU9wYXF1ZUJpbmRzKQorICAgICAgICBkZWxldGVbXSBwSW1hZ2VPcGFxdWVCaW5kczsKKyAgICBpZiAocEltYWdlQmluZHMpCisgICAgICAgIGRlbGV0ZVtdIHBJbWFnZUJpbmRzOworICAgIGlmIChwU2lnbmFsU2VtYXBob3JlcykKKyAgICAgICAgZGVsZXRlW10gcFNpZ25hbFNlbWFwaG9yZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB3YWl0U2VtYXBob3JlQ291bnQgPSBzcmMud2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgYnVmZmVyQmluZENvdW50ID0gc3JjLmJ1ZmZlckJpbmRDb3VudDsKKyAgICBwQnVmZmVyQmluZHMgPSBudWxscHRyOworICAgIGltYWdlT3BhcXVlQmluZENvdW50ID0gc3JjLmltYWdlT3BhcXVlQmluZENvdW50OworICAgIHBJbWFnZU9wYXF1ZUJpbmRzID0gbnVsbHB0cjsKKyAgICBpbWFnZUJpbmRDb3VudCA9IHNyYy5pbWFnZUJpbmRDb3VudDsKKyAgICBwSW1hZ2VCaW5kcyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlQ291bnQgPSBzcmMuc2lnbmFsU2VtYXBob3JlQ291bnQ7CisgICAgcFNpZ25hbFNlbWFwaG9yZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmICh3YWl0U2VtYXBob3JlQ291bnQgJiYgc3JjLnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbd2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdhaXRTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwV2FpdFNlbWFwaG9yZXNbaV0gPSBzcmMucFdhaXRTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZmZXJCaW5kQ291bnQgJiYgc3JjLnBCdWZmZXJCaW5kcykgeworICAgICAgICBwQnVmZmVyQmluZHMgPSBuZXcgc2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvW2J1ZmZlckJpbmRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBidWZmZXJCaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJ1ZmZlckJpbmRzW2ldLmluaXRpYWxpemUoJnNyYy5wQnVmZmVyQmluZHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbWFnZU9wYXF1ZUJpbmRDb3VudCAmJiBzcmMucEltYWdlT3BhcXVlQmluZHMpIHsKKyAgICAgICAgcEltYWdlT3BhcXVlQmluZHMgPSBuZXcgc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm9baW1hZ2VPcGFxdWVCaW5kQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW1hZ2VPcGFxdWVCaW5kQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEltYWdlT3BhcXVlQmluZHNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBJbWFnZU9wYXF1ZUJpbmRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1hZ2VCaW5kQ291bnQgJiYgc3JjLnBJbWFnZUJpbmRzKSB7CisgICAgICAgIHBJbWFnZUJpbmRzID0gbmV3IHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvW2ltYWdlQmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlQmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbWFnZUJpbmRzW2ldLmluaXRpYWxpemUoJnNyYy5wSW1hZ2VCaW5kc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNpZ25hbFNlbWFwaG9yZUNvdW50ICYmIHNyYy5wU2lnbmFsU2VtYXBob3JlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlcyA9IG5ldyBWa1NlbWFwaG9yZVtzaWduYWxTZW1hcGhvcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzaWduYWxTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU2lnbmFsU2VtYXBob3Jlc1tpXSA9IHNyYy5wU2lnbmFsU2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0JpbmRTcGFyc2VJbmZvOjp+c2FmZV9Wa0JpbmRTcGFyc2VJbmZvKCkKK3sKKyAgICBpZiAocFdhaXRTZW1hcGhvcmVzKQorICAgICAgICBkZWxldGVbXSBwV2FpdFNlbWFwaG9yZXM7CisgICAgaWYgKHBCdWZmZXJCaW5kcykKKyAgICAgICAgZGVsZXRlW10gcEJ1ZmZlckJpbmRzOworICAgIGlmIChwSW1hZ2VPcGFxdWVCaW5kcykKKyAgICAgICAgZGVsZXRlW10gcEltYWdlT3BhcXVlQmluZHM7CisgICAgaWYgKHBJbWFnZUJpbmRzKQorICAgICAgICBkZWxldGVbXSBwSW1hZ2VCaW5kczsKKyAgICBpZiAocFNpZ25hbFNlbWFwaG9yZXMpCisgICAgICAgIGRlbGV0ZVtdIHBTaWduYWxTZW1hcGhvcmVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtCaW5kU3BhcnNlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVDb3VudCA9IGluX3N0cnVjdC0+d2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgYnVmZmVyQmluZENvdW50ID0gaW5fc3RydWN0LT5idWZmZXJCaW5kQ291bnQ7CisgICAgcEJ1ZmZlckJpbmRzID0gbnVsbHB0cjsKKyAgICBpbWFnZU9wYXF1ZUJpbmRDb3VudCA9IGluX3N0cnVjdC0+aW1hZ2VPcGFxdWVCaW5kQ291bnQ7CisgICAgcEltYWdlT3BhcXVlQmluZHMgPSBudWxscHRyOworICAgIGltYWdlQmluZENvdW50ID0gaW5fc3RydWN0LT5pbWFnZUJpbmRDb3VudDsKKyAgICBwSW1hZ2VCaW5kcyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlQ291bnQgPSBpbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZUNvdW50OworICAgIHBTaWduYWxTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKHdhaXRTZW1hcGhvcmVDb3VudCAmJiBpbl9zdHJ1Y3QtPnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbd2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdhaXRTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwV2FpdFNlbWFwaG9yZXNbaV0gPSBpbl9zdHJ1Y3QtPnBXYWl0U2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmZmVyQmluZENvdW50ICYmIGluX3N0cnVjdC0+cEJ1ZmZlckJpbmRzKSB7CisgICAgICAgIHBCdWZmZXJCaW5kcyA9IG5ldyBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm9bYnVmZmVyQmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJ1ZmZlckJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQnVmZmVyQmluZHNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wQnVmZmVyQmluZHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbWFnZU9wYXF1ZUJpbmRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBJbWFnZU9wYXF1ZUJpbmRzKSB7CisgICAgICAgIHBJbWFnZU9wYXF1ZUJpbmRzID0gbmV3IHNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvW2ltYWdlT3BhcXVlQmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlT3BhcXVlQmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbWFnZU9wYXF1ZUJpbmRzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cEltYWdlT3BhcXVlQmluZHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbWFnZUJpbmRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBJbWFnZUJpbmRzKSB7CisgICAgICAgIHBJbWFnZUJpbmRzID0gbmV3IHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvW2ltYWdlQmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlQmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbWFnZUJpbmRzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cEltYWdlQmluZHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzaWduYWxTZW1hcGhvcmVDb3VudCAmJiBpbl9zdHJ1Y3QtPnBTaWduYWxTZW1hcGhvcmVzKSB7CisgICAgICAgIHBTaWduYWxTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3NpZ25hbFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTaWduYWxTZW1hcGhvcmVzW2ldID0gaW5fc3RydWN0LT5wU2lnbmFsU2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrQmluZFNwYXJzZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0JpbmRTcGFyc2VJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVDb3VudCA9IHNyYy0+d2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgYnVmZmVyQmluZENvdW50ID0gc3JjLT5idWZmZXJCaW5kQ291bnQ7CisgICAgcEJ1ZmZlckJpbmRzID0gbnVsbHB0cjsKKyAgICBpbWFnZU9wYXF1ZUJpbmRDb3VudCA9IHNyYy0+aW1hZ2VPcGFxdWVCaW5kQ291bnQ7CisgICAgcEltYWdlT3BhcXVlQmluZHMgPSBudWxscHRyOworICAgIGltYWdlQmluZENvdW50ID0gc3JjLT5pbWFnZUJpbmRDb3VudDsKKyAgICBwSW1hZ2VCaW5kcyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlQ291bnQgPSBzcmMtPnNpZ25hbFNlbWFwaG9yZUNvdW50OworICAgIHBTaWduYWxTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHdhaXRTZW1hcGhvcmVDb3VudCAmJiBzcmMtPnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbd2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdhaXRTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwV2FpdFNlbWFwaG9yZXNbaV0gPSBzcmMtPnBXYWl0U2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmZmVyQmluZENvdW50ICYmIHNyYy0+cEJ1ZmZlckJpbmRzKSB7CisgICAgICAgIHBCdWZmZXJCaW5kcyA9IG5ldyBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm9bYnVmZmVyQmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJ1ZmZlckJpbmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQnVmZmVyQmluZHNbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wQnVmZmVyQmluZHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbWFnZU9wYXF1ZUJpbmRDb3VudCAmJiBzcmMtPnBJbWFnZU9wYXF1ZUJpbmRzKSB7CisgICAgICAgIHBJbWFnZU9wYXF1ZUJpbmRzID0gbmV3IHNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvW2ltYWdlT3BhcXVlQmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlT3BhcXVlQmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbWFnZU9wYXF1ZUJpbmRzW2ldLmluaXRpYWxpemUoJnNyYy0+cEltYWdlT3BhcXVlQmluZHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbWFnZUJpbmRDb3VudCAmJiBzcmMtPnBJbWFnZUJpbmRzKSB7CisgICAgICAgIHBJbWFnZUJpbmRzID0gbmV3IHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvW2ltYWdlQmluZENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlQmluZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbWFnZUJpbmRzW2ldLmluaXRpYWxpemUoJnNyYy0+cEltYWdlQmluZHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzaWduYWxTZW1hcGhvcmVDb3VudCAmJiBzcmMtPnBTaWduYWxTZW1hcGhvcmVzKSB7CisgICAgICAgIHBTaWduYWxTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3NpZ25hbFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTaWduYWxTZW1hcGhvcmVzW2ldID0gc3JjLT5wU2lnbmFsU2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa0ZlbmNlQ3JlYXRlSW5mbzo6c2FmZV9Wa0ZlbmNlQ3JlYXRlSW5mbyhjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtGZW5jZUNyZWF0ZUluZm86OnNhZmVfVmtGZW5jZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtGZW5jZUNyZWF0ZUluZm86OnNhZmVfVmtGZW5jZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0ZlbmNlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRmVuY2VDcmVhdGVJbmZvJiBzYWZlX1ZrRmVuY2VDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ZlbmNlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtGZW5jZUNyZWF0ZUluZm86On5zYWZlX1ZrRmVuY2VDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRmVuY2VDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ZlbmNlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRmVuY2VDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvOjpzYWZlX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbyhjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbzo6c2FmZV9Wa1NlbWFwaG9yZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvOjpzYWZlX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbyYgc2FmZV9Wa1NlbWFwaG9yZUNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvOjp+c2FmZV9Wa1NlbWFwaG9yZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtFdmVudENyZWF0ZUluZm86OnNhZmVfVmtFdmVudENyZWF0ZUluZm8oY29uc3QgVmtFdmVudENyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRXZlbnRDcmVhdGVJbmZvOjpzYWZlX1ZrRXZlbnRDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRXZlbnRDcmVhdGVJbmZvOjpzYWZlX1ZrRXZlbnRDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtFdmVudENyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0V2ZW50Q3JlYXRlSW5mbyYgc2FmZV9Wa0V2ZW50Q3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFdmVudENyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRXZlbnRDcmVhdGVJbmZvOjp+c2FmZV9Wa0V2ZW50Q3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V2ZW50Q3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFdmVudENyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V2ZW50Q3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbzo6c2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8oY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBxdWVyeVR5cGUoaW5fc3RydWN0LT5xdWVyeVR5cGUpLAorICAgIHF1ZXJ5Q291bnQoaW5fc3RydWN0LT5xdWVyeUNvdW50KSwKKyAgICBwaXBlbGluZVN0YXRpc3RpY3MoaW5fc3RydWN0LT5waXBlbGluZVN0YXRpc3RpY3MpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbzo6c2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvOjpzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHF1ZXJ5VHlwZSA9IHNyYy5xdWVyeVR5cGU7CisgICAgcXVlcnlDb3VudCA9IHNyYy5xdWVyeUNvdW50OworICAgIHBpcGVsaW5lU3RhdGlzdGljcyA9IHNyYy5waXBlbGluZVN0YXRpc3RpY3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvJiBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBxdWVyeVR5cGUgPSBzcmMucXVlcnlUeXBlOworICAgIHF1ZXJ5Q291bnQgPSBzcmMucXVlcnlDb3VudDsKKyAgICBwaXBlbGluZVN0YXRpc3RpY3MgPSBzcmMucGlwZWxpbmVTdGF0aXN0aWNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbzo6fnNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHF1ZXJ5VHlwZSA9IGluX3N0cnVjdC0+cXVlcnlUeXBlOworICAgIHF1ZXJ5Q291bnQgPSBpbl9zdHJ1Y3QtPnF1ZXJ5Q291bnQ7CisgICAgcGlwZWxpbmVTdGF0aXN0aWNzID0gaW5fc3RydWN0LT5waXBlbGluZVN0YXRpc3RpY3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBxdWVyeVR5cGUgPSBzcmMtPnF1ZXJ5VHlwZTsKKyAgICBxdWVyeUNvdW50ID0gc3JjLT5xdWVyeUNvdW50OworICAgIHBpcGVsaW5lU3RhdGlzdGljcyA9IHNyYy0+cGlwZWxpbmVTdGF0aXN0aWNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0J1ZmZlckNyZWF0ZUluZm86OnNhZmVfVmtCdWZmZXJDcmVhdGVJbmZvKGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgc2l6ZShpbl9zdHJ1Y3QtPnNpemUpLAorICAgIHVzYWdlKGluX3N0cnVjdC0+dXNhZ2UpLAorICAgIHNoYXJpbmdNb2RlKGluX3N0cnVjdC0+c2hhcmluZ01vZGUpLAorICAgIHF1ZXVlRmFtaWx5SW5kZXhDb3VudChpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCksCisgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wUXVldWVGYW1pbHlJbmRpY2VzKSB7CisgICAgICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlRmFtaWx5SW5kaWNlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0J1ZmZlckNyZWF0ZUluZm86OnNhZmVfVmtCdWZmZXJDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBRdWV1ZUZhbWlseUluZGljZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtCdWZmZXJDcmVhdGVJbmZvOjpzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHNpemUgPSBzcmMuc2l6ZTsKKyAgICB1c2FnZSA9IHNyYy51c2FnZTsKKyAgICBzaGFyaW5nTW9kZSA9IHNyYy5zaGFyaW5nTW9kZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBzcmMucXVldWVGYW1pbHlJbmRleENvdW50OworICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy5xdWV1ZUZhbWlseUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlRmFtaWx5SW5kaWNlcywgKHZvaWQgKilzcmMucFF1ZXVlRmFtaWx5SW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMucXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtCdWZmZXJDcmVhdGVJbmZvJiBzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtCdWZmZXJDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBRdWV1ZUZhbWlseUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBzaXplID0gc3JjLnNpemU7CisgICAgdXNhZ2UgPSBzcmMudXNhZ2U7CisgICAgc2hhcmluZ01vZGUgPSBzcmMuc2hhcmluZ01vZGU7CisgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBRdWV1ZUZhbWlseUluZGljZXMpIHsKKyAgICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMucXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopc3JjLnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbzo6fnNhZmVfVmtCdWZmZXJDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocFF1ZXVlRmFtaWx5SW5kaWNlcykKKyAgICAgICAgZGVsZXRlW10gcFF1ZXVlRmFtaWx5SW5kaWNlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHNpemUgPSBpbl9zdHJ1Y3QtPnNpemU7CisgICAgdXNhZ2UgPSBpbl9zdHJ1Y3QtPnVzYWdlOworICAgIHNoYXJpbmdNb2RlID0gaW5fc3RydWN0LT5zaGFyaW5nTW9kZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wUXVldWVGYW1pbHlJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0J1ZmZlckNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0J1ZmZlckNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHNpemUgPSBzcmMtPnNpemU7CisgICAgdXNhZ2UgPSBzcmMtPnVzYWdlOworICAgIHNoYXJpbmdNb2RlID0gc3JjLT5zaGFyaW5nTW9kZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBzcmMtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy0+cXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopc3JjLT5wUXVldWVGYW1pbHlJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy0+cXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbzo6c2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvKGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGJ1ZmZlcihpbl9zdHJ1Y3QtPmJ1ZmZlciksCisgICAgZm9ybWF0KGluX3N0cnVjdC0+Zm9ybWF0KSwKKyAgICBvZmZzZXQoaW5fc3RydWN0LT5vZmZzZXQpLAorICAgIHJhbmdlKGluX3N0cnVjdC0+cmFuZ2UpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQnVmZmVyVmlld0NyZWF0ZUluZm86OnNhZmVfVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvOjpzYWZlX1ZrQnVmZmVyVmlld0NyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgYnVmZmVyID0gc3JjLmJ1ZmZlcjsKKyAgICBmb3JtYXQgPSBzcmMuZm9ybWF0OworICAgIG9mZnNldCA9IHNyYy5vZmZzZXQ7CisgICAgcmFuZ2UgPSBzcmMucmFuZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyYgc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBidWZmZXIgPSBzcmMuYnVmZmVyOworICAgIGZvcm1hdCA9IHNyYy5mb3JtYXQ7CisgICAgb2Zmc2V0ID0gc3JjLm9mZnNldDsKKyAgICByYW5nZSA9IHNyYy5yYW5nZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvOjp+c2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyVmlld0NyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgYnVmZmVyID0gaW5fc3RydWN0LT5idWZmZXI7CisgICAgZm9ybWF0ID0gaW5fc3RydWN0LT5mb3JtYXQ7CisgICAgb2Zmc2V0ID0gaW5fc3RydWN0LT5vZmZzZXQ7CisgICAgcmFuZ2UgPSBpbl9zdHJ1Y3QtPnJhbmdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyVmlld0NyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBidWZmZXIgPSBzcmMtPmJ1ZmZlcjsKKyAgICBmb3JtYXQgPSBzcmMtPmZvcm1hdDsKKyAgICBvZmZzZXQgPSBzcmMtPm9mZnNldDsKKyAgICByYW5nZSA9IHNyYy0+cmFuZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvOjpzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBpbWFnZVR5cGUoaW5fc3RydWN0LT5pbWFnZVR5cGUpLAorICAgIGZvcm1hdChpbl9zdHJ1Y3QtPmZvcm1hdCksCisgICAgZXh0ZW50KGluX3N0cnVjdC0+ZXh0ZW50KSwKKyAgICBtaXBMZXZlbHMoaW5fc3RydWN0LT5taXBMZXZlbHMpLAorICAgIGFycmF5TGF5ZXJzKGluX3N0cnVjdC0+YXJyYXlMYXllcnMpLAorICAgIHNhbXBsZXMoaW5fc3RydWN0LT5zYW1wbGVzKSwKKyAgICB0aWxpbmcoaW5fc3RydWN0LT50aWxpbmcpLAorICAgIHVzYWdlKGluX3N0cnVjdC0+dXNhZ2UpLAorICAgIHNoYXJpbmdNb2RlKGluX3N0cnVjdC0+c2hhcmluZ01vZGUpLAorICAgIHF1ZXVlRmFtaWx5SW5kZXhDb3VudChpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCksCisgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyhudWxscHRyKSwKKyAgICBpbml0aWFsTGF5b3V0KGluX3N0cnVjdC0+aW5pdGlhbExheW91dCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wUXVldWVGYW1pbHlJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbWFnZUNyZWF0ZUluZm86OnNhZmVfVmtJbWFnZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyhudWxscHRyKQore30KKworc2FmZV9Wa0ltYWdlQ3JlYXRlSW5mbzo6c2FmZV9Wa0ltYWdlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaW1hZ2VUeXBlID0gc3JjLmltYWdlVHlwZTsKKyAgICBmb3JtYXQgPSBzcmMuZm9ybWF0OworICAgIGV4dGVudCA9IHNyYy5leHRlbnQ7CisgICAgbWlwTGV2ZWxzID0gc3JjLm1pcExldmVsczsKKyAgICBhcnJheUxheWVycyA9IHNyYy5hcnJheUxheWVyczsKKyAgICBzYW1wbGVzID0gc3JjLnNhbXBsZXM7CisgICAgdGlsaW5nID0gc3JjLnRpbGluZzsKKyAgICB1c2FnZSA9IHNyYy51c2FnZTsKKyAgICBzaGFyaW5nTW9kZSA9IHNyYy5zaGFyaW5nTW9kZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBzcmMucXVldWVGYW1pbHlJbmRleENvdW50OworICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBudWxscHRyOworICAgIGluaXRpYWxMYXlvdXQgPSBzcmMuaW5pdGlhbExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBRdWV1ZUZhbWlseUluZGljZXMpIHsKKyAgICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMucXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopc3JjLnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvJiBzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwUXVldWVGYW1pbHlJbmRpY2VzKQorICAgICAgICBkZWxldGVbXSBwUXVldWVGYW1pbHlJbmRpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaW1hZ2VUeXBlID0gc3JjLmltYWdlVHlwZTsKKyAgICBmb3JtYXQgPSBzcmMuZm9ybWF0OworICAgIGV4dGVudCA9IHNyYy5leHRlbnQ7CisgICAgbWlwTGV2ZWxzID0gc3JjLm1pcExldmVsczsKKyAgICBhcnJheUxheWVycyA9IHNyYy5hcnJheUxheWVyczsKKyAgICBzYW1wbGVzID0gc3JjLnNhbXBsZXM7CisgICAgdGlsaW5nID0gc3JjLnRpbGluZzsKKyAgICB1c2FnZSA9IHNyYy51c2FnZTsKKyAgICBzaGFyaW5nTW9kZSA9IHNyYy5zaGFyaW5nTW9kZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBzcmMucXVldWVGYW1pbHlJbmRleENvdW50OworICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBudWxscHRyOworICAgIGluaXRpYWxMYXlvdXQgPSBzcmMuaW5pdGlhbExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBRdWV1ZUZhbWlseUluZGljZXMpIHsKKyAgICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMucXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopc3JjLnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvOjp+c2FmZV9Wa0ltYWdlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBRdWV1ZUZhbWlseUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgaW1hZ2VUeXBlID0gaW5fc3RydWN0LT5pbWFnZVR5cGU7CisgICAgZm9ybWF0ID0gaW5fc3RydWN0LT5mb3JtYXQ7CisgICAgZXh0ZW50ID0gaW5fc3RydWN0LT5leHRlbnQ7CisgICAgbWlwTGV2ZWxzID0gaW5fc3RydWN0LT5taXBMZXZlbHM7CisgICAgYXJyYXlMYXllcnMgPSBpbl9zdHJ1Y3QtPmFycmF5TGF5ZXJzOworICAgIHNhbXBsZXMgPSBpbl9zdHJ1Y3QtPnNhbXBsZXM7CisgICAgdGlsaW5nID0gaW5fc3RydWN0LT50aWxpbmc7CisgICAgdXNhZ2UgPSBpbl9zdHJ1Y3QtPnVzYWdlOworICAgIHNoYXJpbmdNb2RlID0gaW5fc3RydWN0LT5zaGFyaW5nTW9kZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBpbml0aWFsTGF5b3V0ID0gaW5fc3RydWN0LT5pbml0aWFsTGF5b3V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wUXVldWVGYW1pbHlJbmRpY2VzKSB7CisgICAgICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlRmFtaWx5SW5kaWNlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4Q291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGltYWdlVHlwZSA9IHNyYy0+aW1hZ2VUeXBlOworICAgIGZvcm1hdCA9IHNyYy0+Zm9ybWF0OworICAgIGV4dGVudCA9IHNyYy0+ZXh0ZW50OworICAgIG1pcExldmVscyA9IHNyYy0+bWlwTGV2ZWxzOworICAgIGFycmF5TGF5ZXJzID0gc3JjLT5hcnJheUxheWVyczsKKyAgICBzYW1wbGVzID0gc3JjLT5zYW1wbGVzOworICAgIHRpbGluZyA9IHNyYy0+dGlsaW5nOworICAgIHVzYWdlID0gc3JjLT51c2FnZTsKKyAgICBzaGFyaW5nTW9kZSA9IHNyYy0+c2hhcmluZ01vZGU7CisgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gc3JjLT5xdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG51bGxwdHI7CisgICAgaW5pdGlhbExheW91dCA9IHNyYy0+aW5pdGlhbExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy0+cXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopc3JjLT5wUXVldWVGYW1pbHlJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy0+cXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvOjpzYWZlX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyhjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGltYWdlKGluX3N0cnVjdC0+aW1hZ2UpLAorICAgIHZpZXdUeXBlKGluX3N0cnVjdC0+dmlld1R5cGUpLAorICAgIGZvcm1hdChpbl9zdHJ1Y3QtPmZvcm1hdCksCisgICAgY29tcG9uZW50cyhpbl9zdHJ1Y3QtPmNvbXBvbmVudHMpLAorICAgIHN1YnJlc291cmNlUmFuZ2UoaW5fc3RydWN0LT5zdWJyZXNvdXJjZVJhbmdlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlVmlld0NyZWF0ZUluZm86OnNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbzo6c2FmZV9Wa0ltYWdlVmlld0NyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0ltYWdlVmlld0NyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBpbWFnZSA9IHNyYy5pbWFnZTsKKyAgICB2aWV3VHlwZSA9IHNyYy52aWV3VHlwZTsKKyAgICBmb3JtYXQgPSBzcmMuZm9ybWF0OworICAgIGNvbXBvbmVudHMgPSBzcmMuY29tcG9uZW50czsKKyAgICBzdWJyZXNvdXJjZVJhbmdlID0gc3JjLnN1YnJlc291cmNlUmFuZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvJiBzYWZlX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBpbWFnZSA9IHNyYy5pbWFnZTsKKyAgICB2aWV3VHlwZSA9IHNyYy52aWV3VHlwZTsKKyAgICBmb3JtYXQgPSBzcmMuZm9ybWF0OworICAgIGNvbXBvbmVudHMgPSBzcmMuY29tcG9uZW50czsKKyAgICBzdWJyZXNvdXJjZVJhbmdlID0gc3JjLnN1YnJlc291cmNlUmFuZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvOjp+c2FmZV9Wa0ltYWdlVmlld0NyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgaW1hZ2UgPSBpbl9zdHJ1Y3QtPmltYWdlOworICAgIHZpZXdUeXBlID0gaW5fc3RydWN0LT52aWV3VHlwZTsKKyAgICBmb3JtYXQgPSBpbl9zdHJ1Y3QtPmZvcm1hdDsKKyAgICBjb21wb25lbnRzID0gaW5fc3RydWN0LT5jb21wb25lbnRzOworICAgIHN1YnJlc291cmNlUmFuZ2UgPSBpbl9zdHJ1Y3QtPnN1YnJlc291cmNlUmFuZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBpbWFnZSA9IHNyYy0+aW1hZ2U7CisgICAgdmlld1R5cGUgPSBzcmMtPnZpZXdUeXBlOworICAgIGZvcm1hdCA9IHNyYy0+Zm9ybWF0OworICAgIGNvbXBvbmVudHMgPSBzcmMtPmNvbXBvbmVudHM7CisgICAgc3VicmVzb3VyY2VSYW5nZSA9IHNyYy0+c3VicmVzb3VyY2VSYW5nZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvOjpzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyhjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGNvZGVTaXplKGluX3N0cnVjdC0+Y29kZVNpemUpLAorICAgIHBDb2RlKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBDb2RlKSB7CisgICAgICAgIHBDb2RlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCAqPihuZXcgdWludDhfdFtjb2RlU2l6ZV0pOworICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ29kZSwgKHZvaWQgKilpbl9zdHJ1Y3QtPnBDb2RlLCBjb2RlU2l6ZSk7CisgICAgfQorfQorCitzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbzo6c2FmZV9Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcENvZGUobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvOjpzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGNvZGVTaXplID0gc3JjLmNvZGVTaXplOworICAgIHBDb2RlID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBDb2RlKSB7CisgICAgICAgIHBDb2RlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCAqPihuZXcgdWludDhfdFtjb2RlU2l6ZV0pOworICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ29kZSwgKHZvaWQgKilzcmMucENvZGUsIGNvZGVTaXplKTsKKyAgICB9Cit9CisKK3NhZmVfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvJiBzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBDb2RlKQorICAgICAgICBkZWxldGVbXSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocENvZGUpOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgY29kZVNpemUgPSBzcmMuY29kZVNpemU7CisgICAgcENvZGUgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucENvZGUpIHsKKyAgICAgICAgcENvZGUgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90ICo+KG5ldyB1aW50OF90W2NvZGVTaXplXSk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKXBDb2RlLCAodm9pZCAqKXNyYy5wQ29kZSwgY29kZVNpemUpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm86On5zYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBDb2RlKQorICAgICAgICBkZWxldGVbXSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocENvZGUpOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgY29kZVNpemUgPSBpbl9zdHJ1Y3QtPmNvZGVTaXplOworICAgIHBDb2RlID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cENvZGUpIHsKKyAgICAgICAgcENvZGUgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90ICo+KG5ldyB1aW50OF90W2NvZGVTaXplXSk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKXBDb2RlLCAodm9pZCAqKWluX3N0cnVjdC0+cENvZGUsIGNvZGVTaXplKTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGNvZGVTaXplID0gc3JjLT5jb2RlU2l6ZTsKKyAgICBwQ29kZSA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBDb2RlKSB7CisgICAgICAgIHBDb2RlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCAqPihuZXcgdWludDhfdFtjb2RlU2l6ZV0pOworICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ29kZSwgKHZvaWQgKilzcmMtPnBDb2RlLCBjb2RlU2l6ZSk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBpbml0aWFsRGF0YVNpemUoaW5fc3RydWN0LT5pbml0aWFsRGF0YVNpemUpLAorICAgIHBJbml0aWFsRGF0YShpbl9zdHJ1Y3QtPnBJbml0aWFsRGF0YSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBJbml0aWFsRGF0YShudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaW5pdGlhbERhdGFTaXplID0gc3JjLmluaXRpYWxEYXRhU2l6ZTsKKyAgICBwSW5pdGlhbERhdGEgPSBzcmMucEluaXRpYWxEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8mIHNhZmVfVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaW5pdGlhbERhdGFTaXplID0gc3JjLmluaXRpYWxEYXRhU2l6ZTsKKyAgICBwSW5pdGlhbERhdGEgPSBzcmMucEluaXRpYWxEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm86On5zYWZlX1ZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBpbml0aWFsRGF0YVNpemUgPSBpbl9zdHJ1Y3QtPmluaXRpYWxEYXRhU2l6ZTsKKyAgICBwSW5pdGlhbERhdGEgPSBpbl9zdHJ1Y3QtPnBJbml0aWFsRGF0YTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgaW5pdGlhbERhdGFTaXplID0gc3JjLT5pbml0aWFsRGF0YVNpemU7CisgICAgcEluaXRpYWxEYXRhID0gc3JjLT5wSW5pdGlhbERhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvOjpzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvKGNvbnN0IFZrU3BlY2lhbGl6YXRpb25JbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBtYXBFbnRyeUNvdW50KGluX3N0cnVjdC0+bWFwRW50cnlDb3VudCksCisgICAgcE1hcEVudHJpZXMobnVsbHB0ciksCisgICAgZGF0YVNpemUoaW5fc3RydWN0LT5kYXRhU2l6ZSksCisgICAgcERhdGEoaW5fc3RydWN0LT5wRGF0YSkKK3sKKyAgICBpZiAoaW5fc3RydWN0LT5wTWFwRW50cmllcykgeworICAgICAgICBwTWFwRW50cmllcyA9IG5ldyBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnlbaW5fc3RydWN0LT5tYXBFbnRyeUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBNYXBFbnRyaWVzLCAodm9pZCAqKWluX3N0cnVjdC0+cE1hcEVudHJpZXMsIHNpemVvZihWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkpKmluX3N0cnVjdC0+bWFwRW50cnlDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvOjpzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvKCkgOgorICAgIHBNYXBFbnRyaWVzKG51bGxwdHIpLAorICAgIHBEYXRhKG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvOjpzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvKGNvbnN0IHNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm8mIHNyYykKK3sKKyAgICBtYXBFbnRyeUNvdW50ID0gc3JjLm1hcEVudHJ5Q291bnQ7CisgICAgcE1hcEVudHJpZXMgPSBudWxscHRyOworICAgIGRhdGFTaXplID0gc3JjLmRhdGFTaXplOworICAgIHBEYXRhID0gc3JjLnBEYXRhOworICAgIGlmIChzcmMucE1hcEVudHJpZXMpIHsKKyAgICAgICAgcE1hcEVudHJpZXMgPSBuZXcgVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5W3NyYy5tYXBFbnRyeUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBNYXBFbnRyaWVzLCAodm9pZCAqKXNyYy5wTWFwRW50cmllcywgc2l6ZW9mKFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSkqc3JjLm1hcEVudHJ5Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbyYgc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE1hcEVudHJpZXMpCisgICAgICAgIGRlbGV0ZVtdIHBNYXBFbnRyaWVzOworCisgICAgbWFwRW50cnlDb3VudCA9IHNyYy5tYXBFbnRyeUNvdW50OworICAgIHBNYXBFbnRyaWVzID0gbnVsbHB0cjsKKyAgICBkYXRhU2l6ZSA9IHNyYy5kYXRhU2l6ZTsKKyAgICBwRGF0YSA9IHNyYy5wRGF0YTsKKyAgICBpZiAoc3JjLnBNYXBFbnRyaWVzKSB7CisgICAgICAgIHBNYXBFbnRyaWVzID0gbmV3IFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeVtzcmMubWFwRW50cnlDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwTWFwRW50cmllcywgKHZvaWQgKilzcmMucE1hcEVudHJpZXMsIHNpemVvZihWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkpKnNyYy5tYXBFbnRyeUNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTcGVjaWFsaXphdGlvbkluZm86On5zYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvKCkKK3sKKyAgICBpZiAocE1hcEVudHJpZXMpCisgICAgICAgIGRlbGV0ZVtdIHBNYXBFbnRyaWVzOworfQorCit2b2lkIHNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm86OmluaXRpYWxpemUoY29uc3QgVmtTcGVjaWFsaXphdGlvbkluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBtYXBFbnRyeUNvdW50ID0gaW5fc3RydWN0LT5tYXBFbnRyeUNvdW50OworICAgIHBNYXBFbnRyaWVzID0gbnVsbHB0cjsKKyAgICBkYXRhU2l6ZSA9IGluX3N0cnVjdC0+ZGF0YVNpemU7CisgICAgcERhdGEgPSBpbl9zdHJ1Y3QtPnBEYXRhOworICAgIGlmIChpbl9zdHJ1Y3QtPnBNYXBFbnRyaWVzKSB7CisgICAgICAgIHBNYXBFbnRyaWVzID0gbmV3IFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeVtpbl9zdHJ1Y3QtPm1hcEVudHJ5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcE1hcEVudHJpZXMsICh2b2lkICopaW5fc3RydWN0LT5wTWFwRW50cmllcywgc2l6ZW9mKFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSkqaW5fc3RydWN0LT5tYXBFbnRyeUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvKiBzcmMpCit7CisgICAgbWFwRW50cnlDb3VudCA9IHNyYy0+bWFwRW50cnlDb3VudDsKKyAgICBwTWFwRW50cmllcyA9IG51bGxwdHI7CisgICAgZGF0YVNpemUgPSBzcmMtPmRhdGFTaXplOworICAgIHBEYXRhID0gc3JjLT5wRGF0YTsKKyAgICBpZiAoc3JjLT5wTWFwRW50cmllcykgeworICAgICAgICBwTWFwRW50cmllcyA9IG5ldyBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnlbc3JjLT5tYXBFbnRyeUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBNYXBFbnRyaWVzLCAodm9pZCAqKXNyYy0+cE1hcEVudHJpZXMsIHNpemVvZihWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkpKnNyYy0+bWFwRW50cnlDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBzdGFnZShpbl9zdHJ1Y3QtPnN0YWdlKSwKKyAgICBtb2R1bGUoaW5fc3RydWN0LT5tb2R1bGUpLAorICAgIHBTcGVjaWFsaXphdGlvbkluZm8obnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgcE5hbWUgPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnBOYW1lKTsKKyAgICBpZiAoaW5fc3RydWN0LT5wU3BlY2lhbGl6YXRpb25JbmZvKQorICAgICAgICBwU3BlY2lhbGl6YXRpb25JbmZvID0gbmV3IHNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm8oaW5fc3RydWN0LT5wU3BlY2lhbGl6YXRpb25JbmZvKTsKK30KKworc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcE5hbWUobnVsbHB0ciksCisgICAgcFNwZWNpYWxpemF0aW9uSW5mbyhudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgc3RhZ2UgPSBzcmMuc3RhZ2U7CisgICAgbW9kdWxlID0gc3JjLm1vZHVsZTsKKyAgICBwU3BlY2lhbGl6YXRpb25JbmZvID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBwTmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wTmFtZSk7CisgICAgaWYgKHNyYy5wU3BlY2lhbGl6YXRpb25JbmZvKQorICAgICAgICBwU3BlY2lhbGl6YXRpb25JbmZvID0gbmV3IHNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm8oKnNyYy5wU3BlY2lhbGl6YXRpb25JbmZvKTsKK30KKworc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvJiBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5hbWUpIGRlbGV0ZSBbXSBwTmFtZTsKKyAgICBpZiAocFNwZWNpYWxpemF0aW9uSW5mbykKKyAgICAgICAgZGVsZXRlIHBTcGVjaWFsaXphdGlvbkluZm87CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBzdGFnZSA9IHNyYy5zdGFnZTsKKyAgICBtb2R1bGUgPSBzcmMubW9kdWxlOworICAgIHBTcGVjaWFsaXphdGlvbkluZm8gPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIHBOYW1lID0gU2FmZVN0cmluZ0NvcHkoc3JjLnBOYW1lKTsKKyAgICBpZiAoc3JjLnBTcGVjaWFsaXphdGlvbkluZm8pCisgICAgICAgIHBTcGVjaWFsaXphdGlvbkluZm8gPSBuZXcgc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbygqc3JjLnBTcGVjaWFsaXphdGlvbkluZm8pOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm86On5zYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmFtZSkgZGVsZXRlIFtdIHBOYW1lOworICAgIGlmIChwU3BlY2lhbGl6YXRpb25JbmZvKQorICAgICAgICBkZWxldGUgcFNwZWNpYWxpemF0aW9uSW5mbzsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgc3RhZ2UgPSBpbl9zdHJ1Y3QtPnN0YWdlOworICAgIG1vZHVsZSA9IGluX3N0cnVjdC0+bW9kdWxlOworICAgIHBTcGVjaWFsaXphdGlvbkluZm8gPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBwTmFtZSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cE5hbWUpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBTcGVjaWFsaXphdGlvbkluZm8pCisgICAgICAgIHBTcGVjaWFsaXphdGlvbkluZm8gPSBuZXcgc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbyhpbl9zdHJ1Y3QtPnBTcGVjaWFsaXphdGlvbkluZm8pOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHN0YWdlID0gc3JjLT5zdGFnZTsKKyAgICBtb2R1bGUgPSBzcmMtPm1vZHVsZTsKKyAgICBwU3BlY2lhbGl6YXRpb25JbmZvID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgcE5hbWUgPSBTYWZlU3RyaW5nQ29weShzcmMtPnBOYW1lKTsKKyAgICBpZiAoc3JjLT5wU3BlY2lhbGl6YXRpb25JbmZvKQorICAgICAgICBwU3BlY2lhbGl6YXRpb25JbmZvID0gbmV3IHNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm8oKnNyYy0+cFNwZWNpYWxpemF0aW9uSW5mbyk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50KGluX3N0cnVjdC0+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQpLAorICAgIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zKG51bGxwdHIpLAorICAgIHZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQoaW5fc3RydWN0LT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50KSwKKyAgICBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zKSB7CisgICAgICAgIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gbmV3IFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb25baW5fc3RydWN0LT52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLCBzaXplb2YoVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbikqaW5fc3RydWN0LT52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMpIHsKKyAgICAgICAgcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9IG5ldyBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb25baW5fc3RydWN0LT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMsICh2b2lkICopaW5fc3RydWN0LT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLCBzaXplb2YoVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uKSppbl9zdHJ1Y3QtPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zKG51bGxwdHIpLAorICAgIHBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gc3JjLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50OworICAgIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gbnVsbHB0cjsKKyAgICB2ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gc3JjLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQ7CisgICAgcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucykgeworICAgICAgICBwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9IG5ldyBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uW3NyYy52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucywgKHZvaWQgKilzcmMucFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMsIHNpemVvZihWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uKSpzcmMudmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMpIHsKKyAgICAgICAgcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9IG5ldyBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb25bc3JjLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucywgKHZvaWQgKilzcmMucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucywgc2l6ZW9mKFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbikqc3JjLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8mIHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMpCisgICAgICAgIGRlbGV0ZVtdIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zOworICAgIGlmIChwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zKQorICAgICAgICBkZWxldGVbXSBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgdmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSBzcmMudmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ7CisgICAgcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgPSBudWxscHRyOworICAgIHZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSBzcmMudmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudDsKKyAgICBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zKSB7CisgICAgICAgIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gbmV3IFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb25bc3JjLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLCAodm9pZCAqKXNyYy5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucywgc2l6ZW9mKFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24pKnNyYy52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCk7CisgICAgfQorICAgIGlmIChzcmMucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucykgeworICAgICAgICBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gbmV3IFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbltzcmMudmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLCAodm9pZCAqKXNyYy5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLCBzaXplb2YoVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uKSpzcmMudmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbzo6fnNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMpCisgICAgICAgIGRlbGV0ZVtdIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zOworICAgIGlmIChwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zKQorICAgICAgICBkZWxldGVbXSBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgdmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSBpbl9zdHJ1Y3QtPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50OworICAgIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gbnVsbHB0cjsKKyAgICB2ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gaW5fc3RydWN0LT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50OworICAgIHBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucykgeworICAgICAgICBwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9IG5ldyBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uW2luX3N0cnVjdC0+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMsICh2b2lkICopaW5fc3RydWN0LT5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucywgc2l6ZW9mKFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24pKmluX3N0cnVjdC0+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zKSB7CisgICAgICAgIHBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgPSBuZXcgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uW2luX3N0cnVjdC0+dmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucywgc2l6ZW9mKFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbikqaW5fc3RydWN0LT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gc3JjLT52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudDsKKyAgICBwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9IG51bGxwdHI7CisgICAgdmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCA9IHNyYy0+dmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudDsKKyAgICBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMpIHsKKyAgICAgICAgcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgPSBuZXcgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbltzcmMtPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLCAodm9pZCAqKXNyYy0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMsIHNpemVvZihWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uKSpzcmMtPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy0+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucykgeworICAgICAgICBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gbmV3IFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbltzcmMtPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucywgKHZvaWQgKilzcmMtPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMsIHNpemVvZihWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24pKnNyYy0+dmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKGNvbnN0IFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICB0b3BvbG9neShpbl9zdHJ1Y3QtPnRvcG9sb2d5KSwKKyAgICBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlKGluX3N0cnVjdC0+cHJpbWl0aXZlUmVzdGFydEVuYWJsZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHRvcG9sb2d5ID0gc3JjLnRvcG9sb2d5OworICAgIHByaW1pdGl2ZVJlc3RhcnRFbmFibGUgPSBzcmMucHJpbWl0aXZlUmVzdGFydEVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyYgc2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHRvcG9sb2d5ID0gc3JjLnRvcG9sb2d5OworICAgIHByaW1pdGl2ZVJlc3RhcnRFbmFibGUgPSBzcmMucHJpbWl0aXZlUmVzdGFydEVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbzo6fnNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHRvcG9sb2d5ID0gaW5fc3RydWN0LT50b3BvbG9neTsKKyAgICBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlID0gaW5fc3RydWN0LT5wcmltaXRpdmVSZXN0YXJ0RW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHRvcG9sb2d5ID0gc3JjLT50b3BvbG9neTsKKyAgICBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlID0gc3JjLT5wcmltaXRpdmVSZXN0YXJ0RW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgcGF0Y2hDb250cm9sUG9pbnRzKGluX3N0cnVjdC0+cGF0Y2hDb250cm9sUG9pbnRzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBhdGNoQ29udHJvbFBvaW50cyA9IHNyYy5wYXRjaENvbnRyb2xQb2ludHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyYgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBwYXRjaENvbnRyb2xQb2ludHMgPSBzcmMucGF0Y2hDb250cm9sUG9pbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm86On5zYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBwYXRjaENvbnRyb2xQb2ludHMgPSBpbl9zdHJ1Y3QtPnBhdGNoQ29udHJvbFBvaW50czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcGF0Y2hDb250cm9sUG9pbnRzID0gc3JjLT5wYXRjaENvbnRyb2xQb2ludHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QsIGNvbnN0IGJvb2wgaXNfZHluYW1pY192aWV3cG9ydHMsIGNvbnN0IGJvb2wgaXNfZHluYW1pY19zY2lzc29ycykgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHZpZXdwb3J0Q291bnQoaW5fc3RydWN0LT52aWV3cG9ydENvdW50KSwKKyAgICBwVmlld3BvcnRzKG51bGxwdHIpLAorICAgIHNjaXNzb3JDb3VudChpbl9zdHJ1Y3QtPnNjaXNzb3JDb3VudCksCisgICAgcFNjaXNzb3JzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBWaWV3cG9ydHMgJiYgIWlzX2R5bmFtaWNfdmlld3BvcnRzKSB7CisgICAgICAgIHBWaWV3cG9ydHMgPSBuZXcgVmtWaWV3cG9ydFtpbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdwb3J0cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWaWV3cG9ydHMsIHNpemVvZihWa1ZpZXdwb3J0KSppbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBWaWV3cG9ydHMgPSBOVUxMOworICAgIGlmIChpbl9zdHJ1Y3QtPnBTY2lzc29ycyAmJiAhaXNfZHluYW1pY19zY2lzc29ycykgeworICAgICAgICBwU2Npc3NvcnMgPSBuZXcgVmtSZWN0MkRbaW5fc3RydWN0LT5zY2lzc29yQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNjaXNzb3JzLCAodm9pZCAqKWluX3N0cnVjdC0+cFNjaXNzb3JzLCBzaXplb2YoVmtSZWN0MkQpKmluX3N0cnVjdC0+c2Npc3NvckNvdW50KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwU2Npc3NvcnMgPSBOVUxMOworfQorCitzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFZpZXdwb3J0cyhudWxscHRyKSwKKyAgICBwU2Npc3NvcnMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHZpZXdwb3J0Q291bnQgPSBzcmMudmlld3BvcnRDb3VudDsKKyAgICBwVmlld3BvcnRzID0gbnVsbHB0cjsKKyAgICBzY2lzc29yQ291bnQgPSBzcmMuc2Npc3NvckNvdW50OworICAgIHBTY2lzc29ycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wVmlld3BvcnRzKSB7CisgICAgICAgIHBWaWV3cG9ydHMgPSBuZXcgVmtWaWV3cG9ydFtzcmMudmlld3BvcnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRzLCAodm9pZCAqKXNyYy5wVmlld3BvcnRzLCBzaXplb2YoVmtWaWV3cG9ydCkqc3JjLnZpZXdwb3J0Q291bnQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBWaWV3cG9ydHMgPSBOVUxMOworICAgIGlmIChzcmMucFNjaXNzb3JzKSB7CisgICAgICAgIHBTY2lzc29ycyA9IG5ldyBWa1JlY3QyRFtzcmMuc2Npc3NvckNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTY2lzc29ycywgKHZvaWQgKilzcmMucFNjaXNzb3JzLCBzaXplb2YoVmtSZWN0MkQpKnNyYy5zY2lzc29yQ291bnQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBTY2lzc29ycyA9IE5VTEw7Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvJiBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBWaWV3cG9ydHMpCisgICAgICAgIGRlbGV0ZVtdIHBWaWV3cG9ydHM7CisgICAgaWYgKHBTY2lzc29ycykKKyAgICAgICAgZGVsZXRlW10gcFNjaXNzb3JzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgdmlld3BvcnRDb3VudCA9IHNyYy52aWV3cG9ydENvdW50OworICAgIHBWaWV3cG9ydHMgPSBudWxscHRyOworICAgIHNjaXNzb3JDb3VudCA9IHNyYy5zY2lzc29yQ291bnQ7CisgICAgcFNjaXNzb3JzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBWaWV3cG9ydHMpIHsKKyAgICAgICAgcFZpZXdwb3J0cyA9IG5ldyBWa1ZpZXdwb3J0W3NyYy52aWV3cG9ydENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3cG9ydHMsICh2b2lkICopc3JjLnBWaWV3cG9ydHMsIHNpemVvZihWa1ZpZXdwb3J0KSpzcmMudmlld3BvcnRDb3VudCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcFZpZXdwb3J0cyA9IE5VTEw7CisgICAgaWYgKHNyYy5wU2Npc3NvcnMpIHsKKyAgICAgICAgcFNjaXNzb3JzID0gbmV3IFZrUmVjdDJEW3NyYy5zY2lzc29yQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNjaXNzb3JzLCAodm9pZCAqKXNyYy5wU2Npc3NvcnMsIHNpemVvZihWa1JlY3QyRCkqc3JjLnNjaXNzb3JDb3VudCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcFNjaXNzb3JzID0gTlVMTDsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm86On5zYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBWaWV3cG9ydHMpCisgICAgICAgIGRlbGV0ZVtdIHBWaWV3cG9ydHM7CisgICAgaWYgKHBTY2lzc29ycykKKyAgICAgICAgZGVsZXRlW10gcFNjaXNzb3JzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0LCBjb25zdCBib29sIGlzX2R5bmFtaWNfdmlld3BvcnRzLCBjb25zdCBib29sIGlzX2R5bmFtaWNfc2Npc3NvcnMpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICB2aWV3cG9ydENvdW50ID0gaW5fc3RydWN0LT52aWV3cG9ydENvdW50OworICAgIHBWaWV3cG9ydHMgPSBudWxscHRyOworICAgIHNjaXNzb3JDb3VudCA9IGluX3N0cnVjdC0+c2Npc3NvckNvdW50OworICAgIHBTY2lzc29ycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBWaWV3cG9ydHMgJiYgIWlzX2R5bmFtaWNfdmlld3BvcnRzKSB7CisgICAgICAgIHBWaWV3cG9ydHMgPSBuZXcgVmtWaWV3cG9ydFtpbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdwb3J0cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWaWV3cG9ydHMsIHNpemVvZihWa1ZpZXdwb3J0KSppbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBWaWV3cG9ydHMgPSBOVUxMOworICAgIGlmIChpbl9zdHJ1Y3QtPnBTY2lzc29ycyAmJiAhaXNfZHluYW1pY19zY2lzc29ycykgeworICAgICAgICBwU2Npc3NvcnMgPSBuZXcgVmtSZWN0MkRbaW5fc3RydWN0LT5zY2lzc29yQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNjaXNzb3JzLCAodm9pZCAqKWluX3N0cnVjdC0+cFNjaXNzb3JzLCBzaXplb2YoVmtSZWN0MkQpKmluX3N0cnVjdC0+c2Npc3NvckNvdW50KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwU2Npc3NvcnMgPSBOVUxMOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICB2aWV3cG9ydENvdW50ID0gc3JjLT52aWV3cG9ydENvdW50OworICAgIHBWaWV3cG9ydHMgPSBudWxscHRyOworICAgIHNjaXNzb3JDb3VudCA9IHNyYy0+c2Npc3NvckNvdW50OworICAgIHBTY2lzc29ycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBWaWV3cG9ydHMpIHsKKyAgICAgICAgcFZpZXdwb3J0cyA9IG5ldyBWa1ZpZXdwb3J0W3NyYy0+dmlld3BvcnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRzLCAodm9pZCAqKXNyYy0+cFZpZXdwb3J0cywgc2l6ZW9mKFZrVmlld3BvcnQpKnNyYy0+dmlld3BvcnRDb3VudCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcFZpZXdwb3J0cyA9IE5VTEw7CisgICAgaWYgKHNyYy0+cFNjaXNzb3JzKSB7CisgICAgICAgIHBTY2lzc29ycyA9IG5ldyBWa1JlY3QyRFtzcmMtPnNjaXNzb3JDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2Npc3NvcnMsICh2b2lkICopc3JjLT5wU2Npc3NvcnMsIHNpemVvZihWa1JlY3QyRCkqc3JjLT5zY2lzc29yQ291bnQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBTY2lzc29ycyA9IE5VTEw7Cit9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGRlcHRoQ2xhbXBFbmFibGUoaW5fc3RydWN0LT5kZXB0aENsYW1wRW5hYmxlKSwKKyAgICByYXN0ZXJpemVyRGlzY2FyZEVuYWJsZShpbl9zdHJ1Y3QtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlKSwKKyAgICBwb2x5Z29uTW9kZShpbl9zdHJ1Y3QtPnBvbHlnb25Nb2RlKSwKKyAgICBjdWxsTW9kZShpbl9zdHJ1Y3QtPmN1bGxNb2RlKSwKKyAgICBmcm9udEZhY2UoaW5fc3RydWN0LT5mcm9udEZhY2UpLAorICAgIGRlcHRoQmlhc0VuYWJsZShpbl9zdHJ1Y3QtPmRlcHRoQmlhc0VuYWJsZSksCisgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IoaW5fc3RydWN0LT5kZXB0aEJpYXNDb25zdGFudEZhY3RvciksCisgICAgZGVwdGhCaWFzQ2xhbXAoaW5fc3RydWN0LT5kZXB0aEJpYXNDbGFtcCksCisgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IoaW5fc3RydWN0LT5kZXB0aEJpYXNTbG9wZUZhY3RvciksCisgICAgbGluZVdpZHRoKGluX3N0cnVjdC0+bGluZVdpZHRoKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGVwdGhDbGFtcEVuYWJsZSA9IHNyYy5kZXB0aENsYW1wRW5hYmxlOworICAgIHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID0gc3JjLnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlOworICAgIHBvbHlnb25Nb2RlID0gc3JjLnBvbHlnb25Nb2RlOworICAgIGN1bGxNb2RlID0gc3JjLmN1bGxNb2RlOworICAgIGZyb250RmFjZSA9IHNyYy5mcm9udEZhY2U7CisgICAgZGVwdGhCaWFzRW5hYmxlID0gc3JjLmRlcHRoQmlhc0VuYWJsZTsKKyAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciA9IHNyYy5kZXB0aEJpYXNDb25zdGFudEZhY3RvcjsKKyAgICBkZXB0aEJpYXNDbGFtcCA9IHNyYy5kZXB0aEJpYXNDbGFtcDsKKyAgICBkZXB0aEJpYXNTbG9wZUZhY3RvciA9IHNyYy5kZXB0aEJpYXNTbG9wZUZhY3RvcjsKKyAgICBsaW5lV2lkdGggPSBzcmMubGluZVdpZHRoOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvJiBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGVwdGhDbGFtcEVuYWJsZSA9IHNyYy5kZXB0aENsYW1wRW5hYmxlOworICAgIHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID0gc3JjLnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlOworICAgIHBvbHlnb25Nb2RlID0gc3JjLnBvbHlnb25Nb2RlOworICAgIGN1bGxNb2RlID0gc3JjLmN1bGxNb2RlOworICAgIGZyb250RmFjZSA9IHNyYy5mcm9udEZhY2U7CisgICAgZGVwdGhCaWFzRW5hYmxlID0gc3JjLmRlcHRoQmlhc0VuYWJsZTsKKyAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciA9IHNyYy5kZXB0aEJpYXNDb25zdGFudEZhY3RvcjsKKyAgICBkZXB0aEJpYXNDbGFtcCA9IHNyYy5kZXB0aEJpYXNDbGFtcDsKKyAgICBkZXB0aEJpYXNTbG9wZUZhY3RvciA9IHNyYy5kZXB0aEJpYXNTbG9wZUZhY3RvcjsKKyAgICBsaW5lV2lkdGggPSBzcmMubGluZVdpZHRoOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvOjp+c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgZGVwdGhDbGFtcEVuYWJsZSA9IGluX3N0cnVjdC0+ZGVwdGhDbGFtcEVuYWJsZTsKKyAgICByYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA9IGluX3N0cnVjdC0+cmFzdGVyaXplckRpc2NhcmRFbmFibGU7CisgICAgcG9seWdvbk1vZGUgPSBpbl9zdHJ1Y3QtPnBvbHlnb25Nb2RlOworICAgIGN1bGxNb2RlID0gaW5fc3RydWN0LT5jdWxsTW9kZTsKKyAgICBmcm9udEZhY2UgPSBpbl9zdHJ1Y3QtPmZyb250RmFjZTsKKyAgICBkZXB0aEJpYXNFbmFibGUgPSBpbl9zdHJ1Y3QtPmRlcHRoQmlhc0VuYWJsZTsKKyAgICBkZXB0aEJpYXNDb25zdGFudEZhY3RvciA9IGluX3N0cnVjdC0+ZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3I7CisgICAgZGVwdGhCaWFzQ2xhbXAgPSBpbl9zdHJ1Y3QtPmRlcHRoQmlhc0NsYW1wOworICAgIGRlcHRoQmlhc1Nsb3BlRmFjdG9yID0gaW5fc3RydWN0LT5kZXB0aEJpYXNTbG9wZUZhY3RvcjsKKyAgICBsaW5lV2lkdGggPSBpbl9zdHJ1Y3QtPmxpbmVXaWR0aDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBkZXB0aENsYW1wRW5hYmxlID0gc3JjLT5kZXB0aENsYW1wRW5hYmxlOworICAgIHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID0gc3JjLT5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZTsKKyAgICBwb2x5Z29uTW9kZSA9IHNyYy0+cG9seWdvbk1vZGU7CisgICAgY3VsbE1vZGUgPSBzcmMtPmN1bGxNb2RlOworICAgIGZyb250RmFjZSA9IHNyYy0+ZnJvbnRGYWNlOworICAgIGRlcHRoQmlhc0VuYWJsZSA9IHNyYy0+ZGVwdGhCaWFzRW5hYmxlOworICAgIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yID0gc3JjLT5kZXB0aEJpYXNDb25zdGFudEZhY3RvcjsKKyAgICBkZXB0aEJpYXNDbGFtcCA9IHNyYy0+ZGVwdGhCaWFzQ2xhbXA7CisgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IgPSBzcmMtPmRlcHRoQmlhc1Nsb3BlRmFjdG9yOworICAgIGxpbmVXaWR0aCA9IHNyYy0+bGluZVdpZHRoOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKGNvbnN0IFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgcmFzdGVyaXphdGlvblNhbXBsZXMoaW5fc3RydWN0LT5yYXN0ZXJpemF0aW9uU2FtcGxlcyksCisgICAgc2FtcGxlU2hhZGluZ0VuYWJsZShpbl9zdHJ1Y3QtPnNhbXBsZVNoYWRpbmdFbmFibGUpLAorICAgIG1pblNhbXBsZVNoYWRpbmcoaW5fc3RydWN0LT5taW5TYW1wbGVTaGFkaW5nKSwKKyAgICBwU2FtcGxlTWFzayhudWxscHRyKSwKKyAgICBhbHBoYVRvQ292ZXJhZ2VFbmFibGUoaW5fc3RydWN0LT5hbHBoYVRvQ292ZXJhZ2VFbmFibGUpLAorICAgIGFscGhhVG9PbmVFbmFibGUoaW5fc3RydWN0LT5hbHBoYVRvT25lRW5hYmxlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wU2FtcGxlTWFzaykgeworICAgICAgICBwU2FtcGxlTWFzayA9IG5ldyBWa1NhbXBsZU1hc2soKmluX3N0cnVjdC0+cFNhbXBsZU1hc2spOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBTYW1wbGVNYXNrKG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICByYXN0ZXJpemF0aW9uU2FtcGxlcyA9IHNyYy5yYXN0ZXJpemF0aW9uU2FtcGxlczsKKyAgICBzYW1wbGVTaGFkaW5nRW5hYmxlID0gc3JjLnNhbXBsZVNoYWRpbmdFbmFibGU7CisgICAgbWluU2FtcGxlU2hhZGluZyA9IHNyYy5taW5TYW1wbGVTaGFkaW5nOworICAgIHBTYW1wbGVNYXNrID0gbnVsbHB0cjsKKyAgICBhbHBoYVRvQ292ZXJhZ2VFbmFibGUgPSBzcmMuYWxwaGFUb0NvdmVyYWdlRW5hYmxlOworICAgIGFscGhhVG9PbmVFbmFibGUgPSBzcmMuYWxwaGFUb09uZUVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBTYW1wbGVNYXNrKSB7CisgICAgICAgIHBTYW1wbGVNYXNrID0gbmV3IFZrU2FtcGxlTWFzaygqc3JjLnBTYW1wbGVNYXNrKTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvJiBzYWZlX1ZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBTYW1wbGVNYXNrKQorICAgICAgICBkZWxldGUgcFNhbXBsZU1hc2s7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICByYXN0ZXJpemF0aW9uU2FtcGxlcyA9IHNyYy5yYXN0ZXJpemF0aW9uU2FtcGxlczsKKyAgICBzYW1wbGVTaGFkaW5nRW5hYmxlID0gc3JjLnNhbXBsZVNoYWRpbmdFbmFibGU7CisgICAgbWluU2FtcGxlU2hhZGluZyA9IHNyYy5taW5TYW1wbGVTaGFkaW5nOworICAgIHBTYW1wbGVNYXNrID0gbnVsbHB0cjsKKyAgICBhbHBoYVRvQ292ZXJhZ2VFbmFibGUgPSBzcmMuYWxwaGFUb0NvdmVyYWdlRW5hYmxlOworICAgIGFscGhhVG9PbmVFbmFibGUgPSBzcmMuYWxwaGFUb09uZUVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBTYW1wbGVNYXNrKSB7CisgICAgICAgIHBTYW1wbGVNYXNrID0gbmV3IFZrU2FtcGxlTWFzaygqc3JjLnBTYW1wbGVNYXNrKTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvOjp+c2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwU2FtcGxlTWFzaykKKyAgICAgICAgZGVsZXRlIHBTYW1wbGVNYXNrOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgcmFzdGVyaXphdGlvblNhbXBsZXMgPSBpbl9zdHJ1Y3QtPnJhc3Rlcml6YXRpb25TYW1wbGVzOworICAgIHNhbXBsZVNoYWRpbmdFbmFibGUgPSBpbl9zdHJ1Y3QtPnNhbXBsZVNoYWRpbmdFbmFibGU7CisgICAgbWluU2FtcGxlU2hhZGluZyA9IGluX3N0cnVjdC0+bWluU2FtcGxlU2hhZGluZzsKKyAgICBwU2FtcGxlTWFzayA9IG51bGxwdHI7CisgICAgYWxwaGFUb0NvdmVyYWdlRW5hYmxlID0gaW5fc3RydWN0LT5hbHBoYVRvQ292ZXJhZ2VFbmFibGU7CisgICAgYWxwaGFUb09uZUVuYWJsZSA9IGluX3N0cnVjdC0+YWxwaGFUb09uZUVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFNhbXBsZU1hc2spIHsKKyAgICAgICAgcFNhbXBsZU1hc2sgPSBuZXcgVmtTYW1wbGVNYXNrKCppbl9zdHJ1Y3QtPnBTYW1wbGVNYXNrKTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHJhc3Rlcml6YXRpb25TYW1wbGVzID0gc3JjLT5yYXN0ZXJpemF0aW9uU2FtcGxlczsKKyAgICBzYW1wbGVTaGFkaW5nRW5hYmxlID0gc3JjLT5zYW1wbGVTaGFkaW5nRW5hYmxlOworICAgIG1pblNhbXBsZVNoYWRpbmcgPSBzcmMtPm1pblNhbXBsZVNoYWRpbmc7CisgICAgcFNhbXBsZU1hc2sgPSBudWxscHRyOworICAgIGFscGhhVG9Db3ZlcmFnZUVuYWJsZSA9IHNyYy0+YWxwaGFUb0NvdmVyYWdlRW5hYmxlOworICAgIGFscGhhVG9PbmVFbmFibGUgPSBzcmMtPmFscGhhVG9PbmVFbmFibGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBTYW1wbGVNYXNrKSB7CisgICAgICAgIHBTYW1wbGVNYXNrID0gbmV3IFZrU2FtcGxlTWFzaygqc3JjLT5wU2FtcGxlTWFzayk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBkZXB0aFRlc3RFbmFibGUoaW5fc3RydWN0LT5kZXB0aFRlc3RFbmFibGUpLAorICAgIGRlcHRoV3JpdGVFbmFibGUoaW5fc3RydWN0LT5kZXB0aFdyaXRlRW5hYmxlKSwKKyAgICBkZXB0aENvbXBhcmVPcChpbl9zdHJ1Y3QtPmRlcHRoQ29tcGFyZU9wKSwKKyAgICBkZXB0aEJvdW5kc1Rlc3RFbmFibGUoaW5fc3RydWN0LT5kZXB0aEJvdW5kc1Rlc3RFbmFibGUpLAorICAgIHN0ZW5jaWxUZXN0RW5hYmxlKGluX3N0cnVjdC0+c3RlbmNpbFRlc3RFbmFibGUpLAorICAgIGZyb250KGluX3N0cnVjdC0+ZnJvbnQpLAorICAgIGJhY2soaW5fc3RydWN0LT5iYWNrKSwKKyAgICBtaW5EZXB0aEJvdW5kcyhpbl9zdHJ1Y3QtPm1pbkRlcHRoQm91bmRzKSwKKyAgICBtYXhEZXB0aEJvdW5kcyhpbl9zdHJ1Y3QtPm1heERlcHRoQm91bmRzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGRlcHRoVGVzdEVuYWJsZSA9IHNyYy5kZXB0aFRlc3RFbmFibGU7CisgICAgZGVwdGhXcml0ZUVuYWJsZSA9IHNyYy5kZXB0aFdyaXRlRW5hYmxlOworICAgIGRlcHRoQ29tcGFyZU9wID0gc3JjLmRlcHRoQ29tcGFyZU9wOworICAgIGRlcHRoQm91bmRzVGVzdEVuYWJsZSA9IHNyYy5kZXB0aEJvdW5kc1Rlc3RFbmFibGU7CisgICAgc3RlbmNpbFRlc3RFbmFibGUgPSBzcmMuc3RlbmNpbFRlc3RFbmFibGU7CisgICAgZnJvbnQgPSBzcmMuZnJvbnQ7CisgICAgYmFjayA9IHNyYy5iYWNrOworICAgIG1pbkRlcHRoQm91bmRzID0gc3JjLm1pbkRlcHRoQm91bmRzOworICAgIG1heERlcHRoQm91bmRzID0gc3JjLm1heERlcHRoQm91bmRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8mIHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGVwdGhUZXN0RW5hYmxlID0gc3JjLmRlcHRoVGVzdEVuYWJsZTsKKyAgICBkZXB0aFdyaXRlRW5hYmxlID0gc3JjLmRlcHRoV3JpdGVFbmFibGU7CisgICAgZGVwdGhDb21wYXJlT3AgPSBzcmMuZGVwdGhDb21wYXJlT3A7CisgICAgZGVwdGhCb3VuZHNUZXN0RW5hYmxlID0gc3JjLmRlcHRoQm91bmRzVGVzdEVuYWJsZTsKKyAgICBzdGVuY2lsVGVzdEVuYWJsZSA9IHNyYy5zdGVuY2lsVGVzdEVuYWJsZTsKKyAgICBmcm9udCA9IHNyYy5mcm9udDsKKyAgICBiYWNrID0gc3JjLmJhY2s7CisgICAgbWluRGVwdGhCb3VuZHMgPSBzcmMubWluRGVwdGhCb3VuZHM7CisgICAgbWF4RGVwdGhCb3VuZHMgPSBzcmMubWF4RGVwdGhCb3VuZHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbzo6fnNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGRlcHRoVGVzdEVuYWJsZSA9IGluX3N0cnVjdC0+ZGVwdGhUZXN0RW5hYmxlOworICAgIGRlcHRoV3JpdGVFbmFibGUgPSBpbl9zdHJ1Y3QtPmRlcHRoV3JpdGVFbmFibGU7CisgICAgZGVwdGhDb21wYXJlT3AgPSBpbl9zdHJ1Y3QtPmRlcHRoQ29tcGFyZU9wOworICAgIGRlcHRoQm91bmRzVGVzdEVuYWJsZSA9IGluX3N0cnVjdC0+ZGVwdGhCb3VuZHNUZXN0RW5hYmxlOworICAgIHN0ZW5jaWxUZXN0RW5hYmxlID0gaW5fc3RydWN0LT5zdGVuY2lsVGVzdEVuYWJsZTsKKyAgICBmcm9udCA9IGluX3N0cnVjdC0+ZnJvbnQ7CisgICAgYmFjayA9IGluX3N0cnVjdC0+YmFjazsKKyAgICBtaW5EZXB0aEJvdW5kcyA9IGluX3N0cnVjdC0+bWluRGVwdGhCb3VuZHM7CisgICAgbWF4RGVwdGhCb3VuZHMgPSBpbl9zdHJ1Y3QtPm1heERlcHRoQm91bmRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBkZXB0aFRlc3RFbmFibGUgPSBzcmMtPmRlcHRoVGVzdEVuYWJsZTsKKyAgICBkZXB0aFdyaXRlRW5hYmxlID0gc3JjLT5kZXB0aFdyaXRlRW5hYmxlOworICAgIGRlcHRoQ29tcGFyZU9wID0gc3JjLT5kZXB0aENvbXBhcmVPcDsKKyAgICBkZXB0aEJvdW5kc1Rlc3RFbmFibGUgPSBzcmMtPmRlcHRoQm91bmRzVGVzdEVuYWJsZTsKKyAgICBzdGVuY2lsVGVzdEVuYWJsZSA9IHNyYy0+c3RlbmNpbFRlc3RFbmFibGU7CisgICAgZnJvbnQgPSBzcmMtPmZyb250OworICAgIGJhY2sgPSBzcmMtPmJhY2s7CisgICAgbWluRGVwdGhCb3VuZHMgPSBzcmMtPm1pbkRlcHRoQm91bmRzOworICAgIG1heERlcHRoQm91bmRzID0gc3JjLT5tYXhEZXB0aEJvdW5kczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGxvZ2ljT3BFbmFibGUoaW5fc3RydWN0LT5sb2dpY09wRW5hYmxlKSwKKyAgICBsb2dpY09wKGluX3N0cnVjdC0+bG9naWNPcCksCisgICAgYXR0YWNobWVudENvdW50KGluX3N0cnVjdC0+YXR0YWNobWVudENvdW50KSwKKyAgICBwQXR0YWNobWVudHMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBBdHRhY2htZW50cyA9IG5ldyBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZVtpbl9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQXR0YWNobWVudHMsICh2b2lkICopaW5fc3RydWN0LT5wQXR0YWNobWVudHMsIHNpemVvZihWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSkqaW5fc3RydWN0LT5hdHRhY2htZW50Q291bnQpOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGJsZW5kQ29uc3RhbnRzW2ldID0gaW5fc3RydWN0LT5ibGVuZENvbnN0YW50c1tpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEF0dGFjaG1lbnRzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBsb2dpY09wRW5hYmxlID0gc3JjLmxvZ2ljT3BFbmFibGU7CisgICAgbG9naWNPcCA9IHNyYy5sb2dpY09wOworICAgIGF0dGFjaG1lbnRDb3VudCA9IHNyYy5hdHRhY2htZW50Q291bnQ7CisgICAgcEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBBdHRhY2htZW50cykgeworICAgICAgICBwQXR0YWNobWVudHMgPSBuZXcgVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGVbc3JjLmF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQXR0YWNobWVudHMsICh2b2lkICopc3JjLnBBdHRhY2htZW50cywgc2l6ZW9mKFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlKSpzcmMuYXR0YWNobWVudENvdW50KTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBibGVuZENvbnN0YW50c1tpXSA9IHNyYy5ibGVuZENvbnN0YW50c1tpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8mIHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcEF0dGFjaG1lbnRzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgbG9naWNPcEVuYWJsZSA9IHNyYy5sb2dpY09wRW5hYmxlOworICAgIGxvZ2ljT3AgPSBzcmMubG9naWNPcDsKKyAgICBhdHRhY2htZW50Q291bnQgPSBzcmMuYXR0YWNobWVudENvdW50OworICAgIHBBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlW3NyYy5hdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEF0dGFjaG1lbnRzLCAodm9pZCAqKXNyYy5wQXR0YWNobWVudHMsIHNpemVvZihWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSkqc3JjLmF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgYmxlbmRDb25zdGFudHNbaV0gPSBzcmMuYmxlbmRDb25zdGFudHNbaV07CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvOjp+c2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcEF0dGFjaG1lbnRzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGxvZ2ljT3BFbmFibGUgPSBpbl9zdHJ1Y3QtPmxvZ2ljT3BFbmFibGU7CisgICAgbG9naWNPcCA9IGluX3N0cnVjdC0+bG9naWNPcDsKKyAgICBhdHRhY2htZW50Q291bnQgPSBpbl9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudDsKKyAgICBwQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlW2luX3N0cnVjdC0+YXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBdHRhY2htZW50cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBBdHRhY2htZW50cywgc2l6ZW9mKFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlKSppbl9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgYmxlbmRDb25zdGFudHNbaV0gPSBpbl9zdHJ1Y3QtPmJsZW5kQ29uc3RhbnRzW2ldOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGxvZ2ljT3BFbmFibGUgPSBzcmMtPmxvZ2ljT3BFbmFibGU7CisgICAgbG9naWNPcCA9IHNyYy0+bG9naWNPcDsKKyAgICBhdHRhY2htZW50Q291bnQgPSBzcmMtPmF0dGFjaG1lbnRDb3VudDsKKyAgICBwQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlW3NyYy0+YXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBdHRhY2htZW50cywgKHZvaWQgKilzcmMtPnBBdHRhY2htZW50cywgc2l6ZW9mKFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlKSpzcmMtPmF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgYmxlbmRDb25zdGFudHNbaV0gPSBzcmMtPmJsZW5kQ29uc3RhbnRzW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgZHluYW1pY1N0YXRlQ291bnQoaW5fc3RydWN0LT5keW5hbWljU3RhdGVDb3VudCksCisgICAgcER5bmFtaWNTdGF0ZXMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZXMpIHsKKyAgICAgICAgcER5bmFtaWNTdGF0ZXMgPSBuZXcgVmtEeW5hbWljU3RhdGVbaW5fc3RydWN0LT5keW5hbWljU3RhdGVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRHluYW1pY1N0YXRlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGVzLCBzaXplb2YoVmtEeW5hbWljU3RhdGUpKmluX3N0cnVjdC0+ZHluYW1pY1N0YXRlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwRHluYW1pY1N0YXRlcyhudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZHluYW1pY1N0YXRlQ291bnQgPSBzcmMuZHluYW1pY1N0YXRlQ291bnQ7CisgICAgcER5bmFtaWNTdGF0ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucER5bmFtaWNTdGF0ZXMpIHsKKyAgICAgICAgcER5bmFtaWNTdGF0ZXMgPSBuZXcgVmtEeW5hbWljU3RhdGVbc3JjLmR5bmFtaWNTdGF0ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEeW5hbWljU3RhdGVzLCAodm9pZCAqKXNyYy5wRHluYW1pY1N0YXRlcywgc2l6ZW9mKFZrRHluYW1pY1N0YXRlKSpzcmMuZHluYW1pY1N0YXRlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyYgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocER5bmFtaWNTdGF0ZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEeW5hbWljU3RhdGVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZHluYW1pY1N0YXRlQ291bnQgPSBzcmMuZHluYW1pY1N0YXRlQ291bnQ7CisgICAgcER5bmFtaWNTdGF0ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucER5bmFtaWNTdGF0ZXMpIHsKKyAgICAgICAgcER5bmFtaWNTdGF0ZXMgPSBuZXcgVmtEeW5hbWljU3RhdGVbc3JjLmR5bmFtaWNTdGF0ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEeW5hbWljU3RhdGVzLCAodm9pZCAqKXNyYy5wRHluYW1pY1N0YXRlcywgc2l6ZW9mKFZrRHluYW1pY1N0YXRlKSpzcmMuZHluYW1pY1N0YXRlQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbzo6fnNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwRHluYW1pY1N0YXRlcykKKyAgICAgICAgZGVsZXRlW10gcER5bmFtaWNTdGF0ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgZHluYW1pY1N0YXRlQ291bnQgPSBpbl9zdHJ1Y3QtPmR5bmFtaWNTdGF0ZUNvdW50OworICAgIHBEeW5hbWljU3RhdGVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZXMpIHsKKyAgICAgICAgcER5bmFtaWNTdGF0ZXMgPSBuZXcgVmtEeW5hbWljU3RhdGVbaW5fc3RydWN0LT5keW5hbWljU3RhdGVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRHluYW1pY1N0YXRlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGVzLCBzaXplb2YoVmtEeW5hbWljU3RhdGUpKmluX3N0cnVjdC0+ZHluYW1pY1N0YXRlQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGR5bmFtaWNTdGF0ZUNvdW50ID0gc3JjLT5keW5hbWljU3RhdGVDb3VudDsKKyAgICBwRHluYW1pY1N0YXRlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBEeW5hbWljU3RhdGVzKSB7CisgICAgICAgIHBEeW5hbWljU3RhdGVzID0gbmV3IFZrRHluYW1pY1N0YXRlW3NyYy0+ZHluYW1pY1N0YXRlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcER5bmFtaWNTdGF0ZXMsICh2b2lkICopc3JjLT5wRHluYW1pY1N0YXRlcywgc2l6ZW9mKFZrRHluYW1pY1N0YXRlKSpzcmMtPmR5bmFtaWNTdGF0ZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzo6c2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIGluX3N0cnVjdCwgY29uc3QgYm9vbCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQsIGNvbnN0IGJvb2wgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHN0YWdlQ291bnQoaW5fc3RydWN0LT5zdGFnZUNvdW50KSwKKyAgICBwU3RhZ2VzKG51bGxwdHIpLAorICAgIHBWZXJ0ZXhJbnB1dFN0YXRlKG51bGxwdHIpLAorICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUobnVsbHB0ciksCisgICAgcFRlc3NlbGxhdGlvblN0YXRlKG51bGxwdHIpLAorICAgIHBWaWV3cG9ydFN0YXRlKG51bGxwdHIpLAorICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUobnVsbHB0ciksCisgICAgcE11bHRpc2FtcGxlU3RhdGUobnVsbHB0ciksCisgICAgcERlcHRoU3RlbmNpbFN0YXRlKG51bGxwdHIpLAorICAgIHBDb2xvckJsZW5kU3RhdGUobnVsbHB0ciksCisgICAgcER5bmFtaWNTdGF0ZShudWxscHRyKSwKKyAgICBsYXlvdXQoaW5fc3RydWN0LT5sYXlvdXQpLAorICAgIHJlbmRlclBhc3MoaW5fc3RydWN0LT5yZW5kZXJQYXNzKSwKKyAgICBzdWJwYXNzKGluX3N0cnVjdC0+c3VicGFzcyksCisgICAgYmFzZVBpcGVsaW5lSGFuZGxlKGluX3N0cnVjdC0+YmFzZVBpcGVsaW5lSGFuZGxlKSwKKyAgICBiYXNlUGlwZWxpbmVJbmRleChpbl9zdHJ1Y3QtPmJhc2VQaXBlbGluZUluZGV4KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoc3RhZ2VDb3VudCAmJiBpbl9zdHJ1Y3QtPnBTdGFnZXMpIHsKKyAgICAgICAgcFN0YWdlcyA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm9bc3RhZ2VDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdGFnZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTdGFnZXNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wU3RhZ2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wVmVydGV4SW5wdXRTdGF0ZSkKKyAgICAgICAgcFZlcnRleElucHV0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wVmVydGV4SW5wdXRTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IE5VTEw7CisgICAgaWYgKGluX3N0cnVjdC0+cElucHV0QXNzZW1ibHlTdGF0ZSkKKyAgICAgICAgcElucHV0QXNzZW1ibHlTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cElucHV0QXNzZW1ibHlTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwSW5wdXRBc3NlbWJseVN0YXRlID0gTlVMTDsKKyAgICBib29sIGhhc190ZXNzZWxsYXRpb25fc3RhZ2UgPSBmYWxzZTsKKyAgICBpZiAoc3RhZ2VDb3VudCAmJiBwU3RhZ2VzKQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3RhZ2VDb3VudCAmJiAhaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZTsgKytpKQorICAgICAgICAgICAgaWYgKHBTdGFnZXNbaV0uc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCB8fCBwU3RhZ2VzW2ldLnN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQpCisgICAgICAgICAgICAgICAgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSA9IHRydWU7CisgICAgaWYgKGluX3N0cnVjdC0+cFRlc3NlbGxhdGlvblN0YXRlICYmIGhhc190ZXNzZWxsYXRpb25fc3RhZ2UpCisgICAgICAgIHBUZXNzZWxsYXRpb25TdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wVGVzc2VsbGF0aW9uU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcFRlc3NlbGxhdGlvblN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcFRlc3NlbGxhdGlvblN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIGJvb2wgaGFzX3Jhc3Rlcml6YXRpb24gPSBpbl9zdHJ1Y3QtPnBSYXN0ZXJpemF0aW9uU3RhdGUgPyAhaW5fc3RydWN0LT5wUmFzdGVyaXphdGlvblN0YXRlLT5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA6IGZhbHNlOworICAgIGlmIChpbl9zdHJ1Y3QtPnBWaWV3cG9ydFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uKSB7CisgICAgICAgIGJvb2wgaXNfZHluYW1pY192aWV3cG9ydHMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBpc19keW5hbWljX3NjaXNzb3JzID0gZmFsc2U7CisgICAgICAgIGlmIChpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUgJiYgaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlLT5wRHluYW1pY1N0YXRlcykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZS0+ZHluYW1pY1N0YXRlQ291bnQgJiYgIWlzX2R5bmFtaWNfdmlld3BvcnRzOyArK2kpCisgICAgICAgICAgICAgICAgaWYgKGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZS0+cER5bmFtaWNTdGF0ZXNbaV0gPT0gVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCkKKyAgICAgICAgICAgICAgICAgICAgaXNfZHluYW1pY192aWV3cG9ydHMgPSB0cnVlOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZS0+ZHluYW1pY1N0YXRlQ291bnQgJiYgIWlzX2R5bmFtaWNfc2Npc3NvcnM7ICsraSkKKyAgICAgICAgICAgICAgICBpZiAoaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlLT5wRHluYW1pY1N0YXRlc1tpXSA9PSBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1IpCisgICAgICAgICAgICAgICAgICAgIGlzX2R5bmFtaWNfc2Npc3NvcnMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHBWaWV3cG9ydFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cFZpZXdwb3J0U3RhdGUsIGlzX2R5bmFtaWNfdmlld3BvcnRzLCBpc19keW5hbWljX3NjaXNzb3JzKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcFZpZXdwb3J0U3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwVmlld3BvcnRTdGF0ZSBwb2ludGVyIGlnbm9yZWQKKyAgICBpZiAoaW5fc3RydWN0LT5wUmFzdGVyaXphdGlvblN0YXRlKQorICAgICAgICBwUmFzdGVyaXphdGlvblN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wUmFzdGVyaXphdGlvblN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBOVUxMOworICAgIGlmIChpbl9zdHJ1Y3QtPnBNdWx0aXNhbXBsZVN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uKQorICAgICAgICBwTXVsdGlzYW1wbGVTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBNdWx0aXNhbXBsZVN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBNdWx0aXNhbXBsZVN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcE11bHRpc2FtcGxlU3RhdGUgcG9pbnRlciBpZ25vcmVkCisgICAgLy8gbmVlZHMgYSB0cmFja2VkIHN1YnBhc3Mgc3RhdGUgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudAorICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXB0aFN0ZW5jaWxTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbiAmJiB1c2VzX2RlcHRoc3RlbmNpbF9hdHRhY2htZW50KQorICAgICAgICBwRGVwdGhTdGVuY2lsU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cERlcHRoU3RlbmNpbFN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBEZXB0aFN0ZW5jaWxTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBEZXB0aFN0ZW5jaWxTdGF0ZSBwb2ludGVyIGlnbm9yZWQKKyAgICAvLyBuZWVkcyBhIHRyYWNrZWQgc3VicGFzcyBzdGF0ZSB1c2VzQ29sb3JBdHRhY2htZW50CisgICAgaWYgKGluX3N0cnVjdC0+cENvbG9yQmxlbmRTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbiAmJiB1c2VzX2NvbG9yX2F0dGFjaG1lbnQpCisgICAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBDb2xvckJsZW5kU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcENvbG9yQmxlbmRTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBDb2xvckJsZW5kU3RhdGUgcG9pbnRlciBpZ25vcmVkCisgICAgaWYgKGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZSkKKyAgICAgICAgcER5bmFtaWNTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwRHluYW1pY1N0YXRlID0gTlVMTDsKK30KKworc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvOjpzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFN0YWdlcyhudWxscHRyKSwKKyAgICBwVmVydGV4SW5wdXRTdGF0ZShudWxscHRyKSwKKyAgICBwSW5wdXRBc3NlbWJseVN0YXRlKG51bGxwdHIpLAorICAgIHBUZXNzZWxsYXRpb25TdGF0ZShudWxscHRyKSwKKyAgICBwVmlld3BvcnRTdGF0ZShudWxscHRyKSwKKyAgICBwUmFzdGVyaXphdGlvblN0YXRlKG51bGxwdHIpLAorICAgIHBNdWx0aXNhbXBsZVN0YXRlKG51bGxwdHIpLAorICAgIHBEZXB0aFN0ZW5jaWxTdGF0ZShudWxscHRyKSwKKyAgICBwQ29sb3JCbGVuZFN0YXRlKG51bGxwdHIpLAorICAgIHBEeW5hbWljU3RhdGUobnVsbHB0cikKK3t9CisKK3NhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzo6c2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHN0YWdlQ291bnQgPSBzcmMuc3RhZ2VDb3VudDsKKyAgICBwU3RhZ2VzID0gbnVsbHB0cjsKKyAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IG51bGxwdHI7CisgICAgcElucHV0QXNzZW1ibHlTdGF0ZSA9IG51bGxwdHI7CisgICAgcFRlc3NlbGxhdGlvblN0YXRlID0gbnVsbHB0cjsKKyAgICBwVmlld3BvcnRTdGF0ZSA9IG51bGxwdHI7CisgICAgcFJhc3Rlcml6YXRpb25TdGF0ZSA9IG51bGxwdHI7CisgICAgcE11bHRpc2FtcGxlU3RhdGUgPSBudWxscHRyOworICAgIHBEZXB0aFN0ZW5jaWxTdGF0ZSA9IG51bGxwdHI7CisgICAgcENvbG9yQmxlbmRTdGF0ZSA9IG51bGxwdHI7CisgICAgcER5bmFtaWNTdGF0ZSA9IG51bGxwdHI7CisgICAgbGF5b3V0ID0gc3JjLmxheW91dDsKKyAgICByZW5kZXJQYXNzID0gc3JjLnJlbmRlclBhc3M7CisgICAgc3VicGFzcyA9IHNyYy5zdWJwYXNzOworICAgIGJhc2VQaXBlbGluZUhhbmRsZSA9IHNyYy5iYXNlUGlwZWxpbmVIYW5kbGU7CisgICAgYmFzZVBpcGVsaW5lSW5kZXggPSBzcmMuYmFzZVBpcGVsaW5lSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHN0YWdlQ291bnQgJiYgc3JjLnBTdGFnZXMpIHsKKyAgICAgICAgcFN0YWdlcyA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm9bc3RhZ2VDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdGFnZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTdGFnZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBTdGFnZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucFZlcnRleElucHV0U3RhdGUpCisgICAgICAgIHBWZXJ0ZXhJbnB1dFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKCpzcmMucFZlcnRleElucHV0U3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcFZlcnRleElucHV0U3RhdGUgPSBOVUxMOworICAgIGlmIChzcmMucElucHV0QXNzZW1ibHlTdGF0ZSkKKyAgICAgICAgcElucHV0QXNzZW1ibHlTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKCpzcmMucElucHV0QXNzZW1ibHlTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwSW5wdXRBc3NlbWJseVN0YXRlID0gTlVMTDsKKyAgICBib29sIGhhc190ZXNzZWxsYXRpb25fc3RhZ2UgPSBmYWxzZTsKKyAgICBpZiAoc3RhZ2VDb3VudCAmJiBwU3RhZ2VzKQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3RhZ2VDb3VudCAmJiAhaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZTsgKytpKQorICAgICAgICAgICAgaWYgKHBTdGFnZXNbaV0uc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCB8fCBwU3RhZ2VzW2ldLnN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQpCisgICAgICAgICAgICAgICAgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSA9IHRydWU7CisgICAgaWYgKHNyYy5wVGVzc2VsbGF0aW9uU3RhdGUgJiYgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSkKKyAgICAgICAgcFRlc3NlbGxhdGlvblN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbygqc3JjLnBUZXNzZWxsYXRpb25TdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwVGVzc2VsbGF0aW9uU3RhdGUgcG9pbnRlciBpZ25vcmVkCisgICAgYm9vbCBoYXNfcmFzdGVyaXphdGlvbiA9IHNyYy5wUmFzdGVyaXphdGlvblN0YXRlID8gIXNyYy5wUmFzdGVyaXphdGlvblN0YXRlLT5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA6IGZhbHNlOworICAgIGlmIChzcmMucFZpZXdwb3J0U3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pIHsKKyAgICAgICAgcFZpZXdwb3J0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wVmlld3BvcnRTdGF0ZSk7CisgICAgfSBlbHNlCisgICAgICAgIHBWaWV3cG9ydFN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcFZpZXdwb3J0U3RhdGUgcG9pbnRlciBpZ25vcmVkCisgICAgaWYgKHNyYy5wUmFzdGVyaXphdGlvblN0YXRlKQorICAgICAgICBwUmFzdGVyaXphdGlvblN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8oKnNyYy5wUmFzdGVyaXphdGlvblN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBOVUxMOworICAgIGlmIChzcmMucE11bHRpc2FtcGxlU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pCisgICAgICAgIHBNdWx0aXNhbXBsZVN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKCpzcmMucE11bHRpc2FtcGxlU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcE11bHRpc2FtcGxlU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwTXVsdGlzYW1wbGVTdGF0ZSBwb2ludGVyIGlnbm9yZWQKKyAgICBpZiAoc3JjLnBEZXB0aFN0ZW5jaWxTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbikKKyAgICAgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbygqc3JjLnBEZXB0aFN0ZW5jaWxTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwRGVwdGhTdGVuY2lsU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwRGVwdGhTdGVuY2lsU3RhdGUgcG9pbnRlciBpZ25vcmVkCisgICAgaWYgKHNyYy5wQ29sb3JCbGVuZFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uKQorICAgICAgICBwQ29sb3JCbGVuZFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wQ29sb3JCbGVuZFN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwQ29sb3JCbGVuZFN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIGlmIChzcmMucER5bmFtaWNTdGF0ZSkKKyAgICAgICAgcER5bmFtaWNTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKCpzcmMucER5bmFtaWNTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwRHluYW1pY1N0YXRlID0gTlVMTDsKK30KKworc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvJiBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFN0YWdlcykKKyAgICAgICAgZGVsZXRlW10gcFN0YWdlczsKKyAgICBpZiAocFZlcnRleElucHV0U3RhdGUpCisgICAgICAgIGRlbGV0ZSBwVmVydGV4SW5wdXRTdGF0ZTsKKyAgICBpZiAocElucHV0QXNzZW1ibHlTdGF0ZSkKKyAgICAgICAgZGVsZXRlIHBJbnB1dEFzc2VtYmx5U3RhdGU7CisgICAgaWYgKHBUZXNzZWxsYXRpb25TdGF0ZSkKKyAgICAgICAgZGVsZXRlIHBUZXNzZWxsYXRpb25TdGF0ZTsKKyAgICBpZiAocFZpZXdwb3J0U3RhdGUpCisgICAgICAgIGRlbGV0ZSBwVmlld3BvcnRTdGF0ZTsKKyAgICBpZiAocFJhc3Rlcml6YXRpb25TdGF0ZSkKKyAgICAgICAgZGVsZXRlIHBSYXN0ZXJpemF0aW9uU3RhdGU7CisgICAgaWYgKHBNdWx0aXNhbXBsZVN0YXRlKQorICAgICAgICBkZWxldGUgcE11bHRpc2FtcGxlU3RhdGU7CisgICAgaWYgKHBEZXB0aFN0ZW5jaWxTdGF0ZSkKKyAgICAgICAgZGVsZXRlIHBEZXB0aFN0ZW5jaWxTdGF0ZTsKKyAgICBpZiAocENvbG9yQmxlbmRTdGF0ZSkKKyAgICAgICAgZGVsZXRlIHBDb2xvckJsZW5kU3RhdGU7CisgICAgaWYgKHBEeW5hbWljU3RhdGUpCisgICAgICAgIGRlbGV0ZSBwRHluYW1pY1N0YXRlOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgc3RhZ2VDb3VudCA9IHNyYy5zdGFnZUNvdW50OworICAgIHBTdGFnZXMgPSBudWxscHRyOworICAgIHBWZXJ0ZXhJbnB1dFN0YXRlID0gbnVsbHB0cjsKKyAgICBwSW5wdXRBc3NlbWJseVN0YXRlID0gbnVsbHB0cjsKKyAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBudWxscHRyOworICAgIHBWaWV3cG9ydFN0YXRlID0gbnVsbHB0cjsKKyAgICBwUmFzdGVyaXphdGlvblN0YXRlID0gbnVsbHB0cjsKKyAgICBwTXVsdGlzYW1wbGVTdGF0ZSA9IG51bGxwdHI7CisgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gbnVsbHB0cjsKKyAgICBwQ29sb3JCbGVuZFN0YXRlID0gbnVsbHB0cjsKKyAgICBwRHluYW1pY1N0YXRlID0gbnVsbHB0cjsKKyAgICBsYXlvdXQgPSBzcmMubGF5b3V0OworICAgIHJlbmRlclBhc3MgPSBzcmMucmVuZGVyUGFzczsKKyAgICBzdWJwYXNzID0gc3JjLnN1YnBhc3M7CisgICAgYmFzZVBpcGVsaW5lSGFuZGxlID0gc3JjLmJhc2VQaXBlbGluZUhhbmRsZTsKKyAgICBiYXNlUGlwZWxpbmVJbmRleCA9IHNyYy5iYXNlUGlwZWxpbmVJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3RhZ2VDb3VudCAmJiBzcmMucFN0YWdlcykgeworICAgICAgICBwU3RhZ2VzID0gbmV3IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1tzdGFnZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0YWdlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN0YWdlc1tpXS5pbml0aWFsaXplKCZzcmMucFN0YWdlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wVmVydGV4SW5wdXRTdGF0ZSkKKyAgICAgICAgcFZlcnRleElucHV0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wVmVydGV4SW5wdXRTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IE5VTEw7CisgICAgaWYgKHNyYy5wSW5wdXRBc3NlbWJseVN0YXRlKQorICAgICAgICBwSW5wdXRBc3NlbWJseVN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wSW5wdXRBc3NlbWJseVN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUgPSBOVUxMOworICAgIGJvb2wgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSA9IGZhbHNlOworICAgIGlmIChzdGFnZUNvdW50ICYmIHBTdGFnZXMpCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdGFnZUNvdW50ICYmICFoYXNfdGVzc2VsbGF0aW9uX3N0YWdlOyArK2kpCisgICAgICAgICAgICBpZiAocFN0YWdlc1tpXS5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUIHx8IHBTdGFnZXNbaV0uc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCkKKyAgICAgICAgICAgICAgICBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlID0gdHJ1ZTsKKyAgICBpZiAoc3JjLnBUZXNzZWxsYXRpb25TdGF0ZSAmJiBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlKQorICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKCpzcmMucFRlc3NlbGxhdGlvblN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBUZXNzZWxsYXRpb25TdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBUZXNzZWxsYXRpb25TdGF0ZSBwb2ludGVyIGlnbm9yZWQKKyAgICBib29sIGhhc19yYXN0ZXJpemF0aW9uID0gc3JjLnBSYXN0ZXJpemF0aW9uU3RhdGUgPyAhc3JjLnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlIDogZmFsc2U7CisgICAgaWYgKHNyYy5wVmlld3BvcnRTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbikgeworICAgICAgICBwVmlld3BvcnRTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbygqc3JjLnBWaWV3cG9ydFN0YXRlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcFZpZXdwb3J0U3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwVmlld3BvcnRTdGF0ZSBwb2ludGVyIGlnbm9yZWQKKyAgICBpZiAoc3JjLnBSYXN0ZXJpemF0aW9uU3RhdGUpCisgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbygqc3JjLnBSYXN0ZXJpemF0aW9uU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcFJhc3Rlcml6YXRpb25TdGF0ZSA9IE5VTEw7CisgICAgaWYgKHNyYy5wTXVsdGlzYW1wbGVTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbikKKyAgICAgICAgcE11bHRpc2FtcGxlU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wTXVsdGlzYW1wbGVTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwTXVsdGlzYW1wbGVTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBNdWx0aXNhbXBsZVN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIGlmIChzcmMucERlcHRoU3RlbmNpbFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uKQorICAgICAgICBwRGVwdGhTdGVuY2lsU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKCpzcmMucERlcHRoU3RlbmNpbFN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBEZXB0aFN0ZW5jaWxTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBEZXB0aFN0ZW5jaWxTdGF0ZSBwb2ludGVyIGlnbm9yZWQKKyAgICBpZiAoc3JjLnBDb2xvckJsZW5kU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pCisgICAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbygqc3JjLnBDb2xvckJsZW5kU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcENvbG9yQmxlbmRTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBDb2xvckJsZW5kU3RhdGUgcG9pbnRlciBpZ25vcmVkCisgICAgaWYgKHNyYy5wRHluYW1pY1N0YXRlKQorICAgICAgICBwRHluYW1pY1N0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wRHluYW1pY1N0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBEeW5hbWljU3RhdGUgPSBOVUxMOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm86On5zYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwU3RhZ2VzKQorICAgICAgICBkZWxldGVbXSBwU3RhZ2VzOworICAgIGlmIChwVmVydGV4SW5wdXRTdGF0ZSkKKyAgICAgICAgZGVsZXRlIHBWZXJ0ZXhJbnB1dFN0YXRlOworICAgIGlmIChwSW5wdXRBc3NlbWJseVN0YXRlKQorICAgICAgICBkZWxldGUgcElucHV0QXNzZW1ibHlTdGF0ZTsKKyAgICBpZiAocFRlc3NlbGxhdGlvblN0YXRlKQorICAgICAgICBkZWxldGUgcFRlc3NlbGxhdGlvblN0YXRlOworICAgIGlmIChwVmlld3BvcnRTdGF0ZSkKKyAgICAgICAgZGVsZXRlIHBWaWV3cG9ydFN0YXRlOworICAgIGlmIChwUmFzdGVyaXphdGlvblN0YXRlKQorICAgICAgICBkZWxldGUgcFJhc3Rlcml6YXRpb25TdGF0ZTsKKyAgICBpZiAocE11bHRpc2FtcGxlU3RhdGUpCisgICAgICAgIGRlbGV0ZSBwTXVsdGlzYW1wbGVTdGF0ZTsKKyAgICBpZiAocERlcHRoU3RlbmNpbFN0YXRlKQorICAgICAgICBkZWxldGUgcERlcHRoU3RlbmNpbFN0YXRlOworICAgIGlmIChwQ29sb3JCbGVuZFN0YXRlKQorICAgICAgICBkZWxldGUgcENvbG9yQmxlbmRTdGF0ZTsKKyAgICBpZiAocER5bmFtaWNTdGF0ZSkKKyAgICAgICAgZGVsZXRlIHBEeW5hbWljU3RhdGU7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIGluX3N0cnVjdCwgY29uc3QgYm9vbCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQsIGNvbnN0IGJvb2wgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHN0YWdlQ291bnQgPSBpbl9zdHJ1Y3QtPnN0YWdlQ291bnQ7CisgICAgcFN0YWdlcyA9IG51bGxwdHI7CisgICAgcFZlcnRleElucHV0U3RhdGUgPSBudWxscHRyOworICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUgPSBudWxscHRyOworICAgIHBUZXNzZWxsYXRpb25TdGF0ZSA9IG51bGxwdHI7CisgICAgcFZpZXdwb3J0U3RhdGUgPSBudWxscHRyOworICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBudWxscHRyOworICAgIHBNdWx0aXNhbXBsZVN0YXRlID0gbnVsbHB0cjsKKyAgICBwRGVwdGhTdGVuY2lsU3RhdGUgPSBudWxscHRyOworICAgIHBDb2xvckJsZW5kU3RhdGUgPSBudWxscHRyOworICAgIHBEeW5hbWljU3RhdGUgPSBudWxscHRyOworICAgIGxheW91dCA9IGluX3N0cnVjdC0+bGF5b3V0OworICAgIHJlbmRlclBhc3MgPSBpbl9zdHJ1Y3QtPnJlbmRlclBhc3M7CisgICAgc3VicGFzcyA9IGluX3N0cnVjdC0+c3VicGFzczsKKyAgICBiYXNlUGlwZWxpbmVIYW5kbGUgPSBpbl9zdHJ1Y3QtPmJhc2VQaXBlbGluZUhhbmRsZTsKKyAgICBiYXNlUGlwZWxpbmVJbmRleCA9IGluX3N0cnVjdC0+YmFzZVBpcGVsaW5lSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChzdGFnZUNvdW50ICYmIGluX3N0cnVjdC0+cFN0YWdlcykgeworICAgICAgICBwU3RhZ2VzID0gbmV3IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1tzdGFnZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0YWdlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN0YWdlc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBTdGFnZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBWZXJ0ZXhJbnB1dFN0YXRlKQorICAgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBWZXJ0ZXhJbnB1dFN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBWZXJ0ZXhJbnB1dFN0YXRlID0gTlVMTDsKKyAgICBpZiAoaW5fc3RydWN0LT5wSW5wdXRBc3NlbWJseVN0YXRlKQorICAgICAgICBwSW5wdXRBc3NlbWJseVN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wSW5wdXRBc3NlbWJseVN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUgPSBOVUxMOworICAgIGJvb2wgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSA9IGZhbHNlOworICAgIGlmIChzdGFnZUNvdW50ICYmIHBTdGFnZXMpCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdGFnZUNvdW50ICYmICFoYXNfdGVzc2VsbGF0aW9uX3N0YWdlOyArK2kpCisgICAgICAgICAgICBpZiAocFN0YWdlc1tpXS5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUIHx8IHBTdGFnZXNbaV0uc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCkKKyAgICAgICAgICAgICAgICBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlID0gdHJ1ZTsKKyAgICBpZiAoaW5fc3RydWN0LT5wVGVzc2VsbGF0aW9uU3RhdGUgJiYgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSkKKyAgICAgICAgcFRlc3NlbGxhdGlvblN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBUZXNzZWxsYXRpb25TdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwVGVzc2VsbGF0aW9uU3RhdGUgcG9pbnRlciBpZ25vcmVkCisgICAgYm9vbCBoYXNfcmFzdGVyaXphdGlvbiA9IGluX3N0cnVjdC0+cFJhc3Rlcml6YXRpb25TdGF0ZSA/ICFpbl9zdHJ1Y3QtPnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlIDogZmFsc2U7CisgICAgaWYgKGluX3N0cnVjdC0+cFZpZXdwb3J0U3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pIHsKKyAgICAgICAgYm9vbCBpc19keW5hbWljX3ZpZXdwb3J0cyA9IGZhbHNlOworICAgICAgICBib29sIGlzX2R5bmFtaWNfc2Npc3NvcnMgPSBmYWxzZTsKKyAgICAgICAgaWYgKGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZSAmJiBpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlLT5keW5hbWljU3RhdGVDb3VudCAmJiAhaXNfZHluYW1pY192aWV3cG9ydHM7ICsraSkKKyAgICAgICAgICAgICAgICBpZiAoaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlLT5wRHluYW1pY1N0YXRlc1tpXSA9PSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUKQorICAgICAgICAgICAgICAgICAgICBpc19keW5hbWljX3ZpZXdwb3J0cyA9IHRydWU7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlLT5keW5hbWljU3RhdGVDb3VudCAmJiAhaXNfZHluYW1pY19zY2lzc29yczsgKytpKQorICAgICAgICAgICAgICAgIGlmIChpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzW2ldID09IFZLX0RZTkFNSUNfU1RBVEVfU0NJU1NPUikKKyAgICAgICAgICAgICAgICAgICAgaXNfZHluYW1pY19zY2lzc29ycyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcFZpZXdwb3J0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wVmlld3BvcnRTdGF0ZSwgaXNfZHluYW1pY192aWV3cG9ydHMsIGlzX2R5bmFtaWNfc2Npc3NvcnMpOworICAgIH0gZWxzZQorICAgICAgICBwVmlld3BvcnRTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBWaWV3cG9ydFN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIGlmIChpbl9zdHJ1Y3QtPnBSYXN0ZXJpemF0aW9uU3RhdGUpCisgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBSYXN0ZXJpemF0aW9uU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcFJhc3Rlcml6YXRpb25TdGF0ZSA9IE5VTEw7CisgICAgaWYgKGluX3N0cnVjdC0+cE11bHRpc2FtcGxlU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pCisgICAgICAgIHBNdWx0aXNhbXBsZVN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cE11bHRpc2FtcGxlU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcE11bHRpc2FtcGxlU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwTXVsdGlzYW1wbGVTdGF0ZSBwb2ludGVyIGlnbm9yZWQKKyAgICAvLyBuZWVkcyBhIHRyYWNrZWQgc3VicGFzcyBzdGF0ZSB1c2VzX2RlcHRoc3RlbmNpbF9hdHRhY2htZW50CisgICAgaWYgKGluX3N0cnVjdC0+cERlcHRoU3RlbmNpbFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uICYmIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQpCisgICAgICAgIHBEZXB0aFN0ZW5jaWxTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wRGVwdGhTdGVuY2lsU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcERlcHRoU3RlbmNpbFN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIC8vIG5lZWRzIGEgdHJhY2tlZCBzdWJwYXNzIHN0YXRlIHVzZXNDb2xvckF0dGFjaG1lbnQKKyAgICBpZiAoaW5fc3RydWN0LT5wQ29sb3JCbGVuZFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uICYmIHVzZXNfY29sb3JfYXR0YWNobWVudCkKKyAgICAgICAgcENvbG9yQmxlbmRTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cENvbG9yQmxlbmRTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwQ29sb3JCbGVuZFN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcENvbG9yQmxlbmRTdGF0ZSBwb2ludGVyIGlnbm9yZWQKKyAgICBpZiAoaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlKQorICAgICAgICBwRHluYW1pY1N0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBEeW5hbWljU3RhdGUgPSBOVUxMOworfQorCit2b2lkIHNhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHN0YWdlQ291bnQgPSBzcmMtPnN0YWdlQ291bnQ7CisgICAgcFN0YWdlcyA9IG51bGxwdHI7CisgICAgcFZlcnRleElucHV0U3RhdGUgPSBudWxscHRyOworICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUgPSBudWxscHRyOworICAgIHBUZXNzZWxsYXRpb25TdGF0ZSA9IG51bGxwdHI7CisgICAgcFZpZXdwb3J0U3RhdGUgPSBudWxscHRyOworICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBudWxscHRyOworICAgIHBNdWx0aXNhbXBsZVN0YXRlID0gbnVsbHB0cjsKKyAgICBwRGVwdGhTdGVuY2lsU3RhdGUgPSBudWxscHRyOworICAgIHBDb2xvckJsZW5kU3RhdGUgPSBudWxscHRyOworICAgIHBEeW5hbWljU3RhdGUgPSBudWxscHRyOworICAgIGxheW91dCA9IHNyYy0+bGF5b3V0OworICAgIHJlbmRlclBhc3MgPSBzcmMtPnJlbmRlclBhc3M7CisgICAgc3VicGFzcyA9IHNyYy0+c3VicGFzczsKKyAgICBiYXNlUGlwZWxpbmVIYW5kbGUgPSBzcmMtPmJhc2VQaXBlbGluZUhhbmRsZTsKKyAgICBiYXNlUGlwZWxpbmVJbmRleCA9IHNyYy0+YmFzZVBpcGVsaW5lSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzdGFnZUNvdW50ICYmIHNyYy0+cFN0YWdlcykgeworICAgICAgICBwU3RhZ2VzID0gbmV3IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1tzdGFnZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0YWdlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN0YWdlc1tpXS5pbml0aWFsaXplKCZzcmMtPnBTdGFnZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMtPnBWZXJ0ZXhJbnB1dFN0YXRlKQorICAgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbygqc3JjLT5wVmVydGV4SW5wdXRTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IE5VTEw7CisgICAgaWYgKHNyYy0+cElucHV0QXNzZW1ibHlTdGF0ZSkKKyAgICAgICAgcElucHV0QXNzZW1ibHlTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKCpzcmMtPnBJbnB1dEFzc2VtYmx5U3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcElucHV0QXNzZW1ibHlTdGF0ZSA9IE5VTEw7CisgICAgYm9vbCBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlID0gZmFsc2U7CisgICAgaWYgKHN0YWdlQ291bnQgJiYgcFN0YWdlcykKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0YWdlQ291bnQgJiYgIWhhc190ZXNzZWxsYXRpb25fc3RhZ2U7ICsraSkKKyAgICAgICAgICAgIGlmIChwU3RhZ2VzW2ldLnN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQgfHwgcFN0YWdlc1tpXS5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUKQorICAgICAgICAgICAgICAgIGhhc190ZXNzZWxsYXRpb25fc3RhZ2UgPSB0cnVlOworICAgIGlmIChzcmMtPnBUZXNzZWxsYXRpb25TdGF0ZSAmJiBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlKQorICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKCpzcmMtPnBUZXNzZWxsYXRpb25TdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwVGVzc2VsbGF0aW9uU3RhdGUgcG9pbnRlciBpZ25vcmVkCisgICAgYm9vbCBoYXNfcmFzdGVyaXphdGlvbiA9IHNyYy0+cFJhc3Rlcml6YXRpb25TdGF0ZSA/ICFzcmMtPnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlIDogZmFsc2U7CisgICAgaWYgKHNyYy0+cFZpZXdwb3J0U3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pIHsKKyAgICAgICAgcFZpZXdwb3J0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oKnNyYy0+cFZpZXdwb3J0U3RhdGUpOworICAgIH0gZWxzZQorICAgICAgICBwVmlld3BvcnRTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBWaWV3cG9ydFN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIGlmIChzcmMtPnBSYXN0ZXJpemF0aW9uU3RhdGUpCisgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbygqc3JjLT5wUmFzdGVyaXphdGlvblN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBOVUxMOworICAgIGlmIChzcmMtPnBNdWx0aXNhbXBsZVN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uKQorICAgICAgICBwTXVsdGlzYW1wbGVTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbygqc3JjLT5wTXVsdGlzYW1wbGVTdGF0ZSk7CisgICAgZWxzZQorICAgICAgICBwTXVsdGlzYW1wbGVTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBNdWx0aXNhbXBsZVN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIGlmIChzcmMtPnBEZXB0aFN0ZW5jaWxTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbikKKyAgICAgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbygqc3JjLT5wRGVwdGhTdGVuY2lsU3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcERlcHRoU3RlbmNpbFN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIGlmIChzcmMtPnBDb2xvckJsZW5kU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pCisgICAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbygqc3JjLT5wQ29sb3JCbGVuZFN0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwQ29sb3JCbGVuZFN0YXRlIHBvaW50ZXIgaWdub3JlZAorICAgIGlmIChzcmMtPnBEeW5hbWljU3RhdGUpCisgICAgICAgIHBEeW5hbWljU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbygqc3JjLT5wRHluYW1pY1N0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIHBEeW5hbWljU3RhdGUgPSBOVUxMOworfQorCitzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbzo6c2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8oY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBzdGFnZSgmaW5fc3RydWN0LT5zdGFnZSksCisgICAgbGF5b3V0KGluX3N0cnVjdC0+bGF5b3V0KSwKKyAgICBiYXNlUGlwZWxpbmVIYW5kbGUoaW5fc3RydWN0LT5iYXNlUGlwZWxpbmVIYW5kbGUpLAorICAgIGJhc2VQaXBlbGluZUluZGV4KGluX3N0cnVjdC0+YmFzZVBpcGVsaW5lSW5kZXgpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbzo6c2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvOjpzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHN0YWdlLmluaXRpYWxpemUoJnNyYy5zdGFnZSk7CisgICAgbGF5b3V0ID0gc3JjLmxheW91dDsKKyAgICBiYXNlUGlwZWxpbmVIYW5kbGUgPSBzcmMuYmFzZVBpcGVsaW5lSGFuZGxlOworICAgIGJhc2VQaXBlbGluZUluZGV4ID0gc3JjLmJhc2VQaXBlbGluZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyYgc2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgc3RhZ2UuaW5pdGlhbGl6ZSgmc3JjLnN0YWdlKTsKKyAgICBsYXlvdXQgPSBzcmMubGF5b3V0OworICAgIGJhc2VQaXBlbGluZUhhbmRsZSA9IHNyYy5iYXNlUGlwZWxpbmVIYW5kbGU7CisgICAgYmFzZVBpcGVsaW5lSW5kZXggPSBzcmMuYmFzZVBpcGVsaW5lSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvOjp+c2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgc3RhZ2UuaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5zdGFnZSk7CisgICAgbGF5b3V0ID0gaW5fc3RydWN0LT5sYXlvdXQ7CisgICAgYmFzZVBpcGVsaW5lSGFuZGxlID0gaW5fc3RydWN0LT5iYXNlUGlwZWxpbmVIYW5kbGU7CisgICAgYmFzZVBpcGVsaW5lSW5kZXggPSBpbl9zdHJ1Y3QtPmJhc2VQaXBlbGluZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgc3RhZ2UuaW5pdGlhbGl6ZSgmc3JjLT5zdGFnZSk7CisgICAgbGF5b3V0ID0gc3JjLT5sYXlvdXQ7CisgICAgYmFzZVBpcGVsaW5lSGFuZGxlID0gc3JjLT5iYXNlUGlwZWxpbmVIYW5kbGU7CisgICAgYmFzZVBpcGVsaW5lSW5kZXggPSBzcmMtPmJhc2VQaXBlbGluZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgc2V0TGF5b3V0Q291bnQoaW5fc3RydWN0LT5zZXRMYXlvdXRDb3VudCksCisgICAgcFNldExheW91dHMobnVsbHB0ciksCisgICAgcHVzaENvbnN0YW50UmFuZ2VDb3VudChpbl9zdHJ1Y3QtPnB1c2hDb25zdGFudFJhbmdlQ291bnQpLAorICAgIHBQdXNoQ29uc3RhbnRSYW5nZXMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKHNldExheW91dENvdW50ICYmIGluX3N0cnVjdC0+cFNldExheW91dHMpIHsKKyAgICAgICAgcFNldExheW91dHMgPSBuZXcgVmtEZXNjcmlwdG9yU2V0TGF5b3V0W3NldExheW91dENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNldExheW91dENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTZXRMYXlvdXRzW2ldID0gaW5fc3RydWN0LT5wU2V0TGF5b3V0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wUHVzaENvbnN0YW50UmFuZ2VzKSB7CisgICAgICAgIHBQdXNoQ29uc3RhbnRSYW5nZXMgPSBuZXcgVmtQdXNoQ29uc3RhbnRSYW5nZVtpbl9zdHJ1Y3QtPnB1c2hDb25zdGFudFJhbmdlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFB1c2hDb25zdGFudFJhbmdlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBQdXNoQ29uc3RhbnRSYW5nZXMsIHNpemVvZihWa1B1c2hDb25zdGFudFJhbmdlKSppbl9zdHJ1Y3QtPnB1c2hDb25zdGFudFJhbmdlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbzo6c2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwU2V0TGF5b3V0cyhudWxscHRyKSwKKyAgICBwUHVzaENvbnN0YW50UmFuZ2VzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBzZXRMYXlvdXRDb3VudCA9IHNyYy5zZXRMYXlvdXRDb3VudDsKKyAgICBwU2V0TGF5b3V0cyA9IG51bGxwdHI7CisgICAgcHVzaENvbnN0YW50UmFuZ2VDb3VudCA9IHNyYy5wdXNoQ29uc3RhbnRSYW5nZUNvdW50OworICAgIHBQdXNoQ29uc3RhbnRSYW5nZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzZXRMYXlvdXRDb3VudCAmJiBzcmMucFNldExheW91dHMpIHsKKyAgICAgICAgcFNldExheW91dHMgPSBuZXcgVmtEZXNjcmlwdG9yU2V0TGF5b3V0W3NldExheW91dENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNldExheW91dENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTZXRMYXlvdXRzW2ldID0gc3JjLnBTZXRMYXlvdXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucFB1c2hDb25zdGFudFJhbmdlcykgeworICAgICAgICBwUHVzaENvbnN0YW50UmFuZ2VzID0gbmV3IFZrUHVzaENvbnN0YW50UmFuZ2Vbc3JjLnB1c2hDb25zdGFudFJhbmdlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFB1c2hDb25zdGFudFJhbmdlcywgKHZvaWQgKilzcmMucFB1c2hDb25zdGFudFJhbmdlcywgc2l6ZW9mKFZrUHVzaENvbnN0YW50UmFuZ2UpKnNyYy5wdXNoQ29uc3RhbnRSYW5nZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8mIHNhZmVfVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBTZXRMYXlvdXRzKQorICAgICAgICBkZWxldGVbXSBwU2V0TGF5b3V0czsKKyAgICBpZiAocFB1c2hDb25zdGFudFJhbmdlcykKKyAgICAgICAgZGVsZXRlW10gcFB1c2hDb25zdGFudFJhbmdlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHNldExheW91dENvdW50ID0gc3JjLnNldExheW91dENvdW50OworICAgIHBTZXRMYXlvdXRzID0gbnVsbHB0cjsKKyAgICBwdXNoQ29uc3RhbnRSYW5nZUNvdW50ID0gc3JjLnB1c2hDb25zdGFudFJhbmdlQ291bnQ7CisgICAgcFB1c2hDb25zdGFudFJhbmdlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNldExheW91dENvdW50ICYmIHNyYy5wU2V0TGF5b3V0cykgeworICAgICAgICBwU2V0TGF5b3V0cyA9IG5ldyBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRbc2V0TGF5b3V0Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2V0TGF5b3V0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNldExheW91dHNbaV0gPSBzcmMucFNldExheW91dHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wUHVzaENvbnN0YW50UmFuZ2VzKSB7CisgICAgICAgIHBQdXNoQ29uc3RhbnRSYW5nZXMgPSBuZXcgVmtQdXNoQ29uc3RhbnRSYW5nZVtzcmMucHVzaENvbnN0YW50UmFuZ2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUHVzaENvbnN0YW50UmFuZ2VzLCAodm9pZCAqKXNyYy5wUHVzaENvbnN0YW50UmFuZ2VzLCBzaXplb2YoVmtQdXNoQ29uc3RhbnRSYW5nZSkqc3JjLnB1c2hDb25zdGFudFJhbmdlQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbzo6fnNhZmVfVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8oKQoreworICAgIGlmIChwU2V0TGF5b3V0cykKKyAgICAgICAgZGVsZXRlW10gcFNldExheW91dHM7CisgICAgaWYgKHBQdXNoQ29uc3RhbnRSYW5nZXMpCisgICAgICAgIGRlbGV0ZVtdIHBQdXNoQ29uc3RhbnRSYW5nZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgc2V0TGF5b3V0Q291bnQgPSBpbl9zdHJ1Y3QtPnNldExheW91dENvdW50OworICAgIHBTZXRMYXlvdXRzID0gbnVsbHB0cjsKKyAgICBwdXNoQ29uc3RhbnRSYW5nZUNvdW50ID0gaW5fc3RydWN0LT5wdXNoQ29uc3RhbnRSYW5nZUNvdW50OworICAgIHBQdXNoQ29uc3RhbnRSYW5nZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoc2V0TGF5b3V0Q291bnQgJiYgaW5fc3RydWN0LT5wU2V0TGF5b3V0cykgeworICAgICAgICBwU2V0TGF5b3V0cyA9IG5ldyBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRbc2V0TGF5b3V0Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2V0TGF5b3V0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNldExheW91dHNbaV0gPSBpbl9zdHJ1Y3QtPnBTZXRMYXlvdXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBQdXNoQ29uc3RhbnRSYW5nZXMpIHsKKyAgICAgICAgcFB1c2hDb25zdGFudFJhbmdlcyA9IG5ldyBWa1B1c2hDb25zdGFudFJhbmdlW2luX3N0cnVjdC0+cHVzaENvbnN0YW50UmFuZ2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUHVzaENvbnN0YW50UmFuZ2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cFB1c2hDb25zdGFudFJhbmdlcywgc2l6ZW9mKFZrUHVzaENvbnN0YW50UmFuZ2UpKmluX3N0cnVjdC0+cHVzaENvbnN0YW50UmFuZ2VDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgc2V0TGF5b3V0Q291bnQgPSBzcmMtPnNldExheW91dENvdW50OworICAgIHBTZXRMYXlvdXRzID0gbnVsbHB0cjsKKyAgICBwdXNoQ29uc3RhbnRSYW5nZUNvdW50ID0gc3JjLT5wdXNoQ29uc3RhbnRSYW5nZUNvdW50OworICAgIHBQdXNoQ29uc3RhbnRSYW5nZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc2V0TGF5b3V0Q291bnQgJiYgc3JjLT5wU2V0TGF5b3V0cykgeworICAgICAgICBwU2V0TGF5b3V0cyA9IG5ldyBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRbc2V0TGF5b3V0Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2V0TGF5b3V0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNldExheW91dHNbaV0gPSBzcmMtPnBTZXRMYXlvdXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMtPnBQdXNoQ29uc3RhbnRSYW5nZXMpIHsKKyAgICAgICAgcFB1c2hDb25zdGFudFJhbmdlcyA9IG5ldyBWa1B1c2hDb25zdGFudFJhbmdlW3NyYy0+cHVzaENvbnN0YW50UmFuZ2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUHVzaENvbnN0YW50UmFuZ2VzLCAodm9pZCAqKXNyYy0+cFB1c2hDb25zdGFudFJhbmdlcywgc2l6ZW9mKFZrUHVzaENvbnN0YW50UmFuZ2UpKnNyYy0+cHVzaENvbnN0YW50UmFuZ2VDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm86OnNhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbyhjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBtYWdGaWx0ZXIoaW5fc3RydWN0LT5tYWdGaWx0ZXIpLAorICAgIG1pbkZpbHRlcihpbl9zdHJ1Y3QtPm1pbkZpbHRlciksCisgICAgbWlwbWFwTW9kZShpbl9zdHJ1Y3QtPm1pcG1hcE1vZGUpLAorICAgIGFkZHJlc3NNb2RlVShpbl9zdHJ1Y3QtPmFkZHJlc3NNb2RlVSksCisgICAgYWRkcmVzc01vZGVWKGluX3N0cnVjdC0+YWRkcmVzc01vZGVWKSwKKyAgICBhZGRyZXNzTW9kZVcoaW5fc3RydWN0LT5hZGRyZXNzTW9kZVcpLAorICAgIG1pcExvZEJpYXMoaW5fc3RydWN0LT5taXBMb2RCaWFzKSwKKyAgICBhbmlzb3Ryb3B5RW5hYmxlKGluX3N0cnVjdC0+YW5pc290cm9weUVuYWJsZSksCisgICAgbWF4QW5pc290cm9weShpbl9zdHJ1Y3QtPm1heEFuaXNvdHJvcHkpLAorICAgIGNvbXBhcmVFbmFibGUoaW5fc3RydWN0LT5jb21wYXJlRW5hYmxlKSwKKyAgICBjb21wYXJlT3AoaW5fc3RydWN0LT5jb21wYXJlT3ApLAorICAgIG1pbkxvZChpbl9zdHJ1Y3QtPm1pbkxvZCksCisgICAgbWF4TG9kKGluX3N0cnVjdC0+bWF4TG9kKSwKKyAgICBib3JkZXJDb2xvcihpbl9zdHJ1Y3QtPmJvcmRlckNvbG9yKSwKKyAgICB1bm5vcm1hbGl6ZWRDb29yZGluYXRlcyhpbl9zdHJ1Y3QtPnVubm9ybWFsaXplZENvb3JkaW5hdGVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NhbXBsZXJDcmVhdGVJbmZvOjpzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbzo6c2FmZV9Wa1NhbXBsZXJDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIG1hZ0ZpbHRlciA9IHNyYy5tYWdGaWx0ZXI7CisgICAgbWluRmlsdGVyID0gc3JjLm1pbkZpbHRlcjsKKyAgICBtaXBtYXBNb2RlID0gc3JjLm1pcG1hcE1vZGU7CisgICAgYWRkcmVzc01vZGVVID0gc3JjLmFkZHJlc3NNb2RlVTsKKyAgICBhZGRyZXNzTW9kZVYgPSBzcmMuYWRkcmVzc01vZGVWOworICAgIGFkZHJlc3NNb2RlVyA9IHNyYy5hZGRyZXNzTW9kZVc7CisgICAgbWlwTG9kQmlhcyA9IHNyYy5taXBMb2RCaWFzOworICAgIGFuaXNvdHJvcHlFbmFibGUgPSBzcmMuYW5pc290cm9weUVuYWJsZTsKKyAgICBtYXhBbmlzb3Ryb3B5ID0gc3JjLm1heEFuaXNvdHJvcHk7CisgICAgY29tcGFyZUVuYWJsZSA9IHNyYy5jb21wYXJlRW5hYmxlOworICAgIGNvbXBhcmVPcCA9IHNyYy5jb21wYXJlT3A7CisgICAgbWluTG9kID0gc3JjLm1pbkxvZDsKKyAgICBtYXhMb2QgPSBzcmMubWF4TG9kOworICAgIGJvcmRlckNvbG9yID0gc3JjLmJvcmRlckNvbG9yOworICAgIHVubm9ybWFsaXplZENvb3JkaW5hdGVzID0gc3JjLnVubm9ybWFsaXplZENvb3JkaW5hdGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm8mIHNhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgbWFnRmlsdGVyID0gc3JjLm1hZ0ZpbHRlcjsKKyAgICBtaW5GaWx0ZXIgPSBzcmMubWluRmlsdGVyOworICAgIG1pcG1hcE1vZGUgPSBzcmMubWlwbWFwTW9kZTsKKyAgICBhZGRyZXNzTW9kZVUgPSBzcmMuYWRkcmVzc01vZGVVOworICAgIGFkZHJlc3NNb2RlViA9IHNyYy5hZGRyZXNzTW9kZVY7CisgICAgYWRkcmVzc01vZGVXID0gc3JjLmFkZHJlc3NNb2RlVzsKKyAgICBtaXBMb2RCaWFzID0gc3JjLm1pcExvZEJpYXM7CisgICAgYW5pc290cm9weUVuYWJsZSA9IHNyYy5hbmlzb3Ryb3B5RW5hYmxlOworICAgIG1heEFuaXNvdHJvcHkgPSBzcmMubWF4QW5pc290cm9weTsKKyAgICBjb21wYXJlRW5hYmxlID0gc3JjLmNvbXBhcmVFbmFibGU7CisgICAgY29tcGFyZU9wID0gc3JjLmNvbXBhcmVPcDsKKyAgICBtaW5Mb2QgPSBzcmMubWluTG9kOworICAgIG1heExvZCA9IHNyYy5tYXhMb2Q7CisgICAgYm9yZGVyQ29sb3IgPSBzcmMuYm9yZGVyQ29sb3I7CisgICAgdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgPSBzcmMudW5ub3JtYWxpemVkQ29vcmRpbmF0ZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbzo6fnNhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NhbXBsZXJDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIG1hZ0ZpbHRlciA9IGluX3N0cnVjdC0+bWFnRmlsdGVyOworICAgIG1pbkZpbHRlciA9IGluX3N0cnVjdC0+bWluRmlsdGVyOworICAgIG1pcG1hcE1vZGUgPSBpbl9zdHJ1Y3QtPm1pcG1hcE1vZGU7CisgICAgYWRkcmVzc01vZGVVID0gaW5fc3RydWN0LT5hZGRyZXNzTW9kZVU7CisgICAgYWRkcmVzc01vZGVWID0gaW5fc3RydWN0LT5hZGRyZXNzTW9kZVY7CisgICAgYWRkcmVzc01vZGVXID0gaW5fc3RydWN0LT5hZGRyZXNzTW9kZVc7CisgICAgbWlwTG9kQmlhcyA9IGluX3N0cnVjdC0+bWlwTG9kQmlhczsKKyAgICBhbmlzb3Ryb3B5RW5hYmxlID0gaW5fc3RydWN0LT5hbmlzb3Ryb3B5RW5hYmxlOworICAgIG1heEFuaXNvdHJvcHkgPSBpbl9zdHJ1Y3QtPm1heEFuaXNvdHJvcHk7CisgICAgY29tcGFyZUVuYWJsZSA9IGluX3N0cnVjdC0+Y29tcGFyZUVuYWJsZTsKKyAgICBjb21wYXJlT3AgPSBpbl9zdHJ1Y3QtPmNvbXBhcmVPcDsKKyAgICBtaW5Mb2QgPSBpbl9zdHJ1Y3QtPm1pbkxvZDsKKyAgICBtYXhMb2QgPSBpbl9zdHJ1Y3QtPm1heExvZDsKKyAgICBib3JkZXJDb2xvciA9IGluX3N0cnVjdC0+Ym9yZGVyQ29sb3I7CisgICAgdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgPSBpbl9zdHJ1Y3QtPnVubm9ybWFsaXplZENvb3JkaW5hdGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NhbXBsZXJDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBtYWdGaWx0ZXIgPSBzcmMtPm1hZ0ZpbHRlcjsKKyAgICBtaW5GaWx0ZXIgPSBzcmMtPm1pbkZpbHRlcjsKKyAgICBtaXBtYXBNb2RlID0gc3JjLT5taXBtYXBNb2RlOworICAgIGFkZHJlc3NNb2RlVSA9IHNyYy0+YWRkcmVzc01vZGVVOworICAgIGFkZHJlc3NNb2RlViA9IHNyYy0+YWRkcmVzc01vZGVWOworICAgIGFkZHJlc3NNb2RlVyA9IHNyYy0+YWRkcmVzc01vZGVXOworICAgIG1pcExvZEJpYXMgPSBzcmMtPm1pcExvZEJpYXM7CisgICAgYW5pc290cm9weUVuYWJsZSA9IHNyYy0+YW5pc290cm9weUVuYWJsZTsKKyAgICBtYXhBbmlzb3Ryb3B5ID0gc3JjLT5tYXhBbmlzb3Ryb3B5OworICAgIGNvbXBhcmVFbmFibGUgPSBzcmMtPmNvbXBhcmVFbmFibGU7CisgICAgY29tcGFyZU9wID0gc3JjLT5jb21wYXJlT3A7CisgICAgbWluTG9kID0gc3JjLT5taW5Mb2Q7CisgICAgbWF4TG9kID0gc3JjLT5tYXhMb2Q7CisgICAgYm9yZGVyQ29sb3IgPSBzcmMtPmJvcmRlckNvbG9yOworICAgIHVubm9ybWFsaXplZENvb3JkaW5hdGVzID0gc3JjLT51bm5vcm1hbGl6ZWRDb29yZGluYXRlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZzo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcqIGluX3N0cnVjdCkgOgorICAgIGJpbmRpbmcoaW5fc3RydWN0LT5iaW5kaW5nKSwKKyAgICBkZXNjcmlwdG9yVHlwZShpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlKSwKKyAgICBkZXNjcmlwdG9yQ291bnQoaW5fc3RydWN0LT5kZXNjcmlwdG9yQ291bnQpLAorICAgIHN0YWdlRmxhZ3MoaW5fc3RydWN0LT5zdGFnZUZsYWdzKSwKKyAgICBwSW1tdXRhYmxlU2FtcGxlcnMobnVsbHB0cikKK3sKKyAgICBjb25zdCBib29sIHNhbXBsZXJfdHlwZSA9IGluX3N0cnVjdC0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgfHwgaW5fc3RydWN0LT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjsKKyAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIGluX3N0cnVjdC0+cEltbXV0YWJsZVNhbXBsZXJzICYmIHNhbXBsZXJfdHlwZSkgeworICAgICAgICBwSW1tdXRhYmxlU2FtcGxlcnMgPSBuZXcgVmtTYW1wbGVyW2Rlc2NyaXB0b3JDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEltbXV0YWJsZVNhbXBsZXJzW2ldID0gaW5fc3RydWN0LT5wSW1tdXRhYmxlU2FtcGxlcnNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZzo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKCkgOgorICAgIHBJbW11dGFibGVTYW1wbGVycyhudWxscHRyKQore30KKworc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nOjpzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nJiBzcmMpCit7CisgICAgYmluZGluZyA9IHNyYy5iaW5kaW5nOworICAgIGRlc2NyaXB0b3JUeXBlID0gc3JjLmRlc2NyaXB0b3JUeXBlOworICAgIGRlc2NyaXB0b3JDb3VudCA9IHNyYy5kZXNjcmlwdG9yQ291bnQ7CisgICAgc3RhZ2VGbGFncyA9IHNyYy5zdGFnZUZsYWdzOworICAgIHBJbW11dGFibGVTYW1wbGVycyA9IG51bGxwdHI7CisgICAgY29uc3QgYm9vbCBzYW1wbGVyX3R5cGUgPSBzcmMuZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgfHwgc3JjLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgc3JjLnBJbW11dGFibGVTYW1wbGVycyAmJiBzYW1wbGVyX3R5cGUpIHsKKyAgICAgICAgcEltbXV0YWJsZVNhbXBsZXJzID0gbmV3IFZrU2FtcGxlcltkZXNjcmlwdG9yQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbW11dGFibGVTYW1wbGVyc1tpXSA9IHNyYy5wSW1tdXRhYmxlU2FtcGxlcnNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyYgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBJbW11dGFibGVTYW1wbGVycykKKyAgICAgICAgZGVsZXRlW10gcEltbXV0YWJsZVNhbXBsZXJzOworCisgICAgYmluZGluZyA9IHNyYy5iaW5kaW5nOworICAgIGRlc2NyaXB0b3JUeXBlID0gc3JjLmRlc2NyaXB0b3JUeXBlOworICAgIGRlc2NyaXB0b3JDb3VudCA9IHNyYy5kZXNjcmlwdG9yQ291bnQ7CisgICAgc3RhZ2VGbGFncyA9IHNyYy5zdGFnZUZsYWdzOworICAgIHBJbW11dGFibGVTYW1wbGVycyA9IG51bGxwdHI7CisgICAgY29uc3QgYm9vbCBzYW1wbGVyX3R5cGUgPSBzcmMuZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgfHwgc3JjLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgc3JjLnBJbW11dGFibGVTYW1wbGVycyAmJiBzYW1wbGVyX3R5cGUpIHsKKyAgICAgICAgcEltbXV0YWJsZVNhbXBsZXJzID0gbmV3IFZrU2FtcGxlcltkZXNjcmlwdG9yQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbW11dGFibGVTYW1wbGVyc1tpXSA9IHNyYy5wSW1tdXRhYmxlU2FtcGxlcnNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZzo6fnNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZygpCit7CisgICAgaWYgKHBJbW11dGFibGVTYW1wbGVycykKKyAgICAgICAgZGVsZXRlW10gcEltbXV0YWJsZVNhbXBsZXJzOworfQorCit2b2lkIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZzo6aW5pdGlhbGl6ZShjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKiBpbl9zdHJ1Y3QpCit7CisgICAgYmluZGluZyA9IGluX3N0cnVjdC0+YmluZGluZzsKKyAgICBkZXNjcmlwdG9yVHlwZSA9IGluX3N0cnVjdC0+ZGVzY3JpcHRvclR5cGU7CisgICAgZGVzY3JpcHRvckNvdW50ID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yQ291bnQ7CisgICAgc3RhZ2VGbGFncyA9IGluX3N0cnVjdC0+c3RhZ2VGbGFnczsKKyAgICBwSW1tdXRhYmxlU2FtcGxlcnMgPSBudWxscHRyOworICAgIGNvbnN0IGJvb2wgc2FtcGxlcl90eXBlID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiB8fCBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgaW5fc3RydWN0LT5wSW1tdXRhYmxlU2FtcGxlcnMgJiYgc2FtcGxlcl90eXBlKSB7CisgICAgICAgIHBJbW11dGFibGVTYW1wbGVycyA9IG5ldyBWa1NhbXBsZXJbZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlc2NyaXB0b3JDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW1tdXRhYmxlU2FtcGxlcnNbaV0gPSBpbl9zdHJ1Y3QtPnBJbW11dGFibGVTYW1wbGVyc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKiBzcmMpCit7CisgICAgYmluZGluZyA9IHNyYy0+YmluZGluZzsKKyAgICBkZXNjcmlwdG9yVHlwZSA9IHNyYy0+ZGVzY3JpcHRvclR5cGU7CisgICAgZGVzY3JpcHRvckNvdW50ID0gc3JjLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgc3RhZ2VGbGFncyA9IHNyYy0+c3RhZ2VGbGFnczsKKyAgICBwSW1tdXRhYmxlU2FtcGxlcnMgPSBudWxscHRyOworICAgIGNvbnN0IGJvb2wgc2FtcGxlcl90eXBlID0gc3JjLT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiB8fCBzcmMtPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgc3JjLT5wSW1tdXRhYmxlU2FtcGxlcnMgJiYgc2FtcGxlcl90eXBlKSB7CisgICAgICAgIHBJbW11dGFibGVTYW1wbGVycyA9IG5ldyBWa1NhbXBsZXJbZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlc2NyaXB0b3JDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW1tdXRhYmxlU2FtcGxlcnNbaV0gPSBzcmMtPnBJbW11dGFibGVTYW1wbGVyc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvOjpzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8oY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgYmluZGluZ0NvdW50KGluX3N0cnVjdC0+YmluZGluZ0NvdW50KSwKKyAgICBwQmluZGluZ3MobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGJpbmRpbmdDb3VudCAmJiBpbl9zdHJ1Y3QtPnBCaW5kaW5ncykgeworICAgICAgICBwQmluZGluZ3MgPSBuZXcgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nW2JpbmRpbmdDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kaW5nQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJpbmRpbmdzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cEJpbmRpbmdzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvOjpzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEJpbmRpbmdzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm86OnNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBiaW5kaW5nQ291bnQgPSBzcmMuYmluZGluZ0NvdW50OworICAgIHBCaW5kaW5ncyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGJpbmRpbmdDb3VudCAmJiBzcmMucEJpbmRpbmdzKSB7CisgICAgICAgIHBCaW5kaW5ncyA9IG5ldyBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdbYmluZGluZ0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRpbmdDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZGluZ3NbaV0uaW5pdGlhbGl6ZSgmc3JjLnBCaW5kaW5nc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyYgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBCaW5kaW5ncykKKyAgICAgICAgZGVsZXRlW10gcEJpbmRpbmdzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgYmluZGluZ0NvdW50ID0gc3JjLmJpbmRpbmdDb3VudDsKKyAgICBwQmluZGluZ3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChiaW5kaW5nQ291bnQgJiYgc3JjLnBCaW5kaW5ncykgeworICAgICAgICBwQmluZGluZ3MgPSBuZXcgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nW2JpbmRpbmdDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kaW5nQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJpbmRpbmdzW2ldLmluaXRpYWxpemUoJnNyYy5wQmluZGluZ3NbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm86On5zYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8oKQoreworICAgIGlmIChwQmluZGluZ3MpCisgICAgICAgIGRlbGV0ZVtdIHBCaW5kaW5nczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgYmluZGluZ0NvdW50ID0gaW5fc3RydWN0LT5iaW5kaW5nQ291bnQ7CisgICAgcEJpbmRpbmdzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGJpbmRpbmdDb3VudCAmJiBpbl9zdHJ1Y3QtPnBCaW5kaW5ncykgeworICAgICAgICBwQmluZGluZ3MgPSBuZXcgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nW2JpbmRpbmdDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kaW5nQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEJpbmRpbmdzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cEJpbmRpbmdzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBiaW5kaW5nQ291bnQgPSBzcmMtPmJpbmRpbmdDb3VudDsKKyAgICBwQmluZGluZ3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoYmluZGluZ0NvdW50ICYmIHNyYy0+cEJpbmRpbmdzKSB7CisgICAgICAgIHBCaW5kaW5ncyA9IG5ldyBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdbYmluZGluZ0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRpbmdDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQmluZGluZ3NbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wQmluZGluZ3NbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvOjpzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBtYXhTZXRzKGluX3N0cnVjdC0+bWF4U2V0cyksCisgICAgcG9vbFNpemVDb3VudChpbl9zdHJ1Y3QtPnBvb2xTaXplQ291bnQpLAorICAgIHBQb29sU2l6ZXMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFBvb2xTaXplcykgeworICAgICAgICBwUG9vbFNpemVzID0gbmV3IFZrRGVzY3JpcHRvclBvb2xTaXplW2luX3N0cnVjdC0+cG9vbFNpemVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUG9vbFNpemVzLCAodm9pZCAqKWluX3N0cnVjdC0+cFBvb2xTaXplcywgc2l6ZW9mKFZrRGVzY3JpcHRvclBvb2xTaXplKSppbl9zdHJ1Y3QtPnBvb2xTaXplQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbzo6c2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwUG9vbFNpemVzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvOjpzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBtYXhTZXRzID0gc3JjLm1heFNldHM7CisgICAgcG9vbFNpemVDb3VudCA9IHNyYy5wb29sU2l6ZUNvdW50OworICAgIHBQb29sU2l6ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFBvb2xTaXplcykgeworICAgICAgICBwUG9vbFNpemVzID0gbmV3IFZrRGVzY3JpcHRvclBvb2xTaXplW3NyYy5wb29sU2l6ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQb29sU2l6ZXMsICh2b2lkICopc3JjLnBQb29sU2l6ZXMsIHNpemVvZihWa0Rlc2NyaXB0b3JQb29sU2l6ZSkqc3JjLnBvb2xTaXplQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyYgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFBvb2xTaXplcykKKyAgICAgICAgZGVsZXRlW10gcFBvb2xTaXplczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIG1heFNldHMgPSBzcmMubWF4U2V0czsKKyAgICBwb29sU2l6ZUNvdW50ID0gc3JjLnBvb2xTaXplQ291bnQ7CisgICAgcFBvb2xTaXplcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wUG9vbFNpemVzKSB7CisgICAgICAgIHBQb29sU2l6ZXMgPSBuZXcgVmtEZXNjcmlwdG9yUG9vbFNpemVbc3JjLnBvb2xTaXplQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBvb2xTaXplcywgKHZvaWQgKilzcmMucFBvb2xTaXplcywgc2l6ZW9mKFZrRGVzY3JpcHRvclBvb2xTaXplKSpzcmMucG9vbFNpemVDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvOjp+c2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBQb29sU2l6ZXMpCisgICAgICAgIGRlbGV0ZVtdIHBQb29sU2l6ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgbWF4U2V0cyA9IGluX3N0cnVjdC0+bWF4U2V0czsKKyAgICBwb29sU2l6ZUNvdW50ID0gaW5fc3RydWN0LT5wb29sU2l6ZUNvdW50OworICAgIHBQb29sU2l6ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wUG9vbFNpemVzKSB7CisgICAgICAgIHBQb29sU2l6ZXMgPSBuZXcgVmtEZXNjcmlwdG9yUG9vbFNpemVbaW5fc3RydWN0LT5wb29sU2l6ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQb29sU2l6ZXMsICh2b2lkICopaW5fc3RydWN0LT5wUG9vbFNpemVzLCBzaXplb2YoVmtEZXNjcmlwdG9yUG9vbFNpemUpKmluX3N0cnVjdC0+cG9vbFNpemVDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgbWF4U2V0cyA9IHNyYy0+bWF4U2V0czsKKyAgICBwb29sU2l6ZUNvdW50ID0gc3JjLT5wb29sU2l6ZUNvdW50OworICAgIHBQb29sU2l6ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wUG9vbFNpemVzKSB7CisgICAgICAgIHBQb29sU2l6ZXMgPSBuZXcgVmtEZXNjcmlwdG9yUG9vbFNpemVbc3JjLT5wb29sU2l6ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQb29sU2l6ZXMsICh2b2lkICopc3JjLT5wUG9vbFNpemVzLCBzaXplb2YoVmtEZXNjcmlwdG9yUG9vbFNpemUpKnNyYy0+cG9vbFNpemVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbzo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8oY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkZXNjcmlwdG9yUG9vbChpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JQb29sKSwKKyAgICBkZXNjcmlwdG9yU2V0Q291bnQoaW5fc3RydWN0LT5kZXNjcmlwdG9yU2V0Q291bnQpLAorICAgIHBTZXRMYXlvdXRzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChkZXNjcmlwdG9yU2V0Q291bnQgJiYgaW5fc3RydWN0LT5wU2V0TGF5b3V0cykgeworICAgICAgICBwU2V0TGF5b3V0cyA9IG5ldyBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRbZGVzY3JpcHRvclNldENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlc2NyaXB0b3JTZXRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU2V0TGF5b3V0c1tpXSA9IGluX3N0cnVjdC0+cFNldExheW91dHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvOjpzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwU2V0TGF5b3V0cyhudWxscHRyKQore30KKworc2FmZV9Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm86OnNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGVzY3JpcHRvclBvb2wgPSBzcmMuZGVzY3JpcHRvclBvb2w7CisgICAgZGVzY3JpcHRvclNldENvdW50ID0gc3JjLmRlc2NyaXB0b3JTZXRDb3VudDsKKyAgICBwU2V0TGF5b3V0cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGRlc2NyaXB0b3JTZXRDb3VudCAmJiBzcmMucFNldExheW91dHMpIHsKKyAgICAgICAgcFNldExheW91dHMgPSBuZXcgVmtEZXNjcmlwdG9yU2V0TGF5b3V0W2Rlc2NyaXB0b3JTZXRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yU2V0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNldExheW91dHNbaV0gPSBzcmMucFNldExheW91dHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvJiBzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBTZXRMYXlvdXRzKQorICAgICAgICBkZWxldGVbXSBwU2V0TGF5b3V0czsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRlc2NyaXB0b3JQb29sID0gc3JjLmRlc2NyaXB0b3JQb29sOworICAgIGRlc2NyaXB0b3JTZXRDb3VudCA9IHNyYy5kZXNjcmlwdG9yU2V0Q291bnQ7CisgICAgcFNldExheW91dHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChkZXNjcmlwdG9yU2V0Q291bnQgJiYgc3JjLnBTZXRMYXlvdXRzKSB7CisgICAgICAgIHBTZXRMYXlvdXRzID0gbmV3IFZrRGVzY3JpcHRvclNldExheW91dFtkZXNjcmlwdG9yU2V0Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvclNldENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTZXRMYXlvdXRzW2ldID0gc3JjLnBTZXRMYXlvdXRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbzo6fnNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKCkKK3sKKyAgICBpZiAocFNldExheW91dHMpCisgICAgICAgIGRlbGV0ZVtdIHBTZXRMYXlvdXRzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkZXNjcmlwdG9yUG9vbCA9IGluX3N0cnVjdC0+ZGVzY3JpcHRvclBvb2w7CisgICAgZGVzY3JpcHRvclNldENvdW50ID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yU2V0Q291bnQ7CisgICAgcFNldExheW91dHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoZGVzY3JpcHRvclNldENvdW50ICYmIGluX3N0cnVjdC0+cFNldExheW91dHMpIHsKKyAgICAgICAgcFNldExheW91dHMgPSBuZXcgVmtEZXNjcmlwdG9yU2V0TGF5b3V0W2Rlc2NyaXB0b3JTZXRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yU2V0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNldExheW91dHNbaV0gPSBpbl9zdHJ1Y3QtPnBTZXRMYXlvdXRzW2ldOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRlc2NyaXB0b3JQb29sID0gc3JjLT5kZXNjcmlwdG9yUG9vbDsKKyAgICBkZXNjcmlwdG9yU2V0Q291bnQgPSBzcmMtPmRlc2NyaXB0b3JTZXRDb3VudDsKKyAgICBwU2V0TGF5b3V0cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChkZXNjcmlwdG9yU2V0Q291bnQgJiYgc3JjLT5wU2V0TGF5b3V0cykgeworICAgICAgICBwU2V0TGF5b3V0cyA9IG5ldyBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRbZGVzY3JpcHRvclNldENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlc2NyaXB0b3JTZXRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU2V0TGF5b3V0c1tpXSA9IHNyYy0+cFNldExheW91dHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQ6OnNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQoY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRzdFNldChpbl9zdHJ1Y3QtPmRzdFNldCksCisgICAgZHN0QmluZGluZyhpbl9zdHJ1Y3QtPmRzdEJpbmRpbmcpLAorICAgIGRzdEFycmF5RWxlbWVudChpbl9zdHJ1Y3QtPmRzdEFycmF5RWxlbWVudCksCisgICAgZGVzY3JpcHRvckNvdW50KGluX3N0cnVjdC0+ZGVzY3JpcHRvckNvdW50KSwKKyAgICBkZXNjcmlwdG9yVHlwZShpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlKSwKKyAgICBwSW1hZ2VJbmZvKG51bGxwdHIpLAorICAgIHBCdWZmZXJJbmZvKG51bGxwdHIpLAorICAgIHBUZXhlbEJ1ZmZlclZpZXcobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgc3dpdGNoIChkZXNjcmlwdG9yVHlwZSkgeworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOgorICAgICAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIGluX3N0cnVjdC0+cEltYWdlSW5mbykgeworICAgICAgICAgICAgcEltYWdlSW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JJbWFnZUluZm9bZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHBJbWFnZUluZm9baV0gPSBpbl9zdHJ1Y3QtPnBJbWFnZUluZm9baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBpbl9zdHJ1Y3QtPnBCdWZmZXJJbmZvKSB7CisgICAgICAgICAgICBwQnVmZmVySW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvW2Rlc2NyaXB0b3JDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBwQnVmZmVySW5mb1tpXSA9IGluX3N0cnVjdC0+cEJ1ZmZlckluZm9baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBpbl9zdHJ1Y3QtPnBUZXhlbEJ1ZmZlclZpZXcpIHsKKyAgICAgICAgICAgIHBUZXhlbEJ1ZmZlclZpZXcgPSBuZXcgVmtCdWZmZXJWaWV3W2Rlc2NyaXB0b3JDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBwVGV4ZWxCdWZmZXJWaWV3W2ldID0gaW5fc3RydWN0LT5wVGV4ZWxCdWZmZXJWaWV3W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3NhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQ6OnNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEltYWdlSW5mbyhudWxscHRyKSwKKyAgICBwQnVmZmVySW5mbyhudWxscHRyKSwKKyAgICBwVGV4ZWxCdWZmZXJWaWV3KG51bGxwdHIpCit7fQorCitzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0OjpzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0KGNvbnN0IHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkc3RTZXQgPSBzcmMuZHN0U2V0OworICAgIGRzdEJpbmRpbmcgPSBzcmMuZHN0QmluZGluZzsKKyAgICBkc3RBcnJheUVsZW1lbnQgPSBzcmMuZHN0QXJyYXlFbGVtZW50OworICAgIGRlc2NyaXB0b3JDb3VudCA9IHNyYy5kZXNjcmlwdG9yQ291bnQ7CisgICAgZGVzY3JpcHRvclR5cGUgPSBzcmMuZGVzY3JpcHRvclR5cGU7CisgICAgcEltYWdlSW5mbyA9IG51bGxwdHI7CisgICAgcEJ1ZmZlckluZm8gPSBudWxscHRyOworICAgIHBUZXhlbEJ1ZmZlclZpZXcgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIHN3aXRjaCAoZGVzY3JpcHRvclR5cGUpIHsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRToKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRToKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVDoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBzcmMucEltYWdlSW5mbykgeworICAgICAgICAgICAgcEltYWdlSW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JJbWFnZUluZm9bZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHBJbWFnZUluZm9baV0gPSBzcmMucEltYWdlSW5mb1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI6CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIHNyYy5wQnVmZmVySW5mbykgeworICAgICAgICAgICAgcEJ1ZmZlckluZm8gPSBuZXcgVmtEZXNjcmlwdG9yQnVmZmVySW5mb1tkZXNjcmlwdG9yQ291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlc2NyaXB0b3JDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgcEJ1ZmZlckluZm9baV0gPSBzcmMucEJ1ZmZlckluZm9baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBzcmMucFRleGVsQnVmZmVyVmlldykgeworICAgICAgICAgICAgcFRleGVsQnVmZmVyVmlldyA9IG5ldyBWa0J1ZmZlclZpZXdbZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHBUZXhlbEJ1ZmZlclZpZXdbaV0gPSBzcmMucFRleGVsQnVmZmVyVmlld1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0JiBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0OjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwSW1hZ2VJbmZvKQorICAgICAgICBkZWxldGVbXSBwSW1hZ2VJbmZvOworICAgIGlmIChwQnVmZmVySW5mbykKKyAgICAgICAgZGVsZXRlW10gcEJ1ZmZlckluZm87CisgICAgaWYgKHBUZXhlbEJ1ZmZlclZpZXcpCisgICAgICAgIGRlbGV0ZVtdIHBUZXhlbEJ1ZmZlclZpZXc7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkc3RTZXQgPSBzcmMuZHN0U2V0OworICAgIGRzdEJpbmRpbmcgPSBzcmMuZHN0QmluZGluZzsKKyAgICBkc3RBcnJheUVsZW1lbnQgPSBzcmMuZHN0QXJyYXlFbGVtZW50OworICAgIGRlc2NyaXB0b3JDb3VudCA9IHNyYy5kZXNjcmlwdG9yQ291bnQ7CisgICAgZGVzY3JpcHRvclR5cGUgPSBzcmMuZGVzY3JpcHRvclR5cGU7CisgICAgcEltYWdlSW5mbyA9IG51bGxwdHI7CisgICAgcEJ1ZmZlckluZm8gPSBudWxscHRyOworICAgIHBUZXhlbEJ1ZmZlclZpZXcgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIHN3aXRjaCAoZGVzY3JpcHRvclR5cGUpIHsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRToKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRToKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVDoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBzcmMucEltYWdlSW5mbykgeworICAgICAgICAgICAgcEltYWdlSW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JJbWFnZUluZm9bZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHBJbWFnZUluZm9baV0gPSBzcmMucEltYWdlSW5mb1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI6CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIHNyYy5wQnVmZmVySW5mbykgeworICAgICAgICAgICAgcEJ1ZmZlckluZm8gPSBuZXcgVmtEZXNjcmlwdG9yQnVmZmVySW5mb1tkZXNjcmlwdG9yQ291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlc2NyaXB0b3JDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgcEJ1ZmZlckluZm9baV0gPSBzcmMucEJ1ZmZlckluZm9baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBzcmMucFRleGVsQnVmZmVyVmlldykgeworICAgICAgICAgICAgcFRleGVsQnVmZmVyVmlldyA9IG5ldyBWa0J1ZmZlclZpZXdbZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHBUZXhlbEJ1ZmZlclZpZXdbaV0gPSBzcmMucFRleGVsQnVmZmVyVmlld1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0Ojp+c2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldCgpCit7CisgICAgaWYgKHBJbWFnZUluZm8pCisgICAgICAgIGRlbGV0ZVtdIHBJbWFnZUluZm87CisgICAgaWYgKHBCdWZmZXJJbmZvKQorICAgICAgICBkZWxldGVbXSBwQnVmZmVySW5mbzsKKyAgICBpZiAocFRleGVsQnVmZmVyVmlldykKKyAgICAgICAgZGVsZXRlW10gcFRleGVsQnVmZmVyVmlldzsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0Ojppbml0aWFsaXplKGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRzdFNldCA9IGluX3N0cnVjdC0+ZHN0U2V0OworICAgIGRzdEJpbmRpbmcgPSBpbl9zdHJ1Y3QtPmRzdEJpbmRpbmc7CisgICAgZHN0QXJyYXlFbGVtZW50ID0gaW5fc3RydWN0LT5kc3RBcnJheUVsZW1lbnQ7CisgICAgZGVzY3JpcHRvckNvdW50ID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yQ291bnQ7CisgICAgZGVzY3JpcHRvclR5cGUgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlOworICAgIHBJbWFnZUluZm8gPSBudWxscHRyOworICAgIHBCdWZmZXJJbmZvID0gbnVsbHB0cjsKKyAgICBwVGV4ZWxCdWZmZXJWaWV3ID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgc3dpdGNoIChkZXNjcmlwdG9yVHlwZSkgeworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOgorICAgICAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIGluX3N0cnVjdC0+cEltYWdlSW5mbykgeworICAgICAgICAgICAgcEltYWdlSW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JJbWFnZUluZm9bZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHBJbWFnZUluZm9baV0gPSBpbl9zdHJ1Y3QtPnBJbWFnZUluZm9baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBpbl9zdHJ1Y3QtPnBCdWZmZXJJbmZvKSB7CisgICAgICAgICAgICBwQnVmZmVySW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvW2Rlc2NyaXB0b3JDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBwQnVmZmVySW5mb1tpXSA9IGluX3N0cnVjdC0+cEJ1ZmZlckluZm9baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBpbl9zdHJ1Y3QtPnBUZXhlbEJ1ZmZlclZpZXcpIHsKKyAgICAgICAgICAgIHBUZXhlbEJ1ZmZlclZpZXcgPSBuZXcgVmtCdWZmZXJWaWV3W2Rlc2NyaXB0b3JDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBwVGV4ZWxCdWZmZXJWaWV3W2ldID0gaW5fc3RydWN0LT5wVGV4ZWxCdWZmZXJWaWV3W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0KiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRzdFNldCA9IHNyYy0+ZHN0U2V0OworICAgIGRzdEJpbmRpbmcgPSBzcmMtPmRzdEJpbmRpbmc7CisgICAgZHN0QXJyYXlFbGVtZW50ID0gc3JjLT5kc3RBcnJheUVsZW1lbnQ7CisgICAgZGVzY3JpcHRvckNvdW50ID0gc3JjLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgZGVzY3JpcHRvclR5cGUgPSBzcmMtPmRlc2NyaXB0b3JUeXBlOworICAgIHBJbWFnZUluZm8gPSBudWxscHRyOworICAgIHBCdWZmZXJJbmZvID0gbnVsbHB0cjsKKyAgICBwVGV4ZWxCdWZmZXJWaWV3ID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgc3dpdGNoIChkZXNjcmlwdG9yVHlwZSkgeworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOgorICAgICAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIHNyYy0+cEltYWdlSW5mbykgeworICAgICAgICAgICAgcEltYWdlSW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JJbWFnZUluZm9bZGVzY3JpcHRvckNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHBJbWFnZUluZm9baV0gPSBzcmMtPnBJbWFnZUluZm9baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBzcmMtPnBCdWZmZXJJbmZvKSB7CisgICAgICAgICAgICBwQnVmZmVySW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvW2Rlc2NyaXB0b3JDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBwQnVmZmVySW5mb1tpXSA9IHNyYy0+cEJ1ZmZlckluZm9baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBzcmMtPnBUZXhlbEJ1ZmZlclZpZXcpIHsKKyAgICAgICAgICAgIHBUZXhlbEJ1ZmZlclZpZXcgPSBuZXcgVmtCdWZmZXJWaWV3W2Rlc2NyaXB0b3JDb3VudF07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBwVGV4ZWxCdWZmZXJWaWV3W2ldID0gc3JjLT5wVGV4ZWxCdWZmZXJWaWV3W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3NhZmVfVmtDb3B5RGVzY3JpcHRvclNldDo6c2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0KGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNyY1NldChpbl9zdHJ1Y3QtPnNyY1NldCksCisgICAgc3JjQmluZGluZyhpbl9zdHJ1Y3QtPnNyY0JpbmRpbmcpLAorICAgIHNyY0FycmF5RWxlbWVudChpbl9zdHJ1Y3QtPnNyY0FycmF5RWxlbWVudCksCisgICAgZHN0U2V0KGluX3N0cnVjdC0+ZHN0U2V0KSwKKyAgICBkc3RCaW5kaW5nKGluX3N0cnVjdC0+ZHN0QmluZGluZyksCisgICAgZHN0QXJyYXlFbGVtZW50KGluX3N0cnVjdC0+ZHN0QXJyYXlFbGVtZW50KSwKKyAgICBkZXNjcmlwdG9yQ291bnQoaW5fc3RydWN0LT5kZXNjcmlwdG9yQ291bnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQ29weURlc2NyaXB0b3JTZXQ6OnNhZmVfVmtDb3B5RGVzY3JpcHRvclNldCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0OjpzYWZlX1ZrQ29weURlc2NyaXB0b3JTZXQoY29uc3Qgc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0JiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3JjU2V0ID0gc3JjLnNyY1NldDsKKyAgICBzcmNCaW5kaW5nID0gc3JjLnNyY0JpbmRpbmc7CisgICAgc3JjQXJyYXlFbGVtZW50ID0gc3JjLnNyY0FycmF5RWxlbWVudDsKKyAgICBkc3RTZXQgPSBzcmMuZHN0U2V0OworICAgIGRzdEJpbmRpbmcgPSBzcmMuZHN0QmluZGluZzsKKyAgICBkc3RBcnJheUVsZW1lbnQgPSBzcmMuZHN0QXJyYXlFbGVtZW50OworICAgIGRlc2NyaXB0b3JDb3VudCA9IHNyYy5kZXNjcmlwdG9yQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtDb3B5RGVzY3JpcHRvclNldCYgc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0OjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0JiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzcmNTZXQgPSBzcmMuc3JjU2V0OworICAgIHNyY0JpbmRpbmcgPSBzcmMuc3JjQmluZGluZzsKKyAgICBzcmNBcnJheUVsZW1lbnQgPSBzcmMuc3JjQXJyYXlFbGVtZW50OworICAgIGRzdFNldCA9IHNyYy5kc3RTZXQ7CisgICAgZHN0QmluZGluZyA9IHNyYy5kc3RCaW5kaW5nOworICAgIGRzdEFycmF5RWxlbWVudCA9IHNyYy5kc3RBcnJheUVsZW1lbnQ7CisgICAgZGVzY3JpcHRvckNvdW50ID0gc3JjLmRlc2NyaXB0b3JDb3VudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0Ojp+c2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0KCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ29weURlc2NyaXB0b3JTZXQ6OmluaXRpYWxpemUoY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzcmNTZXQgPSBpbl9zdHJ1Y3QtPnNyY1NldDsKKyAgICBzcmNCaW5kaW5nID0gaW5fc3RydWN0LT5zcmNCaW5kaW5nOworICAgIHNyY0FycmF5RWxlbWVudCA9IGluX3N0cnVjdC0+c3JjQXJyYXlFbGVtZW50OworICAgIGRzdFNldCA9IGluX3N0cnVjdC0+ZHN0U2V0OworICAgIGRzdEJpbmRpbmcgPSBpbl9zdHJ1Y3QtPmRzdEJpbmRpbmc7CisgICAgZHN0QXJyYXlFbGVtZW50ID0gaW5fc3RydWN0LT5kc3RBcnJheUVsZW1lbnQ7CisgICAgZGVzY3JpcHRvckNvdW50ID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtDb3B5RGVzY3JpcHRvclNldDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ29weURlc2NyaXB0b3JTZXQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3JjU2V0ID0gc3JjLT5zcmNTZXQ7CisgICAgc3JjQmluZGluZyA9IHNyYy0+c3JjQmluZGluZzsKKyAgICBzcmNBcnJheUVsZW1lbnQgPSBzcmMtPnNyY0FycmF5RWxlbWVudDsKKyAgICBkc3RTZXQgPSBzcmMtPmRzdFNldDsKKyAgICBkc3RCaW5kaW5nID0gc3JjLT5kc3RCaW5kaW5nOworICAgIGRzdEFycmF5RWxlbWVudCA9IHNyYy0+ZHN0QXJyYXlFbGVtZW50OworICAgIGRlc2NyaXB0b3JDb3VudCA9IHNyYy0+ZGVzY3JpcHRvckNvdW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6c2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyhjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgcmVuZGVyUGFzcyhpbl9zdHJ1Y3QtPnJlbmRlclBhc3MpLAorICAgIGF0dGFjaG1lbnRDb3VudChpbl9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudCksCisgICAgcEF0dGFjaG1lbnRzKG51bGxwdHIpLAorICAgIHdpZHRoKGluX3N0cnVjdC0+d2lkdGgpLAorICAgIGhlaWdodChpbl9zdHJ1Y3QtPmhlaWdodCksCisgICAgbGF5ZXJzKGluX3N0cnVjdC0+bGF5ZXJzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoYXR0YWNobWVudENvdW50ICYmIGluX3N0cnVjdC0+cEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBBdHRhY2htZW50cyA9IG5ldyBWa0ltYWdlVmlld1thdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBBdHRhY2htZW50c1tpXSA9IGluX3N0cnVjdC0+cEF0dGFjaG1lbnRzW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvOjpzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBBdHRhY2htZW50cyhudWxscHRyKQore30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6c2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcmVuZGVyUGFzcyA9IHNyYy5yZW5kZXJQYXNzOworICAgIGF0dGFjaG1lbnRDb3VudCA9IHNyYy5hdHRhY2htZW50Q291bnQ7CisgICAgcEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICB3aWR0aCA9IHNyYy53aWR0aDsKKyAgICBoZWlnaHQgPSBzcmMuaGVpZ2h0OworICAgIGxheWVycyA9IHNyYy5sYXllcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGF0dGFjaG1lbnRDb3VudCAmJiBzcmMucEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBBdHRhY2htZW50cyA9IG5ldyBWa0ltYWdlVmlld1thdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBBdHRhY2htZW50c1tpXSA9IHNyYy5wQXR0YWNobWVudHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8mIHNhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcEF0dGFjaG1lbnRzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcmVuZGVyUGFzcyA9IHNyYy5yZW5kZXJQYXNzOworICAgIGF0dGFjaG1lbnRDb3VudCA9IHNyYy5hdHRhY2htZW50Q291bnQ7CisgICAgcEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICB3aWR0aCA9IHNyYy53aWR0aDsKKyAgICBoZWlnaHQgPSBzcmMuaGVpZ2h0OworICAgIGxheWVycyA9IHNyYy5sYXllcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGF0dGFjaG1lbnRDb3VudCAmJiBzcmMucEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBBdHRhY2htZW50cyA9IG5ldyBWa0ltYWdlVmlld1thdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBBdHRhY2htZW50c1tpXSA9IHNyYy5wQXR0YWNobWVudHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm86On5zYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocEF0dGFjaG1lbnRzKQorICAgICAgICBkZWxldGVbXSBwQXR0YWNobWVudHM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgcmVuZGVyUGFzcyA9IGluX3N0cnVjdC0+cmVuZGVyUGFzczsKKyAgICBhdHRhY2htZW50Q291bnQgPSBpbl9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudDsKKyAgICBwQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHdpZHRoID0gaW5fc3RydWN0LT53aWR0aDsKKyAgICBoZWlnaHQgPSBpbl9zdHJ1Y3QtPmhlaWdodDsKKyAgICBsYXllcnMgPSBpbl9zdHJ1Y3QtPmxheWVyczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGF0dGFjaG1lbnRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBBdHRhY2htZW50cykgeworICAgICAgICBwQXR0YWNobWVudHMgPSBuZXcgVmtJbWFnZVZpZXdbYXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQXR0YWNobWVudHNbaV0gPSBpbl9zdHJ1Y3QtPnBBdHRhY2htZW50c1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHJlbmRlclBhc3MgPSBzcmMtPnJlbmRlclBhc3M7CisgICAgYXR0YWNobWVudENvdW50ID0gc3JjLT5hdHRhY2htZW50Q291bnQ7CisgICAgcEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICB3aWR0aCA9IHNyYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgbGF5ZXJzID0gc3JjLT5sYXllcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChhdHRhY2htZW50Q291bnQgJiYgc3JjLT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrSW1hZ2VWaWV3W2F0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEF0dGFjaG1lbnRzW2ldID0gc3JjLT5wQXR0YWNobWVudHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb246OnNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24oY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24qIGluX3N0cnVjdCkgOgorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHBpcGVsaW5lQmluZFBvaW50KGluX3N0cnVjdC0+cGlwZWxpbmVCaW5kUG9pbnQpLAorICAgIGlucHV0QXR0YWNobWVudENvdW50KGluX3N0cnVjdC0+aW5wdXRBdHRhY2htZW50Q291bnQpLAorICAgIHBJbnB1dEF0dGFjaG1lbnRzKG51bGxwdHIpLAorICAgIGNvbG9yQXR0YWNobWVudENvdW50KGluX3N0cnVjdC0+Y29sb3JBdHRhY2htZW50Q291bnQpLAorICAgIHBDb2xvckF0dGFjaG1lbnRzKG51bGxwdHIpLAorICAgIHBSZXNvbHZlQXR0YWNobWVudHMobnVsbHB0ciksCisgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQobnVsbHB0ciksCisgICAgcHJlc2VydmVBdHRhY2htZW50Q291bnQoaW5fc3RydWN0LT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudCksCisgICAgcFByZXNlcnZlQXR0YWNobWVudHMobnVsbHB0cikKK3sKKyAgICBpZiAoaW5fc3RydWN0LT5wSW5wdXRBdHRhY2htZW50cykgeworICAgICAgICBwSW5wdXRBdHRhY2htZW50cyA9IG5ldyBWa0F0dGFjaG1lbnRSZWZlcmVuY2VbaW5fc3RydWN0LT5pbnB1dEF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwSW5wdXRBdHRhY2htZW50cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBJbnB1dEF0dGFjaG1lbnRzLCBzaXplb2YoVmtBdHRhY2htZW50UmVmZXJlbmNlKSppbl9zdHJ1Y3QtPmlucHV0QXR0YWNobWVudENvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cENvbG9yQXR0YWNobWVudHMpIHsKKyAgICAgICAgcENvbG9yQXR0YWNobWVudHMgPSBuZXcgVmtBdHRhY2htZW50UmVmZXJlbmNlW2luX3N0cnVjdC0+Y29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvbG9yQXR0YWNobWVudHMsICh2b2lkICopaW5fc3RydWN0LT5wQ29sb3JBdHRhY2htZW50cywgc2l6ZW9mKFZrQXR0YWNobWVudFJlZmVyZW5jZSkqaW5fc3RydWN0LT5jb2xvckF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBSZXNvbHZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IG5ldyBWa0F0dGFjaG1lbnRSZWZlcmVuY2VbaW5fc3RydWN0LT5jb2xvckF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUmVzb2x2ZUF0dGFjaG1lbnRzLCAodm9pZCAqKWluX3N0cnVjdC0+cFJlc29sdmVBdHRhY2htZW50cywgc2l6ZW9mKFZrQXR0YWNobWVudFJlZmVyZW5jZSkqaW5fc3RydWN0LT5jb2xvckF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSB7CisgICAgICAgIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbmV3IFZrQXR0YWNobWVudFJlZmVyZW5jZSgqaW5fc3RydWN0LT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+cHJlc2VydmVBdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFByZXNlcnZlQXR0YWNobWVudHMsICh2b2lkICopaW5fc3RydWN0LT5wUHJlc2VydmVBdHRhY2htZW50cywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPnByZXNlcnZlQXR0YWNobWVudENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb246OnNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24oKSA6CisgICAgcElucHV0QXR0YWNobWVudHMobnVsbHB0ciksCisgICAgcENvbG9yQXR0YWNobWVudHMobnVsbHB0ciksCisgICAgcFJlc29sdmVBdHRhY2htZW50cyhudWxscHRyKSwKKyAgICBwRGVwdGhTdGVuY2lsQXR0YWNobWVudChudWxscHRyKSwKKyAgICBwUHJlc2VydmVBdHRhY2htZW50cyhudWxscHRyKQore30KKworc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjo6c2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbihjb25zdCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uJiBzcmMpCit7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcGlwZWxpbmVCaW5kUG9pbnQgPSBzcmMucGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgaW5wdXRBdHRhY2htZW50Q291bnQgPSBzcmMuaW5wdXRBdHRhY2htZW50Q291bnQ7CisgICAgcElucHV0QXR0YWNobWVudHMgPSBudWxscHRyOworICAgIGNvbG9yQXR0YWNobWVudENvdW50ID0gc3JjLmNvbG9yQXR0YWNobWVudENvdW50OworICAgIHBDb2xvckF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IG51bGxwdHI7CisgICAgcHJlc2VydmVBdHRhY2htZW50Q291bnQgPSBzcmMucHJlc2VydmVBdHRhY2htZW50Q291bnQ7CisgICAgcFByZXNlcnZlQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIGlmIChzcmMucElucHV0QXR0YWNobWVudHMpIHsKKyAgICAgICAgcElucHV0QXR0YWNobWVudHMgPSBuZXcgVmtBdHRhY2htZW50UmVmZXJlbmNlW3NyYy5pbnB1dEF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwSW5wdXRBdHRhY2htZW50cywgKHZvaWQgKilzcmMucElucHV0QXR0YWNobWVudHMsIHNpemVvZihWa0F0dGFjaG1lbnRSZWZlcmVuY2UpKnNyYy5pbnB1dEF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucENvbG9yQXR0YWNobWVudHMpIHsKKyAgICAgICAgcENvbG9yQXR0YWNobWVudHMgPSBuZXcgVmtBdHRhY2htZW50UmVmZXJlbmNlW3NyYy5jb2xvckF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ29sb3JBdHRhY2htZW50cywgKHZvaWQgKilzcmMucENvbG9yQXR0YWNobWVudHMsIHNpemVvZihWa0F0dGFjaG1lbnRSZWZlcmVuY2UpKnNyYy5jb2xvckF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucFJlc29sdmVBdHRhY2htZW50cykgeworICAgICAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudFJlZmVyZW5jZVtzcmMuY29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFJlc29sdmVBdHRhY2htZW50cywgKHZvaWQgKilzcmMucFJlc29sdmVBdHRhY2htZW50cywgc2l6ZW9mKFZrQXR0YWNobWVudFJlZmVyZW5jZSkqc3JjLmNvbG9yQXR0YWNobWVudENvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCkgeworICAgICAgICBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IG5ldyBWa0F0dGFjaG1lbnRSZWZlcmVuY2UoKnNyYy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCk7CisgICAgfQorICAgIGlmIChzcmMucFByZXNlcnZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgcFByZXNlcnZlQXR0YWNobWVudHMgPSBuZXcgdWludDMyX3Rbc3JjLnByZXNlcnZlQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLCAodm9pZCAqKXNyYy5wUHJlc2VydmVBdHRhY2htZW50cywgc2l6ZW9mKHVpbnQzMl90KSpzcmMucHJlc2VydmVBdHRhY2htZW50Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbiYgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocElucHV0QXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBJbnB1dEF0dGFjaG1lbnRzOworICAgIGlmIChwQ29sb3JBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcENvbG9yQXR0YWNobWVudHM7CisgICAgaWYgKHBSZXNvbHZlQXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBSZXNvbHZlQXR0YWNobWVudHM7CisgICAgaWYgKHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KQorICAgICAgICBkZWxldGUgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ7CisgICAgaWYgKHBQcmVzZXJ2ZUF0dGFjaG1lbnRzKQorICAgICAgICBkZWxldGVbXSBwUHJlc2VydmVBdHRhY2htZW50czsKKworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBpcGVsaW5lQmluZFBvaW50ID0gc3JjLnBpcGVsaW5lQmluZFBvaW50OworICAgIGlucHV0QXR0YWNobWVudENvdW50ID0gc3JjLmlucHV0QXR0YWNobWVudENvdW50OworICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBjb2xvckF0dGFjaG1lbnRDb3VudCA9IHNyYy5jb2xvckF0dGFjaG1lbnRDb3VudDsKKyAgICBwQ29sb3JBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxscHRyOworICAgIHByZXNlcnZlQXR0YWNobWVudENvdW50ID0gc3JjLnByZXNlcnZlQXR0YWNobWVudENvdW50OworICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBpZiAoc3JjLnBJbnB1dEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudFJlZmVyZW5jZVtzcmMuaW5wdXRBdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcElucHV0QXR0YWNobWVudHMsICh2b2lkICopc3JjLnBJbnB1dEF0dGFjaG1lbnRzLCBzaXplb2YoVmtBdHRhY2htZW50UmVmZXJlbmNlKSpzcmMuaW5wdXRBdHRhY2htZW50Q291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBDb2xvckF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBDb2xvckF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudFJlZmVyZW5jZVtzcmMuY29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvbG9yQXR0YWNobWVudHMsICh2b2lkICopc3JjLnBDb2xvckF0dGFjaG1lbnRzLCBzaXplb2YoVmtBdHRhY2htZW50UmVmZXJlbmNlKSpzcmMuY29sb3JBdHRhY2htZW50Q291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBSZXNvbHZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IG5ldyBWa0F0dGFjaG1lbnRSZWZlcmVuY2Vbc3JjLmNvbG9yQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZXNvbHZlQXR0YWNobWVudHMsICh2b2lkICopc3JjLnBSZXNvbHZlQXR0YWNobWVudHMsIHNpemVvZihWa0F0dGFjaG1lbnRSZWZlcmVuY2UpKnNyYy5jb2xvckF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHsKKyAgICAgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBuZXcgVmtBdHRhY2htZW50UmVmZXJlbmNlKCpzcmMucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBQcmVzZXJ2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID0gbmV3IHVpbnQzMl90W3NyYy5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUHJlc2VydmVBdHRhY2htZW50cywgKHZvaWQgKilzcmMucFByZXNlcnZlQXR0YWNobWVudHMsIHNpemVvZih1aW50MzJfdCkqc3JjLnByZXNlcnZlQXR0YWNobWVudENvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb246On5zYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uKCkKK3sKKyAgICBpZiAocElucHV0QXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBJbnB1dEF0dGFjaG1lbnRzOworICAgIGlmIChwQ29sb3JBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcENvbG9yQXR0YWNobWVudHM7CisgICAgaWYgKHBSZXNvbHZlQXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBSZXNvbHZlQXR0YWNobWVudHM7CisgICAgaWYgKHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KQorICAgICAgICBkZWxldGUgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ7CisgICAgaWYgKHBQcmVzZXJ2ZUF0dGFjaG1lbnRzKQorICAgICAgICBkZWxldGVbXSBwUHJlc2VydmVBdHRhY2htZW50czsKK30KKwordm9pZCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uOjppbml0aWFsaXplKGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uKiBpbl9zdHJ1Y3QpCit7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHBpcGVsaW5lQmluZFBvaW50ID0gaW5fc3RydWN0LT5waXBlbGluZUJpbmRQb2ludDsKKyAgICBpbnB1dEF0dGFjaG1lbnRDb3VudCA9IGluX3N0cnVjdC0+aW5wdXRBdHRhY2htZW50Q291bnQ7CisgICAgcElucHV0QXR0YWNobWVudHMgPSBudWxscHRyOworICAgIGNvbG9yQXR0YWNobWVudENvdW50ID0gaW5fc3RydWN0LT5jb2xvckF0dGFjaG1lbnRDb3VudDsKKyAgICBwQ29sb3JBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxscHRyOworICAgIHByZXNlcnZlQXR0YWNobWVudENvdW50ID0gaW5fc3RydWN0LT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudDsKKyAgICBwUHJlc2VydmVBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgaWYgKGluX3N0cnVjdC0+cElucHV0QXR0YWNobWVudHMpIHsKKyAgICAgICAgcElucHV0QXR0YWNobWVudHMgPSBuZXcgVmtBdHRhY2htZW50UmVmZXJlbmNlW2luX3N0cnVjdC0+aW5wdXRBdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcElucHV0QXR0YWNobWVudHMsICh2b2lkICopaW5fc3RydWN0LT5wSW5wdXRBdHRhY2htZW50cywgc2l6ZW9mKFZrQXR0YWNobWVudFJlZmVyZW5jZSkqaW5fc3RydWN0LT5pbnB1dEF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBDb2xvckF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBDb2xvckF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudFJlZmVyZW5jZVtpbl9zdHJ1Y3QtPmNvbG9yQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb2xvckF0dGFjaG1lbnRzLCAodm9pZCAqKWluX3N0cnVjdC0+cENvbG9yQXR0YWNobWVudHMsIHNpemVvZihWa0F0dGFjaG1lbnRSZWZlcmVuY2UpKmluX3N0cnVjdC0+Y29sb3JBdHRhY2htZW50Q291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wUmVzb2x2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBSZXNvbHZlQXR0YWNobWVudHMgPSBuZXcgVmtBdHRhY2htZW50UmVmZXJlbmNlW2luX3N0cnVjdC0+Y29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFJlc29sdmVBdHRhY2htZW50cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBSZXNvbHZlQXR0YWNobWVudHMsIHNpemVvZihWa0F0dGFjaG1lbnRSZWZlcmVuY2UpKmluX3N0cnVjdC0+Y29sb3JBdHRhY2htZW50Q291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCkgeworICAgICAgICBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IG5ldyBWa0F0dGFjaG1lbnRSZWZlcmVuY2UoKmluX3N0cnVjdC0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wUHJlc2VydmVBdHRhY2htZW50cykgeworICAgICAgICBwUHJlc2VydmVBdHRhY2htZW50cyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPnByZXNlcnZlQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLCAodm9pZCAqKWluX3N0cnVjdC0+cFByZXNlcnZlQXR0YWNobWVudHMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb246OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbiogc3JjKQoreworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBwaXBlbGluZUJpbmRQb2ludCA9IHNyYy0+cGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgaW5wdXRBdHRhY2htZW50Q291bnQgPSBzcmMtPmlucHV0QXR0YWNobWVudENvdW50OworICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBjb2xvckF0dGFjaG1lbnRDb3VudCA9IHNyYy0+Y29sb3JBdHRhY2htZW50Q291bnQ7CisgICAgcENvbG9yQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHBSZXNvbHZlQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbnVsbHB0cjsKKyAgICBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudCA9IHNyYy0+cHJlc2VydmVBdHRhY2htZW50Q291bnQ7CisgICAgcFByZXNlcnZlQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIGlmIChzcmMtPnBJbnB1dEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudFJlZmVyZW5jZVtzcmMtPmlucHV0QXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBJbnB1dEF0dGFjaG1lbnRzLCAodm9pZCAqKXNyYy0+cElucHV0QXR0YWNobWVudHMsIHNpemVvZihWa0F0dGFjaG1lbnRSZWZlcmVuY2UpKnNyYy0+aW5wdXRBdHRhY2htZW50Q291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLT5wQ29sb3JBdHRhY2htZW50cykgeworICAgICAgICBwQ29sb3JBdHRhY2htZW50cyA9IG5ldyBWa0F0dGFjaG1lbnRSZWZlcmVuY2Vbc3JjLT5jb2xvckF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ29sb3JBdHRhY2htZW50cywgKHZvaWQgKilzcmMtPnBDb2xvckF0dGFjaG1lbnRzLCBzaXplb2YoVmtBdHRhY2htZW50UmVmZXJlbmNlKSpzcmMtPmNvbG9yQXR0YWNobWVudENvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy0+cFJlc29sdmVBdHRhY2htZW50cykgeworICAgICAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudFJlZmVyZW5jZVtzcmMtPmNvbG9yQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZXNvbHZlQXR0YWNobWVudHMsICh2b2lkICopc3JjLT5wUmVzb2x2ZUF0dGFjaG1lbnRzLCBzaXplb2YoVmtBdHRhY2htZW50UmVmZXJlbmNlKSpzcmMtPmNvbG9yQXR0YWNobWVudENvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHsKKyAgICAgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBuZXcgVmtBdHRhY2htZW50UmVmZXJlbmNlKCpzcmMtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTsKKyAgICB9CisgICAgaWYgKHNyYy0+cFByZXNlcnZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgcFByZXNlcnZlQXR0YWNobWVudHMgPSBuZXcgdWludDMyX3Rbc3JjLT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUHJlc2VydmVBdHRhY2htZW50cywgKHZvaWQgKilzcmMtPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzLCBzaXplb2YodWludDMyX3QpKnNyYy0+cHJlc2VydmVBdHRhY2htZW50Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvOjpzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8oY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgYXR0YWNobWVudENvdW50KGluX3N0cnVjdC0+YXR0YWNobWVudENvdW50KSwKKyAgICBwQXR0YWNobWVudHMobnVsbHB0ciksCisgICAgc3VicGFzc0NvdW50KGluX3N0cnVjdC0+c3VicGFzc0NvdW50KSwKKyAgICBwU3VicGFzc2VzKG51bGxwdHIpLAorICAgIGRlcGVuZGVuY3lDb3VudChpbl9zdHJ1Y3QtPmRlcGVuZGVuY3lDb3VudCksCisgICAgcERlcGVuZGVuY2llcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudERlc2NyaXB0aW9uW2luX3N0cnVjdC0+YXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBdHRhY2htZW50cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBBdHRhY2htZW50cywgc2l6ZW9mKFZrQXR0YWNobWVudERlc2NyaXB0aW9uKSppbl9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChzdWJwYXNzQ291bnQgJiYgaW5fc3RydWN0LT5wU3VicGFzc2VzKSB7CisgICAgICAgIHBTdWJwYXNzZXMgPSBuZXcgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbltzdWJwYXNzQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTdWJwYXNzZXNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wU3VicGFzc2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wRGVwZW5kZW5jaWVzKSB7CisgICAgICAgIHBEZXBlbmRlbmNpZXMgPSBuZXcgVmtTdWJwYXNzRGVwZW5kZW5jeVtpbl9zdHJ1Y3QtPmRlcGVuZGVuY3lDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGVwZW5kZW5jaWVzLCAodm9pZCAqKWluX3N0cnVjdC0+cERlcGVuZGVuY2llcywgc2l6ZW9mKFZrU3VicGFzc0RlcGVuZGVuY3kpKmluX3N0cnVjdC0+ZGVwZW5kZW5jeUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzo6c2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBBdHRhY2htZW50cyhudWxscHRyKSwKKyAgICBwU3VicGFzc2VzKG51bGxwdHIpLAorICAgIHBEZXBlbmRlbmNpZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzo6c2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGF0dGFjaG1lbnRDb3VudCA9IHNyYy5hdHRhY2htZW50Q291bnQ7CisgICAgcEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBzdWJwYXNzQ291bnQgPSBzcmMuc3VicGFzc0NvdW50OworICAgIHBTdWJwYXNzZXMgPSBudWxscHRyOworICAgIGRlcGVuZGVuY3lDb3VudCA9IHNyYy5kZXBlbmRlbmN5Q291bnQ7CisgICAgcERlcGVuZGVuY2llcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudERlc2NyaXB0aW9uW3NyYy5hdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEF0dGFjaG1lbnRzLCAodm9pZCAqKXNyYy5wQXR0YWNobWVudHMsIHNpemVvZihWa0F0dGFjaG1lbnREZXNjcmlwdGlvbikqc3JjLmF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChzdWJwYXNzQ291bnQgJiYgc3JjLnBTdWJwYXNzZXMpIHsKKyAgICAgICAgcFN1YnBhc3NlcyA9IG5ldyBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uW3N1YnBhc3NDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJwYXNzQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN1YnBhc3Nlc1tpXS5pbml0aWFsaXplKCZzcmMucFN1YnBhc3Nlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wRGVwZW5kZW5jaWVzKSB7CisgICAgICAgIHBEZXBlbmRlbmNpZXMgPSBuZXcgVmtTdWJwYXNzRGVwZW5kZW5jeVtzcmMuZGVwZW5kZW5jeUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXBlbmRlbmNpZXMsICh2b2lkICopc3JjLnBEZXBlbmRlbmNpZXMsIHNpemVvZihWa1N1YnBhc3NEZXBlbmRlbmN5KSpzcmMuZGVwZW5kZW5jeUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyYgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcEF0dGFjaG1lbnRzOworICAgIGlmIChwU3VicGFzc2VzKQorICAgICAgICBkZWxldGVbXSBwU3VicGFzc2VzOworICAgIGlmIChwRGVwZW5kZW5jaWVzKQorICAgICAgICBkZWxldGVbXSBwRGVwZW5kZW5jaWVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgYXR0YWNobWVudENvdW50ID0gc3JjLmF0dGFjaG1lbnRDb3VudDsKKyAgICBwQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHN1YnBhc3NDb3VudCA9IHNyYy5zdWJwYXNzQ291bnQ7CisgICAgcFN1YnBhc3NlcyA9IG51bGxwdHI7CisgICAgZGVwZW5kZW5jeUNvdW50ID0gc3JjLmRlcGVuZGVuY3lDb3VudDsKKyAgICBwRGVwZW5kZW5jaWVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBBdHRhY2htZW50cykgeworICAgICAgICBwQXR0YWNobWVudHMgPSBuZXcgVmtBdHRhY2htZW50RGVzY3JpcHRpb25bc3JjLmF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQXR0YWNobWVudHMsICh2b2lkICopc3JjLnBBdHRhY2htZW50cywgc2l6ZW9mKFZrQXR0YWNobWVudERlc2NyaXB0aW9uKSpzcmMuYXR0YWNobWVudENvdW50KTsKKyAgICB9CisgICAgaWYgKHN1YnBhc3NDb3VudCAmJiBzcmMucFN1YnBhc3NlcykgeworICAgICAgICBwU3VicGFzc2VzID0gbmV3IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb25bc3VicGFzc0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1YnBhc3NDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU3VicGFzc2VzW2ldLmluaXRpYWxpemUoJnNyYy5wU3VicGFzc2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3JjLnBEZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgcERlcGVuZGVuY2llcyA9IG5ldyBWa1N1YnBhc3NEZXBlbmRlbmN5W3NyYy5kZXBlbmRlbmN5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERlcGVuZGVuY2llcywgKHZvaWQgKilzcmMucERlcGVuZGVuY2llcywgc2l6ZW9mKFZrU3VicGFzc0RlcGVuZGVuY3kpKnNyYy5kZXBlbmRlbmN5Q291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvOjp+c2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocEF0dGFjaG1lbnRzKQorICAgICAgICBkZWxldGVbXSBwQXR0YWNobWVudHM7CisgICAgaWYgKHBTdWJwYXNzZXMpCisgICAgICAgIGRlbGV0ZVtdIHBTdWJwYXNzZXM7CisgICAgaWYgKHBEZXBlbmRlbmNpZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEZXBlbmRlbmNpZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGF0dGFjaG1lbnRDb3VudCA9IGluX3N0cnVjdC0+YXR0YWNobWVudENvdW50OworICAgIHBBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgc3VicGFzc0NvdW50ID0gaW5fc3RydWN0LT5zdWJwYXNzQ291bnQ7CisgICAgcFN1YnBhc3NlcyA9IG51bGxwdHI7CisgICAgZGVwZW5kZW5jeUNvdW50ID0gaW5fc3RydWN0LT5kZXBlbmRlbmN5Q291bnQ7CisgICAgcERlcGVuZGVuY2llcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBBdHRhY2htZW50cykgeworICAgICAgICBwQXR0YWNobWVudHMgPSBuZXcgVmtBdHRhY2htZW50RGVzY3JpcHRpb25baW5fc3RydWN0LT5hdHRhY2htZW50Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEF0dGFjaG1lbnRzLCAodm9pZCAqKWluX3N0cnVjdC0+cEF0dGFjaG1lbnRzLCBzaXplb2YoVmtBdHRhY2htZW50RGVzY3JpcHRpb24pKmluX3N0cnVjdC0+YXR0YWNobWVudENvdW50KTsKKyAgICB9CisgICAgaWYgKHN1YnBhc3NDb3VudCAmJiBpbl9zdHJ1Y3QtPnBTdWJwYXNzZXMpIHsKKyAgICAgICAgcFN1YnBhc3NlcyA9IG5ldyBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uW3N1YnBhc3NDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJwYXNzQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN1YnBhc3Nlc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBTdWJwYXNzZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgcERlcGVuZGVuY2llcyA9IG5ldyBWa1N1YnBhc3NEZXBlbmRlbmN5W2luX3N0cnVjdC0+ZGVwZW5kZW5jeUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXBlbmRlbmNpZXMsICh2b2lkICopaW5fc3RydWN0LT5wRGVwZW5kZW5jaWVzLCBzaXplb2YoVmtTdWJwYXNzRGVwZW5kZW5jeSkqaW5fc3RydWN0LT5kZXBlbmRlbmN5Q291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBhdHRhY2htZW50Q291bnQgPSBzcmMtPmF0dGFjaG1lbnRDb3VudDsKKyAgICBwQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHN1YnBhc3NDb3VudCA9IHNyYy0+c3VicGFzc0NvdW50OworICAgIHBTdWJwYXNzZXMgPSBudWxscHRyOworICAgIGRlcGVuZGVuY3lDb3VudCA9IHNyYy0+ZGVwZW5kZW5jeUNvdW50OworICAgIHBEZXBlbmRlbmNpZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrQXR0YWNobWVudERlc2NyaXB0aW9uW3NyYy0+YXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBdHRhY2htZW50cywgKHZvaWQgKilzcmMtPnBBdHRhY2htZW50cywgc2l6ZW9mKFZrQXR0YWNobWVudERlc2NyaXB0aW9uKSpzcmMtPmF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorICAgIGlmIChzdWJwYXNzQ291bnQgJiYgc3JjLT5wU3VicGFzc2VzKSB7CisgICAgICAgIHBTdWJwYXNzZXMgPSBuZXcgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbltzdWJwYXNzQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTdWJwYXNzZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wU3VicGFzc2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3JjLT5wRGVwZW5kZW5jaWVzKSB7CisgICAgICAgIHBEZXBlbmRlbmNpZXMgPSBuZXcgVmtTdWJwYXNzRGVwZW5kZW5jeVtzcmMtPmRlcGVuZGVuY3lDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGVwZW5kZW5jaWVzLCAodm9pZCAqKXNyYy0+cERlcGVuZGVuY2llcywgc2l6ZW9mKFZrU3VicGFzc0RlcGVuZGVuY3kpKnNyYy0+ZGVwZW5kZW5jeUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtDb21tYW5kUG9vbENyZWF0ZUluZm86OnNhZmVfVmtDb21tYW5kUG9vbENyZWF0ZUluZm8oY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHF1ZXVlRmFtaWx5SW5kZXgoaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbzo6c2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbzo6c2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcXVldWVGYW1pbHlJbmRleCA9IHNyYy5xdWV1ZUZhbWlseUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvJiBzYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcXVldWVGYW1pbHlJbmRleCA9IHNyYy5xdWV1ZUZhbWlseUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvOjp+c2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgcXVldWVGYW1pbHlJbmRleCA9IGluX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBxdWV1ZUZhbWlseUluZGV4ID0gc3JjLT5xdWV1ZUZhbWlseUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm86OnNhZmVfVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgY29tbWFuZFBvb2woaW5fc3RydWN0LT5jb21tYW5kUG9vbCksCisgICAgbGV2ZWwoaW5fc3RydWN0LT5sZXZlbCksCisgICAgY29tbWFuZEJ1ZmZlckNvdW50KGluX3N0cnVjdC0+Y29tbWFuZEJ1ZmZlckNvdW50KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm86OnNhZmVfVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbzo6c2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8oY29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb21tYW5kUG9vbCA9IHNyYy5jb21tYW5kUG9vbDsKKyAgICBsZXZlbCA9IHNyYy5sZXZlbDsKKyAgICBjb21tYW5kQnVmZmVyQ291bnQgPSBzcmMuY29tbWFuZEJ1ZmZlckNvdW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyYgc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29tbWFuZFBvb2wgPSBzcmMuY29tbWFuZFBvb2w7CisgICAgbGV2ZWwgPSBzcmMubGV2ZWw7CisgICAgY29tbWFuZEJ1ZmZlckNvdW50ID0gc3JjLmNvbW1hbmRCdWZmZXJDb3VudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm86On5zYWZlX1ZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGNvbW1hbmRQb29sID0gaW5fc3RydWN0LT5jb21tYW5kUG9vbDsKKyAgICBsZXZlbCA9IGluX3N0cnVjdC0+bGV2ZWw7CisgICAgY29tbWFuZEJ1ZmZlckNvdW50ID0gaW5fc3RydWN0LT5jb21tYW5kQnVmZmVyQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGNvbW1hbmRQb29sID0gc3JjLT5jb21tYW5kUG9vbDsKKyAgICBsZXZlbCA9IHNyYy0+bGV2ZWw7CisgICAgY29tbWFuZEJ1ZmZlckNvdW50ID0gc3JjLT5jb21tYW5kQnVmZmVyQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzo6c2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8oY29uc3QgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICByZW5kZXJQYXNzKGluX3N0cnVjdC0+cmVuZGVyUGFzcyksCisgICAgc3VicGFzcyhpbl9zdHJ1Y3QtPnN1YnBhc3MpLAorICAgIGZyYW1lYnVmZmVyKGluX3N0cnVjdC0+ZnJhbWVidWZmZXIpLAorICAgIG9jY2x1c2lvblF1ZXJ5RW5hYmxlKGluX3N0cnVjdC0+b2NjbHVzaW9uUXVlcnlFbmFibGUpLAorICAgIHF1ZXJ5RmxhZ3MoaW5fc3RydWN0LT5xdWVyeUZsYWdzKSwKKyAgICBwaXBlbGluZVN0YXRpc3RpY3MoaW5fc3RydWN0LT5waXBlbGluZVN0YXRpc3RpY3MpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzo6c2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvOjpzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyhjb25zdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHJlbmRlclBhc3MgPSBzcmMucmVuZGVyUGFzczsKKyAgICBzdWJwYXNzID0gc3JjLnN1YnBhc3M7CisgICAgZnJhbWVidWZmZXIgPSBzcmMuZnJhbWVidWZmZXI7CisgICAgb2NjbHVzaW9uUXVlcnlFbmFibGUgPSBzcmMub2NjbHVzaW9uUXVlcnlFbmFibGU7CisgICAgcXVlcnlGbGFncyA9IHNyYy5xdWVyeUZsYWdzOworICAgIHBpcGVsaW5lU3RhdGlzdGljcyA9IHNyYy5waXBlbGluZVN0YXRpc3RpY3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvJiBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICByZW5kZXJQYXNzID0gc3JjLnJlbmRlclBhc3M7CisgICAgc3VicGFzcyA9IHNyYy5zdWJwYXNzOworICAgIGZyYW1lYnVmZmVyID0gc3JjLmZyYW1lYnVmZmVyOworICAgIG9jY2x1c2lvblF1ZXJ5RW5hYmxlID0gc3JjLm9jY2x1c2lvblF1ZXJ5RW5hYmxlOworICAgIHF1ZXJ5RmxhZ3MgPSBzcmMucXVlcnlGbGFnczsKKyAgICBwaXBlbGluZVN0YXRpc3RpY3MgPSBzcmMucGlwZWxpbmVTdGF0aXN0aWNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzo6fnNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcmVuZGVyUGFzcyA9IGluX3N0cnVjdC0+cmVuZGVyUGFzczsKKyAgICBzdWJwYXNzID0gaW5fc3RydWN0LT5zdWJwYXNzOworICAgIGZyYW1lYnVmZmVyID0gaW5fc3RydWN0LT5mcmFtZWJ1ZmZlcjsKKyAgICBvY2NsdXNpb25RdWVyeUVuYWJsZSA9IGluX3N0cnVjdC0+b2NjbHVzaW9uUXVlcnlFbmFibGU7CisgICAgcXVlcnlGbGFncyA9IGluX3N0cnVjdC0+cXVlcnlGbGFnczsKKyAgICBwaXBlbGluZVN0YXRpc3RpY3MgPSBpbl9zdHJ1Y3QtPnBpcGVsaW5lU3RhdGlzdGljczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcmVuZGVyUGFzcyA9IHNyYy0+cmVuZGVyUGFzczsKKyAgICBzdWJwYXNzID0gc3JjLT5zdWJwYXNzOworICAgIGZyYW1lYnVmZmVyID0gc3JjLT5mcmFtZWJ1ZmZlcjsKKyAgICBvY2NsdXNpb25RdWVyeUVuYWJsZSA9IHNyYy0+b2NjbHVzaW9uUXVlcnlFbmFibGU7CisgICAgcXVlcnlGbGFncyA9IHNyYy0+cXVlcnlGbGFnczsKKyAgICBwaXBlbGluZVN0YXRpc3RpY3MgPSBzcmMtPnBpcGVsaW5lU3RhdGlzdGljczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvOjpzYWZlX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyhjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHBJbmhlcml0YW5jZUluZm8obnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cEluaGVyaXRhbmNlSW5mbykKKyAgICAgICAgcEluaGVyaXRhbmNlSW5mbyA9IG5ldyBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyhpbl9zdHJ1Y3QtPnBJbmhlcml0YW5jZUluZm8pOworfQorCitzYWZlX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzo6c2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEluaGVyaXRhbmNlSW5mbyhudWxscHRyKQore30KKworc2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm86OnNhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcEluaGVyaXRhbmNlSW5mbyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wSW5oZXJpdGFuY2VJbmZvKQorICAgICAgICBwSW5oZXJpdGFuY2VJbmZvID0gbmV3IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKCpzcmMucEluaGVyaXRhbmNlSW5mbyk7Cit9CisKK3NhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBJbmhlcml0YW5jZUluZm8pCisgICAgICAgIGRlbGV0ZSBwSW5oZXJpdGFuY2VJbmZvOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcEluaGVyaXRhbmNlSW5mbyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wSW5oZXJpdGFuY2VJbmZvKQorICAgICAgICBwSW5oZXJpdGFuY2VJbmZvID0gbmV3IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKCpzcmMucEluaGVyaXRhbmNlSW5mbyk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvOjp+c2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8oKQoreworICAgIGlmIChwSW5oZXJpdGFuY2VJbmZvKQorICAgICAgICBkZWxldGUgcEluaGVyaXRhbmNlSW5mbzsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHBJbmhlcml0YW5jZUluZm8gPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wSW5oZXJpdGFuY2VJbmZvKQorICAgICAgICBwSW5oZXJpdGFuY2VJbmZvID0gbmV3IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKGluX3N0cnVjdC0+cEluaGVyaXRhbmNlSW5mbyk7Cit9CisKK3ZvaWQgc2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHBJbmhlcml0YW5jZUluZm8gPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wSW5oZXJpdGFuY2VJbmZvKQorICAgICAgICBwSW5oZXJpdGFuY2VJbmZvID0gbmV3IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKCpzcmMtPnBJbmhlcml0YW5jZUluZm8pOworfQorCitzYWZlX1ZrTWVtb3J5QmFycmllcjo6c2FmZV9Wa01lbW9yeUJhcnJpZXIoY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzcmNBY2Nlc3NNYXNrKGluX3N0cnVjdC0+c3JjQWNjZXNzTWFzayksCisgICAgZHN0QWNjZXNzTWFzayhpbl9zdHJ1Y3QtPmRzdEFjY2Vzc01hc2spCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5QmFycmllcjo6c2FmZV9Wa01lbW9yeUJhcnJpZXIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtNZW1vcnlCYXJyaWVyOjpzYWZlX1ZrTWVtb3J5QmFycmllcihjb25zdCBzYWZlX1ZrTWVtb3J5QmFycmllciYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNyY0FjY2Vzc01hc2sgPSBzcmMuc3JjQWNjZXNzTWFzazsKKyAgICBkc3RBY2Nlc3NNYXNrID0gc3JjLmRzdEFjY2Vzc01hc2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlCYXJyaWVyJiBzYWZlX1ZrTWVtb3J5QmFycmllcjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlCYXJyaWVyJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzcmNBY2Nlc3NNYXNrID0gc3JjLnNyY0FjY2Vzc01hc2s7CisgICAgZHN0QWNjZXNzTWFzayA9IHNyYy5kc3RBY2Nlc3NNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5QmFycmllcjo6fnNhZmVfVmtNZW1vcnlCYXJyaWVyKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWVtb3J5QmFycmllcjo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeUJhcnJpZXIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3JjQWNjZXNzTWFzayA9IGluX3N0cnVjdC0+c3JjQWNjZXNzTWFzazsKKyAgICBkc3RBY2Nlc3NNYXNrID0gaW5fc3RydWN0LT5kc3RBY2Nlc3NNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWVtb3J5QmFycmllcjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5QmFycmllciogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzcmNBY2Nlc3NNYXNrID0gc3JjLT5zcmNBY2Nlc3NNYXNrOworICAgIGRzdEFjY2Vzc01hc2sgPSBzcmMtPmRzdEFjY2Vzc01hc2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcjo6c2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXIoY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzcmNBY2Nlc3NNYXNrKGluX3N0cnVjdC0+c3JjQWNjZXNzTWFzayksCisgICAgZHN0QWNjZXNzTWFzayhpbl9zdHJ1Y3QtPmRzdEFjY2Vzc01hc2spLAorICAgIHNyY1F1ZXVlRmFtaWx5SW5kZXgoaW5fc3RydWN0LT5zcmNRdWV1ZUZhbWlseUluZGV4KSwKKyAgICBkc3RRdWV1ZUZhbWlseUluZGV4KGluX3N0cnVjdC0+ZHN0UXVldWVGYW1pbHlJbmRleCksCisgICAgYnVmZmVyKGluX3N0cnVjdC0+YnVmZmVyKSwKKyAgICBvZmZzZXQoaW5fc3RydWN0LT5vZmZzZXQpLAorICAgIHNpemUoaW5fc3RydWN0LT5zaXplKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXI6OnNhZmVfVmtCdWZmZXJNZW1vcnlCYXJyaWVyKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcjo6c2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXIoY29uc3Qgc2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzcmNBY2Nlc3NNYXNrID0gc3JjLnNyY0FjY2Vzc01hc2s7CisgICAgZHN0QWNjZXNzTWFzayA9IHNyYy5kc3RBY2Nlc3NNYXNrOworICAgIHNyY1F1ZXVlRmFtaWx5SW5kZXggPSBzcmMuc3JjUXVldWVGYW1pbHlJbmRleDsKKyAgICBkc3RRdWV1ZUZhbWlseUluZGV4ID0gc3JjLmRzdFF1ZXVlRmFtaWx5SW5kZXg7CisgICAgYnVmZmVyID0gc3JjLmJ1ZmZlcjsKKyAgICBvZmZzZXQgPSBzcmMub2Zmc2V0OworICAgIHNpemUgPSBzcmMuc2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXImIHNhZmVfVmtCdWZmZXJNZW1vcnlCYXJyaWVyOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNyY0FjY2Vzc01hc2sgPSBzcmMuc3JjQWNjZXNzTWFzazsKKyAgICBkc3RBY2Nlc3NNYXNrID0gc3JjLmRzdEFjY2Vzc01hc2s7CisgICAgc3JjUXVldWVGYW1pbHlJbmRleCA9IHNyYy5zcmNRdWV1ZUZhbWlseUluZGV4OworICAgIGRzdFF1ZXVlRmFtaWx5SW5kZXggPSBzcmMuZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICBidWZmZXIgPSBzcmMuYnVmZmVyOworICAgIG9mZnNldCA9IHNyYy5vZmZzZXQ7CisgICAgc2l6ZSA9IHNyYy5zaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcjo6fnNhZmVfVmtCdWZmZXJNZW1vcnlCYXJyaWVyKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcjo6aW5pdGlhbGl6ZShjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3JjQWNjZXNzTWFzayA9IGluX3N0cnVjdC0+c3JjQWNjZXNzTWFzazsKKyAgICBkc3RBY2Nlc3NNYXNrID0gaW5fc3RydWN0LT5kc3RBY2Nlc3NNYXNrOworICAgIHNyY1F1ZXVlRmFtaWx5SW5kZXggPSBpbl9zdHJ1Y3QtPnNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgZHN0UXVldWVGYW1pbHlJbmRleCA9IGluX3N0cnVjdC0+ZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICBidWZmZXIgPSBpbl9zdHJ1Y3QtPmJ1ZmZlcjsKKyAgICBvZmZzZXQgPSBpbl9zdHJ1Y3QtPm9mZnNldDsKKyAgICBzaXplID0gaW5fc3RydWN0LT5zaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllciogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzcmNBY2Nlc3NNYXNrID0gc3JjLT5zcmNBY2Nlc3NNYXNrOworICAgIGRzdEFjY2Vzc01hc2sgPSBzcmMtPmRzdEFjY2Vzc01hc2s7CisgICAgc3JjUXVldWVGYW1pbHlJbmRleCA9IHNyYy0+c3JjUXVldWVGYW1pbHlJbmRleDsKKyAgICBkc3RRdWV1ZUZhbWlseUluZGV4ID0gc3JjLT5kc3RRdWV1ZUZhbWlseUluZGV4OworICAgIGJ1ZmZlciA9IHNyYy0+YnVmZmVyOworICAgIG9mZnNldCA9IHNyYy0+b2Zmc2V0OworICAgIHNpemUgPSBzcmMtPnNpemU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyOjpzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyKGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzcmNBY2Nlc3NNYXNrKGluX3N0cnVjdC0+c3JjQWNjZXNzTWFzayksCisgICAgZHN0QWNjZXNzTWFzayhpbl9zdHJ1Y3QtPmRzdEFjY2Vzc01hc2spLAorICAgIG9sZExheW91dChpbl9zdHJ1Y3QtPm9sZExheW91dCksCisgICAgbmV3TGF5b3V0KGluX3N0cnVjdC0+bmV3TGF5b3V0KSwKKyAgICBzcmNRdWV1ZUZhbWlseUluZGV4KGluX3N0cnVjdC0+c3JjUXVldWVGYW1pbHlJbmRleCksCisgICAgZHN0UXVldWVGYW1pbHlJbmRleChpbl9zdHJ1Y3QtPmRzdFF1ZXVlRmFtaWx5SW5kZXgpLAorICAgIGltYWdlKGluX3N0cnVjdC0+aW1hZ2UpLAorICAgIHN1YnJlc291cmNlUmFuZ2UoaW5fc3RydWN0LT5zdWJyZXNvdXJjZVJhbmdlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllcjo6c2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllcigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllcjo6c2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllcihjb25zdCBzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3JjQWNjZXNzTWFzayA9IHNyYy5zcmNBY2Nlc3NNYXNrOworICAgIGRzdEFjY2Vzc01hc2sgPSBzcmMuZHN0QWNjZXNzTWFzazsKKyAgICBvbGRMYXlvdXQgPSBzcmMub2xkTGF5b3V0OworICAgIG5ld0xheW91dCA9IHNyYy5uZXdMYXlvdXQ7CisgICAgc3JjUXVldWVGYW1pbHlJbmRleCA9IHNyYy5zcmNRdWV1ZUZhbWlseUluZGV4OworICAgIGRzdFF1ZXVlRmFtaWx5SW5kZXggPSBzcmMuZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICBpbWFnZSA9IHNyYy5pbWFnZTsKKyAgICBzdWJyZXNvdXJjZVJhbmdlID0gc3JjLnN1YnJlc291cmNlUmFuZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXImIHNhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzcmNBY2Nlc3NNYXNrID0gc3JjLnNyY0FjY2Vzc01hc2s7CisgICAgZHN0QWNjZXNzTWFzayA9IHNyYy5kc3RBY2Nlc3NNYXNrOworICAgIG9sZExheW91dCA9IHNyYy5vbGRMYXlvdXQ7CisgICAgbmV3TGF5b3V0ID0gc3JjLm5ld0xheW91dDsKKyAgICBzcmNRdWV1ZUZhbWlseUluZGV4ID0gc3JjLnNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgZHN0UXVldWVGYW1pbHlJbmRleCA9IHNyYy5kc3RRdWV1ZUZhbWlseUluZGV4OworICAgIGltYWdlID0gc3JjLmltYWdlOworICAgIHN1YnJlc291cmNlUmFuZ2UgPSBzcmMuc3VicmVzb3VyY2VSYW5nZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllcjo6fnNhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXI6OmluaXRpYWxpemUoY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3JjQWNjZXNzTWFzayA9IGluX3N0cnVjdC0+c3JjQWNjZXNzTWFzazsKKyAgICBkc3RBY2Nlc3NNYXNrID0gaW5fc3RydWN0LT5kc3RBY2Nlc3NNYXNrOworICAgIG9sZExheW91dCA9IGluX3N0cnVjdC0+b2xkTGF5b3V0OworICAgIG5ld0xheW91dCA9IGluX3N0cnVjdC0+bmV3TGF5b3V0OworICAgIHNyY1F1ZXVlRmFtaWx5SW5kZXggPSBpbl9zdHJ1Y3QtPnNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgZHN0UXVldWVGYW1pbHlJbmRleCA9IGluX3N0cnVjdC0+ZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICBpbWFnZSA9IGluX3N0cnVjdC0+aW1hZ2U7CisgICAgc3VicmVzb3VyY2VSYW5nZSA9IGluX3N0cnVjdC0+c3VicmVzb3VyY2VSYW5nZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllcjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNyY0FjY2Vzc01hc2sgPSBzcmMtPnNyY0FjY2Vzc01hc2s7CisgICAgZHN0QWNjZXNzTWFzayA9IHNyYy0+ZHN0QWNjZXNzTWFzazsKKyAgICBvbGRMYXlvdXQgPSBzcmMtPm9sZExheW91dDsKKyAgICBuZXdMYXlvdXQgPSBzcmMtPm5ld0xheW91dDsKKyAgICBzcmNRdWV1ZUZhbWlseUluZGV4ID0gc3JjLT5zcmNRdWV1ZUZhbWlseUluZGV4OworICAgIGRzdFF1ZXVlRmFtaWx5SW5kZXggPSBzcmMtPmRzdFF1ZXVlRmFtaWx5SW5kZXg7CisgICAgaW1hZ2UgPSBzcmMtPmltYWdlOworICAgIHN1YnJlc291cmNlUmFuZ2UgPSBzcmMtPnN1YnJlc291cmNlUmFuZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbzo6c2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm8oY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICByZW5kZXJQYXNzKGluX3N0cnVjdC0+cmVuZGVyUGFzcyksCisgICAgZnJhbWVidWZmZXIoaW5fc3RydWN0LT5mcmFtZWJ1ZmZlciksCisgICAgcmVuZGVyQXJlYShpbl9zdHJ1Y3QtPnJlbmRlckFyZWEpLAorICAgIGNsZWFyVmFsdWVDb3VudChpbl9zdHJ1Y3QtPmNsZWFyVmFsdWVDb3VudCksCisgICAgcENsZWFyVmFsdWVzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBDbGVhclZhbHVlcykgeworICAgICAgICBwQ2xlYXJWYWx1ZXMgPSBuZXcgVmtDbGVhclZhbHVlW2luX3N0cnVjdC0+Y2xlYXJWYWx1ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDbGVhclZhbHVlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBDbGVhclZhbHVlcywgc2l6ZW9mKFZrQ2xlYXJWYWx1ZSkqaW5fc3RydWN0LT5jbGVhclZhbHVlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm86OnNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBDbGVhclZhbHVlcyhudWxscHRyKQore30KKworc2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm86OnNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVuZGVyUGFzcyA9IHNyYy5yZW5kZXJQYXNzOworICAgIGZyYW1lYnVmZmVyID0gc3JjLmZyYW1lYnVmZmVyOworICAgIHJlbmRlckFyZWEgPSBzcmMucmVuZGVyQXJlYTsKKyAgICBjbGVhclZhbHVlQ291bnQgPSBzcmMuY2xlYXJWYWx1ZUNvdW50OworICAgIHBDbGVhclZhbHVlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQ2xlYXJWYWx1ZXMpIHsKKyAgICAgICAgcENsZWFyVmFsdWVzID0gbmV3IFZrQ2xlYXJWYWx1ZVtzcmMuY2xlYXJWYWx1ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDbGVhclZhbHVlcywgKHZvaWQgKilzcmMucENsZWFyVmFsdWVzLCBzaXplb2YoVmtDbGVhclZhbHVlKSpzcmMuY2xlYXJWYWx1ZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvJiBzYWZlX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBDbGVhclZhbHVlcykKKyAgICAgICAgZGVsZXRlW10gcENsZWFyVmFsdWVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVuZGVyUGFzcyA9IHNyYy5yZW5kZXJQYXNzOworICAgIGZyYW1lYnVmZmVyID0gc3JjLmZyYW1lYnVmZmVyOworICAgIHJlbmRlckFyZWEgPSBzcmMucmVuZGVyQXJlYTsKKyAgICBjbGVhclZhbHVlQ291bnQgPSBzcmMuY2xlYXJWYWx1ZUNvdW50OworICAgIHBDbGVhclZhbHVlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQ2xlYXJWYWx1ZXMpIHsKKyAgICAgICAgcENsZWFyVmFsdWVzID0gbmV3IFZrQ2xlYXJWYWx1ZVtzcmMuY2xlYXJWYWx1ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDbGVhclZhbHVlcywgKHZvaWQgKilzcmMucENsZWFyVmFsdWVzLCBzaXplb2YoVmtDbGVhclZhbHVlKSpzcmMuY2xlYXJWYWx1ZUNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvOjp+c2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm8oKQoreworICAgIGlmIChwQ2xlYXJWYWx1ZXMpCisgICAgICAgIGRlbGV0ZVtdIHBDbGVhclZhbHVlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcmVuZGVyUGFzcyA9IGluX3N0cnVjdC0+cmVuZGVyUGFzczsKKyAgICBmcmFtZWJ1ZmZlciA9IGluX3N0cnVjdC0+ZnJhbWVidWZmZXI7CisgICAgcmVuZGVyQXJlYSA9IGluX3N0cnVjdC0+cmVuZGVyQXJlYTsKKyAgICBjbGVhclZhbHVlQ291bnQgPSBpbl9zdHJ1Y3QtPmNsZWFyVmFsdWVDb3VudDsKKyAgICBwQ2xlYXJWYWx1ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQ2xlYXJWYWx1ZXMpIHsKKyAgICAgICAgcENsZWFyVmFsdWVzID0gbmV3IFZrQ2xlYXJWYWx1ZVtpbl9zdHJ1Y3QtPmNsZWFyVmFsdWVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ2xlYXJWYWx1ZXMsICh2b2lkICopaW5fc3RydWN0LT5wQ2xlYXJWYWx1ZXMsIHNpemVvZihWa0NsZWFyVmFsdWUpKmluX3N0cnVjdC0+Y2xlYXJWYWx1ZUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcmVuZGVyUGFzcyA9IHNyYy0+cmVuZGVyUGFzczsKKyAgICBmcmFtZWJ1ZmZlciA9IHNyYy0+ZnJhbWVidWZmZXI7CisgICAgcmVuZGVyQXJlYSA9IHNyYy0+cmVuZGVyQXJlYTsKKyAgICBjbGVhclZhbHVlQ291bnQgPSBzcmMtPmNsZWFyVmFsdWVDb3VudDsKKyAgICBwQ2xlYXJWYWx1ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wQ2xlYXJWYWx1ZXMpIHsKKyAgICAgICAgcENsZWFyVmFsdWVzID0gbmV3IFZrQ2xlYXJWYWx1ZVtzcmMtPmNsZWFyVmFsdWVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ2xlYXJWYWx1ZXMsICh2b2lkICopc3JjLT5wQ2xlYXJWYWx1ZXMsIHNpemVvZihWa0NsZWFyVmFsdWUpKnNyYy0+Y2xlYXJWYWx1ZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHN1Ymdyb3VwU2l6ZShpbl9zdHJ1Y3QtPnN1Ymdyb3VwU2l6ZSksCisgICAgc3VwcG9ydGVkU3RhZ2VzKGluX3N0cnVjdC0+c3VwcG9ydGVkU3RhZ2VzKSwKKyAgICBzdXBwb3J0ZWRPcGVyYXRpb25zKGluX3N0cnVjdC0+c3VwcG9ydGVkT3BlcmF0aW9ucyksCisgICAgcXVhZE9wZXJhdGlvbnNJbkFsbFN0YWdlcyhpbl9zdHJ1Y3QtPnF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3ViZ3JvdXBTaXplID0gc3JjLnN1Ymdyb3VwU2l6ZTsKKyAgICBzdXBwb3J0ZWRTdGFnZXMgPSBzcmMuc3VwcG9ydGVkU3RhZ2VzOworICAgIHN1cHBvcnRlZE9wZXJhdGlvbnMgPSBzcmMuc3VwcG9ydGVkT3BlcmF0aW9uczsKKyAgICBxdWFkT3BlcmF0aW9uc0luQWxsU3RhZ2VzID0gc3JjLnF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdWJncm91cFNpemUgPSBzcmMuc3ViZ3JvdXBTaXplOworICAgIHN1cHBvcnRlZFN0YWdlcyA9IHNyYy5zdXBwb3J0ZWRTdGFnZXM7CisgICAgc3VwcG9ydGVkT3BlcmF0aW9ucyA9IHNyYy5zdXBwb3J0ZWRPcGVyYXRpb25zOworICAgIHF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXMgPSBzcmMucXVhZE9wZXJhdGlvbnNJbkFsbFN0YWdlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzdWJncm91cFNpemUgPSBpbl9zdHJ1Y3QtPnN1Ymdyb3VwU2l6ZTsKKyAgICBzdXBwb3J0ZWRTdGFnZXMgPSBpbl9zdHJ1Y3QtPnN1cHBvcnRlZFN0YWdlczsKKyAgICBzdXBwb3J0ZWRPcGVyYXRpb25zID0gaW5fc3RydWN0LT5zdXBwb3J0ZWRPcGVyYXRpb25zOworICAgIHF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXMgPSBpbl9zdHJ1Y3QtPnF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllczo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3ViZ3JvdXBTaXplID0gc3JjLT5zdWJncm91cFNpemU7CisgICAgc3VwcG9ydGVkU3RhZ2VzID0gc3JjLT5zdXBwb3J0ZWRTdGFnZXM7CisgICAgc3VwcG9ydGVkT3BlcmF0aW9ucyA9IHNyYy0+c3VwcG9ydGVkT3BlcmF0aW9uczsKKyAgICBxdWFkT3BlcmF0aW9uc0luQWxsU3RhZ2VzID0gc3JjLT5xdWFkT3BlcmF0aW9uc0luQWxsU3RhZ2VzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvOjpzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm8oY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgYnVmZmVyKGluX3N0cnVjdC0+YnVmZmVyKSwKKyAgICBtZW1vcnkoaW5fc3RydWN0LT5tZW1vcnkpLAorICAgIG1lbW9yeU9mZnNldChpbl9zdHJ1Y3QtPm1lbW9yeU9mZnNldCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtCaW5kQnVmZmVyTWVtb3J5SW5mbzo6c2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm86OnNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyhjb25zdCBzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBidWZmZXIgPSBzcmMuYnVmZmVyOworICAgIG1lbW9yeSA9IHNyYy5tZW1vcnk7CisgICAgbWVtb3J5T2Zmc2V0ID0gc3JjLm1lbW9yeU9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvJiBzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGJ1ZmZlciA9IHNyYy5idWZmZXI7CisgICAgbWVtb3J5ID0gc3JjLm1lbW9yeTsKKyAgICBtZW1vcnlPZmZzZXQgPSBzcmMubWVtb3J5T2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm86On5zYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5SW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGJ1ZmZlciA9IGluX3N0cnVjdC0+YnVmZmVyOworICAgIG1lbW9yeSA9IGluX3N0cnVjdC0+bWVtb3J5OworICAgIG1lbW9yeU9mZnNldCA9IGluX3N0cnVjdC0+bWVtb3J5T2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGJ1ZmZlciA9IHNyYy0+YnVmZmVyOworICAgIG1lbW9yeSA9IHNyYy0+bWVtb3J5OworICAgIG1lbW9yeU9mZnNldCA9IHNyYy0+bWVtb3J5T2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm86OnNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgaW1hZ2UoaW5fc3RydWN0LT5pbWFnZSksCisgICAgbWVtb3J5KGluX3N0cnVjdC0+bWVtb3J5KSwKKyAgICBtZW1vcnlPZmZzZXQoaW5fc3RydWN0LT5tZW1vcnlPZmZzZXQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbzo6c2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtCaW5kSW1hZ2VNZW1vcnlJbmZvOjpzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbyhjb25zdCBzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGltYWdlID0gc3JjLmltYWdlOworICAgIG1lbW9yeSA9IHNyYy5tZW1vcnk7CisgICAgbWVtb3J5T2Zmc2V0ID0gc3JjLm1lbW9yeU9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm8mIHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGltYWdlID0gc3JjLmltYWdlOworICAgIG1lbW9yeSA9IHNyYy5tZW1vcnk7CisgICAgbWVtb3J5T2Zmc2V0ID0gc3JjLm1lbW9yeU9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm86On5zYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm86OmluaXRpYWxpemUoY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGltYWdlID0gaW5fc3RydWN0LT5pbWFnZTsKKyAgICBtZW1vcnkgPSBpbl9zdHJ1Y3QtPm1lbW9yeTsKKyAgICBtZW1vcnlPZmZzZXQgPSBpbl9zdHJ1Y3QtPm1lbW9yeU9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW1hZ2UgPSBzcmMtPmltYWdlOworICAgIG1lbW9yeSA9IHNyYy0+bWVtb3J5OworICAgIG1lbW9yeU9mZnNldCA9IHNyYy0+bWVtb3J5T2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzKGluX3N0cnVjdC0+c3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzKSwKKyAgICB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzKGluX3N0cnVjdC0+dW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyksCisgICAgc3RvcmFnZVB1c2hDb25zdGFudDE2KGluX3N0cnVjdC0+c3RvcmFnZVB1c2hDb25zdGFudDE2KSwKKyAgICBzdG9yYWdlSW5wdXRPdXRwdXQxNihpbl9zdHJ1Y3QtPnN0b3JhZ2VJbnB1dE91dHB1dDE2KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MgPSBzcmMuc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzOworICAgIHVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MgPSBzcmMudW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzczsKKyAgICBzdG9yYWdlUHVzaENvbnN0YW50MTYgPSBzcmMuc3RvcmFnZVB1c2hDb25zdGFudDE2OworICAgIHN0b3JhZ2VJbnB1dE91dHB1dDE2ID0gc3JjLnN0b3JhZ2VJbnB1dE91dHB1dDE2OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzID0gc3JjLnN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzczsKKyAgICB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzID0gc3JjLnVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3M7CisgICAgc3RvcmFnZVB1c2hDb25zdGFudDE2ID0gc3JjLnN0b3JhZ2VQdXNoQ29uc3RhbnQxNjsKKyAgICBzdG9yYWdlSW5wdXRPdXRwdXQxNiA9IHNyYy5zdG9yYWdlSW5wdXRPdXRwdXQxNjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyA9IGluX3N0cnVjdC0+c3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzOworICAgIHVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MgPSBpbl9zdHJ1Y3QtPnVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3M7CisgICAgc3RvcmFnZVB1c2hDb25zdGFudDE2ID0gaW5fc3RydWN0LT5zdG9yYWdlUHVzaENvbnN0YW50MTY7CisgICAgc3RvcmFnZUlucHV0T3V0cHV0MTYgPSBpbl9zdHJ1Y3QtPnN0b3JhZ2VJbnB1dE91dHB1dDE2OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlczo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MgPSBzcmMtPnN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzczsKKyAgICB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzID0gc3JjLT51bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzOworICAgIHN0b3JhZ2VQdXNoQ29uc3RhbnQxNiA9IHNyYy0+c3RvcmFnZVB1c2hDb25zdGFudDE2OworICAgIHN0b3JhZ2VJbnB1dE91dHB1dDE2ID0gc3JjLT5zdG9yYWdlSW5wdXRPdXRwdXQxNjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHM6OnNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMoY29uc3QgVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uKGluX3N0cnVjdC0+cHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24pLAorICAgIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbihpbl9zdHJ1Y3QtPnJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHM6OnNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHM6OnNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMoY29uc3Qgc2FmZV9Wa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uID0gc3JjLnByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiA9IHNyYy5yZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMmIHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiA9IHNyYy5wcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbjsKKyAgICByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gPSBzcmMucmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzOjp+c2FmZV9Wa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50czo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiA9IGluX3N0cnVjdC0+cHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb247CisgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uID0gaW5fc3RydWN0LT5yZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHM6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiA9IHNyYy0+cHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb247CisgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uID0gc3JjLT5yZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjpzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKGNvbnN0IFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBpbWFnZShpbl9zdHJ1Y3QtPmltYWdlKSwKKyAgICBidWZmZXIoaW5fc3RydWN0LT5idWZmZXIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjpzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjpzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKGNvbnN0IHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbWFnZSA9IHNyYy5pbWFnZTsKKyAgICBidWZmZXIgPSBzcmMuYnVmZmVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvJiBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW1hZ2UgPSBzcmMuaW1hZ2U7CisgICAgYnVmZmVyID0gc3JjLmJ1ZmZlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzo6fnNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaW1hZ2UgPSBpbl9zdHJ1Y3QtPmltYWdlOworICAgIGJ1ZmZlciA9IGluX3N0cnVjdC0+YnVmZmVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW1hZ2UgPSBzcmMtPmltYWdlOworICAgIGJ1ZmZlciA9IHNyYy0+YnVmZmVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvOjpzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8oY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgZGV2aWNlTWFzayhpbl9zdHJ1Y3QtPmRldmljZU1hc2spCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm86OnNhZmVfVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvOjpzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8oY29uc3Qgc2FmZV9Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGV2aWNlTWFzayA9IHNyYy5kZXZpY2VNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8mIHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGV2aWNlTWFzayA9IHNyYy5kZXZpY2VNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm86On5zYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBkZXZpY2VNYXNrID0gaW5fc3RydWN0LT5kZXZpY2VNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBkZXZpY2VNYXNrID0gc3JjLT5kZXZpY2VNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbzo6c2FmZV9Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyhjb25zdCBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGV2aWNlTWFzayhpbl9zdHJ1Y3QtPmRldmljZU1hc2spLAorICAgIGRldmljZVJlbmRlckFyZWFDb3VudChpbl9zdHJ1Y3QtPmRldmljZVJlbmRlckFyZWFDb3VudCksCisgICAgcERldmljZVJlbmRlckFyZWFzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXZpY2VSZW5kZXJBcmVhcykgeworICAgICAgICBwRGV2aWNlUmVuZGVyQXJlYXMgPSBuZXcgVmtSZWN0MkRbaW5fc3RydWN0LT5kZXZpY2VSZW5kZXJBcmVhQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERldmljZVJlbmRlckFyZWFzLCAodm9pZCAqKWluX3N0cnVjdC0+cERldmljZVJlbmRlckFyZWFzLCBzaXplb2YoVmtSZWN0MkQpKmluX3N0cnVjdC0+ZGV2aWNlUmVuZGVyQXJlYUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm86OnNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcERldmljZVJlbmRlckFyZWFzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvOjpzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZXZpY2VNYXNrID0gc3JjLmRldmljZU1hc2s7CisgICAgZGV2aWNlUmVuZGVyQXJlYUNvdW50ID0gc3JjLmRldmljZVJlbmRlckFyZWFDb3VudDsKKyAgICBwRGV2aWNlUmVuZGVyQXJlYXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERldmljZVJlbmRlckFyZWFzKSB7CisgICAgICAgIHBEZXZpY2VSZW5kZXJBcmVhcyA9IG5ldyBWa1JlY3QyRFtzcmMuZGV2aWNlUmVuZGVyQXJlYUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VSZW5kZXJBcmVhcywgKHZvaWQgKilzcmMucERldmljZVJlbmRlckFyZWFzLCBzaXplb2YoVmtSZWN0MkQpKnNyYy5kZXZpY2VSZW5kZXJBcmVhQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyYgc2FmZV9Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocERldmljZVJlbmRlckFyZWFzKQorICAgICAgICBkZWxldGVbXSBwRGV2aWNlUmVuZGVyQXJlYXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZXZpY2VNYXNrID0gc3JjLmRldmljZU1hc2s7CisgICAgZGV2aWNlUmVuZGVyQXJlYUNvdW50ID0gc3JjLmRldmljZVJlbmRlckFyZWFDb3VudDsKKyAgICBwRGV2aWNlUmVuZGVyQXJlYXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERldmljZVJlbmRlckFyZWFzKSB7CisgICAgICAgIHBEZXZpY2VSZW5kZXJBcmVhcyA9IG5ldyBWa1JlY3QyRFtzcmMuZGV2aWNlUmVuZGVyQXJlYUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VSZW5kZXJBcmVhcywgKHZvaWQgKilzcmMucERldmljZVJlbmRlckFyZWFzLCBzaXplb2YoVmtSZWN0MkQpKnNyYy5kZXZpY2VSZW5kZXJBcmVhQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbzo6fnNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8oKQoreworICAgIGlmIChwRGV2aWNlUmVuZGVyQXJlYXMpCisgICAgICAgIGRlbGV0ZVtdIHBEZXZpY2VSZW5kZXJBcmVhczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRldmljZU1hc2sgPSBpbl9zdHJ1Y3QtPmRldmljZU1hc2s7CisgICAgZGV2aWNlUmVuZGVyQXJlYUNvdW50ID0gaW5fc3RydWN0LT5kZXZpY2VSZW5kZXJBcmVhQ291bnQ7CisgICAgcERldmljZVJlbmRlckFyZWFzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cERldmljZVJlbmRlckFyZWFzKSB7CisgICAgICAgIHBEZXZpY2VSZW5kZXJBcmVhcyA9IG5ldyBWa1JlY3QyRFtpbl9zdHJ1Y3QtPmRldmljZVJlbmRlckFyZWFDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGV2aWNlUmVuZGVyQXJlYXMsICh2b2lkICopaW5fc3RydWN0LT5wRGV2aWNlUmVuZGVyQXJlYXMsIHNpemVvZihWa1JlY3QyRCkqaW5fc3RydWN0LT5kZXZpY2VSZW5kZXJBcmVhQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGV2aWNlTWFzayA9IHNyYy0+ZGV2aWNlTWFzazsKKyAgICBkZXZpY2VSZW5kZXJBcmVhQ291bnQgPSBzcmMtPmRldmljZVJlbmRlckFyZWFDb3VudDsKKyAgICBwRGV2aWNlUmVuZGVyQXJlYXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wRGV2aWNlUmVuZGVyQXJlYXMpIHsKKyAgICAgICAgcERldmljZVJlbmRlckFyZWFzID0gbmV3IFZrUmVjdDJEW3NyYy0+ZGV2aWNlUmVuZGVyQXJlYUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VSZW5kZXJBcmVhcywgKHZvaWQgKilzcmMtPnBEZXZpY2VSZW5kZXJBcmVhcywgc2l6ZW9mKFZrUmVjdDJEKSpzcmMtPmRldmljZVJlbmRlckFyZWFDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvOjpzYWZlX1ZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvKGNvbnN0IFZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkZXZpY2VNYXNrKGluX3N0cnVjdC0+ZGV2aWNlTWFzaykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm86OnNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm86OnNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRldmljZU1hc2sgPSBzcmMuZGV2aWNlTWFzazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyYgc2FmZV9Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRldmljZU1hc2sgPSBzcmMuZGV2aWNlTWFzazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzo6fnNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm86OmluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGV2aWNlTWFzayA9IGluX3N0cnVjdC0+ZGV2aWNlTWFzazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRldmljZU1hc2sgPSBzcmMtPmRldmljZU1hc2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvOjpzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKGNvbnN0IFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB3YWl0U2VtYXBob3JlQ291bnQoaW5fc3RydWN0LT53YWl0U2VtYXBob3JlQ291bnQpLAorICAgIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyhudWxscHRyKSwKKyAgICBjb21tYW5kQnVmZmVyQ291bnQoaW5fc3RydWN0LT5jb21tYW5kQnVmZmVyQ291bnQpLAorICAgIHBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MobnVsbHB0ciksCisgICAgc2lnbmFsU2VtYXBob3JlQ291bnQoaW5fc3RydWN0LT5zaWduYWxTZW1hcGhvcmVDb3VudCksCisgICAgcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPndhaXRTZW1hcGhvcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT53YWl0U2VtYXBob3JlQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzKSB7CisgICAgICAgIHBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5jb21tYW5kQnVmZmVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5jb21tYW5kQnVmZmVyQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5zaWduYWxTZW1hcGhvcmVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvOjpzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyhudWxscHRyKSwKKyAgICBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzKG51bGxwdHIpLAorICAgIHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvOjpzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB3YWl0U2VtYXBob3JlQ291bnQgPSBzcmMud2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG51bGxwdHI7CisgICAgY29tbWFuZEJ1ZmZlckNvdW50ID0gc3JjLmNvbW1hbmRCdWZmZXJDb3VudDsKKyAgICBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzID0gbnVsbHB0cjsKKyAgICBzaWduYWxTZW1hcGhvcmVDb3VudCA9IHNyYy5zaWduYWxTZW1hcGhvcmVDb3VudDsKKyAgICBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy53YWl0U2VtYXBob3JlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLCAodm9pZCAqKXNyYy5wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLndhaXRTZW1hcGhvcmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcykgeworICAgICAgICBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzID0gbmV3IHVpbnQzMl90W3NyYy5jb21tYW5kQnVmZmVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcywgKHZvaWQgKilzcmMucENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuY29tbWFuZEJ1ZmZlckNvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMuc2lnbmFsU2VtYXBob3JlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMsICh2b2lkICopc3JjLnBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy5zaWduYWxTZW1hcGhvcmVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvJiBzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwU3VibWl0SW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlczsKKyAgICBpZiAocENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcykKKyAgICAgICAgZGVsZXRlW10gcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrczsKKyAgICBpZiAocFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgd2FpdFNlbWFwaG9yZUNvdW50ID0gc3JjLndhaXRTZW1hcGhvcmVDb3VudDsKKyAgICBwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMgPSBudWxscHRyOworICAgIGNvbW1hbmRCdWZmZXJDb3VudCA9IHNyYy5jb21tYW5kQnVmZmVyQ291bnQ7CisgICAgcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlQ291bnQgPSBzcmMuc2lnbmFsU2VtYXBob3JlQ291bnQ7CisgICAgcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMud2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcywgKHZvaWQgKilzcmMucFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy53YWl0U2VtYXBob3JlQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MpIHsKKyAgICAgICAgcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcyA9IG5ldyB1aW50MzJfdFtzcmMuY29tbWFuZEJ1ZmZlckNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MsICh2b2lkICopc3JjLnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MsIHNpemVvZih1aW50MzJfdCkqc3JjLmNvbW1hbmRCdWZmZXJDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMpIHsKKyAgICAgICAgcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMgPSBuZXcgdWludDMyX3Rbc3JjLnNpZ25hbFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLCAodm9pZCAqKXNyYy5wU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuc2lnbmFsU2VtYXBob3JlQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RldmljZUdyb3VwU3VibWl0SW5mbzo6fnNhZmVfVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8oKQoreworICAgIGlmIChwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlczsKKyAgICBpZiAocENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcykKKyAgICAgICAgZGVsZXRlW10gcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrczsKKyAgICBpZiAocFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VHcm91cFN1Ym1pdEluZm86OmluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgd2FpdFNlbWFwaG9yZUNvdW50ID0gaW5fc3RydWN0LT53YWl0U2VtYXBob3JlQ291bnQ7CisgICAgcFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBjb21tYW5kQnVmZmVyQ291bnQgPSBpbl9zdHJ1Y3QtPmNvbW1hbmRCdWZmZXJDb3VudDsKKyAgICBwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzID0gbnVsbHB0cjsKKyAgICBzaWduYWxTZW1hcGhvcmVDb3VudCA9IGluX3N0cnVjdC0+c2lnbmFsU2VtYXBob3JlQ291bnQ7CisgICAgcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+d2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPndhaXRTZW1hcGhvcmVDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MpIHsKKyAgICAgICAgcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPmNvbW1hbmRCdWZmZXJDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzLCAodm9pZCAqKWluX3N0cnVjdC0+cENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPmNvbW1hbmRCdWZmZXJDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+c2lnbmFsU2VtYXBob3JlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUdyb3VwU3VibWl0SW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVDb3VudCA9IHNyYy0+d2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG51bGxwdHI7CisgICAgY29tbWFuZEJ1ZmZlckNvdW50ID0gc3JjLT5jb21tYW5kQnVmZmVyQ291bnQ7CisgICAgcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlQ291bnQgPSBzcmMtPnNpZ25hbFNlbWFwaG9yZUNvdW50OworICAgIHBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMtPndhaXRTZW1hcGhvcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMsICh2b2lkICopc3JjLT5wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLT53YWl0U2VtYXBob3JlQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLT5wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzKSB7CisgICAgICAgIHBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MgPSBuZXcgdWludDMyX3Rbc3JjLT5jb21tYW5kQnVmZmVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcywgKHZvaWQgKilzcmMtPnBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MsIHNpemVvZih1aW50MzJfdCkqc3JjLT5jb21tYW5kQnVmZmVyQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLT5wU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMtPnNpZ25hbFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTaWduYWxTZW1hcGhvcmVEZXZpY2VJbmRpY2VzLCAodm9pZCAqKXNyYy0+cFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLT5zaWduYWxTZW1hcGhvcmVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbzo6c2FmZV9Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8oY29uc3QgVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICByZXNvdXJjZURldmljZUluZGV4KGluX3N0cnVjdC0+cmVzb3VyY2VEZXZpY2VJbmRleCksCisgICAgbWVtb3J5RGV2aWNlSW5kZXgoaW5fc3RydWN0LT5tZW1vcnlEZXZpY2VJbmRleCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvOjpzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm86OnNhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVzb3VyY2VEZXZpY2VJbmRleCA9IHNyYy5yZXNvdXJjZURldmljZUluZGV4OworICAgIG1lbW9yeURldmljZUluZGV4ID0gc3JjLm1lbW9yeURldmljZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyYgc2FmZV9Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVzb3VyY2VEZXZpY2VJbmRleCA9IHNyYy5yZXNvdXJjZURldmljZUluZGV4OworICAgIG1lbW9yeURldmljZUluZGV4ID0gc3JjLm1lbW9yeURldmljZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbzo6fnNhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcmVzb3VyY2VEZXZpY2VJbmRleCA9IGluX3N0cnVjdC0+cmVzb3VyY2VEZXZpY2VJbmRleDsKKyAgICBtZW1vcnlEZXZpY2VJbmRleCA9IGluX3N0cnVjdC0+bWVtb3J5RGV2aWNlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHJlc291cmNlRGV2aWNlSW5kZXggPSBzcmMtPnJlc291cmNlRGV2aWNlSW5kZXg7CisgICAgbWVtb3J5RGV2aWNlSW5kZXggPSBzcmMtPm1lbW9yeURldmljZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm86OnNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvKGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGV2aWNlSW5kZXhDb3VudChpbl9zdHJ1Y3QtPmRldmljZUluZGV4Q291bnQpLAorICAgIHBEZXZpY2VJbmRpY2VzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBEZXZpY2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+ZGV2aWNlSW5kZXhDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGV2aWNlSW5kaWNlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEZXZpY2VJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+ZGV2aWNlSW5kZXhDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbzo6c2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcERldmljZUluZGljZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjpzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyhjb25zdCBzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRldmljZUluZGV4Q291bnQgPSBzcmMuZGV2aWNlSW5kZXhDb3VudDsKKyAgICBwRGV2aWNlSW5kaWNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wRGV2aWNlSW5kaWNlcykgeworICAgICAgICBwRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMuZGV2aWNlSW5kZXhDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGV2aWNlSW5kaWNlcywgKHZvaWQgKilzcmMucERldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLmRldmljZUluZGV4Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8mIHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocERldmljZUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEZXZpY2VJbmRpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGV2aWNlSW5kZXhDb3VudCA9IHNyYy5kZXZpY2VJbmRleENvdW50OworICAgIHBEZXZpY2VJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBEZXZpY2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKXNyYy5wRGV2aWNlSW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuZGV2aWNlSW5kZXhDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbzo6fnNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvKCkKK3sKKyAgICBpZiAocERldmljZUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEZXZpY2VJbmRpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkZXZpY2VJbmRleENvdW50ID0gaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50OworICAgIHBEZXZpY2VJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cERldmljZUluZGljZXMpIHsKKyAgICAgICAgcERldmljZUluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cERldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGV2aWNlSW5kZXhDb3VudCA9IHNyYy0+ZGV2aWNlSW5kZXhDb3VudDsKKyAgICBwRGV2aWNlSW5kaWNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBEZXZpY2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy0+ZGV2aWNlSW5kZXhDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGV2aWNlSW5kaWNlcywgKHZvaWQgKilzcmMtPnBEZXZpY2VJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy0+ZGV2aWNlSW5kZXhDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjpzYWZlX1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvKGNvbnN0IFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkZXZpY2VJbmRleENvdW50KGluX3N0cnVjdC0+ZGV2aWNlSW5kZXhDb3VudCksCisgICAgcERldmljZUluZGljZXMobnVsbHB0ciksCisgICAgc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudChpbl9zdHJ1Y3QtPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQpLAorICAgIHBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cERldmljZUluZGljZXMpIHsKKyAgICAgICAgcERldmljZUluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cERldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucykgeworICAgICAgICBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zID0gbmV3IFZrUmVjdDJEW2luX3N0cnVjdC0+c3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucywgc2l6ZW9mKFZrUmVjdDJEKSppbl9zdHJ1Y3QtPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzo6c2FmZV9Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwRGV2aWNlSW5kaWNlcyhudWxscHRyKSwKKyAgICBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zKG51bGxwdHIpCit7fQorCitzYWZlX1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjpzYWZlX1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvKGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZXZpY2VJbmRleENvdW50ID0gc3JjLmRldmljZUluZGV4Q291bnQ7CisgICAgcERldmljZUluZGljZXMgPSBudWxscHRyOworICAgIHNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQgPSBzcmMuc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudDsKKyAgICBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBEZXZpY2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKXNyYy5wRGV2aWNlSW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuZGV2aWNlSW5kZXhDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucykgeworICAgICAgICBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zID0gbmV3IFZrUmVjdDJEW3NyYy5zcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMsICh2b2lkICopc3JjLnBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMsIHNpemVvZihWa1JlY3QyRCkqc3JjLnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyYgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocERldmljZUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEZXZpY2VJbmRpY2VzOworICAgIGlmIChwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zKQorICAgICAgICBkZWxldGVbXSBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGV2aWNlSW5kZXhDb3VudCA9IHNyYy5kZXZpY2VJbmRleENvdW50OworICAgIHBEZXZpY2VJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50ID0gc3JjLnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQ7CisgICAgcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wRGV2aWNlSW5kaWNlcykgeworICAgICAgICBwRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMuZGV2aWNlSW5kZXhDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGV2aWNlSW5kaWNlcywgKHZvaWQgKilzcmMucERldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLmRldmljZUluZGV4Q291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMpIHsKKyAgICAgICAgcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyA9IG5ldyBWa1JlY3QyRFtzcmMuc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLCAodm9pZCAqKXNyYy5wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLCBzaXplb2YoVmtSZWN0MkQpKnNyYy5zcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm86On5zYWZlX1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvKCkKK3sKKyAgICBpZiAocERldmljZUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEZXZpY2VJbmRpY2VzOworICAgIGlmIChwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zKQorICAgICAgICBkZWxldGVbXSBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm86OmluaXRpYWxpemUoY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGV2aWNlSW5kZXhDb3VudCA9IGluX3N0cnVjdC0+ZGV2aWNlSW5kZXhDb3VudDsKKyAgICBwRGV2aWNlSW5kaWNlcyA9IG51bGxwdHI7CisgICAgc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCA9IGluX3N0cnVjdC0+c3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudDsKKyAgICBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cERldmljZUluZGljZXMpIHsKKyAgICAgICAgcERldmljZUluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cERldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucykgeworICAgICAgICBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zID0gbmV3IFZrUmVjdDJEW2luX3N0cnVjdC0+c3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucywgc2l6ZW9mKFZrUmVjdDJEKSppbl9zdHJ1Y3QtPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGV2aWNlSW5kZXhDb3VudCA9IHNyYy0+ZGV2aWNlSW5kZXhDb3VudDsKKyAgICBwRGV2aWNlSW5kaWNlcyA9IG51bGxwdHI7CisgICAgc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCA9IHNyYy0+c3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudDsKKyAgICBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cERldmljZUluZGljZXMpIHsKKyAgICAgICAgcERldmljZUluZGljZXMgPSBuZXcgdWludDMyX3Rbc3JjLT5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKXNyYy0+cERldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLT5kZXZpY2VJbmRleENvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy0+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucykgeworICAgICAgICBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zID0gbmV3IFZrUmVjdDJEW3NyYy0+c3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLCAodm9pZCAqKXNyYy0+cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucywgc2l6ZW9mKFZrUmVjdDJEKSpzcmMtPnNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMoY29uc3QgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcGh5c2ljYWxEZXZpY2VDb3VudChpbl9zdHJ1Y3QtPnBoeXNpY2FsRGV2aWNlQ291bnQpLAorICAgIHN1YnNldEFsbG9jYXRpb24oaW5fc3RydWN0LT5zdWJzZXRBbGxvY2F0aW9uKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFOyArK2kpIHsKKyAgICAgICAgcGh5c2ljYWxEZXZpY2VzW2ldID0gaW5fc3RydWN0LT5waHlzaWNhbERldmljZXNbaV07CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGh5c2ljYWxEZXZpY2VDb3VudCA9IHNyYy5waHlzaWNhbERldmljZUNvdW50OworICAgIHN1YnNldEFsbG9jYXRpb24gPSBzcmMuc3Vic2V0QWxsb2NhdGlvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFOyArK2kpIHsKKyAgICAgICAgcGh5c2ljYWxEZXZpY2VzW2ldID0gc3JjLnBoeXNpY2FsRGV2aWNlc1tpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwaHlzaWNhbERldmljZUNvdW50ID0gc3JjLnBoeXNpY2FsRGV2aWNlQ291bnQ7CisgICAgc3Vic2V0QWxsb2NhdGlvbiA9IHNyYy5zdWJzZXRBbGxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVWSUNFX0dST1VQX1NJWkU7ICsraSkgeworICAgICAgICBwaHlzaWNhbERldmljZXNbaV0gPSBzcmMucGh5c2ljYWxEZXZpY2VzW2ldOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwaHlzaWNhbERldmljZUNvdW50ID0gaW5fc3RydWN0LT5waHlzaWNhbERldmljZUNvdW50OworICAgIHN1YnNldEFsbG9jYXRpb24gPSBpbl9zdHJ1Y3QtPnN1YnNldEFsbG9jYXRpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVWSUNFX0dST1VQX1NJWkU7ICsraSkgeworICAgICAgICBwaHlzaWNhbERldmljZXNbaV0gPSBpbl9zdHJ1Y3QtPnBoeXNpY2FsRGV2aWNlc1tpXTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwaHlzaWNhbERldmljZUNvdW50ID0gc3JjLT5waHlzaWNhbERldmljZUNvdW50OworICAgIHN1YnNldEFsbG9jYXRpb24gPSBzcmMtPnN1YnNldEFsbG9jYXRpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVWSUNFX0dST1VQX1NJWkU7ICsraSkgeworICAgICAgICBwaHlzaWNhbERldmljZXNbaV0gPSBzcmMtPnBoeXNpY2FsRGV2aWNlc1tpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm86OnNhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8oY29uc3QgVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBoeXNpY2FsRGV2aWNlQ291bnQoaW5fc3RydWN0LT5waHlzaWNhbERldmljZUNvdW50KSwKKyAgICBwUGh5c2ljYWxEZXZpY2VzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBQaHlzaWNhbERldmljZXMpIHsKKyAgICAgICAgcFBoeXNpY2FsRGV2aWNlcyA9IG5ldyBWa1BoeXNpY2FsRGV2aWNlW2luX3N0cnVjdC0+cGh5c2ljYWxEZXZpY2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUGh5c2ljYWxEZXZpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cFBoeXNpY2FsRGV2aWNlcywgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpKmluX3N0cnVjdC0+cGh5c2ljYWxEZXZpY2VDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvOjpzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBQaHlzaWNhbERldmljZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm86OnNhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBoeXNpY2FsRGV2aWNlQ291bnQgPSBzcmMucGh5c2ljYWxEZXZpY2VDb3VudDsKKyAgICBwUGh5c2ljYWxEZXZpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBQaHlzaWNhbERldmljZXMpIHsKKyAgICAgICAgcFBoeXNpY2FsRGV2aWNlcyA9IG5ldyBWa1BoeXNpY2FsRGV2aWNlW3NyYy5waHlzaWNhbERldmljZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQaHlzaWNhbERldmljZXMsICh2b2lkICopc3JjLnBQaHlzaWNhbERldmljZXMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlKSpzcmMucGh5c2ljYWxEZXZpY2VDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvJiBzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwUGh5c2ljYWxEZXZpY2VzKQorICAgICAgICBkZWxldGVbXSBwUGh5c2ljYWxEZXZpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGh5c2ljYWxEZXZpY2VDb3VudCA9IHNyYy5waHlzaWNhbERldmljZUNvdW50OworICAgIHBQaHlzaWNhbERldmljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFBoeXNpY2FsRGV2aWNlcykgeworICAgICAgICBwUGh5c2ljYWxEZXZpY2VzID0gbmV3IFZrUGh5c2ljYWxEZXZpY2Vbc3JjLnBoeXNpY2FsRGV2aWNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBoeXNpY2FsRGV2aWNlcywgKHZvaWQgKilzcmMucFBoeXNpY2FsRGV2aWNlcywgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpKnNyYy5waHlzaWNhbERldmljZUNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm86On5zYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocFBoeXNpY2FsRGV2aWNlcykKKyAgICAgICAgZGVsZXRlW10gcFBoeXNpY2FsRGV2aWNlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHBoeXNpY2FsRGV2aWNlQ291bnQgPSBpbl9zdHJ1Y3QtPnBoeXNpY2FsRGV2aWNlQ291bnQ7CisgICAgcFBoeXNpY2FsRGV2aWNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBQaHlzaWNhbERldmljZXMpIHsKKyAgICAgICAgcFBoeXNpY2FsRGV2aWNlcyA9IG5ldyBWa1BoeXNpY2FsRGV2aWNlW2luX3N0cnVjdC0+cGh5c2ljYWxEZXZpY2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUGh5c2ljYWxEZXZpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cFBoeXNpY2FsRGV2aWNlcywgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpKmluX3N0cnVjdC0+cGh5c2ljYWxEZXZpY2VDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwaHlzaWNhbERldmljZUNvdW50ID0gc3JjLT5waHlzaWNhbERldmljZUNvdW50OworICAgIHBQaHlzaWNhbERldmljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wUGh5c2ljYWxEZXZpY2VzKSB7CisgICAgICAgIHBQaHlzaWNhbERldmljZXMgPSBuZXcgVmtQaHlzaWNhbERldmljZVtzcmMtPnBoeXNpY2FsRGV2aWNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBoeXNpY2FsRGV2aWNlcywgKHZvaWQgKilzcmMtPnBQaHlzaWNhbERldmljZXMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlKSpzcmMtPnBoeXNpY2FsRGV2aWNlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yOjpzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgYnVmZmVyKGluX3N0cnVjdC0+YnVmZmVyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yOjpzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjo6c2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKGNvbnN0IHNhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGJ1ZmZlciA9IHNyYy5idWZmZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiYgc2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBidWZmZXIgPSBzcmMuYnVmZmVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6On5zYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjo6aW5pdGlhbGl6ZShjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGJ1ZmZlciA9IGluX3N0cnVjdC0+YnVmZmVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGJ1ZmZlciA9IHNyYy0+YnVmZmVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OnNhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgaW1hZ2UoaW5fc3RydWN0LT5pbWFnZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yOjpzYWZlX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OnNhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKGNvbnN0IHNhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW1hZ2UgPSBzcmMuaW1hZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzYWZlX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbWFnZSA9IHNyYy5pbWFnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6On5zYWZlX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OmluaXRpYWxpemUoY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGltYWdlID0gaW5fc3RydWN0LT5pbWFnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW1hZ2UgPSBzcmMtPmltYWdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OnNhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgaW1hZ2UoaW5fc3RydWN0LT5pbWFnZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yOjpzYWZlX1ZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OnNhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKGNvbnN0IHNhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW1hZ2UgPSBzcmMuaW1hZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzYWZlX1ZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbWFnZSA9IHNyYy5pbWFnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6On5zYWZlX1ZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OmluaXRpYWxpemUoY29uc3QgVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGltYWdlID0gaW5fc3RydWN0LT5pbWFnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW1hZ2UgPSBzcmMtPmltYWdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czI6OnNhZmVfVmtNZW1vcnlSZXF1aXJlbWVudHMyKGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzMiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWVtb3J5UmVxdWlyZW1lbnRzKGluX3N0cnVjdC0+bWVtb3J5UmVxdWlyZW1lbnRzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czI6OnNhZmVfVmtNZW1vcnlSZXF1aXJlbWVudHMyKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrTWVtb3J5UmVxdWlyZW1lbnRzMjo6c2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czIoY29uc3Qgc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnlSZXF1aXJlbWVudHMgPSBzcmMubWVtb3J5UmVxdWlyZW1lbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5UmVxdWlyZW1lbnRzMiYgc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5UmVxdWlyZW1lbnRzMiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5UmVxdWlyZW1lbnRzID0gc3JjLm1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czI6On5zYWZlX1ZrTWVtb3J5UmVxdWlyZW1lbnRzMigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czI6OmluaXRpYWxpemUoY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1lbW9yeVJlcXVpcmVtZW50cyA9IGluX3N0cnVjdC0+bWVtb3J5UmVxdWlyZW1lbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWVtb3J5UmVxdWlyZW1lbnRzMjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5UmVxdWlyZW1lbnRzMiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtZW1vcnlSZXF1aXJlbWVudHMgPSBzcmMtPm1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI6OnNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoY29uc3QgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1lbW9yeVJlcXVpcmVtZW50cyhpbl9zdHJ1Y3QtPm1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI6OnNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI6OnNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1lbW9yeVJlcXVpcmVtZW50cyA9IHNyYy5tZW1vcnlSZXF1aXJlbWVudHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czImIHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnlSZXF1aXJlbWVudHMgPSBzcmMubWVtb3J5UmVxdWlyZW1lbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyOjp+c2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjo6aW5pdGlhbGl6ZShjb25zdCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtZW1vcnlSZXF1aXJlbWVudHMgPSBpbl9zdHJ1Y3QtPm1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1lbW9yeVJlcXVpcmVtZW50cyA9IHNyYy0+bWVtb3J5UmVxdWlyZW1lbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoY29uc3QgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmVhdHVyZXMoaW5fc3RydWN0LT5mZWF0dXJlcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI6OnNhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmZWF0dXJlcyA9IHNyYy5mZWF0dXJlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZlYXR1cmVzID0gc3JjLmZlYXR1cmVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZlYXR1cmVzID0gaW5fc3RydWN0LT5mZWF0dXJlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmZWF0dXJlcyA9IHNyYy0+ZmVhdHVyZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoY29uc3QgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBwcm9wZXJ0aWVzKGluX3N0cnVjdC0+cHJvcGVydGllcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczI6OnNhZmVfVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcHJvcGVydGllcyA9IHNyYy5wcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcHJvcGVydGllcyA9IHNyYy5wcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMjo6fnNhZmVfVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcHJvcGVydGllcyA9IGluX3N0cnVjdC0+cHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcHJvcGVydGllcyA9IHNyYy0+cHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtGb3JtYXRQcm9wZXJ0aWVzMjo6c2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyKGNvbnN0IFZrRm9ybWF0UHJvcGVydGllczIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZvcm1hdFByb3BlcnRpZXMoaW5fc3RydWN0LT5mb3JtYXRQcm9wZXJ0aWVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyOjpzYWZlX1ZrRm9ybWF0UHJvcGVydGllczIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtGb3JtYXRQcm9wZXJ0aWVzMjo6c2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyKGNvbnN0IHNhZmVfVmtGb3JtYXRQcm9wZXJ0aWVzMiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZvcm1hdFByb3BlcnRpZXMgPSBzcmMuZm9ybWF0UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyJiBzYWZlX1ZrRm9ybWF0UHJvcGVydGllczI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRm9ybWF0UHJvcGVydGllczImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZvcm1hdFByb3BlcnRpZXMgPSBzcmMuZm9ybWF0UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyOjp+c2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRm9ybWF0UHJvcGVydGllczI6OmluaXRpYWxpemUoY29uc3QgVmtGb3JtYXRQcm9wZXJ0aWVzMiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmb3JtYXRQcm9wZXJ0aWVzID0gaW5fc3RydWN0LT5mb3JtYXRQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRm9ybWF0UHJvcGVydGllczI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZvcm1hdFByb3BlcnRpZXMgPSBzcmMtPmZvcm1hdFByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjo6c2FmZV9Wa0ltYWdlRm9ybWF0UHJvcGVydGllczIoY29uc3QgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBpbWFnZUZvcm1hdFByb3BlcnRpZXMoaW5fc3RydWN0LT5pbWFnZUZvcm1hdFByb3BlcnRpZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjo6c2FmZV9Wa0ltYWdlRm9ybWF0UHJvcGVydGllczIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyOjpzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihjb25zdCBzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGltYWdlRm9ybWF0UHJvcGVydGllcyA9IHNyYy5pbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyJiBzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbWFnZUZvcm1hdFByb3BlcnRpZXMgPSBzcmMuaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjo6fnNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjo6aW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzID0gaW5fc3RydWN0LT5pbWFnZUZvcm1hdFByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGltYWdlRm9ybWF0UHJvcGVydGllcyA9IHNyYy0+aW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMihjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZm9ybWF0KGluX3N0cnVjdC0+Zm9ybWF0KSwKKyAgICB0eXBlKGluX3N0cnVjdC0+dHlwZSksCisgICAgdGlsaW5nKGluX3N0cnVjdC0+dGlsaW5nKSwKKyAgICB1c2FnZShpbl9zdHJ1Y3QtPnVzYWdlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZm9ybWF0ID0gc3JjLmZvcm1hdDsKKyAgICB0eXBlID0gc3JjLnR5cGU7CisgICAgdGlsaW5nID0gc3JjLnRpbGluZzsKKyAgICB1c2FnZSA9IHNyYy51c2FnZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZvcm1hdCA9IHNyYy5mb3JtYXQ7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIHRpbGluZyA9IHNyYy50aWxpbmc7CisgICAgdXNhZ2UgPSBzcmMudXNhZ2U7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZvcm1hdCA9IGluX3N0cnVjdC0+Zm9ybWF0OworICAgIHR5cGUgPSBpbl9zdHJ1Y3QtPnR5cGU7CisgICAgdGlsaW5nID0gaW5fc3RydWN0LT50aWxpbmc7CisgICAgdXNhZ2UgPSBpbl9zdHJ1Y3QtPnVzYWdlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZvcm1hdCA9IHNyYy0+Zm9ybWF0OworICAgIHR5cGUgPSBzcmMtPnR5cGU7CisgICAgdGlsaW5nID0gc3JjLT50aWxpbmc7CisgICAgdXNhZ2UgPSBzcmMtPnVzYWdlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyOjpzYWZlX1ZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMihjb25zdCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllcyhpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5UHJvcGVydGllcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyOjpzYWZlX1ZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczI6OnNhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKGNvbnN0IHNhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcXVldWVGYW1pbHlQcm9wZXJ0aWVzID0gc3JjLnF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczImIHNhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHF1ZXVlRmFtaWx5UHJvcGVydGllcyA9IHNyYy5xdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyOjp+c2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyOjppbml0aWFsaXplKGNvbnN0IFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBxdWV1ZUZhbWlseVByb3BlcnRpZXMgPSBpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcXVldWVGYW1pbHlQcm9wZXJ0aWVzID0gc3JjLT5xdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoY29uc3QgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtZW1vcnlQcm9wZXJ0aWVzKGluX3N0cnVjdC0+bWVtb3J5UHJvcGVydGllcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI6OnNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5UHJvcGVydGllcyA9IHNyYy5tZW1vcnlQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5UHJvcGVydGllcyA9IHNyYy5tZW1vcnlQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjo6fnNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWVtb3J5UHJvcGVydGllcyA9IGluX3N0cnVjdC0+bWVtb3J5UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWVtb3J5UHJvcGVydGllcyA9IHNyYy0+bWVtb3J5UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOjpzYWZlX1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihjb25zdCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHByb3BlcnRpZXMoaW5fc3RydWN0LT5wcm9wZXJ0aWVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI6OnNhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjo6c2FmZV9Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcm9wZXJ0aWVzID0gc3JjLnByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyJiBzYWZlX1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcm9wZXJ0aWVzID0gc3JjLnByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOjp+c2FmZV9Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyOjppbml0aWFsaXplKGNvbnN0IFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwcm9wZXJ0aWVzID0gaW5fc3RydWN0LT5wcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwcm9wZXJ0aWVzID0gc3JjLT5wcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMihjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZm9ybWF0KGluX3N0cnVjdC0+Zm9ybWF0KSwKKyAgICB0eXBlKGluX3N0cnVjdC0+dHlwZSksCisgICAgc2FtcGxlcyhpbl9zdHJ1Y3QtPnNhbXBsZXMpLAorICAgIHVzYWdlKGluX3N0cnVjdC0+dXNhZ2UpLAorICAgIHRpbGluZyhpbl9zdHJ1Y3QtPnRpbGluZykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzI6OnNhZmVfVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzI6OnNhZmVfVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZvcm1hdCA9IHNyYy5mb3JtYXQ7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIHNhbXBsZXMgPSBzcmMuc2FtcGxlczsKKyAgICB1c2FnZSA9IHNyYy51c2FnZTsKKyAgICB0aWxpbmcgPSBzcmMudGlsaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZm9ybWF0ID0gc3JjLmZvcm1hdDsKKyAgICB0eXBlID0gc3JjLnR5cGU7CisgICAgc2FtcGxlcyA9IHNyYy5zYW1wbGVzOworICAgIHVzYWdlID0gc3JjLnVzYWdlOworICAgIHRpbGluZyA9IHNyYy50aWxpbmc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZvcm1hdCA9IGluX3N0cnVjdC0+Zm9ybWF0OworICAgIHR5cGUgPSBpbl9zdHJ1Y3QtPnR5cGU7CisgICAgc2FtcGxlcyA9IGluX3N0cnVjdC0+c2FtcGxlczsKKyAgICB1c2FnZSA9IGluX3N0cnVjdC0+dXNhZ2U7CisgICAgdGlsaW5nID0gaW5fc3RydWN0LT50aWxpbmc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmb3JtYXQgPSBzcmMtPmZvcm1hdDsKKyAgICB0eXBlID0gc3JjLT50eXBlOworICAgIHNhbXBsZXMgPSBzcmMtPnNhbXBsZXM7CisgICAgdXNhZ2UgPSBzcmMtPnVzYWdlOworICAgIHRpbGluZyA9IHNyYy0+dGlsaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcG9pbnRDbGlwcGluZ0JlaGF2aW9yKGluX3N0cnVjdC0+cG9pbnRDbGlwcGluZ0JlaGF2aW9yKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwb2ludENsaXBwaW5nQmVoYXZpb3IgPSBzcmMucG9pbnRDbGlwcGluZ0JlaGF2aW9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcG9pbnRDbGlwcGluZ0JlaGF2aW9yID0gc3JjLnBvaW50Q2xpcHBpbmdCZWhhdmlvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXM6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHBvaW50Q2xpcHBpbmdCZWhhdmlvciA9IGluX3N0cnVjdC0+cG9pbnRDbGlwcGluZ0JlaGF2aW9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllczo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwb2ludENsaXBwaW5nQmVoYXZpb3IgPSBzcmMtPnBvaW50Q2xpcHBpbmdCZWhhdmlvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbzo6c2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvKGNvbnN0IFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGFzcGVjdFJlZmVyZW5jZUNvdW50KGluX3N0cnVjdC0+YXNwZWN0UmVmZXJlbmNlQ291bnQpLAorICAgIHBBc3BlY3RSZWZlcmVuY2VzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBBc3BlY3RSZWZlcmVuY2VzKSB7CisgICAgICAgIHBBc3BlY3RSZWZlcmVuY2VzID0gbmV3IFZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlW2luX3N0cnVjdC0+YXNwZWN0UmVmZXJlbmNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFzcGVjdFJlZmVyZW5jZXMsICh2b2lkICopaW5fc3RydWN0LT5wQXNwZWN0UmVmZXJlbmNlcywgc2l6ZW9mKFZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlKSppbl9zdHJ1Y3QtPmFzcGVjdFJlZmVyZW5jZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbzo6c2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBBc3BlY3RSZWZlcmVuY2VzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm86OnNhZmVfVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhc3BlY3RSZWZlcmVuY2VDb3VudCA9IHNyYy5hc3BlY3RSZWZlcmVuY2VDb3VudDsKKyAgICBwQXNwZWN0UmVmZXJlbmNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQXNwZWN0UmVmZXJlbmNlcykgeworICAgICAgICBwQXNwZWN0UmVmZXJlbmNlcyA9IG5ldyBWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZVtzcmMuYXNwZWN0UmVmZXJlbmNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFzcGVjdFJlZmVyZW5jZXMsICh2b2lkICopc3JjLnBBc3BlY3RSZWZlcmVuY2VzLCBzaXplb2YoVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UpKnNyYy5hc3BlY3RSZWZlcmVuY2VDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8mIHNhZmVfVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwQXNwZWN0UmVmZXJlbmNlcykKKyAgICAgICAgZGVsZXRlW10gcEFzcGVjdFJlZmVyZW5jZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhc3BlY3RSZWZlcmVuY2VDb3VudCA9IHNyYy5hc3BlY3RSZWZlcmVuY2VDb3VudDsKKyAgICBwQXNwZWN0UmVmZXJlbmNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQXNwZWN0UmVmZXJlbmNlcykgeworICAgICAgICBwQXNwZWN0UmVmZXJlbmNlcyA9IG5ldyBWa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZVtzcmMuYXNwZWN0UmVmZXJlbmNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFzcGVjdFJlZmVyZW5jZXMsICh2b2lkICopc3JjLnBBc3BlY3RSZWZlcmVuY2VzLCBzaXplb2YoVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UpKnNyYy5hc3BlY3RSZWZlcmVuY2VDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm86On5zYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8oKQoreworICAgIGlmIChwQXNwZWN0UmVmZXJlbmNlcykKKyAgICAgICAgZGVsZXRlW10gcEFzcGVjdFJlZmVyZW5jZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYXNwZWN0UmVmZXJlbmNlQ291bnQgPSBpbl9zdHJ1Y3QtPmFzcGVjdFJlZmVyZW5jZUNvdW50OworICAgIHBBc3BlY3RSZWZlcmVuY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cEFzcGVjdFJlZmVyZW5jZXMpIHsKKyAgICAgICAgcEFzcGVjdFJlZmVyZW5jZXMgPSBuZXcgVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2VbaW5fc3RydWN0LT5hc3BlY3RSZWZlcmVuY2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQXNwZWN0UmVmZXJlbmNlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBBc3BlY3RSZWZlcmVuY2VzLCBzaXplb2YoVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UpKmluX3N0cnVjdC0+YXNwZWN0UmVmZXJlbmNlQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGFzcGVjdFJlZmVyZW5jZUNvdW50ID0gc3JjLT5hc3BlY3RSZWZlcmVuY2VDb3VudDsKKyAgICBwQXNwZWN0UmVmZXJlbmNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBBc3BlY3RSZWZlcmVuY2VzKSB7CisgICAgICAgIHBBc3BlY3RSZWZlcmVuY2VzID0gbmV3IFZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlW3NyYy0+YXNwZWN0UmVmZXJlbmNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFzcGVjdFJlZmVyZW5jZXMsICh2b2lkICopc3JjLT5wQXNwZWN0UmVmZXJlbmNlcywgc2l6ZW9mKFZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlKSpzcmMtPmFzcGVjdFJlZmVyZW5jZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm86OnNhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8oY29uc3QgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHVzYWdlKGluX3N0cnVjdC0+dXNhZ2UpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvOjpzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvOjpzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB1c2FnZSA9IHNyYy51c2FnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyYgc2FmZV9Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHVzYWdlID0gc3JjLnVzYWdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvOjp+c2FmZV9Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB1c2FnZSA9IGluX3N0cnVjdC0+dXNhZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICB1c2FnZSA9IHNyYy0+dXNhZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkb21haW5PcmlnaW4oaW5fc3RydWN0LT5kb21haW5PcmlnaW4pCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZG9tYWluT3JpZ2luID0gc3JjLmRvbWFpbk9yaWdpbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvJiBzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRvbWFpbk9yaWdpbiA9IHNyYy5kb21haW5PcmlnaW47CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbzo6fnNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZG9tYWluT3JpZ2luID0gaW5fc3RydWN0LT5kb21haW5PcmlnaW47CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZG9tYWluT3JpZ2luID0gc3JjLT5kb21haW5PcmlnaW47CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm86OnNhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyhjb25zdCBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzdWJwYXNzQ291bnQoaW5fc3RydWN0LT5zdWJwYXNzQ291bnQpLAorICAgIHBWaWV3TWFza3MobnVsbHB0ciksCisgICAgZGVwZW5kZW5jeUNvdW50KGluX3N0cnVjdC0+ZGVwZW5kZW5jeUNvdW50KSwKKyAgICBwVmlld09mZnNldHMobnVsbHB0ciksCisgICAgY29ycmVsYXRpb25NYXNrQ291bnQoaW5fc3RydWN0LT5jb3JyZWxhdGlvbk1hc2tDb3VudCksCisgICAgcENvcnJlbGF0aW9uTWFza3MobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFZpZXdNYXNrcykgeworICAgICAgICBwVmlld01hc2tzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+c3VicGFzc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3TWFza3MsICh2b2lkICopaW5fc3RydWN0LT5wVmlld01hc2tzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+c3VicGFzc0NvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFZpZXdPZmZzZXRzKSB7CisgICAgICAgIHBWaWV3T2Zmc2V0cyA9IG5ldyBpbnQzMl90W2luX3N0cnVjdC0+ZGVwZW5kZW5jeUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3T2Zmc2V0cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWaWV3T2Zmc2V0cywgc2l6ZW9mKGludDMyX3QpKmluX3N0cnVjdC0+ZGVwZW5kZW5jeUNvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cENvcnJlbGF0aW9uTWFza3MpIHsKKyAgICAgICAgcENvcnJlbGF0aW9uTWFza3MgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5jb3JyZWxhdGlvbk1hc2tDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ29ycmVsYXRpb25NYXNrcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBDb3JyZWxhdGlvbk1hc2tzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+Y29ycmVsYXRpb25NYXNrQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvOjpzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFZpZXdNYXNrcyhudWxscHRyKSwKKyAgICBwVmlld09mZnNldHMobnVsbHB0ciksCisgICAgcENvcnJlbGF0aW9uTWFza3MobnVsbHB0cikKK3t9CisKK3NhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbzo6c2FmZV9Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN1YnBhc3NDb3VudCA9IHNyYy5zdWJwYXNzQ291bnQ7CisgICAgcFZpZXdNYXNrcyA9IG51bGxwdHI7CisgICAgZGVwZW5kZW5jeUNvdW50ID0gc3JjLmRlcGVuZGVuY3lDb3VudDsKKyAgICBwVmlld09mZnNldHMgPSBudWxscHRyOworICAgIGNvcnJlbGF0aW9uTWFza0NvdW50ID0gc3JjLmNvcnJlbGF0aW9uTWFza0NvdW50OworICAgIHBDb3JyZWxhdGlvbk1hc2tzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBWaWV3TWFza3MpIHsKKyAgICAgICAgcFZpZXdNYXNrcyA9IG5ldyB1aW50MzJfdFtzcmMuc3VicGFzc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3TWFza3MsICh2b2lkICopc3JjLnBWaWV3TWFza3MsIHNpemVvZih1aW50MzJfdCkqc3JjLnN1YnBhc3NDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucFZpZXdPZmZzZXRzKSB7CisgICAgICAgIHBWaWV3T2Zmc2V0cyA9IG5ldyBpbnQzMl90W3NyYy5kZXBlbmRlbmN5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdPZmZzZXRzLCAodm9pZCAqKXNyYy5wVmlld09mZnNldHMsIHNpemVvZihpbnQzMl90KSpzcmMuZGVwZW5kZW5jeUNvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wQ29ycmVsYXRpb25NYXNrcykgeworICAgICAgICBwQ29ycmVsYXRpb25NYXNrcyA9IG5ldyB1aW50MzJfdFtzcmMuY29ycmVsYXRpb25NYXNrQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvcnJlbGF0aW9uTWFza3MsICh2b2lkICopc3JjLnBDb3JyZWxhdGlvbk1hc2tzLCBzaXplb2YodWludDMyX3QpKnNyYy5jb3JyZWxhdGlvbk1hc2tDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8mIHNhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwVmlld01hc2tzKQorICAgICAgICBkZWxldGVbXSBwVmlld01hc2tzOworICAgIGlmIChwVmlld09mZnNldHMpCisgICAgICAgIGRlbGV0ZVtdIHBWaWV3T2Zmc2V0czsKKyAgICBpZiAocENvcnJlbGF0aW9uTWFza3MpCisgICAgICAgIGRlbGV0ZVtdIHBDb3JyZWxhdGlvbk1hc2tzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3VicGFzc0NvdW50ID0gc3JjLnN1YnBhc3NDb3VudDsKKyAgICBwVmlld01hc2tzID0gbnVsbHB0cjsKKyAgICBkZXBlbmRlbmN5Q291bnQgPSBzcmMuZGVwZW5kZW5jeUNvdW50OworICAgIHBWaWV3T2Zmc2V0cyA9IG51bGxwdHI7CisgICAgY29ycmVsYXRpb25NYXNrQ291bnQgPSBzcmMuY29ycmVsYXRpb25NYXNrQ291bnQ7CisgICAgcENvcnJlbGF0aW9uTWFza3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFZpZXdNYXNrcykgeworICAgICAgICBwVmlld01hc2tzID0gbmV3IHVpbnQzMl90W3NyYy5zdWJwYXNzQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdNYXNrcywgKHZvaWQgKilzcmMucFZpZXdNYXNrcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuc3VicGFzc0NvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wVmlld09mZnNldHMpIHsKKyAgICAgICAgcFZpZXdPZmZzZXRzID0gbmV3IGludDMyX3Rbc3JjLmRlcGVuZGVuY3lDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld09mZnNldHMsICh2b2lkICopc3JjLnBWaWV3T2Zmc2V0cywgc2l6ZW9mKGludDMyX3QpKnNyYy5kZXBlbmRlbmN5Q291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBDb3JyZWxhdGlvbk1hc2tzKSB7CisgICAgICAgIHBDb3JyZWxhdGlvbk1hc2tzID0gbmV3IHVpbnQzMl90W3NyYy5jb3JyZWxhdGlvbk1hc2tDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ29ycmVsYXRpb25NYXNrcywgKHZvaWQgKilzcmMucENvcnJlbGF0aW9uTWFza3MsIHNpemVvZih1aW50MzJfdCkqc3JjLmNvcnJlbGF0aW9uTWFza0NvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbzo6fnNhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBWaWV3TWFza3MpCisgICAgICAgIGRlbGV0ZVtdIHBWaWV3TWFza3M7CisgICAgaWYgKHBWaWV3T2Zmc2V0cykKKyAgICAgICAgZGVsZXRlW10gcFZpZXdPZmZzZXRzOworICAgIGlmIChwQ29ycmVsYXRpb25NYXNrcykKKyAgICAgICAgZGVsZXRlW10gcENvcnJlbGF0aW9uTWFza3M7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3VicGFzc0NvdW50ID0gaW5fc3RydWN0LT5zdWJwYXNzQ291bnQ7CisgICAgcFZpZXdNYXNrcyA9IG51bGxwdHI7CisgICAgZGVwZW5kZW5jeUNvdW50ID0gaW5fc3RydWN0LT5kZXBlbmRlbmN5Q291bnQ7CisgICAgcFZpZXdPZmZzZXRzID0gbnVsbHB0cjsKKyAgICBjb3JyZWxhdGlvbk1hc2tDb3VudCA9IGluX3N0cnVjdC0+Y29ycmVsYXRpb25NYXNrQ291bnQ7CisgICAgcENvcnJlbGF0aW9uTWFza3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wVmlld01hc2tzKSB7CisgICAgICAgIHBWaWV3TWFza3MgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5zdWJwYXNzQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdNYXNrcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWaWV3TWFza3MsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5zdWJwYXNzQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wVmlld09mZnNldHMpIHsKKyAgICAgICAgcFZpZXdPZmZzZXRzID0gbmV3IGludDMyX3RbaW5fc3RydWN0LT5kZXBlbmRlbmN5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdPZmZzZXRzLCAodm9pZCAqKWluX3N0cnVjdC0+cFZpZXdPZmZzZXRzLCBzaXplb2YoaW50MzJfdCkqaW5fc3RydWN0LT5kZXBlbmRlbmN5Q291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wQ29ycmVsYXRpb25NYXNrcykgeworICAgICAgICBwQ29ycmVsYXRpb25NYXNrcyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPmNvcnJlbGF0aW9uTWFza0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb3JyZWxhdGlvbk1hc2tzLCAodm9pZCAqKWluX3N0cnVjdC0+cENvcnJlbGF0aW9uTWFza3MsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5jb3JyZWxhdGlvbk1hc2tDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3VicGFzc0NvdW50ID0gc3JjLT5zdWJwYXNzQ291bnQ7CisgICAgcFZpZXdNYXNrcyA9IG51bGxwdHI7CisgICAgZGVwZW5kZW5jeUNvdW50ID0gc3JjLT5kZXBlbmRlbmN5Q291bnQ7CisgICAgcFZpZXdPZmZzZXRzID0gbnVsbHB0cjsKKyAgICBjb3JyZWxhdGlvbk1hc2tDb3VudCA9IHNyYy0+Y29ycmVsYXRpb25NYXNrQ291bnQ7CisgICAgcENvcnJlbGF0aW9uTWFza3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wVmlld01hc2tzKSB7CisgICAgICAgIHBWaWV3TWFza3MgPSBuZXcgdWludDMyX3Rbc3JjLT5zdWJwYXNzQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdNYXNrcywgKHZvaWQgKilzcmMtPnBWaWV3TWFza3MsIHNpemVvZih1aW50MzJfdCkqc3JjLT5zdWJwYXNzQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLT5wVmlld09mZnNldHMpIHsKKyAgICAgICAgcFZpZXdPZmZzZXRzID0gbmV3IGludDMyX3Rbc3JjLT5kZXBlbmRlbmN5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdPZmZzZXRzLCAodm9pZCAqKXNyYy0+cFZpZXdPZmZzZXRzLCBzaXplb2YoaW50MzJfdCkqc3JjLT5kZXBlbmRlbmN5Q291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLT5wQ29ycmVsYXRpb25NYXNrcykgeworICAgICAgICBwQ29ycmVsYXRpb25NYXNrcyA9IG5ldyB1aW50MzJfdFtzcmMtPmNvcnJlbGF0aW9uTWFza0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb3JyZWxhdGlvbk1hc2tzLCAodm9pZCAqKXNyYy0+cENvcnJlbGF0aW9uTWFza3MsIHNpemVvZih1aW50MzJfdCkqc3JjLT5jb3JyZWxhdGlvbk1hc2tDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMoY29uc3QgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtdWx0aXZpZXcoaW5fc3RydWN0LT5tdWx0aXZpZXcpLAorICAgIG11bHRpdmlld0dlb21ldHJ5U2hhZGVyKGluX3N0cnVjdC0+bXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIpLAorICAgIG11bHRpdmlld1Rlc3NlbGxhdGlvblNoYWRlcihpbl9zdHJ1Y3QtPm11bHRpdmlld1Rlc3NlbGxhdGlvblNoYWRlcikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbXVsdGl2aWV3ID0gc3JjLm11bHRpdmlldzsKKyAgICBtdWx0aXZpZXdHZW9tZXRyeVNoYWRlciA9IHNyYy5tdWx0aXZpZXdHZW9tZXRyeVNoYWRlcjsKKyAgICBtdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIgPSBzcmMubXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbXVsdGl2aWV3ID0gc3JjLm11bHRpdmlldzsKKyAgICBtdWx0aXZpZXdHZW9tZXRyeVNoYWRlciA9IHNyYy5tdWx0aXZpZXdHZW9tZXRyeVNoYWRlcjsKKyAgICBtdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIgPSBzcmMubXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlczo6fnNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlczo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbXVsdGl2aWV3ID0gaW5fc3RydWN0LT5tdWx0aXZpZXc7CisgICAgbXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIgPSBpbl9zdHJ1Y3QtPm11bHRpdmlld0dlb21ldHJ5U2hhZGVyOworICAgIG11bHRpdmlld1Rlc3NlbGxhdGlvblNoYWRlciA9IGluX3N0cnVjdC0+bXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlczo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtdWx0aXZpZXcgPSBzcmMtPm11bHRpdmlldzsKKyAgICBtdWx0aXZpZXdHZW9tZXRyeVNoYWRlciA9IHNyYy0+bXVsdGl2aWV3R2VvbWV0cnlTaGFkZXI7CisgICAgbXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyID0gc3JjLT5tdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtYXhNdWx0aXZpZXdWaWV3Q291bnQoaW5fc3RydWN0LT5tYXhNdWx0aXZpZXdWaWV3Q291bnQpLAorICAgIG1heE11bHRpdmlld0luc3RhbmNlSW5kZXgoaW5fc3RydWN0LT5tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4TXVsdGl2aWV3Vmlld0NvdW50ID0gc3JjLm1heE11bHRpdmlld1ZpZXdDb3VudDsKKyAgICBtYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4ID0gc3JjLm1heE11bHRpdmlld0luc3RhbmNlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMmIHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXhNdWx0aXZpZXdWaWV3Q291bnQgPSBzcmMubWF4TXVsdGl2aWV3Vmlld0NvdW50OworICAgIG1heE11bHRpdmlld0luc3RhbmNlSW5kZXggPSBzcmMubWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczo6fnNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWF4TXVsdGl2aWV3Vmlld0NvdW50ID0gaW5fc3RydWN0LT5tYXhNdWx0aXZpZXdWaWV3Q291bnQ7CisgICAgbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleCA9IGluX3N0cnVjdC0+bWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1heE11bHRpdmlld1ZpZXdDb3VudCA9IHNyYy0+bWF4TXVsdGl2aWV3Vmlld0NvdW50OworICAgIG1heE11bHRpdmlld0luc3RhbmNlSW5kZXggPSBzcmMtPm1heE11bHRpdmlld0luc3RhbmNlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB2YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlcihpbl9zdHJ1Y3QtPnZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyKSwKKyAgICB2YXJpYWJsZVBvaW50ZXJzKGluX3N0cnVjdC0+dmFyaWFibGVQb2ludGVycykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB2YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlciA9IHNyYy52YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlcjsKKyAgICB2YXJpYWJsZVBvaW50ZXJzID0gc3JjLnZhcmlhYmxlUG9pbnRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB2YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlciA9IHNyYy52YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlcjsKKyAgICB2YXJpYWJsZVBvaW50ZXJzID0gc3JjLnZhcmlhYmxlUG9pbnRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlczo6fnNhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgdmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXIgPSBpbl9zdHJ1Y3QtPnZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyOworICAgIHZhcmlhYmxlUG9pbnRlcnMgPSBpbl9zdHJ1Y3QtPnZhcmlhYmxlUG9pbnRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlczo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgdmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXIgPSBzcmMtPnZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyOworICAgIHZhcmlhYmxlUG9pbnRlcnMgPSBzcmMtPnZhcmlhYmxlUG9pbnRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMoY29uc3QgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBwcm90ZWN0ZWRNZW1vcnkoaW5fc3RydWN0LT5wcm90ZWN0ZWRNZW1vcnkpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHByb3RlY3RlZE1lbW9yeSA9IHNyYy5wcm90ZWN0ZWRNZW1vcnk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlczo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcm90ZWN0ZWRNZW1vcnkgPSBzcmMucHJvdGVjdGVkTWVtb3J5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlczo6fnNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlczo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcHJvdGVjdGVkTWVtb3J5ID0gaW5fc3RydWN0LT5wcm90ZWN0ZWRNZW1vcnk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHByb3RlY3RlZE1lbW9yeSA9IHNyYy0+cHJvdGVjdGVkTWVtb3J5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllczo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcHJvdGVjdGVkTm9GYXVsdChpbl9zdHJ1Y3QtPnByb3RlY3RlZE5vRmF1bHQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcm90ZWN0ZWROb0ZhdWx0ID0gc3JjLnByb3RlY3RlZE5vRmF1bHQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMmIHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcm90ZWN0ZWROb0ZhdWx0ID0gc3JjLnByb3RlY3RlZE5vRmF1bHQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXM6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHByb3RlY3RlZE5vRmF1bHQgPSBpbl9zdHJ1Y3QtPnByb3RlY3RlZE5vRmF1bHQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwcm90ZWN0ZWROb0ZhdWx0ID0gc3JjLT5wcm90ZWN0ZWROb0ZhdWx0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzI6OnNhZmVfVmtEZXZpY2VRdWV1ZUluZm8yKGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgcXVldWVGYW1pbHlJbmRleChpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXgpLAorICAgIHF1ZXVlSW5kZXgoaW5fc3RydWN0LT5xdWV1ZUluZGV4KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzI6OnNhZmVfVmtEZXZpY2VRdWV1ZUluZm8yKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGV2aWNlUXVldWVJbmZvMjo6c2FmZV9Wa0RldmljZVF1ZXVlSW5mbzIoY29uc3Qgc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBxdWV1ZUZhbWlseUluZGV4ID0gc3JjLnF1ZXVlRmFtaWx5SW5kZXg7CisgICAgcXVldWVJbmRleCA9IHNyYy5xdWV1ZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlUXVldWVJbmZvMiYgc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlUXVldWVJbmZvMiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcXVldWVGYW1pbHlJbmRleCA9IHNyYy5xdWV1ZUZhbWlseUluZGV4OworICAgIHF1ZXVlSW5kZXggPSBzcmMucXVldWVJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzI6On5zYWZlX1ZrRGV2aWNlUXVldWVJbmZvMigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzI6OmluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VRdWV1ZUluZm8yKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBxdWV1ZUZhbWlseUluZGV4ID0gaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4OworICAgIHF1ZXVlSW5kZXggPSBpbl9zdHJ1Y3QtPnF1ZXVlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VRdWV1ZUluZm8yOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VRdWV1ZUluZm8yKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBxdWV1ZUZhbWlseUluZGV4ID0gc3JjLT5xdWV1ZUZhbWlseUluZGV4OworICAgIHF1ZXVlSW5kZXggPSBzcmMtPnF1ZXVlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUHJvdGVjdGVkU3VibWl0SW5mbzo6c2FmZV9Wa1Byb3RlY3RlZFN1Ym1pdEluZm8oY29uc3QgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBwcm90ZWN0ZWRTdWJtaXQoaW5fc3RydWN0LT5wcm90ZWN0ZWRTdWJtaXQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUHJvdGVjdGVkU3VibWl0SW5mbzo6c2FmZV9Wa1Byb3RlY3RlZFN1Ym1pdEluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvOjpzYWZlX1ZrUHJvdGVjdGVkU3VibWl0SW5mbyhjb25zdCBzYWZlX1ZrUHJvdGVjdGVkU3VibWl0SW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHByb3RlY3RlZFN1Ym1pdCA9IHNyYy5wcm90ZWN0ZWRTdWJtaXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvJiBzYWZlX1ZrUHJvdGVjdGVkU3VibWl0SW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcm90ZWN0ZWRTdWJtaXQgPSBzcmMucHJvdGVjdGVkU3VibWl0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUHJvdGVjdGVkU3VibWl0SW5mbzo6fnNhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUHJvdGVjdGVkU3VibWl0SW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1Byb3RlY3RlZFN1Ym1pdEluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcHJvdGVjdGVkU3VibWl0ID0gaW5fc3RydWN0LT5wcm90ZWN0ZWRTdWJtaXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHByb3RlY3RlZFN1Ym1pdCA9IHNyYy0+cHJvdGVjdGVkU3VibWl0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvOjpzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8oY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZm9ybWF0KGluX3N0cnVjdC0+Zm9ybWF0KSwKKyAgICB5Y2Jjck1vZGVsKGluX3N0cnVjdC0+eWNiY3JNb2RlbCksCisgICAgeWNiY3JSYW5nZShpbl9zdHJ1Y3QtPnljYmNyUmFuZ2UpLAorICAgIGNvbXBvbmVudHMoaW5fc3RydWN0LT5jb21wb25lbnRzKSwKKyAgICB4Q2hyb21hT2Zmc2V0KGluX3N0cnVjdC0+eENocm9tYU9mZnNldCksCisgICAgeUNocm9tYU9mZnNldChpbl9zdHJ1Y3QtPnlDaHJvbWFPZmZzZXQpLAorICAgIGNocm9tYUZpbHRlcihpbl9zdHJ1Y3QtPmNocm9tYUZpbHRlciksCisgICAgZm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uKGluX3N0cnVjdC0+Zm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvOjpzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbzo6c2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZvcm1hdCA9IHNyYy5mb3JtYXQ7CisgICAgeWNiY3JNb2RlbCA9IHNyYy55Y2Jjck1vZGVsOworICAgIHljYmNyUmFuZ2UgPSBzcmMueWNiY3JSYW5nZTsKKyAgICBjb21wb25lbnRzID0gc3JjLmNvbXBvbmVudHM7CisgICAgeENocm9tYU9mZnNldCA9IHNyYy54Q2hyb21hT2Zmc2V0OworICAgIHlDaHJvbWFPZmZzZXQgPSBzcmMueUNocm9tYU9mZnNldDsKKyAgICBjaHJvbWFGaWx0ZXIgPSBzcmMuY2hyb21hRmlsdGVyOworICAgIGZvcmNlRXhwbGljaXRSZWNvbnN0cnVjdGlvbiA9IHNyYy5mb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyYgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmb3JtYXQgPSBzcmMuZm9ybWF0OworICAgIHljYmNyTW9kZWwgPSBzcmMueWNiY3JNb2RlbDsKKyAgICB5Y2JjclJhbmdlID0gc3JjLnljYmNyUmFuZ2U7CisgICAgY29tcG9uZW50cyA9IHNyYy5jb21wb25lbnRzOworICAgIHhDaHJvbWFPZmZzZXQgPSBzcmMueENocm9tYU9mZnNldDsKKyAgICB5Q2hyb21hT2Zmc2V0ID0gc3JjLnlDaHJvbWFPZmZzZXQ7CisgICAgY2hyb21hRmlsdGVyID0gc3JjLmNocm9tYUZpbHRlcjsKKyAgICBmb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb24gPSBzcmMuZm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm86On5zYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZvcm1hdCA9IGluX3N0cnVjdC0+Zm9ybWF0OworICAgIHljYmNyTW9kZWwgPSBpbl9zdHJ1Y3QtPnljYmNyTW9kZWw7CisgICAgeWNiY3JSYW5nZSA9IGluX3N0cnVjdC0+eWNiY3JSYW5nZTsKKyAgICBjb21wb25lbnRzID0gaW5fc3RydWN0LT5jb21wb25lbnRzOworICAgIHhDaHJvbWFPZmZzZXQgPSBpbl9zdHJ1Y3QtPnhDaHJvbWFPZmZzZXQ7CisgICAgeUNocm9tYU9mZnNldCA9IGluX3N0cnVjdC0+eUNocm9tYU9mZnNldDsKKyAgICBjaHJvbWFGaWx0ZXIgPSBpbl9zdHJ1Y3QtPmNocm9tYUZpbHRlcjsKKyAgICBmb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb24gPSBpbl9zdHJ1Y3QtPmZvcmNlRXhwbGljaXRSZWNvbnN0cnVjdGlvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmb3JtYXQgPSBzcmMtPmZvcm1hdDsKKyAgICB5Y2Jjck1vZGVsID0gc3JjLT55Y2Jjck1vZGVsOworICAgIHljYmNyUmFuZ2UgPSBzcmMtPnljYmNyUmFuZ2U7CisgICAgY29tcG9uZW50cyA9IHNyYy0+Y29tcG9uZW50czsKKyAgICB4Q2hyb21hT2Zmc2V0ID0gc3JjLT54Q2hyb21hT2Zmc2V0OworICAgIHlDaHJvbWFPZmZzZXQgPSBzcmMtPnlDaHJvbWFPZmZzZXQ7CisgICAgY2hyb21hRmlsdGVyID0gc3JjLT5jaHJvbWFGaWx0ZXI7CisgICAgZm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uID0gc3JjLT5mb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm86OnNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyhjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBjb252ZXJzaW9uKGluX3N0cnVjdC0+Y29udmVyc2lvbikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbzo6c2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm86OnNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyhjb25zdCBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb252ZXJzaW9uID0gc3JjLmNvbnZlcnNpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyYgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb252ZXJzaW9uID0gc3JjLmNvbnZlcnNpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbzo6fnNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvOjppbml0aWFsaXplKGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgY29udmVyc2lvbiA9IGluX3N0cnVjdC0+Y29udmVyc2lvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBjb252ZXJzaW9uID0gc3JjLT5jb252ZXJzaW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbzo6c2FmZV9Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyhjb25zdCBWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcGxhbmVBc3BlY3QoaW5fc3RydWN0LT5wbGFuZUFzcGVjdCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm86OnNhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm86OnNhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8oY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBsYW5lQXNwZWN0ID0gc3JjLnBsYW5lQXNwZWN0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvJiBzYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGxhbmVBc3BlY3QgPSBzcmMucGxhbmVBc3BlY3Q7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm86On5zYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHBsYW5lQXNwZWN0ID0gaW5fc3RydWN0LT5wbGFuZUFzcGVjdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBsYW5lQXNwZWN0ID0gc3JjLT5wbGFuZUFzcGVjdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzo6c2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvKGNvbnN0IFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBsYW5lQXNwZWN0KGluX3N0cnVjdC0+cGxhbmVBc3BlY3QpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm86OnNhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvOjpzYWZlX1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8oY29uc3Qgc2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGxhbmVBc3BlY3QgPSBzcmMucGxhbmVBc3BlY3Q7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyYgc2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwbGFuZUFzcGVjdCA9IHNyYy5wbGFuZUFzcGVjdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvOjp+c2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm86OmluaXRpYWxpemUoY29uc3QgVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwbGFuZUFzcGVjdCA9IGluX3N0cnVjdC0+cGxhbmVBc3BlY3Q7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcGxhbmVBc3BlY3QgPSBzcmMtPnBsYW5lQXNwZWN0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMoY29uc3QgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc2FtcGxlclljYmNyQ29udmVyc2lvbihpbl9zdHJ1Y3QtPnNhbXBsZXJZY2JjckNvbnZlcnNpb24pCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2FtcGxlclljYmNyQ29udmVyc2lvbiA9IHNyYy5zYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMmIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlczo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2FtcGxlclljYmNyQ29udmVyc2lvbiA9IHNyYy5zYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXM6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlczo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNhbXBsZXJZY2JjckNvbnZlcnNpb24gPSBpbl9zdHJ1Y3QtPnNhbXBsZXJZY2JjckNvbnZlcnNpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlczo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2FtcGxlclljYmNyQ29udmVyc2lvbiA9IHNyYy0+c2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjpzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyhjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGNvbWJpbmVkSW1hZ2VTYW1wbGVyRGVzY3JpcHRvckNvdW50KGluX3N0cnVjdC0+Y29tYmluZWRJbWFnZVNhbXBsZXJEZXNjcmlwdG9yQ291bnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllczo6c2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjpzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyhjb25zdCBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNvbWJpbmVkSW1hZ2VTYW1wbGVyRGVzY3JpcHRvckNvdW50ID0gc3JjLmNvbWJpbmVkSW1hZ2VTYW1wbGVyRGVzY3JpcHRvckNvdW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyYgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29tYmluZWRJbWFnZVNhbXBsZXJEZXNjcmlwdG9yQ291bnQgPSBzcmMuY29tYmluZWRJbWFnZVNhbXBsZXJEZXNjcmlwdG9yQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjp+c2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBjb21iaW5lZEltYWdlU2FtcGxlckRlc2NyaXB0b3JDb3VudCA9IGluX3N0cnVjdC0+Y29tYmluZWRJbWFnZVNhbXBsZXJEZXNjcmlwdG9yQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGNvbWJpbmVkSW1hZ2VTYW1wbGVyRGVzY3JpcHRvckNvdW50ID0gc3JjLT5jb21iaW5lZEltYWdlU2FtcGxlckRlc2NyaXB0b3JDb3VudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvOjpzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyhjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50KGluX3N0cnVjdC0+ZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQpLAorICAgIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyhudWxscHRyKSwKKyAgICB0ZW1wbGF0ZVR5cGUoaW5fc3RydWN0LT50ZW1wbGF0ZVR5cGUpLAorICAgIGRlc2NyaXB0b3JTZXRMYXlvdXQoaW5fc3RydWN0LT5kZXNjcmlwdG9yU2V0TGF5b3V0KSwKKyAgICBwaXBlbGluZUJpbmRQb2ludChpbl9zdHJ1Y3QtPnBpcGVsaW5lQmluZFBvaW50KSwKKyAgICBwaXBlbGluZUxheW91dChpbl9zdHJ1Y3QtPnBpcGVsaW5lTGF5b3V0KSwKKyAgICBzZXQoaW5fc3RydWN0LT5zZXQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXNjcmlwdG9yVXBkYXRlRW50cmllcykgeworICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMgPSBuZXcgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeVtpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXNjcmlwdG9yVXBkYXRlRW50cmllcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEZXNjcmlwdG9yVXBkYXRlRW50cmllcywgc2l6ZW9mKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkpKmluX3N0cnVjdC0+ZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyhudWxscHRyKQore30KKworc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm86OnNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQgPSBzcmMuZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQ7CisgICAgcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzID0gbnVsbHB0cjsKKyAgICB0ZW1wbGF0ZVR5cGUgPSBzcmMudGVtcGxhdGVUeXBlOworICAgIGRlc2NyaXB0b3JTZXRMYXlvdXQgPSBzcmMuZGVzY3JpcHRvclNldExheW91dDsKKyAgICBwaXBlbGluZUJpbmRQb2ludCA9IHNyYy5waXBlbGluZUJpbmRQb2ludDsKKyAgICBwaXBlbGluZUxheW91dCA9IHNyYy5waXBlbGluZUxheW91dDsKKyAgICBzZXQgPSBzcmMuc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzKSB7CisgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyA9IG5ldyBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5W3NyYy5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMsICh2b2lkICopc3JjLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllcywgc2l6ZW9mKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkpKnNyYy5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyYgc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50ID0gc3JjLmRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50OworICAgIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyA9IG51bGxwdHI7CisgICAgdGVtcGxhdGVUeXBlID0gc3JjLnRlbXBsYXRlVHlwZTsKKyAgICBkZXNjcmlwdG9yU2V0TGF5b3V0ID0gc3JjLmRlc2NyaXB0b3JTZXRMYXlvdXQ7CisgICAgcGlwZWxpbmVCaW5kUG9pbnQgPSBzcmMucGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgcGlwZWxpbmVMYXlvdXQgPSBzcmMucGlwZWxpbmVMYXlvdXQ7CisgICAgc2V0ID0gc3JjLnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllcykgeworICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMgPSBuZXcgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeVtzcmMuZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzLCAodm9pZCAqKXNyYy5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMsIHNpemVvZihWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5KSpzcmMuZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm86On5zYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbygpCit7CisgICAgaWYgKHBEZXNjcmlwdG9yVXBkYXRlRW50cmllcykKKyAgICAgICAgZGVsZXRlW10gcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50OworICAgIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyA9IG51bGxwdHI7CisgICAgdGVtcGxhdGVUeXBlID0gaW5fc3RydWN0LT50ZW1wbGF0ZVR5cGU7CisgICAgZGVzY3JpcHRvclNldExheW91dCA9IGluX3N0cnVjdC0+ZGVzY3JpcHRvclNldExheW91dDsKKyAgICBwaXBlbGluZUJpbmRQb2ludCA9IGluX3N0cnVjdC0+cGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgcGlwZWxpbmVMYXlvdXQgPSBpbl9zdHJ1Y3QtPnBpcGVsaW5lTGF5b3V0OworICAgIHNldCA9IGluX3N0cnVjdC0+c2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMpIHsKKyAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzID0gbmV3IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnlbaW5fc3RydWN0LT5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMsICh2b2lkICopaW5fc3RydWN0LT5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMsIHNpemVvZihWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5KSppbl9zdHJ1Y3QtPmRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50ID0gc3JjLT5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudDsKKyAgICBwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMgPSBudWxscHRyOworICAgIHRlbXBsYXRlVHlwZSA9IHNyYy0+dGVtcGxhdGVUeXBlOworICAgIGRlc2NyaXB0b3JTZXRMYXlvdXQgPSBzcmMtPmRlc2NyaXB0b3JTZXRMYXlvdXQ7CisgICAgcGlwZWxpbmVCaW5kUG9pbnQgPSBzcmMtPnBpcGVsaW5lQmluZFBvaW50OworICAgIHBpcGVsaW5lTGF5b3V0ID0gc3JjLT5waXBlbGluZUxheW91dDsKKyAgICBzZXQgPSBzcmMtPnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzKSB7CisgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyA9IG5ldyBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5W3NyYy0+ZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzLCAodm9pZCAqKXNyYy0+cERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzLCBzaXplb2YoVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeSkqc3JjLT5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbzo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8oY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBoYW5kbGVUeXBlKGluX3N0cnVjdC0+aGFuZGxlVHlwZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm86OnNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbzo6fnNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKGNvbnN0IFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGV4dGVybmFsTWVtb3J5UHJvcGVydGllcyhpbl9zdHJ1Y3QtPmV4dGVybmFsTWVtb3J5UHJvcGVydGllcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM6OnNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyhjb25zdCBzYWZlX1ZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgPSBzcmMuZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMmIHNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllczo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzID0gc3JjLmV4dGVybmFsTWVtb3J5UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjp+c2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3QgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgPSBpbl9zdHJ1Y3QtPmV4dGVybmFsTWVtb3J5UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgPSBzcmMtPmV4dGVybmFsTWVtb3J5UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbzo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHVzYWdlKGluX3N0cnVjdC0+dXNhZ2UpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbzo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHVzYWdlID0gc3JjLnVzYWdlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHVzYWdlID0gc3JjLnVzYWdlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm86OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgdXNhZ2UgPSBpbl9zdHJ1Y3QtPnVzYWdlOworICAgIGhhbmRsZVR5cGUgPSBpbl9zdHJ1Y3QtPmhhbmRsZVR5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHVzYWdlID0gc3JjLT51c2FnZTsKKyAgICBoYW5kbGVUeXBlID0gc3JjLT5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyhjb25zdCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzKGluX3N0cnVjdC0+ZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyhjb25zdCBzYWZlX1ZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzID0gc3JjLmV4dGVybmFsTWVtb3J5UHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyYgc2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGV4dGVybmFsTWVtb3J5UHJvcGVydGllcyA9IHNyYy5leHRlcm5hbE1lbW9yeVByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXM6On5zYWZlX1ZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGV4dGVybmFsTWVtb3J5UHJvcGVydGllcyA9IGluX3N0cnVjdC0+ZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzID0gc3JjLT5leHRlcm5hbE1lbW9yeVByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkZXZpY2VOb2RlTWFzayhpbl9zdHJ1Y3QtPmRldmljZU5vZGVNYXNrKSwKKyAgICBkZXZpY2VMVUlEVmFsaWQoaW5fc3RydWN0LT5kZXZpY2VMVUlEVmFsaWQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19VVUlEX1NJWkU7ICsraSkgeworICAgICAgICBkZXZpY2VVVUlEW2ldID0gaW5fc3RydWN0LT5kZXZpY2VVVUlEW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfVVVJRF9TSVpFOyArK2kpIHsKKyAgICAgICAgZHJpdmVyVVVJRFtpXSA9IGluX3N0cnVjdC0+ZHJpdmVyVVVJRFtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX0xVSURfU0laRTsgKytpKSB7CisgICAgICAgIGRldmljZUxVSURbaV0gPSBpbl9zdHJ1Y3QtPmRldmljZUxVSURbaV07CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGV2aWNlTm9kZU1hc2sgPSBzcmMuZGV2aWNlTm9kZU1hc2s7CisgICAgZGV2aWNlTFVJRFZhbGlkID0gc3JjLmRldmljZUxVSURWYWxpZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfVVVJRF9TSVpFOyArK2kpIHsKKyAgICAgICAgZGV2aWNlVVVJRFtpXSA9IHNyYy5kZXZpY2VVVUlEW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfVVVJRF9TSVpFOyArK2kpIHsKKyAgICAgICAgZHJpdmVyVVVJRFtpXSA9IHNyYy5kcml2ZXJVVUlEW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTFVJRF9TSVpFOyArK2kpIHsKKyAgICAgICAgZGV2aWNlTFVJRFtpXSA9IHNyYy5kZXZpY2VMVUlEW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRldmljZU5vZGVNYXNrID0gc3JjLmRldmljZU5vZGVNYXNrOworICAgIGRldmljZUxVSURWYWxpZCA9IHNyYy5kZXZpY2VMVUlEVmFsaWQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX1VVSURfU0laRTsgKytpKSB7CisgICAgICAgIGRldmljZVVVSURbaV0gPSBzcmMuZGV2aWNlVVVJRFtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX1VVSURfU0laRTsgKytpKSB7CisgICAgICAgIGRyaXZlclVVSURbaV0gPSBzcmMuZHJpdmVyVVVJRFtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX0xVSURfU0laRTsgKytpKSB7CisgICAgICAgIGRldmljZUxVSURbaV0gPSBzcmMuZGV2aWNlTFVJRFtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllczo6fnNhZmVfVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGV2aWNlTm9kZU1hc2sgPSBpbl9zdHJ1Y3QtPmRldmljZU5vZGVNYXNrOworICAgIGRldmljZUxVSURWYWxpZCA9IGluX3N0cnVjdC0+ZGV2aWNlTFVJRFZhbGlkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfVVVJRF9TSVpFOyArK2kpIHsKKyAgICAgICAgZGV2aWNlVVVJRFtpXSA9IGluX3N0cnVjdC0+ZGV2aWNlVVVJRFtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX1VVSURfU0laRTsgKytpKSB7CisgICAgICAgIGRyaXZlclVVSURbaV0gPSBpbl9zdHJ1Y3QtPmRyaXZlclVVSURbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19MVUlEX1NJWkU7ICsraSkgeworICAgICAgICBkZXZpY2VMVUlEW2ldID0gaW5fc3RydWN0LT5kZXZpY2VMVUlEW2ldOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRldmljZU5vZGVNYXNrID0gc3JjLT5kZXZpY2VOb2RlTWFzazsKKyAgICBkZXZpY2VMVUlEVmFsaWQgPSBzcmMtPmRldmljZUxVSURWYWxpZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX1VVSURfU0laRTsgKytpKSB7CisgICAgICAgIGRldmljZVVVSURbaV0gPSBzcmMtPmRldmljZVVVSURbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19VVUlEX1NJWkU7ICsraSkgeworICAgICAgICBkcml2ZXJVVUlEW2ldID0gc3JjLT5kcml2ZXJVVUlEW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTFVJRF9TSVpFOyArK2kpIHsKKyAgICAgICAgZGV2aWNlTFVJRFtpXSA9IHNyYy0+ZGV2aWNlTFVJRFtpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzo6c2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvKGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGhhbmRsZVR5cGVzKGluX3N0cnVjdC0+aGFuZGxlVHlwZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm86OnNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvOjpzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZXMgPSBzcmMuaGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyYgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBoYW5kbGVUeXBlcyA9IHNyYy5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvOjp+c2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBoYW5kbGVUeXBlcyA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaGFuZGxlVHlwZXMgPSBzcmMtPmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzo6c2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyhjb25zdCBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgaGFuZGxlVHlwZXMoaW5fc3RydWN0LT5oYW5kbGVUeXBlcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm86OnNhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm86OnNhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvJiBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZXMgPSBzcmMuaGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm86On5zYWZlX1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gaW5fc3RydWN0LT5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLT5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm86OnNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8oY29uc3QgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGhhbmRsZVR5cGVzKGluX3N0cnVjdC0+aGFuZGxlVHlwZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOjpzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOjpzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvKGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8mIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBoYW5kbGVUeXBlcyA9IHNyYy5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyYgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOjp+c2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBoYW5kbGVUeXBlcyA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBoYW5kbGVUeXBlcyA9IHNyYy0+aGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbzo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8oY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBoYW5kbGVUeXBlKGluX3N0cnVjdC0+aGFuZGxlVHlwZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm86OnNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbzo6fnNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8qIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKGNvbnN0IFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzKGluX3N0cnVjdC0+ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMpLAorICAgIGNvbXBhdGlibGVIYW5kbGVUeXBlcyhpbl9zdHJ1Y3QtPmNvbXBhdGlibGVIYW5kbGVUeXBlcyksCisgICAgZXh0ZXJuYWxGZW5jZUZlYXR1cmVzKGluX3N0cnVjdC0+ZXh0ZXJuYWxGZW5jZUZlYXR1cmVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOjpzYWZlX1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzID0gc3JjLmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzOworICAgIGNvbXBhdGlibGVIYW5kbGVUeXBlcyA9IHNyYy5jb21wYXRpYmxlSGFuZGxlVHlwZXM7CisgICAgZXh0ZXJuYWxGZW5jZUZlYXR1cmVzID0gc3JjLmV4dGVybmFsRmVuY2VGZWF0dXJlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzJiBzYWZlX1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzID0gc3JjLmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzOworICAgIGNvbXBhdGlibGVIYW5kbGVUeXBlcyA9IHNyYy5jb21wYXRpYmxlSGFuZGxlVHlwZXM7CisgICAgZXh0ZXJuYWxGZW5jZUZlYXR1cmVzID0gc3JjLmV4dGVybmFsRmVuY2VGZWF0dXJlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzOjp+c2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3QgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyA9IGluX3N0cnVjdC0+ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXM7CisgICAgY29tcGF0aWJsZUhhbmRsZVR5cGVzID0gaW5fc3RydWN0LT5jb21wYXRpYmxlSGFuZGxlVHlwZXM7CisgICAgZXh0ZXJuYWxGZW5jZUZlYXR1cmVzID0gaW5fc3RydWN0LT5leHRlcm5hbEZlbmNlRmVhdHVyZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllczo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgPSBzcmMtPmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzOworICAgIGNvbXBhdGlibGVIYW5kbGVUeXBlcyA9IHNyYy0+Y29tcGF0aWJsZUhhbmRsZVR5cGVzOworICAgIGV4dGVybmFsRmVuY2VGZWF0dXJlcyA9IHNyYy0+ZXh0ZXJuYWxGZW5jZUZlYXR1cmVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbzo6c2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyhjb25zdCBWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgaGFuZGxlVHlwZXMoaW5fc3RydWN0LT5oYW5kbGVUeXBlcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm86OnNhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm86OnNhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvJiBzYWZlX1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZXMgPSBzcmMuaGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm86On5zYWZlX1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gaW5fc3RydWN0LT5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLT5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvOjpzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyhjb25zdCBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGhhbmRsZVR5cGVzKGluX3N0cnVjdC0+aGFuZGxlVHlwZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbzo6c2FmZV9Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvOjpzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyYgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZXMgPSBzcmMuaGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvOjp+c2FmZV9Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8oKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBoYW5kbGVUeXBlcyA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLT5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbzo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8qIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8oKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbzo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm86Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm86OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBoYW5kbGVUeXBlID0gaW5fc3RydWN0LT5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm86OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMtPmhhbmRsZVR5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzOjpzYWZlX1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKGNvbnN0IFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyhpbl9zdHJ1Y3QtPmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzKSwKKyAgICBjb21wYXRpYmxlSGFuZGxlVHlwZXMoaW5fc3RydWN0LT5jb21wYXRpYmxlSGFuZGxlVHlwZXMpLAorICAgIGV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXMoaW5fc3RydWN0LT5leHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcygpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczo6c2FmZV9Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyhjb25zdCBzYWZlX1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgPSBzcmMuZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXM7CisgICAgY29tcGF0aWJsZUhhbmRsZVR5cGVzID0gc3JjLmNvbXBhdGlibGVIYW5kbGVUeXBlczsKKyAgICBleHRlcm5hbFNlbWFwaG9yZUZlYXR1cmVzID0gc3JjLmV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMmIHNhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyA9IHNyYy5leHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlczsKKyAgICBjb21wYXRpYmxlSGFuZGxlVHlwZXMgPSBzcmMuY29tcGF0aWJsZUhhbmRsZVR5cGVzOworICAgIGV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXMgPSBzcmMuZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczo6fnNhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3QgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgPSBpbl9zdHJ1Y3QtPmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzOworICAgIGNvbXBhdGlibGVIYW5kbGVUeXBlcyA9IGluX3N0cnVjdC0+Y29tcGF0aWJsZUhhbmRsZVR5cGVzOworICAgIGV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXMgPSBpbl9zdHJ1Y3QtPmV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyA9IHNyYy0+ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXM7CisgICAgY29tcGF0aWJsZUhhbmRsZVR5cGVzID0gc3JjLT5jb21wYXRpYmxlSGFuZGxlVHlwZXM7CisgICAgZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlcyA9IHNyYy0+ZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMoY29uc3QgVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1heFBlclNldERlc2NyaXB0b3JzKGluX3N0cnVjdC0+bWF4UGVyU2V0RGVzY3JpcHRvcnMpLAorICAgIG1heE1lbW9yeUFsbG9jYXRpb25TaXplKGluX3N0cnVjdC0+bWF4TWVtb3J5QWxsb2NhdGlvblNpemUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXhQZXJTZXREZXNjcmlwdG9ycyA9IHNyYy5tYXhQZXJTZXREZXNjcmlwdG9yczsKKyAgICBtYXhNZW1vcnlBbGxvY2F0aW9uU2l6ZSA9IHNyYy5tYXhNZW1vcnlBbGxvY2F0aW9uU2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllczo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heFBlclNldERlc2NyaXB0b3JzID0gc3JjLm1heFBlclNldERlc2NyaXB0b3JzOworICAgIG1heE1lbW9yeUFsbG9jYXRpb25TaXplID0gc3JjLm1heE1lbW9yeUFsbG9jYXRpb25TaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllczo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtYXhQZXJTZXREZXNjcmlwdG9ycyA9IGluX3N0cnVjdC0+bWF4UGVyU2V0RGVzY3JpcHRvcnM7CisgICAgbWF4TWVtb3J5QWxsb2NhdGlvblNpemUgPSBpbl9zdHJ1Y3QtPm1heE1lbW9yeUFsbG9jYXRpb25TaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWF4UGVyU2V0RGVzY3JpcHRvcnMgPSBzcmMtPm1heFBlclNldERlc2NyaXB0b3JzOworICAgIG1heE1lbW9yeUFsbG9jYXRpb25TaXplID0gc3JjLT5tYXhNZW1vcnlBbGxvY2F0aW9uU2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydDo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHN1cHBvcnRlZChpbl9zdHJ1Y3QtPnN1cHBvcnRlZCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydDo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQ6OnNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydChjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdXBwb3J0ZWQgPSBzcmMuc3VwcG9ydGVkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQmIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3VwcG9ydGVkID0gc3JjLnN1cHBvcnRlZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Ojp+c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQ6OmluaXRpYWxpemUoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzdXBwb3J0ZWQgPSBpbl9zdHJ1Y3QtPnN1cHBvcnRlZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0Ojppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzdXBwb3J0ZWQgPSBzcmMtPnN1cHBvcnRlZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXM6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRlckRyYXdQYXJhbWV0ZXJzKGluX3N0cnVjdC0+c2hhZGVyRHJhd1BhcmFtZXRlcnMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJEcmF3UGFyYW1ldGVycyA9IHNyYy5zaGFkZXJEcmF3UGFyYW1ldGVyczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlczo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNoYWRlckRyYXdQYXJhbWV0ZXJzID0gc3JjLnNoYWRlckRyYXdQYXJhbWV0ZXJzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlczo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzaGFkZXJEcmF3UGFyYW1ldGVycyA9IGluX3N0cnVjdC0+c2hhZGVyRHJhd1BhcmFtZXRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXM6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzaGFkZXJEcmF3UGFyYW1ldGVycyA9IHNyYy0+c2hhZGVyRHJhd1BhcmFtZXRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIoY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBzdXJmYWNlKGluX3N0cnVjdC0+c3VyZmFjZSksCisgICAgbWluSW1hZ2VDb3VudChpbl9zdHJ1Y3QtPm1pbkltYWdlQ291bnQpLAorICAgIGltYWdlRm9ybWF0KGluX3N0cnVjdC0+aW1hZ2VGb3JtYXQpLAorICAgIGltYWdlQ29sb3JTcGFjZShpbl9zdHJ1Y3QtPmltYWdlQ29sb3JTcGFjZSksCisgICAgaW1hZ2VFeHRlbnQoaW5fc3RydWN0LT5pbWFnZUV4dGVudCksCisgICAgaW1hZ2VBcnJheUxheWVycyhpbl9zdHJ1Y3QtPmltYWdlQXJyYXlMYXllcnMpLAorICAgIGltYWdlVXNhZ2UoaW5fc3RydWN0LT5pbWFnZVVzYWdlKSwKKyAgICBpbWFnZVNoYXJpbmdNb2RlKGluX3N0cnVjdC0+aW1hZ2VTaGFyaW5nTW9kZSksCisgICAgcXVldWVGYW1pbHlJbmRleENvdW50KGluX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50KSwKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzKG51bGxwdHIpLAorICAgIHByZVRyYW5zZm9ybShpbl9zdHJ1Y3QtPnByZVRyYW5zZm9ybSksCisgICAgY29tcG9zaXRlQWxwaGEoaW5fc3RydWN0LT5jb21wb3NpdGVBbHBoYSksCisgICAgcHJlc2VudE1vZGUoaW5fc3RydWN0LT5wcmVzZW50TW9kZSksCisgICAgY2xpcHBlZChpbl9zdHJ1Y3QtPmNsaXBwZWQpLAorICAgIG9sZFN3YXBjaGFpbihpbl9zdHJ1Y3QtPm9sZFN3YXBjaGFpbikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wUXVldWVGYW1pbHlJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjpzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIoY29uc3Qgc2FmZV9Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBzdXJmYWNlID0gc3JjLnN1cmZhY2U7CisgICAgbWluSW1hZ2VDb3VudCA9IHNyYy5taW5JbWFnZUNvdW50OworICAgIGltYWdlRm9ybWF0ID0gc3JjLmltYWdlRm9ybWF0OworICAgIGltYWdlQ29sb3JTcGFjZSA9IHNyYy5pbWFnZUNvbG9yU3BhY2U7CisgICAgaW1hZ2VFeHRlbnQgPSBzcmMuaW1hZ2VFeHRlbnQ7CisgICAgaW1hZ2VBcnJheUxheWVycyA9IHNyYy5pbWFnZUFycmF5TGF5ZXJzOworICAgIGltYWdlVXNhZ2UgPSBzcmMuaW1hZ2VVc2FnZTsKKyAgICBpbWFnZVNoYXJpbmdNb2RlID0gc3JjLmltYWdlU2hhcmluZ01vZGU7CisgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwcmVUcmFuc2Zvcm0gPSBzcmMucHJlVHJhbnNmb3JtOworICAgIGNvbXBvc2l0ZUFscGhhID0gc3JjLmNvbXBvc2l0ZUFscGhhOworICAgIHByZXNlbnRNb2RlID0gc3JjLnByZXNlbnRNb2RlOworICAgIGNsaXBwZWQgPSBzcmMuY2xpcHBlZDsKKyAgICBvbGRTd2FwY2hhaW4gPSBzcmMub2xkU3dhcGNoYWluOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy5xdWV1ZUZhbWlseUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlRmFtaWx5SW5kaWNlcywgKHZvaWQgKilzcmMucFF1ZXVlRmFtaWx5SW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMucXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSJiBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBRdWV1ZUZhbWlseUluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBzdXJmYWNlID0gc3JjLnN1cmZhY2U7CisgICAgbWluSW1hZ2VDb3VudCA9IHNyYy5taW5JbWFnZUNvdW50OworICAgIGltYWdlRm9ybWF0ID0gc3JjLmltYWdlRm9ybWF0OworICAgIGltYWdlQ29sb3JTcGFjZSA9IHNyYy5pbWFnZUNvbG9yU3BhY2U7CisgICAgaW1hZ2VFeHRlbnQgPSBzcmMuaW1hZ2VFeHRlbnQ7CisgICAgaW1hZ2VBcnJheUxheWVycyA9IHNyYy5pbWFnZUFycmF5TGF5ZXJzOworICAgIGltYWdlVXNhZ2UgPSBzcmMuaW1hZ2VVc2FnZTsKKyAgICBpbWFnZVNoYXJpbmdNb2RlID0gc3JjLmltYWdlU2hhcmluZ01vZGU7CisgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwcmVUcmFuc2Zvcm0gPSBzcmMucHJlVHJhbnNmb3JtOworICAgIGNvbXBvc2l0ZUFscGhhID0gc3JjLmNvbXBvc2l0ZUFscGhhOworICAgIHByZXNlbnRNb2RlID0gc3JjLnByZXNlbnRNb2RlOworICAgIGNsaXBwZWQgPSBzcmMuY2xpcHBlZDsKKyAgICBvbGRTd2FwY2hhaW4gPSBzcmMub2xkU3dhcGNoYWluOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy5xdWV1ZUZhbWlseUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlRmFtaWx5SW5kaWNlcywgKHZvaWQgKilzcmMucFF1ZXVlRmFtaWx5SW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMucXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjp+c2FmZV9Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIoKQoreworICAgIGlmIChwUXVldWVGYW1pbHlJbmRpY2VzKQorICAgICAgICBkZWxldGVbXSBwUXVldWVGYW1pbHlJbmRpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgc3VyZmFjZSA9IGluX3N0cnVjdC0+c3VyZmFjZTsKKyAgICBtaW5JbWFnZUNvdW50ID0gaW5fc3RydWN0LT5taW5JbWFnZUNvdW50OworICAgIGltYWdlRm9ybWF0ID0gaW5fc3RydWN0LT5pbWFnZUZvcm1hdDsKKyAgICBpbWFnZUNvbG9yU3BhY2UgPSBpbl9zdHJ1Y3QtPmltYWdlQ29sb3JTcGFjZTsKKyAgICBpbWFnZUV4dGVudCA9IGluX3N0cnVjdC0+aW1hZ2VFeHRlbnQ7CisgICAgaW1hZ2VBcnJheUxheWVycyA9IGluX3N0cnVjdC0+aW1hZ2VBcnJheUxheWVyczsKKyAgICBpbWFnZVVzYWdlID0gaW5fc3RydWN0LT5pbWFnZVVzYWdlOworICAgIGltYWdlU2hhcmluZ01vZGUgPSBpbl9zdHJ1Y3QtPmltYWdlU2hhcmluZ01vZGU7CisgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG51bGxwdHI7CisgICAgcHJlVHJhbnNmb3JtID0gaW5fc3RydWN0LT5wcmVUcmFuc2Zvcm07CisgICAgY29tcG9zaXRlQWxwaGEgPSBpbl9zdHJ1Y3QtPmNvbXBvc2l0ZUFscGhhOworICAgIHByZXNlbnRNb2RlID0gaW5fc3RydWN0LT5wcmVzZW50TW9kZTsKKyAgICBjbGlwcGVkID0gaW5fc3RydWN0LT5jbGlwcGVkOworICAgIG9sZFN3YXBjaGFpbiA9IGluX3N0cnVjdC0+b2xkU3dhcGNoYWluOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wUXVldWVGYW1pbHlJbmRpY2VzKSB7CisgICAgICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlRmFtaWx5SW5kaWNlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5xdWV1ZUZhbWlseUluZGV4Q291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgc3VyZmFjZSA9IHNyYy0+c3VyZmFjZTsKKyAgICBtaW5JbWFnZUNvdW50ID0gc3JjLT5taW5JbWFnZUNvdW50OworICAgIGltYWdlRm9ybWF0ID0gc3JjLT5pbWFnZUZvcm1hdDsKKyAgICBpbWFnZUNvbG9yU3BhY2UgPSBzcmMtPmltYWdlQ29sb3JTcGFjZTsKKyAgICBpbWFnZUV4dGVudCA9IHNyYy0+aW1hZ2VFeHRlbnQ7CisgICAgaW1hZ2VBcnJheUxheWVycyA9IHNyYy0+aW1hZ2VBcnJheUxheWVyczsKKyAgICBpbWFnZVVzYWdlID0gc3JjLT5pbWFnZVVzYWdlOworICAgIGltYWdlU2hhcmluZ01vZGUgPSBzcmMtPmltYWdlU2hhcmluZ01vZGU7CisgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gc3JjLT5xdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG51bGxwdHI7CisgICAgcHJlVHJhbnNmb3JtID0gc3JjLT5wcmVUcmFuc2Zvcm07CisgICAgY29tcG9zaXRlQWxwaGEgPSBzcmMtPmNvbXBvc2l0ZUFscGhhOworICAgIHByZXNlbnRNb2RlID0gc3JjLT5wcmVzZW50TW9kZTsKKyAgICBjbGlwcGVkID0gc3JjLT5jbGlwcGVkOworICAgIG9sZFN3YXBjaGFpbiA9IHNyYy0+b2xkU3dhcGNoYWluOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wUXVldWVGYW1pbHlJbmRpY2VzKSB7CisgICAgICAgIHBRdWV1ZUZhbWlseUluZGljZXMgPSBuZXcgdWludDMyX3Rbc3JjLT5xdWV1ZUZhbWlseUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFF1ZXVlRmFtaWx5SW5kaWNlcywgKHZvaWQgKilzcmMtPnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLT5xdWV1ZUZhbWlseUluZGV4Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1ByZXNlbnRJbmZvS0hSOjpzYWZlX1ZrUHJlc2VudEluZm9LSFIoY29uc3QgVmtQcmVzZW50SW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgd2FpdFNlbWFwaG9yZUNvdW50KGluX3N0cnVjdC0+d2FpdFNlbWFwaG9yZUNvdW50KSwKKyAgICBwV2FpdFNlbWFwaG9yZXMobnVsbHB0ciksCisgICAgc3dhcGNoYWluQ291bnQoaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudCksCisgICAgcFN3YXBjaGFpbnMobnVsbHB0ciksCisgICAgcEltYWdlSW5kaWNlcyhudWxscHRyKSwKKyAgICBwUmVzdWx0cyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAod2FpdFNlbWFwaG9yZUNvdW50ICYmIGluX3N0cnVjdC0+cFdhaXRTZW1hcGhvcmVzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlcyA9IG5ldyBWa1NlbWFwaG9yZVt3YWl0U2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2FpdFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBXYWl0U2VtYXBob3Jlc1tpXSA9IGluX3N0cnVjdC0+cFdhaXRTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzd2FwY2hhaW5Db3VudCAmJiBpbl9zdHJ1Y3QtPnBTd2FwY2hhaW5zKSB7CisgICAgICAgIHBTd2FwY2hhaW5zID0gbmV3IFZrU3dhcGNoYWluS0hSW3N3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN3YXBjaGFpbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTd2FwY2hhaW5zW2ldID0gaW5fc3RydWN0LT5wU3dhcGNoYWluc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wSW1hZ2VJbmRpY2VzKSB7CisgICAgICAgIHBJbWFnZUluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwSW1hZ2VJbmRpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cEltYWdlSW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFJlc3VsdHMpIHsKKyAgICAgICAgcFJlc3VsdHMgPSBuZXcgVmtSZXN1bHRbaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUmVzdWx0cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBSZXN1bHRzLCBzaXplb2YoVmtSZXN1bHQpKmluX3N0cnVjdC0+c3dhcGNoYWluQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1ByZXNlbnRJbmZvS0hSOjpzYWZlX1ZrUHJlc2VudEluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFdhaXRTZW1hcGhvcmVzKG51bGxwdHIpLAorICAgIHBTd2FwY2hhaW5zKG51bGxwdHIpLAorICAgIHBJbWFnZUluZGljZXMobnVsbHB0ciksCisgICAgcFJlc3VsdHMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQcmVzZW50SW5mb0tIUjo6c2FmZV9Wa1ByZXNlbnRJbmZvS0hSKGNvbnN0IHNhZmVfVmtQcmVzZW50SW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVDb3VudCA9IHNyYy53YWl0U2VtYXBob3JlQ291bnQ7CisgICAgcFdhaXRTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBzd2FwY2hhaW5Db3VudCA9IHNyYy5zd2FwY2hhaW5Db3VudDsKKyAgICBwU3dhcGNoYWlucyA9IG51bGxwdHI7CisgICAgcEltYWdlSW5kaWNlcyA9IG51bGxwdHI7CisgICAgcFJlc3VsdHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmICh3YWl0U2VtYXBob3JlQ291bnQgJiYgc3JjLnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbd2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdhaXRTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwV2FpdFNlbWFwaG9yZXNbaV0gPSBzcmMucFdhaXRTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzd2FwY2hhaW5Db3VudCAmJiBzcmMucFN3YXBjaGFpbnMpIHsKKyAgICAgICAgcFN3YXBjaGFpbnMgPSBuZXcgVmtTd2FwY2hhaW5LSFJbc3dhcGNoYWluQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN3YXBjaGFpbnNbaV0gPSBzcmMucFN3YXBjaGFpbnNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wSW1hZ2VJbmRpY2VzKSB7CisgICAgICAgIHBJbWFnZUluZGljZXMgPSBuZXcgdWludDMyX3Rbc3JjLnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBJbWFnZUluZGljZXMsICh2b2lkICopc3JjLnBJbWFnZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLnN3YXBjaGFpbkNvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wUmVzdWx0cykgeworICAgICAgICBwUmVzdWx0cyA9IG5ldyBWa1Jlc3VsdFtzcmMuc3dhcGNoYWluQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFJlc3VsdHMsICh2b2lkICopc3JjLnBSZXN1bHRzLCBzaXplb2YoVmtSZXN1bHQpKnNyYy5zd2FwY2hhaW5Db3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUHJlc2VudEluZm9LSFImIHNhZmVfVmtQcmVzZW50SW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQcmVzZW50SW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwV2FpdFNlbWFwaG9yZXMpCisgICAgICAgIGRlbGV0ZVtdIHBXYWl0U2VtYXBob3JlczsKKyAgICBpZiAocFN3YXBjaGFpbnMpCisgICAgICAgIGRlbGV0ZVtdIHBTd2FwY2hhaW5zOworICAgIGlmIChwSW1hZ2VJbmRpY2VzKQorICAgICAgICBkZWxldGVbXSBwSW1hZ2VJbmRpY2VzOworICAgIGlmIChwUmVzdWx0cykKKyAgICAgICAgZGVsZXRlW10gcFJlc3VsdHM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB3YWl0U2VtYXBob3JlQ291bnQgPSBzcmMud2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgc3dhcGNoYWluQ291bnQgPSBzcmMuc3dhcGNoYWluQ291bnQ7CisgICAgcFN3YXBjaGFpbnMgPSBudWxscHRyOworICAgIHBJbWFnZUluZGljZXMgPSBudWxscHRyOworICAgIHBSZXN1bHRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAod2FpdFNlbWFwaG9yZUNvdW50ICYmIHNyYy5wV2FpdFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3dhaXRTZW1hcGhvcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3YWl0U2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFdhaXRTZW1hcGhvcmVzW2ldID0gc3JjLnBXYWl0U2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3dhcGNoYWluQ291bnQgJiYgc3JjLnBTd2FwY2hhaW5zKSB7CisgICAgICAgIHBTd2FwY2hhaW5zID0gbmV3IFZrU3dhcGNoYWluS0hSW3N3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN3YXBjaGFpbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTd2FwY2hhaW5zW2ldID0gc3JjLnBTd2FwY2hhaW5zW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucEltYWdlSW5kaWNlcykgeworICAgICAgICBwSW1hZ2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy5zd2FwY2hhaW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwSW1hZ2VJbmRpY2VzLCAodm9pZCAqKXNyYy5wSW1hZ2VJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy5zd2FwY2hhaW5Db3VudCk7CisgICAgfQorICAgIGlmIChzcmMucFJlc3VsdHMpIHsKKyAgICAgICAgcFJlc3VsdHMgPSBuZXcgVmtSZXN1bHRbc3JjLnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZXN1bHRzLCAodm9pZCAqKXNyYy5wUmVzdWx0cywgc2l6ZW9mKFZrUmVzdWx0KSpzcmMuc3dhcGNoYWluQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1ByZXNlbnRJbmZvS0hSOjp+c2FmZV9Wa1ByZXNlbnRJbmZvS0hSKCkKK3sKKyAgICBpZiAocFdhaXRTZW1hcGhvcmVzKQorICAgICAgICBkZWxldGVbXSBwV2FpdFNlbWFwaG9yZXM7CisgICAgaWYgKHBTd2FwY2hhaW5zKQorICAgICAgICBkZWxldGVbXSBwU3dhcGNoYWluczsKKyAgICBpZiAocEltYWdlSW5kaWNlcykKKyAgICAgICAgZGVsZXRlW10gcEltYWdlSW5kaWNlczsKKyAgICBpZiAocFJlc3VsdHMpCisgICAgICAgIGRlbGV0ZVtdIHBSZXN1bHRzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQcmVzZW50SW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVDb3VudCA9IGluX3N0cnVjdC0+d2FpdFNlbWFwaG9yZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgc3dhcGNoYWluQ291bnQgPSBpbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50OworICAgIHBTd2FwY2hhaW5zID0gbnVsbHB0cjsKKyAgICBwSW1hZ2VJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwUmVzdWx0cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmICh3YWl0U2VtYXBob3JlQ291bnQgJiYgaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3dhaXRTZW1hcGhvcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3YWl0U2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFdhaXRTZW1hcGhvcmVzW2ldID0gaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN3YXBjaGFpbkNvdW50ICYmIGluX3N0cnVjdC0+cFN3YXBjaGFpbnMpIHsKKyAgICAgICAgcFN3YXBjaGFpbnMgPSBuZXcgVmtTd2FwY2hhaW5LSFJbc3dhcGNoYWluQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN3YXBjaGFpbnNbaV0gPSBpbl9zdHJ1Y3QtPnBTd2FwY2hhaW5zW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBJbWFnZUluZGljZXMpIHsKKyAgICAgICAgcEltYWdlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBJbWFnZUluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wSW1hZ2VJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+c3dhcGNoYWluQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wUmVzdWx0cykgeworICAgICAgICBwUmVzdWx0cyA9IG5ldyBWa1Jlc3VsdFtpbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZXN1bHRzLCAodm9pZCAqKWluX3N0cnVjdC0+cFJlc3VsdHMsIHNpemVvZihWa1Jlc3VsdCkqaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtQcmVzZW50SW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUHJlc2VudEluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgd2FpdFNlbWFwaG9yZUNvdW50ID0gc3JjLT53YWl0U2VtYXBob3JlQ291bnQ7CisgICAgcFdhaXRTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBzd2FwY2hhaW5Db3VudCA9IHNyYy0+c3dhcGNoYWluQ291bnQ7CisgICAgcFN3YXBjaGFpbnMgPSBudWxscHRyOworICAgIHBJbWFnZUluZGljZXMgPSBudWxscHRyOworICAgIHBSZXN1bHRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHdhaXRTZW1hcGhvcmVDb3VudCAmJiBzcmMtPnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbd2FpdFNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdhaXRTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwV2FpdFNlbWFwaG9yZXNbaV0gPSBzcmMtPnBXYWl0U2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3dhcGNoYWluQ291bnQgJiYgc3JjLT5wU3dhcGNoYWlucykgeworICAgICAgICBwU3dhcGNoYWlucyA9IG5ldyBWa1N3YXBjaGFpbktIUltzd2FwY2hhaW5Db3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5Db3VudDsgKytpKSB7CisgICAgICAgICAgICBwU3dhcGNoYWluc1tpXSA9IHNyYy0+cFN3YXBjaGFpbnNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy0+cEltYWdlSW5kaWNlcykgeworICAgICAgICBwSW1hZ2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy0+c3dhcGNoYWluQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEltYWdlSW5kaWNlcywgKHZvaWQgKilzcmMtPnBJbWFnZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLT5zd2FwY2hhaW5Db3VudCk7CisgICAgfQorICAgIGlmIChzcmMtPnBSZXN1bHRzKSB7CisgICAgICAgIHBSZXN1bHRzID0gbmV3IFZrUmVzdWx0W3NyYy0+c3dhcGNoYWluQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFJlc3VsdHMsICh2b2lkICopc3JjLT5wUmVzdWx0cywgc2l6ZW9mKFZrUmVzdWx0KSpzcmMtPnN3YXBjaGFpbkNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFI6OnNhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIoY29uc3QgVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHN3YXBjaGFpbihpbl9zdHJ1Y3QtPnN3YXBjaGFpbikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFI6OnNhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFI6OnNhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIoY29uc3Qgc2FmZV9Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN3YXBjaGFpbiA9IHNyYy5zd2FwY2hhaW47CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFImIHNhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzd2FwY2hhaW4gPSBzcmMuc3dhcGNoYWluOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjp+c2FmZV9Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzd2FwY2hhaW4gPSBpbl9zdHJ1Y3QtPnN3YXBjaGFpbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHN3YXBjaGFpbiA9IHNyYy0+c3dhcGNoYWluOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFI6OnNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSKGNvbnN0IFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3dhcGNoYWluKGluX3N0cnVjdC0+c3dhcGNoYWluKSwKKyAgICBpbWFnZUluZGV4KGluX3N0cnVjdC0+aW1hZ2VJbmRleCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSOjpzYWZlX1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFI6OnNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSKGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3dhcGNoYWluID0gc3JjLnN3YXBjaGFpbjsKKyAgICBpbWFnZUluZGV4ID0gc3JjLmltYWdlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSJiBzYWZlX1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzd2FwY2hhaW4gPSBzcmMuc3dhcGNoYWluOworICAgIGltYWdlSW5kZXggPSBzcmMuaW1hZ2VJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFI6On5zYWZlX1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHN3YXBjaGFpbiA9IGluX3N0cnVjdC0+c3dhcGNoYWluOworICAgIGltYWdlSW5kZXggPSBpbl9zdHJ1Y3QtPmltYWdlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHN3YXBjaGFpbiA9IHNyYy0+c3dhcGNoYWluOworICAgIGltYWdlSW5kZXggPSBzcmMtPmltYWdlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFI6OnNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUihjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzd2FwY2hhaW4oaW5fc3RydWN0LT5zd2FwY2hhaW4pLAorICAgIHRpbWVvdXQoaW5fc3RydWN0LT50aW1lb3V0KSwKKyAgICBzZW1hcGhvcmUoaW5fc3RydWN0LT5zZW1hcGhvcmUpLAorICAgIGZlbmNlKGluX3N0cnVjdC0+ZmVuY2UpLAorICAgIGRldmljZU1hc2soaW5fc3RydWN0LT5kZXZpY2VNYXNrKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSOjpzYWZlX1ZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUjo6c2FmZV9Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKGNvbnN0IHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN3YXBjaGFpbiA9IHNyYy5zd2FwY2hhaW47CisgICAgdGltZW91dCA9IHNyYy50aW1lb3V0OworICAgIHNlbWFwaG9yZSA9IHNyYy5zZW1hcGhvcmU7CisgICAgZmVuY2UgPSBzcmMuZmVuY2U7CisgICAgZGV2aWNlTWFzayA9IHNyYy5kZXZpY2VNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFImIHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3dhcGNoYWluID0gc3JjLnN3YXBjaGFpbjsKKyAgICB0aW1lb3V0ID0gc3JjLnRpbWVvdXQ7CisgICAgc2VtYXBob3JlID0gc3JjLnNlbWFwaG9yZTsKKyAgICBmZW5jZSA9IHNyYy5mZW5jZTsKKyAgICBkZXZpY2VNYXNrID0gc3JjLmRldmljZU1hc2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUjo6fnNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3dhcGNoYWluID0gaW5fc3RydWN0LT5zd2FwY2hhaW47CisgICAgdGltZW91dCA9IGluX3N0cnVjdC0+dGltZW91dDsKKyAgICBzZW1hcGhvcmUgPSBpbl9zdHJ1Y3QtPnNlbWFwaG9yZTsKKyAgICBmZW5jZSA9IGluX3N0cnVjdC0+ZmVuY2U7CisgICAgZGV2aWNlTWFzayA9IGluX3N0cnVjdC0+ZGV2aWNlTWFzazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzd2FwY2hhaW4gPSBzcmMtPnN3YXBjaGFpbjsKKyAgICB0aW1lb3V0ID0gc3JjLT50aW1lb3V0OworICAgIHNlbWFwaG9yZSA9IHNyYy0+c2VtYXBob3JlOworICAgIGZlbmNlID0gc3JjLT5mZW5jZTsKKyAgICBkZXZpY2VNYXNrID0gc3JjLT5kZXZpY2VNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUjo6c2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUihjb25zdCBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbW9kZXMoaW5fc3RydWN0LT5tb2RlcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVZJQ0VfR1JPVVBfU0laRTsgKytpKSB7CisgICAgICAgIHByZXNlbnRNYXNrW2ldID0gaW5fc3RydWN0LT5wcmVzZW50TWFza1tpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI6OnNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI6OnNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1vZGVzID0gc3JjLm1vZGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVWSUNFX0dST1VQX1NJWkU7ICsraSkgeworICAgICAgICBwcmVzZW50TWFza1tpXSA9IHNyYy5wcmVzZW50TWFza1tpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFImIHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtb2RlcyA9IHNyYy5tb2RlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFOyArK2kpIHsKKyAgICAgICAgcHJlc2VudE1hc2tbaV0gPSBzcmMucHJlc2VudE1hc2tbaV07CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSOjp+c2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtb2RlcyA9IGluX3N0cnVjdC0+bW9kZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVWSUNFX0dST1VQX1NJWkU7ICsraSkgeworICAgICAgICBwcmVzZW50TWFza1tpXSA9IGluX3N0cnVjdC0+cHJlc2VudE1hc2tbaV07CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtb2RlcyA9IHNyYy0+bW9kZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVWSUNFX0dST1VQX1NJWkU7ICsraSkgeworICAgICAgICBwcmVzZW50TWFza1tpXSA9IHNyYy0+cHJlc2VudE1hc2tbaV07CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUjo6c2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIoY29uc3QgVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzd2FwY2hhaW5Db3VudChpbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50KSwKKyAgICBwRGV2aWNlTWFza3MobnVsbHB0ciksCisgICAgbW9kZShpbl9zdHJ1Y3QtPm1vZGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXZpY2VNYXNrcykgeworICAgICAgICBwRGV2aWNlTWFza3MgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGV2aWNlTWFza3MsICh2b2lkICopaW5fc3RydWN0LT5wRGV2aWNlTWFza3MsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUjo6c2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcERldmljZU1hc2tzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUjo6c2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzd2FwY2hhaW5Db3VudCA9IHNyYy5zd2FwY2hhaW5Db3VudDsKKyAgICBwRGV2aWNlTWFza3MgPSBudWxscHRyOworICAgIG1vZGUgPSBzcmMubW9kZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBEZXZpY2VNYXNrcykgeworICAgICAgICBwRGV2aWNlTWFza3MgPSBuZXcgdWludDMyX3Rbc3JjLnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VNYXNrcywgKHZvaWQgKilzcmMucERldmljZU1hc2tzLCBzaXplb2YodWludDMyX3QpKnNyYy5zd2FwY2hhaW5Db3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiYgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRGV2aWNlTWFza3MpCisgICAgICAgIGRlbGV0ZVtdIHBEZXZpY2VNYXNrczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN3YXBjaGFpbkNvdW50ID0gc3JjLnN3YXBjaGFpbkNvdW50OworICAgIHBEZXZpY2VNYXNrcyA9IG51bGxwdHI7CisgICAgbW9kZSA9IHNyYy5tb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERldmljZU1hc2tzKSB7CisgICAgICAgIHBEZXZpY2VNYXNrcyA9IG5ldyB1aW50MzJfdFtzcmMuc3dhcGNoYWluQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERldmljZU1hc2tzLCAodm9pZCAqKXNyYy5wRGV2aWNlTWFza3MsIHNpemVvZih1aW50MzJfdCkqc3JjLnN3YXBjaGFpbkNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSOjp+c2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIoKQoreworICAgIGlmIChwRGV2aWNlTWFza3MpCisgICAgICAgIGRlbGV0ZVtdIHBEZXZpY2VNYXNrczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3dhcGNoYWluQ291bnQgPSBpbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50OworICAgIHBEZXZpY2VNYXNrcyA9IG51bGxwdHI7CisgICAgbW9kZSA9IGluX3N0cnVjdC0+bW9kZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cERldmljZU1hc2tzKSB7CisgICAgICAgIHBEZXZpY2VNYXNrcyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VNYXNrcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEZXZpY2VNYXNrcywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3dhcGNoYWluQ291bnQgPSBzcmMtPnN3YXBjaGFpbkNvdW50OworICAgIHBEZXZpY2VNYXNrcyA9IG51bGxwdHI7CisgICAgbW9kZSA9IHNyYy0+bW9kZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cERldmljZU1hc2tzKSB7CisgICAgICAgIHBEZXZpY2VNYXNrcyA9IG5ldyB1aW50MzJfdFtzcmMtPnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VNYXNrcywgKHZvaWQgKilzcmMtPnBEZXZpY2VNYXNrcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMtPnN3YXBjaGFpbkNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFI6OnNhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIoY29uc3QgVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1vZGVzKGluX3N0cnVjdC0+bW9kZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjpzYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjpzYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtb2RlcyA9IHNyYy5tb2RlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiYgc2FmZV9Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1vZGVzID0gc3JjLm1vZGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjp+c2FmZV9Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtb2RlcyA9IGluX3N0cnVjdC0+bW9kZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtb2RlcyA9IHNyYy0+bW9kZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFI6OnNhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUihjb25zdCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBkaXNwbGF5KGluX3N0cnVjdC0+ZGlzcGxheSksCisgICAgcGh5c2ljYWxEaW1lbnNpb25zKGluX3N0cnVjdC0+cGh5c2ljYWxEaW1lbnNpb25zKSwKKyAgICBwaHlzaWNhbFJlc29sdXRpb24oaW5fc3RydWN0LT5waHlzaWNhbFJlc29sdXRpb24pLAorICAgIHN1cHBvcnRlZFRyYW5zZm9ybXMoaW5fc3RydWN0LT5zdXBwb3J0ZWRUcmFuc2Zvcm1zKSwKKyAgICBwbGFuZVJlb3JkZXJQb3NzaWJsZShpbl9zdHJ1Y3QtPnBsYW5lUmVvcmRlclBvc3NpYmxlKSwKKyAgICBwZXJzaXN0ZW50Q29udGVudChpbl9zdHJ1Y3QtPnBlcnNpc3RlbnRDb250ZW50KQoreworICAgIGRpc3BsYXlOYW1lID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5kaXNwbGF5TmFtZSk7Cit9CisKK3NhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUjo6c2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKCkgOgorICAgIGRpc3BsYXlOYW1lKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFI6OnNhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUihjb25zdCBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBkaXNwbGF5ID0gc3JjLmRpc3BsYXk7CisgICAgcGh5c2ljYWxEaW1lbnNpb25zID0gc3JjLnBoeXNpY2FsRGltZW5zaW9uczsKKyAgICBwaHlzaWNhbFJlc29sdXRpb24gPSBzcmMucGh5c2ljYWxSZXNvbHV0aW9uOworICAgIHN1cHBvcnRlZFRyYW5zZm9ybXMgPSBzcmMuc3VwcG9ydGVkVHJhbnNmb3JtczsKKyAgICBwbGFuZVJlb3JkZXJQb3NzaWJsZSA9IHNyYy5wbGFuZVJlb3JkZXJQb3NzaWJsZTsKKyAgICBwZXJzaXN0ZW50Q29udGVudCA9IHNyYy5wZXJzaXN0ZW50Q29udGVudDsKKyAgICBkaXNwbGF5TmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5kaXNwbGF5TmFtZSk7Cit9CisKK3NhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUiYgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKGRpc3BsYXlOYW1lKSBkZWxldGUgW10gZGlzcGxheU5hbWU7CisKKyAgICBkaXNwbGF5ID0gc3JjLmRpc3BsYXk7CisgICAgcGh5c2ljYWxEaW1lbnNpb25zID0gc3JjLnBoeXNpY2FsRGltZW5zaW9uczsKKyAgICBwaHlzaWNhbFJlc29sdXRpb24gPSBzcmMucGh5c2ljYWxSZXNvbHV0aW9uOworICAgIHN1cHBvcnRlZFRyYW5zZm9ybXMgPSBzcmMuc3VwcG9ydGVkVHJhbnNmb3JtczsKKyAgICBwbGFuZVJlb3JkZXJQb3NzaWJsZSA9IHNyYy5wbGFuZVJlb3JkZXJQb3NzaWJsZTsKKyAgICBwZXJzaXN0ZW50Q29udGVudCA9IHNyYy5wZXJzaXN0ZW50Q29udGVudDsKKyAgICBkaXNwbGF5TmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5kaXNwbGF5TmFtZSk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUjo6fnNhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUigpCit7CisgICAgaWYgKGRpc3BsYXlOYW1lKSBkZWxldGUgW10gZGlzcGxheU5hbWU7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrRGlzcGxheVByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBkaXNwbGF5ID0gaW5fc3RydWN0LT5kaXNwbGF5OworICAgIHBoeXNpY2FsRGltZW5zaW9ucyA9IGluX3N0cnVjdC0+cGh5c2ljYWxEaW1lbnNpb25zOworICAgIHBoeXNpY2FsUmVzb2x1dGlvbiA9IGluX3N0cnVjdC0+cGh5c2ljYWxSZXNvbHV0aW9uOworICAgIHN1cHBvcnRlZFRyYW5zZm9ybXMgPSBpbl9zdHJ1Y3QtPnN1cHBvcnRlZFRyYW5zZm9ybXM7CisgICAgcGxhbmVSZW9yZGVyUG9zc2libGUgPSBpbl9zdHJ1Y3QtPnBsYW5lUmVvcmRlclBvc3NpYmxlOworICAgIHBlcnNpc3RlbnRDb250ZW50ID0gaW5fc3RydWN0LT5wZXJzaXN0ZW50Q29udGVudDsKKyAgICBkaXNwbGF5TmFtZSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+ZGlzcGxheU5hbWUpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFIqIHNyYykKK3sKKyAgICBkaXNwbGF5ID0gc3JjLT5kaXNwbGF5OworICAgIHBoeXNpY2FsRGltZW5zaW9ucyA9IHNyYy0+cGh5c2ljYWxEaW1lbnNpb25zOworICAgIHBoeXNpY2FsUmVzb2x1dGlvbiA9IHNyYy0+cGh5c2ljYWxSZXNvbHV0aW9uOworICAgIHN1cHBvcnRlZFRyYW5zZm9ybXMgPSBzcmMtPnN1cHBvcnRlZFRyYW5zZm9ybXM7CisgICAgcGxhbmVSZW9yZGVyUG9zc2libGUgPSBzcmMtPnBsYW5lUmVvcmRlclBvc3NpYmxlOworICAgIHBlcnNpc3RlbnRDb250ZW50ID0gc3JjLT5wZXJzaXN0ZW50Q29udGVudDsKKyAgICBkaXNwbGF5TmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy0+ZGlzcGxheU5hbWUpOworfQorCitzYWZlX1ZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSOjpzYWZlX1ZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKGNvbnN0IFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBwYXJhbWV0ZXJzKGluX3N0cnVjdC0+cGFyYW1ldGVycykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFI6OnNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFI6OnNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBhcmFtZXRlcnMgPSBzcmMucGFyYW1ldGVyczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiYgc2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBhcmFtZXRlcnMgPSBzcmMucGFyYW1ldGVyczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUjo6fnNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHBhcmFtZXRlcnMgPSBpbl9zdHJ1Y3QtPnBhcmFtZXRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcGFyYW1ldGVycyA9IHNyYy0+cGFyYW1ldGVyczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFI6OnNhZmVfVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIoY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGRpc3BsYXlNb2RlKGluX3N0cnVjdC0+ZGlzcGxheU1vZGUpLAorICAgIHBsYW5lSW5kZXgoaW5fc3RydWN0LT5wbGFuZUluZGV4KSwKKyAgICBwbGFuZVN0YWNrSW5kZXgoaW5fc3RydWN0LT5wbGFuZVN0YWNrSW5kZXgpLAorICAgIHRyYW5zZm9ybShpbl9zdHJ1Y3QtPnRyYW5zZm9ybSksCisgICAgZ2xvYmFsQWxwaGEoaW5fc3RydWN0LT5nbG9iYWxBbHBoYSksCisgICAgYWxwaGFNb2RlKGluX3N0cnVjdC0+YWxwaGFNb2RlKSwKKyAgICBpbWFnZUV4dGVudChpbl9zdHJ1Y3QtPmltYWdlRXh0ZW50KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGlzcGxheU1vZGUgPSBzcmMuZGlzcGxheU1vZGU7CisgICAgcGxhbmVJbmRleCA9IHNyYy5wbGFuZUluZGV4OworICAgIHBsYW5lU3RhY2tJbmRleCA9IHNyYy5wbGFuZVN0YWNrSW5kZXg7CisgICAgdHJhbnNmb3JtID0gc3JjLnRyYW5zZm9ybTsKKyAgICBnbG9iYWxBbHBoYSA9IHNyYy5nbG9iYWxBbHBoYTsKKyAgICBhbHBoYU1vZGUgPSBzcmMuYWxwaGFNb2RlOworICAgIGltYWdlRXh0ZW50ID0gc3JjLmltYWdlRXh0ZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSJiBzYWZlX1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGlzcGxheU1vZGUgPSBzcmMuZGlzcGxheU1vZGU7CisgICAgcGxhbmVJbmRleCA9IHNyYy5wbGFuZUluZGV4OworICAgIHBsYW5lU3RhY2tJbmRleCA9IHNyYy5wbGFuZVN0YWNrSW5kZXg7CisgICAgdHJhbnNmb3JtID0gc3JjLnRyYW5zZm9ybTsKKyAgICBnbG9iYWxBbHBoYSA9IHNyYy5nbG9iYWxBbHBoYTsKKyAgICBhbHBoYU1vZGUgPSBzcmMuYWxwaGFNb2RlOworICAgIGltYWdlRXh0ZW50ID0gc3JjLmltYWdlRXh0ZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSOjp+c2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgZGlzcGxheU1vZGUgPSBpbl9zdHJ1Y3QtPmRpc3BsYXlNb2RlOworICAgIHBsYW5lSW5kZXggPSBpbl9zdHJ1Y3QtPnBsYW5lSW5kZXg7CisgICAgcGxhbmVTdGFja0luZGV4ID0gaW5fc3RydWN0LT5wbGFuZVN0YWNrSW5kZXg7CisgICAgdHJhbnNmb3JtID0gaW5fc3RydWN0LT50cmFuc2Zvcm07CisgICAgZ2xvYmFsQWxwaGEgPSBpbl9zdHJ1Y3QtPmdsb2JhbEFscGhhOworICAgIGFscGhhTW9kZSA9IGluX3N0cnVjdC0+YWxwaGFNb2RlOworICAgIGltYWdlRXh0ZW50ID0gaW5fc3RydWN0LT5pbWFnZUV4dGVudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBkaXNwbGF5TW9kZSA9IHNyYy0+ZGlzcGxheU1vZGU7CisgICAgcGxhbmVJbmRleCA9IHNyYy0+cGxhbmVJbmRleDsKKyAgICBwbGFuZVN0YWNrSW5kZXggPSBzcmMtPnBsYW5lU3RhY2tJbmRleDsKKyAgICB0cmFuc2Zvcm0gPSBzcmMtPnRyYW5zZm9ybTsKKyAgICBnbG9iYWxBbHBoYSA9IHNyYy0+Z2xvYmFsQWxwaGE7CisgICAgYWxwaGFNb2RlID0gc3JjLT5hbHBoYU1vZGU7CisgICAgaW1hZ2VFeHRlbnQgPSBzcmMtPmltYWdlRXh0ZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUjo6c2FmZV9Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUihjb25zdCBWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3JjUmVjdChpbl9zdHJ1Y3QtPnNyY1JlY3QpLAorICAgIGRzdFJlY3QoaW5fc3RydWN0LT5kc3RSZWN0KSwKKyAgICBwZXJzaXN0ZW50KGluX3N0cnVjdC0+cGVyc2lzdGVudCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFI6OnNhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFI6OnNhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFIoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNyY1JlY3QgPSBzcmMuc3JjUmVjdDsKKyAgICBkc3RSZWN0ID0gc3JjLmRzdFJlY3Q7CisgICAgcGVyc2lzdGVudCA9IHNyYy5wZXJzaXN0ZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSJiBzYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3JjUmVjdCA9IHNyYy5zcmNSZWN0OworICAgIGRzdFJlY3QgPSBzcmMuZHN0UmVjdDsKKyAgICBwZXJzaXN0ZW50ID0gc3JjLnBlcnNpc3RlbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFI6On5zYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrRGlzcGxheVByZXNlbnRJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNyY1JlY3QgPSBpbl9zdHJ1Y3QtPnNyY1JlY3Q7CisgICAgZHN0UmVjdCA9IGluX3N0cnVjdC0+ZHN0UmVjdDsKKyAgICBwZXJzaXN0ZW50ID0gaW5fc3RydWN0LT5wZXJzaXN0ZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3JjUmVjdCA9IHNyYy0+c3JjUmVjdDsKKyAgICBkc3RSZWN0ID0gc3JjLT5kc3RSZWN0OworICAgIHBlcnNpc3RlbnQgPSBzcmMtPnBlcnNpc3RlbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBoYW5kbGVUeXBlKGluX3N0cnVjdC0+aGFuZGxlVHlwZSksCisgICAgaGFuZGxlKGluX3N0cnVjdC0+aGFuZGxlKSwKKyAgICBuYW1lKGluX3N0cnVjdC0+bmFtZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBoYW5kbGUgPSBzcmMuaGFuZGxlOworICAgIG5hbWUgPSBzcmMubmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiYgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBoYW5kbGUgPSBzcmMuaGFuZGxlOworICAgIG5hbWUgPSBzcmMubmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjo6fnNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBoYW5kbGUgPSBpbl9zdHJ1Y3QtPmhhbmRsZTsKKyAgICBuYW1lID0gaW5fc3RydWN0LT5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy0+aGFuZGxlVHlwZTsKKyAgICBoYW5kbGUgPSBzcmMtPmhhbmRsZTsKKyAgICBuYW1lID0gc3JjLT5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcEF0dHJpYnV0ZXMobnVsbHB0ciksCisgICAgZHdBY2Nlc3MoaW5fc3RydWN0LT5kd0FjY2VzcyksCisgICAgbmFtZShpbl9zdHJ1Y3QtPm5hbWUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBBdHRyaWJ1dGVzKSB7CisgICAgICAgIHBBdHRyaWJ1dGVzID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKmluX3N0cnVjdC0+cEF0dHJpYnV0ZXMpOworICAgIH0KK30KKworc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwQXR0cmlidXRlcyhudWxscHRyKQore30KKworc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcEF0dHJpYnV0ZXMgPSBudWxscHRyOworICAgIGR3QWNjZXNzID0gc3JjLmR3QWNjZXNzOworICAgIG5hbWUgPSBzcmMubmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBBdHRyaWJ1dGVzKSB7CisgICAgICAgIHBBdHRyaWJ1dGVzID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKnNyYy5wQXR0cmlidXRlcyk7CisgICAgfQorfQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSJiBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwQXR0cmlidXRlcykKKyAgICAgICAgZGVsZXRlIHBBdHRyaWJ1dGVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcEF0dHJpYnV0ZXMgPSBudWxscHRyOworICAgIGR3QWNjZXNzID0gc3JjLmR3QWNjZXNzOworICAgIG5hbWUgPSBzcmMubmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBBdHRyaWJ1dGVzKSB7CisgICAgICAgIHBBdHRyaWJ1dGVzID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKnNyYy5wQXR0cmlidXRlcyk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSOjp+c2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUigpCit7CisgICAgaWYgKHBBdHRyaWJ1dGVzKQorICAgICAgICBkZWxldGUgcEF0dHJpYnV0ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwQXR0cmlidXRlcyA9IG51bGxwdHI7CisgICAgZHdBY2Nlc3MgPSBpbl9zdHJ1Y3QtPmR3QWNjZXNzOworICAgIG5hbWUgPSBpbl9zdHJ1Y3QtPm5hbWU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBBdHRyaWJ1dGVzKSB7CisgICAgICAgIHBBdHRyaWJ1dGVzID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKmluX3N0cnVjdC0+cEF0dHJpYnV0ZXMpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcEF0dHJpYnV0ZXMgPSBudWxscHRyOworICAgIGR3QWNjZXNzID0gc3JjLT5kd0FjY2VzczsKKyAgICBuYW1lID0gc3JjLT5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCpzcmMtPnBBdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI6OnNhZmVfVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIoY29uc3QgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1lbW9yeVR5cGVCaXRzKGluX3N0cnVjdC0+bWVtb3J5VHlwZUJpdHMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKGNvbnN0IHNhZmVfVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IHNyYy5tZW1vcnlUeXBlQml0czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiYgc2FmZV9Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1lbW9yeVR5cGVCaXRzID0gc3JjLm1lbW9yeVR5cGVCaXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSOjp+c2FmZV9Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IGluX3N0cnVjdC0+bWVtb3J5VHlwZUJpdHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IHNyYy0+bWVtb3J5VHlwZUJpdHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitzYWZlX1ZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtZW1vcnkoaW5fc3RydWN0LT5tZW1vcnkpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5ID0gc3JjLm1lbW9yeTsKKyAgICBoYW5kbGVUeXBlID0gc3JjLmhhbmRsZVR5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFImIHNhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnkgPSBzcmMubWVtb3J5OworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUjo6fnNhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWVtb3J5ID0gaW5fc3RydWN0LT5tZW1vcnk7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1lbW9yeSA9IHNyYy0+bWVtb3J5OworICAgIGhhbmRsZVR5cGUgPSBzcmMtPmhhbmRsZVR5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitzYWZlX1ZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSKGNvbnN0IFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBoYW5kbGVUeXBlKGluX3N0cnVjdC0+aGFuZGxlVHlwZSksCisgICAgZmQoaW5fc3RydWN0LT5mZCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFI6OnNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFI6OnNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIoY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBmZCA9IHNyYy5mZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiYgc2FmZV9Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBmZCA9IHNyYy5mZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUjo6fnNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBmZCA9IGluX3N0cnVjdC0+ZmQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBoYW5kbGVUeXBlID0gc3JjLT5oYW5kbGVUeXBlOworICAgIGZkID0gc3JjLT5mZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlGZFByb3BlcnRpZXNLSFI6OnNhZmVfVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIoY29uc3QgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1lbW9yeVR5cGVCaXRzKGluX3N0cnVjdC0+bWVtb3J5VHlwZUJpdHMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSKGNvbnN0IHNhZmVfVmtNZW1vcnlGZFByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IHNyYy5tZW1vcnlUeXBlQml0czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUiYgc2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlGZFByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1lbW9yeVR5cGVCaXRzID0gc3JjLm1lbW9yeVR5cGVCaXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSOjp+c2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IGluX3N0cnVjdC0+bWVtb3J5VHlwZUJpdHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlGZFByb3BlcnRpZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IHNyYy0+bWVtb3J5VHlwZUJpdHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSOjpzYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSKGNvbnN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtZW1vcnkoaW5fc3RydWN0LT5tZW1vcnkpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUjo6c2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUjo6c2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUihjb25zdCBzYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5ID0gc3JjLm1lbW9yeTsKKyAgICBoYW5kbGVUeXBlID0gc3JjLmhhbmRsZVR5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlHZXRGZEluZm9LSFImIHNhZmVfVmtNZW1vcnlHZXRGZEluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnkgPSBzcmMubWVtb3J5OworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUjo6fnNhZmVfVmtNZW1vcnlHZXRGZEluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlHZXRGZEluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtNZW1vcnlHZXRGZEluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWVtb3J5ID0gaW5fc3RydWN0LT5tZW1vcnk7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1lbW9yeSA9IHNyYy0+bWVtb3J5OworICAgIGhhbmRsZVR5cGUgPSBzcmMtPmhhbmRsZVR5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSOjpzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSKGNvbnN0IFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBhY3F1aXJlQ291bnQoaW5fc3RydWN0LT5hY3F1aXJlQ291bnQpLAorICAgIHBBY3F1aXJlU3luY3MobnVsbHB0ciksCisgICAgcEFjcXVpcmVLZXlzKG51bGxwdHIpLAorICAgIHBBY3F1aXJlVGltZW91dHMobnVsbHB0ciksCisgICAgcmVsZWFzZUNvdW50KGluX3N0cnVjdC0+cmVsZWFzZUNvdW50KSwKKyAgICBwUmVsZWFzZVN5bmNzKG51bGxwdHIpLAorICAgIHBSZWxlYXNlS2V5cyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoYWNxdWlyZUNvdW50ICYmIGluX3N0cnVjdC0+cEFjcXVpcmVTeW5jcykgeworICAgICAgICBwQWNxdWlyZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W2FjcXVpcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3F1aXJlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEFjcXVpcmVTeW5jc1tpXSA9IGluX3N0cnVjdC0+cEFjcXVpcmVTeW5jc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wQWNxdWlyZUtleXMpIHsKKyAgICAgICAgcEFjcXVpcmVLZXlzID0gbmV3IHVpbnQ2NF90W2luX3N0cnVjdC0+YWNxdWlyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBY3F1aXJlS2V5cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBBY3F1aXJlS2V5cywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBBY3F1aXJlVGltZW91dHMpIHsKKyAgICAgICAgcEFjcXVpcmVUaW1lb3V0cyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPmFjcXVpcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQWNxdWlyZVRpbWVvdXRzLCAodm9pZCAqKWluX3N0cnVjdC0+cEFjcXVpcmVUaW1lb3V0cywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChyZWxlYXNlQ291bnQgJiYgaW5fc3RydWN0LT5wUmVsZWFzZVN5bmNzKSB7CisgICAgICAgIHBSZWxlYXNlU3luY3MgPSBuZXcgVmtEZXZpY2VNZW1vcnlbcmVsZWFzZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlbGVhc2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwUmVsZWFzZVN5bmNzW2ldID0gaW5fc3RydWN0LT5wUmVsZWFzZVN5bmNzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBSZWxlYXNlS2V5cykgeworICAgICAgICBwUmVsZWFzZUtleXMgPSBuZXcgdWludDY0X3RbaW5fc3RydWN0LT5yZWxlYXNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFJlbGVhc2VLZXlzLCAodm9pZCAqKWluX3N0cnVjdC0+cFJlbGVhc2VLZXlzLCBzaXplb2YodWludDY0X3QpKmluX3N0cnVjdC0+cmVsZWFzZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFI6OnNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEFjcXVpcmVTeW5jcyhudWxscHRyKSwKKyAgICBwQWNxdWlyZUtleXMobnVsbHB0ciksCisgICAgcEFjcXVpcmVUaW1lb3V0cyhudWxscHRyKSwKKyAgICBwUmVsZWFzZVN5bmNzKG51bGxwdHIpLAorICAgIHBSZWxlYXNlS2V5cyhudWxscHRyKQore30KKworc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUjo6c2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUihjb25zdCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYWNxdWlyZUNvdW50ID0gc3JjLmFjcXVpcmVDb3VudDsKKyAgICBwQWNxdWlyZVN5bmNzID0gbnVsbHB0cjsKKyAgICBwQWNxdWlyZUtleXMgPSBudWxscHRyOworICAgIHBBY3F1aXJlVGltZW91dHMgPSBudWxscHRyOworICAgIHJlbGVhc2VDb3VudCA9IHNyYy5yZWxlYXNlQ291bnQ7CisgICAgcFJlbGVhc2VTeW5jcyA9IG51bGxwdHI7CisgICAgcFJlbGVhc2VLZXlzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoYWNxdWlyZUNvdW50ICYmIHNyYy5wQWNxdWlyZVN5bmNzKSB7CisgICAgICAgIHBBY3F1aXJlU3luY3MgPSBuZXcgVmtEZXZpY2VNZW1vcnlbYWNxdWlyZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFjcXVpcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQWNxdWlyZVN5bmNzW2ldID0gc3JjLnBBY3F1aXJlU3luY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wQWNxdWlyZUtleXMpIHsKKyAgICAgICAgcEFjcXVpcmVLZXlzID0gbmV3IHVpbnQ2NF90W3NyYy5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVLZXlzLCAodm9pZCAqKXNyYy5wQWNxdWlyZUtleXMsIHNpemVvZih1aW50NjRfdCkqc3JjLmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucEFjcXVpcmVUaW1lb3V0cykgeworICAgICAgICBwQWNxdWlyZVRpbWVvdXRzID0gbmV3IHVpbnQzMl90W3NyYy5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVUaW1lb3V0cywgKHZvaWQgKilzcmMucEFjcXVpcmVUaW1lb3V0cywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuYWNxdWlyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHJlbGVhc2VDb3VudCAmJiBzcmMucFJlbGVhc2VTeW5jcykgeworICAgICAgICBwUmVsZWFzZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W3JlbGVhc2VDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWxlYXNlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFJlbGVhc2VTeW5jc1tpXSA9IHNyYy5wUmVsZWFzZVN5bmNzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucFJlbGVhc2VLZXlzKSB7CisgICAgICAgIHBSZWxlYXNlS2V5cyA9IG5ldyB1aW50NjRfdFtzcmMucmVsZWFzZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZWxlYXNlS2V5cywgKHZvaWQgKilzcmMucFJlbGVhc2VLZXlzLCBzaXplb2YodWludDY0X3QpKnNyYy5yZWxlYXNlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiYgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEFjcXVpcmVTeW5jcykKKyAgICAgICAgZGVsZXRlW10gcEFjcXVpcmVTeW5jczsKKyAgICBpZiAocEFjcXVpcmVLZXlzKQorICAgICAgICBkZWxldGVbXSBwQWNxdWlyZUtleXM7CisgICAgaWYgKHBBY3F1aXJlVGltZW91dHMpCisgICAgICAgIGRlbGV0ZVtdIHBBY3F1aXJlVGltZW91dHM7CisgICAgaWYgKHBSZWxlYXNlU3luY3MpCisgICAgICAgIGRlbGV0ZVtdIHBSZWxlYXNlU3luY3M7CisgICAgaWYgKHBSZWxlYXNlS2V5cykKKyAgICAgICAgZGVsZXRlW10gcFJlbGVhc2VLZXlzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYWNxdWlyZUNvdW50ID0gc3JjLmFjcXVpcmVDb3VudDsKKyAgICBwQWNxdWlyZVN5bmNzID0gbnVsbHB0cjsKKyAgICBwQWNxdWlyZUtleXMgPSBudWxscHRyOworICAgIHBBY3F1aXJlVGltZW91dHMgPSBudWxscHRyOworICAgIHJlbGVhc2VDb3VudCA9IHNyYy5yZWxlYXNlQ291bnQ7CisgICAgcFJlbGVhc2VTeW5jcyA9IG51bGxwdHI7CisgICAgcFJlbGVhc2VLZXlzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoYWNxdWlyZUNvdW50ICYmIHNyYy5wQWNxdWlyZVN5bmNzKSB7CisgICAgICAgIHBBY3F1aXJlU3luY3MgPSBuZXcgVmtEZXZpY2VNZW1vcnlbYWNxdWlyZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFjcXVpcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQWNxdWlyZVN5bmNzW2ldID0gc3JjLnBBY3F1aXJlU3luY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wQWNxdWlyZUtleXMpIHsKKyAgICAgICAgcEFjcXVpcmVLZXlzID0gbmV3IHVpbnQ2NF90W3NyYy5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVLZXlzLCAodm9pZCAqKXNyYy5wQWNxdWlyZUtleXMsIHNpemVvZih1aW50NjRfdCkqc3JjLmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucEFjcXVpcmVUaW1lb3V0cykgeworICAgICAgICBwQWNxdWlyZVRpbWVvdXRzID0gbmV3IHVpbnQzMl90W3NyYy5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVUaW1lb3V0cywgKHZvaWQgKilzcmMucEFjcXVpcmVUaW1lb3V0cywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuYWNxdWlyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHJlbGVhc2VDb3VudCAmJiBzcmMucFJlbGVhc2VTeW5jcykgeworICAgICAgICBwUmVsZWFzZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W3JlbGVhc2VDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWxlYXNlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFJlbGVhc2VTeW5jc1tpXSA9IHNyYy5wUmVsZWFzZVN5bmNzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucFJlbGVhc2VLZXlzKSB7CisgICAgICAgIHBSZWxlYXNlS2V5cyA9IG5ldyB1aW50NjRfdFtzcmMucmVsZWFzZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZWxlYXNlS2V5cywgKHZvaWQgKilzcmMucFJlbGVhc2VLZXlzLCBzaXplb2YodWludDY0X3QpKnNyYy5yZWxlYXNlQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUjo6fnNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIoKQoreworICAgIGlmIChwQWNxdWlyZVN5bmNzKQorICAgICAgICBkZWxldGVbXSBwQWNxdWlyZVN5bmNzOworICAgIGlmIChwQWNxdWlyZUtleXMpCisgICAgICAgIGRlbGV0ZVtdIHBBY3F1aXJlS2V5czsKKyAgICBpZiAocEFjcXVpcmVUaW1lb3V0cykKKyAgICAgICAgZGVsZXRlW10gcEFjcXVpcmVUaW1lb3V0czsKKyAgICBpZiAocFJlbGVhc2VTeW5jcykKKyAgICAgICAgZGVsZXRlW10gcFJlbGVhc2VTeW5jczsKKyAgICBpZiAocFJlbGVhc2VLZXlzKQorICAgICAgICBkZWxldGVbXSBwUmVsZWFzZUtleXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBhY3F1aXJlQ291bnQgPSBpbl9zdHJ1Y3QtPmFjcXVpcmVDb3VudDsKKyAgICBwQWNxdWlyZVN5bmNzID0gbnVsbHB0cjsKKyAgICBwQWNxdWlyZUtleXMgPSBudWxscHRyOworICAgIHBBY3F1aXJlVGltZW91dHMgPSBudWxscHRyOworICAgIHJlbGVhc2VDb3VudCA9IGluX3N0cnVjdC0+cmVsZWFzZUNvdW50OworICAgIHBSZWxlYXNlU3luY3MgPSBudWxscHRyOworICAgIHBSZWxlYXNlS2V5cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChhY3F1aXJlQ291bnQgJiYgaW5fc3RydWN0LT5wQWNxdWlyZVN5bmNzKSB7CisgICAgICAgIHBBY3F1aXJlU3luY3MgPSBuZXcgVmtEZXZpY2VNZW1vcnlbYWNxdWlyZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFjcXVpcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQWNxdWlyZVN5bmNzW2ldID0gaW5fc3RydWN0LT5wQWNxdWlyZVN5bmNzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBBY3F1aXJlS2V5cykgeworICAgICAgICBwQWNxdWlyZUtleXMgPSBuZXcgdWludDY0X3RbaW5fc3RydWN0LT5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVLZXlzLCAodm9pZCAqKWluX3N0cnVjdC0+cEFjcXVpcmVLZXlzLCBzaXplb2YodWludDY0X3QpKmluX3N0cnVjdC0+YWNxdWlyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cEFjcXVpcmVUaW1lb3V0cykgeworICAgICAgICBwQWNxdWlyZVRpbWVvdXRzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+YWNxdWlyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBY3F1aXJlVGltZW91dHMsICh2b2lkICopaW5fc3RydWN0LT5wQWNxdWlyZVRpbWVvdXRzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+YWNxdWlyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHJlbGVhc2VDb3VudCAmJiBpbl9zdHJ1Y3QtPnBSZWxlYXNlU3luY3MpIHsKKyAgICAgICAgcFJlbGVhc2VTeW5jcyA9IG5ldyBWa0RldmljZU1lbW9yeVtyZWxlYXNlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVsZWFzZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZWxlYXNlU3luY3NbaV0gPSBpbl9zdHJ1Y3QtPnBSZWxlYXNlU3luY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFJlbGVhc2VLZXlzKSB7CisgICAgICAgIHBSZWxlYXNlS2V5cyA9IG5ldyB1aW50NjRfdFtpbl9zdHJ1Y3QtPnJlbGVhc2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUmVsZWFzZUtleXMsICh2b2lkICopaW5fc3RydWN0LT5wUmVsZWFzZUtleXMsIHNpemVvZih1aW50NjRfdCkqaW5fc3RydWN0LT5yZWxlYXNlQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgYWNxdWlyZUNvdW50ID0gc3JjLT5hY3F1aXJlQ291bnQ7CisgICAgcEFjcXVpcmVTeW5jcyA9IG51bGxwdHI7CisgICAgcEFjcXVpcmVLZXlzID0gbnVsbHB0cjsKKyAgICBwQWNxdWlyZVRpbWVvdXRzID0gbnVsbHB0cjsKKyAgICByZWxlYXNlQ291bnQgPSBzcmMtPnJlbGVhc2VDb3VudDsKKyAgICBwUmVsZWFzZVN5bmNzID0gbnVsbHB0cjsKKyAgICBwUmVsZWFzZUtleXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoYWNxdWlyZUNvdW50ICYmIHNyYy0+cEFjcXVpcmVTeW5jcykgeworICAgICAgICBwQWNxdWlyZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W2FjcXVpcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3F1aXJlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEFjcXVpcmVTeW5jc1tpXSA9IHNyYy0+cEFjcXVpcmVTeW5jc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3JjLT5wQWNxdWlyZUtleXMpIHsKKyAgICAgICAgcEFjcXVpcmVLZXlzID0gbmV3IHVpbnQ2NF90W3NyYy0+YWNxdWlyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBY3F1aXJlS2V5cywgKHZvaWQgKilzcmMtPnBBY3F1aXJlS2V5cywgc2l6ZW9mKHVpbnQ2NF90KSpzcmMtPmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMtPnBBY3F1aXJlVGltZW91dHMpIHsKKyAgICAgICAgcEFjcXVpcmVUaW1lb3V0cyA9IG5ldyB1aW50MzJfdFtzcmMtPmFjcXVpcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQWNxdWlyZVRpbWVvdXRzLCAodm9pZCAqKXNyYy0+cEFjcXVpcmVUaW1lb3V0cywgc2l6ZW9mKHVpbnQzMl90KSpzcmMtPmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChyZWxlYXNlQ291bnQgJiYgc3JjLT5wUmVsZWFzZVN5bmNzKSB7CisgICAgICAgIHBSZWxlYXNlU3luY3MgPSBuZXcgVmtEZXZpY2VNZW1vcnlbcmVsZWFzZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlbGVhc2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwUmVsZWFzZVN5bmNzW2ldID0gc3JjLT5wUmVsZWFzZVN5bmNzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMtPnBSZWxlYXNlS2V5cykgeworICAgICAgICBwUmVsZWFzZUtleXMgPSBuZXcgdWludDY0X3Rbc3JjLT5yZWxlYXNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFJlbGVhc2VLZXlzLCAodm9pZCAqKXNyYy0+cFJlbGVhc2VLZXlzLCBzaXplb2YodWludDY0X3QpKnNyYy0+cmVsZWFzZUNvdW50KTsKKyAgICB9Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNlbWFwaG9yZShpbl9zdHJ1Y3QtPnNlbWFwaG9yZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgaGFuZGxlVHlwZShpbl9zdHJ1Y3QtPmhhbmRsZVR5cGUpLAorICAgIGhhbmRsZShpbl9zdHJ1Y3QtPmhhbmRsZSksCisgICAgbmFtZShpbl9zdHJ1Y3QtPm5hbWUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBzcmMuc2VtYXBob3JlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBoYW5kbGUgPSBzcmMuaGFuZGxlOworICAgIG5hbWUgPSBzcmMubmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiYgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNlbWFwaG9yZSA9IHNyYy5zZW1hcGhvcmU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIGhhbmRsZSA9IHNyYy5oYW5kbGU7CisgICAgbmFtZSA9IHNyYy5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSOjp+c2FmZV9Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBpbl9zdHJ1Y3QtPnNlbWFwaG9yZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBoYW5kbGUgPSBpbl9zdHJ1Y3QtPmhhbmRsZTsKKyAgICBuYW1lID0gaW5fc3RydWN0LT5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2VtYXBob3JlID0gc3JjLT5zZW1hcGhvcmU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGhhbmRsZVR5cGUgPSBzcmMtPmhhbmRsZVR5cGU7CisgICAgaGFuZGxlID0gc3JjLT5oYW5kbGU7CisgICAgbmFtZSA9IHNyYy0+bmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBBdHRyaWJ1dGVzKG51bGxwdHIpLAorICAgIGR3QWNjZXNzKGluX3N0cnVjdC0+ZHdBY2Nlc3MpLAorICAgIG5hbWUoaW5fc3RydWN0LT5uYW1lKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCppbl9zdHJ1Y3QtPnBBdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3NhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEF0dHJpYnV0ZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoY29uc3Qgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBBdHRyaWJ1dGVzID0gbnVsbHB0cjsKKyAgICBkd0FjY2VzcyA9IHNyYy5kd0FjY2VzczsKKyAgICBuYW1lID0gc3JjLm5hbWU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCpzcmMucEF0dHJpYnV0ZXMpOworICAgIH0KK30KKworc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiYgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEF0dHJpYnV0ZXMpCisgICAgICAgIGRlbGV0ZSBwQXR0cmlidXRlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBBdHRyaWJ1dGVzID0gbnVsbHB0cjsKKyAgICBkd0FjY2VzcyA9IHNyYy5kd0FjY2VzczsKKyAgICBuYW1lID0gc3JjLm5hbWU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCpzcmMucEF0dHJpYnV0ZXMpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjo6fnNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoKQoreworICAgIGlmIChwQXR0cmlidXRlcykKKyAgICAgICAgZGVsZXRlIHBBdHRyaWJ1dGVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcEF0dHJpYnV0ZXMgPSBudWxscHRyOworICAgIGR3QWNjZXNzID0gaW5fc3RydWN0LT5kd0FjY2VzczsKKyAgICBuYW1lID0gaW5fc3RydWN0LT5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCppbl9zdHJ1Y3QtPnBBdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBBdHRyaWJ1dGVzID0gbnVsbHB0cjsKKyAgICBkd0FjY2VzcyA9IHNyYy0+ZHdBY2Nlc3M7CisgICAgbmFtZSA9IHNyYy0+bmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgcEF0dHJpYnV0ZXMgPSBuZXcgU0VDVVJJVFlfQVRUUklCVVRFUygqc3JjLT5wQXR0cmlidXRlcyk7CisgICAgfQorfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitzYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFI6OnNhZmVfVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUihjb25zdCBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB3YWl0U2VtYXBob3JlVmFsdWVzQ291bnQoaW5fc3RydWN0LT53YWl0U2VtYXBob3JlVmFsdWVzQ291bnQpLAorICAgIHBXYWl0U2VtYXBob3JlVmFsdWVzKG51bGxwdHIpLAorICAgIHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50KGluX3N0cnVjdC0+c2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQpLAorICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFdhaXRTZW1hcGhvcmVWYWx1ZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSBuZXcgdWludDY0X3RbaW5fc3RydWN0LT53YWl0U2VtYXBob3JlVmFsdWVzQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFdhaXRTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPndhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMpIHsKKyAgICAgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9IG5ldyB1aW50NjRfdFtpbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTaWduYWxTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopaW5fc3RydWN0LT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzLCBzaXplb2YodWludDY0X3QpKmluX3N0cnVjdC0+c2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSOjpzYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMobnVsbHB0ciksCisgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyhudWxscHRyKQore30KKworc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSOjpzYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIoY29uc3Qgc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgd2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50ID0gc3JjLndhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudDsKKyAgICBwV2FpdFNlbWFwaG9yZVZhbHVlcyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQgPSBzcmMuc2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQ7CisgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wV2FpdFNlbWFwaG9yZVZhbHVlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZVZhbHVlcyA9IG5ldyB1aW50NjRfdFtzcmMud2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBXYWl0U2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKXNyYy5wV2FpdFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSpzcmMud2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wU2lnbmFsU2VtYXBob3JlVmFsdWVzKSB7CisgICAgICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPSBuZXcgdWludDY0X3Rbc3JjLnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTaWduYWxTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopc3JjLnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMsIHNpemVvZih1aW50NjRfdCkqc3JjLnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiYgc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBXYWl0U2VtYXBob3JlVmFsdWVzKQorICAgICAgICBkZWxldGVbXSBwV2FpdFNlbWFwaG9yZVZhbHVlczsKKyAgICBpZiAocFNpZ25hbFNlbWFwaG9yZVZhbHVlcykKKyAgICAgICAgZGVsZXRlW10gcFNpZ25hbFNlbWFwaG9yZVZhbHVlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudCA9IHNyYy53YWl0U2VtYXBob3JlVmFsdWVzQ291bnQ7CisgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSBudWxscHRyOworICAgIHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50ID0gc3JjLnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50OworICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFdhaXRTZW1hcGhvcmVWYWx1ZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSBuZXcgdWludDY0X3Rbc3JjLndhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwV2FpdFNlbWFwaG9yZVZhbHVlcywgKHZvaWQgKilzcmMucFdhaXRTZW1hcGhvcmVWYWx1ZXMsIHNpemVvZih1aW50NjRfdCkqc3JjLndhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucFNpZ25hbFNlbWFwaG9yZVZhbHVlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlVmFsdWVzID0gbmV3IHVpbnQ2NF90W3NyYy5zaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2lnbmFsU2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKXNyYy5wU2lnbmFsU2VtYXBob3JlVmFsdWVzLCBzaXplb2YodWludDY0X3QpKnNyYy5zaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFI6On5zYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIoKQoreworICAgIGlmIChwV2FpdFNlbWFwaG9yZVZhbHVlcykKKyAgICAgICAgZGVsZXRlW10gcFdhaXRTZW1hcGhvcmVWYWx1ZXM7CisgICAgaWYgKHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMpCisgICAgICAgIGRlbGV0ZVtdIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgd2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50ID0gaW5fc3RydWN0LT53YWl0U2VtYXBob3JlVmFsdWVzQ291bnQ7CisgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSBudWxscHRyOworICAgIHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50ID0gaW5fc3RydWN0LT5zaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudDsKKyAgICBwU2lnbmFsU2VtYXBob3JlVmFsdWVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFdhaXRTZW1hcGhvcmVWYWx1ZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSBuZXcgdWludDY0X3RbaW5fc3RydWN0LT53YWl0U2VtYXBob3JlVmFsdWVzQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFdhaXRTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPndhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMpIHsKKyAgICAgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9IG5ldyB1aW50NjRfdFtpbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTaWduYWxTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopaW5fc3RydWN0LT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzLCBzaXplb2YodWludDY0X3QpKmluX3N0cnVjdC0+c2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudCA9IHNyYy0+d2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50OworICAgIHBXYWl0U2VtYXBob3JlVmFsdWVzID0gbnVsbHB0cjsKKyAgICBzaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudCA9IHNyYy0+c2lnbmFsU2VtYXBob3JlVmFsdWVzQ291bnQ7CisgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBXYWl0U2VtYXBob3JlVmFsdWVzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlVmFsdWVzID0gbmV3IHVpbnQ2NF90W3NyYy0+d2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBXYWl0U2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKXNyYy0+cFdhaXRTZW1hcGhvcmVWYWx1ZXMsIHNpemVvZih1aW50NjRfdCkqc3JjLT53YWl0U2VtYXBob3JlVmFsdWVzQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzKSB7CisgICAgICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPSBuZXcgdWludDY0X3Rbc3JjLT5zaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2lnbmFsU2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKXNyYy0+cFNpZ25hbFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSpzcmMtPnNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50KTsKKyAgICB9Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNlbWFwaG9yZShpbl9zdHJ1Y3QtPnNlbWFwaG9yZSksCisgICAgaGFuZGxlVHlwZShpbl9zdHJ1Y3QtPmhhbmRsZVR5cGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBzcmMuc2VtYXBob3JlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiYgc2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNlbWFwaG9yZSA9IHNyYy5zZW1hcGhvcmU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSOjp+c2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBpbl9zdHJ1Y3QtPnNlbWFwaG9yZTsKKyAgICBoYW5kbGVUeXBlID0gaW5fc3RydWN0LT5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2VtYXBob3JlID0gc3JjLT5zZW1hcGhvcmU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFI6OnNhZmVfVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIoY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNlbWFwaG9yZShpbl9zdHJ1Y3QtPnNlbWFwaG9yZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgaGFuZGxlVHlwZShpbl9zdHJ1Y3QtPmhhbmRsZVR5cGUpLAorICAgIGZkKGluX3N0cnVjdC0+ZmQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKGNvbnN0IHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBzcmMuc2VtYXBob3JlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBmZCA9IHNyYy5mZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiYgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNlbWFwaG9yZSA9IHNyYy5zZW1hcGhvcmU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIGZkID0gc3JjLmZkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSOjp+c2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBpbl9zdHJ1Y3QtPnNlbWFwaG9yZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBmZCA9IGluX3N0cnVjdC0+ZmQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBzcmMtPnNlbWFwaG9yZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgaGFuZGxlVHlwZSA9IHNyYy0+aGFuZGxlVHlwZTsKKyAgICBmZCA9IHNyYy0+ZmQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSOjpzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzZW1hcGhvcmUoaW5fc3RydWN0LT5zZW1hcGhvcmUpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUjo6c2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUjo6c2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUihjb25zdCBzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2VtYXBob3JlID0gc3JjLnNlbWFwaG9yZTsKKyAgICBoYW5kbGVUeXBlID0gc3JjLmhhbmRsZVR5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTZW1hcGhvcmVHZXRGZEluZm9LSFImIHNhZmVfVmtTZW1hcGhvcmVHZXRGZEluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBzcmMuc2VtYXBob3JlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUjo6fnNhZmVfVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTZW1hcGhvcmVHZXRGZEluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2VtYXBob3JlID0gaW5fc3RydWN0LT5zZW1hcGhvcmU7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNlbWFwaG9yZSA9IHNyYy0+c2VtYXBob3JlOworICAgIGhhbmRsZVR5cGUgPSBzcmMtPmhhbmRsZVR5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtYXhQdXNoRGVzY3JpcHRvcnMoaW5fc3RydWN0LT5tYXhQdXNoRGVzY3JpcHRvcnMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4UHVzaERlc2NyaXB0b3JzID0gc3JjLm1heFB1c2hEZXNjcmlwdG9yczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heFB1c2hEZXNjcmlwdG9ycyA9IHNyYy5tYXhQdXNoRGVzY3JpcHRvcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUjo6fnNhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWF4UHVzaERlc2NyaXB0b3JzID0gaW5fc3RydWN0LT5tYXhQdXNoRGVzY3JpcHRvcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWF4UHVzaERlc2NyaXB0b3JzID0gc3JjLT5tYXhQdXNoRGVzY3JpcHRvcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzaGFkZXJGbG9hdDE2KGluX3N0cnVjdC0+c2hhZGVyRmxvYXQxNiksCisgICAgc2hhZGVySW50OChpbl9zdHJ1Y3QtPnNoYWRlckludDgpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJGbG9hdDE2ID0gc3JjLnNoYWRlckZsb2F0MTY7CisgICAgc2hhZGVySW50OCA9IHNyYy5zaGFkZXJJbnQ4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyRmxvYXQxNiA9IHNyYy5zaGFkZXJGbG9hdDE2OworICAgIHNoYWRlckludDggPSBzcmMuc2hhZGVySW50ODsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUjo6fnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2hhZGVyRmxvYXQxNiA9IGluX3N0cnVjdC0+c2hhZGVyRmxvYXQxNjsKKyAgICBzaGFkZXJJbnQ4ID0gaW5fc3RydWN0LT5zaGFkZXJJbnQ4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2hhZGVyRmxvYXQxNiA9IHNyYy0+c2hhZGVyRmxvYXQxNjsKKyAgICBzaGFkZXJJbnQ4ID0gc3JjLT5zaGFkZXJJbnQ4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1ByZXNlbnRSZWdpb25LSFI6OnNhZmVfVmtQcmVzZW50UmVnaW9uS0hSKGNvbnN0IFZrUHJlc2VudFJlZ2lvbktIUiogaW5fc3RydWN0KSA6CisgICAgcmVjdGFuZ2xlQ291bnQoaW5fc3RydWN0LT5yZWN0YW5nbGVDb3VudCksCisgICAgcFJlY3RhbmdsZXMobnVsbHB0cikKK3sKKyAgICBpZiAoaW5fc3RydWN0LT5wUmVjdGFuZ2xlcykgeworICAgICAgICBwUmVjdGFuZ2xlcyA9IG5ldyBWa1JlY3RMYXllcktIUltpbl9zdHJ1Y3QtPnJlY3RhbmdsZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZWN0YW5nbGVzLCAodm9pZCAqKWluX3N0cnVjdC0+cFJlY3RhbmdsZXMsIHNpemVvZihWa1JlY3RMYXllcktIUikqaW5fc3RydWN0LT5yZWN0YW5nbGVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUjo6c2FmZV9Wa1ByZXNlbnRSZWdpb25LSFIoKSA6CisgICAgcFJlY3RhbmdsZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQcmVzZW50UmVnaW9uS0hSOjpzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUihjb25zdCBzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUiYgc3JjKQoreworICAgIHJlY3RhbmdsZUNvdW50ID0gc3JjLnJlY3RhbmdsZUNvdW50OworICAgIHBSZWN0YW5nbGVzID0gbnVsbHB0cjsKKyAgICBpZiAoc3JjLnBSZWN0YW5nbGVzKSB7CisgICAgICAgIHBSZWN0YW5nbGVzID0gbmV3IFZrUmVjdExheWVyS0hSW3NyYy5yZWN0YW5nbGVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUmVjdGFuZ2xlcywgKHZvaWQgKilzcmMucFJlY3RhbmdsZXMsIHNpemVvZihWa1JlY3RMYXllcktIUikqc3JjLnJlY3RhbmdsZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQcmVzZW50UmVnaW9uS0hSJiBzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQcmVzZW50UmVnaW9uS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBSZWN0YW5nbGVzKQorICAgICAgICBkZWxldGVbXSBwUmVjdGFuZ2xlczsKKworICAgIHJlY3RhbmdsZUNvdW50ID0gc3JjLnJlY3RhbmdsZUNvdW50OworICAgIHBSZWN0YW5nbGVzID0gbnVsbHB0cjsKKyAgICBpZiAoc3JjLnBSZWN0YW5nbGVzKSB7CisgICAgICAgIHBSZWN0YW5nbGVzID0gbmV3IFZrUmVjdExheWVyS0hSW3NyYy5yZWN0YW5nbGVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUmVjdGFuZ2xlcywgKHZvaWQgKilzcmMucFJlY3RhbmdsZXMsIHNpemVvZihWa1JlY3RMYXllcktIUikqc3JjLnJlY3RhbmdsZUNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQcmVzZW50UmVnaW9uS0hSOjp+c2FmZV9Wa1ByZXNlbnRSZWdpb25LSFIoKQoreworICAgIGlmIChwUmVjdGFuZ2xlcykKKyAgICAgICAgZGVsZXRlW10gcFJlY3RhbmdsZXM7Cit9CisKK3ZvaWQgc2FmZV9Wa1ByZXNlbnRSZWdpb25LSFI6OmluaXRpYWxpemUoY29uc3QgVmtQcmVzZW50UmVnaW9uS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgcmVjdGFuZ2xlQ291bnQgPSBpbl9zdHJ1Y3QtPnJlY3RhbmdsZUNvdW50OworICAgIHBSZWN0YW5nbGVzID0gbnVsbHB0cjsKKyAgICBpZiAoaW5fc3RydWN0LT5wUmVjdGFuZ2xlcykgeworICAgICAgICBwUmVjdGFuZ2xlcyA9IG5ldyBWa1JlY3RMYXllcktIUltpbl9zdHJ1Y3QtPnJlY3RhbmdsZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZWN0YW5nbGVzLCAodm9pZCAqKWluX3N0cnVjdC0+cFJlY3RhbmdsZXMsIHNpemVvZihWa1JlY3RMYXllcktIUikqaW5fc3RydWN0LT5yZWN0YW5nbGVDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtQcmVzZW50UmVnaW9uS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQcmVzZW50UmVnaW9uS0hSKiBzcmMpCit7CisgICAgcmVjdGFuZ2xlQ291bnQgPSBzcmMtPnJlY3RhbmdsZUNvdW50OworICAgIHBSZWN0YW5nbGVzID0gbnVsbHB0cjsKKyAgICBpZiAoc3JjLT5wUmVjdGFuZ2xlcykgeworICAgICAgICBwUmVjdGFuZ2xlcyA9IG5ldyBWa1JlY3RMYXllcktIUltzcmMtPnJlY3RhbmdsZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZWN0YW5nbGVzLCAodm9pZCAqKXNyYy0+cFJlY3RhbmdsZXMsIHNpemVvZihWa1JlY3RMYXllcktIUikqc3JjLT5yZWN0YW5nbGVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUHJlc2VudFJlZ2lvbnNLSFI6OnNhZmVfVmtQcmVzZW50UmVnaW9uc0tIUihjb25zdCBWa1ByZXNlbnRSZWdpb25zS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzd2FwY2hhaW5Db3VudChpbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50KSwKKyAgICBwUmVnaW9ucyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoc3dhcGNoYWluQ291bnQgJiYgaW5fc3RydWN0LT5wUmVnaW9ucykgeworICAgICAgICBwUmVnaW9ucyA9IG5ldyBzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUltzd2FwY2hhaW5Db3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5Db3VudDsgKytpKSB7CisgICAgICAgICAgICBwUmVnaW9uc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBSZWdpb25zW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSOjpzYWZlX1ZrUHJlc2VudFJlZ2lvbnNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFJlZ2lvbnMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQcmVzZW50UmVnaW9uc0tIUjo6c2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSKGNvbnN0IHNhZmVfVmtQcmVzZW50UmVnaW9uc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN3YXBjaGFpbkNvdW50ID0gc3JjLnN3YXBjaGFpbkNvdW50OworICAgIHBSZWdpb25zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3dhcGNoYWluQ291bnQgJiYgc3JjLnBSZWdpb25zKSB7CisgICAgICAgIHBSZWdpb25zID0gbmV3IHNhZmVfVmtQcmVzZW50UmVnaW9uS0hSW3N3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN3YXBjaGFpbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZWdpb25zW2ldLmluaXRpYWxpemUoJnNyYy5wUmVnaW9uc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtQcmVzZW50UmVnaW9uc0tIUiYgc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBSZWdpb25zKQorICAgICAgICBkZWxldGVbXSBwUmVnaW9uczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN3YXBjaGFpbkNvdW50ID0gc3JjLnN3YXBjaGFpbkNvdW50OworICAgIHBSZWdpb25zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3dhcGNoYWluQ291bnQgJiYgc3JjLnBSZWdpb25zKSB7CisgICAgICAgIHBSZWdpb25zID0gbmV3IHNhZmVfVmtQcmVzZW50UmVnaW9uS0hSW3N3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN3YXBjaGFpbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZWdpb25zW2ldLmluaXRpYWxpemUoJnNyYy5wUmVnaW9uc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQcmVzZW50UmVnaW9uc0tIUjo6fnNhZmVfVmtQcmVzZW50UmVnaW9uc0tIUigpCit7CisgICAgaWYgKHBSZWdpb25zKQorICAgICAgICBkZWxldGVbXSBwUmVnaW9uczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUHJlc2VudFJlZ2lvbnNLSFI6OmluaXRpYWxpemUoY29uc3QgVmtQcmVzZW50UmVnaW9uc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzd2FwY2hhaW5Db3VudCA9IGluX3N0cnVjdC0+c3dhcGNoYWluQ291bnQ7CisgICAgcFJlZ2lvbnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoc3dhcGNoYWluQ291bnQgJiYgaW5fc3RydWN0LT5wUmVnaW9ucykgeworICAgICAgICBwUmVnaW9ucyA9IG5ldyBzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUltzd2FwY2hhaW5Db3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5Db3VudDsgKytpKSB7CisgICAgICAgICAgICBwUmVnaW9uc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBSZWdpb25zW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUHJlc2VudFJlZ2lvbnNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHN3YXBjaGFpbkNvdW50ID0gc3JjLT5zd2FwY2hhaW5Db3VudDsKKyAgICBwUmVnaW9ucyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzd2FwY2hhaW5Db3VudCAmJiBzcmMtPnBSZWdpb25zKSB7CisgICAgICAgIHBSZWdpb25zID0gbmV3IHNhZmVfVmtQcmVzZW50UmVnaW9uS0hSW3N3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN3YXBjaGFpbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZWdpb25zW2ldLmluaXRpYWxpemUoJnNyYy0+cFJlZ2lvbnNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBpbWFnZWxlc3NGcmFtZWJ1ZmZlcihpbl9zdHJ1Y3QtPmltYWdlbGVzc0ZyYW1lYnVmZmVyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW1hZ2VsZXNzRnJhbWVidWZmZXIgPSBzcmMuaW1hZ2VsZXNzRnJhbWVidWZmZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFImIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbWFnZWxlc3NGcmFtZWJ1ZmZlciA9IHNyYy5pbWFnZWxlc3NGcmFtZWJ1ZmZlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUjo6fnNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFI6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaW1hZ2VsZXNzRnJhbWVidWZmZXIgPSBpbl9zdHJ1Y3QtPmltYWdlbGVzc0ZyYW1lYnVmZmVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW1hZ2VsZXNzRnJhbWVidWZmZXIgPSBzcmMtPmltYWdlbGVzc0ZyYW1lYnVmZmVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUjo6c2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUihjb25zdCBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgdXNhZ2UoaW5fc3RydWN0LT51c2FnZSksCisgICAgd2lkdGgoaW5fc3RydWN0LT53aWR0aCksCisgICAgaGVpZ2h0KGluX3N0cnVjdC0+aGVpZ2h0KSwKKyAgICBsYXllckNvdW50KGluX3N0cnVjdC0+bGF5ZXJDb3VudCksCisgICAgdmlld0Zvcm1hdENvdW50KGluX3N0cnVjdC0+dmlld0Zvcm1hdENvdW50KSwKKyAgICBwVmlld0Zvcm1hdHMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFZpZXdGb3JtYXRzKSB7CisgICAgICAgIHBWaWV3Rm9ybWF0cyA9IG5ldyBWa0Zvcm1hdFtpbl9zdHJ1Y3QtPnZpZXdGb3JtYXRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld0Zvcm1hdHMsICh2b2lkICopaW5fc3RydWN0LT5wVmlld0Zvcm1hdHMsIHNpemVvZihWa0Zvcm1hdCkqaW5fc3RydWN0LT52aWV3Rm9ybWF0Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUjo6c2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwVmlld0Zvcm1hdHMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFI6OnNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIoY29uc3Qgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHVzYWdlID0gc3JjLnVzYWdlOworICAgIHdpZHRoID0gc3JjLndpZHRoOworICAgIGhlaWdodCA9IHNyYy5oZWlnaHQ7CisgICAgbGF5ZXJDb3VudCA9IHNyYy5sYXllckNvdW50OworICAgIHZpZXdGb3JtYXRDb3VudCA9IHNyYy52aWV3Rm9ybWF0Q291bnQ7CisgICAgcFZpZXdGb3JtYXRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBWaWV3Rm9ybWF0cykgeworICAgICAgICBwVmlld0Zvcm1hdHMgPSBuZXcgVmtGb3JtYXRbc3JjLnZpZXdGb3JtYXRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld0Zvcm1hdHMsICh2b2lkICopc3JjLnBWaWV3Rm9ybWF0cywgc2l6ZW9mKFZrRm9ybWF0KSpzcmMudmlld0Zvcm1hdENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFImIHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBWaWV3Rm9ybWF0cykKKyAgICAgICAgZGVsZXRlW10gcFZpZXdGb3JtYXRzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgdXNhZ2UgPSBzcmMudXNhZ2U7CisgICAgd2lkdGggPSBzcmMud2lkdGg7CisgICAgaGVpZ2h0ID0gc3JjLmhlaWdodDsKKyAgICBsYXllckNvdW50ID0gc3JjLmxheWVyQ291bnQ7CisgICAgdmlld0Zvcm1hdENvdW50ID0gc3JjLnZpZXdGb3JtYXRDb3VudDsKKyAgICBwVmlld0Zvcm1hdHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFZpZXdGb3JtYXRzKSB7CisgICAgICAgIHBWaWV3Rm9ybWF0cyA9IG5ldyBWa0Zvcm1hdFtzcmMudmlld0Zvcm1hdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3Rm9ybWF0cywgKHZvaWQgKilzcmMucFZpZXdGb3JtYXRzLCBzaXplb2YoVmtGb3JtYXQpKnNyYy52aWV3Rm9ybWF0Q291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUjo6fnNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIoKQoreworICAgIGlmIChwVmlld0Zvcm1hdHMpCisgICAgICAgIGRlbGV0ZVtdIHBWaWV3Rm9ybWF0czsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICB1c2FnZSA9IGluX3N0cnVjdC0+dXNhZ2U7CisgICAgd2lkdGggPSBpbl9zdHJ1Y3QtPndpZHRoOworICAgIGhlaWdodCA9IGluX3N0cnVjdC0+aGVpZ2h0OworICAgIGxheWVyQ291bnQgPSBpbl9zdHJ1Y3QtPmxheWVyQ291bnQ7CisgICAgdmlld0Zvcm1hdENvdW50ID0gaW5fc3RydWN0LT52aWV3Rm9ybWF0Q291bnQ7CisgICAgcFZpZXdGb3JtYXRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFZpZXdGb3JtYXRzKSB7CisgICAgICAgIHBWaWV3Rm9ybWF0cyA9IG5ldyBWa0Zvcm1hdFtpbl9zdHJ1Y3QtPnZpZXdGb3JtYXRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld0Zvcm1hdHMsICh2b2lkICopaW5fc3RydWN0LT5wVmlld0Zvcm1hdHMsIHNpemVvZihWa0Zvcm1hdCkqaW5fc3RydWN0LT52aWV3Rm9ybWF0Q291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHVzYWdlID0gc3JjLT51c2FnZTsKKyAgICB3aWR0aCA9IHNyYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgbGF5ZXJDb3VudCA9IHNyYy0+bGF5ZXJDb3VudDsKKyAgICB2aWV3Rm9ybWF0Q291bnQgPSBzcmMtPnZpZXdGb3JtYXRDb3VudDsKKyAgICBwVmlld0Zvcm1hdHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wVmlld0Zvcm1hdHMpIHsKKyAgICAgICAgcFZpZXdGb3JtYXRzID0gbmV3IFZrRm9ybWF0W3NyYy0+dmlld0Zvcm1hdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3Rm9ybWF0cywgKHZvaWQgKilzcmMtPnBWaWV3Rm9ybWF0cywgc2l6ZW9mKFZrRm9ybWF0KSpzcmMtPnZpZXdGb3JtYXRDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI6OnNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUihjb25zdCBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQoaW5fc3RydWN0LT5hdHRhY2htZW50SW1hZ2VJbmZvQ291bnQpLAorICAgIHBBdHRhY2htZW50SW1hZ2VJbmZvcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoYXR0YWNobWVudEltYWdlSW5mb0NvdW50ICYmIGluX3N0cnVjdC0+cEF0dGFjaG1lbnRJbWFnZUluZm9zKSB7CisgICAgICAgIHBBdHRhY2htZW50SW1hZ2VJbmZvcyA9IG5ldyBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSW2F0dGFjaG1lbnRJbWFnZUluZm9Db3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEF0dGFjaG1lbnRJbWFnZUluZm9zW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cEF0dGFjaG1lbnRJbWFnZUluZm9zW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSOjpzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEF0dGFjaG1lbnRJbWFnZUluZm9zKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI6OnNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQgPSBzcmMuYXR0YWNobWVudEltYWdlSW5mb0NvdW50OworICAgIHBBdHRhY2htZW50SW1hZ2VJbmZvcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCAmJiBzcmMucEF0dGFjaG1lbnRJbWFnZUluZm9zKSB7CisgICAgICAgIHBBdHRhY2htZW50SW1hZ2VJbmZvcyA9IG5ldyBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSW2F0dGFjaG1lbnRJbWFnZUluZm9Db3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEF0dGFjaG1lbnRJbWFnZUluZm9zW2ldLmluaXRpYWxpemUoJnNyYy5wQXR0YWNobWVudEltYWdlSW5mb3NbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFImIHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwQXR0YWNobWVudEltYWdlSW5mb3MpCisgICAgICAgIGRlbGV0ZVtdIHBBdHRhY2htZW50SW1hZ2VJbmZvczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCA9IHNyYy5hdHRhY2htZW50SW1hZ2VJbmZvQ291bnQ7CisgICAgcEF0dGFjaG1lbnRJbWFnZUluZm9zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoYXR0YWNobWVudEltYWdlSW5mb0NvdW50ICYmIHNyYy5wQXR0YWNobWVudEltYWdlSW5mb3MpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRJbWFnZUluZm9zID0gbmV3IHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFJbYXR0YWNobWVudEltYWdlSW5mb0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudDsgKytpKSB7CisgICAgICAgICAgICBwQXR0YWNobWVudEltYWdlSW5mb3NbaV0uaW5pdGlhbGl6ZSgmc3JjLnBBdHRhY2htZW50SW1hZ2VJbmZvc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjo6fnNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUigpCit7CisgICAgaWYgKHBBdHRhY2htZW50SW1hZ2VJbmZvcykKKyAgICAgICAgZGVsZXRlW10gcEF0dGFjaG1lbnRJbWFnZUluZm9zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCA9IGluX3N0cnVjdC0+YXR0YWNobWVudEltYWdlSW5mb0NvdW50OworICAgIHBBdHRhY2htZW50SW1hZ2VJbmZvcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQgJiYgaW5fc3RydWN0LT5wQXR0YWNobWVudEltYWdlSW5mb3MpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRJbWFnZUluZm9zID0gbmV3IHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFJbYXR0YWNobWVudEltYWdlSW5mb0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudDsgKytpKSB7CisgICAgICAgICAgICBwQXR0YWNobWVudEltYWdlSW5mb3NbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wQXR0YWNobWVudEltYWdlSW5mb3NbaV0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgYXR0YWNobWVudEltYWdlSW5mb0NvdW50ID0gc3JjLT5hdHRhY2htZW50SW1hZ2VJbmZvQ291bnQ7CisgICAgcEF0dGFjaG1lbnRJbWFnZUluZm9zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKGF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCAmJiBzcmMtPnBBdHRhY2htZW50SW1hZ2VJbmZvcykgeworICAgICAgICBwQXR0YWNobWVudEltYWdlSW5mb3MgPSBuZXcgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUlthdHRhY2htZW50SW1hZ2VJbmZvQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXR0YWNobWVudEltYWdlSW5mb0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBBdHRhY2htZW50SW1hZ2VJbmZvc1tpXS5pbml0aWFsaXplKCZzcmMtPnBBdHRhY2htZW50SW1hZ2VJbmZvc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjo6c2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKGNvbnN0IFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGF0dGFjaG1lbnRDb3VudChpbl9zdHJ1Y3QtPmF0dGFjaG1lbnRDb3VudCksCisgICAgcEF0dGFjaG1lbnRzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChhdHRhY2htZW50Q291bnQgJiYgaW5fc3RydWN0LT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrSW1hZ2VWaWV3W2F0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEF0dGFjaG1lbnRzW2ldID0gaW5fc3RydWN0LT5wQXR0YWNobWVudHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjo6c2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBBdHRhY2htZW50cyhudWxscHRyKQore30KKworc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSOjpzYWZlX1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYXR0YWNobWVudENvdW50ID0gc3JjLmF0dGFjaG1lbnRDb3VudDsKKyAgICBwQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChhdHRhY2htZW50Q291bnQgJiYgc3JjLnBBdHRhY2htZW50cykgeworICAgICAgICBwQXR0YWNobWVudHMgPSBuZXcgVmtJbWFnZVZpZXdbYXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQXR0YWNobWVudHNbaV0gPSBzcmMucEF0dGFjaG1lbnRzW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFImIHNhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwQXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBBdHRhY2htZW50czsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGF0dGFjaG1lbnRDb3VudCA9IHNyYy5hdHRhY2htZW50Q291bnQ7CisgICAgcEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoYXR0YWNobWVudENvdW50ICYmIHNyYy5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrSW1hZ2VWaWV3W2F0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEF0dGFjaG1lbnRzW2ldID0gc3JjLnBBdHRhY2htZW50c1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSOjp+c2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKCkKK3sKKyAgICBpZiAocEF0dGFjaG1lbnRzKQorICAgICAgICBkZWxldGVbXSBwQXR0YWNobWVudHM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYXR0YWNobWVudENvdW50ID0gaW5fc3RydWN0LT5hdHRhY2htZW50Q291bnQ7CisgICAgcEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGF0dGFjaG1lbnRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBBdHRhY2htZW50cykgeworICAgICAgICBwQXR0YWNobWVudHMgPSBuZXcgVmtJbWFnZVZpZXdbYXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQXR0YWNobWVudHNbaV0gPSBpbl9zdHJ1Y3QtPnBBdHRhY2htZW50c1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGF0dGFjaG1lbnRDb3VudCA9IHNyYy0+YXR0YWNobWVudENvdW50OworICAgIHBBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChhdHRhY2htZW50Q291bnQgJiYgc3JjLT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IFZrSW1hZ2VWaWV3W2F0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEF0dGFjaG1lbnRzW2ldID0gc3JjLT5wQXR0YWNobWVudHNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSOjpzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUihjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGZvcm1hdChpbl9zdHJ1Y3QtPmZvcm1hdCksCisgICAgc2FtcGxlcyhpbl9zdHJ1Y3QtPnNhbXBsZXMpLAorICAgIGxvYWRPcChpbl9zdHJ1Y3QtPmxvYWRPcCksCisgICAgc3RvcmVPcChpbl9zdHJ1Y3QtPnN0b3JlT3ApLAorICAgIHN0ZW5jaWxMb2FkT3AoaW5fc3RydWN0LT5zdGVuY2lsTG9hZE9wKSwKKyAgICBzdGVuY2lsU3RvcmVPcChpbl9zdHJ1Y3QtPnN0ZW5jaWxTdG9yZU9wKSwKKyAgICBpbml0aWFsTGF5b3V0KGluX3N0cnVjdC0+aW5pdGlhbExheW91dCksCisgICAgZmluYWxMYXlvdXQoaW5fc3RydWN0LT5maW5hbExheW91dCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSOjpzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFI6OnNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSKGNvbnN0IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZm9ybWF0ID0gc3JjLmZvcm1hdDsKKyAgICBzYW1wbGVzID0gc3JjLnNhbXBsZXM7CisgICAgbG9hZE9wID0gc3JjLmxvYWRPcDsKKyAgICBzdG9yZU9wID0gc3JjLnN0b3JlT3A7CisgICAgc3RlbmNpbExvYWRPcCA9IHNyYy5zdGVuY2lsTG9hZE9wOworICAgIHN0ZW5jaWxTdG9yZU9wID0gc3JjLnN0ZW5jaWxTdG9yZU9wOworICAgIGluaXRpYWxMYXlvdXQgPSBzcmMuaW5pdGlhbExheW91dDsKKyAgICBmaW5hbExheW91dCA9IHNyYy5maW5hbExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFImIHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGZvcm1hdCA9IHNyYy5mb3JtYXQ7CisgICAgc2FtcGxlcyA9IHNyYy5zYW1wbGVzOworICAgIGxvYWRPcCA9IHNyYy5sb2FkT3A7CisgICAgc3RvcmVPcCA9IHNyYy5zdG9yZU9wOworICAgIHN0ZW5jaWxMb2FkT3AgPSBzcmMuc3RlbmNpbExvYWRPcDsKKyAgICBzdGVuY2lsU3RvcmVPcCA9IHNyYy5zdGVuY2lsU3RvcmVPcDsKKyAgICBpbml0aWFsTGF5b3V0ID0gc3JjLmluaXRpYWxMYXlvdXQ7CisgICAgZmluYWxMYXlvdXQgPSBzcmMuZmluYWxMYXlvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSOjp+c2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSOjppbml0aWFsaXplKGNvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgZm9ybWF0ID0gaW5fc3RydWN0LT5mb3JtYXQ7CisgICAgc2FtcGxlcyA9IGluX3N0cnVjdC0+c2FtcGxlczsKKyAgICBsb2FkT3AgPSBpbl9zdHJ1Y3QtPmxvYWRPcDsKKyAgICBzdG9yZU9wID0gaW5fc3RydWN0LT5zdG9yZU9wOworICAgIHN0ZW5jaWxMb2FkT3AgPSBpbl9zdHJ1Y3QtPnN0ZW5jaWxMb2FkT3A7CisgICAgc3RlbmNpbFN0b3JlT3AgPSBpbl9zdHJ1Y3QtPnN0ZW5jaWxTdG9yZU9wOworICAgIGluaXRpYWxMYXlvdXQgPSBpbl9zdHJ1Y3QtPmluaXRpYWxMYXlvdXQ7CisgICAgZmluYWxMYXlvdXQgPSBpbl9zdHJ1Y3QtPmZpbmFsTGF5b3V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgZm9ybWF0ID0gc3JjLT5mb3JtYXQ7CisgICAgc2FtcGxlcyA9IHNyYy0+c2FtcGxlczsKKyAgICBsb2FkT3AgPSBzcmMtPmxvYWRPcDsKKyAgICBzdG9yZU9wID0gc3JjLT5zdG9yZU9wOworICAgIHN0ZW5jaWxMb2FkT3AgPSBzcmMtPnN0ZW5jaWxMb2FkT3A7CisgICAgc3RlbmNpbFN0b3JlT3AgPSBzcmMtPnN0ZW5jaWxTdG9yZU9wOworICAgIGluaXRpYWxMYXlvdXQgPSBzcmMtPmluaXRpYWxMYXlvdXQ7CisgICAgZmluYWxMYXlvdXQgPSBzcmMtPmZpbmFsTGF5b3V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSOjpzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgYXR0YWNobWVudChpbl9zdHJ1Y3QtPmF0dGFjaG1lbnQpLAorICAgIGxheW91dChpbl9zdHJ1Y3QtPmxheW91dCksCisgICAgYXNwZWN0TWFzayhpbl9zdHJ1Y3QtPmFzcGVjdE1hc2spCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFI6OnNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSOjpzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYXR0YWNobWVudCA9IHNyYy5hdHRhY2htZW50OworICAgIGxheW91dCA9IHNyYy5sYXlvdXQ7CisgICAgYXNwZWN0TWFzayA9IHNyYy5hc3BlY3RNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFImIHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYXR0YWNobWVudCA9IHNyYy5hdHRhY2htZW50OworICAgIGxheW91dCA9IHNyYy5sYXlvdXQ7CisgICAgYXNwZWN0TWFzayA9IHNyYy5hc3BlY3RNYXNrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFI6On5zYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGF0dGFjaG1lbnQgPSBpbl9zdHJ1Y3QtPmF0dGFjaG1lbnQ7CisgICAgbGF5b3V0ID0gaW5fc3RydWN0LT5sYXlvdXQ7CisgICAgYXNwZWN0TWFzayA9IGluX3N0cnVjdC0+YXNwZWN0TWFzazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBhdHRhY2htZW50ID0gc3JjLT5hdHRhY2htZW50OworICAgIGxheW91dCA9IHNyYy0+bGF5b3V0OworICAgIGFzcGVjdE1hc2sgPSBzcmMtPmFzcGVjdE1hc2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUjo6c2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIoY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBwaXBlbGluZUJpbmRQb2ludChpbl9zdHJ1Y3QtPnBpcGVsaW5lQmluZFBvaW50KSwKKyAgICB2aWV3TWFzayhpbl9zdHJ1Y3QtPnZpZXdNYXNrKSwKKyAgICBpbnB1dEF0dGFjaG1lbnRDb3VudChpbl9zdHJ1Y3QtPmlucHV0QXR0YWNobWVudENvdW50KSwKKyAgICBwSW5wdXRBdHRhY2htZW50cyhudWxscHRyKSwKKyAgICBjb2xvckF0dGFjaG1lbnRDb3VudChpbl9zdHJ1Y3QtPmNvbG9yQXR0YWNobWVudENvdW50KSwKKyAgICBwQ29sb3JBdHRhY2htZW50cyhudWxscHRyKSwKKyAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzKG51bGxwdHIpLAorICAgIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KG51bGxwdHIpLAorICAgIHByZXNlcnZlQXR0YWNobWVudENvdW50KGluX3N0cnVjdC0+cHJlc2VydmVBdHRhY2htZW50Q291bnQpLAorICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbnB1dEF0dGFjaG1lbnRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBJbnB1dEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUltpbnB1dEF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnB1dEF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW5wdXRBdHRhY2htZW50c1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBJbnB1dEF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29sb3JBdHRhY2htZW50Q291bnQgJiYgaW5fc3RydWN0LT5wQ29sb3JBdHRhY2htZW50cykgeworICAgICAgICBwQ29sb3JBdHRhY2htZW50cyA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFJbY29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcENvbG9yQXR0YWNobWVudHNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wQ29sb3JBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvbG9yQXR0YWNobWVudENvdW50ICYmIGluX3N0cnVjdC0+cFJlc29sdmVBdHRhY2htZW50cykgeworICAgICAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUltjb2xvckF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb2xvckF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cFJlc29sdmVBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpCisgICAgICAgIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUihpbl9zdHJ1Y3QtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wUHJlc2VydmVBdHRhY2htZW50cykgeworICAgICAgICBwUHJlc2VydmVBdHRhY2htZW50cyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPnByZXNlcnZlQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLCAodm9pZCAqKWluX3N0cnVjdC0+cFByZXNlcnZlQXR0YWNobWVudHMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUjo6c2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcElucHV0QXR0YWNobWVudHMobnVsbHB0ciksCisgICAgcENvbG9yQXR0YWNobWVudHMobnVsbHB0ciksCisgICAgcFJlc29sdmVBdHRhY2htZW50cyhudWxscHRyKSwKKyAgICBwRGVwdGhTdGVuY2lsQXR0YWNobWVudChudWxscHRyKSwKKyAgICBwUHJlc2VydmVBdHRhY2htZW50cyhudWxscHRyKQore30KKworc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFI6OnNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSKGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcGlwZWxpbmVCaW5kUG9pbnQgPSBzcmMucGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgdmlld01hc2sgPSBzcmMudmlld01hc2s7CisgICAgaW5wdXRBdHRhY2htZW50Q291bnQgPSBzcmMuaW5wdXRBdHRhY2htZW50Q291bnQ7CisgICAgcElucHV0QXR0YWNobWVudHMgPSBudWxscHRyOworICAgIGNvbG9yQXR0YWNobWVudENvdW50ID0gc3JjLmNvbG9yQXR0YWNobWVudENvdW50OworICAgIHBDb2xvckF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IG51bGxwdHI7CisgICAgcHJlc2VydmVBdHRhY2htZW50Q291bnQgPSBzcmMucHJlc2VydmVBdHRhY2htZW50Q291bnQ7CisgICAgcFByZXNlcnZlQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChpbnB1dEF0dGFjaG1lbnRDb3VudCAmJiBzcmMucElucHV0QXR0YWNobWVudHMpIHsKKyAgICAgICAgcElucHV0QXR0YWNobWVudHMgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSW2lucHV0QXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGlucHV0QXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbnB1dEF0dGFjaG1lbnRzW2ldLmluaXRpYWxpemUoJnNyYy5wSW5wdXRBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvbG9yQXR0YWNobWVudENvdW50ICYmIHNyYy5wQ29sb3JBdHRhY2htZW50cykgeworICAgICAgICBwQ29sb3JBdHRhY2htZW50cyA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFJbY29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcENvbG9yQXR0YWNobWVudHNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBDb2xvckF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29sb3JBdHRhY2htZW50Q291bnQgJiYgc3JjLnBSZXNvbHZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFJbY29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcFJlc29sdmVBdHRhY2htZW50c1tpXS5pbml0aWFsaXplKCZzcmMucFJlc29sdmVBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCkKKyAgICAgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKCpzcmMucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpOworICAgIGlmIChzcmMucFByZXNlcnZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgcFByZXNlcnZlQXR0YWNobWVudHMgPSBuZXcgdWludDMyX3Rbc3JjLnByZXNlcnZlQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLCAodm9pZCAqKXNyYy5wUHJlc2VydmVBdHRhY2htZW50cywgc2l6ZW9mKHVpbnQzMl90KSpzcmMucHJlc2VydmVBdHRhY2htZW50Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFImIHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocElucHV0QXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBJbnB1dEF0dGFjaG1lbnRzOworICAgIGlmIChwQ29sb3JBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcENvbG9yQXR0YWNobWVudHM7CisgICAgaWYgKHBSZXNvbHZlQXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBSZXNvbHZlQXR0YWNobWVudHM7CisgICAgaWYgKHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KQorICAgICAgICBkZWxldGUgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ7CisgICAgaWYgKHBQcmVzZXJ2ZUF0dGFjaG1lbnRzKQorICAgICAgICBkZWxldGVbXSBwUHJlc2VydmVBdHRhY2htZW50czsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBpcGVsaW5lQmluZFBvaW50ID0gc3JjLnBpcGVsaW5lQmluZFBvaW50OworICAgIHZpZXdNYXNrID0gc3JjLnZpZXdNYXNrOworICAgIGlucHV0QXR0YWNobWVudENvdW50ID0gc3JjLmlucHV0QXR0YWNobWVudENvdW50OworICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBjb2xvckF0dGFjaG1lbnRDb3VudCA9IHNyYy5jb2xvckF0dGFjaG1lbnRDb3VudDsKKyAgICBwQ29sb3JBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxscHRyOworICAgIHByZXNlcnZlQXR0YWNobWVudENvdW50ID0gc3JjLnByZXNlcnZlQXR0YWNobWVudENvdW50OworICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoaW5wdXRBdHRhY2htZW50Q291bnQgJiYgc3JjLnBJbnB1dEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUltpbnB1dEF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnB1dEF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW5wdXRBdHRhY2htZW50c1tpXS5pbml0aWFsaXplKCZzcmMucElucHV0QXR0YWNobWVudHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb2xvckF0dGFjaG1lbnRDb3VudCAmJiBzcmMucENvbG9yQXR0YWNobWVudHMpIHsKKyAgICAgICAgcENvbG9yQXR0YWNobWVudHMgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSW2NvbG9yQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbG9yQXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBDb2xvckF0dGFjaG1lbnRzW2ldLmluaXRpYWxpemUoJnNyYy5wQ29sb3JBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvbG9yQXR0YWNobWVudENvdW50ICYmIHNyYy5wUmVzb2x2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBSZXNvbHZlQXR0YWNobWVudHMgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSW2NvbG9yQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbG9yQXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZXNvbHZlQXR0YWNobWVudHNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBSZXNvbHZlQXR0YWNobWVudHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpCisgICAgICAgIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUigqc3JjLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTsKKyAgICBpZiAoc3JjLnBQcmVzZXJ2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID0gbmV3IHVpbnQzMl90W3NyYy5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUHJlc2VydmVBdHRhY2htZW50cywgKHZvaWQgKilzcmMucFByZXNlcnZlQXR0YWNobWVudHMsIHNpemVvZih1aW50MzJfdCkqc3JjLnByZXNlcnZlQXR0YWNobWVudENvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSOjp+c2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIoKQoreworICAgIGlmIChwSW5wdXRBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcElucHV0QXR0YWNobWVudHM7CisgICAgaWYgKHBDb2xvckF0dGFjaG1lbnRzKQorICAgICAgICBkZWxldGVbXSBwQ29sb3JBdHRhY2htZW50czsKKyAgICBpZiAocFJlc29sdmVBdHRhY2htZW50cykKKyAgICAgICAgZGVsZXRlW10gcFJlc29sdmVBdHRhY2htZW50czsKKyAgICBpZiAocERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpCisgICAgICAgIGRlbGV0ZSBwRGVwdGhTdGVuY2lsQXR0YWNobWVudDsKKyAgICBpZiAocFByZXNlcnZlQXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSOjppbml0aWFsaXplKGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgcGlwZWxpbmVCaW5kUG9pbnQgPSBpbl9zdHJ1Y3QtPnBpcGVsaW5lQmluZFBvaW50OworICAgIHZpZXdNYXNrID0gaW5fc3RydWN0LT52aWV3TWFzazsKKyAgICBpbnB1dEF0dGFjaG1lbnRDb3VudCA9IGluX3N0cnVjdC0+aW5wdXRBdHRhY2htZW50Q291bnQ7CisgICAgcElucHV0QXR0YWNobWVudHMgPSBudWxscHRyOworICAgIGNvbG9yQXR0YWNobWVudENvdW50ID0gaW5fc3RydWN0LT5jb2xvckF0dGFjaG1lbnRDb3VudDsKKyAgICBwQ29sb3JBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcFJlc29sdmVBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxscHRyOworICAgIHByZXNlcnZlQXR0YWNobWVudENvdW50ID0gaW5fc3RydWN0LT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudDsKKyAgICBwUHJlc2VydmVBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbnB1dEF0dGFjaG1lbnRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBJbnB1dEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBJbnB1dEF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUltpbnB1dEF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnB1dEF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW5wdXRBdHRhY2htZW50c1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBJbnB1dEF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29sb3JBdHRhY2htZW50Q291bnQgJiYgaW5fc3RydWN0LT5wQ29sb3JBdHRhY2htZW50cykgeworICAgICAgICBwQ29sb3JBdHRhY2htZW50cyA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFJbY29sb3JBdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcENvbG9yQXR0YWNobWVudHNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wQ29sb3JBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvbG9yQXR0YWNobWVudENvdW50ICYmIGluX3N0cnVjdC0+cFJlc29sdmVBdHRhY2htZW50cykgeworICAgICAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUltjb2xvckF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb2xvckF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cFJlc29sdmVBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpCisgICAgICAgIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUihpbl9zdHJ1Y3QtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wUHJlc2VydmVBdHRhY2htZW50cykgeworICAgICAgICBwUHJlc2VydmVBdHRhY2htZW50cyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPnByZXNlcnZlQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLCAodm9pZCAqKWluX3N0cnVjdC0+cFByZXNlcnZlQXR0YWNobWVudHMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBwaXBlbGluZUJpbmRQb2ludCA9IHNyYy0+cGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgdmlld01hc2sgPSBzcmMtPnZpZXdNYXNrOworICAgIGlucHV0QXR0YWNobWVudENvdW50ID0gc3JjLT5pbnB1dEF0dGFjaG1lbnRDb3VudDsKKyAgICBwSW5wdXRBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgY29sb3JBdHRhY2htZW50Q291bnQgPSBzcmMtPmNvbG9yQXR0YWNobWVudENvdW50OworICAgIHBDb2xvckF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwUmVzb2x2ZUF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IG51bGxwdHI7CisgICAgcHJlc2VydmVBdHRhY2htZW50Q291bnQgPSBzcmMtPnByZXNlcnZlQXR0YWNobWVudENvdW50OworICAgIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKGlucHV0QXR0YWNobWVudENvdW50ICYmIHNyYy0+cElucHV0QXR0YWNobWVudHMpIHsKKyAgICAgICAgcElucHV0QXR0YWNobWVudHMgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSW2lucHV0QXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGlucHV0QXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbnB1dEF0dGFjaG1lbnRzW2ldLmluaXRpYWxpemUoJnNyYy0+cElucHV0QXR0YWNobWVudHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb2xvckF0dGFjaG1lbnRDb3VudCAmJiBzcmMtPnBDb2xvckF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBDb2xvckF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUltjb2xvckF0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb2xvckF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQ29sb3JBdHRhY2htZW50c1tpXS5pbml0aWFsaXplKCZzcmMtPnBDb2xvckF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29sb3JBdHRhY2htZW50Q291bnQgJiYgc3JjLT5wUmVzb2x2ZUF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBSZXNvbHZlQXR0YWNobWVudHMgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSW2NvbG9yQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbG9yQXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZXNvbHZlQXR0YWNobWVudHNbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wUmVzb2x2ZUF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3JjLT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCkKKyAgICAgICAgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKCpzcmMtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTsKKyAgICBpZiAoc3JjLT5wUHJlc2VydmVBdHRhY2htZW50cykgeworICAgICAgICBwUHJlc2VydmVBdHRhY2htZW50cyA9IG5ldyB1aW50MzJfdFtzcmMtPnByZXNlcnZlQXR0YWNobWVudENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLCAodm9pZCAqKXNyYy0+cFByZXNlcnZlQXR0YWNobWVudHMsIHNpemVvZih1aW50MzJfdCkqc3JjLT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSOjpzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSKGNvbnN0IFZrU3VicGFzc0RlcGVuZGVuY3kyS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzcmNTdWJwYXNzKGluX3N0cnVjdC0+c3JjU3VicGFzcyksCisgICAgZHN0U3VicGFzcyhpbl9zdHJ1Y3QtPmRzdFN1YnBhc3MpLAorICAgIHNyY1N0YWdlTWFzayhpbl9zdHJ1Y3QtPnNyY1N0YWdlTWFzayksCisgICAgZHN0U3RhZ2VNYXNrKGluX3N0cnVjdC0+ZHN0U3RhZ2VNYXNrKSwKKyAgICBzcmNBY2Nlc3NNYXNrKGluX3N0cnVjdC0+c3JjQWNjZXNzTWFzayksCisgICAgZHN0QWNjZXNzTWFzayhpbl9zdHJ1Y3QtPmRzdEFjY2Vzc01hc2spLAorICAgIGRlcGVuZGVuY3lGbGFncyhpbl9zdHJ1Y3QtPmRlcGVuZGVuY3lGbGFncyksCisgICAgdmlld09mZnNldChpbl9zdHJ1Y3QtPnZpZXdPZmZzZXQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSOjpzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSOjpzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSKGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzcmNTdWJwYXNzID0gc3JjLnNyY1N1YnBhc3M7CisgICAgZHN0U3VicGFzcyA9IHNyYy5kc3RTdWJwYXNzOworICAgIHNyY1N0YWdlTWFzayA9IHNyYy5zcmNTdGFnZU1hc2s7CisgICAgZHN0U3RhZ2VNYXNrID0gc3JjLmRzdFN0YWdlTWFzazsKKyAgICBzcmNBY2Nlc3NNYXNrID0gc3JjLnNyY0FjY2Vzc01hc2s7CisgICAgZHN0QWNjZXNzTWFzayA9IHNyYy5kc3RBY2Nlc3NNYXNrOworICAgIGRlcGVuZGVuY3lGbGFncyA9IHNyYy5kZXBlbmRlbmN5RmxhZ3M7CisgICAgdmlld09mZnNldCA9IHNyYy52aWV3T2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSJiBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3JjU3VicGFzcyA9IHNyYy5zcmNTdWJwYXNzOworICAgIGRzdFN1YnBhc3MgPSBzcmMuZHN0U3VicGFzczsKKyAgICBzcmNTdGFnZU1hc2sgPSBzcmMuc3JjU3RhZ2VNYXNrOworICAgIGRzdFN0YWdlTWFzayA9IHNyYy5kc3RTdGFnZU1hc2s7CisgICAgc3JjQWNjZXNzTWFzayA9IHNyYy5zcmNBY2Nlc3NNYXNrOworICAgIGRzdEFjY2Vzc01hc2sgPSBzcmMuZHN0QWNjZXNzTWFzazsKKyAgICBkZXBlbmRlbmN5RmxhZ3MgPSBzcmMuZGVwZW5kZW5jeUZsYWdzOworICAgIHZpZXdPZmZzZXQgPSBzcmMudmlld09mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUjo6fnNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFI6OmluaXRpYWxpemUoY29uc3QgVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3JjU3VicGFzcyA9IGluX3N0cnVjdC0+c3JjU3VicGFzczsKKyAgICBkc3RTdWJwYXNzID0gaW5fc3RydWN0LT5kc3RTdWJwYXNzOworICAgIHNyY1N0YWdlTWFzayA9IGluX3N0cnVjdC0+c3JjU3RhZ2VNYXNrOworICAgIGRzdFN0YWdlTWFzayA9IGluX3N0cnVjdC0+ZHN0U3RhZ2VNYXNrOworICAgIHNyY0FjY2Vzc01hc2sgPSBpbl9zdHJ1Y3QtPnNyY0FjY2Vzc01hc2s7CisgICAgZHN0QWNjZXNzTWFzayA9IGluX3N0cnVjdC0+ZHN0QWNjZXNzTWFzazsKKyAgICBkZXBlbmRlbmN5RmxhZ3MgPSBpbl9zdHJ1Y3QtPmRlcGVuZGVuY3lGbGFnczsKKyAgICB2aWV3T2Zmc2V0ID0gaW5fc3RydWN0LT52aWV3T2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3JjU3VicGFzcyA9IHNyYy0+c3JjU3VicGFzczsKKyAgICBkc3RTdWJwYXNzID0gc3JjLT5kc3RTdWJwYXNzOworICAgIHNyY1N0YWdlTWFzayA9IHNyYy0+c3JjU3RhZ2VNYXNrOworICAgIGRzdFN0YWdlTWFzayA9IHNyYy0+ZHN0U3RhZ2VNYXNrOworICAgIHNyY0FjY2Vzc01hc2sgPSBzcmMtPnNyY0FjY2Vzc01hc2s7CisgICAgZHN0QWNjZXNzTWFzayA9IHNyYy0+ZHN0QWNjZXNzTWFzazsKKyAgICBkZXBlbmRlbmN5RmxhZ3MgPSBzcmMtPmRlcGVuZGVuY3lGbGFnczsKKyAgICB2aWV3T2Zmc2V0ID0gc3JjLT52aWV3T2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUjo6c2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUihjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgYXR0YWNobWVudENvdW50KGluX3N0cnVjdC0+YXR0YWNobWVudENvdW50KSwKKyAgICBwQXR0YWNobWVudHMobnVsbHB0ciksCisgICAgc3VicGFzc0NvdW50KGluX3N0cnVjdC0+c3VicGFzc0NvdW50KSwKKyAgICBwU3VicGFzc2VzKG51bGxwdHIpLAorICAgIGRlcGVuZGVuY3lDb3VudChpbl9zdHJ1Y3QtPmRlcGVuZGVuY3lDb3VudCksCisgICAgcERlcGVuZGVuY2llcyhudWxscHRyKSwKKyAgICBjb3JyZWxhdGVkVmlld01hc2tDb3VudChpbl9zdHJ1Y3QtPmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50KSwKKyAgICBwQ29ycmVsYXRlZFZpZXdNYXNrcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoYXR0YWNobWVudENvdW50ICYmIGluX3N0cnVjdC0+cEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBBdHRhY2htZW50cyA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUlthdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBBdHRhY2htZW50c1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBBdHRhY2htZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN1YnBhc3NDb3VudCAmJiBpbl9zdHJ1Y3QtPnBTdWJwYXNzZXMpIHsKKyAgICAgICAgcFN1YnBhc3NlcyA9IG5ldyBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUltzdWJwYXNzQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTdWJwYXNzZXNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wU3VicGFzc2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVwZW5kZW5jeUNvdW50ICYmIGluX3N0cnVjdC0+cERlcGVuZGVuY2llcykgeworICAgICAgICBwRGVwZW5kZW5jaWVzID0gbmV3IHNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFJbZGVwZW5kZW5jeUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlcGVuZGVuY3lDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwRGVwZW5kZW5jaWVzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cERlcGVuZGVuY2llc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cENvcnJlbGF0ZWRWaWV3TWFza3MpIHsKKyAgICAgICAgcENvcnJlbGF0ZWRWaWV3TWFza3MgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5jb3JyZWxhdGVkVmlld01hc2tDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ29ycmVsYXRlZFZpZXdNYXNrcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBDb3JyZWxhdGVkVmlld01hc2tzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+Y29ycmVsYXRlZFZpZXdNYXNrQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUjo6c2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwQXR0YWNobWVudHMobnVsbHB0ciksCisgICAgcFN1YnBhc3NlcyhudWxscHRyKSwKKyAgICBwRGVwZW5kZW5jaWVzKG51bGxwdHIpLAorICAgIHBDb3JyZWxhdGVkVmlld01hc2tzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSOjpzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBhdHRhY2htZW50Q291bnQgPSBzcmMuYXR0YWNobWVudENvdW50OworICAgIHBBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgc3VicGFzc0NvdW50ID0gc3JjLnN1YnBhc3NDb3VudDsKKyAgICBwU3VicGFzc2VzID0gbnVsbHB0cjsKKyAgICBkZXBlbmRlbmN5Q291bnQgPSBzcmMuZGVwZW5kZW5jeUNvdW50OworICAgIHBEZXBlbmRlbmNpZXMgPSBudWxscHRyOworICAgIGNvcnJlbGF0ZWRWaWV3TWFza0NvdW50ID0gc3JjLmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50OworICAgIHBDb3JyZWxhdGVkVmlld01hc2tzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoYXR0YWNobWVudENvdW50ICYmIHNyYy5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSW2F0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEF0dGFjaG1lbnRzW2ldLmluaXRpYWxpemUoJnNyYy5wQXR0YWNobWVudHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdWJwYXNzQ291bnQgJiYgc3JjLnBTdWJwYXNzZXMpIHsKKyAgICAgICAgcFN1YnBhc3NlcyA9IG5ldyBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUltzdWJwYXNzQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTdWJwYXNzZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBTdWJwYXNzZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkZXBlbmRlbmN5Q291bnQgJiYgc3JjLnBEZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgcERlcGVuZGVuY2llcyA9IG5ldyBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSW2RlcGVuZGVuY3lDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcERlcGVuZGVuY2llc1tpXS5pbml0aWFsaXplKCZzcmMucERlcGVuZGVuY2llc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wQ29ycmVsYXRlZFZpZXdNYXNrcykgeworICAgICAgICBwQ29ycmVsYXRlZFZpZXdNYXNrcyA9IG5ldyB1aW50MzJfdFtzcmMuY29ycmVsYXRlZFZpZXdNYXNrQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvcnJlbGF0ZWRWaWV3TWFza3MsICh2b2lkICopc3JjLnBDb3JyZWxhdGVkVmlld01hc2tzLCBzaXplb2YodWludDMyX3QpKnNyYy5jb3JyZWxhdGVkVmlld01hc2tDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSJiBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwQXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBBdHRhY2htZW50czsKKyAgICBpZiAocFN1YnBhc3NlcykKKyAgICAgICAgZGVsZXRlW10gcFN1YnBhc3NlczsKKyAgICBpZiAocERlcGVuZGVuY2llcykKKyAgICAgICAgZGVsZXRlW10gcERlcGVuZGVuY2llczsKKyAgICBpZiAocENvcnJlbGF0ZWRWaWV3TWFza3MpCisgICAgICAgIGRlbGV0ZVtdIHBDb3JyZWxhdGVkVmlld01hc2tzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgYXR0YWNobWVudENvdW50ID0gc3JjLmF0dGFjaG1lbnRDb3VudDsKKyAgICBwQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHN1YnBhc3NDb3VudCA9IHNyYy5zdWJwYXNzQ291bnQ7CisgICAgcFN1YnBhc3NlcyA9IG51bGxwdHI7CisgICAgZGVwZW5kZW5jeUNvdW50ID0gc3JjLmRlcGVuZGVuY3lDb3VudDsKKyAgICBwRGVwZW5kZW5jaWVzID0gbnVsbHB0cjsKKyAgICBjb3JyZWxhdGVkVmlld01hc2tDb3VudCA9IHNyYy5jb3JyZWxhdGVkVmlld01hc2tDb3VudDsKKyAgICBwQ29ycmVsYXRlZFZpZXdNYXNrcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGF0dGFjaG1lbnRDb3VudCAmJiBzcmMucEF0dGFjaG1lbnRzKSB7CisgICAgICAgIHBBdHRhY2htZW50cyA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUlthdHRhY2htZW50Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBBdHRhY2htZW50c1tpXS5pbml0aWFsaXplKCZzcmMucEF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3VicGFzc0NvdW50ICYmIHNyYy5wU3VicGFzc2VzKSB7CisgICAgICAgIHBTdWJwYXNzZXMgPSBuZXcgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFJbc3VicGFzc0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1YnBhc3NDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU3VicGFzc2VzW2ldLmluaXRpYWxpemUoJnNyYy5wU3VicGFzc2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVwZW5kZW5jeUNvdW50ICYmIHNyYy5wRGVwZW5kZW5jaWVzKSB7CisgICAgICAgIHBEZXBlbmRlbmNpZXMgPSBuZXcgc2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUltkZXBlbmRlbmN5Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVwZW5kZW5jeUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBEZXBlbmRlbmNpZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBEZXBlbmRlbmNpZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucENvcnJlbGF0ZWRWaWV3TWFza3MpIHsKKyAgICAgICAgcENvcnJlbGF0ZWRWaWV3TWFza3MgPSBuZXcgdWludDMyX3Rbc3JjLmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb3JyZWxhdGVkVmlld01hc2tzLCAodm9pZCAqKXNyYy5wQ29ycmVsYXRlZFZpZXdNYXNrcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuY29ycmVsYXRlZFZpZXdNYXNrQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUjo6fnNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIoKQoreworICAgIGlmIChwQXR0YWNobWVudHMpCisgICAgICAgIGRlbGV0ZVtdIHBBdHRhY2htZW50czsKKyAgICBpZiAocFN1YnBhc3NlcykKKyAgICAgICAgZGVsZXRlW10gcFN1YnBhc3NlczsKKyAgICBpZiAocERlcGVuZGVuY2llcykKKyAgICAgICAgZGVsZXRlW10gcERlcGVuZGVuY2llczsKKyAgICBpZiAocENvcnJlbGF0ZWRWaWV3TWFza3MpCisgICAgICAgIGRlbGV0ZVtdIHBDb3JyZWxhdGVkVmlld01hc2tzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFI6OmluaXRpYWxpemUoY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGF0dGFjaG1lbnRDb3VudCA9IGluX3N0cnVjdC0+YXR0YWNobWVudENvdW50OworICAgIHBBdHRhY2htZW50cyA9IG51bGxwdHI7CisgICAgc3VicGFzc0NvdW50ID0gaW5fc3RydWN0LT5zdWJwYXNzQ291bnQ7CisgICAgcFN1YnBhc3NlcyA9IG51bGxwdHI7CisgICAgZGVwZW5kZW5jeUNvdW50ID0gaW5fc3RydWN0LT5kZXBlbmRlbmN5Q291bnQ7CisgICAgcERlcGVuZGVuY2llcyA9IG51bGxwdHI7CisgICAgY29ycmVsYXRlZFZpZXdNYXNrQ291bnQgPSBpbl9zdHJ1Y3QtPmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50OworICAgIHBDb3JyZWxhdGVkVmlld01hc2tzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGF0dGFjaG1lbnRDb3VudCAmJiBpbl9zdHJ1Y3QtPnBBdHRhY2htZW50cykgeworICAgICAgICBwQXR0YWNobWVudHMgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFJbYXR0YWNobWVudENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGF0dGFjaG1lbnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQXR0YWNobWVudHNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wQXR0YWNobWVudHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdWJwYXNzQ291bnQgJiYgaW5fc3RydWN0LT5wU3VicGFzc2VzKSB7CisgICAgICAgIHBTdWJwYXNzZXMgPSBuZXcgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFJbc3VicGFzc0NvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1YnBhc3NDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU3VicGFzc2VzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cFN1YnBhc3Nlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlcGVuZGVuY3lDb3VudCAmJiBpbl9zdHJ1Y3QtPnBEZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgcERlcGVuZGVuY2llcyA9IG5ldyBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSW2RlcGVuZGVuY3lDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcERlcGVuZGVuY2llc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBEZXBlbmRlbmNpZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBDb3JyZWxhdGVkVmlld01hc2tzKSB7CisgICAgICAgIHBDb3JyZWxhdGVkVmlld01hc2tzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+Y29ycmVsYXRlZFZpZXdNYXNrQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvcnJlbGF0ZWRWaWV3TWFza3MsICh2b2lkICopaW5fc3RydWN0LT5wQ29ycmVsYXRlZFZpZXdNYXNrcywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBhdHRhY2htZW50Q291bnQgPSBzcmMtPmF0dGFjaG1lbnRDb3VudDsKKyAgICBwQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIHN1YnBhc3NDb3VudCA9IHNyYy0+c3VicGFzc0NvdW50OworICAgIHBTdWJwYXNzZXMgPSBudWxscHRyOworICAgIGRlcGVuZGVuY3lDb3VudCA9IHNyYy0+ZGVwZW5kZW5jeUNvdW50OworICAgIHBEZXBlbmRlbmNpZXMgPSBudWxscHRyOworICAgIGNvcnJlbGF0ZWRWaWV3TWFza0NvdW50ID0gc3JjLT5jb3JyZWxhdGVkVmlld01hc2tDb3VudDsKKyAgICBwQ29ycmVsYXRlZFZpZXdNYXNrcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChhdHRhY2htZW50Q291bnQgJiYgc3JjLT5wQXR0YWNobWVudHMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRzID0gbmV3IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSW2F0dGFjaG1lbnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEF0dGFjaG1lbnRzW2ldLmluaXRpYWxpemUoJnNyYy0+cEF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3VicGFzc0NvdW50ICYmIHNyYy0+cFN1YnBhc3NlcykgeworICAgICAgICBwU3VicGFzc2VzID0gbmV3IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSW3N1YnBhc3NDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJwYXNzQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN1YnBhc3Nlc1tpXS5pbml0aWFsaXplKCZzcmMtPnBTdWJwYXNzZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkZXBlbmRlbmN5Q291bnQgJiYgc3JjLT5wRGVwZW5kZW5jaWVzKSB7CisgICAgICAgIHBEZXBlbmRlbmNpZXMgPSBuZXcgc2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUltkZXBlbmRlbmN5Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVwZW5kZW5jeUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBEZXBlbmRlbmNpZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wRGVwZW5kZW5jaWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3JjLT5wQ29ycmVsYXRlZFZpZXdNYXNrcykgeworICAgICAgICBwQ29ycmVsYXRlZFZpZXdNYXNrcyA9IG5ldyB1aW50MzJfdFtzcmMtPmNvcnJlbGF0ZWRWaWV3TWFza0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb3JyZWxhdGVkVmlld01hc2tzLCAodm9pZCAqKXNyYy0+cENvcnJlbGF0ZWRWaWV3TWFza3MsIHNpemVvZih1aW50MzJfdCkqc3JjLT5jb3JyZWxhdGVkVmlld01hc2tDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUjo6c2FmZV9Wa1N1YnBhc3NCZWdpbkluZm9LSFIoY29uc3QgVmtTdWJwYXNzQmVnaW5JbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBjb250ZW50cyhpbl9zdHJ1Y3QtPmNvbnRlbnRzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1N1YnBhc3NCZWdpbkluZm9LSFI6OnNhZmVfVmtTdWJwYXNzQmVnaW5JbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUjo6c2FmZV9Wa1N1YnBhc3NCZWdpbkluZm9LSFIoY29uc3Qgc2FmZV9Wa1N1YnBhc3NCZWdpbkluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb250ZW50cyA9IHNyYy5jb250ZW50czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1N1YnBhc3NCZWdpbkluZm9LSFImIHNhZmVfVmtTdWJwYXNzQmVnaW5JbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1YnBhc3NCZWdpbkluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNvbnRlbnRzID0gc3JjLmNvbnRlbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUjo6fnNhZmVfVmtTdWJwYXNzQmVnaW5JbmZvS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgY29udGVudHMgPSBpbl9zdHJ1Y3QtPmNvbnRlbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBjb250ZW50cyA9IHNyYy0+Y29udGVudHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU3VicGFzc0VuZEluZm9LSFI6OnNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUihjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1N1YnBhc3NFbmRJbmZvS0hSOjpzYWZlX1ZrU3VicGFzc0VuZEluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUjo6c2FmZV9Wa1N1YnBhc3NFbmRJbmZvS0hSKGNvbnN0IHNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU3VicGFzc0VuZEluZm9LSFImIHNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUjo6fnNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1N1YnBhc3NFbmRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VicGFzc0VuZEluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFI6OnNhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUihjb25zdCBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzaGFyZWRQcmVzZW50U3VwcG9ydGVkVXNhZ2VGbGFncyhpbl9zdHJ1Y3QtPnNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOjpzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUjo6c2FmZV9Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKGNvbnN0IHNhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzID0gc3JjLnNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFImIHNhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhcmVkUHJlc2VudFN1cHBvcnRlZFVzYWdlRmxhZ3MgPSBzcmMuc2hhcmVkUHJlc2VudFN1cHBvcnRlZFVzYWdlRmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUjo6fnNhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2hhcmVkUHJlc2VudFN1cHBvcnRlZFVzYWdlRmxhZ3MgPSBpbl9zdHJ1Y3QtPnNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzID0gc3JjLT5zaGFyZWRQcmVzZW50U3VwcG9ydGVkVXNhZ2VGbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZlbmNlKGluX3N0cnVjdC0+ZmVuY2UpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKSwKKyAgICBoYW5kbGUoaW5fc3RydWN0LT5oYW5kbGUpLAorICAgIG5hbWUoaW5fc3RydWN0LT5uYW1lKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZlbmNlID0gc3JjLmZlbmNlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBoYW5kbGUgPSBzcmMuaGFuZGxlOworICAgIG5hbWUgPSBzcmMubmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSJiBzYWZlX1ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZlbmNlID0gc3JjLmZlbmNlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBoYW5kbGUgPSBzcmMuaGFuZGxlOworICAgIG5hbWUgPSBzcmMubmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSOjp+c2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmZW5jZSA9IGluX3N0cnVjdC0+ZmVuY2U7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGhhbmRsZVR5cGUgPSBpbl9zdHJ1Y3QtPmhhbmRsZVR5cGU7CisgICAgaGFuZGxlID0gaW5fc3RydWN0LT5oYW5kbGU7CisgICAgbmFtZSA9IGluX3N0cnVjdC0+bmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmZW5jZSA9IHNyYy0+ZmVuY2U7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGhhbmRsZVR5cGUgPSBzcmMtPmhhbmRsZVR5cGU7CisgICAgaGFuZGxlID0gc3JjLT5oYW5kbGU7CisgICAgbmFtZSA9IHNyYy0+bmFtZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBBdHRyaWJ1dGVzKG51bGxwdHIpLAorICAgIGR3QWNjZXNzKGluX3N0cnVjdC0+ZHdBY2Nlc3MpLAorICAgIG5hbWUoaW5fc3RydWN0LT5uYW1lKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCppbl9zdHJ1Y3QtPnBBdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3NhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUjo6c2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBBdHRyaWJ1dGVzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwQXR0cmlidXRlcyA9IG51bGxwdHI7CisgICAgZHdBY2Nlc3MgPSBzcmMuZHdBY2Nlc3M7CisgICAgbmFtZSA9IHNyYy5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgcEF0dHJpYnV0ZXMgPSBuZXcgU0VDVVJJVFlfQVRUUklCVVRFUygqc3JjLnBBdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3NhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiYgc2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBBdHRyaWJ1dGVzKQorICAgICAgICBkZWxldGUgcEF0dHJpYnV0ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwQXR0cmlidXRlcyA9IG51bGxwdHI7CisgICAgZHdBY2Nlc3MgPSBzcmMuZHdBY2Nlc3M7CisgICAgbmFtZSA9IHNyYy5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgcEF0dHJpYnV0ZXMgPSBuZXcgU0VDVVJJVFlfQVRUUklCVVRFUygqc3JjLnBBdHRyaWJ1dGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUjo6fnNhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUigpCit7CisgICAgaWYgKHBBdHRyaWJ1dGVzKQorICAgICAgICBkZWxldGUgcEF0dHJpYnV0ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcEF0dHJpYnV0ZXMgPSBudWxscHRyOworICAgIGR3QWNjZXNzID0gaW5fc3RydWN0LT5kd0FjY2VzczsKKyAgICBuYW1lID0gaW5fc3RydWN0LT5uYW1lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCppbl9zdHJ1Y3QtPnBBdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwQXR0cmlidXRlcyA9IG51bGxwdHI7CisgICAgZHdBY2Nlc3MgPSBzcmMtPmR3QWNjZXNzOworICAgIG5hbWUgPSBzcmMtPm5hbWU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBBdHRyaWJ1dGVzKSB7CisgICAgICAgIHBBdHRyaWJ1dGVzID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKnNyYy0+cEF0dHJpYnV0ZXMpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworc2FmZV9Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmVuY2UoaW5fc3RydWN0LT5mZW5jZSksCisgICAgaGFuZGxlVHlwZShpbl9zdHJ1Y3QtPmhhbmRsZVR5cGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFI6OnNhZmVfVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSOjpzYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIoY29uc3Qgc2FmZV9Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmVuY2UgPSBzcmMuZmVuY2U7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFImIHNhZmVfVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmVuY2UgPSBzcmMuZmVuY2U7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFI6On5zYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZlbmNlID0gaW5fc3RydWN0LT5mZW5jZTsKKyAgICBoYW5kbGVUeXBlID0gaW5fc3RydWN0LT5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZlbmNlID0gc3JjLT5mZW5jZTsKKyAgICBoYW5kbGVUeXBlID0gc3JjLT5oYW5kbGVUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworc2FmZV9Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFIoY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmVuY2UoaW5fc3RydWN0LT5mZW5jZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgaGFuZGxlVHlwZShpbl9zdHJ1Y3QtPmhhbmRsZVR5cGUpLAorICAgIGZkKGluX3N0cnVjdC0+ZmQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFI6OnNhZmVfVmtJbXBvcnRGZW5jZUZkSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSOjpzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFIoY29uc3Qgc2FmZV9Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmVuY2UgPSBzcmMuZmVuY2U7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIGZkID0gc3JjLmZkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFImIHNhZmVfVmtJbXBvcnRGZW5jZUZkSW5mb0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmVuY2UgPSBzcmMuZmVuY2U7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIGZkID0gc3JjLmZkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFI6On5zYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbXBvcnRGZW5jZUZkSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZlbmNlID0gaW5fc3RydWN0LT5mZW5jZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBmZCA9IGluX3N0cnVjdC0+ZmQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbXBvcnRGZW5jZUZkSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmVuY2UgPSBzcmMtPmZlbmNlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBoYW5kbGVUeXBlID0gc3JjLT5oYW5kbGVUeXBlOworICAgIGZkID0gc3JjLT5mZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtGZW5jZUdldEZkSW5mb0tIUjo6c2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSKGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZlbmNlKGluX3N0cnVjdC0+ZmVuY2UpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSOjpzYWZlX1ZrRmVuY2VHZXRGZEluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtGZW5jZUdldEZkSW5mb0tIUjo6c2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSKGNvbnN0IHNhZmVfVmtGZW5jZUdldEZkSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZlbmNlID0gc3JjLmZlbmNlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSJiBzYWZlX1ZrRmVuY2VHZXRGZEluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRmVuY2VHZXRGZEluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZlbmNlID0gc3JjLmZlbmNlOworICAgIGhhbmRsZVR5cGUgPSBzcmMuaGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSOjp+c2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRmVuY2VHZXRGZEluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmZW5jZSA9IGluX3N0cnVjdC0+ZmVuY2U7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtGZW5jZUdldEZkSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmZW5jZSA9IHNyYy0+ZmVuY2U7CisgICAgaGFuZGxlVHlwZSA9IHNyYy0+aGFuZGxlVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMoaW5fc3RydWN0LT5wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzKSwKKyAgICBwZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHMoaW5fc3RydWN0LT5wZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGVyZm9ybWFuY2VDb3VudGVyUXVlcnlQb29scyA9IHNyYy5wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzOworICAgIHBlcmZvcm1hbmNlQ291bnRlck11bHRpcGxlUXVlcnlQb29scyA9IHNyYy5wZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzID0gc3JjLnBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHM7CisgICAgcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzID0gc3JjLnBlcmZvcm1hbmNlQ291bnRlck11bHRpcGxlUXVlcnlQb29sczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFI6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzID0gaW5fc3RydWN0LT5wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzOworICAgIHBlcmZvcm1hbmNlQ291bnRlck11bHRpcGxlUXVlcnlQb29scyA9IGluX3N0cnVjdC0+cGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMgPSBzcmMtPnBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHM7CisgICAgcGVyZm9ybWFuY2VDb3VudGVyTXVsdGlwbGVRdWVyeVBvb2xzID0gc3JjLT5wZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBhbGxvd0NvbW1hbmRCdWZmZXJRdWVyeUNvcGllcyhpbl9zdHJ1Y3QtPmFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhbGxvd0NvbW1hbmRCdWZmZXJRdWVyeUNvcGllcyA9IHNyYy5hbGxvd0NvbW1hbmRCdWZmZXJRdWVyeUNvcGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFImIHNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzID0gc3JjLmFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUjo6fnNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYWxsb3dDb21tYW5kQnVmZmVyUXVlcnlDb3BpZXMgPSBpbl9zdHJ1Y3QtPmFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBhbGxvd0NvbW1hbmRCdWZmZXJRdWVyeUNvcGllcyA9IHNyYy0+YWxsb3dDb21tYW5kQnVmZmVyUXVlcnlDb3BpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSOjpzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKGNvbnN0IFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB1bml0KGluX3N0cnVjdC0+dW5pdCksCisgICAgc2NvcGUoaW5fc3RydWN0LT5zY29wZSksCisgICAgc3RvcmFnZShpbl9zdHJ1Y3QtPnN0b3JhZ2UpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19VVUlEX1NJWkU7ICsraSkgeworICAgICAgICB1dWlkW2ldID0gaW5fc3RydWN0LT51dWlkW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlcktIUjo6c2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlcktIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlcktIUjo6c2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlcktIUihjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdW5pdCA9IHNyYy51bml0OworICAgIHNjb3BlID0gc3JjLnNjb3BlOworICAgIHN0b3JhZ2UgPSBzcmMuc3RvcmFnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfVVVJRF9TSVpFOyArK2kpIHsKKyAgICAgICAgdXVpZFtpXSA9IHNyYy51dWlkW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlcktIUiYgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlcktIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHVuaXQgPSBzcmMudW5pdDsKKyAgICBzY29wZSA9IHNyYy5zY29wZTsKKyAgICBzdG9yYWdlID0gc3JjLnN0b3JhZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX1VVSURfU0laRTsgKytpKSB7CisgICAgICAgIHV1aWRbaV0gPSBzcmMudXVpZFtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFI6On5zYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHVuaXQgPSBpbl9zdHJ1Y3QtPnVuaXQ7CisgICAgc2NvcGUgPSBpbl9zdHJ1Y3QtPnNjb3BlOworICAgIHN0b3JhZ2UgPSBpbl9zdHJ1Y3QtPnN0b3JhZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19VVUlEX1NJWkU7ICsraSkgeworICAgICAgICB1dWlkW2ldID0gaW5fc3RydWN0LT51dWlkW2ldOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgdW5pdCA9IHNyYy0+dW5pdDsKKyAgICBzY29wZSA9IHNyYy0+c2NvcGU7CisgICAgc3RvcmFnZSA9IHNyYy0+c3RvcmFnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX1VVSURfU0laRTsgKytpKSB7CisgICAgICAgIHV1aWRbaV0gPSBzcmMtPnV1aWRbaV07CisgICAgfQorfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFI6OnNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUihjb25zdCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gaW5fc3RydWN0LT5uYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBjYXRlZ29yeVtpXSA9IGluX3N0cnVjdC0+Y2F0ZWdvcnlbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gaW5fc3RydWN0LT5kZXNjcmlwdGlvbltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUjo6c2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFI6OnNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUihjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gc3JjLm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGNhdGVnb3J5W2ldID0gc3JjLmNhdGVnb3J5W2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBkZXNjcmlwdGlvbltpXSA9IHNyYy5kZXNjcmlwdGlvbltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiYgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gc3JjLm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGNhdGVnb3J5W2ldID0gc3JjLmNhdGVnb3J5W2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBkZXNjcmlwdGlvbltpXSA9IHNyYy5kZXNjcmlwdGlvbltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUjo6fnNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gaW5fc3RydWN0LT5uYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBjYXRlZ29yeVtpXSA9IGluX3N0cnVjdC0+Y2F0ZWdvcnlbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gaW5fc3RydWN0LT5kZXNjcmlwdGlvbltpXTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIG5hbWVbaV0gPSBzcmMtPm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGNhdGVnb3J5W2ldID0gc3JjLT5jYXRlZ29yeVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgZGVzY3JpcHRpb25baV0gPSBzcmMtPmRlc2NyaXB0aW9uW2ldOworICAgIH0KK30KKworc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUihjb25zdCBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcXVldWVGYW1pbHlJbmRleChpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXgpLAorICAgIGNvdW50ZXJJbmRleENvdW50KGluX3N0cnVjdC0+Y291bnRlckluZGV4Q291bnQpLAorICAgIHBDb3VudGVySW5kaWNlcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQ291bnRlckluZGljZXMpIHsKKyAgICAgICAgcENvdW50ZXJJbmRpY2VzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+Y291bnRlckluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvdW50ZXJJbmRpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cENvdW50ZXJJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+Y291bnRlckluZGV4Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwQ291bnRlckluZGljZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI6OnNhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIoY29uc3Qgc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHF1ZXVlRmFtaWx5SW5kZXggPSBzcmMucXVldWVGYW1pbHlJbmRleDsKKyAgICBjb3VudGVySW5kZXhDb3VudCA9IHNyYy5jb3VudGVySW5kZXhDb3VudDsKKyAgICBwQ291bnRlckluZGljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucENvdW50ZXJJbmRpY2VzKSB7CisgICAgICAgIHBDb3VudGVySW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMuY291bnRlckluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvdW50ZXJJbmRpY2VzLCAodm9pZCAqKXNyYy5wQ291bnRlckluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLmNvdW50ZXJJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFImIHNhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBDb3VudGVySW5kaWNlcykKKyAgICAgICAgZGVsZXRlW10gcENvdW50ZXJJbmRpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcXVldWVGYW1pbHlJbmRleCA9IHNyYy5xdWV1ZUZhbWlseUluZGV4OworICAgIGNvdW50ZXJJbmRleENvdW50ID0gc3JjLmNvdW50ZXJJbmRleENvdW50OworICAgIHBDb3VudGVySW5kaWNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQ291bnRlckluZGljZXMpIHsKKyAgICAgICAgcENvdW50ZXJJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy5jb3VudGVySW5kZXhDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ291bnRlckluZGljZXMsICh2b2lkICopc3JjLnBDb3VudGVySW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuY291bnRlckluZGV4Q291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUjo6fnNhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIoKQoreworICAgIGlmIChwQ291bnRlckluZGljZXMpCisgICAgICAgIGRlbGV0ZVtdIHBDb3VudGVySW5kaWNlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHF1ZXVlRmFtaWx5SW5kZXggPSBpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXg7CisgICAgY291bnRlckluZGV4Q291bnQgPSBpbl9zdHJ1Y3QtPmNvdW50ZXJJbmRleENvdW50OworICAgIHBDb3VudGVySW5kaWNlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBDb3VudGVySW5kaWNlcykgeworICAgICAgICBwQ291bnRlckluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5jb3VudGVySW5kZXhDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ291bnRlckluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wQ291bnRlckluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5jb3VudGVySW5kZXhDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4ID0gc3JjLT5xdWV1ZUZhbWlseUluZGV4OworICAgIGNvdW50ZXJJbmRleENvdW50ID0gc3JjLT5jb3VudGVySW5kZXhDb3VudDsKKyAgICBwQ291bnRlckluZGljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wQ291bnRlckluZGljZXMpIHsKKyAgICAgICAgcENvdW50ZXJJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy0+Y291bnRlckluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvdW50ZXJJbmRpY2VzLCAodm9pZCAqKXNyYy0+cENvdW50ZXJJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy0+Y291bnRlckluZGV4Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUjo6c2FmZV9Wa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUihjb25zdCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgdGltZW91dChpbl9zdHJ1Y3QtPnRpbWVvdXQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSOjpzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSOjpzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKGNvbnN0IHNhZmVfVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICB0aW1lb3V0ID0gc3JjLnRpbWVvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFImIHNhZmVfVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICB0aW1lb3V0ID0gc3JjLnRpbWVvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFI6On5zYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICB0aW1lb3V0ID0gaW5fc3RydWN0LT50aW1lb3V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHRpbWVvdXQgPSBzcmMtPnRpbWVvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFI6OnNhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUihjb25zdCBWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBjb3VudGVyUGFzc0luZGV4KGluX3N0cnVjdC0+Y291bnRlclBhc3NJbmRleCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUjo6c2FmZV9Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFI6OnNhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUihjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb3VudGVyUGFzc0luZGV4ID0gc3JjLmNvdW50ZXJQYXNzSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiYgc2FmZV9Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb3VudGVyUGFzc0luZGV4ID0gc3JjLmNvdW50ZXJQYXNzSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUjo6fnNhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgY291bnRlclBhc3NJbmRleCA9IGluX3N0cnVjdC0+Y291bnRlclBhc3NJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBjb3VudGVyUGFzc0luZGV4ID0gc3JjLT5jb3VudGVyUGFzc0luZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3VyZmFjZShpbl9zdHJ1Y3QtPnN1cmZhY2UpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3VyZmFjZSA9IHNyYy5zdXJmYWNlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFImIHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3VyZmFjZSA9IHNyYy5zdXJmYWNlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHN1cmZhY2UgPSBpbl9zdHJ1Y3QtPnN1cmZhY2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3VyZmFjZSA9IHNyYy0+c3VyZmFjZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUjo6c2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHN1cmZhY2VDYXBhYmlsaXRpZXMoaW5fc3RydWN0LT5zdXJmYWNlQ2FwYWJpbGl0aWVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSOjpzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUjo6c2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKGNvbnN0IHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN1cmZhY2VDYXBhYmlsaXRpZXMgPSBzcmMuc3VyZmFjZUNhcGFiaWxpdGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSJiBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN1cmZhY2VDYXBhYmlsaXRpZXMgPSBzcmMuc3VyZmFjZUNhcGFiaWxpdGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSOjp+c2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFI6OmluaXRpYWxpemUoY29uc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzdXJmYWNlQ2FwYWJpbGl0aWVzID0gaW5fc3RydWN0LT5zdXJmYWNlQ2FwYWJpbGl0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHN1cmZhY2VDYXBhYmlsaXRpZXMgPSBzcmMtPnN1cmZhY2VDYXBhYmlsaXRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU3VyZmFjZUZvcm1hdDJLSFI6OnNhZmVfVmtTdXJmYWNlRm9ybWF0MktIUihjb25zdCBWa1N1cmZhY2VGb3JtYXQyS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzdXJmYWNlRm9ybWF0KGluX3N0cnVjdC0+c3VyZmFjZUZvcm1hdCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTdXJmYWNlRm9ybWF0MktIUjo6c2FmZV9Wa1N1cmZhY2VGb3JtYXQyS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3VyZmFjZUZvcm1hdDJLSFI6OnNhZmVfVmtTdXJmYWNlRm9ybWF0MktIUihjb25zdCBzYWZlX1ZrU3VyZmFjZUZvcm1hdDJLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdXJmYWNlRm9ybWF0ID0gc3JjLnN1cmZhY2VGb3JtYXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTdXJmYWNlRm9ybWF0MktIUiYgc2FmZV9Wa1N1cmZhY2VGb3JtYXQyS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1cmZhY2VGb3JtYXQyS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdXJmYWNlRm9ybWF0ID0gc3JjLnN1cmZhY2VGb3JtYXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTdXJmYWNlRm9ybWF0MktIUjo6fnNhZmVfVmtTdXJmYWNlRm9ybWF0MktIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1N1cmZhY2VGb3JtYXQyS0hSOjppbml0aWFsaXplKGNvbnN0IFZrU3VyZmFjZUZvcm1hdDJLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3VyZmFjZUZvcm1hdCA9IGluX3N0cnVjdC0+c3VyZmFjZUZvcm1hdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1N1cmZhY2VGb3JtYXQyS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTdXJmYWNlRm9ybWF0MktIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzdXJmYWNlRm9ybWF0ID0gc3JjLT5zdXJmYWNlRm9ybWF0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUjo6c2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUihjb25zdCBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGlzcGxheVByb3BlcnRpZXMoJmluX3N0cnVjdC0+ZGlzcGxheVByb3BlcnRpZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSOjpzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSOjpzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5UHJvcGVydGllczJLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkaXNwbGF5UHJvcGVydGllcy5pbml0aWFsaXplKCZzcmMuZGlzcGxheVByb3BlcnRpZXMpOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSJiBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGlzcGxheVByb3BlcnRpZXMuaW5pdGlhbGl6ZSgmc3JjLmRpc3BsYXlQcm9wZXJ0aWVzKTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUjo6fnNhZmVfVmtEaXNwbGF5UHJvcGVydGllczJLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5UHJvcGVydGllczJLSFI6OmluaXRpYWxpemUoY29uc3QgVmtEaXNwbGF5UHJvcGVydGllczJLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGlzcGxheVByb3BlcnRpZXMuaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5kaXNwbGF5UHJvcGVydGllcyk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5UHJvcGVydGllczJLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBkaXNwbGF5UHJvcGVydGllcy5pbml0aWFsaXplKCZzcmMtPmRpc3BsYXlQcm9wZXJ0aWVzKTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUjo6c2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKGNvbnN0IFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRpc3BsYXlQbGFuZVByb3BlcnRpZXMoaW5fc3RydWN0LT5kaXNwbGF5UGxhbmVQcm9wZXJ0aWVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSOjpzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUjo6c2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRpc3BsYXlQbGFuZVByb3BlcnRpZXMgPSBzcmMuZGlzcGxheVBsYW5lUHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSJiBzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRpc3BsYXlQbGFuZVByb3BlcnRpZXMgPSBzcmMuZGlzcGxheVBsYW5lUHJvcGVydGllczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSOjp+c2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI6OmluaXRpYWxpemUoY29uc3QgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkaXNwbGF5UGxhbmVQcm9wZXJ0aWVzID0gaW5fc3RydWN0LT5kaXNwbGF5UGxhbmVQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRpc3BsYXlQbGFuZVByb3BlcnRpZXMgPSBzcmMtPmRpc3BsYXlQbGFuZVByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUjo6c2FmZV9Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoY29uc3QgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkaXNwbGF5TW9kZVByb3BlcnRpZXMoaW5fc3RydWN0LT5kaXNwbGF5TW9kZVByb3BlcnRpZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUjo6c2FmZV9Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSOjpzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUihjb25zdCBzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRpc3BsYXlNb2RlUHJvcGVydGllcyA9IHNyYy5kaXNwbGF5TW9kZVByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSJiBzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkaXNwbGF5TW9kZVByb3BlcnRpZXMgPSBzcmMuZGlzcGxheU1vZGVQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUjo6fnNhZmVfVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGlzcGxheU1vZGVQcm9wZXJ0aWVzID0gaW5fc3RydWN0LT5kaXNwbGF5TW9kZVByb3BlcnRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRpc3BsYXlNb2RlUHJvcGVydGllcyA9IHNyYy0+ZGlzcGxheU1vZGVQcm9wZXJ0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSOjpzYWZlX1ZrRGlzcGxheVBsYW5lSW5mbzJLSFIoY29uc3QgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbW9kZShpbl9zdHJ1Y3QtPm1vZGUpLAorICAgIHBsYW5lSW5kZXgoaW5fc3RydWN0LT5wbGFuZUluZGV4KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSOjpzYWZlX1ZrRGlzcGxheVBsYW5lSW5mbzJLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEaXNwbGF5UGxhbmVJbmZvMktIUjo6c2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVJbmZvMktIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1vZGUgPSBzcmMubW9kZTsKKyAgICBwbGFuZUluZGV4ID0gc3JjLnBsYW5lSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5UGxhbmVJbmZvMktIUiYgc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtb2RlID0gc3JjLm1vZGU7CisgICAgcGxhbmVJbmRleCA9IHNyYy5wbGFuZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGlzcGxheVBsYW5lSW5mbzJLSFI6On5zYWZlX1ZrRGlzcGxheVBsYW5lSW5mbzJLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5UGxhbmVJbmZvMktIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1vZGUgPSBpbl9zdHJ1Y3QtPm1vZGU7CisgICAgcGxhbmVJbmRleCA9IGluX3N0cnVjdC0+cGxhbmVJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVJbmZvMktIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtb2RlID0gc3JjLT5tb2RlOworICAgIHBsYW5lSW5kZXggPSBzcmMtPnBsYW5lSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjo6c2FmZV9Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoY29uc3QgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBjYXBhYmlsaXRpZXMoaW5fc3RydWN0LT5jYXBhYmlsaXRpZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjo6c2FmZV9Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSOjpzYWZlX1ZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUihjb25zdCBzYWZlX1ZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNhcGFiaWxpdGllcyA9IHNyYy5jYXBhYmlsaXRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSJiBzYWZlX1ZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjYXBhYmlsaXRpZXMgPSBzcmMuY2FwYWJpbGl0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjo6fnNhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgY2FwYWJpbGl0aWVzID0gaW5fc3RydWN0LT5jYXBhYmlsaXRpZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGNhcGFiaWxpdGllcyA9IHNyYy0+Y2FwYWJpbGl0aWVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI6OnNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKGNvbnN0IFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgdmlld0Zvcm1hdENvdW50KGluX3N0cnVjdC0+dmlld0Zvcm1hdENvdW50KSwKKyAgICBwVmlld0Zvcm1hdHMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFZpZXdGb3JtYXRzKSB7CisgICAgICAgIHBWaWV3Rm9ybWF0cyA9IG5ldyBWa0Zvcm1hdFtpbl9zdHJ1Y3QtPnZpZXdGb3JtYXRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld0Zvcm1hdHMsICh2b2lkICopaW5fc3RydWN0LT5wVmlld0Zvcm1hdHMsIHNpemVvZihWa0Zvcm1hdCkqaW5fc3RydWN0LT52aWV3Rm9ybWF0Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI6OnNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBWaWV3Rm9ybWF0cyhudWxscHRyKQore30KKworc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI6OnNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdmlld0Zvcm1hdENvdW50ID0gc3JjLnZpZXdGb3JtYXRDb3VudDsKKyAgICBwVmlld0Zvcm1hdHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFZpZXdGb3JtYXRzKSB7CisgICAgICAgIHBWaWV3Rm9ybWF0cyA9IG5ldyBWa0Zvcm1hdFtzcmMudmlld0Zvcm1hdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3Rm9ybWF0cywgKHZvaWQgKilzcmMucFZpZXdGb3JtYXRzLCBzaXplb2YoVmtGb3JtYXQpKnNyYy52aWV3Rm9ybWF0Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFImIHNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFZpZXdGb3JtYXRzKQorICAgICAgICBkZWxldGVbXSBwVmlld0Zvcm1hdHM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB2aWV3Rm9ybWF0Q291bnQgPSBzcmMudmlld0Zvcm1hdENvdW50OworICAgIHBWaWV3Rm9ybWF0cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wVmlld0Zvcm1hdHMpIHsKKyAgICAgICAgcFZpZXdGb3JtYXRzID0gbmV3IFZrRm9ybWF0W3NyYy52aWV3Rm9ybWF0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdGb3JtYXRzLCAodm9pZCAqKXNyYy5wVmlld0Zvcm1hdHMsIHNpemVvZihWa0Zvcm1hdCkqc3JjLnZpZXdGb3JtYXRDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjo6fnNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKCkKK3sKKyAgICBpZiAocFZpZXdGb3JtYXRzKQorICAgICAgICBkZWxldGVbXSBwVmlld0Zvcm1hdHM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHZpZXdGb3JtYXRDb3VudCA9IGluX3N0cnVjdC0+dmlld0Zvcm1hdENvdW50OworICAgIHBWaWV3Rm9ybWF0cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBWaWV3Rm9ybWF0cykgeworICAgICAgICBwVmlld0Zvcm1hdHMgPSBuZXcgVmtGb3JtYXRbaW5fc3RydWN0LT52aWV3Rm9ybWF0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdGb3JtYXRzLCAodm9pZCAqKWluX3N0cnVjdC0+cFZpZXdGb3JtYXRzLCBzaXplb2YoVmtGb3JtYXQpKmluX3N0cnVjdC0+dmlld0Zvcm1hdENvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgdmlld0Zvcm1hdENvdW50ID0gc3JjLT52aWV3Rm9ybWF0Q291bnQ7CisgICAgcFZpZXdGb3JtYXRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cFZpZXdGb3JtYXRzKSB7CisgICAgICAgIHBWaWV3Rm9ybWF0cyA9IG5ldyBWa0Zvcm1hdFtzcmMtPnZpZXdGb3JtYXRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld0Zvcm1hdHMsICh2b2lkICopc3JjLT5wVmlld0Zvcm1hdHMsIHNpemVvZihWa0Zvcm1hdCkqc3JjLT52aWV3Rm9ybWF0Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzKGluX3N0cnVjdC0+c2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXMgPSBzcmMuc2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzID0gc3JjLnNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFI6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlcyA9IGluX3N0cnVjdC0+c2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXMgPSBzcmMtPnNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzKGluX3N0cnVjdC0+c3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MpLAorICAgIHVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2Vzcyhpbl9zdHJ1Y3QtPnVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyksCisgICAgc3RvcmFnZVB1c2hDb25zdGFudDgoaW5fc3RydWN0LT5zdG9yYWdlUHVzaENvbnN0YW50OCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzID0gc3JjLnN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzOworICAgIHVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyA9IHNyYy51bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3M7CisgICAgc3RvcmFnZVB1c2hDb25zdGFudDggPSBzcmMuc3RvcmFnZVB1c2hDb25zdGFudDg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFImIHNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyA9IHNyYy5zdG9yYWdlQnVmZmVyOEJpdEFjY2VzczsKKyAgICB1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MgPSBzcmMudW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzOworICAgIHN0b3JhZ2VQdXNoQ29uc3RhbnQ4ID0gc3JjLnN0b3JhZ2VQdXNoQ29uc3RhbnQ4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyA9IGluX3N0cnVjdC0+c3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3M7CisgICAgdW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzID0gaW5fc3RydWN0LT51bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3M7CisgICAgc3RvcmFnZVB1c2hDb25zdGFudDggPSBpbl9zdHJ1Y3QtPnN0b3JhZ2VQdXNoQ29uc3RhbnQ4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MgPSBzcmMtPnN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzOworICAgIHVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2VzcyA9IHNyYy0+dW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzOworICAgIHN0b3JhZ2VQdXNoQ29uc3RhbnQ4ID0gc3JjLT5zdG9yYWdlUHVzaENvbnN0YW50ODsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRlckJ1ZmZlckludDY0QXRvbWljcyhpbl9zdHJ1Y3QtPnNoYWRlckJ1ZmZlckludDY0QXRvbWljcyksCisgICAgc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzKGluX3N0cnVjdC0+c2hhZGVyU2hhcmVkSW50NjRBdG9taWNzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyQnVmZmVySW50NjRBdG9taWNzID0gc3JjLnNoYWRlckJ1ZmZlckludDY0QXRvbWljczsKKyAgICBzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3MgPSBzcmMuc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyQnVmZmVySW50NjRBdG9taWNzID0gc3JjLnNoYWRlckJ1ZmZlckludDY0QXRvbWljczsKKyAgICBzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3MgPSBzcmMuc2hhZGVyU2hhcmVkSW50NjRBdG9taWNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzaGFkZXJCdWZmZXJJbnQ2NEF0b21pY3MgPSBpbl9zdHJ1Y3QtPnNoYWRlckJ1ZmZlckludDY0QXRvbWljczsKKyAgICBzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3MgPSBpbl9zdHJ1Y3QtPnNoYWRlclNoYXJlZEludDY0QXRvbWljczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNoYWRlckJ1ZmZlckludDY0QXRvbWljcyA9IHNyYy0+c2hhZGVyQnVmZmVySW50NjRBdG9taWNzOworICAgIHNoYWRlclNoYXJlZEludDY0QXRvbWljcyA9IHNyYy0+c2hhZGVyU2hhcmVkSW50NjRBdG9taWNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc2hhZGVyU3ViZ3JvdXBDbG9jayhpbl9zdHJ1Y3QtPnNoYWRlclN1Ymdyb3VwQ2xvY2spLAorICAgIHNoYWRlckRldmljZUNsb2NrKGluX3N0cnVjdC0+c2hhZGVyRGV2aWNlQ2xvY2spCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJTdWJncm91cENsb2NrID0gc3JjLnNoYWRlclN1Ymdyb3VwQ2xvY2s7CisgICAgc2hhZGVyRGV2aWNlQ2xvY2sgPSBzcmMuc2hhZGVyRGV2aWNlQ2xvY2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFImIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJTdWJncm91cENsb2NrID0gc3JjLnNoYWRlclN1Ymdyb3VwQ2xvY2s7CisgICAgc2hhZGVyRGV2aWNlQ2xvY2sgPSBzcmMuc2hhZGVyRGV2aWNlQ2xvY2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNoYWRlclN1Ymdyb3VwQ2xvY2sgPSBpbl9zdHJ1Y3QtPnNoYWRlclN1Ymdyb3VwQ2xvY2s7CisgICAgc2hhZGVyRGV2aWNlQ2xvY2sgPSBpbl9zdHJ1Y3QtPnNoYWRlckRldmljZUNsb2NrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2hhZGVyU3ViZ3JvdXBDbG9jayA9IHNyYy0+c2hhZGVyU3ViZ3JvdXBDbG9jazsKKyAgICBzaGFkZXJEZXZpY2VDbG9jayA9IHNyYy0+c2hhZGVyRGV2aWNlQ2xvY2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkcml2ZXJJRChpbl9zdHJ1Y3QtPmRyaXZlcklEKSwKKyAgICBjb25mb3JtYW5jZVZlcnNpb24oaW5fc3RydWN0LT5jb25mb3JtYW5jZVZlcnNpb24pCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFI7ICsraSkgeworICAgICAgICBkcml2ZXJOYW1lW2ldID0gaW5fc3RydWN0LT5kcml2ZXJOYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RSSVZFUl9JTkZPX1NJWkVfS0hSOyArK2kpIHsKKyAgICAgICAgZHJpdmVySW5mb1tpXSA9IGluX3N0cnVjdC0+ZHJpdmVySW5mb1tpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRyaXZlcklEID0gc3JjLmRyaXZlcklEOworICAgIGNvbmZvcm1hbmNlVmVyc2lvbiA9IHNyYy5jb25mb3JtYW5jZVZlcnNpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9EUklWRVJfTkFNRV9TSVpFX0tIUjsgKytpKSB7CisgICAgICAgIGRyaXZlck5hbWVbaV0gPSBzcmMuZHJpdmVyTmFtZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9EUklWRVJfSU5GT19TSVpFX0tIUjsgKytpKSB7CisgICAgICAgIGRyaXZlckluZm9baV0gPSBzcmMuZHJpdmVySW5mb1tpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFImIHNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkcml2ZXJJRCA9IHNyYy5kcml2ZXJJRDsKKyAgICBjb25mb3JtYW5jZVZlcnNpb24gPSBzcmMuY29uZm9ybWFuY2VWZXJzaW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFI7ICsraSkgeworICAgICAgICBkcml2ZXJOYW1lW2ldID0gc3JjLmRyaXZlck5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfRFJJVkVSX0lORk9fU0laRV9LSFI7ICsraSkgeworICAgICAgICBkcml2ZXJJbmZvW2ldID0gc3JjLmRyaXZlckluZm9baV07CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkcml2ZXJJRCA9IGluX3N0cnVjdC0+ZHJpdmVySUQ7CisgICAgY29uZm9ybWFuY2VWZXJzaW9uID0gaW5fc3RydWN0LT5jb25mb3JtYW5jZVZlcnNpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFI7ICsraSkgeworICAgICAgICBkcml2ZXJOYW1lW2ldID0gaW5fc3RydWN0LT5kcml2ZXJOYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RSSVZFUl9JTkZPX1NJWkVfS0hSOyArK2kpIHsKKyAgICAgICAgZHJpdmVySW5mb1tpXSA9IGluX3N0cnVjdC0+ZHJpdmVySW5mb1tpXTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRyaXZlcklEID0gc3JjLT5kcml2ZXJJRDsKKyAgICBjb25mb3JtYW5jZVZlcnNpb24gPSBzcmMtPmNvbmZvcm1hbmNlVmVyc2lvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9EUklWRVJfTkFNRV9TSVpFX0tIUjsgKytpKSB7CisgICAgICAgIGRyaXZlck5hbWVbaV0gPSBzcmMtPmRyaXZlck5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfRFJJVkVSX0lORk9fU0laRV9LSFI7ICsraSkgeworICAgICAgICBkcml2ZXJJbmZvW2ldID0gc3JjLT5kcml2ZXJJbmZvW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGVub3JtQmVoYXZpb3JJbmRlcGVuZGVuY2UoaW5fc3RydWN0LT5kZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZSksCisgICAgcm91bmRpbmdNb2RlSW5kZXBlbmRlbmNlKGluX3N0cnVjdC0+cm91bmRpbmdNb2RlSW5kZXBlbmRlbmNlKSwKKyAgICBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2KGluX3N0cnVjdC0+c2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQxNiksCisgICAgc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQzMihpbl9zdHJ1Y3QtPnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzIpLAorICAgIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0NjQoaW5fc3RydWN0LT5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDY0KSwKKyAgICBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTYoaW5fc3RydWN0LT5zaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTYpLAorICAgIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMihpbl9zdHJ1Y3QtPnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMiksCisgICAgc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDY0KGluX3N0cnVjdC0+c2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDY0KSwKKyAgICBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTYoaW5fc3RydWN0LT5zaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTYpLAorICAgIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMihpbl9zdHJ1Y3QtPnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMiksCisgICAgc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDY0KGluX3N0cnVjdC0+c2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDY0KSwKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2KGluX3N0cnVjdC0+c2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQxNiksCisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQzMihpbl9zdHJ1Y3QtPnNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzIpLAorICAgIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0NjQoaW5fc3RydWN0LT5zaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDY0KSwKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2KGluX3N0cnVjdC0+c2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQxNiksCisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQzMihpbl9zdHJ1Y3QtPnNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzIpLAorICAgIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0NjQoaW5fc3RydWN0LT5zaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDY0KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZSA9IHNyYy5kZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZTsKKyAgICByb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UgPSBzcmMucm91bmRpbmdNb2RlSW5kZXBlbmRlbmNlOworICAgIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MTYgPSBzcmMuc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQxNjsKKyAgICBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDMyID0gc3JjLnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzI7CisgICAgc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NCA9IHNyYy5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDY0OworICAgIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQxNiA9IHNyYy5zaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTY7CisgICAgc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDMyID0gc3JjLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMjsKKyAgICBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0NjQgPSBzcmMuc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDY0OworICAgIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQxNiA9IHNyYy5zaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTY7CisgICAgc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDMyID0gc3JjLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMjsKKyAgICBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0NjQgPSBzcmMuc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDY0OworICAgIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MTYgPSBzcmMuc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQxNjsKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDMyID0gc3JjLnNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzI7CisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NCA9IHNyYy5zaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDY0OworICAgIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MTYgPSBzcmMuc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQxNjsKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDMyID0gc3JjLnNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzI7CisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NCA9IHNyYy5zaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDY0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGVub3JtQmVoYXZpb3JJbmRlcGVuZGVuY2UgPSBzcmMuZGVub3JtQmVoYXZpb3JJbmRlcGVuZGVuY2U7CisgICAgcm91bmRpbmdNb2RlSW5kZXBlbmRlbmNlID0gc3JjLnJvdW5kaW5nTW9kZUluZGVwZW5kZW5jZTsKKyAgICBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2ID0gc3JjLnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MTY7CisgICAgc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQzMiA9IHNyYy5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDMyOworICAgIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0NjQgPSBzcmMuc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NDsKKyAgICBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTYgPSBzcmMuc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDE2OworICAgIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMiA9IHNyYy5zaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MzI7CisgICAgc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDY0ID0gc3JjLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQ2NDsKKyAgICBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTYgPSBzcmMuc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDE2OworICAgIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMiA9IHNyYy5zaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MzI7CisgICAgc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDY0ID0gc3JjLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQ2NDsKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2ID0gc3JjLnNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MTY7CisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQzMiA9IHNyYy5zaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDMyOworICAgIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0NjQgPSBzcmMuc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NDsKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2ID0gc3JjLnNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MTY7CisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQzMiA9IHNyYy5zaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDMyOworICAgIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0NjQgPSBzcmMuc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRlbm9ybUJlaGF2aW9ySW5kZXBlbmRlbmNlID0gaW5fc3RydWN0LT5kZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZTsKKyAgICByb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UgPSBpbl9zdHJ1Y3QtPnJvdW5kaW5nTW9kZUluZGVwZW5kZW5jZTsKKyAgICBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2ID0gaW5fc3RydWN0LT5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDE2OworICAgIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzIgPSBpbl9zdHJ1Y3QtPnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MzI7CisgICAgc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NCA9IGluX3N0cnVjdC0+c2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQ2NDsKKyAgICBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MTYgPSBpbl9zdHJ1Y3QtPnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQxNjsKKyAgICBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0MzIgPSBpbl9zdHJ1Y3QtPnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMjsKKyAgICBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0NjQgPSBpbl9zdHJ1Y3QtPnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQ2NDsKKyAgICBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MTYgPSBpbl9zdHJ1Y3QtPnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQxNjsKKyAgICBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0MzIgPSBpbl9zdHJ1Y3QtPnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMjsKKyAgICBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0NjQgPSBpbl9zdHJ1Y3QtPnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQ2NDsKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2ID0gaW5fc3RydWN0LT5zaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDE2OworICAgIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzIgPSBpbl9zdHJ1Y3QtPnNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MzI7CisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NCA9IGluX3N0cnVjdC0+c2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQ2NDsKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2ID0gaW5fc3RydWN0LT5zaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDE2OworICAgIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzIgPSBpbl9zdHJ1Y3QtPnNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MzI7CisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NCA9IGluX3N0cnVjdC0+c2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQ2NDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGVub3JtQmVoYXZpb3JJbmRlcGVuZGVuY2UgPSBzcmMtPmRlbm9ybUJlaGF2aW9ySW5kZXBlbmRlbmNlOworICAgIHJvdW5kaW5nTW9kZUluZGVwZW5kZW5jZSA9IHNyYy0+cm91bmRpbmdNb2RlSW5kZXBlbmRlbmNlOworICAgIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MTYgPSBzcmMtPnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0MTY7CisgICAgc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQzMiA9IHNyYy0+c2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQzMjsKKyAgICBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDY0ID0gc3JjLT5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDY0OworICAgIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQxNiA9IHNyYy0+c2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDE2OworICAgIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMiA9IHNyYy0+c2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDMyOworICAgIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQ2NCA9IHNyYy0+c2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDY0OworICAgIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQxNiA9IHNyYy0+c2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDE2OworICAgIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMiA9IHNyYy0+c2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDMyOworICAgIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQ2NCA9IHNyYy0+c2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDY0OworICAgIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MTYgPSBzcmMtPnNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MTY7CisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQzMiA9IHNyYy0+c2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQzMjsKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDY0ID0gc3JjLT5zaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDY0OworICAgIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MTYgPSBzcmMtPnNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MTY7CisgICAgc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQzMiA9IHNyYy0+c2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQzMjsKKyAgICBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDY0ID0gc3JjLT5zaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDY0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI6OnNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSKGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGVwdGhSZXNvbHZlTW9kZShpbl9zdHJ1Y3QtPmRlcHRoUmVzb2x2ZU1vZGUpLAorICAgIHN0ZW5jaWxSZXNvbHZlTW9kZShpbl9zdHJ1Y3QtPnN0ZW5jaWxSZXNvbHZlTW9kZSksCisgICAgcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50KG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCkKKyAgICAgICAgcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50ID0gbmV3IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUihpbl9zdHJ1Y3QtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCk7Cit9CisKK3NhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSOjpzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSOjpzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUihjb25zdCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRlcHRoUmVzb2x2ZU1vZGUgPSBzcmMuZGVwdGhSZXNvbHZlTW9kZTsKKyAgICBzdGVuY2lsUmVzb2x2ZU1vZGUgPSBzcmMuc3RlbmNpbFJlc29sdmVNb2RlOworICAgIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQpCisgICAgICAgIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoKnNyYy5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQpOworfQorCitzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiYgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQpCisgICAgICAgIGRlbGV0ZSBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQ7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZXB0aFJlc29sdmVNb2RlID0gc3JjLmRlcHRoUmVzb2x2ZU1vZGU7CisgICAgc3RlbmNpbFJlc29sdmVNb2RlID0gc3JjLnN0ZW5jaWxSZXNvbHZlTW9kZTsKKyAgICBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50KQorICAgICAgICBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKCpzcmMucERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI6On5zYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUigpCit7CisgICAgaWYgKHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCkKKyAgICAgICAgZGVsZXRlIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudDsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGVwdGhSZXNvbHZlTW9kZSA9IGluX3N0cnVjdC0+ZGVwdGhSZXNvbHZlTW9kZTsKKyAgICBzdGVuY2lsUmVzb2x2ZU1vZGUgPSBpbl9zdHJ1Y3QtPnN0ZW5jaWxSZXNvbHZlTW9kZTsKKyAgICBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQpCisgICAgICAgIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoaW5fc3RydWN0LT5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQpOworfQorCit2b2lkIHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRlcHRoUmVzb2x2ZU1vZGUgPSBzcmMtPmRlcHRoUmVzb2x2ZU1vZGU7CisgICAgc3RlbmNpbFJlc29sdmVNb2RlID0gc3JjLT5zdGVuY2lsUmVzb2x2ZU1vZGU7CisgICAgcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50ID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50KQorICAgICAgICBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKCpzcmMtPnBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHN1cHBvcnRlZERlcHRoUmVzb2x2ZU1vZGVzKGluX3N0cnVjdC0+c3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXMpLAorICAgIHN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXMoaW5fc3RydWN0LT5zdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzKSwKKyAgICBpbmRlcGVuZGVudFJlc29sdmVOb25lKGluX3N0cnVjdC0+aW5kZXBlbmRlbnRSZXNvbHZlTm9uZSksCisgICAgaW5kZXBlbmRlbnRSZXNvbHZlKGluX3N0cnVjdC0+aW5kZXBlbmRlbnRSZXNvbHZlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlcyA9IHNyYy5zdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlczsKKyAgICBzdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzID0gc3JjLnN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXM7CisgICAgaW5kZXBlbmRlbnRSZXNvbHZlTm9uZSA9IHNyYy5pbmRlcGVuZGVudFJlc29sdmVOb25lOworICAgIGluZGVwZW5kZW50UmVzb2x2ZSA9IHNyYy5pbmRlcGVuZGVudFJlc29sdmU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlcyA9IHNyYy5zdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlczsKKyAgICBzdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzID0gc3JjLnN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXM7CisgICAgaW5kZXBlbmRlbnRSZXNvbHZlTm9uZSA9IHNyYy5pbmRlcGVuZGVudFJlc29sdmVOb25lOworICAgIGluZGVwZW5kZW50UmVzb2x2ZSA9IHNyYy5pbmRlcGVuZGVudFJlc29sdmU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlcyA9IGluX3N0cnVjdC0+c3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXM7CisgICAgc3VwcG9ydGVkU3RlbmNpbFJlc29sdmVNb2RlcyA9IGluX3N0cnVjdC0+c3VwcG9ydGVkU3RlbmNpbFJlc29sdmVNb2RlczsKKyAgICBpbmRlcGVuZGVudFJlc29sdmVOb25lID0gaW5fc3RydWN0LT5pbmRlcGVuZGVudFJlc29sdmVOb25lOworICAgIGluZGVwZW5kZW50UmVzb2x2ZSA9IGluX3N0cnVjdC0+aW5kZXBlbmRlbnRSZXNvbHZlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlcyA9IHNyYy0+c3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXM7CisgICAgc3VwcG9ydGVkU3RlbmNpbFJlc29sdmVNb2RlcyA9IHNyYy0+c3VwcG9ydGVkU3RlbmNpbFJlc29sdmVNb2RlczsKKyAgICBpbmRlcGVuZGVudFJlc29sdmVOb25lID0gc3JjLT5pbmRlcGVuZGVudFJlc29sdmVOb25lOworICAgIGluZGVwZW5kZW50UmVzb2x2ZSA9IHNyYy0+aW5kZXBlbmRlbnRSZXNvbHZlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgdGltZWxpbmVTZW1hcGhvcmUoaW5fc3RydWN0LT50aW1lbGluZVNlbWFwaG9yZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHRpbWVsaW5lU2VtYXBob3JlID0gc3JjLnRpbWVsaW5lU2VtYXBob3JlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdGltZWxpbmVTZW1hcGhvcmUgPSBzcmMudGltZWxpbmVTZW1hcGhvcmU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHRpbWVsaW5lU2VtYXBob3JlID0gaW5fc3RydWN0LT50aW1lbGluZVNlbWFwaG9yZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHRpbWVsaW5lU2VtYXBob3JlID0gc3JjLT50aW1lbGluZVNlbWFwaG9yZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlKGluX3N0cnVjdC0+bWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UgPSBzcmMubWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZSA9IHNyYy5tYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFI6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZSA9IGluX3N0cnVjdC0+bWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UgPSBzcmMtPm1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSOjpzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIoY29uc3QgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc2VtYXBob3JlVHlwZShpbl9zdHJ1Y3QtPnNlbWFwaG9yZVR5cGUpLAorICAgIGluaXRpYWxWYWx1ZShpbl9zdHJ1Y3QtPmluaXRpYWxWYWx1ZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI6OnNhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzZW1hcGhvcmVUeXBlID0gc3JjLnNlbWFwaG9yZVR5cGU7CisgICAgaW5pdGlhbFZhbHVlID0gc3JjLmluaXRpYWxWYWx1ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSJiBzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNlbWFwaG9yZVR5cGUgPSBzcmMuc2VtYXBob3JlVHlwZTsKKyAgICBpbml0aWFsVmFsdWUgPSBzcmMuaW5pdGlhbFZhbHVlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI6On5zYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNlbWFwaG9yZVR5cGUgPSBpbl9zdHJ1Y3QtPnNlbWFwaG9yZVR5cGU7CisgICAgaW5pdGlhbFZhbHVlID0gaW5fc3RydWN0LT5pbml0aWFsVmFsdWU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2VtYXBob3JlVHlwZSA9IHNyYy0+c2VtYXBob3JlVHlwZTsKKyAgICBpbml0aWFsVmFsdWUgPSBzcmMtPmluaXRpYWxWYWx1ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI6OnNhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIoY29uc3QgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHdhaXRTZW1hcGhvcmVWYWx1ZUNvdW50KGluX3N0cnVjdC0+d2FpdFNlbWFwaG9yZVZhbHVlQ291bnQpLAorICAgIHBXYWl0U2VtYXBob3JlVmFsdWVzKG51bGxwdHIpLAorICAgIHNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQoaW5fc3RydWN0LT5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50KSwKKyAgICBwU2lnbmFsU2VtYXBob3JlVmFsdWVzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBXYWl0U2VtYXBob3JlVmFsdWVzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlVmFsdWVzID0gbmV3IHVpbnQ2NF90W2luX3N0cnVjdC0+d2FpdFNlbWFwaG9yZVZhbHVlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFdhaXRTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFNpZ25hbFNlbWFwaG9yZVZhbHVlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlVmFsdWVzID0gbmV3IHVpbnQ2NF90W2luX3N0cnVjdC0+c2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2lnbmFsU2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKWluX3N0cnVjdC0+cFNpZ25hbFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUjo6c2FmZV9Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwV2FpdFNlbWFwaG9yZVZhbHVlcyhudWxscHRyKSwKKyAgICBwU2lnbmFsU2VtYXBob3JlVmFsdWVzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSOjpzYWZlX1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSKGNvbnN0IHNhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB3YWl0U2VtYXBob3JlVmFsdWVDb3VudCA9IHNyYy53YWl0U2VtYXBob3JlVmFsdWVDb3VudDsKKyAgICBwV2FpdFNlbWFwaG9yZVZhbHVlcyA9IG51bGxwdHI7CisgICAgc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudCA9IHNyYy5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50OworICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFdhaXRTZW1hcGhvcmVWYWx1ZXMpIHsKKyAgICAgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSBuZXcgdWludDY0X3Rbc3JjLndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBXYWl0U2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKXNyYy5wV2FpdFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSpzcmMud2FpdFNlbWFwaG9yZVZhbHVlQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMpIHsKKyAgICAgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9IG5ldyB1aW50NjRfdFtzcmMuc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2lnbmFsU2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKXNyYy5wU2lnbmFsU2VtYXBob3JlVmFsdWVzLCBzaXplb2YodWludDY0X3QpKnNyYy5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFImIHNhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBXYWl0U2VtYXBob3JlVmFsdWVzKQorICAgICAgICBkZWxldGVbXSBwV2FpdFNlbWFwaG9yZVZhbHVlczsKKyAgICBpZiAocFNpZ25hbFNlbWFwaG9yZVZhbHVlcykKKyAgICAgICAgZGVsZXRlW10gcFNpZ25hbFNlbWFwaG9yZVZhbHVlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHdhaXRTZW1hcGhvcmVWYWx1ZUNvdW50ID0gc3JjLndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlVmFsdWVzID0gbnVsbHB0cjsKKyAgICBzaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50ID0gc3JjLnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQ7CisgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wV2FpdFNlbWFwaG9yZVZhbHVlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZVZhbHVlcyA9IG5ldyB1aW50NjRfdFtzcmMud2FpdFNlbWFwaG9yZVZhbHVlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFdhaXRTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopc3JjLnBXYWl0U2VtYXBob3JlVmFsdWVzLCBzaXplb2YodWludDY0X3QpKnNyYy53YWl0U2VtYXBob3JlVmFsdWVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucFNpZ25hbFNlbWFwaG9yZVZhbHVlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlVmFsdWVzID0gbmV3IHVpbnQ2NF90W3NyYy5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTaWduYWxTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopc3JjLnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMsIHNpemVvZih1aW50NjRfdCkqc3JjLnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUjo6fnNhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIoKQoreworICAgIGlmIChwV2FpdFNlbWFwaG9yZVZhbHVlcykKKyAgICAgICAgZGVsZXRlW10gcFdhaXRTZW1hcGhvcmVWYWx1ZXM7CisgICAgaWYgKHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMpCisgICAgICAgIGRlbGV0ZVtdIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB3YWl0U2VtYXBob3JlVmFsdWVDb3VudCA9IGluX3N0cnVjdC0+d2FpdFNlbWFwaG9yZVZhbHVlQ291bnQ7CisgICAgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSBudWxscHRyOworICAgIHNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQgPSBpbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQ7CisgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBXYWl0U2VtYXBob3JlVmFsdWVzKSB7CisgICAgICAgIHBXYWl0U2VtYXBob3JlVmFsdWVzID0gbmV3IHVpbnQ2NF90W2luX3N0cnVjdC0+d2FpdFNlbWFwaG9yZVZhbHVlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFdhaXRTZW1hcGhvcmVWYWx1ZXMsICh2b2lkICopaW5fc3RydWN0LT5wV2FpdFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50KTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFNpZ25hbFNlbWFwaG9yZVZhbHVlcykgeworICAgICAgICBwU2lnbmFsU2VtYXBob3JlVmFsdWVzID0gbmV3IHVpbnQ2NF90W2luX3N0cnVjdC0+c2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2lnbmFsU2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKWluX3N0cnVjdC0+cFNpZ25hbFNlbWFwaG9yZVZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgd2FpdFNlbWFwaG9yZVZhbHVlQ291bnQgPSBzcmMtPndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50OworICAgIHBXYWl0U2VtYXBob3JlVmFsdWVzID0gbnVsbHB0cjsKKyAgICBzaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50ID0gc3JjLT5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50OworICAgIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wV2FpdFNlbWFwaG9yZVZhbHVlcykgeworICAgICAgICBwV2FpdFNlbWFwaG9yZVZhbHVlcyA9IG5ldyB1aW50NjRfdFtzcmMtPndhaXRTZW1hcGhvcmVWYWx1ZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBXYWl0U2VtYXBob3JlVmFsdWVzLCAodm9pZCAqKXNyYy0+cFdhaXRTZW1hcGhvcmVWYWx1ZXMsIHNpemVvZih1aW50NjRfdCkqc3JjLT53YWl0U2VtYXBob3JlVmFsdWVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMtPnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMpIHsKKyAgICAgICAgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9IG5ldyB1aW50NjRfdFtzcmMtPnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNpZ25hbFNlbWFwaG9yZVZhbHVlcywgKHZvaWQgKilzcmMtPnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMsIHNpemVvZih1aW50NjRfdCkqc3JjLT5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtTZW1hcGhvcmVXYWl0SW5mb0tIUjo6c2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSKGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHNlbWFwaG9yZUNvdW50KGluX3N0cnVjdC0+c2VtYXBob3JlQ291bnQpLAorICAgIHBTZW1hcGhvcmVzKG51bGxwdHIpLAorICAgIHBWYWx1ZXMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKHNlbWFwaG9yZUNvdW50ICYmIGluX3N0cnVjdC0+cFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbc2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNlbWFwaG9yZXNbaV0gPSBpbl9zdHJ1Y3QtPnBTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBWYWx1ZXMpIHsKKyAgICAgICAgcFZhbHVlcyA9IG5ldyB1aW50NjRfdFtpbl9zdHJ1Y3QtPnNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWYWx1ZXMsICh2b2lkICopaW5fc3RydWN0LT5wVmFsdWVzLCBzaXplb2YodWludDY0X3QpKmluX3N0cnVjdC0+c2VtYXBob3JlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSOjpzYWZlX1ZrU2VtYXBob3JlV2FpdEluZm9LSFIoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFNlbWFwaG9yZXMobnVsbHB0ciksCisgICAgcFZhbHVlcyhudWxscHRyKQore30KKworc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSOjpzYWZlX1ZrU2VtYXBob3JlV2FpdEluZm9LSFIoY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgc2VtYXBob3JlQ291bnQgPSBzcmMuc2VtYXBob3JlQ291bnQ7CisgICAgcFNlbWFwaG9yZXMgPSBudWxscHRyOworICAgIHBWYWx1ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzZW1hcGhvcmVDb3VudCAmJiBzcmMucFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbc2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNlbWFwaG9yZXNbaV0gPSBzcmMucFNlbWFwaG9yZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wVmFsdWVzKSB7CisgICAgICAgIHBWYWx1ZXMgPSBuZXcgdWludDY0X3Rbc3JjLnNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWYWx1ZXMsICh2b2lkICopc3JjLnBWYWx1ZXMsIHNpemVvZih1aW50NjRfdCkqc3JjLnNlbWFwaG9yZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiYgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBTZW1hcGhvcmVzKQorICAgICAgICBkZWxldGVbXSBwU2VtYXBob3JlczsKKyAgICBpZiAocFZhbHVlcykKKyAgICAgICAgZGVsZXRlW10gcFZhbHVlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHNlbWFwaG9yZUNvdW50ID0gc3JjLnNlbWFwaG9yZUNvdW50OworICAgIHBTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBwVmFsdWVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc2VtYXBob3JlQ291bnQgJiYgc3JjLnBTZW1hcGhvcmVzKSB7CisgICAgICAgIHBTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3NlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTZW1hcGhvcmVzW2ldID0gc3JjLnBTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucFZhbHVlcykgeworICAgICAgICBwVmFsdWVzID0gbmV3IHVpbnQ2NF90W3NyYy5zZW1hcGhvcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmFsdWVzLCAodm9pZCAqKXNyYy5wVmFsdWVzLCBzaXplb2YodWludDY0X3QpKnNyYy5zZW1hcGhvcmVDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU2VtYXBob3JlV2FpdEluZm9LSFI6On5zYWZlX1ZrU2VtYXBob3JlV2FpdEluZm9LSFIoKQoreworICAgIGlmIChwU2VtYXBob3JlcykKKyAgICAgICAgZGVsZXRlW10gcFNlbWFwaG9yZXM7CisgICAgaWYgKHBWYWx1ZXMpCisgICAgICAgIGRlbGV0ZVtdIHBWYWx1ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHNlbWFwaG9yZUNvdW50ID0gaW5fc3RydWN0LT5zZW1hcGhvcmVDb3VudDsKKyAgICBwU2VtYXBob3JlcyA9IG51bGxwdHI7CisgICAgcFZhbHVlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChzZW1hcGhvcmVDb3VudCAmJiBpbl9zdHJ1Y3QtPnBTZW1hcGhvcmVzKSB7CisgICAgICAgIHBTZW1hcGhvcmVzID0gbmV3IFZrU2VtYXBob3JlW3NlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTZW1hcGhvcmVzW2ldID0gaW5fc3RydWN0LT5wU2VtYXBob3Jlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wVmFsdWVzKSB7CisgICAgICAgIHBWYWx1ZXMgPSBuZXcgdWludDY0X3RbaW5fc3RydWN0LT5zZW1hcGhvcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmFsdWVzLCAodm9pZCAqKWluX3N0cnVjdC0+cFZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPnNlbWFwaG9yZUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgc2VtYXBob3JlQ291bnQgPSBzcmMtPnNlbWFwaG9yZUNvdW50OworICAgIHBTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBwVmFsdWVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNlbWFwaG9yZUNvdW50ICYmIHNyYy0+cFNlbWFwaG9yZXMpIHsKKyAgICAgICAgcFNlbWFwaG9yZXMgPSBuZXcgVmtTZW1hcGhvcmVbc2VtYXBob3JlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2VtYXBob3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNlbWFwaG9yZXNbaV0gPSBzcmMtPnBTZW1hcGhvcmVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMtPnBWYWx1ZXMpIHsKKyAgICAgICAgcFZhbHVlcyA9IG5ldyB1aW50NjRfdFtzcmMtPnNlbWFwaG9yZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWYWx1ZXMsICh2b2lkICopc3JjLT5wVmFsdWVzLCBzaXplb2YodWludDY0X3QpKnNyYy0+c2VtYXBob3JlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFI6OnNhZmVfVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc2VtYXBob3JlKGluX3N0cnVjdC0+c2VtYXBob3JlKSwKKyAgICB2YWx1ZShpbl9zdHJ1Y3QtPnZhbHVlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFI6OnNhZmVfVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUjo6c2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIoY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzZW1hcGhvcmUgPSBzcmMuc2VtYXBob3JlOworICAgIHZhbHVlID0gc3JjLnZhbHVlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiYgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2VtYXBob3JlID0gc3JjLnNlbWFwaG9yZTsKKyAgICB2YWx1ZSA9IHNyYy52YWx1ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFI6On5zYWZlX1ZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNlbWFwaG9yZSA9IGluX3N0cnVjdC0+c2VtYXBob3JlOworICAgIHZhbHVlID0gaW5fc3RydWN0LT52YWx1ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2VtYXBob3JlID0gc3JjLT5zZW1hcGhvcmU7CisgICAgdmFsdWUgPSBzcmMtPnZhbHVlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgdnVsa2FuTWVtb3J5TW9kZWwoaW5fc3RydWN0LT52dWxrYW5NZW1vcnlNb2RlbCksCisgICAgdnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZShpbl9zdHJ1Y3QtPnZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGUpLAorICAgIHZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWlucyhpbl9zdHJ1Y3QtPnZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWlucykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHZ1bGthbk1lbW9yeU1vZGVsID0gc3JjLnZ1bGthbk1lbW9yeU1vZGVsOworICAgIHZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGUgPSBzcmMudnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZTsKKyAgICB2dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnMgPSBzcmMudnVsa2FuTWVtb3J5TW9kZWxBdmFpbGFiaWxpdHlWaXNpYmlsaXR5Q2hhaW5zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdnVsa2FuTWVtb3J5TW9kZWwgPSBzcmMudnVsa2FuTWVtb3J5TW9kZWw7CisgICAgdnVsa2FuTWVtb3J5TW9kZWxEZXZpY2VTY29wZSA9IHNyYy52dWxrYW5NZW1vcnlNb2RlbERldmljZVNjb3BlOworICAgIHZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWlucyA9IHNyYy52dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFI6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHZ1bGthbk1lbW9yeU1vZGVsID0gaW5fc3RydWN0LT52dWxrYW5NZW1vcnlNb2RlbDsKKyAgICB2dWxrYW5NZW1vcnlNb2RlbERldmljZVNjb3BlID0gaW5fc3RydWN0LT52dWxrYW5NZW1vcnlNb2RlbERldmljZVNjb3BlOworICAgIHZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWlucyA9IGluX3N0cnVjdC0+dnVsa2FuTWVtb3J5TW9kZWxBdmFpbGFiaWxpdHlWaXNpYmlsaXR5Q2hhaW5zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgdnVsa2FuTWVtb3J5TW9kZWwgPSBzcmMtPnZ1bGthbk1lbW9yeU1vZGVsOworICAgIHZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGUgPSBzcmMtPnZ1bGthbk1lbW9yeU1vZGVsRGV2aWNlU2NvcGU7CisgICAgdnVsa2FuTWVtb3J5TW9kZWxBdmFpbGFiaWxpdHlWaXNpYmlsaXR5Q2hhaW5zID0gc3JjLT52dWxrYW5NZW1vcnlNb2RlbEF2YWlsYWJpbGl0eVZpc2liaWxpdHlDaGFpbnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUjo6c2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIoY29uc3QgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzdXBwb3J0c1Byb3RlY3RlZChpbl9zdHJ1Y3QtPnN1cHBvcnRzUHJvdGVjdGVkKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFI6OnNhZmVfVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUjo6c2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIoY29uc3Qgc2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdXBwb3J0c1Byb3RlY3RlZCA9IHNyYy5zdXBwb3J0c1Byb3RlY3RlZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFImIHNhZmVfVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN1cHBvcnRzUHJvdGVjdGVkID0gc3JjLnN1cHBvcnRzUHJvdGVjdGVkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUjo6fnNhZmVfVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3VwcG9ydHNQcm90ZWN0ZWQgPSBpbl9zdHJ1Y3QtPnN1cHBvcnRzUHJvdGVjdGVkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzdXBwb3J0c1Byb3RlY3RlZCA9IHNyYy0+c3VwcG9ydHNQcm90ZWN0ZWQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMoaW5fc3RydWN0LT5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cyA9IHNyYy5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMgPSBzcmMuc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUjo6fnNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzID0gaW5fc3RydWN0LT5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cyA9IHNyYy0+c2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSOjpzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIoY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3RlbmNpbExheW91dChpbl9zdHJ1Y3QtPnN0ZW5jaWxMYXlvdXQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFI6OnNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSOjpzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIoY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3RlbmNpbExheW91dCA9IHNyYy5zdGVuY2lsTGF5b3V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFImIHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3RlbmNpbExheW91dCA9IHNyYy5zdGVuY2lsTGF5b3V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFI6On5zYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUjo6aW5pdGlhbGl6ZShjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHN0ZW5jaWxMYXlvdXQgPSBpbl9zdHJ1Y3QtPnN0ZW5jaWxMYXlvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3RlbmNpbExheW91dCA9IHNyYy0+c3RlbmNpbExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSOjpzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUihjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHN0ZW5jaWxJbml0aWFsTGF5b3V0KGluX3N0cnVjdC0+c3RlbmNpbEluaXRpYWxMYXlvdXQpLAorICAgIHN0ZW5jaWxGaW5hbExheW91dChpbl9zdHJ1Y3QtPnN0ZW5jaWxGaW5hbExheW91dCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSOjpzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFI6OnNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSKGNvbnN0IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3RlbmNpbEluaXRpYWxMYXlvdXQgPSBzcmMuc3RlbmNpbEluaXRpYWxMYXlvdXQ7CisgICAgc3RlbmNpbEZpbmFsTGF5b3V0ID0gc3JjLnN0ZW5jaWxGaW5hbExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFImIHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN0ZW5jaWxJbml0aWFsTGF5b3V0ID0gc3JjLnN0ZW5jaWxJbml0aWFsTGF5b3V0OworICAgIHN0ZW5jaWxGaW5hbExheW91dCA9IHNyYy5zdGVuY2lsRmluYWxMYXlvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSOjp+c2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSOjppbml0aWFsaXplKGNvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzdGVuY2lsSW5pdGlhbExheW91dCA9IGluX3N0cnVjdC0+c3RlbmNpbEluaXRpYWxMYXlvdXQ7CisgICAgc3RlbmNpbEZpbmFsTGF5b3V0ID0gaW5fc3RydWN0LT5zdGVuY2lsRmluYWxMYXlvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHN0ZW5jaWxJbml0aWFsTGF5b3V0ID0gc3JjLT5zdGVuY2lsSW5pdGlhbExheW91dDsKKyAgICBzdGVuY2lsRmluYWxMYXlvdXQgPSBzcmMtPnN0ZW5jaWxGaW5hbExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dChpbl9zdHJ1Y3QtPnVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0ID0gc3JjLnVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFImIHNhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dCA9IHNyYy51bmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB1bmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXQgPSBpbl9zdHJ1Y3QtPnVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgdW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0ID0gc3JjLT51bmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI6OnNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzKGluX3N0cnVjdC0+YnVmZmVyRGV2aWNlQWRkcmVzcyksCisgICAgYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkoaW5fc3RydWN0LT5idWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSksCisgICAgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlKGluX3N0cnVjdC0+YnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGJ1ZmZlckRldmljZUFkZHJlc3MgPSBzcmMuYnVmZmVyRGV2aWNlQWRkcmVzczsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSA9IHNyYy5idWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UgPSBzcmMuYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFImIHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYnVmZmVyRGV2aWNlQWRkcmVzcyA9IHNyYy5idWZmZXJEZXZpY2VBZGRyZXNzOworICAgIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5ID0gc3JjLmJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5OworICAgIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSA9IHNyYy5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUjo6fnNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYnVmZmVyRGV2aWNlQWRkcmVzcyA9IGluX3N0cnVjdC0+YnVmZmVyRGV2aWNlQWRkcmVzczsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSA9IGluX3N0cnVjdC0+YnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXk7CisgICAgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlID0gaW5fc3RydWN0LT5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgYnVmZmVyRGV2aWNlQWRkcmVzcyA9IHNyYy0+YnVmZmVyRGV2aWNlQWRkcmVzczsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSA9IHNyYy0+YnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXk7CisgICAgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlID0gc3JjLT5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFI6OnNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUihjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBidWZmZXIoaW5fc3RydWN0LT5idWZmZXIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFI6OnNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSOjpzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIoY29uc3Qgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYnVmZmVyID0gc3JjLmJ1ZmZlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSJiBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGJ1ZmZlciA9IHNyYy5idWZmZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUjo6fnNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYnVmZmVyID0gaW5fc3RydWN0LT5idWZmZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgYnVmZmVyID0gc3JjLT5idWZmZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSOjpzYWZlX1ZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSKGNvbnN0IFZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBvcGFxdWVDYXB0dXJlQWRkcmVzcyhpbl9zdHJ1Y3QtPm9wYXF1ZUNhcHR1cmVBZGRyZXNzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUjo6c2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb3BhcXVlQ2FwdHVyZUFkZHJlc3MgPSBzcmMub3BhcXVlQ2FwdHVyZUFkZHJlc3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFImIHNhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBvcGFxdWVDYXB0dXJlQWRkcmVzcyA9IHNyYy5vcGFxdWVDYXB0dXJlQWRkcmVzczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUjo6fnNhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgb3BhcXVlQ2FwdHVyZUFkZHJlc3MgPSBpbl9zdHJ1Y3QtPm9wYXF1ZUNhcHR1cmVBZGRyZXNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgb3BhcXVlQ2FwdHVyZUFkZHJlc3MgPSBzcmMtPm9wYXF1ZUNhcHR1cmVBZGRyZXNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSOjpzYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIoY29uc3QgVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgb3BhcXVlQ2FwdHVyZUFkZHJlc3MoaW5fc3RydWN0LT5vcGFxdWVDYXB0dXJlQWRkcmVzcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUjo6c2FmZV9Wa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFI6OnNhZmVfVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBvcGFxdWVDYXB0dXJlQWRkcmVzcyA9IHNyYy5vcGFxdWVDYXB0dXJlQWRkcmVzczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSJiBzYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG9wYXF1ZUNhcHR1cmVBZGRyZXNzID0gc3JjLm9wYXF1ZUNhcHR1cmVBZGRyZXNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFI6On5zYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG9wYXF1ZUNhcHR1cmVBZGRyZXNzID0gaW5fc3RydWN0LT5vcGFxdWVDYXB0dXJlQWRkcmVzczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBvcGFxdWVDYXB0dXJlQWRkcmVzcyA9IHNyYy0+b3BhcXVlQ2FwdHVyZUFkZHJlc3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSOjpzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtZW1vcnkoaW5fc3RydWN0LT5tZW1vcnkpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSOjpzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSOjpzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKGNvbnN0IHNhZmVfVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFImIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnkgPSBzcmMubWVtb3J5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSJiBzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5ID0gc3JjLm1lbW9yeTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUjo6fnNhZmVfVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWVtb3J5ID0gaW5fc3RydWN0LT5tZW1vcnk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtZW1vcnkgPSBzcmMtPm1lbW9yeTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBpcGVsaW5lRXhlY3V0YWJsZUluZm8oaW5fc3RydWN0LT5waXBlbGluZUV4ZWN1dGFibGVJbmZvKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBpcGVsaW5lRXhlY3V0YWJsZUluZm8gPSBzcmMucGlwZWxpbmVFeGVjdXRhYmxlSW5mbzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBpcGVsaW5lRXhlY3V0YWJsZUluZm8gPSBzcmMucGlwZWxpbmVFeGVjdXRhYmxlSW5mbzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFI6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwaXBlbGluZUV4ZWN1dGFibGVJbmZvID0gaW5fc3RydWN0LT5waXBlbGluZUV4ZWN1dGFibGVJbmZvOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBpcGVsaW5lRXhlY3V0YWJsZUluZm8gPSBzcmMtPnBpcGVsaW5lRXhlY3V0YWJsZUluZm87CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVJbmZvS0hSOjpzYWZlX1ZrUGlwZWxpbmVJbmZvS0hSKGNvbnN0IFZrUGlwZWxpbmVJbmZvS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBwaXBlbGluZShpbl9zdHJ1Y3QtPnBpcGVsaW5lKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lSW5mb0tIUjo6c2FmZV9Wa1BpcGVsaW5lSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lSW5mb0tIUjo6c2FmZV9Wa1BpcGVsaW5lSW5mb0tIUihjb25zdCBzYWZlX1ZrUGlwZWxpbmVJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGlwZWxpbmUgPSBzcmMucGlwZWxpbmU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUluZm9LSFImIHNhZmVfVmtQaXBlbGluZUluZm9LSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVJbmZvS0hSJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwaXBlbGluZSA9IHNyYy5waXBlbGluZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lSW5mb0tIUjo6fnNhZmVfVmtQaXBlbGluZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUluZm9LSFI6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZUluZm9LSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcGlwZWxpbmUgPSBpbl9zdHJ1Y3QtPnBpcGVsaW5lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUluZm9LSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcGlwZWxpbmUgPSBzcmMtPnBpcGVsaW5lOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3RhZ2VzKGluX3N0cnVjdC0+c3RhZ2VzKSwKKyAgICBzdWJncm91cFNpemUoaW5fc3RydWN0LT5zdWJncm91cFNpemUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIG5hbWVbaV0gPSBpbl9zdHJ1Y3QtPm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gaW5fc3RydWN0LT5kZXNjcmlwdGlvbltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSOjpzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFI6OnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3RhZ2VzID0gc3JjLnN0YWdlczsKKyAgICBzdWJncm91cFNpemUgPSBzcmMuc3ViZ3JvdXBTaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIG5hbWVbaV0gPSBzcmMubmFtZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgZGVzY3JpcHRpb25baV0gPSBzcmMuZGVzY3JpcHRpb25baV07CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiYgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFI6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3RhZ2VzID0gc3JjLnN0YWdlczsKKyAgICBzdWJncm91cFNpemUgPSBzcmMuc3ViZ3JvdXBTaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIG5hbWVbaV0gPSBzcmMubmFtZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgZGVzY3JpcHRpb25baV0gPSBzcmMuZGVzY3JpcHRpb25baV07CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjo6fnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUjo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3RhZ2VzID0gaW5fc3RydWN0LT5zdGFnZXM7CisgICAgc3ViZ3JvdXBTaXplID0gaW5fc3RydWN0LT5zdWJncm91cFNpemU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIG5hbWVbaV0gPSBpbl9zdHJ1Y3QtPm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gaW5fc3RydWN0LT5kZXNjcmlwdGlvbltpXTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFI6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3RhZ2VzID0gc3JjLT5zdGFnZXM7CisgICAgc3ViZ3JvdXBTaXplID0gc3JjLT5zdWJncm91cFNpemU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIG5hbWVbaV0gPSBzcmMtPm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gc3JjLT5kZXNjcmlwdGlvbltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSOjpzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUihjb25zdCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBpcGVsaW5lKGluX3N0cnVjdC0+cGlwZWxpbmUpLAorICAgIGV4ZWN1dGFibGVJbmRleChpbl9zdHJ1Y3QtPmV4ZWN1dGFibGVJbmRleCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSOjpzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFI6OnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGlwZWxpbmUgPSBzcmMucGlwZWxpbmU7CisgICAgZXhlY3V0YWJsZUluZGV4ID0gc3JjLmV4ZWN1dGFibGVJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFImIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBpcGVsaW5lID0gc3JjLnBpcGVsaW5lOworICAgIGV4ZWN1dGFibGVJbmRleCA9IHNyYy5leGVjdXRhYmxlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSOjp+c2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwaXBlbGluZSA9IGluX3N0cnVjdC0+cGlwZWxpbmU7CisgICAgZXhlY3V0YWJsZUluZGV4ID0gaW5fc3RydWN0LT5leGVjdXRhYmxlSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBpcGVsaW5lID0gc3JjLT5waXBlbGluZTsKKyAgICBleGVjdXRhYmxlSW5kZXggPSBzcmMtPmV4ZWN1dGFibGVJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFI6OnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIoY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZvcm1hdChpbl9zdHJ1Y3QtPmZvcm1hdCksCisgICAgdmFsdWUoaW5fc3RydWN0LT52YWx1ZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgbmFtZVtpXSA9IGluX3N0cnVjdC0+bmFtZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgZGVzY3JpcHRpb25baV0gPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0aW9uW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUjo6c2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUjo6c2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUihjb25zdCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZm9ybWF0ID0gc3JjLmZvcm1hdDsKKyAgICB2YWx1ZSA9IHNyYy52YWx1ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gc3JjLm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gc3JjLmRlc2NyaXB0aW9uW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiYgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZvcm1hdCA9IHNyYy5mb3JtYXQ7CisgICAgdmFsdWUgPSBzcmMudmFsdWU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgbmFtZVtpXSA9IHNyYy5uYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBkZXNjcmlwdGlvbltpXSA9IHNyYy5kZXNjcmlwdGlvbltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFI6On5zYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZvcm1hdCA9IGluX3N0cnVjdC0+Zm9ybWF0OworICAgIHZhbHVlID0gaW5fc3RydWN0LT52YWx1ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgbmFtZVtpXSA9IGluX3N0cnVjdC0+bmFtZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgZGVzY3JpcHRpb25baV0gPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0aW9uW2ldOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZm9ybWF0ID0gc3JjLT5mb3JtYXQ7CisgICAgdmFsdWUgPSBzcmMtPnZhbHVlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gc3JjLT5uYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBkZXNjcmlwdGlvbltpXSA9IHNyYy0+ZGVzY3JpcHRpb25baV07CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUjo6c2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIoY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBpc1RleHQoaW5fc3RydWN0LT5pc1RleHQpLAorICAgIGRhdGFTaXplKGluX3N0cnVjdC0+ZGF0YVNpemUpLAorICAgIHBEYXRhKGluX3N0cnVjdC0+cERhdGEpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIG5hbWVbaV0gPSBpbl9zdHJ1Y3QtPm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gaW5fc3RydWN0LT5kZXNjcmlwdGlvbltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSOjpzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwRGF0YShudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFI6OnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaXNUZXh0ID0gc3JjLmlzVGV4dDsKKyAgICBkYXRhU2l6ZSA9IHNyYy5kYXRhU2l6ZTsKKyAgICBwRGF0YSA9IHNyYy5wRGF0YTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gc3JjLm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gc3JjLmRlc2NyaXB0aW9uW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFImIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFImIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGlzVGV4dCA9IHNyYy5pc1RleHQ7CisgICAgZGF0YVNpemUgPSBzcmMuZGF0YVNpemU7CisgICAgcERhdGEgPSBzcmMucERhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgbmFtZVtpXSA9IHNyYy5uYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBkZXNjcmlwdGlvbltpXSA9IHNyYy5kZXNjcmlwdGlvbltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSOjp+c2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBpc1RleHQgPSBpbl9zdHJ1Y3QtPmlzVGV4dDsKKyAgICBkYXRhU2l6ZSA9IGluX3N0cnVjdC0+ZGF0YVNpemU7CisgICAgcERhdGEgPSBpbl9zdHJ1Y3QtPnBEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gaW5fc3RydWN0LT5uYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBkZXNjcmlwdGlvbltpXSA9IGluX3N0cnVjdC0+ZGVzY3JpcHRpb25baV07CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGlzVGV4dCA9IHNyYy0+aXNUZXh0OworICAgIGRhdGFTaXplID0gc3JjLT5kYXRhU2l6ZTsKKyAgICBwRGF0YSA9IHNyYy0+cERhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIG5hbWVbaV0gPSBzcmMtPm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gc3JjLT5kZXNjcmlwdGlvbltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHBmbkNhbGxiYWNrKGluX3N0cnVjdC0+cGZuQ2FsbGJhY2spLAorICAgIHBVc2VyRGF0YShpbl9zdHJ1Y3QtPnBVc2VyRGF0YSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBVc2VyRGF0YShudWxscHRyKQore30KKworc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcGZuQ2FsbGJhY2sgPSBzcmMucGZuQ2FsbGJhY2s7CisgICAgcFVzZXJEYXRhID0gc3JjLnBVc2VyRGF0YTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBmbkNhbGxiYWNrID0gc3JjLnBmbkNhbGxiYWNrOworICAgIHBVc2VyRGF0YSA9IHNyYy5wVXNlckRhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHBmbkNhbGxiYWNrID0gaW5fc3RydWN0LT5wZm5DYWxsYmFjazsKKyAgICBwVXNlckRhdGEgPSBpbl9zdHJ1Y3QtPnBVc2VyRGF0YTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcGZuQ2FsbGJhY2sgPSBzcmMtPnBmbkNhbGxiYWNrOworICAgIHBVc2VyRGF0YSA9IHNyYy0+cFVzZXJEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQoY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcmFzdGVyaXphdGlvbk9yZGVyKGluX3N0cnVjdC0+cmFzdGVyaXphdGlvbk9yZGVyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRDo6c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHJhc3Rlcml6YXRpb25PcmRlciA9IHNyYy5yYXN0ZXJpemF0aW9uT3JkZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCYgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICByYXN0ZXJpemF0aW9uT3JkZXIgPSBzcmMucmFzdGVyaXphdGlvbk9yZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQ6On5zYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRDo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHJhc3Rlcml6YXRpb25PcmRlciA9IGluX3N0cnVjdC0+cmFzdGVyaXphdGlvbk9yZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHJhc3Rlcml6YXRpb25PcmRlciA9IHNyYy0+cmFzdGVyaXphdGlvbk9yZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQ6OnNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgb2JqZWN0VHlwZShpbl9zdHJ1Y3QtPm9iamVjdFR5cGUpLAorICAgIG9iamVjdChpbl9zdHJ1Y3QtPm9iamVjdCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgcE9iamVjdE5hbWUgPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnBPYmplY3ROYW1lKTsKK30KKworc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQ6OnNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBPYmplY3ROYW1lKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVDo6c2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQoY29uc3Qgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBvYmplY3RUeXBlID0gc3JjLm9iamVjdFR5cGU7CisgICAgb2JqZWN0ID0gc3JjLm9iamVjdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBwT2JqZWN0TmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wT2JqZWN0TmFtZSk7Cit9CisKK3NhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUJiBzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBPYmplY3ROYW1lKSBkZWxldGUgW10gcE9iamVjdE5hbWU7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBvYmplY3RUeXBlID0gc3JjLm9iamVjdFR5cGU7CisgICAgb2JqZWN0ID0gc3JjLm9iamVjdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBwT2JqZWN0TmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wT2JqZWN0TmFtZSk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUOjp+c2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQoKQoreworICAgIGlmIChwT2JqZWN0TmFtZSkgZGVsZXRlIFtdIHBPYmplY3ROYW1lOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBvYmplY3RUeXBlID0gaW5fc3RydWN0LT5vYmplY3RUeXBlOworICAgIG9iamVjdCA9IGluX3N0cnVjdC0+b2JqZWN0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBwT2JqZWN0TmFtZSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cE9iamVjdE5hbWUpOworfQorCit2b2lkIHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG9iamVjdFR5cGUgPSBzcmMtPm9iamVjdFR5cGU7CisgICAgb2JqZWN0ID0gc3JjLT5vYmplY3Q7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIHBPYmplY3ROYW1lID0gU2FmZVN0cmluZ0NvcHkoc3JjLT5wT2JqZWN0TmFtZSk7Cit9CisKK3NhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQ6OnNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQoY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG9iamVjdFR5cGUoaW5fc3RydWN0LT5vYmplY3RUeXBlKSwKKyAgICBvYmplY3QoaW5fc3RydWN0LT5vYmplY3QpLAorICAgIHRhZ05hbWUoaW5fc3RydWN0LT50YWdOYW1lKSwKKyAgICB0YWdTaXplKGluX3N0cnVjdC0+dGFnU2l6ZSksCisgICAgcFRhZyhpbl9zdHJ1Y3QtPnBUYWcpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUOjpzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBUYWcobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQ6OnNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQoY29uc3Qgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG9iamVjdFR5cGUgPSBzcmMub2JqZWN0VHlwZTsKKyAgICBvYmplY3QgPSBzcmMub2JqZWN0OworICAgIHRhZ05hbWUgPSBzcmMudGFnTmFtZTsKKyAgICB0YWdTaXplID0gc3JjLnRhZ1NpemU7CisgICAgcFRhZyA9IHNyYy5wVGFnOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUJiBzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb2JqZWN0VHlwZSA9IHNyYy5vYmplY3RUeXBlOworICAgIG9iamVjdCA9IHNyYy5vYmplY3Q7CisgICAgdGFnTmFtZSA9IHNyYy50YWdOYW1lOworICAgIHRhZ1NpemUgPSBzcmMudGFnU2l6ZTsKKyAgICBwVGFnID0gc3JjLnBUYWc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQ6On5zYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG9iamVjdFR5cGUgPSBpbl9zdHJ1Y3QtPm9iamVjdFR5cGU7CisgICAgb2JqZWN0ID0gaW5fc3RydWN0LT5vYmplY3Q7CisgICAgdGFnTmFtZSA9IGluX3N0cnVjdC0+dGFnTmFtZTsKKyAgICB0YWdTaXplID0gaW5fc3RydWN0LT50YWdTaXplOworICAgIHBUYWcgPSBpbl9zdHJ1Y3QtPnBUYWc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBvYmplY3RUeXBlID0gc3JjLT5vYmplY3RUeXBlOworICAgIG9iamVjdCA9IHNyYy0+b2JqZWN0OworICAgIHRhZ05hbWUgPSBzcmMtPnRhZ05hbWU7CisgICAgdGFnU2l6ZSA9IHNyYy0+dGFnU2l6ZTsKKyAgICBwVGFnID0gc3JjLT5wVGFnOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVDo6c2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVChjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgcE1hcmtlck5hbWUgPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnBNYXJrZXJOYW1lKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGNvbG9yW2ldID0gaW5fc3RydWN0LT5jb2xvcltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQ6OnNhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcE1hcmtlck5hbWUobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQ6OnNhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQoY29uc3Qgc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIHBNYXJrZXJOYW1lID0gU2FmZVN0cmluZ0NvcHkoc3JjLnBNYXJrZXJOYW1lKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGNvbG9yW2ldID0gc3JjLmNvbG9yW2ldOworICAgIH0KK30KKworc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCYgc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE1hcmtlck5hbWUpIGRlbGV0ZSBbXSBwTWFya2VyTmFtZTsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIHBNYXJrZXJOYW1lID0gU2FmZVN0cmluZ0NvcHkoc3JjLnBNYXJrZXJOYW1lKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGNvbG9yW2ldID0gc3JjLmNvbG9yW2ldOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVDo6fnNhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQoKQoreworICAgIGlmIChwTWFya2VyTmFtZSkgZGVsZXRlIFtdIHBNYXJrZXJOYW1lOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIHBNYXJrZXJOYW1lID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wTWFya2VyTmFtZSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBjb2xvcltpXSA9IGluX3N0cnVjdC0+Y29sb3JbaV07CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgcE1hcmtlck5hbWUgPSBTYWZlU3RyaW5nQ29weShzcmMtPnBNYXJrZXJOYW1lKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGNvbG9yW2ldID0gc3JjLT5jb2xvcltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlY6OnNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYoY29uc3QgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRlZGljYXRlZEFsbG9jYXRpb24oaW5fc3RydWN0LT5kZWRpY2F0ZWRBbGxvY2F0aW9uKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGVkaWNhdGVkQWxsb2NhdGlvbiA9IHNyYy5kZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WJiBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGVkaWNhdGVkQWxsb2NhdGlvbiA9IHNyYy5kZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WOjp+c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uID0gaW5fc3RydWN0LT5kZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGVkaWNhdGVkQWxsb2NhdGlvbiA9IHNyYy0+ZGVkaWNhdGVkQWxsb2NhdGlvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WOjpzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVihjb25zdCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRlZGljYXRlZEFsbG9jYXRpb24oaW5fc3RydWN0LT5kZWRpY2F0ZWRBbGxvY2F0aW9uKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY6OnNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVjo6c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uID0gc3JjLmRlZGljYXRlZEFsbG9jYXRpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WJiBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uID0gc3JjLmRlZGljYXRlZEFsbG9jYXRpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WOjp+c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IFZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uID0gaW5fc3RydWN0LT5kZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uID0gc3JjLT5kZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjo6c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVihjb25zdCBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgaW1hZ2UoaW5fc3RydWN0LT5pbWFnZSksCisgICAgYnVmZmVyKGluX3N0cnVjdC0+YnVmZmVyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjo6c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjo6c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVihjb25zdCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW1hZ2UgPSBzcmMuaW1hZ2U7CisgICAgYnVmZmVyID0gc3JjLmJ1ZmZlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViYgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGltYWdlID0gc3JjLmltYWdlOworICAgIGJ1ZmZlciA9IHNyYy5idWZmZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlY6On5zYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGltYWdlID0gaW5fc3RydWN0LT5pbWFnZTsKKyAgICBidWZmZXIgPSBpbl9zdHJ1Y3QtPmJ1ZmZlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGltYWdlID0gc3JjLT5pbWFnZTsKKyAgICBidWZmZXIgPSBzcmMtPmJ1ZmZlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHRyYW5zZm9ybUZlZWRiYWNrKGluX3N0cnVjdC0+dHJhbnNmb3JtRmVlZGJhY2spLAorICAgIGdlb21ldHJ5U3RyZWFtcyhpbl9zdHJ1Y3QtPmdlb21ldHJ5U3RyZWFtcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHRyYW5zZm9ybUZlZWRiYWNrID0gc3JjLnRyYW5zZm9ybUZlZWRiYWNrOworICAgIGdlb21ldHJ5U3RyZWFtcyA9IHNyYy5nZW9tZXRyeVN0cmVhbXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB0cmFuc2Zvcm1GZWVkYmFjayA9IHNyYy50cmFuc2Zvcm1GZWVkYmFjazsKKyAgICBnZW9tZXRyeVN0cmVhbXMgPSBzcmMuZ2VvbWV0cnlTdHJlYW1zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB0cmFuc2Zvcm1GZWVkYmFjayA9IGluX3N0cnVjdC0+dHJhbnNmb3JtRmVlZGJhY2s7CisgICAgZ2VvbWV0cnlTdHJlYW1zID0gaW5fc3RydWN0LT5nZW9tZXRyeVN0cmVhbXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICB0cmFuc2Zvcm1GZWVkYmFjayA9IHNyYy0+dHJhbnNmb3JtRmVlZGJhY2s7CisgICAgZ2VvbWV0cnlTdHJlYW1zID0gc3JjLT5nZW9tZXRyeVN0cmVhbXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXMoaW5fc3RydWN0LT5tYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXMpLAorICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyhpbl9zdHJ1Y3QtPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyksCisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplKGluX3N0cnVjdC0+bWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplKSwKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbURhdGFTaXplKGluX3N0cnVjdC0+bWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1EYXRhU2l6ZSksCisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU2l6ZShpbl9zdHJ1Y3QtPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVNpemUpLAorICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZShpbl9zdHJ1Y3QtPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZSksCisgICAgdHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzKGluX3N0cnVjdC0+dHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzKSwKKyAgICB0cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlcyhpbl9zdHJ1Y3QtPnRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtc0xpbmVzVHJpYW5nbGVzKSwKKyAgICB0cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3QoaW5fc3RydWN0LT50cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3QpLAorICAgIHRyYW5zZm9ybUZlZWRiYWNrRHJhdyhpbl9zdHJ1Y3QtPnRyYW5zZm9ybUZlZWRiYWNrRHJhdykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXMgPSBzcmMubWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zOworICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyA9IHNyYy5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnM7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplID0gc3JjLm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyU2l6ZTsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbURhdGFTaXplID0gc3JjLm1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRGF0YVNpemU7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU2l6ZSA9IHNyYy5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTaXplOworICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZSA9IHNyYy5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTdHJpZGU7CisgICAgdHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzID0gc3JjLnRyYW5zZm9ybUZlZWRiYWNrUXVlcmllczsKKyAgICB0cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlcyA9IHNyYy50cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlczsKKyAgICB0cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3QgPSBzcmMudHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0OworICAgIHRyYW5zZm9ybUZlZWRiYWNrRHJhdyA9IHNyYy50cmFuc2Zvcm1GZWVkYmFja0RyYXc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXMgPSBzcmMubWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zOworICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyA9IHNyYy5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnM7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplID0gc3JjLm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyU2l6ZTsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbURhdGFTaXplID0gc3JjLm1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtRGF0YVNpemU7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU2l6ZSA9IHNyYy5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTaXplOworICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZSA9IHNyYy5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTdHJpZGU7CisgICAgdHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzID0gc3JjLnRyYW5zZm9ybUZlZWRiYWNrUXVlcmllczsKKyAgICB0cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlcyA9IHNyYy50cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlczsKKyAgICB0cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3QgPSBzcmMudHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0OworICAgIHRyYW5zZm9ybUZlZWRiYWNrRHJhdyA9IHNyYy50cmFuc2Zvcm1GZWVkYmFja0RyYXc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zID0gaW5fc3RydWN0LT5tYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXM7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzID0gaW5fc3RydWN0LT5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnM7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJTaXplID0gaW5fc3RydWN0LT5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlclNpemU7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1EYXRhU2l6ZSA9IGluX3N0cnVjdC0+bWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1EYXRhU2l6ZTsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTaXplID0gaW5fc3RydWN0LT5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTaXplOworICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVN0cmlkZSA9IGluX3N0cnVjdC0+bWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU3RyaWRlOworICAgIHRyYW5zZm9ybUZlZWRiYWNrUXVlcmllcyA9IGluX3N0cnVjdC0+dHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzOworICAgIHRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtc0xpbmVzVHJpYW5nbGVzID0gaW5fc3RydWN0LT50cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlczsKKyAgICB0cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3QgPSBpbl9zdHJ1Y3QtPnRyYW5zZm9ybUZlZWRiYWNrUmFzdGVyaXphdGlvblN0cmVhbVNlbGVjdDsKKyAgICB0cmFuc2Zvcm1GZWVkYmFja0RyYXcgPSBpbl9zdHJ1Y3QtPnRyYW5zZm9ybUZlZWRiYWNrRHJhdzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXMgPSBzcmMtPm1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtczsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnMgPSBzcmMtPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyczsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlclNpemUgPSBzcmMtPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyU2l6ZTsKKyAgICBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbURhdGFTaXplID0gc3JjLT5tYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbURhdGFTaXplOworICAgIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVNpemUgPSBzcmMtPm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVNpemU7CisgICAgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU3RyaWRlID0gc3JjLT5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTdHJpZGU7CisgICAgdHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzID0gc3JjLT50cmFuc2Zvcm1GZWVkYmFja1F1ZXJpZXM7CisgICAgdHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zTGluZXNUcmlhbmdsZXMgPSBzcmMtPnRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtc0xpbmVzVHJpYW5nbGVzOworICAgIHRyYW5zZm9ybUZlZWRiYWNrUmFzdGVyaXphdGlvblN0cmVhbVNlbGVjdCA9IHNyYy0+dHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0OworICAgIHRyYW5zZm9ybUZlZWRiYWNrRHJhdyA9IHNyYy0+dHJhbnNmb3JtRmVlZGJhY2tEcmF3OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVChjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgcmFzdGVyaXphdGlvblN0cmVhbShpbl9zdHJ1Y3QtPnJhc3Rlcml6YXRpb25TdHJlYW0pCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICByYXN0ZXJpemF0aW9uU3RyZWFtID0gc3JjLnJhc3Rlcml6YXRpb25TdHJlYW07CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQmIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICByYXN0ZXJpemF0aW9uU3RyZWFtID0gc3JjLnJhc3Rlcml6YXRpb25TdHJlYW07CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ6On5zYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICByYXN0ZXJpemF0aW9uU3RyZWFtID0gaW5fc3RydWN0LT5yYXN0ZXJpemF0aW9uU3RyZWFtOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHJhc3Rlcml6YXRpb25TdHJlYW0gPSBzcmMtPnJhc3Rlcml6YXRpb25TdHJlYW07CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWDo6c2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgoY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBpbWFnZVZpZXcoaW5fc3RydWN0LT5pbWFnZVZpZXcpLAorICAgIGRlc2NyaXB0b3JUeXBlKGluX3N0cnVjdC0+ZGVzY3JpcHRvclR5cGUpLAorICAgIHNhbXBsZXIoaW5fc3RydWN0LT5zYW1wbGVyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlg6OnNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWDo6c2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgoY29uc3Qgc2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbWFnZVZpZXcgPSBzcmMuaW1hZ2VWaWV3OworICAgIGRlc2NyaXB0b3JUeXBlID0gc3JjLmRlc2NyaXB0b3JUeXBlOworICAgIHNhbXBsZXIgPSBzcmMuc2FtcGxlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgmIHNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGltYWdlVmlldyA9IHNyYy5pbWFnZVZpZXc7CisgICAgZGVzY3JpcHRvclR5cGUgPSBzcmMuZGVzY3JpcHRvclR5cGU7CisgICAgc2FtcGxlciA9IHNyYy5zYW1wbGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWDo6fnNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWDo6aW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlgqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaW1hZ2VWaWV3ID0gaW5fc3RydWN0LT5pbWFnZVZpZXc7CisgICAgZGVzY3JpcHRvclR5cGUgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlOworICAgIHNhbXBsZXIgPSBpbl9zdHJ1Y3QtPnNhbXBsZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGltYWdlVmlldyA9IHNyYy0+aW1hZ2VWaWV3OworICAgIGRlc2NyaXB0b3JUeXBlID0gc3JjLT5kZXNjcmlwdG9yVHlwZTsKKyAgICBzYW1wbGVyID0gc3JjLT5zYW1wbGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EOjpzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQoY29uc3QgVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3VwcG9ydHNUZXh0dXJlR2F0aGVyTE9EQmlhc0FNRChpbl9zdHJ1Y3QtPnN1cHBvcnRzVGV4dHVyZUdhdGhlckxPREJpYXNBTUQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQ6OnNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EOjpzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQoY29uc3Qgc2FmZV9Wa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3VwcG9ydHNUZXh0dXJlR2F0aGVyTE9EQmlhc0FNRCA9IHNyYy5zdXBwb3J0c1RleHR1cmVHYXRoZXJMT0RCaWFzQU1EOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQmIHNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3VwcG9ydHNUZXh0dXJlR2F0aGVyTE9EQmlhc0FNRCA9IHNyYy5zdXBwb3J0c1RleHR1cmVHYXRoZXJMT0RCaWFzQU1EOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQ6On5zYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRDo6aW5pdGlhbGl6ZShjb25zdCBWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHN1cHBvcnRzVGV4dHVyZUdhdGhlckxPREJpYXNBTUQgPSBpbl9zdHJ1Y3QtPnN1cHBvcnRzVGV4dHVyZUdhdGhlckxPREJpYXNBTUQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3VwcG9ydHNUZXh0dXJlR2F0aGVyTE9EQmlhc0FNRCA9IHNyYy0+c3VwcG9ydHNUZXh0dXJlR2F0aGVyTE9EQmlhc0FNRDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorCisKK3NhZmVfVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1A6OnNhZmVfVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AoY29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHN0cmVhbURlc2NyaXB0b3IoaW5fc3RydWN0LT5zdHJlYW1EZXNjcmlwdG9yKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUDo6c2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUDo6c2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUChjb25zdCBzYWZlX1ZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgc3RyZWFtRGVzY3JpcHRvciA9IHNyYy5zdHJlYW1EZXNjcmlwdG9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQJiBzYWZlX1ZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgc3RyZWFtRGVzY3JpcHRvciA9IHNyYy5zdHJlYW1EZXNjcmlwdG9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQOjp+c2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUDo6aW5pdGlhbGl6ZShjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgc3RyZWFtRGVzY3JpcHRvciA9IGluX3N0cnVjdC0+c3RyZWFtRGVzY3JpcHRvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBzdHJlYW1EZXNjcmlwdG9yID0gc3JjLT5zdHJlYW1EZXNjcmlwdG9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisKKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgY29ybmVyU2FtcGxlZEltYWdlKGluX3N0cnVjdC0+Y29ybmVyU2FtcGxlZEltYWdlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29ybmVyU2FtcGxlZEltYWdlID0gc3JjLmNvcm5lclNhbXBsZWRJbWFnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNvcm5lclNhbXBsZWRJbWFnZSA9IHNyYy5jb3JuZXJTYW1wbGVkSW1hZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlY6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGNvcm5lclNhbXBsZWRJbWFnZSA9IGluX3N0cnVjdC0+Y29ybmVyU2FtcGxlZEltYWdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgY29ybmVyU2FtcGxlZEltYWdlID0gc3JjLT5jb3JuZXJTYW1wbGVkSW1hZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYoY29uc3QgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBoYW5kbGVUeXBlcyhpbl9zdHJ1Y3QtPmhhbmRsZVR5cGVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlY6OnNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBoYW5kbGVUeXBlcyA9IHNyYy5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYmIHNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVjo6fnNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaGFuZGxlVHlwZXMgPSBpbl9zdHJ1Y3QtPmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBoYW5kbGVUeXBlcyA9IHNyYy0+aGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlY6OnNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVihjb25zdCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBoYW5kbGVUeXBlcyhpbl9zdHJ1Y3QtPmhhbmRsZVR5cGVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WOjpzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVjo6c2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WKGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYmIHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZXMgPSBzcmMuaGFuZGxlVHlwZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVjo6fnNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaGFuZGxlVHlwZXMgPSBpbl9zdHJ1Y3QtPmhhbmRsZVR5cGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGhhbmRsZVR5cGVzID0gc3JjLT5oYW5kbGVUeXBlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVjo6c2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKGNvbnN0IFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKSwKKyAgICBoYW5kbGUoaW5fc3RydWN0LT5oYW5kbGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY6OnNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WOjpzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYoY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIGhhbmRsZSA9IHNyYy5oYW5kbGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViYgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBoYW5kbGVUeXBlID0gc3JjLmhhbmRsZVR5cGU7CisgICAgaGFuZGxlID0gc3JjLmhhbmRsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WOjp+c2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3QgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBoYW5kbGVUeXBlID0gaW5fc3RydWN0LT5oYW5kbGVUeXBlOworICAgIGhhbmRsZSA9IGluX3N0cnVjdC0+aGFuZGxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMtPmhhbmRsZVR5cGU7CisgICAgaGFuZGxlID0gc3JjLT5oYW5kbGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworCitzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY6OnNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVihjb25zdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBwQXR0cmlidXRlcyhudWxscHRyKSwKKyAgICBkd0FjY2Vzcyhpbl9zdHJ1Y3QtPmR3QWNjZXNzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCppbl9zdHJ1Y3QtPnBBdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3NhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVjo6c2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBBdHRyaWJ1dGVzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY6OnNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVihjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwQXR0cmlidXRlcyA9IG51bGxwdHI7CisgICAgZHdBY2Nlc3MgPSBzcmMuZHdBY2Nlc3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQXR0cmlidXRlcykgeworICAgICAgICBwQXR0cmlidXRlcyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCpzcmMucEF0dHJpYnV0ZXMpOworICAgIH0KK30KKworc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WJiBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEF0dHJpYnV0ZXMpCisgICAgICAgIGRlbGV0ZSBwQXR0cmlidXRlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBBdHRyaWJ1dGVzID0gbnVsbHB0cjsKKyAgICBkd0FjY2VzcyA9IHNyYy5kd0FjY2VzczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBBdHRyaWJ1dGVzKSB7CisgICAgICAgIHBBdHRyaWJ1dGVzID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKnNyYy5wQXR0cmlidXRlcyk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY6On5zYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYoKQoreworICAgIGlmIChwQXR0cmlidXRlcykKKyAgICAgICAgZGVsZXRlIHBBdHRyaWJ1dGVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHBBdHRyaWJ1dGVzID0gbnVsbHB0cjsKKyAgICBkd0FjY2VzcyA9IGluX3N0cnVjdC0+ZHdBY2Nlc3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBBdHRyaWJ1dGVzKSB7CisgICAgICAgIHBBdHRyaWJ1dGVzID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKmluX3N0cnVjdC0+cEF0dHJpYnV0ZXMpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBBdHRyaWJ1dGVzID0gbnVsbHB0cjsKKyAgICBkd0FjY2VzcyA9IHNyYy0+ZHdBY2Nlc3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBBdHRyaWJ1dGVzKSB7CisgICAgICAgIHBBdHRyaWJ1dGVzID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKnNyYy0+cEF0dHJpYnV0ZXMpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WOjpzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYoY29uc3QgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgYWNxdWlyZUNvdW50KGluX3N0cnVjdC0+YWNxdWlyZUNvdW50KSwKKyAgICBwQWNxdWlyZVN5bmNzKG51bGxwdHIpLAorICAgIHBBY3F1aXJlS2V5cyhudWxscHRyKSwKKyAgICBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMobnVsbHB0ciksCisgICAgcmVsZWFzZUNvdW50KGluX3N0cnVjdC0+cmVsZWFzZUNvdW50KSwKKyAgICBwUmVsZWFzZVN5bmNzKG51bGxwdHIpLAorICAgIHBSZWxlYXNlS2V5cyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoYWNxdWlyZUNvdW50ICYmIGluX3N0cnVjdC0+cEFjcXVpcmVTeW5jcykgeworICAgICAgICBwQWNxdWlyZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W2FjcXVpcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3F1aXJlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEFjcXVpcmVTeW5jc1tpXSA9IGluX3N0cnVjdC0+cEFjcXVpcmVTeW5jc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wQWNxdWlyZUtleXMpIHsKKyAgICAgICAgcEFjcXVpcmVLZXlzID0gbmV3IHVpbnQ2NF90W2luX3N0cnVjdC0+YWNxdWlyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBY3F1aXJlS2V5cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBBY3F1aXJlS2V5cywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcykgeworICAgICAgICBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzLCAodm9pZCAqKWluX3N0cnVjdC0+cEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+YWNxdWlyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHJlbGVhc2VDb3VudCAmJiBpbl9zdHJ1Y3QtPnBSZWxlYXNlU3luY3MpIHsKKyAgICAgICAgcFJlbGVhc2VTeW5jcyA9IG5ldyBWa0RldmljZU1lbW9yeVtyZWxlYXNlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVsZWFzZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZWxlYXNlU3luY3NbaV0gPSBpbl9zdHJ1Y3QtPnBSZWxlYXNlU3luY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFJlbGVhc2VLZXlzKSB7CisgICAgICAgIHBSZWxlYXNlS2V5cyA9IG5ldyB1aW50NjRfdFtpbl9zdHJ1Y3QtPnJlbGVhc2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUmVsZWFzZUtleXMsICh2b2lkICopaW5fc3RydWN0LT5wUmVsZWFzZUtleXMsIHNpemVvZih1aW50NjRfdCkqaW5fc3RydWN0LT5yZWxlYXNlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WOjpzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEFjcXVpcmVTeW5jcyhudWxscHRyKSwKKyAgICBwQWNxdWlyZUtleXMobnVsbHB0ciksCisgICAgcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzKG51bGxwdHIpLAorICAgIHBSZWxlYXNlU3luY3MobnVsbHB0ciksCisgICAgcFJlbGVhc2VLZXlzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlY6OnNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVihjb25zdCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhY3F1aXJlQ291bnQgPSBzcmMuYWNxdWlyZUNvdW50OworICAgIHBBY3F1aXJlU3luY3MgPSBudWxscHRyOworICAgIHBBY3F1aXJlS2V5cyA9IG51bGxwdHI7CisgICAgcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzID0gbnVsbHB0cjsKKyAgICByZWxlYXNlQ291bnQgPSBzcmMucmVsZWFzZUNvdW50OworICAgIHBSZWxlYXNlU3luY3MgPSBudWxscHRyOworICAgIHBSZWxlYXNlS2V5cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGFjcXVpcmVDb3VudCAmJiBzcmMucEFjcXVpcmVTeW5jcykgeworICAgICAgICBwQWNxdWlyZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W2FjcXVpcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3F1aXJlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEFjcXVpcmVTeW5jc1tpXSA9IHNyYy5wQWNxdWlyZVN5bmNzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucEFjcXVpcmVLZXlzKSB7CisgICAgICAgIHBBY3F1aXJlS2V5cyA9IG5ldyB1aW50NjRfdFtzcmMuYWNxdWlyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBY3F1aXJlS2V5cywgKHZvaWQgKilzcmMucEFjcXVpcmVLZXlzLCBzaXplb2YodWludDY0X3QpKnNyYy5hY3F1aXJlQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcykgeworICAgICAgICBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMgPSBuZXcgdWludDMyX3Rbc3JjLmFjcXVpcmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMsICh2b2lkICopc3JjLnBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuYWNxdWlyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHJlbGVhc2VDb3VudCAmJiBzcmMucFJlbGVhc2VTeW5jcykgeworICAgICAgICBwUmVsZWFzZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W3JlbGVhc2VDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWxlYXNlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFJlbGVhc2VTeW5jc1tpXSA9IHNyYy5wUmVsZWFzZVN5bmNzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzcmMucFJlbGVhc2VLZXlzKSB7CisgICAgICAgIHBSZWxlYXNlS2V5cyA9IG5ldyB1aW50NjRfdFtzcmMucmVsZWFzZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBSZWxlYXNlS2V5cywgKHZvaWQgKilzcmMucFJlbGVhc2VLZXlzLCBzaXplb2YodWludDY0X3QpKnNyYy5yZWxlYXNlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WJiBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEFjcXVpcmVTeW5jcykKKyAgICAgICAgZGVsZXRlW10gcEFjcXVpcmVTeW5jczsKKyAgICBpZiAocEFjcXVpcmVLZXlzKQorICAgICAgICBkZWxldGVbXSBwQWNxdWlyZUtleXM7CisgICAgaWYgKHBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcykKKyAgICAgICAgZGVsZXRlW10gcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzOworICAgIGlmIChwUmVsZWFzZVN5bmNzKQorICAgICAgICBkZWxldGVbXSBwUmVsZWFzZVN5bmNzOworICAgIGlmIChwUmVsZWFzZUtleXMpCisgICAgICAgIGRlbGV0ZVtdIHBSZWxlYXNlS2V5czsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGFjcXVpcmVDb3VudCA9IHNyYy5hY3F1aXJlQ291bnQ7CisgICAgcEFjcXVpcmVTeW5jcyA9IG51bGxwdHI7CisgICAgcEFjcXVpcmVLZXlzID0gbnVsbHB0cjsKKyAgICBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMgPSBudWxscHRyOworICAgIHJlbGVhc2VDb3VudCA9IHNyYy5yZWxlYXNlQ291bnQ7CisgICAgcFJlbGVhc2VTeW5jcyA9IG51bGxwdHI7CisgICAgcFJlbGVhc2VLZXlzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoYWNxdWlyZUNvdW50ICYmIHNyYy5wQWNxdWlyZVN5bmNzKSB7CisgICAgICAgIHBBY3F1aXJlU3luY3MgPSBuZXcgVmtEZXZpY2VNZW1vcnlbYWNxdWlyZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFjcXVpcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQWNxdWlyZVN5bmNzW2ldID0gc3JjLnBBY3F1aXJlU3luY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wQWNxdWlyZUtleXMpIHsKKyAgICAgICAgcEFjcXVpcmVLZXlzID0gbmV3IHVpbnQ2NF90W3NyYy5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVLZXlzLCAodm9pZCAqKXNyYy5wQWNxdWlyZUtleXMsIHNpemVvZih1aW50NjRfdCkqc3JjLmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzKSB7CisgICAgICAgIHBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcyA9IG5ldyB1aW50MzJfdFtzcmMuYWNxdWlyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcywgKHZvaWQgKilzcmMucEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzLCBzaXplb2YodWludDMyX3QpKnNyYy5hY3F1aXJlQ291bnQpOworICAgIH0KKyAgICBpZiAocmVsZWFzZUNvdW50ICYmIHNyYy5wUmVsZWFzZVN5bmNzKSB7CisgICAgICAgIHBSZWxlYXNlU3luY3MgPSBuZXcgVmtEZXZpY2VNZW1vcnlbcmVsZWFzZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlbGVhc2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwUmVsZWFzZVN5bmNzW2ldID0gc3JjLnBSZWxlYXNlU3luY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy5wUmVsZWFzZUtleXMpIHsKKyAgICAgICAgcFJlbGVhc2VLZXlzID0gbmV3IHVpbnQ2NF90W3NyYy5yZWxlYXNlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFJlbGVhc2VLZXlzLCAodm9pZCAqKXNyYy5wUmVsZWFzZUtleXMsIHNpemVvZih1aW50NjRfdCkqc3JjLnJlbGVhc2VDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlY6On5zYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYoKQoreworICAgIGlmIChwQWNxdWlyZVN5bmNzKQorICAgICAgICBkZWxldGVbXSBwQWNxdWlyZVN5bmNzOworICAgIGlmIChwQWNxdWlyZUtleXMpCisgICAgICAgIGRlbGV0ZVtdIHBBY3F1aXJlS2V5czsKKyAgICBpZiAocEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzKQorICAgICAgICBkZWxldGVbXSBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHM7CisgICAgaWYgKHBSZWxlYXNlU3luY3MpCisgICAgICAgIGRlbGV0ZVtdIHBSZWxlYXNlU3luY3M7CisgICAgaWYgKHBSZWxlYXNlS2V5cykKKyAgICAgICAgZGVsZXRlW10gcFJlbGVhc2VLZXlzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGFjcXVpcmVDb3VudCA9IGluX3N0cnVjdC0+YWNxdWlyZUNvdW50OworICAgIHBBY3F1aXJlU3luY3MgPSBudWxscHRyOworICAgIHBBY3F1aXJlS2V5cyA9IG51bGxwdHI7CisgICAgcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzID0gbnVsbHB0cjsKKyAgICByZWxlYXNlQ291bnQgPSBpbl9zdHJ1Y3QtPnJlbGVhc2VDb3VudDsKKyAgICBwUmVsZWFzZVN5bmNzID0gbnVsbHB0cjsKKyAgICBwUmVsZWFzZUtleXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoYWNxdWlyZUNvdW50ICYmIGluX3N0cnVjdC0+cEFjcXVpcmVTeW5jcykgeworICAgICAgICBwQWNxdWlyZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W2FjcXVpcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3F1aXJlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEFjcXVpcmVTeW5jc1tpXSA9IGluX3N0cnVjdC0+cEFjcXVpcmVTeW5jc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wQWNxdWlyZUtleXMpIHsKKyAgICAgICAgcEFjcXVpcmVLZXlzID0gbmV3IHVpbnQ2NF90W2luX3N0cnVjdC0+YWNxdWlyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBY3F1aXJlS2V5cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBBY3F1aXJlS2V5cywgc2l6ZW9mKHVpbnQ2NF90KSppbl9zdHJ1Y3QtPmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcykgeworICAgICAgICBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzLCAodm9pZCAqKWluX3N0cnVjdC0+cEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+YWNxdWlyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHJlbGVhc2VDb3VudCAmJiBpbl9zdHJ1Y3QtPnBSZWxlYXNlU3luY3MpIHsKKyAgICAgICAgcFJlbGVhc2VTeW5jcyA9IG5ldyBWa0RldmljZU1lbW9yeVtyZWxlYXNlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVsZWFzZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZWxlYXNlU3luY3NbaV0gPSBpbl9zdHJ1Y3QtPnBSZWxlYXNlU3luY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFJlbGVhc2VLZXlzKSB7CisgICAgICAgIHBSZWxlYXNlS2V5cyA9IG5ldyB1aW50NjRfdFtpbl9zdHJ1Y3QtPnJlbGVhc2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUmVsZWFzZUtleXMsICh2b2lkICopaW5fc3RydWN0LT5wUmVsZWFzZUtleXMsIHNpemVvZih1aW50NjRfdCkqaW5fc3RydWN0LT5yZWxlYXNlQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGFjcXVpcmVDb3VudCA9IHNyYy0+YWNxdWlyZUNvdW50OworICAgIHBBY3F1aXJlU3luY3MgPSBudWxscHRyOworICAgIHBBY3F1aXJlS2V5cyA9IG51bGxwdHI7CisgICAgcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzID0gbnVsbHB0cjsKKyAgICByZWxlYXNlQ291bnQgPSBzcmMtPnJlbGVhc2VDb3VudDsKKyAgICBwUmVsZWFzZVN5bmNzID0gbnVsbHB0cjsKKyAgICBwUmVsZWFzZUtleXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoYWNxdWlyZUNvdW50ICYmIHNyYy0+cEFjcXVpcmVTeW5jcykgeworICAgICAgICBwQWNxdWlyZVN5bmNzID0gbmV3IFZrRGV2aWNlTWVtb3J5W2FjcXVpcmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3F1aXJlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEFjcXVpcmVTeW5jc1tpXSA9IHNyYy0+cEFjcXVpcmVTeW5jc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3JjLT5wQWNxdWlyZUtleXMpIHsKKyAgICAgICAgcEFjcXVpcmVLZXlzID0gbmV3IHVpbnQ2NF90W3NyYy0+YWNxdWlyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBBY3F1aXJlS2V5cywgKHZvaWQgKilzcmMtPnBBY3F1aXJlS2V5cywgc2l6ZW9mKHVpbnQ2NF90KSpzcmMtPmFjcXVpcmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMtPnBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcykgeworICAgICAgICBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMgPSBuZXcgdWludDMyX3Rbc3JjLT5hY3F1aXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzLCAodm9pZCAqKXNyYy0+cEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzLCBzaXplb2YodWludDMyX3QpKnNyYy0+YWNxdWlyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHJlbGVhc2VDb3VudCAmJiBzcmMtPnBSZWxlYXNlU3luY3MpIHsKKyAgICAgICAgcFJlbGVhc2VTeW5jcyA9IG5ldyBWa0RldmljZU1lbW9yeVtyZWxlYXNlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVsZWFzZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBSZWxlYXNlU3luY3NbaV0gPSBzcmMtPnBSZWxlYXNlU3luY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNyYy0+cFJlbGVhc2VLZXlzKSB7CisgICAgICAgIHBSZWxlYXNlS2V5cyA9IG5ldyB1aW50NjRfdFtzcmMtPnJlbGVhc2VDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUmVsZWFzZUtleXMsICh2b2lkICopc3JjLT5wUmVsZWFzZUtleXMsIHNpemVvZih1aW50NjRfdCkqc3JjLT5yZWxlYXNlQ291bnQpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworc2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVDo6c2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVChjb25zdCBWa1ZhbGlkYXRpb25GbGFnc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudChpbl9zdHJ1Y3QtPmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQpLAorICAgIHBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcykgeworICAgICAgICBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzID0gbmV3IFZrVmFsaWRhdGlvbkNoZWNrRVhUW2luX3N0cnVjdC0+ZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzLCAodm9pZCAqKWluX3N0cnVjdC0+cERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcywgc2l6ZW9mKFZrVmFsaWRhdGlvbkNoZWNrRVhUKSppbl9zdHJ1Y3QtPmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVDo6c2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUOjpzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUKGNvbnN0IHNhZmVfVmtWYWxpZGF0aW9uRmxhZ3NFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50ID0gc3JjLmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQ7CisgICAgcERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzKSB7CisgICAgICAgIHBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MgPSBuZXcgVmtWYWxpZGF0aW9uQ2hlY2tFWFRbc3JjLmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcywgKHZvaWQgKilzcmMucERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcywgc2l6ZW9mKFZrVmFsaWRhdGlvbkNoZWNrRVhUKSpzcmMuZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUJiBzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzKQorICAgICAgICBkZWxldGVbXSBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudCA9IHNyYy5kaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50OworICAgIHBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcykgeworICAgICAgICBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzID0gbmV3IFZrVmFsaWRhdGlvbkNoZWNrRVhUW3NyYy5kaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MsICh2b2lkICopc3JjLnBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MsIHNpemVvZihWa1ZhbGlkYXRpb25DaGVja0VYVCkqc3JjLmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVDo6fnNhZmVfVmtWYWxpZGF0aW9uRmxhZ3NFWFQoKQoreworICAgIGlmIChwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzKQorICAgICAgICBkZWxldGVbXSBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtWYWxpZGF0aW9uRmxhZ3NFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtWYWxpZGF0aW9uRmxhZ3NFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudCA9IGluX3N0cnVjdC0+ZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudDsKKyAgICBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcykgeworICAgICAgICBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzID0gbmV3IFZrVmFsaWRhdGlvbkNoZWNrRVhUW2luX3N0cnVjdC0+ZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzLCAodm9pZCAqKWluX3N0cnVjdC0+cERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcywgc2l6ZW9mKFZrVmFsaWRhdGlvbkNoZWNrRVhUKSppbl9zdHJ1Y3QtPmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtWYWxpZGF0aW9uRmxhZ3NFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudCA9IHNyYy0+ZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudDsKKyAgICBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcykgeworICAgICAgICBwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzID0gbmV3IFZrVmFsaWRhdGlvbkNoZWNrRVhUW3NyYy0+ZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzLCAodm9pZCAqKXNyYy0+cERpc2FibGVkVmFsaWRhdGlvbkNoZWNrcywgc2l6ZW9mKFZrVmFsaWRhdGlvbkNoZWNrRVhUKSpzcmMtPmRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQpOworICAgIH0KK30KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fVklfTk4KKworCitzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OOjpzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICB3aW5kb3coaW5fc3RydWN0LT53aW5kb3cpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OOjpzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHdpbmRvdyhudWxscHRyKQore30KKworc2FmZV9Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTjo6c2FmZV9Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTihjb25zdCBzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgd2luZG93ID0gc3JjLndpbmRvdzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiYgc2FmZV9Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4mIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHdpbmRvdyA9IHNyYy53aW5kb3c7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk46On5zYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OOjppbml0aWFsaXplKGNvbnN0IFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICB3aW5kb3cgPSBpbl9zdHJ1Y3QtPndpbmRvdzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICB3aW5kb3cgPSBzcmMtPndpbmRvdzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1ZJX05OCisKKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19IRFIoaW5fc3RydWN0LT50ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUiA9IHNyYy50ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHRleHR1cmVDb21wcmVzc2lvbkFTVENfSERSID0gc3JjLnRleHR1cmVDb21wcmVzc2lvbkFTVENfSERSOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHRleHR1cmVDb21wcmVzc2lvbkFTVENfSERSID0gaW5fc3RydWN0LT50ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICB0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0hEUiA9IHNyYy0+dGV4dHVyZUNvbXByZXNzaW9uQVNUQ19IRFI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQ6OnNhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVChjb25zdCBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkZWNvZGVNb2RlKGluX3N0cnVjdC0+ZGVjb2RlTW9kZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVDo6c2FmZV9Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQ6OnNhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVChjb25zdCBzYWZlX1ZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZWNvZGVNb2RlID0gc3JjLmRlY29kZU1vZGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCYgc2FmZV9Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZWNvZGVNb2RlID0gc3JjLmRlY29kZU1vZGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVDo6fnNhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUOjppbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGVjb2RlTW9kZSA9IGluX3N0cnVjdC0+ZGVjb2RlTW9kZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBkZWNvZGVNb2RlID0gc3JjLT5kZWNvZGVNb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50KGluX3N0cnVjdC0+ZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRlY29kZU1vZGVTaGFyZWRFeHBvbmVudCA9IHNyYy5kZWNvZGVNb2RlU2hhcmVkRXhwb25lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZWNvZGVNb2RlU2hhcmVkRXhwb25lbnQgPSBzcmMuZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRlY29kZU1vZGVTaGFyZWRFeHBvbmVudCA9IGluX3N0cnVjdC0+ZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRlY29kZU1vZGVTaGFyZWRFeHBvbmVudCA9IHNyYy0+ZGVjb2RlTW9kZVNoYXJlZEV4cG9uZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUOjpzYWZlX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQoY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgYnVmZmVyKGluX3N0cnVjdC0+YnVmZmVyKSwKKyAgICBvZmZzZXQoaW5fc3RydWN0LT5vZmZzZXQpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQ6OnNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUOjpzYWZlX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQoY29uc3Qgc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYnVmZmVyID0gc3JjLmJ1ZmZlcjsKKyAgICBvZmZzZXQgPSBzcmMub2Zmc2V0OworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQmIHNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYnVmZmVyID0gc3JjLmJ1ZmZlcjsKKyAgICBvZmZzZXQgPSBzcmMub2Zmc2V0OworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQ6On5zYWZlX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGJ1ZmZlciA9IGluX3N0cnVjdC0+YnVmZmVyOworICAgIG9mZnNldCA9IGluX3N0cnVjdC0+b2Zmc2V0OworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBidWZmZXIgPSBzcmMtPmJ1ZmZlcjsKKyAgICBvZmZzZXQgPSBzcmMtPm9mZnNldDsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBjb25kaXRpb25hbFJlbmRlcmluZyhpbl9zdHJ1Y3QtPmNvbmRpdGlvbmFsUmVuZGVyaW5nKSwKKyAgICBpbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZyhpbl9zdHJ1Y3QtPmluaGVyaXRlZENvbmRpdGlvbmFsUmVuZGVyaW5nKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29uZGl0aW9uYWxSZW5kZXJpbmcgPSBzcmMuY29uZGl0aW9uYWxSZW5kZXJpbmc7CisgICAgaW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmcgPSBzcmMuaW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb25kaXRpb25hbFJlbmRlcmluZyA9IHNyYy5jb25kaXRpb25hbFJlbmRlcmluZzsKKyAgICBpbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZyA9IHNyYy5pbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgY29uZGl0aW9uYWxSZW5kZXJpbmcgPSBpbl9zdHJ1Y3QtPmNvbmRpdGlvbmFsUmVuZGVyaW5nOworICAgIGluaGVyaXRlZENvbmRpdGlvbmFsUmVuZGVyaW5nID0gaW5fc3RydWN0LT5pbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGNvbmRpdGlvbmFsUmVuZGVyaW5nID0gc3JjLT5jb25kaXRpb25hbFJlbmRlcmluZzsKKyAgICBpbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZyA9IHNyYy0+aW5oZXJpdGVkQ29uZGl0aW9uYWxSZW5kZXJpbmc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUOjpzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBjb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZShpbl9zdHJ1Y3QtPmNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVDo6c2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVDo6c2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVChjb25zdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGUgPSBzcmMuY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQmIHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZSA9IHNyYy5jb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVDo6fnNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGUgPSBpbl9zdHJ1Y3QtPmNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGUgPSBzcmMtPmNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg6OnNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKGNvbnN0IFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQoaW5fc3RydWN0LT5jb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYOjpzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg6OnNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKGNvbnN0IHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQgPSBzcmMuY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYJiBzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydCA9IHNyYy5jb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg6On5zYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg6OmluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0ID0gaW5fc3RydWN0LT5jb21wdXRlQmluZGluZ1BvaW50U3VwcG9ydDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQgPSBzcmMtPmNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYOjpzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgoY29uc3QgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWF4SW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuQ291bnQoaW5fc3RydWN0LT5tYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudCksCisgICAgbWF4T2JqZWN0RW50cnlDb3VudHMoaW5fc3RydWN0LT5tYXhPYmplY3RFbnRyeUNvdW50cyksCisgICAgbWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudChpbl9zdHJ1Y3QtPm1pblNlcXVlbmNlQ291bnRCdWZmZXJPZmZzZXRBbGlnbm1lbnQpLAorICAgIG1pblNlcXVlbmNlSW5kZXhCdWZmZXJPZmZzZXRBbGlnbm1lbnQoaW5fc3RydWN0LT5taW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50KSwKKyAgICBtaW5Db21tYW5kc1Rva2VuQnVmZmVyT2Zmc2V0QWxpZ25tZW50KGluX3N0cnVjdC0+bWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWDo6c2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg6OnNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWChjb25zdCBzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudCA9IHNyYy5tYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudDsKKyAgICBtYXhPYmplY3RFbnRyeUNvdW50cyA9IHNyYy5tYXhPYmplY3RFbnRyeUNvdW50czsKKyAgICBtaW5TZXF1ZW5jZUNvdW50QnVmZmVyT2Zmc2V0QWxpZ25tZW50ID0gc3JjLm1pblNlcXVlbmNlQ291bnRCdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgbWluU2VxdWVuY2VJbmRleEJ1ZmZlck9mZnNldEFsaWdubWVudCA9IHNyYy5taW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIG1pbkNvbW1hbmRzVG9rZW5CdWZmZXJPZmZzZXRBbGlnbm1lbnQgPSBzcmMubWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYJiBzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50ID0gc3JjLm1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50OworICAgIG1heE9iamVjdEVudHJ5Q291bnRzID0gc3JjLm1heE9iamVjdEVudHJ5Q291bnRzOworICAgIG1pblNlcXVlbmNlQ291bnRCdWZmZXJPZmZzZXRBbGlnbm1lbnQgPSBzcmMubWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICBtaW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50ID0gc3JjLm1pblNlcXVlbmNlSW5kZXhCdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgbWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudCA9IHNyYy5taW5Db21tYW5kc1Rva2VuQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg6On5zYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWDo6aW5pdGlhbGl6ZShjb25zdCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50ID0gaW5fc3RydWN0LT5tYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudDsKKyAgICBtYXhPYmplY3RFbnRyeUNvdW50cyA9IGluX3N0cnVjdC0+bWF4T2JqZWN0RW50cnlDb3VudHM7CisgICAgbWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudCA9IGluX3N0cnVjdC0+bWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICBtaW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50ID0gaW5fc3RydWN0LT5taW5TZXF1ZW5jZUluZGV4QnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIG1pbkNvbW1hbmRzVG9rZW5CdWZmZXJPZmZzZXRBbGlnbm1lbnQgPSBpbl9zdHJ1Y3QtPm1pbkNvbW1hbmRzVG9rZW5CdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWF4SW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuQ291bnQgPSBzcmMtPm1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50OworICAgIG1heE9iamVjdEVudHJ5Q291bnRzID0gc3JjLT5tYXhPYmplY3RFbnRyeUNvdW50czsKKyAgICBtaW5TZXF1ZW5jZUNvdW50QnVmZmVyT2Zmc2V0QWxpZ25tZW50ID0gc3JjLT5taW5TZXF1ZW5jZUNvdW50QnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIG1pblNlcXVlbmNlSW5kZXhCdWZmZXJPZmZzZXRBbGlnbm1lbnQgPSBzcmMtPm1pblNlcXVlbmNlSW5kZXhCdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgbWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudCA9IHNyYy0+bWluQ29tbWFuZHNUb2tlbkJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWDo6c2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBpcGVsaW5lQmluZFBvaW50KGluX3N0cnVjdC0+cGlwZWxpbmVCaW5kUG9pbnQpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHRva2VuQ291bnQoaW5fc3RydWN0LT50b2tlbkNvdW50KSwKKyAgICBwVG9rZW5zKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBUb2tlbnMpIHsKKyAgICAgICAgcFRva2VucyA9IG5ldyBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWFtpbl9zdHJ1Y3QtPnRva2VuQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFRva2VucywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBUb2tlbnMsIHNpemVvZihWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWCkqaW5fc3RydWN0LT50b2tlbkNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWDo6c2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBUb2tlbnMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWDo6c2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKGNvbnN0IHNhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBpcGVsaW5lQmluZFBvaW50ID0gc3JjLnBpcGVsaW5lQmluZFBvaW50OworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHRva2VuQ291bnQgPSBzcmMudG9rZW5Db3VudDsKKyAgICBwVG9rZW5zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBUb2tlbnMpIHsKKyAgICAgICAgcFRva2VucyA9IG5ldyBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWFtzcmMudG9rZW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVG9rZW5zLCAodm9pZCAqKXNyYy5wVG9rZW5zLCBzaXplb2YoVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgpKnNyYy50b2tlbkNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCYgc2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBUb2tlbnMpCisgICAgICAgIGRlbGV0ZVtdIHBUb2tlbnM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwaXBlbGluZUJpbmRQb2ludCA9IHNyYy5waXBlbGluZUJpbmRQb2ludDsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICB0b2tlbkNvdW50ID0gc3JjLnRva2VuQ291bnQ7CisgICAgcFRva2VucyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wVG9rZW5zKSB7CisgICAgICAgIHBUb2tlbnMgPSBuZXcgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlhbc3JjLnRva2VuQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFRva2VucywgKHZvaWQgKilzcmMucFRva2Vucywgc2l6ZW9mKFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYKSpzcmMudG9rZW5Db3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlg6On5zYWZlX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgoKQoreworICAgIGlmIChwVG9rZW5zKQorICAgICAgICBkZWxldGVbXSBwVG9rZW5zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWDo6aW5pdGlhbGl6ZShjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHBpcGVsaW5lQmluZFBvaW50ID0gaW5fc3RydWN0LT5waXBlbGluZUJpbmRQb2ludDsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgdG9rZW5Db3VudCA9IGluX3N0cnVjdC0+dG9rZW5Db3VudDsKKyAgICBwVG9rZW5zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFRva2VucykgeworICAgICAgICBwVG9rZW5zID0gbmV3IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYW2luX3N0cnVjdC0+dG9rZW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVG9rZW5zLCAodm9pZCAqKWluX3N0cnVjdC0+cFRva2Vucywgc2l6ZW9mKFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYKSppbl9zdHJ1Y3QtPnRva2VuQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlg6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBpcGVsaW5lQmluZFBvaW50ID0gc3JjLT5waXBlbGluZUJpbmRQb2ludDsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgdG9rZW5Db3VudCA9IHNyYy0+dG9rZW5Db3VudDsKKyAgICBwVG9rZW5zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cFRva2VucykgeworICAgICAgICBwVG9rZW5zID0gbmV3IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYW3NyYy0+dG9rZW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVG9rZW5zLCAodm9pZCAqKXNyYy0+cFRva2Vucywgc2l6ZW9mKFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYKSpzcmMtPnRva2VuQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlg6OnNhZmVfVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKGNvbnN0IFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgb2JqZWN0VGFibGUoaW5fc3RydWN0LT5vYmplY3RUYWJsZSksCisgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dChpbl9zdHJ1Y3QtPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQpLAorICAgIGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50KGluX3N0cnVjdC0+aW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQpLAorICAgIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zKG51bGxwdHIpLAorICAgIG1heFNlcXVlbmNlc0NvdW50KGluX3N0cnVjdC0+bWF4U2VxdWVuY2VzQ291bnQpLAorICAgIHRhcmdldENvbW1hbmRCdWZmZXIoaW5fc3RydWN0LT50YXJnZXRDb21tYW5kQnVmZmVyKSwKKyAgICBzZXF1ZW5jZXNDb3VudEJ1ZmZlcihpbl9zdHJ1Y3QtPnNlcXVlbmNlc0NvdW50QnVmZmVyKSwKKyAgICBzZXF1ZW5jZXNDb3VudE9mZnNldChpbl9zdHJ1Y3QtPnNlcXVlbmNlc0NvdW50T2Zmc2V0KSwKKyAgICBzZXF1ZW5jZXNJbmRleEJ1ZmZlcihpbl9zdHJ1Y3QtPnNlcXVlbmNlc0luZGV4QnVmZmVyKSwKKyAgICBzZXF1ZW5jZXNJbmRleE9mZnNldChpbl9zdHJ1Y3QtPnNlcXVlbmNlc0luZGV4T2Zmc2V0KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQgJiYgaW5fc3RydWN0LT5wSW5kaXJlY3RDb21tYW5kc1Rva2VucykgeworICAgICAgICBwSW5kaXJlY3RDb21tYW5kc1Rva2VucyA9IG5ldyBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWFtpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpXSA9IGluX3N0cnVjdC0+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYOjpzYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwSW5kaXJlY3RDb21tYW5kc1Rva2VucyhudWxscHRyKQore30KKworc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlg6OnNhZmVfVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKGNvbnN0IHNhZmVfVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb2JqZWN0VGFibGUgPSBzcmMub2JqZWN0VGFibGU7CisgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCA9IHNyYy5pbmRpcmVjdENvbW1hbmRzTGF5b3V0OworICAgIGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50ID0gc3JjLmluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50OworICAgIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zID0gbnVsbHB0cjsKKyAgICBtYXhTZXF1ZW5jZXNDb3VudCA9IHNyYy5tYXhTZXF1ZW5jZXNDb3VudDsKKyAgICB0YXJnZXRDb21tYW5kQnVmZmVyID0gc3JjLnRhcmdldENvbW1hbmRCdWZmZXI7CisgICAgc2VxdWVuY2VzQ291bnRCdWZmZXIgPSBzcmMuc2VxdWVuY2VzQ291bnRCdWZmZXI7CisgICAgc2VxdWVuY2VzQ291bnRPZmZzZXQgPSBzcmMuc2VxdWVuY2VzQ291bnRPZmZzZXQ7CisgICAgc2VxdWVuY2VzSW5kZXhCdWZmZXIgPSBzcmMuc2VxdWVuY2VzSW5kZXhCdWZmZXI7CisgICAgc2VxdWVuY2VzSW5kZXhPZmZzZXQgPSBzcmMuc2VxdWVuY2VzSW5kZXhPZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50ICYmIHNyYy5wSW5kaXJlY3RDb21tYW5kc1Rva2VucykgeworICAgICAgICBwSW5kaXJlY3RDb21tYW5kc1Rva2VucyA9IG5ldyBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWFtpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpXSA9IHNyYy5wSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgmIHNhZmVfVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEluZGlyZWN0Q29tbWFuZHNUb2tlbnMpCisgICAgICAgIGRlbGV0ZVtdIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb2JqZWN0VGFibGUgPSBzcmMub2JqZWN0VGFibGU7CisgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCA9IHNyYy5pbmRpcmVjdENvbW1hbmRzTGF5b3V0OworICAgIGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50ID0gc3JjLmluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50OworICAgIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zID0gbnVsbHB0cjsKKyAgICBtYXhTZXF1ZW5jZXNDb3VudCA9IHNyYy5tYXhTZXF1ZW5jZXNDb3VudDsKKyAgICB0YXJnZXRDb21tYW5kQnVmZmVyID0gc3JjLnRhcmdldENvbW1hbmRCdWZmZXI7CisgICAgc2VxdWVuY2VzQ291bnRCdWZmZXIgPSBzcmMuc2VxdWVuY2VzQ291bnRCdWZmZXI7CisgICAgc2VxdWVuY2VzQ291bnRPZmZzZXQgPSBzcmMuc2VxdWVuY2VzQ291bnRPZmZzZXQ7CisgICAgc2VxdWVuY2VzSW5kZXhCdWZmZXIgPSBzcmMuc2VxdWVuY2VzSW5kZXhCdWZmZXI7CisgICAgc2VxdWVuY2VzSW5kZXhPZmZzZXQgPSBzcmMuc2VxdWVuY2VzSW5kZXhPZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50ICYmIHNyYy5wSW5kaXJlY3RDb21tYW5kc1Rva2VucykgeworICAgICAgICBwSW5kaXJlY3RDb21tYW5kc1Rva2VucyA9IG5ldyBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWFtpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudDsgKytpKSB7CisgICAgICAgICAgICBwSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpXSA9IHNyYy5wSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlg6On5zYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCgpCit7CisgICAgaWYgKHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zKQorICAgICAgICBkZWxldGVbXSBwSW5kaXJlY3RDb21tYW5kc1Rva2VuczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWDo6aW5pdGlhbGl6ZShjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgb2JqZWN0VGFibGUgPSBpbl9zdHJ1Y3QtPm9iamVjdFRhYmxlOworICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQgPSBpbl9zdHJ1Y3QtPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ7CisgICAgaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQgPSBpbl9zdHJ1Y3QtPmluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50OworICAgIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zID0gbnVsbHB0cjsKKyAgICBtYXhTZXF1ZW5jZXNDb3VudCA9IGluX3N0cnVjdC0+bWF4U2VxdWVuY2VzQ291bnQ7CisgICAgdGFyZ2V0Q29tbWFuZEJ1ZmZlciA9IGluX3N0cnVjdC0+dGFyZ2V0Q29tbWFuZEJ1ZmZlcjsKKyAgICBzZXF1ZW5jZXNDb3VudEJ1ZmZlciA9IGluX3N0cnVjdC0+c2VxdWVuY2VzQ291bnRCdWZmZXI7CisgICAgc2VxdWVuY2VzQ291bnRPZmZzZXQgPSBpbl9zdHJ1Y3QtPnNlcXVlbmNlc0NvdW50T2Zmc2V0OworICAgIHNlcXVlbmNlc0luZGV4QnVmZmVyID0gaW5fc3RydWN0LT5zZXF1ZW5jZXNJbmRleEJ1ZmZlcjsKKyAgICBzZXF1ZW5jZXNJbmRleE9mZnNldCA9IGluX3N0cnVjdC0+c2VxdWVuY2VzSW5kZXhPZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudCAmJiBpbl9zdHJ1Y3QtPnBJbmRpcmVjdENvbW1hbmRzVG9rZW5zKSB7CisgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zID0gbmV3IFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYW2luZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zW2ldID0gaW5fc3RydWN0LT5wSW5kaXJlY3RDb21tYW5kc1Rva2Vuc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBvYmplY3RUYWJsZSA9IHNyYy0+b2JqZWN0VGFibGU7CisgICAgaW5kaXJlY3RDb21tYW5kc0xheW91dCA9IHNyYy0+aW5kaXJlY3RDb21tYW5kc0xheW91dDsKKyAgICBpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudCA9IHNyYy0+aW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQ7CisgICAgcEluZGlyZWN0Q29tbWFuZHNUb2tlbnMgPSBudWxscHRyOworICAgIG1heFNlcXVlbmNlc0NvdW50ID0gc3JjLT5tYXhTZXF1ZW5jZXNDb3VudDsKKyAgICB0YXJnZXRDb21tYW5kQnVmZmVyID0gc3JjLT50YXJnZXRDb21tYW5kQnVmZmVyOworICAgIHNlcXVlbmNlc0NvdW50QnVmZmVyID0gc3JjLT5zZXF1ZW5jZXNDb3VudEJ1ZmZlcjsKKyAgICBzZXF1ZW5jZXNDb3VudE9mZnNldCA9IHNyYy0+c2VxdWVuY2VzQ291bnRPZmZzZXQ7CisgICAgc2VxdWVuY2VzSW5kZXhCdWZmZXIgPSBzcmMtPnNlcXVlbmNlc0luZGV4QnVmZmVyOworICAgIHNlcXVlbmNlc0luZGV4T2Zmc2V0ID0gc3JjLT5zZXF1ZW5jZXNJbmRleE9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50ICYmIHNyYy0+cEluZGlyZWN0Q29tbWFuZHNUb2tlbnMpIHsKKyAgICAgICAgcEluZGlyZWN0Q29tbWFuZHNUb2tlbnMgPSBuZXcgVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlhbaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5kaXJlY3RDb21tYW5kc1Rva2VuQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEluZGlyZWN0Q29tbWFuZHNUb2tlbnNbaV0gPSBzcmMtPnBJbmRpcmVjdENvbW1hbmRzVG9rZW5zW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYOjpzYWZlX1ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBvYmplY3RUYWJsZShpbl9zdHJ1Y3QtPm9iamVjdFRhYmxlKSwKKyAgICBpbmRpcmVjdENvbW1hbmRzTGF5b3V0KGluX3N0cnVjdC0+aW5kaXJlY3RDb21tYW5kc0xheW91dCksCisgICAgbWF4U2VxdWVuY2VzQ291bnQoaW5fc3RydWN0LT5tYXhTZXF1ZW5jZXNDb3VudCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlg6OnNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlg6OnNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgoY29uc3Qgc2FmZV9Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG9iamVjdFRhYmxlID0gc3JjLm9iamVjdFRhYmxlOworICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQgPSBzcmMuaW5kaXJlY3RDb21tYW5kc0xheW91dDsKKyAgICBtYXhTZXF1ZW5jZXNDb3VudCA9IHNyYy5tYXhTZXF1ZW5jZXNDb3VudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCYgc2FmZV9Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG9iamVjdFRhYmxlID0gc3JjLm9iamVjdFRhYmxlOworICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQgPSBzcmMuaW5kaXJlY3RDb21tYW5kc0xheW91dDsKKyAgICBtYXhTZXF1ZW5jZXNDb3VudCA9IHNyYy5tYXhTZXF1ZW5jZXNDb3VudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWDo6fnNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlg6OmluaXRpYWxpemUoY29uc3QgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgb2JqZWN0VGFibGUgPSBpbl9zdHJ1Y3QtPm9iamVjdFRhYmxlOworICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQgPSBpbl9zdHJ1Y3QtPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ7CisgICAgbWF4U2VxdWVuY2VzQ291bnQgPSBpbl9zdHJ1Y3QtPm1heFNlcXVlbmNlc0NvdW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgb2JqZWN0VGFibGUgPSBzcmMtPm9iamVjdFRhYmxlOworICAgIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQgPSBzcmMtPmluZGlyZWN0Q29tbWFuZHNMYXlvdXQ7CisgICAgbWF4U2VxdWVuY2VzQ291bnQgPSBzcmMtPm1heFNlcXVlbmNlc0NvdW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWDo6c2FmZV9Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWChjb25zdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgb2JqZWN0Q291bnQoaW5fc3RydWN0LT5vYmplY3RDb3VudCksCisgICAgcE9iamVjdEVudHJ5VHlwZXMobnVsbHB0ciksCisgICAgcE9iamVjdEVudHJ5Q291bnRzKG51bGxwdHIpLAorICAgIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MobnVsbHB0ciksCisgICAgbWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yKGluX3N0cnVjdC0+bWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yKSwKKyAgICBtYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3IoaW5fc3RydWN0LT5tYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3IpLAorICAgIG1heFN0b3JhZ2VJbWFnZXNQZXJEZXNjcmlwdG9yKGluX3N0cnVjdC0+bWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3IpLAorICAgIG1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yKGluX3N0cnVjdC0+bWF4U2FtcGxlZEltYWdlc1BlckRlc2NyaXB0b3IpLAorICAgIG1heFBpcGVsaW5lTGF5b3V0cyhpbl9zdHJ1Y3QtPm1heFBpcGVsaW5lTGF5b3V0cykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cE9iamVjdEVudHJ5VHlwZXMpIHsKKyAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMgPSBuZXcgVmtPYmplY3RFbnRyeVR5cGVOVlhbaW5fc3RydWN0LT5vYmplY3RDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwT2JqZWN0RW50cnlUeXBlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBPYmplY3RFbnRyeVR5cGVzLCBzaXplb2YoVmtPYmplY3RFbnRyeVR5cGVOVlgpKmluX3N0cnVjdC0+b2JqZWN0Q291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wT2JqZWN0RW50cnlDb3VudHMpIHsKKyAgICAgICAgcE9iamVjdEVudHJ5Q291bnRzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+b2JqZWN0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcE9iamVjdEVudHJ5Q291bnRzLCAodm9pZCAqKWluX3N0cnVjdC0+cE9iamVjdEVudHJ5Q291bnRzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+b2JqZWN0Q291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wT2JqZWN0RW50cnlVc2FnZUZsYWdzKSB7CisgICAgICAgIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgPSBuZXcgVmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlhbaW5fc3RydWN0LT5vYmplY3RDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwT2JqZWN0RW50cnlVc2FnZUZsYWdzLCAodm9pZCAqKWluX3N0cnVjdC0+cE9iamVjdEVudHJ5VXNhZ2VGbGFncywgc2l6ZW9mKFZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYKSppbl9zdHJ1Y3QtPm9iamVjdENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlg6OnNhZmVfVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcE9iamVjdEVudHJ5VHlwZXMobnVsbHB0ciksCisgICAgcE9iamVjdEVudHJ5Q291bnRzKG51bGxwdHIpLAorICAgIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MobnVsbHB0cikKK3t9CisKK3NhZmVfVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlg6OnNhZmVfVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgoY29uc3Qgc2FmZV9Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG9iamVjdENvdW50ID0gc3JjLm9iamVjdENvdW50OworICAgIHBPYmplY3RFbnRyeVR5cGVzID0gbnVsbHB0cjsKKyAgICBwT2JqZWN0RW50cnlDb3VudHMgPSBudWxscHRyOworICAgIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgPSBudWxscHRyOworICAgIG1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvciA9IHNyYy5tYXhVbmlmb3JtQnVmZmVyc1BlckRlc2NyaXB0b3I7CisgICAgbWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yID0gc3JjLm1heFN0b3JhZ2VCdWZmZXJzUGVyRGVzY3JpcHRvcjsKKyAgICBtYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvciA9IHNyYy5tYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvcjsKKyAgICBtYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvciA9IHNyYy5tYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvcjsKKyAgICBtYXhQaXBlbGluZUxheW91dHMgPSBzcmMubWF4UGlwZWxpbmVMYXlvdXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucE9iamVjdEVudHJ5VHlwZXMpIHsKKyAgICAgICAgcE9iamVjdEVudHJ5VHlwZXMgPSBuZXcgVmtPYmplY3RFbnRyeVR5cGVOVlhbc3JjLm9iamVjdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBPYmplY3RFbnRyeVR5cGVzLCAodm9pZCAqKXNyYy5wT2JqZWN0RW50cnlUeXBlcywgc2l6ZW9mKFZrT2JqZWN0RW50cnlUeXBlTlZYKSpzcmMub2JqZWN0Q291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBPYmplY3RFbnRyeUNvdW50cykgeworICAgICAgICBwT2JqZWN0RW50cnlDb3VudHMgPSBuZXcgdWludDMyX3Rbc3JjLm9iamVjdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBPYmplY3RFbnRyeUNvdW50cywgKHZvaWQgKilzcmMucE9iamVjdEVudHJ5Q291bnRzLCBzaXplb2YodWludDMyX3QpKnNyYy5vYmplY3RDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucE9iamVjdEVudHJ5VXNhZ2VGbGFncykgeworICAgICAgICBwT2JqZWN0RW50cnlVc2FnZUZsYWdzID0gbmV3IFZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYW3NyYy5vYmplY3RDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwT2JqZWN0RW50cnlVc2FnZUZsYWdzLCAodm9pZCAqKXNyYy5wT2JqZWN0RW50cnlVc2FnZUZsYWdzLCBzaXplb2YoVmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgpKnNyYy5vYmplY3RDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYJiBzYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwT2JqZWN0RW50cnlUeXBlcykKKyAgICAgICAgZGVsZXRlW10gcE9iamVjdEVudHJ5VHlwZXM7CisgICAgaWYgKHBPYmplY3RFbnRyeUNvdW50cykKKyAgICAgICAgZGVsZXRlW10gcE9iamVjdEVudHJ5Q291bnRzOworICAgIGlmIChwT2JqZWN0RW50cnlVc2FnZUZsYWdzKQorICAgICAgICBkZWxldGVbXSBwT2JqZWN0RW50cnlVc2FnZUZsYWdzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb2JqZWN0Q291bnQgPSBzcmMub2JqZWN0Q291bnQ7CisgICAgcE9iamVjdEVudHJ5VHlwZXMgPSBudWxscHRyOworICAgIHBPYmplY3RFbnRyeUNvdW50cyA9IG51bGxwdHI7CisgICAgcE9iamVjdEVudHJ5VXNhZ2VGbGFncyA9IG51bGxwdHI7CisgICAgbWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yID0gc3JjLm1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvcjsKKyAgICBtYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3IgPSBzcmMubWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yOworICAgIG1heFN0b3JhZ2VJbWFnZXNQZXJEZXNjcmlwdG9yID0gc3JjLm1heFN0b3JhZ2VJbWFnZXNQZXJEZXNjcmlwdG9yOworICAgIG1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yID0gc3JjLm1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yOworICAgIG1heFBpcGVsaW5lTGF5b3V0cyA9IHNyYy5tYXhQaXBlbGluZUxheW91dHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wT2JqZWN0RW50cnlUeXBlcykgeworICAgICAgICBwT2JqZWN0RW50cnlUeXBlcyA9IG5ldyBWa09iamVjdEVudHJ5VHlwZU5WWFtzcmMub2JqZWN0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcE9iamVjdEVudHJ5VHlwZXMsICh2b2lkICopc3JjLnBPYmplY3RFbnRyeVR5cGVzLCBzaXplb2YoVmtPYmplY3RFbnRyeVR5cGVOVlgpKnNyYy5vYmplY3RDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucE9iamVjdEVudHJ5Q291bnRzKSB7CisgICAgICAgIHBPYmplY3RFbnRyeUNvdW50cyA9IG5ldyB1aW50MzJfdFtzcmMub2JqZWN0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcE9iamVjdEVudHJ5Q291bnRzLCAodm9pZCAqKXNyYy5wT2JqZWN0RW50cnlDb3VudHMsIHNpemVvZih1aW50MzJfdCkqc3JjLm9iamVjdENvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wT2JqZWN0RW50cnlVc2FnZUZsYWdzKSB7CisgICAgICAgIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgPSBuZXcgVmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlhbc3JjLm9iamVjdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBPYmplY3RFbnRyeVVzYWdlRmxhZ3MsICh2b2lkICopc3JjLnBPYmplY3RFbnRyeVVzYWdlRmxhZ3MsIHNpemVvZihWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCkqc3JjLm9iamVjdENvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlg6On5zYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKCkKK3sKKyAgICBpZiAocE9iamVjdEVudHJ5VHlwZXMpCisgICAgICAgIGRlbGV0ZVtdIHBPYmplY3RFbnRyeVR5cGVzOworICAgIGlmIChwT2JqZWN0RW50cnlDb3VudHMpCisgICAgICAgIGRlbGV0ZVtdIHBPYmplY3RFbnRyeUNvdW50czsKKyAgICBpZiAocE9iamVjdEVudHJ5VXNhZ2VGbGFncykKKyAgICAgICAgZGVsZXRlW10gcE9iamVjdEVudHJ5VXNhZ2VGbGFnczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYOjppbml0aWFsaXplKGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG9iamVjdENvdW50ID0gaW5fc3RydWN0LT5vYmplY3RDb3VudDsKKyAgICBwT2JqZWN0RW50cnlUeXBlcyA9IG51bGxwdHI7CisgICAgcE9iamVjdEVudHJ5Q291bnRzID0gbnVsbHB0cjsKKyAgICBwT2JqZWN0RW50cnlVc2FnZUZsYWdzID0gbnVsbHB0cjsKKyAgICBtYXhVbmlmb3JtQnVmZmVyc1BlckRlc2NyaXB0b3IgPSBpbl9zdHJ1Y3QtPm1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvcjsKKyAgICBtYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3IgPSBpbl9zdHJ1Y3QtPm1heFN0b3JhZ2VCdWZmZXJzUGVyRGVzY3JpcHRvcjsKKyAgICBtYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvciA9IGluX3N0cnVjdC0+bWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3I7CisgICAgbWF4U2FtcGxlZEltYWdlc1BlckRlc2NyaXB0b3IgPSBpbl9zdHJ1Y3QtPm1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yOworICAgIG1heFBpcGVsaW5lTGF5b3V0cyA9IGluX3N0cnVjdC0+bWF4UGlwZWxpbmVMYXlvdXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wT2JqZWN0RW50cnlUeXBlcykgeworICAgICAgICBwT2JqZWN0RW50cnlUeXBlcyA9IG5ldyBWa09iamVjdEVudHJ5VHlwZU5WWFtpbl9zdHJ1Y3QtPm9iamVjdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBPYmplY3RFbnRyeVR5cGVzLCAodm9pZCAqKWluX3N0cnVjdC0+cE9iamVjdEVudHJ5VHlwZXMsIHNpemVvZihWa09iamVjdEVudHJ5VHlwZU5WWCkqaW5fc3RydWN0LT5vYmplY3RDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBPYmplY3RFbnRyeUNvdW50cykgeworICAgICAgICBwT2JqZWN0RW50cnlDb3VudHMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5vYmplY3RDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwT2JqZWN0RW50cnlDb3VudHMsICh2b2lkICopaW5fc3RydWN0LT5wT2JqZWN0RW50cnlDb3VudHMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5vYmplY3RDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBPYmplY3RFbnRyeVVzYWdlRmxhZ3MpIHsKKyAgICAgICAgcE9iamVjdEVudHJ5VXNhZ2VGbGFncyA9IG5ldyBWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWFtpbl9zdHJ1Y3QtPm9iamVjdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBPYmplY3RFbnRyeVVzYWdlRmxhZ3MsICh2b2lkICopaW5fc3RydWN0LT5wT2JqZWN0RW50cnlVc2FnZUZsYWdzLCBzaXplb2YoVmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgpKmluX3N0cnVjdC0+b2JqZWN0Q291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgb2JqZWN0Q291bnQgPSBzcmMtPm9iamVjdENvdW50OworICAgIHBPYmplY3RFbnRyeVR5cGVzID0gbnVsbHB0cjsKKyAgICBwT2JqZWN0RW50cnlDb3VudHMgPSBudWxscHRyOworICAgIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgPSBudWxscHRyOworICAgIG1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvciA9IHNyYy0+bWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yOworICAgIG1heFN0b3JhZ2VCdWZmZXJzUGVyRGVzY3JpcHRvciA9IHNyYy0+bWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yOworICAgIG1heFN0b3JhZ2VJbWFnZXNQZXJEZXNjcmlwdG9yID0gc3JjLT5tYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvcjsKKyAgICBtYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvciA9IHNyYy0+bWF4U2FtcGxlZEltYWdlc1BlckRlc2NyaXB0b3I7CisgICAgbWF4UGlwZWxpbmVMYXlvdXRzID0gc3JjLT5tYXhQaXBlbGluZUxheW91dHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBPYmplY3RFbnRyeVR5cGVzKSB7CisgICAgICAgIHBPYmplY3RFbnRyeVR5cGVzID0gbmV3IFZrT2JqZWN0RW50cnlUeXBlTlZYW3NyYy0+b2JqZWN0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcE9iamVjdEVudHJ5VHlwZXMsICh2b2lkICopc3JjLT5wT2JqZWN0RW50cnlUeXBlcywgc2l6ZW9mKFZrT2JqZWN0RW50cnlUeXBlTlZYKSpzcmMtPm9iamVjdENvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy0+cE9iamVjdEVudHJ5Q291bnRzKSB7CisgICAgICAgIHBPYmplY3RFbnRyeUNvdW50cyA9IG5ldyB1aW50MzJfdFtzcmMtPm9iamVjdENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBPYmplY3RFbnRyeUNvdW50cywgKHZvaWQgKilzcmMtPnBPYmplY3RFbnRyeUNvdW50cywgc2l6ZW9mKHVpbnQzMl90KSpzcmMtPm9iamVjdENvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy0+cE9iamVjdEVudHJ5VXNhZ2VGbGFncykgeworICAgICAgICBwT2JqZWN0RW50cnlVc2FnZUZsYWdzID0gbmV3IFZrT2JqZWN0RW50cnlVc2FnZUZsYWdzTlZYW3NyYy0+b2JqZWN0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcE9iamVjdEVudHJ5VXNhZ2VGbGFncywgKHZvaWQgKilzcmMtPnBPYmplY3RFbnRyeVVzYWdlRmxhZ3MsIHNpemVvZihWa09iamVjdEVudHJ5VXNhZ2VGbGFnc05WWCkqc3JjLT5vYmplY3RDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY6OnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB2aWV3cG9ydFdTY2FsaW5nRW5hYmxlKGluX3N0cnVjdC0+dmlld3BvcnRXU2NhbGluZ0VuYWJsZSksCisgICAgdmlld3BvcnRDb3VudChpbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQpLAorICAgIHBWaWV3cG9ydFdTY2FsaW5ncyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wVmlld3BvcnRXU2NhbGluZ3MpIHsKKyAgICAgICAgcFZpZXdwb3J0V1NjYWxpbmdzID0gbmV3IFZrVmlld3BvcnRXU2NhbGluZ05WW2luX3N0cnVjdC0+dmlld3BvcnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRXU2NhbGluZ3MsICh2b2lkICopaW5fc3RydWN0LT5wVmlld3BvcnRXU2NhbGluZ3MsIHNpemVvZihWa1ZpZXdwb3J0V1NjYWxpbmdOVikqaW5fc3RydWN0LT52aWV3cG9ydENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBWaWV3cG9ydFdTY2FsaW5ncyhudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdmlld3BvcnRXU2NhbGluZ0VuYWJsZSA9IHNyYy52aWV3cG9ydFdTY2FsaW5nRW5hYmxlOworICAgIHZpZXdwb3J0Q291bnQgPSBzcmMudmlld3BvcnRDb3VudDsKKyAgICBwVmlld3BvcnRXU2NhbGluZ3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFZpZXdwb3J0V1NjYWxpbmdzKSB7CisgICAgICAgIHBWaWV3cG9ydFdTY2FsaW5ncyA9IG5ldyBWa1ZpZXdwb3J0V1NjYWxpbmdOVltzcmMudmlld3BvcnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRXU2NhbGluZ3MsICh2b2lkICopc3JjLnBWaWV3cG9ydFdTY2FsaW5ncywgc2l6ZW9mKFZrVmlld3BvcnRXU2NhbGluZ05WKSpzcmMudmlld3BvcnRDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYmIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwVmlld3BvcnRXU2NhbGluZ3MpCisgICAgICAgIGRlbGV0ZVtdIHBWaWV3cG9ydFdTY2FsaW5nczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHZpZXdwb3J0V1NjYWxpbmdFbmFibGUgPSBzcmMudmlld3BvcnRXU2NhbGluZ0VuYWJsZTsKKyAgICB2aWV3cG9ydENvdW50ID0gc3JjLnZpZXdwb3J0Q291bnQ7CisgICAgcFZpZXdwb3J0V1NjYWxpbmdzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBWaWV3cG9ydFdTY2FsaW5ncykgeworICAgICAgICBwVmlld3BvcnRXU2NhbGluZ3MgPSBuZXcgVmtWaWV3cG9ydFdTY2FsaW5nTlZbc3JjLnZpZXdwb3J0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdwb3J0V1NjYWxpbmdzLCAodm9pZCAqKXNyYy5wVmlld3BvcnRXU2NhbGluZ3MsIHNpemVvZihWa1ZpZXdwb3J0V1NjYWxpbmdOVikqc3JjLnZpZXdwb3J0Q291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WOjp+c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WKCkKK3sKKyAgICBpZiAocFZpZXdwb3J0V1NjYWxpbmdzKQorICAgICAgICBkZWxldGVbXSBwVmlld3BvcnRXU2NhbGluZ3M7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgdmlld3BvcnRXU2NhbGluZ0VuYWJsZSA9IGluX3N0cnVjdC0+dmlld3BvcnRXU2NhbGluZ0VuYWJsZTsKKyAgICB2aWV3cG9ydENvdW50ID0gaW5fc3RydWN0LT52aWV3cG9ydENvdW50OworICAgIHBWaWV3cG9ydFdTY2FsaW5ncyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBWaWV3cG9ydFdTY2FsaW5ncykgeworICAgICAgICBwVmlld3BvcnRXU2NhbGluZ3MgPSBuZXcgVmtWaWV3cG9ydFdTY2FsaW5nTlZbaW5fc3RydWN0LT52aWV3cG9ydENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3cG9ydFdTY2FsaW5ncywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWaWV3cG9ydFdTY2FsaW5ncywgc2l6ZW9mKFZrVmlld3BvcnRXU2NhbGluZ05WKSppbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHZpZXdwb3J0V1NjYWxpbmdFbmFibGUgPSBzcmMtPnZpZXdwb3J0V1NjYWxpbmdFbmFibGU7CisgICAgdmlld3BvcnRDb3VudCA9IHNyYy0+dmlld3BvcnRDb3VudDsKKyAgICBwVmlld3BvcnRXU2NhbGluZ3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wVmlld3BvcnRXU2NhbGluZ3MpIHsKKyAgICAgICAgcFZpZXdwb3J0V1NjYWxpbmdzID0gbmV3IFZrVmlld3BvcnRXU2NhbGluZ05WW3NyYy0+dmlld3BvcnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRXU2NhbGluZ3MsICh2b2lkICopc3JjLT5wVmlld3BvcnRXU2NhbGluZ3MsIHNpemVvZihWa1ZpZXdwb3J0V1NjYWxpbmdOVikqc3JjLT52aWV3cG9ydENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVDo6c2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1pbkltYWdlQ291bnQoaW5fc3RydWN0LT5taW5JbWFnZUNvdW50KSwKKyAgICBtYXhJbWFnZUNvdW50KGluX3N0cnVjdC0+bWF4SW1hZ2VDb3VudCksCisgICAgY3VycmVudEV4dGVudChpbl9zdHJ1Y3QtPmN1cnJlbnRFeHRlbnQpLAorICAgIG1pbkltYWdlRXh0ZW50KGluX3N0cnVjdC0+bWluSW1hZ2VFeHRlbnQpLAorICAgIG1heEltYWdlRXh0ZW50KGluX3N0cnVjdC0+bWF4SW1hZ2VFeHRlbnQpLAorICAgIG1heEltYWdlQXJyYXlMYXllcnMoaW5fc3RydWN0LT5tYXhJbWFnZUFycmF5TGF5ZXJzKSwKKyAgICBzdXBwb3J0ZWRUcmFuc2Zvcm1zKGluX3N0cnVjdC0+c3VwcG9ydGVkVHJhbnNmb3JtcyksCisgICAgY3VycmVudFRyYW5zZm9ybShpbl9zdHJ1Y3QtPmN1cnJlbnRUcmFuc2Zvcm0pLAorICAgIHN1cHBvcnRlZENvbXBvc2l0ZUFscGhhKGluX3N0cnVjdC0+c3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEpLAorICAgIHN1cHBvcnRlZFVzYWdlRmxhZ3MoaW5fc3RydWN0LT5zdXBwb3J0ZWRVc2FnZUZsYWdzKSwKKyAgICBzdXBwb3J0ZWRTdXJmYWNlQ291bnRlcnMoaW5fc3RydWN0LT5zdXBwb3J0ZWRTdXJmYWNlQ291bnRlcnMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ6OnNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUOjpzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWluSW1hZ2VDb3VudCA9IHNyYy5taW5JbWFnZUNvdW50OworICAgIG1heEltYWdlQ291bnQgPSBzcmMubWF4SW1hZ2VDb3VudDsKKyAgICBjdXJyZW50RXh0ZW50ID0gc3JjLmN1cnJlbnRFeHRlbnQ7CisgICAgbWluSW1hZ2VFeHRlbnQgPSBzcmMubWluSW1hZ2VFeHRlbnQ7CisgICAgbWF4SW1hZ2VFeHRlbnQgPSBzcmMubWF4SW1hZ2VFeHRlbnQ7CisgICAgbWF4SW1hZ2VBcnJheUxheWVycyA9IHNyYy5tYXhJbWFnZUFycmF5TGF5ZXJzOworICAgIHN1cHBvcnRlZFRyYW5zZm9ybXMgPSBzcmMuc3VwcG9ydGVkVHJhbnNmb3JtczsKKyAgICBjdXJyZW50VHJhbnNmb3JtID0gc3JjLmN1cnJlbnRUcmFuc2Zvcm07CisgICAgc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEgPSBzcmMuc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGE7CisgICAgc3VwcG9ydGVkVXNhZ2VGbGFncyA9IHNyYy5zdXBwb3J0ZWRVc2FnZUZsYWdzOworICAgIHN1cHBvcnRlZFN1cmZhY2VDb3VudGVycyA9IHNyYy5zdXBwb3J0ZWRTdXJmYWNlQ291bnRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCYgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtaW5JbWFnZUNvdW50ID0gc3JjLm1pbkltYWdlQ291bnQ7CisgICAgbWF4SW1hZ2VDb3VudCA9IHNyYy5tYXhJbWFnZUNvdW50OworICAgIGN1cnJlbnRFeHRlbnQgPSBzcmMuY3VycmVudEV4dGVudDsKKyAgICBtaW5JbWFnZUV4dGVudCA9IHNyYy5taW5JbWFnZUV4dGVudDsKKyAgICBtYXhJbWFnZUV4dGVudCA9IHNyYy5tYXhJbWFnZUV4dGVudDsKKyAgICBtYXhJbWFnZUFycmF5TGF5ZXJzID0gc3JjLm1heEltYWdlQXJyYXlMYXllcnM7CisgICAgc3VwcG9ydGVkVHJhbnNmb3JtcyA9IHNyYy5zdXBwb3J0ZWRUcmFuc2Zvcm1zOworICAgIGN1cnJlbnRUcmFuc2Zvcm0gPSBzcmMuY3VycmVudFRyYW5zZm9ybTsKKyAgICBzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSA9IHNyYy5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYTsKKyAgICBzdXBwb3J0ZWRVc2FnZUZsYWdzID0gc3JjLnN1cHBvcnRlZFVzYWdlRmxhZ3M7CisgICAgc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzID0gc3JjLnN1cHBvcnRlZFN1cmZhY2VDb3VudGVyczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUOjp+c2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtaW5JbWFnZUNvdW50ID0gaW5fc3RydWN0LT5taW5JbWFnZUNvdW50OworICAgIG1heEltYWdlQ291bnQgPSBpbl9zdHJ1Y3QtPm1heEltYWdlQ291bnQ7CisgICAgY3VycmVudEV4dGVudCA9IGluX3N0cnVjdC0+Y3VycmVudEV4dGVudDsKKyAgICBtaW5JbWFnZUV4dGVudCA9IGluX3N0cnVjdC0+bWluSW1hZ2VFeHRlbnQ7CisgICAgbWF4SW1hZ2VFeHRlbnQgPSBpbl9zdHJ1Y3QtPm1heEltYWdlRXh0ZW50OworICAgIG1heEltYWdlQXJyYXlMYXllcnMgPSBpbl9zdHJ1Y3QtPm1heEltYWdlQXJyYXlMYXllcnM7CisgICAgc3VwcG9ydGVkVHJhbnNmb3JtcyA9IGluX3N0cnVjdC0+c3VwcG9ydGVkVHJhbnNmb3JtczsKKyAgICBjdXJyZW50VHJhbnNmb3JtID0gaW5fc3RydWN0LT5jdXJyZW50VHJhbnNmb3JtOworICAgIHN1cHBvcnRlZENvbXBvc2l0ZUFscGhhID0gaW5fc3RydWN0LT5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYTsKKyAgICBzdXBwb3J0ZWRVc2FnZUZsYWdzID0gaW5fc3RydWN0LT5zdXBwb3J0ZWRVc2FnZUZsYWdzOworICAgIHN1cHBvcnRlZFN1cmZhY2VDb3VudGVycyA9IGluX3N0cnVjdC0+c3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1pbkltYWdlQ291bnQgPSBzcmMtPm1pbkltYWdlQ291bnQ7CisgICAgbWF4SW1hZ2VDb3VudCA9IHNyYy0+bWF4SW1hZ2VDb3VudDsKKyAgICBjdXJyZW50RXh0ZW50ID0gc3JjLT5jdXJyZW50RXh0ZW50OworICAgIG1pbkltYWdlRXh0ZW50ID0gc3JjLT5taW5JbWFnZUV4dGVudDsKKyAgICBtYXhJbWFnZUV4dGVudCA9IHNyYy0+bWF4SW1hZ2VFeHRlbnQ7CisgICAgbWF4SW1hZ2VBcnJheUxheWVycyA9IHNyYy0+bWF4SW1hZ2VBcnJheUxheWVyczsKKyAgICBzdXBwb3J0ZWRUcmFuc2Zvcm1zID0gc3JjLT5zdXBwb3J0ZWRUcmFuc2Zvcm1zOworICAgIGN1cnJlbnRUcmFuc2Zvcm0gPSBzcmMtPmN1cnJlbnRUcmFuc2Zvcm07CisgICAgc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEgPSBzcmMtPnN1cHBvcnRlZENvbXBvc2l0ZUFscGhhOworICAgIHN1cHBvcnRlZFVzYWdlRmxhZ3MgPSBzcmMtPnN1cHBvcnRlZFVzYWdlRmxhZ3M7CisgICAgc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzID0gc3JjLT5zdXBwb3J0ZWRTdXJmYWNlQ291bnRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVDo6c2FmZV9Wa0Rpc3BsYXlQb3dlckluZm9FWFQoY29uc3QgVmtEaXNwbGF5UG93ZXJJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBwb3dlclN0YXRlKGluX3N0cnVjdC0+cG93ZXJTdGF0ZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUOjpzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0Rpc3BsYXlQb3dlckluZm9FWFQ6OnNhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUKGNvbnN0IHNhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcG93ZXJTdGF0ZSA9IHNyYy5wb3dlclN0YXRlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVCYgc2FmZV9Wa0Rpc3BsYXlQb3dlckluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcG93ZXJTdGF0ZSA9IHNyYy5wb3dlclN0YXRlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVDo6fnNhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlQb3dlckluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcG93ZXJTdGF0ZSA9IGluX3N0cnVjdC0+cG93ZXJTdGF0ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rpc3BsYXlQb3dlckluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQb3dlckluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcG93ZXJTdGF0ZSA9IHNyYy0+cG93ZXJTdGF0ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXZpY2VFdmVudEluZm9FWFQ6OnNhZmVfVmtEZXZpY2VFdmVudEluZm9FWFQoY29uc3QgVmtEZXZpY2VFdmVudEluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRldmljZUV2ZW50KGluX3N0cnVjdC0+ZGV2aWNlRXZlbnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUOjpzYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUOjpzYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZXZpY2VFdmVudEluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZXZpY2VFdmVudCA9IHNyYy5kZXZpY2VFdmVudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZUV2ZW50SW5mb0VYVCYgc2FmZV9Wa0RldmljZUV2ZW50SW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VFdmVudEluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRldmljZUV2ZW50ID0gc3JjLmRldmljZUV2ZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUOjp+c2FmZV9Wa0RldmljZUV2ZW50SW5mb0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZUV2ZW50SW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkZXZpY2VFdmVudCA9IGluX3N0cnVjdC0+ZGV2aWNlRXZlbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXZpY2VFdmVudEluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUV2ZW50SW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBkZXZpY2VFdmVudCA9IHNyYy0+ZGV2aWNlRXZlbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVDo6c2FmZV9Wa0Rpc3BsYXlFdmVudEluZm9FWFQoY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkaXNwbGF5RXZlbnQoaW5fc3RydWN0LT5kaXNwbGF5RXZlbnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVDo6c2FmZV9Wa0Rpc3BsYXlFdmVudEluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUOjpzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVChjb25zdCBzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRpc3BsYXlFdmVudCA9IHNyYy5kaXNwbGF5RXZlbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUJiBzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkaXNwbGF5RXZlbnQgPSBzcmMuZGlzcGxheUV2ZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVDo6fnNhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlFdmVudEluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGlzcGxheUV2ZW50ID0gaW5fc3RydWN0LT5kaXNwbGF5RXZlbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRpc3BsYXlFdmVudCA9IHNyYy0+ZGlzcGxheUV2ZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQoY29uc3QgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3VyZmFjZUNvdW50ZXJzKGluX3N0cnVjdC0+c3VyZmFjZUNvdW50ZXJzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN1cmZhY2VDb3VudGVycyA9IHNyYy5zdXJmYWNlQ291bnRlcnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCYgc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdXJmYWNlQ291bnRlcnMgPSBzcmMuc3VyZmFjZUNvdW50ZXJzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQ6On5zYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHN1cmZhY2VDb3VudGVycyA9IGluX3N0cnVjdC0+c3VyZmFjZUNvdW50ZXJzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHN1cmZhY2VDb3VudGVycyA9IHNyYy0+c3VyZmFjZUNvdW50ZXJzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEU6OnNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFKGNvbnN0IFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3dhcGNoYWluQ291bnQoaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudCksCisgICAgcFRpbWVzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBUaW1lcykgeworICAgICAgICBwVGltZXMgPSBuZXcgVmtQcmVzZW50VGltZUdPT0dMRVtpbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBUaW1lcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBUaW1lcywgc2l6ZW9mKFZrUHJlc2VudFRpbWVHT09HTEUpKmluX3N0cnVjdC0+c3dhcGNoYWluQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEU6OnNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBUaW1lcyhudWxscHRyKQore30KKworc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEU6OnNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFKGNvbnN0IHNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3dhcGNoYWluQ291bnQgPSBzcmMuc3dhcGNoYWluQ291bnQ7CisgICAgcFRpbWVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBUaW1lcykgeworICAgICAgICBwVGltZXMgPSBuZXcgVmtQcmVzZW50VGltZUdPT0dMRVtzcmMuc3dhcGNoYWluQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFRpbWVzLCAodm9pZCAqKXNyYy5wVGltZXMsIHNpemVvZihWa1ByZXNlbnRUaW1lR09PR0xFKSpzcmMuc3dhcGNoYWluQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUmIHNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFRpbWVzKQorICAgICAgICBkZWxldGVbXSBwVGltZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzd2FwY2hhaW5Db3VudCA9IHNyYy5zd2FwY2hhaW5Db3VudDsKKyAgICBwVGltZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFRpbWVzKSB7CisgICAgICAgIHBUaW1lcyA9IG5ldyBWa1ByZXNlbnRUaW1lR09PR0xFW3NyYy5zd2FwY2hhaW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVGltZXMsICh2b2lkICopc3JjLnBUaW1lcywgc2l6ZW9mKFZrUHJlc2VudFRpbWVHT09HTEUpKnNyYy5zd2FwY2hhaW5Db3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRTo6fnNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFKCkKK3sKKyAgICBpZiAocFRpbWVzKQorICAgICAgICBkZWxldGVbXSBwVGltZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEU6OmluaXRpYWxpemUoY29uc3QgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHN3YXBjaGFpbkNvdW50ID0gaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudDsKKyAgICBwVGltZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wVGltZXMpIHsKKyAgICAgICAgcFRpbWVzID0gbmV3IFZrUHJlc2VudFRpbWVHT09HTEVbaW5fc3RydWN0LT5zd2FwY2hhaW5Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVGltZXMsICh2b2lkICopaW5fc3RydWN0LT5wVGltZXMsIHNpemVvZihWa1ByZXNlbnRUaW1lR09PR0xFKSppbl9zdHJ1Y3QtPnN3YXBjaGFpbkNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEU6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3dhcGNoYWluQ291bnQgPSBzcmMtPnN3YXBjaGFpbkNvdW50OworICAgIHBUaW1lcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBUaW1lcykgeworICAgICAgICBwVGltZXMgPSBuZXcgVmtQcmVzZW50VGltZUdPT0dMRVtzcmMtPnN3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBUaW1lcywgKHZvaWQgKilzcmMtPnBUaW1lcywgc2l6ZW9mKFZrUHJlc2VudFRpbWVHT09HTEUpKnNyYy0+c3dhcGNoYWluQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgoY29uc3QgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50cyhpbl9zdHJ1Y3QtPnBlclZpZXdQb3NpdGlvbkFsbENvbXBvbmVudHMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlg6OnNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50cyA9IHNyYy5wZXJWaWV3UG9zaXRpb25BbGxDb21wb25lbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgmIHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50cyA9IHNyYy5wZXJWaWV3UG9zaXRpb25BbGxDb21wb25lbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlg6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHBlclZpZXdQb3NpdGlvbkFsbENvbXBvbmVudHMgPSBpbl9zdHJ1Y3QtPnBlclZpZXdQb3NpdGlvbkFsbENvbXBvbmVudHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50cyA9IHNyYy0+cGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHZpZXdwb3J0Q291bnQoaW5fc3RydWN0LT52aWV3cG9ydENvdW50KSwKKyAgICBwVmlld3BvcnRTd2l6emxlcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wVmlld3BvcnRTd2l6emxlcykgeworICAgICAgICBwVmlld3BvcnRTd2l6emxlcyA9IG5ldyBWa1ZpZXdwb3J0U3dpenpsZU5WW2luX3N0cnVjdC0+dmlld3BvcnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRTd2l6emxlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWaWV3cG9ydFN3aXp6bGVzLCBzaXplb2YoVmtWaWV3cG9ydFN3aXp6bGVOVikqaW5fc3RydWN0LT52aWV3cG9ydENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwVmlld3BvcnRTd2l6emxlcyhudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlY6OnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgdmlld3BvcnRDb3VudCA9IHNyYy52aWV3cG9ydENvdW50OworICAgIHBWaWV3cG9ydFN3aXp6bGVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBWaWV3cG9ydFN3aXp6bGVzKSB7CisgICAgICAgIHBWaWV3cG9ydFN3aXp6bGVzID0gbmV3IFZrVmlld3BvcnRTd2l6emxlTlZbc3JjLnZpZXdwb3J0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdwb3J0U3dpenpsZXMsICh2b2lkICopc3JjLnBWaWV3cG9ydFN3aXp6bGVzLCBzaXplb2YoVmtWaWV3cG9ydFN3aXp6bGVOVikqc3JjLnZpZXdwb3J0Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYmIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFZpZXdwb3J0U3dpenpsZXMpCisgICAgICAgIGRlbGV0ZVtdIHBWaWV3cG9ydFN3aXp6bGVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgdmlld3BvcnRDb3VudCA9IHNyYy52aWV3cG9ydENvdW50OworICAgIHBWaWV3cG9ydFN3aXp6bGVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBWaWV3cG9ydFN3aXp6bGVzKSB7CisgICAgICAgIHBWaWV3cG9ydFN3aXp6bGVzID0gbmV3IFZrVmlld3BvcnRTd2l6emxlTlZbc3JjLnZpZXdwb3J0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdwb3J0U3dpenpsZXMsICh2b2lkICopc3JjLnBWaWV3cG9ydFN3aXp6bGVzLCBzaXplb2YoVmtWaWV3cG9ydFN3aXp6bGVOVikqc3JjLnZpZXdwb3J0Q291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlY6On5zYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVigpCit7CisgICAgaWYgKHBWaWV3cG9ydFN3aXp6bGVzKQorICAgICAgICBkZWxldGVbXSBwVmlld3BvcnRTd2l6emxlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHZpZXdwb3J0Q291bnQgPSBpbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQ7CisgICAgcFZpZXdwb3J0U3dpenpsZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wVmlld3BvcnRTd2l6emxlcykgeworICAgICAgICBwVmlld3BvcnRTd2l6emxlcyA9IG5ldyBWa1ZpZXdwb3J0U3dpenpsZU5WW2luX3N0cnVjdC0+dmlld3BvcnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRTd2l6emxlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWaWV3cG9ydFN3aXp6bGVzLCBzaXplb2YoVmtWaWV3cG9ydFN3aXp6bGVOVikqaW5fc3RydWN0LT52aWV3cG9ydENvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHZpZXdwb3J0Q291bnQgPSBzcmMtPnZpZXdwb3J0Q291bnQ7CisgICAgcFZpZXdwb3J0U3dpenpsZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wVmlld3BvcnRTd2l6emxlcykgeworICAgICAgICBwVmlld3BvcnRTd2l6emxlcyA9IG5ldyBWa1ZpZXdwb3J0U3dpenpsZU5WW3NyYy0+dmlld3BvcnRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmlld3BvcnRTd2l6emxlcywgKHZvaWQgKilzcmMtPnBWaWV3cG9ydFN3aXp6bGVzLCBzaXplb2YoVmtWaWV3cG9ydFN3aXp6bGVOVikqc3JjLT52aWV3cG9ydENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1heERpc2NhcmRSZWN0YW5nbGVzKGluX3N0cnVjdC0+bWF4RGlzY2FyZFJlY3RhbmdsZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heERpc2NhcmRSZWN0YW5nbGVzID0gc3JjLm1heERpc2NhcmRSZWN0YW5nbGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4RGlzY2FyZFJlY3RhbmdsZXMgPSBzcmMubWF4RGlzY2FyZFJlY3RhbmdsZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtYXhEaXNjYXJkUmVjdGFuZ2xlcyA9IGluX3N0cnVjdC0+bWF4RGlzY2FyZFJlY3RhbmdsZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1heERpc2NhcmRSZWN0YW5nbGVzID0gc3JjLT5tYXhEaXNjYXJkUmVjdGFuZ2xlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQoY29uc3QgVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGRpc2NhcmRSZWN0YW5nbGVNb2RlKGluX3N0cnVjdC0+ZGlzY2FyZFJlY3RhbmdsZU1vZGUpLAorICAgIGRpc2NhcmRSZWN0YW5nbGVDb3VudChpbl9zdHJ1Y3QtPmRpc2NhcmRSZWN0YW5nbGVDb3VudCksCisgICAgcERpc2NhcmRSZWN0YW5nbGVzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEaXNjYXJkUmVjdGFuZ2xlcykgeworICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXMgPSBuZXcgVmtSZWN0MkRbaW5fc3RydWN0LT5kaXNjYXJkUmVjdGFuZ2xlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERpc2NhcmRSZWN0YW5nbGVzLCAodm9pZCAqKWluX3N0cnVjdC0+cERpc2NhcmRSZWN0YW5nbGVzLCBzaXplb2YoVmtSZWN0MkQpKmluX3N0cnVjdC0+ZGlzY2FyZFJlY3RhbmdsZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcERpc2NhcmRSZWN0YW5nbGVzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBkaXNjYXJkUmVjdGFuZ2xlTW9kZSA9IHNyYy5kaXNjYXJkUmVjdGFuZ2xlTW9kZTsKKyAgICBkaXNjYXJkUmVjdGFuZ2xlQ291bnQgPSBzcmMuZGlzY2FyZFJlY3RhbmdsZUNvdW50OworICAgIHBEaXNjYXJkUmVjdGFuZ2xlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wRGlzY2FyZFJlY3RhbmdsZXMpIHsKKyAgICAgICAgcERpc2NhcmRSZWN0YW5nbGVzID0gbmV3IFZrUmVjdDJEW3NyYy5kaXNjYXJkUmVjdGFuZ2xlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERpc2NhcmRSZWN0YW5nbGVzLCAodm9pZCAqKXNyYy5wRGlzY2FyZFJlY3RhbmdsZXMsIHNpemVvZihWa1JlY3QyRCkqc3JjLmRpc2NhcmRSZWN0YW5nbGVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRGlzY2FyZFJlY3RhbmdsZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEaXNjYXJkUmVjdGFuZ2xlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGRpc2NhcmRSZWN0YW5nbGVNb2RlID0gc3JjLmRpc2NhcmRSZWN0YW5nbGVNb2RlOworICAgIGRpc2NhcmRSZWN0YW5nbGVDb3VudCA9IHNyYy5kaXNjYXJkUmVjdGFuZ2xlQ291bnQ7CisgICAgcERpc2NhcmRSZWN0YW5nbGVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBEaXNjYXJkUmVjdGFuZ2xlcykgeworICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXMgPSBuZXcgVmtSZWN0MkRbc3JjLmRpc2NhcmRSZWN0YW5nbGVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGlzY2FyZFJlY3RhbmdsZXMsICh2b2lkICopc3JjLnBEaXNjYXJkUmVjdGFuZ2xlcywgc2l6ZW9mKFZrUmVjdDJEKSpzcmMuZGlzY2FyZFJlY3RhbmdsZUNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ6On5zYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocERpc2NhcmRSZWN0YW5nbGVzKQorICAgICAgICBkZWxldGVbXSBwRGlzY2FyZFJlY3RhbmdsZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgZGlzY2FyZFJlY3RhbmdsZU1vZGUgPSBpbl9zdHJ1Y3QtPmRpc2NhcmRSZWN0YW5nbGVNb2RlOworICAgIGRpc2NhcmRSZWN0YW5nbGVDb3VudCA9IGluX3N0cnVjdC0+ZGlzY2FyZFJlY3RhbmdsZUNvdW50OworICAgIHBEaXNjYXJkUmVjdGFuZ2xlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEaXNjYXJkUmVjdGFuZ2xlcykgeworICAgICAgICBwRGlzY2FyZFJlY3RhbmdsZXMgPSBuZXcgVmtSZWN0MkRbaW5fc3RydWN0LT5kaXNjYXJkUmVjdGFuZ2xlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERpc2NhcmRSZWN0YW5nbGVzLCAodm9pZCAqKWluX3N0cnVjdC0+cERpc2NhcmRSZWN0YW5nbGVzLCBzaXplb2YoVmtSZWN0MkQpKmluX3N0cnVjdC0+ZGlzY2FyZFJlY3RhbmdsZUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBkaXNjYXJkUmVjdGFuZ2xlTW9kZSA9IHNyYy0+ZGlzY2FyZFJlY3RhbmdsZU1vZGU7CisgICAgZGlzY2FyZFJlY3RhbmdsZUNvdW50ID0gc3JjLT5kaXNjYXJkUmVjdGFuZ2xlQ291bnQ7CisgICAgcERpc2NhcmRSZWN0YW5nbGVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cERpc2NhcmRSZWN0YW5nbGVzKSB7CisgICAgICAgIHBEaXNjYXJkUmVjdGFuZ2xlcyA9IG5ldyBWa1JlY3QyRFtzcmMtPmRpc2NhcmRSZWN0YW5nbGVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGlzY2FyZFJlY3RhbmdsZXMsICh2b2lkICopc3JjLT5wRGlzY2FyZFJlY3RhbmdsZXMsIHNpemVvZihWa1JlY3QyRCkqc3JjLT5kaXNjYXJkUmVjdGFuZ2xlQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplKGluX3N0cnVjdC0+cHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplKSwKKyAgICBtYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZShpbl9zdHJ1Y3QtPm1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplKSwKKyAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5KGluX3N0cnVjdC0+ZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemVHcmFudWxhcml0eSksCisgICAgcHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uKGluX3N0cnVjdC0+cHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uKSwKKyAgICBjb25zZXJ2YXRpdmVQb2ludEFuZExpbmVSYXN0ZXJpemF0aW9uKGluX3N0cnVjdC0+Y29uc2VydmF0aXZlUG9pbnRBbmRMaW5lUmFzdGVyaXphdGlvbiksCisgICAgZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQoaW5fc3RydWN0LT5kZWdlbmVyYXRlVHJpYW5nbGVzUmFzdGVyaXplZCksCisgICAgZGVnZW5lcmF0ZUxpbmVzUmFzdGVyaXplZChpbl9zdHJ1Y3QtPmRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQpLAorICAgIGZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZShpbl9zdHJ1Y3QtPmZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZSksCisgICAgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlKGluX3N0cnVjdC0+Y29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemUgPSBzcmMucHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplOworICAgIG1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplID0gc3JjLm1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplOworICAgIGV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplR3JhbnVsYXJpdHkgPSBzcmMuZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemVHcmFudWxhcml0eTsKKyAgICBwcmltaXRpdmVVbmRlcmVzdGltYXRpb24gPSBzcmMucHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uOworICAgIGNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb24gPSBzcmMuY29uc2VydmF0aXZlUG9pbnRBbmRMaW5lUmFzdGVyaXphdGlvbjsKKyAgICBkZWdlbmVyYXRlVHJpYW5nbGVzUmFzdGVyaXplZCA9IHNyYy5kZWdlbmVyYXRlVHJpYW5nbGVzUmFzdGVyaXplZDsKKyAgICBkZWdlbmVyYXRlTGluZXNSYXN0ZXJpemVkID0gc3JjLmRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQ7CisgICAgZnVsbHlDb3ZlcmVkRnJhZ21lbnRTaGFkZXJJbnB1dFZhcmlhYmxlID0gc3JjLmZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZTsKKyAgICBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUG9zdERlcHRoQ292ZXJhZ2UgPSBzcmMuY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplID0gc3JjLnByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKKyAgICBtYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSA9IHNyYy5tYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKKyAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5ID0gc3JjLmV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplR3JhbnVsYXJpdHk7CisgICAgcHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uID0gc3JjLnByaW1pdGl2ZVVuZGVyZXN0aW1hdGlvbjsKKyAgICBjb25zZXJ2YXRpdmVQb2ludEFuZExpbmVSYXN0ZXJpemF0aW9uID0gc3JjLmNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb247CisgICAgZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQgPSBzcmMuZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQ7CisgICAgZGVnZW5lcmF0ZUxpbmVzUmFzdGVyaXplZCA9IHNyYy5kZWdlbmVyYXRlTGluZXNSYXN0ZXJpemVkOworICAgIGZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZSA9IHNyYy5mdWxseUNvdmVyZWRGcmFnbWVudFNoYWRlcklucHV0VmFyaWFibGU7CisgICAgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlID0gc3JjLmNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qb3N0RGVwdGhDb3ZlcmFnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSA9IGluX3N0cnVjdC0+cHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplOworICAgIG1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplID0gaW5fc3RydWN0LT5tYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKKyAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5ID0gaW5fc3RydWN0LT5leHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5OworICAgIHByaW1pdGl2ZVVuZGVyZXN0aW1hdGlvbiA9IGluX3N0cnVjdC0+cHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uOworICAgIGNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb24gPSBpbl9zdHJ1Y3QtPmNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb247CisgICAgZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQgPSBpbl9zdHJ1Y3QtPmRlZ2VuZXJhdGVUcmlhbmdsZXNSYXN0ZXJpemVkOworICAgIGRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQgPSBpbl9zdHJ1Y3QtPmRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQ7CisgICAgZnVsbHlDb3ZlcmVkRnJhZ21lbnRTaGFkZXJJbnB1dFZhcmlhYmxlID0gaW5fc3RydWN0LT5mdWxseUNvdmVyZWRGcmFnbWVudFNoYWRlcklucHV0VmFyaWFibGU7CisgICAgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlID0gaW5fc3RydWN0LT5jb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUG9zdERlcHRoQ292ZXJhZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSA9IHNyYy0+cHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplOworICAgIG1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplID0gc3JjLT5tYXhFeHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKKyAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5ID0gc3JjLT5leHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZUdyYW51bGFyaXR5OworICAgIHByaW1pdGl2ZVVuZGVyZXN0aW1hdGlvbiA9IHNyYy0+cHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uOworICAgIGNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb24gPSBzcmMtPmNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb247CisgICAgZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQgPSBzcmMtPmRlZ2VuZXJhdGVUcmlhbmdsZXNSYXN0ZXJpemVkOworICAgIGRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQgPSBzcmMtPmRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQ7CisgICAgZnVsbHlDb3ZlcmVkRnJhZ21lbnRTaGFkZXJJbnB1dFZhcmlhYmxlID0gc3JjLT5mdWxseUNvdmVyZWRGcmFnbWVudFNoYWRlcklucHV0VmFyaWFibGU7CisgICAgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlID0gc3JjLT5jb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUG9zdERlcHRoQ292ZXJhZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZShpbl9zdHJ1Y3QtPmNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlKSwKKyAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZShpbl9zdHJ1Y3QtPmV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGUgPSBzcmMuY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGU7CisgICAgZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemUgPSBzcmMuZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQmIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZSA9IHNyYy5jb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZTsKKyAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSA9IHNyYy5leHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlID0gaW5fc3RydWN0LT5jb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZTsKKyAgICBleHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZSA9IGluX3N0cnVjdC0+ZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGUgPSBzcmMtPmNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlOworICAgIGV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplID0gc3JjLT5leHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRlcHRoQ2xpcEVuYWJsZShpbl9zdHJ1Y3QtPmRlcHRoQ2xpcEVuYWJsZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGVwdGhDbGlwRW5hYmxlID0gc3JjLmRlcHRoQ2xpcEVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRlcHRoQ2xpcEVuYWJsZSA9IHNyYy5kZXB0aENsaXBFbmFibGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkZXB0aENsaXBFbmFibGUgPSBpbl9zdHJ1Y3QtPmRlcHRoQ2xpcEVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGVwdGhDbGlwRW5hYmxlID0gc3JjLT5kZXB0aENsaXBFbmFibGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBkZXB0aENsaXBFbmFibGUoaW5fc3RydWN0LT5kZXB0aENsaXBFbmFibGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBkZXB0aENsaXBFbmFibGUgPSBzcmMuZGVwdGhDbGlwRW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgZGVwdGhDbGlwRW5hYmxlID0gc3JjLmRlcHRoQ2xpcEVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGRlcHRoQ2xpcEVuYWJsZSA9IGluX3N0cnVjdC0+ZGVwdGhDbGlwRW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGRlcHRoQ2xpcEVuYWJsZSA9IHNyYy0+ZGVwdGhDbGlwRW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0hkck1ldGFkYXRhRVhUOjpzYWZlX1ZrSGRyTWV0YWRhdGFFWFQoY29uc3QgVmtIZHJNZXRhZGF0YUVYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGlzcGxheVByaW1hcnlSZWQoaW5fc3RydWN0LT5kaXNwbGF5UHJpbWFyeVJlZCksCisgICAgZGlzcGxheVByaW1hcnlHcmVlbihpbl9zdHJ1Y3QtPmRpc3BsYXlQcmltYXJ5R3JlZW4pLAorICAgIGRpc3BsYXlQcmltYXJ5Qmx1ZShpbl9zdHJ1Y3QtPmRpc3BsYXlQcmltYXJ5Qmx1ZSksCisgICAgd2hpdGVQb2ludChpbl9zdHJ1Y3QtPndoaXRlUG9pbnQpLAorICAgIG1heEx1bWluYW5jZShpbl9zdHJ1Y3QtPm1heEx1bWluYW5jZSksCisgICAgbWluTHVtaW5hbmNlKGluX3N0cnVjdC0+bWluTHVtaW5hbmNlKSwKKyAgICBtYXhDb250ZW50TGlnaHRMZXZlbChpbl9zdHJ1Y3QtPm1heENvbnRlbnRMaWdodExldmVsKSwKKyAgICBtYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsKGluX3N0cnVjdC0+bWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtIZHJNZXRhZGF0YUVYVDo6c2FmZV9Wa0hkck1ldGFkYXRhRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrSGRyTWV0YWRhdGFFWFQ6OnNhZmVfVmtIZHJNZXRhZGF0YUVYVChjb25zdCBzYWZlX1ZrSGRyTWV0YWRhdGFFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkaXNwbGF5UHJpbWFyeVJlZCA9IHNyYy5kaXNwbGF5UHJpbWFyeVJlZDsKKyAgICBkaXNwbGF5UHJpbWFyeUdyZWVuID0gc3JjLmRpc3BsYXlQcmltYXJ5R3JlZW47CisgICAgZGlzcGxheVByaW1hcnlCbHVlID0gc3JjLmRpc3BsYXlQcmltYXJ5Qmx1ZTsKKyAgICB3aGl0ZVBvaW50ID0gc3JjLndoaXRlUG9pbnQ7CisgICAgbWF4THVtaW5hbmNlID0gc3JjLm1heEx1bWluYW5jZTsKKyAgICBtaW5MdW1pbmFuY2UgPSBzcmMubWluTHVtaW5hbmNlOworICAgIG1heENvbnRlbnRMaWdodExldmVsID0gc3JjLm1heENvbnRlbnRMaWdodExldmVsOworICAgIG1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBzcmMubWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0hkck1ldGFkYXRhRVhUJiBzYWZlX1ZrSGRyTWV0YWRhdGFFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSGRyTWV0YWRhdGFFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRpc3BsYXlQcmltYXJ5UmVkID0gc3JjLmRpc3BsYXlQcmltYXJ5UmVkOworICAgIGRpc3BsYXlQcmltYXJ5R3JlZW4gPSBzcmMuZGlzcGxheVByaW1hcnlHcmVlbjsKKyAgICBkaXNwbGF5UHJpbWFyeUJsdWUgPSBzcmMuZGlzcGxheVByaW1hcnlCbHVlOworICAgIHdoaXRlUG9pbnQgPSBzcmMud2hpdGVQb2ludDsKKyAgICBtYXhMdW1pbmFuY2UgPSBzcmMubWF4THVtaW5hbmNlOworICAgIG1pbkx1bWluYW5jZSA9IHNyYy5taW5MdW1pbmFuY2U7CisgICAgbWF4Q29udGVudExpZ2h0TGV2ZWwgPSBzcmMubWF4Q29udGVudExpZ2h0TGV2ZWw7CisgICAgbWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IHNyYy5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrSGRyTWV0YWRhdGFFWFQ6On5zYWZlX1ZrSGRyTWV0YWRhdGFFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtIZHJNZXRhZGF0YUVYVDo6aW5pdGlhbGl6ZShjb25zdCBWa0hkck1ldGFkYXRhRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRpc3BsYXlQcmltYXJ5UmVkID0gaW5fc3RydWN0LT5kaXNwbGF5UHJpbWFyeVJlZDsKKyAgICBkaXNwbGF5UHJpbWFyeUdyZWVuID0gaW5fc3RydWN0LT5kaXNwbGF5UHJpbWFyeUdyZWVuOworICAgIGRpc3BsYXlQcmltYXJ5Qmx1ZSA9IGluX3N0cnVjdC0+ZGlzcGxheVByaW1hcnlCbHVlOworICAgIHdoaXRlUG9pbnQgPSBpbl9zdHJ1Y3QtPndoaXRlUG9pbnQ7CisgICAgbWF4THVtaW5hbmNlID0gaW5fc3RydWN0LT5tYXhMdW1pbmFuY2U7CisgICAgbWluTHVtaW5hbmNlID0gaW5fc3RydWN0LT5taW5MdW1pbmFuY2U7CisgICAgbWF4Q29udGVudExpZ2h0TGV2ZWwgPSBpbl9zdHJ1Y3QtPm1heENvbnRlbnRMaWdodExldmVsOworICAgIG1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBpbl9zdHJ1Y3QtPm1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWw7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtIZHJNZXRhZGF0YUVYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSGRyTWV0YWRhdGFFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGlzcGxheVByaW1hcnlSZWQgPSBzcmMtPmRpc3BsYXlQcmltYXJ5UmVkOworICAgIGRpc3BsYXlQcmltYXJ5R3JlZW4gPSBzcmMtPmRpc3BsYXlQcmltYXJ5R3JlZW47CisgICAgZGlzcGxheVByaW1hcnlCbHVlID0gc3JjLT5kaXNwbGF5UHJpbWFyeUJsdWU7CisgICAgd2hpdGVQb2ludCA9IHNyYy0+d2hpdGVQb2ludDsKKyAgICBtYXhMdW1pbmFuY2UgPSBzcmMtPm1heEx1bWluYW5jZTsKKyAgICBtaW5MdW1pbmFuY2UgPSBzcmMtPm1pbkx1bWluYW5jZTsKKyAgICBtYXhDb250ZW50TGlnaHRMZXZlbCA9IHNyYy0+bWF4Q29udGVudExpZ2h0TGV2ZWw7CisgICAgbWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IHNyYy0+bWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworCitzYWZlX1ZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVks6OnNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyhjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBwVmlldyhpbl9zdHJ1Y3QtPnBWaWV3KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOjpzYWZlX1ZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFZpZXcobnVsbHB0cikKK3t9CisKK3NhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSzo6c2FmZV9Wa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKGNvbnN0IHNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBWaWV3ID0gc3JjLnBWaWV3OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksmIHNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSzo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcFZpZXcgPSBzcmMucFZpZXc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSzo6fnNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSygpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOjppbml0aWFsaXplKGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHBWaWV3ID0gaW5fc3RydWN0LT5wVmlldzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcFZpZXcgPSBzcmMtPnBWaWV3OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworCisKK3NhZmVfVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOjpzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyhjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIHBWaWV3KGluX3N0cnVjdC0+cFZpZXcpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSzo6c2FmZV9Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFZpZXcobnVsbHB0cikKK3t9CisKK3NhZmVfVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOjpzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyhjb25zdCBzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBWaWV3ID0gc3JjLnBWaWV3OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyYgc2FmZV9Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVks6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcFZpZXcgPSBzcmMucFZpZXc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOjp+c2FmZV9Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLOjppbml0aWFsaXplKGNvbnN0IFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgcFZpZXcgPSBpbl9zdHJ1Y3QtPnBWaWV3OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSzo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcFZpZXcgPSBzcmMtPnBWaWV3OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKKworc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVDo6c2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVChjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgb2JqZWN0VHlwZShpbl9zdHJ1Y3QtPm9iamVjdFR5cGUpLAorICAgIG9iamVjdEhhbmRsZShpbl9zdHJ1Y3QtPm9iamVjdEhhbmRsZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgcE9iamVjdE5hbWUgPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnBPYmplY3ROYW1lKTsKK30KKworc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVDo6c2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwT2JqZWN0TmFtZShudWxscHRyKQore30KKworc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVDo6c2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVChjb25zdCBzYWZlX1ZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb2JqZWN0VHlwZSA9IHNyYy5vYmplY3RUeXBlOworICAgIG9iamVjdEhhbmRsZSA9IHNyYy5vYmplY3RIYW5kbGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgcE9iamVjdE5hbWUgPSBTYWZlU3RyaW5nQ29weShzcmMucE9iamVjdE5hbWUpOworfQorCitzYWZlX1ZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUJiBzYWZlX1ZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwT2JqZWN0TmFtZSkgZGVsZXRlIFtdIHBPYmplY3ROYW1lOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb2JqZWN0VHlwZSA9IHNyYy5vYmplY3RUeXBlOworICAgIG9iamVjdEhhbmRsZSA9IHNyYy5vYmplY3RIYW5kbGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgcE9iamVjdE5hbWUgPSBTYWZlU3RyaW5nQ29weShzcmMucE9iamVjdE5hbWUpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUOjp+c2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCgpCit7CisgICAgaWYgKHBPYmplY3ROYW1lKSBkZWxldGUgW10gcE9iamVjdE5hbWU7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBvYmplY3RUeXBlID0gaW5fc3RydWN0LT5vYmplY3RUeXBlOworICAgIG9iamVjdEhhbmRsZSA9IGluX3N0cnVjdC0+b2JqZWN0SGFuZGxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBwT2JqZWN0TmFtZSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cE9iamVjdE5hbWUpOworfQorCit2b2lkIHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBvYmplY3RUeXBlID0gc3JjLT5vYmplY3RUeXBlOworICAgIG9iamVjdEhhbmRsZSA9IHNyYy0+b2JqZWN0SGFuZGxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBwT2JqZWN0TmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy0+cE9iamVjdE5hbWUpOworfQorCitzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQ6OnNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVChjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBvYmplY3RUeXBlKGluX3N0cnVjdC0+b2JqZWN0VHlwZSksCisgICAgb2JqZWN0SGFuZGxlKGluX3N0cnVjdC0+b2JqZWN0SGFuZGxlKSwKKyAgICB0YWdOYW1lKGluX3N0cnVjdC0+dGFnTmFtZSksCisgICAgdGFnU2l6ZShpbl9zdHJ1Y3QtPnRhZ1NpemUpLAorICAgIHBUYWcoaW5fc3RydWN0LT5wVGFnKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUOjpzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFRhZyhudWxscHRyKQore30KKworc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUOjpzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQoY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb2JqZWN0VHlwZSA9IHNyYy5vYmplY3RUeXBlOworICAgIG9iamVjdEhhbmRsZSA9IHNyYy5vYmplY3RIYW5kbGU7CisgICAgdGFnTmFtZSA9IHNyYy50YWdOYW1lOworICAgIHRhZ1NpemUgPSBzcmMudGFnU2l6ZTsKKyAgICBwVGFnID0gc3JjLnBUYWc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCYgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBvYmplY3RUeXBlID0gc3JjLm9iamVjdFR5cGU7CisgICAgb2JqZWN0SGFuZGxlID0gc3JjLm9iamVjdEhhbmRsZTsKKyAgICB0YWdOYW1lID0gc3JjLnRhZ05hbWU7CisgICAgdGFnU2l6ZSA9IHNyYy50YWdTaXplOworICAgIHBUYWcgPSBzcmMucFRhZzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUOjp+c2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBvYmplY3RUeXBlID0gaW5fc3RydWN0LT5vYmplY3RUeXBlOworICAgIG9iamVjdEhhbmRsZSA9IGluX3N0cnVjdC0+b2JqZWN0SGFuZGxlOworICAgIHRhZ05hbWUgPSBpbl9zdHJ1Y3QtPnRhZ05hbWU7CisgICAgdGFnU2l6ZSA9IGluX3N0cnVjdC0+dGFnU2l6ZTsKKyAgICBwVGFnID0gaW5fc3RydWN0LT5wVGFnOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG9iamVjdFR5cGUgPSBzcmMtPm9iamVjdFR5cGU7CisgICAgb2JqZWN0SGFuZGxlID0gc3JjLT5vYmplY3RIYW5kbGU7CisgICAgdGFnTmFtZSA9IHNyYy0+dGFnTmFtZTsKKyAgICB0YWdTaXplID0gc3JjLT50YWdTaXplOworICAgIHBUYWcgPSBzcmMtPnBUYWc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUOjpzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUKGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBwTGFiZWxOYW1lID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wTGFiZWxOYW1lKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGNvbG9yW2ldID0gaW5fc3RydWN0LT5jb2xvcltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQ6OnNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcExhYmVsTmFtZShudWxscHRyKQore30KKworc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVDo6c2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVChjb25zdCBzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgcExhYmVsTmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wTGFiZWxOYW1lKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGNvbG9yW2ldID0gc3JjLmNvbG9yW2ldOworICAgIH0KK30KKworc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVCYgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocExhYmVsTmFtZSkgZGVsZXRlIFtdIHBMYWJlbE5hbWU7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBwTGFiZWxOYW1lID0gU2FmZVN0cmluZ0NvcHkoc3JjLnBMYWJlbE5hbWUpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgY29sb3JbaV0gPSBzcmMuY29sb3JbaV07CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUOjp+c2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVCgpCit7CisgICAgaWYgKHBMYWJlbE5hbWUpIGRlbGV0ZSBbXSBwTGFiZWxOYW1lOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIHBMYWJlbE5hbWUgPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnBMYWJlbE5hbWUpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgY29sb3JbaV0gPSBpbl9zdHJ1Y3QtPmNvbG9yW2ldOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIHBMYWJlbE5hbWUgPSBTYWZlU3RyaW5nQ29weShzcmMtPnBMYWJlbE5hbWUpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgY29sb3JbaV0gPSBzcmMtPmNvbG9yW2ldOworICAgIH0KK30KKworc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQ6OnNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgbWVzc2FnZUlkTnVtYmVyKGluX3N0cnVjdC0+bWVzc2FnZUlkTnVtYmVyKSwKKyAgICBxdWV1ZUxhYmVsQ291bnQoaW5fc3RydWN0LT5xdWV1ZUxhYmVsQ291bnQpLAorICAgIHBRdWV1ZUxhYmVscyhudWxscHRyKSwKKyAgICBjbWRCdWZMYWJlbENvdW50KGluX3N0cnVjdC0+Y21kQnVmTGFiZWxDb3VudCksCisgICAgcENtZEJ1ZkxhYmVscyhudWxscHRyKSwKKyAgICBvYmplY3RDb3VudChpbl9zdHJ1Y3QtPm9iamVjdENvdW50KSwKKyAgICBwT2JqZWN0cyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBwTWVzc2FnZUlkTmFtZSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cE1lc3NhZ2VJZE5hbWUpOworICAgIHBNZXNzYWdlID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wTWVzc2FnZSk7CisgICAgaWYgKHF1ZXVlTGFiZWxDb3VudCAmJiBpbl9zdHJ1Y3QtPnBRdWV1ZUxhYmVscykgeworICAgICAgICBwUXVldWVMYWJlbHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVFtxdWV1ZUxhYmVsQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVMYWJlbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBRdWV1ZUxhYmVsc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBRdWV1ZUxhYmVsc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNtZEJ1ZkxhYmVsQ291bnQgJiYgaW5fc3RydWN0LT5wQ21kQnVmTGFiZWxzKSB7CisgICAgICAgIHBDbWRCdWZMYWJlbHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVFtjbWRCdWZMYWJlbENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNtZEJ1ZkxhYmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcENtZEJ1ZkxhYmVsc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBDbWRCdWZMYWJlbHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvYmplY3RDb3VudCAmJiBpbl9zdHJ1Y3QtPnBPYmplY3RzKSB7CisgICAgICAgIHBPYmplY3RzID0gbmV3IHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFRbb2JqZWN0Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgb2JqZWN0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcE9iamVjdHNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wT2JqZWN0c1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUOjpzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwTWVzc2FnZUlkTmFtZShudWxscHRyKSwKKyAgICBwTWVzc2FnZShudWxscHRyKSwKKyAgICBwUXVldWVMYWJlbHMobnVsbHB0ciksCisgICAgcENtZEJ1ZkxhYmVscyhudWxscHRyKSwKKyAgICBwT2JqZWN0cyhudWxscHRyKQore30KKworc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQ6OnNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgbWVzc2FnZUlkTnVtYmVyID0gc3JjLm1lc3NhZ2VJZE51bWJlcjsKKyAgICBxdWV1ZUxhYmVsQ291bnQgPSBzcmMucXVldWVMYWJlbENvdW50OworICAgIHBRdWV1ZUxhYmVscyA9IG51bGxwdHI7CisgICAgY21kQnVmTGFiZWxDb3VudCA9IHNyYy5jbWRCdWZMYWJlbENvdW50OworICAgIHBDbWRCdWZMYWJlbHMgPSBudWxscHRyOworICAgIG9iamVjdENvdW50ID0gc3JjLm9iamVjdENvdW50OworICAgIHBPYmplY3RzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBwTWVzc2FnZUlkTmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wTWVzc2FnZUlkTmFtZSk7CisgICAgcE1lc3NhZ2UgPSBTYWZlU3RyaW5nQ29weShzcmMucE1lc3NhZ2UpOworICAgIGlmIChxdWV1ZUxhYmVsQ291bnQgJiYgc3JjLnBRdWV1ZUxhYmVscykgeworICAgICAgICBwUXVldWVMYWJlbHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVFtxdWV1ZUxhYmVsQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVMYWJlbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBRdWV1ZUxhYmVsc1tpXS5pbml0aWFsaXplKCZzcmMucFF1ZXVlTGFiZWxzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY21kQnVmTGFiZWxDb3VudCAmJiBzcmMucENtZEJ1ZkxhYmVscykgeworICAgICAgICBwQ21kQnVmTGFiZWxzID0gbmV3IHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFRbY21kQnVmTGFiZWxDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjbWRCdWZMYWJlbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBDbWRCdWZMYWJlbHNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBDbWRCdWZMYWJlbHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvYmplY3RDb3VudCAmJiBzcmMucE9iamVjdHMpIHsKKyAgICAgICAgcE9iamVjdHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVFtvYmplY3RDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBvYmplY3RDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwT2JqZWN0c1tpXS5pbml0aWFsaXplKCZzcmMucE9iamVjdHNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCYgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTWVzc2FnZUlkTmFtZSkgZGVsZXRlIFtdIHBNZXNzYWdlSWROYW1lOworICAgIGlmIChwTWVzc2FnZSkgZGVsZXRlIFtdIHBNZXNzYWdlOworICAgIGlmIChwUXVldWVMYWJlbHMpCisgICAgICAgIGRlbGV0ZVtdIHBRdWV1ZUxhYmVsczsKKyAgICBpZiAocENtZEJ1ZkxhYmVscykKKyAgICAgICAgZGVsZXRlW10gcENtZEJ1ZkxhYmVsczsKKyAgICBpZiAocE9iamVjdHMpCisgICAgICAgIGRlbGV0ZVtdIHBPYmplY3RzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgbWVzc2FnZUlkTnVtYmVyID0gc3JjLm1lc3NhZ2VJZE51bWJlcjsKKyAgICBxdWV1ZUxhYmVsQ291bnQgPSBzcmMucXVldWVMYWJlbENvdW50OworICAgIHBRdWV1ZUxhYmVscyA9IG51bGxwdHI7CisgICAgY21kQnVmTGFiZWxDb3VudCA9IHNyYy5jbWRCdWZMYWJlbENvdW50OworICAgIHBDbWRCdWZMYWJlbHMgPSBudWxscHRyOworICAgIG9iamVjdENvdW50ID0gc3JjLm9iamVjdENvdW50OworICAgIHBPYmplY3RzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBwTWVzc2FnZUlkTmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy5wTWVzc2FnZUlkTmFtZSk7CisgICAgcE1lc3NhZ2UgPSBTYWZlU3RyaW5nQ29weShzcmMucE1lc3NhZ2UpOworICAgIGlmIChxdWV1ZUxhYmVsQ291bnQgJiYgc3JjLnBRdWV1ZUxhYmVscykgeworICAgICAgICBwUXVldWVMYWJlbHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVFtxdWV1ZUxhYmVsQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVMYWJlbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBRdWV1ZUxhYmVsc1tpXS5pbml0aWFsaXplKCZzcmMucFF1ZXVlTGFiZWxzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY21kQnVmTGFiZWxDb3VudCAmJiBzcmMucENtZEJ1ZkxhYmVscykgeworICAgICAgICBwQ21kQnVmTGFiZWxzID0gbmV3IHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFRbY21kQnVmTGFiZWxDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjbWRCdWZMYWJlbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBDbWRCdWZMYWJlbHNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBDbWRCdWZMYWJlbHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvYmplY3RDb3VudCAmJiBzcmMucE9iamVjdHMpIHsKKyAgICAgICAgcE9iamVjdHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVFtvYmplY3RDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBvYmplY3RDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwT2JqZWN0c1tpXS5pbml0aWFsaXplKCZzcmMucE9iamVjdHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVDo6fnNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKCkKK3sKKyAgICBpZiAocE1lc3NhZ2VJZE5hbWUpIGRlbGV0ZSBbXSBwTWVzc2FnZUlkTmFtZTsKKyAgICBpZiAocE1lc3NhZ2UpIGRlbGV0ZSBbXSBwTWVzc2FnZTsKKyAgICBpZiAocFF1ZXVlTGFiZWxzKQorICAgICAgICBkZWxldGVbXSBwUXVldWVMYWJlbHM7CisgICAgaWYgKHBDbWRCdWZMYWJlbHMpCisgICAgICAgIGRlbGV0ZVtdIHBDbWRCdWZMYWJlbHM7CisgICAgaWYgKHBPYmplY3RzKQorICAgICAgICBkZWxldGVbXSBwT2JqZWN0czsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVDo6aW5pdGlhbGl6ZShjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIG1lc3NhZ2VJZE51bWJlciA9IGluX3N0cnVjdC0+bWVzc2FnZUlkTnVtYmVyOworICAgIHF1ZXVlTGFiZWxDb3VudCA9IGluX3N0cnVjdC0+cXVldWVMYWJlbENvdW50OworICAgIHBRdWV1ZUxhYmVscyA9IG51bGxwdHI7CisgICAgY21kQnVmTGFiZWxDb3VudCA9IGluX3N0cnVjdC0+Y21kQnVmTGFiZWxDb3VudDsKKyAgICBwQ21kQnVmTGFiZWxzID0gbnVsbHB0cjsKKyAgICBvYmplY3RDb3VudCA9IGluX3N0cnVjdC0+b2JqZWN0Q291bnQ7CisgICAgcE9iamVjdHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBwTWVzc2FnZUlkTmFtZSA9IFNhZmVTdHJpbmdDb3B5KGluX3N0cnVjdC0+cE1lc3NhZ2VJZE5hbWUpOworICAgIHBNZXNzYWdlID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT5wTWVzc2FnZSk7CisgICAgaWYgKHF1ZXVlTGFiZWxDb3VudCAmJiBpbl9zdHJ1Y3QtPnBRdWV1ZUxhYmVscykgeworICAgICAgICBwUXVldWVMYWJlbHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVFtxdWV1ZUxhYmVsQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVMYWJlbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBRdWV1ZUxhYmVsc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBRdWV1ZUxhYmVsc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNtZEJ1ZkxhYmVsQ291bnQgJiYgaW5fc3RydWN0LT5wQ21kQnVmTGFiZWxzKSB7CisgICAgICAgIHBDbWRCdWZMYWJlbHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVFtjbWRCdWZMYWJlbENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNtZEJ1ZkxhYmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcENtZEJ1ZkxhYmVsc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBDbWRCdWZMYWJlbHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvYmplY3RDb3VudCAmJiBpbl9zdHJ1Y3QtPnBPYmplY3RzKSB7CisgICAgICAgIHBPYmplY3RzID0gbmV3IHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFRbb2JqZWN0Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgb2JqZWN0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcE9iamVjdHNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wT2JqZWN0c1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIG1lc3NhZ2VJZE51bWJlciA9IHNyYy0+bWVzc2FnZUlkTnVtYmVyOworICAgIHF1ZXVlTGFiZWxDb3VudCA9IHNyYy0+cXVldWVMYWJlbENvdW50OworICAgIHBRdWV1ZUxhYmVscyA9IG51bGxwdHI7CisgICAgY21kQnVmTGFiZWxDb3VudCA9IHNyYy0+Y21kQnVmTGFiZWxDb3VudDsKKyAgICBwQ21kQnVmTGFiZWxzID0gbnVsbHB0cjsKKyAgICBvYmplY3RDb3VudCA9IHNyYy0+b2JqZWN0Q291bnQ7CisgICAgcE9iamVjdHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBwTWVzc2FnZUlkTmFtZSA9IFNhZmVTdHJpbmdDb3B5KHNyYy0+cE1lc3NhZ2VJZE5hbWUpOworICAgIHBNZXNzYWdlID0gU2FmZVN0cmluZ0NvcHkoc3JjLT5wTWVzc2FnZSk7CisgICAgaWYgKHF1ZXVlTGFiZWxDb3VudCAmJiBzcmMtPnBRdWV1ZUxhYmVscykgeworICAgICAgICBwUXVldWVMYWJlbHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVFtxdWV1ZUxhYmVsQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVMYWJlbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBRdWV1ZUxhYmVsc1tpXS5pbml0aWFsaXplKCZzcmMtPnBRdWV1ZUxhYmVsc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNtZEJ1ZkxhYmVsQ291bnQgJiYgc3JjLT5wQ21kQnVmTGFiZWxzKSB7CisgICAgICAgIHBDbWRCdWZMYWJlbHMgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVFtjbWRCdWZMYWJlbENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNtZEJ1ZkxhYmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcENtZEJ1ZkxhYmVsc1tpXS5pbml0aWFsaXplKCZzcmMtPnBDbWRCdWZMYWJlbHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvYmplY3RDb3VudCAmJiBzcmMtPnBPYmplY3RzKSB7CisgICAgICAgIHBPYmplY3RzID0gbmV3IHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFRbb2JqZWN0Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgb2JqZWN0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcE9iamVjdHNbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wT2JqZWN0c1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIG1lc3NhZ2VTZXZlcml0eShpbl9zdHJ1Y3QtPm1lc3NhZ2VTZXZlcml0eSksCisgICAgbWVzc2FnZVR5cGUoaW5fc3RydWN0LT5tZXNzYWdlVHlwZSksCisgICAgcGZuVXNlckNhbGxiYWNrKGluX3N0cnVjdC0+cGZuVXNlckNhbGxiYWNrKSwKKyAgICBwVXNlckRhdGEoaW5fc3RydWN0LT5wVXNlckRhdGEpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwVXNlckRhdGEobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIG1lc3NhZ2VTZXZlcml0eSA9IHNyYy5tZXNzYWdlU2V2ZXJpdHk7CisgICAgbWVzc2FnZVR5cGUgPSBzcmMubWVzc2FnZVR5cGU7CisgICAgcGZuVXNlckNhbGxiYWNrID0gc3JjLnBmblVzZXJDYWxsYmFjazsKKyAgICBwVXNlckRhdGEgPSBzcmMucFVzZXJEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQmIHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgbWVzc2FnZVNldmVyaXR5ID0gc3JjLm1lc3NhZ2VTZXZlcml0eTsKKyAgICBtZXNzYWdlVHlwZSA9IHNyYy5tZXNzYWdlVHlwZTsKKyAgICBwZm5Vc2VyQ2FsbGJhY2sgPSBzcmMucGZuVXNlckNhbGxiYWNrOworICAgIHBVc2VyRGF0YSA9IHNyYy5wVXNlckRhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIG1lc3NhZ2VTZXZlcml0eSA9IGluX3N0cnVjdC0+bWVzc2FnZVNldmVyaXR5OworICAgIG1lc3NhZ2VUeXBlID0gaW5fc3RydWN0LT5tZXNzYWdlVHlwZTsKKyAgICBwZm5Vc2VyQ2FsbGJhY2sgPSBpbl9zdHJ1Y3QtPnBmblVzZXJDYWxsYmFjazsKKyAgICBwVXNlckRhdGEgPSBpbl9zdHJ1Y3QtPnBVc2VyRGF0YTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgbWVzc2FnZVNldmVyaXR5ID0gc3JjLT5tZXNzYWdlU2V2ZXJpdHk7CisgICAgbWVzc2FnZVR5cGUgPSBzcmMtPm1lc3NhZ2VUeXBlOworICAgIHBmblVzZXJDYWxsYmFjayA9IHNyYy0+cGZuVXNlckNhbGxiYWNrOworICAgIHBVc2VyRGF0YSA9IHNyYy0+cFVzZXJEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworCitzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEOjpzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEKGNvbnN0IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBhbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZShpbl9zdHJ1Y3QtPmFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRDo6c2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRDo6c2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRChjb25zdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2UgPSBzcmMuYW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQmIHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZSA9IHNyYy5hbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRDo6fnNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQ6OmluaXRpYWxpemUoY29uc3QgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2UgPSBpbl9zdHJ1Y3QtPmFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgYW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2UgPSBzcmMtPmFuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisKK3NhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRDo6c2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKGNvbnN0IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGFsbG9jYXRpb25TaXplKGluX3N0cnVjdC0+YWxsb2NhdGlvblNpemUpLAorICAgIG1lbW9yeVR5cGVCaXRzKGluX3N0cnVjdC0+bWVtb3J5VHlwZUJpdHMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ6OnNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEOjpzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoY29uc3Qgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYWxsb2NhdGlvblNpemUgPSBzcmMuYWxsb2NhdGlvblNpemU7CisgICAgbWVtb3J5VHlwZUJpdHMgPSBzcmMubWVtb3J5VHlwZUJpdHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCYgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhbGxvY2F0aW9uU2l6ZSA9IHNyYy5hbGxvY2F0aW9uU2l6ZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IHNyYy5tZW1vcnlUeXBlQml0czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEOjp+c2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ6OmluaXRpYWxpemUoY29uc3QgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBhbGxvY2F0aW9uU2l6ZSA9IGluX3N0cnVjdC0+YWxsb2NhdGlvblNpemU7CisgICAgbWVtb3J5VHlwZUJpdHMgPSBpbl9zdHJ1Y3QtPm1lbW9yeVR5cGVCaXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGFsbG9jYXRpb25TaXplID0gc3JjLT5hbGxvY2F0aW9uU2l6ZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IHNyYy0+bWVtb3J5VHlwZUJpdHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKworc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEOjpzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQoY29uc3QgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZm9ybWF0KGluX3N0cnVjdC0+Zm9ybWF0KSwKKyAgICBleHRlcm5hbEZvcm1hdChpbl9zdHJ1Y3QtPmV4dGVybmFsRm9ybWF0KSwKKyAgICBmb3JtYXRGZWF0dXJlcyhpbl9zdHJ1Y3QtPmZvcm1hdEZlYXR1cmVzKSwKKyAgICBzYW1wbGVyWWNiY3JDb252ZXJzaW9uQ29tcG9uZW50cyhpbl9zdHJ1Y3QtPnNhbXBsZXJZY2JjckNvbnZlcnNpb25Db21wb25lbnRzKSwKKyAgICBzdWdnZXN0ZWRZY2Jjck1vZGVsKGluX3N0cnVjdC0+c3VnZ2VzdGVkWWNiY3JNb2RlbCksCisgICAgc3VnZ2VzdGVkWWNiY3JSYW5nZShpbl9zdHJ1Y3QtPnN1Z2dlc3RlZFljYmNyUmFuZ2UpLAorICAgIHN1Z2dlc3RlZFhDaHJvbWFPZmZzZXQoaW5fc3RydWN0LT5zdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0KSwKKyAgICBzdWdnZXN0ZWRZQ2hyb21hT2Zmc2V0KGluX3N0cnVjdC0+c3VnZ2VzdGVkWUNocm9tYU9mZnNldCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRDo6c2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQ6OnNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRChjb25zdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmb3JtYXQgPSBzcmMuZm9ybWF0OworICAgIGV4dGVybmFsRm9ybWF0ID0gc3JjLmV4dGVybmFsRm9ybWF0OworICAgIGZvcm1hdEZlYXR1cmVzID0gc3JjLmZvcm1hdEZlYXR1cmVzOworICAgIHNhbXBsZXJZY2JjckNvbnZlcnNpb25Db21wb25lbnRzID0gc3JjLnNhbXBsZXJZY2JjckNvbnZlcnNpb25Db21wb25lbnRzOworICAgIHN1Z2dlc3RlZFljYmNyTW9kZWwgPSBzcmMuc3VnZ2VzdGVkWWNiY3JNb2RlbDsKKyAgICBzdWdnZXN0ZWRZY2JjclJhbmdlID0gc3JjLnN1Z2dlc3RlZFljYmNyUmFuZ2U7CisgICAgc3VnZ2VzdGVkWENocm9tYU9mZnNldCA9IHNyYy5zdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0OworICAgIHN1Z2dlc3RlZFlDaHJvbWFPZmZzZXQgPSBzcmMuc3VnZ2VzdGVkWUNocm9tYU9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEJiBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZvcm1hdCA9IHNyYy5mb3JtYXQ7CisgICAgZXh0ZXJuYWxGb3JtYXQgPSBzcmMuZXh0ZXJuYWxGb3JtYXQ7CisgICAgZm9ybWF0RmVhdHVyZXMgPSBzcmMuZm9ybWF0RmVhdHVyZXM7CisgICAgc2FtcGxlclljYmNyQ29udmVyc2lvbkNvbXBvbmVudHMgPSBzcmMuc2FtcGxlclljYmNyQ29udmVyc2lvbkNvbXBvbmVudHM7CisgICAgc3VnZ2VzdGVkWWNiY3JNb2RlbCA9IHNyYy5zdWdnZXN0ZWRZY2Jjck1vZGVsOworICAgIHN1Z2dlc3RlZFljYmNyUmFuZ2UgPSBzcmMuc3VnZ2VzdGVkWWNiY3JSYW5nZTsKKyAgICBzdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0ID0gc3JjLnN1Z2dlc3RlZFhDaHJvbWFPZmZzZXQ7CisgICAgc3VnZ2VzdGVkWUNocm9tYU9mZnNldCA9IHNyYy5zdWdnZXN0ZWRZQ2hyb21hT2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQ6On5zYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRDo6aW5pdGlhbGl6ZShjb25zdCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZvcm1hdCA9IGluX3N0cnVjdC0+Zm9ybWF0OworICAgIGV4dGVybmFsRm9ybWF0ID0gaW5fc3RydWN0LT5leHRlcm5hbEZvcm1hdDsKKyAgICBmb3JtYXRGZWF0dXJlcyA9IGluX3N0cnVjdC0+Zm9ybWF0RmVhdHVyZXM7CisgICAgc2FtcGxlclljYmNyQ29udmVyc2lvbkNvbXBvbmVudHMgPSBpbl9zdHJ1Y3QtPnNhbXBsZXJZY2JjckNvbnZlcnNpb25Db21wb25lbnRzOworICAgIHN1Z2dlc3RlZFljYmNyTW9kZWwgPSBpbl9zdHJ1Y3QtPnN1Z2dlc3RlZFljYmNyTW9kZWw7CisgICAgc3VnZ2VzdGVkWWNiY3JSYW5nZSA9IGluX3N0cnVjdC0+c3VnZ2VzdGVkWWNiY3JSYW5nZTsKKyAgICBzdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0ID0gaW5fc3RydWN0LT5zdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0OworICAgIHN1Z2dlc3RlZFlDaHJvbWFPZmZzZXQgPSBpbl9zdHJ1Y3QtPnN1Z2dlc3RlZFlDaHJvbWFPZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZm9ybWF0ID0gc3JjLT5mb3JtYXQ7CisgICAgZXh0ZXJuYWxGb3JtYXQgPSBzcmMtPmV4dGVybmFsRm9ybWF0OworICAgIGZvcm1hdEZlYXR1cmVzID0gc3JjLT5mb3JtYXRGZWF0dXJlczsKKyAgICBzYW1wbGVyWWNiY3JDb252ZXJzaW9uQ29tcG9uZW50cyA9IHNyYy0+c2FtcGxlclljYmNyQ29udmVyc2lvbkNvbXBvbmVudHM7CisgICAgc3VnZ2VzdGVkWWNiY3JNb2RlbCA9IHNyYy0+c3VnZ2VzdGVkWWNiY3JNb2RlbDsKKyAgICBzdWdnZXN0ZWRZY2JjclJhbmdlID0gc3JjLT5zdWdnZXN0ZWRZY2JjclJhbmdlOworICAgIHN1Z2dlc3RlZFhDaHJvbWFPZmZzZXQgPSBzcmMtPnN1Z2dlc3RlZFhDaHJvbWFPZmZzZXQ7CisgICAgc3VnZ2VzdGVkWUNocm9tYU9mZnNldCA9IHNyYy0+c3VnZ2VzdGVkWUNocm9tYU9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworCitzYWZlX1ZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ6OnNhZmVfVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRChjb25zdCBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBidWZmZXIobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgYnVmZmVyID0gaW5fc3RydWN0LT5idWZmZXI7Cit9CisKK3NhZmVfVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRDo6c2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIGJ1ZmZlcihudWxscHRyKQore30KKworc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEOjpzYWZlX1ZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoY29uc3Qgc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgYnVmZmVyID0gc3JjLmJ1ZmZlcjsKK30KKworc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEJiBzYWZlX1ZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGJ1ZmZlciA9IHNyYy5idWZmZXI7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRDo6fnNhZmVfVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEOjppbml0aWFsaXplKGNvbnN0IFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGJ1ZmZlciA9IGluX3N0cnVjdC0+YnVmZmVyOworfQorCit2b2lkIHNhZmVfVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGJ1ZmZlciA9IHNyYy0+YnVmZmVyOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKworc2FmZV9Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEOjpzYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWVtb3J5KGluX3N0cnVjdC0+bWVtb3J5KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEOjpzYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRDo6c2FmZV9Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKGNvbnN0IHNhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1lbW9yeSA9IHNyYy5tZW1vcnk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCYgc2FmZV9Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnkgPSBzcmMubWVtb3J5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ6On5zYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRDo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1lbW9yeSA9IGluX3N0cnVjdC0+bWVtb3J5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1lbW9yeSA9IHNyYy0+bWVtb3J5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisKK3NhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQ6OnNhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQoY29uc3QgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGV4dGVybmFsRm9ybWF0KGluX3N0cnVjdC0+ZXh0ZXJuYWxGb3JtYXQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEOjpzYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEOjpzYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEKGNvbnN0IHNhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBleHRlcm5hbEZvcm1hdCA9IHNyYy5leHRlcm5hbEZvcm1hdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRCYgc2FmZV9Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGV4dGVybmFsRm9ybWF0ID0gc3JjLmV4dGVybmFsRm9ybWF0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEOjp+c2FmZV9Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRDo6aW5pdGlhbGl6ZShjb25zdCBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBleHRlcm5hbEZvcm1hdCA9IGluX3N0cnVjdC0+ZXh0ZXJuYWxGb3JtYXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBleHRlcm5hbEZvcm1hdCA9IHNyYy0+ZXh0ZXJuYWxGb3JtYXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisKK3NhZmVfVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQoY29uc3QgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHJlZHVjdGlvbk1vZGUoaW5fc3RydWN0LT5yZWR1Y3Rpb25Nb2RlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVkdWN0aW9uTW9kZSA9IHNyYy5yZWR1Y3Rpb25Nb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVkdWN0aW9uTW9kZSA9IHNyYy5yZWR1Y3Rpb25Nb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUOjp+c2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICByZWR1Y3Rpb25Nb2RlID0gaW5fc3RydWN0LT5yZWR1Y3Rpb25Nb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcmVkdWN0aW9uTW9kZSA9IHNyYy0+cmVkdWN0aW9uTW9kZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZpbHRlck1pbm1heFNpbmdsZUNvbXBvbmVudEZvcm1hdHMoaW5fc3RydWN0LT5maWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzKSwKKyAgICBmaWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmcoaW5fc3RydWN0LT5maWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmcpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZpbHRlck1pbm1heFNpbmdsZUNvbXBvbmVudEZvcm1hdHMgPSBzcmMuZmlsdGVyTWlubWF4U2luZ2xlQ29tcG9uZW50Rm9ybWF0czsKKyAgICBmaWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmcgPSBzcmMuZmlsdGVyTWlubWF4SW1hZ2VDb21wb25lbnRNYXBwaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmlsdGVyTWlubWF4U2luZ2xlQ29tcG9uZW50Rm9ybWF0cyA9IHNyYy5maWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzOworICAgIGZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZyA9IHNyYy5maWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmaWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzID0gaW5fc3RydWN0LT5maWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzOworICAgIGZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZyA9IGluX3N0cnVjdC0+ZmlsdGVyTWlubWF4SW1hZ2VDb21wb25lbnRNYXBwaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmaWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzID0gc3JjLT5maWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzOworICAgIGZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZyA9IHNyYy0+ZmlsdGVyTWlubWF4SW1hZ2VDb21wb25lbnRNYXBwaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgaW5saW5lVW5pZm9ybUJsb2NrKGluX3N0cnVjdC0+aW5saW5lVW5pZm9ybUJsb2NrKSwKKyAgICBkZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZChpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbmxpbmVVbmlmb3JtQmxvY2sgPSBzcmMuaW5saW5lVW5pZm9ybUJsb2NrOworICAgIGRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kID0gc3JjLmRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW5saW5lVW5pZm9ybUJsb2NrID0gc3JjLmlubGluZVVuaWZvcm1CbG9jazsKKyAgICBkZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZCA9IHNyYy5kZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGlubGluZVVuaWZvcm1CbG9jayA9IGluX3N0cnVjdC0+aW5saW5lVW5pZm9ybUJsb2NrOworICAgIGRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW5saW5lVW5pZm9ybUJsb2NrID0gc3JjLT5pbmxpbmVVbmlmb3JtQmxvY2s7CisgICAgZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQgPSBzcmMtPmRlc2NyaXB0b3JCaW5kaW5nSW5saW5lVW5pZm9ybUJsb2NrVXBkYXRlQWZ0ZXJCaW5kOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWF4SW5saW5lVW5pZm9ybUJsb2NrU2l6ZShpbl9zdHJ1Y3QtPm1heElubGluZVVuaWZvcm1CbG9ja1NpemUpLAorICAgIG1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3MoaW5fc3RydWN0LT5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbmxpbmVVbmlmb3JtQmxvY2tzKSwKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzKGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcyksCisgICAgbWF4RGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja3MoaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrcyksCisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MoaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heElubGluZVVuaWZvcm1CbG9ja1NpemUgPSBzcmMubWF4SW5saW5lVW5pZm9ybUJsb2NrU2l6ZTsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JJbmxpbmVVbmlmb3JtQmxvY2tzID0gc3JjLm1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3M7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcyA9IHNyYy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzOworICAgIG1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzID0gc3JjLm1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzID0gc3JjLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4SW5saW5lVW5pZm9ybUJsb2NrU2l6ZSA9IHNyYy5tYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3MgPSBzcmMubWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzID0gc3JjLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3M7CisgICAgbWF4RGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja3MgPSBzcmMubWF4RGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja3M7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MgPSBzcmMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1heElubGluZVVuaWZvcm1CbG9ja1NpemUgPSBpbl9zdHJ1Y3QtPm1heElubGluZVVuaWZvcm1CbG9ja1NpemU7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrcyA9IGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5saW5lVW5pZm9ybUJsb2NrczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzID0gaW5fc3RydWN0LT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzOworICAgIG1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzID0gaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcyA9IGluX3N0cnVjdC0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplID0gc3JjLT5tYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3MgPSBzcmMtPm1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3M7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrcyA9IHNyYy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrcyA9IHNyYy0+bWF4RGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja3M7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MgPSBzcmMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVDo6c2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVChjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGF0YVNpemUoaW5fc3RydWN0LT5kYXRhU2l6ZSksCisgICAgcERhdGEoaW5fc3RydWN0LT5wRGF0YSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ6OnNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcERhdGEobnVsbHB0cikKK3t9CisKK3NhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ6OnNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQoY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRhdGFTaXplID0gc3JjLmRhdGFTaXplOworICAgIHBEYXRhID0gc3JjLnBEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUJiBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGF0YVNpemUgPSBzcmMuZGF0YVNpemU7CisgICAgcERhdGEgPSBzcmMucERhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ6On5zYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUOjppbml0aWFsaXplKGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRhdGFTaXplID0gaW5fc3RydWN0LT5kYXRhU2l6ZTsKKyAgICBwRGF0YSA9IGluX3N0cnVjdC0+cERhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBkYXRhU2l6ZSA9IHNyYy0+ZGF0YVNpemU7CisgICAgcERhdGEgPSBzcmMtPnBEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVChjb25zdCBWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWF4SW5saW5lVW5pZm9ybUJsb2NrQmluZGluZ3MoaW5fc3RydWN0LT5tYXhJbmxpbmVVbmlmb3JtQmxvY2tCaW5kaW5ncykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQ6OnNhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQ6OnNhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heElubGluZVVuaWZvcm1CbG9ja0JpbmRpbmdzID0gc3JjLm1heElubGluZVVuaWZvcm1CbG9ja0JpbmRpbmdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4SW5saW5lVW5pZm9ybUJsb2NrQmluZGluZ3MgPSBzcmMubWF4SW5saW5lVW5pZm9ybUJsb2NrQmluZGluZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQ6On5zYWZlX1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1heElubGluZVVuaWZvcm1CbG9ja0JpbmRpbmdzID0gaW5fc3RydWN0LT5tYXhJbmxpbmVVbmlmb3JtQmxvY2tCaW5kaW5nczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1heElubGluZVVuaWZvcm1CbG9ja0JpbmRpbmdzID0gc3JjLT5tYXhJbmxpbmVVbmlmb3JtQmxvY2tCaW5kaW5nczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUOjpzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVChjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNhbXBsZUxvY2F0aW9uc1BlclBpeGVsKGluX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwpLAorICAgIHNhbXBsZUxvY2F0aW9uR3JpZFNpemUoaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbkdyaWRTaXplKSwKKyAgICBzYW1wbGVMb2NhdGlvbnNDb3VudChpbl9zdHJ1Y3QtPnNhbXBsZUxvY2F0aW9uc0NvdW50KSwKKyAgICBwU2FtcGxlTG9jYXRpb25zKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcFNhbXBsZUxvY2F0aW9ucyA9IG5ldyBWa1NhbXBsZUxvY2F0aW9uRVhUW2luX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNhbXBsZUxvY2F0aW9ucywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBTYW1wbGVMb2NhdGlvbnMsIHNpemVvZihWa1NhbXBsZUxvY2F0aW9uRVhUKSppbl9zdHJ1Y3QtPnNhbXBsZUxvY2F0aW9uc0NvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUOjpzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwU2FtcGxlTG9jYXRpb25zKG51bGxwdHIpCit7fQorCitzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVDo6c2FmZV9Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQoY29uc3Qgc2FmZV9Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbCA9IHNyYy5zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbDsKKyAgICBzYW1wbGVMb2NhdGlvbkdyaWRTaXplID0gc3JjLnNhbXBsZUxvY2F0aW9uR3JpZFNpemU7CisgICAgc2FtcGxlTG9jYXRpb25zQ291bnQgPSBzcmMuc2FtcGxlTG9jYXRpb25zQ291bnQ7CisgICAgcFNhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wU2FtcGxlTG9jYXRpb25zKSB7CisgICAgICAgIHBTYW1wbGVMb2NhdGlvbnMgPSBuZXcgVmtTYW1wbGVMb2NhdGlvbkVYVFtzcmMuc2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNhbXBsZUxvY2F0aW9ucywgKHZvaWQgKilzcmMucFNhbXBsZUxvY2F0aW9ucywgc2l6ZW9mKFZrU2FtcGxlTG9jYXRpb25FWFQpKnNyYy5zYW1wbGVMb2NhdGlvbnNDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCYgc2FmZV9Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwU2FtcGxlTG9jYXRpb25zKQorICAgICAgICBkZWxldGVbXSBwU2FtcGxlTG9jYXRpb25zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwgPSBzcmMuc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWw7CisgICAgc2FtcGxlTG9jYXRpb25HcmlkU2l6ZSA9IHNyYy5zYW1wbGVMb2NhdGlvbkdyaWRTaXplOworICAgIHNhbXBsZUxvY2F0aW9uc0NvdW50ID0gc3JjLnNhbXBsZUxvY2F0aW9uc0NvdW50OworICAgIHBTYW1wbGVMb2NhdGlvbnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFNhbXBsZUxvY2F0aW9ucykgeworICAgICAgICBwU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrU2FtcGxlTG9jYXRpb25FWFRbc3JjLnNhbXBsZUxvY2F0aW9uc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTYW1wbGVMb2NhdGlvbnMsICh2b2lkICopc3JjLnBTYW1wbGVMb2NhdGlvbnMsIHNpemVvZihWa1NhbXBsZUxvY2F0aW9uRVhUKSpzcmMuc2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQ6On5zYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCgpCit7CisgICAgaWYgKHBTYW1wbGVMb2NhdGlvbnMpCisgICAgICAgIGRlbGV0ZVtdIHBTYW1wbGVMb2NhdGlvbnM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNhbXBsZUxvY2F0aW9uc1BlclBpeGVsID0gaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbDsKKyAgICBzYW1wbGVMb2NhdGlvbkdyaWRTaXplID0gaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbkdyaWRTaXplOworICAgIHNhbXBsZUxvY2F0aW9uc0NvdW50ID0gaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBwU2FtcGxlTG9jYXRpb25zID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFNhbXBsZUxvY2F0aW9ucykgeworICAgICAgICBwU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrU2FtcGxlTG9jYXRpb25FWFRbaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbnNDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cFNhbXBsZUxvY2F0aW9ucywgc2l6ZW9mKFZrU2FtcGxlTG9jYXRpb25FWFQpKmluX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbCA9IHNyYy0+c2FtcGxlTG9jYXRpb25zUGVyUGl4ZWw7CisgICAgc2FtcGxlTG9jYXRpb25HcmlkU2l6ZSA9IHNyYy0+c2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICBzYW1wbGVMb2NhdGlvbnNDb3VudCA9IHNyYy0+c2FtcGxlTG9jYXRpb25zQ291bnQ7CisgICAgcFNhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcFNhbXBsZUxvY2F0aW9ucyA9IG5ldyBWa1NhbXBsZUxvY2F0aW9uRVhUW3NyYy0+c2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNhbXBsZUxvY2F0aW9ucywgKHZvaWQgKilzcmMtPnBTYW1wbGVMb2NhdGlvbnMsIHNpemVvZihWa1NhbXBsZUxvY2F0aW9uRVhUKSpzcmMtPnNhbXBsZUxvY2F0aW9uc0NvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUOjpzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVChjb25zdCBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQoaW5fc3RydWN0LT5hdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50KSwKKyAgICBwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMobnVsbHB0ciksCisgICAgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudChpbl9zdHJ1Y3QtPnBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQpLAorICAgIHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVFtpbl9zdHJ1Y3QtPmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLCBzaXplb2YoVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUKSppbl9zdHJ1Y3QtPmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVFtpbl9zdHJ1Y3QtPnBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zLCBzaXplb2YoVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUKSppbl9zdHJ1Y3QtPnBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQ6OnNhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyhudWxscHRyKSwKKyAgICBwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUOjpzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVChjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQgPSBzcmMuYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMgPSBudWxscHRyOworICAgIHBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQgPSBzcmMucG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zKSB7CisgICAgICAgIHBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyA9IG5ldyBWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFRbc3JjLmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKXNyYy5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMsIHNpemVvZihWa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQpKnNyYy5hdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVFtzcmMucG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMsICh2b2lkICopc3JjLnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucywgc2l6ZW9mKFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCkqc3JjLnBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQmIHNhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zKQorICAgICAgICBkZWxldGVbXSBwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnM7CisgICAgaWYgKHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucykKKyAgICAgICAgZGVsZXRlW10gcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudCA9IHNyYy5hdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50OworICAgIHBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudCA9IHNyYy5wb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0NvdW50OworICAgIHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVFtzcmMuYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMsICh2b2lkICopc3JjLnBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucywgc2l6ZW9mKFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCkqc3JjLmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLnBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucykgeworICAgICAgICBwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMgPSBuZXcgVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUW3NyYy5wb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucywgKHZvaWQgKilzcmMucFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zLCBzaXplb2YoVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUKSpzcmMucG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVDo6fnNhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUKCkKK3sKKyAgICBpZiAocEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zKQorICAgICAgICBkZWxldGVbXSBwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnM7CisgICAgaWYgKHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucykKKyAgICAgICAgZGVsZXRlW10gcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50ID0gaW5fc3RydWN0LT5hdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50OworICAgIHBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudCA9IGluX3N0cnVjdC0+cG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVFtpbl9zdHJ1Y3QtPmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLCBzaXplb2YoVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUKSppbl9zdHJ1Y3QtPmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVFtpbl9zdHJ1Y3QtPnBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zLCBzaXplb2YoVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUKSppbl9zdHJ1Y3QtPnBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBhdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50ID0gc3JjLT5hdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9uc0NvdW50OworICAgIHBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudCA9IHNyYy0+cG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBwUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVFtzcmMtPmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKXNyYy0+cEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zLCBzaXplb2YoVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUKSpzcmMtPmF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KKyAgICBpZiAoc3JjLT5wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMpIHsKKyAgICAgICAgcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVFtzcmMtPnBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKXNyYy0+cFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zLCBzaXplb2YoVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhUKSpzcmMtPnBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQoY29uc3QgVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc2FtcGxlTG9jYXRpb25zRW5hYmxlKGluX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25zRW5hYmxlKSwKKyAgICBzYW1wbGVMb2NhdGlvbnNJbmZvKCZpbl9zdHJ1Y3QtPnNhbXBsZUxvY2F0aW9uc0luZm8pCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2FtcGxlTG9jYXRpb25zRW5hYmxlID0gc3JjLnNhbXBsZUxvY2F0aW9uc0VuYWJsZTsKKyAgICBzYW1wbGVMb2NhdGlvbnNJbmZvLmluaXRpYWxpemUoJnNyYy5zYW1wbGVMb2NhdGlvbnNJbmZvKTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNhbXBsZUxvY2F0aW9uc0VuYWJsZSA9IHNyYy5zYW1wbGVMb2NhdGlvbnNFbmFibGU7CisgICAgc2FtcGxlTG9jYXRpb25zSW5mby5pbml0aWFsaXplKCZzcmMuc2FtcGxlTG9jYXRpb25zSW5mbyk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2FtcGxlTG9jYXRpb25zRW5hYmxlID0gaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbnNFbmFibGU7CisgICAgc2FtcGxlTG9jYXRpb25zSW5mby5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnNhbXBsZUxvY2F0aW9uc0luZm8pOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNhbXBsZUxvY2F0aW9uc0VuYWJsZSA9IHNyYy0+c2FtcGxlTG9jYXRpb25zRW5hYmxlOworICAgIHNhbXBsZUxvY2F0aW9uc0luZm8uaW5pdGlhbGl6ZSgmc3JjLT5zYW1wbGVMb2NhdGlvbnNJbmZvKTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzKGluX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHMpLAorICAgIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUoaW5fc3RydWN0LT5tYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplKSwKKyAgICBzYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0cyhpbl9zdHJ1Y3QtPnNhbXBsZUxvY2F0aW9uU3ViUGl4ZWxCaXRzKSwKKyAgICB2YXJpYWJsZVNhbXBsZUxvY2F0aW9ucyhpbl9zdHJ1Y3QtPnZhcmlhYmxlU2FtcGxlTG9jYXRpb25zKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlW2ldID0gaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbkNvb3JkaW5hdGVSYW5nZVtpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzID0gc3JjLnNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzOworICAgIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUgPSBzcmMubWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICBzYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0cyA9IHNyYy5zYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0czsKKyAgICB2YXJpYWJsZVNhbXBsZUxvY2F0aW9ucyA9IHNyYy52YXJpYWJsZVNhbXBsZUxvY2F0aW9uczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlW2ldID0gc3JjLnNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzID0gc3JjLnNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzOworICAgIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUgPSBzcmMubWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICBzYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0cyA9IHNyYy5zYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0czsKKyAgICB2YXJpYWJsZVNhbXBsZUxvY2F0aW9ucyA9IHNyYy52YXJpYWJsZVNhbXBsZUxvY2F0aW9uczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlW2ldID0gc3JjLnNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlW2ldOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHMgPSBpbl9zdHJ1Y3QtPnNhbXBsZUxvY2F0aW9uU2FtcGxlQ291bnRzOworICAgIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUgPSBpbl9zdHJ1Y3QtPm1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemU7CisgICAgc2FtcGxlTG9jYXRpb25TdWJQaXhlbEJpdHMgPSBpbl9zdHJ1Y3QtPnNhbXBsZUxvY2F0aW9uU3ViUGl4ZWxCaXRzOworICAgIHZhcmlhYmxlU2FtcGxlTG9jYXRpb25zID0gaW5fc3RydWN0LT52YXJpYWJsZVNhbXBsZUxvY2F0aW9uczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBzYW1wbGVMb2NhdGlvbkNvb3JkaW5hdGVSYW5nZVtpXSA9IGluX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25Db29yZGluYXRlUmFuZ2VbaV07CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzYW1wbGVMb2NhdGlvblNhbXBsZUNvdW50cyA9IHNyYy0+c2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHM7CisgICAgbWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZSA9IHNyYy0+bWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICBzYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0cyA9IHNyYy0+c2FtcGxlTG9jYXRpb25TdWJQaXhlbEJpdHM7CisgICAgdmFyaWFibGVTYW1wbGVMb2NhdGlvbnMgPSBzcmMtPnZhcmlhYmxlU2FtcGxlTG9jYXRpb25zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlW2ldID0gc3JjLT5zYW1wbGVMb2NhdGlvbkNvb3JkaW5hdGVSYW5nZVtpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ6OnNhZmVfVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoY29uc3QgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUoaW5fc3RydWN0LT5tYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVDo6c2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVDo6c2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZSA9IHNyYy5tYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUJiBzYWZlX1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZSA9IHNyYy5tYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUOjp+c2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplID0gaW5fc3RydWN0LT5tYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZSA9IHNyYy0+bWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMoaW5fc3RydWN0LT5hZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMgPSBzcmMuYWR2YW5jZWRCbGVuZENvaGVyZW50T3BlcmF0aW9uczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMgPSBzcmMuYWR2YW5jZWRCbGVuZENvaGVyZW50T3BlcmF0aW9uczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBhZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zID0gaW5fc3RydWN0LT5hZHZhbmNlZEJsZW5kQ29oZXJlbnRPcGVyYXRpb25zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMgPSBzcmMtPmFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBhZHZhbmNlZEJsZW5kTWF4Q29sb3JBdHRhY2htZW50cyhpbl9zdHJ1Y3QtPmFkdmFuY2VkQmxlbmRNYXhDb2xvckF0dGFjaG1lbnRzKSwKKyAgICBhZHZhbmNlZEJsZW5kSW5kZXBlbmRlbnRCbGVuZChpbl9zdHJ1Y3QtPmFkdmFuY2VkQmxlbmRJbmRlcGVuZGVudEJsZW5kKSwKKyAgICBhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yKGluX3N0cnVjdC0+YWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWRTcmNDb2xvciksCisgICAgYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWREc3RDb2xvcihpbl9zdHJ1Y3QtPmFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3IpLAorICAgIGFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcChpbl9zdHJ1Y3QtPmFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcCksCisgICAgYWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnMoaW5fc3RydWN0LT5hZHZhbmNlZEJsZW5kQWxsT3BlcmF0aW9ucykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHMgPSBzcmMuYWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHM7CisgICAgYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQgPSBzcmMuYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQ7CisgICAgYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWRTcmNDb2xvciA9IHNyYy5hZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yOworICAgIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3IgPSBzcmMuYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWREc3RDb2xvcjsKKyAgICBhZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXAgPSBzcmMuYWR2YW5jZWRCbGVuZENvcnJlbGF0ZWRPdmVybGFwOworICAgIGFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zID0gc3JjLmFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHMgPSBzcmMuYWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHM7CisgICAgYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQgPSBzcmMuYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQ7CisgICAgYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWRTcmNDb2xvciA9IHNyYy5hZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yOworICAgIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3IgPSBzcmMuYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWREc3RDb2xvcjsKKyAgICBhZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXAgPSBzcmMuYWR2YW5jZWRCbGVuZENvcnJlbGF0ZWRPdmVybGFwOworICAgIGFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zID0gc3JjLmFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHMgPSBpbl9zdHJ1Y3QtPmFkdmFuY2VkQmxlbmRNYXhDb2xvckF0dGFjaG1lbnRzOworICAgIGFkdmFuY2VkQmxlbmRJbmRlcGVuZGVudEJsZW5kID0gaW5fc3RydWN0LT5hZHZhbmNlZEJsZW5kSW5kZXBlbmRlbnRCbGVuZDsKKyAgICBhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yID0gaW5fc3RydWN0LT5hZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yOworICAgIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3IgPSBpbl9zdHJ1Y3QtPmFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkRHN0Q29sb3I7CisgICAgYWR2YW5jZWRCbGVuZENvcnJlbGF0ZWRPdmVybGFwID0gaW5fc3RydWN0LT5hZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXA7CisgICAgYWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnMgPSBpbl9zdHJ1Y3QtPmFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBhZHZhbmNlZEJsZW5kTWF4Q29sb3JBdHRhY2htZW50cyA9IHNyYy0+YWR2YW5jZWRCbGVuZE1heENvbG9yQXR0YWNobWVudHM7CisgICAgYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQgPSBzcmMtPmFkdmFuY2VkQmxlbmRJbmRlcGVuZGVudEJsZW5kOworICAgIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkU3JjQ29sb3IgPSBzcmMtPmFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkU3JjQ29sb3I7CisgICAgYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWREc3RDb2xvciA9IHNyYy0+YWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWREc3RDb2xvcjsKKyAgICBhZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXAgPSBzcmMtPmFkdmFuY2VkQmxlbmRDb3JyZWxhdGVkT3ZlcmxhcDsKKyAgICBhZHZhbmNlZEJsZW5kQWxsT3BlcmF0aW9ucyA9IHNyYy0+YWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBWa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzcmNQcmVtdWx0aXBsaWVkKGluX3N0cnVjdC0+c3JjUHJlbXVsdGlwbGllZCksCisgICAgZHN0UHJlbXVsdGlwbGllZChpbl9zdHJ1Y3QtPmRzdFByZW11bHRpcGxpZWQpLAorICAgIGJsZW5kT3ZlcmxhcChpbl9zdHJ1Y3QtPmJsZW5kT3ZlcmxhcCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzcmNQcmVtdWx0aXBsaWVkID0gc3JjLnNyY1ByZW11bHRpcGxpZWQ7CisgICAgZHN0UHJlbXVsdGlwbGllZCA9IHNyYy5kc3RQcmVtdWx0aXBsaWVkOworICAgIGJsZW5kT3ZlcmxhcCA9IHNyYy5ibGVuZE92ZXJsYXA7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCYgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzcmNQcmVtdWx0aXBsaWVkID0gc3JjLnNyY1ByZW11bHRpcGxpZWQ7CisgICAgZHN0UHJlbXVsdGlwbGllZCA9IHNyYy5kc3RQcmVtdWx0aXBsaWVkOworICAgIGJsZW5kT3ZlcmxhcCA9IHNyYy5ibGVuZE92ZXJsYXA7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3JjUHJlbXVsdGlwbGllZCA9IGluX3N0cnVjdC0+c3JjUHJlbXVsdGlwbGllZDsKKyAgICBkc3RQcmVtdWx0aXBsaWVkID0gaW5fc3RydWN0LT5kc3RQcmVtdWx0aXBsaWVkOworICAgIGJsZW5kT3ZlcmxhcCA9IGluX3N0cnVjdC0+YmxlbmRPdmVybGFwOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNyY1ByZW11bHRpcGxpZWQgPSBzcmMtPnNyY1ByZW11bHRpcGxpZWQ7CisgICAgZHN0UHJlbXVsdGlwbGllZCA9IHNyYy0+ZHN0UHJlbXVsdGlwbGllZDsKKyAgICBibGVuZE92ZXJsYXAgPSBzcmMtPmJsZW5kT3ZlcmxhcDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGNvdmVyYWdlVG9Db2xvckVuYWJsZShpbl9zdHJ1Y3QtPmNvdmVyYWdlVG9Db2xvckVuYWJsZSksCisgICAgY292ZXJhZ2VUb0NvbG9yTG9jYXRpb24oaW5fc3RydWN0LT5jb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlY6OnNhZmVfVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgY292ZXJhZ2VUb0NvbG9yRW5hYmxlID0gc3JjLmNvdmVyYWdlVG9Db2xvckVuYWJsZTsKKyAgICBjb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbiA9IHNyYy5jb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYmIHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGNvdmVyYWdlVG9Db2xvckVuYWJsZSA9IHNyYy5jb3ZlcmFnZVRvQ29sb3JFbmFibGU7CisgICAgY292ZXJhZ2VUb0NvbG9yTG9jYXRpb24gPSBzcmMuY292ZXJhZ2VUb0NvbG9yTG9jYXRpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WOjp+c2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgY292ZXJhZ2VUb0NvbG9yRW5hYmxlID0gaW5fc3RydWN0LT5jb3ZlcmFnZVRvQ29sb3JFbmFibGU7CisgICAgY292ZXJhZ2VUb0NvbG9yTG9jYXRpb24gPSBpbl9zdHJ1Y3QtPmNvdmVyYWdlVG9Db2xvckxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgY292ZXJhZ2VUb0NvbG9yRW5hYmxlID0gc3JjLT5jb3ZlcmFnZVRvQ29sb3JFbmFibGU7CisgICAgY292ZXJhZ2VUb0NvbG9yTG9jYXRpb24gPSBzcmMtPmNvdmVyYWdlVG9Db2xvckxvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlY6OnNhZmVfVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgY292ZXJhZ2VNb2R1bGF0aW9uTW9kZShpbl9zdHJ1Y3QtPmNvdmVyYWdlTW9kdWxhdGlvbk1vZGUpLAorICAgIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlKGluX3N0cnVjdC0+Y292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGUpLAorICAgIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnQoaW5fc3RydWN0LT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50KSwKKyAgICBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cENvdmVyYWdlTW9kdWxhdGlvblRhYmxlKSB7CisgICAgICAgIHBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSA9IG5ldyBmbG9hdFtpbl9zdHJ1Y3QtPmNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcENvdmVyYWdlTW9kdWxhdGlvblRhYmxlLCAodm9pZCAqKWluX3N0cnVjdC0+cENvdmVyYWdlTW9kdWxhdGlvblRhYmxlLCBzaXplb2YoZmxvYXQpKmluX3N0cnVjdC0+Y292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcENvdmVyYWdlTW9kdWxhdGlvblRhYmxlKG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBjb3ZlcmFnZU1vZHVsYXRpb25Nb2RlID0gc3JjLmNvdmVyYWdlTW9kdWxhdGlvbk1vZGU7CisgICAgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGUgPSBzcmMuY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGU7CisgICAgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCA9IHNyYy5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50OworICAgIHBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUpIHsKKyAgICAgICAgcENvdmVyYWdlTW9kdWxhdGlvblRhYmxlID0gbmV3IGZsb2F0W3NyYy5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSwgKHZvaWQgKilzcmMucENvdmVyYWdlTW9kdWxhdGlvblRhYmxlLCBzaXplb2YoZmxvYXQpKnNyYy5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WJiBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSkKKyAgICAgICAgZGVsZXRlW10gcENvdmVyYWdlTW9kdWxhdGlvblRhYmxlOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgY292ZXJhZ2VNb2R1bGF0aW9uTW9kZSA9IHNyYy5jb3ZlcmFnZU1vZHVsYXRpb25Nb2RlOworICAgIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlID0gc3JjLmNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlOworICAgIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnQgPSBzcmMuY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudDsKKyAgICBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucENvdmVyYWdlTW9kdWxhdGlvblRhYmxlKSB7CisgICAgICAgIHBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSA9IG5ldyBmbG9hdFtzcmMuY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUsICh2b2lkICopc3JjLnBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSwgc2l6ZW9mKGZsb2F0KSpzcmMuY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVjo6fnNhZmVfVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WKCkKK3sKKyAgICBpZiAocENvdmVyYWdlTW9kdWxhdGlvblRhYmxlKQorICAgICAgICBkZWxldGVbXSBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGU7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBjb3ZlcmFnZU1vZHVsYXRpb25Nb2RlID0gaW5fc3RydWN0LT5jb3ZlcmFnZU1vZHVsYXRpb25Nb2RlOworICAgIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlID0gaW5fc3RydWN0LT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZTsKKyAgICBjb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50ID0gaW5fc3RydWN0LT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50OworICAgIHBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSkgeworICAgICAgICBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUgPSBuZXcgZmxvYXRbaW5fc3RydWN0LT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSwgKHZvaWQgKilpbl9zdHJ1Y3QtPnBDb3ZlcmFnZU1vZHVsYXRpb25UYWJsZSwgc2l6ZW9mKGZsb2F0KSppbl9zdHJ1Y3QtPmNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgY292ZXJhZ2VNb2R1bGF0aW9uTW9kZSA9IHNyYy0+Y292ZXJhZ2VNb2R1bGF0aW9uTW9kZTsKKyAgICBjb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZSA9IHNyYy0+Y292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGU7CisgICAgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCA9IHNyYy0+Y292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudDsKKyAgICBwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUpIHsKKyAgICAgICAgcENvdmVyYWdlTW9kdWxhdGlvblRhYmxlID0gbmV3IGZsb2F0W3NyYy0+Y292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUsICh2b2lkICopc3JjLT5wQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUsIHNpemVvZihmbG9hdCkqc3JjLT5jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRlclNNQ291bnQoaW5fc3RydWN0LT5zaGFkZXJTTUNvdW50KSwKKyAgICBzaGFkZXJXYXJwc1BlclNNKGluX3N0cnVjdC0+c2hhZGVyV2FycHNQZXJTTSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNoYWRlclNNQ291bnQgPSBzcmMuc2hhZGVyU01Db3VudDsKKyAgICBzaGFkZXJXYXJwc1BlclNNID0gc3JjLnNoYWRlcldhcnBzUGVyU007CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYmIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJTTUNvdW50ID0gc3JjLnNoYWRlclNNQ291bnQ7CisgICAgc2hhZGVyV2FycHNQZXJTTSA9IHNyYy5zaGFkZXJXYXJwc1BlclNNOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzaGFkZXJTTUNvdW50ID0gaW5fc3RydWN0LT5zaGFkZXJTTUNvdW50OworICAgIHNoYWRlcldhcnBzUGVyU00gPSBpbl9zdHJ1Y3QtPnNoYWRlcldhcnBzUGVyU007CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzaGFkZXJTTUNvdW50ID0gc3JjLT5zaGFkZXJTTUNvdW50OworICAgIHNoYWRlcldhcnBzUGVyU00gPSBzcmMtPnNoYWRlcldhcnBzUGVyU007CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzaGFkZXJTTUJ1aWx0aW5zKGluX3N0cnVjdC0+c2hhZGVyU01CdWlsdGlucykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyU01CdWlsdGlucyA9IHNyYy5zaGFkZXJTTUJ1aWx0aW5zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyU01CdWlsdGlucyA9IHNyYy5zaGFkZXJTTUJ1aWx0aW5zOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVjo6fnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2hhZGVyU01CdWlsdGlucyA9IGluX3N0cnVjdC0+c2hhZGVyU01CdWlsdGluczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2hhZGVyU01CdWlsdGlucyA9IHNyYy0+c2hhZGVyU01CdWlsdGluczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUOjpzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVChjb25zdCBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRybUZvcm1hdE1vZGlmaWVyQ291bnQoaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllckNvdW50KSwKKyAgICBwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMpIHsKKyAgICAgICAgcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcyA9IG5ldyBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVFtpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMsIHNpemVvZihWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCkqaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllckNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUOjpzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVDo6c2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQoY29uc3Qgc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkcm1Gb3JtYXRNb2RpZmllckNvdW50ID0gc3JjLmRybUZvcm1hdE1vZGlmaWVyQ291bnQ7CisgICAgcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzKSB7CisgICAgICAgIHBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMgPSBuZXcgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFRbc3JjLmRybUZvcm1hdE1vZGlmaWVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcywgKHZvaWQgKilzcmMucERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcywgc2l6ZW9mKFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKSpzcmMuZHJtRm9ybWF0TW9kaWZpZXJDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCYgc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzKQorICAgICAgICBkZWxldGVbXSBwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXJDb3VudCA9IHNyYy5kcm1Gb3JtYXRNb2RpZmllckNvdW50OworICAgIHBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcykgeworICAgICAgICBwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzID0gbmV3IFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUW3NyYy5kcm1Gb3JtYXRNb2RpZmllckNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMsICh2b2lkICopc3JjLnBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMsIHNpemVvZihWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCkqc3JjLmRybUZvcm1hdE1vZGlmaWVyQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQ6On5zYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCgpCit7CisgICAgaWYgKHBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMpCisgICAgICAgIGRlbGV0ZVtdIHBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRybUZvcm1hdE1vZGlmaWVyQ291bnQgPSBpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyQ291bnQ7CisgICAgcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMpIHsKKyAgICAgICAgcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcyA9IG5ldyBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVFtpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXMsIHNpemVvZihWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCkqaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllckNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXJDb3VudCA9IHNyYy0+ZHJtRm9ybWF0TW9kaWZpZXJDb3VudDsKKyAgICBwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcykgeworICAgICAgICBwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzID0gbmV3IFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUW3NyYy0+ZHJtRm9ybWF0TW9kaWZpZXJDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzLCAodm9pZCAqKXNyYy0+cERybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllcywgc2l6ZW9mKFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKSpzcmMtPmRybUZvcm1hdE1vZGlmaWVyQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZHJtRm9ybWF0TW9kaWZpZXIoaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllciksCisgICAgc2hhcmluZ01vZGUoaW5fc3RydWN0LT5zaGFyaW5nTW9kZSksCisgICAgcXVldWVGYW1pbHlJbmRleENvdW50KGluX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50KSwKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBRdWV1ZUZhbWlseUluZGljZXMpIHsKKyAgICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUXVldWVGYW1pbHlJbmRpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cFF1ZXVlRmFtaWx5SW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyhudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXIgPSBzcmMuZHJtRm9ybWF0TW9kaWZpZXI7CisgICAgc2hhcmluZ01vZGUgPSBzcmMuc2hhcmluZ01vZGU7CisgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBRdWV1ZUZhbWlseUluZGljZXMpIHsKKyAgICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMucXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopc3JjLnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwUXVldWVGYW1pbHlJbmRpY2VzKQorICAgICAgICBkZWxldGVbXSBwUXVldWVGYW1pbHlJbmRpY2VzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXIgPSBzcmMuZHJtRm9ybWF0TW9kaWZpZXI7CisgICAgc2hhcmluZ01vZGUgPSBzcmMuc2hhcmluZ01vZGU7CisgICAgcXVldWVGYW1pbHlJbmRleENvdW50ID0gc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBRdWV1ZUZhbWlseUluZGljZXMpIHsKKyAgICAgICAgcFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG5ldyB1aW50MzJfdFtzcmMucXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopc3JjLnBRdWV1ZUZhbWlseUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUKCkKK3sKKyAgICBpZiAocFF1ZXVlRmFtaWx5SW5kaWNlcykKKyAgICAgICAgZGVsZXRlW10gcFF1ZXVlRmFtaWx5SW5kaWNlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXIgPSBpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyOworICAgIHNoYXJpbmdNb2RlID0gaW5fc3RydWN0LT5zaGFyaW5nTW9kZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBpbl9zdHJ1Y3QtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wUXVldWVGYW1pbHlJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+cXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXIgPSBzcmMtPmRybUZvcm1hdE1vZGlmaWVyOworICAgIHNoYXJpbmdNb2RlID0gc3JjLT5zaGFyaW5nTW9kZTsKKyAgICBxdWV1ZUZhbWlseUluZGV4Q291bnQgPSBzcmMtPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsKKyAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cFF1ZXVlRmFtaWx5SW5kaWNlcykgeworICAgICAgICBwUXVldWVGYW1pbHlJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy0+cXVldWVGYW1pbHlJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBRdWV1ZUZhbWlseUluZGljZXMsICh2b2lkICopc3JjLT5wUXVldWVGYW1pbHlJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy0+cXVldWVGYW1pbHlJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQ6OnNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQoY29uc3QgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRybUZvcm1hdE1vZGlmaWVyQ291bnQoaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllckNvdW50KSwKKyAgICBwRHJtRm9ybWF0TW9kaWZpZXJzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEcm1Gb3JtYXRNb2RpZmllcnMpIHsKKyAgICAgICAgcERybUZvcm1hdE1vZGlmaWVycyA9IG5ldyB1aW50NjRfdFtpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERybUZvcm1hdE1vZGlmaWVycywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEcm1Gb3JtYXRNb2RpZmllcnMsIHNpemVvZih1aW50NjRfdCkqaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllckNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQ6OnNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcERybUZvcm1hdE1vZGlmaWVycyhudWxscHRyKQore30KKworc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXJDb3VudCA9IHNyYy5kcm1Gb3JtYXRNb2RpZmllckNvdW50OworICAgIHBEcm1Gb3JtYXRNb2RpZmllcnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERybUZvcm1hdE1vZGlmaWVycykgeworICAgICAgICBwRHJtRm9ybWF0TW9kaWZpZXJzID0gbmV3IHVpbnQ2NF90W3NyYy5kcm1Gb3JtYXRNb2RpZmllckNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEcm1Gb3JtYXRNb2RpZmllcnMsICh2b2lkICopc3JjLnBEcm1Gb3JtYXRNb2RpZmllcnMsIHNpemVvZih1aW50NjRfdCkqc3JjLmRybUZvcm1hdE1vZGlmaWVyQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCYgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocERybUZvcm1hdE1vZGlmaWVycykKKyAgICAgICAgZGVsZXRlW10gcERybUZvcm1hdE1vZGlmaWVyczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRybUZvcm1hdE1vZGlmaWVyQ291bnQgPSBzcmMuZHJtRm9ybWF0TW9kaWZpZXJDb3VudDsKKyAgICBwRHJtRm9ybWF0TW9kaWZpZXJzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBEcm1Gb3JtYXRNb2RpZmllcnMpIHsKKyAgICAgICAgcERybUZvcm1hdE1vZGlmaWVycyA9IG5ldyB1aW50NjRfdFtzcmMuZHJtRm9ybWF0TW9kaWZpZXJDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRHJtRm9ybWF0TW9kaWZpZXJzLCAodm9pZCAqKXNyYy5wRHJtRm9ybWF0TW9kaWZpZXJzLCBzaXplb2YodWludDY0X3QpKnNyYy5kcm1Gb3JtYXRNb2RpZmllckNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQ6On5zYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocERybUZvcm1hdE1vZGlmaWVycykKKyAgICAgICAgZGVsZXRlW10gcERybUZvcm1hdE1vZGlmaWVyczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRybUZvcm1hdE1vZGlmaWVyQ291bnQgPSBpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyQ291bnQ7CisgICAgcERybUZvcm1hdE1vZGlmaWVycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEcm1Gb3JtYXRNb2RpZmllcnMpIHsKKyAgICAgICAgcERybUZvcm1hdE1vZGlmaWVycyA9IG5ldyB1aW50NjRfdFtpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERybUZvcm1hdE1vZGlmaWVycywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEcm1Gb3JtYXRNb2RpZmllcnMsIHNpemVvZih1aW50NjRfdCkqaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllckNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRybUZvcm1hdE1vZGlmaWVyQ291bnQgPSBzcmMtPmRybUZvcm1hdE1vZGlmaWVyQ291bnQ7CisgICAgcERybUZvcm1hdE1vZGlmaWVycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBEcm1Gb3JtYXRNb2RpZmllcnMpIHsKKyAgICAgICAgcERybUZvcm1hdE1vZGlmaWVycyA9IG5ldyB1aW50NjRfdFtzcmMtPmRybUZvcm1hdE1vZGlmaWVyQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERybUZvcm1hdE1vZGlmaWVycywgKHZvaWQgKilzcmMtPnBEcm1Gb3JtYXRNb2RpZmllcnMsIHNpemVvZih1aW50NjRfdCkqc3JjLT5kcm1Gb3JtYXRNb2RpZmllckNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVChjb25zdCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRybUZvcm1hdE1vZGlmaWVyKGluX3N0cnVjdC0+ZHJtRm9ybWF0TW9kaWZpZXIpLAorICAgIGRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudChpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCksCisgICAgcFBsYW5lTGF5b3V0cyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wUGxhbmVMYXlvdXRzKSB7CisgICAgICAgIHBQbGFuZUxheW91dHMgPSBuZXcgVmtTdWJyZXNvdXJjZUxheW91dFtpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUGxhbmVMYXlvdXRzLCAodm9pZCAqKWluX3N0cnVjdC0+cFBsYW5lTGF5b3V0cywgc2l6ZW9mKFZrU3VicmVzb3VyY2VMYXlvdXQpKmluX3N0cnVjdC0+ZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwUGxhbmVMYXlvdXRzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkcm1Gb3JtYXRNb2RpZmllciA9IHNyYy5kcm1Gb3JtYXRNb2RpZmllcjsKKyAgICBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQgPSBzcmMuZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50OworICAgIHBQbGFuZUxheW91dHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFBsYW5lTGF5b3V0cykgeworICAgICAgICBwUGxhbmVMYXlvdXRzID0gbmV3IFZrU3VicmVzb3VyY2VMYXlvdXRbc3JjLmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUGxhbmVMYXlvdXRzLCAodm9pZCAqKXNyYy5wUGxhbmVMYXlvdXRzLCBzaXplb2YoVmtTdWJyZXNvdXJjZUxheW91dCkqc3JjLmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCYgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwUGxhbmVMYXlvdXRzKQorICAgICAgICBkZWxldGVbXSBwUGxhbmVMYXlvdXRzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXIgPSBzcmMuZHJtRm9ybWF0TW9kaWZpZXI7CisgICAgZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50ID0gc3JjLmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudDsKKyAgICBwUGxhbmVMYXlvdXRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBQbGFuZUxheW91dHMpIHsKKyAgICAgICAgcFBsYW5lTGF5b3V0cyA9IG5ldyBWa1N1YnJlc291cmNlTGF5b3V0W3NyYy5kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBsYW5lTGF5b3V0cywgKHZvaWQgKilzcmMucFBsYW5lTGF5b3V0cywgc2l6ZW9mKFZrU3VicmVzb3VyY2VMYXlvdXQpKnNyYy5kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQ6On5zYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBQbGFuZUxheW91dHMpCisgICAgICAgIGRlbGV0ZVtdIHBQbGFuZUxheW91dHM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGRybUZvcm1hdE1vZGlmaWVyID0gaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllcjsKKyAgICBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQgPSBpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudDsKKyAgICBwUGxhbmVMYXlvdXRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFBsYW5lTGF5b3V0cykgeworICAgICAgICBwUGxhbmVMYXlvdXRzID0gbmV3IFZrU3VicmVzb3VyY2VMYXlvdXRbaW5fc3RydWN0LT5kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBsYW5lTGF5b3V0cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBQbGFuZUxheW91dHMsIHNpemVvZihWa1N1YnJlc291cmNlTGF5b3V0KSppbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRybUZvcm1hdE1vZGlmaWVyID0gc3JjLT5kcm1Gb3JtYXRNb2RpZmllcjsKKyAgICBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQgPSBzcmMtPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudDsKKyAgICBwUGxhbmVMYXlvdXRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cFBsYW5lTGF5b3V0cykgeworICAgICAgICBwUGxhbmVMYXlvdXRzID0gbmV3IFZrU3VicmVzb3VyY2VMYXlvdXRbc3JjLT5kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBsYW5lTGF5b3V0cywgKHZvaWQgKilzcmMtPnBQbGFuZUxheW91dHMsIHNpemVvZihWa1N1YnJlc291cmNlTGF5b3V0KSpzcmMtPmRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ6OnNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVChjb25zdCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkcm1Gb3JtYXRNb2RpZmllcihpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVDo6c2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRybUZvcm1hdE1vZGlmaWVyID0gc3JjLmRybUZvcm1hdE1vZGlmaWVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQmIHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXIgPSBzcmMuZHJtRm9ybWF0TW9kaWZpZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVDo6fnNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZHJtRm9ybWF0TW9kaWZpZXIgPSBpbl9zdHJ1Y3QtPmRybUZvcm1hdE1vZGlmaWVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRybUZvcm1hdE1vZGlmaWVyID0gc3JjLT5kcm1Gb3JtYXRNb2RpZmllcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVChjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZsYWdzKGluX3N0cnVjdC0+ZmxhZ3MpLAorICAgIGluaXRpYWxEYXRhU2l6ZShpbl9zdHJ1Y3QtPmluaXRpYWxEYXRhU2l6ZSksCisgICAgcEluaXRpYWxEYXRhKGluX3N0cnVjdC0+cEluaXRpYWxEYXRhKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBJbml0aWFsRGF0YShudWxscHRyKQore30KKworc2FmZV9Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaW5pdGlhbERhdGFTaXplID0gc3JjLmluaXRpYWxEYXRhU2l6ZTsKKyAgICBwSW5pdGlhbERhdGEgPSBzcmMucEluaXRpYWxEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCYgc2FmZV9Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaW5pdGlhbERhdGFTaXplID0gc3JjLmluaXRpYWxEYXRhU2l6ZTsKKyAgICBwSW5pdGlhbERhdGEgPSBzcmMucEluaXRpYWxEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGluaXRpYWxEYXRhU2l6ZSA9IGluX3N0cnVjdC0+aW5pdGlhbERhdGFTaXplOworICAgIHBJbml0aWFsRGF0YSA9IGluX3N0cnVjdC0+cEluaXRpYWxEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgaW5pdGlhbERhdGFTaXplID0gc3JjLT5pbml0aWFsRGF0YVNpemU7CisgICAgcEluaXRpYWxEYXRhID0gc3JjLT5wSW5pdGlhbERhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQoY29uc3QgVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB2YWxpZGF0aW9uQ2FjaGUoaW5fc3RydWN0LT52YWxpZGF0aW9uQ2FjaGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHZhbGlkYXRpb25DYWNoZSA9IHNyYy52YWxpZGF0aW9uQ2FjaGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB2YWxpZGF0aW9uQ2FjaGUgPSBzcmMudmFsaWRhdGlvbkNhY2hlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgdmFsaWRhdGlvbkNhY2hlID0gaW5fc3RydWN0LT52YWxpZGF0aW9uQ2FjaGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHZhbGlkYXRpb25DYWNoZSA9IHNyYy0+dmFsaWRhdGlvbkNhY2hlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgYmluZGluZ0NvdW50KGluX3N0cnVjdC0+YmluZGluZ0NvdW50KSwKKyAgICBwQmluZGluZ0ZsYWdzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBCaW5kaW5nRmxhZ3MpIHsKKyAgICAgICAgcEJpbmRpbmdGbGFncyA9IG5ldyBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFRbaW5fc3RydWN0LT5iaW5kaW5nQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEJpbmRpbmdGbGFncywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBCaW5kaW5nRmxhZ3MsIHNpemVvZihWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQpKmluX3N0cnVjdC0+YmluZGluZ0NvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBCaW5kaW5nRmxhZ3MobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGJpbmRpbmdDb3VudCA9IHNyYy5iaW5kaW5nQ291bnQ7CisgICAgcEJpbmRpbmdGbGFncyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wQmluZGluZ0ZsYWdzKSB7CisgICAgICAgIHBCaW5kaW5nRmxhZ3MgPSBuZXcgVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUW3NyYy5iaW5kaW5nQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEJpbmRpbmdGbGFncywgKHZvaWQgKilzcmMucEJpbmRpbmdGbGFncywgc2l6ZW9mKFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCkqc3JjLmJpbmRpbmdDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQmIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwQmluZGluZ0ZsYWdzKQorICAgICAgICBkZWxldGVbXSBwQmluZGluZ0ZsYWdzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYmluZGluZ0NvdW50ID0gc3JjLmJpbmRpbmdDb3VudDsKKyAgICBwQmluZGluZ0ZsYWdzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBCaW5kaW5nRmxhZ3MpIHsKKyAgICAgICAgcEJpbmRpbmdGbGFncyA9IG5ldyBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFRbc3JjLmJpbmRpbmdDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQmluZGluZ0ZsYWdzLCAodm9pZCAqKXNyYy5wQmluZGluZ0ZsYWdzLCBzaXplb2YoVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUKSpzcmMuYmluZGluZ0NvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBCaW5kaW5nRmxhZ3MpCisgICAgICAgIGRlbGV0ZVtdIHBCaW5kaW5nRmxhZ3M7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYmluZGluZ0NvdW50ID0gaW5fc3RydWN0LT5iaW5kaW5nQ291bnQ7CisgICAgcEJpbmRpbmdGbGFncyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBCaW5kaW5nRmxhZ3MpIHsKKyAgICAgICAgcEJpbmRpbmdGbGFncyA9IG5ldyBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFRbaW5fc3RydWN0LT5iaW5kaW5nQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEJpbmRpbmdGbGFncywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBCaW5kaW5nRmxhZ3MsIHNpemVvZihWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQpKmluX3N0cnVjdC0+YmluZGluZ0NvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBiaW5kaW5nQ291bnQgPSBzcmMtPmJpbmRpbmdDb3VudDsKKyAgICBwQmluZGluZ0ZsYWdzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cEJpbmRpbmdGbGFncykgeworICAgICAgICBwQmluZGluZ0ZsYWdzID0gbmV3IFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVFtzcmMtPmJpbmRpbmdDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwQmluZGluZ0ZsYWdzLCAodm9pZCAqKXNyYy0+cEJpbmRpbmdGbGFncywgc2l6ZW9mKFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCkqc3JjLT5iaW5kaW5nQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmcoaW5fc3RydWN0LT5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyksCisgICAgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcoaW5fc3RydWN0LT5zaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyksCisgICAgc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcoaW5fc3RydWN0LT5zaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyksCisgICAgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKGluX3N0cnVjdC0+c2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKSwKKyAgICBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyhpbl9zdHJ1Y3QtPnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKSwKKyAgICBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcoaW5fc3RydWN0LT5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcpLAorICAgIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKGluX3N0cnVjdC0+c2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcpLAorICAgIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKGluX3N0cnVjdC0+c2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcpLAorICAgIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKGluX3N0cnVjdC0+c2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcpLAorICAgIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKGluX3N0cnVjdC0+c2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcpLAorICAgIGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZChpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCksCisgICAgZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQoaW5fc3RydWN0LT5kZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZCksCisgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmQoaW5fc3RydWN0LT5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZCksCisgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKGluX3N0cnVjdC0+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKSwKKyAgICBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZChpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKSwKKyAgICBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZChpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kKSwKKyAgICBkZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZyhpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nKSwKKyAgICBkZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kKGluX3N0cnVjdC0+ZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZCksCisgICAgZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudChpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQpLAorICAgIHJ1bnRpbWVEZXNjcmlwdG9yQXJyYXkoaW5fc3RydWN0LT5ydW50aW1lRGVzY3JpcHRvckFycmF5KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyA9IHNyYy5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyA9IHNyYy5zaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyA9IHNyYy5zaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzcmMuc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IHNyYy5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzcmMuc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzcmMuc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzcmMuc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzcmMuc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gc3JjLmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZCA9IHNyYy5kZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZCA9IHNyYy5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQgPSBzcmMuZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kOworICAgIGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gc3JjLmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kOworICAgIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gc3JjLmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kOworICAgIGRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nID0gc3JjLmRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nOworICAgIGRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQgPSBzcmMuZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50ID0gc3JjLmRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQ7CisgICAgcnVudGltZURlc2NyaXB0b3JBcnJheSA9IHNyYy5ydW50aW1lRGVzY3JpcHRvckFycmF5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmcgPSBzcmMuc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcgPSBzcmMuc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcgPSBzcmMuc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IHNyYy5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzcmMuc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLnNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLnNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IHNyYy5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQgPSBzcmMuZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmQgPSBzcmMuZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gc3JjLmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IHNyYy5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IHNyYy5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZyA9IHNyYy5kZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZzsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kID0gc3JjLmRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudCA9IHNyYy5kZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50OworICAgIHJ1bnRpbWVEZXNjcmlwdG9yQXJyYXkgPSBzcmMucnVudGltZURlc2NyaXB0b3JBcnJheTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nID0gaW5fc3RydWN0LT5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyA9IGluX3N0cnVjdC0+c2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcgPSBpbl9zdHJ1Y3QtPnNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nOworICAgIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IGluX3N0cnVjdC0+c2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gaW5fc3RydWN0LT5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBpbl9zdHJ1Y3QtPnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IGluX3N0cnVjdC0+c2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBpbl9zdHJ1Y3QtPnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gaW5fc3RydWN0LT5zaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IGluX3N0cnVjdC0+c2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kOworICAgIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IGluX3N0cnVjdC0+ZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kOworICAgIGRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZzsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kID0gaW5fc3RydWN0LT5kZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kOworICAgIGRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQ7CisgICAgcnVudGltZURlc2NyaXB0b3JBcnJheSA9IGluX3N0cnVjdC0+cnVudGltZURlc2NyaXB0b3JBcnJheTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmcgPSBzcmMtPnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nOworICAgIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nID0gc3JjLT5zaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZzsKKyAgICBzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyA9IHNyYy0+c2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmc7CisgICAgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLT5zaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzcmMtPnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IHNyYy0+c2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLT5zaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZyA9IHNyYy0+c2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmcgPSBzcmMtPnNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nOworICAgIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nID0gc3JjLT5zaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQgPSBzcmMtPmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZCA9IHNyYy0+ZGVzY3JpcHRvckJpbmRpbmdTYW1wbGVkSW1hZ2VVcGRhdGVBZnRlckJpbmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmQgPSBzcmMtPmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kOworICAgIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IHNyYy0+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kOworICAgIGRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gc3JjLT5kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IHNyYy0+ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdVcGRhdGVVbnVzZWRXaGlsZVBlbmRpbmcgPSBzcmMtPmRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nOworICAgIGRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQgPSBzcmMtPmRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQ7CisgICAgZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudCA9IHNyYy0+ZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudDsKKyAgICBydW50aW1lRGVzY3JpcHRvckFycmF5ID0gc3JjLT5ydW50aW1lRGVzY3JpcHRvckFycmF5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWF4VXBkYXRlQWZ0ZXJCaW5kRGVzY3JpcHRvcnNJbkFsbFBvb2xzKGluX3N0cnVjdC0+bWF4VXBkYXRlQWZ0ZXJCaW5kRGVzY3JpcHRvcnNJbkFsbFBvb2xzKSwKKyAgICBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUoaW5fc3RydWN0LT5zaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUpLAorICAgIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlKGluX3N0cnVjdC0+c2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUpLAorICAgIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZShpbl9zdHJ1Y3QtPnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSksCisgICAgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUoaW5fc3RydWN0LT5zaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSksCisgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUoaW5fc3RydWN0LT5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSksCisgICAgcm9idXN0QnVmZmVyQWNjZXNzVXBkYXRlQWZ0ZXJCaW5kKGluX3N0cnVjdC0+cm9idXN0QnVmZmVyQWNjZXNzVXBkYXRlQWZ0ZXJCaW5kKSwKKyAgICBxdWFkRGl2ZXJnZW50SW1wbGljaXRMb2QoaW5fc3RydWN0LT5xdWFkRGl2ZXJnZW50SW1wbGljaXRMb2QpLAorICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzKGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMpLAorICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzKGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMpLAorICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzKGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMpLAorICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMoaW5fc3RydWN0LT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzKSwKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzKGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyksCisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyhpbl9zdHJ1Y3QtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMpLAorICAgIG1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzKGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VVcGRhdGVBZnRlckJpbmRSZXNvdXJjZXMpLAorICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVycyhpbl9zdHJ1Y3QtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVycyksCisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzKGluX3N0cnVjdC0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzKSwKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljKGluX3N0cnVjdC0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzRHluYW1pYyksCisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzKGluX3N0cnVjdC0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzKSwKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljKGluX3N0cnVjdC0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzRHluYW1pYyksCisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMoaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlcyksCisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMoaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyksCisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMoaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29scyA9IHNyYy5tYXhVcGRhdGVBZnRlckJpbmREZXNjcmlwdG9yc0luQWxsUG9vbHM7CisgICAgc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gc3JjLnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IHNyYy5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBzcmMuc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gc3JjLnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gc3JjLnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIHJvYnVzdEJ1ZmZlckFjY2Vzc1VwZGF0ZUFmdGVyQmluZCA9IHNyYy5yb2J1c3RCdWZmZXJBY2Nlc3NVcGRhdGVBZnRlckJpbmQ7CisgICAgcXVhZERpdmVyZ2VudEltcGxpY2l0TG9kID0gc3JjLnF1YWREaXZlcmdlbnRJbXBsaWNpdExvZDsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVycyA9IHNyYy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVyczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycyA9IHNyYy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyA9IHNyYy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzID0gc3JjLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXM7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyA9IHNyYy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMgPSBzcmMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50czsKKyAgICBtYXhQZXJTdGFnZVVwZGF0ZUFmdGVyQmluZFJlc291cmNlcyA9IHNyYy5tYXhQZXJTdGFnZVVwZGF0ZUFmdGVyQmluZFJlc291cmNlczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMgPSBzcmMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycyA9IHNyYy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzRHluYW1pYyA9IHNyYy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyA9IHNyYy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzRHluYW1pYyA9IHNyYy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzID0gc3JjLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzID0gc3JjLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzID0gc3JjLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4VXBkYXRlQWZ0ZXJCaW5kRGVzY3JpcHRvcnNJbkFsbFBvb2xzID0gc3JjLm1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29sczsKKyAgICBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBzcmMuc2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gc3JjLnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIHNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IHNyYy5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBzcmMuc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBzcmMuc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgcm9idXN0QnVmZmVyQWNjZXNzVXBkYXRlQWZ0ZXJCaW5kID0gc3JjLnJvYnVzdEJ1ZmZlckFjY2Vzc1VwZGF0ZUFmdGVyQmluZDsKKyAgICBxdWFkRGl2ZXJnZW50SW1wbGljaXRMb2QgPSBzcmMucXVhZERpdmVyZ2VudEltcGxpY2l0TG9kOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzID0gc3JjLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzID0gc3JjLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzID0gc3JjLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgPSBzcmMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzID0gc3JjLm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXM7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyA9IHNyYy5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzOworICAgIG1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzID0gc3JjLm1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVycyA9IHNyYy5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzID0gc3JjLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljID0gc3JjLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyc0R5bmFtaWM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzID0gc3JjLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljID0gc3JjLm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgPSBzcmMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMgPSBzcmMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMgPSBzcmMubWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29scyA9IGluX3N0cnVjdC0+bWF4VXBkYXRlQWZ0ZXJCaW5kRGVzY3JpcHRvcnNJbkFsbFBvb2xzOworICAgIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IGluX3N0cnVjdC0+c2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIHNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gaW5fc3RydWN0LT5zaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBpbl9zdHJ1Y3QtPnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IGluX3N0cnVjdC0+c2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBpbl9zdHJ1Y3QtPnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIHJvYnVzdEJ1ZmZlckFjY2Vzc1VwZGF0ZUFmdGVyQmluZCA9IGluX3N0cnVjdC0+cm9idXN0QnVmZmVyQWNjZXNzVXBkYXRlQWZ0ZXJCaW5kOworICAgIHF1YWREaXZlcmdlbnRJbXBsaWNpdExvZCA9IGluX3N0cnVjdC0+cXVhZERpdmVyZ2VudEltcGxpY2l0TG9kOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzID0gaW5fc3RydWN0LT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVyczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycyA9IGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnM7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMgPSBpbl9zdHJ1Y3QtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgPSBpbl9zdHJ1Y3QtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXM7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyA9IGluX3N0cnVjdC0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzID0gaW5fc3RydWN0LT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzOworICAgIG1heFBlclN0YWdlVXBkYXRlQWZ0ZXJCaW5kUmVzb3VyY2VzID0gaW5fc3RydWN0LT5tYXhQZXJTdGFnZVVwZGF0ZUFmdGVyQmluZFJlc291cmNlczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnMgPSBpbl9zdHJ1Y3QtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVyczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMgPSBpbl9zdHJ1Y3QtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljID0gaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyA9IGluX3N0cnVjdC0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWMgPSBpbl9zdHJ1Y3QtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyc0R5bmFtaWM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgPSBpbl9zdHJ1Y3QtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzID0gaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyA9IGluX3N0cnVjdC0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtYXhVcGRhdGVBZnRlckJpbmREZXNjcmlwdG9yc0luQWxsUG9vbHMgPSBzcmMtPm1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29sczsKKyAgICBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBzcmMtPnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZSA9IHNyYy0+c2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gc3JjLT5zaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmUgPSBzcmMtPnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlID0gc3JjLT5zaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZ05hdGl2ZTsKKyAgICByb2J1c3RCdWZmZXJBY2Nlc3NVcGRhdGVBZnRlckJpbmQgPSBzcmMtPnJvYnVzdEJ1ZmZlckFjY2Vzc1VwZGF0ZUFmdGVyQmluZDsKKyAgICBxdWFkRGl2ZXJnZW50SW1wbGljaXRMb2QgPSBzcmMtPnF1YWREaXZlcmdlbnRJbXBsaWNpdExvZDsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVycyA9IHNyYy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnM7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMgPSBzcmMtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzID0gc3JjLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczsKKyAgICBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzID0gc3JjLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzOworICAgIG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXMgPSBzcmMtPm1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXM7CisgICAgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyA9IHNyYy0+bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50czsKKyAgICBtYXhQZXJTdGFnZVVwZGF0ZUFmdGVyQmluZFJlc291cmNlcyA9IHNyYy0+bWF4UGVyU3RhZ2VVcGRhdGVBZnRlckJpbmRSZXNvdXJjZXM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzID0gc3JjLT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzID0gc3JjLT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzRHluYW1pYyA9IHNyYy0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzRHluYW1pYzsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnMgPSBzcmMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljID0gc3JjLT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljOworICAgIG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzID0gc3JjLT5tYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlczsKKyAgICBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyA9IHNyYy0+bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VJbWFnZXM7CisgICAgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMgPSBzcmMtPm1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVDo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVChjb25zdCBWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZGVzY3JpcHRvclNldENvdW50KGluX3N0cnVjdC0+ZGVzY3JpcHRvclNldENvdW50KSwKKyAgICBwRGVzY3JpcHRvckNvdW50cyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wRGVzY3JpcHRvckNvdW50cykgeworICAgICAgICBwRGVzY3JpcHRvckNvdW50cyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JTZXRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGVzY3JpcHRvckNvdW50cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEZXNjcmlwdG9yQ291bnRzLCBzaXplb2YodWludDMyX3QpKmluX3N0cnVjdC0+ZGVzY3JpcHRvclNldENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQ6OnNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcERlc2NyaXB0b3JDb3VudHMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQ6OnNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRlc2NyaXB0b3JTZXRDb3VudCA9IHNyYy5kZXNjcmlwdG9yU2V0Q291bnQ7CisgICAgcERlc2NyaXB0b3JDb3VudHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERlc2NyaXB0b3JDb3VudHMpIHsKKyAgICAgICAgcERlc2NyaXB0b3JDb3VudHMgPSBuZXcgdWludDMyX3Rbc3JjLmRlc2NyaXB0b3JTZXRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGVzY3JpcHRvckNvdW50cywgKHZvaWQgKilzcmMucERlc2NyaXB0b3JDb3VudHMsIHNpemVvZih1aW50MzJfdCkqc3JjLmRlc2NyaXB0b3JTZXRDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUJiBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRGVzY3JpcHRvckNvdW50cykKKyAgICAgICAgZGVsZXRlW10gcERlc2NyaXB0b3JDb3VudHM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZXNjcmlwdG9yU2V0Q291bnQgPSBzcmMuZGVzY3JpcHRvclNldENvdW50OworICAgIHBEZXNjcmlwdG9yQ291bnRzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBEZXNjcmlwdG9yQ291bnRzKSB7CisgICAgICAgIHBEZXNjcmlwdG9yQ291bnRzID0gbmV3IHVpbnQzMl90W3NyYy5kZXNjcmlwdG9yU2V0Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERlc2NyaXB0b3JDb3VudHMsICh2b2lkICopc3JjLnBEZXNjcmlwdG9yQ291bnRzLCBzaXplb2YodWludDMyX3QpKnNyYy5kZXNjcmlwdG9yU2V0Q291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVDo6fnNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQoKQoreworICAgIGlmIChwRGVzY3JpcHRvckNvdW50cykKKyAgICAgICAgZGVsZXRlW10gcERlc2NyaXB0b3JDb3VudHM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkZXNjcmlwdG9yU2V0Q291bnQgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JTZXRDb3VudDsKKyAgICBwRGVzY3JpcHRvckNvdW50cyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBEZXNjcmlwdG9yQ291bnRzKSB7CisgICAgICAgIHBEZXNjcmlwdG9yQ291bnRzID0gbmV3IHVpbnQzMl90W2luX3N0cnVjdC0+ZGVzY3JpcHRvclNldENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXNjcmlwdG9yQ291bnRzLCAodm9pZCAqKWluX3N0cnVjdC0+cERlc2NyaXB0b3JDb3VudHMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5kZXNjcmlwdG9yU2V0Q291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGVzY3JpcHRvclNldENvdW50ID0gc3JjLT5kZXNjcmlwdG9yU2V0Q291bnQ7CisgICAgcERlc2NyaXB0b3JDb3VudHMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wRGVzY3JpcHRvckNvdW50cykgeworICAgICAgICBwRGVzY3JpcHRvckNvdW50cyA9IG5ldyB1aW50MzJfdFtzcmMtPmRlc2NyaXB0b3JTZXRDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRGVzY3JpcHRvckNvdW50cywgKHZvaWQgKilzcmMtPnBEZXNjcmlwdG9yQ291bnRzLCBzaXplb2YodWludDMyX3QpKnNyYy0+ZGVzY3JpcHRvclNldENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUOjpzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVChjb25zdCBWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1heFZhcmlhYmxlRGVzY3JpcHRvckNvdW50KGluX3N0cnVjdC0+bWF4VmFyaWFibGVEZXNjcmlwdG9yQ291bnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVDo6c2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUOjpzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVChjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heFZhcmlhYmxlRGVzY3JpcHRvckNvdW50ID0gc3JjLm1heFZhcmlhYmxlRGVzY3JpcHRvckNvdW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCYgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4VmFyaWFibGVEZXNjcmlwdG9yQ291bnQgPSBzcmMubWF4VmFyaWFibGVEZXNjcmlwdG9yQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUOjp+c2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUOjppbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtYXhWYXJpYWJsZURlc2NyaXB0b3JDb3VudCA9IGluX3N0cnVjdC0+bWF4VmFyaWFibGVEZXNjcmlwdG9yQ291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1heFZhcmlhYmxlRGVzY3JpcHRvckNvdW50ID0gc3JjLT5tYXhWYXJpYWJsZURlc2NyaXB0b3JDb3VudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVjo6c2FmZV9Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqIGluX3N0cnVjdCkgOgorICAgIHNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQoaW5fc3RydWN0LT5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50KSwKKyAgICBwU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcyhudWxscHRyKQoreworICAgIGlmIChpbl9zdHJ1Y3QtPnBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzKSB7CisgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzID0gbmV3IFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVltpbl9zdHJ1Y3QtPnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMsICh2b2lkICopaW5fc3RydWN0LT5wU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcywgc2l6ZW9mKFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVikqaW5fc3RydWN0LT5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVjo6c2FmZV9Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKCkgOgorICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlY6OnNhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVihjb25zdCBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlYmIHNyYykKK3sKKyAgICBzaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50ID0gc3JjLnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQ7CisgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMgPSBudWxscHRyOworICAgIGlmIChzcmMucFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMpIHsKKyAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMgPSBuZXcgVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WW3NyYy5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzLCAodm9pZCAqKXNyYy5wU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcywgc2l6ZW9mKFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVikqc3JjLnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WJiBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMpCisgICAgICAgIGRlbGV0ZVtdIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzOworCisgICAgc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudCA9IHNyYy5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50OworICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzID0gbnVsbHB0cjsKKyAgICBpZiAoc3JjLnBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzKSB7CisgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzID0gbmV3IFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVltzcmMuc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcywgKHZvaWQgKilzcmMucFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMsIHNpemVvZihWa1NoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5TlYpKnNyYy5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVjo6fnNhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVigpCit7CisgICAgaWYgKHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzKQorICAgICAgICBkZWxldGVbXSBwU2hhZGluZ1JhdGVQYWxldHRlRW50cmllczsKK30KKwordm9pZCBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlY6OmluaXRpYWxpemUoY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogaW5fc3RydWN0KQoreworICAgIHNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQgPSBpbl9zdHJ1Y3QtPnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQ7CisgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMgPSBudWxscHRyOworICAgIGlmIChpbl9zdHJ1Y3QtPnBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzKSB7CisgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzID0gbmV3IFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVltpbl9zdHJ1Y3QtPnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMsICh2b2lkICopaW5fc3RydWN0LT5wU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcywgc2l6ZW9mKFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVikqaW5fc3RydWN0LT5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogc3JjKQoreworICAgIHNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQgPSBzcmMtPnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQ7CisgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMgPSBudWxscHRyOworICAgIGlmIChzcmMtPnBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzKSB7CisgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzID0gbmV3IFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVltzcmMtPnNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNoYWRpbmdSYXRlUGFsZXR0ZUVudHJpZXMsICh2b2lkICopc3JjLT5wU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcywgc2l6ZW9mKFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOVikqc3JjLT5zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGUoaW5fc3RydWN0LT5zaGFkaW5nUmF0ZUltYWdlRW5hYmxlKSwKKyAgICB2aWV3cG9ydENvdW50KGluX3N0cnVjdC0+dmlld3BvcnRDb3VudCksCisgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKHZpZXdwb3J0Q291bnQgJiYgaW5fc3RydWN0LT5wU2hhZGluZ1JhdGVQYWxldHRlcykgeworICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcyA9IG5ldyBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlZbdmlld3BvcnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2aWV3cG9ydENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cFNoYWRpbmdSYXRlUGFsZXR0ZXNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGUgPSBzcmMuc2hhZGluZ1JhdGVJbWFnZUVuYWJsZTsKKyAgICB2aWV3cG9ydENvdW50ID0gc3JjLnZpZXdwb3J0Q291bnQ7CisgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmICh2aWV3cG9ydENvdW50ICYmIHNyYy5wU2hhZGluZ1JhdGVQYWxldHRlcykgeworICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcyA9IG5ldyBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlZbdmlld3BvcnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2aWV3cG9ydENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVzW2ldLmluaXRpYWxpemUoJnNyYy5wU2hhZGluZ1JhdGVQYWxldHRlc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WJiBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBTaGFkaW5nUmF0ZVBhbGV0dGVzKQorICAgICAgICBkZWxldGVbXSBwU2hhZGluZ1JhdGVQYWxldHRlczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGUgPSBzcmMuc2hhZGluZ1JhdGVJbWFnZUVuYWJsZTsKKyAgICB2aWV3cG9ydENvdW50ID0gc3JjLnZpZXdwb3J0Q291bnQ7CisgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmICh2aWV3cG9ydENvdW50ICYmIHNyYy5wU2hhZGluZ1JhdGVQYWxldHRlcykgeworICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlcyA9IG5ldyBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlZbdmlld3BvcnRDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2aWV3cG9ydENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVzW2ldLmluaXRpYWxpemUoJnNyYy5wU2hhZGluZ1JhdGVQYWxldHRlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WOjp+c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYoKQoreworICAgIGlmIChwU2hhZGluZ1JhdGVQYWxldHRlcykKKyAgICAgICAgZGVsZXRlW10gcFNoYWRpbmdSYXRlUGFsZXR0ZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGUgPSBpbl9zdHJ1Y3QtPnNoYWRpbmdSYXRlSW1hZ2VFbmFibGU7CisgICAgdmlld3BvcnRDb3VudCA9IGluX3N0cnVjdC0+dmlld3BvcnRDb3VudDsKKyAgICBwU2hhZGluZ1JhdGVQYWxldHRlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmICh2aWV3cG9ydENvdW50ICYmIGluX3N0cnVjdC0+cFNoYWRpbmdSYXRlUGFsZXR0ZXMpIHsKKyAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMgPSBuZXcgc2FmZV9Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WW3ZpZXdwb3J0Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdmlld3BvcnRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU2hhZGluZ1JhdGVQYWxldHRlc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBTaGFkaW5nUmF0ZVBhbGV0dGVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzaGFkaW5nUmF0ZUltYWdlRW5hYmxlID0gc3JjLT5zaGFkaW5nUmF0ZUltYWdlRW5hYmxlOworICAgIHZpZXdwb3J0Q291bnQgPSBzcmMtPnZpZXdwb3J0Q291bnQ7CisgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAodmlld3BvcnRDb3VudCAmJiBzcmMtPnBTaGFkaW5nUmF0ZVBhbGV0dGVzKSB7CisgICAgICAgIHBTaGFkaW5nUmF0ZVBhbGV0dGVzID0gbmV3IHNhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVlt2aWV3cG9ydENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHZpZXdwb3J0Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcFNoYWRpbmdSYXRlUGFsZXR0ZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wU2hhZGluZ1JhdGVQYWxldHRlc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRpbmdSYXRlSW1hZ2UoaW5fc3RydWN0LT5zaGFkaW5nUmF0ZUltYWdlKSwKKyAgICBzaGFkaW5nUmF0ZUNvYXJzZVNhbXBsZU9yZGVyKGluX3N0cnVjdC0+c2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlcikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGluZ1JhdGVJbWFnZSA9IHNyYy5zaGFkaW5nUmF0ZUltYWdlOworICAgIHNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXIgPSBzcmMuc2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYmIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNoYWRpbmdSYXRlSW1hZ2UgPSBzcmMuc2hhZGluZ1JhdGVJbWFnZTsKKyAgICBzaGFkaW5nUmF0ZUNvYXJzZVNhbXBsZU9yZGVyID0gc3JjLnNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzaGFkaW5nUmF0ZUltYWdlID0gaW5fc3RydWN0LT5zaGFkaW5nUmF0ZUltYWdlOworICAgIHNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXIgPSBpbl9zdHJ1Y3QtPnNoYWRpbmdSYXRlQ29hcnNlU2FtcGxlT3JkZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNoYWRpbmdSYXRlSW1hZ2UgPSBzcmMtPnNoYWRpbmdSYXRlSW1hZ2U7CisgICAgc2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlciA9IHNyYy0+c2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRpbmdSYXRlVGV4ZWxTaXplKGluX3N0cnVjdC0+c2hhZGluZ1JhdGVUZXhlbFNpemUpLAorICAgIHNoYWRpbmdSYXRlUGFsZXR0ZVNpemUoaW5fc3RydWN0LT5zaGFkaW5nUmF0ZVBhbGV0dGVTaXplKSwKKyAgICBzaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXMoaW5fc3RydWN0LT5zaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkaW5nUmF0ZVRleGVsU2l6ZSA9IHNyYy5zaGFkaW5nUmF0ZVRleGVsU2l6ZTsKKyAgICBzaGFkaW5nUmF0ZVBhbGV0dGVTaXplID0gc3JjLnNoYWRpbmdSYXRlUGFsZXR0ZVNpemU7CisgICAgc2hhZGluZ1JhdGVNYXhDb2Fyc2VTYW1wbGVzID0gc3JjLnNoYWRpbmdSYXRlTWF4Q29hcnNlU2FtcGxlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNoYWRpbmdSYXRlVGV4ZWxTaXplID0gc3JjLnNoYWRpbmdSYXRlVGV4ZWxTaXplOworICAgIHNoYWRpbmdSYXRlUGFsZXR0ZVNpemUgPSBzcmMuc2hhZGluZ1JhdGVQYWxldHRlU2l6ZTsKKyAgICBzaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXMgPSBzcmMuc2hhZGluZ1JhdGVNYXhDb2Fyc2VTYW1wbGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzaGFkaW5nUmF0ZVRleGVsU2l6ZSA9IGluX3N0cnVjdC0+c2hhZGluZ1JhdGVUZXhlbFNpemU7CisgICAgc2hhZGluZ1JhdGVQYWxldHRlU2l6ZSA9IGluX3N0cnVjdC0+c2hhZGluZ1JhdGVQYWxldHRlU2l6ZTsKKyAgICBzaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXMgPSBpbl9zdHJ1Y3QtPnNoYWRpbmdSYXRlTWF4Q29hcnNlU2FtcGxlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNoYWRpbmdSYXRlVGV4ZWxTaXplID0gc3JjLT5zaGFkaW5nUmF0ZVRleGVsU2l6ZTsKKyAgICBzaGFkaW5nUmF0ZVBhbGV0dGVTaXplID0gc3JjLT5zaGFkaW5nUmF0ZVBhbGV0dGVTaXplOworICAgIHNoYWRpbmdSYXRlTWF4Q29hcnNlU2FtcGxlcyA9IHNyYy0+c2hhZGluZ1JhdGVNYXhDb2Fyc2VTYW1wbGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlY6OnNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogaW5fc3RydWN0KSA6CisgICAgc2hhZGluZ1JhdGUoaW5fc3RydWN0LT5zaGFkaW5nUmF0ZSksCisgICAgc2FtcGxlQ291bnQoaW5fc3RydWN0LT5zYW1wbGVDb3VudCksCisgICAgc2FtcGxlTG9jYXRpb25Db3VudChpbl9zdHJ1Y3QtPnNhbXBsZUxvY2F0aW9uQ291bnQpLAorICAgIHBTYW1wbGVMb2NhdGlvbnMobnVsbHB0cikKK3sKKyAgICBpZiAoaW5fc3RydWN0LT5wU2FtcGxlTG9jYXRpb25zKSB7CisgICAgICAgIHBTYW1wbGVMb2NhdGlvbnMgPSBuZXcgVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WW2luX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cFNhbXBsZUxvY2F0aW9ucywgc2l6ZW9mKFZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVikqaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbkNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WOjpzYWZlX1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVigpIDoKKyAgICBwU2FtcGxlTG9jYXRpb25zKG51bGxwdHIpCit7fQorCitzYWZlX1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVjo6c2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYoY29uc3Qgc2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYmIHNyYykKK3sKKyAgICBzaGFkaW5nUmF0ZSA9IHNyYy5zaGFkaW5nUmF0ZTsKKyAgICBzYW1wbGVDb3VudCA9IHNyYy5zYW1wbGVDb3VudDsKKyAgICBzYW1wbGVMb2NhdGlvbkNvdW50ID0gc3JjLnNhbXBsZUxvY2F0aW9uQ291bnQ7CisgICAgcFNhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgaWYgKHNyYy5wU2FtcGxlTG9jYXRpb25zKSB7CisgICAgICAgIHBTYW1wbGVMb2NhdGlvbnMgPSBuZXcgVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WW3NyYy5zYW1wbGVMb2NhdGlvbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTYW1wbGVMb2NhdGlvbnMsICh2b2lkICopc3JjLnBTYW1wbGVMb2NhdGlvbnMsIHNpemVvZihWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYpKnNyYy5zYW1wbGVMb2NhdGlvbkNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WJiBzYWZlX1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBTYW1wbGVMb2NhdGlvbnMpCisgICAgICAgIGRlbGV0ZVtdIHBTYW1wbGVMb2NhdGlvbnM7CisKKyAgICBzaGFkaW5nUmF0ZSA9IHNyYy5zaGFkaW5nUmF0ZTsKKyAgICBzYW1wbGVDb3VudCA9IHNyYy5zYW1wbGVDb3VudDsKKyAgICBzYW1wbGVMb2NhdGlvbkNvdW50ID0gc3JjLnNhbXBsZUxvY2F0aW9uQ291bnQ7CisgICAgcFNhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgaWYgKHNyYy5wU2FtcGxlTG9jYXRpb25zKSB7CisgICAgICAgIHBTYW1wbGVMb2NhdGlvbnMgPSBuZXcgVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WW3NyYy5zYW1wbGVMb2NhdGlvbkNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBTYW1wbGVMb2NhdGlvbnMsICh2b2lkICopc3JjLnBTYW1wbGVMb2NhdGlvbnMsIHNpemVvZihWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYpKnNyYy5zYW1wbGVMb2NhdGlvbkNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WOjp+c2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYoKQoreworICAgIGlmIChwU2FtcGxlTG9jYXRpb25zKQorICAgICAgICBkZWxldGVbXSBwU2FtcGxlTG9jYXRpb25zOworfQorCit2b2lkIHNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WOjppbml0aWFsaXplKGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogaW5fc3RydWN0KQoreworICAgIHNoYWRpbmdSYXRlID0gaW5fc3RydWN0LT5zaGFkaW5nUmF0ZTsKKyAgICBzYW1wbGVDb3VudCA9IGluX3N0cnVjdC0+c2FtcGxlQ291bnQ7CisgICAgc2FtcGxlTG9jYXRpb25Db3VudCA9IGluX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25Db3VudDsKKyAgICBwU2FtcGxlTG9jYXRpb25zID0gbnVsbHB0cjsKKyAgICBpZiAoaW5fc3RydWN0LT5wU2FtcGxlTG9jYXRpb25zKSB7CisgICAgICAgIHBTYW1wbGVMb2NhdGlvbnMgPSBuZXcgVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WW2luX3N0cnVjdC0+c2FtcGxlTG9jYXRpb25Db3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwU2FtcGxlTG9jYXRpb25zLCAodm9pZCAqKWluX3N0cnVjdC0+cFNhbXBsZUxvY2F0aW9ucywgc2l6ZW9mKFZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVikqaW5fc3RydWN0LT5zYW1wbGVMb2NhdGlvbkNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqIHNyYykKK3sKKyAgICBzaGFkaW5nUmF0ZSA9IHNyYy0+c2hhZGluZ1JhdGU7CisgICAgc2FtcGxlQ291bnQgPSBzcmMtPnNhbXBsZUNvdW50OworICAgIHNhbXBsZUxvY2F0aW9uQ291bnQgPSBzcmMtPnNhbXBsZUxvY2F0aW9uQ291bnQ7CisgICAgcFNhbXBsZUxvY2F0aW9ucyA9IG51bGxwdHI7CisgICAgaWYgKHNyYy0+cFNhbXBsZUxvY2F0aW9ucykgeworICAgICAgICBwU2FtcGxlTG9jYXRpb25zID0gbmV3IFZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVltzcmMtPnNhbXBsZUxvY2F0aW9uQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNhbXBsZUxvY2F0aW9ucywgKHZvaWQgKilzcmMtPnBTYW1wbGVMb2NhdGlvbnMsIHNpemVvZihWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYpKnNyYy0+c2FtcGxlTG9jYXRpb25Db3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlY6OnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzYW1wbGVPcmRlclR5cGUoaW5fc3RydWN0LT5zYW1wbGVPcmRlclR5cGUpLAorICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQoaW5fc3RydWN0LT5jdXN0b21TYW1wbGVPcmRlckNvdW50KSwKKyAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChjdXN0b21TYW1wbGVPcmRlckNvdW50ICYmIGluX3N0cnVjdC0+cEN1c3RvbVNhbXBsZU9yZGVycykgeworICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzID0gbmV3IHNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WW2N1c3RvbVNhbXBsZU9yZGVyQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3VzdG9tU2FtcGxlT3JkZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cEN1c3RvbVNhbXBsZU9yZGVyc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBDdXN0b21TYW1wbGVPcmRlcnMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNhbXBsZU9yZGVyVHlwZSA9IHNyYy5zYW1wbGVPcmRlclR5cGU7CisgICAgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCA9IHNyYy5jdXN0b21TYW1wbGVPcmRlckNvdW50OworICAgIHBDdXN0b21TYW1wbGVPcmRlcnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChjdXN0b21TYW1wbGVPcmRlckNvdW50ICYmIHNyYy5wQ3VzdG9tU2FtcGxlT3JkZXJzKSB7CisgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnMgPSBuZXcgc2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlZbY3VzdG9tU2FtcGxlT3JkZXJDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjdXN0b21TYW1wbGVPcmRlckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBDdXN0b21TYW1wbGVPcmRlcnNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYmIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwQ3VzdG9tU2FtcGxlT3JkZXJzKQorICAgICAgICBkZWxldGVbXSBwQ3VzdG9tU2FtcGxlT3JkZXJzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2FtcGxlT3JkZXJUeXBlID0gc3JjLnNhbXBsZU9yZGVyVHlwZTsKKyAgICBjdXN0b21TYW1wbGVPcmRlckNvdW50ID0gc3JjLmN1c3RvbVNhbXBsZU9yZGVyQ291bnQ7CisgICAgcEN1c3RvbVNhbXBsZU9yZGVycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKGN1c3RvbVNhbXBsZU9yZGVyQ291bnQgJiYgc3JjLnBDdXN0b21TYW1wbGVPcmRlcnMpIHsKKyAgICAgICAgcEN1c3RvbVNhbXBsZU9yZGVycyA9IG5ldyBzYWZlX1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVltjdXN0b21TYW1wbGVPcmRlckNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGN1c3RvbVNhbXBsZU9yZGVyQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEN1c3RvbVNhbXBsZU9yZGVyc1tpXS5pbml0aWFsaXplKCZzcmMucEN1c3RvbVNhbXBsZU9yZGVyc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVjo6fnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVigpCit7CisgICAgaWYgKHBDdXN0b21TYW1wbGVPcmRlcnMpCisgICAgICAgIGRlbGV0ZVtdIHBDdXN0b21TYW1wbGVPcmRlcnM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2FtcGxlT3JkZXJUeXBlID0gaW5fc3RydWN0LT5zYW1wbGVPcmRlclR5cGU7CisgICAgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCA9IGluX3N0cnVjdC0+Y3VzdG9tU2FtcGxlT3JkZXJDb3VudDsKKyAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGN1c3RvbVNhbXBsZU9yZGVyQ291bnQgJiYgaW5fc3RydWN0LT5wQ3VzdG9tU2FtcGxlT3JkZXJzKSB7CisgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnMgPSBuZXcgc2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlZbY3VzdG9tU2FtcGxlT3JkZXJDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjdXN0b21TYW1wbGVPcmRlckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBDdXN0b21TYW1wbGVPcmRlcnNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wQ3VzdG9tU2FtcGxlT3JkZXJzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNhbXBsZU9yZGVyVHlwZSA9IHNyYy0+c2FtcGxlT3JkZXJUeXBlOworICAgIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQgPSBzcmMtPmN1c3RvbVNhbXBsZU9yZGVyQ291bnQ7CisgICAgcEN1c3RvbVNhbXBsZU9yZGVycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChjdXN0b21TYW1wbGVPcmRlckNvdW50ICYmIHNyYy0+cEN1c3RvbVNhbXBsZU9yZGVycykgeworICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzID0gbmV3IHNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WW2N1c3RvbVNhbXBsZU9yZGVyQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3VzdG9tU2FtcGxlT3JkZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQ3VzdG9tU2FtcGxlT3JkZXJzW2ldLmluaXRpYWxpemUoJnNyYy0+cEN1c3RvbVNhbXBsZU9yZGVyc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlY6OnNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYoY29uc3QgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHR5cGUoaW5fc3RydWN0LT50eXBlKSwKKyAgICBnZW5lcmFsU2hhZGVyKGluX3N0cnVjdC0+Z2VuZXJhbFNoYWRlciksCisgICAgY2xvc2VzdEhpdFNoYWRlcihpbl9zdHJ1Y3QtPmNsb3Nlc3RIaXRTaGFkZXIpLAorICAgIGFueUhpdFNoYWRlcihpbl9zdHJ1Y3QtPmFueUhpdFNoYWRlciksCisgICAgaW50ZXJzZWN0aW9uU2hhZGVyKGluX3N0cnVjdC0+aW50ZXJzZWN0aW9uU2hhZGVyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVjo6c2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVjo6c2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIGdlbmVyYWxTaGFkZXIgPSBzcmMuZ2VuZXJhbFNoYWRlcjsKKyAgICBjbG9zZXN0SGl0U2hhZGVyID0gc3JjLmNsb3Nlc3RIaXRTaGFkZXI7CisgICAgYW55SGl0U2hhZGVyID0gc3JjLmFueUhpdFNoYWRlcjsKKyAgICBpbnRlcnNlY3Rpb25TaGFkZXIgPSBzcmMuaW50ZXJzZWN0aW9uU2hhZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WJiBzYWZlX1ZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIGdlbmVyYWxTaGFkZXIgPSBzcmMuZ2VuZXJhbFNoYWRlcjsKKyAgICBjbG9zZXN0SGl0U2hhZGVyID0gc3JjLmNsb3Nlc3RIaXRTaGFkZXI7CisgICAgYW55SGl0U2hhZGVyID0gc3JjLmFueUhpdFNoYWRlcjsKKyAgICBpbnRlcnNlY3Rpb25TaGFkZXIgPSBzcmMuaW50ZXJzZWN0aW9uU2hhZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WOjp+c2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB0eXBlID0gaW5fc3RydWN0LT50eXBlOworICAgIGdlbmVyYWxTaGFkZXIgPSBpbl9zdHJ1Y3QtPmdlbmVyYWxTaGFkZXI7CisgICAgY2xvc2VzdEhpdFNoYWRlciA9IGluX3N0cnVjdC0+Y2xvc2VzdEhpdFNoYWRlcjsKKyAgICBhbnlIaXRTaGFkZXIgPSBpbl9zdHJ1Y3QtPmFueUhpdFNoYWRlcjsKKyAgICBpbnRlcnNlY3Rpb25TaGFkZXIgPSBpbl9zdHJ1Y3QtPmludGVyc2VjdGlvblNoYWRlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHR5cGUgPSBzcmMtPnR5cGU7CisgICAgZ2VuZXJhbFNoYWRlciA9IHNyYy0+Z2VuZXJhbFNoYWRlcjsKKyAgICBjbG9zZXN0SGl0U2hhZGVyID0gc3JjLT5jbG9zZXN0SGl0U2hhZGVyOworICAgIGFueUhpdFNoYWRlciA9IHNyYy0+YW55SGl0U2hhZGVyOworICAgIGludGVyc2VjdGlvblNoYWRlciA9IHNyYy0+aW50ZXJzZWN0aW9uU2hhZGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVihjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgc3RhZ2VDb3VudChpbl9zdHJ1Y3QtPnN0YWdlQ291bnQpLAorICAgIHBTdGFnZXMobnVsbHB0ciksCisgICAgZ3JvdXBDb3VudChpbl9zdHJ1Y3QtPmdyb3VwQ291bnQpLAorICAgIHBHcm91cHMobnVsbHB0ciksCisgICAgbWF4UmVjdXJzaW9uRGVwdGgoaW5fc3RydWN0LT5tYXhSZWN1cnNpb25EZXB0aCksCisgICAgbGF5b3V0KGluX3N0cnVjdC0+bGF5b3V0KSwKKyAgICBiYXNlUGlwZWxpbmVIYW5kbGUoaW5fc3RydWN0LT5iYXNlUGlwZWxpbmVIYW5kbGUpLAorICAgIGJhc2VQaXBlbGluZUluZGV4KGluX3N0cnVjdC0+YmFzZVBpcGVsaW5lSW5kZXgpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChzdGFnZUNvdW50ICYmIGluX3N0cnVjdC0+cFN0YWdlcykgeworICAgICAgICBwU3RhZ2VzID0gbmV3IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1tzdGFnZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0YWdlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN0YWdlc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBTdGFnZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChncm91cENvdW50ICYmIGluX3N0cnVjdC0+cEdyb3VwcykgeworICAgICAgICBwR3JvdXBzID0gbmV3IHNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlZbZ3JvdXBDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBncm91cENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBHcm91cHNbaV0uaW5pdGlhbGl6ZSgmaW5fc3RydWN0LT5wR3JvdXBzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwU3RhZ2VzKG51bGxwdHIpLAorICAgIHBHcm91cHMobnVsbHB0cikKK3t9CisKK3NhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY6OnNhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHN0YWdlQ291bnQgPSBzcmMuc3RhZ2VDb3VudDsKKyAgICBwU3RhZ2VzID0gbnVsbHB0cjsKKyAgICBncm91cENvdW50ID0gc3JjLmdyb3VwQ291bnQ7CisgICAgcEdyb3VwcyA9IG51bGxwdHI7CisgICAgbWF4UmVjdXJzaW9uRGVwdGggPSBzcmMubWF4UmVjdXJzaW9uRGVwdGg7CisgICAgbGF5b3V0ID0gc3JjLmxheW91dDsKKyAgICBiYXNlUGlwZWxpbmVIYW5kbGUgPSBzcmMuYmFzZVBpcGVsaW5lSGFuZGxlOworICAgIGJhc2VQaXBlbGluZUluZGV4ID0gc3JjLmJhc2VQaXBlbGluZUluZGV4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzdGFnZUNvdW50ICYmIHNyYy5wU3RhZ2VzKSB7CisgICAgICAgIHBTdGFnZXMgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvW3N0YWdlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3RhZ2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU3RhZ2VzW2ldLmluaXRpYWxpemUoJnNyYy5wU3RhZ2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZ3JvdXBDb3VudCAmJiBzcmMucEdyb3VwcykgeworICAgICAgICBwR3JvdXBzID0gbmV3IHNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlZbZ3JvdXBDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBncm91cENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBHcm91cHNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBHcm91cHNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WJiBzYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwU3RhZ2VzKQorICAgICAgICBkZWxldGVbXSBwU3RhZ2VzOworICAgIGlmIChwR3JvdXBzKQorICAgICAgICBkZWxldGVbXSBwR3JvdXBzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgc3RhZ2VDb3VudCA9IHNyYy5zdGFnZUNvdW50OworICAgIHBTdGFnZXMgPSBudWxscHRyOworICAgIGdyb3VwQ291bnQgPSBzcmMuZ3JvdXBDb3VudDsKKyAgICBwR3JvdXBzID0gbnVsbHB0cjsKKyAgICBtYXhSZWN1cnNpb25EZXB0aCA9IHNyYy5tYXhSZWN1cnNpb25EZXB0aDsKKyAgICBsYXlvdXQgPSBzcmMubGF5b3V0OworICAgIGJhc2VQaXBlbGluZUhhbmRsZSA9IHNyYy5iYXNlUGlwZWxpbmVIYW5kbGU7CisgICAgYmFzZVBpcGVsaW5lSW5kZXggPSBzcmMuYmFzZVBpcGVsaW5lSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHN0YWdlQ291bnQgJiYgc3JjLnBTdGFnZXMpIHsKKyAgICAgICAgcFN0YWdlcyA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm9bc3RhZ2VDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdGFnZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBTdGFnZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBTdGFnZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChncm91cENvdW50ICYmIHNyYy5wR3JvdXBzKSB7CisgICAgICAgIHBHcm91cHMgPSBuZXcgc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVltncm91cENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdyb3VwQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEdyb3Vwc1tpXS5pbml0aWFsaXplKCZzcmMucEdyb3Vwc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY6On5zYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKCkKK3sKKyAgICBpZiAocFN0YWdlcykKKyAgICAgICAgZGVsZXRlW10gcFN0YWdlczsKKyAgICBpZiAocEdyb3VwcykKKyAgICAgICAgZGVsZXRlW10gcEdyb3VwczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBzdGFnZUNvdW50ID0gaW5fc3RydWN0LT5zdGFnZUNvdW50OworICAgIHBTdGFnZXMgPSBudWxscHRyOworICAgIGdyb3VwQ291bnQgPSBpbl9zdHJ1Y3QtPmdyb3VwQ291bnQ7CisgICAgcEdyb3VwcyA9IG51bGxwdHI7CisgICAgbWF4UmVjdXJzaW9uRGVwdGggPSBpbl9zdHJ1Y3QtPm1heFJlY3Vyc2lvbkRlcHRoOworICAgIGxheW91dCA9IGluX3N0cnVjdC0+bGF5b3V0OworICAgIGJhc2VQaXBlbGluZUhhbmRsZSA9IGluX3N0cnVjdC0+YmFzZVBpcGVsaW5lSGFuZGxlOworICAgIGJhc2VQaXBlbGluZUluZGV4ID0gaW5fc3RydWN0LT5iYXNlUGlwZWxpbmVJbmRleDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKHN0YWdlQ291bnQgJiYgaW5fc3RydWN0LT5wU3RhZ2VzKSB7CisgICAgICAgIHBTdGFnZXMgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvW3N0YWdlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3RhZ2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwU3RhZ2VzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cFN0YWdlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGdyb3VwQ291bnQgJiYgaW5fc3RydWN0LT5wR3JvdXBzKSB7CisgICAgICAgIHBHcm91cHMgPSBuZXcgc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVltncm91cENvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdyb3VwQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEdyb3Vwc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBHcm91cHNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgc3RhZ2VDb3VudCA9IHNyYy0+c3RhZ2VDb3VudDsKKyAgICBwU3RhZ2VzID0gbnVsbHB0cjsKKyAgICBncm91cENvdW50ID0gc3JjLT5ncm91cENvdW50OworICAgIHBHcm91cHMgPSBudWxscHRyOworICAgIG1heFJlY3Vyc2lvbkRlcHRoID0gc3JjLT5tYXhSZWN1cnNpb25EZXB0aDsKKyAgICBsYXlvdXQgPSBzcmMtPmxheW91dDsKKyAgICBiYXNlUGlwZWxpbmVIYW5kbGUgPSBzcmMtPmJhc2VQaXBlbGluZUhhbmRsZTsKKyAgICBiYXNlUGlwZWxpbmVJbmRleCA9IHNyYy0+YmFzZVBpcGVsaW5lSW5kZXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzdGFnZUNvdW50ICYmIHNyYy0+cFN0YWdlcykgeworICAgICAgICBwU3RhZ2VzID0gbmV3IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1tzdGFnZUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0YWdlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcFN0YWdlc1tpXS5pbml0aWFsaXplKCZzcmMtPnBTdGFnZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChncm91cENvdW50ICYmIHNyYy0+cEdyb3VwcykgeworICAgICAgICBwR3JvdXBzID0gbmV3IHNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlZbZ3JvdXBDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBncm91cENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHBHcm91cHNbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wR3JvdXBzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa0dlb21ldHJ5VHJpYW5nbGVzTlY6OnNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WKGNvbnN0IFZrR2VvbWV0cnlUcmlhbmdsZXNOViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgdmVydGV4RGF0YShpbl9zdHJ1Y3QtPnZlcnRleERhdGEpLAorICAgIHZlcnRleE9mZnNldChpbl9zdHJ1Y3QtPnZlcnRleE9mZnNldCksCisgICAgdmVydGV4Q291bnQoaW5fc3RydWN0LT52ZXJ0ZXhDb3VudCksCisgICAgdmVydGV4U3RyaWRlKGluX3N0cnVjdC0+dmVydGV4U3RyaWRlKSwKKyAgICB2ZXJ0ZXhGb3JtYXQoaW5fc3RydWN0LT52ZXJ0ZXhGb3JtYXQpLAorICAgIGluZGV4RGF0YShpbl9zdHJ1Y3QtPmluZGV4RGF0YSksCisgICAgaW5kZXhPZmZzZXQoaW5fc3RydWN0LT5pbmRleE9mZnNldCksCisgICAgaW5kZXhDb3VudChpbl9zdHJ1Y3QtPmluZGV4Q291bnQpLAorICAgIGluZGV4VHlwZShpbl9zdHJ1Y3QtPmluZGV4VHlwZSksCisgICAgdHJhbnNmb3JtRGF0YShpbl9zdHJ1Y3QtPnRyYW5zZm9ybURhdGEpLAorICAgIHRyYW5zZm9ybU9mZnNldChpbl9zdHJ1Y3QtPnRyYW5zZm9ybU9mZnNldCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WOjpzYWZlX1ZrR2VvbWV0cnlUcmlhbmdsZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0dlb21ldHJ5VHJpYW5nbGVzTlY6OnNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WKGNvbnN0IHNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdmVydGV4RGF0YSA9IHNyYy52ZXJ0ZXhEYXRhOworICAgIHZlcnRleE9mZnNldCA9IHNyYy52ZXJ0ZXhPZmZzZXQ7CisgICAgdmVydGV4Q291bnQgPSBzcmMudmVydGV4Q291bnQ7CisgICAgdmVydGV4U3RyaWRlID0gc3JjLnZlcnRleFN0cmlkZTsKKyAgICB2ZXJ0ZXhGb3JtYXQgPSBzcmMudmVydGV4Rm9ybWF0OworICAgIGluZGV4RGF0YSA9IHNyYy5pbmRleERhdGE7CisgICAgaW5kZXhPZmZzZXQgPSBzcmMuaW5kZXhPZmZzZXQ7CisgICAgaW5kZXhDb3VudCA9IHNyYy5pbmRleENvdW50OworICAgIGluZGV4VHlwZSA9IHNyYy5pbmRleFR5cGU7CisgICAgdHJhbnNmb3JtRGF0YSA9IHNyYy50cmFuc2Zvcm1EYXRhOworICAgIHRyYW5zZm9ybU9mZnNldCA9IHNyYy50cmFuc2Zvcm1PZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WJiBzYWZlX1ZrR2VvbWV0cnlUcmlhbmdsZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB2ZXJ0ZXhEYXRhID0gc3JjLnZlcnRleERhdGE7CisgICAgdmVydGV4T2Zmc2V0ID0gc3JjLnZlcnRleE9mZnNldDsKKyAgICB2ZXJ0ZXhDb3VudCA9IHNyYy52ZXJ0ZXhDb3VudDsKKyAgICB2ZXJ0ZXhTdHJpZGUgPSBzcmMudmVydGV4U3RyaWRlOworICAgIHZlcnRleEZvcm1hdCA9IHNyYy52ZXJ0ZXhGb3JtYXQ7CisgICAgaW5kZXhEYXRhID0gc3JjLmluZGV4RGF0YTsKKyAgICBpbmRleE9mZnNldCA9IHNyYy5pbmRleE9mZnNldDsKKyAgICBpbmRleENvdW50ID0gc3JjLmluZGV4Q291bnQ7CisgICAgaW5kZXhUeXBlID0gc3JjLmluZGV4VHlwZTsKKyAgICB0cmFuc2Zvcm1EYXRhID0gc3JjLnRyYW5zZm9ybURhdGE7CisgICAgdHJhbnNmb3JtT2Zmc2V0ID0gc3JjLnRyYW5zZm9ybU9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0dlb21ldHJ5VHJpYW5nbGVzTlY6On5zYWZlX1ZrR2VvbWV0cnlUcmlhbmdsZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0dlb21ldHJ5VHJpYW5nbGVzTlY6OmluaXRpYWxpemUoY29uc3QgVmtHZW9tZXRyeVRyaWFuZ2xlc05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHZlcnRleERhdGEgPSBpbl9zdHJ1Y3QtPnZlcnRleERhdGE7CisgICAgdmVydGV4T2Zmc2V0ID0gaW5fc3RydWN0LT52ZXJ0ZXhPZmZzZXQ7CisgICAgdmVydGV4Q291bnQgPSBpbl9zdHJ1Y3QtPnZlcnRleENvdW50OworICAgIHZlcnRleFN0cmlkZSA9IGluX3N0cnVjdC0+dmVydGV4U3RyaWRlOworICAgIHZlcnRleEZvcm1hdCA9IGluX3N0cnVjdC0+dmVydGV4Rm9ybWF0OworICAgIGluZGV4RGF0YSA9IGluX3N0cnVjdC0+aW5kZXhEYXRhOworICAgIGluZGV4T2Zmc2V0ID0gaW5fc3RydWN0LT5pbmRleE9mZnNldDsKKyAgICBpbmRleENvdW50ID0gaW5fc3RydWN0LT5pbmRleENvdW50OworICAgIGluZGV4VHlwZSA9IGluX3N0cnVjdC0+aW5kZXhUeXBlOworICAgIHRyYW5zZm9ybURhdGEgPSBpbl9zdHJ1Y3QtPnRyYW5zZm9ybURhdGE7CisgICAgdHJhbnNmb3JtT2Zmc2V0ID0gaW5fc3RydWN0LT50cmFuc2Zvcm1PZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHZlcnRleERhdGEgPSBzcmMtPnZlcnRleERhdGE7CisgICAgdmVydGV4T2Zmc2V0ID0gc3JjLT52ZXJ0ZXhPZmZzZXQ7CisgICAgdmVydGV4Q291bnQgPSBzcmMtPnZlcnRleENvdW50OworICAgIHZlcnRleFN0cmlkZSA9IHNyYy0+dmVydGV4U3RyaWRlOworICAgIHZlcnRleEZvcm1hdCA9IHNyYy0+dmVydGV4Rm9ybWF0OworICAgIGluZGV4RGF0YSA9IHNyYy0+aW5kZXhEYXRhOworICAgIGluZGV4T2Zmc2V0ID0gc3JjLT5pbmRleE9mZnNldDsKKyAgICBpbmRleENvdW50ID0gc3JjLT5pbmRleENvdW50OworICAgIGluZGV4VHlwZSA9IHNyYy0+aW5kZXhUeXBlOworICAgIHRyYW5zZm9ybURhdGEgPSBzcmMtPnRyYW5zZm9ybURhdGE7CisgICAgdHJhbnNmb3JtT2Zmc2V0ID0gc3JjLT50cmFuc2Zvcm1PZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrR2VvbWV0cnlBQUJCTlY6OnNhZmVfVmtHZW9tZXRyeUFBQkJOVihjb25zdCBWa0dlb21ldHJ5QUFCQk5WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBhYWJiRGF0YShpbl9zdHJ1Y3QtPmFhYmJEYXRhKSwKKyAgICBudW1BQUJCcyhpbl9zdHJ1Y3QtPm51bUFBQkJzKSwKKyAgICBzdHJpZGUoaW5fc3RydWN0LT5zdHJpZGUpLAorICAgIG9mZnNldChpbl9zdHJ1Y3QtPm9mZnNldCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtHZW9tZXRyeUFBQkJOVjo6c2FmZV9Wa0dlb21ldHJ5QUFCQk5WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrR2VvbWV0cnlBQUJCTlY6OnNhZmVfVmtHZW9tZXRyeUFBQkJOVihjb25zdCBzYWZlX1ZrR2VvbWV0cnlBQUJCTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhYWJiRGF0YSA9IHNyYy5hYWJiRGF0YTsKKyAgICBudW1BQUJCcyA9IHNyYy5udW1BQUJCczsKKyAgICBzdHJpZGUgPSBzcmMuc3RyaWRlOworICAgIG9mZnNldCA9IHNyYy5vZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtHZW9tZXRyeUFBQkJOViYgc2FmZV9Wa0dlb21ldHJ5QUFCQk5WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0dlb21ldHJ5QUFCQk5WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhYWJiRGF0YSA9IHNyYy5hYWJiRGF0YTsKKyAgICBudW1BQUJCcyA9IHNyYy5udW1BQUJCczsKKyAgICBzdHJpZGUgPSBzcmMuc3RyaWRlOworICAgIG9mZnNldCA9IHNyYy5vZmZzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtHZW9tZXRyeUFBQkJOVjo6fnNhZmVfVmtHZW9tZXRyeUFBQkJOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0dlb21ldHJ5QUFCQk5WOjppbml0aWFsaXplKGNvbnN0IFZrR2VvbWV0cnlBQUJCTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgYWFiYkRhdGEgPSBpbl9zdHJ1Y3QtPmFhYmJEYXRhOworICAgIG51bUFBQkJzID0gaW5fc3RydWN0LT5udW1BQUJCczsKKyAgICBzdHJpZGUgPSBpbl9zdHJ1Y3QtPnN0cmlkZTsKKyAgICBvZmZzZXQgPSBpbl9zdHJ1Y3QtPm9mZnNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0dlb21ldHJ5QUFCQk5WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtHZW9tZXRyeUFBQkJOViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBhYWJiRGF0YSA9IHNyYy0+YWFiYkRhdGE7CisgICAgbnVtQUFCQnMgPSBzcmMtPm51bUFBQkJzOworICAgIHN0cmlkZSA9IHNyYy0+c3RyaWRlOworICAgIG9mZnNldCA9IHNyYy0+b2Zmc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0dlb21ldHJ5TlY6OnNhZmVfVmtHZW9tZXRyeU5WKGNvbnN0IFZrR2VvbWV0cnlOViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZ2VvbWV0cnlUeXBlKGluX3N0cnVjdC0+Z2VvbWV0cnlUeXBlKSwKKyAgICBnZW9tZXRyeShpbl9zdHJ1Y3QtPmdlb21ldHJ5KSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0dlb21ldHJ5TlY6OnNhZmVfVmtHZW9tZXRyeU5WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrR2VvbWV0cnlOVjo6c2FmZV9Wa0dlb21ldHJ5TlYoY29uc3Qgc2FmZV9Wa0dlb21ldHJ5TlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBnZW9tZXRyeVR5cGUgPSBzcmMuZ2VvbWV0cnlUeXBlOworICAgIGdlb21ldHJ5ID0gc3JjLmdlb21ldHJ5OworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrR2VvbWV0cnlOViYgc2FmZV9Wa0dlb21ldHJ5TlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrR2VvbWV0cnlOViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZ2VvbWV0cnlUeXBlID0gc3JjLmdlb21ldHJ5VHlwZTsKKyAgICBnZW9tZXRyeSA9IHNyYy5nZW9tZXRyeTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0dlb21ldHJ5TlY6On5zYWZlX1ZrR2VvbWV0cnlOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0dlb21ldHJ5TlY6OmluaXRpYWxpemUoY29uc3QgVmtHZW9tZXRyeU5WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGdlb21ldHJ5VHlwZSA9IGluX3N0cnVjdC0+Z2VvbWV0cnlUeXBlOworICAgIGdlb21ldHJ5ID0gaW5fc3RydWN0LT5nZW9tZXRyeTsKKyAgICBmbGFncyA9IGluX3N0cnVjdC0+ZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtHZW9tZXRyeU5WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtHZW9tZXRyeU5WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGdlb21ldHJ5VHlwZSA9IHNyYy0+Z2VvbWV0cnlUeXBlOworICAgIGdlb21ldHJ5ID0gc3JjLT5nZW9tZXRyeTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjpzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB0eXBlKGluX3N0cnVjdC0+dHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgaW5zdGFuY2VDb3VudChpbl9zdHJ1Y3QtPmluc3RhbmNlQ291bnQpLAorICAgIGdlb21ldHJ5Q291bnQoaW5fc3RydWN0LT5nZW9tZXRyeUNvdW50KSwKKyAgICBwR2VvbWV0cmllcyhudWxscHRyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoZ2VvbWV0cnlDb3VudCAmJiBpbl9zdHJ1Y3QtPnBHZW9tZXRyaWVzKSB7CisgICAgICAgIHBHZW9tZXRyaWVzID0gbmV3IHNhZmVfVmtHZW9tZXRyeU5WW2dlb21ldHJ5Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZ2VvbWV0cnlDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwR2VvbWV0cmllc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBHZW9tZXRyaWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjo6c2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwR2VvbWV0cmllcyhudWxscHRyKQore30KKworc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjo6c2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVihjb25zdCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGluc3RhbmNlQ291bnQgPSBzcmMuaW5zdGFuY2VDb3VudDsKKyAgICBnZW9tZXRyeUNvdW50ID0gc3JjLmdlb21ldHJ5Q291bnQ7CisgICAgcEdlb21ldHJpZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChnZW9tZXRyeUNvdW50ICYmIHNyYy5wR2VvbWV0cmllcykgeworICAgICAgICBwR2VvbWV0cmllcyA9IG5ldyBzYWZlX1ZrR2VvbWV0cnlOVltnZW9tZXRyeUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdlb21ldHJ5Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEdlb21ldHJpZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBHZW9tZXRyaWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViYgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEdlb21ldHJpZXMpCisgICAgICAgIGRlbGV0ZVtdIHBHZW9tZXRyaWVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGluc3RhbmNlQ291bnQgPSBzcmMuaW5zdGFuY2VDb3VudDsKKyAgICBnZW9tZXRyeUNvdW50ID0gc3JjLmdlb21ldHJ5Q291bnQ7CisgICAgcEdlb21ldHJpZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChnZW9tZXRyeUNvdW50ICYmIHNyYy5wR2VvbWV0cmllcykgeworICAgICAgICBwR2VvbWV0cmllcyA9IG5ldyBzYWZlX1ZrR2VvbWV0cnlOVltnZW9tZXRyeUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdlb21ldHJ5Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEdlb21ldHJpZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLnBHZW9tZXRyaWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjo6fnNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYoKQoreworICAgIGlmIChwR2VvbWV0cmllcykKKyAgICAgICAgZGVsZXRlW10gcEdlb21ldHJpZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB0eXBlID0gaW5fc3RydWN0LT50eXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBpbnN0YW5jZUNvdW50ID0gaW5fc3RydWN0LT5pbnN0YW5jZUNvdW50OworICAgIGdlb21ldHJ5Q291bnQgPSBpbl9zdHJ1Y3QtPmdlb21ldHJ5Q291bnQ7CisgICAgcEdlb21ldHJpZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoZ2VvbWV0cnlDb3VudCAmJiBpbl9zdHJ1Y3QtPnBHZW9tZXRyaWVzKSB7CisgICAgICAgIHBHZW9tZXRyaWVzID0gbmV3IHNhZmVfVmtHZW9tZXRyeU5WW2dlb21ldHJ5Q291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZ2VvbWV0cnlDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwR2VvbWV0cmllc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPnBHZW9tZXRyaWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgdHlwZSA9IHNyYy0+dHlwZTsKKyAgICBmbGFncyA9IHNyYy0+ZmxhZ3M7CisgICAgaW5zdGFuY2VDb3VudCA9IHNyYy0+aW5zdGFuY2VDb3VudDsKKyAgICBnZW9tZXRyeUNvdW50ID0gc3JjLT5nZW9tZXRyeUNvdW50OworICAgIHBHZW9tZXRyaWVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKGdlb21ldHJ5Q291bnQgJiYgc3JjLT5wR2VvbWV0cmllcykgeworICAgICAgICBwR2VvbWV0cmllcyA9IG5ldyBzYWZlX1ZrR2VvbWV0cnlOVltnZW9tZXRyeUNvdW50XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdlb21ldHJ5Q291bnQ7ICsraSkgeworICAgICAgICAgICAgcEdlb21ldHJpZXNbaV0uaW5pdGlhbGl6ZSgmc3JjLT5wR2VvbWV0cmllc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlY6OnNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYoY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGNvbXBhY3RlZFNpemUoaW5fc3RydWN0LT5jb21wYWN0ZWRTaXplKSwKKyAgICBpbmZvKCZpbl9zdHJ1Y3QtPmluZm8pCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb21wYWN0ZWRTaXplID0gc3JjLmNvbXBhY3RlZFNpemU7CisgICAgaW5mby5pbml0aWFsaXplKCZzcmMuaW5mbyk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYmIHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb21wYWN0ZWRTaXplID0gc3JjLmNvbXBhY3RlZFNpemU7CisgICAgaW5mby5pbml0aWFsaXplKCZzcmMuaW5mbyk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlY6On5zYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGNvbXBhY3RlZFNpemUgPSBpbl9zdHJ1Y3QtPmNvbXBhY3RlZFNpemU7CisgICAgaW5mby5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPmluZm8pOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgY29tcGFjdGVkU2l6ZSA9IHNyYy0+Y29tcGFjdGVkU2l6ZTsKKyAgICBpbmZvLmluaXRpYWxpemUoJnNyYy0+aW5mbyk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVjo6c2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYoY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUoaW5fc3RydWN0LT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUpLAorICAgIG1lbW9yeShpbl9zdHJ1Y3QtPm1lbW9yeSksCisgICAgbWVtb3J5T2Zmc2V0KGluX3N0cnVjdC0+bWVtb3J5T2Zmc2V0KSwKKyAgICBkZXZpY2VJbmRleENvdW50KGluX3N0cnVjdC0+ZGV2aWNlSW5kZXhDb3VudCksCisgICAgcERldmljZUluZGljZXMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cERldmljZUluZGljZXMpIHsKKyAgICAgICAgcERldmljZUluZGljZXMgPSBuZXcgdWludDMyX3RbaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKWluX3N0cnVjdC0+cERldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqaW5fc3RydWN0LT5kZXZpY2VJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WOjpzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwRGV2aWNlSW5kaWNlcyhudWxscHRyKQore30KKworc2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlY6OnNhZmVfVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKGNvbnN0IHNhZmVfVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlID0gc3JjLmFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICBtZW1vcnkgPSBzcmMubWVtb3J5OworICAgIG1lbW9yeU9mZnNldCA9IHNyYy5tZW1vcnlPZmZzZXQ7CisgICAgZGV2aWNlSW5kZXhDb3VudCA9IHNyYy5kZXZpY2VJbmRleENvdW50OworICAgIHBEZXZpY2VJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBEZXZpY2VJbmRpY2VzKSB7CisgICAgICAgIHBEZXZpY2VJbmRpY2VzID0gbmV3IHVpbnQzMl90W3NyYy5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKXNyYy5wRGV2aWNlSW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSpzcmMuZGV2aWNlSW5kZXhDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViYgc2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRGV2aWNlSW5kaWNlcykKKyAgICAgICAgZGVsZXRlW10gcERldmljZUluZGljZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBzcmMuYWNjZWxlcmF0aW9uU3RydWN0dXJlOworICAgIG1lbW9yeSA9IHNyYy5tZW1vcnk7CisgICAgbWVtb3J5T2Zmc2V0ID0gc3JjLm1lbW9yeU9mZnNldDsKKyAgICBkZXZpY2VJbmRleENvdW50ID0gc3JjLmRldmljZUluZGV4Q291bnQ7CisgICAgcERldmljZUluZGljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucERldmljZUluZGljZXMpIHsKKyAgICAgICAgcERldmljZUluZGljZXMgPSBuZXcgdWludDMyX3Rbc3JjLmRldmljZUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERldmljZUluZGljZXMsICh2b2lkICopc3JjLnBEZXZpY2VJbmRpY2VzLCBzaXplb2YodWludDMyX3QpKnNyYy5kZXZpY2VJbmRleENvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WOjp+c2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYoKQoreworICAgIGlmIChwRGV2aWNlSW5kaWNlcykKKyAgICAgICAgZGVsZXRlW10gcERldmljZUluZGljZXM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlY6OmluaXRpYWxpemUoY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSA9IGluX3N0cnVjdC0+YWNjZWxlcmF0aW9uU3RydWN0dXJlOworICAgIG1lbW9yeSA9IGluX3N0cnVjdC0+bWVtb3J5OworICAgIG1lbW9yeU9mZnNldCA9IGluX3N0cnVjdC0+bWVtb3J5T2Zmc2V0OworICAgIGRldmljZUluZGV4Q291bnQgPSBpbl9zdHJ1Y3QtPmRldmljZUluZGV4Q291bnQ7CisgICAgcERldmljZUluZGljZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wRGV2aWNlSW5kaWNlcykgeworICAgICAgICBwRGV2aWNlSW5kaWNlcyA9IG5ldyB1aW50MzJfdFtpbl9zdHJ1Y3QtPmRldmljZUluZGV4Q291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERldmljZUluZGljZXMsICh2b2lkICopaW5fc3RydWN0LT5wRGV2aWNlSW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSppbl9zdHJ1Y3QtPmRldmljZUluZGV4Q291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBzcmMtPmFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICBtZW1vcnkgPSBzcmMtPm1lbW9yeTsKKyAgICBtZW1vcnlPZmZzZXQgPSBzcmMtPm1lbW9yeU9mZnNldDsKKyAgICBkZXZpY2VJbmRleENvdW50ID0gc3JjLT5kZXZpY2VJbmRleENvdW50OworICAgIHBEZXZpY2VJbmRpY2VzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cERldmljZUluZGljZXMpIHsKKyAgICAgICAgcERldmljZUluZGljZXMgPSBuZXcgdWludDMyX3Rbc3JjLT5kZXZpY2VJbmRleENvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEZXZpY2VJbmRpY2VzLCAodm9pZCAqKXNyYy0+cERldmljZUluZGljZXMsIHNpemVvZih1aW50MzJfdCkqc3JjLT5kZXZpY2VJbmRleENvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjo6c2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50KGluX3N0cnVjdC0+YWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQpLAorICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCAmJiBpbl9zdHJ1Y3QtPnBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzKSB7CisgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzID0gbmV3IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZbYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXNbaV0gPSBpbl9zdHJ1Y3QtPnBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzW2ldOworICAgICAgICB9CisgICAgfQorfQorCitzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY6OnNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcyhudWxscHRyKQore30KKworc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOjpzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQgPSBzcmMuYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ7CisgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCAmJiBzcmMucEFjY2VsZXJhdGlvblN0cnVjdHVyZXMpIHsKKyAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPSBuZXcgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVlthY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpXSA9IHNyYy5wQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WJiBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEFjY2VsZXJhdGlvblN0cnVjdHVyZXMpCisgICAgICAgIGRlbGV0ZVtdIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQgPSBzcmMuYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ7CisgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCAmJiBzcmMucEFjY2VsZXJhdGlvblN0cnVjdHVyZXMpIHsKKyAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPSBuZXcgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVlthY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpXSA9IHNyYy5wQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOjp+c2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCkKK3sKKyAgICBpZiAocEFjY2VsZXJhdGlvblN0cnVjdHVyZXMpCisgICAgICAgIGRlbGV0ZVtdIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjo6aW5pdGlhbGl6ZShjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50ID0gaW5fc3RydWN0LT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDsKKyAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCAmJiBpbl9zdHJ1Y3QtPnBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzKSB7CisgICAgICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzID0gbmV3IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlZbYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnRdOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXNbaV0gPSBpbl9zdHJ1Y3QtPnBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzW2ldOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQgPSBzcmMtPmFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50OworICAgIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKGFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50ICYmIHNyYy0+cEFjY2VsZXJhdGlvblN0cnVjdHVyZXMpIHsKKyAgICAgICAgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPSBuZXcgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVlthY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBwQWNjZWxlcmF0aW9uU3RydWN0dXJlc1tpXSA9IHNyYy0+cEFjY2VsZXJhdGlvblN0cnVjdHVyZXNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlY6OnNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYoY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHR5cGUoaW5fc3RydWN0LT50eXBlKSwKKyAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUoaW5fc3RydWN0LT5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WOjpzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WOjpzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB0eXBlID0gc3JjLnR5cGU7CisgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlID0gc3JjLmFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViYgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHR5cGUgPSBzcmMudHlwZTsKKyAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBzcmMuYWNjZWxlcmF0aW9uU3RydWN0dXJlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WOjp+c2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVjo6aW5pdGlhbGl6ZShjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB0eXBlID0gaW5fc3RydWN0LT50eXBlOworICAgIGFjY2VsZXJhdGlvblN0cnVjdHVyZSA9IGluX3N0cnVjdC0+YWNjZWxlcmF0aW9uU3RydWN0dXJlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgdHlwZSA9IHNyYy0+dHlwZTsKKyAgICBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBzcmMtPmFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRlckdyb3VwSGFuZGxlU2l6ZShpbl9zdHJ1Y3QtPnNoYWRlckdyb3VwSGFuZGxlU2l6ZSksCisgICAgbWF4UmVjdXJzaW9uRGVwdGgoaW5fc3RydWN0LT5tYXhSZWN1cnNpb25EZXB0aCksCisgICAgbWF4U2hhZGVyR3JvdXBTdHJpZGUoaW5fc3RydWN0LT5tYXhTaGFkZXJHcm91cFN0cmlkZSksCisgICAgc2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50KGluX3N0cnVjdC0+c2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50KSwKKyAgICBtYXhHZW9tZXRyeUNvdW50KGluX3N0cnVjdC0+bWF4R2VvbWV0cnlDb3VudCksCisgICAgbWF4SW5zdGFuY2VDb3VudChpbl9zdHJ1Y3QtPm1heEluc3RhbmNlQ291bnQpLAorICAgIG1heFRyaWFuZ2xlQ291bnQoaW5fc3RydWN0LT5tYXhUcmlhbmdsZUNvdW50KSwKKyAgICBtYXhEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlcyhpbl9zdHJ1Y3QtPm1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyR3JvdXBIYW5kbGVTaXplID0gc3JjLnNoYWRlckdyb3VwSGFuZGxlU2l6ZTsKKyAgICBtYXhSZWN1cnNpb25EZXB0aCA9IHNyYy5tYXhSZWN1cnNpb25EZXB0aDsKKyAgICBtYXhTaGFkZXJHcm91cFN0cmlkZSA9IHNyYy5tYXhTaGFkZXJHcm91cFN0cmlkZTsKKyAgICBzaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQgPSBzcmMuc2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50OworICAgIG1heEdlb21ldHJ5Q291bnQgPSBzcmMubWF4R2VvbWV0cnlDb3VudDsKKyAgICBtYXhJbnN0YW5jZUNvdW50ID0gc3JjLm1heEluc3RhbmNlQ291bnQ7CisgICAgbWF4VHJpYW5nbGVDb3VudCA9IHNyYy5tYXhUcmlhbmdsZUNvdW50OworICAgIG1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzID0gc3JjLm1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyR3JvdXBIYW5kbGVTaXplID0gc3JjLnNoYWRlckdyb3VwSGFuZGxlU2l6ZTsKKyAgICBtYXhSZWN1cnNpb25EZXB0aCA9IHNyYy5tYXhSZWN1cnNpb25EZXB0aDsKKyAgICBtYXhTaGFkZXJHcm91cFN0cmlkZSA9IHNyYy5tYXhTaGFkZXJHcm91cFN0cmlkZTsKKyAgICBzaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQgPSBzcmMuc2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50OworICAgIG1heEdlb21ldHJ5Q291bnQgPSBzcmMubWF4R2VvbWV0cnlDb3VudDsKKyAgICBtYXhJbnN0YW5jZUNvdW50ID0gc3JjLm1heEluc3RhbmNlQ291bnQ7CisgICAgbWF4VHJpYW5nbGVDb3VudCA9IHNyYy5tYXhUcmlhbmdsZUNvdW50OworICAgIG1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzID0gc3JjLm1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzaGFkZXJHcm91cEhhbmRsZVNpemUgPSBpbl9zdHJ1Y3QtPnNoYWRlckdyb3VwSGFuZGxlU2l6ZTsKKyAgICBtYXhSZWN1cnNpb25EZXB0aCA9IGluX3N0cnVjdC0+bWF4UmVjdXJzaW9uRGVwdGg7CisgICAgbWF4U2hhZGVyR3JvdXBTdHJpZGUgPSBpbl9zdHJ1Y3QtPm1heFNoYWRlckdyb3VwU3RyaWRlOworICAgIHNoYWRlckdyb3VwQmFzZUFsaWdubWVudCA9IGluX3N0cnVjdC0+c2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50OworICAgIG1heEdlb21ldHJ5Q291bnQgPSBpbl9zdHJ1Y3QtPm1heEdlb21ldHJ5Q291bnQ7CisgICAgbWF4SW5zdGFuY2VDb3VudCA9IGluX3N0cnVjdC0+bWF4SW5zdGFuY2VDb3VudDsKKyAgICBtYXhUcmlhbmdsZUNvdW50ID0gaW5fc3RydWN0LT5tYXhUcmlhbmdsZUNvdW50OworICAgIG1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzID0gaW5fc3RydWN0LT5tYXhEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNoYWRlckdyb3VwSGFuZGxlU2l6ZSA9IHNyYy0+c2hhZGVyR3JvdXBIYW5kbGVTaXplOworICAgIG1heFJlY3Vyc2lvbkRlcHRoID0gc3JjLT5tYXhSZWN1cnNpb25EZXB0aDsKKyAgICBtYXhTaGFkZXJHcm91cFN0cmlkZSA9IHNyYy0+bWF4U2hhZGVyR3JvdXBTdHJpZGU7CisgICAgc2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50ID0gc3JjLT5zaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQ7CisgICAgbWF4R2VvbWV0cnlDb3VudCA9IHNyYy0+bWF4R2VvbWV0cnlDb3VudDsKKyAgICBtYXhJbnN0YW5jZUNvdW50ID0gc3JjLT5tYXhJbnN0YW5jZUNvdW50OworICAgIG1heFRyaWFuZ2xlQ291bnQgPSBzcmMtPm1heFRyaWFuZ2xlQ291bnQ7CisgICAgbWF4RGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPSBzcmMtPm1heERlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3QoaW5fc3RydWN0LT5yZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdCkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdCA9IHNyYy5yZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0ID0gc3JjLnJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlY6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0ID0gaW5fc3RydWN0LT5yZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdCA9IHNyYy0+cmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3Q7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IFZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZShpbl9zdHJ1Y3QtPnJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RW5hYmxlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVjo6c2FmZV9Wa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGUgPSBzcmMucmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYmIHNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZSA9IHNyYy5yZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVjo6fnNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGUgPSBpbl9zdHJ1Y3QtPnJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgcmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RFbmFibGUgPSBzcmMtPnJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RW5hYmxlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgaW1hZ2VWaWV3VHlwZShpbl9zdHJ1Y3QtPmltYWdlVmlld1R5cGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW1hZ2VWaWV3VHlwZSA9IHNyYy5pbWFnZVZpZXdUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW1hZ2VWaWV3VHlwZSA9IHNyYy5pbWFnZVZpZXdUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGltYWdlVmlld1R5cGUgPSBpbl9zdHJ1Y3QtPmltYWdlVmlld1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW1hZ2VWaWV3VHlwZSA9IHNyYy0+aW1hZ2VWaWV3VHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6c2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUKGNvbnN0IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZpbHRlckN1YmljKGluX3N0cnVjdC0+ZmlsdGVyQ3ViaWMpLAorICAgIGZpbHRlckN1YmljTWlubWF4KGluX3N0cnVjdC0+ZmlsdGVyQ3ViaWNNaW5tYXgpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OnNhZmVfVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmlsdGVyQ3ViaWMgPSBzcmMuZmlsdGVyQ3ViaWM7CisgICAgZmlsdGVyQ3ViaWNNaW5tYXggPSBzcmMuZmlsdGVyQ3ViaWNNaW5tYXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCYgc2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmaWx0ZXJDdWJpYyA9IHNyYy5maWx0ZXJDdWJpYzsKKyAgICBmaWx0ZXJDdWJpY01pbm1heCA9IHNyYy5maWx0ZXJDdWJpY01pbm1heDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjp+c2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmaWx0ZXJDdWJpYyA9IGluX3N0cnVjdC0+ZmlsdGVyQ3ViaWM7CisgICAgZmlsdGVyQ3ViaWNNaW5tYXggPSBpbl9zdHJ1Y3QtPmZpbHRlckN1YmljTWlubWF4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZpbHRlckN1YmljID0gc3JjLT5maWx0ZXJDdWJpYzsKKyAgICBmaWx0ZXJDdWJpY01pbm1heCA9IHNyYy0+ZmlsdGVyQ3ViaWNNaW5tYXg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVChjb25zdCBWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBnbG9iYWxQcmlvcml0eShpbl9zdHJ1Y3QtPmdsb2JhbFByaW9yaXR5KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGdsb2JhbFByaW9yaXR5ID0gc3JjLmdsb2JhbFByaW9yaXR5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQmIHNhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZ2xvYmFsUHJpb3JpdHkgPSBzcmMuZ2xvYmFsUHJpb3JpdHk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZ2xvYmFsUHJpb3JpdHkgPSBpbl9zdHJ1Y3QtPmdsb2JhbFByaW9yaXR5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGdsb2JhbFByaW9yaXR5ID0gc3JjLT5nbG9iYWxQcmlvcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ6OnNhZmVfVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQoY29uc3QgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGhhbmRsZVR5cGUoaW5fc3RydWN0LT5oYW5kbGVUeXBlKSwKKyAgICBwSG9zdFBvaW50ZXIoaW5fc3RydWN0LT5wSG9zdFBvaW50ZXIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUOjpzYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBIb3N0UG9pbnRlcihudWxscHRyKQore30KKworc2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVDo6c2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVChjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IHNyYy5oYW5kbGVUeXBlOworICAgIHBIb3N0UG9pbnRlciA9IHNyYy5wSG9zdFBvaW50ZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQmIHNhZmVfVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBoYW5kbGVUeXBlID0gc3JjLmhhbmRsZVR5cGU7CisgICAgcEhvc3RQb2ludGVyID0gc3JjLnBIb3N0UG9pbnRlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVDo6fnNhZmVfVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaGFuZGxlVHlwZSA9IGluX3N0cnVjdC0+aGFuZGxlVHlwZTsKKyAgICBwSG9zdFBvaW50ZXIgPSBpbl9zdHJ1Y3QtPnBIb3N0UG9pbnRlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGhhbmRsZVR5cGUgPSBzcmMtPmhhbmRsZVR5cGU7CisgICAgcEhvc3RQb2ludGVyID0gc3JjLT5wSG9zdFBvaW50ZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKGNvbnN0IFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtZW1vcnlUeXBlQml0cyhpbl9zdHJ1Y3QtPm1lbW9yeVR5cGVCaXRzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDo6c2FmZV9Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDo6c2FmZV9Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5VHlwZUJpdHMgPSBzcmMubWVtb3J5VHlwZUJpdHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQmIHNhZmVfVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnlUeXBlQml0cyA9IHNyYy5tZW1vcnlUeXBlQml0czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVDo6fnNhZmVfVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWVtb3J5VHlwZUJpdHMgPSBpbl9zdHJ1Y3QtPm1lbW9yeVR5cGVCaXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWVtb3J5VHlwZUJpdHMgPSBzcmMtPm1lbW9yeVR5cGVCaXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudChpbl9zdHJ1Y3QtPm1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtaW5JbXBvcnRlZEhvc3RQb2ludGVyQWxpZ25tZW50ID0gc3JjLm1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtaW5JbXBvcnRlZEhvc3RQb2ludGVyQWxpZ25tZW50ID0gc3JjLm1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQgPSBpbl9zdHJ1Y3QtPm1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtaW5JbXBvcnRlZEhvc3RQb2ludGVyQWxpZ25tZW50ID0gc3JjLT5taW5JbXBvcnRlZEhvc3RQb2ludGVyQWxpZ25tZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRDo6c2FmZV9Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRChjb25zdCBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgY29tcGlsZXJDb250cm9sRmxhZ3MoaW5fc3RydWN0LT5jb21waWxlckNvbnRyb2xGbGFncykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQ6OnNhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQ6OnNhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNvbXBpbGVyQ29udHJvbEZsYWdzID0gc3JjLmNvbXBpbGVyQ29udHJvbEZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EJiBzYWZlX1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29tcGlsZXJDb250cm9sRmxhZ3MgPSBzcmMuY29tcGlsZXJDb250cm9sRmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQ6On5zYWZlX1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGNvbXBpbGVyQ29udHJvbEZsYWdzID0gaW5fc3RydWN0LT5jb21waWxlckNvbnRyb2xGbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGNvbXBpbGVyQ29udHJvbEZsYWdzID0gc3JjLT5jb21waWxlckNvbnRyb2xGbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVDo6c2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHRpbWVEb21haW4oaW5fc3RydWN0LT50aW1lRG9tYWluKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUOjpzYWZlX1ZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVDo6c2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKGNvbnN0IHNhZmVfVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHRpbWVEb21haW4gPSBzcmMudGltZURvbWFpbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUJiBzYWZlX1ZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHRpbWVEb21haW4gPSBzcmMudGltZURvbWFpbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUOjp+c2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB0aW1lRG9tYWluID0gaW5fc3RydWN0LT50aW1lRG9tYWluOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHRpbWVEb21haW4gPSBzcmMtPnRpbWVEb21haW47CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzaGFkZXJFbmdpbmVDb3VudChpbl9zdHJ1Y3QtPnNoYWRlckVuZ2luZUNvdW50KSwKKyAgICBzaGFkZXJBcnJheXNQZXJFbmdpbmVDb3VudChpbl9zdHJ1Y3QtPnNoYWRlckFycmF5c1BlckVuZ2luZUNvdW50KSwKKyAgICBjb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheShpbl9zdHJ1Y3QtPmNvbXB1dGVVbml0c1BlclNoYWRlckFycmF5KSwKKyAgICBzaW1kUGVyQ29tcHV0ZVVuaXQoaW5fc3RydWN0LT5zaW1kUGVyQ29tcHV0ZVVuaXQpLAorICAgIHdhdmVmcm9udHNQZXJTaW1kKGluX3N0cnVjdC0+d2F2ZWZyb250c1BlclNpbWQpLAorICAgIHdhdmVmcm9udFNpemUoaW5fc3RydWN0LT53YXZlZnJvbnRTaXplKSwKKyAgICBzZ3Byc1BlclNpbWQoaW5fc3RydWN0LT5zZ3Byc1BlclNpbWQpLAorICAgIG1pblNncHJBbGxvY2F0aW9uKGluX3N0cnVjdC0+bWluU2dwckFsbG9jYXRpb24pLAorICAgIG1heFNncHJBbGxvY2F0aW9uKGluX3N0cnVjdC0+bWF4U2dwckFsbG9jYXRpb24pLAorICAgIHNncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHkoaW5fc3RydWN0LT5zZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5KSwKKyAgICB2Z3Byc1BlclNpbWQoaW5fc3RydWN0LT52Z3Byc1BlclNpbWQpLAorICAgIG1pblZncHJBbGxvY2F0aW9uKGluX3N0cnVjdC0+bWluVmdwckFsbG9jYXRpb24pLAorICAgIG1heFZncHJBbGxvY2F0aW9uKGluX3N0cnVjdC0+bWF4VmdwckFsbG9jYXRpb24pLAorICAgIHZncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHkoaW5fc3RydWN0LT52Z3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJFbmdpbmVDb3VudCA9IHNyYy5zaGFkZXJFbmdpbmVDb3VudDsKKyAgICBzaGFkZXJBcnJheXNQZXJFbmdpbmVDb3VudCA9IHNyYy5zaGFkZXJBcnJheXNQZXJFbmdpbmVDb3VudDsKKyAgICBjb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheSA9IHNyYy5jb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheTsKKyAgICBzaW1kUGVyQ29tcHV0ZVVuaXQgPSBzcmMuc2ltZFBlckNvbXB1dGVVbml0OworICAgIHdhdmVmcm9udHNQZXJTaW1kID0gc3JjLndhdmVmcm9udHNQZXJTaW1kOworICAgIHdhdmVmcm9udFNpemUgPSBzcmMud2F2ZWZyb250U2l6ZTsKKyAgICBzZ3Byc1BlclNpbWQgPSBzcmMuc2dwcnNQZXJTaW1kOworICAgIG1pblNncHJBbGxvY2F0aW9uID0gc3JjLm1pblNncHJBbGxvY2F0aW9uOworICAgIG1heFNncHJBbGxvY2F0aW9uID0gc3JjLm1heFNncHJBbGxvY2F0aW9uOworICAgIHNncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHkgPSBzcmMuc2dwckFsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgICB2Z3Byc1BlclNpbWQgPSBzcmMudmdwcnNQZXJTaW1kOworICAgIG1pblZncHJBbGxvY2F0aW9uID0gc3JjLm1pblZncHJBbGxvY2F0aW9uOworICAgIG1heFZncHJBbGxvY2F0aW9uID0gc3JjLm1heFZncHJBbGxvY2F0aW9uOworICAgIHZncHJBbGxvY2F0aW9uR3JhbnVsYXJpdHkgPSBzcmMudmdwckFsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQmIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHNoYWRlckVuZ2luZUNvdW50ID0gc3JjLnNoYWRlckVuZ2luZUNvdW50OworICAgIHNoYWRlckFycmF5c1BlckVuZ2luZUNvdW50ID0gc3JjLnNoYWRlckFycmF5c1BlckVuZ2luZUNvdW50OworICAgIGNvbXB1dGVVbml0c1BlclNoYWRlckFycmF5ID0gc3JjLmNvbXB1dGVVbml0c1BlclNoYWRlckFycmF5OworICAgIHNpbWRQZXJDb21wdXRlVW5pdCA9IHNyYy5zaW1kUGVyQ29tcHV0ZVVuaXQ7CisgICAgd2F2ZWZyb250c1BlclNpbWQgPSBzcmMud2F2ZWZyb250c1BlclNpbWQ7CisgICAgd2F2ZWZyb250U2l6ZSA9IHNyYy53YXZlZnJvbnRTaXplOworICAgIHNncHJzUGVyU2ltZCA9IHNyYy5zZ3Byc1BlclNpbWQ7CisgICAgbWluU2dwckFsbG9jYXRpb24gPSBzcmMubWluU2dwckFsbG9jYXRpb247CisgICAgbWF4U2dwckFsbG9jYXRpb24gPSBzcmMubWF4U2dwckFsbG9jYXRpb247CisgICAgc2dwckFsbG9jYXRpb25HcmFudWxhcml0eSA9IHNyYy5zZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5OworICAgIHZncHJzUGVyU2ltZCA9IHNyYy52Z3Byc1BlclNpbWQ7CisgICAgbWluVmdwckFsbG9jYXRpb24gPSBzcmMubWluVmdwckFsbG9jYXRpb247CisgICAgbWF4VmdwckFsbG9jYXRpb24gPSBzcmMubWF4VmdwckFsbG9jYXRpb247CisgICAgdmdwckFsbG9jYXRpb25HcmFudWxhcml0eSA9IHNyYy52Z3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRDo6fnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2hhZGVyRW5naW5lQ291bnQgPSBpbl9zdHJ1Y3QtPnNoYWRlckVuZ2luZUNvdW50OworICAgIHNoYWRlckFycmF5c1BlckVuZ2luZUNvdW50ID0gaW5fc3RydWN0LT5zaGFkZXJBcnJheXNQZXJFbmdpbmVDb3VudDsKKyAgICBjb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheSA9IGluX3N0cnVjdC0+Y29tcHV0ZVVuaXRzUGVyU2hhZGVyQXJyYXk7CisgICAgc2ltZFBlckNvbXB1dGVVbml0ID0gaW5fc3RydWN0LT5zaW1kUGVyQ29tcHV0ZVVuaXQ7CisgICAgd2F2ZWZyb250c1BlclNpbWQgPSBpbl9zdHJ1Y3QtPndhdmVmcm9udHNQZXJTaW1kOworICAgIHdhdmVmcm9udFNpemUgPSBpbl9zdHJ1Y3QtPndhdmVmcm9udFNpemU7CisgICAgc2dwcnNQZXJTaW1kID0gaW5fc3RydWN0LT5zZ3Byc1BlclNpbWQ7CisgICAgbWluU2dwckFsbG9jYXRpb24gPSBpbl9zdHJ1Y3QtPm1pblNncHJBbGxvY2F0aW9uOworICAgIG1heFNncHJBbGxvY2F0aW9uID0gaW5fc3RydWN0LT5tYXhTZ3ByQWxsb2NhdGlvbjsKKyAgICBzZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5ID0gaW5fc3RydWN0LT5zZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5OworICAgIHZncHJzUGVyU2ltZCA9IGluX3N0cnVjdC0+dmdwcnNQZXJTaW1kOworICAgIG1pblZncHJBbGxvY2F0aW9uID0gaW5fc3RydWN0LT5taW5WZ3ByQWxsb2NhdGlvbjsKKyAgICBtYXhWZ3ByQWxsb2NhdGlvbiA9IGluX3N0cnVjdC0+bWF4VmdwckFsbG9jYXRpb247CisgICAgdmdwckFsbG9jYXRpb25HcmFudWxhcml0eSA9IGluX3N0cnVjdC0+dmdwckFsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2hhZGVyRW5naW5lQ291bnQgPSBzcmMtPnNoYWRlckVuZ2luZUNvdW50OworICAgIHNoYWRlckFycmF5c1BlckVuZ2luZUNvdW50ID0gc3JjLT5zaGFkZXJBcnJheXNQZXJFbmdpbmVDb3VudDsKKyAgICBjb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheSA9IHNyYy0+Y29tcHV0ZVVuaXRzUGVyU2hhZGVyQXJyYXk7CisgICAgc2ltZFBlckNvbXB1dGVVbml0ID0gc3JjLT5zaW1kUGVyQ29tcHV0ZVVuaXQ7CisgICAgd2F2ZWZyb250c1BlclNpbWQgPSBzcmMtPndhdmVmcm9udHNQZXJTaW1kOworICAgIHdhdmVmcm9udFNpemUgPSBzcmMtPndhdmVmcm9udFNpemU7CisgICAgc2dwcnNQZXJTaW1kID0gc3JjLT5zZ3Byc1BlclNpbWQ7CisgICAgbWluU2dwckFsbG9jYXRpb24gPSBzcmMtPm1pblNncHJBbGxvY2F0aW9uOworICAgIG1heFNncHJBbGxvY2F0aW9uID0gc3JjLT5tYXhTZ3ByQWxsb2NhdGlvbjsKKyAgICBzZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5ID0gc3JjLT5zZ3ByQWxsb2NhdGlvbkdyYW51bGFyaXR5OworICAgIHZncHJzUGVyU2ltZCA9IHNyYy0+dmdwcnNQZXJTaW1kOworICAgIG1pblZncHJBbGxvY2F0aW9uID0gc3JjLT5taW5WZ3ByQWxsb2NhdGlvbjsKKyAgICBtYXhWZ3ByQWxsb2NhdGlvbiA9IHNyYy0+bWF4VmdwckFsbG9jYXRpb247CisgICAgdmdwckFsbG9jYXRpb25HcmFudWxhcml0eSA9IHNyYy0+dmdwckFsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQ6OnNhZmVfVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQoY29uc3QgVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG92ZXJhbGxvY2F0aW9uQmVoYXZpb3IoaW5fc3RydWN0LT5vdmVyYWxsb2NhdGlvbkJlaGF2aW9yKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRDo6c2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRDo6c2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRChjb25zdCBzYWZlX1ZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb3ZlcmFsbG9jYXRpb25CZWhhdmlvciA9IHNyYy5vdmVyYWxsb2NhdGlvbkJlaGF2aW9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EJiBzYWZlX1ZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgb3ZlcmFsbG9jYXRpb25CZWhhdmlvciA9IHNyYy5vdmVyYWxsb2NhdGlvbkJlaGF2aW9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EOjp+c2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRDo6aW5pdGlhbGl6ZShjb25zdCBWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBvdmVyYWxsb2NhdGlvbkJlaGF2aW9yID0gaW5fc3RydWN0LT5vdmVyYWxsb2NhdGlvbkJlaGF2aW9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgb3ZlcmFsbG9jYXRpb25CZWhhdmlvciA9IHNyYy0+b3ZlcmFsbG9jYXRpb25CZWhhdmlvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1heFZlcnRleEF0dHJpYkRpdmlzb3IoaW5fc3RydWN0LT5tYXhWZXJ0ZXhBdHRyaWJEaXZpc29yKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXhWZXJ0ZXhBdHRyaWJEaXZpc29yID0gc3JjLm1heFZlcnRleEF0dHJpYkRpdmlzb3I7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXhWZXJ0ZXhBdHRyaWJEaXZpc29yID0gc3JjLm1heFZlcnRleEF0dHJpYkRpdmlzb3I7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBtYXhWZXJ0ZXhBdHRyaWJEaXZpc29yID0gaW5fc3RydWN0LT5tYXhWZXJ0ZXhBdHRyaWJEaXZpc29yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtYXhWZXJ0ZXhBdHRyaWJEaXZpc29yID0gc3JjLT5tYXhWZXJ0ZXhBdHRyaWJEaXZpc29yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQoY29uc3QgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudChpbl9zdHJ1Y3QtPnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQpLAorICAgIHBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFZlcnRleEJpbmRpbmdEaXZpc29ycykgeworICAgICAgICBwVmVydGV4QmluZGluZ0Rpdmlzb3JzID0gbmV3IFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUW2luX3N0cnVjdC0+dmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmVydGV4QmluZGluZ0Rpdmlzb3JzLCAodm9pZCAqKWluX3N0cnVjdC0+cFZlcnRleEJpbmRpbmdEaXZpc29ycywgc2l6ZW9mKFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUKSppbl9zdHJ1Y3QtPnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFZlcnRleEJpbmRpbmdEaXZpc29ycyhudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudCA9IHNyYy52ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50OworICAgIHBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFZlcnRleEJpbmRpbmdEaXZpc29ycykgeworICAgICAgICBwVmVydGV4QmluZGluZ0Rpdmlzb3JzID0gbmV3IFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUW3NyYy52ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMsICh2b2lkICopc3JjLnBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMsIHNpemVvZihWa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVCkqc3JjLnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFZlcnRleEJpbmRpbmdEaXZpc29ycykKKyAgICAgICAgZGVsZXRlW10gcFZlcnRleEJpbmRpbmdEaXZpc29yczsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQgPSBzcmMudmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudDsKKyAgICBwVmVydGV4QmluZGluZ0Rpdmlzb3JzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMpIHsKKyAgICAgICAgcFZlcnRleEJpbmRpbmdEaXZpc29ycyA9IG5ldyBWa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVFtzcmMudmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmVydGV4QmluZGluZ0Rpdmlzb3JzLCAodm9pZCAqKXNyYy5wVmVydGV4QmluZGluZ0Rpdmlzb3JzLCBzaXplb2YoVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQpKnNyYy52ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMpCisgICAgICAgIGRlbGV0ZVtdIHBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudCA9IGluX3N0cnVjdC0+dmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudDsKKyAgICBwVmVydGV4QmluZGluZ0Rpdmlzb3JzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cFZlcnRleEJpbmRpbmdEaXZpc29ycykgeworICAgICAgICBwVmVydGV4QmluZGluZ0Rpdmlzb3JzID0gbmV3IFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUW2luX3N0cnVjdC0+dmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwVmVydGV4QmluZGluZ0Rpdmlzb3JzLCAodm9pZCAqKWluX3N0cnVjdC0+cFZlcnRleEJpbmRpbmdEaXZpc29ycywgc2l6ZW9mKFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUKSppbl9zdHJ1Y3QtPnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQgPSBzcmMtPnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQ7CisgICAgcFZlcnRleEJpbmRpbmdEaXZpc29ycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMpIHsKKyAgICAgICAgcFZlcnRleEJpbmRpbmdEaXZpc29ycyA9IG5ldyBWa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVFtzcmMtPnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZlcnRleEJpbmRpbmdEaXZpc29ycywgKHZvaWQgKilzcmMtPnBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMsIHNpemVvZihWa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVCkqc3JjLT52ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IoaW5fc3RydWN0LT52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yKSwKKyAgICB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvcihpbl9zdHJ1Y3QtPnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IgPSBzcmMudmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvcjsKKyAgICB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvciA9IHNyYy52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IgPSBzcmMudmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvcjsKKyAgICB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvciA9IHNyYy52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yID0gaW5fc3RydWN0LT52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yOworICAgIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yID0gaW5fc3RydWN0LT52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICB2ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yID0gc3JjLT52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yOworICAgIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yID0gc3JjLT52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorCisKK3NhZmVfVmtQcmVzZW50RnJhbWVUb2tlbkdHUDo6c2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQKGNvbnN0IFZrUHJlc2VudEZyYW1lVG9rZW5HR1AqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZyYW1lVG9rZW4oaW5fc3RydWN0LT5mcmFtZVRva2VuKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQOjpzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1AoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQcmVzZW50RnJhbWVUb2tlbkdHUDo6c2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQKGNvbnN0IHNhZmVfVmtQcmVzZW50RnJhbWVUb2tlbkdHUCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZyYW1lVG9rZW4gPSBzcmMuZnJhbWVUb2tlbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQJiBzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1A6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1AmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZyYW1lVG9rZW4gPSBzcmMuZnJhbWVUb2tlbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQOjp+c2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1A6OmluaXRpYWxpemUoY29uc3QgVmtQcmVzZW50RnJhbWVUb2tlbkdHUCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmcmFtZVRva2VuID0gaW5fc3RydWN0LT5mcmFtZVRva2VuOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1A6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZyYW1lVG9rZW4gPSBzcmMtPmZyYW1lVG9rZW47CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKworCitzYWZlX1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQoY29uc3QgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBwUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrKG51bGxwdHIpLAorICAgIHBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQoaW5fc3RydWN0LT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50KSwKKyAgICBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2spIHsKKyAgICAgICAgcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9IG5ldyBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCgqaW5fc3RydWN0LT5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrKTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcykgeworICAgICAgICBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzID0gbmV3IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUW2luX3N0cnVjdC0+cGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzLCAodm9pZCAqKWluX3N0cnVjdC0+cFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcywgc2l6ZW9mKFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUKSppbl9zdHJ1Y3QtPnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ6OnNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2sobnVsbHB0ciksCisgICAgcFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcyhudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ6OnNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9IG51bGxwdHI7CisgICAgcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCA9IHNyYy5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50OworICAgIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjaykgeworICAgICAgICBwUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrID0gbmV3IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUKCpzcmMucFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayk7CisgICAgfQorICAgIGlmIChzcmMucFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcykgeworICAgICAgICBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzID0gbmV3IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUW3NyYy5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MsICh2b2lkICopc3JjLnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MsIHNpemVvZihWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCkqc3JjLnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQmIHNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjaykKKyAgICAgICAgZGVsZXRlIHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2s7CisgICAgaWYgKHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MpCisgICAgICAgIGRlbGV0ZVtdIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3M7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrID0gbnVsbHB0cjsKKyAgICBwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ID0gc3JjLnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQ7CisgICAgcFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrKSB7CisgICAgICAgIHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2sgPSBuZXcgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQoKnNyYy5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrKTsKKyAgICB9CisgICAgaWYgKHNyYy5wUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzKSB7CisgICAgICAgIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgPSBuZXcgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFRbc3JjLnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcywgKHZvaWQgKilzcmMucFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcywgc2l6ZW9mKFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUKSpzcmMucGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjaykKKyAgICAgICAgZGVsZXRlIHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2s7CisgICAgaWYgKHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MpCisgICAgICAgIGRlbGV0ZVtdIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3M7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2sgPSBudWxscHRyOworICAgIHBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQgPSBpbl9zdHJ1Y3QtPnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQ7CisgICAgcFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2spIHsKKyAgICAgICAgcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9IG5ldyBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCgqaW5fc3RydWN0LT5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrKTsKKyAgICB9CisgICAgaWYgKGluX3N0cnVjdC0+cFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcykgeworICAgICAgICBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzID0gbmV3IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUW2luX3N0cnVjdC0+cGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzLCAodm9pZCAqKWluX3N0cnVjdC0+cFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcywgc2l6ZW9mKFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUKSppbl9zdHJ1Y3QtPnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQpOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrID0gbnVsbHB0cjsKKyAgICBwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ID0gc3JjLT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50OworICAgIHBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrKSB7CisgICAgICAgIHBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2sgPSBuZXcgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQoKnNyYy0+cFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayk7CisgICAgfQorICAgIGlmIChzcmMtPnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MpIHsKKyAgICAgICAgcFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcyA9IG5ldyBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVFtzcmMtPnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcywgKHZvaWQgKilzcmMtPnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MsIHNpemVvZihWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCkqc3JjLT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkcyhpbl9zdHJ1Y3QtPmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkcyksCisgICAgY29tcHV0ZURlcml2YXRpdmVHcm91cExpbmVhcihpbl9zdHJ1Y3QtPmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb21wdXRlRGVyaXZhdGl2ZUdyb3VwUXVhZHMgPSBzcmMuY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzOworICAgIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXIgPSBzcmMuY29tcHV0ZURlcml2YXRpdmVHcm91cExpbmVhcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkcyA9IHNyYy5jb21wdXRlRGVyaXZhdGl2ZUdyb3VwUXVhZHM7CisgICAgY29tcHV0ZURlcml2YXRpdmVHcm91cExpbmVhciA9IHNyYy5jb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBjb21wdXRlRGVyaXZhdGl2ZUdyb3VwUXVhZHMgPSBpbl9zdHJ1Y3QtPmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkczsKKyAgICBjb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyID0gaW5fc3RydWN0LT5jb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzID0gc3JjLT5jb21wdXRlRGVyaXZhdGl2ZUdyb3VwUXVhZHM7CisgICAgY29tcHV0ZURlcml2YXRpdmVHcm91cExpbmVhciA9IHNyYy0+Y29tcHV0ZURlcml2YXRpdmVHcm91cExpbmVhcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHRhc2tTaGFkZXIoaW5fc3RydWN0LT50YXNrU2hhZGVyKSwKKyAgICBtZXNoU2hhZGVyKGluX3N0cnVjdC0+bWVzaFNoYWRlcikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdGFza1NoYWRlciA9IHNyYy50YXNrU2hhZGVyOworICAgIG1lc2hTaGFkZXIgPSBzcmMubWVzaFNoYWRlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYmIHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHRhc2tTaGFkZXIgPSBzcmMudGFza1NoYWRlcjsKKyAgICBtZXNoU2hhZGVyID0gc3JjLm1lc2hTaGFkZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB0YXNrU2hhZGVyID0gaW5fc3RydWN0LT50YXNrU2hhZGVyOworICAgIG1lc2hTaGFkZXIgPSBpbl9zdHJ1Y3QtPm1lc2hTaGFkZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHRhc2tTaGFkZXIgPSBzcmMtPnRhc2tTaGFkZXI7CisgICAgbWVzaFNoYWRlciA9IHNyYy0+bWVzaFNoYWRlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIG1heERyYXdNZXNoVGFza3NDb3VudChpbl9zdHJ1Y3QtPm1heERyYXdNZXNoVGFza3NDb3VudCksCisgICAgbWF4VGFza1dvcmtHcm91cEludm9jYXRpb25zKGluX3N0cnVjdC0+bWF4VGFza1dvcmtHcm91cEludm9jYXRpb25zKSwKKyAgICBtYXhUYXNrVG90YWxNZW1vcnlTaXplKGluX3N0cnVjdC0+bWF4VGFza1RvdGFsTWVtb3J5U2l6ZSksCisgICAgbWF4VGFza091dHB1dENvdW50KGluX3N0cnVjdC0+bWF4VGFza091dHB1dENvdW50KSwKKyAgICBtYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnMoaW5fc3RydWN0LT5tYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnMpLAorICAgIG1heE1lc2hUb3RhbE1lbW9yeVNpemUoaW5fc3RydWN0LT5tYXhNZXNoVG90YWxNZW1vcnlTaXplKSwKKyAgICBtYXhNZXNoT3V0cHV0VmVydGljZXMoaW5fc3RydWN0LT5tYXhNZXNoT3V0cHV0VmVydGljZXMpLAorICAgIG1heE1lc2hPdXRwdXRQcmltaXRpdmVzKGluX3N0cnVjdC0+bWF4TWVzaE91dHB1dFByaW1pdGl2ZXMpLAorICAgIG1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnQoaW5fc3RydWN0LT5tYXhNZXNoTXVsdGl2aWV3Vmlld0NvdW50KSwKKyAgICBtZXNoT3V0cHV0UGVyVmVydGV4R3JhbnVsYXJpdHkoaW5fc3RydWN0LT5tZXNoT3V0cHV0UGVyVmVydGV4R3JhbnVsYXJpdHkpLAorICAgIG1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eShpbl9zdHJ1Y3QtPm1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBtYXhUYXNrV29ya0dyb3VwU2l6ZVtpXSA9IGluX3N0cnVjdC0+bWF4VGFza1dvcmtHcm91cFNpemVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgbWF4TWVzaFdvcmtHcm91cFNpemVbaV0gPSBpbl9zdHJ1Y3QtPm1heE1lc2hXb3JrR3JvdXBTaXplW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWF4RHJhd01lc2hUYXNrc0NvdW50ID0gc3JjLm1heERyYXdNZXNoVGFza3NDb3VudDsKKyAgICBtYXhUYXNrV29ya0dyb3VwSW52b2NhdGlvbnMgPSBzcmMubWF4VGFza1dvcmtHcm91cEludm9jYXRpb25zOworICAgIG1heFRhc2tUb3RhbE1lbW9yeVNpemUgPSBzcmMubWF4VGFza1RvdGFsTWVtb3J5U2l6ZTsKKyAgICBtYXhUYXNrT3V0cHV0Q291bnQgPSBzcmMubWF4VGFza091dHB1dENvdW50OworICAgIG1heE1lc2hXb3JrR3JvdXBJbnZvY2F0aW9ucyA9IHNyYy5tYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnM7CisgICAgbWF4TWVzaFRvdGFsTWVtb3J5U2l6ZSA9IHNyYy5tYXhNZXNoVG90YWxNZW1vcnlTaXplOworICAgIG1heE1lc2hPdXRwdXRWZXJ0aWNlcyA9IHNyYy5tYXhNZXNoT3V0cHV0VmVydGljZXM7CisgICAgbWF4TWVzaE91dHB1dFByaW1pdGl2ZXMgPSBzcmMubWF4TWVzaE91dHB1dFByaW1pdGl2ZXM7CisgICAgbWF4TWVzaE11bHRpdmlld1ZpZXdDb3VudCA9IHNyYy5tYXhNZXNoTXVsdGl2aWV3Vmlld0NvdW50OworICAgIG1lc2hPdXRwdXRQZXJWZXJ0ZXhHcmFudWxhcml0eSA9IHNyYy5tZXNoT3V0cHV0UGVyVmVydGV4R3JhbnVsYXJpdHk7CisgICAgbWVzaE91dHB1dFBlclByaW1pdGl2ZUdyYW51bGFyaXR5ID0gc3JjLm1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIG1heFRhc2tXb3JrR3JvdXBTaXplW2ldID0gc3JjLm1heFRhc2tXb3JrR3JvdXBTaXplW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIG1heE1lc2hXb3JrR3JvdXBTaXplW2ldID0gc3JjLm1heE1lc2hXb3JrR3JvdXBTaXplW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1heERyYXdNZXNoVGFza3NDb3VudCA9IHNyYy5tYXhEcmF3TWVzaFRhc2tzQ291bnQ7CisgICAgbWF4VGFza1dvcmtHcm91cEludm9jYXRpb25zID0gc3JjLm1heFRhc2tXb3JrR3JvdXBJbnZvY2F0aW9uczsKKyAgICBtYXhUYXNrVG90YWxNZW1vcnlTaXplID0gc3JjLm1heFRhc2tUb3RhbE1lbW9yeVNpemU7CisgICAgbWF4VGFza091dHB1dENvdW50ID0gc3JjLm1heFRhc2tPdXRwdXRDb3VudDsKKyAgICBtYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnMgPSBzcmMubWF4TWVzaFdvcmtHcm91cEludm9jYXRpb25zOworICAgIG1heE1lc2hUb3RhbE1lbW9yeVNpemUgPSBzcmMubWF4TWVzaFRvdGFsTWVtb3J5U2l6ZTsKKyAgICBtYXhNZXNoT3V0cHV0VmVydGljZXMgPSBzcmMubWF4TWVzaE91dHB1dFZlcnRpY2VzOworICAgIG1heE1lc2hPdXRwdXRQcmltaXRpdmVzID0gc3JjLm1heE1lc2hPdXRwdXRQcmltaXRpdmVzOworICAgIG1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnQgPSBzcmMubWF4TWVzaE11bHRpdmlld1ZpZXdDb3VudDsKKyAgICBtZXNoT3V0cHV0UGVyVmVydGV4R3JhbnVsYXJpdHkgPSBzcmMubWVzaE91dHB1dFBlclZlcnRleEdyYW51bGFyaXR5OworICAgIG1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eSA9IHNyYy5tZXNoT3V0cHV0UGVyUHJpbWl0aXZlR3JhbnVsYXJpdHk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBtYXhUYXNrV29ya0dyb3VwU2l6ZVtpXSA9IHNyYy5tYXhUYXNrV29ya0dyb3VwU2l6ZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBtYXhNZXNoV29ya0dyb3VwU2l6ZVtpXSA9IHNyYy5tYXhNZXNoV29ya0dyb3VwU2l6ZVtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1heERyYXdNZXNoVGFza3NDb3VudCA9IGluX3N0cnVjdC0+bWF4RHJhd01lc2hUYXNrc0NvdW50OworICAgIG1heFRhc2tXb3JrR3JvdXBJbnZvY2F0aW9ucyA9IGluX3N0cnVjdC0+bWF4VGFza1dvcmtHcm91cEludm9jYXRpb25zOworICAgIG1heFRhc2tUb3RhbE1lbW9yeVNpemUgPSBpbl9zdHJ1Y3QtPm1heFRhc2tUb3RhbE1lbW9yeVNpemU7CisgICAgbWF4VGFza091dHB1dENvdW50ID0gaW5fc3RydWN0LT5tYXhUYXNrT3V0cHV0Q291bnQ7CisgICAgbWF4TWVzaFdvcmtHcm91cEludm9jYXRpb25zID0gaW5fc3RydWN0LT5tYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnM7CisgICAgbWF4TWVzaFRvdGFsTWVtb3J5U2l6ZSA9IGluX3N0cnVjdC0+bWF4TWVzaFRvdGFsTWVtb3J5U2l6ZTsKKyAgICBtYXhNZXNoT3V0cHV0VmVydGljZXMgPSBpbl9zdHJ1Y3QtPm1heE1lc2hPdXRwdXRWZXJ0aWNlczsKKyAgICBtYXhNZXNoT3V0cHV0UHJpbWl0aXZlcyA9IGluX3N0cnVjdC0+bWF4TWVzaE91dHB1dFByaW1pdGl2ZXM7CisgICAgbWF4TWVzaE11bHRpdmlld1ZpZXdDb3VudCA9IGluX3N0cnVjdC0+bWF4TWVzaE11bHRpdmlld1ZpZXdDb3VudDsKKyAgICBtZXNoT3V0cHV0UGVyVmVydGV4R3JhbnVsYXJpdHkgPSBpbl9zdHJ1Y3QtPm1lc2hPdXRwdXRQZXJWZXJ0ZXhHcmFudWxhcml0eTsKKyAgICBtZXNoT3V0cHV0UGVyUHJpbWl0aXZlR3JhbnVsYXJpdHkgPSBpbl9zdHJ1Y3QtPm1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBtYXhUYXNrV29ya0dyb3VwU2l6ZVtpXSA9IGluX3N0cnVjdC0+bWF4VGFza1dvcmtHcm91cFNpemVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgbWF4TWVzaFdvcmtHcm91cFNpemVbaV0gPSBpbl9zdHJ1Y3QtPm1heE1lc2hXb3JrR3JvdXBTaXplW2ldOworICAgIH0KK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWF4RHJhd01lc2hUYXNrc0NvdW50ID0gc3JjLT5tYXhEcmF3TWVzaFRhc2tzQ291bnQ7CisgICAgbWF4VGFza1dvcmtHcm91cEludm9jYXRpb25zID0gc3JjLT5tYXhUYXNrV29ya0dyb3VwSW52b2NhdGlvbnM7CisgICAgbWF4VGFza1RvdGFsTWVtb3J5U2l6ZSA9IHNyYy0+bWF4VGFza1RvdGFsTWVtb3J5U2l6ZTsKKyAgICBtYXhUYXNrT3V0cHV0Q291bnQgPSBzcmMtPm1heFRhc2tPdXRwdXRDb3VudDsKKyAgICBtYXhNZXNoV29ya0dyb3VwSW52b2NhdGlvbnMgPSBzcmMtPm1heE1lc2hXb3JrR3JvdXBJbnZvY2F0aW9uczsKKyAgICBtYXhNZXNoVG90YWxNZW1vcnlTaXplID0gc3JjLT5tYXhNZXNoVG90YWxNZW1vcnlTaXplOworICAgIG1heE1lc2hPdXRwdXRWZXJ0aWNlcyA9IHNyYy0+bWF4TWVzaE91dHB1dFZlcnRpY2VzOworICAgIG1heE1lc2hPdXRwdXRQcmltaXRpdmVzID0gc3JjLT5tYXhNZXNoT3V0cHV0UHJpbWl0aXZlczsKKyAgICBtYXhNZXNoTXVsdGl2aWV3Vmlld0NvdW50ID0gc3JjLT5tYXhNZXNoTXVsdGl2aWV3Vmlld0NvdW50OworICAgIG1lc2hPdXRwdXRQZXJWZXJ0ZXhHcmFudWxhcml0eSA9IHNyYy0+bWVzaE91dHB1dFBlclZlcnRleEdyYW51bGFyaXR5OworICAgIG1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eSA9IHNyYy0+bWVzaE91dHB1dFBlclByaW1pdGl2ZUdyYW51bGFyaXR5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIG1heFRhc2tXb3JrR3JvdXBTaXplW2ldID0gc3JjLT5tYXhUYXNrV29ya0dyb3VwU2l6ZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBtYXhNZXNoV29ya0dyb3VwU2l6ZVtpXSA9IHNyYy0+bWF4TWVzaFdvcmtHcm91cFNpemVbaV07CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmcmFnbWVudFNoYWRlckJhcnljZW50cmljKGluX3N0cnVjdC0+ZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyA9IHNyYy5mcmFnbWVudFNoYWRlckJhcnljZW50cmljOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlY6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyA9IHNyYy5mcmFnbWVudFNoYWRlckJhcnljZW50cmljOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVjo6fnNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyA9IGluX3N0cnVjdC0+ZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyA9IHNyYy0+ZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGltYWdlRm9vdHByaW50KGluX3N0cnVjdC0+aW1hZ2VGb290cHJpbnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW1hZ2VGb290cHJpbnQgPSBzcmMuaW1hZ2VGb290cHJpbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbWFnZUZvb3RwcmludCA9IHNyYy5pbWFnZUZvb3RwcmludDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBpbWFnZUZvb3RwcmludCA9IGluX3N0cnVjdC0+aW1hZ2VGb290cHJpbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW1hZ2VGb290cHJpbnQgPSBzcmMtPmltYWdlRm9vdHByaW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlY6OnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50KGluX3N0cnVjdC0+ZXhjbHVzaXZlU2Npc3NvckNvdW50KSwKKyAgICBwRXhjbHVzaXZlU2Npc3NvcnMobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cEV4Y2x1c2l2ZVNjaXNzb3JzKSB7CisgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycyA9IG5ldyBWa1JlY3QyRFtpbl9zdHJ1Y3QtPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRXhjbHVzaXZlU2Npc3NvcnMsICh2b2lkICopaW5fc3RydWN0LT5wRXhjbHVzaXZlU2Npc3NvcnMsIHNpemVvZihWa1JlY3QyRCkqaW5fc3RydWN0LT5leGNsdXNpdmVTY2lzc29yQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlY6OnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBFeGNsdXNpdmVTY2lzc29ycyhudWxscHRyKQore30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlY6OnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50ID0gc3JjLmV4Y2x1c2l2ZVNjaXNzb3JDb3VudDsKKyAgICBwRXhjbHVzaXZlU2Npc3NvcnMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucEV4Y2x1c2l2ZVNjaXNzb3JzKSB7CisgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycyA9IG5ldyBWa1JlY3QyRFtzcmMuZXhjbHVzaXZlU2Npc3NvckNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBFeGNsdXNpdmVTY2lzc29ycywgKHZvaWQgKilzcmMucEV4Y2x1c2l2ZVNjaXNzb3JzLCBzaXplb2YoVmtSZWN0MkQpKnNyYy5leGNsdXNpdmVTY2lzc29yQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYmIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocEV4Y2x1c2l2ZVNjaXNzb3JzKQorICAgICAgICBkZWxldGVbXSBwRXhjbHVzaXZlU2Npc3NvcnM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBleGNsdXNpdmVTY2lzc29yQ291bnQgPSBzcmMuZXhjbHVzaXZlU2Npc3NvckNvdW50OworICAgIHBFeGNsdXNpdmVTY2lzc29ycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wRXhjbHVzaXZlU2Npc3NvcnMpIHsKKyAgICAgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzID0gbmV3IFZrUmVjdDJEW3NyYy5leGNsdXNpdmVTY2lzc29yQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEV4Y2x1c2l2ZVNjaXNzb3JzLCAodm9pZCAqKXNyYy5wRXhjbHVzaXZlU2Npc3NvcnMsIHNpemVvZihWa1JlY3QyRCkqc3JjLmV4Y2x1c2l2ZVNjaXNzb3JDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVjo6fnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKCkKK3sKKyAgICBpZiAocEV4Y2x1c2l2ZVNjaXNzb3JzKQorICAgICAgICBkZWxldGVbXSBwRXhjbHVzaXZlU2Npc3NvcnM7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCA9IGluX3N0cnVjdC0+ZXhjbHVzaXZlU2Npc3NvckNvdW50OworICAgIHBFeGNsdXNpdmVTY2lzc29ycyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBFeGNsdXNpdmVTY2lzc29ycykgeworICAgICAgICBwRXhjbHVzaXZlU2Npc3NvcnMgPSBuZXcgVmtSZWN0MkRbaW5fc3RydWN0LT5leGNsdXNpdmVTY2lzc29yQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEV4Y2x1c2l2ZVNjaXNzb3JzLCAodm9pZCAqKWluX3N0cnVjdC0+cEV4Y2x1c2l2ZVNjaXNzb3JzLCBzaXplb2YoVmtSZWN0MkQpKmluX3N0cnVjdC0+ZXhjbHVzaXZlU2Npc3NvckNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50ID0gc3JjLT5leGNsdXNpdmVTY2lzc29yQ291bnQ7CisgICAgcEV4Y2x1c2l2ZVNjaXNzb3JzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgaWYgKHNyYy0+cEV4Y2x1c2l2ZVNjaXNzb3JzKSB7CisgICAgICAgIHBFeGNsdXNpdmVTY2lzc29ycyA9IG5ldyBWa1JlY3QyRFtzcmMtPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRXhjbHVzaXZlU2Npc3NvcnMsICh2b2lkICopc3JjLT5wRXhjbHVzaXZlU2Npc3NvcnMsIHNpemVvZihWa1JlY3QyRCkqc3JjLT5leGNsdXNpdmVTY2lzc29yQ291bnQpOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZXhjbHVzaXZlU2Npc3Nvcihpbl9zdHJ1Y3QtPmV4Y2x1c2l2ZVNjaXNzb3IpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGV4Y2x1c2l2ZVNjaXNzb3IgPSBzcmMuZXhjbHVzaXZlU2Npc3NvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYmIHNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGV4Y2x1c2l2ZVNjaXNzb3IgPSBzcmMuZXhjbHVzaXZlU2Npc3NvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlY6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlY6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGV4Y2x1c2l2ZVNjaXNzb3IgPSBpbl9zdHJ1Y3QtPmV4Y2x1c2l2ZVNjaXNzb3I7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGV4Y2x1c2l2ZVNjaXNzb3IgPSBzcmMtPmV4Y2x1c2l2ZVNjaXNzb3I7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WOjpzYWZlX1ZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WKGNvbnN0IFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBjaGVja3BvaW50RXhlY3V0aW9uU3RhZ2VNYXNrKGluX3N0cnVjdC0+Y2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFzaykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlY6OnNhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlY6OnNhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYoY29uc3Qgc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNoZWNrcG9pbnRFeGVjdXRpb25TdGFnZU1hc2sgPSBzcmMuY2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFzazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViYgc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNoZWNrcG9pbnRFeGVjdXRpb25TdGFnZU1hc2sgPSBzcmMuY2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFzazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOVjo6fnNhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlY6OmluaXRpYWxpemUoY29uc3QgVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgY2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFzayA9IGluX3N0cnVjdC0+Y2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFzazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOVjo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGNoZWNrcG9pbnRFeGVjdXRpb25TdGFnZU1hc2sgPSBzcmMtPmNoZWNrcG9pbnRFeGVjdXRpb25TdGFnZU1hc2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrQ2hlY2twb2ludERhdGFOVjo6c2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYoY29uc3QgVmtDaGVja3BvaW50RGF0YU5WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzdGFnZShpbl9zdHJ1Y3QtPnN0YWdlKSwKKyAgICBwQ2hlY2twb2ludE1hcmtlcihpbl9zdHJ1Y3QtPnBDaGVja3BvaW50TWFya2VyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlY6OnNhZmVfVmtDaGVja3BvaW50RGF0YU5WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpLAorICAgIHBDaGVja3BvaW50TWFya2VyKG51bGxwdHIpCit7fQorCitzYWZlX1ZrQ2hlY2twb2ludERhdGFOVjo6c2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYoY29uc3Qgc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdGFnZSA9IHNyYy5zdGFnZTsKKyAgICBwQ2hlY2twb2ludE1hcmtlciA9IHNyYy5wQ2hlY2twb2ludE1hcmtlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYmIHNhZmVfVmtDaGVja3BvaW50RGF0YU5WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN0YWdlID0gc3JjLnN0YWdlOworICAgIHBDaGVja3BvaW50TWFya2VyID0gc3JjLnBDaGVja3BvaW50TWFya2VyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrQ2hlY2twb2ludERhdGFOVjo6fnNhZmVfVmtDaGVja3BvaW50RGF0YU5WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ2hlY2twb2ludERhdGFOVjo6aW5pdGlhbGl6ZShjb25zdCBWa0NoZWNrcG9pbnREYXRhTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3RhZ2UgPSBpbl9zdHJ1Y3QtPnN0YWdlOworICAgIHBDaGVja3BvaW50TWFya2VyID0gaW5fc3RydWN0LT5wQ2hlY2twb2ludE1hcmtlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc3RhZ2UgPSBzcmMtPnN0YWdlOworICAgIHBDaGVja3BvaW50TWFya2VyID0gc3JjLT5wQ2hlY2twb2ludE1hcmtlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRlckludGVnZXJGdW5jdGlvbnMyKGluX3N0cnVjdC0+c2hhZGVySW50ZWdlckZ1bmN0aW9uczIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUw6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVySW50ZWdlckZ1bmN0aW9uczIgPSBzcmMuc2hhZGVySW50ZWdlckZ1bmN0aW9uczI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMiA9IHNyYy5zaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUw6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMiA9IGluX3N0cnVjdC0+c2hhZGVySW50ZWdlckZ1bmN0aW9uczI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2hhZGVySW50ZWdlckZ1bmN0aW9uczIgPSBzcmMtPnNoYWRlckludGVnZXJGdW5jdGlvbnMyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUw6OnNhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKGNvbnN0IFZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCogaW5fc3RydWN0KSA6CisgICAgdmFsdWUzMihpbl9zdHJ1Y3QtPnZhbHVlMzIpLAorICAgIHZhbHVlNjQoaW5fc3RydWN0LT52YWx1ZTY0KSwKKyAgICB2YWx1ZUZsb2F0KGluX3N0cnVjdC0+dmFsdWVGbG9hdCksCisgICAgdmFsdWVCb29sKGluX3N0cnVjdC0+dmFsdWVCb29sKQoreworICAgIHZhbHVlU3RyaW5nID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT52YWx1ZVN0cmluZyk7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMOjpzYWZlX1ZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCgpIDoKKyAgICB2YWx1ZVN0cmluZyhudWxscHRyKQore30KKworc2FmZV9Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUw6OnNhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMJiBzcmMpCit7CisgICAgdmFsdWUzMiA9IHNyYy52YWx1ZTMyOworICAgIHZhbHVlNjQgPSBzcmMudmFsdWU2NDsKKyAgICB2YWx1ZUZsb2F0ID0gc3JjLnZhbHVlRmxvYXQ7CisgICAgdmFsdWVCb29sID0gc3JjLnZhbHVlQm9vbDsKKyAgICB2YWx1ZVN0cmluZyA9IFNhZmVTdHJpbmdDb3B5KHNyYy52YWx1ZVN0cmluZyk7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMJiBzYWZlX1ZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHZhbHVlU3RyaW5nKSBkZWxldGUgW10gdmFsdWVTdHJpbmc7CisKKyAgICB2YWx1ZTMyID0gc3JjLnZhbHVlMzI7CisgICAgdmFsdWU2NCA9IHNyYy52YWx1ZTY0OworICAgIHZhbHVlRmxvYXQgPSBzcmMudmFsdWVGbG9hdDsKKyAgICB2YWx1ZUJvb2wgPSBzcmMudmFsdWVCb29sOworICAgIHZhbHVlU3RyaW5nID0gU2FmZVN0cmluZ0NvcHkoc3JjLnZhbHVlU3RyaW5nKTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUw6On5zYWZlX1ZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCgpCit7CisgICAgaWYgKHZhbHVlU3RyaW5nKSBkZWxldGUgW10gdmFsdWVTdHJpbmc7Cit9CisKK3ZvaWQgc2FmZV9Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUw6OmluaXRpYWxpemUoY29uc3QgVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKiBpbl9zdHJ1Y3QpCit7CisgICAgdmFsdWUzMiA9IGluX3N0cnVjdC0+dmFsdWUzMjsKKyAgICB2YWx1ZTY0ID0gaW5fc3RydWN0LT52YWx1ZTY0OworICAgIHZhbHVlRmxvYXQgPSBpbl9zdHJ1Y3QtPnZhbHVlRmxvYXQ7CisgICAgdmFsdWVCb29sID0gaW5fc3RydWN0LT52YWx1ZUJvb2w7CisgICAgdmFsdWVTdHJpbmcgPSBTYWZlU3RyaW5nQ29weShpbl9zdHJ1Y3QtPnZhbHVlU3RyaW5nKTsKK30KKwordm9pZCBzYWZlX1ZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCogc3JjKQoreworICAgIHZhbHVlMzIgPSBzcmMtPnZhbHVlMzI7CisgICAgdmFsdWU2NCA9IHNyYy0+dmFsdWU2NDsKKyAgICB2YWx1ZUZsb2F0ID0gc3JjLT52YWx1ZUZsb2F0OworICAgIHZhbHVlQm9vbCA9IHNyYy0+dmFsdWVCb29sOworICAgIHZhbHVlU3RyaW5nID0gU2FmZVN0cmluZ0NvcHkoc3JjLT52YWx1ZVN0cmluZyk7Cit9CisKK3NhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUw6OnNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwoY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBVc2VyRGF0YShpbl9zdHJ1Y3QtPnBVc2VyRGF0YSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUw6OnNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcFVzZXJEYXRhKG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMOjpzYWZlX1ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKGNvbnN0IHNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwVXNlckRhdGEgPSBzcmMucFVzZXJEYXRhOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMJiBzYWZlX1ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcFVzZXJEYXRhID0gc3JjLnBVc2VyRGF0YTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTDo6fnNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUw6OmluaXRpYWxpemUoY29uc3QgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcFVzZXJEYXRhID0gaW5fc3RydWN0LT5wVXNlckRhdGE7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUw6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwVXNlckRhdGEgPSBzcmMtPnBVc2VyRGF0YTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUw6OnNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwoY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBlcmZvcm1hbmNlQ291bnRlcnNTYW1wbGluZyhpbl9zdHJ1Y3QtPnBlcmZvcm1hbmNlQ291bnRlcnNTYW1wbGluZykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUw6OnNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUw6OnNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwoY29uc3Qgc2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBlcmZvcm1hbmNlQ291bnRlcnNTYW1wbGluZyA9IHNyYy5wZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwmIHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUw6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmcgPSBzcmMucGVyZm9ybWFuY2VDb3VudGVyc1NhbXBsaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMOjp+c2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTDo6aW5pdGlhbGl6ZShjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmcgPSBpbl9zdHJ1Y3QtPnBlcmZvcm1hbmNlQ291bnRlcnNTYW1wbGluZzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBlcmZvcm1hbmNlQ291bnRlcnNTYW1wbGluZyA9IHNyYy0+cGVyZm9ybWFuY2VDb3VudGVyc1NhbXBsaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMOjpzYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwoY29uc3QgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWFya2VyKGluX3N0cnVjdC0+bWFya2VyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMOjpzYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTDo6c2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1hcmtlciA9IHNyYy5tYXJrZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCYgc2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXJrZXIgPSBzcmMubWFya2VyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUw6On5zYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTDo6aW5pdGlhbGl6ZShjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1hcmtlciA9IGluX3N0cnVjdC0+bWFya2VyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUw6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1hcmtlciA9IHNyYy0+bWFya2VyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMOjpzYWZlX1ZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwoY29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWFya2VyKGluX3N0cnVjdC0+bWFya2VyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMOjpzYWZlX1ZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTDo6c2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIG1hcmtlciA9IHNyYy5tYXJrZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCYgc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtYXJrZXIgPSBzcmMubWFya2VyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUw6On5zYWZlX1ZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTDo6aW5pdGlhbGl6ZShjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1hcmtlciA9IGluX3N0cnVjdC0+bWFya2VyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUw6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1hcmtlciA9IHNyYy0+bWFya2VyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUw6OnNhZmVfVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKGNvbnN0IFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgdHlwZShpbl9zdHJ1Y3QtPnR5cGUpLAorICAgIGVuYWJsZShpbl9zdHJ1Y3QtPmVuYWJsZSksCisgICAgcGFyYW1ldGVyKGluX3N0cnVjdC0+cGFyYW1ldGVyKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUw6OnNhZmVfVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTDo6c2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB0eXBlID0gc3JjLnR5cGU7CisgICAgZW5hYmxlID0gc3JjLmVuYWJsZTsKKyAgICBwYXJhbWV0ZXIgPSBzcmMucGFyYW1ldGVyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCYgc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUw6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIGVuYWJsZSA9IHNyYy5lbmFibGU7CisgICAgcGFyYW1ldGVyID0gc3JjLnBhcmFtZXRlcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUw6On5zYWZlX1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUw6OmluaXRpYWxpemUoY29uc3QgVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHR5cGUgPSBpbl9zdHJ1Y3QtPnR5cGU7CisgICAgZW5hYmxlID0gaW5fc3RydWN0LT5lbmFibGU7CisgICAgcGFyYW1ldGVyID0gaW5fc3RydWN0LT5wYXJhbWV0ZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHR5cGUgPSBzcmMtPnR5cGU7CisgICAgZW5hYmxlID0gc3JjLT5lbmFibGU7CisgICAgcGFyYW1ldGVyID0gc3JjLT5wYXJhbWV0ZXI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTDo6c2FmZV9Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwoY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB0eXBlKGluX3N0cnVjdC0+dHlwZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMOjpzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUw6OnNhZmVfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCYgc2FmZV9Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUw6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgdHlwZSA9IHNyYy50eXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTDo6fnNhZmVfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTDo6aW5pdGlhbGl6ZShjb25zdCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgdHlwZSA9IGluX3N0cnVjdC0+dHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUw6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgdHlwZSA9IHNyYy0+dHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHBjaURvbWFpbihpbl9zdHJ1Y3QtPnBjaURvbWFpbiksCisgICAgcGNpQnVzKGluX3N0cnVjdC0+cGNpQnVzKSwKKyAgICBwY2lEZXZpY2UoaW5fc3RydWN0LT5wY2lEZXZpY2UpLAorICAgIHBjaUZ1bmN0aW9uKGluX3N0cnVjdC0+cGNpRnVuY3Rpb24pCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHBjaURvbWFpbiA9IHNyYy5wY2lEb21haW47CisgICAgcGNpQnVzID0gc3JjLnBjaUJ1czsKKyAgICBwY2lEZXZpY2UgPSBzcmMucGNpRGV2aWNlOworICAgIHBjaUZ1bmN0aW9uID0gc3JjLnBjaUZ1bmN0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcGNpRG9tYWluID0gc3JjLnBjaURvbWFpbjsKKyAgICBwY2lCdXMgPSBzcmMucGNpQnVzOworICAgIHBjaURldmljZSA9IHNyYy5wY2lEZXZpY2U7CisgICAgcGNpRnVuY3Rpb24gPSBzcmMucGNpRnVuY3Rpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBwY2lEb21haW4gPSBpbl9zdHJ1Y3QtPnBjaURvbWFpbjsKKyAgICBwY2lCdXMgPSBpbl9zdHJ1Y3QtPnBjaUJ1czsKKyAgICBwY2lEZXZpY2UgPSBpbl9zdHJ1Y3QtPnBjaURldmljZTsKKyAgICBwY2lGdW5jdGlvbiA9IGluX3N0cnVjdC0+cGNpRnVuY3Rpb247CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBjaURvbWFpbiA9IHNyYy0+cGNpRG9tYWluOworICAgIHBjaUJ1cyA9IHNyYy0+cGNpQnVzOworICAgIHBjaURldmljZSA9IHNyYy0+cGNpRGV2aWNlOworICAgIHBjaUZ1bmN0aW9uID0gc3JjLT5wY2lGdW5jdGlvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRDo6c2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EKGNvbnN0IFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGxvY2FsRGltbWluZ1N1cHBvcnQoaW5fc3RydWN0LT5sb2NhbERpbW1pbmdTdXBwb3J0KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EOjpzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRDo6c2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EKGNvbnN0IHNhZmVfVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGxvY2FsRGltbWluZ1N1cHBvcnQgPSBzcmMubG9jYWxEaW1taW5nU3VwcG9ydDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EJiBzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGxvY2FsRGltbWluZ1N1cHBvcnQgPSBzcmMubG9jYWxEaW1taW5nU3VwcG9ydDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EOjp+c2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ6OmluaXRpYWxpemUoY29uc3QgVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBsb2NhbERpbW1pbmdTdXBwb3J0ID0gaW5fc3RydWN0LT5sb2NhbERpbW1pbmdTdXBwb3J0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGxvY2FsRGltbWluZ1N1cHBvcnQgPSBzcmMtPmxvY2FsRGltbWluZ1N1cHBvcnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQ6OnNhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRChjb25zdCBWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBsb2NhbERpbW1pbmdFbmFibGUoaW5fc3RydWN0LT5sb2NhbERpbW1pbmdFbmFibGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQ6OnNhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EOjpzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQoY29uc3Qgc2FmZV9Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbG9jYWxEaW1taW5nRW5hYmxlID0gc3JjLmxvY2FsRGltbWluZ0VuYWJsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EJiBzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGxvY2FsRGltbWluZ0VuYWJsZSA9IHNyYy5sb2NhbERpbW1pbmdFbmFibGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRDo6fnNhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EOjppbml0aWFsaXplKGNvbnN0IFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbG9jYWxEaW1taW5nRW5hYmxlID0gaW5fc3RydWN0LT5sb2NhbERpbW1pbmdFbmFibGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbG9jYWxEaW1taW5nRW5hYmxlID0gc3JjLT5sb2NhbERpbW1pbmdFbmFibGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKKworc2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQTo6c2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQShjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncyksCisgICAgaW1hZ2VQaXBlSGFuZGxlKGluX3N0cnVjdC0+aW1hZ2VQaXBlSGFuZGxlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQTo6c2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQTo6c2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQShjb25zdCBzYWZlX1ZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgaW1hZ2VQaXBlSGFuZGxlID0gc3JjLmltYWdlUGlwZUhhbmRsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSYgc2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQTo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIGltYWdlUGlwZUhhbmRsZSA9IHNyYy5pbWFnZVBpcGVIYW5kbGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUE6On5zYWZlX1ZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBOjppbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBpbWFnZVBpcGVIYW5kbGUgPSBpbl9zdHJ1Y3QtPmltYWdlUGlwZUhhbmRsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQTo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBpbWFnZVBpcGVIYW5kbGUgPSBzcmMtPmltYWdlUGlwZUhhbmRsZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKworCitzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQoY29uc3QgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBwTGF5ZXIobnVsbHB0cikKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgaWYgKGluX3N0cnVjdC0+cExheWVyKSB7CisgICAgICAgIHBMYXllciA9IG5ldyBDQU1ldGFsTGF5ZXIoKmluX3N0cnVjdC0+cExheWVyKTsKKyAgICB9Cit9CisKK3NhZmVfVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKSwKKyAgICBwTGF5ZXIobnVsbHB0cikKK3t9CisKK3NhZmVfVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZsYWdzID0gc3JjLmZsYWdzOworICAgIHBMYXllciA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgaWYgKHNyYy5wTGF5ZXIpIHsKKyAgICAgICAgcExheWVyID0gbmV3IENBTWV0YWxMYXllcigqc3JjLnBMYXllcik7CisgICAgfQorfQorCitzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCYgc2FmZV9Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTGF5ZXIpCisgICAgICAgIGRlbGV0ZSBwTGF5ZXI7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBwTGF5ZXIgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucExheWVyKSB7CisgICAgICAgIHBMYXllciA9IG5ldyBDQU1ldGFsTGF5ZXIoKnNyYy5wTGF5ZXIpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQ6On5zYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBMYXllcikKKyAgICAgICAgZGVsZXRlIHBMYXllcjsKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIHBMYXllciA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBMYXllcikgeworICAgICAgICBwTGF5ZXIgPSBuZXcgQ0FNZXRhbExheWVyKCppbl9zdHJ1Y3QtPnBMYXllcik7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZsYWdzID0gc3JjLT5mbGFnczsKKyAgICBwTGF5ZXIgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBpZiAoc3JjLT5wTGF5ZXIpIHsKKyAgICAgICAgcExheWVyID0gbmV3IENBTWV0YWxMYXllcigqc3JjLT5wTGF5ZXIpOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCisKKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZnJhZ21lbnREZW5zaXR5TWFwKGluX3N0cnVjdC0+ZnJhZ21lbnREZW5zaXR5TWFwKSwKKyAgICBmcmFnbWVudERlbnNpdHlNYXBEeW5hbWljKGluX3N0cnVjdC0+ZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYyksCisgICAgZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlcyhpbl9zdHJ1Y3QtPmZyYWdtZW50RGVuc2l0eU1hcE5vblN1YnNhbXBsZWRJbWFnZXMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZyYWdtZW50RGVuc2l0eU1hcCA9IHNyYy5mcmFnbWVudERlbnNpdHlNYXA7CisgICAgZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYyA9IHNyYy5mcmFnbWVudERlbnNpdHlNYXBEeW5hbWljOworICAgIGZyYWdtZW50RGVuc2l0eU1hcE5vblN1YnNhbXBsZWRJbWFnZXMgPSBzcmMuZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZyYWdtZW50RGVuc2l0eU1hcCA9IHNyYy5mcmFnbWVudERlbnNpdHlNYXA7CisgICAgZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYyA9IHNyYy5mcmFnbWVudERlbnNpdHlNYXBEeW5hbWljOworICAgIGZyYWdtZW50RGVuc2l0eU1hcE5vblN1YnNhbXBsZWRJbWFnZXMgPSBzcmMuZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZyYWdtZW50RGVuc2l0eU1hcCA9IGluX3N0cnVjdC0+ZnJhZ21lbnREZW5zaXR5TWFwOworICAgIGZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWMgPSBpbl9zdHJ1Y3QtPmZyYWdtZW50RGVuc2l0eU1hcER5bmFtaWM7CisgICAgZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlcyA9IGluX3N0cnVjdC0+ZnJhZ21lbnREZW5zaXR5TWFwTm9uU3Vic2FtcGxlZEltYWdlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZnJhZ21lbnREZW5zaXR5TWFwID0gc3JjLT5mcmFnbWVudERlbnNpdHlNYXA7CisgICAgZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYyA9IHNyYy0+ZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYzsKKyAgICBmcmFnbWVudERlbnNpdHlNYXBOb25TdWJzYW1wbGVkSW1hZ2VzID0gc3JjLT5mcmFnbWVudERlbnNpdHlNYXBOb25TdWJzYW1wbGVkSW1hZ2VzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplKGluX3N0cnVjdC0+bWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplKSwKKyAgICBtYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemUoaW5fc3RydWN0LT5tYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemUpLAorICAgIGZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zKGluX3N0cnVjdC0+ZnJhZ21lbnREZW5zaXR5SW52b2NhdGlvbnMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtaW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemUgPSBzcmMubWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplOworICAgIG1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSA9IHNyYy5tYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemU7CisgICAgZnJhZ21lbnREZW5zaXR5SW52b2NhdGlvbnMgPSBzcmMuZnJhZ21lbnREZW5zaXR5SW52b2NhdGlvbnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtaW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemUgPSBzcmMubWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplOworICAgIG1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSA9IHNyYy5tYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemU7CisgICAgZnJhZ21lbnREZW5zaXR5SW52b2NhdGlvbnMgPSBzcmMuZnJhZ21lbnREZW5zaXR5SW52b2NhdGlvbnM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSA9IGluX3N0cnVjdC0+bWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplOworICAgIG1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSA9IGluX3N0cnVjdC0+bWF4RnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplOworICAgIGZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zID0gaW5fc3RydWN0LT5mcmFnbWVudERlbnNpdHlJbnZvY2F0aW9uczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIG1pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSA9IHNyYy0+bWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplOworICAgIG1heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZSA9IHNyYy0+bWF4RnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplOworICAgIGZyYWdtZW50RGVuc2l0eUludm9jYXRpb25zID0gc3JjLT5mcmFnbWVudERlbnNpdHlJbnZvY2F0aW9uczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUKGNvbnN0IFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQoaW5fc3RydWN0LT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgPSBzcmMuZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgPSBzcmMuZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUOjp+c2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBmcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50ID0gaW5fc3RydWN0LT5mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgPSBzcmMtPmZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzY2FsYXJCbG9ja0xheW91dChpbl9zdHJ1Y3QtPnNjYWxhckJsb2NrTGF5b3V0KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2NhbGFyQmxvY2tMYXlvdXQgPSBzcmMuc2NhbGFyQmxvY2tMYXlvdXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzY2FsYXJCbG9ja0xheW91dCA9IHNyYy5zY2FsYXJCbG9ja0xheW91dDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc2NhbGFyQmxvY2tMYXlvdXQgPSBpbl9zdHJ1Y3QtPnNjYWxhckJsb2NrTGF5b3V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgc2NhbGFyQmxvY2tMYXlvdXQgPSBzcmMtPnNjYWxhckJsb2NrTGF5b3V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc3ViZ3JvdXBTaXplQ29udHJvbChpbl9zdHJ1Y3QtPnN1Ymdyb3VwU2l6ZUNvbnRyb2wpLAorICAgIGNvbXB1dGVGdWxsU3ViZ3JvdXBzKGluX3N0cnVjdC0+Y29tcHV0ZUZ1bGxTdWJncm91cHMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3ViZ3JvdXBTaXplQ29udHJvbCA9IHNyYy5zdWJncm91cFNpemVDb250cm9sOworICAgIGNvbXB1dGVGdWxsU3ViZ3JvdXBzID0gc3JjLmNvbXB1dGVGdWxsU3ViZ3JvdXBzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3ViZ3JvdXBTaXplQ29udHJvbCA9IHNyYy5zdWJncm91cFNpemVDb250cm9sOworICAgIGNvbXB1dGVGdWxsU3ViZ3JvdXBzID0gc3JjLmNvbXB1dGVGdWxsU3ViZ3JvdXBzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHN1Ymdyb3VwU2l6ZUNvbnRyb2wgPSBpbl9zdHJ1Y3QtPnN1Ymdyb3VwU2l6ZUNvbnRyb2w7CisgICAgY29tcHV0ZUZ1bGxTdWJncm91cHMgPSBpbl9zdHJ1Y3QtPmNvbXB1dGVGdWxsU3ViZ3JvdXBzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHN1Ymdyb3VwU2l6ZUNvbnRyb2wgPSBzcmMtPnN1Ymdyb3VwU2l6ZUNvbnRyb2w7CisgICAgY29tcHV0ZUZ1bGxTdWJncm91cHMgPSBzcmMtPmNvbXB1dGVGdWxsU3ViZ3JvdXBzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbWluU3ViZ3JvdXBTaXplKGluX3N0cnVjdC0+bWluU3ViZ3JvdXBTaXplKSwKKyAgICBtYXhTdWJncm91cFNpemUoaW5fc3RydWN0LT5tYXhTdWJncm91cFNpemUpLAorICAgIG1heENvbXB1dGVXb3JrZ3JvdXBTdWJncm91cHMoaW5fc3RydWN0LT5tYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzKSwKKyAgICByZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlcyhpbl9zdHJ1Y3QtPnJlcXVpcmVkU3ViZ3JvdXBTaXplU3RhZ2VzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtaW5TdWJncm91cFNpemUgPSBzcmMubWluU3ViZ3JvdXBTaXplOworICAgIG1heFN1Ymdyb3VwU2l6ZSA9IHNyYy5tYXhTdWJncm91cFNpemU7CisgICAgbWF4Q29tcHV0ZVdvcmtncm91cFN1Ymdyb3VwcyA9IHNyYy5tYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzOworICAgIHJlcXVpcmVkU3ViZ3JvdXBTaXplU3RhZ2VzID0gc3JjLnJlcXVpcmVkU3ViZ3JvdXBTaXplU3RhZ2VzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWluU3ViZ3JvdXBTaXplID0gc3JjLm1pblN1Ymdyb3VwU2l6ZTsKKyAgICBtYXhTdWJncm91cFNpemUgPSBzcmMubWF4U3ViZ3JvdXBTaXplOworICAgIG1heENvbXB1dGVXb3JrZ3JvdXBTdWJncm91cHMgPSBzcmMubWF4Q29tcHV0ZVdvcmtncm91cFN1Ymdyb3VwczsKKyAgICByZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlcyA9IHNyYy5yZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIG1pblN1Ymdyb3VwU2l6ZSA9IGluX3N0cnVjdC0+bWluU3ViZ3JvdXBTaXplOworICAgIG1heFN1Ymdyb3VwU2l6ZSA9IGluX3N0cnVjdC0+bWF4U3ViZ3JvdXBTaXplOworICAgIG1heENvbXB1dGVXb3JrZ3JvdXBTdWJncm91cHMgPSBpbl9zdHJ1Y3QtPm1heENvbXB1dGVXb3JrZ3JvdXBTdWJncm91cHM7CisgICAgcmVxdWlyZWRTdWJncm91cFNpemVTdGFnZXMgPSBpbl9zdHJ1Y3QtPnJlcXVpcmVkU3ViZ3JvdXBTaXplU3RhZ2VzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBtaW5TdWJncm91cFNpemUgPSBzcmMtPm1pblN1Ymdyb3VwU2l6ZTsKKyAgICBtYXhTdWJncm91cFNpemUgPSBzcmMtPm1heFN1Ymdyb3VwU2l6ZTsKKyAgICBtYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzID0gc3JjLT5tYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzOworICAgIHJlcXVpcmVkU3ViZ3JvdXBTaXplU3RhZ2VzID0gc3JjLT5yZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVChjb25zdCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHJlcXVpcmVkU3ViZ3JvdXBTaXplKGluX3N0cnVjdC0+cmVxdWlyZWRTdWJncm91cFNpemUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHJlcXVpcmVkU3ViZ3JvdXBTaXplID0gc3JjLnJlcXVpcmVkU3ViZ3JvdXBTaXplOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCYgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVxdWlyZWRTdWJncm91cFNpemUgPSBzcmMucmVxdWlyZWRTdWJncm91cFNpemU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUOjp+c2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICByZXF1aXJlZFN1Ymdyb3VwU2l6ZSA9IGluX3N0cnVjdC0+cmVxdWlyZWRTdWJncm91cFNpemU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHJlcXVpcmVkU3ViZ3JvdXBTaXplID0gc3JjLT5yZXF1aXJlZFN1Ymdyb3VwU2l6ZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHNoYWRlckNvcmVGZWF0dXJlcyhpbl9zdHJ1Y3QtPnNoYWRlckNvcmVGZWF0dXJlcyksCisgICAgYWN0aXZlQ29tcHV0ZVVuaXRDb3VudChpbl9zdHJ1Y3QtPmFjdGl2ZUNvbXB1dGVVbml0Q291bnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyQ29yZUZlYXR1cmVzID0gc3JjLnNoYWRlckNvcmVGZWF0dXJlczsKKyAgICBhY3RpdmVDb21wdXRlVW5pdENvdW50ID0gc3JjLmFjdGl2ZUNvbXB1dGVVbml0Q291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJDb3JlRmVhdHVyZXMgPSBzcmMuc2hhZGVyQ29yZUZlYXR1cmVzOworICAgIGFjdGl2ZUNvbXB1dGVVbml0Q291bnQgPSBzcmMuYWN0aXZlQ29tcHV0ZVVuaXRDb3VudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBzaGFkZXJDb3JlRmVhdHVyZXMgPSBpbl9zdHJ1Y3QtPnNoYWRlckNvcmVGZWF0dXJlczsKKyAgICBhY3RpdmVDb21wdXRlVW5pdENvdW50ID0gaW5fc3RydWN0LT5hY3RpdmVDb21wdXRlVW5pdENvdW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHNoYWRlckNvcmVGZWF0dXJlcyA9IHNyYy0+c2hhZGVyQ29yZUZlYXR1cmVzOworICAgIGFjdGl2ZUNvbXB1dGVVbml0Q291bnQgPSBzcmMtPmFjdGl2ZUNvbXB1dGVVbml0Q291bnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkZXZpY2VDb2hlcmVudE1lbW9yeShpbl9zdHJ1Y3QtPmRldmljZUNvaGVyZW50TWVtb3J5KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGV2aWNlQ29oZXJlbnRNZW1vcnkgPSBzcmMuZGV2aWNlQ29oZXJlbnRNZW1vcnk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQmIHNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBkZXZpY2VDb2hlcmVudE1lbW9yeSA9IHNyYy5kZXZpY2VDb2hlcmVudE1lbW9yeTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRDo6fnNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGV2aWNlQ29oZXJlbnRNZW1vcnkgPSBpbl9zdHJ1Y3QtPmRldmljZUNvaGVyZW50TWVtb3J5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZGV2aWNlQ29oZXJlbnRNZW1vcnkgPSBzcmMtPmRldmljZUNvaGVyZW50TWVtb3J5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9NRU1PUllfSEVBUFM7ICsraSkgeworICAgICAgICBoZWFwQnVkZ2V0W2ldID0gaW5fc3RydWN0LT5oZWFwQnVkZ2V0W2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX01FTU9SWV9IRUFQUzsgKytpKSB7CisgICAgICAgIGhlYXBVc2FnZVtpXSA9IGluX3N0cnVjdC0+aGVhcFVzYWdlW2ldOworICAgIH0KK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9NRU1PUllfSEVBUFM7ICsraSkgeworICAgICAgICBoZWFwQnVkZ2V0W2ldID0gc3JjLmhlYXBCdWRnZXRbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfTUVNT1JZX0hFQVBTOyArK2kpIHsKKyAgICAgICAgaGVhcFVzYWdlW2ldID0gc3JjLmhlYXBVc2FnZVtpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX01FTU9SWV9IRUFQUzsgKytpKSB7CisgICAgICAgIGhlYXBCdWRnZXRbaV0gPSBzcmMuaGVhcEJ1ZGdldFtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9NRU1PUllfSEVBUFM7ICsraSkgeworICAgICAgICBoZWFwVXNhZ2VbaV0gPSBzcmMuaGVhcFVzYWdlW2ldOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfTUVNT1JZX0hFQVBTOyArK2kpIHsKKyAgICAgICAgaGVhcEJ1ZGdldFtpXSA9IGluX3N0cnVjdC0+aGVhcEJ1ZGdldFtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9NRU1PUllfSEVBUFM7ICsraSkgeworICAgICAgICBoZWFwVXNhZ2VbaV0gPSBpbl9zdHJ1Y3QtPmhlYXBVc2FnZVtpXTsKKyAgICB9Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX01FTU9SWV9IRUFQUzsgKytpKSB7CisgICAgICAgIGhlYXBCdWRnZXRbaV0gPSBzcmMtPmhlYXBCdWRnZXRbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfTUVNT1JZX0hFQVBTOyArK2kpIHsKKyAgICAgICAgaGVhcFVzYWdlW2ldID0gc3JjLT5oZWFwVXNhZ2VbaV07CisgICAgfQorfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBtZW1vcnlQcmlvcml0eShpbl9zdHJ1Y3QtPm1lbW9yeVByaW9yaXR5KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbWVtb3J5UHJpb3JpdHkgPSBzcmMubWVtb3J5UHJpb3JpdHk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBtZW1vcnlQcmlvcml0eSA9IHNyYy5tZW1vcnlQcmlvcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgbWVtb3J5UHJpb3JpdHkgPSBpbl9zdHJ1Y3QtPm1lbW9yeVByaW9yaXR5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbWVtb3J5UHJpb3JpdHkgPSBzcmMtPm1lbW9yeVByaW9yaXR5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUOjpzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQoY29uc3QgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcHJpb3JpdHkoaW5fc3RydWN0LT5wcmlvcml0eSkKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVDo6c2FmZV9Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQ6OnNhZmVfVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwcmlvcml0eSA9IHNyYy5wcmlvcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUJiBzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHByaW9yaXR5ID0gc3JjLnByaW9yaXR5OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQ6On5zYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHByaW9yaXR5ID0gaW5fc3RydWN0LT5wcmlvcml0eTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBwcmlvcml0eSA9IHNyYy0+cHJpb3JpdHk7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBkZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZyhpbl9zdHJ1Y3QtPmRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nID0gc3JjLmRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYmIHNhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmcgPSBzcmMuZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmc7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVjo6fnNhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmcgPSBpbl9zdHJ1Y3QtPmRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nID0gc3JjLT5kZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZzsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGJ1ZmZlckRldmljZUFkZHJlc3MoaW5fc3RydWN0LT5idWZmZXJEZXZpY2VBZGRyZXNzKSwKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheShpbl9zdHJ1Y3QtPmJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5KSwKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UoaW5fc3RydWN0LT5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgYnVmZmVyRGV2aWNlQWRkcmVzcyA9IHNyYy5idWZmZXJEZXZpY2VBZGRyZXNzOworICAgIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5ID0gc3JjLmJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5OworICAgIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSA9IHNyYy5idWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzID0gc3JjLmJ1ZmZlckRldmljZUFkZHJlc3M7CisgICAgYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkgPSBzcmMuYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXk7CisgICAgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlID0gc3JjLmJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzID0gaW5fc3RydWN0LT5idWZmZXJEZXZpY2VBZGRyZXNzOworICAgIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5ID0gaW5fc3RydWN0LT5idWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UgPSBpbl9zdHJ1Y3QtPmJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzID0gc3JjLT5idWZmZXJEZXZpY2VBZGRyZXNzOworICAgIGJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5ID0gc3JjLT5idWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTsKKyAgICBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UgPSBzcmMtPmJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUKGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGRldmljZUFkZHJlc3MoaW5fc3RydWN0LT5kZXZpY2VBZGRyZXNzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRldmljZUFkZHJlc3MgPSBzcmMuZGV2aWNlQWRkcmVzczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGRldmljZUFkZHJlc3MgPSBzcmMuZGV2aWNlQWRkcmVzczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUOjp+c2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBkZXZpY2VBZGRyZXNzID0gaW5fc3RydWN0LT5kZXZpY2VBZGRyZXNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGRldmljZUFkZHJlc3MgPSBzcmMtPmRldmljZUFkZHJlc3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBwdXJwb3Nlcyhpbl9zdHJ1Y3QtPnB1cnBvc2VzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gaW5fc3RydWN0LT5uYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU7ICsraSkgeworICAgICAgICB2ZXJzaW9uW2ldID0gaW5fc3RydWN0LT52ZXJzaW9uW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0RFU0NSSVBUSU9OX1NJWkU7ICsraSkgeworICAgICAgICBkZXNjcmlwdGlvbltpXSA9IGluX3N0cnVjdC0+ZGVzY3JpcHRpb25baV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRTsgKytpKSB7CisgICAgICAgIGxheWVyW2ldID0gaW5fc3RydWN0LT5sYXllcltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcHVycG9zZXMgPSBzcmMucHVycG9zZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFOyArK2kpIHsKKyAgICAgICAgbmFtZVtpXSA9IHNyYy5uYW1lW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU7ICsraSkgeworICAgICAgICB2ZXJzaW9uW2ldID0gc3JjLnZlcnNpb25baV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfREVTQ1JJUFRJT05fU0laRTsgKytpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uW2ldID0gc3JjLmRlc2NyaXB0aW9uW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU7ICsraSkgeworICAgICAgICBsYXllcltpXSA9IHNyYy5sYXllcltpXTsKKyAgICB9Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBwdXJwb3NlcyA9IHNyYy5wdXJwb3NlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU7ICsraSkgeworICAgICAgICBuYW1lW2ldID0gc3JjLm5hbWVbaV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRTsgKytpKSB7CisgICAgICAgIHZlcnNpb25baV0gPSBzcmMudmVyc2lvbltpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgZGVzY3JpcHRpb25baV0gPSBzcmMuZGVzY3JpcHRpb25baV07CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRTsgKytpKSB7CisgICAgICAgIGxheWVyW2ldID0gc3JjLmxheWVyW2ldOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHB1cnBvc2VzID0gaW5fc3RydWN0LT5wdXJwb3NlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFOyArK2kpIHsKKyAgICAgICAgbmFtZVtpXSA9IGluX3N0cnVjdC0+bmFtZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFOyArK2kpIHsKKyAgICAgICAgdmVyc2lvbltpXSA9IGluX3N0cnVjdC0+dmVyc2lvbltpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgZGVzY3JpcHRpb25baV0gPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0aW9uW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU7ICsraSkgeworICAgICAgICBsYXllcltpXSA9IGluX3N0cnVjdC0+bGF5ZXJbaV07CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHB1cnBvc2VzID0gc3JjLT5wdXJwb3NlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFOyArK2kpIHsKKyAgICAgICAgbmFtZVtpXSA9IHNyYy0+bmFtZVtpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFOyArK2kpIHsKKyAgICAgICAgdmVyc2lvbltpXSA9IHNyYy0+dmVyc2lvbltpXTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9ERVNDUklQVElPTl9TSVpFOyArK2kpIHsKKyAgICAgICAgZGVzY3JpcHRpb25baV0gPSBzcmMtPmRlc2NyaXB0aW9uW2ldOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkU7ICsraSkgeworICAgICAgICBsYXllcltpXSA9IHNyYy0+bGF5ZXJbaV07CisgICAgfQorfQorCitzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUKGNvbnN0IFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzdGVuY2lsVXNhZ2UoaW5fc3RydWN0LT5zdGVuY2lsVXNhZ2UpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzdGVuY2lsVXNhZ2UgPSBzcmMuc3RlbmNpbFVzYWdlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3RlbmNpbFVzYWdlID0gc3JjLnN0ZW5jaWxVc2FnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDo6fnNhZmVfVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3RlbmNpbFVzYWdlID0gaW5fc3RydWN0LT5zdGVuY2lsVXNhZ2U7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzdGVuY2lsVXNhZ2UgPSBzcmMtPnN0ZW5jaWxVc2FnZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQ6OnNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQoY29uc3QgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50KGluX3N0cnVjdC0+ZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQpLAorICAgIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzKG51bGxwdHIpLAorICAgIGRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudChpbl9zdHJ1Y3QtPmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCksCisgICAgcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzKG51bGxwdHIpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworICAgIGlmIChpbl9zdHJ1Y3QtPnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzKSB7CisgICAgICAgIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gbmV3IFZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFRbaW5fc3RydWN0LT5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCBzaXplb2YoVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCkqaW5fc3RydWN0LT5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCk7CisgICAgfQorICAgIGlmIChpbl9zdHJ1Y3QtPnBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcykgeworICAgICAgICBwRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBuZXcgVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFRbaW5fc3RydWN0LT5kaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCAodm9pZCAqKWluX3N0cnVjdC0+cERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCBzaXplb2YoVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQpKmluX3N0cnVjdC0+ZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQ6OnNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0ciksCisgICAgcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMobnVsbHB0ciksCisgICAgcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzKG51bGxwdHIpCit7fQorCitzYWZlX1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUOjpzYWZlX1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBlbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCA9IHNyYy5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudDsKKyAgICBwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcyA9IG51bGxwdHI7CisgICAgZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID0gc3JjLmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudDsKKyAgICBwRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworICAgIGlmIChzcmMucEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMpIHsKKyAgICAgICAgcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBuZXcgVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVFtzcmMuZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMsICh2b2lkICopc3JjLnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCBzaXplb2YoVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCkqc3JjLmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50KTsKKyAgICB9CisgICAgaWYgKHNyYy5wRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMpIHsKKyAgICAgICAgcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gbmV3IFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUW3NyYy5kaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCAodm9pZCAqKXNyYy5wRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMsIHNpemVvZihWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVCkqc3JjLmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCk7CisgICAgfQorfQorCitzYWZlX1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUJiBzYWZlX1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcykKKyAgICAgICAgZGVsZXRlW10gcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXM7CisgICAgaWYgKHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcykKKyAgICAgICAgZGVsZXRlW10gcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgPSBzcmMuZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQ7CisgICAgcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBudWxscHRyOworICAgIGRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCA9IHNyYy5kaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQ7CisgICAgcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gbnVsbHB0cjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKyAgICBpZiAoc3JjLnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzKSB7CisgICAgICAgIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gbmV3IFZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFRbc3JjLmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCAodm9pZCAqKXNyYy5wRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcywgc2l6ZW9mKFZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQpKnNyYy5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMucERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzKSB7CisgICAgICAgIHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcyA9IG5ldyBWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVFtzcmMuZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcywgKHZvaWQgKilzcmMucERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCBzaXplb2YoVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQpKnNyYy5kaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVDo6fnNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcykKKyAgICAgICAgZGVsZXRlW10gcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXM7CisgICAgaWYgKHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcykKKyAgICAgICAgZGVsZXRlW10gcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzOworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgPSBpbl9zdHJ1Y3QtPmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50OworICAgIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gbnVsbHB0cjsKKyAgICBkaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgPSBpbl9zdHJ1Y3QtPmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudDsKKyAgICBwRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBudWxscHRyOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKKyAgICBpZiAoaW5fc3RydWN0LT5wRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcykgeworICAgICAgICBwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcyA9IG5ldyBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUW2luX3N0cnVjdC0+ZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMsICh2b2lkICopaW5fc3RydWN0LT5wRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcywgc2l6ZW9mKFZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQpKmluX3N0cnVjdC0+ZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQpOworICAgIH0KKyAgICBpZiAoaW5fc3RydWN0LT5wRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMpIHsKKyAgICAgICAgcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gbmV3IFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUW2luX3N0cnVjdC0+ZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50XTsKKyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcywgc2l6ZW9mKFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUKSppbl9zdHJ1Y3QtPmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCk7CisgICAgfQorfQorCit2b2lkIHNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBlbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCA9IHNyYy0+ZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQ7CisgICAgcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBudWxscHRyOworICAgIGRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCA9IHNyYy0+ZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50OworICAgIHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcyA9IG51bGxwdHI7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworICAgIGlmIChzcmMtPnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzKSB7CisgICAgICAgIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gbmV3IFZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFRbc3JjLT5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudF07CisgICAgICAgIG1lbWNweSAoKHZvaWQgKilwRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcywgKHZvaWQgKilzcmMtPnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCBzaXplb2YoVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCkqc3JjLT5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCk7CisgICAgfQorICAgIGlmIChzcmMtPnBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcykgeworICAgICAgICBwRGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBuZXcgVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFRbc3JjLT5kaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnRdOworICAgICAgICBtZW1jcHkgKCh2b2lkICopcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCAodm9pZCAqKXNyYy0+cERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzLCBzaXplb2YoVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQpKnNyYy0+ZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50KTsKKyAgICB9Cit9CisKK3NhZmVfVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVjo6c2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKGNvbnN0IFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIE1TaXplKGluX3N0cnVjdC0+TVNpemUpLAorICAgIE5TaXplKGluX3N0cnVjdC0+TlNpemUpLAorICAgIEtTaXplKGluX3N0cnVjdC0+S1NpemUpLAorICAgIEFUeXBlKGluX3N0cnVjdC0+QVR5cGUpLAorICAgIEJUeXBlKGluX3N0cnVjdC0+QlR5cGUpLAorICAgIENUeXBlKGluX3N0cnVjdC0+Q1R5cGUpLAorICAgIERUeXBlKGluX3N0cnVjdC0+RFR5cGUpLAorICAgIHNjb3BlKGluX3N0cnVjdC0+c2NvcGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY6OnNhZmVfVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WOjpzYWZlX1ZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoY29uc3Qgc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgTVNpemUgPSBzcmMuTVNpemU7CisgICAgTlNpemUgPSBzcmMuTlNpemU7CisgICAgS1NpemUgPSBzcmMuS1NpemU7CisgICAgQVR5cGUgPSBzcmMuQVR5cGU7CisgICAgQlR5cGUgPSBzcmMuQlR5cGU7CisgICAgQ1R5cGUgPSBzcmMuQ1R5cGU7CisgICAgRFR5cGUgPSBzcmMuRFR5cGU7CisgICAgc2NvcGUgPSBzcmMuc2NvcGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViYgc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBNU2l6ZSA9IHNyYy5NU2l6ZTsKKyAgICBOU2l6ZSA9IHNyYy5OU2l6ZTsKKyAgICBLU2l6ZSA9IHNyYy5LU2l6ZTsKKyAgICBBVHlwZSA9IHNyYy5BVHlwZTsKKyAgICBCVHlwZSA9IHNyYy5CVHlwZTsKKyAgICBDVHlwZSA9IHNyYy5DVHlwZTsKKyAgICBEVHlwZSA9IHNyYy5EVHlwZTsKKyAgICBzY29wZSA9IHNyYy5zY29wZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WOjp+c2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY6OmluaXRpYWxpemUoY29uc3QgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBNU2l6ZSA9IGluX3N0cnVjdC0+TVNpemU7CisgICAgTlNpemUgPSBpbl9zdHJ1Y3QtPk5TaXplOworICAgIEtTaXplID0gaW5fc3RydWN0LT5LU2l6ZTsKKyAgICBBVHlwZSA9IGluX3N0cnVjdC0+QVR5cGU7CisgICAgQlR5cGUgPSBpbl9zdHJ1Y3QtPkJUeXBlOworICAgIENUeXBlID0gaW5fc3RydWN0LT5DVHlwZTsKKyAgICBEVHlwZSA9IGluX3N0cnVjdC0+RFR5cGU7CisgICAgc2NvcGUgPSBpbl9zdHJ1Y3QtPnNjb3BlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIE1TaXplID0gc3JjLT5NU2l6ZTsKKyAgICBOU2l6ZSA9IHNyYy0+TlNpemU7CisgICAgS1NpemUgPSBzcmMtPktTaXplOworICAgIEFUeXBlID0gc3JjLT5BVHlwZTsKKyAgICBCVHlwZSA9IHNyYy0+QlR5cGU7CisgICAgQ1R5cGUgPSBzcmMtPkNUeXBlOworICAgIERUeXBlID0gc3JjLT5EVHlwZTsKKyAgICBzY29wZSA9IHNyYy0+c2NvcGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBjb29wZXJhdGl2ZU1hdHJpeChpbl9zdHJ1Y3QtPmNvb3BlcmF0aXZlTWF0cml4KSwKKyAgICBjb29wZXJhdGl2ZU1hdHJpeFJvYnVzdEJ1ZmZlckFjY2Vzcyhpbl9zdHJ1Y3QtPmNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNvb3BlcmF0aXZlTWF0cml4ID0gc3JjLmNvb3BlcmF0aXZlTWF0cml4OworICAgIGNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzID0gc3JjLmNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYmIHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29vcGVyYXRpdmVNYXRyaXggPSBzcmMuY29vcGVyYXRpdmVNYXRyaXg7CisgICAgY29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3MgPSBzcmMuY29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVjo6fnNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgY29vcGVyYXRpdmVNYXRyaXggPSBpbl9zdHJ1Y3QtPmNvb3BlcmF0aXZlTWF0cml4OworICAgIGNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzID0gaW5fc3RydWN0LT5jb29wZXJhdGl2ZU1hdHJpeFJvYnVzdEJ1ZmZlckFjY2VzczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBjb29wZXJhdGl2ZU1hdHJpeCA9IHNyYy0+Y29vcGVyYXRpdmVNYXRyaXg7CisgICAgY29vcGVyYXRpdmVNYXRyaXhSb2J1c3RCdWZmZXJBY2Nlc3MgPSBzcmMtPmNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgY29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXMoaW5fc3RydWN0LT5jb29wZXJhdGl2ZU1hdHJpeFN1cHBvcnRlZFN0YWdlcykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY6OnNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXMgPSBzcmMuY29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBjb29wZXJhdGl2ZU1hdHJpeFN1cHBvcnRlZFN0YWdlcyA9IHNyYy5jb29wZXJhdGl2ZU1hdHJpeFN1cHBvcnRlZFN0YWdlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzID0gaW5fc3RydWN0LT5jb29wZXJhdGl2ZU1hdHJpeFN1cHBvcnRlZFN0YWdlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgY29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXMgPSBzcmMtPmNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlKGluX3N0cnVjdC0+Y292ZXJhZ2VSZWR1Y3Rpb25Nb2RlKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVjo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlID0gc3JjLmNvdmVyYWdlUmVkdWN0aW9uTW9kZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNvdmVyYWdlUmVkdWN0aW9uTW9kZSA9IHNyYy5jb3ZlcmFnZVJlZHVjdGlvbk1vZGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlY6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGNvdmVyYWdlUmVkdWN0aW9uTW9kZSA9IGluX3N0cnVjdC0+Y292ZXJhZ2VSZWR1Y3Rpb25Nb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlID0gc3JjLT5jb3ZlcmFnZVJlZHVjdGlvbk1vZGU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmbGFncyhpbl9zdHJ1Y3QtPmZsYWdzKSwKKyAgICBjb3ZlcmFnZVJlZHVjdGlvbk1vZGUoaW5fc3RydWN0LT5jb3ZlcmFnZVJlZHVjdGlvbk1vZGUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WOjpzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBjb3ZlcmFnZVJlZHVjdGlvbk1vZGUgPSBzcmMuY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WJiBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlID0gc3JjLmNvdmVyYWdlUmVkdWN0aW9uTW9kZTsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OVjo6fnNhZmVfVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlY6OmluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZmxhZ3MgPSBpbl9zdHJ1Y3QtPmZsYWdzOworICAgIGNvdmVyYWdlUmVkdWN0aW9uTW9kZSA9IGluX3N0cnVjdC0+Y292ZXJhZ2VSZWR1Y3Rpb25Nb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIGNvdmVyYWdlUmVkdWN0aW9uTW9kZSA9IHNyYy0+Y292ZXJhZ2VSZWR1Y3Rpb25Nb2RlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVjo6c2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVihjb25zdCBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlKGluX3N0cnVjdC0+Y292ZXJhZ2VSZWR1Y3Rpb25Nb2RlKSwKKyAgICByYXN0ZXJpemF0aW9uU2FtcGxlcyhpbl9zdHJ1Y3QtPnJhc3Rlcml6YXRpb25TYW1wbGVzKSwKKyAgICBkZXB0aFN0ZW5jaWxTYW1wbGVzKGluX3N0cnVjdC0+ZGVwdGhTdGVuY2lsU2FtcGxlcyksCisgICAgY29sb3JTYW1wbGVzKGluX3N0cnVjdC0+Y29sb3JTYW1wbGVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVjo6c2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVigpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVjo6c2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVihjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlID0gc3JjLmNvdmVyYWdlUmVkdWN0aW9uTW9kZTsKKyAgICByYXN0ZXJpemF0aW9uU2FtcGxlcyA9IHNyYy5yYXN0ZXJpemF0aW9uU2FtcGxlczsKKyAgICBkZXB0aFN0ZW5jaWxTYW1wbGVzID0gc3JjLmRlcHRoU3RlbmNpbFNhbXBsZXM7CisgICAgY29sb3JTYW1wbGVzID0gc3JjLmNvbG9yU2FtcGxlczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViYgc2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVjo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGNvdmVyYWdlUmVkdWN0aW9uTW9kZSA9IHNyYy5jb3ZlcmFnZVJlZHVjdGlvbk1vZGU7CisgICAgcmFzdGVyaXphdGlvblNhbXBsZXMgPSBzcmMucmFzdGVyaXphdGlvblNhbXBsZXM7CisgICAgZGVwdGhTdGVuY2lsU2FtcGxlcyA9IHNyYy5kZXB0aFN0ZW5jaWxTYW1wbGVzOworICAgIGNvbG9yU2FtcGxlcyA9IHNyYy5jb2xvclNhbXBsZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlY6On5zYWZlX1ZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WOjppbml0aWFsaXplKGNvbnN0IFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGNvdmVyYWdlUmVkdWN0aW9uTW9kZSA9IGluX3N0cnVjdC0+Y292ZXJhZ2VSZWR1Y3Rpb25Nb2RlOworICAgIHJhc3Rlcml6YXRpb25TYW1wbGVzID0gaW5fc3RydWN0LT5yYXN0ZXJpemF0aW9uU2FtcGxlczsKKyAgICBkZXB0aFN0ZW5jaWxTYW1wbGVzID0gaW5fc3RydWN0LT5kZXB0aFN0ZW5jaWxTYW1wbGVzOworICAgIGNvbG9yU2FtcGxlcyA9IGluX3N0cnVjdC0+Y29sb3JTYW1wbGVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlID0gc3JjLT5jb3ZlcmFnZVJlZHVjdGlvbk1vZGU7CisgICAgcmFzdGVyaXphdGlvblNhbXBsZXMgPSBzcmMtPnJhc3Rlcml6YXRpb25TYW1wbGVzOworICAgIGRlcHRoU3RlbmNpbFNhbXBsZXMgPSBzcmMtPmRlcHRoU3RlbmNpbFNhbXBsZXM7CisgICAgY29sb3JTYW1wbGVzID0gc3JjLT5jb2xvclNhbXBsZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBmcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jayhpbl9zdHJ1Y3QtPmZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrKSwKKyAgICBmcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrKGluX3N0cnVjdC0+ZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9jayksCisgICAgZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jayhpbl9zdHJ1Y3QtPmZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2spCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jayA9IHNyYy5mcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jazsKKyAgICBmcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrID0gc3JjLmZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2s7CisgICAgZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jayA9IHNyYy5mcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUJiBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2sgPSBzcmMuZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2s7CisgICAgZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9jayA9IHNyYy5mcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrOworICAgIGZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2sgPSBzcmMuZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2sgPSBpbl9zdHJ1Y3QtPmZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrOworICAgIGZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2sgPSBpbl9zdHJ1Y3QtPmZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2s7CisgICAgZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jayA9IGluX3N0cnVjdC0+ZnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9jazsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrID0gc3JjLT5mcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jazsKKyAgICBmcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrID0gc3JjLT5mcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrOworICAgIGZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2sgPSBzcmMtPmZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2s7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICB5Y2JjckltYWdlQXJyYXlzKGluX3N0cnVjdC0+eWNiY3JJbWFnZUFycmF5cykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB5Y2JjckltYWdlQXJyYXlzID0gc3JjLnljYmNySW1hZ2VBcnJheXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB5Y2JjckltYWdlQXJyYXlzID0gc3JjLnljYmNySW1hZ2VBcnJheXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgeWNiY3JJbWFnZUFycmF5cyA9IGluX3N0cnVjdC0+eWNiY3JJbWFnZUFycmF5czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICB5Y2JjckltYWdlQXJyYXlzID0gc3JjLT55Y2JjckltYWdlQXJyYXlzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVDo6c2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVChjb25zdCBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZnVsbFNjcmVlbkV4Y2x1c2l2ZShpbl9zdHJ1Y3QtPmZ1bGxTY3JlZW5FeGNsdXNpdmUpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUOjpzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUOjpzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKGNvbnN0IHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmdWxsU2NyZWVuRXhjbHVzaXZlID0gc3JjLmZ1bGxTY3JlZW5FeGNsdXNpdmU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQmIHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmdWxsU2NyZWVuRXhjbHVzaXZlID0gc3JjLmZ1bGxTY3JlZW5FeGNsdXNpdmU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ6On5zYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZ1bGxTY3JlZW5FeGNsdXNpdmUgPSBpbl9zdHJ1Y3QtPmZ1bGxTY3JlZW5FeGNsdXNpdmU7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBmdWxsU2NyZWVuRXhjbHVzaXZlID0gc3JjLT5mdWxsU2NyZWVuRXhjbHVzaXZlOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUOjpzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQoY29uc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZnVsbFNjcmVlbkV4Y2x1c2l2ZVN1cHBvcnRlZChpbl9zdHJ1Y3QtPmZ1bGxTY3JlZW5FeGNsdXNpdmVTdXBwb3J0ZWQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQ6OnNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUOjpzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQoY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZnVsbFNjcmVlbkV4Y2x1c2l2ZVN1cHBvcnRlZCA9IHNyYy5mdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQmIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZnVsbFNjcmVlbkV4Y2x1c2l2ZVN1cHBvcnRlZCA9IHNyYy5mdWxsU2NyZWVuRXhjbHVzaXZlU3VwcG9ydGVkOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQ6On5zYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZ1bGxTY3JlZW5FeGNsdXNpdmVTdXBwb3J0ZWQgPSBpbl9zdHJ1Y3QtPmZ1bGxTY3JlZW5FeGNsdXNpdmVTdXBwb3J0ZWQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZnVsbFNjcmVlbkV4Y2x1c2l2ZVN1cHBvcnRlZCA9IHNyYy0+ZnVsbFNjcmVlbkV4Y2x1c2l2ZVN1cHBvcnRlZDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisKK3NhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVDo6c2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUKGNvbnN0IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGhtb25pdG9yKGluX3N0cnVjdC0+aG1vbml0b3IpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQ6OnNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUOjpzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQoY29uc3Qgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaG1vbml0b3IgPSBzcmMuaG1vbml0b3I7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCYgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUOjpvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBobW9uaXRvciA9IHNyYy5obW9uaXRvcjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUOjp+c2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBobW9uaXRvciA9IGluX3N0cnVjdC0+aG1vbml0b3I7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaG1vbml0b3IgPSBzcmMtPmhtb25pdG9yOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKworc2FmZV9Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgZmxhZ3MoaW5fc3RydWN0LT5mbGFncykKK3sKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3NhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQ6OnNhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgZmxhZ3MgPSBzcmMuZmxhZ3M7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUJiBzYWZlX1ZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBmbGFncyA9IHNyYy5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQ6On5zYWZlX1ZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3QgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGZsYWdzID0gaW5fc3RydWN0LT5mbGFnczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgZmxhZ3MgPSBzcmMtPmZsYWdzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgcmVjdGFuZ3VsYXJMaW5lcyhpbl9zdHJ1Y3QtPnJlY3Rhbmd1bGFyTGluZXMpLAorICAgIGJyZXNlbmhhbUxpbmVzKGluX3N0cnVjdC0+YnJlc2VuaGFtTGluZXMpLAorICAgIHNtb290aExpbmVzKGluX3N0cnVjdC0+c21vb3RoTGluZXMpLAorICAgIHN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lcyhpbl9zdHJ1Y3QtPnN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lcyksCisgICAgc3RpcHBsZWRCcmVzZW5oYW1MaW5lcyhpbl9zdHJ1Y3QtPnN0aXBwbGVkQnJlc2VuaGFtTGluZXMpLAorICAgIHN0aXBwbGVkU21vb3RoTGluZXMoaW5fc3RydWN0LT5zdGlwcGxlZFNtb290aExpbmVzKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgcmVjdGFuZ3VsYXJMaW5lcyA9IHNyYy5yZWN0YW5ndWxhckxpbmVzOworICAgIGJyZXNlbmhhbUxpbmVzID0gc3JjLmJyZXNlbmhhbUxpbmVzOworICAgIHNtb290aExpbmVzID0gc3JjLnNtb290aExpbmVzOworICAgIHN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lcyA9IHNyYy5zdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXM7CisgICAgc3RpcHBsZWRCcmVzZW5oYW1MaW5lcyA9IHNyYy5zdGlwcGxlZEJyZXNlbmhhbUxpbmVzOworICAgIHN0aXBwbGVkU21vb3RoTGluZXMgPSBzcmMuc3RpcHBsZWRTbW9vdGhMaW5lczsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHJlY3Rhbmd1bGFyTGluZXMgPSBzcmMucmVjdGFuZ3VsYXJMaW5lczsKKyAgICBicmVzZW5oYW1MaW5lcyA9IHNyYy5icmVzZW5oYW1MaW5lczsKKyAgICBzbW9vdGhMaW5lcyA9IHNyYy5zbW9vdGhMaW5lczsKKyAgICBzdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXMgPSBzcmMuc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzOworICAgIHN0aXBwbGVkQnJlc2VuaGFtTGluZXMgPSBzcmMuc3RpcHBsZWRCcmVzZW5oYW1MaW5lczsKKyAgICBzdGlwcGxlZFNtb290aExpbmVzID0gc3JjLnN0aXBwbGVkU21vb3RoTGluZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUKCkKK3sKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHJlY3Rhbmd1bGFyTGluZXMgPSBpbl9zdHJ1Y3QtPnJlY3Rhbmd1bGFyTGluZXM7CisgICAgYnJlc2VuaGFtTGluZXMgPSBpbl9zdHJ1Y3QtPmJyZXNlbmhhbUxpbmVzOworICAgIHNtb290aExpbmVzID0gaW5fc3RydWN0LT5zbW9vdGhMaW5lczsKKyAgICBzdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXMgPSBpbl9zdHJ1Y3QtPnN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lczsKKyAgICBzdGlwcGxlZEJyZXNlbmhhbUxpbmVzID0gaW5fc3RydWN0LT5zdGlwcGxlZEJyZXNlbmhhbUxpbmVzOworICAgIHN0aXBwbGVkU21vb3RoTGluZXMgPSBpbl9zdHJ1Y3QtPnN0aXBwbGVkU21vb3RoTGluZXM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICByZWN0YW5ndWxhckxpbmVzID0gc3JjLT5yZWN0YW5ndWxhckxpbmVzOworICAgIGJyZXNlbmhhbUxpbmVzID0gc3JjLT5icmVzZW5oYW1MaW5lczsKKyAgICBzbW9vdGhMaW5lcyA9IHNyYy0+c21vb3RoTGluZXM7CisgICAgc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzID0gc3JjLT5zdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXM7CisgICAgc3RpcHBsZWRCcmVzZW5oYW1MaW5lcyA9IHNyYy0+c3RpcHBsZWRCcmVzZW5oYW1MaW5lczsKKyAgICBzdGlwcGxlZFNtb290aExpbmVzID0gc3JjLT5zdGlwcGxlZFNtb290aExpbmVzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgbGluZVN1YlBpeGVsUHJlY2lzaW9uQml0cyhpbl9zdHJ1Y3QtPmxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHMpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbGluZVN1YlBpeGVsUHJlY2lzaW9uQml0cyA9IHNyYy5saW5lU3ViUGl4ZWxQcmVjaXNpb25CaXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbGluZVN1YlBpeGVsUHJlY2lzaW9uQml0cyA9IHNyYy5saW5lU3ViUGl4ZWxQcmVjaXNpb25CaXRzOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIGxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHMgPSBpbl9zdHJ1Y3QtPmxpbmVTdWJQaXhlbFByZWNpc2lvbkJpdHM7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgbGluZVN1YlBpeGVsUHJlY2lzaW9uQml0cyA9IHNyYy0+bGluZVN1YlBpeGVsUHJlY2lzaW9uQml0czsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGxpbmVSYXN0ZXJpemF0aW9uTW9kZShpbl9zdHJ1Y3QtPmxpbmVSYXN0ZXJpemF0aW9uTW9kZSksCisgICAgc3RpcHBsZWRMaW5lRW5hYmxlKGluX3N0cnVjdC0+c3RpcHBsZWRMaW5lRW5hYmxlKSwKKyAgICBsaW5lU3RpcHBsZUZhY3Rvcihpbl9zdHJ1Y3QtPmxpbmVTdGlwcGxlRmFjdG9yKSwKKyAgICBsaW5lU3RpcHBsZVBhdHRlcm4oaW5fc3RydWN0LT5saW5lU3RpcHBsZVBhdHRlcm4pCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVDo6c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUOjpzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGxpbmVSYXN0ZXJpemF0aW9uTW9kZSA9IHNyYy5saW5lUmFzdGVyaXphdGlvbk1vZGU7CisgICAgc3RpcHBsZWRMaW5lRW5hYmxlID0gc3JjLnN0aXBwbGVkTGluZUVuYWJsZTsKKyAgICBsaW5lU3RpcHBsZUZhY3RvciA9IHNyYy5saW5lU3RpcHBsZUZhY3RvcjsKKyAgICBsaW5lU3RpcHBsZVBhdHRlcm4gPSBzcmMubGluZVN0aXBwbGVQYXR0ZXJuOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCYgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgbGluZVJhc3Rlcml6YXRpb25Nb2RlID0gc3JjLmxpbmVSYXN0ZXJpemF0aW9uTW9kZTsKKyAgICBzdGlwcGxlZExpbmVFbmFibGUgPSBzcmMuc3RpcHBsZWRMaW5lRW5hYmxlOworICAgIGxpbmVTdGlwcGxlRmFjdG9yID0gc3JjLmxpbmVTdGlwcGxlRmFjdG9yOworICAgIGxpbmVTdGlwcGxlUGF0dGVybiA9IHNyYy5saW5lU3RpcHBsZVBhdHRlcm47CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUOjp+c2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBsaW5lUmFzdGVyaXphdGlvbk1vZGUgPSBpbl9zdHJ1Y3QtPmxpbmVSYXN0ZXJpemF0aW9uTW9kZTsKKyAgICBzdGlwcGxlZExpbmVFbmFibGUgPSBpbl9zdHJ1Y3QtPnN0aXBwbGVkTGluZUVuYWJsZTsKKyAgICBsaW5lU3RpcHBsZUZhY3RvciA9IGluX3N0cnVjdC0+bGluZVN0aXBwbGVGYWN0b3I7CisgICAgbGluZVN0aXBwbGVQYXR0ZXJuID0gaW5fc3RydWN0LT5saW5lU3RpcHBsZVBhdHRlcm47CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIGxpbmVSYXN0ZXJpemF0aW9uTW9kZSA9IHNyYy0+bGluZVJhc3Rlcml6YXRpb25Nb2RlOworICAgIHN0aXBwbGVkTGluZUVuYWJsZSA9IHNyYy0+c3RpcHBsZWRMaW5lRW5hYmxlOworICAgIGxpbmVTdGlwcGxlRmFjdG9yID0gc3JjLT5saW5lU3RpcHBsZUZhY3RvcjsKKyAgICBsaW5lU3RpcHBsZVBhdHRlcm4gPSBzcmMtPmxpbmVTdGlwcGxlUGF0dGVybjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIGhvc3RRdWVyeVJlc2V0KGluX3N0cnVjdC0+aG9zdFF1ZXJ5UmVzZXQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBob3N0UXVlcnlSZXNldCA9IHNyYy5ob3N0UXVlcnlSZXNldDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIGhvc3RRdWVyeVJlc2V0ID0gc3JjLmhvc3RRdWVyeVJlc2V0OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICBob3N0UXVlcnlSZXNldCA9IGluX3N0cnVjdC0+aG9zdFF1ZXJ5UmVzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBob3N0UXVlcnlSZXNldCA9IHNyYy0+aG9zdFF1ZXJ5UmVzZXQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBpbmRleFR5cGVVaW50OChpbl9zdHJ1Y3QtPmluZGV4VHlwZVVpbnQ4KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCgpIDoKKyAgICBwTmV4dChudWxscHRyKQore30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgaW5kZXhUeXBlVWludDggPSBzcmMuaW5kZXhUeXBlVWludDg7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUJiBzcmMpCit7CisgICAgaWYgKCZzcmMgPT0gdGhpcykgcmV0dXJuICp0aGlzOworCisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7CisKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBpbmRleFR5cGVVaW50OCA9IHNyYy5pbmRleFR5cGVVaW50ODsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQoKQoreworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgaW5kZXhUeXBlVWludDggPSBpbl9zdHJ1Y3QtPmluZGV4VHlwZVVpbnQ4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUOjppbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQqIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy0+c1R5cGU7CisgICAgaW5kZXhUeXBlVWludDggPSBzcmMtPmluZGV4VHlwZVVpbnQ4OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCogaW5fc3RydWN0KSA6CisgICAgc1R5cGUoaW5fc3RydWN0LT5zVHlwZSksCisgICAgc2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uKGluX3N0cnVjdC0+c2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uKQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICBzaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb24gPSBzcmMuc2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ6Om9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uID0gc3JjLnNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ6On5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpCit7CisgICAgc1R5cGUgPSBpbl9zdHJ1Y3QtPnNUeXBlOworICAgIHNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbiA9IGluX3N0cnVjdC0+c2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uOworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICBzaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb24gPSBzcmMtPnNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbjsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQqIGluX3N0cnVjdCkgOgorICAgIHNUeXBlKGluX3N0cnVjdC0+c1R5cGUpLAorICAgIHRleGVsQnVmZmVyQWxpZ25tZW50KGluX3N0cnVjdC0+dGV4ZWxCdWZmZXJBbGlnbm1lbnQpCit7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUKCkgOgorICAgIHBOZXh0KG51bGxwdHIpCit7fQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBzVHlwZSA9IHNyYy5zVHlwZTsKKyAgICB0ZXhlbEJ1ZmZlckFsaWdubWVudCA9IHNyYy50ZXhlbEJ1ZmZlckFsaWdubWVudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCYgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQmIHNyYykKK3sKKyAgICBpZiAoJnNyYyA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAocE5leHQpCisgICAgICAgIEZyZWVQbmV4dENoYWluKHBOZXh0KTsKKworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHRleGVsQnVmZmVyQWxpZ25tZW50ID0gc3JjLnRleGVsQnVmZmVyQWxpZ25tZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUOjp+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVDo6aW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCogaW5fc3RydWN0KQoreworICAgIHNUeXBlID0gaW5fc3RydWN0LT5zVHlwZTsKKyAgICB0ZXhlbEJ1ZmZlckFsaWdubWVudCA9IGluX3N0cnVjdC0+dGV4ZWxCdWZmZXJBbGlnbm1lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KGluX3N0cnVjdC0+cE5leHQpOworfQorCit2b2lkIHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCogc3JjKQoreworICAgIHNUeXBlID0gc3JjLT5zVHlwZTsKKyAgICB0ZXhlbEJ1ZmZlckFsaWdubWVudCA9IHNyYy0+dGV4ZWxCdWZmZXJBbGlnbm1lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy0+cE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ6OnNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpIDoKKyAgICBzVHlwZShpbl9zdHJ1Y3QtPnNUeXBlKSwKKyAgICBzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcyhpbl9zdHJ1Y3QtPnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzKSwKKyAgICBzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudChpbl9zdHJ1Y3QtPnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50KSwKKyAgICB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcyhpbl9zdHJ1Y3QtPnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzKSwKKyAgICB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudChpbl9zdHJ1Y3QtPnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50KQoreworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKworc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUOjpzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQoKSA6CisgICAgcE5leHQobnVsbHB0cikKK3t9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDo6c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIHNUeXBlID0gc3JjLnNUeXBlOworICAgIHN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzID0gc3JjLnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzOworICAgIHN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50ID0gc3JjLnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50OworICAgIHVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzID0gc3JjLnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzOworICAgIHVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50ID0gc3JjLnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShzcmMucE5leHQpOworfQorCitzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQmIHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDo6b3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCYgc3JjKQoreworICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpczsKKworICAgIGlmIChwTmV4dCkKKyAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpOworCisgICAgc1R5cGUgPSBzcmMuc1R5cGU7CisgICAgc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgPSBzcmMuc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXM7CisgICAgc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQgPSBzcmMuc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQ7CisgICAgdW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgPSBzcmMudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXM7CisgICAgdW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQgPSBzcmMudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQ7CisgICAgcE5leHQgPSBTYWZlUG5leHRDb3B5KHNyYy5wTmV4dCk7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDo6fnNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCgpCit7CisgICAgaWYgKHBOZXh0KQorICAgICAgICBGcmVlUG5leHRDaGFpbihwTmV4dCk7Cit9CisKK3ZvaWQgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUOjppbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCkKK3sKKyAgICBzVHlwZSA9IGluX3N0cnVjdC0+c1R5cGU7CisgICAgc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgPSBpbl9zdHJ1Y3QtPnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzOworICAgIHN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50ID0gaW5fc3RydWN0LT5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudDsKKyAgICB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcyA9IGluX3N0cnVjdC0+dW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXM7CisgICAgdW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQgPSBpbl9zdHJ1Y3QtPnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50OworICAgIHBOZXh0ID0gU2FmZVBuZXh0Q29weShpbl9zdHJ1Y3QtPnBOZXh0KTsKK30KKwordm9pZCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ6OmluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUKiBzcmMpCit7CisgICAgc1R5cGUgPSBzcmMtPnNUeXBlOworICAgIHN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzID0gc3JjLT5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlczsKKyAgICBzdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCA9IHNyYy0+c3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQ7CisgICAgdW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgPSBzcmMtPnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzOworICAgIHVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50ID0gc3JjLT51bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudDsKKyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLT5wTmV4dCk7Cit9CisKK2NoYXIgKlNhZmVTdHJpbmdDb3B5KGNvbnN0IGNoYXIgKmluX3N0cmluZykgeworICAgIGlmIChudWxscHRyID09IGluX3N0cmluZykgcmV0dXJuIG51bGxwdHI7CisgICAgY2hhciogZGVzdCA9IG5ldyBjaGFyW3N0ZDo6c3RybGVuKGluX3N0cmluZykgKyAxXTsKKyAgICByZXR1cm4gc3RkOjpzdHJjcHkoZGVzdCwgaW5fc3RyaW5nKTsKK30KKwordm9pZCAqU2FmZVBuZXh0Q29weShjb25zdCB2b2lkICpwTmV4dCkgeworICAgIGlmICghcE5leHQpIHJldHVybiBudWxscHRyOworCisgICAgdm9pZCAqc2FmZV9wTmV4dDsKKyAgICBjb25zdCBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCYXNlT3V0U3RydWN0dXJlICo+KHBOZXh0KTsKKworICAgIHN3aXRjaCAoaGVhZGVyLT5zVHlwZSkgeworICAgICAgICAvLyBTcGVjaWFsLWNhc2UgTG9hZGVyIEluc3RhbmNlIFN0cnVjdCBwYXNzZWQgdG8vZnJvbSBsYXllciBpbiBwTmV4dCBjaGFpbgorICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTzogeworICAgICAgICAgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqc3RydWN0X2NvcHkgPSBuZXcgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbzsKKyAgICAgICAgICAgIC8vIFRPRE86IFVzZXMgb3JpZ2luYWwgVmtMYXllckluc3RhbmNlTGluayogY2hhaW4sIHdoaWNoIHNob3VsZCBiZSBva2F5IGZvciBvdXIgdXNlcworICAgICAgICAgICAgbWVtY3B5KHN0cnVjdF9jb3B5LCBwTmV4dCwgc2l6ZW9mKFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8pKTsKKyAgICAgICAgICAgIHN0cnVjdF9jb3B5LT5wTmV4dCA9IFNhZmVQbmV4dENvcHkoaGVhZGVyLT5wTmV4dCk7CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gc3RydWN0X2NvcHk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBTcGVjaWFsLWNhc2UgTG9hZGVyIERldmljZSBTdHJ1Y3QgcGFzc2VkIHRvL2Zyb20gbGF5ZXIgaW4gcE5leHQgY2hhaW4KKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfREVWSUNFX0NSRUFURV9JTkZPOiB7CisgICAgICAgICAgICBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyAqc3RydWN0X2NvcHkgPSBuZXcgVmtMYXllckRldmljZUNyZWF0ZUluZm87CisgICAgICAgICAgICAvLyBUT0RPOiBVc2VzIG9yaWdpbmFsIFZrTGF5ZXJEZXZpY2VMaW5rKiwgd2hpY2ggc2hvdWxkIGJlIG9rYXkgZm9yIG91ciB1c2VzCisgICAgICAgICAgICBtZW1jcHkoc3RydWN0X2NvcHksIHBOZXh0LCBzaXplb2YoVmtMYXllckRldmljZUNyZWF0ZUluZm8pKTsKKyAgICAgICAgICAgIHN0cnVjdF9jb3B5LT5wTmV4dCA9IFNhZmVQbmV4dENvcHkoaGVhZGVyLT5wTmV4dCk7CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gc3RydWN0X2NvcHk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9QUk9QRVJUSUVTOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfMTZCSVRfU1RPUkFHRV9GRUFUVVJFUzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfUkVRVUlSRU1FTlRTOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfQUxMT0NBVEVfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfRkxBR1NfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk86CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk86CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9CSU5EX1NQQVJTRV9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfREVWSUNFX0dST1VQX0lORk86CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVM6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19JTlBVVF9BVFRBQ0hNRU5UX0FTUEVDVF9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19VU0FHRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9TVEFURV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfTVVMVElWSUVXX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX0ZFQVRVUkVTOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QUk9QRVJUSUVTOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFUzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfRkVBVFVSRVM6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1Byb3RlY3RlZFN1Ym1pdEluZm8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1Byb3RlY3RlZFN1Ym1pdEluZm8gKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfSU1BR0VfRk9STUFUX1BST1BFUlRJRVM6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JRF9QUk9QRVJUSUVTOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk86CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk86CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RSQVdfUEFSQU1FVEVSU19GRUFUVVJFUzoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyhyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX1NXQVBDSEFJTl9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0lORk9fS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUkVTRU5UX0lORk9fS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BVU0hfREVTQ1JJUFRPUl9QUk9QRVJUSUVTX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfUkVHSU9OU19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQcmVzZW50UmVnaW9uc0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUHJlc2VudFJlZ2lvbnNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRTX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQVRUQUNITUVOVF9CRUdJTl9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfUFJPUEVSVElFU19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9TVUJNSVRfSU5GT19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzhCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9BVE9NSUNfSU5UNjRfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9EUklWRVJfUFJPUEVSVElFU19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUX0NPTlRST0xTX1BST1BFUlRJRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9QUk9QRVJUSUVTX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVElNRUxJTkVfU0VNQVBIT1JFX1NVQk1JVF9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfU1RFTkNJTF9MQVlPVVRfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX1NURU5DSUxfTEFZT1VUX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19BTExPQ0FURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19GRUFUVVJFU19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfUkFTVEVSSVpBVElPTl9PUkRFUl9BTUQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JVRkZFUl9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX01FTU9SWV9BTExPQ0FURV9JTkZPX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfU1RSRUFNX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9URVhUVVJFX0xPRF9HQVRIRVJfRk9STUFUX1BST1BFUlRJRVNfQU1EOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09STkVSX1NBTVBMRURfSU1BR0VfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZMQUdTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrVmFsaWRhdGlvbkZsYWdzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DT1VOVEVSX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9USU1FU19JTkZPX0dPT0dMRToKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ByZXNlbnRUaW1lc0luZm9HT09HTEUgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19QUk9QRVJUSUVTX05WWDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1dJWlpMRV9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ESVNDQVJEX1JFQ1RBTkdMRV9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RJU0NBUkRfUkVDVEFOR0xFX1NUQVRFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0NPTlNFUlZBVElWRV9TVEFURV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX0NMSVBfRU5BQkxFX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fREVQVEhfQ0xJUF9TVEFURV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfRklMVEVSX01JTk1BWF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9JTkxJTkVfVU5JRk9STV9CTE9DS19DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX1NBTVBMRV9MT0NBVElPTlNfQkVHSU5fSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TQU1QTEVfTE9DQVRJT05TX1NUQVRFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRV9MT0NBVElPTlNfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1RPX0NPTE9SX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfTU9EVUxBVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU01fQlVJTFRJTlNfUFJPUEVSVElFU19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0xJU1RfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0xJU1RfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhQTElDSVRfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9CSU5ESU5HX0ZMQUdTX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9BTExPQ0FURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9JTUFHRV9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX1BST1BFUlRJRVNfTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfQ09BUlNFX1NBTVBMRV9PUkRFUl9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JBWV9UUkFDSU5HX1BST1BFUlRJRVNfTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfU1RBVEVfQ1JFQVRFX0lORk9fTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9GSUxURVJfQ1VCSUNfSU1BR0VfVklFV19JTUFHRV9GT1JNQVRfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9HTE9CQUxfUFJJT1JJVFlfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0hPU1RfUE9JTlRFUl9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfTUVNT1JZX0hPU1RfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfQU1EOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9ESVZJU09SX1NUQVRFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfUFJPUEVSVElFU19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0VYQ0xVU0lWRV9TQ0lTU09SX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYQ0xVU0lWRV9TQ0lTU09SX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUVVFVUVfRkFNSUxZX0NIRUNLUE9JTlRfUFJPUEVSVElFU19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRkVBVFVSRVNfSU5URUw6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QQ0lfQlVTX0lORk9fUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX05BVElWRV9IRFJfU1VSRkFDRV9DQVBBQklMSVRJRVNfQU1EOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fRElTUExBWV9OQVRJVkVfSERSX0NSRUFURV9JTkZPX0FNRDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19GUkFHTUVOVF9ERU5TSVRZX01BUF9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9SRVFVSVJFRF9TVUJHUk9VUF9TSVpFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0ZFQVRVUkVTX0FNRDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BSSU9SSVRZX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUFJJT1JJVFlfQUxMT0NBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NURU5DSUxfVVNBR0VfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9SRURVQ1RJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0xJTkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkRFWF9UWVBFX1VJTlQ4X0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RFTU9URV9UT19IRUxQRVJfSU5WT0NBVElPTl9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1VTQUdFX0FORFJPSUQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRk9STUFUX1BST1BFUlRJRVNfQU5EUk9JRDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQ6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfRlJBTUVfVE9LRU5fR0dQOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1AocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ByZXNlbnRGcmFtZVRva2VuR0dQICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUjoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9EM0QxMl9GRU5DRV9TVUJNSVRfSU5GT19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY6CisgICAgICAgICAgICBzYWZlX3BOZXh0ID0gbmV3IHNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVihyZWludGVycHJldF9jYXN0PGNvbnN0IFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKj4ocE5leHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVChyZWludGVycHJldF9jYXN0PGNvbnN0IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhUOgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUICo+KHBOZXh0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9XSU4zMl9JTkZPX0VYVDoKKyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBuZXcgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCAqPihwTmV4dCkpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICBkZWZhdWx0OiAvLyBFbmNvdW50ZXJlZCBhbiB1bmtub3duIHNUeXBlIC0tIHNraXAgKGRvIG5vdCBjb3B5KSB0aGlzIGVudHJ5IGluIHRoZSBjaGFpbgorICAgICAgICAgICAgc2FmZV9wTmV4dCA9IFNhZmVQbmV4dENvcHkoaGVhZGVyLT5wTmV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gc2FmZV9wTmV4dDsKK30KKwordm9pZCBGcmVlUG5leHRDaGFpbihjb25zdCB2b2lkICpwTmV4dCkgeworICAgIGlmICghcE5leHQpIHJldHVybjsKKworICAgIGF1dG8gaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKj4ocE5leHQpOworCisgICAgc3dpdGNoIChoZWFkZXItPnNUeXBlKSB7CisgICAgICAgIC8vIFNwZWNpYWwtY2FzZSBMb2FkZXIgSW5zdGFuY2UgU3RydWN0IHBhc3NlZCB0by9mcm9tIGxheWVyIGluIHBOZXh0IGNoYWluCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgRnJlZVBuZXh0Q2hhaW4oaGVhZGVyLT5wTmV4dCk7CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICo+KHBOZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBTcGVjaWFsLWNhc2UgTG9hZGVyIERldmljZSBTdHJ1Y3QgcGFzc2VkIHRvL2Zyb20gbGF5ZXIgaW4gcE5leHQgY2hhaW4KKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfREVWSUNFX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgRnJlZVBuZXh0Q2hhaW4oaGVhZGVyLT5wTmV4dCk7CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyAqPihwTmV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfUFJPUEVSVElFUzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzE2QklUX1NUT1JBR0VfRkVBVFVSRVM6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFM6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX0FMTE9DQVRFX0lORk86CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfRkxBR1NfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk86CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TVUJNSVRfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9CSU5EX1NQQVJTRV9JTkZPOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk86CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVM6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk86CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfVVNBR0VfQ1JFQVRFX0lORk86CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9TVEFURV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfTVVMVElWSUVXX0NSRUFURV9JTkZPOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX0ZFQVRVUkVTOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfUFJPUEVSVElFUzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFUzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfRkVBVFVSRVM6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfUFJPUEVSVElFUzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9QTEFORV9NRU1PUllfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfUFJPUEVSVElFUzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVM6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk86CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUzoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRFJBV19QQVJBTUVURVJTX0ZFQVRVUkVTOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX1NXQVBDSEFJTl9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJFU0VOVF9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFVTSF9ERVNDUklQVE9SX1BST1BFUlRJRVNfS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0ZMT0FUMTZfSU5UOF9GRUFUVVJFU19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1JFR0lPTlNfS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRTX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQVRUQUNITUVOVF9CRUdJTl9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfUFJPUEVSVElFU19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9QRVJGT1JNQU5DRV9DUkVBVEVfSU5GT19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9TVUJNSVRfSU5GT19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQVRPTUlDX0lOVDY0X0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GTE9BVF9DT05UUk9MU19QUk9QRVJUSUVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9QUk9QRVJUSUVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVElNRUxJTkVfU0VNQVBIT1JFX1NVQk1JVF9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19GRUFUVVJFU19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfU1RFTkNJTF9MQVlPVVRfS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OX1NURU5DSUxfTEFZT1VUX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVU5JRk9STV9CVUZGRVJfU1RBTkRBUkRfTEFZT1VUX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQlVGRkVSX0RFVklDRV9BRERSRVNTX0ZFQVRVUkVTX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQ1JFQVRFX0lORk9fS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQUxMT0NBVEVfSU5GT19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRkVBVFVSRVNfS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1JBU1RFUklaQVRJT05fT1JERVJfQU1EOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JVRkZFUl9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9NRU1PUllfQUxMT0NBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9TVFJFQU1fQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVEVYVFVSRV9MT0RfR0FUSEVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FNRDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPUk5FUl9TQU1QTEVEX0lNQUdFX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GTEFHU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfV19TQ0FMSU5HX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ09VTlRFUl9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEU6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TV0laWkxFX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ESVNDQVJEX1JFQ1RBTkdMRV9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9ESVNDQVJEX1JFQ1RBTkdMRV9TVEFURV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX0NMSVBfRU5BQkxFX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0RFUFRIX0NMSVBfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9GSUxURVJfTUlOTUFYX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0lOTElORV9VTklGT1JNX0JMT0NLX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfU0FNUExFX0xPQ0FUSU9OU19CRUdJTl9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TQU1QTEVfTE9DQVRJT05TX1NUQVRFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRV9MT0NBVElPTlNfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1RPX0NPTE9SX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX01PRFVMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlY6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19QUk9QRVJUSUVTX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfTElTVF9FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9MSVNUX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhQTElDSVRfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfVkFMSURBVElPTl9DQUNIRV9DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0JJTkRJTkdfRkxBR1NfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0FMTE9DQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9MQVlPVVRfU1VQUE9SVF9FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU0hBRElOR19SQVRFX0lNQUdFX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9QUk9QRVJUSUVTX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfQ09BUlNFX1NBTVBMRV9PUkRFUl9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JBWV9UUkFDSU5HX1BST1BFUlRJRVNfTlY6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9TVEFURV9DUkVBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRklMVEVSX0NVQklDX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9IT1NUX1BPSU5URVJfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfTUVNT1JZX0hPU1RfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT01QSUxFUl9DT05UUk9MX0NSRUFURV9JTkZPX0FNRDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0FNRDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09WRVJBTExPQ0FUSU9OX0NSRUFURV9JTkZPX0FNRDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX0RJVklTT1JfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0ZFQVRVUkVTX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfUFJPUEVSVElFU19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfRkVBVFVSRVNfTlY6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0VYQ0xVU0lWRV9TQ0lTU09SX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWENMVVNJVkVfU0NJU1NPUl9GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfQ0hFQ0tQT0lOVF9QUk9QRVJUSUVTX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTlRFR0VSX0ZVTkNUSU9OU18yX0ZFQVRVUkVTX0lOVEVMOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUENJX0JVU19JTkZPX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTkFUSVZFX0hEUl9TVVJGQUNFX0NBUEFCSUxJVElFU19BTUQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9ESVNQTEFZX05BVElWRV9IRFJfQ1JFQVRFX0lORk9fQU1EOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX1JFUVVJUkVEX1NVQkdST1VQX1NJWkVfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0ZFQVRVUkVTX0FNRDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfQlVER0VUX1BST1BFUlRJRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUFJJT1JJVFlfQUxMT0NBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19GRUFUVVJFU19OVjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19DUkVBVEVfSU5GT19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NURU5DSUxfVVNBR0VfQ1JFQVRFX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlY6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0ZFQVRVUkVTX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfUkVEVUNUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1lDQkNSX0lNQUdFX0FSUkFZU19GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9MSU5FX1NUQVRFX0NSRUFURV9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSE9TVF9RVUVSWV9SRVNFVF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5ERVhfVFlQRV9VSU5UOF9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RFTU9URV9UT19IRUxQRVJfSU5WT0NBVElPTl9GRUFUVVJFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfUFJPUEVSVElFU19FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1VTQUdFX0FORFJPSUQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9GT1JNQVRfUFJPUEVSVElFU19BTkRST0lEOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfSU5GT19BTkRST0lEOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GT1JNQVRfQU5EUk9JRDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9HR1AKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0ZSQU1FX1RPS0VOX0dHUDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtQcmVzZW50RnJhbWVUb2tlbkdHUCAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX0tIUjoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfS0VZRURfTVVURVhfQUNRVUlSRV9SRUxFQVNFX0lORk9fS0hSOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiAqPihoZWFkZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9EM0QxMl9GRU5DRV9TVUJNSVRfSU5GT19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVDoKKyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9FWFQ6CisgICAgICAgICAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQgKj4oaGVhZGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX1dJTjMyX0lORk9fRVhUOgorICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUICo+KGhlYWRlcik7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgICAgIGRlZmF1bHQ6IC8vIEVuY291bnRlcmVkIGFuIHVua25vd24gc1R5cGUgLS0gcGFuaWMsIHRoZXJlIHNob3VsZCBiZSBub25lIHN1Y2ggaW4gc2FmZSBjaGFpbgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIEZyZWVQbmV4dENoYWluKGhlYWRlci0+cE5leHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC92a19zYWZlX3N0cnVjdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dlbmVyYXRlZC92a19zYWZlX3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MmZmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX3NhZmVfc3RydWN0LmgKQEAgLTAsMCArMSw3MDM2IEBACisvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKgorLy8gU2VlIGhlbHBlcl9maWxlX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leWdvQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZvcmJlc0Bnb29nbGUuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZjxqenVsYXVmQGx1bmFyZy5jb20+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCit2b2lkICpTYWZlUG5leHRDb3B5KGNvbnN0IHZvaWQgKnBOZXh0KTsKK3ZvaWQgRnJlZVBuZXh0Q2hhaW4oY29uc3Qgdm9pZCAqcE5leHQpOworY2hhciAqU2FmZVN0cmluZ0NvcHkoY29uc3QgY2hhciAqaW5fc3RyaW5nKTsKKworCitzdHJ1Y3Qgc2FmZV9Wa0FwcGxpY2F0aW9uSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIGNvbnN0IGNoYXIqIHBBcHBsaWNhdGlvbk5hbWU7CisgICAgdWludDMyX3QgYXBwbGljYXRpb25WZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHBFbmdpbmVOYW1lOworICAgIHVpbnQzMl90IGVuZ2luZVZlcnNpb247CisgICAgdWludDMyX3QgYXBpVmVyc2lvbjsKKyAgICBzYWZlX1ZrQXBwbGljYXRpb25JbmZvKGNvbnN0IFZrQXBwbGljYXRpb25JbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtBcHBsaWNhdGlvbkluZm8oY29uc3Qgc2FmZV9Wa0FwcGxpY2F0aW9uSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrQXBwbGljYXRpb25JbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0FwcGxpY2F0aW9uSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrQXBwbGljYXRpb25JbmZvKCk7CisgICAgfnNhZmVfVmtBcHBsaWNhdGlvbkluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtBcHBsaWNhdGlvbkluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBcHBsaWNhdGlvbkluZm8qIHNyYyk7CisgICAgVmtBcHBsaWNhdGlvbkluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBcHBsaWNhdGlvbkluZm8gKj4odGhpcyk7IH0KKyAgICBWa0FwcGxpY2F0aW9uSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0FwcGxpY2F0aW9uSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbnN0YW5jZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0luc3RhbmNlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgc2FmZV9Wa0FwcGxpY2F0aW9uSW5mbyogcEFwcGxpY2F0aW9uSW5mbzsKKyAgICB1aW50MzJfdCBlbmFibGVkTGF5ZXJDb3VudDsKKyAgICBjb25zdCBjaGFyKiBjb25zdCogcHBFbmFibGVkTGF5ZXJOYW1lczsKKyAgICB1aW50MzJfdCBlbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgY29uc3QgY2hhciogY29uc3QqIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgIHNhZmVfVmtJbnN0YW5jZUNyZWF0ZUluZm8oY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0luc3RhbmNlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrSW5zdGFuY2VDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtJbnN0YW5jZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW5zdGFuY2VDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtJbnN0YW5jZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa0luc3RhbmNlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0luc3RhbmNlQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0luc3RhbmNlQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrSW5zdGFuY2VDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW5zdGFuY2VDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0FsbG9jYXRpb25DYWxsYmFja3MgeworICAgIHZvaWQqIHBVc2VyRGF0YTsKKyAgICBQRk5fdmtBbGxvY2F0aW9uRnVuY3Rpb24gcGZuQWxsb2NhdGlvbjsKKyAgICBQRk5fdmtSZWFsbG9jYXRpb25GdW5jdGlvbiBwZm5SZWFsbG9jYXRpb247CisgICAgUEZOX3ZrRnJlZUZ1bmN0aW9uIHBmbkZyZWU7CisgICAgUEZOX3ZrSW50ZXJuYWxBbGxvY2F0aW9uTm90aWZpY2F0aW9uIHBmbkludGVybmFsQWxsb2NhdGlvbjsKKyAgICBQRk5fdmtJbnRlcm5hbEZyZWVOb3RpZmljYXRpb24gcGZuSW50ZXJuYWxGcmVlOworICAgIHNhZmVfVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQWxsb2NhdGlvbkNhbGxiYWNrcyhjb25zdCBzYWZlX1ZrQWxsb2NhdGlvbkNhbGxiYWNrcyYgc3JjKTsKKyAgICBzYWZlX1ZrQWxsb2NhdGlvbkNhbGxiYWNrcyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBbGxvY2F0aW9uQ2FsbGJhY2tzJiBzcmMpOworICAgIHNhZmVfVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKCk7CisgICAgfnNhZmVfVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0FsbG9jYXRpb25DYWxsYmFja3MqIHNyYyk7CisgICAgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqPih0aGlzKTsgfQorICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0FsbG9jYXRpb25DYWxsYmFja3MgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXg7CisgICAgdWludDMyX3QgcXVldWVDb3VudDsKKyAgICBjb25zdCBmbG9hdCogcFF1ZXVlUHJpb3JpdGllczsKKyAgICBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKGNvbnN0IFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXZpY2VDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBxdWV1ZUNyZWF0ZUluZm9Db3VudDsKKyAgICBzYWZlX1ZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKiBwUXVldWVDcmVhdGVJbmZvczsKKyAgICB1aW50MzJfdCBlbmFibGVkTGF5ZXJDb3VudDsKKyAgICBjb25zdCBjaGFyKiBjb25zdCogcHBFbmFibGVkTGF5ZXJOYW1lczsKKyAgICB1aW50MzJfdCBlbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgY29uc3QgY2hhciogY29uc3QqIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyogcEVuYWJsZWRGZWF0dXJlczsKKyAgICBzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbyhjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RldmljZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0RldmljZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrRGV2aWNlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrRGV2aWNlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0RldmljZUNyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1N1Ym1pdEluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCB3YWl0U2VtYXBob3JlQ291bnQ7CisgICAgVmtTZW1hcGhvcmUqIHBXYWl0U2VtYXBob3JlczsKKyAgICBjb25zdCBWa1BpcGVsaW5lU3RhZ2VGbGFncyogcFdhaXREc3RTdGFnZU1hc2s7CisgICAgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50OworICAgIFZrQ29tbWFuZEJ1ZmZlciogcENvbW1hbmRCdWZmZXJzOworICAgIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZUNvdW50OworICAgIFZrU2VtYXBob3JlKiBwU2lnbmFsU2VtYXBob3JlczsKKyAgICBzYWZlX1ZrU3VibWl0SW5mbyhjb25zdCBWa1N1Ym1pdEluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1N1Ym1pdEluZm8oY29uc3Qgc2FmZV9Wa1N1Ym1pdEluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1N1Ym1pdEluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3VibWl0SW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU3VibWl0SW5mbygpOworICAgIH5zYWZlX1ZrU3VibWl0SW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1N1Ym1pdEluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTdWJtaXRJbmZvKiBzcmMpOworICAgIFZrU3VibWl0SW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N1Ym1pdEluZm8gKj4odGhpcyk7IH0KKyAgICBWa1N1Ym1pdEluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdWJtaXRJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa01lbW9yeUFsbG9jYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGV2aWNlU2l6ZSBhbGxvY2F0aW9uU2l6ZTsKKyAgICB1aW50MzJfdCBtZW1vcnlUeXBlSW5kZXg7CisgICAgc2FmZV9Wa01lbW9yeUFsbG9jYXRlSW5mbyhjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVJbmZvKGNvbnN0IHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeUFsbG9jYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeUFsbG9jYXRlSW5mbygpOworICAgIH5zYWZlX1ZrTWVtb3J5QWxsb2NhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVJbmZvKiBzcmMpOworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5QWxsb2NhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlBbGxvY2F0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2UgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnk7CisgICAgVmtEZXZpY2VTaXplIG9mZnNldDsKKyAgICBWa0RldmljZVNpemUgc2l6ZTsKKyAgICBzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2UoY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2UoY29uc3Qgc2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlJiBzcmMpOworICAgIHNhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZSYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZSYgc3JjKTsKKyAgICBzYWZlX1ZrTWFwcGVkTWVtb3J5UmFuZ2UoKTsKKyAgICB+c2FmZV9Wa01hcHBlZE1lbW9yeVJhbmdlKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNYXBwZWRNZW1vcnlSYW5nZSogc3JjKTsKKyAgICBWa01hcHBlZE1lbW9yeVJhbmdlICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWFwcGVkTWVtb3J5UmFuZ2UgKj4odGhpcyk7IH0KKyAgICBWa01hcHBlZE1lbW9yeVJhbmdlIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWFwcGVkTWVtb3J5UmFuZ2UgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8geworICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICB1aW50MzJfdCBiaW5kQ291bnQ7CisgICAgVmtTcGFyc2VNZW1vcnlCaW5kKiBwQmluZHM7CisgICAgc2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKGNvbnN0IFZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKGNvbnN0IHNhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKCk7CisgICAgfnNhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8qIHNyYyk7CisgICAgVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvICo+KHRoaXMpOyB9CisgICAgVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8geworICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgdWludDMyX3QgYmluZENvdW50OworICAgIFZrU3BhcnNlTWVtb3J5QmluZCogcEJpbmRzOworICAgIHNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKGNvbnN0IFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyhjb25zdCBzYWZlX1ZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvJiBzcmMpOworICAgIHNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKCk7CisgICAgfnNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8qIHNyYyk7CisgICAgVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyAqPih0aGlzKTsgfQorICAgIFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyB7CisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICB1aW50MzJfdCBiaW5kQ291bnQ7CisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQqIHBCaW5kczsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyhjb25zdCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8oY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbygpOworICAgIH5zYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvKiBzcmMpOworICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8gKj4odGhpcyk7IH0KKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0JpbmRTcGFyc2VJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgd2FpdFNlbWFwaG9yZUNvdW50OworICAgIFZrU2VtYXBob3JlKiBwV2FpdFNlbWFwaG9yZXM7CisgICAgdWludDMyX3QgYnVmZmVyQmluZENvdW50OworICAgIHNhZmVfVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyogcEJ1ZmZlckJpbmRzOworICAgIHVpbnQzMl90IGltYWdlT3BhcXVlQmluZENvdW50OworICAgIHNhZmVfVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvKiBwSW1hZ2VPcGFxdWVCaW5kczsKKyAgICB1aW50MzJfdCBpbWFnZUJpbmRDb3VudDsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyogcEltYWdlQmluZHM7CisgICAgdWludDMyX3Qgc2lnbmFsU2VtYXBob3JlQ291bnQ7CisgICAgVmtTZW1hcGhvcmUqIHBTaWduYWxTZW1hcGhvcmVzOworICAgIHNhZmVfVmtCaW5kU3BhcnNlSW5mbyhjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtCaW5kU3BhcnNlSW5mbyhjb25zdCBzYWZlX1ZrQmluZFNwYXJzZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0JpbmRTcGFyc2VJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0JpbmRTcGFyc2VJbmZvJiBzcmMpOworICAgIHNhZmVfVmtCaW5kU3BhcnNlSW5mbygpOworICAgIH5zYWZlX1ZrQmluZFNwYXJzZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtCaW5kU3BhcnNlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0JpbmRTcGFyc2VJbmZvKiBzcmMpOworICAgIFZrQmluZFNwYXJzZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kU3BhcnNlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrQmluZFNwYXJzZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kU3BhcnNlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtGZW5jZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0ZlbmNlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgc2FmZV9Wa0ZlbmNlQ3JlYXRlSW5mbyhjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRmVuY2VDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtGZW5jZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0ZlbmNlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtGZW5jZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0ZlbmNlQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrRmVuY2VDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRmVuY2VDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrRmVuY2VDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRmVuY2VDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtGZW5jZUNyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGZW5jZUNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU2VtYXBob3JlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgc2FmZV9Wa1NlbWFwaG9yZUNyZWF0ZUluZm8oY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtTZW1hcGhvcmVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1NlbWFwaG9yZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa1NlbWFwaG9yZUNyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2VtYXBob3JlQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmVDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtFdmVudENyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0V2ZW50Q3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgc2FmZV9Wa0V2ZW50Q3JlYXRlSW5mbyhjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRXZlbnRDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtFdmVudENyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0V2ZW50Q3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFdmVudENyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0V2ZW50Q3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrRXZlbnRDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXZlbnRDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrRXZlbnRDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRXZlbnRDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtFdmVudENyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFdmVudENyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUXVlcnlQb29sQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVmtRdWVyeVR5cGUgcXVlcnlUeXBlOworICAgIHVpbnQzMl90IHF1ZXJ5Q291bnQ7CisgICAgVmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3MgcGlwZWxpbmVTdGF0aXN0aWNzOworICAgIHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvKGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUXVlcnlQb29sQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrUXVlcnlQb29sQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQnVmZmVyQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVmtEZXZpY2VTaXplIHNpemU7CisgICAgVmtCdWZmZXJVc2FnZUZsYWdzIHVzYWdlOworICAgIFZrU2hhcmluZ01vZGUgc2hhcmluZ01vZGU7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwUXVldWVGYW1pbHlJbmRpY2VzOworICAgIHNhZmVfVmtCdWZmZXJDcmVhdGVJbmZvKGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrQnVmZmVyQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtCdWZmZXJDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtCdWZmZXJDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtCdWZmZXJDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0J1ZmZlckNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQnVmZmVyQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlckNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQnVmZmVyVmlld0NyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0J1ZmZlclZpZXdDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtGb3JtYXQgZm9ybWF0OworICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQ7CisgICAgVmtEZXZpY2VTaXplIHJhbmdlOworICAgIHNhZmVfVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyhjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrQnVmZmVyVmlld0NyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrQnVmZmVyVmlld0NyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbWFnZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVmtJbWFnZVR5cGUgaW1hZ2VUeXBlOworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICBWa0V4dGVudDNEIGV4dGVudDsKKyAgICB1aW50MzJfdCBtaXBMZXZlbHM7CisgICAgdWludDMyX3QgYXJyYXlMYXllcnM7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXM7CisgICAgVmtJbWFnZVRpbGluZyB0aWxpbmc7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2U7CisgICAgVmtTaGFyaW5nTW9kZSBzaGFyaW5nTW9kZTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgVmtJbWFnZUxheW91dCBpbml0aWFsTGF5b3V0OworICAgIHNhZmVfVmtJbWFnZUNyZWF0ZUluZm8oY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltYWdlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa0ltYWdlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0ltYWdlVmlld0NyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgVmtJbWFnZVZpZXdUeXBlIHZpZXdUeXBlOworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICBWa0NvbXBvbmVudE1hcHBpbmcgY29tcG9uZW50czsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBzdWJyZXNvdXJjZVJhbmdlOworICAgIHNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvKGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtJbWFnZVZpZXdDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlVmlld0NyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlVmlld0NyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU2hhZGVyTW9kdWxlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgc2l6ZV90IGNvZGVTaXplOworICAgIGNvbnN0IHVpbnQzMl90KiBwQ29kZTsKKyAgICBzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyhjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtQaXBlbGluZUNhY2hlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgc2l6ZV90IGluaXRpYWxEYXRhU2l6ZTsKKyAgICBjb25zdCB2b2lkKiBwSW5pdGlhbERhdGE7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbyB7CisgICAgdWludDMyX3QgbWFwRW50cnlDb3VudDsKKyAgICBjb25zdCBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkqIHBNYXBFbnRyaWVzOworICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICBjb25zdCB2b2lkKiBwRGF0YTsKKyAgICBzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvKGNvbnN0IFZrU3BlY2lhbGl6YXRpb25JbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm8oY29uc3Qgc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU3BlY2lhbGl6YXRpb25JbmZvKCk7CisgICAgfnNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTcGVjaWFsaXphdGlvbkluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTcGVjaWFsaXphdGlvbkluZm8qIHNyYyk7CisgICAgVmtTcGVjaWFsaXphdGlvbkluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGVjaWFsaXphdGlvbkluZm8gKj4odGhpcyk7IH0KKyAgICBWa1NwZWNpYWxpemF0aW9uSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NwZWNpYWxpemF0aW9uSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZTsKKyAgICBWa1NoYWRlck1vZHVsZSBtb2R1bGU7CisgICAgY29uc3QgY2hhciogcE5hbWU7CisgICAgc2FmZV9Wa1NwZWNpYWxpemF0aW9uSW5mbyogcFNwZWNpYWxpemF0aW9uSW5mbzsKKyAgICBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3QgdmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ7CisgICAgY29uc3QgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiogcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnM7CisgICAgdWludDMyX3QgdmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudDsKKyAgICBjb25zdCBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24qIHBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnM7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVmtQcmltaXRpdmVUb3BvbG9neSB0b3BvbG9neTsKKyAgICBWa0Jvb2wzMiBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlOworICAgIHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3QgcGF0Y2hDb250cm9sUG9pbnRzOworICAgIHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCB2aWV3cG9ydENvdW50OworICAgIGNvbnN0IFZrVmlld3BvcnQqIHBWaWV3cG9ydHM7CisgICAgdWludDMyX3Qgc2Npc3NvckNvdW50OworICAgIGNvbnN0IFZrUmVjdDJEKiBwU2Npc3NvcnM7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QsIGNvbnN0IGJvb2wgaXNfZHluYW1pY192aWV3cG9ydHMsIGNvbnN0IGJvb2wgaXNfZHluYW1pY19zY2lzc29ycyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCwgY29uc3QgYm9vbCBpc19keW5hbWljX3ZpZXdwb3J0cywgY29uc3QgYm9vbCBpc19keW5hbWljX3NjaXNzb3JzKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIFZrQm9vbDMyIGRlcHRoQ2xhbXBFbmFibGU7CisgICAgVmtCb29sMzIgcmFzdGVyaXplckRpc2NhcmRFbmFibGU7CisgICAgVmtQb2x5Z29uTW9kZSBwb2x5Z29uTW9kZTsKKyAgICBWa0N1bGxNb2RlRmxhZ3MgY3VsbE1vZGU7CisgICAgVmtGcm9udEZhY2UgZnJvbnRGYWNlOworICAgIFZrQm9vbDMyIGRlcHRoQmlhc0VuYWJsZTsKKyAgICBmbG9hdCBkZXB0aEJpYXNDb25zdGFudEZhY3RvcjsKKyAgICBmbG9hdCBkZXB0aEJpYXNDbGFtcDsKKyAgICBmbG9hdCBkZXB0aEJpYXNTbG9wZUZhY3RvcjsKKyAgICBmbG9hdCBsaW5lV2lkdGg7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHJhc3Rlcml6YXRpb25TYW1wbGVzOworICAgIFZrQm9vbDMyIHNhbXBsZVNoYWRpbmdFbmFibGU7CisgICAgZmxvYXQgbWluU2FtcGxlU2hhZGluZzsKKyAgICBjb25zdCBWa1NhbXBsZU1hc2sqIHBTYW1wbGVNYXNrOworICAgIFZrQm9vbDMyIGFscGhhVG9Db3ZlcmFnZUVuYWJsZTsKKyAgICBWa0Jvb2wzMiBhbHBoYVRvT25lRW5hYmxlOworICAgIHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKGNvbnN0IFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWa0Jvb2wzMiBkZXB0aFRlc3RFbmFibGU7CisgICAgVmtCb29sMzIgZGVwdGhXcml0ZUVuYWJsZTsKKyAgICBWa0NvbXBhcmVPcCBkZXB0aENvbXBhcmVPcDsKKyAgICBWa0Jvb2wzMiBkZXB0aEJvdW5kc1Rlc3RFbmFibGU7CisgICAgVmtCb29sMzIgc3RlbmNpbFRlc3RFbmFibGU7CisgICAgVmtTdGVuY2lsT3BTdGF0ZSBmcm9udDsKKyAgICBWa1N0ZW5jaWxPcFN0YXRlIGJhY2s7CisgICAgZmxvYXQgbWluRGVwdGhCb3VuZHM7CisgICAgZmxvYXQgbWF4RGVwdGhCb3VuZHM7CisgICAgc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKGNvbnN0IFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWa0Jvb2wzMiBsb2dpY09wRW5hYmxlOworICAgIFZrTG9naWNPcCBsb2dpY09wOworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSogcEF0dGFjaG1lbnRzOworICAgIGZsb2F0IGJsZW5kQ29uc3RhbnRzWzRdOworICAgIHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBkeW5hbWljU3RhdGVDb3VudDsKKyAgICBjb25zdCBWa0R5bmFtaWNTdGF0ZSogcER5bmFtaWNTdGF0ZXM7CisgICAgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3Qgc3RhZ2VDb3VudDsKKyAgICBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qIHBTdGFnZXM7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8qIHBWZXJ0ZXhJbnB1dFN0YXRlOworICAgIHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8qIHBJbnB1dEFzc2VtYmx5U3RhdGU7CisgICAgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKiBwVGVzc2VsbGF0aW9uU3RhdGU7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8qIHBWaWV3cG9ydFN0YXRlOworICAgIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8qIHBSYXN0ZXJpemF0aW9uU3RhdGU7CisgICAgc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8qIHBNdWx0aXNhbXBsZVN0YXRlOworICAgIHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyogcERlcHRoU3RlbmNpbFN0YXRlOworICAgIHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8qIHBDb2xvckJsZW5kU3RhdGU7CisgICAgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyogcER5bmFtaWNTdGF0ZTsKKyAgICBWa1BpcGVsaW5lTGF5b3V0IGxheW91dDsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICB1aW50MzJfdCBzdWJwYXNzOworICAgIFZrUGlwZWxpbmUgYmFzZVBpcGVsaW5lSGFuZGxlOworICAgIGludDMyX3QgYmFzZVBpcGVsaW5lSW5kZXg7CisgICAgc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIGluX3N0cnVjdCwgY29uc3QgYm9vbCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQsIGNvbnN0IGJvb2wgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCk7CisgICAgc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QsIGNvbnN0IGJvb2wgdXNlc19jb2xvcl9hdHRhY2htZW50LCBjb25zdCBib29sIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHN0YWdlOworICAgIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0OworICAgIFZrUGlwZWxpbmUgYmFzZVBpcGVsaW5lSGFuZGxlOworICAgIGludDMyX3QgYmFzZVBpcGVsaW5lSW5kZXg7CisgICAgc2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8oY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3Qgc2V0TGF5b3V0Q291bnQ7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiBwU2V0TGF5b3V0czsKKyAgICB1aW50MzJfdCBwdXNoQ29uc3RhbnRSYW5nZUNvdW50OworICAgIGNvbnN0IFZrUHVzaENvbnN0YW50UmFuZ2UqIHBQdXNoQ29uc3RhbnRSYW5nZXM7CisgICAgc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyhjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1NhbXBsZXJDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWa0ZpbHRlciBtYWdGaWx0ZXI7CisgICAgVmtGaWx0ZXIgbWluRmlsdGVyOworICAgIFZrU2FtcGxlck1pcG1hcE1vZGUgbWlwbWFwTW9kZTsKKyAgICBWa1NhbXBsZXJBZGRyZXNzTW9kZSBhZGRyZXNzTW9kZVU7CisgICAgVmtTYW1wbGVyQWRkcmVzc01vZGUgYWRkcmVzc01vZGVWOworICAgIFZrU2FtcGxlckFkZHJlc3NNb2RlIGFkZHJlc3NNb2RlVzsKKyAgICBmbG9hdCBtaXBMb2RCaWFzOworICAgIFZrQm9vbDMyIGFuaXNvdHJvcHlFbmFibGU7CisgICAgZmxvYXQgbWF4QW5pc290cm9weTsKKyAgICBWa0Jvb2wzMiBjb21wYXJlRW5hYmxlOworICAgIFZrQ29tcGFyZU9wIGNvbXBhcmVPcDsKKyAgICBmbG9hdCBtaW5Mb2Q7CisgICAgZmxvYXQgbWF4TG9kOworICAgIFZrQm9yZGVyQ29sb3IgYm9yZGVyQ29sb3I7CisgICAgVmtCb29sMzIgdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXM7CisgICAgc2FmZV9Wa1NhbXBsZXJDcmVhdGVJbmZvKGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NhbXBsZXJDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1NhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2FtcGxlckNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIHsKKyAgICB1aW50MzJfdCBiaW5kaW5nOworICAgIFZrRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGU7CisgICAgdWludDMyX3QgZGVzY3JpcHRvckNvdW50OworICAgIFZrU2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzOworICAgIFZrU2FtcGxlciogcEltbXV0YWJsZVNhbXBsZXJzOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyhjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyhjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcmIHNyYyk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nJiBzcmMpOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZygpOworICAgIH5zYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nKiBzcmMpOworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyAqPih0aGlzKTsgfQorICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IGJpbmRpbmdDb3VudDsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcqIHBCaW5kaW5nczsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8oY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IG1heFNldHM7CisgICAgdWludDMyX3QgcG9vbFNpemVDb3VudDsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sU2l6ZSogcFBvb2xTaXplczsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbDsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQ7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiBwU2V0TGF5b3V0czsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyhjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbygpOworICAgIH5zYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiBzcmMpOworICAgIFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGVzY3JpcHRvclNldCBkc3RTZXQ7CisgICAgdWludDMyX3QgZHN0QmluZGluZzsKKyAgICB1aW50MzJfdCBkc3RBcnJheUVsZW1lbnQ7CisgICAgdWludDMyX3QgZGVzY3JpcHRvckNvdW50OworICAgIFZrRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGU7CisgICAgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvKiBwSW1hZ2VJbmZvOworICAgIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8qIHBCdWZmZXJJbmZvOworICAgIFZrQnVmZmVyVmlldyogcFRleGVsQnVmZmVyVmlldzsKKyAgICBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0KGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQoY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldCYgc3JjKTsKKyAgICBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0JiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldCYgc3JjKTsKKyAgICBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0KCk7CisgICAgfnNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXQqIHNyYyk7CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtXcml0ZURlc2NyaXB0b3JTZXQgKj4odGhpcyk7IH0KKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1dyaXRlRGVzY3JpcHRvclNldCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtDb3B5RGVzY3JpcHRvclNldCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGVzY3JpcHRvclNldCBzcmNTZXQ7CisgICAgdWludDMyX3Qgc3JjQmluZGluZzsKKyAgICB1aW50MzJfdCBzcmNBcnJheUVsZW1lbnQ7CisgICAgVmtEZXNjcmlwdG9yU2V0IGRzdFNldDsKKyAgICB1aW50MzJfdCBkc3RCaW5kaW5nOworICAgIHVpbnQzMl90IGRzdEFycmF5RWxlbWVudDsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yQ291bnQ7CisgICAgc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0KGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0KGNvbnN0IHNhZmVfVmtDb3B5RGVzY3JpcHRvclNldCYgc3JjKTsKKyAgICBzYWZlX1ZrQ29weURlc2NyaXB0b3JTZXQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQ29weURlc2NyaXB0b3JTZXQmIHNyYyk7CisgICAgc2FmZV9Wa0NvcHlEZXNjcmlwdG9yU2V0KCk7CisgICAgfnNhZmVfVmtDb3B5RGVzY3JpcHRvclNldCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ29weURlc2NyaXB0b3JTZXQqIHNyYyk7CisgICAgVmtDb3B5RGVzY3JpcHRvclNldCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NvcHlEZXNjcmlwdG9yU2V0ICo+KHRoaXMpOyB9CisgICAgVmtDb3B5RGVzY3JpcHRvclNldCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NvcHlEZXNjcmlwdG9yU2V0IGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVGbGFncyBmbGFnczsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50Q291bnQ7CisgICAgVmtJbWFnZVZpZXcqIHBBdHRhY2htZW50czsKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgbGF5ZXJzOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8oY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbiB7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb25GbGFncyBmbGFnczsKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50OworICAgIHVpbnQzMl90IGlucHV0QXR0YWNobWVudENvdW50OworICAgIGNvbnN0IFZrQXR0YWNobWVudFJlZmVyZW5jZSogcElucHV0QXR0YWNobWVudHM7CisgICAgdWludDMyX3QgY29sb3JBdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlKiBwQ29sb3JBdHRhY2htZW50czsKKyAgICBjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UqIHBSZXNvbHZlQXR0YWNobWVudHM7CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlKiBwRGVwdGhTdGVuY2lsQXR0YWNobWVudDsKKyAgICB1aW50MzJfdCBwcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcFByZXNlcnZlQXR0YWNobWVudHM7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbihjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uKGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24mIHNyYyk7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24mIHNyYyk7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbigpOworICAgIH5zYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uKiBzcmMpOworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VicGFzc0Rlc2NyaXB0aW9uICo+KHRoaXMpOyB9CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdWJwYXNzRGVzY3JpcHRpb24gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgVmtBdHRhY2htZW50RGVzY3JpcHRpb24qIHBBdHRhY2htZW50czsKKyAgICB1aW50MzJfdCBzdWJwYXNzQ291bnQ7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbiogcFN1YnBhc3NlczsKKyAgICB1aW50MzJfdCBkZXBlbmRlbmN5Q291bnQ7CisgICAgY29uc3QgVmtTdWJwYXNzRGVwZW5kZW5jeSogcERlcGVuZGVuY2llczsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8oY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXg7CisgICAgc2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyhjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtDb21tYW5kUG9vbENyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDb21tYW5kUG9vbENyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kUG9vbENyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2w7CisgICAgVmtDb21tYW5kQnVmZmVyTGV2ZWwgbGV2ZWw7CisgICAgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50OworICAgIHNhZmVfVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyhjb25zdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qIHNyYyk7CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzOworICAgIHVpbnQzMl90IHN1YnBhc3M7CisgICAgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcjsKKyAgICBWa0Jvb2wzMiBvY2NsdXNpb25RdWVyeUVuYWJsZTsKKyAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzIHF1ZXJ5RmxhZ3M7CisgICAgVmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3MgcGlwZWxpbmVTdGF0aXN0aWNzOworICAgIHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyhjb25zdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvJiBzcmMpOworICAgIHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKCk7CisgICAgfnNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8qIHNyYyk7CisgICAgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQ29tbWFuZEJ1ZmZlclVzYWdlRmxhZ3MgZmxhZ3M7CisgICAgc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8qIHBJbmhlcml0YW5jZUluZm87CisgICAgc2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8oY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBzcmMpOworICAgIHNhZmVfVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8oKTsKKyAgICB+c2FmZV9Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogc3JjKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvICo+KHRoaXMpOyB9CisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtNZW1vcnlCYXJyaWVyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtBY2Nlc3NGbGFncyBzcmNBY2Nlc3NNYXNrOworICAgIFZrQWNjZXNzRmxhZ3MgZHN0QWNjZXNzTWFzazsKKyAgICBzYWZlX1ZrTWVtb3J5QmFycmllcihjb25zdCBWa01lbW9yeUJhcnJpZXIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa01lbW9yeUJhcnJpZXIoY29uc3Qgc2FmZV9Wa01lbW9yeUJhcnJpZXImIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeUJhcnJpZXImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5QmFycmllciYgc3JjKTsKKyAgICBzYWZlX1ZrTWVtb3J5QmFycmllcigpOworICAgIH5zYWZlX1ZrTWVtb3J5QmFycmllcigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeUJhcnJpZXIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNZW1vcnlCYXJyaWVyKiBzcmMpOworICAgIFZrTWVtb3J5QmFycmllciAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeUJhcnJpZXIgKj4odGhpcyk7IH0KKyAgICBWa01lbW9yeUJhcnJpZXIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlCYXJyaWVyIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0FjY2Vzc0ZsYWdzIHNyY0FjY2Vzc01hc2s7CisgICAgVmtBY2Nlc3NGbGFncyBkc3RBY2Nlc3NNYXNrOworICAgIHVpbnQzMl90IHNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgdWludDMyX3QgZHN0UXVldWVGYW1pbHlJbmRleDsKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtEZXZpY2VTaXplIG9mZnNldDsKKyAgICBWa0RldmljZVNpemUgc2l6ZTsKKyAgICBzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcihjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXIoY29uc3Qgc2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXImIHNyYyk7CisgICAgc2FmZV9Wa0J1ZmZlck1lbW9yeUJhcnJpZXImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllciYgc3JjKTsKKyAgICBzYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcigpOworICAgIH5zYWZlX1ZrQnVmZmVyTWVtb3J5QmFycmllcigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBzcmMpOworICAgIFZrQnVmZmVyTWVtb3J5QmFycmllciAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKj4odGhpcyk7IH0KKyAgICBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXJNZW1vcnlCYXJyaWVyIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllciB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQWNjZXNzRmxhZ3Mgc3JjQWNjZXNzTWFzazsKKyAgICBWa0FjY2Vzc0ZsYWdzIGRzdEFjY2Vzc01hc2s7CisgICAgVmtJbWFnZUxheW91dCBvbGRMYXlvdXQ7CisgICAgVmtJbWFnZUxheW91dCBuZXdMYXlvdXQ7CisgICAgdWludDMyX3Qgc3JjUXVldWVGYW1pbHlJbmRleDsKKyAgICB1aW50MzJfdCBkc3RRdWV1ZUZhbWlseUluZGV4OworICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3VicmVzb3VyY2VSYW5nZTsKKyAgICBzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyKGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXIoY29uc3Qgc2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllciYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlTWVtb3J5QmFycmllciYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VNZW1vcnlCYXJyaWVyKCk7CisgICAgfnNhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZU1lbW9yeUJhcnJpZXIqIHNyYyk7CisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZU1lbW9yeUJhcnJpZXIgKj4odGhpcyk7IH0KKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlTWVtb3J5QmFycmllciBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3M7CisgICAgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcjsKKyAgICBWa1JlY3QyRCByZW5kZXJBcmVhOworICAgIHVpbnQzMl90IGNsZWFyVmFsdWVDb3VudDsKKyAgICBjb25zdCBWa0NsZWFyVmFsdWUqIHBDbGVhclZhbHVlczsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbyhjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm8oY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NCZWdpbkluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbygpOworICAgIH5zYWZlX1ZrUmVuZGVyUGFzc0JlZ2luSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQmVnaW5JbmZvKiBzcmMpOworICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3NCZWdpbkluZm8gKj4odGhpcyk7IH0KKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzQmVnaW5JbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgc3ViZ3JvdXBTaXplOworICAgIFZrU2hhZGVyU3RhZ2VGbGFncyBzdXBwb3J0ZWRTdGFnZXM7CisgICAgVmtTdWJncm91cEZlYXR1cmVGbGFncyBzdXBwb3J0ZWRPcGVyYXRpb25zOworICAgIFZrQm9vbDMyIHF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCdWZmZXIgYnVmZmVyOworICAgIFZrRGV2aWNlTWVtb3J5IG1lbW9yeTsKKyAgICBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0OworICAgIHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyhjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyhjb25zdCBzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvJiBzcmMpOworICAgIHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5SW5mbygpOworICAgIH5zYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvKiBzcmMpOworICAgIFZrQmluZEJ1ZmZlck1lbW9yeUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kQnVmZmVyTWVtb3J5SW5mbyAqPih0aGlzKTsgfQorICAgIFZrQmluZEJ1ZmZlck1lbW9yeUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kQnVmZmVyTWVtb3J5SW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnk7CisgICAgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldDsKKyAgICBzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbyhjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm8oY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbygpOworICAgIH5zYWZlX1ZrQmluZEltYWdlTWVtb3J5SW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlJbmZvKiBzcmMpOworICAgIFZrQmluZEltYWdlTWVtb3J5SW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0JpbmRJbWFnZU1lbW9yeUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0JpbmRJbWFnZU1lbW9yeUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kSW1hZ2VNZW1vcnlJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBzdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3M7CisgICAgVmtCb29sMzIgdW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzczsKKyAgICBWa0Jvb2wzMiBzdG9yYWdlUHVzaENvbnN0YW50MTY7CisgICAgVmtCb29sMzIgc3RvcmFnZUlucHV0T3V0cHV0MTY7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMoY29uc3QgVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbjsKKyAgICBWa0Jvb2wzMiByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb247CisgICAgc2FmZV9Wa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyhjb25zdCBWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzKGNvbnN0IHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMmIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMmIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cygpOworICAgIH5zYWZlX1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzKiBzcmMpOworICAgIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzICo+KHRoaXMpOyB9CisgICAgVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgc2FmZV9Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyhjb25zdCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKGNvbnN0IHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbygpOworICAgIH5zYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvKiBzcmMpOworICAgIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa01lbW9yeUFsbG9jYXRlRmxhZ3MgZmxhZ3M7CisgICAgdWludDMyX3QgZGV2aWNlTWFzazsKKyAgICBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8oY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8oY29uc3Qgc2FmZV9Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvJiBzcmMpOworICAgIHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8oKTsKKyAgICB+c2FmZV9Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyogc3JjKTsKKyAgICBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gKj4odGhpcyk7IH0KKyAgICBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgZGV2aWNlTWFzazsKKyAgICB1aW50MzJfdCBkZXZpY2VSZW5kZXJBcmVhQ291bnQ7CisgICAgY29uc3QgVmtSZWN0MkQqIHBEZXZpY2VSZW5kZXJBcmVhczsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvKGNvbnN0IFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvKCk7CisgICAgfnNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8qIHNyYyk7CisgICAgVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8gKj4odGhpcyk7IH0KKyAgICBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBkZXZpY2VNYXNrOworICAgIHNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8oY29uc3QgVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyhjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBzcmMpOworICAgIHNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvJiBzcmMpOworICAgIHNhZmVfVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8oKTsKKyAgICB+c2FmZV9Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogc3JjKTsKKyAgICBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAqPih0aGlzKTsgfQorICAgIFZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0RldmljZUdyb3VwU3VibWl0SW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IHdhaXRTZW1hcGhvcmVDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcFdhaXRTZW1hcGhvcmVEZXZpY2VJbmRpY2VzOworICAgIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrczsKKyAgICB1aW50MzJfdCBzaWduYWxTZW1hcGhvcmVDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXM7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwU3VibWl0SW5mbyhjb25zdCBWa0RldmljZUdyb3VwU3VibWl0SW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwU3VibWl0SW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwU3VibWl0SW5mbygpOworICAgIH5zYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvKiBzcmMpOworICAgIFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvICo+KHRoaXMpOyB9CisgICAgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IHJlc291cmNlRGV2aWNlSW5kZXg7CisgICAgdWludDMyX3QgbWVtb3J5RGV2aWNlSW5kZXg7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8oY29uc3QgVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvJiBzcmMpOworICAgIHNhZmVfVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8oKTsKKyAgICB+c2FmZV9Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyogc3JjKTsKKyAgICBWa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvICo+KHRoaXMpOyB9CisgICAgVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgZGV2aWNlSW5kZXhDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcERldmljZUluZGljZXM7CisgICAgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8oY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvKGNvbnN0IHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvJiBzcmMpOworICAgIHNhZmVfVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8oKTsKKyAgICB+c2FmZV9Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyogc3JjKTsKKyAgICBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvICo+KHRoaXMpOyB9CisgICAgVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBkZXZpY2VJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwRGV2aWNlSW5kaWNlczsKKyAgICB1aW50MzJfdCBzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50OworICAgIGNvbnN0IFZrUmVjdDJEKiBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zOworICAgIHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8oY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyhjb25zdCBzYWZlX1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvJiBzcmMpOworICAgIHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvJiBzcmMpOworICAgIHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8oKTsKKyAgICB+c2FmZV9Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyogc3JjKTsKKyAgICBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyAqPih0aGlzKTsgfQorICAgIFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgcGh5c2ljYWxEZXZpY2VDb3VudDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlc1tWS19NQVhfREVWSUNFX0dST1VQX1NJWkVdOworICAgIFZrQm9vbDMyIHN1YnNldEFsbG9jYXRpb247CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IHBoeXNpY2FsRGV2aWNlQ291bnQ7CisgICAgVmtQaHlzaWNhbERldmljZSogcFBoeXNpY2FsRGV2aWNlczsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKGNvbnN0IFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICBzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoY29uc3QgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoY29uc3Qgc2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzcmMpOworICAgIHNhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiYgc3JjKTsKKyAgICBzYWZlX1ZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoKTsKKyAgICB+c2FmZV9Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogc3JjKTsKKyAgICBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKj4odGhpcyk7IH0KKyAgICBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKGNvbnN0IHNhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzImIHNyYyk7CisgICAgc2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoKTsKKyAgICB+c2FmZV9Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogc3JjKTsKKyAgICBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICo+KHRoaXMpOyB9CisgICAgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBzYWZlX1ZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMihjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIoY29uc3Qgc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzImIHNyYyk7CisgICAgc2FmZV9Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMigpOworICAgIH5zYWZlX1ZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yKiBzcmMpOworICAgIFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgKj4odGhpcyk7IH0KKyAgICBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1vcnlSZXF1aXJlbWVudHM7CisgICAgc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czIoY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtNZW1vcnlSZXF1aXJlbWVudHMyKGNvbnN0IHNhZmVfVmtNZW1vcnlSZXF1aXJlbWVudHMyJiBzcmMpOworICAgIHNhZmVfVmtNZW1vcnlSZXF1aXJlbWVudHMyJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czImIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czIoKTsKKyAgICB+c2FmZV9Wa01lbW9yeVJlcXVpcmVtZW50czIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5UmVxdWlyZW1lbnRzMiogc3JjKTsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlSZXF1aXJlbWVudHMyICo+KHRoaXMpOyB9CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5UmVxdWlyZW1lbnRzMiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIG1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKGNvbnN0IFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiYgc3JjKTsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiYgc3JjKTsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyKCk7CisgICAgfnNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIqIHNyYyk7CisgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgKj4odGhpcyk7IH0KKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBmZWF0dXJlczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoY29uc3QgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoY29uc3QgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtGb3JtYXRQcm9wZXJ0aWVzMiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRQcm9wZXJ0aWVzOworICAgIHNhZmVfVmtGb3JtYXRQcm9wZXJ0aWVzMihjb25zdCBWa0Zvcm1hdFByb3BlcnRpZXMyKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtGb3JtYXRQcm9wZXJ0aWVzMihjb25zdCBzYWZlX1ZrRm9ybWF0UHJvcGVydGllczImIHNyYyk7CisgICAgc2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyJiBzcmMpOworICAgIHNhZmVfVmtGb3JtYXRQcm9wZXJ0aWVzMigpOworICAgIH5zYWZlX1ZrRm9ybWF0UHJvcGVydGllczIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtGb3JtYXRQcm9wZXJ0aWVzMiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Zvcm1hdFByb3BlcnRpZXMyKiBzcmMpOworICAgIFZrRm9ybWF0UHJvcGVydGllczIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGb3JtYXRQcm9wZXJ0aWVzMiAqPih0aGlzKTsgfQorICAgIFZrRm9ybWF0UHJvcGVydGllczIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGb3JtYXRQcm9wZXJ0aWVzMiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgaW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIHNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKGNvbnN0IFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihjb25zdCBzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCk7CisgICAgfnNhZmVfVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlRm9ybWF0UHJvcGVydGllczIqIHNyYyk7CisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAqPih0aGlzKTsgfQorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtGb3JtYXQgZm9ybWF0OworICAgIFZrSW1hZ2VUeXBlIHR5cGU7CisgICAgVmtJbWFnZVRpbGluZyB0aWxpbmc7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2U7CisgICAgVmtJbWFnZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIoY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyBxdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgICAgc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczIoY29uc3QgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKGNvbnN0IHNhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyJiBzcmMpOworICAgIHNhZmVfVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczImIHNyYyk7CisgICAgc2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczIoKTsKKyAgICB+c2FmZV9Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiogc3JjKTsKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyICo+KHRoaXMpOyB9CisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgbWVtb3J5UHJvcGVydGllczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMihjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgIHNhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKGNvbnN0IFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihjb25zdCBzYWZlX1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiYgc3JjKTsKKyAgICBzYWZlX1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyJiBzcmMpOworICAgIHNhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCk7CisgICAgfnNhZmVfVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIqIHNyYyk7CisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAqPih0aGlzKTsgfQorICAgIFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtGb3JtYXQgZm9ybWF0OworICAgIFZrSW1hZ2VUeXBlIHR5cGU7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXM7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2U7CisgICAgVmtJbWFnZVRpbGluZyB0aWxpbmc7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMihjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrUG9pbnRDbGlwcGluZ0JlaGF2aW9yIHBvaW50Q2xpcHBpbmdCZWhhdmlvcjsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcygpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgYXNwZWN0UmVmZXJlbmNlQ291bnQ7CisgICAgY29uc3QgVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UqIHBBc3BlY3RSZWZlcmVuY2VzOworICAgIHNhZmVfVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyhjb25zdCBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvKGNvbnN0IFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luIGRvbWFpbk9yaWdpbjsKKyAgICBzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8oY29uc3QgVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8oKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyogc3JjKTsKKyAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBzdWJwYXNzQ291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBWaWV3TWFza3M7CisgICAgdWludDMyX3QgZGVwZW5kZW5jeUNvdW50OworICAgIGNvbnN0IGludDMyX3QqIHBWaWV3T2Zmc2V0czsKKyAgICB1aW50MzJfdCBjb3JyZWxhdGlvbk1hc2tDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcENvcnJlbGF0aW9uTWFza3M7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvKGNvbnN0IFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBtdWx0aXZpZXc7CisgICAgVmtCb29sMzIgbXVsdGl2aWV3R2VvbWV0cnlTaGFkZXI7CisgICAgVmtCb29sMzIgbXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgbWF4TXVsdGl2aWV3Vmlld0NvdW50OworICAgIHVpbnQzMl90IG1heE11bHRpdmlld0luc3RhbmNlSW5kZXg7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcygpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXMgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiB2YXJpYWJsZVBvaW50ZXJzU3RvcmFnZUJ1ZmZlcjsKKyAgICBWa0Jvb2wzMiB2YXJpYWJsZVBvaW50ZXJzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcygpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgcHJvdGVjdGVkTWVtb3J5OworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgcHJvdGVjdGVkTm9GYXVsdDsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeVByb3BlcnRpZXMgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXZpY2VRdWV1ZUluZm8yIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXg7CisgICAgdWludDMyX3QgcXVldWVJbmRleDsKKyAgICBzYWZlX1ZrRGV2aWNlUXVldWVJbmZvMihjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzIoY29uc3Qgc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzImIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZVF1ZXVlSW5mbzImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlUXVldWVJbmZvMiYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlUXVldWVJbmZvMigpOworICAgIH5zYWZlX1ZrRGV2aWNlUXVldWVJbmZvMigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VRdWV1ZUluZm8yKiBzcmMpOworICAgIFZrRGV2aWNlUXVldWVJbmZvMiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZVF1ZXVlSW5mbzIgKj4odGhpcyk7IH0KKyAgICBWa0RldmljZVF1ZXVlSW5mbzIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VRdWV1ZUluZm8yIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1Byb3RlY3RlZFN1Ym1pdEluZm8geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBwcm90ZWN0ZWRTdWJtaXQ7CisgICAgc2FmZV9Wa1Byb3RlY3RlZFN1Ym1pdEluZm8oY29uc3QgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvKGNvbnN0IHNhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQcm90ZWN0ZWRTdWJtaXRJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1Byb3RlY3RlZFN1Ym1pdEluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1Byb3RlY3RlZFN1Ym1pdEluZm8oKTsKKyAgICB+c2FmZV9Wa1Byb3RlY3RlZFN1Ym1pdEluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUHJvdGVjdGVkU3VibWl0SW5mbyogc3JjKTsKKyAgICBWa1Byb3RlY3RlZFN1Ym1pdEluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQcm90ZWN0ZWRTdWJtaXRJbmZvICo+KHRoaXMpOyB9CisgICAgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUHJvdGVjdGVkU3VibWl0SW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICBWa1NhbXBsZXJZY2Jjck1vZGVsQ29udmVyc2lvbiB5Y2Jjck1vZGVsOworICAgIFZrU2FtcGxlclljYmNyUmFuZ2UgeWNiY3JSYW5nZTsKKyAgICBWa0NvbXBvbmVudE1hcHBpbmcgY29tcG9uZW50czsKKyAgICBWa0Nocm9tYUxvY2F0aW9uIHhDaHJvbWFPZmZzZXQ7CisgICAgVmtDaHJvbWFMb2NhdGlvbiB5Q2hyb21hT2Zmc2V0OworICAgIFZrRmlsdGVyIGNocm9tYUZpbHRlcjsKKyAgICBWa0Jvb2wzMiBmb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb247CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uIGNvbnZlcnNpb247CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvKGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvKGNvbnN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvKCk7CisgICAgfnNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8qIHNyYyk7CisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvICo+KHRoaXMpOyB9CisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrSW1hZ2VBc3BlY3RGbGFnQml0cyBwbGFuZUFzcGVjdDsKKyAgICBzYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvKGNvbnN0IFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8oY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvKCk7CisgICAgfnNhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8qIHNyYyk7CisgICAgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrSW1hZ2VBc3BlY3RGbGFnQml0cyBwbGFuZUFzcGVjdDsKKyAgICBzYWZlX1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8oY29uc3QgVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8oY29uc3Qgc2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8oKTsKKyAgICB+c2FmZV9Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyogc3JjKTsKKyAgICBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gKj4odGhpcyk7IH0KKyAgICBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBzYW1wbGVyWWNiY3JDb252ZXJzaW9uOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcygpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgY29tYmluZWRJbWFnZVNhbXBsZXJEZXNjcmlwdG9yQ291bnQ7CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMoY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzJiBzcmMpOworICAgIHNhZmVfVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMoKTsKKyAgICB+c2FmZV9Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyogc3JjKTsKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICo+KHRoaXMpOyB9CisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudDsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5KiBwRGVzY3JpcHRvclVwZGF0ZUVudHJpZXM7CisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIHRlbXBsYXRlVHlwZTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY3JpcHRvclNldExheW91dDsKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50OworICAgIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQ7CisgICAgdWludDMyX3Qgc2V0OworICAgIHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyhjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbygpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzOworICAgIHNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyhjb25zdCBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyhjb25zdCBzYWZlX1ZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzJiBzcmMpOworICAgIHNhZmVfVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcygpOworICAgIH5zYWZlX1ZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiBzcmMpOworICAgIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyAqPih0aGlzKTsgfQorICAgIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQnVmZmVyQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVmtCdWZmZXJVc2FnZUZsYWdzIHVzYWdlOworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8oY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8oKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzOworICAgIHNhZmVfVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoY29uc3QgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyhjb25zdCBzYWZlX1ZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzJiBzcmMpOworICAgIHNhZmVfVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzJiBzcmMpOworICAgIHNhZmVfVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMoKTsKKyAgICB+c2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyogc3JjKTsKKyAgICBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyAqPih0aGlzKTsgfQorICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDhfdCBkZXZpY2VVVUlEW1ZLX1VVSURfU0laRV07CisgICAgdWludDhfdCBkcml2ZXJVVUlEW1ZLX1VVSURfU0laRV07CisgICAgdWludDhfdCBkZXZpY2VMVUlEW1ZLX0xVSURfU0laRV07CisgICAgdWludDMyX3QgZGV2aWNlTm9kZU1hc2s7CisgICAgVmtCb29sMzIgZGV2aWNlTFVJRFZhbGlkOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcygpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXM7CisgICAgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvKGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3MgaGFuZGxlVHlwZXM7CisgICAgc2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyhjb25zdCBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvKGNvbnN0IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvICo+KHRoaXMpOyB9CisgICAgVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFncyBoYW5kbGVUeXBlczsKKyAgICBzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvKGNvbnN0IFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8oY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8qIHNyYyk7CisgICAgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8oY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8oKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncyBleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlczsKKyAgICBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ3MgY29tcGF0aWJsZUhhbmRsZVR5cGVzOworICAgIFZrRXh0ZXJuYWxGZW5jZUZlYXR1cmVGbGFncyBleHRlcm5hbEZlbmNlRmVhdHVyZXM7CisgICAgc2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKGNvbnN0IFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyYgc3JjKTsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKCk7CisgICAgfnNhZmVfVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMqIHNyYyk7CisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzICo+KHRoaXMpOyB9CisgICAgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFncyBoYW5kbGVUeXBlczsKKyAgICBzYWZlX1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvKGNvbnN0IFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvKCk7CisgICAgfnNhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8qIHNyYyk7CisgICAgVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFncyBoYW5kbGVUeXBlczsKKyAgICBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyhjb25zdCBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8oY29uc3Qgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyYgc3JjKTsKKyAgICBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbygpOworICAgIH5zYWZlX1ZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8qIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvKiBzcmMpOworICAgIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gKj4odGhpcyk7IH0KKyAgICBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8mIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbygpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8oKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdzIGV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzOworICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ3MgY29tcGF0aWJsZUhhbmRsZVR5cGVzOworICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlRmxhZ3MgZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlczsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKGNvbnN0IFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoY29uc3Qgc2FmZV9Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyYgc3JjKTsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyYgc3JjKTsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzKCk7CisgICAgfnNhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMqIHNyYyk7CisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgKj4odGhpcyk7IH0KKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBtYXhQZXJTZXREZXNjcmlwdG9yczsKKyAgICBWa0RldmljZVNpemUgbWF4TWVtb3J5QWxsb2NhdGlvblNpemU7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyhjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcygpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNYWludGVuYW5jZTNQcm9wZXJ0aWVzICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBzdXBwb3J0ZWQ7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQmIHNyYyk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KCk7CisgICAgfnNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQqIHNyYyk7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0ICo+KHRoaXMpOyB9CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0IGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHNoYWRlckRyYXdQYXJhbWV0ZXJzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyhjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcygpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcyAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1N3YXBjaGFpbkNyZWF0ZUZsYWdzS0hSIGZsYWdzOworICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlOworICAgIHVpbnQzMl90IG1pbkltYWdlQ291bnQ7CisgICAgVmtGb3JtYXQgaW1hZ2VGb3JtYXQ7CisgICAgVmtDb2xvclNwYWNlS0hSIGltYWdlQ29sb3JTcGFjZTsKKyAgICBWa0V4dGVudDJEIGltYWdlRXh0ZW50OworICAgIHVpbnQzMl90IGltYWdlQXJyYXlMYXllcnM7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgaW1hZ2VVc2FnZTsKKyAgICBWa1NoYXJpbmdNb2RlIGltYWdlU2hhcmluZ01vZGU7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwUXVldWVGYW1pbHlJbmRpY2VzOworICAgIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHByZVRyYW5zZm9ybTsKKyAgICBWa0NvbXBvc2l0ZUFscGhhRmxhZ0JpdHNLSFIgY29tcG9zaXRlQWxwaGE7CisgICAgVmtQcmVzZW50TW9kZUtIUiBwcmVzZW50TW9kZTsKKyAgICBWa0Jvb2wzMiBjbGlwcGVkOworICAgIFZrU3dhcGNoYWluS0hSIG9sZFN3YXBjaGFpbjsKKyAgICBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUihjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIoY29uc3Qgc2FmZV9Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBzcmMpOworICAgIFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1ByZXNlbnRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgd2FpdFNlbWFwaG9yZUNvdW50OworICAgIFZrU2VtYXBob3JlKiBwV2FpdFNlbWFwaG9yZXM7CisgICAgdWludDMyX3Qgc3dhcGNoYWluQ291bnQ7CisgICAgVmtTd2FwY2hhaW5LSFIqIHBTd2FwY2hhaW5zOworICAgIGNvbnN0IHVpbnQzMl90KiBwSW1hZ2VJbmRpY2VzOworICAgIFZrUmVzdWx0KiBwUmVzdWx0czsKKyAgICBzYWZlX1ZrUHJlc2VudEluZm9LSFIoY29uc3QgVmtQcmVzZW50SW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUHJlc2VudEluZm9LSFIoY29uc3Qgc2FmZV9Wa1ByZXNlbnRJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtQcmVzZW50SW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQcmVzZW50SW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUHJlc2VudEluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa1ByZXNlbnRJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUHJlc2VudEluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQcmVzZW50SW5mb0tIUiogc3JjKTsKKyAgICBWa1ByZXNlbnRJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUHJlc2VudEluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa1ByZXNlbnRJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUHJlc2VudEluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluOworICAgIHNhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIoY29uc3QgVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogc3JjKTsKKyAgICBWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW47CisgICAgdWludDMyX3QgaW1hZ2VJbmRleDsKKyAgICBzYWZlX1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUihjb25zdCBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIoY29uc3Qgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUigpOworICAgIH5zYWZlX1ZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSKiBzcmMpOworICAgIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluOworICAgIHVpbnQ2NF90IHRpbWVvdXQ7CisgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIFZrRmVuY2UgZmVuY2U7CisgICAgdWludDMyX3QgZGV2aWNlTWFzazsKKyAgICBzYWZlX1ZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIoY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIoY29uc3Qgc2FmZV9Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogc3JjKTsKKyAgICBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgcHJlc2VudE1hc2tbVktfTUFYX0RFVklDRV9HUk9VUF9TSVpFXTsKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiBtb2RlczsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKGNvbnN0IFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSKCk7CisgICAgfnNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIqIHNyYyk7CisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgc3dhcGNoYWluQ291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBEZXZpY2VNYXNrczsKKyAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnQml0c0tIUiBtb2RlOworICAgIHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSKGNvbnN0IFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUihjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIqIHNyYyk7CisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIgbW9kZXM7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUihjb25zdCBWa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKiBzcmMpOworICAgIFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFIgeworICAgIFZrRGlzcGxheUtIUiBkaXNwbGF5OworICAgIGNvbnN0IGNoYXIqIGRpc3BsYXlOYW1lOworICAgIFZrRXh0ZW50MkQgcGh5c2ljYWxEaW1lbnNpb25zOworICAgIFZrRXh0ZW50MkQgcGh5c2ljYWxSZXNvbHV0aW9uOworICAgIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSIHN1cHBvcnRlZFRyYW5zZm9ybXM7CisgICAgVmtCb29sMzIgcGxhbmVSZW9yZGVyUG9zc2libGU7CisgICAgVmtCb29sMzIgcGVyc2lzdGVudENvbnRlbnQ7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKGNvbnN0IFZrRGlzcGxheVByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKCk7CisgICAgfnNhZmVfVmtEaXNwbGF5UHJvcGVydGllc0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFIqIHNyYyk7CisgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSICo+KHRoaXMpOyB9CisgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGlzcGxheU1vZGVDcmVhdGVGbGFnc0tIUiBmbGFnczsKKyAgICBWa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUiBwYXJhbWV0ZXJzOworICAgIHNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIoY29uc3QgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiogc3JjKTsKKyAgICBWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGlzcGxheVN1cmZhY2VDcmVhdGVGbGFnc0tIUiBmbGFnczsKKyAgICBWa0Rpc3BsYXlNb2RlS0hSIGRpc3BsYXlNb2RlOworICAgIHVpbnQzMl90IHBsYW5lSW5kZXg7CisgICAgdWludDMyX3QgcGxhbmVTdGFja0luZGV4OworICAgIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHRyYW5zZm9ybTsKKyAgICBmbG9hdCBnbG9iYWxBbHBoYTsKKyAgICBWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgYWxwaGFNb2RlOworICAgIFZrRXh0ZW50MkQgaW1hZ2VFeHRlbnQ7CisgICAgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUihjb25zdCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSKiBzcmMpOworICAgIFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtSZWN0MkQgc3JjUmVjdDsKKyAgICBWa1JlY3QyRCBkc3RSZWN0OworICAgIFZrQm9vbDMyIHBlcnNpc3RlbnQ7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUihjb25zdCBWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5UHJlc2VudEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUigpOworICAgIH5zYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGlzcGxheVByZXNlbnRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheVByZXNlbnRJbmZvS0hSKiBzcmMpOworICAgIFZrRGlzcGxheVByZXNlbnRJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVByZXNlbnRJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UHJlc2VudEluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKK3N0cnVjdCBzYWZlX1ZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtYbGliU3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzOworICAgIERpc3BsYXkqIGRweTsKKyAgICBXaW5kb3cgd2luZG93OworICAgIHNhZmVfVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIoY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogc3JjKTsKKyAgICBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKK3N0cnVjdCBzYWZlX1ZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1hjYlN1cmZhY2VDcmVhdGVGbGFnc0tIUiBmbGFnczsKKyAgICB4Y2JfY29ubmVjdGlvbl90KiBjb25uZWN0aW9uOworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7CisgICAgc2FmZV9Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHNyYyk7CisgICAgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKK3N0cnVjdCBzYWZlX1ZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUZsYWdzS0hSIGZsYWdzOworICAgIHN0cnVjdCB3bF9kaXNwbGF5KiBkaXNwbGF5OworICAgIHN0cnVjdCB3bF9zdXJmYWNlKiBzdXJmYWNlOworICAgIHNhZmVfVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIoY29uc3QgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogc3JjKTsKKyAgICBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitzdHJ1Y3Qgc2FmZV9Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVGbGFnc0tIUiBmbGFnczsKKyAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyogd2luZG93OworICAgIHNhZmVfVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIoY29uc3QgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogc3JjKTsKKyAgICBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RydWN0IHNhZmVfVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtXaW4zMlN1cmZhY2VDcmVhdGVGbGFnc0tIUiBmbGFnczsKKyAgICBISU5TVEFOQ0UgaGluc3RhbmNlOworICAgIEhXTkQgaHduZDsKKyAgICBzYWZlX1ZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUihjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIoY29uc3Qgc2FmZV9Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBzcmMpOworICAgIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgTFBDV1NUUiBuYW1lOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiogc3JjKTsKKyAgICBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogcEF0dHJpYnV0ZXM7CisgICAgRFdPUkQgZHdBY2Nlc3M7CisgICAgTFBDV1NUUiBuYW1lOworICAgIHNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiogc3JjKTsKKyAgICBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHM7CisgICAgc2FmZV9Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUihjb25zdCBWa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKGNvbnN0IHNhZmVfVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUigpOworICAgIH5zYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSKiBzcmMpOworICAgIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSICo+KHRoaXMpOyB9CisgICAgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RydWN0IHNhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnk7CisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICAgIHNhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiogc3JjKTsKKyAgICBWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworc3RydWN0IHNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgICAgaW50IGZkOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIoY29uc3QgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUihjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiogc3JjKTsKKyAgICBWa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydE1lbW9yeUZkSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IG1lbW9yeVR5cGVCaXRzOworICAgIHNhZmVfVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIoY29uc3QgVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUihjb25zdCBzYWZlX1ZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtNZW1vcnlGZFByb3BlcnRpZXNLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtNZW1vcnlGZFByb3BlcnRpZXNLSFIoKTsKKyAgICB+c2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeUZkUHJvcGVydGllc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeUZkUHJvcGVydGllc0tIUiogc3JjKTsKKyAgICBWa01lbW9yeUZkUHJvcGVydGllc0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeUZkUHJvcGVydGllc0tIUiAqPih0aGlzKTsgfQorICAgIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGV2aWNlTWVtb3J5IG1lbW9yeTsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgICAgc2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUihjb25zdCBWa01lbW9yeUdldEZkSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSKGNvbnN0IHNhZmVfVmtNZW1vcnlHZXRGZEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlHZXRGZEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeUdldEZkSW5mb0tIUigpOworICAgIH5zYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWVtb3J5R2V0RmRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5R2V0RmRJbmZvS0hSKiBzcmMpOworICAgIFZrTWVtb3J5R2V0RmRJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5R2V0RmRJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtNZW1vcnlHZXRGZEluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlHZXRGZEluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdHJ1Y3Qgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IGFjcXVpcmVDb3VudDsKKyAgICBWa0RldmljZU1lbW9yeSogcEFjcXVpcmVTeW5jczsKKyAgICBjb25zdCB1aW50NjRfdCogcEFjcXVpcmVLZXlzOworICAgIGNvbnN0IHVpbnQzMl90KiBwQWNxdWlyZVRpbWVvdXRzOworICAgIHVpbnQzMl90IHJlbGVhc2VDb3VudDsKKyAgICBWa0RldmljZU1lbW9yeSogcFJlbGVhc2VTeW5jczsKKyAgICBjb25zdCB1aW50NjRfdCogcFJlbGVhc2VLZXlzOworICAgIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIoY29uc3QgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUihjb25zdCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiogc3JjKTsKKyAgICBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIFZrU2VtYXBob3JlSW1wb3J0RmxhZ3MgZmxhZ3M7CisgICAgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgTFBDV1NUUiBuYW1lOworICAgIHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogc3JjKTsKKyAgICBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogcEF0dHJpYnV0ZXM7CisgICAgRFdPUkQgZHdBY2Nlc3M7CisgICAgTFBDV1NUUiBuYW1lOworICAgIHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoY29uc3QgVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogc3JjKTsKKyAgICBWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCB3YWl0U2VtYXBob3JlVmFsdWVzQ291bnQ7CisgICAgY29uc3QgdWludDY0X3QqIHBXYWl0U2VtYXBob3JlVmFsdWVzOworICAgIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50OworICAgIGNvbnN0IHVpbnQ2NF90KiBwU2lnbmFsU2VtYXBob3JlVmFsdWVzOworICAgIHNhZmVfVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUihjb25zdCBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUihjb25zdCBzYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUigpOworICAgIH5zYWZlX1ZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSKiBzcmMpOworICAgIFZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdHJ1Y3Qgc2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgICAgc2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBzcmMpOworICAgIFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitzdHJ1Y3Qgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBWa1NlbWFwaG9yZUltcG9ydEZsYWdzIGZsYWdzOworICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICBpbnQgZmQ7CisgICAgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUihjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKGNvbnN0IHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUigpOworICAgIH5zYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiBzcmMpOworICAgIFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICBzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIoY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIqIHNyYyk7CisgICAgVmtTZW1hcGhvcmVHZXRGZEluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmVHZXRGZEluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IG1heFB1c2hEZXNjcmlwdG9yczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgc2hhZGVyRmxvYXQxNjsKKyAgICBWa0Jvb2wzMiBzaGFkZXJJbnQ4OworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1ByZXNlbnRSZWdpb25LSFIgeworICAgIHVpbnQzMl90IHJlY3RhbmdsZUNvdW50OworICAgIGNvbnN0IFZrUmVjdExheWVyS0hSKiBwUmVjdGFuZ2xlczsKKyAgICBzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUihjb25zdCBWa1ByZXNlbnRSZWdpb25LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1ByZXNlbnRSZWdpb25LSFIoY29uc3Qgc2FmZV9Wa1ByZXNlbnRSZWdpb25LSFImIHNyYyk7CisgICAgc2FmZV9Wa1ByZXNlbnRSZWdpb25LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUHJlc2VudFJlZ2lvbktIUigpOworICAgIH5zYWZlX1ZrUHJlc2VudFJlZ2lvbktIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1ByZXNlbnRSZWdpb25LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQcmVzZW50UmVnaW9uS0hSKiBzcmMpOworICAgIFZrUHJlc2VudFJlZ2lvbktIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1ByZXNlbnRSZWdpb25LSFIgKj4odGhpcyk7IH0KKyAgICBWa1ByZXNlbnRSZWdpb25LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50UmVnaW9uS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgc3dhcGNoYWluQ291bnQ7CisgICAgc2FmZV9Wa1ByZXNlbnRSZWdpb25LSFIqIHBSZWdpb25zOworICAgIHNhZmVfVmtQcmVzZW50UmVnaW9uc0tIUihjb25zdCBWa1ByZXNlbnRSZWdpb25zS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQcmVzZW50UmVnaW9uc0tIUihjb25zdCBzYWZlX1ZrUHJlc2VudFJlZ2lvbnNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSJiBzcmMpOworICAgIHNhZmVfVmtQcmVzZW50UmVnaW9uc0tIUigpOworICAgIH5zYWZlX1ZrUHJlc2VudFJlZ2lvbnNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQcmVzZW50UmVnaW9uc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1ByZXNlbnRSZWdpb25zS0hSKiBzcmMpOworICAgIFZrUHJlc2VudFJlZ2lvbnNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50UmVnaW9uc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUHJlc2VudFJlZ2lvbnNLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50UmVnaW9uc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBpbWFnZWxlc3NGcmFtZWJ1ZmZlcjsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2U7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGxheWVyQ291bnQ7CisgICAgdWludDMyX3Qgdmlld0Zvcm1hdENvdW50OworICAgIGNvbnN0IFZrRm9ybWF0KiBwVmlld0Zvcm1hdHM7CisgICAgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUihjb25zdCBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSKGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSKiBzcmMpOworICAgIFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQ7CisgICAgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiogcEF0dGFjaG1lbnRJbWFnZUluZm9zOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUihjb25zdCBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSKiBzcmMpOworICAgIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudDsKKyAgICBWa0ltYWdlVmlldyogcEF0dGFjaG1lbnRzOworICAgIHNhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUihjb25zdCBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUihjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUigpOworICAgIH5zYWZlX1ZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSKiBzcmMpOworICAgIFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFncyBmbGFnczsKKyAgICBWa0Zvcm1hdCBmb3JtYXQ7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXM7CisgICAgVmtBdHRhY2htZW50TG9hZE9wIGxvYWRPcDsKKyAgICBWa0F0dGFjaG1lbnRTdG9yZU9wIHN0b3JlT3A7CisgICAgVmtBdHRhY2htZW50TG9hZE9wIHN0ZW5jaWxMb2FkT3A7CisgICAgVmtBdHRhY2htZW50U3RvcmVPcCBzdGVuY2lsU3RvcmVPcDsKKyAgICBWa0ltYWdlTGF5b3V0IGluaXRpYWxMYXlvdXQ7CisgICAgVmtJbWFnZUxheW91dCBmaW5hbExheW91dDsKKyAgICBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUihjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIoY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFImIHNyYyk7CisgICAgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUigpOworICAgIH5zYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSKiBzcmMpOworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgKj4odGhpcyk7IH0KKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgYXR0YWNobWVudDsKKyAgICBWa0ltYWdlTGF5b3V0IGxheW91dDsKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFzazsKKyAgICBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSJiBzcmMpOworICAgIHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIoKTsKKyAgICB+c2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogc3JjKTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgKj4odGhpcyk7IH0KKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uRmxhZ3MgZmxhZ3M7CisgICAgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludDsKKyAgICB1aW50MzJfdCB2aWV3TWFzazsKKyAgICB1aW50MzJfdCBpbnB1dEF0dGFjaG1lbnRDb3VudDsKKyAgICBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIqIHBJbnB1dEF0dGFjaG1lbnRzOworICAgIHVpbnQzMl90IGNvbG9yQXR0YWNobWVudENvdW50OworICAgIHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcENvbG9yQXR0YWNobWVudHM7CisgICAgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSKiBwUmVzb2x2ZUF0dGFjaG1lbnRzOworICAgIHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiogcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQ7CisgICAgdWludDMyX3QgcHJlc2VydmVBdHRhY2htZW50Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzOworICAgIHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSKGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUihjb25zdCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSJiBzcmMpOworICAgIHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSKCk7CisgICAgfnNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIqIHNyYyk7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiAqPih0aGlzKTsgfQorICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgc3JjU3VicGFzczsKKyAgICB1aW50MzJfdCBkc3RTdWJwYXNzOworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzazsKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2s7CisgICAgVmtBY2Nlc3NGbGFncyBzcmNBY2Nlc3NNYXNrOworICAgIFZrQWNjZXNzRmxhZ3MgZHN0QWNjZXNzTWFzazsKKyAgICBWa0RlcGVuZGVuY3lGbGFncyBkZXBlbmRlbmN5RmxhZ3M7CisgICAgaW50MzJfdCB2aWV3T2Zmc2V0OworICAgIHNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIoY29uc3QgVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUihjb25zdCBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSJiBzcmMpOworICAgIHNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3VicGFzc0RlcGVuZGVuY3kyS0hSJiBzcmMpOworICAgIHNhZmVfVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIoKTsKKyAgICB+c2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUiogc3JjKTsKKyAgICBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiAqPih0aGlzKTsgfQorICAgIFZrU3VicGFzc0RlcGVuZGVuY3kyS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VicGFzc0RlcGVuZGVuY3kyS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUZsYWdzIGZsYWdzOworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudDsKKyAgICBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiogcEF0dGFjaG1lbnRzOworICAgIHVpbnQzMl90IHN1YnBhc3NDb3VudDsKKyAgICBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiogcFN1YnBhc3NlczsKKyAgICB1aW50MzJfdCBkZXBlbmRlbmN5Q291bnQ7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUiogcERlcGVuZGVuY2llczsKKyAgICB1aW50MzJfdCBjb3JyZWxhdGVkVmlld01hc2tDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcENvcnJlbGF0ZWRWaWV3TWFza3M7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUihjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFImIHNyYyk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFImIHNyYyk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUigpOworICAgIH5zYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSKiBzcmMpOworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICo+KHRoaXMpOyB9CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzOworICAgIHNhZmVfVmtTdWJwYXNzQmVnaW5JbmZvS0hSKGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUihjb25zdCBzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU3VicGFzc0JlZ2luSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdWJwYXNzQmVnaW5JbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtTdWJwYXNzQmVnaW5JbmZvS0hSKCk7CisgICAgfnNhZmVfVmtTdWJwYXNzQmVnaW5JbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1YnBhc3NCZWdpbkluZm9LSFIqIHNyYyk7CisgICAgVmtTdWJwYXNzQmVnaW5JbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VicGFzc0JlZ2luSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrU3VicGFzc0JlZ2luSW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N1YnBhc3NCZWdpbkluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU3VicGFzc0VuZEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBzYWZlX1ZrU3VicGFzc0VuZEluZm9LSFIoY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3VicGFzc0VuZEluZm9LSFIoY29uc3Qgc2FmZV9Wa1N1YnBhc3NFbmRJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU3VicGFzc0VuZEluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa1N1YnBhc3NFbmRJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTdWJwYXNzRW5kSW5mb0tIUiogc3JjKTsKKyAgICBWa1N1YnBhc3NFbmRJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VicGFzc0VuZEluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa1N1YnBhc3NFbmRJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VicGFzc0VuZEluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyBzaGFyZWRQcmVzZW50U3VwcG9ydGVkVXNhZ2VGbGFnczsKKyAgICBzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoY29uc3QgVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoY29uc3Qgc2FmZV9Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoKTsKKyAgICB+c2FmZV9Wa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiogc3JjKTsKKyAgICBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdHJ1Y3Qgc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtGZW5jZSBmZW5jZTsKKyAgICBWa0ZlbmNlSW1wb3J0RmxhZ3MgZmxhZ3M7CisgICAgVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIGhhbmRsZVR5cGU7CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBMUENXU1RSIG5hbWU7CisgICAgc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqIHNyYyk7CisgICAgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBjb25zdCBTRUNVUklUWV9BVFRSSUJVVEVTKiBwQXR0cmlidXRlczsKKyAgICBEV09SRCBkd0FjY2VzczsKKyAgICBMUENXU1RSIG5hbWU7CisgICAgc2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIqIHNyYyk7CisgICAgVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyBoYW5kbGVUeXBlOworICAgIHNhZmVfVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUihjb25zdCBzYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSKiBzcmMpOworICAgIFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3N0cnVjdCBzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIFZrRmVuY2VJbXBvcnRGbGFncyBmbGFnczsKKyAgICBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICBpbnQgZmQ7CisgICAgc2FmZV9Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSKGNvbnN0IFZrSW1wb3J0RmVuY2VGZEluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSKGNvbnN0IHNhZmVfVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtJbXBvcnRGZW5jZUZkSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1wb3J0RmVuY2VGZEluZm9LSFIqIHNyYyk7CisgICAgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydEZlbmNlRmRJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltcG9ydEZlbmNlRmRJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtGZW5jZSBmZW5jZTsKKyAgICBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICBzYWZlX1ZrRmVuY2VHZXRGZEluZm9LSFIoY29uc3QgVmtGZW5jZUdldEZkSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRmVuY2VHZXRGZEluZm9LSFIoY29uc3Qgc2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtGZW5jZUdldEZkSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtGZW5jZUdldEZkSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRmVuY2VHZXRGZEluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0ZlbmNlR2V0RmRJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtGZW5jZUdldEZkSW5mb0tIUiogc3JjKTsKKyAgICBWa0ZlbmNlR2V0RmRJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRmVuY2VHZXRGZEluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa0ZlbmNlR2V0RmRJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRmVuY2VHZXRGZEluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBwZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzOworICAgIFZrQm9vbDMyIHBlcmZvcm1hbmNlQ291bnRlck11bHRpcGxlUXVlcnlQb29sczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIGFsbG93Q29tbWFuZEJ1ZmZlclF1ZXJ5Q29waWVzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtQZXJmb3JtYW5jZUNvdW50ZXJVbml0S0hSIHVuaXQ7CisgICAgVmtQZXJmb3JtYW5jZUNvdW50ZXJTY29wZUtIUiBzY29wZTsKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlclN0b3JhZ2VLSFIgc3RvcmFnZTsKKyAgICB1aW50OF90IHV1aWRbVktfVVVJRF9TSVpFXTsKKyAgICBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKGNvbnN0IFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlcktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlcktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyS0hSKCk7CisgICAgfnNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqIHNyYyk7CisgICAgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlQ291bnRlcktIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25GbGFnc0tIUiBmbGFnczsKKyAgICBjaGFyIG5hbWVbVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIGNoYXIgY2F0ZWdvcnlbVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIGNoYXIgZGVzY3JpcHRpb25bVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUihjb25zdCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUihjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFImIHNyYyk7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSJiBzcmMpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUigpOworICAgIH5zYWZlX1ZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSKiBzcmMpOworICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiAqPih0aGlzKTsgfQorICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4OworICAgIHVpbnQzMl90IGNvdW50ZXJJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwQ291bnRlckluZGljZXM7CisgICAgc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUihjb25zdCBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSKiBzcmMpOworICAgIFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0ZsYWdzS0hSIGZsYWdzOworICAgIHVpbnQ2NF90IHRpbWVvdXQ7CisgICAgc2FmZV9Wa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUihjb25zdCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKGNvbnN0IHNhZmVfVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUigpOworICAgIH5zYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSKiBzcmMpOworICAgIFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBjb3VudGVyUGFzc0luZGV4OworICAgIHNhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUihjb25zdCBWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUihjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUigpOworICAgIH5zYWZlX1ZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSKiBzcmMpOworICAgIFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdXJmYWNlQ2FwYWJpbGl0aWVzOworICAgIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUihjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUihjb25zdCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFImIHNyYyk7CisgICAgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSJiBzcmMpOworICAgIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUigpOworICAgIH5zYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiBzcmMpOworICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiAqPih0aGlzKTsgfQorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTdXJmYWNlRm9ybWF0MktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrU3VyZmFjZUZvcm1hdEtIUiBzdXJmYWNlRm9ybWF0OworICAgIHNhZmVfVmtTdXJmYWNlRm9ybWF0MktIUihjb25zdCBWa1N1cmZhY2VGb3JtYXQyS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTdXJmYWNlRm9ybWF0MktIUihjb25zdCBzYWZlX1ZrU3VyZmFjZUZvcm1hdDJLSFImIHNyYyk7CisgICAgc2FmZV9Wa1N1cmZhY2VGb3JtYXQyS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1cmZhY2VGb3JtYXQyS0hSJiBzcmMpOworICAgIHNhZmVfVmtTdXJmYWNlRm9ybWF0MktIUigpOworICAgIH5zYWZlX1ZrU3VyZmFjZUZvcm1hdDJLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTdXJmYWNlRm9ybWF0MktIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1cmZhY2VGb3JtYXQyS0hSKiBzcmMpOworICAgIFZrU3VyZmFjZUZvcm1hdDJLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlRm9ybWF0MktIUiAqPih0aGlzKTsgfQorICAgIFZrU3VyZmFjZUZvcm1hdDJLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlRm9ybWF0MktIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEaXNwbGF5UHJvcGVydGllczJLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXNLSFIgZGlzcGxheVByb3BlcnRpZXM7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUihjb25zdCBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5UHJvcGVydGllczJLSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5UHJvcGVydGllczJLSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUigpOworICAgIH5zYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGlzcGxheVByb3BlcnRpZXMyS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheVByb3BlcnRpZXMyS0hSKiBzcmMpOworICAgIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVByb3BlcnRpZXMyS0hSICo+KHRoaXMpOyB9CisgICAgVmtEaXNwbGF5UHJvcGVydGllczJLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UHJvcGVydGllczJLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgZGlzcGxheVBsYW5lUHJvcGVydGllczsKKyAgICBzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoY29uc3QgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSJiBzcmMpOworICAgIHNhZmVfVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoKTsKKyAgICB+c2FmZV9Wa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogc3JjKTsKKyAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgKj4odGhpcyk7IH0KKyAgICBWa0Rpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSIGRpc3BsYXlNb2RlUHJvcGVydGllczsKKyAgICBzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUihjb25zdCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUigpOworICAgIH5zYWZlX1ZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKiBzcmMpOworICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgKj4odGhpcyk7IH0KKyAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEaXNwbGF5TW9kZUtIUiBtb2RlOworICAgIHVpbnQzMl90IHBsYW5lSW5kZXg7CisgICAgc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSKGNvbnN0IFZrRGlzcGxheVBsYW5lSW5mbzJLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVJbmZvMktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrRGlzcGxheVBsYW5lSW5mbzJLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGlzcGxheVBsYW5lSW5mbzJLSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSKCk7CisgICAgfnNhZmVfVmtEaXNwbGF5UGxhbmVJbmZvMktIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheVBsYW5lSW5mbzJLSFIqIHNyYyk7CisgICAgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQbGFuZUluZm8yS0hSICo+KHRoaXMpOyB9CisgICAgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQbGFuZUluZm8yS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiBjYXBhYmlsaXRpZXM7CisgICAgc2FmZV9Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoY29uc3QgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKGNvbnN0IHNhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSJiBzcmMpOworICAgIHNhZmVfVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFImIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoKTsKKyAgICB+c2FmZV9Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiogc3JjKTsKKyAgICBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSICo+KHRoaXMpOyB9CisgICAgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgdmlld0Zvcm1hdENvdW50OworICAgIGNvbnN0IFZrRm9ybWF0KiBwVmlld0Zvcm1hdHM7CisgICAgc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIoY29uc3QgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKGNvbnN0IHNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiogc3JjKTsKKyAgICBWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgc2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgc3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3M7CisgICAgVmtCb29sMzIgdW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzOworICAgIFZrQm9vbDMyIHN0b3JhZ2VQdXNoQ29uc3RhbnQ4OworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHNoYWRlckJ1ZmZlckludDY0QXRvbWljczsKKyAgICBWa0Jvb2wzMiBzaGFkZXJTaGFyZWRJbnQ2NEF0b21pY3M7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgc2hhZGVyU3ViZ3JvdXBDbG9jazsKKyAgICBWa0Jvb2wzMiBzaGFkZXJEZXZpY2VDbG9jazsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDbG9ja0ZlYXR1cmVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0RyaXZlcklkS0hSIGRyaXZlcklEOworICAgIGNoYXIgZHJpdmVyTmFtZVtWS19NQVhfRFJJVkVSX05BTUVfU0laRV9LSFJdOworICAgIGNoYXIgZHJpdmVySW5mb1tWS19NQVhfRFJJVkVSX0lORk9fU0laRV9LSFJdOworICAgIFZrQ29uZm9ybWFuY2VWZXJzaW9uS0hSIGNvbmZvcm1hbmNlVmVyc2lvbjsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEcml2ZXJQcm9wZXJ0aWVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtTaGFkZXJGbG9hdENvbnRyb2xzSW5kZXBlbmRlbmNlS0hSIGRlbm9ybUJlaGF2aW9ySW5kZXBlbmRlbmNlOworICAgIFZrU2hhZGVyRmxvYXRDb250cm9sc0luZGVwZW5kZW5jZUtIUiByb3VuZGluZ01vZGVJbmRlcGVuZGVuY2U7CisgICAgVmtCb29sMzIgc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQxNjsKKyAgICBWa0Jvb2wzMiBzaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDMyOworICAgIFZrQm9vbDMyIHNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0NjQ7CisgICAgVmtCb29sMzIgc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDE2OworICAgIFZrQm9vbDMyIHNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMjsKKyAgICBWa0Jvb2wzMiBzaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0NjQ7CisgICAgVmtCb29sMzIgc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDE2OworICAgIFZrQm9vbDMyIHNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMjsKKyAgICBWa0Jvb2wzMiBzaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0NjQ7CisgICAgVmtCb29sMzIgc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQxNjsKKyAgICBWa0Jvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDMyOworICAgIFZrQm9vbDMyIHNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0NjQ7CisgICAgVmtCb29sMzIgc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQxNjsKKyAgICBWa0Jvb2wzMiBzaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDMyOworICAgIFZrQm9vbDMyIHNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0NjQ7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIGRlcHRoUmVzb2x2ZU1vZGU7CisgICAgVmtSZXNvbHZlTW9kZUZsYWdCaXRzS0hSIHN0ZW5jaWxSZXNvbHZlTW9kZTsKKyAgICBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIqIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudDsKKyAgICBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUihjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIoY29uc3Qgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFImIHNyYyk7CisgICAgc2FmZV9Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUigpOworICAgIH5zYWZlX1ZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSKiBzcmMpOworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgKj4odGhpcyk7IH0KKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa1Jlc29sdmVNb2RlRmxhZ3NLSFIgc3VwcG9ydGVkRGVwdGhSZXNvbHZlTW9kZXM7CisgICAgVmtSZXNvbHZlTW9kZUZsYWdzS0hSIHN1cHBvcnRlZFN0ZW5jaWxSZXNvbHZlTW9kZXM7CisgICAgVmtCb29sMzIgaW5kZXBlbmRlbnRSZXNvbHZlTm9uZTsKKyAgICBWa0Jvb2wzMiBpbmRlcGVuZGVudFJlc29sdmU7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIoY29uc3QgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiB0aW1lbGluZVNlbWFwaG9yZTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQ2NF90IG1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU2VtYXBob3JlVHlwZUtIUiBzZW1hcGhvcmVUeXBlOworICAgIHVpbnQ2NF90IGluaXRpYWxWYWx1ZTsKKyAgICBzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIoY29uc3QgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIoY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiogc3JjKTsKKyAgICBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgd2FpdFNlbWFwaG9yZVZhbHVlQ291bnQ7CisgICAgY29uc3QgdWludDY0X3QqIHBXYWl0U2VtYXBob3JlVmFsdWVzOworICAgIHVpbnQzMl90IHNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQ7CisgICAgY29uc3QgdWludDY0X3QqIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXM7CisgICAgc2FmZV9Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUihjb25zdCBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSKGNvbnN0IHNhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUigpOworICAgIH5zYWZlX1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSKiBzcmMpOworICAgIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU2VtYXBob3JlV2FpdEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1NlbWFwaG9yZVdhaXRGbGFnc0tIUiBmbGFnczsKKyAgICB1aW50MzJfdCBzZW1hcGhvcmVDb3VudDsKKyAgICBWa1NlbWFwaG9yZSogcFNlbWFwaG9yZXM7CisgICAgY29uc3QgdWludDY0X3QqIHBWYWx1ZXM7CisgICAgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSKGNvbnN0IFZrU2VtYXBob3JlV2FpdEluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrU2VtYXBob3JlV2FpdEluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2VtYXBob3JlV2FpdEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtTZW1hcGhvcmVXYWl0SW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2VtYXBob3JlV2FpdEluZm9LSFIqIHNyYyk7CisgICAgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NlbWFwaG9yZVdhaXRJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NlbWFwaG9yZVdhaXRJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgdWludDY0X3QgdmFsdWU7CisgICAgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIoY29uc3QgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKGNvbnN0IHNhZmVfVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiogc3JjKTsKKyAgICBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiB2dWxrYW5NZW1vcnlNb2RlbDsKKyAgICBWa0Jvb2wzMiB2dWxrYW5NZW1vcnlNb2RlbERldmljZVNjb3BlOworICAgIFZrQm9vbDMyIHZ1bGthbk1lbW9yeU1vZGVsQXZhaWxhYmlsaXR5VmlzaWJpbGl0eUNoYWluczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgc3VwcG9ydHNQcm90ZWN0ZWQ7CisgICAgc2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIoY29uc3QgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKGNvbnN0IHNhZmVfVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIoKTsKKyAgICB+c2FmZV9Wa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiogc3JjKTsKKyAgICBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSICo+KHRoaXMpOyB9CisgICAgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0ltYWdlTGF5b3V0IHN0ZW5jaWxMYXlvdXQ7CisgICAgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSKGNvbnN0IFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSKGNvbnN0IHNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiYgc3JjKTsKKyAgICBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFImIHNyYyk7CisgICAgc2FmZV9Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSKCk7CisgICAgfnNhZmVfVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIqIHNyYyk7CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSICo+KHRoaXMpOyB9CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0ltYWdlTGF5b3V0IHN0ZW5jaWxJbml0aWFsTGF5b3V0OworICAgIFZrSW1hZ2VMYXlvdXQgc3RlbmNpbEZpbmFsTGF5b3V0OworICAgIHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSKGNvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUihjb25zdCBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiYgc3JjKTsKKyAgICBzYWZlX1ZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSJiBzcmMpOworICAgIHNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSKCk7CisgICAgfnNhZmVfVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIqIHNyYyk7CisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiAqPih0aGlzKTsgfQorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dDsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgYnVmZmVyRGV2aWNlQWRkcmVzczsKKyAgICBWa0Jvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTsKKyAgICBWa0Jvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCdWZmZXIgYnVmZmVyOworICAgIHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUihjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUihjb25zdCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUigpOworICAgIH5zYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSKiBzcmMpOworICAgIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50NjRfdCBvcGFxdWVDYXB0dXJlQWRkcmVzczsKKyAgICBzYWZlX1ZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSKGNvbnN0IFZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIoY29uc3Qgc2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIqIHNyYyk7CisgICAgVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgKj4odGhpcyk7IH0KKyAgICBWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQ2NF90IG9wYXF1ZUNhcHR1cmVBZGRyZXNzOworICAgIHNhZmVfVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUihjb25zdCBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUihjb25zdCBzYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUigpOworICAgIH5zYWZlX1ZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSKiBzcmMpOworICAgIFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnk7CisgICAgc2FmZV9Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUihjb25zdCBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKGNvbnN0IHNhZmVfVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFImIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUigpOworICAgIH5zYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSKiBzcmMpOworICAgIFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSICo+KHRoaXMpOyB9CisgICAgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBwaXBlbGluZUV4ZWN1dGFibGVJbmZvOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUihjb25zdCBWa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFImIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0ZlYXR1cmVzS0hSKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lIHBpcGVsaW5lOworICAgIHNhZmVfVmtQaXBlbGluZUluZm9LSFIoY29uc3QgVmtQaXBlbGluZUluZm9LSFIqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lSW5mb0tIUihjb25zdCBzYWZlX1ZrUGlwZWxpbmVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUluZm9LSFImIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUluZm9LSFIoKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lSW5mb0tIUigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lSW5mb0tIUiogc3JjKTsKKyAgICBWa1BpcGVsaW5lSW5mb0tIUiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVJbmZvS0hSIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVJbmZvS0hSIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VzOworICAgIGNoYXIgbmFtZVtWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgY2hhciBkZXNjcmlwdGlvbltWS19NQVhfREVTQ1JJUFRJT05fU0laRV07CisgICAgdWludDMyX3Qgc3ViZ3JvdXBTaXplOworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUihjb25zdCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIqIHNyYyk7CisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmUgcGlwZWxpbmU7CisgICAgdWludDMyX3QgZXhlY3V0YWJsZUluZGV4OworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUihjb25zdCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIqIHNyYyk7CisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgY2hhciBuYW1lW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBjaGFyIGRlc2NyaXB0aW9uW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0Zvcm1hdEtIUiBmb3JtYXQ7CisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNWYWx1ZUtIUiB2YWx1ZTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIqIHNyYyk7CisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFIgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUiBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgY2hhciBuYW1lW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBjaGFyIGRlc2NyaXB0aW9uW1ZLX01BWF9ERVNDUklQVElPTl9TSVpFXTsKKyAgICBWa0Jvb2wzMiBpc1RleHQ7CisgICAgc2l6ZV90IGRhdGFTaXplOworICAgIHZvaWQqIHBEYXRhOworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUihjb25zdCBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIqIHNyYyk7CisgICAgVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3M7CisgICAgUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBwZm5DYWxsYmFjazsKKyAgICB2b2lkKiBwVXNlckRhdGE7CisgICAgc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtSYXN0ZXJpemF0aW9uT3JkZXJBTUQgcmFzdGVyaXphdGlvbk9yZGVyOworICAgIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRChjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRChjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCgpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EKiBzcmMpOworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZTsKKyAgICB1aW50NjRfdCBvYmplY3Q7CisgICAgY29uc3QgY2hhciogcE9iamVjdE5hbWU7CisgICAgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQoY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCogc3JjKTsKKyAgICBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlOworICAgIHVpbnQ2NF90IG9iamVjdDsKKyAgICB1aW50NjRfdCB0YWdOYW1lOworICAgIHNpemVfdCB0YWdTaXplOworICAgIGNvbnN0IHZvaWQqIHBUYWc7CisgICAgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVChjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUKiBzcmMpOworICAgIFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgY29uc3QgY2hhciogcE1hcmtlck5hbWU7CisgICAgZmxvYXQgY29sb3JbNF07CisgICAgc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVChjb25zdCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCgpOworICAgIH5zYWZlX1ZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUKiBzcmMpOworICAgIFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgZGVkaWNhdGVkQWxsb2NhdGlvbjsKKyAgICBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WKGNvbnN0IFZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WKCk7CisgICAgfnNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYqIHNyYyk7CisgICAgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgZGVkaWNhdGVkQWxsb2NhdGlvbjsKKyAgICBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVihjb25zdCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVigpOworICAgIH5zYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WKiBzcmMpOworICAgIFZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgVmtCdWZmZXIgYnVmZmVyOworICAgIHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYoY29uc3QgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVihjb25zdCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYoKTsKKyAgICB+c2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViogc3JjKTsKKyAgICBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHRyYW5zZm9ybUZlZWRiYWNrOworICAgIFZrQm9vbDMyIGdlb21ldHJ5U3RyZWFtczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IG1heFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtczsKKyAgICB1aW50MzJfdCBtYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnM7CisgICAgVmtEZXZpY2VTaXplIG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbURhdGFTaXplOworICAgIHVpbnQzMl90IG1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyRGF0YVNpemU7CisgICAgdWludDMyX3QgbWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJEYXRhU3RyaWRlOworICAgIFZrQm9vbDMyIHRyYW5zZm9ybUZlZWRiYWNrUXVlcmllczsKKyAgICBWa0Jvb2wzMiB0cmFuc2Zvcm1GZWVkYmFja1N0cmVhbXNMaW5lc1RyaWFuZ2xlczsKKyAgICBWa0Jvb2wzMiB0cmFuc2Zvcm1GZWVkYmFja1Jhc3Rlcml6YXRpb25TdHJlYW1TZWxlY3Q7CisgICAgVmtCb29sMzIgdHJhbnNmb3JtRmVlZGJhY2tEcmF3OworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlRmxhZ3NFWFQgZmxhZ3M7CisgICAgdWludDMyX3QgcmFzdGVyaXphdGlvblN0cmVhbTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3OworICAgIFZrRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGU7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisgICAgc2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgoY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgmIHNyYyk7CisgICAgc2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgoKTsKKyAgICB+c2FmZV9Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCogc3JjKTsKKyAgICBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlggKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYICo+KHRoaXMpOyB9CisgICAgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHN1cHBvcnRzVGV4dHVyZUdhdGhlckxPREJpYXNBTUQ7CisgICAgc2FmZV9Wa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EKGNvbnN0IFZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EKGNvbnN0IHNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCYgc3JjKTsKKyAgICBzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQmIHNyYyk7CisgICAgc2FmZV9Wa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EKCk7CisgICAgfnNhZmVfVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQqIHNyYyk7CisgICAgVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EICo+KHRoaXMpOyB9CisgICAgVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorc3RydWN0IHNhZmVfVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlRmxhZ3NHR1AgZmxhZ3M7CisgICAgR2dwU3RyZWFtRGVzY3JpcHRvciBzdHJlYW1EZXNjcmlwdG9yOworICAgIHNhZmVfVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AoY29uc3QgVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUChjb25zdCBzYWZlX1ZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQJiBzcmMpOworICAgIHNhZmVfVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQJiBzcmMpOworICAgIHNhZmVfVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AoKTsKKyAgICB+c2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCogc3JjKTsKKyAgICBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCAqPih0aGlzKTsgfQorICAgIFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBjb3JuZXJTYW1wbGVkSW1hZ2U7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ3NOViBoYW5kbGVUeXBlczsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVihjb25zdCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVigpOworICAgIH5zYWZlX1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WKiBzcmMpOworICAgIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnc05WIGhhbmRsZVR5cGVzOworICAgIHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVihjb25zdCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVihjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OVigpOworICAgIH5zYWZlX1ZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WKiBzcmMpOworICAgIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdzTlYgaGFuZGxlVHlwZTsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVihjb25zdCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVihjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVigpOworICAgIH5zYWZlX1ZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKiBzcmMpOworICAgIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitzdHJ1Y3Qgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgY29uc3QgU0VDVVJJVFlfQVRUUklCVVRFUyogcEF0dHJpYnV0ZXM7CisgICAgRFdPUkQgZHdBY2Nlc3M7CisgICAgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKGNvbnN0IFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKGNvbnN0IHNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKCk7CisgICAgfnNhZmVfVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYqIHNyYyk7CisgICAgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WICo+KHRoaXMpOyB9CisgICAgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBhY3F1aXJlQ291bnQ7CisgICAgVmtEZXZpY2VNZW1vcnkqIHBBY3F1aXJlU3luY3M7CisgICAgY29uc3QgdWludDY0X3QqIHBBY3F1aXJlS2V5czsKKyAgICBjb25zdCB1aW50MzJfdCogcEFjcXVpcmVUaW1lb3V0TWlsbGlzZWNvbmRzOworICAgIHVpbnQzMl90IHJlbGVhc2VDb3VudDsKKyAgICBWa0RldmljZU1lbW9yeSogcFJlbGVhc2VTeW5jczsKKyAgICBjb25zdCB1aW50NjRfdCogcFJlbGVhc2VLZXlzOworICAgIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVihjb25zdCBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVihjb25zdCBzYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVigpOworICAgIH5zYWZlX1ZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WKiBzcmMpOworICAgIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK3N0cnVjdCBzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudDsKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25DaGVja0VYVCogcERpc2FibGVkVmFsaWRhdGlvbkNoZWNrczsKKyAgICBzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUKGNvbnN0IFZrVmFsaWRhdGlvbkZsYWdzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtWYWxpZGF0aW9uRmxhZ3NFWFQoY29uc3Qgc2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1ZhbGlkYXRpb25GbGFnc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrVmFsaWRhdGlvbkZsYWdzRVhUKCk7CisgICAgfnNhZmVfVmtWYWxpZGF0aW9uRmxhZ3NFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtWYWxpZGF0aW9uRmxhZ3NFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtWYWxpZGF0aW9uRmxhZ3NFWFQqIHNyYyk7CisgICAgVmtWYWxpZGF0aW9uRmxhZ3NFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtWYWxpZGF0aW9uRmxhZ3NFWFQgKj4odGhpcyk7IH0KKyAgICBWa1ZhbGlkYXRpb25GbGFnc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1ZhbGlkYXRpb25GbGFnc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9WSV9OTgorc3RydWN0IHNhZmVfVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4geworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1ZpU3VyZmFjZUNyZWF0ZUZsYWdzTk4gZmxhZ3M7CisgICAgdm9pZCogd2luZG93OworICAgIHNhZmVfVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4oY29uc3QgVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4qIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTihjb25zdCBzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OJiBzcmMpOworICAgIHNhZmVfVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4mIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OJiBzcmMpOworICAgIHNhZmVfVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4oKTsKKyAgICB+c2FmZV9Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiogc3JjKTsKKyAgICBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiAqPih0aGlzKTsgfQorICAgIFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgdGV4dHVyZUNvbXByZXNzaW9uQVNUQ19IRFI7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtGb3JtYXQgZGVjb2RlTW9kZTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQoY29uc3QgVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQoY29uc3Qgc2FmZV9Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQoKTsKKyAgICB+c2FmZV9Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVCogc3JjKTsKKyAgICBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgKj4odGhpcyk7IH0KKyAgICBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBkZWNvZGVNb2RlU2hhcmVkRXhwb25lbnQ7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCdWZmZXIgYnVmZmVyOworICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQ7CisgICAgVmtDb25kaXRpb25hbFJlbmRlcmluZ0ZsYWdzRVhUIGZsYWdzOworICAgIHNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVChjb25zdCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVChjb25zdCBzYWZlX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUKiBzcmMpOworICAgIFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBjb25kaXRpb25hbFJlbmRlcmluZzsKKyAgICBWa0Jvb2wzMiBpbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZzsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvbmRpdGlvbmFsUmVuZGVyaW5nRmVhdHVyZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBjb25kaXRpb25hbFJlbmRlcmluZ0VuYWJsZTsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQoY29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQqIHNyYyk7CisgICAgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQ7CisgICAgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgoY29uc3QgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKGNvbnN0IHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYJiBzcmMpOworICAgIHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgmIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgoKTsKKyAgICB+c2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCogc3JjKTsKKyAgICBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYICo+KHRoaXMpOyB9CisgICAgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IG1heEluZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbkNvdW50OworICAgIHVpbnQzMl90IG1heE9iamVjdEVudHJ5Q291bnRzOworICAgIHVpbnQzMl90IG1pblNlcXVlbmNlQ291bnRCdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgdWludDMyX3QgbWluU2VxdWVuY2VJbmRleEJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICB1aW50MzJfdCBtaW5Db21tYW5kc1Rva2VuQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWChjb25zdCBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWChjb25zdCBzYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgmIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYJiBzcmMpOworICAgIHNhZmVfVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCgpOworICAgIH5zYWZlX1ZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYKiBzcmMpOworICAgIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCAqPih0aGlzKTsgfQorICAgIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQ7CisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VXNhZ2VGbGFnc05WWCBmbGFnczsKKyAgICB1aW50MzJfdCB0b2tlbkNvdW50OworICAgIGNvbnN0IFZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYKiBwVG9rZW5zOworICAgIHNhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWChjb25zdCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWChjb25zdCBzYWZlX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgmIHNyYyk7CisgICAgc2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYJiBzcmMpOworICAgIHNhZmVfVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCgpOworICAgIH5zYWZlX1ZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYKiBzcmMpOworICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCAqPih0aGlzKTsgfQorICAgIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlggY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtPYmplY3RUYWJsZU5WWCBvYmplY3RUYWJsZTsKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaW5kaXJlY3RDb21tYW5kc0xheW91dDsKKyAgICB1aW50MzJfdCBpbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudDsKKyAgICBWa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWCogcEluZGlyZWN0Q29tbWFuZHNUb2tlbnM7CisgICAgdWludDMyX3QgbWF4U2VxdWVuY2VzQ291bnQ7CisgICAgVmtDb21tYW5kQnVmZmVyIHRhcmdldENvbW1hbmRCdWZmZXI7CisgICAgVmtCdWZmZXIgc2VxdWVuY2VzQ291bnRCdWZmZXI7CisgICAgVmtEZXZpY2VTaXplIHNlcXVlbmNlc0NvdW50T2Zmc2V0OworICAgIFZrQnVmZmVyIHNlcXVlbmNlc0luZGV4QnVmZmVyOworICAgIFZrRGV2aWNlU2l6ZSBzZXF1ZW5jZXNJbmRleE9mZnNldDsKKyAgICBzYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWChjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgoY29uc3Qgc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgmIHNyYyk7CisgICAgc2FmZV9Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCYgc3JjKTsKKyAgICBzYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCgpOworICAgIH5zYWZlX1ZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYKiBzcmMpOworICAgIFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggKj4odGhpcyk7IH0KKyAgICBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrT2JqZWN0VGFibGVOVlggb2JqZWN0VGFibGU7CisgICAgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQ7CisgICAgdWludDMyX3QgbWF4U2VxdWVuY2VzQ291bnQ7CisgICAgc2FmZV9Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWChjb25zdCBWa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKGNvbnN0IHNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgmIHNyYyk7CisgICAgc2FmZV9Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgmIHNyYyk7CisgICAgc2FmZV9Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWCgpOworICAgIH5zYWZlX1ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYKiBzcmMpOworICAgIFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYICo+KHRoaXMpOyB9CisgICAgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgb2JqZWN0Q291bnQ7CisgICAgY29uc3QgVmtPYmplY3RFbnRyeVR5cGVOVlgqIHBPYmplY3RFbnRyeVR5cGVzOworICAgIGNvbnN0IHVpbnQzMl90KiBwT2JqZWN0RW50cnlDb3VudHM7CisgICAgY29uc3QgVmtPYmplY3RFbnRyeVVzYWdlRmxhZ3NOVlgqIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3M7CisgICAgdWludDMyX3QgbWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yOworICAgIHVpbnQzMl90IG1heFN0b3JhZ2VCdWZmZXJzUGVyRGVzY3JpcHRvcjsKKyAgICB1aW50MzJfdCBtYXhTdG9yYWdlSW1hZ2VzUGVyRGVzY3JpcHRvcjsKKyAgICB1aW50MzJfdCBtYXhTYW1wbGVkSW1hZ2VzUGVyRGVzY3JpcHRvcjsKKyAgICB1aW50MzJfdCBtYXhQaXBlbGluZUxheW91dHM7CisgICAgc2FmZV9Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWChjb25zdCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKGNvbnN0IHNhZmVfVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgmIHNyYyk7CisgICAgc2FmZV9Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgmIHNyYyk7CisgICAgc2FmZV9Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCgpOworICAgIH5zYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYKiBzcmMpOworICAgIFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYICo+KHRoaXMpOyB9CisgICAgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlggY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiB2aWV3cG9ydFdTY2FsaW5nRW5hYmxlOworICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnQ7CisgICAgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYqIHBWaWV3cG9ydFdTY2FsaW5nczsKKyAgICBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYoY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYoKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViogc3JjKTsKKyAgICBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBtaW5JbWFnZUNvdW50OworICAgIHVpbnQzMl90IG1heEltYWdlQ291bnQ7CisgICAgVmtFeHRlbnQyRCBjdXJyZW50RXh0ZW50OworICAgIFZrRXh0ZW50MkQgbWluSW1hZ2VFeHRlbnQ7CisgICAgVmtFeHRlbnQyRCBtYXhJbWFnZUV4dGVudDsKKyAgICB1aW50MzJfdCBtYXhJbWFnZUFycmF5TGF5ZXJzOworICAgIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdzS0hSIHN1cHBvcnRlZFRyYW5zZm9ybXM7CisgICAgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgY3VycmVudFRyYW5zZm9ybTsKKyAgICBWa0NvbXBvc2l0ZUFscGhhRmxhZ3NLSFIgc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGE7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3Mgc3VwcG9ydGVkVXNhZ2VGbGFnczsKKyAgICBWa1N1cmZhY2VDb3VudGVyRmxhZ3NFWFQgc3VwcG9ydGVkU3VyZmFjZUNvdW50ZXJzOworICAgIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVChjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVChjb25zdCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUJiBzcmMpOworICAgIHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCgpOworICAgIH5zYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBzcmMpOworICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCAqPih0aGlzKTsgfQorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEaXNwbGF5UG93ZXJTdGF0ZUVYVCBwb3dlclN0YXRlOworICAgIHNhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUKGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVChjb25zdCBzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGlzcGxheVBvd2VySW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtEaXNwbGF5UG93ZXJJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGlzcGxheVBvd2VySW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlQb3dlckluZm9FWFQqIHNyYyk7CisgICAgVmtEaXNwbGF5UG93ZXJJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheVBvd2VySW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrRGlzcGxheVBvd2VySW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rpc3BsYXlQb3dlckluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VFdmVudFR5cGVFWFQgZGV2aWNlRXZlbnQ7CisgICAgc2FmZV9Wa0RldmljZUV2ZW50SW5mb0VYVChjb25zdCBWa0RldmljZUV2ZW50SW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZXZpY2VFdmVudEluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUV2ZW50SW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXZpY2VFdmVudEluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZUV2ZW50SW5mb0VYVCgpOworICAgIH5zYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGV2aWNlRXZlbnRJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlRXZlbnRJbmZvRVhUKiBzcmMpOworICAgIFZrRGV2aWNlRXZlbnRJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlRXZlbnRJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtEZXZpY2VFdmVudEluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2VFdmVudEluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGlzcGxheUV2ZW50VHlwZUVYVCBkaXNwbGF5RXZlbnQ7CisgICAgc2FmZV9Wa0Rpc3BsYXlFdmVudEluZm9FWFQoY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUKGNvbnN0IHNhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtEaXNwbGF5RXZlbnRJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rpc3BsYXlFdmVudEluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlFdmVudEluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa0Rpc3BsYXlFdmVudEluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEaXNwbGF5RXZlbnRJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGlzcGxheUV2ZW50SW5mb0VYVCogc3JjKTsKKyAgICBWa0Rpc3BsYXlFdmVudEluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5RXZlbnRJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtEaXNwbGF5RXZlbnRJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGlzcGxheUV2ZW50SW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrU3VyZmFjZUNvdW50ZXJGbGFnc0VYVCBzdXJmYWNlQ291bnRlcnM7CisgICAgc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKGNvbnN0IFZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBzd2FwY2hhaW5Db3VudDsKKyAgICBjb25zdCBWa1ByZXNlbnRUaW1lR09PR0xFKiBwVGltZXM7CisgICAgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUoY29uc3QgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFKGNvbnN0IHNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFJiBzcmMpOworICAgIHNhZmVfVmtQcmVzZW50VGltZXNJbmZvR09PR0xFJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUmIHNyYyk7CisgICAgc2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUoKTsKKyAgICB+c2FmZV9Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSogc3JjKTsKKyAgICBWa1ByZXNlbnRUaW1lc0luZm9HT09HTEUgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQcmVzZW50VGltZXNJbmZvR09PR0xFICo+KHRoaXMpOyB9CisgICAgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRSBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHBlclZpZXdQb3NpdGlvbkFsbENvbXBvbmVudHM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZU11bHRpdmlld1BlclZpZXdBdHRyaWJ1dGVzUHJvcGVydGllc05WWCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVGbGFnc05WIGZsYWdzOworICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnQ7CisgICAgY29uc3QgVmtWaWV3cG9ydFN3aXp6bGVOViogcFZpZXdwb3J0U3dpenpsZXM7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYoY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYoKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViogc3JjKTsKKyAgICBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgbWF4RGlzY2FyZFJlY3RhbmdsZXM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlRmxhZ3NFWFQgZmxhZ3M7CisgICAgVmtEaXNjYXJkUmVjdGFuZ2xlTW9kZUVYVCBkaXNjYXJkUmVjdGFuZ2xlTW9kZTsKKyAgICB1aW50MzJfdCBkaXNjYXJkUmVjdGFuZ2xlQ291bnQ7CisgICAgY29uc3QgVmtSZWN0MkQqIHBEaXNjYXJkUmVjdGFuZ2xlczsKKyAgICBzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgZmxvYXQgcHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplOworICAgIGZsb2F0IG1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplOworICAgIGZsb2F0IGV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplR3JhbnVsYXJpdHk7CisgICAgVmtCb29sMzIgcHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uOworICAgIFZrQm9vbDMyIGNvbnNlcnZhdGl2ZVBvaW50QW5kTGluZVJhc3Rlcml6YXRpb247CisgICAgVmtCb29sMzIgZGVnZW5lcmF0ZVRyaWFuZ2xlc1Jhc3Rlcml6ZWQ7CisgICAgVmtCb29sMzIgZGVnZW5lcmF0ZUxpbmVzUmFzdGVyaXplZDsKKyAgICBWa0Jvb2wzMiBmdWxseUNvdmVyZWRGcmFnbWVudFNoYWRlcklucHV0VmFyaWFibGU7CisgICAgVmtCb29sMzIgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUZsYWdzRVhUIGZsYWdzOworICAgIFZrQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGVFWFQgY29uc2VydmF0aXZlUmFzdGVyaXphdGlvbk1vZGU7CisgICAgZmxvYXQgZXh0cmFQcmltaXRpdmVPdmVyZXN0aW1hdGlvblNpemU7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUKiBzcmMpOworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIGRlcHRoQ2xpcEVuYWJsZTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVGbGFnc0VYVCBmbGFnczsKKyAgICBWa0Jvb2wzMiBkZXB0aENsaXBFbmFibGU7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUKiBzcmMpOworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrSGRyTWV0YWRhdGFFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1hZQ29sb3JFWFQgZGlzcGxheVByaW1hcnlSZWQ7CisgICAgVmtYWUNvbG9yRVhUIGRpc3BsYXlQcmltYXJ5R3JlZW47CisgICAgVmtYWUNvbG9yRVhUIGRpc3BsYXlQcmltYXJ5Qmx1ZTsKKyAgICBWa1hZQ29sb3JFWFQgd2hpdGVQb2ludDsKKyAgICBmbG9hdCBtYXhMdW1pbmFuY2U7CisgICAgZmxvYXQgbWluTHVtaW5hbmNlOworICAgIGZsb2F0IG1heENvbnRlbnRMaWdodExldmVsOworICAgIGZsb2F0IG1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWw7CisgICAgc2FmZV9Wa0hkck1ldGFkYXRhRVhUKGNvbnN0IFZrSGRyTWV0YWRhdGFFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0hkck1ldGFkYXRhRVhUKGNvbnN0IHNhZmVfVmtIZHJNZXRhZGF0YUVYVCYgc3JjKTsKKyAgICBzYWZlX1ZrSGRyTWV0YWRhdGFFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSGRyTWV0YWRhdGFFWFQmIHNyYyk7CisgICAgc2FmZV9Wa0hkck1ldGFkYXRhRVhUKCk7CisgICAgfnNhZmVfVmtIZHJNZXRhZGF0YUVYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0hkck1ldGFkYXRhRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSGRyTWV0YWRhdGFFWFQqIHNyYyk7CisgICAgVmtIZHJNZXRhZGF0YUVYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0hkck1ldGFkYXRhRVhUICo+KHRoaXMpOyB9CisgICAgVmtIZHJNZXRhZGF0YUVYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0hkck1ldGFkYXRhRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0lPU19NVksKK3N0cnVjdCBzYWZlX1ZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0lPU1N1cmZhY2VDcmVhdGVGbGFnc01WSyBmbGFnczsKKyAgICBjb25zdCB2b2lkKiBwVmlldzsKKyAgICBzYWZlX1ZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksoY29uc3QgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksoY29uc3Qgc2FmZV9Wa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLJiBzcmMpOworICAgIHNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyYgc3JjKTsKKyAgICBzYWZlX1ZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksoKTsKKyAgICB+c2FmZV9Wa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogc3JjKTsKKyAgICBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgKj4odGhpcyk7IH0KKyAgICBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKK3N0cnVjdCBzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrTWFjT1NTdXJmYWNlQ3JlYXRlRmxhZ3NNVksgZmxhZ3M7CisgICAgY29uc3Qgdm9pZCogcFZpZXc7CisgICAgc2FmZV9Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksoY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKGNvbnN0IHNhZmVfVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLJiBzcmMpOworICAgIHNhZmVfVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksmIHNyYyk7CisgICAgc2FmZV9Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksoKTsKKyAgICB+c2FmZV9Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyogc3JjKTsKKyAgICBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICo+KHRoaXMpOyB9CisgICAgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBjb25zdCAqPih0aGlzKTsgfQorfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKK3N0cnVjdCBzYWZlX1ZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtPYmplY3RUeXBlIG9iamVjdFR5cGU7CisgICAgdWludDY0X3Qgb2JqZWN0SGFuZGxlOworICAgIGNvbnN0IGNoYXIqIHBPYmplY3ROYW1lOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQoY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVChjb25zdCBzYWZlX1ZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogc3JjKTsKKyAgICBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtPYmplY3RUeXBlIG9iamVjdFR5cGU7CisgICAgdWludDY0X3Qgb2JqZWN0SGFuZGxlOworICAgIHVpbnQ2NF90IHRhZ05hbWU7CisgICAgc2l6ZV90IHRhZ1NpemU7CisgICAgY29uc3Qgdm9pZCogcFRhZzsKKyAgICBzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQoY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQoY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQoKTsKKyAgICB+c2FmZV9Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCogc3JjKTsKKyAgICBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgY29uc3QgY2hhciogcExhYmVsTmFtZTsKKyAgICBmbG9hdCBjb2xvcls0XTsKKyAgICBzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUKGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQoY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNMYWJlbEVYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVidWdVdGlsc0xhYmVsRVhUKCk7CisgICAgfnNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHNyYyk7CisgICAgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1V0aWxzTGFiZWxFWFQgKj4odGhpcyk7IH0KKyAgICBWa0RlYnVnVXRpbHNMYWJlbEVYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnVXRpbHNMYWJlbEVYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRmxhZ3NFWFQgZmxhZ3M7CisgICAgY29uc3QgY2hhciogcE1lc3NhZ2VJZE5hbWU7CisgICAgaW50MzJfdCBtZXNzYWdlSWROdW1iZXI7CisgICAgY29uc3QgY2hhciogcE1lc3NhZ2U7CisgICAgdWludDMyX3QgcXVldWVMYWJlbENvdW50OworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBRdWV1ZUxhYmVsczsKKyAgICB1aW50MzJfdCBjbWRCdWZMYWJlbENvdW50OworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBDbWRCdWZMYWJlbHM7CisgICAgdWludDMyX3Qgb2JqZWN0Q291bnQ7CisgICAgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCogcE9iamVjdHM7CisgICAgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQoY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKGNvbnN0IHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUJiBzcmMpOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQoKTsKKyAgICB+c2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCogc3JjKTsKKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICo+KHRoaXMpOyB9CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUZsYWdzRVhUIGZsYWdzOworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdzRVhUIG1lc3NhZ2VTZXZlcml0eTsKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIG1lc3NhZ2VUeXBlOworICAgIFBGTl92a0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0VYVCBwZm5Vc2VyQ2FsbGJhY2s7CisgICAgdm9pZCogcFVzZXJEYXRhOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVChjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUKiBzcmMpOworICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorc3RydWN0IHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICB1aW50NjRfdCBhbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZTsKKyAgICBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEKGNvbnN0IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQoY29uc3Qgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCYgc3JjKTsKKyAgICBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCYgc3JjKTsKKyAgICBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEKCk7CisgICAgfnNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQqIHNyYyk7CisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZUFORFJPSUQgKj4odGhpcyk7IH0KKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBjb25zdCAqPih0aGlzKTsgfQorfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorc3RydWN0IHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrRGV2aWNlU2l6ZSBhbGxvY2F0aW9uU2l6ZTsKKyAgICB1aW50MzJfdCBtZW1vcnlUeXBlQml0czsKKyAgICBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoY29uc3QgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoY29uc3Qgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEJiBzcmMpOworICAgIHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCYgc3JjKTsKKyAgICBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQoKTsKKyAgICB+c2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCogc3JjKTsKKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgKj4odGhpcyk7IH0KKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK3N0cnVjdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Zvcm1hdCBmb3JtYXQ7CisgICAgdWludDY0X3QgZXh0ZXJuYWxGb3JtYXQ7CisgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZm9ybWF0RmVhdHVyZXM7CisgICAgVmtDb21wb25lbnRNYXBwaW5nIHNhbXBsZXJZY2JjckNvbnZlcnNpb25Db21wb25lbnRzOworICAgIFZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIHN1Z2dlc3RlZFljYmNyTW9kZWw7CisgICAgVmtTYW1wbGVyWWNiY3JSYW5nZSBzdWdnZXN0ZWRZY2JjclJhbmdlOworICAgIFZrQ2hyb21hTG9jYXRpb24gc3VnZ2VzdGVkWENocm9tYU9mZnNldDsKKyAgICBWa0Nocm9tYUxvY2F0aW9uIHN1Z2dlc3RlZFlDaHJvbWFPZmZzZXQ7CisgICAgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEKGNvbnN0IFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEKGNvbnN0IHNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCYgc3JjKTsKKyAgICBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQmIHNyYyk7CisgICAgc2FmZV9Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEKCk7CisgICAgfnNhZmVfVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQqIHNyYyk7CisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEICo+KHRoaXMpOyB9CisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitzdHJ1Y3Qgc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgc3RydWN0IEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyOworICAgIHNhZmVfVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRChjb25zdCBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRChjb25zdCBzYWZlX1ZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQmIHNyYyk7CisgICAgc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEJiBzcmMpOworICAgIHNhZmVfVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCgpOworICAgIH5zYWZlX1ZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKiBzcmMpOworICAgIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCAqPih0aGlzKTsgfQorICAgIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBjb25zdCAqPih0aGlzKTsgfQorfTsKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorc3RydWN0IHNhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRGV2aWNlTWVtb3J5IG1lbW9yeTsKKyAgICBzYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoY29uc3QgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoY29uc3Qgc2FmZV9Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEJiBzcmMpOworICAgIHNhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCYgc3JjKTsKKyAgICBzYWZlX1ZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQoKTsKKyAgICB+c2FmZV9Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCogc3JjKTsKKyAgICBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgKj4odGhpcyk7IH0KKyAgICBWa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKK3N0cnVjdCBzYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDY0X3QgZXh0ZXJuYWxGb3JtYXQ7CisgICAgc2FmZV9Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRChjb25zdCBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEKGNvbnN0IHNhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQmIHNyYyk7CisgICAgc2FmZV9Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQmIHNyYyk7CisgICAgc2FmZV9Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRCgpOworICAgIH5zYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEKiBzcmMpOworICAgIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEICo+KHRoaXMpOyB9CisgICAgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK3N0cnVjdCBzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUVYVCByZWR1Y3Rpb25Nb2RlOworICAgIHNhZmVfVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQoY29uc3QgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCogc3JjKTsKKyAgICBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBmaWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzOworICAgIFZrQm9vbDMyIGZpbHRlck1pbm1heEltYWdlQ29tcG9uZW50TWFwcGluZzsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBpbmxpbmVVbmlmb3JtQmxvY2s7CisgICAgVmtCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQ7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBtYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplOworICAgIHVpbnQzMl90IG1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3M7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrczsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrczsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kSW5saW5lVW5pZm9ybUJsb2NrczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBkYXRhU2l6ZTsKKyAgICBjb25zdCB2b2lkKiBwRGF0YTsKKyAgICBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUKGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQoY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhUKCk7CisgICAgfnNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQqIHNyYyk7CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgKj4odGhpcyk7IH0KKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBtYXhJbmxpbmVVbmlmb3JtQmxvY2tCaW5kaW5nczsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKGNvbnN0IFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JQb29sSW5saW5lVW5pZm9ybUJsb2NrQ3JlYXRlSW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZUxvY2F0aW9uc1BlclBpeGVsOworICAgIFZrRXh0ZW50MkQgc2FtcGxlTG9jYXRpb25HcmlkU2l6ZTsKKyAgICB1aW50MzJfdCBzYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBjb25zdCBWa1NhbXBsZUxvY2F0aW9uRVhUKiBwU2FtcGxlTG9jYXRpb25zOworICAgIHNhZmVfVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVChjb25zdCBzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQqIHNyYyk7CisgICAgVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQ7CisgICAgY29uc3QgVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUKiBwQXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnM7CisgICAgdWludDMyX3QgcG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnNDb3VudDsKKyAgICBjb25zdCBWa1N1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQqIHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uczsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVChjb25zdCBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUKiBzcmMpOworICAgIFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgc2FtcGxlTG9jYXRpb25zRW5hYmxlOworICAgIHNhZmVfVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUIHNhbXBsZUxvY2F0aW9uc0luZm87CisgICAgc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrU2FtcGxlQ291bnRGbGFncyBzYW1wbGVMb2NhdGlvblNhbXBsZUNvdW50czsKKyAgICBWa0V4dGVudDJEIG1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemU7CisgICAgZmxvYXQgc2FtcGxlTG9jYXRpb25Db29yZGluYXRlUmFuZ2VbMl07CisgICAgdWludDMyX3Qgc2FtcGxlTG9jYXRpb25TdWJQaXhlbEJpdHM7CisgICAgVmtCb29sMzIgdmFyaWFibGVTYW1wbGVMb2NhdGlvbnM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlbnQyRCBtYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplOworICAgIHNhZmVfVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoY29uc3QgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQoKTsKKyAgICB+c2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCogc3JjKTsKKyAgICBWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa011bHRpc2FtcGxlUHJvcGVydGllc0VYVCAqPih0aGlzKTsgfQorICAgIFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgYWR2YW5jZWRCbGVuZENvaGVyZW50T3BlcmF0aW9uczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IGFkdmFuY2VkQmxlbmRNYXhDb2xvckF0dGFjaG1lbnRzOworICAgIFZrQm9vbDMyIGFkdmFuY2VkQmxlbmRJbmRlcGVuZGVudEJsZW5kOworICAgIFZrQm9vbDMyIGFkdmFuY2VkQmxlbmROb25QcmVtdWx0aXBsaWVkU3JjQ29sb3I7CisgICAgVmtCb29sMzIgYWR2YW5jZWRCbGVuZE5vblByZW11bHRpcGxpZWREc3RDb2xvcjsKKyAgICBWa0Jvb2wzMiBhZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXA7CisgICAgVmtCb29sMzIgYWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHNyY1ByZW11bHRpcGxpZWQ7CisgICAgVmtCb29sMzIgZHN0UHJlbXVsdGlwbGllZDsKKyAgICBWa0JsZW5kT3ZlcmxhcEVYVCBibGVuZE92ZXJsYXA7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVGbGFnc05WIGZsYWdzOworICAgIFZrQm9vbDMyIGNvdmVyYWdlVG9Db2xvckVuYWJsZTsKKyAgICB1aW50MzJfdCBjb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbjsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVigpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WKiBzcmMpOworICAgIFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVGbGFnc05WIGZsYWdzOworICAgIFZrQ292ZXJhZ2VNb2R1bGF0aW9uTW9kZU5WIGNvdmVyYWdlTW9kdWxhdGlvbk1vZGU7CisgICAgVmtCb29sMzIgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGU7CisgICAgdWludDMyX3QgY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudDsKKyAgICBjb25zdCBmbG9hdCogcENvdmVyYWdlTW9kdWxhdGlvblRhYmxlOworICAgIHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYqIHNyYyk7CisgICAgVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgc2hhZGVyU01Db3VudDsKKyAgICB1aW50MzJfdCBzaGFkZXJXYXJwc1BlclNNOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOViAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zUHJvcGVydGllc05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBzaGFkZXJTTUJ1aWx0aW5zOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IGRybUZvcm1hdE1vZGlmaWVyQ291bnQ7CisgICAgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqIHBEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXM7CisgICAgc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQoY29uc3QgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUKGNvbnN0IHNhZmVfVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUJiBzcmMpOworICAgIHNhZmVfVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQoKTsKKyAgICB+c2FmZV9Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCogc3JjKTsKKyAgICBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUICo+KHRoaXMpOyB9CisgICAgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDY0X3QgZHJtRm9ybWF0TW9kaWZpZXI7CisgICAgVmtTaGFyaW5nTW9kZSBzaGFyaW5nTW9kZTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4Q291bnQ7CisgICAgY29uc3QgdWludDMyX3QqIHBRdWV1ZUZhbWlseUluZGljZXM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBkcm1Gb3JtYXRNb2RpZmllckNvdW50OworICAgIGNvbnN0IHVpbnQ2NF90KiBwRHJtRm9ybWF0TW9kaWZpZXJzOworICAgIHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQoY29uc3QgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCogc3JjKTsKKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50NjRfdCBkcm1Gb3JtYXRNb2RpZmllcjsKKyAgICB1aW50MzJfdCBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQ7CisgICAgY29uc3QgVmtTdWJyZXNvdXJjZUxheW91dCogcFBsYW5lTGF5b3V0czsKKyAgICBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVChjb25zdCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUKiBzcmMpOworICAgIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDY0X3QgZHJtRm9ybWF0TW9kaWZpZXI7CisgICAgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKGNvbnN0IFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKCk7CisgICAgfnNhZmVfVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQqIHNyYyk7CisgICAgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUZsYWdzRVhUIGZsYWdzOworICAgIHNpemVfdCBpbml0aWFsRGF0YVNpemU7CisgICAgY29uc3Qgdm9pZCogcEluaXRpYWxEYXRhOworICAgIHNhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZTsKKyAgICBzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVChjb25zdCBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUKiBzcmMpOworICAgIFZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgYmluZGluZ0NvdW50OworICAgIGNvbnN0IFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCogcEJpbmRpbmdGbGFnczsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCogc3JjKTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nOworICAgIFZrQm9vbDMyIHNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nOworICAgIFZrQm9vbDMyIHNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nOworICAgIFZrQm9vbDMyIHNoYWRlclVuaWZvcm1CdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBWa0Jvb2wzMiBzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZzsKKyAgICBWa0Jvb2wzMiBzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVmtCb29sMzIgc2hhZGVyU3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVmtCb29sMzIgc2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVmtCb29sMzIgc2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVmtCb29sMzIgc2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmc7CisgICAgVmtCb29sMzIgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kOworICAgIFZrQm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kOworICAgIFZrQm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kOworICAgIFZrQm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBWa0Jvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBWa0Jvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZDsKKyAgICBWa0Jvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZzsKKyAgICBWa0Jvb2wzMiBkZXNjcmlwdG9yQmluZGluZ1BhcnRpYWxseUJvdW5kOworICAgIFZrQm9vbDMyIGRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQ7CisgICAgVmtCb29sMzIgcnVudGltZURlc2NyaXB0b3JBcnJheTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IG1heFVwZGF0ZUFmdGVyQmluZERlc2NyaXB0b3JzSW5BbGxQb29sczsKKyAgICBWa0Jvb2wzMiBzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgVmtCb29sMzIgc2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdOYXRpdmU7CisgICAgVmtCb29sMzIgc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIFZrQm9vbDMyIHNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIFZrQm9vbDMyIHNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nTmF0aXZlOworICAgIFZrQm9vbDMyIHJvYnVzdEJ1ZmZlckFjY2Vzc1VwZGF0ZUFmdGVyQmluZDsKKyAgICBWa0Jvb2wzMiBxdWFkRGl2ZXJnZW50SW1wbGljaXRMb2Q7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kU2FtcGxlZEltYWdlczsKKyAgICB1aW50MzJfdCBtYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzOworICAgIHVpbnQzMl90IG1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHM7CisgICAgdWludDMyX3QgbWF4UGVyU3RhZ2VVcGRhdGVBZnRlckJpbmRSZXNvdXJjZXM7CisgICAgdWludDMyX3QgbWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFNhbXBsZXJzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVyczsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnNEeW5hbWljOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVyczsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUJ1ZmZlcnNEeW5hbWljOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzOworICAgIHVpbnQzMl90IG1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRJbnB1dEF0dGFjaG1lbnRzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCogcERlc2NyaXB0b3JDb3VudHM7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVChjb25zdCBWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUKiBzcmMpOworICAgIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IG1heFZhcmlhYmxlRGVzY3JpcHRvckNvdW50OworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUKGNvbnN0IFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVChjb25zdCBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUJiBzcmMpOworICAgIHNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUKCk7CisgICAgfnNhZmVfVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQqIHNyYyk7CisgICAgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCAqPih0aGlzKTsgfQorICAgIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlYgeworICAgIHVpbnQzMl90IHNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQ7CisgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WKiBwU2hhZGluZ1JhdGVQYWxldHRlRW50cmllczsKKyAgICBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlYoY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlYoY29uc3Qgc2FmZV9Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WJiBzcmMpOworICAgIHNhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViYgc3JjKTsKKyAgICBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlYoKTsKKyAgICB+c2FmZV9Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViogc3JjKTsKKyAgICBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgKj4odGhpcyk7IH0KKyAgICBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHNoYWRpbmdSYXRlSW1hZ2VFbmFibGU7CisgICAgdWludDMyX3Qgdmlld3BvcnRDb3VudDsKKyAgICBzYWZlX1ZrU2hhZGluZ1JhdGVQYWxldHRlTlYqIHBTaGFkaW5nUmF0ZVBhbGV0dGVzOworICAgIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYqIHNyYyk7CisgICAgVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHNoYWRpbmdSYXRlSW1hZ2U7CisgICAgVmtCb29sMzIgc2hhZGluZ1JhdGVDb2Fyc2VTYW1wbGVPcmRlcjsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrRXh0ZW50MkQgc2hhZGluZ1JhdGVUZXhlbFNpemU7CisgICAgdWludDMyX3Qgc2hhZGluZ1JhdGVQYWxldHRlU2l6ZTsKKyAgICB1aW50MzJfdCBzaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViB7CisgICAgVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WIHNoYWRpbmdSYXRlOworICAgIHVpbnQzMl90IHNhbXBsZUNvdW50OworICAgIHVpbnQzMl90IHNhbXBsZUxvY2F0aW9uQ291bnQ7CisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WKiBwU2FtcGxlTG9jYXRpb25zOworICAgIHNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVihjb25zdCBzYWZlX1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViYgc3JjKTsKKyAgICBzYWZlX1ZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WJiBzcmMpOworICAgIHNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKCk7CisgICAgfnNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYqIHNyYyk7CisgICAgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViAqPih0aGlzKTsgfQorICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHNhbXBsZU9yZGVyVHlwZTsKKyAgICB1aW50MzJfdCBjdXN0b21TYW1wbGVPcmRlckNvdW50OworICAgIHNhZmVfVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKiBwQ3VzdG9tU2FtcGxlT3JkZXJzOworICAgIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVigpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WKiBzcmMpOworICAgIFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cFR5cGVOViB0eXBlOworICAgIHVpbnQzMl90IGdlbmVyYWxTaGFkZXI7CisgICAgdWludDMyX3QgY2xvc2VzdEhpdFNoYWRlcjsKKyAgICB1aW50MzJfdCBhbnlIaXRTaGFkZXI7CisgICAgdWludDMyX3QgaW50ZXJzZWN0aW9uU2hhZGVyOworICAgIHNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYoY29uc3QgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYoKTsKKyAgICB+c2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViogc3JjKTsKKyAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVDcmVhdGVGbGFncyBmbGFnczsKKyAgICB1aW50MzJfdCBzdGFnZUNvdW50OworICAgIHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogcFN0YWdlczsKKyAgICB1aW50MzJfdCBncm91cENvdW50OworICAgIHNhZmVfVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYqIHBHcm91cHM7CisgICAgdWludDMyX3QgbWF4UmVjdXJzaW9uRGVwdGg7CisgICAgVmtQaXBlbGluZUxheW91dCBsYXlvdXQ7CisgICAgVmtQaXBlbGluZSBiYXNlUGlwZWxpbmVIYW5kbGU7CisgICAgaW50MzJfdCBiYXNlUGlwZWxpbmVJbmRleDsKKyAgICBzYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKCk7CisgICAgfnNhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqIHNyYyk7CisgICAgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtCdWZmZXIgdmVydGV4RGF0YTsKKyAgICBWa0RldmljZVNpemUgdmVydGV4T2Zmc2V0OworICAgIHVpbnQzMl90IHZlcnRleENvdW50OworICAgIFZrRGV2aWNlU2l6ZSB2ZXJ0ZXhTdHJpZGU7CisgICAgVmtGb3JtYXQgdmVydGV4Rm9ybWF0OworICAgIFZrQnVmZmVyIGluZGV4RGF0YTsKKyAgICBWa0RldmljZVNpemUgaW5kZXhPZmZzZXQ7CisgICAgdWludDMyX3QgaW5kZXhDb3VudDsKKyAgICBWa0luZGV4VHlwZSBpbmRleFR5cGU7CisgICAgVmtCdWZmZXIgdHJhbnNmb3JtRGF0YTsKKyAgICBWa0RldmljZVNpemUgdHJhbnNmb3JtT2Zmc2V0OworICAgIHNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WKGNvbnN0IFZrR2VvbWV0cnlUcmlhbmdsZXNOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrR2VvbWV0cnlUcmlhbmdsZXNOVihjb25zdCBzYWZlX1ZrR2VvbWV0cnlUcmlhbmdsZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrR2VvbWV0cnlUcmlhbmdsZXNOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WJiBzcmMpOworICAgIHNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WKCk7CisgICAgfnNhZmVfVmtHZW9tZXRyeVRyaWFuZ2xlc05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrR2VvbWV0cnlUcmlhbmdsZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0dlb21ldHJ5VHJpYW5nbGVzTlYqIHNyYyk7CisgICAgVmtHZW9tZXRyeVRyaWFuZ2xlc05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrR2VvbWV0cnlUcmlhbmdsZXNOViAqPih0aGlzKTsgfQorICAgIFZrR2VvbWV0cnlUcmlhbmdsZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0dlb21ldHJ5VHJpYW5nbGVzTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrR2VvbWV0cnlBQUJCTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0J1ZmZlciBhYWJiRGF0YTsKKyAgICB1aW50MzJfdCBudW1BQUJCczsKKyAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgVmtEZXZpY2VTaXplIG9mZnNldDsKKyAgICBzYWZlX1ZrR2VvbWV0cnlBQUJCTlYoY29uc3QgVmtHZW9tZXRyeUFBQkJOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrR2VvbWV0cnlBQUJCTlYoY29uc3Qgc2FmZV9Wa0dlb21ldHJ5QUFCQk5WJiBzcmMpOworICAgIHNhZmVfVmtHZW9tZXRyeUFBQkJOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtHZW9tZXRyeUFBQkJOViYgc3JjKTsKKyAgICBzYWZlX1ZrR2VvbWV0cnlBQUJCTlYoKTsKKyAgICB+c2FmZV9Wa0dlb21ldHJ5QUFCQk5WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrR2VvbWV0cnlBQUJCTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtHZW9tZXRyeUFBQkJOViogc3JjKTsKKyAgICBWa0dlb21ldHJ5QUFCQk5WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrR2VvbWV0cnlBQUJCTlYgKj4odGhpcyk7IH0KKyAgICBWa0dlb21ldHJ5QUFCQk5WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrR2VvbWV0cnlBQUJCTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrR2VvbWV0cnlOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrR2VvbWV0cnlUeXBlTlYgZ2VvbWV0cnlUeXBlOworICAgIFZrR2VvbWV0cnlEYXRhTlYgZ2VvbWV0cnk7CisgICAgVmtHZW9tZXRyeUZsYWdzTlYgZmxhZ3M7CisgICAgc2FmZV9Wa0dlb21ldHJ5TlYoY29uc3QgVmtHZW9tZXRyeU5WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtHZW9tZXRyeU5WKGNvbnN0IHNhZmVfVmtHZW9tZXRyeU5WJiBzcmMpOworICAgIHNhZmVfVmtHZW9tZXRyeU5WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0dlb21ldHJ5TlYmIHNyYyk7CisgICAgc2FmZV9Wa0dlb21ldHJ5TlYoKTsKKyAgICB+c2FmZV9Wa0dlb21ldHJ5TlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtHZW9tZXRyeU5WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrR2VvbWV0cnlOViogc3JjKTsKKyAgICBWa0dlb21ldHJ5TlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtHZW9tZXRyeU5WICo+KHRoaXMpOyB9CisgICAgVmtHZW9tZXRyeU5WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrR2VvbWV0cnlOViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOViB0eXBlOworICAgIFZrQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnc05WIGZsYWdzOworICAgIHVpbnQzMl90IGluc3RhbmNlQ291bnQ7CisgICAgdWludDMyX3QgZ2VvbWV0cnlDb3VudDsKKyAgICBzYWZlX1ZrR2VvbWV0cnlOViogcEdlb21ldHJpZXM7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVihjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVigpOworICAgIH5zYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBzcmMpOworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICo+KHRoaXMpOyB9CisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VTaXplIGNvbXBhY3RlZFNpemU7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViBpbmZvOworICAgIHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYoY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVihjb25zdCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WJiBzcmMpOworICAgIHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYoKTsKKyAgICB+c2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViogc3JjKTsKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAqPih0aGlzKTsgfQorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZTsKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnk7CisgICAgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldDsKKyAgICB1aW50MzJfdCBkZXZpY2VJbmRleENvdW50OworICAgIGNvbnN0IHVpbnQzMl90KiBwRGV2aWNlSW5kaWNlczsKKyAgICBzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVihjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYoY29uc3Qgc2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVigpOworICAgIH5zYWZlX1ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBzcmMpOworICAgIFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQ7CisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViogcEFjY2VsZXJhdGlvblN0cnVjdHVyZXM7CisgICAgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGNvbnN0IHNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViYgc3JjKTsKKyAgICBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYmIHNyYyk7CisgICAgc2FmZV9Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk7CisgICAgfnNhZmVfVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHNyYyk7CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WICo+KHRoaXMpOyB9CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzVHlwZU5WIHR5cGU7CisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmU7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVihjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVigpOworICAgIH5zYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WKiBzcmMpOworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICo+KHRoaXMpOyB9CisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3Qgc2hhZGVyR3JvdXBIYW5kbGVTaXplOworICAgIHVpbnQzMl90IG1heFJlY3Vyc2lvbkRlcHRoOworICAgIHVpbnQzMl90IG1heFNoYWRlckdyb3VwU3RyaWRlOworICAgIHVpbnQzMl90IHNoYWRlckdyb3VwQmFzZUFsaWdubWVudDsKKyAgICB1aW50NjRfdCBtYXhHZW9tZXRyeUNvdW50OworICAgIHVpbnQ2NF90IG1heEluc3RhbmNlQ291bnQ7CisgICAgdWludDY0X3QgbWF4VHJpYW5nbGVDb3VudDsKKyAgICB1aW50MzJfdCBtYXhEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0OworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiByZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEVuYWJsZTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IFZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdFN0YXRlQ3JlYXRlSW5mb05WKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYqIHNyYyk7CisgICAgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrSW1hZ2VWaWV3VHlwZSBpbWFnZVZpZXdUeXBlOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIGZpbHRlckN1YmljOworICAgIFZrQm9vbDMyIGZpbHRlckN1YmljTWlubWF4IDsKKyAgICBzYWZlX1ZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQoY29uc3QgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQoKTsKKyAgICB+c2FmZV9Wa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCogc3JjKTsKKyAgICBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1F1ZXVlR2xvYmFsUHJpb3JpdHlFWFQgZ2xvYmFsUHJpb3JpdHk7CisgICAgc2FmZV9Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKGNvbnN0IFZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgaGFuZGxlVHlwZTsKKyAgICB2b2lkKiBwSG9zdFBvaW50ZXI7CisgICAgc2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVChjb25zdCBWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUKGNvbnN0IHNhZmVfVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVCgpOworICAgIH5zYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUKiBzcmMpOworICAgIFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHM7CisgICAgc2FmZV9Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVChjb25zdCBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCgpOworICAgIH5zYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUKiBzcmMpOworICAgIFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VTaXplIG1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQ7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbEZsYWdzQU1EIGNvbXBpbGVyQ29udHJvbEZsYWdzOworICAgIHNhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQoY29uc3QgVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRChjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQoKTsKKyAgICB+c2FmZV9Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCogc3JjKTsKKyAgICBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtUaW1lRG9tYWluRVhUIHRpbWVEb21haW47CisgICAgc2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKGNvbnN0IFZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKGNvbnN0IHNhZmVfVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQqIHNyYyk7CisgICAgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBzaGFkZXJFbmdpbmVDb3VudDsKKyAgICB1aW50MzJfdCBzaGFkZXJBcnJheXNQZXJFbmdpbmVDb3VudDsKKyAgICB1aW50MzJfdCBjb21wdXRlVW5pdHNQZXJTaGFkZXJBcnJheTsKKyAgICB1aW50MzJfdCBzaW1kUGVyQ29tcHV0ZVVuaXQ7CisgICAgdWludDMyX3Qgd2F2ZWZyb250c1BlclNpbWQ7CisgICAgdWludDMyX3Qgd2F2ZWZyb250U2l6ZTsKKyAgICB1aW50MzJfdCBzZ3Byc1BlclNpbWQ7CisgICAgdWludDMyX3QgbWluU2dwckFsbG9jYXRpb247CisgICAgdWludDMyX3QgbWF4U2dwckFsbG9jYXRpb247CisgICAgdWludDMyX3Qgc2dwckFsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgICB1aW50MzJfdCB2Z3Byc1BlclNpbWQ7CisgICAgdWludDMyX3QgbWluVmdwckFsbG9jYXRpb247CisgICAgdWludDMyX3QgbWF4VmdwckFsbG9jYXRpb247CisgICAgdWludDMyX3QgdmdwckFsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrTWVtb3J5T3ZlcmFsbG9jYXRpb25CZWhhdmlvckFNRCBvdmVyYWxsb2NhdGlvbkJlaGF2aW9yOworICAgIHNhZmVfVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQoY29uc3QgVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRChjb25zdCBzYWZlX1ZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EJiBzcmMpOworICAgIHNhZmVfVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EJiBzcmMpOworICAgIHNhZmVfVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQoKTsKKyAgICB+c2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCogc3JjKTsKKyAgICBWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCAqPih0aGlzKTsgfQorICAgIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBtYXhWZXJ0ZXhBdHRyaWJEaXZpc29yOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCB2ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50OworICAgIGNvbnN0IFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUKiBwVmVydGV4QmluZGluZ0Rpdmlzb3JzOworICAgIHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUKiBzcmMpOworICAgIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3I7CisgICAgVmtCb29sMzIgdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3I7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorc3RydWN0IHNhZmVfVmtQcmVzZW50RnJhbWVUb2tlbkdHUCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIEdncEZyYW1lVG9rZW4gZnJhbWVUb2tlbjsKKyAgICBzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1AoY29uc3QgVmtQcmVzZW50RnJhbWVUb2tlbkdHUCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1AoY29uc3Qgc2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQJiBzcmMpOworICAgIHNhZmVfVmtQcmVzZW50RnJhbWVUb2tlbkdHUCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQcmVzZW50RnJhbWVUb2tlbkdHUCYgc3JjKTsKKyAgICBzYWZlX1ZrUHJlc2VudEZyYW1lVG9rZW5HR1AoKTsKKyAgICB+c2FmZV9Wa1ByZXNlbnRGcmFtZVRva2VuR0dQKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUHJlc2VudEZyYW1lVG9rZW5HR1AqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQcmVzZW50RnJhbWVUb2tlbkdHUCogc3JjKTsKKyAgICBWa1ByZXNlbnRGcmFtZVRva2VuR0dQICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUHJlc2VudEZyYW1lVG9rZW5HR1AgKj4odGhpcyk7IH0KKyAgICBWa1ByZXNlbnRGcmFtZVRva2VuR0dQIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUHJlc2VudEZyYW1lVG9rZW5HR1AgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0dHUAorCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCogcFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjazsKKyAgICB1aW50MzJfdCBwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50OworICAgIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUKiBwUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzOworICAgIHNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKGNvbnN0IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzOworICAgIFZrQm9vbDMyIGNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXI7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHRhc2tTaGFkZXI7CisgICAgVmtCb29sMzIgbWVzaFNoYWRlcjsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IG1heERyYXdNZXNoVGFza3NDb3VudDsKKyAgICB1aW50MzJfdCBtYXhUYXNrV29ya0dyb3VwSW52b2NhdGlvbnM7CisgICAgdWludDMyX3QgbWF4VGFza1dvcmtHcm91cFNpemVbM107CisgICAgdWludDMyX3QgbWF4VGFza1RvdGFsTWVtb3J5U2l6ZTsKKyAgICB1aW50MzJfdCBtYXhUYXNrT3V0cHV0Q291bnQ7CisgICAgdWludDMyX3QgbWF4TWVzaFdvcmtHcm91cEludm9jYXRpb25zOworICAgIHVpbnQzMl90IG1heE1lc2hXb3JrR3JvdXBTaXplWzNdOworICAgIHVpbnQzMl90IG1heE1lc2hUb3RhbE1lbW9yeVNpemU7CisgICAgdWludDMyX3QgbWF4TWVzaE91dHB1dFZlcnRpY2VzOworICAgIHVpbnQzMl90IG1heE1lc2hPdXRwdXRQcmltaXRpdmVzOworICAgIHVpbnQzMl90IG1heE1lc2hNdWx0aXZpZXdWaWV3Q291bnQ7CisgICAgdWludDMyX3QgbWVzaE91dHB1dFBlclZlcnRleEdyYW51bGFyaXR5OworICAgIHVpbnQzMl90IG1lc2hPdXRwdXRQZXJQcmltaXRpdmVHcmFudWxhcml0eTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYzsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgaW1hZ2VGb290cHJpbnQ7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCBleGNsdXNpdmVTY2lzc29yQ291bnQ7CisgICAgY29uc3QgVmtSZWN0MkQqIHBFeGNsdXNpdmVTY2lzc29yczsKKyAgICBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVihjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVigpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WKiBzcmMpOworICAgIFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBleGNsdXNpdmVTY2lzc29yOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgY2hlY2twb2ludEV4ZWN1dGlvblN0YWdlTWFzazsKKyAgICBzYWZlX1ZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WKGNvbnN0IFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYoY29uc3Qgc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WKCk7CisgICAgfnNhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYqIHNyYyk7CisgICAgVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYgKj4odGhpcyk7IH0KKyAgICBWa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1F1ZXVlRmFtaWx5Q2hlY2twb2ludFByb3BlcnRpZXNOViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtDaGVja3BvaW50RGF0YU5WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgc3RhZ2U7CisgICAgdm9pZCogcENoZWNrcG9pbnRNYXJrZXI7CisgICAgc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYoY29uc3QgVmtDaGVja3BvaW50RGF0YU5WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtDaGVja3BvaW50RGF0YU5WKGNvbnN0IHNhZmVfVmtDaGVja3BvaW50RGF0YU5WJiBzcmMpOworICAgIHNhZmVfVmtDaGVja3BvaW50RGF0YU5WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYmIHNyYyk7CisgICAgc2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYoKTsKKyAgICB+c2FmZV9Wa0NoZWNrcG9pbnREYXRhTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtDaGVja3BvaW50RGF0YU5WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQ2hlY2twb2ludERhdGFOViogc3JjKTsKKyAgICBWa0NoZWNrcG9pbnREYXRhTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDaGVja3BvaW50RGF0YU5WICo+KHRoaXMpOyB9CisgICAgVmtDaGVja3BvaW50RGF0YU5WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrQ2hlY2twb2ludERhdGFOViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHNoYWRlckludGVnZXJGdW5jdGlvbnMyOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMIHsKKyAgICB1aW50MzJfdCB2YWx1ZTMyOworICAgIHVpbnQ2NF90IHZhbHVlNjQ7CisgICAgZmxvYXQgdmFsdWVGbG9hdDsKKyAgICBWa0Jvb2wzMiB2YWx1ZUJvb2w7CisgICAgY29uc3QgY2hhciogdmFsdWVTdHJpbmc7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwoY29uc3QgVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMJiBzcmMpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwoKTsKKyAgICB+c2FmZV9Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCogc3JjKTsKKyAgICBWa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMICo+KHRoaXMpOyB9CisgICAgVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VWYWx1ZURhdGFJTlRFTCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB2b2lkKiBwVXNlckRhdGE7CisgICAgc2FmZV9Wa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTChjb25zdCBWa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKGNvbnN0IHNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTCgpOworICAgIH5zYWZlX1ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMKiBzcmMpOworICAgIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMICo+KHRoaXMpOyB9CisgICAgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTCBwZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmc7CisgICAgc2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTChjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMKGNvbnN0IHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCgpOworICAgIH5zYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMKiBzcmMpOworICAgIFZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMICo+KHRoaXMpOyB9CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICB1aW50NjRfdCBtYXJrZXI7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKGNvbnN0IFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCYgc3JjKTsKKyAgICBzYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKCk7CisgICAgfnNhZmVfVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwqIHNyYyk7CisgICAgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMICo+KHRoaXMpOyB9CisgICAgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlTWFya2VySW5mb0lOVEVMIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgbWFya2VyOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTChjb25zdCBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTChjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMJiBzcmMpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCgpOworICAgIH5zYWZlX1ZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMKiBzcmMpOworICAgIFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCAqPih0aGlzKTsgfQorICAgIFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtQZXJmb3JtYW5jZU92ZXJyaWRlVHlwZUlOVEVMIHR5cGU7CisgICAgVmtCb29sMzIgZW5hYmxlOworICAgIHVpbnQ2NF90IHBhcmFtZXRlcjsKKyAgICBzYWZlX1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTChjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwmIHNyYyk7CisgICAgc2FmZV9Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCYgc3JjKTsKKyAgICBzYWZlX1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCgpOworICAgIH5zYWZlX1ZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMKiBzcmMpOworICAgIFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgKj4odGhpcyk7IH0KKyAgICBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvblR5cGVJTlRFTCB0eXBlOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKGNvbnN0IFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTChjb25zdCBzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCYgc3JjKTsKKyAgICBzYWZlX1ZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMJiBzcmMpOworICAgIHNhZmVfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKCk7CisgICAgfnNhZmVfVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwqIHNyYyk7CisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCAqPih0aGlzKTsgfQorICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IHBjaURvbWFpbjsKKyAgICB1aW50MzJfdCBwY2lCdXM7CisgICAgdWludDMyX3QgcGNpRGV2aWNlOworICAgIHVpbnQzMl90IHBjaUZ1bmN0aW9uOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBsb2NhbERpbW1pbmdTdXBwb3J0OworICAgIHNhZmVfVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRChjb25zdCBWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRChjb25zdCBzYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQmIHNyYyk7CisgICAgc2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EJiBzcmMpOworICAgIHNhZmVfVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCgpOworICAgIH5zYWZlX1ZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EKiBzcmMpOworICAgIFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCAqPih0aGlzKTsgfQorICAgIFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIGxvY2FsRGltbWluZ0VuYWJsZTsKKyAgICBzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQoY29uc3QgVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQoY29uc3Qgc2FmZV9Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EJiBzcmMpOworICAgIHNhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCYgc3JjKTsKKyAgICBzYWZlX1ZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQoKTsKKyAgICB+c2FmZV9Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCogc3JjKTsKKyAgICBWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgKj4odGhpcyk7IH0KKyAgICBWa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1EIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgY29uc3QgKj4odGhpcyk7IH0KK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorc3RydWN0IHNhZmVfVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVGbGFnc0ZVQ0hTSUEgZmxhZ3M7CisgICAgenhfaGFuZGxlX3QgaW1hZ2VQaXBlSGFuZGxlOworICAgIHNhZmVfVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEoY29uc3QgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQShjb25zdCBzYWZlX1ZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEoKTsKKyAgICB+c2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSogc3JjKTsKKyAgICBWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQSAqPih0aGlzKTsgfQorICAgIFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9GVUNIU0lBCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUCitzdHJ1Y3Qgc2FmZV9Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa01ldGFsU3VyZmFjZUNyZWF0ZUZsYWdzRVhUIGZsYWdzOworICAgIGNvbnN0IENBTWV0YWxMYXllciogcExheWVyOworICAgIHNhZmVfVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBmcmFnbWVudERlbnNpdHlNYXA7CisgICAgVmtCb29sMzIgZnJhZ21lbnREZW5zaXR5TWFwRHluYW1pYzsKKyAgICBWa0Jvb2wzMiBmcmFnbWVudERlbnNpdHlNYXBOb25TdWJzYW1wbGVkSW1hZ2VzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtFeHRlbnQyRCBtaW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemU7CisgICAgVmtFeHRlbnQyRCBtYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemU7CisgICAgVmtCb29sMzIgZnJhZ21lbnREZW5zaXR5SW52b2NhdGlvbnM7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwUHJvcGVydGllc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudDsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQoY29uc3QgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCogc3JjKTsKKyAgICBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgc2NhbGFyQmxvY2tMYXlvdXQ7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBzdWJncm91cFNpemVDb250cm9sOworICAgIFZrQm9vbDMyIGNvbXB1dGVGdWxsU3ViZ3JvdXBzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xGZWF0dXJlc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgbWluU3ViZ3JvdXBTaXplOworICAgIHVpbnQzMl90IG1heFN1Ymdyb3VwU2l6ZTsKKyAgICB1aW50MzJfdCBtYXhDb21wdXRlV29ya2dyb3VwU3ViZ3JvdXBzOworICAgIFZrU2hhZGVyU3RhZ2VGbGFncyByZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlczsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICB1aW50MzJfdCByZXF1aXJlZFN1Ymdyb3VwU2l6ZTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVChjb25zdCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUKiBzcmMpOworICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtTaGFkZXJDb3JlUHJvcGVydGllc0ZsYWdzQU1EIHNoYWRlckNvcmVGZWF0dXJlczsKKyAgICB1aW50MzJfdCBhY3RpdmVDb21wdXRlVW5pdENvdW50OworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBkZXZpY2VDb2hlcmVudE1lbW9yeTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0RldmljZVNpemUgaGVhcEJ1ZGdldFtWS19NQVhfTUVNT1JZX0hFQVBTXTsKKyAgICBWa0RldmljZVNpemUgaGVhcFVzYWdlW1ZLX01BWF9NRU1PUllfSEVBUFNdOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVtb3J5QnVkZ2V0UHJvcGVydGllc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIG1lbW9yeVByaW9yaXR5OworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgZmxvYXQgcHJpb3JpdHk7CisgICAgc2FmZV9Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUKGNvbnN0IFZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmc7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgYnVmZmVyRGV2aWNlQWRkcmVzczsKKyAgICBWa0Jvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheTsKKyAgICBWa0Jvb2wzMiBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2U7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VBZGRyZXNzIGRldmljZUFkZHJlc3M7CisgICAgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUKGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUKGNvbnN0IHNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBjaGFyIG5hbWVbVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkVdOworICAgIGNoYXIgdmVyc2lvbltWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRV07CisgICAgVmtUb29sUHVycG9zZUZsYWdzRVhUIHB1cnBvc2VzOworICAgIGNoYXIgZGVzY3JpcHRpb25bVktfTUFYX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIGNoYXIgbGF5ZXJbVktfTUFYX0VYVEVOU0lPTl9OQU1FX1NJWkVdOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogcE5leHQ7CisgICAgVmtJbWFnZVVzYWdlRmxhZ3Mgc3RlbmNpbFVzYWdlOworICAgIHNhZmVfVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQoY29uc3QgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCogc3JjKTsKKyAgICBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIHVpbnQzMl90IGVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50OworICAgIGNvbnN0IFZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQqIHBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzOworICAgIHVpbnQzMl90IGRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudDsKKyAgICBjb25zdCBWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVCogcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzOworICAgIHNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQoY29uc3QgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCogc3JjKTsKKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCAqPih0aGlzKTsgfQorICAgIFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgTVNpemU7CisgICAgdWludDMyX3QgTlNpemU7CisgICAgdWludDMyX3QgS1NpemU7CisgICAgVmtDb21wb25lbnRUeXBlTlYgQVR5cGU7CisgICAgVmtDb21wb25lbnRUeXBlTlYgQlR5cGU7CisgICAgVmtDb21wb25lbnRUeXBlTlYgQ1R5cGU7CisgICAgVmtDb21wb25lbnRUeXBlTlYgRFR5cGU7CisgICAgVmtTY29wZU5WIHNjb3BlOworICAgIHNhZmVfVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVihjb25zdCBWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVihjb25zdCBzYWZlX1ZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBzcmMpOworICAgIHNhZmVfVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVigpOworICAgIH5zYWZlX1ZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKiBzcmMpOworICAgIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViAqPih0aGlzKTsgfQorICAgIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIGNvb3BlcmF0aXZlTWF0cml4OworICAgIFZrQm9vbDMyIGNvb3BlcmF0aXZlTWF0cml4Um9idXN0QnVmZmVyQWNjZXNzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVihjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVigpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtTaGFkZXJTdGFnZUZsYWdzIGNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCk7CisgICAgfnNhZmVfVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYqIHNyYyk7CisgICAgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYoY29uc3QgVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVihjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVigpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOViAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlRmxhZ3NOViBmbGFnczsKKyAgICBWa0NvdmVyYWdlUmVkdWN0aW9uTW9kZU5WIGNvdmVyYWdlUmVkdWN0aW9uTW9kZTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKGNvbnN0IFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYqIHNyYyk7CisgICAgVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYgKj4odGhpcyk7IH0KKyAgICBWa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0NvdmVyYWdlUmVkdWN0aW9uTW9kZU5WIGNvdmVyYWdlUmVkdWN0aW9uTW9kZTsKKyAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgcmFzdGVyaXphdGlvblNhbXBsZXM7CisgICAgVmtTYW1wbGVDb3VudEZsYWdzIGRlcHRoU3RlbmNpbFNhbXBsZXM7CisgICAgVmtTYW1wbGVDb3VudEZsYWdzIGNvbG9yU2FtcGxlczsKKyAgICBzYWZlX1ZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKGNvbnN0IFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYoY29uc3Qgc2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViYgc3JjKTsKKyAgICBzYWZlX1ZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViYgc3JjKTsKKyAgICBzYWZlX1ZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WKCk7CisgICAgfnNhZmVfVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYqIHNyYyk7CisgICAgVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYgKj4odGhpcyk7IH0KKyAgICBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViBjb25zdCAqPih0aGlzKTsgfQorfTsKKworc3RydWN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiBmcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jazsKKyAgICBWa0Jvb2wzMiBmcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrOworICAgIFZrQm9vbDMyIGZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2s7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICB2b2lkKiBwTmV4dDsKKyAgICBWa0Jvb2wzMiB5Y2JjckltYWdlQXJyYXlzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUJiBvcGVyYXRvcj0oY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVCBjb25zdCAqPih0aGlzKTsgfQorfTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIGZ1bGxTY3JlZW5FeGNsdXNpdmU7CisgICAgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVChjb25zdCBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKGNvbnN0IHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQmIHNyYyk7CisgICAgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCgpOworICAgIH5zYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUKiBzcmMpOworICAgIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUICo+KHRoaXMpOyB9CisgICAgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorc3RydWN0IHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIGZ1bGxTY3JlZW5FeGNsdXNpdmVTdXBwb3J0ZWQ7CisgICAgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUKGNvbnN0IFZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUKGNvbnN0IHNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCYgc3JjKTsKKyAgICBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUKCk7CisgICAgfnNhZmVfVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQqIHNyYyk7CisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUICo+KHRoaXMpOyB9CisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKK3N0cnVjdCBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBITU9OSVRPUiBobW9uaXRvcjsKKyAgICBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQoY29uc3QgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQoY29uc3Qgc2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQoKTsKKyAgICB+c2FmZV9Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCogc3JjKTsKKyAgICBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgKj4odGhpcyk7IH0KKyAgICBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorCitzdHJ1Y3Qgc2FmZV9Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsKKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUZsYWdzRVhUIGZsYWdzOworICAgIHNhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgcmVjdGFuZ3VsYXJMaW5lczsKKyAgICBWa0Jvb2wzMiBicmVzZW5oYW1MaW5lczsKKyAgICBWa0Jvb2wzMiBzbW9vdGhMaW5lczsKKyAgICBWa0Jvb2wzMiBzdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXM7CisgICAgVmtCb29sMzIgc3RpcHBsZWRCcmVzZW5oYW1MaW5lczsKKyAgICBWa0Jvb2wzMiBzdGlwcGxlZFNtb290aExpbmVzOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgdWludDMyX3QgbGluZVN1YlBpeGVsUHJlY2lzaW9uQml0czsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIGxpbmVSYXN0ZXJpemF0aW9uTW9kZTsKKyAgICBWa0Jvb2wzMiBzdGlwcGxlZExpbmVFbmFibGU7CisgICAgdWludDMyX3QgbGluZVN0aXBwbGVGYWN0b3I7CisgICAgdWludDE2X3QgbGluZVN0aXBwbGVQYXR0ZXJuOworICAgIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVChjb25zdCBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUKCk7CisgICAgfnNhZmVfVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQqIHNyYyk7CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgaG9zdFF1ZXJ5UmVzZXQ7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtCb29sMzIgaW5kZXhUeXBlVWludDg7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKiBpbl9zdHJ1Y3QpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUICo+KHRoaXMpOyB9CisgICAgVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CisKK3N0cnVjdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbjsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVChjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQmIHNyYyk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCgpOworICAgIH5zYWZlX1ZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUKiBzcmMpOworICAgIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlOworICAgIHZvaWQqIHBOZXh0OworICAgIFZrQm9vbDMyIHRleGVsQnVmZmVyQWxpZ25tZW50OworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQqIGluX3N0cnVjdCk7CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVChjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQmIG9wZXJhdG9yPShjb25zdCBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCogaW5fc3RydWN0KTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCAqPih0aGlzKTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUIGNvbnN0ICo+KHRoaXMpOyB9Cit9OworCitzdHJ1Y3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGU7CisgICAgdm9pZCogcE5leHQ7CisgICAgVmtEZXZpY2VTaXplIHN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudEJ5dGVzOworICAgIFZrQm9vbDMyIHN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50OworICAgIFZrRGV2aWNlU2l6ZSB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlczsKKyAgICBWa0Jvb2wzMiB1bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudDsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQoY29uc3QgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCogaW5fc3RydWN0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQoY29uc3Qgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUJiBzcmMpOworICAgIHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCYgc3JjKTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQoKTsKKyAgICB+c2FmZV9Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUKCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQqIGluX3N0cnVjdCk7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNhZmVfVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVCogc3JjKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUICpwdHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgKj4odGhpcyk7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUIGNvbnN0ICpwdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgY29uc3QgKj4odGhpcyk7IH0KK307CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX3R5cGVtYXBfaGVscGVyLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX3R5cGVtYXBfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkNDc4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdmtfdHlwZW1hcF9oZWxwZXIuaApAQCAtMCwwICsxLDM2ODAgQEAKKy8vICoqKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKioqCisvLyBTZWUgaGVscGVyX2ZpbGVfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5Z29AZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZm9yYmVzQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IEpvaG4gWnVsYXVmPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCisvLyBUaGVzZSBlbXB0eSBnZW5lcmljIHRlbXBsYXRlcyBhcmUgc3BlY2lhbGl6ZWQgZm9yIGVhY2ggdHlwZSB3aXRoIHNUeXBlCisvLyBtZW1iZXJzIGFuZCBmb3IgZWFjaCBzVHlwZSAtLSBwcm92aWRpbmcgYSB0d28gd2F5IG1hcCBiZXR3ZWVuIHN0cnVjdHVyZQorLy8gdHlwZXMgYW5kIHNUeXBlcworCit0ZW1wbGF0ZSA8VmtTdHJ1Y3R1cmVUeXBlIGlkPiBzdHJ1Y3QgTHZsU1R5cGVNYXAge307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEx2bFR5cGVNYXAge307CisKKy8vIE1hcCB0eXBlIFZrQXBwbGljYXRpb25JbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQXBwbGljYXRpb25JbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQXBwbGljYXRpb25JbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0luc3RhbmNlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbnN0YW5jZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0luc3RhbmNlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtEZXZpY2VDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1Ym1pdEluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3VibWl0SW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrU3VibWl0SW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtNZW1vcnlBbGxvY2F0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5QWxsb2NhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtNZW1vcnlBbGxvY2F0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrTWFwcGVkTWVtb3J5UmFuZ2UgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTUFQUEVEX01FTU9SWV9SQU5HRQordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNYXBwZWRNZW1vcnlSYW5nZT4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUFQUEVEX01FTU9SWV9SQU5HRTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFPiB7CisgICAgdHlwZWRlZiBWa01hcHBlZE1lbW9yeVJhbmdlIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0JpbmRTcGFyc2VJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZFNwYXJzZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQklORF9TUEFSU0VfSU5GTz4geworICAgIHR5cGVkZWYgVmtCaW5kU3BhcnNlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtGZW5jZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRmVuY2VDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtGZW5jZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2VtYXBob3JlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0V2ZW50Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFdmVudENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0V2ZW50Q3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUXVlcnlQb29sQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQnVmZmVyQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQnVmZmVyQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtCdWZmZXJDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9WSUVXX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0J1ZmZlclZpZXdDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtJbWFnZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtJbWFnZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlVmlld0NyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ0FDSEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ0FDSEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX1NUQVRFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfREVQVEhfU1RFTkNJTF9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NUFVURV9QSVBFTElORV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT01QVVRFX1BJUEVMSU5FX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NhbXBsZXJDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2FtcGxlckNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtTYW1wbGVyQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtXcml0ZURlc2NyaXB0b3JTZXQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrV3JpdGVEZXNjcmlwdG9yU2V0PiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVD4geworICAgIHR5cGVkZWYgVmtXcml0ZURlc2NyaXB0b3JTZXQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQ29weURlc2NyaXB0b3JTZXQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQ09QWV9ERVNDUklQVE9SX1NFVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDb3B5RGVzY3JpcHRvclNldD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09QWV9ERVNDUklQVE9SX1NFVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT1BZX0RFU0NSSVBUT1JfU0VUPiB7CisgICAgdHlwZWRlZiBWa0NvcHlEZXNjcmlwdG9yU2V0IFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtSZW5kZXJQYXNzQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDb21tYW5kUG9vbENyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTz4geworICAgIHR5cGVkZWYgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeUJhcnJpZXIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5QmFycmllcj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVI+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5QmFycmllciBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtCdWZmZXJNZW1vcnlCYXJyaWVyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtCdWZmZXJNZW1vcnlCYXJyaWVyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX0JBUlJJRVI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9CQVJSSUVSPiB7CisgICAgdHlwZWRlZiBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlTWVtb3J5QmFycmllcj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1JlbmRlclBhc3NCZWdpbkluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtSZW5kZXJQYXNzQmVnaW5JbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfUFJPUEVSVElFUwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1BST1BFUlRJRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1BST1BFUlRJRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQmluZEJ1ZmZlck1lbW9yeUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZEJ1ZmZlck1lbW9yeUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0JpbmRJbWFnZU1lbW9yeUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtCaW5kSW1hZ2VNZW1vcnlJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQmluZEltYWdlTWVtb3J5SW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlMTZCaXRTdG9yYWdlRmVhdHVyZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfUkVRVUlSRU1FTlRTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50cz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFM+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX0FMTE9DQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX0FMTE9DQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfRkxBR1NfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9SRU5ERVJfUEFTU19CRUdJTl9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdyb3VwU3VibWl0SW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TVUJNSVRfSU5GTz4geworICAgIHR5cGVkZWYgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTz4geworICAgIHR5cGVkZWYgVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0RFVklDRV9HUk9VUF9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfREVWSUNFX0dST1VQX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfREVWSUNFX0dST1VQX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTz4geworICAgIHR5cGVkZWYgVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0dST1VQX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPPiB7CisgICAgdHlwZWRlZiBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzI+IHsKKyAgICB0eXBlZGVmIFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMj4geworICAgIHR5cGVkZWYgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1BBUlNFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TUEFSU0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzI+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtNZW1vcnlSZXF1aXJlbWVudHMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlSZXF1aXJlbWVudHMyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeVJlcXVpcmVtZW50czIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TUEFSU0VfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU18yOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzI+IHsKKyAgICB0eXBlZGVmIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRm9ybWF0UHJvcGVydGllczIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtGb3JtYXRQcm9wZXJ0aWVzMj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRk9STUFUX1BST1BFUlRJRVNfMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yPiB7CisgICAgdHlwZWRlZiBWa0Zvcm1hdFByb3BlcnRpZXMyIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTXzI+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0ZPUk1BVF9JTkZPXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1F1ZXVlRmFtaWx5UHJvcGVydGllczI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9QUk9QRVJUSUVTXzI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUVVFVUVfRkFNSUxZX1BST1BFUlRJRVNfMj4geworICAgIHR5cGVkZWYgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yPiB7CisgICAgdHlwZWRlZiBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1BBUlNFX0lNQUdFX0ZPUk1BVF9JTkZPXzI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19JTlBVVF9BVFRBQ0hNRU5UX0FTUEVDVF9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfVVNBR0VfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfVVNBR0VfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9TVEFURV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9TVEFURV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX0ZFQVRVUkVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19GRUFUVVJFUz4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BST1BFUlRJRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllcyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkFSSUFCTEVfUE9JTlRFUlNfRkVBVFVSRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUz4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9QUk9QRVJUSUVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfUFJPUEVSVElFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VRdWV1ZUluZm8yIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9JTkZPXzIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlUXVldWVJbmZvMj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0lORk9fMjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfSU5GT18yPiB7CisgICAgdHlwZWRlZiBWa0RldmljZVF1ZXVlSW5mbzIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUHJvdGVjdGVkU3VibWl0SW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QUk9URUNURURfU1VCTUlUX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUHJvdGVjdGVkU3VibWl0SW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJPVEVDVEVEX1NVQk1JVF9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTz4geworICAgIHR5cGVkZWYgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfUExBTkVfTUVNT1JZX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX1BMQU5FX01FTU9SWV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfUExBTkVfTUVNT1JZX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfUExBTkVfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GTz4geworICAgIHR5cGVkZWYgVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRkVBVFVSRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU1BR0VfRk9STUFUX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTUFHRV9GT1JNQVRfUFJPUEVSVElFUz4geworICAgIHR5cGVkZWYgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfSU1BR0VfRk9STUFUX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9JTkZPPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfSU1BR0VfRk9STUFUX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0JVRkZFUl9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9CVUZGRVJfSU5GTz4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfQlVGRkVSX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9CVUZGRVJfUFJPUEVSVElFUz4geworICAgIHR5cGVkZWYgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVMKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXM+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JRF9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JRF9QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0JVRkZFUl9DUkVBVEVfSU5GTz4geworICAgIHR5cGVkZWYgVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk87Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZFTkNFX1BST1BFUlRJRVM+IHsKKyAgICB0eXBlZGVmIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8gdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9DUkVBVEVfSU5GTwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mbyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk8KK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9TRU1BUEhPUkVfSU5GTzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk8+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8gVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX1NFTUFQSE9SRV9QUk9QRVJUSUVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVM+IHsKKyAgICB0eXBlZGVmIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcyBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfU1VQUE9SVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlQ+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRFJBV19QQVJBTUVURVJTX0ZFQVRVUkVTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRHJhd1BhcmFtZXRlcnNGZWF0dXJlcz4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVM+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQcmVzZW50SW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1ByZXNlbnRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUHJlc2VudEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfU1dBUENIQUlOX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX1NXQVBDSEFJTl9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9TV0FQQ0hBSU5fSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX05FWFRfSU1BR0VfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfTkVYVF9JTUFHRV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX05FWFRfSU1BR0VfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0NBUEFCSUxJVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUFJFU0VOVF9DQVBBQklMSVRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0NBUEFCSUxJVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUkVTRU5UX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0Rpc3BsYXlQcmVzZW50SW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUkVTRU5UX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUFJFU0VOVF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5UHJlc2VudEluZm9LSFIgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKy8vIE1hcCB0eXBlIFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9YTElCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKy8vIE1hcCB0eXBlIFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9YQ0JfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKy8vIE1hcCB0eXBlIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1dBWUxBTkRfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XQVlMQU5EX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1dBWUxBTkRfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBNYXAgdHlwZSBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9XSU4zMl9IQU5ETEVfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfV0lOMzJfSEFORExFX1BST1BFUlRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9XSU4zMl9IQU5ETEVfUFJPUEVSVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9GRF9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbXBvcnRNZW1vcnlGZEluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9GRF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9GRF9QUk9QRVJUSUVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlGZFByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9GRF9QUk9QRVJUSUVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfRkRfUFJPUEVSVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeUdldEZkSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0ZEX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa01lbW9yeUdldEZkSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9GRF9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0ZEX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeUdldEZkSW5mb0tIUiBUeXBlOworfTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9TRU1BUEhPUkVfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRDNEMTJfRkVOQ0VfU1VCTUlUX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9EM0QxMl9GRU5DRV9TVUJNSVRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRDNEMTJfRkVOQ0VfU1VCTUlUX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9TRU1BUEhPUkVfRkRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfRkRfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfR0VUX0ZEX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfRkRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QVVNIX0RFU0NSSVBUT1JfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QVVNIX0RFU0NSSVBUT1JfUFJPUEVSVElFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BVU0hfREVTQ1JJUFRPUl9QUk9QRVJUSUVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRmxvYXQxNkludDhGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfRkxPQVQxNl9JTlQ4X0ZFQVRVUkVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVNoYWRlckZsb2F0MTZJbnQ4RmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUHJlc2VudFJlZ2lvbnNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9SRUdJT05TX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQcmVzZW50UmVnaW9uc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9SRUdJT05TX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1JFR0lPTlNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1ByZXNlbnRSZWdpb25zS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfSU1BR0VfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVFNfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVFNfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0FUVEFDSE1FTlRfQkVHSU5fSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0FUVEFDSE1FTlRfQkVHSU5fSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQVRUQUNITUVOVF9CRUdJTl9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl8yX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl8yX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fMl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVBFTkRFTkNZXzJfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1N1YnBhc3NEZXBlbmRlbmN5MktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVBFTkRFTkNZXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUj4geworICAgIHR5cGVkZWYgVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPXzJfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk9fMl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk9fMl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1YnBhc3NCZWdpbkluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19CRUdJTl9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdWJwYXNzQmVnaW5JbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0JFR0lOX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VicGFzc0JlZ2luSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTdWJwYXNzRW5kSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0VORF9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdWJwYXNzRW5kSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VicGFzc0VuZEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFSRURfUFJFU0VOVF9TVVJGQUNFX0NBUEFCSUxJVElFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU0hBUkVEX1BSRVNFTlRfU1VSRkFDRV9DQVBBQklMSVRJRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFIgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9GRF9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbXBvcnRGZW5jZUZkSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9GRU5DRV9GRF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtGZW5jZUdldEZkSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRmVuY2VHZXRGZEluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0dFVF9GRF9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrRmVuY2VHZXRGZEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX0ZFQVRVUkVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX1BST1BFUlRJRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeVByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9QUk9QRVJUSUVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUEVSRk9STUFOQ0VfUVVFUllfUFJPUEVSVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUj4geworICAgIHR5cGVkZWYgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfQ09VTlRFUl9ERVNDUklQVElPTl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSPiB7CisgICAgdHlwZWRlZiBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfUFJPRklMSU5HX0xPQ0tfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9QUk9GSUxJTkdfTE9DS19JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9TVUJNSVRfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVUkZBQ0VfSU5GT18yX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU3VyZmFjZUZvcm1hdDJLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GT1JNQVRfMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3VyZmFjZUZvcm1hdDJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRk9STUFUXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRk9STUFUXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa1N1cmZhY2VGb3JtYXQyS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BST1BFUlRJRVNfMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGlzcGxheVByb3BlcnRpZXMyS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BST1BFUlRJRVNfMl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUk9QRVJUSUVTXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfUFJPUEVSVElFU18yX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX01PREVfUFJPUEVSVElFU18yX0tIUj4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlQbGFuZUluZm8yS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfSU5GT18yX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEaXNwbGF5UGxhbmVJbmZvMktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9JTkZPXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfSU5GT18yX0tIUj4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5UGxhbmVJbmZvMktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSPiB7CisgICAgdHlwZWRlZiBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfTElTVF9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX0xJU1RfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFXzhCSVRfU1RPUkFHRV9GRUFUVVJFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQVRPTUlDX0lOVDY0X0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNoYWRlckF0b21pY0ludDY0RmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQVRPTUlDX0lOVDY0X0ZFQVRVUkVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0FUT01JQ19JTlQ2NF9GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJBdG9taWNJbnQ2NEZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NMT0NLX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ0xPQ0tfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9EUklWRVJfUFJPUEVSVElFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RSSVZFUl9QUk9QRVJUSUVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkxPQVRfQ09OVFJPTFNfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZMT0FUX0NPTlRST0xTX1BST1BFUlRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GTE9BVF9DT05UUk9MU19QUk9QRVJUSUVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fREVQVEhfU1RFTkNJTF9SRVNPTFZFX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9QUk9QRVJUSUVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfU1RFTkNJTF9SRVNPTFZFX1BST1BFUlRJRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfRkVBVFVSRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9GRUFUVVJFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9USU1FTElORV9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9QUk9QRVJUSUVTX0tIUj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfVFlQRV9DUkVBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfVFlQRV9DUkVBVEVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9USU1FTElORV9TRU1BUEhPUkVfU1VCTUlUX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NlbWFwaG9yZVdhaXRJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9XQUlUX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1NlbWFwaG9yZVdhaXRJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfV0FJVF9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfV0FJVF9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9TSUdOQUxfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1NJR05BTF9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfU0lHTkFMX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVZ1bGthbk1lbW9yeU1vZGVsRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVlVMS0FOX01FTU9SWV9NT0RFTF9GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfU1RFTkNJTF9MQVlPVVRfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV9TVEVOQ0lMX0xBWU9VVF9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfU1RFTkNJTF9MQVlPVVRfS0hSPiB7CisgICAgdHlwZWRlZiBWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFI+IHsKKyAgICB0eXBlZGVmIFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dEZlYXR1cmVzS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfS0hSPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQ1JFQVRFX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQ1JFQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0NSRUFURV9JTkZPX0tIUj4geworICAgIHR5cGVkZWYgVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfQUxMT0NBVEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0FMTE9DQVRFX0lORk9fS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0FMTE9DQVRFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0ZFQVRVUkVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19GRUFUVVJFU19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19GRUFUVVJFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lORk9fS0hSCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVJbmZvS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfS0hSOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfUFJPUEVSVElFU19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfSU5GT19LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTkZPX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX0lORk9fS0hSPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFI+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfU1RBVElTVElDX0tIUjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFIgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFIKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFI7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFI+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DQUxMQkFDS19DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9SQVNURVJJWkFUSU9OX09SREVSX0FNRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9SQVNURVJJWkFUSU9OX09SREVSX0FNRDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1JBU1RFUklaQVRJT05fT1JERVJfQU1EPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlUmFzdGVyaXphdGlvbk9yZGVyQU1EIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9OQU1FX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfTkFNRV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX05BTUVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9UQUdfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX1RBR19JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfT0JKRUNUX1RBR19JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9NQVJLRVJfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfTUFSS0VSX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9NQVJLRVJfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0NSRUFURV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0lNQUdFX0NSRUFURV9JTkZPX05WPiB7CisgICAgdHlwZWRlZiBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JVRkZFUl9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9CVUZGRVJfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fQlVGRkVSX0NSRUFURV9JTkZPX05WPiB7CisgICAgdHlwZWRlZiBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX01FTU9SWV9BTExPQ0FURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX0ZFQVRVUkVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UUkFOU0ZPUk1fRkVFREJBQ0tfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfU1RSRUFNX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfU1RSRUFNX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX1NUUkVBTV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlVmlld0hhbmRsZUluZm9OVlggdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19IQU5ETEVfSU5GT19OVlgKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19IQU5ETEVfSU5GT19OVlg7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19IQU5ETEVfSU5GT19OVlg+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9URVhUVVJFX0xPRF9HQVRIRVJfRk9STUFUX1BST1BFUlRJRVNfQU1ECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9URVhUVVJFX0xPRF9HQVRIRVJfRk9STUFUX1BST1BFUlRJRVNfQU1EOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1RFWFRVUkVfTE9EX0dBVEhFUl9GT1JNQVRfUFJPUEVSVElFU19BTUQ+IHsKKyAgICB0eXBlZGVmIFZrVGV4dHVyZUxPREdhdGhlckZvcm1hdFByb3BlcnRpZXNBTUQgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fR0dQCisvLyBNYXAgdHlwZSBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVFJFQU1fREVTQ1JJUFRPUl9TVVJGQUNFX0NSRUFURV9JTkZPX0dHUAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1A+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfQ1JFQVRFX0lORk9fR0dQOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NUUkVBTV9ERVNDUklQVE9SX1NVUkZBQ0VfQ1JFQVRFX0lORk9fR0dQPiB7CisgICAgdHlwZWRlZiBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9HR1AKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1JORVJfU0FNUExFRF9JTUFHRV9GRUFUVVJFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1JORVJfU0FNUExFRF9JTUFHRV9GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09STkVSX1NBTVBMRURfSU1BR0VfRkVBVFVSRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9JTUFHRV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OViBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKy8vIE1hcCB0eXBlIFZrVmFsaWRhdGlvbkZsYWdzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkxBR1NfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1ZhbGlkYXRpb25GbGFnc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GTEFHU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GTEFHU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrVmFsaWRhdGlvbkZsYWdzRVhUIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1ZJX05OCisvLyBNYXAgdHlwZSBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9WSV9TVVJGQUNFX0NSRUFURV9JTkZPX05OCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfVklfU1VSRkFDRV9DUkVBVEVfSU5GT19OTjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9WSV9TVVJGQUNFX0NSRUFURV9JTkZPX05OPiB7CisgICAgdHlwZWRlZiBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9WSV9OTgorLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfSERSX0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0hEUl9GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19BU1RDX0RFQ09ERV9NT0RFX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19BU1RDX0RFQ09ERV9NT0RFX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0FTVENfREVDT0RFX01PREVfRVhUPiB7CisgICAgdHlwZWRlZiBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQVNUQ0RlY29kZUZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VBU1RDRGVjb2RlRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0FTVENfREVDT0RFX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CRUdJTl9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRkVBVFVSRVNfTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRkVBVFVSRVNfTlZYOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HRU5FUkFURURfQ09NTUFORFNfRkVBVFVSRVNfTlZYPiB7CisgICAgdHlwZWRlZiBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlggVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0xJTUlUU19OVlg7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dFTkVSQVRFRF9DT01NQU5EU19MSU1JVFNfTlZYPiB7CisgICAgdHlwZWRlZiBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlgKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlg+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lORElSRUNUX0NPTU1BTkRTX0xBWU9VVF9DUkVBVEVfSU5GT19OVlg7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX0NSRUFURV9JTkZPX05WWD4geworICAgIHR5cGVkZWYgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlg+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYPiB7CisgICAgdHlwZWRlZiBWa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlggVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlg+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9SRVNFUlZFX1NQQUNFX0ZPUl9DT01NQU5EU19JTkZPX05WWDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DTURfUkVTRVJWRV9TUEFDRV9GT1JfQ09NTUFORFNfSU5GT19OVlg+IHsKKyAgICB0eXBlZGVmIFZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9PQkpFQ1RfVEFCTEVfQ1JFQVRFX0lORk9fTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfT0JKRUNUX1RBQkxFX0NSRUFURV9JTkZPX05WWDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9PQkpFQ1RfVEFCTEVfQ1JFQVRFX0lORk9fTlZYPiB7CisgICAgdHlwZWRlZiBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1dfU0NBTElOR19TVEFURV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9DQVBBQklMSVRJRVNfMl9FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfRVhUPiB7CisgICAgdHlwZWRlZiBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlQb3dlckluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QT1dFUl9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEaXNwbGF5UG93ZXJJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BPV0VSX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUE9XRVJfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGlzcGxheVBvd2VySW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VFdmVudEluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZUV2ZW50SW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0VWRU5UX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9FVkVOVF9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEZXZpY2VFdmVudEluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGlzcGxheUV2ZW50SW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX0VWRU5UX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0Rpc3BsYXlFdmVudEluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfRVZFTlRfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9FVkVOVF9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5RXZlbnRJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DT1VOVEVSX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NPVU5URVJfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DT1VOVEVSX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BSRVNFTlRfVElNRVNfSU5GT19HT09HTEUKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRT4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9USU1FU19JTkZPX0dPT0dMRTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1RJTUVTX0lORk9fR09PR0xFPiB7CisgICAgdHlwZWRlZiBWa1ByZXNlbnRUaW1lc0luZm9HT09HTEUgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlggdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTVVMVElWSUVXX1BFUl9WSUVXX0FUVFJJQlVURVNfUFJPUEVSVElFU19OVlg7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1dJWlpMRV9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TV0laWkxFX1NUQVRFX0NSRUFURV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NXSVpaTEVfU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ESVNDQVJEX1JFQ1RBTkdMRV9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRElTQ0FSRF9SRUNUQU5HTEVfUFJPUEVSVElFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RJU0NBUkRfUkVDVEFOR0xFX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RJU0NBUkRfUkVDVEFOR0xFX1NUQVRFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RJU0NBUkRfUkVDVEFOR0xFX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9ESVNDQVJEX1JFQ1RBTkdMRV9TVEFURV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTlNFUlZBVElWRV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05TRVJWQVRJVkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9DT05TRVJWQVRJVkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fQ09OU0VSVkFUSVZFX1NUQVRFX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VEZXB0aENsaXBFbmFibGVGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVQVEhfQ0xJUF9FTkFCTEVfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9DTElQX0VOQUJMRV9GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX0NMSVBfRU5BQkxFX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0RFUFRIX0NMSVBfU1RBVEVfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9ERVBUSF9DTElQX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0RFUFRIX0NMSVBfU1RBVEVfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtIZHJNZXRhZGF0YUVYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9IRFJfTUVUQURBVEFfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0hkck1ldGFkYXRhRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9IRFJfTUVUQURBVEFfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0hEUl9NRVRBREFUQV9FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSGRyTWV0YWRhdGFFWFQgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworLy8gTWFwIHR5cGUgVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVksKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVks+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9JT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVks+IHsKKyAgICB0eXBlZGVmIFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NQUNPU19NVksKKy8vIE1hcCB0eXBlIFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NQUNPU19TVVJGQUNFX0NSRUFURV9JTkZPX01WSz4geworICAgIHR5cGVkZWYgVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSworLy8gTWFwIHR5cGUgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX05BTUVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX1RBR19JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfVEFHX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RlYnVnVXRpbHNMYWJlbEVYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVidWdVdGlsc0xhYmVsRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTEFCRUxfRVhUPiB7CisgICAgdHlwZWRlZiBWa0RlYnVnVXRpbHNMYWJlbEVYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX01FU1NFTkdFUl9DQUxMQkFDS19EQVRBX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NBTExCQUNLX0RBVEFfRVhUPiB7CisgICAgdHlwZWRlZiBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBNYXAgdHlwZSBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9VU0FHRV9BTkRST0lECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfVVNBR0VfQU5EUk9JRDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9VU0FHRV9BTkRST0lEPiB7CisgICAgdHlwZWRlZiBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorLy8gTWFwIHR5cGUgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1BST1BFUlRJRVNfQU5EUk9JRDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQ+IHsKKyAgICB0eXBlZGVmIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKy8vIE1hcCB0eXBlIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRk9STUFUX1BST1BFUlRJRVNfQU5EUk9JRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRk9STUFUX1BST1BFUlRJRVNfQU5EUk9JRDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9GT1JNQVRfUFJPUEVSVElFU19BTkRST0lEPiB7CisgICAgdHlwZWRlZiBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBNYXAgdHlwZSBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRD4geworICAgIHR5cGVkZWYgVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBUeXBlOworfTsKKworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorLy8gTWFwIHR5cGUgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQ+IHsKKyAgICB0eXBlZGVmIFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKy8vIE1hcCB0eXBlIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZPUk1BVF9BTkRST0lECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0V4dGVybmFsRm9ybWF0QU5EUk9JRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQ+IHsKKyAgICB0eXBlZGVmIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBNYXAgdHlwZSBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1JFRFVDVElPTl9NT0RFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX0ZJTFRFUl9NSU5NQVhfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfRklMVEVSX01JTk1BWF9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFUl9GSUxURVJfTUlOTUFYX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkxJTkVfVU5JRk9STV9CTE9DS19GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfUFJPUEVSVElFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVD4geworICAgIHR5cGVkZWYgVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9JTkxJTkVfVU5JRk9STV9CTE9DS19DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9JTkxJTkVfVU5JRk9STV9CTE9DS19DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFX0xPQ0FUSU9OU19JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX1NBTVBMRV9MT0NBVElPTlNfQkVHSU5fSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfU0FNUExFX0xPQ0FUSU9OU19CRUdJTl9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19TQU1QTEVfTE9DQVRJT05TX0JFR0lOX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0FNUExFX0xPQ0FUSU9OU19TVEFURV9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NBTVBMRV9MT0NBVElPTlNfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NBTVBMRV9MT0NBVElPTlNfU1RBVEVfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0FNUExFX0xPQ0FUSU9OU19QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVfTE9DQVRJT05TX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVfTE9DQVRJT05TX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlTG9jYXRpb25zUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfTVVMVElTQU1QTEVfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZEZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JMRU5EX09QRVJBVElPTl9BRFZBTkNFRF9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQkxFTkRfT1BFUkFUSU9OX0FEVkFOQ0VEX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX0FEVkFOQ0VEX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9BRFZBTkNFRF9TVEFURV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09WRVJBR0VfTU9EVUxBVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9NT0RVTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX01PRFVMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19QUk9QRVJUSUVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc1Byb3BlcnRpZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19QUk9QRVJUSUVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU01fQlVJTFRJTlNfUFJPUEVSVElFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU01fQlVJTFRJTlNfRkVBVFVSRVNfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9TTV9CVUlMVElOU19GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0xJU1RfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19MSVNUX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfTElTVF9FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzTGlzdEVYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0xJU1RfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfTElTVF9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFBMSUNJVF9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX1ZBTElEQVRJT05fQ0FDSEVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfVkFMSURBVElPTl9DQUNIRV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9CSU5ESU5HX0ZMQUdTX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFU0NSSVBUT1JfSU5ERVhJTkdfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9BTExPQ0FURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQUxMT0NBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9BTExPQ0FURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVD4geworICAgIHR5cGVkZWYgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRMYXlvdXRTdXBwb3J0RVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU0hBRElOR19SQVRFX0lNQUdFX1NUQVRFX0NSRUFURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9JTUFHRV9TVEFURV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfSU1BR0VfU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfUFJPUEVSVElFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFESU5HX1JBVEVfSU1BR0VfUFJPUEVSVElFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBRElOR19SQVRFX0lNQUdFX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfQ09BUlNFX1NBTVBMRV9PUkRFUl9TVEFURV9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0dlb21ldHJ5VHJpYW5nbGVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX1RSSUFOR0xFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9UUklBTkdMRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrR2VvbWV0cnlUcmlhbmdsZXNOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtHZW9tZXRyeUFBQkJOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0dlb21ldHJ5QUFCQk5WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX0FBQkJfTlY+IHsKKyAgICB0eXBlZGVmIFZrR2VvbWV0cnlBQUJCTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrR2VvbWV0cnlOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtHZW9tZXRyeU5WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9OVj4geworICAgIHR5cGVkZWYgVmtHZW9tZXRyeU5WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9JTkZPX05WPiB7CisgICAgdHlwZWRlZiBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9JTkZPX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVj4geworICAgIHR5cGVkZWYgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SQVlfVFJBQ0lOR19QUk9QRVJUSUVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JBWV9UUkFDSU5HX1BST1BFUlRJRVNfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1JBWV9UUkFDSU5HX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX0ZFQVRVUkVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfU1RBVEVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkVQUkVTRU5UQVRJVkVfRlJBR01FTlRfVEVTVF9TVEFURV9DUkVBVEVfSU5GT19OVj4geworICAgIHR5cGVkZWYgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfVklFV19JTUFHRV9GT1JNQVRfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0ZJTFRFUl9DVUJJQ19JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRklMVEVSX0NVQklDX0lNQUdFX1ZJRVdfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0ZJTFRFUl9DVUJJQ19JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfR0xPQkFMX1BSSU9SSVRZX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0dMT0JBTF9QUklPUklUWV9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0dMT0JBTF9QUklPUklUWV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfSE9TVF9QT0lOVEVSX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9IT1NUX1BPSU5URVJfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9IT1NUX1BPSU5URVJfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfSE9TVF9QT0lOVEVSX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0hPU1RfUE9JTlRFUl9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfSE9TVF9QT0lOVEVSX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX01FTU9SWV9IT1NUX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX01FTU9SWV9IT1NUX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9NRU1PUllfSE9TVF9QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTVBJTEVSX0NPTlRST0xfQ1JFQVRFX0lORk9fQU1ECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09NUElMRVJfQ09OVFJPTF9DUkVBVEVfSU5GT19BTUQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0NBTElCUkFURURfVElNRVNUQU1QX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DQUxJQlJBVEVEX1RJTUVTVEFNUF9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DQUxJQlJBVEVEX1RJTUVTVEFNUF9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0FNRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzQU1EPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NPUkVfUFJPUEVSVElFU19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfQU1EPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQ1JFQVRFX0lORk9fQU1ECit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX01FTU9SWV9PVkVSQUxMT0NBVElPTl9DUkVBVEVfSU5GT19BTUQ+IHsKKyAgICB0eXBlZGVmIFZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1EIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfRElWSVNPUl9TVEFURV9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9ESVZJU09SX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfRElWSVNPUl9TVEFURV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0dHUAorLy8gTWFwIHR5cGUgVmtQcmVzZW50RnJhbWVUb2tlbkdHUCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0ZSQU1FX1RPS0VOX0dHUAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQcmVzZW50RnJhbWVUb2tlbkdHUD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9GUkFNRV9UT0tFTl9HR1A7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9GUkFNRV9UT0tFTl9HR1A+IHsKKyAgICB0eXBlZGVmIFZrUHJlc2VudEZyYW1lVG9rZW5HR1AgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fR0dQCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT01QVVRFX1NIQURFUl9ERVJJVkFUSVZFU19GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX0ZFQVRVUkVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVTSF9TSEFERVJfUFJPUEVSVElFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9QUk9QRVJUSUVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9QUk9QRVJUSUVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9CQVJZQ0VOVFJJQ19GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfU0hBREVSX0JBUllDRU5UUklDX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0ZFQVRVUkVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWENMVVNJVkVfU0NJU1NPUl9GRUFUVVJFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhDTFVTSVZFX1NDSVNTT1JfRkVBVFVSRVNfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYQ0xVU0lWRV9TQ0lTU09SX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9DSEVDS1BPSU5UX1BST1BFUlRJRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfQ0hFQ0tQT0lOVF9QUk9QRVJUSUVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1FVRVVFX0ZBTUlMWV9DSEVDS1BPSU5UX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0NoZWNrcG9pbnREYXRhTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfQ0hFQ0tQT0lOVF9EQVRBX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0NoZWNrcG9pbnREYXRhTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NIRUNLUE9JTlRfREFUQV9OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9DSEVDS1BPSU5UX0RBVEFfTlY+IHsKKyAgICB0eXBlZGVmIFZrQ2hlY2twb2ludERhdGFOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRkVBVFVSRVNfSU5URUwKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUw+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU5URUdFUl9GVU5DVElPTlNfMl9GRUFUVVJFU19JTlRFTDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0lOVEVHRVJfRlVOQ1RJT05TXzJfRkVBVFVSRVNfSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbnRlZ2VyRnVuY3Rpb25zMkZlYXR1cmVzSU5URUwgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUwKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTklUSUFMSVpFX1BFUkZPUk1BTkNFX0FQSV9JTkZPX0lOVEVMOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GT19JTlRFTDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPX0lOVEVMPiB7CisgICAgdHlwZWRlZiBWa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9NQVJLRVJfSU5GT19JTlRFTAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfTUFSS0VSX0lORk9fSU5URUw7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfTUFSS0VSX0lORk9fSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfU1RSRUFNX01BUktFUl9JTkZPX0lOVEVMCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9TVFJFQU1fTUFSS0VSX0lORk9fSU5URUw7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfU1RSRUFNX01BUktFUl9JTkZPX0lOVEVMPiB7CisgICAgdHlwZWRlZiBWa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfT1ZFUlJJREVfSU5GT19JTlRFTAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9PVkVSUklERV9JTkZPX0lOVEVMOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX09WRVJSSURFX0lORk9fSU5URUw+IHsKKyAgICB0eXBlZGVmIFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUw+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMPiB7CisgICAgdHlwZWRlZiBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUENJX0JVU19JTkZPX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QQ0lfQlVTX0lORk9fUFJPUEVSVElFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BDSV9CVVNfSU5GT19QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVBDSUJ1c0luZm9Qcm9wZXJ0aWVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1EIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTkFUSVZFX0hEUl9TVVJGQUNFX0NBUEFCSUxJVElFU19BTUQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrRGlzcGxheU5hdGl2ZUhkclN1cmZhY2VDYXBhYmlsaXRpZXNBTUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTkFUSVZFX0hEUl9TVVJGQUNFX0NBUEFCSUxJVElFU19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9OQVRJVkVfSERSX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0FNRD4geworICAgIHR5cGVkZWYgVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fRElTUExBWV9OQVRJVkVfSERSX0NSRUFURV9JTkZPX0FNRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQ+IHsKKyAgICB0eXBlZGVmIFZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQgVHlwZTsKK307CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorLy8gTWFwIHR5cGUgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQQordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUE+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFUElQRV9TVVJGQUNFX0NSRUFURV9JTkZPX0ZVQ0hTSUE7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VQSVBFX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRlVDSFNJQT4geworICAgIHR5cGVkZWYgVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fRlVDSFNJQQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NRVRBTF9FWFQKKy8vIE1hcCB0eXBlIFZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX01FVEFMX0VYVAorLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcEZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBQcm9wZXJ0aWVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NDQUxBUl9CTE9DS19MQVlPVVRfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVNjYWxhckJsb2NrTGF5b3V0RmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVQkdST1VQX1NJWkVfQ09OVFJPTF9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwU2l6ZUNvbnRyb2xQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9TSVpFX0NPTlRST0xfUFJPUEVSVElFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9SRVFVSVJFRF9TVUJHUk9VUF9TSVpFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfUkVRVUlSRURfU1VCR1JPVVBfU0laRV9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX1JFUVVJUkVEX1NVQkdST1VQX1NJWkVfQ1JFQVRFX0lORk9fRVhUPiB7CisgICAgdHlwZWRlZiBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9DT1JFX1BST1BFUlRJRVNfMl9BTUQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXMyQU1EIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0ZFQVRVUkVTX0FNRAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1EOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT0hFUkVOVF9NRU1PUllfRkVBVFVSRVNfQU1EPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQ29oZXJlbnRNZW1vcnlGZWF0dXJlc0FNRCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9CVURHRVRfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX0JVREdFVF9QUk9QRVJUSUVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRU1PUllfUFJJT1JJVFlfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJpb3JpdHlGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9QUklPUklUWV9BTExPQ0FURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1BSSU9SSVRZX0FMTE9DQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9QUklPUklUWV9BTExPQ0FURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlYKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0NSRUFURV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UT09MX1BST1BFUlRJRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UT09MX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9UT09MX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NURU5DSUxfVVNBR0VfQ1JFQVRFX0lORk9fRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlY7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9GRUFUVVJFU19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9GRUFUVVJFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX0ZFQVRVUkVTX05WPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9QUk9QRVJUSUVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT09QRVJBVElWRV9NQVRSSVhfUFJPUEVSVElFU19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlY+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0ZFQVRVUkVTX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlRmVhdHVyZXNOVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPVkVSQUdFX1JFRFVDVElPTl9NT0RFX0ZFQVRVUkVTX05WOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1ZFUkFHRV9SRURVQ1RJT05fTU9ERV9GRUFUVVJFU19OVj4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1JFRFVDVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVgordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlY+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1JFRFVDVElPTl9TVEFURV9DUkVBVEVfSU5GT19OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9SRURVQ1RJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlY+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVj4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfTUlYRURfU0FNUExFU19DT01CSU5BVElPTl9OVjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0NPTUJJTkFUSU9OX05WPiB7CisgICAgdHlwZWRlZiBWa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OViBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfSU5URVJMT0NLX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1lDQkNSX0lNQUdFX0FSUkFZU19GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVD4geworICAgIHR5cGVkZWYgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU19GVUxMX1NDUkVFTl9FWENMVVNJVkVfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9FWFQ+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZUNhcGFiaWxpdGllc0Z1bGxTY3JlZW5FeGNsdXNpdmVFWFQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorLy8gTWFwIHR5cGUgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCB0byBpZCBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9XSU4zMl9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfV0lOMzJfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgVHlwZTsKK307CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisvLyBNYXAgdHlwZSBWa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfSEVBRExFU1NfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSEVBRExFU1NfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsU1R5cGVNYXA8VktfU1RSVUNUVVJFX1RZUEVfSEVBRExFU1NfU1VSRkFDRV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9GRUFUVVJFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uUHJvcGVydGllc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTElORV9SQVNURVJJWkFUSU9OX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9MSU5FX1NUQVRFX0NSRUFURV9JTkZPX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUPiB7CisgICAgc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBrU1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0xJTkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fTElORV9TVEFURV9DUkVBVEVfSU5GT19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9IT1NUX1FVRVJZX1JFU0VUX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIHRvIGlkIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkRFWF9UWVBFX1VJTlQ4X0ZFQVRVUkVTX0VYVAordGVtcGxhdGUgPD4gc3RydWN0IEx2bFR5cGVNYXA8VmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkRFWF9UWVBFX1VJTlQ4X0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU5ERVhfVFlQRV9VSU5UOF9GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUIFR5cGU7Cit9OworCisvLyBNYXAgdHlwZSBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9ERU1PVEVfVE9fSEVMUEVSX0lOVk9DQVRJT05fRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0ZFQVRVUkVTX0VYVDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxTVHlwZU1hcDxWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0RFTU9URV9UT19IRUxQRVJfSU5WT0NBVElPTl9GRUFUVVJFU19FWFQ+IHsKKyAgICB0eXBlZGVmIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCBUeXBlOworfTsKKworLy8gTWFwIHR5cGUgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhUCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTHZsVHlwZU1hcDxWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVD4geworICAgIHN0YXRpYyBjb25zdCBWa1N0cnVjdHVyZVR5cGUga1NUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfRkVBVFVSRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0ZFQVRVUkVTX0VYVD4geworICAgIHR5cGVkZWYgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQgVHlwZTsKK307CisKKy8vIE1hcCB0eXBlIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgdG8gaWQgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWEVMX0JVRkZFUl9BTElHTk1FTlRfUFJPUEVSVElFU19FWFQKK3RlbXBsYXRlIDw+IHN0cnVjdCBMdmxUeXBlTWFwPFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ+IHsKKyAgICBzdGF0aWMgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGtTVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX1BST1BFUlRJRVNfRVhUOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEx2bFNUeXBlTWFwPFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX1BST1BFUlRJRVNfRVhUPiB7CisgICAgdHlwZWRlZiBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhUIFR5cGU7Cit9OworCisvLyBGaW5kIGFuIGVudHJ5IG9mIHRoZSBnaXZlbiB0eXBlIGluIHRoZSBwTmV4dCBjaGFpbgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQgKmx2bF9maW5kX2luX2NoYWluKGNvbnN0IHZvaWQgKm5leHQpIHsKKyAgICBjb25zdCBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKmN1cnJlbnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQmFzZU91dFN0cnVjdHVyZSAqPihuZXh0KTsKKyAgICBjb25zdCBUICpmb3VuZCA9IG51bGxwdHI7CisgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAgICAgaWYgKEx2bFR5cGVNYXA8VD46OmtTVHlwZSA9PSBjdXJyZW50LT5zVHlwZSkgeworICAgICAgICAgICAgZm91bmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihjdXJyZW50KTsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBOZXh0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmb3VuZDsKK30KKworLy8gSW5pdCB0aGUgaGVhZGVyIG9mIGFuIHNUeXBlIHN0cnVjdCB3aXRoIHBOZXh0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBsdmxfaW5pdF9zdHJ1Y3Qodm9pZCAqcF9uZXh0KSB7CisgICAgVCBvdXQgPSB7fTsKKyAgICBvdXQuc1R5cGUgPSBMdmxUeXBlTWFwPFQ+OjprU1R5cGU7CisgICAgb3V0LnBOZXh0ID0gcF9uZXh0OworICAgIHJldHVybiBvdXQ7Cit9CisKKy8vIEluaXQgdGhlIGhlYWRlciBvZiBhbiBzVHlwZSBzdHJ1Y3QKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGx2bF9pbml0X3N0cnVjdCgpIHsKKyAgICBUIG91dCA9IHt9OworICAgIG91dC5zVHlwZSA9IEx2bFR5cGVNYXA8VD46OmtTVHlwZTsKKyAgICByZXR1cm4gb3V0OworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZXMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9nZW5lcmF0ZWQvdmtfdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDM1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ2VuZXJhdGVkL3ZrX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZXMuaApAQCAtMCwwICsxLDU4NTQgQEAKKy8qIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAoc2NyaXB0cy92a192YWxpZGF0aW9uX3N0YXRzLnB5KSAqLworLyogVnVsa2FuIHNwZWNpZmljYXRpb24gdmVyc2lvbjogMS4xLjEzMCAqLworLyoKKyAqIFZ1bGthbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE5IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCisvLyBEaXNhYmxlIGF1dG8tZm9ybWF0dGluZyBmb3IgZ2VuZXJhdGVkIGZpbGUKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gTWFwcGluZyBmcm9tIFZVSUQgc3RyaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNwZWMgdGV4dAordHlwZWRlZiBzdHJ1Y3QgX3Z1aWRfc3BlY190ZXh0X3BhaXIgeworICAgIGNvbnN0IGNoYXIgKiB2dWlkOworICAgIGNvbnN0IGNoYXIgKiBzcGVjX3RleHQ7Cit9IHZ1aWRfc3BlY190ZXh0X3BhaXI7CisKK3N0YXRpYyBjb25zdCB2dWlkX3NwZWNfdGV4dF9wYWlyIHZ1aWRfc3BlY190ZXh0W10gPSB7CisgICAgeyJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WLWNvbXBhY3RlZFNpemUtMDI0MjEiLCAiSWYgY29tcGFjdGVkU2l6ZSBpcyBub3QgMCB0aGVuIGJvdGggaW5mby5nZW9tZXRyeUNvdW50IGFuZCBpbmZvLmluc3RhbmNlQ291bnQgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WLWNvbXBhY3RlZFNpemUtMDI0MjEpIn0sCisgICAgeyJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WLWluZm8tcGFyYW1ldGVyIiwgImluZm8gbXVzdCBiZSBhIHZhbGlkIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVi1pbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLWZsYWdzLTAyNTkyIiwgIklmIGZsYWdzIGhhcyB0aGUgVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9UUkFDRV9CSVRfTlYgYml0IHNldCwgdGhlbiBpdCBtdXN0IG5vdCBoYXZlIHRoZSBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1BSRUZFUl9GQVNUX0JVSUxEX0JJVF9OViBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLWZsYWdzLTAyNTkyKSJ9LAorICAgIHsiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVGbGFnQml0c05WIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLWdlb21ldHJ5Q291bnQtMDI0MjIiLCAiZ2VvbWV0cnlDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6bWF4R2VvbWV0cnlDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1nZW9tZXRyeUNvdW50LTAyNDIyKSJ9LAorICAgIHsiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1pbnN0YW5jZUNvdW50LTAyNDIzIiwgImluc3RhbmNlQ291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY6Om1heEluc3RhbmNlQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtaW5zdGFuY2VDb3VudC0wMjQyMykifSwKKyAgICB7IlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtaW5zdGFuY2VEYXRhLTAyNzgyIiwgIklmIGluc3RhbmNlRGF0YSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGluc3RhbmNlRGF0YSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OViB1c2FnZSBmbGFnIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLWluc3RhbmNlRGF0YS0wMjc4MikifSwKKyAgICB7IlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtbWF4VHJpYW5nbGVDb3VudC0wMjQyNCIsICJUaGUgdG90YWwgbnVtYmVyIG9mIHRyaWFuZ2xlcyBpbiBhbGwgZ2VvbWV0cmllcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6bWF4VHJpYW5nbGVDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1tYXhUcmlhbmdsZUNvdW50LTAyNDI0KSJ9LAorICAgIHsiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1wR2VvbWV0cmllcy1wYXJhbWV0ZXIiLCAiSWYgZ2VvbWV0cnlDb3VudCBpcyBub3QgMCwgcEdlb21ldHJpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZ2VvbWV0cnlDb3VudCB2YWxpZCBWa0dlb21ldHJ5TlYgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1wR2VvbWV0cmllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXNjcmF0Y2gtMDI3ODEiLCAic2NyYXRjaCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OViB1c2FnZSBmbGFnIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXNjcmF0Y2gtMDI3ODEpIn0sCisgICAgeyJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXR5cGUtMDI0MjUiLCAiSWYgdHlwZSBpcyBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfVE9QX0xFVkVMX05WIHRoZW4gZ2VvbWV0cnlDb3VudCBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtdHlwZS0wMjQyNSkifSwKKyAgICB7IlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtdHlwZS0wMjQyNiIsICJJZiB0eXBlIGlzIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlYgdGhlbiBpbnN0YW5jZUNvdW50IG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi10eXBlLTAyNDI2KSJ9LAorICAgIHsiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi10eXBlLTAyNzg2IiwgIklmIHR5cGUgaXMgVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX0JPVFRPTV9MRVZFTF9OViB0aGVuIHRoZSBnZW9tZXRyeVR5cGUgbWVtYmVyIG9mIGVhY2ggZ2VvbWV0cnkgaW4gcEdlb21ldHJpZXMgbXVzdCBiZSB0aGUgc2FtZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi10eXBlLTAyNzg2KSJ9LAorICAgIHsiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi10eXBlLXBhcmFtZXRlciIsICJ0eXBlIG11c3QgYmUgYSB2YWxpZCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZVR5cGVOViB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi10eXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmFtZXRlciIsICJhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgbXVzdCBiZSBhIHZhbGlkIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYtdHlwZS1wYXJhbWV0ZXIiLCAidHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNUeXBlTlYgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYtdHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItY29tbW9ucGFyZW50IiwgIkVhY2ggb2YgZmVuY2UsIHNlbWFwaG9yZSwgYW5kIHN3YXBjaGFpbiB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0luc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLWRldmljZU1hc2stMDEyOTAiLCAiZGV2aWNlTWFzayBtdXN0IGJlIGEgdmFsaWQgZGV2aWNlIG1hc2sgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1kZXZpY2VNYXNrLTAxMjkwKSJ9LAorICAgIHsiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLWRldmljZU1hc2stMDEyOTEiLCAiZGV2aWNlTWFzayBtdXN0IG5vdCBiZSB6ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItZGV2aWNlTWFzay0wMTI5MSkifSwKKyAgICB7IlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1mZW5jZS0wMTI4OSIsICJJZiBmZW5jZSBpcyBub3QgVktfTlVMTF9IQU5ETEUgaXQgbXVzdCBiZSB1bnNpZ25hbGVkIGFuZCBtdXN0IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IG90aGVyIHF1ZXVlIGNvbW1hbmQgdGhhdCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZXhlY3V0aW9uIG9uIHRoYXQgcXVldWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1mZW5jZS0wMTI4OSkifSwKKyAgICB7IlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1mZW5jZS1wYXJhbWV0ZXIiLCAiSWYgZmVuY2UgaXMgbm90IFZLX05VTExfSEFORExFLCBmZW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtGZW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1mZW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX05FWFRfSU1BR0VfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zZW1hcGhvcmUtMDEyODgiLCAiSWYgc2VtYXBob3JlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSBpdCBtdXN0IGJlIHVuc2lnbmFsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zZW1hcGhvcmUtMDEyODgpIn0sCisgICAgeyJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc2VtYXBob3JlLTAxNzgxIiwgIklmIHNlbWFwaG9yZSBpcyBub3QgVktfTlVMTF9IQU5ETEUgaXQgbXVzdCBub3QgaGF2ZSBhbnkgdW5jb21wbGV0ZWQgc2lnbmFsIG9yIHdhaXQgb3BlcmF0aW9ucyBwZW5kaW5nIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc2VtYXBob3JlLTAxNzgxKSJ9LAorICAgIHsiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXNlbWFwaG9yZS0wMTc4MiIsICJzZW1hcGhvcmUgYW5kIGZlbmNlIG11c3Qgbm90IGJvdGggYmUgZXF1YWwgdG8gVktfTlVMTF9IQU5ETEUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zZW1hcGhvcmUtMDE3ODIpIn0sCisgICAgeyJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc2VtYXBob3JlLTAzMjY2IiwgInNlbWFwaG9yZSBtdXN0IGhhdmUgYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXNlbWFwaG9yZS0wMzI2NikifSwKKyAgICB7IlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zZW1hcGhvcmUtcGFyYW1ldGVyIiwgIklmIHNlbWFwaG9yZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHNlbWFwaG9yZSBtdXN0IGJlIGEgdmFsaWQgVmtTZW1hcGhvcmUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zd2FwY2hhaW4tMDE2NzUiLCAic3dhcGNoYWluIG11c3Qgbm90IGJlIGluIHRoZSByZXRpcmVkIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItc3dhcGNoYWluLTAxNjc1KSJ9LAorICAgIHsiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLCAic3dhcGNoYWluIG11c3QgYmUgYSB2YWxpZCBWa1N3YXBjaGFpbktIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zd2FwY2hhaW4tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFItZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX1BST0ZJTElOR19MT0NLX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIsICJwZm5BbGxvY2F0aW9uIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgdXNlci1kZWZpbmVkIFBGTl92a0FsbG9jYXRpb25GdW5jdGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMikifSwKKyAgICB7IlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiLCAicGZuRnJlZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIHVzZXItZGVmaW5lZCBQRk5fdmtGcmVlRnVuY3Rpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQpIn0sCisgICAgeyJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiLCAiSWYgZWl0aGVyIG9mIHBmbkludGVybmFsQWxsb2NhdGlvbiBvciBwZm5JbnRlcm5hbEZyZWUgaXMgbm90IE5VTEwsIGJvdGggbXVzdCBiZSB2YWxpZCBjYWxsYmFja3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkludGVybmFsQWxsb2NhdGlvbi0wMDYzNSkifSwKKyAgICB7IlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMyIsICJwZm5SZWFsbG9jYXRpb24gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCB1c2VyLWRlZmluZWQgUEZOX3ZrUmVhbGxvY2F0aW9uRnVuY3Rpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmblJlYWxsb2NhdGlvbi0wMDYzMykifSwKKyAgICB7IlZVSUQtVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfUFJPUEVSVElFU19BTkRST0lEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lELXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfVVNBR0VfQU5EUk9JRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFItZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFItd2luZG93LTAxMjQ4IiwgIndpbmRvdyBtdXN0IHBvaW50IHRvIGEgdmFsaWQgQW5kcm9pZCBBTmF0aXZlV2luZG93LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUi13aW5kb3ctMDEyNDgpIn0sCisgICAgeyJWVUlELVZrQXBwbGljYXRpb25JbmZvLXBBcHBsaWNhdGlvbk5hbWUtcGFyYW1ldGVyIiwgIklmIHBBcHBsaWNhdGlvbk5hbWUgaXMgbm90IE5VTEwsIHBBcHBsaWNhdGlvbk5hbWUgbXVzdCBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBcHBsaWNhdGlvbkluZm8tcEFwcGxpY2F0aW9uTmFtZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXBwbGljYXRpb25JbmZvLXBFbmdpbmVOYW1lLXBhcmFtZXRlciIsICJJZiBwRW5naW5lTmFtZSBpcyBub3QgTlVMTCwgcEVuZ2luZU5hbWUgbXVzdCBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBcHBsaWNhdGlvbkluZm8tcEVuZ2luZU5hbWUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0FwcGxpY2F0aW9uSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBcHBsaWNhdGlvbkluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQXBwbGljYXRpb25JbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQVBQTElDQVRJT05fSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0FwcGxpY2F0aW9uSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZmluYWxMYXlvdXQtMDA4NDMiLCAiZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCBvciBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZmluYWxMYXlvdXQtMDA4NDMpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZpbmFsTGF5b3V0LXBhcmFtZXRlciIsICJmaW5hbExheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1maW5hbExheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODAiLCAiSWYgZm9ybWF0IGlzIGEgY29sb3IgZm9ybWF0LCBpbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjgwKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODEiLCAiSWYgZm9ybWF0IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQsIGluaXRpYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODEpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4MiIsICJJZiBmb3JtYXQgaXMgYSBjb2xvciBmb3JtYXQsIG5hbWU6ZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4MyIsICJJZiBmb3JtYXQgaXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCwgZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODMpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4NiIsICJJZiBmb3JtYXQgaXMgYSBjb2xvciBmb3JtYXQsIGluaXRpYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODYpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4NyIsICJJZiBmb3JtYXQgaXMgYSBjb2xvciBmb3JtYXQsIGZpbmFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg3KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODgiLCAiSWYgZm9ybWF0IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBhc3BlY3RzLCBpbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg4KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODkiLCAiSWYgZm9ybWF0IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBhc3BlY3RzLCBmaW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4OSkifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjkwIiwgIklmIGZvcm1hdCBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIGRlcHRoIGFzcGVjdCwgaW5pdGlhbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyOTApIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI5MSIsICJJZiBmb3JtYXQgaXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCB3aGljaCBpbmNsdWRlcyBvbmx5IHRoZSBkZXB0aCBhc3BlY3QsIGZpbmFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgb3IgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI5MSkifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjkyIiwgIklmIGZvcm1hdCBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIHN0ZW5jaWwgYXNwZWN0LCBpbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjkyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyOTMiLCAiSWYgZm9ybWF0IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgb25seSB0aGUgc3RlbmNpbCBhc3BlY3QsIGZpbmFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjkzKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtcGFyYW1ldGVyIiwgImZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24taW5pdGlhbExheW91dC1wYXJhbWV0ZXIiLCAiaW5pdGlhbExheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1pbml0aWFsTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tbG9hZE9wLXBhcmFtZXRlciIsICJsb2FkT3AgbXVzdCBiZSBhIHZhbGlkIFZrQXR0YWNobWVudExvYWRPcCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1sb2FkT3AtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zYW1wbGVzLXBhcmFtZXRlciIsICJzYW1wbGVzIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc2FtcGxlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI4NCIsICJJZiB0aGUgc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGluaXRpYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyODQpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI4NSIsICJJZiB0aGUgc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGZpbmFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjg1KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zdGVuY2lsTG9hZE9wLXBhcmFtZXRlciIsICJzdGVuY2lsTG9hZE9wIG11c3QgYmUgYSB2YWxpZCBWa0F0dGFjaG1lbnRMb2FkT3AgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc3RlbmNpbExvYWRPcC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXN0ZW5jaWxTdG9yZU9wLXBhcmFtZXRlciIsICJzdGVuY2lsU3RvcmVPcCBtdXN0IGJlIGEgdmFsaWQgVmtBdHRhY2htZW50U3RvcmVPcCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zdGVuY2lsU3RvcmVPcC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXN0b3JlT3AtcGFyYW1ldGVyIiwgInN0b3JlT3AgbXVzdCBiZSBhIHZhbGlkIFZrQXR0YWNobWVudFN0b3JlT3AgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc3RvcmVPcC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1maW5hbExheW91dC0wMzA2MSIsICJmaW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEIG9yIFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZmluYWxMYXlvdXQtMDMwNjEpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1maW5hbExheW91dC1wYXJhbWV0ZXIiLCAiZmluYWxMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZpbmFsTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtBdHRhY2htZW50RGVzY3JpcHRpb25GbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzI5NCIsICJJZiBmb3JtYXQgaXMgYSBjb2xvciBmb3JtYXQsIG5hbWU6aW5pdGlhbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCBvciBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMyOTQpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMyOTUiLCAiSWYgZm9ybWF0IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQsIG5hbWU6aW5pdGlhbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMyOTUpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMyOTYiLCAiSWYgZm9ybWF0IGlzIGEgY29sb3IgZm9ybWF0LCBuYW1lOmZpbmFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzI5NikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzI5NyIsICJJZiBmb3JtYXQgaXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCwgbmFtZTpmaW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMyOTcpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDAiLCAiSWYgZm9ybWF0IGlzIGEgY29sb3IgZm9ybWF0LCBpbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAwKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAxIiwgIklmIGZvcm1hdCBpcyBhIGNvbG9yIGZvcm1hdCwgZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgb3IgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDEpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDIiLCAiSWYgZm9ybWF0IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBhc3BlY3RzLCBhbmQgaW5pdGlhbExheW91dCBpcyBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiBvciBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCB0aGUgcE5leHQgY2hhaW4gbXVzdCBpbmNsdWRlIGEgVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAzIiwgIklmIGZvcm1hdCBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIGJvdGggZGVwdGggYW5kIHN0ZW5jaWwgYXNwZWN0cywgYW5kIGZpbmFsTGF5b3V0IGlzIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgYSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDMpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDQiLCAiSWYgZm9ybWF0IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgb25seSB0aGUgZGVwdGggYXNwZWN0LCBpbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgb3IgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDQpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDUiLCAiSWYgZm9ybWF0IGlzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2hpY2ggaW5jbHVkZXMgb25seSB0aGUgZGVwdGggYXNwZWN0LCBmaW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA1KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA2IiwgIklmIGZvcm1hdCBpcyBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIHN0ZW5jaWwgYXNwZWN0LCBpbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwNikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwNyIsICJJZiBmb3JtYXQgaXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCB3aGljaCBpbmNsdWRlcyBvbmx5IHRoZSBzdGVuY2lsIGFzcGVjdCwgZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA3KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LXBhcmFtZXRlciIsICJmb3JtYXQgbXVzdCBiZSBhIHZhbGlkIFZrRm9ybWF0IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItaW5pdGlhbExheW91dC1wYXJhbWV0ZXIiLCAiaW5pdGlhbExheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItaW5pdGlhbExheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1sb2FkT3AtcGFyYW1ldGVyIiwgImxvYWRPcCBtdXN0IGJlIGEgdmFsaWQgVmtBdHRhY2htZW50TG9hZE9wIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1sb2FkT3AtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OXzJfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLXNhbXBsZXMtcGFyYW1ldGVyIiwgInNhbXBsZXMgbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlQ291bnRGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc2FtcGxlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyOTgiLCAiSWYgdGhlIHNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBpbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjk4KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjk5IiwgIklmIHRoZSBzZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgb3IgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyOTkpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zdGVuY2lsTG9hZE9wLXBhcmFtZXRlciIsICJzdGVuY2lsTG9hZE9wIG11c3QgYmUgYSB2YWxpZCBWa0F0dGFjaG1lbnRMb2FkT3AgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLXN0ZW5jaWxMb2FkT3AtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc3RlbmNpbFN0b3JlT3AtcGFyYW1ldGVyIiwgInN0ZW5jaWxTdG9yZU9wIG11c3QgYmUgYSB2YWxpZCBWa0F0dGFjaG1lbnRTdG9yZU9wIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zdGVuY2lsU3RvcmVPcC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zdG9yZU9wLXBhcmFtZXRlciIsICJzdG9yZU9wIG11c3QgYmUgYSB2YWxpZCBWa0F0dGFjaG1lbnRTdG9yZU9wIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zdG9yZU9wLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl9TVEVOQ0lMX0xBWU9VVF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEZpbmFsTGF5b3V0LTAzMzA5IiwgInN0ZW5jaWxGaW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEZpbmFsTGF5b3V0LTAzMzA5KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEZpbmFsTGF5b3V0LTAzMzEwIiwgInN0ZW5jaWxGaW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEIG9yIFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEZpbmFsTGF5b3V0LTAzMzEwKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEZpbmFsTGF5b3V0LXBhcmFtZXRlciIsICJzdGVuY2lsRmluYWxMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxGaW5hbExheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUi1zdGVuY2lsSW5pdGlhbExheW91dC0wMzMwOCIsICJzdGVuY2lsSW5pdGlhbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEluaXRpYWxMYXlvdXQtMDMzMDgpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUi1zdGVuY2lsSW5pdGlhbExheW91dC1wYXJhbWV0ZXIiLCAic3RlbmNpbEluaXRpYWxMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxJbml0aWFsTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlLWxheW91dC0wMDg1NyIsICJJZiBhdHRhY2htZW50IGlzIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgbGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsIFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCwgVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UtbGF5b3V0LTAwODU3KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UtbGF5b3V0LXBhcmFtZXRlciIsICJsYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlLWxheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxMSIsICJJZiBhdHRhY2htZW50IGlzIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgYW5kIGFzcGVjdE1hc2sgZG9lcyBub3QgaW5jbHVkZSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgb3IgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCwgbGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzExKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTIiLCAiSWYgYXR0YWNobWVudCBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIGFuZCBhc3BlY3RNYXNrIGRvZXMgbm90IGluY2x1ZGUgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgbGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzEyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTQiLCAiSWYgYXR0YWNobWVudCBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIGFuZCBhc3BlY3RNYXNrIGluY2x1ZGVzIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIGxheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSLCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTQpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNSIsICJJZiBhdHRhY2htZW50IGlzIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgYW5kIGFzcGVjdE1hc2sgaW5jbHVkZXMgYm90aCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIGFuZCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQsIGFuZCBsYXlvdXQgaXMgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgdGhlIHBOZXh0IGNoYWluIG11c3QgaW5jbHVkZSBhIFZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNSkifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE2IiwgIklmIGF0dGFjaG1lbnQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBhbmQgYXNwZWN0TWFzayBpbmNsdWRlcyBvbmx5IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgdGhlbiBsYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE3IiwgIklmIGF0dGFjaG1lbnQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBhbmQgYXNwZWN0TWFzayBpbmNsdWRlcyBvbmx5IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCB0aGVuIGxheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTcpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItbGF5b3V0LTAzMDc3IiwgIklmIGF0dGFjaG1lbnQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBsYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVELCBvciBWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItbGF5b3V0LTAzMDc3KSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWxheW91dC1wYXJhbWV0ZXIiLCAibGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlTGF5b3V0IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItbGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMzEzIiwgIklmIHRoZSBzZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGF0dGFjaG1lbnQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBsYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMzMTMpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV9TVEVOQ0lMX0xBWU9VVF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlU3RlbmNpbExheW91dEtIUi1zdGVuY2lsTGF5b3V0LTAzMzE4IiwgInN0ZW5jaWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVELCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgb3IgVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxMYXlvdXQtMDMzMTgpIn0sCisgICAgeyJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZVN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbExheW91dC1wYXJhbWV0ZXIiLCAic3RlbmNpbExheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQtYXR0YWNobWVudEluZGV4LTAxNTMxIiwgImF0dGFjaG1lbnRJbmRleCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXR0YWNobWVudENvdW50IHNwZWNpZmllZCBpbiBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgYnkgVmtSZW5kZXJQYXNzQmVnaW5JbmZvOjpyZW5kZXJQYXNzIHdhcyBjcmVhdGVkIHdpdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhULWF0dGFjaG1lbnRJbmRleC0wMTUzMSkifSwKKyAgICB7IlZVSUQtVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhULXNhbXBsZUxvY2F0aW9uc0luZm8tcGFyYW1ldGVyIiwgInNhbXBsZUxvY2F0aW9uc0luZm8gbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhULXNhbXBsZUxvY2F0aW9uc0luZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLTAyNDUwIiwgImFjY2VsZXJhdGlvblN0cnVjdHVyZSBtdXN0IG5vdCBhbHJlYWR5IGJlIGJhY2tlZCBieSBhIG1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS0wMjQ1MCkifSwKKyAgICB7IlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJhbWV0ZXIiLCAiYWNjZWxlcmF0aW9uU3RydWN0dXJlIG11c3QgYmUgYSB2YWxpZCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwgYW5kIG1lbW9yeSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnktMDI1OTMiLCAibWVtb3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSBtZW1vcnlUeXBlQml0cyBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WIHdpdGggYWNjZWxlcmF0aW9uU3RydWN0dXJlIGFuZCB0eXBlIG9mIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX09CSkVDVF9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtbWVtb3J5LTAyNTkzKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtbWVtb3J5LXBhcmFtZXRlciIsICJtZW1vcnkgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlTWVtb3J5IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtbWVtb3J5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLW1lbW9yeU9mZnNldC0wMjQ1MSIsICJtZW1vcnlPZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgbWVtb3J5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnlPZmZzZXQtMDI0NTEpIn0sCisgICAgeyJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnlPZmZzZXQtMDI1OTQiLCAibWVtb3J5T2Zmc2V0IG11c3QgYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiB0aGUgYWxpZ25tZW50IG1lbWJlciBvZiB0aGUgVmtNZW1vcnlSZXF1aXJlbWVudHMgc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgd2l0aCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgYW5kIHR5cGUgb2YgVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnlPZmZzZXQtMDI1OTQpIn0sCisgICAgeyJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1wRGV2aWNlSW5kaWNlcy1wYXJhbWV0ZXIiLCAiSWYgZGV2aWNlSW5kZXhDb3VudCBpcyBub3QgMCwgcERldmljZUluZGljZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGV2aWNlSW5kZXhDb3VudCB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLXBEZXZpY2VJbmRpY2VzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfSU5GT19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1zaXplLTAyNTk1IiwgIlRoZSBzaXplIG1lbWJlciBvZiB0aGUgVmtNZW1vcnlSZXF1aXJlbWVudHMgc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgd2l0aCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgYW5kIHR5cGUgb2YgVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIG1lbW9yeSBtaW51cyBtZW1vcnlPZmZzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLXNpemUtMDI1OTUpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mby1kZXZpY2VJbmRleENvdW50LTAxNjA2IiwgImRldmljZUluZGV4Q291bnQgbXVzdCBlaXRoZXIgYmUgemVybyBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZXMgaW4gdGhlIGxvZ2ljYWwgZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mby1kZXZpY2VJbmRleENvdW50LTAxNjA2KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8tcERldmljZUluZGljZXMtMDE2MDciLCAiQWxsIGVsZW1lbnRzIG9mIHBEZXZpY2VJbmRpY2VzIG11c3QgYmUgdmFsaWQgZGV2aWNlIGluZGljZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvLXBEZXZpY2VJbmRpY2VzLTAxNjA3KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8tcERldmljZUluZGljZXMtcGFyYW1ldGVyIiwgIklmIGRldmljZUluZGV4Q291bnQgaXMgbm90IDAsIHBEZXZpY2VJbmRpY2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRldmljZUluZGV4Q291bnQgdWludDMyX3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mby1wRGV2aWNlSW5kaWNlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeURldmljZUdyb3VwSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQlVGRkVSX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tYnVmZmVyLTAxNTkzIiwgImJ1ZmZlciBtdXN0IG5vdCBhbHJlYWR5IGJlIGJhY2tlZCBieSBhIG1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1idWZmZXItMDE1OTMpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tYnVmZmVyLTAxNTk0IiwgImJ1ZmZlciBtdXN0IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGFueSBzcGFyc2UgbWVtb3J5IGJpbmRpbmcgZmxhZ3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1idWZmZXItMDE1OTQpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tYnVmZmVyLTAxNjAyIiwgIklmIGJ1ZmZlciByZXF1aXJlcyBhIGRlZGljYXRlZCBhbGxvY2F0aW9uKGFzIHJlcG9ydGVkIGJ5IHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMiBpbiBWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50czo6cmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uIGZvciBidWZmZXIpLCBtZW1vcnkgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjpidWZmZXIgZXF1YWwgdG8gYnVmZmVyIGFuZCBtZW1vcnlPZmZzZXQgbXVzdCBiZSB6ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tYnVmZmVyLTAxNjAyKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWJ1ZmZlci0wMTYwMyIsICJJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY6OmRlZGljYXRlZEFsbG9jYXRpb24gZXF1YWwgdG8gVktfVFJVRSwgbWVtb3J5IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjo6YnVmZmVyIGVxdWFsIHRvIGJ1ZmZlciBhbmQgbWVtb3J5T2Zmc2V0IG11c3QgYmUgemVybyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWJ1ZmZlci0wMTYwMykifSwKKyAgICB7IlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1idWZmZXItMDE2MDQiLCAiSWYgYnVmZmVyIHdhcyBub3QgY3JlYXRlZCB3aXRoIFZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVjo6ZGVkaWNhdGVkQWxsb2NhdGlvbiBlcXVhbCB0byBWS19UUlVFLCBtZW1vcnkgbXVzdCBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkZWRpY2F0ZWQgZm9yIGEgc3BlY2lmaWMgYnVmZmVyIG9yIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tYnVmZmVyLTAxNjA0KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWJ1ZmZlci1wYXJhbWV0ZXIiLCAiYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1idWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGJ1ZmZlciwgYW5kIG1lbW9yeSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWhhbmRsZVR5cGVzLTAyNzkxIiwgIklmIHRoZSB2YWx1ZSBvZiBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzo6aGFuZGxlVHlwZXMgdXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkgaXMgbm90IDAsIGl0IG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgb2YgdGhlIGhhbmRsZXMgc2V0IGluIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvOjpoYW5kbGVUeXBlcyB3aGVuIGJ1ZmZlciB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLWhhbmRsZVR5cGVzLTAyNzkxKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeS0wMTU5OSIsICJtZW1vcnkgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHVzaW5nIG9uZSBvZiB0aGUgbWVtb3J5IHR5cGVzIGFsbG93ZWQgaW4gdGhlIG1lbW9yeVR5cGVCaXRzIG1lbWJlciBvZiB0aGUgVmtNZW1vcnlSZXF1aXJlbWVudHMgc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIHdpdGggYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tbWVtb3J5LTAxNTk5KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeS0wMTkwMCIsICJJZiB0aGUgVmtNZW1vcnlBbGxvY2F0ZUluZm8gcHJvdmlkZWQgd2hlbiBtZW1vcnkgd2FzIGFsbG9jYXRlZCBpbmNsdWRlZCBhIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIHN0cnVjdHVyZSBpbiBpdHMgcE5leHQgY2hhaW4sIGFuZCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzo6YnVmZmVyIHdhcyBub3QgVktfTlVMTF9IQU5ETEUsIHRoZW4gYnVmZmVyIG11c3QgZXF1YWwgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmJ1ZmZlciBhbmQgbWVtb3J5T2Zmc2V0IG11c3QgYmUgemVyby4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1tZW1vcnktMDE5MDApIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tbWVtb3J5LTAyNzkyIiwgIklmIG1lbW9yeSB3YXMgY3JlYXRlZCBieSBhIG1lbW9yeSBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHR5cGUgb2YgdGhlIGltcG9ydGVkIG1lbW9yeSBtdXN0IGFsc28gaGF2ZSBiZWVuIHNldCBpbiBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgd2hlbiBidWZmZXIgd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1tZW1vcnktMDI3OTIpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tbWVtb3J5LXBhcmFtZXRlciIsICJtZW1vcnkgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlTWVtb3J5IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tbWVtb3J5T2Zmc2V0LTAxNTk1IiwgIm1lbW9yeU9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBtZW1vcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1tZW1vcnlPZmZzZXQtMDE1OTUpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tbWVtb3J5T2Zmc2V0LTAxNjAwIiwgIm1lbW9yeU9mZnNldCBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgdGhlIGFsaWdubWVudCBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyB3aXRoIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLW1lbW9yeU9mZnNldC0wMTYwMCkifSwKKyAgICB7IlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1wTmV4dC0wMTYwNSIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0JpbmRCdWZmZXJNZW1vcnlEZXZpY2VHcm91cEluZm8gc3RydWN0dXJlLCBhbGwgaW5zdGFuY2VzIG9mIG1lbW9yeSBzcGVjaWZpZWQgYnkgVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjpwRGV2aWNlSW5kaWNlcyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1wTmV4dC0wMTYwNSkifSwKKyAgICB7IlZVSUQtVmtCaW5kQnVmZmVyTWVtb3J5SW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtCaW5kQnVmZmVyTWVtb3J5RGV2aWNlR3JvdXBJbmZvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQmluZEJ1ZmZlck1lbW9yeUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0JVRkZFUl9NRU1PUllfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLXNpemUtMDE2MDEiLCAiVGhlIHNpemUgbWVtYmVyIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMgd2l0aCBidWZmZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgbWVtb3J5IG1pbnVzIG1lbW9yeU9mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRCdWZmZXJNZW1vcnlJbmZvLXNpemUtMDE2MDEpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLWRldmljZUluZGV4Q291bnQtMDE2MzMiLCAiQXQgbGVhc3Qgb25lIG9mIGRldmljZUluZGV4Q291bnQgYW5kIHNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQgbXVzdCBiZSB6ZXJvLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1kZXZpY2VJbmRleENvdW50LTAxNjMzKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1kZXZpY2VJbmRleENvdW50LTAxNjM0IiwgImRldmljZUluZGV4Q291bnQgbXVzdCBlaXRoZXIgYmUgemVybyBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZXMgaW4gdGhlIGxvZ2ljYWwgZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLWRldmljZUluZGV4Q291bnQtMDE2MzQpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLWV4dGVudC0wMTY0MCIsICJUaGUgZXh0ZW50LndpZHRoIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zIG11c3QgZWl0aGVyIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHNwYXJzZSBpbWFnZSBibG9jayB3aWR0aCBvZiBhbGwgbm9uLW1ldGFkYXRhIGFzcGVjdHMgb2YgdGhlIGltYWdlLCBvciBlbHNlIGV4dGVudC53aWR0aCArIG9mZnNldC54IG11c3QgZXF1YWwgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1leHRlbnQtMDE2NDApIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLWV4dGVudC0wMTY0MSIsICJUaGUgZXh0ZW50LmhlaWdodCBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyBtdXN0IGVpdGhlciBiZSBhIG11bHRpcGxlIG9mIHRoZSBzcGFyc2UgaW1hZ2UgYmxvY2sgaGVpZ2h0IG9mIGFsbCBub24tbWV0YWRhdGEgYXNwZWN0cyBvZiB0aGUgaW1hZ2UsIG9yIGVsc2UgZXh0ZW50LmhlaWdodCArIG9mZnNldC55IG11c3QgZXF1YWwgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1leHRlbnQtMDE2NDEpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLW9mZnNldC0wMTYzOCIsICJUaGUgb2Zmc2V0LnggbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBzcGFyc2UgaW1hZ2UgYmxvY2sgd2lkdGggKFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjppbWFnZUdyYW51bGFyaXR5LndpZHRoKSBvZiBhbGwgbm9uLW1ldGFkYXRhIGFzcGVjdHMgb2YgdGhlIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLW9mZnNldC0wMTYzOCkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tb2Zmc2V0LTAxNjM5IiwgIlRoZSBvZmZzZXQueSBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHNwYXJzZSBpbWFnZSBibG9jayBoZWlnaHQgKFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjppbWFnZUdyYW51bGFyaXR5LmhlaWdodCkgb2YgYWxsIG5vbi1tZXRhZGF0YSBhc3BlY3RzIG9mIHRoZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1vZmZzZXQtMDE2MzkpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLXBEZXZpY2VJbmRpY2VzLTAxNjM1IiwgIkFsbCBlbGVtZW50cyBvZiBwRGV2aWNlSW5kaWNlcyBtdXN0IGJlIHZhbGlkIGRldmljZSBpbmRpY2VzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1wRGV2aWNlSW5kaWNlcy0wMTYzNSkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tcERldmljZUluZGljZXMtcGFyYW1ldGVyIiwgIklmIGRldmljZUluZGV4Q291bnQgaXMgbm90IDAsIHBEZXZpY2VJbmRpY2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRldmljZUluZGV4Q291bnQgdWludDMyX3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLXBEZXZpY2VJbmRpY2VzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tcFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucy0wMTYzNyIsICJFbGVtZW50cyBvZiBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc2FtZSBpbnN0YW5jZSBvZiBhbiBpbWFnZSBtdXN0IG5vdCBvdmVybGFwLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLTAxNjM3KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLXBhcmFtZXRlciIsICJJZiBzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50IGlzIG5vdCAwLCBwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQgVmtSZWN0MkQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1wU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9ERVZJQ0VfR1JPVVBfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlEZXZpY2VHcm91cEluZm8tc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudC0wMTYzNiIsICJzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50IG11c3QgZWl0aGVyIGJlIHplcm8gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwaHlzaWNhbCBkZXZpY2VzIGluIHRoZSBsb2dpY2FsIGRldmljZSBzcXVhcmVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvLXNwbGl0SW5zdGFuY2VCaW5kUmVnaW9uQ291bnQtMDE2MzYpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBpbWFnZSwgYW5kIG1lbW9yeSB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taGFuZGxlVHlwZXMtMDI3OTMiLCAiSWYgdGhlIHZhbHVlIG9mIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOjpoYW5kbGVUeXBlcyB1c2VkIHRvIGFsbG9jYXRlIG1lbW9yeSBpcyBub3QgMCwgaXQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBvZiB0aGUgaGFuZGxlcyBzZXQgaW4gVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taGFuZGxlVHlwZXMtMDI3OTMpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS0wMTYwOSIsICJpbWFnZSBtdXN0IG5vdCBhbHJlYWR5IGJlIGJhY2tlZCBieSBhIG1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWltYWdlLTAxNjA5KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taW1hZ2UtMDE2MTAiLCAiaW1hZ2UgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhbnkgc3BhcnNlIG1lbW9yeSBiaW5kaW5nIGZsYWdzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS0wMTYxMCkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWltYWdlLTAxNjIyIiwgIklmIGltYWdlIHJlcXVpcmVzIGEgZGVkaWNhdGVkIGFsbG9jYXRpb24gKGFzIHJlcG9ydGVkIGJ5IHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyIGluIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzOjpyZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gZm9yIGltYWdlKSwgbWVtb3J5IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzo6aW1hZ2UgZXF1YWwgdG8gaW1hZ2UgYW5kIG1lbW9yeU9mZnNldCBtdXN0IGJlIHplcm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWltYWdlLTAxNjIyKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taW1hZ2UtMDE2MjMiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjo6ZGVkaWNhdGVkQWxsb2NhdGlvbiBlcXVhbCB0byBWS19UUlVFLCBtZW1vcnkgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WOjppbWFnZSBlcXVhbCB0byBpbWFnZSBhbmQgbWVtb3J5T2Zmc2V0IG11c3QgYmUgemVybyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taW1hZ2UtMDE2MjMpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS0wMTYyNCIsICJJZiBpbWFnZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCBWa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVjo6ZGVkaWNhdGVkQWxsb2NhdGlvbiBlcXVhbCB0byBWS19UUlVFLCBtZW1vcnkgbXVzdCBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkZWRpY2F0ZWQgZm9yIGEgc3BlY2lmaWMgYnVmZmVyIG9yIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS0wMTYyNCkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLWltYWdlLTAxNjMwIiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSB2YWxpZCBzd2FwY2hhaW4gaGFuZGxlIGluIFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjpzd2FwY2hhaW4sIHRoZW4gdGhlIHBOZXh0IGNoYWluIG11c3QgaW5jbHVkZSBhIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2FtZSBzd2FwY2hhaW4gaGFuZGxlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taW1hZ2UtMDE2MzApIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS1wYXJhbWV0ZXIiLCAiaW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1pbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1tZW1vcnktMDE2MTIiLCAibWVtb3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSBtZW1vcnlUeXBlQml0cyBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIHdpdGggaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMTYxMikifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMTYxNCIsICJUaGUgZGlmZmVyZW5jZSBvZiB0aGUgc2l6ZSBvZiBtZW1vcnkgYW5kIG1lbW9yeU9mZnNldCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIHdpdGggdGhlIHNhbWUgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMTYxNCkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMTYyNSIsICJtZW1vcnkgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlTWVtb3J5IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tbWVtb3J5LTAxNjI1KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tbWVtb3J5LTAxOTAzIiwgIklmIHRoZSBWa01lbW9yeUFsbG9jYXRlSW5mbyBwcm92aWRlZCB3aGVuIG1lbW9yeSB3YXMgYWxsb2NhdGVkIGluY2x1ZGVkIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gc3RydWN0dXJlIGluIGl0cyBwTmV4dCBjaGFpbiwgYW5kIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjppbWFnZSB3YXMgbm90IFZLX05VTExfSEFORExFLCB0aGVuIGltYWdlIG11c3QgZXF1YWwgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmltYWdlIGFuZCBtZW1vcnlPZmZzZXQgbXVzdCBiZSB6ZXJvLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tbWVtb3J5LTAxOTAzKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tbWVtb3J5LTAyNjMwIiwgIklmIHRoZSBkZWRpY2F0ZWQgYWxsb2NhdGlvbiBpbWFnZSBhbGlhc2luZyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgdGhlIFZrTWVtb3J5QWxsb2NhdGVJbmZvIHByb3ZpZGVkIHdoZW4gbWVtb3J5IHdhcyBhbGxvY2F0ZWQgaW5jbHVkZWQgYSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgaW4gaXRzIHBOZXh0IGNoYWluLCBhbmQgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmltYWdlIHdhcyBub3QgVktfTlVMTF9IQU5ETEUsIHRoZW4gaW1hZ2UgbXVzdCBlcXVhbCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzo6aW1hZ2UgYW5kIG1lbW9yeU9mZnNldCBtdXN0IGJlIHplcm8uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1tZW1vcnktMDI2MzApIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1tZW1vcnktMDI2MzEiLCAiSWYgdGhlIGRlZGljYXRlZCBhbGxvY2F0aW9uIGltYWdlIGFsaWFzaW5nIGZlYXR1cmUgaXMgZW5hYmxlZCwgYW5kIHRoZSBWa01lbW9yeUFsbG9jYXRlSW5mbyBwcm92aWRlZCB3aGVuIG1lbW9yeSB3YXMgYWxsb2NhdGVkIGluY2x1ZGVkIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gc3RydWN0dXJlIGluIGl0cyBwTmV4dCBjaGFpbiwgYW5kIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjppbWFnZSB3YXMgbm90IFZLX05VTExfSEFORExFLCB0aGVuIG1lbW9yeU9mZnNldCBtdXN0IGJlIHplcm8sIGFuZCBpbWFnZSBtdXN0IGJlIGVpdGhlciBlcXVhbCB0byBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzo6aW1hZ2Ugb3IgYW4gaW1hZ2UgdGhhdCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGluIFZrSW1hZ2VDcmVhdGVJbmZvLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBleHRlbnQgYW5kIGFycmF5TGF5ZXJzIG1heSBkaWZmZXIgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogZXZlcnkgZGltZW5zaW9uIGluIHRoZSBleHRlbnQgcGFyYW1ldGVyIG9mIHRoZSBpbWFnZSBiZWluZyBib3VuZCBtdXN0IGJlIGVxdWFsIHRvIG9yIHNtYWxsZXIgdGhhbiB0aGUgb3JpZ2luYWwgaW1hZ2UgZm9yIHdoaWNoIHRoZSBhbGxvY2F0aW9uIHdhcyBjcmVhdGVkOyBhbmQgdGhlIGFycmF5TGF5ZXJzIHBhcmFtZXRlciBvZiB0aGUgaW1hZ2UgYmVpbmcgYm91bmQgbXVzdCBiZSBlcXVhbCB0byBvciBzbWFsbGVyIHRoYW4gdGhlIG9yaWdpbmFsIGltYWdlIGZvciB3aGljaCB0aGUgYWxsb2NhdGlvbiB3YXMgY3JlYXRlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMjYzMSkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeS0wMjc5NCIsICJJZiBtZW1vcnkgd2FzIGNyZWF0ZWQgYnkgYSBtZW1vcnkgaW1wb3J0IG9wZXJhdGlvbiwgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIG9mIHRoZSBpbXBvcnRlZCBtZW1vcnkgbXVzdCBhbHNvIGhhdmUgYmVlbiBzZXQgaW4gVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tbWVtb3J5LTAyNzk0KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tbWVtb3J5T2Zmc2V0LTAxNjExIiwgIm1lbW9yeU9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBtZW1vcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeU9mZnNldC0wMTYxMSkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeU9mZnNldC0wMTYxMyIsICJtZW1vcnlPZmZzZXQgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQgbWVtYmVyIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyB3aXRoIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1tZW1vcnlPZmZzZXQtMDE2MTMpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYxNSIsICJJZiB0aGUgcE5leHQgY2hhaW4gZG9lcyBub3QgaW5jbHVkZSBhIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIHN0cnVjdHVyZSwgbWVtb3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSBtZW1vcnlUeXBlQml0cyBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiB3aXRoIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYxNSkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjE2IiwgIklmIHRoZSBwTmV4dCBjaGFpbiBkb2VzIG5vdCBpbmNsdWRlIGEgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gc3RydWN0dXJlLCBtZW1vcnlPZmZzZXQgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQgbWVtYmVyIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgd2l0aCBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MTYpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYxNyIsICJJZiB0aGUgcE5leHQgY2hhaW4gZG9lcyBub3QgaW5jbHVkZSBhIFZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvIHN0cnVjdHVyZSwgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHNpemUgb2YgbWVtb3J5IGFuZCBtZW1vcnlPZmZzZXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgbWVtYmVyIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgd2l0aCB0aGUgc2FtZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MTcpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYxOCIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyBzdHJ1Y3R1cmUsIGltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVCBiaXQgc2V0LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MTgpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYxOSIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyBzdHJ1Y3R1cmUsIG1lbW9yeSBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgb25lIG9mIHRoZSBtZW1vcnkgdHlwZXMgYWxsb3dlZCBpbiB0aGUgbWVtb3J5VHlwZUJpdHMgbWVtYmVyIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgd2l0aCBpbWFnZSBhbmQgdGhlIGNvcnJlY3QgcGxhbmVBc3BlY3QgZm9yIHRoaXMgcGxhbmUgaW4gdGhlIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgc3RydWN0dXJlJ3MgcE5leHQgY2hhaW4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjE5KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MjAiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gc3RydWN0dXJlLCBtZW1vcnlPZmZzZXQgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQgbWVtYmVyIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgd2l0aCBpbWFnZSBhbmQgdGhlIGNvcnJlY3QgcGxhbmVBc3BlY3QgZm9yIHRoaXMgcGxhbmUgaW4gdGhlIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgc3RydWN0dXJlJ3MgcE5leHQgY2hhaW4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjIwKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MjEiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8gc3RydWN0dXJlLCB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgc2l6ZSBvZiBtZW1vcnkgYW5kIG1lbW9yeU9mZnNldCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiB3aXRoIHRoZSBzYW1lIGltYWdlIGFuZCB0aGUgY29ycmVjdCBwbGFuZUFzcGVjdCBmb3IgdGhpcyBwbGFuZSBpbiB0aGUgVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBzdHJ1Y3R1cmUncyBwTmV4dCBjaGFpbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MjEpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYyNiIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyBzdHJ1Y3R1cmUsIGFsbCBpbnN0YW5jZXMgb2YgbWVtb3J5IHNwZWNpZmllZCBieSBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzo6cERldmljZUluZGljZXMgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYyNikifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjI3IiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvIHN0cnVjdHVyZSwgYW5kIFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjpzcGxpdEluc3RhbmNlQmluZFJlZ2lvbkNvdW50IGlzIG5vdCB6ZXJvLCB0aGVuIGltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MjcpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYyOCIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyBzdHJ1Y3R1cmUsIGFsbCBlbGVtZW50cyBvZiBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbzo6cFNwbGl0SW5zdGFuY2VCaW5kUmVnaW9ucyBtdXN0IGJlIHZhbGlkIHJlY3RhbmdsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MjgpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYyOSIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbyBzdHJ1Y3R1cmUsIHRoZSB1bmlvbiBvZiB0aGUgYXJlYXMgb2YgYWxsIGVsZW1lbnRzIG9mIFZrQmluZEltYWdlTWVtb3J5RGV2aWNlR3JvdXBJbmZvOjpwU3BsaXRJbnN0YW5jZUJpbmRSZWdpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc2FtZSBpbnN0YW5jZSBvZiBpbWFnZSBtdXN0IGNvdmVyIHRoZSBlbnRpcmUgaW1hZ2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYyOSkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjMxIiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUiBzdHJ1Y3R1cmUsIG1lbW9yeSBtdXN0IGJlIFZLX05VTExfSEFORExFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYzMSkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjMyIiwgIklmIHRoZSBwTmV4dCBjaGFpbiBkb2VzIG5vdCBpbmNsdWRlIGEgVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSIHN0cnVjdHVyZSwgbWVtb3J5IG11c3QgYmUgYSB2YWxpZCBWa0RldmljZU1lbW9yeSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXBOZXh0LTAxNjMyKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbywgVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSLCBvciBWa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mbyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFItaW1hZ2VJbmRleC0wMTY0NCIsICJpbWFnZUluZGV4IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgaW1hZ2VzIGluIHN3YXBjaGFpbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFItaW1hZ2VJbmRleC0wMTY0NCkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfU1dBUENIQUlOX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLCAic3dhcGNoYWluIG11c3QgYmUgYSB2YWxpZCBWa1N3YXBjaGFpbktIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvLU5vbmUtMDE2NDMiLCAiQSBzaW5nbGUgY2FsbCB0byB2a0JpbmRJbWFnZU1lbW9yeTIgbXVzdCBiaW5kIGFsbCBvciBub25lIG9mIHRoZSBwbGFuZXMgb2YgYW4gaW1hZ2UgKGkuZS4gYmluZGluZ3MgdG8gYWxsIHBsYW5lcyBvZiBhbiBpbWFnZSBtdXN0IGJlIG1hZGUgaW4gYSBzaW5nbGUgdmtCaW5kSW1hZ2VNZW1vcnkyIGNhbGwpLCBhcyBzZXBhcmF0ZSBiaW5kaW5ncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1Ob25lLTAxNjQzKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1wbGFuZUFzcGVjdC0wMjI4MyIsICJJZiB0aGUgaW1hZ2UncyB0aWxpbmcgaXMgVktfSU1BR0VfVElMSU5HX0xJTkVBUiBvciBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgdGhlbiBwbGFuZUFzcGVjdCBtdXN0IGJlIGEgc2luZ2xlIHZhbGlkIGZvcm1hdCBwbGFuZSBmb3IgdGhlIGltYWdlLiAoVGhhdCBpcywgcGxhbmVBc3BlY3QgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQgb3IgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUIGZvciAnXzJQTEFORScgZm9ybWF0cyBhbmQgcGxhbmVBc3BlY3QgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCwgb3IgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUIGZvciAnXzNQTEFORScgZm9ybWF0cy4pIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZEltYWdlUGxhbmVNZW1vcnlJbmZvLXBsYW5lQXNwZWN0LTAyMjgzKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1wbGFuZUFzcGVjdC0wMjI4NCIsICJJZiB0aGUgaW1hZ2UncyB0aWxpbmcgaXMgVktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhULCAgdGhlbiBwbGFuZUFzcGVjdCBtdXN0IGJlIGEgc2luZ2xlIHZhbGlkIG1lbW9yeSBwbGFuZSBmb3IgdGhlICBpbWFnZS4gIChUaGF0IGlzLCBhc3BlY3RNYXNrIG11c3Qgc3BlY2lmeSBhIHBsYW5lIGluZGV4IHRoYXQgaXMgbGVzcyB0aGFuICB0aGUgIGRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCAgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZSdzIGZvcm1hdCBhbmQgZHJtRm9ybWF0TW9kaWZpZXIuKSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1wbGFuZUFzcGVjdC0wMjI4NCkifSwKKyAgICB7IlZVSUQtVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8tcGxhbmVBc3BlY3QtcGFyYW1ldGVyIiwgInBsYW5lQXNwZWN0IG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8tcGxhbmVBc3BlY3QtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRJbWFnZVBsYW5lTWVtb3J5SW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfUExBTkVfTUVNT1JZX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kSW1hZ2VQbGFuZU1lbW9yeUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQmluZFNwYXJzZUluZm8tY29tbW9ucGFyZW50IiwgIkJvdGggb2YgdGhlIGVsZW1lbnRzIG9mIHBTaWduYWxTZW1hcGhvcmVzLCBhbmQgdGhlIGVsZW1lbnRzIG9mIHBXYWl0U2VtYXBob3JlcyB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wQnVmZmVyQmluZHMtcGFyYW1ldGVyIiwgIklmIGJ1ZmZlckJpbmRDb3VudCBpcyBub3QgMCwgcEJ1ZmZlckJpbmRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJ1ZmZlckJpbmRDb3VudCB2YWxpZCBWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kU3BhcnNlSW5mby1wQnVmZmVyQmluZHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBJbWFnZUJpbmRzLXBhcmFtZXRlciIsICJJZiBpbWFnZUJpbmRDb3VudCBpcyBub3QgMCwgcEltYWdlQmluZHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2VCaW5kQ291bnQgdmFsaWQgVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kU3BhcnNlSW5mby1wSW1hZ2VCaW5kcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQmluZFNwYXJzZUluZm8tcEltYWdlT3BhcXVlQmluZHMtcGFyYW1ldGVyIiwgIklmIGltYWdlT3BhcXVlQmluZENvdW50IGlzIG5vdCAwLCBwSW1hZ2VPcGFxdWVCaW5kcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZU9wYXF1ZUJpbmRDb3VudCB2YWxpZCBWa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8gc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBJbWFnZU9wYXF1ZUJpbmRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wTmV4dC0wMzI0NyIsICJJZiB0aGUgcE5leHQgY2hhaW4gb2YgdGhpcyBzdHJ1Y3R1cmUgaW5jbHVkZXMgYSBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiBzdHJ1Y3R1cmUgYW5kIGFueSBlbGVtZW50IG9mIHBXYWl0U2VtYXBob3JlcyB3YXMgY3JlYXRlZCB3aXRoIGEgVmtTZW1hcGhvcmVUeXBlS0hSIG9mIFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiB0aGVuIGl0cyB3YWl0U2VtYXBob3JlVmFsdWVDb3VudCBtZW1iZXIgbXVzdCBlcXVhbCB3YWl0U2VtYXBob3JlQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kU3BhcnNlSW5mby1wTmV4dC0wMzI0NykifSwKKyAgICB7IlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wTmV4dC0wMzI0OCIsICJJZiB0aGUgcE5leHQgY2hhaW4gb2YgdGhpcyBzdHJ1Y3R1cmUgaW5jbHVkZXMgYSBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiBzdHJ1Y3R1cmUgYW5kIGFueSBlbGVtZW50IG9mIHBTaWduYWxTZW1hcGhvcmVzIHdhcyBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIHRoZW4gaXRzIHNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQgbWVtYmVyIG11c3QgZXF1YWwgc2lnbmFsU2VtYXBob3JlQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kU3BhcnNlSW5mby1wTmV4dC0wMzI0OCkifSwKKyAgICB7IlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wTmV4dC1wTmV4dCIsICJFYWNoIHBOZXh0IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mbyBvciBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBTaWduYWxTZW1hcGhvcmVzLTAzMjQ5IiwgIkZvciBlYWNoIGVsZW1lbnQgb2YgcFNpZ25hbFNlbWFwaG9yZXMgY3JlYXRlZCB3aXRoIGEgVmtTZW1hcGhvcmVUeXBlS0hSIG9mIFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSOjpwU2lnbmFsU2VtYXBob3JlVmFsdWVzIG11c3QgaGF2ZSBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlIHdoZW4gdGhlIHNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZFNwYXJzZUluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNDkpIn0sCisgICAgeyJWVUlELVZrQmluZFNwYXJzZUluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNTEiLCAiRm9yIGVhY2ggZWxlbWVudCBvZiBwU2lnbmFsU2VtYXBob3JlcyBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI6OnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgbXVzdCBoYXZlIGEgdmFsdWUgd2hpY2ggZG9lcyBub3QgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbWFwaG9yZSBvciBmcm9tIHRoZSB2YWx1ZSBvZiBhbnkgb3V0c3RhbmRpbmcgc2VtYXBob3JlIHdhaXQgb3Igc2lnbmFsIG9wZXJhdGlvbiBvbiB0aGF0IHNlbWFwaG9yZSBieSBtb3JlIHRoYW4gbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZFNwYXJzZUluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNTEpIn0sCisgICAgeyJWVUlELVZrQmluZFNwYXJzZUluZm8tcFNpZ25hbFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwgIklmIHNpZ25hbFNlbWFwaG9yZUNvdW50IGlzIG5vdCAwLCBwU2lnbmFsU2VtYXBob3JlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzaWduYWxTZW1hcGhvcmVDb3VudCB2YWxpZCBWa1NlbWFwaG9yZSBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZFNwYXJzZUluZm8tcFNpZ25hbFNlbWFwaG9yZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBXYWl0U2VtYXBob3Jlcy0wMzI0NiIsICJJZiBhbnkgZWxlbWVudCBvZiBwV2FpdFNlbWFwaG9yZXMgb3IgcFNpZ25hbFNlbWFwaG9yZXMgd2FzIGNyZWF0ZWQgd2l0aCBhIFZrU2VtYXBob3JlVHlwZUtIUiBvZiBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIgdGhlbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBpbmNsdWRlIGEgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZFNwYXJzZUluZm8tcFdhaXRTZW1hcGhvcmVzLTAzMjQ2KSJ9LAorICAgIHsiVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBXYWl0U2VtYXBob3Jlcy0wMzI1MCIsICJGb3IgZWFjaCBlbGVtZW50IG9mIHBXYWl0U2VtYXBob3JlcyBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI6OnBXYWl0U2VtYXBob3JlVmFsdWVzIG11c3QgaGF2ZSBhIHZhbHVlIHdoaWNoIGRvZXMgbm90IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUgb3IgZnJvbSB0aGUgdmFsdWUgb2YgYW55IG91dHN0YW5kaW5nIHNlbWFwaG9yZSB3YWl0IG9yIHNpZ25hbCBvcGVyYXRpb24gb24gdGhhdCBzZW1hcGhvcmUgYnkgbW9yZSB0aGFuIG1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0JpbmRTcGFyc2VJbmZvLXBXYWl0U2VtYXBob3Jlcy0wMzI1MCkifSwKKyAgICB7IlZVSUQtVmtCaW5kU3BhcnNlSW5mby1wV2FpdFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwgIklmIHdhaXRTZW1hcGhvcmVDb3VudCBpcyBub3QgMCwgcFdhaXRTZW1hcGhvcmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHdhaXRTZW1hcGhvcmVDb3VudCB2YWxpZCBWa1NlbWFwaG9yZSBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZFNwYXJzZUluZm8tcFdhaXRTZW1hcGhvcmVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCaW5kU3BhcnNlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCaW5kU3BhcnNlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtCaW5kU3BhcnNlSW5mby1zVHlwZS11bmlxdWUiLCAiRWFjaCBzVHlwZSBtZW1iZXIgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgdW5pcXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQmluZFNwYXJzZUluZm8tc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckNvcHktc2l6ZS0wMTk4OCIsICJUaGUgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ29weS1zaXplLTAxOTg4KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tTm9uZS0wMTg4OCIsICJJZiBhbnkgb2YgdGhlIGJpdHMgVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQsIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQsIG9yIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUIGFyZSBzZXQsIFZLX0JVRkZFUl9DUkVBVEVfUFJPVEVDVEVEX0JJVCBtdXN0IG5vdCBhbHNvIGJlIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tTm9uZS0wMTg4OCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLWRldmljZUFkZHJlc3MtMDI2MDQiLCAiSWYgVmtCdWZmZXJEZXZpY2VBZGRyZXNzQ3JlYXRlSW5mb0VYVDo6ZGV2aWNlQWRkcmVzcyBpcyBub3QgemVybywgZmxhZ3MgbXVzdCBpbmNsdWRlIFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZGV2aWNlQWRkcmVzcy0wMjYwNCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAwOTE1IiwgIklmIHRoZSBzcGFyc2UgYmluZGluZ3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDA5MTUpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMDkxNiIsICJJZiB0aGUgc3BhcnNlIGJ1ZmZlciByZXNpZGVuY3kgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMDkxNikifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAwOTE3IiwgIklmIHRoZSBzcGFyc2UgYWxpYXNlZCByZXNpZGVuY3kgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDA5MTcpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMDkxOCIsICJJZiBmbGFncyBjb250YWlucyBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIG9yIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklULCBpdCBtdXN0IGFsc28gY29udGFpbiBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDA5MTgpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMTg4NyIsICJJZiB0aGUgcHJvdGVjdGVkIG1lbW9yeSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBmbGFncyBtdXN0IG5vdCBjb250YWluIFZLX0JVRkZFUl9DUkVBVEVfUFJPVEVDVEVEX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDE4ODcpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzMzOCIsICJJZiBmbGFncyBpbmNsdWRlcyBWS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIsIHRoZSBidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSBvciBWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUOjpidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMzMzgpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrQnVmZmVyQ3JlYXRlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1vcGFxdWVDYXB0dXJlQWRkcmVzcy0wMzMzNyIsICJJZiBWa0J1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzQ3JlYXRlSW5mb0tIUjo6b3BhcXVlQ2FwdHVyZUFkZHJlc3MgaXMgbm90IHplcm8sIGZsYWdzIG11c3QgaW5jbHVkZSBWS19CVUZGRVJfQ1JFQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLW9wYXF1ZUNhcHR1cmVBZGRyZXNzLTAzMzM3KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tcE5leHQtMDA5MjAiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8gc3RydWN0dXJlLCBpdHMgaGFuZGxlVHlwZXMgbWVtYmVyIG11c3Qgb25seSBjb250YWluIGJpdHMgdGhhdCBhcmUgYWxzbyBpbiBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllczo6ZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzLmNvbXBhdGlibGVIYW5kbGVUeXBlcywgYXMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcyB3aXRoIHBFeHRlcm5hbEJ1ZmZlckluZm8tPmhhbmRsZVR5cGUgZXF1YWwgdG8gYW55IG9uZSBvZiB0aGUgaGFuZGxlIHR5cGVzIHNwZWNpZmllZCBpbiBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXBOZXh0LTAwOTIwKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tcE5leHQtMDE1NzEiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSwgYW5kIHRoZSBkZWRpY2F0ZWRBbGxvY2F0aW9uIG1lbWJlciBvZiB0aGUgY2hhaW5lZCBzdHJ1Y3R1cmUgaXMgVktfVFJVRSwgdGhlbiBmbGFncyBtdXN0IG5vdCBpbmNsdWRlIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULCBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklULCBvciBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tcE5leHQtMDE1NzEpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJFYWNoIHBOZXh0IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0NyZWF0ZUluZm9FWFQsIFZrQnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NDcmVhdGVJbmZvS0hSLCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYsIG9yIFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsICJFYWNoIHNUeXBlIG1lbWJlciBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSB1bmlxdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAwOTEzIiwgIklmIHNoYXJpbmdNb2RlIGlzIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5ULCBwUXVldWVGYW1pbHlJbmRpY2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHF1ZXVlRmFtaWx5SW5kZXhDb3VudCB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAwOTEzKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDA5MTQiLCAiSWYgc2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHF1ZXVlRmFtaWx5SW5kZXhDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMDkxNCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxMzkxIiwgIklmIHNoYXJpbmdNb2RlIGlzIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5ULCBlYWNoIGVsZW1lbnQgb2YgcFF1ZXVlRmFtaWx5SW5kaWNlcyBtdXN0IGJlIHVuaXF1ZSBhbmQgbXVzdCBiZSBsZXNzIHRoYW4gcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIGZvciB0aGUgcGh5c2ljYWxEZXZpY2UgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMTM5MSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxNDE5IiwgIklmIHNoYXJpbmdNb2RlIGlzIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5ULCBlYWNoIGVsZW1lbnQgb2YgcFF1ZXVlRmFtaWx5SW5kaWNlcyBtdXN0IGJlIHVuaXF1ZSBhbmQgbXVzdCBiZSBsZXNzIHRoYW4gcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCByZXR1cm5lZCBieSBlaXRoZXIgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBvciB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiBmb3IgdGhlIHBoeXNpY2FsRGV2aWNlIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDE0MTkpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS1wYXJhbWV0ZXIiLCAic2hhcmluZ01vZGUgbXVzdCBiZSBhIHZhbGlkIFZrU2hhcmluZ01vZGUgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNpemUtMDA5MTIiLCAic2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaXplLTAwOTEyKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tdXNhZ2UtcGFyYW1ldGVyIiwgInVzYWdlIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0J1ZmZlclVzYWdlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby11c2FnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby11c2FnZS1yZXF1aXJlZGJpdG1hc2siLCAidXNhZ2UgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tdXNhZ2UtcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0NSRUFURV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSLWJ1ZmZlci0wMjYwMCIsICJJZiBidWZmZXIgaXMgbm9uLXNwYXJzZSBhbmQgd2FzIG5vdCBjcmVhdGVkIHdpdGggdGhlIFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUiBmbGFnLCB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSLWJ1ZmZlci0wMjYwMCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1idWZmZXItMDI2MDEiLCAiYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1idWZmZXItMDI2MDEpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMDIxNCIsICJXaGVuIGNvcHlpbmcgdG8gdGhlIGRlcHRoIGFzcGVjdCBvZiBhbiBpbWFnZSBzdWJyZXNvdXJjZSwgdGhlIGRhdGEgaW4gdGhlIHNvdXJjZSBidWZmZXIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMV0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMDIxNCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMTczNSIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIHNpbmdsZS1wbGFuZSwgJ180MjInIGltYWdlIGZvcm1hdCwgYnVmZmVyUm93TGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayB3aWR0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAxNzM1KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAxNzM2IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBWa0ltYWdlIHBhcmFtZXRlciBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIG9yIGEgc2luZ2xlLXBsYW5lLCAnXzQyMicgaW1hZ2UgZm9ybWF0LCBidWZmZXJJbWFnZUhlaWdodCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVySW1hZ2VDb3B5LU5vbmUtMDE3MzYpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LU5vbmUtMDE3MzciLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIFZrSW1hZ2UgcGFyYW1ldGVyIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgb3IgYSBzaW5nbGUtcGxhbmUsICdfNDIyJyBpbWFnZSBmb3JtYXQsIGFsbCBtZW1iZXJzIG9mIGltYWdlT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29ycmVzcG9uZGluZyBkaW1lbnNpb25zIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVySW1hZ2VDb3B5LU5vbmUtMDE3MzcpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LU5vbmUtMDE3MzgiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIFZrSW1hZ2UgcGFyYW1ldGVyIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgb3IgYSBzaW5nbGUtcGxhbmUsICdfNDIyJyBpbWFnZSBmb3JtYXQsIGJ1ZmZlck9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgc2l6ZSBpbiBieXRlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAxNzM4KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAxNzM5IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBWa0ltYWdlIHBhcmFtZXRlciBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIG9yIGEgc2luZ2xlLXBsYW5lLCAnXzQyMicgaW1hZ2UgZm9ybWF0LCBpbWFnZUV4dGVudC53aWR0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgd2lkdGggb3IgKGltYWdlRXh0ZW50LndpZHRoICsgaW1hZ2VPZmZzZXQueCkgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMTczOSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMTc0MCIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIHNpbmdsZS1wbGFuZSwgJ180MjInIGltYWdlIGZvcm1hdCwgaW1hZ2VFeHRlbnQuaGVpZ2h0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayBoZWlnaHQgb3IgKGltYWdlRXh0ZW50LmhlaWdodCArIGltYWdlT2Zmc2V0LnkpIG11c3QgZXF1YWwgdGhlIGltYWdlIHN1YnJlc291cmNlIGhlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAxNzQwKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1Ob25lLTAxNzQxIiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBWa0ltYWdlIHBhcmFtZXRlciBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIG9yIGEgc2luZ2xlLXBsYW5lLCAnXzQyMicgaW1hZ2UgZm9ybWF0LCBpbWFnZUV4dGVudC5kZXB0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgZGVwdGggb3IgKGltYWdlRXh0ZW50LmRlcHRoICsgaW1hZ2VPZmZzZXQueikgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktTm9uZS0wMTc0MSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYXNwZWN0TWFzay0wMDIxMSIsICJUaGUgYXNwZWN0TWFzayBtZW1iZXIgb2YgaW1hZ2VTdWJyZXNvdXJjZSBtdXN0IHNwZWNpZnkgYXNwZWN0cyBwcmVzZW50IGluIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBWa0ltYWdlIHBhcmFtZXRlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1hc3BlY3RNYXNrLTAwMjExKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1hc3BlY3RNYXNrLTAwMjEyIiwgIlRoZSBhc3BlY3RNYXNrIG1lbWJlciBvZiBpbWFnZVN1YnJlc291cmNlIG11c3Qgb25seSBoYXZlIGEgc2luZ2xlIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYXNwZWN0TWFzay0wMDIxMikifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYXNwZWN0TWFzay0wMTU2MCIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIncyBmb3JtYXQgaXMgYSBtdWx0aS1wbGFuYXIgZm9ybWF0LCB0aGVuIHRoZSBhc3BlY3RNYXNrIG1lbWJlciBvZiBpbWFnZVN1YnJlc291cmNlIG11c3QgYmUgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklULCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQsIG9yIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVCAod2l0aCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQgdmFsaWQgb25seSBmb3IgaW1hZ2UgZm9ybWF0cyB3aXRoIHRocmVlIHBsYW5lcykgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYXNwZWN0TWFzay0wMTU2MCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYmFzZUFycmF5TGF5ZXItMDAyMTMiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIFZrSW1hZ2UgcGFyYW1ldGVyIGlzIG9mIFZrSW1hZ2VUeXBlIFZLX0lNQUdFX1RZUEVfM0QsIHRoZSBiYXNlQXJyYXlMYXllciBhbmQgbGF5ZXJDb3VudCBtZW1iZXJzIG9mIGltYWdlU3VicmVzb3VyY2UgbXVzdCBiZSAwIGFuZCAxLCByZXNwZWN0aXZlbHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYmFzZUFycmF5TGF5ZXItMDAyMTMpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlckltYWdlSGVpZ2h0LTAwMTk2IiwgImJ1ZmZlckltYWdlSGVpZ2h0IG11c3QgYmUgMCwgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBoZWlnaHQgbWVtYmVyIG9mIGltYWdlRXh0ZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlckltYWdlSGVpZ2h0LTAwMTk2KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJJbWFnZUhlaWdodC0wMDIwNCIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBidWZmZXJJbWFnZUhlaWdodCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlckltYWdlSGVpZ2h0LTAwMjA0KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDAxOTMiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIFZrSW1hZ2UgcGFyYW1ldGVyJ3MgZm9ybWF0IGlzIG5vdCBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0LCB0aGVuIGJ1ZmZlck9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGZvcm1hdCdzIHRleGVsIGJsb2NrIHNpemUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlck9mZnNldC0wMDE5MykifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVyT2Zmc2V0LTAwMTk0IiwgImJ1ZmZlck9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDAxOTQpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlck9mZnNldC0wMDIwNiIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBidWZmZXJPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHNpemUgaW4gYnl0ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVyT2Zmc2V0LTAwMjA2KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDE1NTgiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIFZrSW1hZ2UgcGFyYW1ldGVyJ3MgZm9ybWF0IGlzIG5vdCBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IG9yIGEgbXVsdGktcGxhbmFyIGZvcm1hdCwgdGhlbiBidWZmZXJPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBmb3JtYXQncyB0ZXhlbCBibG9jayBzaXplLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDE1NTgpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlck9mZnNldC0wMTU1OSIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIncyBmb3JtYXQgaXMgYSBtdWx0aS1wbGFuYXIgZm9ybWF0LCB0aGVuIGJ1ZmZlck9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGVsZW1lbnQgc2l6ZSBvZiB0aGUgY29tcGF0aWJsZSBmb3JtYXQgZm9yIHRoZSBmb3JtYXQgYW5kIHRoZSBhc3BlY3RNYXNrIG9mIHRoZSBpbWFnZVN1YnJlc291cmNlIGFzIGRlZmluZWQgaW4gQ29tcGF0aWJsZSBmb3JtYXRzIG9mIHBsYW5lcyBvZiBtdWx0aS1wbGFuYXIgZm9ybWF0cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDE1NTkpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlclJvd0xlbmd0aC0wMDE5NSIsICJidWZmZXJSb3dMZW5ndGggbXVzdCBiZSAwLCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHdpZHRoIG1lbWJlciBvZiBpbWFnZUV4dGVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJSb3dMZW5ndGgtMDAxOTUpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlclJvd0xlbmd0aC0wMDIwMyIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBidWZmZXJSb3dMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHdpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlclJvd0xlbmd0aC0wMDIwMykifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VFeHRlbnQtMDAyMDciLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIFZrSW1hZ2UgcGFyYW1ldGVyIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgaW1hZ2VFeHRlbnQud2lkdGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHdpZHRoIG9yIChpbWFnZUV4dGVudC53aWR0aCArIGltYWdlT2Zmc2V0LngpIG11c3QgZXF1YWwgdGhlIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlRXh0ZW50LTAwMjA3KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZUV4dGVudC0wMDIwOCIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBpbWFnZUV4dGVudC5oZWlnaHQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIGhlaWdodCBvciAoaW1hZ2VFeHRlbnQuaGVpZ2h0ICsgaW1hZ2VPZmZzZXQueSkgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlRXh0ZW50LTAwMjA4KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZUV4dGVudC0wMDIwOSIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBpbWFnZUV4dGVudC5kZXB0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgZGVwdGggb3IgKGltYWdlRXh0ZW50LmRlcHRoICsgaW1hZ2VPZmZzZXQueikgbXVzdCBlcXVhbCB0aGUgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VFeHRlbnQtMDAyMDkpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMTk3IiwgImltYWdlT2Zmc2V0LnggYW5kIChpbWFnZUV4dGVudC53aWR0aCArIGltYWdlT2Zmc2V0LngpIG11c3QgYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSB3aWR0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDE5NykifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAxOTgiLCAiaW1hZ2VPZmZzZXQueSBhbmQgKGltYWdlRXh0ZW50LmhlaWdodCArIGltYWdlT2Zmc2V0LnkpIG11c3QgYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAxOTgpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMjAwIiwgImltYWdlT2Zmc2V0LnogYW5kIChpbWFnZUV4dGVudC5kZXB0aCArIGltYWdlT2Zmc2V0LnopIG11c3QgYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSBkZXB0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDIwMCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAyMDUiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIFZrSW1hZ2UgcGFyYW1ldGVyIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgYWxsIG1lbWJlcnMgb2YgaW1hZ2VPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGRpbWVuc2lvbnMgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAyMDUpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlU3VicmVzb3VyY2UtcGFyYW1ldGVyIiwgImltYWdlU3VicmVzb3VyY2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VTdWJyZXNvdXJjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTk5IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBzcmNJbWFnZSAodmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcikgb3IgZHN0SW1hZ2UgKHZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UpIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCwgdGhlbiBpbWFnZU9mZnNldC55IG11c3QgYmUgMCBhbmQgaW1hZ2VFeHRlbnQuaGVpZ2h0IG11c3QgYmUgMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktc3JjSW1hZ2UtMDAxOTkpIn0sCisgICAgeyJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LXNyY0ltYWdlLTAwMjAxIiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBzcmNJbWFnZSAodmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcikgb3IgZHN0SW1hZ2UgKHZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UpIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCBvciBWS19JTUFHRV9UWVBFXzJELCB0aGVuIGltYWdlT2Zmc2V0LnogbXVzdCBiZSAwIGFuZCBpbWFnZUV4dGVudC5kZXB0aCBtdXN0IGJlIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJJbWFnZUNvcHktc3JjSW1hZ2UtMDAyMDEpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTAiLCAiSWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHNyY1F1ZXVlRmFtaWx5SW5kZXggYW5kIGRzdFF1ZXVlRmFtaWx5SW5kZXggbXVzdCBib3RoIGJlIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTApIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTEiLCAiSWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIGF0IGxlYXN0IG9uZSBvZiBzcmNRdWV1ZUZhbWlseUluZGV4IGFuZCBkc3RRdWV1ZUZhbWlseUluZGV4IG11c3QgYmUgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MiIsICJJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCBhIHNoYXJpbmcgbW9kZSBvZiBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLCBzcmNRdWV1ZUZhbWlseUluZGV4IGFuZCBkc3RRdWV1ZUZhbWlseUluZGV4IG11c3QgZWl0aGVyIGJvdGggYmUgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIG9yIGJvdGggYmUgYSB2YWxpZCBxdWV1ZSBmYW1pbHkgKHNlZSBRdWV1ZSBGYW1pbHkgUHJvcGVydGllcykgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MikifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MyIsICJJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCBhIHNoYXJpbmcgbW9kZSBvZiBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFIGFuZCBzcmNRdWV1ZUZhbWlseUluZGV4IGlzIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELCBkc3RRdWV1ZUZhbWlseUluZGV4IG11c3QgYWxzbyBiZSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTkzKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTk2IiwgIklmIGJ1ZmZlciB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsIGFuZCBzcmNRdWV1ZUZhbWlseUluZGV4IGFuZCBkc3RRdWV1ZUZhbWlseUluZGV4IGFyZSBub3QgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIGF0IGxlYXN0IG9uZSBvZiB0aGVtIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGZhbWlseSBvZiB0aGUgcXVldWUgdGhhdCB3aWxsIGV4ZWN1dGUgdGhpcyBiYXJyaWVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTYpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjMiLCAiSWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIGFuZCBvbmUgb2Ygc3JjUXVldWVGYW1pbHlJbmRleCBhbmQgZHN0UXVldWVGYW1pbHlJbmRleCBpcyBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwgdGhlIG90aGVyIG11c3QgYmUgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQgb3IgYSBzcGVjaWFsIHF1ZXVlIGZhbWlseSByZXNlcnZlZCBmb3IgZXh0ZXJuYWwgbWVtb3J5IG93bmVyc2hpcCB0cmFuc2ZlcnMsIGFzIGRlc2NyaWJlZCBpbiBRdWV1ZSBGYW1pbHkgT3duZXJzaGlwIFRyYW5zZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzYzKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzY0IiwgIklmIGJ1ZmZlciB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUgYW5kIHNyY1F1ZXVlRmFtaWx5SW5kZXggaXMgbm90IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELCBpdCBtdXN0IGJlIGEgdmFsaWQgcXVldWUgZmFtaWx5IG9yIGEgc3BlY2lhbCBxdWV1ZSBmYW1pbHkgcmVzZXJ2ZWQgZm9yIGV4dGVybmFsIG1lbW9yeSB0cmFuc2ZlcnMsIGFzIGRlc2NyaWJlZCBpbiBRdWV1ZSBGYW1pbHkgT3duZXJzaGlwIFRyYW5zZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzY0KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzY1IiwgIklmIGJ1ZmZlciB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUgYW5kIGRzdFF1ZXVlRmFtaWx5SW5kZXggaXMgbm90IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELCBpdCBtdXN0IGJlIGEgdmFsaWQgcXVldWUgZmFtaWx5IG9yIGEgc3BlY2lhbCBxdWV1ZSBmYW1pbHkgcmVzZXJ2ZWQgZm9yIGV4dGVybmFsIG1lbW9yeSB0cmFuc2ZlcnMsIGFzIGRlc2NyaWJlZCBpbiBRdWV1ZSBGYW1pbHkgT3duZXJzaGlwIFRyYW5zZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzY1KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxOTMxIiwgIklmIGJ1ZmZlciBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE5MzEpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItcGFyYW1ldGVyIiwgImJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItb2Zmc2V0LTAxMTg3IiwgIm9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLW9mZnNldC0wMTE4NykifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1zaXplLTAxMTg4IiwgIklmIHNpemUgaXMgbm90IGVxdWFsIHRvIFZLX1dIT0xFX1NJWkUsIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItc2l6ZS0wMTE4OCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLXNpemUtMDExODkiLCAiSWYgc2l6ZSBpcyBub3QgZXF1YWwgdG8gVktfV0hPTEVfU0laRSwgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGFuIHRoZSBzaXplIG9mIGJ1ZmZlciBtaW51cyBvZmZzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLXNpemUtMDExODkpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19DUkVBVEVfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAwOTMyIiwgImJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBvZiBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUIG9yIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItMDA5MzIpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAwOTMzIiwgIklmIGJ1ZmZlciB3YXMgY3JlYXRlZCB3aXRoIHVzYWdlIGNvbnRhaW5pbmcgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCwgZm9ybWF0IG11c3QgYmUgc3VwcG9ydGVkIGZvciB1bmlmb3JtIHRleGVsIGJ1ZmZlcnMsIGFzIHNwZWNpZmllZCBieSB0aGUgVktfRk9STUFUX0ZFQVRVUkVfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUIGZsYWcgaW4gVmtGb3JtYXRQcm9wZXJ0aWVzOjpidWZmZXJGZWF0dXJlcyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMDkzMykifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItMDA5MzQiLCAiSWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggdXNhZ2UgY29udGFpbmluZyBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklULCBmb3JtYXQgbXVzdCBiZSBzdXBwb3J0ZWQgZm9yIHN0b3JhZ2UgdGV4ZWwgYnVmZmVycywgYXMgc3BlY2lmaWVkIGJ5IHRoZSBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQgZmxhZyBpbiBWa0Zvcm1hdFByb3BlcnRpZXM6OmJ1ZmZlckZlYXR1cmVzIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAwOTM0KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMDkzNSIsICJJZiBidWZmZXIgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMDkzNSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItMDI3NTAiLCAiSWYgdGhlIHRleGVsQnVmZmVyQWxpZ25tZW50IGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgaWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggdXNhZ2UgY29udGFpbmluZyBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklULCBvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBsZXNzZXIgb2YgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDo6c3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgb3IsIGlmIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ6OnN0b3JhZ2VUZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50IGlzIFZLX1RSVUUsIHRoZSBzaXplIG9mIGEgdGV4ZWwgb2YgdGhlIHJlcXVlc3RlZCBmb3JtYXQuIElmIHRoZSBzaXplIG9mIGEgdGV4ZWwgaXMgYSBtdWx0aXBsZSBvZiB0aHJlZSBieXRlcywgdGhlbiB0aGUgc2l6ZSBvZiBhIHNpbmdsZSBjb21wb25lbnQgb2YgZm9ybWF0IGlzIHVzZWQgaW5zdGVhZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMjc1MCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItMDI3NTEiLCAiSWYgdGhlIHRleGVsQnVmZmVyQWxpZ25tZW50IGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgaWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggdXNhZ2UgY29udGFpbmluZyBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklULCBvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBsZXNzZXIgb2YgVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50UHJvcGVydGllc0VYVDo6dW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgb3IsIGlmIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQ6OnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50IGlzIFZLX1RSVUUsIHRoZSBzaXplIG9mIGEgdGV4ZWwgb2YgdGhlIHJlcXVlc3RlZCBmb3JtYXQuIElmIHRoZSBzaXplIG9mIGEgdGV4ZWwgaXMgYSBtdWx0aXBsZSBvZiB0aHJlZSBieXRlcywgdGhlbiB0aGUgc2l6ZSBvZiBhIHNpbmdsZSBjb21wb25lbnQgb2YgZm9ybWF0IGlzIHVzZWQgaW5zdGVhZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMjc1MSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItcGFyYW1ldGVyIiwgImJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyIiwgImZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLW9mZnNldC0wMDkyNSIsICJvZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tb2Zmc2V0LTAwOTI1KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLW9mZnNldC0wMDkyNiIsICJvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tb2Zmc2V0LTAwOTI2KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLW9mZnNldC0wMDkzMSIsICJJZiByYW5nZSBpcyBub3QgZXF1YWwgdG8gVktfV0hPTEVfU0laRSwgdGhlIHN1bSBvZiBvZmZzZXQgYW5kIHJhbmdlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLW9mZnNldC0wMDkzMSkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1vZmZzZXQtMDI3NDkiLCAiSWYgdGhlIHRleGVsQnVmZmVyQWxpZ25tZW50IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIG9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1vZmZzZXQtMDI3NDkpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tcmFuZ2UtMDA5MjgiLCAiSWYgcmFuZ2UgaXMgbm90IGVxdWFsIHRvIFZLX1dIT0xFX1NJWkUsIHJhbmdlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1yYW5nZS0wMDkyOCkifSwKKyAgICB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1yYW5nZS0wMDkyOSIsICJJZiByYW5nZSBpcyBub3QgZXF1YWwgdG8gVktfV0hPTEVfU0laRSwgcmFuZ2UgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSB0ZXhlbCBibG9jayBzaXplIG9mIGZvcm1hdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLXJhbmdlLTAwOTI5KSJ9LAorICAgIHsiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLXJhbmdlLTAwOTMwIiwgIklmIHJhbmdlIGlzIG5vdCBlcXVhbCB0byBWS19XSE9MRV9TSVpFLCByYW5nZSBkaXZpZGVkIGJ5IHRoZSB0ZXhlbCBibG9jayBzaXplIG9mIGZvcm1hdCwgbXVsdGlwbGllZCBieSB0aGUgbnVtYmVyIG9mIHRleGVscyBwZXIgdGV4ZWwgYmxvY2sgZm9yIHRoYXQgZm9ybWF0IChhcyBkZWZpbmVkIGluIHRoZSBDb21wYXRpYmxlIEZvcm1hdHMgdGFibGUpLCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXhlbEJ1ZmZlckVsZW1lbnRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tcmFuZ2UtMDA5MzApIn0sCisgICAgeyJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQ0FMSUJSQVRFRF9USU1FU1RBTVBfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtDYWxpYnJhdGVkVGltZXN0YW1wSW5mb0VYVC10aW1lRG9tYWluLTAyMzU0IiwgInRpbWVEb21haW4gbXVzdCBiZSBvbmUgb2YgdGhlIFZrVGltZURvbWFpbkVYVCB2YWx1ZXMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhULXRpbWVEb21haW4tMDIzNTQpIn0sCisgICAgeyJWVUlELVZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQtdGltZURvbWFpbi1wYXJhbWV0ZXIiLCAidGltZURvbWFpbiBtdXN0IGJlIGEgdmFsaWQgVmtUaW1lRG9tYWluRVhUIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ2FsaWJyYXRlZFRpbWVzdGFtcEluZm9FWFQtdGltZURvbWFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ2hlY2twb2ludERhdGFOVi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDaGVja3BvaW50RGF0YU5WLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0NoZWNrcG9pbnREYXRhTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9DSEVDS1BPSU5UX0RBVEFfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDaGVja3BvaW50RGF0YU5WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0NsZWFyQXR0YWNobWVudC1hc3BlY3RNYXNrLTAwMDE5IiwgIklmIGFzcGVjdE1hc2sgaW5jbHVkZXMgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgaXQgbXVzdCBub3QgaW5jbHVkZSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIG9yIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NsZWFyQXR0YWNobWVudC1hc3BlY3RNYXNrLTAwMDE5KSJ9LAorICAgIHsiVlVJRC1Wa0NsZWFyQXR0YWNobWVudC1hc3BlY3RNYXNrLTAwMDIwIiwgImFzcGVjdE1hc2sgbXVzdCBub3QgaW5jbHVkZSBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ2xlYXJBdHRhY2htZW50LWFzcGVjdE1hc2stMDAwMjApIn0sCisgICAgeyJWVUlELVZrQ2xlYXJBdHRhY2htZW50LWFzcGVjdE1hc2stMDIyNDYiLCAiYXNwZWN0TWFzayBtdXN0IG5vdCBpbmNsdWRlIFZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfaV9CSVRfRVhUIGZvciBhbnkgaW5kZXggaS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbGVhckF0dGFjaG1lbnQtYXNwZWN0TWFzay0wMjI0NikifSwKKyAgICB7IlZVSUQtVmtDbGVhckF0dGFjaG1lbnQtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLCAiYXNwZWN0TWFzayBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtJbWFnZUFzcGVjdEZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NsZWFyQXR0YWNobWVudC1hc3BlY3RNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDbGVhckF0dGFjaG1lbnQtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2siLCAiYXNwZWN0TWFzayBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ2xlYXJBdHRhY2htZW50LWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa0NsZWFyQXR0YWNobWVudC1jbGVhclZhbHVlLTAwMDIxIiwgImNsZWFyVmFsdWUgbXVzdCBiZSBhIHZhbGlkIFZrQ2xlYXJWYWx1ZSB1bmlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NsZWFyQXR0YWNobWVudC1jbGVhclZhbHVlLTAwMDIxKSJ9LAorICAgIHsiVlVJRC1Wa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUtZGVwdGgtMDAwMjIiLCAiVW5sZXNzIHRoZSBWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkIGV4dGVuc2lvbiBpcyBlbmFibGVkIGRlcHRoIG11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZS1kZXB0aC0wMDAyMikifSwKKyAgICB7IlZVSUQtVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlLWRlcHRoLTAyNTA2IiwgImRlcHRoIG11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZS1kZXB0aC0wMjUwNikifSwKKyAgICB7IlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLWNvbW1vbnBhcmVudCIsICJFYWNoIG9mIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQsIG9iamVjdFRhYmxlLCBzZXF1ZW5jZXNDb3VudEJ1ZmZlciwgc2VxdWVuY2VzSW5kZXhCdWZmZXIsIGFuZCB0YXJnZXRDb21tYW5kQnVmZmVyIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1pbmRpcmVjdENvbW1hbmRzTGF5b3V0LXBhcmFtZXRlciIsICJpbmRpcmVjdENvbW1hbmRzTGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1pbmRpcmVjdENvbW1hbmRzTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLWluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50LTAxMzMyIiwgImluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50IG11c3QgbWF0Y2ggdGhlIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQncyB0b2tlbkNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1pbmRpcmVjdENvbW1hbmRzVG9rZW5Db3VudC0wMTMzMikifSwKKyAgICB7IlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLWluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50LWFycmF5bGVuZ3RoIiwgImluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLWluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtb2JqZWN0VGFibGUtMDEzMzEiLCAiVGhlIHByb3ZpZGVkIG9iamVjdFRhYmxlIG11c3QgaW5jbHVkZSBhbGwgb2JqZWN0cyByZWZlcmVuY2VkIGJ5IHRoZSBnZW5lcmF0aW9uIHByb2Nlc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLW9iamVjdFRhYmxlLTAxMzMxKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyIiwgIm9iamVjdFRhYmxlIG11c3QgYmUgYSB2YWxpZCBWa09iamVjdFRhYmxlTlZYIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtcEluZGlyZWN0Q29tbWFuZHNUb2tlbnMtcGFyYW1ldGVyIiwgInBJbmRpcmVjdENvbW1hbmRzVG9rZW5zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGluZGlyZWN0Q29tbWFuZHNUb2tlbkNvdW50IHZhbGlkIFZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXBJbmRpcmVjdENvbW1hbmRzVG9rZW5zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0NNRF9QUk9DRVNTX0NPTU1BTkRTX0lORk9fTlZYIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXNlcXVlbmNlc0NvdW50QnVmZmVyLTAxMzM4IiwgIklmIHNlcXVlbmNlc0NvdW50QnVmZmVyIGlzIHVzZWQsIGl0cyB1c2FnZSBmbGFnIG11c3QgaGF2ZSB0aGUgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtc2VxdWVuY2VzQ291bnRCdWZmZXItMDEzMzgpIn0sCisgICAgeyJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zZXF1ZW5jZXNDb3VudEJ1ZmZlci0wMTMzOSIsICJJZiBzZXF1ZW5jZXNDb3VudEJ1ZmZlciBpcyB1c2VkLCBzZXF1ZW5jZXNDb3VudE9mZnNldCBtdXN0IGJlIGFsaWduZWQgdG8gVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWDo6bWluU2VxdWVuY2VDb3VudEJ1ZmZlck9mZnNldEFsaWdubWVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtc2VxdWVuY2VzQ291bnRCdWZmZXItMDEzMzkpIn0sCisgICAgeyJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zZXF1ZW5jZXNDb3VudEJ1ZmZlci1wYXJhbWV0ZXIiLCAiSWYgc2VxdWVuY2VzQ291bnRCdWZmZXIgaXMgbm90IFZLX05VTExfSEFORExFLCBzZXF1ZW5jZXNDb3VudEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zZXF1ZW5jZXNDb3VudEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC1zZXF1ZW5jZXNJbmRleEJ1ZmZlci0wMTM0MCIsICJJZiBzZXF1ZW5jZXNJbmRleEJ1ZmZlciBpcyB1c2VkLCBpdHMgdXNhZ2UgZmxhZyBtdXN0IGhhdmUgdGhlIFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXNlcXVlbmNlc0luZGV4QnVmZmVyLTAxMzQwKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtc2VxdWVuY2VzSW5kZXhCdWZmZXItMDEzNDEiLCAiSWYgc2VxdWVuY2VzSW5kZXhCdWZmZXIgaXMgdXNlZCwgc2VxdWVuY2VzSW5kZXhPZmZzZXQgbXVzdCBiZSBhbGlnbmVkIHRvIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlg6Om1pblNlcXVlbmNlSW5kZXhCdWZmZXJPZmZzZXRBbGlnbm1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXNlcXVlbmNlc0luZGV4QnVmZmVyLTAxMzQxKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtc2VxdWVuY2VzSW5kZXhCdWZmZXItcGFyYW1ldGVyIiwgIklmIHNlcXVlbmNlc0luZGV4QnVmZmVyIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgc2VxdWVuY2VzSW5kZXhCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtc2VxdWVuY2VzSW5kZXhCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtdGFyZ2V0Q29tbWFuZEJ1ZmZlci0wMTMzNCIsICJJZiB0YXJnZXRDb21tYW5kQnVmZmVyIGlzIHByb3ZpZGVkLCBpdCBtdXN0IGhhdmUgcmVzZXJ2ZWQgY29tbWFuZCBzcGFjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtdGFyZ2V0Q29tbWFuZEJ1ZmZlci0wMTMzNCkifSwKKyAgICB7IlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXRhcmdldENvbW1hbmRCdWZmZXItMDEzMzUiLCAiSWYgdGFyZ2V0Q29tbWFuZEJ1ZmZlciBpcyBwcm92aWRlZCwgdGhlIG9iamVjdFRhYmxlIG11c3QgbWF0Y2ggdGhlIHJlc2VydmF0aW9uJ3Mgb2JqZWN0VGFibGUgYW5kIG11c3QgaGF2ZSBoYWQgYWxsIHJlZmVyZW5jZWQgb2JqZWN0cyByZWdpc3RlcmVkIGF0IHJlc2VydmF0aW9uIHRpbWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXRhcmdldENvbW1hbmRCdWZmZXItMDEzMzUpIn0sCisgICAgeyJWVUlELVZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWC10YXJnZXRDb21tYW5kQnVmZmVyLTAxMzM2IiwgIklmIHRhcmdldENvbW1hbmRCdWZmZXIgaXMgcHJvdmlkZWQsIHRoZSBpbmRpcmVjdENvbW1hbmRzTGF5b3V0IG11c3QgbWF0Y2ggdGhlIHJlc2VydmF0aW9uJ3MgaW5kaXJlY3RDb21tYW5kc0xheW91dCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtdGFyZ2V0Q29tbWFuZEJ1ZmZlci0wMTMzNikifSwKKyAgICB7IlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXRhcmdldENvbW1hbmRCdWZmZXItMDEzMzciLCAiSWYgdGFyZ2V0Q29tbWFuZEJ1ZmZlciBpcyBwcm92aWRlZCwgdGhlIG1heFNlcXVlbmNlc0NvdW50IG11c3Qgbm90IGV4Y2VlZCB0aGUgcmVzZXJ2YXRpb24ncyBtYXhTZXF1ZW5jZXNDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtdGFyZ2V0Q29tbWFuZEJ1ZmZlci0wMTMzNykifSwKKyAgICB7IlZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXRhcmdldENvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgIklmIHRhcmdldENvbW1hbmRCdWZmZXIgaXMgbm90IE5VTEwsIHRhcmdldENvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRQcm9jZXNzQ29tbWFuZHNJbmZvTlZYLXRhcmdldENvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtdG9rZW5UeXBlLTAxMzMzIiwgIlRoZSB0b2tlblR5cGUgbWVtYmVyIG9mIGVhY2ggZW50cnkgaW4gdGhlIHBJbmRpcmVjdENvbW1hbmRzVG9rZW5zIGFycmF5IG11c3QgbWF0Y2ggdGhlIHZhbHVlcyB1c2VkIGF0IGNyZWF0aW9uIHRpbWUgb2YgaW5kaXJlY3RDb21tYW5kc0xheW91dCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFByb2Nlc3NDb21tYW5kc0luZm9OVlgtdG9rZW5UeXBlLTAxMzMzKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBpbmRpcmVjdENvbW1hbmRzTGF5b3V0LCBhbmQgb2JqZWN0VGFibGUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELVZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYLWluZGlyZWN0Q29tbWFuZHNMYXlvdXQtcGFyYW1ldGVyIiwgImluZGlyZWN0Q29tbWFuZHNMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgtaW5kaXJlY3RDb21tYW5kc0xheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYLW9iamVjdFRhYmxlLXBhcmFtZXRlciIsICJvYmplY3RUYWJsZSBtdXN0IGJlIGEgdmFsaWQgVmtPYmplY3RUYWJsZU5WWCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzSW5mb05WWC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlgtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQ01EX1JFU0VSVkVfU1BBQ0VfRk9SX0NPTU1BTkRTX0lORk9fTlZYIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNJbmZvTlZYLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYtcGl4ZWxYLTAyMDc4IiwgInBpeGVsWCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYWdtZW50LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYtcGl4ZWxYLTAyMDc4KSJ9LAorICAgIHsiVlVJRC1Wa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYtcGl4ZWxZLTAyMDc5IiwgInBpeGVsWSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgaGVpZ2h0IChpbiBwaXhlbHMpIG9mIHRoZSBmcmFnbWVudC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WLXBpeGVsWS0wMjA3OSkifSwKKyAgICB7IlZVSUQtVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WLXNhbXBsZS0wMjA4MCIsICJzYW1wbGUgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBjb3ZlcmFnZSBzYW1wbGVzIGluIGVhY2ggcGl4ZWwgYmVsb25naW5nIHRvIHRoZSBmcmFnbWVudC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WLXNhbXBsZS0wMjA4MCkifSwKKyAgICB7IlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXBTYW1wbGVMb2NhdGlvbnMtMDIwNzciLCAiVGhlIGFycmF5IHBTYW1wbGVMb2NhdGlvbnMgbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGVudHJ5IGZvciBldmVyeSBjb21iaW5hdGlvbiBvZiB2YWxpZCB2YWx1ZXMgZm9yIHBpeGVsWCwgcGl4ZWxZLCBhbmQgc2FtcGxlIGluIHRoZSBzdHJ1Y3R1cmUgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtcFNhbXBsZUxvY2F0aW9ucy0wMjA3NykifSwKKyAgICB7IlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXBTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIiwgInBTYW1wbGVMb2NhdGlvbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc2FtcGxlTG9jYXRpb25Db3VudCBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtcFNhbXBsZUxvY2F0aW9ucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zYW1wbGVDb3VudC0wMjA3NCIsICJzYW1wbGVDb3VudCBtdXN0IGNvcnJlc3BvbmQgdG8gYSBzYW1wbGUgY291bnQgZW51bWVyYXRlZCBpbiBWa1NhbXBsZUNvdW50RmxhZ3Mgd2hvc2UgY29ycmVzcG9uZGluZyBiaXQgaXMgc2V0IGluIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6OmZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50cy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUNvdW50LTAyMDc0KSJ9LAorICAgIHsiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2FtcGxlTG9jYXRpb25Db3VudC0wMjA3NSIsICJzYW1wbGVMb2NhdGlvbkNvdW50IG11c3QgYmUgZXF1YWwgdG8gdGhlIHByb2R1Y3Qgb2Ygc2FtcGxlQ291bnQsIHRoZSBmcmFnbWVudCB3aWR0aCBmb3Igc2hhZGluZ1JhdGUsIGFuZCB0aGUgZnJhZ21lbnQgaGVpZ2h0IGZvciBzaGFkaW5nUmF0ZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUxvY2F0aW9uQ291bnQtMDIwNzUpIn0sCisgICAgeyJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zYW1wbGVMb2NhdGlvbkNvdW50LTAyMDc2IiwgInNhbXBsZUxvY2F0aW9uQ291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WOjpzaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zYW1wbGVMb2NhdGlvbkNvdW50LTAyMDc2KSJ9LAorICAgIHsiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2FtcGxlTG9jYXRpb25Db3VudC1hcnJheWxlbmd0aCIsICJzYW1wbGVMb2NhdGlvbkNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUxvY2F0aW9uQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zaGFkaW5nUmF0ZS0wMjA3MyIsICJzaGFkaW5nUmF0ZSBtdXN0IGJlIGEgc2hhZGluZyByYXRlIHRoYXQgZ2VuZXJhdGVzIGZyYWdtZW50cyB3aXRoIG1vcmUgdGhhbiBvbmUgcGl4ZWwuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zaGFkaW5nUmF0ZS0wMjA3MykifSwKKyAgICB7IlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNoYWRpbmdSYXRlLXBhcmFtZXRlciIsICJzaGFkaW5nUmF0ZSBtdXN0IGJlIGEgdmFsaWQgVmtTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeU5WIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1zaGFkaW5nUmF0ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mby1jb21tYW5kQnVmZmVyQ291bnQtMDAwNDQiLCAiY29tbWFuZEJ1ZmZlckNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLWNvbW1hbmRCdWZmZXJDb3VudC0wMDA0NCkifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLWNvbW1hbmRQb29sLXBhcmFtZXRlciIsICJjb21tYW5kUG9vbCBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kUG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLWNvbW1hbmRQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLWxldmVsLXBhcmFtZXRlciIsICJsZXZlbCBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyTGV2ZWwgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLWxldmVsLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tZmxhZ3MtMDAwNTMiLCAiSWYgZmxhZ3MgY29udGFpbnMgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklULCB0aGUgcmVuZGVyUGFzcyBtZW1iZXIgb2YgcEluaGVyaXRhbmNlSW5mbyBtdXN0IGJlIGEgdmFsaWQgVmtSZW5kZXJQYXNzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1mbGFncy0wMDA1MykifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWZsYWdzLTAwMDU0IiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCwgdGhlIHN1YnBhc3MgbWVtYmVyIG9mIHBJbmhlcml0YW5jZUluZm8gbXVzdCBiZSBhIHZhbGlkIHN1YnBhc3MgaW5kZXggd2l0aGluIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiBwSW5oZXJpdGFuY2VJbmZvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1mbGFncy0wMDA1NCkifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWZsYWdzLTAwMDU1IiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCwgdGhlIGZyYW1lYnVmZmVyIG1lbWJlciBvZiBwSW5oZXJpdGFuY2VJbmZvIG11c3QgYmUgZWl0aGVyIFZLX05VTExfSEFORExFLCBvciBhIHZhbGlkIFZrRnJhbWVidWZmZXIgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHBJbmhlcml0YW5jZUluZm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWZsYWdzLTAwMDU1KSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0NvbW1hbmRCdWZmZXJVc2FnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhULWNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlLTAxOTc3IiwgIklmIHRoZSBpbmhlcml0ZWQgY29uZGl0aW9uYWwgcmVuZGVyaW5nIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlIG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQtY29uZGl0aW9uYWxSZW5kZXJpbmdFbmFibGUtMDE5NzcpIn0sCisgICAgeyJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZnJhbWVidWZmZXIsIGFuZCByZW5kZXJQYXNzIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1vY2NsdXNpb25RdWVyeUVuYWJsZS0wMDA1NiIsICJJZiB0aGUgaW5oZXJpdGVkIHF1ZXJpZXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgb2NjbHVzaW9uUXVlcnlFbmFibGUgbXVzdCBiZSBWS19GQUxTRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tb2NjbHVzaW9uUXVlcnlFbmFibGUtMDAwNTYpIn0sCisgICAgeyJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcGlwZWxpbmVTdGF0aXN0aWNzLTAwMDU4IiwgIklmIHRoZSBwaXBlbGluZSBzdGF0aXN0aWNzIHF1ZXJpZXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgcGlwZWxpbmVTdGF0aXN0aWNzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcGlwZWxpbmVTdGF0aXN0aWNzLTAwMDU4KSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcGlwZWxpbmVTdGF0aXN0aWNzLTAyNzg5IiwgIklmIHRoZSBwaXBlbGluZSBzdGF0aXN0aWNzIHF1ZXJpZXMgZmVhdHVyZSBpcyBlbmFibGVkLCBwaXBlbGluZVN0YXRpc3RpY3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcGlwZWxpbmVTdGF0aXN0aWNzLTAyNzg5KSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcXVlcnlGbGFncy0wMDA1NyIsICJJZiB0aGUgaW5oZXJpdGVkIHF1ZXJpZXMgZmVhdHVyZSBpcyBlbmFibGVkLCBxdWVyeUZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1F1ZXJ5Q29udHJvbEZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcXVlcnlGbGFncy0wMDA1NykifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvLXF1ZXJ5RmxhZ3MtMDI3ODgiLCAiSWYgdGhlIGluaGVyaXRlZCBxdWVyaWVzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHF1ZXJ5RmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1xdWVyeUZsYWdzLTAyNzg4KSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kUG9vbENyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDb21tYW5kUG9vbENyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbW1hbmRQb29sQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLWEtcGFyYW1ldGVyIiwgImEgbXVzdCBiZSBhIHZhbGlkIFZrQ29tcG9uZW50U3dpenpsZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbXBvbmVudE1hcHBpbmctYS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ29tcG9uZW50TWFwcGluZy1iLXBhcmFtZXRlciIsICJiIG11c3QgYmUgYSB2YWxpZCBWa0NvbXBvbmVudFN3aXp6bGUgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21wb25lbnRNYXBwaW5nLWItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NvbXBvbmVudE1hcHBpbmctZy1wYXJhbWV0ZXIiLCAiZyBtdXN0IGJlIGEgdmFsaWQgVmtDb21wb25lbnRTd2l6emxlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tcG9uZW50TWFwcGluZy1nLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDb21wb25lbnRNYXBwaW5nLXItcGFyYW1ldGVyIiwgInIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tcG9uZW50U3dpenpsZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbXBvbmVudE1hcHBpbmctci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBiYXNlUGlwZWxpbmVIYW5kbGUsIGFuZCBsYXlvdXQgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNjk3IiwgIklmIGZsYWdzIGNvbnRhaW5zIHRoZSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgZmxhZywgYW5kIGJhc2VQaXBlbGluZUluZGV4IGlzIC0xLCBiYXNlUGlwZWxpbmVIYW5kbGUgbXVzdCBiZSBhIHZhbGlkIGhhbmRsZSB0byBhIGNvbXB1dGUgVmtQaXBlbGluZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA2OTcpIn0sCisgICAgeyJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDY5OCIsICJJZiBmbGFncyBjb250YWlucyB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGZsYWcsIGFuZCBiYXNlUGlwZWxpbmVIYW5kbGUgaXMgVktfTlVMTF9IQU5ETEUsIGJhc2VQaXBlbGluZUluZGV4IG11c3QgYmUgYSB2YWxpZCBpbmRleCBpbnRvIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBwQ3JlYXRlSW5mb3MgcGFyYW1ldGVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDY5OCkifSwKKyAgICB7IlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNjk5IiwgIklmIGZsYWdzIGNvbnRhaW5zIHRoZSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgZmxhZywgYW5kIGJhc2VQaXBlbGluZUluZGV4IGlzIG5vdCAtMSwgYmFzZVBpcGVsaW5lSGFuZGxlIG11c3QgYmUgVktfTlVMTF9IQU5ETEUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNjk5KSJ9LAorICAgIHsiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3MDAiLCAiSWYgZmxhZ3MgY29udGFpbnMgdGhlIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCBmbGFnLCBhbmQgYmFzZVBpcGVsaW5lSGFuZGxlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgYmFzZVBpcGVsaW5lSW5kZXggbXVzdCBiZSAtMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3MDApIn0sCisgICAgeyJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWxheW91dC0wMDcwMyIsICJsYXlvdXQgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGxheW91dCBvZiB0aGUgY29tcHV0ZSBzaGFkZXIgc3BlY2lmaWVkIGluIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1sYXlvdXQtMDA3MDMpIn0sCisgICAgeyJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1sYXlvdXQtMDE2ODciLCAiVGhlIG51bWJlciBvZiByZXNvdXJjZXMgaW4gbGF5b3V0IGFjY2Vzc2libGUgdG8gdGhlIGNvbXB1dGUgc2hhZGVyIHN0YWdlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFBlclN0YWdlUmVzb3VyY2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1sYXlvdXQtMDE2ODcpIn0sCisgICAgeyJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1sYXlvdXQtcGFyYW1ldGVyIiwgImxheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZUxheW91dCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLWxheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJFYWNoIHBOZXh0IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1EIG9yIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MDEiLCAiVGhlIHN0YWdlIG1lbWJlciBvZiBzdGFnZSBtdXN0IGJlIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MDEpIn0sCisgICAgeyJWVUlELVZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMDcwMiIsICJUaGUgc2hhZGVyIGNvZGUgZm9yIHRoZSBlbnRyeSBwb2ludCBpZGVudGlmaWVkIGJ5IHN0YWdlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RhdGUgaWRlbnRpZmllZCBieSB0aGlzIHN0cnVjdHVyZSBtdXN0IGFkaGVyZSB0byB0aGUgcGlwZWxpbmUgbGlua2luZyBydWxlcyBkZXNjcmliZWQgaW4gdGhlIFNoYWRlciBJbnRlcmZhY2VzIGNoYXB0ZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvLXN0YWdlLTAwNzAyKSJ9LAorICAgIHsiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2UtcGFyYW1ldGVyIiwgInN0YWdlIG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULWJ1ZmZlci0wMTk4MSIsICJJZiBidWZmZXIgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULWJ1ZmZlci0wMTk4MSkifSwKKyAgICB7IlZVSUQtVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVC1idWZmZXItMDE5ODIiLCAiYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CSVRfRVhUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVC1idWZmZXItMDE5ODIpIn0sCisgICAgeyJWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nRmxhZ0JpdHNFWFQgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULW9mZnNldC0wMTk4MyIsICJvZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgYnVmZmVyIGJ5IGF0IGxlYXN0IDMyIGJpdHMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtb2Zmc2V0LTAxOTgzKSJ9LAorICAgIHsiVlVJRC1Wa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhULW9mZnNldC0wMTk4NCIsICJvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVC1vZmZzZXQtMDE5ODQpIn0sCisgICAgeyJWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbkluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQkVHSU5fSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb25kaXRpb25hbFJlbmRlcmluZ0JlZ2luSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1BVHlwZS1wYXJhbWV0ZXIiLCAiQVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrQ29tcG9uZW50VHlwZU5WIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYtQVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLUJUeXBlLXBhcmFtZXRlciIsICJCVHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtDb21wb25lbnRUeXBlTlYgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1CVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYtQ1R5cGUtcGFyYW1ldGVyIiwgIkNUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0NvbXBvbmVudFR5cGVOViB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLUNUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1EVHlwZS1wYXJhbWV0ZXIiLCAiRFR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrQ29tcG9uZW50VHlwZU5WIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYtRFR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1zY29wZS1wYXJhbWV0ZXIiLCAic2NvcGUgbXVzdCBiZSBhIHZhbGlkIFZrU2NvcGVOViB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXNjb3BlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBkc3RTZXQsIGFuZCBzcmNTZXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RBcnJheUVsZW1lbnQtMDAzNDgiLCAiVGhlIHN1bSBvZiBkc3RBcnJheUVsZW1lbnQgYW5kIGRlc2NyaXB0b3JDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIGluIHRoZSBkZXNjcmlwdG9yIHNldCBiaW5kaW5nIHNwZWNpZmllZCBieSBkc3RCaW5kaW5nLCBhbmQgYWxsIGFwcGxpY2FibGUgY29uc2VjdXRpdmUgYmluZGluZ3MsIGFzIGRlc2NyaWJlZCBieSBjb25zZWN1dGl2ZSBiaW5kaW5nIHVwZGF0ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RBcnJheUVsZW1lbnQtMDAzNDgpIn0sCisgICAgeyJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDM0NyIsICJkc3RCaW5kaW5nIG11c3QgYmUgYSB2YWxpZCBiaW5kaW5nIHdpdGhpbiBkc3RTZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RCaW5kaW5nLTAwMzQ3KSJ9LAorICAgIHsiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWRzdEJpbmRpbmctMDIyMjQiLCAiSWYgdGhlIGRlc2NyaXB0b3IgdHlwZSBvZiB0aGUgZGVzY3JpcHRvciBzZXQgYmluZGluZyBzcGVjaWZpZWQgYnkgZHN0QmluZGluZyBpcyBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhULCBkc3RBcnJheUVsZW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RCaW5kaW5nLTAyMjI0KSJ9LAorICAgIHsiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWRzdEJpbmRpbmctMDI2MzIiLCAiVGhlIHR5cGUgb2YgZHN0QmluZGluZyB3aXRoaW4gZHN0U2V0IG11c3QgYmUgZXF1YWwgdG8gdGhlIHR5cGUgb2Ygc3JjQmluZGluZyB3aXRoaW4gc3JjU2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMjYzMikifSwKKyAgICB7IlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RCaW5kaW5nLTAyNzUzIiwgIklmIHRoZSBkZXNjcmlwdG9yIHR5cGUgb2YgdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc3BlY2lmaWVkIGJ5IGRzdEJpbmRpbmcgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIsIHRoZW4gZHN0U2V0IG11c3Qgbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBhIGxheW91dCB0aGF0IGluY2x1ZGVkIGltbXV0YWJsZSBzYW1wbGVycyBmb3IgZHN0QmluZGluZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWRzdEJpbmRpbmctMDI3NTMpIn0sCisgICAgeyJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtZHN0U2V0LXBhcmFtZXRlciIsICJkc3RTZXQgbXVzdCBiZSBhIHZhbGlkIFZrRGVzY3JpcHRvclNldCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RTZXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfQ09QWV9ERVNDUklQVE9SX1NFVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY0FycmF5RWxlbWVudC0wMDM0NiIsICJUaGUgc3VtIG9mIHNyY0FycmF5RWxlbWVudCBhbmQgZGVzY3JpcHRvckNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgc3BlY2lmaWVkIGJ5IHNyY0JpbmRpbmcsIGFuZCBhbGwgYXBwbGljYWJsZSBjb25zZWN1dGl2ZSBiaW5kaW5ncywgYXMgZGVzY3JpYmVkIGJ5IGNvbnNlY3V0aXZlIGJpbmRpbmcgdXBkYXRlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY0FycmF5RWxlbWVudC0wMDM0NikifSwKKyAgICB7IlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNCaW5kaW5nLTAwMzQ1IiwgInNyY0JpbmRpbmcgbXVzdCBiZSBhIHZhbGlkIGJpbmRpbmcgd2l0aGluIHNyY1NldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY0JpbmRpbmctMDAzNDUpIn0sCisgICAgeyJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjQmluZGluZy0wMjIyMyIsICJJZiB0aGUgZGVzY3JpcHRvciB0eXBlIG9mIHRoZSBkZXNjcmlwdG9yIHNldCBiaW5kaW5nIHNwZWNpZmllZCBieSBzcmNCaW5kaW5nIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQsIHNyY0FycmF5RWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY0JpbmRpbmctMDIyMjMpIn0sCisgICAgeyJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjQmluZGluZy0wMjIyNSIsICJJZiB0aGUgZGVzY3JpcHRvciB0eXBlIG9mIHRoZSBkZXNjcmlwdG9yIHNldCBiaW5kaW5nIHNwZWNpZmllZCBieSBlaXRoZXIgc3JjQmluZGluZyBvciBkc3RCaW5kaW5nIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQsIGRlc2NyaXB0b3JDb3VudCBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY0JpbmRpbmctMDIyMjUpIn0sCisgICAgeyJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LTAwMzQ5IiwgIklmIHNyY1NldCBpcyBlcXVhbCB0byBkc3RTZXQsIHRoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmFuZ2VzIG9mIGRlc2NyaXB0b3JzIG11c3Qgbm90IG92ZXJsYXAsIHdoZXJlIHRoZSByYW5nZXMgbWF5IGluY2x1ZGUgYXJyYXkgZWxlbWVudHMgZnJvbSBjb25zZWN1dGl2ZSBiaW5kaW5ncyBhcyBkZXNjcmliZWQgYnkgY29uc2VjdXRpdmUgYmluZGluZyB1cGRhdGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LTAwMzQ5KSJ9LAorICAgIHsiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY1NldC0wMTkxOCIsICJJZiBzcmNTZXQncyBsYXlvdXQgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgZmxhZyBzZXQsIHRoZW4gZHN0U2V0J3MgbGF5b3V0IG11c3QgYWxzbyBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBmbGFnIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY1NldC0wMTkxOCkifSwKKyAgICB7IlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNTZXQtMDE5MTkiLCAiSWYgc3JjU2V0J3MgbGF5b3V0IHdhcyBjcmVhdGVkIHdpdGhvdXQgdGhlIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUIGZsYWcgc2V0LCB0aGVuIGRzdFNldCdzIGxheW91dCBtdXN0IGFsc28gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgZmxhZyBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNTZXQtMDE5MTkpIn0sCisgICAgeyJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LTAxOTIwIiwgIklmIHRoZSBkZXNjcmlwdG9yIHBvb2wgZnJvbSB3aGljaCBzcmNTZXQgd2FzIGFsbG9jYXRlZCB3YXMgY3JlYXRlZCB3aXRoIHRoZSBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgZmxhZyBzZXQsIHRoZW4gdGhlIGRlc2NyaXB0b3IgcG9vbCBmcm9tIHdoaWNoIGRzdFNldCB3YXMgYWxsb2NhdGVkIG11c3QgYWxzbyBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgZmxhZyBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNTZXQtMDE5MjApIn0sCisgICAgeyJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LTAxOTIxIiwgIklmIHRoZSBkZXNjcmlwdG9yIHBvb2wgZnJvbSB3aGljaCBzcmNTZXQgd2FzIGFsbG9jYXRlZCB3YXMgY3JlYXRlZCB3aXRob3V0IHRoZSBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgZmxhZyBzZXQsIHRoZW4gdGhlIGRlc2NyaXB0b3IgcG9vbCBmcm9tIHdoaWNoIGRzdFNldCB3YXMgYWxsb2NhdGVkIG11c3QgYWxzbyBoYXZlIGJlZW4gY3JlYXRlZCB3aXRob3V0IHRoZSBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgZmxhZyBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNTZXQtMDE5MjEpIn0sCisgICAgeyJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LXBhcmFtZXRlciIsICJzcmNTZXQgbXVzdCBiZSBhIHZhbGlkIFZrRGVzY3JpcHRvclNldCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1zcmNTZXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSLXBTaWduYWxTZW1hcGhvcmVWYWx1ZXMtcGFyYW1ldGVyIiwgIklmIHNpZ25hbFNlbWFwaG9yZVZhbHVlc0NvdW50IGlzIG5vdCAwLCBhbmQgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyBpcyBub3QgTlVMTCwgcFNpZ25hbFNlbWFwaG9yZVZhbHVlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudCB1aW50NjRfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi1wU2lnbmFsU2VtYXBob3JlVmFsdWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi1wV2FpdFNlbWFwaG9yZVZhbHVlcy1wYXJhbWV0ZXIiLCAiSWYgd2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50IGlzIG5vdCAwLCBhbmQgcFdhaXRTZW1hcGhvcmVWYWx1ZXMgaXMgbm90IE5VTEwsIHBXYWl0U2VtYXBob3JlVmFsdWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHdhaXRTZW1hcGhvcmVWYWx1ZXNDb3VudCB1aW50NjRfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi1wV2FpdFNlbWFwaG9yZVZhbHVlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRDNEMTJGZW5jZVN1Ym1pdEluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9EM0QxMl9GRU5DRV9TVUJNSVRfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi1zaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudC0wMDA4MCIsICJzaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudCBtdXN0IGJlIHRoZSBzYW1lIHZhbHVlIGFzIFZrU3VibWl0SW5mbzo6c2lnbmFsU2VtYXBob3JlQ291bnQsIHdoZXJlIFZrU3VibWl0SW5mbyBpcyBpbiB0aGUgcE5leHQgY2hhaW4gb2YgdGhpcyBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIHN0cnVjdHVyZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi1zaWduYWxTZW1hcGhvcmVWYWx1ZXNDb3VudC0wMDA4MCkifSwKKyAgICB7IlZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi13YWl0U2VtYXBob3JlVmFsdWVzQ291bnQtMDAwNzkiLCAid2FpdFNlbWFwaG9yZVZhbHVlc0NvdW50IG11c3QgYmUgdGhlIHNhbWUgdmFsdWUgYXMgVmtTdWJtaXRJbmZvOjp3YWl0U2VtYXBob3JlQ291bnQsIHdoZXJlIFZrU3VibWl0SW5mbyBpcyBpbiB0aGUgcE5leHQgY2hhaW4gb2YgdGhpcyBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSIHN0cnVjdHVyZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEM0QxMkZlbmNlU3VibWl0SW5mb0tIUi13YWl0U2VtYXBob3JlVmFsdWVzQ291bnQtMDAwNzkpIn0sCisgICAgeyJWVUlELVZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhULXBNYXJrZXJOYW1lLXBhcmFtZXRlciIsICJwTWFya2VyTmFtZSBtdXN0IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVC1wTWFya2VyTmFtZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19NQVJLRVJfTUFSS0VSX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdNYXJrZXJNYXJrZXJJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0LTAxNDkxIiwgIm9iamVjdCBtdXN0IG5vdCBiZSBWS19OVUxMX0hBTkRMRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0LTAxNDkxKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0LTAxNDkyIiwgIm9iamVjdCBtdXN0IGJlIGEgVnVsa2FuIG9iamVjdCBvZiB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggb2JqZWN0VHlwZSBhcyBkZWZpbmVkIGluIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGFuZCBWdWxrYW4gSGFuZGxlIFJlbGF0aW9uc2hpcC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULW9iamVjdC0wMTQ5MikifSwKKyAgICB7IlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtMDE0OTAiLCAib2JqZWN0VHlwZSBtdXN0IG5vdCBiZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtMDE0OTApIn0sCisgICAgeyJWVUlELVZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVC1vYmplY3RUeXBlLXBhcmFtZXRlciIsICJvYmplY3RUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhULXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQtcE9iamVjdE5hbWUtcGFyYW1ldGVyIiwgInBPYmplY3ROYW1lIG11c3QgYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVC1wT2JqZWN0TmFtZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfTkFNRV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULW9iamVjdC0wMTQ5NCIsICJvYmplY3QgbXVzdCBub3QgYmUgVktfTlVMTF9IQU5ETEUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQtb2JqZWN0LTAxNDk0KSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC1vYmplY3QtMDE0OTUiLCAib2JqZWN0IG11c3QgYmUgYSBWdWxrYW4gb2JqZWN0IG9mIHRoZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBvYmplY3RUeXBlIGFzIGRlZmluZWQgaW4gVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgYW5kIFZ1bGthbiBIYW5kbGUgUmVsYXRpb25zaGlwLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC1vYmplY3QtMDE0OTUpIn0sCisgICAgeyJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULW9iamVjdFR5cGUtMDE0OTMiLCAib2JqZWN0VHlwZSBtdXN0IG5vdCBiZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQtb2JqZWN0VHlwZS0wMTQ5MykifSwKKyAgICB7IlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIiLCAib2JqZWN0VHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQtcFRhZy1wYXJhbWV0ZXIiLCAicFRhZyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0YWdTaXplIGJ5dGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULXBUYWctcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01BUktFUl9PQkpFQ1RfVEFHX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC10YWdTaXplLWFycmF5bGVuZ3RoIiwgInRhZ1NpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnTWFya2VyT2JqZWN0VGFnSW5mb0VYVC10YWdTaXplLWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhULWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtEZWJ1Z1JlcG9ydEZsYWdCaXRzRVhUIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhULWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVC1wZm5DYWxsYmFjay1wYXJhbWV0ZXIiLCAicGZuQ2FsbGJhY2sgbXVzdCBiZSBhIHZhbGlkIFBGTl92a0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVC1wZm5DYWxsYmFjay1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ0FMTEJBQ0tfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc0xhYmVsRVhULXBMYWJlbE5hbWUtcGFyYW1ldGVyIiwgInBMYWJlbE5hbWUgbXVzdCBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsTmFtZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc0xhYmVsRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnVXRpbHNMYWJlbEVYVC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19MQUJFTF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTGFiZWxFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtcENtZEJ1ZkxhYmVscy1wYXJhbWV0ZXIiLCAiSWYgY21kQnVmTGFiZWxDb3VudCBpcyBub3QgMCwgcENtZEJ1ZkxhYmVscyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjbWRCdWZMYWJlbENvdW50IHZhbGlkIFZrRGVidWdVdGlsc0xhYmVsRVhUIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULXBDbWRCdWZMYWJlbHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtcE1lc3NhZ2UtcGFyYW1ldGVyIiwgInBNZXNzYWdlIG11c3QgYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wTWVzc2FnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wTWVzc2FnZUlkTmFtZS1wYXJhbWV0ZXIiLCAiSWYgcE1lc3NhZ2VJZE5hbWUgaXMgbm90IE5VTEwsIHBNZXNzYWdlSWROYW1lIG11c3QgYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wTWVzc2FnZUlkTmFtZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtcE9iamVjdHMtcGFyYW1ldGVyIiwgIklmIG9iamVjdENvdW50IGlzIG5vdCAwLCBwT2JqZWN0cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBvYmplY3RDb3VudCB2YWxpZCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wT2JqZWN0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wUXVldWVMYWJlbHMtcGFyYW1ldGVyIiwgIklmIHF1ZXVlTGFiZWxDb3VudCBpcyBub3QgMCwgcFF1ZXVlTGFiZWxzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHF1ZXVlTGFiZWxDb3VudCB2YWxpZCBWa0RlYnVnVXRpbHNMYWJlbEVYVCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVC1wUXVldWVMYWJlbHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VTZXZlcml0eS1wYXJhbWV0ZXIiLCAibWVzc2FnZVNldmVyaXR5IG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1tZXNzYWdlU2V2ZXJpdHktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VTZXZlcml0eS1yZXF1aXJlZGJpdG1hc2siLCAibWVzc2FnZVNldmVyaXR5IG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1tZXNzYWdlU2V2ZXJpdHktcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULW1lc3NhZ2VUeXBlLXBhcmFtZXRlciIsICJtZXNzYWdlVHlwZSBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnQml0c0VYVCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1tZXNzYWdlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQtbWVzc2FnZVR5cGUtcmVxdWlyZWRiaXRtYXNrIiwgIm1lc3NhZ2VUeXBlIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1tZXNzYWdlVHlwZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQtcGZuVXNlckNhbGxiYWNrLTAxOTE0IiwgInBmblVzZXJDYWxsYmFjayBtdXN0IGJlIGEgdmFsaWQgUEZOX3ZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQtcGZuVXNlckNhbGxiYWNrLTAxOTE0KSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULXBmblVzZXJDYWxsYmFjay1wYXJhbWV0ZXIiLCAicGZuVXNlckNhbGxiYWNrIG11c3QgYmUgYSB2YWxpZCBQRk5fdmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tFWFQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVC1wZm5Vc2VyQ2FsbGJhY2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfTUVTU0VOR0VSX0NSRUFURV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVC1vYmplY3RUeXBlLTAyNTg5IiwgIklmIG9iamVjdFR5cGUgaXMgVktfT0JKRUNUX1RZUEVfVU5LTk9XTiwgb2JqZWN0SGFuZGxlIG11c3Qgbm90IGJlIFZLX05VTExfSEFORExFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtMDI1ODkpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtMDI1OTAiLCAiSWYgb2JqZWN0VHlwZSBpcyBub3QgVktfT0JKRUNUX1RZUEVfVU5LTk9XTiwgb2JqZWN0SGFuZGxlIG11c3QgYmUgVktfTlVMTF9IQU5ETEUgb3IgYSB2YWxpZCBWdWxrYW4gaGFuZGxlIG9mIHRoZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBvYmplY3RUeXBlIGFzIGRlZmluZWQgaW4gdGhlIFZrT2JqZWN0VHlwZSBhbmQgVnVsa2FuIEhhbmRsZSBSZWxhdGlvbnNoaXAgdGFibGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0VHlwZS0wMjU5MCkifSwKKyAgICB7IlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIiLCAib2JqZWN0VHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtPYmplY3RUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULXBPYmplY3ROYW1lLXBhcmFtZXRlciIsICJJZiBwT2JqZWN0TmFtZSBpcyBub3QgTlVMTCwgcE9iamVjdE5hbWUgbXVzdCBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQtcE9iamVjdE5hbWUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1VUSUxTX09CSkVDVF9OQU1FX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhULW9iamVjdEhhbmRsZS0wMTkxMCIsICJvYmplY3RIYW5kbGUgbXVzdCBiZSBhIHZhbGlkIFZ1bGthbiBoYW5kbGUgb2YgdGhlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIG9iamVjdFR5cGUgYXMgZGVmaW5lZCBpbiB0aGUgVmtPYmplY3RUeXBlIGFuZCBWdWxrYW4gSGFuZGxlIFJlbGF0aW9uc2hpcCB0YWJsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhULW9iamVjdEhhbmRsZS0wMTkxMCkifSwKKyAgICB7IlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVC1vYmplY3RUeXBlLTAxOTA4IiwgIm9iamVjdFR5cGUgbXVzdCBub3QgYmUgVktfT0JKRUNUX1RZUEVfVU5LTk9XTiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhULW9iamVjdFR5cGUtMDE5MDgpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIiLCAib2JqZWN0VHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtPYmplY3RUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtb2JqZWN0VHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtcFRhZy1wYXJhbWV0ZXIiLCAicFRhZyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0YWdTaXplIGJ5dGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtcFRhZy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfVEFHX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQtdGFnU2l6ZS1hcnJheWxlbmd0aCIsICJ0YWdTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVC10YWdTaXplLWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9CVUZGRVJfQ1JFQVRFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25JbWFnZUNyZWF0ZUluZm9OVi1kZWRpY2F0ZWRBbGxvY2F0aW9uLTAwOTk0IiwgIklmIGRlZGljYXRlZEFsbG9jYXRpb24gaXMgVktfVFJVRSwgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIG11c3Qgbm90IGluY2x1ZGUgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCwgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklULCBvciBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WLWRlZGljYXRlZEFsbG9jYXRpb24tMDA5OTQpIn0sCisgICAgeyJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQ1JFQVRFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWJ1ZmZlci0wMDY1MSIsICJJZiBidWZmZXIgaXMgbm90IFZLX05VTExfSEFORExFLCB0aGUgYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY6OmRlZGljYXRlZEFsbG9jYXRpb24gZXF1YWwgdG8gVktfVFJVRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVi1idWZmZXItMDA2NTEpIn0sCisgICAgeyJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWJ1ZmZlci0wMDY1MyIsICJJZiBidWZmZXIgaXMgbm90IFZLX05VTExfSEFORExFLCBWa01lbW9yeUFsbG9jYXRlSW5mbzo6YWxsb2NhdGlvblNpemUgbXVzdCBlcXVhbCB0aGUgVmtNZW1vcnlSZXF1aXJlbWVudHM6OnNpemUgb2YgdGhlIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVi1idWZmZXItMDA2NTMpIn0sCisgICAgeyJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWJ1ZmZlci0wMDY1NSIsICJJZiBidWZmZXIgaXMgbm90IFZLX05VTExfSEFORExFIGFuZCBWa01lbW9yeUFsbG9jYXRlSW5mbyBkZWZpbmVzIGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24sIHRoZSBtZW1vcnkgYmVpbmcgaW1wb3J0ZWQgbXVzdCBhbHNvIGJlIGEgZGVkaWNhdGVkIGJ1ZmZlciBhbGxvY2F0aW9uIGFuZCBidWZmZXIgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGltcG9ydGVkIG1lbW9yeS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtYnVmZmVyLTAwNjU1KSJ9LAorICAgIHsiVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVi1idWZmZXItcGFyYW1ldGVyIiwgIklmIGJ1ZmZlciBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGJ1ZmZlciwgYW5kIGltYWdlIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtaW1hZ2UtMDA2NDkiLCAiQXQgbGVhc3Qgb25lIG9mIGltYWdlIGFuZCBidWZmZXIgbXVzdCBiZSBWS19OVUxMX0hBTkRMRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVi1pbWFnZS0wMDY0OSkifSwKKyAgICB7IlZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtaW1hZ2UtMDA2NTAiLCAiSWYgaW1hZ2UgaXMgbm90IFZLX05VTExfSEFORExFLCB0aGUgaW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZrRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQ3JlYXRlSW5mb05WOjpkZWRpY2F0ZWRBbGxvY2F0aW9uIGVxdWFsIHRvIFZLX1RSVUUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtaW1hZ2UtMDA2NTApIn0sCisgICAgeyJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWltYWdlLTAwNjUyIiwgIklmIGltYWdlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgVmtNZW1vcnlBbGxvY2F0ZUluZm86OmFsbG9jYXRpb25TaXplIG11c3QgZXF1YWwgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzOjpzaXplIG9mIHRoZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVi1pbWFnZS0wMDY1MikifSwKKyAgICB7IlZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtaW1hZ2UtMDA2NTQiLCAiSWYgaW1hZ2UgaXMgbm90IFZLX05VTExfSEFORExFIGFuZCBWa01lbW9yeUFsbG9jYXRlSW5mbyBkZWZpbmVzIGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24sIHRoZSBtZW1vcnkgYmVpbmcgaW1wb3J0ZWQgbXVzdCBhbHNvIGJlIGEgZGVkaWNhdGVkIGltYWdlIGFsbG9jYXRpb24gYW5kIGltYWdlIG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGltcG9ydGVkIG1lbW9yeS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtaW1hZ2UtMDA2NTQpIn0sCisgICAgeyJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLWltYWdlLXBhcmFtZXRlciIsICJJZiBpbWFnZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGltYWdlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVi1pbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JCdWZmZXJJbmZvLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tb2Zmc2V0LTAwMzQwIiwgIm9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yQnVmZmVySW5mby1vZmZzZXQtMDAzNDApIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tcmFuZ2UtMDAzNDEiLCAiSWYgcmFuZ2UgaXMgbm90IGVxdWFsIHRvIFZLX1dIT0xFX1NJWkUsIHJhbmdlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yQnVmZmVySW5mby1yYW5nZS0wMDM0MSkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yQnVmZmVySW5mby1yYW5nZS0wMDM0MiIsICJJZiByYW5nZSBpcyBub3QgZXF1YWwgdG8gVktfV0hPTEVfU0laRSwgcmFuZ2UgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgYnVmZmVyIG1pbnVzIG9mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JCdWZmZXJJbmZvLXJhbmdlLTAwMzQyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JJbWFnZUluZm8tY29tbW9ucGFyZW50IiwgIkJvdGggb2YgaW1hZ2VWaWV3LCBhbmQgc2FtcGxlciB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JJbWFnZUluZm8tY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JJbWFnZUluZm8taW1hZ2VMYXlvdXQtMDAzNDQiLCAiaW1hZ2VMYXlvdXQgbXVzdCBtYXRjaCB0aGUgYWN0dWFsIFZrSW1hZ2VMYXlvdXQgb2YgZWFjaCBzdWJyZXNvdXJjZSBhY2Nlc3NpYmxlIGZyb20gaW1hZ2VWaWV3IGF0IHRoZSB0aW1lIHRoaXMgZGVzY3JpcHRvciBpcyBhY2Nlc3NlZCBhcyBkZWZpbmVkIGJ5IHRoZSBpbWFnZSBsYXlvdXQgbWF0Y2hpbmcgcnVsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWltYWdlTGF5b3V0LTAwMzQ0KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JJbWFnZUluZm8taW1hZ2VWaWV3LTAwMzQzIiwgImltYWdlVmlldyBtdXN0IG5vdCBiZSAyRCBvciAyRCBhcnJheSBpbWFnZSB2aWV3IGNyZWF0ZWQgZnJvbSBhIDNEIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvckltYWdlSW5mby1pbWFnZVZpZXctMDAzNDMpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvckltYWdlSW5mby1pbWFnZVZpZXctMDE5NzYiLCAiSWYgaW1hZ2VWaWV3IGlzIGNyZWF0ZWQgZnJvbSBhIGRlcHRoL3N0ZW5jaWwgaW1hZ2UsIHRoZSBhc3BlY3RNYXNrIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZVZpZXcgbXVzdCBpbmNsdWRlIGVpdGhlciBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIG9yIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCBidXQgbm90IGJvdGguIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvckltYWdlSW5mby1pbWFnZVZpZXctMDE5NzYpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvckltYWdlSW5mby1zYW1wbGVyLTAxNTY0IiwgIklmIHNhbXBsZXIgaXMgdXNlZCBhbmQgdGhlIFZrRm9ybWF0IG9mIHRoZSBpbWFnZSBpcyBhIG11bHRpLXBsYW5hciBmb3JtYXQsIHRoZSBpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCwgYW5kIHRoZSBhc3BlY3RNYXNrIG9mIHRoZSBpbWFnZVZpZXcgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCBvciAoZm9yIHRocmVlLXBsYW5lIGZvcm1hdHMgb25seSkgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvckltYWdlSW5mby1zYW1wbGVyLTAxNTY0KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1tYXhTZXRzLTAwMzAxIiwgIm1heFNldHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1tYXhTZXRzLTAwMzAxKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvLXBQb29sU2l6ZXMtcGFyYW1ldGVyIiwgInBQb29sU2l6ZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9vbFNpemVDb3VudCB2YWxpZCBWa0Rlc2NyaXB0b3JQb29sU2l6ZSBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvLXBQb29sU2l6ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1wb29sU2l6ZUNvdW50LWFycmF5bGVuZ3RoIiwgInBvb2xTaXplQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1wb29sU2l6ZUNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yUG9vbElubGluZVVuaWZvcm1CbG9ja0NyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclBvb2xJbmxpbmVVbmlmb3JtQmxvY2tDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS1kZXNjcmlwdG9yQ291bnQtMDAzMDIiLCAiZGVzY3JpcHRvckNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yUG9vbFNpemUtZGVzY3JpcHRvckNvdW50LTAwMzAyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS10eXBlLTAyMjE4IiwgIklmIHR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVCB0aGVuIGRlc2NyaXB0b3JDb3VudCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS10eXBlLTAyMjE4KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS10eXBlLXBhcmFtZXRlciIsICJ0eXBlIG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclBvb2xTaXplLXR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZGVzY3JpcHRvclBvb2wsIGFuZCB0aGUgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tZGVzY3JpcHRvclBvb2wtMDAzMDciLCAiZGVzY3JpcHRvclBvb2wgbXVzdCBoYXZlIGVub3VnaCBmcmVlIGRlc2NyaXB0b3IgY2FwYWNpdHkgcmVtYWluaW5nIHRvIGFsbG9jYXRlIHRoZSBkZXNjcmlwdG9yIHNldHMgb2YgdGhlIHNwZWNpZmllZCBsYXlvdXRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1kZXNjcmlwdG9yUG9vbC0wMDMwNykifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIsICJkZXNjcmlwdG9yUG9vbCBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yUG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLWRlc2NyaXB0b3JTZXRDb3VudC0wMDMwNiIsICJkZXNjcmlwdG9yU2V0Q291bnQgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2Ygc2V0cyB0aGF0IGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIGluIGRlc2NyaXB0b3JQb29sIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1kZXNjcmlwdG9yU2V0Q291bnQtMDAzMDYpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1kZXNjcmlwdG9yU2V0Q291bnQtYXJyYXlsZW5ndGgiLCAiZGVzY3JpcHRvclNldENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLWRlc2NyaXB0b3JTZXRDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1wU2V0TGF5b3V0cy0wMDMwOCIsICJFYWNoIGVsZW1lbnQgb2YgcFNldExheW91dHMgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tcFNldExheW91dHMtMDAzMDgpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1wU2V0TGF5b3V0cy0wMzA0NCIsICJJZiBhbnkgZWxlbWVudCBvZiBwU2V0TGF5b3V0cyB3YXMgY3JlYXRlZCB3aXRoIHRoZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBiaXQgc2V0LCBkZXNjcmlwdG9yUG9vbCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCBmbGFnIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tcFNldExheW91dHMtMDMwNDQpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1wU2V0TGF5b3V0cy1wYXJhbWV0ZXIiLCAicFNldExheW91dHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVzY3JpcHRvclNldENvdW50IHZhbGlkIFZrRGVzY3JpcHRvclNldExheW91dCBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1wU2V0TGF5b3V0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JDb3VudC0wMDI4MyIsICJJZiBkZXNjcmlwdG9yQ291bnQgaXMgbm90IDAsIHN0YWdlRmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZy1kZXNjcmlwdG9yQ291bnQtMDAyODMpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtMDAyODIiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgb3IgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIGFuZCBkZXNjcmlwdG9yQ291bnQgaXMgbm90IDAgYW5kIHBJbW11dGFibGVTYW1wbGVycyBpcyBub3QgTlVMTCwgcEltbXV0YWJsZVNhbXBsZXJzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JDb3VudCB2YWxpZCBWa1NhbXBsZXIgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JUeXBlLTAwMjgyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JUeXBlLTAxNTEwIiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UIGFuZCBkZXNjcmlwdG9yQ291bnQgaXMgbm90IDAsIHRoZW4gc3RhZ2VGbGFncyBtdXN0IGJlIDAgb3IgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JUeXBlLTAxNTEwKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JUeXBlLTAyMjA5IiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgdGhlbiBkZXNjcmlwdG9yQ291bnQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZy1kZXNjcmlwdG9yVHlwZS0wMjIwOSkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZy1kZXNjcmlwdG9yVHlwZS0wMjIxMCIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIHRoZW4gZGVzY3JpcHRvckNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUOjptYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtMDIyMTApIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIiwgImRlc2NyaXB0b3JUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULU5vbmUtMDMwMTEiLCAiQWxsIGJpbmRpbmdzIHdpdGggZGVzY3JpcHRvciB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5ULCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQywgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMgbXVzdCBub3QgdXNlIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtTm9uZS0wMzAxMSkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1iaW5kaW5nQ291bnQtMDMwMDIiLCAiSWYgYmluZGluZ0NvdW50IGlzIG5vdCB6ZXJvLCBiaW5kaW5nQ291bnQgbXVzdCBlcXVhbCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvOjpiaW5kaW5nQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1iaW5kaW5nQ291bnQtMDMwMDIpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQtMDIyMTEiLCAiSWYgVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUOjpkZXNjcmlwdG9yQmluZGluZ0lubGluZVVuaWZvcm1CbG9ja1VwZGF0ZUFmdGVyQmluZCBpcyBub3QgZW5hYmxlZCwgYWxsIGJpbmRpbmdzIHdpdGggZGVzY3JpcHRvciB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgbXVzdCBub3QgdXNlIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdJbmxpbmVVbmlmb3JtQmxvY2tVcGRhdGVBZnRlckJpbmQtMDIyMTEpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZC0wMzAxMyIsICJJZiBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OmRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQgaXMgbm90IGVuYWJsZWQsIGFsbCBlbGVtZW50cyBvZiBwQmluZGluZ0ZsYWdzIG11c3Qgbm90IGluY2x1ZGUgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1BBUlRJQUxMWV9CT1VORF9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZC0wMzAxMykifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZC0wMzAwNiIsICJJZiBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OmRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kIGlzIG5vdCBlbmFibGVkLCBhbGwgYmluZGluZ3Mgd2l0aCBkZXNjcmlwdG9yIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCBvciBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSBtdXN0IG5vdCB1c2UgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZC0wMzAwNikifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQtMDMwMDgiLCAiSWYgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQgaXMgbm90IGVuYWJsZWQsIGFsbCBiaW5kaW5ncyB3aXRoIGRlc2NyaXB0b3IgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIgbXVzdCBub3QgdXNlIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kLTAzMDA4KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUltYWdlVXBkYXRlQWZ0ZXJCaW5kLTAzMDA3IiwgIklmIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6ZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlSW1hZ2VVcGRhdGVBZnRlckJpbmQgaXMgbm90IGVuYWJsZWQsIGFsbCBiaW5kaW5ncyB3aXRoIGRlc2NyaXB0b3IgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSBtdXN0IG5vdCB1c2UgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VJbWFnZVVwZGF0ZUFmdGVyQmluZC0wMzAwNykifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VUZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZC0wMzAxMCIsICJJZiBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kIGlzIG5vdCBlbmFibGVkLCBhbGwgYmluZGluZ3Mgd2l0aCBkZXNjcmlwdG9yIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSIG11c3Qgbm90IHVzZSBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZVRleGVsQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kLTAzMDEwKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZC0wMzAwNSIsICJJZiBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCBpcyBub3QgZW5hYmxlZCwgYWxsIGJpbmRpbmdzIHdpdGggZGVzY3JpcHRvciB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiBtdXN0IG5vdCB1c2UgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQtMDMwMDUpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtVGV4ZWxCdWZmZXJVcGRhdGVBZnRlckJpbmQtMDMwMDkiLCAiSWYgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZCBpcyBub3QgZW5hYmxlZCwgYWxsIGJpbmRpbmdzIHdpdGggZGVzY3JpcHRvciB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUiBtdXN0IG5vdCB1c2UgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1UZXhlbEJ1ZmZlclVwZGF0ZUFmdGVyQmluZC0wMzAwOSkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1VwZGF0ZVVudXNlZFdoaWxlUGVuZGluZy0wMzAxMiIsICJJZiBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OmRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nIGlzIG5vdCBlbmFibGVkLCBhbGwgZWxlbWVudHMgb2YgcEJpbmRpbmdGbGFncyBtdXN0IG5vdCBpbmNsdWRlIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nVXBkYXRlVW51c2VkV2hpbGVQZW5kaW5nLTAzMDEyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQtMDMwMTQiLCAiSWYgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpkZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50IGlzIG5vdCBlbmFibGVkLCBhbGwgZWxlbWVudHMgb2YgcEJpbmRpbmdGbGFncyBtdXN0IG5vdCBpbmNsdWRlIFZLX0RFU0NSSVBUT1JfQklORElOR19WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1kZXNjcmlwdG9yQmluZGluZ1ZhcmlhYmxlRGVzY3JpcHRvckNvdW50LTAzMDE0KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWZsYWdzLTAzMDAzIiwgIklmIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm86OmZsYWdzIGluY2x1ZGVzIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIsIHRoZW4gYWxsIGVsZW1lbnRzIG9mIHBCaW5kaW5nRmxhZ3MgbXVzdCBub3QgaW5jbHVkZSBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCwgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9VTlVTRURfV0hJTEVfUEVORElOR19CSVRfRVhULCBvciBWS19ERVNDUklQVE9SX0JJTkRJTkdfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtZmxhZ3MtMDMwMDMpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtcEJpbmRpbmdGbGFncy0wMzAwNCIsICJJZiBhbiBlbGVtZW50IG9mIHBCaW5kaW5nRmxhZ3MgaW5jbHVkZXMgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQklUX0VYVCwgdGhlbiBhbGwgb3RoZXIgZWxlbWVudHMgb2YgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbzo6cEJpbmRpbmdzIG11c3QgaGF2ZSBhIHNtYWxsZXIgdmFsdWUgb2YgYmluZGluZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULXBCaW5kaW5nRmxhZ3MtMDMwMDQpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtcEJpbmRpbmdGbGFncy0wMzAxNSIsICJJZiBhbiBlbGVtZW50IG9mIHBCaW5kaW5nRmxhZ3MgaW5jbHVkZXMgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQklUX0VYVCwgdGhhdCBlbGVtZW50J3MgZGVzY3JpcHRvclR5cGUgbXVzdCBub3QgYmUgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1wQmluZGluZ0ZsYWdzLTAzMDE1KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULXBCaW5kaW5nRmxhZ3MtcGFyYW1ldGVyIiwgIklmIGJpbmRpbmdDb3VudCBpcyBub3QgMCwgYW5kIHBCaW5kaW5nRmxhZ3MgaXMgbm90IE5VTEwsIHBCaW5kaW5nRmxhZ3MgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYmluZGluZ0NvdW50IHZhbGlkIGNvbWJpbmF0aW9ucyBvZiBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ0JpdHNFWFQgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtcEJpbmRpbmdGbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1iaW5kaW5nLTAwMjc5IiwgIlRoZSBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nOjpiaW5kaW5nIG1lbWJlcnMgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBwQmluZGluZ3MgYXJyYXkgbXVzdCBlYWNoIGhhdmUgZGlmZmVyZW50IHZhbHVlcy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1iaW5kaW5nLTAwMjc5KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDAxIiwgIklmIGFueSBiaW5kaW5nIGhhcyB0aGUgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgYml0IHNldCwgdGhlbiBhbGwgYmluZGluZ3MgbXVzdCBub3QgaGF2ZSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyBvciBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDAxKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLTAwMjgwIiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIsIHRoZW4gYWxsIGVsZW1lbnRzIG9mIHBCaW5kaW5ncyBtdXN0IG5vdCBoYXZlIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy0wMDI4MCkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy0wMDI4MSIsICJJZiBmbGFncyBjb250YWlucyBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSLCB0aGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgb2YgYWxsIGJpbmRpbmdzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI6Om1heFB1c2hEZXNjcmlwdG9ycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLTAwMjgxKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLTAyMjA4IiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIsIHRoZW4gYWxsIGVsZW1lbnRzIG9mIHBCaW5kaW5ncyBtdXN0IG5vdCBoYXZlIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLTAyMjA4KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLTAzMDAwIiwgIklmIGFueSBiaW5kaW5nIGhhcyB0aGUgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQgYml0IHNldCwgZmxhZ3MgbXVzdCBpbmNsdWRlIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtMDMwMDApIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tcEJpbmRpbmdzLXBhcmFtZXRlciIsICJJZiBiaW5kaW5nQ291bnQgaXMgbm90IDAsIHBCaW5kaW5ncyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBiaW5kaW5nQ291bnQgdmFsaWQgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tcEJpbmRpbmdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50TGF5b3V0U3VwcG9ydEVYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX1NVUFBPUlQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQtZGVzY3JpcHRvclNldENvdW50LTAzMDQ1IiwgIklmIGRlc2NyaXB0b3JTZXRDb3VudCBpcyBub3QgemVybywgZGVzY3JpcHRvclNldENvdW50IG11c3QgZXF1YWwgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvOjpkZXNjcmlwdG9yU2V0Q291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQtZGVzY3JpcHRvclNldENvdW50LTAzMDQ1KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVC1wRGVzY3JpcHRvckNvdW50cy1wYXJhbWV0ZXIiLCAiSWYgZGVzY3JpcHRvclNldENvdW50IGlzIG5vdCAwLCBwRGVzY3JpcHRvckNvdW50cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkZXNjcmlwdG9yU2V0Q291bnQgdWludDMyX3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhULXBEZXNjcmlwdG9yQ291bnRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQtcFNldExheW91dHMtMDMwNDYiLCAiSWYgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvOjpwU2V0TGF5b3V0c1tpXSBoYXMgYSB2YXJpYWJsZSBkZXNjcmlwdG9yIGNvdW50IGJpbmRpbmcsIHRoZW4gcERlc2NyaXB0b3JDb3VudHNbaV0gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc2NyaXB0b3IgY291bnQgc3BlY2lmaWVkIGZvciB0aGF0IGJpbmRpbmcgd2hlbiB0aGUgZGVzY3JpcHRvciBzZXQgbGF5b3V0IHdhcyBjcmVhdGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVC1wU2V0TGF5b3V0cy0wMzA0NikifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0FMTE9DQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0xBWU9VVF9TVVBQT1JUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudExheW91dFN1cHBvcnRFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBkZXNjcmlwdG9yU2V0TGF5b3V0LCBhbmQgcGlwZWxpbmVMYXlvdXQgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLWRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50LWFycmF5bGVuZ3RoIiwgImRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLWRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXBEZXNjcmlwdG9yVXBkYXRlRW50cmllcy1wYXJhbWV0ZXIiLCAicERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50IHZhbGlkIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnkgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tcERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MCIsICJJZiB0ZW1wbGF0ZVR5cGUgaXMgVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9ERVNDUklQVE9SX1NFVCwgZGVzY3JpcHRvclNldExheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tdGVtcGxhdGVUeXBlLTAwMzUwKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tdGVtcGxhdGVUeXBlLTAwMzUxIiwgIklmIHRlbXBsYXRlVHlwZSBpcyBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSLCBwaXBlbGluZUJpbmRQb2ludCBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZUJpbmRQb2ludCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tdGVtcGxhdGVUeXBlLTAwMzUxKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8tdGVtcGxhdGVUeXBlLTAwMzUyIiwgIklmIHRlbXBsYXRlVHlwZSBpcyBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSLCBwaXBlbGluZUxheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZUxheW91dCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MikifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MyIsICJJZiB0ZW1wbGF0ZVR5cGUgaXMgVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9QVVNIX0RFU0NSSVBUT1JTX0tIUiwgc2V0IG11c3QgYmUgdGhlIHVuaXF1ZSBzZXQgbnVtYmVyIGluIHRoZSBwaXBlbGluZSBsYXlvdXQgdGhhdCB1c2VzIGEgZGVzY3JpcHRvciBzZXQgbGF5b3V0IHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtMDAzNTMpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtcGFyYW1ldGVyIiwgInRlbXBsYXRlVHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5LWRlc2NyaXB0b3ItMDIyMjYiLCAiSWYgZGVzY3JpcHRvciB0eXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQsIGRzdEFycmF5RWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5LWRlc2NyaXB0b3ItMDIyMjYpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnktZGVzY3JpcHRvci0wMjIyNyIsICJJZiBkZXNjcmlwdG9yIHR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVCwgZGVzY3JpcHRvckNvdW50IG11c3QgYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnktZGVzY3JpcHRvci0wMjIyNykifSwKKyAgICB7IlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeS1kZXNjcmlwdG9yVHlwZS1wYXJhbWV0ZXIiLCAiZGVzY3JpcHRvclR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRGVzY3JpcHRvclR5cGUgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVFbnRyeS1kZXNjcmlwdG9yVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnktZHN0QXJyYXlFbGVtZW50LTAwMzU1IiwgImRzdEFycmF5RWxlbWVudCBhbmQgZGVzY3JpcHRvckNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgaW1wbGljaXRseSBzcGVjaWZpZWQgd2hlbiB1c2luZyBhIGRlc2NyaXB0b3IgdXBkYXRlIHRlbXBsYXRlIHRvIHVwZGF0ZSBkZXNjcmlwdG9ycywgYW5kIGFsbCBhcHBsaWNhYmxlIGNvbnNlY3V0aXZlIGJpbmRpbmdzLCBhcyBkZXNjcmliZWQgYnkgY29uc2VjdXRpdmUgYmluZGluZyB1cGRhdGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnktZHN0QXJyYXlFbGVtZW50LTAwMzU1KSJ9LAorICAgIHsiVlVJRC1Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5LWRzdEJpbmRpbmctMDAzNTQiLCAiZHN0QmluZGluZyBtdXN0IGJlIGEgdmFsaWQgYmluZGluZyBpbiB0aGUgZGVzY3JpcHRvciBzZXQgbGF5b3V0IGltcGxpY2l0bHkgc3BlY2lmaWVkIHdoZW4gdXNpbmcgYSBkZXNjcmlwdG9yIHVwZGF0ZSB0ZW1wbGF0ZSB0byB1cGRhdGUgZGVzY3JpcHRvcnMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlRW50cnktZHN0QmluZGluZy0wMDM1NCkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wRW5hYmxlZEZlYXR1cmVzLXBhcmFtZXRlciIsICJJZiBwRW5hYmxlZEZlYXR1cmVzIGlzIG5vdCBOVUxMLCBwRW5hYmxlZEZlYXR1cmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcEVuYWJsZWRGZWF0dXJlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wTmV4dC0wMDM3MyIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHN0cnVjdHVyZSwgdGhlbiBwRW5hYmxlZEZlYXR1cmVzIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcE5leHQtMDAzNzMpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJFYWNoIHBOZXh0IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvLCBWa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRCwgVmtQaHlzaWNhbERldmljZTE2Qml0U3RvcmFnZUZlYXR1cmVzLCBWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQsIFZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZUNvcm5lclNhbXBsZWRJbWFnZUZlYXR1cmVzTlYsIFZrUGh5c2ljYWxEZXZpY2VDb3ZlcmFnZVJlZHVjdGlvbk1vZGVGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZUV4Y2x1c2l2ZVNjaXNzb3JGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOViwgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZUluZGV4VHlwZVVpbnQ4RmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYsIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcywgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZVByb3RlY3RlZE1lbW9yeUZlYXR1cmVzLCBWa1BoeXNpY2FsRGV2aWNlUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzLCBWa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMLCBWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUiwgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WLCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZVRleHR1cmVDb21wcmVzc2lvbkFTVENIRFJGZWF0dXJlc0VYVCwgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhULCBWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMsIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VWdWxrYW5NZW1vcnlNb2RlbEZlYXR1cmVzS0hSLCBvciBWa1BoeXNpY2FsRGV2aWNlWWNiY3JJbWFnZUFycmF5c0ZlYXR1cmVzRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBRdWV1ZUNyZWF0ZUluZm9zLXBhcmFtZXRlciIsICJwUXVldWVDcmVhdGVJbmZvcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBxdWV1ZUNyZWF0ZUluZm9Db3VudCB2YWxpZCBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wUXVldWVDcmVhdGVJbmZvcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy0wMDM3NCIsICJwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyBtdXN0IG5vdCBjb250YWluIGJvdGggVktfS0hSX21haW50ZW5hbmNlMSBhbmQgVktfQU1EX25lZ2F0aXZlX3ZpZXdwb3J0X2hlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtMDAzNzQpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy0wMTg0MCIsICJwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyBtdXN0IG5vdCBjb250YWluIFZLX0FNRF9uZWdhdGl2ZV92aWV3cG9ydF9oZWlnaHQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAxODQwKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtMDMzMjgiLCAicHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgbXVzdCBub3QgY29udGFpbiBib3RoIFZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MgYW5kIFZLX0VYVF9idWZmZXJfZGV2aWNlX2FkZHJlc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAzMzI4KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtcGFyYW1ldGVyIiwgIklmIGVuYWJsZWRFeHRlbnNpb25Db3VudCBpcyBub3QgMCwgcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZW5hYmxlZEV4dGVuc2lvbkNvdW50IG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmdzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wcEVuYWJsZWRMYXllck5hbWVzLXBhcmFtZXRlciIsICJJZiBlbmFibGVkTGF5ZXJDb3VudCBpcyBub3QgMCwgcHBFbmFibGVkTGF5ZXJOYW1lcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBlbmFibGVkTGF5ZXJDb3VudCBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5ncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcHBFbmFibGVkTGF5ZXJOYW1lcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1xdWV1ZUNyZWF0ZUluZm9Db3VudC1hcnJheWxlbmd0aCIsICJxdWV1ZUNyZWF0ZUluZm9Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1xdWV1ZUNyZWF0ZUluZm9Db3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXF1ZXVlRmFtaWx5SW5kZXgtMDAzNzIiLCAiVGhlIHF1ZXVlRmFtaWx5SW5kZXggbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwUXVldWVDcmVhdGVJbmZvcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gcFF1ZXVlQ3JlYXRlSW5mb3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXF1ZXVlRmFtaWx5SW5kZXgtMDAzNzIpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1xdWV1ZUZhbWlseUluZGV4LTAyODAyIiwgIlRoZSBxdWV1ZUZhbWlseUluZGV4IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFF1ZXVlQ3JlYXRlSW5mb3MgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHBRdWV1ZUNyZWF0ZUluZm9zLCBleGNlcHQgdGhhdCB0d28gbWVtYmVycyBjYW4gc2hhcmUgdGhlIHNhbWUgcXVldWVGYW1pbHlJbmRleCBpZiBvbmUgaXMgYSBwcm90ZWN0ZWQtY2FwYWJsZSBxdWV1ZSBhbmQgb25lIGlzIG5vdCBhIHByb3RlY3RlZC1jYXBhYmxlIHF1ZXVlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcXVldWVGYW1pbHlJbmRleC0wMjgwMikifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsICJFYWNoIHNUeXBlIG1lbWJlciBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSB1bmlxdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VFdmVudEluZm9FWFQtZGV2aWNlRXZlbnQtcGFyYW1ldGVyIiwgImRldmljZUV2ZW50IG11c3QgYmUgYSB2YWxpZCBWa0RldmljZUV2ZW50VHlwZUVYVCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUV2ZW50SW5mb0VYVC1kZXZpY2VFdmVudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlRXZlbnRJbmZvRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUV2ZW50SW5mb0VYVC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VFdmVudEluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfRVZFTlRfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VFdmVudEluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0ZFQVRVUkVTX05WWCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlgtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlgtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR0VORVJBVEVEX0NPTU1BTkRTX0xJTUlUU19OVlggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvLW1lbW9yeURldmljZUluZGV4LTAxMTE5IiwgIkVhY2ggbWVtb3J5IGFsbG9jYXRpb24gYm91bmQgaW4gdGhpcyBiYXRjaCBtdXN0IGhhdmUgYWxsb2NhdGVkIGFuIGluc3RhbmNlIGZvciBtZW1vcnlEZXZpY2VJbmRleC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cEJpbmRTcGFyc2VJbmZvLW1lbW9yeURldmljZUluZGV4LTAxMTE5KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8tcmVzb3VyY2VEZXZpY2VJbmRleC0wMTExOCIsICJyZXNvdXJjZURldmljZUluZGV4IGFuZCBtZW1vcnlEZXZpY2VJbmRleCBtdXN0IGJvdGggYmUgdmFsaWQgZGV2aWNlIGluZGljZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBCaW5kU3BhcnNlSW5mby1yZXNvdXJjZURldmljZUluZGV4LTAxMTE4KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQklORF9TUEFSU0VfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwQmluZFNwYXJzZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWRldmljZU1hc2stMDAxMDYiLCAiZGV2aWNlTWFzayBtdXN0IGJlIGEgdmFsaWQgZGV2aWNlIG1hc2sgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8tZGV2aWNlTWFzay0wMDEwNikifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8tZGV2aWNlTWFzay0wMDEwNyIsICJkZXZpY2VNYXNrIG11c3Qgbm90IGJlIHplcm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8tZGV2aWNlTWFzay0wMDEwNykifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8tcFBoeXNpY2FsRGV2aWNlcy0wMDM3NSIsICJFYWNoIGVsZW1lbnQgb2YgcFBoeXNpY2FsRGV2aWNlcyBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mby1wUGh5c2ljYWxEZXZpY2VzLTAwMzc1KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mby1wUGh5c2ljYWxEZXZpY2VzLTAwMzc2IiwgIkFsbCBlbGVtZW50cyBvZiBwUGh5c2ljYWxEZXZpY2VzIG11c3QgYmUgaW4gdGhlIHNhbWUgZGV2aWNlIGdyb3VwIGFzIGVudW1lcmF0ZWQgYnkgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mby1wUGh5c2ljYWxEZXZpY2VzLTAwMzc2KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mby1wUGh5c2ljYWxEZXZpY2VzLXBhcmFtZXRlciIsICJJZiBwaHlzaWNhbERldmljZUNvdW50IGlzIG5vdCAwLCBwUGh5c2ljYWxEZXZpY2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBoeXNpY2FsRGV2aWNlQ291bnQgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvLXBQaHlzaWNhbERldmljZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mby1waHlzaWNhbERldmljZUNvdW50LTAwMzc3IiwgIklmIHBoeXNpY2FsRGV2aWNlQ291bnQgaXMgbm90IDAsIHRoZSBwaHlzaWNhbERldmljZSBwYXJhbWV0ZXIgb2YgdmtDcmVhdGVEZXZpY2UgbXVzdCBiZSBhbiBlbGVtZW50IG9mIHBQaHlzaWNhbERldmljZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvLXBoeXNpY2FsRGV2aWNlQ291bnQtMDAzNzcpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0RFVklDRV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9QUkVTRU5UX0NBUEFCSUxJVElFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1tb2RlLTAxMjk4IiwgIklmIG1vZGUgaXMgVktfREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9MT0NBTF9CSVRfS0hSLCB0aGVuIGVhY2ggZWxlbWVudCBvZiBwRGV2aWNlTWFza3MgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGJpdCBzZXQsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSOjpwcmVzZW50TWFzayBtdXN0IGJlIG5vbi16ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1tb2RlLTAxMjk4KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItbW9kZS0wMTI5OSIsICJJZiBtb2RlIGlzIFZLX0RFVklDRV9HUk9VUF9QUkVTRU5UX01PREVfUkVNT1RFX0JJVF9LSFIsIHRoZW4gZWFjaCBlbGVtZW50IG9mIHBEZXZpY2VNYXNrcyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgYml0IHNldCwgYW5kIHNvbWUgcGh5c2ljYWwgZGV2aWNlIGluIHRoZSBsb2dpY2FsIGRldmljZSBtdXN0IGluY2x1ZGUgdGhhdCBiaXQgaW4gaXRzIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSOjpwcmVzZW50TWFzay4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLW1vZGUtMDEyOTkpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1tb2RlLTAxMzAwIiwgIklmIG1vZGUgaXMgVktfREVWSUNFX0dST1VQX1BSRVNFTlRfTU9ERV9TVU1fQklUX0tIUiwgdGhlbiBlYWNoIGVsZW1lbnQgb2YgcERldmljZU1hc2tzIG11c3QgaGF2ZSBhIHZhbHVlIGZvciB3aGljaCBhbGwgc2V0IGJpdHMgYXJlIHNldCBpbiBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSOjpwcmVzZW50TWFzayAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItbW9kZS0wMTMwMCkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLW1vZGUtMDEzMDEiLCAiSWYgbW9kZSBpcyBWS19ERVZJQ0VfR1JPVVBfUFJFU0VOVF9NT0RFX0xPQ0FMX01VTFRJX0RFVklDRV9CSVRfS0hSLCB0aGVuIGZvciBlYWNoIGJpdCBzZXQgaW4gZWFjaCBlbGVtZW50IG9mIHBEZXZpY2VNYXNrcywgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBWa0RldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUjo6cHJlc2VudE1hc2sgbXVzdCBiZSBub24temVybyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItbW9kZS0wMTMwMSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLW1vZGUtMDEzMDMiLCAibW9kZSBtdXN0IGhhdmUgZXhhY3RseSBvbmUgYml0IHNldCwgYW5kIHRoYXQgYml0IG11c3QgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIFZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSOjptb2RlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItbW9kZS0wMTMwMykifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLW1vZGUtcGFyYW1ldGVyIiwgIm1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1tb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLXBEZXZpY2VNYXNrcy0wMTMwMiIsICJUaGUgdmFsdWUgb2YgZWFjaCBlbGVtZW50IG9mIHBEZXZpY2VNYXNrcyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBkZXZpY2UgbWFzayBwYXNzZWQgaW4gVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUjo6ZGV2aWNlTWFzayB3aGVuIHRoZSBpbWFnZSBpbmRleCB3YXMgbGFzdCBhY3F1aXJlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItcERldmljZU1hc2tzLTAxMzAyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItcERldmljZU1hc2tzLXBhcmFtZXRlciIsICJJZiBzd2FwY2hhaW5Db3VudCBpcyBub3QgMCwgcERldmljZU1hc2tzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN3YXBjaGFpbkNvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItcERldmljZU1hc2tzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1BSRVNFTlRfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cFByZXNlbnRJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFItc3dhcGNoYWluQ291bnQtMDEyOTciLCAic3dhcGNoYWluQ291bnQgbXVzdCBlcXVhbCAwIG9yIFZrUHJlc2VudEluZm9LSFI6OnN3YXBjaGFpbkNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBQcmVzZW50SW5mb0tIUi1zd2FwY2hhaW5Db3VudC0wMTI5NykifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8tZGV2aWNlTWFzay0wMDkwNSIsICJkZXZpY2VNYXNrIG11c3QgYmUgYSB2YWxpZCBkZXZpY2UgbWFzayB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA1KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA2IiwgImRldmljZU1hc2sgbXVzdCBub3QgYmUgemVybyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA2KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA3IiwgImRldmljZU1hc2sgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgY29tbWFuZCBidWZmZXIncyBpbml0aWFsIGRldmljZSBtYXNrIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvLWRldmljZU1hc2stMDA5MDcpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvLWRldmljZVJlbmRlckFyZWFDb3VudC0wMDkwOCIsICJkZXZpY2VSZW5kZXJBcmVhQ291bnQgbXVzdCBlaXRoZXIgYmUgemVybyBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZXMgaW4gdGhlIGxvZ2ljYWwgZGV2aWNlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VSZW5kZXJBcmVhQ291bnQtMDA5MDgpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvLXBEZXZpY2VSZW5kZXJBcmVhcy1wYXJhbWV0ZXIiLCAiSWYgZGV2aWNlUmVuZGVyQXJlYUNvdW50IGlzIG5vdCAwLCBwRGV2aWNlUmVuZGVyQXJlYXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGV2aWNlUmVuZGVyQXJlYUNvdW50IFZrUmVjdDJEIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8tcERldmljZVJlbmRlckFyZWFzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfUkVOREVSX1BBU1NfQkVHSU5fSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tY29tbWFuZEJ1ZmZlckNvdW50LTAwMDgzIiwgImNvbW1hbmRCdWZmZXJDb3VudCBtdXN0IGVxdWFsIFZrU3VibWl0SW5mbzo6Y29tbWFuZEJ1ZmZlckNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLWNvbW1hbmRCdWZmZXJDb3VudC0wMDA4MykifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcy0wMDA4NiIsICJBbGwgZWxlbWVudHMgb2YgcENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcyBtdXN0IGJlIHZhbGlkIGRldmljZSBtYXNrcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzLTAwMDg2KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzLXBhcmFtZXRlciIsICJJZiBjb21tYW5kQnVmZmVyQ291bnQgaXMgbm90IDAsIHBDb21tYW5kQnVmZmVyRGV2aWNlTWFza3MgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY29tbWFuZEJ1ZmZlckNvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMtcGFyYW1ldGVyIiwgIklmIHNpZ25hbFNlbWFwaG9yZUNvdW50IGlzIG5vdCAwLCBwU2lnbmFsU2VtYXBob3JlRGV2aWNlSW5kaWNlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzaWduYWxTZW1hcGhvcmVDb3VudCB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMtMDAwODUiLCAiQWxsIGVsZW1lbnRzIG9mIHBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcyBhbmQgcFNpZ25hbFNlbWFwaG9yZURldmljZUluZGljZXMgbXVzdCBiZSB2YWxpZCBkZXZpY2UgaW5kaWNlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMtMDAwODUpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLXBXYWl0U2VtYXBob3JlRGV2aWNlSW5kaWNlcy1wYXJhbWV0ZXIiLCAiSWYgd2FpdFNlbWFwaG9yZUNvdW50IGlzIG5vdCAwLCBwV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygd2FpdFNlbWFwaG9yZUNvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZURldmljZUluZGljZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9TVUJNSVRfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8tc2lnbmFsU2VtYXBob3JlQ291bnQtMDAwODQiLCAic2lnbmFsU2VtYXBob3JlQ291bnQgbXVzdCBlcXVhbCBWa1N1Ym1pdEluZm86OnNpZ25hbFNlbWFwaG9yZUNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvLXNpZ25hbFNlbWFwaG9yZUNvdW50LTAwMDg0KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby13YWl0U2VtYXBob3JlQ291bnQtMDAwODIiLCAid2FpdFNlbWFwaG9yZUNvdW50IG11c3QgZXF1YWwgVmtTdWJtaXRJbmZvOjp3YWl0U2VtYXBob3JlQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8td2FpdFNlbWFwaG9yZUNvdW50LTAwMDgyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1tb2Rlcy1wYXJhbWV0ZXIiLCAibW9kZXMgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdCaXRzS0hSIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1tb2Rlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1vZGVzLXJlcXVpcmVkYml0bWFzayIsICJtb2RlcyBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlR3JvdXBTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1vZGVzLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VHcm91cFN3YXBjaGFpbkNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFItbWVtb3J5LTAzMzM2IiwgIm1lbW9yeSBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUi1tZW1vcnktMDMzMzYpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSLW1lbW9yeS1wYXJhbWV0ZXIiLCAibWVtb3J5IG11c3QgYmUgYSB2YWxpZCBWa0RldmljZU1lbW9yeSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFItbWVtb3J5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VNZW1vcnlPdmVyYWxsb2NhdGlvbkNyZWF0ZUluZm9BTUQtb3ZlcmFsbG9jYXRpb25CZWhhdmlvci1wYXJhbWV0ZXIiLCAib3ZlcmFsbG9jYXRpb25CZWhhdmlvciBtdXN0IGJlIGEgdmFsaWQgVmtNZW1vcnlPdmVyYWxsb2NhdGlvbkJlaGF2aW9yQU1EIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1ELW92ZXJhbGxvY2F0aW9uQmVoYXZpb3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZU1lbW9yeU92ZXJhbGxvY2F0aW9uQ3JlYXRlSW5mb0FNRC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9NRU1PUllfT1ZFUkFMTE9DQVRJT05fQ1JFQVRFX0lORk9fQU1EIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlTWVtb3J5T3ZlcmFsbG9jYXRpb25DcmVhdGVJbmZvQU1ELXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRGV2aWNlUXVldWVDcmVhdGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8tcFF1ZXVlUHJpb3JpdGllcy0wMDM4MyIsICJFYWNoIGVsZW1lbnQgb2YgcFF1ZXVlUHJpb3JpdGllcyBtdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjAgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXBRdWV1ZVByaW9yaXRpZXMtMDAzODMpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXBRdWV1ZVByaW9yaXRpZXMtcGFyYW1ldGVyIiwgInBRdWV1ZVByaW9yaXRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcXVldWVDb3VudCBmbG9hdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8tcFF1ZXVlUHJpb3JpdGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXF1ZXVlQ291bnQtMDAzODIiLCAicXVldWVDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcXVldWVDb3VudCBtZW1iZXIgb2YgdGhlIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzIHN0cnVjdHVyZSwgYXMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBpbiB0aGUgcFF1ZXVlRmFtaWx5UHJvcGVydGllc1txdWV1ZUZhbWlseUluZGV4XSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1xdWV1ZUNvdW50LTAwMzgyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1xdWV1ZUNvdW50LWFycmF5bGVuZ3RoIiwgInF1ZXVlQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1xdWV1ZUNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZVF1ZXVlQ3JlYXRlSW5mby1xdWV1ZUZhbWlseUluZGV4LTAwMzgxIiwgInF1ZXVlRmFtaWx5SW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXF1ZXVlRmFtaWx5SW5kZXgtMDAzODEpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlUXVldWVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhULWdsb2JhbFByaW9yaXR5LXBhcmFtZXRlciIsICJnbG9iYWxQcmlvcml0eSBtdXN0IGJlIGEgdmFsaWQgVmtRdWV1ZUdsb2JhbFByaW9yaXR5RVhUIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlUXVldWVHbG9iYWxQcmlvcml0eUNyZWF0ZUluZm9FWFQtZ2xvYmFsUHJpb3JpdHktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZVF1ZXVlR2xvYmFsUHJpb3JpdHlDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX1FVRVVFX0dMT0JBTF9QUklPUklUWV9DUkVBVEVfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VRdWV1ZUdsb2JhbFByaW9yaXR5Q3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VRdWV1ZUluZm8yLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZVF1ZXVlSW5mbzItZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0RldmljZVF1ZXVlSW5mbzItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGV2aWNlUXVldWVJbmZvMi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VRdWV1ZUluZm8yLXF1ZXVlRmFtaWx5SW5kZXgtMDE4NDIiLCAicXVldWVGYW1pbHlJbmRleCBtdXN0IGJlIG9uZSBvZiB0aGUgcXVldWUgZmFtaWx5IGluZGljZXMgc3BlY2lmaWVkIHdoZW4gZGV2aWNlIHdhcyBjcmVhdGVkLCB2aWEgdGhlIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0RldmljZVF1ZXVlSW5mbzItcXVldWVGYW1pbHlJbmRleC0wMTg0MikifSwKKyAgICB7IlZVSUQtVmtEZXZpY2VRdWV1ZUluZm8yLXF1ZXVlSW5kZXgtMDE4NDMiLCAicXVldWVJbmRleCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXVlcyBjcmVhdGVkIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlIGZhbWlseSBpbmRleCBhbmQgVmtEZXZpY2VRdWV1ZUNyZWF0ZUZsYWdzIG1lbWJlciBmbGFncyBlcXVhbCB0byB0aGlzIGZsYWdzIHZhbHVlIHdoZW4gZGV2aWNlIHdhcyBjcmVhdGVkLCB2aWEgdGhlIHF1ZXVlQ291bnQgbWVtYmVyIG9mIHRoZSBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VRdWV1ZUluZm8yLXF1ZXVlSW5kZXgtMDE4NDMpIn0sCisgICAgeyJWVUlELVZrRGV2aWNlUXVldWVJbmZvMi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9JTkZPXzIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEZXZpY2VRdWV1ZUluZm8yLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kLXgtMDA0MTciLCAieCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMF0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwYXRjaEluZGlyZWN0Q29tbWFuZC14LTAwNDE3KSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kLXktMDA0MTgiLCAieSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwYXRjaEluZGlyZWN0Q29tbWFuZC15LTAwNDE4KSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BhdGNoSW5kaXJlY3RDb21tYW5kLXotMDA0MTkiLCAieiBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMl0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwYXRjaEluZGlyZWN0Q29tbWFuZC16LTAwNDE5KSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlFdmVudEluZm9FWFQtZGlzcGxheUV2ZW50LXBhcmFtZXRlciIsICJkaXNwbGF5RXZlbnQgbXVzdCBiZSBhIHZhbGlkIFZrRGlzcGxheUV2ZW50VHlwZUVYVCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlFdmVudEluZm9FWFQtZGlzcGxheUV2ZW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5RXZlbnRJbmZvRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlFdmVudEluZm9FWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheUV2ZW50SW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfRVZFTlRfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5RXZlbnRJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFItZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFItcGFyYW1ldGVycy1wYXJhbWV0ZXIiLCAicGFyYW1ldGVycyBtdXN0IGJlIGEgdmFsaWQgVmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheU1vZGVDcmVhdGVJbmZvS0hSLXBhcmFtZXRlcnMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlNb2RlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9DUkVBVEVfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSLWhlaWdodC0wMTk5MSIsICJUaGUgaGVpZ2h0IG1lbWJlciBvZiB2aXNpYmxlUmVnaW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5TW9kZVBhcmFtZXRlcnNLSFItaGVpZ2h0LTAxOTkxKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUi1yZWZyZXNoUmF0ZS0wMTk5MiIsICJyZWZyZXNoUmF0ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheU1vZGVQYXJhbWV0ZXJzS0hSLXJlZnJlc2hSYXRlLTAxOTkyKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUi13aWR0aC0wMTk5MCIsICJUaGUgd2lkdGggbWVtYmVyIG9mIHZpc2libGVSZWdpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlNb2RlUGFyYW1ldGVyc0tIUi13aWR0aC0wMTk5MCkifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlNb2RlUHJvcGVydGllczJLSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTU9ERV9QUk9QRVJUSUVTXzJfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfTkFUSVZFX0hEUl9TVVJGQUNFX0NBUEFCSUxJVElFU19BTUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0RJU1BMQVlfUExBTkVfQ0FQQUJJTElUSUVTXzJfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5UGxhbmVJbmZvMktIUi1tb2RlLXBhcmFtZXRlciIsICJtb2RlIG11c3QgYmUgYSB2YWxpZCBWa0Rpc3BsYXlNb2RlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSLW1vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlQbGFuZUluZm8yS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QTEFORV9JTkZPXzJfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVBsYW5lSW5mbzJLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1BMQU5FX1BST1BFUlRJRVNfMl9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5UG93ZXJJbmZvRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlQb3dlckluZm9FWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVBvd2VySW5mb0VYVC1wb3dlclN0YXRlLXBhcmFtZXRlciIsICJwb3dlclN0YXRlIG11c3QgYmUgYSB2YWxpZCBWa0Rpc3BsYXlQb3dlclN0YXRlRVhUIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVBvd2VySW5mb0VYVC1wb3dlclN0YXRlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5UG93ZXJJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QT1dFUl9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlQb3dlckluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVByZXNlbnRJbmZvS0hSLWRzdFJlY3QtMDEyNTgiLCAiZHN0UmVjdCBtdXN0IHNwZWNpZnkgYSByZWN0YW5ndWxhciByZWdpb24gdGhhdCBpcyBhIHN1YnNldCBvZiB0aGUgdmlzaWJsZVJlZ2lvbiBwYXJhbWV0ZXIgb2YgdGhlIGRpc3BsYXkgbW9kZSB0aGUgc3dhcGNoYWluIGJlaW5nIHByZXNlbnRlZCB1c2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVByZXNlbnRJbmZvS0hSLWRzdFJlY3QtMDEyNTgpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVByZXNlbnRJbmZvS0hSLXBlcnNpc3RlbnRDb250ZW50LTAxMjU5IiwgIklmIHRoZSBwZXJzaXN0ZW50Q29udGVudCBtZW1iZXIgb2YgdGhlIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgc3RydWN0dXJlIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUiBmb3IgdGhlIGRpc3BsYXkgdGhlIHByZXNlbnQgb3BlcmF0aW9uIHRhcmdldHMgdGhlbiBwZXJzaXN0ZW50IG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5UHJlc2VudEluZm9LSFItcGVyc2lzdGVudENvbnRlbnQtMDEyNTkpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVByZXNlbnRJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUkVTRU5UX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVByZXNlbnRJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUi1zcmNSZWN0LTAxMjU3IiwgInNyY1JlY3QgbXVzdCBzcGVjaWZ5IGEgcmVjdGFuZ3VsYXIgcmVnaW9uIHRoYXQgaXMgYSBzdWJzZXQgb2YgdGhlIGltYWdlIGJlaW5nIHByZXNlbnRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlQcmVzZW50SW5mb0tIUi1zcmNSZWN0LTAxMjU3KSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5UHJvcGVydGllczJLSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVByb3BlcnRpZXMyS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRElTUExBWV9QUk9QRVJUSUVTXzJfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVByb3BlcnRpZXMyS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1hbHBoYU1vZGUtMDEyNTQiLCAiSWYgYWxwaGFNb2RlIGlzIFZLX0RJU1BMQVlfUExBTkVfQUxQSEFfR0xPQkFMX0JJVF9LSFIgdGhlbiBnbG9iYWxBbHBoYSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLWFscGhhTW9kZS0wMTI1NCkifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItYWxwaGFNb2RlLTAxMjU1IiwgImFscGhhTW9kZSBtdXN0IGJlIDAgb3Igb25lIG9mIHRoZSBiaXRzIHByZXNlbnQgaW4gdGhlIHN1cHBvcnRlZEFscGhhIG1lbWJlciBvZiBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiByZXR1cm5lZCBieSB2a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUiBmb3IgdGhlIGRpc3BsYXkgcGxhbmUgY29ycmVzcG9uZGluZyB0byBkaXNwbGF5TW9kZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1hbHBoYU1vZGUtMDEyNTUpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLWFscGhhTW9kZS1wYXJhbWV0ZXIiLCAiYWxwaGFNb2RlIG11c3QgYmUgYSB2YWxpZCBWa0Rpc3BsYXlQbGFuZUFscGhhRmxhZ0JpdHNLSFIgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItYWxwaGFNb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItZGlzcGxheU1vZGUtcGFyYW1ldGVyIiwgImRpc3BsYXlNb2RlIG11c3QgYmUgYSB2YWxpZCBWa0Rpc3BsYXlNb2RlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1kaXNwbGF5TW9kZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wbGFuZUluZGV4LTAxMjUyIiwgInBsYW5lSW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBkaXNwbGF5IHBsYW5lcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBhcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItcGxhbmVJbmRleC0wMTI1MikifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItcGxhbmVSZW9yZGVyUG9zc2libGUtMDEyNTMiLCAiSWYgdGhlIHBsYW5lUmVvcmRlclBvc3NpYmxlIG1lbWJlciBvZiB0aGUgVmtEaXNwbGF5UHJvcGVydGllc0tIUiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSIGZvciB0aGUgZGlzcGxheSBjb3JyZXNwb25kaW5nIHRvIGRpc3BsYXlNb2RlIGlzIFZLX1RSVUUgdGhlbiBwbGFuZVN0YWNrSW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBkaXNwbGF5IHBsYW5lcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBhcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcgdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFI7IG90aGVyd2lzZSBwbGFuZVN0YWNrSW5kZXggbXVzdCBlcXVhbCB0aGUgY3VycmVudFN0YWNrSW5kZXggbWVtYmVyIG9mIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiBmb3IgdGhlIGRpc3BsYXkgcGxhbmUgY29ycmVzcG9uZGluZyB0byBkaXNwbGF5TW9kZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wbGFuZVJlb3JkZXJQb3NzaWJsZS0wMTI1MykifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9ESVNQTEFZX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUi10cmFuc2Zvcm0tcGFyYW1ldGVyIiwgInRyYW5zZm9ybSBtdXN0IGJlIGEgdmFsaWQgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItdHJhbnNmb3JtLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItd2lkdGgtMDEyNTYiLCAiVGhlIHdpZHRoIGFuZCBoZWlnaHQgbWVtYmVycyBvZiBpbWFnZUV4dGVudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWF4SW1hZ2VEaW1lbnNpb25zMkQgbWVtYmVyIG9mIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFItd2lkdGgtMDEyNTYpIn0sCisgICAgeyJWVUlELVZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQtTm9uZS0wMDU1MiIsICJGb3IgYSBnaXZlbiB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFueSBhdHRyaWJ1dGUgZGF0YSBmZXRjaGVkIG11c3QgYmUgZW50aXJlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFzIGRlc2NyaWJlZCBpbiBWZXJ0ZXggSW5wdXQgRGVzY3JpcHRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZC1Ob25lLTAwNTUyKSJ9LAorICAgIHsiVlVJRC1Wa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kLWZpcnN0SW5zdGFuY2UtMDA1NTQiLCAiSWYgdGhlIGRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2UgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmlyc3RJbnN0YW5jZSBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZC1maXJzdEluc3RhbmNlLTAwNTU0KSJ9LAorICAgIHsiVlVJRC1Wa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kLWluZGV4U2l6ZS0wMDU1MyIsICIoaW5kZXhTaXplICogKGZpcnN0SW5kZXggKyBpbmRleENvdW50KSArIG9mZnNldCkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGJvdW5kIGluZGV4IGJ1ZmZlciwgd2l0aCBpbmRleFNpemUgYmVpbmcgYmFzZWQgb24gdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IGluZGV4VHlwZSwgd2hlcmUgdGhlIGluZGV4IGJ1ZmZlciwgaW5kZXhUeXBlLCBhbmQgb2Zmc2V0IGFyZSBzcGVjaWZpZWQgdmlhIHZrQ21kQmluZEluZGV4QnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQtaW5kZXhTaXplLTAwNTUzKSJ9LAorICAgIHsiVlVJRC1Wa0RyYXdJbmRpcmVjdENvbW1hbmQtTm9uZS0wMDUwMCIsICJGb3IgYSBnaXZlbiB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFueSBhdHRyaWJ1dGUgZGF0YSBmZXRjaGVkIG11c3QgYmUgZW50aXJlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFzIGRlc2NyaWJlZCBpbiBWZXJ0ZXggSW5wdXQgRGVzY3JpcHRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEcmF3SW5kaXJlY3RDb21tYW5kLU5vbmUtMDA1MDApIn0sCisgICAgeyJWVUlELVZrRHJhd0luZGlyZWN0Q29tbWFuZC1maXJzdEluc3RhbmNlLTAwNTAxIiwgIklmIHRoZSBkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGZpcnN0SW5zdGFuY2UgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRHJhd0luZGlyZWN0Q29tbWFuZC1maXJzdEluc3RhbmNlLTAwNTAxKSJ9LAorICAgIHsiVlVJRC1Wa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROVi10YXNrQ291bnQtMDIxNzUiLCAidGFza0NvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WOjptYXhEcmF3TWVzaFRhc2tzQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYtdGFza0NvdW50LTAyMTc1KSJ9LAorICAgIHsiVlVJRC1Wa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9EUk1fRk9STUFUX01PRElGSUVSX1BST1BFUlRJRVNfTElTVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V2ZW50Q3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFdmVudENyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrRXZlbnRDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V2ZW50Q3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtFdmVudENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V2ZW50Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtMDE0NDYiLCAiVGhlIGJpdHMgaW4gaGFuZGxlVHlwZXMgbXVzdCBiZSBzdXBwb3J0ZWQgYW5kIGNvbXBhdGlibGUsIGFzIHJlcG9ydGVkIGJ5IFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0RmVuY2VDcmVhdGVJbmZvLWhhbmRsZVR5cGVzLTAxNDQ2KSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLCAiaGFuZGxlVHlwZXMgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4cG9ydEZlbmNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlcy0wMTQ0NyIsICJJZiBWa0V4cG9ydEZlbmNlQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgZG9lcyBub3QgaW5jbHVkZSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklULCBhIFZrRXhwb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFIgc3RydWN0dXJlIG11c3Qgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBvZiBWa0ZlbmNlQ3JlYXRlSW5mby4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlcy0wMTQ0NykifSwKKyAgICB7IlZVSUQtVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1wQXR0cmlidXRlcy1wYXJhbWV0ZXIiLCAiSWYgcEF0dHJpYnV0ZXMgaXMgbm90IE5VTEwsIHBBdHRyaWJ1dGVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgU0VDVVJJVFlfQVRUUklCVVRFUyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4cG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLXBBdHRyaWJ1dGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9GRU5DRV9XSU4zMl9IQU5ETEVfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8taGFuZGxlVHlwZXMtMDA2NTYiLCAiVGhlIGJpdHMgaW4gaGFuZGxlVHlwZXMgbXVzdCBiZSBzdXBwb3J0ZWQgYW5kIGNvbXBhdGlibGUsIGFzIHJlcG9ydGVkIGJ5IFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgb3IgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvLWhhbmRsZVR5cGVzLTAwNjU2KSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLCAiaGFuZGxlVHlwZXMgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvLWhhbmRsZVR5cGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYtaGFuZGxlVHlwZXMtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGVzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYtaGFuZGxlVHlwZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGVzLTAwNjU3IiwgIklmIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOjpoYW5kbGVUeXBlcyBkb2VzIG5vdCBpbmNsdWRlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklULCBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQsIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVCwgb3IgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVCwgYSBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiBzdHJ1Y3R1cmUgbXVzdCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIFZrTWVtb3J5QWxsb2NhdGVJbmZvLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlcy0wMDY1NykifSwKKyAgICB7IlZVSUQtVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItcEF0dHJpYnV0ZXMtcGFyYW1ldGVyIiwgIklmIHBBdHRyaWJ1dGVzIGlzIG5vdCBOVUxMLCBwQXR0cmlidXRlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFNFQ1VSSVRZX0FUVFJJQlVURVMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItcEF0dHJpYnV0ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLXBBdHRyaWJ1dGVzLXBhcmFtZXRlciIsICJJZiBwQXR0cmlidXRlcyBpcyBub3QgTlVMTCwgcEF0dHJpYnV0ZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBTRUNVUklUWV9BVFRSSUJVVEVTIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtcEF0dHJpYnV0ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtMDExMjQiLCAiVGhlIGJpdHMgaW4gaGFuZGxlVHlwZXMgbXVzdCBiZSBzdXBwb3J0ZWQgYW5kIGNvbXBhdGlibGUsIGFzIHJlcG9ydGVkIGJ5IFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtMDExMjQpIn0sCisgICAgeyJWVUlELVZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLCAiaGFuZGxlVHlwZXMgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlcy0wMTEyNSIsICJJZiBWa0V4cG9ydFNlbWFwaG9yZUNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIGRvZXMgbm90IGluY2x1ZGUgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVQgb3IgVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX0QzRDEyX0ZFTkNFX0JJVCwgVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgbXVzdCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIFZrU2VtYXBob3JlQ3JlYXRlSW5mby4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZXMtMDExMjUpIn0sCisgICAgeyJWVUlELVZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLXBBdHRyaWJ1dGVzLXBhcmFtZXRlciIsICJJZiBwQXR0cmlidXRlcyBpcyBub3QgTlVMTCwgcEF0dHJpYnV0ZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBTRUNVUklUWV9BVFRSSUJVVEVTIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXhwb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLXBBdHRyaWJ1dGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4cG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0JVRkZFUl9QUk9QRVJUSUVTIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRkVOQ0VfUFJPUEVSVElFUyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V4dGVybmFsRm9ybWF0QU5EUk9JRC1leHRlcm5hbEZvcm1hdC0wMTg5NCIsICJleHRlcm5hbEZvcm1hdCBtdXN0IGJlIDAgb3IgYSB2YWx1ZSByZXR1cm5lZCBpbiB0aGUgZXh0ZXJuYWxGb3JtYXQgbWVtYmVyIG9mIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgYnkgYW4gZWFybGllciBjYWxsIHRvIHZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQtZXh0ZXJuYWxGb3JtYXQtMDE4OTQpIn0sCisgICAgeyJWVUlELVZrRXh0ZXJuYWxGb3JtYXRBTkRST0lELXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfUFJPUEVSVElFUyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIiLCAiaGFuZGxlVHlwZXMgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvLWhhbmRsZVR5cGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfQlVGRkVSX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvLWhhbmRsZVR5cGVzLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlcyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8taGFuZGxlVHlwZXMtcmVxdWlyZWRiaXRtYXNrIiwgImhhbmRsZVR5cGVzIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mby1oYW5kbGVUeXBlcy1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WLWhhbmRsZVR5cGVzLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlcyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0c05WIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYtaGFuZGxlVHlwZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRmVuY2VDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtGZW5jZUNyZWF0ZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRmVuY2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgIkVhY2ggcE5leHQgbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm8gb3IgVmtFeHBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtGZW5jZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtGZW5jZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItZmVuY2UtMDE0NTUiLCAiZmVuY2UgbXVzdCBub3QgY3VycmVudGx5IGhhdmUgaXRzIHBheWxvYWQgcmVwbGFjZWQgYnkgYW4gaW1wb3J0ZWQgcGF5bG9hZCBhcyBkZXNjcmliZWQgYmVsb3cgaW4gSW1wb3J0aW5nIEZlbmNlIFBheWxvYWRzIHVubGVzcyB0aGF0IGltcG9ydGVkIHBheWxvYWQncyBoYW5kbGUgdHlwZSB3YXMgaW5jbHVkZWQgaW4gVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllczo6ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgZm9yIGhhbmRsZVR5cGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItZmVuY2UtMDE0NTUpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItZmVuY2UtcGFyYW1ldGVyIiwgImZlbmNlIG11c3QgYmUgYSB2YWxpZCBWa0ZlbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLWZlbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtGZW5jZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDUzIiwgImhhbmRsZVR5cGUgbXVzdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIHdoZW4gZmVuY2UncyBjdXJyZW50IHBheWxvYWQgd2FzIGNyZWF0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTQ1MykifSwKKyAgICB7IlZVSUQtVmtGZW5jZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDU0IiwgIklmIGhhbmRsZVR5cGUgcmVmZXJzIHRvIGEgaGFuZGxlIHR5cGUgd2l0aCBjb3B5IHBheWxvYWQgdHJhbnNmZXJlbmNlIHNlbWFudGljcywgZmVuY2UgbXVzdCBiZSBzaWduYWxlZCwgb3IgaGF2ZSBhbiBhc3NvY2lhdGVkIGZlbmNlIHNpZ25hbCBvcGVyYXRpb24gcGVuZGluZyBleGVjdXRpb24uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTQ1NCkifSwKKyAgICB7IlZVSUQtVmtGZW5jZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDU2IiwgImhhbmRsZVR5cGUgbXVzdCBiZSBkZWZpbmVkIGFzIGEgUE9TSVggZmlsZSBkZXNjcmlwdG9yIGhhbmRsZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGZW5jZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDU2KSJ9LAorICAgIHsiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0ZlbmNlR2V0RmRJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfR0VUX0ZEX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmVuY2VHZXRGZEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItZmVuY2UtMDE0NTAiLCAiZmVuY2UgbXVzdCBub3QgY3VycmVudGx5IGhhdmUgaXRzIHBheWxvYWQgcmVwbGFjZWQgYnkgYW4gaW1wb3J0ZWQgcGF5bG9hZCBhcyBkZXNjcmliZWQgYmVsb3cgaW4gSW1wb3J0aW5nIEZlbmNlIFBheWxvYWRzIHVubGVzcyB0aGF0IGltcG9ydGVkIHBheWxvYWQncyBoYW5kbGUgdHlwZSB3YXMgaW5jbHVkZWQgaW4gVmtFeHRlcm5hbEZlbmNlUHJvcGVydGllczo6ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgZm9yIGhhbmRsZVR5cGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItZmVuY2UtMDE0NTApIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItZmVuY2UtcGFyYW1ldGVyIiwgImZlbmNlIG11c3QgYmUgYSB2YWxpZCBWa0ZlbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWZlbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDQ4IiwgImhhbmRsZVR5cGUgbXVzdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIHdoZW4gdGhlIGZlbmNlJ3MgY3VycmVudCBwYXlsb2FkIHdhcyBjcmVhdGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NDgpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ0OSIsICJJZiBoYW5kbGVUeXBlIGlzIGRlZmluZWQgYXMgYW4gTlQgaGFuZGxlLCB2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIgbXVzdCBiZSBjYWxsZWQgbm8gbW9yZSB0aGFuIG9uY2UgZm9yIGVhY2ggdmFsaWQgdW5pcXVlIGNvbWJpbmF0aW9uIG9mIGZlbmNlIGFuZCBoYW5kbGVUeXBlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NDkpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ1MSIsICJJZiBoYW5kbGVUeXBlIHJlZmVycyB0byBhIGhhbmRsZSB0eXBlIHdpdGggY29weSBwYXlsb2FkIHRyYW5zZmVyZW5jZSBzZW1hbnRpY3MsIGZlbmNlIG11c3QgYmUgc2lnbmFsZWQsIG9yIGhhdmUgYW4gYXNzb2NpYXRlZCBmZW5jZSBzaWduYWwgb3BlcmF0aW9uIHBlbmRpbmcgZXhlY3V0aW9uLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NTEpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ1MiIsICJoYW5kbGVUeXBlIG11c3QgYmUgZGVmaW5lZCBhcyBhbiBOVCBoYW5kbGUgb3IgYSBnbG9iYWwgc2hhcmUgaGFuZGxlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NTIpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiaGFuZGxlVHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtFeHRlcm5hbEZlbmNlSGFuZGxlVHlwZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmVuY2VHZXRXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQtcE5leHQtMDI2MjciLCAiSWYgdGhlIHBOZXh0IGNoYWluIG9mIHRoZSBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgc3RydWN0dXJlIGluY2x1ZGVzIGEgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCBzdHJ1Y3R1cmUsIHRoZSBwTmV4dCBjaGFpbiBvZiB0aGUgVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzIgc3RydWN0dXJlIG11c3QgaW5jbHVkZSBhIFZrUGh5c2ljYWxEZXZpY2VJbWFnZVZpZXdJbWFnZUZvcm1hdEluZm9FWFQgc3RydWN0dXJlIHdpdGggYW4gaW1hZ2VWaWV3VHlwZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBpbWFnZVR5cGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQtcE5leHQtMDI2MjcpIn0sCisgICAgeyJWVUlELVZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9GSUxURVJfQ1VCSUNfSU1BR0VfVklFV19JTUFHRV9GT1JNQVRfUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtGb3JtYXRQcm9wZXJ0aWVzMi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNMaXN0RVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRm9ybWF0UHJvcGVydGllczItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrRm9ybWF0UHJvcGVydGllczItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9GT1JNQVRfUFJPUEVSVElFU18yIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRm9ybWF0UHJvcGVydGllczItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFItcFZpZXdGb3JtYXRzLXBhcmFtZXRlciIsICJJZiB2aWV3Rm9ybWF0Q291bnQgaXMgbm90IDAsIHBWaWV3Rm9ybWF0cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aWV3Rm9ybWF0Q291bnQgdmFsaWQgVmtGb3JtYXQgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSLXBWaWV3Rm9ybWF0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFItdXNhZ2UtcGFyYW1ldGVyIiwgInVzYWdlIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlVXNhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFItdXNhZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUi11c2FnZS1yZXF1aXJlZGJpdG1hc2siLCAidXNhZ2UgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUi11c2FnZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFItcEF0dGFjaG1lbnRJbWFnZUluZm9zLXBhcmFtZXRlciIsICJJZiBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQgaXMgbm90IDAsIHBBdHRhY2htZW50SW1hZ2VJbmZvcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdHRhY2htZW50SW1hZ2VJbmZvQ291bnQgdmFsaWQgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSLXBBdHRhY2htZW50SW1hZ2VJbmZvcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tYXR0YWNobWVudENvdW50LTAwODc2IiwgImF0dGFjaG1lbnRDb3VudCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBhdHRhY2htZW50IGNvdW50IHNwZWNpZmllZCBpbiByZW5kZXJQYXNzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWF0dGFjaG1lbnRDb3VudC0wMDg3NikifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tY29tbW9ucGFyZW50IiwgIkJvdGggb2YgcmVuZGVyUGFzcywgYW5kIHRoZSBlbGVtZW50cyBvZiBwQXR0YWNobWVudHMgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMjc3OCIsICJJZiBmbGFncyBkb2VzIG5vdCBpbmNsdWRlIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgYW5kIGF0dGFjaG1lbnRDb3VudCBpcyBub3QgMCwgcEF0dGFjaG1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGF0dGFjaG1lbnRDb3VudCB2YWxpZCBWa0ltYWdlVmlldyBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAyNzc4KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE4OCIsICJJZiBmbGFncyBkb2VzIG5vdCBpbmNsdWRlIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgYW5kIGF0dGFjaG1lbnRDb3VudCBpcyBub3QgMCwgcEF0dGFjaG1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGF0dGFjaG1lbnRDb3VudCB2YWxpZCBWa0ltYWdlVmlldyBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTg4KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE4OSIsICJJZiB0aGUgaW1hZ2VsZXNzIGZyYW1lYnVmZmVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGZsYWdzIG11c3Qgbm90IGluY2x1ZGUgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTg5KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5MCIsICJJZiBmbGFncyBpbmNsdWRlcyBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgYSBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5MCkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTEiLCAiSWYgZmxhZ3MgaW5jbHVkZXMgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCB0aGUgYXR0YWNobWVudEltYWdlSW5mb0NvdW50IG1lbWJlciBvZiBhIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciB6ZXJvIG9yIGF0dGFjaG1lbnRDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5MSkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTIiLCAiSWYgZmxhZ3MgaW5jbHVkZXMgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCB0aGUgd2lkdGggbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudEltYWdlSW5mb3MgbWVtYmVyIG9mIGEgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHdpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTkyKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5MyIsICJJZiBmbGFncyBpbmNsdWRlcyBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIHRoZSBoZWlnaHQgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudEltYWdlSW5mb3MgbWVtYmVyIG9mIGEgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGhlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5MykifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTQiLCAiSWYgZmxhZ3MgaW5jbHVkZXMgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCB0aGUgd2lkdGggbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudEltYWdlSW5mb3MgbWVtYmVyIG9mIGEgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHdpZHRoLCBleGNlcHQgZm9yIGFueSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUOjpmcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50IGluIHJlbmRlclBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTQpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTk1IiwgIklmIGZsYWdzIGluY2x1ZGVzIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgdGhlIGhlaWdodCBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgdGhlIHBBdHRhY2htZW50SW1hZ2VJbmZvcyBtZW1iZXIgb2YgYSBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gaGVpZ2h0LCBleGNlcHQgZm9yIGFueSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUOjpmcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50IGluIHJlbmRlclBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTUpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTk2IiwgIklmIGZsYWdzIGluY2x1ZGVzIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgdGhlIHdpZHRoIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiB0aGUgcEF0dGFjaG1lbnRJbWFnZUluZm9zIG1lbWJlciBvZiBhIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVDo6ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCBpbiByZW5kZXJQYXNzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjZWlsaW5nIG9mIHdpZHRoL21heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZS53aWR0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5NikifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMxOTciLCAiSWYgZmxhZ3MgaW5jbHVkZXMgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCB0aGUgaGVpZ2h0IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiB0aGUgcEF0dGFjaG1lbnRJbWFnZUluZm9zIG1lbWJlciBvZiBhIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVDo6ZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCBpbiByZW5kZXJQYXNzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjZWlsaW5nIG9mIGhlaWdodC9tYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemUuaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTk3KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMCIsICJJZiBmbGFncyBpbmNsdWRlcyBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIHRoZSBsYXllckNvdW50IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiB0aGUgcEF0dGFjaG1lbnRJbWFnZUluZm9zIG1lbWJlciBvZiBhIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBsYXllcnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDApIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAxIiwgIklmIGZsYWdzIGluY2x1ZGVzIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgdGhlIHVzYWdlIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiB0aGUgcEF0dGFjaG1lbnRJbWFnZUluZm9zIG1lbWJlciBvZiBhIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiB0aGF0IHJlZmVycyB0byBhbiBhdHRhY2htZW50IHVzZWQgYXMgYSBjb2xvciBhdHRhY2htZW50IG9yIHJlc29sdmUgYXR0YWNobWVudCBieSByZW5kZXJQYXNzIG11c3QgaW5jbHVkZSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMSkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDIiLCAiSWYgZmxhZ3MgaW5jbHVkZXMgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCB0aGUgdXNhZ2UgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudEltYWdlSW5mb3MgbWVtYmVyIG9mIGEgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIHRoYXQgcmVmZXJzIHRvIGFuIGF0dGFjaG1lbnQgdXNlZCBhcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCBieSByZW5kZXJQYXNzIG11c3QgaW5jbHVkZSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAyKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMyIsICJJZiBmbGFncyBpbmNsdWRlcyBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIHRoZSB1c2FnZSBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgdGhlIHBBdHRhY2htZW50SW1hZ2VJbmZvcyBtZW1iZXIgb2YgYSBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gdGhhdCByZWZlcnMgdG8gYW4gYXR0YWNobWVudCB1c2VkIGFzIGEgZGVwdGgvc3RlbmNpbCByZXNvbHZlIGF0dGFjaG1lbnQgYnkgcmVuZGVyUGFzcyBtdXN0IGluY2x1ZGUgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMykifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDQiLCAiSWYgZmxhZ3MgaW5jbHVkZXMgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCB0aGUgdXNhZ2UgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudEltYWdlSW5mb3MgbWVtYmVyIG9mIGEgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIHRoYXQgcmVmZXJzIHRvIGFuIGF0dGFjaG1lbnQgdXNlZCBhcyBhbiBpbnB1dCBhdHRhY2htZW50IGJ5IHJlbmRlclBhc3MgbXVzdCBpbmNsdWRlIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjA0KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwNSIsICJJZiBmbGFncyBpbmNsdWRlcyBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGF0IGxlYXN0IG9uZSBlbGVtZW50IG9mIHRoZSBwVmlld0Zvcm1hdHMgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudEltYWdlSW5mb3MgbWVtYmVyIG9mIGEgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2YgVmtBdHRhY2htZW50RGVzY3JpcHRpb246OmZvcm1hdCB1c2VkIHRvIGNyZWF0ZSByZW5kZXJQYXNzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjA1KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRnJhbWVidWZmZXJDcmVhdGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1oZWlnaHQtMDA4ODciLCAiaGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWhlaWdodC0wMDg4NykifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8taGVpZ2h0LTAwODg4IiwgImhlaWdodCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhGcmFtZWJ1ZmZlckhlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1oZWlnaHQtMDA4ODgpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWxheWVycy0wMDg4OSIsICJsYXllcnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tbGF5ZXJzLTAwODg5KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1sYXllcnMtMDA4OTAiLCAibGF5ZXJzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEZyYW1lYnVmZmVyTGF5ZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWxheWVycy0wMDg5MCkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODc3IiwgIklmIGZsYWdzIGRvZXMgbm90IGluY2x1ZGUgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBlYWNoIGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIHRoYXQgaXMgdXNlZCBhcyBhIGNvbG9yIGF0dGFjaG1lbnQgb3IgcmVzb2x2ZSBhdHRhY2htZW50IGJ5IHJlbmRlclBhc3MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgdXNhZ2UgdmFsdWUgaW5jbHVkaW5nIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg3NykifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODc5IiwgIklmIGZsYWdzIGRvZXMgbm90IGluY2x1ZGUgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBlYWNoIGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIHRoYXQgaXMgdXNlZCBhcyBhbiBpbnB1dCBhdHRhY2htZW50IGJ5IHJlbmRlclBhc3MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgdXNhZ2UgdmFsdWUgaW5jbHVkaW5nIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg3OSkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODgwIiwgIklmIGZsYWdzIGRvZXMgbm90IGluY2x1ZGUgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBlYWNoIGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIFZrRm9ybWF0IHZhbHVlIHRoYXQgbWF0Y2hlcyB0aGUgVmtGb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGluIHJlbmRlclBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODgwKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODEiLCAiSWYgZmxhZ3MgZG9lcyBub3QgaW5jbHVkZSBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiBwQXR0YWNobWVudHMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgc2FtcGxlcyB2YWx1ZSB0aGF0IG1hdGNoZXMgdGhlIHNhbXBsZXMgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGluIHJlbmRlclBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODgxKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODIiLCAiSWYgZmxhZ3MgZG9lcyBub3QgaW5jbHVkZSBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiBwQXR0YWNobWVudHMgbXVzdCBoYXZlIGRpbWVuc2lvbnMgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZnJhbWVidWZmZXIgZGltZW5zaW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4MikifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODgzIiwgIklmIGZsYWdzIGRvZXMgbm90IGluY2x1ZGUgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBlYWNoIGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIG11c3Qgb25seSBzcGVjaWZ5IGEgc2luZ2xlIG1pcCBsZXZlbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODMpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4NCIsICJJZiBmbGFncyBkb2VzIG5vdCBpbmNsdWRlIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgZWFjaCBlbGVtZW50IG9mIHBBdHRhY2htZW50cyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIGlkZW50aXR5IHN3aXp6bGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODg0KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4OTEiLCAiSWYgZmxhZ3MgZG9lcyBub3QgaW5jbHVkZSBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiBwQXR0YWNobWVudHMgdGhhdCBpcyBhIDJEIG9yIDJEIGFycmF5IGltYWdlIHZpZXcgdGFrZW4gZnJvbSBhIDNEIGltYWdlIG11c3Qgbm90IGJlIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODkxKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI1NTIiLCAiRWFjaCBlbGVtZW50IG9mIHBBdHRhY2htZW50cyB0aGF0IGlzIHVzZWQgYXMgYSBmcmFnbWVudCBkZW5zaXR5IG1hcCBhdHRhY2htZW50IGJ5IHJlbmRlclBhc3MgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIGZsYWdzIHZhbHVlIGluY2x1ZGluZyBWS19JTUFHRV9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI1NTIpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjU1NCIsICJJZiBmbGFncyBkb2VzIG5vdCBpbmNsdWRlIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgZWFjaCBlbGVtZW50IG9mIHBBdHRhY2htZW50cyBtdXN0IGhhdmUgZGltZW5zaW9ucyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgY29ycmVzcG9uZGluZyBmcmFtZWJ1ZmZlciBkaW1lbnNpb24gZXhjZXB0IGZvciBhbnkgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI1NTQpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjU1NSIsICJJZiBmbGFncyBkb2VzIG5vdCBpbmNsdWRlIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgYW4gZWxlbWVudCBvZiBwQXR0YWNobWVudHMgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgbXVzdCBoYXZlIGEgd2lkdGggYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGNlaWxpbmcgb2Ygd2lkdGgvbWF4RnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplLndpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjU1NSkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNTU2IiwgIklmIGZsYWdzIGRvZXMgbm90IGluY2x1ZGUgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBhbiBlbGVtZW50IG9mIHBBdHRhY2htZW50cyB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCBtdXN0IGhhdmUgYSBoZWlnaHQgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGNlaWxpbmcgb2YgaGVpZ2h0L21heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZS5oZWlnaHQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNTU2KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI2MzMiLCAiSWYgZmxhZ3MgZG9lcyBub3QgaW5jbHVkZSBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiBwQXR0YWNobWVudHMgdGhhdCBpcyB1c2VkIGFzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGJ5IHJlbmRlclBhc3MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgdXNhZ2UgdmFsdWUgaW5jbHVkaW5nIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNjMzKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI2MzQiLCAiSWYgZmxhZ3MgZG9lcyBub3QgaW5jbHVkZSBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiBwQXR0YWNobWVudHMgdGhhdCBpcyB1c2VkIGFzIGEgZGVwdGgvc3RlbmNpbCByZXNvbHZlIGF0dGFjaG1lbnQgYnkgcmVuZGVyUGFzcyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDI2MzQpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjc0NCIsICJBbiBlbGVtZW50IG9mIHBBdHRhY2htZW50cyB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCBtdXN0IGhhdmUgYSBsYXllckNvdW50IGVxdWFsIHRvIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNzQ0KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjUzMSIsICJJZiByZW5kZXJQYXNzIHdhcyBzcGVjaWZpZWQgd2l0aCBub24temVybyB2aWV3IG1hc2tzLCBsYXllcnMgbXVzdCBiZSAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDI1MzEpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDI1NTMiLCAiSWYgcmVuZGVyUGFzcyBoYXMgYSBmcmFnbWVudCBkZW5zaXR5IG1hcCBhdHRhY2htZW50IGFuZCBub24tc3Vic2FtcGxlIGltYWdlIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGVhY2ggZWxlbWVudCBvZiBwQXR0YWNobWVudHMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgZmxhZ3MgdmFsdWUgaW5jbHVkaW5nIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQgdW5sZXNzIHRoYXQgZWxlbWVudCBpcyB0aGUgZnJhZ21lbnQgZGVuc2l0eSBtYXAgYXR0YWNobWVudC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjU1MykifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjc0MyIsICJJZiByZW5kZXJQYXNzIHdhcyBzcGVjaWZpZWQgd2l0aCBub24temVybyB2aWV3IG1hc2tzLCBlYWNoIGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIG11c3QgaGF2ZSBhIGxheWVyQ291bnQgZ3JlYXRlciB0aGFuIHRoZSBpbmRleCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0IGluIGFueSBvZiB0aG9zZSB2aWV3IG1hc2tzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDI3NDMpIn0sCisgICAgeyJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDI3NDUiLCAiSWYgcmVuZGVyUGFzcyB3YXMgc3BlY2lmaWVkIHdpdGggbm9uLXplcm8gdmlldyBtYXNrcywgZWFjaCBlbGVtZW50IG9mIHBBdHRhY2htZW50cyB0aGF0IGlzIG5vdCByZWZlcmVuY2VkIGJ5IGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgbXVzdCBoYXZlIGEgbGF5ZXJDb3VudCBncmVhdGVyIHRoYW4gdGhlIGluZGV4IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBzZXQgaW4gYW55IG9mIHRob3NlIHZpZXcgbWFza3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjc0NSkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjc0NiIsICJJZiByZW5kZXJQYXNzIHdhcyBzcGVjaWZpZWQgd2l0aCBub24temVybyB2aWV3IG1hc2tzLCBlYWNoIGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIHRoYXQgaXMgcmVmZXJlbmNlZCBieSBmcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50IG11c3QgaGF2ZSBhIGxheWVyQ291bnQgZXF1YWwgdG8gMSBvciBncmVhdGVyIHRoYW4gdGhlIGluZGV4IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBzZXQgaW4gYW55IG9mIHRob3NlIHZpZXcgbWFza3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjc0NikifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjc0NyIsICJJZiByZW5kZXJQYXNzIHdhcyBub3Qgc3BlY2lmaWVkIHdpdGggbm9uLXplcm8gdmlldyBtYXNrcywgZWFjaCBlbGVtZW50IG9mIHBBdHRhY2htZW50cyB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCBtdXN0IGhhdmUgYSBsYXllckNvdW50IGVxdWFsIHRvIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMjc0NykifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMzE5OCIsICJJZiBtdWx0aXZpZXcgaXMgZW5hYmxlZCBmb3IgcmVuZGVyUGFzcywgYW5kIGZsYWdzIGluY2x1ZGVzIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgdGhlIGxheWVyQ291bnQgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudEltYWdlSW5mb3MgbWVtYmVyIG9mIGEgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGJpdCBpbmRleCBzZXQgaW4gdGhlIHZpZXcgbWFzayBpbiB0aGUgc3VicGFzc2VzIGluIHdoaWNoIGl0IGlzIHVzZWQgaW4gcmVuZGVyUGFzcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAzMTk4KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAzMTk5IiwgIklmIG11bHRpdmlldyBpcyBub3QgZW5hYmxlZCBmb3IgcmVuZGVyUGFzcywgYW5kIGZsYWdzIGluY2x1ZGVzIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgdGhlIGxheWVyQ291bnQgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudEltYWdlSW5mb3MgbWVtYmVyIG9mIGEgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGxheWVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAzMTk5KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLXBhcmFtZXRlciIsICJyZW5kZXJQYXNzIG11c3QgYmUgYSB2YWxpZCBWa1JlbmRlclBhc3MgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby13aWR0aC0wMDg4NSIsICJ3aWR0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby13aWR0aC0wMDg4NSkifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8td2lkdGgtMDA4ODYiLCAid2lkdGggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RnJhbWVidWZmZXJXaWR0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby13aWR0aC0wMDg4NikifSwKKyAgICB7IlZVSUQtVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0ZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25OVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX01JWEVEX1NBTVBMRVNfQ09NQklOQVRJT05fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlBQUJCTlYtYWFiYkRhdGEtcGFyYW1ldGVyIiwgIklmIGFhYmJEYXRhIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgYWFiYkRhdGEgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dlb21ldHJ5QUFCQk5WLWFhYmJEYXRhLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeUFBQkJOVi1vZmZzZXQtMDI0MzkiLCAib2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGFhYmJEYXRhIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlBQUJCTlYtb2Zmc2V0LTAyNDM5KSJ9LAorICAgIHsiVlVJRC1Wa0dlb21ldHJ5QUFCQk5WLW9mZnNldC0wMjQ0MCIsICJvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeUFBQkJOVi1vZmZzZXQtMDI0NDApIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlBQUJCTlYtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlBQUJCTlYtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlBQUJCTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlBQUJCTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlBQUJCTlYtc3RyaWRlLTAyNDQxIiwgInN0cmlkZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dlb21ldHJ5QUFCQk5WLXN0cmlkZS0wMjQ0MSkifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeURhdGFOVi1hYWJicy1wYXJhbWV0ZXIiLCAiYWFiYnMgbXVzdCBiZSBhIHZhbGlkIFZrR2VvbWV0cnlBQUJCTlYgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlEYXRhTlYtYWFiYnMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0dlb21ldHJ5RGF0YU5WLXRyaWFuZ2xlcy1wYXJhbWV0ZXIiLCAidHJpYW5nbGVzIG11c3QgYmUgYSB2YWxpZCBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlEYXRhTlYtdHJpYW5nbGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeU5WLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtHZW9tZXRyeUZsYWdCaXRzTlYgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlOVi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlOVi1nZW9tZXRyeS1wYXJhbWV0ZXIiLCAiZ2VvbWV0cnkgbXVzdCBiZSBhIHZhbGlkIFZrR2VvbWV0cnlEYXRhTlYgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlOVi1nZW9tZXRyeS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlOVi1nZW9tZXRyeVR5cGUtcGFyYW1ldGVyIiwgImdlb21ldHJ5VHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtHZW9tZXRyeVR5cGVOViB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dlb21ldHJ5TlYtZ2VvbWV0cnlUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeU5WLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dlb21ldHJ5TlYtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlOVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlOVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWNvbW1vbnBhcmVudCIsICJFYWNoIG9mIGluZGV4RGF0YSwgdHJhbnNmb3JtRGF0YSwgYW5kIHZlcnRleERhdGEgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4Q291bnQtMDI0MzYiLCAiaW5kZXhDb3VudCBtdXN0IGJlIDAgaWYgaW5kZXhUeXBlIGlzIFZLX0lOREVYX1RZUEVfTk9ORV9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhDb3VudC0wMjQzNikifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4RGF0YS0wMjQzNCIsICJpbmRleERhdGEgbXVzdCBiZSBWS19OVUxMX0hBTkRMRSBpZiBpbmRleFR5cGUgaXMgVktfSU5ERVhfVFlQRV9OT05FX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleERhdGEtMDI0MzQpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleERhdGEtMDI0MzUiLCAiaW5kZXhEYXRhIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgaWYgaW5kZXhUeXBlIGlzIG5vdCBWS19JTkRFWF9UWVBFX05PTkVfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4RGF0YS0wMjQzNSkifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4RGF0YS1wYXJhbWV0ZXIiLCAiSWYgaW5kZXhEYXRhIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaW5kZXhEYXRhIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4RGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleE9mZnNldC0wMjQzMSIsICJpbmRleE9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBpbmRleERhdGEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4T2Zmc2V0LTAyNDMxKSJ9LAorICAgIHsiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhPZmZzZXQtMDI0MzIiLCAiaW5kZXhPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBlbGVtZW50IHNpemUgb2YgaW5kZXhUeXBlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleE9mZnNldC0wMjQzMikifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4VHlwZS0wMjQzMyIsICJpbmRleFR5cGUgbXVzdCBiZSBWS19JTkRFWF9UWVBFX1VJTlQxNiwgVktfSU5ERVhfVFlQRV9VSU5UMzIsIG9yIFZLX0lOREVYX1RZUEVfTk9ORV9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhUeXBlLTAyNDMzKSJ9LAorICAgIHsiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhUeXBlLXBhcmFtZXRlciIsICJpbmRleFR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrSW5kZXhUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleFR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXRyYW5zZm9ybURhdGEtcGFyYW1ldGVyIiwgIklmIHRyYW5zZm9ybURhdGEgaXMgbm90IFZLX05VTExfSEFORExFLCB0cmFuc2Zvcm1EYXRhIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXRyYW5zZm9ybURhdGEtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdHJhbnNmb3JtT2Zmc2V0LTAyNDM3IiwgInRyYW5zZm9ybU9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0cmFuc2Zvcm1EYXRhIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi10cmFuc2Zvcm1PZmZzZXQtMDI0MzcpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi10cmFuc2Zvcm1PZmZzZXQtMDI0MzgiLCAidHJhbnNmb3JtT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdHJhbnNmb3JtT2Zmc2V0LTAyNDM4KSJ9LAorICAgIHsiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdmVydGV4RGF0YS1wYXJhbWV0ZXIiLCAiSWYgdmVydGV4RGF0YSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHZlcnRleERhdGEgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdmVydGV4RGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi12ZXJ0ZXhGb3JtYXQtMDI0MzAiLCAidmVydGV4Rm9ybWF0IG11c3QgYmUgb25lIG9mIFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FULCBWS19GT1JNQVRfUjMyRzMyX1NGTE9BVCwgVktfRk9STUFUX1IxNkcxNkIxNl9TRkxPQVQsIFZLX0ZPUk1BVF9SMTZHMTZfU0ZMT0FULCBWS19GT1JNQVRfUjE2RzE2X1NOT1JNLCBvciBWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi12ZXJ0ZXhGb3JtYXQtMDI0MzApIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi12ZXJ0ZXhGb3JtYXQtcGFyYW1ldGVyIiwgInZlcnRleEZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleEZvcm1hdC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi12ZXJ0ZXhPZmZzZXQtMDI0MjgiLCAidmVydGV4T2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHZlcnRleERhdGEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleE9mZnNldC0wMjQyOCkifSwKKyAgICB7IlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleE9mZnNldC0wMjQyOSIsICJ2ZXJ0ZXhPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wb25lbnQgc2l6ZSBvZiB2ZXJ0ZXhGb3JtYXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleE9mZnNldC0wMjQyOSkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1Ob25lLTAyMzIyIiwgIklmIHRoZXJlIGFyZSBhbnkgbWVzaCBzaGFkZXIgc3RhZ2VzIGluIHRoZSBwaXBlbGluZSB0aGVyZSBtdXN0IG5vdCBiZSBhbnkgc2hhZGVyIHN0YWdlIGluIHRoZSBwaXBlbGluZSB3aXRoIGEgWGZiIGV4ZWN1dGlvbiBtb2RlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLU5vbmUtMDIzMjIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tYXR0YWNobWVudENvdW50LTAwNzQ2IiwgIklmIHJhc3Rlcml6YXRpb24gaXMgbm90IGRpc2FibGVkIGFuZCB0aGUgc3VicGFzcyB1c2VzIGNvbG9yIGF0dGFjaG1lbnRzLCB0aGUgYXR0YWNobWVudENvdW50IG1lbWJlciBvZiBwQ29sb3JCbGVuZFN0YXRlIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNvbG9yQXR0YWNobWVudENvdW50IHVzZWQgdG8gY3JlYXRlIHN1YnBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1hdHRhY2htZW50Q291bnQtMDA3NDYpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tYmxlbmRFbmFibGUtMDIwMjMiLCAiSWYgcmFzdGVyaXphdGlvbiBpcyBub3QgZGlzYWJsZWQgYW5kIHRoZSBzdWJwYXNzIHVzZXMgY29sb3IgYXR0YWNobWVudHMsIHRoZW4gZm9yIGVhY2ggY29sb3IgYXR0YWNobWVudCBpbiB0aGUgc3VicGFzcyB0aGUgYmxlbmRFbmFibGUgbWVtYmVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHBBdHRhY2htZW50IG1lbWJlciBvZiBwQ29sb3JCbGVuZFN0YXRlIG11c3QgYmUgVktfRkFMU0UgaWYgdGhlIGF0dGFjaGVkIGltYWdlJ3MgZm9ybWF0IGZlYXR1cmVzIGRvZXMgbm90IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CTEVORF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tYmxlbmRFbmFibGUtMDIwMjMpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tY29tbW9ucGFyZW50IiwgIkVhY2ggb2YgYmFzZVBpcGVsaW5lSGFuZGxlLCBsYXlvdXQsIGFuZCByZW5kZXJQYXNzIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWNvdmVyYWdlUmVkdWN0aW9uTW9kZS0wMjcyMiIsICJJZiB0aGUgVktfTlZfY292ZXJhZ2VfcmVkdWN0aW9uX21vZGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQsIHRoZSBjb3ZlcmFnZSByZWR1Y3Rpb24gbW9kZSBzcGVjaWZpZWQgYnkgVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlY6OmNvdmVyYWdlUmVkdWN0aW9uTW9kZSwgdGhlIHJhc3Rlcml6YXRpb25TYW1wbGVzIG1lbWJlciBvZiBwTXVsdGlzYW1wbGVTdGF0ZSBhbmQgdGhlIHNhbXBsZSBjb3VudHMgZm9yIHRoZSBjb2xvciBhbmQgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50cyAoaWYgdGhlIHN1YnBhc3MgaGFzIHRoZW0pIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlU3VwcG9ydGVkRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbnNOViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWNvdmVyYWdlUmVkdWN0aW9uTW9kZS0wMjcyMikifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyMiIsICJJZiBmbGFncyBjb250YWlucyB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGZsYWcsIGFuZCBiYXNlUGlwZWxpbmVJbmRleCBpcyAtMSwgYmFzZVBpcGVsaW5lSGFuZGxlIG11c3QgYmUgYSB2YWxpZCBoYW5kbGUgdG8gYSBncmFwaGljcyBWa1BpcGVsaW5lIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3MjIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3MjMiLCAiSWYgZmxhZ3MgY29udGFpbnMgdGhlIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCBmbGFnLCBhbmQgYmFzZVBpcGVsaW5lSGFuZGxlIGlzIFZLX05VTExfSEFORExFLCBiYXNlUGlwZWxpbmVJbmRleCBtdXN0IGJlIGEgdmFsaWQgaW5kZXggaW50byB0aGUgY2FsbGluZyBjb21tYW5kJ3MgcENyZWF0ZUluZm9zIHBhcmFtZXRlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNzIzKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNzI0IiwgIklmIGZsYWdzIGNvbnRhaW5zIHRoZSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgZmxhZywgYW5kIGJhc2VQaXBlbGluZUluZGV4IGlzIG5vdCAtMSwgYmFzZVBpcGVsaW5lSGFuZGxlIG11c3QgYmUgVktfTlVMTF9IQU5ETEUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyNCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyNSIsICJJZiBmbGFncyBjb250YWlucyB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGZsYWcsIGFuZCBiYXNlUGlwZWxpbmVIYW5kbGUgaXMgbm90IFZLX05VTExfSEFORExFLCBiYXNlUGlwZWxpbmVJbmRleCBtdXN0IGJlIC0xIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3MjUpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3NjQiLCAiZmxhZ3MgbXVzdCBub3QgY29udGFpbiB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0RJU1BBVENIX0JBU0UgZmxhZy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDc2NCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUGlwZWxpbmVDcmVhdGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZ2VvbWV0cnlTdHJlYW1zLTAyMzIxIiwgIklmIHRoZSBsYXN0IHZlcnRleCBwcm9jZXNzaW5nIHN0YWdlIGlzIGEgZ2VvbWV0cnkgc2hhZGVyLCBhbmQgdGhhdCBnZW9tZXRyeSBzaGFkZXIgdXNlcyB0aGUgR2VvbWV0cnlTdHJlYW1zIGNhcGFiaWxpdHksIHRoZW4gVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6Omdlb21ldHJ5U3RyZWFtcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWdlb21ldHJ5U3RyZWFtcy0wMjMyMSkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1sYXlvdXQtMDA3NTYiLCAibGF5b3V0IG11c3QgYmUgY29uc2lzdGVudCB3aXRoIGFsbCBzaGFkZXJzIHNwZWNpZmllZCBpbiBwU3RhZ2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tbGF5b3V0LTAwNzU2KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWxheW91dC0wMTY4OCIsICJUaGUgbnVtYmVyIG9mIHJlc291cmNlcyBpbiBsYXlvdXQgYWNjZXNzaWJsZSB0byBlYWNoIHNoYWRlciBzdGFnZSB0aGF0IGlzIHVzZWQgYnkgdGhlIHBpcGVsaW5lIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFBlclN0YWdlUmVzb3VyY2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tbGF5b3V0LTAxNjg4KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWxheW91dC1wYXJhbWV0ZXIiLCAibGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lTGF5b3V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWxheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzY2IiwgIklmIHRoZSBsaW5lUmFzdGVyaXphdGlvbk1vZGUgbWVtYmVyIG9mIGEgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gb2YgcFJhc3Rlcml6YXRpb25TdGF0ZSBpcyBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CUkVTRU5IQU1fRVhUIG9yIFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX1NNT09USF9FWFQgYW5kIGlmIHJhc3Rlcml6YXRpb24gaXMgZW5hYmxlZCwgdGhlbiB0aGUgYWxwaGFUb0NvdmVyYWdlRW5hYmxlLCBhbHBoYVRvT25lRW5hYmxlLCBhbmQgc2FtcGxlU2hhZGluZ0VuYWJsZSBtZW1iZXJzIG9mIHBNdWx0aXNhbXBsZVN0YXRlIG11c3QgYWxsIGJlIFZLX0ZBTFNFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzY2KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGUtcGFyYW1ldGVyIiwgIklmIHBEeW5hbWljU3RhdGUgaXMgbm90IE5VTEwsIHBEeW5hbWljU3RhdGUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0NyIsICJJZiBubyBlbGVtZW50IG9mIHRoZSBwRHluYW1pY1N0YXRlcyBtZW1iZXIgb2YgcER5bmFtaWNTdGF0ZSBpcyBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCB0aGUgcFZpZXdwb3J0cyBtZW1iZXIgb2YgcFZpZXdwb3J0U3RhdGUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFZpZXdwb3J0U3RhdGUtPnZpZXdwb3J0Q291bnQgdmFsaWQgVmtWaWV3cG9ydCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDcpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDgiLCAiSWYgbm8gZWxlbWVudCBvZiB0aGUgcER5bmFtaWNTdGF0ZXMgbWVtYmVyIG9mIHBEeW5hbWljU3RhdGUgaXMgVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SLCB0aGUgcFNjaXNzb3JzIG1lbWJlciBvZiBwVmlld3BvcnRTdGF0ZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwVmlld3BvcnRTdGF0ZS0+c2Npc3NvckNvdW50IFZrUmVjdDJEIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0OCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0OSIsICJJZiB0aGUgd2lkZSBsaW5lcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgbm8gZWxlbWVudCBvZiB0aGUgcER5bmFtaWNTdGF0ZXMgbWVtYmVyIG9mIHBEeW5hbWljU3RhdGUgaXMgVktfRFlOQU1JQ19TVEFURV9MSU5FX1dJRFRILCB0aGUgbGluZVdpZHRoIG1lbWJlciBvZiBwUmFzdGVyaXphdGlvblN0YXRlIG11c3QgYmUgMS4wIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDkpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NTQiLCAiSWYgdGhlIGRlcHRoIGJpYXMgY2xhbXBpbmcgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgbm8gZWxlbWVudCBvZiB0aGUgcER5bmFtaWNTdGF0ZXMgbWVtYmVyIG9mIHBEeW5hbWljU3RhdGUgaXMgVktfRFlOQU1JQ19TVEFURV9ERVBUSF9CSUFTLCBhbmQgdGhlIGRlcHRoQmlhc0VuYWJsZSBtZW1iZXIgb2YgcFJhc3Rlcml6YXRpb25TdGF0ZSBpcyBWS19UUlVFLCB0aGUgZGVwdGhCaWFzQ2xhbXAgbWVtYmVyIG9mIHBSYXN0ZXJpemF0aW9uU3RhdGUgbXVzdCBiZSAwLjAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc1NCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc1NSIsICJJZiBubyBlbGVtZW50IG9mIHRoZSBwRHluYW1pY1N0YXRlcyBtZW1iZXIgb2YgcER5bmFtaWNTdGF0ZSBpcyBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUywgYW5kIHRoZSBkZXB0aEJvdW5kc1Rlc3RFbmFibGUgbWVtYmVyIG9mIHBEZXB0aFN0ZW5jaWxTdGF0ZSBpcyBWS19UUlVFLCB0aGUgbWluRGVwdGhCb3VuZHMgYW5kIG1heERlcHRoQm91bmRzIG1lbWJlcnMgb2YgcERlcHRoU3RlbmNpbFN0YXRlIG11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NTUpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDE1MjEiLCAiSWYgbm8gZWxlbWVudCBvZiB0aGUgcER5bmFtaWNTdGF0ZXMgbWVtYmVyIG9mIHBEeW5hbWljU3RhdGUgaXMgVktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVCwgYW5kIHRoZSBzYW1wbGVMb2NhdGlvbnNFbmFibGUgbWVtYmVyIG9mIGEgVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIHBNdWx0aXNhbXBsZVN0YXRlIGlzIFZLX1RSVUUsIHNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25HcmlkU2l6ZS53aWR0aCBtdXN0IGV2ZW5seSBkaXZpZGUgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ6OnNhbXBsZUxvY2F0aW9uR3JpZFNpemUud2lkdGggYXMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVCB3aXRoIGEgc2FtcGxlcyBwYXJhbWV0ZXIgZXF1YWxpbmcgcmFzdGVyaXphdGlvblNhbXBsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMTUyMSkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMTUyMiIsICJJZiBubyBlbGVtZW50IG9mIHRoZSBwRHluYW1pY1N0YXRlcyBtZW1iZXIgb2YgcER5bmFtaWNTdGF0ZSBpcyBWS19EWU5BTUlDX1NUQVRFX1NBTVBMRV9MT0NBVElPTlNfRVhULCBhbmQgdGhlIHNhbXBsZUxvY2F0aW9uc0VuYWJsZSBtZW1iZXIgb2YgYSBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gb2YgcE11bHRpc2FtcGxlU3RhdGUgaXMgVktfVFJVRSwgc2FtcGxlTG9jYXRpb25zSW5mby5zYW1wbGVMb2NhdGlvbkdyaWRTaXplLmhlaWdodCBtdXN0IGV2ZW5seSBkaXZpZGUgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQ6OnNhbXBsZUxvY2F0aW9uR3JpZFNpemUuaGVpZ2h0IGFzIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgd2l0aCBhIHNhbXBsZXMgcGFyYW1ldGVyIGVxdWFsaW5nIHJhc3Rlcml6YXRpb25TYW1wbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDE1MjIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDE1MjMiLCAiSWYgbm8gZWxlbWVudCBvZiB0aGUgcER5bmFtaWNTdGF0ZXMgbWVtYmVyIG9mIHBEeW5hbWljU3RhdGUgaXMgVktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVCwgYW5kIHRoZSBzYW1wbGVMb2NhdGlvbnNFbmFibGUgbWVtYmVyIG9mIGEgVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIHBNdWx0aXNhbXBsZVN0YXRlIGlzIFZLX1RSVUUsIHNhbXBsZUxvY2F0aW9uc0luZm8uc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwgbXVzdCBlcXVhbCByYXN0ZXJpemF0aW9uU2FtcGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAxNTIzKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAxNzE1IiwgIklmIG5vIGVsZW1lbnQgb2YgdGhlIHBEeW5hbWljU3RhdGVzIG1lbWJlciBvZiBwRHluYW1pY1N0YXRlIGlzIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfV19TQ0FMSU5HX05WLCBhbmQgdGhlIHZpZXdwb3J0V1NjYWxpbmdFbmFibGUgbWVtYmVyIG9mIGEgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViBzdHJ1Y3R1cmUsIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBvZiBwVmlld3BvcnRTdGF0ZSwgaXMgVktfVFJVRSwgdGhlIHBWaWV3cG9ydFdTY2FsaW5ncyBtZW1iZXIgb2YgdGhlIFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVjo6dmlld3BvcnRDb3VudCB2YWxpZCBWa1ZpZXdwb3J0V1NjYWxpbmdOViBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDE3MTUpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDI1MTAiLCAiSWYgdGhlIFZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQgZXh0ZW5zaW9uIGlzIG5vdCBlbmFibGVkIGFuZCBubyBlbGVtZW50IG9mIHRoZSBwRHluYW1pY1N0YXRlcyBtZW1iZXIgb2YgcER5bmFtaWNTdGF0ZSBpcyBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUywgYW5kIHRoZSBkZXB0aEJvdW5kc1Rlc3RFbmFibGUgbWVtYmVyIG9mIHBEZXB0aFN0ZW5jaWxTdGF0ZSBpcyBWS19UUlVFLCB0aGUgbWluRGVwdGhCb3VuZHMgYW5kIG1heERlcHRoQm91bmRzIG1lbWJlcnMgb2YgcERlcHRoU3RlbmNpbFN0YXRlIG11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDI1MTApIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRCwgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULCBWa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVCwgb3IgVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wUmFzdGVyaXphdGlvblN0YXRlLXBhcmFtZXRlciIsICJwUmFzdGVyaXphdGlvblN0YXRlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFJhc3Rlcml6YXRpb25TdGF0ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDcyOSIsICJJZiBwU3RhZ2VzIGluY2x1ZGVzIGEgdGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIHN0YWdlLCBpdCBtdXN0IGluY2x1ZGUgYSB0ZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzI5KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzAiLCAiSWYgcFN0YWdlcyBpbmNsdWRlcyBhIHRlc3NlbGxhdGlvbiBldmFsdWF0aW9uIHNoYWRlciBzdGFnZSwgaXQgbXVzdCBpbmNsdWRlIGEgdGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDczMCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzMxIiwgIklmIHBTdGFnZXMgaW5jbHVkZXMgYSB0ZXNzZWxsYXRpb24gY29udHJvbCBzaGFkZXIgc3RhZ2UgYW5kIGEgdGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc2hhZGVyIHN0YWdlLCBwVGVzc2VsbGF0aW9uU3RhdGUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzEpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDczMiIsICJJZiBwU3RhZ2VzIGluY2x1ZGVzIHRlc3NlbGxhdGlvbiBzaGFkZXIgc3RhZ2VzLCB0aGUgc2hhZGVyIGNvZGUgb2YgYXQgbGVhc3Qgb25lIHN0YWdlIG11c3QgY29udGFpbiBhbiBPcEV4ZWN1dGlvbk1vZGUgaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc3ViZGl2aXNpb24gaW4gdGhlIHBpcGVsaW5lIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDczMikifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzMzIiwgIklmIHBTdGFnZXMgaW5jbHVkZXMgdGVzc2VsbGF0aW9uIHNoYWRlciBzdGFnZXMsIGFuZCB0aGUgc2hhZGVyIGNvZGUgb2YgYm90aCBzdGFnZXMgY29udGFpbiBhbiBPcEV4ZWN1dGlvbk1vZGUgaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc3ViZGl2aXNpb24gaW4gdGhlIHBpcGVsaW5lLCB0aGV5IG11c3QgYm90aCBzcGVjaWZ5IHRoZSBzYW1lIHN1YmRpdmlzaW9uIG1vZGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzMzKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzQiLCAiSWYgcFN0YWdlcyBpbmNsdWRlcyB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlcywgdGhlIHNoYWRlciBjb2RlIG9mIGF0IGxlYXN0IG9uZSBzdGFnZSBtdXN0IGNvbnRhaW4gYW4gT3BFeGVjdXRpb25Nb2RlIGluc3RydWN0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBvdXRwdXQgcGF0Y2ggc2l6ZSBpbiB0aGUgcGlwZWxpbmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzM0KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzUiLCAiSWYgcFN0YWdlcyBpbmNsdWRlcyB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlcywgYW5kIHRoZSBzaGFkZXIgY29kZSBvZiBib3RoIGNvbnRhaW4gYW4gT3BFeGVjdXRpb25Nb2RlIGluc3RydWN0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBvdXQgcGF0Y2ggc2l6ZSBpbiB0aGUgcGlwZWxpbmUsIHRoZXkgbXVzdCBib3RoIHNwZWNpZnkgdGhlIHNhbWUgcGF0Y2ggc2l6ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzUpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDczNiIsICJJZiBwU3RhZ2VzIGluY2x1ZGVzIHRlc3NlbGxhdGlvbiBzaGFkZXIgc3RhZ2VzLCB0aGUgdG9wb2xvZ3kgbWVtYmVyIG9mIHBJbnB1dEFzc2VtYmx5IG11c3QgYmUgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzM2KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzgiLCAiSWYgcFN0YWdlcyBpbmNsdWRlcyBhIGdlb21ldHJ5IHNoYWRlciBzdGFnZSwgYW5kIGRvZXMgbm90IGluY2x1ZGUgYW55IHRlc3NlbGxhdGlvbiBzaGFkZXIgc3RhZ2VzLCBpdHMgc2hhZGVyIGNvZGUgbXVzdCBjb250YWluIGFuIE9wRXhlY3V0aW9uTW9kZSBpbnN0cnVjdGlvbiB0aGF0IHNwZWNpZmllcyBhbiBpbnB1dCBwcmltaXRpdmUgdHlwZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJpbWl0aXZlIHRvcG9sb2d5IHNwZWNpZmllZCBpbiBwSW5wdXRBc3NlbWJseSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzgpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDczOSIsICJJZiBwU3RhZ2VzIGluY2x1ZGVzIGEgZ2VvbWV0cnkgc2hhZGVyIHN0YWdlLCBhbmQgYWxzbyBpbmNsdWRlcyB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlcywgaXRzIHNoYWRlciBjb2RlIG11c3QgY29udGFpbiBhbiBPcEV4ZWN1dGlvbk1vZGUgaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgYW4gaW5wdXQgcHJpbWl0aXZlIHR5cGUgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByaW1pdGl2ZSB0b3BvbG9neSB0aGF0IGlzIG91dHB1dCBieSB0aGUgdGVzc2VsbGF0aW9uIHN0YWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3MzkpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDc0MCIsICJJZiBwU3RhZ2VzIGluY2x1ZGVzIGEgZnJhZ21lbnQgc2hhZGVyIHN0YWdlIGFuZCBhIGdlb21ldHJ5IHNoYWRlciBzdGFnZSwgYW5kIHRoZSBmcmFnbWVudCBzaGFkZXIgY29kZSByZWFkcyBmcm9tIGFuIGlucHV0IHZhcmlhYmxlIHRoYXQgaXMgZGVjb3JhdGVkIHdpdGggUHJpbWl0aXZlSUQsIHRoZW4gdGhlIGdlb21ldHJ5IHNoYWRlciBjb2RlIG11c3Qgd3JpdGUgdG8gYSBtYXRjaGluZyBvdXRwdXQgdmFyaWFibGUsIGRlY29yYXRlZCB3aXRoIFByaW1pdGl2ZUlELCBpbiBhbGwgZXhlY3V0aW9uIHBhdGhzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDc0MCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzQxIiwgIklmIHBTdGFnZXMgaW5jbHVkZXMgYSBmcmFnbWVudCBzaGFkZXIgc3RhZ2UsIGl0cyBzaGFkZXIgY29kZSBtdXN0IG5vdCByZWFkIGZyb20gYW55IGlucHV0IGF0dGFjaG1lbnQgdGhhdCBpcyBkZWZpbmVkIGFzIFZLX0FUVEFDSE1FTlRfVU5VU0VEIGluIHN1YnBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzQxKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3NDIiLCAiVGhlIHNoYWRlciBjb2RlIGZvciB0aGUgZW50cnkgcG9pbnRzIGlkZW50aWZpZWQgYnkgcFN0YWdlcywgYW5kIHRoZSByZXN0IG9mIHRoZSBzdGF0ZSBpZGVudGlmaWVkIGJ5IHRoaXMgc3RydWN0dXJlIG11c3QgYWRoZXJlIHRvIHRoZSBwaXBlbGluZSBsaW5raW5nIHJ1bGVzIGRlc2NyaWJlZCBpbiB0aGUgU2hhZGVyIEludGVyZmFjZXMgY2hhcHRlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3NDIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMTU2NSIsICJJZiBwU3RhZ2VzIGluY2x1ZGVzIGEgZnJhZ21lbnQgc2hhZGVyIHN0YWdlIGFuZCBhbiBpbnB1dCBhdHRhY2htZW50IHdhcyByZWZlcmVuY2VkIGJ5IHRoZSBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIGF0IHJlbmRlclBhc3MgY3JlYXRlIHRpbWUsIGl0cyBzaGFkZXIgY29kZSBtdXN0IG5vdCByZWFkIGZyb20gYW55IGFzcGVjdCB0aGF0IHdhcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBhc3BlY3RNYXNrIG9mIHRoZSBjb3JyZXNwb25kaW5nIFZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlIHN0cnVjdHVyZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAxNTY1KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDIwOTUiLCAiVGhlIGdlb21ldHJpYyBzaGFkZXIgc3RhZ2VzIHByb3ZpZGVkIGluIHBTdGFnZXMgbXVzdCBiZSBlaXRoZXIgZnJvbSB0aGUgbWVzaCBzaGFkaW5nIHBpcGVsaW5lIChzdGFnZSBpcyBWS19TSEFERVJfU1RBR0VfVEFTS19CSVRfTlYgb3IgVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WKSBvciBmcm9tIHRoZSBwcmltaXRpdmUgc2hhZGluZyBwaXBlbGluZSAoc3RhZ2UgaXMgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQsIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQsIG9yIFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQpLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDIwOTUpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjA5NyIsICJJZiBwU3RhZ2VzIGluY2x1ZGVzIGEgdmVydGV4IHNoYWRlciBzdGFnZSwgcFZlcnRleElucHV0U3RhdGUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjA5NykifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAyMDk4IiwgIklmIHBTdGFnZXMgaW5jbHVkZXMgYSB2ZXJ0ZXggc2hhZGVyIHN0YWdlLCBwSW5wdXRBc3NlbWJseVN0YXRlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjA5OCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAyMzE3IiwgIlRoZSBYZmIgZXhlY3V0aW9uIG1vZGUgY2FuIGJlIHNwZWNpZmllZCBieSBvbmx5IG9uZSBzaGFkZXIgc3RhZ2UgaW4gcFN0YWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDIzMTcpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjMxOCIsICJJZiBhbnkgc2hhZGVyIHN0YWdlIGluIHBTdGFnZXMgc3BlY2lmaWVzIFhmYiBleGVjdXRpb24gbW9kZSBpdCBtdXN0IGJlIHRoZSBsYXN0IHZlcnRleCBwcm9jZXNzaW5nIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjMxOCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLXBhcmFtZXRlciIsICJwU3RhZ2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN0YWdlQ291bnQgdmFsaWQgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXphdGlvblN0cmVhbS0wMjMxOSIsICJJZiBhIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUOjpyYXN0ZXJpemF0aW9uU3RyZWFtIHZhbHVlIG90aGVyIHRoYW4gemVybyBpcyBzcGVjaWZpZWQsIGFsbCB2YXJpYWJsZXMgaW4gdGhlIG91dHB1dCBpbnRlcmZhY2Ugb2YgdGhlIGVudHJ5IHBvaW50IGJlaW5nIGNvbXBpbGVkIGRlY29yYXRlZCB3aXRoIFBvc2l0aW9uLCBQb2ludFNpemUsIENsaXBEaXN0YW5jZSwgb3IgQ3VsbERpc3RhbmNlIG11c3QgYWxsIGJlIGRlY29yYXRlZCB3aXRoIGlkZW50aWNhbCBTdHJlYW0gdmFsdWVzIHRoYXQgbWF0Y2ggdGhlIHJhc3Rlcml6YXRpb25TdHJlYW0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yYXN0ZXJpemF0aW9uU3RyZWFtLTAyMzE5KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXJhc3Rlcml6YXRpb25TdHJlYW0tMDIzMjAiLCAiSWYgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQ6OnJhc3Rlcml6YXRpb25TdHJlYW0gaXMgemVybywgb3Igbm90IHNwZWNpZmllZCwgYWxsIHZhcmlhYmxlcyBpbiB0aGUgb3V0cHV0IGludGVyZmFjZSBvZiB0aGUgZW50cnkgcG9pbnQgYmVpbmcgY29tcGlsZWQgZGVjb3JhdGVkIHdpdGggUG9zaXRpb24sIFBvaW50U2l6ZSwgQ2xpcERpc3RhbmNlLCBvciBDdWxsRGlzdGFuY2UgbXVzdCBhbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBTdHJlYW0gdmFsdWUgb2YgemVybywgb3IgbXVzdCBub3Qgc3BlY2lmeSB0aGUgU3RyZWFtIGRlY29yYXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yYXN0ZXJpemF0aW9uU3RyZWFtLTAyMzIwKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlLTAwNzUwIiwgIklmIHRoZSByYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSBtZW1iZXIgb2YgcFJhc3Rlcml6YXRpb25TdGF0ZSBpcyBWS19GQUxTRSwgcFZpZXdwb3J0U3RhdGUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTApIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTEiLCAiSWYgdGhlIHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlIG1lbWJlciBvZiBwUmFzdGVyaXphdGlvblN0YXRlIGlzIFZLX0ZBTFNFLCBwTXVsdGlzYW1wbGVTdGF0ZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZS0wMDc1MSkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZS0wMDc1MiIsICJJZiB0aGUgcmFzdGVyaXplckRpc2NhcmRFbmFibGUgbWVtYmVyIG9mIHBSYXN0ZXJpemF0aW9uU3RhdGUgaXMgVktfRkFMU0UsIGFuZCBzdWJwYXNzIHVzZXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHBEZXB0aFN0ZW5jaWxTdGF0ZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTMiLCAiSWYgdGhlIHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlIG1lbWJlciBvZiBwUmFzdGVyaXphdGlvblN0YXRlIGlzIFZLX0ZBTFNFLCBhbmQgc3VicGFzcyB1c2VzIGNvbG9yIGF0dGFjaG1lbnRzLCBwQ29sb3JCbGVuZFN0YXRlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTMpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMDc2MCIsICJJZiB0aGUgcmVuZGVyUGFzcyBoYXMgbXVsdGl2aWV3IGVuYWJsZWQgYW5kIHN1YnBhc3MgaGFzIG1vcmUgdGhhbiBvbmUgYml0IHNldCBpbiB0aGUgdmlldyBtYXNrIGFuZCBtdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIgaXMgbm90IGVuYWJsZWQsIHRoZW4gcFN0YWdlcyBtdXN0IG5vdCBpbmNsdWRlIHRlc3NlbGxhdGlvbiBzaGFkZXJzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDA3NjApIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMDc2MSIsICJJZiB0aGUgcmVuZGVyUGFzcyBoYXMgbXVsdGl2aWV3IGVuYWJsZWQgYW5kIHN1YnBhc3MgaGFzIG1vcmUgdGhhbiBvbmUgYml0IHNldCBpbiB0aGUgdmlldyBtYXNrIGFuZCBtdWx0aXZpZXdHZW9tZXRyeVNoYWRlciBpcyBub3QgZW5hYmxlZCwgdGhlbiBwU3RhZ2VzIG11c3Qgbm90IGluY2x1ZGUgYSBnZW9tZXRyeSBzaGFkZXIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMDc2MSkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAwNzYyIiwgIklmIHRoZSByZW5kZXJQYXNzIGhhcyBtdWx0aXZpZXcgZW5hYmxlZCBhbmQgc3VicGFzcyBoYXMgbW9yZSB0aGFuIG9uZSBiaXQgc2V0IGluIHRoZSB2aWV3IG1hc2ssIHNoYWRlcnMgaW4gdGhlIHBpcGVsaW5lIG11c3Qgbm90IHdyaXRlIHRvIHRoZSBMYXllciBidWlsdC1pbiBvdXRwdXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAwNzYyKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDA3NjMiLCAiSWYgdGhlIHJlbmRlclBhc3MgaGFzIG11bHRpdmlldyBlbmFibGVkLCB0aGVuIGFsbCBzaGFkZXJzIG11c3Qgbm90IGluY2x1ZGUgdmFyaWFibGVzIGRlY29yYXRlZCB3aXRoIHRoZSBMYXllciBidWlsdC1pbiBkZWNvcmF0aW9uIGluIHRoZWlyIGludGVyZmFjZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMDc2MykifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1yZW5kZXJQYXNzLXBhcmFtZXRlciIsICJyZW5kZXJQYXNzIG11c3QgYmUgYSB2YWxpZCBWa1JlbmRlclBhc3MgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmVuZGVyUGFzcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsICJFYWNoIHNUeXBlIG1lbWJlciBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSB1bmlxdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAxNTI0IiwgIklmIHRoZSBzYW1wbGVMb2NhdGlvbnNFbmFibGUgbWVtYmVyIG9mIGEgVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIHBNdWx0aXNhbXBsZVN0YXRlIGlzIFZLX1RSVUUsIHRoZSBmcmFnbWVudCBzaGFkZXIgY29kZSBtdXN0IG5vdCBzdGF0aWNhbGx5IHVzZSB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gSW50ZXJwb2xhdGVBdFNhbXBsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMTUyNCkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMDcyNiIsICJUaGUgc3RhZ2UgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwU3RhZ2VzIG11c3QgYmUgdW5pcXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MjYpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MjciLCAiVGhlIHN0YWdlIG1lbWJlciBvZiBvbmUgZWxlbWVudCBvZiBwU3RhZ2VzIG11c3QgYmUgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMDcyNykifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMDcyOCIsICJUaGUgc3RhZ2UgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwU3RhZ2VzIG11c3Qgbm90IGJlIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0YWdlLTAwNzI4KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0YWdlLTAyMDk2IiwgIlRoZSBzdGFnZSBtZW1iZXIgb2Ygb25lIGVsZW1lbnQgb2YgcFN0YWdlcyBtdXN0IGJlIGVpdGhlciBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCBvciBWS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlYuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2UtMDIwOTYpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3RhZ2VDb3VudC1hcnJheWxlbmd0aCIsICJzdGFnZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZUNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0aXBwbGVkTGluZUVuYWJsZS0wMjc2NyIsICJJZiB0aGUgc3RpcHBsZWRMaW5lRW5hYmxlIG1lbWJlciBvZiBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQgaXMgVktfVFJVRSBhbmQgbm8gZWxlbWVudCBvZiB0aGUgcER5bmFtaWNTdGF0ZXMgbWVtYmVyIG9mIHBEeW5hbWljU3RhdGUgaXMgVktfRFlOQU1JQ19TVEFURV9MSU5FX1NUSVBQTEVfRVhULCB0aGVuIHRoZSBsaW5lU3RpcHBsZUZhY3RvciBtZW1iZXIgb2YgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIG11c3QgYmUgaW4gdGhlIHJhbmdlIFsxLDI1Nl0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGlwcGxlZExpbmVFbmFibGUtMDI3NjcpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc0MyIsICJJZiByYXN0ZXJpemF0aW9uIGlzIG5vdCBkaXNhYmxlZCBhbmQgc3VicGFzcyB1c2VzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGluIHJlbmRlclBhc3MgdGhhdCBoYXMgYSBsYXlvdXQgb2YgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgaW4gdGhlIFZrQXR0YWNobWVudFJlZmVyZW5jZSBkZWZpbmVkIGJ5IHN1YnBhc3MsIHRoZSBkZXB0aFdyaXRlRW5hYmxlIG1lbWJlciBvZiBwRGVwdGhTdGVuY2lsU3RhdGUgbXVzdCBiZSBWS19GQUxTRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDA3NDMpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc0NCIsICJJZiByYXN0ZXJpemF0aW9uIGlzIG5vdCBkaXNhYmxlZCBhbmQgc3VicGFzcyB1c2VzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGluIHJlbmRlclBhc3MgdGhhdCBoYXMgYSBsYXlvdXQgb2YgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgaW4gdGhlIFZrQXR0YWNobWVudFJlZmVyZW5jZSBkZWZpbmVkIGJ5IHN1YnBhc3MsIHRoZSBmYWlsT3AsIHBhc3NPcCBhbmQgZGVwdGhGYWlsT3AgbWVtYmVycyBvZiBlYWNoIG9mIHRoZSBmcm9udCBhbmQgYmFjayBtZW1iZXJzIG9mIHBEZXB0aFN0ZW5jaWxTdGF0ZSBtdXN0IGJlIFZLX1NURU5DSUxfT1BfS0VFUCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDA3NDQpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc1NyIsICJJZiBuZWl0aGVyIHRoZSBWS19BTURfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzIG5vciB0aGUgVktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlcyBleHRlbnNpb25zIGFyZSBlbmFibGVkLCBhbmQgaWYgc3VicGFzcyB1c2VzIGNvbG9yIGFuZC9vciBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnRzLCB0aGVuIHRoZSByYXN0ZXJpemF0aW9uU2FtcGxlcyBtZW1iZXIgb2YgcE11bHRpc2FtcGxlU3RhdGUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgc2FtcGxlIGNvdW50IGZvciB0aG9zZSBzdWJwYXNzIGF0dGFjaG1lbnRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc1NykifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAwNzU4IiwgIklmIHN1YnBhc3MgZG9lcyBub3QgdXNlIGFueSBjb2xvciBhbmQvb3IgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50cywgdGhlbiB0aGUgcmFzdGVyaXphdGlvblNhbXBsZXMgbWVtYmVyIG9mIHBNdWx0aXNhbXBsZVN0YXRlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgYSB6ZXJvLWF0dGFjaG1lbnQgc3VicGFzcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDA3NTgpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc1OSIsICJzdWJwYXNzIG11c3QgYmUgYSB2YWxpZCBzdWJwYXNzIHdpdGhpbiByZW5kZXJQYXNzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMDc1OSkifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAxNDExIiwgIklmIHRoZSBWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzIGV4dGVuc2lvbiBpcyBlbmFibGVkLCBhbmQgaWYgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgYW5kIGRlcHRoIHRlc3QsIHN0ZW5jaWwgdGVzdCwgb3IgZGVwdGggYm91bmRzIHRlc3QgYXJlIGVuYWJsZWQsIHRoZW4gdGhlIHJhc3Rlcml6YXRpb25TYW1wbGVzIG1lbWJlciBvZiBwTXVsdGlzYW1wbGVTdGF0ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBzYW1wbGUgY291bnQgb2YgdGhlIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDE0MTEpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMTQxMiIsICJJZiB0aGUgVktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlcyBleHRlbnNpb24gaXMgZW5hYmxlZCwgYW5kIGlmIHN1YnBhc3MgaGFzIGFueSBjb2xvciBhdHRhY2htZW50cywgdGhlbiB0aGUgcmFzdGVyaXphdGlvblNhbXBsZXMgbWVtYmVyIG9mIHBNdWx0aXNhbXBsZVN0YXRlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzYW1wbGUgY291bnQgZm9yIHRob3NlIHN1YnBhc3MgYXR0YWNobWVudHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAxNDEyKSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDE1MDUiLCAiSWYgdGhlIFZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMgZXh0ZW5zaW9uIGlzIGVuYWJsZWQsIGFuZCBpZiBzdWJwYXNzIHVzZXMgY29sb3IgYW5kL29yIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudHMsIHRoZW4gdGhlIHJhc3Rlcml6YXRpb25TYW1wbGVzIG1lbWJlciBvZiBwTXVsdGlzYW1wbGVTdGF0ZSBtdXN0IGVxdWFsIHRoZSBtYXhpbXVtIG9mIHRoZSBzYW1wbGUgY291bnRzIG9mIHRob3NlIHN1YnBhc3MgYXR0YWNobWVudHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAxNTA1KSJ9LAorICAgIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDE3NTYiLCAiSWYgcmFzdGVyaXphdGlvbiBpcyBub3QgZGlzYWJsZWQgYW5kIHN1YnBhc3MgdXNlcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCBpbiByZW5kZXJQYXNzIHRoYXQgaGFzIGEgbGF5b3V0IG9mIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwgaW4gdGhlIFZrQXR0YWNobWVudFJlZmVyZW5jZSBkZWZpbmVkIGJ5IHN1YnBhc3MsIHRoZSBkZXB0aFdyaXRlRW5hYmxlIG1lbWJlciBvZiBwRGVwdGhTdGVuY2lsU3RhdGUgbXVzdCBiZSBWS19GQUxTRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDE3NTYpIn0sCisgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMTc1NyIsICJJZiByYXN0ZXJpemF0aW9uIGlzIG5vdCBkaXNhYmxlZCBhbmQgc3VicGFzcyB1c2VzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGluIHJlbmRlclBhc3MgdGhhdCBoYXMgYSBsYXlvdXQgb2YgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCBpbiB0aGUgVmtBdHRhY2htZW50UmVmZXJlbmNlIGRlZmluZWQgYnkgc3VicGFzcywgdGhlIGZhaWxPcCwgcGFzc09wIGFuZCBkZXB0aEZhaWxPcCBtZW1iZXJzIG9mIGVhY2ggb2YgdGhlIGZyb250IGFuZCBiYWNrIG1lbWJlcnMgb2YgcERlcHRoU3RlbmNpbFN0YXRlIG11c3QgYmUgVktfU1RFTkNJTF9PUF9LRUVQIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMTc1NykifSwKKyAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby10b3BvbG9neS0wMDczNyIsICJJZiB0aGUgdG9wb2xvZ3kgbWVtYmVyIG9mIHBJbnB1dEFzc2VtYmx5IGlzIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNULCBwU3RhZ2VzIG11c3QgaW5jbHVkZSB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXRvcG9sb2d5LTAwNzM3KSJ9LAorICAgIHsiVlVJRC1Wa0hkck1ldGFkYXRhRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0hkck1ldGFkYXRhRVhULXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0hkck1ldGFkYXRhRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfSERSX01FVEFEQVRBX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0hkck1ldGFkYXRhRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtIZWFkbGVzc1N1cmZhY2VDcmVhdGVJbmZvRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0hlYWRsZXNzU3VyZmFjZUNyZWF0ZUluZm9FWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0hFQURMRVNTX1NVUkZBQ0VfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1wVmlldy0wMTMxNiIsICJwVmlldyBtdXN0IGJlIGEgdmFsaWQgVUlWaWV3IGFuZCBtdXN0IGJlIGJhY2tlZCBieSBhIENBTGF5ZXIgaW5zdGFuY2Ugb2YgdHlwZSBDQU1ldGFsTGF5ZXIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVkstcFZpZXctMDEzMTYpIn0sCisgICAgeyJWVUlELVZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVkstc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JT1NfU1VSRkFDRV9DUkVBVEVfSU5GT19NVksgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtYXNwZWN0TWFzay0wMDIzOCIsICJUaGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3QgbWF0Y2ggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUJsaXQtYXNwZWN0TWFzay0wMDIzOCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtYXNwZWN0TWFzay0wMDI0MSIsICJUaGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3JjU3VicmVzb3VyY2UgbXVzdCBzcGVjaWZ5IGFzcGVjdHMgcHJlc2VudCBpbiB0aGUgY2FsbGluZyBjb21tYW5kJ3Mgc3JjSW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUJsaXQtYXNwZWN0TWFzay0wMDI0MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtYXNwZWN0TWFzay0wMDI0MiIsICJUaGUgYXNwZWN0TWFzayBtZW1iZXIgb2YgZHN0U3VicmVzb3VyY2UgbXVzdCBzcGVjaWZ5IGFzcGVjdHMgcHJlc2VudCBpbiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgZHN0SW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUJsaXQtYXNwZWN0TWFzay0wMDI0MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtZHN0SW1hZ2UtMDAyNTAiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCwgdGhlbiBkc3RPZmZzZXRbMF0ueSBtdXN0IGJlIDAgYW5kIGRzdE9mZnNldFsxXS55IG11c3QgYmUgMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUJsaXQtZHN0SW1hZ2UtMDAyNTApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VCbGl0LWRzdEltYWdlLTAwMjUyIiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBkc3RJbWFnZSBpcyBvZiB0eXBlIFZLX0lNQUdFX1RZUEVfMUQgb3IgVktfSU1BR0VfVFlQRV8yRCwgdGhlbiBkc3RPZmZzZXRbMF0ueiBtdXN0IGJlIDAgYW5kIGRzdE9mZnNldFsxXS56IG11c3QgYmUgMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUJsaXQtZHN0SW1hZ2UtMDAyNTIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VCbGl0LWRzdE9mZnNldC0wMDI0OCIsICJkc3RPZmZzZXRbMF0ueCBhbmQgZHN0T2Zmc2V0WzFdLnggbXVzdCBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VCbGl0LWRzdE9mZnNldC0wMDI0OCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtZHN0T2Zmc2V0LTAwMjQ5IiwgImRzdE9mZnNldFswXS55IGFuZCBkc3RPZmZzZXRbMV0ueSBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VCbGl0LWRzdE9mZnNldC0wMDI0OSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtZHN0T2Zmc2V0LTAwMjUxIiwgImRzdE9mZnNldFswXS56IGFuZCBkc3RPZmZzZXRbMV0ueiBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUJsaXQtZHN0T2Zmc2V0LTAwMjUxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQmxpdC1kc3RTdWJyZXNvdXJjZS1wYXJhbWV0ZXIiLCAiZHN0U3VicmVzb3VyY2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUJsaXQtZHN0U3VicmVzb3VyY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQmxpdC1sYXllckNvdW50LTAwMjM5IiwgIlRoZSBsYXllckNvdW50IG1lbWJlciBvZiBzcmNTdWJyZXNvdXJjZSBhbmQgZHN0U3VicmVzb3VyY2UgbXVzdCBtYXRjaCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQmxpdC1sYXllckNvdW50LTAwMjM5KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQmxpdC1zcmNJbWFnZS0wMDI0MCIsICJJZiBlaXRoZXIgb2YgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIG9yIGRzdEltYWdlIHBhcmFtZXRlcnMgYXJlIG9mIFZrSW1hZ2VUeXBlIFZLX0lNQUdFX1RZUEVfM0QsIHRoZSBiYXNlQXJyYXlMYXllciBhbmQgbGF5ZXJDb3VudCBtZW1iZXJzIG9mIGJvdGggc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3QgYmUgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VCbGl0LXNyY0ltYWdlLTAwMjQwKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQmxpdC1zcmNJbWFnZS0wMDI0NSIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3Mgc3JjSW1hZ2UgaXMgb2YgdHlwZSBWS19JTUFHRV9UWVBFXzFELCB0aGVuIHNyY09mZnNldFswXS55IG11c3QgYmUgMCBhbmQgc3JjT2Zmc2V0WzFdLnkgbXVzdCBiZSAxLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQmxpdC1zcmNJbWFnZS0wMDI0NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtc3JjSW1hZ2UtMDAyNDciLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCBvciBWS19JTUFHRV9UWVBFXzJELCB0aGVuIHNyY09mZnNldFswXS56IG11c3QgYmUgMCBhbmQgc3JjT2Zmc2V0WzFdLnogbXVzdCBiZSAxLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQmxpdC1zcmNJbWFnZS0wMDI0NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtc3JjT2Zmc2V0LTAwMjQzIiwgInNyY09mZnNldFswXS54IGFuZCBzcmNPZmZzZXRbMV0ueCBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VCbGl0LXNyY09mZnNldC0wMDI0MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUJsaXQtc3JjT2Zmc2V0LTAwMjQ0IiwgInNyY09mZnNldFswXS55IGFuZCBzcmNPZmZzZXRbMV0ueSBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIGhlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQmxpdC1zcmNPZmZzZXQtMDAyNDQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VCbGl0LXNyY09mZnNldC0wMDI0NiIsICJzcmNPZmZzZXRbMF0ueiBhbmQgc3JjT2Zmc2V0WzFdLnogbXVzdCBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSBkZXB0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQmxpdC1zcmNPZmZzZXQtMDAyNDYpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VCbGl0LXNyY1N1YnJlc291cmNlLXBhcmFtZXRlciIsICJzcmNTdWJyZXNvdXJjZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQmxpdC1zcmNTdWJyZXNvdXJjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxMzciLCAiVGhlIGFzcGVjdE1hc2sgbWVtYmVyIG9mIHNyY1N1YnJlc291cmNlIGFuZCBkc3RTdWJyZXNvdXJjZSBtdXN0IG1hdGNoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxMzcpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxNDIiLCAiVGhlIGFzcGVjdE1hc2sgbWVtYmVyIG9mIHNyY1N1YnJlc291cmNlIG11c3Qgc3BlY2lmeSBhc3BlY3RzIHByZXNlbnQgaW4gdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxNDIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxNDMiLCAiVGhlIGFzcGVjdE1hc2sgbWVtYmVyIG9mIGRzdFN1YnJlc291cmNlIG11c3Qgc3BlY2lmeSBhc3BlY3RzIHByZXNlbnQgaW4gdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxNDMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAwMTUyIiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBkc3RJbWFnZSBpcyBvZiB0eXBlIFZLX0lNQUdFX1RZUEVfMUQsIHRoZW4gZHN0T2Zmc2V0LnkgbXVzdCBiZSAwIGFuZCBleHRlbnQuaGVpZ2h0IG11c3QgYmUgMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDAxNTIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNTU0IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBkc3RJbWFnZSBoYXMgYSBWa0Zvcm1hdCB3aXRoIHR3byBwbGFuZXMgdGhlbiB0aGUgZHN0U3VicmVzb3VyY2UgYXNwZWN0TWFzayBtdXN0IGJlIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVCBvciBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE1NTQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNTU1IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBkc3RJbWFnZSBoYXMgYSBWa0Zvcm1hdCB3aXRoIHRocmVlIHBsYW5lcyB0aGVuIHRoZSBkc3RTdWJyZXNvdXJjZSBhc3BlY3RNYXNrIG11c3QgYmUgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklULCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQsIG9yIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTU1NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE1NTciLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIGhhcyBhIG11bHRpLXBsYW5hciBpbWFnZSBmb3JtYXQgYW5kIHRoZSBzcmNJbWFnZSBkb2VzIG5vdCBoYXZlIGEgbXVsdGktcGxhbmFyIGltYWdlIGZvcm1hdCwgdGhlIHNyY1N1YnJlc291cmNlIGFzcGVjdE1hc2sgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNTU3KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTczMSIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgZHN0SW1hZ2UgaXMgYSBjb21wcmVzc2VkIGZvcm1hdCBpbWFnZSwgb3IgYSBzaW5nbGUtcGxhbmUsICdfNDIyJyBpbWFnZSBmb3JtYXQsIGFsbCBtZW1iZXJzIG9mIGRzdE9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZGltZW5zaW9ucyBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTczMSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzIiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIGlzIGEgY29tcHJlc3NlZCBmb3JtYXQgaW1hZ2UsIG9yIGEgc2luZ2xlLXBsYW5lLCAnXzQyMicgaW1hZ2UgZm9ybWF0LCBleHRlbnQud2lkdGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIHdpZHRoIG9yIChleHRlbnQud2lkdGggKyBkc3RPZmZzZXQueCkgbXVzdCBlcXVhbCB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzMzIiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBkc3RJbWFnZSBpcyBhIGNvbXByZXNzZWQgZm9ybWF0IGltYWdlLCBvciBhIHNpbmdsZS1wbGFuZSwgJ180MjInIGltYWdlIGZvcm1hdCwgZXh0ZW50LmhlaWdodCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgaGVpZ2h0IG9yIChleHRlbnQuaGVpZ2h0ICsgZHN0T2Zmc2V0LnkpIG11c3QgZXF1YWwgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIGhlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTczMykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzQiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIGlzIGEgY29tcHJlc3NlZCBmb3JtYXQgaW1hZ2UsIG9yIGEgc2luZ2xlLXBsYW5lLCAnXzQyMicgaW1hZ2UgZm9ybWF0LCBleHRlbnQuZGVwdGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIGRlcHRoIG9yIChleHRlbnQuZGVwdGggKyBkc3RPZmZzZXQueikgbXVzdCBlcXVhbCB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzg2IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBkc3RJbWFnZSBpcyBvZiB0eXBlIFZLX0lNQUdFX1RZUEVfMUQsIHRoZW4gZHN0T2Zmc2V0LnogbXVzdCBiZSAwIGFuZCBleHRlbnQuZGVwdGggbXVzdCBiZSAxLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTc4NikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3ODgiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8yRCwgdGhlbiBkc3RPZmZzZXQueiBtdXN0IGJlIDAuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzg4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTc5MiIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgZHN0SW1hZ2UgaXMgb2YgdHlwZSBWS19JTUFHRV9UWVBFXzJELCBhbmQgdGhlIHNyY0ltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8zRCwgdGhlbiBleHRlbnQuZGVwdGggbXVzdCBlcXVhbCB0byB0aGUgbGF5ZXJDb3VudCBtZW1iZXIgb2YgZHN0U3VicmVzb3VyY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzkyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTAiLCAiZHN0T2Zmc2V0LnggYW5kIChleHRlbnQud2lkdGggKyBkc3RPZmZzZXQueCkgbXVzdCBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE1MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZHN0T2Zmc2V0LTAwMTUxIiwgImRzdE9mZnNldC55IGFuZCAoZXh0ZW50LmhlaWdodCArIGRzdE9mZnNldC55KSBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE1MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZHN0T2Zmc2V0LTAwMTUzIiwgImRzdE9mZnNldC56IGFuZCAoZXh0ZW50LmRlcHRoICsgZHN0T2Zmc2V0LnopIG11c3QgYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBzdWJyZXNvdXJjZSBkZXB0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE2MiIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgZHN0SW1hZ2UgaXMgYSBjb21wcmVzc2VkIGZvcm1hdCBpbWFnZSwgYWxsIG1lbWJlcnMgb2YgZHN0T2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29ycmVzcG9uZGluZyBkaW1lbnNpb25zIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE2MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZHN0U3VicmVzb3VyY2UtcGFyYW1ldGVyIiwgImRzdFN1YnJlc291cmNlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWRzdFN1YnJlc291cmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTQwIiwgIlRoZSBudW1iZXIgb2Ygc2xpY2VzIG9mIHRoZSBleHRlbnQgKGZvciAzRCkgb3IgbGF5ZXJzIG9mIHRoZSBzcmNTdWJyZXNvdXJjZSAoZm9yIG5vbi0zRCkgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHNsaWNlcyBvZiB0aGUgZXh0ZW50IChmb3IgM0QpIG9yIGxheWVycyBvZiB0aGUgZHN0U3VicmVzb3VyY2UgKGZvciBub24tM0QpIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE0MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTU4IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBzcmNJbWFnZSBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIGV4dGVudC53aWR0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgd2lkdGggb3IgKGV4dGVudC53aWR0aCArIHNyY09mZnNldC54KSBtdXN0IGVxdWFsIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTU4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNTkiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgZXh0ZW50LmhlaWdodCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbXByZXNzZWQgdGV4ZWwgYmxvY2sgaGVpZ2h0IG9yIChleHRlbnQuaGVpZ2h0ICsgc3JjT2Zmc2V0LnkpIG11c3QgZXF1YWwgdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTU5KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNjAiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgZXh0ZW50LmRlcHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayBkZXB0aCBvciAoZXh0ZW50LmRlcHRoICsgc3JjT2Zmc2V0LnopIG11c3QgZXF1YWwgdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSBkZXB0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNjApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2MyIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgZHN0SW1hZ2UgaXMgYSBjb21wcmVzc2VkIGZvcm1hdCBpbWFnZSwgZXh0ZW50LndpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayB3aWR0aCBvciAoZXh0ZW50LndpZHRoICsgZHN0T2Zmc2V0LngpIG11c3QgZXF1YWwgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTY0IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBkc3RJbWFnZSBpcyBhIGNvbXByZXNzZWQgZm9ybWF0IGltYWdlLCBleHRlbnQuaGVpZ2h0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayBoZWlnaHQgb3IgKGV4dGVudC5oZWlnaHQgKyBkc3RPZmZzZXQueSkgbXVzdCBlcXVhbCB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2NCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTY1IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBkc3RJbWFnZSBpcyBhIGNvbXByZXNzZWQgZm9ybWF0IGltYWdlLCBleHRlbnQuZGVwdGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIGRlcHRoIG9yIChleHRlbnQuZGVwdGggKyBkc3RPZmZzZXQueikgbXVzdCBlcXVhbCB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTY1KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1sYXllckNvdW50LTAwMTM4IiwgIlRoZSBsYXllckNvdW50IG1lbWJlciBvZiBzcmNTdWJyZXNvdXJjZSBhbmQgZHN0U3VicmVzb3VyY2UgbXVzdCBtYXRjaCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1sYXllckNvdW50LTAwMTM4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMDEzOSIsICJJZiBlaXRoZXIgb2YgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIG9yIGRzdEltYWdlIHBhcmFtZXRlcnMgYXJlIG9mIFZrSW1hZ2VUeXBlIFZLX0lNQUdFX1RZUEVfM0QsIHRoZSBiYXNlQXJyYXlMYXllciBhbmQgbGF5ZXJDb3VudCBtZW1iZXJzIG9mIGJvdGggc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3QgYmUgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTM5KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMDE0MSIsICJJZiBlaXRoZXIgb2YgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIG9yIGRzdEltYWdlIHBhcmFtZXRlcnMgYXJlIG9mIFZrSW1hZ2VUeXBlIFZLX0lNQUdFX1RZUEVfM0QsIHRoZSBiYXNlQXJyYXlMYXllciBhbmQgbGF5ZXJDb3VudCBtZW1iZXJzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHN1YnJlc291cmNlIG11c3QgYmUgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTQxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMDE0NiIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3Mgc3JjSW1hZ2UgaXMgb2YgdHlwZSBWS19JTUFHRV9UWVBFXzFELCB0aGVuIHNyY09mZnNldC55IG11c3QgYmUgMCBhbmQgZXh0ZW50LmhlaWdodCBtdXN0IGJlIDEuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAwMTQ2KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTU1MSIsICJJZiBuZWl0aGVyIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBzcmNJbWFnZSBub3IgdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIGhhcyBhIG11bHRpLXBsYW5hciBpbWFnZSBmb3JtYXQgdGhlbiB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3QgbWF0Y2ggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE1NTEpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNTUyIiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBzcmNJbWFnZSBoYXMgYSBWa0Zvcm1hdCB3aXRoIHR3byBwbGFuZXMgdGhlbiB0aGUgc3JjU3VicmVzb3VyY2UgYXNwZWN0TWFzayBtdXN0IGJlIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVCBvciBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE1NTIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNTUzIiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBzcmNJbWFnZSBoYXMgYSBWa0Zvcm1hdCB3aXRoIHRocmVlIHBsYW5lcyB0aGVuIHRoZSBzcmNTdWJyZXNvdXJjZSBhc3BlY3RNYXNrIG11c3QgYmUgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklULCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQsIG9yIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTU1MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE1NTYiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGhhcyBhIG11bHRpLXBsYW5hciBpbWFnZSBmb3JtYXQgYW5kIHRoZSBkc3RJbWFnZSBkb2VzIG5vdCBoYXZlIGEgbXVsdGktcGxhbmFyIGltYWdlIGZvcm1hdCwgdGhlIGRzdFN1YnJlc291cmNlIGFzcGVjdE1hc2sgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNTU2KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTcyNyIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3Mgc3JjSW1hZ2UgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIHNpbmdsZS1wbGFuZSwgJ180MjInIGltYWdlIGZvcm1hdCwgYWxsIG1lbWJlcnMgb2Ygc3JjT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29ycmVzcG9uZGluZyBkaW1lbnNpb25zIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzI3KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTcyOCIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3Mgc3JjSW1hZ2UgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIHNpbmdsZS1wbGFuZSwgJ180MjInIGltYWdlIGZvcm1hdCwgZXh0ZW50LndpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayB3aWR0aCBvciAoZXh0ZW50LndpZHRoICsgc3JjT2Zmc2V0LngpIG11c3QgZXF1YWwgdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSB3aWR0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTcyOCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3MjkiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgb3IgYSBzaW5nbGUtcGxhbmUsICdfNDIyJyBpbWFnZSBmb3JtYXQsIGV4dGVudC5oZWlnaHQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIGhlaWdodCBvciAoZXh0ZW50LmhlaWdodCArIHNyY09mZnNldC55KSBtdXN0IGVxdWFsIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzI5KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTczMCIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3Mgc3JjSW1hZ2UgaXMgYSBjb21wcmVzc2VkIGltYWdlLCBvciBhIHNpbmdsZS1wbGFuZSwgJ180MjInIGltYWdlIGZvcm1hdCwgZXh0ZW50LmRlcHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29tcHJlc3NlZCB0ZXhlbCBibG9jayBkZXB0aCBvciAoZXh0ZW50LmRlcHRoICsgc3JjT2Zmc2V0LnopIG11c3QgZXF1YWwgdGhlIHNvdXJjZSBpbWFnZSBzdWJyZXNvdXJjZSBkZXB0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTczMCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3ODUiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCwgdGhlbiBzcmNPZmZzZXQueiBtdXN0IGJlIDAgYW5kIGV4dGVudC5kZXB0aCBtdXN0IGJlIDEuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzg1KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTc4NyIsICJJZiB0aGUgY2FsbGluZyBjb21tYW5kJ3Mgc3JjSW1hZ2UgaXMgb2YgdHlwZSBWS19JTUFHRV9UWVBFXzJELCB0aGVuIHNyY09mZnNldC56IG11c3QgYmUgMC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3ODcpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzg5IiwgIklmIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBzcmNJbWFnZSBvciBkc3RJbWFnZSBpcyBvZiB0eXBlIFZLX0lNQUdFX1RZUEVfMkQsIHRoZW4gZXh0ZW50LmRlcHRoIG11c3QgYmUgMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3ODkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzkwIiwgIklmIGJvdGggc3JjSW1hZ2UgYW5kIGRzdEltYWdlIGFyZSBvZiB0eXBlIFZLX0lNQUdFX1RZUEVfMkQgdGhlbiBleHRlbnQuZGVwdGggbXVzdCBiZSAxLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTc5MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3OTEiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8yRCwgYW5kIHRoZSBkc3RJbWFnZSBpcyBvZiB0eXBlIFZLX0lNQUdFX1RZUEVfM0QsIHRoZW4gZXh0ZW50LmRlcHRoIG11c3QgZXF1YWwgdG8gdGhlIGxheWVyQ291bnQgbWVtYmVyIG9mIHNyY1N1YnJlc291cmNlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTc5MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ0IiwgInNyY09mZnNldC54IGFuZCAoZXh0ZW50LndpZHRoICsgc3JjT2Zmc2V0LngpIG11c3QgYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNPZmZzZXQtMDAxNDUiLCAic3JjT2Zmc2V0LnkgYW5kIChleHRlbnQuaGVpZ2h0ICsgc3JjT2Zmc2V0LnkpIG11c3QgYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2UgaGVpZ2h0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE0NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ3IiwgInNyY09mZnNldC56IGFuZCAoZXh0ZW50LmRlcHRoICsgc3JjT2Zmc2V0LnopIG11c3QgYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzb3VyY2UgaW1hZ2Ugc3VicmVzb3VyY2UgZGVwdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ3KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ29weS1zcmNPZmZzZXQtMDAxNTciLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgYWxsIG1lbWJlcnMgb2Ygc3JjT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29ycmVzcG9uZGluZyBkaW1lbnNpb25zIG9mIHRoZSBjb21wcmVzc2VkIHRleGVsIGJsb2NrIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE1NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNvcHktc3JjU3VicmVzb3VyY2UtcGFyYW1ldGVyIiwgInNyY1N1YnJlc291cmNlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDb3B5LXNyY1N1YnJlc291cmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tRm9ybWF0LTAyNTM2IiwgIklmIEZvcm1hdCBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0IGFuZCB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgd2l0aCBpdHMgc3RlbmNpbFVzYWdlIG1lbWJlciBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQsIGV4dGVudC53aWR0aCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhGcmFtZWJ1ZmZlcldpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLUZvcm1hdC0wMjUzNikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tTm9uZS0wMTg5MSIsICJJZiBhbnkgb2YgdGhlIGJpdHMgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCwgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklULCBvciBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUIGFyZSBzZXQsIFZLX0lNQUdFX0NSRUFURV9QUk9URUNURURfQklUIG11c3Qgbm90IGFsc28gYmUgc2V0LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1Ob25lLTAxODkxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1Ob25lLTAxOTI1IiwgIklmIGFueSBvZiB0aGUgYml0cyBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULCBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQsIG9yIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQgYXJlIHNldCwgVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUIG11c3Qgbm90IGFsc28gYmUgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLU5vbmUtMDE5MjUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWFycmF5TGF5ZXJzLTAwOTQ4IiwgImFycmF5TGF5ZXJzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tYXJyYXlMYXllcnMtMDA5NDgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWFycmF5TGF5ZXJzLTAyMjU2IiwgImFycmF5TGF5ZXJzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGltYWdlQ3JlYXRlTWF4QXJyYXlMYXllcnMgKGFzIGRlZmluZWQgaW4gSW1hZ2UgQ3JlYXRpb24gTGltaXRzKS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tYXJyYXlMYXllcnMtMDIyNTYpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWV4dGVudC0wMDk0NCIsICJleHRlbnQud2lkdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZXh0ZW50LTAwOTQ0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDA5NDUiLCAiZXh0ZW50LmhlaWdodCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDA5NDUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWV4dGVudC0wMDk0NiIsICJleHRlbnQuZGVwdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZXh0ZW50LTAwOTQ2KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDIyNTIiLCAiZXh0ZW50LndpZHRoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGltYWdlQ3JlYXRlTWF4RXh0ZW50LndpZHRoIChhcyBkZWZpbmVkIGluIEltYWdlIENyZWF0aW9uIExpbWl0cykuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWV4dGVudC0wMjI1MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZXh0ZW50LTAyMjUzIiwgImV4dGVudC5oZWlnaHQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaW1hZ2VDcmVhdGVNYXhFeHRlbnQuaGVpZ2h0IChhcyBkZWZpbmVkIGluIEltYWdlIENyZWF0aW9uIExpbWl0cykuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWV4dGVudC0wMjI1MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZXh0ZW50LTAyMjU0IiwgImV4dGVudC5kZXB0aCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBpbWFnZUNyZWF0ZU1heEV4dGVudC5kZXB0aCAoYXMgZGVmaW5lZCBpbiBJbWFnZSBDcmVhdGlvbiBMaW1pdHMpLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDIyNTQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAwOTQ5IiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklULCBpbWFnZVR5cGUgbXVzdCBiZSBWS19JTUFHRV9UWVBFXzJEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAwOTQ5KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMDk1MCIsICJJZiBmbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVQsIGltYWdlVHlwZSBtdXN0IGJlIFZLX0lNQUdFX1RZUEVfM0QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDA5NTApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAwOTY5IiwgIklmIHRoZSBzcGFyc2UgYmluZGluZ3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAwOTY5KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMDk4NyIsICJJZiBmbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgb3IgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVCwgaXQgbXVzdCBhbHNvIGNvbnRhaW4gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMDk4NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDE1MzMiLCAiSWYgZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUIGZvcm1hdCBtdXN0IGJlIGEgZGVwdGggb3IgZGVwdGgvc3RlbmNpbCBmb3JtYXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDE1MzMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAxNTcyIiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklULCB0aGVuIGZvcm1hdCBtdXN0IGJlIGEgYmxvY2stY29tcHJlc3NlZCBpbWFnZSBmb3JtYXQsIGFuIEVUQyBjb21wcmVzc2VkIGltYWdlIGZvcm1hdCwgb3IgYW4gQVNUQyBjb21wcmVzc2VkIGltYWdlIGZvcm1hdC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDE1NzIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAxNTczIiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklULCB0aGVuIGZsYWdzIG11c3QgYWxzbyBjb250YWluIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAxNTczKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMTg5MCIsICJJZiB0aGUgcHJvdGVjdGVkIG1lbW9yeSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBmbGFncyBtdXN0IG5vdCBjb250YWluIFZLX0lNQUdFX0NSRUFURV9QUk9URUNURURfQklULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMTg5MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDE5MjQiLCAiSWYgdGhlIHNwYXJzZSBhbGlhc2VkIHJlc2lkZW5jeSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBmbGFncyBtdXN0IG5vdCBjb250YWluIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDE5MjQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMDUwIiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYsIGltYWdlVHlwZSBtdXN0IGJlIFZLX0lNQUdFX1RZUEVfMkQgb3IgVktfSU1BR0VfVFlQRV8zRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjA1MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDIwNTEiLCAiSWYgZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViwgaXQgbXVzdCBub3QgY29udGFpbiBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVCBhbmQgdGhlIGZvcm1hdCBtdXN0IG5vdCBiZSBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMDUxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjA1MiIsICJJZiBmbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WIGFuZCBpbWFnZVR5cGUgaXMgVktfSU1BR0VfVFlQRV8yRCwgZXh0ZW50LndpZHRoIGFuZCBleHRlbnQuaGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDIwNTIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMDUzIiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYgYW5kIGltYWdlVHlwZSBpcyBWS19JTUFHRV9UWVBFXzNELCBleHRlbnQud2lkdGgsIGV4dGVudC5oZWlnaHQsIGFuZCBleHRlbnQuZGVwdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjA1MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDIyNTkiLCAiSWYgZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVQsIHRoZW4gbWlwTGV2ZWxzIG11c3QgYmUgb25lLCBhcnJheUxheWVycyBtdXN0IGJlIG9uZSwgaW1hZ2VUeXBlIG11c3QgYmUgVktfSU1BR0VfVFlQRV8yRC4gYW5kIGltYWdlQ3JlYXRlTWF5YmVMaW5lYXIgKGFzIGRlZmluZWQgaW4gSW1hZ2UgQ3JlYXRpb24gTGltaXRzKSBtdXN0IGJlIGZhbHNlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjI1OSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NTciLCAiSWYgZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCwgaW1hZ2VUeXBlIG11c3QgYmUgVktfSU1BR0VfVFlQRV8yRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjU1NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NjUiLCAiSWYgZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVCwgdGlsaW5nIG11c3QgYmUgVktfSU1BR0VfVElMSU5HX09QVElNQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NjUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNTY2IiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQsIGltYWdlVHlwZSBtdXN0IGJlIFZLX0lNQUdFX1RZUEVfMkQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NjYpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNTY3IiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQsIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NjcpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNTY4IiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQsIG1pcExldmVscyBtdXN0IGJlIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI1NjgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMDk0MyIsICJmb3JtYXQgbXVzdCBub3QgYmUgVktfRk9STUFUX1VOREVGSU5FRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDA5NDMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMTU3NyIsICJJZiBmb3JtYXQgaXMgbm90IGEgbXVsdGktcGxhbmFyIGZvcm1hdCwgYW5kIGZsYWdzIGRvZXMgbm90IGluY2x1ZGUgVktfSU1BR0VfQ1JFQVRFX0FMSUFTX0JJVCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19JTUFHRV9DUkVBVEVfRElTSk9JTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMTU3NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNTM3IiwgIklmIGZvcm1hdCBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0IGFuZCB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgd2l0aCBpdHMgc3RlbmNpbFVzYWdlIG1lbWJlciBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQsIGV4dGVudC5oZWlnaHQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RnJhbWVidWZmZXJIZWlnaHQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNTM3KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI1MzgiLCAiSWYgdGhlIG11bHRpc2FtcGxlZCBzdG9yYWdlIGltYWdlcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBmb3JtYXQgaXMgYSBkZXB0aC1zdGVuY2lsIGZvcm1hdCBhbmQgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIHdpdGggaXRzIHN0ZW5jaWxVc2FnZSBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQsIHNhbXBsZXMgbXVzdCBiZSBWS19TQU1QTEVfQ09VTlRfMV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNTM4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI1NjEiLCAiSWYgdGhlIGltYWdlIGZvcm1hdCBpcyBvbmUgb2YgdGhvc2UgbGlzdGVkIGluIEZvcm1hdHMgcmVxdWlyaW5nIHNhbXBsZXIgWSdDQkNSIGNvbnZlcnNpb24gZm9yIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgaW1hZ2Ugdmlld3MsIHRoZW4gbWlwTGV2ZWxzIG11c3QgYmUgMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI1NjEpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjU2MiIsICJJZiB0aGUgaW1hZ2UgZm9ybWF0IGlzIG9uZSBvZiB0aG9zZSBsaXN0ZWQgaW4gRm9ybWF0cyByZXF1aXJpbmcgc2FtcGxlciBZJ0NCQ1IgY29udmVyc2lvbiBmb3IgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCBpbWFnZSB2aWV3cywgc2FtcGxlcyBtdXN0IGJlIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI1NjIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjU2MyIsICJJZiB0aGUgaW1hZ2UgZm9ybWF0IGlzIG9uZSBvZiB0aG9zZSBsaXN0ZWQgaW4gRm9ybWF0cyByZXF1aXJpbmcgc2FtcGxlciBZJ0NCQ1IgY29udmVyc2lvbiBmb3IgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCBpbWFnZSB2aWV3cywgaW1hZ2VUeXBlIG11c3QgYmUgVktfSU1BR0VfVFlQRV8yRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI1NjMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjU2NCIsICJJZiB0aGUgaW1hZ2UgZm9ybWF0IGlzIG9uZSBvZiB0aG9zZSBsaXN0ZWQgaW4gRm9ybWF0cyByZXF1aXJpbmcgc2FtcGxlciBZJ0NCQ1IgY29udmVyc2lvbiBmb3IgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCBpbWFnZSB2aWV3cywgYXJyYXlMYXllcnMgbXVzdCBiZSAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjU2NCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNjUzIiwgIklmIHRoZSBpbWFnZSBmb3JtYXQgaXMgb25lIG9mIHRob3NlIGxpc3RlZCBpbiBGb3JtYXRzIHJlcXVpcmluZyBzYW1wbGVyIFknQ0JDUiBjb252ZXJzaW9uIGZvciBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIGltYWdlIHZpZXdzLCBhbmQgdGhlIHljYmNySW1hZ2VBcnJheXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYXJyYXlMYXllcnMgbXVzdCBiZSAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjY1MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNzk1IiwgIklmIGZvcm1hdCBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0LCB1c2FnZSBpbmNsdWRlcyBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULCBhbmQgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlLCB0aGVuIGl0cyBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVDo6c3RlbmNpbFVzYWdlIG1lbWJlciBtdXN0IGFsc28gaW5jbHVkZSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjc5NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNzk2IiwgIklmIGZvcm1hdCBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0LCB1c2FnZSBkb2VzIG5vdCBpbmNsdWRlIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsIGFuZCB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUsIHRoZW4gaXRzIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUOjpzdGVuY2lsVXNhZ2UgbWVtYmVyIG11c3QgYWxzbyBub3QgaW5jbHVkZSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjc5NikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNzk3IiwgIklmIGZvcm1hdCBpcyBhIGRlcHRoLXN0ZW5jaWwgZm9ybWF0LCB1c2FnZSBpbmNsdWRlcyBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQsIGFuZCB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUsIHRoZW4gaXRzIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUOjpzdGVuY2lsVXNhZ2UgbWVtYmVyIG11c3QgYWxzbyBpbmNsdWRlIFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtMDI3OTcpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjc5OCIsICJJZiBmb3JtYXQgaXMgYSBkZXB0aC1zdGVuY2lsIGZvcm1hdCwgdXNhZ2UgZG9lcyBub3QgaW5jbHVkZSBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQsIGFuZCB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUsIHRoZW4gaXRzIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUOjpzdGVuY2lsVXNhZ2UgbWVtYmVyIG11c3QgYWxzbyBub3QgaW5jbHVkZSBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNzk4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyIiwgImZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VDcmVhdGVGb3JtYXRGZWF0dXJlcy0wMjI2MCIsICJJZiBmb3JtYXQgaXMgYSBtdWx0aS1wbGFuYXIgZm9ybWF0LCBhbmQgaWYgaW1hZ2VDcmVhdGVGb3JtYXRGZWF0dXJlcyAoYXMgZGVmaW5lZCBpbiBJbWFnZSBDcmVhdGlvbiBMaW1pdHMpIGRvZXMgbm90IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfRElTSk9JTlRfQklULCB0aGVuIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZUNyZWF0ZUZvcm1hdEZlYXR1cmVzLTAyMjYwKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZUNyZWF0ZU1heE1pcExldmVscy0wMjI1MSIsICJFYWNoIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIChhcyBkZXNjcmliZWQgaW4gSW1hZ2UgQ3JlYXRpb24gTGltaXRzKSBtdXN0IG5vdCBiZSB1bmRlZmluZWQgaW1hZ2VDcmVhdGVNYXhNaXBMZXZlbHMsIGltYWdlQ3JlYXRlTWF4QXJyYXlMYXllcnMsIGltYWdlQ3JlYXRlTWF4RXh0ZW50LCBhbmQgaW1hZ2VDcmVhdGVTYW1wbGVDb3VudHMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlQ3JlYXRlTWF4TWlwTGV2ZWxzLTAyMjUxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NTQiLCAiSWYgaW1hZ2VUeXBlIGlzIFZLX0lNQUdFX1RZUEVfMkQgYW5kIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklULCBleHRlbnQud2lkdGggYW5kIGV4dGVudC5oZWlnaHQgbXVzdCBiZSBlcXVhbCBhbmQgYXJyYXlMYXllcnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NTQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk1NiIsICJJZiBpbWFnZVR5cGUgaXMgVktfSU1BR0VfVFlQRV8xRCwgYm90aCBleHRlbnQuaGVpZ2h0IGFuZCBleHRlbnQuZGVwdGggbXVzdCBiZSAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk1NikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTU3IiwgIklmIGltYWdlVHlwZSBpcyBWS19JTUFHRV9UWVBFXzJELCBleHRlbnQuZGVwdGggbXVzdCBiZSAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk1NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTYxIiwgIklmIGltYWdlVHlwZSBpcyBWS19JTUFHRV9UWVBFXzNELCBhcnJheUxheWVycyBtdXN0IGJlIDEuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk2MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTcwIiwgIklmIGltYWdlVHlwZSBpcyBWS19JTUFHRV9UWVBFXzFELCBmbGFncyBtdXN0IG5vdCBjb250YWluIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3MSIsICJJZiB0aGUgc3BhcnNlIHJlc2lkZW5jeSBmb3IgMkQgaW1hZ2VzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpbWFnZVR5cGUgaXMgVktfSU1BR0VfVFlQRV8yRCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTcxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzIiLCAiSWYgdGhlIHNwYXJzZSByZXNpZGVuY3kgZm9yIDNEIGltYWdlcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaW1hZ2VUeXBlIGlzIFZLX0lNQUdFX1RZUEVfM0QsIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTczIiwgIklmIHRoZSBzcGFyc2UgcmVzaWRlbmN5IGZvciBpbWFnZXMgd2l0aCAyIHNhbXBsZXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgaW1hZ2VUeXBlIGlzIFZLX0lNQUdFX1RZUEVfMkQsIGFuZCBzYW1wbGVzIGlzIFZLX1NBTVBMRV9DT1VOVF8yX0JJVCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTczKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzQiLCAiSWYgdGhlIHNwYXJzZSByZXNpZGVuY3kgZm9yIGltYWdlcyB3aXRoIDQgc2FtcGxlcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBpbWFnZVR5cGUgaXMgVktfSU1BR0VfVFlQRV8yRCwgYW5kIHNhbXBsZXMgaXMgVktfU0FNUExFX0NPVU5UXzRfQklULCBmbGFncyBtdXN0IG5vdCBjb250YWluIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3NSIsICJJZiB0aGUgc3BhcnNlIHJlc2lkZW5jeSBmb3IgaW1hZ2VzIHdpdGggOCBzYW1wbGVzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGltYWdlVHlwZSBpcyBWS19JTUFHRV9UWVBFXzJELCBhbmQgc2FtcGxlcyBpcyBWS19TQU1QTEVfQ09VTlRfOF9CSVQsIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTc2IiwgIklmIHRoZSBzcGFyc2UgcmVzaWRlbmN5IGZvciBpbWFnZXMgd2l0aCAxNiBzYW1wbGVzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGltYWdlVHlwZSBpcyBWS19JTUFHRV9UWVBFXzJELCBhbmQgc2FtcGxlcyBpcyBWS19TQU1QTEVfQ09VTlRfMTZfQklULCBmbGFncyBtdXN0IG5vdCBjb250YWluIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzYpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMjA4MiIsICJJZiB1c2FnZSBpbmNsdWRlcyBWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WLCBpbWFnZVR5cGUgbXVzdCBiZSBWS19JTUFHRV9UWVBFXzJELiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDIwODIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS1wYXJhbWV0ZXIiLCAiaW1hZ2VUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlVHlwZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbml0aWFsTGF5b3V0LTAwOTkzIiwgImluaXRpYWxMYXlvdXQgbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEIG9yIFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW5pdGlhbExheW91dC0wMDk5MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW5pdGlhbExheW91dC1wYXJhbWV0ZXIiLCAiaW5pdGlhbExheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbml0aWFsTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tbWlwTGV2ZWxzLTAwOTQ3IiwgIm1pcExldmVscyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMDk0NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tbWlwTGV2ZWxzLTAwOTU4IiwgIm1pcExldmVscyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgY29tcGxldGUgbWlwbWFwIGNoYWluIGJhc2VkIG9uIGV4dGVudC53aWR0aCwgZXh0ZW50LmhlaWdodCwgYW5kIGV4dGVudC5kZXB0aC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tbWlwTGV2ZWxzLTAwOTU4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1taXBMZXZlbHMtMDIyNTUiLCAibWlwTGV2ZWxzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGltYWdlQ3JlYXRlTWF4TWlwTGV2ZWxzIChhcyBkZWZpbmVkIGluIEltYWdlIENyZWF0aW9uIExpbWl0cykuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMjI1NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDA5ODgiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSwgaXQgbXVzdCBub3QgY29udGFpbiBhIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gc3RydWN0dXJlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMDk4OCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDA5OTAiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUsIGl0cyBoYW5kbGVUeXBlcyBtZW1iZXIgbXVzdCBvbmx5IGNvbnRhaW4gYml0cyB0aGF0IGFyZSBhbHNvIGluIFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXM6OmV4dGVybmFsTWVtb3J5UHJvcGVydGllcy5jb21wYXRpYmxlSGFuZGxlVHlwZXMsIGFzIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIHdpdGggZm9ybWF0LCBpbWFnZVR5cGUsIHRpbGluZywgdXNhZ2UsIGFuZCBmbGFncyBlcXVhbCB0byB0aG9zZSBpbiB0aGlzIHN0cnVjdHVyZSwgYW5kIHdpdGggYSBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8gc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiwgd2l0aCBhIGhhbmRsZVR5cGUgZXF1YWwgdG8gYW55IG9uZSBvZiB0aGUgaGFuZGxlIHR5cGVzIHNwZWNpZmllZCBpbiBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvOjpoYW5kbGVUeXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMDk5MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDA5OTEiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mb05WIHN0cnVjdHVyZSwgaXRzIGhhbmRsZVR5cGVzIG1lbWJlciBtdXN0IG9ubHkgY29udGFpbiBiaXRzIHRoYXQgYXJlIGFsc28gaW4gVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WOjpleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMuY29tcGF0aWJsZUhhbmRsZVR5cGVzLCBhcyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOViB3aXRoIGZvcm1hdCwgaW1hZ2VUeXBlLCB0aWxpbmcsIHVzYWdlLCBhbmQgZmxhZ3MgZXF1YWwgdG8gdGhvc2UgaW4gdGhpcyBzdHJ1Y3R1cmUsIGFuZCB3aXRoIGV4dGVybmFsSGFuZGxlVHlwZSBlcXVhbCB0byBhbnkgb25lIG9mIHRoZSBoYW5kbGUgdHlwZXMgc3BlY2lmaWVkIGluIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9OVjo6aGFuZGxlVHlwZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDA5OTEpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAxNDQzIiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIGlmZGVmOjpWS19WRVJTSU9OXzFfMSxWS19LSFJfZXh0ZXJuYWxfbWVtb3J5W1ZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm9dIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAxNDQzKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMTk3NCIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBzdHJ1Y3R1cmUsIGFuZCBpdHMgZXh0ZXJuYWxGb3JtYXQgbWVtYmVyIGlzIG5vbi16ZXJvIHRoZSBmb3JtYXQgbXVzdCBiZSBWS19GT1JNQVRfVU5ERUZJTkVELiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMTk3NCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDE5NzUiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGRvZXMgbm90IGluY2x1ZGUgYSBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBzdHJ1Y3R1cmUsIG9yIGRvZXMgYW5kIGl0cyBleHRlcm5hbEZvcm1hdCBtZW1iZXIgaXMgMCwgdGhlIGZvcm1hdCBtdXN0IG5vdCBiZSBWS19GT1JNQVRfVU5ERUZJTkVELiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMTk3NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIyNjIiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQgb3IgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSwgdGhlbiB0aWxpbmcgbXVzdCBiZSBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIyNjIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzkzIiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gc3RydWN0dXJlIHdob3NlIGhhbmRsZVR5cGVzIG1lbWJlciBpbmNsdWRlcyBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQsIGltYWdlVHlwZSBtdXN0IGJlIFZLX0lNQUdFX1RZUEVfMkQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzkzKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMjM5NCIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIHN0cnVjdHVyZSB3aG9zZSBoYW5kbGVUeXBlcyBtZW1iZXIgaW5jbHVkZXMgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lELCBtaXBMZXZlbHMgbXVzdCBlaXRoZXIgYmUgMSBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgY29tcGxldGUgbWlwbWFwIGNoYWluIGJhc2VkIG9uIGV4dGVudC53aWR0aCwgZXh0ZW50LmhlaWdodCwgYW5kIGV4dGVudC5kZXB0aC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIzOTQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk2IiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHN0cnVjdHVyZSB3aG9zZSBleHRlcm5hbEZvcm1hdCBtZW1iZXIgaXMgbm90IDAsIGZsYWdzIG11c3Qgbm90IGluY2x1ZGUgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIzOTYpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk3IiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIHN0cnVjdHVyZSB3aG9zZSBleHRlcm5hbEZvcm1hdCBtZW1iZXIgaXMgbm90IDAsIHVzYWdlIG11c3Qgbm90IGluY2x1ZGUgYW55IHVzYWdlcyBleGNlcHQgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk3KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMjM5OCIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBzdHJ1Y3R1cmUgd2hvc2UgZXh0ZXJuYWxGb3JtYXQgbWVtYmVyIGlzIG5vdCAwLCB0aWxpbmcgbXVzdCBiZSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDIzOTgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgIkVhY2ggcE5leHQgbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlYsIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lELCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvLCBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvTlYsIFZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVCwgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQsIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiwgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQsIG9yIFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1waHlzaWNhbERldmljZUNvdW50LTAxNDIxIiwgIklmIHRoZSBsb2dpY2FsIGRldmljZSB3YXMgY3JlYXRlZCB3aXRoIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvOjpwaHlzaWNhbERldmljZUNvdW50IGVxdWFsIHRvIDEsIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfSU1BR0VfQ1JFQVRFX1NQTElUX0lOU1RBTkNFX0JJTkRfUkVHSU9OU19CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcGh5c2ljYWxEZXZpY2VDb3VudC0wMTQyMSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtMDIwODMiLCAiSWYgdXNhZ2UgaW5jbHVkZXMgVktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OViwgc2FtcGxlcyBtdXN0IGJlIFZLX1NBTVBMRV9DT1VOVF8xX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2FtcGxlcy0wMjA4MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2FtcGxlcy0wMjI1NyIsICJJZiBzYW1wbGVzIGlzIG5vdCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIHRoZW4gaW1hZ2VUeXBlIG11c3QgYmUgVktfSU1BR0VfVFlQRV8yRCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVCwgbWlwTGV2ZWxzIG11c3QgYmUgZXF1YWwgdG8gMSwgYW5kIGltYWdlQ3JlYXRlTWF5YmVMaW5lYXIgKGFzIGRlZmluZWQgaW4gSW1hZ2UgQ3JlYXRpb24gTGltaXRzKSBtdXN0IGJlIGZhbHNlLCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLTAyMjU3KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLTAyMjU4IiwgInNhbXBsZXMgbXVzdCBiZSBhIGJpdCB2YWx1ZSB0aGF0IGlzIHNldCBpbiBpbWFnZUNyZWF0ZVNhbXBsZUNvdW50cyAoYXMgZGVmaW5lZCBpbiBJbWFnZSBDcmVhdGlvbiBMaW1pdHMpLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLTAyMjU4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLTAyNTU4IiwgIklmIHNhbXBsZXMgaXMgbm90IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgdXNhZ2UgbXVzdCBub3QgY29udGFpbiBWS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtMDI1NTgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtcGFyYW1ldGVyIiwgInNhbXBsZXMgbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlQ291bnRGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDA5NDEiLCAiSWYgc2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHBRdWV1ZUZhbWlseUluZGljZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcXVldWVGYW1pbHlJbmRleENvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMDk0MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDA5NDIiLCAiSWYgc2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHF1ZXVlRmFtaWx5SW5kZXhDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAwOTQyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMTM5MiIsICJJZiBzaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgZWFjaCBlbGVtZW50IG9mIHBRdWV1ZUZhbWlseUluZGljZXMgbXVzdCBiZSB1bmlxdWUgYW5kIG11c3QgYmUgbGVzcyB0aGFuIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBmb3IgdGhlIHBoeXNpY2FsRGV2aWNlIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMTM5MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDE0MjAiLCAiSWYgc2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIGVhY2ggZWxlbWVudCBvZiBwUXVldWVGYW1pbHlJbmRpY2VzIG11c3QgYmUgdW5pcXVlIGFuZCBtdXN0IGJlIGxlc3MgdGhhbiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50IHJldHVybmVkIGJ5IGVpdGhlciB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIG9yIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyIGZvciB0aGUgcGh5c2ljYWxEZXZpY2UgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxNDIwKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS1wYXJhbWV0ZXIiLCAic2hhcmluZ01vZGUgbXVzdCBiZSBhIHZhbGlkIFZrU2hhcmluZ01vZGUgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2hhcmluZ01vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby10aWxpbmctMDIwODQiLCAiSWYgdXNhZ2UgaW5jbHVkZXMgVktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OViwgdGlsaW5nIG11c3QgYmUgVktfSU1BR0VfVElMSU5HX09QVElNQUwuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXRpbGluZy0wMjA4NCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdGlsaW5nLTAyMjYxIiwgIklmIHRpbGluZyBpcyBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQsIHRoZW4gdGhlIHBOZXh0IGNoYWluIG11c3QgaW5jbHVkZSBleGFjdGx5IG9uZSBvZiBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVCBvciBWa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby10aWxpbmctMDIyNjEpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXRpbGluZy0wMjM1MyIsICJJZiB0aWxpbmcgaXMgVktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUIGFuZCBmbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklULCB0aGVuIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgYW4gVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSB3aXRoIG5vbi16ZXJvIHZpZXdGb3JtYXRDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby10aWxpbmctMDIzNTMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXRpbGluZy1wYXJhbWV0ZXIiLCAidGlsaW5nIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlVGlsaW5nIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXRpbGluZy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTYzIiwgIklmIHVzYWdlIGluY2x1ZGVzIFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCwgdGhlbiBiaXRzIG90aGVyIHRoYW4gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsIGFuZCBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCBtdXN0IG5vdCBiZSBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTY0IiwgIklmIHVzYWdlIGluY2x1ZGVzIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQsIG9yIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklULCBleHRlbnQud2lkdGggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RnJhbWVidWZmZXJXaWR0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMDk2NCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjUiLCAiSWYgdXNhZ2UgaW5jbHVkZXMgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCwgb3IgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQsIGV4dGVudC5oZWlnaHQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RnJhbWVidWZmZXJIZWlnaHQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTY2IiwgIklmIHVzYWdlIGluY2x1ZGVzIFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCwgdXNhZ2UgbXVzdCBhbHNvIGNvbnRhaW4gYXQgbGVhc3Qgb25lIG9mIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULCBvciBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjYpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTY4IiwgIklmIHRoZSBtdWx0aXNhbXBsZWQgc3RvcmFnZSBpbWFnZXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIHVzYWdlIGNvbnRhaW5zIFZLX0lNQUdFX1VTQUdFX1NUT1JBR0VfQklULCBzYW1wbGVzIG11c3QgYmUgVktfU0FNUExFX0NPVU5UXzFfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTY4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMjU1OSIsICJJZiB1c2FnZSBpbmNsdWRlcyBWS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhULCBleHRlbnQud2lkdGggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNlaWxpbmcgb2YgbWF4RnJhbWVidWZmZXJXaWR0aC9taW5GcmFnbWVudERlbnNpdHlUZXhlbFNpemUud2lkdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDI1NTkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAyNTYwIiwgIklmIHVzYWdlIGluY2x1ZGVzIFZLX0lNQUdFX1VTQUdFX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0JJVF9FWFQsIGV4dGVudC5oZWlnaHQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNlaWxpbmcgb2YgbWF4RnJhbWVidWZmZXJIZWlnaHQvbWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplLmhlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMjU2MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtcGFyYW1ldGVyIiwgInVzYWdlIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlVXNhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS1yZXF1aXJlZGJpdG1hc2siLCAidXNhZ2UgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1hcnJheVBpdGNoLTAyMjY4IiwgIkZvciBlYWNoIGVsZW1lbnQgb2YgcFBsYW5lTGF5b3V0cywgYXJyYXlQaXRjaCBtdXN0IGJlIDAgaWYgVmtJbWFnZUNyZWF0ZUluZm86OmFycmF5TGF5ZXJzIGlzIDEuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1hcnJheVBpdGNoLTAyMjY4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQtZGVwdGhQaXRjaC0wMjI2OSIsICJGb3IgZWFjaCBlbGVtZW50IG9mIHBQbGFuZUxheW91dHMsIGRlcHRoUGl0Y2ggbXVzdCBiZSAwIGlmIFZrSW1hZ2VDcmVhdGVJbmZvOjpleHRlbnQuZGVwdGggaXMgMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhULWRlcHRoUGl0Y2gtMDIyNjkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1kcm1Gb3JtYXRNb2RpZmllci0wMjI2NCIsICJkcm1Gb3JtYXRNb2RpZmllciBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBpbiBWa0ltYWdlQ3JlYXRlSW5mbyBhbmQgaXRzIHBOZXh0IGNoYWluLCBhcyBkZXRlcm1pbmVkIGJ5IHF1ZXJ5aW5nIFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIGV4dGVuZGVkIHdpdGggVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQtZHJtRm9ybWF0TW9kaWZpZXItMDIyNjQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQtMDIyNjUiLCAiZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50IG11c3QgYmUgZXF1YWwgdG8gdGhlIFZrRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhUOjpkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQgYXNzb2NpYXRlZCB3aXRoIFZrSW1hZ2VDcmVhdGVJbmZvOjpmb3JtYXQgYW5kIGRybUZvcm1hdE1vZGlmaWVyLCBhcyBmb3VuZCBieSBxdWVyeWluZyBWa0RybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0xpc3RFWFQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1kcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQtMDIyNjUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1wUGxhbmVMYXlvdXRzLXBhcmFtZXRlciIsICJJZiBkcm1Gb3JtYXRNb2RpZmllclBsYW5lQ291bnQgaXMgbm90IDAsIHBQbGFuZUxheW91dHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50IFZrU3VicmVzb3VyY2VMYXlvdXQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQtcFBsYW5lTGF5b3V0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhQTElDSVRfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckV4cGxpY2l0Q3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyRXhwbGljaXRDcmVhdGVJbmZvRVhULXNpemUtMDIyNjciLCAiRm9yIGVhY2ggZWxlbWVudCBvZiBwUGxhbmVMYXlvdXRzLCBzaXplIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJFeHBsaWNpdENyZWF0ZUluZm9FWFQtc2l6ZS0wMjI2NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQtZHJtRm9ybWF0TW9kaWZpZXJDb3VudC1hcnJheWxlbmd0aCIsICJkcm1Gb3JtYXRNb2RpZmllckNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQtZHJtRm9ybWF0TW9kaWZpZXJDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQtcERybUZvcm1hdE1vZGlmaWVycy0wMjI2MyIsICJFYWNoIG1vZGlmaWVyIGluIHBEcm1Gb3JtYXRNb2RpZmllcnMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgaW4gVmtJbWFnZUNyZWF0ZUluZm8gYW5kIGl0cyBwTmV4dCBjaGFpbiwgYXMgZGV0ZXJtaW5lZCBieSBxdWVyeWluZyBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiBleHRlbmRlZCB3aXRoIFZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQtcERybUZvcm1hdE1vZGlmaWVycy0wMjI2MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQtcERybUZvcm1hdE1vZGlmaWVycy1wYXJhbWV0ZXIiLCAicERybUZvcm1hdE1vZGlmaWVycyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkcm1Gb3JtYXRNb2RpZmllckNvdW50IHVpbnQ2NF90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJMaXN0Q3JlYXRlSW5mb0VYVC1wRHJtRm9ybWF0TW9kaWZpZXJzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyTGlzdENyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9EUk1fRk9STUFUX01PRElGSUVSX0xJU1RfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckxpc3RDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRFJNX0ZPUk1BVF9NT0RJRklFUl9QUk9QRVJUSUVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFItZmxhZ3MtMDE1NzkiLCAiSWYgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIGRvZXMgbm90IGNvbnRhaW4gVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCwgdmlld0Zvcm1hdENvdW50IG11c3QgYmUgMCBvciAxLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFItZmxhZ3MtMDE1NzkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUi1wVmlld0Zvcm1hdHMtcGFyYW1ldGVyIiwgIklmIHZpZXdGb3JtYXRDb3VudCBpcyBub3QgMCwgcFZpZXdGb3JtYXRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZpZXdGb3JtYXRDb3VudCB2YWxpZCBWa0Zvcm1hdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSLXBWaWV3Rm9ybWF0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUi12aWV3Rm9ybWF0Q291bnQtMDE1NzgiLCAiSWYgdmlld0Zvcm1hdENvdW50IGlzIG5vdCAwLCBhbGwgb2YgdGhlIGZvcm1hdHMgaW4gdGhlIHBWaWV3Rm9ybWF0cyBhcnJheSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbiB0aGUgZm9ybWF0IGZpZWxkIG9mIFZrSW1hZ2VDcmVhdGVJbmZvLCBhcyBkZXNjcmliZWQgaW4gdGhlIGNvbXBhdGliaWxpdHkgdGFibGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUi12aWV3Rm9ybWF0Q291bnQtMDE1NzgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUi12aWV3Rm9ybWF0Q291bnQtMDE1ODAiLCAiSWYgdmlld0Zvcm1hdENvdW50IGlzIG5vdCAwLCBWa0ltYWdlQ3JlYXRlSW5mbzo6Zm9ybWF0IG11c3QgYmUgaW4gcFZpZXdGb3JtYXRzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFItdmlld0Zvcm1hdENvdW50LTAxNTgwKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlRm9ybWF0UHJvcGVydGllczItcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCwgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcywgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVCwgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLCBvciBWa1RleHR1cmVMT0RHYXRoZXJGb3JtYXRQcm9wZXJ0aWVzQU1EIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfRk9STUFUX1BST1BFUlRJRVNfMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlRm9ybWF0UHJvcGVydGllczItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS11bmlxdWUiLCAiRWFjaCBzVHlwZSBtZW1iZXIgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgdW5pcXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS11bmlxdWUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMTk5IiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHNyY1F1ZXVlRmFtaWx5SW5kZXggYW5kIGRzdFF1ZXVlRmFtaWx5SW5kZXggbXVzdCBib3RoIGJlIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMTk5KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTIwMCIsICJJZiBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsIHNyY1F1ZXVlRmFtaWx5SW5kZXggYW5kIGRzdFF1ZXVlRmFtaWx5SW5kZXggbXVzdCBlaXRoZXIgYm90aCBiZSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwgb3IgYm90aCBiZSBhIHZhbGlkIHF1ZXVlIGZhbWlseSAoc2VlIFF1ZXVlIEZhbWlseSBQcm9wZXJ0aWVzKS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEyMDApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjAxIiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSBhbmQgc3JjUXVldWVGYW1pbHlJbmRleCBpcyBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwgZHN0UXVldWVGYW1pbHlJbmRleCBtdXN0IGFsc28gYmUgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjAxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTIwNSIsICJJZiBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsIGFuZCBzcmNRdWV1ZUZhbWlseUluZGV4IGFuZCBkc3RRdWV1ZUZhbWlseUluZGV4IGFyZSBub3QgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIGF0IGxlYXN0IG9uZSBvZiB0aGVtIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGZhbWlseSBvZiB0aGUgcXVldWUgdGhhdCB3aWxsIGV4ZWN1dGUgdGhpcyBiYXJyaWVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjA1KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTIwNyIsICJJZiBpbWFnZSBoYXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCB3aXRoIGJvdGggZGVwdGggYW5kIHN0ZW5jaWwgY29tcG9uZW50cywgdGhlbiB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3VicmVzb3VyY2VSYW5nZSBtdXN0IGluY2x1ZGUgYm90aCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIGFuZCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEyMDcpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMzgxIiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIGF0IGxlYXN0IG9uZSBvZiBzcmNRdWV1ZUZhbWlseUluZGV4IGFuZCBkc3RRdWV1ZUZhbWlseUluZGV4IG11c3QgYmUgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEzODEpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxNjcxIiwgIklmIGltYWdlIGhhcyBhIHNpbmdsZS1wbGFuZSBjb2xvciBmb3JtYXQgb3IgaXMgbm90IGRpc2pvaW50LCB0aGVuIHRoZSBhc3BlY3RNYXNrIG1lbWJlciBvZiBzdWJyZXNvdXJjZVJhbmdlIG11c3QgYmUgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTY3MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE2NzIiLCAiSWYgaW1hZ2UgaGFzIGEgbXVsdGktcGxhbmFyIGZvcm1hdCBhbmQgdGhlIGltYWdlIGlzIGRpc2pvaW50LCB0aGVuIHRoZSBhc3BlY3RNYXNrIG1lbWJlciBvZiBzdWJyZXNvdXJjZVJhbmdlIG11c3QgaW5jbHVkZSBlaXRoZXIgYXQgbGVhc3Qgb25lIG9mIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVCwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklULCBhbmQgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUOyBvciBtdXN0IGluY2x1ZGUgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTY3MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE2NzMiLCAiSWYgaW1hZ2UgaGFzIGEgbXVsdGktcGxhbmFyIGZvcm1hdCB3aXRoIG9ubHkgdHdvIHBsYW5lcywgdGhlbiB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3VicmVzb3VyY2VSYW5nZSBtdXN0IG5vdCBpbmNsdWRlIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTY3MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE3NjYiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCBhIHNoYXJpbmcgbW9kZSBvZiBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgYW5kIG9uZSBvZiBzcmNRdWV1ZUZhbWlseUluZGV4IGFuZCBkc3RRdWV1ZUZhbWlseUluZGV4IGlzIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELCB0aGUgb3RoZXIgbXVzdCBiZSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCBvciBhIHNwZWNpYWwgcXVldWUgZmFtaWx5IHJlc2VydmVkIGZvciBleHRlcm5hbCBtZW1vcnkgdHJhbnNmZXJzLCBhcyBkZXNjcmliZWQgaW4gUXVldWUgRmFtaWx5IE93bmVyc2hpcCBUcmFuc2Zlci4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE3NjYpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxNzY3IiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSBzaGFyaW5nIG1vZGUgb2YgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSBhbmQgc3JjUXVldWVGYW1pbHlJbmRleCBpcyBub3QgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIGl0IG11c3QgYmUgYSB2YWxpZCBxdWV1ZSBmYW1pbHkgb3IgYSBzcGVjaWFsIHF1ZXVlIGZhbWlseSByZXNlcnZlZCBmb3IgZXh0ZXJuYWwgbWVtb3J5IHRyYW5zZmVycywgYXMgZGVzY3JpYmVkIGluIFF1ZXVlIEZhbWlseSBPd25lcnNoaXAgVHJhbnNmZXIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxNzY3KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2OCIsICJJZiBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIGEgc2hhcmluZyBtb2RlIG9mIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUgYW5kIGRzdFF1ZXVlRmFtaWx5SW5kZXggaXMgbm90IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELCBpdCBtdXN0IGJlIGEgdmFsaWQgcXVldWUgZmFtaWx5IG9yIGEgc3BlY2lhbCBxdWV1ZSBmYW1pbHkgcmVzZXJ2ZWQgZm9yIGV4dGVybmFsIG1lbW9yeSB0cmFuc2ZlcnMsIGFzIGRlc2NyaWJlZCBpbiBRdWV1ZSBGYW1pbHkgT3duZXJzaGlwIFRyYW5zZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2OCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE5MzIiLCAiSWYgaW1hZ2UgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTkzMikifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDMzMTkiLCAiSWYgaW1hZ2UgaGFzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgd2l0aCBib3RoIGRlcHRoIGFuZCBzdGVuY2lsIGFuZCB0aGUgc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzIGZlYXR1cmUgaXMgZW5hYmxlZCwgdGhlbiB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3VicmVzb3VyY2VSYW5nZSBtdXN0IGluY2x1ZGUgZWl0aGVyIG9yIGJvdGggVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCBhbmQgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAzMzE5KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMzMyMCIsICJJZiBpbWFnZSBoYXMgYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCB3aXRoIGJvdGggZGVwdGggYW5kIHN0ZW5jaWwgYW5kIHRoZSBzZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgdGhlbiB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3VicmVzb3VyY2VSYW5nZSBtdXN0IGluY2x1ZGUgYm90aCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIGFuZCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDMzMjApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLXBhcmFtZXRlciIsICJpbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1uZXdMYXlvdXQtMDExOTgiLCAibmV3TGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgb3IgVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW5ld0xheW91dC0wMTE5OCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItbmV3TGF5b3V0LXBhcmFtZXRlciIsICJuZXdMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItbmV3TGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMTk3IiwgIm9sZExheW91dCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgb3IgdGhlIGN1cnJlbnQgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgYWZmZWN0ZWQgYnkgdGhlIGJhcnJpZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMTk3KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMDgiLCAiSWYgZWl0aGVyIG9sZExheW91dCBvciBuZXdMYXlvdXQgaXMgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCB0aGVuIGltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjA4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMDkiLCAiSWYgZWl0aGVyIG9sZExheW91dCBvciBuZXdMYXlvdXQgaXMgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIHRoZW4gaW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIwOSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEwIiwgIklmIGVpdGhlciBvbGRMYXlvdXQgb3IgbmV3TGF5b3V0IGlzIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIHRoZW4gaW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjExIiwgIklmIGVpdGhlciBvbGRMYXlvdXQgb3IgbmV3TGF5b3V0IGlzIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwgdGhlbiBpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgb3IgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEyIiwgIklmIGVpdGhlciBvbGRMYXlvdXQgb3IgbmV3TGF5b3V0IGlzIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCB0aGVuIGltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMyIsICJJZiBlaXRoZXIgb2xkTGF5b3V0IG9yIG5ld0xheW91dCBpcyBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwgdGhlbiBpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEzKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDE2NTgiLCAiSWYgZWl0aGVyIG9sZExheW91dCBvciBuZXdMYXlvdXQgaXMgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCB0aGVuIGltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDE2NTgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTY1OSIsICJJZiBlaXRoZXIgb2xkTGF5b3V0IG9yIG5ld0xheW91dCBpcyBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIHRoZW4gaW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTY1OSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAyMDg4IiwgIklmIGVpdGhlciBvbGRMYXlvdXQgb3IgbmV3TGF5b3V0IGlzIFZLX0lNQUdFX0xBWU9VVF9TSEFESU5HX1JBVEVfT1BUSU1BTF9OViB0aGVuIGltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDIwODgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC1wYXJhbWV0ZXIiLCAib2xkTGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlTGF5b3V0IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE0ODYiLCAic3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG1pcExldmVscyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNDg2KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNDg4IiwgInN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGFycmF5TGF5ZXJzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE0ODgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE3MjQiLCAiSWYgc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50IGlzIG5vdCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUywgc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgKyBzdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1pcExldmVscyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNzI0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNzI1IiwgIklmIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCBpcyBub3QgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUywgc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciArIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYXJyYXlMYXllcnMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTcyNSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS1wYXJhbWV0ZXIiLCAic3VicmVzb3VyY2VSYW5nZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItaW1hZ2UtMDE1ODkiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCBhIG11bHRpLXBsYW5hciBmb3JtYXQgYW5kIHRoZSBWS19JTUFHRV9DUkVBVEVfRElTSk9JTlRfQklUIGZsYWcsIHRoZXJlIG11c3QgYmUgYSBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBvZiB0aGUgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItaW1hZ2UtMDE1ODkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS0wMTU5MCIsICJJZiBpbWFnZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVCBmbGFnLCB0aGVyZSBtdXN0IG5vdCBiZSBhIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIHRoZSBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS0wMTU5MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLTAxNTkxIiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSBzaW5nbGUtcGxhbmUgZm9ybWF0LCB0aGVyZSBtdXN0IG5vdCBiZSBhIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIHRoZSBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS0wMTU5MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLTAxODk3IiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggdGhlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCBleHRlcm5hbCBtZW1vcnkgaGFuZGxlIHR5cGUsIHRoZW4gaW1hZ2UgbXVzdCBiZSBib3VuZCB0byBtZW1vcnkuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS0wMTg5NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLTAyMjc5IiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVCBhbmQgd2l0aCBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQsIHRoZW4gdGhlcmUgbXVzdCBiZSBhIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIHRoZSBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS0wMjI3OSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLTAyMjgwIiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSBzaW5nbGUtcGxhbmUgZm9ybWF0IGFuZCB3aXRoIGFueSB0aWxpbmcgb3RoZXIgdGhhbiBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQsIHRoZW4gdGhlcmUgbXVzdCBub3QgYmUgYSBWa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBvZiB0aGUgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItaW1hZ2UtMDIyODApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS1wYXJhbWV0ZXIiLCAiaW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mbyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEtZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQS1pbWFnZVBpcGVIYW5kbGUtMDAwMDAiLCAiaW1hZ2VQaXBlSGFuZGxlIG11c3QgYmUgYSB2YWxpZCB6eF9oYW5kbGVfdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQS1pbWFnZVBpcGVIYW5kbGUtMDAwMDApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlUGlwZVN1cmZhY2VDcmVhdGVJbmZvRlVDSFNJQS1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVBpcGVTdXJmYWNlQ3JlYXRlSW5mb0ZVQ0hTSUEtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRVBJUEVfU1VSRkFDRV9DUkVBVEVfSU5GT19GVUNIU0lBIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvLXBsYW5lQXNwZWN0LTAyMjgxIiwgIklmIHRoZSBpbWFnZSdzIHRpbGluZyBpcyBWS19JTUFHRV9USUxJTkdfTElORUFSIG9yIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCB0aGVuIHBsYW5lQXNwZWN0IG11c3QgYmUgYSBzaW5nbGUgdmFsaWQgZm9ybWF0IHBsYW5lIGZvciB0aGUgaW1hZ2UuIChUaGF0IGlzLCBmb3IgYSB0d28tcGxhbmUgaW1hZ2UgcGxhbmVBc3BlY3QgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQgb3IgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklULCBhbmQgZm9yIGEgdGhyZWUtcGxhbmUgaW1hZ2UgcGxhbmVBc3BlY3QgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCBvciBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQpLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvLXBsYW5lQXNwZWN0LTAyMjgxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlUGxhbmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvLXBsYW5lQXNwZWN0LTAyMjgyIiwgIklmIHRoZSBpbWFnZSdzIHRpbGluZyBpcyBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQsICB0aGVuIHBsYW5lQXNwZWN0IG11c3QgYmUgYSBzaW5nbGUgdmFsaWQgbWVtb3J5IHBsYW5lIGZvciB0aGUgIGltYWdlLiAgKFRoYXQgaXMsIGFzcGVjdE1hc2sgbXVzdCBzcGVjaWZ5IGEgcGxhbmUgaW5kZXggdGhhdCBpcyBsZXNzIHRoYW4gIHRoZSAgZHJtRm9ybWF0TW9kaWZpZXJQbGFuZUNvdW50ICBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlJ3MgZm9ybWF0IGFuZCBkcm1Gb3JtYXRNb2RpZmllci4pIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8tcGxhbmVBc3BlY3QtMDIyODIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8tcGxhbmVBc3BlY3QtcGFyYW1ldGVyIiwgInBsYW5lQXNwZWN0IG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mby1wbGFuZUFzcGVjdC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9QTEFORV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVBsYW5lTWVtb3J5UmVxdWlyZW1lbnRzSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtYXNwZWN0TWFzay0wMDI2NiIsICJUaGUgYXNwZWN0TWFzayBtZW1iZXIgb2Ygc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3Qgb25seSBjb250YWluIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVJlc29sdmUtYXNwZWN0TWFzay0wMDI2NikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtZHN0SW1hZ2UtMDAyNzYiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCwgdGhlbiBkc3RPZmZzZXQueSBtdXN0IGJlIDAgYW5kIGV4dGVudC5oZWlnaHQgbXVzdCBiZSAxLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlUmVzb2x2ZS1kc3RJbWFnZS0wMDI3NikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtZHN0SW1hZ2UtMDAyNzgiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIGRzdEltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCBvciBWS19JTUFHRV9UWVBFXzJELCB0aGVuIGRzdE9mZnNldC56IG11c3QgYmUgMCBhbmQgZXh0ZW50LmRlcHRoIG11c3QgYmUgMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVJlc29sdmUtZHN0SW1hZ2UtMDAyNzgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VSZXNvbHZlLWRzdE9mZnNldC0wMDI3NCIsICJkc3RPZmZzZXQueCBhbmQgKGV4dGVudC53aWR0aCArIGRzdE9mZnNldC54KSBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugc3VicmVzb3VyY2Ugd2lkdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVJlc29sdmUtZHN0T2Zmc2V0LTAwMjc0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1kc3RPZmZzZXQtMDAyNzUiLCAiZHN0T2Zmc2V0LnkgYW5kIChleHRlbnQuaGVpZ2h0ICsgZHN0T2Zmc2V0LnkpIG11c3QgYm90aCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBzdWJyZXNvdXJjZSBoZWlnaHQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVJlc29sdmUtZHN0T2Zmc2V0LTAwMjc1KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlUmVzb2x2ZS1kc3RPZmZzZXQtMDAyNzciLCAiZHN0T2Zmc2V0LnogYW5kIChleHRlbnQuZGVwdGggKyBkc3RPZmZzZXQueikgbXVzdCBib3RoIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHN1YnJlc291cmNlIGRlcHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VSZXNvbHZlLWRzdE9mZnNldC0wMDI3NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtZHN0U3VicmVzb3VyY2UtcGFyYW1ldGVyIiwgImRzdFN1YnJlc291cmNlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VSZXNvbHZlLWRzdFN1YnJlc291cmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtbGF5ZXJDb3VudC0wMDI2NyIsICJUaGUgbGF5ZXJDb3VudCBtZW1iZXIgb2Ygc3JjU3VicmVzb3VyY2UgYW5kIGRzdFN1YnJlc291cmNlIG11c3QgbWF0Y2ggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVJlc29sdmUtbGF5ZXJDb3VudC0wMDI2NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtc3JjSW1hZ2UtMDAyNjgiLCAiSWYgZWl0aGVyIG9mIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBzcmNJbWFnZSBvciBkc3RJbWFnZSBwYXJhbWV0ZXJzIGFyZSBvZiBWa0ltYWdlVHlwZSBWS19JTUFHRV9UWVBFXzNELCB0aGUgYmFzZUFycmF5TGF5ZXIgYW5kIGxheWVyQ291bnQgbWVtYmVycyBvZiBib3RoIHNyY1N1YnJlc291cmNlIGFuZCBkc3RTdWJyZXNvdXJjZSBtdXN0IGJlIDAgYW5kIDEsIHJlc3BlY3RpdmVseSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlUmVzb2x2ZS1zcmNJbWFnZS0wMDI2OCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtc3JjSW1hZ2UtMDAyNzEiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCwgdGhlbiBzcmNPZmZzZXQueSBtdXN0IGJlIDAgYW5kIGV4dGVudC5oZWlnaHQgbXVzdCBiZSAxLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlUmVzb2x2ZS1zcmNJbWFnZS0wMDI3MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtc3JjSW1hZ2UtMDAyNzMiLCAiSWYgdGhlIGNhbGxpbmcgY29tbWFuZCdzIHNyY0ltYWdlIGlzIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRCBvciBWS19JTUFHRV9UWVBFXzJELCB0aGVuIHNyY09mZnNldC56IG11c3QgYmUgMCBhbmQgZXh0ZW50LmRlcHRoIG11c3QgYmUgMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVJlc29sdmUtc3JjSW1hZ2UtMDAyNzMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VSZXNvbHZlLXNyY09mZnNldC0wMDI2OSIsICJzcmNPZmZzZXQueCBhbmQgKGV4dGVudC53aWR0aCArIHNyY09mZnNldC54KSBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIHdpZHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VSZXNvbHZlLXNyY09mZnNldC0wMDI2OSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtc3JjT2Zmc2V0LTAwMjcwIiwgInNyY09mZnNldC55IGFuZCAoZXh0ZW50LmhlaWdodCArIHNyY09mZnNldC55KSBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIGhlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlUmVzb2x2ZS1zcmNPZmZzZXQtMDAyNzApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VSZXNvbHZlLXNyY09mZnNldC0wMDI3MiIsICJzcmNPZmZzZXQueiBhbmQgKGV4dGVudC5kZXB0aCArIHNyY09mZnNldC56KSBtdXN0IGJvdGggYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc291cmNlIGltYWdlIHN1YnJlc291cmNlIGRlcHRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VSZXNvbHZlLXNyY09mZnNldC0wMDI3MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVJlc29sdmUtc3JjU3VicmVzb3VyY2UtcGFyYW1ldGVyIiwgInNyY1N1YnJlc291cmNlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VSZXNvbHZlLXNyY1N1YnJlc291cmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLXBhcmFtZXRlciIsICJpbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1NQQVJTRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1RFTkNJTF9VU0FHRV9DUkVBVEVfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhULXN0ZW5jaWxVc2FnZS0wMjUzOSIsICJJZiBzdGVuY2lsVXNhZ2UgaW5jbHVkZXMgVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklULCBpdCBtdXN0IG5vdCBpbmNsdWRlIGJpdHMgb3RoZXIgdGhhbiBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIG9yIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhULXN0ZW5jaWxVc2FnZS0wMjUzOSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQtc3RlbmNpbFVzYWdlLXBhcmFtZXRlciIsICJzdGVuY2lsVXNhZ2UgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrSW1hZ2VVc2FnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVC1zdGVuY2lsVXNhZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVC1zdGVuY2lsVXNhZ2UtcmVxdWlyZWRiaXRtYXNrIiwgInN0ZW5jaWxVc2FnZSBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhULXN0ZW5jaWxVc2FnZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZS1hc3BlY3RNYXNrLXBhcmFtZXRlciIsICJhc3BlY3RNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZS1hc3BlY3RNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVN1YnJlc291cmNlLWFzcGVjdE1hc2stcmVxdWlyZWRiaXRtYXNrIiwgImFzcGVjdE1hc2sgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2UtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAwMTY3IiwgIklmIGFzcGVjdE1hc2sgY29udGFpbnMgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgaXQgbXVzdCBub3QgY29udGFpbiBlaXRoZXIgb2YgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCBvciBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stMDAxNjcpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAwMTY4IiwgImFzcGVjdE1hc2sgbXVzdCBub3QgY29udGFpbiBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAwMTY4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay0wMjI0NyIsICJhc3BlY3RNYXNrIG11c3Qgbm90IGluY2x1ZGUgVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV9pX0JJVF9FWFQgZm9yIGFueSBpbmRleCBpLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay0wMjI0NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcGFyYW1ldGVyIiwgImFzcGVjdE1hc2sgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrSW1hZ2VBc3BlY3RGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2siLCAiYXNwZWN0TWFzayBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWxheWVyQ291bnQtMDE3MDAiLCAibGF5ZXJDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1sYXllckNvdW50LTAxNzAwKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLTAxNjcwIiwgIklmIGFzcGVjdE1hc2sgaW5jbHVkZXMgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgdGhlbiBpdCBtdXN0IG5vdCBpbmNsdWRlIGFueSBvZiBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCwgb3IgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWFzcGVjdE1hc2stMDE2NzApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWFzcGVjdE1hc2stMDIyNzgiLCAiYXNwZWN0TWFzayBtdXN0IG5vdCBpbmNsdWRlIFZLX0lNQUdFX0FTUEVDVF9NRU1PUllfUExBTkVfaV9CSVRfRVhUIGZvciBhbnkgaW5kZXggaSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLTAyMjc4KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLXBhcmFtZXRlciIsICJhc3BlY3RNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWFzcGVjdE1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIsICJhc3BlY3RNYXNrIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWxheWVyQ291bnQtMDE3MjEiLCAiSWYgbGF5ZXJDb3VudCBpcyBub3QgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUywgaXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1sYXllckNvdW50LTAxNzIxKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VSYW5nZS1sZXZlbENvdW50LTAxNzIwIiwgIklmIGxldmVsQ291bnQgaXMgbm90IFZLX1JFTUFJTklOR19NSVBfTEVWRUxTLCBpdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlLWxldmVsQ291bnQtMDE3MjApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfU1dBUENIQUlOX0NSRUFURV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFItc3dhcGNoYWluLTAwOTk1IiwgIklmIHN3YXBjaGFpbiBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHRoZSBmaWVsZHMgb2YgVmtJbWFnZUNyZWF0ZUluZm8gbXVzdCBtYXRjaCB0aGUgaW1wbGllZCBpbWFnZSBjcmVhdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBzd2FwY2hhaW4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVN3YXBjaGFpbkNyZWF0ZUluZm9LSFItc3dhcGNoYWluLTAwOTk1KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zd2FwY2hhaW4tcGFyYW1ldGVyIiwgIklmIHN3YXBjaGFpbiBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHN3YXBjaGFpbiBtdXN0IGJlIGEgdmFsaWQgVmtTd2FwY2hhaW5LSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQtZGVjb2RlTW9kZS0wMjIzMCIsICJkZWNvZGVNb2RlIG11c3QgYmUgb25lIG9mIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FULCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIG9yIFZLX0ZPUk1BVF9FNUI5RzlSOV9VRkxPQVRfUEFDSzMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQtZGVjb2RlTW9kZS0wMjIzMCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVC1kZWNvZGVNb2RlLTAyMjMxIiwgIklmIHRoZSBkZWNvZGVNb2RlU2hhcmVkRXhwb25lbnQgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZGVjb2RlTW9kZSBtdXN0IG5vdCBiZSBWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULWRlY29kZU1vZGUtMDIyMzEpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQtZGVjb2RlTW9kZS0wMjIzMiIsICJJZiBkZWNvZGVNb2RlIGlzIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSB0aGUgaW1hZ2UgdmlldyBtdXN0IG5vdCBpbmNsdWRlIGJsb2NrcyB1c2luZyBhbnkgb2YgdGhlIEFTVEMgSERSIG1vZGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3QVNUQ0RlY29kZU1vZGVFWFQtZGVjb2RlTW9kZS0wMjIzMikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVC1kZWNvZGVNb2RlLXBhcmFtZXRlciIsICJkZWNvZGVNb2RlIG11c3QgYmUgYSB2YWxpZCBWa0Zvcm1hdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULWRlY29kZU1vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULWZvcm1hdC0wMjIzMyIsICJmb3JtYXQgb2YgdGhlIGltYWdlIHZpZXcgbXVzdCBiZSBvbmUgb2YgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfNXg0X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfNXg1X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ181eDVfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfNng2X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfOHg1X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ184eDVfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfOHg4X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSywgVktfRk9STUFUX0FTVENfMTB4NV9TUkdCX0JMT0NLLCBWS19GT1JNQVRfQVNUQ18xMHg2X1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ18xMHg2X1NSR0JfQkxPQ0ssIFZLX0ZPUk1BVF9BU1RDXzEweDhfVU5PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9BU1RDXzEweDhfU1JHQl9CTE9DSywgVktfRk9STUFUX0FTVENfMTB4MTBfVU5PUk1fQkxPQ0ssIFZLX0ZPUk1BVF9BU1RDXzEweDEwX1NSR0JfQkxPQ0ssIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1VOT1JNX0JMT0NLLCBWS19GT1JNQVRfQVNUQ18xMngxMF9TUkdCX0JMT0NLLCBWS19GT1JNQVRfQVNUQ18xMngxMl9VTk9STV9CTE9DSywgb3IgVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULWZvcm1hdC0wMjIzMykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQVNUQ19ERUNPREVfTU9ERV9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdBU1RDRGVjb2RlTW9kZUVYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLU5vbmUtMDIyNzMiLCAiVGhlIGZvcm1hdCBmZWF0dXJlcyBvZiB0aGUgcmVzdWx0YW50IGltYWdlIHZpZXcgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBiaXQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1Ob25lLTAyMjczKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tY29tcG9uZW50cy1wYXJhbWV0ZXIiLCAiY29tcG9uZW50cyBtdXN0IGJlIGEgdmFsaWQgVmtDb21wb25lbnRNYXBwaW5nIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tY29tcG9uZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1mbGFncy0wMjU3MiIsICJJZiBkeW5hbWljIGZyYWdtZW50IGRlbnNpdHkgbWFwIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfSU1BR0VfVklFV19DUkVBVEVfRlJBR01FTlRfREVOU0lUWV9NQVBfRFlOQU1JQ19CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1mbGFncy0wMjU3MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtJbWFnZVZpZXdDcmVhdGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWZvcm1hdC1wYXJhbWV0ZXIiLCAiZm9ybWF0IG11c3QgYmUgYSB2YWxpZCBWa0Zvcm1hdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tZm9ybWF0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDAzIiwgIklmIGltYWdlIHdhcyBub3QgY3JlYXRlZCB3aXRoIFZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklUIHRoZW4gdmlld1R5cGUgbXVzdCBub3QgYmUgVktfSU1BR0VfVklFV19UWVBFX0NVQkUgb3IgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDAzKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMDUiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9UWVBFXzNEIGJ1dCB3aXRob3V0IFZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVCBzZXQgdGhlbiB2aWV3VHlwZSBtdXN0IG5vdCBiZSBWS19JTUFHRV9WSUVXX1RZUEVfMkQgb3IgVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTAwNSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDA3IiwgImltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHVzYWdlIHZhbHVlIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIG9mIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULCBWS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVCwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsIG9yIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTAwNykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDE4IiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggdGhlIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQgZmxhZywgZm9ybWF0IG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBmb3JtYXQgdXNlZCB0byBjcmVhdGUgaW1hZ2UsIGFzIGRlZmluZWQgaW4gRm9ybWF0IENvbXBhdGliaWxpdHkgQ2xhc3NlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMTgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTAxOSIsICJJZiBpbWFnZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCBmbGFnLCBmb3JtYXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGZvcm1hdCB1c2VkIHRvIGNyZWF0ZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMTkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTAyMCIsICJJZiBpbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTAyMCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNDgyIiwgIklmIGltYWdlIGlzIG5vdCBhIDNEIGltYWdlIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVQgc2V0LCBvciB2aWV3VHlwZSBpcyBub3QgVktfSU1BR0VfVklFV19UWVBFXzJEIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSwgc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXJyYXlMYXllcnMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNDgyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDE1ODMiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVQgZmxhZywgZm9ybWF0IG11c3QgYmUgY29tcGF0aWJsZSB3aXRoLCBvciBtdXN0IGJlIGFuIHVuY29tcHJlc3NlZCBmb3JtYXQgdGhhdCBpcyBzaXplLWNvbXBhdGlibGUgd2l0aCwgdGhlIGZvcm1hdCB1c2VkIHRvIGNyZWF0ZSBpbWFnZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNTgzKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDE1ODQiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVQgZmxhZywgdGhlIGxldmVsQ291bnQgYW5kIGxheWVyQ291bnQgbWVtYmVycyBvZiBzdWJyZXNvdXJjZVJhbmdlIG11c3QgYm90aCBiZSAxLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDE1ODQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTU4NiIsICJJZiBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUIGZsYWcsIGlmIHRoZSBmb3JtYXQgb2YgdGhlIGltYWdlIGlzIGEgbXVsdGktcGxhbmFyIGZvcm1hdCwgYW5kIGlmIHN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayBpcyBvbmUgb2YgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklULCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQsIG9yIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVCwgdGhlbiBmb3JtYXQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIFZrRm9ybWF0IGZvciB0aGUgcGxhbmUgb2YgdGhlIGltYWdlIGZvcm1hdCBpbmRpY2F0ZWQgYnkgc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrLCBhcyBkZWZpbmVkIGluIENvbXBhdGlibGUgZm9ybWF0cyBvZiBwbGFuZXMgb2YgbXVsdGktcGxhbmFyIGZvcm1hdHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNTg2KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDE3NTkiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCBmbGFnLCBidXQgd2l0aG91dCB0aGUgVktfSU1BR0VfQ1JFQVRFX0JMT0NLX1RFWEVMX1ZJRVdfQ09NUEFUSUJMRV9CSVQgZmxhZywgZm9ybWF0IG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBmb3JtYXQgdXNlZCB0byBjcmVhdGUgaW1hZ2UsIGFzIGRlZmluZWQgaW4gRm9ybWF0IENvbXBhdGliaWxpdHkgQ2xhc3NlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDE3NTkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTc2MCIsICJJZiBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUIGZsYWcsIGFuZCBpZiB0aGUgZm9ybWF0IG9mIHRoZSBpbWFnZSBpcyBub3QgYSBtdWx0aS1wbGFuYXIgZm9ybWF0LCBmb3JtYXQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGZvcm1hdCB1c2VkIHRvIGNyZWF0ZSBpbWFnZSwgYXMgZGVmaW5lZCBpbiBGb3JtYXQgQ29tcGF0aWJpbGl0eSBDbGFzc2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTc2MCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNzYxIiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggdGhlIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQgZmxhZywgYnV0IHdpdGhvdXQgdGhlIFZLX0lNQUdFX0NSRUFURV9CTE9DS19URVhFTF9WSUVXX0NPTVBBVElCTEVfQklUIGZsYWcsIGFuZCBpZiB0aGUgZm9ybWF0IG9mIHRoZSBpbWFnZSBpcyBub3QgYSBtdWx0aS1wbGFuYXIgZm9ybWF0LCBmb3JtYXQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGZvcm1hdCB1c2VkIHRvIGNyZWF0ZSBpbWFnZSwgYXMgZGVmaW5lZCBpbiBGb3JtYXQgQ29tcGF0aWJpbGl0eSBDbGFzc2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTc2MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNzYyIiwgIklmIGltYWdlIHdhcyBub3QgY3JlYXRlZCB3aXRoIHRoZSBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUIGZsYWcsIG9yIGlmIHRoZSBmb3JtYXQgb2YgdGhlIGltYWdlIGlzIGEgbXVsdGktcGxhbmFyIGZvcm1hdCBhbmQgaWYgc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrIGlzIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIGZvcm1hdCBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgZm9ybWF0IHVzZWQgdG8gY3JlYXRlIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMTc2MikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyMDg1IiwgImltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHVzYWdlIHZhbHVlIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIG9mIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULCBWS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVCwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklULCBvciBWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjA4NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyMDg2IiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggdXNhZ2UgY29udGFpbmluZyBWS19JTUFHRV9VU0FHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WLCB2aWV3VHlwZSBtdXN0IGJlIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCBvciBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyMDg2KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDIwODciLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCB1c2FnZSBjb250YWluaW5nIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYsIGZvcm1hdCBtdXN0IGJlIFZLX0ZPUk1BVF9SOF9VSU5UIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjA4NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyMzk5IiwgIklmIGltYWdlIGhhcyBhbiBleHRlcm5hbCBmb3JtYXQsIGZvcm1hdCBtdXN0IGJlIFZLX0ZPUk1BVF9VTkRFRklORUQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjM5OSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyNDAwIiwgIklmIGltYWdlIGhhcyBhbiBleHRlcm5hbCBmb3JtYXQsIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgYSBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIHN0cnVjdHVyZSB3aXRoIGEgY29udmVyc2lvbiBvYmplY3QgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGV4dGVybmFsIGZvcm1hdCBhcyBpbWFnZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyNDAwKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI0MDEiLCAiSWYgaW1hZ2UgaGFzIGFuIGV4dGVybmFsIGZvcm1hdCwgYWxsIG1lbWJlcnMgb2YgY29tcG9uZW50cyBtdXN0IGJlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI0MDEpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjU2OSIsICJpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBvZiBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCwgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQsIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCwgb3IgVktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI1NjkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjU3MCIsICJpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBvZiBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCwgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQsIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OViwgb3IgVktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI1NzApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjU3MSIsICJJZiBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIHVzYWdlIGNvbnRhaW5pbmcgVktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCwgc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50IG11c3QgYmUgMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI1NzEpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjU3MyIsICJJZiBkeW5hbWljIGZyYWdtZW50IGRlbnNpdHkgbWFwIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgYW5kIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggdXNhZ2UgY29udGFpbmluZyBWS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhULCBmbGFncyBtdXN0IG5vdCBjb250YWluIGFueSBvZiBWS19JTUFHRV9DUkVBVEVfUFJPVEVDVEVEX0JJVCwgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCwgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklULCBvciBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjU3MykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyNzI0IiwgIklmIGltYWdlIGlzIGEgM0QgaW1hZ2UgY3JlYXRlZCB3aXRoIFZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVCBzZXQsIGFuZCB2aWV3VHlwZSBpcyBWS19JTUFHRV9WSUVXX1RZUEVfMkQgb3IgVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZLCBzdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBkZXB0aCBjb21wdXRlZCBmcm9tIGJhc2VNaXBMZXZlbCBhbmQgZXh0ZW50LmRlcHRoIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGltYWdlIHdhcyBjcmVhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgZGVmaW5lZCBpbiBJbWFnZSBNaXBsZXZlbCBTaXppbmcuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjcyNCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLXBhcmFtZXRlciIsICJpbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXBOZXh0LTAxNTg1IiwgIklmIGEgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSB3YXMgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIHRoZSBWa0ltYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGNyZWF0aW5nIGltYWdlIGFuZCB0aGUgdmlld0Zvcm1hdENvdW50IGZpZWxkIG9mIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiBpcyBub3QgemVybyB0aGVuIGZvcm1hdCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9ybWF0cyBpbiBWa0ltYWdlRm9ybWF0TGlzdENyZWF0ZUluZm9LSFI6OnBWaWV3Rm9ybWF0cy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXBOZXh0LTAxNTg1KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tcE5leHQtMDE5NzAiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyBzdHJ1Y3R1cmUgd2l0aCBhIGNvbnZlcnNpb24gdmFsdWUgb3RoZXIgdGhhbiBWS19OVUxMX0hBTkRMRSwgYWxsIG1lbWJlcnMgb2YgY29tcG9uZW50cyBtdXN0IGhhdmUgdGhlIHZhbHVlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tcE5leHQtMDE5NzApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1wTmV4dC0wMjY2MSIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUsIGl0cyB1c2FnZSBtZW1iZXIgbXVzdCBub3QgaW5jbHVkZSBhbnkgYml0cyB0aGF0IHdlcmUgbm90IHNldCBpbiB0aGUgdXNhZ2UgbWVtYmVyIG9mIHRoZSBWa0ltYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgdXNlZCB0byBjcmVhdGUgaW1hZ2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1wTmV4dC0wMjY2MSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXBOZXh0LTAyNjYyIiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIHN0cnVjdHVyZSwgYW5kIGltYWdlIHdhcyBub3QgY3JlYXRlZCB3aXRoIGEgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBvZiBWa0ltYWdlQ3JlYXRlSW5mbywgaXRzIHVzYWdlIG1lbWJlciBtdXN0IG5vdCBpbmNsdWRlIGFueSBiaXRzIHRoYXQgd2VyZSBub3Qgc2V0IGluIHRoZSB1c2FnZSBtZW1iZXIgb2YgdGhlIFZrSW1hZ2VDcmVhdGVJbmZvIHN0cnVjdHVyZSB1c2VkIHRvIGNyZWF0ZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tcE5leHQtMDI2NjIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1wTmV4dC0wMjY2MyIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUsIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIFZrSW1hZ2VDcmVhdGVJbmZvLCBhbmQgc3ViUmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrIGluY2x1ZGVzIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCwgdGhlIHVzYWdlIG1lbWJlciBvZiB0aGUgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gaW5zdGFuY2UgbXVzdCBub3QgaW5jbHVkZSBhbnkgYml0cyB0aGF0IHdlcmUgbm90IHNldCBpbiB0aGUgdXNhZ2UgbWVtYmVyIG9mIHRoZSBWa0ltYWdlU3RlbmNpbFVzYWdlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgdXNlZCB0byBjcmVhdGUgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXBOZXh0LTAyNjYzKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tcE5leHQtMDI2NjQiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gc3RydWN0dXJlLCBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIGEgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBvZiBWa0ltYWdlQ3JlYXRlSW5mbywgYW5kIHN1YlJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayBpbmNsdWRlcyBiaXRzIG90aGVyIHRoYW4gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklULCB0aGUgdXNhZ2UgbWVtYmVyIG9mIHRoZSBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgbXVzdCBub3QgaW5jbHVkZSBhbnkgYml0cyB0aGF0IHdlcmUgbm90IHNldCBpbiB0aGUgdXNhZ2UgbWVtYmVyIG9mIHRoZSBWa0ltYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgdXNlZCB0byBjcmVhdGUgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXBOZXh0LTAyNjY0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0ltYWdlVmlld0FTVENEZWNvZGVNb2RlRVhULCBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbywgb3IgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3ViUmVzb3VyY2VSYW5nZS0wMTAyMSIsICJzdWJyZXNvdXJjZVJhbmdlIGFuZCB2aWV3VHlwZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgaW1hZ2UsIGFzIGRlc2NyaWJlZCBpbiB0aGUgY29tcGF0aWJpbGl0eSB0YWJsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3ViUmVzb3VyY2VSYW5nZS0wMTAyMSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE0NzgiLCAic3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG1pcExldmVscyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3VicmVzb3VyY2VSYW5nZS0wMTQ3OCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE0ODAiLCAic3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXJyYXlMYXllcnMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE0ODApIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNDgzIiwgIklmIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCBpcyBub3QgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUywgaW1hZ2UgaXMgbm90IGEgM0QgaW1hZ2UgY3JlYXRlZCB3aXRoIFZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVCBzZXQsIG9yIHZpZXdUeXBlIGlzIG5vdCBWS19JTUFHRV9WSUVXX1RZUEVfMkQgb3IgVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZLCBzdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgbXVzdCBiZSBub24temVybyBhbmQgc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciArIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYXJyYXlMYXllcnMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE0ODMpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNzE4IiwgIklmIHN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCBpcyBub3QgVktfUkVNQUlOSU5HX01JUF9MRVZFTFMsIHN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsICsgc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtaXBMZXZlbHMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE3MTgpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNzE5IiwgIklmIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCBpcyBub3QgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUywgc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciArIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYXJyYXlMYXllcnMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE3MTkpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAyNzI1IiwgIklmIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCBpcyBub3QgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUywgaW1hZ2UgaXMgYSAzRCBpbWFnZSBjcmVhdGVkIHdpdGggVktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUIHNldCwgYW5kIHZpZXdUeXBlIGlzIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCBvciBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVksIHN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCBtdXN0IGJlIG5vbi16ZXJvIGFuZCBzdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyICsgc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZXB0aCBjb21wdXRlZCBmcm9tIGJhc2VNaXBMZXZlbCBhbmQgZXh0ZW50LmRlcHRoIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGltYWdlIHdhcyBjcmVhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgZGVmaW5lZCBpbiBJbWFnZSBNaXBsZXZlbCBTaXppbmcuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAyNzI1KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3VicmVzb3VyY2VSYW5nZS1wYXJhbWV0ZXIiLCAic3VicmVzb3VyY2VSYW5nZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXVzYWdlLTAyMjc0IiwgIklmIHVzYWdlIGNvbnRhaW5zIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULCB0aGVuIHRoZSBmb3JtYXQgZmVhdHVyZXMgb2YgdGhlIHJlc3VsdGFudCBpbWFnZSB2aWV3IG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXVzYWdlLTAyMjc0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzUiLCAiSWYgdXNhZ2UgY29udGFpbnMgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQsIHRoZW4gdGhlIGltYWdlIHZpZXcncyBmb3JtYXQgZmVhdHVyZXMgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby11c2FnZS0wMjI3NiIsICJJZiB1c2FnZSBjb250YWlucyBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby11c2FnZS0wMjI3NikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXVzYWdlLTAyMjc3IiwgIklmIHVzYWdlIGNvbnRhaW5zIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsIHRoZW4gdGhlIGltYWdlIHZpZXcncyBmb3JtYXQgZmVhdHVyZXMgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby11c2FnZS0wMjI3NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXVzYWdlLTAyNjUyIiwgIklmIHVzYWdlIGNvbnRhaW5zIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklULCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgb2YgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQgb3IgVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXVzYWdlLTAyNjUyKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdmlld1R5cGUtMDEwMDQiLCAiSWYgdGhlIGltYWdlIGN1YmVtYXAgYXJyYXlzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHZpZXdUeXBlIG11c3Qgbm90IGJlIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby12aWV3VHlwZS0wMTAwNCkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXZpZXdUeXBlLXBhcmFtZXRlciIsICJ2aWV3VHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZVZpZXdUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby12aWV3VHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBpbWFnZVZpZXcsIGFuZCBzYW1wbGVyIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1kZXNjcmlwdG9yVHlwZS0wMjY1NCIsICJkZXNjcmlwdG9yVHlwZSBtdXN0IGJlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSwgb3IgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLWRlc2NyaXB0b3JUeXBlLTAyNjU0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIiwgImRlc2NyaXB0b3JUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1kZXNjcmlwdG9yVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1pbWFnZVZpZXctMDI2NTYiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0Ugb3IgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIHRoZSBpbWFnZSB0aGF0IGltYWdlVmlldyB3YXMgY3JlYXRlZCBmcm9tIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgdXNhZ2UgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtaW1hZ2VWaWV3LTAyNjU2KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtaW1hZ2VWaWV3LTAyNjU3IiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFLCB0aGUgaW1hZ2UgdGhhdCBpbWFnZVZpZXcgd2FzIGNyZWF0ZWQgZnJvbSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0lNQUdFX1VTQUdFX1NUT1JBR0VfQklUIHVzYWdlIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLWltYWdlVmlldy0wMjY1NykifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLWltYWdlVmlldy1wYXJhbWV0ZXIiLCAiaW1hZ2VWaWV3IG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlVmlldyBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLWltYWdlVmlldy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0hBTkRMRV9JTkZPX05WWCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1zYW1wbGVyLTAyNjU1IiwgInNhbXBsZXIgbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlciBpZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld0hhbmRsZUluZm9OVlgtc2FtcGxlci0wMjY1NSkifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYLXNhbXBsZXItcGFyYW1ldGVyIiwgIklmIHNhbXBsZXIgaXMgbm90IFZLX05VTExfSEFORExFLCBzYW1wbGVyIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3SGFuZGxlSW5mb05WWC1zYW1wbGVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX1VTQUdFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mby11c2FnZS1wYXJhbWV0ZXIiLCAidXNhZ2UgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrSW1hZ2VVc2FnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mby11c2FnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsICJ1c2FnZSBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvLXVzYWdlLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1idWZmZXItMDE4ODAiLCAiSWYgYnVmZmVyIGlzIG5vdCBOVUxMLCBBbmRyb2lkIGhhcmR3YXJlIGJ1ZmZlcnMgbXVzdCBiZSBzdXBwb3J0ZWQgZm9yIGltcG9ydCwgYXMgcmVwb3J0ZWQgYnkgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcyBvciBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1idWZmZXItMDE4ODApIn0sCisgICAgeyJWVUlELVZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtYnVmZmVyLTAxODgxIiwgIklmIGJ1ZmZlciBpcyBub3QgTlVMTCwgaXQgbXVzdCBiZSBhIHZhbGlkIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyIG9iamVjdCB3aXRoIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjOjpmb3JtYXQgYW5kIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjOjp1c2FnZSBjb21wYXRpYmxlIHdpdGggVnVsa2FuIGFzIGRlc2NyaWJlZCBpbiBBbmRyb2lkIEhhcmR3YXJlIEJ1ZmZlcnMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtYnVmZmVyLTAxODgxKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELWJ1ZmZlci1wYXJhbWV0ZXIiLCAiYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIEFIYXJkd2FyZUJ1ZmZlciB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfSU5GT19BTkRST0lEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0RmVuY2VGZEluZm9LSFItZmQtMDE1NDEiLCAiZmQgbXVzdCBvYmV5IGFueSByZXF1aXJlbWVudHMgbGlzdGVkIGZvciBoYW5kbGVUeXBlIGluIGV4dGVybmFsIGZlbmNlIGhhbmRsZSB0eXBlcyBjb21wYXRpYmlsaXR5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLWZkLTAxNTQxKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLWZlbmNlLXBhcmFtZXRlciIsICJmZW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtGZW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRGZW5jZUZkSW5mb0tIUi1mZW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0RmVuY2VGZEluZm9LSFItZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ZlbmNlSW1wb3J0RmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0RmVuY2VGZEluZm9LSFItZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NjQiLCAiaGFuZGxlVHlwZSBtdXN0IGJlIGEgdmFsdWUgaW5jbHVkZWQgaW4gdGhlIEhhbmRsZSBUeXBlcyBTdXBwb3J0ZWQgYnkgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiB0YWJsZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRGZW5jZUZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDY0KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlRmRJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0RmVuY2VGZEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItZmVuY2UtcGFyYW1ldGVyIiwgImZlbmNlIG11c3QgYmUgYSB2YWxpZCBWa0ZlbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWZlbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRmVuY2VJbXBvcnRGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNDYyIiwgIklmIGhhbmRsZSBpcyBub3QgTlVMTCwgbmFtZSBtdXN0IGJlIE5VTEwuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNDYyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZS0wMTUzOSIsICJJZiBoYW5kbGUgaXMgbm90IE5VTEwsIGl0IG11c3Qgb2JleSBhbnkgcmVxdWlyZW1lbnRzIGxpc3RlZCBmb3IgaGFuZGxlVHlwZSBpbiBleHRlcm5hbCBmZW5jZSBoYW5kbGUgdHlwZXMgY29tcGF0aWJpbGl0eS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGUtMDE1MzkpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ1NyIsICJoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWx1ZSBpbmNsdWRlZCBpbiB0aGUgSGFuZGxlIFR5cGVzIFN1cHBvcnRlZCBieSBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIHRhYmxlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NTcpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ1OSIsICJJZiBoYW5kbGVUeXBlIGlzIG5vdCBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklULCBuYW1lIG11c3QgYmUgTlVMTC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDU5KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NjAiLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCBhbmQgaGFuZGxlIGlzIE5VTEwsIG5hbWUgbXVzdCBuYW1lIGEgdmFsaWQgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZSBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgaGFuZGxlVHlwZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDYwKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NjEiLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCBhbmQgbmFtZSBpcyBOVUxMLCBoYW5kbGUgbXVzdCBiZSBhIHZhbGlkIGhhbmRsZSBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgaGFuZGxlVHlwZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDYxKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgIklmIGhhbmRsZVR5cGUgaXMgbm90IDAsIGhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLW5hbWUtMDE1NDAiLCAiSWYgbmFtZSBpcyBub3QgTlVMTCwgaXQgbXVzdCBvYmV5IGFueSByZXF1aXJlbWVudHMgbGlzdGVkIGZvciBoYW5kbGVUeXBlIGluIGV4dGVybmFsIGZlbmNlIGhhbmRsZSB0eXBlcyBjb21wYXRpYmlsaXR5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSLW5hbWUtMDE1NDApIn0sCisgICAgeyJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWZkLTAwNjY4IiwgIlRoZSBtZW1vcnkgZnJvbSB3aGljaCBmZCB3YXMgZXhwb3J0ZWQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBvbiB0aGUgc2FtZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGRldmljZSBhcyBkZXZpY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWZkLTAwNjY4KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUi1mZC0wMTUyMCIsICJmZCBtdXN0IG9iZXkgYW55IHJlcXVpcmVtZW50cyBsaXN0ZWQgZm9yIGhhbmRsZVR5cGUgaW4gZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSB0eXBlcyBjb21wYXRpYmlsaXR5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUi1mZC0wMTUyMCkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlGZEluZm9LSFItZmQtMDE3NDYiLCAiVGhlIG1lbW9yeSByZXByZXNlbnRlZCBieSBmZCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gYSBwaHlzaWNhbCBkZXZpY2UgYW5kIGRyaXZlciB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBkZXZpY2UgYW5kIGhhbmRsZVR5cGUsIGFzIGRlc2NyaWJlZCBpbiBFeHRlcm5hbCBtZW1vcnkgaGFuZGxlIHR5cGVzIGNvbXBhdGliaWxpdHkuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWZkLTAxNzQ2KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjY3IiwgIklmIGhhbmRsZVR5cGUgaXMgbm90IDAsIGl0IG11c3QgYmUgc3VwcG9ydGVkIGZvciBpbXBvcnQsIGFzIHJlcG9ydGVkIGJ5IFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgb3IgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjcpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjkiLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCwgaXQgbXVzdCBiZSBkZWZpbmVkIGFzIGEgUE9TSVggZmlsZSBkZXNjcmlwdG9yIGhhbmRsZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRNZW1vcnlGZEluZm9LSFItaGFuZGxlVHlwZS0wMDY2OSkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlGZEluZm9LSFItaGFuZGxlVHlwZS0wMDY3MCIsICJJZiBoYW5kbGVUeXBlIGlzIG5vdCAwLCBmZCBtdXN0IGJlIGEgdmFsaWQgaGFuZGxlIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSBoYW5kbGVUeXBlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjcwKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJJZiBoYW5kbGVUeXBlIGlzIG5vdCAwLCBoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeUZkSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRNZW1vcnlGZEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULWhhbmRsZVR5cGUtMDE3NDciLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCwgaXQgbXVzdCBiZSBzdXBwb3J0ZWQgZm9yIGltcG9ydCwgYXMgcmVwb3J0ZWQgaW4gVmtFeHRlcm5hbE1lbW9yeVByb3BlcnRpZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQtaGFuZGxlVHlwZS0wMTc0NykifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQtaGFuZGxlVHlwZS0wMTc0OCIsICJJZiBoYW5kbGVUeXBlIGlzIG5vdCAwLCBpdCBtdXN0IGJlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX0FMTE9DQVRJT05fQklUX0VYVCBvciBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9NQVBQRURfRk9SRUlHTl9NRU1PUllfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1oYW5kbGVUeXBlLTAxNzQ4KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1oYW5kbGVUeXBlLTAxNzUwIiwgIklmIGhhbmRsZVR5cGUgaXMgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfQUxMT0NBVElPTl9CSVRfRVhULCBwSG9zdFBvaW50ZXIgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYWxsb2NhdGlvblNpemUgbnVtYmVyIG9mIGJ5dGVzIG9mIGhvc3QgbWVtb3J5LCB3aGVyZSBhbGxvY2F0aW9uU2l6ZSBpcyB0aGUgbWVtYmVyIG9mIHRoZSBWa01lbW9yeUFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgdGhpcyBzdHJ1Y3R1cmUgaXMgY2hhaW5lZCB0byAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1oYW5kbGVUeXBlLTAxNzUwKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1oYW5kbGVUeXBlLTAxNzUxIiwgIklmIGhhbmRsZVR5cGUgaXMgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfTUFQUEVEX0ZPUkVJR05fTUVNT1JZX0JJVF9FWFQsIHBIb3N0UG9pbnRlciBtdXN0IGJlIGEgcG9pbnRlciB0byBhbGxvY2F0aW9uU2l6ZSBudW1iZXIgb2YgYnl0ZXMgb2YgaG9zdCBtYXBwZWQgZm9yZWlnbiBtZW1vcnksIHdoZXJlIGFsbG9jYXRpb25TaXplIGlzIHRoZSBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5QWxsb2NhdGVJbmZvIHN0cnVjdHVyZSB0aGlzIHN0cnVjdHVyZSBpcyBjaGFpbmVkIHRvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULWhhbmRsZVR5cGUtMDE3NTEpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQtaGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULXBIb3N0UG9pbnRlci0wMTc0OSIsICJwSG9zdFBvaW50ZXIgbXVzdCBiZSBhIHBvaW50ZXIgYWxpZ25lZCB0byBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhUOjptaW5JbXBvcnRlZEhvc3RQb2ludGVyQWxpZ25tZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULXBIb3N0UG9pbnRlci0wMTc0OSkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX0hPU1RfUE9JTlRFUl9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeUhvc3RQb2ludGVySW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAwNjU5IiwgIlRoZSBtZW1vcnkgZnJvbSB3aGljaCBoYW5kbGUgd2FzIGV4cG9ydGVkLCBvciB0aGUgbWVtb3J5IG5hbWVkIGJ5IG5hbWUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBvbiB0aGUgc2FtZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGRldmljZSBhcyBkZXZpY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZS0wMDY1OSkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNDQxIiwgImlmIGhhbmRsZSBpcyBub3QgTlVMTCwgbmFtZSBtdXN0IGJlIE5VTEwuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZS0wMTQ0MSkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNTE4IiwgIklmIGhhbmRsZSBpcyBub3QgTlVMTCwgaXQgbXVzdCBvYmV5IGFueSByZXF1aXJlbWVudHMgbGlzdGVkIGZvciBoYW5kbGVUeXBlIGluIGV4dGVybmFsIG1lbW9yeSBoYW5kbGUgdHlwZXMgY29tcGF0aWJpbGl0eS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNTE4KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjU4IiwgIklmIGhhbmRsZVR5cGUgaXMgbm90IDAsIGl0IG11c3QgYmUgc3VwcG9ydGVkIGZvciBpbXBvcnQsIGFzIHJlcG9ydGVkIGJ5IFZrRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMgb3IgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NTgpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjAiLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCwgaXQgbXVzdCBiZSBkZWZpbmVkIGFzIGFuIE5UIGhhbmRsZSBvciBhIGdsb2JhbCBzaGFyZSBoYW5kbGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjApIn0sCisgICAgeyJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjEiLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCBhbmQgbmFtZSBpcyBOVUxMLCBoYW5kbGUgbXVzdCBiZSBhIHZhbGlkIGhhbmRsZSBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgaGFuZGxlVHlwZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMDY2MSkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQzOSIsICJJZiBoYW5kbGVUeXBlIGlzIG5vdCBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCwgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfQklULCBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTJfSEVBUF9CSVQsIG9yIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9SRVNPVVJDRV9CSVQsIG5hbWUgbXVzdCBiZSBOVUxMLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDM5KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDQwIiwgIklmIGhhbmRsZVR5cGUgaXMgbm90IDAgYW5kIGhhbmRsZSBpcyBOVUxMLCBuYW1lIG11c3QgbmFtZSBhIHZhbGlkIG1lbW9yeSByZXNvdXJjZSBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgaGFuZGxlVHlwZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ0MCkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCwgaGFuZGxlVHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9LSFItbmFtZS0wMTUxOSIsICJJZiBuYW1lIGlzIG5vdCBOVUxMLCBpdCBtdXN0IG9iZXkgYW55IHJlcXVpcmVtZW50cyBsaXN0ZWQgZm9yIGhhbmRsZVR5cGUgaW4gZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSB0eXBlcyBjb21wYXRpYmlsaXR5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1uYW1lLTAxNTE5KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLWhhbmRsZS0wMTMyOCIsICJoYW5kbGUgbXVzdCBiZSBhIHZhbGlkIGhhbmRsZSB0byBtZW1vcnksIG9idGFpbmVkIGFzIHNwZWNpZmllZCBieSBoYW5kbGVUeXBlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WLWhhbmRsZS0wMTMyOCkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVi1oYW5kbGVUeXBlLTAxMzI3IiwgImhhbmRsZVR5cGUgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGJpdCBzZXQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtaGFuZGxlVHlwZS0wMTMyNykifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OVi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtaGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfTUVNT1JZX1dJTjMyX0hBTkRMRV9JTkZPX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWZkLTAxNTQ0IiwgImZkIG11c3Qgb2JleSBhbnkgcmVxdWlyZW1lbnRzIGxpc3RlZCBmb3IgaGFuZGxlVHlwZSBpbiBleHRlcm5hbCBzZW1hcGhvcmUgaGFuZGxlIHR5cGVzIGNvbXBhdGliaWxpdHkuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWZkLTAxNTQ0KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1mbGFncy0wMzMyMyIsICJJZiBmbGFncyBjb250YWlucyBWS19TRU1BUEhPUkVfSU1QT1JUX1RFTVBPUkFSWV9CSVQsIHRoZSBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSOjpzZW1hcGhvcmVUeXBlIGZpZWxkIG9mIHRoZSBzZW1hcGhvcmUgZnJvbSB3aGljaCBmZCB3YXMgZXhwb3J0ZWQgbXVzdCBub3QgYmUgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1mbGFncy0wMzMyMykifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFItZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1NlbWFwaG9yZUltcG9ydEZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDExNDMiLCAiaGFuZGxlVHlwZSBtdXN0IGJlIGEgdmFsdWUgaW5jbHVkZWQgaW4gdGhlIEhhbmRsZSBUeXBlcyBTdXBwb3J0ZWQgYnkgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgdGFibGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDExNDMpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNjMiLCAiSWYgaGFuZGxlVHlwZSBpcyBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCwgdGhlIFZrU2VtYXBob3JlQ3JlYXRlSW5mbzo6ZmxhZ3MgZmllbGQgbXVzdCBtYXRjaCB0aGF0IG9mIHRoZSBzZW1hcGhvcmUgZnJvbSB3aGljaCBmZCB3YXMgZXhwb3J0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNjMpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNjQiLCAiSWYgaGFuZGxlVHlwZSBpcyBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCwgdGhlIFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI6OnNlbWFwaG9yZVR5cGUgZmllbGQgbXVzdCBtYXRjaCB0aGF0IG9mIHRoZSBzZW1hcGhvcmUgZnJvbSB3aGljaCBmZCB3YXMgZXhwb3J0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNjQpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX0ZEX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUi1zZW1hcGhvcmUtcGFyYW1ldGVyIiwgInNlbWFwaG9yZSBtdXN0IGJlIGEgdmFsaWQgVmtTZW1hcGhvcmUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWZsYWdzLTAzMzIyIiwgIklmIGZsYWdzIGNvbnRhaW5zIFZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVCwgdGhlIFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI6OnNlbWFwaG9yZVR5cGUgZmllbGQgb2YgdGhlIHNlbWFwaG9yZSBmcm9tIHdoaWNoIGhhbmRsZSBvciBuYW1lIHdhcyBleHBvcnRlZCBtdXN0IG5vdCBiZSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWZsYWdzLTAzMzIyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrU2VtYXBob3JlSW1wb3J0RmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNDY5IiwgIklmIGhhbmRsZSBpcyBub3QgTlVMTCwgbmFtZSBtdXN0IGJlIE5VTEwuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZS0wMTQ2OSkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNTQyIiwgIklmIGhhbmRsZSBpcyBub3QgTlVMTCwgaXQgbXVzdCBvYmV5IGFueSByZXF1aXJlbWVudHMgbGlzdGVkIGZvciBoYW5kbGVUeXBlIGluIGV4dGVybmFsIHNlbWFwaG9yZSBoYW5kbGUgdHlwZXMgY29tcGF0aWJpbGl0eS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlLTAxNTQyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTQwIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbHVlIGluY2x1ZGVkIGluIHRoZSBIYW5kbGUgVHlwZXMgU3VwcG9ydGVkIGJ5IFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHRhYmxlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTQwKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDY2IiwgIklmIGhhbmRsZVR5cGUgaXMgbm90IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUIG9yIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9EM0QxMl9GRU5DRV9CSVQsIG5hbWUgbXVzdCBiZSBOVUxMLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDY2KSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxNDY3IiwgIklmIGhhbmRsZVR5cGUgaXMgbm90IDAgYW5kIGhhbmRsZSBpcyBOVUxMLCBuYW1lIG11c3QgbmFtZSBhIHZhbGlkIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmUgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IGhhbmRsZVR5cGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NjcpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDE0NjgiLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCBhbmQgbmFtZSBpcyBOVUxMLCBoYW5kbGUgbXVzdCBiZSBhIHZhbGlkIGhhbmRsZSBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgaGFuZGxlVHlwZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTQ2OCkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMzI2MSIsICJJZiBoYW5kbGVUeXBlIGlzIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfQklUIG9yIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfV0lOMzJfS01UX0JJVCwgdGhlIFZrU2VtYXBob3JlQ3JlYXRlSW5mbzo6ZmxhZ3MgZmllbGQgbXVzdCBtYXRjaCB0aGF0IG9mIHRoZSBzZW1hcGhvcmUgZnJvbSB3aGljaCBoYW5kbGUgb3IgbmFtZSB3YXMgZXhwb3J0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNjEpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDMyNjIiLCAiSWYgaGFuZGxlVHlwZSBpcyBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCBvciBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVQsIHRoZSBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSOjpzZW1hcGhvcmVUeXBlIGZpZWxkIG11c3QgbWF0Y2ggdGhhdCBvZiB0aGUgc2VtYXBob3JlIGZyb20gd2hpY2ggaGFuZGxlIG9yIG5hbWUgd2FzIGV4cG9ydGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAzMjYyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJJZiBoYW5kbGVUeXBlIGlzIG5vdCAwLCBoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1uYW1lLTAxNTQzIiwgIklmIG5hbWUgaXMgbm90IE5VTEwsIGl0IG11c3Qgb2JleSBhbnkgcmVxdWlyZW1lbnRzIGxpc3RlZCBmb3IgaGFuZGxlVHlwZSBpbiBleHRlcm5hbCBzZW1hcGhvcmUgaGFuZGxlIHR5cGVzIGNvbXBhdGliaWxpdHkuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLW5hbWUtMDE1NDMpIn0sCisgICAgeyJWVUlELVZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsICJzZW1hcGhvcmUgbXVzdCBiZSBhIHZhbGlkIFZrU2VtYXBob3JlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUi1zZW1hcGhvcmUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLWNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0LTAxMzQ4IiwgIklmIHRoZSBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg6OmNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHRoZW4gcGlwZWxpbmVCaW5kUG9pbnQgbXVzdCBub3QgYmUgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQtMDEzNDgpIn0sCisgICAgeyJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRVc2FnZUZsYWdCaXRzTlZYIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1mbGFncy1yZXF1aXJlZGJpdG1hc2siLCAiZmxhZ3MgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1wVG9rZW5zLTAxMzQ5IiwgIklmIHBUb2tlbnMgY29udGFpbnMgYW4gZW50cnkgb2YgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9QSVBFTElORV9OVlggaXQgbXVzdCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgYW5kIHRoZXJlIG11c3QgYmUgb25seSBhIHNpbmdsZSBlbGVtZW50IG9mIHN1Y2ggdG9rZW4gdHlwZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1wVG9rZW5zLTAxMzQ5KSJ9LAorICAgIHsiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXBUb2tlbnMtMDEzNTAiLCAiQWxsIHN0YXRlIGJpbmRpbmcgdG9rZW5zIGluIHBUb2tlbnMgbXVzdCBvY2N1ciBwcmlvciB3b3JrIHByb3Zva2luZyB0b2tlbnMgKFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19OVlgsIFZLX0lORElSRUNUX0NPTU1BTkRTX1RPS0VOX1RZUEVfRFJBV19JTkRFWEVEX05WWCwgVktfSU5ESVJFQ1RfQ09NTUFORFNfVE9LRU5fVFlQRV9ESVNQQVRDSF9OVlgpLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXBUb2tlbnMtMDEzNTApIn0sCisgICAgeyJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtcFRva2Vucy0wMTM1MSIsICJUaGUgY29udGVudCBvZiBwVG9rZW5zIG11c3QgaW5jbHVkZSBvbmUgc2luZ2xlIHdvcmsgcHJvdm9raW5nIHRva2VuIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwaXBlbGluZUJpbmRQb2ludC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC1wVG9rZW5zLTAxMzUxKSJ9LAorICAgIHsiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXBUb2tlbnMtcGFyYW1ldGVyIiwgInBUb2tlbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdG9rZW5Db3VudCB2YWxpZCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtcFRva2Vucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyIiwgInBpcGVsaW5lQmluZFBvaW50IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lQmluZFBvaW50IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX0NSRUFURV9JTkZPX05WWCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXRva2VuQ291bnQtMDEzNDciLCAidG9rZW5Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBiZWxvdyBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYOjptYXhJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5Db3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYLXRva2VuQ291bnQtMDEzNDcpIn0sCisgICAgeyJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dENyZWF0ZUluZm9OVlgtdG9rZW5Db3VudC1hcnJheWxlbmd0aCIsICJ0b2tlbkNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0Q3JlYXRlSW5mb05WWC10b2tlbkNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWC1iaW5kaW5nVW5pdC0wMTM0MiIsICJiaW5kaW5nVW5pdCBtdXN0IHN0YXkgd2l0aGluIGRldmljZSBzdXBwb3J0ZWQgbGltaXRzIGZvciB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZHMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYLWJpbmRpbmdVbml0LTAxMzQyKSJ9LAorICAgIHsiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWC1kaXZpc29yLTAxMzQ0IiwgImRpdmlzb3IgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCBhbmQgYSBwb3dlciBvZiB0d28uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYLWRpdmlzb3ItMDEzNDQpIn0sCisgICAgeyJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYLWR5bmFtaWNDb3VudC0wMTM0MyIsICJkeW5hbWljQ291bnQgbXVzdCBzdGF5IHdpdGhpbiBkZXZpY2Ugc3VwcG9ydGVkIGxpbWl0cyBmb3IgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmRzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRUb2tlbk5WWC1keW5hbWljQ291bnQtMDEzNDMpIn0sCisgICAgeyJWVUlELVZrSW5kaXJlY3RDb21tYW5kc0xheW91dFRva2VuTlZYLXRva2VuVHlwZS1wYXJhbWV0ZXIiLCAidG9rZW5UeXBlIG11c3QgYmUgYSB2YWxpZCBWa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlggdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0VG9rZW5OVlgtdG9rZW5UeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlgtYnVmZmVyLTAxMzQ1IiwgIlRoZSBidWZmZXIncyB1c2FnZSBmbGFnIG11c3QgaGF2ZSB0aGUgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgYml0IHNldC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlgtYnVmZmVyLTAxMzQ1KSJ9LAorICAgIHsiVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWC1idWZmZXItcGFyYW1ldGVyIiwgImJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYLW9mZnNldC0wMTM0NiIsICJUaGUgb2Zmc2V0IG11c3QgYmUgYWxpZ25lZCB0byBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzTGltaXRzTlZYOjptaW5Db21tYW5kc1Rva2VuQnVmZmVyT2Zmc2V0QWxpZ25tZW50LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luZGlyZWN0Q29tbWFuZHNUb2tlbk5WWC1vZmZzZXQtMDEzNDYpIn0sCisgICAgeyJWVUlELVZrSW5kaXJlY3RDb21tYW5kc1Rva2VuTlZYLXRva2VuVHlwZS1wYXJhbWV0ZXIiLCAidG9rZW5UeXBlIG11c3QgYmUgYSB2YWxpZCBWa0luZGlyZWN0Q29tbWFuZHNUb2tlblR5cGVOVlggdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbmRpcmVjdENvbW1hbmRzVG9rZW5OVlgtdG9rZW5UeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSW5mb0lOVEVMLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUluZm9JTlRFTC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lOSVRJQUxJWkVfUEVSRk9STUFOQ0VfQVBJX0lORk9fSU5URUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlLWFzcGVjdE1hc2stMDE5NjQiLCAiYXNwZWN0TWFzayBtdXN0IG5vdCBpbmNsdWRlIFZLX0lNQUdFX0FTUEVDVF9NRVRBREFUQV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UtYXNwZWN0TWFzay0wMTk2NCkifSwKKyAgICB7IlZVSUQtVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UtYXNwZWN0TWFzay0wMjI1MCIsICJhc3BlY3RNYXNrIG11c3Qgbm90IGluY2x1ZGUgVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV9pX0JJVF9FWFQgZm9yIGFueSBpbmRleCBpLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZS1hc3BlY3RNYXNrLTAyMjUwKSJ9LAorICAgIHsiVlVJRC1Wa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZS1hc3BlY3RNYXNrLXBhcmFtZXRlciIsICJhc3BlY3RNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlLWFzcGVjdE1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZS1hc3BlY3RNYXNrLXJlcXVpcmVkYml0bWFzayIsICJhc3BlY3RNYXNrIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UtYXNwZWN0TWFzay1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtJbnN0YW5jZUNyZWF0ZUluZm8tcEFwcGxpY2F0aW9uSW5mby1wYXJhbWV0ZXIiLCAiSWYgcEFwcGxpY2F0aW9uSW5mbyBpcyBub3QgTlVMTCwgcEFwcGxpY2F0aW9uSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQXBwbGljYXRpb25JbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1wQXBwbGljYXRpb25JbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtJbnN0YW5jZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhULCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhULCBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCwgb3IgVmtWYWxpZGF0aW9uRmxhZ3NFWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtJbnN0YW5jZUNyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLXBhcmFtZXRlciIsICJJZiBlbmFibGVkRXh0ZW5zaW9uQ291bnQgaXMgbm90IDAsIHBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGVuYWJsZWRFeHRlbnNpb25Db3VudCBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5ncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLXBwRW5hYmxlZExheWVyTmFtZXMtcGFyYW1ldGVyIiwgIklmIGVuYWJsZWRMYXllckNvdW50IGlzIG5vdCAwLCBwcEVuYWJsZWRMYXllck5hbWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGVuYWJsZWRMYXllckNvdW50IG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmdzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLXBwRW5hYmxlZExheWVyTmFtZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa0luc3RhbmNlQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUiLCAiRWFjaCBzVHlwZSBtZW1iZXIgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgdW5pcXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrSW5zdGFuY2VDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSkifSwKKyAgICB7IlZVSUQtVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVkstZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNYWNPU1N1cmZhY2VDcmVhdGVJbmZvTVZLLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVkstcFZpZXctMDEzMTciLCAicFZpZXcgbXVzdCBiZSBhIHZhbGlkIE5TVmlldyBhbmQgbXVzdCBiZSBiYWNrZWQgYnkgYSBDQUxheWVyIGluc3RhbmNlIG9mIHR5cGUgQ0FNZXRhbExheWVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVkstcFZpZXctMDEzMTcpIn0sCisgICAgeyJWVUlELVZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX01BQ09TX1NVUkZBQ0VfQ1JFQVRFX0lORk9fTVZLIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSy1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1tZW1vcnktMDA2ODQiLCAibWVtb3J5IG11c3QgYmUgY3VycmVudGx5IGhvc3QgbWFwcGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2UtbWVtb3J5LTAwNjg0KSJ9LAorICAgIHsiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLW1lbW9yeS1wYXJhbWV0ZXIiLCAibWVtb3J5IG11c3QgYmUgYSB2YWxpZCBWa0RldmljZU1lbW9yeSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1tZW1vcnktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLW9mZnNldC0wMDY4NyIsICJvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om5vbkNvaGVyZW50QXRvbVNpemUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1vZmZzZXQtMDA2ODcpIn0sCisgICAgeyJWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2UtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2UtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utc2l6ZS0wMDY4NSIsICJJZiBzaXplIGlzIG5vdCBlcXVhbCB0byBWS19XSE9MRV9TSVpFLCBvZmZzZXQgYW5kIHNpemUgbXVzdCBzcGVjaWZ5IGEgcmFuZ2UgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudGx5IG1hcHBlZCByYW5nZSBvZiBtZW1vcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zaXplLTAwNjg1KSJ9LAorICAgIHsiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLXNpemUtMDA2ODYiLCAiSWYgc2l6ZSBpcyBlcXVhbCB0byBWS19XSE9MRV9TSVpFLCBvZmZzZXQgbXVzdCBiZSB3aXRoaW4gdGhlIGN1cnJlbnRseSBtYXBwZWQgcmFuZ2Ugb2YgbWVtb3J5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utc2l6ZS0wMDY4NikifSwKKyAgICB7IlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zaXplLTAxMzg5IiwgIklmIHNpemUgaXMgZXF1YWwgdG8gVktfV0hPTEVfU0laRSwgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtYXBwaW5nIG9mIG1lbW9yeSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bm9uQ29oZXJlbnRBdG9tU2l6ZSBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lbW9yeSBvYmplY3QuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWFwcGVkTWVtb3J5UmFuZ2Utc2l6ZS0wMTM4OSkifSwKKyAgICB7IlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zaXplLTAxMzkwIiwgIklmIHNpemUgaXMgbm90IGVxdWFsIHRvIFZLX1dIT0xFX1NJWkUsIHNpemUgbXVzdCBlaXRoZXIgYmUgYSBtdWx0aXBsZSBvZiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjpub25Db2hlcmVudEF0b21TaXplLCBvciBvZmZzZXQgcGx1cyBzaXplIG11c3QgZXF1YWwgdGhlIHNpemUgb2YgbWVtb3J5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLXNpemUtMDEzOTApIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8tZGV2aWNlTWFzay0wMDY3NSIsICJJZiBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX01BU0tfQklUIGlzIHNldCwgZGV2aWNlTWFzayBtdXN0IGJlIGEgdmFsaWQgZGV2aWNlIG1hc2suIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8tZGV2aWNlTWFzay0wMDY3NSkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mby1kZXZpY2VNYXNrLTAwNjc2IiwgIklmIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfTUFTS19CSVQgaXMgc2V0LCBkZXZpY2VNYXNrIG11c3Qgbm90IGJlIHplcm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mby1kZXZpY2VNYXNrLTAwNjc2KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtNZW1vcnlBbGxvY2F0ZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9GTEFHU19JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLU5vbmUtMDA2NDMiLCAiSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgc3BlY2lmaWVkIHdhcyBjcmVhdGVkIGJ5IHRoZSBWdWxrYW4gQVBJLCB0aGUgZGV2aWNlIG1hc2sgc3BlY2lmaWVkIGJ5IFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gbXVzdCBtYXRjaCB0aGF0IHNwZWNpZmllZCB3aGVuIHRoZSBtZW1vcnkgb2JqZWN0IGJlaW5nIGltcG9ydGVkIHdhcyBhbGxvY2F0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLU5vbmUtMDA2NDMpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLU5vbmUtMDA2NDQiLCAiSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgc3BlY2lmaWVkIHdhcyBjcmVhdGVkIGJ5IHRoZSBWdWxrYW4gQVBJLCB0aGUgbGlzdCBvZiBwaHlzaWNhbCBkZXZpY2VzIHRoYXQgY29tcHJpc2UgdGhlIGxvZ2ljYWwgZGV2aWNlIHBhc3NlZCB0byB2a0FsbG9jYXRlTWVtb3J5IG11c3QgbWF0Y2ggdGhlIGxpc3Qgb2YgcGh5c2ljYWwgZGV2aWNlcyB0aGF0IGNvbXByaXNlIHRoZSBsb2dpY2FsIGRldmljZSBvbiB3aGljaCB0aGUgbWVtb3J5IHdhcyBvcmlnaW5hbGx5IGFsbG9jYXRlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tTm9uZS0wMDY0NCkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDA2MzgiLCAiYWxsb2NhdGlvblNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1hbGxvY2F0aW9uU2l6ZS0wMDYzOCkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDA2NDYiLCAiSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBpcyBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQsIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVQsIG9yIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9SRVNPVVJDRV9CSVQsIGFsbG9jYXRpb25TaXplIG11c3QgbWF0Y2ggdGhlIHNpemUgcmVwb3J0ZWQgaW4gdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgdGhlIGltYWdlIG9yIGJ1ZmZlciBtZW1iZXIgb2YgdGhlIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAwNjQ2KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1hbGxvY2F0aW9uU2l6ZS0wMDY0NyIsICJJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIGlzIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVCwgYWxsb2NhdGlvblNpemUgbXVzdCBtYXRjaCB0aGUgc2l6ZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgRGlyZWN0M0QgMTIgaGVhcCBmcm9tIHdoaWNoIHRoZSBleHRlcm5hbCBoYW5kbGUgd2FzIGV4dHJhY3RlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDA2NDcpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAxNzQyIiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHNwZWNpZmllZCB3YXMgY3JlYXRlZCBieSB0aGUgVnVsa2FuIEFQSSwgYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBpcyBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVF9LSFIsIHRoZW4gdGhlIHZhbHVlcyBvZiBhbGxvY2F0aW9uU2l6ZSBhbmQgbWVtb3J5VHlwZUluZGV4IG11c3QgbWF0Y2ggdGhvc2Ugc3BlY2lmaWVkIHdoZW4gdGhlIG1lbW9yeSBvYmplY3QgYmVpbmcgaW1wb3J0ZWQgd2FzIGNyZWF0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAxNzQyKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1hbGxvY2F0aW9uU2l6ZS0wMTc0MyIsICJJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiwgdGhlIGV4dGVybmFsIGhhbmRsZSB3YXMgY3JlYXRlZCBieSB0aGUgVnVsa2FuIEFQSSwgYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBpcyBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFIgb3IgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUiwgdGhlbiB0aGUgdmFsdWVzIG9mIGFsbG9jYXRpb25TaXplIGFuZCBtZW1vcnlUeXBlSW5kZXggbXVzdCBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgd2hlbiB0aGUgbWVtb3J5IG9iamVjdCBiZWluZyBpbXBvcnRlZCB3YXMgY3JlYXRlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDE3NDMpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAxNzQ1IiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGEgaG9zdCBwb2ludGVyLCBhbGxvY2F0aW9uU2l6ZSBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQ6Om1pbkltcG9ydGVkSG9zdFBvaW50ZXJBbGlnbm1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDE3NDUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAyMzgzIiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHR5cGUgaXMgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lELCBhbGxvY2F0aW9uU2l6ZSBtdXN0IGJlIHRoZSBzaXplIHJldHVybmVkIGJ5IHZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgZm9yIHRoZSBBbmRyb2lkIGhhcmR3YXJlIGJ1ZmZlci4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDIzODMpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWZsYWdzLTAzMzMwIiwgIklmIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm86OmZsYWdzIGluY2x1ZGVzIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSLCB0aGUgYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tZmxhZ3MtMDMzMzApIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWZsYWdzLTAzMzMxIiwgIklmIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm86OmZsYWdzIGluY2x1ZGVzIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19CSVRfS0hSLCB0aGUgYnVmZmVyRGV2aWNlQWRkcmVzcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1mbGFncy0wMzMzMSkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tbWVtb3J5VHlwZUluZGV4LTAwNjQ1IiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGFuIE5UIGhhbmRsZSBvciBhIGdsb2JhbCBzaGFyZSBoYW5kbGUgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBWdWxrYW4gQVBJLCB0aGUgdmFsdWUgb2YgbWVtb3J5VHlwZUluZGV4IG11c3QgYmUgb25lIG9mIHRob3NlIHJldHVybmVkIGJ5IHZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1tZW1vcnlUeXBlSW5kZXgtMDA2NDUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW1lbW9yeVR5cGVJbmRleC0wMDY0OCIsICJJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSBpcyBhIFBPU0lYIGZpbGUgZGVzY3JpcHRvciBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFZ1bGthbiBBUEksIHRoZSB2YWx1ZSBvZiBtZW1vcnlUeXBlSW5kZXggbXVzdCBiZSBvbmUgb2YgdGhvc2UgcmV0dXJuZWQgYnkgdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW1lbW9yeVR5cGVJbmRleC0wMDY0OCkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tbWVtb3J5VHlwZUluZGV4LTAxNzQ0IiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGEgaG9zdCBwb2ludGVyLCB0aGUgdmFsdWUgb2YgbWVtb3J5VHlwZUluZGV4IG11c3QgYmUgb25lIG9mIHRob3NlIHJldHVybmVkIGJ5IHZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW1lbW9yeVR5cGVJbmRleC0wMTc0NCkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tbWVtb3J5VHlwZUluZGV4LTAxODcyIiwgIklmIHRoZSBwcm90ZWN0ZWQgbWVtb3J5IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHRoZSBWa01lbW9yeUFsbG9jYXRlSW5mbzo6bWVtb3J5VHlwZUluZGV4IG11c3Qgbm90IGluZGljYXRlIGEgbWVtb3J5IHR5cGUgdGhhdCByZXBvcnRzIFZLX01FTU9SWV9QUk9QRVJUWV9QUk9URUNURURfQklULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1tZW1vcnlUeXBlSW5kZXgtMDE4NzIpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW1lbW9yeVR5cGVJbmRleC0wMjM4NSIsICJJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIGlzIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCwgbWVtb3J5VHlwZUluZGV4IG11c3QgYmUgb25lIG9mIHRob3NlIHJldHVybmVkIGJ5IHZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgZm9yIHRoZSBBbmRyb2lkIGhhcmR3YXJlIGJ1ZmZlci4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tbWVtb3J5VHlwZUluZGV4LTAyMzg1KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1vcGFxdWVDYXB0dXJlQWRkcmVzcy0wMzMyOSIsICJJZiBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSOjpvcGFxdWVDYXB0dXJlQWRkcmVzcyBpcyBub3QgemVybywgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzo6ZmxhZ3MgbXVzdCBpbmNsdWRlIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW9wYXF1ZUNhcHR1cmVBZGRyZXNzLTAzMzI5KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1vcGFxdWVDYXB0dXJlQWRkcmVzcy0wMzMzMyIsICJJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiwgVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUjo6b3BhcXVlQ2FwdHVyZUFkZHJlc3MgbXVzdCBiZSB6ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW9wYXF1ZUNhcHR1cmVBZGRyZXNzLTAzMzMzKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMDYzOSIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbyAgICAgc3RydWN0dXJlLCBhbmQgYW55IG9mIHRoZSBoYW5kbGUgdHlwZXMgc3BlY2lmaWVkIGluICAgICBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzo6aGFuZGxlVHlwZXMgcmVxdWlyZSBhIGRlZGljYXRlZCAgICAgYWxsb2NhdGlvbiwgYXMgcmVwb3J0ZWQgYnkgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIGluICAgICBWa0V4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjpleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMuZXh0ZXJuYWxNZW1vcnlGZWF0dXJlcyAgICAgb3IgICAgIFZrRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzOjpleHRlcm5hbE1lbW9yeVByb3BlcnRpZXMuZXh0ZXJuYWxNZW1vcnlGZWF0dXJlcywgICAgIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgYSBpZmRlZjo6VktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uW1ZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMDYzOSkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDA2NDAiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gc3RydWN0dXJlLCBpdCBtdXN0IG5vdCBpbmNsdWRlIGEgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm9OViBvciBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WIHN0cnVjdHVyZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDA2NDApIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAwNjQxIiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIHN0cnVjdHVyZSwgaXQgbXVzdCBub3QgaW5jbHVkZSBhIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvTlYgc3RydWN0dXJlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMDY0MSkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDE4NzQiLCAiSWYgdGhlIHBhcmFtZXRlcnMgZG8gbm90IGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uLCBhbmQgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8gc3RydWN0dXJlIHdpdGggVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEIGluY2x1ZGVkIGluIGl0cyBoYW5kbGVUeXBlcyBtZW1iZXIsIGFuZCB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgd2l0aCBpbWFnZSBub3QgZXF1YWwgdG8gVktfTlVMTF9IQU5ETEUsIHRoZW4gYWxsb2NhdGlvblNpemUgbXVzdCBiZSAwLCBvdGhlcndpc2UgYWxsb2NhdGlvblNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDE4NzQpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg0IiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHR5cGUgaXMgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lELCBhbmQgdGhlIHBOZXh0IGNoYWluIGRvZXMgbm90IGluY2x1ZGUgYSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgb3IgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmltYWdlIGlzIFZLX05VTExfSEFORExFLCB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIgbXVzdCBoYXZlIGEgQUhhcmR3YXJlQnVmZmVyX0Rlc2M6OmZvcm1hdCBvZiBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0JMT0IgYW5kIGEgQUhhcmR3YXJlQnVmZmVyX0Rlc2M6OnVzYWdlIHRoYXQgaW5jbHVkZXMgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9EQVRBX0JVRkZFUi4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODQpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg2IiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGFuIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyLCBhbmQgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gd2l0aCBpbWFnZSB0aGF0IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgdGhlIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyJ3MgQUhhcmR3YXJlQnVmZmVyOjp1c2FnZSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG9mIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUIG9yIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODYpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg3IiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGFuIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyLCBhbmQgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gd2l0aCBpbWFnZSB0aGF0IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgdGhlIGZvcm1hdCBvZiBpbWFnZSBtdXN0IGJlIFZLX0ZPUk1BVF9VTkRFRklORUQgb3IgdGhlIGZvcm1hdCByZXR1cm5lZCBieSB2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIGluIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQ6OmZvcm1hdCBmb3IgdGhlIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjM4NykifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODgiLCAiSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgaXMgYW4gQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIsIGFuZCB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgd2l0aCBpbWFnZSB0aGF0IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgdGhlIHdpZHRoLCBoZWlnaHQsIGFuZCBhcnJheSBsYXllciBkaW1lbnNpb25zIG9mIGltYWdlIGFuZCB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIncyBBSGFyZHdhcmVCdWZmZXJfRGVzYyBtdXN0IGJlIGlkZW50aWNhbC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODgpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg5IiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGFuIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyLCBhbmQgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gc3RydWN0dXJlIHdpdGggaW1hZ2UgdGhhdCBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGFuZCB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIncyBBSGFyZHdhcmVCdWZmZXI6OnVzYWdlIGluY2x1ZGVzIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfTUlQTUFQX0NPTVBMRVRFLCB0aGUgaW1hZ2UgbXVzdCBoYXZlIGEgY29tcGxldGUgbWlwbWFwIGNoYWluLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjM4OSkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzOTAiLCAiSWYgdGhlIHBhcmFtZXRlcnMgZGVmaW5lIGFuIGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgaXMgYW4gQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIsIGFuZCB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgd2l0aCBpbWFnZSB0aGF0IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZWFjaCBiaXQgc2V0IGluIHRoZSB1c2FnZSBvZiBpbWFnZSBtdXN0IGJlIGxpc3RlZCBpbiBBSGFyZHdhcmVCdWZmZXIgVXNhZ2UgRXF1aXZhbGVuY2UsIGFuZCBpZiB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgQUhBUkRXQVJFQlVGRkVSX1VTQUdFIGJpdCBsaXN0ZWQgdGhhdCBiaXQgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIncyBBSGFyZHdhcmVCdWZmZXJfRGVzYzo6dXNhZ2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzkwKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjU4NiIsICJJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiwgdGhlIGV4dGVybmFsIGhhbmRsZSBpcyBhbiBBbmRyb2lkIGhhcmR3YXJlIGJ1ZmZlciwgYW5kIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIHN0cnVjdHVyZSB3aXRoIGltYWdlIHRoYXQgaXMgbm90IFZLX05VTExfSEFORExFLCBhbmQgdGhlIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyJ3MgQUhhcmR3YXJlQnVmZmVyOjp1c2FnZSBkb2VzIG5vdCBpbmNsdWRlIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfTUlQTUFQX0NPTVBMRVRFLCB0aGUgaW1hZ2UgbXVzdCBoYXZlIGV4YWN0bHkgb25lIG1pcG1hcCBsZXZlbC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDI1ODYpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyODA1IiwgIklmIHRoZSBwYXJhbWV0ZXJzIGRlZmluZSBhbiBpbXBvcnQgb3BlcmF0aW9uIGFuZCB0aGUgZXh0ZXJuYWwgaGFuZGxlIGlzIGEgaG9zdCBwb2ludGVyLCB0aGUgcE5leHQgY2hhaW4gbXVzdCBub3QgaW5jbHVkZSBhIFZrRGVkaWNhdGVkQWxsb2NhdGlvbk1lbW9yeUFsbG9jYXRlSW5mb05WIHN0cnVjdHVyZSB3aXRoIGVpdGhlciBpdHMgaW1hZ2Ugb3IgYnVmZmVyIGZpZWxkIHNldCB0byBhIHZhbHVlIG90aGVyIHRoYW4gVktfTlVMTF9IQU5ETEUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyODA1KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjgwNiIsICJJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiBhbmQgdGhlIGV4dGVybmFsIGhhbmRsZSBpcyBhIGhvc3QgcG9pbnRlciwgdGhlIHBOZXh0IGNoYWluIG11c3Qgbm90IGluY2x1ZGUgYSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgd2l0aCBlaXRoZXIgaXRzIGltYWdlIG9yIGJ1ZmZlciBmaWVsZCBzZXQgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIFZLX05VTExfSEFORExFLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjgwNikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDMzMzIiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgc3RydWN0dXJlLCBWa01lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzQWxsb2NhdGVJbmZvS0hSOjpvcGFxdWVDYXB0dXJlQWRkcmVzcyBtdXN0IGJlIHplcm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDMzMzIpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LXBOZXh0IiwgIkVhY2ggcE5leHQgbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYsIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvLCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WLCBWa0V4cG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiwgVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViwgVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCwgVmtJbXBvcnRNZW1vcnlGZEluZm9LSFIsIFZrSW1wb3J0TWVtb3J5SG9zdFBvaW50ZXJJbmZvRVhULCBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUiwgVmtJbXBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViwgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbywgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8sIFZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFIsIG9yIFZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsICJFYWNoIHNUeXBlIG1lbWJlciBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSB1bmlxdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUJhcnJpZXItZHN0QWNjZXNzTWFzay1wYXJhbWV0ZXIiLCAiZHN0QWNjZXNzTWFzayBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtBY2Nlc3NGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlCYXJyaWVyLWRzdEFjY2Vzc01hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUJhcnJpZXItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5QmFycmllci1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlCYXJyaWVyLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlCYXJyaWVyLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUJhcnJpZXItc3JjQWNjZXNzTWFzay1wYXJhbWV0ZXIiLCAic3JjQWNjZXNzTWFzayBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtBY2Nlc3NGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlCYXJyaWVyLXNyY0FjY2Vzc01hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1idWZmZXItMDE0MzUiLCAiSWYgYnVmZmVyIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgVmtNZW1vcnlBbGxvY2F0ZUluZm86OmFsbG9jYXRpb25TaXplIG11c3QgZXF1YWwgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzOjpzaXplIG9mIHRoZSBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8tYnVmZmVyLTAxNDM1KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1idWZmZXItMDE0MzYiLCAiSWYgYnVmZmVyIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aG91dCBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCBzZXQgaW4gVmtCdWZmZXJDcmVhdGVJbmZvOjpmbGFncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1idWZmZXItMDE0MzYpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWJ1ZmZlci0wMTg3NyIsICJJZiBidWZmZXIgaXMgbm90IFZLX05VTExfSEFORExFIGFuZCBWa01lbW9yeUFsbG9jYXRlSW5mbyBkZWZpbmVzIGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24gd2l0aCBoYW5kbGUgdHlwZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCwgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklULCBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQsIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVQsIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVCwgb3IgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVCwgYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgd2FzIGNyZWF0ZWQgYnkgdGhlIFZ1bGthbiBBUEksIHRoZW4gdGhlIG1lbW9yeSBiZWluZyBpbXBvcnRlZCBtdXN0IGFsc28gYmUgYSBkZWRpY2F0ZWQgYnVmZmVyIGFsbG9jYXRpb24gYW5kIGJ1ZmZlciBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1wb3J0ZWQgbWVtb3J5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1idWZmZXItMDE4NzcpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWJ1ZmZlci0wMTg3OSIsICJJZiBidWZmZXIgaXMgbm90IFZLX05VTExfSEFORExFIGFuZCBWa01lbW9yeUFsbG9jYXRlSW5mbyBkZWZpbmVzIGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24gd2l0aCBoYW5kbGUgdHlwZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCwgdGhlIG1lbW9yeSBiZWluZyBpbXBvcnRlZCBtdXN0IGFsc28gYmUgYSBkZWRpY2F0ZWQgYnVmZmVyIGFsbG9jYXRpb24gYW5kIGJ1ZmZlciBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1wb3J0ZWQgbWVtb3J5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1idWZmZXItMDE4NzkpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWJ1ZmZlci1wYXJhbWV0ZXIiLCAiSWYgYnVmZmVyIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8tYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8tY29tbW9ucGFyZW50IiwgIkJvdGggb2YgYnVmZmVyLCBhbmQgaW1hZ2UgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8tY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1pbWFnZS0wMTQzMiIsICJBdCBsZWFzdCBvbmUgb2YgaW1hZ2UgYW5kIGJ1ZmZlciBtdXN0IGJlIFZLX05VTExfSEFORExFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWltYWdlLTAxNDMyKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1pbWFnZS0wMTQzMyIsICJJZiBpbWFnZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIFZrTWVtb3J5QWxsb2NhdGVJbmZvOjphbGxvY2F0aW9uU2l6ZSBtdXN0IGVxdWFsIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50czo6c2l6ZSBvZiB0aGUgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8taW1hZ2UtMDE0MzMpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWltYWdlLTAxNDM0IiwgIklmIGltYWdlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRob3V0IFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQgc2V0IGluIFZrSW1hZ2VDcmVhdGVJbmZvOjpmbGFncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1pbWFnZS0wMTQzNCkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8taW1hZ2UtMDE3OTciLCAiSWYgaW1hZ2UgaXMgbm90IFZLX05VTExfSEFORExFLCBpbWFnZSBtdXN0IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0lNQUdFX0NSRUFURV9ESVNKT0lOVF9CSVQgc2V0IGluIFZrSW1hZ2VDcmVhdGVJbmZvOjpmbGFncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1pbWFnZS0wMTc5NykifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8taW1hZ2UtMDE4NzYiLCAiSWYgaW1hZ2UgaXMgbm90IFZLX05VTExfSEFORExFIGFuZCBWa01lbW9yeUFsbG9jYXRlSW5mbyBkZWZpbmVzIGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24gd2l0aCBoYW5kbGUgdHlwZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVCwgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklULCBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQsIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMV9URVhUVVJFX0tNVF9CSVQsIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9EM0QxMl9IRUFQX0JJVCwgb3IgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDEyX1JFU09VUkNFX0JJVCwgYW5kIHRoZSBleHRlcm5hbCBoYW5kbGUgd2FzIGNyZWF0ZWQgYnkgdGhlIFZ1bGthbiBBUEksIHRoZW4gdGhlIG1lbW9yeSBiZWluZyBpbXBvcnRlZCBtdXN0IGFsc28gYmUgYSBkZWRpY2F0ZWQgaW1hZ2UgYWxsb2NhdGlvbiBhbmQgaW1hZ2UgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1wb3J0ZWQgbWVtb3J5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1pbWFnZS0wMTg3NikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8taW1hZ2UtMDE4NzgiLCAiSWYgaW1hZ2UgaXMgbm90IFZLX05VTExfSEFORExFIGFuZCBWa01lbW9yeUFsbG9jYXRlSW5mbyBkZWZpbmVzIGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24gd2l0aCBoYW5kbGUgdHlwZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVCwgdGhlIG1lbW9yeSBiZWluZyBpbXBvcnRlZCBtdXN0IGFsc28gYmUgYSBkZWRpY2F0ZWQgaW1hZ2UgYWxsb2NhdGlvbiBhbmQgaW1hZ2UgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1wb3J0ZWQgbWVtb3J5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mby1pbWFnZS0wMTg3OCkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8taW1hZ2UtcGFyYW1ldGVyIiwgIklmIGltYWdlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvLWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX0FMTE9DQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5RmRQcm9wZXJ0aWVzS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUZkUHJvcGVydGllc0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlGZFByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfRkRfUFJPUEVSVElFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlGZFByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtaGFuZGxlVHlwZXMtMDE4ODIiLCAiVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEIG11c3QgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOjpoYW5kbGVUeXBlcyB3aGVuIG1lbW9yeSB3YXMgY3JlYXRlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1oYW5kbGVUeXBlcy0wMTg4MikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1tZW1vcnktcGFyYW1ldGVyIiwgIm1lbW9yeSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQtbWVtb3J5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1wTmV4dC0wMTg4MyIsICJJZiB0aGUgcE5leHQgY2hhaW4gb2YgdGhlIFZrTWVtb3J5QWxsb2NhdGVJbmZvIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGluY2x1ZGVkIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gd2l0aCBub24tTlVMTCBpbWFnZSBtZW1iZXIsIHRoZW4gdGhhdCBpbWFnZSBtdXN0IGFscmVhZHkgYmUgYm91bmQgdG8gbWVtb3J5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELXBOZXh0LTAxODgzKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMDY3MSIsICJoYW5kbGVUeXBlIG11c3QgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOjpoYW5kbGVUeXBlcyB3aGVuIG1lbW9yeSB3YXMgY3JlYXRlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMDY3MSkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMDY3MiIsICJoYW5kbGVUeXBlIG11c3QgYmUgZGVmaW5lZCBhcyBhIFBPU0lYIGZpbGUgZGVzY3JpcHRvciBoYW5kbGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5R2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NzIpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5R2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5R2V0RmRJbmZvS0hSLW1lbW9yeS1wYXJhbWV0ZXIiLCAibWVtb3J5IG11c3QgYmUgYSB2YWxpZCBWa0RldmljZU1lbW9yeSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItbWVtb3J5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5R2V0RmRJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUdldEZkSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfRkRfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlHZXRGZEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjIiLCAiaGFuZGxlVHlwZSBtdXN0IGhhdmUgYmVlbiBpbmNsdWRlZCBpbiBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzo6aGFuZGxlVHlwZXMgd2hlbiBtZW1vcnkgd2FzIGNyZWF0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjIpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjMiLCAiSWYgaGFuZGxlVHlwZSBpcyBkZWZpbmVkIGFzIGFuIE5UIGhhbmRsZSwgdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUiBtdXN0IGJlIGNhbGxlZCBubyBtb3JlIHRoYW4gb25jZSBmb3IgZWFjaCB2YWxpZCB1bmlxdWUgY29tYmluYXRpb24gb2YgbWVtb3J5IGFuZCBoYW5kbGVUeXBlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjYzKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAwNjY0IiwgImhhbmRsZVR5cGUgbXVzdCBiZSBkZWZpbmVkIGFzIGFuIE5UIGhhbmRsZSBvciBhIGdsb2JhbCBzaGFyZSBoYW5kbGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDA2NjQpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLW1lbW9yeS1wYXJhbWV0ZXIiLCAibWVtb3J5IG11c3QgYmUgYSB2YWxpZCBWa0RldmljZU1lbW9yeSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFItbWVtb3J5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlHZXRXaW4zMkhhbmRsZUluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUdldFdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0hPU1RfUE9JTlRFUl9QUk9QRVJUSUVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9PUEFRVUVfQ0FQVFVSRV9BRERSRVNTX0FMTE9DQVRFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NBbGxvY2F0ZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQtcHJpb3JpdHktMDI2MDIiLCAicHJpb3JpdHkgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEsIGluY2x1c2l2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhULXByaW9yaXR5LTAyNjAyKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeVByaW9yaXR5QWxsb2NhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1BSSU9SSVRZX0FMTE9DQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5UmVxdWlyZW1lbnRzMi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlSZXF1aXJlbWVudHMyLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeVJlcXVpcmVtZW50czItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlSZXF1aXJlbWVudHMyLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1dJTjMyX0hBTkRMRV9QUk9QRVJUSUVTX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrTWV0YWxTdXJmYWNlQ3JlYXRlSW5mb0VYVC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtNZXRhbFN1cmZhY2VDcmVhdGVJbmZvRVhULXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9NRVRBTF9TVVJGQUNFX0NSRUFURV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9NVUxUSVNBTVBMRV9QUk9QRVJUSUVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa011bHRpc2FtcGxlUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQtMDEzNTUiLCAiSWYgdGhlIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNGZWF0dXJlc05WWDo6Y29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgcE9iamVjdEVudHJ5VXNhZ2VGbGFncyBtdXN0IG5vdCBjb250YWluIFZLX09CSkVDVF9FTlRSWV9VU0FHRV9DT01QVVRFX0JJVF9OVlggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQtMDEzNTUpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLW1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yLTAxMzYwIiwgIm1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yIG11c3QgYmUgd2l0aGluIHRoZSBsaW1pdHMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLW1heFNhbXBsZWRJbWFnZXNQZXJEZXNjcmlwdG9yLTAxMzYwKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1tYXhTdG9yYWdlQnVmZmVyc1BlckRlc2NyaXB0b3ItMDEzNTgiLCAibWF4U3RvcmFnZUJ1ZmZlcnNQZXJEZXNjcmlwdG9yIG11c3QgYmUgd2l0aGluIHRoZSBsaW1pdHMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLW1heFN0b3JhZ2VCdWZmZXJzUGVyRGVzY3JpcHRvci0wMTM1OCkifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtbWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3ItMDEzNTkiLCAibWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3IgbXVzdCBiZSB3aXRoaW4gdGhlIGxpbWl0cyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtbWF4U3RvcmFnZUltYWdlc1BlckRlc2NyaXB0b3ItMDEzNTkpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLW1heFVuaWZvcm1CdWZmZXJzUGVyRGVzY3JpcHRvci0wMTM1NyIsICJtYXhVbmlmb3JtQnVmZmVyc1BlckRlc2NyaXB0b3IgbXVzdCBiZSB3aXRoaW4gdGhlIGxpbWl0cyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtbWF4VW5pZm9ybUJ1ZmZlcnNQZXJEZXNjcmlwdG9yLTAxMzU3KSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1vYmplY3RDb3VudC1hcnJheWxlbmd0aCIsICJvYmplY3RDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLW9iamVjdENvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLXBPYmplY3RFbnRyeUNvdW50cy0wMTM1NiIsICJBbnkgdmFsdWUgd2l0aGluIHBPYmplY3RFbnRyeUNvdW50cyBtdXN0IG5vdCBleGNlZWQgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0xpbWl0c05WWDo6bWF4T2JqZWN0RW50cnlDb3VudHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE9iamVjdEVudHJ5Q291bnRzLTAxMzU2KSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1wT2JqZWN0RW50cnlDb3VudHMtcGFyYW1ldGVyIiwgInBPYmplY3RFbnRyeUNvdW50cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBvYmplY3RDb3VudCB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE9iamVjdEVudHJ5Q291bnRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE9iamVjdEVudHJ5VHlwZXMtcGFyYW1ldGVyIiwgInBPYmplY3RFbnRyeVR5cGVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIG9iamVjdENvdW50IHZhbGlkIFZrT2JqZWN0RW50cnlUeXBlTlZYIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1wT2JqZWN0RW50cnlUeXBlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLXBPYmplY3RFbnRyeVVzYWdlRmxhZ3MtcGFyYW1ldGVyIiwgInBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygb2JqZWN0Q291bnQgdmFsaWQgY29tYmluYXRpb25zIG9mIFZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1wT2JqZWN0RW50cnlVc2FnZUZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtcE9iamVjdEVudHJ5VXNhZ2VGbGFncy1yZXF1aXJlZGJpdG1hc2siLCAiRWFjaCBlbGVtZW50IG9mIHBPYmplY3RFbnRyeVVzYWdlRmxhZ3MgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWC1wT2JqZWN0RW50cnlVc2FnZUZsYWdzLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlgtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9PQkpFQ1RfVEFCTEVfQ1JFQVRFX0lORk9fTlZYIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVDcmVhdGVJbmZvTlZYLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGRlc2NyaXB0b3JTZXQsIGFuZCBwaXBlbGluZUxheW91dCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlgtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYLWRlc2NyaXB0b3JTZXQtcGFyYW1ldGVyIiwgImRlc2NyaXB0b3JTZXQgbXVzdCBiZSBhIHZhbGlkIFZrRGVzY3JpcHRvclNldCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC1kZXNjcmlwdG9yU2V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC1mbGFncy1yZXF1aXJlZGJpdG1hc2siLCAiZmxhZ3MgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC1waXBlbGluZUxheW91dC1wYXJhbWV0ZXIiLCAicGlwZWxpbmVMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmVMYXlvdXQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlgtcGlwZWxpbmVMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYLXR5cGUtMDEzNjkiLCAidHlwZSBtdXN0IGJlIFZLX09CSkVDVF9FTlRSWV9UWVBFX0RFU0NSSVBUT1JfU0VUX05WWCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlRGVzY3JpcHRvclNldEVudHJ5TlZYLXR5cGUtMDEzNjkpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVEZXNjcmlwdG9yU2V0RW50cnlOVlgtdHlwZS1wYXJhbWV0ZXIiLCAidHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtPYmplY3RFbnRyeVR5cGVOVlggdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZURlc2NyaXB0b3JTZXRFbnRyeU5WWC10eXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUVudHJ5TlZYLWNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0LTAxMzY3IiwgIklmIHRoZSBWa0RldmljZUdlbmVyYXRlZENvbW1hbmRzRmVhdHVyZXNOVlg6OmNvbXB1dGVCaW5kaW5nUG9pbnRTdXBwb3J0IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfT0JKRUNUX0VOVFJZX1VTQUdFX0NPTVBVVEVfQklUX05WWCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlRW50cnlOVlgtY29tcHV0ZUJpbmRpbmdQb2ludFN1cHBvcnQtMDEzNjcpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlRW50cnlOVlgtZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlRW50cnlOVlgtZmxhZ3MtcmVxdWlyZWRiaXRtYXNrIiwgImZsYWdzIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZUVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUVudHJ5TlZYLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrT2JqZWN0RW50cnlUeXBlTlZYIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVFbnRyeU5WWC10eXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgtYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWC1idWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzayIsICJmbGFncyBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZUluZGV4QnVmZmVyRW50cnlOVlgtaW5kZXhUeXBlLTAyNzgzIiwgImluZGV4VHlwZSBtdXN0IGJlIFZLX0lOREVYX1RZUEVfVUlOVDE2LCBvciBWS19JTkRFWF9UWVBFX1VJTlQzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWC1pbmRleFR5cGUtMDI3ODMpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYLWluZGV4VHlwZS1wYXJhbWV0ZXIiLCAiaW5kZXhUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0luZGV4VHlwZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWC1pbmRleFR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlSW5kZXhCdWZmZXJFbnRyeU5WWC10eXBlLTAxMzcxIiwgInR5cGUgbXVzdCBiZSBWS19PQkpFQ1RfRU5UUllfVFlQRV9JTkRFWF9CVUZGRVJfTlZYIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYLXR5cGUtMDEzNzEpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrT2JqZWN0RW50cnlUeXBlTlZYIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVJbmRleEJ1ZmZlckVudHJ5TlZYLXR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrT2JqZWN0RW50cnlVc2FnZUZsYWdCaXRzTlZYIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzayIsICJmbGFncyBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZVBpcGVsaW5lRW50cnlOVlgtcGlwZWxpbmUtcGFyYW1ldGVyIiwgInBpcGVsaW5lIG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWC1waXBlbGluZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVQaXBlbGluZUVudHJ5TlZYLXR5cGUtMDEzNjgiLCAidHlwZSBtdXN0IGJlIFZLX09CSkVDVF9FTlRSWV9UWVBFX1BJUEVMSU5FX05WWCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWC10eXBlLTAxMzY4KSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWC10eXBlLXBhcmFtZXRlciIsICJ0eXBlIG11c3QgYmUgYSB2YWxpZCBWa09iamVjdEVudHJ5VHlwZU5WWCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlUGlwZWxpbmVFbnRyeU5WWC10eXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtPYmplY3RFbnRyeVVzYWdlRmxhZ0JpdHNOVlggdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWC1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWC1mbGFncy1yZXF1aXJlZGJpdG1hc2siLCAiZmxhZ3MgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgtZmxhZ3MtcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgtcGlwZWxpbmVMYXlvdXQtcGFyYW1ldGVyIiwgInBpcGVsaW5lTGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lTGF5b3V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgtcGlwZWxpbmVMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgtc3RhZ2VGbGFncy1wYXJhbWV0ZXIiLCAic3RhZ2VGbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgtc3RhZ2VGbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWC1zdGFnZUZsYWdzLXJlcXVpcmVkYml0bWFzayIsICJzdGFnZUZsYWdzIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYLXN0YWdlRmxhZ3MtcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgtdHlwZS0wMTM3MiIsICJ0eXBlIG11c3QgYmUgVktfT0JKRUNUX0VOVFJZX1RZUEVfUFVTSF9DT05TVEFOVF9OVlggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZVB1c2hDb25zdGFudEVudHJ5TlZYLXR5cGUtMDEzNzIpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVQdXNoQ29uc3RhbnRFbnRyeU5WWC10eXBlLXBhcmFtZXRlciIsICJ0eXBlIG11c3QgYmUgYSB2YWxpZCBWa09iamVjdEVudHJ5VHlwZU5WWCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlUHVzaENvbnN0YW50RW50cnlOVlgtdHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWC1idWZmZXItcGFyYW1ldGVyIiwgImJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWC1idWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgtZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa09iamVjdEVudHJ5VXNhZ2VGbGFnQml0c05WWCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYLWZsYWdzLXJlcXVpcmVkYml0bWFzayIsICJmbGFncyBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWC1mbGFncy1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWC10eXBlLTAxMzcwIiwgInR5cGUgbXVzdCBiZSBWS19PQkpFQ1RfRU5UUllfVFlQRV9WRVJURVhfQlVGRkVSX05WWCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa09iamVjdFRhYmxlVmVydGV4QnVmZmVyRW50cnlOVlgtdHlwZS0wMTM3MCkifSwKKyAgICB7IlZVSUQtVmtPYmplY3RUYWJsZVZlcnRleEJ1ZmZlckVudHJ5TlZYLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrT2JqZWN0RW50cnlUeXBlTlZYIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrT2JqZWN0VGFibGVWZXJ0ZXhCdWZmZXJFbnRyeU5WWC10eXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPTkZJR1VSQVRJT05fQUNRVUlSRV9JTkZPX0lOVEVMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uVHlwZUlOVEVMIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uQWNxdWlyZUluZm9JTlRFTC10eXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfREVTQ1JJUFRJT05fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGVyZm9ybWFuY2VDb3VudGVyRGVzY3JpcHRpb25LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGVyZm9ybWFuY2VDb3VudGVyS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BlcmZvcm1hbmNlQ291bnRlcktIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BlcmZvcm1hbmNlQ291bnRlcktIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX01BUktFUl9JTkZPX0lOVEVMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGVyZm9ybWFuY2VNYXJrZXJJbmZvSU5URUwtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9PVkVSUklERV9JTkZPX0lOVEVMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZU92ZXJyaWRlSW5mb0lOVEVMLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrUGVyZm9ybWFuY2VPdmVycmlkZVR5cGVJTlRFTCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BlcmZvcm1hbmNlT3ZlcnJpZGVJbmZvSU5URUwtdHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFItY291bnRlclBhc3NJbmRleC0wMzIyMSIsICJjb3VudGVyUGFzc0luZGV4IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgY291bnRlciBwYXNzZXMgcmVxdWlyZWQgYnkgYW55IHF1ZXJpZXMgd2l0aGluIHRoZSBiYXRjaC4gVGhlIHJlcXVpcmVkIG51bWJlciBvZiBjb3VudGVyIHBhc3NlcyBmb3IgYSBwZXJmb3JtYW5jZSBxdWVyeSBpcyBvYnRhaW5lZCBieSBjYWxsaW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUi1jb3VudGVyUGFzc0luZGV4LTAzMjIxKSJ9LAorICAgIHsiVlVJRC1Wa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJbmZvSU5URUwtbWFya2VyLTAyNzM1IiwgIlRoZSB2YWx1ZSB3cml0dGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiBpbnRvIG1hcmtlciBtdXN0IG9ubHkgdXNlZCB0aGUgdmFsaWQgYml0cyBhcyByZXBvcnRlZCBieSB2a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwgd2l0aCB0aGUgVktfUEVSRk9STUFOQ0VfUEFSQU1FVEVSX1RZUEVfU1RSRUFNX01BUktFUl9WQUxJRF9CSVRTX0lOVEVMLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMLW1hcmtlci0wMjczNSkifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX1NUUkVBTV9NQVJLRVJfSU5GT19JTlRFTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BlcmZvcm1hbmNlU3RyZWFtTWFya2VySW5mb0lOVEVMLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BlcmZvcm1hbmNlVmFsdWVEYXRhSU5URUwtdmFsdWVTdHJpbmctcGFyYW1ldGVyIiwgInZhbHVlU3RyaW5nIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMLXZhbHVlU3RyaW5nLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQZXJmb3JtYW5jZVZhbHVlSU5URUwtZGF0YS1wYXJhbWV0ZXIiLCAiZGF0YSBtdXN0IGJlIGEgdmFsaWQgVmtQZXJmb3JtYW5jZVZhbHVlRGF0YUlOVEVMIHVuaW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMLWRhdGEtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BlcmZvcm1hbmNlVmFsdWVJTlRFTC10eXBlLXBhcmFtZXRlciIsICJ0eXBlIG11c3QgYmUgYSB2YWxpZCBWa1BlcmZvcm1hbmNlVmFsdWVUeXBlSU5URUwgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQZXJmb3JtYW5jZVZhbHVlSU5URUwtdHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2UxNkJpdFN0b3JhZ2VGZWF0dXJlcy1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfOEJJVF9TVE9SQUdFX0ZFQVRVUkVTX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9BU1RDX0RFQ09ERV9GRUFUVVJFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUFTVENEZWNvZGVGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CTEVORF9PUEVSQVRJT05fQURWQU5DRURfUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19GRUFUVVJFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfRkVBVFVSRVNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1ELXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPSEVSRU5UX01FTU9SWV9GRUFUVVJFU19BTUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUNvaGVyZW50TWVtb3J5RmVhdHVyZXNBTUQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPTVBVVEVfU0hBREVSX0RFUklWQVRJVkVTX0ZFQVRVUkVTX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQ29uZGl0aW9uYWxSZW5kZXJpbmdGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09OU0VSVkFUSVZFX1JBU1RFUklaQVRJT05fUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0NPT1BFUkFUSVZFX01BVFJJWF9GRUFUVVJFU19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09PUEVSQVRJVkVfTUFUUklYX1BST1BFUlRJRVNfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9DT1JORVJfU0FNUExFRF9JTUFHRV9GRUFUVVJFU19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlQ29ybmVyU2FtcGxlZEltYWdlRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfQ09WRVJBR0VfUkVEVUNUSU9OX01PREVfRkVBVFVSRVNfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUNvdmVyYWdlUmVkdWN0aW9uTW9kZUZlYXR1cmVzTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRkVBVFVSRVNfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZURlZGljYXRlZEFsbG9jYXRpb25JbWFnZUFsaWFzaW5nRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZURlcHRoQ2xpcEVuYWJsZUZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0RFUFRIX0NMSVBfRU5BQkxFX0ZFQVRVUkVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRGVwdGhDbGlwRW5hYmxlRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfUFJPUEVSVElFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfREVTQ1JJUFRPUl9JTkRFWElOR19GRUFUVVJFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ERVNDUklQVE9SX0lOREVYSU5HX1BST1BFUlRJRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRElTQ0FSRF9SRUNUQU5HTEVfUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9EUklWRVJfUFJPUEVSVElFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZURyaXZlclByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWENMVVNJVkVfU0NJU1NPUl9GRUFUVVJFU19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0J1ZmZlckNyZWF0ZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8taGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfQlVGRkVSX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby11c2FnZS1wYXJhbWV0ZXIiLCAidXNhZ2UgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrQnVmZmVyVXNhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby11c2FnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlckluZm8tdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIiwgInVzYWdlIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mby11c2FnZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mby1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0ZFTkNFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8taGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiSWYgaGFuZGxlVHlwZSBpcyBub3QgMCwgaGFuZGxlVHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtFeHRlcm5hbE1lbW9yeUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8taGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9JTUFHRV9GT1JNQVRfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdEluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX01FTU9SWV9IT1NUX1BST1BFUlRJRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbE1lbW9yeUhvc3RQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mby1oYW5kbGVUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX1NFTUFQSE9SRV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkxPQVRfQ09OVFJPTFNfUFJPUEVSVElFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUZsb2F0Q29udHJvbHNQcm9wZXJ0aWVzS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnREZW5zaXR5TWFwRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudERlbnNpdHlNYXBGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRlJBR01FTlRfREVOU0lUWV9NQVBfUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfQkFSWUNFTlRSSUNfRkVBVFVSRVNfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GUkFHTUVOVF9TSEFERVJfSU5URVJMT0NLX0ZFQVRVUkVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9HUk9VUF9QUk9QRVJUSUVTIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSURQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lEX1BST1BFUlRJRVMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUlEUHJvcGVydGllcy1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFX0RSTV9GT1JNQVRfTU9ESUZJRVJfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQtc2hhcmluZ01vZGUtMDIzMTQiLCAiSWYgc2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHRoZW4gcFF1ZXVlRmFtaWx5SW5kaWNlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBxdWV1ZUZhbWlseUluZGV4Q291bnQgdWludDMyX3QgdmFsdWVzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQtc2hhcmluZ01vZGUtMDIzMTQpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVC1zaGFyaW5nTW9kZS0wMjMxNSIsICJJZiBzaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgdGhlbiBxdWV1ZUZhbWlseUluZGV4Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULXNoYXJpbmdNb2RlLTAyMzE1KSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQtc2hhcmluZ01vZGUtMDIzMTYiLCAiSWYgc2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIGVhY2ggZWxlbWVudCBvZiBwUXVldWVGYW1pbHlJbmRpY2VzIG11c3QgYmUgdW5pcXVlIGFuZCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMiBmb3IgdGhlIHBoeXNpY2FsRGV2aWNlIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGRldmljZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULXNoYXJpbmdNb2RlLTAyMzE2KSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VEcm1Gb3JtYXRNb2RpZmllckluZm9FWFQtc2hhcmluZ01vZGUtcGFyYW1ldGVyIiwgInNoYXJpbmdNb2RlIG11c3QgYmUgYSB2YWxpZCBWa1NoYXJpbmdNb2RlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZURybUZvcm1hdE1vZGlmaWVySW5mb0VYVC1zaGFyaW5nTW9kZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtJbWFnZUNyZWF0ZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLWZvcm1hdC1wYXJhbWV0ZXIiLCAiZm9ybWF0IG11c3QgYmUgYSB2YWxpZCBWa0Zvcm1hdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1mb3JtYXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1wTmV4dC1wTmV4dCIsICJFYWNoIHBOZXh0IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiwgVmtJbWFnZVN0ZW5jaWxVc2FnZUNyZWF0ZUluZm9FWFQsIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbywgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULCBvciBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9GT1JNQVRfSU5GT18yIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi1zVHlwZS11bmlxdWUiLCAiRWFjaCBzVHlwZSBtZW1iZXIgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgdW5pcXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXNUeXBlLXVuaXF1ZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlRm9ybWF0SW5mbzItdGlsaW5nLTAyMjQ5IiwgInRpbGluZyBtdXN0IGJlIFZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVCBpZiBhbmQgb25seSBpZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgVmtQaHlzaWNhbERldmljZUltYWdlRHJtRm9ybWF0TW9kaWZpZXJJbmZvRVhULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi10aWxpbmctMDIyNDkpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy0wMjMxMyIsICJJZiB0aWxpbmcgaXMgVktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUIGFuZCBmbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklULCB0aGVuIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIHdpdGggbm9uLXplcm8gdmlld0Zvcm1hdENvdW50LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi10aWxpbmctMDIzMTMpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy1wYXJhbWV0ZXIiLCAidGlsaW5nIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlVGlsaW5nIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1wYXJhbWV0ZXIiLCAidXNhZ2UgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrSW1hZ2VVc2FnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsICJ1c2FnZSBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yLXVzYWdlLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVC1pbWFnZVZpZXdUeXBlLXBhcmFtZXRlciIsICJpbWFnZVZpZXdUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlVmlld1R5cGUgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVC1pbWFnZVZpZXdUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUltYWdlVmlld0ltYWdlRm9ybWF0SW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9WSUVXX0lNQUdFX0ZPUk1BVF9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VWaWV3SW1hZ2VGb3JtYXRJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRkVBVFVSRVNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTkRFWF9UWVBFX1VJTlQ4X0ZFQVRVUkVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW5kZXhUeXBlVWludDhGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX0ZFQVRVUkVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lOTElORV9VTklGT1JNX0JMT0NLX1BST1BFUlRJRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9MSU5FX1JBU1RFUklaQVRJT05fRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0xJTkVfUkFTVEVSSVpBVElPTl9QUk9QRVJUSUVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZU1haW50ZW5hbmNlM1Byb3BlcnRpZXMtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNZW1vcnlCdWRnZXRQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9CVURHRVRfUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcmlvcml0eUZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUklPUklUWV9GRUFUVVJFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZU1lbW9yeVByaW9yaXR5RmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtQaHlzaWNhbERldmljZU1lbW9yeUJ1ZGdldFByb3BlcnRpZXNFWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfTUVNT1JZX1BST1BFUlRJRVNfMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NRVNIX1NIQURFUl9GRUFUVVJFU19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FU0hfU0hBREVSX1BST1BFUlRJRVNfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcy1tdWx0aXZpZXdHZW9tZXRyeVNoYWRlci0wMDU4MCIsICJJZiBtdWx0aXZpZXdHZW9tZXRyeVNoYWRlciBpcyBlbmFibGVkIHRoZW4gbXVsdGl2aWV3IG11c3QgYWxzbyBiZSBlbmFibGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3RmVhdHVyZXMtbXVsdGl2aWV3R2VvbWV0cnlTaGFkZXItMDA1ODApIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcy1tdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXItMDA1ODEiLCAiSWYgbXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyIGlzIGVuYWJsZWQgdGhlbiBtdWx0aXZpZXcgbXVzdCBhbHNvIGJlIGVuYWJsZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcy1tdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXItMDA1ODEpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdGZWF0dXJlcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9NVUxUSVZJRVdfRkVBVFVSRVMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZU11bHRpdmlld0ZlYXR1cmVzLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UGVyVmlld0F0dHJpYnV0ZXNQcm9wZXJ0aWVzTlZYLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QRVJfVklFV19BVFRSSUJVVEVTX1BST1BFUlRJRVNfTlZYIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01VTFRJVklFV19QUk9QRVJUSUVTIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUENJX0JVU19JTkZPX1BST1BFUlRJRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VQQ0lCdXNJbmZvUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QRVJGT1JNQU5DRV9RVUVSWV9GRUFUVVJFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BFUkZPUk1BTkNFX1FVRVJZX1BST1BFUlRJRVNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QSVBFTElORV9FWEVDVVRBQkxFX1BST1BFUlRJRVNfRkVBVFVSRVNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzRmVhdHVyZXNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QT0lOVF9DTElQUElOR19QUk9QRVJUSUVTIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VQb2ludENsaXBwaW5nUHJvcGVydGllcy1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLXBOZXh0LXBOZXh0IiwgIkVhY2ggcE5leHQgbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtQaHlzaWNhbERldmljZUJsZW5kT3BlcmF0aW9uQWR2YW5jZWRQcm9wZXJ0aWVzRVhULCBWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOViwgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSLCBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCwgVmtQaHlzaWNhbERldmljZURpc2NhcmRSZWN0YW5nbGVQcm9wZXJ0aWVzRVhULCBWa1BoeXNpY2FsRGV2aWNlRHJpdmVyUHJvcGVydGllc0tIUiwgVmtQaHlzaWNhbERldmljZUV4dGVybmFsTWVtb3J5SG9zdFByb3BlcnRpZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiwgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VJRFByb3BlcnRpZXMsIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhULCBWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25Qcm9wZXJ0aWVzRVhULCBWa1BoeXNpY2FsRGV2aWNlTWFpbnRlbmFuY2UzUHJvcGVydGllcywgVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlYsIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQZXJWaWV3QXR0cmlidXRlc1Byb3BlcnRpZXNOVlgsIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzLCBWa1BoeXNpY2FsRGV2aWNlUENJQnVzSW5mb1Byb3BlcnRpZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiwgVmtQaHlzaWNhbERldmljZVBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzLCBWa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcywgVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiwgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYsIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhULCBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlckZpbHRlck1pbm1heFByb3BlcnRpZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQsIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRCwgVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYsIFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WLCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzLCBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQsIFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFIsIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQsIG9yIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczItc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczItc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VQcm90ZWN0ZWRNZW1vcnlQcm9wZXJ0aWVzLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1BST1RFQ1RFRF9NRU1PUllfUFJPUEVSVElFUyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUHJvdGVjdGVkTWVtb3J5UHJvcGVydGllcy1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QVVNIX0RFU0NSSVBUT1JfUFJPUEVSVElFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUkFZX1RSQUNJTkdfUFJPUEVSVElFU19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0RmVhdHVyZXNOVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9SRVBSRVNFTlRBVElWRV9GUkFHTUVOVF9URVNUX0ZFQVRVUkVTX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VSZXByZXNlbnRhdGl2ZUZyYWdtZW50VGVzdEZlYXR1cmVzTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRV9MT0NBVElPTlNfUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTYW1wbGVyRmlsdGVyTWlubWF4UHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX0ZJTFRFUl9NSU5NQVhfUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVNhbXBsZXJGaWx0ZXJNaW5tYXhQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0ZFQVRVUkVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2NhbGFyQmxvY2tMYXlvdXRGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19GRUFUVVJFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0c0ZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQVRPTUlDX0lOVDY0X0ZFQVRVUkVTX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQXRvbWljSW50NjRGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlckNsb2NrRmVhdHVyZXNLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX0NMT0NLX0ZFQVRVUkVTX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ2xvY2tGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlckNvcmVQcm9wZXJ0aWVzMkFNRC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTXzJfQU1EIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllczJBTUQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJDb3JlUHJvcGVydGllc0FNRC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfQ09SRV9QUk9QRVJUSUVTX0FNRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyQ29yZVByb3BlcnRpZXNBTUQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfREVNT1RFX1RPX0hFTFBFUl9JTlZPQ0FUSU9OX0ZFQVRVUkVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEcmF3UGFyYW1ldGVyc0ZlYXR1cmVzLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRkVBVFVSRVMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlckRyYXdQYXJhbWV0ZXJzRmVhdHVyZXMtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9GTE9BVDE2X0lOVDhfRkVBVFVSRVNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJGbG9hdDE2SW50OEZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfRkVBVFVSRVNfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlckludGVnZXJGdW5jdGlvbnMyRmVhdHVyZXNJTlRFTC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfSU5URUdFUl9GVU5DVElPTlNfMl9GRUFUVVJFU19JTlRFTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVySW50ZWdlckZ1bmN0aW9uczJGZWF0dXJlc0lOVEVMLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGVyU01CdWlsdGluc0ZlYXR1cmVzTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX0ZFQVRVUkVTX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTTUJ1aWx0aW5zRmVhdHVyZXNOVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU0hBREVSX1NNX0JVSUxUSU5TX1BST1BFUlRJRVNfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRlclNNQnVpbHRpbnNQcm9wZXJ0aWVzTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TSEFERVJfU1VCR1JPVVBfRVhURU5ERURfVFlQRVNfRkVBVFVSRVNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXNGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VGZWF0dXJlc05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9GRUFUVVJFU19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NIQURJTkdfUkFURV9JTUFHRV9QUk9QRVJUSUVTX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi1mb3JtYXQtcGFyYW1ldGVyIiwgImZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItZm9ybWF0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TUEFSU0VfSU1BR0VfRk9STUFUX0lORk9fMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItc2FtcGxlcy0wMTA5NSIsICJzYW1wbGVzIG11c3QgYmUgYSBiaXQgdmFsdWUgdGhhdCBpcyBzZXQgaW4gVmtJbWFnZUZvcm1hdFByb3BlcnRpZXM6OnNhbXBsZUNvdW50cyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIHdpdGggZm9ybWF0LCB0eXBlLCB0aWxpbmcsIGFuZCB1c2FnZSBlcXVhbCB0byB0aG9zZSBpbiB0aGlzIGNvbW1hbmQgYW5kIGZsYWdzIGVxdWFsIHRvIHRoZSB2YWx1ZSB0aGF0IGlzIHNldCBpbiBWa0ltYWdlQ3JlYXRlSW5mbzo6ZmxhZ3Mgd2hlbiB0aGUgaW1hZ2UgaXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi1zYW1wbGVzLTAxMDk1KSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi1zYW1wbGVzLXBhcmFtZXRlciIsICJzYW1wbGVzIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0SW5mbzItc2FtcGxlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy1wYXJhbWV0ZXIiLCAidGlsaW5nIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlVGlsaW5nIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXRpbGluZy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1wYXJhbWV0ZXIiLCAidXNhZ2UgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrSW1hZ2VVc2FnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRJbmZvMi11c2FnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXVzYWdlLXJlcXVpcmVkYml0bWFzayIsICJ1c2FnZSBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yLXVzYWdlLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVUJHUk9VUF9QUk9QRVJUSUVTIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX0ZFQVRVUkVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbEZlYXR1cmVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBTaXplQ29udHJvbFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfU1VCR1JPVVBfU0laRV9DT05UUk9MX1BST1BFUlRJRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFNpemVDb250cm9sUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1wTmV4dC0wMjY3MiIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCBzdHJ1Y3R1cmUgd2l0aCBpdHMgZnVsbFNjcmVlbkV4Y2x1c2l2ZSBtZW1iZXIgc2V0IHRvIFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BUFBMSUNBVElPTl9DT05UUk9MTEVEX0VYVCwgYW5kIHN1cmZhY2Ugd2FzIGNyZWF0ZWQgdXNpbmcgdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIsIGEgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCBzdHJ1Y3R1cmUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1wTmV4dC0wMjY3MikifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1wTmV4dC1wTmV4dCIsICJFYWNoIHBOZXh0IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIG9yIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TVVJGQUNFX0lORk9fMl9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zVHlwZS11bmlxdWUiLCAiRWFjaCBzVHlwZSBtZW1iZXIgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgdW5pcXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFItc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwgInN1cmZhY2UgbXVzdCBiZSBhIHZhbGlkIFZrU3VyZmFjZUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUi1zdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9GRUFUVVJFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVEVYRUxfQlVGRkVSX0FMSUdOTUVOVF9QUk9QRVJUSUVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVGV4ZWxCdWZmZXJBbGlnbm1lbnRQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVGV4dHVyZUNvbXByZXNzaW9uQVNUQ0hEUkZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RFWFRVUkVfQ09NUFJFU1NJT05fQVNUQ19IRFJfRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VUZXh0dXJlQ29tcHJlc3Npb25BU1RDSERSRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RJTUVMSU5FX1NFTUFQSE9SRV9GRUFUVVJFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVElNRUxJTkVfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZVByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhULXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVE9PTF9QUk9QRVJUSUVTX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1RSQU5TRk9STV9GRUVEQkFDS19GRUFUVVJFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVFJBTlNGT1JNX0ZFRURCQUNLX1BST1BFUlRJRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRkVBVFVSRVNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WQVJJQUJMRV9QT0lOVEVSU19GRUFUVVJFUyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzLXZhcmlhYmxlUG9pbnRlcnMtMDE0MzEiLCAiSWYgdmFyaWFibGVQb2ludGVycyBpcyBlbmFibGVkIHRoZW4gdmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXIgbXVzdCBhbHNvIGJlIGVuYWJsZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VWYXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMtdmFyaWFibGVQb2ludGVycy0wMTQzMSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WVUxLQU5fTUVNT1JZX01PREVMX0ZFQVRVUkVTX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BoeXNpY2FsRGV2aWNlVnVsa2FuTWVtb3J5TW9kZWxGZWF0dXJlc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaHlzaWNhbERldmljZVljYmNySW1hZ2VBcnJheXNGZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9ZQ0JDUl9JTUFHRV9BUlJBWVNfRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGh5c2ljYWxEZXZpY2VZY2JjckltYWdlQXJyYXlzRmVhdHVyZXNFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8taW5pdGlhbERhdGFTaXplLTAwNzY4IiwgIklmIGluaXRpYWxEYXRhU2l6ZSBpcyBub3QgMCwgaXQgbXVzdCBiZSBlcXVhbCB0byB0aGUgc2l6ZSBvZiBwSW5pdGlhbERhdGEsIGFzIHJldHVybmVkIGJ5IHZrR2V0UGlwZWxpbmVDYWNoZURhdGEgd2hlbiBwSW5pdGlhbERhdGEgd2FzIG9yaWdpbmFsbHkgcmV0cmlldmVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8taW5pdGlhbERhdGFTaXplLTAwNzY4KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvLWluaXRpYWxEYXRhU2l6ZS0wMDc2OSIsICJJZiBpbml0aWFsRGF0YVNpemUgaXMgbm90IDAsIHBJbml0aWFsRGF0YSBtdXN0IGhhdmUgYmVlbiByZXRyaWV2ZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gdmtHZXRQaXBlbGluZUNhY2hlRGF0YSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvLWluaXRpYWxEYXRhU2l6ZS0wMDc2OSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mby1wSW5pdGlhbERhdGEtcGFyYW1ldGVyIiwgIklmIGluaXRpYWxEYXRhU2l6ZSBpcyBub3QgMCwgcEluaXRpYWxEYXRhIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGluaXRpYWxEYXRhU2l6ZSBieXRlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvLXBJbml0aWFsRGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhULWJsZW5kT3ZlcmxhcC0wMTQyNiIsICJJZiB0aGUgY29ycmVsYXRlZCBvdmVybGFwIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQsIGJsZW5kT3ZlcmxhcCBtdXN0IGJlIFZLX0JMRU5EX09WRVJMQVBfVU5DT1JSRUxBVEVEX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhULWJsZW5kT3ZlcmxhcC0wMTQyNikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVC1ibGVuZE92ZXJsYXAtcGFyYW1ldGVyIiwgImJsZW5kT3ZlcmxhcCBtdXN0IGJlIGEgdmFsaWQgVmtCbGVuZE92ZXJsYXBFWFQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVC1ibGVuZE92ZXJsYXAtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhULWRzdFByZW11bHRpcGxpZWQtMDE0MjUiLCAiSWYgdGhlIG5vbi1wcmVtdWx0aXBsaWVkIGRlc3RpbmF0aW9uIGNvbG9yIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQsIGRzdFByZW11bHRpcGxpZWQgbXVzdCBiZSBWS19UUlVFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQtZHN0UHJlbXVsdGlwbGllZC0wMTQyNSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBZHZhbmNlZFN0YXRlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX0FEVkFOQ0VEX1NUQVRFX0NSRUFURV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhULXNyY1ByZW11bHRpcGxpZWQtMDE0MjQiLCAiSWYgdGhlIG5vbi1wcmVtdWx0aXBsaWVkIHNvdXJjZSBjb2xvciBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLCBzcmNQcmVtdWx0aXBsaWVkIG11c3QgYmUgVktfVFJVRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhULXNyY1ByZW11bHRpcGxpZWQtMDE0MjQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zLTAxNDA5IiwgIklmIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVDo6YWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnMgaXMgVktfRkFMU0UsIHRoZW4gY29sb3JCbGVuZE9wIG11c3Qgbm90IGJlIFZLX0JMRU5EX09QX1pFUk9fRVhULCBWS19CTEVORF9PUF9TUkNfRVhULCBWS19CTEVORF9PUF9EU1RfRVhULCBWS19CTEVORF9PUF9TUkNfT1ZFUl9FWFQsIFZLX0JMRU5EX09QX0RTVF9PVkVSX0VYVCwgVktfQkxFTkRfT1BfU1JDX0lOX0VYVCwgVktfQkxFTkRfT1BfRFNUX0lOX0VYVCwgVktfQkxFTkRfT1BfU1JDX09VVF9FWFQsIFZLX0JMRU5EX09QX0RTVF9PVVRfRVhULCBWS19CTEVORF9PUF9TUkNfQVRPUF9FWFQsIFZLX0JMRU5EX09QX0RTVF9BVE9QX0VYVCwgVktfQkxFTkRfT1BfWE9SX0VYVCwgVktfQkxFTkRfT1BfSU5WRVJUX0VYVCwgVktfQkxFTkRfT1BfSU5WRVJUX1JHQl9FWFQsIFZLX0JMRU5EX09QX0xJTkVBUkRPREdFX0VYVCwgVktfQkxFTkRfT1BfTElORUFSQlVSTl9FWFQsIFZLX0JMRU5EX09QX1ZJVklETElHSFRfRVhULCBWS19CTEVORF9PUF9MSU5FQVJMSUdIVF9FWFQsIFZLX0JMRU5EX09QX1BJTkxJR0hUX0VYVCwgVktfQkxFTkRfT1BfSEFSRE1JWF9FWFQsIFZLX0JMRU5EX09QX1BMVVNfRVhULCBWS19CTEVORF9PUF9QTFVTX0NMQU1QRURfRVhULCBWS19CTEVORF9PUF9QTFVTX0NMQU1QRURfQUxQSEFfRVhULCBWS19CTEVORF9PUF9QTFVTX0RBUktFUl9FWFQsIFZLX0JMRU5EX09QX01JTlVTX0VYVCwgVktfQkxFTkRfT1BfTUlOVVNfQ0xBTVBFRF9FWFQsIFZLX0JMRU5EX09QX0NPTlRSQVNUX0VYVCwgVktfQkxFTkRfT1BfSU5WRVJUX09WR19FWFQsIFZLX0JMRU5EX09QX1JFRF9FWFQsIFZLX0JMRU5EX09QX0dSRUVOX0VYVCwgb3IgVktfQkxFTkRfT1BfQkxVRV9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtYWR2YW5jZWRCbGVuZEFsbE9wZXJhdGlvbnMtMDE0MDkpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWFkdmFuY2VkQmxlbmRJbmRlcGVuZGVudEJsZW5kLTAxNDA3IiwgIklmIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVDo6YWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQgaXMgVktfRkFMU0UgYW5kIGNvbG9yQmxlbmRPcCBpcyBhbiBhZHZhbmNlZCBibGVuZCBvcGVyYXRpb24sIHRoZW4gY29sb3JCbGVuZE9wIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBhdHRhY2htZW50cy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQtMDE0MDcpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWFkdmFuY2VkQmxlbmRJbmRlcGVuZGVudEJsZW5kLTAxNDA4IiwgIklmIFZrUGh5c2ljYWxEZXZpY2VCbGVuZE9wZXJhdGlvbkFkdmFuY2VkUHJvcGVydGllc0VYVDo6YWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQgaXMgVktfRkFMU0UgYW5kIGFscGhhQmxlbmRPcCBpcyBhbiBhZHZhbmNlZCBibGVuZCBvcGVyYXRpb24sIHRoZW4gYWxwaGFCbGVuZE9wIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBhdHRhY2htZW50cy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQtMDE0MDgpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWFscGhhQmxlbmRPcC1wYXJhbWV0ZXIiLCAiYWxwaGFCbGVuZE9wIG11c3QgYmUgYSB2YWxpZCBWa0JsZW5kT3AgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtYWxwaGFCbGVuZE9wLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtY29sb3JCbGVuZE9wLTAxNDA2IiwgIklmIGVpdGhlciBvZiBjb2xvckJsZW5kT3Agb3IgYWxwaGFCbGVuZE9wIGlzIGFuIGFkdmFuY2VkIGJsZW5kIG9wZXJhdGlvbiwgdGhlbiBjb2xvckJsZW5kT3AgbXVzdCBlcXVhbCBhbHBoYUJsZW5kT3AgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtY29sb3JCbGVuZE9wLTAxNDA2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1jb2xvckJsZW5kT3AtMDE0MTAiLCAiSWYgY29sb3JCbGVuZE9wIG9yIGFscGhhQmxlbmRPcCBpcyBhbiBhZHZhbmNlZCBibGVuZCBvcGVyYXRpb24sIHRoZW4gVmtTdWJwYXNzRGVzY3JpcHRpb246OmNvbG9yQXR0YWNobWVudENvdW50IG9mIHRoZSBzdWJwYXNzIHRoaXMgcGlwZWxpbmUgaXMgY29tcGlsZWQgYWdhaW5zdCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlQmxlbmRPcGVyYXRpb25BZHZhbmNlZFByb3BlcnRpZXNFWFQ6OmFkdmFuY2VkQmxlbmRNYXhDb2xvckF0dGFjaG1lbnRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWNvbG9yQmxlbmRPcC0wMTQxMCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtY29sb3JCbGVuZE9wLXBhcmFtZXRlciIsICJjb2xvckJsZW5kT3AgbXVzdCBiZSBhIHZhbGlkIFZrQmxlbmRPcCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1jb2xvckJsZW5kT3AtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1jb2xvcldyaXRlTWFzay1wYXJhbWV0ZXIiLCAiY29sb3JXcml0ZU1hc2sgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrQ29sb3JDb21wb25lbnRGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtY29sb3JXcml0ZU1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1kc3RBbHBoYUJsZW5kRmFjdG9yLTAwNjExIiwgIklmIHRoZSBkdWFsIHNvdXJjZSBibGVuZGluZyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBkc3RBbHBoYUJsZW5kRmFjdG9yIG11c3Qgbm90IGJlIFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0NPTE9SLCBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQ09MT1IsIFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0FMUEhBLCBvciBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQUxQSEEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtZHN0QWxwaGFCbGVuZEZhY3Rvci0wMDYxMSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtZHN0QWxwaGFCbGVuZEZhY3Rvci1wYXJhbWV0ZXIiLCAiZHN0QWxwaGFCbGVuZEZhY3RvciBtdXN0IGJlIGEgdmFsaWQgVmtCbGVuZEZhY3RvciB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1kc3RBbHBoYUJsZW5kRmFjdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtZHN0Q29sb3JCbGVuZEZhY3Rvci0wMDYwOSIsICJJZiB0aGUgZHVhbCBzb3VyY2UgYmxlbmRpbmcgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0Q29sb3JCbGVuZEZhY3RvciBtdXN0IG5vdCBiZSBWS19CTEVORF9GQUNUT1JfU1JDMV9DT0xPUiwgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0NPTE9SLCBWS19CTEVORF9GQUNUT1JfU1JDMV9BTFBIQSwgb3IgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0FMUEhBIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWRzdENvbG9yQmxlbmRGYWN0b3ItMDA2MDkpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWRzdENvbG9yQmxlbmRGYWN0b3ItcGFyYW1ldGVyIiwgImRzdENvbG9yQmxlbmRGYWN0b3IgbXVzdCBiZSBhIHZhbGlkIFZrQmxlbmRGYWN0b3IgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtZHN0Q29sb3JCbGVuZEZhY3Rvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLXNyY0FscGhhQmxlbmRGYWN0b3ItMDA2MTAiLCAiSWYgdGhlIGR1YWwgc291cmNlIGJsZW5kaW5nIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNyY0FscGhhQmxlbmRGYWN0b3IgbXVzdCBub3QgYmUgVktfQkxFTkRfRkFDVE9SX1NSQzFfQ09MT1IsIFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9DT0xPUiwgVktfQkxFTkRfRkFDVE9SX1NSQzFfQUxQSEEsIG9yIFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9BTFBIQSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1zcmNBbHBoYUJsZW5kRmFjdG9yLTAwNjEwKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1zcmNBbHBoYUJsZW5kRmFjdG9yLXBhcmFtZXRlciIsICJzcmNBbHBoYUJsZW5kRmFjdG9yIG11c3QgYmUgYSB2YWxpZCBWa0JsZW5kRmFjdG9yIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLXNyY0FscGhhQmxlbmRGYWN0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1zcmNDb2xvckJsZW5kRmFjdG9yLTAwNjA4IiwgIklmIHRoZSBkdWFsIHNvdXJjZSBibGVuZGluZyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBzcmNDb2xvckJsZW5kRmFjdG9yIG11c3Qgbm90IGJlIFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0NPTE9SLCBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQ09MT1IsIFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0FMUEhBLCBvciBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQUxQSEEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtc3JjQ29sb3JCbGVuZEZhY3Rvci0wMDYwOCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtc3JjQ29sb3JCbGVuZEZhY3Rvci1wYXJhbWV0ZXIiLCAic3JjQ29sb3JCbGVuZEZhY3RvciBtdXN0IGJlIGEgdmFsaWQgVmtCbGVuZEZhY3RvciB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1zcmNDb2xvckJsZW5kRmFjdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1sb2dpY09wRW5hYmxlLTAwNjA2IiwgIklmIHRoZSBsb2dpYyBvcGVyYXRpb25zIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGxvZ2ljT3BFbmFibGUgbXVzdCBiZSBWS19GQUxTRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1sb2dpY09wRW5hYmxlLTAwNjA2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1sb2dpY09wRW5hYmxlLTAwNjA3IiwgIklmIGxvZ2ljT3BFbmFibGUgaXMgVktfVFJVRSwgbG9naWNPcCBtdXN0IGJlIGEgdmFsaWQgVmtMb2dpY09wIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLWxvZ2ljT3BFbmFibGUtMDA2MDcpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDYwNSIsICJJZiB0aGUgaW5kZXBlbmRlbnQgYmxlbmRpbmcgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYWxsIGVsZW1lbnRzIG9mIHBBdHRhY2htZW50cyBtdXN0IGJlIGlkZW50aWNhbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA2MDUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLXBBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgYXR0YWNobWVudENvdW50IGlzIG5vdCAwLCBwQXR0YWNobWVudHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYXR0YWNobWVudENvdW50IHZhbGlkIFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrUGlwZWxpbmVDb2xvckJsZW5kQWR2YW5jZWRTdGF0ZUNyZWF0ZUluZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfU1RBVEVfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb21waWxlckNvbnRyb2xDcmVhdGVJbmZvQU1ELWNvbXBpbGVyQ29udHJvbEZsYWdzLXplcm9iaXRtYXNrIiwgImNvbXBpbGVyQ29udHJvbEZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRC1jb21waWxlckNvbnRyb2xGbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvbXBpbGVyQ29udHJvbENyZWF0ZUluZm9BTUQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT01QSUxFUl9DT05UUk9MX0NSRUFURV9JTkZPX0FNRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ29tcGlsZXJDb250cm9sQ3JlYXRlSW5mb0FNRC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WLWNvdmVyYWdlTW9kdWxhdGlvbk1vZGUtcGFyYW1ldGVyIiwgImNvdmVyYWdlTW9kdWxhdGlvbk1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrQ292ZXJhZ2VNb2R1bGF0aW9uTW9kZU5WIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVi1jb3ZlcmFnZU1vZHVsYXRpb25Nb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WLWNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlLTAxNDA1IiwgIklmIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlRW5hYmxlIGlzIFZLX1RSVUUsIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnQgbXVzdCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHJhc3Rlcml6YXRpb24gc2FtcGxlcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgY29sb3Igc2FtcGxlcyBpbiB0aGUgc3VicGFzcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYtY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGUtMDE0MDUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVi1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9NT0RVTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYtY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlLXBhcmFtZXRlciIsICJjb3ZlcmFnZVJlZHVjdGlvbk1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrQ292ZXJhZ2VSZWR1Y3Rpb25Nb2RlTlYgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYtY292ZXJhZ2VSZWR1Y3Rpb25Nb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvdmVyYWdlUmVkdWN0aW9uU3RhdGVDcmVhdGVJbmZvTlYtZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1JFRFVDVElPTl9TVEFURV9DUkVBVEVfSU5GT19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VSZWR1Y3Rpb25TdGF0ZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WLWNvdmVyYWdlVG9Db2xvckVuYWJsZS0wMTQwNCIsICJJZiBjb3ZlcmFnZVRvQ29sb3JFbmFibGUgaXMgVktfVFJVRSwgdGhlbiB0aGUgcmVuZGVyIHBhc3Mgc3VicGFzcyBpbmRpY2F0ZWQgYnkgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzo6cmVuZGVyUGFzcyBhbmQgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzo6c3VicGFzcyBtdXN0IGhhdmUgYSBjb2xvciBhdHRhY2htZW50IGF0IHRoZSBsb2NhdGlvbiBzZWxlY3RlZCBieSBjb3ZlcmFnZVRvQ29sb3JMb2NhdGlvbiwgd2l0aCBhIFZrRm9ybWF0IG9mIFZLX0ZPUk1BVF9SOF9VSU5ULCBWS19GT1JNQVRfUjhfU0lOVCwgVktfRk9STUFUX1IxNl9VSU5ULCBWS19GT1JNQVRfUjE2X1NJTlQsIFZLX0ZPUk1BVF9SMzJfVUlOVCwgb3IgVktfRk9STUFUX1IzMl9TSU5UIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVi1jb3ZlcmFnZVRvQ29sb3JFbmFibGUtMDE0MDQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVi1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNvdmVyYWdlVG9Db2xvclN0YXRlQ3JlYXRlSW5mb05WLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT1ZFUkFHRV9UT19DT0xPUl9TVEFURV9DUkVBVEVfSU5GT19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrLXBhcmFtZXRlciIsICJwUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MtcGFyYW1ldGVyIiwgInBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1wUGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQtMDI2NjgiLCAiV2hlbiBjaGFpbmVkIHRvIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8sIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUOjpwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50IG11c3QgZXF1YWwgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzo6c3RhZ2VDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQtcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudC0wMjY2OCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQtMDI2NjkiLCAiV2hlbiBjaGFpbmVkIHRvIFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbywgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQ6OnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQgbXVzdCBlcXVhbCAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50LTAyNjY5KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQtcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudC0wMjY3MCIsICJXaGVuIGNoYWluZWQgdG8gVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYsIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUOjpwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50IG11c3QgZXF1YWwgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY6OnN0YWdlQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQtMDI2NzApIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50LWFycmF5bGVuZ3RoIiwgInBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQtcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mby1iYWNrLXBhcmFtZXRlciIsICJiYWNrIG11c3QgYmUgYSB2YWxpZCBWa1N0ZW5jaWxPcFN0YXRlIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWJhY2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWRlcHRoQm91bmRzVGVzdEVuYWJsZS0wMDU5OCIsICJJZiB0aGUgZGVwdGggYm91bmRzIHRlc3RpbmcgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZGVwdGhCb3VuZHNUZXN0RW5hYmxlIG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mby1kZXB0aEJvdW5kc1Rlc3RFbmFibGUtMDA1OTgpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8tZGVwdGhDb21wYXJlT3AtcGFyYW1ldGVyIiwgImRlcHRoQ29tcGFyZU9wIG11c3QgYmUgYSB2YWxpZCBWa0NvbXBhcmVPcCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWRlcHRoQ29tcGFyZU9wLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mby1mcm9udC1wYXJhbWV0ZXIiLCAiZnJvbnQgbXVzdCBiZSBhIHZhbGlkIFZrU3RlbmNpbE9wU3RhdGUgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8tZnJvbnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfREVQVEhfU1RFTkNJTF9TVEFURV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVC1kaXNjYXJkUmVjdGFuZ2xlQ291bnQtMDA1ODIiLCAiZGlzY2FyZFJlY3RhbmdsZUNvdW50IG11c3QgYmUgYmV0d2VlbiAwIGFuZCBWa1BoeXNpY2FsRGV2aWNlRGlzY2FyZFJlY3RhbmdsZVByb3BlcnRpZXNFWFQ6Om1heERpc2NhcmRSZWN0YW5nbGVzLCBpbmNsdXNpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQtZGlzY2FyZFJlY3RhbmdsZUNvdW50LTAwNTgyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVC1kaXNjYXJkUmVjdGFuZ2xlTW9kZS1wYXJhbWV0ZXIiLCAiZGlzY2FyZFJlY3RhbmdsZU1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrRGlzY2FyZFJlY3RhbmdsZU1vZGVFWFQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQtZGlzY2FyZFJlY3RhbmdsZU1vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRGlzY2FyZFJlY3RhbmdsZVN0YXRlQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZURpc2NhcmRSZWN0YW5nbGVTdGF0ZUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRElTQ0FSRF9SRUNUQU5HTEVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVEaXNjYXJkUmVjdGFuZ2xlU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAxNDQyIiwgIkVhY2ggZWxlbWVudCBvZiBwRHluYW1pY1N0YXRlcyBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMTQ0MikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtcGFyYW1ldGVyIiwgIklmIGR5bmFtaWNTdGF0ZUNvdW50IGlzIG5vdCAwLCBwRHluYW1pY1N0YXRlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkeW5hbWljU3RhdGVDb3VudCB2YWxpZCBWa0R5bmFtaWNTdGF0ZSB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRFlOQU1JQ19TVEFURV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLWV4ZWN1dGFibGVJbmRleC0wMzI3NSIsICJleGVjdXRhYmxlSW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBleGVjdXRhYmxlcyBhc3NvY2lhdGVkIHdpdGggcGlwZWxpbmUgYXMgcmV0dXJuZWQgaW4gdGhlIHBFeGVjdXRhYmxlQ291bnQgcGFyYW1ldGVyIG9mIHZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUi4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLWV4ZWN1dGFibGVJbmRleC0wMzI3NSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUi1waXBlbGluZS1wYXJhbWV0ZXIiLCAicGlwZWxpbmUgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUi1waXBlbGluZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0VYRUNVVEFCTEVfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9JTlRFUk5BTF9SRVBSRVNFTlRBVElPTl9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRVhFQ1VUQUJMRV9QUk9QRVJUSUVTX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9FWEVDVVRBQkxFX1NUQVRJU1RJQ19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUluZm9LSFItcGlwZWxpbmUtcGFyYW1ldGVyIiwgInBpcGVsaW5lIG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lSW5mb0tIUi1waXBlbGluZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQyOCIsICJJZiB0b3BvbG9neSBpcyBWS19QUklNSVRJVkVfVE9QT0xPR1lfUE9JTlRfTElTVCwgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVCwgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1QsIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9MSU5FX0xJU1RfV0lUSF9BREpBQ0VOQ1ksIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZIG9yIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNULCBwcmltaXRpdmVSZXN0YXJ0RW5hYmxlIG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA0MjgpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXRvcG9sb2d5LTAwNDI5IiwgIklmIHRoZSBnZW9tZXRyeSBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHRvcG9sb2d5IG11c3Qgbm90IGJlIGFueSBvZiBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9MSVNUX1dJVEhfQURKQUNFTkNZLCBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUF9XSVRIX0FESkFDRU5DWSwgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1RfV0lUSF9BREpBQ0VOQ1kgb3IgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQX1dJVEhfQURKQUNFTkNZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXRvcG9sb2d5LTAwNDI5KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQzMCIsICJJZiB0aGUgdGVzc2VsbGF0aW9uIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgdG9wb2xvZ3kgbXVzdCBub3QgYmUgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA0MzApIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXRvcG9sb2d5LXBhcmFtZXRlciIsICJ0b3BvbG9neSBtdXN0IGJlIGEgdmFsaWQgVmtQcmltaXRpdmVUb3BvbG9neSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjEyIiwgIlRoZSB0b3RhbCBudW1iZXIgb2YgYmluZGluZ3Mgd2l0aCBhIGRlc2NyaXB0b3JUeXBlIG9mIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ6Om1heFBlclN0YWdlRGVzY3JpcHRvcklubGluZVVuaWZvcm1CbG9ja3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDIyMTIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjEzIiwgIlRoZSB0b3RhbCBudW1iZXIgb2YgYmluZGluZ3Mgd2l0aCBhIGRlc2NyaXB0b3JUeXBlIG9mIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ6Om1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjEzKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjIxNCIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGJpbmRpbmdzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBiaXQgc2V0IHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUOjptYXhQZXJTdGFnZURlc2NyaXB0b3JJbmxpbmVVbmlmb3JtQmxvY2tzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjE0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjIxNSIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGJpbmRpbmdzIHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUOjptYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRJbmxpbmVVbmlmb3JtQmxvY2tzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjE1KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjIxNiIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGJpbmRpbmdzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBiaXQgc2V0IHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tQcm9wZXJ0aWVzRVhUOjptYXhEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjIxNikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDIyMTciLCAiVGhlIHRvdGFsIG51bWJlciBvZiBiaW5kaW5ncyB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVCBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVDo6bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElubGluZVVuaWZvcm1CbG9ja3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDIyMTcpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMzgxIiwgIlRoZSB0b3RhbCBudW1iZXIgb2YgYmluZGluZ3Mgd2l0aCBhIGRlc2NyaXB0b3JUeXBlIG9mIFZLX0RFU0NSSVBUT1JfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjptYXhEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjM4MSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMTYiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSIGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDE2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAxNyIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBiaXQgc2V0IHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDIGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDE3KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAxOCIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBiaXQgc2V0IHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDIGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VCdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDE4KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAxOSIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBiaXQgc2V0IHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UsIGFuZCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIgYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAxOSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjAiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UsIGFuZCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVIgYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUltYWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyMCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjEiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQgYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5wdXRBdHRhY2htZW50cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyMSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjIiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSIGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUOjptYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTYW1wbGVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyMikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjMiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSIGFuZCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyBhY2Nlc3NpYmxlIHRvIGFueSBnaXZlbiBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDo6bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kVW5pZm9ybUJ1ZmZlcnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjMpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDI0IiwgIlRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgd2l0aCBhIGRlc2NyaXB0b3JUeXBlIG9mIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiBhbmQgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMgYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6Om1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDI0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyNSIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UsIGFuZCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIgYWNjZXNzaWJsZSB0byBhbnkgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6Om1heFBlclN0YWdlRGVzY3JpcHRvclVwZGF0ZUFmdGVyQmluZFNhbXBsZWRJbWFnZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDI2IiwgIlRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgd2l0aCBhIGRlc2NyaXB0b3JUeXBlIG9mIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFLCBhbmQgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSIGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUOjptYXhQZXJTdGFnZURlc2NyaXB0b3JVcGRhdGVBZnRlckJpbmRTdG9yYWdlSW1hZ2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDI2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyNyIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVCBhY2Nlc3NpYmxlIHRvIGFueSBnaXZlbiBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDo6bWF4UGVyU3RhZ2VEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kSW5wdXRBdHRhY2htZW50cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyNykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjgiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heERlc2NyaXB0b3JTZXRTYW1wbGVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyOCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMjkiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAyOSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzAiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzRHluYW1pYyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAzMCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzEiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAzMSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzIiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAzMikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzMiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFLCBhbmQgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAzMDMzKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAzNCIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGRlc2NyaXB0b3Igc2V0IGxheW91dHMgY3JlYXRlZCB3aXRob3V0IHRoZSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVCBiaXQgc2V0IHdpdGggYSBkZXNjcmlwdG9yVHlwZSBvZiBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSwgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMzAzNCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzUiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIGNyZWF0ZWQgd2l0aG91dCB0aGUgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQgYml0IHNldCB3aXRoIGEgZGVzY3JpcHRvclR5cGUgb2YgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDMwMzUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wUHVzaENvbnN0YW50UmFuZ2VzLTAwMjkyIiwgIkFueSB0d28gZWxlbWVudHMgb2YgcFB1c2hDb25zdGFudFJhbmdlcyBtdXN0IG5vdCBpbmNsdWRlIHRoZSBzYW1lIHN0YWdlIGluIHN0YWdlRmxhZ3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFB1c2hDb25zdGFudFJhbmdlcy0wMDI5MikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFB1c2hDb25zdGFudFJhbmdlcy1wYXJhbWV0ZXIiLCAiSWYgcHVzaENvbnN0YW50UmFuZ2VDb3VudCBpcyBub3QgMCwgcFB1c2hDb25zdGFudFJhbmdlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwdXNoQ29uc3RhbnRSYW5nZUNvdW50IHZhbGlkIFZrUHVzaENvbnN0YW50UmFuZ2Ugc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wUHVzaENvbnN0YW50UmFuZ2VzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyODciLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiBhbmQgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIgYWNjZXNzaWJsZSB0byBhbnkgc2hhZGVyIHN0YWdlIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyODcpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjg4IiwgIlRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgb2YgdGhlIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSIGFuZCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyBhY2Nlc3NpYmxlIHRvIGFueSBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI4OCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyODkiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDIGFjY2Vzc2libGUgdG8gYW55IHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VCdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjg5KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI5MCIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSwgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUiBhY2Nlc3NpYmxlIHRvIGFueSBzaGFkZXIgc3RhZ2UgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVkSW1hZ2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjkwKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI5MSIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFLCBhbmQgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSIGFjY2Vzc2libGUgdG8gYW55IHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyOTEpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjkzIiwgInBTZXRMYXlvdXRzIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBkZXNjcmlwdG9yIHNldCBsYXlvdXQgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjkzKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3NiIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UIGFjY2Vzc2libGUgdG8gYW55IGdpdmVuIHNoYWRlciBzdGFnZSBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzYpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjc3IiwgIlRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgb2YgdGhlIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heERlc2NyaXB0b3JTZXRTYW1wbGVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3NykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzgiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjc4KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3OSIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzkpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjgwIiwgIlRoZSB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgb2YgdGhlIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODEiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQyBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjgxKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MiIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSwgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODMiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSwgYW5kIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODQiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVCBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4NCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwMzYiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiBhbmQgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6Om1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzAzNikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwMzciLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6Om1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRVbmlmb3JtQnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzAzNykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwMzgiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDo6bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFVuaWZvcm1CdWZmZXJzRHluYW1pYyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzAzOCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwMzkiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6Om1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTdG9yYWdlQnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzAzOSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDAiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQyBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDo6bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZFN0b3JhZ2VCdWZmZXJzRHluYW1pYyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzA0MCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDEiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UsIGFuZCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIgYWNjZXNzaWJsZSBhY3Jvc3MgYWxsIHNoYWRlciBzdGFnZXMgYW5kIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgcFNldExheW91dHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ1Byb3BlcnRpZXNFWFQ6Om1heERlc2NyaXB0b3JTZXRVcGRhdGVBZnRlckJpbmRTYW1wbGVkSW1hZ2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAzMDQxKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzA0MiIsICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG9mIHRoZSB0eXBlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFLCBhbmQgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSIGFjY2Vzc2libGUgYWNyb3NzIGFsbCBzaGFkZXIgc3RhZ2VzIGFuZCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIHBTZXRMYXlvdXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdQcm9wZXJ0aWVzRVhUOjptYXhEZXNjcmlwdG9yU2V0VXBkYXRlQWZ0ZXJCaW5kU3RvcmFnZUltYWdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMzA0MikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDMiLCAiVGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVCBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgc2hhZGVyIHN0YWdlcyBhbmQgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBwU2V0TGF5b3V0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVDo6bWF4RGVzY3JpcHRvclNldFVwZGF0ZUFmdGVyQmluZElucHV0QXR0YWNobWVudHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDMwNDMpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLXBhcmFtZXRlciIsICJJZiBzZXRMYXlvdXRDb3VudCBpcyBub3QgMCwgcFNldExheW91dHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc2V0TGF5b3V0Q291bnQgdmFsaWQgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tc2V0TGF5b3V0Q291bnQtMDAyODYiLCAic2V0TGF5b3V0Q291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Qm91bmREZXNjcmlwdG9yU2V0cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1zZXRMYXlvdXRDb3VudC0wMDI4NikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLWFscGhhVG9PbmVFbmFibGUtMDA3ODUiLCAiSWYgdGhlIGFscGhhIHRvIG9uZSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbHBoYVRvT25lRW5hYmxlIG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLWFscGhhVG9PbmVFbmFibGUtMDA3ODUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tbWluU2FtcGxlU2hhZGluZy0wMDc4NiIsICJtaW5TYW1wbGVTaGFkaW5nIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDFdIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1taW5TYW1wbGVTaGFkaW5nLTAwNzg2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYsIFZrUGlwZWxpbmVDb3ZlcmFnZVJlZHVjdGlvblN0YXRlQ3JlYXRlSW5mb05WLCBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYsIG9yIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tcFNhbXBsZU1hc2stcGFyYW1ldGVyIiwgIklmIHBTYW1wbGVNYXNrIGlzIG5vdCBOVUxMLCBwU2FtcGxlTWFzayBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiAocmFzdGVyaXphdGlvblNhbXBsZXMvMzIpIFZrU2FtcGxlTWFzayB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXBTYW1wbGVNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXJhc3Rlcml6YXRpb25TYW1wbGVzLTAxNDE1IiwgIklmIHRoZSBWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzIGV4dGVuc2lvbiBpcyBlbmFibGVkLCBhbmQgaWYgdGhlIHN1YnBhc3MgaGFzIGFueSBjb2xvciBhdHRhY2htZW50cyBhbmQgcmFzdGVyaXphdGlvblNhbXBsZXMgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY29sb3Igc2FtcGxlcywgdGhlbiBzYW1wbGVTaGFkaW5nRW5hYmxlIG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXJhc3Rlcml6YXRpb25TYW1wbGVzLTAxNDE1KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tcmFzdGVyaXphdGlvblNhbXBsZXMtcGFyYW1ldGVyIiwgInJhc3Rlcml6YXRpb25TYW1wbGVzIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXJhc3Rlcml6YXRpb25TYW1wbGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTVVMVElTQU1QTEVfU1RBVEVfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tc2FtcGxlU2hhZGluZ0VuYWJsZS0wMDc4NCIsICJJZiB0aGUgc2FtcGxlIHJhdGUgc2hhZGluZyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBzYW1wbGVTaGFkaW5nRW5hYmxlIG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXNhbXBsZVNoYWRpbmdFbmFibGUtMDA3ODQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhULWNvbnNlcnZhdGl2ZVJhc3Rlcml6YXRpb25Nb2RlLXBhcmFtZXRlciIsICJjb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZSBtdXN0IGJlIGEgdmFsaWQgVmtDb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZUVYVCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVC1jb25zZXJ2YXRpdmVSYXN0ZXJpemF0aW9uTW9kZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhULWV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplLTAxNzY5IiwgImV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplIG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIDAuMCB0byBWa1BoeXNpY2FsRGV2aWNlQ29uc2VydmF0aXZlUmFzdGVyaXphdGlvblByb3BlcnRpZXNFWFQ6Om1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplIGluY2x1c2l2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVC1leHRyYVByaW1pdGl2ZU92ZXJlc3RpbWF0aW9uU2l6ZS0wMTc2OSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uQ29uc2VydmF0aXZlU3RhdGVDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fQ09OU0VSVkFUSVZFX1NUQVRFX0NSRUFURV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkNvbnNlcnZhdGl2ZVN0YXRlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkRlcHRoQ2xpcFN0YXRlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fREVQVEhfQ0xJUF9TVEFURV9DUkVBVEVfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25EZXB0aENsaXBTdGF0ZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1saW5lUmFzdGVyaXphdGlvbk1vZGUtMDI3NjgiLCAiSWYgbGluZVJhc3Rlcml6YXRpb25Nb2RlIGlzIFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX0VYVCwgdGhlbiB0aGUgcmVjdGFuZ3VsYXJMaW5lcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzY4KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzY5IiwgIklmIGxpbmVSYXN0ZXJpemF0aW9uTW9kZSBpcyBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CUkVTRU5IQU1fRVhULCB0aGVuIHRoZSBicmVzZW5oYW1MaW5lcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzY5KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzcwIiwgIklmIGxpbmVSYXN0ZXJpemF0aW9uTW9kZSBpcyBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9TTU9PVEhfRVhULCB0aGVuIHRoZSBzbW9vdGhMaW5lcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzcwKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtbGluZVJhc3Rlcml6YXRpb25Nb2RlLXBhcmFtZXRlciIsICJsaW5lUmFzdGVyaXphdGlvbk1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrTGluZVJhc3Rlcml6YXRpb25Nb2RlRVhUIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1saW5lUmFzdGVyaXphdGlvbk1vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0xJTkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULXN0aXBwbGVkTGluZUVuYWJsZS0wMjc3MSIsICJJZiBzdGlwcGxlZExpbmVFbmFibGUgaXMgVktfVFJVRSBhbmQgbGluZVJhc3Rlcml6YXRpb25Nb2RlIGlzIFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX0VYVCwgdGhlbiB0aGUgc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzEpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzIiLCAiSWYgc3RpcHBsZWRMaW5lRW5hYmxlIGlzIFZLX1RSVUUgYW5kIGxpbmVSYXN0ZXJpemF0aW9uTW9kZSBpcyBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CUkVTRU5IQU1fRVhULCB0aGVuIHRoZSBzdGlwcGxlZEJyZXNlbmhhbUxpbmVzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzMiLCAiSWYgc3RpcHBsZWRMaW5lRW5hYmxlIGlzIFZLX1RSVUUgYW5kIGxpbmVSYXN0ZXJpemF0aW9uTW9kZSBpcyBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9TTU9PVEhfRVhULCB0aGVuIHRoZSBzdGlwcGxlZFNtb290aExpbmVzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzMpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzQiLCAiSWYgc3RpcHBsZWRMaW5lRW5hYmxlIGlzIFZLX1RSVUUgYW5kIGxpbmVSYXN0ZXJpemF0aW9uTW9kZSBpcyBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVCwgdGhlbiB0aGUgc3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIGFuZCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjpzdHJpY3RMaW5lcyBtdXN0IGJlIFZLX1RSVUUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULXN0aXBwbGVkTGluZUVuYWJsZS0wMjc3NCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tY3VsbE1vZGUtcGFyYW1ldGVyIiwgImN1bGxNb2RlIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0N1bGxNb2RlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLWN1bGxNb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tZGVwdGhDbGFtcEVuYWJsZS0wMDc4MiIsICJJZiB0aGUgZGVwdGggY2xhbXBpbmcgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZGVwdGhDbGFtcEVuYWJsZSBtdXN0IGJlIFZLX0ZBTFNFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLWRlcHRoQ2xhbXBFbmFibGUtMDA3ODIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tZnJvbnRGYWNlLXBhcmFtZXRlciIsICJmcm9udEZhY2UgbXVzdCBiZSBhIHZhbGlkIFZrRnJvbnRGYWNlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLWZyb250RmFjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgIkVhY2ggcE5leHQgbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25Db25zZXJ2YXRpdmVTdGF0ZUNyZWF0ZUluZm9FWFQsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uRGVwdGhDbGlwU3RhdGVDcmVhdGVJbmZvRVhULCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQsIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQsIG9yIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1wb2x5Z29uTW9kZS0wMTQxMyIsICJJZiB0aGUgbm9uLXNvbGlkIGZpbGwgbW9kZXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgcG9seWdvbk1vZGUgbXVzdCBiZSBWS19QT0xZR09OX01PREVfRklMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1wb2x5Z29uTW9kZS0wMTQxMykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tcG9seWdvbk1vZGUtMDE0MTQiLCAiSWYgdGhlIFZLX05WX2ZpbGxfcmVjdGFuZ2xlIGV4dGVuc2lvbiBpcyBub3QgZW5hYmxlZCwgcG9seWdvbk1vZGUgbXVzdCBub3QgYmUgVktfUE9MWUdPTl9NT0RFX0ZJTExfUkVDVEFOR0xFX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLTAxNDE0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1wb2x5Z29uTW9kZS0wMTUwNyIsICJJZiB0aGUgbm9uLXNvbGlkIGZpbGwgbW9kZXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgcG9seWdvbk1vZGUgbXVzdCBiZSBWS19QT0xZR09OX01PREVfRklMTCBvciBWS19QT0xZR09OX01PREVfRklMTF9SRUNUQU5HTEVfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tcG9seWdvbk1vZGUtMDE1MDcpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLXBhcmFtZXRlciIsICJwb2x5Z29uTW9kZSBtdXN0IGJlIGEgdmFsaWQgVmtQb2x5Z29uTW9kZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1wb2x5Z29uTW9kZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQtcmFzdGVyaXphdGlvbk9yZGVyLXBhcmFtZXRlciIsICJyYXN0ZXJpemF0aW9uT3JkZXIgbXVzdCBiZSBhIHZhbGlkIFZrUmFzdGVyaXphdGlvbk9yZGVyQU1EIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVSYXN0ZXJpemF0aW9uT3JkZXJBTUQtcmFzdGVyaXphdGlvbk9yZGVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JBU1RFUklaQVRJT05fU1RBVEVfUkFTVEVSSVpBVElPTl9PUkRFUl9BTUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVJhc3Rlcml6YXRpb25PcmRlckFNRC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQtZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVC1nZW9tZXRyeVN0cmVhbXMtMDIzMjQiLCAiVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6Omdlb21ldHJ5U3RyZWFtcyBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZVN0cmVhbUNyZWF0ZUluZm9FWFQtZ2VvbWV0cnlTdHJlYW1zLTAyMzI0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlU3RyZWFtQ3JlYXRlSW5mb0VYVC1yYXN0ZXJpemF0aW9uU3RyZWFtLTAyMzI1IiwgInJhc3Rlcml6YXRpb25TdHJlYW0gbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDo6bWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhULXJhc3Rlcml6YXRpb25TdHJlYW0tMDIzMjUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhULXJhc3Rlcml6YXRpb25TdHJlYW0tMDIzMjYiLCAicmFzdGVyaXphdGlvblN0cmVhbSBtdXN0IGJlIHplcm8gaWYgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDo6dHJhbnNmb3JtRmVlZGJhY2tSYXN0ZXJpemF0aW9uU3RyZWFtU2VsZWN0IGlzIFZLX0ZBTFNFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhULXJhc3Rlcml6YXRpb25TdHJlYW0tMDIzMjYpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9TVFJFQU1fQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVTdHJlYW1DcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lUmVwcmVzZW50YXRpdmVGcmFnbWVudFRlc3RTdGF0ZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1JFUFJFU0VOVEFUSVZFX0ZSQUdNRU5UX1RFU1RfU1RBVEVfQ1JFQVRFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVJlcHJlc2VudGF0aXZlRnJhZ21lbnRUZXN0U3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TQU1QTEVfTE9DQVRJT05TX1NUQVRFX0NSRUFURV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhULXNhbXBsZUxvY2F0aW9uc0luZm8tcGFyYW1ldGVyIiwgInNhbXBsZUxvY2F0aW9uc0luZm8gbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVC1zYW1wbGVMb2NhdGlvbnNJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1mbGFncy0wMjc1OCIsICJJZiBmbGFncyBoYXMgYm90aCB0aGUgVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9SRVFVSVJFX0ZVTExfU1VCR1JPVVBTX0JJVF9FWFQgYW5kIFZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfQUxMT1dfVkFSWUlOR19TVUJHUk9VUF9TSVpFX0JJVF9FWFQgZmxhZ3Mgc2V0LCB0aGUgbG9jYWwgd29ya2dyb3VwIHNpemUgaW4gdGhlIFggZGltZW5zaW9uIG9mIHRoZSBwaXBlbGluZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgbWF4U3ViZ3JvdXBTaXplLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNzU4KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNzU5IiwgIklmIGZsYWdzIGhhcyB0aGUgVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9SRVFVSVJFX0ZVTExfU1VCR1JPVVBTX0JJVF9FWFQgZmxhZyBzZXQgYW5kIGZsYWdzIGRvZXMgbm90IGhhdmUgdGhlIFZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfQUxMT1dfVkFSWUlOR19TVUJHUk9VUF9TSVpFX0JJVF9FWFQgZmxhZyBzZXQgYW5kIG5vIFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluLCB0aGUgbG9jYWwgd29ya2dyb3VwIHNpemUgaW4gdGhlIFggZGltZW5zaW9uIG9mIHRoZSBwaXBlbGluZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc3ViZ3JvdXBTaXplLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNzU5KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNzg0IiwgIklmIGZsYWdzIGhhcyB0aGUgVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9BTExPV19WQVJZSU5HX1NVQkdST1VQX1NJWkVfQklUX0VYVCBmbGFnIHNldCwgdGhlIHN1Ymdyb3VwU2l6ZUNvbnRyb2wgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI3ODQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tZmxhZ3MtMDI3ODUiLCAiSWYgZmxhZ3MgaGFzIHRoZSBWS19QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX1JFUVVJUkVfRlVMTF9TVUJHUk9VUFNfQklUX0VYVCBmbGFnIHNldCwgdGhlIGNvbXB1dGVGdWxsU3ViZ3JvdXBzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLTAyNzg1KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1heENsaXBEaXN0YW5jZXMtMDA3MDgiLCAiSWYgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgaW5jbHVkZXMgYW55IHZhcmlhYmxlIGluIGl0cyBpbnRlcmZhY2UgdGhhdCBpcyBkZWNsYXJlZCB3aXRoIHRoZSBDbGlwRGlzdGFuY2UgQnVpbHRJbiBkZWNvcmF0aW9uLCB0aGF0IHZhcmlhYmxlIG11c3Qgbm90IGhhdmUgYW4gYXJyYXkgc2l6ZSBncmVhdGVyIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Q2xpcERpc3RhbmNlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1heENsaXBEaXN0YW5jZXMtMDA3MDgpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tbWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlcy0wMDcxMCIsICJJZiB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCBpbmNsdWRlcyBhbnkgdmFyaWFibGVzIGluIGl0cyBpbnRlcmZhY2UgdGhhdCBhcmUgZGVjbGFyZWQgd2l0aCB0aGUgQ2xpcERpc3RhbmNlIG9yIEN1bGxEaXN0YW5jZSBCdWlsdEluIGRlY29yYXRpb24sIHRob3NlIHZhcmlhYmxlcyBtdXN0IG5vdCBoYXZlIGFycmF5IHNpemVzIHdoaWNoIHN1bSB0byBtb3JlIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXMtMDA3MTApIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tbWF4Q3VsbERpc3RhbmNlcy0wMDcwOSIsICJJZiB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCBpbmNsdWRlcyBhbnkgdmFyaWFibGUgaW4gaXRzIGludGVyZmFjZSB0aGF0IGlzIGRlY2xhcmVkIHdpdGggdGhlIEN1bGxEaXN0YW5jZSBCdWlsdEluIGRlY29yYXRpb24sIHRoYXQgdmFyaWFibGUgbXVzdCBub3QgaGF2ZSBhbiBhcnJheSBzaXplIGdyZWF0ZXIgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDdWxsRGlzdGFuY2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tbWF4Q3VsbERpc3RhbmNlcy0wMDcwOSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1tYXhTYW1wbGVNYXNrV29yZHMtMDA3MTEiLCAiSWYgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgaW5jbHVkZXMgYW55IHZhcmlhYmxlIGluIGl0cyBpbnRlcmZhY2UgdGhhdCBpcyBkZWNsYXJlZCB3aXRoIHRoZSBTYW1wbGVNYXNrIEJ1aWx0SW4gZGVjb3JhdGlvbiwgdGhhdCB2YXJpYWJsZSBtdXN0IG5vdCBoYXZlIGFuIGFycmF5IHNpemUgZ3JlYXRlciB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFNhbXBsZU1hc2tXb3JkcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1heFNhbXBsZU1hc2tXb3Jkcy0wMDcxMSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1tb2R1bGUtcGFyYW1ldGVyIiwgIm1vZHVsZSBtdXN0IGJlIGEgdmFsaWQgVmtTaGFkZXJNb2R1bGUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tbW9kdWxlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmFtZS0wMDcwNyIsICJwTmFtZSBtdXN0IGJlIHRoZSBuYW1lIG9mIGFuIE9wRW50cnlQb2ludCBpbiBtb2R1bGUgd2l0aCBhbiBleGVjdXRpb24gbW9kZWwgdGhhdCBtYXRjaGVzIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5hbWUtMDA3MDcpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5hbWUtcGFyYW1ldGVyIiwgInBOYW1lIG11c3QgYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5hbWUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXBOZXh0LTAyNzU0IiwgIklmIGEgVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4sIGZsYWdzIG11c3Qgbm90IGhhdmUgdGhlIFZLX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfQUxMT1dfVkFSWUlOR19TVUJHUk9VUF9TSVpFX0JJVF9FWFQgZmxhZyBzZXQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5leHQtMDI3NTQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5leHQtMDI3NTUiLCAiSWYgYSBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiwgdGhlIHN1Ymdyb3VwU2l6ZUNvbnRyb2wgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQsIGFuZCBzdGFnZSBtdXN0IGJlIGEgdmFsaWQgYml0IHNwZWNpZmllZCBpbiByZXF1aXJlZFN1Ymdyb3VwU2l6ZVN0YWdlcy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC0wMjc1NSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC0wMjc1NiIsICJJZiBhIFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIGFuZCBzdGFnZSBpcyBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIHRoZSBsb2NhbCB3b3JrZ3JvdXAgc2l6ZSBvZiB0aGUgc2hhZGVyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG9mIFZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVDo6cmVxdWlyZWRTdWJncm91cFNpemUgYW5kIG1heENvbXB1dGVXb3JrZ3JvdXBTdWJncm91cHMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5leHQtMDI3NTYpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5leHQtMDI3NTciLCAiSWYgYSBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiwgYW5kIGZsYWdzIGhhcyB0aGUgVktfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9SRVFVSVJFX0ZVTExfU1VCR1JPVVBTX0JJVF9FWFQgZmxhZyBzZXQsIHRoZSBsb2NhbCB3b3JrZ3JvdXAgc2l6ZSBpbiB0aGUgWCBkaW1lbnNpb24gb2YgdGhlIHBpcGVsaW5lIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQ6OnJlcXVpcmVkU3ViZ3JvdXBTaXplLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXBOZXh0LTAyNzU3KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wU3BlY2lhbGl6YXRpb25JbmZvLXBhcmFtZXRlciIsICJJZiBwU3BlY2lhbGl6YXRpb25JbmZvIGlzIG5vdCBOVUxMLCBwU3BlY2lhbGl6YXRpb25JbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTcGVjaWFsaXphdGlvbkluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcFNwZWNpYWxpemF0aW9uSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMDcwNCIsICJJZiB0aGUgZ2VvbWV0cnkgc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBzdGFnZSBtdXN0IG5vdCBiZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MDQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MDUiLCAiSWYgdGhlIHRlc3NlbGxhdGlvbiBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHN0YWdlIG11c3Qgbm90IGJlIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQgb3IgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzA1KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzA2IiwgInN0YWdlIG11c3Qgbm90IGJlIFZLX1NIQURFUl9TVEFHRV9BTExfR1JBUEhJQ1MsIG9yIFZLX1NIQURFUl9TVEFHRV9BTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMDcwNikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMDcxMiIsICJJZiBzdGFnZSBpcyBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgbXVzdCBub3QgaW5jbHVkZSBhbnkgaW5wdXQgdmFyaWFibGUgaW4gaXRzIGludGVyZmFjZSB0aGF0IGlzIGRlY29yYXRlZCB3aXRoIEN1bGxEaXN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzEyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzEzIiwgIklmIHN0YWdlIGlzIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQgb3IgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCwgYW5kIHRoZSBpZGVudGlmaWVkIGVudHJ5IHBvaW50IGhhcyBhbiBPcEV4ZWN1dGlvbk1vZGUgaW5zdHJ1Y3Rpb24gdGhhdCBzcGVjaWZpZXMgYSBwYXRjaCBzaXplIHdpdGggT3V0cHV0VmVydGljZXMsIHRoZSBwYXRjaCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXNzZWxsYXRpb25QYXRjaFNpemUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMDcxMykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMDcxNCIsICJJZiBzdGFnZSBpcyBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklULCB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCBtdXN0IGhhdmUgYW4gT3BFeGVjdXRpb25Nb2RlIGluc3RydWN0aW9uIHRoYXQgc3BlY2lmaWVzIGEgbWF4aW11bSBvdXRwdXQgdmVydGV4IGNvdW50IHRoYXQgaXMgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MTQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MTUiLCAiSWYgc3RhZ2UgaXMgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgbXVzdCBoYXZlIGFuIE9wRXhlY3V0aW9uTW9kZSBpbnN0cnVjdGlvbiB0aGF0IHNwZWNpZmllcyBhbiBpbnZvY2F0aW9uIGNvdW50IHRoYXQgaXMgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MTUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MTgiLCAiSWYgc3RhZ2UgaXMgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgbXVzdCBub3QgaW5jbHVkZSBhbnkgb3V0cHV0IHZhcmlhYmxlcyBpbiBpdHMgaW50ZXJmYWNlIGRlY29yYXRlZCB3aXRoIEN1bGxEaXN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzE4KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzE5IiwgIklmIHN0YWdlIGlzIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIGFuZCB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCB3cml0ZXMgdG8gRnJhZ0RlcHRoIGluIGFueSBleGVjdXRpb24gcGF0aCwgaXQgbXVzdCB3cml0ZSB0byBGcmFnRGVwdGggaW4gYWxsIGV4ZWN1dGlvbiBwYXRocyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzE5KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAxNTExIiwgIklmIHN0YWdlIGlzIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIGFuZCB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCB3cml0ZXMgdG8gRnJhZ1N0ZW5jaWxSZWZFWFQgaW4gYW55IGV4ZWN1dGlvbiBwYXRoLCBpdCBtdXN0IHdyaXRlIHRvIEZyYWdTdGVuY2lsUmVmRVhUIGluIGFsbCBleGVjdXRpb24gcGF0aHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMTUxMSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMjA5MSIsICJJZiB0aGUgbWVzaCBzaGFkZXIgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3RhZ2UgbXVzdCBub3QgYmUgVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDIwOTEpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDIwOTIiLCAiSWYgdGhlIHRhc2sgc2hhZGVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHN0YWdlIG11c3Qgbm90IGJlIFZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyMDkyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyMDkzIiwgIklmIHN0YWdlIGlzIFZLX1NIQURFUl9TVEFHRV9NRVNIX0JJVF9OViwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgbXVzdCBoYXZlIGFuIE9wRXhlY3V0aW9uTW9kZSBpbnN0cnVjdGlvbiB0aGF0IHNwZWNpZmllcyBhIG1heGltdW0gb3V0cHV0IHZlcnRleCBjb3VudCwgT3V0cHV0VmVydGljZXMsIHRoYXQgaXMgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVjo6bWF4TWVzaE91dHB1dFZlcnRpY2VzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyMDkzKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyMDk0IiwgIklmIHN0YWdlIGlzIFZLX1NIQURFUl9TVEFHRV9NRVNIX0JJVF9OViwgdGhlIGlkZW50aWZpZWQgZW50cnkgcG9pbnQgbXVzdCBoYXZlIGFuIE9wRXhlY3V0aW9uTW9kZSBpbnN0cnVjdGlvbiB0aGF0IHNwZWNpZmllcyBhIG1heGltdW0gb3V0cHV0IHByaW1pdGl2ZSBjb3VudCwgT3V0cHV0UHJpbWl0aXZlc05WLCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY6Om1heE1lc2hPdXRwdXRQcmltaXRpdmVzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyMDk0KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyNTk2IiwgIklmIHN0YWdlIGlzIGEgdmVydGV4IHByb2Nlc3Npbmcgc3RhZ2UsIGFuZCB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCB3cml0ZXMgdG8gTGF5ZXIgZm9yIGFueSBwcmltaXRpdmUsIGl0IG11c3Qgd3JpdGUgdGhlIHNhbWUgdmFsdWUgdG8gTGF5ZXIgZm9yIGFsbCB2ZXJ0aWNlcyBvZiBhIGdpdmVuIHByaW1pdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyNTk2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyNTk3IiwgIklmIHN0YWdlIGlzIGEgdmVydGV4IHByb2Nlc3Npbmcgc3RhZ2UsIGFuZCB0aGUgaWRlbnRpZmllZCBlbnRyeSBwb2ludCB3cml0ZXMgdG8gVmlld3BvcnRJbmRleCBmb3IgYW55IHByaW1pdGl2ZSwgaXQgbXVzdCB3cml0ZSB0aGUgc2FtZSB2YWx1ZSB0byBWaWV3cG9ydEluZGV4IGZvciBhbGwgdmVydGljZXMgb2YgYSBnaXZlbiBwcmltaXRpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMjU5NykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS1wYXJhbWV0ZXIiLCAic3RhZ2UgbXVzdCBiZSBhIHZhbGlkIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhULXJlcXVpcmVkU3ViZ3JvdXBTaXplLTAyNzYwIiwgInJlcXVpcmVkU3ViZ3JvdXBTaXplIG11c3QgYmUgYSBwb3dlci1vZi10d28gaW50ZWdlci4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhULXJlcXVpcmVkU3ViZ3JvdXBTaXplLTAyNzYwKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQtcmVxdWlyZWRTdWJncm91cFNpemUtMDI3NjEiLCAicmVxdWlyZWRTdWJncm91cFNpemUgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIG1pblN1Ymdyb3VwU2l6ZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlUmVxdWlyZWRTdWJncm91cFNpemVDcmVhdGVJbmZvRVhULXJlcXVpcmVkU3ViZ3JvdXBTaXplLTAyNzYxKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQtcmVxdWlyZWRTdWJncm91cFNpemUtMDI3NjIiLCAicmVxdWlyZWRTdWJncm91cFNpemUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4U3ViZ3JvdXBTaXplLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQtcmVxdWlyZWRTdWJncm91cFNpemUtMDI3NjIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZVJlcXVpcmVkU3ViZ3JvdXBTaXplQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9SRVFVSVJFRF9TVUJHUk9VUF9TSVpFX0NSRUFURV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VSZXF1aXJlZFN1Ymdyb3VwU2l6ZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8tZG9tYWluT3JpZ2luLXBhcmFtZXRlciIsICJkb21haW5PcmlnaW4gbXVzdCBiZSBhIHZhbGlkIFZrVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8tZG9tYWluT3JpZ2luLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mby1wYXRjaENvbnRyb2xQb2ludHMtMDEyMTQiLCAicGF0Y2hDb250cm9sUG9pbnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXNzZWxsYXRpb25QYXRjaFNpemUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mby1wYXRjaENvbnRyb2xQb2ludHMtMDEyMTQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVC1wVmVydGV4QmluZGluZ0Rpdmlzb3JzLXBhcmFtZXRlciIsICJwVmVydGV4QmluZGluZ0Rpdmlzb3JzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhULXBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX0RJVklTT1JfU1RBVEVfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dERpdmlzb3JTdGF0ZUNyZWF0ZUluZm9FWFQtdmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudC1hcnJheWxlbmd0aCIsICJ2ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVC12ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tYmluZGluZy0wMDYxNSIsICJGb3IgZXZlcnkgYmluZGluZyBzcGVjaWZpZWQgYnkgZWFjaCBlbGVtZW50IG9mIHBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMsIGEgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBtdXN0IGV4aXN0IGluIHBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgYmluZGluZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tYmluZGluZy0wMDYxNSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLTAwNjE3IiwgIkFsbCBlbGVtZW50cyBvZiBwVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zIG11c3QgZGVzY3JpYmUgZGlzdGluY3QgYXR0cmlidXRlIGxvY2F0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucy0wMDYxNykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMtcGFyYW1ldGVyIiwgIklmIHZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgaXMgbm90IDAsIHBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCB2YWxpZCBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucy0wMDYxNiIsICJBbGwgZWxlbWVudHMgb2YgcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgbXVzdCBkZXNjcmliZSBkaXN0aW5jdCBiaW5kaW5nIG51bWJlcnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLTAwNjE2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMtcGFyYW1ldGVyIiwgIklmIHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50IGlzIG5vdCAwLCBwVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCB2YWxpZCBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX1NUQVRFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQtMDA2MTQiLCAidmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQtMDA2MTQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby12ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudC0wMDYxMyIsICJ2ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby12ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudC0wMDYxMykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVi1wQ3VzdG9tU2FtcGxlT3JkZXJzLTAyMjM0IiwgIlRoZSBhcnJheSBwQ3VzdG9tU2FtcGxlT3JkZXJzIG11c3Qgbm90IGNvbnRhaW4gdHdvIHN0cnVjdHVyZXMgd2l0aCBtYXRjaGluZyB2YWx1ZXMgZm9yIGJvdGggdGhlIHNoYWRpbmdSYXRlIGFuZCBzYW1wbGVDb3VudCBtZW1iZXJzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WLXBDdXN0b21TYW1wbGVPcmRlcnMtMDIyMzQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtcEN1c3RvbVNhbXBsZU9yZGVycy1wYXJhbWV0ZXIiLCAiSWYgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCBpcyBub3QgMCwgcEN1c3RvbVNhbXBsZU9yZGVycyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjdXN0b21TYW1wbGVPcmRlckNvdW50IHZhbGlkIFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtcEN1c3RvbVNhbXBsZU9yZGVycy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9DT0FSU0VfU0FNUExFX09SREVSX1NUQVRFX0NSRUFURV9JTkZPX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtc2FtcGxlT3JkZXJUeXBlLTAyMDcyIiwgIklmIHNhbXBsZU9yZGVyVHlwZSBpcyBub3QgVktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX0NVU1RPTV9OViwgY3VzdG9tU2FtcGxlck9yZGVyQ291bnQgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtc2FtcGxlT3JkZXJUeXBlLTAyMDcyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WLXNhbXBsZU9yZGVyVHlwZS1wYXJhbWV0ZXIiLCAic2FtcGxlT3JkZXJUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlYtc2FtcGxlT3JkZXJUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WLWV4Y2x1c2l2ZVNjaXNzb3JDb3VudC0wMjAyNyIsICJJZiB0aGUgbXVsdGlwbGUgdmlld3BvcnRzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCBtdXN0IGJlIDAgb3IgMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDI3KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDI4IiwgImV4Y2x1c2l2ZVNjaXNzb3JDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WLWV4Y2x1c2l2ZVNjaXNzb3JDb3VudC0wMjAyOCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WLWV4Y2x1c2l2ZVNjaXNzb3JDb3VudC0wMjAyOSIsICJleGNsdXNpdmVTY2lzc29yQ291bnQgbXVzdCBiZSAwIG9yIGlkZW50aWNhbCB0byB0aGUgdmlld3BvcnRDb3VudCBtZW1iZXIgb2YgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1leGNsdXNpdmVTY2lzc29yQ291bnQtMDIwMjkpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1wRHluYW1pY1N0YXRlcy0wMjAzMCIsICJJZiBubyBlbGVtZW50IG9mIHRoZSBwRHluYW1pY1N0YXRlcyBtZW1iZXIgb2YgcER5bmFtaWNTdGF0ZSBpcyBWS19EWU5BTUlDX1NUQVRFX0VYQ0xVU0lWRV9TQ0lTU09SX05WIGFuZCBleGNsdXNpdmVTY2lzc29yQ291bnQgaXMgbm90IDAsIHBFeGNsdXNpdmVTY2lzc29ycyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBleGNsdXNpdmVTY2lzc29yQ291bnQgVmtSZWN0MkQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtcER5bmFtaWNTdGF0ZXMtMDIwMzApIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1wRXhjbHVzaXZlU2Npc3NvcnMtcGFyYW1ldGVyIiwgIklmIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCBpcyBub3QgMCwgYW5kIHBFeGNsdXNpdmVTY2lzc29ycyBpcyBub3QgTlVMTCwgcEV4Y2x1c2l2ZVNjaXNzb3JzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCBWa1JlY3QyRCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1wRXhjbHVzaXZlU2Npc3NvcnMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9FWENMVVNJVkVfU0NJU1NPUl9TVEFURV9DUkVBVEVfSU5GT19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi1wRHluYW1pY1N0YXRlcy0wMjA1NyIsICJJZiBubyBlbGVtZW50IG9mIHRoZSBwRHluYW1pY1N0YXRlcyBtZW1iZXIgb2YgcER5bmFtaWNTdGF0ZSBpcyBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9QQUxFVFRFX05WLCBwU2hhZGluZ1JhdGVQYWxldHRlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aWV3cG9ydENvdW50IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYtcER5bmFtaWNTdGF0ZXMtMDIwNTcpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi1wU2hhZGluZ1JhdGVQYWxldHRlcy1wYXJhbWV0ZXIiLCAiSWYgdmlld3BvcnRDb3VudCBpcyBub3QgMCwgYW5kIHBTaGFkaW5nUmF0ZVBhbGV0dGVzIGlzIG5vdCBOVUxMLCBwU2hhZGluZ1JhdGVQYWxldHRlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aWV3cG9ydENvdW50IHZhbGlkIFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYtcFNoYWRpbmdSYXRlUGFsZXR0ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfSU1BR0VfU1RBVEVfQ1JFQVRFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYtc2hhZGluZ1JhdGVJbWFnZUVuYWJsZS0wMjA1NiIsICJJZiBzaGFkaW5nUmF0ZUltYWdlRW5hYmxlIGlzIFZLX1RSVUUsIHZpZXdwb3J0Q291bnQgbXVzdCBiZSBlcXVhbCB0byB0aGUgdmlld3BvcnRDb3VudCBtZW1iZXIgb2YgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi1zaGFkaW5nUmF0ZUltYWdlRW5hYmxlLTAyMDU2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYtdmlld3BvcnRDb3VudC0wMjA1NCIsICJJZiB0aGUgbXVsdGlwbGUgdmlld3BvcnRzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHZpZXdwb3J0Q291bnQgbXVzdCBiZSAwIG9yIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WLXZpZXdwb3J0Q291bnQtMDIwNTQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi12aWV3cG9ydENvdW50LTAyMDU1IiwgInZpZXdwb3J0Q291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Vmlld3BvcnRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi12aWV3cG9ydENvdW50LTAyMDU1KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLW9mZnNldC0wMjgyMiIsICJFdmFsdWF0aW9uIG9mIChvZmZzZXQueCArIGV4dGVudC53aWR0aCkgbXVzdCBub3QgY2F1c2UgYSBzaWduZWQgaW50ZWdlciBhZGRpdGlvbiBvdmVyZmxvdyBmb3IgYW55IGVsZW1lbnQgb2YgcFNjaXNzb3JzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1vZmZzZXQtMDI4MjIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1vZmZzZXQtMDI4MjMiLCAiRXZhbHVhdGlvbiBvZiAob2Zmc2V0LnkgKyBleHRlbnQuaGVpZ2h0KSBtdXN0IG5vdCBjYXVzZSBhIHNpZ25lZCBpbnRlZ2VyIGFkZGl0aW9uIG92ZXJmbG93IGZvciBhbnkgZWxlbWVudCBvZiBwU2Npc3NvcnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLW9mZnNldC0wMjgyMykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgIkVhY2ggcE5leHQgbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OViwgVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WLCBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYsIFZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViwgb3IgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsICJFYWNoIHNUeXBlIG1lbWJlciBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSB1bmlxdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxNyIsICJJZiB0aGUgbXVsdGlwbGUgdmlld3BvcnRzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNjaXNzb3JDb3VudCBtdXN0IGJlIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxNykifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxOSIsICJzY2lzc29yQ291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cywgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTkpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAiLCAic2Npc3NvckNvdW50IGFuZCB2aWV3cG9ydENvdW50IG11c3QgYmUgaWRlbnRpY2FsIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjApIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtYXJyYXlsZW5ndGgiLCAic2Npc3NvckNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLCAiSWYgdGhlIG11bHRpcGxlIHZpZXdwb3J0cyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB2aWV3cG9ydENvdW50IG11c3QgYmUgMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC0wMTIxNikifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTgiLCAidmlld3BvcnRDb3VudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Vmlld3BvcnRzLCBpbmNsdXNpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTgpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwgInZpZXdwb3J0Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0V1NjYWxpbmdFbmFibGUtMDE3MjYiLCAiSWYgdGhlIHZpZXdwb3J0V1NjYWxpbmdFbmFibGUgbWVtYmVyIG9mIGEgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIGlzIFZLX1RSVUUsIHRoZSB2aWV3cG9ydENvdW50IG1lbWJlciBvZiB0aGUgVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OViBzdHJ1Y3R1cmUgbXVzdCBiZSBlcXVhbCB0byB2aWV3cG9ydENvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydFdTY2FsaW5nRW5hYmxlLTAxNzI2KSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8teC0wMjgyMSIsICJUaGUgeCBhbmQgeSBtZW1iZXJzIG9mIG9mZnNldCBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcFNjaXNzb3JzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXgtMDI4MjEpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVi1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYtcFZpZXdwb3J0U3dpenpsZXMtcGFyYW1ldGVyIiwgInBWaWV3cG9ydFN3aXp6bGVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZpZXdwb3J0Q291bnQgdmFsaWQgVmtWaWV3cG9ydFN3aXp6bGVOViBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVi1wVmlld3BvcnRTd2l6emxlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NXSVpaTEVfU1RBVEVfQ1JFQVRFX0lORk9fTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYtdmlld3BvcnRDb3VudC0wMTIxNSIsICJ2aWV3cG9ydENvdW50IG11c3QgbWF0Y2ggdGhlIHZpZXdwb3J0Q291bnQgc2V0IGluIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTd2l6emxlU3RhdGVDcmVhdGVJbmZvTlYtdmlld3BvcnRDb3VudC0wMTIxNSkifSwKKyAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLXZpZXdwb3J0Q291bnQtYXJyYXlsZW5ndGgiLCAidmlld3BvcnRDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OVi12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfV19TQ0FMSU5HX1NUQVRFX0NSRUFURV9JTkZPX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYtdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsICJ2aWV3cG9ydENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVi12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa1ByZXNlbnRGcmFtZVRva2VuR0dQLWZyYW1lVG9rZW4tMDI2ODAiLCAiZnJhbWVUb2tlbiBtdXN0IGJlIGEgdmFsaWQgR2dwRnJhbWVUb2tlbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRGcmFtZVRva2VuR0dQLWZyYW1lVG9rZW4tMDI2ODApIn0sCisgICAgeyJWVUlELVZrUHJlc2VudEZyYW1lVG9rZW5HR1Atc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0ZSQU1FX1RPS0VOX0dHUCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRGcmFtZVRva2VuR0dQLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIHRoZSBlbGVtZW50cyBvZiBwU3dhcGNoYWlucywgYW5kIHRoZSBlbGVtZW50cyBvZiBwV2FpdFNlbWFwaG9yZXMgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtJbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wSW1hZ2VJbmRpY2VzLTAxMjk2IiwgIkVhY2ggZWxlbWVudCBvZiBwSW1hZ2VJbmRpY2VzIG11c3QgYmUgdGhlIGluZGV4IG9mIGEgcHJlc2VudGFibGUgaW1hZ2UgYWNxdWlyZWQgZnJvbSB0aGUgc3dhcGNoYWluIHNwZWNpZmllZCBieSB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoZSBwU3dhcGNoYWlucyBhcnJheSwgYW5kIHRoZSBwcmVzZW50ZWQgaW1hZ2Ugc3VicmVzb3VyY2UgbXVzdCBiZSBpbiB0aGUgVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUiBsYXlvdXQgYXQgdGhlIHRpbWUgdGhlIG9wZXJhdGlvbiBpcyBleGVjdXRlZCBvbiBhIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJlc2VudEluZm9LSFItcEltYWdlSW5kaWNlcy0wMTI5NikifSwKKyAgICB7IlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wSW1hZ2VJbmRpY2VzLTAxNDMwIiwgIkVhY2ggZWxlbWVudCBvZiBwSW1hZ2VJbmRpY2VzIG11c3QgYmUgdGhlIGluZGV4IG9mIGEgcHJlc2VudGFibGUgaW1hZ2UgYWNxdWlyZWQgZnJvbSB0aGUgc3dhcGNoYWluIHNwZWNpZmllZCBieSB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoZSBwU3dhcGNoYWlucyBhcnJheSwgYW5kIHRoZSBwcmVzZW50ZWQgaW1hZ2Ugc3VicmVzb3VyY2UgbXVzdCBiZSBpbiB0aGUgVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUiBvciBWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSIGxheW91dCBhdCB0aGUgdGltZSB0aGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIG9uIGEgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQcmVzZW50SW5mb0tIUi1wSW1hZ2VJbmRpY2VzLTAxNDMwKSJ9LAorICAgIHsiVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBJbWFnZUluZGljZXMtcGFyYW1ldGVyIiwgInBJbWFnZUluZGljZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3dhcGNoYWluQ291bnQgdWludDMyX3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJlc2VudEluZm9LSFItcEltYWdlSW5kaWNlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUHJlc2VudEluZm9LSFItcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0RldmljZUdyb3VwUHJlc2VudEluZm9LSFIsIFZrRGlzcGxheVByZXNlbnRJbmZvS0hSLCBWa1ByZXNlbnRGcmFtZVRva2VuR0dQLCBWa1ByZXNlbnRSZWdpb25zS0hSLCBvciBWa1ByZXNlbnRUaW1lc0luZm9HT09HTEUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQcmVzZW50SW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wUmVzdWx0cy1wYXJhbWV0ZXIiLCAiSWYgcFJlc3VsdHMgaXMgbm90IE5VTEwsIHBSZXN1bHRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN3YXBjaGFpbkNvdW50IFZrUmVzdWx0IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBSZXN1bHRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wU3dhcGNoYWlucy1wYXJhbWV0ZXIiLCAicFN3YXBjaGFpbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3dhcGNoYWluQ291bnQgdmFsaWQgVmtTd2FwY2hhaW5LSFIgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBTd2FwY2hhaW5zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wV2FpdFNlbWFwaG9yZXMtMDMyNjkiLCAiQWxsIGVsZW1lbnRzIG9mIHRoZSBwV2FpdFNlbWFwaG9yZXMgbXVzdCBoYXZlIGEgVmtTZW1hcGhvcmVUeXBlS0hSIG9mIFZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQcmVzZW50SW5mb0tIUi1wV2FpdFNlbWFwaG9yZXMtMDMyNjkpIn0sCisgICAgeyJWVUlELVZrUHJlc2VudEluZm9LSFItcFdhaXRTZW1hcGhvcmVzLXBhcmFtZXRlciIsICJJZiB3YWl0U2VtYXBob3JlQ291bnQgaXMgbm90IDAsIHBXYWl0U2VtYXBob3JlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB3YWl0U2VtYXBob3JlQ291bnQgdmFsaWQgVmtTZW1hcGhvcmUgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXBXYWl0U2VtYXBob3Jlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUHJlc2VudEluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJlc2VudEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUHJlc2VudEluZm9LSFItc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRJbmZvS0hSLXNUeXBlLXVuaXF1ZSkifSwKKyAgICB7IlZVSUQtVmtQcmVzZW50SW5mb0tIUi1zd2FwY2hhaW5Db3VudC1hcnJheWxlbmd0aCIsICJzd2FwY2hhaW5Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJlc2VudEluZm9LSFItc3dhcGNoYWluQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrUHJlc2VudFJlZ2lvbktIUi1wUmVjdGFuZ2xlcy1wYXJhbWV0ZXIiLCAiSWYgcmVjdGFuZ2xlQ291bnQgaXMgbm90IDAsIGFuZCBwUmVjdGFuZ2xlcyBpcyBub3QgTlVMTCwgcFJlY3RhbmdsZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcmVjdGFuZ2xlQ291bnQgdmFsaWQgVmtSZWN0TGF5ZXJLSFIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRSZWdpb25LSFItcFJlY3RhbmdsZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1ByZXNlbnRSZWdpb25zS0hSLXBSZWdpb25zLXBhcmFtZXRlciIsICJJZiBwUmVnaW9ucyBpcyBub3QgTlVMTCwgcFJlZ2lvbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3dhcGNoYWluQ291bnQgdmFsaWQgVmtQcmVzZW50UmVnaW9uS0hSIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQcmVzZW50UmVnaW9uc0tIUi1wUmVnaW9ucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUHJlc2VudFJlZ2lvbnNLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1JFR0lPTlNfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJlc2VudFJlZ2lvbnNLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUHJlc2VudFJlZ2lvbnNLSFItc3dhcGNoYWluQ291bnQtMDEyNjAiLCAic3dhcGNoYWluQ291bnQgbXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcyBWa1ByZXNlbnRJbmZvS0hSOjpzd2FwY2hhaW5Db3VudCwgd2hlcmUgVmtQcmVzZW50SW5mb0tIUiBpcyBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gb2YgdGhpcyBWa1ByZXNlbnRSZWdpb25zS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRSZWdpb25zS0hSLXN3YXBjaGFpbkNvdW50LTAxMjYwKSJ9LAorICAgIHsiVlVJRC1Wa1ByZXNlbnRSZWdpb25zS0hSLXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoIiwgInN3YXBjaGFpbkNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQcmVzZW50UmVnaW9uc0tIUi1zd2FwY2hhaW5Db3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLXBUaW1lcy1wYXJhbWV0ZXIiLCAiSWYgcFRpbWVzIGlzIG5vdCBOVUxMLCBwVGltZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3dhcGNoYWluQ291bnQgVmtQcmVzZW50VGltZUdPT0dMRSBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRS1wVGltZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9QUkVTRU5UX1RJTUVTX0lORk9fR09PR0xFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJlc2VudFRpbWVzSW5mb0dPT0dMRS1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLXN3YXBjaGFpbkNvdW50LTAxMjQ3IiwgInN3YXBjaGFpbkNvdW50IG11c3QgYmUgdGhlIHNhbWUgdmFsdWUgYXMgVmtQcmVzZW50SW5mb0tIUjo6c3dhcGNoYWluQ291bnQsIHdoZXJlIFZrUHJlc2VudEluZm9LSFIgaXMgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG9mIHRoaXMgVmtQcmVzZW50VGltZXNJbmZvR09PR0xFIHN0cnVjdHVyZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQcmVzZW50VGltZXNJbmZvR09PR0xFLXN3YXBjaGFpbkNvdW50LTAxMjQ3KSJ9LAorICAgIHsiVlVJRC1Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUtc3dhcGNoYWluQ291bnQtYXJyYXlsZW5ndGgiLCAic3dhcGNoYWluQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ByZXNlbnRUaW1lc0luZm9HT09HTEUtc3dhcGNoYWluQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrUHJvdGVjdGVkU3VibWl0SW5mby1wTmV4dC0wMTgxOSIsICJJZiB0aGUgVmtTdWJtaXRJbmZvOjpwTmV4dCBjaGFpbiBkb2VzIG5vdCBpbmNsdWRlIGEgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvIHN0cnVjdHVyZSwgdGhlbiBlYWNoIGVsZW1lbnQgb2YgdGhlIGNvbW1hbmQgYnVmZmVyIG9mIHRoZSBwQ29tbWFuZEJ1ZmZlcnMgYXJyYXkgbXVzdCBiZSBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlci4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQcm90ZWN0ZWRTdWJtaXRJbmZvLXBOZXh0LTAxODE5KSJ9LAorICAgIHsiVlVJRC1Wa1Byb3RlY3RlZFN1Ym1pdEluZm8tcHJvdGVjdGVkU3VibWl0LTAxODE2IiwgIklmIHRoZSBwcm90ZWN0ZWQgbWVtb3J5IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHByb3RlY3RlZFN1Ym1pdCBtdXN0IG5vdCBiZSBWS19UUlVFLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1Byb3RlY3RlZFN1Ym1pdEluZm8tcHJvdGVjdGVkU3VibWl0LTAxODE2KSJ9LAorICAgIHsiVlVJRC1Wa1Byb3RlY3RlZFN1Ym1pdEluZm8tcHJvdGVjdGVkU3VibWl0LTAxODE3IiwgIklmIHByb3RlY3RlZFN1Ym1pdCBpcyBWS19UUlVFLCB0aGVuIGVhY2ggZWxlbWVudCBvZiB0aGUgcENvbW1hbmRCdWZmZXJzIGFycmF5IG11c3QgYmUgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJvdGVjdGVkU3VibWl0SW5mby1wcm90ZWN0ZWRTdWJtaXQtMDE4MTcpIn0sCisgICAgeyJWVUlELVZrUHJvdGVjdGVkU3VibWl0SW5mby1wcm90ZWN0ZWRTdWJtaXQtMDE4MTgiLCAiSWYgcHJvdGVjdGVkU3VibWl0IGlzIFZLX0ZBTFNFLCB0aGVuIGVhY2ggZWxlbWVudCBvZiB0aGUgcENvbW1hbmRCdWZmZXJzIGFycmF5IG11c3QgYmUgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHJvdGVjdGVkU3VibWl0SW5mby1wcm90ZWN0ZWRTdWJtaXQtMDE4MTgpIn0sCisgICAgeyJWVUlELVZrUHJvdGVjdGVkU3VibWl0SW5mby1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1BST1RFQ1RFRF9TVUJNSVRfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1Byb3RlY3RlZFN1Ym1pdEluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utb2Zmc2V0LTAwMjk0IiwgIm9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhQdXNoQ29uc3RhbnRzU2l6ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLW9mZnNldC0wMDI5NCkifSwKKyAgICB7IlZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1vZmZzZXQtMDAyOTUiLCAib2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utb2Zmc2V0LTAwMjk1KSJ9LAorICAgIHsiVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLXNpemUtMDAyOTYiLCAic2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUHVzaENvbnN0YW50UmFuZ2Utc2l6ZS0wMDI5NikifSwKKyAgICB7IlZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zaXplLTAwMjk3IiwgInNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zaXplLTAwMjk3KSJ9LAorICAgIHsiVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLXNpemUtMDAyOTgiLCAic2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhQdXNoQ29uc3RhbnRzU2l6ZSBtaW51cyBvZmZzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zaXplLTAwMjk4KSJ9LAorICAgIHsiVlVJRC1Wa1B1c2hDb25zdGFudFJhbmdlLXN0YWdlRmxhZ3MtcGFyYW1ldGVyIiwgInN0YWdlRmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zdGFnZUZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zdGFnZUZsYWdzLXJlcXVpcmVkYml0bWFzayIsICJzdGFnZUZsYWdzIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtQdXNoQ29uc3RhbnRSYW5nZS1zdGFnZUZsYWdzLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tcXVlcnlDb3VudC0wMjc2MyIsICJxdWVyeUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLXF1ZXJ5Q291bnQtMDI3NjMpIn0sCisgICAgeyJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDA3OTEiLCAiSWYgdGhlIHBpcGVsaW5lIHN0YXRpc3RpY3MgcXVlcmllcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBxdWVyeVR5cGUgbXVzdCBub3QgYmUgVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDA3OTEpIn0sCisgICAgeyJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDA3OTIiLCAiSWYgcXVlcnlUeXBlIGlzIFZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUywgcGlwZWxpbmVTdGF0aXN0aWNzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLXF1ZXJ5VHlwZS0wMDc5MikifSwKKyAgICB7IlZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLXF1ZXJ5VHlwZS0wMzIyMiIsICJJZiBxdWVyeVR5cGUgaXMgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIsIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgYSBzdHJ1Y3R1cmUgb2YgdHlwZSBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tcXVlcnlUeXBlLTAzMjIyKSJ9LAorICAgIHsiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tcXVlcnlUeXBlLXBhcmFtZXRlciIsICJxdWVyeVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrUXVlcnlUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mb0lOVEVMLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTC1wZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmctcGFyYW1ldGVyIiwgInBlcmZvcm1hbmNlQ291bnRlcnNTYW1wbGluZyBtdXN0IGJlIGEgdmFsaWQgVmtRdWVyeVBvb2xTYW1wbGluZ01vZGVJTlRFTCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTC1wZXJmb3JtYW5jZUNvdW50ZXJzU2FtcGxpbmctcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1F1ZXJ5UG9vbENyZWF0ZUluZm9JTlRFTC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk9fSU5URUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvSU5URUwtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLWNvdW50ZXJJbmRleENvdW50LWFycmF5bGVuZ3RoIiwgImNvdW50ZXJJbmRleENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItY291bnRlckluZGV4Q291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLXBDb3VudGVySW5kaWNlcy0wMzMyMSIsICJFYWNoIGVsZW1lbnQgb2YgcENvdW50ZXJJbmRpY2VzIG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGNvdW50ZXJzIHJlcG9ydGVkIGJ5IHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiBmb3IgdGhlIHF1ZXVlIGZhbWlseSBzcGVjaWZpZWQgaW4gcXVldWVGYW1pbHlJbmRleCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1wQ291bnRlckluZGljZXMtMDMzMjEpIn0sCisgICAgeyJWVUlELVZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLXBDb3VudGVySW5kaWNlcy1wYXJhbWV0ZXIiLCAicENvdW50ZXJJbmRpY2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvdW50ZXJJbmRleENvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1wQ291bnRlckluZGljZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzLTAzMjM3IiwgIlRoZSBwZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLXBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMtMDMyMzcpIn0sCisgICAgeyJWVUlELVZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDMyMzYiLCAicXVldWVGYW1pbHlJbmRleCBtdXN0IGJlIGEgdmFsaWQgcXVldWUgZmFtaWx5IGluZGV4IG9mIHRoZSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItcXVldWVGYW1pbHlJbmRleC0wMzIzNikifSwKKyAgICB7IlZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtRdWV1ZUZhbWlseUNoZWNrcG9pbnRQcm9wZXJ0aWVzTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfQ0hFQ0tQT0lOVF9QUk9QRVJUSUVTX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrUXVldWVGYW1pbHlDaGVja3BvaW50UHJvcGVydGllc05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUVVFVUVfRkFNSUxZX1BST1BFUlRJRVNfMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1F1ZXVlRmFtaWx5UHJvcGVydGllczItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGJhc2VQaXBlbGluZUhhbmRsZSwgYW5kIGxheW91dCB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWZsYWdzLTAyNDA0IiwgIklmIGZsYWdzIGNvbnRhaW5zIHRoZSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgZmxhZywgYW5kIGJhc2VQaXBlbGluZUluZGV4IGlzIC0xLCBiYXNlUGlwZWxpbmVIYW5kbGUgbXVzdCBiZSBhIHZhbGlkIGhhbmRsZSB0byBhIHJheSB0cmFjaW5nIFZrUGlwZWxpbmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtZmxhZ3MtMDI0MDQpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWZsYWdzLTAyNDA1IiwgIklmIGZsYWdzIGNvbnRhaW5zIHRoZSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgZmxhZywgYW5kIGJhc2VQaXBlbGluZUhhbmRsZSBpcyBWS19OVUxMX0hBTkRMRSwgYmFzZVBpcGVsaW5lSW5kZXggbXVzdCBiZSBhIHZhbGlkIGluZGV4IGludG8gdGhlIGNhbGxpbmcgY29tbWFuZCdzIHBDcmVhdGVJbmZvcyBwYXJhbWV0ZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtZmxhZ3MtMDI0MDUpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWZsYWdzLTAyNDA2IiwgIklmIGZsYWdzIGNvbnRhaW5zIHRoZSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgZmxhZywgYW5kIGJhc2VQaXBlbGluZUluZGV4IGlzIG5vdCAtMSwgYmFzZVBpcGVsaW5lSGFuZGxlIG11c3QgYmUgVktfTlVMTF9IQU5ETEUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtZmxhZ3MtMDI0MDYpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWZsYWdzLTAyNDA3IiwgIklmIGZsYWdzIGNvbnRhaW5zIHRoZSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgZmxhZywgYW5kIGJhc2VQaXBlbGluZUhhbmRsZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGJhc2VQaXBlbGluZUluZGV4IG11c3QgYmUgLTEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtZmxhZ3MtMDI0MDcpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtQaXBlbGluZUNyZWF0ZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWdyb3VwQ291bnQtYXJyYXlsZW5ndGgiLCAiZ3JvdXBDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWdyb3VwQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWxheW91dC0wMjQxMCIsICJsYXlvdXQgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggYWxsIHNoYWRlcnMgc3BlY2lmaWVkIGluIHBTdGFnZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtbGF5b3V0LTAyNDEwKSJ9LAorICAgIHsiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1sYXlvdXQtMDI0MTEiLCAiVGhlIG51bWJlciBvZiByZXNvdXJjZXMgaW4gbGF5b3V0IGFjY2Vzc2libGUgdG8gZWFjaCBzaGFkZXIgc3RhZ2UgdGhhdCBpcyB1c2VkIGJ5IHRoZSBwaXBlbGluZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhQZXJTdGFnZVJlc291cmNlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1sYXlvdXQtMDI0MTEpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLWxheW91dC1wYXJhbWV0ZXIiLCAibGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lTGF5b3V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1sYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1tYXhSZWN1cnNpb25EZXB0aC0wMjQxMiIsICJtYXhSZWN1cnNpb25EZXB0aCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6bWF4UmVjdXJzaW9uRGVwdGggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtbWF4UmVjdXJzaW9uRGVwdGgtMDI0MTIpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLXBHcm91cHMtcGFyYW1ldGVyIiwgInBHcm91cHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZ3JvdXBDb3VudCB2YWxpZCBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLXBHcm91cHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1wU3RhZ2VzLTAyNDA5IiwgIlRoZSBzaGFkZXIgY29kZSBmb3IgdGhlIGVudHJ5IHBvaW50cyBpZGVudGlmaWVkIGJ5IHBTdGFnZXMsIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RhdGUgaWRlbnRpZmllZCBieSB0aGlzIHN0cnVjdHVyZSBtdXN0IGFkaGVyZSB0byB0aGUgcGlwZWxpbmUgbGlua2luZyBydWxlcyBkZXNjcmliZWQgaW4gdGhlIFNoYWRlciBJbnRlcmZhY2VzIGNoYXB0ZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtcFN0YWdlcy0wMjQwOSkifSwKKyAgICB7IlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtcFN0YWdlcy1wYXJhbWV0ZXIiLCAicFN0YWdlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdGFnZUNvdW50IHZhbGlkIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1wU3RhZ2VzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19QSVBFTElORV9DUkVBVEVfSU5GT19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtc3RhZ2UtMDI0MDgiLCAiVGhlIHN0YWdlIG1lbWJlciBvZiBvbmUgZWxlbWVudCBvZiBwU3RhZ2VzIG11c3QgYmUgVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtc3RhZ2UtMDI0MDgpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLXN0YWdlQ291bnQtYXJyYXlsZW5ndGgiLCAic3RhZ2VDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WLXN0YWdlQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLWFueUhpdFNoYWRlci0wMjQxOCIsICJhbnlIaXRTaGFkZXIgbXVzdCBiZSBlaXRoZXIgVktfU0hBREVSX1VOVVNFRF9OViBvciBhIHZhbGlkIGluZGV4IGludG8gcFN0YWdlcyByZWZlcnJpbmcgdG8gYSBzaGFkZXIgb2YgVktfU0hBREVSX1NUQUdFX0FOWV9ISVRfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLWFueUhpdFNoYWRlci0wMjQxOCkifSwKKyAgICB7IlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtY2xvc2VzdEhpdFNoYWRlci0wMjQxNyIsICJjbG9zZXN0SGl0U2hhZGVyIG11c3QgYmUgZWl0aGVyIFZLX1NIQURFUl9VTlVTRURfTlYgb3IgYSB2YWxpZCBpbmRleCBpbnRvIHBTdGFnZXMgcmVmZXJyaW5nIHRvIGEgc2hhZGVyIG9mIFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtY2xvc2VzdEhpdFNoYWRlci0wMjQxNykifSwKKyAgICB7IlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxMyIsICJJZiB0eXBlIGlzIFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlYgdGhlbiBnZW5lcmFsU2hhZGVyIG11c3QgYmUgYSB2YWxpZCBpbmRleCBpbnRvIHBTdGFnZXMgcmVmZXJyaW5nIHRvIGEgc2hhZGVyIG9mIFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WLCBWS19TSEFERVJfU1RBR0VfTUlTU19CSVRfTlYsIG9yIFZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxMykifSwKKyAgICB7IlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxNCIsICJJZiB0eXBlIGlzIFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlYgdGhlbiBjbG9zZXN0SGl0U2hhZGVyLCBhbnlIaXRTaGFkZXIsIGFuZCBpbnRlcnNlY3Rpb25TaGFkZXIgbXVzdCBiZSBWS19TSEFERVJfVU5VU0VEX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXR5cGUtMDI0MTQpIn0sCisgICAgeyJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXR5cGUtMDI0MTUiLCAiSWYgdHlwZSBpcyBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9QUk9DRURVUkFMX0hJVF9HUk9VUF9OViB0aGVuIGludGVyc2VjdGlvblNoYWRlciBtdXN0IGJlIGEgdmFsaWQgaW5kZXggaW50byBwU3RhZ2VzIHJlZmVycmluZyB0byBhIHNoYWRlciBvZiBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi10eXBlLTAyNDE1KSJ9LAorICAgIHsiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi10eXBlLTAyNDE2IiwgIklmIHR5cGUgaXMgVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OViB0aGVuIGludGVyc2VjdGlvblNoYWRlciBtdXN0IGJlIFZLX1NIQURFUl9VTlVTRURfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxNikifSwKKyAgICB7IlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS1wYXJhbWV0ZXIiLCAidHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBUeXBlTlYgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVjdExheWVyS0hSLWxheWVyLTAxMjYyIiwgImxheWVyIG11c3QgYmUgbGVzcyB0aGFuIGltYWdlQXJyYXlMYXllcnMgbWVtYmVyIG9mIHRoZSBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgc3RydWN0dXJlIGdpdmVuIHRvIHZrQ3JlYXRlU3dhcGNoYWluS0hSLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlY3RMYXllcktIUi1sYXllci0wMTI2MikifSwKKyAgICB7IlZVSUQtVmtSZWN0TGF5ZXJLSFItb2Zmc2V0LTAxMjYxIiwgIlRoZSBzdW0gb2Ygb2Zmc2V0IGFuZCBleHRlbnQgbXVzdCBiZSBubyBncmVhdGVyIHRoYW4gdGhlIGltYWdlRXh0ZW50IG1lbWJlciBvZiB0aGUgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSBnaXZlbiB0byB2a0NyZWF0ZVN3YXBjaGFpbktIUi4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZWN0TGF5ZXJLSFItb2Zmc2V0LTAxMjYxKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLXBBdHRhY2htZW50cy0wMzIxOCIsICJFYWNoIGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIG11c3Qgb25seSBzcGVjaWZ5IGEgc2luZ2xlIG1pcCBsZXZlbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLXBBdHRhY2htZW50cy0wMzIxOCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUi1wQXR0YWNobWVudHMtMDMyMTkiLCAiRWFjaCBlbGVtZW50IG9mIHBBdHRhY2htZW50cyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIGlkZW50aXR5IHN3aXp6bGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUi1wQXR0YWNobWVudHMtMDMyMTkpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItcEF0dGFjaG1lbnRzLXBhcmFtZXRlciIsICJJZiBhdHRhY2htZW50Q291bnQgaXMgbm90IDAsIHBBdHRhY2htZW50cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdHRhY2htZW50Q291bnQgdmFsaWQgVmtJbWFnZVZpZXcgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLXBBdHRhY2htZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19BVFRBQ0hNRU5UX0JFR0lOX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1jbGVhclZhbHVlQ291bnQtMDA5MDIiLCAiY2xlYXJWYWx1ZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBsYXJnZXN0IGF0dGFjaG1lbnQgaW5kZXggaW4gcmVuZGVyUGFzcyB0aGF0IHNwZWNpZmllcyBhIGxvYWRPcCAob3Igc3RlbmNpbExvYWRPcCwgaWYgdGhlIGF0dGFjaG1lbnQgaGFzIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQpIG9mIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tY2xlYXJWYWx1ZUNvdW50LTAwOTAyKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZnJhbWVidWZmZXIsIGFuZCByZW5kZXJQYXNzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAyNzgwIiwgIklmIGZyYW1lYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6ZmxhZ3MgdmFsdWUgdGhhdCBpbmNsdWRlZCBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiB0aGUgcEF0dGFjaG1lbnRzIG1lbWJlciBvZiBhIFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIG9uIHRoZSBzYW1lIFZrRGV2aWNlIGFzIGZyYW1lYnVmZmVyIGFuZCByZW5kZXJQYXNzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMjc4MCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA3IiwgIklmIGZyYW1lYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6ZmxhZ3MgdmFsdWUgdGhhdCBkaWQgbm90IGluY2x1ZGUgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBhbmQgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiBzdHJ1Y3R1cmUsIGl0cyBhdHRhY2htZW50Q291bnQgbXVzdCBiZSB6ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIwNykifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA4IiwgIklmIGZyYW1lYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6ZmxhZ3MgdmFsdWUgdGhhdCBpbmNsdWRlZCBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIHRoZSBhdHRhY2htZW50Q291bnQgb2YgYSBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjo6YXR0YWNobWVudEltYWdlSW5mb0NvdW50IHVzZWQgdG8gY3JlYXRlIGZyYW1lYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIwOCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA5IiwgIklmIGZyYW1lYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6ZmxhZ3MgdmFsdWUgdGhhdCBpbmNsdWRlZCBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiB0aGUgcEF0dGFjaG1lbnRzIG1lbWJlciBvZiBhIFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGEgVmtJbWFnZVZpZXcgb2YgYW4gaW1hZ2UgY3JlYXRlZCB3aXRoIGEgdmFsdWUgb2YgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIGVxdWFsIHRvIHRoZSBmbGFncyBtZW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSOjpwQXR0YWNobWVudHMgdXNlZCB0byBjcmVhdGUgZnJhbWVidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA5KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTAiLCAiSWYgZnJhbWVidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCBhIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvOjpmbGFncyB2YWx1ZSB0aGF0IGluY2x1ZGVkIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgZWFjaCBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudHMgbWVtYmVyIG9mIGEgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgYSBWa0ltYWdlVmlldyBvZiBhbiBpbWFnZSBjcmVhdGVkIHdpdGggYSB2YWx1ZSBvZiBWa0ltYWdlQ3JlYXRlSW5mbzo6dXNhZ2UgZXF1YWwgdG8gdGhlIHVzYWdlIG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI6OnBBdHRhY2htZW50cyB1c2VkIHRvIGNyZWF0ZSBmcmFtZWJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTApIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMSIsICJJZiBmcmFtZWJ1ZmZlciB3YXMgY3JlYXRlZCB3aXRoIGEgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm86OmZsYWdzIHZhbHVlIHRoYXQgaW5jbHVkZWQgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBlYWNoIGVsZW1lbnQgb2YgdGhlIHBBdHRhY2htZW50cyBtZW1iZXIgb2YgYSBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBhIFZrSW1hZ2VWaWV3IHdpdGggYSB3aWR0aCBlcXVhbCB0byB0aGUgd2lkdGggbWVtYmVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjo6cEF0dGFjaG1lbnRzIHVzZWQgdG8gY3JlYXRlIGZyYW1lYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjEyIiwgIklmIGZyYW1lYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6ZmxhZ3MgdmFsdWUgdGhhdCBpbmNsdWRlZCBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiB0aGUgcEF0dGFjaG1lbnRzIG1lbWJlciBvZiBhIFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGEgVmtJbWFnZVZpZXcgd2l0aCBhIGhlaWdodCBlcXVhbCB0byB0aGUgaGVpZ2h0IG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI6OnBBdHRhY2htZW50cyB1c2VkIHRvIGNyZWF0ZSBmcmFtZWJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMyIsICJJZiBmcmFtZWJ1ZmZlciB3YXMgY3JlYXRlZCB3aXRoIGEgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm86OmZsYWdzIHZhbHVlIHRoYXQgaW5jbHVkZWQgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBlYWNoIGVsZW1lbnQgb2YgdGhlIHBBdHRhY2htZW50cyBtZW1iZXIgb2YgYSBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBhIFZrSW1hZ2VWaWV3IG9mIGFuIGltYWdlIGNyZWF0ZWQgd2l0aCBhIHZhbHVlIG9mIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbzo6c3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50IGVxdWFsIHRvIHRoZSBsYXllckNvdW50IG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFI6OnBBdHRhY2htZW50cyB1c2VkIHRvIGNyZWF0ZSBmcmFtZWJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTMpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNCIsICJJZiBmcmFtZWJ1ZmZlciB3YXMgY3JlYXRlZCB3aXRoIGEgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm86OmZsYWdzIHZhbHVlIHRoYXQgaW5jbHVkZWQgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSLCBlYWNoIGVsZW1lbnQgb2YgdGhlIHBBdHRhY2htZW50cyBtZW1iZXIgb2YgYSBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIHN0cnVjdHVyZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBhIFZrSW1hZ2VWaWV3IG9mIGFuIGltYWdlIGNyZWF0ZWQgd2l0aCBhIHZhbHVlIG9mIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjo6dmlld0Zvcm1hdENvdW50IGVxdWFsIHRvIHRoZSB2aWV3Rm9ybWF0Q291bnQgbWVtYmVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUjo6cEF0dGFjaG1lbnRzIHVzZWQgdG8gY3JlYXRlIGZyYW1lYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjE1IiwgIklmIGZyYW1lYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggYSBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbzo6ZmxhZ3MgdmFsdWUgdGhhdCBpbmNsdWRlZCBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIsIGVhY2ggZWxlbWVudCBvZiB0aGUgcEF0dGFjaG1lbnRzIG1lbWJlciBvZiBhIFZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFIgc3RydWN0dXJlIGluY2x1ZGVkIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGEgVmtJbWFnZVZpZXcgb2YgYW4gaW1hZ2UgY3JlYXRlZCB3aXRoIGEgc2V0IG9mIGVsZW1lbnRzIGluIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUjo6cFZpZXdGb3JtYXRzIGVxdWFsIHRvIHRoZSBzZXQgb2YgZWxlbWVudHMgaW4gdGhlIHBWaWV3Rm9ybWF0cyBtZW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSOjpwQXR0YWNobWVudHMgdXNlZCB0byBjcmVhdGUgZnJhbWVidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjE1KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTYiLCAiSWYgZnJhbWVidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCBhIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvOjpmbGFncyB2YWx1ZSB0aGF0IGluY2x1ZGVkIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgZWFjaCBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudHMgbWVtYmVyIG9mIGEgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgYSBWa0ltYWdlVmlldyBvZiBhbiBpbWFnZSBjcmVhdGVkIHdpdGggYSB2YWx1ZSBvZiBWa0ltYWdlVmlld0NyZWF0ZUluZm86OmZvcm1hdCBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZiBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjo6Zm9ybWF0IGluIHJlbmRlclBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjE2KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTciLCAiSWYgZnJhbWVidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCBhIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvOjpmbGFncyB2YWx1ZSB0aGF0IGluY2x1ZGVkIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgZWFjaCBlbGVtZW50IG9mIHRoZSBwQXR0YWNobWVudHMgbWVtYmVyIG9mIGEgVmtSZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mb0tIUiBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgYSBWa0ltYWdlVmlldyBvZiBhbiBpbWFnZSBjcmVhdGVkIHdpdGggYSB2YWx1ZSBvZiBWa0ltYWdlQ3JlYXRlSW5mbzo6c2FtcGxlcyBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZiBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjo6c2FtcGxlcyBpbiByZW5kZXJQYXNzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNykifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLXBhcmFtZXRlciIsICJmcmFtZWJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtGcmFtZWJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXBDbGVhclZhbHVlcy1wYXJhbWV0ZXIiLCAiSWYgY2xlYXJWYWx1ZUNvdW50IGlzIG5vdCAwLCBwQ2xlYXJWYWx1ZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2xlYXJWYWx1ZUNvdW50IFZrQ2xlYXJWYWx1ZSB1bmlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXBDbGVhclZhbHVlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1wTmV4dC1wTmV4dCIsICJFYWNoIHBOZXh0IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvLCBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSLCBvciBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcmVuZGVyUGFzcy0wMDkwNCIsICJyZW5kZXJQYXNzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiB0aGUgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIGZyYW1lYnVmZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcmVuZGVyUGFzcy0wMDkwNCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXJlbmRlclBhc3MtcGFyYW1ldGVyIiwgInJlbmRlclBhc3MgbXVzdCBiZSBhIHZhbGlkIFZrUmVuZGVyUGFzcyBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXJlbmRlclBhc3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXNUeXBlLXVuaXF1ZSIsICJFYWNoIHNUeXBlIG1lbWJlciBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSB1bmlxdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLXNUeXBlLXVuaXF1ZSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1hdHRhY2htZW50LTAwODM0IiwgIklmIHRoZSBhdHRhY2htZW50IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwSW5wdXRBdHRhY2htZW50cywgcENvbG9yQXR0YWNobWVudHMsIHBSZXNvbHZlQXR0YWNobWVudHMgb3IgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQsIG9yIGFueSBlbGVtZW50IG9mIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzIGluIGFueSBlbGVtZW50IG9mIHBTdWJwYXNzZXMgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBpdCBtdXN0IGJlIGxlc3MgdGhhbiBhdHRhY2htZW50Q291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1hdHRhY2htZW50LTAwODM0KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLWRzdFN1YnBhc3MtMDI1MTgiLCAiVGhlIGRzdFN1YnBhc3MgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwRGVwZW5kZW5jaWVzIG11c3QgYmUgbGVzcyB0aGFuIHN1YnBhc3NDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLWRzdFN1YnBhc3MtMDI1MTgpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODM2IiwgIkZvciBhbnkgbWVtYmVyIG9mIHBBdHRhY2htZW50cyB3aXRoIGEgbG9hZE9wIGVxdWFsIHRvIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwgdGhlIGZpcnN0IHVzZSBvZiB0aGF0IGF0dGFjaG1lbnQgbXVzdCBub3Qgc3BlY2lmeSBhIGxheW91dCBlcXVhbCB0byBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDgzNikifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDE1NjYiLCAiRm9yIGFueSBtZW1iZXIgb2YgcEF0dGFjaG1lbnRzIHdpdGggYSBsb2FkT3AgZXF1YWwgdG8gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSLCB0aGUgZmlyc3QgdXNlIG9mIHRoYXQgYXR0YWNobWVudCBtdXN0IG5vdCBzcGVjaWZ5IGEgbGF5b3V0IGVxdWFsIHRvIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAxNTY2KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMTU2NyIsICJGb3IgYW55IG1lbWJlciBvZiBwQXR0YWNobWVudHMgd2l0aCBhIHN0ZW5jaWxMb2FkT3AgZXF1YWwgdG8gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSLCB0aGUgZmlyc3QgdXNlIG9mIHRoYXQgYXR0YWNobWVudCBtdXN0IG5vdCBzcGVjaWZ5IGEgbGF5b3V0IGVxdWFsIHRvIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAxNTY3KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjUxMSIsICJGb3IgYW55IG1lbWJlciBvZiBwQXR0YWNobWVudHMgd2l0aCBhIHN0ZW5jaWxMb2FkT3AgZXF1YWwgdG8gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSLCB0aGUgZmlyc3QgdXNlIG9mIHRoYXQgYXR0YWNobWVudCBtdXN0IG5vdCBzcGVjaWZ5IGEgbGF5b3V0IGVxdWFsIHRvIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNTExKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgYXR0YWNobWVudENvdW50IGlzIG5vdCAwLCBwQXR0YWNobWVudHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYXR0YWNobWVudENvdW50IHZhbGlkIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzciLCAiRm9yIGFueSBlbGVtZW50IG9mIHBEZXBlbmRlbmNpZXMsIGlmIHRoZSBzcmNTdWJwYXNzIGlzIG5vdCBWS19TVUJQQVNTX0VYVEVSTkFMLCBhbGwgc3RhZ2UgZmxhZ3MgaW5jbHVkZWQgaW4gdGhlIHNyY1N0YWdlTWFzayBtZW1iZXIgb2YgdGhhdCBkZXBlbmRlbmN5IG11c3QgYmUgYSBwaXBlbGluZSBzdGFnZSBzdXBwb3J0ZWQgYnkgdGhlIHBpcGVsaW5lIGlkZW50aWZpZWQgYnkgdGhlIHBpcGVsaW5lQmluZFBvaW50IG1lbWJlciBvZiB0aGUgc291cmNlIHN1YnBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wRGVwZW5kZW5jaWVzLTAwODM3KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzgiLCAiRm9yIGFueSBlbGVtZW50IG9mIHBEZXBlbmRlbmNpZXMsIGlmIHRoZSBkc3RTdWJwYXNzIGlzIG5vdCBWS19TVUJQQVNTX0VYVEVSTkFMLCBhbGwgc3RhZ2UgZmxhZ3MgaW5jbHVkZWQgaW4gdGhlIGRzdFN0YWdlTWFzayBtZW1iZXIgb2YgdGhhdCBkZXBlbmRlbmN5IG11c3QgYmUgYSBwaXBlbGluZSBzdGFnZSBzdXBwb3J0ZWQgYnkgdGhlIHBpcGVsaW5lIGlkZW50aWZpZWQgYnkgdGhlIHBpcGVsaW5lQmluZFBvaW50IG1lbWJlciBvZiB0aGUgZGVzdGluYXRpb24gc3VicGFzcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzgpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcERlcGVuZGVuY2llcy1wYXJhbWV0ZXIiLCAiSWYgZGVwZW5kZW5jeUNvdW50IGlzIG5vdCAwLCBwRGVwZW5kZW5jaWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlcGVuZGVuY3lDb3VudCB2YWxpZCBWa1N1YnBhc3NEZXBlbmRlbmN5IHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wRGVwZW5kZW5jaWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyNiIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIHN0cnVjdHVyZSwgdGhlIHN1YnBhc3MgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBpdHMgcEFzcGVjdFJlZmVyZW5jZXMgbWVtYmVyIG11c3QgYmUgbGVzcyB0aGFuIHN1YnBhc3NDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAxOTI2KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAxOTI3IiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8gc3RydWN0dXJlLCB0aGUgaW5wdXRBdHRhY2htZW50SW5kZXggbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBpdHMgcEFzcGVjdFJlZmVyZW5jZXMgbWVtYmVyIG11c3QgYmUgbGVzcyB0aGFuIHRoZSB2YWx1ZSBvZiBpbnB1dEF0dGFjaG1lbnRDb3VudCBpbiB0aGUgbWVtYmVyIG9mIHBTdWJwYXNzZXMgaWRlbnRpZmllZCBieSBpdHMgc3VicGFzcyBtZW1iZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyNykifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyOCIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIHN0cnVjdHVyZSwgYW5kIGl0cyBzdWJwYXNzQ291bnQgbWVtYmVyIGlzIG5vdCB6ZXJvLCB0aGF0IG1lbWJlciBtdXN0IGJlIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiBzdWJwYXNzQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyOCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyOSIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIHN0cnVjdHVyZSwgaWYgaXRzIGRlcGVuZGVuY3lDb3VudCBtZW1iZXIgaXMgbm90IHplcm8sIGl0IG11c3QgYmUgZXF1YWwgdG8gZGVwZW5kZW5jeUNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5MjkpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5MzAiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyBzdHJ1Y3R1cmUsIGZvciBlYWNoIG5vbi16ZXJvIGVsZW1lbnQgb2YgcFZpZXdPZmZzZXRzLCB0aGUgc3JjU3VicGFzcyBhbmQgZHN0U3VicGFzcyBtZW1iZXJzIG9mIHBEZXBlbmRlbmNpZXMgYXQgdGhlIHNhbWUgaW5kZXggbXVzdCBub3QgYmUgZXF1YWwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkzMCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTk2MyIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIHN0cnVjdHVyZSwgZm9yIGFueSBlbGVtZW50IG9mIHRoZSBwSW5wdXRBdHRhY2htZW50cyBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcFN1YnBhc3NlcyB3aGVyZSB0aGUgYXR0YWNobWVudCBtZW1iZXIgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvOjpwQXNwZWN0UmVmZXJlbmNlcyBtdXN0IG9ubHkgaW5jbHVkZSBhc3BlY3RzIHRoYXQgYXJlIHByZXNlbnQgaW4gaW1hZ2VzIG9mIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50IG9mIHBBdHRhY2htZW50cyBhdCBhdHRhY2htZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5NjMpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDI1MTIiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyBzdHJ1Y3R1cmUsIGZvciBhbnkgZWxlbWVudCBvZiBwRGVwZW5kZW5jaWVzIHdpdGggYSBkZXBlbmRlbmN5RmxhZ3MgbWVtYmVyIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklULCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoZSBwVmlld09mZnNldHMgbWVtYmVyIG9mIHRoYXQgVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyBpbnN0YW5jZSBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMjUxMikifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMjUxMyIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIHN0cnVjdHVyZSwgZWxlbWVudHMgb2YgaXRzIHBWaWV3TWFza3MgbWVtYmVyIG11c3QgZWl0aGVyIGFsbCBiZSAwLCBvciBhbGwgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMjUxMykifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMjUxNCIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIHN0cnVjdHVyZSwgYW5kIGVhY2ggZWxlbWVudCBvZiBpdHMgcFZpZXdNYXNrcyBtZW1iZXIgaXMgMCwgdGhlIGRlcGVuZGVuY3lGbGFncyBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBEZXBlbmRlbmNpZXMgbXVzdCBub3QgaW5jbHVkZSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDI1MTQpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDI1MTUiLCAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mbyBzdHJ1Y3R1cmUsIGFuZCBlYWNoIGVsZW1lbnQgb2YgaXRzIHBWaWV3TWFza3MgbWVtYmVyIGlzIDAsIGNvcnJlbGF0ZWRWaWV3TWFza0NvdW50IG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAyNTE1KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAyNTE2IiwgIklmIHRoZSBwTmV4dCBjaGFpbiBpbmNsdWRlcyBhIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gc3RydWN0dXJlLCBlYWNoIGVsZW1lbnQgb2YgaXRzIHBWaWV3TWFzayBtZW1iZXIgbXVzdCBub3QgaGF2ZSBhIGJpdCBzZXQgYXQgYW4gaW5kZXggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEZyYW1lYnVmZmVyTGF5ZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDI1MTYpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhULCBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvLCBvciBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcFN1YnBhc3Nlcy1wYXJhbWV0ZXIiLCAicFN1YnBhc3NlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdWJwYXNzQ291bnQgdmFsaWQgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBTdWJwYXNzZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUiLCAiRWFjaCBzVHlwZSBtZW1iZXIgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgdW5pcXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXNyY1N1YnBhc3MtMDI1MTciLCAiVGhlIHNyY1N1YnBhc3MgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwRGVwZW5kZW5jaWVzIG11c3QgYmUgbGVzcyB0aGFuIHN1YnBhc3NDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXNyY1N1YnBhc3MtMDI1MTcpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tc3VicGFzc0NvdW50LWFycmF5bGVuZ3RoIiwgInN1YnBhc3NDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tc3VicGFzc0NvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1Ob25lLTAzMDQ5IiwgIklmIGFueSB0d28gc3VicGFzc2VzIG9wZXJhdGUgb24gYXR0YWNobWVudHMgd2l0aCBvdmVybGFwcGluZyByYW5nZXMgb2YgdGhlIHNhbWUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0LCBhbmQgYXQgbGVhc3Qgb25lIHN1YnBhc3Mgd3JpdGVzIHRvIHRoYXQgYXJlYSBvZiBWa0RldmljZU1lbW9yeSwgYSBzdWJwYXNzIGRlcGVuZGVuY3kgbXVzdCBiZSBpbmNsdWRlZCAoZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSBzb21lIGludGVybWVkaWF0ZSBzdWJwYXNzZXMpIGJldHdlZW4gdGhlbSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1Ob25lLTAzMDQ5KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1hdHRhY2htZW50LTAyNTI1IiwgIklmIHRoZSBhdHRhY2htZW50IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiB0aGUgcElucHV0QXR0YWNobWVudHMgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBTdWJwYXNzZXMgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2YgdGhhdCBlbGVtZW50IG9mIHBJbnB1dEF0dGFjaG1lbnRzIG11c3Qgb25seSBpbmNsdWRlIGFzcGVjdHMgdGhhdCBhcmUgcHJlc2VudCBpbiBpbWFnZXMgb2YgdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlIGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIHNwZWNpZmllZCBieSBhdHRhY2htZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLWF0dGFjaG1lbnQtMDI1MjUpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLWF0dGFjaG1lbnQtMDMwNTAiLCAiSWYgdGhlIGF0dGFjaG1lbnQgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBJbnB1dEF0dGFjaG1lbnRzLCBwQ29sb3JBdHRhY2htZW50cywgcFJlc29sdmVBdHRhY2htZW50cyBvciBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCwgb3IgdGhlIGF0dGFjaG1lbnQgaW5kZXhlZCBieSBhbnkgZWxlbWVudCBvZiBwUHJlc2VydmVBdHRhY2htZW50cyBpbiBhbnkgZ2l2ZW4gZWxlbWVudCBvZiBwU3VicGFzc2VzIGlzIGJvdW5kIHRvIGEgcmFuZ2Ugb2YgYSBWa0RldmljZU1lbW9yeSBvYmplY3QgdGhhdCBvdmVybGFwcyB3aXRoIGFueSBvdGhlciBhdHRhY2htZW50IGluIGFueSBzdWJwYXNzIChpbmNsdWRpbmcgdGhlIHNhbWUgc3VicGFzcyksIHRoZSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgc3RydWN0dXJlcyBkZXNjcmliaW5nIHRoZW0gbXVzdCBpbmNsdWRlIFZLX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fTUFZX0FMSUFTX0JJVCBpbiBmbGFncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1hdHRhY2htZW50LTAzMDUwKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1hdHRhY2htZW50LTAzMDUxIiwgIklmIHRoZSBhdHRhY2htZW50IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwSW5wdXRBdHRhY2htZW50cywgcENvbG9yQXR0YWNobWVudHMsIHBSZXNvbHZlQXR0YWNobWVudHMgb3IgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQsIG9yIGFueSBlbGVtZW50IG9mIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzIGluIGFueSBnaXZlbiBlbGVtZW50IG9mIHBTdWJwYXNzZXMgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBpdCBtdXN0IGJlIGxlc3MgdGhhbiBhdHRhY2htZW50Q291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItYXR0YWNobWVudC0wMzA1MSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItZHN0U3VicGFzcy0wMjUyNyIsICJUaGUgZHN0U3VicGFzcyBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBEZXBlbmRlbmNpZXMgbXVzdCBiZSBsZXNzIHRoYW4gc3VicGFzc0NvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLWRzdFN1YnBhc3MtMDI1MjcpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcEF0dGFjaG1lbnRzLTAyNTIyIiwgIkZvciBhbnkgbWVtYmVyIG9mIHBBdHRhY2htZW50cyB3aXRoIGEgbG9hZE9wIGVxdWFsIHRvIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwgdGhlIGZpcnN0IHVzZSBvZiB0aGF0IGF0dGFjaG1lbnQgbXVzdCBub3Qgc3BlY2lmeSBhIGxheW91dCBlcXVhbCB0byBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wQXR0YWNobWVudHMtMDI1MjIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBBdHRhY2htZW50cy0wMjUyMyIsICJGb3IgYW55IG1lbWJlciBvZiBwQXR0YWNobWVudHMgd2l0aCBhIHN0ZW5jaWxMb2FkT3AgZXF1YWwgdG8gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSLCB0aGUgZmlyc3QgdXNlIG9mIHRoYXQgYXR0YWNobWVudCBtdXN0IG5vdCBzcGVjaWZ5IGEgbGF5b3V0IGVxdWFsIHRvIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCBvciBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wQXR0YWNobWVudHMtMDI1MjMpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgYXR0YWNobWVudENvdW50IGlzIG5vdCAwLCBwQXR0YWNobWVudHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYXR0YWNobWVudENvdW50IHZhbGlkIFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBBdHRhY2htZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBDb3JyZWxhdGVkVmlld01hc2tzLTAzMDU2IiwgIlRoZSBzZXQgb2YgYml0cyBpbmNsdWRlZCBpbiBhbnkgZWxlbWVudCBvZiBwQ29ycmVsYXRlZFZpZXdNYXNrcyBtdXN0IG5vdCBvdmVybGFwIHdpdGggdGhlIHNldCBvZiBiaXRzIGluY2x1ZGVkIGluIGFueSBvdGhlciBlbGVtZW50IG9mIHBDb3JyZWxhdGVkVmlld01hc2tzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBDb3JyZWxhdGVkVmlld01hc2tzLTAzMDU2KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wQ29ycmVsYXRlZFZpZXdNYXNrcy1wYXJhbWV0ZXIiLCAiSWYgY29ycmVsYXRlZFZpZXdNYXNrQ291bnQgaXMgbm90IDAsIHBDb3JyZWxhdGVkVmlld01hc2tzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvcnJlbGF0ZWRWaWV3TWFza0NvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wQ29ycmVsYXRlZFZpZXdNYXNrcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBEZXBlbmRlbmNpZXMtMDMwNTQiLCAiRm9yIGFueSBlbGVtZW50IG9mIHBEZXBlbmRlbmNpZXMsIGlmIHRoZSBzcmNTdWJwYXNzIGlzIG5vdCBWS19TVUJQQVNTX0VYVEVSTkFMLCBhbGwgc3RhZ2UgZmxhZ3MgaW5jbHVkZWQgaW4gdGhlIHNyY1N0YWdlTWFzayBtZW1iZXIgb2YgdGhhdCBkZXBlbmRlbmN5IG11c3QgYmUgYSBwaXBlbGluZSBzdGFnZSBzdXBwb3J0ZWQgYnkgdGhlIHBpcGVsaW5lIGlkZW50aWZpZWQgYnkgdGhlIHBpcGVsaW5lQmluZFBvaW50IG1lbWJlciBvZiB0aGUgc291cmNlIHN1YnBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcERlcGVuZGVuY2llcy0wMzA1NCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcERlcGVuZGVuY2llcy0wMzA1NSIsICJGb3IgYW55IGVsZW1lbnQgb2YgcERlcGVuZGVuY2llcywgaWYgdGhlIGRzdFN1YnBhc3MgaXMgbm90IFZLX1NVQlBBU1NfRVhURVJOQUwsIGFsbCBzdGFnZSBmbGFncyBpbmNsdWRlZCBpbiB0aGUgZHN0U3RhZ2VNYXNrIG1lbWJlciBvZiB0aGF0IGRlcGVuZGVuY3kgbXVzdCBiZSBhIHBpcGVsaW5lIHN0YWdlIHN1cHBvcnRlZCBieSB0aGUgcGlwZWxpbmUgaWRlbnRpZmllZCBieSB0aGUgcGlwZWxpbmVCaW5kUG9pbnQgbWVtYmVyIG9mIHRoZSBkZXN0aW5hdGlvbiBzdWJwYXNzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBEZXBlbmRlbmNpZXMtMDMwNTUpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBEZXBlbmRlbmNpZXMtMDMwNjAiLCAiRm9yIGFueSBlbGVtZW50IG9mIHBEZXBlbmRlbmNpZXMgd2hlcmUgaXRzIHNyY1N1YnBhc3MgbWVtYmVyIGVxdWFscyBpdHMgZHN0U3VicGFzcyBtZW1iZXIsIGlmIHRoZSB2aWV3TWFzayBtZW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBwU3VicGFzc2VzIGluY2x1ZGVzIG1vcmUgdGhhbiBvbmUgYml0LCBpdHMgZGVwZW5kZW5jeUZsYWdzIG1lbWJlciBtdXN0IGluY2x1ZGUgVktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLTAzMDYwKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLXBhcmFtZXRlciIsICJJZiBkZXBlbmRlbmN5Q291bnQgaXMgbm90IDAsIHBEZXBlbmRlbmNpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVwZW5kZW5jeUNvdW50IHZhbGlkIFZrU3VicGFzc0RlcGVuZGVuY3kyS0hSIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcERlcGVuZGVuY2llcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wU3VicGFzc2VzLXBhcmFtZXRlciIsICJwU3VicGFzc2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN1YnBhc3NDb3VudCB2YWxpZCBWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wU3VicGFzc2VzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GT18yX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItc3JjU3VicGFzcy0wMjUyNiIsICJUaGUgc3JjU3VicGFzcyBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBEZXBlbmRlbmNpZXMgbXVzdCBiZSBsZXNzIHRoYW4gc3VicGFzc0NvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXNyY1N1YnBhc3MtMDI1MjYpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXN1YnBhc3NDb3VudC1hcnJheWxlbmd0aCIsICJzdWJwYXNzQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1zdWJwYXNzQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXZpZXdNYXNrLTAyNTI0IiwgIlRoZSB2aWV3TWFzayBtZW1iZXIgbXVzdCBub3QgaGF2ZSBhIGJpdCBzZXQgYXQgYW4gaW5kZXggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEZyYW1lYnVmZmVyTGF5ZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXZpZXdNYXNrLTAyNTI0KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi12aWV3TWFzay0wMzA1NyIsICJJZiB0aGUgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSOjp2aWV3TWFzayBtZW1iZXIgb2YgYWxsIGVsZW1lbnRzIG9mIHBTdWJwYXNzZXMgaXMgMCwgY29ycmVsYXRlZFZpZXdNYXNrQ291bnQgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXZpZXdNYXNrLTAzMDU3KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi12aWV3TWFzay0wMzA1OCIsICJUaGUgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSOjp2aWV3TWFzayBtZW1iZXIgb2YgYWxsIGVsZW1lbnRzIG9mIHBTdWJwYXNzZXMgbXVzdCBlaXRoZXIgYWxsIGJlIDAsIG9yIGFsbCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi12aWV3TWFzay0wMzA1OCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItdmlld01hc2stMDMwNTkiLCAiSWYgdGhlIFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUjo6dmlld01hc2sgbWVtYmVyIG9mIGFsbCBlbGVtZW50cyBvZiBwU3VicGFzc2VzIGlzIDAsIHRoZSBkZXBlbmRlbmN5RmxhZ3MgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBEZXBlbmRlbmNpZXMgbXVzdCBub3QgaW5jbHVkZSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXZpZXdNYXNrLTAzMDU5KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhULWZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQtMDI1NDciLCAiSWYgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgbXVzdCBiZSBsZXNzIHRoYW4gVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzo6YXR0YWNobWVudENvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC0wMjU0NykifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LTAyNTQ4IiwgIklmIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBmcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50IG11c3Qgbm90IGJlIGFuIGVsZW1lbnQgb2YgVmtTdWJwYXNzRGVzY3JpcHRpb246OnBJbnB1dEF0dGFjaG1lbnRzLCBWa1N1YnBhc3NEZXNjcmlwdGlvbjo6cENvbG9yQXR0YWNobWVudHMsIFZrU3VicGFzc0Rlc2NyaXB0aW9uOjpwUmVzb2x2ZUF0dGFjaG1lbnRzLCBWa1N1YnBhc3NEZXNjcmlwdGlvbjo6cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQsIG9yIFZrU3VicGFzc0Rlc2NyaXB0aW9uOjpwUHJlc2VydmVBdHRhY2htZW50cyBmb3IgYW55IHN1YnBhc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LTAyNTQ4KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhULWZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQtMDI1NDkiLCAiSWYgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIGxheW91dCBtdXN0IGJlIGVxdWFsIHRvIFZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVCwgb3IgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LTAyNTQ5KSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhULWZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQtMDI1NTAiLCAiSWYgZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudCBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgbXVzdCByZWZlcmVuY2UgYW4gYXR0YWNobWVudCB3aXRoIGEgbG9hZE9wIGVxdWFsIHRvIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FEIG9yIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC0wMjU1MCkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LTAyNTUxIiwgIklmIGZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCBmcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50IG11c3QgcmVmZXJlbmNlIGFuIGF0dGFjaG1lbnQgd2l0aCBhIHN0b3JlT3AgZXF1YWwgdG8gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC0wMjU1MSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LXBhcmFtZXRlciIsICJmcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50IG11c3QgYmUgYSB2YWxpZCBWa0F0dGFjaG1lbnRSZWZlcmVuY2Ugc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19GUkFHTUVOVF9ERU5TSVRZX01BUF9DUkVBVEVfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mby1hc3BlY3RSZWZlcmVuY2VDb3VudC1hcnJheWxlbmd0aCIsICJhc3BlY3RSZWZlcmVuY2VDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8tYXNwZWN0UmVmZXJlbmNlQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8tcEFzcGVjdFJlZmVyZW5jZXMtcGFyYW1ldGVyIiwgInBBc3BlY3RSZWZlcmVuY2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGFzcGVjdFJlZmVyZW5jZUNvdW50IHZhbGlkIFZrSW5wdXRBdHRhY2htZW50QXNwZWN0UmVmZXJlbmNlIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzSW5wdXRBdHRhY2htZW50QXNwZWN0Q3JlYXRlSW5mby1wQXNwZWN0UmVmZXJlbmNlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc0lucHV0QXR0YWNobWVudEFzcGVjdENyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19JTlBVVF9BVFRBQ0hNRU5UX0FTUEVDVF9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvLXBDb3JyZWxhdGlvbk1hc2tzLTAwODQxIiwgIkVhY2ggdmlldyBpbmRleCBtdXN0IG5vdCBiZSBzZXQgaW4gbW9yZSB0aGFuIG9uZSBlbGVtZW50IG9mIHBDb3JyZWxhdGlvbk1hc2tzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8tcENvcnJlbGF0aW9uTWFza3MtMDA4NDEpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8tcENvcnJlbGF0aW9uTWFza3MtcGFyYW1ldGVyIiwgIklmIGNvcnJlbGF0aW9uTWFza0NvdW50IGlzIG5vdCAwLCBwQ29ycmVsYXRpb25NYXNrcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjb3JyZWxhdGlvbk1hc2tDb3VudCB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby1wQ29ycmVsYXRpb25NYXNrcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8tcFZpZXdNYXNrcy1wYXJhbWV0ZXIiLCAiSWYgc3VicGFzc0NvdW50IGlzIG5vdCAwLCBwVmlld01hc2tzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN1YnBhc3NDb3VudCB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby1wVmlld01hc2tzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby1wVmlld09mZnNldHMtcGFyYW1ldGVyIiwgIklmIGRlcGVuZGVuY3lDb3VudCBpcyBub3QgMCwgcFZpZXdPZmZzZXRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlcGVuZGVuY3lDb3VudCBpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvLXBWaWV3T2Zmc2V0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhULXBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucy1wYXJhbWV0ZXIiLCAiSWYgYXR0YWNobWVudEluaXRpYWxTYW1wbGVMb2NhdGlvbnNDb3VudCBpcyBub3QgMCwgcEF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGF0dGFjaG1lbnRJbml0aWFsU2FtcGxlTG9jYXRpb25zQ291bnQgdmFsaWQgVmtBdHRhY2htZW50U2FtcGxlTG9jYXRpb25zRVhUIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtSZW5kZXJQYXNzU2FtcGxlTG9jYXRpb25zQmVnaW5JbmZvRVhULXBBdHRhY2htZW50SW5pdGlhbFNhbXBsZUxvY2F0aW9ucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVC1wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIiwgIklmIHBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zQ291bnQgaXMgbm90IDAsIHBQb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9ucyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb3N0U3VicGFzc1NhbXBsZUxvY2F0aW9uc0NvdW50IHZhbGlkIFZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVC1wUG9zdFN1YnBhc3NTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19TQU1QTEVfTE9DQVRJT05TX0JFR0lOX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXBTYW1wbGVMb2NhdGlvbnMtcGFyYW1ldGVyIiwgIklmIHNhbXBsZUxvY2F0aW9uc0NvdW50IGlzIG5vdCAwLCBwU2FtcGxlTG9jYXRpb25zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNhbXBsZUxvY2F0aW9uc0NvdW50IFZrU2FtcGxlTG9jYXRpb25FWFQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQtcFNhbXBsZUxvY2F0aW9ucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQtc2FtcGxlTG9jYXRpb25zQ291bnQtMDE1MjciLCAic2FtcGxlTG9jYXRpb25zQ291bnQgbXVzdCBlcXVhbCBzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbCB7dGltZXN9IHNhbXBsZUxvY2F0aW9uR3JpZFNpemUud2lkdGgge3RpbWVzfSBzYW1wbGVMb2NhdGlvbkdyaWRTaXplLmhlaWdodCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQtc2FtcGxlTG9jYXRpb25zQ291bnQtMDE1MjcpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbC0wMTUyNiIsICJzYW1wbGVMb2NhdGlvbnNQZXJQaXhlbCBtdXN0IGJlIGEgYml0IHZhbHVlIHRoYXQgaXMgc2V0IGluIFZrUGh5c2ljYWxEZXZpY2VTYW1wbGVMb2NhdGlvbnNQcm9wZXJ0aWVzRVhUOjpzYW1wbGVMb2NhdGlvblNhbXBsZUNvdW50cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQtc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwtMDE1MjYpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVC1zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbC1wYXJhbWV0ZXIiLCAiSWYgc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwgaXMgbm90IDAsIHNhbXBsZUxvY2F0aW9uc1BlclBpeGVsIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVMb2NhdGlvbnNJbmZvRVhULXNhbXBsZUxvY2F0aW9uc1BlclBpeGVsLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1Ob25lLTAxNjQ3IiwgIlRoZSBzYW1wbGVyIHJlZHVjdGlvbiBtb2RlIG11c3QgYmUgc2V0IHRvIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfV0VJR0hURURfQVZFUkFHRV9FWFQgaWYgc2FtcGxlciBZJ0NCQ1IgY29udmVyc2lvbiBpcyBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tTm9uZS0wMTY0NykifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVUtMDEwNzgiLCAiSWYgYW55IG9mIGFkZHJlc3NNb2RlVSwgYWRkcmVzc01vZGVWIG9yIGFkZHJlc3NNb2RlVyBhcmUgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSLCBib3JkZXJDb2xvciBtdXN0IGJlIGEgdmFsaWQgVmtCb3JkZXJDb2xvciB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWFkZHJlc3NNb2RlVS0wMTA3OCkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVUtMDEwNzkiLCAiSWYgdGhlIFZLX0tIUl9zYW1wbGVyX21pcnJvcl9jbGFtcF90b19lZGdlIGV4dGVuc2lvbiBpcyBub3QgZW5hYmxlZCwgYWRkcmVzc01vZGVVLCBhZGRyZXNzTW9kZVYgYW5kIGFkZHJlc3NNb2RlVyBtdXN0IG5vdCBiZSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWFkZHJlc3NNb2RlVS0wMTA3OSkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVUtMDE2NDYiLCAiSWYgc2FtcGxlciBZJ0NCQ1IgY29udmVyc2lvbiBpcyBlbmFibGVkLCBhZGRyZXNzTW9kZVUsIGFkZHJlc3NNb2RlViwgYW5kIGFkZHJlc3NNb2RlVyBtdXN0IGJlIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UsIGFuaXNvdHJvcHlFbmFibGUgbXVzdCBiZSBWS19GQUxTRSwgYW5kIHVubm9ybWFsaXplZENvb3JkaW5hdGVzIG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVUtMDE2NDYpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYWRkcmVzc01vZGVVLXBhcmFtZXRlciIsICJhZGRyZXNzTW9kZVUgbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlckFkZHJlc3NNb2RlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYWRkcmVzc01vZGVVLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVYtcGFyYW1ldGVyIiwgImFkZHJlc3NNb2RlViBtdXN0IGJlIGEgdmFsaWQgVmtTYW1wbGVyQWRkcmVzc01vZGUgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVYtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWFkZHJlc3NNb2RlVy1wYXJhbWV0ZXIiLCAiYWRkcmVzc01vZGVXIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZXJBZGRyZXNzTW9kZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWFkZHJlc3NNb2RlVy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYW5pc290cm9weUVuYWJsZS0wMTA3MCIsICJJZiB0aGUgYW5pc290cm9waWMgc2FtcGxpbmcgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5pc290cm9weUVuYWJsZSBtdXN0IGJlIFZLX0ZBTFNFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYW5pc290cm9weUVuYWJsZS0wMTA3MCkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hbmlzb3Ryb3B5RW5hYmxlLTAxMDcxIiwgIklmIGFuaXNvdHJvcHlFbmFibGUgaXMgVktfVFJVRSwgbWF4QW5pc290cm9weSBtdXN0IGJlIGJldHdlZW4gMS4wIGFuZCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhTYW1wbGVyQW5pc290cm9weSwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYW5pc290cm9weUVuYWJsZS0wMTA3MSkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1jb21wYXJlRW5hYmxlLTAxMDgwIiwgIklmIGNvbXBhcmVFbmFibGUgaXMgVktfVFJVRSwgY29tcGFyZU9wIG11c3QgYmUgYSB2YWxpZCBWa0NvbXBhcmVPcCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWNvbXBhcmVFbmFibGUtMDEwODApIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tY29tcGFyZUVuYWJsZS0wMTQyMyIsICJJZiBjb21wYXJlRW5hYmxlIGlzIFZLX1RSVUUsIHRoZSByZWR1Y3Rpb25Nb2RlIG1lbWJlciBvZiBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCBtdXN0IGJlIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfV0VJR0hURURfQVZFUkFHRV9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1jb21wYXJlRW5hYmxlLTAxNDIzKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTc0IiwgIklmIGZsYWdzIGluY2x1ZGVzIFZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVCwgdGhlbiBtaW5GaWx0ZXIgYW5kIG1hZ0ZpbHRlciBtdXN0IGJlIGVxdWFsLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTc0KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTc1IiwgIklmIGZsYWdzIGluY2x1ZGVzIFZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVCwgdGhlbiBtaXBtYXBNb2RlIG11c3QgYmUgVktfU0FNUExFUl9NSVBNQVBfTU9ERV9ORUFSRVNULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTc1KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTc2IiwgIklmIGZsYWdzIGluY2x1ZGVzIFZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVCwgdGhlbiBtaW5Mb2QgYW5kIG1heExvZCBtdXN0IGJlIHplcm8uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tZmxhZ3MtMDI1NzYpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tZmxhZ3MtMDI1NzciLCAiSWYgZmxhZ3MgaW5jbHVkZXMgVktfU0FNUExFUl9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhULCB0aGVuIGFkZHJlc3NNb2RlVSBhbmQgYWRkcmVzc01vZGVWIG11c3QgZWFjaCBiZSBlaXRoZXIgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRSBvciBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19CT1JERVIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tZmxhZ3MtMDI1NzcpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tZmxhZ3MtMDI1NzgiLCAiSWYgZmxhZ3MgaW5jbHVkZXMgVktfU0FNUExFUl9DUkVBVEVfU1VCU0FNUExFRF9CSVRfRVhULCB0aGVuIGFuaXNvdHJvcHlFbmFibGUgbXVzdCBiZSBWS19GQUxTRS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1mbGFncy0wMjU3OCkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1mbGFncy0wMjU3OSIsICJJZiBmbGFncyBpbmNsdWRlcyBWS19TQU1QTEVSX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQsIHRoZW4gY29tcGFyZUVuYWJsZSBtdXN0IGJlIFZLX0ZBTFNFLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTc5KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTgwIiwgIklmIGZsYWdzIGluY2x1ZGVzIFZLX1NBTVBMRVJfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVCwgdGhlbiB1bm5vcm1hbGl6ZWRDb29yZGluYXRlcyBtdXN0IGJlIFZLX0ZBTFNFLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLTAyNTgwKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtTYW1wbGVyQ3JlYXRlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1hZ0ZpbHRlci0wMTA4MSIsICJJZiBlaXRoZXIgbWFnRmlsdGVyIG9yIG1pbkZpbHRlciBpcyBWS19GSUxURVJfQ1VCSUNfRVhULCBhbmlzb3Ryb3B5RW5hYmxlIG11c3QgYmUgVktfRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1tYWdGaWx0ZXItMDEwODEpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWFnRmlsdGVyLTAxNDIyIiwgIklmIGVpdGhlciBtYWdGaWx0ZXIgb3IgbWluRmlsdGVyIGlzIFZLX0ZJTFRFUl9DVUJJQ19FWFQsIHRoZSByZWR1Y3Rpb25Nb2RlIG1lbWJlciBvZiBWa1NhbXBsZXJSZWR1Y3Rpb25Nb2RlQ3JlYXRlSW5mb0VYVCBtdXN0IGJlIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfV0VJR0hURURfQVZFUkFHRV9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1tYWdGaWx0ZXItMDE0MjIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWFnRmlsdGVyLXBhcmFtZXRlciIsICJtYWdGaWx0ZXIgbXVzdCBiZSBhIHZhbGlkIFZrRmlsdGVyIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWFnRmlsdGVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1tYXhMb2QtMDE5NzMiLCAibWF4TG9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pbkxvZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1heExvZC0wMTk3MykifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1taW5GaWx0ZXItMDE2NDUiLCAiSWYgc2FtcGxlciBZJ0NCQ1IgY29udmVyc2lvbiBpcyBlbmFibGVkIGFuZCBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVCBpcyBub3Qgc2V0IGZvciB0aGUgZm9ybWF0LCBtaW5GaWx0ZXIgYW5kIG1hZ0ZpbHRlciBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzYW1wbGVyIFknQ0JDUiBjb252ZXJzaW9uJ3MgY2hyb21hRmlsdGVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWluRmlsdGVyLTAxNjQ1KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1pbkZpbHRlci1wYXJhbWV0ZXIiLCAibWluRmlsdGVyIG11c3QgYmUgYSB2YWxpZCBWa0ZpbHRlciB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1pbkZpbHRlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWlwTG9kQmlhcy0wMTA2OSIsICJUaGUgYWJzb2x1dGUgdmFsdWUgb2YgbWlwTG9kQmlhcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhTYW1wbGVyTG9kQmlhcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1pcExvZEJpYXMtMDEwNjkpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWlwbWFwTW9kZS1wYXJhbWV0ZXIiLCAibWlwbWFwTW9kZSBtdXN0IGJlIGEgdmFsaWQgVmtTYW1wbGVyTWlwbWFwTW9kZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1pcG1hcE1vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgIkVhY2ggcE5leHQgbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQgb3IgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9DUkVBVEVfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXNUeXBlLXVuaXF1ZSIsICJFYWNoIHNUeXBlIG1lbWJlciBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSB1bmlxdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1zVHlwZS11bmlxdWUpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzIiLCAiSWYgdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgaXMgVktfVFJVRSwgbWluRmlsdGVyIGFuZCBtYWdGaWx0ZXIgbXVzdCBiZSBlcXVhbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDcyKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDczIiwgIklmIHVubm9ybWFsaXplZENvb3JkaW5hdGVzIGlzIFZLX1RSVUUsIG1pcG1hcE1vZGUgbXVzdCBiZSBWS19TQU1QTEVSX01JUE1BUF9NT0RFX05FQVJFU1QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3MykifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3NCIsICJJZiB1bm5vcm1hbGl6ZWRDb29yZGluYXRlcyBpcyBWS19UUlVFLCBtaW5Mb2QgYW5kIG1heExvZCBtdXN0IGJlIHplcm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3NCkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3NSIsICJJZiB1bm5vcm1hbGl6ZWRDb29yZGluYXRlcyBpcyBWS19UUlVFLCBhZGRyZXNzTW9kZVUgYW5kIGFkZHJlc3NNb2RlViBtdXN0IGVhY2ggYmUgZWl0aGVyIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0Ugb3IgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzUpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzYiLCAiSWYgdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgaXMgVktfVFJVRSwgYW5pc290cm9weUVuYWJsZSBtdXN0IGJlIFZLX0ZBTFNFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzYpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzciLCAiSWYgdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgaXMgVktfVFJVRSwgY29tcGFyZUVuYWJsZSBtdXN0IGJlIFZLX0ZBTFNFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzcpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhULXJlZHVjdGlvbk1vZGUtcGFyYW1ldGVyIiwgInJlZHVjdGlvbk1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlclJlZHVjdGlvbk1vZGVFWFQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQtcmVkdWN0aW9uTW9kZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclJlZHVjdGlvbk1vZGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9DUkVBVEVfSU5GT19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyUmVkdWN0aW9uTW9kZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tY2hyb21hRmlsdGVyLTAxNjU3IiwgIklmIHRoZSBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fTElORUFSX0ZJTFRFUl9CSVQsIGNocm9tYUZpbHRlciBtdXN0IGJlIFZLX0ZJTFRFUl9ORUFSRVNUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tY2hyb21hRmlsdGVyLTAxNjU3KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNocm9tYUZpbHRlci1wYXJhbWV0ZXIiLCAiY2hyb21hRmlsdGVyIG11c3QgYmUgYSB2YWxpZCBWa0ZpbHRlciB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNocm9tYUZpbHRlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tY29tcG9uZW50cy0wMjU4MSIsICJJZiB0aGUgZm9ybWF0IGhhcyBhIF80MjIgb3IgXzQyMCBzdWZmaXgsIHRoZW4gY29tcG9uZW50cy5nIG11c3QgYmUgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jb21wb25lbnRzLTAyNTgxKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNvbXBvbmVudHMtMDI1ODIiLCAiSWYgdGhlIGZvcm1hdCBoYXMgYSBfNDIyIG9yIF80MjAgc3VmZml4LCB0aGVuIGNvbXBvbmVudHMuYSBtdXN0IGJlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLCBWS19DT01QT05FTlRfU1dJWlpMRV9PTkUsIG9yIFZLX0NPTVBPTkVOVF9TV0laWkxFX1pFUk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jb21wb25lbnRzLTAyNTgyKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNvbXBvbmVudHMtMDI1ODMiLCAiSWYgdGhlIGZvcm1hdCBoYXMgYSBfNDIyIG9yIF80MjAgc3VmZml4LCB0aGVuIGNvbXBvbmVudHMuciBtdXN0IGJlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZIG9yIFZLX0NPTVBPTkVOVF9TV0laWkxFX0IgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jb21wb25lbnRzLTAyNTgzKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNvbXBvbmVudHMtMDI1ODQiLCAiSWYgdGhlIGZvcm1hdCBoYXMgYSBfNDIyIG9yIF80MjAgc3VmZml4LCB0aGVuIGNvbXBvbmVudHMuYiBtdXN0IGJlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZIG9yIFZLX0NPTVBPTkVOVF9TV0laWkxFX1IgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jb21wb25lbnRzLTAyNTg0KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNvbXBvbmVudHMtMDI1ODUiLCAiSWYgdGhlIGZvcm1hdCBoYXMgYSBfNDIyIG9yIF80MjAgc3VmZml4LCBhbmQgaWYgZWl0aGVyIGNvbXBvbmVudHMuciBvciBjb21wb25lbnRzLmIgaXMgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIGJvdGggdmFsdWVzIG11c3QgYmUgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jb21wb25lbnRzLTAyNTg1KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWNvbXBvbmVudHMtcGFyYW1ldGVyIiwgImNvbXBvbmVudHMgbXVzdCBiZSBhIHZhbGlkIFZrQ29tcG9uZW50TWFwcGluZyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1jb21wb25lbnRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb24tMDE2NTYiLCAiSWYgdGhlIGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9DSFJPTUFfUkVDT05TVFJVQ1RJT05fRVhQTElDSVRfRk9SQ0VBQkxFX0JJVCwgZm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uIG11c3QgYmUgRkFMU0UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JjZUV4cGxpY2l0UmVjb25zdHJ1Y3Rpb24tMDE2NTYpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tZm9ybWF0LTAxNjQ5IiwgImZvcm1hdCBtdXN0IG5vdCBiZSBWS19GT1JNQVRfVU5ERUZJTkVEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tZm9ybWF0LTAxNjQ5KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC0wMTY1MCIsICJmb3JtYXQgbXVzdCBzdXBwb3J0IFZLX0ZPUk1BVF9GRUFUVVJFX01JRFBPSU5UX0NIUk9NQV9TQU1QTEVTX0JJVCBvciBWS19GT1JNQVRfRkVBVFVSRV9DT1NJVEVEX0NIUk9NQV9TQU1QTEVTX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC0wMTY1MCkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JtYXQtMDE2NTMiLCAiZm9ybWF0IG11c3QgcmVwcmVzZW50IHVuc2lnbmVkIG5vcm1hbGl6ZWQgdmFsdWVzIChpLmUuIHRoZSBmb3JtYXQgbXVzdCBiZSBhIFVOT1JNIGZvcm1hdCkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JtYXQtMDE2NTMpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tZm9ybWF0LTAxOTA0IiwgIklmIGFuIGV4dGVybmFsIGZvcm1hdCBjb252ZXJzaW9uIGlzIGJlaW5nIGNyZWF0ZWQsIGZvcm1hdCBtdXN0IGJlIFZLX0ZPUk1BVF9VTkRFRklORUQsIG90aGVyd2lzZSBpdCBtdXN0IG5vdCBiZSBWS19GT1JNQVRfVU5ERUZJTkVELiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC0wMTkwNCkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyIiwgImZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby1mb3JtYXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teENocm9tYU9mZnNldC0wMTY1MSIsICJJZiB0aGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgVktfRk9STUFUX0ZFQVRVUkVfQ09TSVRFRF9DSFJPTUFfU0FNUExFU19CSVQsIHhDaHJvbWFPZmZzZXQgYW5kIHlDaHJvbWFPZmZzZXQgbXVzdCBub3QgYmUgVktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXhDaHJvbWFPZmZzZXQtMDE2NTEpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teENocm9tYU9mZnNldC0wMTY1MiIsICJJZiB0aGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgVktfRk9STUFUX0ZFQVRVUkVfTUlEUE9JTlRfQ0hST01BX1NBTVBMRVNfQklULCB4Q2hyb21hT2Zmc2V0IGFuZCB5Q2hyb21hT2Zmc2V0IG11c3Qgbm90IGJlIFZLX0NIUk9NQV9MT0NBVElPTl9NSURQT0lOVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXhDaHJvbWFPZmZzZXQtMDE2NTIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teENocm9tYU9mZnNldC1wYXJhbWV0ZXIiLCAieENocm9tYU9mZnNldCBtdXN0IGJlIGEgdmFsaWQgVmtDaHJvbWFMb2NhdGlvbiB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXhDaHJvbWFPZmZzZXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXlDaHJvbWFPZmZzZXQtcGFyYW1ldGVyIiwgInlDaHJvbWFPZmZzZXQgbXVzdCBiZSBhIHZhbGlkIFZrQ2hyb21hTG9jYXRpb24gdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby15Q2hyb21hT2Zmc2V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby15Y2Jjck1vZGVsLTAxNjU1IiwgIklmIHljYmNyTW9kZWwgaXMgbm90IFZLX1NBTVBMRVJfWUNCQ1JfTU9ERUxfQ09OVkVSU0lPTl9SR0JfSURFTlRJVFksIHRoZW4gY29tcG9uZW50cy5yLCBjb21wb25lbnRzLmcsIGFuZCBjb21wb25lbnRzLmIgbXVzdCBjb3JyZXNwb25kIHRvIGNoYW5uZWxzIG9mIHRoZSBmb3JtYXQ7IHRoYXQgaXMsIGNvbXBvbmVudHMuciwgY29tcG9uZW50cy5nLCBhbmQgY29tcG9uZW50cy5iIG11c3Qgbm90IGJlIFZLX0NPTVBPTkVOVF9TV0laWkxFX1pFUk8gb3IgVktfQ09NUE9ORU5UX1NXSVpaTEVfT05FLCBhbmQgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhIGNoYW5uZWwgd2hpY2ggY29udGFpbnMgemVybyBvciBvbmUgYXMgYSBjb25zZXF1ZW5jZSBvZiBjb252ZXJzaW9uIHRvIFJHQkEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby15Y2Jjck1vZGVsLTAxNjU1KSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLXljYmNyTW9kZWwtcGFyYW1ldGVyIiwgInljYmNyTW9kZWwgbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlclljYmNyTW9kZWxDb252ZXJzaW9uIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JNb2RlbC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JSYW5nZS0wMjc0OCIsICJJZiB5Y2JjclJhbmdlIGlzIFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX05BUlJPVyB0aGVuIHRoZSBSLCBHIGFuZCBCIGNoYW5uZWxzIG9idGFpbmVkIGJ5IGFwcGx5aW5nIHRoZSBjb21wb25lbnQgc3dpenpsZSB0byBmb3JtYXQgbXVzdCBlYWNoIGhhdmUgYSBiaXQtZGVwdGggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDguIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JSYW5nZS0wMjc0OCkifSwKKyAgICB7IlZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mby15Y2JjclJhbmdlLXBhcmFtZXRlciIsICJ5Y2JjclJhbmdlIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZXJZY2JjclJhbmdlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8teWNiY3JSYW5nZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkltYWdlRm9ybWF0UHJvcGVydGllcy1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTUFHRV9GT1JNQVRfUFJPUEVSVElFUyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbWFnZUZvcm1hdFByb3BlcnRpZXMtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8tY29udmVyc2lvbi1wYXJhbWV0ZXIiLCAiY29udmVyc2lvbiBtdXN0IGJlIGEgdmFsaWQgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvLWNvbnZlcnNpb24tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIsICJFYWNoIHBOZXh0IG1lbWJlciBvZiBhbnkgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhpcyBvbmUpIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHZhbGlkIGluc3RhbmNlIG9mIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbywgVmtFeHBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIsIG9yIFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUNyZWF0ZUluZm8tc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTMyIiwgImhhbmRsZVR5cGUgbXVzdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvOjpoYW5kbGVUeXBlcyB3aGVuIHNlbWFwaG9yZSdzIGN1cnJlbnQgcGF5bG9hZCB3YXMgY3JlYXRlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTEzMikifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTEzNCIsICJJZiBoYW5kbGVUeXBlIHJlZmVycyB0byBhIGhhbmRsZSB0eXBlIHdpdGggY29weSBwYXlsb2FkIHRyYW5zZmVyZW5jZSBzZW1hbnRpY3MsIGFzIGRlZmluZWQgYmVsb3cgaW4gSW1wb3J0aW5nIFNlbWFwaG9yZSBQYXlsb2FkcywgdGhlcmUgbXVzdCBiZSBubyBxdWV1ZSB3YWl0aW5nIG9uIHNlbWFwaG9yZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTEzNCkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItaGFuZGxlVHlwZS0wMTEzNSIsICJJZiBoYW5kbGVUeXBlIHJlZmVycyB0byBhIGhhbmRsZSB0eXBlIHdpdGggY29weSBwYXlsb2FkIHRyYW5zZmVyZW5jZSBzZW1hbnRpY3MsIHNlbWFwaG9yZSBtdXN0IGJlIHNpZ25hbGVkLCBvciBoYXZlIGFuIGFzc29jaWF0ZWQgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb24gcGVuZGluZyBleGVjdXRpb24uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDExMzUpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtMDExMzYiLCAiaGFuZGxlVHlwZSBtdXN0IGJlIGRlZmluZWQgYXMgYSBQT1NJWCBmaWxlIGRlc2NyaXB0b3IgaGFuZGxlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTM2KSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAzMjUzIiwgIklmIGhhbmRsZVR5cGUgcmVmZXJzIHRvIGEgaGFuZGxlIHR5cGUgd2l0aCBjb3B5IHBheWxvYWQgdHJhbnNmZXJlbmNlIHNlbWFudGljcywgc2VtYXBob3JlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIFZrU2VtYXBob3JlVHlwZUtIUiBvZiBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAzMjUzKSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAzMjU0IiwgIklmIGhhbmRsZVR5cGUgcmVmZXJzIHRvIGEgaGFuZGxlIHR5cGUgd2l0aCBjb3B5IHBheWxvYWQgdHJhbnNmZXJlbmNlIHNlbWFudGljcywgc2VtYXBob3JlIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIHNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uIHRoYXQgaGFzIGJlZW4gc3VibWl0dGVkIGZvciBleGVjdXRpb24gYW5kIGFueSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbnMgb24gd2hpY2ggaXQgZGVwZW5kcyAoaWYgYW55KSBtdXN0IGhhdmUgYWxzbyBiZWVuIHN1Ym1pdHRlZCBmb3IgZXhlY3V0aW9uLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLTAzMjU0KSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9GRF9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItc2VtYXBob3JlLTAxMTMzIiwgInNlbWFwaG9yZSBtdXN0IG5vdCBjdXJyZW50bHkgaGF2ZSBpdHMgcGF5bG9hZCByZXBsYWNlZCBieSBhbiBpbXBvcnRlZCBwYXlsb2FkIGFzIGRlc2NyaWJlZCBiZWxvdyBpbiBJbXBvcnRpbmcgU2VtYXBob3JlIFBheWxvYWRzIHVubGVzcyB0aGF0IGltcG9ydGVkIHBheWxvYWQncyBoYW5kbGUgdHlwZSB3YXMgaW5jbHVkZWQgaW4gVmtFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXM6OmV4cG9ydEZyb21JbXBvcnRlZEhhbmRsZVR5cGVzIGZvciBoYW5kbGVUeXBlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUdldEZkSW5mb0tIUi1zZW1hcGhvcmUtMDExMzMpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlR2V0RmRJbmZvS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIiLCAic2VtYXBob3JlIG11c3QgYmUgYSB2YWxpZCBWa1NlbWFwaG9yZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVHZXRGZEluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTEyNiIsICJoYW5kbGVUeXBlIG11c3QgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgd2hlbiB0aGUgc2VtYXBob3JlJ3MgY3VycmVudCBwYXlsb2FkIHdhcyBjcmVhdGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTI2KSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLTAxMTI3IiwgIklmIGhhbmRsZVR5cGUgaXMgZGVmaW5lZCBhcyBhbiBOVCBoYW5kbGUsIHZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgbXVzdCBiZSBjYWxsZWQgbm8gbW9yZSB0aGFuIG9uY2UgZm9yIGVhY2ggdmFsaWQgdW5pcXVlIGNvbWJpbmF0aW9uIG9mIHNlbWFwaG9yZSBhbmQgaGFuZGxlVHlwZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTEyNykifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTEyOSIsICJJZiBoYW5kbGVUeXBlIHJlZmVycyB0byBhIGhhbmRsZSB0eXBlIHdpdGggY29weSBwYXlsb2FkIHRyYW5zZmVyZW5jZSBzZW1hbnRpY3MsIGFzIGRlZmluZWQgYmVsb3cgaW4gSW1wb3J0aW5nIFNlbWFwaG9yZSBQYXlsb2FkcywgdGhlcmUgbXVzdCBiZSBubyBxdWV1ZSB3YWl0aW5nIG9uIHNlbWFwaG9yZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTEyOSkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTEzMCIsICJJZiBoYW5kbGVUeXBlIHJlZmVycyB0byBhIGhhbmRsZSB0eXBlIHdpdGggY29weSBwYXlsb2FkIHRyYW5zZmVyZW5jZSBzZW1hbnRpY3MsIHNlbWFwaG9yZSBtdXN0IGJlIHNpZ25hbGVkLCBvciBoYXZlIGFuIGFzc29jaWF0ZWQgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb24gcGVuZGluZyBleGVjdXRpb24uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDExMzApIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLWhhbmRsZVR5cGUtMDExMzEiLCAiaGFuZGxlVHlwZSBtdXN0IGJlIGRlZmluZWQgYXMgYW4gTlQgaGFuZGxlIG9yIGEgZ2xvYmFsIHNoYXJlIGhhbmRsZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS0wMTEzMSkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIiLCAiaGFuZGxlVHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1zZW1hcGhvcmUtMDExMjgiLCAic2VtYXBob3JlIG11c3Qgbm90IGN1cnJlbnRseSBoYXZlIGl0cyBwYXlsb2FkIHJlcGxhY2VkIGJ5IGFuIGltcG9ydGVkIHBheWxvYWQgYXMgZGVzY3JpYmVkIGJlbG93IGluIEltcG9ydGluZyBTZW1hcGhvcmUgUGF5bG9hZHMgdW5sZXNzIHRoYXQgaW1wb3J0ZWQgcGF5bG9hZCdzIGhhbmRsZSB0eXBlIHdhcyBpbmNsdWRlZCBpbiBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllczo6ZXhwb3J0RnJvbUltcG9ydGVkSGFuZGxlVHlwZXMgZm9yIGhhbmRsZVR5cGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSLXNlbWFwaG9yZS0wMTEyOCkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFItc2VtYXBob3JlLXBhcmFtZXRlciIsICJzZW1hcGhvcmUgbXVzdCBiZSBhIHZhbGlkIFZrU2VtYXBob3JlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUi1zZW1hcGhvcmUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1NJR05BTF9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi1zZW1hcGhvcmUtMDMyNTciLCAic2VtYXBob3JlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIFZrU2VtYXBob3JlVHlwZUtIUiBvZiBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXNlbWFwaG9yZS0wMzI1NykifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIiLCAic2VtYXBob3JlIG11c3QgYmUgYSB2YWxpZCBWa1NlbWFwaG9yZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi12YWx1ZS0wMzI1OCIsICJ2YWx1ZSBtdXN0IGhhdmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbWFwaG9yZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZVNpZ25hbEluZm9LSFItdmFsdWUtMDMyNTgpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi12YWx1ZS0wMzI1OSIsICJ2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgYW55IHBlbmRpbmcgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi12YWx1ZS0wMzI1OSkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSLXZhbHVlLTAzMjYwIiwgInZhbHVlIG11c3QgaGF2ZSBhIHZhbHVlIHdoaWNoIGRvZXMgbm90IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUgb3IgdGhlIHZhbHVlIG9mIGFueSBvdXRzdGFuZGluZyBzZW1hcGhvcmUgd2FpdCBvciBzaWduYWwgb3BlcmF0aW9uIG9uIHNlbWFwaG9yZSBieSBtb3JlIHRoYW4gbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUi12YWx1ZS0wMzI2MCkifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSLXNlbWFwaG9yZVR5cGUtMDMyNzkiLCAiSWYgc2VtYXBob3JlVHlwZSBpcyBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSLCBpbml0aWFsVmFsdWUgbXVzdCBiZSB6ZXJvLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSLXNlbWFwaG9yZVR5cGUtMDMyNzkpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFItc2VtYXBob3JlVHlwZS1wYXJhbWV0ZXIiLCAic2VtYXBob3JlVHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtTZW1hcGhvcmVUeXBlS0hSIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFItc2VtYXBob3JlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFItdGltZWxpbmVTZW1hcGhvcmUtMDMyNTIiLCAiSWYgdGhlIHRpbWVsaW5lU2VtYXBob3JlIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNlbWFwaG9yZVR5cGUgbXVzdCBub3QgZXF1YWwgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFItdGltZWxpbmVTZW1hcGhvcmUtMDMyNTIpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1NlbWFwaG9yZVdhaXRGbGFnQml0c0tIUiB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVXYWl0SW5mb0tIUi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcFNlbWFwaG9yZXMtMDMyNTYiLCAiQWxsIG9mIHRoZSBlbGVtZW50cyBvZiBwU2VtYXBob3JlcyBtdXN0IHJlZmVyZW5jZSBhIHNlbWFwaG9yZSB0aGF0IHdhcyBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcFNlbWFwaG9yZXMtMDMyNTYpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwgInBTZW1hcGhvcmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNlbWFwaG9yZUNvdW50IHZhbGlkIFZrU2VtYXBob3JlIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVXYWl0SW5mb0tIUi1wU2VtYXBob3Jlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItcFZhbHVlcy1wYXJhbWV0ZXIiLCAicFZhbHVlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzZW1hcGhvcmVDb3VudCB1aW50NjRfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTZW1hcGhvcmVXYWl0SW5mb0tIUi1wVmFsdWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTZW1hcGhvcmVXYWl0SW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9XQUlUX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU2VtYXBob3JlV2FpdEluZm9LSFItc2VtYXBob3JlQ291bnQtYXJyYXlsZW5ndGgiLCAic2VtYXBob3JlQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NlbWFwaG9yZVdhaXRJbmZvS0hSLXNlbWFwaG9yZUNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tY29kZVNpemUtMDEwODUiLCAiY29kZVNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tY29kZVNpemUtMDEwODUpIn0sCisgICAgeyJWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1jb2RlU2l6ZS0wMTA4NiIsICJjb2RlU2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tY29kZVNpemUtMDEwODYpIn0sCisgICAgeyJWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtMDEwODciLCAicENvZGUgbXVzdCBwb2ludCB0byB2YWxpZCBTUElSLVYgY29kZSwgZm9ybWF0dGVkIGFuZCBwYWNrZWQgYXMgZGVzY3JpYmVkIGJ5IHRoZSBLaHJvbm9zIFNQSVItViBTcGVjaWZpY2F0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1wQ29kZS0wMTA4NykifSwKKyAgICB7IlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMDg4IiwgInBDb2RlIG11c3QgYWRoZXJlIHRvIHRoZSB2YWxpZGF0aW9uIHJ1bGVzIGRlc2NyaWJlZCBieSB0aGUgVmFsaWRhdGlvbiBSdWxlcyB3aXRoaW4gYSBNb2R1bGUgc2VjdGlvbiBvZiB0aGUgU1BJUi1WIEVudmlyb25tZW50IGFwcGVuZGl4IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1wQ29kZS0wMTA4OCkifSwKKyAgICB7IlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMDg5IiwgInBDb2RlIG11c3QgZGVjbGFyZSB0aGUgU2hhZGVyIGNhcGFiaWxpdHkgZm9yIFNQSVItViBjb2RlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1wQ29kZS0wMTA4OSkifSwKKyAgICB7IlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMDkwIiwgInBDb2RlIG11c3Qgbm90IGRlY2xhcmUgYW55IGNhcGFiaWxpdHkgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBBUEksIGFzIGRlc2NyaWJlZCBieSB0aGUgQ2FwYWJpbGl0aWVzIHNlY3Rpb24gb2YgdGhlIFNQSVItViBFbnZpcm9ubWVudCBhcHBlbmRpeCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtMDEwOTApIn0sCisgICAgeyJWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1wQ29kZS0wMTA5MSIsICJJZiBwQ29kZSBkZWNsYXJlcyBhbnkgb2YgdGhlIGNhcGFiaWxpdGllcyBsaXN0ZWQgYXMgb3B0aW9uYWwgaW4gdGhlIFNQSVItViBFbnZpcm9ubWVudCBhcHBlbmRpeCwgdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZShzKSBtdXN0IGJlIGVuYWJsZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1wQ29kZS0wMTA5MSkifSwKKyAgICB7IlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc2IiwgIklmIHBDb2RlIGlzIGEgcG9pbnRlciB0byBTUElSLVYgY29kZSwgY29kZVNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc2KSJ9LAorICAgIHsiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtMDEzNzciLCAicENvZGUgbXVzdCBwb2ludCB0byBlaXRoZXIgdmFsaWQgU1BJUi1WIGNvZGUsIGZvcm1hdHRlZCBhbmQgcGFja2VkIGFzIGRlc2NyaWJlZCBieSB0aGUgS2hyb25vcyBTUElSLVYgU3BlY2lmaWNhdGlvbiBvciB2YWxpZCBHTFNMIGNvZGUgd2hpY2ggbXVzdCBiZSB3cml0dGVuIHRvIHRoZSBHTF9LSFJfdnVsa2FuX2dsc2wgZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc3KSJ9LAorICAgIHsiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtMDEzNzgiLCAiSWYgcENvZGUgaXMgYSBwb2ludGVyIHRvIFNQSVItViBjb2RlLCB0aGF0IGNvZGUgbXVzdCBhZGhlcmUgdG8gdGhlIHZhbGlkYXRpb24gcnVsZXMgZGVzY3JpYmVkIGJ5IHRoZSBWYWxpZGF0aW9uIFJ1bGVzIHdpdGhpbiBhIE1vZHVsZSBzZWN0aW9uIG9mIHRoZSBTUElSLVYgRW52aXJvbm1lbnQgYXBwZW5kaXggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc4KSJ9LAorICAgIHsiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtMDEzNzkiLCAiSWYgcENvZGUgaXMgYSBwb2ludGVyIHRvIEdMU0wgY29kZSwgaXQgbXVzdCBiZSB2YWxpZCBHTFNMIGNvZGUgd3JpdHRlbiB0byB0aGUgR0xfS0hSX3Z1bGthbl9nbHNsIEdMU0wgZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc5KSJ9LAorICAgIHsiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtcGFyYW1ldGVyIiwgInBDb2RlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIChjb2RlU2l6ZS80KSB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTaGFkZXJNb2R1bGVWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NoYWRlck1vZHVsZVZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC12YWxpZGF0aW9uQ2FjaGUtcGFyYW1ldGVyIiwgInZhbGlkYXRpb25DYWNoZSBtdXN0IGJlIGEgdmFsaWQgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC12YWxpZGF0aW9uQ2FjaGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WLXBTaGFkaW5nUmF0ZVBhbGV0dGVFbnRyaWVzLXBhcmFtZXRlciIsICJwU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50IHZhbGlkIFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVi1wU2hhZGluZ1JhdGVQYWxldHRlRW50cmllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU2hhZGluZ1JhdGVQYWxldHRlTlYtc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudC0wMjA3MSIsICJzaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOVjo6c2hhZGluZ1JhdGVQYWxldHRlU2l6ZSwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU2hhZGluZ1JhdGVQYWxldHRlTlYtc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudC0wMjA3MSkifSwKKyAgICB7IlZVSUQtVmtTaGFkaW5nUmF0ZVBhbGV0dGVOVi1zaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50LWFycmF5bGVuZ3RoIiwgInNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NoYWRpbmdSYXRlUGFsZXR0ZU5WLXNoYWRpbmdSYXRlUGFsZXR0ZUVudHJ5Q291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrU2hhcmVkUHJlc2VudFN1cmZhY2VDYXBhYmlsaXRpZXNLSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFSRURfUFJFU0VOVF9TVVJGQUNFX0NBUEFCSUxJVElFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mby1iaW5kQ291bnQtYXJyYXlsZW5ndGgiLCAiYmluZENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mby1iaW5kQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8tYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8tcEJpbmRzLXBhcmFtZXRlciIsICJwQmluZHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYmluZENvdW50IHZhbGlkIFZrU3BhcnNlTWVtb3J5QmluZCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8tcEJpbmRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtZXh0ZW50LTAxMTA4IiwgImV4dGVudC53aWR0aCBtdXN0IGVpdGhlciBiZSBhIG11bHRpcGxlIG9mIHRoZSBzcGFyc2UgaW1hZ2UgYmxvY2sgd2lkdGggb2YgdGhlIGltYWdlLCBvciBlbHNlIChleHRlbnQud2lkdGggKyBvZmZzZXQueCkgbXVzdCBlcXVhbCB0aGUgd2lkdGggb2YgdGhlIGltYWdlIHN1YnJlc291cmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLWV4dGVudC0wMTEwOCkifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtZXh0ZW50LTAxMTEwIiwgImV4dGVudC5oZWlnaHQgbXVzdCBlaXRoZXIgYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3BhcnNlIGltYWdlIGJsb2NrIGhlaWdodCBvZiB0aGUgaW1hZ2UsIG9yIGVsc2UgKGV4dGVudC5oZWlnaHQgKyBvZmZzZXQueSkgbXVzdCBlcXVhbCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1leHRlbnQtMDExMTApIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLWV4dGVudC0wMTExMiIsICJleHRlbnQuZGVwdGggbXVzdCBlaXRoZXIgYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3BhcnNlIGltYWdlIGJsb2NrIGRlcHRoIG9mIHRoZSBpbWFnZSwgb3IgZWxzZSAoZXh0ZW50LmRlcHRoICsgb2Zmc2V0LnopIG11c3QgZXF1YWwgdGhlIGRlcHRoIG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1leHRlbnQtMDExMTIpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtTcGFyc2VNZW1vcnlCaW5kRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtbWVtb3J5LTAxMTA0IiwgIklmIHRoZSBzcGFyc2UgYWxpYXNlZCByZXNpZGVuY3kgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIGFueSBvdGhlciByZXNvdXJjZXMgYXJlIGJvdW5kIHRvIHJhbmdlcyBvZiBtZW1vcnksIHRoZSByYW5nZSBvZiBtZW1vcnkgYmVpbmcgYm91bmQgbXVzdCBub3Qgb3ZlcmxhcCB3aXRoIHRob3NlIGJvdW5kIHJhbmdlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1tZW1vcnktMDExMDQpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLW1lbW9yeS0wMTEwNSIsICJtZW1vcnkgYW5kIG1lbW9yeU9mZnNldCBtdXN0IG1hdGNoIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIG9mIHRoZSBjYWxsaW5nIGNvbW1hbmQncyBpbWFnZSwgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gUmVzb3VyY2UgTWVtb3J5IEFzc29jaWF0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLW1lbW9yeS0wMTEwNSkifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtbWVtb3J5LTAyNzMyIiwgIklmIG1lbW9yeSB3YXMgY3JlYXRlZCB3aXRoIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvOjpoYW5kbGVUeXBlcyBub3QgZXF1YWwgdG8gMCwgYXQgbGVhc3Qgb25lIGhhbmRsZSB0eXBlIGl0IGNvbnRhaW5lZCBtdXN0IGFsc28gaGF2ZSBiZWVuIHNldCBpbiBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvOjpoYW5kbGVUeXBlcyB3aGVuIHRoZSBpbWFnZSB3YXMgY3JlYXRlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtbWVtb3J5LTAyNzMyKSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1tZW1vcnktMDI3MzMiLCAiSWYgbWVtb3J5IHdhcyBjcmVhdGVkIGJ5IGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbWVtb3J5IG11c3QgYWxzbyBoYXZlIGJlZW4gc2V0IGluIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLW1lbW9yeS0wMjczMykifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtbWVtb3J5LXBhcmFtZXRlciIsICJJZiBtZW1vcnkgaXMgbm90IFZLX05VTExfSEFORExFLCBtZW1vcnkgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlTWVtb3J5IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1tZW1vcnktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1vZmZzZXQtMDExMDciLCAib2Zmc2V0LnggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBzcGFyc2UgaW1hZ2UgYmxvY2sgd2lkdGggKFZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjppbWFnZUdyYW51bGFyaXR5LndpZHRoKSBvZiB0aGUgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtb2Zmc2V0LTAxMTA3KSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1vZmZzZXQtMDExMDkiLCAib2Zmc2V0LnkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBzcGFyc2UgaW1hZ2UgYmxvY2sgaGVpZ2h0IChWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczo6aW1hZ2VHcmFudWxhcml0eS5oZWlnaHQpIG9mIHRoZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1vZmZzZXQtMDExMDkpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLW9mZnNldC0wMTExMSIsICJvZmZzZXQueiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHNwYXJzZSBpbWFnZSBibG9jayBkZXB0aCAoVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXM6OmltYWdlR3JhbnVsYXJpdHkuZGVwdGgpIG9mIHRoZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1vZmZzZXQtMDExMTEpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLXN1YnJlc291cmNlLTAxMTA2IiwgInN1YnJlc291cmNlIG11c3QgYmUgYSB2YWxpZCBpbWFnZSBzdWJyZXNvdXJjZSBmb3IgaW1hZ2UgKHNlZSBJbWFnZSBWaWV3cykgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQtc3VicmVzb3VyY2UtMDExMDYpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kLXN1YnJlc291cmNlLXBhcmFtZXRlciIsICJzdWJyZXNvdXJjZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZVN1YnJlc291cmNlIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZC1zdWJyZXNvdXJjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby1iaW5kQ291bnQtYXJyYXlsZW5ndGgiLCAiYmluZENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvLWJpbmRDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvLWltYWdlLXBhcmFtZXRlciIsICJpbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvLWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvLXBCaW5kcy1wYXJhbWV0ZXIiLCAicEJpbmRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpbmRDb3VudCB2YWxpZCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby1wQmluZHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8tc3VicmVzb3VyY2UtMDE3MjIiLCAiVGhlIHN1YnJlc291cmNlLm1pcExldmVsIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcEJpbmRzIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBtaXBMZXZlbHMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvLXN1YnJlc291cmNlLTAxNzIyKSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8tc3VicmVzb3VyY2UtMDE3MjMiLCAiVGhlIHN1YnJlc291cmNlLmFycmF5TGF5ZXIgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwQmluZHMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGFycmF5TGF5ZXJzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby1zdWJyZXNvdXJjZS0wMTcyMykifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NQQVJTRV9JTUFHRV9NRU1PUllfUkVRVUlSRU1FTlRTXzIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mby1iaW5kQ291bnQtYXJyYXlsZW5ndGgiLCAiYmluZENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvLWJpbmRDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvLWltYWdlLXBhcmFtZXRlciIsICJpbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvLWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvLXBCaW5kcy0wMTEwMyIsICJJZiB0aGUgZmxhZ3MgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBCaW5kcyBjb250YWlucyBWS19TUEFSU0VfTUVNT1JZX0JJTkRfTUVUQURBVEFfQklULCB0aGUgYmluZGluZyByYW5nZSBkZWZpbmVkIG11c3QgYmUgd2l0aGluIHRoZSBtaXAgdGFpbCByZWdpb24gb2YgdGhlIG1ldGFkYXRhIGFzcGVjdCBvZiBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8tcEJpbmRzLTAxMTAzKSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8tcEJpbmRzLXBhcmFtZXRlciIsICJwQmluZHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYmluZENvdW50IHZhbGlkIFZrU3BhcnNlTWVtb3J5QmluZCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mby1wQmluZHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1NwYXJzZU1lbW9yeUJpbmRGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLW1lbW9yeS0wMTA5NiIsICJJZiBtZW1vcnkgaXMgbm90IFZLX05VTExfSEFORExFLCBtZW1vcnkgYW5kIG1lbW9yeU9mZnNldCBtdXN0IG1hdGNoIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIG9mIHRoZSByZXNvdXJjZSwgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gUmVzb3VyY2UgTWVtb3J5IEFzc29jaWF0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1tZW1vcnktMDEwOTYpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1tZW1vcnktMDEwOTciLCAiSWYgbWVtb3J5IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgbWVtb3J5IG11c3Qgbm90IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBtZW1vcnkgdHlwZSB0aGF0IHJlcG9ydHMgVktfTUVNT1JZX1BST1BFUlRZX0xBWklMWV9BTExPQ0FURURfQklUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLW1lbW9yeS0wMTA5NykifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLW1lbW9yeS0wMjczMCIsICJJZiBtZW1vcnkgd2FzIGNyZWF0ZWQgd2l0aCBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzo6aGFuZGxlVHlwZXMgbm90IGVxdWFsIHRvIDAsIGF0IGxlYXN0IG9uZSBoYW5kbGUgdHlwZSBpdCBjb250YWluZWQgbXVzdCBhbHNvIGhhdmUgYmVlbiBzZXQgaW4gVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIG9yIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIHdoZW4gdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtbWVtb3J5LTAyNzMwKSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtbWVtb3J5LTAyNzMxIiwgIklmIG1lbW9yeSB3YXMgY3JlYXRlZCBieSBhIG1lbW9yeSBpbXBvcnQgb3BlcmF0aW9uLCB0aGUgZXh0ZXJuYWwgaGFuZGxlIHR5cGUgb2YgdGhlIGltcG9ydGVkIG1lbW9yeSBtdXN0IGFsc28gaGF2ZSBiZWVuIHNldCBpbiBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgb3IgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgd2hlbiB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1tZW1vcnktMDI3MzEpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1tZW1vcnktcGFyYW1ldGVyIiwgIklmIG1lbW9yeSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIG1lbW9yeSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1tZW1vcnktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtbWVtb3J5T2Zmc2V0LTAxMTAxIiwgIm1lbW9yeU9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBtZW1vcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLW1lbW9yeU9mZnNldC0wMTEwMSkifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLXJlc291cmNlT2Zmc2V0LTAxMDk5IiwgInJlc291cmNlT2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtcmVzb3VyY2VPZmZzZXQtMDEwOTkpIn0sCisgICAgeyJWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1zaXplLTAxMDk4IiwgInNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtc2l6ZS0wMTA5OCkifSwKKyAgICB7IlZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLXNpemUtMDExMDAiLCAic2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVzb3VyY2UgbWludXMgcmVzb3VyY2VPZmZzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGFyc2VNZW1vcnlCaW5kLXNpemUtMDExMDApIn0sCisgICAgeyJWVUlELVZrU3BhcnNlTWVtb3J5QmluZC1zaXplLTAxMTAyIiwgInNpemUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgbWVtb3J5IG1pbnVzIG1lbW9yeU9mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwYXJzZU1lbW9yeUJpbmQtc2l6ZS0wMTEwMikifSwKKyAgICB7IlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tb2Zmc2V0LTAwNzczIiwgIlRoZSBvZmZzZXQgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwTWFwRW50cmllcyBtdXN0IGJlIGxlc3MgdGhhbiBkYXRhU2l6ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwZWNpYWxpemF0aW9uSW5mby1vZmZzZXQtMDA3NzMpIn0sCisgICAgeyJWVUlELVZrU3BlY2lhbGl6YXRpb25JbmZvLXBEYXRhLXBhcmFtZXRlciIsICJJZiBkYXRhU2l6ZSBpcyBub3QgMCwgcERhdGEgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGF0YVNpemUgYnl0ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tcERhdGEtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NwZWNpYWxpemF0aW9uSW5mby1wTWFwRW50cmllcy0wMDc3NCIsICJUaGUgc2l6ZSBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBNYXBFbnRyaWVzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGRhdGFTaXplIG1pbnVzIG9mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1NwZWNpYWxpemF0aW9uSW5mby1wTWFwRW50cmllcy0wMDc3NCkifSwKKyAgICB7IlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tcE1hcEVudHJpZXMtcGFyYW1ldGVyIiwgIklmIG1hcEVudHJ5Q291bnQgaXMgbm90IDAsIHBNYXBFbnRyaWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIG1hcEVudHJ5Q291bnQgdmFsaWQgVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5IHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tcE1hcEVudHJpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1NwZWNpYWxpemF0aW9uTWFwRW50cnktY29uc3RhbnRJRC0wMDc3NiIsICJGb3IgYSBjb25zdGFudElEIHNwZWNpYWxpemF0aW9uIGNvbnN0YW50IGRlY2xhcmVkIGluIGEgc2hhZGVyLCBzaXplIG11c3QgbWF0Y2ggdGhlIGJ5dGUgc2l6ZSBvZiB0aGUgY29uc3RhbnRJRC4gSWYgdGhlIHNwZWNpYWxpemF0aW9uIGNvbnN0YW50IGlzIG9mIHR5cGUgYm9vbGVhbiwgc2l6ZSBtdXN0IGJlIHRoZSBieXRlIHNpemUgb2YgVmtCb29sMzIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5LWNvbnN0YW50SUQtMDA3NzYpIn0sCisgICAgeyJWVUlELVZrU3RlbmNpbE9wU3RhdGUtY29tcGFyZU9wLXBhcmFtZXRlciIsICJjb21wYXJlT3AgbXVzdCBiZSBhIHZhbGlkIFZrQ29tcGFyZU9wIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3RlbmNpbE9wU3RhdGUtY29tcGFyZU9wLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdGVuY2lsT3BTdGF0ZS1kZXB0aEZhaWxPcC1wYXJhbWV0ZXIiLCAiZGVwdGhGYWlsT3AgbXVzdCBiZSBhIHZhbGlkIFZrU3RlbmNpbE9wIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3RlbmNpbE9wU3RhdGUtZGVwdGhGYWlsT3AtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N0ZW5jaWxPcFN0YXRlLWZhaWxPcC1wYXJhbWV0ZXIiLCAiZmFpbE9wIG11c3QgYmUgYSB2YWxpZCBWa1N0ZW5jaWxPcCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N0ZW5jaWxPcFN0YXRlLWZhaWxPcC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3RlbmNpbE9wU3RhdGUtcGFzc09wLXBhcmFtZXRlciIsICJwYXNzT3AgbXVzdCBiZSBhIHZhbGlkIFZrU3RlbmNpbE9wIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3RlbmNpbE9wU3RhdGUtcGFzc09wLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AtZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUC1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1AtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU1RSRUFNX0RFU0NSSVBUT1JfU1VSRkFDRV9DUkVBVEVfSU5GT19HR1AgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUNyZWF0ZUluZm9HR1Atc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VDcmVhdGVJbmZvR0dQLXN0cmVhbURlc2NyaXB0b3ItMDI2ODEiLCAic3RyZWFtRGVzY3JpcHRvciBtdXN0IGJlIGEgdmFsaWQgR2dwU3RyZWFtRGVzY3JpcHRvciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUC1zdHJlYW1EZXNjcmlwdG9yLTAyNjgxKSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tY29tbW9ucGFyZW50IiwgIkVhY2ggb2YgdGhlIGVsZW1lbnRzIG9mIHBDb21tYW5kQnVmZmVycywgdGhlIGVsZW1lbnRzIG9mIHBTaWduYWxTZW1hcGhvcmVzLCBhbmQgdGhlIGVsZW1lbnRzIG9mIHBXYWl0U2VtYXBob3JlcyB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1Ym1pdEluZm8tY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcENvbW1hbmRCdWZmZXJzLTAwMDc1IiwgIkVhY2ggZWxlbWVudCBvZiBwQ29tbWFuZEJ1ZmZlcnMgbXVzdCBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1Ym1pdEluZm8tcENvbW1hbmRCdWZmZXJzLTAwMDc1KSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcENvbW1hbmRCdWZmZXJzLXBhcmFtZXRlciIsICJJZiBjb21tYW5kQnVmZmVyQ291bnQgaXMgbm90IDAsIHBDb21tYW5kQnVmZmVycyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjb21tYW5kQnVmZmVyQ291bnQgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBDb21tYW5kQnVmZmVycy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VibWl0SW5mby1wTmV4dC0wMzI0MCIsICJJZiB0aGUgcE5leHQgY2hhaW4gb2YgdGhpcyBzdHJ1Y3R1cmUgaW5jbHVkZXMgYSBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiBzdHJ1Y3R1cmUgYW5kIGFueSBlbGVtZW50IG9mIHBXYWl0U2VtYXBob3JlcyB3YXMgY3JlYXRlZCB3aXRoIGEgVmtTZW1hcGhvcmVUeXBlS0hSIG9mIFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiwgdGhlbiBpdHMgd2FpdFNlbWFwaG9yZVZhbHVlQ291bnQgbWVtYmVyIG11c3QgZXF1YWwgd2FpdFNlbWFwaG9yZUNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VibWl0SW5mby1wTmV4dC0wMzI0MCkifSwKKyAgICB7IlZVSUQtVmtTdWJtaXRJbmZvLXBOZXh0LTAzMjQxIiwgIklmIHRoZSBwTmV4dCBjaGFpbiBvZiB0aGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBhIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSIHN0cnVjdHVyZSBhbmQgYW55IGVsZW1lbnQgb2YgcFNpZ25hbFNlbWFwaG9yZXMgd2FzIGNyZWF0ZWQgd2l0aCBhIFZrU2VtYXBob3JlVHlwZUtIUiBvZiBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFIsIHRoZW4gaXRzIHNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQgbWVtYmVyIG11c3QgZXF1YWwgc2lnbmFsU2VtYXBob3JlQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBOZXh0LTAzMjQxKSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0QzRDEyRmVuY2VTdWJtaXRJbmZvS0hSLCBWa0RldmljZUdyb3VwU3VibWl0SW5mbywgVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiwgVmtQcm90ZWN0ZWRTdWJtaXRJbmZvLCBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiwgVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFIsIG9yIFZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNDIiLCAiRm9yIGVhY2ggZWxlbWVudCBvZiBwU2lnbmFsU2VtYXBob3JlcyBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI6OnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgbXVzdCBoYXZlIGEgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUgd2hlbiB0aGUgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBTaWduYWxTZW1hcGhvcmVzLTAzMjQyKSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNDQiLCAiRm9yIGVhY2ggZWxlbWVudCBvZiBwU2lnbmFsU2VtYXBob3JlcyBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFI6OnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgbXVzdCBoYXZlIGEgdmFsdWUgd2hpY2ggZG9lcyBub3QgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbWFwaG9yZSBvciB0aGUgdmFsdWUgb2YgYW55IG91dHN0YW5kaW5nIHNlbWFwaG9yZSB3YWl0IG9yIHNpZ25hbCBvcGVyYXRpb24gb24gdGhhdCBzZW1hcGhvcmUgYnkgbW9yZSB0aGFuIG1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNDQpIn0sCisgICAgeyJWVUlELVZrU3VibWl0SW5mby1wU2lnbmFsU2VtYXBob3Jlcy1wYXJhbWV0ZXIiLCAiSWYgc2lnbmFsU2VtYXBob3JlQ291bnQgaXMgbm90IDAsIHBTaWduYWxTZW1hcGhvcmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNpZ25hbFNlbWFwaG9yZUNvdW50IHZhbGlkIFZrU2VtYXBob3JlIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBTaWduYWxTZW1hcGhvcmVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAwMDc2IiwgIklmIHRoZSBnZW9tZXRyeSBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGVhY2ggZWxlbWVudCBvZiBwV2FpdERzdFN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAwMDc2KSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDAwNzciLCAiSWYgdGhlIHRlc3NlbGxhdGlvbiBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGVhY2ggZWxlbWVudCBvZiBwV2FpdERzdFN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQgb3IgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDAwNzcpIn0sCisgICAgeyJWVUlELVZrU3VibWl0SW5mby1wV2FpdERzdFN0YWdlTWFzay0wMDA3OCIsICJFYWNoIGVsZW1lbnQgb2YgcFdhaXREc3RTdGFnZU1hc2sgbXVzdCBub3QgaW5jbHVkZSBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAwMDc4KSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDIwODkiLCAiSWYgdGhlIG1lc2ggc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBlYWNoIGVsZW1lbnQgb2YgcFdhaXREc3RTdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAyMDg5KSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDIwOTAiLCAiSWYgdGhlIHRhc2sgc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBlYWNoIGVsZW1lbnQgb2YgcFdhaXREc3RTdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAyMDkwKSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stcGFyYW1ldGVyIiwgIklmIHdhaXRTZW1hcGhvcmVDb3VudCBpcyBub3QgMCwgcFdhaXREc3RTdGFnZU1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygd2FpdFNlbWFwaG9yZUNvdW50IHZhbGlkIGNvbWJpbmF0aW9ucyBvZiBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsICJFYWNoIGVsZW1lbnQgb2YgcFdhaXREc3RTdGFnZU1hc2sgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVzLTAzMjM5IiwgIklmIGFueSBlbGVtZW50IG9mIHBXYWl0U2VtYXBob3JlcyBvciBwU2lnbmFsU2VtYXBob3JlcyB3YXMgY3JlYXRlZCB3aXRoIGEgVmtTZW1hcGhvcmVUeXBlS0hSIG9mIFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiwgdGhlbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBpbmNsdWRlIGEgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtMDMyMzkpIn0sCisgICAgeyJWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtMDMyNDMiLCAiRm9yIGVhY2ggZWxlbWVudCBvZiBwV2FpdFNlbWFwaG9yZXMgY3JlYXRlZCB3aXRoIGEgVmtTZW1hcGhvcmVUeXBlS0hSIG9mIFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSOjpwV2FpdFNlbWFwaG9yZVZhbHVlcyBtdXN0IGhhdmUgYSB2YWx1ZSB3aGljaCBkb2VzIG5vdCBkaWZmZXIgZnJvbSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlIG9yIHRoZSB2YWx1ZSBvZiBhbnkgb3V0c3RhbmRpbmcgc2VtYXBob3JlIHdhaXQgb3Igc2lnbmFsIG9wZXJhdGlvbiBvbiB0aGF0IHNlbWFwaG9yZSBieSBtb3JlIHRoYW4gbWF4VGltZWxpbmVTZW1hcGhvcmVWYWx1ZURpZmZlcmVuY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtMDMyNDMpIn0sCisgICAgeyJWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtcGFyYW1ldGVyIiwgIklmIHdhaXRTZW1hcGhvcmVDb3VudCBpcyBub3QgMCwgcFdhaXRTZW1hcGhvcmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHdhaXRTZW1hcGhvcmVDb3VudCB2YWxpZCBWa1NlbWFwaG9yZSBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1Ym1pdEluZm8tc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1Ym1pdEluZm8tc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3VibWl0SW5mby1zVHlwZS11bmlxdWUiLCAiRWFjaCBzVHlwZSBtZW1iZXIgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgdW5pcXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VibWl0SW5mby1zVHlwZS11bmlxdWUpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0JlZ2luSW5mb0tIUi1jb250ZW50cy1wYXJhbWV0ZXIiLCAiY29udGVudHMgbXVzdCBiZSBhIHZhbGlkIFZrU3VicGFzc0NvbnRlbnRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0JlZ2luSW5mb0tIUi1jb250ZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0JlZ2luSW5mb0tIUi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzQmVnaW5JbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NCZWdpbkluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0JFR0lOX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0JlZ2luSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kZXBlbmRlbmN5RmxhZ3MtMDI1MjAiLCAiSWYgZGVwZW5kZW5jeUZsYWdzIGluY2x1ZGVzIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQsIHNyY1N1YnBhc3MgbXVzdCBub3QgYmUgZXF1YWwgdG8gVktfU1VCUEFTU19FWFRFUk5BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRlcGVuZGVuY3lGbGFncy0wMjUyMCkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kZXBlbmRlbmN5RmxhZ3MtMDI1MjEiLCAiSWYgZGVwZW5kZW5jeUZsYWdzIGluY2x1ZGVzIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQsIGRzdFN1YnBhc3MgbXVzdCBub3QgYmUgZXF1YWwgdG8gVktfU1VCUEFTU19FWFRFUk5BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRlcGVuZGVuY3lGbGFncy0wMjUyMSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kZXBlbmRlbmN5RmxhZ3MtcGFyYW1ldGVyIiwgImRlcGVuZGVuY3lGbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtEZXBlbmRlbmN5RmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZGVwZW5kZW5jeUZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RBY2Nlc3NNYXNrLTAwODY5IiwgIkFueSBhY2Nlc3MgZmxhZyBpbmNsdWRlZCBpbiBkc3RBY2Nlc3NNYXNrIG11c3QgYmUgc3VwcG9ydGVkIGJ5IG9uZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIGRzdFN0YWdlTWFzaywgYXMgc3BlY2lmaWVkIGluIHRoZSB0YWJsZSBvZiBzdXBwb3J0ZWQgYWNjZXNzIHR5cGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0QWNjZXNzTWFzay0wMDg2OSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RBY2Nlc3NNYXNrLXBhcmFtZXRlciIsICJkc3RBY2Nlc3NNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0FjY2Vzc0ZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdEFjY2Vzc01hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdFN0YWdlTWFzay0wMDg2MSIsICJJZiB0aGUgZ2VvbWV0cnkgc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBkc3RTdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLTAwODYxKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdFN0YWdlTWFzay0wMDg2MyIsICJJZiB0aGUgdGVzc2VsbGF0aW9uIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0U3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCBvciBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLTAwODYzKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdFN0YWdlTWFzay0wMjEwMSIsICJJZiB0aGUgbWVzaCBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGRzdFN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdFN0YWdlTWFzay0wMjEwMSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stMDIxMDIiLCAiSWYgdGhlIHRhc2sgc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBkc3RTdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1kc3RTdGFnZU1hc2stMDIxMDIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLXBhcmFtZXRlciIsICJkc3RTdGFnZU1hc2sgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdFN0YWdlTWFzay1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsICJkc3RTdGFnZU1hc2sgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdFN0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjQWNjZXNzTWFzay0wMDg2OCIsICJBbnkgYWNjZXNzIGZsYWcgaW5jbHVkZWQgaW4gc3JjQWNjZXNzTWFzayBtdXN0IGJlIHN1cHBvcnRlZCBieSBvbmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBzcmNTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY0FjY2Vzc01hc2stMDA4NjgpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjQWNjZXNzTWFzay1wYXJhbWV0ZXIiLCAic3JjQWNjZXNzTWFzayBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtBY2Nlc3NGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNBY2Nlc3NNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDA4NjAiLCAiSWYgdGhlIGdlb21ldHJ5IHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N0YWdlTWFzay0wMDg2MCkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDA4NjIiLCAiSWYgdGhlIHRlc3NlbGxhdGlvbiBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNyY1N0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQgb3IgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N0YWdlTWFzay0wMDg2MikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDIwOTkiLCAiSWYgdGhlIG1lc2ggc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBzcmNTdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDIwOTkpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3RhZ2VNYXNrLTAyMTAwIiwgIklmIHRoZSB0YXNrIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3RhZ2VNYXNrLTAyMTAwKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N0YWdlTWFzay1wYXJhbWV0ZXIiLCAic3JjU3RhZ2VNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2siLCAic3JjU3RhZ2VNYXNrIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N1YnBhc3MtMDA4NjQiLCAic3JjU3VicGFzcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBkc3RTdWJwYXNzLCB1bmxlc3Mgb25lIG9mIHRoZW0gaXMgVktfU1VCUEFTU19FWFRFUk5BTCwgdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY2llcyBhbmQgZW5zdXJlIGEgdmFsaWQgZXhlY3V0aW9uIG9yZGVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3VicGFzcy0wMDg2NCkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY1IiwgInNyY1N1YnBhc3MgYW5kIGRzdFN1YnBhc3MgbXVzdCBub3QgYm90aCBiZSBlcXVhbCB0byBWS19TVUJQQVNTX0VYVEVSTkFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3VicGFzcy0wMDg2NSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY3IiwgIklmIHNyY1N1YnBhc3MgaXMgZXF1YWwgdG8gZHN0U3VicGFzcyBhbmQgbm90IGFsbCBvZiB0aGUgc3RhZ2VzIGluIHNyY1N0YWdlTWFzayBhbmQgZHN0U3RhZ2VNYXNrIGFyZSBmcmFtZWJ1ZmZlci1zcGFjZSBzdGFnZXMsIHRoZSBsb2dpY2FsbHkgbGF0ZXN0IHBpcGVsaW5lIHN0YWdlIGluIHNyY1N0YWdlTWFzayBtdXN0IGJlIGxvZ2ljYWxseSBlYXJsaWVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxvZ2ljYWxseSBlYXJsaWVzdCBwaXBlbGluZSBzdGFnZSBpbiBkc3RTdGFnZU1hc2sgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY3KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N1YnBhc3MtMDA4NzIiLCAiSWYgc3JjU3VicGFzcyBlcXVhbHMgZHN0U3VicGFzcyBhbmQgdGhhdCBzdWJwYXNzIGhhcyBtb3JlIHRoYW4gb25lIGJpdCBzZXQgaW4gdGhlIHZpZXcgbWFzaywgdGhlbiBkZXBlbmRlbmN5RmxhZ3MgbXVzdCBpbmNsdWRlIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODcyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N1YnBhc3MtMDIyNDMiLCAiSWYgc3JjU3VicGFzcyBlcXVhbHMgZHN0U3VicGFzcywgYW5kIHNyY1N0YWdlTWFzayBhbmQgZHN0U3RhZ2VNYXNrIGJvdGggaW5jbHVkZSBhIGZyYW1lYnVmZmVyLXNwYWNlIHN0YWdlLCB0aGVuIGRlcGVuZGVuY3lGbGFncyBtdXN0IGluY2x1ZGUgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3VicGFzcy0wMjI0MykifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZGVwZW5kZW5jeUZsYWdzLTAzMDkwIiwgIklmIGRlcGVuZGVuY3lGbGFncyBpbmNsdWRlcyBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklULCBzcmNTdWJwYXNzIG11c3Qgbm90IGJlIGVxdWFsIHRvIFZLX1NVQlBBU1NfRVhURVJOQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZGVwZW5kZW5jeUZsYWdzLTAzMDkwKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kZXBlbmRlbmN5RmxhZ3MtMDMwOTEiLCAiSWYgZGVwZW5kZW5jeUZsYWdzIGluY2x1ZGVzIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVQsIGRzdFN1YnBhc3MgbXVzdCBub3QgYmUgZXF1YWwgdG8gVktfU1VCUEFTU19FWFRFUk5BTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kZXBlbmRlbmN5RmxhZ3MtMDMwOTEpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRlcGVuZGVuY3lGbGFncy0wMzA5MiIsICJJZiBkZXBlbmRlbmN5RmxhZ3MgZG9lcyBub3QgaW5jbHVkZSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklULCB2aWV3T2Zmc2V0IG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kZXBlbmRlbmN5RmxhZ3MtMDMwOTIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRlcGVuZGVuY3lGbGFncy1wYXJhbWV0ZXIiLCAiZGVwZW5kZW5jeUZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0RlcGVuZGVuY3lGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZGVwZW5kZW5jeUZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0QWNjZXNzTWFzay0wMzA4OSIsICJBbnkgYWNjZXNzIGZsYWcgaW5jbHVkZWQgaW4gZHN0QWNjZXNzTWFzayBtdXN0IGJlIHN1cHBvcnRlZCBieSBvbmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBkc3RTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RBY2Nlc3NNYXNrLTAzMDg5KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RBY2Nlc3NNYXNrLXBhcmFtZXRlciIsICJkc3RBY2Nlc3NNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0FjY2Vzc0ZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RBY2Nlc3NNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLTAyMTA1IiwgIklmIHRoZSBtZXNoIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0U3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRzdFN0YWdlTWFzay0wMjEwNSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLTAyMTA2IiwgIklmIHRoZSB0YXNrIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0U3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRzdFN0YWdlTWFzay0wMjEwNikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLTAzMDgxIiwgIklmIHRoZSBnZW9tZXRyeSBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGRzdFN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLTAzMDgxKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDMwODMiLCAiSWYgdGhlIHRlc3NlbGxhdGlvbiBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGRzdFN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQgb3IgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDMwODMpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRzdFN0YWdlTWFzay1wYXJhbWV0ZXIiLCAiZHN0U3RhZ2VNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZHN0U3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsICJkc3RTdGFnZU1hc2sgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVQRU5ERU5DWV8yX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjQWNjZXNzTWFzay0wMzA4OCIsICJBbnkgYWNjZXNzIGZsYWcgaW5jbHVkZWQgaW4gc3JjQWNjZXNzTWFzayBtdXN0IGJlIHN1cHBvcnRlZCBieSBvbmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBzcmNTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNBY2Nlc3NNYXNrLTAzMDg4KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNBY2Nlc3NNYXNrLXBhcmFtZXRlciIsICJzcmNBY2Nlc3NNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0FjY2Vzc0ZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNBY2Nlc3NNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLTAyMTAzIiwgIklmIHRoZSBtZXNoIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay0wMjEwMykifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLTAyMTA0IiwgIklmIHRoZSB0YXNrIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay0wMjEwNCkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLTAzMDgwIiwgIklmIHRoZSBnZW9tZXRyeSBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNyY1N0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLTAzMDgwKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdGFnZU1hc2stMDMwODIiLCAiSWYgdGhlIHRlc3NlbGxhdGlvbiBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNyY1N0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQgb3IgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdGFnZU1hc2stMDMwODIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay1wYXJhbWV0ZXIiLCAic3JjU3RhZ2VNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsICJzcmNTdGFnZU1hc2sgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAyMjQ1IiwgIklmIHNyY1N1YnBhc3MgZXF1YWxzIGRzdFN1YnBhc3MsIGFuZCBzcmNTdGFnZU1hc2sgYW5kIGRzdFN0YWdlTWFzayBib3RoIGluY2x1ZGUgYSBmcmFtZWJ1ZmZlci1zcGFjZSBzdGFnZSwgdGhlbiBkZXBlbmRlbmN5RmxhZ3MgbXVzdCBpbmNsdWRlIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAyMjQ1KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAzMDg0IiwgInNyY1N1YnBhc3MgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZHN0U3VicGFzcywgdW5sZXNzIG9uZSBvZiB0aGVtIGlzIFZLX1NVQlBBU1NfRVhURVJOQUwsIHRvIGF2b2lkIGN5Y2xpYyBkZXBlbmRlbmNpZXMgYW5kIGVuc3VyZSBhIHZhbGlkIGV4ZWN1dGlvbiBvcmRlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAzMDg0KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAzMDg1IiwgInNyY1N1YnBhc3MgYW5kIGRzdFN1YnBhc3MgbXVzdCBub3QgYm90aCBiZSBlcXVhbCB0byBWS19TVUJQQVNTX0VYVEVSTkFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N1YnBhc3MtMDMwODUpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N1YnBhc3MtMDMwODciLCAiSWYgc3JjU3VicGFzcyBpcyBlcXVhbCB0byBkc3RTdWJwYXNzIGFuZCBub3QgYWxsIG9mIHRoZSBzdGFnZXMgaW4gc3JjU3RhZ2VNYXNrIGFuZCBkc3RTdGFnZU1hc2sgYXJlIGZyYW1lYnVmZmVyLXNwYWNlIHN0YWdlcywgdGhlIGxvZ2ljYWxseSBsYXRlc3QgcGlwZWxpbmUgc3RhZ2UgaW4gc3JjU3RhZ2VNYXNrIG11c3QgYmUgbG9naWNhbGx5IGVhcmxpZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbG9naWNhbGx5IGVhcmxpZXN0IHBpcGVsaW5lIHN0YWdlIGluIGRzdFN0YWdlTWFzayAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAzMDg3KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi12aWV3T2Zmc2V0LTAyNTMwIiwgIklmIHZpZXdPZmZzZXQgaXMgbm90IGVxdWFsIHRvIDAsIHNyY1N1YnBhc3MgbXVzdCBub3QgYmUgZXF1YWwgdG8gZHN0U3VicGFzcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi12aWV3T2Zmc2V0LTAyNTMwKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi12aWV3T2Zmc2V0LTAzMDkzIiwgIklmIHZpZXdPZmZzZXQgaXMgbm90IDAsIHNyY1N1YnBhc3MgbXVzdCBub3QgYmUgZXF1YWwgdG8gZHN0U3VicGFzcy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItdmlld09mZnNldC0wMzA5MykifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tYXR0YWNobWVudC0wMDg1MyIsICJUaGUgYXR0YWNobWVudCBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzIG11c3Qgbm90IGJlIFZLX0FUVEFDSE1FTlRfVU5VU0VEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWF0dGFjaG1lbnQtMDA4NTMpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWNvbG9yQXR0YWNobWVudENvdW50LTAwODQ1IiwgImNvbG9yQXR0YWNobWVudENvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heENvbG9yQXR0YWNobWVudHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tY29sb3JBdHRhY2htZW50Q291bnQtMDA4NDUpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWZsYWdzLTAwODU2IiwgIklmIGZsYWdzIGluY2x1ZGVzIFZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfUE9TSVRJT05fWF9PTkxZX0JJVF9OVlgsIGl0IG11c3QgYWxzbyBpbmNsdWRlIFZLX1NVQlBBU1NfREVTQ1JJUFRJT05fUEVSX1ZJRVdfQVRUUklCVVRFU19CSVRfTlZYLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1mbGFncy0wMDg1NikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWxheW91dC0wMjUxOSIsICJJZiBhbnkgYXR0YWNobWVudCBpcyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgVmtBdHRhY2htZW50UmVmZXJlbmNlIG1lbWJlciwgdGhlbiBlYWNoIHVzZSBtdXN0IHVzZSB0aGUgc2FtZSBsYXlvdXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tbGF5b3V0LTAyNTE5KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1sb2FkT3AtMDA4NDYiLCAiSWYgdGhlIGZpcnN0IHVzZSBvZiBhbiBhdHRhY2htZW50IGluIHRoaXMgcmVuZGVyIHBhc3MgaXMgYXMgYW4gaW5wdXQgYXR0YWNobWVudCwgYW5kIHRoZSBhdHRhY2htZW50IGlzIG5vdCBhbHNvIHVzZWQgYXMgYSBjb2xvciBvciBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgaW4gdGhlIHNhbWUgc3VicGFzcywgdGhlbiBsb2FkT3AgbXVzdCBub3QgYmUgVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWxvYWRPcC0wMDg0NikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcENvbG9yQXR0YWNobWVudHMtMDE0MTciLCAiQWxsIGF0dGFjaG1lbnRzIGluIHBDb2xvckF0dGFjaG1lbnRzIHRoYXQgYXJlIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCBtdXN0IGhhdmUgdGhlIHNhbWUgc2FtcGxlIGNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBDb2xvckF0dGFjaG1lbnRzLTAxNDE3KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wQ29sb3JBdHRhY2htZW50cy0wMTUwNiIsICJJZiB0aGUgVktfQU1EX21peGVkX2F0dGFjaG1lbnRfc2FtcGxlcyBleHRlbnNpb24gaXMgZW5hYmxlZCwgYW5kIGFsbCBhdHRhY2htZW50cyBpbiBwQ29sb3JBdHRhY2htZW50cyB0aGF0IGFyZSBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQgbXVzdCBoYXZlIGEgc2FtcGxlIGNvdW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzYW1wbGUgY291bnQgb2YgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgaWYgaXQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBDb2xvckF0dGFjaG1lbnRzLTAxNTA2KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wQ29sb3JBdHRhY2htZW50cy0wMjY0OCIsICJBbGwgYXR0YWNobWVudHMgaW4gcENvbG9yQXR0YWNobWVudHMgdGhhdCBhcmUgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VEIG11c3QgaGF2ZSBmb3JtYXRzIHdob3NlIGZlYXR1cmVzIGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcENvbG9yQXR0YWNobWVudHMtMDI2NDgpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBDb2xvckF0dGFjaG1lbnRzLXBhcmFtZXRlciIsICJJZiBjb2xvckF0dGFjaG1lbnRDb3VudCBpcyBub3QgMCwgcENvbG9yQXR0YWNobWVudHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY29sb3JBdHRhY2htZW50Q291bnQgdmFsaWQgVmtBdHRhY2htZW50UmVmZXJlbmNlIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcENvbG9yQXR0YWNobWVudHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0wMTQxOCIsICJJZiBuZWl0aGVyIHRoZSBWS19BTURfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzIG5vciB0aGUgVktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlcyBleHRlbnNpb25zIGFyZSBlbmFibGVkLCBhbmQgaWYgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VEIGFuZCBhbnkgYXR0YWNobWVudHMgaW4gcENvbG9yQXR0YWNobWVudHMgYXJlIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgc2FtcGxlIGNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LTAxNDE4KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0wMjY1MCIsICJJZiBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCBpcyBub3QgTlVMTCBhbmQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VEIHRoZW4gaXQgbXVzdCBoYXZlIGEgZm9ybWF0IHdob3NlIGZlYXR1cmVzIGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0wMjY1MCkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtcGFyYW1ldGVyIiwgIklmIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IGlzIG5vdCBOVUxMLCBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQXR0YWNobWVudFJlZmVyZW5jZSBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wSW5wdXRBdHRhY2htZW50cy0wMjY0NyIsICJBbGwgYXR0YWNobWVudHMgaW4gcElucHV0QXR0YWNobWVudHMgdGhhdCBhcmUgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VEIG11c3QgaGF2ZSBmb3JtYXRzIHdob3NlIGZlYXR1cmVzIGNvbnRhaW4gYXQgbGVhc3Qgb25lIG9mIFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUIG9yIFZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBJbnB1dEF0dGFjaG1lbnRzLTAyNjQ3KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wSW5wdXRBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgaW5wdXRBdHRhY2htZW50Q291bnQgaXMgbm90IDAsIHBJbnB1dEF0dGFjaG1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGlucHV0QXR0YWNobWVudENvdW50IHZhbGlkIFZrQXR0YWNobWVudFJlZmVyZW5jZSBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBJbnB1dEF0dGFjaG1lbnRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFByZXNlcnZlQXR0YWNobWVudHMtMDA4NTQiLCAiRWFjaCBlbGVtZW50IG9mIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzIG11c3Qgbm90IGFsc28gYmUgYW4gZWxlbWVudCBvZiBhbnkgb3RoZXIgbWVtYmVyIG9mIHRoZSBzdWJwYXNzIGRlc2NyaXB0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLTAwODU0KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUHJlc2VydmVBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgcHJlc2VydmVBdHRhY2htZW50Q291bnQgaXMgbm90IDAsIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHByZXNlcnZlQXR0YWNobWVudENvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUHJlc2VydmVBdHRhY2htZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NDciLCAiSWYgcFJlc29sdmVBdHRhY2htZW50cyBpcyBub3QgTlVMTCwgZm9yIGVhY2ggcmVzb2x2ZSBhdHRhY2htZW50IHRoYXQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCB0aGUgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IG11c3Qgbm90IGJlIFZLX0FUVEFDSE1FTlRfVU5VU0VEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NDcpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NDgiLCAiSWYgcFJlc29sdmVBdHRhY2htZW50cyBpcyBub3QgTlVMTCwgZm9yIGVhY2ggcmVzb2x2ZSBhdHRhY2htZW50IHRoYXQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCB0aGUgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IG11c3Qgbm90IGhhdmUgYSBzYW1wbGUgY291bnQgb2YgVktfU0FNUExFX0NPVU5UXzFfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NDgpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NDkiLCAiSWYgcFJlc29sdmVBdHRhY2htZW50cyBpcyBub3QgTlVMTCwgZWFjaCByZXNvbHZlIGF0dGFjaG1lbnQgdGhhdCBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQgbXVzdCBoYXZlIGEgc2FtcGxlIGNvdW50IG9mIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAwODQ5KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAwODUwIiwgIklmIHBSZXNvbHZlQXR0YWNobWVudHMgaXMgbm90IE5VTEwsIGVhY2ggcmVzb2x2ZSBhdHRhY2htZW50IHRoYXQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VEIG11c3QgaGF2ZSB0aGUgc2FtZSBWa0Zvcm1hdCBhcyBpdHMgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDA4NTApIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtMDI2NDkiLCAiQWxsIGF0dGFjaG1lbnRzIGluIHBSZXNvbHZlQXR0YWNobWVudHMgdGhhdCBhcmUgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VEIG11c3QgaGF2ZSBmb3JtYXRzIHdob3NlIGZlYXR1cmVzIGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy0wMjY0OSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgY29sb3JBdHRhY2htZW50Q291bnQgaXMgbm90IDAsIGFuZCBwUmVzb2x2ZUF0dGFjaG1lbnRzIGlzIG5vdCBOVUxMLCBwUmVzb2x2ZUF0dGFjaG1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvbG9yQXR0YWNobWVudENvdW50IHZhbGlkIFZrQXR0YWNobWVudFJlZmVyZW5jZSBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBSZXNvbHZlQXR0YWNobWVudHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1waXBlbGluZUJpbmRQb2ludC0wMDg0NCIsICJwaXBlbGluZUJpbmRQb2ludCBtdXN0IGJlIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcGlwZWxpbmVCaW5kUG9pbnQtMDA4NDQpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBpcGVsaW5lQmluZFBvaW50LXBhcmFtZXRlciIsICJwaXBlbGluZUJpbmRQb2ludCBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZUJpbmRQb2ludCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1waXBlbGluZUJpbmRQb2ludC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1hdHRhY2htZW50LTAyNzk5IiwgIklmIHRoZSBhdHRhY2htZW50IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwSW5wdXRBdHRhY2htZW50cyBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIHRoZW4gdGhlIGFzcGVjdE1hc2sgbWVtYmVyIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWF0dGFjaG1lbnQtMDI3OTkpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1hdHRhY2htZW50LTAyODAwIiwgIklmIHRoZSBhdHRhY2htZW50IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwSW5wdXRBdHRhY2htZW50cyBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIHRoZW4gdGhlIGFzcGVjdE1hc2sgbWVtYmVyIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWF0dGFjaG1lbnQtMDI4MDApIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1hdHRhY2htZW50LTAyODAxIiwgIklmIHRoZSBhdHRhY2htZW50IG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwSW5wdXRBdHRhY2htZW50cyBpcyBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIHRoZW4gdGhlIGFzcGVjdE1hc2sgbWVtYmVyIG11c3Qgbm90IGluY2x1ZGUgVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItYXR0YWNobWVudC0wMjgwMSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWF0dGFjaG1lbnQtMDMwNzMiLCAiVGhlIGF0dGFjaG1lbnQgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzIG11c3Qgbm90IGJlIFZLX0FUVEFDSE1FTlRfVU5VU0VEIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1hdHRhY2htZW50LTAzMDczKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItY29sb3JBdHRhY2htZW50Q291bnQtMDMwNjMiLCAiY29sb3JBdHRhY2htZW50Q291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Q29sb3JBdHRhY2htZW50cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItY29sb3JBdHRhY2htZW50Q291bnQtMDMwNjMpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1mbGFncy0wMzA3NiIsICJJZiBmbGFncyBpbmNsdWRlcyBWS19TVUJQQVNTX0RFU0NSSVBUSU9OX1BFUl9WSUVXX1BPU0lUSU9OX1hfT05MWV9CSVRfTlZYLCBpdCBtdXN0IGFsc28gaW5jbHVkZSBWS19TVUJQQVNTX0RFU0NSSVBUSU9OX1BFUl9WSUVXX0FUVFJJQlVURVNfQklUX05WWC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWZsYWdzLTAzMDc2KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1N1YnBhc3NEZXNjcmlwdGlvbkZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItbGF5b3V0LTAyNTI4IiwgIklmIGFueSBhdHRhY2htZW50IGlzIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgbWVtYmVyLCB0aGVuIGVhY2ggdXNlIG11c3QgdXNlIHRoZSBzYW1lIGxheW91dCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItbGF5b3V0LTAyNTI4KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItbG9hZE9wLTAzMDY0IiwgIklmIHRoZSBmaXJzdCB1c2Ugb2YgYW4gYXR0YWNobWVudCBpbiB0aGlzIHJlbmRlciBwYXNzIGlzIGFzIGFuIGlucHV0IGF0dGFjaG1lbnQsIGFuZCB0aGUgYXR0YWNobWVudCBpcyBub3QgYWxzbyB1c2VkIGFzIGEgY29sb3Igb3IgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IGluIHRoZSBzYW1lIHN1YnBhc3MsIHRoZW4gbG9hZE9wIG11c3Qgbm90IGJlIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItbG9hZE9wLTAzMDY0KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcENvbG9yQXR0YWNobWVudHMtMDMwNjkiLCAiQWxsIGF0dGFjaG1lbnRzIGluIHBDb2xvckF0dGFjaG1lbnRzIHRoYXQgYXJlIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCBtdXN0IGhhdmUgdGhlIHNhbWUgc2FtcGxlIGNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wQ29sb3JBdHRhY2htZW50cy0wMzA2OSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBDb2xvckF0dGFjaG1lbnRzLTAzMDcwIiwgIklmIHRoZSBWS19BTURfbWl4ZWRfYXR0YWNobWVudF9zYW1wbGVzIGV4dGVuc2lvbiBpcyBlbmFibGVkLCBhbGwgYXR0YWNobWVudHMgaW4gcENvbG9yQXR0YWNobWVudHMgdGhhdCBhcmUgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VEIG11c3QgaGF2ZSBhIHNhbXBsZSBjb3VudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2FtcGxlIGNvdW50IG9mIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IGlmIGl0IGlzIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcENvbG9yQXR0YWNobWVudHMtMDMwNzApIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wQ29sb3JBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgY29sb3JBdHRhY2htZW50Q291bnQgaXMgbm90IDAsIHBDb2xvckF0dGFjaG1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvbG9yQXR0YWNobWVudENvdW50IHZhbGlkIFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcENvbG9yQXR0YWNobWVudHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtMDMwNzEiLCAiSWYgbmVpdGhlciB0aGUgVktfQU1EX21peGVkX2F0dGFjaG1lbnRfc2FtcGxlcyBub3IgdGhlIFZLX05WX2ZyYW1lYnVmZmVyX21peGVkX3NhbXBsZXMgZXh0ZW5zaW9ucyBhcmUgZW5hYmxlZCwgYW5kIGlmIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IGlzIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCBhbmQgYW55IGF0dGFjaG1lbnRzIGluIHBDb2xvckF0dGFjaG1lbnRzIGFyZSBub3QgVktfQVRUQUNITUVOVF9VTlVTRUQsIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIHNhbXBsZSBjb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtMDMwNzEpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wRGVwdGhTdGVuY2lsQXR0YWNobWVudC1wYXJhbWV0ZXIiLCAiSWYgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgaXMgbm90IE5VTEwsIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBJbnB1dEF0dGFjaG1lbnRzLXBhcmFtZXRlciIsICJJZiBpbnB1dEF0dGFjaG1lbnRDb3VudCBpcyBub3QgMCwgcElucHV0QXR0YWNobWVudHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW5wdXRBdHRhY2htZW50Q291bnQgdmFsaWQgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wSW5wdXRBdHRhY2htZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUHJlc2VydmVBdHRhY2htZW50cy0wMzA3NCIsICJBbnkgZ2l2ZW4gZWxlbWVudCBvZiBwUHJlc2VydmVBdHRhY2htZW50cyBtdXN0IG5vdCBhbHNvIGJlIGFuIGVsZW1lbnQgb2YgYW55IG90aGVyIG1lbWJlciBvZiB0aGUgc3VicGFzcyBkZXNjcmlwdGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFByZXNlcnZlQXR0YWNobWVudHMtMDMwNzQpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUHJlc2VydmVBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgcHJlc2VydmVBdHRhY2htZW50Q291bnQgaXMgbm90IDAsIHBQcmVzZXJ2ZUF0dGFjaG1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHByZXNlcnZlQXR0YWNobWVudENvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFByZXNlcnZlQXR0YWNobWVudHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy0wMzA2NSIsICJJZiBwUmVzb2x2ZUF0dGFjaG1lbnRzIGlzIG5vdCBOVUxMLCBmb3IgZWFjaCByZXNvbHZlIGF0dGFjaG1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlIHRoZSB2YWx1ZSBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgdGhlIGNvcnJlc3BvbmRpbmcgY29sb3IgYXR0YWNobWVudCBtdXN0IG5vdCBoYXZlIHRoZSB2YWx1ZSBWS19BVFRBQ0hNRU5UX1VOVVNFRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy0wMzA2NSkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBSZXNvbHZlQXR0YWNobWVudHMtMDMwNjYiLCAiSWYgcFJlc29sdmVBdHRhY2htZW50cyBpcyBub3QgTlVMTCwgZm9yIGVhY2ggcmVzb2x2ZSBhdHRhY2htZW50IHRoYXQgaXMgbm90IFZLX0FUVEFDSE1FTlRfVU5VU0VELCB0aGUgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IG11c3Qgbm90IGhhdmUgYSBzYW1wbGUgY291bnQgb2YgVktfU0FNUExFX0NPVU5UXzFfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAzMDY2KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy0wMzA2NyIsICJJZiBwUmVzb2x2ZUF0dGFjaG1lbnRzIGlzIG5vdCBOVUxMLCBlYWNoIHJlc29sdmUgYXR0YWNobWVudCB0aGF0IGlzIG5vdCBWS19BVFRBQ0hNRU5UX1VOVVNFRCBtdXN0IGhhdmUgYSBzYW1wbGUgY291bnQgb2YgVktfU0FNUExFX0NPVU5UXzFfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAzMDY3KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy0wMzA2OCIsICJBbnkgZ2l2ZW4gZWxlbWVudCBvZiBwUmVzb2x2ZUF0dGFjaG1lbnRzIG11c3QgaGF2ZSB0aGUgc2FtZSBWa0Zvcm1hdCBhcyBpdHMgY29ycmVzcG9uZGluZyBjb2xvciBhdHRhY2htZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wUmVzb2x2ZUF0dGFjaG1lbnRzLTAzMDY4KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy1wYXJhbWV0ZXIiLCAiSWYgY29sb3JBdHRhY2htZW50Q291bnQgaXMgbm90IDAsIGFuZCBwUmVzb2x2ZUF0dGFjaG1lbnRzIGlzIG5vdCBOVUxMLCBwUmVzb2x2ZUF0dGFjaG1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvbG9yQXR0YWNobWVudENvdW50IHZhbGlkIFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcFJlc29sdmVBdHRhY2htZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1waXBlbGluZUJpbmRQb2ludC0wMzA2MiIsICJwaXBlbGluZUJpbmRQb2ludCBtdXN0IGJlIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBpcGVsaW5lQmluZFBvaW50LTAzMDYyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyIiwgInBpcGVsaW5lQmluZFBvaW50IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lQmluZFBvaW50IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1waXBlbGluZUJpbmRQb2ludC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fMl9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItZGVwdGhSZXNvbHZlTW9kZS0wMzE4MyIsICJUaGUgdmFsdWUgb2YgZGVwdGhSZXNvbHZlTW9kZSBtdXN0IGJlIG9uZSBvZiB0aGUgYml0cyBzZXQgaW4gVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSOjpzdXBwb3J0ZWREZXB0aFJlc29sdmVNb2RlcyBvciBWS19SRVNPTFZFX01PREVfTk9ORV9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLWRlcHRoUmVzb2x2ZU1vZGUtMDMxODMpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1kZXB0aFJlc29sdmVNb2RlLXBhcmFtZXRlciIsICJkZXB0aFJlc29sdmVNb2RlIG11c3QgYmUgYSB2YWxpZCBWa1Jlc29sdmVNb2RlRmxhZ0JpdHNLSFIgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLWRlcHRoUmVzb2x2ZU1vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAyNjUxIiwgIklmIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCBpcyBub3QgTlVMTCBhbmQgZG9lcyBub3QgaGF2ZSB0aGUgdmFsdWUgVktfQVRUQUNITUVOVF9VTlVTRUQgdGhlbiBpdCBtdXN0IGhhdmUgYSBmb3JtYXQgd2hvc2UgZmVhdHVyZXMgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDI2NTEpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxNzciLCAiSWYgcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50IGlzIG5vdCBOVUxMIGFuZCBkb2VzIG5vdCBoYXZlIHRoZSB2YWx1ZSBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgbXVzdCBub3QgaGF2ZSB0aGUgdmFsdWUgVktfQVRUQUNITUVOVF9VTlVTRUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0wMzE3NykifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0wMzE3OCIsICJJZiBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgaXMgbm90IE5VTEwgYW5kIGRvZXMgbm90IGhhdmUgdGhlIHZhbHVlIFZLX0FUVEFDSE1FTlRfVU5VU0VELCBkZXB0aFJlc29sdmVNb2RlIGFuZCBzdGVuY2lsUmVzb2x2ZU1vZGUgbXVzdCBub3QgYm90aCBiZSBWS19SRVNPTFZFX01PREVfTk9ORV9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0wMzE3OCkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC0wMzE3OSIsICJJZiBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgaXMgbm90IE5VTEwgYW5kIGRvZXMgbm90IGhhdmUgdGhlIHZhbHVlIFZLX0FUVEFDSE1FTlRfVU5VU0VELCBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCBtdXN0IG5vdCBoYXZlIGEgc2FtcGxlIGNvdW50IG9mIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTc5KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTgwIiwgIklmIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCBpcyBub3QgTlVMTCBhbmQgZG9lcyBub3QgaGF2ZSB0aGUgdmFsdWUgVktfQVRUQUNITUVOVF9VTlVTRUQsIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCBtdXN0IGhhdmUgYSBzYW1wbGUgY291bnQgb2YgVktfU0FNUExFX0NPVU5UXzFfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODApIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODEiLCAiSWYgdGhlIFZrRm9ybWF0IG9mIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCBoYXMgYSBkZXB0aCBjb21wb25lbnQsIHRoZW4gdGhlIFZrRm9ybWF0IG9mIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IG11c3QgaGF2ZSBhIGRlcHRoIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIGFuZCBudW1lcmljYWwgdHlwZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTgxKSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTgyIiwgIklmIHRoZSBWa0Zvcm1hdCBvZiBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgaGFzIGEgc3RlbmNpbCBjb21wb25lbnQsIHRoZW4gdGhlIFZrRm9ybWF0IG9mIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IG11c3QgaGF2ZSBhIHN0ZW5jaWwgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMgYW5kIG51bWVyaWNhbCB0eXBlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODUiLCAiSWYgdGhlIFZrRm9ybWF0IG9mIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCBoYXMgYm90aCBkZXB0aCBhbmQgc3RlbmNpbCBjb21wb25lbnRzLCBWa1BoeXNpY2FsRGV2aWNlRGVwdGhTdGVuY2lsUmVzb2x2ZVByb3BlcnRpZXNLSFI6OmluZGVwZW5kZW50UmVzb2x2ZSBpcyBWS19GQUxTRSwgYW5kIFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUjo6aW5kZXBlbmRlbnRSZXNvbHZlTm9uZSBpcyBWS19GQUxTRSwgdGhlbiB0aGUgdmFsdWVzIG9mIGRlcHRoUmVzb2x2ZU1vZGUgYW5kIHN0ZW5jaWxSZXNvbHZlTW9kZSBtdXN0IGJlIGlkZW50aWNhbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTg1KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50LTAzMTg2IiwgIklmIHRoZSBWa0Zvcm1hdCBvZiBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgaGFzIGJvdGggZGVwdGggYW5kIHN0ZW5jaWwgY29tcG9uZW50cywgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSOjppbmRlcGVuZGVudFJlc29sdmUgaXMgVktfRkFMU0UgYW5kIFZrUGh5c2ljYWxEZXZpY2VEZXB0aFN0ZW5jaWxSZXNvbHZlUHJvcGVydGllc0tIUjo6aW5kZXBlbmRlbnRSZXNvbHZlTm9uZSBpcyBWS19UUlVFLCB0aGVuIHRoZSB2YWx1ZXMgb2YgZGVwdGhSZXNvbHZlTW9kZSBhbmQgc3RlbmNpbFJlc29sdmVNb2RlIG11c3QgYmUgaWRlbnRpY2FsIG9yIG9uZSBvZiB0aGVtIG11c3QgYmUgVktfUkVTT0xWRV9NT0RFX05PTkVfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtMDMxODYpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQtcGFyYW1ldGVyIiwgIklmIHBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudCBpcyBub3QgTlVMTCwgcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSLXBEZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fREVQVEhfU1RFTkNJTF9SRVNPTFZFX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZUtIUi1zdGVuY2lsUmVzb2x2ZU1vZGUtMDMxODQiLCAiVGhlIHZhbHVlIG9mIHN0ZW5jaWxSZXNvbHZlTW9kZSBtdXN0IGJlIG9uZSBvZiB0aGUgYml0cyBzZXQgaW4gVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSOjpzdXBwb3J0ZWRTdGVuY2lsUmVzb2x2ZU1vZGVzIG9yIFZLX1JFU09MVkVfTU9ERV9OT05FX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItc3RlbmNpbFJlc29sdmVNb2RlLTAzMTg0KSJ9LAorICAgIHsiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItc3RlbmNpbFJlc29sdmVNb2RlLXBhcmFtZXRlciIsICJzdGVuY2lsUmVzb2x2ZU1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrUmVzb2x2ZU1vZGVGbGFnQml0c0tIUiB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFItc3RlbmNpbFJlc29sdmVNb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRW5kSW5mb0tIUi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdWJwYXNzRW5kSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzRW5kSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfRU5EX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc0VuZEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVC1zYW1wbGVMb2NhdGlvbnNJbmZvLXBhcmFtZXRlciIsICJzYW1wbGVMb2NhdGlvbnNJbmZvIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVC1zYW1wbGVMb2NhdGlvbnNJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdWJwYXNzU2FtcGxlTG9jYXRpb25zRVhULXN1YnBhc3NJbmRleC0wMTUzMiIsICJzdWJwYXNzSW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHN1YnBhc3NDb3VudCBzcGVjaWZpZWQgaW4gVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGJ5IFZrUmVuZGVyUGFzc0JlZ2luSW5mbzo6cmVuZGVyUGFzcyB3YXMgY3JlYXRlZCB3aXRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VicGFzc1NhbXBsZUxvY2F0aW9uc0VYVC1zdWJwYXNzSW5kZXgtMDE1MzIpIn0sCisgICAgeyJWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXN1cHBvcnRlZFN1cmZhY2VDb3VudGVycy0wMTI0NiIsICJzdXBwb3J0ZWRTdXJmYWNlQ291bnRlcnMgbXVzdCBub3QgaW5jbHVkZSBWS19TVVJGQUNFX0NPVU5URVJfVkJMQU5LX0VYVCB1bmxlc3MgdGhlIHN1cmZhY2UgcXVlcmllZCBpcyBhIGRpc3BsYXkgc3VyZmFjZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVC1zdXBwb3J0ZWRTdXJmYWNlQ291bnRlcnMtMDEyNDYpIn0sCisgICAgeyJWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFItcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0Rpc3BsYXlOYXRpdmVIZHJTdXJmYWNlQ2FwYWJpbGl0aWVzQU1ELCBWa1NoYXJlZFByZXNlbnRTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLCBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhULCBvciBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTXzJfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFItc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXNUeXBlLXVuaXF1ZSkifSwKKyAgICB7IlZVSUQtVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfQ0FQQUJJTElUSUVTX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdXJmYWNlQ2FwYWJpbGl0aWVzRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTdXJmYWNlRm9ybWF0MktIUi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdXJmYWNlRm9ybWF0MktIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtTdXJmYWNlRm9ybWF0MktIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRk9STUFUXzJfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VyZmFjZUZvcm1hdDJLSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhULWZ1bGxTY3JlZW5FeGNsdXNpdmUtcGFyYW1ldGVyIiwgImZ1bGxTY3JlZW5FeGNsdXNpdmUgbXVzdCBiZSBhIHZhbGlkIFZrRnVsbFNjcmVlbkV4Y2x1c2l2ZUVYVCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVC1mdWxsU2NyZWVuRXhjbHVzaXZlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZUluZm9FWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9JTkZPX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVC1obW9uaXRvci0wMjY3MyIsICJobW9uaXRvciBtdXN0IGJlIGEgdmFsaWQgSE1PTklUT1IgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVC1obW9uaXRvci0wMjY3MykifSwKKyAgICB7IlZVSUQtVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfRlVMTF9TQ1JFRU5fRVhDTFVTSVZFX1dJTjMyX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVXaW4zMkluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3VyZmFjZVByb3RlY3RlZENhcGFiaWxpdGllc0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNvdW50ZXJDcmVhdGVJbmZvRVhULXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0NPVU5URVJfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQtc3VyZmFjZUNvdW50ZXJzLTAxMjQ0IiwgIlRoZSBiaXRzIGluIHN1cmZhY2VDb3VudGVycyBtdXN0IGJlIHN1cHBvcnRlZCBieSBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFI6OnN1cmZhY2UsIGFzIHJlcG9ydGVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVC1zdXJmYWNlQ291bnRlcnMtMDEyNDQpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ291bnRlckNyZWF0ZUluZm9FWFQtc3VyZmFjZUNvdW50ZXJzLXBhcmFtZXRlciIsICJzdXJmYWNlQ291bnRlcnMgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrU3VyZmFjZUNvdW50ZXJGbGFnQml0c0VYVCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVC1zdXJmYWNlQ291bnRlcnMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItY29tbW9ucGFyZW50IiwgIkJvdGggb2Ygb2xkU3dhcGNoYWluLCBhbmQgc3VyZmFjZSB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0luc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1jb21wb3NpdGVBbHBoYS0wMTI4MCIsICJjb21wb3NpdGVBbHBoYSBtdXN0IGJlIG9uZSBvZiB0aGUgYml0cyBwcmVzZW50IGluIHRoZSBzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSBtZW1iZXIgb2YgdGhlIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgZm9yIHRoZSBzdXJmYWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1jb21wb3NpdGVBbHBoYS0wMTI4MCkifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWNvbXBvc2l0ZUFscGhhLXBhcmFtZXRlciIsICJjb21wb3NpdGVBbHBoYSBtdXN0IGJlIGEgdmFsaWQgVmtDb21wb3NpdGVBbHBoYUZsYWdCaXRzS0hSIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1jb21wb3NpdGVBbHBoYS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1mbGFncy0wMzE2OCIsICJJZiBmbGFncyBjb250YWlucyBWS19TV0FQQ0hBSU5fQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVF9LSFIgdGhlbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBpbmNsdWRlIGEgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSB3aXRoIGEgdmlld0Zvcm1hdENvdW50IGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBwVmlld0Zvcm1hdHMgbXVzdCBoYXZlIGFuIGVsZW1lbnQgZXF1YWwgdG8gaW1hZ2VGb3JtYXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWZsYWdzLTAzMTY4KSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItZmxhZ3MtMDMxODciLCAiSWYgZmxhZ3MgY29udGFpbnMgVktfU1dBUENIQUlOX0NSRUFURV9QUk9URUNURURfQklUX0tIUiwgdGhlbiBWa1N1cmZhY2VQcm90ZWN0ZWRDYXBhYmlsaXRpZXNLSFI6OnN1cHBvcnRzUHJvdGVjdGVkIG11c3QgYmUgVktfVFJVRSBpbiB0aGUgVmtTdXJmYWNlUHJvdGVjdGVkQ2FwYWJpbGl0aWVzS0hSIHN0cnVjdHVyZSByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgZm9yIHN1cmZhY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWZsYWdzLTAzMTg3KSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1N3YXBjaGFpbkNyZWF0ZUZsYWdCaXRzS0hSIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VBcnJheUxheWVycy0wMTI3NSIsICJpbWFnZUFycmF5TGF5ZXJzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbWF4SW1hZ2VBcnJheUxheWVycyBtZW1iZXIgb2YgdGhlIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgZm9yIHRoZSBzdXJmYWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUFycmF5TGF5ZXJzLTAxMjc1KSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VDb2xvclNwYWNlLXBhcmFtZXRlciIsICJpbWFnZUNvbG9yU3BhY2UgbXVzdCBiZSBhIHZhbGlkIFZrQ29sb3JTcGFjZUtIUiB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VDb2xvclNwYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlRXh0ZW50LTAxMjc0IiwgImltYWdlRXh0ZW50IG11c3QgYmUgYmV0d2VlbiBtaW5JbWFnZUV4dGVudCBhbmQgbWF4SW1hZ2VFeHRlbnQsIGluY2x1c2l2ZSwgd2hlcmUgbWluSW1hZ2VFeHRlbnQgYW5kIG1heEltYWdlRXh0ZW50IGFyZSBtZW1iZXJzIG9mIHRoZSBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgc3RydWN0dXJlIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIGZvciB0aGUgc3VyZmFjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VFeHRlbnQtMDEyNzQpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUV4dGVudC0wMTY4OSIsICJpbWFnZUV4dGVudCBtZW1iZXJzIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBib3RoIGJlIG5vbi16ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUV4dGVudC0wMTY4OSkifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlRm9ybWF0LTAxMjczIiwgImltYWdlRm9ybWF0IGFuZCBpbWFnZUNvbG9yU3BhY2UgbXVzdCBtYXRjaCB0aGUgZm9ybWF0IGFuZCBjb2xvclNwYWNlIG1lbWJlcnMsIHJlc3BlY3RpdmVseSwgb2Ygb25lIG9mIHRoZSBWa1N1cmZhY2VGb3JtYXRLSFIgc3RydWN0dXJlcyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgZm9yIHRoZSBzdXJmYWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUZvcm1hdC0wMTI3MykifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlRm9ybWF0LTAxNzc4IiwgIlRoZSBpbXBsaWVkIGltYWdlIGNyZWF0aW9uIHBhcmFtZXRlcnMgb2YgdGhlIHN3YXBjaGFpbiBtdXN0IGJlIHN1cHBvcnRlZCBhcyByZXBvcnRlZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUZvcm1hdC0wMTc3OCkifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlRm9ybWF0LXBhcmFtZXRlciIsICJpbWFnZUZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlRm9ybWF0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtMDEyNzciLCAiSWYgaW1hZ2VTaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgcFF1ZXVlRmFtaWx5SW5kaWNlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBxdWV1ZUZhbWlseUluZGV4Q291bnQgdWludDMyX3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVNoYXJpbmdNb2RlLTAxMjc3KSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VTaGFyaW5nTW9kZS0wMTI3OCIsICJJZiBpbWFnZVNoYXJpbmdNb2RlIGlzIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5ULCBxdWV1ZUZhbWlseUluZGV4Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VTaGFyaW5nTW9kZS0wMTI3OCkifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtMDEzOTMiLCAiSWYgaW1hZ2VTaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgZWFjaCBlbGVtZW50IG9mIHBRdWV1ZUZhbWlseUluZGljZXMgbXVzdCBiZSB1bmlxdWUgYW5kIG11c3QgYmUgbGVzcyB0aGFuIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBmb3IgdGhlIHBoeXNpY2FsRGV2aWNlIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VTaGFyaW5nTW9kZS0wMTM5MykifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtMDE0MjgiLCAiSWYgaW1hZ2VTaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgZWFjaCBlbGVtZW50IG9mIHBRdWV1ZUZhbWlseUluZGljZXMgbXVzdCBiZSB1bmlxdWUgYW5kIG11c3QgYmUgbGVzcyB0aGFuIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgcmV0dXJuZWQgYnkgZWl0aGVyIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgb3IgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIgZm9yIHRoZSBwaHlzaWNhbERldmljZSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlU2hhcmluZ01vZGUtMDE0MjgpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVNoYXJpbmdNb2RlLXBhcmFtZXRlciIsICJpbWFnZVNoYXJpbmdNb2RlIG11c3QgYmUgYSB2YWxpZCBWa1NoYXJpbmdNb2RlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVNoYXJpbmdNb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlVXNhZ2UtMDEyNzYiLCAiaW1hZ2VVc2FnZSBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBzdXBwb3J0ZWQgdXNhZ2UgZmxhZ3MgcHJlc2VudCBpbiB0aGUgc3VwcG9ydGVkVXNhZ2VGbGFncyBtZW1iZXIgb2YgdGhlIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgZm9yIHRoZSBzdXJmYWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVVzYWdlLTAxMjc2KSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VVc2FnZS0wMTM4NCIsICJJZiBwcmVzZW50TW9kZSBpcyBWS19QUkVTRU5UX01PREVfU0hBUkVEX0RFTUFORF9SRUZSRVNIX0tIUiBvciBWS19QUkVTRU5UX01PREVfU0hBUkVEX0NPTlRJTlVPVVNfUkVGUkVTSF9LSFIsIGltYWdlVXNhZ2UgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgc3VwcG9ydGVkIHVzYWdlIGZsYWdzIHByZXNlbnQgaW4gdGhlIHNoYXJlZFByZXNlbnRTdXBwb3J0ZWRVc2FnZUZsYWdzIG1lbWJlciBvZiB0aGUgVmtTaGFyZWRQcmVzZW50U3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIGZvciBzdXJmYWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVVzYWdlLTAxMzg0KSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VVc2FnZS1wYXJhbWV0ZXIiLCAiaW1hZ2VVc2FnZSBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtJbWFnZVVzYWdlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVVzYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLWltYWdlVXNhZ2UtcmVxdWlyZWRiaXRtYXNrIiwgImltYWdlVXNhZ2UgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VVc2FnZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1taW5JbWFnZUNvdW50LTAxMjcxIiwgIm1pbkltYWdlQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIGluIHRoZSBtaW5JbWFnZUNvdW50IG1lbWJlciBvZiB0aGUgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIHN0cnVjdHVyZSByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBmb3IgdGhlIHN1cmZhY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1pbkltYWdlQ291bnQtMDEyNzEpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1taW5JbWFnZUNvdW50LTAxMjcyIiwgIm1pbkltYWdlQ291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIGluIHRoZSBtYXhJbWFnZUNvdW50IG1lbWJlciBvZiB0aGUgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSIHN0cnVjdHVyZSByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBmb3IgdGhlIHN1cmZhY2UgaWYgdGhlIHJldHVybmVkIG1heEltYWdlQ291bnQgaXMgbm90IHplcm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1pbkltYWdlQ291bnQtMDEyNzIpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1taW5JbWFnZUNvdW50LTAxMzgzIiwgIm1pbkltYWdlQ291bnQgbXVzdCBiZSAxIGlmIHByZXNlbnRNb2RlIGlzIGVpdGhlciBWS19QUkVTRU5UX01PREVfU0hBUkVEX0RFTUFORF9SRUZSRVNIX0tIUiBvciBWS19QUkVTRU5UX01PREVfU0hBUkVEX0NPTlRJTlVPVVNfUkVGUkVTSF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW1pbkltYWdlQ291bnQtMDEzODMpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1vbGRTd2FwY2hhaW4tMDE5MzMiLCAiSWYgb2xkU3dhcGNoYWluIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgb2xkU3dhcGNoYWluIG11c3QgYmUgYSBub24tcmV0aXJlZCBzd2FwY2hhaW4gYXNzb2NpYXRlZCB3aXRoIG5hdGl2ZSB3aW5kb3cgcmVmZXJyZWQgdG8gYnkgc3VyZmFjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItb2xkU3dhcGNoYWluLTAxOTMzKSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItb2xkU3dhcGNoYWluLXBhcmFtZXRlciIsICJJZiBvbGRTd2FwY2hhaW4gaXMgbm90IFZLX05VTExfSEFORExFLCBvbGRTd2FwY2hhaW4gbXVzdCBiZSBhIHZhbGlkIFZrU3dhcGNoYWluS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItb2xkU3dhcGNoYWluLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW9sZFN3YXBjaGFpbi1wYXJlbnQiLCAiSWYgb2xkU3dhcGNoYWluIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHN1cmZhY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLW9sZFN3YXBjaGFpbi1wYXJlbnQpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wTmV4dC0wMjY3OSIsICJJZiB0aGUgcE5leHQgY2hhaW4gaW5jbHVkZXMgYSBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCBzdHJ1Y3R1cmUgd2l0aCBpdHMgZnVsbFNjcmVlbkV4Y2x1c2l2ZSBtZW1iZXIgc2V0IHRvIFZLX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9BUFBMSUNBVElPTl9DT05UUk9MTEVEX0VYVCwgYW5kIHN1cmZhY2Ugd2FzIGNyZWF0ZWQgdXNpbmcgdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIsIGEgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCBzdHJ1Y3R1cmUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXBOZXh0LTAyNjc5KSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiLCAiRWFjaCBwTmV4dCBtZW1iZXIgb2YgYW55IHN0cnVjdHVyZSAoaW5jbHVkaW5nIHRoaXMgb25lKSBpbiB0aGUgcE5leHQgY2hhaW4gbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSB2YWxpZCBpbnN0YW5jZSBvZiBWa0RldmljZUdyb3VwU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiwgVmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSLCBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlSW5mb0VYVCwgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCwgVmtTd2FwY2hhaW5Db3VudGVyQ3JlYXRlSW5mb0VYVCwgb3IgVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1waHlzaWNhbERldmljZUNvdW50LTAxNDI5IiwgIklmIHRoZSBsb2dpY2FsIGRldmljZSB3YXMgY3JlYXRlZCB3aXRoIFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvOjpwaHlzaWNhbERldmljZUNvdW50IGVxdWFsIHRvIDEsIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfU1dBUENIQUlOX0NSRUFURV9TUExJVF9JTlNUQU5DRV9CSU5EX1JFR0lPTlNfQklUX0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcGh5c2ljYWxEZXZpY2VDb3VudC0wMTQyOSkifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZVRyYW5zZm9ybS0wMTI3OSIsICJwcmVUcmFuc2Zvcm0gbXVzdCBiZSBvbmUgb2YgdGhlIGJpdHMgcHJlc2VudCBpbiB0aGUgc3VwcG9ydGVkVHJhbnNmb3JtcyBtZW1iZXIgb2YgdGhlIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgZm9yIHRoZSBzdXJmYWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wcmVUcmFuc2Zvcm0tMDEyNzkpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wcmVUcmFuc2Zvcm0tcGFyYW1ldGVyIiwgInByZVRyYW5zZm9ybSBtdXN0IGJlIGEgdmFsaWQgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZVRyYW5zZm9ybS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wcmVzZW50TW9kZS0wMTI4MSIsICJwcmVzZW50TW9kZSBtdXN0IGJlIG9uZSBvZiB0aGUgVmtQcmVzZW50TW9kZUtIUiB2YWx1ZXMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIgZm9yIHRoZSBzdXJmYWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wcmVzZW50TW9kZS0wMTI4MSkifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZXNlbnRNb2RlLTAxNDI3IiwgIklmIHByZXNlbnRNb2RlIGlzIFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSLCBWS19QUkVTRU5UX01PREVfTUFJTEJPWF9LSFIsIFZLX1BSRVNFTlRfTU9ERV9GSUZPX0tIUiBvciBWS19QUkVTRU5UX01PREVfRklGT19SRUxBWEVEX0tIUiwgaW1hZ2VVc2FnZSBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBzdXBwb3J0ZWQgdXNhZ2UgZmxhZ3MgcHJlc2VudCBpbiB0aGUgc3VwcG9ydGVkVXNhZ2VGbGFncyBtZW1iZXIgb2YgdGhlIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIgZm9yIHN1cmZhY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXByZXNlbnRNb2RlLTAxNDI3KSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcHJlc2VudE1vZGUtcGFyYW1ldGVyIiwgInByZXNlbnRNb2RlIG11c3QgYmUgYSB2YWxpZCBWa1ByZXNlbnRNb2RlS0hSIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1wcmVzZW50TW9kZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItc1R5cGUtdW5pcXVlKSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItc3VyZmFjZS0wMTI3MCIsICJzdXJmYWNlIG11c3QgYmUgYSBzdXJmYWNlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYXMgZGV0ZXJtaW5lZCB1c2luZyB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSLXN1cmZhY2UtMDEyNzApIn0sCisgICAgeyJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zdXJmYWNlLXBhcmFtZXRlciIsICJzdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1zdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRC1sb2NhbERpbW1pbmdFbmFibGUtWFhYWFgiLCAiSXQgaXMgb25seSB2YWxpZCB0byBzZXQgbG9jYWxEaW1taW5nRW5hYmxlIHRvIFZLX1RSVUUgaWYgVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRDo6bG9jYWxEaW1taW5nU3VwcG9ydCBpcyBzdXBwb3J0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrU3dhcGNoYWluRGlzcGxheU5hdGl2ZUhkckNyZWF0ZUluZm9BTUQtbG9jYWxEaW1taW5nRW5hYmxlLVhYWFhYKSJ9LAorICAgIHsiVlVJRC1Wa1N3YXBjaGFpbkRpc3BsYXlOYXRpdmVIZHJDcmVhdGVJbmZvQU1ELXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfU1dBUENIQUlOX0RJU1BMQVlfTkFUSVZFX0hEUl9DUkVBVEVfSU5GT19BTUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtTd2FwY2hhaW5EaXNwbGF5TmF0aXZlSGRyQ3JlYXRlSW5mb0FNRC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1RFWFRVUkVfTE9EX0dBVEhFUl9GT1JNQVRfUFJPUEVSVElFU19BTUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtUZXh0dXJlTE9ER2F0aGVyRm9ybWF0UHJvcGVydGllc0FNRC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFItcFNpZ25hbFNlbWFwaG9yZVZhbHVlcy1wYXJhbWV0ZXIiLCAiSWYgc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudCBpcyBub3QgMCwgYW5kIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgaXMgbm90IE5VTEwsIHBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc2lnbmFsU2VtYXBob3JlVmFsdWVDb3VudCB1aW50NjRfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFItcFNpZ25hbFNlbWFwaG9yZVZhbHVlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSLXBXYWl0U2VtYXBob3JlVmFsdWVzLXBhcmFtZXRlciIsICJJZiB3YWl0U2VtYXBob3JlVmFsdWVDb3VudCBpcyBub3QgMCwgYW5kIHBXYWl0U2VtYXBob3JlVmFsdWVzIGlzIG5vdCBOVUxMLCBwV2FpdFNlbWFwaG9yZVZhbHVlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB3YWl0U2VtYXBob3JlVmFsdWVDb3VudCB1aW50NjRfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFItcFdhaXRTZW1hcGhvcmVWYWx1ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQtaW5pdGlhbERhdGFTaXplLTAxNTM0IiwgIklmIGluaXRpYWxEYXRhU2l6ZSBpcyBub3QgMCwgaXQgbXVzdCBiZSBlcXVhbCB0byB0aGUgc2l6ZSBvZiBwSW5pdGlhbERhdGEsIGFzIHJldHVybmVkIGJ5IHZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVCB3aGVuIHBJbml0aWFsRGF0YSB3YXMgb3JpZ2luYWxseSByZXRyaWV2ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULWluaXRpYWxEYXRhU2l6ZS0wMTUzNCkifSwKKyAgICB7IlZVSUQtVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULWluaXRpYWxEYXRhU2l6ZS0wMTUzNSIsICJJZiBpbml0aWFsRGF0YVNpemUgaXMgbm90IDAsIHBJbml0aWFsRGF0YSBtdXN0IGhhdmUgYmVlbiByZXRyaWV2ZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC1pbml0aWFsRGF0YVNpemUtMDE1MzUpIn0sCisgICAgeyJWVUlELVZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC1wSW5pdGlhbERhdGEtcGFyYW1ldGVyIiwgIklmIGluaXRpYWxEYXRhU2l6ZSBpcyBub3QgMCwgcEluaXRpYWxEYXRhIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGluaXRpYWxEYXRhU2l6ZSBieXRlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQtcEluaXRpYWxEYXRhLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhULXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQtcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fQ0FDSEVfQ1JFQVRFX0lORk9fRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQtcERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzLXBhcmFtZXRlciIsICJJZiBkaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgaXMgbm90IDAsIHBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgdmFsaWQgVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmFsaWRhdGlvbkZlYXR1cmVzRVhULXBEaXNhYmxlZFZhbGlkYXRpb25GZWF0dXJlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrVmFsaWRhdGlvbkZlYXR1cmVzRVhULXBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzLXBhcmFtZXRlciIsICJJZiBlbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCBpcyBub3QgMCwgcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgdmFsaWQgVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQtcEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1ZhbGlkYXRpb25GZWF0dXJlc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmFsaWRhdGlvbkZlYXR1cmVzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1ZhbGlkYXRpb25GbGFnc0VYVC1kaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50LWFycmF5bGVuZ3RoIiwgImRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZhbGlkYXRpb25GbGFnc0VYVC1kaXNhYmxlZFZhbGlkYXRpb25DaGVja0NvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC1Wa1ZhbGlkYXRpb25GbGFnc0VYVC1wRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzLXBhcmFtZXRlciIsICJwRGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRpc2FibGVkVmFsaWRhdGlvbkNoZWNrQ291bnQgdmFsaWQgVmtWYWxpZGF0aW9uQ2hlY2tFWFQgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmFsaWRhdGlvbkZsYWdzRVhULXBEaXNhYmxlZFZhbGlkYXRpb25DaGVja3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1ZhbGlkYXRpb25GbGFnc0VYVC1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkxBR1NfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmFsaWRhdGlvbkZsYWdzRVhULXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tYmluZGluZy0wMDYyMSIsICJiaW5kaW5nIG11c3QgYmUgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleElucHV0QmluZGluZ3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uLWJpbmRpbmctMDA2MjEpIn0sCisgICAgeyJWVUlELVZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbi1mb3JtYXQtMDA2MjMiLCAiZm9ybWF0IG11c3QgYmUgYWxsb3dlZCBhcyBhIHZlcnRleCBidWZmZXIgZm9ybWF0LCBhcyBzcGVjaWZpZWQgYnkgdGhlIFZLX0ZPUk1BVF9GRUFUVVJFX1ZFUlRFWF9CVUZGRVJfQklUIGZsYWcgaW4gVmtGb3JtYXRQcm9wZXJ0aWVzOjpidWZmZXJGZWF0dXJlcyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tZm9ybWF0LTAwNjIzKSJ9LAorICAgIHsiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tZm9ybWF0LXBhcmFtZXRlciIsICJmb3JtYXQgbXVzdCBiZSBhIHZhbGlkIFZrRm9ybWF0IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbi1mb3JtYXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tbG9jYXRpb24tMDA2MjAiLCAibG9jYXRpb24gbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbi1sb2NhdGlvbi0wMDYyMCkifSwKKyAgICB7IlZVSUQtVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uLW9mZnNldC0wMDYyMiIsICJvZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uLW9mZnNldC0wMDYyMikifSwKKyAgICB7IlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbi1iaW5kaW5nLTAwNjE4IiwgImJpbmRpbmcgbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRCaW5kaW5ncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLWJpbmRpbmctMDA2MTgpIn0sCisgICAgeyJWVUlELVZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24taW5wdXRSYXRlLXBhcmFtZXRlciIsICJpbnB1dFJhdGUgbXVzdCBiZSBhIHZhbGlkIFZrVmVydGV4SW5wdXRSYXRlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24taW5wdXRSYXRlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbi1zdHJpZGUtMDA2MTkiLCAic3RyaWRlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLXN0cmlkZS0wMDYxOSkifSwKKyAgICB7IlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtYmluZGluZy0wMTg2OSIsICJiaW5kaW5nIG11c3QgYmUgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleElucHV0QmluZGluZ3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtYmluZGluZy0wMTg2OSkifSwKKyAgICB7IlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtZGl2aXNvci0wMTg3MCIsICJkaXZpc29yIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yUHJvcGVydGllc0VYVDo6bWF4VmVydGV4QXR0cmliRGl2aXNvciwgaW5jbHVzaXZlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC1kaXZpc29yLTAxODcwKSJ9LAorICAgIHsiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC1pbnB1dFJhdGUtMDE4NzEiLCAiVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbjo6aW5wdXRSYXRlIG11c3QgYmUgb2YgdHlwZSBWS19WRVJURVhfSU5QVVRfUkFURV9JTlNUQU5DRSBmb3IgdGhpcyBiaW5kaW5nLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC1pbnB1dFJhdGUtMDE4NzEpIn0sCisgICAgeyJWVUlELVZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhULXZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3ItMDIyMjkiLCAiSWYgdGhlIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZGl2aXNvciBtdXN0IGJlIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlRGl2aXNvci0wMjIyOSkifSwKKyAgICB7IlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3ItMDIyMjgiLCAiSWYgdGhlIHZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGRpdmlzb3IgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC12ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvci0wMjIyOCkifSwKKyAgICB7IlZVSUQtVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4tZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTi1wTmV4dC1wTmV4dCIsICJwTmV4dCBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4tcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrVmlTdXJmYWNlQ3JlYXRlSW5mb05OLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfVklfU1VSRkFDRV9DUkVBVEVfSU5GT19OTiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4td2luZG93LTAxMzE4IiwgIndpbmRvdyBtdXN0IGJlIGEgdmFsaWQgbm46OnZpOjpOYXRpdmVXaW5kb3dIYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWaVN1cmZhY2VDcmVhdGVJbmZvTk4td2luZG93LTAxMzE4KSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0LWhlaWdodC0wMTc3MiIsICJoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4wIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmlld3BvcnQtaGVpZ2h0LTAxNzcyKSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0LWhlaWdodC0wMTc3MyIsICJUaGUgYWJzb2x1dGUgdmFsdWUgb2YgaGVpZ2h0IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0RGltZW5zaW9uc1sxXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0LWhlaWdodC0wMTc3MykifSwKKyAgICB7IlZVSUQtVmtWaWV3cG9ydC1tYXhEZXB0aC0wMTIzNSIsICJVbmxlc3MgVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCBleHRlbnNpb24gaXMgZW5hYmxlZCBtYXhEZXB0aCBtdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjAsIGluY2x1c2l2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0LW1heERlcHRoLTAxMjM1KSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0LW1heERlcHRoLTAyNTQxIiwgIm1heERlcHRoIG11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmlld3BvcnQtbWF4RGVwdGgtMDI1NDEpIn0sCisgICAgeyJWVUlELVZrVmlld3BvcnQtbWluRGVwdGgtMDEyMzQiLCAiVW5sZXNzIFZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgbWluRGVwdGggbXVzdCBiZSBiZXR3ZWVuIDAuMCBhbmQgMS4wLCBpbmNsdXNpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWaWV3cG9ydC1taW5EZXB0aC0wMTIzNCkifSwKKyAgICB7IlZVSUQtVmtWaWV3cG9ydC1taW5EZXB0aC0wMjU0MCIsICJtaW5EZXB0aCBtdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjAsIGluY2x1c2l2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0LW1pbkRlcHRoLTAyNTQwKSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcwIiwgIndpZHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcwKSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcxIiwgIndpZHRoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0RGltZW5zaW9uc1swXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcxKSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0LXgtMDEyMzIiLCAiKHggKyB3aWR0aCkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdmlld3BvcnRCb3VuZHNSYW5nZVsxXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0LXgtMDEyMzIpIn0sCisgICAgeyJWVUlELVZrVmlld3BvcnQteC0wMTc3NCIsICJ4IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHZpZXdwb3J0Qm91bmRzUmFuZ2VbMF0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWaWV3cG9ydC14LTAxNzc0KSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0LXktMDEyMzMiLCAiKHkgKyBoZWlnaHQpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWaWV3cG9ydC15LTAxMjMzKSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0LXktMDE3NzUiLCAieSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB2aWV3cG9ydEJvdW5kc1JhbmdlWzBdIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmlld3BvcnQteS0wMTc3NSkifSwKKyAgICB7IlZVSUQtVmtWaWV3cG9ydC15LTAxNzc2IiwgInkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdmlld3BvcnRCb3VuZHNSYW5nZVsxXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0LXktMDE3NzYpIn0sCisgICAgeyJWVUlELVZrVmlld3BvcnQteS0wMTc3NyIsICIoeSArIGhlaWdodCkgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdmlld3BvcnRCb3VuZHNSYW5nZVswXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0LXktMDE3NzcpIn0sCisgICAgeyJWVUlELVZrVmlld3BvcnRTd2l6emxlTlYtdy1wYXJhbWV0ZXIiLCAidyBtdXN0IGJlIGEgdmFsaWQgVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWaWV3cG9ydFN3aXp6bGVOVi13LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtWaWV3cG9ydFN3aXp6bGVOVi14LXBhcmFtZXRlciIsICJ4IG11c3QgYmUgYSB2YWxpZCBWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOViB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1ZpZXdwb3J0U3dpenpsZU5WLXgtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1ZpZXdwb3J0U3dpenpsZU5WLXktcGFyYW1ldGVyIiwgInkgbXVzdCBiZSBhIHZhbGlkIFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrVmlld3BvcnRTd2l6emxlTlYteS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrVmlld3BvcnRTd2l6emxlTlYtei1wYXJhbWV0ZXIiLCAieiBtdXN0IGJlIGEgdmFsaWQgVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtWaWV3cG9ydFN3aXp6bGVOVi16LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFItZGlzcGxheS0wMTMwNCIsICJkaXNwbGF5IG11c3QgcG9pbnQgdG8gYSB2YWxpZCBXYXlsYW5kIHdsX2Rpc3BsYXkuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLWRpc3BsYXktMDEzMDQpIn0sCisgICAgeyJWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQiLCAicE5leHQgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1dBWUxBTkRfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSLXN1cmZhY2UtMDEzMDUiLCAic3VyZmFjZSBtdXN0IHBvaW50IHRvIGEgdmFsaWQgV2F5bGFuZCB3bF9zdXJmYWNlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zdXJmYWNlLTAxMzA1KSJ9LAorICAgIHsiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1jb21tb25wYXJlbnQiLCAiQm90aCBvZiB0aGUgZWxlbWVudHMgb2YgcEFjcXVpcmVTeW5jcywgYW5kIHRoZSBlbGVtZW50cyBvZiBwUmVsZWFzZVN5bmNzIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItcEFjcXVpcmVLZXlzLXBhcmFtZXRlciIsICJJZiBhY3F1aXJlQ291bnQgaXMgbm90IDAsIHBBY3F1aXJlS2V5cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhY3F1aXJlQ291bnQgdWludDY0X3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBBY3F1aXJlS2V5cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBBY3F1aXJlU3luY3MtMDAwODEiLCAiRWFjaCBtZW1iZXIgb2YgcEFjcXVpcmVTeW5jcyBhbmQgcFJlbGVhc2VTeW5jcyBtdXN0IGJlIGEgZGV2aWNlIG1lbW9yeSBvYmplY3QgaW1wb3J0ZWQgYnkgc2V0dGluZyBWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb0tIUjo6aGFuZGxlVHlwZSB0byBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfRDNEMTFfVEVYVFVSRV9CSVQgb3IgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0QzRDExX1RFWFRVUkVfS01UX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItcEFjcXVpcmVTeW5jcy0wMDA4MSkifSwKKyAgICB7IlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItcEFjcXVpcmVTeW5jcy1wYXJhbWV0ZXIiLCAiSWYgYWNxdWlyZUNvdW50IGlzIG5vdCAwLCBwQWNxdWlyZVN5bmNzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGFjcXVpcmVDb3VudCB2YWxpZCBWa0RldmljZU1lbW9yeSBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBBY3F1aXJlU3luY3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1wQWNxdWlyZVRpbWVvdXRzLXBhcmFtZXRlciIsICJJZiBhY3F1aXJlQ291bnQgaXMgbm90IDAsIHBBY3F1aXJlVGltZW91dHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYWNxdWlyZUNvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1wQWNxdWlyZVRpbWVvdXRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItcFJlbGVhc2VLZXlzLXBhcmFtZXRlciIsICJJZiByZWxlYXNlQ291bnQgaXMgbm90IDAsIHBSZWxlYXNlS2V5cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiByZWxlYXNlQ291bnQgdWludDY0X3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBSZWxlYXNlS2V5cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvS0hSLXBSZWxlYXNlU3luY3MtcGFyYW1ldGVyIiwgIklmIHJlbGVhc2VDb3VudCBpcyBub3QgMCwgcFJlbGVhc2VTeW5jcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiByZWxlYXNlQ291bnQgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb0tIUi1wUmVsZWFzZVN5bmNzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9LRVlFRF9NVVRFWF9BQ1FVSVJFX1JFTEVBU0VfSU5GT19LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgdGhlIGVsZW1lbnRzIG9mIHBBY3F1aXJlU3luY3MsIGFuZCB0aGUgZWxlbWVudHMgb2YgcFJlbGVhc2VTeW5jcyB0aGF0IGFyZSB2YWxpZCBoYW5kbGVzIG9mIG5vbi1pZ25vcmVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1wQWNxdWlyZUtleXMtcGFyYW1ldGVyIiwgIklmIGFjcXVpcmVDb3VudCBpcyBub3QgMCwgcEFjcXVpcmVLZXlzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGFjcXVpcmVDb3VudCB1aW50NjRfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1wQWNxdWlyZUtleXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBBY3F1aXJlU3luY3MtcGFyYW1ldGVyIiwgIklmIGFjcXVpcmVDb3VudCBpcyBub3QgMCwgcEFjcXVpcmVTeW5jcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhY3F1aXJlQ291bnQgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBBY3F1aXJlU3luY3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcy1wYXJhbWV0ZXIiLCAiSWYgYWNxdWlyZUNvdW50IGlzIG5vdCAwLCBwQWNxdWlyZVRpbWVvdXRNaWxsaXNlY29uZHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYWNxdWlyZUNvdW50IHVpbnQzMl90IHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dpbjMyS2V5ZWRNdXRleEFjcXVpcmVSZWxlYXNlSW5mb05WLXBBY3F1aXJlVGltZW91dE1pbGxpc2Vjb25kcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYtcFJlbGVhc2VLZXlzLXBhcmFtZXRlciIsICJJZiByZWxlYXNlQ291bnQgaXMgbm90IDAsIHBSZWxlYXNlS2V5cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiByZWxlYXNlQ291bnQgdWludDY0X3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYtcFJlbGVhc2VLZXlzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1wUmVsZWFzZVN5bmNzLXBhcmFtZXRlciIsICJJZiByZWxlYXNlQ291bnQgaXMgbm90IDAsIHBSZWxlYXNlU3luY3MgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcmVsZWFzZUNvdW50IHZhbGlkIFZrRGV2aWNlTWVtb3J5IGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1wUmVsZWFzZVN5bmNzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtXaW4zMktleWVkTXV0ZXhBY3F1aXJlUmVsZWFzZUluZm9OVi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX0tFWUVEX01VVEVYX0FDUVVJUkVfUkVMRUFTRV9JTkZPX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2luMzJLZXllZE11dGV4QWNxdWlyZVJlbGVhc2VJbmZvTlYtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFItaGluc3RhbmNlLTAxMzA3IiwgImhpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgV2luMzIgSElOU1RBTkNFLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFItaGluc3RhbmNlLTAxMzA3KSJ9LAorICAgIHsiVlVJRC1Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFItaHduZC0wMTMwOCIsICJod25kIG11c3QgYmUgYSB2YWxpZCBXaW4zMiBIV05ELiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFItaHduZC0wMTMwOCkifSwKKyAgICB7IlZVSUQtVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFItcE5leHQtcE5leHQpIn0sCisgICAgeyJWVUlELVZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSIsICJzVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZHN0U2V0LCBhbmQgdGhlIGVsZW1lbnRzIG9mIHBUZXhlbEJ1ZmZlclZpZXcgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yQ291bnQtMDAzMTciLCAiQWxsIGNvbnNlY3V0aXZlIGJpbmRpbmdzIHVwZGF0ZWQgdmlhIGEgc2luZ2xlIFZrV3JpdGVEZXNjcmlwdG9yU2V0IHN0cnVjdHVyZSwgZXhjZXB0IHRob3NlIHdpdGggYSBkZXNjcmlwdG9yQ291bnQgb2YgemVybywgbXVzdCBoYXZlIGlkZW50aWNhbCBkZXNjcmlwdG9yVHlwZSBhbmQgc3RhZ2VGbGFncy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvckNvdW50LTAwMzE3KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yQ291bnQtMDAzMTgiLCAiQWxsIGNvbnNlY3V0aXZlIGJpbmRpbmdzIHVwZGF0ZWQgdmlhIGEgc2luZ2xlIFZrV3JpdGVEZXNjcmlwdG9yU2V0IHN0cnVjdHVyZSwgZXhjZXB0IHRob3NlIHdpdGggYSBkZXNjcmlwdG9yQ291bnQgb2YgemVybywgbXVzdCBhbGwgZWl0aGVyIHVzZSBpbW11dGFibGUgc2FtcGxlcnMgb3IgbXVzdCBhbGwgbm90IHVzZSBpbW11dGFibGUgc2FtcGxlcnMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JDb3VudC0wMDMxOCkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvckNvdW50LTAzMDQ4IiwgIkFsbCBjb25zZWN1dGl2ZSBiaW5kaW5ncyB1cGRhdGVkIHZpYSBhIHNpbmdsZSBWa1dyaXRlRGVzY3JpcHRvclNldCBzdHJ1Y3R1cmUsIGV4Y2VwdCB0aG9zZSB3aXRoIGEgZGVzY3JpcHRvckNvdW50IG9mIHplcm8sIG11c3QgaGF2ZSBpZGVudGljYWwgVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdCaXRzRVhULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yQ291bnQtMDMwNDgpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JDb3VudC1hcnJheWxlbmd0aCIsICJkZXNjcmlwdG9yQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzE5IiwgImRlc2NyaXB0b3JUeXBlIG11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgZHN0QmluZGluZyB3aXRoaW4gZHN0U2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzE5KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyMiIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSwgb3IgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQsIHBJbWFnZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVzY3JpcHRvckNvdW50IHZhbGlkIFZrRGVzY3JpcHRvckltYWdlSW5mbyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzIyKSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyMyIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSLCBwVGV4ZWxCdWZmZXJWaWV3IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JDb3VudCB2YWxpZCBWa0J1ZmZlclZpZXcgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyMykifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjQiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDLCBvciBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQywgcEJ1ZmZlckluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVzY3JpcHRvckNvdW50IHZhbGlkIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyNCkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjUiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgb3IgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIGFuZCBkc3RTZXQgd2FzIG5vdCBhbGxvY2F0ZWQgd2l0aCBhIGxheW91dCB0aGF0IGluY2x1ZGVkIGltbXV0YWJsZSBzYW1wbGVycyBmb3IgZHN0QmluZGluZyB3aXRoIGRlc2NyaXB0b3JUeXBlLCB0aGUgc2FtcGxlciBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBJbWFnZUluZm8gbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlciBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjUpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI2IiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UsIG9yIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5ULCB0aGUgaW1hZ2VWaWV3IGFuZCBpbWFnZUxheW91dCBtZW1iZXJzIG9mIGVhY2ggZWxlbWVudCBvZiBwSW1hZ2VJbmZvIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlVmlldyBhbmQgVmtJbWFnZUxheW91dCwgcmVzcGVjdGl2ZWx5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI2KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyNyIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMsIHRoZSBvZmZzZXQgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwQnVmZmVySW5mbyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWluVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyNykifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjgiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSIG9yIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDLCB0aGUgb2Zmc2V0IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcEJ1ZmZlckluZm8gbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjgpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI5IiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMsIGFuZCB0aGUgYnVmZmVyIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwQnVmZmVySW5mbyBpcyB0aGUgaGFuZGxlIG9mIGEgbm9uLXNwYXJzZSBidWZmZXIsIHRoZW4gdGhhdCBidWZmZXIgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI5KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzMCIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMsIHRoZSBidWZmZXIgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwQnVmZmVySW5mbyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzApIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMxIiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiBvciBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQywgdGhlIGJ1ZmZlciBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBCdWZmZXJJbmZvIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklUIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzMSkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzIiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSIG9yIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDLCB0aGUgcmFuZ2UgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwQnVmZmVySW5mbywgb3IgdGhlIGVmZmVjdGl2ZSByYW5nZSBpZiByYW5nZSBpcyBWS19XSE9MRV9TSVpFLCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhVbmlmb3JtQnVmZmVyUmFuZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzIpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMzIiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiBvciBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQywgdGhlIHJhbmdlIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcEJ1ZmZlckluZm8sIG9yIHRoZSBlZmZlY3RpdmUgcmFuZ2UgaWYgcmFuZ2UgaXMgVktfV0hPTEVfU0laRSwgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4U3RvcmFnZUJ1ZmZlclJhbmdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMzKSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzNCIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIsIHRoZSBWa0J1ZmZlciB0aGF0IGVhY2ggZWxlbWVudCBvZiBwVGV4ZWxCdWZmZXJWaWV3IHdhcyBjcmVhdGVkIGZyb20gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM0KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzNSIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVIsIHRoZSBWa0J1ZmZlciB0aGF0IGVhY2ggZWxlbWVudCBvZiBwVGV4ZWxCdWZmZXJWaWV3IHdhcyBjcmVhdGVkIGZyb20gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM1KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzNiIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSBvciBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVCwgdGhlIGltYWdlVmlldyBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBJbWFnZUluZm8gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBpZGVudGl0eSBzd2l6emxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM2KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzNyIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSBvciBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgdGhlIGltYWdlVmlldyBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBJbWFnZUluZm8gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzNykifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzgiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQsIHRoZSBpbWFnZVZpZXcgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwSW1hZ2VJbmZvIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzgpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM5IiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFLCB0aGUgaW1hZ2VWaWV3IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcEltYWdlSW5mbyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzM5KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMTQwMiIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSwgZm9yIGVhY2ggZGVzY3JpcHRvciB0aGF0IHdpbGwgYmUgYWNjZXNzZWQgdmlhIGxvYWQgb3Igc3RvcmUgb3BlcmF0aW9ucyB0aGUgaW1hZ2VMYXlvdXQgbWVtYmVyIGZvciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHBJbWFnZUluZm8gbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMTQwMikifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDE0MDMiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0Ugb3IgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIHRoZSBpbWFnZUxheW91dCBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBJbWFnZUluZm8gbXVzdCBiZSBhIG1lbWJlciBvZiB0aGUgbGlzdCBnaXZlbiBpbiBTYW1wbGVkIEltYWdlIG9yIENvbWJpbmVkIEltYWdlIFNhbXBsZXIsIGNvcnJlc3BvbmRpbmcgdG8gaXRzIHR5cGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDE0MDMpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAxOTQ2IiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFLCB0aGVuIHRoZSBpbWFnZVZpZXcgbWVtYmVyIG9mIGVhY2ggcEltYWdlSW5mbyBlbGVtZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aG91dCBhIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gc3RydWN0dXJlIGluIGl0cyBwTmV4dCBjaGFpbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMTk0NikifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDE5NDgiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIGFuZCBkc3RTZXQgd2FzIGFsbG9jYXRlZCB3aXRoIGEgbGF5b3V0IHRoYXQgaW5jbHVkZWQgaW1tdXRhYmxlIHNhbXBsZXJzIGZvciBkc3RCaW5kaW5nLCB0aGVuIHRoZSBpbWFnZVZpZXcgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwSW1hZ2VJbmZvIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuIGltbXV0YWJsZSBzYW1wbGVyIHRoYXQgZW5hYmxlcyBzYW1wbGVyIFknQ0JDUiBjb252ZXJzaW9uIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gc3RydWN0dXJlIGluIGl0cyBwTmV4dCBjaGFpbiB3aXRoIGFuIGlkZW50aWNhbGx5IGRlZmluZWQgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyB0byB0aGUgY29ycmVzcG9uZGluZyBpbW11dGFibGUgc2FtcGxlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMTk0OCkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMTkiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVCwgZHN0QXJyYXlFbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAyMjE5KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMjIyMCIsICJJZiBkZXNjcmlwdG9yVHlwZSBpcyBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhULCBkZXNjcmlwdG9yQ291bnQgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMjApIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAyMjIxIiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQsIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGluY2x1ZGUgYSBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCBzdHJ1Y3R1cmUgd2hvc2UgZGF0YVNpemUgbWVtYmVyIGVxdWFscyBkZXNjcmlwdG9yQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMjEpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAyMzgyIiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WLCB0aGUgcE5leHQgY2hhaW4gbXVzdCBpbmNsdWRlIGEgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzdHJ1Y3R1cmUgd2hvc2UgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQgbWVtYmVyIGVxdWFscyBkZXNjcmlwdG9yQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIzODIpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAyNzM4IiwgIklmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCBhbmQgaWYgYW55IGVsZW1lbnQgb2YgcEltYWdlSW5mbyBoYXMgYSBpbWFnZVZpZXcgbWVtYmVyIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBhIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gc3RydWN0dXJlIGluIGl0cyBwTmV4dCBjaGFpbiwgdGhlbiBkc3RTZXQgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggYSBsYXlvdXQgdGhhdCBpbmNsdWRlZCBpbW11dGFibGUgc2FtcGxlcnMgZm9yIGRzdEJpbmRpbmcsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbW11dGFibGUgc2FtcGxlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYW4gaWRlbnRpY2FsbHkgZGVmaW5lZCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvIG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMjczOCkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDI3NTIiLCAiSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIsIHRoZW4gZHN0U2V0IG11c3Qgbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBhIGxheW91dCB0aGF0IGluY2x1ZGVkIGltbXV0YWJsZSBzYW1wbGVycyBmb3IgZHN0QmluZGluZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMjc1MikifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtcGFyYW1ldGVyIiwgImRlc2NyaXB0b3JUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QXJyYXlFbGVtZW50LTAwMzIxIiwgIlRoZSBzdW0gb2YgZHN0QXJyYXlFbGVtZW50IGFuZCBkZXNjcmlwdG9yQ291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYmluZGluZyBzcGVjaWZpZWQgYnkgZHN0QmluZGluZywgYW5kIGFsbCBhcHBsaWNhYmxlIGNvbnNlY3V0aXZlIGJpbmRpbmdzLCBhcyBkZXNjcmliZWQgYnkgY29uc2VjdXRpdmUgYmluZGluZyB1cGRhdGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRzdEFycmF5RWxlbWVudC0wMDMyMSkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDMxNSIsICJkc3RCaW5kaW5nIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGJpbmRpbmcgb2YgYWxsIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBkc3RTZXQncyBkZXNjcmlwdG9yIHNldCBsYXlvdXQgd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDMxNSkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDMxNiIsICJkc3RCaW5kaW5nIG11c3QgYmUgYSBiaW5kaW5nIHdpdGggYSBub24temVybyBkZXNjcmlwdG9yQ291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDMxNikifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0U2V0LTAwMzIwIiwgImRzdFNldCBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yU2V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kc3RTZXQtMDAzMjApIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LXBOZXh0LXBOZXh0IiwgIkVhY2ggcE5leHQgbWVtYmVyIG9mIGFueSBzdHJ1Y3R1cmUgKGluY2x1ZGluZyB0aGlzIG9uZSkgaW4gdGhlIHBOZXh0IGNoYWluIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHRvIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBvciBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1zVHlwZS1zVHlwZSkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtc1R5cGUtdW5pcXVlIiwgIkVhY2ggc1R5cGUgbWVtYmVyIGluIHRoZSBwTmV4dCBjaGFpbiBtdXN0IGJlIHVuaXF1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1zVHlwZS11bmlxdWUpIn0sCisgICAgeyJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQtMDIyMzYiLCAiYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQgbXVzdCBiZSBlcXVhbCB0byBkZXNjcmlwdG9yQ291bnQgaW4gdGhlIGV4dGVuZGVkIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LTAyMjM2KSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LWFycmF5bGVuZ3RoIiwgImFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1wQWNjZWxlcmF0aW9uU3RydWN0dXJlcy0wMjc2NCIsICJFYWNoIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaW4gcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9UT1BfTEVWRUxfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1wQWNjZWxlcmF0aW9uU3RydWN0dXJlcy0wMjc2NCkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1wQWNjZWxlcmF0aW9uU3RydWN0dXJlcy1wYXJhbWV0ZXIiLCAicEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQgdmFsaWQgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVC1kYXRhU2l6ZS0wMjIyMiIsICJkYXRhU2l6ZSBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVC1kYXRhU2l6ZS0wMjIyMikifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQtZGF0YVNpemUtYXJyYXlsZW5ndGgiLCAiZGF0YVNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVC1kYXRhU2l6ZS1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQtcERhdGEtcGFyYW1ldGVyIiwgInBEYXRhIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRhdGFTaXplIGJ5dGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0SW5saW5lVW5pZm9ybUJsb2NrRVhULXBEYXRhLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQtc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVF9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tFWFQtc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFItY29ubmVjdGlvbi0wMTMxMCIsICJjb25uZWN0aW9uIG11c3QgcG9pbnQgdG8gYSB2YWxpZCBYMTEgeGNiX2Nvbm5lY3Rpb25fdC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUi1jb25uZWN0aW9uLTAxMzEwKSJ9LAorICAgIHsiVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLWZsYWdzLXplcm9iaXRtYXNrKSJ9LAorICAgIHsiVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0KSJ9LAorICAgIHsiVlVJRC1Wa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlIiwgInNUeXBlIG11c3QgYmUgVktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUpIn0sCisgICAgeyJWVUlELVZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFItd2luZG93LTAxMzExIiwgIndpbmRvdyBtdXN0IGJlIGEgdmFsaWQgWDExIHhjYl93aW5kb3dfdC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUi13aW5kb3ctMDEzMTEpIn0sCisgICAgeyJWVUlELVZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSLWRweS0wMTMxMyIsICJkcHkgbXVzdCBwb2ludCB0byBhIHZhbGlkIFhsaWIgRGlzcGxheS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFItZHB5LTAxMzEzKSJ9LAorICAgIHsiVlVJRC1Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1mbGFncy16ZXJvYml0bWFzayIsICJmbGFncyBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFItZmxhZ3MtemVyb2JpdG1hc2spIn0sCisgICAgeyJWVUlELVZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSLXBOZXh0LXBOZXh0IiwgInBOZXh0IG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC1Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUi1wTmV4dC1wTmV4dCkifSwKKyAgICB7IlZVSUQtVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFItc1R5cGUtc1R5cGUiLCAic1R5cGUgbXVzdCBiZSBWS19TVFJVQ1RVUkVfVFlQRV9YTElCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELVZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSLXNUeXBlLXNUeXBlKSJ9LAorICAgIHsiVlVJRC1Wa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUi13aW5kb3ctMDEzMTQiLCAid2luZG93IG11c3QgYmUgYSB2YWxpZCBYbGliIFdpbmRvdy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFItd2luZG93LTAxMzE0KSJ9LAorICAgIHsiVlVJRC12a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBkZXZpY2UsIGFuZCBzd2FwY2hhaW4gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0luc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVC1zd2FwY2hhaW4tMDI2NzQiLCAic3dhcGNoYWluIG11c3Qgbm90IGJlIGluIHRoZSByZXRpcmVkIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULXN3YXBjaGFpbi0wMjY3NCkifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtc3dhcGNoYWluLTAyNjc1IiwgInN3YXBjaGFpbiBtdXN0IGJlIGEgc3dhcGNoYWluIGNyZWF0ZWQgd2l0aCBhIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIHN0cnVjdHVyZSwgd2l0aCBmdWxsU2NyZWVuRXhjbHVzaXZlIHNldCB0byBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQVBQTElDQVRJT05fQ09OVFJPTExFRF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtc3dhcGNoYWluLTAyNjc1KSJ9LAorICAgIHsiVlVJRC12a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVC1zd2FwY2hhaW4tMDI2NzYiLCAic3dhcGNoYWluIG11c3Qgbm90IGN1cnJlbnRseSBoYXZlIGV4Y2x1c2l2ZSBmdWxsLXNjcmVlbiBhY2Nlc3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtc3dhcGNoYWluLTAyNjc2KSJ9LAorICAgIHsiVlVJRC12a0FjcXVpcmVGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVC1zd2FwY2hhaW4tcGFyYW1ldGVyIiwgInN3YXBjaGFpbiBtdXN0IGJlIGEgdmFsaWQgVmtTd2FwY2hhaW5LSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULXN3YXBjaGFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZTJLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2UyS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZTJLSFItcEFjcXVpcmVJbmZvLXBhcmFtZXRlciIsICJwQWNxdWlyZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2UyS0hSLXBBY3F1aXJlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZTJLSFItcEltYWdlSW5kZXgtcGFyYW1ldGVyIiwgInBJbWFnZUluZGV4IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlMktIUi1wSW1hZ2VJbmRleC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZTJLSFItc3dhcGNoYWluLTAxODAzIiwgIklmIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGFjcXVpcmVkIGltYWdlcyBpcyBncmVhdGVyIHRoYW4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIGltYWdlcyBpbiB0aGUgc3dhcGNoYWluIG1lbWJlciBvZiBwQWNxdWlyZUluZm8gYW5kIHRoZSB2YWx1ZSBvZiBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFI6Om1pbkltYWdlQ291bnQgYXMgcmV0dXJuZWQgYnkgYSBjYWxsIHRvIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUiB3aXRoIHRoZSBzdXJmYWNlIHVzZWQgdG8gY3JlYXRlIHN3YXBjaGFpbiwgdGhlIHRpbWVvdXQgbWVtYmVyIG9mIHBBY3F1aXJlSW5mbyBtdXN0IG5vdCBiZSBVSU5UNjRfTUFYIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZU5leHRJbWFnZTJLSFItc3dhcGNoYWluLTAxODAzKSJ9LAorICAgIHsiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZGV2aWNlLCBhbmQgc3dhcGNoYWluIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrSW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1mZW5jZS0wMTI4NyIsICJJZiBmZW5jZSBpcyBub3QgVktfTlVMTF9IQU5ETEUgaXQgbXVzdCBiZSB1bnNpZ25hbGVkIGFuZCBtdXN0IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IG90aGVyIHF1ZXVlIGNvbW1hbmQgdGhhdCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZXhlY3V0aW9uIG9uIHRoYXQgcXVldWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLWZlbmNlLTAxMjg3KSJ9LAorICAgIHsiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItZmVuY2UtcGFyYW1ldGVyIiwgIklmIGZlbmNlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZmVuY2UgbXVzdCBiZSBhIHZhbGlkIFZrRmVuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1mZW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1mZW5jZS1wYXJlbnQiLCAiSWYgZmVuY2UgaXMgYSB2YWxpZCBoYW5kbGUsIGl0IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1mZW5jZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1wSW1hZ2VJbmRleC1wYXJhbWV0ZXIiLCAicEltYWdlSW5kZXggbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItcEltYWdlSW5kZXgtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0FjcXVpcmVOZXh0SW1hZ2VLSFItc2VtYXBob3JlLTAxMjg2IiwgIklmIHNlbWFwaG9yZSBpcyBub3QgVktfTlVMTF9IQU5ETEUgaXQgbXVzdCBiZSB1bnNpZ25hbGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtMDEyODYpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtMDE3NzkiLCAiSWYgc2VtYXBob3JlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSBpdCBtdXN0IG5vdCBoYXZlIGFueSB1bmNvbXBsZXRlZCBzaWduYWwgb3Igd2FpdCBvcGVyYXRpb25zIHBlbmRpbmcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS0wMTc3OSkifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS0wMTc4MCIsICJzZW1hcGhvcmUgYW5kIGZlbmNlIG11c3Qgbm90IGJvdGggYmUgZXF1YWwgdG8gVktfTlVMTF9IQU5ETEUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS0wMTc4MCkifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS0wMzI2NSIsICJzZW1hcGhvcmUgbXVzdCBoYXZlIGEgVmtTZW1hcGhvcmVUeXBlS0hSIG9mIFZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS0wMzI2NSkifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIiLCAiSWYgc2VtYXBob3JlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgc2VtYXBob3JlIG11c3QgYmUgYSB2YWxpZCBWa1NlbWFwaG9yZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtcGFyZW50IiwgIklmIHNlbWFwaG9yZSBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zd2FwY2hhaW4tMDEyODUiLCAic3dhcGNoYWluIG11c3Qgbm90IGJlIGluIHRoZSByZXRpcmVkIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zd2FwY2hhaW4tMDEyODUpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zd2FwY2hhaW4tMDE4MDIiLCAiSWYgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgYWNxdWlyZWQgaW1hZ2VzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgaW1hZ2VzIGluIHN3YXBjaGFpbiBhbmQgdGhlIHZhbHVlIG9mIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUjo6bWluSW1hZ2VDb3VudCBhcyByZXR1cm5lZCBieSBhIGNhbGwgdG8gdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIHdpdGggdGhlIHN1cmZhY2UgdXNlZCB0byBjcmVhdGUgc3dhcGNoYWluLCB0aW1lb3V0IG11c3Qgbm90IGJlIFVJTlQ2NF9NQVggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXN3YXBjaGFpbi0wMTgwMikifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLCAic3dhcGNoYWluIG11c3QgYmUgYSB2YWxpZCBWa1N3YXBjaGFpbktIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwtcEFjcXVpcmVJbmZvLXBhcmFtZXRlciIsICJwQWNxdWlyZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BlcmZvcm1hbmNlQ29uZmlndXJhdGlvbkFjcXVpcmVJbmZvSU5URUwgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLXBBY3F1aXJlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLXBDb25maWd1cmF0aW9uLXBhcmFtZXRlciIsICJwQ29uZmlndXJhdGlvbiBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLXBDb25maWd1cmF0aW9uLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUi1wSW5mby1wYXJhbWV0ZXIiLCAicEluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUi1wSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZVhsaWJEaXNwbGF5RVhULWRpc3BsYXktcGFyYW1ldGVyIiwgImRpc3BsYXkgbXVzdCBiZSBhIHZhbGlkIFZrRGlzcGxheUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBY3F1aXJlWGxpYkRpc3BsYXlFWFQtZGlzcGxheS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWNxdWlyZVhsaWJEaXNwbGF5RVhULWRweS1wYXJhbWV0ZXIiLCAiZHB5IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgRGlzcGxheSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FjcXVpcmVYbGliRGlzcGxheUVYVC1kcHktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0FjcXVpcmVYbGliRGlzcGxheUVYVC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWNxdWlyZVhsaWJEaXNwbGF5RVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWxsb2NhdGVDb21tYW5kQnVmZmVycy1wQWxsb2NhdGVJbmZvLXBhcmFtZXRlciIsICJwQWxsb2NhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMtcEFsbG9jYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWxsb2NhdGVDb21tYW5kQnVmZmVycy1wQWxsb2NhdGVJbmZvOjpjb21tYW5kQnVmZmVyQ291bnQtYXJyYXlsZW5ndGgiLCAiVGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcEFsbG9jYXRlSW5mbzo6Y29tbWFuZEJ1ZmZlckNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzLXBBbGxvY2F0ZUluZm86OmNvbW1hbmRCdWZmZXJDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzLXBDb21tYW5kQnVmZmVycy1wYXJhbWV0ZXIiLCAicENvbW1hbmRCdWZmZXJzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBBbGxvY2F0ZUluZm86OmNvbW1hbmRCdWZmZXJDb3VudCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMtcENvbW1hbmRCdWZmZXJzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cy1wQWxsb2NhdGVJbmZvLXBhcmFtZXRlciIsICJwQWxsb2NhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FsbG9jYXRlRGVzY3JpcHRvclNldHMtcEFsbG9jYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cy1wQWxsb2NhdGVJbmZvOjpkZXNjcmlwdG9yU2V0Q291bnQtYXJyYXlsZW5ndGgiLCAiVGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcEFsbG9jYXRlSW5mbzo6ZGVzY3JpcHRvclNldENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzLXBBbGxvY2F0ZUluZm86OmRlc2NyaXB0b3JTZXRDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy1wYXJhbWV0ZXIiLCAicERlc2NyaXB0b3JTZXRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBBbGxvY2F0ZUluZm86OmRlc2NyaXB0b3JTZXRDb3VudCBWa0Rlc2NyaXB0b3JTZXQgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0FsbG9jYXRlRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JTZXRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWxsb2NhdGVNZW1vcnktZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1kZXZpY2VDb2hlcmVudE1lbW9yeS0wMjc5MCIsICJJZiB0aGUgZGV2aWNlQ29oZXJlbnRNZW1vcnkgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgcEFsbG9jYXRlSW5mby0+bWVtb3J5VHlwZUluZGV4IG11c3Qgbm90IGlkZW50aWZ5IGEgbWVtb3J5IHR5cGUgc3VwcG9ydGluZyBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0NPSEVSRU5UX0JJVF9BTUQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1kZXZpY2VDb2hlcmVudE1lbW9yeS0wMjc5MCkifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1wQWxsb2NhdGVJbmZvLTAxNzEzIiwgInBBbGxvY2F0ZUluZm8tPmFsbG9jYXRpb25TaXplIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOjptZW1vcnlIZWFwc1ttZW1pbmRleF0uc2l6ZSB3aGVyZSBtZW1pbmRleCA9IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOjptZW1vcnlUeXBlc1twQWxsb2NhdGVJbmZvLT5tZW1vcnlUeXBlSW5kZXhdLmhlYXBJbmRleCBhcyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBmb3IgdGhlIFZrUGh5c2ljYWxEZXZpY2UgdGhhdCBkZXZpY2Ugd2FzIGNyZWF0ZWQgZnJvbS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1wQWxsb2NhdGVJbmZvLTAxNzEzKSJ9LAorICAgIHsiVlVJRC12a0FsbG9jYXRlTWVtb3J5LXBBbGxvY2F0ZUluZm8tMDE3MTQiLCAicEFsbG9jYXRlSW5mby0+bWVtb3J5VHlwZUluZGV4IG11c3QgYmUgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOjptZW1vcnlUeXBlQ291bnQgYXMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgZm9yIHRoZSBWa1BoeXNpY2FsRGV2aWNlIHRoYXQgZGV2aWNlIHdhcyBjcmVhdGVkIGZyb20uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWxsb2NhdGVNZW1vcnktcEFsbG9jYXRlSW5mby0wMTcxNCkifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1wQWxsb2NhdGVJbmZvLXBhcmFtZXRlciIsICJwQWxsb2NhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtNZW1vcnlBbGxvY2F0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWxsb2NhdGVNZW1vcnktcEFsbG9jYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQWxsb2NhdGVNZW1vcnktcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtBbGxvY2F0ZU1lbW9yeS1wTWVtb3J5LXBhcmFtZXRlciIsICJwTWVtb3J5IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtEZXZpY2VNZW1vcnkgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQWxsb2NhdGVNZW1vcnktcE1lbW9yeS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNDkiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IG5vdCBiZSBpbiB0aGUgcmVjb3JkaW5nIG9yIHBlbmRpbmcgc3RhdGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNDkpIn0sCisgICAgeyJWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNTAiLCAiSWYgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gYSBWa0NvbW1hbmRQb29sIHdoaWNoIGRpZCBub3QgaGF2ZSB0aGUgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQgZmxhZyBzZXQsIGNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgaW5pdGlhbCBzdGF0ZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCZWdpbkNvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA1MCkifSwKKyAgICB7IlZVSUQtdmtCZWdpbkNvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA1MSIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGEgc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyLCB0aGUgcEluaGVyaXRhbmNlSW5mbyBtZW1iZXIgb2YgcEJlZ2luSW5mbyBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JlZ2luQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDUxKSJ9LAorICAgIHsiVlVJRC12a0JlZ2luQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDUyIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIgYW5kIGVpdGhlciB0aGUgb2NjbHVzaW9uUXVlcnlFbmFibGUgbWVtYmVyIG9mIHRoZSBwSW5oZXJpdGFuY2VJbmZvIG1lbWJlciBvZiBwQmVnaW5JbmZvIGlzIFZLX0ZBTFNFLCBvciB0aGUgcHJlY2lzZSBvY2NsdXNpb24gcXVlcmllcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB0aGUgcXVlcnlGbGFncyBtZW1iZXIgb2YgdGhlIHBJbmhlcml0YW5jZUluZm8gbWVtYmVyIHBCZWdpbkluZm8gbXVzdCBub3QgY29udGFpbiBWS19RVUVSWV9DT05UUk9MX1BSRUNJU0VfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNTIpIn0sCisgICAgeyJWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCZWdpbkNvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLXBCZWdpbkluZm8tcGFyYW1ldGVyIiwgInBCZWdpbkluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmVnaW5Db21tYW5kQnVmZmVyLXBCZWdpbkluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVi1iaW5kSW5mb0NvdW50LWFycmF5bGVuZ3RoIiwgImJpbmRJbmZvQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVi1iaW5kSW5mb0NvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WLXBCaW5kSW5mb3MtcGFyYW1ldGVyIiwgInBCaW5kSW5mb3MgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYmluZEluZm9Db3VudCB2YWxpZCBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVi1wQmluZEluZm9zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LU5vbmUtMDE4OTgiLCAiSWYgYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGggdGhlIFZLX0JVRkZFUl9DUkVBVEVfUFJPVEVDVEVEX0JJVCBiaXQgc2V0LCB0aGUgYnVmZmVyIG11c3QgYmUgYm91bmQgdG8gYSBtZW1vcnkgb2JqZWN0IGFsbG9jYXRlZCB3aXRoIGEgbWVtb3J5IHR5cGUgdGhhdCByZXBvcnRzIFZLX01FTU9SWV9QUk9QRVJUWV9QUk9URUNURURfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1Ob25lLTAxODk4KSJ9LAorICAgIHsiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktTm9uZS0wMTg5OSIsICJJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX0NSRUFURV9QUk9URUNURURfQklUIGJpdCBub3Qgc2V0LCB0aGUgYnVmZmVyIG11c3Qgbm90IGJlIGJvdW5kIHRvIGEgbWVtb3J5IG9iamVjdCBjcmVhdGVkIHdpdGggYSBtZW1vcnkgdHlwZSB0aGF0IHJlcG9ydHMgVktfTUVNT1JZX1BST1BFUlRZX1BST1RFQ1RFRF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LU5vbmUtMDE4OTkpIn0sCisgICAgeyJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItMDEwMjkiLCAiYnVmZmVyIG11c3Qgbm90IGFscmVhZHkgYmUgYmFja2VkIGJ5IGEgbWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyLTAxMDI5KSJ9LAorICAgIHsiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyLTAxMDMwIiwgImJ1ZmZlciBtdXN0IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGFueSBzcGFyc2UgbWVtb3J5IGJpbmRpbmcgZmxhZ3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci0wMTAzMCkifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci0wMTAzOCIsICJJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlY6OmRlZGljYXRlZEFsbG9jYXRpb24gZXF1YWwgdG8gVktfVFJVRSwgbWVtb3J5IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjo6YnVmZmVyIGVxdWFsIHRvIGEgYnVmZmVyIGhhbmRsZSBjcmVhdGVkIHdpdGggaWRlbnRpY2FsIGNyZWF0aW9uIHBhcmFtZXRlcnMgdG8gYnVmZmVyIGFuZCBtZW1vcnlPZmZzZXQgbXVzdCBiZSB6ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItMDEwMzgpIn0sCisgICAgeyJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItMDEwMzkiLCAiSWYgYnVmZmVyIHdhcyBub3QgY3JlYXRlZCB3aXRoIFZrRGVkaWNhdGVkQWxsb2NhdGlvbkJ1ZmZlckNyZWF0ZUluZm9OVjo6ZGVkaWNhdGVkQWxsb2NhdGlvbiBlcXVhbCB0byBWS19UUlVFLCBtZW1vcnkgbXVzdCBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkZWRpY2F0ZWQgZm9yIGEgc3BlY2lmaWMgYnVmZmVyIG9yIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItMDEwMzkpIn0sCisgICAgeyJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItMDE0NDQiLCAiSWYgYnVmZmVyIHJlcXVpcmVzIGEgZGVkaWNhdGVkIGFsbG9jYXRpb24oYXMgcmVwb3J0ZWQgYnkgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyIGluIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzOjpyZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gZm9yIGJ1ZmZlciksIG1lbW9yeSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmJ1ZmZlciBlcXVhbCB0byBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci0wMTQ0NCkifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci1wYXJhbWV0ZXIiLCAiYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItcGFyZW50IiwgImJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlckRldmljZUFkZHJlc3MtMDMzMzkiLCAiSWYgdGhlIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI6OmJ1ZmZlckRldmljZUFkZHJlc3MgZmVhdHVyZSBpcyBlbmFibGVkIGFuZCBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfS0hSIGJpdCBzZXQsIG1lbW9yeSBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCB0aGUgVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0JJVF9LSFIgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyRGV2aWNlQWRkcmVzcy0wMzMzOSkifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnktMDEwMzUiLCAibWVtb3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1lbW9yeSB0eXBlcyBhbGxvd2VkIGluIHRoZSBtZW1vcnlUeXBlQml0cyBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyB3aXRoIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LTAxMDM1KSJ9LAorICAgIHsiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LTAxNTA4IiwgIklmIHRoZSBWa01lbW9yeUFsbG9jYXRlSW5mbyBwcm92aWRlZCB3aGVuIG1lbW9yeSB3YXMgYWxsb2NhdGVkIGluY2x1ZGVkIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gc3RydWN0dXJlIGluIGl0cyBwTmV4dCBjaGFpbiwgYW5kIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjpidWZmZXIgd2FzIG5vdCBWS19OVUxMX0hBTkRMRSwgdGhlbiBidWZmZXIgbXVzdCBlcXVhbCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzo6YnVmZmVyLCBhbmQgbWVtb3J5T2Zmc2V0IG11c3QgYmUgemVyby4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS0wMTUwOCkifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS0wMjcyNiIsICJJZiB0aGUgdmFsdWUgb2YgVmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm86OmhhbmRsZVR5cGVzIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGlzIG5vdCAwLCBpdCBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG9mIHRoZSBoYW5kbGVzIHNldCBpbiBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbzo6aGFuZGxlVHlwZXMgd2hlbiBidWZmZXIgd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS0wMjcyNikifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS0wMjcyNyIsICJJZiBtZW1vcnkgd2FzIGNyZWF0ZWQgYnkgYSBtZW1vcnkgaW1wb3J0IG9wZXJhdGlvbiwgdGhlIGV4dGVybmFsIGhhbmRsZSB0eXBlIG9mIHRoZSBpbXBvcnRlZCBtZW1vcnkgbXVzdCBhbHNvIGhhdmUgYmVlbiBzZXQgaW4gVmtFeHRlcm5hbE1lbW9yeUJ1ZmZlckNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIHdoZW4gYnVmZmVyIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnktMDI3MjcpIn0sCisgICAgeyJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnktcGFyYW1ldGVyIiwgIm1lbW9yeSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LXBhcmVudCIsICJtZW1vcnkgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnlPZmZzZXQtMDEwMzEiLCAibWVtb3J5T2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIG1lbW9yeSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDMxKSJ9LAorICAgIHsiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDM2IiwgIm1lbW9yeU9mZnNldCBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgdGhlIGFsaWdubWVudCBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyB3aXRoIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDM2KSJ9LAorICAgIHsiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktc2l6ZS0wMTAzNyIsICJUaGUgc2l6ZSBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyB3aXRoIGJ1ZmZlciBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBtZW1vcnkgbWludXMgbWVtb3J5T2Zmc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1zaXplLTAxMDM3KSJ9LAorICAgIHsiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnkyLWJpbmRJbmZvQ291bnQtYXJyYXlsZW5ndGgiLCAiYmluZEluZm9Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItYmluZEluZm9Db3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5Mi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5Mi1wQmluZEluZm9zLXBhcmFtZXRlciIsICJwQmluZEluZm9zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpbmRJbmZvQ291bnQgdmFsaWQgVmtCaW5kQnVmZmVyTWVtb3J5SW5mbyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItcEJpbmRJbmZvcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQmluZEltYWdlTWVtb3J5LU5vbmUtMDE5MDEiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX1BST1RFQ1RFRF9CSVQgYml0IHNldCwgdGhlIGltYWdlIG11c3QgYmUgYm91bmQgdG8gYSBtZW1vcnkgb2JqZWN0IGFsbG9jYXRlZCB3aXRoIGEgbWVtb3J5IHR5cGUgdGhhdCByZXBvcnRzIFZLX01FTU9SWV9QUk9QRVJUWV9QUk9URUNURURfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LU5vbmUtMDE5MDEpIn0sCisgICAgeyJWVUlELXZrQmluZEltYWdlTWVtb3J5LU5vbmUtMDE5MDIiLCAiSWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX1BST1RFQ1RFRF9CSVQgYml0IG5vdCBzZXQsIHRoZSBpbWFnZSBtdXN0IG5vdCBiZSBib3VuZCB0byBhIG1lbW9yeSBvYmplY3QgY3JlYXRlZCB3aXRoIGEgbWVtb3J5IHR5cGUgdGhhdCByZXBvcnRzIFZLX01FTU9SWV9QUk9QRVJUWV9QUk9URUNURURfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LU5vbmUtMDE5MDIpIn0sCisgICAgeyJWVUlELXZrQmluZEltYWdlTWVtb3J5LWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtMDEwNDQiLCAiaW1hZ2UgbXVzdCBub3QgYWxyZWFkeSBiZSBiYWNrZWQgYnkgYSBtZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLTAxMDQ0KSJ9LAorICAgIHsiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTA0NSIsICJpbWFnZSBtdXN0IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGFueSBzcGFyc2UgbWVtb3J5IGJpbmRpbmcgZmxhZ3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtMDEwNDUpIn0sCisgICAgeyJWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLTAxMDUwIiwgIklmIGltYWdlIHdhcyBjcmVhdGVkIHdpdGggVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlY6OmRlZGljYXRlZEFsbG9jYXRpb24gZXF1YWwgdG8gVktfVFJVRSwgbWVtb3J5IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OVjo6aW1hZ2UgZXF1YWwgdG8gYW4gaW1hZ2UgaGFuZGxlIGNyZWF0ZWQgd2l0aCBpZGVudGljYWwgY3JlYXRpb24gcGFyYW1ldGVycyB0byBpbWFnZSBhbmQgbWVtb3J5T2Zmc2V0IG11c3QgYmUgemVybyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTA1MCkifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtMDEwNTEiLCAiSWYgaW1hZ2Ugd2FzIG5vdCBjcmVhdGVkIHdpdGggVmtEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VDcmVhdGVJbmZvTlY6OmRlZGljYXRlZEFsbG9jYXRpb24gZXF1YWwgdG8gVktfVFJVRSwgbWVtb3J5IG11c3Qgbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZGVkaWNhdGVkIGZvciBhIHNwZWNpZmljIGJ1ZmZlciBvciBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTA1MSkifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtMDE0NDUiLCAiSWYgaW1hZ2UgcmVxdWlyZXMgYSBkZWRpY2F0ZWQgYWxsb2NhdGlvbiAoYXMgcmVwb3J0ZWQgYnkgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIgaW4gVmtNZW1vcnlEZWRpY2F0ZWRSZXF1aXJlbWVudHM6OnJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiBmb3IgaW1hZ2UpLCBtZW1vcnkgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjppbWFnZSBlcXVhbCB0byBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS0wMTQ0NSkifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtMDE2MDgiLCAiaW1hZ2UgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVCBzZXQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLTAxNjA4KSJ9LAorICAgIHsiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1pbWFnZS1wYXJhbWV0ZXIiLCAiaW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtcGFyZW50IiwgImltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAxMDQ3IiwgIm1lbW9yeSBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgb25lIG9mIHRoZSBtZW1vcnkgdHlwZXMgYWxsb3dlZCBpbiB0aGUgbWVtb3J5VHlwZUJpdHMgbWVtYmVyIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyB3aXRoIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS0wMTA0NykifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAxNTA5IiwgIklmIHRoZSBWa01lbW9yeUFsbG9jYXRlSW5mbyBwcm92aWRlZCB3aGVuIG1lbW9yeSB3YXMgYWxsb2NhdGVkIGluY2x1ZGVkIGEgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gc3RydWN0dXJlIGluIGl0cyBwTmV4dCBjaGFpbiwgYW5kIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvOjppbWFnZSB3YXMgbm90IFZLX05VTExfSEFORExFLCB0aGVuIGltYWdlIG11c3QgZXF1YWwgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmltYWdlIGFuZCBtZW1vcnlPZmZzZXQgbXVzdCBiZSB6ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS0wMTUwOSkifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAyNjI4IiwgIklmIHRoZSBkZWRpY2F0ZWQgYWxsb2NhdGlvbiBpbWFnZSBhbGlhc2luZyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgdGhlIFZrTWVtb3J5QWxsb2NhdGVJbmZvIHByb3ZpZGVkIHdoZW4gbWVtb3J5IHdhcyBhbGxvY2F0ZWQgaW5jbHVkZWQgYSBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbyBzdHJ1Y3R1cmUgaW4gaXRzIHBOZXh0IGNoYWluLCBhbmQgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmltYWdlIHdhcyBub3QgVktfTlVMTF9IQU5ETEUsIHRoZW4gaW1hZ2UgbXVzdCBlcXVhbCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzo6aW1hZ2UgYW5kIG1lbW9yeU9mZnNldCBtdXN0IGJlIHplcm8uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS0wMjYyOCkifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAyNjI5IiwgIklmIHRoZSBkZWRpY2F0ZWQgYWxsb2NhdGlvbiBpbWFnZSBhbGlhc2luZyBmZWF0dXJlIGlzIGVuYWJsZWQsIGFuZCB0aGUgVmtNZW1vcnlBbGxvY2F0ZUluZm8gcHJvdmlkZWQgd2hlbiBtZW1vcnkgd2FzIGFsbG9jYXRlZCBpbmNsdWRlZCBhIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIHN0cnVjdHVyZSBpbiBpdHMgcE5leHQgY2hhaW4sIGFuZCBWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mbzo6aW1hZ2Ugd2FzIG5vdCBWS19OVUxMX0hBTkRMRSwgdGhlbiBtZW1vcnlPZmZzZXQgbXVzdCBiZSB6ZXJvLCBhbmQgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgZXF1YWwgdG8gVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm86OmltYWdlIG9yIGFuIGltYWdlIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIHNhbWUgcGFyYW1ldGVycyBpbiBWa0ltYWdlQ3JlYXRlSW5mbywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgZXh0ZW50IGFuZCBhcnJheUxheWVycyBtYXkgZGlmZmVyIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGV2ZXJ5IGRpbWVuc2lvbiBpbiB0aGUgZXh0ZW50IHBhcmFtZXRlciBvZiB0aGUgaW1hZ2UgYmVpbmcgYm91bmQgbXVzdCBiZSBlcXVhbCB0byBvciBzbWFsbGVyIHRoYW4gdGhlIG9yaWdpbmFsIGltYWdlIGZvciB3aGljaCB0aGUgYWxsb2NhdGlvbiB3YXMgY3JlYXRlZDsgYW5kIHRoZSBhcnJheUxheWVycyBwYXJhbWV0ZXIgb2YgdGhlIGltYWdlIGJlaW5nIGJvdW5kIG11c3QgYmUgZXF1YWwgdG8gb3Igc21hbGxlciB0aGFuIHRoZSBvcmlnaW5hbCBpbWFnZSBmb3Igd2hpY2ggdGhlIGFsbG9jYXRpb24gd2FzIGNyZWF0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS0wMjYyOSkifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAyNzI4IiwgIklmIHRoZSB2YWx1ZSBvZiBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mbzo6aGFuZGxlVHlwZXMgdXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkgaXMgbm90IDAsIGl0IG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgb2YgdGhlIGhhbmRsZXMgc2V0IGluIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAyNzI4KSJ9LAorICAgIHsiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktMDI3MjkiLCAiSWYgbWVtb3J5IHdhcyBjcmVhdGVkIGJ5IGEgbWVtb3J5IGltcG9ydCBvcGVyYXRpb24sIHRoZSBleHRlcm5hbCBoYW5kbGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbWVtb3J5IG11c3QgYWxzbyBoYXZlIGJlZW4gc2V0IGluIFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm86OmhhbmRsZVR5cGVzIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAyNzI5KSJ9LAorICAgIHsiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktcGFyYW1ldGVyIiwgIm1lbW9yeSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS1wYXJlbnQiLCAibWVtb3J5IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeU9mZnNldC0wMTA0NiIsICJtZW1vcnlPZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgbWVtb3J5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeU9mZnNldC0wMTA0NikifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDQ4IiwgIm1lbW9yeU9mZnNldCBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgdGhlIGFsaWdubWVudCBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIHdpdGggaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDQ4KSJ9LAorICAgIHsiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1zaXplLTAxMDQ5IiwgIlRoZSBzaXplIG1lbWJlciBvZiB0aGUgVmtNZW1vcnlSZXF1aXJlbWVudHMgc3RydWN0dXJlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgd2l0aCBpbWFnZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBtZW1vcnkgbWludXMgbWVtb3J5T2Zmc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQmluZEltYWdlTWVtb3J5LXNpemUtMDEwNDkpIn0sCisgICAgeyJWVUlELXZrQmluZEltYWdlTWVtb3J5Mi1iaW5kSW5mb0NvdW50LWFycmF5bGVuZ3RoIiwgImJpbmRJbmZvQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0JpbmRJbWFnZU1lbW9yeTItYmluZEluZm9Db3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnkyLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kSW1hZ2VNZW1vcnkyLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQmluZEltYWdlTWVtb3J5Mi1wQmluZEluZm9zLXBhcmFtZXRlciIsICJwQmluZEluZm9zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpbmRJbmZvQ291bnQgdmFsaWQgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtCaW5kSW1hZ2VNZW1vcnkyLXBCaW5kSW5mb3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtTm9uZS0wMTk4MCIsICJDb25kaXRpb25hbCByZW5kZXJpbmcgbXVzdCBub3QgYWxyZWFkeSBiZSBhY3RpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhULU5vbmUtMDE5ODApIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVC1wQ29uZGl0aW9uYWxSZW5kZXJpbmdCZWdpbi1wYXJhbWV0ZXIiLCAicENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0NvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW5JbmZvRVhUIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtcENvbmRpdGlvbmFsUmVuZGVyaW5nQmVnaW4tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhULXBMYWJlbEluZm8tcGFyYW1ldGVyIiwgInBMYWJlbEluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0RlYnVnVXRpbHNMYWJlbEVYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5LU5vbmUtMDA4MDciLCAiQWxsIHF1ZXJpZXMgdXNlZCBieSB0aGUgY29tbWFuZCBtdXN0IGJlIHVuYXZhaWxhYmxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1Ob25lLTAwODA3KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbWFuZEJ1ZmZlci0wMTg4NSIsICJjb21tYW5kQnVmZmVyIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1jb21tYW5kQnVmZmVyLTAxODg1KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5LWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnktY29tbW9ucGFyZW50IiwgIkJvdGggb2YgY29tbWFuZEJ1ZmZlciwgYW5kIHF1ZXJ5UG9vbCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUXVlcnlDb250cm9sRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeS0wMDgwMiIsICJxdWVyeSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gcXVlcnlQb29sIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeS0wMDgwMikifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5LTAwODA4IiwgIklmIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhlIHN1bSBvZiBxdWVyeSBhbmQgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgY3VycmVudCBzdWJwYXNzJ3MgdmlldyBtYXNrIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiBxdWVyeVBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5LTAwODA4KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAxOTIyIiwgInF1ZXJ5UG9vbCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBxdWVyeVR5cGUgdGhhdCBkaWZmZXJzIGZyb20gdGhhdCBvZiBhbnkgcXVlcmllcyB0aGF0IGFyZSBhY3RpdmUgd2l0aGluIGNvbW1hbmRCdWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC0wMTkyMikifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC0wMzIyMyIsICJJZiBxdWVyeVBvb2wgd2FzIGNyZWF0ZWQgd2l0aCBhIHF1ZXJ5VHlwZSBvZiBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiwgdGhlIHByb2ZpbGluZyBsb2NrIG11c3QgaGF2ZSBiZWVuIGhlbGQgYmVmb3JlIHZrQmVnaW5Db21tYW5kQnVmZmVyIHdhcyBjYWxsZWQgb24gY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAzMjIzKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAzMjI0IiwgIklmIHF1ZXJ5UG9vbCB3YXMgY3JlYXRlZCB3aXRoIGEgcXVlcnlUeXBlIG9mIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSIGFuZCBvbmUgb2YgdGhlIGNvdW50ZXJzIHVzZWQgdG8gY3JlYXRlIHF1ZXJ5UG9vbCB3YXMgVktfUVVFUllfU0NPUEVfQ09NTUFORF9CVUZGRVJfS0hSLCB0aGUgcXVlcnkgYmVnaW4gbXVzdCBiZSB0aGUgZmlyc3QgcmVjb3JkZWQgY29tbWFuZCBpbiBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVBvb2wtMDMyMjQpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVBvb2wtMDMyMjUiLCAiSWYgcXVlcnlQb29sIHdhcyBjcmVhdGVkIHdpdGggYSBxdWVyeVR5cGUgb2YgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIgYW5kIG9uZSBvZiB0aGUgY291bnRlcnMgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFIsIHRoZSBiZWdpbiBjb21tYW5kIG11c3Qgbm90IGJlIHJlY29yZGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVBvb2wtMDMyMjUpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVBvb2wtMDMyMjYiLCAiSWYgcXVlcnlQb29sIHdhcyBjcmVhdGVkIHdpdGggYSBxdWVyeVR5cGUgb2YgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIgYW5kIGFub3RoZXIgcXVlcnkgcG9vbCB3aXRoIGEgcXVlcnlUeXBlIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSIGhhcyBiZWVuIHVzZWQgd2l0aGluIGNvbW1hbmRCdWZmZXIsIGl0cyBwYXJlbnQgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlciBvciBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIgcmVjb3JkZWQgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBwcmltYXJ5IGNvbW1hbmQgYnVmZmVyIGFzIGNvbW1hbmRCdWZmZXIsIHRoZSBwZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHMgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC0wMzIyNikifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAicXVlcnlQb29sIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXJ5UG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5UG9vbC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDA4MDAiLCAiSWYgdGhlIHByZWNpc2Ugb2NjbHVzaW9uIHF1ZXJpZXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgb3IgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIG5vdCBWS19RVUVSWV9UWVBFX09DQ0xVU0lPTiwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19RVUVSWV9DT05UUk9MX1BSRUNJU0VfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDA4MDApIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDA4MDMiLCAiSWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OLCB0aGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDA4MDMpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDA4MDQiLCAiSWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUyBhbmQgYW55IG9mIHRoZSBwaXBlbGluZVN0YXRpc3RpY3MgaW5kaWNhdGUgZ3JhcGhpY3Mgb3BlcmF0aW9ucywgdGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlUeXBlLTAwODA0KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlUeXBlLTAwODA1IiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1BJUEVMSU5FX1NUQVRJU1RJQ1MgYW5kIGFueSBvZiB0aGUgcGlwZWxpbmVTdGF0aXN0aWNzIGluZGljYXRlIGNvbXB1dGUgb3BlcmF0aW9ucywgdGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDA4MDUpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDIzMjciLCAiSWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfVFJBTlNGT1JNX0ZFRURCQUNLX1NUUkVBTV9FWFQgdGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlUeXBlLTAyMzI3KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlUeXBlLTAyMzI4IiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUIHRoZW4gVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDo6dHJhbnNmb3JtRmVlZGJhY2tRdWVyaWVzIG11c3QgYmUgc3VwcG9ydGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDIzMjgpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVR5cGUtMDI4MDQiLCAiVGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgbXVzdCBub3QgYmUgVktfUVVFUllfVFlQRV9USU1FU1RBTVAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMjgwNCkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1Ob25lLTAwODA3IiwgIkFsbCBxdWVyaWVzIHVzZWQgYnkgdGhlIGNvbW1hbmQgbXVzdCBiZSB1bmF2YWlsYWJsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULU5vbmUtMDA4MDcpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci0wMTg4NSIsICJjb21tYW5kQnVmZmVyIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci0wMTg4NSkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBjb21tYW5kQnVmZmVyLCBhbmQgcXVlcnlQb29sIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1F1ZXJ5Q29udHJvbEZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeS0wMDgwMiIsICJxdWVyeSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gcXVlcnlQb29sIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnktMDA4MDIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnktMDA4MDgiLCAiSWYgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCB0aGUgc3VtIG9mIHF1ZXJ5IGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBjdXJyZW50IHN1YnBhc3MncyB2aWV3IG1hc2sgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIHF1ZXJ5UG9vbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5LTAwODA4KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5UG9vbC0wMTkyMiIsICJxdWVyeVBvb2wgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgcXVlcnlUeXBlIHRoYXQgZGlmZmVycyBmcm9tIHRoYXQgb2YgYW55IHF1ZXJpZXMgdGhhdCBhcmUgYWN0aXZlIHdpdGhpbiBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlQb29sLTAxOTIyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5UG9vbC0wMzIyMyIsICJJZiBxdWVyeVBvb2wgd2FzIGNyZWF0ZWQgd2l0aCBhIHF1ZXJ5VHlwZSBvZiBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiwgdGhlIHByb2ZpbGluZyBsb2NrIG11c3QgaGF2ZSBiZWVuIGhlbGQgYmVmb3JlIHZrQmVnaW5Db21tYW5kQnVmZmVyIHdhcyBjYWxsZWQgb24gY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5UG9vbC0wMzIyMykifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjQiLCAiSWYgcXVlcnlQb29sIHdhcyBjcmVhdGVkIHdpdGggYSBxdWVyeVR5cGUgb2YgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIgYW5kIG9uZSBvZiB0aGUgY291bnRlcnMgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9TQ09QRV9DT01NQU5EX0JVRkZFUl9LSFIsIHRoZSBxdWVyeSBiZWdpbiBtdXN0IGJlIHRoZSBmaXJzdCByZWNvcmRlZCBjb21tYW5kIGluIGNvbW1hbmRCdWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjQpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlQb29sLTAzMjI1IiwgIklmIHF1ZXJ5UG9vbCB3YXMgY3JlYXRlZCB3aXRoIGEgcXVlcnlUeXBlIG9mIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSIGFuZCBvbmUgb2YgdGhlIGNvdW50ZXJzIHVzZWQgdG8gY3JlYXRlIHF1ZXJ5UG9vbCB3YXMgVktfUVVFUllfU0NPUEVfUkVOREVSX1BBU1NfS0hSLCB0aGUgYmVnaW4gY29tbWFuZCBtdXN0IG5vdCBiZSByZWNvcmRlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5UG9vbC0wMzIyNSkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjYiLCAiSWYgcXVlcnlQb29sIHdhcyBjcmVhdGVkIHdpdGggYSBxdWVyeVR5cGUgb2YgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIgYW5kIGFub3RoZXIgcXVlcnkgcG9vbCB3aXRoIGEgcXVlcnlUeXBlIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSIGhhcyBiZWVuIHVzZWQgd2l0aGluIGNvbW1hbmRCdWZmZXIsIGl0cyBwYXJlbnQgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlciBvciBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIgcmVjb3JkZWQgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBwcmltYXJ5IGNvbW1hbmQgYnVmZmVyIGFzIGNvbW1hbmRCdWZmZXIsIHRoZSBwZXJmb3JtYW5jZUNvdW50ZXJNdWx0aXBsZVF1ZXJ5UG9vbHMgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVBvb2wtMDMyMjYpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlQb29sLXBhcmFtZXRlciIsICJxdWVyeVBvb2wgbXVzdCBiZSBhIHZhbGlkIFZrUXVlcnlQb29sIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5UG9vbC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAwODAwIiwgIklmIHRoZSBwcmVjaXNlIG9jY2x1c2lvbiBxdWVyaWVzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIG9yIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBub3QgVktfUVVFUllfVFlQRV9PQ0NMVVNJT04sIGZsYWdzIG11c3Qgbm90IGNvbnRhaW4gVktfUVVFUllfQ09OVFJPTF9QUkVDSVNFX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMDgwMCkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDA4MDMiLCAiSWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OLCB0aGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAwODAzKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMDgwNCIsICJJZiB0aGUgcXVlcnlUeXBlIHVzZWQgdG8gY3JlYXRlIHF1ZXJ5UG9vbCB3YXMgVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTIGFuZCBhbnkgb2YgdGhlIHBpcGVsaW5lU3RhdGlzdGljcyBpbmRpY2F0ZSBncmFwaGljcyBvcGVyYXRpb25zLCB0aGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAwODA0KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMDgwNSIsICJJZiB0aGUgcXVlcnlUeXBlIHVzZWQgdG8gY3JlYXRlIHF1ZXJ5UG9vbCB3YXMgVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTIGFuZCBhbnkgb2YgdGhlIHBpcGVsaW5lU3RhdGlzdGljcyBpbmRpY2F0ZSBjb21wdXRlIG9wZXJhdGlvbnMsIHRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMDgwNSkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDIzMzgiLCAiSWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfVFJBTlNGT1JNX0ZFRURCQUNLX1NUUkVBTV9FWFQgdGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjMzOCkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDIzMzkiLCAiSWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfVFJBTlNGT1JNX0ZFRURCQUNLX1NUUkVBTV9FWFQgdGhlIGluZGV4IHBhcmFtZXRlciBtdXN0IGJlIGxlc3MgdGhhbiBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjptYXhUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDIzMzkpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAyMzQwIiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBub3QgVktfUVVFUllfVFlQRV9UUkFOU0ZPUk1fRkVFREJBQ0tfU1RSRUFNX0VYVCB0aGUgaW5kZXggbXVzdCBiZSB6ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAyMzQwKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjM0MSIsICJJZiB0aGUgcXVlcnlUeXBlIHVzZWQgdG8gY3JlYXRlIHF1ZXJ5UG9vbCB3YXMgVktfUVVFUllfVFlQRV9UUkFOU0ZPUk1fRkVFREJBQ0tfU1RSRUFNX0VYVCB0aGVuIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ6OnRyYW5zZm9ybUZlZWRiYWNrUXVlcmllcyBtdXN0IGJlIHN1cHBvcnRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjM0MSkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDI4MDQiLCAiVGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgbXVzdCBub3QgYmUgVktfUVVFUllfVFlQRV9USU1FU1RBTVAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblF1ZXJ5SW5kZXhlZEVYVC1xdWVyeVR5cGUtMDI4MDQpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWJ1ZmZlcmxldmVsIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHByaW1hcnkgVmtDb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWJ1ZmZlcmxldmVsKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1jb250ZW50cy1wYXJhbWV0ZXIiLCAiY29udGVudHMgbXVzdCBiZSBhIHZhbGlkIFZrU3VicGFzc0NvbnRlbnRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWNvbnRlbnRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtZnJhbWVidWZmZXItMDI1MzIiLCAiRm9yIGFueSBhdHRhY2htZW50IGluIGZyYW1lYnVmZmVyIHRoYXQgaXMgdXNlZCBieSByZW5kZXJQYXNzIGFuZCBpcyBib3VuZCB0byBtZW1vcnkgbG9jYXRpb25zIHRoYXQgYXJlIGFsc28gYm91bmQgdG8gYW5vdGhlciBhdHRhY2htZW50IHVzZWQgYnkgcmVuZGVyUGFzcywgYW5kIGlmIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSB1c2VzIGNhdXNlcyBlaXRoZXIgYXR0YWNobWVudCB0byBiZSB3cml0dGVuIHRvLCBib3RoIGF0dGFjaG1lbnRzIG11c3QgaGF2ZSBoYWQgdGhlIFZLX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fTUFZX0FMSUFTX0JJVCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtZnJhbWVidWZmZXItMDI1MzIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA4OTUiLCAiSWYgYW55IG9mIHRoZSBpbml0aWFsTGF5b3V0IG9yIGZpbmFsTGF5b3V0IG1lbWJlciBvZiB0aGUgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gc3RydWN0dXJlcyBvciB0aGUgbGF5b3V0IG1lbWJlciBvZiB0aGUgVmtBdHRhY2htZW50UmVmZXJlbmNlIHN0cnVjdHVyZXMgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlbmRlciBwYXNzIHNwZWNpZmllZCBpbiB0aGUgcmVuZGVyUGFzcyBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBpcyBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSB2aWV3IG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIGZyYW1lYnVmZmVyIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHVzYWdlIHZhbHVlIGluY2x1ZGluZyBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk1KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk2IiwgIklmIGFueSBvZiB0aGUgaW5pdGlhbExheW91dCBvciBmaW5hbExheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHN0cnVjdHVyZXMgb3IgdGhlIGxheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudFJlZmVyZW5jZSBzdHJ1Y3R1cmVzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgaW4gdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHBSZW5kZXJQYXNzQmVnaW4gaXMgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCBvciBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSBmcmFtZWJ1ZmZlciBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk2KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk3IiwgIklmIGFueSBvZiB0aGUgaW5pdGlhbExheW91dCBvciBmaW5hbExheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHN0cnVjdHVyZXMgb3IgdGhlIGxheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudFJlZmVyZW5jZSBzdHJ1Y3R1cmVzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgaW4gdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHBSZW5kZXJQYXNzQmVnaW4gaXMgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSBmcmFtZWJ1ZmZlciBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgb3IgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtaW5pdGlhbExheW91dC0wMDg5NykifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtaW5pdGlhbExheW91dC0wMDg5OCIsICJJZiBhbnkgb2YgdGhlIGluaXRpYWxMYXlvdXQgb3IgZmluYWxMYXlvdXQgbWVtYmVyIG9mIHRoZSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBzdHJ1Y3R1cmVzIG9yIHRoZSBsYXlvdXQgbWVtYmVyIG9mIHRoZSBWa0F0dGFjaG1lbnRSZWZlcmVuY2Ugc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIGlzIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSBmcmFtZWJ1ZmZlciBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk4KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk5IiwgIklmIGFueSBvZiB0aGUgaW5pdGlhbExheW91dCBvciBmaW5hbExheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHN0cnVjdHVyZXMgb3IgdGhlIGxheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudFJlZmVyZW5jZSBzdHJ1Y3R1cmVzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgaW4gdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHBSZW5kZXJQYXNzQmVnaW4gaXMgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSB2aWV3IG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIGZyYW1lYnVmZmVyIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHVzYWdlIHZhbHVlIGluY2x1ZGluZyBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA4OTkpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA5MDAiLCAiSWYgYW55IG9mIHRoZSBpbml0aWFsTGF5b3V0IG1lbWJlcnMgb2YgdGhlIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHN0cnVjdHVyZXMgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlbmRlciBwYXNzIHNwZWNpZmllZCBpbiB0aGUgcmVuZGVyUGFzcyBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBpcyBub3QgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgdGhlbiBlYWNoIHN1Y2ggaW5pdGlhbExheW91dCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjdXJyZW50IGxheW91dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGltYWdlIHN1YnJlc291cmNlIG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIGZyYW1lYnVmZmVyIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA5MDApIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDE3NTgiLCAiSWYgYW55IG9mIHRoZSBpbml0aWFsTGF5b3V0IG9yIGZpbmFsTGF5b3V0IG1lbWJlciBvZiB0aGUgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gc3RydWN0dXJlcyBvciB0aGUgbGF5b3V0IG1lbWJlciBvZiB0aGUgVmtBdHRhY2htZW50UmVmZXJlbmNlIHN0cnVjdHVyZXMgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlbmRlciBwYXNzIHNwZWNpZmllZCBpbiB0aGUgcmVuZGVyUGFzcyBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBpcyBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsIG9yIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSB2aWV3IG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIGZyYW1lYnVmZmVyIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHVzYWdlIHZhbHVlIGluY2x1ZGluZyBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDE3NTgpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLXBSZW5kZXJQYXNzQmVnaW4tcGFyYW1ldGVyIiwgInBSZW5kZXJQYXNzQmVnaW4gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1JlbmRlclBhc3NCZWdpbkluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLXBSZW5kZXJQYXNzQmVnaW4tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1zcmNTdGFnZU1hc2stMDA5MDEiLCAiVGhlIHNyY1N0YWdlTWFzayBhbmQgZHN0U3RhZ2VNYXNrIG1lbWJlcnMgb2YgYW55IGVsZW1lbnQgb2YgdGhlIHBEZXBlbmRlbmNpZXMgbWVtYmVyIG9mIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gdXNlZCB0byBjcmVhdGUgcmVuZGVyUGFzcyBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBxdWV1ZSBmYW1pbHkgaWRlbnRpZmllZCBieSB0aGUgcXVldWVGYW1pbHlJbmRleCBtZW1iZXIgb2YgdGhlIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21tYW5kIHBvb2wgd2hpY2ggY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3Mtc3JjU3RhZ2VNYXNrLTAwOTAxKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItYnVmZmVybGV2ZWwiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgcHJpbWFyeSBWa0NvbW1hbmRCdWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWJ1ZmZlcmxldmVsKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItZnJhbWVidWZmZXItMDI1MzMiLCAiRm9yIGFueSBhdHRhY2htZW50IGluIGZyYW1lYnVmZmVyIHRoYXQgaXMgdXNlZCBieSByZW5kZXJQYXNzIGFuZCBpcyBib3VuZCB0byBtZW1vcnkgbG9jYXRpb25zIHRoYXQgYXJlIGFsc28gYm91bmQgdG8gYW5vdGhlciBhdHRhY2htZW50IHVzZWQgYnkgcmVuZGVyUGFzcywgYW5kIGlmIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSB1c2VzIGNhdXNlcyBlaXRoZXIgYXR0YWNobWVudCB0byBiZSB3cml0dGVuIHRvLCBib3RoIGF0dGFjaG1lbnRzIG11c3QgaGF2ZSBoYWQgdGhlIFZLX0FUVEFDSE1FTlRfREVTQ1JJUFRJT05fTUFZX0FMSUFTX0JJVCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWZyYW1lYnVmZmVyLTAyNTMzKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItZnJhbWVidWZmZXItMDI3NzkiLCAiQm90aCB0aGUgZnJhbWVidWZmZXIgYW5kIHJlbmRlclBhc3MgbWVtYmVycyBvZiBwUmVuZGVyUGFzc0JlZ2luIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgb24gdGhlIHNhbWUgVmtEZXZpY2UgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWZyYW1lYnVmZmVyLTAyNzc5KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5NCIsICJJZiBhbnkgb2YgdGhlIGluaXRpYWxMYXlvdXQgb3IgZmluYWxMYXlvdXQgbWVtYmVyIG9mIHRoZSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBzdHJ1Y3R1cmVzIG9yIHRoZSBsYXlvdXQgbWVtYmVyIG9mIHRoZSBWa0F0dGFjaG1lbnRSZWZlcmVuY2Ugc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIGlzIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGltYWdlIHZpZXcgb2YgdGhlIGZyYW1lYnVmZmVyIHNwZWNpZmllZCBpbiB0aGUgZnJhbWVidWZmZXIgbWVtYmVyIG9mIHBSZW5kZXJQYXNzQmVnaW4gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgdXNhZ2UgdmFsdWUgaW5jbHVkaW5nIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk0KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5NiIsICJJZiBhbnkgb2YgdGhlIGluaXRpYWxMYXlvdXQgb3IgZmluYWxMYXlvdXQgbWVtYmVyIG9mIHRoZSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBzdHJ1Y3R1cmVzIG9yIHRoZSBsYXlvdXQgbWVtYmVyIG9mIHRoZSBWa0F0dGFjaG1lbnRSZWZlcmVuY2Ugc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIGlzIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgb3IgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGltYWdlIHZpZXcgb2YgdGhlIGZyYW1lYnVmZmVyIHNwZWNpZmllZCBpbiB0aGUgZnJhbWVidWZmZXIgbWVtYmVyIG9mIHBSZW5kZXJQYXNzQmVnaW4gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgdXNhZ2UgdmFsdWUgaW5jbHVkaW5nIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWluaXRpYWxMYXlvdXQtMDMwOTYpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk3IiwgIklmIGFueSBvZiB0aGUgaW5pdGlhbExheW91dCBvciBmaW5hbExheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHN0cnVjdHVyZXMgb3IgdGhlIGxheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudFJlZmVyZW5jZSBzdHJ1Y3R1cmVzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgaW4gdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHBSZW5kZXJQYXNzQmVnaW4gaXMgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSBmcmFtZWJ1ZmZlciBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgb3IgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWluaXRpYWxMYXlvdXQtMDMwOTcpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk4IiwgIklmIGFueSBvZiB0aGUgaW5pdGlhbExheW91dCBvciBmaW5hbExheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHN0cnVjdHVyZXMgb3IgdGhlIGxheW91dCBtZW1iZXIgb2YgdGhlIFZrQXR0YWNobWVudFJlZmVyZW5jZSBzdHJ1Y3R1cmVzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSByZW5kZXIgcGFzcyBzcGVjaWZpZWQgaW4gdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHBSZW5kZXJQYXNzQmVnaW4gaXMgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBpbWFnZSB2aWV3IG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIGZyYW1lYnVmZmVyIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHVzYWdlIHZhbHVlIGluY2x1ZGluZyBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk4KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5OSIsICJJZiBhbnkgb2YgdGhlIGluaXRpYWxMYXlvdXQgb3IgZmluYWxMYXlvdXQgbWVtYmVyIG9mIHRoZSBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBzdHJ1Y3R1cmVzIG9yIHRoZSBsYXlvdXQgbWVtYmVyIG9mIHRoZSBWa0F0dGFjaG1lbnRSZWZlcmVuY2Ugc3RydWN0dXJlcyBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVuZGVyIHBhc3Mgc3BlY2lmaWVkIGluIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIGlzIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW1hZ2UgdmlldyBvZiB0aGUgZnJhbWVidWZmZXIgc3BlY2lmaWVkIGluIHRoZSBmcmFtZWJ1ZmZlciBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBpbmNsdWRpbmcgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5OSkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWluaXRpYWxMYXlvdXQtMDMxMDAiLCAiSWYgYW55IG9mIHRoZSBpbml0aWFsTGF5b3V0IG1lbWJlcnMgb2YgdGhlIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIHN0cnVjdHVyZXMgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlbmRlciBwYXNzIHNwZWNpZmllZCBpbiB0aGUgcmVuZGVyUGFzcyBtZW1iZXIgb2YgcFJlbmRlclBhc3NCZWdpbiBpcyBub3QgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgdGhlbiBlYWNoIHN1Y2ggaW5pdGlhbExheW91dCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjdXJyZW50IGxheW91dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGltYWdlIHN1YnJlc291cmNlIG9mIHRoZSBmcmFtZWJ1ZmZlciBzcGVjaWZpZWQgaW4gdGhlIGZyYW1lYnVmZmVyIG1lbWJlciBvZiBwUmVuZGVyUGFzc0JlZ2luIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMTAwKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItcFJlbmRlclBhc3NCZWdpbi1wYXJhbWV0ZXIiLCAicFJlbmRlclBhc3NCZWdpbiBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLXBSZW5kZXJQYXNzQmVnaW4tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItcFN1YnBhc3NCZWdpbkluZm8tcGFyYW1ldGVyIiwgInBTdWJwYXNzQmVnaW5JbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTdWJwYXNzQmVnaW5JbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItcFN1YnBhc3NCZWdpbkluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1zcmNTdGFnZU1hc2stMDMxMDEiLCAiVGhlIHNyY1N0YWdlTWFzayBhbmQgZHN0U3RhZ2VNYXNrIG1lbWJlcnMgb2YgYW55IGVsZW1lbnQgb2YgdGhlIHBEZXBlbmRlbmNpZXMgbWVtYmVyIG9mIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gdXNlZCB0byBjcmVhdGUgcmVuZGVyUGFzcyBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBxdWV1ZSBmYW1pbHkgaWRlbnRpZmllZCBieSB0aGUgcXVldWVGYW1pbHlJbmRleCBtZW1iZXIgb2YgdGhlIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21tYW5kIHBvb2wgd2hpY2ggY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLXNyY1N0YWdlTWFzay0wMzEwMSkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULU5vbmUtMDIzNjciLCAiVHJhbnNmb3JtIGZlZWRiYWNrIG11c3Qgbm90IGJlIGFjdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtTm9uZS0wMjM2NykifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULU5vbmUtMDIzNzMiLCAiVHJhbnNmb3JtIGZlZWRiYWNrIG11c3Qgbm90IGJlIG1hZGUgYWN0aXZlIGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2Ugd2l0aCBtdWx0aXZpZXcgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtTm9uZS0wMjM3MykifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCB0aGUgZWxlbWVudHMgb2YgcENvdW50ZXJCdWZmZXJzIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb3VudGVyQnVmZmVyQ291bnQtMDI2MDciLCAiSWYgY291bnRlckJ1ZmZlckNvdW50IGlzIG5vdCAwLCBhbmQgcENvdW50ZXJCdWZmZXJzIGlzIG5vdCBOVUxMLCBwQ291bnRlckJ1ZmZlcnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY291bnRlckJ1ZmZlckNvdW50IFZrQnVmZmVyIGhhbmRsZXMgdGhhdCBhcmUgZWl0aGVyIHZhbGlkIG9yIFZLX05VTExfSEFORExFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb3VudGVyQnVmZmVyQ291bnQtMDI2MDcpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1maXJzdENvdW50ZXJCdWZmZXItMDIzNjgiLCAiZmlyc3RDb3VudGVyQnVmZmVyIG11c3QgYmUgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ6Om1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtZmlyc3RDb3VudGVyQnVmZmVyLTAyMzY4KSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtZmlyc3RDb3VudGVyQnVmZmVyLTAyMzY5IiwgIlRoZSBzdW0gb2YgZmlyc3RDb3VudGVyQnVmZmVyIGFuZCBjb3VudGVyQnVmZmVyQ291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDo6bWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1maXJzdENvdW50ZXJCdWZmZXItMDIzNjkpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlci0wMjM3MSIsICJJZiBwQ291bnRlckJ1ZmZlciBpcyBOVUxMLCB0aGVuIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyBtdXN0IGFsc28gYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtcENvdW50ZXJCdWZmZXItMDIzNzEpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlck9mZnNldHMtMDIzNzAiLCAiRm9yIGVhY2ggYnVmZmVyIGhhbmRsZSBpbiB0aGUgYXJyYXksIGlmIGl0IGlzIG5vdCBWS19OVUxMX0hBTkRMRSBpdCBtdXN0IHJlZmVyZW5jZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCA0IGJ5dGVzIGF0IHRoZSBjb3JyZXNwb25kaW5nIG9mZnNldCBmcm9tIHRoZSBwQ291bnRlckJ1ZmZlck9mZnNldHMgYXJyYXkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULXBDb3VudGVyQnVmZmVyT2Zmc2V0cy0wMjM3MCkifSwKKyAgICB7IlZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULXBDb3VudGVyQnVmZmVyT2Zmc2V0cy1wYXJhbWV0ZXIiLCAiSWYgY291bnRlckJ1ZmZlckNvdW50IGlzIG5vdCAwLCBhbmQgcENvdW50ZXJCdWZmZXJPZmZzZXRzIGlzIG5vdCBOVUxMLCBwQ291bnRlckJ1ZmZlck9mZnNldHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY291bnRlckJ1ZmZlckNvdW50IFZrRGV2aWNlU2l6ZSB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhULXBDb3VudGVyQnVmZmVyT2Zmc2V0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlcnMtMDIzNzIiLCAiRm9yIGVhY2ggYnVmZmVyIGhhbmRsZSBpbiB0aGUgcENvdW50ZXJCdWZmZXJzIGFycmF5IHRoYXQgaXMgbm90IFZLX05VTExfSEFORExFIGl0IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHVzYWdlIHZhbHVlIGNvbnRhaW5pbmcgVktfQlVGRkVSX1VTQUdFX1RSQU5TRk9STV9GRUVEQkFDS19DT1VOVEVSX0JVRkZFUl9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlcnMtMDIzNzIpIn0sCisgICAgeyJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtdHJhbnNmb3JtRmVlZGJhY2stMDIzNjYiLCAiVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6OnRyYW5zZm9ybUZlZWRiYWNrIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQtdHJhbnNmb3JtRmVlZGJhY2stMDIzNjYpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWNvbW1vbnBhcmVudCIsICJFYWNoIG9mIGNvbW1hbmRCdWZmZXIsIGxheW91dCwgYW5kIHRoZSBlbGVtZW50cyBvZiBwRGVzY3JpcHRvclNldHMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JTZXRDb3VudC1hcnJheWxlbmd0aCIsICJkZXNjcmlwdG9yU2V0Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1kZXNjcmlwdG9yU2V0Q291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWR5bmFtaWNPZmZzZXRDb3VudC0wMDM1OSIsICJkeW5hbWljT2Zmc2V0Q291bnQgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGR5bmFtaWMgZGVzY3JpcHRvcnMgaW4gcERlc2NyaXB0b3JTZXRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWR5bmFtaWNPZmZzZXRDb3VudC0wMDM1OSkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtZmlyc3RTZXQtMDAzNjAiLCAiVGhlIHN1bSBvZiBmaXJzdFNldCBhbmQgZGVzY3JpcHRvclNldENvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvOjpzZXRMYXlvdXRDb3VudCBwcm92aWRlZCB3aGVuIGxheW91dCB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1maXJzdFNldC0wMDM2MCkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtbGF5b3V0LXBhcmFtZXRlciIsICJsYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmVMYXlvdXQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWxheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy0wMDM1OCIsICJFYWNoIGVsZW1lbnQgb2YgcERlc2NyaXB0b3JTZXRzIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGEgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IHRoYXQgbWF0Y2hlcyAoaXMgdGhlIHNhbWUgYXMsIG9yIGlkZW50aWNhbGx5IGRlZmluZWQgYXMpIHRoZSBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgYXQgc2V0IG4gaW4gbGF5b3V0LCB3aGVyZSBuIGlzIHRoZSBzdW0gb2YgZmlyc3RTZXQgYW5kIHRoZSBpbmRleCBpbnRvIHBEZXNjcmlwdG9yU2V0cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtMDAzNTgpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy0wMTk3OSIsICJGb3IgZWFjaCBkeW5hbWljIHVuaWZvcm0gb3Igc3RvcmFnZSBidWZmZXIgYmluZGluZyBpbiBwRGVzY3JpcHRvclNldHMsIHRoZSBzdW0gb2YgdGhlIGVmZmVjdGl2ZSBvZmZzZXQsIGFzIGRlZmluZWQgYWJvdmUsIGFuZCB0aGUgcmFuZ2Ugb2YgdGhlIGJpbmRpbmcgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtMDE5NzkpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy1wYXJhbWV0ZXIiLCAicERlc2NyaXB0b3JTZXRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JTZXRDb3VudCB2YWxpZCBWa0Rlc2NyaXB0b3JTZXQgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRHluYW1pY09mZnNldHMtMDE5NzEiLCAiRWFjaCBlbGVtZW50IG9mIHBEeW5hbWljT2Zmc2V0cyB3aGljaCBjb3JyZXNwb25kcyB0byBhIGRlc2NyaXB0b3IgYmluZGluZyB3aXRoIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcER5bmFtaWNPZmZzZXRzLTAxOTcxKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRHluYW1pY09mZnNldHMtMDE5NzIiLCAiRWFjaCBlbGVtZW50IG9mIHBEeW5hbWljT2Zmc2V0cyB3aGljaCBjb3JyZXNwb25kcyB0byBhIGRlc2NyaXB0b3IgYmluZGluZyB3aXRoIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcER5bmFtaWNPZmZzZXRzLTAxOTcyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRHluYW1pY09mZnNldHMtcGFyYW1ldGVyIiwgIklmIGR5bmFtaWNPZmZzZXRDb3VudCBpcyBub3QgMCwgcER5bmFtaWNPZmZzZXRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGR5bmFtaWNPZmZzZXRDb3VudCB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcER5bmFtaWNPZmZzZXRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcGlwZWxpbmVCaW5kUG9pbnQtMDAzNjEiLCAicGlwZWxpbmVCaW5kUG9pbnQgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbW1hbmRCdWZmZXIncyBwYXJlbnQgVmtDb21tYW5kUG9vbCdzIHF1ZXVlIGZhbWlseSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1waXBlbGluZUJpbmRQb2ludC0wMDM2MSkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyIiwgInBpcGVsaW5lQmluZFBvaW50IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lQmluZFBvaW50IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLXBpcGVsaW5lQmluZFBvaW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItYnVmZmVyLTAwNDMzIiwgImJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0JVRkZFUl9VU0FHRV9JTkRFWF9CVUZGRVJfQklUIGZsYWcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItYnVmZmVyLTAwNDMzKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1idWZmZXItMDA0MzQiLCAiSWYgYnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItYnVmZmVyLTAwNDM0KSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1idWZmZXItcGFyYW1ldGVyIiwgImJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGJ1ZmZlciwgYW5kIGNvbW1hbmRCdWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWluZGV4VHlwZS0wMjUwNyIsICJpbmRleFR5cGUgbXVzdCBub3QgYmUgVktfSU5ERVhfVFlQRV9OT05FX05WLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1pbmRleFR5cGUtMDI1MDcpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWluZGV4VHlwZS0wMjc2NSIsICJJZiBpbmRleFR5cGUgaXMgVktfSU5ERVhfVFlQRV9VSU5UOF9FWFQsIHRoZSBpbmRleFR5cGVVaW50OCBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1pbmRleFR5cGUtMDI3NjUpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWluZGV4VHlwZS1wYXJhbWV0ZXIiLCAiaW5kZXhUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0luZGV4VHlwZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1pbmRleFR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1vZmZzZXQtMDA0MzEiLCAib2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1vZmZzZXQtMDA0MzEpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLW9mZnNldC0wMDQzMiIsICJUaGUgc3VtIG9mIG9mZnNldCBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIHJhbmdlIG9mIFZrRGV2aWNlTWVtb3J5IG9iamVjdCB0aGF0IGlzIGJhY2tpbmcgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHR5cGUgaW5kaWNhdGVkIGJ5IGluZGV4VHlwZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRJbmRleEJ1ZmZlci1vZmZzZXQtMDA0MzIpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFBpcGVsaW5lLU5vbmUtMDIzMjMiLCAiVGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIHJlY29yZGVkIHdoZW4gdHJhbnNmb3JtIGZlZWRiYWNrIGlzIGFjdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRQaXBlbGluZS1Ob25lLTAyMzIzKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRQaXBlbGluZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFBpcGVsaW5lLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFBpcGVsaW5lLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFBpcGVsaW5lLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBjb21tYW5kQnVmZmVyLCBhbmQgcGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRQaXBlbGluZS1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lLTAwNzgxIiwgIklmIHRoZSB2YXJpYWJsZSBtdWx0aXNhbXBsZSByYXRlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCwgcGlwZWxpbmUgaXMgYSBncmFwaGljcyBwaXBlbGluZSwgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgbm8gYXR0YWNobWVudHMsIGFuZCB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHdpdGggYSBncmFwaGljcyBwaXBlbGluZSBhZnRlciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBjdXJyZW50IHN1YnBhc3MsIHRoZW4gdGhlIHNhbXBsZSBjb3VudCBzcGVjaWZpZWQgYnkgdGhpcyBwaXBlbGluZSBtdXN0IG1hdGNoIHRoYXQgc2V0IGluIHRoZSBwcmV2aW91cyBwaXBlbGluZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZS0wMDc4MSkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmUtcGFyYW1ldGVyIiwgInBpcGVsaW5lIG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAwNzc3IiwgIklmIHBpcGVsaW5lQmluZFBvaW50IGlzIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgdGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAwNzc3KSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMDc3OCIsICJJZiBwaXBlbGluZUJpbmRQb2ludCBpcyBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCB0aGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAwNzc4KSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMDc3OSIsICJJZiBwaXBlbGluZUJpbmRQb2ludCBpcyBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsIHBpcGVsaW5lIG11c3QgYmUgYSBjb21wdXRlIHBpcGVsaW5lIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAwNzc5KSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMDc4MCIsICJJZiBwaXBlbGluZUJpbmRQb2ludCBpcyBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZSBtdXN0IGJlIGEgZ3JhcGhpY3MgcGlwZWxpbmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtMDA3ODApIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAyMzkxIiwgIklmIHBpcGVsaW5lQmluZFBvaW50IGlzIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYsIHRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMjM5MSkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtMDIzOTIiLCAiSWYgcGlwZWxpbmVCaW5kUG9pbnQgaXMgVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OViwgdGhlIHBpcGVsaW5lIG11c3QgYmUgYSByYXkgdHJhY2luZyBwaXBlbGluZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMjM5MikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyIiwgInBpcGVsaW5lQmluZFBvaW50IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lQmluZFBvaW50IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtdmFyaWFibGVTYW1wbGVMb2NhdGlvbnMtMDE1MjUiLCAiSWYgVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ6OnZhcmlhYmxlU2FtcGxlTG9jYXRpb25zIGlzIFZLX0ZBTFNFLCBhbmQgcGlwZWxpbmUgaXMgYSBncmFwaGljcyBwaXBlbGluZSBjcmVhdGVkIHdpdGggYSBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIHN0cnVjdHVyZSBoYXZpbmcgaXRzIHNhbXBsZUxvY2F0aW9uc0VuYWJsZSBtZW1iZXIgc2V0IHRvIFZLX1RSVUUgYnV0IHdpdGhvdXQgVktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVCBlbmFibGVkIHRoZW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgaW5zdGFuY2UgbXVzdCBoYXZlIGJlZW4gYmVndW4gYnkgc3BlY2lmeWluZyBhIFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCBzdHJ1Y3R1cmUgd2hvc2UgcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zIG1lbWJlciBjb250YWlucyBhbiBlbGVtZW50IHdpdGggYSBzdWJwYXNzSW5kZXggbWF0Y2hpbmcgdGhlIGN1cnJlbnQgc3VicGFzcyBpbmRleCBhbmQgdGhlIHNhbXBsZUxvY2F0aW9uc0luZm8gbWVtYmVyIG9mIHRoYXQgZWxlbWVudCBtdXN0IG1hdGNoIHRoZSBzYW1wbGVMb2NhdGlvbnNJbmZvIHNwZWNpZmllZCBpbiBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUIHdoZW4gdGhlIHBpcGVsaW5lIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFBpcGVsaW5lLXZhcmlhYmxlU2FtcGxlTG9jYXRpb25zLTAxNTI1KSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtTm9uZS0wMjA1OCIsICJUaGUgc2hhZGluZyByYXRlIGltYWdlIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtTm9uZS0wMjA1OCkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCBpbWFnZVZpZXcgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlTGF5b3V0LTAyMDYzIiwgIklmIGltYWdlVmlldyBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGltYWdlTGF5b3V0IG11c3QgYmUgVktfSU1BR0VfTEFZT1VUX1NIQURJTkdfUkFURV9PUFRJTUFMX05WIG9yIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtaW1hZ2VMYXlvdXQtMDIwNjMpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1pbWFnZUxheW91dC1wYXJhbWV0ZXIiLCAiaW1hZ2VMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA1OSIsICJJZiBpbWFnZVZpZXcgaXMgbm90IFZLX05VTExfSEFORExFLCBpdCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZVZpZXcgaGFuZGxlIG9mIHR5cGUgVktfSU1BR0VfVklFV19UWVBFXzJEIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA1OSkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA2MCIsICJJZiBpbWFnZVZpZXcgaXMgbm90IFZLX05VTExfSEFORExFLCBpdCBtdXN0IGhhdmUgYSBmb3JtYXQgb2YgVktfRk9STUFUX1I4X1VJTlQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1pbWFnZVZpZXctMDIwNjApIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1pbWFnZVZpZXctMDIwNjEiLCAiSWYgaW1hZ2VWaWV3IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgdXNhZ2UgdmFsdWUgaW5jbHVkaW5nIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA2MSkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA2MiIsICJJZiBpbWFnZVZpZXcgaXMgbm90IFZLX05VTExfSEFORExFLCBpbWFnZUxheW91dCBtdXN0IG1hdGNoIHRoZSBhY3R1YWwgVmtJbWFnZUxheW91dCBvZiBlYWNoIHN1YnJlc291cmNlIGFjY2Vzc2libGUgZnJvbSBpbWFnZVZpZXcgYXQgdGhlIHRpbWUgdGhlIHN1YnJlc291cmNlIGlzIGFjY2Vzc2VkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtaW1hZ2VWaWV3LTAyMDYyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtaW1hZ2VWaWV3LXBhcmFtZXRlciIsICJJZiBpbWFnZVZpZXcgaXMgbm90IFZLX05VTExfSEFORExFLCBpbWFnZVZpZXcgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VWaWV3IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYtaW1hZ2VWaWV3LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULU5vbmUtMDIzNjUiLCAiVHJhbnNmb3JtIGZlZWRiYWNrIG11c3Qgbm90IGJlIGFjdGl2ZSB3aGVuIHRoZSB2a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQgY29tbWFuZCBpcyByZWNvcmRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtTm9uZS0wMjM2NSkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULWJpbmRpbmdDb3VudC1hcnJheWxlbmd0aCIsICJJZiBwU2l6ZXMgaXMgbm90IE5VTEwsIGJpbmRpbmdDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1iaW5kaW5nQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBjb21tYW5kQnVmZmVyLCBhbmQgdGhlIGVsZW1lbnRzIG9mIHBCdWZmZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULWZpcnN0QmluZGluZy0wMjM1NiIsICJmaXJzdEJpbmRpbmcgbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDo6bWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1maXJzdEJpbmRpbmctMDIzNTYpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1maXJzdEJpbmRpbmctMDIzNTciLCAiVGhlIHN1bSBvZiBmaXJzdEJpbmRpbmcgYW5kIGJpbmRpbmdDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjptYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULWZpcnN0QmluZGluZy0wMjM1NykifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBCdWZmZXJzLTAyMzYwIiwgIkFsbCBlbGVtZW50cyBvZiBwQnVmZmVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX0JJVF9FWFQgZmxhZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtcEJ1ZmZlcnMtMDIzNjApIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wQnVmZmVycy0wMjM2NCIsICJFYWNoIGVsZW1lbnQgb2YgcEJ1ZmZlcnMgdGhhdCBpcyBub24tc3BhcnNlIG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtcEJ1ZmZlcnMtMDIzNjQpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wQnVmZmVycy1wYXJhbWV0ZXIiLCAicEJ1ZmZlcnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYmluZGluZ0NvdW50IHZhbGlkIFZrQnVmZmVyIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBCdWZmZXJzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBPZmZzZXRzLTAyMzU4IiwgIkFsbCBlbGVtZW50cyBvZiBwT2Zmc2V0cyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGluIHBCdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wT2Zmc2V0cy0wMjM1OCkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBPZmZzZXRzLTAyMzU5IiwgIkFsbCBlbGVtZW50cyBvZiBwT2Zmc2V0cyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtcE9mZnNldHMtMDIzNTkpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wT2Zmc2V0cy0wMjM2MyIsICJBbGwgZWxlbWVudHMgb2YgcE9mZnNldHMgcGx1cyBwU2l6ZXMsIHdoZXJlIHRoZSBwU2l6ZXMsIGVsZW1lbnQgaXMgbm90IFZLX1dIT0xFX1NJWkUsIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gcEJ1ZmZlcnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBPZmZzZXRzLTAyMzYzKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtcE9mZnNldHMtcGFyYW1ldGVyIiwgInBPZmZzZXRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpbmRpbmdDb3VudCBWa0RldmljZVNpemUgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wT2Zmc2V0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wU2l6ZS0wMjM2MSIsICJJZiB0aGUgb3B0aW9uYWwgcFNpemUgYXJyYXkgaXMgc3BlY2lmaWVkLCBlYWNoIGVsZW1lbnQgb2YgcFNpemVzIG11c3QgZWl0aGVyIGJlIFZLX1dIT0xFX1NJWkUsIG9yIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjptYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlclNpemUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kVHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzRVhULXBTaXplLTAyMzYxKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtcFNpemVzLTAyMzYyIiwgIkFsbCBlbGVtZW50cyBvZiBwU2l6ZXMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYnVmZmVyIGluIHBCdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wU2l6ZXMtMDIzNjIpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wU2l6ZXMtcGFyYW1ldGVyIiwgIklmIHBTaXplcyBpcyBub3QgTlVMTCwgcFNpemVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpbmRpbmdDb3VudCBWa0RldmljZVNpemUgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1wU2l6ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtdHJhbnNmb3JtRmVlZGJhY2stMDIzNTUiLCAiVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6OnRyYW5zZm9ybUZlZWRiYWNrIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnNFWFQtdHJhbnNmb3JtRmVlZGJhY2stMDIzNTUpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtYmluZGluZ0NvdW50LWFycmF5bGVuZ3RoIiwgImJpbmRpbmdDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtYmluZGluZ0NvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCB0aGUgZWxlbWVudHMgb2YgcEJ1ZmZlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1maXJzdEJpbmRpbmctMDA2MjQiLCAiZmlyc3RCaW5kaW5nIG11c3QgYmUgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleElucHV0QmluZGluZ3MgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1maXJzdEJpbmRpbmctMDA2MjQpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtZmlyc3RCaW5kaW5nLTAwNjI1IiwgIlRoZSBzdW0gb2YgZmlyc3RCaW5kaW5nIGFuZCBiaW5kaW5nQ291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRCaW5kaW5ncyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLWZpcnN0QmluZGluZy0wMDYyNSkifSwKKyAgICB7IlZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1wQnVmZmVycy0wMDYyNyIsICJBbGwgZWxlbWVudHMgb2YgcEJ1ZmZlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQgZmxhZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLXBCdWZmZXJzLTAwNjI3KSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLXBCdWZmZXJzLTAwNjI4IiwgIkVhY2ggZWxlbWVudCBvZiBwQnVmZmVycyB0aGF0IGlzIG5vbi1zcGFyc2UgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcEJ1ZmZlcnMtMDA2MjgpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcEJ1ZmZlcnMtcGFyYW1ldGVyIiwgInBCdWZmZXJzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpbmRpbmdDb3VudCB2YWxpZCBWa0J1ZmZlciBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcEJ1ZmZlcnMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzLXBPZmZzZXRzLTAwNjI2IiwgIkFsbCBlbGVtZW50cyBvZiBwT2Zmc2V0cyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGluIHBCdWZmZXJzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcE9mZnNldHMtMDA2MjYpIn0sCisgICAgeyJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcE9mZnNldHMtcGFyYW1ldGVyIiwgInBPZmZzZXRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpbmRpbmdDb3VudCBWa0RldmljZVNpemUgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtcE9mZnNldHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tYW5kQnVmZmVyLTAxODM0IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gc3JjSW1hZ2UgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgzNCkifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgzNSIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGRzdEltYWdlIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItMDE4MzUpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItMDE4MzYiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBkc3RJbWFnZSBtdXN0IG5vdCBiZSBhbiB1bnByb3RlY3RlZCBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tYW5kQnVmZmVyLTAxODM2KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tb25wYXJlbnQiLCAiRWFjaCBvZiBjb21tYW5kQnVmZmVyLCBkc3RJbWFnZSwgYW5kIHNyY0ltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMDIyNCIsICJkc3RJbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB1c2FnZSBmbGFnIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAwMjI0KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMDIyNSIsICJJZiBkc3RJbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAwMjI1KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMDIzNCIsICJkc3RJbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBzYW1wbGVzIHZhbHVlIG9mIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMDIzNCkifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDE1NjIiLCAiZHN0SW1hZ2UgbXVzdCBub3QgdXNlIGEgZm9ybWF0IGxpc3RlZCBpbiBGb3JtYXRzIHJlcXVpcmluZyBzYW1wbGVyIFknQ0JDUiBjb252ZXJzaW9uIGZvciBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIGltYWdlIHZpZXdzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAxNTYyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMjAwMCIsICJUaGUgZm9ybWF0IGZlYXR1cmVzIG9mIGRzdEltYWdlIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9CTElUX0RTVF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAyMDAwKSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZS0wMjU0NSIsICJkc3RJbWFnZSBhbmQgc3JjSW1hZ2UgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBmbGFncyBjb250YWluaW5nIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDI1NDUpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLXBhcmFtZXRlciIsICJkc3RJbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZUxheW91dC0wMDIyNiIsICJkc3RJbWFnZUxheW91dCBtdXN0IHNwZWNpZnkgdGhlIGxheW91dCBvZiB0aGUgaW1hZ2Ugc3VicmVzb3VyY2VzIG9mIGRzdEltYWdlIHNwZWNpZmllZCBpbiBwUmVnaW9ucyBhdCB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgb24gYSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZUxheW91dC0wMDIyNikifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAyMjciLCAiZHN0SW1hZ2VMYXlvdXQgbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwgb3IgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAyMjcpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlTGF5b3V0LTAxMzk5IiwgImRzdEltYWdlTGF5b3V0IG11c3QgYmUgVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUiwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIG9yIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlTGF5b3V0LTAxMzk5KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZUxheW91dC1wYXJhbWV0ZXIiLCAiZHN0SW1hZ2VMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RTdWJyZXNvdXJjZS0wMTcwNiIsICJUaGUgZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWlwTGV2ZWxzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGRzdEltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLWRzdFN1YnJlc291cmNlLTAxNzA2KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RTdWJyZXNvdXJjZS0wMTcwOCIsICJUaGUgZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgKyBkc3RTdWJyZXNvdXJjZS5sYXllckNvdW50IG9mIGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYXJyYXlMYXllcnMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gZHN0SW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE3MDgpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWZpbHRlci0wMDIzNyIsICJJZiBmaWx0ZXIgaXMgVktfRklMVEVSX0NVQklDX0VYVCwgc3JjSW1hZ2UgbXVzdCBoYXZlIGEgVmtJbWFnZVR5cGUgb2YgVktfSU1BR0VfVFlQRV8yRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItMDAyMzcpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWZpbHRlci0wMjAwMSIsICJJZiBmaWx0ZXIgaXMgVktfRklMVEVSX0xJTkVBUiwgdGhlbiB0aGUgZm9ybWF0IGZlYXR1cmVzIG9mIHNyY0ltYWdlIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItMDIwMDEpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWZpbHRlci0wMjAwMiIsICJJZiBmaWx0ZXIgaXMgVktfRklMVEVSX0NVQklDX0VYVCwgdGhlbiB0aGUgZm9ybWF0IGZlYXR1cmVzIG9mIHNyY0ltYWdlIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItMDIwMDIpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLWZpbHRlci1wYXJhbWV0ZXIiLCAiZmlsdGVyIG11c3QgYmUgYSB2YWxpZCBWa0ZpbHRlciB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy0wMDIxNSIsICJUaGUgc291cmNlIHJlZ2lvbiBzcGVjaWZpZWQgYnkgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgYSByZWdpb24gdGhhdCBpcyBjb250YWluZWQgd2l0aGluIHNyY0ltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLXBSZWdpb25zLTAwMjE1KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy0wMDIxNiIsICJUaGUgZGVzdGluYXRpb24gcmVnaW9uIHNwZWNpZmllZCBieSBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBhIHJlZ2lvbiB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gZHN0SW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtcFJlZ2lvbnMtMDAyMTYpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXBSZWdpb25zLTAwMjE3IiwgIlRoZSB1bmlvbiBvZiBhbGwgZGVzdGluYXRpb24gcmVnaW9ucywgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50cyBvZiBwUmVnaW9ucywgbXVzdCBub3Qgb3ZlcmxhcCBpbiBtZW1vcnkgd2l0aCBhbnkgdGV4ZWwgdGhhdCBtYXkgYmUgc2FtcGxlZCBkdXJpbmcgdGhlIGJsaXQgb3BlcmF0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLXBSZWdpb25zLTAwMjE3KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy1wYXJhbWV0ZXIiLCAicFJlZ2lvbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcmVnaW9uQ291bnQgdmFsaWQgVmtJbWFnZUJsaXQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXJlZ2lvbkNvdW50LWFycmF5bGVuZ3RoIiwgInJlZ2lvbkNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2UtcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjE5IiwgInNyY0ltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHVzYWdlIGZsYWcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMTkpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjIwIiwgIklmIHNyY0ltYWdlIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMjApIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjI4IiwgIlRoZSBzYW1wbGUgY291bnQgb2Ygc3JjSW1hZ2UgYW5kIGRzdEltYWdlIG11c3QgYm90aCBiZSBlcXVhbCB0byBWS19TQU1QTEVfQ09VTlRfMV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMjgpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjI5IiwgIklmIGVpdGhlciBvZiBzcmNJbWFnZSBvciBkc3RJbWFnZSB3YXMgY3JlYXRlZCB3aXRoIGEgc2lnbmVkIGludGVnZXIgVmtGb3JtYXQsIHRoZSBvdGhlciBtdXN0IGFsc28gaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHNpZ25lZCBpbnRlZ2VyIFZrRm9ybWF0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjI5KSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMCIsICJJZiBlaXRoZXIgb2Ygc3JjSW1hZ2Ugb3IgZHN0SW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCBhbiB1bnNpZ25lZCBpbnRlZ2VyIFZrRm9ybWF0LCB0aGUgb3RoZXIgbXVzdCBhbHNvIGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYW4gdW5zaWduZWQgaW50ZWdlciBWa0Zvcm1hdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMCkifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMzEiLCAiSWYgZWl0aGVyIG9mIHNyY0ltYWdlIG9yIGRzdEltYWdlIHdhcyBjcmVhdGVkIHdpdGggYSBkZXB0aC9zdGVuY2lsIGZvcm1hdCwgdGhlIG90aGVyIG11c3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGZvcm1hdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMSkifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMzIiLCAiSWYgc3JjSW1hZ2Ugd2FzIGNyZWF0ZWQgd2l0aCBhIGRlcHRoL3N0ZW5jaWwgZm9ybWF0LCBmaWx0ZXIgbXVzdCBiZSBWS19GSUxURVJfTkVBUkVTVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMikifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMzMiLCAic3JjSW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgc2FtcGxlcyB2YWx1ZSBvZiBWS19TQU1QTEVfQ09VTlRfMV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMzMpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAxNTYxIiwgInNyY0ltYWdlIG11c3Qgbm90IHVzZSBhIGZvcm1hdCBsaXN0ZWQgaW4gRm9ybWF0cyByZXF1aXJpbmcgc2FtcGxlciBZJ0NCQ1IgY29udmVyc2lvbiBmb3IgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCBpbWFnZSB2aWV3cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMTU2MSkifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDE5OTkiLCAiVGhlIGZvcm1hdCBmZWF0dXJlcyBvZiBzcmNJbWFnZSBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9TUkNfQklULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMTk5OSkifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtcGFyYW1ldGVyIiwgInNyY0ltYWdlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMjIxIiwgInNyY0ltYWdlTGF5b3V0IG11c3Qgc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2Ygc3JjSW1hZ2Ugc3BlY2lmaWVkIGluIHBSZWdpb25zIGF0IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCBvbiBhIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMjIxKSJ9LAorICAgIHsiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZUxheW91dC0wMDIyMiIsICJzcmNJbWFnZUxheW91dCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCBvciBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZUxheW91dC0wMDIyMikifSwKKyAgICB7IlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDEzOTgiLCAic3JjSW1hZ2VMYXlvdXQgbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwgb3IgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDEzOTgpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlTGF5b3V0LXBhcmFtZXRlciIsICJzcmNJbWFnZUxheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZUxheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY1N1YnJlc291cmNlLTAxNzA1IiwgIlRoZSBzcmNTdWJyZXNvdXJjZS5taXBMZXZlbCBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBtaXBMZXZlbHMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gc3JjSW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjU3VicmVzb3VyY2UtMDE3MDUpIn0sCisgICAgeyJWVUlELXZrQ21kQmxpdEltYWdlLXNyY1N1YnJlc291cmNlLTAxNzA3IiwgIlRoZSBzcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciArIHNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhcnJheUxheWVycyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBzcmNJbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTcwNykifSwKKyAgICB7IlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbW9ucGFyZW50IiwgIkVhY2ggb2YgY29tbWFuZEJ1ZmZlciwgZHN0LCBpbnN0YW5jZURhdGEsIHNjcmF0Y2gsIGFuZCBzcmMgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRzdC0wMjQ4OCIsICJkc3QgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGNvbXBhdGlibGUgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgd2hlcmUgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY6OnR5cGUgYW5kIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjpmbGFncyBhcmUgaWRlbnRpY2FsLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjo6aW5zdGFuY2VDb3VudCBhbmQgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY6Omdlb21ldHJ5Q291bnQgZm9yIGRzdCBhcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBidWlsZCBzaXplIGFuZCBlYWNoIGdlb21ldHJ5IGluIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOjpwR2VvbWV0cmllcyBmb3IgZHN0IGhhcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB2ZXJ0aWNlcywgaW5kaWNlcywgYW5kIEFBQkJzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZHN0LTAyNDg4KSJ9LAorICAgIHsiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZHN0LXBhcmFtZXRlciIsICJkc3QgbXVzdCBiZSBhIHZhbGlkIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kc3QtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZ2VvbWV0cnlDb3VudC0wMjI0MSIsICJnZW9tZXRyeUNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjptYXhHZW9tZXRyeUNvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1nZW9tZXRyeUNvdW50LTAyMjQxKSJ9LAorICAgIHsiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtaW5zdGFuY2VEYXRhLXBhcmFtZXRlciIsICJJZiBpbnN0YW5jZURhdGEgaXMgbm90IFZLX05VTExfSEFORExFLCBpbnN0YW5jZURhdGEgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtaW5zdGFuY2VEYXRhLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBJbmZvLXBhcmFtZXRlciIsICJwSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcEluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1zY3JhdGNoLXBhcmFtZXRlciIsICJzY3JhdGNoIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNjcmF0Y2gtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtc3JjLXBhcmFtZXRlciIsICJJZiBzcmMgaXMgbm90IFZLX05VTExfSEFORExFLCBzcmMgbXVzdCBiZSBhIHZhbGlkIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1zcmMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtdXBkYXRlLTAyNDg5IiwgIklmIHVwZGF0ZSBpcyBWS19UUlVFLCBzcmMgbXVzdCBub3QgYmUgVktfTlVMTF9IQU5ETEUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ4OSkifSwKKyAgICB7IlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ5MCIsICJJZiB1cGRhdGUgaXMgVktfVFJVRSwgc3JjIG11c3QgaGF2ZSBiZWVuIGJ1aWx0IGJlZm9yZSB3aXRoIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfVVBEQVRFX0JJVF9OViBzZXQgaW4gVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY6OmZsYWdzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi11cGRhdGUtMDI0OTApIn0sCisgICAgeyJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi11cGRhdGUtMDI0OTEiLCAiSWYgdXBkYXRlIGlzIFZLX0ZBTFNFLCBUaGUgc2l6ZSBtZW1iZXIgb2YgdGhlIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WIHdpdGggVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlY6OmFjY2VsZXJhdGlvblN0cnVjdHVyZSBzZXQgdG8gZHN0IGFuZCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OVjo6dHlwZSBzZXQgdG8gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfQlVJTERfU0NSQVRDSF9OViBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBzY3JhdGNoIG1pbnVzIHNjcmF0Y2hPZmZzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ5MSkifSwKKyAgICB7IlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ5MiIsICJJZiB1cGRhdGUgaXMgVktfVFJVRSwgVGhlIHNpemUgbWVtYmVyIG9mIHRoZSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViB3aXRoIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WOjphY2NlbGVyYXRpb25TdHJ1Y3R1cmUgc2V0IHRvIGRzdCBhbmQgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlY6OnR5cGUgc2V0IHRvIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX1VQREFURV9TQ1JBVENIX05WIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHNjcmF0Y2ggbWludXMgc2NyYXRjaE9mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtdXBkYXRlLTAyNDkyKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtYXNwZWN0TWFzay0wMjUwMSIsICJJZiB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIGNvbnRhaW5zIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIHRoZW4gdGhlIGNvbG9yQXR0YWNobWVudCBtZW1iZXIgb2YgdGhhdCBlbGVtZW50IG11c3QgZWl0aGVyIHJlZmVyIHRvIGEgY29sb3IgYXR0YWNobWVudCB3aGljaCBpcyBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgb3IgbXVzdCBiZSBhIHZhbGlkIGNvbG9yIGF0dGFjaG1lbnQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1hc3BlY3RNYXNrLTAyNTAxKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtYXNwZWN0TWFzay0wMjUwMiIsICJJZiB0aGUgYXNwZWN0TWFzayBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcEF0dGFjaG1lbnRzIGNvbnRhaW5zIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQsIHRoZW4gdGhlIGN1cnJlbnQgc3VicGFzcycgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50IG11c3QgZWl0aGVyIGJlIFZLX0FUVEFDSE1FTlRfVU5VU0VELCBvciBtdXN0IGhhdmUgYSBkZXB0aCBjb21wb25lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWFzcGVjdE1hc2stMDI1MDIpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1hc3BlY3RNYXNrLTAyNTAzIiwgIklmIHRoZSBhc3BlY3RNYXNrIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwQXR0YWNobWVudHMgY29udGFpbnMgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklULCB0aGVuIHRoZSBjdXJyZW50IHN1YnBhc3MnIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCBtdXN0IGVpdGhlciBiZSBWS19BVFRBQ0hNRU5UX1VOVVNFRCwgb3IgbXVzdCBoYXZlIGEgc3RlbmNpbCBjb21wb25lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWFzcGVjdE1hc2stMDI1MDMpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1hdHRhY2htZW50Q291bnQtYXJyYXlsZW5ndGgiLCAiYXR0YWNobWVudENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWF0dGFjaG1lbnRDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWJhc2VBcnJheUxheWVyLTAwMDE4IiwgIklmIHRoZSByZW5kZXIgcGFzcyBpbnN0YW5jZSB0aGlzIGlzIHJlY29yZGVkIGluIHVzZXMgbXVsdGl2aWV3LCB0aGVuIGJhc2VBcnJheUxheWVyIG11c3QgYmUgemVybyBhbmQgbGF5ZXJDb3VudCBtdXN0IGJlIG9uZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWJhc2VBcnJheUxheWVyLTAwMDE4KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtY29tbWFuZEJ1ZmZlci0wMjUwNCIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGVhY2ggYXR0YWNobWVudCB0byBiZSBjbGVhcmVkIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGltYWdlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtY29tbWFuZEJ1ZmZlci0wMjUwNCkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWNvbW1hbmRCdWZmZXItMDI1MDUiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBlYWNoIGF0dGFjaG1lbnQgdG8gYmUgY2xlYXJlZCBtdXN0IG5vdCBiZSBhbiB1bnByb3RlY3RlZCBpbWFnZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWNvbW1hbmRCdWZmZXItMDI1MDUpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1sYXllckNvdW50LTAxOTM0IiwgIlRoZSBsYXllckNvdW50IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlY3RzIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWxheWVyQ291bnQtMDE5MzQpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1wQXR0YWNobWVudHMtcGFyYW1ldGVyIiwgInBBdHRhY2htZW50cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdHRhY2htZW50Q291bnQgdmFsaWQgVmtDbGVhckF0dGFjaG1lbnQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcEF0dGFjaG1lbnRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXBSZWN0cy0wMDAxNiIsICJUaGUgcmVjdGFuZ3VsYXIgcmVnaW9uIHNwZWNpZmllZCBieSBlYWNoIGVsZW1lbnQgb2YgcFJlY3RzIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgcmVuZGVyIGFyZWEgb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXBSZWN0cy0wMDAxNikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXBSZWN0cy0wMDAxNyIsICJUaGUgbGF5ZXJzIHNwZWNpZmllZCBieSBlYWNoIGVsZW1lbnQgb2YgcFJlY3RzIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBldmVyeSBhdHRhY2htZW50IHRoYXQgcEF0dGFjaG1lbnRzIHJlZmVycyB0byAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcFJlY3RzLTAwMDE3KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcFJlY3RzLXBhcmFtZXRlciIsICJwUmVjdHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcmVjdENvdW50IFZrQ2xlYXJSZWN0IHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXBSZWN0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1yZWN0LTAyNjgyIiwgIlRoZSByZWN0IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlY3RzIG11c3QgaGF2ZSBhbiBleHRlbnQud2lkdGggZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXJlY3QtMDI2ODIpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1yZWN0LTAyNjgzIiwgIlRoZSByZWN0IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlY3RzIG11c3QgaGF2ZSBhbiBleHRlbnQuaGVpZ2h0IGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1yZWN0LTAyNjgzKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcmVjdENvdW50LWFycmF5bGVuZ3RoIiwgInJlY3RDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1yZWN0Q291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1hc3BlY3RNYXNrLTAyNDk4IiwgIlRoZSBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZTo6YXNwZWN0TWFzayBtZW1iZXJzIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgcFJhbmdlcyBhcnJheSBtdXN0IGVhY2ggb25seSBpbmNsdWRlIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtYXNwZWN0TWFzay0wMjQ5OCkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtYmFzZUFycmF5TGF5ZXItMDE0NzIiLCAiVGhlIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlOjpiYXNlQXJyYXlMYXllciBtZW1iZXJzIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgcFJhbmdlcyBhcnJheSBtdXN0IGVhY2ggYmUgbGVzcyB0aGFuIHRoZSBhcnJheUxheWVycyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1iYXNlQXJyYXlMYXllci0wMTQ3MikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtYmFzZU1pcExldmVsLTAxNDcwIiwgIlRoZSBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZTo6YmFzZU1pcExldmVsIG1lbWJlcnMgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBwUmFuZ2VzIGFycmF5IG11c3QgZWFjaCBiZSBsZXNzIHRoYW4gdGhlIG1pcExldmVscyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1iYXNlTWlwTGV2ZWwtMDE0NzApIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWNvbW1hbmRCdWZmZXItMDE4MDUiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBpbWFnZSBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tYW5kQnVmZmVyLTAxODA1KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tYW5kQnVmZmVyLTAxODA2IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gaW1hZ2UgbXVzdCBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgwNikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgY29tbWFuZEJ1ZmZlciwgYW5kIGltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS0wMDAwMiIsICJpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB1c2FnZSBmbGFnIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlLTAwMDAyKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS0wMDAwMyIsICJJZiBpbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlLTAwMDAzKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS0wMDAwNyIsICJpbWFnZSBtdXN0IG5vdCBoYXZlIGEgY29tcHJlc3NlZCBvciBkZXB0aC9zdGVuY2lsIGZvcm1hdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS0wMDAwNykifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtMDE1NDUiLCAiaW1hZ2UgbXVzdCBub3QgdXNlIGEgZm9ybWF0IGxpc3RlZCBpbiBGb3JtYXRzIHJlcXVpcmluZyBzYW1wbGVyIFknQ0JDUiBjb252ZXJzaW9uIGZvciBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIGltYWdlIHZpZXdzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlLTAxNTQ1KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS0wMTk5MyIsICJUaGUgZm9ybWF0IGZlYXR1cmVzIG9mIGltYWdlIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS0wMTk5MykifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2UtcGFyYW1ldGVyIiwgImltYWdlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlTGF5b3V0LTAwMDA0IiwgImltYWdlTGF5b3V0IG11c3Qgc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSByYW5nZXMgb2YgaW1hZ2Ugc3BlY2lmaWVkIGluIHBSYW5nZXMgYXQgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIG9uIGEgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2VMYXlvdXQtMDAwMDQpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlTGF5b3V0LTAwMDA1IiwgImltYWdlTGF5b3V0IG11c3QgYmUgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIG9yIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlTGF5b3V0LTAwMDA1KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZUxheW91dC0wMTM5NCIsICJpbWFnZUxheW91dCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIG9yIFZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2VMYXlvdXQtMDEzOTQpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWltYWdlTGF5b3V0LXBhcmFtZXRlciIsICJpbWFnZUxheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZUxheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBDb2xvci1wYXJhbWV0ZXIiLCAicENvbG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtDbGVhckNvbG9yVmFsdWUgdW5pb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcENvbG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcFJhbmdlcy0wMTY5MiIsICJGb3IgZWFjaCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBlbGVtZW50IG9mIHBSYW5nZXMsIGlmIHRoZSBsZXZlbENvdW50IG1lbWJlciBpcyBub3QgVktfUkVNQUlOSU5HX01JUF9MRVZFTFMsIHRoZW4gYmFzZU1pcExldmVsICsgbGV2ZWxDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWlwTGV2ZWxzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBSYW5nZXMtMDE2OTIpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBSYW5nZXMtMDE2OTMiLCAiRm9yIGVhY2ggVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgZWxlbWVudCBvZiBwUmFuZ2VzLCBpZiB0aGUgbGF5ZXJDb3VudCBtZW1iZXIgaXMgbm90IFZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlMsIHRoZW4gYmFzZUFycmF5TGF5ZXIgKyBsYXllckNvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhcnJheUxheWVycyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1wUmFuZ2VzLTAxNjkzKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1wUmFuZ2VzLXBhcmFtZXRlciIsICJwUmFuZ2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHJhbmdlQ291bnQgdmFsaWQgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1wUmFuZ2VzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcmFuZ2VDb3VudC1hcnJheWxlbmd0aCIsICJyYW5nZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcmFuZ2VDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWFzcGVjdE1hc2stMDI4MjQiLCAiVGhlIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlOjphc3BlY3RNYXNrIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgdGhlIHBSYW5nZXMgYXJyYXkgbXVzdCBub3QgaW5jbHVkZSBiaXRzIG90aGVyIHRoYW4gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCBvciBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWFzcGVjdE1hc2stMDI4MjQpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1iYXNlQXJyYXlMYXllci0wMTQ3NiIsICJUaGUgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2U6OmJhc2VBcnJheUxheWVyIG1lbWJlcnMgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBwUmFuZ2VzIGFycmF5IG11c3QgZWFjaCBiZSBsZXNzIHRoYW4gdGhlIGFycmF5TGF5ZXJzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1iYXNlQXJyYXlMYXllci0wMTQ3NikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWJhc2VNaXBMZXZlbC0wMTQ3NCIsICJUaGUgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2U6OmJhc2VNaXBMZXZlbCBtZW1iZXJzIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgcFJhbmdlcyBhcnJheSBtdXN0IGVhY2ggYmUgbGVzcyB0aGFuIHRoZSBtaXBMZXZlbHMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gaW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWJhc2VNaXBMZXZlbC0wMTQ3NCkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWNvbW1hbmRCdWZmZXItMDE4MDciLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBpbWFnZSBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgwNykifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWNvbW1hbmRCdWZmZXItMDE4MDgiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBpbWFnZSBtdXN0IG5vdCBiZSBhbiB1bnByb3RlY3RlZCBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgwOCkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCBpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMDAwOSIsICJpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB1c2FnZSBmbGFnIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMDAwOSkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLTAwMDEwIiwgIklmIGltYWdlIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLTAwMDEwKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtaW1hZ2UtMDAwMTQiLCAiaW1hZ2UgbXVzdCBoYXZlIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLTAwMDE0KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtaW1hZ2UtMDE5OTQiLCAiVGhlIGZvcm1hdCBmZWF0dXJlcyBvZiBpbWFnZSBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLTAxOTk0KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtaW1hZ2UtMDI4MjUiLCAiSWYgdGhlIGltYWdlJ3MgZm9ybWF0IGRvZXMgbm90IGhhdmUgYSBzdGVuY2lsIGNvbXBvbmVudCwgdGhlbiB0aGUgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2U6OmFzcGVjdE1hc2sgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiB0aGUgcFJhbmdlcyBhcnJheSBtdXN0IG5vdCBpbmNsdWRlIHRoZSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgYml0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMjgyNSkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLTAyODI2IiwgIklmIHRoZSBpbWFnZSdzIGZvcm1hdCBkb2VzIG5vdCBoYXZlIGEgZGVwdGggY29tcG9uZW50LCB0aGVuIHRoZSBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZTo6YXNwZWN0TWFzayBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHRoZSBwUmFuZ2VzIGFycmF5IG11c3Qgbm90IGluY2x1ZGUgdGhlIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgYml0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZS0wMjgyNikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLXBhcmFtZXRlciIsICJpbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlTGF5b3V0LTAwMDExIiwgImltYWdlTGF5b3V0IG11c3Qgc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZSByYW5nZXMgb2YgaW1hZ2Ugc3BlY2lmaWVkIGluIHBSYW5nZXMgYXQgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIG9uIGEgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlTGF5b3V0LTAwMDExKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtaW1hZ2VMYXlvdXQtMDAwMTIiLCAiaW1hZ2VMYXlvdXQgbXVzdCBiZSBlaXRoZXIgb2YgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIG9yIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZUxheW91dC0wMDAxMikifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWltYWdlTGF5b3V0LXBhcmFtZXRlciIsICJpbWFnZUxheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtaW1hZ2VMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcERlcHRoU3RlbmNpbC1wYXJhbWV0ZXIiLCAicERlcHRoU3RlbmNpbCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBEZXB0aFN0ZW5jaWwtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMTY5NCIsICJGb3IgZWFjaCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBlbGVtZW50IG9mIHBSYW5nZXMsIGlmIHRoZSBsZXZlbENvdW50IG1lbWJlciBpcyBub3QgVktfUkVNQUlOSU5HX01JUF9MRVZFTFMsIHRoZW4gYmFzZU1pcExldmVsICsgbGV2ZWxDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWlwTGV2ZWxzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1wUmFuZ2VzLTAxNjk0KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMTY5NSIsICJGb3IgZWFjaCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBlbGVtZW50IG9mIHBSYW5nZXMsIGlmIHRoZSBsYXllckNvdW50IG1lbWJlciBpcyBub3QgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUywgdGhlbiBiYXNlQXJyYXlMYXllciArIGxheWVyQ291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGFycmF5TGF5ZXJzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1wUmFuZ2VzLTAxNjk1KSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMjY1OCIsICJJZiBhbnkgZWxlbWVudCBvZiBwUmFuZ2VzLmFzcGVjdCBpbmNsdWRlcyBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQsIGFuZCBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIHNlcGFyYXRlIHN0ZW5jaWwgdXNhZ2UsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgbXVzdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhlIFZrSW1hZ2VTdGVuY2lsVXNhZ2VDcmVhdGVJbmZvRVhUOjpzdGVuY2lsVXNhZ2UgdXNlZCB0byBjcmVhdGUgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtMDI2NTgpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1wUmFuZ2VzLTAyNjU5IiwgIklmIGFueSBlbGVtZW50IG9mIHBSYW5nZXMuYXNwZWN0IGluY2x1ZGVzIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCwgYW5kIGltYWdlIHdhcyBub3QgY3JlYXRlZCB3aXRoIHNlcGFyYXRlIHN0ZW5jaWwgdXNhZ2UsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgbXVzdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhlIFZrSW1hZ2VDcmVhdGVJbmZvOjp1c2FnZSB1c2VkIHRvIGNyZWF0ZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMjY1OSkifSwKKyAgICB7IlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtMDI2NjAiLCAiSWYgYW55IGVsZW1lbnQgb2YgcFJhbmdlcy5hc3BlY3QgaW5jbHVkZXMgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCBtdXN0IGhhdmUgYmVlbiBpbmNsdWRlZCBpbiB0aGUgVmtJbWFnZUNyZWF0ZUluZm86OnVzYWdlIHVzZWQgdG8gY3JlYXRlIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1wUmFuZ2VzLTAyNjYwKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy1wYXJhbWV0ZXIiLCAicFJhbmdlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiByYW5nZUNvdW50IHZhbGlkIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcmFuZ2VDb3VudC1hcnJheWxlbmd0aCIsICJyYW5nZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXJhbmdlQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQiLCAiRWFjaCBvZiBjb21tYW5kQnVmZmVyLCBkc3QsIGFuZCBzcmMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRzdC1wYXJhbWV0ZXIiLCAiZHN0IG11c3QgYmUgYSB2YWxpZCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kc3QtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1tb2RlLTAyNDk2IiwgIm1vZGUgbXVzdCBiZSBWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DT01QQUNUX05WIG9yIFZLX0NPUFlfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NT0RFX0NMT05FX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLW1vZGUtMDI0OTYpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLW1vZGUtcGFyYW1ldGVyIiwgIm1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1tb2RlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtc3JjLTAyNDk3IiwgInNyYyBtdXN0IGhhdmUgYmVlbiBidWlsdCB3aXRoIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfQ09NUEFDVElPTl9CSVRfTlYgaWYgbW9kZSBpcyBWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DT01QQUNUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNyYy0wMjQ5NykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtc3JjLXBhcmFtZXRlciIsICJzcmMgbXVzdCBiZSBhIHZhbGlkIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXNyYy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlci1jb21tYW5kQnVmZmVyLTAxODIyIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gc3JjQnVmZmVyIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgyMikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1hbmRCdWZmZXItMDE4MjMiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBkc3RCdWZmZXIgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlci1jb21tYW5kQnVmZmVyLTAxODIzKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgyNCIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGRzdEJ1ZmZlciBtdXN0IG5vdCBiZSBhbiB1bnByb3RlY3RlZCBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1hbmRCdWZmZXItMDE4MjQpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlci1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgdHJhbnNmZXIsIGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXItY29tbW9ucGFyZW50IiwgIkVhY2ggb2YgY29tbWFuZEJ1ZmZlciwgZHN0QnVmZmVyLCBhbmQgc3JjQnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyLWRzdEJ1ZmZlci0wMDEyMCIsICJkc3RCdWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHVzYWdlIGZsYWcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLWRzdEJ1ZmZlci0wMDEyMCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyLWRzdEJ1ZmZlci0wMDEyMSIsICJJZiBkc3RCdWZmZXIgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXItZHN0QnVmZmVyLTAwMTIxKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXItZHN0QnVmZmVyLXBhcmFtZXRlciIsICJkc3RCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXItZHN0QnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyLWRzdE9mZnNldC0wMDExNCIsICJUaGUgZHN0T2Zmc2V0IG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgZHN0QnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlci1kc3RPZmZzZXQtMDAxMTQpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlci1wUmVnaW9ucy0wMDExNyIsICJUaGUgdW5pb24gb2YgdGhlIHNvdXJjZSByZWdpb25zLCBhbmQgdGhlIHVuaW9uIG9mIHRoZSBkZXN0aW5hdGlvbiByZWdpb25zLCBzcGVjaWZpZWQgYnkgdGhlIGVsZW1lbnRzIG9mIHBSZWdpb25zLCBtdXN0IG5vdCBvdmVybGFwIGluIG1lbW9yeSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXItcFJlZ2lvbnMtMDAxMTcpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlci1wUmVnaW9ucy1wYXJhbWV0ZXIiLCAicFJlZ2lvbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcmVnaW9uQ291bnQgdmFsaWQgVmtCdWZmZXJDb3B5IHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLXBSZWdpb25zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyLXJlZ2lvbkNvdW50LWFycmF5bGVuZ3RoIiwgInJlZ2lvbkNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLXJlZ2lvbkNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXItcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlci1zaXplLTAwMTE1IiwgIlRoZSBzaXplIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2Ygc3JjQnVmZmVyIG1pbnVzIHNyY09mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXItc2l6ZS0wMDExNSkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNpemUtMDAxMTYiLCAiVGhlIHNpemUgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBkc3RCdWZmZXIgbWludXMgZHN0T2Zmc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlci1zaXplLTAwMTE2KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXItc3JjQnVmZmVyLTAwMTE4IiwgInNyY0J1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgdXNhZ2UgZmxhZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXItc3JjQnVmZmVyLTAwMTE4KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXItc3JjQnVmZmVyLTAwMTE5IiwgIklmIHNyY0J1ZmZlciBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlci1zcmNCdWZmZXItMDAxMTkpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlci1zcmNCdWZmZXItcGFyYW1ldGVyIiwgInNyY0J1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlci1zcmNCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXItc3JjT2Zmc2V0LTAwMTEzIiwgIlRoZSBzcmNPZmZzZXQgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBzcmNCdWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyLXNyY09mZnNldC0wMDExMykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tYW5kQnVmZmVyLTAxODI4IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gc3JjQnVmZmVyIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWNvbW1hbmRCdWZmZXItMDE4MjgpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgyOSIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGRzdEltYWdlIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgyOSkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tYW5kQnVmZmVyLTAxODMwIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gZHN0SW1hZ2UgbXVzdCBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tYW5kQnVmZmVyLTAxODMwKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCB0cmFuc2ZlciwgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1jb21tb25wYXJlbnQiLCAiRWFjaCBvZiBjb21tYW5kQnVmZmVyLCBkc3RJbWFnZSwgYW5kIHNyY0J1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlLTAwMTc3IiwgImRzdEltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHVzYWdlIGZsYWcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS0wMDE3NykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS0wMDE3OCIsICJJZiBkc3RJbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtMDAxNzgpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtMDAxNzkiLCAiZHN0SW1hZ2UgbXVzdCBoYXZlIGEgc2FtcGxlIGNvdW50IGVxdWFsIHRvIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlLTAwMTc5KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlLTAxOTk3IiwgIlRoZSBmb3JtYXQgZmVhdHVyZXMgb2YgZHN0SW1hZ2UgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtMDE5OTcpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtMDI1NDMiLCAiZHN0SW1hZ2UgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBmbGFncyBjb250YWluaW5nIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS0wMjU0MykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZS1wYXJhbWV0ZXIiLCAiZHN0SW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlTGF5b3V0LTAwMTgwIiwgImRzdEltYWdlTGF5b3V0IG11c3Qgc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2YgZHN0SW1hZ2Ugc3BlY2lmaWVkIGluIHBSZWdpb25zIGF0IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCBvbiBhIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxODApIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxODEiLCAiZHN0SW1hZ2VMYXlvdXQgbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwgb3IgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZUxheW91dC0wMDE4MSkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZUxheW91dC0wMTM5NiIsICJkc3RJbWFnZUxheW91dCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIG9yIFZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZUxheW91dC0wMTM5NikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZUxheW91dC1wYXJhbWV0ZXIiLCAiZHN0SW1hZ2VMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1kc3RJbWFnZUxheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtaW1hZ2VPZmZzZXQtMDE3OTMiLCAiVGhlIGltYWdlT2Zmc2V0IGFuZCBpbWFnZUV4dGVudCBtZW1iZXJzIG9mIGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IHJlc3BlY3QgdGhlIGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5IHJlcXVpcmVtZW50cyBvZiBjb21tYW5kQnVmZmVyJ3MgY29tbWFuZCBwb29sJ3MgcXVldWUgZmFtaWx5LCBhcyBkZXNjcmliZWQgaW4gVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1pbWFnZU9mZnNldC0wMTc5MykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1pbWFnZVN1YnJlc291cmNlLTAxNzAxIiwgIlRoZSBpbWFnZVN1YnJlc291cmNlLm1pcExldmVsIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG1pcExldmVscyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBkc3RJbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWltYWdlU3VicmVzb3VyY2UtMDE3MDEpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtaW1hZ2VTdWJyZXNvdXJjZS0wMTcwMiIsICJUaGUgaW1hZ2VTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciArIGltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudCBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFycmF5TGF5ZXJzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGRzdEltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtaW1hZ2VTdWJyZXNvdXJjZS0wMTcwMikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1wUmVnaW9ucy0wMDE3MSIsICJzcmNCdWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbGwgYnVmZmVyIGxvY2F0aW9ucyB0aGF0IGFyZSBhY2Nlc3NlZCBhY2NvcmRpbmcgdG8gQnVmZmVyIGFuZCBJbWFnZSBBZGRyZXNzaW5nLCBmb3IgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtMDAxNzEpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtMDAxNzIiLCAiVGhlIGltYWdlIHJlZ2lvbiBzcGVjaWZpZWQgYnkgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgYSByZWdpb24gdGhhdCBpcyBjb250YWluZWQgd2l0aGluIGRzdEltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtMDAxNzIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtMDAxNzMiLCAiVGhlIHVuaW9uIG9mIGFsbCBzb3VyY2UgcmVnaW9ucywgYW5kIHRoZSB1bmlvbiBvZiBhbGwgZGVzdGluYXRpb24gcmVnaW9ucywgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50cyBvZiBwUmVnaW9ucywgbXVzdCBub3Qgb3ZlcmxhcCBpbiBtZW1vcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1wUmVnaW9ucy0wMDE3MykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1wUmVnaW9ucy1wYXJhbWV0ZXIiLCAicFJlZ2lvbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcmVnaW9uQ291bnQgdmFsaWQgVmtCdWZmZXJJbWFnZUNvcHkgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXBSZWdpb25zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1yZWdpb25Db3VudC1hcnJheWxlbmd0aCIsICJyZWdpb25Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXNyY0J1ZmZlci0wMDE3NCIsICJzcmNCdWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHVzYWdlIGZsYWcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1zcmNCdWZmZXItMDAxNzQpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2Utc3JjQnVmZmVyLTAwMTc2IiwgIklmIHNyY0J1ZmZlciBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2Utc3JjQnVmZmVyLTAwMTc2KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXNyY0J1ZmZlci1wYXJhbWV0ZXIiLCAic3JjQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1zcmNCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1Ob25lLTAxNTQ5IiwgIkluIGEgY29weSB0byBvciBmcm9tIGEgcGxhbmUgb2YgYSBtdWx0aS1wbGFuYXIgaW1hZ2UsIHRoZSBWa0Zvcm1hdCBvZiB0aGUgaW1hZ2UgYW5kIHBsYW5lIG11c3QgYmUgY29tcGF0aWJsZSBhY2NvcmRpbmcgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIGNvbXBhdGlibGUgcGxhbmVzIGZvciB0aGUgcGxhbmUgYmVpbmcgY29waWVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLU5vbmUtMDE1NDkpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWFzcGVjdE1hc2stMDE1NTAiLCAiV2hlbiBhIGNvcHkgaXMgcGVyZm9ybWVkIHRvIG9yIGZyb20gYW4gaW1hZ2Ugd2l0aCBhIG11bHRpLXBsYW5hciBmb3JtYXQsIHRoZSBhc3BlY3RNYXNrIG9mIHRoZSBzcmNTdWJyZXNvdXJjZSBhbmQvb3IgZHN0U3VicmVzb3VyY2UgdGhhdCByZWZlcnMgdG8gdGhlIG11bHRpLXBsYW5hciBpbWFnZSBtdXN0IGJlIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVCwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklULCBvciBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQgKHdpdGggVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUIHZhbGlkIG9ubHkgZm9yIGEgVmtGb3JtYXQgd2l0aCB0aHJlZSBwbGFuZXMpIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLWFzcGVjdE1hc2stMDE1NTApIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWNvbW1hbmRCdWZmZXItMDE4MjUiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBzcmNJbWFnZSBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1jb21tYW5kQnVmZmVyLTAxODI1KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1jb21tYW5kQnVmZmVyLTAxODI2IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gZHN0SW1hZ2UgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgyNikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgyNyIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGRzdEltYWdlIG11c3Qgbm90IGJlIGFuIHVucHJvdGVjdGVkIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLWNvbW1hbmRCdWZmZXItMDE4MjcpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCB0cmFuc2ZlciwgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1jb21tb25wYXJlbnQiLCAiRWFjaCBvZiBjb21tYW5kQnVmZmVyLCBkc3RJbWFnZSwgYW5kIHNyY0ltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMDEzMSIsICJkc3RJbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB1c2FnZSBmbGFnIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlLTAwMTMxKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMDEzMiIsICJJZiBkc3RJbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlLTAwMTMyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMTU0NyIsICJJZiBkc3RJbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gdGhlIGltYWdlIG9yIGRpc2pvaW50IHBsYW5lIHRoYXQgaXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjb3B5IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMTU0NykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2UtMDE5OTYiLCAiVGhlIGZvcm1hdCBmZWF0dXJlcyBvZiBkc3RJbWFnZSBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2UtMDE5OTYpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlLTAyNTQyIiwgImRzdEltYWdlIGFuZCBzcmNJbWFnZSBtdXN0IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGZsYWdzIGNvbnRhaW5pbmcgVktfSU1BR0VfQ1JFQVRFX1NVQlNBTVBMRURfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS0wMjU0MikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2UtcGFyYW1ldGVyIiwgImRzdEltYWdlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlTGF5b3V0LTAwMTMzIiwgImRzdEltYWdlTGF5b3V0IG11c3Qgc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2YgZHN0SW1hZ2Ugc3BlY2lmaWVkIGluIHBSZWdpb25zIGF0IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCBvbiBhIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlTGF5b3V0LTAwMTMzKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZUxheW91dC0wMDEzNCIsICJkc3RJbWFnZUxheW91dCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCBvciBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZUxheW91dC0wMDEzNCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDEzOTUiLCAiZHN0SW1hZ2VMYXlvdXQgbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBvciBWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLWRzdEltYWdlTGF5b3V0LTAxMzk1KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RJbWFnZUxheW91dC1wYXJhbWV0ZXIiLCAiZHN0SW1hZ2VMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RPZmZzZXQtMDE3ODQiLCAiVGhlIGRzdE9mZnNldCBhbmQgZXh0ZW50IG1lbWJlcnMgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgcmVzcGVjdCB0aGUgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkgcmVxdWlyZW1lbnRzIG9mIGNvbW1hbmRCdWZmZXIncyBjb21tYW5kIHBvb2wncyBxdWV1ZSBmYW1pbHksIGFzIGRlc2NyaWJlZCBpbiBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1kc3RPZmZzZXQtMDE3ODQpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWRzdFN1YnJlc291cmNlLTAxNjk3IiwgIlRoZSBkc3RTdWJyZXNvdXJjZS5taXBMZXZlbCBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBtaXBMZXZlbHMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gZHN0SW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE2OTcpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLWRzdFN1YnJlc291cmNlLTAxNjk5IiwgIlRoZSBkc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciArIGRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhcnJheUxheWVycyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBkc3RJbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1kc3RTdWJyZXNvdXJjZS0wMTY5OSkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2UtcFJlZ2lvbnMtMDAxMjIiLCAiVGhlIHNvdXJjZSByZWdpb24gc3BlY2lmaWVkIGJ5IGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IGJlIGEgcmVnaW9uIHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiBzcmNJbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1wUmVnaW9ucy0wMDEyMikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2UtcFJlZ2lvbnMtMDAxMjMiLCAiVGhlIGRlc3RpbmF0aW9uIHJlZ2lvbiBzcGVjaWZpZWQgYnkgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgYSByZWdpb24gdGhhdCBpcyBjb250YWluZWQgd2l0aGluIGRzdEltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTIzKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1wUmVnaW9ucy0wMDEyNCIsICJUaGUgdW5pb24gb2YgYWxsIHNvdXJjZSByZWdpb25zLCBhbmQgdGhlIHVuaW9uIG9mIGFsbCBkZXN0aW5hdGlvbiByZWdpb25zLCBzcGVjaWZpZWQgYnkgdGhlIGVsZW1lbnRzIG9mIHBSZWdpb25zLCBtdXN0IG5vdCBvdmVybGFwIGluIG1lbW9yeSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1wUmVnaW9ucy0wMDEyNCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2UtcFJlZ2lvbnMtcGFyYW1ldGVyIiwgInBSZWdpb25zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHJlZ2lvbkNvdW50IHZhbGlkIFZrSW1hZ2VDb3B5IHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2UtcFJlZ2lvbnMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1yZWdpb25Db3VudC1hcnJheWxlbmd0aCIsICJyZWdpb25Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXJlZ2lvbkNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEyNiIsICJzcmNJbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB1c2FnZSBmbGFnIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAwMTI2KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEyNyIsICJJZiBzcmNJbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAwMTI3KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEzNSIsICJUaGUgVmtGb3JtYXQgb2YgZWFjaCBvZiBzcmNJbWFnZSBhbmQgZHN0SW1hZ2UgbXVzdCBiZSBjb21wYXRpYmxlLCBhcyBkZWZpbmVkIGFib3ZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAwMTM1KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEzNiIsICJUaGUgc2FtcGxlIGNvdW50IG9mIHNyY0ltYWdlIGFuZCBkc3RJbWFnZSBtdXN0IG1hdGNoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAwMTM2KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMTU0NiIsICJJZiBzcmNJbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gdGhlIGltYWdlIG9yIGRpc2pvaW50IHBsYW5lIHRvIGJlIGNvcGllZCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDE1NDYpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAxNTQ4IiwgIklmIHRoZSBWa0Zvcm1hdCBvZiBlYWNoIG9mIHNyY0ltYWdlIGFuZCBkc3RJbWFnZSBpcyBub3QgYSBtdWx0aS1wbGFuYXIgZm9ybWF0LCB0aGUgVmtGb3JtYXQgb2YgZWFjaCBvZiBzcmNJbWFnZSBhbmQgZHN0SW1hZ2UgbXVzdCBiZSBjb21wYXRpYmxlLCBhcyBkZWZpbmVkIGFib3ZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAxNTQ4KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMTk5NSIsICJUaGUgZm9ybWF0IGZlYXR1cmVzIG9mIHNyY0ltYWdlIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMTk5NSkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtcGFyYW1ldGVyIiwgInNyY0ltYWdlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMTI4IiwgInNyY0ltYWdlTGF5b3V0IG11c3Qgc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2Ygc3JjSW1hZ2Ugc3BlY2lmaWVkIGluIHBSZWdpb25zIGF0IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCBvbiBhIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMTI4KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZUxheW91dC0wMDEyOSIsICJzcmNJbWFnZUxheW91dCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCBvciBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZUxheW91dC0wMDEyOSkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDE5MTciLCAic3JjSW1hZ2VMYXlvdXQgbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBvciBWS19JTUFHRV9MQVlPVVRfU0hBUkVEX1BSRVNFTlRfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlTGF5b3V0LTAxOTE3KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZUxheW91dC1wYXJhbWV0ZXIiLCAic3JjSW1hZ2VMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNPZmZzZXQtMDE3ODMiLCAiVGhlIHNyY09mZnNldCBhbmQgZXh0ZW50IG1lbWJlcnMgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgcmVzcGVjdCB0aGUgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkgcmVxdWlyZW1lbnRzIG9mIGNvbW1hbmRCdWZmZXIncyBjb21tYW5kIHBvb2wncyBxdWV1ZSBmYW1pbHksIGFzIGRlc2NyaWJlZCBpbiBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1zcmNPZmZzZXQtMDE3ODMpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLXNyY1N1YnJlc291cmNlLTAxNjk2IiwgIlRoZSBzcmNTdWJyZXNvdXJjZS5taXBMZXZlbCBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBtaXBMZXZlbHMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gc3JjSW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjU3VicmVzb3VyY2UtMDE2OTYpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlLXNyY1N1YnJlc291cmNlLTAxNjk4IiwgIlRoZSBzcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciArIHNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgb2YgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhcnJheUxheWVycyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBzcmNJbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTY5OCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tYW5kQnVmZmVyLTAxODMxIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gc3JjSW1hZ2UgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tYW5kQnVmZmVyLTAxODMxKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1hbmRCdWZmZXItMDE4MzIiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBkc3RCdWZmZXIgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgzMikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tYW5kQnVmZmVyLTAxODMzIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gZHN0QnVmZmVyIG11c3Qgbm90IGJlIGFuIHVucHJvdGVjdGVkIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1hbmRCdWZmZXItMDE4MzMpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IHRyYW5zZmVyLCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1vbnBhcmVudCIsICJFYWNoIG9mIGNvbW1hbmRCdWZmZXIsIGRzdEJ1ZmZlciwgYW5kIHNyY0ltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItZHN0QnVmZmVyLTAwMTkxIiwgImRzdEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgdXNhZ2UgZmxhZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWRzdEJ1ZmZlci0wMDE5MSkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1kc3RCdWZmZXItMDAxOTIiLCAiSWYgZHN0QnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1kc3RCdWZmZXItMDAxOTIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItZHN0QnVmZmVyLXBhcmFtZXRlciIsICJkc3RCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWRzdEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItaW1hZ2VPZmZzZXQtMDE3OTQiLCAiVGhlIGltYWdlT2Zmc2V0IGFuZCBpbWFnZUV4dGVudCBtZW1iZXJzIG9mIGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IHJlc3BlY3QgdGhlIGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5IHJlcXVpcmVtZW50cyBvZiBjb21tYW5kQnVmZmVyJ3MgY29tbWFuZCBwb29sJ3MgcXVldWUgZmFtaWx5LCBhcyBkZXNjcmliZWQgaW4gVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1pbWFnZU9mZnNldC0wMTc5NCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1pbWFnZVN1YnJlc291cmNlLTAxNzAzIiwgIlRoZSBpbWFnZVN1YnJlc291cmNlLm1pcExldmVsIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG1pcExldmVscyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBzcmNJbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWltYWdlU3VicmVzb3VyY2UtMDE3MDMpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItaW1hZ2VTdWJyZXNvdXJjZS0wMTcwNCIsICJUaGUgaW1hZ2VTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciArIGltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudCBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFycmF5TGF5ZXJzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIHNyY0ltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItaW1hZ2VTdWJyZXNvdXJjZS0wMTcwNCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MiIsICJUaGUgaW1hZ2UgcmVnaW9uIHNwZWNpZmllZCBieSBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBhIHJlZ2lvbiB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gc3JjSW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MyIsICJkc3RCdWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbGwgYnVmZmVyIGxvY2F0aW9ucyB0aGF0IGFyZSBhY2Nlc3NlZCBhY2NvcmRpbmcgdG8gQnVmZmVyIGFuZCBJbWFnZSBBZGRyZXNzaW5nLCBmb3IgZWFjaCBlbGVtZW50IG9mIHBSZWdpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcFJlZ2lvbnMtMDAxODMpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcFJlZ2lvbnMtMDAxODQiLCAiVGhlIHVuaW9uIG9mIGFsbCBzb3VyY2UgcmVnaW9ucywgYW5kIHRoZSB1bmlvbiBvZiBhbGwgZGVzdGluYXRpb24gcmVnaW9ucywgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50cyBvZiBwUmVnaW9ucywgbXVzdCBub3Qgb3ZlcmxhcCBpbiBtZW1vcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4NCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy1wYXJhbWV0ZXIiLCAicFJlZ2lvbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcmVnaW9uQ291bnQgdmFsaWQgVmtCdWZmZXJJbWFnZUNvcHkgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1yZWdpb25Db3VudC1hcnJheWxlbmd0aCIsICJyZWdpb25Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLTAwMTg2IiwgInNyY0ltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHVzYWdlIGZsYWcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZS0wMDE4NikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZS0wMDE4NyIsICJJZiBzcmNJbWFnZSBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2UtMDAxODcpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2UtMDAxODgiLCAic3JjSW1hZ2UgbXVzdCBoYXZlIGEgc2FtcGxlIGNvdW50IGVxdWFsIHRvIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLTAwMTg4KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlLTAxOTk4IiwgIlRoZSBmb3JtYXQgZmVhdHVyZXMgb2Ygc3JjSW1hZ2UgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2UtMDE5OTgpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2UtMDI1NDQiLCAic3JjSW1hZ2UgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBmbGFncyBjb250YWluaW5nIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZS0wMjU0NCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZS1wYXJhbWV0ZXIiLCAic3JjSW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlTGF5b3V0LTAwMTg5IiwgInNyY0ltYWdlTGF5b3V0IG11c3Qgc3BlY2lmeSB0aGUgbGF5b3V0IG9mIHRoZSBpbWFnZSBzdWJyZXNvdXJjZXMgb2Ygc3JjSW1hZ2Ugc3BlY2lmaWVkIGluIHBSZWdpb25zIGF0IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCBvbiBhIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2VMYXlvdXQtMDAxODkpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItc3JjSW1hZ2VMYXlvdXQtMDAxOTAiLCAic3JjSW1hZ2VMYXlvdXQgbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwgb3IgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZUxheW91dC0wMDE5MCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZUxheW91dC0wMTM5NyIsICJzcmNJbWFnZUxheW91dCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCBvciBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlTGF5b3V0LTAxMzk3KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlTGF5b3V0LXBhcmFtZXRlciIsICJzcmNJbWFnZUxheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZUxheW91dCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXNyY0ltYWdlTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tb25wYXJlbnQiLCAiRWFjaCBvZiBjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGFuZCBxdWVyeVBvb2wgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1kc3RCdWZmZXItMDA4MjQiLCAiZHN0QnVmZmVyIG11c3QgaGF2ZSBlbm91Z2ggc3RvcmFnZSwgZnJvbSBkc3RPZmZzZXQsIHRvIGNvbnRhaW4gdGhlIHJlc3VsdCBvZiBlYWNoIHF1ZXJ5LCBhcyBkZXNjcmliZWQgaGVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWRzdEJ1ZmZlci0wMDgyNCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1kc3RCdWZmZXItMDA4MjUiLCAiZHN0QnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB1c2FnZSBmbGFnIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZHN0QnVmZmVyLTAwODI1KSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWRzdEJ1ZmZlci0wMDgyNiIsICJJZiBkc3RCdWZmZXIgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWRzdEJ1ZmZlci0wMDgyNikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1kc3RCdWZmZXItcGFyYW1ldGVyIiwgImRzdEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZHN0QnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1kc3RPZmZzZXQtMDA4MTkiLCAiZHN0T2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGRzdEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWRzdE9mZnNldC0wMDgxOSkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1maXJzdFF1ZXJ5LTAwODIwIiwgImZpcnN0UXVlcnkgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIHF1ZXJ5UG9vbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZpcnN0UXVlcnktMDA4MjApIn0sCisgICAgeyJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZmlyc3RRdWVyeS0wMDgyMSIsICJUaGUgc3VtIG9mIGZpcnN0UXVlcnkgYW5kIHF1ZXJ5Q291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIHF1ZXJ5UG9vbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZpcnN0UXVlcnktMDA4MjEpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtMDA4MjIiLCAiSWYgVktfUVVFUllfUkVTVUxUXzY0X0JJVCBpcyBub3Qgc2V0IGluIGZsYWdzIHRoZW4gZHN0T2Zmc2V0IGFuZCBzdHJpZGUgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAwODIyKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAwODIzIiwgIklmIFZLX1FVRVJZX1JFU1VMVF82NF9CSVQgaXMgc2V0IGluIGZsYWdzIHRoZW4gZHN0T2Zmc2V0IGFuZCBzdHJpZGUgbXVzdCBiZSBtdWx0aXBsZXMgb2YgOCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAwODIzKSJ9LAorICAgIHsiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLXBhcmFtZXRlciIsICJmbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtRdWVyeVJlc3VsdEZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1xdWVyeVBvb2wtcGFyYW1ldGVyIiwgInF1ZXJ5UG9vbCBtdXN0IGJlIGEgdmFsaWQgVmtRdWVyeVBvb2wgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDA4MjciLCAiSWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QLCBmbGFncyBtdXN0IG5vdCBjb250YWluIFZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMDgyNykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDI3MzQiLCAidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyBtdXN0IG5vdCBiZSBjYWxsZWQgaWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfSU5URUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDI3MzQpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjMyIiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiwgVmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlQcm9wZXJ0aWVzS0hSOjphbGxvd0NvbW1hbmRCdWZmZXJRdWVyeUNvcGllcyBtdXN0IGJlIFZLX1RSVUUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDMyMzIpIn0sCisgICAgeyJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjMzIiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19RVUVSWV9SRVNVTFRfV0lUSF9BVkFJTEFCSUxJVFlfQklULCBWS19RVUVSWV9SRVNVTFRfUEFSVElBTF9CSVQgb3IgVktfUVVFUllfUkVTVUxUXzY0X0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzMykifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDMyMzQiLCAiSWYgdGhlIHF1ZXJ5VHlwZSB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSLCB0aGUgcXVlcnlQb29sIG11c3QgaGF2ZSBiZWVuIHN1Ym1pdHRlZCBvbmNlIGZvciBlYWNoIHBhc3MgYXMgcmV0cmlldmVkIHZpYSBhIGNhbGwgdG8gdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzNCkifSwKKyAgICB7IlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERlYnVnTWFya2VyQmVnaW5FWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZERlYnVnTWFya2VyQmVnaW5FWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERlYnVnTWFya2VyQmVnaW5FWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERlYnVnTWFya2VyQmVnaW5FWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1wTWFya2VySW5mby1wYXJhbWV0ZXIiLCAicE1hcmtlckluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhULXBNYXJrZXJJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLTAxMjM5IiwgIlRoZXJlIG11c3QgYmUgYW4gb3V0c3RhbmRpbmcgdmtDbWREZWJ1Z01hcmtlckJlZ2luRVhUIGNvbW1hbmQgcHJpb3IgdG8gdGhlIHZrQ21kRGVidWdNYXJrZXJFbmRFWFQgb24gdGhlIHF1ZXVlIHRoYXQgY29tbWFuZEJ1ZmZlciBpcyBzdWJtaXR0ZWQgdG8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLTAxMjM5KSJ9LAorICAgIHsiVlVJRC12a0NtZERlYnVnTWFya2VyRW5kRVhULWNvbW1hbmRCdWZmZXItMDEyNDAiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciwgdGhlcmUgbXVzdCBiZSBhbiBvdXRzdGFuZGluZyB2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQgY29tbWFuZCByZWNvcmRlZCB0byBjb21tYW5kQnVmZmVyIHRoYXQgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gZW5kZWQgYnkgYSBjYWxsIHRvIHZrQ21kRGVidWdNYXJrZXJFbmRFWFQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGVidWdNYXJrZXJFbmRFWFQtY29tbWFuZEJ1ZmZlci0wMTI0MCkifSwKKyAgICB7IlZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERlYnVnTWFya2VyRW5kRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGVidWdNYXJrZXJFbmRFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRGVidWdNYXJrZXJFbmRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREZWJ1Z01hcmtlckVuZEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERlYnVnTWFya2VySW5zZXJ0RVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRGVidWdNYXJrZXJJbnNlcnRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVC1wTWFya2VySW5mby1wYXJhbWV0ZXIiLCAicE1hcmtlckluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0RlYnVnTWFya2VyTWFya2VySW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREZWJ1Z01hcmtlckluc2VydEVYVC1wTWFya2VySW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5MCIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfTElORUFSIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI2OTApIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5MSIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5MSkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNjkyIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5MikifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNjkzIiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBub3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBvZiBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI2OTMpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5NyIsICJGb3IgZWFjaCBzZXQgbiB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCBtdXN0IGhhdmUgYmVlbiBib3VuZCB0byBuIGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3Igc2V0IG4sIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5NykifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNjk4IiwgIkZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSBtdXN0IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5OCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNjk5IiwgIkRlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMsIG11c3QgYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjY5OSkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNzAwIiwgIkEgdmFsaWQgcGlwZWxpbmUgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI3MDApIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjcwMiIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSBWa0ltYWdlIHdpdGggYSBWa0ltYWdlVmlldyBvZiB0aGUgdHlwZSBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI3MDIpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjcwMyIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgT3BJbWFnZVNhbXBsZSogb3IgT3BJbWFnZVNwYXJzZVNhbXBsZSogaW5zdHJ1Y3Rpb25zIHdpdGggSW1wbGljaXRMb2QsIERyZWYgb3IgUHJvaiBpbiB0aGVpciBuYW1lLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjcwMykifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNzA0IiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjcwNCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNzA1IiwgIklmIHRoZSByb2J1c3QgYnVmZmVyIGFjY2VzcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IG11c3Qgbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaC1Ob25lLTAyNzA1KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI3MDYiLCAiSWYgdGhlIHJvYnVzdCBidWZmZXIgYWNjZXNzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgbXVzdCBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI3MDYpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci0wMjcwMSIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci0wMjcwMSkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLTAyNzA3IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLTAyNzA3KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoLWNvbW1hbmRCdWZmZXItMDI3MTIiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIHdyaXR0ZW4gdG8gYnkgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIGFuIHVucHJvdGVjdGVkIHJlc291cmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci0wMjcxMikifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLTAyNzEzIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHBpcGVsaW5lIHN0YWdlcyBvdGhlciB0aGFuIHRoZSBmcmFtZWJ1ZmZlci1zcGFjZSBhbmQgY29tcHV0ZSBzdGFnZXMgaW4gdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IG11c3Qgbm90IHdyaXRlIHRvIGFueSByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLWNvbW1hbmRCdWZmZXItMDI3MTMpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2gtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1maWx0ZXJDdWJpYy0wMjY5NCIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaC1maWx0ZXJDdWJpYy0wMjY5NCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaC1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQgb3IgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpmaWx0ZXJDdWJpY01pbm1heCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLWZpbHRlckN1YmljTWlubWF4LTAyNjk1KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoLWZsYWdzLTAyNjk2IiwgIkFueSBWa0ltYWdlIGNyZWF0ZWQgd2l0aCBhIFZrSW1hZ2VDcmVhdGVJbmZvOjpmbGFncyBjb250YWluaW5nIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYgc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIHNhbXBsZWQgdXNpbmcgYSBWa1NhbXBsZXJBZGRyZXNzTW9kZSBvZiBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLWZsYWdzLTAyNjk2KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRYLTAwMzg2IiwgImdyb3VwQ291bnRYIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRYLTAwMzg2KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRZLTAwMzg3IiwgImdyb3VwQ291bnRZIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsxXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRZLTAwMzg3KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRaLTAwMzg4IiwgImdyb3VwQ291bnRaIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsyXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRaLTAwMzg4KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2gtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjY5MCIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfTElORUFSIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjkwKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjkxIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjY5MSkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjY5MiIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjkyKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjkzIiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBub3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBvZiBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjkzKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjk3IiwgIkZvciBlYWNoIHNldCBuIHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IG11c3QgaGF2ZSBiZWVuIGJvdW5kIHRvIG4gYXQgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIFZrUGlwZWxpbmVMYXlvdXQgdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgbiwgd2l0aCB0aGUgVmtQaXBlbGluZUxheW91dCB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCBWa1BpcGVsaW5lLCBhcyBkZXNjcmliZWQgaW4gUGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjY5NykifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjY5OCIsICJGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgVmtQaXBlbGluZUxheW91dCB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSBWa1BpcGVsaW5lTGF5b3V0IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IFZrUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBpbiBQaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjk4KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNjk5IiwgIkRlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMsIG11c3QgYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI2OTkpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI3MDAiLCAiQSB2YWxpZCBwaXBlbGluZSBtdXN0IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI3MDApIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI3MDIiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgVmtJbWFnZSB3aXRoIGEgVmtJbWFnZVZpZXcgb2YgdGhlIHR5cGUgVktfSU1BR0VfVklFV19UWVBFXzNELCBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRSwgVktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZLCBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkgb3IgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVksIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjcwMikifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjcwMyIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgT3BJbWFnZVNhbXBsZSogb3IgT3BJbWFnZVNwYXJzZVNhbXBsZSogaW5zdHJ1Y3Rpb25zIHdpdGggSW1wbGljaXRMb2QsIERyZWYgb3IgUHJvaiBpbiB0aGVpciBuYW1lLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI3MDMpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI3MDQiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIE9wSW1hZ2VTYW1wbGUqIG9yIE9wSW1hZ2VTcGFyc2VTYW1wbGUqIGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjcwNCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtTm9uZS0wMjcwNSIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI3MDUpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLU5vbmUtMDI3MDYiLCAiSWYgdGhlIHJvYnVzdCBidWZmZXIgYWNjZXNzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgbXVzdCBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1Ob25lLTAyNzA2KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1iYXNlR3JvdXBYLTAwNDIxIiwgImJhc2VHcm91cFggbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzBdIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWJhc2VHcm91cFgtMDA0MjEpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWJhc2VHcm91cFgtMDA0MjIiLCAiYmFzZUdyb3VwWCBtdXN0IGJlIGxlc3MgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtYmFzZUdyb3VwWC0wMDQyMikifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtYmFzZUdyb3VwWC0wMDQyNyIsICJJZiBhbnkgb2YgYmFzZUdyb3VwWCwgYmFzZUdyb3VwWSwgb3IgYmFzZUdyb3VwWiBhcmUgbm90IHplcm8sIHRoZW4gdGhlIGJvdW5kIGNvbXB1dGUgcGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19QSVBFTElORV9DUkVBVEVfRElTUEFUQ0hfQkFTRSBmbGFnLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1iYXNlR3JvdXBYLTAwNDI3KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1iYXNlR3JvdXBaLTAwNDIzIiwgImJhc2VHcm91cFogbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWJhc2VHcm91cFotMDA0MjMpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItMDI3MDEiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1jb21tYW5kQnVmZmVyLTAyNzAxKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1jb21tYW5kQnVmZmVyLTAyNzA3IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtY29tbWFuZEJ1ZmZlci0wMjcwNykifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1maWx0ZXJDdWJpYy0wMjY5NCIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtZmlsdGVyQ3ViaWMtMDI2OTQpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCB3aXRoIGEgcmVkdWN0aW9uIG1vZGUgb2YgZWl0aGVyIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVCBvciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nIHRvZ2V0aGVyIHdpdGggbWlubWF4IGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljTWlubWF4IHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWZpbHRlckN1YmljTWlubWF4LTAyNjk1KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1mbGFncy0wMjY5NiIsICJBbnkgVmtJbWFnZSBjcmVhdGVkIHdpdGggYSBWa0ltYWdlQ3JlYXRlSW5mbzo6ZmxhZ3MgY29udGFpbmluZyBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WIHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgVmtTYW1wbGVyQWRkcmVzc01vZGUgb2YgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtZmxhZ3MtMDI2OTYpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWdyb3VwQ291bnRYLTAwNDI0IiwgImdyb3VwQ291bnRYIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSBtaW51cyBiYXNlR3JvdXBYIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWdyb3VwQ291bnRYLTAwNDI0KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1ncm91cENvdW50WS0wMDQyNSIsICJncm91cENvdW50WSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0gbWludXMgYmFzZUdyb3VwWSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoQmFzZS1ncm91cENvdW50WS0wMDQyNSkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtZ3JvdXBDb3VudFotMDA0MjYiLCAiZ3JvdXBDb3VudFogbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdIG1pbnVzIGJhc2VHcm91cFogKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEJhc2UtZ3JvdXBDb3VudFotMDA0MjYpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNjkwIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9MSU5FQVIgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNjkwKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5MSIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNjkxKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5MiIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5MikifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI2OTMiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG5vdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIG9mIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNjkzKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5NyIsICJGb3IgZWFjaCBzZXQgbiB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCBtdXN0IGhhdmUgYmVlbiBib3VuZCB0byBuIGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3Igc2V0IG4sIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNjk3KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5OCIsICJGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgVmtQaXBlbGluZUxheW91dCB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSBWa1BpcGVsaW5lTGF5b3V0IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IFZrUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBpbiBQaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjY5OCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI2OTkiLCAiRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cywgbXVzdCBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI2OTkpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNzAwIiwgIkEgdmFsaWQgcGlwZWxpbmUgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjcwMCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI3MDIiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgVmtJbWFnZSB3aXRoIGEgVmtJbWFnZVZpZXcgb2YgdGhlIHR5cGUgVktfSU1BR0VfVklFV19UWVBFXzNELCBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRSwgVktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZLCBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkgb3IgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVksIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI3MDIpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNzAzIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgd2l0aCBJbXBsaWNpdExvZCwgRHJlZiBvciBQcm9qIGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI3MDMpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNzA0IiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNzA0KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjcwNSIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNzA1KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtTm9uZS0wMjcwNiIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1Ob25lLTAyNzA2KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtYnVmZmVyLTAyNzA4IiwgIklmIGJ1ZmZlciBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1idWZmZXItMDI3MDgpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1idWZmZXItMDI3MDkiLCAiYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtYnVmZmVyLTAyNzA5KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MDEiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcwMSkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MDciLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcwNykifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MTEiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcxMSkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgYnVmZmVyLCBhbmQgY29tbWFuZEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1maWx0ZXJDdWJpYy0wMjY5NCIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWZpbHRlckN1YmljLTAyNjk0KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUIG9yIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWNNaW5tYXggcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWZpbHRlckN1YmljTWlubWF4LTAyNjk1KSJ9LAorICAgIHsiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3QtZmxhZ3MtMDI2OTYiLCAiQW55IFZrSW1hZ2UgY3JlYXRlZCB3aXRoIGEgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIGNvbnRhaW5pbmcgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIFZrU2FtcGxlckFkZHJlc3NNb2RlIG9mIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1mbGFncy0wMjY5NikifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LW9mZnNldC0wMDQwNyIsICJUaGUgc3VtIG9mIG9mZnNldCBhbmQgdGhlIHNpemUgb2YgVmtEaXNwYXRjaEluZGlyZWN0Q29tbWFuZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LW9mZnNldC0wMDQwNykifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LW9mZnNldC0wMjcxMCIsICJvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LW9mZnNldC0wMjcxMCkifSwKKyAgICB7IlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRGlzcGF0Y2hJbmRpcmVjdC1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctTm9uZS0wMjY4NiIsICJFdmVyeSBpbnB1dCBhdHRhY2htZW50IHVzZWQgYnkgdGhlIGN1cnJlbnQgc3VicGFzcyBtdXN0IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSB2aWEgYSBkZXNjcmlwdG9yIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctTm9uZS0wMjY4NikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LU5vbmUtMDI2ODciLCAiSW1hZ2Ugc3VicmVzb3VyY2VzIHVzZWQgYXMgYXR0YWNobWVudHMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctTm9uZS0wMjY4NykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LU5vbmUtMDI2OTAiLCAiSWYgYSBWa0ltYWdlVmlldyBpcyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0xJTkVBUiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcncyBmb3JtYXQgZmVhdHVyZXMgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0xJTkVBUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LU5vbmUtMDI2OTApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjkxIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LU5vbmUtMDI2OTEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjkyIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjkyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctTm9uZS0wMjY5MyIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3Qgbm90IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgb2YgVktfSU1BR0VfVklFV19UWVBFXzNELCBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRSwgb3IgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LU5vbmUtMDI2OTMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjk3IiwgIkZvciBlYWNoIHNldCBuIHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IG11c3QgaGF2ZSBiZWVuIGJvdW5kIHRvIG4gYXQgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIFZrUGlwZWxpbmVMYXlvdXQgdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgbiwgd2l0aCB0aGUgVmtQaXBlbGluZUxheW91dCB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCBWa1BpcGVsaW5lLCBhcyBkZXNjcmliZWQgaW4gUGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LU5vbmUtMDI2OTcpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjk4IiwgIkZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSBtdXN0IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhdy1Ob25lLTAyNjk4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctTm9uZS0wMjY5OSIsICJEZXNjcmlwdG9ycyBpbiBlYWNoIGJvdW5kIGRlc2NyaXB0b3Igc2V0LCBzcGVjaWZpZWQgdmlhIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzLCBtdXN0IGJlIHZhbGlkIGlmIHRoZXkgYXJlIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctTm9uZS0wMjY5OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDAiLCAiQSB2YWxpZCBwaXBlbGluZSBtdXN0IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhdy1Ob25lLTAyNzAwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctTm9uZS0wMjcwMiIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSBWa0ltYWdlIHdpdGggYSBWa0ltYWdlVmlldyBvZiB0aGUgdHlwZSBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctTm9uZS0wMjcwMikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDMiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIE9wSW1hZ2VTYW1wbGUqIG9yIE9wSW1hZ2VTcGFyc2VTYW1wbGUqIGluc3RydWN0aW9ucyB3aXRoIEltcGxpY2l0TG9kLCBEcmVmIG9yIFByb2ogaW4gdGhlaXIgbmFtZSwgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctTm9uZS0wMjcwMykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDQiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIE9wSW1hZ2VTYW1wbGUqIG9yIE9wSW1hZ2VTcGFyc2VTYW1wbGUqIGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNzA1IiwgIklmIHRoZSByb2J1c3QgYnVmZmVyIGFjY2VzcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IG11c3Qgbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDUpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNzA2IiwgIklmIHRoZSByb2J1c3QgYnVmZmVyIGFjY2VzcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgc3RvcmFnZSBidWZmZXIsIGl0IG11c3Qgbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MDYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNzIwIiwgIkFsbCB2ZXJ0ZXggaW5wdXQgYmluZGluZ3MgYWNjZXNzZWQgdmlhIHZlcnRleCBpbnB1dCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHZlcnRleCBzaGFkZXIgZW50cnkgcG9pbnQncyBpbnRlcmZhY2UgbXVzdCBoYXZlIHZhbGlkIGJ1ZmZlcnMgYm91bmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LU5vbmUtMDI3MjApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1Ob25lLTAyNzIxIiwgIkZvciBhIGdpdmVuIHZlcnRleCBidWZmZXIgYmluZGluZywgYW55IGF0dHJpYnV0ZSBkYXRhIGZldGNoZWQgbXVzdCBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBidWZmZXIgYmluZGluZywgYXMgZGVzY3JpYmVkIGluIFZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctTm9uZS0wMjcyMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItMDI3MDEiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci0wMjcwMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItMDI3MDciLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci0wMjcwNykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItMDI3MTIiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIHdyaXR0ZW4gdG8gYnkgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIGFuIHVucHJvdGVjdGVkIHJlc291cmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhdy1jb21tYW5kQnVmZmVyLTAyNzEyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci0wMjcxMyIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBwaXBlbGluZSBzdGFnZXMgb3RoZXIgdGhhbiB0aGUgZnJhbWVidWZmZXItc3BhY2UgYW5kIGNvbXB1dGUgc3RhZ2VzIGluIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCBtdXN0IG5vdCB3cml0ZSB0byBhbnkgcmVzb3VyY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItMDI3MTMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXctY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1maWx0ZXJDdWJpYy0wMjY5NCIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LWZpbHRlckN1YmljLTAyNjk0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUIG9yIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWNNaW5tYXggcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LWZpbHRlckN1YmljTWlubWF4LTAyNjk1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctZmxhZ3MtMDI2OTYiLCAiQW55IFZrSW1hZ2UgY3JlYXRlZCB3aXRoIGEgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIGNvbnRhaW5pbmcgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIFZrU2FtcGxlckFkZHJlc3NNb2RlIG9mIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhdy1mbGFncy0wMjY5NikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgiLCAiSWYgdGhlIGRyYXcgaXMgcmVjb3JkZWQgaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSB3aXRoIG11bHRpdmlldyBlbmFibGVkLCB0aGUgbWF4aW11bSBpbnN0YW5jZSBpbmRleCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczo6bWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1yZW5kZXJQYXNzLTAyNjg0IiwgIlRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiB0aGUgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LXJlbmRlclBhc3MtMDI2ODQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhdy1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhdy1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXctc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwgIklmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhbXBsZUxvY2F0aW9uc0VuYWJsZSBzZXQgdG8gVktfVFJVRSBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3LXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3LXN1YnBhc3MtMDI2ODUiLCAiVGhlIHN1YnBhc3MgaW5kZXggb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBiZSBlcXVhbCB0byB0aGUgc3VicGFzcyBtZW1iZXIgb2YgdGhlIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhdy1zdWJwYXNzLTAyNjg1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2ODYiLCAiRXZlcnkgaW5wdXQgYXR0YWNobWVudCB1c2VkIGJ5IHRoZSBjdXJyZW50IHN1YnBhc3MgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgdmlhIGEgZGVzY3JpcHRvciBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNjg2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2ODciLCAiSW1hZ2Ugc3VicmVzb3VyY2VzIHVzZWQgYXMgYXR0YWNobWVudHMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2ODcpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5MCIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfTElORUFSIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2OTApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5MSIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5MSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNjkyIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5MikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNjkzIiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBub3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBvZiBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI2OTMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5NyIsICJGb3IgZWFjaCBzZXQgbiB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCBtdXN0IGhhdmUgYmVlbiBib3VuZCB0byBuIGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3Igc2V0IG4sIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5NykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNjk4IiwgIkZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSBtdXN0IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNjk5IiwgIkRlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMsIG11c3QgYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjY5OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzAwIiwgIkEgdmFsaWQgcGlwZWxpbmUgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI3MDApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjcwMiIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSBWa0ltYWdlIHdpdGggYSBWa0ltYWdlVmlldyBvZiB0aGUgdHlwZSBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI3MDIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjcwMyIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgT3BJbWFnZVNhbXBsZSogb3IgT3BJbWFnZVNwYXJzZVNhbXBsZSogaW5zdHJ1Y3Rpb25zIHdpdGggSW1wbGljaXRMb2QsIERyZWYgb3IgUHJvaiBpbiB0aGVpciBuYW1lLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjcwMykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzA0IiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjcwNCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzA1IiwgIklmIHRoZSByb2J1c3QgYnVmZmVyIGFjY2VzcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IG11c3Qgbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzA1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI3MDYiLCAiSWYgdGhlIHJvYnVzdCBidWZmZXIgYWNjZXNzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgbXVzdCBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI3MDYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjcyMCIsICJBbGwgdmVydGV4IGlucHV0IGJpbmRpbmdzIGFjY2Vzc2VkIHZpYSB2ZXJ0ZXggaW5wdXQgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIGVudHJ5IHBvaW50J3MgaW50ZXJmYWNlIG11c3QgaGF2ZSB2YWxpZCBidWZmZXJzIGJvdW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtTm9uZS0wMjcyMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzIxIiwgIkZvciBhIGdpdmVuIHZlcnRleCBidWZmZXIgYmluZGluZywgYW55IGF0dHJpYnV0ZSBkYXRhIGZldGNoZWQgbXVzdCBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBidWZmZXIgYmluZGluZywgYXMgZGVzY3JpYmVkIGluIFZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLU5vbmUtMDI3MjEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci0wMjcwMSIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci0wMjcwMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLTAyNzA3IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLTAyNzA3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkLWNvbW1hbmRCdWZmZXItMDI3MTIiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIHdyaXR0ZW4gdG8gYnkgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIGFuIHVucHJvdGVjdGVkIHJlc291cmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci0wMjcxMikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLTAyNzEzIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHBpcGVsaW5lIHN0YWdlcyBvdGhlciB0aGFuIHRoZSBmcmFtZWJ1ZmZlci1zcGFjZSBhbmQgY29tcHV0ZSBzdGFnZXMgaW4gdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IG11c3Qgbm90IHdyaXRlIHRvIGFueSByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLWNvbW1hbmRCdWZmZXItMDI3MTMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtZmlsdGVyQ3ViaWMtMDI2OTQiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtZmlsdGVyQ3ViaWMtMDI2OTQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWQtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUIG9yIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWNNaW5tYXggcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZC1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1mbGFncy0wMjY5NiIsICJBbnkgVmtJbWFnZSBjcmVhdGVkIHdpdGggYSBWa0ltYWdlQ3JlYXRlSW5mbzo6ZmxhZ3MgY29udGFpbmluZyBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WIHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgVmtTYW1wbGVyQWRkcmVzc01vZGUgb2YgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZC1mbGFncy0wMjY5NikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1pbmRleFNpemUtMDA0NjMiLCAiKGluZGV4U2l6ZSAqIChmaXJzdEluZGV4ICsgaW5kZXhDb3VudCkgKyBvZmZzZXQpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBib3VuZCBpbmRleCBidWZmZXIsIHdpdGggaW5kZXhTaXplIGJlaW5nIGJhc2VkIG9uIHRoZSB0eXBlIHNwZWNpZmllZCBieSBpbmRleFR5cGUsIHdoZXJlIHRoZSBpbmRleCBidWZmZXIsIGluZGV4VHlwZSwgYW5kIG9mZnNldCBhcmUgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmRJbmRleEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkLWluZGV4U2l6ZS0wMDQ2MykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LTAyNjg4IiwgIklmIHRoZSBkcmF3IGlzIHJlY29yZGVkIGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2Ugd2l0aCBtdWx0aXZpZXcgZW5hYmxlZCwgdGhlIG1heGltdW0gaW5zdGFuY2UgaW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM6Om1heE11bHRpdmlld0luc3RhbmNlSW5kZXguIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZC1yZW5kZXJQYXNzLTAyNjg0IiwgIlRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiB0aGUgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZC1yZW5kZXJQYXNzLTAyNjg0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZC1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsICJJZiB0aGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aCBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOjpzYW1wbGVMb2NhdGlvbnNFbmFibGUgc2V0IHRvIFZLX1RSVUUgYW5kIHRoZSBjdXJyZW50IHN1YnBhc3MgaGFzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50LCB0aGVuIHRoYXQgYXR0YWNobWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVCBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkLXN1YnBhc3MtMDI2ODUiLCAiVGhlIHN1YnBhc3MgaW5kZXggb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBiZSBlcXVhbCB0byB0aGUgc3VicGFzcyBtZW1iZXIgb2YgdGhlIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWQtc3VicGFzcy0wMjY4NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI2ODYiLCAiRXZlcnkgaW5wdXQgYXR0YWNobWVudCB1c2VkIGJ5IHRoZSBjdXJyZW50IHN1YnBhc3MgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgdmlhIGEgZGVzY3JpcHRvciBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI2ODYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjg3IiwgIkltYWdlIHN1YnJlc291cmNlcyB1c2VkIGFzIGF0dGFjaG1lbnRzIGluIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3Qgbm90IGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgb3RoZXIgdGhhbiBhcyBhbiBhdHRhY2htZW50IGJ5IHRoaXMgY29tbWFuZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI2ODcpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjkwIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9MSU5FQVIgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjkwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5MSIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjkxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5MiIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5MikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI2OTMiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG5vdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIG9mIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjkzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5NyIsICJGb3IgZWFjaCBzZXQgbiB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCBtdXN0IGhhdmUgYmVlbiBib3VuZCB0byBuIGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3Igc2V0IG4sIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNjk3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5OCIsICJGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgVmtQaXBlbGluZUxheW91dCB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSBWa1BpcGVsaW5lTGF5b3V0IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IFZrUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBpbiBQaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjY5OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI2OTkiLCAiRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cywgbXVzdCBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI2OTkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzAwIiwgIkEgdmFsaWQgcGlwZWxpbmUgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjcwMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI3MDIiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgVmtJbWFnZSB3aXRoIGEgVmtJbWFnZVZpZXcgb2YgdGhlIHR5cGUgVktfSU1BR0VfVklFV19UWVBFXzNELCBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRSwgVktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZLCBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkgb3IgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVksIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI3MDIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzAzIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgd2l0aCBJbXBsaWNpdExvZCwgRHJlZiBvciBQcm9qIGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI3MDMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzA0IiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzA0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjcwNSIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzA1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjcwNiIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzA2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjcyMCIsICJBbGwgdmVydGV4IGlucHV0IGJpbmRpbmdzIGFjY2Vzc2VkIHZpYSB2ZXJ0ZXggaW5wdXQgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIGVudHJ5IHBvaW50J3MgaW50ZXJmYWNlIG11c3QgaGF2ZSB2YWxpZCBidWZmZXJzIGJvdW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1Ob25lLTAyNzIwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtTm9uZS0wMjcyMSIsICJGb3IgYSBnaXZlbiB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFueSBhdHRyaWJ1dGUgZGF0YSBmZXRjaGVkIG11c3QgYmUgZW50aXJlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFzIGRlc2NyaWJlZCBpbiBWZXJ0ZXggSW5wdXQgRGVzY3JpcHRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI3MjEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1idWZmZXItMDI3MDgiLCAiSWYgYnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWJ1ZmZlci0wMjcwOCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWJ1ZmZlci0wMjcwOSIsICJidWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1idWZmZXItMDI3MDkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1idWZmZXItcGFyYW1ldGVyIiwgImJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1idWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcwMSIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1jb21tYW5kQnVmZmVyLTAyNzAxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcwNyIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBhbnkgcmVzb3VyY2UgYWNjZXNzZWQgYnkgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1jb21tYW5kQnVmZmVyLTAyNzA3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcxMSIsICJjb21tYW5kQnVmZmVyIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1jb21tYW5kQnVmZmVyLTAyNzExKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgYnVmZmVyLCBhbmQgY29tbWFuZEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1kcmF3Q291bnQtMDA1MjgiLCAiSWYgZHJhd0NvdW50IGlzIGdyZWF0ZXIgdGhhbiAxLCBzdHJpZGUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgYW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHNpemVvZihWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kKSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAwNTI4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAwNTM5IiwgIklmIGRyYXdDb3VudCBpcyBlcXVhbCB0byAxLCAob2Zmc2V0ICsgc2l6ZW9mKFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQpKSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWRyYXdDb3VudC0wMDUzOSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWRyYXdDb3VudC0wMDU0MCIsICJJZiBkcmF3Q291bnQgaXMgZ3JlYXRlciB0aGFuIDEsIChzdHJpZGUge3RpbWVzfSAoZHJhd0NvdW50IC0gMSkgKyBvZmZzZXQgKyBzaXplb2YoVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCkpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAwNTQwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAyNzE4IiwgIklmIHRoZSBtdWx0aS1kcmF3IGluZGlyZWN0IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGRyYXdDb3VudCBtdXN0IGJlIDAgb3IgMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAyNzE4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAyNzE5IiwgImRyYXdDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhEcmF3SW5kaXJlY3RDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZHJhd0NvdW50LTAyNzE5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZmlsdGVyQ3ViaWMtMDI2OTQiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1maWx0ZXJDdWJpYy0wMjY5NCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCB3aXRoIGEgcmVkdWN0aW9uIG1vZGUgb2YgZWl0aGVyIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVCBvciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nIHRvZ2V0aGVyIHdpdGggbWlubWF4IGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljTWlubWF4IHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWZpcnN0SW5zdGFuY2UtMDA1MzAiLCAiSWYgdGhlIGRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2UgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYWxsIHRoZSBmaXJzdEluc3RhbmNlIG1lbWJlcnMgb2YgdGhlIFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQgc3RydWN0dXJlcyBhY2Nlc3NlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1maXJzdEluc3RhbmNlLTAwNTMwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3QtZmxhZ3MtMDI2OTYiLCAiQW55IFZrSW1hZ2UgY3JlYXRlZCB3aXRoIGEgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIGNvbnRhaW5pbmcgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIFZrU2FtcGxlckFkZHJlc3NNb2RlIG9mIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1mbGFncy0wMjY5NikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgiLCAiSWYgdGhlIGRyYXcgaXMgcmVjb3JkZWQgaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSB3aXRoIG11bHRpdmlldyBlbmFibGVkLCB0aGUgbWF4aW11bSBpbnN0YW5jZSBpbmRleCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczo6bWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1vZmZzZXQtMDI3MTAiLCAib2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1vZmZzZXQtMDI3MTApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1yZW5kZXJQYXNzLTAyNjg0IiwgIlRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiB0aGUgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LXJlbmRlclBhc3MtMDI2ODQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3Qtc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwgIklmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhbXBsZUxvY2F0aW9uc0VuYWJsZSBzZXQgdG8gVktfVFJVRSBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LXN1YnBhc3MtMDI2ODUiLCAiVGhlIHN1YnBhc3MgaW5kZXggb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBiZSBlcXVhbCB0byB0aGUgc3VicGFzcyBtZW1iZXIgb2YgdGhlIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1zdWJwYXNzLTAyNjg1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjg2IiwgIkV2ZXJ5IGlucHV0IGF0dGFjaG1lbnQgdXNlZCBieSB0aGUgY3VycmVudCBzdWJwYXNzIG11c3QgYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIHZpYSBhIGRlc2NyaXB0b3Igc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2ODYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2ODciLCAiSW1hZ2Ugc3VicmVzb3VyY2VzIHVzZWQgYXMgYXR0YWNobWVudHMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjg3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjkwIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9MSU5FQVIgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTEiLCAiSWYgYSBWa0ltYWdlVmlldyBpcyBhY2Nlc3NlZCB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcncyBmb3JtYXQgZmVhdHVyZXMgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjkxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjkyIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTMiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG5vdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIG9mIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTciLCAiRm9yIGVhY2ggc2V0IG4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgZGVzY3JpcHRvciBzZXQgbXVzdCBoYXZlIGJlZW4gYm91bmQgdG8gbiBhdCB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgVmtQaXBlbGluZUxheW91dCB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCBuLCB3aXRoIHRoZSBWa1BpcGVsaW5lTGF5b3V0IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IFZrUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBpbiBQaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk4IiwgIkZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSBtdXN0IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTkiLCAiRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cywgbXVzdCBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMCIsICJBIHZhbGlkIHBpcGVsaW5lIG11c3QgYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMiIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSBWa0ltYWdlIHdpdGggYSBWa0ltYWdlVmlldyBvZiB0aGUgdHlwZSBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzAyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzAzIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgd2l0aCBJbXBsaWNpdExvZCwgRHJlZiBvciBQcm9qIGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwNCIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgT3BJbWFnZVNhbXBsZSogb3IgT3BJbWFnZVNwYXJzZVNhbXBsZSogaW5zdHJ1Y3Rpb25zIHRoYXQgaW5jbHVkZXMgYSBMT0QgYmlhcyBvciBhbnkgb2Zmc2V0IHZhbHVlcywgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzA0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzA1IiwgIklmIHRoZSByb2J1c3QgYnVmZmVyIGFjY2VzcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IG11c3Qgbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwNSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwNiIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MjAiLCAiQWxsIHZlcnRleCBpbnB1dCBiaW5kaW5ncyBhY2Nlc3NlZCB2aWEgdmVydGV4IGlucHV0IHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgdmVydGV4IHNoYWRlciBlbnRyeSBwb2ludCdzIGludGVyZmFjZSBtdXN0IGhhdmUgdmFsaWQgYnVmZmVycyBib3VuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzIwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzIxIiwgIkZvciBhIGdpdmVuIHZlcnRleCBidWZmZXIgYmluZGluZywgYW55IGF0dHJpYnV0ZSBkYXRhIGZldGNoZWQgbXVzdCBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBidWZmZXIgYmluZGluZywgYXMgZGVzY3JpYmVkIGluIFZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzIxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1idWZmZXItMDI3MDgiLCAiSWYgYnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1idWZmZXItMDI3MDkiLCAiYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1idWZmZXItMDI3MDkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWJ1ZmZlci1wYXJhbWV0ZXIiLCAiYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci0wMjcwMSIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItMDI3MDEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItMDI3MDciLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzA3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzExIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci0wMjcxMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY29tbW9ucGFyZW50IiwgIkVhY2ggb2YgYnVmZmVyLCBjb21tYW5kQnVmZmVyLCBhbmQgY291bnRCdWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE0IiwgIklmIGNvdW50QnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE1IiwgImNvdW50QnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMjcxNSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTciLCAiVGhlIGNvdW50IHN0b3JlZCBpbiBjb3VudEJ1ZmZlciBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhEcmF3SW5kaXJlY3RDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMjcxNykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDMxNTMiLCAiSWYgY291bnQgc3RvcmVkIGluIGNvdW50QnVmZmVyIGlzIGVxdWFsIHRvIDEsIChvZmZzZXQgKyBzaXplb2YoVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCkpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMzE1MykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDMxNTQiLCAiSWYgY291bnQgc3RvcmVkIGluIGNvdW50QnVmZmVyIGlzIGdyZWF0ZXIgdGhhbiAxLCAoc3RyaWRlIHt0aW1lc30gKGRyYXdDb3VudCAtIDEpICsgb2Zmc2V0ICsgc2l6ZW9mKFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQpKSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDMxNTQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLXBhcmFtZXRlciIsICJjb3VudEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXJPZmZzZXQtMDI3MTYiLCAiY291bnRCdWZmZXJPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXJPZmZzZXQtMDI3MTYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWZpbHRlckN1YmljLTAyNjk0IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpmaWx0ZXJDdWJpYyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1maWx0ZXJDdWJpYy0wMjY5NCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUIG9yIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWNNaW5tYXggcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWZsYWdzLTAyNjk2IiwgIkFueSBWa0ltYWdlIGNyZWF0ZWQgd2l0aCBhIFZrSW1hZ2VDcmVhdGVJbmZvOjpmbGFncyBjb250YWluaW5nIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYgc2FtcGxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIHNhbXBsZWQgdXNpbmcgYSBWa1NhbXBsZXJBZGRyZXNzTW9kZSBvZiBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1mbGFncy0wMjY5NikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItbWF4RHJhd0NvdW50LTAzMTQzIiwgIklmIG1heERyYXdDb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSwgKHN0cmlkZSB7dGltZXN9IChtYXhEcmF3Q291bnQgLSAxKSArIG9mZnNldCArIHNpemVvZihWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kKSkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLW1heERyYXdDb3VudC0wMzE0MykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCIsICJJZiB0aGUgZHJhdyBpcyByZWNvcmRlZCBpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIHdpdGggbXVsdGl2aWV3IGVuYWJsZWQsIHRoZSBtYXhpbXVtIGluc3RhbmNlIGluZGV4IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzOjptYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LTAyNjg4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1vZmZzZXQtMDI3MTAiLCAib2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLW9mZnNldC0wMjcxMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItcmVuZGVyUGFzcy0wMjY4NCIsICJUaGUgY3VycmVudCByZW5kZXIgcGFzcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVuZGVyUGFzcyBtZW1iZXIgb2YgdGhlIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLXJlbmRlclBhc3MtMDI2ODQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwgIklmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhbXBsZUxvY2F0aW9uc0VuYWJsZSBzZXQgdG8gVktfVFJVRSBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1zdHJpZGUtMDMxNDIiLCAic3RyaWRlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGFuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBzaXplb2YoVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItc3RyaWRlLTAzMTQyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1zdWJwYXNzLTAyNjg1IiwgIlRoZSBzdWJwYXNzIGluZGV4IG9mIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3QgYmUgZXF1YWwgdG8gdGhlIHN1YnBhc3MgbWVtYmVyIG9mIHRoZSBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgVmtQaXBlbGluZSBib3VuZCB0byBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1zdWJwYXNzLTAyNjg1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjg2IiwgIkV2ZXJ5IGlucHV0IGF0dGFjaG1lbnQgdXNlZCBieSB0aGUgY3VycmVudCBzdWJwYXNzIG11c3QgYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIHZpYSBhIGRlc2NyaXB0b3Igc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2ODYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2ODciLCAiSW1hZ2Ugc3VicmVzb3VyY2VzIHVzZWQgYXMgYXR0YWNobWVudHMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjg3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjkwIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9MSU5FQVIgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTEiLCAiSWYgYSBWa0ltYWdlVmlldyBpcyBhY2Nlc3NlZCB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcncyBmb3JtYXQgZmVhdHVyZXMgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjkxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjkyIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTMiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG5vdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIG9mIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTciLCAiRm9yIGVhY2ggc2V0IG4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgZGVzY3JpcHRvciBzZXQgbXVzdCBoYXZlIGJlZW4gYm91bmQgdG8gbiBhdCB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgVmtQaXBlbGluZUxheW91dCB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCBuLCB3aXRoIHRoZSBWa1BpcGVsaW5lTGF5b3V0IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IFZrUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBpbiBQaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjk3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNjk4IiwgIkZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSBtdXN0IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI2OTkiLCAiRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cywgbXVzdCBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjY5OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwMCIsICJBIHZhbGlkIHBpcGVsaW5lIG11c3QgYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwMiIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSBWa0ltYWdlIHdpdGggYSBWa0ltYWdlVmlldyBvZiB0aGUgdHlwZSBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzAyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzAzIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgd2l0aCBJbXBsaWNpdExvZCwgRHJlZiBvciBQcm9qIGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwMykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwNCIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgT3BJbWFnZVNhbXBsZSogb3IgT3BJbWFnZVNwYXJzZVNhbXBsZSogaW5zdHJ1Y3Rpb25zIHRoYXQgaW5jbHVkZXMgYSBMT0QgYmlhcyBvciBhbnkgb2Zmc2V0IHZhbHVlcywgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzA0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzA1IiwgIklmIHRoZSByb2J1c3QgYnVmZmVyIGFjY2VzcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IG11c3Qgbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwNSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwNiIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI3MDYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LU5vbmUtMDI3MjAiLCAiQWxsIHZlcnRleCBpbnB1dCBiaW5kaW5ncyBhY2Nlc3NlZCB2aWEgdmVydGV4IGlucHV0IHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgdmVydGV4IHNoYWRlciBlbnRyeSBwb2ludCdzIGludGVyZmFjZSBtdXN0IGhhdmUgdmFsaWQgYnVmZmVycyBib3VuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzIwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzIxIiwgIkZvciBhIGdpdmVuIHZlcnRleCBidWZmZXIgYmluZGluZywgYW55IGF0dHJpYnV0ZSBkYXRhIGZldGNoZWQgbXVzdCBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBidWZmZXIgYmluZGluZywgYXMgZGVzY3JpYmVkIGluIFZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1Ob25lLTAyNzIxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1idWZmZXItMDI3MDgiLCAiSWYgYnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtYnVmZmVyLTAyNzA4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1idWZmZXItMDI3MDkiLCAiYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1idWZmZXItMDI3MDkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWJ1ZmZlci1wYXJhbWV0ZXIiLCAiYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcwMSIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MDEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1hbmRCdWZmZXItMDI3MDciLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1jb21tYW5kQnVmZmVyLTAyNzA3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1jb21tYW5kQnVmZmVyLTAyNzExIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbWFuZEJ1ZmZlci0wMjcxMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgYnVmZmVyLCBhbmQgY29tbWFuZEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZHJhd0NvdW50LTAwNDc2IiwgIklmIGRyYXdDb3VudCBpcyBncmVhdGVyIHRoYW4gMSwgc3RyaWRlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGFuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBzaXplb2YoVmtEcmF3SW5kaXJlY3RDb21tYW5kKSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1kcmF3Q291bnQtMDA0NzYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWRyYXdDb3VudC0wMDQ4NyIsICJJZiBkcmF3Q291bnQgaXMgZXF1YWwgdG8gMSwgKG9mZnNldCArIHNpemVvZihWa0RyYXdJbmRpcmVjdENvbW1hbmQpKSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZHJhd0NvdW50LTAwNDg3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1kcmF3Q291bnQtMDA0ODgiLCAiSWYgZHJhd0NvdW50IGlzIGdyZWF0ZXIgdGhhbiAxLCAoc3RyaWRlIHt0aW1lc30gKGRyYXdDb3VudCAtIDEpICsgb2Zmc2V0ICsgc2l6ZW9mKFZrRHJhd0luZGlyZWN0Q29tbWFuZCkpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1kcmF3Q291bnQtMDA0ODgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWRyYXdDb3VudC0wMjcxOCIsICJJZiB0aGUgbXVsdGktZHJhdyBpbmRpcmVjdCBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBkcmF3Q291bnQgbXVzdCBiZSAwIG9yIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZHJhd0NvdW50LTAyNzE4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1kcmF3Q291bnQtMDI3MTkiLCAiZHJhd0NvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heERyYXdJbmRpcmVjdENvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LWRyYXdDb3VudC0wMjcxOSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZmlsdGVyQ3ViaWMtMDI2OTQiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LWZpbHRlckN1YmljLTAyNjk0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQgb3IgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpmaWx0ZXJDdWJpY01pbm1heCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZmlyc3RJbnN0YW5jZS0wMDQ3OCIsICJJZiB0aGUgZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbGwgdGhlIGZpcnN0SW5zdGFuY2UgbWVtYmVycyBvZiB0aGUgVmtEcmF3SW5kaXJlY3RDb21tYW5kIHN0cnVjdHVyZXMgYWNjZXNzZWQgYnkgdGhpcyBjb21tYW5kIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1maXJzdEluc3RhbmNlLTAwNDc4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1mbGFncy0wMjY5NiIsICJBbnkgVmtJbWFnZSBjcmVhdGVkIHdpdGggYSBWa0ltYWdlQ3JlYXRlSW5mbzo6ZmxhZ3MgY29udGFpbmluZyBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WIHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgVmtTYW1wbGVyQWRkcmVzc01vZGUgb2YgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtZmxhZ3MtMDI2OTYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgiLCAiSWYgdGhlIGRyYXcgaXMgcmVjb3JkZWQgaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSB3aXRoIG11bHRpdmlldyBlbmFibGVkLCB0aGUgbWF4aW11bSBpbnN0YW5jZSBpbmRleCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczo6bWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3QtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3Qtb2Zmc2V0LTAyNzEwIiwgIm9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1vZmZzZXQtMDI3MTApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LXJlbmRlclBhc3MtMDI2ODQiLCAiVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHRoZSBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgVmtQaXBlbGluZSBib3VuZCB0byBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdC1yZW5kZXJQYXNzLTAyNjg0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0LXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsICJJZiB0aGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aCBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOjpzYW1wbGVMb2NhdGlvbnNFbmFibGUgc2V0IHRvIFZLX1RSVUUgYW5kIHRoZSBjdXJyZW50IHN1YnBhc3MgaGFzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50LCB0aGVuIHRoYXQgYXR0YWNobWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVCBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0LXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3Qtc3VicGFzcy0wMjY4NSIsICJUaGUgc3VicGFzcyBpbmRleCBvZiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzdWJwYXNzIG1lbWJlciBvZiB0aGUgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3Qtc3VicGFzcy0wMjY4NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY4NiIsICJFdmVyeSBpbnB1dCBhdHRhY2htZW50IHVzZWQgYnkgdGhlIGN1cnJlbnQgc3VicGFzcyBtdXN0IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSB2aWEgYSBkZXNjcmlwdG9yIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjg2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjg3IiwgIkltYWdlIHN1YnJlc291cmNlcyB1c2VkIGFzIGF0dGFjaG1lbnRzIGluIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3Qgbm90IGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgb3RoZXIgdGhhbiBhcyBhbiBhdHRhY2htZW50IGJ5IHRoaXMgY29tbWFuZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY4NykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY5MCIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfTElORUFSIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjkwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjkxIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY5MSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY5MiIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjkyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjkzIiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBub3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBvZiBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjkzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjk3IiwgIkZvciBlYWNoIHNldCBuIHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IG11c3QgaGF2ZSBiZWVuIGJvdW5kIHRvIG4gYXQgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIFZrUGlwZWxpbmVMYXlvdXQgdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgbiwgd2l0aCB0aGUgVmtQaXBlbGluZUxheW91dCB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCBWa1BpcGVsaW5lLCBhcyBkZXNjcmliZWQgaW4gUGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY5NykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjY5OCIsICJGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgVmtQaXBlbGluZUxheW91dCB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSBWa1BpcGVsaW5lTGF5b3V0IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IFZrUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBpbiBQaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjk4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNjk5IiwgIkRlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMsIG11c3QgYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI2OTkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDAiLCAiQSB2YWxpZCBwaXBlbGluZSBtdXN0IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDIiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgVmtJbWFnZSB3aXRoIGEgVmtJbWFnZVZpZXcgb2YgdGhlIHR5cGUgVktfSU1BR0VfVklFV19UWVBFXzNELCBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRSwgVktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZLCBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkgb3IgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVksIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjcwMikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjcwMyIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgT3BJbWFnZVNhbXBsZSogb3IgT3BJbWFnZVNwYXJzZVNhbXBsZSogaW5zdHJ1Y3Rpb25zIHdpdGggSW1wbGljaXRMb2QsIERyZWYgb3IgUHJvaiBpbiB0aGVpciBuYW1lLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDQiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIE9wSW1hZ2VTYW1wbGUqIG9yIE9wSW1hZ2VTcGFyc2VTYW1wbGUqIGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjcwNCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjcwNSIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDUpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULU5vbmUtMDI3MDYiLCAiSWYgdGhlIHJvYnVzdCBidWZmZXIgYWNjZXNzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgbXVzdCBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNzA2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1Ob25lLTAyNzIwIiwgIkFsbCB2ZXJ0ZXggaW5wdXQgYmluZGluZ3MgYWNjZXNzZWQgdmlhIHZlcnRleCBpbnB1dCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHZlcnRleCBzaGFkZXIgZW50cnkgcG9pbnQncyBpbnRlcmZhY2UgbXVzdCBoYXZlIHZhbGlkIGJ1ZmZlcnMgYm91bmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjcyMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjcyMSIsICJGb3IgYSBnaXZlbiB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFueSBhdHRyaWJ1dGUgZGF0YSBmZXRjaGVkIG11c3QgYmUgZW50aXJlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0ZXggYnVmZmVyIGJpbmRpbmcsIGFzIGRlc2NyaWJlZCBpbiBWZXJ0ZXggSW5wdXQgRGVzY3JpcHRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtTm9uZS0wMjcyMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbWFuZEJ1ZmZlci0wMjY0NiIsICJjb21tYW5kQnVmZmVyIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvbW1hbmRCdWZmZXItMDI2NDYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvbW1hbmRCdWZmZXItMDI3MDEiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tYW5kQnVmZmVyLTAyNzAxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tYW5kQnVmZmVyLTAyNzA3IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbWFuZEJ1ZmZlci0wMjcwNykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgY29tbWFuZEJ1ZmZlciwgYW5kIGNvdW50ZXJCdWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvdW50ZXJCdWZmZXItMDIyOTAiLCAiY291bnRlckJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY291bnRlckJ1ZmZlci0wMjI5MCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtY291bnRlckJ1ZmZlci1wYXJhbWV0ZXIiLCAiY291bnRlckJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWNvdW50ZXJCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1maWx0ZXJDdWJpYy0wMjY5NCIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWMgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtZmlsdGVyQ3ViaWMtMDI2OTQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCB3aXRoIGEgcmVkdWN0aW9uIG1vZGUgb2YgZWl0aGVyIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVCBvciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nIHRvZ2V0aGVyIHdpdGggbWlubWF4IGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljTWlubWF4IHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULWZpbHRlckN1YmljTWlubWF4LTAyNjk1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1mbGFncy0wMjY5NiIsICJBbnkgVmtJbWFnZSBjcmVhdGVkIHdpdGggYSBWa0ltYWdlQ3JlYXRlSW5mbzo6ZmxhZ3MgY29udGFpbmluZyBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WIHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgVmtTYW1wbGVyQWRkcmVzc01vZGUgb2YgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtZmxhZ3MtMDI2OTYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgiLCAiSWYgdGhlIGRyYXcgaXMgcmVjb3JkZWQgaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSB3aXRoIG11bHRpdmlldyBlbmFibGVkLCB0aGUgbWF4aW11bSBpbnN0YW5jZSBpbmRleCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTXVsdGl2aWV3UHJvcGVydGllczo6bWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtcmVuZGVyUGFzcy0wMjY4NCIsICJUaGUgY3VycmVudCByZW5kZXIgcGFzcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVuZGVyUGFzcyBtZW1iZXIgb2YgdGhlIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULXJlbmRlclBhc3MtMDI2ODQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwgIklmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhbXBsZUxvY2F0aW9uc0VuYWJsZSBzZXQgdG8gVktfVFJVRSBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1zdWJwYXNzLTAyNjg1IiwgIlRoZSBzdWJwYXNzIGluZGV4IG9mIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3QgYmUgZXF1YWwgdG8gdGhlIHN1YnBhc3MgbWVtYmVyIG9mIHRoZSBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgVmtQaXBlbGluZSBib3VuZCB0byBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1zdWJwYXNzLTAyNjg1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC10cmFuc2Zvcm1GZWVkYmFjay0wMjI4NyIsICJWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVDo6dHJhbnNmb3JtRmVlZGJhY2sgbXVzdCBiZSBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Qnl0ZUNvdW50RVhULXRyYW5zZm9ybUZlZWRiYWNrLTAyMjg3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC10cmFuc2Zvcm1GZWVkYmFja0RyYXctMDIyODgiLCAiVGhlIGltcGxlbWVudGF0aW9uIG11c3Qgc3VwcG9ydCBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjp0cmFuc2Zvcm1GZWVkYmFja0RyYXcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtdHJhbnNmb3JtRmVlZGJhY2tEcmF3LTAyMjg4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC12ZXJ0ZXhTdHJpZGUtMDIyODkiLCAidmVydGV4U3RyaWRlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlckRhdGFTdHJpZGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RCeXRlQ291bnRFWFQtdmVydGV4U3RyaWRlLTAyMjg5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2ODYiLCAiRXZlcnkgaW5wdXQgYXR0YWNobWVudCB1c2VkIGJ5IHRoZSBjdXJyZW50IHN1YnBhc3MgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgdmlhIGEgZGVzY3JpcHRvciBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjg2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2ODciLCAiSW1hZ2Ugc3VicmVzb3VyY2VzIHVzZWQgYXMgYXR0YWNobWVudHMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2ODcpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5MCIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfTElORUFSIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5MSIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5MSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjkyIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5MikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjkzIiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBub3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBvZiBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI2OTMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5NyIsICJGb3IgZWFjaCBzZXQgbiB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCBtdXN0IGhhdmUgYmVlbiBib3VuZCB0byBuIGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3Igc2V0IG4sIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5NykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk4IiwgIkZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSBtdXN0IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNjk5IiwgIkRlc2NyaXB0b3JzIGluIGVhY2ggYm91bmQgZGVzY3JpcHRvciBzZXQsIHNwZWNpZmllZCB2aWEgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMsIG11c3QgYmUgdmFsaWQgaWYgdGhleSBhcmUgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjY5OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzAwIiwgIkEgdmFsaWQgcGlwZWxpbmUgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMiIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSBWa0ltYWdlIHdpdGggYSBWa0ltYWdlVmlldyBvZiB0aGUgdHlwZSBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMyIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgT3BJbWFnZVNhbXBsZSogb3IgT3BJbWFnZVNwYXJzZVNhbXBsZSogaW5zdHJ1Y3Rpb25zIHdpdGggSW1wbGljaXRMb2QsIERyZWYgb3IgUHJvaiBpbiB0aGVpciBuYW1lLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwMykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzA0IiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcwNCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzA1IiwgIklmIHRoZSByb2J1c3QgYnVmZmVyIGFjY2VzcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IG11c3Qgbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzA1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDYiLCAiSWYgdGhlIHJvYnVzdCBidWZmZXIgYWNjZXNzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBzdG9yYWdlIGJ1ZmZlciwgaXQgbXVzdCBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcyMCIsICJBbGwgdmVydGV4IGlucHV0IGJpbmRpbmdzIGFjY2Vzc2VkIHZpYSB2ZXJ0ZXggaW5wdXQgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIGVudHJ5IHBvaW50J3MgaW50ZXJmYWNlIG11c3QgaGF2ZSB2YWxpZCBidWZmZXJzIGJvdW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItTm9uZS0wMjcyMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzIxIiwgIkZvciBhIGdpdmVuIHZlcnRleCBidWZmZXIgYmluZGluZywgYW55IGF0dHJpYnV0ZSBkYXRhIGZldGNoZWQgbXVzdCBiZSBlbnRpcmVseSBjb250YWluZWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBidWZmZXIgYmluZGluZywgYXMgZGVzY3JpYmVkIGluIFZlcnRleCBJbnB1dCBEZXNjcmlwdGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MjEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA4IiwgIklmIGJ1ZmZlciBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWJ1ZmZlci0wMjcwOSIsICJidWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWJ1ZmZlci1wYXJhbWV0ZXIiLCAiYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1idWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItMDI3MDEiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItMDI3MDEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci0wMjcwNyIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCBhbnkgcmVzb3VyY2UgYWNjZXNzZWQgYnkgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIHJlc291cmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci0wMjcwNykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzExIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzExKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvbW1vbnBhcmVudCIsICJFYWNoIG9mIGJ1ZmZlciwgY29tbWFuZEJ1ZmZlciwgYW5kIGNvdW50QnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTQiLCAiSWYgY291bnRCdWZmZXIgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE1IiwgImNvdW50QnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLTAyNzE3IiwgIlRoZSBjb3VudCBzdG9yZWQgaW4gY291bnRCdWZmZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RHJhd0luZGlyZWN0Q291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMjcxNykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMzEyMSIsICJJZiB0aGUgY291bnQgc3RvcmVkIGluIGNvdW50QnVmZmVyIGlzIGVxdWFsIHRvIDEsIChvZmZzZXQgKyBzaXplb2YoVmtEcmF3SW5kaXJlY3RDb21tYW5kKSkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDMxMjEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDMxMjIiLCAiSWYgdGhlIGNvdW50IHN0b3JlZCBpbiBjb3VudEJ1ZmZlciBpcyBncmVhdGVyIHRoYW4gMSwgKHN0cmlkZSB7dGltZXN9IChkcmF3Q291bnQgLSAxKSArIG9mZnNldCArIHNpemVvZihWa0RyYXdJbmRpcmVjdENvbW1hbmQpKSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMzEyMikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY291bnRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlck9mZnNldC0wMjcxNiIsICJjb3VudEJ1ZmZlck9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyT2Zmc2V0LTAyNzE2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWZpbHRlckN1YmljLTAyNjk0IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpmaWx0ZXJDdWJpYyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWZpbHRlckN1YmljLTAyNjk0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCB3aXRoIGEgcmVkdWN0aW9uIG1vZGUgb2YgZWl0aGVyIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVCBvciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nIHRvZ2V0aGVyIHdpdGggbWlubWF4IGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljTWlubWF4IHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItZmxhZ3MtMDI2OTYiLCAiQW55IFZrSW1hZ2UgY3JlYXRlZCB3aXRoIGEgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIGNvbnRhaW5pbmcgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIFZrU2FtcGxlckFkZHJlc3NNb2RlIG9mIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItZmxhZ3MtMDI2OTYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItbWF4RHJhd0NvdW50LTAzMTExIiwgIklmIG1heERyYXdDb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSwgKHN0cmlkZSB7dGltZXN9IChtYXhEcmF3Q291bnQgLSAxKSArIG9mZnNldCArIHNpemVvZihWa0RyYXdJbmRpcmVjdENvbW1hbmQpKSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1tYXhEcmF3Q291bnQtMDMxMTEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCIsICJJZiB0aGUgZHJhdyBpcyByZWNvcmRlZCBpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIHdpdGggbXVsdGl2aWV3IGVuYWJsZWQsIHRoZSBtYXhpbXVtIGluc3RhbmNlIGluZGV4IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzOjptYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItb2Zmc2V0LTAyNzEwIiwgIm9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLW9mZnNldC0wMjcxMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1yZW5kZXJQYXNzLTAyNjg0IiwgIlRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZW5kZXJQYXNzIG1lbWJlciBvZiB0aGUgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1yZW5kZXJQYXNzLTAyNjg0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsICJJZiB0aGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aCBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOjpzYW1wbGVMb2NhdGlvbnNFbmFibGUgc2V0IHRvIFZLX1RSVUUgYW5kIHRoZSBjdXJyZW50IHN1YnBhc3MgaGFzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50LCB0aGVuIHRoYXQgYXR0YWNobWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVCBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLXN0cmlkZS0wMzExMCIsICJzdHJpZGUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgYW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHNpemVvZihWa0RyYXdJbmRpcmVjdENvbW1hbmQpIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItc3RyaWRlLTAzMTEwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLXN1YnBhc3MtMDI2ODUiLCAiVGhlIHN1YnBhc3MgaW5kZXggb2YgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBiZSBlcXVhbCB0byB0aGUgc3VicGFzcyBtZW1iZXIgb2YgdGhlIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gc3RydWN0dXJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItc3VicGFzcy0wMjY4NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2ODYiLCAiRXZlcnkgaW5wdXQgYXR0YWNobWVudCB1c2VkIGJ5IHRoZSBjdXJyZW50IHN1YnBhc3MgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgdmlhIGEgZGVzY3JpcHRvciBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2ODYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjg3IiwgIkltYWdlIHN1YnJlc291cmNlcyB1c2VkIGFzIGF0dGFjaG1lbnRzIGluIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzIG11c3Qgbm90IGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgb3RoZXIgdGhhbiBhcyBhbiBhdHRhY2htZW50IGJ5IHRoaXMgY29tbWFuZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2ODcpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjkwIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9MSU5FQVIgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjkwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY5MSIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9BVE9NSUNfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjkxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY5MiIsICJJZiBhIFZrSW1hZ2VWaWV3IGlzIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCwgdGhlbiB0aGUgaW1hZ2UgdmlldydzIGZvcm1hdCBmZWF0dXJlcyBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfQ1VCSUNfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY5MikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2OTMiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG5vdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIG9mIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjkzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY5NyIsICJGb3IgZWFjaCBzZXQgbiB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBkZXNjcmlwdG9yIHNldCBtdXN0IGhhdmUgYmVlbiBib3VuZCB0byBuIGF0IHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3Igc2V0IG4sIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNjk3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY5OCIsICJGb3IgZWFjaCBwdXNoIGNvbnN0YW50IHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIHB1c2ggY29uc3RhbnQgdmFsdWUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgVmtQaXBlbGluZUxheW91dCB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHB1c2ggY29uc3RhbnRzLCB3aXRoIHRoZSBWa1BpcGVsaW5lTGF5b3V0IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IFZrUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBpbiBQaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjY5OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2OTkiLCAiRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cywgbXVzdCBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI2OTkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNzAwIiwgIkEgdmFsaWQgcGlwZWxpbmUgbXVzdCBiZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjcwMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI3MDIiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB0byBzYW1wbGUgZnJvbSBhbnkgVmtJbWFnZSB3aXRoIGEgVmtJbWFnZVZpZXcgb2YgdGhlIHR5cGUgVktfSU1BR0VfVklFV19UWVBFXzNELCBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRSwgVktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZLCBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVkgb3IgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVksIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI3MDIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNzAzIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgd2l0aCBJbXBsaWNpdExvZCwgRHJlZiBvciBQcm9qIGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLU5vbmUtMDI3MDMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNzA0IiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlcyBhIExPRCBiaWFzIG9yIGFueSBvZmZzZXQgdmFsdWVzLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNzA0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjcwNSIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHVuaWZvcm0gYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNzA1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtTm9uZS0wMjcwNiIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1Ob25lLTAyNzA2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtYnVmZmVyLTAyNzA4IiwgIklmIGJ1ZmZlciBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1idWZmZXItMDI3MDgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1idWZmZXItMDI3MDkiLCAiYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtYnVmZmVyLTAyNzA5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1hbmRCdWZmZXItMDI3MDEiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci0wMjcwMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1hbmRCdWZmZXItMDI3MDciLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIGFjY2Vzc2VkIGJ5IHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci0wMjcwNykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1hbmRCdWZmZXItMDI3MTEiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci0wMjcxMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1vbnBhcmVudCIsICJFYWNoIG9mIGJ1ZmZlciwgY29tbWFuZEJ1ZmZlciwgYW5kIGNvdW50QnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyMTkxIiwgIklmIHRoZSBjb3VudCBzdG9yZWQgaW4gY291bnRCdWZmZXIgaXMgZXF1YWwgdG8gMSwgKG9mZnNldCArIHNpemVvZihWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROVikpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY291bnRCdWZmZXItMDIxOTEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb3VudEJ1ZmZlci0wMjE5MiIsICJJZiB0aGUgY291bnQgc3RvcmVkIGluIGNvdW50QnVmZmVyIGlzIGdyZWF0ZXIgdGhhbiAxLCAoc3RyaWRlIHt0aW1lc30gKGRyYXdDb3VudCAtIDEpICsgb2Zmc2V0ICsgc2l6ZW9mKFZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WKSkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb3VudEJ1ZmZlci0wMjE5MikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE0IiwgIklmIGNvdW50QnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY291bnRCdWZmZXItMDI3MTUiLCAiY291bnRCdWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVCBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb3VudEJ1ZmZlci0wMjcxNSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE3IiwgIlRoZSBjb3VudCBzdG9yZWQgaW4gY291bnRCdWZmZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RHJhd0luZGlyZWN0Q291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLTAyNzE3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY291bnRCdWZmZXItcGFyYW1ldGVyIiwgImNvdW50QnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyT2Zmc2V0LTAyNzE2IiwgImNvdW50QnVmZmVyT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1jb3VudEJ1ZmZlck9mZnNldC0wMjcxNikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWZpbHRlckN1YmljLTAyNjk0IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpmaWx0ZXJDdWJpYyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtZmlsdGVyQ3ViaWMtMDI2OTQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQgb3IgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpmaWx0ZXJDdWJpY01pbm1heCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1mbGFncy0wMjY5NiIsICJBbnkgVmtJbWFnZSBjcmVhdGVkIHdpdGggYSBWa0ltYWdlQ3JlYXRlSW5mbzo6ZmxhZ3MgY29udGFpbmluZyBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WIHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgVmtTYW1wbGVyQWRkcmVzc01vZGUgb2YgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWZsYWdzLTAyNjk2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtbWF4RHJhd0NvdW50LTAyMTgzIiwgIklmIG1heERyYXdDb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSwgKHN0cmlkZSB7dGltZXN9IChtYXhEcmF3Q291bnQgLSAxKSArIG9mZnNldCArIHNpemVvZihWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROVikpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtbWF4RHJhd0NvdW50LTAyMTgzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCIsICJJZiB0aGUgZHJhdyBpcyByZWNvcmRlZCBpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIHdpdGggbXVsdGl2aWV3IGVuYWJsZWQsIHRoZSBtYXhpbXVtIGluc3RhbmNlIGluZGV4IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VNdWx0aXZpZXdQcm9wZXJ0aWVzOjptYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLW9mZnNldC0wMjcxMCIsICJvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLW9mZnNldC0wMjcxMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLXJlbmRlclBhc3MtMDI2ODQiLCAiVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHRoZSBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgVmtQaXBlbGluZSBib3VuZCB0byBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtcmVuZGVyUGFzcy0wMjY4NCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVi1zYW1wbGVMb2NhdGlvbnNFbmFibGUtMDI2ODkiLCAiSWYgdGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIHdhcyBjcmVhdGVkIHdpdGggVmtQaXBlbGluZVNhbXBsZUxvY2F0aW9uc1N0YXRlQ3JlYXRlSW5mb0VYVDo6c2FtcGxlTG9jYXRpb25zRW5hYmxlIHNldCB0byBWS19UUlVFIGFuZCB0aGUgY3VycmVudCBzdWJwYXNzIGhhcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCwgdGhlbiB0aGF0IGF0dGFjaG1lbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19JTUFHRV9DUkVBVEVfU0FNUExFX0xPQ0FUSU9OU19DT01QQVRJQkxFX0RFUFRIX0JJVF9FWFQgYml0IHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtc3RyaWRlLTAyMTgyIiwgInN0cmlkZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gc2l6ZW9mKFZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WKSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtc3RyaWRlLTAyMTgyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtc3VicGFzcy0wMjY4NSIsICJUaGUgc3VicGFzcyBpbmRleCBvZiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzdWJwYXNzIG1lbWJlciBvZiB0aGUgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLXN1YnBhc3MtMDI2ODUpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjY4NiIsICJFdmVyeSBpbnB1dCBhdHRhY2htZW50IHVzZWQgYnkgdGhlIGN1cnJlbnQgc3VicGFzcyBtdXN0IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSB2aWEgYSBkZXNjcmlwdG9yIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2ODYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjY4NyIsICJJbWFnZSBzdWJyZXNvdXJjZXMgdXNlZCBhcyBhdHRhY2htZW50cyBpbiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBpbiBhbnkgd2F5IG90aGVyIHRoYW4gYXMgYW4gYXR0YWNobWVudCBieSB0aGlzIGNvbW1hbmQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjY4NykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjkwIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9MSU5FQVIgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjY5MCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjkxIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjkxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2OTIiLCAiSWYgYSBWa0ltYWdlVmlldyBpcyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcncyBmb3JtYXQgZmVhdHVyZXMgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjkyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2OTMiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG5vdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIG9mIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjY5MykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjk3IiwgIkZvciBlYWNoIHNldCBuIHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IG11c3QgaGF2ZSBiZWVuIGJvdW5kIHRvIG4gYXQgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIFZrUGlwZWxpbmVMYXlvdXQgdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgbiwgd2l0aCB0aGUgVmtQaXBlbGluZUxheW91dCB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCBWa1BpcGVsaW5lLCBhcyBkZXNjcmliZWQgaW4gUGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjk3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2OTgiLCAiRm9yIGVhY2ggcHVzaCBjb25zdGFudCB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBwdXNoIGNvbnN0YW50IHZhbHVlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIFZrUGlwZWxpbmVMYXlvdXQgdGhhdCBpcyBjb21wYXRpYmxlIGZvciBwdXNoIGNvbnN0YW50cywgd2l0aCB0aGUgVmtQaXBlbGluZUxheW91dCB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCBWa1BpcGVsaW5lLCBhcyBkZXNjcmliZWQgaW4gUGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjk4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI2OTkiLCAiRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cywgbXVzdCBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNjk5KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI3MDAiLCAiQSB2YWxpZCBwaXBlbGluZSBtdXN0IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjcwMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNzAyIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgdG8gc2FtcGxlIGZyb20gYW55IFZrSW1hZ2Ugd2l0aCBhIFZrSW1hZ2VWaWV3IG9mIHRoZSB0eXBlIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWSwgVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjcwMikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNzAzIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgd2l0aCBJbXBsaWNpdExvZCwgRHJlZiBvciBQcm9qIGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNzAzKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI3MDQiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIE9wSW1hZ2VTYW1wbGUqIG9yIE9wSW1hZ2VTcGFyc2VTYW1wbGUqIGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1Ob25lLTAyNzA0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI3MDUiLCAiSWYgdGhlIHJvYnVzdCBidWZmZXIgYWNjZXNzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSB1bmlmb3JtIGJ1ZmZlciwgaXQgbXVzdCBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLU5vbmUtMDI3MDUpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjcwNiIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtTm9uZS0wMjcwNikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1idWZmZXItMDI3MDgiLCAiSWYgYnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1idWZmZXItMDI3MDgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtYnVmZmVyLTAyNzA5IiwgImJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1idWZmZXItMDI3MDkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtYnVmZmVyLXBhcmFtZXRlciIsICJidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci0wMjcwMSIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci0wMjcwMSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1jb21tYW5kQnVmZmVyLTAyNzA3IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1jb21tYW5kQnVmZmVyLTAyNzA3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1hbmRCdWZmZXItMDI3MTEiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1hbmRCdWZmZXItMDI3MTEpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgYnVmZmVyLCBhbmQgY29tbWFuZEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWRyYXdDb3VudC0wMjE0NiIsICJJZiBkcmF3Q291bnQgaXMgZ3JlYXRlciB0aGFuIDEsIHN0cmlkZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gc2l6ZW9mKFZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WKSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWRyYXdDb3VudC0wMjE0NikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1kcmF3Q291bnQtMDIxNTYiLCAiSWYgZHJhd0NvdW50IGlzIGVxdWFsIHRvIDEsIChvZmZzZXQgKyBzaXplb2YoVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYpKSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1kcmF3Q291bnQtMDIxNTYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZHJhd0NvdW50LTAyMTU3IiwgIklmIGRyYXdDb3VudCBpcyBncmVhdGVyIHRoYW4gMSwgKHN0cmlkZSB7dGltZXN9IChkcmF3Q291bnQgLSAxKSArIG9mZnNldCArIHNpemVvZihWa0RyYXdNZXNoVGFza3NJbmRpcmVjdENvbW1hbmROVikpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWRyYXdDb3VudC0wMjE1NykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1kcmF3Q291bnQtMDI3MTgiLCAiSWYgdGhlIG11bHRpLWRyYXcgaW5kaXJlY3QgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHJhd0NvdW50IG11c3QgYmUgMCBvciAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZHJhd0NvdW50LTAyNzE4KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWRyYXdDb3VudC0wMjcxOSIsICJkcmF3Q291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RHJhd0luZGlyZWN0Q291bnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1kcmF3Q291bnQtMDI3MTkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZmlsdGVyQ3ViaWMtMDI2OTQiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZmlsdGVyQ3ViaWMtMDI2OTQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIHdpdGggYSByZWR1Y3Rpb24gbW9kZSBvZiBlaXRoZXIgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NSU5fRVhUIG9yIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUFYX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcgdG9nZXRoZXIgd2l0aCBtaW5tYXggZmlsdGVyaW5nLCBhcyBzcGVjaWZpZWQgYnkgVmtGaWx0ZXJDdWJpY0ltYWdlVmlld0ltYWdlRm9ybWF0UHJvcGVydGllc0VYVDo6ZmlsdGVyQ3ViaWNNaW5tYXggcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1mbGFncy0wMjY5NiIsICJBbnkgVmtJbWFnZSBjcmVhdGVkIHdpdGggYSBWa0ltYWdlQ3JlYXRlSW5mbzo6ZmxhZ3MgY29udGFpbmluZyBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WIHNhbXBsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBzYW1wbGVkIHVzaW5nIGEgVmtTYW1wbGVyQWRkcmVzc01vZGUgb2YgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1mbGFncy0wMjY5NikifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LTAyNjg4IiwgIklmIHRoZSBkcmF3IGlzIHJlY29yZGVkIGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2Ugd2l0aCBtdWx0aXZpZXcgZW5hYmxlZCwgdGhlIG1heGltdW0gaW5zdGFuY2UgaW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM6Om1heE11bHRpdmlld0luc3RhbmNlSW5kZXguIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtbWF4TXVsdGl2aWV3SW5zdGFuY2VJbmRleC0wMjY4OCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1vZmZzZXQtMDI3MTAiLCAib2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtb2Zmc2V0LTAyNzEwKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLXJlbmRlclBhc3MtMDI2ODQiLCAiVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHRoZSBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgVmtQaXBlbGluZSBib3VuZCB0byBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLXJlbmRlclBhc3MtMDI2ODQpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtc2FtcGxlTG9jYXRpb25zRW5hYmxlLTAyNjg5IiwgIklmIHRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSB3YXMgY3JlYXRlZCB3aXRoIFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ6OnNhbXBsZUxvY2F0aW9uc0VuYWJsZSBzZXQgdG8gVktfVFJVRSBhbmQgdGhlIGN1cnJlbnQgc3VicGFzcyBoYXMgYSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQsIHRoZW4gdGhhdCBhdHRhY2htZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX1NBTVBMRV9MT0NBVElPTlNfQ09NUEFUSUJMRV9ERVBUSF9CSVRfRVhUIGJpdCBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1zYW1wbGVMb2NhdGlvbnNFbmFibGUtMDI2ODkpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtc3VicGFzcy0wMjY4NSIsICJUaGUgc3VicGFzcyBpbmRleCBvZiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzdWJwYXNzIG1lbWJlciBvZiB0aGUgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1zdWJwYXNzLTAyNjg1KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjg2IiwgIkV2ZXJ5IGlucHV0IGF0dGFjaG1lbnQgdXNlZCBieSB0aGUgY3VycmVudCBzdWJwYXNzIG11c3QgYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIHZpYSBhIGRlc2NyaXB0b3Igc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2ODYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2ODciLCAiSW1hZ2Ugc3VicmVzb3VyY2VzIHVzZWQgYXMgYXR0YWNobWVudHMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBub3QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGFzIGFuIGF0dGFjaG1lbnQgYnkgdGhpcyBjb21tYW5kLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjg3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjkwIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9MSU5FQVIgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTApIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTEiLCAiSWYgYSBWa0ltYWdlVmlldyBpcyBhY2Nlc3NlZCB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcncyBmb3JtYXQgZmVhdHVyZXMgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjkxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjkyIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTIpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTMiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG5vdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIG9mIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTMpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTciLCAiRm9yIGVhY2ggc2V0IG4gdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgZGVzY3JpcHRvciBzZXQgbXVzdCBoYXZlIGJlZW4gYm91bmQgdG8gbiBhdCB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50LCB3aXRoIGEgVmtQaXBlbGluZUxheW91dCB0aGF0IGlzIGNvbXBhdGlibGUgZm9yIHNldCBuLCB3aXRoIHRoZSBWa1BpcGVsaW5lTGF5b3V0IHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IFZrUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBpbiBQaXBlbGluZSBMYXlvdXQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjk3KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNjk4IiwgIkZvciBlYWNoIHB1c2ggY29uc3RhbnQgdGhhdCBpcyBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQsIGEgcHVzaCBjb25zdGFudCB2YWx1ZSBtdXN0IGhhdmUgYmVlbiBzZXQgZm9yIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQsIHdpdGggYSBWa1BpcGVsaW5lTGF5b3V0IHRoYXQgaXMgY29tcGF0aWJsZSBmb3IgcHVzaCBjb25zdGFudHMsIHdpdGggdGhlIFZrUGlwZWxpbmVMYXlvdXQgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgVmtQaXBlbGluZSwgYXMgZGVzY3JpYmVkIGluIFBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI2OTkiLCAiRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cywgbXVzdCBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjY5OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjcwMCIsICJBIHZhbGlkIHBpcGVsaW5lIG11c3QgYmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjcwMCkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjcwMiIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHRvIHNhbXBsZSBmcm9tIGFueSBWa0ltYWdlIHdpdGggYSBWa0ltYWdlVmlldyBvZiB0aGUgdHlwZSBWS19JTUFHRV9WSUVXX1RZUEVfM0QsIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFLCBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVksIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWSBvciBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRV9BUlJBWSwgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNzAyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNzAzIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgd2l0aCBJbXBsaWNpdExvZCwgRHJlZiBvciBQcm9qIGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjcwMykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjcwNCIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSBWa1NhbXBsZXIgb2JqZWN0IHRoYXQgdXNlcyB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMsIHRoYXQgc2FtcGxlciBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBTUElSLVYgT3BJbWFnZVNhbXBsZSogb3IgT3BJbWFnZVNwYXJzZVNhbXBsZSogaW5zdHJ1Y3Rpb25zIHRoYXQgaW5jbHVkZXMgYSBMT0QgYmlhcyBvciBhbnkgb2Zmc2V0IHZhbHVlcywgaW4gYW55IHNoYWRlciBzdGFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNzA0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1Ob25lLTAyNzA1IiwgIklmIHRoZSByb2J1c3QgYnVmZmVyIGFjY2VzcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBhbmQgaWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgdW5pZm9ybSBidWZmZXIsIGl0IG11c3Qgbm90IGFjY2VzcyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGJ1ZmZlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0IGJvdW5kIHRvIHRoZSBzYW1lIHBpcGVsaW5lIGJpbmQgcG9pbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjcwNSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtTm9uZS0wMjcwNiIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLU5vbmUtMDI3MDYpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLWNvbW1hbmRCdWZmZXItMDI3MDEiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIHJlcXVpcmVzIGFueSBkeW5hbWljIHN0YXRlLCB0aGF0IHN0YXRlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgY29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1jb21tYW5kQnVmZmVyLTAyNzAxKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1jb21tYW5kQnVmZmVyLTAyNzA3IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtY29tbWFuZEJ1ZmZlci0wMjcwNykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtZmlsdGVyQ3ViaWMtMDI2OTQiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljIHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLWZpbHRlckN1YmljLTAyNjk0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSIsICJBbnkgVmtJbWFnZVZpZXcgYmVpbmcgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9DVUJJQ19FWFQgd2l0aCBhIHJlZHVjdGlvbiBtb2RlIG9mIGVpdGhlciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01JTl9FWFQgb3IgVktfU0FNUExFUl9SRURVQ1RJT05fTU9ERV9NQVhfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYSBWa0ltYWdlVmlld1R5cGUgYW5kIGZvcm1hdCB0aGF0IHN1cHBvcnRzIGN1YmljIGZpbHRlcmluZyB0b2dldGhlciB3aXRoIG1pbm1heCBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpmaWx0ZXJDdWJpY01pbm1heCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1maWx0ZXJDdWJpY01pbm1heC0wMjY5NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtZmxhZ3MtMDI2OTYiLCAiQW55IFZrSW1hZ2UgY3JlYXRlZCB3aXRoIGEgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIGNvbnRhaW5pbmcgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIFZrU2FtcGxlckFkZHJlc3NNb2RlIG9mIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLWZsYWdzLTAyNjk2KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1tYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4LTAyNjg4IiwgIklmIHRoZSBkcmF3IGlzIHJlY29yZGVkIGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2Ugd2l0aCBtdWx0aXZpZXcgZW5hYmxlZCwgdGhlIG1heGltdW0gaW5zdGFuY2UgaW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZU11bHRpdmlld1Byb3BlcnRpZXM6Om1heE11bHRpdmlld0luc3RhbmNlSW5kZXguIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLW1heE11bHRpdmlld0luc3RhbmNlSW5kZXgtMDI2ODgpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLXJlbmRlclBhc3MtMDI2ODQiLCAiVGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHJlbmRlclBhc3MgbWVtYmVyIG9mIHRoZSBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIHN0cnVjdHVyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgVmtQaXBlbGluZSBib3VuZCB0byBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1yZW5kZXJQYXNzLTAyNjg0KSJ9LAorICAgIHsiVlVJRC12a0NtZERyYXdNZXNoVGFza3NOVi1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSIsICJJZiB0aGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgd2FzIGNyZWF0ZWQgd2l0aCBWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUOjpzYW1wbGVMb2NhdGlvbnNFbmFibGUgc2V0IHRvIFZLX1RSVUUgYW5kIHRoZSBjdXJyZW50IHN1YnBhc3MgaGFzIGEgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50LCB0aGVuIHRoYXQgYXR0YWNobWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0lNQUdFX0NSRUFURV9TQU1QTEVfTE9DQVRJT05TX0NPTVBBVElCTEVfREVQVEhfQklUX0VYVCBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLXNhbXBsZUxvY2F0aW9uc0VuYWJsZS0wMjY4OSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtc3VicGFzcy0wMjY4NSIsICJUaGUgc3VicGFzcyBpbmRleCBvZiB0aGUgY3VycmVudCByZW5kZXIgcGFzcyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzdWJwYXNzIG1lbWJlciBvZiB0aGUgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtc3VicGFzcy0wMjY4NSkifSwKKyAgICB7IlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtdGFza0NvdW50LTAyMTE5IiwgInRhc2tDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOVjo6bWF4RHJhd01lc2hUYXNrc0NvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRHJhd01lc2hUYXNrc05WLXRhc2tDb3VudC0wMjExOSkifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVC1Ob25lLTAxOTg1IiwgIkNvbmRpdGlvbmFsIHJlbmRlcmluZyBtdXN0IGJlIGFjdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULU5vbmUtMDE5ODUpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtTm9uZS0wMTk4NiIsICJJZiBjb25kaXRpb25hbCByZW5kZXJpbmcgd2FzIG1hZGUgYWN0aXZlIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgaXQgbXVzdCBub3QgYmUgZW5kZWQgaW5zaWRlIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVC1Ob25lLTAxOTg2KSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULU5vbmUtMDE5ODciLCAiSWYgY29uZGl0aW9uYWwgcmVuZGVyaW5nIHdhcyBtYWRlIGFjdGl2ZSB3aXRoaW4gYSBzdWJwYXNzIGl0IG11c3QgYmUgZW5kZWQgaW4gdGhlIHNhbWUgc3VicGFzcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULU5vbmUtMDE5ODcpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRDb25kaXRpb25hbFJlbmRlcmluZ0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItMDE5MTIiLCAiVGhlcmUgbXVzdCBiZSBhbiBvdXRzdGFuZGluZyB2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIGNvbW1hbmQgcHJpb3IgdG8gdGhlIHZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUIG9uIHRoZSBxdWV1ZSB0aGF0IGNvbW1hbmRCdWZmZXIgaXMgc3VibWl0dGVkIHRvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItMDE5MTIpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItMDE5MTMiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciwgdGhlcmUgbXVzdCBiZSBhbiBvdXRzdGFuZGluZyB2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIGNvbW1hbmQgcmVjb3JkZWQgdG8gY29tbWFuZEJ1ZmZlciB0aGF0IGhhcyBub3QgcHJldmlvdXNseSBiZWVuIGVuZGVkIGJ5IGEgY2FsbCB0byB2a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci0wMTkxMykifSwKKyAgICB7IlZVSUQtdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeS1Ob25lLTAxOTIzIiwgIkFsbCBxdWVyaWVzIHVzZWQgYnkgdGhlIGNvbW1hbmQgbXVzdCBiZSBhY3RpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeS1Ob25lLTAxOTIzKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZFF1ZXJ5LWNvbW1hbmRCdWZmZXItMDE4ODYiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFF1ZXJ5LWNvbW1hbmRCdWZmZXItMDE4ODYpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnktY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeS1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnktY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFF1ZXJ5LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZFF1ZXJ5LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUXVlcnktY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnktY29tbW9ucGFyZW50IiwgIkJvdGggb2YgY29tbWFuZEJ1ZmZlciwgYW5kIHF1ZXJ5UG9vbCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUXVlcnktY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZFF1ZXJ5LXF1ZXJ5LTAwODEwIiwgInF1ZXJ5IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiBxdWVyeVBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeS1xdWVyeS0wMDgxMCkifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeS1xdWVyeS0wMDgxMiIsICJJZiB2a0NtZEVuZFF1ZXJ5IGlzIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhlIHN1bSBvZiBxdWVyeSBhbmQgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgY3VycmVudCBzdWJwYXNzJ3MgdmlldyBtYXNrIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiBxdWVyeVBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeS1xdWVyeS0wMDgxMikifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeS1xdWVyeVBvb2wtMDMyMjciLCAiSWYgcXVlcnlQb29sIHdhcyBjcmVhdGVkIHdpdGggYSBxdWVyeVR5cGUgb2YgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIgYW5kIG9uZSBvciBtb3JlIG9mIHRoZSBjb3VudGVycyB1c2VkIHRvIGNyZWF0ZSBxdWVyeVBvb2wgd2FzIFZLX1FVRVJZX1NDT1BFX0NPTU1BTkRfQlVGRkVSX0tIUiwgdGhlIHZrQ21kRW5kUXVlcnkgbXVzdCBiZSB0aGUgbGFzdCByZWNvcmRlZCBjb21tYW5kIGluIGNvbW1hbmRCdWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeS1xdWVyeVBvb2wtMDMyMjcpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnktcXVlcnlQb29sLTAzMjI4IiwgIklmIHF1ZXJ5UG9vbCB3YXMgY3JlYXRlZCB3aXRoIGEgcXVlcnlUeXBlIG9mIFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSIGFuZCBvbmUgb3IgbW9yZSBvZiB0aGUgY291bnRlcnMgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFIsIHRoZSB2a0NtZEVuZFF1ZXJ5IG11c3Qgbm90IGJlIHJlY29yZGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUXVlcnktcXVlcnlQb29sLTAzMjI4KSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZFF1ZXJ5LXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAicXVlcnlQb29sIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXJ5UG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeS1xdWVyeVBvb2wtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVC1Ob25lLTAyMzQyIiwgIkFsbCBxdWVyaWVzIHVzZWQgYnkgdGhlIGNvbW1hbmQgbXVzdCBiZSBhY3RpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtTm9uZS0wMjM0MikifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci0wMjM0NCIsICJjb21tYW5kQnVmZmVyIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULWNvbW1hbmRCdWZmZXItMDIzNDQpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCBxdWVyeVBvb2wgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULXF1ZXJ5LTAyMzQzIiwgInF1ZXJ5IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiBxdWVyeVBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtcXVlcnktMDIzNDMpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULXF1ZXJ5LTAyMzQ1IiwgIklmIHZrQ21kRW5kUXVlcnlJbmRleGVkRVhUIGlzIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhlIHN1bSBvZiBxdWVyeSBhbmQgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgY3VycmVudCBzdWJwYXNzJ3MgdmlldyBtYXNrIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiBxdWVyeVBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtcXVlcnktMDIzNDUpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAicXVlcnlQb29sIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXJ5UG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtcXVlcnlQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAyMzQ2IiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUIHRoZSBpbmRleCBwYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVDo6bWF4VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjM0NikifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAyMzQ3IiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBub3QgVktfUVVFUllfVFlQRV9UUkFOU0ZPUk1fRkVFREJBQ0tfU1RSRUFNX0VYVCB0aGUgaW5kZXggbXVzdCBiZSB6ZXJvIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjM0NykifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtcXVlcnlUeXBlLTAyNzIzIiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1RSQU5TRk9STV9GRUVEQkFDS19TVFJFQU1fRVhUIGluZGV4IG11c3QgZXF1YWwgdGhlIGluZGV4IHVzZWQgdG8gYmVnaW4gdGhlIHF1ZXJ5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUXVlcnlJbmRleGVkRVhULXF1ZXJ5VHlwZS0wMjcyMykifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzLU5vbmUtMDA5MTAiLCAiVGhlIGN1cnJlbnQgc3VicGFzcyBpbmRleCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygc3VicGFzc2VzIGluIHRoZSByZW5kZXIgcGFzcyBtaW51cyBvbmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzLU5vbmUtMDA5MTApIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1Ob25lLTAyMzUxIiwgIlRoaXMgY29tbWFuZCBtdXN0IG5vdCBiZSByZWNvcmRlZCB3aGVuIHRyYW5zZm9ybSBmZWVkYmFjayBpcyBhY3RpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzLU5vbmUtMDIzNTEpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1idWZmZXJsZXZlbCIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSBwcmltYXJ5IFZrQ29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtYnVmZmVybGV2ZWwpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUmVuZGVyUGFzcy1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLU5vbmUtMDIzNTIiLCAiVGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIHJlY29yZGVkIHdoZW4gdHJhbnNmb3JtIGZlZWRiYWNrIGlzIGFjdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLU5vbmUtMDIzNTIpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItTm9uZS0wMzEwMyIsICJUaGUgY3VycmVudCBzdWJwYXNzIGluZGV4IG11c3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzdWJwYXNzZXMgaW4gdGhlIHJlbmRlciBwYXNzIG1pbnVzIG9uZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLU5vbmUtMDMxMDMpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItYnVmZmVybGV2ZWwiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgcHJpbWFyeSBWa0NvbW1hbmRCdWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1idWZmZXJsZXZlbCkifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1wU3VicGFzc0VuZEluZm8tcGFyYW1ldGVyIiwgInBTdWJwYXNzRW5kSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrU3VicGFzc0VuZEluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItcFN1YnBhc3NFbmRJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzMktIUi1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1Ob25lLTAyMzc1IiwgIlRyYW5zZm9ybSBmZWVkYmFjayBtdXN0IGJlIGFjdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULU5vbmUtMDIzNzUpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgY29tbWFuZEJ1ZmZlciwgYW5kIHRoZSBlbGVtZW50cyBvZiBwQ291bnRlckJ1ZmZlcnMgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtY291bnRlckJ1ZmZlckNvdW50LTAyNjA4IiwgIklmIGNvdW50ZXJCdWZmZXJDb3VudCBpcyBub3QgMCwgYW5kIHBDb3VudGVyQnVmZmVycyBpcyBub3QgTlVMTCwgcENvdW50ZXJCdWZmZXJzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvdW50ZXJCdWZmZXJDb3VudCBWa0J1ZmZlciBoYW5kbGVzIHRoYXQgYXJlIGVpdGhlciB2YWxpZCBvciBWS19OVUxMX0hBTkRMRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULWNvdW50ZXJCdWZmZXJDb3VudC0wMjYwOCkifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1maXJzdENvdW50ZXJCdWZmZXItMDIzNzYiLCAiZmlyc3RDb3VudGVyQnVmZmVyIG11c3QgYmUgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja1Byb3BlcnRpZXNFWFQ6Om1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULWZpcnN0Q291bnRlckJ1ZmZlci0wMjM3NikifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1maXJzdENvdW50ZXJCdWZmZXItMDIzNzciLCAiVGhlIHN1bSBvZiBmaXJzdENvdW50ZXJCdWZmZXIgYW5kIGNvdW50ZXJCdWZmZXJDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tQcm9wZXJ0aWVzRVhUOjptYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1maXJzdENvdW50ZXJCdWZmZXItMDIzNzcpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtcENvdW50ZXJCdWZmZXItMDIzNzkiLCAiSWYgcENvdW50ZXJCdWZmZXIgaXMgTlVMTCwgdGhlbiBwQ291bnRlckJ1ZmZlck9mZnNldHMgbXVzdCBhbHNvIGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlci0wMjM3OSkifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlck9mZnNldHMtMDIzNzgiLCAiRm9yIGVhY2ggYnVmZmVyIGhhbmRsZSBpbiB0aGUgYXJyYXksIGlmIGl0IGlzIG5vdCBWS19OVUxMX0hBTkRMRSBpdCBtdXN0IHJlZmVyZW5jZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCA0IGJ5dGVzIGF0IHRoZSBjb3JyZXNwb25kaW5nIG9mZnNldCBmcm9tIHRoZSBwQ291bnRlckJ1ZmZlck9mZnNldHMgYXJyYXkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1wQ291bnRlckJ1ZmZlck9mZnNldHMtMDIzNzgpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtcENvdW50ZXJCdWZmZXJPZmZzZXRzLXBhcmFtZXRlciIsICJJZiBjb3VudGVyQnVmZmVyQ291bnQgaXMgbm90IDAsIGFuZCBwQ291bnRlckJ1ZmZlck9mZnNldHMgaXMgbm90IE5VTEwsIHBDb3VudGVyQnVmZmVyT2Zmc2V0cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjb3VudGVyQnVmZmVyQ291bnQgVmtEZXZpY2VTaXplIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULXBDb3VudGVyQnVmZmVyT2Zmc2V0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtcENvdW50ZXJCdWZmZXJzLTAyMzgwIiwgIkZvciBlYWNoIGJ1ZmZlciBoYW5kbGUgaW4gdGhlIHBDb3VudGVyQnVmZmVycyBhcnJheSB0aGF0IGlzIG5vdCBWS19OVUxMX0hBTkRMRSBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSB1c2FnZSB2YWx1ZSBjb250YWluaW5nIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQ09VTlRFUl9CVUZGRVJfQklUX0VYVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhULXBDb3VudGVyQnVmZmVycy0wMjM4MCkifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC10cmFuc2Zvcm1GZWVkYmFjay0wMjM3NCIsICJWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVDo6dHJhbnNmb3JtRmVlZGJhY2sgbXVzdCBiZSBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQtdHJhbnNmb3JtRmVlZGJhY2stMDIzNzQpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLU5vbmUtMDIyODYiLCAiVGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIHJlY29yZGVkIHdoZW4gdHJhbnNmb3JtIGZlZWRiYWNrIGlzIGFjdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1Ob25lLTAyMjg2KSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1idWZmZXJsZXZlbCIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSBwcmltYXJ5IFZrQ29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1idWZmZXJsZXZlbCkifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMDA4NyIsICJjb21tYW5kQnVmZmVyIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGEgbGV2ZWwgb2YgVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMDg3KSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMTAxIiwgIklmIHRoZSBpbmhlcml0ZWQgcXVlcmllcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBjb21tYW5kQnVmZmVyIG11c3Qgbm90IGhhdmUgYW55IHF1ZXJpZXMgYWN0aXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXItMDAxMDEpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXItMDAxMDIiLCAiSWYgY29tbWFuZEJ1ZmZlciBoYXMgYSBWS19RVUVSWV9UWVBFX09DQ0xVU0lPTiBxdWVyeSBhY3RpdmUsIHRoZW4gZWFjaCBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyBtdXN0IGhhdmUgYmVlbiByZWNvcmRlZCB3aXRoIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzo6b2NjbHVzaW9uUXVlcnlFbmFibGUgc2V0IHRvIFZLX1RSVUUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMDEwMikifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMDEwMyIsICJJZiBjb21tYW5kQnVmZmVyIGhhcyBhIFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OIHF1ZXJ5IGFjdGl2ZSwgdGhlbiBlYWNoIGVsZW1lbnQgb2YgcENvbW1hbmRCdWZmZXJzIG11c3QgaGF2ZSBiZWVuIHJlY29yZGVkIHdpdGggVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvOjpxdWVyeUZsYWdzIGhhdmluZyBhbGwgYml0cyBzZXQgdGhhdCBhcmUgc2V0IGZvciB0aGUgcXVlcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMDEwMykifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci0wMDEwNCIsICJJZiBjb21tYW5kQnVmZmVyIGhhcyBhIFZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUyBxdWVyeSBhY3RpdmUsIHRoZW4gZWFjaCBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyBtdXN0IGhhdmUgYmVlbiByZWNvcmRlZCB3aXRoIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbzo6cGlwZWxpbmVTdGF0aXN0aWNzIGhhdmluZyBhbGwgYml0cyBzZXQgdGhhdCBhcmUgc2V0IGluIHRoZSBWa1F1ZXJ5UG9vbCB0aGUgcXVlcnkgdXNlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMTA0KSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAxODIwIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gZWFjaCBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyBtdXN0IGJlIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAxODIwKSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAxODIxIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gZWFjaCBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyBtdXN0IGJlIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAxODIxKSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgdHJhbnNmZXIsIGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbWFuZEJ1ZmZlckNvdW50LWFycmF5bGVuZ3RoIiwgImNvbW1hbmRCdWZmZXJDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXJDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgY29tbWFuZEJ1ZmZlciwgYW5kIHRoZSBlbGVtZW50cyBvZiBwQ29tbWFuZEJ1ZmZlcnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbnRlbnRzLTAwMDk1IiwgIklmIHZrQ21kRXhlY3V0ZUNvbW1hbmRzIGlzIGJlaW5nIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhhdCByZW5kZXIgcGFzcyBpbnN0YW5jZSBtdXN0IGhhdmUgYmVlbiBiZWd1biB3aXRoIHRoZSBjb250ZW50cyBwYXJhbWV0ZXIgb2YgdmtDbWRCZWdpblJlbmRlclBhc3Mgc2V0IHRvIFZLX1NVQlBBU1NfQ09OVEVOVFNfU0VDT05EQVJZX0NPTU1BTkRfQlVGRkVSUyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb250ZW50cy0wMDA5NSkifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDg4IiwgIkVhY2ggZWxlbWVudCBvZiBwQ29tbWFuZEJ1ZmZlcnMgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggYSBsZXZlbCBvZiBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDg4KSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwODkiLCAiRWFjaCBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyBtdXN0IGJlIGluIHRoZSBwZW5kaW5nIG9yIGV4ZWN1dGFibGUgc3RhdGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA4OSkifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDkwIiwgIklmIGFueSBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyB3YXMgbm90IHJlY29yZGVkIHdpdGggdGhlIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUIGZsYWcsIGFuZCBpdCB3YXMgcmVjb3JkZWQgaW50byBhbnkgb3RoZXIgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlciwgdGhhdCBwcmltYXJ5IGNvbW1hbmQgYnVmZmVyIG11c3Qgbm90IGJlIGluIHRoZSBwZW5kaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5MCkifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDkxIiwgIklmIGFueSBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyB3YXMgbm90IHJlY29yZGVkIHdpdGggdGhlIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUIGZsYWcsIGl0IG11c3Qgbm90IGJlIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTEpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5MiIsICJJZiBhbnkgZWxlbWVudCBvZiBwQ29tbWFuZEJ1ZmZlcnMgd2FzIG5vdCByZWNvcmRlZCB3aXRoIHRoZSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCBmbGFnLCBpdCBtdXN0IG5vdCBoYXZlIGFscmVhZHkgYmVlbiByZWNvcmRlZCB0byBjb21tYW5kQnVmZmVyLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTIpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5MyIsICJJZiBhbnkgZWxlbWVudCBvZiBwQ29tbWFuZEJ1ZmZlcnMgd2FzIG5vdCByZWNvcmRlZCB3aXRoIHRoZSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCBmbGFnLCBpdCBtdXN0IG5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gcENvbW1hbmRCdWZmZXJzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTMpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5NCIsICJFYWNoIGVsZW1lbnQgb2YgcENvbW1hbmRCdWZmZXJzIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIGEgVmtDb21tYW5kUG9vbCB0aGF0IHdhcyBjcmVhdGVkIGZvciB0aGUgc2FtZSBxdWV1ZSBmYW1pbHkgYXMgdGhlIFZrQ29tbWFuZFBvb2wgZnJvbSB3aGljaCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDk0KSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTYiLCAiSWYgdmtDbWRFeGVjdXRlQ29tbWFuZHMgaXMgYmVpbmcgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCBlYWNoIGVsZW1lbnQgb2YgcENvbW1hbmRCdWZmZXJzIG11c3QgaGF2ZSBiZWVuIHJlY29yZGVkIHdpdGggdGhlIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTYpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5NyIsICJJZiB2a0NtZEV4ZWN1dGVDb21tYW5kcyBpcyBiZWluZyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIGVhY2ggZWxlbWVudCBvZiBwQ29tbWFuZEJ1ZmZlcnMgbXVzdCBoYXZlIGJlZW4gcmVjb3JkZWQgd2l0aCBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm86OnN1YnBhc3Mgc2V0IHRvIHRoZSBpbmRleCBvZiB0aGUgc3VicGFzcyB3aGljaCB0aGUgZ2l2ZW4gY29tbWFuZCBidWZmZXIgd2lsbCBiZSBleGVjdXRlZCBpbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAwOTcpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5OSIsICJJZiB2a0NtZEV4ZWN1dGVDb21tYW5kcyBpcyBiZWluZyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIGFuZCBhbnkgZWxlbWVudCBvZiBwQ29tbWFuZEJ1ZmZlcnMgd2FzIHJlY29yZGVkIHdpdGggVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvOjpmcmFtZWJ1ZmZlciBub3QgZXF1YWwgdG8gVktfTlVMTF9IQU5ETEUsIHRoYXQgVmtGcmFtZWJ1ZmZlciBtdXN0IG1hdGNoIHRoZSBWa0ZyYW1lYnVmZmVyIHVzZWQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDk5KSJ9LAorICAgIHsiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAxMDAiLCAiSWYgdmtDbWRFeGVjdXRlQ29tbWFuZHMgaXMgbm90IGJlaW5nIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgZWFjaCBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyBtdXN0IG5vdCBoYXZlIGJlZW4gcmVjb3JkZWQgd2l0aCB0aGUgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDEwMCkifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMTA1IiwgIkVhY2ggZWxlbWVudCBvZiBwQ29tbWFuZEJ1ZmZlcnMgbXVzdCBub3QgYmVnaW4gYW55IHF1ZXJ5IHR5cGVzIHRoYXQgYXJlIGFjdGl2ZSBpbiBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDEwNSkifSwKKyAgICB7IlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLXBhcmFtZXRlciIsICJwQ29tbWFuZEJ1ZmZlcnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY29tbWFuZEJ1ZmZlckNvdW50IHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBJbmhlcml0YW5jZUluZm8tMDAwOTgiLCAiSWYgdmtDbWRFeGVjdXRlQ29tbWFuZHMgaXMgYmVpbmcgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCB0aGUgcmVuZGVyIHBhc3NlcyBzcGVjaWZpZWQgaW4gdGhlIHBCZWdpbkluZm8tPnBJbmhlcml0YW5jZUluZm8tPnJlbmRlclBhc3MgbWVtYmVycyBvZiB0aGUgdmtCZWdpbkNvbW1hbmRCdWZmZXIgY29tbWFuZHMgdXNlZCB0byBiZWdpbiByZWNvcmRpbmcgZWFjaCBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcEluaGVyaXRhbmNlSW5mby0wMDA5OCkifSwKKyAgICB7IlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwMzAiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRmlsbEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDMwKSJ9LAorICAgIHsiVlVJRC12a0NtZEZpbGxCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxMSIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGRzdEJ1ZmZlciBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItMDE4MTEpIn0sCisgICAgeyJWVUlELXZrQ21kRmlsbEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAxODEyIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gZHN0QnVmZmVyIG11c3Qgbm90IGJlIGFuIHVucHJvdGVjdGVkIGJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEZpbGxCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxMikifSwKKyAgICB7IlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCB0cmFuc2ZlciwgZ3JhcGhpY3Mgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRmlsbEJ1ZmZlci1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kRmlsbEJ1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRmlsbEJ1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRmlsbEJ1ZmZlci1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCBkc3RCdWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEZpbGxCdWZmZXItY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZEZpbGxCdWZmZXItZHN0QnVmZmVyLTAwMDI5IiwgImRzdEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgdXNhZ2UgZmxhZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEZpbGxCdWZmZXItZHN0QnVmZmVyLTAwMDI5KSJ9LAorICAgIHsiVlVJRC12a0NtZEZpbGxCdWZmZXItZHN0QnVmZmVyLTAwMDMxIiwgIklmIGRzdEJ1ZmZlciBpcyBub24tc3BhcnNlIHRoZW4gaXQgbXVzdCBiZSBib3VuZCBjb21wbGV0ZWx5IGFuZCBjb250aWd1b3VzbHkgdG8gYSBzaW5nbGUgVmtEZXZpY2VNZW1vcnkgb2JqZWN0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RCdWZmZXItMDAwMzEpIn0sCisgICAgeyJWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RCdWZmZXItcGFyYW1ldGVyIiwgImRzdEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEZpbGxCdWZmZXItZHN0T2Zmc2V0LTAwMDI0IiwgImRzdE9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBkc3RCdWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRGaWxsQnVmZmVyLWRzdE9mZnNldC0wMDAyNCkifSwKKyAgICB7IlZVSUQtdmtDbWRGaWxsQnVmZmVyLWRzdE9mZnNldC0wMDAyNSIsICJkc3RPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRGaWxsQnVmZmVyLWRzdE9mZnNldC0wMDAyNSkifSwKKyAgICB7IlZVSUQtdmtDbWRGaWxsQnVmZmVyLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kRmlsbEJ1ZmZlci1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZEZpbGxCdWZmZXItc2l6ZS0wMDAyNiIsICJJZiBzaXplIGlzIG5vdCBlcXVhbCB0byBWS19XSE9MRV9TSVpFLCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRGaWxsQnVmZmVyLXNpemUtMDAwMjYpIn0sCisgICAgeyJWVUlELXZrQ21kRmlsbEJ1ZmZlci1zaXplLTAwMDI3IiwgIklmIHNpemUgaXMgbm90IGVxdWFsIHRvIFZLX1dIT0xFX1NJWkUsIHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgZHN0QnVmZmVyIG1pbnVzIGRzdE9mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEZpbGxCdWZmZXItc2l6ZS0wMDAyNykifSwKKyAgICB7IlZVSUQtdmtDbWRGaWxsQnVmZmVyLXNpemUtMDAwMjgiLCAiSWYgc2l6ZSBpcyBub3QgZXF1YWwgdG8gVktfV0hPTEVfU0laRSwgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEZpbGxCdWZmZXItc2l6ZS0wMDAyOCkifSwKKyAgICB7IlZVSUQtdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsSW5mby1wYXJhbWV0ZXIiLCAicExhYmVsSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGVidWdVdGlsc0xhYmVsRVhUIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWROZXh0U3VicGFzcy1Ob25lLTAwOTA5IiwgIlRoZSBjdXJyZW50IHN1YnBhc3MgaW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBzdWJwYXNzZXMgaW4gdGhlIHJlbmRlciBwYXNzIG1pbnVzIG9uZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzLU5vbmUtMDA5MDkpIn0sCisgICAgeyJWVUlELXZrQ21kTmV4dFN1YnBhc3MtTm9uZS0wMjM0OSIsICJUaGlzIGNvbW1hbmQgbXVzdCBub3QgYmUgcmVjb3JkZWQgd2hlbiB0cmFuc2Zvcm0gZmVlZGJhY2sgaXMgYWN0aXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kTmV4dFN1YnBhc3MtTm9uZS0wMjM0OSkifSwKKyAgICB7IlZVSUQtdmtDbWROZXh0U3VicGFzcy1idWZmZXJsZXZlbCIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSBwcmltYXJ5IFZrQ29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzLWJ1ZmZlcmxldmVsKSJ9LAorICAgIHsiVlVJRC12a0NtZE5leHRTdWJwYXNzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kTmV4dFN1YnBhc3MtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZE5leHRTdWJwYXNzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWROZXh0U3VicGFzcy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWROZXh0U3VicGFzcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZE5leHRTdWJwYXNzLWNvbnRlbnRzLXBhcmFtZXRlciIsICJjb250ZW50cyBtdXN0IGJlIGEgdmFsaWQgVmtTdWJwYXNzQ29udGVudHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWROZXh0U3VicGFzcy1jb250ZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kTmV4dFN1YnBhc3MtcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kTmV4dFN1YnBhc3MyS0hSLU5vbmUtMDIzNTAiLCAiVGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIHJlY29yZGVkIHdoZW4gdHJhbnNmb3JtIGZlZWRiYWNrIGlzIGFjdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1Ob25lLTAyMzUwKSJ9LAorICAgIHsiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1Ob25lLTAzMTAyIiwgIlRoZSBjdXJyZW50IHN1YnBhc3MgaW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBzdWJwYXNzZXMgaW4gdGhlIHJlbmRlciBwYXNzIG1pbnVzIG9uZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1Ob25lLTAzMTAyKSJ9LAorICAgIHsiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1idWZmZXJsZXZlbCIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSBwcmltYXJ5IFZrQ29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1idWZmZXJsZXZlbCkifSwKKyAgICB7IlZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kTmV4dFN1YnBhc3MyS0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItcFN1YnBhc3NCZWdpbkluZm8tcGFyYW1ldGVyIiwgInBTdWJwYXNzQmVnaW5JbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTdWJwYXNzQmVnaW5JbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1wU3VicGFzc0JlZ2luSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kTmV4dFN1YnBhc3MyS0hSLXBTdWJwYXNzRW5kSW5mby1wYXJhbWV0ZXIiLCAicFN1YnBhc3NFbmRJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTdWJwYXNzRW5kSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItcFN1YnBhc3NFbmRJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZE5leHRTdWJwYXNzMktIUi1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1idWZmZXJNZW1vcnlCYXJyaWVyQ291bnQtMDExNzgiLCAiSWYgdmtDbWRQaXBlbGluZUJhcnJpZXIgaXMgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudC0wMTE3OCkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IHRyYW5zZmVyLCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRlcGVuZGVuY3lGbGFncy0wMTE4NiIsICJJZiB2a0NtZFBpcGVsaW5lQmFycmllciBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCBkZXBlbmRlbmN5RmxhZ3MgbXVzdCBub3QgaW5jbHVkZSBWS19ERVBFTkRFTkNZX1ZJRVdfTE9DQUxfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRlcGVuZGVuY3lGbGFncy0wMTE4NikifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZGVwZW5kZW5jeUZsYWdzLXBhcmFtZXRlciIsICJkZXBlbmRlbmN5RmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRGVwZW5kZW5jeUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kZXBlbmRlbmN5RmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RBY2Nlc3NNYXNrLTAyODE2IiwgIlRoZSBkc3RBY2Nlc3NNYXNrIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcE1lbW9yeUJhcnJpZXJzIG11c3Qgb25seSBpbmNsdWRlIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBkc3RTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RBY2Nlc3NNYXNrLTAyODE2KSJ9LAorICAgIHsiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RTdGFnZU1hc2stMDExNjkiLCAiSWYgdGhlIGdlb21ldHJ5IHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0U3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RTdGFnZU1hc2stMDExNjkpIn0sCisgICAgeyJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMTE3MSIsICJJZiB0aGUgdGVzc2VsbGF0aW9uIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0U3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCBvciBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMTE3MSkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0U3RhZ2VNYXNrLTAyMTE3IiwgIklmIHRoZSBtZXNoIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0U3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMjExNykifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0U3RhZ2VNYXNrLTAyMTE4IiwgIklmIHRoZSB0YXNrIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0U3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMjExOCkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0U3RhZ2VNYXNrLXBhcmFtZXRlciIsICJkc3RTdGFnZU1hc2sgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RTdGFnZU1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwgImRzdFN0YWdlTWFzayBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWltYWdlLTAyNjM1IiwgIklmIHZrQ21kUGlwZWxpbmVCYXJyaWVyIGlzIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhlIGltYWdlIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwSW1hZ2VNZW1vcnlCYXJyaWVycyBtdXN0IGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUgZWxlbWVudHMgb2YgcEF0dGFjaG1lbnRzIHRoYXQgdGhlIGN1cnJlbnQgZnJhbWVidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCwgdGhhdCBpcyBhbHNvIHJlZmVycmVkIHRvIGJ5IG9uZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHBDb2xvckF0dGFjaG1lbnRzLCBwUmVzb2x2ZUF0dGFjaG1lbnRzIG9yIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IG1lbWJlcnMgb2YgdGhlIFZrU3VicGFzc0Rlc2NyaXB0aW9uIGluc3RhbmNlIG9yIGJ5IHRoZSBwRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgbWVtYmVyIG9mIHRoZSBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgc3RydWN0dXJlIHRoYXQgdGhlIGN1cnJlbnQgc3VicGFzcyB3YXMgY3JlYXRlZCB3aXRoIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWltYWdlLTAyNjM1KSJ9LAorICAgIHsiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1pbWFnZS0wMjYzNyIsICJJZiB2a0NtZFBpcGVsaW5lQmFycmllciBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSBpbWFnZSBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcEltYWdlTWVtb3J5QmFycmllcnMgbXVzdCBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIHBBdHRhY2htZW50cyB0aGF0IHRoZSBjdXJyZW50IGZyYW1lYnVmZmVyIHdhcyBjcmVhdGVkIHdpdGgsIHRoYXQgaXMgYWxzbyByZWZlcnJlZCB0byBieSBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBwQ29sb3JBdHRhY2htZW50cywgcFJlc29sdmVBdHRhY2htZW50cyBvciBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCBtZW1iZXJzIG9mIHRoZSBWa1N1YnBhc3NEZXNjcmlwdGlvbiBpbnN0YW5jZSB0aGF0IHRoZSBjdXJyZW50IHN1YnBhc3Mgd2FzIGNyZWF0ZWQgd2l0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1pbWFnZS0wMjYzNykifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItb2xkTGF5b3V0LTAxMTgxIiwgIklmIHZrQ21kUGlwZWxpbmVCYXJyaWVyIGlzIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhlIG9sZExheW91dCBhbmQgbmV3TGF5b3V0IG1lbWJlcnMgb2YgYW4gZWxlbWVudCBvZiBwSW1hZ2VNZW1vcnlCYXJyaWVycyBtdXN0IGJlIGVxdWFsIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLW9sZExheW91dC0wMTE4MSkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItb2xkTGF5b3V0LTAyNjM2IiwgIklmIHZrQ21kUGlwZWxpbmVCYXJyaWVyIGlzIGNhbGxlZCB3aXRoaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgdGhlIG9sZExheW91dCBhbmQgbmV3TGF5b3V0IG1lbWJlcnMgb2YgYW55IGVsZW1lbnQgb2YgcEltYWdlTWVtb3J5QmFycmllcnMgbXVzdCBiZSBlcXVhbCB0byB0aGUgbGF5b3V0IG1lbWJlciBvZiBhbiBlbGVtZW50IG9mIHRoZSBwQ29sb3JBdHRhY2htZW50cywgcFJlc29sdmVBdHRhY2htZW50cyBvciBwRGVwdGhTdGVuY2lsQXR0YWNobWVudCBtZW1iZXJzIG9mIHRoZSBWa1N1YnBhc3NEZXNjcmlwdGlvbiBpbnN0YW5jZSBvciBieSB0aGUgcERlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50IG1lbWJlciBvZiB0aGUgVmtTdWJwYXNzRGVzY3JpcHRpb25EZXB0aFN0ZW5jaWxSZXNvbHZlS0hSIHN0cnVjdHVyZSB0aGF0IHRoZSBjdXJyZW50IHN1YnBhc3Mgd2FzIGNyZWF0ZWQgd2l0aCwgdGhhdCByZWZlcnMgdG8gdGhlIHNhbWUgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItb2xkTGF5b3V0LTAyNjM2KSJ9LAorICAgIHsiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1vbGRMYXlvdXQtMDI2MzgiLCAiSWYgdmtDbWRQaXBlbGluZUJhcnJpZXIgaXMgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCB0aGUgb2xkTGF5b3V0IGFuZCBuZXdMYXlvdXQgbWVtYmVycyBvZiBhbnkgZWxlbWVudCBvZiBwSW1hZ2VNZW1vcnlCYXJyaWVycyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBsYXlvdXQgbWVtYmVyIG9mIGFuIGVsZW1lbnQgb2YgdGhlIHBDb2xvckF0dGFjaG1lbnRzLCBwUmVzb2x2ZUF0dGFjaG1lbnRzIG9yIHBEZXB0aFN0ZW5jaWxBdHRhY2htZW50IG1lbWJlcnMgb2YgdGhlIFZrU3VicGFzc0Rlc2NyaXB0aW9uIGluc3RhbmNlIHRoYXQgdGhlIGN1cnJlbnQgc3VicGFzcyB3YXMgY3JlYXRlZCB3aXRoLCB0aGF0IHJlZmVycyB0byB0aGUgc2FtZSBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1vbGRMYXlvdXQtMDI2MzgpIn0sCisgICAgeyJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBCdWZmZXJNZW1vcnlCYXJyaWVycy0wMjgxNyIsICJGb3IgYW55IGVsZW1lbnQgb2YgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpZiBpdHMgc3JjUXVldWVGYW1pbHlJbmRleCBhbmQgZHN0UXVldWVGYW1pbHlJbmRleCBtZW1iZXJzIGFyZSBlcXVhbCwgb3IgaWYgaXRzIHNyY1F1ZXVlRmFtaWx5SW5kZXggaXMgdGhlIHF1ZXVlIGZhbWlseSBpbmRleCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBwb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20sIHRoZW4gaXRzIHNyY0FjY2Vzc01hc2sgbWVtYmVyIG11c3Qgb25seSBjb250YWluIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBzcmNTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wQnVmZmVyTWVtb3J5QmFycmllcnMtMDI4MTcpIn0sCisgICAgeyJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBCdWZmZXJNZW1vcnlCYXJyaWVycy0wMjgxOCIsICJGb3IgYW55IGVsZW1lbnQgb2YgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpZiBpdHMgc3JjUXVldWVGYW1pbHlJbmRleCBhbmQgZHN0UXVldWVGYW1pbHlJbmRleCBtZW1iZXJzIGFyZSBlcXVhbCwgb3IgaWYgaXRzIGRzdFF1ZXVlRmFtaWx5SW5kZXggaXMgdGhlIHF1ZXVlIGZhbWlseSBpbmRleCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBwb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20sIHRoZW4gaXRzIGRzdEFjY2Vzc01hc2sgbWVtYmVyIG11c3Qgb25seSBjb250YWluIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBkc3RTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wQnVmZmVyTWVtb3J5QmFycmllcnMtMDI4MTgpIn0sCisgICAgeyJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBCdWZmZXJNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIiLCAiSWYgYnVmZmVyTWVtb3J5QmFycmllckNvdW50IGlzIG5vdCAwLCBwQnVmZmVyTWVtb3J5QmFycmllcnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYnVmZmVyTWVtb3J5QmFycmllckNvdW50IHZhbGlkIFZrQnVmZmVyTWVtb3J5QmFycmllciBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBCdWZmZXJNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBEZXBlbmRlbmNpZXMtMDIyODUiLCAiSWYgdmtDbWRQaXBlbGluZUJhcnJpZXIgaXMgY2FsbGVkIHdpdGhpbiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLCB0aGUgcmVuZGVyIHBhc3MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGF0IGxlYXN0IG9uZSBWa1N1YnBhc3NEZXBlbmRlbmN5IGluc3RhbmNlIGluIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm86OnBEZXBlbmRlbmNpZXMgdGhhdCBleHByZXNzZXMgYSBkZXBlbmRlbmN5IGZyb20gdGhlIGN1cnJlbnQgc3VicGFzcyB0byBpdHNlbGYsIGFuZCBmb3Igd2hpY2ggc3JjU3RhZ2VNYXNrIGNvbnRhaW5zIGEgc3Vic2V0IG9mIHRoZSBiaXQgdmFsdWVzIGluIFZrU3VicGFzc0RlcGVuZGVuY3k6OnNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrIGNvbnRhaW5zIGEgc3Vic2V0IG9mIHRoZSBiaXQgdmFsdWVzIGluIFZrU3VicGFzc0RlcGVuZGVuY3k6OmRzdFN0YWdlTWFzaywgZGVwZW5kZW5jeUZsYWdzIGlzIGVxdWFsIHRvIFZrU3VicGFzc0RlcGVuZGVuY3k6OmRlcGVuZGVuY3lGbGFncywgc3JjQWNjZXNzTWFzayBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBNZW1vcnlCYXJyaWVycyBhbmQgcEltYWdlTWVtb3J5QmFycmllcnMgY29udGFpbnMgYSBzdWJzZXQgb2YgdGhlIGJpdCB2YWx1ZXMgaW4gVmtTdWJwYXNzRGVwZW5kZW5jeTo6c3JjQWNjZXNzTWFzaywgYW5kIGRzdEFjY2Vzc01hc2sgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwTWVtb3J5QmFycmllcnMgYW5kIHBJbWFnZU1lbW9yeUJhcnJpZXJzIGNvbnRhaW5zIGEgc3Vic2V0IG9mIHRoZSBiaXQgdmFsdWVzIGluIFZrU3VicGFzc0RlcGVuZGVuY3k6OmRzdEFjY2Vzc01hc2sgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcEltYWdlTWVtb3J5QmFycmllcnMtMDI4MTkiLCAiRm9yIGFueSBlbGVtZW50IG9mIHBJbWFnZU1lbW9yeUJhcnJpZXJzLCBpZiBpdHMgc3JjUXVldWVGYW1pbHlJbmRleCBhbmQgZHN0UXVldWVGYW1pbHlJbmRleCBtZW1iZXJzIGFyZSBlcXVhbCwgb3IgaWYgaXRzIHNyY1F1ZXVlRmFtaWx5SW5kZXggaXMgdGhlIHF1ZXVlIGZhbWlseSBpbmRleCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBwb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20sIHRoZW4gaXRzIHNyY0FjY2Vzc01hc2sgbWVtYmVyIG11c3Qgb25seSBjb250YWluIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBzcmNTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wSW1hZ2VNZW1vcnlCYXJyaWVycy0wMjgxOSkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcEltYWdlTWVtb3J5QmFycmllcnMtMDI4MjAiLCAiRm9yIGFueSBlbGVtZW50IG9mIHBJbWFnZU1lbW9yeUJhcnJpZXJzLCBpZiBpdHMgc3JjUXVldWVGYW1pbHlJbmRleCBhbmQgZHN0UXVldWVGYW1pbHlJbmRleCBtZW1iZXJzIGFyZSBlcXVhbCwgb3IgaWYgaXRzIGRzdFF1ZXVlRmFtaWx5SW5kZXggaXMgdGhlIHF1ZXVlIGZhbWlseSBpbmRleCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBwb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20sIHRoZW4gaXRzIGRzdEFjY2Vzc01hc2sgbWVtYmVyIG11c3Qgb25seSBjb250YWluIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBkc3RTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wSW1hZ2VNZW1vcnlCYXJyaWVycy0wMjgyMCkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcEltYWdlTWVtb3J5QmFycmllcnMtcGFyYW1ldGVyIiwgIklmIGltYWdlTWVtb3J5QmFycmllckNvdW50IGlzIG5vdCAwLCBwSW1hZ2VNZW1vcnlCYXJyaWVycyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCB2YWxpZCBWa0ltYWdlTWVtb3J5QmFycmllciBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBJbWFnZU1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcE1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlciIsICJJZiBtZW1vcnlCYXJyaWVyQ291bnQgaXMgbm90IDAsIHBNZW1vcnlCYXJyaWVycyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBtZW1vcnlCYXJyaWVyQ291bnQgdmFsaWQgVmtNZW1vcnlCYXJyaWVyIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcE1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjQWNjZXNzTWFzay0wMjgxNSIsICJUaGUgc3JjQWNjZXNzTWFzayBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBNZW1vcnlCYXJyaWVycyBtdXN0IG9ubHkgaW5jbHVkZSBhY2Nlc3MgZmxhZ3MgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IG9uZSBvciBtb3JlIG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gc3JjU3RhZ2VNYXNrLCBhcyBzcGVjaWZpZWQgaW4gdGhlIHRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjQWNjZXNzTWFzay0wMjgxNSkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjUXVldWVGYW1pbHlJbmRleC0wMTE4MiIsICJJZiB2a0NtZFBpcGVsaW5lQmFycmllciBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSBzcmNRdWV1ZUZhbWlseUluZGV4IGFuZCBkc3RRdWV1ZUZhbWlseUluZGV4IG1lbWJlcnMgb2YgYW55IGVsZW1lbnQgb2YgcEltYWdlTWVtb3J5QmFycmllcnMgbXVzdCBiZSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNRdWV1ZUZhbWlseUluZGV4LTAxMTgyKSJ9LAorICAgIHsiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stMDExNjgiLCAiSWYgdGhlIGdlb21ldHJ5IHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stMDExNjgpIn0sCisgICAgeyJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMTE3MCIsICJJZiB0aGUgdGVzc2VsbGF0aW9uIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCBvciBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMTE3MCkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAxMTgzIiwgIkFueSBwaXBlbGluZSBzdGFnZSBpbmNsdWRlZCBpbiBzcmNTdGFnZU1hc2sgb3IgZHN0U3RhZ2VNYXNrIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHF1ZXVlIGZhbWlseSBzcGVjaWZpZWQgYnkgdGhlIHF1ZXVlRmFtaWx5SW5kZXggbWVtYmVyIG9mIHRoZSBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSwgYXMgc3BlY2lmaWVkIGluIHRoZSB0YWJsZSBvZiBzdXBwb3J0ZWQgcGlwZWxpbmUgc3RhZ2VzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMTE4MykifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAyMTE1IiwgIklmIHRoZSBtZXNoIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMjExNSkifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAyMTE2IiwgIklmIHRoZSB0YXNrIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMjExNikifSwKKyAgICB7IlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLXBhcmFtZXRlciIsICJzcmNTdGFnZU1hc2sgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwgInNyY1N0YWdlTWFzayBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELXZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFByb2Nlc3NDb21tYW5kc05WWC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYLXBQcm9jZXNzQ29tbWFuZHNJbmZvLXBhcmFtZXRlciIsICJwUHJvY2Vzc0NvbW1hbmRzSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQ21kUHJvY2Vzc0NvbW1hbmRzSW5mb05WWCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQcm9jZXNzQ29tbWFuZHNOVlgtcFByb2Nlc3NDb21tYW5kc0luZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFByb2Nlc3NDb21tYW5kc05WWC1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYLXJlbmRlcnBhc3MpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBjb21tYW5kQnVmZmVyLCBhbmQgbGF5b3V0IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLWxheW91dC1wYXJhbWV0ZXIiLCAibGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lTGF5b3V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hDb25zdGFudHMtbGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMDM2OCIsICJvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMDM2OCkifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMDM3MCIsICJvZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4UHVzaENvbnN0YW50c1NpemUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMDM3MCkifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMTc5NSIsICJGb3IgZWFjaCBieXRlIGluIHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgb2Zmc2V0IGFuZCBzaXplIGFuZCBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UgaW4gc3RhZ2VGbGFncywgdGhlcmUgbXVzdCBiZSBhIHB1c2ggY29uc3RhbnQgcmFuZ2UgaW4gbGF5b3V0IHRoYXQgaW5jbHVkZXMgdGhhdCBieXRlIGFuZCB0aGF0IHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTUpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTYiLCAiRm9yIGVhY2ggYnl0ZSBpbiB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IG9mZnNldCBhbmQgc2l6ZSBhbmQgZm9yIGVhY2ggcHVzaCBjb25zdGFudCByYW5nZSB0aGF0IG92ZXJsYXBzIHRoYXQgYnl0ZSwgc3RhZ2VGbGFncyBtdXN0IGluY2x1ZGUgYWxsIHN0YWdlcyBpbiB0aGF0IHB1c2ggY29uc3RhbnQgcmFuZ2UncyBWa1B1c2hDb25zdGFudFJhbmdlOjpzdGFnZUZsYWdzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTYpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1wVmFsdWVzLXBhcmFtZXRlciIsICJwVmFsdWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNpemUgYnl0ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXBWYWx1ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc2l6ZS0wMDM2OSIsICJzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaENvbnN0YW50cy1zaXplLTAwMzY5KSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc2l6ZS0wMDM3MSIsICJzaXplIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFB1c2hDb25zdGFudHNTaXplIG1pbnVzIG9mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc2l6ZS0wMDM3MSkifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXNpemUtYXJyYXlsZW5ndGgiLCAic2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaENvbnN0YW50cy1zaXplLWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc3RhZ2VGbGFncy1wYXJhbWV0ZXIiLCAic3RhZ2VGbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hDb25zdGFudHMtc3RhZ2VGbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1zdGFnZUZsYWdzLXJlcXVpcmVkYml0bWFzayIsICJzdGFnZUZsYWdzIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLXN0YWdlRmxhZ3MtcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCBsYXlvdXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1kZXNjcmlwdG9yV3JpdGVDb3VudC1hcnJheWxlbmd0aCIsICJkZXNjcmlwdG9yV3JpdGVDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItZGVzY3JpcHRvcldyaXRlQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItbGF5b3V0LXBhcmFtZXRlciIsICJsYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmVMYXlvdXQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItbGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1wRGVzY3JpcHRvcldyaXRlcy1wYXJhbWV0ZXIiLCAicERlc2NyaXB0b3JXcml0ZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVzY3JpcHRvcldyaXRlQ291bnQgdmFsaWQgVmtXcml0ZURlc2NyaXB0b3JTZXQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLXBEZXNjcmlwdG9yV3JpdGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1waXBlbGluZUJpbmRQb2ludC0wMDM2MyIsICJwaXBlbGluZUJpbmRQb2ludCBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgY29tbWFuZEJ1ZmZlcidzIHBhcmVudCBWa0NvbW1hbmRQb29sJ3MgcXVldWUgZmFtaWx5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItcGlwZWxpbmVCaW5kUG9pbnQtMDAzNjMpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyIiwgInBpcGVsaW5lQmluZFBvaW50IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lQmluZFBvaW50IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItcGlwZWxpbmVCaW5kUG9pbnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLXNldC0wMDM2NCIsICJzZXQgbXVzdCBiZSBsZXNzIHRoYW4gVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm86OnNldExheW91dENvdW50IHByb3ZpZGVkIHdoZW4gbGF5b3V0IHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItc2V0LTAwMzY0KSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLXNldC0wMDM2NSIsICJzZXQgbXVzdCBiZSB0aGUgdW5pcXVlIHNldCBudW1iZXIgaW4gdGhlIHBpcGVsaW5lIGxheW91dCB0aGF0IHVzZXMgYSBkZXNjcmlwdG9yIHNldCBsYXlvdXQgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1zZXQtMDAzNjUpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItY29tbWFuZEJ1ZmZlci0wMDM2NiIsICJUaGUgcGlwZWxpbmVCaW5kUG9pbnQgc3BlY2lmaWVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIGRlc2NyaXB0b3IgdXBkYXRlIHRlbXBsYXRlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb21tYW5kQnVmZmVyJ3MgcGFyZW50IFZrQ29tbWFuZFBvb2wncyBxdWV1ZSBmYW1pbHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1jb21tYW5kQnVmZmVyLTAwMzY2KSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWNvbW1vbnBhcmVudCIsICJFYWNoIG9mIGNvbW1hbmRCdWZmZXIsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgYW5kIGxheW91dCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJhbWV0ZXIiLCAiZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWxheW91dC1wYXJhbWV0ZXIiLCAibGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lTGF5b3V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWxheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItcERhdGEtMDE2ODYiLCAicERhdGEgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBtZW1vcnkgY29udGFpbmluZyBvbmUgb3IgbW9yZSB2YWxpZCBpbnN0YW5jZXMgb2YgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLCBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvLCBvciBWa0J1ZmZlclZpZXcgaW4gYSBsYXlvdXQgZGVmaW5lZCBieSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgd2hlbiBpdCB3YXMgY3JlYXRlZCB3aXRoIHZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItcERhdGEtMDE2ODYpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtYnVmZmVybGV2ZWwiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgc2Vjb25kYXJ5IFZrQ29tbWFuZEJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWJ1ZmZlcmxldmVsKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItMDEzMjkiLCAiVGhlIHByb3ZpZGVkIGNvbW1hbmRCdWZmZXIgbXVzdCBub3QgaGF2ZSBoYWQgYSBwcmlvciBzcGFjZSByZXNlcnZhdGlvbiBzaW5jZSBpdHMgY3JlYXRpb24gb3IgdGhlIGxhc3QgcmVzZXQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci0wMTMyOSkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWC1jb21tYW5kQnVmZmVyLTAxMzMwIiwgIlRoZSBzdGF0ZSBvZiB0aGUgY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGxlZ2FsIHRvIGV4ZWN1dGUgYWxsIGNvbW1hbmRzIHdpdGhpbiB0aGUgc2VxdWVuY2UgcHJvdmlkZWQgYnkgdGhlIGluZGlyZWN0Q29tbWFuZHNMYXlvdXQgbWVtYmVyIG9mIHBQcm9jZXNzQ29tbWFuZHNJbmZvLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItMDEzMzApIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtcFJlc2VydmVTcGFjZUluZm8tcGFyYW1ldGVyIiwgInBSZXNlcnZlU3BhY2VJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc0luZm9OVlggc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXJ2ZVNwYWNlRm9yQ29tbWFuZHNOVlgtcFJlc2VydmVTcGFjZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWC1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2V0RXZlbnQtY29tbWFuZEJ1ZmZlci0wMTE1NyIsICJjb21tYW5kQnVmZmVyJ3MgY3VycmVudCBkZXZpY2UgbWFzayBtdXN0IGluY2x1ZGUgZXhhY3RseSBvbmUgcGh5c2ljYWwgZGV2aWNlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc2V0RXZlbnQtY29tbWFuZEJ1ZmZlci0wMTE1NykifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldEV2ZW50LWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXRFdmVudC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldEV2ZW50LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldEV2ZW50LWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCBldmVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXRFdmVudC1ldmVudC0wMTE1NiIsICJXaGVuIHRoaXMgY29tbWFuZCBleGVjdXRlcywgZXZlbnQgbXVzdCBub3QgYmUgd2FpdGVkIG9uIGJ5IGEgdmtDbWRXYWl0RXZlbnRzIGNvbW1hbmQgdGhhdCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1ldmVudC0wMTE1NikifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldEV2ZW50LWV2ZW50LXBhcmFtZXRlciIsICJldmVudCBtdXN0IGJlIGEgdmFsaWQgVmtFdmVudCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNldEV2ZW50LWV2ZW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldEV2ZW50LXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLTAxMTUzIiwgInN0YWdlTWFzayBtdXN0IG5vdCBpbmNsdWRlIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDExNTMpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDExNTQiLCAiSWYgdGhlIGdlb21ldHJ5IHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLTAxMTU0KSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLTAxMTU1IiwgIklmIHRoZSB0ZXNzZWxsYXRpb24gc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBzdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUIG9yIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNldEV2ZW50LXN0YWdlTWFzay0wMTE1NSkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldEV2ZW50LXN0YWdlTWFzay0wMjEwOSIsICJJZiB0aGUgbWVzaCBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLTAyMTA5KSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLTAyMTEwIiwgIklmIHRoZSB0YXNrIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDIxMTApIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stcGFyYW1ldGVyIiwgInN0YWdlTWFzayBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzayIsICJzdGFnZU1hc2sgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc2V0RXZlbnQtc3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRRdWVyeVBvb2wtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXRRdWVyeVBvb2wtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBjb21tYW5kQnVmZmVyLCBhbmQgcXVlcnlQb29sIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzZXRRdWVyeVBvb2wtZmlyc3RRdWVyeS0wMDc5NiIsICJmaXJzdFF1ZXJ5IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiBxdWVyeVBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1maXJzdFF1ZXJ5LTAwNzk2KSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLWZpcnN0UXVlcnktMDA3OTciLCAiVGhlIHN1bSBvZiBmaXJzdFF1ZXJ5IGFuZCBxdWVyeUNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcXVlcmllcyBpbiBxdWVyeVBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1maXJzdFF1ZXJ5LTAwNzk3KSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAicXVlcnlQb29sIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXJ5UG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1xdWVyeVBvb2wtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc2V0UXVlcnlQb29sLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzZXRRdWVyeVBvb2wtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgzNyIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIHNyY0ltYWdlIG11c3Qgbm90IGJlIGEgcHJvdGVjdGVkIGltYWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWNvbW1hbmRCdWZmZXItMDE4MzcpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWNvbW1hbmRCdWZmZXItMDE4MzgiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhbiB1bnByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgdGhlbiBkc3RJbWFnZSBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBpbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tYW5kQnVmZmVyLTAxODM4KSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tYW5kQnVmZmVyLTAxODM5IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHRoZW4gZHN0SW1hZ2UgbXVzdCBub3QgYmUgYW4gdW5wcm90ZWN0ZWQgaW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbWFuZEJ1ZmZlci0wMTgzOSkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtY29tbW9ucGFyZW50IiwgIkVhY2ggb2YgY29tbWFuZEJ1ZmZlciwgZHN0SW1hZ2UsIGFuZCBzcmNJbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2UtMDAyNTgiLCAiSWYgZHN0SW1hZ2UgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZS0wMDI1OCkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2UtMDAyNTkiLCAiZHN0SW1hZ2UgbXVzdCBoYXZlIGEgc2FtcGxlIGNvdW50IGVxdWFsIHRvIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZS0wMDI1OSkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2UtMDIwMDMiLCAiVGhlIGZvcm1hdCBmZWF0dXJlcyBvZiBkc3RJbWFnZSBtdXN0IGNvbnRhaW4gVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlLTAyMDAzKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZS0wMjU0NiIsICJkc3RJbWFnZSBhbmQgc3JjSW1hZ2UgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBmbGFncyBjb250YWluaW5nIFZLX0lNQUdFX0NSRUFURV9TVUJTQU1QTEVEX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2UtMDI1NDYpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlLXBhcmFtZXRlciIsICJkc3RJbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZUxheW91dC0wMDI2MiIsICJkc3RJbWFnZUxheW91dCBtdXN0IHNwZWNpZnkgdGhlIGxheW91dCBvZiB0aGUgaW1hZ2Ugc3VicmVzb3VyY2VzIG9mIGRzdEltYWdlIHNwZWNpZmllZCBpbiBwUmVnaW9ucyBhdCB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgb24gYSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZUxheW91dC0wMDI2MikifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAyNjMiLCAiZHN0SW1hZ2VMYXlvdXQgbXVzdCBiZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwgb3IgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAyNjMpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlTGF5b3V0LTAxNDAxIiwgImRzdEltYWdlTGF5b3V0IG11c3QgYmUgVktfSU1BR0VfTEFZT1VUX1NIQVJFRF9QUkVTRU5UX0tIUiwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIG9yIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlTGF5b3V0LTAxNDAxKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RJbWFnZUxheW91dC1wYXJhbWV0ZXIiLCAiZHN0SW1hZ2VMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VMYXlvdXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0SW1hZ2VMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RTdWJyZXNvdXJjZS0wMTcxMCIsICJUaGUgZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWlwTGV2ZWxzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIGRzdEltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdFN1YnJlc291cmNlLTAxNzEwKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RTdWJyZXNvdXJjZS0wMTcxMiIsICJUaGUgZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgKyBkc3RTdWJyZXNvdXJjZS5sYXllckNvdW50IG9mIGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYXJyYXlMYXllcnMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gZHN0SW1hZ2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE3MTIpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXBSZWdpb25zLTAwMjUzIiwgIlRoZSBzb3VyY2UgcmVnaW9uIHNwZWNpZmllZCBieSBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBhIHJlZ2lvbiB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gc3JjSW1hZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcFJlZ2lvbnMtMDAyNTMpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXBSZWdpb25zLTAwMjU0IiwgIlRoZSBkZXN0aW5hdGlvbiByZWdpb24gc3BlY2lmaWVkIGJ5IGVhY2ggZWxlbWVudCBvZiBwUmVnaW9ucyBtdXN0IGJlIGEgcmVnaW9uIHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiBkc3RJbWFnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1wUmVnaW9ucy0wMDI1NCkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcFJlZ2lvbnMtMDAyNTUiLCAiVGhlIHVuaW9uIG9mIGFsbCBzb3VyY2UgcmVnaW9ucywgYW5kIHRoZSB1bmlvbiBvZiBhbGwgZGVzdGluYXRpb24gcmVnaW9ucywgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50cyBvZiBwUmVnaW9ucywgbXVzdCBub3Qgb3ZlcmxhcCBpbiBtZW1vcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcFJlZ2lvbnMtMDAyNTUpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXBSZWdpb25zLXBhcmFtZXRlciIsICJwUmVnaW9ucyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiByZWdpb25Db3VudCB2YWxpZCBWa0ltYWdlUmVzb2x2ZSBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXBSZWdpb25zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcmVnaW9uQ291bnQtYXJyYXlsZW5ndGgiLCAicmVnaW9uQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1yZWdpb25Db3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2UtMDAyNTYiLCAiSWYgc3JjSW1hZ2UgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZS0wMDI1NikifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2UtMDAyNTciLCAic3JjSW1hZ2UgbXVzdCBoYXZlIGEgc2FtcGxlIGNvdW50IGVxdWFsIHRvIGFueSB2YWxpZCBzYW1wbGUgY291bnQgdmFsdWUgb3RoZXIgdGhhbiBWS19TQU1QTEVfQ09VTlRfMV9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2UtMDAyNTcpIn0sCisgICAgeyJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlLTAxMzg2IiwgInNyY0ltYWdlIGFuZCBkc3RJbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIHNhbWUgaW1hZ2UgZm9ybWF0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlLTAxMzg2KSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZS1wYXJhbWV0ZXIiLCAic3JjSW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDAyNjAiLCAic3JjSW1hZ2VMYXlvdXQgbXVzdCBzcGVjaWZ5IHRoZSBsYXlvdXQgb2YgdGhlIGltYWdlIHN1YnJlc291cmNlcyBvZiBzcmNJbWFnZSBzcGVjaWZpZWQgaW4gcFJlZ2lvbnMgYXQgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIG9uIGEgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDAyNjApIn0sCisgICAgeyJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMjYxIiwgInNyY0ltYWdlTGF5b3V0IG11c3QgYmUgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMIG9yIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlTGF5b3V0LTAwMjYxKSJ9LAorICAgIHsiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZUxheW91dC0wMTQwMCIsICJzcmNJbWFnZUxheW91dCBtdXN0IGJlIFZLX0lNQUdFX0xBWU9VVF9TSEFSRURfUFJFU0VOVF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCBvciBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZUxheW91dC0wMTQwMCkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjSW1hZ2VMYXlvdXQtcGFyYW1ldGVyIiwgInNyY0ltYWdlTGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlTGF5b3V0IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY0ltYWdlTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjU3VicmVzb3VyY2UtMDE3MDkiLCAiVGhlIHNyY1N1YnJlc291cmNlLm1pcExldmVsIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG1pcExldmVscyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBzcmNJbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTcwOSkifSwKKyAgICB7IlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2Utc3JjU3VicmVzb3VyY2UtMDE3MTEiLCAiVGhlIHNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyICsgc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCBvZiBlYWNoIGVsZW1lbnQgb2YgcFJlZ2lvbnMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFycmF5TGF5ZXJzIHNwZWNpZmllZCBpbiBWa0ltYWdlQ3JlYXRlSW5mbyB3aGVuIHNyY0ltYWdlIHdhcyBjcmVhdGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY1N1YnJlc291cmNlLTAxNzExKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldEJsZW5kQ29uc3RhbnRzLU5vbmUtMDA2MTIiLCAiVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfRFlOQU1JQ19TVEFURV9CTEVORF9DT05TVEFOVFMgZHluYW1pYyBzdGF0ZSBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0QmxlbmRDb25zdGFudHMtTm9uZS0wMDYxMikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRCbGVuZENvbnN0YW50cy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEJsZW5kQ29uc3RhbnRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRCbGVuZENvbnN0YW50cy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0QmxlbmRDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0QmxlbmRDb25zdGFudHMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRCbGVuZENvbnN0YW50cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRDaGVja3BvaW50TlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBjb21wdXRlLCBvciB0cmFuc2ZlciBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Q2hlY2twb2ludE5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRDaGVja3BvaW50TlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldENoZWNrcG9pbnROVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRDaGVja3BvaW50TlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRDaGVja3BvaW50TlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVi1wQ3VzdG9tU2FtcGxlT3JkZXJzLTAyMjM1IiwgIlRoZSBhcnJheSBwQ3VzdG9tU2FtcGxlT3JkZXJzIG11c3Qgbm90IGNvbnRhaW4gdHdvIHN0cnVjdHVyZXMgd2l0aCBtYXRjaGluZyB2YWx1ZXMgZm9yIGJvdGggdGhlIHNoYWRpbmdSYXRlIGFuZCBzYW1wbGVDb3VudCBtZW1iZXJzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtcEN1c3RvbVNhbXBsZU9yZGVycy0wMjIzNSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WLXBDdXN0b21TYW1wbGVPcmRlcnMtcGFyYW1ldGVyIiwgIklmIGN1c3RvbVNhbXBsZU9yZGVyQ291bnQgaXMgbm90IDAsIHBDdXN0b21TYW1wbGVPcmRlcnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCB2YWxpZCBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldENvYXJzZVNhbXBsZU9yZGVyTlYtcEN1c3RvbVNhbXBsZU9yZGVycy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVi1zYW1wbGVPcmRlclR5cGUtMDIwODEiLCAiSWYgc2FtcGxlT3JkZXJUeXBlIGlzIG5vdCBWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfQ1VTVE9NX05WLCBjdXN0b21TYW1wbGVyT3JkZXJDb3VudCBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WLXNhbXBsZU9yZGVyVHlwZS0wMjA4MSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WLXNhbXBsZU9yZGVyVHlwZS1wYXJhbWV0ZXIiLCAic2FtcGxlT3JkZXJUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0NvYXJzZVNhbXBsZU9yZGVyVHlwZU5WIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVi1zYW1wbGVPcmRlclR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERlcHRoQmlhcy1Ob25lLTAwNzg5IiwgIlRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0RZTkFNSUNfU1RBVEVfREVQVEhfQklBUyBkeW5hbWljIHN0YXRlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREZXB0aEJpYXMtTm9uZS0wMDc4OSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXREZXB0aEJpYXMtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREZXB0aEJpYXMtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERlcHRoQmlhcy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RGVwdGhCaWFzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERlcHRoQmlhcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERlcHRoQmlhcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXREZXB0aEJpYXMtZGVwdGhCaWFzQ2xhbXAtMDA3OTAiLCAiSWYgdGhlIGRlcHRoIGJpYXMgY2xhbXBpbmcgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZGVwdGhCaWFzQ2xhbXAgbXVzdCBiZSAwLjAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREZXB0aEJpYXMtZGVwdGhCaWFzQ2xhbXAtMDA3OTApIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGVwdGhCb3VuZHMtTm9uZS0wMDU5OSIsICJUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUyBkeW5hbWljIHN0YXRlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREZXB0aEJvdW5kcy1Ob25lLTAwNTk5KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RGVwdGhCb3VuZHMtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREZXB0aEJvdW5kcy1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXREZXB0aEJvdW5kcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERlcHRoQm91bmRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLW1heERlcHRoQm91bmRzLTAwNjAxIiwgIlVubGVzcyB0aGUgVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCBleHRlbnNpb24gaXMgZW5hYmxlZCBtYXhEZXB0aEJvdW5kcyBtdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjAsIGluY2x1c2l2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERlcHRoQm91bmRzLW1heERlcHRoQm91bmRzLTAwNjAxKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLW1heERlcHRoQm91bmRzLTAyNTA5IiwgIm1heERlcHRoQm91bmRzIG11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RGVwdGhCb3VuZHMtbWF4RGVwdGhCb3VuZHMtMDI1MDkpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGVwdGhCb3VuZHMtbWluRGVwdGhCb3VuZHMtMDA2MDAiLCAiVW5sZXNzIHRoZSBWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkIGV4dGVuc2lvbiBpcyBlbmFibGVkIG1pbkRlcHRoQm91bmRzIG11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCwgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RGVwdGhCb3VuZHMtbWluRGVwdGhCb3VuZHMtMDA2MDApIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGVwdGhCb3VuZHMtbWluRGVwdGhCb3VuZHMtMDI1MDgiLCAibWluRGVwdGhCb3VuZHMgbXVzdCBiZSBiZXR3ZWVuIDAuMCBhbmQgMS4wLCBpbmNsdXNpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREZXB0aEJvdW5kcy1taW5EZXB0aEJvdW5kcy0wMjUwOCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcywgY29tcHV0ZSwgb3IgdHJhbnNmZXIgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERldmljZU1hc2stY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERldmljZU1hc2stY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERldmljZU1hc2stY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGV2aWNlTWFzay1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERldmljZU1hc2stY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGV2aWNlTWFzay1kZXZpY2VNYXNrLTAwMTA4IiwgImRldmljZU1hc2sgbXVzdCBiZSBhIHZhbGlkIGRldmljZSBtYXNrIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RGV2aWNlTWFzay1kZXZpY2VNYXNrLTAwMTA4KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERldmljZU1hc2stZGV2aWNlTWFzay0wMDEwOSIsICJkZXZpY2VNYXNrIG11c3Qgbm90IGJlIHplcm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWRldmljZU1hc2stMDAxMDkpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGV2aWNlTWFzay1kZXZpY2VNYXNrLTAwMTEwIiwgImRldmljZU1hc2sgbXVzdCBub3QgaW5jbHVkZSBhbnkgc2V0IGJpdHMgdGhhdCB3ZXJlIG5vdCBpbiB0aGUgVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm86OmRldmljZU1hc2sgdmFsdWUgd2hlbiB0aGUgY29tbWFuZCBidWZmZXIgYmVnYW4gcmVjb3JkaW5nLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERldmljZU1hc2stZGV2aWNlTWFzay0wMDExMCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWRldmljZU1hc2stMDAxMTEiLCAiSWYgdmtDbWRTZXREZXZpY2VNYXNrIGlzIGNhbGxlZCBpbnNpZGUgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSwgZGV2aWNlTWFzayBtdXN0IG5vdCBpbmNsdWRlIGFueSBzZXQgYml0cyB0aGF0IHdlcmUgbm90IGluIHRoZSBWa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mbzo6ZGV2aWNlTWFzayB2YWx1ZSB3aGVuIHRoZSByZW5kZXIgcGFzcyBpbnN0YW5jZSBiZWdhbiByZWNvcmRpbmcuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RGV2aWNlTWFzay1kZXZpY2VNYXNrLTAwMTExKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQtTm9uZS0wMDU4MyIsICJUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19EWU5BTUlDX1NUQVRFX0RJU0NBUkRfUkVDVEFOR0xFX0VYVCBkeW5hbWljIHN0YXRlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULU5vbmUtMDA1ODMpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1kaXNjYXJkUmVjdGFuZ2xlQ291bnQtYXJyYXlsZW5ndGgiLCAiZGlzY2FyZFJlY3RhbmdsZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULWRpc2NhcmRSZWN0YW5nbGVDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULWZpcnN0RGlzY2FyZFJlY3RhbmdsZS0wMDU4NSIsICJUaGUgc3VtIG9mIGZpcnN0RGlzY2FyZFJlY3RhbmdsZSBhbmQgZGlzY2FyZFJlY3RhbmdsZUNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VEaXNjYXJkUmVjdGFuZ2xlUHJvcGVydGllc0VYVDo6bWF4RGlzY2FyZFJlY3RhbmdsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULWZpcnN0RGlzY2FyZFJlY3RhbmdsZS0wMDU4NSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULW9mZnNldC0wMDU4OCIsICJFdmFsdWF0aW9uIG9mIChvZmZzZXQueCArIGV4dGVudC53aWR0aCkgaW4gZWFjaCBWa1JlY3QyRCBlbGVtZW50IG9mIHBEaXNjYXJkUmVjdGFuZ2xlcyBtdXN0IG5vdCBjYXVzZSBhIHNpZ25lZCBpbnRlZ2VyIGFkZGl0aW9uIG92ZXJmbG93IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1vZmZzZXQtMDA1ODgpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1vZmZzZXQtMDA1ODkiLCAiRXZhbHVhdGlvbiBvZiAob2Zmc2V0LnkgKyBleHRlbnQuaGVpZ2h0KSBpbiBlYWNoIFZrUmVjdDJEIGVsZW1lbnQgb2YgcERpc2NhcmRSZWN0YW5nbGVzIG11c3Qgbm90IGNhdXNlIGEgc2lnbmVkIGludGVnZXIgYWRkaXRpb24gb3ZlcmZsb3cgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULW9mZnNldC0wMDU4OSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULXBEaXNjYXJkUmVjdGFuZ2xlcy1wYXJhbWV0ZXIiLCAicERpc2NhcmRSZWN0YW5nbGVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRpc2NhcmRSZWN0YW5nbGVDb3VudCBWa1JlY3QyRCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RGlzY2FyZFJlY3RhbmdsZUVYVC1wRGlzY2FyZFJlY3RhbmdsZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQteC0wMDU4NyIsICJUaGUgeCBhbmQgeSBtZW1iZXIgb2Ygb2Zmc2V0IGluIGVhY2ggVmtSZWN0MkQgZWxlbWVudCBvZiBwRGlzY2FyZFJlY3RhbmdsZXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQteC0wMDU4NykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFdmVudC1jb21tYW5kQnVmZmVyLTAxMTUyIiwgImNvbW1hbmRCdWZmZXIncyBjdXJyZW50IGRldmljZSBtYXNrIG11c3QgaW5jbHVkZSBleGFjdGx5IG9uZSBwaHlzaWNhbCBkZXZpY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXZlbnQtY29tbWFuZEJ1ZmZlci0wMTE1MikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFdmVudC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEV2ZW50LWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFdmVudC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXZlbnQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RXZlbnQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRFdmVudC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFdmVudC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBjb21tYW5kQnVmZmVyLCBhbmQgZXZlbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEV2ZW50LWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFdmVudC1ldmVudC1wYXJhbWV0ZXIiLCAiZXZlbnQgbXVzdCBiZSBhIHZhbGlkIFZrRXZlbnQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldEV2ZW50LXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXZlbnQtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDExNDkiLCAic3RhZ2VNYXNrIG11c3Qgbm90IGluY2x1ZGUgVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDExNDkpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLTAxMTUwIiwgIklmIHRoZSBnZW9tZXRyeSBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDExNTApIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLTAxMTUxIiwgIklmIHRoZSB0ZXNzZWxsYXRpb24gc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBzdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9TSEFERVJfQklUIG9yIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDExNTEpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLTAyMTA3IiwgIklmIHRoZSBtZXNoIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLTAyMTA3KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldEV2ZW50LXN0YWdlTWFzay0wMjEwOCIsICJJZiB0aGUgdGFzayBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEV2ZW50LXN0YWdlTWFzay0wMjEwOCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stcGFyYW1ldGVyIiwgInN0YWdlTWFzayBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwgInN0YWdlTWFzayBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXZlbnQtc3RhZ2VNYXNrLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtTm9uZS0wMjAzMSIsICJUaGUgZXhjbHVzaXZlIHNjaXNzb3IgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLU5vbmUtMDIwMzEpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLU5vbmUtMDIwMzIiLCAiVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfRFlOQU1JQ19TVEFURV9FWENMVVNJVkVfU0NJU1NPUl9OViBkeW5hbWljIHN0YXRlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtTm9uZS0wMjAzMikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDM2IiwgIklmIHRoZSBtdWx0aXBsZSB2aWV3cG9ydHMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZXhjbHVzaXZlU2Npc3NvckNvdW50IG11c3QgYmUgMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1leGNsdXNpdmVTY2lzc29yQ291bnQtMDIwMzYpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWV4Y2x1c2l2ZVNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCIsICJleGNsdXNpdmVTY2lzc29yQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1leGNsdXNpdmVTY2lzc29yQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWZpcnN0RXhjbHVzaXZlU2Npc3Nvci0wMjAzMyIsICJmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IgbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Vmlld3BvcnRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWZpcnN0RXhjbHVzaXZlU2Npc3Nvci0wMjAzMykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZmlyc3RFeGNsdXNpdmVTY2lzc29yLTAyMDM0IiwgIlRoZSBzdW0gb2YgZmlyc3RFeGNsdXNpdmVTY2lzc29yIGFuZCBleGNsdXNpdmVTY2lzc29yQ291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cywgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWZpcnN0RXhjbHVzaXZlU2Npc3Nvci0wMjAzNCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZmlyc3RFeGNsdXNpdmVTY2lzc29yLTAyMDM1IiwgIklmIHRoZSBtdWx0aXBsZSB2aWV3cG9ydHMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmlyc3RFeGNsdXNpdmVTY2lzc29yIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1maXJzdEV4Y2x1c2l2ZVNjaXNzb3ItMDIwMzUpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLW9mZnNldC0wMjAzOCIsICJFdmFsdWF0aW9uIG9mIChvZmZzZXQueCArIGV4dGVudC53aWR0aCkgZm9yIGVhY2ggbWVtYmVyIG9mIHBFeGNsdXNpdmVTY2lzc29ycyBtdXN0IG5vdCBjYXVzZSBhIHNpZ25lZCBpbnRlZ2VyIGFkZGl0aW9uIG92ZXJmbG93IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLW9mZnNldC0wMjAzOCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtb2Zmc2V0LTAyMDM5IiwgIkV2YWx1YXRpb24gb2YgKG9mZnNldC55ICsgZXh0ZW50LmhlaWdodCkgZm9yIGVhY2ggbWVtYmVyIG9mIHBFeGNsdXNpdmVTY2lzc29ycyBtdXN0IG5vdCBjYXVzZSBhIHNpZ25lZCBpbnRlZ2VyIGFkZGl0aW9uIG92ZXJmbG93IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLW9mZnNldC0wMjAzOSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtcEV4Y2x1c2l2ZVNjaXNzb3JzLXBhcmFtZXRlciIsICJwRXhjbHVzaXZlU2Npc3NvcnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZXhjbHVzaXZlU2Npc3NvckNvdW50IFZrUmVjdDJEIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtcEV4Y2x1c2l2ZVNjaXNzb3JzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYteC0wMjAzNyIsICJUaGUgeCBhbmQgeSBtZW1iZXJzIG9mIG9mZnNldCBpbiBlYWNoIG1lbWJlciBvZiBwRXhjbHVzaXZlU2Npc3NvcnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi14LTAyMDM3KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldExpbmVTdGlwcGxlRVhULU5vbmUtMDI3NzUiLCAiVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfRFlOQU1JQ19TVEFURV9MSU5FX1NUSVBQTEVfRVhUIGR5bmFtaWMgc3RhdGUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldExpbmVTdGlwcGxlRVhULU5vbmUtMDI3NzUpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0TGluZVN0aXBwbGVFWFQtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRMaW5lU3RpcHBsZUVYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0TGluZVN0aXBwbGVFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldExpbmVTdGlwcGxlRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldExpbmVTdGlwcGxlRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0TGluZVN0aXBwbGVFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0TGluZVN0aXBwbGVFWFQtbGluZVN0aXBwbGVGYWN0b3ItMDI3NzYiLCAibGluZVN0aXBwbGVGYWN0b3IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzEsMjU2XSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldExpbmVTdGlwcGxlRVhULWxpbmVTdGlwcGxlRmFjdG9yLTAyNzc2KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldExpbmVXaWR0aC1Ob25lLTAwNzg3IiwgIlRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0RZTkFNSUNfU1RBVEVfTElORV9XSURUSCBkeW5hbWljIHN0YXRlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtTm9uZS0wMDc4NykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldExpbmVXaWR0aC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0TGluZVdpZHRoLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldExpbmVXaWR0aC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldExpbmVXaWR0aC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtbGluZVdpZHRoLTAwNzg4IiwgIklmIHRoZSB3aWRlIGxpbmVzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGxpbmVXaWR0aCBtdXN0IGJlIDEuMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldExpbmVXaWR0aC1saW5lV2lkdGgtMDA3ODgpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIGNvbXB1dGUsIG9yIHRyYW5zZmVyIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlTWFya2VySU5URUwtcE1hcmtlckluZm8tcGFyYW1ldGVyIiwgInBNYXJrZXJJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtQZXJmb3JtYW5jZU1hcmtlckluZm9JTlRFTCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMLXBNYXJrZXJJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzLCBjb21wdXRlLCBvciB0cmFuc2ZlciBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VPdmVycmlkZUlOVEVMLXBPdmVycmlkZUluZm8tMDI3MzYiLCAicE92ZXJyaWRlSW5mbyBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYSBWa1BlcmZvcm1hbmNlT3ZlcnJpZGVUeXBlSU5URUwgdGhhdCBpcyBub3QgcmVwb3J0ZWQgYXZhaWxhYmxlIGJ5IHZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtcE92ZXJyaWRlSW5mby0wMjczNikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtcE92ZXJyaWRlSW5mby1wYXJhbWV0ZXIiLCAicE92ZXJyaWRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrUGVyZm9ybWFuY2VPdmVycmlkZUluZm9JTlRFTCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtcE92ZXJyaWRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0UGVyZm9ybWFuY2VTdHJlYW1NYXJrZXJJTlRFTC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIGNvbXB1dGUsIG9yIHRyYW5zZmVyIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwtcE1hcmtlckluZm8tcGFyYW1ldGVyIiwgInBNYXJrZXJJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtQZXJmb3JtYW5jZVN0cmVhbU1hcmtlckluZm9JTlRFTCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZVN0cmVhbU1hcmtlcklOVEVMLXBNYXJrZXJJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQtTm9uZS0wMTUyOCIsICJUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19EWU5BTUlDX1NUQVRFX1NBTVBMRV9MT0NBVElPTlNfRVhUIGR5bmFtaWMgc3RhdGUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1Ob25lLTAxNTI4KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhULWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1wU2FtcGxlTG9jYXRpb25zSW5mby1wYXJhbWV0ZXIiLCAicFNhbXBsZUxvY2F0aW9uc0luZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1NhbXBsZUxvY2F0aW9uc0luZm9FWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U2FtcGxlTG9jYXRpb25zRVhULXBTYW1wbGVMb2NhdGlvbnNJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQtc2FtcGxlTG9jYXRpb25zUGVyUGl4ZWwtMDE1MjkiLCAiVGhlIHNhbXBsZUxvY2F0aW9uc1BlclBpeGVsIG1lbWJlciBvZiBwU2FtcGxlTG9jYXRpb25zSW5mbyBtdXN0IGVxdWFsIHRoZSByYXN0ZXJpemF0aW9uU2FtcGxlcyBtZW1iZXIgb2YgdGhlIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgdGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1zYW1wbGVMb2NhdGlvbnNQZXJQaXhlbC0wMTUyOSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQtdmFyaWFibGVTYW1wbGVMb2NhdGlvbnMtMDE1MzAiLCAiSWYgVmtQaHlzaWNhbERldmljZVNhbXBsZUxvY2F0aW9uc1Byb3BlcnRpZXNFWFQ6OnZhcmlhYmxlU2FtcGxlTG9jYXRpb25zIGlzIFZLX0ZBTFNFIHRoZW4gdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MgbXVzdCBoYXZlIGJlZW4gYmVndW4gYnkgc3BlY2lmeWluZyBhIFZrUmVuZGVyUGFzc1NhbXBsZUxvY2F0aW9uc0JlZ2luSW5mb0VYVCBzdHJ1Y3R1cmUgd2hvc2UgcFBvc3RTdWJwYXNzU2FtcGxlTG9jYXRpb25zIG1lbWJlciBjb250YWlucyBhbiBlbGVtZW50IHdpdGggYSBzdWJwYXNzSW5kZXggbWF0Y2hpbmcgdGhlIGN1cnJlbnQgc3VicGFzcyBpbmRleCBhbmQgdGhlIHNhbXBsZUxvY2F0aW9uc0luZm8gbWVtYmVyIG9mIHRoYXQgZWxlbWVudCBtdXN0IG1hdGNoIHRoZSBzYW1wbGUgbG9jYXRpb25zIHN0YXRlIHBvaW50ZWQgdG8gYnkgcFNhbXBsZUxvY2F0aW9uc0luZm8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQtdmFyaWFibGVTYW1wbGVMb2NhdGlvbnMtMDE1MzApIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2Npc3Nvci1Ob25lLTAwNTkwIiwgIlRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0RZTkFNSUNfU1RBVEVfU0NJU1NPUiBkeW5hbWljIHN0YXRlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTY2lzc29yLU5vbmUtMDA1OTApIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2Npc3Nvci1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNjaXNzb3ItY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFNjaXNzb3ItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNjaXNzb3ItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2Npc3Nvci1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNjaXNzb3ItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2Npc3Nvci1maXJzdFNjaXNzb3ItMDA1OTEiLCAiZmlyc3RTY2lzc29yIG11c3QgYmUgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNjaXNzb3ItZmlyc3RTY2lzc29yLTAwNTkxKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFNjaXNzb3ItZmlyc3RTY2lzc29yLTAwNTkyIiwgIlRoZSBzdW0gb2YgZmlyc3RTY2lzc29yIGFuZCBzY2lzc29yQ291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cywgaW5jbHVzaXZlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U2Npc3Nvci1maXJzdFNjaXNzb3ItMDA1OTIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2Npc3Nvci1maXJzdFNjaXNzb3ItMDA1OTMiLCAiSWYgdGhlIG11bHRpcGxlIHZpZXdwb3J0cyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBmaXJzdFNjaXNzb3IgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U2Npc3Nvci1maXJzdFNjaXNzb3ItMDA1OTMpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2Npc3Nvci1vZmZzZXQtMDA1OTYiLCAiRXZhbHVhdGlvbiBvZiAob2Zmc2V0LnggKyBleHRlbnQud2lkdGgpIG11c3Qgbm90IGNhdXNlIGEgc2lnbmVkIGludGVnZXIgYWRkaXRpb24gb3ZlcmZsb3cgZm9yIGFueSBlbGVtZW50IG9mIHBTY2lzc29ycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNjaXNzb3Itb2Zmc2V0LTAwNTk2KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFNjaXNzb3Itb2Zmc2V0LTAwNTk3IiwgIkV2YWx1YXRpb24gb2YgKG9mZnNldC55ICsgZXh0ZW50LmhlaWdodCkgbXVzdCBub3QgY2F1c2UgYSBzaWduZWQgaW50ZWdlciBhZGRpdGlvbiBvdmVyZmxvdyBmb3IgYW55IGVsZW1lbnQgb2YgcFNjaXNzb3JzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U2Npc3Nvci1vZmZzZXQtMDA1OTcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U2Npc3Nvci1wU2Npc3NvcnMtcGFyYW1ldGVyIiwgInBTY2lzc29ycyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzY2lzc29yQ291bnQgVmtSZWN0MkQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNjaXNzb3ItcFNjaXNzb3JzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTY2lzc29yLXNjaXNzb3JDb3VudC0wMDU5NCIsICJJZiB0aGUgbXVsdGlwbGUgdmlld3BvcnRzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNjaXNzb3JDb3VudCBtdXN0IGJlIDEgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTY2lzc29yLXNjaXNzb3JDb3VudC0wMDU5NCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTY2lzc29yLXNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCIsICJzY2lzc29yQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFNjaXNzb3Itc2Npc3NvckNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFNjaXNzb3IteC0wMDU5NSIsICJUaGUgeCBhbmQgeSBtZW1iZXJzIG9mIG9mZnNldCBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcFNjaXNzb3JzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTY2lzc29yLXgtMDA1OTUpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLU5vbmUtMDA2MDIiLCAiVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX0NPTVBBUkVfTUFTSyBkeW5hbWljIHN0YXRlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stTm9uZS0wMDYwMikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzay1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzay1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzay1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stZmFjZU1hc2stcGFyYW1ldGVyIiwgImZhY2VNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1N0ZW5jaWxGYWNlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLWZhY2VNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stZmFjZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwgImZhY2VNYXNrIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2stZmFjZU1hc2stcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UtTm9uZS0wMDYwNCIsICJUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfUkVGRVJFTkNFIGR5bmFtaWMgc3RhdGUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UtTm9uZS0wMDYwNCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZS1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZS1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLWZhY2VNYXNrLXBhcmFtZXRlciIsICJmYWNlTWFzayBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtTdGVuY2lsRmFjZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UtZmFjZU1hc2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFN0ZW5jaWxSZWZlcmVuY2UtZmFjZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwgImZhY2VNYXNrIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLWZhY2VNYXNrLXJlcXVpcmVkYml0bWFzaykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLU5vbmUtMDA2MDMiLCAiVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1dSSVRFX01BU0sgZHluYW1pYyBzdGF0ZSBlbmFibGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzay1Ob25lLTAwNjAzKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2stY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGdyYXBoaWNzIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2stY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2stZmFjZU1hc2stcGFyYW1ldGVyIiwgImZhY2VNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1N0ZW5jaWxGYWNlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzay1mYWNlTWFzay1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzay1mYWNlTWFzay1yZXF1aXJlZGJpdG1hc2siLCAiZmFjZU1hc2sgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2stZmFjZU1hc2stcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0LU5vbmUtMDEyMjEiLCAiVGhlIGJvdW5kIGdyYXBoaWNzIHBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCBkeW5hbWljIHN0YXRlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydC1Ob25lLTAxMjIxKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0LWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnQtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0LWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFZpZXdwb3J0LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0LWZpcnN0Vmlld3BvcnQtMDEyMjIiLCAiZmlyc3RWaWV3cG9ydCBtdXN0IGJlIGxlc3MgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydC1maXJzdFZpZXdwb3J0LTAxMjIyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0LWZpcnN0Vmlld3BvcnQtMDEyMjMiLCAiVGhlIHN1bSBvZiBmaXJzdFZpZXdwb3J0IGFuZCB2aWV3cG9ydENvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydHMsIGluY2x1c2l2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFZpZXdwb3J0LWZpcnN0Vmlld3BvcnQtMDEyMjMpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnQtZmlyc3RWaWV3cG9ydC0wMTIyNCIsICJJZiB0aGUgbXVsdGlwbGUgdmlld3BvcnRzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGZpcnN0Vmlld3BvcnQgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnQtZmlyc3RWaWV3cG9ydC0wMTIyNCkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1wVmlld3BvcnRzLXBhcmFtZXRlciIsICJwVmlld3BvcnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZpZXdwb3J0Q291bnQgdmFsaWQgVmtWaWV3cG9ydCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnQtcFZpZXdwb3J0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnQtdmlld3BvcnRDb3VudC0wMTIyNSIsICJJZiB0aGUgbXVsdGlwbGUgdmlld3BvcnRzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHZpZXdwb3J0Q291bnQgbXVzdCBiZSAxIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnQtdmlld3BvcnRDb3VudC0wMTIyNSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydC12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwgInZpZXdwb3J0Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFZpZXdwb3J0LXZpZXdwb3J0Q291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1Ob25lLTAyMDY0IiwgIlRoZSBzaGFkaW5nIHJhdGUgaW1hZ2UgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1Ob25lLTAyMDY0KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtTm9uZS0wMjA2NSIsICJUaGUgYm91bmQgZ3JhcGhpY3MgcGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9QQUxFVFRFX05WIGR5bmFtaWMgc3RhdGUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtTm9uZS0wMjA2NSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCBncmFwaGljcyBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWZpcnN0Vmlld3BvcnQtMDIwNjYiLCAiZmlyc3RWaWV3cG9ydCBtdXN0IGJlIGxlc3MgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWZpcnN0Vmlld3BvcnQtMDIwNjYpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1maXJzdFZpZXdwb3J0LTAyMDY3IiwgIlRoZSBzdW0gb2YgZmlyc3RWaWV3cG9ydCBhbmQgdmlld3BvcnRDb3VudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Vmlld3BvcnRzLCBpbmNsdXNpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWZpcnN0Vmlld3BvcnQtMDIwNjcpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1maXJzdFZpZXdwb3J0LTAyMDY4IiwgIklmIHRoZSBtdWx0aXBsZSB2aWV3cG9ydHMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmlyc3RWaWV3cG9ydCBtdXN0IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWZpcnN0Vmlld3BvcnQtMDIwNjgpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1wU2hhZGluZ1JhdGVQYWxldHRlcy1wYXJhbWV0ZXIiLCAicFNoYWRpbmdSYXRlUGFsZXR0ZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygdmlld3BvcnRDb3VudCB2YWxpZCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLXBTaGFkaW5nUmF0ZVBhbGV0dGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLXZpZXdwb3J0Q291bnQtMDIwNjkiLCAiSWYgdGhlIG11bHRpcGxlIHZpZXdwb3J0cyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB2aWV3cG9ydENvdW50IG11c3QgYmUgMSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtdmlld3BvcnRDb3VudC0wMjA2OSkifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLXZpZXdwb3J0Q291bnQtYXJyYXlsZW5ndGgiLCAidmlld3BvcnRDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1Ob25lLTAxMzIyIiwgIlRoZSBib3VuZCBncmFwaGljcyBwaXBlbGluZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfV19TQ0FMSU5HX05WIGR5bmFtaWMgc3RhdGUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1Ob25lLTAxMzIyKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3Mgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1maXJzdFZpZXdwb3J0LTAxMzIzIiwgImZpcnN0Vmlld3BvcnQgbXVzdCBiZSBsZXNzIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Vmlld3BvcnRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWZpcnN0Vmlld3BvcnQtMDEzMjMpIn0sCisgICAgeyJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWZpcnN0Vmlld3BvcnQtMDEzMjQiLCAiVGhlIHN1bSBvZiBmaXJzdFZpZXdwb3J0IGFuZCB2aWV3cG9ydENvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydHMsIGluY2x1c2l2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1maXJzdFZpZXdwb3J0LTAxMzI0KSJ9LAorICAgIHsiVlVJRC12a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVi1wVmlld3BvcnRXU2NhbGluZ3MtcGFyYW1ldGVyIiwgInBWaWV3cG9ydFdTY2FsaW5ncyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aWV3cG9ydENvdW50IFZrVmlld3BvcnRXU2NhbGluZ05WIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtcFZpZXdwb3J0V1NjYWxpbmdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsICJ2aWV3cG9ydENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjkwIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgc2FtcGxlZCB3aXRoIFZLX0ZJTFRFUl9MSU5FQVIgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjY5MCkifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjkxIiwgIklmIGEgVmtJbWFnZVZpZXcgaXMgYWNjZXNzZWQgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLCB0aGVuIHRoZSBpbWFnZSB2aWV3J3MgZm9ybWF0IGZlYXR1cmVzIG11c3QgY29udGFpbiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0FUT01JQ19CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjkxKSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI2OTIiLCAiSWYgYSBWa0ltYWdlVmlldyBpcyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQsIHRoZW4gdGhlIGltYWdlIHZpZXcncyBmb3JtYXQgZmVhdHVyZXMgbXVzdCBjb250YWluIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfRklMVEVSX0NVQklDX0JJVF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjkyKSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI2OTMiLCAiQW55IFZrSW1hZ2VWaWV3IGJlaW5nIHNhbXBsZWQgd2l0aCBWS19GSUxURVJfQ1VCSUNfRVhUIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG5vdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIG9mIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjY5MykifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjk3IiwgIkZvciBlYWNoIHNldCBuIHRoYXQgaXMgc3RhdGljYWxseSB1c2VkIGJ5IHRoZSBWa1BpcGVsaW5lIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kLCBhIGRlc2NyaXB0b3Igc2V0IG11c3QgaGF2ZSBiZWVuIGJvdW5kIHRvIG4gYXQgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIFZrUGlwZWxpbmVMYXlvdXQgdGhhdCBpcyBjb21wYXRpYmxlIGZvciBzZXQgbiwgd2l0aCB0aGUgVmtQaXBlbGluZUxheW91dCB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCBWa1BpcGVsaW5lLCBhcyBkZXNjcmliZWQgaW4gUGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjk3KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI2OTgiLCAiRm9yIGVhY2ggcHVzaCBjb25zdGFudCB0aGF0IGlzIHN0YXRpY2FsbHkgdXNlZCBieSB0aGUgVmtQaXBlbGluZSBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCwgYSBwdXNoIGNvbnN0YW50IHZhbHVlIG11c3QgaGF2ZSBiZWVuIHNldCBmb3IgdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCwgd2l0aCBhIFZrUGlwZWxpbmVMYXlvdXQgdGhhdCBpcyBjb21wYXRpYmxlIGZvciBwdXNoIGNvbnN0YW50cywgd2l0aCB0aGUgVmtQaXBlbGluZUxheW91dCB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCBWa1BpcGVsaW5lLCBhcyBkZXNjcmliZWQgaW4gUGlwZWxpbmUgTGF5b3V0IENvbXBhdGliaWxpdHkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjk4KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI2OTkiLCAiRGVzY3JpcHRvcnMgaW4gZWFjaCBib3VuZCBkZXNjcmlwdG9yIHNldCwgc3BlY2lmaWVkIHZpYSB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cywgbXVzdCBiZSB2YWxpZCBpZiB0aGV5IGFyZSBzdGF0aWNhbGx5IHVzZWQgYnkgdGhlIFZrUGlwZWxpbmUgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNjk5KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI3MDAiLCAiQSB2YWxpZCBwaXBlbGluZSBtdXN0IGJlIGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjcwMCkifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNzAyIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgdG8gc2FtcGxlIGZyb20gYW55IFZrSW1hZ2Ugd2l0aCBhIFZrSW1hZ2VWaWV3IG9mIHRoZSB0eXBlIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCwgVktfSU1BR0VfVklFV19UWVBFX0NVQkUsIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWSwgVktfSU1BR0VfVklFV19UWVBFXzJEX0FSUkFZIG9yIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFX0FSUkFZLCBpbiBhbnkgc2hhZGVyIHN0YWdlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjcwMikifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNzAzIiwgIklmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIFZrU2FtcGxlciBvYmplY3QgdGhhdCB1c2VzIHVubm9ybWFsaXplZCBjb29yZGluYXRlcywgdGhhdCBzYW1wbGVyIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIFNQSVItViBPcEltYWdlU2FtcGxlKiBvciBPcEltYWdlU3BhcnNlU2FtcGxlKiBpbnN0cnVjdGlvbnMgd2l0aCBJbXBsaWNpdExvZCwgRHJlZiBvciBQcm9qIGluIHRoZWlyIG5hbWUsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNzAzKSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI3MDQiLCAiSWYgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIGFjY2Vzc2VzIGEgVmtTYW1wbGVyIG9iamVjdCB0aGF0IHVzZXMgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLCB0aGF0IHNhbXBsZXIgbXVzdCBub3QgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgU1BJUi1WIE9wSW1hZ2VTYW1wbGUqIG9yIE9wSW1hZ2VTcGFyc2VTYW1wbGUqIGluc3RydWN0aW9ucyB0aGF0IGluY2x1ZGVzIGEgTE9EIGJpYXMgb3IgYW55IG9mZnNldCB2YWx1ZXMsIGluIGFueSBzaGFkZXIgc3RhZ2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1Ob25lLTAyNzA0KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI3MDUiLCAiSWYgdGhlIHJvYnVzdCBidWZmZXIgYWNjZXNzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGFuZCBpZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgYWNjZXNzZXMgYSB1bmlmb3JtIGJ1ZmZlciwgaXQgbXVzdCBub3QgYWNjZXNzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciBzZXQgYm91bmQgdG8gdGhlIHNhbWUgcGlwZWxpbmUgYmluZCBwb2ludCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI3MDUpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjcwNiIsICJJZiB0aGUgcm9idXN0IGJ1ZmZlciBhY2Nlc3MgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgYW5kIGlmIHRoZSBWa1BpcGVsaW5lIG9iamVjdCBib3VuZCB0byB0aGUgcGlwZWxpbmUgYmluZCBwb2ludCB1c2VkIGJ5IHRoaXMgY29tbWFuZCBhY2Nlc3NlcyBhIHN0b3JhZ2UgYnVmZmVyLCBpdCBtdXN0IG5vdCBhY2Nlc3MgdmFsdWVzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBidWZmZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yIHNldCBib3VuZCB0byB0aGUgc2FtZSBwaXBlbGluZSBiaW5kIHBvaW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtTm9uZS0wMjcwNikifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQtMDI0NjEiLCAiY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LTAyNDYxKSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldC0wMjQ2MiIsICJjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjpzaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1jYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQtMDI0NjIpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY1IiwgImNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY6OnNoYWRlckdyb3VwSGFuZGxlU2l6ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLWNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZS0wMjQ2NSkifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUtMDI0NjgiLCAiY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlIG11c3QgYmUgYSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY6Om1heFNoYWRlckdyb3VwU3RyaWRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY4KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLXBhcmFtZXRlciIsICJJZiBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1jYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci0wMjcwMSIsICJJZiB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgcmVxdWlyZXMgYW55IGR5bmFtaWMgc3RhdGUsIHRoYXQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gc2V0IGZvciBjb21tYW5kQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci0wMjcwMSkifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tYW5kQnVmZmVyLTAyNzA3IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYW4gdW5wcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIGFueSByZXNvdXJjZSBhY2Nlc3NlZCBieSB0aGUgVmtQaXBlbGluZSBvYmplY3QgYm91bmQgdG8gdGhlIHBpcGVsaW5lIGJpbmQgcG9pbnQgdXNlZCBieSB0aGlzIGNvbW1hbmQgbXVzdCBub3QgYmUgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tYW5kQnVmZmVyLTAyNzA3KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1hbmRCdWZmZXItMDI3MTIiLCAiSWYgY29tbWFuZEJ1ZmZlciBpcyBhIHByb3RlY3RlZCBjb21tYW5kIGJ1ZmZlciwgYW55IHJlc291cmNlIHdyaXR0ZW4gdG8gYnkgdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IHVzZWQgYnkgdGhpcyBjb21tYW5kIG11c3Qgbm90IGJlIGFuIHVucHJvdGVjdGVkIHJlc291cmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci0wMjcxMikifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tYW5kQnVmZmVyLTAyNzEzIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBwcm90ZWN0ZWQgY29tbWFuZCBidWZmZXIsIHBpcGVsaW5lIHN0YWdlcyBvdGhlciB0aGFuIHRoZSBmcmFtZWJ1ZmZlci1zcGFjZSBhbmQgY29tcHV0ZSBzdGFnZXMgaW4gdGhlIFZrUGlwZWxpbmUgb2JqZWN0IGJvdW5kIHRvIHRoZSBwaXBlbGluZSBiaW5kIHBvaW50IG11c3Qgbm90IHdyaXRlIHRvIGFueSByZXNvdXJjZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1hbmRCdWZmZXItMDI3MTMpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tb25wYXJlbnQiLCAiRWFjaCBvZiBjYWxsYWJsZVNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgY29tbWFuZEJ1ZmZlciwgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBhbmQgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLWRlcHRoLTAyNDcxIiwgImRlcHRoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsyXSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLWRlcHRoLTAyNDcxKSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLWZpbHRlckN1YmljLTAyNjk0IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEgVmtJbWFnZVZpZXdUeXBlIGFuZCBmb3JtYXQgdGhhdCBzdXBwb3J0cyBjdWJpYyBmaWx0ZXJpbmcsIGFzIHNwZWNpZmllZCBieSBWa0ZpbHRlckN1YmljSW1hZ2VWaWV3SW1hZ2VGb3JtYXRQcm9wZXJ0aWVzRVhUOjpmaWx0ZXJDdWJpYyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLWZpbHRlckN1YmljLTAyNjk0KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLWZpbHRlckN1YmljTWlubWF4LTAyNjk1IiwgIkFueSBWa0ltYWdlVmlldyBiZWluZyBzYW1wbGVkIHdpdGggVktfRklMVEVSX0NVQklDX0VYVCB3aXRoIGEgcmVkdWN0aW9uIG1vZGUgb2YgZWl0aGVyIFZLX1NBTVBMRVJfUkVEVUNUSU9OX01PREVfTUlOX0VYVCBvciBWS19TQU1QTEVSX1JFRFVDVElPTl9NT0RFX01BWF9FWFQgYXMgYSByZXN1bHQgb2YgdGhpcyBjb21tYW5kIG11c3QgaGF2ZSBhIFZrSW1hZ2VWaWV3VHlwZSBhbmQgZm9ybWF0IHRoYXQgc3VwcG9ydHMgY3ViaWMgZmlsdGVyaW5nIHRvZ2V0aGVyIHdpdGggbWlubWF4IGZpbHRlcmluZywgYXMgc3BlY2lmaWVkIGJ5IFZrRmlsdGVyQ3ViaWNJbWFnZVZpZXdJbWFnZUZvcm1hdFByb3BlcnRpZXNFWFQ6OmZpbHRlckN1YmljTWlubWF4IHJldHVybmVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtZmlsdGVyQ3ViaWNNaW5tYXgtMDI2OTUpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtZmxhZ3MtMDI2OTYiLCAiQW55IFZrSW1hZ2UgY3JlYXRlZCB3aXRoIGEgVmtJbWFnZUNyZWF0ZUluZm86OmZsYWdzIGNvbnRhaW5pbmcgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViBzYW1wbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgc2FtcGxlZCB1c2luZyBhIFZrU2FtcGxlckFkZHJlc3NNb2RlIG9mIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtZmxhZ3MtMDI2OTYpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtaGVpZ2h0LTAyNDcwIiwgImhlaWdodCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1oZWlnaHQtMDI0NzApIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtaGl0U2hhZGVyQmluZGluZ09mZnNldC0wMjQ1OSIsICJoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLWhpdFNoYWRlckJpbmRpbmdPZmZzZXQtMDI0NTkpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtaGl0U2hhZGVyQmluZGluZ09mZnNldC0wMjQ2MCIsICJoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6c2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtaGl0U2hhZGVyQmluZGluZ09mZnNldC0wMjQ2MCkifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1oaXRTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY0IiwgImhpdFNoYWRlckJpbmRpbmdTdHJpZGUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjpzaGFkZXJHcm91cEhhbmRsZVNpemUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1oaXRTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY0KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLWhpdFNoYWRlckJpbmRpbmdTdHJpZGUtMDI0NjciLCAiaGl0U2hhZGVyQmluZGluZ1N0cmlkZSBtdXN0IGJlIGEgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjptYXhTaGFkZXJHcm91cFN0cmlkZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLWhpdFNoYWRlckJpbmRpbmdTdHJpZGUtMDI0NjcpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLXBhcmFtZXRlciIsICJJZiBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgaXMgbm90IFZLX05VTExfSEFORExFLCBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLWhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQtMDI0NTciLCAibWlzc1NoYWRlckJpbmRpbmdPZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgbWlzc1NoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLW1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LTAyNDU3KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLW1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LTAyNDU4IiwgIm1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6c2hhZGVyR3JvdXBCYXNlQWxpZ25tZW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQtMDI0NTgpIn0sCisgICAgeyJWVUlELXZrQ21kVHJhY2VSYXlzTlYtbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUtMDI0NjMiLCAibWlzc1NoYWRlckJpbmRpbmdTdHJpZGUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjpzaGFkZXJHcm91cEhhbmRsZVNpemUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1taXNzU2hhZGVyQmluZGluZ1N0cmlkZS0wMjQ2MykifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1taXNzU2hhZGVyQmluZGluZ1N0cmlkZS0wMjQ2NiIsICJtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSBtdXN0IGJlIGEgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjptYXhTaGFkZXJHcm91cFN0cmlkZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFRyYWNlUmF5c05WLW1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLTAyNDY2KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLW1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXItcGFyYW1ldGVyIiwgIklmIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIgaXMgbm90IFZLX05VTExfSEFORExFLCBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1taXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1yYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LTAyNDU1IiwgInJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtcmF5Z2VuU2hhZGVyQmluZGluZ09mZnNldC0wMjQ1NSkifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi1yYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LTAyNDU2IiwgInJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjpzaGFkZXJHcm91cEJhc2VBbGlnbm1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1yYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LTAyNDU2KSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLXJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlci1wYXJhbWV0ZXIiLCAicmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi1yYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFRyYWNlUmF5c05WLXJlbmRlcnBhc3MiLCAiVGhpcyBjb21tYW5kIG11c3Qgb25seSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVHJhY2VSYXlzTlYtcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRUcmFjZVJheXNOVi13aWR0aC0wMjQ2OSIsICJ3aWR0aCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMF0gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRUcmFjZVJheXNOVi13aWR0aC0wMjQ2OSkifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxMyIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGFuIHVucHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGRzdEJ1ZmZlciBtdXN0IG5vdCBiZSBhIHByb3RlY3RlZCBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxMykifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxNCIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGEgcHJvdGVjdGVkIGNvbW1hbmQgYnVmZmVyLCB0aGVuIGRzdEJ1ZmZlciBtdXN0IG5vdCBiZSBhbiB1bnByb3RlY3RlZCBidWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxNCkifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IHRyYW5zZmVyLCBncmFwaGljcywgb3IgY29tcHV0ZSBvcGVyYXRpb25zIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRVcGRhdGVCdWZmZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGNvbW1hbmRCdWZmZXIsIGFuZCBkc3RCdWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWRhdGFTaXplLTAwMDMzIiwgImRhdGFTaXplIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGRzdEJ1ZmZlciBtaW51cyBkc3RPZmZzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZGF0YVNpemUtMDAwMzMpIn0sCisgICAgeyJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWRhdGFTaXplLTAwMDM3IiwgImRhdGFTaXplIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDY1NTM2IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWRhdGFTaXplLTAwMDM3KSJ9LAorICAgIHsiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kYXRhU2l6ZS0wMDAzOCIsICJkYXRhU2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kYXRhU2l6ZS0wMDAzOCkifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZGF0YVNpemUtYXJyYXlsZW5ndGgiLCAiZGF0YVNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kYXRhU2l6ZS1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0QnVmZmVyLTAwMDM0IiwgImRzdEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgdXNhZ2UgZmxhZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kc3RCdWZmZXItMDAwMzQpIn0sCisgICAgeyJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWRzdEJ1ZmZlci0wMDAzNSIsICJJZiBkc3RCdWZmZXIgaXMgbm9uLXNwYXJzZSB0aGVuIGl0IG11c3QgYmUgYm91bmQgY29tcGxldGVseSBhbmQgY29udGlndW91c2x5IHRvIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IG9iamVjdCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kc3RCdWZmZXItMDAwMzUpIn0sCisgICAgeyJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWRzdEJ1ZmZlci1wYXJhbWV0ZXIiLCAiZHN0QnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0QnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0T2Zmc2V0LTAwMDMyIiwgImRzdE9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBkc3RCdWZmZXIgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZHN0T2Zmc2V0LTAwMDMyKSJ9LAorICAgIHsiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kc3RPZmZzZXQtMDAwMzYiLCAiZHN0T2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWRzdE9mZnNldC0wMDAzNikifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItcERhdGEtcGFyYW1ldGVyIiwgInBEYXRhIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRhdGFTaXplIGJ5dGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kVXBkYXRlQnVmZmVyLXBEYXRhLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItcmVuZGVycGFzcyIsICJUaGlzIGNvbW1hbmQgbXVzdCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRVcGRhdGVCdWZmZXItcmVuZGVycGFzcykifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1hbmRCdWZmZXItMDExNjciLCAiY29tbWFuZEJ1ZmZlcidzIGN1cnJlbnQgZGV2aWNlIG1hc2sgbXVzdCBpbmNsdWRlIGV4YWN0bHkgb25lIHBoeXNpY2FsIGRldmljZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1hbmRCdWZmZXItMDExNjcpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtY29tbWFuZEJ1ZmZlci1jbWRwb29sKSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBjb21tYW5kQnVmZmVyLCBhbmQgdGhlIGVsZW1lbnRzIG9mIHBFdmVudHMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0QWNjZXNzTWFzay0wMjgxMCIsICJUaGUgZHN0QWNjZXNzTWFzayBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBNZW1vcnlCYXJyaWVycyBtdXN0IG9ubHkgaW5jbHVkZSBhY2Nlc3MgZmxhZ3MgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IG9uZSBvciBtb3JlIG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gZHN0U3RhZ2VNYXNrLCBhcyBzcGVjaWZpZWQgaW4gdGhlIHRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdEFjY2Vzc01hc2stMDI4MTApIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RBY2Nlc3NNYXNrLTAyODEyIiwgIlRoZSBkc3RBY2Nlc3NNYXNrIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzIG11c3Qgb25seSBpbmNsdWRlIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBkc3RTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0QWNjZXNzTWFzay0wMjgxMikifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdEFjY2Vzc01hc2stMDI4MTQiLCAiVGhlIGRzdEFjY2Vzc01hc2sgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBJbWFnZU1lbW9yeUJhcnJpZXJzIG11c3Qgb25seSBpbmNsdWRlIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBkc3RTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0QWNjZXNzTWFzay0wMjgxNCkifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay0wMTE2MCIsICJJZiB0aGUgZ2VvbWV0cnkgc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBkc3RTdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9HRU9NRVRSWV9TSEFERVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stMDExNjApIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stMDExNjIiLCAiSWYgdGhlIHRlc3NlbGxhdGlvbiBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIGRzdFN0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQgb3IgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0U3RhZ2VNYXNrLTAxMTYyKSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0U3RhZ2VNYXNrLTAyMTEzIiwgIklmIHRoZSBtZXNoIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZHN0U3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stMDIxMTMpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stMDIxMTQiLCAiSWYgdGhlIHRhc2sgc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBkc3RTdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay0wMjExNCkifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay1wYXJhbWV0ZXIiLCAiZHN0U3RhZ2VNYXNrIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrIiwgImRzdFN0YWdlTWFzayBtdXN0IG5vdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV2FpdEV2ZW50cy1kc3RTdGFnZU1hc2stcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtZXZlbnRDb3VudC1hcnJheWxlbmd0aCIsICJldmVudENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLWV2ZW50Q291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1wQnVmZmVyTWVtb3J5QmFycmllcnMtcGFyYW1ldGVyIiwgIklmIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCBpcyBub3QgMCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCB2YWxpZCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLXBFdmVudHMtMDExNjMiLCAiSWYgcEV2ZW50cyBpbmNsdWRlcyBvbmUgb3IgbW9yZSBldmVudHMgdGhhdCB3aWxsIGJlIHNpZ25hbGVkIGJ5IHZrU2V0RXZlbnQgYWZ0ZXIgY29tbWFuZEJ1ZmZlciBoYXMgYmVlbiBzdWJtaXR0ZWQgdG8gYSBxdWV1ZSwgdGhlbiB2a0NtZFdhaXRFdmVudHMgbXVzdCBub3QgYmUgY2FsbGVkIGluc2lkZSBhIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV2FpdEV2ZW50cy1wRXZlbnRzLTAxMTYzKSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtcEV2ZW50cy1wYXJhbWV0ZXIiLCAicEV2ZW50cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBldmVudENvdW50IHZhbGlkIFZrRXZlbnQgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtcEV2ZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1wSW1hZ2VNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIiLCAiSWYgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQgaXMgbm90IDAsIHBJbWFnZU1lbW9yeUJhcnJpZXJzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlTWVtb3J5QmFycmllckNvdW50IHZhbGlkIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLXBJbWFnZU1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLXBNZW1vcnlCYXJyaWVycy0wMTE2NSIsICJFYWNoIGVsZW1lbnQgb2YgcE1lbW9yeUJhcnJpZXJzLCBwQnVmZmVyTWVtb3J5QmFycmllcnMgb3IgcEltYWdlTWVtb3J5QmFycmllcnMgbXVzdCBub3QgaGF2ZSBhbnkgYWNjZXNzIGZsYWcgaW5jbHVkZWQgaW4gaXRzIHNyY0FjY2Vzc01hc2sgbWVtYmVyIGlmIHRoYXQgYml0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW55IG9mIHRoZSBwaXBlbGluZSBzdGFnZXMgaW4gc3JjU3RhZ2VNYXNrLCBhcyBzcGVjaWZpZWQgaW4gdGhlIHRhYmxlIG9mIHN1cHBvcnRlZCBhY2Nlc3MgdHlwZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV2FpdEV2ZW50cy1wTWVtb3J5QmFycmllcnMtMDExNjUpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1wTWVtb3J5QmFycmllcnMtMDExNjYiLCAiRWFjaCBlbGVtZW50IG9mIHBNZW1vcnlCYXJyaWVycywgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzIG9yIHBJbWFnZU1lbW9yeUJhcnJpZXJzIG11c3Qgbm90IGhhdmUgYW55IGFjY2VzcyBmbGFnIGluY2x1ZGVkIGluIGl0cyBkc3RBY2Nlc3NNYXNrIG1lbWJlciBpZiB0aGF0IGJpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFueSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIGRzdFN0YWdlTWFzaywgYXMgc3BlY2lmaWVkIGluIHRoZSB0YWJsZSBvZiBzdXBwb3J0ZWQgYWNjZXNzIHR5cGVzLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtcE1lbW9yeUJhcnJpZXJzLTAxMTY2KSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtcE1lbW9yeUJhcnJpZXJzLXBhcmFtZXRlciIsICJJZiBtZW1vcnlCYXJyaWVyQ291bnQgaXMgbm90IDAsIHBNZW1vcnlCYXJyaWVycyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBtZW1vcnlCYXJyaWVyQ291bnQgdmFsaWQgVmtNZW1vcnlCYXJyaWVyIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLXBNZW1vcnlCYXJyaWVycy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNBY2Nlc3NNYXNrLTAyODA5IiwgIlRoZSBzcmNBY2Nlc3NNYXNrIG1lbWJlciBvZiBlYWNoIGVsZW1lbnQgb2YgcE1lbW9yeUJhcnJpZXJzIG11c3Qgb25seSBpbmNsdWRlIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBzcmNTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjQWNjZXNzTWFzay0wMjgwOSkifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY0FjY2Vzc01hc2stMDI4MTEiLCAiVGhlIHNyY0FjY2Vzc01hc2sgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwQnVmZmVyTWVtb3J5QmFycmllcnMgbXVzdCBvbmx5IGluY2x1ZGUgYWNjZXNzIGZsYWdzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGUgcGlwZWxpbmUgc3RhZ2VzIGluIHNyY1N0YWdlTWFzaywgYXMgc3BlY2lmaWVkIGluIHRoZSB0YWJsZSBvZiBzdXBwb3J0ZWQgYWNjZXNzIHR5cGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNBY2Nlc3NNYXNrLTAyODExKSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjQWNjZXNzTWFzay0wMjgxMyIsICJUaGUgc3JjQWNjZXNzTWFzayBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBJbWFnZU1lbW9yeUJhcnJpZXJzIG11c3Qgb25seSBpbmNsdWRlIGFjY2VzcyBmbGFncyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHBpcGVsaW5lIHN0YWdlcyBpbiBzcmNTdGFnZU1hc2ssIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFibGUgb2Ygc3VwcG9ydGVkIGFjY2VzcyB0eXBlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjQWNjZXNzTWFzay0wMjgxMykifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1F1ZXVlRmFtaWx5SW5kZXgtMDI4MDMiLCAiVGhlIHNyY1F1ZXVlRmFtaWx5SW5kZXggYW5kIGRzdFF1ZXVlRmFtaWx5SW5kZXggbWVtYmVycyBvZiBhbnkgZWxlbWVudCBvZiBwQnVmZmVyTWVtb3J5QmFycmllcnMgb3IgcEltYWdlTWVtb3J5QmFycmllcnMgbXVzdCBiZSBlcXVhbC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1F1ZXVlRmFtaWx5SW5kZXgtMDI4MDMpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDExNTgiLCAic3JjU3RhZ2VNYXNrIG11c3QgYmUgdGhlIGJpdHdpc2UgT1Igb2YgdGhlIHN0YWdlTWFzayBwYXJhbWV0ZXIgdXNlZCBpbiBwcmV2aW91cyBjYWxscyB0byB2a0NtZFNldEV2ZW50IHdpdGggYW55IG9mIHRoZSBtZW1iZXJzIG9mIHBFdmVudHMgYW5kIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUIGlmIGFueSBvZiB0aGUgbWVtYmVycyBvZiBwRXZlbnRzIHdhcyBzZXQgdXNpbmcgdmtTZXRFdmVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLTAxMTU4KSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLTAxMTU5IiwgIklmIHRoZSBnZW9tZXRyeSBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNyY1N0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMTE1OSkifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMTE2MSIsICJJZiB0aGUgdGVzc2VsbGF0aW9uIHNoYWRlcnMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgc3JjU3RhZ2VNYXNrIG11c3Qgbm90IGNvbnRhaW4gVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCBvciBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDExNjEpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDExNjQiLCAiQW55IHBpcGVsaW5lIHN0YWdlIGluY2x1ZGVkIGluIHNyY1N0YWdlTWFzayBvciBkc3RTdGFnZU1hc2sgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgcXVldWUgZmFtaWx5IHNwZWNpZmllZCBieSB0aGUgcXVldWVGYW1pbHlJbmRleCBtZW1iZXIgb2YgdGhlIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHN0cnVjdHVyZSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tLCBhcyBzcGVjaWZpZWQgaW4gdGhlIHRhYmxlIG9mIHN1cHBvcnRlZCBwaXBlbGluZSBzdGFnZXMuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDExNjQpIn0sCisgICAgeyJWVUlELXZrQ21kV2FpdEV2ZW50cy1zcmNTdGFnZU1hc2stMDIxMTEiLCAiSWYgdGhlIG1lc2ggc2hhZGVycyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBzcmNTdGFnZU1hc2sgbXVzdCBub3QgY29udGFpbiBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMjExMSkifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMjExMiIsICJJZiB0aGUgdGFzayBzaGFkZXJzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHNyY1N0YWdlTWFzayBtdXN0IG5vdCBjb250YWluIFZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLTAyMTEyKSJ9LAorICAgIHsiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLXBhcmFtZXRlciIsICJzcmNTdGFnZU1hc2sgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2siLCAic3JjU3RhZ2VNYXNrIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50LWFycmF5bGVuZ3RoIiwgImFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWFjY2VsZXJhdGlvblN0cnVjdHVyZXMtMDI0OTUiLCAiQWxsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmVzIGluIGFjY2VsZXJhdGlvblN0cnVjdHVyZXMgbXVzdCBoYXZlIGJlZW4gYnVpbHQgd2l0aCBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0FMTE9XX0NPTVBBQ1RJT05fQklUX05WIGlmIHF1ZXJ5VHlwZSBpcyBWS19RVUVSWV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ09NUEFDVEVEX1NJWkVfTlYgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlcy0wMjQ5NSkifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtY29tbWFuZEJ1ZmZlci1jbWRwb29sIiwgIlRoZSBWa0NvbW1hbmRQb29sIHRoYXQgY29tbWFuZEJ1ZmZlciB3YXMgYWxsb2NhdGVkIGZyb20gbXVzdCBzdXBwb3J0IGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nKSJ9LAorICAgIHsiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1jb21tb25wYXJlbnQiLCAiRWFjaCBvZiBjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGFuZCB0aGUgZWxlbWVudHMgb2YgcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0RldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLXBBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzLXBhcmFtZXRlciIsICJwQWNjZWxlcmF0aW9uU3RydWN0dXJlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVDb3VudCB2YWxpZCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtcEFjY2VsZXJhdGlvblN0cnVjdHVyZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1xdWVyeVBvb2wtMDI0OTMiLCAicXVlcnlQb29sIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHF1ZXJ5VHlwZSBtYXRjaGluZyBxdWVyeVR5cGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtcXVlcnlQb29sLTAyNDkzKSJ9LAorICAgIHsiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1xdWVyeVBvb2wtMDI0OTQiLCAiVGhlIHF1ZXJpZXMgaWRlbnRpZmllZCBieSBxdWVyeVBvb2wgYW5kIGZpcnN0UXVlcnkgbXVzdCBiZSB1bmF2YWlsYWJsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1xdWVyeVBvb2wtMDI0OTQpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAicXVlcnlQb29sIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXJ5UG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtcXVlcnlQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtcXVlcnlUeXBlLTAyMjQyIiwgInF1ZXJ5VHlwZSBtdXN0IGJlIFZLX1FVRVJZX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DT01QQUNURURfU0laRV9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1xdWVyeVR5cGUtMDIyNDIpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVzUHJvcGVydGllc05WLXF1ZXJ5VHlwZS1wYXJhbWV0ZXIiLCAicXVlcnlUeXBlIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXJ5VHlwZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1xdWVyeVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1yZW5kZXJwYXNzIiwgIlRoaXMgY29tbWFuZCBtdXN0IG9ubHkgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgcGFzcyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlc1Byb3BlcnRpZXNOVi1yZW5kZXJwYXNzKSJ9LAorICAgIHsiVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELWNvbW1hbmRCdWZmZXItY21kcG9vbCIsICJUaGUgVmtDb21tYW5kUG9vbCB0aGF0IGNvbW1hbmRCdWZmZXIgd2FzIGFsbG9jYXRlZCBmcm9tIG11c3Qgc3VwcG9ydCB0cmFuc2ZlciwgZ3JhcGhpY3MsIG9yIGNvbXB1dGUgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELWNvbW1hbmRCdWZmZXItY21kcG9vbCkifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1jb21tYW5kQnVmZmVyLXJlY29yZGluZykifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBjb21tYW5kQnVmZmVyLCBhbmQgZHN0QnVmZmVyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtZHN0QnVmZmVyLTAxNzk5IiwgImRzdEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgdXNhZ2UgZmxhZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELWRzdEJ1ZmZlci0wMTc5OSkifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1kc3RCdWZmZXItMDE4MDAiLCAiSWYgZHN0QnVmZmVyIGlzIG5vbi1zcGFyc2UgdGhlbiBpdCBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1kc3RCdWZmZXItMDE4MDApIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtZHN0QnVmZmVyLXBhcmFtZXRlciIsICJkc3RCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELWRzdEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtZHN0T2Zmc2V0LTAxNzk4IiwgImRzdE9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiBkc3RCdWZmZXIgbWludXMgNC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1kc3RPZmZzZXQtMDE3OTgpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVCdWZmZXJNYXJrZXJBTUQtZHN0T2Zmc2V0LTAxODAxIiwgImRzdE9mZnNldCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELWRzdE9mZnNldC0wMTgwMSkifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRC1waXBlbGluZVN0YWdlLXBhcmFtZXRlciIsICJwaXBlbGluZVN0YWdlIG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELXBpcGVsaW5lU3RhZ2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLU5vbmUtMDA4MzAiLCAiQWxsIHF1ZXJpZXMgdXNlZCBieSB0aGUgY29tbWFuZCBtdXN0IGJlIHVuYXZhaWxhYmxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtTm9uZS0wMDgzMCkifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiLCAiVGhlIFZrQ29tbWFuZFBvb2wgdGhhdCBjb21tYW5kQnVmZmVyIHdhcyBhbGxvY2F0ZWQgZnJvbSBtdXN0IHN1cHBvcnQgdHJhbnNmZXIsIGdyYXBoaWNzLCBvciBjb21wdXRlIG9wZXJhdGlvbnMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1jb21tYW5kQnVmZmVyLWNtZHBvb2wpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kQnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmcpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgY29tbWFuZEJ1ZmZlciwgYW5kIHF1ZXJ5UG9vbCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLXBpcGVsaW5lU3RhZ2UtcGFyYW1ldGVyIiwgInBpcGVsaW5lU3RhZ2UgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcGlwZWxpbmVTdGFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcXVlcnktMDA4MzEiLCAiSWYgdmtDbWRXcml0ZVRpbWVzdGFtcCBpcyBjYWxsZWQgd2l0aGluIGEgcmVuZGVyIHBhc3MgaW5zdGFuY2UsIHRoZSBzdW0gb2YgcXVlcnkgYW5kIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gdGhlIGN1cnJlbnQgc3VicGFzcydzIHZpZXcgbWFzayBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gcXVlcnlQb29sIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcXVlcnktMDA4MzEpIn0sCisgICAgeyJWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcXVlcnlQb29sLTAwODI4IiwgIlRoZSBxdWVyeSBpZGVudGlmaWVkIGJ5IHF1ZXJ5UG9vbCBhbmQgcXVlcnkgbXVzdCBiZSB1bmF2YWlsYWJsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLXF1ZXJ5UG9vbC0wMDgyOCkifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1xdWVyeVBvb2wtMDE0MTYiLCAicXVlcnlQb29sIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHF1ZXJ5VHlwZSBvZiBWS19RVUVSWV9UWVBFX1RJTUVTVEFNUCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NtZFdyaXRlVGltZXN0YW1wLXF1ZXJ5UG9vbC0wMTQxNikifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1xdWVyeVBvb2wtcGFyYW1ldGVyIiwgInF1ZXJ5UG9vbCBtdXN0IGJlIGEgdmFsaWQgVmtRdWVyeVBvb2wgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ21kV3JpdGVUaW1lc3RhbXAtcXVlcnlQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC10aW1lc3RhbXBWYWxpZEJpdHMtMDA4MjkiLCAiVGhlIGNvbW1hbmQgcG9vbCdzIHF1ZXVlIGZhbWlseSBtdXN0IHN1cHBvcnQgYSBub24temVybyB0aW1lc3RhbXBWYWxpZEJpdHMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC10aW1lc3RhbXBWYWxpZEJpdHMtMDA4MjkpIn0sCisgICAgeyJWVUlELXZrQ29tcGlsZURlZmVycmVkTlYtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NvbXBpbGVEZWZlcnJlZE5WLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ29tcGlsZURlZmVycmVkTlYtcGlwZWxpbmUtMDIyMzciLCAicGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIFZLX1BJUEVMSU5FX0NSRUFURV9ERUZFUl9DT01QSUxFX0JJVF9OViAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NvbXBpbGVEZWZlcnJlZE5WLXBpcGVsaW5lLTAyMjM3KSJ9LAorICAgIHsiVlVJRC12a0NvbXBpbGVEZWZlcnJlZE5WLXBpcGVsaW5lLXBhcmFtZXRlciIsICJwaXBlbGluZSBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDb21waWxlRGVmZXJyZWROVi1waXBlbGluZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ29tcGlsZURlZmVycmVkTlYtcGlwZWxpbmUtcGFyZW50IiwgInBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ29tcGlsZURlZmVycmVkTlYtcGlwZWxpbmUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NvbXBpbGVEZWZlcnJlZE5WLXNoYWRlci0wMjIzOCIsICJzaGFkZXIgbXVzdCBub3QgaGF2ZSBiZWVuIGNhbGxlZCBhcyBhIGRlZmVycmVkIGNvbXBpbGUgYmVmb3JlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ29tcGlsZURlZmVycmVkTlYtc2hhZGVyLTAyMjM4KSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyYW1ldGVyIiwgInBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlciIsICJpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUi1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFItcFN1cmZhY2UtcGFyYW1ldGVyIiwgInBTdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtTdXJmYWNlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVCdWZmZXItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUJ1ZmZlci1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUJ1ZmZlci1mbGFncy0wMDkxMSIsICJJZiB0aGUgZmxhZ3MgbWVtYmVyIG9mIHBDcmVhdGVJbmZvIGluY2x1ZGVzIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULCBjcmVhdGluZyB0aGlzIFZrQnVmZmVyIG11c3Qgbm90IGNhdXNlIHRoZSB0b3RhbCByZXF1aXJlZCBzcGFyc2UgbWVtb3J5IGZvciBhbGwgY3VycmVudGx5IHZhbGlkIHNwYXJzZSByZXNvdXJjZXMgb24gdGhlIGRldmljZSB0byBleGNlZWQgVmtQaHlzaWNhbERldmljZUxpbWl0czo6c3BhcnNlQWRkcmVzc1NwYWNlU2l6ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUJ1ZmZlci1mbGFncy0wMDkxMSkifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVCdWZmZXItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVCdWZmZXItcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQnVmZmVyLXBCdWZmZXItcGFyYW1ldGVyIiwgInBCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVCdWZmZXItcEJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQnVmZmVyLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQnVmZmVyQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVCdWZmZXItcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUJ1ZmZlclZpZXctZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUJ1ZmZlclZpZXctZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVCdWZmZXJWaWV3LXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlQnVmZmVyVmlldy1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVCdWZmZXJWaWV3LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlQnVmZmVyVmlldy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQnVmZmVyVmlldy1wVmlldy1wYXJhbWV0ZXIiLCAicFZpZXcgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0J1ZmZlclZpZXcgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlQnVmZmVyVmlldy1wVmlldy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQ29tbWFuZFBvb2wtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUNvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQ29tbWFuZFBvb2wtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVDb21tYW5kUG9vbC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVDb21tYW5kUG9vbC1wQ29tbWFuZFBvb2wtcGFyYW1ldGVyIiwgInBDb21tYW5kUG9vbCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrQ29tbWFuZFBvb2wgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlQ29tbWFuZFBvb2wtcENvbW1hbmRQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVDb21tYW5kUG9vbC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVDb21tYW5kUG9vbC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQ29tbWFuZFBvb2wtcXVldWVGYW1pbHlJbmRleC0wMTkzNyIsICJwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleCBtdXN0IGJlIHRoZSBpbmRleCBvZiBhIHF1ZXVlIGZhbWlseSBhdmFpbGFibGUgaW4gdGhlIGxvZ2ljYWwgZGV2aWNlIGRldmljZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVDb21tYW5kUG9vbC1xdWV1ZUZhbWlseUluZGV4LTAxOTM3KSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtY3JlYXRlSW5mb0NvdW50LWFycmF5bGVuZ3RoIiwgImNyZWF0ZUluZm9Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1jcmVhdGVJbmZvQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtZmxhZ3MtMDA2OTUiLCAiSWYgdGhlIGZsYWdzIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwQ3JlYXRlSW5mb3MgY29udGFpbnMgdGhlIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCBmbGFnLCBhbmQgdGhlIGJhc2VQaXBlbGluZUluZGV4IG1lbWJlciBvZiB0aGF0IHNhbWUgZWxlbWVudCBpcyBub3QgLTEsIGJhc2VQaXBlbGluZUluZGV4IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBpbmRleCBpbnRvIHBDcmVhdGVJbmZvcyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXQgZWxlbWVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtZmxhZ3MtMDA2OTUpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1mbGFncy0wMDY5NiIsICJJZiB0aGUgZmxhZ3MgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBDcmVhdGVJbmZvcyBjb250YWlucyB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGZsYWcsIHRoZSBiYXNlIHBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0FMTE9XX0RFUklWQVRJVkVTX0JJVCBmbGFnIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtZmxhZ3MtMDA2OTYpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1wQ3JlYXRlSW5mb3MtcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjcmVhdGVJbmZvQ291bnQgdmFsaWQgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLXBDcmVhdGVJbmZvcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcy1wUGlwZWxpbmVzLXBhcmFtZXRlciIsICJwUGlwZWxpbmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNyZWF0ZUluZm9Db3VudCBWa1BpcGVsaW5lIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLXBQaXBlbGluZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtcGlwZWxpbmVDYWNoZS1wYXJhbWV0ZXIiLCAiSWYgcGlwZWxpbmVDYWNoZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHBpcGVsaW5lQ2FjaGUgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmVDYWNoZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLXBpcGVsaW5lQ2FjaGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMtcGlwZWxpbmVDYWNoZS1wYXJlbnQiLCAiSWYgcGlwZWxpbmVDYWNoZSBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzLXBpcGVsaW5lQ2FjaGUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtaW5zdGFuY2UtcGFyYW1ldGVyIiwgImluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtcENhbGxiYWNrLXBhcmFtZXRlciIsICJwQ2FsbGJhY2sgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVC1wQ2FsbGJhY2stcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULWluc3RhbmNlLXBhcmFtZXRlciIsICJpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULWluc3RhbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVC1wTWVzc2VuZ2VyLXBhcmFtZXRlciIsICJwTWVzc2VuZ2VyIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtcE1lc3Nlbmdlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclBvb2wtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JQb29sLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclBvb2wtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yUG9vbC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yUG9vbC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yUG9vbC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclBvb2wtcERlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIsICJwRGVzY3JpcHRvclBvb2wgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0Rlc2NyaXB0b3JQb29sIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JQb29sLXBEZXNjcmlwdG9yUG9vbC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0LXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0LXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0LXBTZXRMYXlvdXQtcGFyYW1ldGVyIiwgInBTZXRMYXlvdXQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dC1wU2V0TGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyIiwgInBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGV2aWNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGV2aWNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURldmljZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0RldmljZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGV2aWNlLXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZXZpY2UtcERldmljZS1wYXJhbWV0ZXIiLCAicERldmljZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURldmljZS1wRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEZXZpY2UtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURldmljZS1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGV2aWNlLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAxMzg3IiwgIkFsbCByZXF1aXJlZCBleHRlbnNpb25zIGZvciBlYWNoIGV4dGVuc2lvbiBpbiB0aGUgVmtEZXZpY2VDcmVhdGVJbmZvOjpwcEVuYWJsZWRFeHRlbnNpb25OYW1lcyBsaXN0IG11c3QgYWxzbyBiZSBwcmVzZW50IGluIHRoYXQgbGlzdC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEZXZpY2UtcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtMDEzODcpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItZGlzcGxheS1wYXJhbWV0ZXIiLCAiZGlzcGxheSBtdXN0IGJlIGEgdmFsaWQgVmtEaXNwbGF5S0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURpc3BsYXlNb2RlS0hSLWRpc3BsYXktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURpc3BsYXlNb2RlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEaXNwbGF5TW9kZUNyZWF0ZUluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURpc3BsYXlNb2RlS0hSLXBNb2RlLXBhcmFtZXRlciIsICJwTW9kZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRGlzcGxheU1vZGVLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGlzcGxheU1vZGVLSFItcE1vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZURpc3BsYXlNb2RlS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEaXNwbGF5TW9kZUtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIiLCAiaW5zdGFuY2UgbXVzdCBiZSBhIHZhbGlkIFZrSW5zdGFuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0Rpc3BsYXlTdXJmYWNlQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSLXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsICJwU3VyZmFjZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrU3VyZmFjZUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVFdmVudC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRXZlbnQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVFdmVudC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUV2ZW50LXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUV2ZW50LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRXZlbnRDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUV2ZW50LXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVFdmVudC1wRXZlbnQtcGFyYW1ldGVyIiwgInBFdmVudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRXZlbnQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRXZlbnQtcEV2ZW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVGZW5jZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRmVuY2UtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVGZW5jZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUZlbmNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUZlbmNlLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRmVuY2VDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUZlbmNlLXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVGZW5jZS1wRmVuY2UtcGFyYW1ldGVyIiwgInBGZW5jZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRmVuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRmVuY2UtcEZlbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVGcmFtZWJ1ZmZlci1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlRnJhbWVidWZmZXItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVGcmFtZWJ1ZmZlci1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUZyYW1lYnVmZmVyLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUZyYW1lYnVmZmVyLXBDcmVhdGVJbmZvLTAyNzc3IiwgIklmIHBDcmVhdGVJbmZvLT5mbGFncyBkb2VzIG5vdCBpbmNsdWRlIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUiwgYW5kIGF0dGFjaG1lbnRDb3VudCBpcyBub3QgMCwgZWFjaCBlbGVtZW50IG9mIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBvbiBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVGcmFtZWJ1ZmZlci1wQ3JlYXRlSW5mby0wMjc3NykifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVGcmFtZWJ1ZmZlci1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVGcmFtZWJ1ZmZlci1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlRnJhbWVidWZmZXItcEZyYW1lYnVmZmVyLXBhcmFtZXRlciIsICJwRnJhbWVidWZmZXIgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0ZyYW1lYnVmZmVyIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUZyYW1lYnVmZmVyLXBGcmFtZWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtY3JlYXRlSW5mb0NvdW50LWFycmF5bGVuZ3RoIiwgImNyZWF0ZUluZm9Db3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtY3JlYXRlSW5mb0NvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLWZsYWdzLTAwNzIwIiwgIklmIHRoZSBmbGFncyBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcENyZWF0ZUluZm9zIGNvbnRhaW5zIHRoZSBWS19QSVBFTElORV9DUkVBVEVfREVSSVZBVElWRV9CSVQgZmxhZywgYW5kIHRoZSBiYXNlUGlwZWxpbmVJbmRleCBtZW1iZXIgb2YgdGhhdCBzYW1lIGVsZW1lbnQgaXMgbm90IC0xLCBiYXNlUGlwZWxpbmVJbmRleCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgaW5kZXggaW50byBwQ3JlYXRlSW5mb3MgdGhhdCBjb3JyZXNwb25kcyB0byB0aGF0IGVsZW1lbnQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1mbGFncy0wMDcyMCkifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1mbGFncy0wMDcyMSIsICJJZiB0aGUgZmxhZ3MgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBDcmVhdGVJbmZvcyBjb250YWlucyB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGZsYWcsIHRoZSBiYXNlIHBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0FMTE9XX0RFUklWQVRJVkVTX0JJVCBmbGFnIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLWZsYWdzLTAwNzIxKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcENyZWF0ZUluZm9zLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mb3MgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY3JlYXRlSW5mb0NvdW50IHZhbGlkIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLXBDcmVhdGVJbmZvcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcFBpcGVsaW5lcy1wYXJhbWV0ZXIiLCAicFBpcGVsaW5lcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjcmVhdGVJbmZvQ291bnQgVmtQaXBlbGluZSBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcFBpcGVsaW5lcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMtcGlwZWxpbmVDYWNoZS1wYXJhbWV0ZXIiLCAiSWYgcGlwZWxpbmVDYWNoZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHBpcGVsaW5lQ2FjaGUgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmVDYWNoZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1waXBlbGluZUNhY2hlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy1waXBlbGluZUNhY2hlLXBhcmVudCIsICJJZiBwaXBlbGluZUNhY2hlIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLXBpcGVsaW5lQ2FjaGUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVC1pbnN0YW5jZS1wYXJhbWV0ZXIiLCAiaW5zdGFuY2UgbXVzdCBiZSBhIHZhbGlkIFZrSW5zdGFuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhULWluc3RhbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhULXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrSGVhZGxlc3NTdXJmYWNlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVIZWFkbGVzc1N1cmZhY2VFWFQtcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUhlYWRsZXNzU3VyZmFjZUVYVC1wU3VyZmFjZS1wYXJhbWV0ZXIiLCAicFN1cmZhY2UgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSGVhZGxlc3NTdXJmYWNlRVhULXBTdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVJT1NTdXJmYWNlTVZLLWluc3RhbmNlLXBhcmFtZXRlciIsICJpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVJT1NTdXJmYWNlTVZLLWluc3RhbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVJT1NTdXJmYWNlTVZLLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSU9TU3VyZmFjZU1WSy1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVJT1NTdXJmYWNlTVZLLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSU9TU3VyZmFjZU1WSy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSU9TU3VyZmFjZU1WSy1wU3VyZmFjZS1wYXJhbWV0ZXIiLCAicFN1cmZhY2UgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSU9TU3VyZmFjZU1WSy1wU3VyZmFjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW1hZ2UtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUltYWdlLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW1hZ2UtZmxhZ3MtMDA5MzkiLCAiSWYgdGhlIGZsYWdzIG1lbWJlciBvZiBwQ3JlYXRlSW5mbyBpbmNsdWRlcyBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULCBjcmVhdGluZyB0aGlzIFZrSW1hZ2UgbXVzdCBub3QgY2F1c2UgdGhlIHRvdGFsIHJlcXVpcmVkIHNwYXJzZSBtZW1vcnkgZm9yIGFsbCBjdXJyZW50bHkgdmFsaWQgc3BhcnNlIHJlc291cmNlcyBvbiB0aGUgZGV2aWNlIHRvIGV4Y2VlZCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjpzcGFyc2VBZGRyZXNzU3BhY2VTaXplIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSW1hZ2UtZmxhZ3MtMDA5MzkpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW1hZ2UtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVJbWFnZS1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVJbWFnZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0ltYWdlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVJbWFnZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW1hZ2UtcEltYWdlLXBhcmFtZXRlciIsICJwSW1hZ2UgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0ltYWdlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUltYWdlLXBJbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEtaW5zdGFuY2UtcGFyYW1ldGVyIiwgImluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBLWluc3RhbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrSW1hZ2VQaXBlU3VyZmFjZUNyZWF0ZUluZm9GVUNIU0lBIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUltYWdlUGlwZVN1cmZhY2VGVUNIU0lBLXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVJbWFnZVBpcGVTdXJmYWNlRlVDSFNJQS1wU3VyZmFjZS1wYXJhbWV0ZXIiLCAicFN1cmZhY2UgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSW1hZ2VQaXBlU3VyZmFjZUZVQ0hTSUEtcFN1cmZhY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUltYWdlVmlldy1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSW1hZ2VWaWV3LWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW1hZ2VWaWV3LXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSW1hZ2VWaWV3LXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUltYWdlVmlldy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSW1hZ2VWaWV3LXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVJbWFnZVZpZXctcFZpZXctcGFyYW1ldGVyIiwgInBWaWV3IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtJbWFnZVZpZXcgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSW1hZ2VWaWV3LXBWaWV3LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXRDcmVhdGVJbmZvTlZYIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQtcGFyYW1ldGVyIiwgInBJbmRpcmVjdENvbW1hbmRzTGF5b3V0IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtcEluZGlyZWN0Q29tbWFuZHNMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUluc3RhbmNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSW5zdGFuY2UtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlSW5zdGFuY2UtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtJbnN0YW5jZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlSW5zdGFuY2UtcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUluc3RhbmNlLXBJbnN0YW5jZS1wYXJhbWV0ZXIiLCAicEluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVJbnN0YW5jZS1wSW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZUluc3RhbmNlLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAxMzg4IiwgIkFsbCByZXF1aXJlZCBleHRlbnNpb25zIGZvciBlYWNoIGV4dGVuc2lvbiBpbiB0aGUgVmtJbnN0YW5jZUNyZWF0ZUluZm86OnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzIGxpc3QgbXVzdCBhbHNvIGJlIHByZXNlbnQgaW4gdGhhdCBsaXN0LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZUluc3RhbmNlLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAxMzg4KSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZU1hY09TU3VyZmFjZU1WSy1pbnN0YW5jZS1wYXJhbWV0ZXIiLCAiaW5zdGFuY2UgbXVzdCBiZSBhIHZhbGlkIFZrSW5zdGFuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLLWluc3RhbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVNYWNPU1N1cmZhY2VNVkstcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVNYWNPU1N1cmZhY2VNVkstcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrTWFjT1NTdXJmYWNlQ3JlYXRlSW5mb01WSyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVNYWNPU1N1cmZhY2VNVkstcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZU1hY09TU3VyZmFjZU1WSy1wU3VyZmFjZS1wYXJhbWV0ZXIiLCAicFN1cmZhY2UgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlTWFjT1NTdXJmYWNlTVZLLXBTdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQtaW5zdGFuY2UtcGFyYW1ldGVyIiwgImluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVC1pbnN0YW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa01ldGFsU3VyZmFjZUNyZWF0ZUluZm9FWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlTWV0YWxTdXJmYWNlRVhULXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVNZXRhbFN1cmZhY2VFWFQtcFN1cmZhY2UtcGFyYW1ldGVyIiwgInBTdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtTdXJmYWNlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZU1ldGFsU3VyZmFjZUVYVC1wU3VyZmFjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlT2JqZWN0VGFibGVOVlgtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZU9iamVjdFRhYmxlTlZYLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlT2JqZWN0VGFibGVOVlgtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVPYmplY3RUYWJsZU5WWC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVPYmplY3RUYWJsZU5WWC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa09iamVjdFRhYmxlQ3JlYXRlSW5mb05WWCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVPYmplY3RUYWJsZU5WWC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlT2JqZWN0VGFibGVOVlgtcE9iamVjdFRhYmxlLXBhcmFtZXRlciIsICJwT2JqZWN0VGFibGUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa09iamVjdFRhYmxlTlZYIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZU9iamVjdFRhYmxlTlZYLXBPYmplY3RUYWJsZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUGlwZWxpbmVDYWNoZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlUGlwZWxpbmVDYWNoZS1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVBpcGVsaW5lQ2FjaGUtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVQaXBlbGluZUNhY2hlLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVBpcGVsaW5lQ2FjaGUtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVQaXBlbGluZUNhY2hlLXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVQaXBlbGluZUNhY2hlLXBQaXBlbGluZUNhY2hlLXBhcmFtZXRlciIsICJwUGlwZWxpbmVDYWNoZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrUGlwZWxpbmVDYWNoZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVQaXBlbGluZUNhY2hlLXBQaXBlbGluZUNhY2hlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVQaXBlbGluZUxheW91dC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVQaXBlbGluZUxheW91dC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVBpcGVsaW5lTGF5b3V0LXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVBpcGVsaW5lTGF5b3V0LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVBpcGVsaW5lTGF5b3V0LXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVQaXBlbGluZUxheW91dC1wUGlwZWxpbmVMYXlvdXQtcGFyYW1ldGVyIiwgInBQaXBlbGluZUxheW91dCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrUGlwZWxpbmVMYXlvdXQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQtcFBpcGVsaW5lTGF5b3V0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVRdWVyeVBvb2wtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVF1ZXJ5UG9vbC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVF1ZXJ5UG9vbC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVF1ZXJ5UG9vbC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVRdWVyeVBvb2wtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVF1ZXJ5UG9vbC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUXVlcnlQb29sLXBRdWVyeVBvb2wtcGFyYW1ldGVyIiwgInBRdWVyeVBvb2wgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1F1ZXJ5UG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVRdWVyeVBvb2wtcFF1ZXJ5UG9vbC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLWNyZWF0ZUluZm9Db3VudC1hcnJheWxlbmd0aCIsICJjcmVhdGVJbmZvQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1jcmVhdGVJbmZvQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtZmxhZ3MtMDI0MDIiLCAiSWYgdGhlIGZsYWdzIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwQ3JlYXRlSW5mb3MgY29udGFpbnMgdGhlIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCBmbGFnLCBhbmQgdGhlIGJhc2VQaXBlbGluZUluZGV4IG1lbWJlciBvZiB0aGF0IHNhbWUgZWxlbWVudCBpcyBub3QgLTEsIGJhc2VQaXBlbGluZUluZGV4IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBpbmRleCBpbnRvIHBDcmVhdGVJbmZvcyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXQgZWxlbWVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1mbGFncy0wMjQwMikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtZmxhZ3MtMDI0MDMiLCAiSWYgdGhlIGZsYWdzIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwQ3JlYXRlSW5mb3MgY29udGFpbnMgdGhlIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCBmbGFnLCB0aGUgYmFzZSBwaXBlbGluZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIFZLX1BJUEVMSU5FX0NSRUFURV9BTExPV19ERVJJVkFUSVZFU19CSVQgZmxhZyBzZXQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtZmxhZ3MtMDI0MDMpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1wQ3JlYXRlSW5mb3MtcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjcmVhdGVJbmZvQ291bnQgdmFsaWQgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1wQ3JlYXRlSW5mb3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1wUGlwZWxpbmVzLXBhcmFtZXRlciIsICJwUGlwZWxpbmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNyZWF0ZUluZm9Db3VudCBWa1BpcGVsaW5lIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYtcFBpcGVsaW5lcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLXBpcGVsaW5lQ2FjaGUtcGFyYW1ldGVyIiwgIklmIHBpcGVsaW5lQ2FjaGUgaXMgbm90IFZLX05VTExfSEFORExFLCBwaXBlbGluZUNhY2hlIG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lQ2FjaGUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WLXBpcGVsaW5lQ2FjaGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1waXBlbGluZUNhY2hlLXBhcmVudCIsICJJZiBwaXBlbGluZUNhY2hlIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVi1waXBlbGluZUNhY2hlLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUmVuZGVyUGFzcy1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUmVuZGVyUGFzcy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MtcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MtcFJlbmRlclBhc3MtcGFyYW1ldGVyIiwgInBSZW5kZXJQYXNzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtSZW5kZXJQYXNzIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MtcFJlbmRlclBhc3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MyS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzMktIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MyS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlUmVuZGVyUGFzczJLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlUmVuZGVyUGFzczJLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlUmVuZGVyUGFzczJLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVJlbmRlclBhc3MyS0hSLXBSZW5kZXJQYXNzLXBhcmFtZXRlciIsICJwUmVuZGVyUGFzcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrUmVuZGVyUGFzcyBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVSZW5kZXJQYXNzMktIUi1wUmVuZGVyUGFzcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlU2FtcGxlci1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlU2FtcGxlci1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVNhbXBsZXItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTYW1wbGVyLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVNhbXBsZXItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTYW1wbGVyLXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTYW1wbGVyLXBTYW1wbGVyLXBhcmFtZXRlciIsICJwU2FtcGxlciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrU2FtcGxlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTYW1wbGVyLXBTYW1wbGVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLU5vbmUtMDE2NDgiLCAiVGhlIHNhbXBsZXIgWSdDQkNSIGNvbnZlcnNpb24gZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLU5vbmUtMDE2NDgpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24tcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24tcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXBZY2JjckNvbnZlcnNpb24tcGFyYW1ldGVyIiwgInBZY2JjckNvbnZlcnNpb24gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbi1wWWNiY3JDb252ZXJzaW9uLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTZW1hcGhvcmUtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVNlbWFwaG9yZS1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVNlbWFwaG9yZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVNlbWFwaG9yZS1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTZW1hcGhvcmUtcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVNlbWFwaG9yZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlU2VtYXBob3JlLXBTZW1hcGhvcmUtcGFyYW1ldGVyIiwgInBTZW1hcGhvcmUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1NlbWFwaG9yZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTZW1hcGhvcmUtcFNlbWFwaG9yZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlU2hhZGVyTW9kdWxlLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTaGFkZXJNb2R1bGUtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTaGFkZXJNb2R1bGUtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTaGFkZXJNb2R1bGUtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlU2hhZGVyTW9kdWxlLXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTaGFkZXJNb2R1bGUtcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVNoYWRlck1vZHVsZS1wU2hhZGVyTW9kdWxlLXBhcmFtZXRlciIsICJwU2hhZGVyTW9kdWxlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtTaGFkZXJNb2R1bGUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlU2hhZGVyTW9kdWxlLXBTaGFkZXJNb2R1bGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUi1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXBDcmVhdGVJbmZvcy1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm9zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN3YXBjaGFpbkNvdW50IHZhbGlkIFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlU2hhcmVkU3dhcGNoYWluc0tIUi1wQ3JlYXRlSW5mb3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFItcFN3YXBjaGFpbnMtcGFyYW1ldGVyIiwgInBTd2FwY2hhaW5zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN3YXBjaGFpbkNvdW50IFZrU3dhcGNoYWluS0hSIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXBTd2FwY2hhaW5zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoIiwgInN3YXBjaGFpbkNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSLXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQLWluc3RhbmNlLXBhcmFtZXRlciIsICJpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUC1pbnN0YW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1N0cmVhbURlc2NyaXB0b3JTdXJmYWNlQ3JlYXRlSW5mb0dHUCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTdHJlYW1EZXNjcmlwdG9yU3VyZmFjZUdHUC1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlU3RyZWFtRGVzY3JpcHRvclN1cmZhY2VHR1AtcFN1cmZhY2UtcGFyYW1ldGVyIiwgInBTdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtTdXJmYWNlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVN0cmVhbURlc2NyaXB0b3JTdXJmYWNlR0dQLXBTdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTd2FwY2hhaW5LSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVN3YXBjaGFpbktIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVN3YXBjaGFpbktIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVN3YXBjaGFpbktIUi1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVTd2FwY2hhaW5LSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVN3YXBjaGFpbktIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlU3dhcGNoYWluS0hSLXBTd2FwY2hhaW4tcGFyYW1ldGVyIiwgInBTd2FwY2hhaW4gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1N3YXBjaGFpbktIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVTd2FwY2hhaW5LSFItcFN3YXBjaGFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhULXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQtcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVC1wVmFsaWRhdGlvbkNhY2hlLXBhcmFtZXRlciIsICJwVmFsaWRhdGlvbkNhY2hlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhULXBWYWxpZGF0aW9uQ2FjaGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVZpU3VyZmFjZU5OLWluc3RhbmNlLXBhcmFtZXRlciIsICJpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVWaVN1cmZhY2VOTi1pbnN0YW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlVmlTdXJmYWNlTk4tcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVWaVN1cmZhY2VOTi1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVWaVN1cmZhY2VOTi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiLCAicENyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1ZpU3VyZmFjZUNyZWF0ZUluZm9OTiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVWaVN1cmZhY2VOTi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlVmlTdXJmYWNlTk4tcFN1cmZhY2UtcGFyYW1ldGVyIiwgInBTdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtTdXJmYWNlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVZpU3VyZmFjZU5OLXBTdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIiLCAiaW5zdGFuY2UgbXVzdCBiZSBhIHZhbGlkIFZrSW5zdGFuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsICJwU3VyZmFjZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrU3VyZmFjZUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUi1wU3VyZmFjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlciIsICJpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUi1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsICJwU3VyZmFjZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrU3VyZmFjZUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFItcFN1cmZhY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVhjYlN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyIiwgImluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0NyZWF0ZVhjYlN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVhjYlN1cmZhY2VLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVhjYlN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLXBDcmVhdGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsICJwU3VyZmFjZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrU3VyZmFjZUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVYY2JTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtDcmVhdGVYbGliU3VyZmFjZUtIUi1pbnN0YW5jZS1wYXJhbWV0ZXIiLCAiaW5zdGFuY2UgbXVzdCBiZSBhIHZhbGlkIFZrSW5zdGFuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlWGxpYlN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVhsaWJTdXJmYWNlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlWGxpYlN1cmZhY2VLSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrQ3JlYXRlWGxpYlN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyIiwgInBDcmVhdGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrQ3JlYXRlWGxpYlN1cmZhY2VLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0NyZWF0ZVhsaWJTdXJmYWNlS0hSLXBTdXJmYWNlLXBhcmFtZXRlciIsICJwU3VyZmFjZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrU3VyZmFjZUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtDcmVhdGVYbGliU3VyZmFjZUtIUi1wU3VyZmFjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQtcE5hbWVJbmZvLXBhcmFtZXRlciIsICJwTmFtZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhULXBOYW1lSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0RlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhULWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQtcFRhZ0luZm8tcGFyYW1ldGVyIiwgInBUYWdJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQtcFRhZ0luZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRGVidWdSZXBvcnRGbGFnQml0c0VYVCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1mbGFncy1yZXF1aXJlZGJpdG1hc2siLCAiZmxhZ3MgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1mbGFncy1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELXZrRGVidWdSZXBvcnRNZXNzYWdlRVhULWluc3RhbmNlLXBhcmFtZXRlciIsICJpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1vYmplY3QtMDEyNDEiLCAib2JqZWN0IG11c3QgYmUgYSBWdWxrYW4gb2JqZWN0IG9yIFZLX05VTExfSEFORExFIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVidWdSZXBvcnRNZXNzYWdlRVhULW9iamVjdC0wMTI0MSkifSwKKyAgICB7IlZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtb2JqZWN0VHlwZS0wMTQ5OCIsICJJZiBvYmplY3RUeXBlIGlzIG5vdCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQgYW5kIG9iamVjdCBpcyBub3QgVktfTlVMTF9IQU5ETEUsIG9iamVjdCBtdXN0IGJlIGEgVnVsa2FuIG9iamVjdCBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGFzc29jaWF0ZWQgd2l0aCBvYmplY3RUeXBlIGFzIGRlZmluZWQgaW4gVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgYW5kIFZ1bGthbiBIYW5kbGUgUmVsYXRpb25zaGlwLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1vYmplY3RUeXBlLTAxNDk4KSJ9LAorICAgIHsiVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1vYmplY3RUeXBlLXBhcmFtZXRlciIsICJvYmplY3RUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0RlYnVnUmVwb3J0TWVzc2FnZUVYVC1vYmplY3RUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtcExheWVyUHJlZml4LXBhcmFtZXRlciIsICJwTGF5ZXJQcmVmaXggbXVzdCBiZSBhIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtcExheWVyUHJlZml4LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQtcE1lc3NhZ2UtcGFyYW1ldGVyIiwgInBNZXNzYWdlIG11c3QgYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVidWdSZXBvcnRNZXNzYWdlRVhULXBNZXNzYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLTAyNDQyIiwgIkFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgbXVzdCBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLTAyNDQyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtMDI0NDMiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIG11c3QgYmUgcHJvdmlkZWQgaGVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtMDI0NDMpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS0wMjQ0NCIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGFjY2VsZXJhdGlvblN0cnVjdHVyZSB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLTAyNDQ0KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyYW1ldGVyIiwgImFjY2VsZXJhdGlvblN0cnVjdHVyZSBtdXN0IGJlIGEgdmFsaWQgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmVudCIsICJhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci0wMDkyMiIsICJBbGwgc3VibWl0dGVkIGNvbW1hbmRzIHRoYXQgcmVmZXIgdG8gYnVmZmVyLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIGEgVmtCdWZmZXJWaWV3LCBtdXN0IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lCdWZmZXItYnVmZmVyLTAwOTIyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lCdWZmZXItYnVmZmVyLTAwOTIzIiwgIklmIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gYnVmZmVyIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci0wMDkyMykifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci0wMDkyNCIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGJ1ZmZlciB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci0wMDkyNCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci1wYXJhbWV0ZXIiLCAiSWYgYnVmZmVyIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUJ1ZmZlci1idWZmZXItcGFyZW50IiwgIklmIGJ1ZmZlciBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUJ1ZmZlci1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUJ1ZmZlci1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lCdWZmZXItcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LWJ1ZmZlclZpZXctMDA5MzYiLCAiQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIGJ1ZmZlclZpZXcgbXVzdCBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LTAwOTM2KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LWJ1ZmZlclZpZXctMDA5MzciLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBidWZmZXJWaWV3IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LTAwOTM3KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LWJ1ZmZlclZpZXctMDA5MzgiLCAiSWYgbm8gVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBidWZmZXJWaWV3IHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LWJ1ZmZlclZpZXctMDA5MzgpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUJ1ZmZlclZpZXctYnVmZmVyVmlldy1wYXJhbWV0ZXIiLCAiSWYgYnVmZmVyVmlldyBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGJ1ZmZlclZpZXcgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyVmlldyBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LXBhcmVudCIsICJJZiBidWZmZXJWaWV3IGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LWJ1ZmZlclZpZXctcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUJ1ZmZlclZpZXctcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLTAwMDQxIiwgIkFsbCBWa0NvbW1hbmRCdWZmZXIgb2JqZWN0cyBhbGxvY2F0ZWQgZnJvbSBjb21tYW5kUG9vbCBtdXN0IG5vdCBiZSBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtMDAwNDEpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLTAwMDQyIiwgIklmIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gY29tbWFuZFBvb2wgd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIG11c3QgYmUgcHJvdmlkZWQgaGVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lDb21tYW5kUG9vbC1jb21tYW5kUG9vbC0wMDA0MikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtMDAwNDMiLCAiSWYgbm8gVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBjb21tYW5kUG9vbCB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtMDAwNDMpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmFtZXRlciIsICJJZiBjb21tYW5kUG9vbCBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGNvbW1hbmRQb29sIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRQb29sIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lDb21tYW5kUG9vbC1jb21tYW5kUG9vbC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmVudCIsICJJZiBjb21tYW5kUG9vbCBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lDb21tYW5kUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWNhbGxiYWNrLXBhcmFtZXRlciIsICJjYWxsYmFjayBtdXN0IGJlIGEgdmFsaWQgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWNhbGxiYWNrLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVC1jYWxsYmFjay1wYXJlbnQiLCAiY2FsbGJhY2sgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWNhbGxiYWNrLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVC1pbnN0YW5jZS0wMTI0MiIsICJJZiBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGNhbGxiYWNrIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVC1pbnN0YW5jZS0wMTI0MikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVC1pbnN0YW5jZS0wMTI0MyIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGNhbGxiYWNrIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWluc3RhbmNlLTAxMjQzKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhULWluc3RhbmNlLXBhcmFtZXRlciIsICJpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVC1pbnN0YW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVC1pbnN0YW5jZS1wYXJhbWV0ZXIiLCAiaW5zdGFuY2UgbXVzdCBiZSBhIHZhbGlkIFZrSW5zdGFuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULW1lc3Nlbmdlci0wMTkxNSIsICJJZiBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIG1lc3NlbmdlciB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtbWVzc2VuZ2VyLTAxOTE1KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULW1lc3Nlbmdlci0wMTkxNiIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIG1lc3NlbmdlciB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVC1tZXNzZW5nZXItMDE5MTYpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtbWVzc2VuZ2VyLXBhcmFtZXRlciIsICJtZXNzZW5nZXIgbXVzdCBiZSBhIHZhbGlkIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVC1tZXNzZW5nZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULW1lc3Nlbmdlci1wYXJlbnQiLCAibWVzc2VuZ2VyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gaW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVC1tZXNzZW5nZXItcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLTAwMzAzIiwgIkFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byBkZXNjcmlwdG9yUG9vbCAodmlhIGFueSBhbGxvY2F0ZWQgZGVzY3JpcHRvciBzZXRzKSBtdXN0IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC0wMDMwMykifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtMDAzMDQiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBkZXNjcmlwdG9yUG9vbCB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLTAwMzA0KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC0wMDMwNSIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGRlc2NyaXB0b3JQb29sIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC0wMDMwNSkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtcGFyYW1ldGVyIiwgIklmIGRlc2NyaXB0b3JQb29sIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBhIHZhbGlkIFZrRGVzY3JpcHRvclBvb2wgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtcGFyZW50IiwgIklmIGRlc2NyaXB0b3JQb29sIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JQb29sLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGVzY3JpcHRvclNldExheW91dC0wMDI4NCIsICJJZiBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGRlc2NyaXB0b3JTZXRMYXlvdXQgd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIG11c3QgYmUgcHJvdmlkZWQgaGVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAyODQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGVzY3JpcHRvclNldExheW91dC0wMDI4NSIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGRlc2NyaXB0b3JTZXRMYXlvdXQgd2FzIGNyZWF0ZWQsIHBBbGxvY2F0b3IgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGVzY3JpcHRvclNldExheW91dC0wMDI4NSkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dC1kZXNjcmlwdG9yU2V0TGF5b3V0LXBhcmFtZXRlciIsICJJZiBkZXNjcmlwdG9yU2V0TGF5b3V0IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZGVzY3JpcHRvclNldExheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRlc2NyaXB0b3JTZXRMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRlc2NyaXB0b3JTZXRMYXlvdXQtcGFyZW50IiwgIklmIGRlc2NyaXB0b3JTZXRMYXlvdXQgaXMgYSB2YWxpZCBoYW5kbGUsIGl0IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGVzY3JpcHRvclNldExheW91dC1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAzNTYiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBkZXNjcmlwdG9yU2V0TGF5b3V0IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAzNTYpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yU2V0TGF5b3V0LTAwMzU3IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gZGVzY3JpcHRvclNldExheW91dCB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAzNTcpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyIiwgIklmIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBhcmVudCIsICJJZiBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgaXMgYSB2YWxpZCBoYW5kbGUsIGl0IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGV2aWNlLWRldmljZS0wMDM3OCIsICJBbGwgY2hpbGQgb2JqZWN0cyBjcmVhdGVkIG9uIGRldmljZSBtdXN0IGhhdmUgYmVlbiBkZXN0cm95ZWQgcHJpb3IgdG8gZGVzdHJveWluZyBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGV2aWNlLWRldmljZS0wMDM3OCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RGV2aWNlLWRldmljZS0wMDM3OSIsICJJZiBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGRldmljZSB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURldmljZS1kZXZpY2UtMDAzNzkpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURldmljZS1kZXZpY2UtMDAzODAiLCAiSWYgbm8gVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBkZXZpY2Ugd2FzIGNyZWF0ZWQsIHBBbGxvY2F0b3IgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveURldmljZS1kZXZpY2UtMDAzODApIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURldmljZS1kZXZpY2UtcGFyYW1ldGVyIiwgIklmIGRldmljZSBpcyBub3QgTlVMTCwgZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RGV2aWNlLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveURldmljZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lEZXZpY2UtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RXZlbnQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtMDExNDUiLCAiQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIGV2ZW50IG11c3QgaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LTAxMTQ1KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lFdmVudC1ldmVudC0wMTE0NiIsICJJZiBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGV2ZW50IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtMDExNDYpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LTAxMTQ3IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gZXZlbnQgd2FzIGNyZWF0ZWQsIHBBbGxvY2F0b3IgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LTAxMTQ3KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lFdmVudC1ldmVudC1wYXJhbWV0ZXIiLCAiSWYgZXZlbnQgaXMgbm90IFZLX05VTExfSEFORExFLCBldmVudCBtdXN0IGJlIGEgdmFsaWQgVmtFdmVudCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lFdmVudC1ldmVudC1wYXJlbnQiLCAiSWYgZXZlbnQgaXMgYSB2YWxpZCBoYW5kbGUsIGl0IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RXZlbnQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RXZlbnQtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUZlbmNlLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95RmVuY2UtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RmVuY2UtZmVuY2UtMDExMjAiLCAiQWxsIHF1ZXVlIHN1Ym1pc3Npb24gY29tbWFuZHMgdGhhdCByZWZlciB0byBmZW5jZSBtdXN0IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lGZW5jZS1mZW5jZS0wMTEyMCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RmVuY2UtZmVuY2UtMDExMjEiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBmZW5jZSB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUZlbmNlLWZlbmNlLTAxMTIxKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lGZW5jZS1mZW5jZS0wMTEyMiIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGZlbmNlIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lGZW5jZS1mZW5jZS0wMTEyMikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RmVuY2UtZmVuY2UtcGFyYW1ldGVyIiwgIklmIGZlbmNlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZmVuY2UgbXVzdCBiZSBhIHZhbGlkIFZrRmVuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUZlbmNlLWZlbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RmVuY2UtZmVuY2UtcGFyZW50IiwgIklmIGZlbmNlIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lGZW5jZS1mZW5jZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUZlbmNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUZlbmNlLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLTAwODkyIiwgIkFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byBmcmFtZWJ1ZmZlciBtdXN0IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1mcmFtZWJ1ZmZlci0wMDg5MikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RnJhbWVidWZmZXItZnJhbWVidWZmZXItMDA4OTMiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBmcmFtZWJ1ZmZlciB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLTAwODkzKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1mcmFtZWJ1ZmZlci0wMDg5NCIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGZyYW1lYnVmZmVyIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1mcmFtZWJ1ZmZlci0wMDg5NCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RnJhbWVidWZmZXItZnJhbWVidWZmZXItcGFyYW1ldGVyIiwgIklmIGZyYW1lYnVmZmVyIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZnJhbWVidWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrRnJhbWVidWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95RnJhbWVidWZmZXItZnJhbWVidWZmZXItcGFyZW50IiwgIklmIGZyYW1lYnVmZmVyIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1mcmFtZWJ1ZmZlci1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbWFnZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUltYWdlLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUltYWdlLWltYWdlLTAxMDAwIiwgIkFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byBpbWFnZSwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSBhIFZrSW1hZ2VWaWV3LCBtdXN0IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbWFnZS1pbWFnZS0wMTAwMCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtMDEwMDEiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUltYWdlLWltYWdlLTAxMDAxKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbWFnZS1pbWFnZS0wMTAwMiIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGltYWdlIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbWFnZS1pbWFnZS0wMTAwMikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtcGFyYW1ldGVyIiwgIklmIGltYWdlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUltYWdlLWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtcGFyZW50IiwgIklmIGltYWdlIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbWFnZS1pbWFnZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUltYWdlLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUltYWdlLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW1hZ2VWaWV3LWltYWdlVmlldy0wMTAyNiIsICJBbGwgc3VibWl0dGVkIGNvbW1hbmRzIHRoYXQgcmVmZXIgdG8gaW1hZ2VWaWV3IG11c3QgaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUltYWdlVmlldy1pbWFnZVZpZXctMDEwMjYpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUltYWdlVmlldy1pbWFnZVZpZXctMDEwMjciLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBpbWFnZVZpZXcgd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIG11c3QgYmUgcHJvdmlkZWQgaGVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LTAxMDI3KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LTAxMDI4IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gaW1hZ2VWaWV3IHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LTAxMDI4KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LXBhcmFtZXRlciIsICJJZiBpbWFnZVZpZXcgaXMgbm90IFZLX05VTExfSEFORExFLCBpbWFnZVZpZXcgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VWaWV3IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW1hZ2VWaWV3LWltYWdlVmlldy1wYXJlbnQiLCAiSWYgaW1hZ2VWaWV3IGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbWFnZVZpZXctaW1hZ2VWaWV3LXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW1hZ2VWaWV3LXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUltYWdlVmlldy1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1pbmRpcmVjdENvbW1hbmRzTGF5b3V0LTAxMzUyIiwgIkFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byBpbmRpcmVjdENvbW1hbmRzTGF5b3V0IG11c3QgaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtaW5kaXJlY3RDb21tYW5kc0xheW91dC0wMTM1MikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1pbmRpcmVjdENvbW1hbmRzTGF5b3V0LXBhcmFtZXRlciIsICJpbmRpcmVjdENvbW1hbmRzTGF5b3V0IG11c3QgYmUgYSB2YWxpZCBWa0luZGlyZWN0Q29tbWFuZHNMYXlvdXROVlggaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtaW5kaXJlY3RDb21tYW5kc0xheW91dC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtaW5kaXJlY3RDb21tYW5kc0xheW91dC1wYXJlbnQiLCAiaW5kaXJlY3RDb21tYW5kc0xheW91dCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLWluZGlyZWN0Q29tbWFuZHNMYXlvdXQtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLW9iamVjdFRhYmxlLTAxMzUzIiwgIklmIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gb2JqZWN0VGFibGUgd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIG11c3QgYmUgcHJvdmlkZWQgaGVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLW9iamVjdFRhYmxlLTAxMzUzKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYLW9iamVjdFRhYmxlLTAxMzU0IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gb2JqZWN0VGFibGUgd2FzIGNyZWF0ZWQsIHBBbGxvY2F0b3IgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtb2JqZWN0VGFibGUtMDEzNTQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveUluZGlyZWN0Q29tbWFuZHNMYXlvdXROVlgtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95SW5kaXJlY3RDb21tYW5kc0xheW91dE5WWC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW5zdGFuY2UtaW5zdGFuY2UtMDA2MjkiLCAiQWxsIGNoaWxkIG9iamVjdHMgY3JlYXRlZCB1c2luZyBpbnN0YW5jZSBtdXN0IGhhdmUgYmVlbiBkZXN0cm95ZWQgcHJpb3IgdG8gZGVzdHJveWluZyBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1pbnN0YW5jZS0wMDYyOSkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW5zdGFuY2UtaW5zdGFuY2UtMDA2MzAiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBpbnN0YW5jZSB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveUluc3RhbmNlLWluc3RhbmNlLTAwNjMwKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1pbnN0YW5jZS0wMDYzMSIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIGluc3RhbmNlIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1pbnN0YW5jZS0wMDYzMSkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95SW5zdGFuY2UtaW5zdGFuY2UtcGFyYW1ldGVyIiwgIklmIGluc3RhbmNlIGlzIG5vdCBOVUxMLCBpbnN0YW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtJbnN0YW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95SW5zdGFuY2UtaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95T2JqZWN0VGFibGVOVlgtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1vYmplY3RUYWJsZS0wMTM2MSIsICJBbGwgc3VibWl0dGVkIGNvbW1hbmRzIHRoYXQgcmVmZXIgdG8gb2JqZWN0VGFibGUgbXVzdCBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveU9iamVjdFRhYmxlTlZYLW9iamVjdFRhYmxlLTAxMzYxKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1vYmplY3RUYWJsZS0wMTM2MiIsICJJZiBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIG9iamVjdFRhYmxlIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveU9iamVjdFRhYmxlTlZYLW9iamVjdFRhYmxlLTAxMzYyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1vYmplY3RUYWJsZS0wMTM2MyIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIG9iamVjdFRhYmxlIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95T2JqZWN0VGFibGVOVlgtb2JqZWN0VGFibGUtMDEzNjMpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveU9iamVjdFRhYmxlTlZYLW9iamVjdFRhYmxlLXBhcmFtZXRlciIsICJvYmplY3RUYWJsZSBtdXN0IGJlIGEgdmFsaWQgVmtPYmplY3RUYWJsZU5WWCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95T2JqZWN0VGFibGVOVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1vYmplY3RUYWJsZS1wYXJlbnQiLCAib2JqZWN0VGFibGUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95T2JqZWN0VGFibGVOVlgtb2JqZWN0VGFibGUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lPYmplY3RUYWJsZU5WWC1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UGlwZWxpbmUtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UGlwZWxpbmUtcGlwZWxpbmUtMDA3NjUiLCAiQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIHBpcGVsaW5lIG11c3QgaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLTAwNzY1KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1waXBlbGluZS0wMDc2NiIsICJJZiBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIHBpcGVsaW5lIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UGlwZWxpbmUtcGlwZWxpbmUtMDA3NjYpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLTAwNzY3IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gcGlwZWxpbmUgd2FzIGNyZWF0ZWQsIHBBbGxvY2F0b3IgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLTAwNzY3KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1waXBlbGluZS1wYXJhbWV0ZXIiLCAiSWYgcGlwZWxpbmUgaXMgbm90IFZLX05VTExfSEFORExFLCBwaXBlbGluZSBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UGlwZWxpbmUtcGlwZWxpbmUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZS1waXBlbGluZS1wYXJlbnQiLCAiSWYgcGlwZWxpbmUgaXMgYSB2YWxpZCBoYW5kbGUsIGl0IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UGlwZWxpbmVDYWNoZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UGlwZWxpbmVDYWNoZS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUNhY2hlLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUNhY2hlLXBpcGVsaW5lQ2FjaGUtMDA3NzEiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBwaXBlbGluZUNhY2hlIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UGlwZWxpbmVDYWNoZS1waXBlbGluZUNhY2hlLTAwNzcxKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUNhY2hlLXBpcGVsaW5lQ2FjaGUtMDA3NzIiLCAiSWYgbm8gVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBwaXBlbGluZUNhY2hlIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUNhY2hlLXBpcGVsaW5lQ2FjaGUtMDA3NzIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtcGlwZWxpbmVDYWNoZS1wYXJhbWV0ZXIiLCAiSWYgcGlwZWxpbmVDYWNoZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHBpcGVsaW5lQ2FjaGUgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmVDYWNoZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UGlwZWxpbmVDYWNoZS1waXBlbGluZUNhY2hlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UGlwZWxpbmVDYWNoZS1waXBlbGluZUNhY2hlLXBhcmVudCIsICJJZiBwaXBlbGluZUNhY2hlIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUNhY2hlLXBpcGVsaW5lQ2FjaGUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lTGF5b3V0LWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVBpcGVsaW5lTGF5b3V0LXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lTGF5b3V0LXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC0wMDI5OSIsICJJZiBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIHBpcGVsaW5lTGF5b3V0IHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQtcGlwZWxpbmVMYXlvdXQtMDAyOTkpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVBpcGVsaW5lTGF5b3V0LXBpcGVsaW5lTGF5b3V0LTAwMzAwIiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gcGlwZWxpbmVMYXlvdXQgd2FzIGNyZWF0ZWQsIHBBbGxvY2F0b3IgbXVzdCBiZSBOVUxMIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lTGF5b3V0LXBpcGVsaW5lTGF5b3V0LTAwMzAwKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC0wMjAwNCIsICJwaXBlbGluZUxheW91dCBtdXN0IG5vdCBoYXZlIGJlZW4gcGFzc2VkIHRvIGFueSB2a0NtZCogY29tbWFuZCBmb3IgYW55IGNvbW1hbmQgYnVmZmVycyB0aGF0IGFyZSBzdGlsbCBpbiB0aGUgcmVjb3JkaW5nIHN0YXRlIHdoZW4gdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQgaXMgY2FsbGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lTGF5b3V0LXBpcGVsaW5lTGF5b3V0LTAyMDA0KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC1wYXJhbWV0ZXIiLCAiSWYgcGlwZWxpbmVMYXlvdXQgaXMgbm90IFZLX05VTExfSEFORExFLCBwaXBlbGluZUxheW91dCBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZUxheW91dCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQtcGlwZWxpbmVMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC1wYXJlbnQiLCAiSWYgcGlwZWxpbmVMYXlvdXQgaXMgYSB2YWxpZCBoYW5kbGUsIGl0IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVBpcGVsaW5lTGF5b3V0LXBpcGVsaW5lTGF5b3V0LXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UXVlcnlQb29sLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVF1ZXJ5UG9vbC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVF1ZXJ5UG9vbC1xdWVyeVBvb2wtMDA3OTMiLCAiQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIHF1ZXJ5UG9vbCBtdXN0IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtcXVlcnlQb29sLTAwNzkzKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lRdWVyeVBvb2wtcXVlcnlQb29sLTAwNzk0IiwgIklmIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gcXVlcnlQb29sIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC0wMDc5NCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC0wMDc5NSIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIHF1ZXJ5UG9vbCB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC0wMDc5NSkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC1wYXJhbWV0ZXIiLCAiSWYgcXVlcnlQb29sIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgcXVlcnlQb29sIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXJ5UG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVF1ZXJ5UG9vbC1xdWVyeVBvb2wtcGFyZW50IiwgIklmIHF1ZXJ5UG9vbCBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lSZW5kZXJQYXNzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1wQWxsb2NhdG9yLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLTAwODczIiwgIkFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byByZW5kZXJQYXNzIG11c3QgaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy0wMDg3MykifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLTAwODc0IiwgIklmIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gcmVuZGVyUGFzcyB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy0wMDg3NCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLTAwODc1IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gcmVuZGVyUGFzcyB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLTAwODc1KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lSZW5kZXJQYXNzLXJlbmRlclBhc3MtcGFyYW1ldGVyIiwgIklmIHJlbmRlclBhc3MgaXMgbm90IFZLX05VTExfSEFORExFLCByZW5kZXJQYXNzIG11c3QgYmUgYSB2YWxpZCBWa1JlbmRlclBhc3MgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy1wYXJlbnQiLCAiSWYgcmVuZGVyUGFzcyBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U2FtcGxlci1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVNhbXBsZXItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U2FtcGxlci1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItMDEwODIiLCAiQWxsIHN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIHNhbXBsZXIgbXVzdCBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2FtcGxlci1zYW1wbGVyLTAxMDgyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItMDEwODMiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBzYW1wbGVyIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2FtcGxlci1zYW1wbGVyLTAxMDgzKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItMDEwODQiLCAiSWYgbm8gVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBzYW1wbGVyIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItMDEwODQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVNhbXBsZXItc2FtcGxlci1wYXJhbWV0ZXIiLCAiSWYgc2FtcGxlciBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHNhbXBsZXIgbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2FtcGxlci1zYW1wbGVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U2FtcGxlci1zYW1wbGVyLXBhcmVudCIsICJJZiBzYW1wbGVyIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXBBbGxvY2F0b3ItcGFyYW1ldGVyIiwgIklmIHBBbGxvY2F0b3IgaXMgbm90IE5VTEwsIHBBbGxvY2F0b3IgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0FsbG9jYXRpb25DYWxsYmFja3Mgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24tcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24teWNiY3JDb252ZXJzaW9uLXBhcmFtZXRlciIsICJJZiB5Y2JjckNvbnZlcnNpb24gaXMgbm90IFZLX05VTExfSEFORExFLCB5Y2JjckNvbnZlcnNpb24gbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbi15Y2JjckNvbnZlcnNpb24tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXljYmNyQ29udmVyc2lvbi1wYXJlbnQiLCAiSWYgeWNiY3JDb252ZXJzaW9uIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXljYmNyQ29udmVyc2lvbi1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtc2VtYXBob3JlLTAxMTM3IiwgIkFsbCBzdWJtaXR0ZWQgYmF0Y2hlcyB0aGF0IHJlZmVyIHRvIHNlbWFwaG9yZSBtdXN0IGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtc2VtYXBob3JlLTAxMTM3KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTZW1hcGhvcmUtc2VtYXBob3JlLTAxMTM4IiwgIklmIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gc2VtYXBob3JlIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS0wMTEzOCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS0wMTEzOSIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIHNlbWFwaG9yZSB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS0wMTEzOSkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS1wYXJhbWV0ZXIiLCAiSWYgc2VtYXBob3JlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgc2VtYXBob3JlIG11c3QgYmUgYSB2YWxpZCBWa1NlbWFwaG9yZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1zZW1hcGhvcmUtcGFyZW50IiwgIklmIHNlbWFwaG9yZSBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVNoYWRlck1vZHVsZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVNoYWRlck1vZHVsZS1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTaGFkZXJNb2R1bGUtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTaGFkZXJNb2R1bGUtc2hhZGVyTW9kdWxlLTAxMDkyIiwgIklmIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gc2hhZGVyTW9kdWxlIHdhcyBjcmVhdGVkLCBhIGNvbXBhdGlibGUgc2V0IG9mIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkIGhlcmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXNoYWRlck1vZHVsZS0wMTA5MikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXNoYWRlck1vZHVsZS0wMTA5MyIsICJJZiBubyBWa0FsbG9jYXRpb25DYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB3aGVuIHNoYWRlck1vZHVsZSB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXNoYWRlck1vZHVsZS0wMTA5MykifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXNoYWRlck1vZHVsZS1wYXJhbWV0ZXIiLCAiSWYgc2hhZGVyTW9kdWxlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgc2hhZGVyTW9kdWxlIG11c3QgYmUgYSB2YWxpZCBWa1NoYWRlck1vZHVsZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXNoYWRlck1vZHVsZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVNoYWRlck1vZHVsZS1zaGFkZXJNb2R1bGUtcGFyZW50IiwgIklmIHNoYWRlck1vZHVsZSBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U2hhZGVyTW9kdWxlLXNoYWRlck1vZHVsZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItaW5zdGFuY2UtcGFyYW1ldGVyIiwgImluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLWluc3RhbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLXN1cmZhY2UtMDEyNjYiLCAiQWxsIFZrU3dhcGNoYWluS0hSIG9iamVjdHMgY3JlYXRlZCBmb3Igc3VyZmFjZSBtdXN0IGhhdmUgYmVlbiBkZXN0cm95ZWQgcHJpb3IgdG8gZGVzdHJveWluZyBzdXJmYWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItc3VyZmFjZS0wMTI2NikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLTAxMjY3IiwgIklmIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gc3VyZmFjZSB3YXMgY3JlYXRlZCwgYSBjb21wYXRpYmxlIHNldCBvZiBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItc3VyZmFjZS0wMTI2NykifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLTAxMjY4IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gc3VyZmFjZSB3YXMgY3JlYXRlZCwgcEFsbG9jYXRvciBtdXN0IGJlIE5VTEwgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U3VyZmFjZUtIUi1zdXJmYWNlLTAxMjY4KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLXN1cmZhY2UtcGFyYW1ldGVyIiwgIklmIHN1cmZhY2UgaXMgbm90IFZLX05VTExfSEFORExFLCBzdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItc3VyZmFjZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItc3VyZmFjZS1wYXJlbnQiLCAiSWYgc3VyZmFjZSBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBpbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLXN1cmZhY2UtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZGV2aWNlLCBhbmQgc3dhcGNoYWluIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrSW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U3dhcGNoYWluS0hSLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95U3dhcGNoYWluS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95U3dhcGNoYWluS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVN3YXBjaGFpbktIUi1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVN3YXBjaGFpbktIUi1zd2FwY2hhaW4tMDEyODIiLCAiQWxsIHVzZXMgb2YgcHJlc2VudGFibGUgaW1hZ2VzIGFjcXVpcmVkIGZyb20gc3dhcGNoYWluIG11c3QgaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGVzdHJveVN3YXBjaGFpbktIUi1zd2FwY2hhaW4tMDEyODIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVN3YXBjaGFpbktIUi1zd2FwY2hhaW4tMDEyODMiLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiBzd2FwY2hhaW4gd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIG11c3QgYmUgcHJvdmlkZWQgaGVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItc3dhcGNoYWluLTAxMjgzKSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItc3dhcGNoYWluLTAxMjg0IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gc3dhcGNoYWluIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItc3dhcGNoYWluLTAxMjg0KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItc3dhcGNoYWluLXBhcmFtZXRlciIsICJJZiBzd2FwY2hhaW4gaXMgbm90IFZLX05VTExfSEFORExFLCBzd2FwY2hhaW4gbXVzdCBiZSBhIHZhbGlkIFZrU3dhcGNoYWluS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItc3dhcGNoYWluLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhULWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVC12YWxpZGF0aW9uQ2FjaGUtMDE1MzciLCAiSWYgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHdlcmUgcHJvdmlkZWQgd2hlbiB2YWxpZGF0aW9uQ2FjaGUgd2FzIGNyZWF0ZWQsIGEgY29tcGF0aWJsZSBzZXQgb2YgY2FsbGJhY2tzIG11c3QgYmUgcHJvdmlkZWQgaGVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtdmFsaWRhdGlvbkNhY2hlLTAxNTM3KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtdmFsaWRhdGlvbkNhY2hlLTAxNTM4IiwgIklmIG5vIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyB3ZXJlIHByb3ZpZGVkIHdoZW4gdmFsaWRhdGlvbkNhY2hlIHdhcyBjcmVhdGVkLCBwQWxsb2NhdG9yIG11c3QgYmUgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtdmFsaWRhdGlvbkNhY2hlLTAxNTM4KSJ9LAorICAgIHsiVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtdmFsaWRhdGlvbkNhY2hlLXBhcmFtZXRlciIsICJJZiB2YWxpZGF0aW9uQ2FjaGUgaXMgbm90IFZLX05VTExfSEFORExFLCB2YWxpZGF0aW9uQ2FjaGUgbXVzdCBiZSBhIHZhbGlkIFZrVmFsaWRhdGlvbkNhY2hlRVhUIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtdmFsaWRhdGlvbkNhY2hlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhULXZhbGlkYXRpb25DYWNoZS1wYXJlbnQiLCAiSWYgdmFsaWRhdGlvbkNhY2hlIGlzIGEgdmFsaWQgaGFuZGxlLCBpdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQtdmFsaWRhdGlvbkNhY2hlLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtEZXZpY2VXYWl0SWRsZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGV2aWNlV2FpdElkbGUtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEaXNwbGF5UG93ZXJDb250cm9sRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEaXNwbGF5UG93ZXJDb250cm9sRVhULWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRGlzcGxheVBvd2VyQ29udHJvbEVYVC1kaXNwbGF5LXBhcmFtZXRlciIsICJkaXNwbGF5IG11c3QgYmUgYSB2YWxpZCBWa0Rpc3BsYXlLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRGlzcGxheVBvd2VyQ29udHJvbEVYVC1kaXNwbGF5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtEaXNwbGF5UG93ZXJDb250cm9sRVhULXBEaXNwbGF5UG93ZXJJbmZvLXBhcmFtZXRlciIsICJwRGlzcGxheVBvd2VySW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGlzcGxheVBvd2VySW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtEaXNwbGF5UG93ZXJDb250cm9sRVhULXBEaXNwbGF5UG93ZXJJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLU5vbmUtMDE5NzgiLCAiQ29uZGl0aW9uYWwgcmVuZGVyaW5nIG11c3Qgbm90IGJlIGFjdGl2ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VuZENvbW1hbmRCdWZmZXItTm9uZS0wMTk3OCkifSwKKyAgICB7IlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNTkiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGJlIGluIHRoZSByZWNvcmRpbmcgc3RhdGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDU5KSJ9LAorICAgIHsiVlVJRC12a0VuZENvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA2MCIsICJJZiBjb21tYW5kQnVmZmVyIGlzIGEgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlciwgdGhlcmUgbXVzdCBub3QgYmUgYW4gYWN0aXZlIHJlbmRlciBwYXNzIGluc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDYwKSJ9LAorICAgIHsiVlVJRC12a0VuZENvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA2MSIsICJBbGwgcXVlcmllcyBtYWRlIGFjdGl2ZSBkdXJpbmcgdGhlIHJlY29yZGluZyBvZiBjb21tYW5kQnVmZmVyIG11c3QgaGF2ZSBiZWVuIG1hZGUgaW5hY3RpdmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNjEpIn0sCisgICAgeyJWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDYyIiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIsIHRoZXJlIG11c3Qgbm90IGJlIGFuIG91dHN0YW5kaW5nIHZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCBjb21tYW5kIHJlY29yZGVkIHRvIGNvbW1hbmRCdWZmZXIgdGhhdCBoYXMgbm90IHByZXZpb3VzbHkgYmVlbiBlbmRlZCBieSBhIGNhbGwgdG8gdmtDbWREZWJ1Z01hcmtlckVuZEVYVC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNjIpIn0sCisgICAgeyJWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAxODE1IiwgIklmIGNvbW1hbmRCdWZmZXIgaXMgYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIsIHRoZXJlIG11c3Qgbm90IGJlIGFuIG91dHN0YW5kaW5nIHZrQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQgY29tbWFuZCByZWNvcmRlZCB0byBjb21tYW5kQnVmZmVyIHRoYXQgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gZW5kZWQgYnkgYSBjYWxsIHRvIHZrQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhULiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VuZENvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMTgxNSkifSwKKyAgICB7IlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyIiwgImNvbW1hbmRCdWZmZXIgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMtcExheWVyTmFtZS1wYXJhbWV0ZXIiLCAiSWYgcExheWVyTmFtZSBpcyBub3QgTlVMTCwgcExheWVyTmFtZSBtdXN0IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMtcExheWVyTmFtZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcy1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFByb3BlcnR5Q291bnQgaXMgbm90IDAsIGFuZCBwUHJvcGVydGllcyBpcyBub3QgTlVMTCwgcFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFByb3BlcnR5Q291bnQgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsICJwUHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcy1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwUHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBQcm9wZXJ0aWVzIGlzIG5vdCBOVUxMLCBwUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUHJvcGVydHlDb3VudCBWa0xheWVyUHJvcGVydGllcyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMtcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyIiwgInBQcm9wZXJ0eUNvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMtcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMtcExheWVyTmFtZS1wYXJhbWV0ZXIiLCAiSWYgcExheWVyTmFtZSBpcyBub3QgTlVMTCwgcExheWVyTmFtZSBtdXN0IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcy1wTGF5ZXJOYW1lLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBQcm9wZXJ0eUNvdW50IGlzIG5vdCAwLCBhbmQgcFByb3BlcnRpZXMgaXMgbm90IE5VTEwsIHBQcm9wZXJ0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBQcm9wZXJ0eUNvdW50IFZrRXh0ZW5zaW9uUHJvcGVydGllcyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMtcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyIiwgInBQcm9wZXJ0eUNvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMtcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwUHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBQcm9wZXJ0aWVzIGlzIG5vdCBOVUxMLCBwUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUHJvcGVydHlDb3VudCBWa0xheWVyUHJvcGVydGllcyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMtcFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsICJwUHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMtcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbi1wQXBpVmVyc2lvbi1wYXJhbWV0ZXIiLCAicEFwaVZlcnNpb24gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbi1wQXBpVmVyc2lvbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMtaW5zdGFuY2UtcGFyYW1ldGVyIiwgImluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzLWluc3RhbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwcy1wUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LXBhcmFtZXRlciIsICJwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwcy1wUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwcy1wUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQgaXMgbm90IDAsIGFuZCBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgaXMgbm90IE5VTEwsIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50IFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzLXBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUi1wQ291bnRlckNvdW50LXBhcmFtZXRlciIsICJwQ291bnRlckNvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSLXBDb3VudGVyQ291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFItcENvdW50ZXJEZXNjcmlwdGlvbnMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBDb3VudGVyQ291bnQgaXMgbm90IDAsIGFuZCBwQ291bnRlckRlc2NyaXB0aW9ucyBpcyBub3QgTlVMTCwgcENvdW50ZXJEZXNjcmlwdGlvbnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcENvdW50ZXJDb3VudCBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSLXBDb3VudGVyRGVzY3JpcHRpb25zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSLXBDb3VudGVycy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcENvdW50ZXJDb3VudCBpcyBub3QgMCwgYW5kIHBDb3VudGVycyBpcyBub3QgTlVMTCwgcENvdW50ZXJzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBDb3VudGVyQ291bnQgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFItcENvdW50ZXJzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMtaW5zdGFuY2UtcGFyYW1ldGVyIiwgImluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcy1pbnN0YW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzLXBQaHlzaWNhbERldmljZUNvdW50LXBhcmFtZXRlciIsICJwUGh5c2ljYWxEZXZpY2VDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzLXBQaHlzaWNhbERldmljZUNvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMtcFBoeXNpY2FsRGV2aWNlcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFBoeXNpY2FsRGV2aWNlQ291bnQgaXMgbm90IDAsIGFuZCBwUGh5c2ljYWxEZXZpY2VzIGlzIG5vdCBOVUxMLCBwUGh5c2ljYWxEZXZpY2VzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBQaHlzaWNhbERldmljZUNvdW50IFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcy1wUGh5c2ljYWxEZXZpY2VzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcy1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcy1tZW1vcnlSYW5nZUNvdW50LWFycmF5bGVuZ3RoIiwgIm1lbW9yeVJhbmdlQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzLW1lbW9yeVJhbmdlQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMtcE1lbW9yeVJhbmdlcy1wYXJhbWV0ZXIiLCAicE1lbW9yeVJhbmdlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBtZW1vcnlSYW5nZUNvdW50IHZhbGlkIFZrTWFwcGVkTWVtb3J5UmFuZ2Ugc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzLXBNZW1vcnlSYW5nZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1jb21tYW5kQnVmZmVyQ291bnQtYXJyYXlsZW5ndGgiLCAiY29tbWFuZEJ1ZmZlckNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlQ29tbWFuZEJ1ZmZlcnMtY29tbWFuZEJ1ZmZlckNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1jb21tYW5kUG9vbC1wYXJhbWV0ZXIiLCAiY29tbWFuZFBvb2wgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZFBvb2wgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRnJlZUNvbW1hbmRCdWZmZXJzLWNvbW1hbmRQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtGcmVlQ29tbWFuZEJ1ZmZlcnMtY29tbWFuZFBvb2wtcGFyZW50IiwgImNvbW1hbmRQb29sIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRnJlZUNvbW1hbmRCdWZmZXJzLWNvbW1hbmRQb29sLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtGcmVlQ29tbWFuZEJ1ZmZlcnMtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1wQ29tbWFuZEJ1ZmZlcnMtMDAwNDciLCAiQWxsIGVsZW1lbnRzIG9mIHBDb21tYW5kQnVmZmVycyBtdXN0IG5vdCBiZSBpbiB0aGUgcGVuZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1wQ29tbWFuZEJ1ZmZlcnMtMDAwNDcpIn0sCisgICAgeyJWVUlELXZrRnJlZUNvbW1hbmRCdWZmZXJzLXBDb21tYW5kQnVmZmVycy0wMDA0OCIsICJwQ29tbWFuZEJ1ZmZlcnMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY29tbWFuZEJ1ZmZlckNvdW50IFZrQ29tbWFuZEJ1ZmZlciBoYW5kbGVzLCBlYWNoIGVsZW1lbnQgb2Ygd2hpY2ggbXVzdCBlaXRoZXIgYmUgYSB2YWxpZCBoYW5kbGUgb3IgTlVMTCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1wQ29tbWFuZEJ1ZmZlcnMtMDAwNDgpIn0sCisgICAgeyJWVUlELXZrRnJlZUNvbW1hbmRCdWZmZXJzLXBDb21tYW5kQnVmZmVycy1wYXJlbnQiLCAiRWFjaCBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyB0aGF0IGlzIGEgdmFsaWQgaGFuZGxlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gY29tbWFuZFBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlQ29tbWFuZEJ1ZmZlcnMtcENvbW1hbmRCdWZmZXJzLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtZGVzY3JpcHRvclBvb2wtMDAzMTIiLCAiZGVzY3JpcHRvclBvb2wgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0ZSRUVfREVTQ1JJUFRPUl9TRVRfQklUIGZsYWcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtZGVzY3JpcHRvclBvb2wtMDAzMTIpIn0sCisgICAgeyJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIsICJkZXNjcmlwdG9yUG9vbCBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yUG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtZGVzY3JpcHRvclBvb2wtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1kZXNjcmlwdG9yUG9vbC1wYXJlbnQiLCAiZGVzY3JpcHRvclBvb2wgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtZGVzY3JpcHRvclBvb2wtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1kZXNjcmlwdG9yU2V0Q291bnQtYXJyYXlsZW5ndGgiLCAiZGVzY3JpcHRvclNldENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtZGVzY3JpcHRvclNldENvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy0wMDMwOSIsICJBbGwgc3VibWl0dGVkIGNvbW1hbmRzIHRoYXQgcmVmZXIgdG8gYW55IGVsZW1lbnQgb2YgcERlc2NyaXB0b3JTZXRzIG11c3QgaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy0wMDMwOSkifSwKKyAgICB7IlZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JTZXRzLTAwMzEwIiwgInBEZXNjcmlwdG9yU2V0cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkZXNjcmlwdG9yU2V0Q291bnQgVmtEZXNjcmlwdG9yU2V0IGhhbmRsZXMsIGVhY2ggZWxlbWVudCBvZiB3aGljaCBtdXN0IGVpdGhlciBiZSBhIHZhbGlkIGhhbmRsZSBvciBWS19OVUxMX0hBTkRMRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtMDAzMTApIn0sCisgICAgeyJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy0wMDMxMSIsICJFYWNoIHZhbGlkIGhhbmRsZSBpbiBwRGVzY3JpcHRvclNldHMgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gZGVzY3JpcHRvclBvb2wgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JTZXRzLTAwMzExKSJ9LAorICAgIHsiVlVJRC12a0ZyZWVEZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtcGFyZW50IiwgIkVhY2ggZWxlbWVudCBvZiBwRGVzY3JpcHRvclNldHMgdGhhdCBpcyBhIHZhbGlkIGhhbmRsZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRlc2NyaXB0b3JQb29sIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRnJlZU1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrRnJlZU1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0ZyZWVNZW1vcnktbWVtb3J5LTAwNjc3IiwgIkFsbCBzdWJtaXR0ZWQgY29tbWFuZHMgdGhhdCByZWZlciB0byBtZW1vcnkgKHZpYSBpbWFnZXMgb3IgYnVmZmVycykgbXVzdCBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlTWVtb3J5LW1lbW9yeS0wMDY3NykifSwKKyAgICB7IlZVSUQtdmtGcmVlTWVtb3J5LW1lbW9yeS1wYXJhbWV0ZXIiLCAiSWYgbWVtb3J5IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgbWVtb3J5IG11c3QgYmUgYSB2YWxpZCBWa0RldmljZU1lbW9yeSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlTWVtb3J5LW1lbW9yeS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrRnJlZU1lbW9yeS1tZW1vcnktcGFyZW50IiwgIklmIG1lbW9yeSBpcyBhIHZhbGlkIGhhbmRsZSwgaXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtGcmVlTWVtb3J5LW1lbW9yeS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrRnJlZU1lbW9yeS1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ZyZWVNZW1vcnktcEFsbG9jYXRvci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLTAyNzg3IiwgImFjY2VsZXJhdGlvblN0cnVjdHVyZSBtdXN0IGJlIGJvdW5kIGNvbXBsZXRlbHkgYW5kIGNvbnRpZ3VvdXNseSB0byBhIHNpbmdsZSBWa0RldmljZU1lbW9yeSBvYmplY3QgdmlhIHZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLTAyNzg3KSJ9LAorICAgIHsiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJhbWV0ZXIiLCAiYWNjZWxlcmF0aW9uU3RydWN0dXJlIG11c3QgYmUgYSB2YWxpZCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWFjY2VsZXJhdGlvblN0cnVjdHVyZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtYWNjZWxlcmF0aW9uU3RydWN0dXJlLXBhcmVudCIsICJhY2NlbGVyYXRpb25TdHJ1Y3R1cmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWRhdGFTaXplLTAyMjQwIiwgImRhdGFTaXplIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHJlc3VsdCBvZiB0aGUgcXVlcnksIGFzIGRlc2NyaWJlZCBhYm92ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWRhdGFTaXplLTAyMjQwKSJ9LAorICAgIHsiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WLWRhdGFTaXplLWFycmF5bGVuZ3RoIiwgImRhdGFTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1kYXRhU2l6ZS1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1wRGF0YS1wYXJhbWV0ZXIiLCAicERhdGEgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGF0YVNpemUgYnl0ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1wRGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYtcEluZm8tcGFyYW1ldGVyIiwgInBJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYtcEluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIiwgInBNZW1vcnlSZXF1aXJlbWVudHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYtcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQtYnVmZmVyLTAxODg0IiwgImJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgQW5kcm9pZCBoYXJkd2FyZSBidWZmZXIgb2JqZWN0IHdpdGggYXQgbGVhc3Qgb25lIG9mIHRoZSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVXyogZmxhZ3MgaW4gaXRzIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjOjp1c2FnZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELWJ1ZmZlci0wMTg4NCkifSwKKyAgICB7IlZVSUQtdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRC1idWZmZXItcGFyYW1ldGVyIiwgImJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIEFIYXJkd2FyZUJ1ZmZlciB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELWJ1ZmZlci1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgInBQcm9wZXJ0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRC1wUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUi1idWZmZXJEZXZpY2VBZGRyZXNzLTAzMzI0IiwgIlRoZSBidWZmZXJEZXZpY2VBZGRyZXNzIG9yIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ6OmJ1ZmZlckRldmljZUFkZHJlc3MgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSLWJ1ZmZlckRldmljZUFkZHJlc3MtMDMzMjQpIn0sCisgICAgeyJWVUlELXZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUi1kZXZpY2UtMDMzMjUiLCAiSWYgZGV2aWNlIHdhcyBjcmVhdGVkIHdpdGggbXVsdGlwbGUgcGh5c2ljYWwgZGV2aWNlcywgdGhlbiB0aGUgYnVmZmVyRGV2aWNlQWRkcmVzc011bHRpRGV2aWNlIG9yIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ6OmJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFItZGV2aWNlLTAzMzI1KSJ9LAorICAgIHsiVlVJRC12a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSLXBJbmZvLXBhcmFtZXRlciIsICJwSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUi1wSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzLWJ1ZmZlci1wYXJhbWV0ZXIiLCAiYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0J1ZmZlciBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMtYnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMtYnVmZmVyLXBhcmVudCIsICJidWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMtYnVmZmVyLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cy1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cy1wTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlciIsICJwTWVtb3J5UmVxdWlyZW1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtNZW1vcnlSZXF1aXJlbWVudHMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyLXBJbmZvLXBhcmFtZXRlciIsICJwSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMi1wSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMi1wTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlciIsICJwTWVtb3J5UmVxdWlyZW1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtNZW1vcnlSZXF1aXJlbWVudHMyIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czItcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItTm9uZS0wMzMyNiIsICJUaGUgYnVmZmVyRGV2aWNlQWRkcmVzcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLU5vbmUtMDMzMjYpIn0sCisgICAgeyJWVUlELXZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItZGV2aWNlLTAzMzI3IiwgIklmIGRldmljZSB3YXMgY3JlYXRlZCB3aXRoIG11bHRpcGxlIHBoeXNpY2FsIGRldmljZXMsIHRoZW4gdGhlIGJ1ZmZlckRldmljZUFkZHJlc3NNdWx0aURldmljZSBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLWRldmljZS0wMzMyNykifSwKKyAgICB7IlZVSUQtdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUi1wSW5mby1wYXJhbWV0ZXIiLCAicEluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLXBJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1wTWF4RGV2aWF0aW9uLXBhcmFtZXRlciIsICJwTWF4RGV2aWF0aW9uIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDY0X3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1wTWF4RGV2aWF0aW9uLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1wVGltZXN0YW1wSW5mb3MtcGFyYW1ldGVyIiwgInBUaW1lc3RhbXBJbmZvcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aW1lc3RhbXBDb3VudCB2YWxpZCBWa0NhbGlicmF0ZWRUaW1lc3RhbXBJbmZvRVhUIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1wVGltZXN0YW1wSW5mb3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhULXBUaW1lc3RhbXBzLXBhcmFtZXRlciIsICJwVGltZXN0YW1wcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aW1lc3RhbXBDb3VudCB1aW50NjRfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRDYWxpYnJhdGVkVGltZXN0YW1wc0VYVC1wVGltZXN0YW1wcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0Q2FsaWJyYXRlZFRpbWVzdGFtcHNFWFQtdGltZXN0YW1wQ291bnQtYXJyYXlsZW5ndGgiLCAidGltZXN0YW1wQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldENhbGlicmF0ZWRUaW1lc3RhbXBzRVhULXRpbWVzdGFtcENvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXBDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwQ3JlYXRlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQtcENyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXBTdXBwb3J0LXBhcmFtZXRlciIsICJwU3VwcG9ydCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQtcFN1cHBvcnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzLWhlYXBJbmRleC0wMDY5MSIsICJoZWFwSW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gbWVtb3J5SGVhcENvdW50IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMtaGVhcEluZGV4LTAwNjkxKSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzLWxvY2FsRGV2aWNlSW5kZXgtMDA2OTIiLCAibG9jYWxEZXZpY2VJbmRleCBtdXN0IGJlIGEgdmFsaWQgZGV2aWNlIGluZGV4IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMtbG9jYWxEZXZpY2VJbmRleC0wMDY5MikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1sb2NhbERldmljZUluZGV4LTAwNjk0IiwgImxvY2FsRGV2aWNlSW5kZXggbXVzdCBub3QgZXF1YWwgcmVtb3RlRGV2aWNlSW5kZXggKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1sb2NhbERldmljZUluZGV4LTAwNjk0KSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzLXBQZWVyTWVtb3J5RmVhdHVyZXMtcGFyYW1ldGVyIiwgInBQZWVyTWVtb3J5RmVhdHVyZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1BlZXJNZW1vcnlGZWF0dXJlRmxhZ3MgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1wUGVlck1lbW9yeUZlYXR1cmVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1yZW1vdGVEZXZpY2VJbmRleC0wMDY5MyIsICJyZW1vdGVEZXZpY2VJbmRleCBtdXN0IGJlIGEgdmFsaWQgZGV2aWNlIGluZGV4IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlR3JvdXBQZWVyTWVtb3J5RmVhdHVyZXMtcmVtb3RlRGV2aWNlSW5kZXgtMDA2OTMpIn0sCisgICAgeyJWVUlELXZrR2V0RGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VHcm91cFByZXNlbnRDYXBhYmlsaXRpZXNLSFItcERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcy1wYXJhbWV0ZXIiLCAicERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERldmljZUdyb3VwUHJlc2VudENhcGFiaWxpdGllc0tIUi1wRGV2aWNlR3JvdXBQcmVzZW50Q2FwYWJpbGl0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhULWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVC1wTW9kZXMtcGFyYW1ldGVyIiwgInBNb2RlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVC1wTW9kZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcFN1cmZhY2VJbmZvLXBhcmFtZXRlciIsICJwU3VyZmFjZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcFN1cmZhY2VJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFItY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZGV2aWNlLCBhbmQgc3VyZmFjZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrSW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFItY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzS0hSLXBNb2Rlcy1wYXJhbWV0ZXIiLCAicE1vZGVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtEZXZpY2VHcm91cFByZXNlbnRNb2RlRmxhZ3NLSFIgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFItcE1vZGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXNLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLCAic3VyZmFjZSBtdXN0IGJlIGEgdmFsaWQgVmtTdXJmYWNlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1zdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudC1tZW1vcnktMDA2OTAiLCAibWVtb3J5IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSB0eXBlIHRoYXQgcmVwb3J0cyBWS19NRU1PUllfUFJPUEVSVFlfTEFaSUxZX0FMTE9DQVRFRF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LW1lbW9yeS0wMDY5MCkifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LW1lbW9yeS1wYXJhbWV0ZXIiLCAibWVtb3J5IG11c3QgYmUgYSB2YWxpZCBWa0RldmljZU1lbW9yeSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LW1lbW9yeS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudC1tZW1vcnktcGFyZW50IiwgIm1lbW9yeSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQtbWVtb3J5LXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VNZW1vcnlDb21taXRtZW50LXBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzLXBhcmFtZXRlciIsICJwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRGV2aWNlU2l6ZSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQtcENvbW1pdHRlZE1lbW9yeUluQnl0ZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLU5vbmUtMDMzMzQiLCAiVGhlIGJ1ZmZlckRldmljZUFkZHJlc3MgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUi1Ob25lLTAzMzM0KSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLWRldmljZS0wMzMzNSIsICJJZiBkZXZpY2Ugd2FzIGNyZWF0ZWQgd2l0aCBtdWx0aXBsZSBwaHlzaWNhbCBkZXZpY2VzLCB0aGVuIHRoZSBidWZmZXJEZXZpY2VBZGRyZXNzTXVsdGlEZXZpY2UgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUi1kZXZpY2UtMDMzMzUpIn0sCisgICAgeyJWVUlELXZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItcEluZm8tcGFyYW1ldGVyIiwgInBJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0luZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFItcEluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZVByb2NBZGRyLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VQcm9jQWRkci1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZVByb2NBZGRyLXBOYW1lLXBhcmFtZXRlciIsICJwTmFtZSBtdXN0IGJlIGEgbnVsbC10ZXJtaW5hdGVkIFVURi04IHN0cmluZyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERldmljZVByb2NBZGRyLXBOYW1lLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VRdWV1ZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlUXVldWUtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VRdWV1ZS1mbGFncy0wMTg0MSIsICJWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbzo6ZmxhZ3MgbXVzdCBoYXZlIGJlZW4gc2V0IHRvIHplcm8gd2hlbiBkZXZpY2Ugd2FzIGNyZWF0ZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VRdWV1ZS1mbGFncy0wMTg0MSkifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VRdWV1ZS1wUXVldWUtcGFyYW1ldGVyIiwgInBRdWV1ZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrUXVldWUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlUXVldWUtcFF1ZXVlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VRdWV1ZS1xdWV1ZUZhbWlseUluZGV4LTAwMzg0IiwgInF1ZXVlRmFtaWx5SW5kZXggbXVzdCBiZSBvbmUgb2YgdGhlIHF1ZXVlIGZhbWlseSBpbmRpY2VzIHNwZWNpZmllZCB3aGVuIGRldmljZSB3YXMgY3JlYXRlZCwgdmlhIHRoZSBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREZXZpY2VRdWV1ZS1xdWV1ZUZhbWlseUluZGV4LTAwMzg0KSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZVF1ZXVlLXF1ZXVlSW5kZXgtMDAzODUiLCAicXVldWVJbmRleCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXVlcyBjcmVhdGVkIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlIGZhbWlseSBpbmRleCB3aGVuIGRldmljZSB3YXMgY3JlYXRlZCwgdmlhIHRoZSBxdWV1ZUNvdW50IG1lbWJlciBvZiB0aGUgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlUXVldWUtcXVldWVJbmRleC0wMDM4NSkifSwKKyAgICB7IlZVSUQtdmtHZXREZXZpY2VRdWV1ZTItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERldmljZVF1ZXVlMi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERldmljZVF1ZXVlMi1wUXVldWUtcGFyYW1ldGVyIiwgInBRdWV1ZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrUXVldWUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlUXVldWUyLXBRdWV1ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGV2aWNlUXVldWUyLXBRdWV1ZUluZm8tcGFyYW1ldGVyIiwgInBRdWV1ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0RldmljZVF1ZXVlSW5mbzIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGV2aWNlUXVldWUyLXBRdWV1ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFItZGlzcGxheS1wYXJhbWV0ZXIiLCAiZGlzcGxheSBtdXN0IGJlIGEgdmFsaWQgVmtEaXNwbGF5S0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFItZGlzcGxheS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFByb3BlcnR5Q291bnQgaXMgbm90IDAsIGFuZCBwUHJvcGVydGllcyBpcyBub3QgTlVMTCwgcFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFByb3BlcnR5Q291bnQgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsICJwUHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLWRpc3BsYXktcGFyYW1ldGVyIiwgImRpc3BsYXkgbXVzdCBiZSBhIHZhbGlkIFZrRGlzcGxheUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFItZGlzcGxheS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwUHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBQcm9wZXJ0aWVzIGlzIG5vdCBOVUxMLCBwUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUHJvcGVydHlDb3VudCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFItcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyIiwgInBQcm9wZXJ0eUNvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFItcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSLXBDYXBhYmlsaXRpZXMtcGFyYW1ldGVyIiwgInBDYXBhYmlsaXRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0Rpc3BsYXlQbGFuZUNhcGFiaWxpdGllczJLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1wQ2FwYWJpbGl0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXMyS0hSLXBEaXNwbGF5UGxhbmVJbmZvLXBhcmFtZXRlciIsICJwRGlzcGxheVBsYW5lSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGlzcGxheVBsYW5lSW5mbzJLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1wRGlzcGxheVBsYW5lSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSLW1vZGUtcGFyYW1ldGVyIiwgIm1vZGUgbXVzdCBiZSBhIHZhbGlkIFZrRGlzcGxheU1vZGVLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSLW1vZGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUi1wQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIsICJwQ2FwYWJpbGl0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtEaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSLXBDYXBhYmlsaXRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheVBsYW5lQ2FwYWJpbGl0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUi1wRGlzcGxheUNvdW50LXBhcmFtZXRlciIsICJwRGlzcGxheUNvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUi1wRGlzcGxheUNvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUi1wRGlzcGxheXMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBEaXNwbGF5Q291bnQgaXMgbm90IDAsIGFuZCBwRGlzcGxheXMgaXMgbm90IE5VTEwsIHBEaXNwbGF5cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwRGlzcGxheUNvdW50IFZrRGlzcGxheUtIUiBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFItcERpc3BsYXlzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSLXBsYW5lSW5kZXgtMDEyNDkiLCAicGxhbmVJbmRleCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGRpc3BsYXkgcGxhbmVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGFzIGRldGVybWluZWQgYnkgY2FsbGluZyB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSLXBsYW5lSW5kZXgtMDEyNDkpIn0sCisgICAgeyJWVUlELXZrR2V0RXZlbnRTdGF0dXMtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEV2ZW50U3RhdHVzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RXZlbnRTdGF0dXMtZXZlbnQtcGFyYW1ldGVyIiwgImV2ZW50IG11c3QgYmUgYSB2YWxpZCBWa0V2ZW50IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEV2ZW50U3RhdHVzLWV2ZW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRFdmVudFN0YXR1cy1ldmVudC1wYXJlbnQiLCAiZXZlbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRFdmVudFN0YXR1cy1ldmVudC1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0RmVuY2VGZEtIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RmVuY2VGZEtIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEZlbmNlRmRLSFItcEZkLXBhcmFtZXRlciIsICJwRmQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gaW50IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RmVuY2VGZEtIUi1wRmQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEZlbmNlRmRLSFItcEdldEZkSW5mby1wYXJhbWV0ZXIiLCAicEdldEZkSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRmVuY2VHZXRGZEluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RmVuY2VGZEtIUi1wR2V0RmRJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRGZW5jZVN0YXR1cy1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RmVuY2VTdGF0dXMtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRGZW5jZVN0YXR1cy1mZW5jZS1wYXJhbWV0ZXIiLCAiZmVuY2UgbXVzdCBiZSBhIHZhbGlkIFZrRmVuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0RmVuY2VTdGF0dXMtZmVuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEZlbmNlU3RhdHVzLWZlbmNlLXBhcmVudCIsICJmZW5jZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEZlbmNlU3RhdHVzLWZlbmNlLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUi1wR2V0V2luMzJIYW5kbGVJbmZvLXBhcmFtZXRlciIsICJwR2V0V2luMzJIYW5kbGVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRGZW5jZVdpbjMySGFuZGxlS0hSLXBHZXRXaW4zMkhhbmRsZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEZlbmNlV2luMzJIYW5kbGVLSFItcEhhbmRsZS1wYXJhbWV0ZXIiLCAicEhhbmRsZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIEhBTkRMRSB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEZlbmNlV2luMzJIYW5kbGVLSFItcEhhbmRsZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtaW1hZ2UtMDIyNzIiLCAiaW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRpbGluZyBlcXVhbCB0byBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtaW1hZ2UtMDIyNzIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtaW1hZ2UtcGFyYW1ldGVyIiwgImltYWdlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlRHJtRm9ybWF0TW9kaWZpZXJQcm9wZXJ0aWVzRVhULWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVC1pbWFnZS1wYXJlbnQiLCAiaW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVC1pbWFnZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VEcm1Gb3JtYXRNb2RpZmllclByb3BlcnRpZXNFWFQtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgInBQcm9wZXJ0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZURybUZvcm1hdE1vZGlmaWVyUHJvcGVydGllc0VYVC1wUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtaW1hZ2UtMDE1ODgiLCAiaW1hZ2UgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgVktfSU1BR0VfQ1JFQVRFX0RJU0pPSU5UX0JJVCBmbGFnIHNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzLWltYWdlLTAxNTg4KSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzLWltYWdlLXBhcmFtZXRlciIsICJpbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cy1pbWFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtaW1hZ2UtcGFyZW50IiwgImltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtaW1hZ2UtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIiwgInBNZW1vcnlSZXF1aXJlbWVudHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa01lbW9yeVJlcXVpcmVtZW50cyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cy1wTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1wSW5mby1wYXJhbWV0ZXIiLCAicEluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLXBJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIiLCAicE1lbW9yeVJlcXVpcmVtZW50cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtaW1hZ2UtcGFyYW1ldGVyIiwgImltYWdlIG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1pbWFnZS1wYXJlbnQiLCAiaW1hZ2UgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1pbWFnZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQtcGFyYW1ldGVyIiwgInBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQgaXMgbm90IDAsIGFuZCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzIGlzIG5vdCBOVUxMLCBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50IFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLXBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyLXBJbmZvLXBhcmFtZXRlciIsICJwSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czItcEluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMi1wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudC1wYXJhbWV0ZXIiLCAicFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMi1wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyLXBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50IGlzIG5vdCAwLCBhbmQgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyBpcyBub3QgTlVMTCwgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyLXBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtYXJyYXlMYXllci0wMTcxNyIsICJUaGUgYXJyYXlMYXllciBtZW1iZXIgb2YgcFN1YnJlc291cmNlIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhcnJheUxheWVycyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtYXJyYXlMYXllci0wMTcxNykifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWFzcGVjdE1hc2stMDA5OTciLCAiVGhlIGFzcGVjdE1hc2sgbWVtYmVyIG9mIHBTdWJyZXNvdXJjZSBtdXN0IG9ubHkgaGF2ZSBhIHNpbmdsZSBiaXQgc2V0IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1hc3BlY3RNYXNrLTAwOTk3KSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWZvcm1hdC0wMTU4MSIsICJJZiB0aGUgdGlsaW5nIG9mIHRoZSBpbWFnZSBpcyBWS19JTUFHRV9USUxJTkdfTElORUFSIGFuZCBpdHMgZm9ybWF0IGlzIGEgbXVsdGktcGxhbmFyIGZvcm1hdCB3aXRoIHR3byBwbGFuZXMsIHRoZSBhc3BlY3RNYXNrIG1lbWJlciBvZiBwU3VicmVzb3VyY2UgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQgb3IgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzFfQklUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1mb3JtYXQtMDE1ODEpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1mb3JtYXQtMDE1ODIiLCAiSWYgdGhlIHRpbGluZyBvZiB0aGUgaW1hZ2UgaXMgVktfSU1BR0VfVElMSU5HX0xJTkVBUiBhbmQgaXRzIGZvcm1hdCBpcyBhIG11bHRpLXBsYW5hciBmb3JtYXQgd2l0aCB0aHJlZSBwbGFuZXMsIHRoZSBhc3BlY3RNYXNrIG1lbWJlciBvZiBwU3VicmVzb3VyY2UgbXVzdCBiZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCBvciBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWZvcm1hdC0wMTU4MikifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLTAwOTk2IiwgImltYWdlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aWxpbmcgZXF1YWwgdG8gVktfSU1BR0VfVElMSU5HX0xJTkVBUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtaW1hZ2UtMDA5OTYpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1pbWFnZS0wMTg5NSIsICJJZiBpbWFnZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQgZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSB0eXBlLCB0aGVuIGltYWdlIG11c3QgYmUgYm91bmQgdG8gbWVtb3J5LiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtaW1hZ2UtMDE4OTUpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1pbWFnZS0wMjI3MCIsICJpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGlsaW5nIGVxdWFsIHRvIFZLX0lNQUdFX1RJTElOR19MSU5FQVIgb3IgVktfSU1BR0VfVElMSU5HX0RSTV9GT1JNQVRfTU9ESUZJRVJfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1pbWFnZS0wMjI3MCkifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLXBhcmFtZXRlciIsICJpbWFnZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLXBhcmVudCIsICJpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtaW1hZ2UtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtbWlwTGV2ZWwtMDE3MTYiLCAiVGhlIG1pcExldmVsIG1lbWJlciBvZiBwU3VicmVzb3VyY2UgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG1pcExldmVscyBzcGVjaWZpZWQgaW4gVmtJbWFnZUNyZWF0ZUluZm8gd2hlbiBpbWFnZSB3YXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtbWlwTGV2ZWwtMDE3MTYpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1wTGF5b3V0LXBhcmFtZXRlciIsICJwTGF5b3V0IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtTdWJyZXNvdXJjZUxheW91dCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LXBMYXlvdXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtcFN1YnJlc291cmNlLXBhcmFtZXRlciIsICJwU3VicmVzb3VyY2UgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0ltYWdlU3VicmVzb3VyY2Ugc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1wU3VicmVzb3VyY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtdGlsaW5nLTAyMjcxIiwgIklmIHRoZSB0aWxpbmcgb2YgdGhlIGltYWdlIGlzICBWS19JTUFHRV9USUxJTkdfRFJNX0ZPUk1BVF9NT0RJRklFUl9FWFQsIHRoZW4gdGhlIGFzcGVjdE1hc2sgIG1lbWJlciBvZiBwU3VicmVzb3VyY2UgbXVzdCBiZSAgVktfSU1BR0VfQVNQRUNUX01FTU9SWV9QTEFORV9pX0JJVF9FWFQgYW5kIHRoZSBpbmRleCBpIG11c3QgIGJlIGxlc3MgdGhhbiB0aGUgIGRybUZvcm1hdE1vZGlmaWVyUGxhbmVDb3VudCAgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZSdzIGZvcm1hdCBhbmQgZHJtRm9ybWF0TW9kaWZpZXIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC10aWxpbmctMDIyNzEpIn0sCisgICAgeyJWVUlELXZrR2V0SW1hZ2VWaWV3SGFuZGxlTlZYLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRJbWFnZVZpZXdIYW5kbGVOVlgtcEluZm8tcGFyYW1ldGVyIiwgInBJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtJbWFnZVZpZXdIYW5kbGVJbmZvTlZYIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEltYWdlVmlld0hhbmRsZU5WWC1wSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0SW5zdGFuY2VQcm9jQWRkci1pbnN0YW5jZS1wYXJhbWV0ZXIiLCAiSWYgaW5zdGFuY2UgaXMgbm90IE5VTEwsIGluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldEluc3RhbmNlUHJvY0FkZHItaW5zdGFuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldEluc3RhbmNlUHJvY0FkZHItcE5hbWUtcGFyYW1ldGVyIiwgInBOYW1lIG11c3QgYmUgYSBudWxsLXRlcm1pbmF0ZWQgVVRGLTggc3RyaW5nIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0SW5zdGFuY2VQcm9jQWRkci1wTmFtZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQtcEJ1ZmZlci1wYXJhbWV0ZXIiLCAicEJ1ZmZlciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gQUhhcmR3YXJlQnVmZmVyIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRC1wQnVmZmVyLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lELXBJbmZvLXBhcmFtZXRlciIsICJwSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrTWVtb3J5R2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5QW5kcm9pZEhhcmR3YXJlQnVmZmVyQU5EUk9JRC1wSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5RmRLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeUZkS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5RmRLSFItcEZkLXBhcmFtZXRlciIsICJwRmQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gaW50IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5RmRLSFItcEZkLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRNZW1vcnlGZEtIUi1wR2V0RmRJbmZvLXBhcmFtZXRlciIsICJwR2V0RmRJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtNZW1vcnlHZXRGZEluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5RmRLSFItcEdldEZkSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFItZmQtMDA2NzMiLCAiZmQgbXVzdCBiZSBhbiBleHRlcm5hbCBtZW1vcnkgaGFuZGxlIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgVnVsa2FuIEFQSS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFItZmQtMDA2NzMpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSLWhhbmRsZVR5cGUtMDA2NzQiLCAiaGFuZGxlVHlwZSBtdXN0IG5vdCBiZSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX0ZEX0JJVF9LSFIuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSLWhhbmRsZVR5cGUtMDA2NzQpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyIiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFItaGFuZGxlVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5RmRQcm9wZXJ0aWVzS0hSLXBNZW1vcnlGZFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgInBNZW1vcnlGZFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa01lbW9yeUZkUHJvcGVydGllc0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlGZFByb3BlcnRpZXNLSFItcE1lbW9yeUZkUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQtaGFuZGxlVHlwZS0wMTc1MiIsICJoYW5kbGVUeXBlIG11c3QgYmUgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfQUxMT0NBVElPTl9CSVRfRVhUIG9yIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9IT1NUX01BUFBFRF9GT1JFSUdOX01FTU9SWV9CSVRfRVhUIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULWhhbmRsZVR5cGUtMDE3NTIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULWhhbmRsZVR5cGUtMDE3NTQiLCAiSWYgaGFuZGxlVHlwZSBpcyBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQsIHBIb3N0UG9pbnRlciBtdXN0IGJlIGEgcG9pbnRlciB0byBob3N0IG1lbW9yeSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1oYW5kbGVUeXBlLTAxNzU0KSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1oYW5kbGVUeXBlLTAxNzU1IiwgIklmIGhhbmRsZVR5cGUgaXMgVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0hPU1RfTUFQUEVEX0ZPUkVJR05fTUVNT1JZX0JJVF9FWFQsIHBIb3N0UG9pbnRlciBtdXN0IGJlIGEgcG9pbnRlciB0byBob3N0IG1hcHBlZCBmb3JlaWduIG1lbW9yeSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1oYW5kbGVUeXBlLTAxNzU1KSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1wSG9zdFBvaW50ZXItMDE3NTMiLCAicEhvc3RQb2ludGVyIG11c3QgYmUgYSBwb2ludGVyIGFsaWduZWQgdG8gYW4gaW50ZWdlciBtdWx0aXBsZSBvZiBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxNZW1vcnlIb3N0UHJvcGVydGllc0VYVDo6bWluSW1wb3J0ZWRIb3N0UG9pbnRlckFsaWdubWVudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVC1wSG9zdFBvaW50ZXItMDE3NTMpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5SG9zdFBvaW50ZXJQcm9wZXJ0aWVzRVhULXBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMtcGFyYW1ldGVyIiwgInBNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa01lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllc0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlIb3N0UG9pbnRlclByb3BlcnRpZXNFWFQtcE1lbW9yeUhvc3RQb2ludGVyUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFItcEdldFdpbjMySGFuZGxlSW5mby1wYXJhbWV0ZXIiLCAicEdldFdpbjMySGFuZGxlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSLXBHZXRXaW4zMkhhbmRsZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSLXBIYW5kbGUtcGFyYW1ldGVyIiwgInBIYW5kbGUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBIQU5ETEUgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZUtIUi1wSGFuZGxlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1oYW5kbGVUeXBlLTAxMzI2IiwgImhhbmRsZVR5cGUgbXVzdCBiZSBhIGZsYWcgc3BlY2lmaWVkIGluIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvTlY6OmhhbmRsZVR5cGVzIHdoZW4gYWxsb2NhdGluZyBtZW1vcnkgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLWhhbmRsZVR5cGUtMDEzMjYpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzTlYgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1oYW5kbGVUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLWhhbmRsZVR5cGUtcmVxdWlyZWRiaXRtYXNrIiwgImhhbmRsZVR5cGUgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlTlYtaGFuZGxlVHlwZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1tZW1vcnktcGFyYW1ldGVyIiwgIm1lbW9yeSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1tZW1vcnktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlTlYtbWVtb3J5LXBhcmVudCIsICJtZW1vcnkgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZU5WLW1lbW9yeS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1wSGFuZGxlLXBhcmFtZXRlciIsICJwSGFuZGxlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgSEFORExFIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVOVi1wSGFuZGxlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1oYW5kbGUtMDA2NjUiLCAiaGFuZGxlIG11c3QgYmUgYW4gZXh0ZXJuYWwgbWVtb3J5IGhhbmRsZSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFZ1bGthbiBBUEkuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLWhhbmRsZS0wMDY2NSkifSwKKyAgICB7IlZVSUQtdmtHZXRNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFItaGFuZGxlVHlwZS0wMDY2NiIsICJoYW5kbGVUeXBlIG11c3Qgbm90IGJlIG9uZSBvZiB0aGUgaGFuZGxlIHR5cGVzIGRlZmluZWQgYXMgb3BhcXVlLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1oYW5kbGVUeXBlLTAwNjY2KSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1oYW5kbGVUeXBlLXBhcmFtZXRlciIsICJoYW5kbGVUeXBlIG11c3QgYmUgYSB2YWxpZCBWa0V4dGVybmFsTWVtb3J5SGFuZGxlVHlwZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLWhhbmRsZVR5cGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldE1lbW9yeVdpbjMySGFuZGxlUHJvcGVydGllc0tIUi1wTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJwTWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXNLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0TWVtb3J5V2luMzJIYW5kbGVQcm9wZXJ0aWVzS0hSLXBNZW1vcnlXaW4zMkhhbmRsZVByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZGV2aWNlLCBhbmQgc3dhcGNoYWluIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtJbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFLXBQcmVzZW50YXRpb25UaW1pbmdDb3VudC1wYXJhbWV0ZXIiLCAicFByZXNlbnRhdGlvblRpbWluZ0NvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQYXN0UHJlc2VudGF0aW9uVGltaW5nR09PR0xFLXBQcmVzZW50YXRpb25UaW1pbmdDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGFzdFByZXNlbnRhdGlvblRpbWluZ0dPT0dMRS1wUHJlc2VudGF0aW9uVGltaW5ncy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFByZXNlbnRhdGlvblRpbWluZ0NvdW50IGlzIG5vdCAwLCBhbmQgcFByZXNlbnRhdGlvblRpbWluZ3MgaXMgbm90IE5VTEwsIHBQcmVzZW50YXRpb25UaW1pbmdzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBQcmVzZW50YXRpb25UaW1pbmdDb3VudCBWa1Bhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtcFByZXNlbnRhdGlvblRpbWluZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtc3dhcGNoYWluLXBhcmFtZXRlciIsICJzd2FwY2hhaW4gbXVzdCBiZSBhIHZhbGlkIFZrU3dhcGNoYWluS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUtc3dhcGNoYWluLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTC1wVmFsdWUtcGFyYW1ldGVyIiwgInBWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrUGVyZm9ybWFuY2VWYWx1ZUlOVEVMIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBlcmZvcm1hbmNlUGFyYW1ldGVySU5URUwtcFZhbHVlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQZXJmb3JtYW5jZVBhcmFtZXRlcklOVEVMLXBhcmFtZXRlci1wYXJhbWV0ZXIiLCAicGFyYW1ldGVyIG11c3QgYmUgYSB2YWxpZCBWa1BlcmZvcm1hbmNlUGFyYW1ldGVyVHlwZUlOVEVMIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGVyZm9ybWFuY2VQYXJhbWV0ZXJJTlRFTC1wYXJhbWV0ZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhULXBUaW1lRG9tYWluQ291bnQtcGFyYW1ldGVyIiwgInBUaW1lRG9tYWluQ291bnQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhULXBUaW1lRG9tYWluQ291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhULXBUaW1lRG9tYWlucy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFRpbWVEb21haW5Db3VudCBpcyBub3QgMCwgYW5kIHBUaW1lRG9tYWlucyBpcyBub3QgTlVMTCwgcFRpbWVEb21haW5zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBUaW1lRG9tYWluQ291bnQgVmtUaW1lRG9tYWluRVhUIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhULXBUaW1lRG9tYWlucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VDYWxpYnJhdGVhYmxlVGltZURvbWFpbnNFWFQtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlQ2FsaWJyYXRlYWJsZVRpbWVEb21haW5zRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwUHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBQcm9wZXJ0aWVzIGlzIG5vdCBOVUxMLCBwUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUHJvcGVydHlDb3VudCBWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsICJwUHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFByb3BlcnR5Q291bnQgaXMgbm90IDAsIGFuZCBwUHJvcGVydGllcyBpcyBub3QgTlVMTCwgcFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFByb3BlcnR5Q291bnQgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUi1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIiLCAicFByb3BlcnR5Q291bnQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFItcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFByb3BlcnR5Q291bnQgaXMgbm90IDAsIGFuZCBwUHJvcGVydGllcyBpcyBub3QgTlVMTCwgcFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFByb3BlcnR5Q291bnQgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUi1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIiLCAicFByb3BlcnR5Q291bnQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUi1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwUHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBQcm9wZXJ0aWVzIGlzIG5vdCBOVUxMLCBwUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUHJvcGVydHlDb3VudCBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsICJwUHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFItcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFByb3BlcnR5Q291bnQgaXMgbm90IDAsIGFuZCBwUHJvcGVydGllcyBpcyBub3QgTlVMTCwgcFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFByb3BlcnR5Q291bnQgVmtEaXNwbGF5UHJvcGVydGllc0tIUiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUi1wUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUi1wUHJvcGVydHlDb3VudC1wYXJhbWV0ZXIiLCAicFByb3BlcnR5Q291bnQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFItcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBFeHRlcm5hbEJ1ZmZlckluZm8tcGFyYW1ldGVyIiwgInBFeHRlcm5hbEJ1ZmZlckluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBFeHRlcm5hbEJ1ZmZlckluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcGFyYW1ldGVyIiwgInBFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0V4dGVybmFsQnVmZmVyUHJvcGVydGllcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1wRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcEV4dGVybmFsRmVuY2VJbmZvLXBhcmFtZXRlciIsICJwRXh0ZXJuYWxGZW5jZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm8gc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1wRXh0ZXJuYWxGZW5jZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJwRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtZXh0ZXJuYWxIYW5kbGVUeXBlLXBhcmFtZXRlciIsICJleHRlcm5hbEhhbmRsZVR5cGUgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrRXh0ZXJuYWxNZW1vcnlIYW5kbGVUeXBlRmxhZ0JpdHNOViB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtZXh0ZXJuYWxIYW5kbGVUeXBlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtZmxhZ3MtcGFyYW1ldGVyIiwgImZsYWdzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlQ3JlYXRlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtZm9ybWF0LXBhcmFtZXRlciIsICJmb3JtYXQgbXVzdCBiZSBhIHZhbGlkIFZrRm9ybWF0IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLWZvcm1hdC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLXBFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAicEV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVi1wRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxJbWFnZUZvcm1hdFByb3BlcnRpZXNOVi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdGlsaW5nLXBhcmFtZXRlciIsICJ0aWxpbmcgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VUaWxpbmcgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdGlsaW5nLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdHlwZS1wYXJhbWV0ZXIiLCAidHlwZSBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZVR5cGUgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLXVzYWdlLXBhcmFtZXRlciIsICJ1c2FnZSBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtJbWFnZVVzYWdlRmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0UHJvcGVydGllc05WLXVzYWdlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIiwgInVzYWdlIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzTlYtdXNhZ2UtcmVxdWlyZWRiaXRtYXNrKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBFeHRlcm5hbFNlbWFwaG9yZUluZm8tcGFyYW1ldGVyIiwgInBFeHRlcm5hbFNlbWFwaG9yZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBFeHRlcm5hbFNlbWFwaG9yZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcGFyYW1ldGVyIiwgInBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1wRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMtcEZlYXR1cmVzLXBhcmFtZXRlciIsICJwRmVhdHVyZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcy1wRmVhdHVyZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXBGZWF0dXJlcy1wYXJhbWV0ZXIiLCAicEZlYXR1cmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMi1wRmVhdHVyZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzLWZvcm1hdC1wYXJhbWV0ZXIiLCAiZm9ybWF0IG11c3QgYmUgYSB2YWxpZCBWa0Zvcm1hdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcy1mb3JtYXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcy1wRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAicEZvcm1hdFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0Zvcm1hdFByb3BlcnRpZXMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzLXBGb3JtYXRQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMi1mb3JtYXQtcGFyYW1ldGVyIiwgImZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyLWZvcm1hdC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMi1wRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAicEZvcm1hdFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0Zvcm1hdFByb3BlcnRpZXMyIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczItcEZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYLXBGZWF0dXJlcy1wYXJhbWV0ZXIiLCAicEZlYXR1cmVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc0ZlYXR1cmVzTlZYIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYLXBGZWF0dXJlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgtcExpbWl0cy1wYXJhbWV0ZXIiLCAicExpbWl0cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNMaW1pdHNOVlggc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgtcExpbWl0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VHZW5lcmF0ZWRDb21tYW5kc1Byb3BlcnRpZXNOVlgtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlR2VuZXJhdGVkQ29tbWFuZHNQcm9wZXJ0aWVzTlZYLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrSW1hZ2VDcmVhdGVGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy1mbGFncy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtZm9ybWF0LXBhcmFtZXRlciIsICJmb3JtYXQgbXVzdCBiZSBhIHZhbGlkIFZrRm9ybWF0IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtZm9ybWF0LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy1wSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtcEltYWdlRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy10aWxpbmctMDIyNDgiLCAidGlsaW5nIG11c3Qgbm90IGJlIFZLX0lNQUdFX1RJTElOR19EUk1fRk9STUFUX01PRElGSUVSX0VYVC4gKFVzZSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBpbnN0ZWFkKS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy10aWxpbmctMDIyNDgpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdGlsaW5nLXBhcmFtZXRlciIsICJ0aWxpbmcgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VUaWxpbmcgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy10aWxpbmctcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdXNhZ2UtcGFyYW1ldGVyIiwgInVzYWdlIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlVXNhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy11c2FnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIiwgInVzYWdlIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcy11c2FnZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBJbWFnZUZvcm1hdEluZm8tcGFyYW1ldGVyIiwgInBJbWFnZUZvcm1hdEluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcEltYWdlRm9ybWF0SW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBJbWFnZUZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgInBJbWFnZUZvcm1hdFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0ltYWdlRm9ybWF0UHJvcGVydGllczIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBJbWFnZUZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wTmV4dC0wMTg2OCIsICJJZiB0aGUgcE5leHQgY2hhaW4gb2YgcEltYWdlRm9ybWF0UHJvcGVydGllcyBpbmNsdWRlcyBhIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyVXNhZ2VBTkRST0lEIHN0cnVjdHVyZSwgdGhlIHBOZXh0IGNoYWluIG9mIHBJbWFnZUZvcm1hdEluZm8gbXVzdCBpbmNsdWRlIGEgVmtQaHlzaWNhbERldmljZUV4dGVybmFsSW1hZ2VGb3JtYXRJbmZvIHN0cnVjdHVyZSB3aXRoIGhhbmRsZVR5cGUgc2V0IHRvIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcE5leHQtMDE4NjgpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcy1wTWVtb3J5UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAicE1lbW9yeVByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMtcE1lbW9yeVByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBNZW1vcnlQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJwTWVtb3J5UHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBNZW1vcnlQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVC1wTXVsdGlzYW1wbGVQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJwTXVsdGlzYW1wbGVQcm9wZXJ0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQtcE11bHRpc2FtcGxlUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNdWx0aXNhbXBsZVByb3BlcnRpZXNFWFQtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTXVsdGlzYW1wbGVQcm9wZXJ0aWVzRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVC1zYW1wbGVzLXBhcmFtZXRlciIsICJzYW1wbGVzIG11c3QgYmUgYSB2YWxpZCBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZU11bHRpc2FtcGxlUHJvcGVydGllc0VYVC1zYW1wbGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIHBoeXNpY2FsRGV2aWNlLCBhbmQgc3VyZmFjZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrSW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSLXBSZWN0Q291bnQtcGFyYW1ldGVyIiwgInBSZWN0Q291bnQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUHJlc2VudFJlY3RhbmdsZXNLSFItcFJlY3RDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1wUmVjdHMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBSZWN0Q291bnQgaXMgbm90IDAsIGFuZCBwUmVjdHMgaXMgbm90IE5VTEwsIHBSZWN0cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUmVjdENvdW50IFZrUmVjdDJEIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByZXNlbnRSZWN0YW5nbGVzS0hSLXBSZWN0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1zdXJmYWNlLXBhcmFtZXRlciIsICJzdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUi1zdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMtcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgInBQcm9wZXJ0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1wUHJvcGVydGllcy1wYXJhbWV0ZXIiLCAicFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1wUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFItcE51bVBhc3Nlcy1wYXJhbWV0ZXIiLCAicE51bVBhc3NlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFItcE51bVBhc3Nlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFItcFBlcmZvcm1hbmNlUXVlcnlDcmVhdGVJbmZvLXBhcmFtZXRlciIsICJwUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUi1wUGVyZm9ybWFuY2VRdWVyeUNyZWF0ZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMtcFF1ZXVlRmFtaWx5UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMgaXMgbm90IE5VTEwsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMtcFF1ZXVlRmFtaWx5UHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMtcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudC1wYXJhbWV0ZXIiLCAicFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMtcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczItcFF1ZXVlRmFtaWx5UHJvcGVydGllcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMgaXMgbm90IE5VTEwsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1wUXVldWVGYW1pbHlQcm9wZXJ0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczItcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudC1wYXJhbWV0ZXIiLCAicFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyLXBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy1mb3JtYXQtcGFyYW1ldGVyIiwgImZvcm1hdCBtdXN0IGJlIGEgdmFsaWQgVmtGb3JtYXQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy1mb3JtYXQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwUHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBQcm9wZXJ0aWVzIGlzIG5vdCBOVUxMLCBwUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUHJvcGVydHlDb3VudCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtcFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsICJwUHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtcFByb3BlcnR5Q291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtc2FtcGxlcy0wMTA5NCIsICJzYW1wbGVzIG11c3QgYmUgYSBiaXQgdmFsdWUgdGhhdCBpcyBzZXQgaW4gVmtJbWFnZUZvcm1hdFByb3BlcnRpZXM6OnNhbXBsZUNvdW50cyByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIHdpdGggZm9ybWF0LCB0eXBlLCB0aWxpbmcsIGFuZCB1c2FnZSBlcXVhbCB0byB0aG9zZSBpbiB0aGlzIGNvbW1hbmQgYW5kIGZsYWdzIGVxdWFsIHRvIHRoZSB2YWx1ZSB0aGF0IGlzIHNldCBpbiBWa0ltYWdlQ3JlYXRlSW5mbzo6ZmxhZ3Mgd2hlbiB0aGUgaW1hZ2UgaXMgY3JlYXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXNhbXBsZXMtMDEwOTQpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtc2FtcGxlcy1wYXJhbWV0ZXIiLCAic2FtcGxlcyBtdXN0IGJlIGEgdmFsaWQgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtc2FtcGxlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdGlsaW5nLXBhcmFtZXRlciIsICJ0aWxpbmcgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VUaWxpbmcgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy10aWxpbmctcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLXR5cGUtcGFyYW1ldGVyIiwgInR5cGUgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2VUeXBlIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdXNhZ2UtcGFyYW1ldGVyIiwgInVzYWdlIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0ltYWdlVXNhZ2VGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy11c2FnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMtdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIiwgInVzYWdlIG11c3Qgbm90IGJlIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcy11c2FnZS1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBGb3JtYXRJbmZvLXBhcmFtZXRlciIsICJwRm9ybWF0SW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdEluZm8yIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wRm9ybWF0SW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwUHJvcGVydHlDb3VudCBpcyBub3QgMCwgYW5kIHBQcm9wZXJ0aWVzIGlzIG5vdCBOVUxMLCBwUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwUHJvcGVydHlDb3VudCBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1wUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlciIsICJwUHJvcGVydHlDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBQcm9wZXJ0eUNvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WLXBDb21iaW5hdGlvbkNvdW50LXBhcmFtZXRlciIsICJwQ29tYmluYXRpb25Db3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WLXBDb21iaW5hdGlvbkNvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYtcENvbWJpbmF0aW9ucy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcENvbWJpbmF0aW9uQ291bnQgaXMgbm90IDAsIGFuZCBwQ29tYmluYXRpb25zIGlzIG5vdCBOVUxMLCBwQ29tYmluYXRpb25zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBDb21iaW5hdGlvbkNvdW50IFZrRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNDb21iaW5hdGlvbk5WIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYtcENvbWJpbmF0aW9ucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXBwb3J0ZWRGcmFtZWJ1ZmZlck1peGVkU2FtcGxlc0NvbWJpbmF0aW9uc05WLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cHBvcnRlZEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzQ29tYmluYXRpb25zTlYtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgcGh5c2ljYWxEZXZpY2UsIGFuZCBzdXJmYWNlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtJbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJFWFQtcFN1cmZhY2VDYXBhYmlsaXRpZXMtcGFyYW1ldGVyIiwgInBTdXJmYWNlQ2FwYWJpbGl0aWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXBTdXJmYWNlQ2FwYWJpbGl0aWVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXN1cmZhY2UtcGFyYW1ldGVyIiwgInN1cmZhY2UgbXVzdCBiZSBhIHZhbGlkIFZrU3VyZmFjZUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyRVhULXN1cmZhY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFItcE5leHQtMDI2NzEiLCAiSWYgYSBWa1N1cmZhY2VDYXBhYmlsaXRpZXNGdWxsU2NyZWVuRXhjbHVzaXZlRVhUIHN0cnVjdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gb2YgcFN1cmZhY2VDYXBhYmlsaXRpZXMsIGEgVmtTdXJmYWNlRnVsbFNjcmVlbkV4Y2x1c2l2ZVdpbjMySW5mb0VYVCBzdHJ1Y3R1cmUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcE5leHQgY2hhaW4gb2YgcFN1cmZhY2VJbmZvLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFItcE5leHQtMDI2NzEpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUi1wU3VyZmFjZUNhcGFiaWxpdGllcy1wYXJhbWV0ZXIiLCAicFN1cmZhY2VDYXBhYmlsaXRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFItcFN1cmZhY2VDYXBhYmlsaXRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFItcFN1cmZhY2VJbmZvLXBhcmFtZXRlciIsICJwU3VyZmFjZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFItcFN1cmZhY2VJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFItY29tbW9ucGFyZW50IiwgIkJvdGggb2YgcGh5c2ljYWxEZXZpY2UsIGFuZCBzdXJmYWNlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtJbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLXBTdXJmYWNlQ2FwYWJpbGl0aWVzLXBhcmFtZXRlciIsICJwU3VyZmFjZUNhcGFiaWxpdGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFItcFN1cmZhY2VDYXBhYmlsaXRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLCAic3VyZmFjZSBtdXN0IGJlIGEgdmFsaWQgVmtTdXJmYWNlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUi1zdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1wU3VyZmFjZUZvcm1hdENvdW50LXBhcmFtZXRlciIsICJwU3VyZmFjZUZvcm1hdENvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1wU3VyZmFjZUZvcm1hdENvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1wU3VyZmFjZUZvcm1hdHMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBTdXJmYWNlRm9ybWF0Q291bnQgaXMgbm90IDAsIGFuZCBwU3VyZmFjZUZvcm1hdHMgaXMgbm90IE5VTEwsIHBTdXJmYWNlRm9ybWF0cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwU3VyZmFjZUZvcm1hdENvdW50IFZrU3VyZmFjZUZvcm1hdDJLSFIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSLXBTdXJmYWNlRm9ybWF0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFItcFN1cmZhY2VJbmZvLTAyNzQwIiwgInBTdXJmYWNlSW5mby0+c3VyZmFjZSBtdXN0IGJlIHN1cHBvcnRlZCBieSBwaHlzaWNhbERldmljZSwgYXMgcmVwb3J0ZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIG9yIGFuIGVxdWl2YWxlbnQgcGxhdGZvcm0tc3BlY2lmaWMgbWVjaGFuaXNtLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHMyS0hSLXBTdXJmYWNlSW5mby0wMjc0MCkifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1wU3VyZmFjZUluZm8tcGFyYW1ldGVyIiwgInBTdXJmYWNlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFItcFN1cmZhY2VJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFItY29tbW9ucGFyZW50IiwgIkJvdGggb2YgcGh5c2ljYWxEZXZpY2UsIGFuZCBzdXJmYWNlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtJbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFItY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFItcFN1cmZhY2VGb3JtYXRDb3VudC1wYXJhbWV0ZXIiLCAicFN1cmZhY2VGb3JtYXRDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1wU3VyZmFjZUZvcm1hdENvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSLXBTdXJmYWNlRm9ybWF0cy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFN1cmZhY2VGb3JtYXRDb3VudCBpcyBub3QgMCwgYW5kIHBTdXJmYWNlRm9ybWF0cyBpcyBub3QgTlVMTCwgcFN1cmZhY2VGb3JtYXRzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBTdXJmYWNlRm9ybWF0Q291bnQgVmtTdXJmYWNlRm9ybWF0S0hSIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSLXBTdXJmYWNlRm9ybWF0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1zdXJmYWNlLTAyNzM5IiwgInN1cmZhY2UgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgcGh5c2ljYWxEZXZpY2UsIGFzIHJlcG9ydGVkIGJ5IHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiBvciBhbiBlcXVpdmFsZW50IHBsYXRmb3JtLXNwZWNpZmljIG1lY2hhbmlzbS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSLXN1cmZhY2UtMDI3MzkpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1zdXJmYWNlLXBhcmFtZXRlciIsICJzdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUi1zdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhULXBQcmVzZW50TW9kZUNvdW50LXBhcmFtZXRlciIsICJwUHJlc2VudE1vZGVDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVC1wUHJlc2VudE1vZGVDb3VudC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzMkVYVC1wUHJlc2VudE1vZGVzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwUHJlc2VudE1vZGVDb3VudCBpcyBub3QgMCwgYW5kIHBQcmVzZW50TW9kZXMgaXMgbm90IE5VTEwsIHBQcmVzZW50TW9kZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFByZXNlbnRNb2RlQ291bnQgVmtQcmVzZW50TW9kZUtIUiB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhULXBQcmVzZW50TW9kZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcFN1cmZhY2VJbmZvLXBhcmFtZXRlciIsICJwU3VyZmFjZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2RlczJFWFQtcFN1cmZhY2VJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXMyRVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFItY29tbW9ucGFyZW50IiwgIkJvdGggb2YgcGh5c2ljYWxEZXZpY2UsIGFuZCBzdXJmYWNlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtJbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSLXBQcmVzZW50TW9kZUNvdW50LXBhcmFtZXRlciIsICJwUHJlc2VudE1vZGVDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSLXBQcmVzZW50TW9kZUNvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFItcFByZXNlbnRNb2Rlcy1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcFByZXNlbnRNb2RlQ291bnQgaXMgbm90IDAsIGFuZCBwUHJlc2VudE1vZGVzIGlzIG5vdCBOVUxMLCBwUHJlc2VudE1vZGVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBQcmVzZW50TW9kZUNvdW50IFZrUHJlc2VudE1vZGVLSFIgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSLXBQcmVzZW50TW9kZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFItc3VyZmFjZS1wYXJhbWV0ZXIiLCAic3VyZmFjZSBtdXN0IGJlIGEgdmFsaWQgVmtTdXJmYWNlS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUi1zdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIHBoeXNpY2FsRGV2aWNlLCBhbmQgc3VyZmFjZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrSW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLXBTdXBwb3J0ZWQtcGFyYW1ldGVyIiwgInBTdXBwb3J0ZWQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0Jvb2wzMiB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFItcFN1cHBvcnRlZC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUi1xdWV1ZUZhbWlseUluZGV4LTAxMjY5IiwgInF1ZXVlRmFtaWx5SW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIGZvciB0aGUgZ2l2ZW4gcGh5c2ljYWxEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDEyNjkpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUi1zdXJmYWNlLXBhcmFtZXRlciIsICJzdXJmYWNlIG11c3QgYmUgYSB2YWxpZCBWa1N1cmZhY2VLSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUi1zdXJmYWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhULXBUb29sQ291bnQtYXJyYXlsZW5ndGgiLCAiSWYgcFRvb2xQcm9wZXJ0aWVzIGlzIG5vdCBOVUxMLCB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwVG9vbENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhULXBUb29sQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVC1wVG9vbENvdW50LXBhcmFtZXRlciIsICJwVG9vbENvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVRvb2xQcm9wZXJ0aWVzRVhULXBUb29sQ291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtcFRvb2xQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJJZiBwVG9vbFByb3BlcnRpZXMgaXMgbm90IE5VTEwsIHBUb29sUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwVG9vbENvdW50IFZrUGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VUb29sUHJvcGVydGllc0VYVC1wVG9vbFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlVG9vbFByb3BlcnRpZXNFWFQtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFItZGlzcGxheS1wYXJhbWV0ZXIiLCAiZGlzcGxheSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHdsX2Rpc3BsYXkgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSLWRpc3BsYXktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwgInBoeXNpY2FsRGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa1BoeXNpY2FsRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFItcXVldWVGYW1pbHlJbmRleC0wMTMwNiIsICJxdWV1ZUZhbWlseUluZGV4IG11c3QgYmUgbGVzcyB0aGFuIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIHBoeXNpY2FsRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1xdWV1ZUZhbWlseUluZGV4LTAxMzA2KSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsICJwaHlzaWNhbERldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtQaHlzaWNhbERldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFItcXVldWVGYW1pbHlJbmRleC0wMTMwOSIsICJxdWV1ZUZhbWlseUluZGV4IG11c3QgYmUgbGVzcyB0aGFuIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIHBoeXNpY2FsRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFItcXVldWVGYW1pbHlJbmRleC0wMTMwOSkifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFItY29ubmVjdGlvbi1wYXJhbWV0ZXIiLCAiY29ubmVjdGlvbiBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiB4Y2JfY29ubmVjdGlvbl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSLWNvbm5lY3Rpb24tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFItcXVldWVGYW1pbHlJbmRleC0wMTMxMiIsICJxdWV1ZUZhbWlseUluZGV4IG11c3QgYmUgbGVzcyB0aGFuIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgcmV0dXJuZWQgYnkgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIHBoeXNpY2FsRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDEzMTIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1kcHktcGFyYW1ldGVyIiwgImRweSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIERpc3BsYXkgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSLWRweS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUi1xdWV1ZUZhbWlseUluZGV4LTAxMzE1IiwgInF1ZXVlRmFtaWx5SW5kZXggbXVzdCBiZSBsZXNzIHRoYW4gcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCByZXR1cm5lZCBieSB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIGZvciB0aGUgZ2l2ZW4gcGh5c2ljYWxEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSLXF1ZXVlRmFtaWx5SW5kZXgtMDEzMTUpIn0sCisgICAgeyJWVUlELXZrR2V0UGlwZWxpbmVDYWNoZURhdGEtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBpcGVsaW5lQ2FjaGVEYXRhLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGlwZWxpbmVDYWNoZURhdGEtcERhdGEtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBEYXRhU2l6ZSBpcyBub3QgMCwgYW5kIHBEYXRhIGlzIG5vdCBOVUxMLCBwRGF0YSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwRGF0YVNpemUgYnl0ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUNhY2hlRGF0YS1wRGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGlwZWxpbmVDYWNoZURhdGEtcERhdGFTaXplLXBhcmFtZXRlciIsICJwRGF0YVNpemUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBzaXplX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUNhY2hlRGF0YS1wRGF0YVNpemUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBpcGVsaW5lQ2FjaGVEYXRhLXBpcGVsaW5lQ2FjaGUtcGFyYW1ldGVyIiwgInBpcGVsaW5lQ2FjaGUgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmVDYWNoZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUNhY2hlRGF0YS1waXBlbGluZUNhY2hlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUNhY2hlRGF0YS1waXBlbGluZUNhY2hlLXBhcmVudCIsICJwaXBlbGluZUNhY2hlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVDYWNoZURhdGEtcGlwZWxpbmVDYWNoZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcEV4ZWN1dGFibGVJbmZvLXBhcmFtZXRlciIsICJwRXhlY3V0YWJsZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcEV4ZWN1dGFibGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUi1wSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LXBhcmFtZXRlciIsICJwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUi1wSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUi1wSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBJbnRlcm5hbFJlcHJlc2VudGF0aW9uQ291bnQgaXMgbm90IDAsIGFuZCBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbnMgaXMgbm90IE5VTEwsIHBJbnRlcm5hbFJlcHJlc2VudGF0aW9ucyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwSW50ZXJuYWxSZXByZXNlbnRhdGlvbkNvdW50IFZrUGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbktIUiBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcEludGVybmFsUmVwcmVzZW50YXRpb25zLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUi1waXBlbGluZS0wMzI3NyIsICJwaXBlbGluZSBtZW1iZXIgb2YgcEV4ZWN1dGFibGVJbmZvIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBkZXZpY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcGlwZWxpbmUtMDMyNzcpIn0sCisgICAgeyJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlSW50ZXJuYWxSZXByZXNlbnRhdGlvbnNLSFItcGlwZWxpbmUtMDMyNzgiLCAicGlwZWxpbmUgbWVtYmVyIG9mIHBFeGVjdXRhYmxlSW5mbyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfUElQRUxJTkVfQ1JFQVRFX0NBUFRVUkVfSU5URVJOQUxfUkVQUkVTRU5UQVRJT05TX0JJVF9LSFIgc2V0IGluIHRoZSBmbGFncyBmaWVsZCBvZiBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIG9yIFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mby4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUi1waXBlbGluZS0wMzI3OCkifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVJbnRlcm5hbFJlcHJlc2VudGF0aW9uc0tIUi1waXBlbGluZUV4ZWN1dGFibGVJbmZvLTAzMjc2IiwgInBpcGVsaW5lRXhlY3V0YWJsZUluZm8gbXVzdCBiZSBlbmFibGVkLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZUludGVybmFsUmVwcmVzZW50YXRpb25zS0hSLXBpcGVsaW5lRXhlY3V0YWJsZUluZm8tMDMyNzYpIn0sCisgICAgeyJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcEV4ZWN1dGFibGVDb3VudC1wYXJhbWV0ZXIiLCAicEV4ZWN1dGFibGVDb3VudCBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHVpbnQzMl90IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlUHJvcGVydGllc0tIUi1wRXhlY3V0YWJsZUNvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXBQaXBlbGluZUluZm8tcGFyYW1ldGVyIiwgInBQaXBlbGluZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BpcGVsaW5lSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXBQaXBlbGluZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBFeGVjdXRhYmxlQ291bnQgaXMgbm90IDAsIGFuZCBwUHJvcGVydGllcyBpcyBub3QgTlVMTCwgcFByb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcEV4ZWN1dGFibGVDb3VudCBWa1BpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFIgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcGlwZWxpbmUtMDMyNzEiLCAicGlwZWxpbmUgbWVtYmVyIG9mIHBQaXBlbGluZUluZm8gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGRldmljZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXBpcGVsaW5lLTAzMjcxKSJ9LAorICAgIHsiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNLSFItcGlwZWxpbmVFeGVjdXRhYmxlSW5mby0wMzI3MCIsICJwaXBlbGluZUV4ZWN1dGFibGVJbmZvIG11c3QgYmUgZW5hYmxlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVQcm9wZXJ0aWVzS0hSLXBpcGVsaW5lRXhlY3V0YWJsZUluZm8tMDMyNzApIn0sCisgICAgeyJWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFItcEV4ZWN1dGFibGVJbmZvLXBhcmFtZXRlciIsICJwRXhlY3V0YWJsZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1BpcGVsaW5lRXhlY3V0YWJsZUluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1wRXhlY3V0YWJsZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFItcFN0YXRpc3RpY0NvdW50LXBhcmFtZXRlciIsICJwU3RhdGlzdGljQ291bnQgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50MzJfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFItcFN0YXRpc3RpY0NvdW50LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSLXBTdGF0aXN0aWNzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwU3RhdGlzdGljQ291bnQgaXMgbm90IDAsIGFuZCBwU3RhdGlzdGljcyBpcyBub3QgTlVMTCwgcFN0YXRpc3RpY3MgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFN0YXRpc3RpY0NvdW50IFZrUGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljS0hSIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSLXBTdGF0aXN0aWNzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSLXBpcGVsaW5lLTAzMjczIiwgInBpcGVsaW5lIG1lbWJlciBvZiBwRXhlY3V0YWJsZUluZm8gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGRldmljZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSLXBpcGVsaW5lLTAzMjczKSJ9LAorICAgIHsiVlVJRC12a0dldFBpcGVsaW5lRXhlY3V0YWJsZVN0YXRpc3RpY3NLSFItcGlwZWxpbmUtMDMyNzQiLCAicGlwZWxpbmUgbWVtYmVyIG9mIHBFeGVjdXRhYmxlSW5mbyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggVktfUElQRUxJTkVfQ1JFQVRFX0NBUFRVUkVfU1RBVElTVElDU19CSVRfS0hSIHNldCBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBvciBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1waXBlbGluZS0wMzI3NCkifSwKKyAgICB7IlZVSUQtdmtHZXRQaXBlbGluZUV4ZWN1dGFibGVTdGF0aXN0aWNzS0hSLXBpcGVsaW5lRXhlY3V0YWJsZUluZm8tMDMyNzIiLCAicGlwZWxpbmVFeGVjdXRhYmxlSW5mbyBtdXN0IGJlIGVuYWJsZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UGlwZWxpbmVFeGVjdXRhYmxlU3RhdGlzdGljc0tIUi1waXBlbGluZUV4ZWN1dGFibGVJbmZvLTAzMjcyKSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZGF0YVNpemUtMDA4MTciLCAiZGF0YVNpemUgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgcmVzdWx0IG9mIGVhY2ggcXVlcnksIGFzIGRlc2NyaWJlZCBoZXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1kYXRhU2l6ZS0wMDgxNykifSwKKyAgICB7IlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWRhdGFTaXplLWFycmF5bGVuZ3RoIiwgImRhdGFTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWRhdGFTaXplLWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWZpcnN0UXVlcnktMDA4MTMiLCAiZmlyc3RRdWVyeSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gcXVlcnlQb29sIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1maXJzdFF1ZXJ5LTAwODEzKSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZmlyc3RRdWVyeS0wMDgxNiIsICJUaGUgc3VtIG9mIGZpcnN0UXVlcnkgYW5kIHF1ZXJ5Q291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBxdWVyaWVzIGluIHF1ZXJ5UG9vbCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZmlyc3RRdWVyeS0wMDgxNikifSwKKyAgICB7IlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAwODE1IiwgIklmIFZLX1FVRVJZX1JFU1VMVF82NF9CSVQgaXMgc2V0IGluIGZsYWdzIHRoZW4gcERhdGEgYW5kIHN0cmlkZSBtdXN0IGJlIG11bHRpcGxlcyBvZiA4IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1mbGFncy0wMDgxNSkifSwKKyAgICB7IlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAyODI3IiwgIklmIFZLX1FVRVJZX1JFU1VMVF82NF9CSVQgaXMgbm90IHNldCBpbiBmbGFncywgdGhlbiBwRGF0YSBhbmQgc3RyaWRlIG11c3QgYmUgbXVsdGlwbGVzIG9mIDQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAyODI3KSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtMDI4MjgiLCAiSWYgVktfUVVFUllfUkVTVUxUXzY0X0JJVCBpcyBub3Qgc2V0IGluIGZsYWdzIGFuZCB0aGUgcXVlcnlUeXBlIHVzZWQgdG8gY3JlYXRlIHF1ZXJ5UG9vbCB3YXMgbm90IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSLCB0aGVuIHBEYXRhIGFuZCBzdHJpZGUgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtMDI4MjgpIn0sCisgICAgeyJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUXVlcnlSZXN1bHRGbGFnQml0cyB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXBEYXRhLXBhcmFtZXRlciIsICJwRGF0YSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkYXRhU2l6ZSBieXRlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcERhdGEtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlQb29sLXBhcmFtZXRlciIsICJxdWVyeVBvb2wgbXVzdCBiZSBhIHZhbGlkIFZrUXVlcnlQb29sIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5UG9vbC1wYXJlbnQiLCAicXVlcnlQb29sIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1xdWVyeVBvb2wtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAwODE4IiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1RJTUVTVEFNUCwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19RVUVSWV9SRVNVTFRfUEFSVElBTF9CSVQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMDgxOCkifSwKKyAgICB7IlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIyOSIsICJJZiB0aGUgcXVlcnlUeXBlIHVzZWQgdG8gY3JlYXRlIHF1ZXJ5UG9vbCB3YXMgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIsIHRoZW4gcERhdGEgYW5kIHN0cmlkZSBtdXN0IGJlIG11bHRpcGxlcyBvZiB0aGUgc2l6ZSBvZiBWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjI5KSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjMwIiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiwgZmxhZ3MgbXVzdCBub3QgY29udGFpbiBWS19RVUVSWV9SRVNVTFRfV0lUSF9BVkFJTEFCSUxJVFlfQklULCBWS19RVUVSWV9SRVNVTFRfUEFSVElBTF9CSVQgb3IgVktfUVVFUllfUkVTVUxUXzY0X0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjMwKSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjMxIiwgIklmIHRoZSBxdWVyeVR5cGUgdXNlZCB0byBjcmVhdGUgcXVlcnlQb29sIHdhcyBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUiwgdGhlIHF1ZXJ5UG9vbCBtdXN0IGhhdmUgYmVlbiByZWNvcmRlZCBvbmNlIGZvciBlYWNoIHBhc3MgYXMgcmV0cmlldmVkIHZpYSBhIGNhbGwgdG8gdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjMxKSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOVi1wQ2hlY2twb2ludERhdGEtcGFyYW1ldGVyIiwgIklmIHRoZSB2YWx1ZSByZWZlcmVuY2VkIGJ5IHBDaGVja3BvaW50RGF0YUNvdW50IGlzIG5vdCAwLCBhbmQgcENoZWNrcG9pbnREYXRhIGlzIG5vdCBOVUxMLCBwQ2hlY2twb2ludERhdGEgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcENoZWNrcG9pbnREYXRhQ291bnQgVmtDaGVja3BvaW50RGF0YU5WIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYtcENoZWNrcG9pbnREYXRhLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYtcENoZWNrcG9pbnREYXRhQ291bnQtcGFyYW1ldGVyIiwgInBDaGVja3BvaW50RGF0YUNvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRRdWV1ZUNoZWNrcG9pbnREYXRhTlYtcENoZWNrcG9pbnREYXRhQ291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOVi1xdWV1ZS0wMjAyNSIsICJUaGUgZGV2aWNlIHRoYXQgcXVldWUgYmVsb25ncyB0byBtdXN0IGJlIGluIHRoZSBsb3N0IHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WLXF1ZXVlLTAyMDI1KSJ9LAorICAgIHsiVlVJRC12a0dldFF1ZXVlQ2hlY2twb2ludERhdGFOVi1xdWV1ZS1wYXJhbWV0ZXIiLCAicXVldWUgbXVzdCBiZSBhIHZhbGlkIFZrUXVldWUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UXVldWVDaGVja3BvaW50RGF0YU5WLXF1ZXVlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQtZHB5LXBhcmFtZXRlciIsICJkcHkgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBEaXNwbGF5IHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULWRweS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULXBEaXNwbGF5LXBhcmFtZXRlciIsICJwRGlzcGxheSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRGlzcGxheUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRSYW5kUk91dHB1dERpc3BsYXlFWFQtcERpc3BsYXktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFJhbmRST3V0cHV0RGlzcGxheUVYVC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UmFuZFJPdXRwdXREaXNwbGF5RVhULXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYtZGF0YVNpemUtMDI0MjAiLCAiZGF0YVNpemUgbXVzdCBiZSBhdCBsZWFzdCBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6c2hhZGVyR3JvdXBIYW5kbGVTaXplIHt0aW1lc30gZ3JvdXBDb3VudCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVi1kYXRhU2l6ZS0wMjQyMCkifSwKKyAgICB7IlZVSUQtdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYtZGF0YVNpemUtYXJyYXlsZW5ndGgiLCAiZGF0YVNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVi1kYXRhU2l6ZS1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVi1maXJzdEdyb3VwLTAyNDE5IiwgIlRoZSBzdW0gb2YgZmlyc3RHcm91cCBhbmQgZ3JvdXBDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHNoYWRlciBncm91cHMgaW4gcGlwZWxpbmUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLWZpcnN0R3JvdXAtMDI0MTkpIn0sCisgICAgeyJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLXBEYXRhLXBhcmFtZXRlciIsICJwRGF0YSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkYXRhU2l6ZSBieXRlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVi1wRGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WLXBpcGVsaW5lLXBhcmFtZXRlciIsICJwaXBlbGluZSBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYtcGlwZWxpbmUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFJheVRyYWNpbmdTaGFkZXJHcm91cEhhbmRsZXNOVi1waXBlbGluZS1wYXJlbnQiLCAicGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYtcGlwZWxpbmUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGRldmljZSwgYW5kIHN3YXBjaGFpbiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrSW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRSZWZyZXNoQ3ljbGVEdXJhdGlvbkdPT0dMRS1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUtcERpc3BsYXlUaW1pbmdQcm9wZXJ0aWVzLXBhcmFtZXRlciIsICJwRGlzcGxheVRpbWluZ1Byb3BlcnRpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa1JlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFLXBEaXNwbGF5VGltaW5nUHJvcGVydGllcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UmVmcmVzaEN5Y2xlRHVyYXRpb25HT09HTEUtc3dhcGNoYWluLXBhcmFtZXRlciIsICJzd2FwY2hhaW4gbXVzdCBiZSBhIHZhbGlkIFZrU3dhcGNoYWluS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFJlZnJlc2hDeWNsZUR1cmF0aW9uR09PR0xFLXN3YXBjaGFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5LWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHktZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHktcEdyYW51bGFyaXR5LXBhcmFtZXRlciIsICJwR3JhbnVsYXJpdHkgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0V4dGVudDJEIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFJlbmRlckFyZWFHcmFudWxhcml0eS1wR3JhbnVsYXJpdHktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFJlbmRlckFyZWFHcmFudWxhcml0eS1yZW5kZXJQYXNzLXBhcmFtZXRlciIsICJyZW5kZXJQYXNzIG11c3QgYmUgYSB2YWxpZCBWa1JlbmRlclBhc3MgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5LXJlbmRlclBhc3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFJlbmRlckFyZWFHcmFudWxhcml0eS1yZW5kZXJQYXNzLXBhcmVudCIsICJyZW5kZXJQYXNzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0UmVuZGVyQXJlYUdyYW51bGFyaXR5LXJlbmRlclBhc3MtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSLXBWYWx1ZS1wYXJhbWV0ZXIiLCAicFZhbHVlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDY0X3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFItcFZhbHVlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFItc2VtYXBob3JlLTAzMjU1IiwgInNlbWFwaG9yZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U2VtYXBob3JlQ291bnRlclZhbHVlS0hSLXNlbWFwaG9yZS0wMzI1NSkifSwKKyAgICB7IlZVSUQtdmtHZXRTZW1hcGhvcmVDb3VudGVyVmFsdWVLSFItc2VtYXBob3JlLXBhcmFtZXRlciIsICJzZW1hcGhvcmUgbXVzdCBiZSBhIHZhbGlkIFZrU2VtYXBob3JlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1zZW1hcGhvcmUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1zZW1hcGhvcmUtcGFyZW50IiwgInNlbWFwaG9yZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFNlbWFwaG9yZUNvdW50ZXJWYWx1ZUtIUi1zZW1hcGhvcmUtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldFNlbWFwaG9yZUZkS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTZW1hcGhvcmVGZEtIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFNlbWFwaG9yZUZkS0hSLXBGZC1wYXJhbWV0ZXIiLCAicEZkIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGludCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFNlbWFwaG9yZUZkS0hSLXBGZC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U2VtYXBob3JlRmRLSFItcEdldEZkSW5mby1wYXJhbWV0ZXIiLCAicEdldEZkSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFNlbWFwaG9yZUZkS0hSLXBHZXRGZEluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSLXBHZXRXaW4zMkhhbmRsZUluZm8tcGFyYW1ldGVyIiwgInBHZXRXaW4zMkhhbmRsZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUi1wR2V0V2luMzJIYW5kbGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUi1wSGFuZGxlLXBhcmFtZXRlciIsICJwSGFuZGxlIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgSEFORExFIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFItcEhhbmRsZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFNoYWRlckluZm9BTUQtaW5mb1R5cGUtcGFyYW1ldGVyIiwgImluZm9UeXBlIG11c3QgYmUgYSB2YWxpZCBWa1NoYWRlckluZm9UeXBlQU1EIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1pbmZvVHlwZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1wSW5mby1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcEluZm9TaXplIGlzIG5vdCAwLCBhbmQgcEluZm8gaXMgbm90IE5VTEwsIHBJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBJbmZvU2l6ZSBieXRlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFNoYWRlckluZm9BTUQtcEluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFNoYWRlckluZm9BTUQtcEluZm9TaXplLXBhcmFtZXRlciIsICJwSW5mb1NpemUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBzaXplX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELXBJbmZvU2l6ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1waXBlbGluZS1wYXJhbWV0ZXIiLCAicGlwZWxpbmUgbXVzdCBiZSBhIHZhbGlkIFZrUGlwZWxpbmUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1waXBlbGluZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1waXBlbGluZS1wYXJlbnQiLCAicGlwZWxpbmUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELXBpcGVsaW5lLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtHZXRTaGFkZXJJbmZvQU1ELXNoYWRlclN0YWdlLXBhcmFtZXRlciIsICJzaGFkZXJTdGFnZSBtdXN0IGJlIGEgdmFsaWQgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U2hhZGVySW5mb0FNRC1zaGFkZXJTdGFnZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U3dhcGNoYWluQ291bnRlckVYVC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBkZXZpY2UsIGFuZCBzd2FwY2hhaW4gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0luc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U3dhcGNoYWluQ291bnRlckVYVC1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0U3dhcGNoYWluQ291bnRlckVYVC1jb3VudGVyLXBhcmFtZXRlciIsICJjb3VudGVyIG11c3QgYmUgYSB2YWxpZCBWa1N1cmZhY2VDb3VudGVyRmxhZ0JpdHNFWFQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULWNvdW50ZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRTd2FwY2hhaW5Db3VudGVyRVhULXBDb3VudGVyVmFsdWUtcGFyYW1ldGVyIiwgInBDb3VudGVyVmFsdWUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB1aW50NjRfdCB2YWx1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtcENvdW50ZXJWYWx1ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U3dhcGNoYWluQ291bnRlckVYVC1zd2FwY2hhaW4tMDEyNDUiLCAiT25lIG9yIG1vcmUgcHJlc2VudCBjb21tYW5kcyBvbiBzd2FwY2hhaW4gbXVzdCBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBwcmVzZW50YXRpb24gZW5naW5lLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtc3dhcGNoYWluLTAxMjQ1KSJ9LAorICAgIHsiVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtc3dhcGNoYWluLXBhcmFtZXRlciIsICJzd2FwY2hhaW4gbXVzdCBiZSBhIHZhbGlkIFZrU3dhcGNoYWluS0hSIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFN3YXBjaGFpbkNvdW50ZXJFWFQtc3dhcGNoYWluLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFItY29tbW9ucGFyZW50IiwgIkJvdGggb2YgZGV2aWNlLCBhbmQgc3dhcGNoYWluIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtJbnN0YW5jZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1jb21tb25wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFItcFN3YXBjaGFpbkltYWdlQ291bnQtcGFyYW1ldGVyIiwgInBTd2FwY2hhaW5JbWFnZUNvdW50IG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdWludDMyX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFItcFN3YXBjaGFpbkltYWdlQ291bnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1wU3dhcGNoYWluSW1hZ2VzLXBhcmFtZXRlciIsICJJZiB0aGUgdmFsdWUgcmVmZXJlbmNlZCBieSBwU3dhcGNoYWluSW1hZ2VDb3VudCBpcyBub3QgMCwgYW5kIHBTd2FwY2hhaW5JbWFnZXMgaXMgbm90IE5VTEwsIHBTd2FwY2hhaW5JbWFnZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcFN3YXBjaGFpbkltYWdlQ291bnQgVmtJbWFnZSBoYW5kbGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSLXBTd2FwY2hhaW5JbWFnZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1zd2FwY2hhaW4tcGFyYW1ldGVyIiwgInN3YXBjaGFpbiBtdXN0IGJlIGEgdmFsaWQgVmtTd2FwY2hhaW5LSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U3dhcGNoYWluU3RhdHVzS0hSLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGRldmljZSwgYW5kIHN3YXBjaGFpbiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrSW5zdGFuY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFItY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a0dldFN3YXBjaGFpblN0YXR1c0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0U3dhcGNoYWluU3RhdHVzS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0U3dhcGNoYWluU3RhdHVzS0hSLXN3YXBjaGFpbi1wYXJhbWV0ZXIiLCAic3dhcGNoYWluIG11c3QgYmUgYSB2YWxpZCBWa1N3YXBjaGFpbktIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRTd2FwY2hhaW5TdGF0dXNLSFItc3dhcGNoYWluLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhULWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVC1wRGF0YS1wYXJhbWV0ZXIiLCAiSWYgdGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgcERhdGFTaXplIGlzIG5vdCAwLCBhbmQgcERhdGEgaXMgbm90IE5VTEwsIHBEYXRhIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBEYXRhU2l6ZSBieXRlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQtcERhdGEtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQtcERhdGFTaXplLXBhcmFtZXRlciIsICJwRGF0YVNpemUgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBzaXplX3QgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhULXBEYXRhU2l6ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVC12YWxpZGF0aW9uQ2FjaGUtcGFyYW1ldGVyIiwgInZhbGlkYXRpb25DYWNoZSBtdXN0IGJlIGEgdmFsaWQgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrR2V0VmFsaWRhdGlvbkNhY2hlRGF0YUVYVC12YWxpZGF0aW9uQ2FjaGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQtdmFsaWRhdGlvbkNhY2hlLXBhcmVudCIsICJ2YWxpZGF0aW9uQ2FjaGUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhULXZhbGlkYXRpb25DYWNoZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrSW1wb3J0RmVuY2VGZEtIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrSW1wb3J0RmVuY2VGZEtIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0ltcG9ydEZlbmNlRmRLSFItZmVuY2UtMDE0NjMiLCAiZmVuY2UgbXVzdCBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBxdWV1ZSBjb21tYW5kIHRoYXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGV4ZWN1dGlvbiBvbiB0aGF0IHF1ZXVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrSW1wb3J0RmVuY2VGZEtIUi1mZW5jZS0wMTQ2MykifSwKKyAgICB7IlZVSUQtdmtJbXBvcnRGZW5jZUZkS0hSLXBJbXBvcnRGZW5jZUZkSW5mby1wYXJhbWV0ZXIiLCAicEltcG9ydEZlbmNlRmRJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtJbXBvcnRGZW5jZUZkS0hSLXBJbXBvcnRGZW5jZUZkSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFItcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLXBhcmFtZXRlciIsICJwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ltcG9ydEZlbmNlV2luMzJIYW5kbGVLSFItcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtJbXBvcnRTZW1hcGhvcmVGZEtIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrSW1wb3J0U2VtYXBob3JlRmRLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtJbXBvcnRTZW1hcGhvcmVGZEtIUi1wSW1wb3J0U2VtYXBob3JlRmRJbmZvLXBhcmFtZXRlciIsICJwSW1wb3J0U2VtYXBob3JlRmRJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrSW1wb3J0U2VtYXBob3JlRmRLSFItcEltcG9ydFNlbWFwaG9yZUZkSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrSW1wb3J0U2VtYXBob3JlRmRLSFItc2VtYXBob3JlLTAxMTQyIiwgInNlbWFwaG9yZSBtdXN0IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IHF1ZXVlIGNvbW1hbmQgdGhhdCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZXhlY3V0aW9uIG9uIHRoYXQgcXVldWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtJbXBvcnRTZW1hcGhvcmVGZEtIUi1zZW1hcGhvcmUtMDExNDIpIn0sCisgICAgeyJWVUlELXZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFItZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFItcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby1wYXJhbWV0ZXIiLCAicEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSLXBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJTlRFTC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a0luaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMLXBJbml0aWFsaXplSW5mby1wYXJhbWV0ZXIiLCAicEluaXRpYWxpemVJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtJbml0aWFsaXplUGVyZm9ybWFuY2VBcGlJbmZvSU5URUwgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrSW5pdGlhbGl6ZVBlcmZvcm1hbmNlQXBpSU5URUwtcEluaXRpYWxpemVJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcy1tZW1vcnlSYW5nZUNvdW50LWFycmF5bGVuZ3RoIiwgIm1lbW9yeVJhbmdlQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMtbWVtb3J5UmFuZ2VDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLXBNZW1vcnlSYW5nZXMtcGFyYW1ldGVyIiwgInBNZW1vcnlSYW5nZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgbWVtb3J5UmFuZ2VDb3VudCB2YWxpZCBWa01hcHBlZE1lbW9yeVJhbmdlIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLXBNZW1vcnlSYW5nZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a01hcE1lbW9yeS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWFwTWVtb3J5LWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrTWFwTWVtb3J5LWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a01hcE1lbW9yeS1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtdmtNYXBNZW1vcnktbWVtb3J5LTAwNjc4IiwgIm1lbW9yeSBtdXN0IG5vdCBiZSBjdXJyZW50bHkgaG9zdCBtYXBwZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtNYXBNZW1vcnktbWVtb3J5LTAwNjc4KSJ9LAorICAgIHsiVlVJRC12a01hcE1lbW9yeS1tZW1vcnktMDA2ODIiLCAibWVtb3J5IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSB0eXBlIHRoYXQgcmVwb3J0cyBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a01hcE1lbW9yeS1tZW1vcnktMDA2ODIpIn0sCisgICAgeyJWVUlELXZrTWFwTWVtb3J5LW1lbW9yeS0wMDY4MyIsICJtZW1vcnkgbXVzdCBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIG11bHRpcGxlIGluc3RhbmNlcy4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtNYXBNZW1vcnktbWVtb3J5LTAwNjgzKSJ9LAorICAgIHsiVlVJRC12a01hcE1lbW9yeS1tZW1vcnktcGFyYW1ldGVyIiwgIm1lbW9yeSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWFwTWVtb3J5LW1lbW9yeS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrTWFwTWVtb3J5LW1lbW9yeS1wYXJlbnQiLCAibWVtb3J5IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWFwTWVtb3J5LW1lbW9yeS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrTWFwTWVtb3J5LW9mZnNldC0wMDY3OSIsICJvZmZzZXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgbWVtb3J5IChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWFwTWVtb3J5LW9mZnNldC0wMDY3OSkifSwKKyAgICB7IlZVSUQtdmtNYXBNZW1vcnktcHBEYXRhLXBhcmFtZXRlciIsICJwcERhdGEgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBwb2ludGVyIHZhbHVlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWFwTWVtb3J5LXBwRGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrTWFwTWVtb3J5LXNpemUtMDA2ODAiLCAiSWYgc2l6ZSBpcyBub3QgZXF1YWwgdG8gVktfV0hPTEVfU0laRSwgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWFwTWVtb3J5LXNpemUtMDA2ODApIn0sCisgICAgeyJWVUlELXZrTWFwTWVtb3J5LXNpemUtMDA2ODEiLCAiSWYgc2l6ZSBpcyBub3QgZXF1YWwgdG8gVktfV0hPTEVfU0laRSwgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IG1pbnVzIG9mZnNldCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a01hcE1lbW9yeS1zaXplLTAwNjgxKSJ9LAorICAgIHsiVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtNZXJnZVBpcGVsaW5lQ2FjaGVzLWRzdENhY2hlLTAwNzcwIiwgImRzdENhY2hlIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBzb3VyY2UgY2FjaGVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1kc3RDYWNoZS0wMDc3MCkifSwKKyAgICB7IlZVSUQtdmtNZXJnZVBpcGVsaW5lQ2FjaGVzLWRzdENhY2hlLXBhcmFtZXRlciIsICJkc3RDYWNoZSBtdXN0IGJlIGEgdmFsaWQgVmtQaXBlbGluZUNhY2hlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtZHN0Q2FjaGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtZHN0Q2FjaGUtcGFyZW50IiwgImRzdENhY2hlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1kc3RDYWNoZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrTWVyZ2VQaXBlbGluZUNhY2hlcy1wU3JjQ2FjaGVzLXBhcmFtZXRlciIsICJwU3JjQ2FjaGVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNyY0NhY2hlQ291bnQgdmFsaWQgVmtQaXBlbGluZUNhY2hlIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtNZXJnZVBpcGVsaW5lQ2FjaGVzLXBTcmNDYWNoZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtcFNyY0NhY2hlcy1wYXJlbnQiLCAiRWFjaCBlbGVtZW50IG9mIHBTcmNDYWNoZXMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtNZXJnZVBpcGVsaW5lQ2FjaGVzLXBTcmNDYWNoZXMtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a01lcmdlUGlwZWxpbmVDYWNoZXMtc3JjQ2FjaGVDb3VudC1hcnJheWxlbmd0aCIsICJzcmNDYWNoZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtNZXJnZVBpcGVsaW5lQ2FjaGVzLXNyY0NhY2hlQ291bnQtYXJyYXlsZW5ndGgpIn0sCisgICAgeyJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQtZHN0Q2FjaGUtMDE1MzYiLCAiZHN0Q2FjaGUgbXVzdCBub3QgYXBwZWFyIGluIHRoZSBsaXN0IG9mIHNvdXJjZSBjYWNoZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQtZHN0Q2FjaGUtMDE1MzYpIn0sCisgICAgeyJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRzdENhY2hlLXBhcmFtZXRlciIsICJkc3RDYWNoZSBtdXN0IGJlIGEgdmFsaWQgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRzdENhY2hlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQtZHN0Q2FjaGUtcGFyZW50IiwgImRzdENhY2hlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRzdENhY2hlLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQtcFNyY0NhY2hlcy1wYXJhbWV0ZXIiLCAicFNyY0NhY2hlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzcmNDYWNoZUNvdW50IHZhbGlkIFZrVmFsaWRhdGlvbkNhY2hlRVhUIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQtcFNyY0NhY2hlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULXBTcmNDYWNoZXMtcGFyZW50IiwgIkVhY2ggZWxlbWVudCBvZiBwU3JjQ2FjaGVzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULXBTcmNDYWNoZXMtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1zcmNDYWNoZUNvdW50LWFycmF5bGVuZ3RoIiwgInNyY0NhY2hlQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVC1zcmNDYWNoZUNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsSW5mby1wYXJhbWV0ZXIiLCAicExhYmVsSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGVidWdVdGlsc0xhYmVsRVhUIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1xdWV1ZS1wYXJhbWV0ZXIiLCAicXVldWUgbXVzdCBiZSBhIHZhbGlkIFZrUXVldWUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1xdWV1ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUXVldWVCaW5kU3BhcnNlLWNvbW1vbnBhcmVudCIsICJCb3RoIG9mIGZlbmNlLCBhbmQgcXVldWUgdGhhdCBhcmUgdmFsaWQgaGFuZGxlcyBvZiBub24taWdub3JlZCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1mZW5jZS0wMTExMyIsICJJZiBmZW5jZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGZlbmNlIG11c3QgYmUgdW5zaWduYWxlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1mZW5jZS0wMTExMykifSwKKyAgICB7IlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtZmVuY2UtMDExMTQiLCAiSWYgZmVuY2UgaXMgbm90IFZLX05VTExfSEFORExFLCBmZW5jZSBtdXN0IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IG90aGVyIHF1ZXVlIGNvbW1hbmQgdGhhdCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZXhlY3V0aW9uIG9uIHRoYXQgcXVldWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtZmVuY2UtMDExMTQpIn0sCisgICAgeyJWVUlELXZrUXVldWVCaW5kU3BhcnNlLWZlbmNlLXBhcmFtZXRlciIsICJJZiBmZW5jZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGZlbmNlIG11c3QgYmUgYSB2YWxpZCBWa0ZlbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1mZW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUXVldWVCaW5kU3BhcnNlLXBCaW5kSW5mby1wYXJhbWV0ZXIiLCAiSWYgYmluZEluZm9Db3VudCBpcyBub3QgMCwgcEJpbmRJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpbmRJbmZvQ291bnQgdmFsaWQgVmtCaW5kU3BhcnNlSW5mbyBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVCaW5kU3BhcnNlLXBCaW5kSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUXVldWVCaW5kU3BhcnNlLXBTaWduYWxTZW1hcGhvcmVzLTAxMTE1IiwgIkVhY2ggZWxlbWVudCBvZiB0aGUgcFNpZ25hbFNlbWFwaG9yZXMgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwQmluZEluZm8gbXVzdCBiZSB1bnNpZ25hbGVkIHdoZW4gdGhlIHNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uIGl0IGRlZmluZXMgaXMgZXhlY3V0ZWQgb24gdGhlIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1wU2lnbmFsU2VtYXBob3Jlcy0wMTExNSkifSwKKyAgICB7IlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtcFdhaXRTZW1hcGhvcmVzLTAxMTE2IiwgIldoZW4gYSBzZW1hcGhvcmUgd2FpdCBvcGVyYXRpb24gcmVmZXJyaW5nIHRvIGEgYmluYXJ5IHNlbWFwaG9yZSBkZWZpbmVkIGJ5IGFueSBlbGVtZW50IG9mIHRoZSBwV2FpdFNlbWFwaG9yZXMgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBCaW5kSW5mbyBleGVjdXRlcyBvbiBxdWV1ZSwgdGhlcmUgbXVzdCBiZSBubyBvdGhlciBxdWV1ZXMgd2FpdGluZyBvbiB0aGUgc2FtZSBzZW1hcGhvcmUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVCaW5kU3BhcnNlLXBXYWl0U2VtYXBob3Jlcy0wMTExNikifSwKKyAgICB7IlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtcFdhaXRTZW1hcGhvcmVzLTAxMTE3IiwgIkFsbCBlbGVtZW50cyBvZiB0aGUgcFdhaXRTZW1hcGhvcmVzIG1lbWJlciBvZiBhbGwgZWxlbWVudHMgb2YgcEJpbmRJbmZvIG1lbWJlciByZWZlcnJpbmcgdG8gYSBiaW5hcnkgc2VtYXBob3JlIG11c3QgYmUgc2VtYXBob3JlcyB0aGF0IGFyZSBzaWduYWxlZCwgb3IgaGF2ZSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbnMgcHJldmlvdXNseSBzdWJtaXR0ZWQgZm9yIGV4ZWN1dGlvbi4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtcFdhaXRTZW1hcGhvcmVzLTAxMTE3KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1wV2FpdFNlbWFwaG9yZXMtMDMyNDUiLCAiQWxsIGVsZW1lbnRzIG9mIHRoZSBwV2FpdFNlbWFwaG9yZXMgbWVtYmVyIG9mIGFsbCBlbGVtZW50cyBvZiBwQmluZEluZm8gY3JlYXRlZCB3aXRoIGEgVmtTZW1hcGhvcmVUeXBlS0hSIG9mIFZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIgbXVzdCByZWZlcmVuY2UgYSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgZXhlY3V0aW9uIGFuZCBhbnkgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb25zIG9uIHdoaWNoIGl0IGRlcGVuZHMgKGlmIGFueSkgbXVzdCBoYXZlIGFsc28gYmVlbiBzdWJtaXR0ZWQgZm9yIGV4ZWN1dGlvbi4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtcFdhaXRTZW1hcGhvcmVzLTAzMjQ1KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1xdWV1ZS1wYXJhbWV0ZXIiLCAicXVldWUgbXVzdCBiZSBhIHZhbGlkIFZrUXVldWUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVCaW5kU3BhcnNlLXF1ZXVlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtRdWV1ZUJpbmRTcGFyc2UtcXVldWV0eXBlIiwgIlRoZSBxdWV1ZSBtdXN0IHN1cHBvcnQgc3BhcnNlIGJpbmRpbmcgb3BlcmF0aW9ucyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlQmluZFNwYXJzZS1xdWV1ZXR5cGUpIn0sCisgICAgeyJWVUlELXZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQtTm9uZS0wMTkxMSIsICJUaGVyZSBtdXN0IGJlIGFuIG91dHN0YW5kaW5nIHZrUXVldWVCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVCBjb21tYW5kIHByaW9yIHRvIHRoZSB2a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhUIG9uIHRoZSBxdWV1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhULU5vbmUtMDE5MTEpIn0sCisgICAgeyJWVUlELXZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQtcXVldWUtcGFyYW1ldGVyIiwgInF1ZXVlIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXVlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlRW5kRGVidWdVdGlsc0xhYmVsRVhULXF1ZXVlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVC1wTGFiZWxJbmZvLXBhcmFtZXRlciIsICJwTGFiZWxJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtcExhYmVsSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUXVldWVJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtcXVldWUtcGFyYW1ldGVyIiwgInF1ZXVlIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXVlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhULXF1ZXVlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcFByZXNlbnRJbmZvLXBhcmFtZXRlciIsICJwUHJlc2VudEluZm8gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa1ByZXNlbnRJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wUHJlc2VudEluZm8tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wU3dhcGNoYWlucy0wMTI5MiIsICJFYWNoIGVsZW1lbnQgb2YgcFN3YXBjaGFpbnMgbWVtYmVyIG9mIHBQcmVzZW50SW5mbyBtdXN0IGJlIGEgc3dhcGNoYWluIHRoYXQgaXMgY3JlYXRlZCBmb3IgYSBzdXJmYWNlIGZvciB3aGljaCBwcmVzZW50YXRpb24gaXMgc3VwcG9ydGVkIGZyb20gcXVldWUgYXMgZGV0ZXJtaW5lZCB1c2luZyBhIGNhbGwgdG8gdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVQcmVzZW50S0hSLXBTd2FwY2hhaW5zLTAxMjkyKSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wU3dhcGNoYWlucy0wMTI5MyIsICJJZiBtb3JlIHRoYW4gb25lIG1lbWJlciBvZiBwU3dhcGNoYWlucyB3YXMgY3JlYXRlZCBmcm9tIGEgZGlzcGxheSBzdXJmYWNlLCBhbGwgZGlzcGxheSBzdXJmYWNlcyByZWZlcmVuY2VkIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgZGlzcGxheSBtdXN0IHVzZSB0aGUgc2FtZSBkaXNwbGF5IG1vZGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcFN3YXBjaGFpbnMtMDEyOTMpIn0sCisgICAgeyJWVUlELXZrUXVldWVQcmVzZW50S0hSLXBXYWl0U2VtYXBob3Jlcy0wMTI5NCIsICJXaGVuIGEgc2VtYXBob3JlIHdhaXQgb3BlcmF0aW9uIHJlZmVycmluZyB0byBhIGJpbmFyeSBzZW1hcGhvcmUgZGVmaW5lZCBieSB0aGUgZWxlbWVudHMgb2YgdGhlIHBXYWl0U2VtYXBob3JlcyBtZW1iZXIgb2YgcFByZXNlbnRJbmZvIGV4ZWN1dGVzIG9uIHF1ZXVlLCB0aGVyZSBtdXN0IGJlIG5vIG90aGVyIHF1ZXVlcyB3YWl0aW5nIG9uIHRoZSBzYW1lIHNlbWFwaG9yZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcFdhaXRTZW1hcGhvcmVzLTAxMjk0KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wV2FpdFNlbWFwaG9yZXMtMDEyOTUiLCAiQWxsIGVsZW1lbnRzIG9mIHRoZSBwV2FpdFNlbWFwaG9yZXMgbWVtYmVyIG9mIHBQcmVzZW50SW5mbyBtdXN0IGJlIHNlbWFwaG9yZXMgdGhhdCBhcmUgc2lnbmFsZWQsIG9yIGhhdmUgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb25zIHByZXZpb3VzbHkgc3VibWl0dGVkIGZvciBleGVjdXRpb24uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVQcmVzZW50S0hSLXBXYWl0U2VtYXBob3Jlcy0wMTI5NSkifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcFdhaXRTZW1hcGhvcmVzLTAzMjY3IiwgIkFsbCBlbGVtZW50cyBvZiB0aGUgcFdhaXRTZW1hcGhvcmVzIG1lbWJlciBvZiBwUHJlc2VudEluZm8gbXVzdCBiZSBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUi4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcFdhaXRTZW1hcGhvcmVzLTAzMjY3KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wV2FpdFNlbWFwaG9yZXMtMDMyNjgiLCAiQWxsIGVsZW1lbnRzIG9mIHRoZSBwV2FpdFNlbWFwaG9yZXMgbWVtYmVyIG9mIHBQcmVzZW50SW5mbyBtdXN0IHJlZmVyZW5jZSBhIHNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uIHRoYXQgaGFzIGJlZW4gc3VibWl0dGVkIGZvciBleGVjdXRpb24gYW5kIGFueSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbnMgb24gd2hpY2ggaXQgZGVwZW5kcyAoaWYgYW55KSBtdXN0IGhhdmUgYWxzbyBiZWVuIHN1Ym1pdHRlZCBmb3IgZXhlY3V0aW9uLiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlUHJlc2VudEtIUi1wV2FpdFNlbWFwaG9yZXMtMDMyNjgpIn0sCisgICAgeyJWVUlELXZrUXVldWVQcmVzZW50S0hSLXF1ZXVlLXBhcmFtZXRlciIsICJxdWV1ZSBtdXN0IGJlIGEgdmFsaWQgVmtRdWV1ZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVByZXNlbnRLSFItcXVldWUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwtY29tbW9ucGFyZW50IiwgIkJvdGggb2YgY29uZmlndXJhdGlvbiwgYW5kIHF1ZXVlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gdGhlIHNhbWUgVmtEZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbmZpZ3VyYXRpb24tcGFyYW1ldGVyIiwgImNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhIHZhbGlkIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1jb25maWd1cmF0aW9uLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLXF1ZXVlLXBhcmFtZXRlciIsICJxdWV1ZSBtdXN0IGJlIGEgdmFsaWQgVmtRdWV1ZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLXF1ZXVlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVN1Ym1pdC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBmZW5jZSwgYW5kIHF1ZXVlIHRoYXQgYXJlIHZhbGlkIGhhbmRsZXMgb2Ygbm9uLWlnbm9yZWQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzYW1lIFZrRGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVTdWJtaXQtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlU3VibWl0LWZlbmNlLTAwMDYzIiwgIklmIGZlbmNlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZmVuY2UgbXVzdCBiZSB1bnNpZ25hbGVkIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVTdWJtaXQtZmVuY2UtMDAwNjMpIn0sCisgICAgeyJWVUlELXZrUXVldWVTdWJtaXQtZmVuY2UtMDAwNjQiLCAiSWYgZmVuY2UgaXMgbm90IFZLX05VTExfSEFORExFLCBmZW5jZSBtdXN0IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IG90aGVyIHF1ZXVlIGNvbW1hbmQgdGhhdCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZXhlY3V0aW9uIG9uIHRoYXQgcXVldWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVN1Ym1pdC1mZW5jZS0wMDA2NCkifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVN1Ym1pdC1mZW5jZS1wYXJhbWV0ZXIiLCAiSWYgZmVuY2UgaXMgbm90IFZLX05VTExfSEFORExFLCBmZW5jZSBtdXN0IGJlIGEgdmFsaWQgVmtGZW5jZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVN1Ym1pdC1mZW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAwMDY1IiwgIkFueSBjYWxscyB0byB2a0NtZFNldEV2ZW50LCB2a0NtZFJlc2V0RXZlbnQgb3IgdmtDbWRXYWl0RXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHJlY29yZGVkIGludG8gYW55IG9mIHRoZSBjb21tYW5kIGJ1ZmZlciBlbGVtZW50cyBvZiB0aGUgcENvbW1hbmRCdWZmZXJzIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwU3VibWl0cywgbXVzdCBub3QgcmVmZXJlbmNlIGFueSBWa0V2ZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhbnkgb2YgdGhvc2UgY29tbWFuZHMgaW4gYSBjb21tYW5kIGJ1ZmZlciB0aGF0IGhhcyBiZWVuIHN1Ym1pdHRlZCB0byBhbm90aGVyIHF1ZXVlIGFuZCBpcyBzdGlsbCBpbiB0aGUgcGVuZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA2NSkifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVN1Ym1pdC1wQ29tbWFuZEJ1ZmZlcnMtMDAwNzAiLCAiRWFjaCBlbGVtZW50IG9mIHRoZSBwQ29tbWFuZEJ1ZmZlcnMgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwU3VibWl0cyBtdXN0IGJlIGluIHRoZSBwZW5kaW5nIG9yIGV4ZWN1dGFibGUgc3RhdGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVN1Ym1pdC1wQ29tbWFuZEJ1ZmZlcnMtMDAwNzApIn0sCisgICAgeyJWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAwMDcxIiwgIklmIGFueSBlbGVtZW50IG9mIHRoZSBwQ29tbWFuZEJ1ZmZlcnMgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBTdWJtaXRzIHdhcyBub3QgcmVjb3JkZWQgd2l0aCB0aGUgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQsIGl0IG11c3Qgbm90IGJlIGluIHRoZSBwZW5kaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAwMDcxKSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3MiIsICJBbnkgc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVycyByZWNvcmRlZCBpbnRvIGFueSBlbGVtZW50IG9mIHRoZSBwQ29tbWFuZEJ1ZmZlcnMgbWVtYmVyIG9mIGFueSBlbGVtZW50IG9mIHBTdWJtaXRzIG11c3QgYmUgaW4gdGhlIHBlbmRpbmcgb3IgZXhlY3V0YWJsZSBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3MikifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVN1Ym1pdC1wQ29tbWFuZEJ1ZmZlcnMtMDAwNzMiLCAiSWYgYW55IHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlcnMgcmVjb3JkZWQgaW50byBhbnkgZWxlbWVudCBvZiB0aGUgcENvbW1hbmRCdWZmZXJzIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwU3VibWl0cyB3YXMgbm90IHJlY29yZGVkIHdpdGggdGhlIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklULCBpdCBtdXN0IG5vdCBiZSBpbiB0aGUgcGVuZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3MykifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVN1Ym1pdC1wQ29tbWFuZEJ1ZmZlcnMtMDAwNzQiLCAiRWFjaCBlbGVtZW50IG9mIHRoZSBwQ29tbWFuZEJ1ZmZlcnMgbWVtYmVyIG9mIGVhY2ggZWxlbWVudCBvZiBwU3VibWl0cyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSBhIFZrQ29tbWFuZFBvb2wgdGhhdCB3YXMgY3JlYXRlZCBmb3IgdGhlIHNhbWUgcXVldWUgZmFtaWx5IHF1ZXVlIGJlbG9uZ3MgdG8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVN1Ym1pdC1wQ29tbWFuZEJ1ZmZlcnMtMDAwNzQpIn0sCisgICAgeyJWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAzMjIwIiwgIklmIGEgY29tbWFuZCByZWNvcmRlZCBpbnRvIGFueSBlbGVtZW50IG9mIHBDb21tYW5kQnVmZmVycyB3YXMgYSB2a0NtZEJlZ2luUXVlcnkgd2hvc2UgcXVlcnlQb29sIHdhcyBjcmVhdGVkIHdpdGggYSBxdWVyeVR5cGUgb2YgVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFIsIHRoZSBwcm9maWxpbmcgbG9jayBtdXN0IGhhdmUgYmVlbiBoZWxkIGNvbnRpbnVvdXNseSBvbiB0aGUgVmtEZXZpY2UgdGhhdCBxdWV1ZSB3YXMgcmV0cmlldmVkIGZyb20sIHRocm91Z2hvdXQgcmVjb3JkaW5nIG9mIHRob3NlIGNvbW1hbmQgYnVmZmVycyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMzIyMCkifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVN1Ym1pdC1wU2lnbmFsU2VtYXBob3Jlcy0wMDA2NyIsICJFYWNoIGVsZW1lbnQgb2YgdGhlIHBTaWduYWxTZW1hcGhvcmVzIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwU3VibWl0cyBtdXN0IGJlIHVuc2lnbmFsZWQgd2hlbiB0aGUgc2VtYXBob3JlIHNpZ25hbCBvcGVyYXRpb24gaXQgZGVmaW5lcyBpcyBleGVjdXRlZCBvbiB0aGUgZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVTdWJtaXQtcFNpZ25hbFNlbWFwaG9yZXMtMDAwNjcpIn0sCisgICAgeyJWVUlELXZrUXVldWVTdWJtaXQtcFN1Ym1pdHMtMDIyMDciLCAiSWYgYW55IGVsZW1lbnQgb2YgcFN1Ym1pdHMtPnBDb21tYW5kQnVmZmVycyBpbmNsdWRlcyBhIFF1ZXVlIEZhbWlseSBUcmFuc2ZlciBBY3F1aXJlIE9wZXJhdGlvbiwgdGhlcmUgbXVzdCBleGlzdCBhIHByZXZpb3VzbHkgc3VibWl0dGVkIFF1ZXVlIEZhbWlseSBUcmFuc2ZlciBSZWxlYXNlIE9wZXJhdGlvbiBvbiBhIHF1ZXVlIGluIHRoZSBxdWV1ZSBmYW1pbHkgaWRlbnRpZmllZCBieSB0aGUgYWNxdWlyZSBvcGVyYXRpb24sIHdpdGggcGFyYW1ldGVycyBtYXRjaGluZyB0aGUgYWNxdWlyZSBvcGVyYXRpb24gYXMgZGVmaW5lZCBpbiB0aGUgZGVmaW5pdGlvbiBvZiBzdWNoIGFjcXVpcmUgb3BlcmF0aW9ucywgYW5kIHdoaWNoIGhhcHBlbnMgYmVmb3JlIHRoZSBhY3F1aXJlIG9wZXJhdGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlU3VibWl0LXBTdWJtaXRzLTAyMjA3KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlU3VibWl0LXBTdWJtaXRzLTAyODA4IiwgIkFueSByZXNvdXJjZSBjcmVhdGVkIHdpdGggVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSB0aGF0IGlzIHJlYWQgYnkgYW4gb3BlcmF0aW9uIHNwZWNpZmllZCBieSBwU3VibWl0cyBtdXN0IG5vdCBiZSBvd25lZCBieSBhbnkgcXVldWUgZmFtaWx5IG90aGVyIHRoYW4gdGhlIG9uZSB3aGljaCBxdWV1ZSBiZWxvbmdzIHRvLCBhdCB0aGUgdGltZSBpdCBpcyBleGVjdXRlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlU3VibWl0LXBTdWJtaXRzLTAyODA4KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlU3VibWl0LXBTdWJtaXRzLXBhcmFtZXRlciIsICJJZiBzdWJtaXRDb3VudCBpcyBub3QgMCwgcFN1Ym1pdHMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3VibWl0Q291bnQgdmFsaWQgVmtTdWJtaXRJbmZvIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVN1Ym1pdC1wU3VibWl0cy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUXVldWVTdWJtaXQtcFdhaXREc3RTdGFnZU1hc2stMDAwNjYiLCAiQW55IHN0YWdlIGZsYWcgaW5jbHVkZWQgaW4gYW55IGVsZW1lbnQgb2YgdGhlIHBXYWl0RHN0U3RhZ2VNYXNrIG1lbWJlciBvZiBhbnkgZWxlbWVudCBvZiBwU3VibWl0cyBtdXN0IGJlIGEgcGlwZWxpbmUgc3RhZ2Ugc3VwcG9ydGVkIGJ5IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzIG9mIHF1ZXVlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIHRhYmxlIG9mIHN1cHBvcnRlZCBwaXBlbGluZSBzdGFnZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVN1Ym1pdC1wV2FpdERzdFN0YWdlTWFzay0wMDA2NikifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVN1Ym1pdC1wV2FpdFNlbWFwaG9yZXMtMDAwNjgiLCAiV2hlbiBhIHNlbWFwaG9yZSB3YWl0IG9wZXJhdGlvbiByZWZlcnJpbmcgdG8gYSBiaW5hcnkgc2VtYXBob3JlIGRlZmluZWQgYnkgYW55IGVsZW1lbnQgb2YgdGhlIHBXYWl0U2VtYXBob3JlcyBtZW1iZXIgb2YgYW55IGVsZW1lbnQgb2YgcFN1Ym1pdHMgZXhlY3V0ZXMgb24gcXVldWUsIHRoZXJlIG11c3QgYmUgbm8gb3RoZXIgcXVldWVzIHdhaXRpbmcgb24gdGhlIHNhbWUgc2VtYXBob3JlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVTdWJtaXQtcFdhaXRTZW1hcGhvcmVzLTAwMDY4KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlU3VibWl0LXBXYWl0U2VtYXBob3Jlcy0wMDA2OSIsICJBbGwgZWxlbWVudHMgb2YgdGhlIHBXYWl0U2VtYXBob3JlcyBtZW1iZXIgb2YgYWxsIGVsZW1lbnRzIG9mIHBTdWJtaXRzIG11c3QgYmUgc2VtYXBob3JlcyB0aGF0IGFyZSBzaWduYWxlZCwgb3IgaGF2ZSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbnMgcHJldmlvdXNseSBzdWJtaXR0ZWQgZm9yIGV4ZWN1dGlvbiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1F1ZXVlU3VibWl0LXBXYWl0U2VtYXBob3Jlcy0wMDA2OSkifSwKKyAgICB7IlZVSUQtdmtRdWV1ZVN1Ym1pdC1wV2FpdFNlbWFwaG9yZXMtMDMyMzgiLCAiQWxsIGVsZW1lbnRzIG9mIHRoZSBwV2FpdFNlbWFwaG9yZXMgbWVtYmVyIG9mIGFsbCBlbGVtZW50cyBvZiBwU3VibWl0cyBjcmVhdGVkIHdpdGggYSBWa1NlbWFwaG9yZVR5cGVLSFIgb2YgVktfU0VNQVBIT1JFX1RZUEVfQklOQVJZX0tIUiBtdXN0IHJlZmVyZW5jZSBhIHNlbWFwaG9yZSBzaWduYWwgb3BlcmF0aW9uIHRoYXQgaGFzIGJlZW4gc3VibWl0dGVkIGZvciBleGVjdXRpb24gYW5kIGFueSBzZW1hcGhvcmUgc2lnbmFsIG9wZXJhdGlvbnMgb24gd2hpY2ggaXQgZGVwZW5kcyAoaWYgYW55KSBtdXN0IGhhdmUgYWxzbyBiZWVuIHN1Ym1pdHRlZCBmb3IgZXhlY3V0aW9uIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVTdWJtaXQtcFdhaXRTZW1hcGhvcmVzLTAzMjM4KSJ9LAorICAgIHsiVlVJRC12a1F1ZXVlU3VibWl0LXF1ZXVlLXBhcmFtZXRlciIsICJxdWV1ZSBtdXN0IGJlIGEgdmFsaWQgVmtRdWV1ZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtRdWV1ZVN1Ym1pdC1xdWV1ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUXVldWVXYWl0SWRsZS1xdWV1ZS1wYXJhbWV0ZXIiLCAicXVldWUgbXVzdCBiZSBhIHZhbGlkIFZrUXVldWUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUXVldWVXYWl0SWRsZS1xdWV1ZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQtcEFsbG9jYXRvci1wYXJhbWV0ZXIiLCAiSWYgcEFsbG9jYXRvciBpcyBub3QgTlVMTCwgcEFsbG9jYXRvciBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3RlckRldmljZUV2ZW50RVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQtcERldmljZUV2ZW50SW5mby1wYXJhbWV0ZXIiLCAicERldmljZUV2ZW50SW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGV2aWNlRXZlbnRJbmZvRVhUIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1JlZ2lzdGVyRGV2aWNlRXZlbnRFWFQtcERldmljZUV2ZW50SW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVC1wRmVuY2UtcGFyYW1ldGVyIiwgInBGZW5jZSBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIFZrRmVuY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVnaXN0ZXJEZXZpY2VFdmVudEVYVC1wRmVuY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhULWRpc3BsYXktcGFyYW1ldGVyIiwgImRpc3BsYXkgbXVzdCBiZSBhIHZhbGlkIFZrRGlzcGxheUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1kaXNwbGF5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1wQWxsb2NhdG9yLXBhcmFtZXRlciIsICJJZiBwQWxsb2NhdG9yIGlzIG5vdCBOVUxMLCBwQWxsb2NhdG9yIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhULXBBbGxvY2F0b3ItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhULXBEaXNwbGF5RXZlbnRJbmZvLXBhcmFtZXRlciIsICJwRGlzcGxheUV2ZW50SW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGlzcGxheUV2ZW50SW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3RlckRpc3BsYXlFdmVudEVYVC1wRGlzcGxheUV2ZW50SW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVnaXN0ZXJEaXNwbGF5RXZlbnRFWFQtcEZlbmNlLXBhcmFtZXRlciIsICJwRmVuY2UgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBWa0ZlbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1JlZ2lzdGVyRGlzcGxheUV2ZW50RVhULXBGZW5jZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0Q291bnQtYXJyYXlsZW5ndGgiLCAib2JqZWN0Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1JlZ2lzdGVyT2JqZWN0c05WWC1vYmplY3RDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyIiwgIm9iamVjdFRhYmxlIG11c3QgYmUgYSB2YWxpZCBWa09iamVjdFRhYmxlTlZYIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1JlZ2lzdGVyT2JqZWN0c05WWC1vYmplY3RUYWJsZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLW9iamVjdFRhYmxlLXBhcmVudCIsICJvYmplY3RUYWJsZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1JlZ2lzdGVyT2JqZWN0c05WWC1vYmplY3RUYWJsZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RJbmRpY2VzLTAxMzY1IiwgIkF0IGFueSBwT2JqZWN0SW5kaWNlcyB0aGVyZSBtdXN0IG5vdCBiZSBhIHJlZ2lzdGVyZWQgcmVzb3VyY2UgYWxyZWFkeS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEluZGljZXMtMDEzNjUpIn0sCisgICAgeyJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RJbmRpY2VzLTAxMzY2IiwgIkFueSB2YWx1ZSBpbnNpZGUgcE9iamVjdEluZGljZXMgbXVzdCBiZSBiZWxvdyB0aGUgYXBwcm9wcmlhdGUgVmtPYmplY3RUYWJsZUNyZWF0ZUluZm9OVlg6OnBPYmplY3RFbnRyeUNvdW50cyBsaW1pdHMgcHJvdmlkZWQgYXQgb2JqZWN0VGFibGUgY3JlYXRpb24gdGltZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEluZGljZXMtMDEzNjYpIn0sCisgICAgeyJWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RJbmRpY2VzLXBhcmFtZXRlciIsICJwT2JqZWN0SW5kaWNlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBvYmplY3RDb3VudCB1aW50MzJfdCB2YWx1ZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEluZGljZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlZ2lzdGVyT2JqZWN0c05WWC1wT2JqZWN0VGFibGVFbnRyeS0wMTM2NCIsICJUaGUgY29udGVudHMgb2YgcE9iamVjdFRhYmxlRW50cnkgbXVzdCB5aWVsZCBwbGF1c2libGUgYmluZGluZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RUYWJsZUVudHJ5LTAxMzY0KSJ9LAorICAgIHsiVlVJRC12a1JlZ2lzdGVyT2JqZWN0c05WWC1wcE9iamVjdFRhYmxlRW50cmllcy1wYXJhbWV0ZXIiLCAicHBPYmplY3RUYWJsZUVudHJpZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygb2JqZWN0Q291bnQgdmFsaWQgVmtPYmplY3RUYWJsZUVudHJ5TlZYIHN0cnVjdHVyZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWdpc3Rlck9iamVjdHNOVlgtcHBPYmplY3RUYWJsZUVudHJpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlbGVhc2VEaXNwbGF5RVhULWRpc3BsYXktcGFyYW1ldGVyIiwgImRpc3BsYXkgbXVzdCBiZSBhIHZhbGlkIFZrRGlzcGxheUtIUiBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWxlYXNlRGlzcGxheUVYVC1kaXNwbGF5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtSZWxlYXNlRGlzcGxheUVYVC1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCAicGh5c2ljYWxEZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrUGh5c2ljYWxEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVsZWFzZURpc3BsYXlFWFQtcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlbGVhc2VGdWxsU2NyZWVuRXhjbHVzaXZlTW9kZUVYVC1zd2FwY2hhaW4tMDI2NzciLCAic3dhcGNoYWluIG11c3Qgbm90IGJlIGluIHRoZSByZXRpcmVkIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVsZWFzZUZ1bGxTY3JlZW5FeGNsdXNpdmVNb2RlRVhULXN3YXBjaGFpbi0wMjY3NykifSwKKyAgICB7IlZVSUQtdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtc3dhcGNoYWluLTAyNjc4IiwgInN3YXBjaGFpbiBtdXN0IGJlIGEgc3dhcGNoYWluIGNyZWF0ZWQgd2l0aCBhIFZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhUIHN0cnVjdHVyZSwgd2l0aCBmdWxsU2NyZWVuRXhjbHVzaXZlIHNldCB0byBWS19GVUxMX1NDUkVFTl9FWENMVVNJVkVfQVBQTElDQVRJT05fQ09OVFJPTExFRF9FWFQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZWxlYXNlRnVsbFNjcmVlbkV4Y2x1c2l2ZU1vZGVFWFQtc3dhcGNoYWluLTAyNjc4KSJ9LAorICAgIHsiVlVJRC12a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1jb25maWd1cmF0aW9uLTAyNzM3IiwgImNvbmZpZ3VyYXRpb24gbXVzdCBub3QgYmUgcmVsZWFzZWQgYmVmb3JlIGFsbCBjb21tYW5kIGJ1ZmZlcnMgc3VibWl0dGVkIHdoaWxlIHRoZSBjb25maWd1cmF0aW9uIHdhcyBzZXQgYXJlIGluIHBlbmRpbmcgc3RhdGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbmZpZ3VyYXRpb24tMDI3MzcpIn0sCisgICAgeyJWVUlELXZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbmZpZ3VyYXRpb24tcGFyYW1ldGVyIiwgImNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhIHZhbGlkIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbmZpZ3VyYXRpb24tcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1jb25maWd1cmF0aW9uLXBhcmVudCIsICJjb25maWd1cmF0aW9uIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWNvbmZpZ3VyYXRpb24tcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFItZGV2aWNlLTAzMjM1IiwgIlRoZSBwcm9maWxpbmcgbG9jayBvZiBkZXZpY2UgbXVzdCBoYXZlIGJlZW4gaGVsZCB2aWEgYSBwcmV2aW91cyBzdWNjZXNzZnVsIGNhbGwgdG8gdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSLWRldmljZS0wMzIzNSkifSwKKyAgICB7IlZVSUQtdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUi1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtSZXNldENvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA0NSIsICJjb21tYW5kQnVmZmVyIG11c3Qgbm90IGJlIGluIHRoZSBwZW5kaW5nIHN0YXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNDUpIn0sCisgICAgeyJWVUlELXZrUmVzZXRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNDYiLCAiY29tbWFuZEJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSBhIHBvb2wgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIHRoZSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0Q29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDQ2KSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0Q29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJjb21tYW5kQnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0Q29tbWFuZEJ1ZmZlci1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ0JpdHMgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRDb21tYW5kQnVmZmVyLWZsYWdzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtSZXNldENvbW1hbmRQb29sLWNvbW1hbmRQb29sLTAwMDQwIiwgIkFsbCBWa0NvbW1hbmRCdWZmZXIgb2JqZWN0cyBhbGxvY2F0ZWQgZnJvbSBjb21tYW5kUG9vbCBtdXN0IG5vdCBiZSBpbiB0aGUgcGVuZGluZyBzdGF0ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtMDAwNDApIn0sCisgICAgeyJWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1jb21tYW5kUG9vbC1wYXJhbWV0ZXIiLCAiY29tbWFuZFBvb2wgbXVzdCBiZSBhIHZhbGlkIFZrQ29tbWFuZFBvb2wgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1jb21tYW5kUG9vbC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1jb21tYW5kUG9vbC1wYXJlbnQiLCAiY29tbWFuZFBvb2wgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldENvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtSZXNldENvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldENvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVzZXRDb21tYW5kUG9vbC1mbGFncy1wYXJhbWV0ZXIiLCAiZmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdCaXRzIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0Q29tbWFuZFBvb2wtZmxhZ3MtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtMDAzMTMiLCAiQWxsIHVzZXMgb2YgZGVzY3JpcHRvclBvb2wgKHZpYSBhbnkgYWxsb2NhdGVkIGRlc2NyaXB0b3Igc2V0cykgbXVzdCBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldERlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLTAwMzEzKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtcGFyYW1ldGVyIiwgImRlc2NyaXB0b3JQb29sIG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JQb29sIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtcGFyZW50IiwgImRlc2NyaXB0b3JQb29sIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXREZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrUmVzZXREZXNjcmlwdG9yUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXREZXNjcmlwdG9yUG9vbC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0RGVzY3JpcHRvclBvb2wtZmxhZ3MtemVyb2JpdG1hc2siLCAiZmxhZ3MgbXVzdCBiZSAwIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXREZXNjcmlwdG9yUG9vbC1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtdmtSZXNldEV2ZW50LWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldEV2ZW50LWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVzZXRFdmVudC1ldmVudC0wMTE0OCIsICJldmVudCBtdXN0IG5vdCBiZSB3YWl0ZWQgb24gYnkgYSB2a0NtZFdhaXRFdmVudHMgY29tbWFuZCB0aGF0IGlzIGN1cnJlbnRseSBleGVjdXRpbmcgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldEV2ZW50LWV2ZW50LTAxMTQ4KSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyIiwgImV2ZW50IG11c3QgYmUgYSB2YWxpZCBWa0V2ZW50IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0RXZlbnQtZXZlbnQtcGFyZW50IiwgImV2ZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRFdmVudC1ldmVudC1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrUmVzZXRGZW5jZXMtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0RmVuY2VzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrUmVzZXRGZW5jZXMtZmVuY2VDb3VudC1hcnJheWxlbmd0aCIsICJmZW5jZUNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldEZlbmNlcy1mZW5jZUNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0RmVuY2VzLXBGZW5jZXMtMDExMjMiLCAiRWFjaCBlbGVtZW50IG9mIHBGZW5jZXMgbXVzdCBub3QgYmUgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBhbnkgcXVldWUgY29tbWFuZCB0aGF0IGhhcyBub3QgeWV0IGNvbXBsZXRlZCBleGVjdXRpb24gb24gdGhhdCBxdWV1ZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0RmVuY2VzLXBGZW5jZXMtMDExMjMpIn0sCisgICAgeyJWVUlELXZrUmVzZXRGZW5jZXMtcEZlbmNlcy1wYXJhbWV0ZXIiLCAicEZlbmNlcyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBmZW5jZUNvdW50IHZhbGlkIFZrRmVuY2UgaGFuZGxlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0RmVuY2VzLXBGZW5jZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0RmVuY2VzLXBGZW5jZXMtcGFyZW50IiwgIkVhY2ggZWxlbWVudCBvZiBwRmVuY2VzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFsbG9jYXRlZCwgb3IgcmV0cmlldmVkIGZyb20gZGV2aWNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRGZW5jZXMtcEZlbmNlcy1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtTm9uZS0wMjY2NSIsICJUaGUgaG9zdFF1ZXJ5UmVzZXQgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1Ob25lLTAyNjY1KSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULWZpcnN0UXVlcnktMDI2NjYiLCAiZmlyc3RRdWVyeSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gcXVlcnlQb29sIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtZmlyc3RRdWVyeS0wMjY2NikifSwKKyAgICB7IlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1maXJzdFF1ZXJ5LTAyNjY3IiwgIlRoZSBzdW0gb2YgZmlyc3RRdWVyeSBhbmQgcXVlcnlDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgaW4gcXVlcnlQb29sIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtZmlyc3RRdWVyeS0wMjY2NykifSwKKyAgICB7IlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1maXJzdFF1ZXJ5LTAyNzQxIiwgIlN1Ym1pdHRlZCBjb21tYW5kcyB0aGF0IHJlZmVyIHRvIHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgZmlyc3RRdWVyeSBhbmQgcXVlcnlDb3VudCBpbiBxdWVyeVBvb2wgbXVzdCBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1maXJzdFF1ZXJ5LTAyNzQxKSJ9LAorICAgIHsiVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULWZpcnN0UXVlcnktMDI3NDIiLCAiVGhlIHJhbmdlIG9mIHF1ZXJpZXMgc3BlY2lmaWVkIGJ5IGZpcnN0UXVlcnkgYW5kIHF1ZXJ5Q291bnQgaW4gcXVlcnlQb29sIG11c3Qgbm90IGJlIGluIHVzZSBieSBjYWxscyB0byB2a0dldFF1ZXJ5UG9vbFJlc3VsdHMgb3IgdmtSZXNldFF1ZXJ5UG9vbEVYVCBpbiBvdGhlciB0aHJlYWRzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtZmlyc3RRdWVyeS0wMjc0MikifSwKKyAgICB7IlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1xdWVyeVBvb2wtcGFyYW1ldGVyIiwgInF1ZXJ5UG9vbCBtdXN0IGJlIGEgdmFsaWQgVmtRdWVyeVBvb2wgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtcXVlcnlQb29sLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1xdWVyeVBvb2wtcGFyZW50IiwgInF1ZXJ5UG9vbCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULXF1ZXJ5UG9vbC1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhULWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQtcE5hbWVJbmZvLTAyNTg3IiwgInBOYW1lSW5mby0+b2JqZWN0VHlwZSBtdXN0IG5vdCBiZSBWS19PQkpFQ1RfVFlQRV9VTktOT1dOIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQtcE5hbWVJbmZvLTAyNTg3KSJ9LAorICAgIHsiVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhULXBOYW1lSW5mby0wMjU4OCIsICJwTmFtZUluZm8tPm9iamVjdEhhbmRsZSBtdXN0IG5vdCBiZSBWS19OVUxMX0hBTkRMRSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhULXBOYW1lSW5mby0wMjU4OCkifSwKKyAgICB7IlZVSUQtdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVC1wTmFtZUluZm8tcGFyYW1ldGVyIiwgInBOYW1lSW5mbyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhIHZhbGlkIFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhULXBOYW1lSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQtcFRhZ0luZm8tcGFyYW1ldGVyIiwgInBUYWdJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhULXBUYWdJbmZvLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtTZXRFdmVudC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU2V0RXZlbnQtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtTZXRFdmVudC1ldmVudC1wYXJhbWV0ZXIiLCAiZXZlbnQgbXVzdCBiZSBhIHZhbGlkIFZrRXZlbnQgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU2V0RXZlbnQtZXZlbnQtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1NldEV2ZW50LWV2ZW50LXBhcmVudCIsICJldmVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1NldEV2ZW50LWV2ZW50LXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtTZXRIZHJNZXRhZGF0YUVYVC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBkZXZpY2UsIGFuZCB0aGUgZWxlbWVudHMgb2YgcFN3YXBjaGFpbnMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0luc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU2V0SGRyTWV0YWRhdGFFWFQtY29tbW9ucGFyZW50KSJ9LAorICAgIHsiVlVJRC12a1NldEhkck1ldGFkYXRhRVhULWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtTZXRIZHJNZXRhZGF0YUVYVC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1NldEhkck1ldGFkYXRhRVhULXBNZXRhZGF0YS1wYXJhbWV0ZXIiLCAicE1ldGFkYXRhIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN3YXBjaGFpbkNvdW50IHZhbGlkIFZrSGRyTWV0YWRhdGFFWFQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1NldEhkck1ldGFkYXRhRVhULXBNZXRhZGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrU2V0SGRyTWV0YWRhdGFFWFQtcFN3YXBjaGFpbnMtcGFyYW1ldGVyIiwgInBTd2FwY2hhaW5zIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN3YXBjaGFpbkNvdW50IHZhbGlkIFZrU3dhcGNoYWluS0hSIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtTZXRIZHJNZXRhZGF0YUVYVC1wU3dhcGNoYWlucy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrU2V0SGRyTWV0YWRhdGFFWFQtc3dhcGNoYWluQ291bnQtYXJyYXlsZW5ndGgiLCAic3dhcGNoYWluQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1NldEhkck1ldGFkYXRhRVhULXN3YXBjaGFpbkNvdW50LWFycmF5bGVuZ3RoKSJ9LAorICAgIHsiVlVJRC12a1NldExvY2FsRGltbWluZ0FNRC1YWFhYWCIsICJJdCBpcyBvbmx5IHZhbGlkIHRvIGNhbGwgdmtTZXRMb2NhbERpbW1pbmdBTUQgaWYgVmtEaXNwbGF5TmF0aXZlSGRyU3VyZmFjZUNhcGFiaWxpdGllc0FNRDo6bG9jYWxEaW1taW5nU3VwcG9ydCBpcyBzdXBwb3J0ZWQuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU2V0TG9jYWxEaW1taW5nQU1ELVhYWFhYKSJ9LAorICAgIHsiVlVJRC12a1NldExvY2FsRGltbWluZ0FNRC1jb21tb25wYXJlbnQiLCAiQm90aCBvZiBkZXZpY2UsIGFuZCBzd2FwQ2hhaW4gbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc2FtZSBWa0luc3RhbmNlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU2V0TG9jYWxEaW1taW5nQU1ELWNvbW1vbnBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtTZXRMb2NhbERpbW1pbmdBTUQtZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1NldExvY2FsRGltbWluZ0FNRC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1NldExvY2FsRGltbWluZ0FNRC1zd2FwQ2hhaW4tcGFyYW1ldGVyIiwgInN3YXBDaGFpbiBtdXN0IGJlIGEgdmFsaWQgVmtTd2FwY2hhaW5LSFIgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU2V0TG9jYWxEaW1taW5nQU1ELXN3YXBDaGFpbi1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrU2lnbmFsU2VtYXBob3JlS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtTaWduYWxTZW1hcGhvcmVLSFItZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtTaWduYWxTZW1hcGhvcmVLSFItcFNpZ25hbEluZm8tcGFyYW1ldGVyIiwgInBTaWduYWxJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTZW1hcGhvcmVTaWduYWxJbmZvS0hSIHN0cnVjdHVyZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1NpZ25hbFNlbWFwaG9yZUtIUi1wU2lnbmFsSW5mby1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtaW5zdGFuY2UtcGFyYW1ldGVyIiwgImluc3RhbmNlIG11c3QgYmUgYSB2YWxpZCBWa0luc3RhbmNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhULWluc3RhbmNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVC1tZXNzYWdlU2V2ZXJpdHktcGFyYW1ldGVyIiwgIm1lc3NhZ2VTZXZlcml0eSBtdXN0IGJlIGEgdmFsaWQgVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgdmFsdWUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVC1tZXNzYWdlU2V2ZXJpdHktcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhULW1lc3NhZ2VUeXBlcy1wYXJhbWV0ZXIiLCAibWVzc2FnZVR5cGVzIG11c3QgYmUgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdCaXRzRVhUIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhULW1lc3NhZ2VUeXBlcy1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtbWVzc2FnZVR5cGVzLXJlcXVpcmVkYml0bWFzayIsICJtZXNzYWdlVHlwZXMgbXVzdCBub3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhULW1lc3NhZ2VUeXBlcy1yZXF1aXJlZGJpdG1hc2spIn0sCisgICAgeyJWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtb2JqZWN0VHlwZS0wMjU5MSIsICJUaGUgb2JqZWN0VHlwZSBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBDYWxsYmFja0RhdGEtPnBPYmplY3RzIG11c3Qgbm90IGJlIFZLX09CSkVDVF9UWVBFX1VOS05PV04gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtTdWJtaXREZWJ1Z1V0aWxzTWVzc2FnZUVYVC1vYmplY3RUeXBlLTAyNTkxKSJ9LAorICAgIHsiVlVJRC12a1N1Ym1pdERlYnVnVXRpbHNNZXNzYWdlRVhULXBDYWxsYmFja0RhdGEtcGFyYW1ldGVyIiwgInBDYWxsYmFja0RhdGEgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSB2YWxpZCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgc3RydWN0dXJlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrU3VibWl0RGVidWdVdGlsc01lc3NhZ2VFWFQtcENhbGxiYWNrRGF0YS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrVHJpbUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmFtZXRlciIsICJjb21tYW5kUG9vbCBtdXN0IGJlIGEgdmFsaWQgVmtDb21tYW5kUG9vbCBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtUcmltQ29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1RyaW1Db21tYW5kUG9vbC1jb21tYW5kUG9vbC1wYXJlbnQiLCAiY29tbWFuZFBvb2wgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtUcmltQ29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a1RyaW1Db21tYW5kUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVHJpbUNvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrVHJpbUNvbW1hbmRQb29sLWZsYWdzLXplcm9iaXRtYXNrIiwgImZsYWdzIG11c3QgYmUgMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1RyaW1Db21tYW5kUG9vbC1mbGFncy16ZXJvYml0bWFzaykifSwKKyAgICB7IlZVSUQtdmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtVbmluaXRpYWxpemVQZXJmb3JtYW5jZUFwaUlOVEVMLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrVW5tYXBNZW1vcnktZGV2aWNlLXBhcmFtZXRlciIsICJkZXZpY2UgbXVzdCBiZSBhIHZhbGlkIFZrRGV2aWNlIGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1VubWFwTWVtb3J5LWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrVW5tYXBNZW1vcnktbWVtb3J5LTAwNjg5IiwgIm1lbW9yeSBtdXN0IGJlIGN1cnJlbnRseSBob3N0IG1hcHBlZCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1VubWFwTWVtb3J5LW1lbW9yeS0wMDY4OSkifSwKKyAgICB7IlZVSUQtdmtVbm1hcE1lbW9yeS1tZW1vcnktcGFyYW1ldGVyIiwgIm1lbW9yeSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2VNZW1vcnkgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVW5tYXBNZW1vcnktbWVtb3J5LXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtVbm1hcE1lbW9yeS1tZW1vcnktcGFyZW50IiwgIm1lbW9yeSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1VubWFwTWVtb3J5LW1lbW9yeS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtTm9uZS0wMTM3NSIsICJBbGwgb3BlcmF0aW9ucyBvbiB0aGUgZGV2aWNlIHVzaW5nIHRoZSByZWdpc3RlcmVkIHJlc291cmNlIG11c3QgaGF2ZSBiZWVuIGNvbXBsZXRlZC4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1Ob25lLTAxMzc1KSJ9LAorICAgIHsiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLW9iamVjdENvdW50LWFycmF5bGVuZ3RoIiwgIm9iamVjdENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1vYmplY3RDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1vYmplY3RUYWJsZS1wYXJhbWV0ZXIiLCAib2JqZWN0VGFibGUgbXVzdCBiZSBhIHZhbGlkIFZrT2JqZWN0VGFibGVOVlggaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtb2JqZWN0VGFibGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLW9iamVjdFRhYmxlLXBhcmVudCIsICJvYmplY3RUYWJsZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBhbGxvY2F0ZWQsIG9yIHJldHJpZXZlZCBmcm9tIGRldmljZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLW9iamVjdFRhYmxlLXBhcmVudCkifSwKKyAgICB7IlZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1wT2JqZWN0RW50cnlUeXBlcy0wMTM3NCIsICJUaGUgcE9iamVjdEVudHJ5VHlwZXMgb2YgdGhlIHJlc291cmNlIGF0IHBPYmplY3RJbmRpY2VzIG11c3QgbWF0Y2guIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEVudHJ5VHlwZXMtMDEzNzQpIn0sCisgICAgeyJWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEVudHJ5VHlwZXMtcGFyYW1ldGVyIiwgInBPYmplY3RFbnRyeVR5cGVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIG9iamVjdENvdW50IHZhbGlkIFZrT2JqZWN0RW50cnlUeXBlTlZYIHZhbHVlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1VucmVnaXN0ZXJPYmplY3RzTlZYLXBPYmplY3RFbnRyeVR5cGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1wT2JqZWN0SW5kaWNlcy0wMTM3MyIsICJBdCBhbnkgcE9iamVjdEluZGljZXMgdGhlcmUgbXVzdCBiZSBhIHJlZ2lzdGVyZWQgcmVzb3VyY2UgYWxyZWFkeS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1wT2JqZWN0SW5kaWNlcy0wMTM3MykifSwKKyAgICB7IlZVSUQtdmtVbnJlZ2lzdGVyT2JqZWN0c05WWC1wT2JqZWN0SW5kaWNlcy1wYXJhbWV0ZXIiLCAicE9iamVjdEluZGljZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygb2JqZWN0Q291bnQgdWludDMyX3QgdmFsdWVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVW5yZWdpc3Rlck9iamVjdHNOVlgtcE9iamVjdEluZGljZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtZGVzY3JpcHRvclNldC1wYXJhbWV0ZXIiLCAiZGVzY3JpcHRvclNldCBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yU2V0IGhhbmRsZSAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtZGVzY3JpcHRvclNldC1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyIiwgImRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBhcmVudCIsICJkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJlbnQpIn0sCisgICAgeyJWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtcERhdGEtMDE2ODUiLCAicERhdGEgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBtZW1vcnkgY29udGFpbmluZyBvbmUgb3IgbW9yZSB2YWxpZCBpbnN0YW5jZXMgb2YgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLCBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvLCBvciBWa0J1ZmZlclZpZXcgaW4gYSBsYXlvdXQgZGVmaW5lZCBieSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgd2hlbiBpdCB3YXMgY3JlYXRlZCB3aXRoIHZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1wRGF0YS0wMTY4NSkifSwKKyAgICB7IlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1Ob25lLTAzMDQ3IiwgIkRlc2NyaXB0b3IgYmluZGluZ3MgdXBkYXRlZCBieSB0aGlzIGNvbW1hbmQgd2hpY2ggd2VyZSBjcmVhdGVkIHdpdGhvdXQgdGhlIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUIG9yIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfVU5VU0VEX1dISUxFX1BFTkRJTkdfQklUX0VYVCBiaXRzIHNldCBtdXN0IG5vdCBiZSB1c2VkIGJ5IGFueSBjb21tYW5kIHRoYXQgd2FzIHJlY29yZGVkIHRvIGEgY29tbWFuZCBidWZmZXIgd2hpY2ggaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldHMtTm9uZS0wMzA0NykifSwKKyAgICB7IlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1kZXZpY2UtcGFyYW1ldGVyIiwgImRldmljZSBtdXN0IGJlIGEgdmFsaWQgVmtEZXZpY2UgaGFuZGxlIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldHMtZGV2aWNlLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1kc3RTZXQtMDAzMTQiLCAiVGhlIGRzdFNldCBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIHBEZXNjcmlwdG9yV3JpdGVzIG9yIHBEZXNjcmlwdG9yQ29waWVzIG11c3Qgbm90IGJlIHVzZWQgYnkgYW55IGNvbW1hbmQgdGhhdCB3YXMgcmVjb3JkZWQgdG8gYSBjb21tYW5kIGJ1ZmZlciB3aGljaCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0cy1kc3RTZXQtMDAzMTQpIn0sCisgICAgeyJWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JDb3BpZXMtcGFyYW1ldGVyIiwgIklmIGRlc2NyaXB0b3JDb3B5Q291bnQgaXMgbm90IDAsIHBEZXNjcmlwdG9yQ29waWVzIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JDb3B5Q291bnQgdmFsaWQgVmtDb3B5RGVzY3JpcHRvclNldCBzdHJ1Y3R1cmVzIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS92dWxrYW4vc3BlY3MvMS4xLWV4dGVuc2lvbnMvaHRtbC92a3NwZWMuaHRtbCNWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JDb3BpZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yV3JpdGVzLXBhcmFtZXRlciIsICJJZiBkZXNjcmlwdG9yV3JpdGVDb3VudCBpcyBub3QgMCwgcERlc2NyaXB0b3JXcml0ZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVzY3JpcHRvcldyaXRlQ291bnQgdmFsaWQgVmtXcml0ZURlc2NyaXB0b3JTZXQgc3RydWN0dXJlcyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yV3JpdGVzLXBhcmFtZXRlcikifSwKKyAgICB7IlZVSUQtdmtXYWl0Rm9yRmVuY2VzLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtXYWl0Rm9yRmVuY2VzLWRldmljZS1wYXJhbWV0ZXIpIn0sCisgICAgeyJWVUlELXZrV2FpdEZvckZlbmNlcy1mZW5jZUNvdW50LWFycmF5bGVuZ3RoIiwgImZlbmNlQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdnVsa2FuL3NwZWNzLzEuMS1leHRlbnNpb25zL2h0bWwvdmtzcGVjLmh0bWwjVlVJRC12a1dhaXRGb3JGZW5jZXMtZmVuY2VDb3VudC1hcnJheWxlbmd0aCkifSwKKyAgICB7IlZVSUQtdmtXYWl0Rm9yRmVuY2VzLXBGZW5jZXMtcGFyYW1ldGVyIiwgInBGZW5jZXMgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZmVuY2VDb3VudCB2YWxpZCBWa0ZlbmNlIGhhbmRsZXMgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtXYWl0Rm9yRmVuY2VzLXBGZW5jZXMtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1dhaXRGb3JGZW5jZXMtcEZlbmNlcy1wYXJlbnQiLCAiRWFjaCBlbGVtZW50IG9mIHBGZW5jZXMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYWxsb2NhdGVkLCBvciByZXRyaWV2ZWQgZnJvbSBkZXZpY2UgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtXYWl0Rm9yRmVuY2VzLXBGZW5jZXMtcGFyZW50KSJ9LAorICAgIHsiVlVJRC12a1dhaXRTZW1hcGhvcmVzS0hSLWRldmljZS1wYXJhbWV0ZXIiLCAiZGV2aWNlIG11c3QgYmUgYSB2YWxpZCBWa0RldmljZSBoYW5kbGUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtXYWl0U2VtYXBob3Jlc0tIUi1kZXZpY2UtcGFyYW1ldGVyKSJ9LAorICAgIHsiVlVJRC12a1dhaXRTZW1hcGhvcmVzS0hSLXBXYWl0SW5mby1wYXJhbWV0ZXIiLCAicFdhaXRJbmZvIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgdmFsaWQgVmtTZW1hcGhvcmVXYWl0SW5mb0tIUiBzdHJ1Y3R1cmUgKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZVSUQtdmtXYWl0U2VtYXBob3Jlc0tIUi1wV2FpdEluZm8tcGFyYW1ldGVyKSJ9LAorfTsKKworLy8gRGVmaW5lcyB0byBhbGxvdyBjcmVhdGluZyAibXVzdCBiZSByZWNvcmRpbmciIG1ldGEgZGF0YQorI2RlZmluZSBWVUlEX0NNRF9FTlVNX0xJU1QocHJlZml4KVwKKyAgICBwcmVmaXgjI05PTkUgPSAwLFwKKyAgICBwcmVmaXgjI0JFR0lOQ09ORElUSU9OQUxSRU5ERVJJTkdFWFQgPSAxLFwKKyAgICBwcmVmaXgjI0JFR0lOREVCVUdVVElMU0xBQkVMRVhUID0gMixcCisgICAgcHJlZml4IyNCRUdJTlFVRVJZID0gMyxcCisgICAgcHJlZml4IyNCRUdJTlFVRVJZSU5ERVhFREVYVCA9IDQsXAorICAgIHByZWZpeCMjQkVHSU5SRU5ERVJQQVNTID0gNSxcCisgICAgcHJlZml4IyNCRUdJTlJFTkRFUlBBU1MyS0hSID0gNixcCisgICAgcHJlZml4IyNCRUdJTlRSQU5TRk9STUZFRURCQUNLRVhUID0gNyxcCisgICAgcHJlZml4IyNCSU5EREVTQ1JJUFRPUlNFVFMgPSA4LFwKKyAgICBwcmVmaXgjI0JJTkRJTkRFWEJVRkZFUiA9IDksXAorICAgIHByZWZpeCMjQklORFBJUEVMSU5FID0gMTAsXAorICAgIHByZWZpeCMjQklORFNIQURJTkdSQVRFSU1BR0VOViA9IDExLFwKKyAgICBwcmVmaXgjI0JJTkRUUkFOU0ZPUk1GRUVEQkFDS0JVRkZFUlNFWFQgPSAxMixcCisgICAgcHJlZml4IyNCSU5EVkVSVEVYQlVGRkVSUyA9IDEzLFwKKyAgICBwcmVmaXgjI0JMSVRJTUFHRSA9IDE0LFwKKyAgICBwcmVmaXgjI0JVSUxEQUNDRUxFUkFUSU9OU1RSVUNUVVJFTlYgPSAxNSxcCisgICAgcHJlZml4IyNDTEVBUkFUVEFDSE1FTlRTID0gMTYsXAorICAgIHByZWZpeCMjQ0xFQVJDT0xPUklNQUdFID0gMTcsXAorICAgIHByZWZpeCMjQ0xFQVJERVBUSFNURU5DSUxJTUFHRSA9IDE4LFwKKyAgICBwcmVmaXgjI0NPUFlBQ0NFTEVSQVRJT05TVFJVQ1RVUkVOViA9IDE5LFwKKyAgICBwcmVmaXgjI0NPUFlCVUZGRVIgPSAyMCxcCisgICAgcHJlZml4IyNDT1BZQlVGRkVSVE9JTUFHRSA9IDIxLFwKKyAgICBwcmVmaXgjI0NPUFlJTUFHRSA9IDIyLFwKKyAgICBwcmVmaXgjI0NPUFlJTUFHRVRPQlVGRkVSID0gMjMsXAorICAgIHByZWZpeCMjQ09QWVFVRVJZUE9PTFJFU1VMVFMgPSAyNCxcCisgICAgcHJlZml4IyNERUJVR01BUktFUkJFR0lORVhUID0gMjUsXAorICAgIHByZWZpeCMjREVCVUdNQVJLRVJFTkRFWFQgPSAyNixcCisgICAgcHJlZml4IyNERUJVR01BUktFUklOU0VSVEVYVCA9IDI3LFwKKyAgICBwcmVmaXgjI0RJU1BBVENIID0gMjgsXAorICAgIHByZWZpeCMjRElTUEFUQ0hCQVNFID0gMjksXAorICAgIHByZWZpeCMjRElTUEFUQ0hJTkRJUkVDVCA9IDMwLFwKKyAgICBwcmVmaXgjI0RSQVcgPSAzMSxcCisgICAgcHJlZml4IyNEUkFXSU5ERVhFRCA9IDMyLFwKKyAgICBwcmVmaXgjI0RSQVdJTkRFWEVESU5ESVJFQ1QgPSAzMyxcCisgICAgcHJlZml4IyNEUkFXSU5ERVhFRElORElSRUNUQ09VTlRLSFIgPSAzNCxcCisgICAgcHJlZml4IyNEUkFXSU5ESVJFQ1QgPSAzNSxcCisgICAgcHJlZml4IyNEUkFXSU5ESVJFQ1RCWVRFQ09VTlRFWFQgPSAzNixcCisgICAgcHJlZml4IyNEUkFXSU5ESVJFQ1RDT1VOVEtIUiA9IDM3LFwKKyAgICBwcmVmaXgjI0RSQVdNRVNIVEFTS1NJTkRJUkVDVENPVU5UTlYgPSAzOCxcCisgICAgcHJlZml4IyNEUkFXTUVTSFRBU0tTSU5ESVJFQ1ROViA9IDM5LFwKKyAgICBwcmVmaXgjI0RSQVdNRVNIVEFTS1NOViA9IDQwLFwKKyAgICBwcmVmaXgjI0VORENPTkRJVElPTkFMUkVOREVSSU5HRVhUID0gNDEsXAorICAgIHByZWZpeCMjRU5EREVCVUdVVElMU0xBQkVMRVhUID0gNDIsXAorICAgIHByZWZpeCMjRU5EUVVFUlkgPSA0MyxcCisgICAgcHJlZml4IyNFTkRRVUVSWUlOREVYRURFWFQgPSA0NCxcCisgICAgcHJlZml4IyNFTkRSRU5ERVJQQVNTID0gNDUsXAorICAgIHByZWZpeCMjRU5EUkVOREVSUEFTUzJLSFIgPSA0NixcCisgICAgcHJlZml4IyNFTkRUUkFOU0ZPUk1GRUVEQkFDS0VYVCA9IDQ3LFwKKyAgICBwcmVmaXgjI0VYRUNVVEVDT01NQU5EUyA9IDQ4LFwKKyAgICBwcmVmaXgjI0ZJTExCVUZGRVIgPSA0OSxcCisgICAgcHJlZml4IyNJTlNFUlRERUJVR1VUSUxTTEFCRUxFWFQgPSA1MCxcCisgICAgcHJlZml4IyNORVhUU1VCUEFTUyA9IDUxLFwKKyAgICBwcmVmaXgjI05FWFRTVUJQQVNTMktIUiA9IDUyLFwKKyAgICBwcmVmaXgjI1BJUEVMSU5FQkFSUklFUiA9IDUzLFwKKyAgICBwcmVmaXgjI1BST0NFU1NDT01NQU5EU05WWCA9IDU0LFwKKyAgICBwcmVmaXgjI1BVU0hDT05TVEFOVFMgPSA1NSxcCisgICAgcHJlZml4IyNQVVNIREVTQ1JJUFRPUlNFVEtIUiA9IDU2LFwKKyAgICBwcmVmaXgjI1BVU0hERVNDUklQVE9SU0VUV0lUSFRFTVBMQVRFS0hSID0gNTcsXAorICAgIHByZWZpeCMjUkVTRVJWRVNQQUNFRk9SQ09NTUFORFNOVlggPSA1OCxcCisgICAgcHJlZml4IyNSRVNFVEVWRU5UID0gNTksXAorICAgIHByZWZpeCMjUkVTRVRRVUVSWVBPT0wgPSA2MCxcCisgICAgcHJlZml4IyNSRVNPTFZFSU1BR0UgPSA2MSxcCisgICAgcHJlZml4IyNTRVRCTEVORENPTlNUQU5UUyA9IDYyLFwKKyAgICBwcmVmaXgjI1NFVENIRUNLUE9JTlROViA9IDYzLFwKKyAgICBwcmVmaXgjI1NFVENPQVJTRVNBTVBMRU9SREVSTlYgPSA2NCxcCisgICAgcHJlZml4IyNTRVRERVBUSEJJQVMgPSA2NSxcCisgICAgcHJlZml4IyNTRVRERVBUSEJPVU5EUyA9IDY2LFwKKyAgICBwcmVmaXgjI1NFVERFVklDRU1BU0sgPSA2NyxcCisgICAgcHJlZml4IyNTRVRESVNDQVJEUkVDVEFOR0xFRVhUID0gNjgsXAorICAgIHByZWZpeCMjU0VURVZFTlQgPSA2OSxcCisgICAgcHJlZml4IyNTRVRFWENMVVNJVkVTQ0lTU09STlYgPSA3MCxcCisgICAgcHJlZml4IyNTRVRMSU5FU1RJUFBMRUVYVCA9IDcxLFwKKyAgICBwcmVmaXgjI1NFVExJTkVXSURUSCA9IDcyLFwKKyAgICBwcmVmaXgjI1NFVFBFUkZPUk1BTkNFTUFSS0VSSU5URUwgPSA3MyxcCisgICAgcHJlZml4IyNTRVRQRVJGT1JNQU5DRU9WRVJSSURFSU5URUwgPSA3NCxcCisgICAgcHJlZml4IyNTRVRQRVJGT1JNQU5DRVNUUkVBTU1BUktFUklOVEVMID0gNzUsXAorICAgIHByZWZpeCMjU0VUU0FNUExFTE9DQVRJT05TRVhUID0gNzYsXAorICAgIHByZWZpeCMjU0VUU0NJU1NPUiA9IDc3LFwKKyAgICBwcmVmaXgjI1NFVFNURU5DSUxDT01QQVJFTUFTSyA9IDc4LFwKKyAgICBwcmVmaXgjI1NFVFNURU5DSUxSRUZFUkVOQ0UgPSA3OSxcCisgICAgcHJlZml4IyNTRVRTVEVOQ0lMV1JJVEVNQVNLID0gODAsXAorICAgIHByZWZpeCMjU0VUVklFV1BPUlQgPSA4MSxcCisgICAgcHJlZml4IyNTRVRWSUVXUE9SVFNIQURJTkdSQVRFUEFMRVRURU5WID0gODIsXAorICAgIHByZWZpeCMjU0VUVklFV1BPUlRXU0NBTElOR05WID0gODMsXAorICAgIHByZWZpeCMjVFJBQ0VSQVlTTlYgPSA4NCxcCisgICAgcHJlZml4IyNVUERBVEVCVUZGRVIgPSA4NSxcCisgICAgcHJlZml4IyNXQUlURVZFTlRTID0gODYsXAorICAgIHByZWZpeCMjV1JJVEVBQ0NFTEVSQVRJT05TVFJVQ1RVUkVTUFJPUEVSVElFU05WID0gODcsXAorICAgIHByZWZpeCMjV1JJVEVCVUZGRVJNQVJLRVJBTUQgPSA4OCxcCisgICAgcHJlZml4IyNXUklURVRJTUVTVEFNUCA9IDg5LFwKKyAgICBwcmVmaXgjI0VORENPTU1BTkRCVUZGRVIgPSA5MCxcCisgICAgcHJlZml4IyNSQU5HRV9TSVpFID0gOTEKKworI2RlZmluZSBWVUlEX0NNRF9OQU1FX0xJU1RcCisgICAgIkNvbW1hbmRfVW5kZWZpbmVkIixcCisgICAgInZrQ21kQmVnaW5Db25kaXRpb25hbFJlbmRlcmluZ0VYVCIsXAorICAgICJ2a0NtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUIixcCisgICAgInZrQ21kQmVnaW5RdWVyeSIsXAorICAgICJ2a0NtZEJlZ2luUXVlcnlJbmRleGVkRVhUIixcCisgICAgInZrQ21kQmVnaW5SZW5kZXJQYXNzIixcCisgICAgInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIsXAorICAgICJ2a0NtZEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQiLFwKKyAgICAidmtDbWRCaW5kRGVzY3JpcHRvclNldHMiLFwKKyAgICAidmtDbWRCaW5kSW5kZXhCdWZmZXIiLFwKKyAgICAidmtDbWRCaW5kUGlwZWxpbmUiLFwKKyAgICAidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIixcCisgICAgInZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVCIsXAorICAgICJ2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzIixcCisgICAgInZrQ21kQmxpdEltYWdlIixcCisgICAgInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIsXAorICAgICJ2a0NtZENsZWFyQXR0YWNobWVudHMiLFwKKyAgICAidmtDbWRDbGVhckNvbG9ySW1hZ2UiLFwKKyAgICAidmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlIixcCisgICAgInZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIixcCisgICAgInZrQ21kQ29weUJ1ZmZlciIsXAorICAgICJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlIixcCisgICAgInZrQ21kQ29weUltYWdlIixcCisgICAgInZrQ21kQ29weUltYWdlVG9CdWZmZXIiLFwKKyAgICAidmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIsXAorICAgICJ2a0NtZERlYnVnTWFya2VyQmVnaW5FWFQiLFwKKyAgICAidmtDbWREZWJ1Z01hcmtlckVuZEVYVCIsXAorICAgICJ2a0NtZERlYnVnTWFya2VySW5zZXJ0RVhUIixcCisgICAgInZrQ21kRGlzcGF0Y2giLFwKKyAgICAidmtDbWREaXNwYXRjaEJhc2UiLFwKKyAgICAidmtDbWREaXNwYXRjaEluZGlyZWN0IixcCisgICAgInZrQ21kRHJhdyIsXAorICAgICJ2a0NtZERyYXdJbmRleGVkIixcCisgICAgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCIsXAorICAgICJ2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUiIsXAorICAgICJ2a0NtZERyYXdJbmRpcmVjdCIsXAorICAgICJ2a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVCIsXAorICAgICJ2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSIixcCisgICAgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROViIsXAorICAgICJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WIixcCisgICAgInZrQ21kRHJhd01lc2hUYXNrc05WIixcCisgICAgInZrQ21kRW5kQ29uZGl0aW9uYWxSZW5kZXJpbmdFWFQiLFwKKyAgICAidmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQiLFwKKyAgICAidmtDbWRFbmRRdWVyeSIsXAorICAgICJ2a0NtZEVuZFF1ZXJ5SW5kZXhlZEVYVCIsXAorICAgICJ2a0NtZEVuZFJlbmRlclBhc3MiLFwKKyAgICAidmtDbWRFbmRSZW5kZXJQYXNzMktIUiIsXAorICAgICJ2a0NtZEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUIixcCisgICAgInZrQ21kRXhlY3V0ZUNvbW1hbmRzIixcCisgICAgInZrQ21kRmlsbEJ1ZmZlciIsXAorICAgICJ2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIsXAorICAgICJ2a0NtZE5leHRTdWJwYXNzIixcCisgICAgInZrQ21kTmV4dFN1YnBhc3MyS0hSIixcCisgICAgInZrQ21kUGlwZWxpbmVCYXJyaWVyIixcCisgICAgInZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYIixcCisgICAgInZrQ21kUHVzaENvbnN0YW50cyIsXAorICAgICJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIixcCisgICAgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiLFwKKyAgICAidmtDbWRSZXNlcnZlU3BhY2VGb3JDb21tYW5kc05WWCIsXAorICAgICJ2a0NtZFJlc2V0RXZlbnQiLFwKKyAgICAidmtDbWRSZXNldFF1ZXJ5UG9vbCIsXAorICAgICJ2a0NtZFJlc29sdmVJbWFnZSIsXAorICAgICJ2a0NtZFNldEJsZW5kQ29uc3RhbnRzIixcCisgICAgInZrQ21kU2V0Q2hlY2twb2ludE5WIixcCisgICAgInZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViIsXAorICAgICJ2a0NtZFNldERlcHRoQmlhcyIsXAorICAgICJ2a0NtZFNldERlcHRoQm91bmRzIixcCisgICAgInZrQ21kU2V0RGV2aWNlTWFzayIsXAorICAgICJ2a0NtZFNldERpc2NhcmRSZWN0YW5nbGVFWFQiLFwKKyAgICAidmtDbWRTZXRFdmVudCIsXAorICAgICJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOViIsXAorICAgICJ2a0NtZFNldExpbmVTdGlwcGxlRVhUIixcCisgICAgInZrQ21kU2V0TGluZVdpZHRoIixcCisgICAgInZrQ21kU2V0UGVyZm9ybWFuY2VNYXJrZXJJTlRFTCIsXAorICAgICJ2a0NtZFNldFBlcmZvcm1hbmNlT3ZlcnJpZGVJTlRFTCIsXAorICAgICJ2a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwiLFwKKyAgICAidmtDbWRTZXRTYW1wbGVMb2NhdGlvbnNFWFQiLFwKKyAgICAidmtDbWRTZXRTY2lzc29yIixcCisgICAgInZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrIixcCisgICAgInZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZSIsXAorICAgICJ2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2siLFwKKyAgICAidmtDbWRTZXRWaWV3cG9ydCIsXAorICAgICJ2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYiLFwKKyAgICAidmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYiLFwKKyAgICAidmtDbWRUcmFjZVJheXNOViIsXAorICAgICJ2a0NtZFVwZGF0ZUJ1ZmZlciIsXAorICAgICJ2a0NtZFdhaXRFdmVudHMiLFwKKyAgICAidmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYiLFwKKyAgICAidmtDbWRXcml0ZUJ1ZmZlck1hcmtlckFNRCIsXAorICAgICJ2a0NtZFdyaXRlVGltZXN0YW1wIixcCisgICAgInZrRW5kQ29tbWFuZEJ1ZmZlciIKKworI2RlZmluZSBWVUlEX01VU1RfQkVfUkVDT1JESU5HX0xJU1RcCisgICAgIlZVSURfVW5kZWZpbmVkIixcCisgICAgIlZVSUQtdmtDbWRCZWdpbkNvbmRpdGlvbmFsUmVuZGVyaW5nRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRCZWdpbkRlYnVnVXRpbHNMYWJlbEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQmVnaW5RdWVyeS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQmluZERlc2NyaXB0b3JTZXRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQmluZFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyc0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQmluZFZlcnRleEJ1ZmZlcnMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZEJsaXRJbWFnZS1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZENvcHlCdWZmZXItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kRGVidWdNYXJrZXJFbmRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZERlYnVnTWFya2VySW5zZXJ0RVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWREaXNwYXRjaC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWREcmF3LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZERyYXdJbmRpcmVjdEJ5dGVDb3VudEVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZEVuZENvbmRpdGlvbmFsUmVuZGVyaW5nRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRFbmREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZEVuZFF1ZXJ5LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRFbmRRdWVyeUluZGV4ZWRFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZEVuZFJlbmRlclBhc3MyS0hSLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRGaWxsQnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZE5leHRTdWJwYXNzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kUHJvY2Vzc0NvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZFJlc2VydmVTcGFjZUZvckNvbW1hbmRzTlZYLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRSZXNldEV2ZW50LWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRSZXNldFF1ZXJ5UG9vbC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRCbGVuZENvbnN0YW50cy1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kU2V0Q2hlY2twb2ludE5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXREZXB0aEJpYXMtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZFNldERlcHRoQm91bmRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXREaXNjYXJkUmVjdGFuZ2xlRVhULWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRFdmVudC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRMaW5lU3RpcHBsZUVYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kU2V0TGluZVdpZHRoLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU1hcmtlcklOVEVMLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRQZXJmb3JtYW5jZU92ZXJyaWRlSU5URUwtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZFNldFBlcmZvcm1hbmNlU3RyZWFtTWFya2VySU5URUwtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZFNldFNhbXBsZUxvY2F0aW9uc0VYVC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kU2V0U2Npc3Nvci1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRTdGVuY2lsV3JpdGVNYXNrLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRUcmFjZVJheXNOVi1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRXcml0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZXNQcm9wZXJ0aWVzTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciLFwKKyAgICAiVlVJRC12a0NtZFdyaXRlQnVmZmVyTWFya2VyQU1ELWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIixcCisgICAgIlZVSUQtdmtDbWRXcml0ZVRpbWVzdGFtcC1jb21tYW5kQnVmZmVyLXJlY29yZGluZyIsXAorICAgICJWVUlELXZrRW5kQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDU5IgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2dwdV92YWxpZGF0aW9uLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9ncHVfdmFsaWRhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3ZWZlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9ncHVfdmFsaWRhdGlvbi5jcHAKQEAgLTAsMCArMSwyNTk1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBLYXJsIFNjaHVsdHogPGthcmxAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QGx1bmFyZy5jb20+CisgKi8KKworLy8gQWxsb3cgdXNlIG9mIFNUTCBtaW4gYW5kIG1heCBmdW5jdGlvbnMgaW4gV2luZG93cworI2RlZmluZSBOT01JTk1BWAorLy8gVGhpcyBkZWZpbmUgaW5kaWNhdGVzIHRvIGJ1aWxkIHRoZSBWTUEgcm91dGluZXMgdGhlbXNlbHZlcworI2RlZmluZSBWTUFfSU1QTEVNRU5UQVRJT04KKy8vIFRoaXMgZGVmaW5lIGluZGljYXRlcyB0aGF0IHdlIHdpbGwgc3VwcGx5IFZ1bGthbiBmdW5jdGlvbiBwb2ludGVycyBhdCBpbml0aWFsaXphdGlvbgorI2RlZmluZSBWTUFfU1RBVElDX1ZVTEtBTl9GVU5DVElPTlMgMAorI2luY2x1ZGUgImdwdV92YWxpZGF0aW9uLmgiCisjaW5jbHVkZSAic2hhZGVyX3ZhbGlkYXRpb24uaCIKKyNpbmNsdWRlICJzcGlydi10b29scy9saWJzcGlydi5oIgorI2luY2x1ZGUgInNwaXJ2LXRvb2xzL29wdGltaXplci5ocHAiCisjaW5jbHVkZSAic3BpcnYtdG9vbHMvaW5zdHJ1bWVudC5ocHAiCisjaW5jbHVkZSA8U1BJUlYvc3BpcnYuaHBwPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxyZWdleD4KKyNpbmNsdWRlICJsYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmgiCisKKy8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBiaW5kaW5ncyBpbiB0aGUgZGVidWcgZGVzY3JpcHRvciBzZXQuCitzdGF0aWMgY29uc3QgdWludDMyX3Qga051bUJpbmRpbmdzSW5TZXQgPSAzOworCitzdGF0aWMgY29uc3QgVmtTaGFkZXJTdGFnZUZsYWdzIGtTaGFkZXJTdGFnZUFsbFJheVRyYWNpbmcgPQorICAgIFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OViB8IFZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlYgfCBWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WIHwKKyAgICBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OViB8IFZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OViB8IFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WOworCisvLyBLZWVwIGluIHN5bmMgd2l0aCB0aGUgR0xTTCBzaGFkZXIgYmVsb3cuCitzdHJ1Y3QgR3B1QWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uQnVmZmVyIHsKKyAgICB1aW50MzJfdCBpbnN0YW5jZXNfdG9fdmFsaWRhdGU7CisgICAgdWludDMyX3QgcmVwbGFjZW1lbnRfaGFuZGxlX2JpdHNfMDsKKyAgICB1aW50MzJfdCByZXBsYWNlbWVudF9oYW5kbGVfYml0c18xOworICAgIHVpbnQzMl90IGludmFsaWRfaGFuZGxlX2ZvdW5kOworICAgIHVpbnQzMl90IGludmFsaWRfaGFuZGxlX2JpdHNfMDsKKyAgICB1aW50MzJfdCBpbnZhbGlkX2hhbmRsZV9iaXRzXzE7CisgICAgdWludDMyX3QgdmFsaWRfaGFuZGxlc19jb3VudDsKK307CisKKy8vIFRoaXMgaXMgdGhlIEdMU0wgc291cmNlIGZvciB0aGUgY29tcHV0ZSBzaGFkZXIgdGhhdCBpcyB1c2VkIGR1cmluZyByYXkgdHJhY2luZyBhY2NlbGVyYXRpb24gc3RydWN0dXJlCisvLyBidWlsZGluZyB2YWxpZGF0aW9uIHdoaWNoIGluc3BlY3RzIGluc3RhbmNlIGJ1ZmZlcnMgZm9yIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkcyBhbmQKKy8vIHJlcG9ydHMgYW5kIHJlcGxhY2VzIGludmFsaWQgYm90dG9tIGxldmVsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaGFuZGxlcyB3aXRoIGdvb2QgYm90dG9tIGxldmVsCisvLyBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGhhbmRsZSBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gY29udGludWUgd2l0aG91dCB1bmRlZmluZWQgYmVoYXZpb3IgbG9uZyBlbm91Z2gKKy8vIHRvIHJlcG9ydCBlcnJvcnMuCisvLworLy8gI3ZlcnNpb24gNDUwCisvLyBsYXlvdXQobG9jYWxfc2l6ZV94ID0gMSwgbG9jYWxfc2l6ZV95ID0gMSwgbG9jYWxfc2l6ZV96ID0gMSkgaW47CisvLyBzdHJ1Y3QgVmtHZW9tZXRyeUluc3RhbmNlTlYgeworLy8gICAgIHVpbnQgdW51c2VkWzE0XTsKKy8vICAgICB1aW50IGhhbmRsZV9iaXRzXzA7CisvLyAgICAgdWludCBoYW5kbGVfYml0c18xOworLy8gfTsKKy8vIGxheW91dChzZXQ9MCwgYmluZGluZz0wLCBzdGQ0MzApIGJ1ZmZlciBJbnN0YW5jZUJ1ZmZlciB7CisvLyAgICAgVmtHZW9tZXRyeUluc3RhbmNlTlYgaW5zdGFuY2VzW107CisvLyB9OworLy8gbGF5b3V0KHNldD0wLCBiaW5kaW5nPTEsIHN0ZDQzMCkgYnVmZmVyIFZhbGlkYXRpb25CdWZmZXIgeworLy8gICAgIHVpbnQgaW5zdGFuY2VzX3RvX3ZhbGlkYXRlOworLy8gICAgIHVpbnQgcmVwbGFjZW1lbnRfaGFuZGxlX2JpdHNfMDsKKy8vICAgICB1aW50IHJlcGxhY2VtZW50X2hhbmRsZV9iaXRzXzE7CisvLyAgICAgdWludCBpbnZhbGlkX2hhbmRsZV9mb3VuZDsKKy8vICAgICB1aW50IGludmFsaWRfaGFuZGxlX2JpdHNfMDsKKy8vICAgICB1aW50IGludmFsaWRfaGFuZGxlX2JpdHNfMTsKKy8vICAgICB1aW50IHZhbGlkX2hhbmRsZXNfY291bnQ7CisvLyAgICAgdWludCB2YWxpZF9oYW5kbGVzW107CisvLyB9OworLy8gdm9pZCBtYWluKCkgeworLy8gICAgIGZvciAodWludCBpbnN0YW5jZV9pbmRleCA9IDA7IGluc3RhbmNlX2luZGV4IDwgaW5zdGFuY2VzX3RvX3ZhbGlkYXRlOyBpbnN0YW5jZV9pbmRleCsrKSB7CisvLyAgICAgICAgIHVpbnQgaW5zdGFuY2VfaGFuZGxlX2JpdHNfMCA9IGluc3RhbmNlc1tpbnN0YW5jZV9pbmRleF0uaGFuZGxlX2JpdHNfMDsKKy8vICAgICAgICAgdWludCBpbnN0YW5jZV9oYW5kbGVfYml0c18xID0gaW5zdGFuY2VzW2luc3RhbmNlX2luZGV4XS5oYW5kbGVfYml0c18xOworLy8gICAgICAgICBib29sIHZhbGlkID0gZmFsc2U7CisvLyAgICAgICAgIGZvciAodWludCB2YWxpZF9oYW5kbGVfaW5kZXggPSAwOyB2YWxpZF9oYW5kbGVfaW5kZXggPCB2YWxpZF9oYW5kbGVzX2NvdW50OyB2YWxpZF9oYW5kbGVfaW5kZXgrKykgeworLy8gICAgICAgICAgICAgaWYgKGluc3RhbmNlX2hhbmRsZV9iaXRzXzAgPT0gdmFsaWRfaGFuZGxlc1syKnZhbGlkX2hhbmRsZV9pbmRleCswXSAmJgorLy8gICAgICAgICAgICAgICAgIGluc3RhbmNlX2hhbmRsZV9iaXRzXzEgPT0gdmFsaWRfaGFuZGxlc1syKnZhbGlkX2hhbmRsZV9pbmRleCsxXSkgeworLy8gICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKy8vICAgICAgICAgICAgICAgICBicmVhazsKKy8vICAgICAgICAgICAgIH0KKy8vICAgICAgICAgfQorLy8gICAgICAgICBpZiAoIXZhbGlkKSB7CisvLyAgICAgICAgICAgICBpbnZhbGlkX2hhbmRsZV9mb3VuZCArPSAxOworLy8gICAgICAgICAgICAgaW52YWxpZF9oYW5kbGVfYml0c18wID0gaW5zdGFuY2VfaGFuZGxlX2JpdHNfMDsKKy8vICAgICAgICAgICAgIGludmFsaWRfaGFuZGxlX2JpdHNfMSA9IGluc3RhbmNlX2hhbmRsZV9iaXRzXzE7CisvLyAgICAgICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2VfaW5kZXhdLmhhbmRsZV9iaXRzXzAgPSByZXBsYWNlbWVudF9oYW5kbGVfYml0c18wOworLy8gICAgICAgICAgICAgaW5zdGFuY2VzW2luc3RhbmNlX2luZGV4XS5oYW5kbGVfYml0c18xID0gcmVwbGFjZW1lbnRfaGFuZGxlX2JpdHNfMTsKKy8vICAgICAgICAgfQorLy8gICAgIH0KKy8vIH0KKy8vCisvLyBUbyByZWdlbmVyYXRlIHRoZSBzcGlydiBiZWxvdzoKKy8vICAgMS4gU2F2ZSB0aGUgYWJvdmUgR0xTTCBzb3VyY2UgdG8gYSBmaWxlIGNhbGxlZCB2YWxpZGF0aW9uX3NoYWRlci5jb21wLgorLy8gICAyLiBSdW4gaW4gdGVybWluYWwKKy8vCisvLyAgICAgIGdsc2xhbmdWYWxpZGF0b3IuZXhlIC14IC1WIHZhbGlkYXRpb25fc2hhZGVyLmNvbXAgLW8gdmFsaWRhdGlvbl9zaGFkZXIuY29tcC5zcHYKKy8vCisvLyAgIDQuIENvcHktcGFzdGUgdGhlIGNvbnRlbnRzIG9mIHZhbGlkYXRpb25fc2hhZGVyLmNvbXAuc3B2IGhlcmUgKGNsYW5nLWZvcm1hdCB3aWxsIGZpeCB1cCB0aGUgYWxpZ25tZW50KS4KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrQ29tcHV0ZVNoYWRlclNwaXJ2W10gPSB7CisgICAgMHgwNzIzMDIwMywgMHgwMDAxMDAwMCwgMHgwMDA4MDAwNywgMHgwMDAwMDA2ZCwgMHgwMDAwMDAwMCwgMHgwMDAyMDAxMSwgMHgwMDAwMDAwMSwgMHgwMDA2MDAwYiwgMHgwMDAwMDAwMSwgMHg0YzUzNGM0NywKKyAgICAweDY0NzQ3MzJlLCAweDMwMzUzNDJlLCAweDAwMDAwMDAwLCAweDAwMDMwMDBlLCAweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDUwMDBmLCAweDAwMDAwMDA1LCAweDAwMDAwMDA0LCAweDZlNjk2MTZkLAorICAgIDB4MDAwMDAwMDAsIDB4MDAwNjAwMTAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMzAwMDMsIDB4MDAwMDAwMDIsIDB4MDAwMDAxYzIsCisgICAgMHgwMDA0MDAwNSwgMHgwMDAwMDAwNCwgMHg2ZTY5NjE2ZCwgMHgwMDAwMDAwMCwgMHgwMDA2MDAwNSwgMHgwMDAwMDAwOCwgMHg3NDczNmU2OSwgMHg2NTYzNmU2MSwgMHg2NDZlNjk1ZiwgMHgwMDAwNzg2NSwKKyAgICAweDAwMDcwMDA1LCAweDAwMDAwMDExLCAweDY5NmM2MTU2LCAweDY5NzQ2MTY0LCAweDc1NDI2ZTZmLCAweDcyNjU2NjY2LCAweDAwMDAwMDAwLCAweDAwMDkwMDA2LCAweDAwMDAwMDExLCAweDAwMDAwMDAwLAorICAgIDB4NzQ3MzZlNjksIDB4NjU2MzZlNjEsIDB4NmY3NDVmNzMsIDB4NmM2MTc2NWYsIDB4NzQ2MTY0NjksIDB4MDAwMDAwNjUsIDB4MDAwYTAwMDYsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMDEsIDB4NmM3MDY1NzIsCisgICAgMHg2ZDY1NjM2MSwgMHg1Zjc0NmU2NSwgMHg2NDZlNjE2OCwgMHg2MjVmNjU2YywgMHg1ZjczNzQ2OSwgMHgwMDAwMDAzMCwgMHgwMDBhMDAwNiwgMHgwMDAwMDAxMSwgMHgwMDAwMDAwMiwgMHg2YzcwNjU3MiwKKyAgICAweDZkNjU2MzYxLCAweDVmNzQ2ZTY1LCAweDY0NmU2MTY4LCAweDYyNWY2NTZjLCAweDVmNzM3NDY5LCAweDAwMDAwMDMxLCAweDAwMDkwMDA2LCAweDAwMDAwMDExLCAweDAwMDAwMDAzLCAweDYxNzY2ZTY5LAorICAgIDB4NWY2NDY5NmMsIDB4NjQ2ZTYxNjgsIDB4NjY1ZjY1NmMsIDB4NjQ2ZTc1NmYsIDB4MDAwMDAwMDAsIDB4MDAwOTAwMDYsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMDQsIDB4NjE3NjZlNjksIDB4NWY2NDY5NmMsCisgICAgMHg2NDZlNjE2OCwgMHg2MjVmNjU2YywgMHg1ZjczNzQ2OSwgMHgwMDAwMDAzMCwgMHgwMDA5MDAwNiwgMHgwMDAwMDAxMSwgMHgwMDAwMDAwNSwgMHg2MTc2NmU2OSwgMHg1ZjY0Njk2YywgMHg2NDZlNjE2OCwKKyAgICAweDYyNWY2NTZjLCAweDVmNzM3NDY5LCAweDAwMDAwMDMxLCAweDAwMDgwMDA2LCAweDAwMDAwMDExLCAweDAwMDAwMDA2LCAweDY5NmM2MTc2LCAweDYxNjg1ZjY0LCAweDY1NmM2NDZlLCAweDZmNjM1ZjczLAorICAgIDB4MDA3NDZlNzUsIDB4MDAwNzAwMDYsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMDcsIDB4Njk2YzYxNzYsIDB4NjE2ODVmNjQsIDB4NjU2YzY0NmUsIDB4MDAwMDAwNzMsIDB4MDAwMzAwMDUsIDB4MDAwMDAwMTMsCisgICAgMHgwMDAwMDAwMCwgMHgwMDA4MDAwNSwgMHgwMDAwMDAxYiwgMHg3NDczNmU2OSwgMHg2NTYzNmU2MSwgMHg2ZTYxNjg1ZiwgMHg1ZjY1NmM2NCwgMHg3Mzc0Njk2MiwgMHgwMDAwMzA1ZiwgMHgwMDA4MDAwNSwKKyAgICAweDAwMDAwMDFlLCAweDY1NDc2YjU2LCAweDc0NjU2ZDZmLCAweDZlNDk3OTcyLCAweDZlNjE3NDczLCAweDU2NGU2NTYzLCAweDAwMDAwMDAwLCAweDAwMDUwMDA2LCAweDAwMDAwMDFlLCAweDAwMDAwMDAwLAorICAgIDB4NzM3NTZlNzUsIDB4MDAwMDY0NjUsIDB4MDAwNzAwMDYsIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDEsIDB4NjQ2ZTYxNjgsIDB4NjI1ZjY1NmMsIDB4NWY3Mzc0NjksIDB4MDAwMDAwMzAsIDB4MDAwNzAwMDYsCisgICAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwMiwgMHg2NDZlNjE2OCwgMHg2MjVmNjU2YywgMHg1ZjczNzQ2OSwgMHgwMDAwMDAzMSwgMHgwMDA2MDAwNSwgMHgwMDAwMDAyMCwgMHg3NDczNmU0OSwgMHg2NTYzNmU2MSwKKyAgICAweDY2NjY3NTQyLCAweDAwMDA3MjY1LCAweDAwMDYwMDA2LCAweDAwMDAwMDIwLCAweDAwMDAwMDAwLCAweDc0NzM2ZTY5LCAweDY1NjM2ZTYxLCAweDAwMDAwMDczLCAweDAwMDMwMDA1LCAweDAwMDAwMDIyLAorICAgIDB4MDAwMDAwMDAsIDB4MDAwODAwMDUsIDB4MDAwMDAwMjcsIDB4NzQ3MzZlNjksIDB4NjU2MzZlNjEsIDB4NmU2MTY4NWYsIDB4NWY2NTZjNjQsIDB4NzM3NDY5NjIsIDB4MDAwMDMxNWYsIDB4MDAwNDAwMDUsCisgICAgMHgwMDAwMDAyZCwgMHg2OTZjNjE3NiwgMHgwMDAwMDA2NCwgMHgwMDA3MDAwNSwgMHgwMDAwMDAyZiwgMHg2OTZjNjE3NiwgMHg2MTY4NWY2NCwgMHg2NTZjNjQ2ZSwgMHg2NDZlNjk1ZiwgMHgwMDAwNzg2NSwKKyAgICAweDAwMDQwMDQ3LCAweDAwMDAwMDEwLCAweDAwMDAwMDA2LCAweDAwMDAwMDA0LCAweDAwMDUwMDQ4LCAweDAwMDAwMDExLCAweDAwMDAwMDAwLCAweDAwMDAwMDIzLCAweDAwMDAwMDAwLCAweDAwMDUwMDQ4LAorICAgIDB4MDAwMDAwMTEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMDQsIDB4MDAwNTAwNDgsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMDgsIDB4MDAwNTAwNDgsCisgICAgMHgwMDAwMDAxMSwgMHgwMDAwMDAwMywgMHgwMDAwMDAyMywgMHgwMDAwMDAwYywgMHgwMDA1MDA0OCwgMHgwMDAwMDAxMSwgMHgwMDAwMDAwNCwgMHgwMDAwMDAyMywgMHgwMDAwMDAxMCwgMHgwMDA1MDA0OCwKKyAgICAweDAwMDAwMDExLCAweDAwMDAwMDA1LCAweDAwMDAwMDIzLCAweDAwMDAwMDE0LCAweDAwMDUwMDQ4LCAweDAwMDAwMDExLCAweDAwMDAwMDA2LCAweDAwMDAwMDIzLCAweDAwMDAwMDE4LCAweDAwMDUwMDQ4LAorICAgIDB4MDAwMDAwMTEsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMWMsIDB4MDAwMzAwNDcsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMDMsIDB4MDAwNDAwNDcsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMjIsCisgICAgMHgwMDAwMDAwMCwgMHgwMDA0MDA0NywgMHgwMDAwMDAxMywgMHgwMDAwMDAyMSwgMHgwMDAwMDAwMSwgMHgwMDA0MDA0NywgMHgwMDAwMDAxZCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwNCwgMHgwMDA1MDA0OCwKKyAgICAweDAwMDAwMDFlLCAweDAwMDAwMDAwLCAweDAwMDAwMDIzLCAweDAwMDAwMDAwLCAweDAwMDUwMDQ4LCAweDAwMDAwMDFlLCAweDAwMDAwMDAxLCAweDAwMDAwMDIzLCAweDAwMDAwMDM4LCAweDAwMDUwMDQ4LAorICAgIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMjMsIDB4MDAwMDAwM2MsIDB4MDAwNDAwNDcsIDB4MDAwMDAwMWYsIDB4MDAwMDAwMDYsIDB4MDAwMDAwNDAsIDB4MDAwNTAwNDgsIDB4MDAwMDAwMjAsCisgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAyMywgMHgwMDAwMDAwMCwgMHgwMDAzMDA0NywgMHgwMDAwMDAyMCwgMHgwMDAwMDAwMywgMHgwMDA0MDA0NywgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMHgwMDAwMDAwMCwKKyAgICAweDAwMDQwMDQ3LCAweDAwMDAwMDIyLCAweDAwMDAwMDIxLCAweDAwMDAwMDAwLCAweDAwMDIwMDEzLCAweDAwMDAwMDAyLCAweDAwMDMwMDIxLCAweDAwMDAwMDAzLCAweDAwMDAwMDAyLCAweDAwMDQwMDE1LAorICAgIDB4MDAwMDAwMDYsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwNDAwMjAsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDYsIDB4MDAwNDAwMmIsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwMCwgMHgwMDAzMDAxZCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAwNiwgMHgwMDBhMDAxZSwgMHgwMDAwMDAxMSwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwNiwKKyAgICAweDAwMDAwMDA2LCAweDAwMDAwMDA2LCAweDAwMDAwMDA2LCAweDAwMDAwMDEwLCAweDAwMDQwMDIwLCAweDAwMDAwMDEyLCAweDAwMDAwMDAyLCAweDAwMDAwMDExLCAweDAwMDQwMDNiLCAweDAwMDAwMDEyLAorICAgIDB4MDAwMDAwMTMsIDB4MDAwMDAwMDIsIDB4MDAwNDAwMTUsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMDEsIDB4MDAwNDAwMmIsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMDAsCisgICAgMHgwMDA0MDAyMCwgMHgwMDAwMDAxNiwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwNiwgMHgwMDAyMDAxNCwgMHgwMDAwMDAxOSwgMHgwMDA0MDAyYiwgMHgwMDAwMDAwNiwgMHgwMDAwMDAxYywgMHgwMDAwMDAwZSwKKyAgICAweDAwMDQwMDFjLCAweDAwMDAwMDFkLCAweDAwMDAwMDA2LCAweDAwMDAwMDFjLCAweDAwMDUwMDFlLCAweDAwMDAwMDFlLCAweDAwMDAwMDFkLCAweDAwMDAwMDA2LCAweDAwMDAwMDA2LCAweDAwMDMwMDFkLAorICAgIDB4MDAwMDAwMWYsIDB4MDAwMDAwMWUsIDB4MDAwMzAwMWUsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMWYsIDB4MDAwNDAwMjAsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMjAsIDB4MDAwNDAwM2IsCisgICAgMHgwMDAwMDAyMSwgMHgwMDAwMDAyMiwgMHgwMDAwMDAwMiwgMHgwMDA0MDAyYiwgMHgwMDAwMDAxNCwgMHgwMDAwMDAyNCwgMHgwMDAwMDAwMSwgMHgwMDA0MDAyYiwgMHgwMDAwMDAxNCwgMHgwMDAwMDAyOSwKKyAgICAweDAwMDAwMDAyLCAweDAwMDQwMDIwLCAweDAwMDAwMDJjLCAweDAwMDAwMDA3LCAweDAwMDAwMDE5LCAweDAwMDMwMDJhLCAweDAwMDAwMDE5LCAweDAwMDAwMDJlLCAweDAwMDQwMDJiLCAweDAwMDAwMDE0LAorICAgIDB4MDAwMDAwMzYsIDB4MDAwMDAwMDYsIDB4MDAwNDAwMmIsIDB4MDAwMDAwMTQsIDB4MDAwMDAwM2IsIDB4MDAwMDAwMDcsIDB4MDAwNDAwMmIsIDB4MDAwMDAwMDYsIDB4MDAwMDAwM2MsIDB4MDAwMDAwMDIsCisgICAgMHgwMDA0MDAyYiwgMHgwMDAwMDAwNiwgMHgwMDAwMDA0OCwgMHgwMDAwMDAwMSwgMHgwMDAzMDAyOSwgMHgwMDAwMDAxOSwgMHgwMDAwMDA1MCwgMHgwMDA0MDAyYiwgMHgwMDAwMDAxNCwgMHgwMDAwMDA1OCwKKyAgICAweDAwMDAwMDAzLCAweDAwMDQwMDJiLCAweDAwMDAwMDE0LCAweDAwMDAwMDVkLCAweDAwMDAwMDA0LCAweDAwMDQwMDJiLCAweDAwMDAwMDE0LCAweDAwMDAwMDYwLCAweDAwMDAwMDA1LCAweDAwMDUwMDM2LAorICAgIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDMsIDB4MDAwMjAwZjgsIDB4MDAwMDAwMDUsIDB4MDAwNDAwM2IsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDcsCisgICAgMHgwMDA0MDAzYiwgMHgwMDAwMDAwNywgMHgwMDAwMDAxYiwgMHgwMDAwMDAwNywgMHgwMDA0MDAzYiwgMHgwMDAwMDAwNywgMHgwMDAwMDAyNywgMHgwMDAwMDAwNywgMHgwMDA0MDAzYiwgMHgwMDAwMDAyYywKKyAgICAweDAwMDAwMDJkLCAweDAwMDAwMDA3LCAweDAwMDQwMDNiLCAweDAwMDAwMDA3LCAweDAwMDAwMDJmLCAweDAwMDAwMDA3LCAweDAwMDMwMDNlLCAweDAwMDAwMDA4LCAweDAwMDAwMDA5LCAweDAwMDIwMGY5LAorICAgIDB4MDAwMDAwMGEsIDB4MDAwMjAwZjgsIDB4MDAwMDAwMGEsIDB4MDAwNDAwZjYsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MDAwMjAwZjksIDB4MDAwMDAwMGUsIDB4MDAwMjAwZjgsCisgICAgMHgwMDAwMDAwZSwgMHgwMDA0MDAzZCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwZiwgMHgwMDAwMDAwOCwgMHgwMDA1MDA0MSwgMHgwMDAwMDAxNiwgMHgwMDAwMDAxNywgMHgwMDAwMDAxMywgMHgwMDAwMDAxNSwKKyAgICAweDAwMDQwMDNkLCAweDAwMDAwMDA2LCAweDAwMDAwMDE4LCAweDAwMDAwMDE3LCAweDAwMDUwMGIwLCAweDAwMDAwMDE5LCAweDAwMDAwMDFhLCAweDAwMDAwMDBmLCAweDAwMDAwMDE4LCAweDAwMDQwMGZhLAorICAgIDB4MDAwMDAwMWEsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGMsIDB4MDAwMjAwZjgsIDB4MDAwMDAwMGIsIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMDgsIDB4MDAwNzAwNDEsCisgICAgMHgwMDAwMDAxNiwgMHgwMDAwMDAyNSwgMHgwMDAwMDAyMiwgMHgwMDAwMDAxNSwgMHgwMDAwMDAyMywgMHgwMDAwMDAyNCwgMHgwMDA0MDAzZCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAyNiwgMHgwMDAwMDAyNSwKKyAgICAweDAwMDMwMDNlLCAweDAwMDAwMDFiLCAweDAwMDAwMDI2LCAweDAwMDQwMDNkLCAweDAwMDAwMDA2LCAweDAwMDAwMDI4LCAweDAwMDAwMDA4LCAweDAwMDcwMDQxLCAweDAwMDAwMDE2LCAweDAwMDAwMDJhLAorICAgIDB4MDAwMDAwMjIsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjksIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMmIsIDB4MDAwMDAwMmEsIDB4MDAwMzAwM2UsIDB4MDAwMDAwMjcsCisgICAgMHgwMDAwMDAyYiwgMHgwMDAzMDAzZSwgMHgwMDAwMDAyZCwgMHgwMDAwMDAyZSwgMHgwMDAzMDAzZSwgMHgwMDAwMDAyZiwgMHgwMDAwMDAwOSwgMHgwMDAyMDBmOSwgMHgwMDAwMDAzMCwgMHgwMDAyMDBmOCwKKyAgICAweDAwMDAwMDMwLCAweDAwMDQwMGY2LCAweDAwMDAwMDMyLCAweDAwMDAwMDMzLCAweDAwMDAwMDAwLCAweDAwMDIwMGY5LCAweDAwMDAwMDM0LCAweDAwMDIwMGY4LCAweDAwMDAwMDM0LCAweDAwMDQwMDNkLAorICAgIDB4MDAwMDAwMDYsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMmYsIDB4MDAwNTAwNDEsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMzcsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMzYsIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDYsCisgICAgMHgwMDAwMDAzOCwgMHgwMDAwMDAzNywgMHgwMDA1MDBiMCwgMHgwMDAwMDAxOSwgMHgwMDAwMDAzOSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzOCwgMHgwMDA0MDBmYSwgMHgwMDAwMDAzOSwgMHgwMDAwMDAzMSwKKyAgICAweDAwMDAwMDMyLCAweDAwMDIwMGY4LCAweDAwMDAwMDMxLCAweDAwMDQwMDNkLCAweDAwMDAwMDA2LCAweDAwMDAwMDNhLCAweDAwMDAwMDFiLCAweDAwMDQwMDNkLCAweDAwMDAwMDA2LCAweDAwMDAwMDNkLAorICAgIDB4MDAwMDAwMmYsIDB4MDAwNTAwODQsIDB4MDAwMDAwMDYsIDB4MDAwMDAwM2UsIDB4MDAwMDAwM2MsIDB4MDAwMDAwM2QsIDB4MDAwNTAwODAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwM2YsIDB4MDAwMDAwM2UsCisgICAgMHgwMDAwMDAwOSwgMHgwMDA2MDA0MSwgMHgwMDAwMDAxNiwgMHgwMDAwMDA0MCwgMHgwMDAwMDAxMywgMHgwMDAwMDAzYiwgMHgwMDAwMDAzZiwgMHgwMDA0MDAzZCwgMHgwMDAwMDAwNiwgMHgwMDAwMDA0MSwKKyAgICAweDAwMDAwMDQwLCAweDAwMDUwMGFhLCAweDAwMDAwMDE5LCAweDAwMDAwMDQyLCAweDAwMDAwMDNhLCAweDAwMDAwMDQxLCAweDAwMDMwMGY3LCAweDAwMDAwMDQ0LCAweDAwMDAwMDAwLCAweDAwMDQwMGZhLAorICAgIDB4MDAwMDAwNDIsIDB4MDAwMDAwNDMsIDB4MDAwMDAwNDQsIDB4MDAwMjAwZjgsIDB4MDAwMDAwNDMsIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDYsIDB4MDAwMDAwNDUsIDB4MDAwMDAwMjcsIDB4MDAwNDAwM2QsCisgICAgMHgwMDAwMDAwNiwgMHgwMDAwMDA0NiwgMHgwMDAwMDAyZiwgMHgwMDA1MDA4NCwgMHgwMDAwMDAwNiwgMHgwMDAwMDA0NywgMHgwMDAwMDAzYywgMHgwMDAwMDA0NiwgMHgwMDA1MDA4MCwgMHgwMDAwMDAwNiwKKyAgICAweDAwMDAwMDQ5LCAweDAwMDAwMDQ3LCAweDAwMDAwMDQ4LCAweDAwMDYwMDQxLCAweDAwMDAwMDE2LCAweDAwMDAwMDRhLCAweDAwMDAwMDEzLCAweDAwMDAwMDNiLCAweDAwMDAwMDQ5LCAweDAwMDQwMDNkLAorICAgIDB4MDAwMDAwMDYsIDB4MDAwMDAwNGIsIDB4MDAwMDAwNGEsIDB4MDAwNTAwYWEsIDB4MDAwMDAwMTksIDB4MDAwMDAwNGMsIDB4MDAwMDAwNDUsIDB4MDAwMDAwNGIsIDB4MDAwMjAwZjksIDB4MDAwMDAwNDQsCisgICAgMHgwMDAyMDBmOCwgMHgwMDAwMDA0NCwgMHgwMDA3MDBmNSwgMHgwMDAwMDAxOSwgMHgwMDAwMDA0ZCwgMHgwMDAwMDA0MiwgMHgwMDAwMDAzMSwgMHgwMDAwMDA0YywgMHgwMDAwMDA0MywgMHgwMDAzMDBmNywKKyAgICAweDAwMDAwMDRmLCAweDAwMDAwMDAwLCAweDAwMDQwMGZhLCAweDAwMDAwMDRkLCAweDAwMDAwMDRlLCAweDAwMDAwMDRmLCAweDAwMDIwMGY4LCAweDAwMDAwMDRlLCAweDAwMDMwMDNlLCAweDAwMDAwMDJkLAorICAgIDB4MDAwMDAwNTAsIDB4MDAwMjAwZjksIDB4MDAwMDAwMzIsIDB4MDAwMjAwZjgsIDB4MDAwMDAwNGYsIDB4MDAwMjAwZjksIDB4MDAwMDAwMzMsIDB4MDAwMjAwZjgsIDB4MDAwMDAwMzMsIDB4MDAwNDAwM2QsCisgICAgMHgwMDAwMDAwNiwgMHgwMDAwMDA1MiwgMHgwMDAwMDAyZiwgMHgwMDA1MDA4MCwgMHgwMDAwMDAwNiwgMHgwMDAwMDA1MywgMHgwMDAwMDA1MiwgMHgwMDAwMDAyNCwgMHgwMDAzMDAzZSwgMHgwMDAwMDAyZiwKKyAgICAweDAwMDAwMDUzLCAweDAwMDIwMGY5LCAweDAwMDAwMDMwLCAweDAwMDIwMGY4LCAweDAwMDAwMDMyLCAweDAwMDQwMDNkLCAweDAwMDAwMDE5LCAweDAwMDAwMDU0LCAweDAwMDAwMDJkLCAweDAwMDQwMGE4LAorICAgIDB4MDAwMDAwMTksIDB4MDAwMDAwNTUsIDB4MDAwMDAwNTQsIDB4MDAwMzAwZjcsIDB4MDAwMDAwNTcsIDB4MDAwMDAwMDAsIDB4MDAwNDAwZmEsIDB4MDAwMDAwNTUsIDB4MDAwMDAwNTYsIDB4MDAwMDAwNTcsCisgICAgMHgwMDAyMDBmOCwgMHgwMDAwMDA1NiwgMHgwMDA1MDA0MSwgMHgwMDAwMDAxNiwgMHgwMDAwMDA1OSwgMHgwMDAwMDAxMywgMHgwMDAwMDA1OCwgMHgwMDA0MDAzZCwgMHgwMDAwMDAwNiwgMHgwMDAwMDA1YSwKKyAgICAweDAwMDAwMDU5LCAweDAwMDUwMDgwLCAweDAwMDAwMDA2LCAweDAwMDAwMDViLCAweDAwMDAwMDVhLCAweDAwMDAwMDQ4LCAweDAwMDUwMDQxLCAweDAwMDAwMDE2LCAweDAwMDAwMDVjLCAweDAwMDAwMDEzLAorICAgIDB4MDAwMDAwNTgsIDB4MDAwMzAwM2UsIDB4MDAwMDAwNWMsIDB4MDAwMDAwNWIsIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDYsIDB4MDAwMDAwNWUsIDB4MDAwMDAwMWIsIDB4MDAwNTAwNDEsIDB4MDAwMDAwMTYsCisgICAgMHgwMDAwMDA1ZiwgMHgwMDAwMDAxMywgMHgwMDAwMDA1ZCwgMHgwMDAzMDAzZSwgMHgwMDAwMDA1ZiwgMHgwMDAwMDA1ZSwgMHgwMDA0MDAzZCwgMHgwMDAwMDAwNiwgMHgwMDAwMDA2MSwgMHgwMDAwMDAyNywKKyAgICAweDAwMDUwMDQxLCAweDAwMDAwMDE2LCAweDAwMDAwMDYyLCAweDAwMDAwMDEzLCAweDAwMDAwMDYwLCAweDAwMDMwMDNlLCAweDAwMDAwMDYyLCAweDAwMDAwMDYxLCAweDAwMDQwMDNkLCAweDAwMDAwMDA2LAorICAgIDB4MDAwMDAwNjMsIDB4MDAwMDAwMDgsIDB4MDAwNTAwNDEsIDB4MDAwMDAwMTYsIDB4MDAwMDAwNjQsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMjQsIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDYsIDB4MDAwMDAwNjUsCisgICAgMHgwMDAwMDA2NCwgMHgwMDA3MDA0MSwgMHgwMDAwMDAxNiwgMHgwMDAwMDA2NiwgMHgwMDAwMDAyMiwgMHgwMDAwMDAxNSwgMHgwMDAwMDA2MywgMHgwMDAwMDAyNCwgMHgwMDAzMDAzZSwgMHgwMDAwMDA2NiwKKyAgICAweDAwMDAwMDY1LCAweDAwMDQwMDNkLCAweDAwMDAwMDA2LCAweDAwMDAwMDY3LCAweDAwMDAwMDA4LCAweDAwMDUwMDQxLCAweDAwMDAwMDE2LCAweDAwMDAwMDY4LCAweDAwMDAwMDEzLCAweDAwMDAwMDI5LAorICAgIDB4MDAwNDAwM2QsIDB4MDAwMDAwMDYsIDB4MDAwMDAwNjksIDB4MDAwMDAwNjgsIDB4MDAwNzAwNDEsIDB4MDAwMDAwMTYsIDB4MDAwMDAwNmEsIDB4MDAwMDAwMjIsIDB4MDAwMDAwMTUsIDB4MDAwMDAwNjcsCisgICAgMHgwMDAwMDAyOSwgMHgwMDAzMDAzZSwgMHgwMDAwMDA2YSwgMHgwMDAwMDA2OSwgMHgwMDAyMDBmOSwgMHgwMDAwMDA1NywgMHgwMDAyMDBmOCwgMHgwMDAwMDA1NywgMHgwMDAyMDBmOSwgMHgwMDAwMDAwZCwKKyAgICAweDAwMDIwMGY4LCAweDAwMDAwMDBkLCAweDAwMDQwMDNkLCAweDAwMDAwMDA2LCAweDAwMDAwMDZiLCAweDAwMDAwMDA4LCAweDAwMDUwMDgwLCAweDAwMDAwMDA2LCAweDAwMDAwMDZjLCAweDAwMDAwMDZiLAorICAgIDB4MDAwMDAwMjQsIDB4MDAwMzAwM2UsIDB4MDAwMDAwMDgsIDB4MDAwMDAwNmMsIDB4MDAwMjAwZjksIDB4MDAwMDAwMGEsIDB4MDAwMjAwZjgsIDB4MDAwMDAwMGMsIDB4MDAwMTAwZmQsIDB4MDAwMTAwMzh9OworCisvLyBJbXBsZW1lbnRhdGlvbiBmb3IgRGVzY3JpcHRvciBTZXQgTWFuYWdlciBjbGFzcworR3B1QXNzaXN0ZWREZXNjcmlwdG9yU2V0TWFuYWdlcjo6R3B1QXNzaXN0ZWREZXNjcmlwdG9yU2V0TWFuYWdlcihHcHVBc3Npc3RlZCAqZGV2X2RhdGEpIHsgZGV2X2RhdGFfID0gZGV2X2RhdGE7IH0KKworR3B1QXNzaXN0ZWREZXNjcmlwdG9yU2V0TWFuYWdlcjo6fkdwdUFzc2lzdGVkRGVzY3JpcHRvclNldE1hbmFnZXIoKSB7CisgICAgZm9yIChhdXRvICZwb29sIDogZGVzY19wb29sX21hcF8pIHsKKyAgICAgICAgRGlzcGF0Y2hEZXN0cm95RGVzY3JpcHRvclBvb2woZGV2X2RhdGFfLT5kZXZpY2UsIHBvb2wuZmlyc3QsIE5VTEwpOworICAgIH0KKyAgICBkZXNjX3Bvb2xfbWFwXy5jbGVhcigpOworfQorCitWa1Jlc3VsdCBHcHVBc3Npc3RlZERlc2NyaXB0b3JTZXRNYW5hZ2VyOjpHZXREZXNjcmlwdG9yU2V0KFZrRGVzY3JpcHRvclBvb2wgKmRlc2NfcG9vbCwgVmtEZXNjcmlwdG9yU2V0ICpkZXNjX3NldCkgeworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldD4gZGVzY19zZXRzOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IEdldERlc2NyaXB0b3JTZXRzKDEsIGRlc2NfcG9vbCwgJmRlc2Nfc2V0cyk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICpkZXNjX3NldCA9IGRlc2Nfc2V0c1swXTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgR3B1QXNzaXN0ZWREZXNjcmlwdG9yU2V0TWFuYWdlcjo6R2V0RGVzY3JpcHRvclNldHModWludDMyX3QgY291bnQsIFZrRGVzY3JpcHRvclBvb2wgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXQ+ICpkZXNjX3NldHMpIHsKKyAgICBjb25zdCB1aW50MzJfdCBkZWZhdWx0X3Bvb2xfc2l6ZSA9IGtJdGVtc1BlckNodW5rOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgVmtEZXNjcmlwdG9yUG9vbCBwb29sX3RvX3VzZSA9IFZLX05VTExfSEFORExFOworCisgICAgaWYgKDAgPT0gY291bnQpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgZGVzY19zZXRzLT5jbGVhcigpOworICAgIGRlc2Nfc2V0cy0+cmVzaXplKGNvdW50KTsKKworICAgIGZvciAoYXV0byAmcG9vbCA6IGRlc2NfcG9vbF9tYXBfKSB7CisgICAgICAgIGlmIChwb29sLnNlY29uZC51c2VkICsgY291bnQgPCBwb29sLnNlY29uZC5zaXplKSB7CisgICAgICAgICAgICBwb29sX3RvX3VzZSA9IHBvb2wuZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoVktfTlVMTF9IQU5ETEUgPT0gcG9vbF90b191c2UpIHsKKyAgICAgICAgdWludDMyX3QgcG9vbF9jb3VudCA9IGRlZmF1bHRfcG9vbF9zaXplOworICAgICAgICBpZiAoY291bnQgPiBkZWZhdWx0X3Bvb2xfc2l6ZSkgeworICAgICAgICAgICAgcG9vbF9jb3VudCA9IGNvdW50OworICAgICAgICB9CisgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xTaXplIHNpemVfY291bnRzID0geworICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLAorICAgICAgICAgICAgcG9vbF9jb3VudCAqIGtOdW1CaW5kaW5nc0luU2V0LAorICAgICAgICB9OworICAgICAgICBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBkZXNjX3Bvb2xfaW5mbyA9IHt9OworICAgICAgICBkZXNjX3Bvb2xfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICAgICAgZGVzY19wb29sX2luZm8ucE5leHQgPSBOVUxMOworICAgICAgICBkZXNjX3Bvb2xfaW5mby5mbGFncyA9IFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfRlJFRV9ERVNDUklQVE9SX1NFVF9CSVQ7CisgICAgICAgIGRlc2NfcG9vbF9pbmZvLm1heFNldHMgPSBwb29sX2NvdW50OworICAgICAgICBkZXNjX3Bvb2xfaW5mby5wb29sU2l6ZUNvdW50ID0gMTsKKyAgICAgICAgZGVzY19wb29sX2luZm8ucFBvb2xTaXplcyA9ICZzaXplX2NvdW50czsKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVEZXNjcmlwdG9yUG9vbChkZXZfZGF0YV8tPmRldmljZSwgJmRlc2NfcG9vbF9pbmZvLCBOVUxMLCAmcG9vbF90b191c2UpOworICAgICAgICBhc3NlcnQocmVzdWx0ID09IFZLX1NVQ0NFU1MpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZGVzY19wb29sX21hcF9bcG9vbF90b191c2VdLnNpemUgPSBkZXNjX3Bvb2xfaW5mby5tYXhTZXRzOworICAgICAgICBkZXNjX3Bvb2xfbWFwX1twb29sX3RvX3VzZV0udXNlZCA9IDA7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dD4gZGVzY19sYXlvdXRzKGNvdW50LCBkZXZfZGF0YV8tPmRlYnVnX2Rlc2NfbGF5b3V0KTsKKworICAgIFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyBhbGxvY19pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk8sIE5VTEwsIHBvb2xfdG9fdXNlLCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjX2xheW91dHMuZGF0YSgpfTsKKworICAgIHJlc3VsdCA9IERpc3BhdGNoQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhkZXZfZGF0YV8tPmRldmljZSwgJmFsbG9jX2luZm8sIGRlc2Nfc2V0cy0+ZGF0YSgpKTsKKyAgICBhc3NlcnQocmVzdWx0ID09IFZLX1NVQ0NFU1MpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAqcG9vbCA9IHBvb2xfdG9fdXNlOworICAgIGRlc2NfcG9vbF9tYXBfW3Bvb2xfdG9fdXNlXS51c2VkICs9IGNvdW50OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWREZXNjcmlwdG9yU2V0TWFuYWdlcjo6UHV0QmFja0Rlc2NyaXB0b3JTZXQoVmtEZXNjcmlwdG9yUG9vbCBkZXNjX3Bvb2wsIFZrRGVzY3JpcHRvclNldCBkZXNjX3NldCkgeworICAgIGF1dG8gaXRlciA9IGRlc2NfcG9vbF9tYXBfLmZpbmQoZGVzY19wb29sKTsKKyAgICBpZiAoaXRlciAhPSBkZXNjX3Bvb2xfbWFwXy5lbmQoKSkgeworICAgICAgICBWa1Jlc3VsdCByZXN1bHQgPSBEaXNwYXRjaEZyZWVEZXNjcmlwdG9yU2V0cyhkZXZfZGF0YV8tPmRldmljZSwgZGVzY19wb29sLCAxLCAmZGVzY19zZXQpOworICAgICAgICBhc3NlcnQocmVzdWx0ID09IFZLX1NVQ0NFU1MpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBkZXNjX3Bvb2xfbWFwX1tkZXNjX3Bvb2xdLnVzZWQtLTsKKyAgICAgICAgaWYgKDAgPT0gZGVzY19wb29sX21hcF9bZGVzY19wb29sXS51c2VkKSB7CisgICAgICAgICAgICBEaXNwYXRjaERlc3Ryb3lEZXNjcmlwdG9yUG9vbChkZXZfZGF0YV8tPmRldmljZSwgZGVzY19wb29sLCBOVUxMKTsKKyAgICAgICAgICAgIGRlc2NfcG9vbF9tYXBfLmVyYXNlKGRlc2NfcG9vbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvLyBUcmFtcG9saW5lcyB0byBtYWtlIFZNQSBjYWxsIERpc3BhdGNoIGZvciBWdWxrYW4gY2FsbHMKK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBncHVWa0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydGllcyk7Cit9CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZ3B1VmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyAqcE1lbW9yeVByb3BlcnRpZXMpIHsKKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcE1lbW9yeVByb3BlcnRpZXMpOworfQorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBncHVWa0FsbG9jYXRlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8gKnBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RldmljZU1lbW9yeSAqcE1lbW9yeSkgeworICAgIHJldHVybiBEaXNwYXRjaEFsbG9jYXRlTWVtb3J5KGRldmljZSwgcEFsbG9jYXRlSW5mbywgcEFsbG9jYXRvciwgcE1lbW9yeSk7Cit9CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZ3B1VmtGcmVlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBEaXNwYXRjaEZyZWVNZW1vcnkoZGV2aWNlLCBtZW1vcnksIHBBbGxvY2F0b3IpOworfQorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBncHVWa01hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5TWFwRmxhZ3MgZmxhZ3MsIHZvaWQgKipwcERhdGEpIHsKKyAgICByZXR1cm4gRGlzcGF0Y2hNYXBNZW1vcnkoZGV2aWNlLCBtZW1vcnksIG9mZnNldCwgc2l6ZSwgZmxhZ3MsIHBwRGF0YSk7Cit9CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZ3B1VmtVbm1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSkgeyBEaXNwYXRjaFVubWFwTWVtb3J5KGRldmljZSwgbWVtb3J5KTsgfQorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBncHVWa0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlICpwTWVtb3J5UmFuZ2VzKSB7CisgICAgcmV0dXJuIERpc3BhdGNoRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoZGV2aWNlLCBtZW1vcnlSYW5nZUNvdW50LCBwTWVtb3J5UmFuZ2VzKTsKK30KK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgZ3B1VmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UgKnBNZW1vcnlSYW5nZXMpIHsKKyAgICByZXR1cm4gRGlzcGF0Y2hJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcyk7Cit9CitzdGF0aWMgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIGdwdVZrQmluZEJ1ZmZlck1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgeworICAgIHJldHVybiBEaXNwYXRjaEJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlLCBidWZmZXIsIG1lbW9yeSwgbWVtb3J5T2Zmc2V0KTsKK30KK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgZ3B1VmtCaW5kSW1hZ2VNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQpIHsKKyAgICByZXR1cm4gRGlzcGF0Y2hCaW5kSW1hZ2VNZW1vcnkoZGV2aWNlLCBpbWFnZSwgbWVtb3J5LCBtZW1vcnlPZmZzZXQpOworfQorc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGdwdVZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzICpwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgRGlzcGF0Y2hHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBidWZmZXIsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworfQorc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGdwdVZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgKnBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBEaXNwYXRjaEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSwgaW1hZ2UsIHBNZW1vcnlSZXF1aXJlbWVudHMpOworfQorc3RhdGljIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBncHVWa0NyZWF0ZUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtCdWZmZXIgKnBCdWZmZXIpIHsKKyAgICByZXR1cm4gRGlzcGF0Y2hDcmVhdGVCdWZmZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEJ1ZmZlcik7Cit9CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZ3B1VmtEZXN0cm95QnVmZmVyKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICByZXR1cm4gRGlzcGF0Y2hEZXN0cm95QnVmZmVyKGRldmljZSwgYnVmZmVyLCBwQWxsb2NhdG9yKTsKK30KK3N0YXRpYyBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgZ3B1VmtDcmVhdGVJbWFnZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrSW1hZ2UgKnBJbWFnZSkgeworICAgIHJldHVybiBEaXNwYXRjaENyZWF0ZUltYWdlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbWFnZSk7Cit9CitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZ3B1VmtEZXN0cm95SW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBEaXNwYXRjaERlc3Ryb3lJbWFnZShkZXZpY2UsIGltYWdlLCBwQWxsb2NhdG9yKTsKK30KK3N0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBncHVWa0NtZENvcHlCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJDb3B5ICpwUmVnaW9ucykgeworICAgIERpc3BhdGNoQ21kQ29weUJ1ZmZlcihjb21tYW5kQnVmZmVyLCBzcmNCdWZmZXIsIGRzdEJ1ZmZlciwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKK30KKworVmtSZXN1bHQgR3B1QXNzaXN0ZWQ6OkluaXRpYWxpemVWbWEoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbF9kZXZpY2UsIFZrRGV2aWNlIGRldmljZSwgVm1hQWxsb2NhdG9yICpwQWxsb2NhdG9yKSB7CisgICAgVm1hVnVsa2FuRnVuY3Rpb25zIGZ1bmN0aW9uczsKKyAgICBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvIGFsbG9jYXRvckluZm8gPSB7fTsKKyAgICBhbGxvY2F0b3JJbmZvLmRldmljZSA9IGRldmljZTsKKyAgICBhbGxvY2F0b3JJbmZvLnBoeXNpY2FsRGV2aWNlID0gcGh5c2ljYWxfZGV2aWNlOworCisgICAgZnVuY3Rpb25zLnZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcylncHVWa0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczsKKyAgICBmdW5jdGlvbnMudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKWdwdVZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIGZ1bmN0aW9ucy52a0FsbG9jYXRlTWVtb3J5ID0gKFBGTl92a0FsbG9jYXRlTWVtb3J5KWdwdVZrQWxsb2NhdGVNZW1vcnk7CisgICAgZnVuY3Rpb25zLnZrRnJlZU1lbW9yeSA9IChQRk5fdmtGcmVlTWVtb3J5KWdwdVZrRnJlZU1lbW9yeTsKKyAgICBmdW5jdGlvbnMudmtNYXBNZW1vcnkgPSAoUEZOX3ZrTWFwTWVtb3J5KWdwdVZrTWFwTWVtb3J5OworICAgIGZ1bmN0aW9ucy52a1VubWFwTWVtb3J5ID0gKFBGTl92a1VubWFwTWVtb3J5KWdwdVZrVW5tYXBNZW1vcnk7CisgICAgZnVuY3Rpb25zLnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgPSAoUEZOX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMpZ3B1VmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlczsKKyAgICBmdW5jdGlvbnMudmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzID0gKFBGTl92a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMpZ3B1VmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzOworICAgIGZ1bmN0aW9ucy52a0JpbmRCdWZmZXJNZW1vcnkgPSAoUEZOX3ZrQmluZEJ1ZmZlck1lbW9yeSlncHVWa0JpbmRCdWZmZXJNZW1vcnk7CisgICAgZnVuY3Rpb25zLnZrQmluZEltYWdlTWVtb3J5ID0gKFBGTl92a0JpbmRJbWFnZU1lbW9yeSlncHVWa0JpbmRJbWFnZU1lbW9yeTsKKyAgICBmdW5jdGlvbnMudmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMgPSAoUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKWdwdVZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIGZ1bmN0aW9ucy52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzID0gKFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKWdwdVZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM7CisgICAgZnVuY3Rpb25zLnZrQ3JlYXRlQnVmZmVyID0gKFBGTl92a0NyZWF0ZUJ1ZmZlcilncHVWa0NyZWF0ZUJ1ZmZlcjsKKyAgICBmdW5jdGlvbnMudmtEZXN0cm95QnVmZmVyID0gKFBGTl92a0Rlc3Ryb3lCdWZmZXIpZ3B1VmtEZXN0cm95QnVmZmVyOworICAgIGZ1bmN0aW9ucy52a0NyZWF0ZUltYWdlID0gKFBGTl92a0NyZWF0ZUltYWdlKWdwdVZrQ3JlYXRlSW1hZ2U7CisgICAgZnVuY3Rpb25zLnZrRGVzdHJveUltYWdlID0gKFBGTl92a0Rlc3Ryb3lJbWFnZSlncHVWa0Rlc3Ryb3lJbWFnZTsKKyAgICBmdW5jdGlvbnMudmtDbWRDb3B5QnVmZmVyID0gKFBGTl92a0NtZENvcHlCdWZmZXIpZ3B1VmtDbWRDb3B5QnVmZmVyOworICAgIGFsbG9jYXRvckluZm8ucFZ1bGthbkZ1bmN0aW9ucyA9ICZmdW5jdGlvbnM7CisKKyAgICByZXR1cm4gdm1hQ3JlYXRlQWxsb2NhdG9yKCZhbGxvY2F0b3JJbmZvLCBwQWxsb2NhdG9yKTsKK30KKworLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJlcG9ydGluZyBwcm9ibGVtcyB3aXRoIHNldHRpbmcgdXAgR1BVIFZhbGlkYXRpb24uCit2b2lkIEdwdUFzc2lzdGVkOjpSZXBvcnRTZXR1cFByb2JsZW0oVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3Qgc3BlY2lmaWNfbWVzc2FnZSkgY29uc3QgeworICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwgIlVOQVNTSUdORUQtR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gRXJyb3IuICIsCisgICAgICAgICAgICAiRGV0YWlsOiAoJXMpIiwgc3BlY2lmaWNfbWVzc2FnZSk7Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRDcmVhdGVCdWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrQnVmZmVyICpwQnVmZmVyLCB2b2lkICpjYl9zdGF0ZV9kYXRhKSB7CisgICAgLy8gUmF5IHRyYWNpbmcgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBpbnN0YW5jZSBidWZmZXJzIGFsc28gbmVlZCB0aGUgc3RvcmFnZSBidWZmZXIgdXNhZ2UgYXMKKyAgICAvLyBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24gd2lsbCBmaW5kIGFuZCByZXBsYWNlIGludmFsaWQgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZQorICAgIC8vIGhhbmRsZXMgaW5zaWRlIG9mIGEgY29tcHV0ZSBzaGFkZXIuCisgICAgY3JlYXRlX2J1ZmZlcl9hcGlfc3RhdGUgKmNiX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxjcmVhdGVfYnVmZmVyX2FwaV9zdGF0ZSAqPihjYl9zdGF0ZV9kYXRhKTsKKyAgICBpZiAoY2Jfc3RhdGUgJiYgY2Jfc3RhdGUtPm1vZGlmaWVkX2NyZWF0ZV9pbmZvLnVzYWdlICYgVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OVikgeworICAgICAgICBjYl9zdGF0ZS0+bW9kaWZpZWRfY3JlYXRlX2luZm8udXNhZ2UgfD0gVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfQlVGRkVSX0JJVDsKKyAgICB9Cit9CisKKy8vIFR1cm4gb24gbmVjZXNzYXJ5IGRldmljZSBmZWF0dXJlcy4KK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBncHUsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfVmtEZXZpY2VDcmVhdGVJbmZvICptb2RpZmllZF9jcmVhdGVfaW5mbykgeworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBzdXBwb3J0ZWRfZmVhdHVyZXM7CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKGdwdSwgJnN1cHBvcnRlZF9mZWF0dXJlcyk7CisgICAgaWYgKHN1cHBvcnRlZF9mZWF0dXJlcy5mcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MgfHwgc3VwcG9ydGVkX2ZlYXR1cmVzLnZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyB8fAorICAgICAgICBzdXBwb3J0ZWRfZmVhdHVyZXMuc2hhZGVySW50NjQpIHsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpmZWF0dXJlcyA9IG51bGxwdHI7CisgICAgICAgIGlmIChtb2RpZmllZF9jcmVhdGVfaW5mby0+cEVuYWJsZWRGZWF0dXJlcykgeworICAgICAgICAgICAgLy8gSWYgcEVuYWJsZWRGZWF0dXJlcywgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBpbiBwTmV4dCBjaGFpbiBpcyBub3QgYWxsb3dlZAorICAgICAgICAgICAgZmVhdHVyZXMgPSBjb25zdF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAqPihtb2RpZmllZF9jcmVhdGVfaW5mby0+cEVuYWJsZWRGZWF0dXJlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyICpmZWF0dXJlczIgPSBudWxscHRyOworICAgICAgICAgICAgZmVhdHVyZXMyID0KKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgKj4obHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMj4obW9kaWZpZWRfY3JlYXRlX2luZm8tPnBOZXh0KSk7CisgICAgICAgICAgICBpZiAoZmVhdHVyZXMyKSBmZWF0dXJlcyA9ICZmZWF0dXJlczItPmZlYXR1cmVzOworICAgICAgICB9CisgICAgICAgIGlmIChmZWF0dXJlcykgeworICAgICAgICAgICAgZmVhdHVyZXMtPmZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyA9IHN1cHBvcnRlZF9mZWF0dXJlcy5mcmFnbWVudFN0b3Jlc0FuZEF0b21pY3M7CisgICAgICAgICAgICBmZWF0dXJlcy0+dmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzID0gc3VwcG9ydGVkX2ZlYXR1cmVzLnZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljczsKKyAgICAgICAgICAgIGZlYXR1cmVzLT5zaGFkZXJJbnQ2NCA9IHN1cHBvcnRlZF9mZWF0dXJlcy5zaGFkZXJJbnQ2NDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBuZXdfZmVhdHVyZXMgPSB7fTsKKyAgICAgICAgICAgIG5ld19mZWF0dXJlcy5mcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MgPSBzdXBwb3J0ZWRfZmVhdHVyZXMuZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzOworICAgICAgICAgICAgbmV3X2ZlYXR1cmVzLnZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyA9IHN1cHBvcnRlZF9mZWF0dXJlcy52ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3M7CisgICAgICAgICAgICBuZXdfZmVhdHVyZXMuc2hhZGVySW50NjQgPSBzdXBwb3J0ZWRfZmVhdHVyZXMuc2hhZGVySW50NjQ7CisgICAgICAgICAgICBkZWxldGUgbW9kaWZpZWRfY3JlYXRlX2luZm8tPnBFbmFibGVkRmVhdHVyZXM7CisgICAgICAgICAgICBtb2RpZmllZF9jcmVhdGVfaW5mby0+cEVuYWJsZWRGZWF0dXJlcyA9IG5ldyBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMobmV3X2ZlYXR1cmVzKTsKKyAgICAgICAgfQorICAgIH0KK30KKy8vIFBlcmZvcm0gaW5pdGlhbGl6YXRpb25zIHRoYXQgY2FuIGJlIGRvbmUgYXQgQ3JlYXRlIERldmljZSB0aW1lLgordm9pZCBHcHVBc3Npc3RlZDo6UG9zdENhbGxSZWNvcmRDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIC8vIFRoZSBzdGF0ZSB0cmFja2VyIHNldHMgdXAgdGhlIGRldmljZSBzdGF0ZQorICAgIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKHBoeXNpY2FsRGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSwgcmVzdWx0KTsKKworICAgIFZhbGlkYXRpb25PYmplY3QgKmRldmljZV9vYmplY3QgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleSgqcERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWYWxpZGF0aW9uT2JqZWN0ICp2YWxpZGF0aW9uX2RhdGEgPSBHZXRWYWxpZGF0aW9uT2JqZWN0KGRldmljZV9vYmplY3QtPm9iamVjdF9kaXNwYXRjaCwgdGhpcy0+Y29udGFpbmVyX3R5cGUpOworICAgIEdwdUFzc2lzdGVkICpkZXZpY2VfZ3B1X2Fzc2lzdGVkID0gc3RhdGljX2Nhc3Q8R3B1QXNzaXN0ZWQgKj4odmFsaWRhdGlvbl9kYXRhKTsKKworICAgIGlmIChkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5waHlzX2Rldl9wcm9wcy5hcGlWZXJzaW9uIDwgVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUFUtQXNzaXN0ZWQgdmFsaWRhdGlvbiByZXF1aXJlcyBWdWxrYW4gMS4xIG9yIGxhdGVyLiAgR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gZGlzYWJsZWQuIik7CisgICAgICAgIGRldmljZV9ncHVfYXNzaXN0ZWQtPmFib3J0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5lbmFibGVkX2ZlYXR1cmVzLmNvcmUuZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzIHx8CisgICAgICAgICFkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5lbmFibGVkX2ZlYXR1cmVzLmNvcmUudmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzKSB7CisgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUFUtQXNzaXN0ZWQgdmFsaWRhdGlvbiByZXF1aXJlcyBmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MgYW5kIHZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcy4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBkaXNhYmxlZC4iKTsKKyAgICAgICAgZGV2aWNlX2dwdV9hc3Npc3RlZC0+YWJvcnRlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyAmJiAhZGV2aWNlX2dwdV9hc3Npc3RlZC0+ZW5hYmxlZF9mZWF0dXJlcy5jb3JlLnNoYWRlckludDY0KSB7CisgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIFdhcm5pbmciLAorICAgICAgICAgICAgICAgICJzaGFkZXJJbnQ2NCBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUuICBObyBidWZmZXIgZGV2aWNlIGFkZHJlc3MgY2hlY2tpbmcgd2lsbCBiZSBhdHRlbXB0ZWQiKTsKKyAgICB9CisgICAgZGV2aWNlX2dwdV9hc3Npc3RlZC0+c2hhZGVySW50NjQgPSBkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5lbmFibGVkX2ZlYXR1cmVzLmNvcmUuc2hhZGVySW50NjQ7CisKKyAgICAvLyBJZiBhcGkgdmVyc2lvbiAxLjEgb3IgbGF0ZXIsIFNldERldmljZUxvYWRlckRhdGEgd2lsbCBiZSBpbiB0aGUgbG9hZGVyCisgICAgYXV0byBjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xPQURFUl9EQVRBX0NBTExCQUNLKTsKKyAgICBhc3NlcnQoY2hhaW5faW5mby0+dS5wZm5TZXREZXZpY2VMb2FkZXJEYXRhKTsKKyAgICBkZXZpY2VfZ3B1X2Fzc2lzdGVkLT52a1NldERldmljZUxvYWRlckRhdGEgPSBjaGFpbl9pbmZvLT51LnBmblNldERldmljZUxvYWRlckRhdGE7CisKKyAgICAvLyBTb21lIGRldmljZXMgaGF2ZSBleHRyZW1lbHkgaGlnaCBsaW1pdHMgaGVyZSwgc28gc2V0IGEgcmVhc29uYWJsZSBtYXggYmVjYXVzZSB3ZSBoYXZlIHRvIHBhZAorICAgIC8vIHRoZSBwaXBlbGluZSBsYXlvdXQgd2l0aCBkdW1teSBkZXNjcmlwdG9yIHNldCBsYXlvdXRzLgorICAgIGRldmljZV9ncHVfYXNzaXN0ZWQtPmFkanVzdGVkX21heF9kZXNjX3NldHMgPSBkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5waHlzX2Rldl9wcm9wcy5saW1pdHMubWF4Qm91bmREZXNjcmlwdG9yU2V0czsKKyAgICBkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5hZGp1c3RlZF9tYXhfZGVzY19zZXRzID0gc3RkOjptaW4oMzNVLCBkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5hZGp1c3RlZF9tYXhfZGVzY19zZXRzKTsKKworICAgIC8vIFdlIGNhbid0IGRvIGFueXRoaW5nIGlmIHRoZXJlIGlzIG9ubHkgb25lLgorICAgIC8vIERldmljZSBwcm9iYWJseSBub3QgYSBsZWdpdCBWdWxrYW4gZGV2aWNlLCBzaW5jZSB0aGVyZSBzaG91bGQgYmUgYXQgbGVhc3QgNC4gUHJvdGVjdCBvdXJzZWx2ZXMuCisgICAgaWYgKGRldmljZV9ncHVfYXNzaXN0ZWQtPmFkanVzdGVkX21heF9kZXNjX3NldHMgPT0gMSkgeworICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlIGNhbiBiaW5kIG9ubHkgYSBzaW5nbGUgZGVzY3JpcHRvciBzZXQuICBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBkaXNhYmxlZC4iKTsKKyAgICAgICAgZGV2aWNlX2dwdV9hc3Npc3RlZC0+YWJvcnRlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGV2aWNlX2dwdV9hc3Npc3RlZC0+ZGVzY19zZXRfYmluZF9pbmRleCA9IGRldmljZV9ncHVfYXNzaXN0ZWQtPmFkanVzdGVkX21heF9kZXNjX3NldHMgLSAxOworICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICJVTkFTU0lHTkVELUdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uLiAiLCAiU2hhZGVycyB1c2luZyBkZXNjcmlwdG9yIHNldCBhdCBpbmRleCAlZC4gIiwKKyAgICAgICAgICAgIGRldmljZV9ncHVfYXNzaXN0ZWQtPmRlc2Nfc2V0X2JpbmRfaW5kZXgpOworCisgICAgZGV2aWNlX2dwdV9hc3Npc3RlZC0+b3V0cHV0X2J1ZmZlcl9zaXplID0gc2l6ZW9mKHVpbnQzMl90KSAqIChzcHZ0b29sczo6a0luc3QyTWF4T3V0Q250ICsgMSk7CisgICAgVmtSZXN1bHQgcmVzdWx0MSA9IEluaXRpYWxpemVWbWEocGh5c2ljYWxEZXZpY2UsICpwRGV2aWNlLCAmZGV2aWNlX2dwdV9hc3Npc3RlZC0+dm1hQWxsb2NhdG9yKTsKKyAgICBhc3NlcnQocmVzdWx0MSA9PSBWS19TVUNDRVNTKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R3B1QXNzaXN0ZWREZXNjcmlwdG9yU2V0TWFuYWdlcj4gZGVzY19zZXRfbWFuYWdlcihuZXcgR3B1QXNzaXN0ZWREZXNjcmlwdG9yU2V0TWFuYWdlcihkZXZpY2VfZ3B1X2Fzc2lzdGVkKSk7CisKKyAgICAvLyBUaGUgZGVzY3JpcHRvciBpbmRleGluZyBjaGVja3MgcmVxdWlyZSBvbmx5IHRoZSBmaXJzdCAib3V0cHV0IiBiaW5kaW5nLgorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZGVidWdfZGVzY19sYXlvdXRfYmluZGluZ3Nba051bUJpbmRpbmdzSW5TZXRdID0geworICAgICAgICB7CisgICAgICAgICAgICAwLCAgLy8gb3V0cHV0CisgICAgICAgICAgICBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgVktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDUyB8IFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCB8IGtTaGFkZXJTdGFnZUFsbFJheVRyYWNpbmcsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAxLCAgLy8gaW5wdXQKKyAgICAgICAgICAgIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfQUxMX0dSQVBISUNTIHwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUIHwga1NoYWRlclN0YWdlQWxsUmF5VHJhY2luZywKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIDIsICAvLyBpbnB1dAorICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIFZLX1NIQURFUl9TVEFHRV9BTExfR1JBUEhJQ1MgfCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQgfCBrU2hhZGVyU3RhZ2VBbGxSYXlUcmFjaW5nLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgfSwKKyAgICB9OworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gZGVidWdfZGVzY19sYXlvdXRfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8sIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1CaW5kaW5nc0luU2V0LCBkZWJ1Z19kZXNjX2xheW91dF9iaW5kaW5nc307CisKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGR1bW15X2Rlc2NfbGF5b3V0X2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPLCBOVUxMLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfTsKKworICAgIHJlc3VsdDEgPSBEaXNwYXRjaENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoKnBEZXZpY2UsICZkZWJ1Z19kZXNjX2xheW91dF9pbmZvLCBOVUxMLCAmZGV2aWNlX2dwdV9hc3Npc3RlZC0+ZGVidWdfZGVzY19sYXlvdXQpOworCisgICAgLy8gVGhpcyBpcyBhIGxheW91dCB1c2VkIHRvICJwYWQiIGEgcGlwZWxpbmUgbGF5b3V0IHRvIGZpbGwgaW4gYW55IGdhcHMgdG8gdGhlIHNlbGVjdGVkIGJpbmQgaW5kZXguCisgICAgVmtSZXN1bHQgcmVzdWx0MiA9CisgICAgICAgIERpc3BhdGNoQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgqcERldmljZSwgJmR1bW15X2Rlc2NfbGF5b3V0X2luZm8sIE5VTEwsICZkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5kdW1teV9kZXNjX2xheW91dCk7CisgICAgYXNzZXJ0KChyZXN1bHQxID09IFZLX1NVQ0NFU1MpICYmIChyZXN1bHQyID09IFZLX1NVQ0NFU1MpKTsKKyAgICBpZiAoKHJlc3VsdDEgIT0gVktfU1VDQ0VTUykgfHwgKHJlc3VsdDIgIT0gVktfU1VDQ0VTUykpIHsKKyAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NCgqcERldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBkZXNjcmlwdG9yIHNldCBsYXlvdXQuICBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBkaXNhYmxlZC4iKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBEaXNwYXRjaERlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KCpwRGV2aWNlLCBkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5kZWJ1Z19kZXNjX2xheW91dCwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdDIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgRGlzcGF0Y2hEZXN0cm95RGVzY3JpcHRvclNldExheW91dCgqcERldmljZSwgZGV2aWNlX2dwdV9hc3Npc3RlZC0+ZHVtbXlfZGVzY19sYXlvdXQsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGRldmljZV9ncHVfYXNzaXN0ZWQtPmRlYnVnX2Rlc2NfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIGRldmljZV9ncHVfYXNzaXN0ZWQtPmR1bW15X2Rlc2NfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIGRldmljZV9ncHVfYXNzaXN0ZWQtPmFib3J0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRldmljZV9ncHVfYXNzaXN0ZWQtPmRlc2Nfc2V0X21hbmFnZXIgPSBzdGQ6Om1vdmUoZGVzY19zZXRfbWFuYWdlcik7CisKKyAgICAvLyBSZWdpc3RlciBjYWxsYmFjayB0byBiZSBjYWxsZWQgYXQgYW55IFJlc2V0Q29tbWFuZEJ1ZmZlciB0aW1lCisgICAgZGV2aWNlX2dwdV9hc3Npc3RlZC0+U2V0Q29tbWFuZEJ1ZmZlclJlc2V0Q2FsbGJhY2soCisgICAgICAgIFtkZXZpY2VfZ3B1X2Fzc2lzdGVkXShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIpIC0+IHZvaWQgeyBkZXZpY2VfZ3B1X2Fzc2lzdGVkLT5SZXNldENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXIpOyB9KTsKKworICAgIENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZUJ1aWxkVmFsaWRhdGlvblN0YXRlKGRldmljZV9ncHVfYXNzaXN0ZWQpOworfQorCit2b2lkIEdwdUFzc2lzdGVkOjpQb3N0Q2FsbFJlY29yZEdldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvRVhUICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZUFkZHJlc3MgYWRkcmVzcykgeworICAgIEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUocEluZm8tPmJ1ZmZlcik7CisgICAgLy8gVmFsaWRhdGUgYWdhaW5zdCB0aGUgc2l6ZSByZXF1ZXN0ZWQgd2hlbiB0aGUgYnVmZmVyIHdhcyBjcmVhdGVkCisgICAgaWYgKGJ1ZmZlcl9zdGF0ZSkgeworICAgICAgICBidWZmZXJfbWFwW2FkZHJlc3NdID0gYnVmZmVyX3N0YXRlLT5jcmVhdGVJbmZvLnNpemU7CisgICAgICAgIGJ1ZmZlcl9zdGF0ZS0+ZGV2aWNlQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorfQorCit2b2lkIEdwdUFzc2lzdGVkOjpQcmVDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgQlVGRkVSX1NUQVRFICpidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShidWZmZXIpOworICAgIGlmIChidWZmZXJfc3RhdGUpIGJ1ZmZlcl9tYXAuZXJhc2UoYnVmZmVyX3N0YXRlLT5kZXZpY2VBZGRyZXNzKTsKK30KKy8vIENsZWFuIHVwIGRldmljZS1yZWxhdGVkIHJlc291cmNlcwordm9pZCBHcHVBc3Npc3RlZDo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBmb3IgKGF1dG8gJnF1ZXVlX2JhcnJpZXJfY29tbWFuZF9pbmZvX2t2IDogcXVldWVfYmFycmllcl9jb21tYW5kX2luZm9zKSB7CisgICAgICAgIEdwdUFzc2lzdGVkUXVldWVCYXJyaWVyQ29tbWFuZEluZm8gJnF1ZXVlX2JhcnJpZXJfY29tbWFuZF9pbmZvID0gcXVldWVfYmFycmllcl9jb21tYW5kX2luZm9fa3Yuc2Vjb25kOworCisgICAgICAgIERpc3BhdGNoRnJlZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX3Bvb2wsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mby5iYXJyaWVyX2NvbW1hbmRfYnVmZmVyKTsKKyAgICAgICAgcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX2J1ZmZlciA9IFZLX05VTExfSEFORExFOworCisgICAgICAgIERpc3BhdGNoRGVzdHJveUNvbW1hbmRQb29sKGRldmljZSwgcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX3Bvb2wsIE5VTEwpOworICAgICAgICBxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mby5iYXJyaWVyX2NvbW1hbmRfcG9vbCA9IFZLX05VTExfSEFORExFOworICAgIH0KKyAgICBxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mb3MuY2xlYXIoKTsKKyAgICBpZiAoZGVidWdfZGVzY19sYXlvdXQpIHsKKyAgICAgICAgRGlzcGF0Y2hEZXN0cm95RGVzY3JpcHRvclNldExheW91dChkZXZpY2UsIGRlYnVnX2Rlc2NfbGF5b3V0LCBOVUxMKTsKKyAgICAgICAgZGVidWdfZGVzY19sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisgICAgaWYgKGR1bW15X2Rlc2NfbGF5b3V0KSB7CisgICAgICAgIERpc3BhdGNoRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoZGV2aWNlLCBkdW1teV9kZXNjX2xheW91dCwgTlVMTCk7CisgICAgICAgIGR1bW15X2Rlc2NfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorICAgIGRlc2Nfc2V0X21hbmFnZXIucmVzZXQoKTsKKworICAgIERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVCdWlsZFZhbGlkYXRpb25TdGF0ZSgpOworCisgICAgaWYgKHZtYUFsbG9jYXRvcikgeworICAgICAgICB2bWFEZXN0cm95QWxsb2NhdG9yKHZtYUFsbG9jYXRvcik7CisgICAgfQorfQordm9pZCBHcHVBc3Npc3RlZDo6Q3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uU3RhdGUoR3B1QXNzaXN0ZWQgKmRldmljZV9ncHVhdikgeworICAgIGlmIChkZXZpY2VfZ3B1YXYtPmFib3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gJmFzX3ZhbGlkYXRpb25fc3RhdGUgPSBkZXZpY2VfZ3B1YXYtPmFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmVfdmFsaWRhdGlvbl9zdGF0ZTsKKyAgICBpZiAoYXNfdmFsaWRhdGlvbl9zdGF0ZS5pbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9yYXlfdHJhY2luZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT3V0bGluZToKKyAgICAvLyAgIC0gQ3JlYXRlIHZhbGlkIGJvdHRvbSBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIHdoaWNoIGFjdHMgYXMgcmVwbGFjZW1lbnQKKyAgICAvLyAgICAgIC0gQ3JlYXRlIGFuZCBsb2FkIHZlcnRleCBidWZmZXIKKyAgICAvLyAgICAgIC0gQ3JlYXRlIGFuZCBsb2FkIGluZGV4IGJ1ZmZlcgorICAgIC8vICAgICAgLSBDcmVhdGUsIGFsbG9jYXRlIG1lbW9yeSBmb3IsIGFuZCBiaW5kIG1lbW9yeSBmb3IgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZQorICAgIC8vICAgICAgLSBRdWVyeSBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGhhbmRsZQorICAgIC8vICAgICAgLSBDcmVhdGUgY29tbWFuZCBwb29sIGFuZCBjb21tYW5kIGJ1ZmZlcgorICAgIC8vICAgICAgLSBSZWNvcmQgYnVpbGQgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBjb21tYW5kCisgICAgLy8gICAgICAtIFN1Ym1pdCBjb21tYW5kIGJ1ZmZlciBhbmQgd2FpdCBmb3IgY29tcGxldGlvbgorICAgIC8vICAgICAgLSBDbGVhbnVwCisgICAgLy8gIC0gQ3JlYXRlIGNvbXB1dGUgcGlwZWxpbmUgZm9yIHZhbGlkYXRpbmcgaW5zdGFuY2UgYnVmZmVycworICAgIC8vICAgICAgLSBDcmVhdGUgZGVzY3JpcHRvciBzZXQgbGF5b3V0CisgICAgLy8gICAgICAtIENyZWF0ZSBwaXBlbGluZSBsYXlvdXQKKyAgICAvLyAgICAgIC0gQ3JlYXRlIHBpcGVsaW5lCisgICAgLy8gICAgICAtIENsZWFudXAKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IFZLX1NVQ0NFU1M7CisKKyAgICBWa0J1ZmZlciB2Ym8gPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWbWFBbGxvY2F0aW9uIHZib19hbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyB2Ym9fY2kgPSB7fTsKKyAgICAgICAgdmJvX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgICAgICB2Ym9fY2kuc2l6ZSA9IHNpemVvZihmbG9hdCkgKiA5OworICAgICAgICB2Ym9fY2kudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WOworCisgICAgICAgIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIHZib19haSA9IHt9OworICAgICAgICB2Ym9fYWkudXNhZ2UgPSBWTUFfTUVNT1JZX1VTQUdFX0NQVV9UT19HUFU7CisgICAgICAgIHZib19haS5yZXF1aXJlZEZsYWdzID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQ7CisKKyAgICAgICAgcmVzdWx0ID0gdm1hQ3JlYXRlQnVmZmVyKGRldmljZV9ncHVhdi0+dm1hQWxsb2NhdG9yLCAmdmJvX2NpLCAmdmJvX2FpLCAmdmJvLCAmdmJvX2FsbG9jYXRpb24sIG51bGxwdHIpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSB2ZXJ0ZXggYnVmZmVyIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgdWludDhfdCAqbWFwcGVkX3Zib19idWZmZXIgPSBudWxscHRyOworICAgICAgICByZXN1bHQgPSB2bWFNYXBNZW1vcnkoZGV2aWNlX2dwdWF2LT52bWFBbGxvY2F0b3IsIHZib19hbGxvY2F0aW9uLCAodm9pZCAqKikmbWFwcGVkX3Zib19idWZmZXIpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG1hcCB2ZXJ0ZXggYnVmZmVyIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gdmVydGljZXMgPSB7MS4wZiwgMC4wZiwgMC4wZiwgMC41ZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CisgICAgICAgICAgICBzdGQ6Om1lbWNweShtYXBwZWRfdmJvX2J1ZmZlciwgKHVpbnQ4X3QgKil2ZXJ0aWNlcy5kYXRhKCksIHNpemVvZihmbG9hdCkgKiB2ZXJ0aWNlcy5zaXplKCkpOworICAgICAgICAgICAgdm1hVW5tYXBNZW1vcnkoZGV2aWNlX2dwdWF2LT52bWFBbGxvY2F0b3IsIHZib19hbGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZrQnVmZmVyIGlibyA9IFZLX05VTExfSEFORExFOworICAgIFZtYUFsbG9jYXRpb24gaWJvX2FsbG9jYXRpb24gPSBWS19OVUxMX0hBTkRMRTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGlib19jaSA9IHt9OworICAgICAgICBpYm9fY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgICAgIGlib19jaS5zaXplID0gc2l6ZW9mKHVpbnQzMl90KSAqIDM7CisgICAgICAgIGlib19jaS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9SQVlfVFJBQ0lOR19CSVRfTlY7CisKKyAgICAgICAgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gaWJvX2FpID0ge307CisgICAgICAgIGlib19haS51c2FnZSA9IFZNQV9NRU1PUllfVVNBR0VfQ1BVX1RPX0dQVTsKKyAgICAgICAgaWJvX2FpLnJlcXVpcmVkRmxhZ3MgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDsKKworICAgICAgICByZXN1bHQgPSB2bWFDcmVhdGVCdWZmZXIoZGV2aWNlX2dwdWF2LT52bWFBbGxvY2F0b3IsICZpYm9fY2ksICZpYm9fYWksICZpYm8sICZpYm9fYWxsb2NhdGlvbiwgbnVsbHB0cik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGluZGV4IGJ1ZmZlciBmb3IgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBidWlsZCB2YWxpZGF0aW9uLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIHVpbnQ4X3QgKm1hcHBlZF9pYm9fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcmVzdWx0ID0gdm1hTWFwTWVtb3J5KGRldmljZV9ncHVhdi0+dm1hQWxsb2NhdG9yLCBpYm9fYWxsb2NhdGlvbiwgKHZvaWQgKiopJm1hcHBlZF9pYm9fYnVmZmVyKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBtYXAgaW5kZXggYnVmZmVyIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW5kaWNpZXMgPSB7MCwgMSwgMn07CisgICAgICAgICAgICBzdGQ6Om1lbWNweShtYXBwZWRfaWJvX2J1ZmZlciwgKHVpbnQ4X3QgKilpbmRpY2llcy5kYXRhKCksIHNpemVvZih1aW50MzJfdCkgKiBpbmRpY2llcy5zaXplKCkpOworICAgICAgICAgICAgdm1hVW5tYXBNZW1vcnkoZGV2aWNlX2dwdWF2LT52bWFBbGxvY2F0b3IsIGlib19hbGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZrR2VvbWV0cnlOViBnZW9tZXRyeSA9IHt9OworICAgIGdlb21ldHJ5LnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfTlY7CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnlUeXBlID0gVktfR0VPTUVUUllfVFlQRV9UUklBTkdMRVNfTlY7CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhEYXRhID0gdmJvOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhPZmZzZXQgPSAwOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhDb3VudCA9IDM7CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLnZlcnRleFN0cmlkZSA9IDEyOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVDsKKyAgICBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhEYXRhID0gaWJvOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy5pbmRleE9mZnNldCA9IDA7CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4Q291bnQgPSAzOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy5pbmRleFR5cGUgPSBWS19JTkRFWF9UWVBFX1VJTlQzMjsKKyAgICBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMudHJhbnNmb3JtRGF0YSA9IFZLX05VTExfSEFORExFOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy50cmFuc2Zvcm1PZmZzZXQgPSAwOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LmFhYmJzID0ge307CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYXNfY2kgPSB7fTsKKyAgICBhc19jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7CisgICAgYXNfY2kuaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OVjsKKyAgICBhc19jaS5pbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WOworICAgIGFzX2NpLmluZm8uaW5zdGFuY2VDb3VudCA9IDA7CisgICAgYXNfY2kuaW5mby5nZW9tZXRyeUNvdW50ID0gMTsKKyAgICBhc19jaS5pbmZvLnBHZW9tZXRyaWVzID0gJmdlb21ldHJ5OworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGRldmljZV9ncHVhdi0+ZGV2aWNlLCAmYXNfY2ksIG51bGxwdHIsICZhc192YWxpZGF0aW9uX3N0YXRlLnJlcGxhY2VtZW50X2FzKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZV9ncHVhdi0+ZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIgYXNfbWVtX3JlcXVpcmVtZW50cyA9IHt9OworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViBhc19tZW1fcmVxdWlyZW1lbnRzX2luZm8gPSB7fTsKKyAgICAgICAgYXNfbWVtX3JlcXVpcmVtZW50c19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlY7CisgICAgICAgIGFzX21lbV9yZXF1aXJlbWVudHNfaW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WOworICAgICAgICBhc19tZW1fcmVxdWlyZW1lbnRzX2luZm8uYWNjZWxlcmF0aW9uU3RydWN0dXJlID0gYXNfdmFsaWRhdGlvbl9zdGF0ZS5yZXBsYWNlbWVudF9hczsKKworICAgICAgICBEaXNwYXRjaEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKGRldmljZV9ncHVhdi0+ZGV2aWNlLCAmYXNfbWVtX3JlcXVpcmVtZW50c19pbmZvLCAmYXNfbWVtX3JlcXVpcmVtZW50cyk7CisgICAgfQorCisgICAgVm1hQWxsb2NhdGlvbkluZm8gYXNfbWVtb3J5X2FpID0ge307CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFzX21lbW9yeV9hY2kgPSB7fTsKKyAgICAgICAgYXNfbWVtb3J5X2FjaS51c2FnZSA9IFZNQV9NRU1PUllfVVNBR0VfR1BVX09OTFk7CisKKyAgICAgICAgcmVzdWx0ID0gdm1hQWxsb2NhdGVNZW1vcnkoZGV2aWNlX2dwdWF2LT52bWFBbGxvY2F0b3IsICZhc19tZW1fcmVxdWlyZW1lbnRzLm1lbW9yeVJlcXVpcmVtZW50cywgJmFzX21lbW9yeV9hY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhc192YWxpZGF0aW9uX3N0YXRlLnJlcGxhY2VtZW50X2FzX2FsbG9jYXRpb24sICZhc19tZW1vcnlfYWkpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlX2dwdWF2LT5kZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2MgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBtZW1vcnkgZm9yIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYnVpbGQgdmFsaWRhdGlvbi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgYXNfYmluZF9pbmZvID0ge307CisgICAgICAgIGFzX2JpbmRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfSU5GT19OVjsKKyAgICAgICAgYXNfYmluZF9pbmZvLmFjY2VsZXJhdGlvblN0cnVjdHVyZSA9IGFzX3ZhbGlkYXRpb25fc3RhdGUucmVwbGFjZW1lbnRfYXM7CisgICAgICAgIGFzX2JpbmRfaW5mby5tZW1vcnkgPSBhc19tZW1vcnlfYWkuZGV2aWNlTWVtb3J5OworICAgICAgICBhc19iaW5kX2luZm8ubWVtb3J5T2Zmc2V0ID0gYXNfbWVtb3J5X2FpLm9mZnNldDsKKworICAgICAgICByZXN1bHQgPSBEaXNwYXRjaEJpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXZpY2VfZ3B1YXYtPmRldmljZSwgMSwgJmFzX2JpbmRfaW5mbyk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2VfZ3B1YXYtPmRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBiaW5kIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgbWVtb3J5IGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVihkZXZpY2VfZ3B1YXYtPmRldmljZSwgYXNfdmFsaWRhdGlvbl9zdGF0ZS5yZXBsYWNlbWVudF9hcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDY0X3QpLCAmYXNfdmFsaWRhdGlvbl9zdGF0ZS5yZXBsYWNlbWVudF9hc19oYW5kbGUpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlX2dwdWF2LT5kZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaGFuZGxlIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIgc2NyYXRjaF9tZW1fcmVxdWlyZW1lbnRzID0ge307CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WIHNjcmF0Y2hfbWVtX3JlcXVpcmVtZW50c19pbmZvID0ge307CisgICAgICAgIHNjcmF0Y2hfbWVtX3JlcXVpcmVtZW50c19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlY7CisgICAgICAgIHNjcmF0Y2hfbWVtX3JlcXVpcmVtZW50c19pbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9CVUlMRF9TQ1JBVENIX05WOworICAgICAgICBzY3JhdGNoX21lbV9yZXF1aXJlbWVudHNfaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBhc192YWxpZGF0aW9uX3N0YXRlLnJlcGxhY2VtZW50X2FzOworCisgICAgICAgIERpc3BhdGNoR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYoZGV2aWNlX2dwdWF2LT5kZXZpY2UsICZzY3JhdGNoX21lbV9yZXF1aXJlbWVudHNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9tZW1fcmVxdWlyZW1lbnRzKTsKKyAgICB9CisKKyAgICBWa0J1ZmZlciBzY3JhdGNoID0gVktfTlVMTF9IQU5ETEU7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBzY3JhdGNoX2NpID0ge307CisgICAgICAgIHNjcmF0Y2hfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgICAgIHNjcmF0Y2hfY2kuc2l6ZSA9IHNjcmF0Y2hfbWVtX3JlcXVpcmVtZW50cy5tZW1vcnlSZXF1aXJlbWVudHMuc2l6ZTsKKyAgICAgICAgc2NyYXRjaF9jaS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9SQVlfVFJBQ0lOR19CSVRfTlY7CisKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVCdWZmZXIoZGV2aWNlX2dwdWF2LT5kZXZpY2UsICZzY3JhdGNoX2NpLCBudWxscHRyLCAmc2NyYXRjaCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2VfZ3B1YXYtPmRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgc2NyYXRjaCBidWZmZXIgZm9yIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYnVpbGQgdmFsaWRhdGlvbi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZtYUFsbG9jYXRpb24gc2NyYXRjaF9hbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7CisgICAgVm1hQWxsb2NhdGlvbkluZm8gc2NyYXRjaF9hbGxvY2F0aW9uX2luZm8gPSB7fTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gc2NyYXRjaF9hY2kgPSB7fTsKKyAgICAgICAgc2NyYXRjaF9hY2kudXNhZ2UgPSBWTUFfTUVNT1JZX1VTQUdFX0dQVV9PTkxZOworCisgICAgICAgIHJlc3VsdCA9IHZtYUFsbG9jYXRlTWVtb3J5KGRldmljZV9ncHVhdi0+dm1hQWxsb2NhdG9yLCAmc2NyYXRjaF9tZW1fcmVxdWlyZW1lbnRzLm1lbW9yeVJlcXVpcmVtZW50cywgJnNjcmF0Y2hfYWNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9hbGxvY2F0aW9uLCAmc2NyYXRjaF9hbGxvY2F0aW9uX2luZm8pOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlX2dwdWF2LT5kZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2Mgc2NyYXRjaCBtZW1vcnkgZm9yIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYnVpbGQgdmFsaWRhdGlvbi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXN1bHQgPSBEaXNwYXRjaEJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlX2dwdWF2LT5kZXZpY2UsIHNjcmF0Y2gsIHNjcmF0Y2hfYWxsb2NhdGlvbl9pbmZvLmRldmljZU1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfYWxsb2NhdGlvbl9pbmZvLm9mZnNldCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2VfZ3B1YXYtPmRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBiaW5kIHNjcmF0Y2ggbWVtb3J5IGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWa0NvbW1hbmRQb29sIGNvbW1hbmRfcG9vbCA9IFZLX05VTExfSEFORExFOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBjb21tYW5kX3Bvb2xfY2kgPSB7fTsKKyAgICAgICAgY29tbWFuZF9wb29sX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPOworICAgICAgICBjb21tYW5kX3Bvb2xfY2kucXVldWVGYW1pbHlJbmRleCA9IDA7CisKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVDb21tYW5kUG9vbChkZXZpY2VfZ3B1YXYtPmRldmljZSwgJmNvbW1hbmRfcG9vbF9jaSwgbnVsbHB0ciwgJmNvbW1hbmRfcG9vbCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2VfZ3B1YXYtPmRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgY29tbWFuZCBwb29sIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWkgPSB7fTsKKyAgICAgICAgY29tbWFuZF9idWZmZXJfYWkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgICAgICBjb21tYW5kX2J1ZmZlcl9haS5jb21tYW5kUG9vbCA9IGNvbW1hbmRfcG9vbDsKKyAgICAgICAgY29tbWFuZF9idWZmZXJfYWkuY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgY29tbWFuZF9idWZmZXJfYWkubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworCisgICAgICAgIHJlc3VsdCA9IERpc3BhdGNoQWxsb2NhdGVDb21tYW5kQnVmZmVycyhkZXZpY2VfZ3B1YXYtPmRldmljZSwgJmNvbW1hbmRfYnVmZmVyX2FpLCAmY29tbWFuZF9idWZmZXIpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlX2dwdWF2LT5kZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGNvbW1hbmQgYnVmZmVyIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBIb29rIHVwIGNvbW1hbmQgYnVmZmVyIGRpc3BhdGNoCisgICAgICAgIGRldmljZV9ncHVhdi0+dmtTZXREZXZpY2VMb2FkZXJEYXRhKGRldmljZV9ncHVhdi0+ZGV2aWNlLCBjb21tYW5kX2J1ZmZlcik7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb21tYW5kX2J1ZmZlcl9iaSA9IHt9OworICAgICAgICBjb21tYW5kX2J1ZmZlcl9iaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXIsICZjb21tYW5kX2J1ZmZlcl9iaSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2VfZ3B1YXYtPmRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBiZWdpbiBjb21tYW5kIGJ1ZmZlciBmb3IgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBidWlsZCB2YWxpZGF0aW9uLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIERpc3BhdGNoQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kX2J1ZmZlciwgJmFzX2NpLmluZm8sIFZLX05VTExfSEFORExFLCAwLCBWS19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX3ZhbGlkYXRpb25fc3RhdGUucmVwbGFjZW1lbnRfYXMsIFZLX05VTExfSEFORExFLCBzY3JhdGNoLCAwKTsKKyAgICAgICAgRGlzcGF0Y2hFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyKTsKKyAgICB9CisKKyAgICBWa1F1ZXVlIHF1ZXVlID0gVktfTlVMTF9IQU5ETEU7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIERpc3BhdGNoR2V0RGV2aWNlUXVldWUoZGV2aWNlX2dwdWF2LT5kZXZpY2UsIDAsIDAsICZxdWV1ZSk7CisKKyAgICAgICAgLy8gSG9vayB1cCBxdWV1ZSBkaXNwYXRjaAorICAgICAgICBkZXZpY2VfZ3B1YXYtPnZrU2V0RGV2aWNlTG9hZGVyRGF0YShkZXZpY2VfZ3B1YXYtPmRldmljZSwgcXVldWUpOworCisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZF9idWZmZXI7CisgICAgICAgIHJlc3VsdCA9IERpc3BhdGNoUXVldWVTdWJtaXQocXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlX2dwdWF2LT5kZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc3VibWl0IGNvbW1hbmQgYnVmZmVyIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hRdWV1ZVdhaXRJZGxlKHF1ZXVlKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZV9ncHVhdi0+ZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdhaXQgZm9yIHF1ZXVlIGlkbGUgZm9yIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYnVpbGQgdmFsaWRhdGlvbi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2Ym8gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdm1hRGVzdHJveUJ1ZmZlcihkZXZpY2VfZ3B1YXYtPnZtYUFsbG9jYXRvciwgdmJvLCB2Ym9fYWxsb2NhdGlvbik7CisgICAgfQorICAgIGlmIChpYm8gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdm1hRGVzdHJveUJ1ZmZlcihkZXZpY2VfZ3B1YXYtPnZtYUFsbG9jYXRvciwgaWJvLCBpYm9fYWxsb2NhdGlvbik7CisgICAgfQorICAgIGlmIChzY3JhdGNoICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIERpc3BhdGNoRGVzdHJveUJ1ZmZlcihkZXZpY2VfZ3B1YXYtPmRldmljZSwgc2NyYXRjaCwgbnVsbHB0cik7CisgICAgICAgIHZtYUZyZWVNZW1vcnkoZGV2aWNlX2dwdWF2LT52bWFBbGxvY2F0b3IsIHNjcmF0Y2hfYWxsb2NhdGlvbik7CisgICAgfQorICAgIGlmIChjb21tYW5kX3Bvb2wgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgRGlzcGF0Y2hEZXN0cm95Q29tbWFuZFBvb2woZGV2aWNlX2dwdWF2LT5kZXZpY2UsIGNvbW1hbmRfcG9vbCwgbnVsbHB0cik7CisgICAgfQorCisgICAgaWYgKGRldmljZV9ncHVhdi0+ZGVidWdfZGVzY19sYXlvdXQgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2VfZ3B1YXYtPmRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgZGVzY3JpcHRvciBzZXQgbGF5b3V0IGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIHJlc3VsdCA9IFZLX0lOQ09NUExFVEU7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHBpcGVsaW5lX2xheW91dF9jaSA9IHt9OworICAgICAgICBwaXBlbGluZV9sYXlvdXRfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk87CisgICAgICAgIHBpcGVsaW5lX2xheW91dF9jaS5zZXRMYXlvdXRDb3VudCA9IDE7CisgICAgICAgIHBpcGVsaW5lX2xheW91dF9jaS5wU2V0TGF5b3V0cyA9ICZkZXZpY2VfZ3B1YXYtPmRlYnVnX2Rlc2NfbGF5b3V0OworICAgICAgICByZXN1bHQgPSBEaXNwYXRjaENyZWF0ZVBpcGVsaW5lTGF5b3V0KGRldmljZV9ncHVhdi0+ZGV2aWNlLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCAwLCAmYXNfdmFsaWRhdGlvbl9zdGF0ZS5waXBlbGluZV9sYXlvdXQpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlX2dwdWF2LT5kZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHBpcGVsaW5lIGxheW91dCBmb3IgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBidWlsZCB2YWxpZGF0aW9uLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgVmtTaGFkZXJNb2R1bGUgc2hhZGVyX21vZHVsZSA9IFZLX05VTExfSEFORExFOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gc2hhZGVyX21vZHVsZV9jaSA9IHt9OworICAgICAgICBzaGFkZXJfbW9kdWxlX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgc2hhZGVyX21vZHVsZV9jaS5jb2RlU2l6ZSA9IHNpemVvZihrQ29tcHV0ZVNoYWRlclNwaXJ2KTsKKyAgICAgICAgc2hhZGVyX21vZHVsZV9jaS5wQ29kZSA9ICh1aW50MzJfdCAqKWtDb21wdXRlU2hhZGVyU3BpcnY7CisKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVTaGFkZXJNb2R1bGUoZGV2aWNlX2dwdWF2LT5kZXZpY2UsICZzaGFkZXJfbW9kdWxlX2NpLCBudWxscHRyLCAmc2hhZGVyX21vZHVsZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2VfZ3B1YXYtPmRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgY29tcHV0ZSBzaGFkZXIgbW9kdWxlIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBwaXBlbGluZV9zdGFnZV9jaSA9IHt9OworICAgICAgICBwaXBlbGluZV9zdGFnZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgcGlwZWxpbmVfc3RhZ2VfY2kuc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQ7CisgICAgICAgIHBpcGVsaW5lX3N0YWdlX2NpLm1vZHVsZSA9IHNoYWRlcl9tb2R1bGU7CisgICAgICAgIHBpcGVsaW5lX3N0YWdlX2NpLnBOYW1lID0gIm1haW4iOworCisgICAgICAgIFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyBwaXBlbGluZV9jaSA9IHt9OworICAgICAgICBwaXBlbGluZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk87CisgICAgICAgIHBpcGVsaW5lX2NpLnN0YWdlID0gcGlwZWxpbmVfc3RhZ2VfY2k7CisgICAgICAgIHBpcGVsaW5lX2NpLmxheW91dCA9IGFzX3ZhbGlkYXRpb25fc3RhdGUucGlwZWxpbmVfbGF5b3V0OworCisgICAgICAgIHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhkZXZpY2VfZ3B1YXYtPmRldmljZSwgVktfTlVMTF9IQU5ETEUsIDEsICZwaXBlbGluZV9jaSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhc192YWxpZGF0aW9uX3N0YXRlLnBpcGVsaW5lKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZV9ncHVhdi0+ZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBjb21wdXRlIHBpcGVsaW5lIGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkIHZhbGlkYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hhZGVyX21vZHVsZSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICBEaXNwYXRjaERlc3Ryb3lTaGFkZXJNb2R1bGUoZGV2aWNlX2dwdWF2LT5kZXZpY2UsIHNoYWRlcl9tb2R1bGUsIG51bGxwdHIpOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBhc192YWxpZGF0aW9uX3N0YXRlLmluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGRldmljZV9ncHVhdi0+ZGV2aWNlKSwgIlVOQVNTSUdORUQtR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24uIiwKKyAgICAgICAgICAgICAgICAiQWNjZWxlcmF0aW9uIFN0cnVjdHVyZSBCdWlsZGluZyBHUFUgVmFsaWRhdGlvbiBFbmFibGVkLiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZV9ncHVhdi0+YWJvcnRlZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIEdwdUFzc2lzdGVkOjpEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uU3RhdGUoKSB7CisgICAgYXV0byAmYXNfdmFsaWRhdGlvbl9zdGF0ZSA9IGFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmVfdmFsaWRhdGlvbl9zdGF0ZTsKKyAgICBpZiAoYXNfdmFsaWRhdGlvbl9zdGF0ZS5waXBlbGluZSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICBEaXNwYXRjaERlc3Ryb3lQaXBlbGluZShkZXZpY2UsIGFzX3ZhbGlkYXRpb25fc3RhdGUucGlwZWxpbmUsIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAoYXNfdmFsaWRhdGlvbl9zdGF0ZS5waXBlbGluZV9sYXlvdXQgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgRGlzcGF0Y2hEZXN0cm95UGlwZWxpbmVMYXlvdXQoZGV2aWNlLCBhc192YWxpZGF0aW9uX3N0YXRlLnBpcGVsaW5lX2xheW91dCwgbnVsbHB0cik7CisgICAgfQorICAgIGlmIChhc192YWxpZGF0aW9uX3N0YXRlLnJlcGxhY2VtZW50X2FzICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIERpc3BhdGNoRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGRldmljZSwgYXNfdmFsaWRhdGlvbl9zdGF0ZS5yZXBsYWNlbWVudF9hcywgbnVsbHB0cik7CisgICAgfQorICAgIGlmIChhc192YWxpZGF0aW9uX3N0YXRlLnJlcGxhY2VtZW50X2FzX2FsbG9jYXRpb24gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdm1hRnJlZU1lbW9yeSh2bWFBbGxvY2F0b3IsIGFzX3ZhbGlkYXRpb25fc3RhdGUucmVwbGFjZW1lbnRfYXNfYWxsb2NhdGlvbik7CisgICAgfQorfQorCitzdHJ1Y3QgR1BVQVZfUkVTVE9SQUJMRV9QSVBFTElORV9TVEFURSB7CisgICAgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZV9iaW5kX3BvaW50ID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9NQVhfRU5VTTsKKyAgICBWa1BpcGVsaW5lIHBpcGVsaW5lID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZV9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXQ+IGRlc2NyaXB0b3Jfc2V0czsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50MzJfdD4+IGR5bmFtaWNfb2Zmc2V0czsKKyAgICB1aW50MzJfdCBwdXNoX2Rlc2NyaXB0b3Jfc2V0X2luZGV4ID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxzYWZlX1ZrV3JpdGVEZXNjcmlwdG9yU2V0PiBwdXNoX2Rlc2NyaXB0b3Jfc2V0X3dyaXRlczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwdXNoX2NvbnN0YW50c19kYXRhOworICAgIFB1c2hDb25zdGFudFJhbmdlc0lkIHB1c2hfY29uc3RhbnRzX3JhbmdlczsKKworICAgIHZvaWQgQ3JlYXRlKENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLCBWa1BpcGVsaW5lQmluZFBvaW50IGJpbmRfcG9pbnQpIHsKKyAgICAgICAgcGlwZWxpbmVfYmluZF9wb2ludCA9IGJpbmRfcG9pbnQ7CisKKyAgICAgICAgTEFTVF9CT1VORF9TVEFURSAmbGFzdF9ib3VuZCA9IGNiX3N0YXRlLT5sYXN0Qm91bmRbYmluZF9wb2ludF07CisgICAgICAgIGlmIChsYXN0X2JvdW5kLnBpcGVsaW5lX3N0YXRlKSB7CisgICAgICAgICAgICBwaXBlbGluZSA9IGxhc3RfYm91bmQucGlwZWxpbmVfc3RhdGUtPnBpcGVsaW5lOworICAgICAgICAgICAgcGlwZWxpbmVfbGF5b3V0ID0gbGFzdF9ib3VuZC5waXBlbGluZV9sYXlvdXQ7CisgICAgICAgICAgICBkZXNjcmlwdG9yX3NldHMucmVzZXJ2ZShsYXN0X2JvdW5kLnBlcl9zZXQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBsYXN0X2JvdW5kLnBlcl9zZXQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICpib3VuZF9kZXNjcmlwdG9yX3NldCA9IGxhc3RfYm91bmQucGVyX3NldFtpXS5ib3VuZF9kZXNjcmlwdG9yX3NldDsKKworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Jfc2V0cy5wdXNoX2JhY2soYm91bmRfZGVzY3JpcHRvcl9zZXQtPkdldFNldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYm91bmRfZGVzY3JpcHRvcl9zZXQtPklzUHVzaERlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICBwdXNoX2Rlc2NyaXB0b3Jfc2V0X2luZGV4ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkeW5hbWljX29mZnNldHMucHVzaF9iYWNrKGxhc3RfYm91bmQucGVyX3NldFtpXS5keW5hbWljT2Zmc2V0cyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXN0X2JvdW5kLnB1c2hfZGVzY3JpcHRvcl9zZXQpIHsKKyAgICAgICAgICAgICAgICBwdXNoX2Rlc2NyaXB0b3Jfc2V0X3dyaXRlcyA9IGxhc3RfYm91bmQucHVzaF9kZXNjcmlwdG9yX3NldC0+R2V0V3JpdGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdF9ib3VuZC5waXBlbGluZV9zdGF0ZS0+cGlwZWxpbmVfbGF5b3V0LT5wdXNoX2NvbnN0YW50X3JhbmdlcyA9PSBjYl9zdGF0ZS0+cHVzaF9jb25zdGFudF9kYXRhX3JhbmdlcykgeworICAgICAgICAgICAgICAgIHB1c2hfY29uc3RhbnRzX2RhdGEgPSBjYl9zdGF0ZS0+cHVzaF9jb25zdGFudF9kYXRhOworICAgICAgICAgICAgICAgIHB1c2hfY29uc3RhbnRzX3JhbmdlcyA9IGxhc3RfYm91bmQucGlwZWxpbmVfc3RhdGUtPnBpcGVsaW5lX2xheW91dC0+cHVzaF9jb25zdGFudF9yYW5nZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFJlc3RvcmUoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyKSBjb25zdCB7CisgICAgICAgIGlmIChwaXBlbGluZSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgRGlzcGF0Y2hDbWRCaW5kUGlwZWxpbmUoY29tbWFuZF9idWZmZXIsIHBpcGVsaW5lX2JpbmRfcG9pbnQsIHBpcGVsaW5lKTsKKyAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcl9zZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl9zZXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldCA9IGRlc2NyaXB0b3Jfc2V0c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3Jfc2V0ICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEaXNwYXRjaENtZEJpbmREZXNjcmlwdG9yU2V0cyhjb21tYW5kX2J1ZmZlciwgcGlwZWxpbmVfYmluZF9wb2ludCwgcGlwZWxpbmVfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGkpLCAxLCAmZGVzY3JpcHRvcl9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHluYW1pY19vZmZzZXRzW2ldLnNpemUoKSksIGR5bmFtaWNfb2Zmc2V0c1tpXS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwdXNoX2Rlc2NyaXB0b3Jfc2V0X3dyaXRlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgRGlzcGF0Y2hDbWRQdXNoRGVzY3JpcHRvclNldEtIUihjb21tYW5kX2J1ZmZlciwgcGlwZWxpbmVfYmluZF9wb2ludCwgcGlwZWxpbmVfbGF5b3V0LCBwdXNoX2Rlc2NyaXB0b3Jfc2V0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHB1c2hfZGVzY3JpcHRvcl9zZXRfd3JpdGVzLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICo+KHB1c2hfZGVzY3JpcHRvcl9zZXRfd3JpdGVzLmRhdGEoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZwdXNoX2NvbnN0YW50X3JhbmdlIDogKnB1c2hfY29uc3RhbnRzX3JhbmdlcykgeworICAgICAgICAgICAgICAgIGlmIChwdXNoX2NvbnN0YW50X3JhbmdlLnNpemUgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgRGlzcGF0Y2hDbWRQdXNoQ29uc3RhbnRzKGNvbW1hbmRfYnVmZmVyLCBwaXBlbGluZV9sYXlvdXQsIHB1c2hfY29uc3RhbnRfcmFuZ2Uuc3RhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF9jb25zdGFudF9yYW5nZS5vZmZzZXQsIHB1c2hfY29uc3RhbnRfcmFuZ2Uuc2l6ZSwgcHVzaF9jb25zdGFudHNfZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKwordm9pZCBHcHVBc3Npc3RlZDo6UHJlQ2FsbFJlY29yZENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViAqcEluZm8sIFZrQnVmZmVyIGluc3RhbmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBpbnN0YW5jZU9mZnNldCwgVmtCb29sMzIgdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgc2NyYXRjaCwgVmtEZXZpY2VTaXplIHNjcmF0Y2hPZmZzZXQpIHsKKyAgICBpZiAocEluZm8gPT0gbnVsbHB0ciB8fCBwSW5mby0+dHlwZSAhPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfVE9QX0xFVkVMX05WKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvICZhc192YWxpZGF0aW9uX3N0YXRlID0gYWNjZWxlcmF0aW9uX3N0cnVjdHVyZV92YWxpZGF0aW9uX3N0YXRlOworICAgIGlmICghYXNfdmFsaWRhdGlvbl9zdGF0ZS5pbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRW1wdHkgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWMuCisgICAgaWYgKHBJbmZvLT5pbnN0YW5jZUNvdW50ID09IDAgfHwgaW5zdGFuY2VEYXRhID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXNzZXJ0KGNiX3N0YXRlICE9IG51bGxwdHIpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGN1cnJlbnRfdmFsaWRfaGFuZGxlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFzX3N0YXRlX2t2IDogYWNjZWxlcmF0aW9uU3RydWN0dXJlTWFwKSB7CisgICAgICAgIGNvbnN0IEFDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfU1RBVEUgJmFzX3N0YXRlID0gKmFzX3N0YXRlX2t2LnNlY29uZDsKKyAgICAgICAgaWYgKGFzX3N0YXRlLmJ1aWx0ICYmIGFzX3N0YXRlLmNyZWF0ZV9pbmZvLmluZm8udHlwZSA9PSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WKSB7CisgICAgICAgICAgICBjdXJyZW50X3ZhbGlkX2hhbmRsZXMucHVzaF9iYWNrKGFzX3N0YXRlLm9wYXF1ZV9oYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgR3B1QXNzaXN0ZWRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVCdWlsZFZhbGlkYXRpb25CdWZmZXJJbmZvIGFzX3ZhbGlkYXRpb25fYnVmZmVyX2luZm8gPSB7fTsKKyAgICBhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLmFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmUgPSBkc3Q7CisKKyAgICBjb25zdCBWa0RldmljZVNpemUgdmFsaWRhdGlvbl9idWZmZXJfc2l6ZSA9CisgICAgICAgIC8vIE9uZSB1aW50IGZvciBudW1iZXIgb2YgaW5zdGFuY2VzIHRvIHZhbGlkYXRlCisgICAgICAgIDQgKworICAgICAgICAvLyBUd28gdWludCBmb3IgdGhlIHJlcGxhY2VtZW50IGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaGFuZGxlCisgICAgICAgIDggKworICAgICAgICAvLyBPbmUgdWludCBmb3IgbnVtYmVyIG9mIGludmFsaWQgaGFuZGxlcyBmb3VuZAorICAgICAgICA0ICsKKyAgICAgICAgLy8gVHdvIHVpbnQgZm9yIHRoZSBmaXJzdCBpbnZhbGlkIGhhbmRsZSBmb3VuZAorICAgICAgICA4ICsKKyAgICAgICAgLy8gT25lIHVpbnQgZm9yIHRoZSBudW1iZXIgb2YgY3VycmVudCB2YWxpZCBoYW5kbGVzCisgICAgICAgIDQgKworICAgICAgICAvLyBUd28gdWludCBmb3IgZWFjaCBjdXJyZW50IHZhbGlkIGhhbmRsZQorICAgICAgICAoOCAqIGN1cnJlbnRfdmFsaWRfaGFuZGxlcy5zaXplKCkpOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIHZhbGlkYXRpb25fYnVmZmVyX2NyZWF0ZV9pbmZvID0ge307CisgICAgdmFsaWRhdGlvbl9idWZmZXJfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgdmFsaWRhdGlvbl9idWZmZXJfY3JlYXRlX2luZm8uc2l6ZSA9IHZhbGlkYXRpb25fYnVmZmVyX3NpemU7CisgICAgdmFsaWRhdGlvbl9idWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklUOworCisgICAgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gdmFsaWRhdGlvbl9idWZmZXJfYWxsb2NfaW5mbyA9IHt9OworICAgIHZhbGlkYXRpb25fYnVmZmVyX2FsbG9jX2luZm8ucmVxdWlyZWRGbGFncyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUOworCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdm1hQ3JlYXRlQnVmZmVyKHZtYUFsbG9jYXRvciwgJnZhbGlkYXRpb25fYnVmZmVyX2NyZWF0ZV9pbmZvLCAmdmFsaWRhdGlvbl9idWZmZXJfYWxsb2NfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzX3ZhbGlkYXRpb25fYnVmZmVyX2luZm8udmFsaWRhdGlvbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLnZhbGlkYXRpb25fYnVmZmVyX2FsbG9jYXRpb24sIG51bGxwdHIpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuICBEZXZpY2UgY291bGQgYmVjb21lIHVuc3RhYmxlLiIpOworICAgICAgICBhYm9ydGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdwdUFjY2VsZXJhdGlvblN0cnVjdHVyZUJ1aWxkVmFsaWRhdGlvbkJ1ZmZlciAqbWFwcGVkX3ZhbGlkYXRpb25fYnVmZmVyID0gbnVsbHB0cjsKKyAgICByZXN1bHQgPSB2bWFNYXBNZW1vcnkodm1hQWxsb2NhdG9yLCBhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLnZhbGlkYXRpb25fYnVmZmVyX2FsbG9jYXRpb24sICh2b2lkICoqKSZtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXIpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkgZm9yIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYnVpbGQgdmFsIGJ1ZmZlci4iKTsKKyAgICAgICAgYWJvcnRlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXItPmluc3RhbmNlc190b192YWxpZGF0ZSA9IHBJbmZvLT5pbnN0YW5jZUNvdW50OworICAgIG1hcHBlZF92YWxpZGF0aW9uX2J1ZmZlci0+cmVwbGFjZW1lbnRfaGFuZGxlX2JpdHNfMCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oJmFzX3ZhbGlkYXRpb25fc3RhdGUucmVwbGFjZW1lbnRfYXNfaGFuZGxlKVswXTsKKyAgICBtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXItPnJlcGxhY2VtZW50X2hhbmRsZV9iaXRzXzEgPQorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KCZhc192YWxpZGF0aW9uX3N0YXRlLnJlcGxhY2VtZW50X2FzX2hhbmRsZSlbMV07CisgICAgbWFwcGVkX3ZhbGlkYXRpb25fYnVmZmVyLT5pbnZhbGlkX2hhbmRsZV9mb3VuZCA9IDA7CisgICAgbWFwcGVkX3ZhbGlkYXRpb25fYnVmZmVyLT5pbnZhbGlkX2hhbmRsZV9iaXRzXzAgPSAwOworICAgIG1hcHBlZF92YWxpZGF0aW9uX2J1ZmZlci0+aW52YWxpZF9oYW5kbGVfYml0c18xID0gMDsKKyAgICBtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXItPnZhbGlkX2hhbmRsZXNfY291bnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY3VycmVudF92YWxpZF9oYW5kbGVzLnNpemUoKSk7CisKKyAgICB1aW50MzJfdCAqbWFwcGVkX3ZhbGlkX2hhbmRsZXMgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90ICo+KCZtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXJbMV0pOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBjdXJyZW50X3ZhbGlkX2hhbmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgY3VycmVudF92YWxpZF9oYW5kbGUgPSBjdXJyZW50X3ZhbGlkX2hhbmRsZXNbaV07CisKKyAgICAgICAgKm1hcHBlZF92YWxpZF9oYW5kbGVzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigmY3VycmVudF92YWxpZF9oYW5kbGUpWzBdOworICAgICAgICArK21hcHBlZF92YWxpZF9oYW5kbGVzOworICAgICAgICAqbWFwcGVkX3ZhbGlkX2hhbmRsZXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KCZjdXJyZW50X3ZhbGlkX2hhbmRsZSlbMV07CisgICAgICAgICsrbWFwcGVkX3ZhbGlkX2hhbmRsZXM7CisgICAgfQorCisgICAgdm1hVW5tYXBNZW1vcnkodm1hQWxsb2NhdG9yLCBhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLnZhbGlkYXRpb25fYnVmZmVyX2FsbG9jYXRpb24pOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBWa0RldmljZVNpemUga0luc3RhbmNlU2l6ZSA9IDY0OworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBpbnN0YW5jZV9idWZmZXJfc2l6ZSA9IGtJbnN0YW5jZVNpemUgKiBwSW5mby0+aW5zdGFuY2VDb3VudDsKKworICAgIHJlc3VsdCA9CisgICAgICAgIGRlc2Nfc2V0X21hbmFnZXItPkdldERlc2NyaXB0b3JTZXQoJmFzX3ZhbGlkYXRpb25fYnVmZmVyX2luZm8uZGVzY3JpcHRvcl9wb29sLCAmYXNfdmFsaWRhdGlvbl9idWZmZXJfaW5mby5kZXNjcmlwdG9yX3NldCk7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IGRlc2NyaXB0b3Igc2V0IGZvciBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGJ1aWxkLiIpOworICAgICAgICBhYm9ydGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gZGVzY3JpcHRvcl9idWZmZXJfaW5mb3NbMl0gPSB7fTsKKyAgICBkZXNjcmlwdG9yX2J1ZmZlcl9pbmZvc1swXS5idWZmZXIgPSBpbnN0YW5jZURhdGE7CisgICAgZGVzY3JpcHRvcl9idWZmZXJfaW5mb3NbMF0ub2Zmc2V0ID0gaW5zdGFuY2VPZmZzZXQ7CisgICAgZGVzY3JpcHRvcl9idWZmZXJfaW5mb3NbMF0ucmFuZ2UgPSBpbnN0YW5jZV9idWZmZXJfc2l6ZTsKKyAgICBkZXNjcmlwdG9yX2J1ZmZlcl9pbmZvc1sxXS5idWZmZXIgPSBhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLnZhbGlkYXRpb25fYnVmZmVyOworICAgIGRlc2NyaXB0b3JfYnVmZmVyX2luZm9zWzFdLm9mZnNldCA9IDA7CisgICAgZGVzY3JpcHRvcl9idWZmZXJfaW5mb3NbMV0ucmFuZ2UgPSB2YWxpZGF0aW9uX2J1ZmZlcl9zaXplOworCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXRfd3JpdGVzWzJdID0ge307CisgICAgZGVzY3JpcHRvcl9zZXRfd3JpdGVzWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgZGVzY3JpcHRvcl9zZXRfd3JpdGVzWzBdLmRzdFNldCA9IGFzX3ZhbGlkYXRpb25fYnVmZmVyX2luZm8uZGVzY3JpcHRvcl9zZXQ7CisgICAgZGVzY3JpcHRvcl9zZXRfd3JpdGVzWzBdLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfc2V0X3dyaXRlc1swXS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRlc2NyaXB0b3Jfc2V0X3dyaXRlc1swXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjsKKyAgICBkZXNjcmlwdG9yX3NldF93cml0ZXNbMF0ucEJ1ZmZlckluZm8gPSAmZGVzY3JpcHRvcl9idWZmZXJfaW5mb3NbMF07CisgICAgZGVzY3JpcHRvcl9zZXRfd3JpdGVzWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgZGVzY3JpcHRvcl9zZXRfd3JpdGVzWzFdLmRzdFNldCA9IGFzX3ZhbGlkYXRpb25fYnVmZmVyX2luZm8uZGVzY3JpcHRvcl9zZXQ7CisgICAgZGVzY3JpcHRvcl9zZXRfd3JpdGVzWzFdLmRzdEJpbmRpbmcgPSAxOworICAgIGRlc2NyaXB0b3Jfc2V0X3dyaXRlc1sxXS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRlc2NyaXB0b3Jfc2V0X3dyaXRlc1sxXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjsKKyAgICBkZXNjcmlwdG9yX3NldF93cml0ZXNbMV0ucEJ1ZmZlckluZm8gPSAmZGVzY3JpcHRvcl9idWZmZXJfaW5mb3NbMV07CisKKyAgICBEaXNwYXRjaFVwZGF0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgMiwgZGVzY3JpcHRvcl9zZXRfd3JpdGVzLCAwLCBudWxscHRyKTsKKworICAgIC8vIElzc3VlIGEgbWVtb3J5IGJhcnJpZXIgdG8gbWFrZSBzdXJlIGFueXRoaW5nIHdyaXRpbmcgdG8gdGhlIGluc3RhbmNlIGJ1ZmZlciBoYXMgZmluaXNoZWQuCisgICAgVmtNZW1vcnlCYXJyaWVyIG1lbW9yeV9iYXJyaWVyID0ge307CisgICAgbWVtb3J5X2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQkFSUklFUjsKKyAgICBtZW1vcnlfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX01FTU9SWV9XUklURV9CSVQ7CisgICAgbWVtb3J5X2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQ7CisgICAgRGlzcGF0Y2hDbWRQaXBlbGluZUJhcnJpZXIoY29tbWFuZEJ1ZmZlciwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklULCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW1vcnlfYmFycmllciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cik7CisKKyAgICAvLyBTYXZlIGEgY29weSBvZiB0aGUgY29tcHV0ZSBwaXBlbGluZSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHJlc3RvcmVkLgorICAgIEdQVUFWX1JFU1RPUkFCTEVfUElQRUxJTkVfU1RBVEUgcmVzdG9yYWJsZV9zdGF0ZTsKKyAgICByZXN0b3JhYmxlX3N0YXRlLkNyZWF0ZShjYl9zdGF0ZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFKTsKKworICAgIC8vIFN3aXRjaCB0byBhbmQgbGF1bmNoIHRoZSB2YWxpZGF0aW9uIGNvbXB1dGUgc2hhZGVyIHRvIGZpbmQsIHJlcGxhY2UsIGFuZCByZXBvcnQgaW52YWxpZCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGhhbmRsZXMuCisgICAgRGlzcGF0Y2hDbWRCaW5kUGlwZWxpbmUoY29tbWFuZEJ1ZmZlciwgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLCBhc192YWxpZGF0aW9uX3N0YXRlLnBpcGVsaW5lKTsKKyAgICBEaXNwYXRjaENtZEJpbmREZXNjcmlwdG9yU2V0cyhjb21tYW5kQnVmZmVyLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsIGFzX3ZhbGlkYXRpb25fc3RhdGUucGlwZWxpbmVfbGF5b3V0LCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLmRlc2NyaXB0b3Jfc2V0LCAwLCBudWxscHRyKTsKKyAgICBEaXNwYXRjaENtZERpc3BhdGNoKGNvbW1hbmRCdWZmZXIsIDEsIDEsIDEpOworCisgICAgLy8gSXNzdWUgYSBidWZmZXIgbWVtb3J5IGJhcnJpZXIgdG8gbWFrZSBzdXJlIHRoYXQgYW55IGludmFsaWQgYm90dG9tIGxldmVsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaGFuZGxlcworICAgIC8vIGhhdmUgYmVlbiByZXBsYWNlZCBieSB0aGUgdmFsaWRhdGlvbiBjb21wdXRlIHNoYWRlciBiZWZvcmUgYW55IGJ1aWxkcyB0YWtlIHBsYWNlLgorICAgIFZrQnVmZmVyTWVtb3J5QmFycmllciBpbnN0YW5jZV9idWZmZXJfYmFycmllciA9IHt9OworICAgIGluc3RhbmNlX2J1ZmZlcl9iYXJyaWVyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9CQVJSSUVSOworICAgIGluc3RhbmNlX2J1ZmZlcl9iYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1dSSVRFX0JJVDsKKyAgICBpbnN0YW5jZV9idWZmZXJfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUkVBRF9CSVRfTlY7CisgICAgaW5zdGFuY2VfYnVmZmVyX2JhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGluc3RhbmNlX2J1ZmZlcl9iYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbnN0YW5jZV9idWZmZXJfYmFycmllci5idWZmZXIgPSBpbnN0YW5jZURhdGE7CisgICAgaW5zdGFuY2VfYnVmZmVyX2JhcnJpZXIub2Zmc2V0ID0gaW5zdGFuY2VPZmZzZXQ7CisgICAgaW5zdGFuY2VfYnVmZmVyX2JhcnJpZXIuc2l6ZSA9IGluc3RhbmNlX2J1ZmZlcl9zaXplOworICAgIERpc3BhdGNoQ21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRCdWZmZXIsIFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0JVSUxEX0JJVF9OViwgMCwgMCwgbnVsbHB0ciwgMSwgJmluc3RhbmNlX2J1ZmZlcl9iYXJyaWVyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworCisgICAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgY29tcHV0ZSBwaXBlbGluZSBzdGF0ZS4KKyAgICByZXN0b3JhYmxlX3N0YXRlLlJlc3RvcmUoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBhc192YWxpZGF0aW9uX3N0YXRlLnZhbGlkYXRpb25fYnVmZmVyc1tjb21tYW5kQnVmZmVyXS5wdXNoX2JhY2soc3RkOjptb3ZlKGFzX3ZhbGlkYXRpb25fYnVmZmVyX2luZm8pKTsKK30KKwordm9pZCBHcHVBc3Npc3RlZDo6UHJvY2Vzc0FjY2VsZXJhdGlvblN0cnVjdHVyZUJ1aWxkVmFsaWRhdGlvbkJ1ZmZlcihWa1F1ZXVlIHF1ZXVlLCBDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlKSB7CisgICAgaWYgKGNiX25vZGUgPT0gbnVsbHB0ciB8fCAhY2Jfbm9kZS0+aGFzQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDbWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gJmFzX3ZhbGlkYXRpb25faW5mbyA9IGFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmVfdmFsaWRhdGlvbl9zdGF0ZTsKKyAgICBhdXRvICZhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvcyA9IGFzX3ZhbGlkYXRpb25faW5mby52YWxpZGF0aW9uX2J1ZmZlcnNbY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlcl07CisgICAgZm9yIChjb25zdCBhdXRvICZhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvIDogYXNfdmFsaWRhdGlvbl9idWZmZXJfaW5mb3MpIHsKKyAgICAgICAgR3B1QWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uQnVmZmVyICptYXBwZWRfdmFsaWRhdGlvbl9idWZmZXIgPSBudWxscHRyOworCisgICAgICAgIFZrUmVzdWx0IHJlc3VsdCA9CisgICAgICAgICAgICB2bWFNYXBNZW1vcnkodm1hQWxsb2NhdG9yLCBhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLnZhbGlkYXRpb25fYnVmZmVyX2FsbG9jYXRpb24sICh2b2lkICoqKSZtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXIpOworICAgICAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXItPmludmFsaWRfaGFuZGxlX2ZvdW5kID4gMCkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGludmFsaWRfaGFuZGxlID0gMDsKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQzMl90ICo+KCZpbnZhbGlkX2hhbmRsZSlbMF0gPSBtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXItPmludmFsaWRfaGFuZGxlX2JpdHNfMDsKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQzMl90ICo+KCZpbnZhbGlkX2hhbmRsZSlbMV0gPSBtYXBwZWRfdmFsaWRhdGlvbl9idWZmZXItPmludmFsaWRfaGFuZGxlX2JpdHNfMTsKKworICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLmFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmUpLCAiVU5BU1NJR05FRC1BY2NlbGVyYXRpb25TdHJ1Y3R1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBidWlsZCB0b3AgbGV2ZWwgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSB1c2luZyBpbnZhbGlkIGJvdHRvbSBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGUgKCUiIFBSSXU2NCAiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkX2hhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2bWFVbm1hcE1lbW9yeSh2bWFBbGxvY2F0b3IsIGFzX3ZhbGlkYXRpb25fYnVmZmVyX2luZm8udmFsaWRhdGlvbl9idWZmZXJfYWxsb2NhdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlBvc3RDYWxsUmVjb3JkQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViAqcEJpbmRJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKGRldmljZSwgYmluZEluZm9Db3VudCwgcEJpbmRJbmZvcywgcmVzdWx0KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViAmaW5mbyA9IHBCaW5kSW5mb3NbaV07CisgICAgICAgIEFDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfU1RBVEUgKmFzX3N0YXRlID0gR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlU3RhdGUoaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUpOworICAgICAgICBpZiAoYXNfc3RhdGUpIHsKKyAgICAgICAgICAgIERpc3BhdGNoR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoZGV2aWNlLCBpbmZvLmFjY2VsZXJhdGlvblN0cnVjdHVyZSwgOCwgJmFzX3N0YXRlLT5vcGFxdWVfaGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gTW9kaWZ5IHRoZSBwaXBlbGluZSBsYXlvdXQgdG8gaW5jbHVkZSBvdXIgZGVidWcgZGVzY3JpcHRvciBzZXQgYW5kIGFueSBuZWVkZWQgcGFkZGluZyB3aXRoIHRoZSBkdW1teSBkZXNjcmlwdG9yIHNldC4KK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmVMYXlvdXQgKnBQaXBlbGluZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjcGxfc3RhdGVfZGF0YSkgeworICAgIGlmIChhYm9ydGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjcmVhdGVfcGlwZWxpbmVfbGF5b3V0X2FwaV9zdGF0ZSAqY3BsX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxjcmVhdGVfcGlwZWxpbmVfbGF5b3V0X2FwaV9zdGF0ZSAqPihjcGxfc3RhdGVfZGF0YSk7CisKKyAgICBpZiAoY3BsX3N0YXRlLT5tb2RpZmllZF9jcmVhdGVfaW5mby5zZXRMYXlvdXRDb3VudCA+PSBhZGp1c3RlZF9tYXhfZGVzY19zZXRzKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJtOworICAgICAgICBzdHJtIDw8ICJQaXBlbGluZSBMYXlvdXQgY29uZmxpY3Qgd2l0aCB2YWxpZGF0aW9uJ3MgZGVzY3JpcHRvciBzZXQgYXQgc2xvdCAiIDw8IGRlc2Nfc2V0X2JpbmRfaW5kZXggPDwgIi4gIgorICAgICAgICAgICAgIDw8ICJBcHBsaWNhdGlvbiBoYXMgdG9vIG1hbnkgZGVzY3JpcHRvciBzZXRzIGluIHRoZSBwaXBlbGluZSBsYXlvdXQgdG8gY29udGludWUgd2l0aCBncHUgdmFsaWRhdGlvbi4gIgorICAgICAgICAgICAgIDw8ICJWYWxpZGF0aW9uIGlzIG5vdCBtb2RpZnlpbmcgdGhlIHBpcGVsaW5lIGxheW91dC4gIgorICAgICAgICAgICAgIDw8ICJJbnN0cnVtZW50ZWQgc2hhZGVycyBhcmUgcmVwbGFjZWQgd2l0aCBub24taW5zdHJ1bWVudGVkIHNoYWRlcnMuIjsKKyAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLCBzdHJtLnN0cigpLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE1vZGlmeSB0aGUgcGlwZWxpbmUgbGF5b3V0IGJ5OgorICAgICAgICAvLyAxLiBDb3B5aW5nIHRoZSBjYWxsZXIncyBkZXNjcmlwdG9yIHNldCBkZXNjX2xheW91dHMKKyAgICAgICAgLy8gMi4gRmlsbCBpbiBkdW1teSBkZXNjcmlwdG9yIGxheW91dHMgdXAgdG8gdGhlIG1heCBiaW5kaW5nCisgICAgICAgIC8vIDMuIEZpbGwgaW4gd2l0aCB0aGUgZGVidWcgZGVzY3JpcHRvciBsYXlvdXQgYXQgdGhlIG1heCBiaW5kaW5nIHNsb3QKKyAgICAgICAgY3BsX3N0YXRlLT5uZXdfbGF5b3V0cy5yZXNlcnZlKGFkanVzdGVkX21heF9kZXNjX3NldHMpOworICAgICAgICBjcGxfc3RhdGUtPm5ld19sYXlvdXRzLmluc2VydChjcGxfc3RhdGUtPm5ld19sYXlvdXRzLmVuZCgpLCAmcENyZWF0ZUluZm8tPnBTZXRMYXlvdXRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENyZWF0ZUluZm8tPnBTZXRMYXlvdXRzW3BDcmVhdGVJbmZvLT5zZXRMYXlvdXRDb3VudF0pOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSBwQ3JlYXRlSW5mby0+c2V0TGF5b3V0Q291bnQ7IGkgPCBhZGp1c3RlZF9tYXhfZGVzY19zZXRzIC0gMTsgKytpKSB7CisgICAgICAgICAgICBjcGxfc3RhdGUtPm5ld19sYXlvdXRzLnB1c2hfYmFjayhkdW1teV9kZXNjX2xheW91dCk7CisgICAgICAgIH0KKyAgICAgICAgY3BsX3N0YXRlLT5uZXdfbGF5b3V0cy5wdXNoX2JhY2soZGVidWdfZGVzY19sYXlvdXQpOworICAgICAgICBjcGxfc3RhdGUtPm1vZGlmaWVkX2NyZWF0ZV9pbmZvLnBTZXRMYXlvdXRzID0gY3BsX3N0YXRlLT5uZXdfbGF5b3V0cy5kYXRhKCk7CisgICAgICAgIGNwbF9zdGF0ZS0+bW9kaWZpZWRfY3JlYXRlX2luZm8uc2V0TGF5b3V0Q291bnQgPSBhZGp1c3RlZF9tYXhfZGVzY19zZXRzOworICAgIH0KK30KKwordm9pZCBHcHVBc3Npc3RlZDo6UG9zdENhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1BpcGVsaW5lTGF5b3V0ICpwUGlwZWxpbmVMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVMYXlvdXQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFBpcGVsaW5lTGF5b3V0LCByZXN1bHQpOworCisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIHBpcGVsaW5lIGxheW91dC4gIERldmljZSBjb3VsZCBiZWNvbWUgdW5zdGFibGUuIik7CisgICAgICAgIGFib3J0ZWQgPSB0cnVlOworICAgIH0KK30KKworLy8gRnJlZSB0aGUgZGV2aWNlIG1lbW9yeSBhbmQgZGVzY3JpcHRvciBzZXQgYXNzb2NpYXRlZCB3aXRoIGEgY29tbWFuZCBidWZmZXIuCit2b2lkIEdwdUFzc2lzdGVkOjpSZXNldENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpIHsKKyAgICBpZiAoYWJvcnRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gZ3B1YXZfYnVmZmVyX2xpc3QgPSBHZXRHcHVBc3Npc3RlZEJ1ZmZlckluZm8oY29tbWFuZEJ1ZmZlcik7CisgICAgZm9yIChhdXRvIGJ1ZmZlcl9pbmZvIDogZ3B1YXZfYnVmZmVyX2xpc3QpIHsKKyAgICAgICAgdm1hRGVzdHJveUJ1ZmZlcih2bWFBbGxvY2F0b3IsIGJ1ZmZlcl9pbmZvLm91dHB1dF9tZW1fYmxvY2suYnVmZmVyLCBidWZmZXJfaW5mby5vdXRwdXRfbWVtX2Jsb2NrLmFsbG9jYXRpb24pOworICAgICAgICBpZiAoYnVmZmVyX2luZm8uZGlfaW5wdXRfbWVtX2Jsb2NrLmJ1ZmZlcikgeworICAgICAgICAgICAgdm1hRGVzdHJveUJ1ZmZlcih2bWFBbGxvY2F0b3IsIGJ1ZmZlcl9pbmZvLmRpX2lucHV0X21lbV9ibG9jay5idWZmZXIsIGJ1ZmZlcl9pbmZvLmRpX2lucHV0X21lbV9ibG9jay5hbGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyX2luZm8uYmRhX2lucHV0X21lbV9ibG9jay5idWZmZXIpIHsKKyAgICAgICAgICAgIHZtYURlc3Ryb3lCdWZmZXIodm1hQWxsb2NhdG9yLCBidWZmZXJfaW5mby5iZGFfaW5wdXRfbWVtX2Jsb2NrLmJ1ZmZlciwgYnVmZmVyX2luZm8uYmRhX2lucHV0X21lbV9ibG9jay5hbGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyX2luZm8uZGVzY19zZXQgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIGRlc2Nfc2V0X21hbmFnZXItPlB1dEJhY2tEZXNjcmlwdG9yU2V0KGJ1ZmZlcl9pbmZvLmRlc2NfcG9vbCwgYnVmZmVyX2luZm8uZGVzY19zZXQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbW1hbmRfYnVmZmVyX21hcC5lcmFzZShjb21tYW5kQnVmZmVyKTsKKworICAgIGF1dG8gJmFzX3ZhbGlkYXRpb25faW5mbyA9IGFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmVfdmFsaWRhdGlvbl9zdGF0ZTsKKyAgICBhdXRvICZhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvcyA9IGFzX3ZhbGlkYXRpb25faW5mby52YWxpZGF0aW9uX2J1ZmZlcnNbY29tbWFuZEJ1ZmZlcl07CisgICAgZm9yIChhdXRvICZhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvIDogYXNfdmFsaWRhdGlvbl9idWZmZXJfaW5mb3MpIHsKKyAgICAgICAgdm1hRGVzdHJveUJ1ZmZlcih2bWFBbGxvY2F0b3IsIGFzX3ZhbGlkYXRpb25fYnVmZmVyX2luZm8udmFsaWRhdGlvbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXNfdmFsaWRhdGlvbl9idWZmZXJfaW5mby52YWxpZGF0aW9uX2J1ZmZlcl9hbGxvY2F0aW9uKTsKKworICAgICAgICBpZiAoYXNfdmFsaWRhdGlvbl9idWZmZXJfaW5mby5kZXNjcmlwdG9yX3NldCAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgZGVzY19zZXRfbWFuYWdlci0+UHV0QmFja0Rlc2NyaXB0b3JTZXQoYXNfdmFsaWRhdGlvbl9idWZmZXJfaW5mby5kZXNjcmlwdG9yX3Bvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc192YWxpZGF0aW9uX2J1ZmZlcl9pbmZvLmRlc2NyaXB0b3Jfc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc192YWxpZGF0aW9uX2luZm8udmFsaWRhdGlvbl9idWZmZXJzLmVyYXNlKGNvbW1hbmRCdWZmZXIpOworfQorLy8gSnVzdCBnaXZlcyBhIHdhcm5pbmcgYWJvdXQgYSBwb3NzaWJsZSBkZWFkbG9jay4KK2Jvb2wgR3B1QXNzaXN0ZWQ6OlByZUNhbGxWYWxpZGF0ZUNtZFdhaXRFdmVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZrRXZlbnQgKnBFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciAqcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbW9yeUJhcnJpZXJzKSBjb25zdCB7CisgICAgaWYgKHNyY1N0YWdlTWFzayAmIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUKSB7CisgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULCBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbWRXYWl0RXZlbnRzIHJlY29yZGVkIHdpdGggVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQgc2V0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1BVX0Fzc2lzdGVkIHZhbGlkYXRpb24gd2FpdHMgb24gcXVldWUgY29tcGxldGlvbi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgd2FpdCBjb3VsZCBibG9jayB0aGUgaG9zdCdzIHNpZ25hbGluZyBvZiB0aGlzIGV2ZW50LCByZXN1bHRpbmcgaW4gZGVhZGxvY2suIik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBHcHVBc3Npc3RlZDo6UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzICpwUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKSB7CisgICAgLy8gVGhlcmUgaXMgYW4gaW1wbGljaXQgbGF5ZXIgdGhhdCBjYW4gY2F1c2UgdGhpcyBjYWxsIHRvIHJldHVybiAwIGZvciBtYXhCb3VuZERlc2NyaXB0b3JTZXRzIC0gSWdub3JlIHN1Y2ggY2FsbHMKKyAgICBpZiAoZW5hYmxlZC5ncHVfdmFsaWRhdGlvbl9yZXNlcnZlX2JpbmRpbmdfc2xvdCAmJiBwUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzLT5saW1pdHMubWF4Qm91bmREZXNjcmlwdG9yU2V0cyA+IDApIHsKKyAgICAgICAgaWYgKHBQaHlzaWNhbERldmljZVByb3BlcnRpZXMtPmxpbWl0cy5tYXhCb3VuZERlc2NyaXB0b3JTZXRzID4gMSkgeworICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcy0+bGltaXRzLm1heEJvdW5kRGVzY3JpcHRvclNldHMgLT0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaHlzaWNhbERldmljZSksICJVTkFTU0lHTkVELUdQVS1Bc3Npc3RlZCBWYWxpZGF0aW9uIFNldHVwIEVycm9yLiIsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVzZXJ2ZSBkZXNjcmlwdG9yIGJpbmRpbmcgc2xvdCBvbiBhIGRldmljZSB3aXRoIG9ubHkgb25lIHNsb3QuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiAqcFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIpIHsKKyAgICAvLyBUaGVyZSBpcyBhbiBpbXBsaWNpdCBsYXllciB0aGF0IGNhbiBjYXVzZSB0aGlzIGNhbGwgdG8gcmV0dXJuIDAgZm9yIG1heEJvdW5kRGVzY3JpcHRvclNldHMgLSBJZ25vcmUgc3VjaCBjYWxscworICAgIGlmIChlbmFibGVkLmdwdV92YWxpZGF0aW9uX3Jlc2VydmVfYmluZGluZ19zbG90ICYmIHBQaHlzaWNhbERldmljZVByb3BlcnRpZXMyLT5wcm9wZXJ0aWVzLmxpbWl0cy5tYXhCb3VuZERlc2NyaXB0b3JTZXRzID4gMCkgeworICAgICAgICBpZiAocFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczItPnByb3BlcnRpZXMubGltaXRzLm1heEJvdW5kRGVzY3JpcHRvclNldHMgPiAxKSB7CisgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi0+cHJvcGVydGllcy5saW1pdHMubWF4Qm91bmREZXNjcmlwdG9yU2V0cyAtPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBoeXNpY2FsRGV2aWNlKSwgIlVOQVNTSUdORUQtR1BVLUFzc2lzdGVkIFZhbGlkYXRpb24gU2V0dXAgRXJyb3IuIiwKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZXNlcnZlIGRlc2NyaXB0b3IgYmluZGluZyBzbG90IG9uIGEgZGV2aWNlIHdpdGggb25seSBvbmUgc2xvdC4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBHcHVBc3Npc3RlZDo6UHJlQ2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2dwbF9zdGF0ZV9kYXRhKSB7CisgICAgc3RkOjp2ZWN0b3I8c2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiBuZXdfcGlwZWxpbmVfY3JlYXRlX2luZm9zOworICAgIGNyZWF0ZV9ncmFwaGljc19waXBlbGluZV9hcGlfc3RhdGUgKmNncGxfc3RhdGUgPSByZWludGVycHJldF9jYXN0PGNyZWF0ZV9ncmFwaGljc19waXBlbGluZV9hcGlfc3RhdGUgKj4oY2dwbF9zdGF0ZV9kYXRhKTsKKyAgICBQcmVDYWxsUmVjb3JkUGlwZWxpbmVDcmVhdGlvbnMoY291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgY2dwbF9zdGF0ZS0+cGlwZV9zdGF0ZSwgJm5ld19waXBlbGluZV9jcmVhdGVfaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MpOworICAgIGNncGxfc3RhdGUtPmdwdV9jcmVhdGVfaW5mb3MgPSBuZXdfcGlwZWxpbmVfY3JlYXRlX2luZm9zOworICAgIGNncGxfc3RhdGUtPnBDcmVhdGVJbmZvcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqPihjZ3BsX3N0YXRlLT5ncHVfY3JlYXRlX2luZm9zLmRhdGEoKSk7Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjY3BsX3N0YXRlX2RhdGEpIHsKKyAgICBzdGQ6OnZlY3RvcjxzYWZlX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbz4gbmV3X3BpcGVsaW5lX2NyZWF0ZV9pbmZvczsKKyAgICBhdXRvICpjY3BsX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxjcmVhdGVfY29tcHV0ZV9waXBlbGluZV9hcGlfc3RhdGUgKj4oY2NwbF9zdGF0ZV9kYXRhKTsKKyAgICBQcmVDYWxsUmVjb3JkUGlwZWxpbmVDcmVhdGlvbnMoY291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgY2NwbF9zdGF0ZS0+cGlwZV9zdGF0ZSwgJm5ld19waXBlbGluZV9jcmVhdGVfaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSk7CisgICAgY2NwbF9zdGF0ZS0+Z3B1X2NyZWF0ZV9pbmZvcyA9IG5ld19waXBlbGluZV9jcmVhdGVfaW5mb3M7CisgICAgY2NwbF9zdGF0ZS0+cENyZWF0ZUluZm9zID0gcmVpbnRlcnByZXRfY2FzdDxWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gKj4oY2NwbF9zdGF0ZS0+Z3B1X2NyZWF0ZV9pbmZvcy5kYXRhKCkpOworfQorCit2b2lkIEdwdUFzc2lzdGVkOjpQcmVDYWxsUmVjb3JkQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNydHBsX3N0YXRlX2RhdGEpIHsKKyAgICBzdGQ6OnZlY3RvcjxzYWZlX1ZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WPiBuZXdfcGlwZWxpbmVfY3JlYXRlX2luZm9zOworICAgIGF1dG8gKmNydHBsX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxjcmVhdGVfcmF5X3RyYWNpbmdfcGlwZWxpbmVfYXBpX3N0YXRlICo+KGNydHBsX3N0YXRlX2RhdGEpOworICAgIFByZUNhbGxSZWNvcmRQaXBlbGluZUNyZWF0aW9ucyhjb3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzLCBjcnRwbF9zdGF0ZS0+cGlwZV9zdGF0ZSwgJm5ld19waXBlbGluZV9jcmVhdGVfaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYpOworICAgIGNydHBsX3N0YXRlLT5ncHVfY3JlYXRlX2luZm9zID0gbmV3X3BpcGVsaW5lX2NyZWF0ZV9pbmZvczsKKyAgICBjcnRwbF9zdGF0ZS0+cENyZWF0ZUluZm9zID0gcmVpbnRlcnByZXRfY2FzdDxWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViAqPihjcnRwbF9zdGF0ZS0+Z3B1X2NyZWF0ZV9pbmZvcy5kYXRhKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIENyZWF0ZUluZm8+CitzdHJ1Y3QgQ3JlYXRlUGlwZWxpbmVUcmFpdHMge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENyZWF0ZVBpcGVsaW5lVHJhaXRzPFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8+IHsKKyAgICB1c2luZyBTYWZlVHlwZSA9IHNhZmVfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbzsKKyAgICBzdGF0aWMgY29uc3QgU2FmZVR5cGUgJkdldFBpcGVsaW5lQ0koY29uc3QgUElQRUxJTkVfU1RBVEUgKnBpcGVsaW5lX3N0YXRlKSB7IHJldHVybiBwaXBlbGluZV9zdGF0ZS0+Z3JhcGhpY3NQaXBlbGluZUNJOyB9CisgICAgc3RhdGljIHVpbnQzMl90IEdldFN0YWdlQ291bnQoY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAmY3JlYXRlSW5mbykgeyByZXR1cm4gY3JlYXRlSW5mby5zdGFnZUNvdW50OyB9CisgICAgc3RhdGljIFZrU2hhZGVyTW9kdWxlIEdldFNoYWRlck1vZHVsZShjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICZjcmVhdGVJbmZvLCB1aW50MzJfdCBzdGFnZSkgeworICAgICAgICByZXR1cm4gY3JlYXRlSW5mby5wU3RhZ2VzW3N0YWdlXS5tb2R1bGU7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIFNldFNoYWRlck1vZHVsZShTYWZlVHlwZSAqY3JlYXRlSW5mbywgVmtTaGFkZXJNb2R1bGUgc2hhZGVyX21vZHVsZSwgdWludDMyX3Qgc3RhZ2UpIHsKKyAgICAgICAgY3JlYXRlSW5mby0+cFN0YWdlc1tzdGFnZV0ubW9kdWxlID0gc2hhZGVyX21vZHVsZTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IENyZWF0ZVBpcGVsaW5lVHJhaXRzPFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbz4geworICAgIHVzaW5nIFNhZmVUeXBlID0gc2FmZV9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm87CisgICAgc3RhdGljIGNvbnN0IFNhZmVUeXBlICZHZXRQaXBlbGluZUNJKGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwaXBlbGluZV9zdGF0ZSkgeyByZXR1cm4gcGlwZWxpbmVfc3RhdGUtPmNvbXB1dGVQaXBlbGluZUNJOyB9CisgICAgc3RhdGljIHVpbnQzMl90IEdldFN0YWdlQ291bnQoY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICZjcmVhdGVJbmZvKSB7IHJldHVybiAxOyB9CisgICAgc3RhdGljIFZrU2hhZGVyTW9kdWxlIEdldFNoYWRlck1vZHVsZShjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gJmNyZWF0ZUluZm8sIHVpbnQzMl90IHN0YWdlKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmZvLnN0YWdlLm1vZHVsZTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgU2V0U2hhZGVyTW9kdWxlKFNhZmVUeXBlICpjcmVhdGVJbmZvLCBWa1NoYWRlck1vZHVsZSBzaGFkZXJfbW9kdWxlLCB1aW50MzJfdCBzdGFnZSkgeworICAgICAgICBhc3NlcnQoc3RhZ2UgPT0gMCk7CisgICAgICAgIGNyZWF0ZUluZm8tPnN0YWdlLm1vZHVsZSA9IHNoYWRlcl9tb2R1bGU7CisgICAgfQorfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ3JlYXRlUGlwZWxpbmVUcmFpdHM8VmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY+IHsKKyAgICB1c2luZyBTYWZlVHlwZSA9IHNhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY7CisgICAgc3RhdGljIGNvbnN0IFNhZmVUeXBlICZHZXRQaXBlbGluZUNJKGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwaXBlbGluZV9zdGF0ZSkgeyByZXR1cm4gcGlwZWxpbmVfc3RhdGUtPnJheXRyYWNpbmdQaXBlbGluZUNJOyB9CisgICAgc3RhdGljIHVpbnQzMl90IEdldFN0YWdlQ291bnQoY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgJmNyZWF0ZUluZm8pIHsgcmV0dXJuIGNyZWF0ZUluZm8uc3RhZ2VDb3VudDsgfQorICAgIHN0YXRpYyBWa1NoYWRlck1vZHVsZSBHZXRTaGFkZXJNb2R1bGUoY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgJmNyZWF0ZUluZm8sIHVpbnQzMl90IHN0YWdlKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmZvLnBTdGFnZXNbc3RhZ2VdLm1vZHVsZTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgU2V0U2hhZGVyTW9kdWxlKFNhZmVUeXBlICpjcmVhdGVJbmZvLCBWa1NoYWRlck1vZHVsZSBzaGFkZXJfbW9kdWxlLCB1aW50MzJfdCBzdGFnZSkgeworICAgICAgICBjcmVhdGVJbmZvLT5wU3RhZ2VzW3N0YWdlXS5tb2R1bGUgPSBzaGFkZXJfbW9kdWxlOworICAgIH0KK307CisKKy8vIEV4YW1pbmUgdGhlIHBpcGVsaW5lcyB0byBzZWUgaWYgdGhleSB1c2UgdGhlIGRlYnVnIGRlc2NyaXB0b3Igc2V0IGJpbmRpbmcgaW5kZXguCisvLyBJZiBhbnkgZG8sIGNyZWF0ZSBuZXcgbm9uLWluc3RydW1lbnRlZCBzaGFkZXIgbW9kdWxlcyBhbmQgdXNlIHRoZW0gdG8gcmVwbGFjZSB0aGUgaW5zdHJ1bWVudGVkCisvLyBzaGFkZXJzIGluIHRoZSBwaXBlbGluZS4gIFJldHVybiB0aGUgKHBvc3NpYmx5KSBtb2RpZmllZCBjcmVhdGUgaW5mb3MgdG8gdGhlIGNhbGxlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDcmVhdGVJbmZvLCB0eXBlbmFtZSBTYWZlQ3JlYXRlSW5mbz4KK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRQaXBlbGluZUNyZWF0aW9ucyh1aW50MzJfdCBjb3VudCwgY29uc3QgQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtQaXBlbGluZSAqcFBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8UElQRUxJTkVfU1RBVEU+PiAmcGlwZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTYWZlQ3JlYXRlSW5mbz4gKm5ld19waXBlbGluZV9jcmVhdGVfaW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaXBlbGluZUJpbmRQb2ludCBiaW5kX3BvaW50KSB7CisgICAgdXNpbmcgQWNjZXNzb3IgPSBDcmVhdGVQaXBlbGluZVRyYWl0czxDcmVhdGVJbmZvPjsKKyAgICBpZiAoYmluZF9wb2ludCAhPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTICYmIGJpbmRfcG9pbnQgIT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFICYmCisgICAgICAgIGJpbmRfcG9pbnQgIT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2FsayB0aHJvdWdoIGFsbCB0aGUgcGlwZWxpbmVzLCBtYWtlIGEgY29weSBvZiBlYWNoIGFuZCBmbGFnIGVhY2ggcGlwZWxpbmUgdGhhdCBjb250YWlucyBhIHNoYWRlciB0aGF0IHVzZXMgdGhlIGRlYnVnCisgICAgLy8gZGVzY3JpcHRvciBzZXQgaW5kZXguCisgICAgZm9yICh1aW50MzJfdCBwaXBlbGluZSA9IDA7IHBpcGVsaW5lIDwgY291bnQ7ICsrcGlwZWxpbmUpIHsKKyAgICAgICAgdWludDMyX3Qgc3RhZ2VDb3VudCA9IEFjY2Vzc29yOjpHZXRTdGFnZUNvdW50KHBDcmVhdGVJbmZvc1twaXBlbGluZV0pOworICAgICAgICBuZXdfcGlwZWxpbmVfY3JlYXRlX2luZm9zLT5wdXNoX2JhY2soQWNjZXNzb3I6OkdldFBpcGVsaW5lQ0kocGlwZV9zdGF0ZVtwaXBlbGluZV0uZ2V0KCkpKTsKKworICAgICAgICBib29sIHJlcGxhY2Vfc2hhZGVycyA9IGZhbHNlOworICAgICAgICBpZiAocGlwZV9zdGF0ZVtwaXBlbGluZV0tPmFjdGl2ZV9zbG90cy5maW5kKGRlc2Nfc2V0X2JpbmRfaW5kZXgpICE9IHBpcGVfc3RhdGVbcGlwZWxpbmVdLT5hY3RpdmVfc2xvdHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJlcGxhY2Vfc2hhZGVycyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGhlIGFwcCByZXF1ZXN0cyBhbGwgYXZhaWxhYmxlIHNldHMsIHRoZSBwaXBlbGluZSBsYXlvdXQgd2FzIG5vdCBtb2RpZmllZCBhdCBwaXBlbGluZSBsYXlvdXQgY3JlYXRpb24gYW5kIHRoZSBhbHJlYWR5CisgICAgICAgIC8vIGluc3RydW1lbnRlZCBzaGFkZXJzIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB1bmluc3RydW1lbnRlZCBzaGFkZXJzCisgICAgICAgIGlmIChwaXBlX3N0YXRlW3BpcGVsaW5lXS0+cGlwZWxpbmVfbGF5b3V0LT5zZXRfbGF5b3V0cy5zaXplKCkgPj0gYWRqdXN0ZWRfbWF4X2Rlc2Nfc2V0cykgeworICAgICAgICAgICAgcmVwbGFjZV9zaGFkZXJzID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXBsYWNlX3NoYWRlcnMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3Qgc3RhZ2UgPSAwOyBzdGFnZSA8IHN0YWdlQ291bnQ7ICsrc3RhZ2UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTSEFERVJfTU9EVUxFX1NUQVRFICpzaGFkZXIgPSBHZXRTaGFkZXJNb2R1bGVTdGF0ZShBY2Nlc3Nvcjo6R2V0U2hhZGVyTW9kdWxlKHBDcmVhdGVJbmZvc1twaXBlbGluZV0sIHN0YWdlKSk7CisKKyAgICAgICAgICAgICAgICBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gY3JlYXRlX2luZm8gPSB7fTsKKyAgICAgICAgICAgICAgICBWa1NoYWRlck1vZHVsZSBzaGFkZXJfbW9kdWxlOworICAgICAgICAgICAgICAgIGNyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgICAgICBjcmVhdGVfaW5mby5wQ29kZSA9IHNoYWRlci0+d29yZHMuZGF0YSgpOworICAgICAgICAgICAgICAgIGNyZWF0ZV9pbmZvLmNvZGVTaXplID0gc2hhZGVyLT53b3Jkcy5zaXplKCkgKiBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgJmNyZWF0ZV9pbmZvLCBwQWxsb2NhdG9yLCAmc2hhZGVyX21vZHVsZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc29yOjpTZXRTaGFkZXJNb2R1bGUoJigqbmV3X3BpcGVsaW5lX2NyZWF0ZV9pbmZvcylbcGlwZWxpbmVdLCBzaGFkZXJfbW9kdWxlLCBzdGFnZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbW9kdWxlSGFuZGxlID0gSGFuZGxlVG9VaW50NjQoQWNjZXNzb3I6OkdldFNoYWRlck1vZHVsZShwQ3JlYXRlSW5mb3NbcGlwZWxpbmVdLCBzdGFnZSkpOworICAgICAgICAgICAgICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULCBtb2R1bGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJlcGxhY2UgaW5zdHJ1bWVudGVkIHNoYWRlciB3aXRoIG5vbi1pbnN0cnVtZW50ZWQgb25lLiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRldmljZSBjb3VsZCBiZWNvbWUgdW5zdGFibGUuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEdwdUFzc2lzdGVkOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtQaXBlbGluZSAqcFBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0LCB2b2lkICpjZ3BsX3N0YXRlX2RhdGEpIHsKKyAgICBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsIHJlc3VsdCwgY2dwbF9zdGF0ZV9kYXRhKTsKKyAgICBQb3N0Q2FsbFJlY29yZFBpcGVsaW5lQ3JlYXRpb25zKGNvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MpOworfQorCit2b2lkIEdwdUFzc2lzdGVkOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1BpcGVsaW5lICpwUGlwZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCwgdm9pZCAqY2NwbF9zdGF0ZV9kYXRhKSB7CisgICAgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBjY3BsX3N0YXRlX2RhdGEpOworICAgIFBvc3RDYWxsUmVjb3JkUGlwZWxpbmVDcmVhdGlvbnMoY291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFKTsKK30KKwordm9pZCBHcHVBc3Npc3RlZDo6UG9zdENhbGxSZWNvcmRDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1BpcGVsaW5lICpwUGlwZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0LCB2b2lkICpjcnRwbF9zdGF0ZV9kYXRhKSB7CisgICAgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjb3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMsIHJlc3VsdCwgY3J0cGxfc3RhdGVfZGF0YSk7CisgICAgUG9zdENhbGxSZWNvcmRQaXBlbGluZUNyZWF0aW9ucyhjb3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WKTsKK30KKworLy8gRm9yIGV2ZXJ5IHBpcGVsaW5lOgorLy8gLSBGb3IgZXZlcnkgc2hhZGVyIGluIGEgcGlwZWxpbmU6CisvLyAgIC0gSWYgdGhlIHNoYWRlciBoYWQgdG8gYmUgcmVwbGFjZWQgaW4gUHJlQ2FsbFJlY29yZCAoYmVjYXVzZSB0aGUgcGlwZWxpbmUgaXMgdXNpbmcgdGhlIGRlYnVnIGRlc2Mgc2V0IGluZGV4KToKKy8vICAgICAtIERlc3Ryb3kgaXQgc2luY2UgaXQgaGFzIGJlZW4gYm91bmQgaW50byB0aGUgcGlwZWxpbmUgYnkgbm93LiAgVGhpcyBpcyBvdXIgb25seSBjaGFuY2UgdG8gZGVsZXRlIGl0LgorLy8gICAtIFRyYWNrIHRoZSBzaGFkZXIgaW4gdGhlIHNoYWRlcl9tYXAKKy8vICAgLSBTYXZlIHRoZSBzaGFkZXIgYmluYXJ5IGlmIGl0IGNvbnRhaW5zIGRlYnVnIGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBDcmVhdGVJbmZvPgordm9pZCBHcHVBc3Npc3RlZDo6UG9zdENhbGxSZWNvcmRQaXBlbGluZUNyZWF0aW9ucyhjb25zdCB1aW50MzJfdCBjb3VudCwgY29uc3QgQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCkgeworICAgIHVzaW5nIEFjY2Vzc29yID0gQ3JlYXRlUGlwZWxpbmVUcmFpdHM8Q3JlYXRlSW5mbz47CisgICAgaWYgKGJpbmRfcG9pbnQgIT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyAmJiBiaW5kX3BvaW50ICE9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSAmJgorICAgICAgICBiaW5kX3BvaW50ICE9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IHBpcGVsaW5lID0gMDsgcGlwZWxpbmUgPCBjb3VudDsgKytwaXBlbGluZSkgeworICAgICAgICBhdXRvIHBpcGVsaW5lX3N0YXRlID0gVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6R2V0UGlwZWxpbmVTdGF0ZShwUGlwZWxpbmVzW3BpcGVsaW5lXSk7CisgICAgICAgIGlmIChudWxscHRyID09IHBpcGVsaW5lX3N0YXRlKSBjb250aW51ZTsKKworICAgICAgICB1aW50MzJfdCBzdGFnZUNvdW50ID0gMDsKKyAgICAgICAgaWYgKGJpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUykgeworICAgICAgICAgICAgc3RhZ2VDb3VudCA9IHBpcGVsaW5lX3N0YXRlLT5ncmFwaGljc1BpcGVsaW5lQ0kuc3RhZ2VDb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChiaW5kX3BvaW50ID09IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSkgeworICAgICAgICAgICAgc3RhZ2VDb3VudCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoYmluZF9wb2ludCA9PSBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WKSB7CisgICAgICAgICAgICBzdGFnZUNvdW50ID0gcGlwZWxpbmVfc3RhdGUtPnJheXRyYWNpbmdQaXBlbGluZUNJLnN0YWdlQ291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBzdGFnZSA9IDA7IHN0YWdlIDwgc3RhZ2VDb3VudDsgKytzdGFnZSkgeworICAgICAgICAgICAgaWYgKHBpcGVsaW5lX3N0YXRlLT5hY3RpdmVfc2xvdHMuZmluZChkZXNjX3NldF9iaW5kX2luZGV4KSAhPSBwaXBlbGluZV9zdGF0ZS0+YWN0aXZlX3Nsb3RzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgRGlzcGF0Y2hEZXN0cm95U2hhZGVyTW9kdWxlKGRldmljZSwgQWNjZXNzb3I6OkdldFNoYWRlck1vZHVsZShwQ3JlYXRlSW5mb3NbcGlwZWxpbmVdLCBzdGFnZSksIHBBbGxvY2F0b3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBTSEFERVJfTU9EVUxFX1NUQVRFICpzaGFkZXJfc3RhdGUgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKGJpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUykgeworICAgICAgICAgICAgICAgIHNoYWRlcl9zdGF0ZSA9IEdldFNoYWRlck1vZHVsZVN0YXRlKHBpcGVsaW5lX3N0YXRlLT5ncmFwaGljc1BpcGVsaW5lQ0kucFN0YWdlc1tzdGFnZV0ubW9kdWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYmluZF9wb2ludCA9PSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc3RhZ2UgPT0gMCk7CisgICAgICAgICAgICAgICAgc2hhZGVyX3N0YXRlID0gR2V0U2hhZGVyTW9kdWxlU3RhdGUocGlwZWxpbmVfc3RhdGUtPmNvbXB1dGVQaXBlbGluZUNJLnN0YWdlLm1vZHVsZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVikgeworICAgICAgICAgICAgICAgIHNoYWRlcl9zdGF0ZSA9IEdldFNoYWRlck1vZHVsZVN0YXRlKHBpcGVsaW5lX3N0YXRlLT5yYXl0cmFjaW5nUGlwZWxpbmVDSS5wU3RhZ2VzW3N0YWdlXS5tb2R1bGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2hhZGVyX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBjb2RlOworICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHNoYWRlciBiaW5hcnkgaWYgZGVidWcgaW5mbyBpcyBwcmVzZW50LgorICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JlX3ZhbGlkYXRpb24gU2hhZGVyTW9kdWxlIHRyYWNrZXIgc2F2ZXMgdGhlIGJpbmFyeSB0b28sIGJ1dCBkaXNjYXJkcyBpdCB3aGVuIHRoZSBTaGFkZXJNb2R1bGUKKyAgICAgICAgICAgICAgICAvLyBpcyBkZXN0cm95ZWQuICBBcHBsaWNhdGlvbnMgbWF5IGRlc3Ryb3kgU2hhZGVyTW9kdWxlcyBhZnRlciB0aGV5IGFyZSBwbGFjZWQgaW4gYSBwaXBlbGluZSBhbmQgYmVmb3JlCisgICAgICAgICAgICAgICAgLy8gdGhlIHBpcGVsaW5lIGlzIHVzZWQsIHNvIHdlIGhhdmUgdG8ga2VlcCBhbm90aGVyIGNvcHkuCisgICAgICAgICAgICAgICAgaWYgKHNoYWRlcl9zdGF0ZS0+aGFzX3ZhbGlkX3NwaXJ2KSB7ICAvLyByZWFsbHkgY2hlY2tpbmcgZm9yIHByZXNlbnNlIG9mIFNQSVItViBjb2RlLgorICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaW5zbiA6ICpzaGFkZXJfc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuLm9wY29kZSgpID09IHNwdjo6T3BMaW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IHNoYWRlcl9zdGF0ZS0+d29yZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hhZGVyX21hcFtzaGFkZXJfc3RhdGUtPmdwdV92YWxpZGF0aW9uX3NoYWRlcl9pZF0ucGlwZWxpbmUgPSBwaXBlbGluZV9zdGF0ZS0+cGlwZWxpbmU7CisgICAgICAgICAgICAgICAgLy8gQmUgY2FyZWZ1bCB0byB1c2UgdGhlIG9yaWdpbmFsbHkgYm91bmQgKGluc3RydW1lbnRlZCkgc2hhZGVyIGhlcmUsIGV2ZW4gaWYgUHJlQ2FsbFJlY29yZCBoYWQgdG8gYmFjayBpdAorICAgICAgICAgICAgICAgIC8vIG91dCB3aXRoIGEgbm9uLWluc3RydW1lbnRlZCBzaGFkZXIuICBUaGUgbm9uLWluc3RydW1lbnRlZCBzaGFkZXIgKGZvdW5kIGluIHBDcmVhdGVJbmZvKSB3YXMgZGVzdHJveWVkIGFib3ZlLgorICAgICAgICAgICAgICAgIFZrU2hhZGVyTW9kdWxlIHNoYWRlcl9tb2R1bGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgICAgICAgICBpZiAoYmluZF9wb2ludCA9PSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTKSB7CisgICAgICAgICAgICAgICAgICAgIHNoYWRlcl9tb2R1bGUgPSBwaXBlbGluZV9zdGF0ZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBTdGFnZXNbc3RhZ2VdLm1vZHVsZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChzdGFnZSA9PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgc2hhZGVyX21vZHVsZSA9IHBpcGVsaW5lX3N0YXRlLT5jb21wdXRlUGlwZWxpbmVDSS5zdGFnZS5tb2R1bGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kX3BvaW50ID09IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfUkFZX1RSQUNJTkdfTlYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hhZGVyX21vZHVsZSA9IHBpcGVsaW5lX3N0YXRlLT5yYXl0cmFjaW5nUGlwZWxpbmVDSS5wU3RhZ2VzW3N0YWdlXS5tb2R1bGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hhZGVyX21hcFtzaGFkZXJfc3RhdGUtPmdwdV92YWxpZGF0aW9uX3NoYWRlcl9pZF0uc2hhZGVyX21vZHVsZSA9IHNoYWRlcl9tb2R1bGU7CisgICAgICAgICAgICAgICAgc2hhZGVyX21hcFtzaGFkZXJfc3RhdGUtPmdwdV92YWxpZGF0aW9uX3NoYWRlcl9pZF0ucGdtID0gc3RkOjptb3ZlKGNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBSZW1vdmUgYWxsIHRoZSBzaGFkZXIgdHJhY2tlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVzdHJveWVkIHBpcGVsaW5lLgordm9pZCBHcHVBc3Npc3RlZDo6UHJlQ2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGZvciAoYXV0byBpdCA9IHNoYWRlcl9tYXAuYmVnaW4oKTsgaXQgIT0gc2hhZGVyX21hcC5lbmQoKTspIHsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQucGlwZWxpbmUgPT0gcGlwZWxpbmUpIHsKKyAgICAgICAgICAgIGl0ID0gc2hhZGVyX21hcC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorICAgIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmUoZGV2aWNlLCBwaXBlbGluZSwgcEFsbG9jYXRvcik7Cit9CisKKy8vIENhbGwgdGhlIFNQSVItViBPcHRpbWl6ZXIgdG8gcnVuIHRoZSBpbnN0cnVtZW50YXRpb24gcGFzcyBvbiB0aGUgc2hhZGVyLgorYm9vbCBHcHVBc3Npc3RlZDo6SW5zdHJ1bWVudFNoYWRlcihjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZuZXdfcGdtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdW5pcXVlX3NoYWRlcl9pZCkgeworICAgIGlmIChhYm9ydGVkKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKHBDcmVhdGVJbmZvLT5wQ29kZVswXSAhPSBzcHY6Ok1hZ2ljTnVtYmVyKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBMb2FkIG9yaWdpbmFsIHNoYWRlciBTUElSLVYKKyAgICB1aW50MzJfdCBudW1fd29yZHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocENyZWF0ZUluZm8tPmNvZGVTaXplIC8gNCk7CisgICAgbmV3X3BnbS5jbGVhcigpOworICAgIG5ld19wZ20ucmVzZXJ2ZShudW1fd29yZHMpOworICAgIG5ld19wZ20uaW5zZXJ0KG5ld19wZ20uZW5kKCksICZwQ3JlYXRlSW5mby0+cENvZGVbMF0sICZwQ3JlYXRlSW5mby0+cENvZGVbbnVtX3dvcmRzXSk7CisKKyAgICAvLyBDYWxsIHRoZSBvcHRpbWl6ZXIgdG8gaW5zdHJ1bWVudCB0aGUgc2hhZGVyLgorICAgIC8vIFVzZSB0aGUgdW5pcXVlX3NoYWRlcl9tb2R1bGVfaWQgYXMgYSBzaGFkZXIgSUQgc28gd2UgY2FuIGxvb2sgdXAgaXRzIGhhbmRsZSBsYXRlciBpbiB0aGUgc2hhZGVyX21hcC4KKyAgICAvLyBJZiBkZXNjcmlwdG9yIGluZGV4aW5nIGlzIGVuYWJsZWQsIGVuYWJsZSBsZW5ndGggY2hlY2tzIGFuZCB1cGRhdGVkIGRlc2NyaXB0b3IgY2hlY2tzCisgICAgY29uc3QgYm9vbCBkZXNjcmlwdG9yX2luZGV4aW5nID0gSXNFeHRFbmFibGVkKGRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZXNjcmlwdG9yX2luZGV4aW5nKTsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3B2dG9vbHM7CisgICAgc3B2X3RhcmdldF9lbnYgdGFyZ2V0X2VudiA9IFNQVl9FTlZfVlVMS0FOXzFfMTsKKyAgICBPcHRpbWl6ZXIgb3B0aW1pemVyKHRhcmdldF9lbnYpOworICAgIG9wdGltaXplci5SZWdpc3RlclBhc3MoCisgICAgICAgIENyZWF0ZUluc3RCaW5kbGVzc0NoZWNrUGFzcyhkZXNjX3NldF9iaW5kX2luZGV4LCB1bmlxdWVfc2hhZGVyX21vZHVsZV9pZCwgZGVzY3JpcHRvcl9pbmRleGluZywgZGVzY3JpcHRvcl9pbmRleGluZywgMikpOworICAgIG9wdGltaXplci5SZWdpc3RlclBhc3MoQ3JlYXRlQWdncmVzc2l2ZURDRVBhc3MoKSk7CisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2V4dF9idWZmZXJfZGV2aWNlX2FkZHJlc3MgJiYgc2hhZGVySW50NjQpCisgICAgICAgIG9wdGltaXplci5SZWdpc3RlclBhc3MoQ3JlYXRlSW5zdEJ1ZmZBZGRyQ2hlY2tQYXNzKGRlc2Nfc2V0X2JpbmRfaW5kZXgsIHVuaXF1ZV9zaGFkZXJfbW9kdWxlX2lkKSk7CisgICAgYm9vbCBwYXNzID0gb3B0aW1pemVyLlJ1bihuZXdfcGdtLmRhdGEoKSwgbmV3X3BnbS5zaXplKCksICZuZXdfcGdtKTsKKyAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCwgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbHVyZSB0byBpbnN0cnVtZW50IHNoYWRlci4gIFByb2NlZWRpbmcgd2l0aCBub24taW5zdHJ1bWVudGVkIHNoYWRlci4iKTsKKyAgICB9CisgICAgKnVuaXF1ZV9zaGFkZXJfaWQgPSB1bmlxdWVfc2hhZGVyX21vZHVsZV9pZCsrOworICAgIHJldHVybiBwYXNzOworfQorLy8gQ3JlYXRlIHRoZSBpbnN0cnVtZW50ZWQgc2hhZGVyIGRhdGEgdG8gcHJvdmlkZSB0byB0aGUgZHJpdmVyLgordm9pZCBHcHVBc3Npc3RlZDo6UHJlQ2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTaGFkZXJNb2R1bGUgKnBTaGFkZXJNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNzbV9zdGF0ZV9kYXRhKSB7CisgICAgY3JlYXRlX3NoYWRlcl9tb2R1bGVfYXBpX3N0YXRlICpjc21fc3RhdGUgPSByZWludGVycHJldF9jYXN0PGNyZWF0ZV9zaGFkZXJfbW9kdWxlX2FwaV9zdGF0ZSAqPihjc21fc3RhdGVfZGF0YSk7CisgICAgYm9vbCBwYXNzID0gSW5zdHJ1bWVudFNoYWRlcihwQ3JlYXRlSW5mbywgY3NtX3N0YXRlLT5pbnN0cnVtZW50ZWRfcGdtLCAmY3NtX3N0YXRlLT51bmlxdWVfc2hhZGVyX2lkKTsKKyAgICBpZiAocGFzcykgeworICAgICAgICBjc21fc3RhdGUtPmluc3RydW1lbnRlZF9jcmVhdGVfaW5mby5wQ29kZSA9IGNzbV9zdGF0ZS0+aW5zdHJ1bWVudGVkX3BnbS5kYXRhKCk7CisgICAgICAgIGNzbV9zdGF0ZS0+aW5zdHJ1bWVudGVkX2NyZWF0ZV9pbmZvLmNvZGVTaXplID0gY3NtX3N0YXRlLT5pbnN0cnVtZW50ZWRfcGdtLnNpemUoKSAqIHNpemVvZih1bnNpZ25lZCBpbnQpOworICAgIH0KK30KKworLy8gR2VuZXJhdGUgdGhlIHN0YWdlLXNwZWNpZmljIHBhcnQgb2YgdGhlIG1lc3NhZ2UuCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVN0YWdlTWVzc2FnZShjb25zdCB1aW50MzJfdCAqZGVidWdfcmVjb3JkLCBzdGQ6OnN0cmluZyAmbXNnKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHNwdnRvb2xzOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJtOworICAgIHN3aXRjaCAoZGVidWdfcmVjb3JkW2tJbnN0Q29tbW9uT3V0U3RhZ2VJZHhdKSB7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbFZlcnRleDogeworICAgICAgICAgICAgc3RybSA8PCAiU3RhZ2UgPSBWZXJ0ZXguIFZlcnRleCBJbmRleCA9ICIgPDwgZGVidWdfcmVjb3JkW2tJbnN0VmVydE91dFZlcnRleEluZGV4XQorICAgICAgICAgICAgICAgICA8PCAiIEluc3RhbmNlIEluZGV4ID0gIiA8PCBkZWJ1Z19yZWNvcmRba0luc3RWZXJ0T3V0SW5zdGFuY2VJbmRleF0gPDwgIi4gIjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVsVGVzc2VsbGF0aW9uQ29udHJvbDogeworICAgICAgICAgICAgc3RybSA8PCAiU3RhZ2UgPSBUZXNzZWxsYXRpb24gQ29udHJvbC4gIEludm9jYXRpb24gSUQgPSAiIDw8IGRlYnVnX3JlY29yZFtrSW5zdFRlc3NDdGxPdXRJbnZvY2F0aW9uSWRdCisgICAgICAgICAgICAgICAgIDw8ICIsIFByaW1pdGl2ZSBJRCA9ICIgPDwgZGVidWdfcmVjb3JkW2tJbnN0VGVzc0N0bE91dFByaW1pdGl2ZUlkXTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVsVGVzc2VsbGF0aW9uRXZhbHVhdGlvbjogeworICAgICAgICAgICAgc3RybSA8PCAiU3RhZ2UgPSBUZXNzZWxsYXRpb24gRXZhbC4gIFByaW1pdGl2ZSBJRCA9ICIgPDwgZGVidWdfcmVjb3JkW2tJbnN0VGVzc0V2YWxPdXRQcmltaXRpdmVJZF0KKyAgICAgICAgICAgICAgICAgPDwgIiwgVGVzc0Nvb3JkICh1LCB2KSA9ICgiIDw8IGRlYnVnX3JlY29yZFtrSW5zdFRlc3NFdmFsT3V0VGVzc0Nvb3JkVV0gPDwgIiwgIgorICAgICAgICAgICAgICAgICA8PCBkZWJ1Z19yZWNvcmRba0luc3RUZXNzRXZhbE91dFRlc3NDb29yZFZdIDw8ICIpLiAiOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxHZW9tZXRyeTogeworICAgICAgICAgICAgc3RybSA8PCAiU3RhZ2UgPSBHZW9tZXRyeS4gIFByaW1pdGl2ZSBJRCA9ICIgPDwgZGVidWdfcmVjb3JkW2tJbnN0R2VvbU91dFByaW1pdGl2ZUlkXQorICAgICAgICAgICAgICAgICA8PCAiIEludm9jYXRpb24gSUQgPSAiIDw8IGRlYnVnX3JlY29yZFtrSW5zdEdlb21PdXRJbnZvY2F0aW9uSWRdIDw8ICIuICI7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbEZyYWdtZW50OiB7CisgICAgICAgICAgICBzdHJtIDw8ICJTdGFnZSA9IEZyYWdtZW50LiAgRnJhZ21lbnQgY29vcmQgKHgseSkgPSAoIgorICAgICAgICAgICAgICAgICA8PCAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigmZGVidWdfcmVjb3JkW2tJbnN0RnJhZ091dEZyYWdDb29yZFhdKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgIDw8ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZkZWJ1Z19yZWNvcmRba0luc3RGcmFnT3V0RnJhZ0Nvb3JkWV0pIDw8ICIpLiAiOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxHTENvbXB1dGU6IHsKKyAgICAgICAgICAgIHN0cm0gPDwgIlN0YWdlID0gQ29tcHV0ZS4gIEdsb2JhbCBpbnZvY2F0aW9uIElEICh4LCB5LCB6KSA9ICgiIDw8IGRlYnVnX3JlY29yZFtrSW5zdENvbXBPdXRHbG9iYWxJbnZvY2F0aW9uSWRYXSA8PCAiLCAiCisgICAgICAgICAgICAgICAgIDw8IGRlYnVnX3JlY29yZFtrSW5zdENvbXBPdXRHbG9iYWxJbnZvY2F0aW9uSWRZXSA8PCAiLCAiIDw8IGRlYnVnX3JlY29yZFtrSW5zdENvbXBPdXRHbG9iYWxJbnZvY2F0aW9uSWRaXSA8PCAiICkiOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxSYXlHZW5lcmF0aW9uTlY6IHsKKyAgICAgICAgICAgIHN0cm0gPDwgIlN0YWdlID0gUmF5IEdlbmVyYXRpb24uICBHbG9iYWwgTGF1bmNoIElEICh4LHkseikgPSAoIiA8PCBkZWJ1Z19yZWNvcmRba0luc3RSYXlUcmFjaW5nT3V0TGF1bmNoSWRYXSA8PCAiLCAiCisgICAgICAgICAgICAgICAgIDw8IGRlYnVnX3JlY29yZFtrSW5zdFJheVRyYWNpbmdPdXRMYXVuY2hJZFldIDw8ICIsICIgPDwgZGVidWdfcmVjb3JkW2tJbnN0UmF5VHJhY2luZ091dExhdW5jaElkWl0gPDwgIikuICI7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbEludGVyc2VjdGlvbk5WOiB7CisgICAgICAgICAgICBzdHJtIDw8ICJTdGFnZSA9IEludGVyc2VjdGlvbi4gIEdsb2JhbCBMYXVuY2ggSUQgKHgseSx6KSA9ICgiIDw8IGRlYnVnX3JlY29yZFtrSW5zdFJheVRyYWNpbmdPdXRMYXVuY2hJZFhdIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgPDwgZGVidWdfcmVjb3JkW2tJbnN0UmF5VHJhY2luZ091dExhdW5jaElkWV0gPDwgIiwgIiA8PCBkZWJ1Z19yZWNvcmRba0luc3RSYXlUcmFjaW5nT3V0TGF1bmNoSWRaXSA8PCAiKS4gIjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVsQW55SGl0TlY6IHsKKyAgICAgICAgICAgIHN0cm0gPDwgIlN0YWdlID0gQW55IEhpdC4gIEdsb2JhbCBMYXVuY2ggSUQgKHgseSx6KSA9ICgiIDw8IGRlYnVnX3JlY29yZFtrSW5zdFJheVRyYWNpbmdPdXRMYXVuY2hJZFhdIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgPDwgZGVidWdfcmVjb3JkW2tJbnN0UmF5VHJhY2luZ091dExhdW5jaElkWV0gPDwgIiwgIiA8PCBkZWJ1Z19yZWNvcmRba0luc3RSYXlUcmFjaW5nT3V0TGF1bmNoSWRaXSA8PCAiKS4gIjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVsQ2xvc2VzdEhpdE5WOiB7CisgICAgICAgICAgICBzdHJtIDw8ICJTdGFnZSA9IENsb3Nlc3QgSGl0LiAgR2xvYmFsIExhdW5jaCBJRCAoeCx5LHopID0gKCIgPDwgZGVidWdfcmVjb3JkW2tJbnN0UmF5VHJhY2luZ091dExhdW5jaElkWF0gPDwgIiwgIgorICAgICAgICAgICAgICAgICA8PCBkZWJ1Z19yZWNvcmRba0luc3RSYXlUcmFjaW5nT3V0TGF1bmNoSWRZXSA8PCAiLCAiIDw8IGRlYnVnX3JlY29yZFtrSW5zdFJheVRyYWNpbmdPdXRMYXVuY2hJZFpdIDw8ICIpLiAiOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxNaXNzTlY6IHsKKyAgICAgICAgICAgIHN0cm0gPDwgIlN0YWdlID0gTWlzcy4gIEdsb2JhbCBMYXVuY2ggSUQgKHgseSx6KSA9ICgiIDw8IGRlYnVnX3JlY29yZFtrSW5zdFJheVRyYWNpbmdPdXRMYXVuY2hJZFhdIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgPDwgZGVidWdfcmVjb3JkW2tJbnN0UmF5VHJhY2luZ091dExhdW5jaElkWV0gPDwgIiwgIiA8PCBkZWJ1Z19yZWNvcmRba0luc3RSYXlUcmFjaW5nT3V0TGF1bmNoSWRaXSA8PCAiKS4gIjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVsQ2FsbGFibGVOVjogeworICAgICAgICAgICAgc3RybSA8PCAiU3RhZ2UgPSBDYWxsYWJsZS4gIEdsb2JhbCBMYXVuY2ggSUQgKHgseSx6KSA9ICgiIDw8IGRlYnVnX3JlY29yZFtrSW5zdFJheVRyYWNpbmdPdXRMYXVuY2hJZFhdIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgPDwgZGVidWdfcmVjb3JkW2tJbnN0UmF5VHJhY2luZ091dExhdW5jaElkWV0gPDwgIiwgIiA8PCBkZWJ1Z19yZWNvcmRba0luc3RSYXlUcmFjaW5nT3V0TGF1bmNoSWRaXSA8PCAiKS4gIjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgc3RybSA8PCAiSW50ZXJuYWwgRXJyb3IgKHVuZXhwZWN0ZWQgc3RhZ2UgPSAiIDw8IGRlYnVnX3JlY29yZFtrSW5zdENvbW1vbk91dFN0YWdlSWR4XSA8PCAiKS4gIjsKKyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgfQorICAgIG1zZyA9IHN0cm0uc3RyKCk7Cit9CisKKy8vIEdlbmVyYXRlIHRoZSBwYXJ0IG9mIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHZpb2xhdGlvbi4KK3N0YXRpYyB2b2lkIEdlbmVyYXRlVmFsaWRhdGlvbk1lc3NhZ2UoY29uc3QgdWludDMyX3QgKmRlYnVnX3JlY29yZCwgc3RkOjpzdHJpbmcgJm1zZywgc3RkOjpzdHJpbmcgJnZ1aWRfbXNnKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHNwdnRvb2xzOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJtOworICAgIHN3aXRjaCAoZGVidWdfcmVjb3JkW2tJbnN0MlZhbGlkYXRpb25PdXRFcnJvcl0pIHsKKyAgICAgICAgY2FzZSBrSW5zdEVycm9yQmluZGxlc3NCb3VuZHM6IHsKKyAgICAgICAgICAgIHN0cm0gPDwgIkluZGV4IG9mICIgPDwgZGVidWdfcmVjb3JkW2tJbnN0MkJpbmRsZXNzQm91bmRzT3V0RGVzY0luZGV4XSA8PCAiIHVzZWQgdG8gaW5kZXggZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggIgorICAgICAgICAgICAgICAgICA8PCBkZWJ1Z19yZWNvcmRba0luc3QyQmluZGxlc3NCb3VuZHNPdXREZXNjQm91bmRdIDw8ICIuICI7CisgICAgICAgICAgICB2dWlkX21zZyA9ICJVTkFTU0lHTkVELURlc2NyaXB0b3IgaW5kZXggb3V0IG9mIGJvdW5kcyI7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Uga0luc3RFcnJvckJpbmRsZXNzVW5pbml0OiB7CisgICAgICAgICAgICBzdHJtIDw8ICJEZXNjcmlwdG9yIGluZGV4ICIgPDwgZGVidWdfcmVjb3JkW2tJbnN0MkJpbmRsZXNzVW5pbml0T3V0RGVzY0luZGV4XSA8PCAiIGlzIHVuaW5pdGlhbGl6ZWQuICI7CisgICAgICAgICAgICB2dWlkX21zZyA9ICJVTkFTU0lHTkVELURlc2NyaXB0b3IgdW5pbml0aWFsaXplZCI7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Uga0luc3RFcnJvckJ1ZmZBZGRyVW5hbGxvY1JlZjogeworICAgICAgICAgICAgdWludDY0X3QgKnB0ciA9ICh1aW50NjRfdCAqKSZkZWJ1Z19yZWNvcmRba0luc3QyQnVmZkFkZHJVbmFsbG9jT3V0RGVzY1B0ckxvXTsKKyAgICAgICAgICAgIHN0cm0gPDwgIkRldmljZSBhZGRyZXNzIDB4IiA8PCBzdGQ6OmhleCA8PCAqcHRyIDw8ICIgYWNjZXNzIG91dCBvZiBib3VuZHMuICI7CisgICAgICAgICAgICB2dWlkX21zZyA9ICJVTkFTU0lHTkVELURldmljZSBhZGRyZXNzIG91dCBvZiBib3VuZHMiOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBzdHJtIDw8ICJJbnRlcm5hbCBFcnJvciAodW5leHBlY3RlZCBlcnJvciB0eXBlID0gIiA8PCBkZWJ1Z19yZWNvcmRba0luc3QyVmFsaWRhdGlvbk91dEVycm9yXSA8PCAiKS4gIjsKKyAgICAgICAgICAgIHZ1aWRfbXNnID0gIlVOQVNTSUdORUQtSW50ZXJuYWwgRXJyb3IiOworICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfSBicmVhazsKKyAgICB9CisgICAgbXNnID0gc3RybS5zdHIoKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIExvb2t1cERlYnVnVXRpbHNOYW1lKGNvbnN0IGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgY29uc3QgdWludDY0X3Qgb2JqZWN0KSB7CisgICAgYXV0byBvYmplY3RfbGFiZWwgPSByZXBvcnRfZGF0YS0+RGVidWdSZXBvcnRHZXRVdGlsc09iamVjdE5hbWUob2JqZWN0KTsKKyAgICBpZiAob2JqZWN0X2xhYmVsICE9ICIiKSB7CisgICAgICAgIG9iamVjdF9sYWJlbCA9ICIoIiArIG9iamVjdF9sYWJlbCArICIpIjsKKyAgICB9CisgICAgcmV0dXJuIG9iamVjdF9sYWJlbDsKK30KKworLy8gR2VuZXJhdGUgbWVzc2FnZSBmcm9tIHRoZSBjb21tb24gcG9ydGlvbiBvZiB0aGUgZGVidWcgcmVwb3J0IHJlY29yZC4KK3N0YXRpYyB2b2lkIEdlbmVyYXRlQ29tbW9uTWVzc2FnZShjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKmRlYnVnX3JlY29yZCwgY29uc3QgVmtTaGFkZXJNb2R1bGUgc2hhZGVyX21vZHVsZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaXBlbGluZSBwaXBlbGluZV9oYW5kbGUsIGNvbnN0IFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVfYmluZF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBvcGVyYXRpb25faW5kZXgsIHN0ZDo6c3RyaW5nICZtc2cpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3B2dG9vbHM7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cm07CisgICAgaWYgKHNoYWRlcl9tb2R1bGVfaGFuZGxlID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHN0cm0gPDwgc3RkOjpoZXggPDwgc3RkOjpzaG93YmFzZSA8PCAiSW50ZXJuYWwgRXJyb3I6IFVuYWJsZSB0byBsb2NhdGUgaW5mb3JtYXRpb24gZm9yIHNoYWRlciB1c2VkIGluIGNvbW1hbmQgYnVmZmVyICIKKyAgICAgICAgICAgICA8PCBMb29rdXBEZWJ1Z1V0aWxzTmFtZShyZXBvcnRfZGF0YSwgSGFuZGxlVG9VaW50NjQoY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlcikpIDw8ICIoIgorICAgICAgICAgICAgIDw8IEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpIDw8ICIpLiAiOworICAgICAgICBhc3NlcnQodHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RybSA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNob3diYXNlIDw8ICJDb21tYW5kIGJ1ZmZlciAiCisgICAgICAgICAgICAgPDwgTG9va3VwRGVidWdVdGlsc05hbWUocmVwb3J0X2RhdGEsIEhhbmRsZVRvVWludDY0KGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpKSA8PCAiKCIKKyAgICAgICAgICAgICA8PCBIYW5kbGVUb1VpbnQ2NChjYl9ub2RlLT5jb21tYW5kQnVmZmVyKSA8PCAiKS4gIjsKKyAgICAgICAgaWYgKHBpcGVsaW5lX2JpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUykgeworICAgICAgICAgICAgc3RybSA8PCAiRHJhdyAiOworICAgICAgICB9IGVsc2UgaWYgKHBpcGVsaW5lX2JpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFKSB7CisgICAgICAgICAgICBzdHJtIDw8ICJDb21wdXRlICI7CisgICAgICAgIH0gZWxzZSBpZiAocGlwZWxpbmVfYmluZF9wb2ludCA9PSBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WKSB7CisgICAgICAgICAgICBzdHJtIDw8ICJSYXkgVHJhY2UgIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICBzdHJtIDw8ICJVbmtub3duIFBpcGVsaW5lIE9wZXJhdGlvbiAiOworICAgICAgICB9CisgICAgICAgIHN0cm0gPDwgIkluZGV4ICIgPDwgb3BlcmF0aW9uX2luZGV4IDw8ICIuICIKKyAgICAgICAgICAgICA8PCAiUGlwZWxpbmUgIiA8PCBMb29rdXBEZWJ1Z1V0aWxzTmFtZShyZXBvcnRfZGF0YSwgSGFuZGxlVG9VaW50NjQocGlwZWxpbmVfaGFuZGxlKSkgPDwgIigiCisgICAgICAgICAgICAgPDwgSGFuZGxlVG9VaW50NjQocGlwZWxpbmVfaGFuZGxlKSA8PCAiKS4gIgorICAgICAgICAgICAgIDw8ICJTaGFkZXIgTW9kdWxlICIgPDwgTG9va3VwRGVidWdVdGlsc05hbWUocmVwb3J0X2RhdGEsIEhhbmRsZVRvVWludDY0KHNoYWRlcl9tb2R1bGVfaGFuZGxlKSkgPDwgIigiCisgICAgICAgICAgICAgPDwgSGFuZGxlVG9VaW50NjQoc2hhZGVyX21vZHVsZV9oYW5kbGUpIDw8ICIpLiAiOworICAgIH0KKyAgICBzdHJtIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6bm9zaG93YmFzZTsKKyAgICBzdHJtIDw8ICJTaGFkZXIgSW5zdHJ1Y3Rpb24gSW5kZXggPSAiIDw8IGRlYnVnX3JlY29yZFtrSW5zdENvbW1vbk91dEluc3RydWN0aW9uSWR4XSA8PCAiLiAiOworICAgIG1zZyA9IHN0cm0uc3RyKCk7Cit9CisKKy8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBTUElSLVYgT3BTb3VyY2UgaW5zdHJ1Y3Rpb24gYW5kIGFueSBmb2xsb3dpbmcgY29udGludWF0aW9uIGluc3RydWN0aW9ucy4KKy8vIFNwbGl0IHRoZSBzaW5nbGUgc3RyaW5nIGludG8gYSB2ZWN0b3Igb2Ygc3RyaW5ncywgb25lIGZvciBlYWNoIGxpbmUsIGZvciBlYXNpZXIgcHJvY2Vzc2luZy4KK3N0YXRpYyB2b2lkIFJlYWRPcFNvdXJjZShjb25zdCBTSEFERVJfTU9EVUxFX1NUQVRFICZzaGFkZXIsIGNvbnN0IHVpbnQzMl90IHJlcG9ydGVkX2ZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvcHNvdXJjZV9saW5lcykgeworICAgIGZvciAoYXV0byBpbnNuIDogc2hhZGVyKSB7CisgICAgICAgIGlmICgoaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wU291cmNlKSAmJiAoaW5zbi5sZW4oKSA+PSA1KSAmJiAoaW5zbi53b3JkKDMpID09IHJlcG9ydGVkX2ZpbGVfaWQpKSB7CisgICAgICAgICAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaW5fc3RyZWFtOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY3VyX2xpbmU7CisgICAgICAgICAgICBpbl9zdHJlYW0uc3RyKChjaGFyICopJmluc24ud29yZCg0KSk7CisgICAgICAgICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGluX3N0cmVhbSwgY3VyX2xpbmUpKSB7CisgICAgICAgICAgICAgICAgb3Bzb3VyY2VfbGluZXMucHVzaF9iYWNrKGN1cl9saW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgoKytpbnNuKS5vcGNvZGUoKSA9PSBzcHY6Ok9wU291cmNlQ29udGludWVkKSB7CisgICAgICAgICAgICAgICAgaW5fc3RyZWFtLnN0cigoY2hhciAqKSZpbnNuLndvcmQoMSkpOworICAgICAgICAgICAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoaW5fc3RyZWFtLCBjdXJfbGluZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3Bzb3VyY2VfbGluZXMucHVzaF9iYWNrKGN1cl9saW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gVGhlIHRhc2sgaGVyZSBpcyB0byBzZWFyY2ggdGhlIE9wU291cmNlIGNvbnRlbnQgdG8gZmluZCB0aGUgI2xpbmUgZGlyZWN0aXZlIHdpdGggdGhlCisvLyBsaW5lIG51bWJlciB0aGF0IGlzIGNsb3Nlc3QgdG8sIGJ1dCBzdGlsbCBwcmlvciB0byB0aGUgcmVwb3J0ZWQgZXJyb3IgbGluZSBudW1iZXIgYW5kCisvLyBzdGlsbCB3aXRoaW4gdGhlIHJlcG9ydGVkIGZpbGVuYW1lLgorLy8gRnJvbSB0aGlzIGtub3duIHBvc2l0aW9uIGluIHRoZSBPcFNvdXJjZSBjb250ZW50IHdlIGNhbiBhZGQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorLy8gdGhlICNsaW5lIGxpbmUgbnVtYmVyIGFuZCB0aGUgcmVwb3J0ZWQgZXJyb3IgbGluZSBudW1iZXIgdG8gZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbgorLy8gaW4gdGhlIE9wU291cmNlIGNvbnRlbnQgb2YgdGhlIHJlcG9ydGVkIGVycm9yIGxpbmUuCisvLworLy8gQ29uc2lkZXJhdGlvbnM6CisvLyAtIExvb2sgb25seSBhdCAjbGluZSBkaXJlY3RpdmVzIHRoYXQgc3BlY2lmeSB0aGUgcmVwb3J0ZWRfZmlsZW5hbWUgc2luY2UKKy8vICAgdGhlIHJlcG9ydGVkIGVycm9yIGxpbmUgbnVtYmVyIHJlZmVycyB0byBpdHMgbG9jYXRpb24gaW4gdGhlIHJlcG9ydGVkIGZpbGVuYW1lLgorLy8gLSBJZiBhICNsaW5lIGRpcmVjdGl2ZSBkb2VzIG5vdCBoYXZlIGEgZmlsZW5hbWUsIHRoZSBmaWxlIGlzIHRoZSByZXBvcnRlZCBmaWxlbmFtZSwgb3IKKy8vICAgdGhlIGZpbGVuYW1lIGZvdW5kIGluIGEgcHJpb3IgI2xpbmUgZGlyZWN0aXZlLiAgKFRoaXMgaXMgQy1wcmVwcm9jZXNzb3IgYmVoYXZpb3IpCisvLyAtIEl0IGlzIHBvc3NpYmxlIChlLmcuLCBpbmxpbmluZykgZm9yIGJsb2NrcyBvZiBjb2RlIHRvIGdldCBzaHVmZmxlZCBvdXQgb2YgdGhlaXIKKy8vICAgb3JpZ2luYWwgb3JkZXIgYW5kIHRoZSAjbGluZSBkaXJlY3RpdmVzIGFyZSB1c2VkIHRvIGtlZXAgdGhlIG51bWJlcmluZyBjb3JyZWN0LiAgVGhpcworLy8gICBpcyB3aHkgd2UgbmVlZCB0byBleGFtaW5lIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHNvdXJjZSwgaW5zdGVhZCBvZiBsZWF2aW5nIGVhcmx5CisvLyAgIHdoZW4gZmluZGluZyBhICNsaW5lIGxpbmUgbnVtYmVyIGxhcmdlciB0aGFuIHRoZSByZXBvcnRlZCBlcnJvciBsaW5lIG51bWJlci4KKy8vCisKKy8vIEdDQyA0LjggaGFzIGEgcHJvYmxlbSB3aXRoIHN0ZDo6cmVnZXggdGhhdCBpcyBmaXhlZCBpbiBHQ0MgNC45LiAgUHJvdmlkZSBmYWxsYmFjayBjb2RlIGZvciA0LjgKKyNkZWZpbmUgR0NDX1ZFUlNJT04gKF9fR05VQ19fICogMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyAqIDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBHQ0NfVkVSU0lPTiA8IDQwOTAwCitzdGF0aWMgYm9vbCBHZXRMaW5lQW5kRmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nLCB1aW50MzJfdCAqbGluZW51bWJlciwgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKSB7CisgICAgLy8gIyBsaW5lIDxsaW5lbnVtYmVyPiAiPGZpbGVuYW1lPiIgb3IKKyAgICAvLyAjbGluZSA8bGluZW51bWJlcj4gIjxmaWxlbmFtZT4iCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW0oc3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0ZW1wOworICAgIHVpbnQzMl90IGxpbmVfaW5kZXggPSAwOworCisgICAgd2hpbGUgKHN0cmVhbSA+PiB0ZW1wKSB0b2tlbnMucHVzaF9iYWNrKHRlbXApOworICAgIGF1dG8gc2l6ZSA9IHRva2Vucy5zaXplKCk7CisgICAgaWYgKHNpemUgPiAxKSB7CisgICAgICAgIGlmICh0b2tlbnNbMF0gPT0gIiMiICYmIHRva2Vuc1sxXSA9PSAibGluZSIpIHsKKyAgICAgICAgICAgIGxpbmVfaW5kZXggPSAyOworICAgICAgICB9IGVsc2UgaWYgKHRva2Vuc1swXSA9PSAiI2xpbmUiKSB7CisgICAgICAgICAgICBsaW5lX2luZGV4ID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoMCA9PSBsaW5lX2luZGV4KSByZXR1cm4gZmFsc2U7CisgICAgKmxpbmVudW1iZXIgPSBzdGQ6OnN0b3VsKHRva2Vuc1tsaW5lX2luZGV4XSk7CisgICAgdWludDMyX3QgZmlsZW5hbWVfaW5kZXggPSBsaW5lX2luZGV4ICsgMTsKKyAgICAvLyBSZW1vdmUgZW5jbG9zaW5nIGRvdWJsZSBxdW90ZXMgYXJvdW5kIGZpbGVuYW1lCisgICAgaWYgKHNpemUgPiBmaWxlbmFtZV9pbmRleCkgZmlsZW5hbWUgPSB0b2tlbnNbZmlsZW5hbWVfaW5kZXhdLnN1YnN0cigxLCB0b2tlbnNbZmlsZW5hbWVfaW5kZXhdLnNpemUoKSAtIDIpOworICAgIHJldHVybiB0cnVlOworfQorI2Vsc2UKK3N0YXRpYyBib29sIEdldExpbmVBbmRGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmcsIHVpbnQzMl90ICpsaW5lbnVtYmVyLCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpyZWdleCBsaW5lX3JlZ2V4KCAgLy8gbWF0Y2hlcyAjbGluZSBkaXJlY3RpdmVzCisgICAgICAgICJeIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiBsaW5lCisgICAgICAgICJcXHMqIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIHdoaXRlc3BhY2UKKyAgICAgICAgIiMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQgdGV4dAorICAgICAgICAiXFxzKiIgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCB3aGl0ZXNwYWNlCisgICAgICAgICJsaW5lIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVkIHRleHQKKyAgICAgICAgIlxccysiICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQgd2hpdGVzcGFjZQorICAgICAgICAiKFswLTldKykiICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZCBmaXJzdCBjYXB0dXJlIC0gbGluZSBudW1iZXIKKyAgICAgICAgIihcXHMrKT8iICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgc2Vjb25kIGNhcHR1cmUgLSB3aGl0ZXNwYWNlCisgICAgICAgICIoXCIuK1wiKT8iICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIHRoaXJkIGNhcHR1cmUgLSBxdW90ZWQgZmlsZW5hbWUgd2l0aCBhdCBsZWFzdCBvbmUgY2hhciBpbnNpZGUKKyAgICAgICAgIi4qIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdCBvZiBsaW5lIChuZWVkZWQgd2hlbiB1c2luZyBzdGQ6OnJlZ2V4X21hdGNoIHNpbmNlIHRoZSBlbnRpcmUgbGluZSBpcyB0ZXN0ZWQpCisKKyAgICBzdGQ6OnNtYXRjaCBjYXB0dXJlczsKKworICAgIGJvb2wgZm91bmRfbGluZSA9IHN0ZDo6cmVnZXhfbWF0Y2goc3RyaW5nLCBjYXB0dXJlcywgbGluZV9yZWdleCk7CisgICAgaWYgKCFmb3VuZF9saW5lKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBmaWxlbmFtZSBpcyBvcHRpb25hbCBhbmQgY29uc2lkZXJlZCBmb3VuZCBvbmx5IGlmIHRoZSB3aGl0ZXNwYWNlIGFuZCB0aGUgZmlsZW5hbWUgYXJlIGNhcHR1cmVkCisgICAgaWYgKGNhcHR1cmVzWzJdLm1hdGNoZWQgJiYgY2FwdHVyZXNbM10ubWF0Y2hlZCkgeworICAgICAgICAvLyBSZW1vdmUgZW5jbG9zaW5nIGRvdWJsZSBxdW90ZXMuICBUaGUgcmVnZXggZ3VhcmFudGVlcyB0aGUgcXVvdGVzIGFuZCBhdCBsZWFzdCBvbmUgY2hhci4KKyAgICAgICAgZmlsZW5hbWUgPSBjYXB0dXJlc1szXS5zdHIoKS5zdWJzdHIoMSwgY2FwdHVyZXNbM10uc3RyKCkuc2l6ZSgpIC0gMik7CisgICAgfQorICAgICpsaW5lbnVtYmVyID0gc3RkOjpzdG91bChjYXB0dXJlc1sxXSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgIC8vIEdDQ19WRVJTSU9OCisKKy8vIEV4dHJhY3QgdGhlIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kIGNvbHVtbiBudW1iZXIgZnJvbSB0aGUgY29ycmVjdCBPcExpbmUgYW5kIGJ1aWxkIGEgbWVzc2FnZSBzdHJpbmcgZnJvbSBpdC4KKy8vIFNjYW4gdGhlIHNvdXJjZSAoZnJvbSBPcFNvdXJjZSkgdG8gZmluZCB0aGUgbGluZSBvZiBzb3VyY2UgYXQgdGhlIHJlcG9ydGVkIGxpbmUgbnVtYmVyIGFuZCBwbGFjZSBpdCBpbiBhbm90aGVyIG1lc3NhZ2Ugc3RyaW5nLgorc3RhdGljIHZvaWQgR2VuZXJhdGVTb3VyY2VNZXNzYWdlcyhjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZwZ20sIGNvbnN0IHVpbnQzMl90ICpkZWJ1Z19yZWNvcmQsIHN0ZDo6c3RyaW5nICZmaWxlbmFtZV9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZzb3VyY2VfbXNnKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHNwdnRvb2xzOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmaWxlbmFtZV9zdHJlYW07CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNvdXJjZV9zdHJlYW07CisgICAgU0hBREVSX01PRFVMRV9TVEFURSBzaGFkZXI7CisgICAgc2hhZGVyLndvcmRzID0gcGdtOworICAgIC8vIEZpbmQgdGhlIE9wTGluZSBqdXN0IGJlZm9yZSB0aGUgZmFpbGluZyBpbnN0cnVjdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIGRlYnVnIGluZm8uCisgICAgLy8gU1BJUi1WIGNhbiBvbmx5IGJlIGl0ZXJhdGVkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiBkdWUgdG8gaXRzIG9wY29kZS9sZW5ndGggZW5jb2RpbmcuCisgICAgdWludDMyX3QgaW5zdHJ1Y3Rpb25faW5kZXggPSAwOworICAgIHVpbnQzMl90IHJlcG9ydGVkX2ZpbGVfaWQgPSAwOworICAgIHVpbnQzMl90IHJlcG9ydGVkX2xpbmVfbnVtYmVyID0gMDsKKyAgICB1aW50MzJfdCByZXBvcnRlZF9jb2x1bW5fbnVtYmVyID0gMDsKKyAgICBpZiAoc2hhZGVyLndvcmRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChhdXRvIGluc24gOiBzaGFkZXIpIHsKKyAgICAgICAgICAgIGlmIChpbnNuLm9wY29kZSgpID09IHNwdjo6T3BMaW5lKSB7CisgICAgICAgICAgICAgICAgcmVwb3J0ZWRfZmlsZV9pZCA9IGluc24ud29yZCgxKTsKKyAgICAgICAgICAgICAgICByZXBvcnRlZF9saW5lX251bWJlciA9IGluc24ud29yZCgyKTsKKyAgICAgICAgICAgICAgICByZXBvcnRlZF9jb2x1bW5fbnVtYmVyID0gaW5zbi53b3JkKDMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uX2luZGV4ID09IGRlYnVnX3JlY29yZFtrSW5zdENvbW1vbk91dEluc3RydWN0aW9uSWR4XSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdHJ1Y3Rpb25faW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBDcmVhdGUgbWVzc2FnZSB3aXRoIGZpbGUgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSB0aGUgT3BTdHJpbmcgcG9pbnRlZCB0byBieSB0aGUgZGlzY292ZXJlZCBPcExpbmUuCisgICAgc3RkOjpzdHJpbmcgcmVwb3J0ZWRfZmlsZW5hbWU7CisgICAgaWYgKHJlcG9ydGVkX2ZpbGVfaWQgPT0gMCkgeworICAgICAgICBmaWxlbmFtZV9zdHJlYW0KKyAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gZmluZCBTUElSLVYgT3BMaW5lIGZvciBzb3VyY2UgaW5mb3JtYXRpb24uICBCdWlsZCBzaGFkZXIgd2l0aCBkZWJ1ZyBpbmZvIHRvIGdldCBzb3VyY2UgaW5mb3JtYXRpb24uIjsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGZvdW5kX29wc3RyaW5nID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byBpbnNuIDogc2hhZGVyKSB7CisgICAgICAgICAgICBpZiAoKGluc24ub3Bjb2RlKCkgPT0gc3B2OjpPcFN0cmluZykgJiYgKGluc24ubGVuKCkgPj0gMykgJiYgKGluc24ud29yZCgxKSA9PSByZXBvcnRlZF9maWxlX2lkKSkgeworICAgICAgICAgICAgICAgIGZvdW5kX29wc3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXBvcnRlZF9maWxlbmFtZSA9IChjaGFyICopJmluc24ud29yZCgyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZWRfZmlsZW5hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9zdHJlYW0gPDwgIlNoYWRlciB2YWxpZGF0aW9uIGVycm9yIG9jY3VycmVkIGF0IGxpbmUgIiA8PCByZXBvcnRlZF9saW5lX251bWJlcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9zdHJlYW0gPDwgIlNoYWRlciB2YWxpZGF0aW9uIGVycm9yIG9jY3VycmVkIGluIGZpbGU6ICIgPDwgcmVwb3J0ZWRfZmlsZW5hbWUgPDwgIiBhdCBsaW5lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlcG9ydGVkX2xpbmVfbnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZWRfY29sdW1uX251bWJlciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfc3RyZWFtIDw8ICIsIGNvbHVtbiAiIDw8IHJlcG9ydGVkX2NvbHVtbl9udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbGVuYW1lX3N0cmVhbSA8PCAiLiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZF9vcHN0cmluZykgeworICAgICAgICAgICAgZmlsZW5hbWVfc3RyZWFtIDw8ICJVbmFibGUgdG8gZmluZCBTUElSLVYgT3BTdHJpbmcgZm9yIGZpbGUgaWQgIiA8PCByZXBvcnRlZF9maWxlX2lkIDw8ICIgZnJvbSBPcExpbmUgaW5zdHJ1Y3Rpb24uIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBmaWxlbmFtZV9tc2cgPSBmaWxlbmFtZV9zdHJlYW0uc3RyKCk7CisKKyAgICAvLyBDcmVhdGUgbWVzc2FnZSB0byBkaXNwbGF5IHNvdXJjZSBjb2RlIGxpbmUgY29udGFpbmluZyBlcnJvci4KKyAgICBpZiAoKHJlcG9ydGVkX2ZpbGVfaWQgIT0gMCkpIHsKKyAgICAgICAgLy8gUmVhZCB0aGUgc291cmNlIGNvZGUgYW5kIHNwbGl0IGl0IHVwIGludG8gc2VwYXJhdGUgbGluZXMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvcHNvdXJjZV9saW5lczsKKyAgICAgICAgUmVhZE9wU291cmNlKHNoYWRlciwgcmVwb3J0ZWRfZmlsZV9pZCwgb3Bzb3VyY2VfbGluZXMpOworICAgICAgICAvLyBGaW5kIHRoZSBsaW5lIGluIHRoZSBPcFNvdXJjZSBjb250ZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHJlcG9ydGVkIGVycm9yIGZpbGUgYW5kIGxpbmUuCisgICAgICAgIGlmICghb3Bzb3VyY2VfbGluZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgdWludDMyX3Qgc2F2ZWRfbGluZV9udW1iZXIgPSAwOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY3VycmVudF9maWxlbmFtZSA9IHJlcG9ydGVkX2ZpbGVuYW1lOyAgLy8gY3VycmVudCAicHJlcHJvY2Vzc29yIiBmaWxlbmFtZSBzdGF0ZS4KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6c2l6ZV90eXBlIHNhdmVkX29wc291cmNlX29mZnNldCA9IDA7CisgICAgICAgICAgICBib29sIGZvdW5kX2Jlc3RfbGluZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gb3Bzb3VyY2VfbGluZXMuYmVnaW4oKTsgaXQgIT0gb3Bzb3VyY2VfbGluZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJzZWRfbGluZV9udW1iZXI7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGFyc2VkX2ZpbGVuYW1lOworICAgICAgICAgICAgICAgIGJvb2wgZm91bmRfbGluZSA9IEdldExpbmVBbmRGaWxlbmFtZSgqaXQsICZwYXJzZWRfbGluZV9udW1iZXIsIHBhcnNlZF9maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZF9saW5lKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGJvb2wgZm91bmRfZmlsZW5hbWUgPSBwYXJzZWRfZmlsZW5hbWUuc2l6ZSgpID4gMDsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmRfZmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF9maWxlbmFtZSA9IHBhcnNlZF9maWxlbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCghZm91bmRfZmlsZW5hbWUpIHx8IChjdXJyZW50X2ZpbGVuYW1lID09IHJlcG9ydGVkX2ZpbGVuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNhbmRpZGF0ZSBiZXN0IGxpbmUgZGlyZWN0aXZlLCBpZiB0aGUgY3VycmVudCBvbmUgaXMgcHJpb3IgYW5kIGNsb3NlciB0byB0aGUgcmVwb3J0ZWQgbGluZQorICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZWRfbGluZV9udW1iZXIgPj0gcGFyc2VkX2xpbmVfbnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kX2Jlc3RfbGluZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBvcnRlZF9saW5lX251bWJlciAtIHBhcnNlZF9saW5lX251bWJlciA8PSByZXBvcnRlZF9saW5lX251bWJlciAtIHNhdmVkX2xpbmVfbnVtYmVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkX2xpbmVfbnVtYmVyID0gcGFyc2VkX2xpbmVfbnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkX29wc291cmNlX29mZnNldCA9IHN0ZDo6ZGlzdGFuY2Uob3Bzb3VyY2VfbGluZXMuYmVnaW4oKSwgaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Jlc3RfbGluZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm91bmRfYmVzdF9saW5lKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHJlcG9ydGVkX2xpbmVfbnVtYmVyID49IHNhdmVkX2xpbmVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OnNpemVfdHlwZSBvcHNvdXJjZV9pbmRleCA9CisgICAgICAgICAgICAgICAgICAgIChyZXBvcnRlZF9saW5lX251bWJlciAtIHNhdmVkX2xpbmVfbnVtYmVyKSArIDEgKyBzYXZlZF9vcHNvdXJjZV9vZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKG9wc291cmNlX2luZGV4IDwgb3Bzb3VyY2VfbGluZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9zdHJlYW0gPDwgIlxuIiA8PCByZXBvcnRlZF9saW5lX251bWJlciA8PCAiOiAiIDw8IG9wc291cmNlX2xpbmVzW29wc291cmNlX2luZGV4XS5jX3N0cigpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9zdHJlYW0gPDwgIkludGVybmFsIGVycm9yOiBjYWxjdWxhdGVkIHNvdXJjZSBsaW5lIG9mICIgPDwgb3Bzb3VyY2VfaW5kZXggPDwgIiBmb3Igc291cmNlIHNpemUgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG9wc291cmNlX2xpbmVzLnNpemUoKSA8PCAiIGxpbmVzLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzb3VyY2Vfc3RyZWFtIDw8ICJVbmFibGUgdG8gZmluZCBzdWl0YWJsZSAjbGluZSBkaXJlY3RpdmUgaW4gU1BJUi1WIE9wU291cmNlLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzb3VyY2Vfc3RyZWFtIDw8ICJVbmFibGUgdG8gZmluZCBTUElSLVYgT3BTb3VyY2UuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzb3VyY2VfbXNnID0gc291cmNlX3N0cmVhbS5zdHIoKTsKK30KKworLy8gUHVsbCB0b2dldGhlciBhbGwgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGRlYnVnIHJlY29yZCB0byBidWlsZCB0aGUgZXJyb3IgbWVzc2FnZSBzdHJpbmdzLAorLy8gYW5kIHRoZW4gYXNzZW1ibGUgdGhlbSBpbnRvIGEgc2luZ2xlIG1lc3NhZ2Ugc3RyaW5nLgorLy8gUmV0cmlldmUgdGhlIHNoYWRlciBwcm9ncmFtIHJlZmVyZW5jZWQgYnkgdGhlIHVuaXF1ZSBzaGFkZXIgSUQgcHJvdmlkZWQgaW4gdGhlIGRlYnVnIHJlY29yZC4KKy8vIFdlIGhhZCB0byBrZWVwIGEgY29weSBvZiB0aGUgc2hhZGVyIHByb2dyYW0gd2l0aCB0aGUgc2FtZSBsaWZlY3ljbGUgYXMgdGhlIHBpcGVsaW5lIHRvIG1ha2UKKy8vIHN1cmUgaXQgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIHBpcGVsaW5lIGlzIHN1Ym1pdHRlZC4gIChUaGUgU2hhZGVyTW9kdWxlIHRyYWNraW5nIG9iamVjdCBhbHNvCisvLyBrZWVwcyBhIGNvcHksIGJ1dCBpdCBjYW4gYmUgZGVzdHJveWVkIGFmdGVyIHRoZSBwaXBlbGluZSBpcyBjcmVhdGVkIGFuZCBiZWZvcmUgaXQgaXMgc3VibWl0dGVkLikKKy8vCit2b2lkIEdwdUFzc2lzdGVkOjpBbmFseXplQW5kUmVwb3J0RXJyb3IoQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgVmtRdWV1ZSBxdWV1ZSwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZV9iaW5kX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9wZXJhdGlvbl9pbmRleCwgdWludDMyX3QgKmNvbnN0IGRlYnVnX291dHB1dF9idWZmZXIpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3B2dG9vbHM7CisgICAgY29uc3QgdWludDMyX3QgdG90YWxfd29yZHMgPSBkZWJ1Z19vdXRwdXRfYnVmZmVyWzBdOworICAgIC8vIEEgemVybyBoZXJlIG1lYW5zIHRoYXQgdGhlIHNoYWRlciBpbnN0cnVtZW50YXRpb24gZGlkbid0IHdyaXRlIGFueXRoaW5nLgorICAgIC8vIElmIHlvdSBoYXZlIG5vdGhpbmcgdG8gc2F5LCBkb24ndCBzYXkgaXQgaGVyZS4KKyAgICBpZiAoMCA9PSB0b3RhbF93b3JkcykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRoZSBmaXJzdCB3b3JkIGluIHRoZSBkZWJ1ZyBvdXRwdXQgYnVmZmVyIGlzIHRoZSBudW1iZXIgb2Ygd29yZHMgdGhhdCB3b3VsZCBoYXZlCisgICAgLy8gYmVlbiB3cml0dGVuIGJ5IHRoZSBzaGFkZXIgaW5zdHJ1bWVudGF0aW9uLCBpZiB0aGVyZSB3YXMgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlciB3ZSBwcm92aWRlZC4KKyAgICAvLyBUaGUgbnVtYmVyIG9mIHdvcmRzIGFjdHVhbGx5IHdyaXR0ZW4gYnkgdGhlIHNoYWRlcnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgLy8gd2UgcHJvdmlkZSB2aWEgdGhlIGRlc2NyaXB0b3IuICBTbywgd2UgcHJvY2VzcyBvbmx5IHRoZSBudW1iZXIgb2Ygd29yZHMgdGhhdCBjYW4gZml0IGluIHRoZQorICAgIC8vIGJ1ZmZlci4KKyAgICAvLyBFYWNoICJyZXBvcnQiIHdyaXR0ZW4gYnkgdGhlIHNoYWRlciBpbnN0cnVtZW50YXRpb24gaXMgY29uc2lkZXJlZCBhICJyZWNvcmQiLiAgVGhpcyBmdW5jdGlvbgorICAgIC8vIGlzIGhhcmQtY29kZWQgdG8gcHJvY2VzcyBvbmx5IG9uZSByZWNvcmQgYmVjYXVzZSBpdCBleHBlY3RzIHRoZSBidWZmZXIgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvCisgICAgLy8gaG9sZCBvbmx5IG9uZSByZWNvcmQuICBJZiB0aGVyZSBpcyBhIGRlc2lyZSB0byBwcm9jZXNzIG1vcmUgdGhhbiBvbmUgcmVjb3JkLCB0aGlzIGZ1bmN0aW9uIG5lZWRzCisgICAgLy8gdG8gYmUgbW9kaWZpZWQgdG8gbG9vcCBvdmVyIHJlY29yZHMgYW5kIHRoZSBidWZmZXIgc2l6ZSBpbmNyZWFzZWQuCisgICAgc3RkOjpzdHJpbmcgdmFsaWRhdGlvbl9tZXNzYWdlOworICAgIHN0ZDo6c3RyaW5nIHN0YWdlX21lc3NhZ2U7CisgICAgc3RkOjpzdHJpbmcgY29tbW9uX21lc3NhZ2U7CisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWVfbWVzc2FnZTsKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbWVzc2FnZTsKKyAgICBzdGQ6OnN0cmluZyB2dWlkX21zZzsKKyAgICBWa1NoYWRlck1vZHVsZSBzaGFkZXJfbW9kdWxlX2hhbmRsZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUGlwZWxpbmUgcGlwZWxpbmVfaGFuZGxlID0gVktfTlVMTF9IQU5ETEU7CisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBwZ207CisgICAgLy8gVGhlIGZpcnN0IHJlY29yZCBzdGFydHMgYXQgdGhpcyBvZmZzZXQgYWZ0ZXIgdGhlIHRvdGFsX3dvcmRzLgorICAgIGNvbnN0IHVpbnQzMl90ICpkZWJ1Z19yZWNvcmQgPSAmZGVidWdfb3V0cHV0X2J1ZmZlcltrRGVidWdPdXRwdXREYXRhT2Zmc2V0XTsKKyAgICAvLyBMb29rdXAgdGhlIFZrU2hhZGVyTW9kdWxlIGhhbmRsZSBhbmQgU1BJUi1WIGNvZGUgdXNlZCB0byBjcmVhdGUgdGhlIHNoYWRlciwgdXNpbmcgdGhlIHVuaXF1ZSBzaGFkZXIgSUQgdmFsdWUgcmV0dXJuZWQKKyAgICAvLyBieSB0aGUgaW5zdHJ1bWVudGVkIHNoYWRlci4KKyAgICBhdXRvIGl0ID0gc2hhZGVyX21hcC5maW5kKGRlYnVnX3JlY29yZFtrSW5zdENvbW1vbk91dFNoYWRlcklkXSk7CisgICAgaWYgKGl0ICE9IHNoYWRlcl9tYXAuZW5kKCkpIHsKKyAgICAgICAgc2hhZGVyX21vZHVsZV9oYW5kbGUgPSBpdC0+c2Vjb25kLnNoYWRlcl9tb2R1bGU7CisgICAgICAgIHBpcGVsaW5lX2hhbmRsZSA9IGl0LT5zZWNvbmQucGlwZWxpbmU7CisgICAgICAgIHBnbSA9IGl0LT5zZWNvbmQucGdtOworICAgIH0KKyAgICBHZW5lcmF0ZVZhbGlkYXRpb25NZXNzYWdlKGRlYnVnX3JlY29yZCwgdmFsaWRhdGlvbl9tZXNzYWdlLCB2dWlkX21zZyk7CisgICAgR2VuZXJhdGVTdGFnZU1lc3NhZ2UoZGVidWdfcmVjb3JkLCBzdGFnZV9tZXNzYWdlKTsKKyAgICBHZW5lcmF0ZUNvbW1vbk1lc3NhZ2UocmVwb3J0X2RhdGEsIGNiX25vZGUsIGRlYnVnX3JlY29yZCwgc2hhZGVyX21vZHVsZV9oYW5kbGUsIHBpcGVsaW5lX2hhbmRsZSwgcGlwZWxpbmVfYmluZF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX2luZGV4LCBjb21tb25fbWVzc2FnZSk7CisgICAgR2VuZXJhdGVTb3VyY2VNZXNzYWdlcyhwZ20sIGRlYnVnX3JlY29yZCwgZmlsZW5hbWVfbWVzc2FnZSwgc291cmNlX21lc3NhZ2UpOworICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFVUVfRVhULCBIYW5kbGVUb1VpbnQ2NChxdWV1ZSksCisgICAgICAgICAgICB2dWlkX21zZy5jX3N0cigpLCAiJXMgJXMgJXMgJXMlcyIsIHZhbGlkYXRpb25fbWVzc2FnZS5jX3N0cigpLCBjb21tb25fbWVzc2FnZS5jX3N0cigpLCBzdGFnZV9tZXNzYWdlLmNfc3RyKCksCisgICAgICAgICAgICBmaWxlbmFtZV9tZXNzYWdlLmNfc3RyKCksIHNvdXJjZV9tZXNzYWdlLmNfc3RyKCkpOworICAgIC8vIFRoZSBkZWJ1ZyByZWNvcmQgYXQgd29yZCBrSW5zdENvbW1vbk91dFNpemUgaXMgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgcmVjb3JkCisgICAgLy8gd3JpdHRlbiBieSB0aGUgc2hhZGVyLiAgQ2xlYXIgdGhlIGVudGlyZSByZWNvcmQgcGx1cyB0aGUgdG90YWxfd29yZHMgd29yZCBhdCB0aGUgc3RhcnQuCisgICAgY29uc3QgdWludDMyX3Qgd29yZHNfdG9fY2xlYXIgPSAxICsgc3RkOjptaW4oZGVidWdfcmVjb3JkW2tJbnN0Q29tbW9uT3V0U2l6ZV0sICh1aW50MzJfdClrSW5zdDJNYXhPdXRDbnQpOworICAgIG1lbXNldChkZWJ1Z19vdXRwdXRfYnVmZmVyLCAwLCBzaXplb2YodWludDMyX3QpICogd29yZHNfdG9fY2xlYXIpOworfQorCisvLyBGb3IgdGhlIGdpdmVuIGNvbW1hbmQgYnVmZmVyLCBtYXAgaXRzIGRlYnVnIGRhdGEgYnVmZmVycyBhbmQgcmVhZCB0aGVpciBjb250ZW50cyBmb3IgYW5hbHlzaXMuCit2b2lkIEdwdUFzc2lzdGVkOjpQcm9jZXNzSW5zdHJ1bWVudGF0aW9uQnVmZmVyKFZrUXVldWUgcXVldWUsIENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUpIHsKKyAgICBpZiAoY2Jfbm9kZSAmJiAoY2Jfbm9kZS0+aGFzRHJhd0NtZCB8fCBjYl9ub2RlLT5oYXNUcmFjZVJheXNDbWQgfHwgY2Jfbm9kZS0+aGFzRGlzcGF0Y2hDbWQpKSB7CisgICAgICAgIGF1dG8gZ3B1X2J1ZmZlcl9saXN0ID0gR2V0R3B1QXNzaXN0ZWRCdWZmZXJJbmZvKGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpOworICAgICAgICB1aW50MzJfdCBkcmF3X2luZGV4ID0gMDsKKyAgICAgICAgdWludDMyX3QgY29tcHV0ZV9pbmRleCA9IDA7CisgICAgICAgIHVpbnQzMl90IHJheV90cmFjZV9pbmRleCA9IDA7CisKKyAgICAgICAgZm9yIChhdXRvICZidWZmZXJfaW5mbyA6IGdwdV9idWZmZXJfbGlzdCkgeworICAgICAgICAgICAgY2hhciAqcERhdGE7CisgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQgPSB2bWFNYXBNZW1vcnkodm1hQWxsb2NhdG9yLCBidWZmZXJfaW5mby5vdXRwdXRfbWVtX2Jsb2NrLmFsbG9jYXRpb24sICh2b2lkICoqKSZwRGF0YSk7CisgICAgICAgICAgICAvLyBBbmFseXplIGRlYnVnIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG9wZXJhdGlvbl9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcl9pbmZvLnBpcGVsaW5lX2JpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUykgeworICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25faW5kZXggPSBkcmF3X2luZGV4OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyX2luZm8ucGlwZWxpbmVfYmluZF9wb2ludCA9PSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX2luZGV4ID0gY29tcHV0ZV9pbmRleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcl9pbmZvLnBpcGVsaW5lX2JpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVikgeworICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25faW5kZXggPSByYXlfdHJhY2VfaW5kZXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBbmFseXplQW5kUmVwb3J0RXJyb3IoY2Jfbm9kZSwgcXVldWUsIGJ1ZmZlcl9pbmZvLnBpcGVsaW5lX2JpbmRfcG9pbnQsIG9wZXJhdGlvbl9pbmRleCwgKHVpbnQzMl90ICopcERhdGEpOworICAgICAgICAgICAgICAgIHZtYVVubWFwTWVtb3J5KHZtYUFsbG9jYXRvciwgYnVmZmVyX2luZm8ub3V0cHV0X21lbV9ibG9jay5hbGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1ZmZlcl9pbmZvLnBpcGVsaW5lX2JpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUykgeworICAgICAgICAgICAgICAgIGRyYXdfaW5kZXgrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyX2luZm8ucGlwZWxpbmVfYmluZF9wb2ludCA9PSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUpIHsKKyAgICAgICAgICAgICAgICBjb21wdXRlX2luZGV4Kys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcl9pbmZvLnBpcGVsaW5lX2JpbmRfcG9pbnQgPT0gVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVikgeworICAgICAgICAgICAgICAgIHJheV90cmFjZV9pbmRleCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBGb3IgdGhlIGdpdmVuIGNvbW1hbmQgYnVmZmVyLCBtYXAgaXRzIGRlYnVnIGRhdGEgYnVmZmVycyBhbmQgdXBkYXRlIHRoZSBzdGF0dXMgb2YgYW55IHVwZGF0ZSBhZnRlciBiaW5kIGRlc2NyaXB0b3JzCit2b2lkIEdwdUFzc2lzdGVkOjpVcGRhdGVJbnN0cnVtZW50YXRpb25CdWZmZXIoQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSkgeworICAgIGF1dG8gZ3B1X2J1ZmZlcl9saXN0ID0gR2V0R3B1QXNzaXN0ZWRCdWZmZXJJbmZvKGNiX25vZGUtPmNvbW1hbmRCdWZmZXIpOworICAgIHVpbnQzMl90ICpwRGF0YTsKKyAgICBmb3IgKGF1dG8gJmJ1ZmZlcl9pbmZvIDogZ3B1X2J1ZmZlcl9saXN0KSB7CisgICAgICAgIGlmIChidWZmZXJfaW5mby5kaV9pbnB1dF9tZW1fYmxvY2sudXBkYXRlX2F0X3N1Ym1pdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQgPSB2bWFNYXBNZW1vcnkodm1hQWxsb2NhdG9yLCBidWZmZXJfaW5mby5kaV9pbnB1dF9tZW1fYmxvY2suYWxsb2NhdGlvbiwgKHZvaWQgKiopJnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byB1cGRhdGUgOiBidWZmZXJfaW5mby5kaV9pbnB1dF9tZW1fYmxvY2sudXBkYXRlX2F0X3N1Ym1pdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlLnNlY29uZC0+dXBkYXRlZCkgcERhdGFbdXBkYXRlLmZpcnN0XSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZtYVVubWFwTWVtb3J5KHZtYUFsbG9jYXRvciwgYnVmZmVyX2luZm8uZGlfaW5wdXRfbWVtX2Jsb2NrLmFsbG9jYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBTdWJtaXQgYSBtZW1vcnkgYmFycmllciBvbiBncmFwaGljcyBxdWV1ZXMuCisvLyBMYXp5LWNyZWF0ZSBhbmQgcmVjb3JkIHRoZSBuZWVkZWQgY29tbWFuZCBidWZmZXIuCit2b2lkIEdwdUFzc2lzdGVkOjpTdWJtaXRCYXJyaWVyKFZrUXVldWUgcXVldWUpIHsKKyAgICBhdXRvIHF1ZXVlX2JhcnJpZXJfY29tbWFuZF9pbmZvX2l0ID0gcXVldWVfYmFycmllcl9jb21tYW5kX2luZm9zLmVtcGxhY2UocXVldWUsIEdwdUFzc2lzdGVkUXVldWVCYXJyaWVyQ29tbWFuZEluZm97fSk7CisgICAgaWYgKHF1ZXVlX2JhcnJpZXJfY29tbWFuZF9pbmZvX2l0LnNlY29uZCkgeworICAgICAgICBHcHVBc3Npc3RlZFF1ZXVlQmFycmllckNvbW1hbmRJbmZvICZxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mbyA9IHF1ZXVlX2JhcnJpZXJfY29tbWFuZF9pbmZvX2l0LmZpcnN0LT5zZWNvbmQ7CisKKyAgICAgICAgdWludDMyX3QgcXVldWVfZmFtaWx5X2luZGV4ID0gMDsKKworICAgICAgICBhdXRvIHF1ZXVlX3N0YXRlX2l0ID0gcXVldWVNYXAuZmluZChxdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZV9zdGF0ZV9pdCAhPSBxdWV1ZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgcXVldWVfZmFtaWx5X2luZGV4ID0gcXVldWVfc3RhdGVfaXQtPnNlY29uZC5xdWV1ZUZhbWlseUluZGV4OworICAgICAgICB9CisKKyAgICAgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfU1VDQ0VTUzsKKworICAgICAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgIHBvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk87CisgICAgICAgIHBvb2xfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleCA9IHF1ZXVlX2ZhbWlseV9pbmRleDsKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVDb21tYW5kUG9vbChkZXZpY2UsICZwb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX3Bvb2wpOworICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBjb21tYW5kIHBvb2wgZm9yIGJhcnJpZXIgQ0IuIik7CisgICAgICAgICAgICBxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mby5iYXJyaWVyX2NvbW1hbmRfcG9vbCA9IFZLX05VTExfSEFORExFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGJ1ZmZlcl9hbGxvY19pbmZvID0ge307CisgICAgICAgIGJ1ZmZlcl9hbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgYnVmZmVyX2FsbG9jX2luZm8uY29tbWFuZFBvb2wgPSBxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mby5iYXJyaWVyX2NvbW1hbmRfcG9vbDsKKyAgICAgICAgYnVmZmVyX2FsbG9jX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgYnVmZmVyX2FsbG9jX2luZm8ubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworICAgICAgICByZXN1bHQgPSBEaXNwYXRjaEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoZGV2aWNlLCAmYnVmZmVyX2FsbG9jX2luZm8sICZxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mby5iYXJyaWVyX2NvbW1hbmRfYnVmZmVyKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgYmFycmllciBjb21tYW5kIGJ1ZmZlci4iKTsKKyAgICAgICAgICAgIERpc3BhdGNoRGVzdHJveUNvbW1hbmRQb29sKGRldmljZSwgcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX3Bvb2wsIG51bGxwdHIpOworICAgICAgICAgICAgcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX3Bvb2wgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgICAgIHF1ZXVlX2JhcnJpZXJfY29tbWFuZF9pbmZvLmJhcnJpZXJfY29tbWFuZF9idWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhvb2sgdXAgY29tbWFuZCBidWZmZXIgZGlzcGF0Y2gKKyAgICAgICAgdmtTZXREZXZpY2VMb2FkZXJEYXRhKGRldmljZSwgcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX2J1ZmZlcik7CisKKyAgICAgICAgLy8gUmVjb3JkIGEgZ2xvYmFsIG1lbW9yeSBiYXJyaWVyIHRvIGZvcmNlIGF2YWlsYWJpbGl0eSBvZiBkZXZpY2UgbWVtb3J5IG9wZXJhdGlvbnMgdG8gdGhlIGhvc3QgZG9tYWluLgorICAgICAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29tbWFuZF9idWZmZXJfYmVnaW5faW5mbyA9IHt9OworICAgICAgICBjb21tYW5kX2J1ZmZlcl9iZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICAgICAgcmVzdWx0ID0gRGlzcGF0Y2hCZWdpbkNvbW1hbmRCdWZmZXIocXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX2J1ZmZlciwgJmNvbW1hbmRfYnVmZmVyX2JlZ2luX2luZm8pOworICAgICAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFZrTWVtb3J5QmFycmllciBtZW1vcnlfYmFycmllciA9IHt9OworICAgICAgICAgICAgbWVtb3J5X2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQkFSUklFUjsKKyAgICAgICAgICAgIG1lbW9yeV9iYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfTUVNT1JZX1dSSVRFX0JJVDsKKyAgICAgICAgICAgIG1lbW9yeV9iYXJyaWVyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfSE9TVF9SRUFEX0JJVDsKKworICAgICAgICAgICAgRGlzcGF0Y2hDbWRQaXBlbGluZUJhcnJpZXIocXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX2J1ZmZlciwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCAwLCAxLCAmbWVtb3J5X2JhcnJpZXIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIpOworICAgICAgICAgICAgRGlzcGF0Y2hFbmRDb21tYW5kQnVmZmVyKHF1ZXVlX2JhcnJpZXJfY29tbWFuZF9pbmZvLmJhcnJpZXJfY29tbWFuZF9idWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgR3B1QXNzaXN0ZWRRdWV1ZUJhcnJpZXJDb21tYW5kSW5mbyAmcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8gPSBxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mb19pdC5maXJzdC0+c2Vjb25kOworICAgIGlmIChxdWV1ZV9iYXJyaWVyX2NvbW1hbmRfaW5mby5iYXJyaWVyX2NvbW1hbmRfYnVmZmVyICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmcXVldWVfYmFycmllcl9jb21tYW5kX2luZm8uYmFycmllcl9jb21tYW5kX2J1ZmZlcjsKKyAgICAgICAgRGlzcGF0Y2hRdWV1ZVN1Ym1pdChxdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgfQorfQorCit2b2lkIEdwdUFzc2lzdGVkOjpQcmVDYWxsUmVjb3JkUXVldWVTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyAqcFN1Ym1pdHMsIFZrRmVuY2UgZmVuY2UpIHsKKyAgICBmb3IgKHVpbnQzMl90IHN1Ym1pdF9pZHggPSAwOyBzdWJtaXRfaWR4IDwgc3VibWl0Q291bnQ7IHN1Ym1pdF9pZHgrKykgeworICAgICAgICBjb25zdCBWa1N1Ym1pdEluZm8gKnN1Ym1pdCA9ICZwU3VibWl0c1tzdWJtaXRfaWR4XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1Ym1pdC0+Y29tbWFuZEJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoc3VibWl0LT5wQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgVXBkYXRlSW5zdHJ1bWVudGF0aW9uQnVmZmVyKGNiX25vZGUpOworICAgICAgICAgICAgZm9yIChhdXRvIHNlY29uZGFyeUNtZEJ1ZmZlciA6IGNiX25vZGUtPmxpbmtlZENvbW1hbmRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgVXBkYXRlSW5zdHJ1bWVudGF0aW9uQnVmZmVyKHNlY29uZGFyeUNtZEJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIElzc3VlIGEgbWVtb3J5IGJhcnJpZXIgdG8gbWFrZSBHUFUtd3JpdHRlbiBkYXRhIGF2YWlsYWJsZSB0byBob3N0LgorLy8gV2FpdCBmb3IgdGhlIHF1ZXVlIHRvIGNvbXBsZXRlIGV4ZWN1dGlvbi4KKy8vIENoZWNrIHRoZSBkZWJ1ZyBidWZmZXJzIGZvciBhbGwgdGhlIGNvbW1hbmQgYnVmZmVycyB0aGF0IHdlcmUgc3VibWl0dGVkLgordm9pZCBHcHVBc3Npc3RlZDo6UG9zdENhbGxSZWNvcmRRdWV1ZVN1Ym1pdChWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBzdWJtaXRDb3VudCwgY29uc3QgVmtTdWJtaXRJbmZvICpwU3VibWl0cywgVmtGZW5jZSBmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRRdWV1ZVN1Ym1pdChxdWV1ZSwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBmZW5jZSwgcmVzdWx0KTsKKworICAgIGlmIChhYm9ydGVkKSByZXR1cm47CisgICAgYm9vbCBidWZmZXJzX3ByZXNlbnQgPSBmYWxzZTsKKyAgICAvLyBEb24ndCBRdWV1ZVdhaXRJZGxlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byBwcm9jZXNzCisgICAgZm9yICh1aW50MzJfdCBzdWJtaXRfaWR4ID0gMDsgc3VibWl0X2lkeCA8IHN1Ym1pdENvdW50OyBzdWJtaXRfaWR4KyspIHsKKyAgICAgICAgY29uc3QgVmtTdWJtaXRJbmZvICpzdWJtaXQgPSAmcFN1Ym1pdHNbc3VibWl0X2lkeF07CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJtaXQtPmNvbW1hbmRCdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBhdXRvIGNiX25vZGUgPSBHZXRDQlN0YXRlKHN1Ym1pdC0+cENvbW1hbmRCdWZmZXJzW2ldKTsKKyAgICAgICAgICAgIGlmIChHZXRHcHVBc3Npc3RlZEJ1ZmZlckluZm8oY2Jfbm9kZS0+Y29tbWFuZEJ1ZmZlcikuc2l6ZSgpIHx8IGNiX25vZGUtPmhhc0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlQ21kKQorICAgICAgICAgICAgICAgIGJ1ZmZlcnNfcHJlc2VudCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGF1dG8gc2Vjb25kYXJ5Q21kQnVmZmVyIDogY2Jfbm9kZS0+bGlua2VkQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoR2V0R3B1QXNzaXN0ZWRCdWZmZXJJbmZvKHNlY29uZGFyeUNtZEJ1ZmZlci0+Y29tbWFuZEJ1ZmZlcikuc2l6ZSgpIHx8IGNiX25vZGUtPmhhc0J1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlQ21kKQorICAgICAgICAgICAgICAgICAgICBidWZmZXJzX3ByZXNlbnQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghYnVmZmVyc19wcmVzZW50KSByZXR1cm47CisKKyAgICBTdWJtaXRCYXJyaWVyKHF1ZXVlKTsKKworICAgIERpc3BhdGNoUXVldWVXYWl0SWRsZShxdWV1ZSk7CisKKyAgICBmb3IgKHVpbnQzMl90IHN1Ym1pdF9pZHggPSAwOyBzdWJtaXRfaWR4IDwgc3VibWl0Q291bnQ7IHN1Ym1pdF9pZHgrKykgeworICAgICAgICBjb25zdCBWa1N1Ym1pdEluZm8gKnN1Ym1pdCA9ICZwU3VibWl0c1tzdWJtaXRfaWR4XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1Ym1pdC0+Y29tbWFuZEJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoc3VibWl0LT5wQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgUHJvY2Vzc0luc3RydW1lbnRhdGlvbkJ1ZmZlcihxdWV1ZSwgY2Jfbm9kZSk7CisgICAgICAgICAgICBQcm9jZXNzQWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uQnVmZmVyKHF1ZXVlLCBjYl9ub2RlKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBzZWNvbmRhcnlDbWRCdWZmZXIgOiBjYl9ub2RlLT5saW5rZWRDb21tYW5kQnVmZmVycykgeworICAgICAgICAgICAgICAgIFByb2Nlc3NJbnN0cnVtZW50YXRpb25CdWZmZXIocXVldWUsIHNlY29uZGFyeUNtZEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgUHJvY2Vzc0FjY2VsZXJhdGlvblN0cnVjdHVyZUJ1aWxkVmFsaWRhdGlvbkJ1ZmZlcihxdWV1ZSwgY2Jfbm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRDbWREcmF3KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKSB7CisgICAgQWxsb2NhdGVWYWxpZGF0aW9uUmVzb3VyY2VzKGNvbW1hbmRCdWZmZXIsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MpOworfQorCit2b2lkIEdwdUFzc2lzdGVkOjpQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGluZGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UpIHsKKyAgICBBbGxvY2F0ZVZhbGlkYXRpb25SZXNvdXJjZXMoY29tbWFuZEJ1ZmZlciwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyk7Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSkgeworICAgIEFsbG9jYXRlVmFsaWRhdGlvblJlc291cmNlcyhjb21tYW5kQnVmZmVyLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTKTsKK30KKwordm9pZCBHcHVBc3Npc3RlZDo6UHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBzdHJpZGUpIHsKKyAgICBBbGxvY2F0ZVZhbGlkYXRpb25SZXNvdXJjZXMoY29tbWFuZEJ1ZmZlciwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyk7Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRDbWREaXNwYXRjaChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIEFsbG9jYXRlVmFsaWRhdGlvblJlc291cmNlcyhjb21tYW5kQnVmZmVyLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUpOworfQorCit2b2lkIEdwdUFzc2lzdGVkOjpQcmVDYWxsUmVjb3JkQ21kRGlzcGF0Y2hJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0KSB7CisgICAgQWxsb2NhdGVWYWxpZGF0aW9uUmVzb3VyY2VzKGNvbW1hbmRCdWZmZXIsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSk7Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlByZUNhbGxSZWNvcmRDbWRUcmFjZVJheXNOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgcmF5Z2VuU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGhpdFNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZGVwdGgpIHsKKyAgICBBbGxvY2F0ZVZhbGlkYXRpb25SZXNvdXJjZXMoY29tbWFuZEJ1ZmZlciwgVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OVik7Cit9CisKK3ZvaWQgR3B1QXNzaXN0ZWQ6OlBvc3RDYWxsUmVjb3JkQ21kVHJhY2VSYXlzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHJheWdlblNoYWRlckJpbmRpbmdUYWJsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIFZrQnVmZmVyIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBoaXRTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsIFZrRGV2aWNlU2l6ZSBoaXRTaGFkZXJCaW5kaW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBjYWxsYWJsZVNoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGRlcHRoKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT5oYXNUcmFjZVJheXNDbWQgPSB0cnVlOworfQorCit2b2lkIEdwdUFzc2lzdGVkOjpBbGxvY2F0ZVZhbGlkYXRpb25SZXNvdXJjZXMoY29uc3QgVmtDb21tYW5kQnVmZmVyIGNtZF9idWZmZXIsIGNvbnN0IFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCkgeworICAgIGlmIChiaW5kX3BvaW50ICE9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MgJiYgYmluZF9wb2ludCAhPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUgJiYKKyAgICAgICAgYmluZF9wb2ludCAhPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0OworCisgICAgaWYgKGFib3J0ZWQpIHJldHVybjsKKworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldD4gZGVzY19zZXRzOworICAgIFZrRGVzY3JpcHRvclBvb2wgZGVzY19wb29sID0gVktfTlVMTF9IQU5ETEU7CisgICAgcmVzdWx0ID0gZGVzY19zZXRfbWFuYWdlci0+R2V0RGVzY3JpcHRvclNldHMoMSwgJmRlc2NfcG9vbCwgJmRlc2Nfc2V0cyk7CisgICAgYXNzZXJ0KHJlc3VsdCA9PSBWS19TVUNDRVNTKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBkZXNjcmlwdG9yIHNldHMuICBEZXZpY2UgY291bGQgYmVjb21lIHVuc3RhYmxlLiIpOworICAgICAgICBhYm9ydGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gb3V0cHV0X2Rlc2NfYnVmZmVyX2luZm8gPSB7fTsKKyAgICBvdXRwdXRfZGVzY19idWZmZXJfaW5mby5yYW5nZSA9IG91dHB1dF9idWZmZXJfc2l6ZTsKKworICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY21kX2J1ZmZlcik7CisgICAgaWYgKCFjYl9ub2RlKSB7CisgICAgICAgIFJlcG9ydFNldHVwUHJvYmxlbShWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgSGFuZGxlVG9VaW50NjQoZGV2aWNlKSwgIlVucmVjb2duaXplZCBjb21tYW5kIGJ1ZmZlciIpOworICAgICAgICBhYm9ydGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBibG9jayB0aGF0IHRoZSBncHUgd2lsbCB1c2UgdG8gcmV0dXJuIGFueSBlcnJvciBpbmZvcm1hdGlvbgorICAgIEdwdUFzc2lzdGVkRGV2aWNlTWVtb3J5QmxvY2sgb3V0cHV0X2Jsb2NrID0ge307CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlckluZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPfTsKKyAgICBidWZmZXJJbmZvLnNpemUgPSBvdXRwdXRfYnVmZmVyX3NpemU7CisgICAgYnVmZmVySW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQ7CisgICAgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gYWxsb2NJbmZvID0ge307CisgICAgYWxsb2NJbmZvLnVzYWdlID0gVk1BX01FTU9SWV9VU0FHRV9HUFVfVE9fQ1BVOworICAgIHJlc3VsdCA9IHZtYUNyZWF0ZUJ1ZmZlcih2bWFBbGxvY2F0b3IsICZidWZmZXJJbmZvLCAmYWxsb2NJbmZvLCAmb3V0cHV0X2Jsb2NrLmJ1ZmZlciwgJm91dHB1dF9ibG9jay5hbGxvY2F0aW9uLCBudWxscHRyKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5LiAgRGV2aWNlIGNvdWxkIGJlY29tZSB1bnN0YWJsZS4iKTsKKyAgICAgICAgYWJvcnRlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDbGVhciB0aGUgb3V0cHV0IGJsb2NrIHRvIHplcm9zIHNvIHRoYXQgb25seSBlcnJvciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBncHUgd2lsbCBiZSBwcmVzZW50CisgICAgdWludDMyX3QgKnBEYXRhOworICAgIHJlc3VsdCA9IHZtYU1hcE1lbW9yeSh2bWFBbGxvY2F0b3IsIG91dHB1dF9ibG9jay5hbGxvY2F0aW9uLCAodm9pZCAqKikmcERhdGEpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBtZW1zZXQocERhdGEsIDAsIG91dHB1dF9idWZmZXJfc2l6ZSk7CisgICAgICAgIHZtYVVubWFwTWVtb3J5KHZtYUFsbG9jYXRvciwgb3V0cHV0X2Jsb2NrLmFsbG9jYXRpb24pOworICAgIH0KKworICAgIEdwdUFzc2lzdGVkRGV2aWNlTWVtb3J5QmxvY2sgZGlfaW5wdXRfYmxvY2sgPSB7fSwgYmRhX2lucHV0X2Jsb2NrID0ge307CisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBkaV9pbnB1dF9kZXNjX2J1ZmZlcl9pbmZvID0ge307CisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBiZGFfaW5wdXRfZGVzY19idWZmZXJfaW5mbyA9IHt9OworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2Nfd3JpdGVzWzNdID0ge307CisgICAgdWludDMyX3QgZGVzY19jb3VudCA9IDE7CisgICAgYXV0byBjb25zdCAmc3RhdGUgPSBjYl9ub2RlLT5sYXN0Qm91bmRbYmluZF9wb2ludF07CisgICAgdWludDMyX3QgbnVtYmVyX29mX3NldHMgPSAodWludDMyX3Qpc3RhdGUucGVyX3NldC5zaXplKCk7CisKKyAgICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIG1lbW9yeSB3ZSBuZWVkIGZvciB0aGUgaW5wdXQgYmxvY2sgYmFzZWQgb24gaG93IG1hbnkgc2V0cyBhbmQgYmluZGluZ3MgdGhlcmUgYXJlCisgICAgLy8gYW5kIGhvdyBiaWcgZWFjaCBvZiB0aGUgYmluZGluZ3MgaXMKKyAgICBpZiAobnVtYmVyX29mX3NldHMgPiAwICYmIGRldmljZV9leHRlbnNpb25zLnZrX2V4dF9kZXNjcmlwdG9yX2luZGV4aW5nKSB7CisgICAgICAgIHVpbnQzMl90IGRlc2NyaXB0b3JfY291bnQgPSAwOyAgLy8gTnVtYmVyIG9mIGRlc2NyaXB0b3JzLCBpbmNsdWRpbmcgYWxsIGFycmF5IGVsZW1lbnRzCisgICAgICAgIHVpbnQzMl90IGJpbmRpbmdfY291bnQgPSAwOyAgICAgLy8gTnVtYmVyIG9mIGJpbmRpbmdzIGJhc2VkIG9uIHRoZSBtYXggYmluZGluZyBudW1iZXIgdXNlZAorICAgICAgICBmb3IgKGF1dG8gcyA6IHN0YXRlLnBlcl9zZXQpIHsKKyAgICAgICAgICAgIGF1dG8gZGVzYyA9IHMuYm91bmRfZGVzY3JpcHRvcl9zZXQ7CisgICAgICAgICAgICBpZiAoZGVzYyAmJiAoZGVzYy0+R2V0QmluZGluZ0NvdW50KCkgPiAwKSkgeworICAgICAgICAgICAgICAgIGF1dG8gYmluZGluZ3MgPSBkZXNjLT5HZXRMYXlvdXQoKS0+R2V0U29ydGVkQmluZGluZ1NldCgpOworICAgICAgICAgICAgICAgIGJpbmRpbmdfY291bnQgKz0gZGVzYy0+R2V0TGF5b3V0KCktPkdldE1heEJpbmRpbmcoKSArIDE7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGJpbmRpbmcgOiBiaW5kaW5ncykgeworICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgaW5zdHJ1bWVudGF0aW9uIGlzIHRyYWNraW5nIGlubGluZSB1bmlmb3JtIGJsb2NrcyBhcyBzY2FsZXJzLiBEb24ndCB0cnkgdG8gdmFsaWRhdGUgaW5saW5lIHVuaWZvcm0KKyAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzCisgICAgICAgICAgICAgICAgICAgIGlmIChWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUID09IGRlc2MtPkdldExheW91dCgpLT5HZXRUeXBlRnJvbUJpbmRpbmcoYmluZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTExfSEFORExFLCAiVU5BU1NJR05FRC1HUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbiBXYXJuaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgZGVzY3JpcHRvcnMgd2lsbCBub3QgYmUgdmFsaWRhdGVkIGJ5IEdQVSBhc3Npc3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmluZGluZyA9PSBkZXNjLT5HZXRMYXlvdXQoKS0+R2V0TWF4QmluZGluZygpICYmIGRlc2MtPklzVmFyaWFibGVEZXNjcmlwdG9yQ291bnQoYmluZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfY291bnQgKz0gZGVzYy0+R2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfY291bnQgKz0gZGVzYy0+R2V0RGVzY3JpcHRvckNvdW50RnJvbUJpbmRpbmcoYmluZGluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlciBpcyBkZXBlbmRlbnQgb24gdGhlIG1heGltdW0gYmluZGluZyBudW1iZXIsIHdoaWNoCisgICAgICAgIC8vIGNhbiBiZSB2ZXJ5IGxhcmdlLiAgVGhpcyBpcyBiZWNhdXNlIGZvciAoc2V0ID0gcywgYmluZGluZyA9IGIsIGluZGV4ID0gaSksIHRoZSB2YWxpZGF0aW9uCisgICAgICAgIC8vIGNvZGUgaXMgZ29pbmcgdG8gZGVyZWZlcmVuY2UgSW5wdXRbIGkgKyBJbnB1dFsgYiArIElucHV0WyBzICsgSW5wdXRbIElucHV0WzBdIF0gXSBdIF0gdG8KKyAgICAgICAgLy8gc2VlIGlmIGRlc2NyaXB0b3JzIGhhdmUgYmVlbiB3cml0dGVuLiBJbiBncHVfdmFsaWRhdGlvbi5tZCwgd2Ugbm90ZSB0aGlzIGFuZCBhZHZpc2UKKyAgICAgICAgLy8gdXNpbmcgZGVuc2VseSBwYWNrZWQgYmluZGluZ3MgYXMgYSBiZXN0IHByYWN0aWNlIHdoZW4gdXNpbmcgZ3B1LWF2IHdpdGggZGVzY3JpcHRvciBpbmRleGluZworICAgICAgICB1aW50MzJfdCB3b3Jkc19uZWVkZWQgPSAxICsgKG51bWJlcl9vZl9zZXRzICogMikgKyAoYmluZGluZ19jb3VudCAqIDIpICsgZGVzY3JpcHRvcl9jb3VudDsKKyAgICAgICAgYWxsb2NJbmZvLnVzYWdlID0gVk1BX01FTU9SWV9VU0FHRV9DUFVfVE9fR1BVOworICAgICAgICBidWZmZXJJbmZvLnNpemUgPSB3b3Jkc19uZWVkZWQgKiA0OworICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgdm1hQ3JlYXRlQnVmZmVyKHZtYUFsbG9jYXRvciwgJmJ1ZmZlckluZm8sICZhbGxvY0luZm8sICZkaV9pbnB1dF9ibG9jay5idWZmZXIsICZkaV9pbnB1dF9ibG9jay5hbGxvY2F0aW9uLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5LiAgRGV2aWNlIGNvdWxkIGJlY29tZSB1bnN0YWJsZS4iKTsKKyAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gUG9wdWxhdGUgaW5wdXQgYnVmZmVyIGZpcnN0IHdpdGggdGhlIHNpemVzIG9mIGV2ZXJ5IGRlc2NyaXB0b3IgaW4gZXZlcnkgc2V0LCB0aGVuIHdpdGggd2hldGhlcgorICAgICAgICAvLyBlYWNoIGVsZW1lbnQgb2YgZWFjaCBkZXNjcmlwdG9yIGhhcyBiZWVuIHdyaXR0ZW4gb3Igbm90LiAgU2VlIGdwdV92YWxpZGF0aW9uLm1kIGZvciBhIG1vcmUgdGhvdXJvdWdoCisgICAgICAgIC8vIG91dGxpbmUgb2YgdGhlIGlucHV0IGJ1ZmZlciBmb3JtYXQKKyAgICAgICAgcmVzdWx0ID0gdm1hTWFwTWVtb3J5KHZtYUFsbG9jYXRvciwgZGlfaW5wdXRfYmxvY2suYWxsb2NhdGlvbiwgKHZvaWQgKiopJnBEYXRhKTsKKyAgICAgICAgbWVtc2V0KHBEYXRhLCAwLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlckluZm8uc2l6ZSkpOworICAgICAgICAvLyBQb2ludGVyIHRvIGEgc2V0cyBhcnJheSB0aGF0IHBvaW50cyBpbnRvIHRoZSBzaXplcyBhcnJheQorICAgICAgICB1aW50MzJfdCAqc2V0c190b19zaXplcyA9IHBEYXRhICsgMTsKKyAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgc2l6ZXMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgYXJyYXkgc2l6ZSBvZiB0aGUgZGVzY3JpcHRvciBhdCBlYWNoIGJpbmRpbmcKKyAgICAgICAgdWludDMyX3QgKnNpemVzID0gc2V0c190b19zaXplcyArIG51bWJlcl9vZl9zZXRzOworICAgICAgICAvLyBQb2ludGVyIHRvIGFub3RoZXIgc2V0cyBhcnJheSB0aGF0IHBvaW50cyBpbnRvIHRoZSBiaW5kaW5ncyBhcnJheSB0aGF0IHBvaW50cyBpbnRvIHRoZSB3cml0dGVuIGFycmF5CisgICAgICAgIHVpbnQzMl90ICpzZXRzX3RvX2JpbmRpbmdzID0gc2l6ZXMgKyBiaW5kaW5nX2NvdW50OworICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBiaW5kaW5ncyBhcnJheSB0aGF0IHBvaW50cyBhdCB0aGUgc3RhcnQgb2YgdGhlIHdyaXRlcyBpbiB0aGUgd3JpdGVzIGFycmF5IGZvciBlYWNoIGJpbmRpbmcKKyAgICAgICAgdWludDMyX3QgKmJpbmRpbmdzX3RvX3dyaXR0ZW4gPSBzZXRzX3RvX2JpbmRpbmdzICsgbnVtYmVyX29mX3NldHM7CisgICAgICAgIC8vIEluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IGluIHRoZSB3cml0dGVuIGFycmF5IHRvIGJlIHVwZGF0ZWQKKyAgICAgICAgdWludDMyX3Qgd3JpdHRlbl9pbmRleCA9IDEgKyAobnVtYmVyX29mX3NldHMgKiAyKSArIChiaW5kaW5nX2NvdW50ICogMik7CisgICAgICAgIHVpbnQzMl90IGJpbmRDb3VudGVyID0gbnVtYmVyX29mX3NldHMgKyAxOworICAgICAgICAvLyBJbmRleCBvZiB0aGUgc3RhcnQgb2YgdGhlIHNldHNfdG9fYmluZGluZ3MgYXJyYXkKKyAgICAgICAgcERhdGFbMF0gPSBudW1iZXJfb2Zfc2V0cyArIGJpbmRpbmdfY291bnQgKyAxOworCisgICAgICAgIGZvciAoYXV0byBzIDogc3RhdGUucGVyX3NldCkgeworICAgICAgICAgICAgYXV0byBkZXNjID0gcy5ib3VuZF9kZXNjcmlwdG9yX3NldDsKKyAgICAgICAgICAgIGlmIChkZXNjICYmIChkZXNjLT5HZXRCaW5kaW5nQ291bnQoKSA+IDApKSB7CisgICAgICAgICAgICAgICAgYXV0byBsYXlvdXQgPSBkZXNjLT5HZXRMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGJpbmRpbmdzID0gbGF5b3V0LT5HZXRTb3J0ZWRCaW5kaW5nU2V0KCk7CisgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggc2V0LCBmaWxsIGluIGluZGV4IG9mIGl0cyBiaW5kaW5ncyBzaXplcyBpbiB0aGUgc2l6ZXMgYXJyYXkKKyAgICAgICAgICAgICAgICAqc2V0c190b19zaXplcysrID0gYmluZENvdW50ZXI7CisgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggc2V0LCBmaWxsIGluIHRoZSBpbmRleCBvZiBpdHMgYmluZGluZ3MgaW4gdGhlIGJpbmRpbmdzX3RvX3dyaXR0ZW4gYXJyYXkKKyAgICAgICAgICAgICAgICAqc2V0c190b19iaW5kaW5ncysrID0gYmluZENvdW50ZXIgKyBudW1iZXJfb2Zfc2V0cyArIGJpbmRpbmdfY291bnQ7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGJpbmRpbmcgOiBiaW5kaW5ncykgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBiaW5kaW5nLCBmaWxsIGluIGl0cyBzaXplIGluIHRoZSBzaXplcyBhcnJheQorICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgaW5zdHJ1bWVudGF0aW9uIGlzIHRyYWNraW5nIGlubGluZSB1bmlmb3JtIGJsb2NrcyBhcyBzY2FsZXJzLiBEb24ndCB0cnkgdG8gdmFsaWRhdGUgaW5saW5lIHVuaWZvcm0KKyAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzCisgICAgICAgICAgICAgICAgICAgIGlmIChWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUID09IGRlc2MtPkdldExheW91dCgpLT5HZXRUeXBlRnJvbUJpbmRpbmcoYmluZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzW2JpbmRpbmddID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nID09IGxheW91dC0+R2V0TWF4QmluZGluZygpICYmIGRlc2MtPklzVmFyaWFibGVEZXNjcmlwdG9yQ291bnQoYmluZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzW2JpbmRpbmddID0gZGVzYy0+R2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzW2JpbmRpbmddID0gZGVzYy0+R2V0RGVzY3JpcHRvckNvdW50RnJvbUJpbmRpbmcoYmluZGluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgc3RhcnRpbmcgaW5kZXggZm9yIHRoaXMgYmluZGluZyBpbiB0aGUgd3JpdHRlbiBhcnJheSBpbiB0aGUgYmluZGluZ3NfdG9fd3JpdHRlbiBhcnJheQorICAgICAgICAgICAgICAgICAgICBiaW5kaW5nc190b193cml0dGVuW2JpbmRpbmddID0gd3JpdHRlbl9pbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgaW5zdHJ1bWVudGF0aW9uIGlzIHRyYWNraW5nIGlubGluZSB1bmlmb3JtIGJsb2NrcyBhcyBzY2FsZXJzLiBEb24ndCB0cnkgdG8gdmFsaWRhdGUgaW5saW5lIHVuaWZvcm0KKyAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzCisgICAgICAgICAgICAgICAgICAgIGlmIChWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUID09IGRlc2MtPkdldExheW91dCgpLT5HZXRUeXBlRnJvbUJpbmRpbmcoYmluZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhW3dyaXR0ZW5faW5kZXgrK10gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdXRvIGluZGV4X3JhbmdlID0gZGVzYy0+R2V0R2xvYmFsSW5kZXhSYW5nZUZyb21CaW5kaW5nKGJpbmRpbmcsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBhcnJheSBlbGVtZW50IGluIHRoZSBiaW5kaW5nLCB1cGRhdGUgdGhlIHdyaXR0ZW4gYXJyYXkgd2l0aCB3aGV0aGVyIGl0IGhhcyBiZWVuIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gaW5kZXhfcmFuZ2Uuc3RhcnQ7IGkgPCBpbmRleF9yYW5nZS5lbmQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byAqZGVzY3JpcHRvciA9IGRlc2MtPkdldERlc2NyaXB0b3JGcm9tR2xvYmFsSW5kZXgoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+dXBkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhW3dyaXR0ZW5faW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzYy0+SXNVcGRhdGVBZnRlckJpbmQoYmluZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBoYXNuJ3QgYmVlbiB3cml0dGVuIG5vdyBhbmQgaXQncyB1cGRhdGUgYWZ0ZXIgYmluZCwgcHV0IGl0IGluIGEgbGlzdCB0byBjaGVjayBhdCBRdWV1ZVN1Ym1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpX2lucHV0X2Jsb2NrLnVwZGF0ZV9hdF9zdWJtaXRbd3JpdHRlbl9pbmRleF0gPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbl9pbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF1dG8gbGFzdCA9IGRlc2MtPkdldExheW91dCgpLT5HZXRNYXhCaW5kaW5nKCk7CisgICAgICAgICAgICAgICAgYmluZGluZ3NfdG9fd3JpdHRlbiArPSBsYXN0ICsgMTsKKyAgICAgICAgICAgICAgICBiaW5kQ291bnRlciArPSBsYXN0ICsgMTsKKyAgICAgICAgICAgICAgICBzaXplcyArPSBsYXN0ICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnNldHNfdG9fc2l6ZXMrKyA9IDA7CisgICAgICAgICAgICAgICAgKnNldHNfdG9fYmluZGluZ3MrKyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm1hVW5tYXBNZW1vcnkodm1hQWxsb2NhdG9yLCBkaV9pbnB1dF9ibG9jay5hbGxvY2F0aW9uKTsKKworICAgICAgICBkaV9pbnB1dF9kZXNjX2J1ZmZlcl9pbmZvLnJhbmdlID0gKHdvcmRzX25lZWRlZCAqIDQpOworICAgICAgICBkaV9pbnB1dF9kZXNjX2J1ZmZlcl9pbmZvLmJ1ZmZlciA9IGRpX2lucHV0X2Jsb2NrLmJ1ZmZlcjsKKyAgICAgICAgZGlfaW5wdXRfZGVzY19idWZmZXJfaW5mby5vZmZzZXQgPSAwOworCisgICAgICAgIGRlc2Nfd3JpdGVzWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgICAgIGRlc2Nfd3JpdGVzWzFdLmRzdEJpbmRpbmcgPSAxOworICAgICAgICBkZXNjX3dyaXRlc1sxXS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgICAgICBkZXNjX3dyaXRlc1sxXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjsKKyAgICAgICAgZGVzY193cml0ZXNbMV0ucEJ1ZmZlckluZm8gPSAmZGlfaW5wdXRfZGVzY19idWZmZXJfaW5mbzsKKyAgICAgICAgZGVzY193cml0ZXNbMV0uZHN0U2V0ID0gZGVzY19zZXRzWzBdOworCisgICAgICAgIGRlc2NfY291bnQgPSAyOworICAgIH0KKworICAgIGlmIChudW1iZXJfb2Zfc2V0cyA+IDAgJiYgZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2J1ZmZlcl9kZXZpY2VfYWRkcmVzcyAmJiBidWZmZXJfbWFwLnNpemUoKSAmJiBzaGFkZXJJbnQ2NCkgeworICAgICAgICAvLyBFeGFtcGxlIEJEQSBpbnB1dCBidWZmZXIgYXNzdW1pbmcgMiBidWZmZXJzIHVzaW5nIEJEQToKKyAgICAgICAgLy8gV29yZCAwIHwgSW5kZXggb2Ygc3RhcnQgb2YgYnVmZmVyIHNpemVzIChpbiB0aGlzIGNhc2UgNSkKKyAgICAgICAgLy8gV29yZCAxIHwgMHgwMDAwMDAwMDAwMDAwMDAwCisgICAgICAgIC8vIFdvcmQgMiB8IERldmljZSBBZGRyZXNzIG9mIGZpcnN0IGJ1ZmZlciAgKEFkZHJlc3NlcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyKQorICAgICAgICAvLyBXb3JkIDMgfCBEZXZpY2UgQWRkcmVzcyBvZiBzZWNvbmQgYnVmZmVyCisgICAgICAgIC8vIFdvcmQgNCB8IDB4ZmZmZmZmZmZmZmZmZmZmZgorICAgICAgICAvLyBXb3JkIDUgfCAwIChzaXplIG9mIHByZXRlbmQgYnVmZmVyIGF0IHdvcmQgMSkKKyAgICAgICAgLy8gV29yZCA2IHwgU2l6ZSBpbiBieXRlcyBvZiBmaXJzdCBidWZmZXIKKyAgICAgICAgLy8gV29yZCA3IHwgU2l6ZSBpbiBieXRlcyBvZiBzZWNvbmQgYnVmZmVyCisgICAgICAgIC8vIFdvcmQgOCB8IDAgKHNpemUgb2YgcHJldGVuZCBidWZmZXIgaW4gd29yZCA0KQorCisgICAgICAgIHVpbnQzMl90IG51bV9idWZmZXJzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcl9tYXAuc2l6ZSgpKTsKKyAgICAgICAgdWludDMyX3Qgd29yZHNfbmVlZGVkID0gKG51bV9idWZmZXJzICsgMykgKyAobnVtX2J1ZmZlcnMgKyAyKTsKKyAgICAgICAgYWxsb2NJbmZvLnVzYWdlID0gVk1BX01FTU9SWV9VU0FHRV9DUFVfVE9fR1BVOworICAgICAgICBidWZmZXJJbmZvLnNpemUgPSB3b3Jkc19uZWVkZWQgKiA4OyAgLy8gNjQgYml0IHdvcmRzCisgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICB2bWFDcmVhdGVCdWZmZXIodm1hQWxsb2NhdG9yLCAmYnVmZmVySW5mbywgJmFsbG9jSW5mbywgJmJkYV9pbnB1dF9ibG9jay5idWZmZXIsICZiZGFfaW5wdXRfYmxvY2suYWxsb2NhdGlvbiwgbnVsbHB0cik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgUmVwb3J0U2V0dXBQcm9ibGVtKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCBIYW5kbGVUb1VpbnQ2NChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIG1lbW9yeS4gIERldmljZSBjb3VsZCBiZWNvbWUgdW5zdGFibGUuIik7CisgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB1aW50NjRfdCAqYmRhX2RhdGE7CisgICAgICAgIHJlc3VsdCA9IHZtYU1hcE1lbW9yeSh2bWFBbGxvY2F0b3IsIGJkYV9pbnB1dF9ibG9jay5hbGxvY2F0aW9uLCAodm9pZCAqKikmYmRhX2RhdGEpOworICAgICAgICB1aW50MzJfdCBhZGRyZXNzX2luZGV4ID0gMTsKKyAgICAgICAgdWludDMyX3Qgc2l6ZV9pbmRleCA9IDMgKyBudW1fYnVmZmVyczsKKyAgICAgICAgbWVtc2V0KGJkYV9kYXRhLCAwLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlckluZm8uc2l6ZSkpOworICAgICAgICBiZGFfZGF0YVswXSA9IHNpemVfaW5kZXg7ICAgICAgIC8vIFN0YXJ0IG9mIGJ1ZmZlciBzaXplcworICAgICAgICBiZGFfZGF0YVthZGRyZXNzX2luZGV4KytdID0gMDsgIC8vIE5VTEwgYWRkcmVzcworICAgICAgICBiZGFfZGF0YVtzaXplX2luZGV4KytdID0gMDsKKworICAgICAgICBmb3IgKGF1dG8gY29uc3QgJnZhbHVlIDogYnVmZmVyX21hcCkgeworICAgICAgICAgICAgYmRhX2RhdGFbYWRkcmVzc19pbmRleCsrXSA9IHZhbHVlLmZpcnN0OworICAgICAgICAgICAgYmRhX2RhdGFbc2l6ZV9pbmRleCsrXSA9IHZhbHVlLnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBiZGFfZGF0YVthZGRyZXNzX2luZGV4XSA9IFVJTlRQVFJfTUFYOworICAgICAgICBiZGFfZGF0YVtzaXplX2luZGV4XSA9IDA7CisgICAgICAgIHZtYVVubWFwTWVtb3J5KHZtYUFsbG9jYXRvciwgYmRhX2lucHV0X2Jsb2NrLmFsbG9jYXRpb24pOworCisgICAgICAgIGJkYV9pbnB1dF9kZXNjX2J1ZmZlcl9pbmZvLnJhbmdlID0gKHdvcmRzX25lZWRlZCAqIDgpOworICAgICAgICBiZGFfaW5wdXRfZGVzY19idWZmZXJfaW5mby5idWZmZXIgPSBiZGFfaW5wdXRfYmxvY2suYnVmZmVyOworICAgICAgICBiZGFfaW5wdXRfZGVzY19idWZmZXJfaW5mby5vZmZzZXQgPSAwOworCisgICAgICAgIGRlc2Nfd3JpdGVzW2Rlc2NfY291bnRdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgICAgIGRlc2Nfd3JpdGVzW2Rlc2NfY291bnRdLmRzdEJpbmRpbmcgPSAyOworICAgICAgICBkZXNjX3dyaXRlc1tkZXNjX2NvdW50XS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgICAgICBkZXNjX3dyaXRlc1tkZXNjX2NvdW50XS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjsKKyAgICAgICAgZGVzY193cml0ZXNbZGVzY19jb3VudF0ucEJ1ZmZlckluZm8gPSAmYmRhX2lucHV0X2Rlc2NfYnVmZmVyX2luZm87CisgICAgICAgIGRlc2Nfd3JpdGVzW2Rlc2NfY291bnRdLmRzdFNldCA9IGRlc2Nfc2V0c1swXTsKKyAgICAgICAgZGVzY19jb3VudCsrOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBkZXNjcmlwdG9yCisgICAgb3V0cHV0X2Rlc2NfYnVmZmVyX2luZm8uYnVmZmVyID0gb3V0cHV0X2Jsb2NrLmJ1ZmZlcjsKKyAgICBvdXRwdXRfZGVzY19idWZmZXJfaW5mby5vZmZzZXQgPSAwOworCisgICAgZGVzY193cml0ZXNbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjX3dyaXRlc1swXS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRlc2Nfd3JpdGVzWzBdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOworICAgIGRlc2Nfd3JpdGVzWzBdLnBCdWZmZXJJbmZvID0gJm91dHB1dF9kZXNjX2J1ZmZlcl9pbmZvOworICAgIGRlc2Nfd3JpdGVzWzBdLmRzdFNldCA9IGRlc2Nfc2V0c1swXTsKKyAgICBEaXNwYXRjaFVwZGF0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY19jb3VudCwgZGVzY193cml0ZXMsIDAsIE5VTEwpOworCisgICAgYXV0byBpdGVyID0gY2Jfbm9kZS0+bGFzdEJvdW5kLmZpbmQoYmluZF9wb2ludCk7ICAvLyBmaW5kKCkgYWxsb3dzIHJlYWQtb25seSBhY2Nlc3MgdG8gY2Jfc3RhdGUKKyAgICBpZiAoaXRlciAhPSBjYl9ub2RlLT5sYXN0Qm91bmQuZW5kKCkpIHsKKyAgICAgICAgYXV0byBwaXBlbGluZV9zdGF0ZSA9IGl0ZXItPnNlY29uZC5waXBlbGluZV9zdGF0ZTsKKyAgICAgICAgaWYgKHBpcGVsaW5lX3N0YXRlICYmIChwaXBlbGluZV9zdGF0ZS0+cGlwZWxpbmVfbGF5b3V0LT5zZXRfbGF5b3V0cy5zaXplKCkgPD0gZGVzY19zZXRfYmluZF9pbmRleCkpIHsKKyAgICAgICAgICAgIERpc3BhdGNoQ21kQmluZERlc2NyaXB0b3JTZXRzKGNtZF9idWZmZXIsIGJpbmRfcG9pbnQsIHBpcGVsaW5lX3N0YXRlLT5waXBlbGluZV9sYXlvdXQtPmxheW91dCwgZGVzY19zZXRfYmluZF9pbmRleCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Nfc2V0cy5kYXRhKCksIDAsIG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIC8vIFJlY29yZCBidWZmZXIgYW5kIG1lbW9yeSBpbmZvIGluIENCIHN0YXRlIHRyYWNraW5nCisgICAgICAgIEdldEdwdUFzc2lzdGVkQnVmZmVySW5mbyhjbWRfYnVmZmVyKQorICAgICAgICAgICAgLmVtcGxhY2VfYmFjayhvdXRwdXRfYmxvY2ssIGRpX2lucHV0X2Jsb2NrLCBiZGFfaW5wdXRfYmxvY2ssIGRlc2Nfc2V0c1swXSwgZGVzY19wb29sLCBiaW5kX3BvaW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXBvcnRTZXR1cFByb2JsZW0oVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksICJVbmFibGUgdG8gZmluZCBwaXBlbGluZSBzdGF0ZSIpOworICAgICAgICB2bWFEZXN0cm95QnVmZmVyKHZtYUFsbG9jYXRvciwgZGlfaW5wdXRfYmxvY2suYnVmZmVyLCBkaV9pbnB1dF9ibG9jay5hbGxvY2F0aW9uKTsKKyAgICAgICAgdm1hRGVzdHJveUJ1ZmZlcih2bWFBbGxvY2F0b3IsIGJkYV9pbnB1dF9ibG9jay5idWZmZXIsIGJkYV9pbnB1dF9ibG9jay5hbGxvY2F0aW9uKTsKKyAgICAgICAgdm1hRGVzdHJveUJ1ZmZlcih2bWFBbGxvY2F0b3IsIG91dHB1dF9ibG9jay5idWZmZXIsIG91dHB1dF9ibG9jay5hbGxvY2F0aW9uKTsKKyAgICAgICAgYWJvcnRlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ3B1X3ZhbGlkYXRpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9ncHVfdmFsaWRhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzZmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvZ3B1X3ZhbGlkYXRpb24uaApAQCAtMCwwICsxLDI1MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogS2FybCBTY2h1bHR6IDxrYXJsQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBsdW5hcmcuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiY2hhc3Npcy5oIgorI2luY2x1ZGUgInN0YXRlX3RyYWNrZXIuaCIKKyNpbmNsdWRlICJ2a19tZW1fYWxsb2MuaCIKK2NsYXNzIEdwdUFzc2lzdGVkOworCitzdHJ1Y3QgR3B1QXNzaXN0ZWREZXZpY2VNZW1vcnlCbG9jayB7CisgICAgVmtCdWZmZXIgYnVmZmVyOworICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIGNvbnN0IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvcio+IHVwZGF0ZV9hdF9zdWJtaXQ7Cit9OworCitzdHJ1Y3QgR3B1QXNzaXN0ZWRCdWZmZXJJbmZvIHsKKyAgICBHcHVBc3Npc3RlZERldmljZU1lbW9yeUJsb2NrIG91dHB1dF9tZW1fYmxvY2s7CisgICAgR3B1QXNzaXN0ZWREZXZpY2VNZW1vcnlCbG9jayBkaV9pbnB1dF9tZW1fYmxvY2s7ICAgLy8gRGVzY3JpcHRvciBJbmRleGluZyBpbnB1dAorICAgIEdwdUFzc2lzdGVkRGV2aWNlTWVtb3J5QmxvY2sgYmRhX2lucHV0X21lbV9ibG9jazsgIC8vIEJ1ZmZlciBEZXZpY2UgQWRkcmVzcyBpbnB1dAorICAgIFZrRGVzY3JpcHRvclNldCBkZXNjX3NldDsKKyAgICBWa0Rlc2NyaXB0b3JQb29sIGRlc2NfcG9vbDsKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lX2JpbmRfcG9pbnQ7CisgICAgR3B1QXNzaXN0ZWRCdWZmZXJJbmZvKEdwdUFzc2lzdGVkRGV2aWNlTWVtb3J5QmxvY2sgb3V0cHV0X21lbV9ibG9jaywgR3B1QXNzaXN0ZWREZXZpY2VNZW1vcnlCbG9jayBkaV9pbnB1dF9tZW1fYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdwdUFzc2lzdGVkRGV2aWNlTWVtb3J5QmxvY2sgYmRhX2lucHV0X21lbV9ibG9jaywgVmtEZXNjcmlwdG9yU2V0IGRlc2Nfc2V0LCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NfcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZV9iaW5kX3BvaW50KQorICAgICAgICA6IG91dHB1dF9tZW1fYmxvY2sob3V0cHV0X21lbV9ibG9jayksCisgICAgICAgICAgZGlfaW5wdXRfbWVtX2Jsb2NrKGRpX2lucHV0X21lbV9ibG9jayksCisgICAgICAgICAgYmRhX2lucHV0X21lbV9ibG9jayhiZGFfaW5wdXRfbWVtX2Jsb2NrKSwKKyAgICAgICAgICBkZXNjX3NldChkZXNjX3NldCksCisgICAgICAgICAgZGVzY19wb29sKGRlc2NfcG9vbCksCisgICAgICAgICAgcGlwZWxpbmVfYmluZF9wb2ludChwaXBlbGluZV9iaW5kX3BvaW50KXt9OworfTsKKworc3RydWN0IEdwdUFzc2lzdGVkUXVldWVCYXJyaWVyQ29tbWFuZEluZm8geworICAgIFZrQ29tbWFuZFBvb2wgYmFycmllcl9jb21tYW5kX3Bvb2wgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0NvbW1hbmRCdWZmZXIgYmFycmllcl9jb21tYW5kX2J1ZmZlciA9IFZLX05VTExfSEFORExFOworfTsKKworLy8gQ2xhc3MgdG8gZW5jYXBzdWxhdGUgRGVzY3JpcHRvciBTZXQgYWxsb2NhdGlvbi4gIFRoaXMgbWFuYWdlciBjcmVhdGVzIGFuZCBkZXN0cm95cyBEZXNjcmlwdG9yIFBvb2xzCisvLyBhcyBuZWVkZWQgdG8gc2F0aXNmeSByZXF1ZXN0cyBmb3IgZGVzY3JpcHRvciBzZXRzLgorY2xhc3MgR3B1QXNzaXN0ZWREZXNjcmlwdG9yU2V0TWFuYWdlciB7CisgIHB1YmxpYzoKKyAgICBHcHVBc3Npc3RlZERlc2NyaXB0b3JTZXRNYW5hZ2VyKEdwdUFzc2lzdGVkKiBkZXZfZGF0YSk7CisgICAgfkdwdUFzc2lzdGVkRGVzY3JpcHRvclNldE1hbmFnZXIoKTsKKworICAgIFZrUmVzdWx0IEdldERlc2NyaXB0b3JTZXQoVmtEZXNjcmlwdG9yUG9vbCogZGVzY19wb29sLCBWa0Rlc2NyaXB0b3JTZXQqIGRlc2Nfc2V0cyk7CisgICAgVmtSZXN1bHQgR2V0RGVzY3JpcHRvclNldHModWludDMyX3QgY291bnQsIFZrRGVzY3JpcHRvclBvb2wqIHBvb2wsIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldD4qIGRlc2Nfc2V0cyk7CisgICAgdm9pZCBQdXRCYWNrRGVzY3JpcHRvclNldChWa0Rlc2NyaXB0b3JQb29sIGRlc2NfcG9vbCwgVmtEZXNjcmlwdG9yU2V0IGRlc2Nfc2V0KTsKKworICBwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSXRlbXNQZXJDaHVuayA9IDUxMjsKKyAgICBzdHJ1Y3QgUG9vbFRyYWNrZXIgeworICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICB1aW50MzJfdCB1c2VkOworICAgIH07CisKKyAgICBHcHVBc3Npc3RlZCogZGV2X2RhdGFfOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa0Rlc2NyaXB0b3JQb29sLCBzdHJ1Y3QgUG9vbFRyYWNrZXI+IGRlc2NfcG9vbF9tYXBfOworfTsKKworc3RydWN0IEdwdUFzc2lzdGVkU2hhZGVyVHJhY2tlciB7CisgICAgVmtQaXBlbGluZSBwaXBlbGluZTsKKyAgICBWa1NoYWRlck1vZHVsZSBzaGFkZXJfbW9kdWxlOworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gcGdtOworfTsKKworc3RydWN0IEdwdUFzc2lzdGVkQWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uQnVmZmVySW5mbyB7CisgICAgLy8gVGhlIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgdGhhdCBpcyBiZWluZyBidWlsdC4KKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmUgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIC8vIFRoZSBkZXNjcmlwdG9yIHBvb2wgYW5kIGRlc2NyaXB0b3Igc2V0IGJlaW5nIHVzZWQgdG8gdmFsaWRhdGUgYSBnaXZlbiBidWlsZC4KKyAgICBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JfcG9vbCA9IFZLX05VTExfSEFORExFOworICAgIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldCA9IFZLX05VTExfSEFORExFOworCisgICAgLy8gVGhlIHN0b3JhZ2UgYnVmZmVyIHVzZWQgYnkgdGhlIHZhbGlkYXRpbmcgY29tcHV0ZSBzaGFkZXIgd2hpY2hjb250YWlucyBpbmZvIGFib3V0CisgICAgLy8gdGhlIHZhbGlkIGhhbmRsZXMgYW5kIHdoaWNoIGlzIHdyaXR0ZW4gdG8gY29tbXVuaWNhdGUgZm91bmQgaW52YWxpZCBoYW5kbGVzLgorICAgIFZrQnVmZmVyIHZhbGlkYXRpb25fYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgICAgVm1hQWxsb2NhdGlvbiB2YWxpZGF0aW9uX2J1ZmZlcl9hbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7Cit9OworCitzdHJ1Y3QgR3B1QXNzaXN0ZWRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVCdWlsZFZhbGlkYXRpb25TdGF0ZSB7CisgICAgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgVmtQaXBlbGluZSBwaXBlbGluZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHJlcGxhY2VtZW50X2FzID0gVktfTlVMTF9IQU5ETEU7CisgICAgVm1hQWxsb2NhdGlvbiByZXBsYWNlbWVudF9hc19hbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7CisgICAgdWludDY0X3QgcmVwbGFjZW1lbnRfYXNfaGFuZGxlID0gMDsKKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa0NvbW1hbmRCdWZmZXIsIHN0ZDo6dmVjdG9yPEdwdUFzc2lzdGVkQWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uQnVmZmVySW5mbz4+IHZhbGlkYXRpb25fYnVmZmVyczsKK307CisKK2NsYXNzIEdwdUFzc2lzdGVkIDogcHVibGljIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgeworICAgIGJvb2wgYWJvcnRlZCA9IGZhbHNlOworICAgIFZrQm9vbDMyIHNoYWRlckludDY0OworICAgIHVpbnQzMl90IGFkanVzdGVkX21heF9kZXNjX3NldHM7CisgICAgdWludDMyX3QgZGVzY19zZXRfYmluZF9pbmRleDsKKyAgICB1aW50MzJfdCB1bmlxdWVfc2hhZGVyX21vZHVsZV9pZCA9IDA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBHcHVBc3Npc3RlZFNoYWRlclRyYWNrZXI+IHNoYWRlcl9tYXA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEdwdUFzc2lzdGVkRGVzY3JpcHRvclNldE1hbmFnZXI+IGRlc2Nfc2V0X21hbmFnZXI7CisgICAgc3RkOjptYXA8VmtRdWV1ZSwgR3B1QXNzaXN0ZWRRdWV1ZUJhcnJpZXJDb21tYW5kSW5mbz4gcXVldWVfYmFycmllcl9jb21tYW5kX2luZm9zOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa0NvbW1hbmRCdWZmZXIsIHN0ZDo6dmVjdG9yPEdwdUFzc2lzdGVkQnVmZmVySW5mbz4+IGNvbW1hbmRfYnVmZmVyX21hcDsgIC8vIGdwdV9idWZmZXJfbGlzdDsKKyAgICB1aW50MzJfdCBvdXRwdXRfYnVmZmVyX3NpemU7CisgICAgVm1hQWxsb2NhdG9yIHZtYUFsbG9jYXRvciA9IHt9OworICAgIFBGTl92a1NldERldmljZUxvYWRlckRhdGEgdmtTZXREZXZpY2VMb2FkZXJEYXRhOworICAgIHN0ZDo6bWFwPFZrRGV2aWNlQWRkcmVzcywgVmtEZXZpY2VTaXplPiBidWZmZXJfbWFwOworICAgIEdwdUFzc2lzdGVkQWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uU3RhdGUgYWNjZWxlcmF0aW9uX3N0cnVjdHVyZV92YWxpZGF0aW9uX3N0YXRlOworICAgIHN0ZDo6dmVjdG9yPEdwdUFzc2lzdGVkQnVmZmVySW5mbz4mIEdldEdwdUFzc2lzdGVkQnVmZmVySW5mbyhjb25zdCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIpIHsKKyAgICAgICAgYXV0byBidWZmZXJfbGlzdCA9IGNvbW1hbmRfYnVmZmVyX21hcC5maW5kKGNvbW1hbmRfYnVmZmVyKTsKKyAgICAgICAgaWYgKGJ1ZmZlcl9saXN0ID09IGNvbW1hbmRfYnVmZmVyX21hcC5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8R3B1QXNzaXN0ZWRCdWZmZXJJbmZvPiBuZXdfbGlzdHt9OworICAgICAgICAgICAgY29tbWFuZF9idWZmZXJfbWFwW2NvbW1hbmRfYnVmZmVyXSA9IG5ld19saXN0OworICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRfYnVmZmVyX21hcFtjb21tYW5kX2J1ZmZlcl07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlcl9saXN0LT5zZWNvbmQ7CisgICAgfQorICAgIHZvaWQgUmVwb3J0U2V0dXBQcm9ibGVtKFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLCB1aW50NjRfdCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHNwZWNpZmljX21lc3NhZ2UpIGNvbnN0OworCisgIHB1YmxpYzoKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZGVidWdfZGVzY19sYXlvdXQ7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGR1bW15X2Rlc2NfbGF5b3V0OworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIGdwdSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9Wa0RldmljZUNyZWF0ZUluZm8qIG1vZGlmaWVkX2NyZWF0ZV9pbmZvKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgZ3B1LCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZSogcERldmljZSwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9FWFQqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlQWRkcmVzcyBhZGRyZXNzKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95QnVmZmVyKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBwQmluZEluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmVMYXlvdXQqIHBQaXBlbGluZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjcGxfc3RhdGVfZGF0YSk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmVMYXlvdXQqIHBQaXBlbGluZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFJlc2V0Q29tbWFuZEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcik7CisgICAgYm9vbCBQcmVDYWxsVmFsaWRhdGVDbWRXYWl0RXZlbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqIHBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiBwSW1hZ2VNZW1vcnlCYXJyaWVycykgY29uc3Q7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciogcEJ1ZmZlciwgdm9pZCogY2Jfc3RhdGVfZGF0YSk7CisgICAgdm9pZCBDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVCdWlsZFZhbGlkYXRpb25TdGF0ZShHcHVBc3Npc3RlZCogZGV2aWNlX0dwdUFzc2lzdGVkKTsKKyAgICB2b2lkIERlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVCdWlsZFZhbGlkYXRpb25TdGF0ZSgpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGluc3RhbmNlRGF0YSwgVmtEZXZpY2VTaXplIGluc3RhbmNlT2Zmc2V0LCBWa0Jvb2wzMiB1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBzY3JhdGNoLCBWa0RldmljZVNpemUgc2NyYXRjaE9mZnNldCk7CisgICAgdm9pZCBQcm9jZXNzQWNjZWxlcmF0aW9uU3RydWN0dXJlQnVpbGRWYWxpZGF0aW9uQnVmZmVyKFZrUXVldWUgcXVldWUsIENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2dwbF9zdGF0ZV9kYXRhKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjY3BsX3N0YXRlX2RhdGEpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjcnRwbF9zdGF0ZV9kYXRhKTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ3JlYXRlSW5mbywgdHlwZW5hbWUgU2FmZUNyZWF0ZUluZm8+CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkUGlwZWxpbmVDcmVhdGlvbnModWludDMyX3QgY291bnQsIGNvbnN0IENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxQSVBFTElORV9TVEFURT4+JiBwaXBlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNhZmVDcmVhdGVJbmZvPiogbmV3X3BpcGVsaW5lX2NyZWF0ZV9pbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BpcGVsaW5lQmluZFBvaW50IGJpbmRfcG9pbnQpOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDcmVhdGVJbmZvPgorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRQaXBlbGluZUNyZWF0aW9ucyhjb25zdCB1aW50MzJfdCBjb3VudCwgY29uc3QgQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywgVmtSZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjZ3BsX3N0YXRlX2RhdGEpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywgVmtSZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNjcGxfc3RhdGVfZGF0YSk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsIFZrUmVzdWx0IHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNydHBsX3N0YXRlX2RhdGEpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgYm9vbCBJbnN0cnVtZW50U2hhZGVyKGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4mIG5ld19wZ20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB1bmlxdWVfc2hhZGVyX2lkKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVTaGFkZXJNb2R1bGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2hhZGVyTW9kdWxlKiBwU2hhZGVyTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjc21fc3RhdGVfZGF0YSk7CisgICAgdm9pZCBBbmFseXplQW5kUmVwb3J0RXJyb3IoQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSwgVmtRdWV1ZSBxdWV1ZSwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZV9iaW5kX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9wZXJhdGlvbl9pbmRleCwgdWludDMyX3QqIGNvbnN0IGRlYnVnX291dHB1dF9idWZmZXIpOworICAgIHZvaWQgUHJvY2Vzc0luc3RydW1lbnRhdGlvbkJ1ZmZlcihWa1F1ZXVlIHF1ZXVlLCBDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlKTsKKyAgICB2b2lkIFVwZGF0ZUluc3RydW1lbnRhdGlvbkJ1ZmZlcihDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlKTsKKyAgICB2b2lkIFN1Ym1pdEJhcnJpZXIoVmtRdWV1ZSBxdWV1ZSk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkUXVldWVTdWJtaXQoVmtRdWV1ZSBxdWV1ZSwgdWludDMyX3Qgc3VibWl0Q291bnQsIGNvbnN0IFZrU3VibWl0SW5mbyogcFN1Ym1pdHMsIFZrRmVuY2UgZmVuY2UpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZVN1Ym1pdChWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBzdWJtaXRDb3VudCwgY29uc3QgVmtTdWJtaXRJbmZvKiBwU3VibWl0cywgVmtGZW5jZSBmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RWZXJ0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluc3RhbmNlKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgaW5kZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZERpc3BhdGNoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWREaXNwYXRjaEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZFRyYWNlUmF5c05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHJheWdlblNoYWRlckJpbmRpbmdPZmZzZXQsIFZrQnVmZmVyIG1pc3NTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG1pc3NTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ1N0cmlkZSwgVmtCdWZmZXIgY2FsbGFibGVTaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGNhbGxhYmxlU2hhZGVyQmluZGluZ09mZnNldCwgVmtEZXZpY2VTaXplIGNhbGxhYmxlU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkZXB0aCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZFRyYWNlUmF5c05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciByYXlnZW5TaGFkZXJCaW5kaW5nVGFibGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSByYXlnZW5TaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0J1ZmZlciBtaXNzU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgbWlzc1NoYWRlckJpbmRpbmdPZmZzZXQsIFZrRGV2aWNlU2l6ZSBtaXNzU2hhZGVyQmluZGluZ1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgaGl0U2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLCBWa0RldmljZVNpemUgaGl0U2hhZGVyQmluZGluZ09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGhpdFNoYWRlckJpbmRpbmdTdHJpZGUsIFZrQnVmZmVyIGNhbGxhYmxlU2hhZGVyQmluZGluZ1RhYmxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nT2Zmc2V0LCBWa0RldmljZVNpemUgY2FsbGFibGVTaGFkZXJCaW5kaW5nU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBkZXB0aCk7CisgICAgdm9pZCBBbGxvY2F0ZVZhbGlkYXRpb25SZXNvdXJjZXMoY29uc3QgVmtDb21tYW5kQnVmZmVyIGNtZF9idWZmZXIsIGNvbnN0IFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMqIHBQaHlzaWNhbERldmljZVByb3BlcnRpZXMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKiBwUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMik7CisgICAgVmtSZXN1bHQgSW5pdGlhbGl6ZVZtYShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0RldmljZSBkZXZpY2UsIFZtYUFsbG9jYXRvciogcEFsbG9jYXRvcik7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2hhc2hfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2hhc2hfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTBkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvaGFzaF91dGlsLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorICovCisjaWZuZGVmIEhBU0hfVVRJTF9IXworI2RlZmluZSBIQVNIX1VUSUxfSF8KKworI2RlZmluZSBOT01JTk1BWAorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBIYXNoIGFuZCBlcXVhbGl0eSB1dGlsaXRpZXMgZm9yIHN1cHBvcnRpbmcgaGFzaGluZyBjb250YWluZXJzIChlLmcuIHVub3JkZXJlZF9zZXQsIHVub3JkZXJlZF9tYXApCituYW1lc3BhY2UgaGFzaF91dGlsIHsKKworLy8gVHJ1ZSBpZmYgYm90aCBwb2ludGVycyBhcmUgbnVsbCBvciBib3RoIGFyZSBub24tbnVsbAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIHNpbWlsYXJfZm9yX251bGxpdHkoY29uc3QgVCAqY29uc3QgbGhzLCBjb25zdCBUICpjb25zdCByaHMpIHsKKyAgICByZXR1cm4gKChsaHMgIT0gbnVsbHB0cikgJiYgKHJocyAhPSBudWxscHRyKSkgfHwgKChsaHMgPT0gbnVsbHB0cikgJiYgKHJocyA9PSBudWxscHRyKSk7Cit9CisKKy8vIFdyYXAgc3RkIGhhc2ggdG8gYXZvaWQgbWFudWFsIGNhc3RzIGZvciB0aGUgaG9sZXMgaW4gc3RkOjpoYXNoIChpbiBDKysxMSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK3NpemVfdCBIYXNoV2l0aFVuZGVybHlpbmcoVmFsdWUgdmFsdWUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2VudW08VmFsdWU+Ojp2YWx1ZSwgdm9pZCAqPjo6dHlwZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPFZhbHVlPigpKHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorc2l6ZV90IEhhc2hXaXRoVW5kZXJseWluZyhWYWx1ZSB2YWx1ZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19lbnVtPFZhbHVlPjo6dmFsdWUsIHZvaWQgKj46OnR5cGUgPSBudWxscHRyKSB7CisgICAgdXNpbmcgVW5kZXJseWluZyA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFZhbHVlPjo6dHlwZTsKKyAgICByZXR1cm4gc3RkOjpoYXNoPFVuZGVybHlpbmc+KCkoc3RhdGljX2Nhc3Q8Y29uc3QgVW5kZXJseWluZyAmPih2YWx1ZSkpOworfQorCitjbGFzcyBIYXNoQ29tYmluZXIgeworICBwdWJsaWM6CisgICAgdXNpbmcgS2V5ID0gc2l6ZV90OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorICAgIHN0cnVjdCBXcmFwcGVkSGFzaCB7CisgICAgICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFZhbHVlICZ2YWx1ZSkgY29uc3QgeyByZXR1cm4gSGFzaFdpdGhVbmRlcmx5aW5nKHZhbHVlKTsgfQorICAgIH07CisKKyAgICBIYXNoQ29tYmluZXIoS2V5IGNvbWJpbmVkID0gMCkgOiBjb21iaW5lZF8oY29tYmluZWQpIHt9CisgICAgLy8gbWFnaWMgYW5kIGNvbWJpbmF0aW9uIGFsZ29yaXRobSBiYXNlZCBvbiBib29zdDo6aGFzaF9jb21iaW5lCisgICAgLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvMV80M18wL2RvYy9odG1sL2hhc2gvcmVmZXJlbmNlLmh0bWwjYm9vc3QuaGFzaF9jb21iaW5lCisgICAgLy8gTWFnaWMgdmFsdWUgaXMgMl5zaXplIC8gKCgxLXNxcnQoNSkvMikKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga01hZ2ljID0gc2l6ZW9mKEtleSkgPiA0ID8gS2V5KDB4OWUzNzc5Yjk3ZjRhN2MxNlVMKSA6IEtleSgweDllMzc3OWI5VSk7CisKKyAgICAvLyBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBoYXNoCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoZXIgPSBXcmFwcGVkSGFzaDxWYWx1ZT4+CisgICAgSGFzaENvbWJpbmVyICZDb21iaW5lKGNvbnN0IFZhbHVlICZ2YWx1ZSkgeworICAgICAgICBjb21iaW5lZF8gXj0gSGFzaGVyKCkodmFsdWUpICsga01hZ2ljICsgKGNvbWJpbmVkXyA8PCA2KSArIChjb21iaW5lZF8gPj4gMik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIEhhc2hlciA9IFdyYXBwZWRIYXNoPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4+CisgICAgSGFzaENvbWJpbmVyICZDb21iaW5lKEl0ZXJhdG9yIGZpcnN0LCBJdGVyYXRvciBlbmQpIHsKKyAgICAgICAgdXNpbmcgVmFsdWUgPSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU7CisgICAgICAgIGF1dG8gY3VycmVudCA9IGZpcnN0OworICAgICAgICBmb3IgKDsgY3VycmVudCAhPSBlbmQ7ICsrY3VycmVudCkgeworICAgICAgICAgICAgQ29tYmluZTxWYWx1ZSwgSGFzaGVyPigqY3VycmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaGVyID0gV3JhcHBlZEhhc2g8VmFsdWU+PgorICAgIEhhc2hDb21iaW5lciAmQ29tYmluZShjb25zdCBzdGQ6OnZlY3RvcjxWYWx1ZT4gJnZlY3RvcikgeworICAgICAgICByZXR1cm4gQ29tYmluZSh2ZWN0b3IuY2JlZ2luKCksIHZlY3Rvci5jZW5kKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KKyAgICBIYXNoQ29tYmluZXIgJm9wZXJhdG9yPDwoY29uc3QgVmFsdWUgJnZhbHVlKSB7CisgICAgICAgIHJldHVybiBDb21iaW5lKHZhbHVlKTsKKyAgICB9CisKKyAgICBLZXkgVmFsdWUoKSBjb25zdCB7IHJldHVybiBjb21iaW5lZF87IH0KKyAgICB2b2lkIFJlc2V0KEtleSBjb21iaW5lZCA9IDApIHsgY29tYmluZWRfID0gY29tYmluZWQ7IH0KKworICBwcml2YXRlOgorICAgIEtleSBjb21iaW5lZF87Cit9OworCisvLyBBIHRlbXBsYXRlIHRvIGluaGVyaXQgc3RkOjpoYXNoIG92ZXJsb2FkcyBmcm9tIHdoZW4gVDo6aGFzaCgpIGlzIGRlZmluZWQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEhhc0hhc2hNZW1iZXIgeworICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFQgJnZhbHVlKSBjb25zdCB7IHJldHVybiB2YWx1ZS5oYXNoKCk7IH0KK307CisKKy8vIEEgdGVtcGxhdGUgdG8gaW5oZXJpdCBzdGQ6Omhhc2ggb3ZlcmxvYWRzIGZyb20gd2hlbiBpcyBhbiAqb3JkZXJlZCogY29uc3RhaW5lcgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSXNPcmRlcmVkQ29udGFpbmVyIHsKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBUICZ2YWx1ZSkgY29uc3QgeyByZXR1cm4gSGFzaENvbWJpbmVyKCkuQ29tYmluZSh2YWx1ZS5jYmVnaW4oKSwgdmFsdWUuY2VuZCgpKS5WYWx1ZSgpOyB9Cit9OworCisvLyBUaGUgZGljdGlvbmFyeSBwcm92aWRlcyBhIHdheSBvZiByZWZlcmVuY2luZyBjYW5vbmljYWwvcmVmZXJlbmNlCisvLyBkYXRhIGJ5IGlkLCBzdWNoIHRoYXQgdGhlIGlkJ3MgYXJlIGludmFyaWFudCB3aXRoIGRpY3Rpb25hcnkKKy8vIHJlc2l6ZS9pbnNlcnQgYW5kIHRoYXQgbm8gZW50cmllcyBwb2ludCB0byBpZGVudGljYWwgZGF0YS4gIFRoaXMKKy8vIGFwcHJvYWNoIHVzZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHVuaXF1ZSBkYXRhIGFuZCBhcyB0aGUgdW5pcXVlCisvLyAgSUQgIGZvciBhIGdpdmUgdmFsdWUgb2YgVC4KKy8vCisvLyBOb3RlOiBUaGlzIElEIGlzIHVuaXF1ZSBmb3IgYSBnaXZlbiBhcHBsaWNhdGlvbiBleGVjdXRpb24sIG5laXRoZXIKKy8vICAgICAgIGdsb2JhbGx5IHVuaXF1ZSwgaW52YXJpYW50LCBub3IgcmVwZWF0YWJsZSBmcm9tIGV4ZWN1dGlvbiB0bworLy8gICAgICAgZXhlY3V0aW9uLgorLy8KKy8vIFRoZSBlbnRyaWVzIG9mIHRoZSBkaWN0aW9uYXJ5IGFyZSBzaGFyZWRfcG9pbnRlcnMgKHRoZSBjb250ZW50cyBvZgorLy8gd2hpY2ggYXJlIGludmFyaWFudCB3aXRoIHJlc2l6ZS9pbnNlcnQpLCB3aXRoIHRoZSBoYXNoIGFuZCBlcXVhbGl0eQorLy8gdGVtcGxhdGUgYXJndW1lbnRzIHdyYXBwZWQgaW4gYSBzaGFyZWQgcG9pbnRlciBkZXJlZmVyZW5jaW5nCisvLyBmdW5jdGlvbiBvYmplY3QKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBIYXNoZXIgPSBzdGQ6Omhhc2g8VD4sIHR5cGVuYW1lIEtleUVxdWFsID0gc3RkOjplcXVhbF90bzxUPj4KK2NsYXNzIERpY3Rpb25hcnkgeworICBwdWJsaWM6CisgICAgdXNpbmcgRGVmID0gVDsKKyAgICB1c2luZyBJZCA9IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBEZWY+OworCisgICAgLy8gRmluZCB0aGUgdW5pcXVlIGVudHJ5IG1hdGNoIHRoZSBwcm92aWRlZCB2YWx1ZSwgYWRkaW5nIGlmIG5lZWRlZAorICAgIC8vIFRPRE86IHNlZ3JlZ2F0ZSBsb29rdXAgZnJvbSBpbnNlcnQsIHVzaW5nIHJlYWRlci93cml0ZSBsb2NrcyB0byByZWR1Y2UgY29udGVudGlvbiAtLSBpZiBuZWVkZWQKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSA9IFQ+CisgICAgSWQgbG9va191cChVICYmdmFsdWUpIHsKKyAgICAgICAgLy8gV2UgY3JlYXRlIGFuIElkIGZyb20gdGhlIHZhbHVlLCB3aGljaCB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBieSBkaWN0IChpZiBuZXcpIG9yIGRlbGV0ZWQgb24gcmV0dXJuIChpZiBleHRhbnQpCisgICAgICAgIElkIGZyb21faW5wdXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFQ+KHN0ZDo6Zm9yd2FyZDxVPih2YWx1ZSkpOworCisgICAgICAgIC8vIEluc2VydCB0YWtlcyBjYXJlIG9mIHRoZSAidW5pcXVlIiBpZCBwYXJ0IGJ5IHJlamVjdGluZyB0aGUgaW5zZXJ0IGlmIGEga2V5IG1hdGNoaW5nIGJ5X3ZhbHVlIGV4aXN0cywgYnV0IHJldHVybmluZyB1cworICAgICAgICAvLyB0aGUgSWQgb2YgdGhlIGV4dGFudCBzaGFyZWRfcG9pbnRlcihpZC0+ZGVmKSBpbnN0ZWFkLgorICAgICAgICAvLyByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBJdGVyYXRvciBmcm9tIHRoZSA8SXRlcmF0b3IsIGJvb2w+IHBhaXIgcmV0dXJuZWQgYnkgaW5zZXJ0CisgICAgICAgIEd1YXJkIGcobG9jayk7ICAvLyBEaWN0IGlzbid0IHRocmVhZCBzYWZlLCBhbmQgdXNlIGlzIHByZXN1bWVkIHRvIGJlIG11bHRpLXRocmVhZGVkCisgICAgICAgIHJldHVybiAqZGljdC5pbnNlcnQoZnJvbV9pbnB1dCkuZmlyc3Q7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RydWN0IEhhc2hLZXlWYWx1ZSB7CisgICAgICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IElkICZ2YWx1ZSkgY29uc3QgeyByZXR1cm4gSGFzaGVyKCkoKnZhbHVlKTsgfQorICAgIH07CisgICAgc3RydWN0IEtleVZhbHVlRXF1YWwgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgSWQgJmxocywgY29uc3QgSWQgJnJocykgY29uc3QgeyByZXR1cm4gS2V5RXF1YWwoKSgqbGhzLCAqcmhzKTsgfQorICAgIH07CisgICAgdXNpbmcgRGljdCA9IHN0ZDo6dW5vcmRlcmVkX3NldDxJZCwgSGFzaEtleVZhbHVlLCBLZXlWYWx1ZUVxdWFsPjsKKyAgICB1c2luZyBMb2NrID0gc3RkOjptdXRleDsKKyAgICB1c2luZyBHdWFyZCA9IHN0ZDo6bG9ja19ndWFyZDxMb2NrPjsKKyAgICBMb2NrIGxvY2s7CisgICAgRGljdCBkaWN0OworfTsKK30gIC8vIG5hbWVzcGFjZSBoYXNoX3V0aWwKKworI2VuZGlmICAvLyBIQVNIX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvaGFzaF92a190eXBlcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2hhc2hfdmtfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg1ODg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2hhc2hfdmtfdHlwZXMuaApAQCAtMCwwICsxLDEwMiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9obiBadWxhdWYgPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqLworI2lmbmRlZiBIQVNIX1ZLX1RZUEVTX0hfCisjZGVmaW5lIEhBU0hfVktfVFlQRVNfSF8KKworLy8gSW5jbHVkZXMgZXZlcnl0aGluZyBuZWVkZWQgZm9yIG92ZXJsb2FkaW5nIHN0ZDo6aGFzaAorI2luY2x1ZGUgImhhc2hfdXRpbC5oIgorCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorI2luY2x1ZGUgInZrX3NhZmVfc3RydWN0LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBIYXNoIGFuZCBlcXVhbGl0eSBhbmQvb3IgY29tcGFyZSBmdW5jdGlvbnMgZm9yIHNlbGVjdGVkIFZrIHR5cGVzIChhbmQgdXNlZnVsIGNvbGxlY3Rpb25zIHRoZXJlb2YpCisKKy8vIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcKK3N0YXRpYyBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nICZsaHMsIGNvbnN0IHNhZmVfVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyAmcmhzKSB7CisgICAgaWYgKChsaHMuYmluZGluZyAhPSByaHMuYmluZGluZykgfHwgKGxocy5kZXNjcmlwdG9yVHlwZSAhPSByaHMuZGVzY3JpcHRvclR5cGUpIHx8CisgICAgICAgIChsaHMuZGVzY3JpcHRvckNvdW50ICE9IHJocy5kZXNjcmlwdG9yQ291bnQpIHx8IChsaHMuc3RhZ2VGbGFncyAhPSByaHMuc3RhZ2VGbGFncykgfHwKKyAgICAgICAgIWhhc2hfdXRpbDo6c2ltaWxhcl9mb3JfbnVsbGl0eShsaHMucEltbXV0YWJsZVNhbXBsZXJzLCByaHMucEltbXV0YWJsZVNhbXBsZXJzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChsaHMucEltbXV0YWJsZVNhbXBsZXJzKSB7ICAvLyBlaXRoZXIgb25lIHdpbGwgZG8gYXMgdGhleSAqYXJlKiBzaW1pbGFyIGZvciBudWxsaXR5IChpLmUuIGVpdGhlciBib3RoIG51bGwgb3IgYm90aCBub24tbnVsbCkKKyAgICAgICAgZm9yICh1aW50MzJfdCBzYW1wID0gMDsgc2FtcCA8IGxocy5kZXNjcmlwdG9yQ291bnQ7IHNhbXArKykgeworICAgICAgICAgICAgaWYgKGxocy5wSW1tdXRhYmxlU2FtcGxlcnNbc2FtcF0gIT0gcmhzLnBJbW11dGFibGVTYW1wbGVyc1tzYW1wXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8c2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiB7CisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc2FmZV9Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nICZ2YWx1ZSkgY29uc3QgeworICAgICAgICBoYXNoX3V0aWw6Okhhc2hDb21iaW5lciBoYzsKKyAgICAgICAgaGMgPDwgdmFsdWUuYmluZGluZyA8PCB2YWx1ZS5kZXNjcmlwdG9yVHlwZSA8PCB2YWx1ZS5kZXNjcmlwdG9yQ291bnQgPDwgdmFsdWUuc3RhZ2VGbGFnczsKKyAgICAgICAgaWYgKHZhbHVlLnBJbW11dGFibGVTYW1wbGVycykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBzYW1wID0gMDsgc2FtcCA8IHZhbHVlLmRlc2NyaXB0b3JDb3VudDsgc2FtcCsrKSB7CisgICAgICAgICAgICAgICAgaGMgPDwgdmFsdWUucEltbXV0YWJsZVNhbXBsZXJzW3NhbXBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBoYy5WYWx1ZSgpOworICAgIH0KK307Cit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKy8vIFZrUHVzaENvbnN0YW50UmFuZ2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZrUHVzaENvbnN0YW50UmFuZ2UgJmxocywgY29uc3QgVmtQdXNoQ29uc3RhbnRSYW5nZSAmcmhzKSB7CisgICAgcmV0dXJuIChsaHMuc3RhZ2VGbGFncyA9PSByaHMuc3RhZ2VGbGFncykgJiYgKGxocy5vZmZzZXQgPT0gcmhzLm9mZnNldCkgJiYgKGxocy5zaXplID09IHJocy5zaXplKTsKK30KKworbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8VmtQdXNoQ29uc3RhbnRSYW5nZT4geworICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFZrUHVzaENvbnN0YW50UmFuZ2UgJnZhbHVlKSBjb25zdCB7CisgICAgICAgIGhhc2hfdXRpbDo6SGFzaENvbWJpbmVyIGhjOworICAgICAgICByZXR1cm4gKGhjIDw8IHZhbHVlLnN0YWdlRmxhZ3MgPDwgdmFsdWUub2Zmc2V0IDw8IHZhbHVlLnNpemUpLlZhbHVlKCk7CisgICAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBzdGQKKwordXNpbmcgUHVzaENvbnN0YW50UmFuZ2VzID0gc3RkOjp2ZWN0b3I8VmtQdXNoQ29uc3RhbnRSYW5nZT47CisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4KK3N0cnVjdCBoYXNoPFB1c2hDb25zdGFudFJhbmdlcz4gOiBwdWJsaWMgaGFzaF91dGlsOjpJc09yZGVyZWRDb250YWluZXI8UHVzaENvbnN0YW50UmFuZ2VzPiB7fTsKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworLy8gVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UKK3N0YXRpYyBib29sIG9wZXJhdG9yPT0oY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJmxocywgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnJocykgeworICAgIHJldHVybiAobGhzLmFzcGVjdE1hc2sgPT0gcmhzLmFzcGVjdE1hc2spICYmIChsaHMuYmFzZU1pcExldmVsID09IHJocy5iYXNlTWlwTGV2ZWwpICYmIChsaHMubGV2ZWxDb3VudCA9PSByaHMubGV2ZWxDb3VudCkgJiYKKyAgICAgICAgICAgKGxocy5iYXNlQXJyYXlMYXllciA9PSByaHMuYmFzZUFycmF5TGF5ZXIpICYmIChsaHMubGF5ZXJDb3VudCA9PSByaHMubGF5ZXJDb3VudCk7Cit9CituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxWa0ltYWdlU3VicmVzb3VyY2VSYW5nZT4geworICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZ2YWx1ZSkgY29uc3QgeworICAgICAgICBoYXNoX3V0aWw6Okhhc2hDb21iaW5lciBoYzsKKyAgICAgICAgaGMgPDwgdmFsdWUuYXNwZWN0TWFzayA8PCB2YWx1ZS5iYXNlTWlwTGV2ZWwgPDwgdmFsdWUubGV2ZWxDb3VudCA8PCB2YWx1ZS5iYXNlQXJyYXlMYXllciA8PCB2YWx1ZS5sYXllckNvdW50OworICAgICAgICByZXR1cm4gaGMuVmFsdWUoKTsKKyAgICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgIC8vIEhBU0hfVktfVFlQRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9qc29uL1ZrTGF5ZXJfa2hyb25vc192YWxpZGF0aW9uLmpzb24uaW4gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvanNvbi9Wa0xheWVyX2tocm9ub3NfdmFsaWRhdGlvbi5qc29uLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTI0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvanNvbi9Wa0xheWVyX2tocm9ub3NfdmFsaWRhdGlvbi5qc29uLmluCkBAIC0wLDAgKzEsNDYgQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4xLjAiLAorICAgICJsYXllciIgOiB7CisgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0tIUk9OT1NfdmFsaWRhdGlvbiIsCisgICAgICAgICJ0eXBlIjogIkdMT0JBTCIsCisgICAgICAgICJsaWJyYXJ5X3BhdGgiOiAiQFJFTEFUSVZFX0xBWUVSX0JJTkFSWUAiLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiQFZLX1ZFUlNJT05AIiwKKyAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiAiMSIsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJLaHJvbm9zIFZhbGlkYXRpb24gTGF5ZXIiLAorICAgICAgICAiaW5zdGFuY2VfZXh0ZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICJuYW1lIjogIlZLX0VYVF9kZWJ1Z19yZXBvcnQiLAorICAgICAgICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjkiCisgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICJuYW1lIjogIlZLX0VYVF9kZWJ1Z191dGlscyIsCisgICAgICAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMSIKKyAgICAgICAgICAgICB9LAorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIm5hbWUiOiAiVktfRVhUX3ZhbGlkYXRpb25fZmVhdHVyZXMiLAorICAgICAgICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjIiCisgICAgICAgICAgICAgfQorICAgICAgICAgXSwKKyAgICAgICAgImRldmljZV9leHRlbnNpb25zIjogWworICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIm5hbWUiOiAiVktfRVhUX2RlYnVnX21hcmtlciIsCisgICAgICAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiNCIsCisgICAgICAgICAgICAgICAgICJlbnRyeXBvaW50cyI6IFsidmtEZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRGVidWdNYXJrZXJCZWdpbkVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREZWJ1Z01hcmtlckVuZEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREZWJ1Z01hcmtlckluc2VydEVYVCIKKyAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAibmFtZSI6ICJWS19FWFRfdmFsaWRhdGlvbl9jYWNoZSIsCisgICAgICAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMSIsCisgICAgICAgICAgICAgICAgICJlbnRyeXBvaW50cyI6IFsidmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ2a01lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVCIKKyAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICB9CisgICAgICAgICBdCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2pzb24vVmtMYXllcl9zdGFuZGFyZF92YWxpZGF0aW9uLmpzb24uaW4gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvanNvbi9Wa0xheWVyX3N0YW5kYXJkX3ZhbGlkYXRpb24uanNvbi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzAwNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2pzb24vVmtMYXllcl9zdGFuZGFyZF92YWxpZGF0aW9uLmpzb24uaW4KQEAgLTAsMCArMSwxMyBAQAoreworICAgICJmaWxlX2Zvcm1hdF92ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAibGF5ZXIiOiB7CisgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19zdGFuZGFyZF92YWxpZGF0aW9uIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImFwaV92ZXJzaW9uIjogIkBWS19WRVJTSU9OQCIsCisgICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogIjEiLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiTHVuYXJHIFN0YW5kYXJkIFZhbGlkYXRpb24iLAorICAgICAgICAiY29tcG9uZW50X2xheWVycyI6IFsKKyAgICAgICAgICAgICJWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24iCisgICAgICAgIF0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvbGliVmtMYXllcl9raHJvbm9zX3ZhbGlkYXRpb24ubWFwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2xpYlZrTGF5ZXJfa2hyb25vc192YWxpZGF0aW9uLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhhZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL2xpYlZrTGF5ZXJfa2hyb25vc192YWxpZGF0aW9uLm1hcApAQCAtMCwwICsxLDEwIEBACit7CisgIGdsb2JhbDoKKyAgICB2a0dldEluc3RhbmNlUHJvY0FkZHI7CisgICAgdmtHZXREZXZpY2VQcm9jQWRkcjsKKyAgICB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzOworICAgIHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworICAgIHZrTmVnb3RpYXRlTG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uOworICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9vYmplY3RfbGlmZXRpbWVfdmFsaWRhdGlvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL29iamVjdF9saWZldGltZV92YWxpZGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0YzZkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9vYmplY3RfbGlmZXRpbWVfdmFsaWRhdGlvbi5oCkBAIC0wLDAgKzEsMjc2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqLworCisvLyBTdXBwcmVzcyB1bnVzZWQgd2FybmluZyBvbiBMaW51eAorI2lmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIERFQ09SQVRFX1VOVVNFRCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UKKyNkZWZpbmUgREVDT1JBVEVfVU5VU0VECisjZW5kaWYKKworLy8gY2xhbmctZm9ybWF0IG9mZgorc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9PYmplY3RUcmFja2VyX0luZm8gPSAiVU5BU1NJR05FRC1PYmplY3RUcmFja2VyLUluZm8iOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9PYmplY3RUcmFja2VyX0ludGVybmFsRXJyb3IgPSAiVU5BU1NJR05FRC1PYmplY3RUcmFja2VyLUludGVybmFsRXJyb3IiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9PYmplY3RUcmFja2VyX09iamVjdExlYWsgPSAgICAiVU5BU1NJR05FRC1PYmplY3RUcmFja2VyLU9iamVjdExlYWsiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9PYmplY3RUcmFja2VyX1Vua25vd25PYmplY3QgPSAiVU5BU1NJR05FRC1PYmplY3RUcmFja2VyLVVua25vd25PYmplY3QiOworLy8gY2xhbmctZm9ybWF0IG9uCisKKyN1bmRlZiBERUNPUkFURV9VTlVTRUQKKworZXh0ZXJuIHVpbnQ2NF90IG9iamVjdF90cmFja19pbmRleDsKKworLy8gT2JqZWN0IFN0YXR1cyAtLSB1c2VkIHRvIHRyYWNrIHN0YXRlIG9mIGluZGl2aWR1YWwgb2JqZWN0cwordHlwZWRlZiBWa0ZsYWdzIE9iamVjdFN0YXR1c0ZsYWdzOworZW51bSBPYmplY3RTdGF0dXNGbGFnQml0cyB7CisgICAgT0JKU1RBVFVTX05PTkUgPSAweDAwMDAwMDAwLCAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzdGF0dXMgaXMgc2V0CisgICAgT0JKU1RBVFVTX0NPTU1BTkRfQlVGRkVSX1NFQ09OREFSWSA9IDB4MDAwMDAwMDEsICAvLyBDb21tYW5kIEJ1ZmZlciBpcyBvZiB0eXBlIFNFQ09OREFSWQorICAgIE9CSlNUQVRVU19DVVNUT01fQUxMT0NBVE9SID0gMHgwMDAwMDAwMiwgICAgICAgICAgLy8gQWxsb2NhdGVkIHdpdGggY3VzdG9tIGFsbG9jYXRvcgorfTsKKworLy8gT2JqZWN0IGFuZCBzdGF0ZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKK3N0cnVjdCBPYmpUcmFja1N0YXRlIHsKKyAgICB1aW50NjRfdCBoYW5kbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3QgaGFuZGxlIChuZXcpCisgICAgVnVsa2FuT2JqZWN0VHlwZSBvYmplY3RfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2JqZWN0IHR5cGUgaWRlbnRpZmllcgorICAgIE9iamVjdFN0YXR1c0ZsYWdzIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9iamVjdCBzdGF0ZQorICAgIHVpbnQ2NF90IHBhcmVudF9vYmplY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCBvYmplY3QKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQ2NF90PiA+IGNoaWxkX29iamVjdHM7ICAvLyBDaGlsZCBvYmplY3RzICh1c2VkIGZvciBWa0Rlc2NyaXB0b3JQb29sIG9ubHkpCit9OworCit0eXBlZGVmIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcDx1aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPE9ialRyYWNrU3RhdGU+LCA2PiBvYmplY3RfbWFwX3R5cGU7CisKK2NsYXNzIE9iamVjdExpZmV0aW1lcyA6IHB1YmxpYyBWYWxpZGF0aW9uT2JqZWN0IHsKKyAgcHVibGljOgorICAgIC8vIE92ZXJyaWRlIGNoYXNzaXMgcmVhZC93cml0ZSBsb2NrcyBmb3IgdGhpcyB2YWxpZGF0aW9uIG9iamVjdAorICAgIC8vIFRoaXMgb3ZlcnJpZGUgdGFrZXMgYSBkZWZlcnJlZCBsb2NrLiBpLmUuIGl0IGlzIG5vdCBhY3F1aXJlZC4KKyAgICAvLyBUaGlzIGNsYXNzIGRvZXMgaXRzIG93biBsb2NraW5nIHdpdGggYSBzaGFyZWQgbXV0ZXguCisgICAgdmlydHVhbCByZWFkX2xvY2tfZ3VhcmRfdCByZWFkX2xvY2soKSB7IHJldHVybiByZWFkX2xvY2tfZ3VhcmRfdCh2YWxpZGF0aW9uX29iamVjdF9tdXRleCwgc3RkOjpkZWZlcl9sb2NrKTsgfQorICAgIHZpcnR1YWwgd3JpdGVfbG9ja19ndWFyZF90IHdyaXRlX2xvY2soKSB7IHJldHVybiB3cml0ZV9sb2NrX2d1YXJkX3QodmFsaWRhdGlvbl9vYmplY3RfbXV0ZXgsIHN0ZDo6ZGVmZXJfbG9jayk7IH0KKworICAgIG11dGFibGUgUmVhZFdyaXRlTG9jayBvYmplY3RfbGlmZXRpbWVfbXV0ZXg7CisgICAgd3JpdGVfbG9ja19ndWFyZF90IHdyaXRlX3NoYXJlZF9sb2NrKCkgeyByZXR1cm4gd3JpdGVfbG9ja19ndWFyZF90KG9iamVjdF9saWZldGltZV9tdXRleCk7IH0KKyAgICByZWFkX2xvY2tfZ3VhcmRfdCByZWFkX3NoYXJlZF9sb2NrKCkgY29uc3QgeyByZXR1cm4gcmVhZF9sb2NrX2d1YXJkX3Qob2JqZWN0X2xpZmV0aW1lX211dGV4KTsgfQorCisgICAgc3RkOjphdG9taWM8dWludDY0X3Q+IG51bV9vYmplY3RzW2tWdWxrYW5PYmplY3RUeXBlTWF4ICsgMV07CisgICAgc3RkOjphdG9taWM8dWludDY0X3Q+IG51bV90b3RhbF9vYmplY3RzOworICAgIC8vIFZlY3RvciBvZiB1bm9yZGVyZWRfbWFwcyBwZXIgb2JqZWN0IHR5cGUgdG8gaG9sZCBPYmpUcmFja1N0YXRlIGluZm8KKyAgICBvYmplY3RfbWFwX3R5cGUgb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZU1heCArIDFdOworICAgIC8vIFNwZWNpYWwtY2FzZSBtYXAgZm9yIHN3YXBjaGFpbiBpbWFnZXMKKyAgICBvYmplY3RfbWFwX3R5cGUgc3dhcGNoYWluSW1hZ2VNYXA7CisKKyAgICAvLyBDb25zdHJ1Y3RvciBmb3Igb2JqZWN0IGxpZmV0aW1lIHRyYWNraW5nCisgICAgT2JqZWN0TGlmZXRpbWVzKCkgOiBudW1fb2JqZWN0c3t9LCBudW1fdG90YWxfb2JqZWN0cygwKSB7fQorCisgICAgdm9pZCBJbnNlcnRPYmplY3Qob2JqZWN0X21hcF90eXBlICZtYXAsIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUsIFZ1bGthbk9iamVjdFR5cGUgb2JqZWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE9ialRyYWNrU3RhdGU+IHBOb2RlKSB7CisgICAgICAgIGJvb2wgaW5zZXJ0ZWQgPSBtYXAuaW5zZXJ0KG9iamVjdF9oYW5kbGUsIHBOb2RlKTsKKyAgICAgICAgaWYgKCFpbnNlcnRlZCkgeworICAgICAgICAgICAgLy8gVGhlIG9iamVjdCBzaG91bGQgbm90IGFscmVhZHkgZXhpc3QuIElmIHdlIGNvdWxkbid0IGFkZCBpdCB0byB0aGUgbWFwLCB0aGVyZSB3YXMgcHJvYmFibHkKKyAgICAgICAgICAgIC8vIGEgcmFjZSBjb25kaXRpb24gaW4gdGhlIGFwcC4gUmVwb3J0IGFuIGVycm9yIGFuZCBtb3ZlIG9uLgorICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgZGVidWdfb2JqZWN0X3R5cGUgPSBnZXRfZGVidWdfcmVwb3J0X2VudW1bb2JqZWN0X3R5cGVdOworICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGRlYnVnX29iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLCBrVlVJRF9PYmplY3RUcmFja2VyX0luZm8sCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBpbnNlcnQgJXMgT2JqZWN0IDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgIiwgYWxyZWFkeSBleGlzdGVkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGFuZCBtYXkgaW5kaWNhdGUgYSAiCisgICAgICAgICAgICAgICAgICAgICJyYWNlIGNvbmRpdGlvbiBpbiB0aGUgYXBwbGljYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3N0cmluZ1tvYmplY3RfdHlwZV0sIG9iamVjdF9oYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBSZXBvcnRVbmRlc3Ryb3llZEluc3RhbmNlT2JqZWN0cyhWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBzdGQ6OnN0cmluZyAmZXJyb3JfY29kZSkgY29uc3Q7CisgICAgYm9vbCBSZXBvcnRVbmRlc3Ryb3llZERldmljZU9iamVjdHMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyAmZXJyb3JfY29kZSkgY29uc3Q7CisKKyAgICBib29sIFJlcG9ydExlYWtlZERldmljZU9iamVjdHMoVmtEZXZpY2UgZGV2aWNlLCBWdWxrYW5PYmplY3RUeXBlIG9iamVjdF90eXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmZXJyb3JfY29kZSkgY29uc3Q7CisgICAgYm9vbCBSZXBvcnRMZWFrZWRJbnN0YW5jZU9iamVjdHMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVnVsa2FuT2JqZWN0VHlwZSBvYmplY3RfdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmVycm9yX2NvZGUpIGNvbnN0OworCisgICAgdm9pZCBEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKFZ1bGthbk9iamVjdFR5cGUgb2JqZWN0X3R5cGUpOworCisgICAgdm9pZCBDcmVhdGVRdWV1ZShWa1F1ZXVlIHZrT2JqKTsKKyAgICB2b2lkIEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcihjb25zdCBWa0NvbW1hbmRQb29sIGNvbW1hbmRfcG9vbCwgY29uc3QgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyLCBWa0NvbW1hbmRCdWZmZXJMZXZlbCBsZXZlbCk7CisgICAgdm9pZCBBbGxvY2F0ZURlc2NyaXB0b3JTZXQoVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yX3Bvb2wsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldCk7CisgICAgdm9pZCBDcmVhdGVTd2FwY2hhaW5JbWFnZU9iamVjdChWa0ltYWdlIHN3YXBjaGFpbl9pbWFnZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKTsKKyAgICB2b2lkIERlc3Ryb3lMZWFrZWRJbnN0YW5jZU9iamVjdHMoKTsKKyAgICB2b2lkIERlc3Ryb3lMZWFrZWREZXZpY2VPYmplY3RzKCk7CisgICAgYm9vbCBWYWxpZGF0ZURldmljZU9iamVjdChjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmZGV2aWNlX3R5cGVkLCBjb25zdCBjaGFyICppbnZhbGlkX2hhbmRsZV9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd3JvbmdfZGV2aWNlX2NvZGUpIGNvbnN0OworICAgIHZvaWQgRGVzdHJveVF1ZXVlRGF0YVN0cnVjdHVyZXMoKTsKKyAgICBib29sIFZhbGlkYXRlQ29tbWFuZEJ1ZmZlcihWa0NvbW1hbmRQb29sIGNvbW1hbmRfcG9vbCwgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlRGVzY3JpcHRvclNldChWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JfcG9vbCwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlU2FtcGxlck9iamVjdHMoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVEZXNjcmlwdG9yV3JpdGUoVmtXcml0ZURlc2NyaXB0b3JTZXQgY29uc3QgKmRlc2MsIGJvb2wgaXNQdXNoKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlQW5vbnltb3VzT2JqZWN0KHVpbnQ2NF90IG9iamVjdCwgVmtPYmplY3RUeXBlIGNvcmVfb2JqZWN0X3R5cGUsIGJvb2wgbnVsbF9hbGxvd2VkLCBjb25zdCBjaGFyICppbnZhbGlkX2hhbmRsZV9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd3JvbmdfZGV2aWNlX2NvZGUpIGNvbnN0OworCisgICAgT2JqZWN0TGlmZXRpbWVzICpHZXRPYmplY3RMaWZldGltZURhdGEoc3RkOjp2ZWN0b3I8VmFsaWRhdGlvbk9iamVjdCAqPiAmb2JqZWN0X2Rpc3BhdGNoKSBjb25zdCB7CisgICAgICAgIGZvciAoYXV0byBsYXllcl9vYmplY3QgOiBvYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgICAgIGlmIChsYXllcl9vYmplY3QtPmNvbnRhaW5lcl90eXBlID09IExheWVyT2JqZWN0VHlwZU9iamVjdFRyYWNrZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8T2JqZWN0TGlmZXRpbWVzICo+KGxheWVyX29iamVjdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH07CisKKyAgICBib29sIENoZWNrT2JqZWN0VmFsaWRpdHkodWludDY0X3Qgb2JqZWN0X2hhbmRsZSwgVnVsa2FuT2JqZWN0VHlwZSBvYmplY3RfdHlwZSwgYm9vbCBudWxsX2FsbG93ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmludmFsaWRfaGFuZGxlX2NvZGUsIGNvbnN0IGNoYXIgKndyb25nX2RldmljZV9jb2RlKSBjb25zdCB7CisgICAgICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGRlYnVnX29iamVjdF90eXBlID0gZ2V0X2RlYnVnX3JlcG9ydF9lbnVtW29iamVjdF90eXBlXTsKKworICAgICAgICAvLyBMb29rIGZvciBvYmplY3QgaW4gb2JqZWN0IG1hcAorICAgICAgICBpZiAoIW9iamVjdF9tYXBbb2JqZWN0X3R5cGVdLmNvbnRhaW5zKG9iamVjdF9oYW5kbGUpKSB7CisgICAgICAgICAgICAvLyBJZiBvYmplY3QgaXMgYW4gaW1hZ2UsIGFsc28gbG9vayBmb3IgaXQgaW4gdGhlIHN3YXBjaGFpbiBpbWFnZSBtYXAKKyAgICAgICAgICAgIGlmICgob2JqZWN0X3R5cGUgIT0ga1Z1bGthbk9iamVjdFR5cGVJbWFnZSkgfHwgKHN3YXBjaGFpbkltYWdlTWFwLmZpbmQob2JqZWN0X2hhbmRsZSkgPT0gc3dhcGNoYWluSW1hZ2VNYXAuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZCwgbG9vayBmb3IgaXQgaW4gb3RoZXIgZGV2aWNlIG9iamVjdCBtYXBzCisgICAgICAgICAgICAgICAgZm9yIChhdXRvIG90aGVyX2RldmljZV9kYXRhIDogbGF5ZXJfZGF0YV9tYXApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGxheWVyX29iamVjdF9kYXRhIDogb3RoZXJfZGV2aWNlX2RhdGEuc2Vjb25kLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXllcl9vYmplY3RfZGF0YS0+Y29udGFpbmVyX3R5cGUgPT0gTGF5ZXJPYmplY3RUeXBlT2JqZWN0VHJhY2tlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gb2JqZWN0X2xpZmV0aW1lX2RhdGEgPSByZWludGVycHJldF9jYXN0PE9iamVjdExpZmV0aW1lcyAqPihsYXllcl9vYmplY3RfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdF9saWZldGltZV9kYXRhICYmIChvYmplY3RfbGlmZXRpbWVfZGF0YSAhPSB0aGlzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0X2xpZmV0aW1lX2RhdGEtPm9iamVjdF9tYXBbb2JqZWN0X3R5cGVdLmZpbmQob2JqZWN0X2hhbmRsZSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfbGlmZXRpbWVfZGF0YS0+b2JqZWN0X21hcFtvYmplY3RfdHlwZV0uZW5kKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3RfdHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZUltYWdlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2xpZmV0aW1lX2RhdGEtPnN3YXBjaGFpbkltYWdlTWFwLmZpbmQob2JqZWN0X2hhbmRsZSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2xpZmV0aW1lX2RhdGEtPnN3YXBjaGFpbkltYWdlTWFwLmVuZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2JqZWN0IGZvdW5kIG9uIG90aGVyIGRldmljZSwgcmVwb3J0IGFuIGVycm9yIGlmIG9iamVjdCBoYXMgYSBkZXZpY2UgcGFyZW50IGVycm9yIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod3JvbmdfZGV2aWNlX2NvZGUgIT0ga1ZVSURVbmRlZmluZWQpICYmIChvYmplY3RfdHlwZSAhPSBrVnVsa2FuT2JqZWN0VHlwZVN1cmZhY2VLSFIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBkZWJ1Z19vYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cm9uZ19kZXZpY2VfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0IDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdhcyBub3QgY3JlYXRlZCwgYWxsb2NhdGVkIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBjb3JyZWN0IGRldmljZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUmVwb3J0IGFuIGVycm9yIGlmIG9iamVjdCB3YXMgbm90IGZvdW5kIGFueXdoZXJlCisgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBkZWJ1Z19vYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwgaW52YWxpZF9oYW5kbGVfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCAlcyBPYmplY3QgMHglIiBQUkl4TEVBU1Q2NCAiLiIsIG9iamVjdF9zdHJpbmdbb2JqZWN0X3R5cGVdLCBvYmplY3RfaGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorICAgIGJvb2wgVmFsaWRhdGVPYmplY3QoVDEgb2JqZWN0LCBWdWxrYW5PYmplY3RUeXBlIG9iamVjdF90eXBlLCBib29sIG51bGxfYWxsb3dlZCwgY29uc3QgY2hhciAqaW52YWxpZF9oYW5kbGVfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKndyb25nX2RldmljZV9jb2RlKSBjb25zdCB7CisgICAgICAgIGlmIChudWxsX2FsbG93ZWQgJiYgKG9iamVjdCA9PSBWS19OVUxMX0hBTkRMRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIG9iamVjdF9oYW5kbGUgPSBIYW5kbGVUb1VpbnQ2NChvYmplY3QpOworCisgICAgICAgIGlmIChvYmplY3RfdHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZURldmljZSkgeworICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRlRGV2aWNlT2JqZWN0KFZ1bGthblR5cGVkSGFuZGxlKG9iamVjdCwgb2JqZWN0X3R5cGUpLCBpbnZhbGlkX2hhbmRsZV9jb2RlLCB3cm9uZ19kZXZpY2VfY29kZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ2hlY2tPYmplY3RWYWxpZGl0eShvYmplY3RfaGFuZGxlLCBvYmplY3RfdHlwZSwgbnVsbF9hbGxvd2VkLCBpbnZhbGlkX2hhbmRsZV9jb2RlLCB3cm9uZ19kZXZpY2VfY29kZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorICAgIHZvaWQgQ3JlYXRlT2JqZWN0KFQxIG9iamVjdCwgVnVsa2FuT2JqZWN0VHlwZSBvYmplY3RfdHlwZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgICAgIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUgPSBIYW5kbGVUb1VpbnQ2NChvYmplY3QpOworICAgICAgICBib29sIGN1c3RvbV9hbGxvY2F0b3IgPSAocEFsbG9jYXRvciAhPSBudWxscHRyKTsKKyAgICAgICAgaWYgKCFvYmplY3RfbWFwW29iamVjdF90eXBlXS5jb250YWlucyhvYmplY3RfaGFuZGxlKSkgeworICAgICAgICAgICAgYXV0byBwTmV3T2JqTm9kZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8T2JqVHJhY2tTdGF0ZT4oKTsKKyAgICAgICAgICAgIHBOZXdPYmpOb2RlLT5vYmplY3RfdHlwZSA9IG9iamVjdF90eXBlOworICAgICAgICAgICAgcE5ld09iak5vZGUtPnN0YXR1cyA9IGN1c3RvbV9hbGxvY2F0b3IgPyBPQkpTVEFUVVNfQ1VTVE9NX0FMTE9DQVRPUiA6IE9CSlNUQVRVU19OT05FOworICAgICAgICAgICAgcE5ld09iak5vZGUtPmhhbmRsZSA9IG9iamVjdF9oYW5kbGU7CisKKyAgICAgICAgICAgIEluc2VydE9iamVjdChvYmplY3RfbWFwW29iamVjdF90eXBlXSwgb2JqZWN0X2hhbmRsZSwgb2JqZWN0X3R5cGUsIHBOZXdPYmpOb2RlKTsKKyAgICAgICAgICAgIG51bV9vYmplY3RzW29iamVjdF90eXBlXSsrOworICAgICAgICAgICAgbnVtX3RvdGFsX29iamVjdHMrKzsKKworICAgICAgICAgICAgaWYgKG9iamVjdF90eXBlID09IGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wpIHsKKyAgICAgICAgICAgICAgICBwTmV3T2JqTm9kZS0+Y2hpbGRfb2JqZWN0cy5yZXNldChuZXcgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQ2NF90Pik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CisgICAgdm9pZCBEZXN0cm95T2JqZWN0U2lsZW50bHkoVDEgb2JqZWN0LCBWdWxrYW5PYmplY3RUeXBlIG9iamVjdF90eXBlKSB7CisgICAgICAgIGF1dG8gb2JqZWN0X2hhbmRsZSA9IEhhbmRsZVRvVWludDY0KG9iamVjdCk7CisgICAgICAgIGFzc2VydChvYmplY3RfaGFuZGxlICE9IFZLX05VTExfSEFORExFKTsKKworICAgICAgICBhdXRvIGl0ZW0gPSBvYmplY3RfbWFwW29iamVjdF90eXBlXS5wb3Aob2JqZWN0X2hhbmRsZSk7CisgICAgICAgIGlmIChpdGVtID09IG9iamVjdF9tYXBbb2JqZWN0X3R5cGVdLmVuZCgpKSB7CisgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgb2JqZWN0IGV4aXN0cy4gSWYgd2UgY291bGRuJ3QgZmluZCBhbmQgYXRvbWljYWxseSByZW1vdmUgaXQKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIG1hcCwgdGhlcmUgbXVzdCBoYXZlIGJlZW4gYSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgYXBwLiBSZXBvcnQgYW4gZXJyb3IgYW5kIG1vdmUgb24uCisgICAgICAgICAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBkZWJ1Z19vYmplY3RfdHlwZSA9IGdldF9kZWJ1Z19yZXBvcnRfZW51bVtvYmplY3RfdHlwZV07CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZGVidWdfb2JqZWN0X3R5cGUsIG9iamVjdF9oYW5kbGUsIGtWVUlEX09iamVjdFRyYWNrZXJfSW5mbywKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGRlc3Ryb3kgJXMgT2JqZWN0IDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgIiwgbm90IGZvdW5kLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGFuZCBtYXkgaW5kaWNhdGUgYSAiCisgICAgICAgICAgICAgICAgICAgICJyYWNlIGNvbmRpdGlvbiBpbiB0aGUgYXBwbGljYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3N0cmluZ1tvYmplY3RfdHlwZV0sIG9iamVjdF9oYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydChudW1fdG90YWxfb2JqZWN0cyA+IDApOworCisgICAgICAgIG51bV90b3RhbF9vYmplY3RzLS07CisgICAgICAgIGFzc2VydChudW1fb2JqZWN0c1tpdGVtLT5zZWNvbmQtPm9iamVjdF90eXBlXSA+IDApOworCisgICAgICAgIG51bV9vYmplY3RzW2l0ZW0tPnNlY29uZC0+b2JqZWN0X3R5cGVdLS07CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorICAgIHZvaWQgUmVjb3JkRGVzdHJveU9iamVjdChUMSBvYmplY3QsIFZ1bGthbk9iamVjdFR5cGUgb2JqZWN0X3R5cGUpIHsKKyAgICAgICAgYXV0byBvYmplY3RfaGFuZGxlID0gSGFuZGxlVG9VaW50NjQob2JqZWN0KTsKKyAgICAgICAgaWYgKG9iamVjdF9oYW5kbGUgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIGlmIChvYmplY3RfbWFwW29iamVjdF90eXBlXS5jb250YWlucyhvYmplY3RfaGFuZGxlKSkgeworICAgICAgICAgICAgICAgIERlc3Ryb3lPYmplY3RTaWxlbnRseShvYmplY3QsIG9iamVjdF90eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KKyAgICBib29sIFZhbGlkYXRlRGVzdHJveU9iamVjdChUMSBvYmplY3QsIFZ1bGthbk9iamVjdFR5cGUgb2JqZWN0X3R5cGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHBlY3RlZF9jdXN0b21fYWxsb2NhdG9yX2NvZGUsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2RlZmF1bHRfYWxsb2NhdG9yX2NvZGUpIGNvbnN0IHsKKyAgICAgICAgYXV0byBvYmplY3RfaGFuZGxlID0gSGFuZGxlVG9VaW50NjQob2JqZWN0KTsKKyAgICAgICAgYm9vbCBjdXN0b21fYWxsb2NhdG9yID0gcEFsbG9jYXRvciAhPSBudWxscHRyOworICAgICAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBkZWJ1Z19vYmplY3RfdHlwZSA9IGdldF9kZWJ1Z19yZXBvcnRfZW51bVtvYmplY3RfdHlwZV07CisgICAgICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgICAgIGlmICgoZXhwZWN0ZWRfY3VzdG9tX2FsbG9jYXRvcl9jb2RlICE9IGtWVUlEVW5kZWZpbmVkIHx8IGV4cGVjdGVkX2RlZmF1bHRfYWxsb2NhdG9yX2NvZGUgIT0ga1ZVSURVbmRlZmluZWQpICYmCisgICAgICAgICAgICBvYmplY3RfaGFuZGxlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICBhdXRvIGl0ZW0gPSBvYmplY3RfbWFwW29iamVjdF90eXBlXS5maW5kKG9iamVjdF9oYW5kbGUpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gb2JqZWN0X21hcFtvYmplY3RfdHlwZV0uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFsbG9jYXRlZF93aXRoX2N1c3RvbSA9IChpdGVtLT5zZWNvbmQtPnN0YXR1cyAmIE9CSlNUQVRVU19DVVNUT01fQUxMT0NBVE9SKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdGVkX3dpdGhfY3VzdG9tICYmICFjdXN0b21fYWxsb2NhdG9yICYmIGV4cGVjdGVkX2N1c3RvbV9hbGxvY2F0b3JfY29kZSAhPSBrVlVJRFVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIG9ubHkgdmVyaWZpZXMgdGhhdCBjdXN0b20gYWxsb2NhdGlvbiBjYWxsYmFja3Mgd2VyZSBwcm92aWRlZCB0byBib3RoIENyZWF0ZSBhbmQgRGVzdHJveSBjYWxscywKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgY2Fubm90IHZlcmlmeSB0aGF0IHRoZXNlIGFsbG9jYXRpb24gY2FsbGJhY2tzIGFyZSBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlci4KKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZGVidWdfb2JqZWN0X3R5cGUsIG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9jdXN0b21fYWxsb2NhdG9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3VzdG9tIGFsbG9jYXRvciBub3Qgc3BlY2lmaWVkIHdoaWxlIGRlc3Ryb3lpbmcgJXMgb2JqIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNwZWNpZmllZCBhdCBjcmVhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3N0cmluZ1tvYmplY3RfdHlwZV0sIG9iamVjdF9oYW5kbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG9jYXRlZF93aXRoX2N1c3RvbSAmJiBjdXN0b21fYWxsb2NhdG9yICYmIGV4cGVjdGVkX2RlZmF1bHRfYWxsb2NhdG9yX2NvZGUgIT0ga1ZVSURVbmRlZmluZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZGVidWdfb2JqZWN0X3R5cGUsIG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9kZWZhdWx0X2FsbG9jYXRvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkN1c3RvbSBhbGxvY2F0b3Igc3BlY2lmaWVkIHdoaWxlIGRlc3Ryb3lpbmcgJXMgb2JqIDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYnV0IG5vdCBzcGVjaWZpZWQgYXQgY3JlYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9zdHJpbmdbb2JqZWN0X3R5cGVdLCBvYmplY3RfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNraXA7CisgICAgfQorCisjaW5jbHVkZSAib2JqZWN0X3RyYWNrZXIuaCIKK307CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvb2JqZWN0X3RyYWNrZXJfdXRpbHMuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL29iamVjdF90cmFja2VyX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODVhOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL29iamVjdF90cmFja2VyX3V0aWxzLmNwcApAQCAtMCwwICsxLDk0MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5AbHVuYXJnLmNvbT4KKyAqLworCisjaW5jbHVkZSAiY2hhc3Npcy5oIgorCisjaW5jbHVkZSAib2JqZWN0X2xpZmV0aW1lX3ZhbGlkYXRpb24uaCIKKwordWludDY0X3Qgb2JqZWN0X3RyYWNrX2luZGV4ID0gMDsKKworVnVsa2FuVHlwZWRIYW5kbGUgT2JqVHJhY2tTdGF0ZVR5cGVkSGFuZGxlKGNvbnN0IE9ialRyYWNrU3RhdGUgJnRyYWNrX3N0YXRlKSB7CisgICAgLy8gVE9ETzogVW5pZnkgVHlwZWQgSGFuZGxlIHJlcHJlc2VudGF0aW9uIChpLmUuIFZ1bGthblR5cGVkSGFuZGxlIGV2ZXJ5d2hlcmUgdGhlcmUgYXJlIGhhbmRsZS90eXBlIHBhaXJzKQorICAgIFZ1bGthblR5cGVkSGFuZGxlIHR5cGVkX2hhbmRsZTsKKyAgICB0eXBlZF9oYW5kbGUuaGFuZGxlID0gdHJhY2tfc3RhdGUuaGFuZGxlOworICAgIHR5cGVkX2hhbmRsZS50eXBlID0gdHJhY2tfc3RhdGUub2JqZWN0X3R5cGU7CisgICAgcmV0dXJuIHR5cGVkX2hhbmRsZTsKK30KKworLy8gRGVzdHJveSBtZW1SZWYgbGlzdHMgYW5kIGZyZWUgYWxsIG1lbW9yeQordm9pZCBPYmplY3RMaWZldGltZXM6OkRlc3Ryb3lRdWV1ZURhdGFTdHJ1Y3R1cmVzKCkgeworICAgIC8vIERlc3Ryb3kgdGhlIGl0ZW1zIGluIHRoZSBxdWV1ZSBtYXAKKyAgICBhdXRvIHNuYXBzaG90ID0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZVF1ZXVlXS5zbmFwc2hvdCgpOworICAgIGZvciAoY29uc3QgYXV0byAmcXVldWUgOiBzbmFwc2hvdCkgeworICAgICAgICB1aW50MzJfdCBvYmpfaW5kZXggPSBxdWV1ZS5zZWNvbmQtPm9iamVjdF90eXBlOworICAgICAgICBhc3NlcnQobnVtX3RvdGFsX29iamVjdHMgPiAwKTsKKyAgICAgICAgbnVtX3RvdGFsX29iamVjdHMtLTsKKyAgICAgICAgYXNzZXJ0KG51bV9vYmplY3RzW29ial9pbmRleF0gPiAwKTsKKyAgICAgICAgbnVtX29iamVjdHNbb2JqX2luZGV4XS0tOworICAgICAgICBvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlUXVldWVdLmVyYXNlKHF1ZXVlLmZpcnN0KTsKKyAgICB9Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpEZXN0cm95VW5kZXN0cm95ZWRPYmplY3RzKFZ1bGthbk9iamVjdFR5cGUgb2JqZWN0X3R5cGUpIHsKKyAgICBhdXRvIHNuYXBzaG90ID0gb2JqZWN0X21hcFtvYmplY3RfdHlwZV0uc25hcHNob3QoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiBzbmFwc2hvdCkgeworICAgICAgICBhdXRvIG9iamVjdF9pbmZvID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIERlc3Ryb3lPYmplY3RTaWxlbnRseShvYmplY3RfaW5mby0+aGFuZGxlLCBvYmplY3RfdHlwZSk7CisgICAgfQorfQorCisvLyBMb29rIGZvciB0aGlzIGRldmljZSBvYmplY3QgaW4gYW55IG9mIHRoZSBpbnN0YW5jZSBjaGlsZCBkZXZpY2VzIGxpc3RzLgorLy8gTk9URTogVGhpcyBpcyBvZiBkdWJpb3VzIHZhbHVlLiBJbiBtb3N0IGNpcmN1bXN0YW5jZXMgVnVsa2FuIHdpbGwgZGllIGEgZmxhbWluZyBkZWF0aCBpZiBhIGRpc3BhdGNoYWJsZSBvYmplY3QgaXMgaW52YWxpZC4KKy8vIEhvd2V2ZXIsIGlmIHRoaXMgbGF5ZXIgaXMgbG9hZGVkIGZpcnN0IGFuZCBHZXRQcm9jQWRkcmVzcyBpcyB1c2VkIHRvIG1ha2UgQVBJIGNhbGxzLCBpdCB3aWxsIGRldGVjdCBiYWQgRE9zLgorYm9vbCBPYmplY3RMaWZldGltZXM6OlZhbGlkYXRlRGV2aWNlT2JqZWN0KGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlICZkZXZpY2VfdHlwZWQsIGNvbnN0IGNoYXIgKmludmFsaWRfaGFuZGxlX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd3JvbmdfZGV2aWNlX2NvZGUpIGNvbnN0IHsKKyAgICBhdXRvIGluc3RhbmNlX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBhdXRvIGluc3RhbmNlX29iamVjdF9saWZldGltZV9kYXRhID0gR2V0T2JqZWN0TGlmZXRpbWVEYXRhKGluc3RhbmNlX2RhdGEtPm9iamVjdF9kaXNwYXRjaCk7CisgICAgaWYgKGluc3RhbmNlX29iamVjdF9saWZldGltZV9kYXRhLT5vYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlRGV2aWNlXS5jb250YWlucyhkZXZpY2VfdHlwZWQuaGFuZGxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIGRldmljZV90eXBlZC5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgaW52YWxpZF9oYW5kbGVfY29kZSwgIkludmFsaWQgJXMuIiwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShkZXZpY2VfdHlwZWQpLmNfc3RyKCkpOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6VmFsaWRhdGVBbm9ueW1vdXNPYmplY3QodWludDY0X3Qgb2JqZWN0X2hhbmRsZSwgVmtPYmplY3RUeXBlIGNvcmVfb2JqZWN0X3R5cGUsIGJvb2wgbnVsbF9hbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmludmFsaWRfaGFuZGxlX2NvZGUsIGNvbnN0IGNoYXIgKndyb25nX2RldmljZV9jb2RlKSBjb25zdCB7CisgICAgaWYgKG51bGxfYWxsb3dlZCAmJiAob2JqZWN0X2hhbmRsZSA9PSBWS19OVUxMX0hBTkRMRSkpIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIG9iamVjdF90eXBlID0gQ29udmVydENvcmVPYmplY3RUb1Z1bGthbk9iamVjdChjb3JlX29iamVjdF90eXBlKTsKKworICAgIGlmIChvYmplY3RfdHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZURldmljZSkgeworICAgICAgICByZXR1cm4gVmFsaWRhdGVEZXZpY2VPYmplY3QoVnVsa2FuVHlwZWRIYW5kbGUocmVpbnRlcnByZXRfY2FzdDxWa0RldmljZT4ob2JqZWN0X2hhbmRsZSksIG9iamVjdF90eXBlKSwgaW52YWxpZF9oYW5kbGVfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nX2RldmljZV9jb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIENoZWNrT2JqZWN0VmFsaWRpdHkob2JqZWN0X2hhbmRsZSwgb2JqZWN0X3R5cGUsIG51bGxfYWxsb3dlZCwgaW52YWxpZF9oYW5kbGVfY29kZSwgd3JvbmdfZGV2aWNlX2NvZGUpOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6QWxsb2NhdGVDb21tYW5kQnVmZmVyKGNvbnN0IFZrQ29tbWFuZFBvb2wgY29tbWFuZF9wb29sLCBjb25zdCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckxldmVsIGxldmVsKSB7CisgICAgYXV0byBwTmV3T2JqTm9kZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8T2JqVHJhY2tTdGF0ZT4oKTsKKyAgICBwTmV3T2JqTm9kZS0+b2JqZWN0X3R5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXI7CisgICAgcE5ld09iak5vZGUtPmhhbmRsZSA9IEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKTsKKyAgICBwTmV3T2JqTm9kZS0+cGFyZW50X29iamVjdCA9IEhhbmRsZVRvVWludDY0KGNvbW1hbmRfcG9vbCk7CisgICAgaWYgKGxldmVsID09IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSkgeworICAgICAgICBwTmV3T2JqTm9kZS0+c3RhdHVzID0gT0JKU1RBVFVTX0NPTU1BTkRfQlVGRkVSX1NFQ09OREFSWTsKKyAgICB9IGVsc2UgeworICAgICAgICBwTmV3T2JqTm9kZS0+c3RhdHVzID0gT0JKU1RBVFVTX05PTkU7CisgICAgfQorICAgIEluc2VydE9iamVjdChvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlcl0sIEhhbmRsZVRvVWludDY0KGNvbW1hbmRfYnVmZmVyKSwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICBwTmV3T2JqTm9kZSk7CisgICAgbnVtX29iamVjdHNba1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyXSsrOworICAgIG51bV90b3RhbF9vYmplY3RzKys7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpWYWxpZGF0ZUNvbW1hbmRCdWZmZXIoVmtDb21tYW5kUG9vbCBjb21tYW5kX3Bvb2wsIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUgPSBIYW5kbGVUb1VpbnQ2NChjb21tYW5kX2J1ZmZlcik7CisgICAgYXV0byBpdGVyID0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXJdLmZpbmQob2JqZWN0X2hhbmRsZSk7CisgICAgaWYgKGl0ZXIgIT0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXJdLmVuZCgpKSB7CisgICAgICAgIGF1dG8gcE5vZGUgPSBpdGVyLT5zZWNvbmQ7CisKKyAgICAgICAgaWYgKHBOb2RlLT5wYXJlbnRfb2JqZWN0ICE9IEhhbmRsZVRvVWludDY0KGNvbW1hbmRfcG9vbCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgcGFyZW50ICptdXN0KiBiZSBhIGNvbW1hbmQgcG9vbAorICAgICAgICAgICAgY29uc3QgYXV0byBwYXJlbnRfcG9vbCA9IENhc3RGcm9tVWludDY0PFZrQ29tbWFuZFBvb2w+KHBOb2RlLT5wYXJlbnRfb2JqZWN0KTsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2hhbmRsZSwgIlZVSUQtdmtGcmVlQ29tbWFuZEJ1ZmZlcnMtcENvbW1hbmRCdWZmZXJzLXBhcmVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyZWVDb21tYW5kQnVmZmVycyBpcyBhdHRlbXB0aW5nIHRvIGZyZWUgJXMgYmVsb25naW5nIHRvICVzIGZyb20gJXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShjb21tYW5kX2J1ZmZlcikuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwYXJlbnRfcG9vbCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGNvbW1hbmRfcG9vbCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtGcmVlQ29tbWFuZEJ1ZmZlcnMtcENvbW1hbmRCdWZmZXJzLTAwMDQ4IiwgIkludmFsaWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoY29tbWFuZF9idWZmZXIpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OkFsbG9jYXRlRGVzY3JpcHRvclNldChWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JfcG9vbCwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KSB7CisgICAgYXV0byBwTmV3T2JqTm9kZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8T2JqVHJhY2tTdGF0ZT4oKTsKKyAgICBwTmV3T2JqTm9kZS0+b2JqZWN0X3R5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQ7CisgICAgcE5ld09iak5vZGUtPnN0YXR1cyA9IE9CSlNUQVRVU19OT05FOworICAgIHBOZXdPYmpOb2RlLT5oYW5kbGUgPSBIYW5kbGVUb1VpbnQ2NChkZXNjcmlwdG9yX3NldCk7CisgICAgcE5ld09iak5vZGUtPnBhcmVudF9vYmplY3QgPSBIYW5kbGVUb1VpbnQ2NChkZXNjcmlwdG9yX3Bvb2wpOworICAgIEluc2VydE9iamVjdChvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldF0sIEhhbmRsZVRvVWludDY0KGRlc2NyaXB0b3Jfc2V0KSwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICBwTmV3T2JqTm9kZSk7CisgICAgbnVtX29iamVjdHNba1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0XSsrOworICAgIG51bV90b3RhbF9vYmplY3RzKys7CisKKyAgICBhdXRvIGl0ciA9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbF0uZmluZChIYW5kbGVUb1VpbnQ2NChkZXNjcmlwdG9yX3Bvb2wpKTsKKyAgICBpZiAoaXRyICE9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbF0uZW5kKCkpIHsKKyAgICAgICAgaXRyLT5zZWNvbmQtPmNoaWxkX29iamVjdHMtPmluc2VydChIYW5kbGVUb1VpbnQ2NChkZXNjcmlwdG9yX3NldCkpOworICAgIH0KK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlZhbGlkYXRlRGVzY3JpcHRvclNldChWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JfcG9vbCwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgdWludDY0X3Qgb2JqZWN0X2hhbmRsZSA9IEhhbmRsZVRvVWludDY0KGRlc2NyaXB0b3Jfc2V0KTsKKyAgICBhdXRvIGRzSXRlbSA9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0XS5maW5kKG9iamVjdF9oYW5kbGUpOworICAgIGlmIChkc0l0ZW0gIT0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXRdLmVuZCgpKSB7CisgICAgICAgIGlmIChkc0l0ZW0tPnNlY29uZC0+cGFyZW50X29iamVjdCAhPSBIYW5kbGVUb1VpbnQ2NChkZXNjcmlwdG9yX3Bvb2wpKSB7CisgICAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgdGhlIHBhcmVudCAqbXVzdCogYmUgYSBkZXNjcmlwdG9yIHBvb2wKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gcGFyZW50X3Bvb2wgPSBDYXN0RnJvbVVpbnQ2NDxWa0Rlc2NyaXB0b3JQb29sPihkc0l0ZW0tPnNlY29uZC0+cGFyZW50X29iamVjdCk7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9oYW5kbGUsICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy1wYXJlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmVlRGVzY3JpcHRvclNldHMgaXMgYXR0ZW1wdGluZyB0byBmcmVlICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmVsb25naW5nIHRvICVzIGZyb20gJXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShkZXNjcmlwdG9yX3NldCkuY19zdHIoKSwgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShwYXJlbnRfcG9vbCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGRlc2NyaXB0b3JfcG9vbCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhULCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtcERlc2NyaXB0b3JTZXRzLTAwMzEwIiwgIkludmFsaWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoZGVzY3JpcHRvcl9zZXQpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlZhbGlkYXRlRGVzY3JpcHRvcldyaXRlKFZrV3JpdGVEZXNjcmlwdG9yU2V0IGNvbnN0ICpkZXNjLCBib29sIGlzUHVzaCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKCFpc1B1c2ggJiYgZGVzYy0+ZHN0U2V0KSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGVzYy0+ZHN0U2V0LCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQsIGZhbHNlLCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kc3RTZXQtMDAzMjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWNvbW1vbnBhcmVudCIpOworICAgIH0KKworICAgIGlmICgoZGVzYy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSKSB8fAorICAgICAgICAoZGVzYy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSKSkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDIgPSAwOyBpZHgyIDwgZGVzYy0+ZGVzY3JpcHRvckNvdW50OyArK2lkeDIpIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGVzYy0+cFRleGVsQnVmZmVyVmlld1tpZHgyXSwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXJWaWV3LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjMiLCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZGVzYy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIpIHx8CisgICAgICAgIChkZXNjLT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSkgfHwgKGRlc2MtPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFKSB8fAorICAgICAgICAoZGVzYy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQpKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaWR4MyA9IDA7IGlkeDMgPCBkZXNjLT5kZXNjcmlwdG9yQ291bnQ7ICsraWR4MykgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXNjLT5wSW1hZ2VJbmZvW2lkeDNdLmltYWdlVmlldywga1Z1bGthbk9iamVjdFR5cGVJbWFnZVZpZXcsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyNiIsICJWVUlELVZrRGVzY3JpcHRvckltYWdlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZGVzYy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSKSB8fAorICAgICAgICAoZGVzYy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSKSB8fAorICAgICAgICAoZGVzYy0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMpIHx8CisgICAgICAgIChkZXNjLT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQykpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpZHg0ID0gMDsgaWR4NCA8IGRlc2MtPmRlc2NyaXB0b3JDb3VudDsgKytpZHg0KSB7CisgICAgICAgICAgICBpZiAoZGVzYy0+cEJ1ZmZlckluZm9baWR4NF0uYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXNjLT5wQnVmZmVySW5mb1tpZHg0XS5idWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tYnVmZmVyLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yV3JpdGVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kQnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1jb21tYW5kQnVmZmVyLXBhcmFtZXRlciIsICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItY29tbW9ucGFyZW50Iik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChsYXlvdXQsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmVMYXlvdXQsIGZhbHNlLCAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWxheW91dC1wYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1jb21tb25wYXJlbnQiKTsKKyAgICBpZiAocERlc2NyaXB0b3JXcml0ZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBkZXNjcmlwdG9yV3JpdGVDb3VudDsgKytpbmRleDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVEZXNjcmlwdG9yV3JpdGUoJnBEZXNjcmlwdG9yV3JpdGVzW2luZGV4MF0sIHRydWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6Q3JlYXRlUXVldWUoVmtRdWV1ZSB2a09iaikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxPYmpUcmFja1N0YXRlPiBwX29ial9ub2RlID0gTlVMTDsKKyAgICBhdXRvIHF1ZXVlX2l0ZW0gPSBvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlUXVldWVdLmZpbmQoSGFuZGxlVG9VaW50NjQodmtPYmopKTsKKyAgICBpZiAocXVldWVfaXRlbSA9PSBvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlUXVldWVdLmVuZCgpKSB7CisgICAgICAgIHBfb2JqX25vZGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPE9ialRyYWNrU3RhdGU+KCk7CisgICAgICAgIEluc2VydE9iamVjdChvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlUXVldWVdLCBIYW5kbGVUb1VpbnQ2NCh2a09iaiksIGtWdWxrYW5PYmplY3RUeXBlUXVldWUsIHBfb2JqX25vZGUpOworICAgICAgICBudW1fb2JqZWN0c1trVnVsa2FuT2JqZWN0VHlwZVF1ZXVlXSsrOworICAgICAgICBudW1fdG90YWxfb2JqZWN0cysrOworICAgIH0gZWxzZSB7CisgICAgICAgIHBfb2JqX25vZGUgPSBxdWV1ZV9pdGVtLT5zZWNvbmQ7CisgICAgfQorICAgIHBfb2JqX25vZGUtPm9iamVjdF90eXBlID0ga1Z1bGthbk9iamVjdFR5cGVRdWV1ZTsKKyAgICBwX29ial9ub2RlLT5zdGF0dXMgPSBPQkpTVEFUVVNfTk9ORTsKKyAgICBwX29ial9ub2RlLT5oYW5kbGUgPSBIYW5kbGVUb1VpbnQ2NCh2a09iaik7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpDcmVhdGVTd2FwY2hhaW5JbWFnZU9iamVjdChWa0ltYWdlIHN3YXBjaGFpbl9pbWFnZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKSB7CisgICAgaWYgKCFzd2FwY2hhaW5JbWFnZU1hcC5jb250YWlucyhIYW5kbGVUb1VpbnQ2NChzd2FwY2hhaW5faW1hZ2UpKSkgeworICAgICAgICBhdXRvIHBOZXdPYmpOb2RlID0gc3RkOjptYWtlX3NoYXJlZDxPYmpUcmFja1N0YXRlPigpOworICAgICAgICBwTmV3T2JqTm9kZS0+b2JqZWN0X3R5cGUgPSBrVnVsa2FuT2JqZWN0VHlwZUltYWdlOworICAgICAgICBwTmV3T2JqTm9kZS0+c3RhdHVzID0gT0JKU1RBVFVTX05PTkU7CisgICAgICAgIHBOZXdPYmpOb2RlLT5oYW5kbGUgPSBIYW5kbGVUb1VpbnQ2NChzd2FwY2hhaW5faW1hZ2UpOworICAgICAgICBwTmV3T2JqTm9kZS0+cGFyZW50X29iamVjdCA9IEhhbmRsZVRvVWludDY0KHN3YXBjaGFpbik7CisgICAgICAgIEluc2VydE9iamVjdChzd2FwY2hhaW5JbWFnZU1hcCwgSGFuZGxlVG9VaW50NjQoc3dhcGNoYWluX2ltYWdlKSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgcE5ld09iak5vZGUpOworICAgIH0KK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlJlcG9ydExlYWtlZEluc3RhbmNlT2JqZWN0cyhWa0luc3RhbmNlIGluc3RhbmNlLCBWdWxrYW5PYmplY3RUeXBlIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZXJyb3JfY29kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgYXV0byBzbmFwc2hvdCA9IG9iamVjdF9tYXBbb2JqZWN0X3R5cGVdLnNuYXBzaG90KCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogc25hcHNob3QpIHsKKyAgICAgICAgY29uc3QgYXV0byBvYmplY3RfaW5mbyA9IGl0ZW0uc2Vjb25kOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBnZXRfZGVidWdfcmVwb3J0X2VudW1bb2JqZWN0X3R5cGVdLCBvYmplY3RfaW5mby0+aGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSwgIk9CSiBFUlJPUiA6IEZvciAlcywgJXMgaGFzIG5vdCBiZWVuIGRlc3Ryb3llZC4iLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGluc3RhbmNlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShPYmpUcmFja1N0YXRlVHlwZWRIYW5kbGUoKm9iamVjdF9pbmZvKSkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UmVwb3J0TGVha2VkRGV2aWNlT2JqZWN0cyhWa0RldmljZSBkZXZpY2UsIFZ1bGthbk9iamVjdFR5cGUgb2JqZWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZXJyb3JfY29kZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgYXV0byBzbmFwc2hvdCA9IG9iamVjdF9tYXBbb2JqZWN0X3R5cGVdLnNuYXBzaG90KCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogc25hcHNob3QpIHsKKyAgICAgICAgY29uc3QgYXV0byBvYmplY3RfaW5mbyA9IGl0ZW0uc2Vjb25kOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBnZXRfZGVidWdfcmVwb3J0X2VudW1bb2JqZWN0X3R5cGVdLCBvYmplY3RfaW5mby0+aGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSwgIk9CSiBFUlJPUiA6IEZvciAlcywgJXMgaGFzIG5vdCBiZWVuIGRlc3Ryb3llZC4iLCByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKGRldmljZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUoT2JqVHJhY2tTdGF0ZVR5cGVkSGFuZGxlKCpvYmplY3RfaW5mbykpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lJbnN0YW5jZShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFdlIHZhbGlkYXRlIGhlcmUgZm9yIGNvdmVyYWdlLCB0aG91Z2ggd2UnZCBub3QgaGF2ZSBtYWRlIGl0IHRoaXMgZm9yIHdpdGggYSBiYWQgaW5zdGFuY2UuCisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95SW5zdGFuY2UtaW5zdGFuY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworCisgICAgLy8gVmFsaWRhdGUgdGhhdCBjaGlsZCBkZXZpY2VzIGhhdmUgYmVlbiBkZXN0cm95ZWQKKyAgICBhdXRvIHNuYXBzaG90ID0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZURldmljZV0uc25hcHNob3QoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmlpdCA6IHNuYXBzaG90KSB7CisgICAgICAgIGF1dG8gcE5vZGUgPSBpaXQuc2Vjb25kOworCisgICAgICAgIFZrRGV2aWNlIGRldmljZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2U+KHBOb2RlLT5oYW5kbGUpOworICAgICAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBkZWJ1Z19vYmplY3RfdHlwZSA9IGdldF9kZWJ1Z19yZXBvcnRfZW51bVtwTm9kZS0+b2JqZWN0X3R5cGVdOworCisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBkZWJ1Z19vYmplY3RfdHlwZSwgcE5vZGUtPmhhbmRsZSwga1ZVSURfT2JqZWN0VHJhY2tlcl9PYmplY3RMZWFrLAorICAgICAgICAgICAgICAgICAgICAiT0JKIEVSUk9SIDogJXMgb2JqZWN0ICVzIGhhcyBub3QgYmVlbiBkZXN0cm95ZWQuIiwgc3RyaW5nX1ZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUKGRlYnVnX29iamVjdF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEtPkZvcm1hdEhhbmRsZShPYmpUcmFja1N0YXRlVHlwZWRIYW5kbGUoKnBOb2RlKSkuY19zdHIoKSk7CisKKyAgICAgICAgLy8gVGhyb3cgZXJyb3JzIGlmIGFueSBkZXZpY2Ugb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhpcyBpbnN0YW5jZSBoYXZlIG5vdCBiZWVuIGRlc3Ryb3llZAorICAgICAgICBza2lwIHw9IFJlcG9ydFVuZGVzdHJveWVkRGV2aWNlT2JqZWN0cyhkZXZpY2UsICJWVUlELXZrRGVzdHJveURldmljZS1kZXZpY2UtMDAzNzgiKTsKKworICAgICAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1pbnN0YW5jZS0wMDYzMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrRGVzdHJveUluc3RhbmNlLWluc3RhbmNlLTAwNjMxIik7CisgICAgfQorCisgICAgLy8gVGhyb3cgZXJyb3JzIGlmIGFueSBpbnN0YW5jZSBvYmplY3RzIGNyZWF0ZWQgb24gdGhpcyBpbnN0YW5jZSBoYXZlIG5vdCBiZWVuIGRlc3Ryb3llZAorICAgIFZhbGlkYXRlRGVzdHJveU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgcEFsbG9jYXRvciwgIlZVSUQtdmtEZXN0cm95SW5zdGFuY2UtaW5zdGFuY2UtMDA2MzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0Rlc3Ryb3lJbnN0YW5jZS1pbnN0YW5jZS0wMDYzMSIpOworCisgICAgLy8gUmVwb3J0IGFueSByZW1haW5pbmcgaW5zdGFuY2Ugb2JqZWN0cworICAgIHNraXAgfD0gUmVwb3J0VW5kZXN0cm95ZWRJbnN0YW5jZU9iamVjdHMoaW5zdGFuY2UsICJWVUlELXZrRGVzdHJveUluc3RhbmNlLWluc3RhbmNlLTAwNjI5Iik7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCAqcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UgKnBQaHlzaWNhbERldmljZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBWYWxpZGF0ZU9iamVjdChpbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgZmFsc2UsICJWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzLWluc3RhbmNlLXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURVbmRlZmluZWQpOworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QgKnBQaHlzaWNhbERldmljZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UgKnBQaHlzaWNhbERldmljZXMsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmICgocmVzdWx0ICE9IFZLX1NVQ0NFU1MpICYmIChyZXN1bHQgIT0gVktfSU5DT01QTEVURSkpIHJldHVybjsKKyAgICBpZiAocFBoeXNpY2FsRGV2aWNlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKnBQaHlzaWNhbERldmljZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIENyZWF0ZU9iamVjdChwUGh5c2ljYWxEZXZpY2VzW2ldLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95SW5zdGFuY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgLy8gRGVzdHJveSBwaHlzaWNhbCBkZXZpY2VzCisgICAgYXV0byBzbmFwc2hvdCA9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZV0uc25hcHNob3QoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmlpdCA6IHNuYXBzaG90KSB7CisgICAgICAgIGF1dG8gcE5vZGUgPSBpaXQuc2Vjb25kOworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsX2RldmljZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtQaHlzaWNhbERldmljZT4ocE5vZGUtPmhhbmRsZSk7CisgICAgICAgIFJlY29yZERlc3Ryb3lPYmplY3QocGh5c2ljYWxfZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlKTsKKyAgICB9CisKKyAgICAvLyBEZXN0cm95IGNoaWxkIGRldmljZXMKKyAgICBhdXRvIHNuYXBzaG90MiA9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVEZXZpY2VdLnNuYXBzaG90KCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpaXQgOiBzbmFwc2hvdDIpIHsKKyAgICAgICAgYXV0byBwTm9kZSA9IGlpdC5zZWNvbmQ7CisgICAgICAgIFZrRGV2aWNlIGRldmljZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXZpY2U+KHBOb2RlLT5oYW5kbGUpOworICAgICAgICBEZXN0cm95TGVha2VkSW5zdGFuY2VPYmplY3RzKCk7CisKKyAgICAgICAgUmVjb3JkRGVzdHJveU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlKTsKKyAgICB9Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZERlc3Ryb3lJbnN0YW5jZShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KGluc3RhbmNlLCBrVnVsa2FuT2JqZWN0VHlwZUluc3RhbmNlKTsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIHRydWUsICJWVUlELXZrRGVzdHJveURldmljZS1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVEZXN0cm95T2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIHBBbGxvY2F0b3IsICJWVUlELXZrRGVzdHJveURldmljZS1kZXZpY2UtMDAzNzkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrRGVzdHJveURldmljZS1kZXZpY2UtMDAzODAiKTsKKyAgICAvLyBSZXBvcnQgYW55IHJlbWFpbmluZyBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZrRGV2aWNlIG9iamVjdCBpbiBMTAorICAgIHNraXAgfD0gUmVwb3J0VW5kZXN0cm95ZWREZXZpY2VPYmplY3RzKGRldmljZSwgIlZVSUQtdmtEZXN0cm95RGV2aWNlLWRldmljZS0wMDM3OCIpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveURldmljZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGF1dG8gaW5zdGFuY2VfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsX2RldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWYWxpZGF0aW9uT2JqZWN0ICp2YWxpZGF0aW9uX2RhdGEgPSBHZXRWYWxpZGF0aW9uT2JqZWN0KGluc3RhbmNlX2RhdGEtPm9iamVjdF9kaXNwYXRjaCwgTGF5ZXJPYmplY3RUeXBlT2JqZWN0VHJhY2tlcik7CisgICAgT2JqZWN0TGlmZXRpbWVzICpvYmplY3RfbGlmZXRpbWVzID0gc3RhdGljX2Nhc3Q8T2JqZWN0TGlmZXRpbWVzICo+KHZhbGlkYXRpb25fZGF0YSk7CisgICAgb2JqZWN0X2xpZmV0aW1lcy0+UmVjb3JkRGVzdHJveU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlKTsKKyAgICBEZXN0cm95TGVha2VkRGV2aWNlT2JqZWN0cygpOworCisgICAgLy8gQ2xlYW4gdXAgUXVldWUncyBNZW1SZWYgTGlua2VkIExpc3RzCisgICAgRGVzdHJveVF1ZXVlRGF0YVN0cnVjdHVyZXMoKTsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldERldmljZVF1ZXVlKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgdWludDMyX3QgcXVldWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlICpwUXVldWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldERldmljZVF1ZXVlLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgdWludDMyX3QgcXVldWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVldWUgKnBRdWV1ZSkgeworICAgIGF1dG8gbG9jayA9IHdyaXRlX3NoYXJlZF9sb2NrKCk7CisgICAgQ3JlYXRlUXVldWUoKnBRdWV1ZSk7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXREZXZpY2VRdWV1ZTIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIgKnBRdWV1ZUluZm8sIFZrUXVldWUgKnBRdWV1ZSkgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXREZXZpY2VRdWV1ZTItZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXZpY2VRdWV1ZUluZm8yICpwUXVldWVJbmZvLCBWa1F1ZXVlICpwUXVldWUpIHsKKyAgICBhdXRvIGxvY2sgPSB3cml0ZV9zaGFyZWRfbG9jaygpOworICAgIENyZWF0ZVF1ZXVlKCpwUXVldWUpOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlVXBkYXRlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JXcml0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvckNvcGllcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldHMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpZHgwID0gMDsgaWR4MCA8IGRlc2NyaXB0b3JDb3B5Q291bnQ7ICsraWR4MCkgeworICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yQ29waWVzW2lkeDBdLmRzdFNldCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocERlc2NyaXB0b3JDb3BpZXNbaWR4MF0uZHN0U2V0LCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RTZXQtcGFyYW1ldGVyIiwgIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwRGVzY3JpcHRvckNvcGllc1tpZHgwXS5zcmNTZXQpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBEZXNjcmlwdG9yQ29waWVzW2lkeDBdLnNyY1NldCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjU2V0LXBhcmFtZXRlciIsICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaWR4MSA9IDA7IGlkeDEgPCBkZXNjcmlwdG9yV3JpdGVDb3VudDsgKytpZHgxKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlRGVzY3JpcHRvcldyaXRlKCZwRGVzY3JpcHRvcldyaXRlc1tpZHgxXSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlUmVzZXREZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncyBmbGFncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGF1dG8gbG9jayA9IHJlYWRfc2hhcmVkX2xvY2soKTsKKworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrUmVzZXREZXNjcmlwdG9yUG9vbC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0KKyAgICAgICAgVmFsaWRhdGVPYmplY3QoZGVzY3JpcHRvclBvb2wsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a1Jlc2V0RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtcGFyYW1ldGVyIiwgIlZVSUQtdmtSZXNldERlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLXBhcmVudCIpOworCisgICAgYXV0byBpdHIgPSBvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2xdLmZpbmQoSGFuZGxlVG9VaW50NjQoZGVzY3JpcHRvclBvb2wpKTsKKyAgICBpZiAoaXRyICE9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbF0uZW5kKCkpIHsKKyAgICAgICAgYXV0byBwUG9vbE5vZGUgPSBpdHItPnNlY29uZDsKKyAgICAgICAgZm9yIChhdXRvIHNldCA6ICpwUG9vbE5vZGUtPmNoaWxkX29iamVjdHMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVEZXN0cm95T2JqZWN0KChWa0Rlc2NyaXB0b3JTZXQpc2V0LCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQsIG51bGxwdHIsIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURVbmRlZmluZWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZFJlc2V0RGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzKSB7CisgICAgYXV0byBsb2NrID0gd3JpdGVfc2hhcmVkX2xvY2soKTsKKyAgICAvLyBBIERlc2NyaXB0b3JQb29sJ3MgZGVzY3JpcHRvciBzZXRzIGFyZSBpbXBsaWNpdGx5IGRlbGV0ZWQgd2hlbiB0aGUgcG9vbCBpcyByZXNldC4gUmVtb3ZlIHRoaXMgcG9vbCdzIGRlc2NyaXB0b3Igc2V0cyBmcm9tCisgICAgLy8gb3VyIGRlc2NyaXB0b3JTZXQgbWFwLgorICAgIGF1dG8gaXRyID0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sXS5maW5kKEhhbmRsZVRvVWludDY0KGRlc2NyaXB0b3JQb29sKSk7CisgICAgaWYgKGl0ciAhPSBvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2xdLmVuZCgpKSB7CisgICAgICAgIGF1dG8gcFBvb2xOb2RlID0gaXRyLT5zZWNvbmQ7CisgICAgICAgIGZvciAoYXV0byBzZXQgOiAqcFBvb2xOb2RlLT5jaGlsZF9vYmplY3RzKSB7CisgICAgICAgICAgICBSZWNvcmREZXN0cm95T2JqZWN0KChWa0Rlc2NyaXB0b3JTZXQpc2V0LCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQpOworICAgICAgICB9CisgICAgICAgIHBQb29sTm9kZS0+Y2hpbGRfb2JqZWN0cy0+Y2xlYXIoKTsKKyAgICB9Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gKmJlZ2luX2luZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGNvbW1hbmRfYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtCZWdpbkNvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKGJlZ2luX2luZm8pIHsKKyAgICAgICAgYXV0byBpdGVyID0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXJdLmZpbmQoSGFuZGxlVG9VaW50NjQoY29tbWFuZF9idWZmZXIpKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXJdLmVuZCgpKSB7CisgICAgICAgICAgICBhdXRvIHBOb2RlID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgaWYgKChiZWdpbl9pbmZvLT5wSW5oZXJpdGFuY2VJbmZvKSAmJiAocE5vZGUtPnN0YXR1cyAmIE9CSlNUQVRVU19DT01NQU5EX0JVRkZFUl9TRUNPTkRBUlkpICYmCisgICAgICAgICAgICAgICAgKGJlZ2luX2luZm8tPmZsYWdzICYgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVPYmplY3QoYmVnaW5faW5mby0+cEluaGVyaXRhbmNlSW5mby0+ZnJhbWVidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlRnJhbWVidWZmZXIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1mbGFncy0wMDA1NSIsICJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlT2JqZWN0KGJlZ2luX2luZm8tPnBJbmhlcml0YW5jZUluZm8tPnJlbmRlclBhc3MsIGtWdWxrYW5PYmplY3RUeXBlUmVuZGVyUGFzcywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1mbGFncy0wMDA1MyIsICJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTd2FwY2hhaW5JbWFnZUNvdW50LCBWa0ltYWdlICpwU3dhcGNoYWluSW1hZ2VzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1jb21tb25wYXJlbnQiKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHN3YXBjaGFpbiwga1Z1bGthbk9iamVjdFR5cGVTd2FwY2hhaW5LSFIsIGZhbHNlLCAiVlVJRC12a0dldFN3YXBjaGFpbkltYWdlc0tIUi1zd2FwY2hhaW4tcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSLWNvbW1vbnBhcmVudCIpOworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90ICpwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlICpwU3dhcGNoYWluSW1hZ2VzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoKHJlc3VsdCAhPSBWS19TVUNDRVNTKSAmJiAocmVzdWx0ICE9IFZLX0lOQ09NUExFVEUpKSByZXR1cm47CisgICAgYXV0byBsb2NrID0gd3JpdGVfc2hhcmVkX2xvY2soKTsKKyAgICBpZiAocFN3YXBjaGFpbkltYWdlcyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFN3YXBjaGFpbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQ3JlYXRlU3dhcGNoYWluSW1hZ2VPYmplY3QocFN3YXBjaGFpbkltYWdlc1tpXSwgc3dhcGNoYWluKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dCAqcFNldExheW91dCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0KKyAgICAgICAgVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBCaW5kaW5ncykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kaW5nX2luZGV4ID0gMDsgYmluZGluZ19pbmRleCA8IHBDcmVhdGVJbmZvLT5iaW5kaW5nQ291bnQ7ICsrYmluZGluZ19pbmRleCkgeworICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgJmJpbmRpbmcgPSBwQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2JpbmRpbmdfaW5kZXhdOworICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNfc2FtcGxlcl90eXBlID0gYmluZGluZy5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZy5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjsKKyAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgJiYgaXNfc2FtcGxlcl90eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyID0gMDsgaW5kZXgyIDwgYmluZGluZy5kZXNjcmlwdG9yQ291bnQ7ICsraW5kZXgyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1NhbXBsZXIgc2FtcGxlciA9IGJpbmRpbmcucEltbXV0YWJsZVNhbXBsZXJzW2luZGV4Ml07CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHNhbXBsZXIsIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtMDAyODIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgKnBTZXRMYXlvdXQsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcFNldExheW91dCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0TGF5b3V0LCBwQWxsb2NhdG9yKTsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlZhbGlkYXRlU2FtcGxlck9iamVjdHMoY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocENyZWF0ZUluZm8tPnBCaW5kaW5ncykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IHBDcmVhdGVJbmZvLT5iaW5kaW5nQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MiA9IDA7IGluZGV4MiA8IHBDcmVhdGVJbmZvLT5wQmluZGluZ3NbaW5kZXgxXS5kZXNjcmlwdG9yQ291bnQ7ICsraW5kZXgyKSB7CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQmluZGluZ3NbaW5kZXgxXS5wSW1tdXRhYmxlU2FtcGxlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2luZGV4MV0ucEltbXV0YWJsZVNhbXBsZXJzW2luZGV4Ml0sIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JUeXBlLTAwMjgyIiwga1ZVSURVbmRlZmluZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0KFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0ICpwU3VwcG9ydCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LWRldmljZS1wYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVNhbXBsZXJPYmplY3RzKHBDcmVhdGVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9Citib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFIoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dFN1cHBvcnQgKnBTdXBwb3J0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFItZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURVbmRlZmluZWQpOworICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlU2FtcGxlck9iamVjdHMocENyZWF0ZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgKnBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgKnBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHt9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUluc3RhbmNlKGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbnN0YW5jZSAqcEluc3RhbmNlLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBDcmVhdGVPYmplY3QoKnBJbnN0YW5jZSwga1Z1bGthbk9iamVjdFR5cGVJbnN0YW5jZSwgcEFsbG9jYXRvcik7Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICpwQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtDb21tYW5kQnVmZmVyICpwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9CisgICAgICAgIFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBBbGxvY2F0ZUluZm8tPmNvbW1hbmRQb29sLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mby1jb21tYW5kUG9vbC1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gKnBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEFsbG9jYXRlSW5mby0+Y29tbWFuZEJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgQWxsb2NhdGVDb21tYW5kQnVmZmVyKHBBbGxvY2F0ZUluZm8tPmNvbW1hbmRQb29sLCBwQ29tbWFuZEJ1ZmZlcnNbaV0sIHBBbGxvY2F0ZUluZm8tPmxldmVsKTsKKyAgICB9Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICpwQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvclNldHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBhdXRvIGxvY2sgPSByZWFkX3NoYXJlZF9sb2NrKCk7CisgICAgc2tpcCB8PQorICAgICAgICBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tZGVzY3JpcHRvclBvb2wtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyBpKyspIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChwQWxsb2NhdGVJbmZvLT5wU2V0TGF5b3V0c1tpXSwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0TGF5b3V0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tcFNldExheW91dHMtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tY29tbW9ucGFyZW50Iik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICpwQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgYXV0byBsb2NrID0gd3JpdGVfc2hhcmVkX2xvY2soKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyBpKyspIHsKKyAgICAgICAgQWxsb2NhdGVEZXNjcmlwdG9yU2V0KHBBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sLCBwRGVzY3JpcHRvclNldHNbaV0pOworICAgIH0KK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUZyZWVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyICpwQ29tbWFuZEJ1ZmZlcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoY29tbWFuZFBvb2wsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZFBvb2wsIGZhbHNlLCAiVlVJRC12a0ZyZWVDb21tYW5kQnVmZmVycy1jb21tYW5kUG9vbC1wYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtGcmVlQ29tbWFuZEJ1ZmZlcnMtY29tbWFuZFBvb2wtcGFyZW50Iik7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbW1hbmRCdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChwQ29tbWFuZEJ1ZmZlcnNbaV0gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDb21tYW5kQnVmZmVyKGNvbW1hbmRQb29sLCBwQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIFZhbGlkYXRlRGVzdHJveU9iamVjdChwQ29tbWFuZEJ1ZmZlcnNbaV0sIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgbnVsbHB0ciwga1ZVSURVbmRlZmluZWQsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmRGcmVlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb21tYW5kQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICBSZWNvcmREZXN0cm95T2JqZWN0KHBDb21tYW5kQnVmZmVyc1tpXSwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyKTsKKyAgICB9Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVEZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlRGVzdHJveU9iamVjdChzd2FwY2hhaW4sIGtWdWxrYW5PYmplY3RUeXBlU3dhcGNoYWluS0hSLCBwQWxsb2NhdG9yLCAiVlVJRC12a0Rlc3Ryb3lTd2FwY2hhaW5LSFItc3dhcGNoYWluLTAxMjgzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrRGVzdHJveVN3YXBjaGFpbktIUi1zd2FwY2hhaW4tMDEyODQiKTsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIFJlY29yZERlc3Ryb3lPYmplY3Qoc3dhcGNoYWluLCBrVnVsa2FuT2JqZWN0VHlwZVN3YXBjaGFpbktIUik7CisKKyAgICBhdXRvIHNuYXBzaG90ID0gc3dhcGNoYWluSW1hZ2VNYXAuc25hcHNob3QoCisgICAgICAgIFtzd2FwY2hhaW5dKHN0ZDo6c2hhcmVkX3B0cjxPYmpUcmFja1N0YXRlPiBwTm9kZSkgeyByZXR1cm4gcE5vZGUtPnBhcmVudF9vYmplY3QgPT0gSGFuZGxlVG9VaW50NjQoc3dhcGNoYWluKTsgfSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdHIgOiBzbmFwc2hvdCkgeworICAgICAgICBzd2FwY2hhaW5JbWFnZU1hcC5lcmFzZShpdHIuZmlyc3QpOworICAgIH0KK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUZyZWVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvclNldHMpIGNvbnN0IHsKKyAgICBhdXRvIGxvY2sgPSByZWFkX3NoYXJlZF9sb2NrKCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtGcmVlRGVzY3JpcHRvclNldHMtZGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRlc2NyaXB0b3JQb29sLCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIsICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JQb29sLXBhcmVudCIpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yU2V0Q291bnQ7IGkrKykgeworICAgICAgICBpZiAocERlc2NyaXB0b3JTZXRzW2ldICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlRGVzY3JpcHRvclNldChkZXNjcmlwdG9yUG9vbCwgcERlc2NyaXB0b3JTZXRzW2ldKTsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBWYWxpZGF0ZURlc3Ryb3lPYmplY3QocERlc2NyaXB0b3JTZXRzW2ldLCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQsIG51bGxwdHIsIGtWVUlEVW5kZWZpbmVkLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9Cit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JTZXRzKSB7CisgICAgYXV0byBsb2NrID0gd3JpdGVfc2hhcmVkX2xvY2soKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8T2JqVHJhY2tTdGF0ZT4gcFBvb2xOb2RlID0gbnVsbHB0cjsKKyAgICBhdXRvIGl0ciA9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbF0uZmluZChIYW5kbGVUb1VpbnQ2NChkZXNjcmlwdG9yUG9vbCkpOworICAgIGlmIChpdHIgIT0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sXS5lbmQoKSkgeworICAgICAgICBwUG9vbE5vZGUgPSBpdHItPnNlY29uZDsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlc2NyaXB0b3JTZXRDb3VudDsgaSsrKSB7CisgICAgICAgIFJlY29yZERlc3Ryb3lPYmplY3QocERlc2NyaXB0b3JTZXRzW2ldLCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JTZXQpOworICAgICAgICBpZiAocFBvb2xOb2RlKSB7CisgICAgICAgICAgICBwUG9vbE5vZGUtPmNoaWxkX29iamVjdHMtPmVyYXNlKEhhbmRsZVRvVWludDY0KHBEZXNjcmlwdG9yU2V0c1tpXSkpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSBjb25zdCB7CisgICAgYXV0byBsb2NrID0gcmVhZF9zaGFyZWRfbG9jaygpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JQb29sLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXNjcmlwdG9yUG9vbCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC1wYXJlbnQiKTsKKworICAgIGF1dG8gaXRyID0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sXS5maW5kKEhhbmRsZVRvVWludDY0KGRlc2NyaXB0b3JQb29sKSk7CisgICAgaWYgKGl0ciAhPSBvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2xdLmVuZCgpKSB7CisgICAgICAgIGF1dG8gcFBvb2xOb2RlID0gaXRyLT5zZWNvbmQ7CisgICAgICAgIGZvciAoYXV0byBzZXQgOiAqcFBvb2xOb2RlLT5jaGlsZF9vYmplY3RzKSB7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdCgoVmtEZXNjcmlwdG9yU2V0KXNldCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yU2V0LCBudWxscHRyLCBrVlVJRFVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lwIHw9IFZhbGlkYXRlRGVzdHJveU9iamVjdChkZXNjcmlwdG9yUG9vbCwga1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbCwgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbC1kZXNjcmlwdG9yUG9vbC0wMDMwNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtMDAzMDUiKTsKKyAgICByZXR1cm4gc2tpcDsKK30KK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGF1dG8gbG9jayA9IHdyaXRlX3NoYXJlZF9sb2NrKCk7CisgICAgYXV0byBpdHIgPSBvYmplY3RfbWFwW2tWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2xdLmZpbmQoSGFuZGxlVG9VaW50NjQoZGVzY3JpcHRvclBvb2wpKTsKKyAgICBpZiAoaXRyICE9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVEZXNjcmlwdG9yUG9vbF0uZW5kKCkpIHsKKyAgICAgICAgYXV0byBwUG9vbE5vZGUgPSBpdHItPnNlY29uZDsKKyAgICAgICAgZm9yIChhdXRvIHNldCA6ICpwUG9vbE5vZGUtPmNoaWxkX29iamVjdHMpIHsKKyAgICAgICAgICAgIFJlY29yZERlc3Ryb3lPYmplY3QoKFZrRGVzY3JpcHRvclNldClzZXQsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldCk7CisgICAgICAgIH0KKyAgICAgICAgcFBvb2xOb2RlLT5jaGlsZF9vYmplY3RzLT5jbGVhcigpOworICAgIH0KKyAgICBSZWNvcmREZXN0cm95T2JqZWN0KGRlc2NyaXB0b3JQb29sLCBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sKTsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZURlc3Ryb3lDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChjb21tYW5kUG9vbCwga1Z1bGthbk9iamVjdFR5cGVDb21tYW5kUG9vbCwgdHJ1ZSwgIlZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrRGVzdHJveUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmVudCIpOworCisgICAgYXV0byBzbmFwc2hvdCA9IG9iamVjdF9tYXBba1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyXS5zbmFwc2hvdCgKKyAgICAgICAgW2NvbW1hbmRQb29sXShzdGQ6OnNoYXJlZF9wdHI8T2JqVHJhY2tTdGF0ZT4gcE5vZGUpIHsgcmV0dXJuIHBOb2RlLT5wYXJlbnRfb2JqZWN0ID09IEhhbmRsZVRvVWludDY0KGNvbW1hbmRQb29sKTsgfSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdHIgOiBzbmFwc2hvdCkgeworICAgICAgICBhdXRvIHBOb2RlID0gaXRyLnNlY29uZDsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNvbW1hbmRCdWZmZXIoY29tbWFuZFBvb2wsIHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kQnVmZmVyPihpdHIuZmlyc3QpKTsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QocmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRCdWZmZXI+KGl0ci5maXJzdCksIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlciwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURVbmRlZmluZWQsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICB9CisgICAgc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QoY29tbWFuZFBvb2wsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZFBvb2wsIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtEZXN0cm95Q29tbWFuZFBvb2wtY29tbWFuZFBvb2wtMDAwNDIiLCAiVlVJRC12a0Rlc3Ryb3lDb21tYW5kUG9vbC1jb21tYW5kUG9vbC0wMDA0MyIpOworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFJlY29yZERlc3Ryb3lDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIHNuYXBzaG90ID0gb2JqZWN0X21hcFtrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXJdLnNuYXBzaG90KAorICAgICAgICBbY29tbWFuZFBvb2xdKHN0ZDo6c2hhcmVkX3B0cjxPYmpUcmFja1N0YXRlPiBwTm9kZSkgeyByZXR1cm4gcE5vZGUtPnBhcmVudF9vYmplY3QgPT0gSGFuZGxlVG9VaW50NjQoY29tbWFuZFBvb2wpOyB9KTsKKyAgICAvLyBBIENvbW1hbmRQb29sJ3MgY21kIGJ1ZmZlcnMgYXJlIGltcGxpY2l0bHkgZGVsZXRlZCB3aGVuIHBvb2wgaXMgZGVsZXRlZC4gUmVtb3ZlIHRoaXMgcG9vbCdzIGNtZEJ1ZmZlcnMgZnJvbSBjbWQgYnVmZmVyIG1hcC4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ciA6IHNuYXBzaG90KSB7CisgICAgICAgIFJlY29yZERlc3Ryb3lPYmplY3QocmVpbnRlcnByZXRfY2FzdDxWa0NvbW1hbmRCdWZmZXI+KGl0ci5maXJzdCksIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlcik7CisgICAgfQorICAgIFJlY29yZERlc3Ryb3lPYmplY3QoY29tbWFuZFBvb2wsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZFBvb2wpOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiAqcFF1ZXVlRmFtaWx5UHJvcGVydGllcykgY29uc3QgeworICAgIHJldHVybiBWYWxpZGF0ZU9iamVjdChwaHlzaWNhbERldmljZSwga1Z1bGthbk9iamVjdFR5cGVQaHlzaWNhbERldmljZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyICpwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgKnBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHt9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSICpwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7fQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmICgocmVzdWx0ICE9IFZLX1NVQ0NFU1MpICYmIChyZXN1bHQgIT0gVktfSU5DT01QTEVURSkpIHJldHVybjsKKyAgICBpZiAocFByb3BlcnRpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICpwUHJvcGVydHlDb3VudDsgKytpKSB7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocFByb3BlcnRpZXNbaV0uZGlzcGxheSwga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5S0hSLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZUdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRpc3BsYXksIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUiwgZmFsc2UsICJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSLWRpc3BsYXktcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIE9iamVjdExpZmV0aW1lczo6UG9zdENhbGxSZWNvcmRHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlNb2RlUHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKChyZXN1bHQgIT0gVktfU1VDQ0VTUykgJiYgKHJlc3VsdCAhPSBWS19JTkNPTVBMRVRFKSkgcmV0dXJuOworICAgIGlmIChwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKnBQcm9wZXJ0eUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIENyZWF0ZU9iamVjdChwUHJvcGVydGllc1tpXS5kaXNwbGF5TW9kZSwga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5TW9kZUtIUiwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgT2JqZWN0TGlmZXRpbWVzOjpQcmVDYWxsVmFsaWRhdGVHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsaWRhdGVPYmplY3QocGh5c2ljYWxEZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlUGh5c2ljYWxEZXZpY2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlciIsIGtWVUlEVW5kZWZpbmVkKTsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVByb3BlcnRpZXMyS0hSICpwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKChyZXN1bHQgIT0gVktfU1VDQ0VTUykgJiYgKHJlc3VsdCAhPSBWS19JTkNPTVBMRVRFKSkgcmV0dXJuOworICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8ICpwUHJvcGVydHlDb3VudDsgKytpbmRleCkgeworICAgICAgICBDcmVhdGVPYmplY3QocFByb3BlcnRpZXNbaW5kZXhdLmRpc3BsYXlQcm9wZXJ0aWVzLmRpc3BsYXksIGtWdWxrYW5PYmplY3RUeXBlRGlzcGxheUtIUiwgbnVsbHB0cik7CisgICAgfQorfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Rpc3BsYXlLSFIgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBoeXNpY2FsRGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZVBoeXNpY2FsRGV2aWNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkaXNwbGF5LCBrVnVsa2FuT2JqZWN0VHlwZURpc3BsYXlLSFIsIGZhbHNlLCAiVlVJRC12a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFItZGlzcGxheS1wYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURVbmRlZmluZWQpOworCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSICpwUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKChyZXN1bHQgIT0gVktfU1VDQ0VTUykgJiYgKHJlc3VsdCAhPSBWS19JTkNPTVBMRVRFKSkgcmV0dXJuOworICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8ICpwUHJvcGVydHlDb3VudDsgKytpbmRleCkgeworICAgICAgICBDcmVhdGVPYmplY3QocFByb3BlcnRpZXNbaW5kZXhdLmRpc3BsYXlNb2RlUHJvcGVydGllcy5kaXNwbGF5TW9kZSwga1Z1bGthbk9iamVjdFR5cGVEaXNwbGF5TW9kZUtIUiwgbnVsbHB0cik7CisgICAgfQorfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKAorICAgIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25BY3F1aXJlSW5mb0lOVEVMICpwQWNxdWlyZUluZm8sCisgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCAqcENvbmZpZ3VyYXRpb24pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0FjcXVpcmVQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlUmVsZWFzZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCBjb25maWd1cmF0aW9uKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtSZWxlYXNlUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwtZGV2aWNlLXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVF1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwoVmtRdWV1ZSBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwgY29uZmlndXJhdGlvbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocXVldWUsIGtWdWxrYW5PYmplY3RUeXBlUXVldWUsIGZhbHNlLCAiVlVJRC12a1F1ZXVlU2V0UGVyZm9ybWFuY2VDb25maWd1cmF0aW9uSU5URUwtcXVldWUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrUXVldWVTZXRQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTC1jb21tb25wYXJlbnQiKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0ZyYW1lYnVmZmVyICpwRnJhbWVidWZmZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KGRldmljZSwga1Z1bGthbk9iamVjdFR5cGVEZXZpY2UsIGZhbHNlLCAiVlVJRC12a0NyZWF0ZUZyYW1lYnVmZmVyLWRldmljZS1wYXJhbWV0ZXIiLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVPYmplY3QocENyZWF0ZUluZm8tPnJlbmRlclBhc3MsIGtWdWxrYW5PYmplY3RUeXBlUmVuZGVyUGFzcywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy1wYXJhbWV0ZXIiLCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1jb21tb25wYXJlbnQiKTsKKyAgICAgICAgaWYgKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIpID09IDApIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudDsgKytpbmRleDEpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlT2JqZWN0KHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaW5kZXgxXSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZVZpZXcsIHRydWUsIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tY29tbW9ucGFyZW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKwordm9pZCBPYmplY3RMaWZldGltZXM6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRnJhbWVidWZmZXIgKnBGcmFtZWJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIENyZWF0ZU9iamVjdCgqcEZyYW1lYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyLCBwQWxsb2NhdG9yKTsKK30KKworYm9vbCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxWYWxpZGF0ZVNldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCAqcE5hbWVJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc2tpcCB8PSBWYWxpZGF0ZU9iamVjdChkZXZpY2UsIGtWdWxrYW5PYmplY3RUeXBlRGV2aWNlLCBmYWxzZSwgIlZVSUQtdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVC1kZXZpY2UtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlQW5vbnltb3VzT2JqZWN0KHBOYW1lSW5mby0+b2JqZWN0SGFuZGxlLCBwTmFtZUluZm8tPm9iamVjdFR5cGUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQtb2JqZWN0VHlwZS0wMjU5MCIsIGtWVUlEVW5kZWZpbmVkKTsKKworICAgIHJldHVybiBza2lwOworfQorCitib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVChWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUICpwVGFnSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHNraXAgfD0KKyAgICAgICAgVmFsaWRhdGVPYmplY3QoZGV2aWNlLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZSwgZmFsc2UsICJWVUlELXZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVC1kZXZpY2UtcGFyYW1ldGVyIiwga1ZVSURVbmRlZmluZWQpOworICAgIHNraXAgfD0gVmFsaWRhdGVBbm9ueW1vdXNPYmplY3QocFRhZ0luZm8tPm9iamVjdEhhbmRsZSwgcFRhZ0luZm8tPm9iamVjdFR5cGUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVC1vYmplY3RIYW5kbGUtMDE5MTAiLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICByZXR1cm4gc2tpcDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9wYXJhbWV0ZXJfbmFtZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3BhcmFtZXRlcl9uYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzMjBiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9wYXJhbWV0ZXJfbmFtZS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIFBBUkFNRVRFUl9OQU1FX0gKKyNkZWZpbmUgUEFSQU1FVEVSX05BTUVfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKgorICogUGFyYW1ldGVyIG5hbWUgc3RyaW5nIHN1cHBvcnRpbmcgZGVmZXJyZWQgZm9ybWF0dGluZyBmb3IgYXJyYXkgc3Vic2NyaXB0cy4KKyAqCisgKiBDdXN0b20gcGFyYW1ldGVyIG5hbWUgY2xhc3Mgd2l0aCBzdXBwb3J0IGZvciBkZWZlcnJlZCBmb3JtYXR0aW5nIG9mIG5hbWVzIGNvbnRhaW5pbmcgYXJyYXkgc3Vic2NyaXB0cy4gIFRoZSBjbGFzcyBzdG9yZXMKKyAqIGEgZm9ybWF0IHN0cmluZyBhbmQgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGluZGV4IHZhbHVlcywgYW5kIHBlcmZvcm1zIHN0cmluZyBmb3JtYXR0aW5nIHdoZW4gYW4gYWNjZXNzb3IgZnVuY3Rpb24gaXMgY2FsbGVkIHRvCisgKiByZXRyaWV2ZSB0aGUgbmFtZSBzdHJpbmcuICBUaGlzIGNsYXNzIHdhcyBwcmltYXJpbHkgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIHZhbGlkYXRpb24gZnVuY3Rpb25zIHRoYXQgcmVjZWl2ZSBhIHBhcmFtZXRlciBuYW1lCisgKiBzdHJpbmcgYW5kIHZhbHVlIGFzIGFyZ3VtZW50cywgYW5kIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgdGhhdCBpbmNsdWRlcyB0aGUgcGFyYW1ldGVyIG5hbWUgd2hlbiB0aGUgdmFsdWUgZmFpbHMgYSB2YWxpZGF0aW9uCisgKiB0ZXN0LiAgVXNpbmcgc3RhbmRhcmQgc3RyaW5ncyB3aXRoIHRoZXNlIHZhbGlkYXRpb24gZnVuY3Rpb25zIHJlcXVpcmVzIHRoYXQgcGFyYW1ldGVyIG5hbWVzIGNvbnRhaW5pbmcgYXJyYXkgc3Vic2NyaXB0cyBiZQorICogZm9ybWF0dGVkIGJlZm9yZSBlYWNoIHZhbGlkYXRpb24gZnVuY3Rpb24gaXMgY2FsbGVkLCBwZXJmb3JtaW5nIHRoZSBzdHJpbmcgZm9ybWF0dGluZyBldmVuIHdoZW4gdGhlIHZhbHVlIHBhc3NlcyB2YWxpZGF0aW9uCisgKiBhbmQgdGhlIHN0cmluZyBpcyBub3QgdXNlZDoKKyAqICAgICAgICAgc3ByaW50ZihuYW1lLCAicENyZWF0ZUluZm9bJWRdLnNUeXBlIiwgaSk7CisgKiAgICAgICAgIHZhbGlkYXRlX3N0eXBlKG5hbWUsIHBDcmVhdGVJbmZvW2ldLnNUeXBlKTsKKyAqCisgKiBXaXRoIHRoZSBQYXJhbWV0ZXJOYW1lIGNsYXNzLCBhIGZvcm1hdCBzdHJpbmcgYW5kIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBmb3JtYXQgdmFsdWVzIGFyZSBzdG9yZWQgYnkgdGhlIFBhcmFtZXRlck5hbWUgb2JqZWN0CisgKiB0aGF0IGlzIHByb3ZpZGVkIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiAgU3RyaW5nIGZvcm1hdHRpbmcgaXMgdGhlbiBwZXJmb3JtZWQgb25seSB3aGVuIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUKKyAqIG5hbWUgc3RyaW5nIGZyb20gdGhlIFBhcmFtZXRlck5hbWUgb2JqZWN0OgorICogICAgICAgICB2YWxpZGF0ZV9zdHlwZShQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb1slaV0uc1R5cGUiLCBJbmRleFZlY3RvcnsgaSB9KSwgcENyZWF0ZUluZm9baV0uc1R5cGUpOworICoKKyAqIFNpbmNlIHRoZSBJbmRleFZlY3RvciBpcyBub3QgY29waWVkIGludG8gdGhlIG9iamVjdCwgdGhlIGxpZmV0aW1lIG9mIHRoZSBQYXJhbWV0ZXJOYW1lIHNob3VsZCBub3Qgb3V0bGFzdCB0aGUgbGlmZXRpbWUgb2YKKyAqIHRoZSBJbmRleFZlY3RvciwgYnV0IHRoYXQncyBmaW5lIGdpdmVuIGhvdyBpdCBpcyB1c2VkIGluIHBhcmFtZXRlciB2YWxpZGF0aW9uLgorICovCitjbGFzcyBQYXJhbWV0ZXJOYW1lIHsKKyAgcHVibGljOgorICAgIC8vLyBDb250YWluZXIgZm9yIGluZGV4IHZhbHVlcyB0byBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIG5hbWUgc3RyaW5nIGZvcm1hdHRpbmcuCisgICAgdHlwZWRlZiBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c2l6ZV90PiBJbmRleFZlY3RvcjsKKworICAgIC8vLyBGb3JtYXQgc3BlY2lmaWVyIGZvciB0aGUgcGFyYW1ldGVyIG5hbWUgc3RyaW5nLCB0byBiZSByZXBsYWNlZCBieSBhbiBpbmRleCB2YWx1ZS4gIFRoZSBwYXJhbWV0ZXIgbmFtZSBzdHJpbmcgbXVzdCBjb250YWluCisgICAgLy8vIG9uZSBmb3JtYXQgc3BlY2lmaWVyIGZvciBlYWNoIGluZGV4IHZhbHVlIHNwZWNpZmllZC4KKyAgICBjb25zdCBjaGFyICpjb25zdCBJbmRleEZvcm1hdFNwZWNpZmllciA9ICIlaSI7CisKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIFBhcmFtZXRlck5hbWUgb2JqZWN0IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2l0aG91dCBmb3JtYXR0aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBQYXJhbWF0ZXIgbmFtZSBzdHJpbmcgd2l0aG91dCBmb3JtYXQgc3BlY2lmaWVycy4KKyAgICAgKgorICAgICAqIEBwcmUgVGhlIHNvdXJjZSBzdHJpbmcgbXVzdCBub3QgY29udGFpbiB0aGUgJWkgZm9ybWF0IHNwZWNpZmllci4KKyAgICAgKi8KKyAgICBQYXJhbWV0ZXJOYW1lKGNvbnN0IGNoYXIgKnNvdXJjZSkgOiBzb3VyY2VfKHNvdXJjZSksIGFyZ3NfKG51bGxwdHIpLCBudW1faW5kaWNlc18oMCkgeyBhc3NlcnQoSXNWYWxpZCgpKTsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgUGFyYW1ldGVyTmFtZSBvYmplY3QgZnJvbSBhIHN0cmluZyBsaXRlcmFsLCB3aXRoIGZvcm1hdHRpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIFBhcmFtYXRlciBuYW1lIHN0cmluZyB3aXRoIGZvcm1hdCBzcGVjaWZpZXJzLgorICAgICAqIEBwYXJhbSBhcmdzIEFycmF5IGluZGV4IHZhbHVlcyB0byBiZSB1c2VkIGZvciBmb3JtYXR0aW5nLgorICAgICAqCisgICAgICogQHByZSBUaGUgbnVtYmVyIG9mICVpIGZvcm1hdCBzcGVjaWZpZXJzIGNvbnRhaW5lZCBieSB0aGUgc291cmNlIHN0cmluZyBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkCisgICAgICogICAgICBieSB0aGUgaW5kZXggdmVjdG9yLgorICAgICAqLworICAgIFBhcmFtZXRlck5hbWUoY29uc3QgY2hhciAqc291cmNlLCBjb25zdCBJbmRleFZlY3RvciAmYXJncykKKyAgICAgICAgOiBzb3VyY2VfKHNvdXJjZSksIGFyZ3NfKGFyZ3Muc2l6ZSgpID8gYXJncy5iZWdpbigpIDogKGNvbnN0IHNpemVfdCAqKW51bGxwdHIpLCBudW1faW5kaWNlc18oYXJncy5zaXplKCkpIHsKKyAgICAgICAgYXNzZXJ0KElzVmFsaWQoKSk7CisgICAgfQorCisgICAgLy8vIFJldHJpdmUgdGhlIGZvcm1hdHRlZCBuYW1lIHN0cmluZy4KKyAgICBzdGQ6OnN0cmluZyBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIChudW1faW5kaWNlc18gPT0gMCkgPyBzdGQ6OnN0cmluZyhzb3VyY2VfKSA6IEZvcm1hdCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gUmVwbGFjZSB0aGUgJWkgZm9ybWF0IHNwZWNpZmllcnMgaW4gdGhlIHNvdXJjZSBzdHJpbmcgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIGluZGV4IHZlY3Rvci4KKyAgICBzdGQ6OnN0cmluZyBGb3JtYXQoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgY3VycmVudCA9IDA7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdCA9IDA7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGZvcm1hdDsKKworICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2Uoc291cmNlXyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1faW5kaWNlc187ICsraSkgeworICAgICAgICAgICAgYXV0byBpbmRleCA9IGFyZ3NfW2ldOworICAgICAgICAgICAgY3VycmVudCA9IHNvdXJjZS5maW5kKEluZGV4Rm9ybWF0U3BlY2lmaWVyLCBsYXN0KTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQgPDwgc291cmNlLnN1YnN0cihsYXN0LCAoY3VycmVudCAtIGxhc3QpKSA8PCBpbmRleDsKKyAgICAgICAgICAgIGxhc3QgPSBjdXJyZW50ICsgc3RybGVuKEluZGV4Rm9ybWF0U3BlY2lmaWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcm1hdCA8PCBzb3VyY2Uuc3Vic3RyKGxhc3QsIHN0ZDo6c3RyaW5nOjpucG9zKTsKKworICAgICAgICByZXR1cm4gZm9ybWF0LnN0cigpOworICAgIH0KKworICAgIC8vLyBDaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgJWkgZm9ybWF0IHNwZWNpZmllcnMgaW4gdGhlIHNvdXJjZSBzdHJpbmcgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRleCB2ZWN0b3IuCisgICAgYm9vbCBJc1ZhbGlkKCkgeworICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VyYW5jZXMgb2YgdGhlIGZvcm1hdCBzcGVjaWZpZXIKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAwOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZShzb3VyY2VfKTsKKworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHNvdXJjZS5maW5kKEluZGV4Rm9ybWF0U3BlY2lmaWVyKTsKKworICAgICAgICB3aGlsZSAocG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICArK2NvdW50OworICAgICAgICAgICAgcG9zID0gc291cmNlLmZpbmQoSW5kZXhGb3JtYXRTcGVjaWZpZXIsIHBvcyArIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChjb3VudCA9PSBudW1faW5kaWNlc18pOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGNoYXIgKnNvdXJjZV87ICAvLy88IEZvcm1hdCBzdHJpbmcuCisgICAgY29uc3Qgc2l6ZV90ICphcmdzXzsgIC8vLzwgQXJyYXkgaW5kZXggdmFsdWVzIGZvciBmb3JtYXR0aW5nLgorICAgIHNpemVfdCBudW1faW5kaWNlc187ICAvLy88IE51bWJlciBvZiBhcnJheSBpbmRleCB2YWx1ZXMuCit9OworCisjZW5kaWYgIC8vIFBBUkFNRVRFUl9OQU1FX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9wYXJhbWV0ZXJfdmFsaWRhdGlvbl91dGlscy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvcGFyYW1ldGVyX3ZhbGlkYXRpb25fdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTIxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvcGFyYW1ldGVyX3ZhbGlkYXRpb25fdXRpbHMuY3BwCkBAIC0wLDAgKzEsMzc3MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogSm9obiBadWxhdWYgPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqLworCisjZGVmaW5lIE5PTUlOTUFYCisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgImNoYXNzaXMuaCIKKyNpbmNsdWRlICJzdGF0ZWxlc3NfdmFsaWRhdGlvbi5oIgorI2luY2x1ZGUgImxheWVyX2NoYXNzaXNfZGlzcGF0Y2guaCIKKworc3RhdGljIGNvbnN0IGludCBNYXhQYXJhbUNoZWNrZXJTdHJpbmdMZW5ndGggPSAyNTY7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIGJvb2wgaW5faW5jbHVzaXZlX3JhbmdlKGNvbnN0IFQgJnZhbHVlLCBjb25zdCBUICZtaW4sIGNvbnN0IFQgJm1heCkgeworICAgIC8vIFVzaW5nIG9ubHkgPCBmb3IgZ2VuZXJhbGl0eSBhbmQgfHwgZm9yIGVhcmx5IGFib3J0CisgICAgcmV0dXJuICEoKHZhbHVlIDwgbWluKSB8fCAobWF4IDwgdmFsdWUpKTsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjp2YWxpZGF0ZV9zdHJpbmcoY29uc3QgY2hhciAqYXBpTmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmc3RyaW5nTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWxpZGF0ZVN0cmluZykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgVmtTdHJpbmdFcnJvckZsYWdzIHJlc3VsdCA9IHZrX3N0cmluZ192YWxpZGF0ZShNYXhQYXJhbUNoZWNrZXJTdHJpbmdMZW5ndGgsIHZhbGlkYXRlU3RyaW5nKTsKKworICAgIGlmIChyZXN1bHQgPT0gVktfU1RSSU5HX0VSUk9SX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIHNraXA7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgJiBWS19TVFJJTkdfRVJST1JfTEVOR1RIKSB7CisgICAgICAgIHNraXAgPSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHN0cmluZyAlcyBleGNlZWRzIG1heCBsZW5ndGggJWQiLCBhcGlOYW1lLCBzdHJpbmdOYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgTWF4UGFyYW1DaGVja2VyU3RyaW5nTGVuZ3RoKTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAmIFZLX1NUUklOR19FUlJPUl9CQURfREFUQSkgeworICAgICAgICBza2lwID0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzdHJpbmcgJXMgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIG9yIGlzIGJhZGx5IGZvcm1lZCIsIGFwaU5hbWUsIHN0cmluZ05hbWUuZ2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6dmFsaWRhdGVfYXBpX3ZlcnNpb24odWludDMyX3QgYXBpX3ZlcnNpb24sIHVpbnQzMl90IGVmZmVjdGl2ZV9hcGlfdmVyc2lvbikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHVpbnQzMl90IGFwaV92ZXJzaW9uX25vcGF0Y2ggPSBWS19NQUtFX1ZFUlNJT04oVktfVkVSU0lPTl9NQUpPUihhcGlfdmVyc2lvbiksIFZLX1ZFUlNJT05fTUlOT1IoYXBpX3ZlcnNpb24pLCAwKTsKKyAgICBpZiAoYXBpX3ZlcnNpb25fbm9wYXRjaCAhPSBlZmZlY3RpdmVfYXBpX3ZlcnNpb24pIHsKKyAgICAgICAgaWYgKGFwaV92ZXJzaW9uX25vcGF0Y2ggPCBWS19BUElfVkVSU0lPTl8xXzApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTlNUQU5DRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoaW5zdGFuY2UpLCBrVlVJRFVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBDcmVhdGVJbnN0YW5jZS0+cENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8uYXBpVmVyc2lvbiBudW1iZXIgKDB4JTA4eCkuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNpbmcgVktfQVBJX1ZFUlNJT05fJSIgUFJJdTMyICJfJSIgUFJJdTMyICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfdmVyc2lvbiwgVktfVkVSU0lPTl9NQUpPUihlZmZlY3RpdmVfYXBpX3ZlcnNpb24pLCBWS19WRVJTSU9OX01JTk9SKGVmZmVjdGl2ZV9hcGlfdmVyc2lvbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGluc3RhbmNlKSwga1ZVSURVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBDcmVhdGVJbnN0YW5jZS0+cENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8uYXBpVmVyc2lvbiBudW1iZXIgKDB4JTA4eCkuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzdW1pbmcgVktfQVBJX1ZFUlNJT05fJSIgUFJJdTMyICJfJSIgUFJJdTMyICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfdmVyc2lvbiwgVktfVkVSU0lPTl9NQUpPUihlZmZlY3RpdmVfYXBpX3ZlcnNpb24pLCBWS19WRVJTSU9OX01JTk9SKGVmZmVjdGl2ZV9hcGlfdmVyc2lvbikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OnZhbGlkYXRlX2luc3RhbmNlX2V4dGVuc2lvbnMoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gQ3JlYXRlIGFuZCB1c2UgYSBsb2NhbCBpbnN0YW5jZSBleHRlbnNpb24gb2JqZWN0LCBhcyBhbiBhY3R1YWwgaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0CisgICAgdWludDMyX3Qgc3BlY2lmaWVkX3ZlcnNpb24gPSAocENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8gPyBwQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mby0+YXBpVmVyc2lvbiA6IFZLX0FQSV9WRVJTSU9OXzFfMCk7CisgICAgSW5zdGFuY2VFeHRlbnNpb25zIGxvY2FsX2luc3RhbmNlX2V4dGVuc2lvbnM7CisgICAgbG9jYWxfaW5zdGFuY2VfZXh0ZW5zaW9ucy5Jbml0RnJvbUluc3RhbmNlQ3JlYXRlSW5mbyhzcGVjaWZpZWRfdmVyc2lvbiwgcENyZWF0ZUluZm8pOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2V4dGVuc2lvbl9yZXFzKGxvY2FsX2luc3RhbmNlX2V4dGVuc2lvbnMsICJWVUlELXZrQ3JlYXRlSW5zdGFuY2UtcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtMDEzODgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSIsIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHRlbnNpb25TdGF0ZT4KK0V4dEVuYWJsZWQgZXh0ZW5zaW9uX3N0YXRlX2J5X25hbWUoY29uc3QgRXh0ZW5zaW9uU3RhdGUgJmV4dGVuc2lvbnMsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbl9uYW1lKSB7CisgICAgaWYgKCFleHRlbnNpb25fbmFtZSkgcmV0dXJuIGtOb3RFbmFibGVkOyAgLy8gbnVsbCBzdHJpbmdzIHNwZWNpZnkgbm90aGluZworICAgIGF1dG8gaW5mbyA9IEV4dGVuc2lvblN0YXRlOjpnZXRfaW5mbyhleHRlbnNpb25fbmFtZSk7CisgICAgRXh0RW5hYmxlZCBzdGF0ZSA9CisgICAgICAgIGluZm8uc3RhdGUgPyBleHRlbnNpb25zLiooaW5mby5zdGF0ZSkgOiBrTm90RW5hYmxlZDsgIC8vIHVua25vd24gZXh0ZW5zaW9ucyBjYW4ndCBiZSBlbmFibGVkIGluIGV4dGVuc2lvbiBzdHJ1Y3QKKyAgICByZXR1cm4gc3RhdGU7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZUluc3RhbmNlKGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UgKnBJbnN0YW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIC8vIE5vdGU6IEZyb20gdGhlIHNwZWMtLQorICAgIC8vICBQcm92aWRpbmcgYSBOVUxMIFZrSW5zdGFuY2VDcmVhdGVJbmZvOjpwQXBwbGljYXRpb25JbmZvIG9yIHByb3ZpZGluZyBhbiBhcGlWZXJzaW9uIG9mIDAgaXMgZXF1aXZhbGVudCB0byBwcm92aWRpbmcKKyAgICAvLyAgYW4gYXBpVmVyc2lvbiBvZiBWS19NQUtFX1ZFUlNJT04oMSwgMCwgMCkuICAoYS5rLmEuIFZLX0FQSV9WRVJTSU9OXzFfMCkKKyAgICB1aW50MzJfdCBsb2NhbF9hcGlfdmVyc2lvbiA9IChwQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mbyAmJiBwQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mby0+YXBpVmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvLT5hcGlWZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWS19BUElfVkVSU0lPTl8xXzA7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcGlfdmVyc2lvbihsb2NhbF9hcGlfdmVyc2lvbiwgYXBpX3ZlcnNpb24pOworICAgIHNraXAgfD0gdmFsaWRhdGVfaW5zdGFuY2VfZXh0ZW5zaW9ucyhwQ3JlYXRlSW5mbyk7CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3ZvaWQgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UG9zdENhbGxSZWNvcmRDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0luc3RhbmNlICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgYXV0byBpbnN0YW5jZV9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoKnBJbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICAvLyBDb3B5IGV4dGVuc2lvbiBkYXRhIGludG8gbG9jYWwgb2JqZWN0CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgdGhpcy0+aW5zdGFuY2VfZXh0ZW5zaW9ucyA9IGluc3RhbmNlX2RhdGEtPmluc3RhbmNlX2V4dGVuc2lvbnM7Cit9CisKK3ZvaWQgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UG9zdENhbGxSZWNvcmRRdWV1ZVByZXNlbnRLSFIoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb0tIUiAqcFByZXNlbnRJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudDsgKytpKSB7CisgICAgICAgIGF1dG8gc3dhcGNoYWluc19yZXN1bHQgPSBwUHJlc2VudEluZm8tPnBSZXN1bHRzID8gcFByZXNlbnRJbmZvLT5wUmVzdWx0c1tpXSA6IHJlc3VsdDsKKyAgICAgICAgaWYgKHN3YXBjaGFpbnNfcmVzdWx0ID09IFZLX1NVQk9QVElNQUxfS0hSKSB7CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUENIQUlOX0tIUl9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaV0pLCBrVlVJRF9QVlBlcmZXYXJuX1N1Ym9wdGltYWxTd2FwY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICJ2a1F1ZXVlUHJlc2VudEtIUjogJXMgOlZLX1NVQk9QVElNQUxfS0hSIHdhcyByZXR1cm5lZC4gVktfU1VCT1BUSU1BTF9LSFIgLSBQcmVzZW50YXRpb24gd2lsbCBzdGlsbCBzdWNjZWVkLCAiCisgICAgICAgICAgICAgICAgICAgICJzdWJqZWN0IHRvIHRoZSB3aW5kb3cgcmVzaXplIGJlaGF2aW9yLCBidXQgdGhlIHN3YXBjaGFpbiBpcyBubyBsb25nZXIgY29uZmlndXJlZCBvcHRpbWFsbHkgZm9yIHRoZSBzdXJmYWNlIGl0ICIKKyAgICAgICAgICAgICAgICAgICAgInRhcmdldHMuIEFwcGxpY2F0aW9ucyBzaG91bGQgcXVlcnkgdXBkYXRlZCBzdXJmYWNlIGluZm9ybWF0aW9uIGFuZCByZWNyZWF0ZSB0aGVpciBzd2FwY2hhaW4gYXQgdGhlIG5leHQgIgorICAgICAgICAgICAgICAgICAgICAiY29udmVuaWVudCBvcHBvcnR1bml0eS4iLAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaV0pLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFN0YXRlbGVzc1ZhbGlkYXRpb246OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGF1dG8gZGV2aWNlX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleSgqcERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybjsKKyAgICBWYWxpZGF0aW9uT2JqZWN0ICp2YWxpZGF0aW9uX2RhdGEgPSBHZXRWYWxpZGF0aW9uT2JqZWN0KGRldmljZV9kYXRhLT5vYmplY3RfZGlzcGF0Y2gsIExheWVyT2JqZWN0VHlwZVBhcmFtZXRlclZhbGlkYXRpb24pOworICAgIFN0YXRlbGVzc1ZhbGlkYXRpb24gKnN0YXRlbGVzc192YWxpZGF0aW9uID0gc3RhdGljX2Nhc3Q8U3RhdGVsZXNzVmFsaWRhdGlvbiAqPih2YWxpZGF0aW9uX2RhdGEpOworCisgICAgLy8gUGFybWV0ZXIgdmFsaWRhdGlvbiBhbHNvIHVzZXMgZXh0ZW5zaW9uIGRhdGEKKyAgICBzdGF0ZWxlc3NfdmFsaWRhdGlvbi0+ZGV2aWNlX2V4dGVuc2lvbnMgPSB0aGlzLT5kZXZpY2VfZXh0ZW5zaW9uczsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIGRldmljZV9wcm9wZXJ0aWVzID0ge307CisgICAgLy8gTmVlZCB0byBnZXQgaW5zdGFuY2UgYW5kIGRvIGEgZ2V0bGF5ZXJkYXRhIGNhbGwuLi4KKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgJmRldmljZV9wcm9wZXJ0aWVzKTsKKyAgICBtZW1jcHkoJnN0YXRlbGVzc192YWxpZGF0aW9uLT5kZXZpY2VfbGltaXRzLCAmZGV2aWNlX3Byb3BlcnRpZXMubGltaXRzLCBzaXplb2YoVmtQaHlzaWNhbERldmljZUxpbWl0cykpOworCisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX252X3NoYWRpbmdfcmF0ZV9pbWFnZSkgeworICAgICAgICAvLyBHZXQgdGhlIG5lZWRlZCBzaGFkaW5nIHJhdGUgaW1hZ2UgbGltaXRzCisgICAgICAgIGF1dG8gc2hhZGluZ19yYXRlX2ltYWdlX3Byb3BzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkaW5nUmF0ZUltYWdlUHJvcGVydGllc05WPigpOworICAgICAgICBhdXRvIHByb3AyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUj4oJnNoYWRpbmdfcmF0ZV9pbWFnZV9wcm9wcyk7CisgICAgICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgJnByb3AyKTsKKyAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLnNoYWRpbmdfcmF0ZV9pbWFnZV9wcm9wcyA9IHNoYWRpbmdfcmF0ZV9pbWFnZV9wcm9wczsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfbWVzaF9zaGFkZXIpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBuZWVkZWQgbWVzaCBzaGFkZXIgbGltaXRzCisgICAgICAgIGF1dG8gbWVzaF9zaGFkZXJfcHJvcHMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY+KCk7CisgICAgICAgIGF1dG8gcHJvcDIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSPigmbWVzaF9zaGFkZXJfcHJvcHMpOworICAgICAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIocGh5c2ljYWxEZXZpY2UsICZwcm9wMik7CisgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5tZXNoX3NoYWRlcl9wcm9wcyA9IG1lc2hfc2hhZGVyX3Byb3BzOworICAgIH0KKworICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9yYXlfdHJhY2luZykgeworICAgICAgICAvLyBHZXQgdGhlIG5lZWRlZCByYXkgdHJhY2luZyBsaW1pdHMKKyAgICAgICAgYXV0byByYXlfdHJhY2luZ19wcm9wcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVj4oKTsKKyAgICAgICAgYXV0byBwcm9wMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFI+KCZyYXlfdHJhY2luZ19wcm9wcyk7CisgICAgICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgJnByb3AyKTsKKyAgICAgICAgcGh5c19kZXZfZXh0X3Byb3BzLnJheV90cmFjaW5nX3Byb3BzID0gcmF5X3RyYWNpbmdfcHJvcHM7CisgICAgfQorCisgICAgc3RhdGVsZXNzX3ZhbGlkYXRpb24tPnBoeXNfZGV2X2V4dF9wcm9wcyA9IHRoaXMtPnBoeXNfZGV2X2V4dF9wcm9wczsKKworICAgIC8vIFNhdmUgYXBwLWVuYWJsZWQgZmVhdHVyZXMgaW4gdGhpcyBkZXZpY2UncyB2YWxpZGF0aW9uIG9iamVjdAorICAgIC8vIFRoZSBlbmFibGVkIGZlYXR1cmVzIGNhbiBjb21lIGZyb20gZWl0aGVyIHBFbmFibGVkRmVhdHVyZXMsIG9yIGZyb20gdGhlIHBOZXh0IGNoYWluCisgICAgY29uc3QgYXV0byAqZmVhdHVyZXMyID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgdG1wX2ZlYXR1cmVzMl9zdGF0ZTsKKyAgICB0bXBfZmVhdHVyZXMyX3N0YXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzI7CisgICAgaWYgKGZlYXR1cmVzMikgeworICAgICAgICB0bXBfZmVhdHVyZXMyX3N0YXRlLmZlYXR1cmVzID0gZmVhdHVyZXMyLT5mZWF0dXJlczsKKyAgICB9IGVsc2UgaWYgKHBDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzKSB7CisgICAgICAgIHRtcF9mZWF0dXJlczJfc3RhdGUuZmVhdHVyZXMgPSAqcENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wX2ZlYXR1cmVzMl9zdGF0ZS5mZWF0dXJlcyA9IHt9OworICAgIH0KKyAgICAvLyBVc2UgcENyZWF0ZUluZm8tPnBOZXh0IHRvIGdldCBmdWxsIGNoYWluCisgICAgdG1wX2ZlYXR1cmVzMl9zdGF0ZS5wTmV4dCA9IFNhZmVQbmV4dENvcHkocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBzdGF0ZWxlc3NfdmFsaWRhdGlvbi0+cGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzMiA9IHRtcF9mZWF0dXJlczJfc3RhdGU7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRMYXllckNvdW50OyBpKyspIHsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJpbmcoInZrQ3JlYXRlRGV2aWNlIiwgInBDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBwRW5hYmxlZExheWVyTmFtZXMtcGFyYW1ldGVyIiwgcENyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXNbaV0pOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIHZhbGlkYXRlX3N0cmluZygidmtDcmVhdGVEZXZpY2UiLCAicENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RldmljZUNyZWF0ZUluZm8tcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtcGFyYW1ldGVyIiwgcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9leHRlbnNpb25fcmVxcyhkZXZpY2VfZXh0ZW5zaW9ucywgIlZVSUQtdmtDcmVhdGVEZXZpY2UtcHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMtMDEzODciLCAiZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgIH0KKworICAgIHsKKyAgICAgICAgYm9vbCBtYWludDEgPSBJc0V4dEVuYWJsZWQoZXh0ZW5zaW9uX3N0YXRlX2J5X25hbWUoZGV2aWNlX2V4dGVuc2lvbnMsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKTsKKyAgICAgICAgYm9vbCBuZWdhdGl2ZV92aWV3cG9ydCA9CisgICAgICAgICAgICBJc0V4dEVuYWJsZWQoZXh0ZW5zaW9uX3N0YXRlX2J5X25hbWUoZGV2aWNlX2V4dGVuc2lvbnMsIFZLX0FNRF9ORUdBVElWRV9WSUVXUE9SVF9IRUlHSFRfRVhURU5TSU9OX05BTUUpKTsKKyAgICAgICAgaWYgKG1haW50MSAmJiBuZWdhdGl2ZV92aWV3cG9ydCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy0wMDM3NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrRGV2aWNlQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgbXVzdCBub3Qgc2ltdWx0YW5lb3VzbHkgaW5jbHVkZSBWS19LSFJfbWFpbnRlbmFuY2UxIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0FNRF9uZWdhdGl2ZV92aWV3cG9ydF9oZWlnaHQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIGJvb2wga2hyX2JkYSA9IElzRXh0RW5hYmxlZChleHRlbnNpb25fc3RhdGVfYnlfbmFtZShkZXZpY2VfZXh0ZW5zaW9ucywgVktfS0hSX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19FWFRFTlNJT05fTkFNRSkpOworICAgICAgICBib29sIGV4dF9iZGEgPSBJc0V4dEVuYWJsZWQoZXh0ZW5zaW9uX3N0YXRlX2J5X25hbWUoZGV2aWNlX2V4dGVuc2lvbnMsIFZLX0VYVF9CVUZGRVJfREVWSUNFX0FERFJFU1NfRVhURU5TSU9OX05BTUUpKTsKKyAgICAgICAgaWYgKGtocl9iZGEgJiYgZXh0X2JkYSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGV2aWNlQ3JlYXRlSW5mby1wcEVuYWJsZWRFeHRlbnNpb25OYW1lcy0wMzMyOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrRGV2aWNlQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgbXVzdCBub3QgY29udGFpbiBib3RoIFZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcy4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwQ3JlYXRlSW5mby0+cE5leHQgIT0gTlVMTCAmJiBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlcykgeworICAgICAgICAvLyBDaGVjayBmb3IgZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiBzdHJ1Y3QKKyAgICAgICAgY29uc3QgYXV0byAqZmVhdHVyZXMyID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKGZlYXR1cmVzMikgeworICAgICAgICAgICAgLy8gQ2Fubm90IGluY2x1ZGUgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBhbmQgaGF2ZSBub24tbnVsbCBwRW5hYmxlZEZlYXR1cmVzCisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9JbnZhbGlkVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrRGV2aWNlQ3JlYXRlSW5mby0+cE5leHQgaW5jbHVkZXMgYSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHN0cnVjdCB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBFbmFibGVkRmVhdHVyZXMgaXMgbm9uLU5VTEwuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGZlYXR1cmVzMikgeworICAgICAgICBpZiAoIWluc3RhbmNlX2V4dGVuc2lvbnMudmtfa2hyX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9FeHRlbnNpb25Ob3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0RldmljZUNyZWF0ZUluZm8tPnBOZXh0IGluY2x1ZGVzIGEgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBzdHJ1Y3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIgbXVzdCBiZSBlbmFibGVkIHdoZW4gaXQgY3JlYXRlcyBhbiBpbnN0YW5jZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yX2ZlYXR1cmVzID0KKyAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVD4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAodmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yX2ZlYXR1cmVzKSB7CisgICAgICAgIGJvb2wgZXh0ZW5zaW9uX2ZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmICgwID09IHN0cm5jbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19FWFRfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRSkpIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZXh0ZW5zaW9uX2ZvdW5kKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9FeHRlbnNpb25Ob3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0RldmljZUNyZWF0ZUluZm8tPnBOZXh0IGluY2x1ZGVzIGEgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JGZWF0dXJlc0VYVCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdCwgVktfRVhUX3ZlcnRleF9hdHRyaWJ1dGVfZGl2aXNvciBtdXN0IGJlIGVuYWJsZWQgd2hlbiBpdCBjcmVhdGVzIGEgZGV2aWNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgcENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zCisgICAgaWYgKHBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvcykgeworICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHNldDsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPnF1ZXVlQ3JlYXRlSW5mb0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlcXVlc3RlZF9xdWV1ZV9mYW1pbHkgPSBwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucXVldWVGYW1pbHlJbmRleDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRfcXVldWVfZmFtaWx5ID09IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBoeXNpY2FsRGV2aWNlKSwgIlZVSUQtVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8tcXVldWVGYW1pbHlJbmRleC0wMDM4MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZURldmljZTogcENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXS5xdWV1ZUZhbWlseUluZGV4IGlzIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELCBidXQgaXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBhIHZhbGlkIHF1ZXVlIGZhbWlseSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCB2YWx1ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0LmNvdW50KHJlcXVlc3RlZF9xdWV1ZV9mYW1pbHkpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBoeXNpY2FsRGV2aWNlKSwgIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXF1ZXVlRmFtaWx5SW5kZXgtMDAzNzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXZpY2U6IHBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1slIiBQUkl1MzIgIl0ucXVldWVGYW1pbHlJbmRleCAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBub3QgdW5pcXVlIHdpdGhpbiBwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3MgYXJyYXkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVxdWVzdGVkX3F1ZXVlX2ZhbWlseSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNldC5pbnNlcnQocmVxdWVzdGVkX3F1ZXVlX2ZhbWlseSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucFF1ZXVlUHJpb3JpdGllcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBDcmVhdGVJbmZvLT5wUXVldWVDcmVhdGVJbmZvc1tpXS5xdWV1ZUNvdW50OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcXVldWVfcHJpb3JpdHkgPSBwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucFF1ZXVlUHJpb3JpdGllc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocXVldWVfcHJpb3JpdHkgPj0gMC5mKSB8fCAhKHF1ZXVlX3ByaW9yaXR5IDw9IDEuZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBoeXNpY2FsRGV2aWNlKSwgIlZVSUQtVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8tcFF1ZXVlUHJpb3JpdGllcy0wMDM4MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRGV2aWNlOiBwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbJSIgUFJJdTMyICJdLnBRdWV1ZVByaW9yaXRpZXNbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gKD0lZikgaXMgbm90IGJldHdlZW4gMCBhbmQgMSAoaW5jbHVzaXZlKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIHF1ZXVlX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OnJlcXVpcmVfZGV2aWNlX2V4dGVuc2lvbihib29sIGZsYWcsIGNoYXIgY29uc3QgKmZ1bmN0aW9uX25hbWUsIGNoYXIgY29uc3QgKmV4dGVuc2lvbl9uYW1lKSBjb25zdCB7CisgICAgaWYgKCFmbGFnKSB7CisgICAgICAgIHJldHVybiBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX0V4dGVuc2lvbk5vdEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICIlcygpIGNhbGxlZCBldmVuIHRob3VnaCB0aGUgJXMgZXh0ZW5zaW9uIHdhcyBub3QgZW5hYmxlZCBmb3IgdGhpcyBWa0RldmljZS4iLCBmdW5jdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVCdWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtCdWZmZXIgKnBCdWZmZXIpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IExvZ01pc2NQYXJhbXMgbG9nX21pc2N7VktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQsIFZLX05VTExfSEFORExFLCAidmtDcmVhdGVCdWZmZXIifTsKKworICAgIGlmIChwQ3JlYXRlSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVHcmVhdGVyVGhhblplcm8ocENyZWF0ZUluZm8tPnNpemUsICJwQ3JlYXRlSW5mby0+c2l6ZSIsICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaXplLTAwOTEyIiwgbG9nX21pc2MpOworCisgICAgICAgIC8vIFZhbGlkYXRpb24gZm9yIHBhcmFtZXRlcnMgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHZhbGlkYXRpb24gY29kZSBkdWUgdG8gYSAnbm9hdXRvdmFsaWRpdHknIHRhZyBpbiB2ay54bWwKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5zaGFyaW5nTW9kZSA9PSBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCkgeworICAgICAgICAgICAgLy8gSWYgc2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHF1ZXVlRmFtaWx5SW5kZXhDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxCisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA8PSAxKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDA5MTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVCdWZmZXI6IGlmIHBDcmVhdGVJbmZvLT5zaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBzaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgcFF1ZXVlRmFtaWx5SW5kaWNlcyBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZgorICAgICAgICAgICAgLy8gcXVldWVGYW1pbHlJbmRleENvdW50IHVpbnQzMl90IHZhbHVlcworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMDkxMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUJ1ZmZlcjogaWYgcENyZWF0ZUluZm8tPnNoYXJpbmdNb2RlIGlzIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5ULCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50IHVpbnQzMl90IHZhbHVlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGZsYWdzIGNvbnRhaW5zIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgb3IgVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQsIGl0IG11c3QgYWxzbyBjb250YWluCisgICAgICAgIC8vIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUCisgICAgICAgIGlmICgoKHBDcmVhdGVJbmZvLT5mbGFncyAmIChWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIHwgVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQpKSAhPSAwKSAmJgorICAgICAgICAgICAgKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCkgIT0gVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAwOTE4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVCdWZmZXI6IGlmIHBDcmVhdGVJbmZvLT5mbGFncyBjb250YWlucyBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfQlVGRkVSX0NSRUFURV9TUEFSU0VfQUxJQVNFRF9CSVQsIGl0IG11c3QgYWxzbyBjb250YWluIFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZUltYWdlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0ltYWdlICpwSW1hZ2UpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IExvZ01pc2NQYXJhbXMgbG9nX21pc2N7VktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgVktfTlVMTF9IQU5ETEUsICJ2a0NyZWF0ZUltYWdlIn07CisKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICAvLyBWYWxpZGF0aW9uIGZvciBwYXJhbWV0ZXJzIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB2YWxpZGF0aW9uIGNvZGUgZHVlIHRvIGEgJ25vYXV0b3ZhbGlkaXR5JyB0YWcgaW4gdmsueG1sCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+c2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQpIHsKKyAgICAgICAgICAgIC8vIElmIHNoYXJpbmdNb2RlIGlzIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5ULCBxdWV1ZUZhbWlseUluZGV4Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMQorICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5xdWV1ZUZhbWlseUluZGV4Q291bnQgPD0gMSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDA5NDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBpZiBwQ3JlYXRlSW5mby0+c2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvLT5xdWV1ZUZhbWlseUluZGV4Q291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgc2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHBRdWV1ZUZhbWlseUluZGljZXMgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKKyAgICAgICAgICAgIC8vIHF1ZXVlRmFtaWx5SW5kZXhDb3VudCB1aW50MzJfdCB2YWx1ZXMKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMDk0MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IGlmIHBDcmVhdGVJbmZvLT5zaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCB1aW50MzJfdCB2YWx1ZXMuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IFZhbGlkYXRlR3JlYXRlclRoYW5aZXJvKHBDcmVhdGVJbmZvLT5leHRlbnQud2lkdGgsICJwQ3JlYXRlSW5mby0+ZXh0ZW50LndpZHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDA5NDQiLCBsb2dfbWlzYyk7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVHcmVhdGVyVGhhblplcm8ocENyZWF0ZUluZm8tPmV4dGVudC5oZWlnaHQsICJwQ3JlYXRlSW5mby0+ZXh0ZW50LmhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZXh0ZW50LTAwOTQ1IiwgbG9nX21pc2MpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlR3JlYXRlclRoYW5aZXJvKHBDcmVhdGVJbmZvLT5leHRlbnQuZGVwdGgsICJwQ3JlYXRlSW5mby0+ZXh0ZW50LmRlcHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDA5NDYiLCBsb2dfbWlzYyk7CisKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUdyZWF0ZXJUaGFuWmVybyhwQ3JlYXRlSW5mby0+bWlwTGV2ZWxzLCAicENyZWF0ZUluZm8tPm1pcExldmVscyIsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMDk0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21pc2MpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlR3JlYXRlclRoYW5aZXJvKHBDcmVhdGVJbmZvLT5hcnJheUxheWVycywgInBDcmVhdGVJbmZvLT5hcnJheUxheWVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tYXJyYXlMYXllcnMtMDA5NDgiLCBsb2dfbWlzYyk7CisKKyAgICAgICAgLy8gSW5pdGlhbExheW91dCBtdXN0IGJlIFBSRUlOSVRJQUxJWkVEIG9yIFVOREVGSU5FRAorICAgICAgICBpZiAoKHBDcmVhdGVJbmZvLT5pbml0aWFsTGF5b3V0ICE9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQpICYmCisgICAgICAgICAgICAocENyZWF0ZUluZm8tPmluaXRpYWxMYXlvdXQgIT0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWluaXRpYWxMYXlvdXQtMDA5OTMiLAorICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IGluaXRpYWxMYXlvdXQgaXMgJXMsIG11c3QgYmUgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCBvciBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQuIiwKKyAgICAgICAgICAgICAgICBzdHJpbmdfVmtJbWFnZUxheW91dChwQ3JlYXRlSW5mby0+aW5pdGlhbExheW91dCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgaW1hZ2VUeXBlIGlzIFZLX0lNQUdFX1RZUEVfMUQsIGJvdGggZXh0ZW50LmhlaWdodCBhbmQgZXh0ZW50LmRlcHRoIG11c3QgYmUgMQorICAgICAgICBpZiAoKHBDcmVhdGVJbmZvLT5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8xRCkgJiYKKyAgICAgICAgICAgICgocENyZWF0ZUluZm8tPmV4dGVudC5oZWlnaHQgIT0gMSkgfHwgKHBDcmVhdGVJbmZvLT5leHRlbnQuZGVwdGggIT0gMSkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTU2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBpZiBwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlIGlzIFZLX0lNQUdFX1RZUEVfMUQsIGJvdGggcENyZWF0ZUluZm8tPmV4dGVudC5oZWlnaHQgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPmV4dGVudC5kZXB0aCBtdXN0IGJlIDEuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzJEKSB7CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPmZsYWdzICYgVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQpIHsKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPmV4dGVudC53aWR0aCAhPSBwQ3JlYXRlSW5mby0+ZXh0ZW50LmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk1NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBwQ3JlYXRlSW5mby0+ZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPmV4dGVudC53aWR0aCAoPSUiIFBSSXUzMiAiKSBhbmQgcENyZWF0ZUluZm8tPmV4dGVudC5oZWlnaHQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGFyZSBub3QgZXF1YWwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5leHRlbnQud2lkdGgsIHBDcmVhdGVJbmZvLT5leHRlbnQuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPmFycmF5TGF5ZXJzIDwgNikgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk1NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBwQ3JlYXRlSW5mby0+ZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPmFycmF5TGF5ZXJzICg9JSIgUFJJdTMyICIpIGlzIG5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPmFycmF5TGF5ZXJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+ZXh0ZW50LmRlcHRoICE9IDEpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTU3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBpZiBwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlIGlzIFZLX0lNQUdFX1RZUEVfMkQsIHBDcmVhdGVJbmZvLT5leHRlbnQuZGVwdGggbXVzdCBiZSAxLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gM0QgaW1hZ2UgbWF5IGhhdmUgb25seSAxIGxheWVyCisgICAgICAgIGlmICgocENyZWF0ZUluZm8tPmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzNEKSAmJiAocENyZWF0ZUluZm8tPmFycmF5TGF5ZXJzICE9IDEpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTYxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBpZiBwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlIGlzIFZLX0lNQUdFX1RZUEVfM0QsIHBDcmVhdGVJbmZvLT5hcnJheUxheWVycyBtdXN0IGJlIDEuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBtdWx0aS1zYW1wbGUsIHZhbGlkYXRlIHR5cGUsIHVzYWdlLCB0aWxpbmcgYW5kIG1pcCBsZXZlbHMuCisgICAgICAgIGlmICgocENyZWF0ZUluZm8tPnNhbXBsZXMgIT0gVktfU0FNUExFX0NPVU5UXzFfQklUKSAmJgorICAgICAgICAgICAgKChwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlICE9IFZLX0lNQUdFX1RZUEVfMkQpIHx8IChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVCkgfHwKKyAgICAgICAgICAgICAocENyZWF0ZUluZm8tPm1pcExldmVscyAhPSAxKSB8fCAocENyZWF0ZUluZm8tPnRpbGluZyAhPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2FtcGxlcy0wMjI1NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogTXVsdGktc2FtcGxlIGltYWdlIHdpdGggaW5jb21wYXRpYmxlIHR5cGUsIHVzYWdlLCB0aWxpbmcsIG9yIG1pcHMuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCAhPSAocENyZWF0ZUluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUKSkgeworICAgICAgICAgICAgVmtJbWFnZVVzYWdlRmxhZ3MgbGVnYWxfZmxhZ3MgPSAoVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklUKTsKKyAgICAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBvZiB0aGUgbGVnYWwgYXR0YWNobWVudCBiaXRzIG11c3QgYmUgc2V0CisgICAgICAgICAgICBpZiAoMCA9PSAocENyZWF0ZUluZm8tPnVzYWdlICYgbGVnYWxfZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMDk2NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IFRyYW5zaWVudCBhdHRhY2htZW50IGltYWdlIHdpdGhvdXQgYSBjb21wYXRpYmxlIGF0dGFjaG1lbnQgZmxhZyBzZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBObyBmbGFncyBvdGhlciB0aGFuIHRoZSBsZWdhbCBhdHRhY2htZW50IGJpdHMgbWF5IGJlIHNldAorICAgICAgICAgICAgbGVnYWxfZmxhZ3MgfD0gVktfSU1BR0VfVVNBR0VfVFJBTlNJRU5UX0FUVEFDSE1FTlRfQklUOworICAgICAgICAgICAgaWYgKDAgIT0gKHBDcmVhdGVJbmZvLT51c2FnZSAmIH5sZWdhbF9mbGFncykpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTYzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogVHJhbnNpZW50IGF0dGFjaG1lbnQgaW1hZ2Ugd2l0aCBpbmNvbXBhdGlibGUgdXNhZ2UgZmxhZ3Mgc2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWlwTGV2ZWxzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBjb21wbGV0ZSBtaXBtYXAgY2hhaW4KKyAgICAgICAgdWludDMyX3QgbWF4RGltID0gc3RkOjptYXgoc3RkOjptYXgocENyZWF0ZUluZm8tPmV4dGVudC53aWR0aCwgcENyZWF0ZUluZm8tPmV4dGVudC5oZWlnaHQpLCBwQ3JlYXRlSW5mby0+ZXh0ZW50LmRlcHRoKTsKKyAgICAgICAgLy8gTWF4IG1pcCBsZXZlbHMgaXMgZGlmZmVyZW50IGZvciBjb3JuZXItc2FtcGxlZCBpbWFnZXMgdnMgbm9ybWFsIGltYWdlcy4KKyAgICAgICAgdWludDMyX3QgbWF4TWlwTGV2ZWxzID0gKHBDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYpID8gKHVpbnQzMl90KShjZWlsKGxvZzIobWF4RGltKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh1aW50MzJfdCkoZmxvb3IobG9nMihtYXhEaW0pKSArIDEpOworICAgICAgICBpZiAobWF4RGltID4gMCAmJiBwQ3JlYXRlSW5mby0+bWlwTGV2ZWxzID4gbWF4TWlwTGV2ZWxzKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMDk1OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZSgpOiBwQ3JlYXRlSW5mby0+bWlwTGV2ZWxzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbG9vcihsb2cyKG1heChwQ3JlYXRlSW5mby0+ZXh0ZW50LndpZHRoLCBwQ3JlYXRlSW5mby0+ZXh0ZW50LmhlaWdodCwgcENyZWF0ZUluZm8tPmV4dGVudC5kZXB0aCkpKSsxLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVQpICYmIChwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlICE9IFZLX0lNQUdFX1RZUEVfM0QpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMDk1MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2UoKTogcENyZWF0ZUluZm8tPmZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV8yRF9BUlJBWV9DT01QQVRJQkxFX0JJVCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlIGlzIG5vdCBWS19JTUFHRV9UWVBFXzNELiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUKSAmJiAoIXBoeXNpY2FsX2RldmljZV9mZWF0dXJlcy5zcGFyc2VCaW5kaW5nKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCwgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDA5NjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlKCk6IHBDcmVhdGVJbmZvLT5mbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULCBidXQgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzcGFyc2VCaW5kaW5nIGZlYXR1cmUgaXMgZGlzYWJsZWQuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBmbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgb3IgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVCwgaXQgbXVzdCBhbHNvIGNvbnRhaW4KKyAgICAgICAgLy8gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVAorICAgICAgICBpZiAoKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiAoVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIHwgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVCkpICE9IDApICYmCisgICAgICAgICAgICAoKHBDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQpICE9IFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDA5ODciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlOiBpZiBwQ3JlYXRlSW5mby0+ZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVCwgaXQgbXVzdCBhbHNvIGNvbnRhaW4gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciBjb21iaW5hdGlvbnMgb2YgYXR0cmlidXRlcyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCBoYXZpbmcgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIHNldAorICAgICAgICBpZiAoKHBDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVCkgIT0gMCkgeworICAgICAgICAgICAgLy8gTGluZWFyIHRpbGluZyBpcyB1bnN1cHBvcnRlZAorICAgICAgICAgICAgaWYgKFZLX0lNQUdFX1RJTElOR19MSU5FQVIgPT0gcENyZWF0ZUluZm8tPnRpbGluZykgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9JbnZhbGlkVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlOiBpZiBwQ3JlYXRlSW5mby0+ZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUIHRoZW4gaW1hZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGlsaW5nIG9mIFZLX0lNQUdFX1RJTElOR19MSU5FQVIgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTcGFyc2UgMUQgaW1hZ2UgaXNuJ3QgdmFsaWQKKyAgICAgICAgICAgIGlmIChWS19JTUFHRV9UWVBFXzFEID09IHBDcmVhdGVJbmZvLT5pbWFnZVR5cGUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlOiBjYW5ub3Qgc3BlY2lmeSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUIGZvciAxRCBpbWFnZS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3BhcnNlIDJEIGltYWdlIHdoZW4gZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBpdAorICAgICAgICAgICAgaWYgKChWS19GQUxTRSA9PSBwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCkgJiYgKFZLX0lNQUdFX1RZUEVfMkQgPT0gcENyZWF0ZUluZm8tPmltYWdlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlOiBjYW5ub3Qgc3BlY2lmeSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUIGZvciAyRCBpbWFnZSBpZiBjb3JyZXNwb25kaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmUgaXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3BhcnNlIDNEIGltYWdlIHdoZW4gZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBpdAorICAgICAgICAgICAgaWYgKChWS19GQUxTRSA9PSBwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5SW1hZ2UzRCkgJiYgKFZLX0lNQUdFX1RZUEVfM0QgPT0gcENyZWF0ZUluZm8tPmltYWdlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlOiBjYW5ub3Qgc3BlY2lmeSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUIGZvciAzRCBpbWFnZSBpZiBjb3JyZXNwb25kaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmUgaXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTXVsdGktc2FtcGxlIDJEIGltYWdlIHdoZW4gZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBpdAorICAgICAgICAgICAgaWYgKFZLX0lNQUdFX1RZUEVfMkQgPT0gcENyZWF0ZUluZm8tPmltYWdlVHlwZSkgeworICAgICAgICAgICAgICAgIGlmICgoVktfRkFMU0UgPT0gcGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzKSAmJgorICAgICAgICAgICAgICAgICAgICAoVktfU0FNUExFX0NPVU5UXzJfQklUID09IHBDcmVhdGVJbmZvLT5zYW1wbGVzKSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2U6IGNhbm5vdCBzcGVjaWZ5IFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQgZm9yIDItc2FtcGxlIGltYWdlIGlmICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChWS19GQUxTRSA9PSBwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVktfU0FNUExFX0NPVU5UXzRfQklUID09IHBDcmVhdGVJbmZvLT5zYW1wbGVzKSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2U6IGNhbm5vdCBzcGVjaWZ5IFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQgZm9yIDQtc2FtcGxlIGltYWdlIGlmICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChWS19GQUxTRSA9PSBwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVktfU0FNUExFX0NPVU5UXzhfQklUID09IHBDcmVhdGVJbmZvLT5zYW1wbGVzKSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2U6IGNhbm5vdCBzcGVjaWZ5IFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQgZm9yIDgtc2FtcGxlIGltYWdlIGlmICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChWS19GQUxTRSA9PSBwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZLX1NBTVBMRV9DT1VOVF8xNl9CSVQgPT0gcENyZWF0ZUluZm8tPnNhbXBsZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZTogY2Fubm90IHNwZWNpZnkgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCBmb3IgMTYtc2FtcGxlIGltYWdlIGlmICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfU0hBRElOR19SQVRFX0lNQUdFX0JJVF9OVikgeworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5pbWFnZVR5cGUgIT0gVktfSU1BR0VfVFlQRV8yRCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAyMDgyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2U6IGlmIHVzYWdlIGluY2x1ZGVzIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlVHlwZSBtdXN0IGJlIFZLX0lNQUdFX1RZUEVfMkQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnNhbXBsZXMgIT0gVktfU0FNUExFX0NPVU5UXzFfQklUKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLTAyMDgzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2U6IGlmIHVzYWdlIGluY2x1ZGVzIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZXMgbXVzdCBiZSBWS19TQU1QTEVfQ09VTlRfMV9CSVQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnRpbGluZyAhPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdGlsaW5nLTAyMDg0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2U6IGlmIHVzYWdlIGluY2x1ZGVzIFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbGluZyBtdXN0IGJlIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5mbGFncyAmIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYpIHsKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlICE9IFZLX0lNQUdFX1RZUEVfMkQgJiYgcENyZWF0ZUluZm8tPmltYWdlVHlwZSAhPSBWS19JTUFHRV9UWVBFXzNEKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjA1MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlOiBJZiBmbGFncyBjb250YWlucyBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZVR5cGUgbXVzdCBiZSBWS19JTUFHRV9UWVBFXzJEIG9yIFZLX0lNQUdFX1RZUEVfM0QuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocENyZWF0ZUluZm8tPmZsYWdzICYgVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQpIHx8IEZvcm1hdElzRGVwdGhPclN0ZW5jaWwocENyZWF0ZUluZm8tPmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMDUxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2U6IElmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0IG11c3Qgbm90IGFsc28gY29udGFpbiBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVCBhbmQgZm9ybWF0IG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGJlIGEgZGVwdGgvc3RlbmNpbCBmb3JtYXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfMkQgJiYgKHBDcmVhdGVJbmZvLT5leHRlbnQud2lkdGggPT0gMSB8fCBwQ3JlYXRlSW5mby0+ZXh0ZW50LmhlaWdodCA9PSAxKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDIwNTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZTogSWYgZmxhZ3MgY29udGFpbnMgVktfSU1BR0VfQ1JFQVRFX0NPUk5FUl9TQU1QTEVEX0JJVF9OViBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VUeXBlIGlzIFZLX0lNQUdFX1RZUEVfMkQsIGV4dGVudC53aWR0aCBhbmQgZXh0ZW50LmhlaWdodCBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyZWF0ZXIgdGhhbiAxLiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwQ3JlYXRlSW5mby0+aW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfM0QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKHBDcmVhdGVJbmZvLT5leHRlbnQud2lkdGggPT0gMSB8fCBwQ3JlYXRlSW5mby0+ZXh0ZW50LmhlaWdodCA9PSAxIHx8IHBDcmVhdGVJbmZvLT5leHRlbnQuZGVwdGggPT0gMSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMDUzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2U6IElmIGZsYWdzIGNvbnRhaW5zIFZLX0lNQUdFX0NSRUFURV9DT1JORVJfU0FNUExFRF9CSVRfTlYgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlVHlwZSBpcyBWS19JTUFHRV9UWVBFXzNELCBleHRlbnQud2lkdGgsIGV4dGVudC5oZWlnaHQsIGFuZCBleHRlbnQuZGVwdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBncmVhdGVyIHRoYW4gMS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVWaWV3cG9ydChjb25zdCBWa1ZpZXdwb3J0ICZ2aWV3cG9ydCwgY29uc3QgY2hhciAqZm5fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtZXRlck5hbWUgJnBhcmFtZXRlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsIHVpbnQ2NF90IG9iamVjdCA9IDApIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIE5vdGU6IGZvciBudW1lcmljYWwgY29ycmVjdG5lc3MKKyAgICAvLyAgICAgICAtIGZsb2F0IGNvbXBhcmlzb25zIHNob3VsZCBleHBlY3QgTmFOIChjb21wYXJpc29uIGFsd2F5cyBmYWxzZSkuCisgICAgLy8gICAgICAgLSBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydERpbWVuc2lvbnMgaXMgdWludDMyX3QsIG5vdCBmbG9hdCAtPiBjYXJlZnVsLgorCisgICAgY29uc3QgYXV0byBmX2x0ZV91MzJfZXhhY3QgPSBbXShjb25zdCBmbG9hdCB2MV9mLCBjb25zdCB1aW50MzJfdCB2Ml91MzIpIHsKKyAgICAgICAgaWYgKHN0ZDo6aXNuYW4odjFfZikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHYxX2YgPD0gMC4wZikgcmV0dXJuIHRydWU7CisKKyAgICAgICAgZmxvYXQgaW50cGFydDsKKyAgICAgICAgY29uc3QgZmxvYXQgZnJhY3QgPSBtb2RmZih2MV9mLCAmaW50cGFydCk7CisKKyAgICAgICAgYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpyYWRpeCA9PSAyKTsKKyAgICAgICAgY29uc3QgZmxvYXQgdTMyX21heF9wbHVzMSA9IGxkZXhwZigxLjBmLCAzMik7ICAvLyBob3BlZnVsbHkgZXhhY3QKKyAgICAgICAgaWYgKGludHBhcnQgPj0gdTMyX21heF9wbHVzMSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHVpbnQzMl90IHYxX3UzMiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihpbnRwYXJ0KTsKKyAgICAgICAgaWYgKHYxX3UzMiA8IHYyX3UzMikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIGlmICh2MV91MzIgPT0gdjJfdTMyICYmIGZyYWN0ID09IDAuMGYpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisKKyAgICBjb25zdCBhdXRvIGZfbHRlX3UzMl9kaXJlY3QgPSBbXShjb25zdCBmbG9hdCB2MV9mLCBjb25zdCB1aW50MzJfdCB2Ml91MzIpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgdjJfZiA9IHN0YXRpY19jYXN0PGZsb2F0Pih2Ml91MzIpOyAgLy8gbm90IGFjY3VyYXRlIGZvciA+IHJhZGl4XmRpZ2l0czsgYW5kIHVuZGVmaW5lZCByb3VuZGluZyBtb2RlCisgICAgICAgIHJldHVybiAodjFfZiA8PSB2Ml9mKTsKKyAgICB9OworCisgICAgLy8gd2lkdGgKKyAgICBib29sIHdpZHRoX2hlYWx0aHkgPSB0cnVlOworICAgIGNvbnN0IGF1dG8gbWF4X3cgPSBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0RGltZW5zaW9uc1swXTsKKworICAgIGlmICghKHZpZXdwb3J0LndpZHRoID4gMC4wZikpIHsKKyAgICAgICAgd2lkdGhfaGVhbHRoeSA9IGZhbHNlOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCAiVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMud2lkdGggKD0lZikgaXMgbm90IGdyZWF0ZXIgdGhhbiAwLjAuIiwgZm5fbmFtZSwgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCB2aWV3cG9ydC53aWR0aCk7CisgICAgfSBlbHNlIGlmICghKGZfbHRlX3UzMl9leGFjdCh2aWV3cG9ydC53aWR0aCwgbWF4X3cpIHx8IGZfbHRlX3UzMl9kaXJlY3Qodmlld3BvcnQud2lkdGgsIG1heF93KSkpIHsKKyAgICAgICAgd2lkdGhfaGVhbHRoeSA9IGZhbHNlOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCAiVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMud2lkdGggKD0lZikgZXhjZWVkcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydERpbWVuc2lvbnNbMF0gKD0lIiBQUkl1MzIgIikuIiwgZm5fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdmlld3BvcnQud2lkdGgsIG1heF93KTsKKyAgICB9IGVsc2UgaWYgKCFmX2x0ZV91MzJfZXhhY3Qodmlld3BvcnQud2lkdGgsIG1heF93KSAmJiBmX2x0ZV91MzJfZGlyZWN0KHZpZXdwb3J0LndpZHRoLCBtYXhfdykpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCBrVlVJRF9QVkVycm9yX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzLndpZHRoICg9JWYpIHRlY2huaWNhbGx5IGV4Y2VlZHMgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Vmlld3BvcnREaW1lbnNpb25zWzBdICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSwgYnV0IGl0IGlzIHdpdGhpbiB0aGUgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1heFZpZXdwb3J0RGltZW5zaW9uc1swXSkgbGltaXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuX25hbWUsIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdmlld3BvcnQud2lkdGgsIG1heF93KTsKKyAgICB9CisKKyAgICAvLyBoZWlnaHQKKyAgICBib29sIGhlaWdodF9oZWFsdGh5ID0gdHJ1ZTsKKyAgICBjb25zdCBib29sIG5lZ2F0aXZlX2hlaWdodF9lbmFibGVkID0gYXBpX3ZlcnNpb24gPj0gVktfQVBJX1ZFUlNJT05fMV8xIHx8IGRldmljZV9leHRlbnNpb25zLnZrX2tocl9tYWludGVuYW5jZTEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2V4dGVuc2lvbnMudmtfYW1kX25lZ2F0aXZlX3ZpZXdwb3J0X2hlaWdodDsKKyAgICBjb25zdCBhdXRvIG1heF9oID0gZGV2aWNlX2xpbWl0cy5tYXhWaWV3cG9ydERpbWVuc2lvbnNbMV07CisKKyAgICBpZiAoIW5lZ2F0aXZlX2hlaWdodF9lbmFibGVkICYmICEodmlld3BvcnQuaGVpZ2h0ID4gMC4wZikpIHsKKyAgICAgICAgaGVpZ2h0X2hlYWx0aHkgPSBmYWxzZTsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0X3R5cGUsIG9iamVjdCwgIlZVSUQtVmtWaWV3cG9ydC1oZWlnaHQtMDE3NzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcy5oZWlnaHQgKD0lZikgaXMgbm90IGdyZWF0ZXIgMC4wLiIsIGZuX25hbWUsIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdmlld3BvcnQuaGVpZ2h0KTsKKyAgICB9IGVsc2UgaWYgKCEoZl9sdGVfdTMyX2V4YWN0KGZhYnNmKHZpZXdwb3J0LmhlaWdodCksIG1heF9oKSB8fCBmX2x0ZV91MzJfZGlyZWN0KGZhYnNmKHZpZXdwb3J0LmhlaWdodCksIG1heF9oKSkpIHsKKyAgICAgICAgaGVpZ2h0X2hlYWx0aHkgPSBmYWxzZTsKKworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCAiVlVJRC1Wa1ZpZXdwb3J0LWhlaWdodC0wMTc3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEFic29sdXRlIHZhbHVlIG9mICVzLmhlaWdodCAoPSVmKSBleGNlZWRzIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0RGltZW5zaW9uc1sxXSAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuX25hbWUsIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdmlld3BvcnQuaGVpZ2h0LCBtYXhfaCk7CisgICAgfSBlbHNlIGlmICghZl9sdGVfdTMyX2V4YWN0KGZhYnNmKHZpZXdwb3J0LmhlaWdodCksIG1heF9oKSAmJiBmX2x0ZV91MzJfZGlyZWN0KGZhYnNmKHZpZXdwb3J0LmhlaWdodCksIG1heF9oKSkgeworICAgICAgICBoZWlnaHRfaGVhbHRoeSA9IGZhbHNlOworCisgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCBrVlVJRF9QVkVycm9yX05PTkUsCisgICAgICAgICAgICAiJXM6IEFic29sdXRlIHZhbHVlIG9mICVzLmhlaWdodCAoPSVmKSB0ZWNobmljYWxseSBleGNlZWRzIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0RGltZW5zaW9uc1sxXSAoPSUiIFBSSXUzMgorICAgICAgICAgICAgIiksIGJ1dCBpdCBpcyB3aXRoaW4gdGhlIHN0YXRpY19jYXN0PGZsb2F0PihtYXhWaWV3cG9ydERpbWVuc2lvbnNbMV0pIGxpbWl0LiIsCisgICAgICAgICAgICBmbl9uYW1lLCBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCksIHZpZXdwb3J0LmhlaWdodCwgbWF4X2gpOworICAgIH0KKworICAgIC8vIHgKKyAgICBib29sIHhfaGVhbHRoeSA9IHRydWU7CisgICAgaWYgKCEodmlld3BvcnQueCA+PSBkZXZpY2VfbGltaXRzLnZpZXdwb3J0Qm91bmRzUmFuZ2VbMF0pKSB7CisgICAgICAgIHhfaGVhbHRoeSA9IGZhbHNlOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCAiVlVJRC1Wa1ZpZXdwb3J0LXgtMDE3NzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcy54ICg9JWYpIGlzIGxlc3MgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjp2aWV3cG9ydEJvdW5kc1JhbmdlWzBdICg9JWYpLiIsIGZuX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCksIHZpZXdwb3J0LngsIGRldmljZV9saW1pdHMudmlld3BvcnRCb3VuZHNSYW5nZVswXSk7CisgICAgfQorCisgICAgLy8geCArIHdpZHRoCisgICAgaWYgKHhfaGVhbHRoeSAmJiB3aWR0aF9oZWFsdGh5KSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHJpZ2h0X2JvdW5kID0gdmlld3BvcnQueCArIHZpZXdwb3J0LndpZHRoOworICAgICAgICBpZiAoIShyaWdodF9ib3VuZCA8PSBkZXZpY2VfbGltaXRzLnZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0pKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3QsICJWVUlELVZrVmlld3BvcnQteC0wMTIzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzLnggKyAlcy53aWR0aCAoPSVmICsgJWYgPSAlZikgaXMgZ3JlYXRlciB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6OnZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0gKD0lZikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuX25hbWUsIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCB2aWV3cG9ydC54LCB2aWV3cG9ydC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X2JvdW5kLCBkZXZpY2VfbGltaXRzLnZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8geQorICAgIGJvb2wgeV9oZWFsdGh5ID0gdHJ1ZTsKKyAgICBpZiAoISh2aWV3cG9ydC55ID49IGRldmljZV9saW1pdHMudmlld3BvcnRCb3VuZHNSYW5nZVswXSkpIHsKKyAgICAgICAgeV9oZWFsdGh5ID0gZmFsc2U7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3QsICJWVUlELVZrVmlld3BvcnQteS0wMTc3NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzLnkgKD0lZikgaXMgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6OnZpZXdwb3J0Qm91bmRzUmFuZ2VbMF0gKD0lZikuIiwgZm5fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdmlld3BvcnQueSwgZGV2aWNlX2xpbWl0cy52aWV3cG9ydEJvdW5kc1JhbmdlWzBdKTsKKyAgICB9IGVsc2UgaWYgKG5lZ2F0aXZlX2hlaWdodF9lbmFibGVkICYmICEodmlld3BvcnQueSA8PSBkZXZpY2VfbGltaXRzLnZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0pKSB7CisgICAgICAgIHlfaGVhbHRoeSA9IGZhbHNlOworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCAiVlVJRC1Wa1ZpZXdwb3J0LXktMDE3NzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcy55ICg9JWYpIGV4Y2VlZHMgVmtQaHlzaWNhbERldmljZUxpbWl0czo6dmlld3BvcnRCb3VuZHNSYW5nZVsxXSAoPSVmKS4iLCBmbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCB2aWV3cG9ydC55LCBkZXZpY2VfbGltaXRzLnZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0pOworICAgIH0KKworICAgIC8vIHkgKyBoZWlnaHQKKyAgICBpZiAoeV9oZWFsdGh5ICYmIGhlaWdodF9oZWFsdGh5KSB7CisgICAgICAgIGNvbnN0IGZsb2F0IGJvdW5kYXJ5ID0gdmlld3BvcnQueSArIHZpZXdwb3J0LmhlaWdodDsKKworICAgICAgICBpZiAoIShib3VuZGFyeSA8PSBkZXZpY2VfbGltaXRzLnZpZXdwb3J0Qm91bmRzUmFuZ2VbMV0pKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCAiVlVJRC1Wa1ZpZXdwb3J0LXktMDEyMzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMueSArICVzLmhlaWdodCAoPSVmICsgJWYgPSAlZikgZXhjZWVkcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjp2aWV3cG9ydEJvdW5kc1JhbmdlWzFdICg9JWYpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5fbmFtZSwgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCksIHZpZXdwb3J0LnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQuaGVpZ2h0LCBib3VuZGFyeSwgZGV2aWNlX2xpbWl0cy52aWV3cG9ydEJvdW5kc1JhbmdlWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChuZWdhdGl2ZV9oZWlnaHRfZW5hYmxlZCAmJiAhKGJvdW5kYXJ5ID49IGRldmljZV9saW1pdHMudmlld3BvcnRCb3VuZHNSYW5nZVswXSkpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0X3R5cGUsIG9iamVjdCwgIlZVSUQtVmtWaWV3cG9ydC15LTAxNzc3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMueSArICVzLmhlaWdodCAoPSVmICsgJWYgPSAlZikgaXMgbGVzcyB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6OnZpZXdwb3J0Qm91bmRzUmFuZ2VbMF0gKD0lZikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuX25hbWUsIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCB2aWV3cG9ydC55LCB2aWV3cG9ydC5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSwgZGV2aWNlX2xpbWl0cy52aWV3cG9ydEJvdW5kc1JhbmdlWzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCkgeworICAgICAgICAvLyBtaW5EZXB0aAorICAgICAgICBpZiAoISh2aWV3cG9ydC5taW5EZXB0aCA+PSAwLjApIHx8ICEodmlld3BvcnQubWluRGVwdGggPD0gMS4wKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0X3R5cGUsIG9iamVjdCwgIlZVSUQtVmtWaWV3cG9ydC1taW5EZXB0aC0wMTIzNCIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZLX0VYVF9kZXB0aF9yYW5nZV91bnJlc3RyaWN0ZWQgZXh0ZW5zaW9uIGlzIG5vdCBlbmFibGVkIGFuZCAlcy5taW5EZXB0aCAoPSVmKSBpcyBub3Qgd2l0aGluIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlswLjAsIDEuMF0gcmFuZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbl9uYW1lLCBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCksIHZpZXdwb3J0Lm1pbkRlcHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1heERlcHRoCisgICAgICAgIGlmICghKHZpZXdwb3J0Lm1heERlcHRoID49IDAuMCkgfHwgISh2aWV3cG9ydC5tYXhEZXB0aCA8PSAxLjApKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0LCAiVlVJRC1Wa1ZpZXdwb3J0LW1heERlcHRoLTAxMjM1IiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCBleHRlbnNpb24gaXMgbm90IGVuYWJsZWQgYW5kICVzLm1heERlcHRoICg9JWYpIGlzIG5vdCB3aXRoaW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWzAuMCwgMS4wXSByYW5nZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuX25hbWUsIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdmlld3BvcnQubWF4RGVwdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3N0cnVjdCBTYW1wbGVPcmRlckluZm8geworICAgIFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViBzaGFkaW5nUmF0ZTsKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7Cit9OworCisvLyBBbGwgcGFsZXR0ZSBlbnRyaWVzIHdpdGggbW9yZSB0aGFuIG9uZSBwaXhlbCBwZXIgZnJhZ21lbnQKK3N0YXRpYyBTYW1wbGVPcmRlckluZm8gc2FtcGxlT3JkZXJJbmZvc1tdID0geworICAgIHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzFYMl9QSVhFTFNfTlYsIDEsIDJ9LAorICAgIHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYMV9QSVhFTFNfTlYsIDIsIDF9LAorICAgIHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYMl9QSVhFTFNfTlYsIDIsIDJ9LAorICAgIHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzRYMl9QSVhFTFNfTlYsIDQsIDJ9LAorICAgIHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzJYNF9QSVhFTFNfTlYsIDIsIDR9LAorICAgIHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzRYNF9QSVhFTFNfTlYsIDQsIDR9LAorfTsKKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpWYWxpZGF0ZUNvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYoY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WICpvcmRlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgU2FtcGxlT3JkZXJJbmZvICpzYW1wbGVPcmRlckluZm87CisgICAgdWludDMyX3QgaW5mb0lkeCA9IDA7CisgICAgZm9yIChzYW1wbGVPcmRlckluZm8gPSBudWxscHRyOyBpbmZvSWR4IDwgQVJSQVlfU0laRShzYW1wbGVPcmRlckluZm9zKTsgKytpbmZvSWR4KSB7CisgICAgICAgIGlmIChzYW1wbGVPcmRlckluZm9zW2luZm9JZHhdLnNoYWRpbmdSYXRlID09IG9yZGVyLT5zaGFkaW5nUmF0ZSkgeworICAgICAgICAgICAgc2FtcGxlT3JkZXJJbmZvID0gJnNhbXBsZU9yZGVySW5mb3NbaW5mb0lkeF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzYW1wbGVPcmRlckluZm8gPT0gbnVsbHB0cikgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2hhZGluZ1JhdGUtMDIwNzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViBzaGFkaW5nUmF0ZSBtdXN0IGJlIGEgc2hhZGluZyByYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IGdlbmVyYXRlcyBmcmFnbWVudHMgd2l0aCBtb3JlIHRoYW4gb25lIHBpeGVsLiIpOworICAgICAgICByZXR1cm4gc2tpcDsKKyAgICB9CisKKyAgICBpZiAob3JkZXItPnNhbXBsZUNvdW50ID09IDAgfHwgKG9yZGVyLT5zYW1wbGVDb3VudCAmIChvcmRlci0+c2FtcGxlQ291bnQgLSAxKSkgfHwKKyAgICAgICAgIShvcmRlci0+c2FtcGxlQ291bnQgJiBkZXZpY2VfbGltaXRzLmZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50cykpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUNvdW50LTAyMDc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYgc2FtcGxlQ291bnQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlc3BvbmQgdG8gYSBzYW1wbGUgY291bnQgZW51bWVyYXRlZCBpbiBWa1NhbXBsZUNvdW50RmxhZ3Mgd2hvc2UgY29ycmVzcG9uZGluZyBiaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImlzIHNldCBpbiBmcmFtZWJ1ZmZlck5vQXR0YWNobWVudHNTYW1wbGVDb3VudHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLT5zYW1wbGVDb3VudCk7CisgICAgfQorCisgICAgaWYgKG9yZGVyLT5zYW1wbGVMb2NhdGlvbkNvdW50ICE9IG9yZGVyLT5zYW1wbGVDb3VudCAqIHNhbXBsZU9yZGVySW5mby0+d2lkdGggKiBzYW1wbGVPcmRlckluZm8tPmhlaWdodCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2FtcGxlTG9jYXRpb25Db3VudC0wMjA3NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WIHNhbXBsZUxvY2F0aW9uQ291bnQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJlIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG9mIHNhbXBsZUNvdW50ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSwgdGhlIGZyYWdtZW50IHdpZHRoIGZvciBzaGFkaW5nUmF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiKD0lIiBQUkl1MzIgIiksIGFuZCB0aGUgZnJhZ21lbnQgaGVpZ2h0IGZvciBzaGFkaW5nUmF0ZSAoPSUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXItPnNhbXBsZUxvY2F0aW9uQ291bnQsIG9yZGVyLT5zYW1wbGVDb3VudCwgc2FtcGxlT3JkZXJJbmZvLT53aWR0aCwgc2FtcGxlT3JkZXJJbmZvLT5oZWlnaHQpOworICAgIH0KKworICAgIGlmIChvcmRlci0+c2FtcGxlTG9jYXRpb25Db3VudCA+IHBoeXNfZGV2X2V4dF9wcm9wcy5zaGFkaW5nX3JhdGVfaW1hZ2VfcHJvcHMuc2hhZGluZ1JhdGVNYXhDb2Fyc2VTYW1wbGVzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgIlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUxvY2F0aW9uQ291bnQtMDIwNzYiLAorICAgICAgICAgICAgIlZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViBzYW1wbGVMb2NhdGlvbkNvdW50ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAiKSBtdXN0ICIKKyAgICAgICAgICAgICJiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYgc2hhZGluZ1JhdGVNYXhDb2Fyc2VTYW1wbGVzICg9JSIgUFJJdTMyICIpLiIsCisgICAgICAgICAgICBvcmRlci0+c2FtcGxlTG9jYXRpb25Db3VudCwgcGh5c19kZXZfZXh0X3Byb3BzLnNoYWRpbmdfcmF0ZV9pbWFnZV9wcm9wcy5zaGFkaW5nUmF0ZU1heENvYXJzZVNhbXBsZXMpOworICAgIH0KKworICAgIC8vIEFjY3VtdWxhdGUgYSBiaXRtYXNrIHRyYWNraW5nIHdoaWNoICh4LHksc2FtcGxlKSB0dXBsZXMgYXJlIHNlZW4uIEV4cGVjdAorICAgIC8vIHRoZSBmaXJzdCB3aWR0aCpoZWlnaHQqc2FtcGxlQ291bnQgYml0cyB0byBhbGwgYmUgc2V0LiBOb3RlOiBUaGVyZSBpcyBubworICAgIC8vIGd1YXJhbnRlZSB0aGF0IDY0IGJpdHMgaXMgZW5vdWdoLCBidXQgcHJhY3RpY2FsbHkgaXQncyB1bmxpa2VseSBmb3IgYW4KKyAgICAvLyBpbXBsZW1lbnRhdGlvbiB0byBzdXBwb3J0IG1vcmUgdGhhbiAzMiBiaXRzIGZvciBzYW1wbGVtYXNrLgorICAgIGFzc2VydChwaHlzX2Rldl9leHRfcHJvcHMuc2hhZGluZ19yYXRlX2ltYWdlX3Byb3BzLnNoYWRpbmdSYXRlTWF4Q29hcnNlU2FtcGxlcyA8PSA2NCk7CisgICAgdWludDY0X3Qgc2FtcGxlTG9jYXRpb25zTWFzayA9IDA7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG9yZGVyLT5zYW1wbGVMb2NhdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WICpzYW1wbGVMb2MgPSAmb3JkZXItPnBTYW1wbGVMb2NhdGlvbnNbaV07CisgICAgICAgIGlmIChzYW1wbGVMb2MtPnBpeGVsWCA+PSBzYW1wbGVPcmRlckluZm8tPndpZHRoKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WLXBpeGVsWC0wMjA3OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpeGVsWCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYWdtZW50LiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzYW1wbGVMb2MtPnBpeGVsWSA+PSBzYW1wbGVPcmRlckluZm8tPmhlaWdodCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVi1waXhlbFktMDIwNzkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaXhlbFkgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGhlaWdodCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhZ21lbnQuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNhbXBsZUxvYy0+c2FtcGxlID49IG9yZGVyLT5zYW1wbGVDb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVi1zYW1wbGUtMDIwODAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGUgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBjb3ZlcmFnZSBzYW1wbGVzIGluIGVhY2ggcGl4ZWwgYmVsb25naW5nIHRvIHRoZSBmcmFnbWVudC4iKTsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBpZHggPSBzYW1wbGVMb2MtPnNhbXBsZSArIG9yZGVyLT5zYW1wbGVDb3VudCAqIChzYW1wbGVMb2MtPnBpeGVsWCArIHNhbXBsZU9yZGVySW5mby0+d2lkdGggKiBzYW1wbGVMb2MtPnBpeGVsWSk7CisgICAgICAgIHNhbXBsZUxvY2F0aW9uc01hc2sgfD0gMVVMTCA8PCBpZHg7CisgICAgfQorCisgICAgdWludDY0X3QgZXhwZWN0ZWRNYXNrID0gKG9yZGVyLT5zYW1wbGVMb2NhdGlvbkNvdW50ID09IDY0KSA/IH4wVUxMIDogKCgxVUxMIDw8IG9yZGVyLT5zYW1wbGVMb2NhdGlvbkNvdW50KSAtIDEpOworICAgIGlmIChzYW1wbGVMb2NhdGlvbnNNYXNrICE9IGV4cGVjdGVkTWFzaykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1wU2FtcGxlTG9jYXRpb25zLTAyMDc3IiwKKyAgICAgICAgICAgICJUaGUgYXJyYXkgcFNhbXBsZUxvY2F0aW9ucyBtdXN0IGNvbnRhaW4gZXhhY3RseSBvbmUgZW50cnkgZm9yICIKKyAgICAgICAgICAgICJldmVyeSBjb21iaW5hdGlvbiBvZiB2YWxpZCB2YWx1ZXMgZm9yIHBpeGVsWCwgcGl4ZWxZLCBhbmQgc2FtcGxlIGluIHRoZSBzdHJ1Y3R1cmUgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLiIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZSAqcFBpcGVsaW5lcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKHBDcmVhdGVJbmZvcyAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICAgICAgYm9vbCBoYXNfZHluYW1pY192aWV3cG9ydCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbCBoYXNfZHluYW1pY19zY2lzc29yID0gZmFsc2U7CisgICAgICAgICAgICBib29sIGhhc19keW5hbWljX2xpbmVfd2lkdGggPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2wgaGFzX2R5bmFtaWNfdmlld3BvcnRfd19zY2FsaW5nX252ID0gZmFsc2U7CisgICAgICAgICAgICBib29sIGhhc19keW5hbWljX2Rpc2NhcmRfcmVjdGFuZ2xlX2V4dCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbCBoYXNfZHluYW1pY19zYW1wbGVfbG9jYXRpb25zX2V4dCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbCBoYXNfZHluYW1pY19leGNsdXNpdmVfc2Npc3Nvcl9udiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbCBoYXNfZHluYW1pY19zaGFkaW5nX3JhdGVfcGFsZXR0ZV9udiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbCBoYXNfZHluYW1pY19saW5lX3N0aXBwbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucER5bmFtaWNTdGF0ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmZHluYW1pY19zdGF0ZV9pbmZvID0gKnBDcmVhdGVJbmZvc1tpXS5wRHluYW1pY1N0YXRlOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgc3RhdGVfaW5kZXggPSAwOyBzdGF0ZV9pbmRleCA8IGR5bmFtaWNfc3RhdGVfaW5mby5keW5hbWljU3RhdGVDb3VudDsgKytzdGF0ZV9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZkeW5hbWljX3N0YXRlID0gZHluYW1pY19zdGF0ZV9pbmZvLnBEeW5hbWljU3RhdGVzW3N0YXRlX2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNfc3RhdGUgPT0gVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCkgaGFzX2R5bmFtaWNfdmlld3BvcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19zdGF0ZSA9PSBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1IpIGhhc19keW5hbWljX3NjaXNzb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19zdGF0ZSA9PSBWS19EWU5BTUlDX1NUQVRFX0xJTkVfV0lEVEgpIGhhc19keW5hbWljX2xpbmVfd2lkdGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19zdGF0ZSA9PSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1dfU0NBTElOR19OVikgaGFzX2R5bmFtaWNfdmlld3BvcnRfd19zY2FsaW5nX252ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNfc3RhdGUgPT0gVktfRFlOQU1JQ19TVEFURV9ESVNDQVJEX1JFQ1RBTkdMRV9FWFQpIGhhc19keW5hbWljX2Rpc2NhcmRfcmVjdGFuZ2xlX2V4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChkeW5hbWljX3N0YXRlID09IFZLX0RZTkFNSUNfU1RBVEVfU0FNUExFX0xPQ0FUSU9OU19FWFQpIGhhc19keW5hbWljX3NhbXBsZV9sb2NhdGlvbnNfZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNfc3RhdGUgPT0gVktfRFlOQU1JQ19TVEFURV9FWENMVVNJVkVfU0NJU1NPUl9OVikgaGFzX2R5bmFtaWNfZXhjbHVzaXZlX3NjaXNzb3JfbnYgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19zdGF0ZSA9PSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9QQUxFVFRFX05WKQorICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2R5bmFtaWNfc2hhZGluZ19yYXRlX3BhbGV0dGVfbnYgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19zdGF0ZSA9PSBWS19EWU5BTUlDX1NUQVRFX0xJTkVfU1RJUFBMRV9FWFQpIGhhc19keW5hbWljX2xpbmVfc3RpcHBsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIGZlZWRiYWNrX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVD4ocENyZWF0ZUluZm9zW2ldLnBOZXh0KTsKKyAgICAgICAgICAgIGlmICgoZmVlZGJhY2tfc3RydWN0ICE9IG51bGxwdHIpICYmCisgICAgICAgICAgICAgICAgKGZlZWRiYWNrX3N0cnVjdC0+cGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCAhPSBwQ3JlYXRlSW5mb3NbaV0uc3RhZ2VDb3VudCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULCBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQtcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudC0wMjY2OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogaW4gcENyZWF0ZUluZm9bJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0sIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUOjpwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoPSUiIFBSSXUzMiAiKSBtdXN0IGVxdWFsIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm86OnN0YWdlQ291bnQoPSUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGZlZWRiYWNrX3N0cnVjdC0+cGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCwgcENyZWF0ZUluZm9zW2ldLnN0YWdlQ291bnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBWYWxpZGF0aW9uIGZvciBwYXJhbWV0ZXJzIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB2YWxpZGF0aW9uIGNvZGUgZHVlIHRvIGEgJ25vYXV0b3ZhbGlkaXR5JyB0YWcgaW4gdmsueG1sCisKKyAgICAgICAgICAgIC8vIENvbGxlY3QgYWN0aXZlIHN0YWdlcworICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlX3NoYWRlcnMgPSAwOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBzdGFnZXMgPSAwOyBzdGFnZXMgPCBwQ3JlYXRlSW5mb3NbaV0uc3RhZ2VDb3VudDsgc3RhZ2VzKyspIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVfc2hhZGVycyB8PSBwQ3JlYXRlSW5mb3NbaV0ucFN0YWdlcy0+c3RhZ2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoYWN0aXZlX3NoYWRlcnMgJiBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUKSAmJgorICAgICAgICAgICAgICAgIChhY3RpdmVfc2hhZGVycyAmIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQpICYmIChwQ3JlYXRlSW5mb3NbaV0ucFRlc3NlbGxhdGlvblN0YXRlICE9IG51bGxwdHIpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQ3JlYXRlSW5mb3NbaV0ucFRlc3NlbGxhdGlvblN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBUZXNzZWxsYXRpb25TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9TVEFURV9DUkVBVEVfSU5GTywgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworCisgICAgICAgICAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvW10gPSB7CisgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPfTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgInBDcmVhdGVJbmZvc1tpXS5wVGVzc2VsbGF0aW9uU3RhdGUtPnBOZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBUZXNzZWxsYXRpb25TdGF0ZS0+cE5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQ3JlYXRlSW5mb3NbaV0ucFRlc3NlbGxhdGlvblN0YXRlLT5mbGFncyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucFRlc3NlbGxhdGlvblN0YXRlLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoYWN0aXZlX3NoYWRlcnMgJiBWS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlYpICYmIChwQ3JlYXRlSW5mb3NbaV0ucElucHV0QXNzZW1ibHlTdGF0ZSAhPSBudWxscHRyKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGUoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCAicENyZWF0ZUluZm9zW2ldLnBJbnB1dEFzc2VtYmx5U3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wSW5wdXRBc3NlbWJseVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk8sIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQ3JlYXRlSW5mb3NbaV0ucElucHV0QXNzZW1ibHlTdGF0ZS0+cE5leHQiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wSW5wdXRBc3NlbWJseVN0YXRlLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQ3JlYXRlSW5mb3NbaV0ucElucHV0QXNzZW1ibHlTdGF0ZS0+ZmxhZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBJbnB1dEFzc2VtYmx5U3RhdGUtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLCAicENyZWF0ZUluZm9zW2ldLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnRvcG9sb2d5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1ByaW1pdGl2ZVRvcG9sb2d5IiwgQWxsVmtQcmltaXRpdmVUb3BvbG9neUVudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnRvcG9sb2d5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQ3JlYXRlSW5mb3NbaV0ucElucHV0QXNzZW1ibHlTdGF0ZS0+cHJpbWl0aXZlUmVzdGFydEVuYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBJbnB1dEFzc2VtYmx5U3RhdGUtPnByaW1pdGl2ZVJlc3RhcnRFbmFibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShhY3RpdmVfc2hhZGVycyAmIFZLX1NIQURFUl9TVEFHRV9NRVNIX0JJVF9OVikgJiYgKHBDcmVhdGVJbmZvc1tpXS5wVmVydGV4SW5wdXRTdGF0ZSAhPSBudWxscHRyKSkgeworICAgICAgICAgICAgICAgIGF1dG8gY29uc3QgJnZlcnRleF9pbnB1dF9zdGF0ZSA9IHBDcmVhdGVJbmZvc1tpXS5wVmVydGV4SW5wdXRTdGF0ZTsKKworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPmZsYWdzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwYXJhcmFtZXRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zWyVkXS5wVmVydGV4SW5wdXRTdGF0ZS0+ZmxhZ3MgKCV1KSBpcyByZXNlcnZlZCBhbmQgbXVzdCBiZSB6ZXJvLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB2ZXJ0ZXhfaW5wdXRfc3RhdGUtPmZsYWdzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mb1tdID0geworICAgICAgICAgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfRElWSVNPUl9TVEFURV9DUkVBVEVfSU5GT19FWFR9OworICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwgInBDcmVhdGVJbmZvc1tpXS5wVmVydGV4SW5wdXRTdGF0ZS0+cE5leHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnBOZXh0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRfc3RydWN0c19Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8sIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9TVEFURV9DUkVBVEVfSU5GTyIsIHZlcnRleF9pbnB1dF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9TVEFURV9DUkVBVEVfSU5GTywgZmFsc2UsIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9hcnJheSgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvc1tpXS5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENyZWF0ZUluZm9zW2ldLnBWZXJ0ZXhJbnB1dFN0YXRlLT5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucywgZmFsc2UsIHRydWUsIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KAorICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsICJwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQiLAorICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zW2ldLT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zIiwgdmVydGV4X2lucHV0X3N0YXRlLT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAmdmVydGV4X2lucHV0X3N0YXRlLT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLCBmYWxzZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25JbmRleCA8IHBDcmVhdGVJbmZvc1tpXS5wVmVydGV4SW5wdXRTdGF0ZS0+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgKyt2ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25JbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvc1tpXS5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnNbal0uaW5wdXRSYXRlIiwgIlZrVmVydGV4SW5wdXRSYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxWa1ZlcnRleElucHV0UmF0ZUVudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnNbdmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uSW5kZXhdLmlucHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLWlucHV0UmF0ZS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uSW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uSW5kZXggPCBwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgKyt2ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zW2ldLnBWZXJ0ZXhJbnB1dFN0YXRlLT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zW2ldLmZvcm1hdCIsICJWa0Zvcm1hdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsVmtGb3JtYXRFbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnNbdmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25JbmRleF0uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbi1mb3JtYXQtcGFyYW1ldGVyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodmVydGV4X2lucHV0X3N0YXRlLT52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA+IGRldmljZV9saW1pdHMubWF4VmVydGV4SW5wdXRCaW5kaW5ncykgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tdmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQtMDA2MTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBhcmFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mb1slZF0ucFZlcnRleElucHV0U3RhdGUtPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ICgldSkgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyZWF0ZXIgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzICgldSkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHZlcnRleF9pbnB1dF9zdGF0ZS0+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQsIGRldmljZV9saW1pdHMubWF4VmVydGV4SW5wdXRCaW5kaW5ncyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZlcnRleF9pbnB1dF9zdGF0ZS0+dmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCA+IGRldmljZV9saW1pdHMubWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby12ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50LTAwNjE0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwYXJhcmFtZXRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9bJWRdLnBWZXJ0ZXhJbnB1dFN0YXRlLT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ICgldSkgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyZWF0ZXIgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMgKCV1KS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgdmVydGV4X2lucHV0X3N0YXRlLT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50LCBkZXZpY2VfbGltaXRzLm1heFZlcnRleElucHV0QXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiB2ZXJ0ZXhfYmluZGluZ3ModmVydGV4X2lucHV0X3N0YXRlLT52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkID0gMDsgZCA8IHZlcnRleF9pbnB1dF9zdGF0ZS0+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ7ICsrZCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvbnN0ICZ2ZXJ0ZXhfYmluZF9kZXNjID0gdmVydGV4X2lucHV0X3N0YXRlLT5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uc1tkXTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb25zdCAmYmluZGluZ19pdCA9IHZlcnRleF9iaW5kaW5ncy5maW5kKHZlcnRleF9iaW5kX2Rlc2MuYmluZGluZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nX2l0ICE9IHZlcnRleF9iaW5kaW5ncy5jZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tcFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMtMDA2MTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mb1slZF0ucFZlcnRleElucHV0U3RhdGUtPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25bJWRdLmJpbmRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJSIgUFJJdTMyICIpIGlzIG5vdCBkaXN0aW5jdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGQsIHZlcnRleF9iaW5kX2Rlc2MuYmluZGluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmVydGV4X2JpbmRpbmdzLmluc2VydCh2ZXJ0ZXhfYmluZF9kZXNjLmJpbmRpbmcpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXhfYmluZF9kZXNjLmJpbmRpbmcgPj0gZGV2aWNlX2xpbWl0cy5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbi1iaW5kaW5nLTAwNjE4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zWyV1XS5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnNbJXVdLmJpbmRpbmcgKCV1KSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzICgldSkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkLCB2ZXJ0ZXhfYmluZF9kZXNjLmJpbmRpbmcsIGRldmljZV9saW1pdHMubWF4VmVydGV4SW5wdXRCaW5kaW5ncyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodmVydGV4X2JpbmRfZGVzYy5zdHJpZGUgPiBkZXZpY2VfbGltaXRzLm1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24tc3RyaWRlLTAwNjE5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zWyV1XS5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnNbJXVdLnN0cmlkZSAoJXUpIGlzIGdyZWF0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSAoJXUpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZCwgdmVydGV4X2JpbmRfZGVzYy5zdHJpZGUsIGRldmljZV9saW1pdHMubWF4VmVydGV4SW5wdXRCaW5kaW5nU3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gYXR0cmlidXRlX2xvY2F0aW9ucyh2ZXJ0ZXhfaW5wdXRfc3RhdGUtPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgZCA9IDA7IGQgPCB2ZXJ0ZXhfaW5wdXRfc3RhdGUtPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQ7ICsrZCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvbnN0ICZ2ZXJ0ZXhfYXR0cmliX2Rlc2MgPSB2ZXJ0ZXhfaW5wdXRfc3RhdGUtPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnNbZF07CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29uc3QgJmxvY2F0aW9uX2l0ID0gYXR0cmlidXRlX2xvY2F0aW9ucy5maW5kKHZlcnRleF9hdHRyaWJfZGVzYy5sb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbl9pdCAhPSBhdHRyaWJ1dGVfbG9jYXRpb25zLmNlbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zLTAwNjE3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9bJWRdLnBWZXJ0ZXhJbnB1dFN0YXRlLT52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnNbJWRdLmxvY2F0aW9uICgldSkgaXMgbm90IGRpc3RpbmN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZCwgdmVydGV4X2F0dHJpYl9kZXNjLmxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbG9jYXRpb25zLmluc2VydCh2ZXJ0ZXhfYXR0cmliX2Rlc2MubG9jYXRpb24pOworCisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29uc3QgJmJpbmRpbmdfaXQgPSB2ZXJ0ZXhfYmluZGluZ3MuZmluZCh2ZXJ0ZXhfYXR0cmliX2Rlc2MuYmluZGluZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nX2l0ID09IHZlcnRleF9iaW5kaW5ncy5jZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tYmluZGluZy0wMDYxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBhcmFtZXRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwQ3JlYXRlSW5mb1slZF0ucFZlcnRleElucHV0U3RhdGUtPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uc1slZF0uYmluZGluZyAoJXUpIGRvZXMgbm90IGV4aXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gYW55IHBDcmVhdGVJbmZvWyVkXS5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGQsIHZlcnRleF9hdHRyaWJfZGVzYy5iaW5kaW5nLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXhfYXR0cmliX2Rlc2MubG9jYXRpb24gPj0gZGV2aWNlX2xpbWl0cy5tYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tbG9jYXRpb24tMDA2MjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mb3NbJXVdLnBWZXJ0ZXhJbnB1dFN0YXRlLT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zWyV1XS5sb2NhdGlvbiAoJXUpIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleElucHV0QXR0cmlidXRlcyAoJXUpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZCwgdmVydGV4X2F0dHJpYl9kZXNjLmxvY2F0aW9uLCBkZXZpY2VfbGltaXRzLm1heFZlcnRleElucHV0QXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodmVydGV4X2F0dHJpYl9kZXNjLmJpbmRpbmcgPj0gZGV2aWNlX2xpbWl0cy5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uLWJpbmRpbmctMDA2MjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mb3NbJXVdLnBWZXJ0ZXhJbnB1dFN0YXRlLT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zWyV1XS5iaW5kaW5nICgldSkgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRCaW5kaW5ncyAoJXUpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZCwgdmVydGV4X2F0dHJpYl9kZXNjLmJpbmRpbmcsIGRldmljZV9saW1pdHMubWF4VmVydGV4SW5wdXRCaW5kaW5ncyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodmVydGV4X2F0dHJpYl9kZXNjLm9mZnNldCA+IGRldmljZV9saW1pdHMubWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tb2Zmc2V0LTAwNjIyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zWyV1XS5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uc1sldV0ub2Zmc2V0ICgldSkgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmVhdGVyIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQgKCV1KS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGQsIHZlcnRleF9hdHRyaWJfZGVzYy5vZmZzZXQsIGRldmljZV9saW1pdHMubWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBTdGFnZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJvb2wgaGFzX2NvbnRyb2wgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBib29sIGhhc19ldmFsID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHN0YWdlX2luZGV4ID0gMDsgc3RhZ2VfaW5kZXggPCBwQ3JlYXRlSW5mb3NbaV0uc3RhZ2VDb3VudDsgKytzdGFnZV9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBTdGFnZXNbc3RhZ2VfaW5kZXhdLnN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jb250cm9sID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwQ3JlYXRlSW5mb3NbaV0ucFN0YWdlc1tzdGFnZV9pbmRleF0uc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2V2YWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcFRlc3NlbGxhdGlvblN0YXRlIGlzIGlnbm9yZWQgd2l0aG91dCBib3RoIHRlc3NlbGxhdGlvbiBjb250cm9sIGFuZCB0ZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXJzIHN0YWdlcworICAgICAgICAgICAgICAgIGlmIChoYXNfY29udHJvbCAmJiBoYXNfZXZhbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBUZXNzZWxsYXRpb25TdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzMxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogaWYgcENyZWF0ZUluZm9zWyVkXS5wU3RhZ2VzIGluY2x1ZGVzIGEgdGVzc2VsbGF0aW9uIGNvbnRyb2wgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGFkZXIgc3RhZ2UgYW5kIGEgdGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc2hhZGVyIHN0YWdlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvc1slZF0ucFRlc3NlbGxhdGlvblN0YXRlIG11c3Qgbm90IGJlIE5VTEwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3R5cGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFRlc3NlbGxhdGlvblN0YXRlLT5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaXBlbGluZVRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlQ3JlYXRlSW5mbyIsIHBDcmVhdGVJbmZvc1tpXS5wVGVzc2VsbGF0aW9uU3RhdGUtPnBOZXh0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvd2VkX3R5cGUsIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wVGVzc2VsbGF0aW9uU3RhdGUtPmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wVGVzc2VsbGF0aW9uU3RhdGUtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wVGVzc2VsbGF0aW9uU3RhdGUtPnNUeXBlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvLXNUeXBlLXNUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBhcmFtZXRlciBwQ3JlYXRlSW5mb3NbJWRdLnBUZXNzZWxsYXRpb25TdGF0ZS0+c1R5cGUgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucFRlc3NlbGxhdGlvblN0YXRlLT5wYXRjaENvbnRyb2xQb2ludHMgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wVGVzc2VsbGF0aW9uU3RhdGUtPnBhdGNoQ29udHJvbFBvaW50cyA+IGRldmljZV9saW1pdHMubWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvLXBhdGNoQ29udHJvbFBvaW50cy0wMTIxNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBpbnZhbGlkIHBhcmFtZXRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mb3NbJWRdLnBUZXNzZWxsYXRpb25TdGF0ZS0+cGF0Y2hDb250cm9sUG9pbnRzIHZhbHVlICV1LiBwYXRjaENvbnRyb2xQb2ludHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGJlID4wIGFuZCA8PSV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBDcmVhdGVJbmZvc1tpXS5wVGVzc2VsbGF0aW9uU3RhdGUtPnBhdGNoQ29udHJvbFBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2xpbWl0cy5tYXhUZXNzZWxsYXRpb25QYXRjaFNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwVmlld3BvcnRTdGF0ZSwgcE11bHRpc2FtcGxlU3RhdGUsIHBEZXB0aFN0ZW5jaWxTdGF0ZSwgYW5kIHBDb2xvckJsZW5kU3RhdGUgaWdub3JlZCB3aGVuIHJhc3Rlcml6YXRpb24gaXMgZGlzYWJsZWQKKyAgICAgICAgICAgIGlmICgocENyZWF0ZUluZm9zW2ldLnBSYXN0ZXJpemF0aW9uU3RhdGUgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAocENyZWF0ZUluZm9zW2ldLnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID09IFZLX0ZBTFNFKSkgeworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucFZpZXdwb3J0U3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IFJhc3Rlcml6YXRpb24gaXMgZW5hYmxlZCAocENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+cmFzdGVyaXplckRpc2NhcmRFbmFibGUgaXMgVktfRkFMU0UpLCBidXQgcENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucFZpZXdwb3J0U3RhdGUgKD1OVUxMKSBpcyBub3QgYSB2YWxpZCBwb2ludGVyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZ2aWV3cG9ydF9zdGF0ZSA9ICpwQ3JlYXRlSW5mb3NbaV0ucFZpZXdwb3J0U3RhdGU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdwb3J0X3N0YXRlLnNUeXBlICE9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTExfSEFORExFLCAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucFZpZXdwb3J0U3RhdGUtPnNUeXBlIGlzIG5vdCBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TVEFURV9DUkVBVEVfSU5GTy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm9bXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NXSVpaTEVfU1RBVEVfQ1JFQVRFX0lORk9fTlYsCisgICAgICAgICAgICAgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlYsCisgICAgICAgICAgICAgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9FWENMVVNJVkVfU0NJU1NPUl9TVEFURV9DUkVBVEVfSU5GT19OViwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NIQURJTkdfUkFURV9JTUFHRV9TVEFURV9DUkVBVEVfSU5GT19OViwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlYsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wVmlld3BvcnRTdGF0ZS0+cE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLCBWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WLCBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0X3N0YXRlLnBOZXh0LCBBUlJBWV9TSVpFKGFsbG93ZWRfc3RydWN0c19Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbywgNjUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wVmlld3BvcnRTdGF0ZS0+ZmxhZ3MiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydF9zdGF0ZS5mbGFncywgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLWZsYWdzLXplcm9iaXRtYXNrIik7CisKKyAgICAgICAgICAgICAgICAgICAgYXV0byBleGNsdXNpdmVfc2Npc3Nvcl9zdHJ1Y3QgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlY+KAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBWaWV3cG9ydFN0YXRlLT5wTmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gc2hhZGluZ19yYXRlX2ltYWdlX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVj4oCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucFZpZXdwb3J0U3RhdGUtPnBOZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb2Fyc2Vfc2FtcGxlX29yZGVyX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrUGlwZWxpbmVWaWV3cG9ydENvYXJzZVNhbXBsZU9yZGVyU3RhdGVDcmVhdGVJbmZvTlY+KAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBWaWV3cG9ydFN0YXRlLT5wTmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gdnBfc3dpenpsZV9zdHJ1Y3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WPihwQ3JlYXRlSW5mb3NbaV0ucFZpZXdwb3J0U3RhdGUtPnBOZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byB2cF93X3NjYWxpbmdfc3RydWN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlY+KHBDcmVhdGVJbmZvc1tpXS5wVmlld3BvcnRTdGF0ZS0+cE5leHQpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghcGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzLm11bHRpVmlld3BvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogVGhlIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6bXVsdGlWaWV3cG9ydCBmZWF0dXJlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkLCBidXQgcENyZWF0ZUluZm9zWyUiIFBSSXUzMiAiXS5wVmlld3BvcnRTdGF0ZS0+dmlld3BvcnRDb3VudCAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBub3QgMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdwb3J0X3N0YXRlLnNjaXNzb3JDb3VudCAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogVGhlIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6bXVsdGlWaWV3cG9ydCBmZWF0dXJlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkLCBidXQgcENyZWF0ZUluZm9zWyUiIFBSSXUzMiAiXS5wVmlld3BvcnRTdGF0ZS0+c2Npc3NvckNvdW50ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIG5vdCAxLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHZpZXdwb3J0X3N0YXRlLnNjaXNzb3JDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGNsdXNpdmVfc2Npc3Nvcl9zdHJ1Y3QgJiYgKGV4Y2x1c2l2ZV9zY2lzc29yX3N0cnVjdC0+ZXhjbHVzaXZlU2Npc3NvckNvdW50ICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZV9zY2lzc29yX3N0cnVjdC0+ZXhjbHVzaXZlU2Npc3NvckNvdW50ICE9IDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDI3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogVGhlIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6bXVsdGlWaWV3cG9ydCBmZWF0dXJlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQsIGJ1dCBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WOjpleGNsdXNpdmVTY2lzc29yQ291bnQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBub3QgMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGV4Y2x1c2l2ZV9zY2lzc29yX3N0cnVjdC0+ZXhjbHVzaXZlU2Npc3NvckNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYWRpbmdfcmF0ZV9pbWFnZV9zdHJ1Y3QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hhZGluZ19yYXRlX2ltYWdlX3N0cnVjdC0+dmlld3BvcnRDb3VudCAhPSAwICYmIHNoYWRpbmdfcmF0ZV9pbWFnZV9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQgIT0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WLXZpZXdwb3J0Q291bnQtMDIwNTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogVGhlIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6bXVsdGlWaWV3cG9ydCBmZWF0dXJlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkLCBidXQgcENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlY6OnZpZXdwb3J0Q291bnQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgbmVpdGhlciAwIG5vciAxLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNoYWRpbmdfcmF0ZV9pbWFnZV9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBtdWx0aVZpZXdwb3J0IGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBDcmVhdGVJbmZvc1slIiBQUkl1MzIgIl0ucFZpZXdwb3J0U3RhdGUtPnZpZXdwb3J0Q291bnQgaXMgMC4iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmlld3BvcnRfc3RhdGUudmlld3BvcnRDb3VudCA+IGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LTAxMjE4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBDcmVhdGVJbmZvc1slIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucFZpZXdwb3J0U3RhdGUtPnZpZXdwb3J0Q291bnQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cyAoPSUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50LCBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3cG9ydF9zdGF0ZS5zY2lzc29yQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyICJdLnBWaWV3cG9ydFN0YXRlLT5zY2lzc29yQ291bnQgaXMgMC4iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmlld3BvcnRfc3RhdGUuc2Npc3NvckNvdW50ID4gZGV2aWNlX2xpbWl0cy5tYXhWaWV3cG9ydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdLnBWaWV3cG9ydFN0YXRlLT5zY2lzc29yQ291bnQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cyAoPSUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB2aWV3cG9ydF9zdGF0ZS5zY2lzc29yQ291bnQsIGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChleGNsdXNpdmVfc2Npc3Nvcl9zdHJ1Y3QgJiYgZXhjbHVzaXZlX3NjaXNzb3Jfc3RydWN0LT5leGNsdXNpdmVTY2lzc29yQ291bnQgPiBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcENyZWF0ZUluZm9zWyUiIFBSSXUzMiAiXSBleGNsdXNpdmVTY2lzc29yQ291bnQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBncmVhdGVyIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Vmlld3BvcnRzICg9JSIgUFJJdTMyICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZXhjbHVzaXZlX3NjaXNzb3Jfc3RydWN0LT5leGNsdXNpdmVTY2lzc29yQ291bnQsIGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzaGFkaW5nX3JhdGVfaW1hZ2Vfc3RydWN0ICYmIHNoYWRpbmdfcmF0ZV9pbWFnZV9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQgPiBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi12aWV3cG9ydENvdW50LTAyMDU1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgdmlld3BvcnRDb3VudCAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cyAoPSUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc2hhZGluZ19yYXRlX2ltYWdlX3N0cnVjdC0+dmlld3BvcnRDb3VudCwgZGV2aWNlX2xpbWl0cy5tYXhWaWV3cG9ydHMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdwb3J0X3N0YXRlLnNjaXNzb3JDb3VudCAhPSB2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIyMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcENyZWF0ZUluZm9zWyUiIFBSSXUzMiAiXS5wVmlld3BvcnRTdGF0ZS0+c2Npc3NvckNvdW50ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBub3QgaWRlbnRpY2FsIHRvIHBDcmVhdGVJbmZvc1slIiBQUkl1MzIgIl0ucFZpZXdwb3J0U3RhdGUtPnZpZXdwb3J0Q291bnQgKD0lIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHZpZXdwb3J0X3N0YXRlLnNjaXNzb3JDb3VudCwgaSwgdmlld3BvcnRfc3RhdGUudmlld3BvcnRDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZXhjbHVzaXZlX3NjaXNzb3Jfc3RydWN0ICYmIGV4Y2x1c2l2ZV9zY2lzc29yX3N0cnVjdC0+ZXhjbHVzaXZlU2Npc3NvckNvdW50ICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZV9zY2lzc29yX3N0cnVjdC0+ZXhjbHVzaXZlU2Npc3NvckNvdW50ICE9IHZpZXdwb3J0X3N0YXRlLnZpZXdwb3J0Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WLWV4Y2x1c2l2ZVNjaXNzb3JDb3VudC0wMjAyOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBDcmVhdGVJbmZvc1slIiBQUkl1MzIgIl0gZXhjbHVzaXZlU2Npc3NvckNvdW50ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgbXVzdCBiZSB6ZXJvIG9yIGlkZW50aWNhbCB0byBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucFZpZXdwb3J0U3RhdGUtPnZpZXdwb3J0Q291bnQgKD0lIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBleGNsdXNpdmVfc2Npc3Nvcl9zdHJ1Y3QtPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwgaSwgdmlld3BvcnRfc3RhdGUudmlld3BvcnRDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGluZ19yYXRlX2ltYWdlX3N0cnVjdCAmJiBzaGFkaW5nX3JhdGVfaW1hZ2Vfc3RydWN0LT5zaGFkaW5nUmF0ZUltYWdlRW5hYmxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzaGFkaW5nX3JhdGVfaW1hZ2Vfc3RydWN0LT52aWV3cG9ydENvdW50ICE9IHZpZXdwb3J0X3N0YXRlLnZpZXdwb3J0Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsIFZLX05VTExfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi1zaGFkaW5nUmF0ZUltYWdlRW5hYmxlLTAyMDU2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogSWYgc2hhZGluZ1JhdGVJbWFnZUVuYWJsZSBpcyBlbmFibGVkLCBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgdmlld3BvcnRDb3VudCAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG11c3QgaWRlbnRpY2FsIHRvIHBDcmVhdGVJbmZvc1slIiBQUkl1MzIgIl0ucFZpZXdwb3J0U3RhdGUtPnZpZXdwb3J0Q291bnQgKD0lIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzaGFkaW5nX3JhdGVfaW1hZ2Vfc3RydWN0LT52aWV3cG9ydENvdW50LCBpLCB2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghaGFzX2R5bmFtaWNfdmlld3BvcnQgJiYgdmlld3BvcnRfc3RhdGUudmlld3BvcnRDb3VudCA+IDAgJiYgdmlld3BvcnRfc3RhdGUucFZpZXdwb3J0cyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULCBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAwNzQ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogVGhlIHZpZXdwb3J0IHN0YXRlIGlzIHN0YXRpYyAocENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdLnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzIGRvZXMgbm90IGNvbnRhaW4gVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCksIGJ1dCBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucFZpZXdwb3J0U3RhdGUtPnBWaWV3cG9ydHMgKD1OVUxMKSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghaGFzX2R5bmFtaWNfc2Npc3NvciAmJiB2aWV3cG9ydF9zdGF0ZS5zY2lzc29yQ291bnQgPiAwICYmIHZpZXdwb3J0X3N0YXRlLnBTY2lzc29ycyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULCBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAwNzQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogVGhlIHNjaXNzb3Igc3RhdGUgaXMgc3RhdGljIChwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucER5bmFtaWNTdGF0ZS0+cER5bmFtaWNTdGF0ZXMgZG9lcyBub3QgY29udGFpbiBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1IpLCBidXQgcENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdLnBWaWV3cG9ydFN0YXRlLT5wU2Npc3NvcnMgKD1OVUxMKSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghaGFzX2R5bmFtaWNfZXhjbHVzaXZlX3NjaXNzb3JfbnYgJiYgZXhjbHVzaXZlX3NjaXNzb3Jfc3RydWN0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpdmVfc2Npc3Nvcl9zdHJ1Y3QtPmV4Y2x1c2l2ZVNjaXNzb3JDb3VudCA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZV9zY2lzc29yX3N0cnVjdC0+cEV4Y2x1c2l2ZVNjaXNzb3JzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTExfSEFORExFLCAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtcER5bmFtaWNTdGF0ZXMtMDIwMzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IFRoZSBleGNsdXNpdmUgc2Npc3NvciBzdGF0ZSBpcyBzdGF0aWMgKHBDcmVhdGVJbmZvc1slIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdLnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzIGRvZXMgbm90IGNvbnRhaW4gVktfRFlOQU1JQ19TVEFURV9FWENMVVNJVkVfU0NJU1NPUl9OViksIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zWyUiIFBSSXUzMiAiXSBwRXhjbHVzaXZlU2Npc3NvcnMgKD1OVUxMKSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNfZHluYW1pY19zaGFkaW5nX3JhdGVfcGFsZXR0ZV9udiAmJiBzaGFkaW5nX3JhdGVfaW1hZ2Vfc3RydWN0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzaGFkaW5nX3JhdGVfaW1hZ2Vfc3RydWN0LT52aWV3cG9ydENvdW50ID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGluZ19yYXRlX2ltYWdlX3N0cnVjdC0+cFNoYWRpbmdSYXRlUGFsZXR0ZXMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WLXBEeW5hbWljU3RhdGVzLTAyMDU3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogVGhlIHNoYWRpbmcgcmF0ZSBwYWxldHRlIHN0YXRlIGlzIHN0YXRpYyAocENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdLnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzIGRvZXMgbm90IGNvbnRhaW4gVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfUEFMRVRURV9OViksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHBDcmVhdGVJbmZvc1slIiBQUkl1MzIgIl0gcFNoYWRpbmdSYXRlUGFsZXR0ZXMgKD1OVUxMKSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh2cF9zd2l6emxlX3N0cnVjdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZwX3N3aXp6bGVfc3RydWN0LT52aWV3cG9ydENvdW50ICE9IHZpZXdwb3J0X3N0YXRlLnZpZXdwb3J0Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLXZpZXdwb3J0Q291bnQtMDEyMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogVGhlIHZpZXdwb3J0IHN3aXp6bGUgc3RhdGUgdmllcG9ydCBjb3VudCBvZiAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBtYXRjaCB0aGUgdmlld3BvcnQgY291bnQgb2YgJSIgUFJJdTMyICIgaW4gVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwX3N3aXp6bGVfc3RydWN0LT52aWV3cG9ydENvdW50LCB2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBWa1ZpZXdwb3J0cworICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc19keW5hbWljX3ZpZXdwb3J0ICYmIHZpZXdwb3J0X3N0YXRlLnBWaWV3cG9ydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgdmlld3BvcnRfaSA9IDA7IHZpZXdwb3J0X2kgPCB2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50OyArK3ZpZXdwb3J0X2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZ2aWV3cG9ydCA9IHZpZXdwb3J0X3N0YXRlLnBWaWV3cG9ydHNbdmlld3BvcnRfaV07ICAvLyB3aWxsIGNyYXNoIG9uIGludmFsaWQgcHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm5fbmFtZSA9ICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVWaWV3cG9ydCh2aWV3cG9ydCwgZm5fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBWaWV3cG9ydFN0YXRlLT5wVmlld3BvcnRzWyVpXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpLCB2aWV3cG9ydF9pfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaGFzX2R5bmFtaWNfdmlld3BvcnRfd19zY2FsaW5nX252ICYmICFkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9jbGlwX3NwYWNlX3dfc2NhbGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwga1ZVSURfUFZFcnJvcl9FeHRlbnNpb25Ob3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucER5bmFtaWNTdGF0ZS0+cER5bmFtaWNTdGF0ZXMgY29udGFpbnMgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9XX1NDQUxJTkdfTlYsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX05WX2NsaXBfc3BhY2Vfd19zY2FsaW5nIGV4dGVuc2lvbiBpcyBub3QgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc19keW5hbWljX2Rpc2NhcmRfcmVjdGFuZ2xlX2V4dCAmJiAhZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2Rpc2NhcmRfcmVjdGFuZ2xlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwga1ZVSURfUFZFcnJvcl9FeHRlbnNpb25Ob3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucER5bmFtaWNTdGF0ZS0+cER5bmFtaWNTdGF0ZXMgY29udGFpbnMgVktfRFlOQU1JQ19TVEFURV9ESVNDQVJEX1JFQ1RBTkdMRV9FWFQsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0VYVF9kaXNjYXJkX3JlY3RhbmdsZXMgZXh0ZW5zaW9uIGlzIG5vdCBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaGFzX2R5bmFtaWNfc2FtcGxlX2xvY2F0aW9uc19leHQgJiYgIWRldmljZV9leHRlbnNpb25zLnZrX2V4dF9zYW1wbGVfbG9jYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTExfSEFORExFLCBrVlVJRF9QVkVycm9yX0V4dGVuc2lvbk5vdEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBDcmVhdGVJbmZvc1slIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXS5wRHluYW1pY1N0YXRlLT5wRHluYW1pY1N0YXRlcyBjb250YWlucyBWS19EWU5BTUlDX1NUQVRFX1NBTVBMRV9MT0NBVElPTlNfRVhULCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyBleHRlbnNpb24gaXMgbm90IGVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChoYXNfZHluYW1pY19leGNsdXNpdmVfc2Npc3Nvcl9udiAmJiAhZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfc2Npc3Nvcl9leGNsdXNpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsIGtWVUlEX1BWRXJyb3JfRXh0ZW5zaW9uTm90RW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdLnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzIGNvbnRhaW5zIFZLX0RZTkFNSUNfU1RBVEVfRVhDTFVTSVZFX1NDSVNTT1JfTlYsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX05WX3NjaXNzb3JfZXhjbHVzaXZlIGV4dGVuc2lvbiBpcyBub3QgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvYXJzZV9zYW1wbGVfb3JkZXJfc3RydWN0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjb2Fyc2Vfc2FtcGxlX29yZGVyX3N0cnVjdC0+c2FtcGxlT3JkZXJUeXBlICE9IFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9DVVNUT01fTlYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvYXJzZV9zYW1wbGVfb3JkZXJfc3RydWN0LT5jdXN0b21TYW1wbGVPcmRlckNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0Q29hcnNlU2FtcGxlT3JkZXJTdGF0ZUNyZWF0ZUluZm9OVi1zYW1wbGVPcmRlclR5cGUtMDIwNzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwQ3JlYXRlSW5mb3NbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIHNhbXBsZU9yZGVyVHlwZSBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19DT0FSU0VfU0FNUExFX09SREVSX1RZUEVfQ1VTVE9NX05WIGFuZCBjdXN0b21TYW1wbGVPcmRlckNvdW50IGlzIG5vdCAwLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29hcnNlX3NhbXBsZV9vcmRlcl9zdHJ1Y3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgb3JkZXJfaSA9IDA7IG9yZGVyX2kgPCBjb2Fyc2Vfc2FtcGxlX29yZGVyX3N0cnVjdC0+Y3VzdG9tU2FtcGxlT3JkZXJDb3VudDsgKytvcmRlcl9pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYoJmNvYXJzZV9zYW1wbGVfb3JkZXJfc3RydWN0LT5wQ3VzdG9tU2FtcGxlT3JkZXJzW29yZGVyX2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh2cF93X3NjYWxpbmdfc3RydWN0ICYmICh2cF93X3NjYWxpbmdfc3RydWN0LT52aWV3cG9ydFdTY2FsaW5nRW5hYmxlID09IFZLX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnBfd19zY2FsaW5nX3N0cnVjdC0+dmlld3BvcnRDb3VudCAhPSB2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydFdTY2FsaW5nRW5hYmxlLTAxNzI2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBDcmVhdGVJbmZvc1slIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaXBlbGluZVZpZXdwb3J0V1NjYWxpbmdTdGF0ZUNyZWF0ZUluZm9OVi52aWV3cG9ydENvdW50ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBlcXVhbCB0byBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8udmlld3BvcnRDb3VudCAoPSUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB2cF93X3NjYWxpbmdfc3RydWN0LT52aWV3cG9ydENvdW50LCB2aWV3cG9ydF9zdGF0ZS52aWV3cG9ydENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzX2R5bmFtaWNfdmlld3BvcnRfd19zY2FsaW5nX252ICYmICF2cF93X3NjYWxpbmdfc3RydWN0LT5wVmlld3BvcnRXU2NhbGluZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDE3MTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BpcGVsaW5lVmlld3BvcnRXU2NhbGluZ1N0YXRlQ3JlYXRlSW5mb05WLnBWaWV3cG9ydFdTY2FsaW5ncyAoPU5VTEwpIGlzIG5vdCBhIHZhbGlkIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wTXVsdGlzYW1wbGVTdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IGlmIHBDcmVhdGVJbmZvc1slZF0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+cmFzdGVyaXplckRpc2NhcmRFbmFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIFZLX0ZBTFNFLCBwQ3JlYXRlSW5mb3NbJWRdLnBNdWx0aXNhbXBsZVN0YXRlIG11c3Qgbm90IGJlIE5VTEwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSB2YWxpZF9uZXh0X3N0eXBlc1tdID0ge0x2bFR5cGVNYXA8VmtQaXBlbGluZUNvdmVyYWdlTW9kdWxhdGlvblN0YXRlQ3JlYXRlSW5mb05WPjo6a1NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMdmxUeXBlTWFwPFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVj46OmtTVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHZsVHlwZU1hcDxWa1BpcGVsaW5lU2FtcGxlTG9jYXRpb25zU3RhdGVDcmVhdGVJbmZvRVhUPjo6a1NUeXBlfTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsaWRfc3RydWN0X25hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICJWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYsIFZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OViwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQiOworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucE11bHRpc2FtcGxlU3RhdGUtPnBOZXh0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfc3RydWN0X25hbWVzLCBwQ3JlYXRlSW5mb3NbaV0ucE11bHRpc2FtcGxlU3RhdGUtPnBOZXh0LCAzLCB2YWxpZF9uZXh0X3N0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24sICJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1wTmV4dC1wTmV4dCIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBNdWx0aXNhbXBsZVN0YXRlLT5mbGFncyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wTXVsdGlzYW1wbGVTdGF0ZS0+ZmxhZ3MsICJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1mbGFncy16ZXJvYml0bWFzayIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wTXVsdGlzYW1wbGVTdGF0ZS0+c2FtcGxlU2hhZGluZ0VuYWJsZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wTXVsdGlzYW1wbGVTdGF0ZS0+c2FtcGxlU2hhZGluZ0VuYWJsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucE11bHRpc2FtcGxlU3RhdGUtPnJhc3Rlcml6YXRpb25TYW1wbGVzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wTXVsdGlzYW1wbGVTdGF0ZS0+cFNhbXBsZU1hc2siLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucE11bHRpc2FtcGxlU3RhdGUtPnJhc3Rlcml6YXRpb25TYW1wbGVzLCAmcENyZWF0ZUluZm9zW2ldLnBNdWx0aXNhbXBsZVN0YXRlLT5wU2FtcGxlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwga1ZVSURVbmRlZmluZWQpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfZmxhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBNdWx0aXNhbXBsZVN0YXRlLT5yYXN0ZXJpemF0aW9uU2FtcGxlcyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa1NhbXBsZUNvdW50RmxhZ0JpdHMiLCBBbGxWa1NhbXBsZUNvdW50RmxhZ0JpdHMsIHBDcmVhdGVJbmZvc1tpXS5wTXVsdGlzYW1wbGVTdGF0ZS0+cmFzdGVyaXphdGlvblNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZWRTaW5nbGVCaXQsICJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1yYXN0ZXJpemF0aW9uU2FtcGxlcy1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucE11bHRpc2FtcGxlU3RhdGUtPmFscGhhVG9Db3ZlcmFnZUVuYWJsZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wTXVsdGlzYW1wbGVTdGF0ZS0+YWxwaGFUb0NvdmVyYWdlRW5hYmxlKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucE11bHRpc2FtcGxlU3RhdGUtPmFscGhhVG9PbmVFbmFibGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucE11bHRpc2FtcGxlU3RhdGUtPmFscGhhVG9PbmVFbmFibGUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucE11bHRpc2FtcGxlU3RhdGUtPnNUeXBlICE9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX01VTFRJU0FNUExFX1NUQVRFX0NSRUFURV9JTkZPKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9JbnZhbGlkU3RydWN0U1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM6IHBhcmFtZXRlciBwQ3JlYXRlSW5mb3NbJWRdLnBNdWx0aXNhbXBsZVN0YXRlLT5zVHlwZSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTVVMVElTQU1QTEVfU1RBVEVfQ1JFQVRFX0lORk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucE11bHRpc2FtcGxlU3RhdGUtPnNhbXBsZVNoYWRpbmdFbmFibGUgPT0gVktfVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMuc2FtcGxlUmF0ZVNoYWRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1zYW1wbGVTaGFkaW5nRW5hYmxlLTAwNzg0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvc1slZF0ucE11bHRpc2FtcGxlU3RhdGUtPnNhbXBsZVNoYWRpbmdFbmFibGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIEFkZCBkb2N1bWVudGF0aW9uIGlzc3VlIGFib3V0IHdoZW4gbWluU2FtcGxlU2hhZGluZyBtdXN0IGJlIGluIHJhbmdlIGFuZCB3aGVuIGl0IGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgYSAibGVhc3Qgbm9pc2UiIHRlc3QgKm9ubHkqIHdoZW4gc2FtcGxlU2hhZGluZ0VuYWJsZSBpcyBWS19UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9pbmNsdXNpdmVfcmFuZ2UocENyZWF0ZUluZm9zW2ldLnBNdWx0aXNhbXBsZVN0YXRlLT5taW5TYW1wbGVTaGFkaW5nLCAwLkYsIDEuMEYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLW1pblNhbXBsZVNoYWRpbmctMDA3ODYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpOiBwYXJhbWV0ZXIgcENyZWF0ZUluZm9zWyVkXS5wTXVsdGlzYW1wbGVTdGF0ZS0+bWluU2FtcGxlU2hhZGluZy4iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gKmxpbmVfc3RhdGUgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBSYXN0ZXJpemF0aW9uU3RhdGUtPnBOZXh0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobGluZV9zdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsaW5lX3N0YXRlLT5saW5lUmFzdGVyaXphdGlvbk1vZGUgPT0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfQlJFU0VOSEFNX0VYVCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3N0YXRlLT5saW5lUmFzdGVyaXphdGlvbk1vZGUgPT0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfU01PT1RIX0VYVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBNdWx0aXNhbXBsZVN0YXRlLT5hbHBoYVRvQ292ZXJhZ2VFbmFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1saW5lUmFzdGVyaXphdGlvbk1vZGUtMDI3NjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpOiBCcmVzZW5oYW0vU21vb3RoIGxpbmUgcmFzdGVyaXphdGlvbiBub3Qgc3VwcG9ydGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zWyVkXS5wTXVsdGlzYW1wbGVTdGF0ZS0+YWxwaGFUb0NvdmVyYWdlRW5hYmxlID09IFZLX1RSVUUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucE11bHRpc2FtcGxlU3RhdGUtPmFscGhhVG9PbmVFbmFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1saW5lUmFzdGVyaXphdGlvbk1vZGUtMDI3NjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpOiBCcmVzZW5oYW0vU21vb3RoIGxpbmUgcmFzdGVyaXphdGlvbiBub3Qgc3VwcG9ydGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zWyVkXS5wTXVsdGlzYW1wbGVTdGF0ZS0+YWxwaGFUb09uZUVuYWJsZSA9PSBWS19UUlVFLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBNdWx0aXNhbXBsZVN0YXRlLT5zYW1wbGVTaGFkaW5nRW5hYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzY2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogQnJlc2VuaGFtL1Ntb290aCBsaW5lIHJhc3Rlcml6YXRpb24gbm90IHN1cHBvcnRlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvc1slZF0ucE11bHRpc2FtcGxlU3RhdGUtPnNhbXBsZVNoYWRpbmdFbmFibGUgPT0gVktfVFJVRS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZV9zdGF0ZS0+c3RpcHBsZWRMaW5lRW5hYmxlICYmICFoYXNfZHluYW1pY19saW5lX3N0aXBwbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZV9zdGF0ZS0+bGluZVN0aXBwbGVGYWN0b3IgPCAxIHx8IGxpbmVfc3RhdGUtPmxpbmVTdGlwcGxlRmFjdG9yID4gMjU2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3RpcHBsZWRMaW5lRW5hYmxlLTAyNzY3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogcENyZWF0ZUluZm9zWyVkXSBsaW5lU3RpcHBsZUZhY3RvciA9ICVkIG11c3QgYmUgaW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlIFsxLDI1Nl0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbGluZV9zdGF0ZS0+bGluZVN0aXBwbGVGYWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gKmxpbmVfZmVhdHVyZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VMaW5lUmFzdGVyaXphdGlvbkZlYXR1cmVzRVhUPihwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMyLnBOZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lX3N0YXRlLT5saW5lUmFzdGVyaXphdGlvbk1vZGUgPT0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfRVhUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFsaW5lX2ZlYXR1cmVzIHx8ICFsaW5lX2ZlYXR1cmVzLT5yZWN0YW5ndWxhckxpbmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULWxpbmVSYXN0ZXJpemF0aW9uTW9kZS0wMjc2OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHBDcmVhdGVJbmZvc1slZF0gbGluZVJhc3Rlcml6YXRpb25Nb2RlID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfRVhUIHJlcXVpcmVzIHRoZSByZWN0YW5ndWxhckxpbmVzIGZlYXR1cmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZV9zdGF0ZS0+bGluZVJhc3Rlcml6YXRpb25Nb2RlID09IFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX0JSRVNFTkhBTV9FWFQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWxpbmVfZmVhdHVyZXMgfHwgIWxpbmVfZmVhdHVyZXMtPmJyZXNlbmhhbUxpbmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULWxpbmVSYXN0ZXJpemF0aW9uTW9kZS0wMjc2OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHBDcmVhdGVJbmZvc1slZF0gbGluZVJhc3Rlcml6YXRpb25Nb2RlID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfQlJFU0VOSEFNX0VYVCByZXF1aXJlcyB0aGUgYnJlc2VuaGFtTGluZXMgZmVhdHVyZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lX3N0YXRlLT5saW5lUmFzdGVyaXphdGlvbk1vZGUgPT0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfU01PT1RIX0VYVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbGluZV9mZWF0dXJlcyB8fCAhbGluZV9mZWF0dXJlcy0+c21vb3RoTGluZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtbGluZVJhc3Rlcml6YXRpb25Nb2RlLTAyNzcwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogcENyZWF0ZUluZm9zWyVkXSBsaW5lUmFzdGVyaXphdGlvbk1vZGUgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9SRUNUQU5HVUxBUl9TTU9PVEhfRVhUIHJlcXVpcmVzIHRoZSBzbW9vdGhMaW5lcyBmZWF0dXJlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVfc3RhdGUtPnN0aXBwbGVkTGluZUVuYWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lX3N0YXRlLT5saW5lUmFzdGVyaXphdGlvbk1vZGUgPT0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfRVhUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbGluZV9mZWF0dXJlcyB8fCAhbGluZV9mZWF0dXJlcy0+c3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtc3RpcHBsZWRMaW5lRW5hYmxlLTAyNzcxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHBDcmVhdGVJbmZvc1slZF0gbGluZVJhc3Rlcml6YXRpb25Nb2RlID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX0VYVCB3aXRoIHN0aXBwbGUgcmVxdWlyZXMgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGlwcGxlZFJlY3Rhbmd1bGFyTGluZXMgZmVhdHVyZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lX3N0YXRlLT5saW5lUmFzdGVyaXphdGlvbk1vZGUgPT0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfQlJFU0VOSEFNX0VYVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWxpbmVfZmVhdHVyZXMgfHwgIWxpbmVfZmVhdHVyZXMtPnN0aXBwbGVkQnJlc2VuaGFtTGluZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogcENyZWF0ZUluZm9zWyVkXSBsaW5lUmFzdGVyaXphdGlvbk1vZGUgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfQlJFU0VOSEFNX0VYVCB3aXRoIHN0aXBwbGUgcmVxdWlyZXMgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGlwcGxlZEJyZXNlbmhhbUxpbmVzIGZlYXR1cmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZV9zdGF0ZS0+bGluZVJhc3Rlcml6YXRpb25Nb2RlID09IFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX1NNT09USF9FWFQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFsaW5lX2ZlYXR1cmVzIHx8ICFsaW5lX2ZlYXR1cmVzLT5zdGlwcGxlZFNtb290aExpbmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvbkxpbmVTdGF0ZUNyZWF0ZUluZm9FWFQtc3RpcHBsZWRMaW5lRW5hYmxlLTAyNzczIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCk6IHBDcmVhdGVJbmZvc1slZF0gbGluZVJhc3Rlcml6YXRpb25Nb2RlID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX1NNT09USF9FWFQgd2l0aCBzdGlwcGxlIHJlcXVpcmVzIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RpcHBsZWRTbW9vdGhMaW5lcyBmZWF0dXJlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVfc3RhdGUtPmxpbmVSYXN0ZXJpemF0aW9uTW9kZSA9PSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWxpbmVfZmVhdHVyZXMgfHwgIWxpbmVfZmVhdHVyZXMtPnN0aXBwbGVkU21vb3RoTGluZXMgfHwgIWRldmljZV9saW1pdHMuc3RyaWN0TGluZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKTogcENyZWF0ZUluZm9zWyVkXSBsaW5lUmFzdGVyaXphdGlvbk1vZGUgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfREVGQVVMVF9FWFQgd2l0aCBzdGlwcGxlIHJlcXVpcmVzIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RpcHBsZWRSZWN0YW5ndWxhckxpbmVzIGFuZCBzdHJpY3RMaW5lcyBmZWF0dXJlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBib29sIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhyZW5kZXJwYXNzX21hcF9tdXRleCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gc3VicGFzc2VzX3VzZXNfaXQgPSByZW5kZXJwYXNzZXNfc3RhdGVzLmZpbmQocENyZWF0ZUluZm9zW2ldLnJlbmRlclBhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VicGFzc2VzX3VzZXNfaXQgIT0gcmVuZGVycGFzc2VzX3N0YXRlcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmc3VicGFzc2VzX3VzZXMgPSBzdWJwYXNzZXNfdXNlc19pdC0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3Nlc191c2VzLnN1YnBhc3Nlc191c2luZ19jb2xvcl9hdHRhY2htZW50LmNvdW50KHBDcmVhdGVJbmZvc1tpXS5zdWJwYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VzX2NvbG9yX2F0dGFjaG1lbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3Nlc191c2VzLnN1YnBhc3Nlc191c2luZ19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudC5jb3VudChwQ3JlYXRlSW5mb3NbaV0uc3VicGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBEZXB0aFN0ZW5jaWxTdGF0ZSAhPSBudWxscHRyICYmIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+cE5leHQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5wTmV4dCwgMCwgTlVMTCwgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPmZsYWdzIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+ZmxhZ3MsICJWVUlELVZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5kZXB0aFRlc3RFbmFibGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5kZXB0aFRlc3RFbmFibGUpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPmRlcHRoV3JpdGVFbmFibGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5kZXB0aFdyaXRlRW5hYmxlKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPmRlcHRoQ29tcGFyZU9wIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZrQ29tcGFyZU9wIiwgQWxsVmtDb21wYXJlT3BFbnVtcywgcENyZWF0ZUluZm9zW2ldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+ZGVwdGhDb21wYXJlT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWRlcHRoQ29tcGFyZU9wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPmRlcHRoQm91bmRzVGVzdEVuYWJsZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPmRlcHRoQm91bmRzVGVzdEVuYWJsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9ib29sMzIoCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+c3RlbmNpbFRlc3RFbmFibGUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5zdGVuY2lsVGVzdEVuYWJsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5mcm9udC5mYWlsT3AiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtTdGVuY2lsT3AiLCBBbGxWa1N0ZW5jaWxPcEVudW1zLCBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5mcm9udC5mYWlsT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N0ZW5jaWxPcFN0YXRlLWZhaWxPcC1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPmZyb250LnBhc3NPcCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa1N0ZW5jaWxPcCIsIEFsbFZrU3RlbmNpbE9wRW51bXMsIHBDcmVhdGVJbmZvc1tpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPmZyb250LnBhc3NPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3RlbmNpbE9wU3RhdGUtcGFzc09wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+ZnJvbnQuZGVwdGhGYWlsT3AiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtTdGVuY2lsT3AiLCBBbGxWa1N0ZW5jaWxPcEVudW1zLCBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5mcm9udC5kZXB0aEZhaWxPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3RlbmNpbE9wU3RhdGUtZGVwdGhGYWlsT3AtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5mcm9udC5jb21wYXJlT3AiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtDb21wYXJlT3AiLCBBbGxWa0NvbXBhcmVPcEVudW1zLCBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5mcm9udC5jb21wYXJlT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvLWRlcHRoQ29tcGFyZU9wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+YmFjay5mYWlsT3AiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtTdGVuY2lsT3AiLCBBbGxWa1N0ZW5jaWxPcEVudW1zLCBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5iYWNrLmZhaWxPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3RlbmNpbE9wU3RhdGUtZmFpbE9wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+YmFjay5wYXNzT3AiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtTdGVuY2lsT3AiLCBBbGxWa1N0ZW5jaWxPcEVudW1zLCBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5iYWNrLnBhc3NPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3RlbmNpbE9wU3RhdGUtcGFzc09wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+YmFjay5kZXB0aEZhaWxPcCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa1N0ZW5jaWxPcCIsIEFsbFZrU3RlbmNpbE9wRW51bXMsIHBDcmVhdGVJbmZvc1tpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPmJhY2suZGVwdGhGYWlsT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N0ZW5jaWxPcFN0YXRlLWRlcHRoRmFpbE9wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBEZXB0aFN0ZW5jaWxTdGF0ZS0+YmFjay5jb21wYXJlT3AiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtDb21wYXJlT3AiLCBBbGxWa0NvbXBhcmVPcEVudW1zLCBwQ3JlYXRlSW5mb3NbaV0ucERlcHRoU3RlbmNpbFN0YXRlLT5iYWNrLmNvbXBhcmVPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8tZGVwdGhDb21wYXJlT3AtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wRGVwdGhTdGVuY2lsU3RhdGUtPnNUeXBlICE9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX0ludmFsaWRTdHJ1Y3RTVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lczogcGFyYW1ldGVyIHBDcmVhdGVJbmZvc1slZF0ucERlcHRoU3RlbmNpbFN0YXRlLT5zVHlwZSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfREVQVEhfU1RFTkNJTF9TVEFURV9DUkVBVEVfSU5GTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvW10gPSB7CisgICAgICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX0FEVkFOQ0VEX1NUQVRFX0NSRUFURV9JTkZPX0VYVH07CisKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBDb2xvckJsZW5kU3RhdGUgIT0gbnVsbHB0ciAmJiB1c2VzX2NvbG9yX2F0dGFjaG1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wQ29sb3JCbGVuZFN0YXRlIiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBDb2xvckJsZW5kU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfU1RBVEVfQ1JFQVRFX0lORk8sIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1zVHlwZS1zVHlwZSIpOworCisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wQ29sb3JCbGVuZFN0YXRlLT5wTmV4dCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa1BpcGVsaW5lQ29sb3JCbGVuZEFkdmFuY2VkU3RhdGVDcmVhdGVJbmZvRVhUIiwgcENyZWF0ZUluZm9zW2ldLnBDb2xvckJsZW5kU3RhdGUtPnBOZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZF9zdHJ1Y3RzX1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3Jlc2VydmVkX2ZsYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wQ29sb3JCbGVuZFN0YXRlLT5mbGFncyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5mbGFncywgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tZmxhZ3MtemVyb2JpdG1hc2siKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucENvbG9yQmxlbmRTdGF0ZS0+bG9naWNPcEVuYWJsZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5sb2dpY09wRW5hYmxlKTsKKworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wQ29sb3JCbGVuZFN0YXRlLT5hdHRhY2htZW50Q291bnQiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50cyIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5hdHRhY2htZW50Q291bnQsICZwQ3JlYXRlSW5mb3NbaV0ucENvbG9yQmxlbmRTdGF0ZS0+cEF0dGFjaG1lbnRzLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGtWVUlEVW5kZWZpbmVkLCBrVlVJRFVuZGVmaW5lZCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5wQXR0YWNobWVudHMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBhdHRhY2htZW50SW5kZXggPSAwOyBhdHRhY2htZW50SW5kZXggPCBwQ3JlYXRlSW5mb3NbaV0ucENvbG9yQmxlbmRTdGF0ZS0+YXR0YWNobWVudENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2F0dGFjaG1lbnRJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50c1slaV0uYmxlbmRFbmFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aSwgYXR0YWNobWVudEluZGV4fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLmJsZW5kRW5hYmxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wQ29sb3JCbGVuZFN0YXRlLT5wQXR0YWNobWVudHNbJWldLnNyY0NvbG9yQmxlbmRGYWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2ksIGF0dGFjaG1lbnRJbmRleH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtCbGVuZEZhY3RvciIsIEFsbFZrQmxlbmRGYWN0b3JFbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLnNyY0NvbG9yQmxlbmRGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLXNyY0NvbG9yQmxlbmRGYWN0b3ItcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucENvbG9yQmxlbmRTdGF0ZS0+cEF0dGFjaG1lbnRzWyVpXS5kc3RDb2xvckJsZW5kRmFjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpLCBhdHRhY2htZW50SW5kZXh9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQmxlbmRGYWN0b3IiLCBBbGxWa0JsZW5kRmFjdG9yRW51bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5wQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XS5kc3RDb2xvckJsZW5kRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1kc3RDb2xvckJsZW5kRmFjdG9yLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50c1slaV0uY29sb3JCbGVuZE9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpLCBhdHRhY2htZW50SW5kZXh9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQmxlbmRPcCIsIEFsbFZrQmxlbmRPcEVudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucENvbG9yQmxlbmRTdGF0ZS0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0uY29sb3JCbGVuZE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1jb2xvckJsZW5kT3AtcGFyYW1ldGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucENvbG9yQmxlbmRTdGF0ZS0+cEF0dGFjaG1lbnRzWyVpXS5zcmNBbHBoYUJsZW5kRmFjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpLCBhdHRhY2htZW50SW5kZXh9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQmxlbmRGYWN0b3IiLCBBbGxWa0JsZW5kRmFjdG9yRW51bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5wQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XS5zcmNBbHBoYUJsZW5kRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1zcmNBbHBoYUJsZW5kRmFjdG9yLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwQ3JlYXRlSW5mb3NbJWldLnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50c1slaV0uZHN0QWxwaGFCbGVuZEZhY3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aSwgYXR0YWNobWVudEluZGV4fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0JsZW5kRmFjdG9yIiwgQWxsVmtCbGVuZEZhY3RvckVudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0ucENvbG9yQmxlbmRTdGF0ZS0+cEF0dGFjaG1lbnRzW2F0dGFjaG1lbnRJbmRleF0uZHN0QWxwaGFCbGVuZEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtZHN0QWxwaGFCbGVuZEZhY3Rvci1wYXJhbWV0ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5wQ29sb3JCbGVuZFN0YXRlLT5wQXR0YWNobWVudHNbJWldLmFscGhhQmxlbmRPcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aSwgYXR0YWNobWVudEluZGV4fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0JsZW5kT3AiLCBBbGxWa0JsZW5kT3BFbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zW2ldLnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50c1thdHRhY2htZW50SW5kZXhdLmFscGhhQmxlbmRPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtYWxwaGFCbGVuZE9wLXBhcmFtZXRlciIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9mbGFncygidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucENvbG9yQmxlbmRTdGF0ZS0+cEF0dGFjaG1lbnRzWyVpXS5jb2xvcldyaXRlTWFzayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aSwgYXR0YWNobWVudEluZGV4fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0NvbG9yQ29tcG9uZW50RmxhZ0JpdHMiLCBBbGxWa0NvbG9yQ29tcG9uZW50RmxhZ0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5wQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XS5jb2xvcldyaXRlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdGlvbmFsRmxhZ3MsICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWNvbG9yV3JpdGVNYXNrLXBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5zVHlwZSAhPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX1BWRXJyb3JfSW52YWxpZFN0cnVjdFNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOiBwYXJhbWV0ZXIgcENyZWF0ZUluZm9zWyVkXS5wQ29sb3JCbGVuZFN0YXRlLT5zVHlwZSBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ09MT1JfQkxFTkRfU1RBVEVfQ1JFQVRFX0lORk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgbG9naWNPcEVuYWJsZSBpcyBWS19UUlVFLCBsb2dpY09wIG11c3QgYmUgYSB2YWxpZCBWa0xvZ2ljT3AgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5sb2dpY09wRW5hYmxlID09IFZLX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucENvbG9yQmxlbmRTdGF0ZS0+bG9naWNPcCIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwgIlZrTG9naWNPcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsVmtMb2dpY09wRW51bXMsIHBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlLT5sb2dpY09wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvLWxvZ2ljT3BFbmFibGUtMDA2MDciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5mbGFncyAmIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCkgeworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0uYmFzZVBpcGVsaW5lSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5iYXNlUGlwZWxpbmVIYW5kbGUgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNzI0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyBwYXJhbWV0ZXIsIHBDcmVhdGVJbmZvcy0+YmFzZVBpcGVsaW5lSGFuZGxlLCBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfTlVMTF9IQU5ETEUgaWYgcENyZWF0ZUluZm9zLT5mbGFncyBjb250YWlucyB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGZsYWcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcENyZWF0ZUluZm9zLT5iYXNlUGlwZWxpbmVJbmRleCBpcyBub3QgLTEuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLmJhc2VQaXBlbGluZUhhbmRsZSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLmJhc2VQaXBlbGluZUluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgcGFyYW1ldGVyLCBwQ3JlYXRlSW5mb3MtPmJhc2VQaXBlbGluZUluZGV4LCBtdXN0IGJlIC0xIGlmICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zLT5mbGFncyBjb250YWlucyB0aGUgVktfUElQRUxJTkVfQ1JFQVRFX0RFUklWQVRJVkVfQklUIGZsYWcgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zLT5iYXNlUGlwZWxpbmVIYW5kbGUgaXMgbm90IFZLX05VTExfSEFORExFLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGNvbnN0IHVpbnQzMl90PihwQ3JlYXRlSW5mb3NbaV0uYmFzZVBpcGVsaW5lSW5kZXgpID49IGNyZWF0ZUluZm9Db3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA3MjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIHBhcmFtZXRlciBwQ3JlYXRlSW5mb3MtPmJhc2VQaXBlbGluZUluZGV4ICglZCkgbXVzdCBiZSBhIHZhbGlkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCBpbnRvIHRoZSBwQ3JlYXRlSW5mb3MgYXJyYXksIG9mIHNpemUgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mb3NbaV0uYmFzZVBpcGVsaW5lSW5kZXgsIGNyZWF0ZUluZm9Db3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaV0ucFJhc3Rlcml6YXRpb25TdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfZmlsbF9yZWN0YW5nbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5wb2x5Z29uTW9kZSA9PSBWS19QT0xZR09OX01PREVfRklMTF9SRUNUQU5HTEVfTlYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tcG9seWdvbk1vZGUtMDE0MTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMgcGFyYW1ldGVyLCBWa1BvbHlnb25Nb2RlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mb3MtPnBSYXN0ZXJpemF0aW9uU3RhdGUtPnBvbHlnb25Nb2RlIGNhbm5vdCBiZSBWS19QT0xZR09OX01PREVfRklMTF9SRUNUQU5HTEVfTlYgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmIHRoZSBleHRlbnNpb24gVktfTlZfZmlsbF9yZWN0YW5nbGUgaXMgbm90IGVuYWJsZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBDcmVhdGVJbmZvc1tpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5wb2x5Z29uTW9kZSAhPSBWS19QT0xZR09OX01PREVfRklMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzLmZpbGxNb2RlTm9uU29saWQgPT0gZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9EZXZpY2VGZWF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIHBhcmFtZXRlciwgVmtQb2x5Z29uTW9kZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvcy0+cFJhc3Rlcml6YXRpb25TdGF0ZS0+cG9seWdvbk1vZGUgY2Fubm90IGJlIFZLX1BPTFlHT05fTU9ERV9QT0lOVCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1BPTFlHT05fTU9ERV9MSU5FIGlmIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcy0+ZmlsbE1vZGVOb25Tb2xpZCBpcyBmYWxzZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocENyZWF0ZUluZm9zW2ldLnBSYXN0ZXJpemF0aW9uU3RhdGUtPnBvbHlnb25Nb2RlICE9IFZLX1BPTFlHT05fTU9ERV9GSUxMKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBDcmVhdGVJbmZvc1tpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5wb2x5Z29uTW9kZSAhPSBWS19QT0xZR09OX01PREVfRklMTF9SRUNUQU5HTEVfTlYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzLmZpbGxNb2RlTm9uU29saWQgPT0gZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLTAxNTA3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIHBhcmFtZXRlciwgVmtQb2x5Z29uTW9kZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm9zLT5wUmFzdGVyaXphdGlvblN0YXRlLT5wb2x5Z29uTW9kZSBtdXN0IGJlIFZLX1BPTFlHT05fTU9ERV9GSUxMIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19QT0xZR09OX01PREVfRklMTF9SRUNUQU5HTEVfTlYgaWYgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzLT5maWxsTW9kZU5vblNvbGlkIGlzIGZhbHNlLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFoYXNfZHluYW1pY19saW5lX3dpZHRoICYmICFwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMud2lkZUxpbmVzICYmCisgICAgICAgICAgICAgICAgICAgIChwQ3JlYXRlSW5mb3NbaV0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+bGluZVdpZHRoICE9IDEuMGYpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAwNzQ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbGluZSB3aWR0aCBzdGF0ZSBpcyBzdGF0aWMgKHBDcmVhdGVJbmZvc1slIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdLnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzIGRvZXMgbm90IGNvbnRhaW4gVktfRFlOQU1JQ19TVEFURV9MSU5FX1dJRFRIKSBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6d2lkZUxpbmVzIGlzIGRpc2FibGVkLCBidXQgcENyZWF0ZUluZm9zWyUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0ucFJhc3Rlcml6YXRpb25TdGF0ZS0+bGluZVdpZHRoICg9JWYpIGlzIG5vdCAxLjAuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGksIHBDcmVhdGVJbmZvc1tpXS5wUmFzdGVyaXphdGlvblN0YXRlLT5saW5lV2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwQ3JlYXRlSW5mb3NbaV0uc3RhZ2VDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJpbmcoInZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBDcmVhdGVJbmZvc1slaV0ucFN0YWdlc1slaV0ucE5hbWUiLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3RvcntpLCBqfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLXBhcmFtZXRlciIsIHBDcmVhdGVJbmZvc1tpXS5wU3RhZ2VzW2pdLnBOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21wdXRlUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICpwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZSAqcFBpcGVsaW5lcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7IGkrKykgeworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cmluZygidmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicENyZWF0ZUluZm9zWyVpXS5zdGFnZS5wTmFtZSIsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmFtZS1wYXJhbWV0ZXIiLCBwQ3JlYXRlSW5mb3NbaV0uc3RhZ2UucE5hbWUpOworICAgICAgICBhdXRvIGZlZWRiYWNrX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVD4ocENyZWF0ZUluZm9zW2ldLnBOZXh0KTsKKyAgICAgICAgaWYgKChmZWVkYmFja19zdHJ1Y3QgIT0gbnVsbHB0cikgJiYgKGZlZWRiYWNrX3N0cnVjdC0+cGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCAhPSAxKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQtMDI2NjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMoKTogaW4gcENyZWF0ZUluZm9bJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0sIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUOjpwaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50IG11c3QgZXF1YWwgMSwgZm91bmQgJSIgUFJJdTMyICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBmZWVkYmFja19zdHJ1Y3QtPnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTYW1wbGVyICpwU2FtcGxlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKHBDcmVhdGVJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgY29uc3QgYXV0byAmZmVhdHVyZXMgPSBwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXM7CisgICAgICAgIGNvbnN0IGF1dG8gJmxpbWl0cyA9IGRldmljZV9saW1pdHM7CisKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5hbmlzb3Ryb3B5RW5hYmxlID09IFZLX1RSVUUpIHsKKyAgICAgICAgICAgIGlmICghaW5faW5jbHVzaXZlX3JhbmdlKHBDcmVhdGVJbmZvLT5tYXhBbmlzb3Ryb3B5LCAxLjBGLCBsaW1pdHMubWF4U2FtcGxlckFuaXNvdHJvcHkpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWFuaXNvdHJvcHlFbmFibGUtMDEwNzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVTYW1wbGVyKCk6IHZhbHVlIG9mICVzIG11c3QgYmUgaW4gcmFuZ2UgWzEuMCwgJWZdICVzLCBidXQgJWYgZm91bmQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvLT5tYXhBbmlzb3Ryb3B5IiwgbGltaXRzLm1heFNhbXBsZXJBbmlzb3Ryb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4U2FtcGxlckFuaXN0cm9weSIsIHBDcmVhdGVJbmZvLT5tYXhBbmlzb3Ryb3B5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW5pc3Ryb3B5IGNhbm5vdCBiZSBlbmFibGVkIGluIHNhbXBsZXIgdW5sZXNzIGVuYWJsZWQgYXMgYSBmZWF0dXJlCisgICAgICAgICAgICBpZiAoZmVhdHVyZXMuc2FtcGxlckFuaXNvdHJvcHkgPT0gVktfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYW5pc290cm9weUVuYWJsZS0wMTA3MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVNhbXBsZXIoKTogQW5pc290cm9waWMgc2FtcGxpbmcgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgJXMgbXVzdCBiZSBWS19GQUxTRS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPmFuaXNvdHJvcHlFbmFibGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgPT0gVktfVFJVRSkgeworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5taW5GaWx0ZXIgIT0gcENyZWF0ZUluZm8tPm1hZ0ZpbHRlcikgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVNhbXBsZXIoKTogd2hlbiBwQ3JlYXRlSW5mby0+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgaXMgVktfVFJVRSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPm1pbkZpbHRlciAoJXMpIGFuZCBwQ3JlYXRlSW5mby0+bWFnRmlsdGVyICglcykgbXVzdCBiZSBlcXVhbC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfVmtGaWx0ZXIocENyZWF0ZUluZm8tPm1pbkZpbHRlciksIHN0cmluZ19Wa0ZpbHRlcihwQ3JlYXRlSW5mby0+bWFnRmlsdGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPm1pcG1hcE1vZGUgIT0gVktfU0FNUExFUl9NSVBNQVBfTU9ERV9ORUFSRVNUKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDczIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlU2FtcGxlcigpOiB3aGVuIHBDcmVhdGVJbmZvLT51bm5vcm1hbGl6ZWRDb29yZGluYXRlcyBpcyBWS19UUlVFLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+bWlwbWFwTW9kZSAoJXMpIG11c3QgYmUgVktfU0FNUExFUl9NSVBNQVBfTU9ERV9ORUFSRVNULiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa1NhbXBsZXJNaXBtYXBNb2RlKHBDcmVhdGVJbmZvLT5taXBtYXBNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPm1pbkxvZCAhPSAwLjBmIHx8IHBDcmVhdGVJbmZvLT5tYXhMb2QgIT0gMC4wZikgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVNhbXBsZXIoKTogd2hlbiBwQ3JlYXRlSW5mby0+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgaXMgVktfVFJVRSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPm1pbkxvZCAoJWYpIGFuZCBwQ3JlYXRlSW5mby0+bWF4TG9kICglZikgbXVzdCBib3RoIGJlIHplcm8uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPm1pbkxvZCwgcENyZWF0ZUluZm8tPm1heExvZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHBDcmVhdGVJbmZvLT5hZGRyZXNzTW9kZVUgIT0gVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRSAmJgorICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+YWRkcmVzc01vZGVVICE9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0JPUkRFUikgfHwKKyAgICAgICAgICAgICAgICAocENyZWF0ZUluZm8tPmFkZHJlc3NNb2RlViAhPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFICYmCisgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5hZGRyZXNzTW9kZVYgIT0gVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVNhbXBsZXIoKTogd2hlbiBwQ3JlYXRlSW5mby0+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgaXMgVktfVFJVRSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPmFkZHJlc3NNb2RlVSAoJXMpIGFuZCBwQ3JlYXRlSW5mby0+YWRkcmVzc01vZGVWICglcykgbXVzdCBib3RoIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0Ugb3IgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa1NhbXBsZXJBZGRyZXNzTW9kZShwQ3JlYXRlSW5mby0+YWRkcmVzc01vZGVVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2FtcGxlckFkZHJlc3NNb2RlKHBDcmVhdGVJbmZvLT5hZGRyZXNzTW9kZVYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+YW5pc290cm9weUVuYWJsZSA9PSBWS19UUlVFKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDc2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlU2FtcGxlcigpOiBwQ3JlYXRlSW5mby0+YW5pc290cm9weUVuYWJsZSBhbmQgcENyZWF0ZUluZm8tPnVubm9ybWFsaXplZENvb3JkaW5hdGVzIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGJvdGggYmUgVktfVFJVRS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+Y29tcGFyZUVuYWJsZSA9PSBWS19UUlVFKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDc3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlU2FtcGxlcigpOiBwQ3JlYXRlSW5mby0+Y29tcGFyZUVuYWJsZSBhbmQgcENyZWF0ZUluZm8tPnVubm9ybWFsaXplZENvb3JkaW5hdGVzIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGJvdGggYmUgVktfVFJVRS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGNvbXBhcmVFbmFibGUgaXMgVktfVFJVRSwgY29tcGFyZU9wIG11c3QgYmUgYSB2YWxpZCBWa0NvbXBhcmVPcCB2YWx1ZQorICAgICAgICBpZiAocENyZWF0ZUluZm8tPmNvbXBhcmVFbmFibGUgPT0gVktfVFJVRSkgeworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bSgidmtDcmVhdGVTYW1wbGVyIiwgInBDcmVhdGVJbmZvLT5jb21wYXJlT3AiLCAiVmtDb21wYXJlT3AiLCBBbGxWa0NvbXBhcmVPcEVudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+Y29tcGFyZU9wLCAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWNvbXBhcmVFbmFibGUtMDEwODAiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGFueSBvZiBhZGRyZXNzTW9kZVUsIGFkZHJlc3NNb2RlViBvciBhZGRyZXNzTW9kZVcgYXJlIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0JPUkRFUiwgYm9yZGVyQ29sb3IgbXVzdCBiZSBhCisgICAgICAgIC8vIHZhbGlkIFZrQm9yZGVyQ29sb3IgdmFsdWUKKyAgICAgICAgaWYgKChwQ3JlYXRlSW5mby0+YWRkcmVzc01vZGVVID09IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0JPUkRFUikgfHwKKyAgICAgICAgICAgIChwQ3JlYXRlSW5mby0+YWRkcmVzc01vZGVWID09IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0JPUkRFUikgfHwKKyAgICAgICAgICAgIChwQ3JlYXRlSW5mby0+YWRkcmVzc01vZGVXID09IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0JPUkRFUikpIHsKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrQ3JlYXRlU2FtcGxlciIsICJwQ3JlYXRlSW5mby0+Ym9yZGVyQ29sb3IiLCAiVmtCb3JkZXJDb2xvciIsIEFsbFZrQm9yZGVyQ29sb3JFbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPmJvcmRlckNvbG9yLCAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLWFkZHJlc3NNb2RlVS0wMTA3OCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgYW55IG9mIGFkZHJlc3NNb2RlVSwgYWRkcmVzc01vZGVWIG9yIGFkZHJlc3NNb2RlVyBhcmUgVktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SX0NMQU1QX1RPX0VER0UsIHRoZQorICAgICAgICAvLyBWS19LSFJfc2FtcGxlcl9taXJyb3JfY2xhbXBfdG9fZWRnZSBleHRlbnNpb24gbXVzdCBiZSBlbmFibGVkCisgICAgICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UgJiYKKyAgICAgICAgICAgICgocENyZWF0ZUluZm8tPmFkZHJlc3NNb2RlVSA9PSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRSkgfHwKKyAgICAgICAgICAgICAocENyZWF0ZUluZm8tPmFkZHJlc3NNb2RlViA9PSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRSkgfHwKKyAgICAgICAgICAgICAocENyZWF0ZUluZm8tPmFkZHJlc3NNb2RlVyA9PSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRSkpKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYWRkcmVzc01vZGVVLTAxMDc5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVNhbXBsZXIoKTogQSBWa1NhbXBsZXJBZGRyZXNzTW9kZSB2YWx1ZSBpcyBzZXQgdG8gVktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SX0NMQU1QX1RPX0VER0UgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB0aGUgVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UgZXh0ZW5zaW9uIGhhcyBub3QgYmVlbiBlbmFibGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2tzIGZvciB0aGUgSU1HIGN1YmljIGZpbHRlcmluZyBleHRlbnNpb24KKyAgICAgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2ltZ19maWx0ZXJfY3ViaWMpIHsKKyAgICAgICAgICAgIGlmICgocENyZWF0ZUluZm8tPmFuaXNvdHJvcHlFbmFibGUgPT0gVktfVFJVRSkgJiYKKyAgICAgICAgICAgICAgICAoKHBDcmVhdGVJbmZvLT5taW5GaWx0ZXIgPT0gVktfRklMVEVSX0NVQklDX0lNRykgfHwgKHBDcmVhdGVJbmZvLT5tYWdGaWx0ZXIgPT0gVktfRklMVEVSX0NVQklDX0lNRykpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLW1hZ0ZpbHRlci0wMTA4MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVNhbXBsZXIoKTogQW5pc290cm9waWMgc2FtcGxpbmcgbXVzdCBub3QgYmUgVktfVFJVRSB3aGVuIGVpdGhlciBtaW5GaWx0ZXIgb3IgbWFnRmlsdGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZSBWS19GSUxURVJfQ1VCSUNfSU1HLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgKnBTZXRMYXlvdXQpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFZhbGlkYXRpb24gZm9yIHBhcmFtZXRlcnMgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHZhbGlkYXRpb24gY29kZSBkdWUgdG8gYSAnbm9hdXRvdmFsaWRpdHknIHRhZyBpbiB2ay54bWwKKyAgICBpZiAoKHBDcmVhdGVJbmZvICE9IG51bGxwdHIpICYmIChwQ3JlYXRlSW5mby0+cEJpbmRpbmdzICE9IG51bGxwdHIpKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+YmluZGluZ0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2ldLmRlc2NyaXB0b3JDb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgb3IgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIGFuZCBkZXNjcmlwdG9yQ291bnQKKyAgICAgICAgICAgICAgICAvLyBpcyBub3QgMCBhbmQgcEltbXV0YWJsZVNhbXBsZXJzIGlzIG5vdCBOVUxMLCBwSW1tdXRhYmxlU2FtcGxlcnMgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVzY3JpcHRvckNvdW50CisgICAgICAgICAgICAgICAgLy8gdmFsaWQgVmtTYW1wbGVyIGhhbmRsZXMKKyAgICAgICAgICAgICAgICBpZiAoKChwQ3JlYXRlSW5mby0+cEJpbmRpbmdzW2ldLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSKSB8fAorICAgICAgICAgICAgICAgICAgICAgKHBDcmVhdGVJbmZvLT5wQmluZGluZ3NbaV0uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIpKSAmJgorICAgICAgICAgICAgICAgICAgICAocENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpXS5wSW1tdXRhYmxlU2FtcGxlcnMgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkZXNjcmlwdG9yX2luZGV4ID0gMDsgZGVzY3JpcHRvcl9pbmRleCA8IHBDcmVhdGVJbmZvLT5wQmluZGluZ3NbaV0uZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICsrZGVzY3JpcHRvcl9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQmluZGluZ3NbaV0ucEltbXV0YWJsZVNhbXBsZXJzW2Rlc2NyaXB0b3JfaW5kZXhdID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX1JlcXVpcmVkUGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0OiByZXF1aXJlZCBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBCaW5kaW5nc1slZF0ucEltbXV0YWJsZVNhbXBsZXJzWyVkXSBzcGVjaWZpZWQgYXMgVktfTlVMTF9IQU5ETEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkZXNjcmlwdG9yX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIGRlc2NyaXB0b3JDb3VudCBpcyBub3QgMCwgc3RhZ2VGbGFncyBtdXN0IGJlIGEgdmFsaWQgY29tYmluYXRpb24gb2YgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHZhbHVlcworICAgICAgICAgICAgICAgIGlmICgocENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpXS5zdGFnZUZsYWdzICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICgocENyZWF0ZUluZm8tPnBCaW5kaW5nc1tpXS5zdGFnZUZsYWdzICYgKH5BbGxWa1NoYWRlclN0YWdlRmxhZ0JpdHMpKSAhPSAwKSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nLWRlc2NyaXB0b3JDb3VudC0wMDI4MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KCk6IGlmIHBDcmVhdGVJbmZvLT5wQmluZGluZ3NbJWRdLmRlc2NyaXB0b3JDb3VudCBpcyBub3QgMCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvLT5wQmluZGluZ3NbJWRdLnN0YWdlRmxhZ3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUZyZWVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVzY3JpcHRvclNldENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JTZXRzKSBjb25zdCB7CisgICAgLy8gVmFsaWRhdGlvbiBmb3IgcGFyYW1ldGVycyBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdmFsaWRhdGlvbiBjb2RlIGR1ZSB0byBhICdub2F1dG92YWxpZGl0eScgdGFnIGluIHZrLnhtbAorICAgIC8vIFRoaXMgaXMgYW4gYXJyYXkgb2YgaGFuZGxlcywgd2hlcmUgdGhlIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHRvIGJlIFZLX05VTExfSEFORExFLCBhbmQgZG9lcyBub3QgcmVxdWlyZSBhbnkgdmFsaWRhdGlvbiBiZXlvbmQKKyAgICAvLyB2YWxpZGF0ZV9hcnJheSgpCisgICAgcmV0dXJuIHZhbGlkYXRlX2FycmF5KCJ2a0ZyZWVEZXNjcmlwdG9yU2V0cyIsICJkZXNjcmlwdG9yU2V0Q291bnQiLCAicERlc2NyaXB0b3JTZXRzIiwgZGVzY3JpcHRvclNldENvdW50LCAmcERlc2NyaXB0b3JTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwga1ZVSURVbmRlZmluZWQpOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yV3JpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yQ29waWVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgLy8gVmFsaWRhdGlvbiBmb3IgcGFyYW1ldGVycyBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdmFsaWRhdGlvbiBjb2RlIGR1ZSB0byBhICdub2F1dG92YWxpZGl0eScgdGFnIGluIHZrLnhtbAorICAgIGlmIChwRGVzY3JpcHRvcldyaXRlcyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yV3JpdGVDb3VudDsgKytpKSB7CisgICAgICAgICAgICAvLyBkZXNjcmlwdG9yQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAorICAgICAgICAgICAgaWYgKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrVXBkYXRlRGVzY3JpcHRvclNldHMoKTogcGFyYW1ldGVyIHBEZXNjcmlwdG9yV3JpdGVzWyVkXS5kZXNjcmlwdG9yQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4iLCBpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZHN0U2V0IG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JTZXQgaGFuZGxlCisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZSgidmtVcGRhdGVEZXNjcmlwdG9yU2V0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwRGVzY3JpcHRvcldyaXRlc1slaV0uZHN0U2V0IiwgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXNbaV0uZHN0U2V0KTsKKworICAgICAgICAgICAgaWYgKChwRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUikgfHwKKyAgICAgICAgICAgICAgICAocERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIpIHx8CisgICAgICAgICAgICAgICAgKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFKSB8fAorICAgICAgICAgICAgICAgIChwRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSkgfHwKKyAgICAgICAgICAgICAgICAocERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLAorICAgICAgICAgICAgICAgIC8vIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSBvciBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVCwKKyAgICAgICAgICAgICAgICAvLyBwSW1hZ2VJbmZvIG11c3QgYmUgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JDb3VudCB2YWxpZCBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gc3RydWN0dXJlcworICAgICAgICAgICAgICAgIGlmIChwRGVzY3JpcHRvcldyaXRlc1tpXS5wSW1hZ2VJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrVXBkYXRlRGVzY3JpcHRvclNldHMoKTogaWYgcERlc2NyaXB0b3JXcml0ZXNbJWRdLmRlc2NyaXB0b3JUeXBlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0Ugb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5ULCBwRGVzY3JpcHRvcldyaXRlc1slZF0ucEltYWdlSW5mbyBtdXN0IG5vdCBiZSBOVUxMLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlICE9IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGRlc2NyaXB0b3JUeXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0Ugb3IgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQsIHRoZSBpbWFnZVZpZXcgYW5kIGltYWdlTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIC8vIG1lbWJlcnMgb2YgYW55IGdpdmVuIGVsZW1lbnQgb2YgcEltYWdlSW5mbyBtdXN0IGJlIGEgdmFsaWQgVmtJbWFnZVZpZXcgYW5kIFZrSW1hZ2VMYXlvdXQsIHJlc3BlY3RpdmVseQorICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRlc2NyaXB0b3JfaW5kZXggPSAwOyBkZXNjcmlwdG9yX2luZGV4IDwgcERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICsrZGVzY3JpcHRvcl9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrVXBkYXRlRGVzY3JpcHRvclNldHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicERlc2NyaXB0b3JXcml0ZXNbJWldLnBJbWFnZUluZm9bJWldLmltYWdlVmlldyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2ksIGRlc2NyaXB0b3JfaW5kZXh9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzW2ldLnBJbWFnZUluZm9bZGVzY3JpcHRvcl9pbmRleF0uaW1hZ2VWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmFuZ2VkX2VudW0oInZrVXBkYXRlRGVzY3JpcHRvclNldHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJOYW1lKCJwRGVzY3JpcHRvcldyaXRlc1slaV0ucEltYWdlSW5mb1slaV0uaW1hZ2VMYXlvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2ksIGRlc2NyaXB0b3JfaW5kZXh9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrSW1hZ2VMYXlvdXQiLCBBbGxWa0ltYWdlTGF5b3V0RW51bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzW2ldLnBJbWFnZUluZm9bZGVzY3JpcHRvcl9pbmRleF0uaW1hZ2VMYXlvdXQsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsCisgICAgICAgICAgICAgICAgLy8gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMsIHBCdWZmZXJJbmZvIG11c3QgYmUgYQorICAgICAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVzY3JpcHRvckNvdW50IHZhbGlkIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gc3RydWN0dXJlcworICAgICAgICAgICAgICAgIGlmIChwRGVzY3JpcHRvcldyaXRlc1tpXS5wQnVmZmVySW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCk6IGlmIHBEZXNjcmlwdG9yV3JpdGVzWyVkXS5kZXNjcmlwdG9yVHlwZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyBvciBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBEZXNjcmlwdG9yV3JpdGVzWyVkXS5wQnVmZmVySW5mbyBtdXN0IG5vdCBiZSBOVUxMLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGRlc2NyaXB0b3JJbmRleCA9IDA7IGRlc2NyaXB0b3JJbmRleCA8IHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudDsgKytkZXNjcmlwdG9ySW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBEZXNjcmlwdG9yV3JpdGVzWyVpXS5wQnVmZmVySW5mb1slaV0uYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZTo6SW5kZXhWZWN0b3J7aSwgZGVzY3JpcHRvckluZGV4fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlc1tpXS5wQnVmZmVySW5mb1tkZXNjcmlwdG9ySW5kZXhdLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChwRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChwRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVIpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgZGVzY3JpcHRvclR5cGUgaXMgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSIG9yIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAvLyBwVGV4ZWxCdWZmZXJWaWV3IG11c3QgYmUgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JDb3VudCB2YWxpZCBWa0J1ZmZlclZpZXcgaGFuZGxlcworICAgICAgICAgICAgICAgIGlmIChwRGVzY3JpcHRvcldyaXRlc1tpXS5wVGV4ZWxCdWZmZXJWaWV3ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrVXBkYXRlRGVzY3JpcHRvclNldHMoKTogaWYgcERlc2NyaXB0b3JXcml0ZXNbJWRdLmRlc2NyaXB0b3JUeXBlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIgb3IgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicERlc2NyaXB0b3JXcml0ZXNbJWRdLnBUZXhlbEJ1ZmZlclZpZXcgbXVzdCBub3QgYmUgTlVMTC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBkZXNjcmlwdG9yX2luZGV4ID0gMDsgZGVzY3JpcHRvcl9pbmRleCA8IHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICArK2Rlc2NyaXB0b3JfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWUoInBEZXNjcmlwdG9yV3JpdGVzWyVpXS5wVGV4ZWxCdWZmZXJWaWV3WyVpXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye2ksIGRlc2NyaXB0b3JfaW5kZXh9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzW2ldLnBUZXhlbEJ1ZmZlclZpZXdbZGVzY3JpcHRvcl9pbmRleF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUikgfHwKKyAgICAgICAgICAgICAgICAocERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMpKSB7CisgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHVuaWZvcm1BbGlnbm1lbnQgPSBkZXZpY2VfbGltaXRzLm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwRGVzY3JpcHRvcldyaXRlc1tpXS5wQnVmZmVySW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FmZU1vZHVsbyhwRGVzY3JpcHRvcldyaXRlc1tpXS5wQnVmZmVySW5mb1tqXS5vZmZzZXQsIHVuaWZvcm1BbGlnbm1lbnQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrVXBkYXRlRGVzY3JpcHRvclNldHMoKTogcERlc2NyaXB0b3JXcml0ZXNbJWRdLnBCdWZmZXJJbmZvWyVkXS5vZmZzZXQgKDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZGV2aWNlIGxpbWl0IG1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQgMHglIiBQUkl4TEVBU1Q2NCAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgcERlc2NyaXB0b3JXcml0ZXNbaV0ucEJ1ZmZlckluZm9bal0ub2Zmc2V0LCB1bmlmb3JtQWxpZ25tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDKSkgeworICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBzdG9yYWdlQWxpZ25tZW50ID0gZGV2aWNlX2xpbWl0cy5taW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocERlc2NyaXB0b3JXcml0ZXNbaV0ucEJ1ZmZlckluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNhZmVNb2R1bG8ocERlc2NyaXB0b3JXcml0ZXNbaV0ucEJ1ZmZlckluZm9bal0ub2Zmc2V0LCBzdG9yYWdlQWxpZ25tZW50KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCk6IHBEZXNjcmlwdG9yV3JpdGVzWyVkXS5wQnVmZmVySW5mb1slZF0ub2Zmc2V0ICgweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGRldmljZSBsaW1pdCBtaW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50IDB4JSIgUFJJeExFQVNUNjQgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIHBEZXNjcmlwdG9yV3JpdGVzW2ldLnBCdWZmZXJJbmZvW2pdLm9mZnNldCwgc3RvcmFnZUFsaWdubWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1JlbmRlclBhc3MgKnBSZW5kZXJQYXNzKSBjb25zdCB7CisgICAgcmV0dXJuIENyZWF0ZVJlbmRlclBhc3NHZW5lcmljKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzLCBSRU5ERVJfUEFTU19WRVJTSU9OXzEpOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVSZW5kZXJQYXNzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVuZGVyUGFzcyAqcFJlbmRlclBhc3MpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlUmVuZGVyUGFzc0dlbmVyaWMoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFJlbmRlclBhc3MsIFJFTkRFUl9QQVNTX1ZFUlNJT05fMik7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUZyZWVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICAvLyBWYWxpZGF0aW9uIGZvciBwYXJhbWV0ZXJzIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB2YWxpZGF0aW9uIGNvZGUgZHVlIHRvIGEgJ25vYXV0b3ZhbGlkaXR5JyB0YWcgaW4gdmsueG1sCisgICAgLy8gVGhpcyBpcyBhbiBhcnJheSBvZiBoYW5kbGVzLCB3aGVyZSB0aGUgZWxlbWVudHMgYXJlIGFsbG93ZWQgdG8gYmUgVktfTlVMTF9IQU5ETEUsIGFuZCBkb2VzIG5vdCByZXF1aXJlIGFueSB2YWxpZGF0aW9uIGJleW9uZAorICAgIC8vIHZhbGlkYXRlX2FycmF5KCkKKyAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ2a0ZyZWVDb21tYW5kQnVmZmVycyIsICJjb21tYW5kQnVmZmVyQ291bnQiLCAicENvbW1hbmRCdWZmZXJzIiwgY29tbWFuZEJ1ZmZlckNvdW50LCAmcENvbW1hbmRCdWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSwga1ZVSURVbmRlZmluZWQsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQmVnaW5Db21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAqcEJlZ2luSW5mbykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgLy8gVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIHZhbGlkYXRpb24sIGR1ZSB0byBhICdub2F1dG92YWxpZGl0eScgb2YgcEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mbyBpbiB2a0JlZ2luQ29tbWFuZEJ1ZmZlcgorICAgIGNvbnN0IGNoYXIgKmNtZF9uYW1lID0gInZrQmVnaW5Db21tYW5kQnVmZmVyIjsKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gKnBJbmZvID0gcEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mbzsKKworICAgIC8vIEltcGxpY2l0IFZVcworICAgIC8vIHZhbGlkYXRlIG9ubHkgc1R5cGUgaGVyZTsgcG9pbnRlciBoYXMgdG8gYmUgdmFsaWRhdGVkIGluIGNvcmVfdmFsaWRhdGlvbgorICAgIGNvbnN0IGJvb2wga05vdFJlcXVpcmVkID0gZmFsc2U7CisgICAgY29uc3QgY2hhciAqa05vVlVJRCA9IG51bGxwdHI7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZShjbWRfbmFtZSwgInBCZWdpbkluZm8tPnBJbmhlcml0YW5jZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTywga05vdFJlcXVpcmVkLCBrTm9WVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvLXNUeXBlLXNUeXBlIik7CisKKyAgICBpZiAocEluZm8pIHsKKyAgICAgICAgY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIGFsbG93ZWRfc3RydWN0c19Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm9bXSA9IHsKKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0NPTkRJVElPTkFMX1JFTkRFUklOR19JTkZPX0VYVH07CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KAorICAgICAgICAgICAgY21kX25hbWUsICJwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvLT5wTmV4dCIsICJWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVCIsIHBJbmZvLT5wTmV4dCwKKyAgICAgICAgICAgIEFSUkFZX1NJWkUoYWxsb3dlZF9zdHJ1Y3RzX1ZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyksIGFsbG93ZWRfc3RydWN0c19Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8sCisgICAgICAgICAgICBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcE5leHQtcE5leHQiKTsKKworICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2Jvb2wzMihjbWRfbmFtZSwgInBCZWdpbkluZm8tPnBJbmhlcml0YW5jZUluZm8tPm9jY2x1c2lvblF1ZXJ5RW5hYmxlIiwgcEluZm8tPm9jY2x1c2lvblF1ZXJ5RW5hYmxlKTsKKworICAgICAgICAvLyBFeHBsaWNpdCBWVXMKKyAgICAgICAgaWYgKCFwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMuaW5oZXJpdGVkUXVlcmllcyAmJiBwSW5mby0+b2NjbHVzaW9uUXVlcnlFbmFibGUgPT0gVktfVFJVRSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvLW9jY2x1c2lvblF1ZXJ5RW5hYmxlLTAwMDU2IiwKKyAgICAgICAgICAgICAgICAiJXM6IEluaGVyaXRlZCBxdWVyaWVzIGZlYXR1cmUgaXMgZGlzYWJsZWQsIGJ1dCBwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvLT5vY2NsdXNpb25RdWVyeUVuYWJsZSBpcyBWS19UUlVFLiIsCisgICAgICAgICAgICAgICAgY21kX25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBoeXNpY2FsX2RldmljZV9mZWF0dXJlcy5pbmhlcml0ZWRRdWVyaWVzKSB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKGNtZF9uYW1lLCAicEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mby0+cXVlcnlGbGFncyIsICJWa1F1ZXJ5Q29udHJvbEZsYWdCaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsVmtRdWVyeUNvbnRyb2xGbGFnQml0cywgcEluZm8tPnF1ZXJ5RmxhZ3MsIGtPcHRpb25hbEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcXVlcnlGbGFncy0wMDA1NyIpOworICAgICAgICB9IGVsc2UgeyAgLy8gIWluaGVyaXRlZFF1ZXJpZXMKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoY21kX25hbWUsICJwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvLT5xdWVyeUZsYWdzIiwgcEluZm8tPnF1ZXJ5RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mby1xdWVyeUZsYWdzLTAyNzg4Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzLnBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5KSB7CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKGNtZF9uYW1lLCAicEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mby0+cGlwZWxpbmVTdGF0aXN0aWNzIiwgIlZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsVmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHMsIHBJbmZvLT5waXBlbGluZVN0YXRpc3RpY3MsIGtPcHRpb25hbEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcGlwZWxpbmVTdGF0aXN0aWNzLTAyNzg5Iik7CisgICAgICAgIH0gZWxzZSB7ICAvLyAhcGlwZWxpbmVTdGF0aXN0aWNzUXVlcnkKKyAgICAgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoY21kX25hbWUsICJwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvLT5waXBlbGluZVN0YXRpc3RpY3MiLCBwSW5mby0+cGlwZWxpbmVTdGF0aXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8tcGlwZWxpbmVTdGF0aXN0aWNzLTAwMDU4Iik7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBhdXRvICpjb25kaXRpb25hbF9yZW5kZXJpbmcgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUNvbmRpdGlvbmFsUmVuZGVyaW5nSW5mb0VYVD4ocEluZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKGNvbmRpdGlvbmFsX3JlbmRlcmluZykgeworICAgICAgICAgICAgY29uc3QgYXV0byAqY3JfZmVhdHVyZXMgPQorICAgICAgICAgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VDb25kaXRpb25hbFJlbmRlcmluZ0ZlYXR1cmVzRVhUPihwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMyLnBOZXh0KTsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gaW5oZXJpdGVkX2NvbmRpdGlvbmFsX3JlbmRlcmluZyA9IGNyX2ZlYXR1cmVzICYmIGNyX2ZlYXR1cmVzLT5pbmhlcml0ZWRDb25kaXRpb25hbFJlbmRlcmluZzsKKyAgICAgICAgICAgIGlmICghaW5oZXJpdGVkX2NvbmRpdGlvbmFsX3JlbmRlcmluZyAmJiBjb25kaXRpb25hbF9yZW5kZXJpbmctPmNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlID09IFZLX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlQ29uZGl0aW9uYWxSZW5kZXJpbmdJbmZvRVhULWNvbmRpdGlvbmFsUmVuZGVyaW5nRW5hYmxlLTAxOTc3IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQmVnaW5Db21tYW5kQnVmZmVyOiBJbmhlcml0ZWQgY29uZGl0aW9uYWwgcmVuZGVyaW5nIGlzIGRpc2FibGVkLCBidXQgIgorICAgICAgICAgICAgICAgICAgICAicEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mby0+cE5leHQ8VmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VDb25kaXRpb25hbFJlbmRlcmluZ0luZm9FWFQ+IGlzIFZLX1RSVUUuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWa1ZpZXdwb3J0ICpwVmlld3BvcnRzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoIXBoeXNpY2FsX2RldmljZV9mZWF0dXJlcy5tdWx0aVZpZXdwb3J0KSB7CisgICAgICAgIGlmIChmaXJzdFZpZXdwb3J0ICE9IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtZmlyc3RWaWV3cG9ydC0wMTIyNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0Vmlld3BvcnQ6IFRoZSBtdWx0aVZpZXdwb3J0IGZlYXR1cmUgaXMgZGlzYWJsZWQsIGJ1dCBmaXJzdFZpZXdwb3J0ICg9JSIgUFJJdTMyICIpIGlzIG5vdCAwLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdwb3J0Q291bnQgPiAxKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldFZpZXdwb3J0LXZpZXdwb3J0Q291bnQtMDEyMjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldFZpZXdwb3J0OiBUaGUgbXVsdGlWaWV3cG9ydCBmZWF0dXJlIGlzIGRpc2FibGVkLCBidXQgdmlld3BvcnRDb3VudCAoPSUiIFBSSXUzMiAiKSBpcyBub3QgMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIG11bHRpVmlld3BvcnQgZW5hYmxlZAorICAgICAgICBjb25zdCB1aW50NjRfdCBzdW0gPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZmlyc3RWaWV3cG9ydCkgKyBzdGF0aWNfY2FzdDx1aW50NjRfdD4odmlld3BvcnRDb3VudCk7CisgICAgICAgIGlmIChzdW0gPiBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1maXJzdFZpZXdwb3J0LTAxMjIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRWaWV3cG9ydDogZmlyc3RWaWV3cG9ydCArIHZpZXdwb3J0Q291bnQgKD0lIiBQUkl1MzIgIiArICUiIFBSSXUzMiAiID0gJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgZ3JlYXRlciB0aGFuIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cyAoPSUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHN1bSwgZGV2aWNlX2xpbWl0cy5tYXhWaWV3cG9ydHMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBWaWV3cG9ydHMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCB2aWV3cG9ydF9pID0gMDsgdmlld3BvcnRfaSA8IHZpZXdwb3J0Q291bnQ7ICsrdmlld3BvcnRfaSkgeworICAgICAgICAgICAgY29uc3QgYXV0byAmdmlld3BvcnQgPSBwVmlld3BvcnRzW3ZpZXdwb3J0X2ldOyAgLy8gd2lsbCBjcmFzaCBvbiBpbnZhbGlkIHB0cgorICAgICAgICAgICAgY29uc3QgY2hhciAqZm5fbmFtZSA9ICJ2a0NtZFNldFZpZXdwb3J0IjsKKyAgICAgICAgICAgIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZVZpZXdwb3J0KHZpZXdwb3J0LCBmbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyTmFtZSgicFZpZXdwb3J0c1slaV0iLCBQYXJhbWV0ZXJOYW1lOjpJbmRleFZlY3Rvcnt2aWV3cG9ydF9pfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULCBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0U2Npc3NvcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RTY2lzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2lzc29yQ291bnQsIGNvbnN0IFZrUmVjdDJEICpwU2Npc3NvcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmICghcGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzLm11bHRpVmlld3BvcnQpIHsKKyAgICAgICAgaWYgKGZpcnN0U2Npc3NvciAhPSAwKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldFNjaXNzb3ItZmlyc3RTY2lzc29yLTAwNTkzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRTY2lzc29yOiBUaGUgbXVsdGlWaWV3cG9ydCBmZWF0dXJlIGlzIGRpc2FibGVkLCBidXQgZmlyc3RTY2lzc29yICg9JSIgUFJJdTMyICIpIGlzIG5vdCAwLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTY2lzc29yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Npc3NvckNvdW50ID4gMSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLXNjaXNzb3JDb3VudC0wMDU5NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0U2Npc3NvcjogVGhlIG11bHRpVmlld3BvcnQgZmVhdHVyZSBpcyBkaXNhYmxlZCwgYnV0IHNjaXNzb3JDb3VudCAoPSUiIFBSSXUzMiAiKSBpcyBub3QgMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JDb3VudCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8gbXVsdGlWaWV3cG9ydCBlbmFibGVkCisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHN1bSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihmaXJzdFNjaXNzb3IpICsgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHNjaXNzb3JDb3VudCk7CisgICAgICAgIGlmIChzdW0gPiBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLWZpcnN0U2Npc3Nvci0wMDU5MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0U2Npc3NvcjogZmlyc3RTY2lzc29yICsgc2Npc3NvckNvdW50ICg9JSIgUFJJdTMyICIgKyAlIiBQUkl1MzIgIiA9ICUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIGdyZWF0ZXIgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydHMgKD0lIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNjaXNzb3IsIHNjaXNzb3JDb3VudCwgc3VtLCBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocFNjaXNzb3JzKSB7CisgICAgICAgIGZvciAodWludDMyX3Qgc2Npc3Nvcl9pID0gMDsgc2Npc3Nvcl9pIDwgc2Npc3NvckNvdW50OyArK3NjaXNzb3JfaSkgeworICAgICAgICAgICAgY29uc3QgYXV0byAmc2Npc3NvciA9IHBTY2lzc29yc1tzY2lzc29yX2ldOyAgLy8gd2lsbCBjcmFzaCBvbiBpbnZhbGlkIHB0cgorCisgICAgICAgICAgICBpZiAoc2Npc3Nvci5vZmZzZXQueCA8IDApIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLXgtMDA1OTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRTY2lzc29yOiBwU2Npc3NvcnNbJSIgUFJJdTMyICJdLm9mZnNldC54ICg9JSIgUFJJaTMyICIpIGlzIG5lZ2F0aXZlLiIsIHNjaXNzb3JfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3Nvci5vZmZzZXQueCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzY2lzc29yLm9mZnNldC55IDwgMCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldFNjaXNzb3IteC0wMDU5NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldFNjaXNzb3I6IHBTY2lzc29yc1slIiBQUkl1MzIgIl0ub2Zmc2V0LnkgKD0lIiBQUklpMzIgIikgaXMgbmVnYXRpdmUuIiwgc2Npc3Nvcl9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lzc29yLm9mZnNldC55KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB4X3N1bSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHNjaXNzb3Iub2Zmc2V0LngpICsgc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2Npc3Nvci5leHRlbnQud2lkdGgpOworICAgICAgICAgICAgaWYgKHhfc3VtID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0U2Npc3Nvci1vZmZzZXQtMDA1OTYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRTY2lzc29yOiBvZmZzZXQueCArIGV4dGVudC53aWR0aCAoPSUiIFBSSWkzMiAiICsgJSIgUFJJdTMyICIgPSAlIiBQUklpNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgb2YgcFNjaXNzb3JzWyUiIFBSSXUzMiAiXSB3aWxsIG92ZXJmbG93IGludDMyX3QuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3Nvci5vZmZzZXQueCwgc2Npc3Nvci5leHRlbnQud2lkdGgsIHhfc3VtLCBzY2lzc29yX2kpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHlfc3VtID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2Npc3Nvci5vZmZzZXQueSkgKyBzdGF0aWNfY2FzdDxpbnQ2NF90PihzY2lzc29yLmV4dGVudC5oZWlnaHQpOworICAgICAgICAgICAgaWYgKHlfc3VtID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0U2Npc3Nvci1vZmZzZXQtMDA1OTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRTY2lzc29yOiBvZmZzZXQueSArIGV4dGVudC5oZWlnaHQgKD0lIiBQUklpMzIgIiArICUiIFBSSXUzMiAiID0gJSIgUFJJaTY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG9mIHBTY2lzc29yc1slIiBQUkl1MzIgIl0gd2lsbCBvdmVyZmxvdyBpbnQzMl90LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3Iub2Zmc2V0LnksIHNjaXNzb3IuZXh0ZW50LmhlaWdodCwgeV9zdW0sIHNjaXNzb3JfaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVdpZHRoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBsaW5lV2lkdGgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmICghcGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzLndpZGVMaW5lcyAmJiAobGluZVdpZHRoICE9IDEuMGYpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRMaW5lV2lkdGgtbGluZVdpZHRoLTAwNzg4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OndpZGVMaW5lcyBpcyBkaXNhYmxlZCwgYnV0IGxpbmVXaWR0aCAoPSVmKSBpcyBub3QgMS4wLiIsIGxpbmVXaWR0aCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERyYXcoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHZlcnRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdFZlcnRleCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICh2ZXJ0ZXhDb3VudCA9PSAwKSB7CisgICAgICAgIC8vIFRPRE86IFZlcmlmeSBhZ2FpbnN0IFZhbGlkIFVzYWdlIHNlY3Rpb24uIEkgZG9uJ3Qgc2VlIGEgbm9uLXplcm8gdmVydGV4Q291bnQgbGlzdGVkLCBtYXkgbmVlZCB0byBhZGQgdGhhdCBhbmQgbWFrZQorICAgICAgICAvLyB0aGlzIGFuIGVycm9yIG9yIGxlYXZlIGFzIGlzLgorICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX1BWRXJyb3JfUmVxdWlyZWRQYXJhbWV0ZXIsICJ2a0NtZERyYXcgcGFyYW1ldGVyLCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgaXMgMCIpOworICAgIH0KKworICAgIGlmIChpbnN0YW5jZUNvdW50ID09IDApIHsKKyAgICAgICAgLy8gVE9ETzogVmVyaWZ5IGFnYWluc3QgVmFsaWQgVXNhZ2Ugc2VjdGlvbi4gSSBkb24ndCBzZWUgYSBub24temVybyBpbnN0YW5jZUNvdW50IGxpc3RlZCwgbWF5IG5lZWQgdG8gYWRkIHRoYXQgYW5kIG1ha2UKKyAgICAgICAgLy8gdGhpcyBhbiBlcnJvciBvciBsZWF2ZSBhcyBpcy4KKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX1JlcXVpcmVkUGFyYW1ldGVyLCAidmtDbWREcmF3IHBhcmFtZXRlciwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgaXMgMCIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd0luZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsIHVpbnQzMl90IHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKCFwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMubXVsdGlEcmF3SW5kaXJlY3QgJiYgKChjb3VudCA+IDEpKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX0RldmljZUZlYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ21kRHJhd0luZGlyZWN0KCk6IERldmljZSBmZWF0dXJlIG11bHRpRHJhd0luZGlyZWN0IGRpc2FibGVkOiBjb3VudCBtdXN0IGJlIDAgb3IgMSBidXQgaXMgJWQiLCBjb3VudCk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoIXBoeXNpY2FsX2RldmljZV9mZWF0dXJlcy5tdWx0aURyYXdJbmRpcmVjdCAmJiAoKGNvdW50ID4gMSkpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCBrVlVJRF9QVkVycm9yX0RldmljZUZlYXR1cmUsCisgICAgICAgICAgICAiQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCgpOiBEZXZpY2UgZmVhdHVyZSBtdWx0aURyYXdJbmRpcmVjdCBkaXNhYmxlZDogY291bnQgbXVzdCBiZSAwIG9yIDEgYnV0IGlzICVkIiwgY291bnQpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kQ2xlYXJBdHRhY2htZW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYXR0YWNobWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyQXR0YWNobWVudCAqcEF0dGFjaG1lbnRzLCB1aW50MzJfdCByZWN0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJSZWN0ICpwUmVjdHMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IHJlY3QgPSAwOyByZWN0IDwgcmVjdENvdW50OyByZWN0KyspIHsKKyAgICAgICAgaWYgKHBSZWN0c1tyZWN0XS5sYXllckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1sYXllckNvdW50LTAxOTM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ21kQ2xlYXJBdHRhY2htZW50cygpOiBwUmVjdHNbJWRdLmxheWVyQ291bnQgaXMgemVyby4iLCByZWN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUNvcHkgKnBSZWdpb25zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgbGVnYWxfYXNwZWN0X2ZsYWdzID0KKyAgICAgICAgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUOworICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSB7CisgICAgICAgIGxlZ2FsX2FzcGVjdF9mbGFncyB8PSAoVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUiB8IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVF9LSFIgfCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSKTsKKyAgICB9CisKKyAgICBpZiAocFJlZ2lvbnMgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoKHBSZWdpb25zLT5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrICYgbGVnYWxfYXNwZWN0X2ZsYWdzKSA9PSAwKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UoKSBwYXJhbWV0ZXIsIFZrSW1hZ2VBc3BlY3QgcFJlZ2lvbnMtPnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2ssIGlzIGFuIHVucmVjb2duaXplZCBlbnVtZXJhdG9yLiIpOworICAgICAgICB9CisgICAgICAgIGlmICgocFJlZ2lvbnMtPmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgJiBsZWdhbF9hc3BlY3RfZmxhZ3MpID09IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlU3VicmVzb3VyY2VMYXllcnMtYXNwZWN0TWFzay1wYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICJ2a0NtZENvcHlJbWFnZSgpIHBhcmFtZXRlciwgVmtJbWFnZUFzcGVjdCBwUmVnaW9ucy0+ZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzaywgaXMgYW4gdW5yZWNvZ25pemVkIGVudW1lcmF0b3IuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZEJsaXRJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VCbGl0ICpwUmVnaW9ucywgVmtGaWx0ZXIgZmlsdGVyKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgbGVnYWxfYXNwZWN0X2ZsYWdzID0KKyAgICAgICAgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUOworICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSB7CisgICAgICAgIGxlZ2FsX2FzcGVjdF9mbGFncyB8PSAoVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUiB8IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVF9LSFIgfCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSKTsKKyAgICB9CisKKyAgICBpZiAocFJlZ2lvbnMgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoKHBSZWdpb25zLT5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrICYgbGVnYWxfYXNwZWN0X2ZsYWdzKSA9PSAwKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9VbnJlY29nbml6ZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAidmtDbWRCbGl0SW1hZ2UoKSBwYXJhbWV0ZXIsIFZrSW1hZ2VBc3BlY3QgcFJlZ2lvbnMtPnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2ssIGlzIGFuIHVucmVjb2duaXplZCBlbnVtZXJhdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwUmVnaW9ucy0+ZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayAmIGxlZ2FsX2FzcGVjdF9mbGFncykgPT0gMCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgIGtWVUlEX1BWRXJyb3JfVW5yZWNvZ25pemVkVmFsdWUsCisgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCkgcGFyYW1ldGVyLCBWa0ltYWdlQXNwZWN0IHBSZWdpb25zLT5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrLCBpcyBhbiB1bnJlY29nbml6ZWQgZW51bWVyYXRvciIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRDb3B5QnVmZmVyVG9JbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkgKnBSZWdpb25zKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgbGVnYWxfYXNwZWN0X2ZsYWdzID0KKyAgICAgICAgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUOworICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uKSB7CisgICAgICAgIGxlZ2FsX2FzcGVjdF9mbGFncyB8PSAoVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUiB8IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVF9LSFIgfCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSKTsKKyAgICB9CisKKyAgICBpZiAocFJlZ2lvbnMgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoKHBSZWdpb25zLT5pbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2sgJiBsZWdhbF9hc3BlY3RfZmxhZ3MpID09IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX1VucmVjb2duaXplZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZENvcHlCdWZmZXJUb0ltYWdlKCkgcGFyYW1ldGVyLCBWa0ltYWdlQXNwZWN0IHBSZWdpb25zLT5pbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2ssIGlzIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGVudW1lcmF0b3IiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUltYWdlVG9CdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0J1ZmZlciBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5ICpwUmVnaW9ucykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgVmtJbWFnZUFzcGVjdEZsYWdzIGxlZ2FsX2FzcGVjdF9mbGFncyA9CisgICAgICAgIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUIHwgVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVDsKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbikgeworICAgICAgICBsZWdhbF9hc3BlY3RfZmxhZ3MgfD0gKFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVF9LSFIgfCBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVRfS0hSIHwgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUX0tIUik7CisgICAgfQorCisgICAgaWYgKHBSZWdpb25zICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKChwUmVnaW9ucy0+aW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrICYgbGVnYWxfYXNwZWN0X2ZsYWdzKSA9PSAwKSB7CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX1VucmVjb2duaXplZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2VUb0J1ZmZlciBwYXJhbWV0ZXIsIFZrSW1hZ2VBc3BlY3QgcFJlZ2lvbnMtPmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzaywgaXMgYW4gdW5yZWNvZ25pemVkICIKKyAgICAgICAgICAgICAgICAgICAgImVudW1lcmF0b3IiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kVXBkYXRlQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIGRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBEYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZHN0T2Zmc2V0ICYgMykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFVwZGF0ZUJ1ZmZlci1kc3RPZmZzZXQtMDAwMzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kVXBkYXRlQnVmZmVyKCkgcGFyYW1ldGVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0ICgweCUiIFBSSXhMRUFTVDY0ICIpLCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQpOworICAgIH0KKworICAgIGlmICgoZGF0YVNpemUgPD0gMCkgfHwgKGRhdGFTaXplID4gNjU1MzYpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kVXBkYXRlQnVmZmVyLWRhdGFTaXplLTAwMDM3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFVwZGF0ZUJ1ZmZlcigpIHBhcmFtZXRlciwgVmtEZXZpY2VTaXplIGRhdGFTaXplICgweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiKSwgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDY1NTM2LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgfSBlbHNlIGlmIChkYXRhU2l6ZSAmIDMpIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItZGF0YVNpemUtMDAwMzgiLAorICAgICAgICAgICAgICAgICAgICAidmtDbWRVcGRhdGVCdWZmZXIoKSBwYXJhbWV0ZXIsIFZrRGV2aWNlU2l6ZSBkYXRhU2l6ZSAoMHglIiBQUkl4TEVBU1Q2NCAiKSwgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4iLCBkYXRhU2l6ZSk7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRGaWxsQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBkYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZHN0T2Zmc2V0ICYgMykgeworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEZpbGxCdWZmZXItZHN0T2Zmc2V0LTAwMDI1IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ21kRmlsbEJ1ZmZlcigpIHBhcmFtZXRlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCAoMHglIiBQUkl4TEVBU1Q2NCAiKSwgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4iLCBkc3RPZmZzZXQpOworICAgIH0KKworICAgIGlmIChzaXplICE9IFZLX1dIT0xFX1NJWkUpIHsKKyAgICAgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEZpbGxCdWZmZXItc2l6ZS0wMDAyNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRGaWxsQnVmZmVyKCkgcGFyYW1ldGVyLCBWa0RldmljZVNpemUgc2l6ZSAoMHglIiBQUkl4TEVBU1Q2NCAiKSwgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaXplICYgMykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1zaXplLTAwMDI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRGaWxsQnVmZmVyKCkgcGFyYW1ldGVyLCBWa0RldmljZVNpemUgc2l6ZSAoMHglIiBQUkl4TEVBU1Q2NCAiKSwgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4iLCBzaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTd2FwY2hhaW5LSFIgKnBTd2FwY2hhaW4pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IExvZ01pc2NQYXJhbXMgbG9nX21pc2N7VktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULCBWS19OVUxMX0hBTkRMRSwgInZrQ3JlYXRlU3dhcGNoYWluS0hSIn07CisKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICAvLyBWYWxpZGF0aW9uIGZvciBwYXJhbWV0ZXJzIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB2YWxpZGF0aW9uIGNvZGUgZHVlIHRvIGEgJ25vYXV0b3ZhbGlkaXR5JyB0YWcgaW4gdmsueG1sCisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+aW1hZ2VTaGFyaW5nTW9kZSA9PSBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCkgeworICAgICAgICAgICAgLy8gSWYgaW1hZ2VTaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgcXVldWVGYW1pbHlJbmRleENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDEKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50IDw9IDEpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZVNoYXJpbmdNb2RlLTAxMjc4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlU3dhcGNoYWluS0hSKCk6IGlmIHBDcmVhdGVJbmZvLT5pbWFnZVNoYXJpbmdNb2RlIGlzIFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5ULCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDEuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIGltYWdlU2hhcmluZ01vZGUgaXMgVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQsIHBRdWV1ZUZhbWlseUluZGljZXMgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKKyAgICAgICAgICAgIC8vIHF1ZXVlRmFtaWx5SW5kZXhDb3VudCB1aW50MzJfdCB2YWx1ZXMKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItaW1hZ2VTaGFyaW5nTW9kZS0wMTI3NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVN3YXBjaGFpbktIUigpOiBpZiBwQ3JlYXRlSW5mby0+aW1hZ2VTaGFyaW5nTW9kZSBpcyBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudCB1aW50MzJfdCB2YWx1ZXMuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBza2lwIHw9IFZhbGlkYXRlR3JlYXRlclRoYW5aZXJvKHBDcmVhdGVJbmZvLT5pbWFnZUFycmF5TGF5ZXJzLCAicENyZWF0ZUluZm8tPmltYWdlQXJyYXlMYXllcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUi1pbWFnZUFycmF5TGF5ZXJzLTAxMjc1IiwgbG9nX21pc2MpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVRdWV1ZVByZXNlbnRLSFIoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb0tIUiAqcFByZXNlbnRJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAocFByZXNlbnRJbmZvICYmIHBQcmVzZW50SW5mby0+cE5leHQpIHsKKyAgICAgICAgY29uc3QgYXV0byAqcHJlc2VudF9yZWdpb25zID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQcmVzZW50UmVnaW9uc0tIUj4ocFByZXNlbnRJbmZvLT5wTmV4dCk7CisgICAgICAgIGlmIChwcmVzZW50X3JlZ2lvbnMpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgYW5kIGFsbCBvdGhlciBwTmV4dCBleHRlbnNpb24gZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBhZGRlZCB0byBjb2RlLWdlbmVyYXRpb24KKyAgICAgICAgICAgIHNraXAgfD0gcmVxdWlyZV9kZXZpY2VfZXh0ZW5zaW9uKElzRXh0RW5hYmxlZChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfaW5jcmVtZW50YWxfcHJlc2VudCksICJ2a1F1ZXVlUHJlc2VudEtIUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfSU5DUkVNRU5UQUxfUFJFU0VOVF9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgICAgICBpZiAocHJlc2VudF9yZWdpb25zLT5zd2FwY2hhaW5Db3VudCAhPSBwUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50KSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX0ludmFsaWRVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXVlUHJlc2VudEtIUigpOiBwUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50IGhhcyBhIHZhbHVlIG9mICVpIGJ1dCBWa1ByZXNlbnRSZWdpb25zS0hSICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvbiBzd2FwY2hhaW5Db3VudCBpcyAlaS4gVGhlc2UgdmFsdWVzIG11c3QgYmUgZXF1YWwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudCwgcHJlc2VudF9yZWdpb25zLT5zd2FwY2hhaW5Db3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF9wbmV4dCgiUXVldWVQcmVzZW50S0hSIiwgInBDcmVhdGVJbmZvLT5wTmV4dC0+cE5leHQiLCBOVUxMLCBwcmVzZW50X3JlZ2lvbnMtPnBOZXh0LCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkVnVsa2FuSGVhZGVyVmVyc2lvbiwgIlZVSUQtVmtQcmVzZW50SW5mb0tIUi1wTmV4dC1wTmV4dCIpOworICAgICAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgiUXVldWVQcmVzZW50S0hSIiwgInBDcmVhdGVJbmZvLT5wTmV4dC0+c3dhcGNoYWluQ291bnQiLCAicENyZWF0ZUluZm8tPnBOZXh0LT5wUmVnaW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRfcmVnaW9ucy0+c3dhcGNoYWluQ291bnQsICZwcmVzZW50X3JlZ2lvbnMtPnBSZWdpb25zLCB0cnVlLCBmYWxzZSwga1ZVSURVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwcmVzZW50X3JlZ2lvbnMtPnN3YXBjaGFpbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJRdWV1ZVByZXNlbnRLSFIiLCAicENyZWF0ZUluZm8tPnBOZXh0LT5wUmVnaW9uc1tdLnJlY3RhbmdsZUNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cE5leHQtPnBSZWdpb25zW10ucFJlY3RhbmdsZXMiLCBwcmVzZW50X3JlZ2lvbnMtPnBSZWdpb25zW2ldLnJlY3RhbmdsZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNlbnRfcmVnaW9ucy0+cFJlZ2lvbnNbaV0ucFJlY3RhbmdsZXMsIHRydWUsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwga1ZVSURVbmRlZmluZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVXaW4zMlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAocENyZWF0ZUluZm8tPmh3bmQgPT0gbnVsbHB0cikgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFItaHduZC0wMTMwOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIoKTogaHduZCBtdXN0IGJlIGEgdmFsaWQgV2luMzIgSFdORCBidXQgaHduZCBpcyBOVUxMLiIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yUG9vbCAqcERlc2NyaXB0b3JQb29sKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5tYXhTZXRzIDw9IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTExfSEFORExFLCAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mby1tYXhTZXRzLTAwMzAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVEZXNjcmlwdG9yUG9vbCgpOiBwQ3JlYXRlSW5mby0+bWF4U2V0cyBpcyBub3QgZ3JlYXRlciB0aGFuIDAuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBQb29sU2l6ZXMpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+cG9vbFNpemVDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wUG9vbFNpemVzW2ldLmRlc2NyaXB0b3JDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQsIFZLX05VTExfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yUG9vbFNpemUtZGVzY3JpcHRvckNvdW50LTAwMzAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZURlc2NyaXB0b3JQb29sKCk6IHBDcmVhdGVJbmZvLT5wUG9vbFNpemVzWyUiIFBSSXUzMiAiXS5kZXNjcmlwdG9yQ291bnQgaXMgbm90IGdyZWF0ZXIgdGhhbiAwLiIsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBQb29sU2l6ZXNbaV0udHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUICYmCisgICAgICAgICAgICAgICAgICAgIChwQ3JlYXRlSW5mby0+cFBvb2xTaXplc1tpXS5kZXNjcmlwdG9yQ291bnQgJSA0KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICJWVUlELVZrRGVzY3JpcHRvclBvb2xTaXplLXR5cGUtMDIyMTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlRGVzY3JpcHRvclBvb2woKTogcENyZWF0ZUluZm8tPnBQb29sU2l6ZXNbJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXS50eXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgcENyZWF0ZUluZm8tPnBQb29sU2l6ZXNbJSIgUFJJdTMyICJdLmRlc2NyaXB0b3JDb3VudCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRGlzcGF0Y2goVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGdyb3VwQ291bnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ3JvdXBDb3VudFksIHVpbnQzMl90IGdyb3VwQ291bnRaKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoZ3JvdXBDb3VudFggPiBkZXZpY2VfbGltaXRzLm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSkgeworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRGlzcGF0Y2gtZ3JvdXBDb3VudFgtMDAzODYiLAorICAgICAgICAgICAgICAgICAgICAidmtDbWREaXNwYXRjaCgpOiBncm91cENvdW50WCAoJSIgUFJJdTMyICIpIGV4Y2VlZHMgZGV2aWNlIGxpbWl0IG1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSAoJSIgUFJJdTMyICIpLiIsCisgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnRYLCBkZXZpY2VfbGltaXRzLm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSk7CisgICAgfQorCisgICAgaWYgKGdyb3VwQ291bnRZID4gZGV2aWNlX2xpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0pIHsKKyAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRZLTAwMzg3IiwKKyAgICAgICAgICAgICAgICAgICAgInZrQ21kRGlzcGF0Y2goKTogZ3JvdXBDb3VudFkgKCUiIFBSSXUzMiAiKSBleGNlZWRzIGRldmljZSBsaW1pdCBtYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0gKCUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICBncm91cENvdW50WSwgZGV2aWNlX2xpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0pOworICAgIH0KKworICAgIGlmIChncm91cENvdW50WiA+IGRldmljZV9saW1pdHMubWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdKSB7CisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWREaXNwYXRjaC1ncm91cENvdW50Wi0wMDM4OCIsCisgICAgICAgICAgICAgICAgICAgICJ2a0NtZERpc3BhdGNoKCk6IGdyb3VwQ291bnRaICglIiBQUkl1MzIgIikgZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudFosIGRldmljZV9saW1pdHMubWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRGlzcGF0Y2hJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0KSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoKG9mZnNldCAlIDQpICE9IDApIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZERpc3BhdGNoSW5kaXJlY3Qtb2Zmc2V0LTAyNzEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERpc3BhdGNoSW5kaXJlY3QoKTogb2Zmc2V0ICglIiBQUkl1NjQgIikgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoQmFzZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgYmFzZUdyb3VwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXNlR3JvdXBZLCB1aW50MzJfdCBiYXNlR3JvdXBaLCB1aW50MzJfdCBncm91cENvdW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBncm91cENvdW50WSwgdWludDMyX3QgZ3JvdXBDb3VudFopIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFBhaXJlZCBpZiB7fSBlbHNlIGlmIHt9IHRlc3RzIHVzZWQgdG8gYXZvaWQgYW55IHBvc3NpYmxlIHVpbnQgdW5kZXJmbG93CisgICAgdWludDMyX3QgbGltaXQgPSBkZXZpY2VfbGltaXRzLm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXTsKKyAgICBpZiAoYmFzZUdyb3VwWCA+PSBsaW1pdCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWJhc2VHcm91cFgtMDA0MjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRGlzcGF0Y2goKTogYmFzZUdyb3VwWCAoJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBlcXVhbHMgb3IgZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzBdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsIGxpbWl0KTsKKyAgICB9IGVsc2UgaWYgKGdyb3VwQ291bnRYID4gKGxpbWl0IC0gYmFzZUdyb3VwWCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1ncm91cENvdW50WC0wMDQyNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREaXNwYXRjaEJhc2VLSFIoKTogYmFzZUdyb3VwWCAoJSIgUFJJdTMyICIpICsgZ3JvdXBDb3VudFggKCUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikgZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzBdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFgsIGdyb3VwQ291bnRYLCBsaW1pdCk7CisgICAgfQorCisgICAgbGltaXQgPSBkZXZpY2VfbGltaXRzLm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsxXTsKKyAgICBpZiAoYmFzZUdyb3VwWSA+PSBsaW1pdCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWJhc2VHcm91cFgtMDA0MjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRGlzcGF0Y2goKTogYmFzZUdyb3VwWSAoJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBlcXVhbHMgb3IgZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzFdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksIGxpbWl0KTsKKyAgICB9IGVsc2UgaWYgKGdyb3VwQ291bnRZID4gKGxpbWl0IC0gYmFzZUdyb3VwWSkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1ncm91cENvdW50WS0wMDQyNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREaXNwYXRjaEJhc2VLSFIoKTogYmFzZUdyb3VwWSAoJSIgUFJJdTMyICIpICsgZ3JvdXBDb3VudFkgKCUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikgZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzFdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFksIGdyb3VwQ291bnRZLCBsaW1pdCk7CisgICAgfQorCisgICAgbGltaXQgPSBkZXZpY2VfbGltaXRzLm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsyXTsKKyAgICBpZiAoYmFzZUdyb3VwWiA+PSBsaW1pdCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWJhc2VHcm91cFotMDA0MjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kRGlzcGF0Y2goKTogYmFzZUdyb3VwWiAoJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBlcXVhbHMgb3IgZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosIGxpbWl0KTsKKyAgICB9IGVsc2UgaWYgKGdyb3VwQ291bnRaID4gKGxpbWl0IC0gYmFzZUdyb3VwWikpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1ncm91cENvdW50Wi0wMDQyNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREaXNwYXRjaEJhc2VLSFIoKTogYmFzZUdyb3VwWiAoJSIgUFJJdTMyICIpICsgZ3JvdXBDb3VudFogKCUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikgZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cFosIGdyb3VwQ291bnRaLCBsaW1pdCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhjbHVzaXZlU2Npc3NvckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVjdDJEICpwRXhjbHVzaXZlU2Npc3NvcnMpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmICghcGh5c2ljYWxfZGV2aWNlX2ZlYXR1cmVzLm11bHRpVmlld3BvcnQpIHsKKyAgICAgICAgaWYgKGZpcnN0RXhjbHVzaXZlU2Npc3NvciAhPSAwKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZmlyc3RFeGNsdXNpdmVTY2lzc29yLTAyMDM1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjogVGhlIG11bHRpVmlld3BvcnQgZmVhdHVyZSBpcyBkaXNhYmxlZCwgYnV0IGZpcnN0RXhjbHVzaXZlU2Npc3NvciAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgbm90IDAuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjbHVzaXZlU2Npc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1leGNsdXNpdmVTY2lzc29yQ291bnQtMDIwMzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WOiBUaGUgbXVsdGlWaWV3cG9ydCBmZWF0dXJlIGlzIGRpc2FibGVkLCBidXQgZXhjbHVzaXZlU2Npc3NvckNvdW50ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBub3QgMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlU2Npc3NvckNvdW50KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAvLyBtdWx0aVZpZXdwb3J0IGVuYWJsZWQKKyAgICAgICAgY29uc3QgdWludDY0X3Qgc3VtID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGZpcnN0RXhjbHVzaXZlU2Npc3NvcikgKyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZXhjbHVzaXZlU2Npc3NvckNvdW50KTsKKyAgICAgICAgaWYgKHN1bSA+IGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1maXJzdEV4Y2x1c2l2ZVNjaXNzb3ItMDIwMzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjogZmlyc3RFeGNsdXNpdmVTY2lzc29yICsgZXhjbHVzaXZlU2Npc3NvckNvdW50ICg9JSIgUFJJdTMyICIgKyAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gJSIgUFJJdTY0ICIpIGlzIGdyZWF0ZXIgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydHMgKD0lIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwgc3VtLCBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmlyc3RFeGNsdXNpdmVTY2lzc29yID49IGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZmlyc3RFeGNsdXNpdmVTY2lzc29yLTAyMDMzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjogZmlyc3RFeGNsdXNpdmVTY2lzc29yICg9JSIgUFJJdTMyICIpIG11c3QgYmUgbGVzcyB0aGFuIG1heFZpZXdwb3J0cyAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjbHVzaXZlU2Npc3NvciwgZGV2aWNlX2xpbWl0cy5tYXhWaWV3cG9ydHMpOworICAgIH0KKworICAgIGlmIChwRXhjbHVzaXZlU2Npc3NvcnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBzY2lzc29yX2kgPSAwOyBzY2lzc29yX2kgPCBleGNsdXNpdmVTY2lzc29yQ291bnQ7ICsrc2Npc3Nvcl9pKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZzY2lzc29yID0gcEV4Y2x1c2l2ZVNjaXNzb3JzW3NjaXNzb3JfaV07ICAvLyB3aWxsIGNyYXNoIG9uIGludmFsaWQgcHRyCisKKyAgICAgICAgICAgIGlmIChzY2lzc29yLm9mZnNldC54IDwgMCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi14LTAyMDM3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WOiBwU2Npc3NvcnNbJSIgUFJJdTMyICJdLm9mZnNldC54ICg9JSIgUFJJaTMyICIpIGlzIG5lZ2F0aXZlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JfaSwgc2Npc3Nvci5vZmZzZXQueCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzY2lzc29yLm9mZnNldC55IDwgMCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi14LTAyMDM3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WOiBwU2Npc3NvcnNbJSIgUFJJdTMyICJdLm9mZnNldC55ICg9JSIgUFJJaTMyICIpIGlzIG5lZ2F0aXZlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JfaSwgc2Npc3Nvci5vZmZzZXQueSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgeF9zdW0gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihzY2lzc29yLm9mZnNldC54KSArIHN0YXRpY19jYXN0PGludDY0X3Q+KHNjaXNzb3IuZXh0ZW50LndpZHRoKTsKKyAgICAgICAgICAgIGlmICh4X3N1bSA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1vZmZzZXQtMDIwMzgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlY6IG9mZnNldC54ICsgZXh0ZW50LndpZHRoICg9JSIgUFJJaTMyICIgKyAlIiBQUkl1MzIgIiA9ICUiIFBSSWk2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBvZiBwU2Npc3NvcnNbJSIgUFJJdTMyICJdIHdpbGwgb3ZlcmZsb3cgaW50MzJfdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lzc29yLm9mZnNldC54LCBzY2lzc29yLmV4dGVudC53aWR0aCwgeF9zdW0sIHNjaXNzb3JfaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgeV9zdW0gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihzY2lzc29yLm9mZnNldC55KSArIHN0YXRpY19jYXN0PGludDY0X3Q+KHNjaXNzb3IuZXh0ZW50LmhlaWdodCk7CisgICAgICAgICAgICBpZiAoeV9zdW0gPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtb2Zmc2V0LTAyMDM5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WOiBvZmZzZXQueSArIGV4dGVudC5oZWlnaHQgKD0lIiBQUklpMzIgIiArICUiIFBSSXUzMiAiID0gJSIgUFJJaTY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG9mIHBTY2lzc29yc1slIiBQUkl1MzIgIl0gd2lsbCBvdmVyZmxvdyBpbnQzMl90LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3Iub2Zmc2V0LnksIHNjaXNzb3IuZXh0ZW50LmhlaWdodCwgeV9zdW0sIHNjaXNzb3JfaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtWaWV3cG9ydFdTY2FsaW5nTlYgKnBWaWV3cG9ydFdTY2FsaW5ncykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChmaXJzdFZpZXdwb3J0ID49IGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtZmlyc3RWaWV3cG9ydC0wMTMyMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlY6IGZpcnN0Vmlld3BvcnQgKD0lIiBQUkl1MzIgIikgbXVzdCBiZSBsZXNzIHRoYW4gbWF4Vmlld3BvcnRzICg9JSIgUFJJdTMyICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LCBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDY0X3Qgc3VtID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGZpcnN0Vmlld3BvcnQpICsgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZpZXdwb3J0Q291bnQpOworICAgICAgICBpZiAoKHN1bSA8IDEpIHx8IChzdW0gPiBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cykpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWZpcnN0Vmlld3BvcnQtMDEzMjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVjogZmlyc3RWaWV3cG9ydCArIHZpZXdwb3J0Q291bnQgKD0lIiBQUkl1MzIgIiArICUiIFBSSXUzMiAiID0gJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cyAoPSUiIFBSSXUzMiAiKSwgaW5jdWxzaXZlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwgdmlld3BvcnRDb3VudCwgc3VtLCBkZXZpY2VfbGltaXRzLm1heFZpZXdwb3J0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1NoYWRpbmdSYXRlUGFsZXR0ZU5WICpwU2hhZGluZ1JhdGVQYWxldHRlcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKCFwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMubXVsdGlWaWV3cG9ydCkgeworICAgICAgICBpZiAoZmlyc3RWaWV3cG9ydCAhPSAwKSB7CisgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWZpcnN0Vmlld3BvcnQtMDIwNjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVjogVGhlIG11bHRpVmlld3BvcnQgZmVhdHVyZSBpcyBkaXNhYmxlZCwgYnV0IGZpcnN0Vmlld3BvcnQgKD0lIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIG5vdCAwLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld3BvcnRDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtdmlld3BvcnRDb3VudC0wMjA2OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WOiBUaGUgbXVsdGlWaWV3cG9ydCBmZWF0dXJlIGlzIGRpc2FibGVkLCBidXQgdmlld3BvcnRDb3VudCAoPSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgbm90IDEuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0Q291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpcnN0Vmlld3BvcnQgPj0gZGV2aWNlX2xpbWl0cy5tYXhWaWV3cG9ydHMpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtZmlyc3RWaWV3cG9ydC0wMjA2NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WOiBmaXJzdFZpZXdwb3J0ICg9JSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBtdXN0IGJlIGxlc3MgdGhhbiBtYXhWaWV3cG9ydHMgKD0lIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlld3BvcnQsIGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50NjRfdCBzdW0gPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZmlyc3RWaWV3cG9ydCkgKyBzdGF0aWNfY2FzdDx1aW50NjRfdD4odmlld3BvcnRDb3VudCk7CisgICAgaWYgKHN1bSA+IGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWZpcnN0Vmlld3BvcnQtMDIwNjciLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVjogZmlyc3RWaWV3cG9ydCArIHZpZXdwb3J0Q291bnQgKD0lIiBQUkl1MzIgIiArICUiIFBSSXUzMiAiID0gJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBncmVhdGVyIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4Vmlld3BvcnRzICg9JSIgUFJJdTMyICIpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBzdW0sIGRldmljZV9saW1pdHMubWF4Vmlld3BvcnRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVigKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViBzYW1wbGVPcmRlclR5cGUsIHVpbnQzMl90IGN1c3RvbVNhbXBsZU9yZGVyQ291bnQsCisgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WICpwQ3VzdG9tU2FtcGxlT3JkZXJzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAoc2FtcGxlT3JkZXJUeXBlICE9IFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9DVVNUT01fTlYgJiYgY3VzdG9tU2FtcGxlT3JkZXJDb3VudCAhPSAwKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WLXNhbXBsZU9yZGVyVHlwZS0wMjA4MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WOiBJZiBzYW1wbGVPcmRlclR5cGUgaXMgbm90IFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9DVVNUT01fTlYsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdXN0b21TYW1wbGVPcmRlckNvdW50IG11c3QgYmUgMC4iKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IG9yZGVyX2kgPSAwOyBvcmRlcl9pIDwgY3VzdG9tU2FtcGxlT3JkZXJDb3VudDsgKytvcmRlcl9pKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKCZwQ3VzdG9tU2FtcGxlT3JkZXJzW29yZGVyX2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd01lc2hUYXNrc05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB0YXNrQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RUYXNrKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAodGFza0NvdW50ID4gcGh5c19kZXZfZXh0X3Byb3BzLm1lc2hfc2hhZGVyX3Byb3BzLm1heERyYXdNZXNoVGFza3NDb3VudCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzTlYtdGFza0NvdW50LTAyMTE5IiwKKyAgICAgICAgICAgICJ2a0NtZERyYXdNZXNoVGFza3NOVigpIHBhcmFtZXRlciwgdWludDMyX3QgdGFza0NvdW50ICgweCUiIFBSSXhMRUFTVDMyCisgICAgICAgICAgICAiKSwgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZU1lc2hTaGFkZXJQcm9wZXJ0aWVzTlY6Om1heERyYXdNZXNoVGFza3NDb3VudCAoMHglIiBQUkl4TEVBU1QzMiAiKS4iLAorICAgICAgICAgICAgdGFza0NvdW50LCBwaHlzX2Rldl9leHRfcHJvcHMubWVzaF9zaGFkZXJfcHJvcHMubWF4RHJhd01lc2hUYXNrc0NvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdCBpbnQgY29uZGl0aW9uX211bHRpcGxlcyA9IDBiMDAxMTsKKyAgICBpZiAob2Zmc2V0ICYgY29uZGl0aW9uX211bHRpcGxlcykgeworICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1vZmZzZXQtMDI3MTAiLAorICAgICAgICAgICAgInZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoKSBwYXJhbWV0ZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQgKDB4JSIgUFJJeExFQVNUNjQgIiksIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgaWYgKGRyYXdDb3VudCA+IDEgJiYgKChzdHJpZGUgJiBjb25kaXRpb25fbXVsdGlwbGVzKSB8fCBzdHJpZGUgPCBzaXplb2YoVmtEcmF3TWVzaFRhc2tzSW5kaXJlY3RDb21tYW5kTlYpKSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZHJhd0NvdW50LTAyMTQ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKCkgcGFyYW1ldGVyLCB1aW50MzJfdCBzdHJpZGUgKDB4JSIgUFJJeExFQVNUMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIpLCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IG9yIHNtYWxsZXIgdGhhbiBzaXplb2YgKFZrRHJhd01lc2hUYXNrc0luZGlyZWN0Q29tbWFuZE5WKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKyAgICB9CisgICAgaWYgKCFwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMubXVsdGlEcmF3SW5kaXJlY3QgJiYgKChkcmF3Q291bnQgPiAxKSkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGNvbW1hbmRCdWZmZXIpLCAiVlVJRC12a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WLWRyYXdDb3VudC0wMjcxOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVigpOiBEZXZpY2UgZmVhdHVyZSBtdWx0aURyYXdJbmRpcmVjdCBkaXNhYmxlZDogY291bnQgbXVzdCBiZSAwIG9yIDEgYnV0IGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdDb3VudCk7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4RHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChvZmZzZXQgJiAzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLW9mZnNldC0wMjcxMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WKCkgcGFyYW1ldGVyLCBWa0RldmljZVNpemUgb2Zmc2V0ICgweCUiIFBSSXhMRUFTVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiKSwgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICB9CisKKyAgICBpZiAoY291bnRCdWZmZXJPZmZzZXQgJiAzKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3RDb3VudE5WLWNvdW50QnVmZmVyT2Zmc2V0LTAyNzE2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdENvdW50TlYoKSBwYXJhbWV0ZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCAoMHglIiBQUkl4TEVBU1Q2NAorICAgICAgICAgICAgICAgICAgICAgICAgIiksIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyT2Zmc2V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUXVlcnlQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVBvb2wgKnBRdWVyeVBvb2wpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFZhbGlkYXRpb24gZm9yIHBhcmFtZXRlcnMgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHZhbGlkYXRpb24gY29kZSBkdWUgdG8gYSAnbm9hdXRvdmFsaWRpdHknIHRhZyBpbiB2ay54bWwKKyAgICBpZiAocENyZWF0ZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICAvLyBJZiBxdWVyeVR5cGUgaXMgVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTLCBwaXBlbGluZVN0YXRpc3RpY3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mCisgICAgICAgIC8vIFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzIHZhbHVlcworICAgICAgICBpZiAoKHBDcmVhdGVJbmZvLT5xdWVyeVR5cGUgPT0gVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTKSAmJiAocENyZWF0ZUluZm8tPnBpcGVsaW5lU3RhdGlzdGljcyAhPSAwKSAmJgorICAgICAgICAgICAgKChwQ3JlYXRlSW5mby0+cGlwZWxpbmVTdGF0aXN0aWNzICYgKH5BbGxWa1F1ZXJ5UGlwZWxpbmVTdGF0aXN0aWNGbGFnQml0cykpICE9IDApKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtRdWVyeVBvb2xDcmVhdGVJbmZvLXF1ZXJ5VHlwZS0wMDc5MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUXVlcnlQb29sKCk6IGlmIHBDcmVhdGVJbmZvLT5xdWVyeVR5cGUgaXMgVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvLT5waXBlbGluZVN0YXRpc3RpY3MgbXVzdCBiZSBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFZrUXVlcnlQaXBlbGluZVN0YXRpc3RpY0ZsYWdCaXRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzLiIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgY29uc3QgeworICAgIHJldHVybiB2YWxpZGF0ZV9hcnJheSgidmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIiwgInBQcm9wZXJ0eUNvdW50IiwgInBQcm9wZXJ0aWVzIiwgcFByb3BlcnR5Q291bnQsICZwUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwgIlZVSUQtdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLXBQcm9wZXJ0aWVzLXBhcmFtZXRlciIpOworfQorCit2b2lkIFN0YXRlbGVzc1ZhbGlkYXRpb246OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MgKnBSZW5kZXJQYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgUmVjb3JkUmVuZGVyUGFzcygqcFJlbmRlclBhc3MsIHBDcmVhdGVJbmZvKTsKK30KKwordm9pZCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVJlbmRlclBhc3MyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzICpwUmVuZGVyUGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICAvLyBUcmFjayB0aGUgc3RhdGUgbmVjZXNzYXJ5IGZvciBjaGVja2luZyB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmUgKHN1YnBhc3MgdXNhZ2Ugb2YgZGVwdGggYW5kIGNvbG9yIGF0dGFjaG1lbnRzKQorICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIFJlY29yZFJlbmRlclBhc3MoKnBSZW5kZXJQYXNzLCBwQ3JlYXRlSW5mbyk7Cit9CisKK3ZvaWQgU3RhdGVsZXNzVmFsaWRhdGlvbjo6UG9zdENhbGxSZWNvcmREZXN0cm95UmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIC8vIFRyYWNrIHRoZSBzdGF0ZSBuZWNlc3NhcnkgZm9yIGNoZWNraW5nIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSAoc3VicGFzcyB1c2FnZSBvZiBkZXB0aCBhbmQgY29sb3IgYXR0YWNobWVudHMpCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHJlbmRlcnBhc3NfbWFwX211dGV4KTsKKyAgICByZW5kZXJwYXNzZXNfc3RhdGVzLmVyYXNlKHJlbmRlclBhc3MpOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvICpwQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VNZW1vcnkgKnBNZW1vcnkpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChwQWxsb2NhdGVJbmZvKSB7CisgICAgICAgIGF1dG8gY2hhaW5lZF9wcmlvX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrTWVtb3J5UHJpb3JpdHlBbGxvY2F0ZUluZm9FWFQ+KHBBbGxvY2F0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKGNoYWluZWRfcHJpb19zdHJ1Y3QgJiYgKGNoYWluZWRfcHJpb19zdHJ1Y3QtPnByaW9yaXR5IDwgMC4wZiB8fCBjaGFpbmVkX3ByaW9fc3RydWN0LT5wcmlvcml0eSA+IDEuMGYpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtNZW1vcnlQcmlvcml0eUFsbG9jYXRlSW5mb0VYVC1wcmlvcml0eS0wMjYwMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaW9yaXR5ICg9JWYpIG11c3QgYmUgYmV0d2VlbiBgMGAgYW5kIGAxYCwgaW5jbHVzaXZlLiIsIGNoYWluZWRfcHJpb19zdHJ1Y3QtPnByaW9yaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVGbGFncyBmbGFncyA9IDA7CisgICAgICAgIGF1dG8gZmxhZ3NfaW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8+KHBBbGxvY2F0ZUluZm8tPnBOZXh0KTsKKyAgICAgICAgaWYgKGZsYWdzX2luZm8pIHsKKyAgICAgICAgICAgIGZsYWdzID0gZmxhZ3NfaW5mby0+ZmxhZ3M7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIG9wYXF1ZV9hbGxvY19pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0FsbG9jYXRlSW5mb0tIUj4ocEFsbG9jYXRlSW5mby0+cE5leHQpOworICAgICAgICBpZiAob3BhcXVlX2FsbG9jX2luZm8gJiYgb3BhcXVlX2FsbG9jX2luZm8tPm9wYXF1ZUNhcHR1cmVBZGRyZXNzICE9IDApIHsKKyAgICAgICAgICAgIGlmICghKGZsYWdzICYgVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1vcGFxdWVDYXB0dXJlQWRkcmVzcy0wMzMyOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZiBvcGFxdWVDYXB0dXJlQWRkcmVzcyBpcyBub24temVybywgVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mbzo6ZmxhZ3MgbXVzdCBpbmNsdWRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSLiIpOworICAgICAgICAgICAgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICAgICAgYXV0byBpbXBvcnRfbWVtb3J5X3dpbjMyX2hhbmRsZSA9IGx2bF9maW5kX2luX2NoYWluPFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSPihwQWxsb2NhdGVJbmZvLT5wTmV4dCk7CisjZW5kaWYKKyAgICAgICAgICAgIGF1dG8gaW1wb3J0X21lbW9yeV9mZCA9IGx2bF9maW5kX2luX2NoYWluPFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSPihwQWxsb2NhdGVJbmZvLT5wTmV4dCk7CisgICAgICAgICAgICBhdXRvIGltcG9ydF9tZW1vcnlfaG9zdF9wb2ludGVyID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQ+KHBBbGxvY2F0ZUluZm8tPnBOZXh0KTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICAgICAgICAgIGF1dG8gaW1wb3J0X21lbW9yeV9haGIgPSBsdmxfZmluZF9pbl9jaGFpbjxWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEPihwQWxsb2NhdGVJbmZvLT5wTmV4dCk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKGltcG9ydF9tZW1vcnlfaG9zdF9wb2ludGVyKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDMzMzIiLAorICAgICAgICAgICAgICAgICAgICAiSWYgdGhlIHBOZXh0IGNoYWluIGluY2x1ZGVzIGEgVmtJbXBvcnRNZW1vcnlIb3N0UG9pbnRlckluZm9FWFQgc3RydWN0dXJlLCBvcGFxdWVDYXB0dXJlQWRkcmVzcyBtdXN0IGJlIHplcm8uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICAgICAgICAgIChpbXBvcnRfbWVtb3J5X3dpbjMyX2hhbmRsZSAmJiBpbXBvcnRfbWVtb3J5X3dpbjMyX2hhbmRsZS0+aGFuZGxlVHlwZSkgfHwKKyNlbmRpZgorICAgICAgICAgICAgICAgIChpbXBvcnRfbWVtb3J5X2ZkICYmIGltcG9ydF9tZW1vcnlfZmQtPmhhbmRsZVR5cGUpIHx8CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgICAgICAgICAgICAgKGltcG9ydF9tZW1vcnlfYWhiICYmIGltcG9ydF9tZW1vcnlfYWhiLT5idWZmZXIpIHx8CisjZW5kaWYKKyAgICAgICAgICAgICAgICAoaW1wb3J0X21lbW9yeV9ob3N0X3BvaW50ZXIgJiYgaW1wb3J0X21lbW9yeV9ob3N0X3BvaW50ZXItPmhhbmRsZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1vcGFxdWVDYXB0dXJlQWRkcmVzcy0wMzMzMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZiB0aGUgcGFyYW1ldGVycyBkZWZpbmUgYW4gaW1wb3J0IG9wZXJhdGlvbiwgb3BhcXVlQ2FwdHVyZUFkZHJlc3MgbXVzdCBiZSB6ZXJvLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICpiZGFfZmVhdHVyZXMgPQorICAgICAgICAgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI+KHBoeXNpY2FsX2RldmljZV9mZWF0dXJlczIucE5leHQpOworICAgICAgICAgICAgaWYgKChmbGFncyAmIFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfS0hSKSAmJgorICAgICAgICAgICAgICAgICghYmRhX2ZlYXR1cmVzIHx8ICFiZGFfZmVhdHVyZXMtPmJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5KSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tZmxhZ3MtMDMzMzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWYgVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0NBUFRVUkVfUkVQTEFZX0JJVF9LSFIgaXMgc2V0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSBtdXN0IGJlIGVuYWJsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGZsYWdzICYgVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0JJVF9LSFIpICYmICghYmRhX2ZlYXR1cmVzIHx8ICFiZGFfZmVhdHVyZXMtPmJ1ZmZlckRldmljZUFkZHJlc3MpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1mbGFncy0wMzMzMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZiBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQklUX0tIUiBpcyBzZXQsIGJ1ZmZlckRldmljZUFkZHJlc3MgbXVzdCBiZSBlbmFibGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlZhbGlkYXRlR2VvbWV0cnlUcmlhbmdsZXNOVihjb25zdCBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgJnRyaWFuZ2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLCB1aW50NjRfdCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY19uYW1lKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAodHJpYW5nbGVzLnZlcnRleEZvcm1hdCAhPSBWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVCAmJiB0cmlhbmdsZXMudmVydGV4Rm9ybWF0ICE9IFZLX0ZPUk1BVF9SMTZHMTZCMTZfU0ZMT0FUICYmCisgICAgICAgIHRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQgIT0gVktfRk9STUFUX1IxNkcxNkIxNl9TTk9STSAmJiB0cmlhbmdsZXMudmVydGV4Rm9ybWF0ICE9IFZLX0ZPUk1BVF9SMzJHMzJfU0ZMT0FUICYmCisgICAgICAgIHRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQgIT0gVktfRk9STUFUX1IxNkcxNl9TRkxPQVQgJiYgdHJpYW5nbGVzLnZlcnRleEZvcm1hdCAhPSBWS19GT1JNQVRfUjE2RzE2X1NOT1JNKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleEZvcm1hdC0wMjQzMCIsICIlcyIsIGZ1bmNfbmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgdmVydGV4X2NvbXBvbmVudF9zaXplID0gMDsKKyAgICAgICAgaWYgKHRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQgPT0gVktfRk9STUFUX1IzMkczMkIzMl9TRkxPQVQgfHwgdHJpYW5nbGVzLnZlcnRleEZvcm1hdCA9PSBWS19GT1JNQVRfUjMyRzMyX1NGTE9BVCkgeworICAgICAgICAgICAgdmVydGV4X2NvbXBvbmVudF9zaXplID0gNDsKKyAgICAgICAgfSBlbHNlIGlmICh0cmlhbmdsZXMudmVydGV4Rm9ybWF0ID09IFZLX0ZPUk1BVF9SMTZHMTZCMTZfU0ZMT0FUIHx8IHRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQgPT0gVktfRk9STUFUX1IxNkcxNkIxNl9TTk9STSB8fAorICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQgPT0gVktfRk9STUFUX1IxNkcxNl9TRkxPQVQgfHwgdHJpYW5nbGVzLnZlcnRleEZvcm1hdCA9PSBWS19GT1JNQVRfUjE2RzE2X1NOT1JNKSB7CisgICAgICAgICAgICB2ZXJ0ZXhfY29tcG9uZW50X3NpemUgPSAyOworICAgICAgICB9CisgICAgICAgIGlmICh2ZXJ0ZXhfY29tcG9uZW50X3NpemUgPiAwICYmIFNhZmVNb2R1bG8odHJpYW5nbGVzLnZlcnRleE9mZnNldCwgdmVydGV4X2NvbXBvbmVudF9zaXplKSAhPSAwKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdmVydGV4T2Zmc2V0LTAyNDI5IiwgIiVzIiwgZnVuY19uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmlhbmdsZXMuaW5kZXhUeXBlICE9IFZLX0lOREVYX1RZUEVfVUlOVDMyICYmIHRyaWFuZ2xlcy5pbmRleFR5cGUgIT0gVktfSU5ERVhfVFlQRV9VSU5UMTYgJiYKKyAgICAgICAgdHJpYW5nbGVzLmluZGV4VHlwZSAhPSBWS19JTkRFWF9UWVBFX05PTkVfTlYpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0X3R5cGUsIG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhUeXBlLTAyNDMzIiwgIiVzIiwgZnVuY19uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBpbmRleF9lbGVtZW50X3NpemUgPSAwOworICAgICAgICBpZiAodHJpYW5nbGVzLmluZGV4VHlwZSA9PSBWS19JTkRFWF9UWVBFX1VJTlQzMikgeworICAgICAgICAgICAgaW5kZXhfZWxlbWVudF9zaXplID0gNDsKKyAgICAgICAgfSBlbHNlIGlmICh0cmlhbmdsZXMuaW5kZXhUeXBlID09IFZLX0lOREVYX1RZUEVfVUlOVDE2KSB7CisgICAgICAgICAgICBpbmRleF9lbGVtZW50X3NpemUgPSAyOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleF9lbGVtZW50X3NpemUgPiAwICYmIFNhZmVNb2R1bG8odHJpYW5nbGVzLmluZGV4T2Zmc2V0LCBpbmRleF9lbGVtZW50X3NpemUpICE9IDApIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleE9mZnNldC0wMjQzMiIsICIlcyIsIGZ1bmNfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRyaWFuZ2xlcy5pbmRleFR5cGUgPT0gVktfSU5ERVhfVFlQRV9OT05FX05WKSB7CisgICAgICAgIGlmICh0cmlhbmdsZXMuaW5kZXhDb3VudCAhPSAwKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhDb3VudC0wMjQzNiIsICIlcyIsIGZ1bmNfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyaWFuZ2xlcy5pbmRleERhdGEgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleERhdGEtMDI0MzQiLCAiJXMiLCBmdW5jX25hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKFNhZmVNb2R1bG8odHJpYW5nbGVzLnRyYW5zZm9ybU9mZnNldCwgMTYpICE9IDApIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0X3R5cGUsIG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdHJhbnNmb3JtT2Zmc2V0LTAyNDM4IiwgIiVzIiwgZnVuY19uYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpWYWxpZGF0ZUdlb21ldHJ5QUFCQk5WKGNvbnN0IFZrR2VvbWV0cnlBQUJCTlYgJmFhYmJzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvYmplY3RfaGFuZGxlLCBjb25zdCBjaGFyICpmdW5jX25hbWUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChTYWZlTW9kdWxvKGFhYmJzLm9mZnNldCwgOCkgIT0gMCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR2VvbWV0cnlBQUJCTlYtb2Zmc2V0LTAyNDQwIiwgIiVzIiwgZnVuY19uYW1lKTsKKyAgICB9CisgICAgaWYgKFNhZmVNb2R1bG8oYWFiYnMuc3RyaWRlLCA4KSAhPSAwKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHZW9tZXRyeUFBQkJOVi1zdHJpZGUtMDI0NDEiLCAiJXMiLCBmdW5jX25hbWUpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlZhbGlkYXRlR2VvbWV0cnlOVihjb25zdCBWa0dlb21ldHJ5TlYgJmdlb21ldHJ5LCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChnZW9tZXRyeS5nZW9tZXRyeVR5cGUgPT0gVktfR0VPTUVUUllfVFlQRV9UUklBTkdMRVNfTlYpIHsKKyAgICAgICAgc2tpcCA9IFZhbGlkYXRlR2VvbWV0cnlUcmlhbmdsZXNOVihnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLCBmdW5jX25hbWUpOworICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkuZ2VvbWV0cnlUeXBlID09IFZLX0dFT01FVFJZX1RZUEVfQUFCQlNfTlYpIHsKKyAgICAgICAgc2tpcCA9IFZhbGlkYXRlR2VvbWV0cnlBQUJCTlYoZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLCBmdW5jX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpWYWxpZGF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVihjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViAmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsIHVpbnQ2NF90IG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChpbmZvLnR5cGUgPT0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX1RPUF9MRVZFTF9OViAmJiBpbmZvLmdlb21ldHJ5Q291bnQgIT0gMCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXR5cGUtMDI0MjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOiBJZiB0eXBlIGlzIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9UT1BfTEVWRUxfTlYgdGhlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2VvbWV0cnlDb3VudCBtdXN0IGJlIDAuIik7CisgICAgfQorICAgIGlmIChpbmZvLnR5cGUgPT0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX0JPVFRPTV9MRVZFTF9OViAmJiBpbmZvLmluc3RhbmNlQ291bnQgIT0gMCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBvYmplY3RfdHlwZSwgb2JqZWN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXR5cGUtMDI0MjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOiBJZiB0eXBlIGlzIFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlYgdGhlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2VDb3VudCBtdXN0IGJlIDAuIik7CisgICAgfQorICAgIGlmIChpbmZvLmZsYWdzICYgVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9UUkFDRV9CSVRfTlYgJiYKKyAgICAgICAgaW5mby5mbGFncyAmIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUFJFRkVSX0ZBU1RfQlVJTERfQklUX05WKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtZmxhZ3MtMDI1OTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WOiBJZiBmbGFncyBoYXMgdGhlIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUFJFRkVSX0ZBU1RfVFJBQ0VfQklUX05WIgorICAgICAgICAgICAgICAgICAgICAgICAgImJpdCBzZXQsIHRoZW4gaXQgbXVzdCBub3QgaGF2ZSB0aGUgVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9CVUlMRF9CSVRfTlYgYml0IHNldC4iKTsKKyAgICB9CisgICAgaWYgKGluZm8uZ2VvbWV0cnlDb3VudCA+IHBoeXNfZGV2X2V4dF9wcm9wcy5yYXlfdHJhY2luZ19wcm9wcy5tYXhHZW9tZXRyeUNvdW50KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtZ2VvbWV0cnlDb3VudC0wMjQyMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlY6IGdlb21ldHJ5Q291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WOjptYXhHZW9tZXRyeUNvdW50LiIpOworICAgIH0KKyAgICBpZiAoaW5mby5pbnN0YW5jZUNvdW50ID4gcGh5c19kZXZfZXh0X3Byb3BzLnJheV90cmFjaW5nX3Byb3BzLm1heEluc3RhbmNlQ291bnQpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0X3R5cGUsIG9iamVjdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1pbnN0YW5jZUNvdW50LTAyNDIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjogaW5zdGFuY2VDb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlY6Om1heEluc3RhbmNlQ291bnQuIik7CisgICAgfQorICAgIGlmIChpbmZvLnR5cGUgPT0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX0JPVFRPTV9MRVZFTF9OViAmJiBpbmZvLmdlb21ldHJ5Q291bnQgPiAwKSB7CisgICAgICAgIHVpbnQ2NF90IHRvdGFsX3RyaWFuZ2xlX2NvdW50ID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluZm8uZ2VvbWV0cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBWa0dlb21ldHJ5TlYgJmdlb21ldHJ5ID0gaW5mby5wR2VvbWV0cmllc1tpXTsKKworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUdlb21ldHJ5TlYoZ2VvbWV0cnksIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLCBmdW5jX25hbWUpOworCisgICAgICAgICAgICBpZiAoZ2VvbWV0cnkuZ2VvbWV0cnlUeXBlICE9IFZLX0dFT01FVFJZX1RZUEVfVFJJQU5HTEVTX05WKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbF90cmlhbmdsZV9jb3VudCArPSBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhDb3VudCAvIDM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvdGFsX3RyaWFuZ2xlX2NvdW50ID4gcGh5c19kZXZfZXh0X3Byb3BzLnJheV90cmFjaW5nX3Byb3BzLm1heFRyaWFuZ2xlQ291bnQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdF90eXBlLCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLW1heFRyaWFuZ2xlQ291bnQtMDI0MjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjogVGhlIHRvdGFsIG51bWJlciBvZiB0cmlhbmdsZXMgaW4gYWxsIGdlb21ldHJpZXMgbXVzdCBiZSBsZXNzIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBlcXVhbCB0byBWa1BoeXNpY2FsRGV2aWNlUmF5VHJhY2luZ1Byb3BlcnRpZXNOVjo6bWF4VHJpYW5nbGVDb3VudC4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5mby50eXBlID09IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlYgJiYgaW5mby5nZW9tZXRyeUNvdW50ID4gMSkgeworICAgICAgICBjb25zdCBWa0dlb21ldHJ5VHlwZU5WIGZpcnN0X2dlb21ldHJ5X3R5cGUgPSBpbmZvLnBHZW9tZXRyaWVzWzBdLmdlb21ldHJ5VHlwZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IGluZm8uZ2VvbWV0cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBWa0dlb21ldHJ5TlYgJmdlb21ldHJ5ID0gaW5mby5wR2VvbWV0cmllc1tpXTsKKyAgICAgICAgICAgIGlmIChnZW9tZXRyeS5nZW9tZXRyeVR5cGUgIT0gZmlyc3RfZ2VvbWV0cnlfdHlwZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBmYWtlIFZVSUQgYmVsb3cgd2l0aCB0aGUgcmVhbCBvbmUgb25jZSBpdCBpcyBnZW5lcmF0ZWQuCisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlZfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICJVTkFTU0lHTkVELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXBHZW9tZXRyaWVzLVhYWFgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVjogaW5mby5wR2VvbWV0cmllc1slZF0uZ2VvbWV0cnlUeXBlIGRvZXMgbm90IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5mby5wR2VvbWV0cmllc1swXS5nZW9tZXRyeVR5cGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoCisgICAgVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAqcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICpwQWNjZWxlcmF0aW9uU3RydWN0dXJlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgaWYgKChwQ3JlYXRlSW5mby0+Y29tcGFjdGVkU2l6ZSAhPSAwKSAmJgorICAgICAgICAgICAgKChwQ3JlYXRlSW5mby0+aW5mby5nZW9tZXRyeUNvdW50ICE9IDApIHx8IChwQ3JlYXRlSW5mby0+aW5mby5pbnN0YW5jZUNvdW50ICE9IDApKSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WLWNvbXBhY3RlZFNpemUtMDI0MjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCk6IHBDcmVhdGVJbmZvLT5jb21wYWN0ZWRTaXplIG5vbnplcm8gKCUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHdpdGggaW5mby5nZW9tZXRyeUNvdW50ICglIiBQUkl1MzIgIikgb3IgaW5mby5pbnN0YW5jZUNvdW50ICglIiBQUkl1MzIgIikgbm9uemVyby4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5jb21wYWN0ZWRTaXplLCBwQ3JlYXRlSW5mby0+aW5mby5nZW9tZXRyeUNvdW50LCBwQ3JlYXRlSW5mby0+aW5mby5pbnN0YW5jZUNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYocENyZWF0ZUluZm8tPmluZm8sIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVigpIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgaW5zdGFuY2VEYXRhLCBWa0RldmljZVNpemUgaW5zdGFuY2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQm9vbDMyIHVwZGF0ZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0J1ZmZlciBzY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgc2NyYXRjaE9mZnNldCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKHBJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVigqcEluZm8sIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChkc3QpLCAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKCkiKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YVNpemUsIHZvaWQgKnBEYXRhKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGRhdGFTaXplIDwgOCkgeworICAgICAgICBza2lwID0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoYWNjZWxlcmF0aW9uU3RydWN0dXJlKSwgIlZVSUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1kYXRhU2l6ZS0wMjI0MCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKCk6IGRhdGFTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDguIik7CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZSAqcFBpcGVsaW5lcykgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNyZWF0ZUluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIGF1dG8gZmVlZGJhY2tfc3RydWN0ID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUPihwQ3JlYXRlSW5mb3NbaV0ucE5leHQpOworICAgICAgICBpZiAoKGZlZWRiYWNrX3N0cnVjdCAhPSBudWxscHRyKSAmJiAoZmVlZGJhY2tfc3RydWN0LT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ICE9IHBDcmVhdGVJbmZvc1tpXS5zdGFnZUNvdW50KSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQtMDI2NzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigpOiBpbiBwQ3JlYXRlSW5mb1slIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSwgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQ6OnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig9JSIgUFJJdTMyICIpIG11c3QgZXF1YWwgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY6OnN0YWdlQ291bnQoPSUiIFBSSXUzMiAiKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGZlZWRiYWNrX3N0cnVjdC0+cGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCwgcENyZWF0ZUluZm9zW2ldLnN0YWdlQ291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246OlByZUNhbGxWYWxpZGF0ZUdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIgKnBTdXJmYWNlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZUdyb3VwUHJlc2VudE1vZGVGbGFnc0tIUiAqcE1vZGVzKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3dhcGNoYWluKQorICAgICAgICBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiLCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9nZXRfc3VyZmFjZV9jYXBhYmlsaXRpZXNfMikKKyAgICAgICAgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIiwgVktfS0hSX0dFVF9TVVJGQUNFX0NBUEFCSUxJVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoIWRldmljZV9leHRlbnNpb25zLnZrX2tocl9zdXJmYWNlKQorICAgICAgICBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKCFkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzIpCisgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgIE91dHB1dEV4dGVuc2lvbkVycm9yKCJ2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQiLCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X2Z1bGxfc2NyZWVuX2V4Y2x1c2l2ZSkKKyAgICAgICAgc2tpcCB8PSBPdXRwdXRFeHRlbnNpb25FcnJvcigidmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhUIiwgVktfRVhUX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9FWFRFTlNJT05fTkFNRSk7CisgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgKKyAgICAgICAgInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIsICJwU3VyZmFjZUluZm8iLCAiVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVUkZBQ0VfSU5GT18yX0tIUiIsCisgICAgICAgIHBTdXJmYWNlSW5mbywgVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NVUkZBQ0VfSU5GT18yX0tIUiwgdHJ1ZSwKKyAgICAgICAgIlZVSUQtdmtHZXREZXZpY2VHcm91cFN1cmZhY2VQcmVzZW50TW9kZXMyRVhULXBTdXJmYWNlSW5mby1wYXJhbWV0ZXIiLCAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLXNUeXBlLXNUeXBlIik7CisgICAgaWYgKHBTdXJmYWNlSW5mbyAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IFZrU3RydWN0dXJlVHlwZSBhbGxvd2VkX3N0cnVjdHNfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUltdID0geworICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfU1VSRkFDRV9GVUxMX1NDUkVFTl9FWENMVVNJVkVfSU5GT19FWFQsCisgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9TVVJGQUNFX0ZVTExfU0NSRUVOX0VYQ0xVU0lWRV9XSU4zMl9JTkZPX0VYVH07CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIsICJwU3VyZmFjZUluZm8tPnBOZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrU3VyZmFjZUZ1bGxTY3JlZW5FeGNsdXNpdmVJbmZvRVhULCBWa1N1cmZhY2VGdWxsU2NyZWVuRXhjbHVzaXZlV2luMzJJbmZvRVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VJbmZvLT5wTmV4dCwgQVJSQVlfU0laRShhbGxvd2VkX3N0cnVjdHNfVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRfc3RydWN0c19Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSLXBOZXh0LXBOZXh0Iik7CisKKyAgICAgICAgc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUoInZrR2V0RGV2aWNlR3JvdXBTdXJmYWNlUHJlc2VudE1vZGVzMkVYVCIsICJwU3VyZmFjZUluZm8tPnN1cmZhY2UiLCBwU3VyZmFjZUluZm8tPnN1cmZhY2UpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKyNlbmRpZgorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVGcmFtZWJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRnJhbWVidWZmZXIgKnBGcmFtZWJ1ZmZlcikgY29uc3QgeworICAgIC8vIFZhbGlkYXRpb24gZm9yIHBBdHRhY2htZW50cyB3aGljaCBpcyBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdmFsaWRhdGlvbiBjb2RlIGR1ZSB0byBhICdub2F1dG92YWxpZGl0eScgdGFnIGluIHZrLnhtbAorICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmICgocENyZWF0ZUluZm8tPmZsYWdzICYgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSKSA9PSAwKSB7CisgICAgICAgIHNraXAgfD0gdmFsaWRhdGVfYXJyYXkoInZrQ3JlYXRlRnJhbWVidWZmZXIiLCAiYXR0YWNobWVudENvdW50IiwgInBBdHRhY2htZW50cyIsIHBDcmVhdGVJbmZvLT5hdHRhY2htZW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHMsIGZhbHNlLCB0cnVlLCBrVlVJRFVuZGVmaW5lZCwga1ZVSURVbmRlZmluZWQpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVN0aXBwbGVFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGxpbmVTdGlwcGxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGluZVN0aXBwbGVQYXR0ZXJuKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBpZiAobGluZVN0aXBwbGVGYWN0b3IgPCAxIHx8IGxpbmVTdGlwcGxlRmFjdG9yID4gMjU2KSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRTZXRMaW5lU3RpcHBsZUVYVC1saW5lU3RpcHBsZUZhY3Rvci0wMjc3NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRMaW5lU3RpcHBsZUVYVDo6bGluZVN0aXBwbGVGYWN0b3I9JWQgaXMgbm90IGluIFsxLDI1Nl0uIiwgbGluZVN0aXBwbGVGYWN0b3IpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRCaW5kSW5kZXhCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0luZGV4VHlwZSBpbmRleFR5cGUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChpbmRleFR5cGUgPT0gVktfSU5ERVhfVFlQRV9OT05FX05WKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb21tYW5kQnVmZmVyKSwgIlZVSUQtdmtDbWRCaW5kSW5kZXhCdWZmZXItaW5kZXhUeXBlLTAyNTA3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJpbmRJbmRleEJ1ZmZlcigpIGluZGV4VHlwZSBtdXN0IG5vdCBiZSBWS19JTkRFWF9UWVBFX05PTkVfTlYuIik7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqaW5kZXhfdHlwZV91aW50OF9mZWF0dXJlcyA9CisgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VJbmRleFR5cGVVaW50OEZlYXR1cmVzRVhUPihwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMyLnBOZXh0KTsKKyAgICBpZiAoaW5kZXhUeXBlID09IFZLX0lOREVYX1RZUEVfVUlOVDhfRVhUICYmICFpbmRleF90eXBlX3VpbnQ4X2ZlYXR1cmVzLT5pbmRleFR5cGVVaW50OCkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoY29tbWFuZEJ1ZmZlciksICJWVUlELXZrQ21kQmluZEluZGV4QnVmZmVyLWluZGV4VHlwZS0wMjc2NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCaW5kSW5kZXhCdWZmZXIoKSBpbmRleFR5cGUgaXMgVktfSU5ERVhfVFlQRV9VSU5UOF9FWFQgYnV0IGluZGV4VHlwZVVpbnQ4IGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6bWFudWFsX1ByZUNhbGxWYWxpZGF0ZVNldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUICpwTmFtZUluZm8pIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAocE5hbWVJbmZvLT5vYmplY3RUeXBlID09IFZLX09CSkVDVF9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVC1vYmplY3RUeXBlLTAyNTg5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKCkgcE5hbWVJbmZvLT5vYmplY3RUeXBlIGNhbm5vdCBiZSBWS19PQkpFQ1RfVFlQRV9VTktOT1dOLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVChWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgKnBUYWdJbmZvKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKHBUYWdJbmZvLT5vYmplY3RUeXBlID09IFZLX09CSkVDVF9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhULW9iamVjdFR5cGUtMDE5MDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCgpIHBUYWdJbmZvLT5vYmplY3RUeXBlIGNhbm5vdCBiZSBWS19PQkpFQ1RfVFlQRV9VTktOT1dOLiIpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjptYW51YWxfUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZUtIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDY0X3QgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBWa0ZlbmNlIGZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcEltYWdlSW5kZXgpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChzZW1hcGhvcmUgPT0gVktfTlVMTF9IQU5ETEUgJiYgZmVuY2UgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc3dhcGNoYWluKSwgIlZVSUQtdmtBY3F1aXJlTmV4dEltYWdlS0hSLXNlbWFwaG9yZS0wMTc4MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtBY3F1aXJlTmV4dEltYWdlS0hSOiBzZW1hcGhvcmUgYW5kIGZlbmNlIGFyZSBib3RoIFZLX05VTExfSEFORExFLiIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIFN0YXRlbGVzc1ZhbGlkYXRpb246Om1hbnVhbF9QcmVDYWxsVmFsaWRhdGVBY3F1aXJlTmV4dEltYWdlMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgKnBBY3F1aXJlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwSW1hZ2VJbmRleCkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKHBBY3F1aXJlSW5mby0+c2VtYXBob3JlID09IFZLX05VTExfSEFORExFICYmIHBBY3F1aXJlSW5mby0+ZmVuY2UgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocEFjcXVpcmVJbmZvLT5zd2FwY2hhaW4pLCAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLXNlbWFwaG9yZS0wMTc4MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmtBY3F1aXJlTmV4dEltYWdlMktIUjogcEFjcXVpcmVJbmZvLT5zZW1hcGhvcmUgYW5kIHBBY3F1aXJlSW5mby0+ZmVuY2UgYXJlIGJvdGggVktfTlVMTF9IQU5ETEUuIik7CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvc2hhZGVyX3ZhbGlkYXRpb24uY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3NoYWRlcl92YWxpZGF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzlhNzExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3NoYWRlcl92YWxpZGF0aW9uLmNwcApAQCAtMCwwICsxLDM0NjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZkBpancuY28ubno+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKyAqLworCisjZGVmaW5lIE5PTUlOTUFYCisKKyNpbmNsdWRlICJzaGFkZXJfdmFsaWRhdGlvbi5oIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPFNQSVJWL3NwaXJ2LmhwcD4KKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2a19lbnVtX3N0cmluZ19oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9kYXRhLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJjaGFzc2lzLmgiCisjaW5jbHVkZSAiY29yZV92YWxpZGF0aW9uLmgiCisKKyNpbmNsdWRlICJzcGlydi10b29scy9saWJzcGlydi5oIgorI2luY2x1ZGUgInh4aGFzaC5oIgorCit2b2lkIGRlY29yYXRpb25fc2V0OjphZGQodWludDMyX3QgZGVjb3JhdGlvbiwgdWludDMyX3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGRlY29yYXRpb24pIHsKKyAgICAgICAgY2FzZSBzcHY6OkRlY29yYXRpb25Mb2NhdGlvbjoKKyAgICAgICAgICAgIGZsYWdzIHw9IGxvY2F0aW9uX2JpdDsKKyAgICAgICAgICAgIGxvY2F0aW9uID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OkRlY29yYXRpb25QYXRjaDoKKyAgICAgICAgICAgIGZsYWdzIHw9IHBhdGNoX2JpdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RGVjb3JhdGlvblJlbGF4ZWRQcmVjaXNpb246CisgICAgICAgICAgICBmbGFncyB8PSByZWxheGVkX3ByZWNpc2lvbl9iaXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OkRlY29yYXRpb25CbG9jazoKKyAgICAgICAgICAgIGZsYWdzIHw9IGJsb2NrX2JpdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkJ1ZmZlckJsb2NrOgorICAgICAgICAgICAgZmxhZ3MgfD0gYnVmZmVyX2Jsb2NrX2JpdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkNvbXBvbmVudDoKKyAgICAgICAgICAgIGZsYWdzIHw9IGNvbXBvbmVudF9iaXQ7CisgICAgICAgICAgICBjb21wb25lbnQgPSB2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbklucHV0QXR0YWNobWVudEluZGV4OgorICAgICAgICAgICAgZmxhZ3MgfD0gaW5wdXRfYXR0YWNobWVudF9pbmRleF9iaXQ7CisgICAgICAgICAgICBpbnB1dF9hdHRhY2htZW50X2luZGV4ID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OkRlY29yYXRpb25EZXNjcmlwdG9yU2V0OgorICAgICAgICAgICAgZmxhZ3MgfD0gZGVzY3JpcHRvcl9zZXRfYml0OworICAgICAgICAgICAgZGVzY3JpcHRvcl9zZXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkJpbmRpbmc6CisgICAgICAgICAgICBmbGFncyB8PSBiaW5kaW5nX2JpdDsKKyAgICAgICAgICAgIGJpbmRpbmcgPSB2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbk5vbldyaXRhYmxlOgorICAgICAgICAgICAgZmxhZ3MgfD0gbm9ud3JpdGFibGVfYml0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uQnVpbHRJbjoKKyAgICAgICAgICAgIGZsYWdzIHw9IGJ1aWx0aW5fYml0OworICAgICAgICAgICAgYnVpbHRpbiA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitlbnVtIEZPUk1BVF9UWVBFIHsKKyAgICBGT1JNQVRfVFlQRV9GTE9BVCA9IDEsICAvLyBVTk9STSwgU05PUk0sIEZMT0FULCBVU0NBTEVELCBTU0NBTEVELCBTUkdCIC0tIGFueXRoaW5nIHdlIGNvbnNpZGVyIGZsb2F0IGluIHRoZSBzaGFkZXIKKyAgICBGT1JNQVRfVFlQRV9TSU5UID0gMiwKKyAgICBGT1JNQVRfVFlQRV9VSU5UID0gNCwKK307CisKK3R5cGVkZWYgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gbG9jYXRpb25fdDsKKworc3RydWN0IHNoYWRlcl9zdGFnZV9hdHRyaWJ1dGVzIHsKKyAgICBjaGFyIGNvbnN0ICpjb25zdCBuYW1lOworICAgIGJvb2wgYXJyYXllZF9pbnB1dDsKKyAgICBib29sIGFycmF5ZWRfb3V0cHV0OworICAgIFZrU2hhZGVyU3RhZ2VGbGFncyBzdGFnZTsKK307CisKK3N0YXRpYyBzaGFkZXJfc3RhZ2VfYXR0cmlidXRlcyBzaGFkZXJfc3RhZ2VfYXR0cmlic1tdID0geworICAgIHsidmVydGV4IHNoYWRlciIsIGZhbHNlLCBmYWxzZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVR9LAorICAgIHsidGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIiwgdHJ1ZSwgdHJ1ZSwgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVH0sCisgICAgeyJ0ZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXIiLCB0cnVlLCBmYWxzZSwgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVH0sCisgICAgeyJnZW9tZXRyeSBzaGFkZXIiLCB0cnVlLCBmYWxzZSwgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVH0sCisgICAgeyJmcmFnbWVudCBzaGFkZXIiLCBmYWxzZSwgZmFsc2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVR9LAorfTsKKwordW5zaWduZWQgRXhlY3V0aW9uTW9kZWxUb1NoYWRlclN0YWdlRmxhZ0JpdHModW5zaWduZWQgbW9kZSk7CisKKy8vIFNQSVJWIHV0aWxpdHkgZnVuY3Rpb25zCit2b2lkIFNIQURFUl9NT0RVTEVfU1RBVEU6OkJ1aWxkRGVmSW5kZXgoKSB7CisgICAgZm9yIChhdXRvIGluc24gOiAqdGhpcykgeworICAgICAgICBzd2l0Y2ggKGluc24ub3Bjb2RlKCkpIHsKKyAgICAgICAgICAgIC8vIFR5cGVzCisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlVm9pZDoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVCb29sOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZUludDoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVGbG9hdDoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVWZWN0b3I6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlTWF0cml4OgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZUltYWdlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVNhbXBsZXI6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlU2FtcGxlZEltYWdlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZUFycmF5OgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVJ1bnRpbWVBcnJheToKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVTdHJ1Y3Q6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlT3BhcXVlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVBvaW50ZXI6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlRnVuY3Rpb246CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlRXZlbnQ6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlRGV2aWNlRXZlbnQ6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlUmVzZXJ2ZUlkOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVF1ZXVlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVBpcGU6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlQ29vcGVyYXRpdmVNYXRyaXhOVjoKKyAgICAgICAgICAgICAgICBkZWZfaW5kZXhbaW5zbi53b3JkKDEpXSA9IGluc24ub2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBGaXhlZCBjb25zdGFudHMKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcENvbnN0YW50VHJ1ZToKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcENvbnN0YW50RmFsc2U6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BDb25zdGFudDoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcENvbnN0YW50Q29tcG9zaXRlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQ29uc3RhbnRTYW1wbGVyOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQ29uc3RhbnROdWxsOgorICAgICAgICAgICAgICAgIGRlZl9pbmRleFtpbnNuLndvcmQoMildID0gaW5zbi5vZmZzZXQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIFNwZWNpYWxpemF0aW9uIGNvbnN0YW50cworICAgICAgICAgICAgY2FzZSBzcHY6Ok9wU3BlY0NvbnN0YW50VHJ1ZToKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFNwZWNDb25zdGFudEZhbHNlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wU3BlY0NvbnN0YW50OgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wU3BlY0NvbnN0YW50Q29tcG9zaXRlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wU3BlY0NvbnN0YW50T3A6CisgICAgICAgICAgICAgICAgZGVmX2luZGV4W2luc24ud29yZCgyKV0gPSBpbnNuLm9mZnNldCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gVmFyaWFibGVzCisgICAgICAgICAgICBjYXNlIHNwdjo6T3BWYXJpYWJsZToKKyAgICAgICAgICAgICAgICBkZWZfaW5kZXhbaW5zbi53b3JkKDIpXSA9IGluc24ub2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbnMKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEZ1bmN0aW9uOgorICAgICAgICAgICAgICAgIGRlZl9pbmRleFtpbnNuLndvcmQoMildID0gaW5zbi5vZmZzZXQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIERlY29yYXRpb25zCisgICAgICAgICAgICBjYXNlIHNwdjo6T3BEZWNvcmF0ZTogeworICAgICAgICAgICAgICAgIGF1dG8gdGFyZ2V0SWQgPSBpbnNuLndvcmQoMSk7CisgICAgICAgICAgICAgICAgZGVjb3JhdGlvbnNbdGFyZ2V0SWRdLmFkZChpbnNuLndvcmQoMiksIGluc24ubGVuKCkgPiAzdSA/IGluc24ud29yZCgzKSA6IDB1KTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cERlY29yYXRlOiB7CisgICAgICAgICAgICAgICAgYXV0byBjb25zdCAmc3JjID0gZGVjb3JhdGlvbnNbaW5zbi53b3JkKDEpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA9IDJ1OyBpIDwgaW5zbi5sZW4oKTsgaSsrKSBkZWNvcmF0aW9uc1tpbnNuLndvcmQoaSldLm1lcmdlKHNyYyk7CisgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gRW50cnkgcG9pbnRzIC4uLiBhZGQgdG8gdGhlIGVudHJ5cG9pbnQgdGFibGUKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEVudHJ5UG9pbnQ6IHsKKyAgICAgICAgICAgICAgICAvLyBFbnRyeSBwb2ludHMgZG8gbm90IGhhdmUgYW4gaWQgKHRoZSBpZCBpcyB0aGUgZnVuY3Rpb24gaWQpIGFuZCB0aHVzIG5lZWQgdGhlaXIgb3duIHRhYmxlCisgICAgICAgICAgICAgICAgYXV0byBlbnRyeXBvaW50X25hbWUgPSAoY2hhciBjb25zdCAqKSZpbnNuLndvcmQoMyk7CisgICAgICAgICAgICAgICAgYXV0byBleGVjdXRpb25fbW9kZWwgPSBpbnNuLndvcmQoMSk7CisgICAgICAgICAgICAgICAgYXV0byBlbnRyeXBvaW50X3N0YWdlID0gRXhlY3V0aW9uTW9kZWxUb1NoYWRlclN0YWdlRmxhZ0JpdHMoZXhlY3V0aW9uX21vZGVsKTsKKyAgICAgICAgICAgICAgICBlbnRyeV9wb2ludHMuZW1wbGFjZShlbnRyeXBvaW50X25hbWUsIEVudHJ5UG9pbnR7aW5zbi5vZmZzZXQoKSwgZW50cnlwb2ludF9zdGFnZX0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgYW55IG90aGVyIGRlZnMgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordW5zaWduZWQgRXhlY3V0aW9uTW9kZWxUb1NoYWRlclN0YWdlRmxhZ0JpdHModW5zaWduZWQgbW9kZSkgeworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxWZXJ0ZXg6CisgICAgICAgICAgICByZXR1cm4gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbFRlc3NlbGxhdGlvbkNvbnRyb2w6CisgICAgICAgICAgICByZXR1cm4gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVDsKKyAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVsVGVzc2VsbGF0aW9uRXZhbHVhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxHZW9tZXRyeToKKyAgICAgICAgICAgIHJldHVybiBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxGcmFnbWVudDoKKyAgICAgICAgICAgIHJldHVybiBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxHTENvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxSYXlHZW5lcmF0aW9uTlY6CisgICAgICAgICAgICByZXR1cm4gVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlY7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbEFueUhpdE5WOgorICAgICAgICAgICAgcmV0dXJuIFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OVjsKKyAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVsQ2xvc2VzdEhpdE5WOgorICAgICAgICAgICAgcmV0dXJuIFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlY7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbE1pc3NOVjoKKyAgICAgICAgICAgIHJldHVybiBWS19TSEFERVJfU1RBR0VfTUlTU19CSVRfTlY7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbEludGVyc2VjdGlvbk5WOgorICAgICAgICAgICAgcmV0dXJuIFZLX1NIQURFUl9TVEFHRV9JTlRFUlNFQ1RJT05fQklUX05WOworICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxDYWxsYWJsZU5WOgorICAgICAgICAgICAgcmV0dXJuIFZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlY7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbFRhc2tOVjoKKyAgICAgICAgICAgIHJldHVybiBWS19TSEFERVJfU1RBR0VfVEFTS19CSVRfTlY7CisgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlbE1lc2hOVjoKKyAgICAgICAgICAgIHJldHVybiBWS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlY7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3NwaXJ2X2luc3RfaXRlciBGaW5kRW50cnlwb2ludChTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIGNoYXIgY29uc3QgKm5hbWUsIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZUJpdHMpIHsKKyAgICBhdXRvIHJhbmdlID0gc3JjLT5lbnRyeV9wb2ludHMuZXF1YWxfcmFuZ2UobmFtZSk7CisgICAgZm9yIChhdXRvIGl0ID0gcmFuZ2UuZmlyc3Q7IGl0ICE9IHJhbmdlLnNlY29uZDsgKytpdCkgeworICAgICAgICBpZiAoaXQtPnNlY29uZC5zdGFnZSA9PSBzdGFnZUJpdHMpIHsKKyAgICAgICAgICAgIHJldHVybiBzcmMtPmF0KGl0LT5zZWNvbmQub2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3JjLT5lbmQoKTsKK30KKworc3RhdGljIGNoYXIgY29uc3QgKlN0b3JhZ2VDbGFzc05hbWUodW5zaWduZWQgc2MpIHsKKyAgICBzd2l0Y2ggKHNjKSB7CisgICAgICAgIGNhc2Ugc3B2OjpTdG9yYWdlQ2xhc3NJbnB1dDoKKyAgICAgICAgICAgIHJldHVybiAiaW5wdXQiOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzT3V0cHV0OgorICAgICAgICAgICAgcmV0dXJuICJvdXRwdXQiOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzVW5pZm9ybUNvbnN0YW50OgorICAgICAgICAgICAgcmV0dXJuICJjb25zdCB1bmlmb3JtIjsKKyAgICAgICAgY2FzZSBzcHY6OlN0b3JhZ2VDbGFzc1VuaWZvcm06CisgICAgICAgICAgICByZXR1cm4gInVuaWZvcm0iOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzV29ya2dyb3VwOgorICAgICAgICAgICAgcmV0dXJuICJ3b3JrZ3JvdXAgbG9jYWwiOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzQ3Jvc3NXb3JrZ3JvdXA6CisgICAgICAgICAgICByZXR1cm4gIndvcmtncm91cCBnbG9iYWwiOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzUHJpdmF0ZToKKyAgICAgICAgICAgIHJldHVybiAicHJpdmF0ZSBnbG9iYWwiOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzRnVuY3Rpb246CisgICAgICAgICAgICByZXR1cm4gImZ1bmN0aW9uIjsKKyAgICAgICAgY2FzZSBzcHY6OlN0b3JhZ2VDbGFzc0dlbmVyaWM6CisgICAgICAgICAgICByZXR1cm4gImdlbmVyaWMiOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzQXRvbWljQ291bnRlcjoKKyAgICAgICAgICAgIHJldHVybiAiYXRvbWljIGNvdW50ZXIiOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzSW1hZ2U6CisgICAgICAgICAgICByZXR1cm4gImltYWdlIjsKKyAgICAgICAgY2FzZSBzcHY6OlN0b3JhZ2VDbGFzc1B1c2hDb25zdGFudDoKKyAgICAgICAgICAgIHJldHVybiAicHVzaCBjb25zdGFudCI7CisgICAgICAgIGNhc2Ugc3B2OjpTdG9yYWdlQ2xhc3NTdG9yYWdlQnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuICJzdG9yYWdlIGJ1ZmZlciI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KK30KKworLy8gR2V0IHRoZSB2YWx1ZSBvZiBhbiBpbnRlZ3JhbCBjb25zdGFudAordW5zaWduZWQgR2V0Q29uc3RhbnRWYWx1ZShTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIHVuc2lnbmVkIGlkKSB7CisgICAgYXV0byB2YWx1ZSA9IHNyYy0+Z2V0X2RlZihpZCk7CisgICAgYXNzZXJ0KHZhbHVlICE9IHNyYy0+ZW5kKCkpOworCisgICAgaWYgKHZhbHVlLm9wY29kZSgpICE9IHNwdjo6T3BDb25zdGFudCkgeworICAgICAgICAvLyBUT0RPOiBFaXRoZXIgZW5zdXJlIHRoYXQgdGhlIHNwZWNpYWxpemF0aW9uIHRyYW5zZm9ybSBpcyBhbHJlYWR5IHBlcmZvcm1lZCBvbiBhIG1vZHVsZSB3ZSdyZQorICAgICAgICAvLyAgICAgICBjb25zaWRlcmluZyBoZXJlLCBPUiAtLSBzcGVjaWFsaXplIG9uIHRoZSBmbHkgbm93LgorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWUud29yZCgzKTsKK30KKworc3RhdGljIHZvaWQgRGVzY3JpYmVUeXBlSW5uZXIoc3RkOjpvc3RyaW5nc3RyZWFtICZzcywgU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCB1bnNpZ25lZCB0eXBlKSB7CisgICAgYXV0byBpbnNuID0gc3JjLT5nZXRfZGVmKHR5cGUpOworICAgIGFzc2VydChpbnNuICE9IHNyYy0+ZW5kKCkpOworCisgICAgc3dpdGNoIChpbnNuLm9wY29kZSgpKSB7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVCb29sOgorICAgICAgICAgICAgc3MgPDwgImJvb2wiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVJbnQ6CisgICAgICAgICAgICBzcyA8PCAoaW5zbi53b3JkKDMpID8gJ3MnIDogJ3UnKSA8PCAiaW50IiA8PCBpbnNuLndvcmQoMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZUZsb2F0OgorICAgICAgICAgICAgc3MgPDwgImZsb2F0IiA8PCBpbnNuLndvcmQoMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVZlY3RvcjoKKyAgICAgICAgICAgIHNzIDw8ICJ2ZWMiIDw8IGluc24ud29yZCgzKSA8PCAiIG9mICI7CisgICAgICAgICAgICBEZXNjcmliZVR5cGVJbm5lcihzcywgc3JjLCBpbnNuLndvcmQoMikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVNYXRyaXg6CisgICAgICAgICAgICBzcyA8PCAibWF0IiA8PCBpbnNuLndvcmQoMykgPDwgIiBvZiAiOworICAgICAgICAgICAgRGVzY3JpYmVUeXBlSW5uZXIoc3MsIHNyYywgaW5zbi53b3JkKDIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlQXJyYXk6CisgICAgICAgICAgICBzcyA8PCAiYXJyWyIgPDwgR2V0Q29uc3RhbnRWYWx1ZShzcmMsIGluc24ud29yZCgzKSkgPDwgIl0gb2YgIjsKKyAgICAgICAgICAgIERlc2NyaWJlVHlwZUlubmVyKHNzLCBzcmMsIGluc24ud29yZCgyKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVJ1bnRpbWVBcnJheToKKyAgICAgICAgICAgIHNzIDw8ICJydW50aW1lIGFycltdIG9mICI7CisgICAgICAgICAgICBEZXNjcmliZVR5cGVJbm5lcihzcywgc3JjLCBpbnNuLndvcmQoMikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVQb2ludGVyOgorICAgICAgICAgICAgc3MgPDwgInB0ciB0byAiIDw8IFN0b3JhZ2VDbGFzc05hbWUoaW5zbi53b3JkKDIpKSA8PCAiICI7CisgICAgICAgICAgICBEZXNjcmliZVR5cGVJbm5lcihzcywgc3JjLCBpbnNuLndvcmQoMykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVTdHJ1Y3Q6IHsKKyAgICAgICAgICAgIHNzIDw8ICJzdHJ1Y3Qgb2YgKCI7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAyOyBpIDwgaW5zbi5sZW4oKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRGVzY3JpYmVUeXBlSW5uZXIoc3MsIHNyYywgaW5zbi53b3JkKGkpKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBpbnNuLmxlbigpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBzcyA8PCAiKSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIHNwdjo6T3BUeXBlU2FtcGxlcjoKKyAgICAgICAgICAgIHNzIDw8ICJzYW1wbGVyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlU2FtcGxlZEltYWdlOgorICAgICAgICAgICAgc3MgPDwgInNhbXBsZXIrIjsKKyAgICAgICAgICAgIERlc2NyaWJlVHlwZUlubmVyKHNzLCBzcmMsIGluc24ud29yZCgyKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZUltYWdlOgorICAgICAgICAgICAgc3MgPDwgImltYWdlKGRpbT0iIDw8IGluc24ud29yZCgzKSA8PCAiLCBzYW1wbGVkPSIgPDwgaW5zbi53b3JkKDcpIDw8ICIpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY6CisgICAgICAgICAgICBzcyA8PCAiYWNjZWxlcmF0aW9uU3RydXR1cmUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzcyA8PCAib2RkdHlwZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBEZXNjcmliZVR5cGUoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCB1bnNpZ25lZCB0eXBlKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOworICAgIERlc2NyaWJlVHlwZUlubmVyKHNzLCBzcmMsIHR5cGUpOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworc3RhdGljIGJvb2wgSXNOYXJyb3dOdW1lcmljVHlwZShzcGlydl9pbnN0X2l0ZXIgdHlwZSkgeworICAgIGlmICh0eXBlLm9wY29kZSgpICE9IHNwdjo6T3BUeXBlSW50ICYmIHR5cGUub3Bjb2RlKCkgIT0gc3B2OjpPcFR5cGVGbG9hdCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0eXBlLndvcmQoMikgPCA2NDsKK30KKworc3RhdGljIGJvb2wgVHlwZXNNYXRjaChTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICphLCBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpiLCB1bnNpZ25lZCBhX3R5cGUsIHVuc2lnbmVkIGJfdHlwZSwgYm9vbCBhX2FycmF5ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9hcnJheWVkLCBib29sIHJlbGF4ZWQpIHsKKyAgICAvLyBXYWxrIHR3byB0eXBlIHRyZWVzIHRvZ2V0aGVyLCBhbmQgY29tcGxhaW4gYWJvdXQgZGlmZmVyZW5jZXMKKyAgICBhdXRvIGFfaW5zbiA9IGEtPmdldF9kZWYoYV90eXBlKTsKKyAgICBhdXRvIGJfaW5zbiA9IGItPmdldF9kZWYoYl90eXBlKTsKKyAgICBhc3NlcnQoYV9pbnNuICE9IGEtPmVuZCgpKTsKKyAgICBhc3NlcnQoYl9pbnNuICE9IGItPmVuZCgpKTsKKworICAgIC8vIElnbm9yZSBydW50aW1lLXNpemVkIGFycmF5cy0tIHRoZXkgY2Fubm90IGFwcGVhciBpbiB0aGVzZSBpbnRlcmZhY2VzLgorCisgICAgaWYgKGFfYXJyYXllZCAmJiBhX2luc24ub3Bjb2RlKCkgPT0gc3B2OjpPcFR5cGVBcnJheSkgeworICAgICAgICByZXR1cm4gVHlwZXNNYXRjaChhLCBiLCBhX2luc24ud29yZCgyKSwgYl90eXBlLCBmYWxzZSwgYl9hcnJheWVkLCByZWxheGVkKTsKKyAgICB9CisKKyAgICBpZiAoYl9hcnJheWVkICYmIGJfaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wVHlwZUFycmF5KSB7CisgICAgICAgIC8vIFdlIHByb2JhYmx5IGp1c3QgZm91bmQgdGhlIGV4dHJhIGxldmVsIG9mIGFycmF5bmVzcyBpbiBiX3R5cGU6IGNvbXBhcmUgdGhlIHR5cGUgaW5zaWRlIGl0IHRvIGFfdHlwZQorICAgICAgICByZXR1cm4gVHlwZXNNYXRjaChhLCBiLCBhX3R5cGUsIGJfaW5zbi53b3JkKDIpLCBhX2FycmF5ZWQsIGZhbHNlLCByZWxheGVkKTsKKyAgICB9CisKKyAgICBpZiAoYV9pbnNuLm9wY29kZSgpID09IHNwdjo6T3BUeXBlVmVjdG9yICYmIHJlbGF4ZWQgJiYgSXNOYXJyb3dOdW1lcmljVHlwZShiX2luc24pKSB7CisgICAgICAgIHJldHVybiBUeXBlc01hdGNoKGEsIGIsIGFfaW5zbi53b3JkKDIpLCBiX3R5cGUsIGFfYXJyYXllZCwgYl9hcnJheWVkLCBmYWxzZSk7CisgICAgfQorCisgICAgaWYgKGFfaW5zbi5vcGNvZGUoKSAhPSBiX2luc24ub3Bjb2RlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChhX2luc24ub3Bjb2RlKCkgPT0gc3B2OjpPcFR5cGVQb2ludGVyKSB7CisgICAgICAgIC8vIE1hdGNoIG9uIHBvaW50ZWUgdHlwZS4gc3RvcmFnZSBjbGFzcyBpcyBleHBlY3RlZCB0byBkaWZmZXIKKyAgICAgICAgcmV0dXJuIFR5cGVzTWF0Y2goYSwgYiwgYV9pbnNuLndvcmQoMyksIGJfaW5zbi53b3JkKDMpLCBhX2FycmF5ZWQsIGJfYXJyYXllZCwgcmVsYXhlZCk7CisgICAgfQorCisgICAgaWYgKGFfYXJyYXllZCB8fCBiX2FycmF5ZWQpIHsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZW50IHJlc29sdmVkIGFycmF5LW9mLXZlcnRzIGJ5IGhlcmUsIHdlJ3JlIG5vdCBnb2luZyB0by4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaCAoYV9pbnNuLm9wY29kZSgpKSB7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVCb29sOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVJbnQ6CisgICAgICAgICAgICAvLyBNYXRjaCBvbiB3aWR0aCwgc2lnbmVkbmVzcworICAgICAgICAgICAgcmV0dXJuIGFfaW5zbi53b3JkKDIpID09IGJfaW5zbi53b3JkKDIpICYmIGFfaW5zbi53b3JkKDMpID09IGJfaW5zbi53b3JkKDMpOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlRmxvYXQ6CisgICAgICAgICAgICAvLyBNYXRjaCBvbiB3aWR0aAorICAgICAgICAgICAgcmV0dXJuIGFfaW5zbi53b3JkKDIpID09IGJfaW5zbi53b3JkKDIpOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlVmVjdG9yOgorICAgICAgICAgICAgLy8gTWF0Y2ggb24gZWxlbWVudCB0eXBlLCBjb3VudC4KKyAgICAgICAgICAgIGlmICghVHlwZXNNYXRjaChhLCBiLCBhX2luc24ud29yZCgyKSwgYl9pbnNuLndvcmQoMiksIGFfYXJyYXllZCwgYl9hcnJheWVkLCBmYWxzZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChyZWxheGVkICYmIElzTmFycm93TnVtZXJpY1R5cGUoYS0+Z2V0X2RlZihhX2luc24ud29yZCgyKSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFfaW5zbi53b3JkKDMpID49IGJfaW5zbi53b3JkKDMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYV9pbnNuLndvcmQoMykgPT0gYl9pbnNuLndvcmQoMyk7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVNYXRyaXg6CisgICAgICAgICAgICAvLyBNYXRjaCBvbiBlbGVtZW50IHR5cGUsIGNvdW50LgorICAgICAgICAgICAgcmV0dXJuIFR5cGVzTWF0Y2goYSwgYiwgYV9pbnNuLndvcmQoMiksIGJfaW5zbi53b3JkKDIpLCBhX2FycmF5ZWQsIGJfYXJyYXllZCwgZmFsc2UpICYmCisgICAgICAgICAgICAgICAgICAgYV9pbnNuLndvcmQoMykgPT0gYl9pbnNuLndvcmQoMyk7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVBcnJheToKKyAgICAgICAgICAgIC8vIE1hdGNoIG9uIGVsZW1lbnQgdHlwZSwgY291bnQuIHRoZXNlIGFsbCBoYXZlIHRoZSBzYW1lIGxheW91dC4gd2UgZG9uJ3QgZ2V0IGhlcmUgaWYgYl9hcnJheWVkLiBUaGlzIGRpZmZlcnMgZnJvbQorICAgICAgICAgICAgLy8gdmVjdG9yICYgbWF0cml4IHR5cGVzIGluIHRoYXQgdGhlIGFycmF5IHNpemUgaXMgdGhlIGlkIG9mIGEgY29uc3RhbnQgaW5zdHJ1Y3Rpb24sICogbm90IGEgbGl0ZXJhbCB3aXRoaW4gT3BUeXBlQXJyYXkKKyAgICAgICAgICAgIHJldHVybiBUeXBlc01hdGNoKGEsIGIsIGFfaW5zbi53b3JkKDIpLCBiX2luc24ud29yZCgyKSwgYV9hcnJheWVkLCBiX2FycmF5ZWQsIGZhbHNlKSAmJgorICAgICAgICAgICAgICAgICAgIEdldENvbnN0YW50VmFsdWUoYSwgYV9pbnNuLndvcmQoMykpID09IEdldENvbnN0YW50VmFsdWUoYiwgYl9pbnNuLndvcmQoMykpOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlU3RydWN0OgorICAgICAgICAgICAgLy8gTWF0Y2ggb24gYWxsIGVsZW1lbnQgdHlwZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYV9pbnNuLmxlbigpICE9IGJfaW5zbi5sZW4oKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBTdHJ1Y3RzIGNhbm5vdCBtYXRjaCBpZiBtZW1iZXIgY291bnRzIGRpZmZlcgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDI7IGkgPCBhX2luc24ubGVuKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVR5cGVzTWF0Y2goYSwgYiwgYV9pbnNuLndvcmQoaSksIGJfaW5zbi53b3JkKGkpLCBhX2FycmF5ZWQsIGJfYXJyYXllZCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFJlbWFpbmluZyB0eXBlcyBhcmUgQ0xpc21zLCBvciBtYXkgbm90IGFwcGVhciBpbiB0aGUgaW50ZXJmYWNlcyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gSnVzdCBjbGFpbSBubyBtYXRjaC4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBWYWx1ZU9yRGVmYXVsdChzdGQ6OnVub3JkZXJlZF9tYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBjb25zdCAmbWFwLCB1bnNpZ25lZCBpZCwgdW5zaWduZWQgZGVmKSB7CisgICAgYXV0byBpdCA9IG1hcC5maW5kKGlkKTsKKyAgICBpZiAoaXQgPT0gbWFwLmVuZCgpKQorICAgICAgICByZXR1cm4gZGVmOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBHZXRMb2NhdGlvbnNDb25zdW1lZEJ5VHlwZShTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIHVuc2lnbmVkIHR5cGUsIGJvb2wgc3RyaXBfYXJyYXlfbGV2ZWwpIHsKKyAgICBhdXRvIGluc24gPSBzcmMtPmdldF9kZWYodHlwZSk7CisgICAgYXNzZXJ0KGluc24gIT0gc3JjLT5lbmQoKSk7CisKKyAgICBzd2l0Y2ggKGluc24ub3Bjb2RlKCkpIHsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVBvaW50ZXI6CisgICAgICAgICAgICAvLyBTZWUgdGhyb3VnaCB0aGUgcHRyIC0tIHRoaXMgaXMgb25seSBldmVyIGF0IHRoZSB0b3BsZXZlbCBmb3IgZ3JhcGhpY3Mgc2hhZGVycyB3ZSdyZSBuZXZlciBhY3R1YWxseSBwYXNzaW5nCisgICAgICAgICAgICAvLyBwb2ludGVycyBhcm91bmQuCisgICAgICAgICAgICByZXR1cm4gR2V0TG9jYXRpb25zQ29uc3VtZWRCeVR5cGUoc3JjLCBpbnNuLndvcmQoMyksIHN0cmlwX2FycmF5X2xldmVsKTsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZUFycmF5OgorICAgICAgICAgICAgaWYgKHN0cmlwX2FycmF5X2xldmVsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldExvY2F0aW9uc0NvbnN1bWVkQnlUeXBlKHNyYywgaW5zbi53b3JkKDIpLCBmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRDb25zdGFudFZhbHVlKHNyYywgaW5zbi53b3JkKDMpKSAqIEdldExvY2F0aW9uc0NvbnN1bWVkQnlUeXBlKHNyYywgaW5zbi53b3JkKDIpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVNYXRyaXg6CisgICAgICAgICAgICAvLyBOdW0gbG9jYXRpb25zIGlzIHRoZSBkaW1lbnNpb24gKiBlbGVtZW50IHNpemUKKyAgICAgICAgICAgIHJldHVybiBpbnNuLndvcmQoMykgKiBHZXRMb2NhdGlvbnNDb25zdW1lZEJ5VHlwZShzcmMsIGluc24ud29yZCgyKSwgZmFsc2UpOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlVmVjdG9yOiB7CisgICAgICAgICAgICBhdXRvIHNjYWxhcl90eXBlID0gc3JjLT5nZXRfZGVmKGluc24ud29yZCgyKSk7CisgICAgICAgICAgICBhdXRvIGJpdF93aWR0aCA9CisgICAgICAgICAgICAgICAgKHNjYWxhcl90eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlSW50IHx8IHNjYWxhcl90eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlRmxvYXQpID8gc2NhbGFyX3R5cGUud29yZCgyKSA6IDMyOworCisgICAgICAgICAgICAvLyBMb2NhdGlvbnMgYXJlIDEyOC1iaXQgd2lkZTsgMy0gYW5kIDQtY29tcG9uZW50IHZlY3RvcnMgb2YgNjQgYml0IHR5cGVzIHJlcXVpcmUgdHdvLgorICAgICAgICAgICAgcmV0dXJuIChiaXRfd2lkdGggKiBpbnNuLndvcmQoMykgKyAxMjcpIC8gMTI4OworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaXMganVzdCAxLgorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgICAgIC8vIFRPRE86IGV4dGVuZCB0byBoYW5kbGUgNjRiaXQgc2NhbGFyIHR5cGVzLCB3aG9zZSB2ZWN0b3JzIG1heSBuZWVkIG11bHRpcGxlIGxvY2F0aW9ucy4KKyAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBHZXRDb21wb25lbnRzQ29uc3VtZWRCeVR5cGUoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCB1bnNpZ25lZCB0eXBlLCBib29sIHN0cmlwX2FycmF5X2xldmVsKSB7CisgICAgYXV0byBpbnNuID0gc3JjLT5nZXRfZGVmKHR5cGUpOworICAgIGFzc2VydChpbnNuICE9IHNyYy0+ZW5kKCkpOworCisgICAgc3dpdGNoIChpbnNuLm9wY29kZSgpKSB7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVQb2ludGVyOgorICAgICAgICAgICAgLy8gU2VlIHRocm91Z2ggdGhlIHB0ciAtLSB0aGlzIGlzIG9ubHkgZXZlciBhdCB0aGUgdG9wbGV2ZWwgZm9yIGdyYXBoaWNzIHNoYWRlcnMgd2UncmUgbmV2ZXIgYWN0dWFsbHkgcGFzc2luZworICAgICAgICAgICAgLy8gcG9pbnRlcnMgYXJvdW5kLgorICAgICAgICAgICAgcmV0dXJuIEdldENvbXBvbmVudHNDb25zdW1lZEJ5VHlwZShzcmMsIGluc24ud29yZCgzKSwgc3RyaXBfYXJyYXlfbGV2ZWwpOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlU3RydWN0OiB7CisgICAgICAgICAgICB1aW50MzJfdCBzdW0gPSAwOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMjsgaSA8IGluc24ubGVuKCk7IGkrKykgeyAgLy8gaT0yIHRvIHNraXAgd29yZCgwKSBhbmQgd29yZCgxKT1JRCBvZiBzdHJ1Y3QKKyAgICAgICAgICAgICAgICBzdW0gKz0gR2V0Q29tcG9uZW50c0NvbnN1bWVkQnlUeXBlKHNyYywgaW5zbi53b3JkKGkpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VtOworICAgICAgICB9CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVBcnJheToKKyAgICAgICAgICAgIGlmIChzdHJpcF9hcnJheV9sZXZlbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRDb21wb25lbnRzQ29uc3VtZWRCeVR5cGUoc3JjLCBpbnNuLndvcmQoMiksIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldENvbnN0YW50VmFsdWUoc3JjLCBpbnNuLndvcmQoMykpICogR2V0Q29tcG9uZW50c0NvbnN1bWVkQnlUeXBlKHNyYywgaW5zbi53b3JkKDIpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVNYXRyaXg6CisgICAgICAgICAgICAvLyBOdW0gbG9jYXRpb25zIGlzIHRoZSBkaW1lbnNpb24gKiBlbGVtZW50IHNpemUKKyAgICAgICAgICAgIHJldHVybiBpbnNuLndvcmQoMykgKiBHZXRDb21wb25lbnRzQ29uc3VtZWRCeVR5cGUoc3JjLCBpbnNuLndvcmQoMiksIGZhbHNlKTsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVZlY3RvcjogeworICAgICAgICAgICAgYXV0byBzY2FsYXJfdHlwZSA9IHNyYy0+Z2V0X2RlZihpbnNuLndvcmQoMikpOworICAgICAgICAgICAgYXV0byBiaXRfd2lkdGggPQorICAgICAgICAgICAgICAgIChzY2FsYXJfdHlwZS5vcGNvZGUoKSA9PSBzcHY6Ok9wVHlwZUludCB8fCBzY2FsYXJfdHlwZS5vcGNvZGUoKSA9PSBzcHY6Ok9wVHlwZUZsb2F0KSA/IHNjYWxhcl90eXBlLndvcmQoMikgOiAzMjsKKyAgICAgICAgICAgIC8vIE9uZSBjb21wb25lbnQgaXMgMzItYml0CisgICAgICAgICAgICByZXR1cm4gKGJpdF93aWR0aCAqIGluc24ud29yZCgzKSArIDMxKSAvIDMyOworICAgICAgICB9CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVGbG9hdDogeworICAgICAgICAgICAgYXV0byBiaXRfd2lkdGggPSBpbnNuLndvcmQoMik7CisgICAgICAgICAgICByZXR1cm4gKGJpdF93aWR0aCArIDMxKSAvIDMyOworICAgICAgICB9CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVJbnQ6IHsKKyAgICAgICAgICAgIGF1dG8gYml0X3dpZHRoID0gaW5zbi53b3JkKDIpOworICAgICAgICAgICAgcmV0dXJuIChiaXRfd2lkdGggKyAzMSkgLyAzMjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIHNwdjo6T3BDb25zdGFudDoKKyAgICAgICAgICAgIHJldHVybiBHZXRDb21wb25lbnRzQ29uc3VtZWRCeVR5cGUoc3JjLCBpbnNuLndvcmQoMSksIGZhbHNlKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIEdldExvY2F0aW9uc0NvbnN1bWVkQnlGb3JtYXQoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0X1VJTlQ6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIEdldEZvcm1hdFR5cGUoVmtGb3JtYXQgZm10KSB7CisgICAgaWYgKEZvcm1hdElzU0ludChmbXQpKSByZXR1cm4gRk9STUFUX1RZUEVfU0lOVDsKKyAgICBpZiAoRm9ybWF0SXNVSW50KGZtdCkpIHJldHVybiBGT1JNQVRfVFlQRV9VSU5UOworICAgIGlmIChGb3JtYXRJc0RlcHRoQW5kU3RlbmNpbChmbXQpKSByZXR1cm4gRk9STUFUX1RZUEVfRkxPQVQgfCBGT1JNQVRfVFlQRV9VSU5UOworICAgIGlmIChmbXQgPT0gVktfRk9STUFUX1VOREVGSU5FRCkgcmV0dXJuIDA7CisgICAgLy8gZXZlcnl0aGluZyBlbHNlIC0tIFVOT1JNL1NOT1JNL0ZMT0FUL1VTQ0FMRUQvU1NDQUxFRCBpcyBhbGwgZmxvYXQgaW4gdGhlIHNoYWRlci4KKyAgICByZXR1cm4gRk9STUFUX1RZUEVfRkxPQVQ7Cit9CisKKy8vIGNoYXJhY3Rlcml6ZXMgYSBTUElSLVYgdHlwZSBhcHBlYXJpbmcgaW4gYW4gaW50ZXJmYWNlIHRvIGEgRkYgc3RhZ2UsIGZvciBjb21wYXJpc29uIHRvIGEgVmtGb3JtYXQncyBjaGFyYWN0ZXJpemF0aW9uIGFib3ZlLgorLy8gYWxzbyB1c2VkIGZvciBpbnB1dCBhdHRhY2htZW50cywgYXMgd2Ugc3RhdGljYWxseSBrbm93IHRoZWlyIGZvcm1hdC4KK3N0YXRpYyB1bnNpZ25lZCBHZXRGdW5kYW1lbnRhbFR5cGUoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCB1bnNpZ25lZCB0eXBlKSB7CisgICAgYXV0byBpbnNuID0gc3JjLT5nZXRfZGVmKHR5cGUpOworICAgIGFzc2VydChpbnNuICE9IHNyYy0+ZW5kKCkpOworCisgICAgc3dpdGNoIChpbnNuLm9wY29kZSgpKSB7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVJbnQ6CisgICAgICAgICAgICByZXR1cm4gaW5zbi53b3JkKDMpID8gRk9STUFUX1RZUEVfU0lOVCA6IEZPUk1BVF9UWVBFX1VJTlQ7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVGbG9hdDoKKyAgICAgICAgICAgIHJldHVybiBGT1JNQVRfVFlQRV9GTE9BVDsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVZlY3RvcjoKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZU1hdHJpeDoKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZUFycmF5OgorICAgICAgICBjYXNlIHNwdjo6T3BUeXBlUnVudGltZUFycmF5OgorICAgICAgICBjYXNlIHNwdjo6T3BUeXBlSW1hZ2U6CisgICAgICAgICAgICByZXR1cm4gR2V0RnVuZGFtZW50YWxUeXBlKHNyYywgaW5zbi53b3JkKDIpKTsKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVBvaW50ZXI6CisgICAgICAgICAgICByZXR1cm4gR2V0RnVuZGFtZW50YWxUeXBlKHNyYywgaW5zbi53b3JkKDMpKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgdWludDMyX3QgR2V0U2hhZGVyU3RhZ2VJZChWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UpIHsKKyAgICB1aW50MzJfdCBiaXRfcG9zID0gdWludDMyX3QodV9mZnMoc3RhZ2UpKTsKKyAgICByZXR1cm4gYml0X3BvcyAtIDE7Cit9CisKK3N0YXRpYyBzcGlydl9pbnN0X2l0ZXIgR2V0U3RydWN0VHlwZShTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIHNwaXJ2X2luc3RfaXRlciBkZWYsIGJvb2wgaXNfYXJyYXlfb2ZfdmVydHMpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoZGVmLm9wY29kZSgpID09IHNwdjo6T3BUeXBlUG9pbnRlcikgeworICAgICAgICAgICAgZGVmID0gc3JjLT5nZXRfZGVmKGRlZi53b3JkKDMpKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZWYub3Bjb2RlKCkgPT0gc3B2OjpPcFR5cGVBcnJheSAmJiBpc19hcnJheV9vZl92ZXJ0cykgeworICAgICAgICAgICAgZGVmID0gc3JjLT5nZXRfZGVmKGRlZi53b3JkKDIpKTsKKyAgICAgICAgICAgIGlzX2FycmF5X29mX3ZlcnRzID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoZGVmLm9wY29kZSgpID09IHNwdjo6T3BUeXBlU3RydWN0KSB7CisgICAgICAgICAgICByZXR1cm4gZGVmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNyYy0+ZW5kKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBib29sIENvbGxlY3RJbnRlcmZhY2VCbG9ja01lbWJlcnMoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCBzdGQ6Om1hcDxsb2NhdGlvbl90LCBpbnRlcmZhY2VfdmFyPiAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FycmF5X29mX3ZlcnRzLCB1aW50MzJfdCBpZCwgdWludDMyX3QgdHlwZV9pZCwgYm9vbCBpc19wYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZmlyc3RfbG9jYXRpb24qLykgeworICAgIC8vIFdhbGsgZG93biB0aGUgdHlwZV9pZCBwcmVzZW50ZWQsIHRyeWluZyB0byBkZXRlcm1pbmUgd2hldGhlciBpdCdzIGFjdHVhbGx5IGFuIGludGVyZmFjZSBibG9jay4KKyAgICBhdXRvIHR5cGUgPSBHZXRTdHJ1Y3RUeXBlKHNyYywgc3JjLT5nZXRfZGVmKHR5cGVfaWQpLCBpc19hcnJheV9vZl92ZXJ0cyAmJiAhaXNfcGF0Y2gpOworICAgIGlmICh0eXBlID09IHNyYy0+ZW5kKCkgfHwgIShzcmMtPmdldF9kZWNvcmF0aW9ucyh0eXBlLndvcmQoMSkpLmZsYWdzICYgZGVjb3JhdGlvbl9zZXQ6OmJsb2NrX2JpdCkpIHsKKyAgICAgICAgLy8gVGhpcyBpc24ndCBhbiBpbnRlcmZhY2UgYmxvY2suCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBtZW1iZXJfY29tcG9uZW50czsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBtZW1iZXJfcmVsYXhlZF9wcmVjaXNpb247CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gbWVtYmVyX3BhdGNoOworCisgICAgLy8gV2FsayBhbGwgdGhlIE9wTWVtYmVyRGVjb3JhdGUgZm9yIHR5cGUncyByZXN1bHQgaWQgLS0gZmlyc3QgcGFzcywgY29sbGVjdCBjb21wb25lbnRzLgorICAgIGZvciAoYXV0byBpbnNuIDogKnNyYykgeworICAgICAgICBpZiAoaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wTWVtYmVyRGVjb3JhdGUgJiYgaW5zbi53b3JkKDEpID09IHR5cGUud29yZCgxKSkgeworICAgICAgICAgICAgdW5zaWduZWQgbWVtYmVyX2luZGV4ID0gaW5zbi53b3JkKDIpOworCisgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDMpID09IHNwdjo6RGVjb3JhdGlvbkNvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvbXBvbmVudCA9IGluc24ud29yZCg0KTsKKyAgICAgICAgICAgICAgICBtZW1iZXJfY29tcG9uZW50c1ttZW1iZXJfaW5kZXhdID0gY29tcG9uZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDMpID09IHNwdjo6RGVjb3JhdGlvblJlbGF4ZWRQcmVjaXNpb24pIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJfcmVsYXhlZF9wcmVjaXNpb25bbWVtYmVyX2luZGV4XSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbnNuLndvcmQoMykgPT0gc3B2OjpEZWNvcmF0aW9uUGF0Y2gpIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJfcGF0Y2hbbWVtYmVyX2luZGV4XSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiBjb3JyZWN0bHkgaGFuZGxlIGxvY2F0aW9uIGFzc2lnbm1lbnQgZnJvbSBvdXRzaWRlCisKKyAgICAvLyBTZWNvbmQgcGFzcyAtLSBwcm9kdWNlIHRoZSBvdXRwdXQsIGZyb20gTG9jYXRpb24gZGVjb3JhdGlvbnMKKyAgICBmb3IgKGF1dG8gaW5zbiA6ICpzcmMpIHsKKyAgICAgICAgaWYgKGluc24ub3Bjb2RlKCkgPT0gc3B2OjpPcE1lbWJlckRlY29yYXRlICYmIGluc24ud29yZCgxKSA9PSB0eXBlLndvcmQoMSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1lbWJlcl9pbmRleCA9IGluc24ud29yZCgyKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1lbWJlcl90eXBlX2lkID0gdHlwZS53b3JkKDIgKyBtZW1iZXJfaW5kZXgpOworCisgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDMpID09IHNwdjo6RGVjb3JhdGlvbkxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9jYXRpb24gPSBpbnNuLndvcmQoNCk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX2xvY2F0aW9ucyA9IEdldExvY2F0aW9uc0NvbnN1bWVkQnlUeXBlKHNyYywgbWVtYmVyX3R5cGVfaWQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbXBvbmVudF9pdCA9IG1lbWJlcl9jb21wb25lbnRzLmZpbmQobWVtYmVyX2luZGV4KTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb21wb25lbnQgPSBjb21wb25lbnRfaXQgPT0gbWVtYmVyX2NvbXBvbmVudHMuZW5kKCkgPyAwIDogY29tcG9uZW50X2l0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgYm9vbCBpc19yZWxheGVkX3ByZWNpc2lvbiA9IG1lbWJlcl9yZWxheGVkX3ByZWNpc2lvbi5maW5kKG1lbWJlcl9pbmRleCkgIT0gbWVtYmVyX3JlbGF4ZWRfcHJlY2lzaW9uLmVuZCgpOworICAgICAgICAgICAgICAgIGJvb2wgbWVtYmVyX2lzX3BhdGNoID0gaXNfcGF0Y2ggfHwgbWVtYmVyX3BhdGNoLmNvdW50KG1lbWJlcl9pbmRleCkgPiAwOworCisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbnVtX2xvY2F0aW9uczsgb2Zmc2V0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3ZhciB2ID0ge307CisgICAgICAgICAgICAgICAgICAgIHYuaWQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWVtYmVyIGluZGV4IGluIGludGVyZmFjZV92YXIgdG9vPworICAgICAgICAgICAgICAgICAgICB2LnR5cGVfaWQgPSBtZW1iZXJfdHlwZV9pZDsKKyAgICAgICAgICAgICAgICAgICAgdi5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHYuaXNfcGF0Y2ggPSBtZW1iZXJfaXNfcGF0Y2g7CisgICAgICAgICAgICAgICAgICAgIHYuaXNfYmxvY2tfbWVtYmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdi5pc19yZWxheGVkX3ByZWNpc2lvbiA9IGlzX3JlbGF4ZWRfcHJlY2lzaW9uOworICAgICAgICAgICAgICAgICAgICAoKm91dClbc3RkOjptYWtlX3BhaXIobG9jYXRpb24gKyBvZmZzZXQsIGNvbXBvbmVudCldID0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBGaW5kRW50cnlwb2ludEludGVyZmFjZXMoc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQpIHsKKyAgICBhc3NlcnQoZW50cnlwb2ludC5vcGNvZGUoKSA9PSBzcHY6Ok9wRW50cnlQb2ludCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW50ZXJmYWNlczsKKyAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIGVudHJ5cG9pbnQncyBuYW1lIHN0cmluZy4gYWRkaXRpb25hbCB6ZXJvIGJ5dGVzIGZvbGxvdyB0aGUgYWN0dWFsIG51bGwgdGVybWluYXRvciwgdG8gZmlsbCBvdXQgdGhlCisgICAgLy8gcmVzdCBvZiB0aGUgd29yZCAtIHNvIHdlIG9ubHkgbmVlZCB0byBsb29rIGF0IHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHdvcmQgdG8gZGV0ZXJtaW5lIHdoaWNoIHdvcmQgY29udGFpbnMgdGhlIHRlcm1pbmF0b3IuCisgICAgdWludDMyX3Qgd29yZCA9IDM7CisgICAgd2hpbGUgKGVudHJ5cG9pbnQud29yZCh3b3JkKSAmIDB4ZmYwMDAwMDB1KSB7CisgICAgICAgICsrd29yZDsKKyAgICB9CisgICAgKyt3b3JkOworCisgICAgZm9yICg7IHdvcmQgPCBlbnRyeXBvaW50LmxlbigpOyB3b3JkKyspIGludGVyZmFjZXMucHVzaF9iYWNrKGVudHJ5cG9pbnQud29yZCh3b3JkKSk7CisKKyAgICByZXR1cm4gaW50ZXJmYWNlczsKK30KKworc3RhdGljIHN0ZDo6bWFwPGxvY2F0aW9uX3QsIGludGVyZmFjZV92YXI+IENvbGxlY3RJbnRlcmZhY2VCeUxvY2F0aW9uKFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QgKnNyYywgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3B2OjpTdG9yYWdlQ2xhc3Mgc2ludGVyZmFjZSwgYm9vbCBpc19hcnJheV9vZl92ZXJ0cykgeworICAgIC8vIFRPRE86IGhhbmRsZSBpbmRleD0xIGR1YWwgc291cmNlIG91dHB1dHMgZnJvbSBGUyAtLSB0d28gdmFycyB3aWxsIGhhdmUgdGhlIHNhbWUgbG9jYXRpb24sIGFuZCB3ZSBET04nVCB3YW50IHRvIGNsb2JiZXIuCisKKyAgICBzdGQ6Om1hcDxsb2NhdGlvbl90LCBpbnRlcmZhY2VfdmFyPiBvdXQ7CisKKyAgICBmb3IgKHVpbnQzMl90IGlpZCA6IEZpbmRFbnRyeXBvaW50SW50ZXJmYWNlcyhlbnRyeXBvaW50KSkgeworICAgICAgICBhdXRvIGluc24gPSBzcmMtPmdldF9kZWYoaWlkKTsKKyAgICAgICAgYXNzZXJ0KGluc24gIT0gc3JjLT5lbmQoKSk7CisgICAgICAgIGFzc2VydChpbnNuLm9wY29kZSgpID09IHNwdjo6T3BWYXJpYWJsZSk7CisKKyAgICAgICAgaWYgKGluc24ud29yZCgzKSA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2ludGVyZmFjZSkpIHsKKyAgICAgICAgICAgIGF1dG8gZCA9IHNyYy0+Z2V0X2RlY29yYXRpb25zKGlpZCk7CisgICAgICAgICAgICB1bnNpZ25lZCBpZCA9IGluc24ud29yZCgyKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHR5cGUgPSBpbnNuLndvcmQoMSk7CisKKyAgICAgICAgICAgIGludCBsb2NhdGlvbiA9IGQubG9jYXRpb247CisgICAgICAgICAgICBpbnQgYnVpbHRpbiA9IGQuYnVpbHRpbjsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNvbXBvbmVudCA9IGQuY29tcG9uZW50OworICAgICAgICAgICAgYm9vbCBpc19wYXRjaCA9IChkLmZsYWdzICYgZGVjb3JhdGlvbl9zZXQ6OnBhdGNoX2JpdCkgIT0gMDsKKyAgICAgICAgICAgIGJvb2wgaXNfcmVsYXhlZF9wcmVjaXNpb24gPSAoZC5mbGFncyAmIGRlY29yYXRpb25fc2V0OjpyZWxheGVkX3ByZWNpc2lvbl9iaXQpICE9IDA7CisKKyAgICAgICAgICAgIGlmIChidWlsdGluICE9IC0xKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZWxzZSBpZiAoIUNvbGxlY3RJbnRlcmZhY2VCbG9ja01lbWJlcnMoc3JjLCAmb3V0LCBpc19hcnJheV9vZl92ZXJ0cywgaWQsIHR5cGUsIGlzX3BhdGNoLCBsb2NhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAvLyBBIHVzZXItZGVmaW5lZCBpbnRlcmZhY2UgdmFyaWFibGUsIHdpdGggYSBsb2NhdGlvbi4gV2hlcmUgYSB2YXJpYWJsZSBvY2N1cGllZCBtdWx0aXBsZSBsb2NhdGlvbnMsIGVtaXQKKyAgICAgICAgICAgICAgICAvLyBvbmUgcmVzdWx0IGZvciBlYWNoLgorICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9sb2NhdGlvbnMgPSBHZXRMb2NhdGlvbnNDb25zdW1lZEJ5VHlwZShzcmMsIHR5cGUsIGlzX2FycmF5X29mX3ZlcnRzICYmICFpc19wYXRjaCk7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbnVtX2xvY2F0aW9uczsgb2Zmc2V0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3ZhciB2ID0ge307CisgICAgICAgICAgICAgICAgICAgIHYuaWQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgdi50eXBlX2lkID0gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgdi5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHYuaXNfcGF0Y2ggPSBpc19wYXRjaDsKKyAgICAgICAgICAgICAgICAgICAgdi5pc19yZWxheGVkX3ByZWNpc2lvbiA9IGlzX3JlbGF4ZWRfcHJlY2lzaW9uOworICAgICAgICAgICAgICAgICAgICBvdXRbc3RkOjptYWtlX3BhaXIobG9jYXRpb24gKyBvZmZzZXQsIGNvbXBvbmVudCldID0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IENvbGxlY3RCdWlsdGluQmxvY2tNZW1iZXJzKFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QgKnNyYywgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0b3JhZ2VDbGFzcykgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB2YXJpYWJsZXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGJ1aWx0aW5TdHJ1Y3RNZW1iZXJzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBidWlsdGluRGVjb3JhdGlvbnM7CisKKyAgICBmb3IgKGF1dG8gaW5zbiA6ICpzcmMpIHsKKyAgICAgICAgc3dpdGNoIChpbnNuLm9wY29kZSgpKSB7CisgICAgICAgICAgICAvLyBGaW5kIGFsbCBidWlsdC1pbiBtZW1iZXIgZGVjb3JhdGlvbnMKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcE1lbWJlckRlY29yYXRlOgorICAgICAgICAgICAgICAgIGlmIChpbnNuLndvcmQoMykgPT0gc3B2OjpEZWNvcmF0aW9uQnVpbHRJbikgeworICAgICAgICAgICAgICAgICAgICBidWlsdGluU3RydWN0TWVtYmVycy5wdXNoX2JhY2soaW5zbi53b3JkKDEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBGaW5kIGFsbCBidWlsdC1pbiBkZWNvcmF0aW9ucworICAgICAgICAgICAgY2FzZSBzcHY6Ok9wRGVjb3JhdGU6CisgICAgICAgICAgICAgICAgc3dpdGNoIChpbnNuLndvcmQoMikpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkRlY29yYXRpb25CbG9jazogeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmxvY2tJRCA9IGluc24ud29yZCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBidWlsdEluQmxvY2tJRCA6IGJ1aWx0aW5TdHJ1Y3RNZW1iZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb25lIG9mIHRoZSBtZW1iZXJzIG9mIHRoZSBibG9jayBhcmUgYnVpbHQtaW4gLT4gdGhlIGJsb2NrIGlzIGJ1aWx0LWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrSUQgPT0gYnVpbHRJbkJsb2NrSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbkRlY29yYXRpb25zLnB1c2hfYmFjayhibG9ja0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkRlY29yYXRpb25CdWlsdEluOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbkRlY29yYXRpb25zLnB1c2hfYmFjayhpbnNuLndvcmQoMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmluZCBhbGwgaW50ZXJmYWNlIHZhcmlhYmxlcyBiZWxvbmdpbmcgdG8gdGhlIGVudHJ5cG9pbnQgYW5kIG1hdGNoaW5nIHRoZSBzdG9yYWdlIGNsYXNzCisgICAgZm9yICh1aW50MzJfdCBpZCA6IEZpbmRFbnRyeXBvaW50SW50ZXJmYWNlcyhlbnRyeXBvaW50KSkgeworICAgICAgICBhdXRvIGRlZiA9IHNyYy0+Z2V0X2RlZihpZCk7CisgICAgICAgIGFzc2VydChkZWYgIT0gc3JjLT5lbmQoKSk7CisgICAgICAgIGFzc2VydChkZWYub3Bjb2RlKCkgPT0gc3B2OjpPcFZhcmlhYmxlKTsKKworICAgICAgICBpZiAoZGVmLndvcmQoMykgPT0gc3RvcmFnZUNsYXNzKSB2YXJpYWJsZXMucHVzaF9iYWNrKGRlZi53b3JkKDEpKTsKKyAgICB9CisKKyAgICAvLyBGaW5kIGFsbCBtZW1iZXJzIGJlbG9uZ2luZyB0byB0aGUgYnVpbHRpbiBibG9jayBzZWxlY3RlZAorICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBidWlsdGluQmxvY2tNZW1iZXJzOworICAgIGZvciAoYXV0byAmdmFyIDogdmFyaWFibGVzKSB7CisgICAgICAgIGF1dG8gZGVmID0gc3JjLT5nZXRfZGVmKHNyYy0+Z2V0X2RlZih2YXIpLndvcmQoMykpOworCisgICAgICAgIC8vIEl0IGNvdWxkIGJlIGFuIGFycmF5IG9mIElPIGJsb2Nrcy4gVGhlIGVsZW1lbnQgdHlwZSBzaG91bGQgYmUgdGhlIHN0cnVjdCBkZWZpbmluZyB0aGUgYmxvY2sgY29udGVudHMKKyAgICAgICAgaWYgKGRlZi5vcGNvZGUoKSA9PSBzcHY6Ok9wVHlwZUFycmF5KSBkZWYgPSBzcmMtPmdldF9kZWYoZGVmLndvcmQoMikpOworCisgICAgICAgIC8vIE5vdyBmaW5kIGFsbCBtZW1iZXJzIGJlbG9uZ2luZyB0byB0aGUgc3RydWN0IGRlZmluaW5nIHRoZSBJTyBibG9jaworICAgICAgICBpZiAoZGVmLm9wY29kZSgpID09IHNwdjo6T3BUeXBlU3RydWN0KSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gYnVpbHRJbklEIDogYnVpbHRpbkRlY29yYXRpb25zKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1aWx0SW5JRCA9PSBkZWYud29yZCgxKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IChpbnQpZGVmLmxlbigpOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluQmxvY2tNZW1iZXJzLnB1c2hfYmFjayhzcHY6OkJ1aWx0SW5NYXgpOyAgLy8gU3RhcnQgd2l0aCB1bmRlZmluZWQgYnVpbHRpbiBmb3IgZWFjaCBzdHJ1Y3QgbWVtYmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHNob3VsZG4ndCBiZSBsZWZ0IGFmdGVyIHJlcGxhY2luZy4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGluc24gOiAqc3JjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wTWVtYmVyRGVjb3JhdGUgJiYgaW5zbi53b3JkKDEpID09IGJ1aWx0SW5JRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc24ud29yZCgzKSA9PSBzcHY6OkRlY29yYXRpb25CdWlsdEluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzdHJ1Y3RJbmRleCA9IGluc24ud29yZCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc3RydWN0SW5kZXggPCBidWlsdGluQmxvY2tNZW1iZXJzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbkJsb2NrTWVtYmVyc1tzdHJ1Y3RJbmRleF0gPSBpbnNuLndvcmQoNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYnVpbHRpbkJsb2NrTWVtYmVyczsKK30KKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MzJfdCwgaW50ZXJmYWNlX3Zhcj4+IENvbGxlY3RJbnRlcmZhY2VCeUlucHV0QXR0YWNobWVudEluZGV4KAorICAgIFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QgKnNyYywgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBjb25zdCAmYWNjZXNzaWJsZV9pZHMpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dWludDMyX3QsIGludGVyZmFjZV92YXI+PiBvdXQ7CisKKyAgICBmb3IgKGF1dG8gaW5zbiA6ICpzcmMpIHsKKyAgICAgICAgaWYgKGluc24ub3Bjb2RlKCkgPT0gc3B2OjpPcERlY29yYXRlKSB7CisgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDIpID09IHNwdjo6RGVjb3JhdGlvbklucHV0QXR0YWNobWVudEluZGV4KSB7CisgICAgICAgICAgICAgICAgYXV0byBhdHRhY2htZW50X2luZGV4ID0gaW5zbi53b3JkKDMpOworICAgICAgICAgICAgICAgIGF1dG8gaWQgPSBpbnNuLndvcmQoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzaWJsZV9pZHMuY291bnQoaWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gZGVmID0gc3JjLT5nZXRfZGVmKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlZiAhPSBzcmMtPmVuZCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZGVmLm9wY29kZSgpID09IHNwdjo6T3BWYXJpYWJsZSAmJiBpbnNuLndvcmQoMykgPT0gc3B2OjpTdG9yYWdlQ2xhc3NVbmlmb3JtQ29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gbnVtX2xvY2F0aW9ucyA9IEdldExvY2F0aW9uc0NvbnN1bWVkQnlUeXBlKHNyYywgZGVmLndvcmQoMSksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IG51bV9sb2NhdGlvbnM7IG9mZnNldCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3ZhciB2ID0ge307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5pZCA9IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYudHlwZV9pZCA9IGRlZi53b3JkKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5lbXBsYWNlX2JhY2soYXR0YWNobWVudF9pbmRleCArIG9mZnNldCwgdik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgYm9vbCBJc1dyaXRhYmxlRGVzY3JpcHRvclR5cGUoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqbW9kdWxlLCB1aW50MzJfdCB0eXBlX2lkLCBib29sIGlzX3N0b3JhZ2VfYnVmZmVyKSB7CisgICAgYXV0byB0eXBlID0gbW9kdWxlLT5nZXRfZGVmKHR5cGVfaWQpOworCisgICAgLy8gU3RyaXAgb2ZmIGFueSBhcnJheSBvciBwdHJzLiBXaGVyZSB3ZSByZW1vdmUgYXJyYXkgbGV2ZWxzLCBhZGp1c3QgdGhlICBkZXNjcmlwdG9yIGNvdW50IGZvciBlYWNoIGRpbWVuc2lvbi4KKyAgICB3aGlsZSAodHlwZS5vcGNvZGUoKSA9PSBzcHY6Ok9wVHlwZUFycmF5IHx8IHR5cGUub3Bjb2RlKCkgPT0gc3B2OjpPcFR5cGVQb2ludGVyIHx8IHR5cGUub3Bjb2RlKCkgPT0gc3B2OjpPcFR5cGVSdW50aW1lQXJyYXkpIHsKKyAgICAgICAgaWYgKHR5cGUub3Bjb2RlKCkgPT0gc3B2OjpPcFR5cGVBcnJheSB8fCB0eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlUnVudGltZUFycmF5KSB7CisgICAgICAgICAgICB0eXBlID0gbW9kdWxlLT5nZXRfZGVmKHR5cGUud29yZCgyKSk7ICAvLyBFbGVtZW50IHR5cGUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHR5cGUgPSBtb2R1bGUtPmdldF9kZWYodHlwZS53b3JkKDMpKTsgIC8vIFBvaW50ZWUgdHlwZQorICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlLm9wY29kZSgpKSB7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVJbWFnZTogeworICAgICAgICAgICAgYXV0byBkaW0gPSB0eXBlLndvcmQoMyk7CisgICAgICAgICAgICBhdXRvIHNhbXBsZWQgPSB0eXBlLndvcmQoNyk7CisgICAgICAgICAgICByZXR1cm4gc2FtcGxlZCA9PSAyICYmIGRpbSAhPSBzcHY6OkRpbVN1YnBhc3NEYXRhOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVN0cnVjdDogeworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVuc2lnbmVkPiBub253cml0YWJsZV9tZW1iZXJzOworICAgICAgICAgICAgaWYgKG1vZHVsZS0+Z2V0X2RlY29yYXRpb25zKHR5cGUud29yZCgxKSkuZmxhZ3MgJiBkZWNvcmF0aW9uX3NldDo6YnVmZmVyX2Jsb2NrX2JpdCkgaXNfc3RvcmFnZV9idWZmZXIgPSB0cnVlOworICAgICAgICAgICAgZm9yIChhdXRvIGluc24gOiAqbW9kdWxlKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc24ub3Bjb2RlKCkgPT0gc3B2OjpPcE1lbWJlckRlY29yYXRlICYmIGluc24ud29yZCgxKSA9PSB0eXBlLndvcmQoMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5zbi53b3JkKDMpID09IHNwdjo6RGVjb3JhdGlvbk5vbldyaXRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIG5vbndyaXRhYmxlX21lbWJlcnMuaW5zZXJ0KGluc24ud29yZCgyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBIGJ1ZmZlciBpcyB3cml0YWJsZSBpZiBpdCdzIGVpdGhlciBmbGF2b3Igb2Ygc3RvcmFnZSBidWZmZXIsIGFuZCBoYXMgYW55IG1lbWJlciBub3QgZGVjb3JhdGVkCisgICAgICAgICAgICAvLyBhcyBub253cml0YWJsZS4KKyAgICAgICAgICAgIHJldHVybiBpc19zdG9yYWdlX2J1ZmZlciAmJiBub253cml0YWJsZV9tZW1iZXJzLnNpemUoKSAhPSB0eXBlLmxlbigpIC0gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGRlc2NyaXB0b3Jfc2xvdF90LCBpbnRlcmZhY2VfdmFyPj4gQ29sbGVjdEludGVyZmFjZUJ5RGVzY3JpcHRvclNsb3QoCisgICAgZGVidWdfcmVwb3J0X2RhdGEgY29uc3QgKnJlcG9ydF9kYXRhLCBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gY29uc3QgJmFjY2Vzc2libGVfaWRzLAorICAgIGJvb2wgKmhhc193cml0YWJsZV9kZXNjcmlwdG9yKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGRlc2NyaXB0b3Jfc2xvdF90LCBpbnRlcmZhY2VfdmFyPj4gb3V0OworCisgICAgZm9yIChhdXRvIGlkIDogYWNjZXNzaWJsZV9pZHMpIHsKKyAgICAgICAgYXV0byBpbnNuID0gc3JjLT5nZXRfZGVmKGlkKTsKKyAgICAgICAgYXNzZXJ0KGluc24gIT0gc3JjLT5lbmQoKSk7CisKKyAgICAgICAgaWYgKGluc24ub3Bjb2RlKCkgPT0gc3B2OjpPcFZhcmlhYmxlICYmCisgICAgICAgICAgICAoaW5zbi53b3JkKDMpID09IHNwdjo6U3RvcmFnZUNsYXNzVW5pZm9ybSB8fCBpbnNuLndvcmQoMykgPT0gc3B2OjpTdG9yYWdlQ2xhc3NVbmlmb3JtQ29uc3RhbnQgfHwKKyAgICAgICAgICAgICBpbnNuLndvcmQoMykgPT0gc3B2OjpTdG9yYWdlQ2xhc3NTdG9yYWdlQnVmZmVyKSkgeworICAgICAgICAgICAgYXV0byBkID0gc3JjLT5nZXRfZGVjb3JhdGlvbnMoaW5zbi53b3JkKDIpKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNldCA9IGQuZGVzY3JpcHRvcl9zZXQ7CisgICAgICAgICAgICB1bnNpZ25lZCBiaW5kaW5nID0gZC5iaW5kaW5nOworCisgICAgICAgICAgICBpbnRlcmZhY2VfdmFyIHYgPSB7fTsKKyAgICAgICAgICAgIHYuaWQgPSBpbnNuLndvcmQoMik7CisgICAgICAgICAgICB2LnR5cGVfaWQgPSBpbnNuLndvcmQoMSk7CisgICAgICAgICAgICBvdXQuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9wYWlyKHNldCwgYmluZGluZyksIHYpOworCisgICAgICAgICAgICBpZiAoIShkLmZsYWdzICYgZGVjb3JhdGlvbl9zZXQ6Om5vbndyaXRhYmxlX2JpdCkgJiYKKyAgICAgICAgICAgICAgICBJc1dyaXRhYmxlRGVzY3JpcHRvclR5cGUoc3JjLCBpbnNuLndvcmQoMSksIGluc24ud29yZCgzKSA9PSBzcHY6OlN0b3JhZ2VDbGFzc1N0b3JhZ2VCdWZmZXIpKSB7CisgICAgICAgICAgICAgICAgKmhhc193cml0YWJsZV9kZXNjcmlwdG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBib29sIFZhbGlkYXRlVmlDb25zaXN0ZW5jeShkZWJ1Z19yZXBvcnRfZGF0YSBjb25zdCAqcmVwb3J0X2RhdGEsIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqdmkpIHsKKyAgICAvLyBXYWxrIHRoZSBiaW5kaW5nIGRlc2NyaXB0aW9ucywgd2hpY2ggZGVzY3JpYmUgdGhlIHN0ZXAgcmF0ZSBhbmQgc3RyaWRlIG9mIGVhY2ggdmVydGV4IGJ1ZmZlci4gIEVhY2ggYmluZGluZyBzaG91bGQKKyAgICAvLyBiZSBzcGVjaWZpZWQgb25seSBvbmNlLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBjb25zdCAqPiBiaW5kaW5nczsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2aS0+dmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQ7IGkrKykgeworICAgICAgICBhdXRvIGRlc2MgPSAmdmktPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zW2ldOworICAgICAgICBhdXRvICZiaW5kaW5nID0gYmluZGluZ3NbZGVzYy0+YmluZGluZ107CisgICAgICAgIGlmIChiaW5kaW5nKSB7CisgICAgICAgICAgICAvLyBUT0RPOiAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDA3NDIiIHBlcmhhcHM/CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9TaGFkZXJfSW5jb25zaXN0ZW50VmksICJEdXBsaWNhdGUgdmVydGV4IGlucHV0IGJpbmRpbmcgZGVzY3JpcHRpb25zIGZvciBiaW5kaW5nICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5iaW5kaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpbmRpbmcgPSBkZXNjOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3N0YXRpYyBib29sIFZhbGlkYXRlVmlBZ2FpbnN0VnNJbnB1dHMoZGVidWdfcmVwb3J0X2RhdGEgY29uc3QgKnJlcG9ydF9kYXRhLCBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKnZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICp2cywgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQpIHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNvbnN0IGF1dG8gaW5wdXRzID0gQ29sbGVjdEludGVyZmFjZUJ5TG9jYXRpb24odnMsIGVudHJ5cG9pbnQsIHNwdjo6U3RvcmFnZUNsYXNzSW5wdXQsIGZhbHNlKTsKKworICAgIC8vIEJ1aWxkIGluZGV4IGJ5IGxvY2F0aW9uCisgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiAqPiBhdHRyaWJzOworICAgIGlmICh2aSkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdmktPnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQ7ICsraSkgeworICAgICAgICAgICAgY29uc3QgYXV0byBudW1fbG9jYXRpb25zID0gR2V0TG9jYXRpb25zQ29uc3VtZWRCeUZvcm1hdCh2aS0+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uc1tpXS5mb3JtYXQpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG51bV9sb2NhdGlvbnM7ICsraikgeworICAgICAgICAgICAgICAgIGF0dHJpYnNbdmktPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnNbaV0ubG9jYXRpb24gKyBqXSA9ICZ2aS0+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cnVjdCBBdHRyaWJJbnB1dFBhaXIgeworICAgICAgICBjb25zdCBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gKmF0dHJpYiA9IG51bGxwdHI7CisgICAgICAgIGNvbnN0IGludGVyZmFjZV92YXIgKmlucHV0ID0gbnVsbHB0cjsKKyAgICB9OworICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBBdHRyaWJJbnB1dFBhaXI+IGxvY2F0aW9uX21hcDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYl9pdCA6IGF0dHJpYnMpIGxvY2F0aW9uX21hcFthdHRyaWJfaXQuZmlyc3RdLmF0dHJpYiA9IGF0dHJpYl9pdC5zZWNvbmQ7CisgICAgZm9yIChjb25zdCBhdXRvICZpbnB1dF9pdCA6IGlucHV0cykgbG9jYXRpb25fbWFwW2lucHV0X2l0LmZpcnN0LmZpcnN0XS5pbnB1dCA9ICZpbnB1dF9pdC5zZWNvbmQ7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gbG9jYXRpb25faXQgOiBsb2NhdGlvbl9tYXApIHsKKyAgICAgICAgY29uc3QgYXV0byBsb2NhdGlvbiA9IGxvY2F0aW9uX2l0LmZpcnN0OworICAgICAgICBjb25zdCBhdXRvIGF0dHJpYiA9IGxvY2F0aW9uX2l0LnNlY29uZC5hdHRyaWI7CisgICAgICAgIGNvbnN0IGF1dG8gaW5wdXQgPSBsb2NhdGlvbl9pdC5zZWNvbmQuaW5wdXQ7CisKKyAgICAgICAgaWYgKGF0dHJpYiAmJiAhaW5wdXQpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHZzLT52a19zaGFkZXJfbW9kdWxlKSwga1ZVSURfQ29yZV9TaGFkZXJfT3V0cHV0Tm90Q29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnRleCBhdHRyaWJ1dGUgYXQgbG9jYXRpb24gJSIgUFJJdTMyICIgbm90IGNvbnN1bWVkIGJ5IHZlcnRleCBzaGFkZXIiLCBsb2NhdGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAoIWF0dHJpYiAmJiBpbnB1dCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHZzLT52a19zaGFkZXJfbW9kdWxlKSwga1ZVSURfQ29yZV9TaGFkZXJfSW5wdXROb3RQcm9kdWNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVydGV4IHNoYWRlciBjb25zdW1lcyBpbnB1dCBhdCBsb2NhdGlvbiAlIiBQUkl1MzIgIiBidXQgbm90IHByb3ZpZGVkIiwgbG9jYXRpb24pOworICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYiAmJiBpbnB1dCkgeworICAgICAgICAgICAgY29uc3QgYXV0byBhdHRyaWJfdHlwZSA9IEdldEZvcm1hdFR5cGUoYXR0cmliLT5mb3JtYXQpOworICAgICAgICAgICAgY29uc3QgYXV0byBpbnB1dF90eXBlID0gR2V0RnVuZGFtZW50YWxUeXBlKHZzLCBpbnB1dC0+dHlwZV9pZCk7CisKKyAgICAgICAgICAgIC8vIFR5cGUgY2hlY2tpbmcKKyAgICAgICAgICAgIGlmICghKGF0dHJpYl90eXBlICYgaW5wdXRfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHZzLT52a19zaGFkZXJfbW9kdWxlKSwga1ZVSURfQ29yZV9TaGFkZXJfSW50ZXJmYWNlVHlwZU1pc21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIHR5cGUgb2YgYCVzYCBhdCBsb2NhdGlvbiAlIiBQUkl1MzIgIiBkb2VzIG5vdCBtYXRjaCB2ZXJ0ZXggc2hhZGVyIGlucHV0IHR5cGUgb2YgYCVzYCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0Zvcm1hdChhdHRyaWItPmZvcm1hdCksIGxvY2F0aW9uLCBEZXNjcmliZVR5cGUodnMsIGlucHV0LT50eXBlX2lkKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAvLyAhYXR0cmliICYmICFpbnB1dAorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsgIC8vIGF0IGxlYXN0IG9uZSBleGlzdHMgaW4gdGhlIG1hcAorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK3N0YXRpYyBib29sIFZhbGlkYXRlRnNPdXRwdXRzQWdhaW5zdFJlbmRlclBhc3MoZGVidWdfcmVwb3J0X2RhdGEgY29uc3QgKnJlcG9ydF9kYXRhLCBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQsIFBJUEVMSU5FX1NUQVRFIGNvbnN0ICpwaXBlbGluZSwgdWludDMyX3Qgc3VicGFzc19pbmRleCkgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgY29uc3QgYXV0byBycGNpID0gcGlwZWxpbmUtPnJwX3N0YXRlLT5jcmVhdGVJbmZvLnB0cigpOworCisgICAgc3RydWN0IEF0dGFjaG1lbnQgeworICAgICAgICBjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSICpyZWZlcmVuY2UgPSBudWxscHRyOworICAgICAgICBjb25zdCBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFIgKmF0dGFjaG1lbnQgPSBudWxscHRyOworICAgICAgICBjb25zdCBpbnRlcmZhY2VfdmFyICpvdXRwdXQgPSBudWxscHRyOworICAgIH07CisgICAgc3RkOjptYXA8dWludDMyX3QsIEF0dGFjaG1lbnQ+IGxvY2F0aW9uX21hcDsKKworICAgIGNvbnN0IGF1dG8gc3VicGFzcyA9IHJwY2ktPnBTdWJwYXNzZXNbc3VicGFzc19pbmRleF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQ7ICsraSkgeworICAgICAgICBhdXRvIGNvbnN0ICZyZWZlcmVuY2UgPSBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzW2ldOworICAgICAgICBsb2NhdGlvbl9tYXBbaV0ucmVmZXJlbmNlID0gJnJlZmVyZW5jZTsKKyAgICAgICAgaWYgKHJlZmVyZW5jZS5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEICYmCisgICAgICAgICAgICBycGNpLT5wQXR0YWNobWVudHNbcmVmZXJlbmNlLmF0dGFjaG1lbnRdLmZvcm1hdCAhPSBWS19GT1JNQVRfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBsb2NhdGlvbl9tYXBbaV0uYXR0YWNobWVudCA9ICZycGNpLT5wQXR0YWNobWVudHNbcmVmZXJlbmNlLmF0dGFjaG1lbnRdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogZHVhbCBzb3VyY2UgYmxlbmQgaW5kZXggKHNwdjo6RGVjSW5kZXgsIHplcm8gaWYgbm90IHByb3ZpZGVkKQorCisgICAgY29uc3QgYXV0byBvdXRwdXRzID0gQ29sbGVjdEludGVyZmFjZUJ5TG9jYXRpb24oZnMsIGVudHJ5cG9pbnQsIHNwdjo6U3RvcmFnZUNsYXNzT3V0cHV0LCBmYWxzZSk7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRwdXRfaXQgOiBvdXRwdXRzKSB7CisgICAgICAgIGF1dG8gY29uc3QgbG9jYXRpb24gPSBvdXRwdXRfaXQuZmlyc3QuZmlyc3Q7CisgICAgICAgIGxvY2F0aW9uX21hcFtsb2NhdGlvbl0ub3V0cHV0ID0gJm91dHB1dF9pdC5zZWNvbmQ7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBhbHBoYVRvQ292ZXJhZ2VFbmFibGVkID0gcGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wTXVsdGlzYW1wbGVTdGF0ZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wTXVsdGlzYW1wbGVTdGF0ZS0+YWxwaGFUb0NvdmVyYWdlRW5hYmxlID09IFZLX1RSVUU7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gbG9jYXRpb25faXQgOiBsb2NhdGlvbl9tYXApIHsKKyAgICAgICAgY29uc3QgYXV0byByZWZlcmVuY2UgPSBsb2NhdGlvbl9pdC5zZWNvbmQucmVmZXJlbmNlOworICAgICAgICBpZiAocmVmZXJlbmNlICE9IG51bGxwdHIgJiYgcmVmZXJlbmNlLT5hdHRhY2htZW50ID09IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8gbG9jYXRpb24gPSBsb2NhdGlvbl9pdC5maXJzdDsKKyAgICAgICAgY29uc3QgYXV0byBhdHRhY2htZW50ID0gbG9jYXRpb25faXQuc2Vjb25kLmF0dGFjaG1lbnQ7CisgICAgICAgIGNvbnN0IGF1dG8gb3V0cHV0ID0gbG9jYXRpb25faXQuc2Vjb25kLm91dHB1dDsKKyAgICAgICAgaWYgKGF0dGFjaG1lbnQgJiYgIW91dHB1dCkgeworICAgICAgICAgICAgaWYgKHBpcGVsaW5lLT5hdHRhY2htZW50c1tsb2NhdGlvbl0uY29sb3JXcml0ZU1hc2sgIT0gMCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGZzLT52a19zaGFkZXJfbW9kdWxlKSwga1ZVSURfQ29yZV9TaGFkZXJfSW5wdXROb3RQcm9kdWNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0YWNobWVudCAlIiBQUkl1MzIgIiBub3Qgd3JpdHRlbiBieSBmcmFnbWVudCBzaGFkZXI7IHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCBiZSB3cml0dGVuIHRvIGF0dGFjaG1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghYXR0YWNobWVudCAmJiBvdXRwdXQpIHsKKyAgICAgICAgICAgIGlmICghKGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQgJiYgbG9jYXRpb24gPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZnMtPnZrX3NoYWRlcl9tb2R1bGUpLCBrVlVJRF9Db3JlX1NoYWRlcl9PdXRwdXROb3RDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYWdtZW50IHNoYWRlciB3cml0ZXMgdG8gb3V0cHV0IGxvY2F0aW9uICUiIFBSSXUzMiAiIHdpdGggbm8gbWF0Y2hpbmcgYXR0YWNobWVudCIsIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50ICYmIG91dHB1dCkgeworICAgICAgICAgICAgY29uc3QgYXV0byBhdHRhY2htZW50X3R5cGUgPSBHZXRGb3JtYXRUeXBlKGF0dGFjaG1lbnQtPmZvcm1hdCk7CisgICAgICAgICAgICBjb25zdCBhdXRvIG91dHB1dF90eXBlID0gR2V0RnVuZGFtZW50YWxUeXBlKGZzLCBvdXRwdXQtPnR5cGVfaWQpOworCisgICAgICAgICAgICAvLyBUeXBlIGNoZWNraW5nCisgICAgICAgICAgICBpZiAoIShvdXRwdXRfdHlwZSAmIGF0dGFjaG1lbnRfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoZnMtPnZrX3NoYWRlcl9tb2R1bGUpLCBrVlVJRF9Db3JlX1NoYWRlcl9JbnRlcmZhY2VUeXBlTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRhY2htZW50ICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mIHR5cGUgYCVzYCBkb2VzIG5vdCBtYXRjaCBmcmFnbWVudCBzaGFkZXIgb3V0cHV0IHR5cGUgb2YgYCVzYDsgcmVzdWx0aW5nIHZhbHVlcyBhcmUgdW5kZWZpbmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIHN0cmluZ19Wa0Zvcm1hdChhdHRhY2htZW50LT5mb3JtYXQpLCBEZXNjcmliZVR5cGUoZnMsIG91dHB1dC0+dHlwZV9pZCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgLy8gIWF0dGFjaG1lbnQgJiYgIW91dHB1dAorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsgIC8vIGF0IGxlYXN0IG9uZSBleGlzdHMgaW4gdGhlIG1hcAorICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgYXV0byBvdXRwdXRfemVybyA9IGxvY2F0aW9uX21hcC5jb3VudCgwKSA/IGxvY2F0aW9uX21hcFswXS5vdXRwdXQgOiBudWxscHRyOworICAgIGJvb2wgbG9jYXRpb25aZXJvSGFzQWxwaGEgPSBvdXRwdXRfemVybyAmJiBmcy0+Z2V0X2RlZihvdXRwdXRfemVyby0+dHlwZV9pZCkgIT0gZnMtPmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbXBvbmVudHNDb25zdW1lZEJ5VHlwZShmcywgb3V0cHV0X3plcm8tPnR5cGVfaWQsIGZhbHNlKSA9PSA0OworICAgIGlmIChhbHBoYVRvQ292ZXJhZ2VFbmFibGVkICYmICFsb2NhdGlvblplcm9IYXNBbHBoYSkgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChmcy0+dmtfc2hhZGVyX21vZHVsZSksIGtWVUlEX0NvcmVfU2hhZGVyX05vQWxwaGFBdExvY2F0aW9uMFdpdGhBbHBoYVRvQ292ZXJhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiZnJhZ21lbnQgc2hhZGVyIGRvZXNuJ3QgZGVjbGFyZSBhbHBoYSBvdXRwdXQgYXQgbG9jYXRpb24gMCBldmVuIHRob3VnaCBhbHBoYSB0byBjb3ZlcmFnZSBpcyBlbmFibGVkLiIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCisvLyBGb3IgUG9pbnRTaXplIGFuYWx5c2lzIHdlIG5lZWQgdG8ga25vdyBpZiB0aGUgdmFyaWFibGUgZGVjb3JhdGVkIHdpdGggdGhlIFBvaW50U2l6ZSBidWlsdC1pbiB3YXMgYWN0dWFsbHkgd3JpdHRlbiB0by4KKy8vIFRoaXMgZnVuY3Rpb24gZXhhbWluZXMgaW5zdHJ1Y3Rpb25zIGluIHRoZSBzdGF0aWMgY2FsbCB0cmVlIGZvciBhIHdyaXRlIHRvIHRoaXMgdmFyaWFibGUuCitzdGF0aWMgYm9vbCBJc1BvaW50U2l6ZVdyaXR0ZW4oU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCBzcGlydl9pbnN0X2l0ZXIgYnVpbHRpbl9pbnN0ciwgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQpIHsKKyAgICBhdXRvIHR5cGUgPSBidWlsdGluX2luc3RyLm9wY29kZSgpOworICAgIHVpbnQzMl90IHRhcmdldF9pZCA9IGJ1aWx0aW5faW5zdHIud29yZCgxKTsKKyAgICBib29sIGluaXRfY29tcGxldGUgPSBmYWxzZTsKKworICAgIGlmICh0eXBlID09IHNwdjo6T3BNZW1iZXJEZWNvcmF0ZSkgeworICAgICAgICAvLyBCdWlsdC1pbiBpcyBwYXJ0IG9mIGEgc3RydWN0dXJlIC0tIGV4YW1pbmUgaW5zdHJ1Y3Rpb25zIHVwIHRvIGZpcnN0IGZ1bmN0aW9uIGJvZHkgdG8gZ2V0IGluaXRpYWwgSURzCisgICAgICAgIGF1dG8gaW5zbiA9IGVudHJ5cG9pbnQ7CisgICAgICAgIHdoaWxlICghaW5pdF9jb21wbGV0ZSAmJiAoaW5zbi5vcGNvZGUoKSAhPSBzcHY6Ok9wRnVuY3Rpb24pKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGluc24ub3Bjb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlUG9pbnRlcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnNuLndvcmQoMykgPT0gdGFyZ2V0X2lkKSAmJiAoaW5zbi53b3JkKDIpID09IHNwdjo6U3RvcmFnZUNsYXNzT3V0cHV0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2lkID0gaW5zbi53b3JkKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFZhcmlhYmxlOgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDEpID09IHRhcmdldF9pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2lkID0gaW5zbi53b3JkKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9jb21wbGV0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNuKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWluaXRfY29tcGxldGUgJiYgKHR5cGUgPT0gc3B2OjpPcE1lbWJlckRlY29yYXRlKSkgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBmb3VuZF93cml0ZSA9IGZhbHNlOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gd29ya2xpc3Q7CisgICAgd29ya2xpc3QuaW5zZXJ0KGVudHJ5cG9pbnQud29yZCgyKSk7CisKKyAgICAvLyBGb2xsb3cgaW5zdHJ1Y3Rpb25zIGluIGNhbGwgZ3JhcGggbG9va2luZyBmb3Igd3JpdGVzIHRvIHRhcmdldAorICAgIHdoaWxlICghd29ya2xpc3QuZW1wdHkoKSAmJiAhZm91bmRfd3JpdGUpIHsKKyAgICAgICAgYXV0byBpZF9pdGVyID0gd29ya2xpc3QuYmVnaW4oKTsKKyAgICAgICAgYXV0byBpZCA9ICppZF9pdGVyOworICAgICAgICB3b3JrbGlzdC5lcmFzZShpZF9pdGVyKTsKKworICAgICAgICBhdXRvIGluc24gPSBzcmMtPmdldF9kZWYoaWQpOworICAgICAgICBpZiAoaW5zbiA9PSBzcmMtPmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnNuLm9wY29kZSgpID09IHNwdjo6T3BGdW5jdGlvbikgeworICAgICAgICAgICAgLy8gU2NhbiBib2R5IG9mIGZ1bmN0aW9uIGxvb2tpbmcgZm9yIG90aGVyIGZ1bmN0aW9uIGNhbGxzIG9yIGl0ZW1zIGluIG91ciBJRCBjaGFpbgorICAgICAgICAgICAgd2hpbGUgKCsraW5zbiwgaW5zbi5vcGNvZGUoKSAhPSBzcHY6Ok9wRnVuY3Rpb25FbmQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc24ub3Bjb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQWNjZXNzQ2hhaW46CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDMpID09IHRhcmdldF9pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IHNwdjo6T3BNZW1iZXJEZWNvcmF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHZhbHVlID0gR2V0Q29uc3RhbnRWYWx1ZShzcmMsIGluc24ud29yZCg0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBidWlsdGluX2luc3RyLndvcmQoMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pZCA9IGluc24ud29yZCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pZCA9IGluc24ud29yZCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wU3RvcmU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDEpID09IHRhcmdldF9pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX3dyaXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BGdW5jdGlvbkNhbGw6CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrbGlzdC5pbnNlcnQoaW5zbi53b3JkKDMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZm91bmRfd3JpdGU7Cit9CisKKy8vIEZvciBzb21lIGFuYWx5c2VzLCB3ZSBuZWVkIHRvIGtub3cgYWJvdXQgYWxsIGlkcyByZWZlcmVuY2VkIGJ5IHRoZSBzdGF0aWMgY2FsbCB0cmVlIG9mIGEgcGFydGljdWxhciBlbnRyeXBvaW50LiBUaGlzIGlzCisvLyBpbXBvcnRhbnQgZm9yIGlkZW50aWZ5aW5nIHRoZSBzZXQgb2Ygc2hhZGVyIHJlc291cmNlcyBhY3R1YWxseSB1c2VkIGJ5IGFuIGVudHJ5cG9pbnQsIGZvciBleGFtcGxlLgorLy8gTm90ZTogd2Ugb25seSBleHBsb3JlIHBhcnRzIG9mIHRoZSBpbWFnZSB3aGljaCBtaWdodCBhY3R1YWxseSBjb250YWluIGlkcyB3ZSBjYXJlIGFib3V0IGZvciB0aGUgYWJvdmUgYW5hbHlzZXMuCisvLyAgLSBOT1QgdGhlIHNoYWRlciBpbnB1dC9vdXRwdXQgaW50ZXJmYWNlcy4KKy8vCisvLyBUT0RPOiBUaGUgc2V0IG9mIGludGVyZXN0aW5nIG9wY29kZXMgaGVyZSB3YXMgZGV0ZXJtaW5lZCBieSBleWViYWxsaW5nIHRoZSBTUElSViBzcGVjLiBJdCBtaWdodCBiZSB3b3J0aAorLy8gY29udmVydGluZyBwYXJ0cyBvZiB0aGlzIHRvIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBtYWNoaW5lLXJlYWRhYmxlIHNwZWMgaW5zdGVhZC4KK3N0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gTWFya0FjY2Vzc2libGVJZHMoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCBzcGlydl9pbnN0X2l0ZXIgZW50cnlwb2ludCkgeworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gaWRzOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gd29ya2xpc3Q7CisgICAgd29ya2xpc3QuaW5zZXJ0KGVudHJ5cG9pbnQud29yZCgyKSk7CisKKyAgICB3aGlsZSAoIXdvcmtsaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpZF9pdGVyID0gd29ya2xpc3QuYmVnaW4oKTsKKyAgICAgICAgYXV0byBpZCA9ICppZF9pdGVyOworICAgICAgICB3b3JrbGlzdC5lcmFzZShpZF9pdGVyKTsKKworICAgICAgICBhdXRvIGluc24gPSBzcmMtPmdldF9kZWYoaWQpOworICAgICAgICBpZiAoaW5zbiA9PSBzcmMtPmVuZCgpKSB7CisgICAgICAgICAgICAvLyBJRCBpcyBzb21ldGhpbmcgd2UgZGlkbid0IGNvbGxlY3QgaW4gQnVpbGREZWZJbmRleC4gdGhhdCdzIE9LIC0tIHdlJ2xsIHN0dW1ibGUgYWNyb3NzIGFsbCBraW5kcyBvZiB0aGluZ3MgaGVyZQorICAgICAgICAgICAgLy8gdGhhdCB3ZSBtYXkgbm90IGNhcmUgYWJvdXQuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSB0byBhZGQgdG8gdGhlIG91dHB1dCBzZXQKKyAgICAgICAgaWYgKCFpZHMuaW5zZXJ0KGlkKS5zZWNvbmQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgLy8gSWYgd2UgYWxyZWFkeSBzYXcgdGhpcyBpZCwgd2UgZG9uJ3Qgd2FudCB0byB3YWxrIGl0IGFnYWluLgorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChpbnNuLm9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BGdW5jdGlvbjoKKyAgICAgICAgICAgICAgICAvLyBTY2FuIHdob2xlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLCBlbmxpc3RpbmcgYW55dGhpbmcgaW50ZXJlc3RpbmcKKyAgICAgICAgICAgICAgICB3aGlsZSAoKytpbnNuLCBpbnNuLm9wY29kZSgpICE9IHNwdjo6T3BGdW5jdGlvbkVuZCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc24ub3Bjb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcExvYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BBdG9taWNMb2FkOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQXRvbWljRXhjaGFuZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BBdG9taWNDb21wYXJlRXhjaGFuZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BBdG9taWNDb21wYXJlRXhjaGFuZ2VXZWFrOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQXRvbWljSUluY3JlbWVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEF0b21pY0lEZWNyZW1lbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BBdG9taWNJQWRkOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQXRvbWljSVN1YjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEF0b21pY1NNaW46CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BBdG9taWNVTWluOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQXRvbWljU01heDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEF0b21pY1VNYXg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BBdG9taWNBbmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BBdG9taWNPcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEF0b21pY1hvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrbGlzdC5pbnNlcnQoaW5zbi53b3JkKDMpKTsgIC8vIHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wU3RvcmU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BBdG9taWNTdG9yZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrbGlzdC5pbnNlcnQoaW5zbi53b3JkKDEpKTsgIC8vIHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQWNjZXNzQ2hhaW46CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbkJvdW5kc0FjY2Vzc0NoYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0Lmluc2VydChpbnNuLndvcmQoMykpOyAgLy8gYmFzZSBwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFNhbXBsZWRJbWFnZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlSW1wbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZUV4cGxpY2l0TG9kOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTYW1wbGVEcmVmSW1wbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZURyZWZFeHBsaWNpdExvZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlUHJvakltcGxpY2l0TG9kOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTYW1wbGVQcm9qRXhwbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZVByb2pEcmVmSW1wbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZVByb2pEcmVmRXhwbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZUZldGNoOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VHYXRoZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZURyZWZHYXRoZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVJlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlUXVlcnlGb3JtYXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVF1ZXJ5T3JkZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVF1ZXJ5U2l6ZUxvZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlUXVlcnlTaXplOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VRdWVyeUxvZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlUXVlcnlMZXZlbHM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVF1ZXJ5U2FtcGxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlU3BhcnNlU2FtcGxlSW1wbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNwYXJzZVNhbXBsZUV4cGxpY2l0TG9kOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTcGFyc2VTYW1wbGVEcmVmSW1wbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNwYXJzZVNhbXBsZURyZWZFeHBsaWNpdExvZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlU3BhcnNlU2FtcGxlUHJvakltcGxpY2l0TG9kOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTcGFyc2VTYW1wbGVQcm9qRXhwbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNwYXJzZVNhbXBsZVByb2pEcmVmSW1wbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNwYXJzZVNhbXBsZVByb2pEcmVmRXhwbGljaXRMb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNwYXJzZUZldGNoOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTcGFyc2VHYXRoZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNwYXJzZURyZWZHYXRoZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVRleGVsUG9pbnRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrbGlzdC5pbnNlcnQoaW5zbi53b3JkKDMpKTsgIC8vIEltYWdlIG9yIHNhbXBsZWQgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlV3JpdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QuaW5zZXJ0KGluc24ud29yZCgxKSk7ICAvLyBJbWFnZSAtLSBkaWZmZXJlbnQgb3BlcmFuZCBvcmRlciB0byBhYm92ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wRnVuY3Rpb25DYWxsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDM7IGkgPCBpbnNuLmxlbigpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QuaW5zZXJ0KGluc24ud29yZChpKSk7ICAvLyBmbiBpdHNlbGYsIGFuZCBhbGwgYXJncworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wRXh0SW5zdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSA1OyBpIDwgaW5zbi5sZW4oKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0Lmluc2VydChpbnNuLndvcmQoaSkpOyAgLy8gT3BlcmFuZHMgdG8gZXh0IGluc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaWRzOworfQorCitzdGF0aWMgYm9vbCBWYWxpZGF0ZVB1c2hDb25zdGFudEJsb2NrQWdhaW5zdFBpcGVsaW5lKGRlYnVnX3JlcG9ydF9kYXRhIGNvbnN0ICpyZXBvcnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmtQdXNoQ29uc3RhbnRSYW5nZT4gY29uc3QgKnB1c2hfY29uc3RhbnRfcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIHNwaXJ2X2luc3RfaXRlciB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UpIHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFN0cmlwIG9mZiBwdHJzIGV0YworICAgIHR5cGUgPSBHZXRTdHJ1Y3RUeXBlKHNyYywgdHlwZSwgZmFsc2UpOworICAgIGFzc2VydCh0eXBlICE9IHNyYy0+ZW5kKCkpOworCisgICAgLy8gVmFsaWRhdGUgZGlyZWN0bHkgb2ZmIHRoZSBvZmZzZXRzLiB0aGlzIGlzbid0IHF1aXRlIGNvcnJlY3QgZm9yIGFycmF5cyBhbmQgbWF0cmljZXMsIGJ1dCBpcyBhIGdvb2QgZmlyc3Qgc3RlcC4KKyAgICAvLyBUT0RPOiBhcnJheXMsIG1hdHJpY2VzLCB3ZWlyZCBzaXplcworICAgIGZvciAoYXV0byBpbnNuIDogKnNyYykgeworICAgICAgICBpZiAoaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wTWVtYmVyRGVjb3JhdGUgJiYgaW5zbi53b3JkKDEpID09IHR5cGUud29yZCgxKSkgeworICAgICAgICAgICAgaWYgKGluc24ud29yZCgzKSA9PSBzcHY6OkRlY29yYXRpb25PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSBpbnNuLndvcmQoNCk7CisgICAgICAgICAgICAgICAgYXV0byBzaXplID0gNDsgIC8vIEJ5dGVzOyBUT0RPOiBjYWxjdWxhdGUgdGhpcyBiYXNlZCBvbiB0aGUgdHlwZQorCisgICAgICAgICAgICAgICAgYm9vbCBmb3VuZF9yYW5nZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCAmcmFuZ2UgOiAqcHVzaF9jb25zdGFudF9yYW5nZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyYW5nZS5vZmZzZXQgPD0gb2Zmc2V0KSAmJiAoKHJhbmdlLm9mZnNldCArIHJhbmdlLnNpemUpID49IChvZmZzZXQgKyBzaXplKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChyYW5nZS5zdGFnZUZsYWdzICYgc3RhZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9yYW5nZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZF9yYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX1NoYWRlcl9QdXNoQ29uc3RhbnRPdXRPZlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1c2ggY29uc3RhbnQgcmFuZ2UgY292ZXJpbmcgdmFyaWFibGUgc3RhcnRpbmcgYXQgb2Zmc2V0ICV1IG5vdCBkZWNsYXJlZCBpbiBsYXlvdXQiLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitzdGF0aWMgYm9vbCBWYWxpZGF0ZVB1c2hDb25zdGFudFVzYWdlKGRlYnVnX3JlcG9ydF9kYXRhIGNvbnN0ICpyZXBvcnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmtQdXNoQ29uc3RhbnRSYW5nZT4gY29uc3QgKnB1c2hfY29uc3RhbnRfcmFuZ2VzLCBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gYWNjZXNzaWJsZV9pZHMsIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSkgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgZm9yIChhdXRvIGlkIDogYWNjZXNzaWJsZV9pZHMpIHsKKyAgICAgICAgYXV0byBkZWZfaW5zbiA9IHNyYy0+Z2V0X2RlZihpZCk7CisgICAgICAgIGlmIChkZWZfaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wVmFyaWFibGUgJiYgZGVmX2luc24ud29yZCgzKSA9PSBzcHY6OlN0b3JhZ2VDbGFzc1B1c2hDb25zdGFudCkgeworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVB1c2hDb25zdGFudEJsb2NrQWdhaW5zdFBpcGVsaW5lKHJlcG9ydF9kYXRhLCBwdXNoX2NvbnN0YW50X3Jhbmdlcywgc3JjLCBzcmMtPmdldF9kZWYoZGVmX2luc24ud29yZCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKKy8vIFZhbGlkYXRlIHRoYXQgZGF0YSBmb3IgZWFjaCBzcGVjaWFsaXphdGlvbiBlbnRyeSBpcyBmdWxseSBjb250YWluZWQgd2l0aGluIHRoZSBidWZmZXIuCitzdGF0aWMgYm9vbCBWYWxpZGF0ZVNwZWNpYWxpemF0aW9uT2Zmc2V0cyhkZWJ1Z19yZXBvcnRfZGF0YSBjb25zdCAqcmVwb3J0X2RhdGEsIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gY29uc3QgKmluZm8pIHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIFZrU3BlY2lhbGl6YXRpb25JbmZvIGNvbnN0ICpzcGVjID0gaW5mby0+cFNwZWNpYWxpemF0aW9uSW5mbzsKKworICAgIGlmIChzcGVjKSB7CisgICAgICAgIGZvciAoYXV0byBpID0gMHU7IGkgPCBzcGVjLT5tYXBFbnRyeUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzcGVjLT5wTWFwRW50cmllc1tpXS5vZmZzZXQgPj0gc3BlYy0+ZGF0YVNpemUpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tb2Zmc2V0LTAwNzczIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpYWxpemF0aW9uIGVudHJ5ICV1IChmb3IgY29uc3RhbnQgaWQgJXUpIHJlZmVyZW5jZXMgbWVtb3J5IG91dHNpZGUgcHJvdmlkZWQgc3BlY2lhbGl6YXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSAoYnl0ZXMgJXUuLiIgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIgIjsgIiBQUklOVEZfU0laRV9UX1NQRUNJRklFUiAiIGJ5dGVzIHByb3ZpZGVkKS4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3BlYy0+cE1hcEVudHJpZXNbaV0uY29uc3RhbnRJRCwgc3BlYy0+cE1hcEVudHJpZXNbaV0ub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjLT5wTWFwRW50cmllc1tpXS5vZmZzZXQgKyBzcGVjLT5kYXRhU2l6ZSAtIDEsIHNwZWMtPmRhdGFTaXplKTsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNwZWMtPnBNYXBFbnRyaWVzW2ldLm9mZnNldCArIHNwZWMtPnBNYXBFbnRyaWVzW2ldLnNpemUgPiBzcGVjLT5kYXRhU2l6ZSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1NwZWNpYWxpemF0aW9uSW5mby1wTWFwRW50cmllcy0wMDc3NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGVjaWFsaXphdGlvbiBlbnRyeSAldSAoZm9yIGNvbnN0YW50IGlkICV1KSByZWZlcmVuY2VzIG1lbW9yeSBvdXRzaWRlIHByb3ZpZGVkIHNwZWNpYWxpemF0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEgKGJ5dGVzICV1Li4iIFBSSU5URl9TSVpFX1RfU1BFQ0lGSUVSICI7ICIgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIgIiBieXRlcyBwcm92aWRlZCkuLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNwZWMtPnBNYXBFbnRyaWVzW2ldLmNvbnN0YW50SUQsIHNwZWMtPnBNYXBFbnRyaWVzW2ldLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy0+cE1hcEVudHJpZXNbaV0ub2Zmc2V0ICsgc3BlYy0+cE1hcEVudHJpZXNbaV0uc2l6ZSAtIDEsIHNwZWMtPmRhdGFTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCisvLyBUT0RPIChqYm9seik6IENhbiB0aGlzIHJldHVybiBhIGNvbnN0IHJlZmVyZW5jZT8KK3N0YXRpYyBzdGQ6OnNldDx1aW50MzJfdD4gVHlwZVRvRGVzY3JpcHRvclR5cGVTZXQoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqbW9kdWxlLCB1aW50MzJfdCB0eXBlX2lkLCB1bnNpZ25lZCAmZGVzY3JpcHRvcl9jb3VudCkgeworICAgIGF1dG8gdHlwZSA9IG1vZHVsZS0+Z2V0X2RlZih0eXBlX2lkKTsKKyAgICBib29sIGlzX3N0b3JhZ2VfYnVmZmVyID0gZmFsc2U7CisgICAgZGVzY3JpcHRvcl9jb3VudCA9IDE7CisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IHJldDsKKworICAgIC8vIFN0cmlwIG9mZiBhbnkgYXJyYXkgb3IgcHRycy4gV2hlcmUgd2UgcmVtb3ZlIGFycmF5IGxldmVscywgYWRqdXN0IHRoZSAgZGVzY3JpcHRvciBjb3VudCBmb3IgZWFjaCBkaW1lbnNpb24uCisgICAgd2hpbGUgKHR5cGUub3Bjb2RlKCkgPT0gc3B2OjpPcFR5cGVBcnJheSB8fCB0eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlUG9pbnRlciB8fCB0eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlUnVudGltZUFycmF5KSB7CisgICAgICAgIGlmICh0eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlUnVudGltZUFycmF5KSB7CisgICAgICAgICAgICBkZXNjcmlwdG9yX2NvdW50ID0gMDsKKyAgICAgICAgICAgIHR5cGUgPSBtb2R1bGUtPmdldF9kZWYodHlwZS53b3JkKDIpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlQXJyYXkpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JfY291bnQgKj0gR2V0Q29uc3RhbnRWYWx1ZShtb2R1bGUsIHR5cGUud29yZCgzKSk7CisgICAgICAgICAgICB0eXBlID0gbW9kdWxlLT5nZXRfZGVmKHR5cGUud29yZCgyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodHlwZS53b3JkKDIpID09IHNwdjo6U3RvcmFnZUNsYXNzU3RvcmFnZUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGlzX3N0b3JhZ2VfYnVmZmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBtb2R1bGUtPmdldF9kZWYodHlwZS53b3JkKDMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAodHlwZS5vcGNvZGUoKSkgeworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlU3RydWN0OiB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaW5zbiA6ICptb2R1bGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wRGVjb3JhdGUgJiYgaW5zbi53b3JkKDEpID09IHR5cGUud29yZCgxKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDIpID09IHNwdjo6RGVjb3JhdGlvbkJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfc3RvcmFnZV9idWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaW5zZXJ0KFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Lmluc2VydChWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Lmluc2VydChWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnNuLndvcmQoMikgPT0gc3B2OjpEZWNvcmF0aW9uQnVmZmVyQmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW52YWxpZAorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVTYW1wbGVyOgorICAgICAgICAgICAgcmV0Lmluc2VydChWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUik7CisgICAgICAgICAgICByZXQuaW5zZXJ0KFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVNhbXBsZWRJbWFnZTogeworICAgICAgICAgICAgLy8gU2xpZ2h0IHJlbGF4YXRpb24gZm9yIHNvbWUgR0xTTCBoaXN0b3JpY2FsIG1hZG5lc3M6IHNhbXBsZXJCdWZmZXIgZG9lc24ndCByZWFsbHkgaGF2ZSBhIHNhbXBsZXIsIGFuZCBhIHRleGVsCisgICAgICAgICAgICAvLyBidWZmZXIgZGVzY3JpcHRvciBkb2Vzbid0IHJlYWxseSBwcm92aWRlIG9uZS4gQWxsb3cgdGhpcyBzbGlnaHQgbWlzbWF0Y2guCisgICAgICAgICAgICBhdXRvIGltYWdlX3R5cGUgPSBtb2R1bGUtPmdldF9kZWYodHlwZS53b3JkKDIpKTsKKyAgICAgICAgICAgIGF1dG8gZGltID0gaW1hZ2VfdHlwZS53b3JkKDMpOworICAgICAgICAgICAgYXV0byBzYW1wbGVkID0gaW1hZ2VfdHlwZS53b3JkKDcpOworICAgICAgICAgICAgaWYgKGRpbSA9PSBzcHY6OkRpbUJ1ZmZlciAmJiBzYW1wbGVkID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXQuaW5zZXJ0KFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgcmV0Lmluc2VydChWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVJbWFnZTogeworICAgICAgICAgICAgLy8gTWFueSBkZXNjcmlwdG9yIHR5cGVzIGJhY2tpbmcgaW1hZ2UgdHlwZXMtLSBkZXBlbmRzIG9uIGRpbWVuc2lvbiBhbmQgd2hldGhlciB0aGUgaW1hZ2Ugd2lsbCBiZSB1c2VkIHdpdGggYSBzYW1wbGVyLgorICAgICAgICAgICAgLy8gU1BJUlYgZm9yIFZ1bGthbiByZXF1aXJlcyB0aGF0IHNhbXBsZWQgYmUgMSBvciAyIC0tIGxlYXZpbmcgdGhlIGRlY2lzaW9uIHRvIHJ1bnRpbWUgaXMgdW5hY2NlcHRhYmxlLgorICAgICAgICAgICAgYXV0byBkaW0gPSB0eXBlLndvcmQoMyk7CisgICAgICAgICAgICBhdXRvIHNhbXBsZWQgPSB0eXBlLndvcmQoNyk7CisKKyAgICAgICAgICAgIGlmIChkaW0gPT0gc3B2OjpEaW1TdWJwYXNzRGF0YSkgeworICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRpbSA9PSBzcHY6OkRpbUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmIChzYW1wbGVkID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0Lmluc2VydChWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNhbXBsZWQgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UpOworICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldC5pbnNlcnQoVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOgorICAgICAgICAgICAgcmV0Lmluc2VydChWS19ERVNDUklQVE9SX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgcmVhbGx5IHNlZSBhbnkgb3RoZXIganVuayB0eXBlcyAtLSBidXQgaWYgd2UgZG8sIHRoZXkncmUgYSBtaXNtYXRjaC4KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiByZXQ7ICAvLyBNYXRjaGVzIG5vdGhpbmcKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBzdHJpbmdfZGVzY3JpcHRvclR5cGVzKGNvbnN0IHN0ZDo6c2V0PHVpbnQzMl90PiAmZGVzY3JpcHRvcl90eXBlcykgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGZvciAoYXV0byBpdCA9IGRlc2NyaXB0b3JfdHlwZXMuYmVnaW4oKTsgaXQgIT0gZGVzY3JpcHRvcl90eXBlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoc3MudGVsbHAoKSkgc3MgPDwgIiwgIjsKKyAgICAgICAgc3MgPDwgc3RyaW5nX1ZrRGVzY3JpcHRvclR5cGUoVmtEZXNjcmlwdG9yVHlwZSgqaXQpKTsKKyAgICB9CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCitzdGF0aWMgYm9vbCBSZXF1aXJlUHJvcGVydHlGbGFnKGRlYnVnX3JlcG9ydF9kYXRhIGNvbnN0ICpyZXBvcnRfZGF0YSwgVmtCb29sMzIgY2hlY2ssIGNoYXIgY29uc3QgKmZsYWcsIGNoYXIgY29uc3QgKnN0cnVjdHVyZSkgeworICAgIGlmICghY2hlY2spIHsKKyAgICAgICAgaWYgKGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU2hhZGVyX0V4Y2VlZERldmljZUxpbWl0LCAiU2hhZGVyIHJlcXVpcmVzIGZsYWcgJXMgc2V0IGluICVzIGJ1dCBpdCBpcyBub3Qgc2V0IG9uIHRoZSBkZXZpY2UiLCBmbGFnLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgUmVxdWlyZUZlYXR1cmUoZGVidWdfcmVwb3J0X2RhdGEgY29uc3QgKnJlcG9ydF9kYXRhLCBWa0Jvb2wzMiBmZWF0dXJlLCBjaGFyIGNvbnN0ICpmZWF0dXJlX25hbWUpIHsKKyAgICBpZiAoIWZlYXR1cmUpIHsKKyAgICAgICAgaWYgKGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkLCAiU2hhZGVyIHJlcXVpcmVzICVzIGJ1dCBpcyBub3QgZW5hYmxlZCBvbiB0aGUgZGV2aWNlIiwgZmVhdHVyZV9uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIFJlcXVpcmVFeHRlbnNpb24oZGVidWdfcmVwb3J0X2RhdGEgY29uc3QgKnJlcG9ydF9kYXRhLCBib29sIGV4dGVuc2lvbiwgY2hhciBjb25zdCAqZXh0ZW5zaW9uX25hbWUpIHsKKyAgICBpZiAoIWV4dGVuc2lvbikgeworICAgICAgICBpZiAobG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9TaGFkZXJfRmVhdHVyZU5vdEVuYWJsZWQsICJTaGFkZXIgcmVxdWlyZXMgZXh0ZW5zaW9uICVzIGJ1dCBpcyBub3QgZW5hYmxlZCBvbiB0aGUgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX25hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVNoYWRlckNhcGFiaWxpdGllcyhTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgc3RydWN0IEZlYXR1cmVQb2ludGVyIHsKKyAgICAgICAgLy8gQ2FsbGFibGUgb2JqZWN0IHRvIHRlc3QgaWYgdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgaW4gdGhlIGdpdmVuIGFnZ3JlZ2F0ZSBmZWF0dXJlIHN0cnVjdAorICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPFZrQm9vbDMyKGNvbnN0IERldmljZUZlYXR1cmVzICYpPiBJc0VuYWJsZWQ7CisKKyAgICAgICAgLy8gVGVzdCBpZiBmZWF0dXJlIHBvaW50ZXIgaXMgcG9wdWxhdGVkCisgICAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPihJc0VuYWJsZWQpOyB9CisKKyAgICAgICAgLy8gRGVmYXVsdCBhbmQgbnVsbHB0ciBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYW4gZW1wdHkgRmVhdHVyZVBvaW50ZXIKKyAgICAgICAgRmVhdHVyZVBvaW50ZXIoKSA6IElzRW5hYmxlZChudWxscHRyKSB7fQorICAgICAgICBGZWF0dXJlUG9pbnRlcihzdGQ6Om51bGxwdHJfdCBwdHIpIDogSXNFbmFibGVkKG51bGxwdHIpIHt9CisKKyAgICAgICAgLy8gQ29uc3RydWN0b3JzIHRvIHBvcHVsYXRlIEZlYXR1cmVQb2ludGVyIGJhc2VkIG9uIGdpdmVuIHBvaW50ZXIgdG8gbWVtYmVyCisgICAgICAgIEZlYXR1cmVQb2ludGVyKFZrQm9vbDMyIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6KnB0cikKKyAgICAgICAgICAgIDogSXNFbmFibGVkKFs9XShjb25zdCBEZXZpY2VGZWF0dXJlcyAmZmVhdHVyZXMpIHsgcmV0dXJuIGZlYXR1cmVzLmNvcmUuKnB0cjsgfSkge30KKyAgICAgICAgRmVhdHVyZVBvaW50ZXIoVmtCb29sMzIgVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjoqcHRyKQorICAgICAgICAgICAgOiBJc0VuYWJsZWQoWz1dKGNvbnN0IERldmljZUZlYXR1cmVzICZmZWF0dXJlcykgeyByZXR1cm4gZmVhdHVyZXMuZGVzY3JpcHRvcl9pbmRleGluZy4qcHRyOyB9KSB7fQorICAgICAgICBGZWF0dXJlUG9pbnRlcihWa0Jvb2wzMiBWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUjo6KnB0cikKKyAgICAgICAgICAgIDogSXNFbmFibGVkKFs9XShjb25zdCBEZXZpY2VGZWF0dXJlcyAmZmVhdHVyZXMpIHsgcmV0dXJuIGZlYXR1cmVzLmVpZ2h0X2JpdF9zdG9yYWdlLipwdHI7IH0pIHt9CisgICAgICAgIEZlYXR1cmVQb2ludGVyKFZrQm9vbDMyIFZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUOjoqcHRyKQorICAgICAgICAgICAgOiBJc0VuYWJsZWQoWz1dKGNvbnN0IERldmljZUZlYXR1cmVzICZmZWF0dXJlcykgeyByZXR1cm4gZmVhdHVyZXMudHJhbnNmb3JtX2ZlZWRiYWNrX2ZlYXR1cmVzLipwdHI7IH0pIHt9CisgICAgICAgIEZlYXR1cmVQb2ludGVyKFZrQm9vbDMyIFZrUGh5c2ljYWxEZXZpY2VGbG9hdDE2SW50OEZlYXR1cmVzS0hSOjoqcHRyKQorICAgICAgICAgICAgOiBJc0VuYWJsZWQoWz1dKGNvbnN0IERldmljZUZlYXR1cmVzICZmZWF0dXJlcykgeyByZXR1cm4gZmVhdHVyZXMuZmxvYXQxNl9pbnQ4LipwdHI7IH0pIHt9CisgICAgICAgIEZlYXR1cmVQb2ludGVyKFZrQm9vbDMyIFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUOjoqcHRyKQorICAgICAgICAgICAgOiBJc0VuYWJsZWQoWz1dKGNvbnN0IERldmljZUZlYXR1cmVzICZmZWF0dXJlcykgeyByZXR1cm4gZmVhdHVyZXMuc2NhbGFyX2Jsb2NrX2xheW91dF9mZWF0dXJlcy4qcHRyOyB9KSB7fQorICAgICAgICBGZWF0dXJlUG9pbnRlcihWa0Jvb2wzMiBWa1BoeXNpY2FsRGV2aWNlQ29vcGVyYXRpdmVNYXRyaXhGZWF0dXJlc05WOjoqcHRyKQorICAgICAgICAgICAgOiBJc0VuYWJsZWQoWz1dKGNvbnN0IERldmljZUZlYXR1cmVzICZmZWF0dXJlcykgeyByZXR1cm4gZmVhdHVyZXMuY29vcGVyYXRpdmVfbWF0cml4X2ZlYXR1cmVzLipwdHI7IH0pIHt9CisgICAgICAgIEZlYXR1cmVQb2ludGVyKFZrQm9vbDMyIFZrUGh5c2ljYWxEZXZpY2VVbmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXRGZWF0dXJlc0tIUjo6KnB0cikKKyAgICAgICAgICAgIDogSXNFbmFibGVkKFs9XShjb25zdCBEZXZpY2VGZWF0dXJlcyAmZmVhdHVyZXMpIHsgcmV0dXJuIGZlYXR1cmVzLnVuaWZvcm1fYnVmZmVyX3N0YW5kYXJkX2xheW91dC4qcHRyOyB9KSB7fQorICAgICAgICBGZWF0dXJlUG9pbnRlcihWa0Jvb2wzMiBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVjo6KnB0cikKKyAgICAgICAgICAgIDogSXNFbmFibGVkKFs9XShjb25zdCBEZXZpY2VGZWF0dXJlcyAmZmVhdHVyZXMpIHsgcmV0dXJuIGZlYXR1cmVzLmNvbXB1dGVfc2hhZGVyX2Rlcml2YXRpdmVzX2ZlYXR1cmVzLipwdHI7IH0pIHt9CisgICAgICAgIEZlYXR1cmVQb2ludGVyKFZrQm9vbDMyIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVjo6KnB0cikKKyAgICAgICAgICAgIDogSXNFbmFibGVkKFs9XShjb25zdCBEZXZpY2VGZWF0dXJlcyAmZmVhdHVyZXMpIHsgcmV0dXJuIGZlYXR1cmVzLmZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpY19mZWF0dXJlcy4qcHRyOyB9KSB7fQorICAgICAgICBGZWF0dXJlUG9pbnRlcihWa0Jvb2wzMiBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WOjoqcHRyKQorICAgICAgICAgICAgOiBJc0VuYWJsZWQoWz1dKGNvbnN0IERldmljZUZlYXR1cmVzICZmZWF0dXJlcykgeyByZXR1cm4gZmVhdHVyZXMuc2hhZGVyX2ltYWdlX2Zvb3RwcmludF9mZWF0dXJlcy4qcHRyOyB9KSB7fQorICAgICAgICBGZWF0dXJlUG9pbnRlcihWa0Jvb2wzMiBWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVDo6KnB0cikKKyAgICAgICAgICAgIDogSXNFbmFibGVkKFs9XShjb25zdCBEZXZpY2VGZWF0dXJlcyAmZmVhdHVyZXMpIHsgcmV0dXJuIGZlYXR1cmVzLmZyYWdtZW50X3NoYWRlcl9pbnRlcmxvY2tfZmVhdHVyZXMuKnB0cjsgfSkge30KKyAgICAgICAgRmVhdHVyZVBvaW50ZXIoVmtCb29sMzIgVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUOjoqcHRyKQorICAgICAgICAgICAgOiBJc0VuYWJsZWQoWz1dKGNvbnN0IERldmljZUZlYXR1cmVzICZmZWF0dXJlcykgeyByZXR1cm4gZmVhdHVyZXMuZGVtb3RlX3RvX2hlbHBlcl9pbnZvY2F0aW9uX2ZlYXR1cmVzLipwdHI7IH0pIHt9CisgICAgICAgIEZlYXR1cmVQb2ludGVyKFZrQm9vbDMyIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ6OipwdHIpCisgICAgICAgICAgICA6IElzRW5hYmxlZChbPV0oY29uc3QgRGV2aWNlRmVhdHVyZXMgJmZlYXR1cmVzKSB7IHJldHVybiBmZWF0dXJlcy5idWZmZXJfZGV2aWNlX2FkZHJlc3NfZXh0LipwdHI7IH0pIHt9CisgICAgICAgIEZlYXR1cmVQb2ludGVyKFZrQm9vbDMyIFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI6OipwdHIpCisgICAgICAgICAgICA6IElzRW5hYmxlZChbPV0oY29uc3QgRGV2aWNlRmVhdHVyZXMgJmZlYXR1cmVzKSB7IHJldHVybiBmZWF0dXJlcy5idWZmZXJfZGV2aWNlX2FkZHJlc3MuKnB0cjsgfSkge30KKyAgICB9OworCisgICAgc3RydWN0IENhcGFiaWxpdHlJbmZvIHsKKyAgICAgICAgY2hhciBjb25zdCAqbmFtZTsKKyAgICAgICAgRmVhdHVyZVBvaW50ZXIgZmVhdHVyZTsKKyAgICAgICAgRXh0RW5hYmxlZCBEZXZpY2VFeHRlbnNpb25zOjoqZXh0ZW5zaW9uOworICAgIH07CisKKyAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPHVpbnQzMl90LCBDYXBhYmlsaXR5SW5mbz4gY2FwYWJpbGl0aWVzID0geworICAgICAgICAvLyBDYXBhYmlsaXRpZXMgYWx3YXlzIHN1cHBvcnRlZCBieSBhIFZ1bGthbiAxLjAgaW1wbGVtZW50YXRpb24gLS0gbm8KKyAgICAgICAgLy8gZmVhdHVyZSBiaXRzLgorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5TWF0cml4LCB7bnVsbHB0cn19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U2hhZGVyLCB7bnVsbHB0cn19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5SW5wdXRBdHRhY2htZW50LCB7bnVsbHB0cn19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U2FtcGxlZDFELCB7bnVsbHB0cn19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5SW1hZ2UxRCwge251bGxwdHJ9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVNhbXBsZWRCdWZmZXIsIHtudWxscHRyfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHMsIHtudWxscHRyfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlJbWFnZVF1ZXJ5LCB7bnVsbHB0cn19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5RGVyaXZhdGl2ZUNvbnRyb2wsIHtudWxscHRyfX0sCisKKyAgICAgICAgLy8gQ2FwYWJpbGl0aWVzIHRoYXQgYXJlIG9wdGlvbmFsbHkgc3VwcG9ydGVkLCBidXQgcmVxdWlyZSBhIGZlYXR1cmUgdG8KKyAgICAgICAgLy8gYmUgZW5hYmxlZCBvbiB0aGUgZGV2aWNlCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlHZW9tZXRyeSwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6Omdlb21ldHJ5U2hhZGVyIiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6Z2VvbWV0cnlTaGFkZXJ9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVRlc3NlbGxhdGlvbiwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnRlc3NlbGxhdGlvblNoYWRlciIsICZWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnRlc3NlbGxhdGlvblNoYWRlcn19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5RmxvYXQ2NCwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlckZsb2F0NjQiLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJGbG9hdDY0fX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlJbnQ2NCwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlckludDY0IiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVySW50NjR9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVRlc3NlbGxhdGlvblBvaW50U2l6ZSwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlclRlc3NlbGxhdGlvbkFuZEdlb21ldHJ5UG9pbnRTaXplIiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemV9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eUdlb21ldHJ5UG9pbnRTaXplLCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUiLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZX19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5SW1hZ2VHYXRoZXJFeHRlbmRlZCwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQiLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJJbWFnZUdhdGhlckV4dGVuZGVkfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZSwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlIiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGV9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZywgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyIsICZWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlclVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmcsIHsiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyIsICZWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlclNhbXBsZWRJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmcsIHsiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmd9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVN0b3JhZ2VJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nLCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmd9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eUNsaXBEaXN0YW5jZSwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlckNsaXBEaXN0YW5jZSIsICZWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlckNsaXBEaXN0YW5jZX19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5Q3VsbERpc3RhbmNlLCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyQ3VsbERpc3RhbmNlIiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyQ3VsbERpc3RhbmNlfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlJbWFnZUN1YmVBcnJheSwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OmltYWdlQ3ViZUFycmF5IiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6aW1hZ2VDdWJlQXJyYXl9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVNhbXBsZVJhdGVTaGFkaW5nLCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2FtcGxlUmF0ZVNoYWRpbmciLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzYW1wbGVSYXRlU2hhZGluZ319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U3BhcnNlUmVzaWRlbmN5LCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyUmVzb3VyY2VSZXNpZGVuY3kiLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeX19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5TWluTG9kLCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyUmVzb3VyY2VNaW5Mb2QiLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJSZXNvdXJjZU1pbkxvZH19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U2FtcGxlZEN1YmVBcnJheSwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OmltYWdlQ3ViZUFycmF5IiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6aW1hZ2VDdWJlQXJyYXl9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eUltYWdlTVNBcnJheSwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlIiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGV9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eUludGVycG9sYXRpb25GdW5jdGlvbiwgeyJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6OnNhbXBsZVJhdGVTaGFkaW5nIiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2FtcGxlUmF0ZVNoYWRpbmd9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0LCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyU3RvcmFnZUltYWdlUmVhZFdpdGhvdXRGb3JtYXQiLCAmVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdH19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0LCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0IiwgJlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6c2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0fX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlNdWx0aVZpZXdwb3J0LCB7IlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6bXVsdGlWaWV3cG9ydCIsICZWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6Om11bHRpVmlld3BvcnR9fSwKKworICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U2hhZGVyTm9uVW5pZm9ybUVYVCwge1ZLX0VYVF9ERVNDUklQVE9SX0lOREVYSU5HX0VYVEVOU0lPTl9OQU1FLCBudWxscHRyLCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2Rlc2NyaXB0b3JfaW5kZXhpbmd9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVJ1bnRpbWVEZXNjcmlwdG9yQXJyYXlFWFQsIHsiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpydW50aW1lRGVzY3JpcHRvckFycmF5IiwgJlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6cnVudGltZURlc2NyaXB0b3JBcnJheX19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5SW5wdXRBdHRhY2htZW50QXJyYXlEeW5hbWljSW5kZXhpbmdFWFQsIHsiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpzaGFkZXJJbnB1dEF0dGFjaG1lbnRBcnJheUR5bmFtaWNJbmRleGluZyIsICZWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5RHluYW1pY0luZGV4aW5nfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ0VYVCwgeyJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNoYWRlclVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIiwgJlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6c2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmd9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nRVhULCB7IlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6c2hhZGVyU3RvcmFnZVRleGVsQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciLCAmVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZ319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5VW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nRVhULCB7IlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6c2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nIiwgJlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6c2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlTYW1wbGVkSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZ0VYVCwgeyJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nIiwgJlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6c2hhZGVyU2FtcGxlZEltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmd9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ0VYVCwgeyJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyIsICZWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U3RvcmFnZUltYWdlQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdFWFQsIHsiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheU5vblVuaWZvcm1JbmRleGluZyIsICZWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNoYWRlclN0b3JhZ2VJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlJbnB1dEF0dGFjaG1lbnRBcnJheU5vblVuaWZvcm1JbmRleGluZ0VYVCwgeyJWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNoYWRlcklucHV0QXR0YWNobWVudEFycmF5Tm9uVW5pZm9ybUluZGV4aW5nIiwgJlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6c2hhZGVySW5wdXRBdHRhY2htZW50QXJyYXlOb25Vbmlmb3JtSW5kZXhpbmd9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVVuaWZvcm1UZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nRVhULCB7IlZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVDo6c2hhZGVyVW5pZm9ybVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmciLCAmVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpzaGFkZXJVbmlmb3JtVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZ319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U3RvcmFnZVRleGVsQnVmZmVyQXJyYXlOb25Vbmlmb3JtSW5kZXhpbmdFWFQsIHsiVmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUOjpzaGFkZXJTdG9yYWdlVGV4ZWxCdWZmZXJBcnJheU5vblVuaWZvcm1JbmRleGluZyIsICZWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ6OnNoYWRlclN0b3JhZ2VUZXhlbEJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nfX0sCisKKyAgICAgICAgLy8gQ2FwYWJpbGl0aWVzIHRoYXQgcmVxdWlyZSBhbiBleHRlbnNpb24KKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eURyYXdQYXJhbWV0ZXJzLCB7VktfS0hSX1NIQURFUl9EUkFXX1BBUkFNRVRFUlNfRVhURU5TSU9OX05BTUUsIG51bGxwdHIsICZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2hhZGVyX2RyYXdfcGFyYW1ldGVyc319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5R2VvbWV0cnlTaGFkZXJQYXNzdGhyb3VnaE5WLCB7VktfTlZfR0VPTUVUUllfU0hBREVSX1BBU1NUSFJPVUdIX0VYVEVOU0lPTl9OQU1FLCBudWxscHRyLCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfZ2VvbWV0cnlfc2hhZGVyX3Bhc3N0aHJvdWdofX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlTYW1wbGVNYXNrT3ZlcnJpZGVDb3ZlcmFnZU5WLCB7VktfTlZfU0FNUExFX01BU0tfT1ZFUlJJREVfQ09WRVJBR0VfRVhURU5TSU9OX05BTUUsIG51bGxwdHIsICZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9zYW1wbGVfbWFza19vdmVycmlkZV9jb3ZlcmFnZX19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U2hhZGVyVmlld3BvcnRJbmRleExheWVyRVhULCB7VktfRVhUX1NIQURFUl9WSUVXUE9SVF9JTkRFWF9MQVlFUl9FWFRFTlNJT05fTkFNRSwgbnVsbHB0ciwgJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9zaGFkZXJfdmlld3BvcnRfaW5kZXhfbGF5ZXJ9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVNoYWRlclZpZXdwb3J0SW5kZXhMYXllck5WLCB7VktfTlZfVklFV1BPUlRfQVJSQVkyX0VYVEVOU0lPTl9OQU1FLCBudWxscHRyLCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfdmlld3BvcnRfYXJyYXkyfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlTaGFkZXJWaWV3cG9ydE1hc2tOViwge1ZLX05WX1ZJRVdQT1JUX0FSUkFZMl9FWFRFTlNJT05fTkFNRSwgbnVsbHB0ciwgJkRldmljZUV4dGVuc2lvbnM6OnZrX252X3ZpZXdwb3J0X2FycmF5Mn19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U3ViZ3JvdXBCYWxsb3RLSFIsIHtWS19FWFRfU0hBREVSX1NVQkdST1VQX0JBTExPVF9FWFRFTlNJT05fTkFNRSwgbnVsbHB0ciwgJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9zaGFkZXJfc3ViZ3JvdXBfYmFsbG90IH19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U3ViZ3JvdXBWb3RlS0hSLCB7VktfRVhUX1NIQURFUl9TVUJHUk9VUF9WT1RFX0VYVEVOU0lPTl9OQU1FLCBudWxscHRyLCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3NoYWRlcl9zdWJncm91cF92b3RlIH19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5R3JvdXBOb25Vbmlmb3JtUGFydGl0aW9uZWROViwge1ZLX05WX1NIQURFUl9TVUJHUk9VUF9QQVJUSVRJT05FRF9FWFRFTlNJT05fTkFNRSwgbnVsbHB0ciwgJkRldmljZUV4dGVuc2lvbnM6OnZrX252X3NoYWRlcl9zdWJncm91cF9wYXJ0aXRpb25lZH19LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5SW50NjRBdG9taWNzLCB7VktfS0hSX1NIQURFUl9BVE9NSUNfSU5UNjRfRVhURU5TSU9OX05BTUUsIG51bGxwdHIsICZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2hhZGVyX2F0b21pY19pbnQ2NCB9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVNoYWRlckNsb2NrS0hSLCB7VktfS0hSX1NIQURFUl9DTE9DS19FWFRFTlNJT05fTkFNRSwgbnVsbHB0ciwgJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zaGFkZXJfY2xvY2sgfX0sCisKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eUNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkc05WLCB7IlZrUGh5c2ljYWxEZXZpY2VDb21wdXRlU2hhZGVyRGVyaXZhdGl2ZXNGZWF0dXJlc05WOjpjb21wdXRlRGVyaXZhdGl2ZUdyb3VwUXVhZHMiLCAmVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlY6OmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkcywgJkRldmljZUV4dGVuc2lvbnM6OnZrX252X2NvbXB1dGVfc2hhZGVyX2Rlcml2YXRpdmVzfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlDb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyTlYsIHsiVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlY6OmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXIiLCAmVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlY6OmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBMaW5lYXIsICZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlc319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5RnJhZ21lbnRCYXJ5Y2VudHJpY05WLCB7IlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVjo6ZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyIsICZWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlY6OmZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWMsICZEZXZpY2VFeHRlbnNpb25zOjp2a19udl9mcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWN9fSwKKworICAgICAgICB7c3B2OjpDYXBhYmlsaXR5U3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MsIHsiVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFI6OnN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzIiwgJlZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSOjpzdG9yYWdlQnVmZmVyOEJpdEFjY2VzcywgJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl84Yml0X3N0b3JhZ2V9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyOEJpdEFjY2VzcywgeyJWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUjo6dW5pZm9ybUFuZFN0b3JhZ2VCdWZmZXI4Qml0QWNjZXNzIiwgJlZrUGh5c2ljYWxEZXZpY2U4Qml0U3RvcmFnZUZlYXR1cmVzS0hSOjp1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjhCaXRBY2Nlc3MsICZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfOGJpdF9zdG9yYWdlfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlTdG9yYWdlUHVzaENvbnN0YW50OCwgeyJWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUjo6c3RvcmFnZVB1c2hDb25zdGFudDgiLCAmVmtQaHlzaWNhbERldmljZThCaXRTdG9yYWdlRmVhdHVyZXNLSFI6OnN0b3JhZ2VQdXNoQ29uc3RhbnQ4LCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyXzhiaXRfc3RvcmFnZX19LAorCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlUcmFuc2Zvcm1GZWVkYmFjaywgeyAiVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6OnRyYW5zZm9ybUZlZWRiYWNrIiwgJlZrUGh5c2ljYWxEZXZpY2VUcmFuc2Zvcm1GZWVkYmFja0ZlYXR1cmVzRVhUOjp0cmFuc2Zvcm1GZWVkYmFjaywgJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF90cmFuc2Zvcm1fZmVlZGJhY2t9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eUdlb21ldHJ5U3RyZWFtcywgeyAiVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ6Omdlb21ldHJ5U3RyZWFtcyIsICZWa1BoeXNpY2FsRGV2aWNlVHJhbnNmb3JtRmVlZGJhY2tGZWF0dXJlc0VYVDo6Z2VvbWV0cnlTdHJlYW1zLCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3RyYW5zZm9ybV9mZWVkYmFja319LAorCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlGbG9hdDE2LCB7IlZrUGh5c2ljYWxEZXZpY2VGbG9hdDE2SW50OEZlYXR1cmVzS0hSOjpzaGFkZXJGbG9hdDE2IiwgJlZrUGh5c2ljYWxEZXZpY2VGbG9hdDE2SW50OEZlYXR1cmVzS0hSOjpzaGFkZXJGbG9hdDE2LCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3NoYWRlcl9mbG9hdDE2X2ludDh9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eUludDgsIHsiVmtQaHlzaWNhbERldmljZUZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI6OnNoYWRlckludDgiLCAmVmtQaHlzaWNhbERldmljZUZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI6OnNoYWRlckludDgsICZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2hhZGVyX2Zsb2F0MTZfaW50OH19LAorCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlJbWFnZUZvb3RwcmludE5WLCB7IlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY6OmltYWdlRm9vdHByaW50IiwgJlZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY6OmltYWdlRm9vdHByaW50LCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfc2hhZGVyX2ltYWdlX2Zvb3RwcmludH19LAorCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlDb29wZXJhdGl2ZU1hdHJpeE5WLCB7IlZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlY6OmNvb3BlcmF0aXZlTWF0cml4IiwgJlZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlY6OmNvb3BlcmF0aXZlTWF0cml4LCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfbnZfY29vcGVyYXRpdmVfbWF0cml4fX0sCisKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZSwgeyJWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6OnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZSIsIG51bGxwdHIsICZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2hhZGVyX2Zsb2F0X2NvbnRyb2xzfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlEZW5vcm1QcmVzZXJ2ZSwgeyJWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6OnNoYWRlckRlbm9ybVByZXNlcnZlIiwgbnVsbHB0ciwgJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zaGFkZXJfZmxvYXRfY29udHJvbHN9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eURlbm9ybUZsdXNoVG9aZXJvLCB7IlZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUjo6c2hhZGVyRGVub3JtRmx1c2hUb1plcm8iLCBudWxscHRyLCAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfa2hyX3NoYWRlcl9mbG9hdF9jb250cm9sc319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5Um91bmRpbmdNb2RlUlRFLCB7IlZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUjo6c2hhZGVyUm91bmRpbmdNb2RlUlRFIiwgbnVsbHB0ciwgJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9zaGFkZXJfZmxvYXRfY29udHJvbHN9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eVJvdW5kaW5nTW9kZVJUWiwgeyJWa1BoeXNpY2FsRGV2aWNlRmxvYXRDb250cm9sc1Byb3BlcnRpZXNLSFI6OnNoYWRlclJvdW5kaW5nTW9kZVJUWiIsIG51bGxwdHIsICZEZXZpY2VFeHRlbnNpb25zOjp2a19raHJfc2hhZGVyX2Zsb2F0X2NvbnRyb2xzfX0sCisKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eUZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrRVhULCAgICAgICB7IlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUOjpmcmFnbWVudFNoYWRlclNhbXBsZUludGVybG9jayIsICAgICAgICZWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVDo6ZnJhZ21lbnRTaGFkZXJTYW1wbGVJbnRlcmxvY2ssICAgICAgICAgJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9mcmFnbWVudF9zaGFkZXJfaW50ZXJsb2NrfX0sCisgICAgICAgIHtzcHY6OkNhcGFiaWxpdHlGcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrRVhULCAgICAgICAgeyJWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVDo6ZnJhZ21lbnRTaGFkZXJQaXhlbEludGVybG9jayIsICAgICAgICAmVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQ6OmZyYWdtZW50U2hhZGVyUGl4ZWxJbnRlcmxvY2ssICAgICAgICAgICZEZXZpY2VFeHRlbnNpb25zOjp2a19leHRfZnJhZ21lbnRfc2hhZGVyX2ludGVybG9ja319LAorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5RnJhZ21lbnRTaGFkZXJTaGFkaW5nUmF0ZUludGVybG9ja0VYVCwgIHsiVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQ6OmZyYWdtZW50U2hhZGVyU2hhZGluZ1JhdGVJbnRlcmxvY2siLCAgJlZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUOjpmcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrLCAgICAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X2ZyYWdtZW50X3NoYWRlcl9pbnRlcmxvY2t9fSwKKyAgICAgICAge3Nwdjo6Q2FwYWJpbGl0eURlbW90ZVRvSGVscGVySW52b2NhdGlvbkVYVCwgICAgICAgeyJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ6OnNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbiIsICAgICAgICZWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ6OnNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbiwgICAgICAgICAmRGV2aWNlRXh0ZW5zaW9uczo6dmtfZXh0X3NoYWRlcl9kZW1vdGVfdG9faGVscGVyX2ludm9jYXRpb259fSwKKworICAgICAgICB7c3B2OjpDYXBhYmlsaXR5UGh5c2ljYWxTdG9yYWdlQnVmZmVyQWRkcmVzc2VzRVhULCB7IlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ6OmJ1ZmZlckRldmljZUFkZHJlc3MiLCAmVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0VYVDo6YnVmZmVyRGV2aWNlQWRkcmVzcywgJkRldmljZUV4dGVuc2lvbnM6OnZrX2V4dF9idWZmZXJfZGV2aWNlX2FkZHJlc3N9fSwKKyAgICAgICAgLy8gU2hvdWxkIGJlIG5vbi1FWFQgdG9rZW4sIGJ1dCBBbmRyb2lkIFNQSVJWLUhlYWRlcnMgYXJlIG91dCBvZiBkYXRlLCBhbmQgdGhlIHRva2VuIHZhbHVlIGlzIHRoZSBzYW1lIGFueXdheQorICAgICAgICB7c3B2OjpDYXBhYmlsaXR5UGh5c2ljYWxTdG9yYWdlQnVmZmVyQWRkcmVzc2VzRVhULCB7IlZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI6OmJ1ZmZlckRldmljZUFkZHJlc3MiLCAmVmtQaHlzaWNhbERldmljZUJ1ZmZlckRldmljZUFkZHJlc3NGZWF0dXJlc0tIUjo6YnVmZmVyRGV2aWNlQWRkcmVzcywgJkRldmljZUV4dGVuc2lvbnM6OnZrX2tocl9idWZmZXJfZGV2aWNlX2FkZHJlc3N9fSwKKyAgICB9OworICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorCisgICAgZm9yIChhdXRvIGluc24gOiAqc3JjKSB7CisgICAgICAgIGlmIChpbnNuLm9wY29kZSgpID09IHNwdjo6T3BDYXBhYmlsaXR5KSB7CisgICAgICAgICAgICBzaXplX3QgbiA9IGNhcGFiaWxpdGllcy5jb3VudChpbnNuLndvcmQoMSkpOworICAgICAgICAgICAgaWYgKDEgPT0gbikgeyAgLy8ga2V5IG9jY3VycyBleGFjdGx5IG9uY2UKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gY2FwYWJpbGl0aWVzLmZpbmQoaW5zbi53b3JkKDEpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgIT0gY2FwYWJpbGl0aWVzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZlYXR1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gUmVxdWlyZUZlYXR1cmUocmVwb3J0X2RhdGEsIGl0LT5zZWNvbmQuZmVhdHVyZS5Jc0VuYWJsZWQoZW5hYmxlZF9mZWF0dXJlcyksIGl0LT5zZWNvbmQubmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFJlcXVpcmVFeHRlbnNpb24ocmVwb3J0X2RhdGEsIElzRXh0RW5hYmxlZCgoZGV2aWNlX2V4dGVuc2lvbnMuKihpdC0+c2Vjb25kLmV4dGVuc2lvbikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLm5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgxIDwgbikgeyAgLy8ga2V5IG9jY3VycyBtdWx0aXBsZSB0aW1lcywgYXQgbGVhc3Qgb25lIG11c3QgYmUgZW5hYmxlZAorICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfZmVhdHVyZSA9IGZhbHNlLCBoYXNfZmVhdHVyZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfZXh0ID0gZmFsc2UsIGhhc19leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmZWF0dXJlX25hbWVzID0gIihvbmUgb2YpIFsgIjsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBleHRlbnNpb25fbmFtZXMgPSBmZWF0dXJlX25hbWVzOworICAgICAgICAgICAgICAgIGF1dG8gY2FwcyA9IGNhcGFiaWxpdGllcy5lcXVhbF9yYW5nZShpbnNuLndvcmQoMSkpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGNhcHMuZmlyc3Q7IGl0ICE9IGNhcHMuc2Vjb25kOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZlYXR1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzX2ZlYXR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2ZlYXR1cmUgPSBoYXNfZmVhdHVyZSB8fCBpdC0+c2Vjb25kLmZlYXR1cmUuSXNFbmFibGVkKGVuYWJsZWRfZmVhdHVyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9uYW1lcyArPSBpdC0+c2Vjb25kLm5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX25hbWVzICs9ICIgIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5leHRlbnNpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzX2V4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNfZXh0ID0gaGFzX2V4dCB8fCBkZXZpY2VfZXh0ZW5zaW9ucy4qKGl0LT5zZWNvbmQuZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9uYW1lcyArPSBpdC0+c2Vjb25kLm5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZXMgKz0gIiAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZWVkc19mZWF0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfbmFtZXMgKz0gIl0iOworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFJlcXVpcmVGZWF0dXJlKHJlcG9ydF9kYXRhLCBoYXNfZmVhdHVyZSwgZmVhdHVyZV9uYW1lcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5lZWRzX2V4dCkgeworICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZXMgKz0gIl0iOworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFJlcXVpcmVFeHRlbnNpb24ocmVwb3J0X2RhdGEsIGhhc19leHQsIGV4dGVuc2lvbl9uYW1lcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsgIC8vIERvIGdyb3VwIG5vbi11bmlmb3JtIGNoZWNrcworICAgICAgICAgICAgICAgIGNvbnN0IFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ3Mgc3VwcG9ydGVkT3BlcmF0aW9ucyA9IHBoeXNfZGV2X2V4dF9wcm9wcy5zdWJncm91cF9wcm9wcy5zdXBwb3J0ZWRPcGVyYXRpb25zOworICAgICAgICAgICAgICAgIGNvbnN0IFZrU3ViZ3JvdXBGZWF0dXJlRmxhZ3Mgc3VwcG9ydGVkU3RhZ2VzID0gcGh5c19kZXZfZXh0X3Byb3BzLnN1Ymdyb3VwX3Byb3BzLnN1cHBvcnRlZFN0YWdlczsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zbi53b3JkKDEpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkNhcGFiaWxpdHlHcm91cE5vblVuaWZvcm06CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpDYXBhYmlsaXR5R3JvdXBOb25Vbmlmb3JtVm90ZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkNhcGFiaWxpdHlHcm91cE5vblVuaWZvcm1Bcml0aG1ldGljOgorICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6Q2FwYWJpbGl0eUdyb3VwTm9uVW5pZm9ybUJhbGxvdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkNhcGFiaWxpdHlHcm91cE5vblVuaWZvcm1TaHVmZmxlOgorICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6Q2FwYWJpbGl0eUdyb3VwTm9uVW5pZm9ybVNodWZmbGVSZWxhdGl2ZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkNhcGFiaWxpdHlHcm91cE5vblVuaWZvcm1DbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpDYXBhYmlsaXR5R3JvdXBOb25Vbmlmb3JtUXVhZDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkNhcGFiaWxpdHlHcm91cE5vblVuaWZvcm1QYXJ0aXRpb25lZE5WOgorICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZVByb3BlcnR5RmxhZyhyZXBvcnRfZGF0YSwgc3VwcG9ydGVkU3RhZ2VzICYgc3RhZ2UsIHN0cmluZ19Wa1NoYWRlclN0YWdlRmxhZ0JpdHMoc3RhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllczo6c3VwcG9ydGVkU3RhZ2VzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc24ud29yZCgxKSkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpDYXBhYmlsaXR5R3JvdXBOb25Vbmlmb3JtOgorICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZVByb3BlcnR5RmxhZyhyZXBvcnRfZGF0YSwgc3VwcG9ydGVkT3BlcmF0aW9ucyAmIFZLX1NVQkdST1VQX0ZFQVRVUkVfQkFTSUNfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU1VCR1JPVVBfRkVBVFVSRV9CQVNJQ19CSVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllczo6c3VwcG9ydGVkT3BlcmF0aW9ucyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpDYXBhYmlsaXR5R3JvdXBOb25Vbmlmb3JtVm90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVQcm9wZXJ0eUZsYWcocmVwb3J0X2RhdGEsIHN1cHBvcnRlZE9wZXJhdGlvbnMgJiBWS19TVUJHUk9VUF9GRUFUVVJFX1ZPVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU1VCR1JPVVBfRkVBVFVSRV9WT1RFX0JJVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpzdXBwb3J0ZWRPcGVyYXRpb25zIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkNhcGFiaWxpdHlHcm91cE5vblVuaWZvcm1Bcml0aG1ldGljOgorICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZVByb3BlcnR5RmxhZyhyZXBvcnRfZGF0YSwgc3VwcG9ydGVkT3BlcmF0aW9ucyAmIFZLX1NVQkdST1VQX0ZFQVRVUkVfQVJJVEhNRVRJQ19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19TVUJHUk9VUF9GRUFUVVJFX0FSSVRITUVUSUNfQklUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM6OnN1cHBvcnRlZE9wZXJhdGlvbnMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6Q2FwYWJpbGl0eUdyb3VwTm9uVW5pZm9ybUJhbGxvdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVQcm9wZXJ0eUZsYWcocmVwb3J0X2RhdGEsIHN1cHBvcnRlZE9wZXJhdGlvbnMgJiBWS19TVUJHUk9VUF9GRUFUVVJFX0JBTExPVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19TVUJHUk9VUF9GRUFUVVJFX0JBTExPVF9CSVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllczo6c3VwcG9ydGVkT3BlcmF0aW9ucyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpDYXBhYmlsaXR5R3JvdXBOb25Vbmlmb3JtU2h1ZmZsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVQcm9wZXJ0eUZsYWcocmVwb3J0X2RhdGEsIHN1cHBvcnRlZE9wZXJhdGlvbnMgJiBWS19TVUJHUk9VUF9GRUFUVVJFX1NIVUZGTEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX0JJVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpzdXBwb3J0ZWRPcGVyYXRpb25zIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkNhcGFiaWxpdHlHcm91cE5vblVuaWZvcm1TaHVmZmxlUmVsYXRpdmU6CisgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlUHJvcGVydHlGbGFnKHJlcG9ydF9kYXRhLCBzdXBwb3J0ZWRPcGVyYXRpb25zICYgVktfU1VCR1JPVVBfRkVBVFVSRV9TSFVGRkxFX1JFTEFUSVZFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NVQkdST1VQX0ZFQVRVUkVfU0hVRkZMRV9SRUxBVElWRV9CSVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllczo6c3VwcG9ydGVkT3BlcmF0aW9ucyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpDYXBhYmlsaXR5R3JvdXBOb25Vbmlmb3JtQ2x1c3RlcmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZVByb3BlcnR5RmxhZyhyZXBvcnRfZGF0YSwgc3VwcG9ydGVkT3BlcmF0aW9ucyAmIFZLX1NVQkdST1VQX0ZFQVRVUkVfQ0xVU1RFUkVEX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NVQkdST1VQX0ZFQVRVUkVfQ0xVU1RFUkVEX0JJVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpzdXBwb3J0ZWRPcGVyYXRpb25zIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkNhcGFiaWxpdHlHcm91cE5vblVuaWZvcm1RdWFkOgorICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZVByb3BlcnR5RmxhZyhyZXBvcnRfZGF0YSwgc3VwcG9ydGVkT3BlcmF0aW9ucyAmIFZLX1NVQkdST1VQX0ZFQVRVUkVfUVVBRF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19TVUJHUk9VUF9GRUFUVVJFX1FVQURfQklUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM6OnN1cHBvcnRlZE9wZXJhdGlvbnMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6Q2FwYWJpbGl0eUdyb3VwTm9uVW5pZm9ybVBhcnRpdGlvbmVkTlY6CisgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlUHJvcGVydHlGbGFnKHJlcG9ydF9kYXRhLCBzdXBwb3J0ZWRPcGVyYXRpb25zICYgVktfU1VCR1JPVVBfRkVBVFVSRV9QQVJUSVRJT05FRF9CSVRfTlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19TVUJHUk9VUF9GRUFUVVJFX1BBUlRJVElPTkVEX0JJVF9OViIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpzdXBwb3J0ZWRPcGVyYXRpb25zIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVNoYWRlclN0YWdlV3JpdGFibGVEZXNjcmlwdG9yKFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSwgYm9vbCBoYXNfd3JpdGFibGVfZGVzY3JpcHRvcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKGhhc193cml0YWJsZV9kZXNjcmlwdG9yKSB7CisgICAgICAgIHN3aXRjaCAoc3RhZ2UpIHsKKyAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUOgorICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVjoKKyAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0FOWV9ISVRfQklUX05WOgorICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WOgorICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfTUlTU19CSVRfTlY6CisgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9JTlRFUlNFQ1RJT05fQklUX05WOgorICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfQ0FMTEFCTEVfQklUX05WOgorICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfVEFTS19CSVRfTlY6CisgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9NRVNIX0JJVF9OVjoKKyAgICAgICAgICAgICAgICAvKiBObyBmZWF0dXJlIHJlcXVpcmVtZW50cyBmb3Igd3JpdGVzIGFuZCBhdG9taWNzIGZyb20gY29tcHV0ZQorICAgICAgICAgICAgICAgICAqIHJheXRyYWNpbmcsIG9yIG1lc2ggc3RhZ2VzICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ6CisgICAgICAgICAgICAgICAgc2tpcCB8PSBSZXF1aXJlRmVhdHVyZShyZXBvcnRfZGF0YSwgZW5hYmxlZF9mZWF0dXJlcy5jb3JlLmZyYWdtZW50U3RvcmVzQW5kQXRvbWljcywgImZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBza2lwIHw9IFJlcXVpcmVGZWF0dXJlKHJlcG9ydF9kYXRhLCBlbmFibGVkX2ZlYXR1cmVzLmNvcmUudmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNraXA7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVTaGFkZXJTdGFnZUdyb3VwTm9uVW5pZm9ybShTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICptb2R1bGUsIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgYXV0byBjb25zdCBzdWJncm91cF9wcm9wcyA9IHBoeXNfZGV2X2V4dF9wcm9wcy5zdWJncm91cF9wcm9wczsKKworICAgIGZvciAoYXV0byBpbnN0IDogKm1vZHVsZSkgeworICAgICAgICAvLyBDaGVjayB0aGUgcXVhZCBvcGVyYXRpb25zLgorICAgICAgICBzd2l0Y2ggKGluc3Qub3Bjb2RlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cE5vblVuaWZvcm1RdWFkQnJvYWRjYXN0OgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtUXVhZFN3YXA6CisgICAgICAgICAgICAgICAgaWYgKChzdGFnZSAhPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUKSAmJiAoc3RhZ2UgIT0gVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUKSkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFJlcXVpcmVGZWF0dXJlKHJlcG9ydF9kYXRhLCBzdWJncm91cF9wcm9wcy5xdWFkT3BlcmF0aW9uc0luQWxsU3RhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpxdWFkT3BlcmF0aW9uc0luQWxsU3RhZ2VzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLnN1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzX2ZlYXR1cmVzLnNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlcykgeworICAgICAgICAgICAgc3dpdGNoIChpbnN0Lm9wY29kZSgpKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtQWxsRXF1YWw6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtQnJvYWRjYXN0OgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwTm9uVW5pZm9ybUJyb2FkY2FzdEZpcnN0OgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwTm9uVW5pZm9ybVNodWZmbGU6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtU2h1ZmZsZVhvcjoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cE5vblVuaWZvcm1TaHVmZmxlVXA6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtU2h1ZmZsZURvd246CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtSUFkZDoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cE5vblVuaWZvcm1GQWRkOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwTm9uVW5pZm9ybUlNdWw6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtRk11bDoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cE5vblVuaWZvcm1TTWluOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwTm9uVW5pZm9ybVVNaW46CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtRk1pbjoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cE5vblVuaWZvcm1TTWF4OgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwTm9uVW5pZm9ybVVNYXg6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtRk1heDoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cE5vblVuaWZvcm1CaXR3aXNlQW5kOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwTm9uVW5pZm9ybUJpdHdpc2VPcjoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cE5vblVuaWZvcm1CaXR3aXNlWG9yOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwTm9uVW5pZm9ybUxvZ2ljYWxBbmQ6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtTG9naWNhbE9yOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwTm9uVW5pZm9ybUxvZ2ljYWxYb3I6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBOb25Vbmlmb3JtUXVhZEJyb2FkY2FzdDoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BHcm91cE5vblVuaWZvcm1RdWFkU3dhcDogeworICAgICAgICAgICAgICAgICAgICBhdXRvIHR5cGUgPSBtb2R1bGUtPmdldF9kZWYoaW5zdC53b3JkKDEpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5vcGNvZGUoKSA9PSBzcHY6Ok9wVHlwZVZlY3RvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBtb2R1bGUtPmdldF9kZWYodHlwZS53b3JkKDIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlQm9vbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIE9wVHlwZUludCBhbmQgT3BUeXBlRmxvYXQgdGhlIHdpZHRoIGlzIGluIHRoZSAybmQgd29yZC4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSB0eXBlLndvcmQoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlLm9wY29kZSgpID09IHNwdjo6T3BUeXBlRmxvYXQgJiYgd2lkdGggPT0gMTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAodHlwZS5vcGNvZGUoKSA9PSBzcHY6Ok9wVHlwZUludCAmJiAod2lkdGggPT0gOCB8fCB3aWR0aCA9PSAxNiB8fCB3aWR0aCA9PSA2NCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IFJlcXVpcmVGZWF0dXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBlbmFibGVkX2ZlYXR1cmVzLnN1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzX2ZlYXR1cmVzLnNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSOjpzaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVNoYWRlclN0YWdlSW5wdXRPdXRwdXRMaW1pdHMoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0ICpwU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQSVBFTElORV9TVEFURSAqcGlwZWxpbmUsIHNwaXJ2X2luc3RfaXRlciBlbnRyeXBvaW50KSBjb25zdCB7CisgICAgaWYgKHBTdGFnZS0+c3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUIHx8IHBTdGFnZS0+c3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX0FMTF9HUkFQSElDUyB8fAorICAgICAgICBwU3RhZ2UtPnN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9BTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGF1dG8gY29uc3QgJmxpbWl0cyA9IHBoeXNfZGV2X3Byb3BzLmxpbWl0czsKKworICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBwYXRjaElEczsKKyAgICBzdHJ1Y3QgVmFyaWFibGUgeworICAgICAgICB1aW50MzJfdCBiYXNlVHlwZVB0cklEOworICAgICAgICB1aW50MzJfdCBJRDsKKyAgICAgICAgdWludDMyX3Qgc3RvcmFnZUNsYXNzOworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8VmFyaWFibGU+IHZhcmlhYmxlczsKKworICAgIHVpbnQzMl90IG51bVZlcnRpY2VzID0gMDsKKworICAgIGF1dG8gZW50cnlwb2ludFZhcmlhYmxlcyA9IEZpbmRFbnRyeXBvaW50SW50ZXJmYWNlcyhlbnRyeXBvaW50KTsKKworICAgIGZvciAoYXV0byBpbnNuIDogKnNyYykgeworICAgICAgICBzd2l0Y2ggKGluc24ub3Bjb2RlKCkpIHsKKyAgICAgICAgICAgIC8vIEZpbmQgYWxsIFBhdGNoIGRlY29yYXRpb25zCisgICAgICAgICAgICBjYXNlIHNwdjo6T3BEZWNvcmF0ZToKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc24ud29yZCgyKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6RGVjb3JhdGlvblBhdGNoOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaElEcy5pbnNlcnQoaW5zbi53b3JkKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBGaW5kIGFsbCBpbnB1dCBhbmQgb3V0cHV0IHZhcmlhYmxlcworICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVmFyaWFibGU6IHsKKyAgICAgICAgICAgICAgICBWYXJpYWJsZSB2YXIgPSB7fTsKKyAgICAgICAgICAgICAgICB2YXIuc3RvcmFnZUNsYXNzID0gaW5zbi53b3JkKDMpOworICAgICAgICAgICAgICAgIGlmICgodmFyLnN0b3JhZ2VDbGFzcyA9PSBzcHY6OlN0b3JhZ2VDbGFzc0lucHV0IHx8IHZhci5zdG9yYWdlQ2xhc3MgPT0gc3B2OjpTdG9yYWdlQ2xhc3NPdXRwdXQpICYmCisgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSB2YXJpYWJsZXMgaW4gdGhlIGVudHJ5cG9pbnQncyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgZmluZChlbnRyeXBvaW50VmFyaWFibGVzLmJlZ2luKCksIGVudHJ5cG9pbnRWYXJpYWJsZXMuZW5kKCksIGluc24ud29yZCgyKSkgIT0gZW50cnlwb2ludFZhcmlhYmxlcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICB2YXIuYmFzZVR5cGVQdHJJRCA9IGluc24ud29yZCgxKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyLklEID0gaW5zbi53b3JkKDIpOworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMucHVzaF9iYWNrKHZhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wRXhlY3V0aW9uTW9kZToKKyAgICAgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDEpID09IGVudHJ5cG9pbnQud29yZCgyKSkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc24ud29yZCgyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlT3V0cHV0VmVydGljZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVmVydGljZXMgPSBpbnNuLndvcmQoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBzdHJpcF9vdXRwdXRfYXJyYXlfbGV2ZWwgPQorICAgICAgICAocFN0YWdlLT5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUIHx8IHBTdGFnZS0+c3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WKTsKKyAgICBib29sIHN0cmlwX2lucHV0X2FycmF5X2xldmVsID0KKyAgICAgICAgKHBTdGFnZS0+c3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCB8fAorICAgICAgICAgcFN0YWdlLT5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUIHx8IHBTdGFnZS0+c3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCk7CisKKyAgICB1aW50MzJfdCBudW1Db21wSW4gPSAwLCBudW1Db21wT3V0ID0gMDsKKyAgICBpbnQgbWF4Q29tcEluID0gMCwgbWF4Q29tcE91dCA9IDA7CisKKyAgICBhdXRvIGlucHV0cyA9IENvbGxlY3RJbnRlcmZhY2VCeUxvY2F0aW9uKHNyYywgZW50cnlwb2ludCwgc3B2OjpTdG9yYWdlQ2xhc3NJbnB1dCwgc3RyaXBfaW5wdXRfYXJyYXlfbGV2ZWwpOworICAgIGF1dG8gb3V0cHV0cyA9IENvbGxlY3RJbnRlcmZhY2VCeUxvY2F0aW9uKHNyYywgZW50cnlwb2ludCwgc3B2OjpTdG9yYWdlQ2xhc3NPdXRwdXQsIHN0cmlwX291dHB1dF9hcnJheV9sZXZlbCk7CisKKyAgICAvLyBGaW5kIG1heCBjb21wb25lbnQgbG9jYXRpb24gdXNlZCBmb3IgaW5wdXQgdmFyaWFibGVzLgorICAgIGZvciAoYXV0byAmdmFyIDogaW5wdXRzKSB7CisgICAgICAgIGludCBsb2NhdGlvbiA9IHZhci5maXJzdC5maXJzdDsKKyAgICAgICAgaW50IGNvbXBvbmVudCA9IHZhci5maXJzdC5zZWNvbmQ7CisgICAgICAgIGludGVyZmFjZV92YXIgJml2ID0gdmFyLnNlY29uZDsKKworICAgICAgICAvLyBPbmx5IG5lZWQgdG8gbG9vayBhdCB0aGUgZmlyc3QgbG9jYXRpb24sIHNpbmNlIHdlIHVzZSB0aGUgdHlwZSdzIHdob2xlIHNpemUKKyAgICAgICAgaWYgKGl2Lm9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpdi5pc19wYXRjaCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbnVtQ29tcG9uZW50cyA9IEdldENvbXBvbmVudHNDb25zdW1lZEJ5VHlwZShzcmMsIGl2LnR5cGVfaWQsIHN0cmlwX2lucHV0X2FycmF5X2xldmVsKTsKKyAgICAgICAgbWF4Q29tcEluID0gc3RkOjptYXgobWF4Q29tcEluLCBsb2NhdGlvbiAqIDQgKyBjb21wb25lbnQgKyBudW1Db21wb25lbnRzKTsKKyAgICB9CisKKyAgICAvLyBGaW5kIG1heCBjb21wb25lbnQgbG9jYXRpb24gdXNlZCBmb3Igb3V0cHV0IHZhcmlhYmxlcy4KKyAgICBmb3IgKGF1dG8gJnZhciA6IG91dHB1dHMpIHsKKyAgICAgICAgaW50IGxvY2F0aW9uID0gdmFyLmZpcnN0LmZpcnN0OworICAgICAgICBpbnQgY29tcG9uZW50ID0gdmFyLmZpcnN0LnNlY29uZDsKKyAgICAgICAgaW50ZXJmYWNlX3ZhciAmaXYgPSB2YXIuc2Vjb25kOworCisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBsb29rIGF0IHRoZSBmaXJzdCBsb2NhdGlvbiwgc2luY2Ugd2UgdXNlIHRoZSB0eXBlJ3Mgd2hvbGUgc2l6ZQorICAgICAgICBpZiAoaXYub2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGl2LmlzX3BhdGNoKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1Db21wb25lbnRzID0gR2V0Q29tcG9uZW50c0NvbnN1bWVkQnlUeXBlKHNyYywgaXYudHlwZV9pZCwgc3RyaXBfb3V0cHV0X2FycmF5X2xldmVsKTsKKyAgICAgICAgbWF4Q29tcE91dCA9IHN0ZDo6bWF4KG1heENvbXBPdXQsIGxvY2F0aW9uICogNCArIGNvbXBvbmVudCArIG51bUNvbXBvbmVudHMpOworICAgIH0KKworICAgIC8vIFhYWCBUT0RPOiBXb3VsZCBiZSBuaWNlIHRvIHJld3JpdGUgdGhpcyB0byB1c2UgQ29sbGVjdEludGVyZmFjZUJ5TG9jYXRpb24gKG9yIHNvbWV0aGluZyBzaW1pbGFyKSwKKyAgICAvLyBidXQgdGhhdCBkb2Vzbid0IGluY2x1ZGUgYnVpbHRpbnMuCisgICAgZm9yIChhdXRvICZ2YXIgOiB2YXJpYWJsZXMpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGF0Y2guIFBhdGNoZXMgY2FuIGFsc28gYmUgbWVtYmVycyBvZiBibG9ja3MsCisgICAgICAgIC8vIGJ1dCBpZiB0aGV5IGFyZSB0aGVuIHRoZSB0b3AtbGV2ZWwgYXJyYXluZXNzIGhhcyBhbHJlYWR5IGJlZW4gc3RyaXBwZWQKKyAgICAgICAgLy8gYnkgdGhlIHRpbWUgR2V0Q29tcG9uZW50c0NvbnN1bWVkQnlUeXBlIGdldHMgdG8gaXQuCisgICAgICAgIGJvb2wgaXNQYXRjaCA9IHBhdGNoSURzLmZpbmQodmFyLklEKSAhPSBwYXRjaElEcy5lbmQoKTsKKworICAgICAgICBpZiAodmFyLnN0b3JhZ2VDbGFzcyA9PSBzcHY6OlN0b3JhZ2VDbGFzc0lucHV0KSB7CisgICAgICAgICAgICBudW1Db21wSW4gKz0gR2V0Q29tcG9uZW50c0NvbnN1bWVkQnlUeXBlKHNyYywgdmFyLmJhc2VUeXBlUHRySUQsIHN0cmlwX2lucHV0X2FycmF5X2xldmVsICYmICFpc1BhdGNoKTsKKyAgICAgICAgfSBlbHNlIHsgIC8vIHZhci5zdG9yYWdlQ2xhc3MgPT0gc3B2OjpTdG9yYWdlQ2xhc3NPdXRwdXQKKyAgICAgICAgICAgIG51bUNvbXBPdXQgKz0gR2V0Q29tcG9uZW50c0NvbnN1bWVkQnlUeXBlKHNyYywgdmFyLmJhc2VUeXBlUHRySUQsIHN0cmlwX291dHB1dF9hcnJheV9sZXZlbCAmJiAhaXNQYXRjaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHBTdGFnZS0+c3RhZ2UpIHsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVDoKKyAgICAgICAgICAgIGlmIChudW1Db21wT3V0ID4gbGltaXRzLm1heFZlcnRleE91dHB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX1NoYWRlcl9FeGNlZWREZXZpY2VMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVmVydGV4IHNoYWRlciBleGNlZWRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleE91dHB1dENvbXBvbmVudHMgb2YgJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50cyBieSAldSBjb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heFZlcnRleE91dHB1dENvbXBvbmVudHMsIG51bUNvbXBPdXQgLSBsaW1pdHMubWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4Q29tcE91dCA+IChpbnQpbGltaXRzLm1heFZlcnRleE91dHB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX1NoYWRlcl9FeGNlZWREZXZpY2VMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVmVydGV4IHNoYWRlciBvdXRwdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VlZHMgY29tcG9uZW50IGxpbWl0IFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleE91dHB1dENvbXBvbmVudHMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cy5tYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVDoKKyAgICAgICAgICAgIGlmIChudW1Db21wSW4gPiBsaW1pdHMubWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleElucHV0Q29tcG9uZW50cykgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBpcGVsaW5lLT5waXBlbGluZSksIGtWVUlEX0NvcmVfU2hhZGVyX0V4Y2VlZERldmljZUxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaXBlbGluZSBDcmVhdGVJbmZvIFN0YXRlOiBUZXNzZWxsYXRpb24gY29udHJvbCBzaGFkZXIgZXhjZWVkcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzIG9mICV1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudHMgYnkgJXUgY29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cy5tYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db21wSW4gLSBsaW1pdHMubWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleElucHV0Q29tcG9uZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4Q29tcEluID4gKGludClsaW1pdHMubWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleElucHV0Q29tcG9uZW50cykgeworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfRXhjZWVkRGV2aWNlTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIGlucHV0IHZhcmlhYmxlIHVzZXMgbG9jYXRpb24gdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VlZHMgY29tcG9uZW50IGxpbWl0IFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUNvbXBPdXQgPiBsaW1pdHMubWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX1NoYWRlcl9FeGNlZWREZXZpY2VMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIGV4Y2VlZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMgb2YgJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50cyBieSAldSBjb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db21wT3V0IC0gbGltaXRzLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhDb21wT3V0ID4gKGludClsaW1pdHMubWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBpcGVsaW5lLT5waXBlbGluZSksIGtWVUlEX0NvcmVfU2hhZGVyX0V4Y2VlZERldmljZUxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IFRlc3NlbGxhdGlvbiBjb250cm9sIHNoYWRlciBvdXRwdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZWVkcyBjb21wb25lbnQgbGltaXQgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVDoKKyAgICAgICAgICAgIGlmIChudW1Db21wSW4gPiBsaW1pdHMubWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cykgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBpcGVsaW5lLT5waXBlbGluZSksIGtWVUlEX0NvcmVfU2hhZGVyX0V4Y2VlZERldmljZUxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaXBlbGluZSBDcmVhdGVJbmZvIFN0YXRlOiBUZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXIgZXhjZWVkcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzIG9mICV1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudHMgYnkgJXUgY29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cy5tYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db21wSW4gLSBsaW1pdHMubWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4Q29tcEluID4gKGludClsaW1pdHMubWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cykgeworICAgICAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfRXhjZWVkRGV2aWNlTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc2hhZGVyIGlucHV0IHZhcmlhYmxlIHVzZXMgbG9jYXRpb24gdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VlZHMgY29tcG9uZW50IGxpbWl0IFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dENvbXBvbmVudHMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dENvbXBvbmVudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bUNvbXBPdXQgPiBsaW1pdHMubWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX1NoYWRlcl9FeGNlZWREZXZpY2VMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogVGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc2hhZGVyIGV4Y2VlZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMgb2YgJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50cyBieSAldSBjb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db21wT3V0IC0gbGltaXRzLm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhDb21wT3V0ID4gKGludClsaW1pdHMubWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBpcGVsaW5lLT5waXBlbGluZSksIGtWVUlEX0NvcmVfU2hhZGVyX0V4Y2VlZERldmljZUxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IFRlc3NlbGxhdGlvbiBldmFsdWF0aW9uIHNoYWRlciBvdXRwdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZWVkcyBjb21wb25lbnQgbGltaXQgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVDoKKyAgICAgICAgICAgIGlmIChudW1Db21wSW4gPiBsaW1pdHMubWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX1NoYWRlcl9FeGNlZWREZXZpY2VMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogR2VvbWV0cnkgc2hhZGVyIGV4Y2VlZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMgb2YgJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50cyBieSAldSBjb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzLCBudW1Db21wSW4gLSBsaW1pdHMubWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1heENvbXBJbiA+IChpbnQpbGltaXRzLm1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfRXhjZWVkRGV2aWNlTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IEdlb21ldHJ5IHNoYWRlciBpbnB1dCB2YXJpYWJsZSB1c2VzIGxvY2F0aW9uIHRoYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZWVkcyBjb21wb25lbnQgbGltaXQgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cy5tYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtQ29tcE91dCA+IGxpbWl0cy5tYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX1NoYWRlcl9FeGNlZWREZXZpY2VMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogR2VvbWV0cnkgc2hhZGVyIGV4Y2VlZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIG9mICV1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudHMgYnkgJXUgY29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cy5tYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMsIG51bUNvbXBPdXQgLSBsaW1pdHMubWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhDb21wT3V0ID4gKGludClsaW1pdHMubWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfRXhjZWVkRGV2aWNlTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IEdlb21ldHJ5IHNoYWRlciBvdXRwdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VlZHMgY29tcG9uZW50IGxpbWl0IFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtQ29tcE91dCAqIG51bVZlcnRpY2VzID4gbGltaXRzLm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfRXhjZWVkRGV2aWNlTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IEdlb21ldHJ5IHNoYWRlciBleGNlZWRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzIG9mICV1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudHMgYnkgJXUgY29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cy5tYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ29tcE91dCAqIG51bVZlcnRpY2VzIC0gbGltaXRzLm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDoKKyAgICAgICAgICAgIGlmIChudW1Db21wSW4gPiBsaW1pdHMubWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwaXBlbGluZS0+cGlwZWxpbmUpLCBrVlVJRF9Db3JlX1NoYWRlcl9FeGNlZWREZXZpY2VMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGlwZWxpbmUgQ3JlYXRlSW5mbyBTdGF0ZTogRnJhZ21lbnQgc2hhZGVyIGV4Y2VlZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMgb2YgJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50cyBieSAldSBjb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzLm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzLCBudW1Db21wSW4gLSBsaW1pdHMubWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1heENvbXBJbiA+IChpbnQpbGltaXRzLm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfRXhjZWVkRGV2aWNlTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IEZyYWdtZW50IHNoYWRlciBpbnB1dCB2YXJpYWJsZSB1c2VzIGxvY2F0aW9uIHRoYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZWVkcyBjb21wb25lbnQgbGltaXQgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cy5tYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WOgorICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OVjoKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WOgorICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OVjoKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OVjoKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfQ0FMTEFCTEVfQklUX05WOgorICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OVjoKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlY6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworLy8gY29weSB0aGUgc3BlY2lhbGl6YXRpb24gY29uc3RhbnQgdmFsdWUgaW50byBidWYsIGlmIGl0IGlzIHByZXNlbnQKK3ZvaWQgR2V0U3BlY0NvbnN0YW50VmFsdWUoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBjb25zdCAqcFN0YWdlLCB1aW50MzJfdCBzcGVjX2lkLCB2b2lkICpidWYpIHsKKyAgICBWa1NwZWNpYWxpemF0aW9uSW5mbyBjb25zdCAqc3BlYyA9IHBTdGFnZS0+cFNwZWNpYWxpemF0aW9uSW5mbzsKKworICAgIGlmIChzcGVjICYmIHNwZWNfaWQgPCBzcGVjLT5tYXBFbnRyeUNvdW50KSB7CisgICAgICAgIG1lbWNweShidWYsICh1aW50OF90ICopc3BlYy0+cERhdGEgKyBzcGVjLT5wTWFwRW50cmllc1tzcGVjX2lkXS5vZmZzZXQsIHNwZWMtPnBNYXBFbnRyaWVzW3NwZWNfaWRdLnNpemUpOworICAgIH0KK30KKworLy8gRmlsbCBpbiB2YWx1ZSB3aXRoIHRoZSBjb25zdGFudCBvciBzcGVjaWFsaXphdGlvbiBjb25zdGFudCB2YWx1ZSwgaWYgYXZhaWxhYmxlLgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBoYXMgYmVlbiBhY2N1cmF0ZWx5IGZpbGxlZCBvdXQuCitzdGF0aWMgYm9vbCBHZXRJbnRDb25zdGFudFZhbHVlKHNwaXJ2X2luc3RfaXRlciBpbnNuLCBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gY29uc3QgKnBTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCB1aW50MzJfdD4gJmlkX3RvX3NwZWNfaWQsIHVpbnQzMl90ICp2YWx1ZSkgeworICAgIGF1dG8gdHlwZV9pZCA9IHNyYy0+Z2V0X2RlZihpbnNuLndvcmQoMSkpOworICAgIGlmICh0eXBlX2lkLm9wY29kZSgpICE9IHNwdjo6T3BUeXBlSW50IHx8IHR5cGVfaWQud29yZCgyKSAhPSAzMikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN3aXRjaCAoaW5zbi5vcGNvZGUoKSkgeworICAgICAgICBjYXNlIHNwdjo6T3BTcGVjQ29uc3RhbnQ6CisgICAgICAgICAgICAqdmFsdWUgPSBpbnNuLndvcmQoMyk7CisgICAgICAgICAgICBHZXRTcGVjQ29uc3RhbnRWYWx1ZShwU3RhZ2UsIGlkX3RvX3NwZWNfaWQuYXQoaW5zbi53b3JkKDIpKSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2Ugc3B2OjpPcENvbnN0YW50OgorICAgICAgICAgICAgKnZhbHVlID0gaW5zbi53b3JkKDMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvLyBNYXAgU1BJUi1WIHR5cGUgdG8gVktfQ09NUE9ORU5UX1RZUEUgZW51bQorVmtDb21wb25lbnRUeXBlTlYgR2V0Q29tcG9uZW50VHlwZShzcGlydl9pbnN0X2l0ZXIgaW5zbiwgU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjKSB7CisgICAgc3dpdGNoIChpbnNuLm9wY29kZSgpKSB7CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVJbnQ6CisgICAgICAgICAgICBzd2l0Y2ggKGluc24ud29yZCgyKSkgeworICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc24ud29yZCgzKSAhPSAwID8gVktfQ09NUE9ORU5UX1RZUEVfU0lOVDhfTlYgOiBWS19DT01QT05FTlRfVFlQRV9VSU5UOF9OVjsKKyAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zbi53b3JkKDMpICE9IDAgPyBWS19DT01QT05FTlRfVFlQRV9TSU5UMTZfTlYgOiBWS19DT01QT05FTlRfVFlQRV9VSU5UMTZfTlY7CisgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc24ud29yZCgzKSAhPSAwID8gVktfQ09NUE9ORU5UX1RZUEVfU0lOVDMyX05WIDogVktfQ09NUE9ORU5UX1RZUEVfVUlOVDMyX05WOworICAgICAgICAgICAgICAgIGNhc2UgNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnNuLndvcmQoMykgIT0gMCA/IFZLX0NPTVBPTkVOVF9UWVBFX1NJTlQ2NF9OViA6IFZLX0NPTVBPTkVOVF9UWVBFX1VJTlQ2NF9OVjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfQ09NUE9ORU5UX1RZUEVfTUFYX0VOVU1fTlY7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVGbG9hdDoKKyAgICAgICAgICAgIHN3aXRjaCAoaW5zbi53b3JkKDIpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUMTZfTlY7CisgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUMzJfTlY7CisgICAgICAgICAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0NPTVBPTkVOVF9UWVBFX0ZMT0FUNjRfTlY7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0NPTVBPTkVOVF9UWVBFX01BWF9FTlVNX05WOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFZLX0NPTVBPTkVOVF9UWVBFX01BWF9FTlVNX05WOworICAgIH0KK30KKworLy8gVmFsaWRhdGUgU1BWX05WX2Nvb3BlcmF0aXZlX21hdHJpeCBiZWhhdmlvciB0aGF0IGNhbid0IGJlIHN0YXRpY2FsbHkgdmFsaWRhdGVkCisvLyBpbiBTUElSVi1Ub29scyAoZS5nLiBkdWUgdG8gc3BlY2lhbGl6YXRpb24gY29uc3RhbnQgdXNhZ2UpLgorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZUNvb3BlcmF0aXZlTWF0cml4KFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QgKnNyYywgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBjb25zdCAqcFN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwaXBlbGluZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgLy8gTWFwIFNQSVItViByZXN1bHQgSUQgdG8gc3BlY2lhbGl6YXRpb24gY29uc3RhbnQgaWQgKFNwZWNJZCBkZWNvcmF0aW9uIHZhbHVlKQorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgdWludDMyX3Q+IGlkX3RvX3NwZWNfaWQ7CisgICAgLy8gTWFwIFNQSVItViByZXN1bHQgSUQgdG8gdGhlIElEIG9mIGl0cyB0eXBlLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgdWludDMyX3Q+IGlkX3RvX3R5cGVfaWQ7CisKKyAgICBzdHJ1Y3QgQ29vcE1hdFR5cGUgeworICAgICAgICB1aW50MzJfdCBzY29wZSwgcm93cywgY29sczsKKyAgICAgICAgVmtDb21wb25lbnRUeXBlTlYgY29tcG9uZW50X3R5cGU7CisgICAgICAgIGJvb2wgYWxsX2NvbnN0YW50OworCisgICAgICAgIENvb3BNYXRUeXBlKCkgOiBzY29wZSgwKSwgcm93cygwKSwgY29scygwKSwgY29tcG9uZW50X3R5cGUoVktfQ09NUE9ORU5UX1RZUEVfTUFYX0VOVU1fTlYpLCBhbGxfY29uc3RhbnQoZmFsc2UpIHt9CisKKyAgICAgICAgdm9pZCBJbml0KHVpbnQzMl90IGlkLCBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gY29uc3QgKnBTdGFnZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgdWludDMyX3Q+ICZpZF90b19zcGVjX2lkKSB7CisgICAgICAgICAgICBzcGlydl9pbnN0X2l0ZXIgaW5zbiA9IHNyYy0+Z2V0X2RlZihpZCk7CisgICAgICAgICAgICB1aW50MzJfdCBjb21wb25lbnRfdHlwZV9pZCA9IGluc24ud29yZCgyKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNjb3BlX2lkID0gaW5zbi53b3JkKDMpOworICAgICAgICAgICAgdWludDMyX3Qgcm93c19pZCA9IGluc24ud29yZCg0KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGNvbHNfaWQgPSBpbnNuLndvcmQoNSk7CisgICAgICAgICAgICBhdXRvIGNvbXBvbmVudF90eXBlX2l0ZXIgPSBzcmMtPmdldF9kZWYoY29tcG9uZW50X3R5cGVfaWQpOworICAgICAgICAgICAgYXV0byBzY29wZV9pdGVyID0gc3JjLT5nZXRfZGVmKHNjb3BlX2lkKTsKKyAgICAgICAgICAgIGF1dG8gcm93c19pdGVyID0gc3JjLT5nZXRfZGVmKHJvd3NfaWQpOworICAgICAgICAgICAgYXV0byBjb2xzX2l0ZXIgPSBzcmMtPmdldF9kZWYoY29sc19pZCk7CisKKyAgICAgICAgICAgIGFsbF9jb25zdGFudCA9IHRydWU7CisgICAgICAgICAgICBpZiAoIUdldEludENvbnN0YW50VmFsdWUoc2NvcGVfaXRlciwgc3JjLCBwU3RhZ2UsIGlkX3RvX3NwZWNfaWQsICZzY29wZSkpIHsKKyAgICAgICAgICAgICAgICBhbGxfY29uc3RhbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghR2V0SW50Q29uc3RhbnRWYWx1ZShyb3dzX2l0ZXIsIHNyYywgcFN0YWdlLCBpZF90b19zcGVjX2lkLCAmcm93cykpIHsKKyAgICAgICAgICAgICAgICBhbGxfY29uc3RhbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghR2V0SW50Q29uc3RhbnRWYWx1ZShjb2xzX2l0ZXIsIHNyYywgcFN0YWdlLCBpZF90b19zcGVjX2lkLCAmY29scykpIHsKKyAgICAgICAgICAgICAgICBhbGxfY29uc3RhbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBvbmVudF90eXBlID0gR2V0Q29tcG9uZW50VHlwZShjb21wb25lbnRfdHlwZV9pdGVyLCBzcmMpOworICAgICAgICB9CisgICAgfTsKKworICAgIGJvb2wgc2Vlbl9jb29wbWF0X2NhcGFiaWxpdHkgPSBmYWxzZTsKKworICAgIGZvciAoYXV0byBpbnNuIDogKnNyYykgeworICAgICAgICAvLyBXaGl0ZWxpc3QgaW5zdHJ1Y3Rpb25zIHdob3NlIHJlc3VsdCBjYW4gYmUgYSBjb29wZXJhdGl2ZSBtYXRyaXggdHlwZSwgYW5kCisgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlaXIgdHlwZXMuIEl0IHdvdWxkIGJlIG5pY2UgaWYgU1BJUlYtSGVhZGVycyBnZW5lcmF0ZWQgY29kZQorICAgICAgICAvLyB0byBpZGVudGlmeSB3aGljaCBpbnN0cnVjdGlvbnMgaGF2ZSBhIHJlc3VsdCB0eXBlIGFuZCByZXN1bHQgaWQuIExhY2tpbmcgdGhhdCwKKyAgICAgICAgLy8gdGhpcyB3aGl0ZWxpc3QgaXMgYmFzZWQgb24gdGhlIHNldCBvZiBpbnN0cnVjdGlvbnMgdGhhdAorICAgICAgICAvLyBTUFZfTlZfY29vcGVyYXRpdmVfbWF0cml4IHNheXMgY2FuIGJlIHVzZWQgd2l0aCBjb29wZXJhdGl2ZSBtYXRyaXggdHlwZXMuCisgICAgICAgIHN3aXRjaCAoaW5zbi5vcGNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBzcHY6Ok9wTG9hZDoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcENvb3BlcmF0aXZlTWF0cml4TG9hZE5WOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQ29vcGVyYXRpdmVNYXRyaXhNdWxBZGROVjoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFNOZWdhdGU6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BGTmVnYXRlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wSUFkZDoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEZBZGQ6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BJU3ViOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wRlN1YjoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEZEaXY6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BTRGl2OgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVURpdjoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcE1hdHJpeFRpbWVzU2NhbGFyOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQ29uc3RhbnRDb21wb3NpdGU6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BDb21wb3NpdGVDb25zdHJ1Y3Q6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BDb252ZXJ0RlRvVToKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcENvbnZlcnRGVG9TOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQ29udmVydFNUb0Y6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BDb252ZXJ0VVRvRjoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFVDb252ZXJ0OgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wU0NvbnZlcnQ6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BGQ29udmVydDoKKyAgICAgICAgICAgICAgICBpZF90b190eXBlX2lkW2luc24ud29yZCgyKV0gPSBpbnNuLndvcmQoMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChpbnNuLm9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BEZWNvcmF0ZToKKyAgICAgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDIpID09IHNwdjo6RGVjb3JhdGlvblNwZWNJZCkgeworICAgICAgICAgICAgICAgICAgICBpZF90b19zcGVjX2lkW2luc24ud29yZCgxKV0gPSBpbnNuLndvcmQoMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQ2FwYWJpbGl0eToKKyAgICAgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDEpID09IHNwdjo6Q2FwYWJpbGl0eUNvb3BlcmF0aXZlTWF0cml4TlYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vlbl9jb29wbWF0X2NhcGFiaWxpdHkgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmICghKHBTdGFnZS0+c3RhZ2UgJiBwaHlzX2Rldl9leHRfcHJvcHMuY29vcGVyYXRpdmVfbWF0cml4X3Byb3BzLmNvb3BlcmF0aXZlTWF0cml4U3VwcG9ydGVkU3RhZ2VzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfQ29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3BUeXBlQ29vcGVyYXRpdmVNYXRyaXhOViB1c2VkIGluIHNoYWRlciBzdGFnZSBub3QgaW4gY29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXMgKD0gJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X2V4dF9wcm9wcy5jb29wZXJhdGl2ZV9tYXRyaXhfcHJvcHMuY29vcGVyYXRpdmVNYXRyaXhTdXBwb3J0ZWRTdGFnZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzcHY6Ok9wTWVtb3J5TW9kZWw6CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhcGFiaWxpdHkgaXNuJ3QgZW5hYmxlZCwgZG9uJ3QgYm90aGVyIHdpdGggdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBPcE1lbW9yeU1vZGVsIGlzIHRoZSBmaXJzdCByZXF1aXJlZCBpbnN0cnVjdGlvbiBhZnRlciBhbGwgT3BDYXBhYmlsaXR5IGluc3RydWN0aW9ucy4KKyAgICAgICAgICAgICAgICBpZiAoIXNlZW5fY29vcG1hdF9jYXBhYmlsaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBza2lwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFR5cGVDb29wZXJhdGl2ZU1hdHJpeE5WOiB7CisgICAgICAgICAgICAgICAgQ29vcE1hdFR5cGUgTTsKKyAgICAgICAgICAgICAgICBNLkluaXQoaW5zbi53b3JkKDEpLCBzcmMsIHBTdGFnZSwgaWRfdG9fc3BlY19pZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoTS5hbGxfY29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHlwZSBwYXJhbWV0ZXJzIGFyZSBhbGwgc3VwcG9ydGVkIGZvciBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhbmRzIG9mIGEgY29vcGVyYXRpdmUgbWF0cml4IHByb3BlcnR5LgorICAgICAgICAgICAgICAgICAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLkFUeXBlID09IE0uY29tcG9uZW50X3R5cGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5NU2l6ZSA9PSBNLnJvd3MgJiYgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uS1NpemUgPT0gTS5jb2xzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uc2NvcGUgPT0gTS5zY29wZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5CVHlwZSA9PSBNLmNvbXBvbmVudF90eXBlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uS1NpemUgPT0gTS5yb3dzICYmIGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLk5TaXplID09IE0uY29scyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLnNjb3BlID09IE0uc2NvcGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uQ1R5cGUgPT0gTS5jb21wb25lbnRfdHlwZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLk1TaXplID09IE0ucm93cyAmJiBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5OU2l6ZSA9PSBNLmNvbHMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5zY29wZSA9PSBNLnNjb3BlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLkRUeXBlID09IE0uY29tcG9uZW50X3R5cGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5NU2l6ZSA9PSBNLnJvd3MgJiYgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uTlNpemUgPT0gTS5jb2xzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uc2NvcGUgPT0gTS5zY29wZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBpcGVsaW5lLT5waXBlbGluZSksIGtWVUlEX0NvcmVfU2hhZGVyX0Nvb3BlcmF0aXZlTWF0cml4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3BUeXBlQ29vcGVyYXRpdmVNYXRyaXhOViAocmVzdWx0IGlkID0gJXUpIG9wZXJhbmRzIGRvbid0IG1hdGNoIGEgc3VwcG9ydGVkIG1hdHJpeCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuLndvcmQoMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQ29vcGVyYXRpdmVNYXRyaXhNdWxBZGROVjogeworICAgICAgICAgICAgICAgIENvb3BNYXRUeXBlIEEsIEIsIEMsIEQ7CisgICAgICAgICAgICAgICAgaWYgKGlkX3RvX3R5cGVfaWQuZmluZChpbnNuLndvcmQoMikpID09IGlkX3RvX3R5cGVfaWQuZW5kKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgaWRfdG9fdHlwZV9pZC5maW5kKGluc24ud29yZCgzKSkgPT0gaWRfdG9fdHlwZV9pZC5lbmQoKSB8fAorICAgICAgICAgICAgICAgICAgICBpZF90b190eXBlX2lkLmZpbmQoaW5zbi53b3JkKDQpKSA9PSBpZF90b190eXBlX2lkLmVuZCgpIHx8CisgICAgICAgICAgICAgICAgICAgIGlkX3RvX3R5cGVfaWQuZmluZChpbnNuLndvcmQoNSkpID09IGlkX3RvX3R5cGVfaWQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ291bGRuJ3QgZmluZCB0eXBlIG9mIG1hdHJpeAorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRC5Jbml0KGlkX3RvX3R5cGVfaWRbaW5zbi53b3JkKDIpXSwgc3JjLCBwU3RhZ2UsIGlkX3RvX3NwZWNfaWQpOworICAgICAgICAgICAgICAgIEEuSW5pdChpZF90b190eXBlX2lkW2luc24ud29yZCgzKV0sIHNyYywgcFN0YWdlLCBpZF90b19zcGVjX2lkKTsKKyAgICAgICAgICAgICAgICBCLkluaXQoaWRfdG9fdHlwZV9pZFtpbnNuLndvcmQoNCldLCBzcmMsIHBTdGFnZSwgaWRfdG9fc3BlY19pZCk7CisgICAgICAgICAgICAgICAgQy5Jbml0KGlkX3RvX3R5cGVfaWRbaW5zbi53b3JkKDUpXSwgc3JjLCBwU3RhZ2UsIGlkX3RvX3NwZWNfaWQpOworCisgICAgICAgICAgICAgICAgaWYgKEEuYWxsX2NvbnN0YW50ICYmIEIuYWxsX2NvbnN0YW50ICYmIEMuYWxsX2NvbnN0YW50ICYmIEQuYWxsX2NvbnN0YW50KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHR5cGUgcGFyYW1ldGVycyBhcmUgYWxsIHN1cHBvcnRlZCBmb3IgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgLy8gY29vcGVyYXRpdmUgbWF0cml4IHByb3BlcnR5LgorICAgICAgICAgICAgICAgICAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLkFUeXBlID09IEEuY29tcG9uZW50X3R5cGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5NU2l6ZSA9PSBBLnJvd3MgJiYgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uS1NpemUgPT0gQS5jb2xzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uc2NvcGUgPT0gQS5zY29wZSAmJgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uQlR5cGUgPT0gQi5jb21wb25lbnRfdHlwZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLktTaXplID09IEIucm93cyAmJiBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5OU2l6ZSA9PSBCLmNvbHMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5zY29wZSA9PSBCLnNjb3BlICYmCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5DVHlwZSA9PSBDLmNvbXBvbmVudF90eXBlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uTVNpemUgPT0gQy5yb3dzICYmIGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLk5TaXplID09IEMuY29scyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLnNjb3BlID09IEMuc2NvcGUgJiYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzW2ldLkRUeXBlID09IEQuY29tcG9uZW50X3R5cGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcGVydGllc1tpXS5NU2l6ZSA9PSBELnJvd3MgJiYgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uTlNpemUgPT0gRC5jb2xzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXNbaV0uc2NvcGUgPT0gRC5zY29wZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHBpcGVsaW5lLT5waXBlbGluZSksIGtWVUlEX0NvcmVfU2hhZGVyX0Nvb3BlcmF0aXZlTWF0cml4TXVsQWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcENvb3BlcmF0aXZlTWF0cml4TXVsQWRkTlYgKHJlc3VsdCBpZCA9ICV1KSBvcGVyYW5kcyBkb24ndCBtYXRjaCBhIHN1cHBvcnRlZCBtYXRyaXggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa0Nvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuLndvcmQoMikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlRXhlY3V0aW9uTW9kZXMoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCBzcGlydl9pbnN0X2l0ZXIgZW50cnlwb2ludCkgY29uc3QgeworICAgIGF1dG8gZW50cnlwb2ludF9pZCA9IGVudHJ5cG9pbnQud29yZCgyKTsKKworICAgIC8vIFRoZSBmaXJzdCBkZW5vcm0gZXhlY3V0aW9uIG1vZGUgZW5jb3VudGVyZWQsIGFsb25nIHdpdGggaXRzIGJpdCB3aWR0aC4KKyAgICAvLyBVc2VkIHRvIGNoZWNrIGlmIFNlcGFyYXRlRGVub3JtU2V0dGluZ3MgaXMgcmVzcGVjdGVkLgorICAgIHN0ZDo6cGFpcjxzcHY6OkV4ZWN1dGlvbk1vZGUsIHVpbnQzMl90PiBmaXJzdF9kZW5vcm1fZXhlY3V0aW9uX21vZGUgPSBzdGQ6Om1ha2VfcGFpcihzcHY6OkV4ZWN1dGlvbk1vZGVNYXgsIDApOworCisgICAgLy8gVGhlIGZpcnN0IHJvdW5kaW5nIG1vZGUgZW5jb3VudGVyZWQsIGFsb25nIHdpdGggaXRzIGJpdCB3aWR0aC4KKyAgICAvLyBVc2VkIHRvIGNoZWNrIGlmIFNlcGFyYXRlUm91bmRpbmdNb2RlU2V0dGluZ3MgaXMgcmVzcGVjdGVkLgorICAgIHN0ZDo6cGFpcjxzcHY6OkV4ZWN1dGlvbk1vZGUsIHVpbnQzMl90PiBmaXJzdF9yb3VuZGluZ19tb2RlID0gc3RkOjptYWtlX3BhaXIoc3B2OjpFeGVjdXRpb25Nb2RlTWF4LCAwKTsKKworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgdWludDMyX3QgdmVydGljZXNPdXQgPSAwOworICAgIHVpbnQzMl90IGludm9jYXRpb25zID0gMDsKKworICAgIGZvciAoYXV0byBpbnNuIDogKnNyYykgeworICAgICAgICBpZiAoaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wRXhlY3V0aW9uTW9kZSAmJiBpbnNuLndvcmQoMSkgPT0gZW50cnlwb2ludF9pZCkgeworICAgICAgICAgICAgYXV0byBtb2RlID0gaW5zbi53b3JkKDIpOworICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVTaWduZWRaZXJvSW5mTmFuUHJlc2VydmU6IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBiaXRfd2lkdGggPSBpbnNuLndvcmQoMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYml0X3dpZHRoID09IDE2ICYmICFwaHlzX2Rldl9leHRfcHJvcHMuZmxvYXRfY29udHJvbHNfcHJvcHMuc2hhZGVyU2lnbmVkWmVyb0luZk5hblByZXNlcnZlRmxvYXQxNikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfd2lkdGggPT0gMzIgJiYgIXBoeXNfZGV2X2V4dF9wcm9wcy5mbG9hdF9jb250cm9sc19wcm9wcy5zaGFkZXJTaWduZWRaZXJvSW5mTmFuUHJlc2VydmVGbG9hdDMyKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF93aWR0aCA9PSA2NCAmJiAhcGh5c19kZXZfZXh0X3Byb3BzLmZsb2F0X2NvbnRyb2xzX3Byb3BzLnNoYWRlclNpZ25lZFplcm9JbmZOYW5QcmVzZXJ2ZUZsb2F0NjQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciByZXF1aXJlcyBTaWduZWRaZXJvSW5mTmFuUHJlc2VydmUgZm9yIGJpdCB3aWR0aCAlZCBidXQgaXQgaXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlRGVub3JtUHJlc2VydmU6IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBiaXRfd2lkdGggPSBpbnNuLndvcmQoMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYml0X3dpZHRoID09IDE2ICYmICFwaHlzX2Rldl9leHRfcHJvcHMuZmxvYXRfY29udHJvbHNfcHJvcHMuc2hhZGVyRGVub3JtUHJlc2VydmVGbG9hdDE2KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF93aWR0aCA9PSAzMiAmJiAhcGh5c19kZXZfZXh0X3Byb3BzLmZsb2F0X2NvbnRyb2xzX3Byb3BzLnNoYWRlckRlbm9ybVByZXNlcnZlRmxvYXQzMikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfd2lkdGggPT0gNjQgJiYgIXBoeXNfZGV2X2V4dF9wcm9wcy5mbG9hdF9jb250cm9sc19wcm9wcy5zaGFkZXJEZW5vcm1QcmVzZXJ2ZUZsb2F0NjQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9TaGFkZXJfRmVhdHVyZU5vdEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciByZXF1aXJlcyBEZW5vcm1QcmVzZXJ2ZSBmb3IgYml0IHdpZHRoICVkIGJ1dCBpdCBpcyBub3QgZW5hYmxlZCBvbiB0aGUgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X2Rlbm9ybV9leGVjdXRpb25fbW9kZS5maXJzdCA9PSBzcHY6OkV4ZWN1dGlvbk1vZGVNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBmaXJzdCBkZW5vcm0gZXhlY3V0aW9uIG1vZGUgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2Rlbm9ybV9leGVjdXRpb25fbW9kZSA9IHN0ZDo6bWFrZV9wYWlyKHN0YXRpY19jYXN0PHNwdjo6RXhlY3V0aW9uTW9kZT4obW9kZSksIGJpdF93aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RfZGVub3JtX2V4ZWN1dGlvbl9tb2RlLmZpcnN0ICE9IG1vZGUgJiYgZmlyc3RfZGVub3JtX2V4ZWN1dGlvbl9tb2RlLnNlY29uZCAhPSBiaXRfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGh5c19kZXZfZXh0X3Byb3BzLmZsb2F0X2NvbnRyb2xzX3Byb3BzLmRlbm9ybUJlaGF2aW9ySW5kZXBlbmRlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFXzMyX0JJVF9PTkxZX0tIUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X3JvdW5kaW5nX21vZGUuc2Vjb25kICE9IDMyICYmIGJpdF93aWR0aCAhPSAzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIGtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGFkZXIgdXNlcyBkaWZmZXJlbnQgZGVub3JtIGV4ZWN1dGlvbiBtb2RlcyBmb3IgMTYgYW5kIDY0LWJpdCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfMzJfQklUX09OTFlfS0hSIG9uIHRoZSBkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9BTExfS0hSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9OT05FX0tIUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwga1ZVSURfQ29yZV9TaGFkZXJfRmVhdHVyZU5vdEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hhZGVyIHVzZXMgZGlmZmVyZW50IGRlbm9ybSBleGVjdXRpb24gbW9kZXMgZm9yIGRpZmZlcmVudCBiaXQgd2lkdGhzIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVub3JtQmVoYXZpb3JJbmRlcGVuZGVuY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfTk9ORV9LSFIgb24gdGhlIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlRGVub3JtRmx1c2hUb1plcm86IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBiaXRfd2lkdGggPSBpbnNuLndvcmQoMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYml0X3dpZHRoID09IDE2ICYmICFwaHlzX2Rldl9leHRfcHJvcHMuZmxvYXRfY29udHJvbHNfcHJvcHMuc2hhZGVyRGVub3JtRmx1c2hUb1plcm9GbG9hdDE2KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF93aWR0aCA9PSAzMiAmJiAhcGh5c19kZXZfZXh0X3Byb3BzLmZsb2F0X2NvbnRyb2xzX3Byb3BzLnNoYWRlckRlbm9ybUZsdXNoVG9aZXJvRmxvYXQzMikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfd2lkdGggPT0gNjQgJiYgIXBoeXNfZGV2X2V4dF9wcm9wcy5mbG9hdF9jb250cm9sc19wcm9wcy5zaGFkZXJEZW5vcm1GbHVzaFRvWmVyb0Zsb2F0NjQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9TaGFkZXJfRmVhdHVyZU5vdEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciByZXF1aXJlcyBEZW5vcm1GbHVzaFRvWmVybyBmb3IgYml0IHdpZHRoICVkIGJ1dCBpdCBpcyBub3QgZW5hYmxlZCBvbiB0aGUgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X2Rlbm9ybV9leGVjdXRpb25fbW9kZS5maXJzdCA9PSBzcHY6OkV4ZWN1dGlvbk1vZGVNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBmaXJzdCBkZW5vcm0gZXhlY3V0aW9uIG1vZGUgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2Rlbm9ybV9leGVjdXRpb25fbW9kZSA9IHN0ZDo6bWFrZV9wYWlyKHN0YXRpY19jYXN0PHNwdjo6RXhlY3V0aW9uTW9kZT4obW9kZSksIGJpdF93aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RfZGVub3JtX2V4ZWN1dGlvbl9tb2RlLmZpcnN0ICE9IG1vZGUgJiYgZmlyc3RfZGVub3JtX2V4ZWN1dGlvbl9tb2RlLnNlY29uZCAhPSBiaXRfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGh5c19kZXZfZXh0X3Byb3BzLmZsb2F0X2NvbnRyb2xzX3Byb3BzLmRlbm9ybUJlaGF2aW9ySW5kZXBlbmRlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFXzMyX0JJVF9PTkxZX0tIUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X3JvdW5kaW5nX21vZGUuc2Vjb25kICE9IDMyICYmIGJpdF93aWR0aCAhPSAzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIGtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGFkZXIgdXNlcyBkaWZmZXJlbnQgZGVub3JtIGV4ZWN1dGlvbiBtb2RlcyBmb3IgMTYgYW5kIDY0LWJpdCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZW5vcm1CZWhhdmlvckluZGVwZW5kZW5jZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfMzJfQklUX09OTFlfS0hSIG9uIHRoZSBkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9BTExfS0hSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX0ZMT0FUX0NPTlRST0xTX0lOREVQRU5ERU5DRV9OT05FX0tIUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwga1ZVSURfQ29yZV9TaGFkZXJfRmVhdHVyZU5vdEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hhZGVyIHVzZXMgZGlmZmVyZW50IGRlbm9ybSBleGVjdXRpb24gbW9kZXMgZm9yIGRpZmZlcmVudCBiaXQgd2lkdGhzIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVub3JtQmVoYXZpb3JJbmRlcGVuZGVuY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfTk9ORV9LSFIgb24gdGhlIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlUm91bmRpbmdNb2RlUlRFOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYml0X3dpZHRoID0gaW5zbi53b3JkKDMpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGJpdF93aWR0aCA9PSAxNiAmJiAhcGh5c19kZXZfZXh0X3Byb3BzLmZsb2F0X2NvbnRyb2xzX3Byb3BzLnNoYWRlclJvdW5kaW5nTW9kZVJURUZsb2F0MTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoYml0X3dpZHRoID09IDMyICYmICFwaHlzX2Rldl9leHRfcHJvcHMuZmxvYXRfY29udHJvbHNfcHJvcHMuc2hhZGVyUm91bmRpbmdNb2RlUlRFRmxvYXQzMikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfd2lkdGggPT0gNjQgJiYgIXBoeXNfZGV2X2V4dF9wcm9wcy5mbG9hdF9jb250cm9sc19wcm9wcy5zaGFkZXJSb3VuZGluZ01vZGVSVEVGbG9hdDY0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGFkZXIgcmVxdWlyZXMgUm91bmRpbmdNb2RlUlRFIGZvciBiaXQgd2lkdGggJWQgYnV0IGl0IGlzIG5vdCBlbmFibGVkIG9uIHRoZSBkZXZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3Rfcm91bmRpbmdfbW9kZS5maXJzdCA9PSBzcHY6OkV4ZWN1dGlvbk1vZGVNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBmaXJzdCByb3VuZGluZyBtb2RlIGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9yb3VuZGluZ19tb2RlID0gc3RkOjptYWtlX3BhaXIoc3RhdGljX2Nhc3Q8c3B2OjpFeGVjdXRpb25Nb2RlPihtb2RlKSwgYml0X3dpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdF9yb3VuZGluZ19tb2RlLmZpcnN0ICE9IG1vZGUgJiYgZmlyc3Rfcm91bmRpbmdfbW9kZS5zZWNvbmQgIT0gYml0X3dpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoeXNfZGV2X2V4dF9wcm9wcy5mbG9hdF9jb250cm9sc19wcm9wcy5yb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfMzJfQklUX09OTFlfS0hSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3Rfcm91bmRpbmdfbW9kZS5zZWNvbmQgIT0gMzIgJiYgYml0X3dpZHRoICE9IDMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwga1ZVSURfQ29yZV9TaGFkZXJfRmVhdHVyZU5vdEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciB1c2VzIGRpZmZlcmVudCByb3VuZGluZyBtb2RlcyBmb3IgMTYgYW5kIDY0LWJpdCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFXzMyX0JJVF9PTkxZX0tIUiBvbiB0aGUgZGV2aWNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfQUxMX0tIUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfTk9ORV9LSFI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciB1c2VzIGRpZmZlcmVudCByb3VuZGluZyBtb2RlcyBmb3IgZGlmZmVyZW50IGJpdCB3aWR0aHMgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfTk9ORV9LSFIgb24gdGhlIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlUm91bmRpbmdNb2RlUlRaOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYml0X3dpZHRoID0gaW5zbi53b3JkKDMpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGJpdF93aWR0aCA9PSAxNiAmJiAhcGh5c19kZXZfZXh0X3Byb3BzLmZsb2F0X2NvbnRyb2xzX3Byb3BzLnNoYWRlclJvdW5kaW5nTW9kZVJUWkZsb2F0MTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoYml0X3dpZHRoID09IDMyICYmICFwaHlzX2Rldl9leHRfcHJvcHMuZmxvYXRfY29udHJvbHNfcHJvcHMuc2hhZGVyUm91bmRpbmdNb2RlUlRaRmxvYXQzMikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfd2lkdGggPT0gNjQgJiYgIXBoeXNfZGV2X2V4dF9wcm9wcy5mbG9hdF9jb250cm9sc19wcm9wcy5zaGFkZXJSb3VuZGluZ01vZGVSVFpGbG9hdDY0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGFkZXIgcmVxdWlyZXMgUm91bmRpbmdNb2RlUlRaIGZvciBiaXQgd2lkdGggJWQgYnV0IGl0IGlzIG5vdCBlbmFibGVkIG9uIHRoZSBkZXZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3Rfcm91bmRpbmdfbW9kZS5maXJzdCA9PSBzcHY6OkV4ZWN1dGlvbk1vZGVNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBmaXJzdCByb3VuZGluZyBtb2RlIGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9yb3VuZGluZ19tb2RlID0gc3RkOjptYWtlX3BhaXIoc3RhdGljX2Nhc3Q8c3B2OjpFeGVjdXRpb25Nb2RlPihtb2RlKSwgYml0X3dpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdF9yb3VuZGluZ19tb2RlLmZpcnN0ICE9IG1vZGUgJiYgZmlyc3Rfcm91bmRpbmdfbW9kZS5zZWNvbmQgIT0gYml0X3dpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoeXNfZGV2X2V4dF9wcm9wcy5mbG9hdF9jb250cm9sc19wcm9wcy5yb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfMzJfQklUX09OTFlfS0hSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3Rfcm91bmRpbmdfbW9kZS5zZWNvbmQgIT0gMzIgJiYgYml0X3dpZHRoICE9IDMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwga1ZVSURfQ29yZV9TaGFkZXJfRmVhdHVyZU5vdEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciB1c2VzIGRpZmZlcmVudCByb3VuZGluZyBtb2RlcyBmb3IgMTYgYW5kIDY0LWJpdCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19TSEFERVJfRkxPQVRfQ09OVFJPTFNfSU5ERVBFTkRFTkNFXzMyX0JJVF9PTkxZX0tIUiBvbiB0aGUgZGV2aWNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfQUxMX0tIUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfTk9ORV9LSFI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGtWVUlEX0NvcmVfU2hhZGVyX0ZlYXR1cmVOb3RFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciB1c2VzIGRpZmZlcmVudCByb3VuZGluZyBtb2RlcyBmb3IgZGlmZmVyZW50IGJpdCB3aWR0aHMgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3VuZGluZ01vZGVJbmRlcGVuZGVuY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX1NIQURFUl9GTE9BVF9DT05UUk9MU19JTkRFUEVOREVOQ0VfTk9ORV9LSFIgb24gdGhlIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlT3V0cHV0VmVydGljZXM6IHsKKyAgICAgICAgICAgICAgICAgICAgdmVydGljZXNPdXQgPSBpbnNuLndvcmQoMyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlSW52b2NhdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbnMgPSBpbnNuLndvcmQoMyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlbnRyeXBvaW50LndvcmQoMSkgPT0gc3B2OjpFeGVjdXRpb25Nb2RlbEdlb21ldHJ5KSB7CisgICAgICAgIGlmICh2ZXJ0aWNlc091dCA9PSAwIHx8IHZlcnRpY2VzT3V0ID4gcGh5c19kZXZfcHJvcHMubGltaXRzLm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAwNzE0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VvbWV0cnkgc2hhZGVyIGVudHJ5IHBvaW50IG11c3QgaGF2ZSBhbiBPcEV4ZWN1dGlvbk1vZGUgaW5zdHJ1Y3Rpb24gdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllcyBhIG1heGltdW0gb3V0cHV0IHZlcnRleCBjb3VudCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiBvciBlcXVhbCB0byBtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dHB1dFZlcnRpY2VzPSVkLCBtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlc091dCwgcGh5c19kZXZfcHJvcHMubGltaXRzLm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludm9jYXRpb25zID09IDAgfHwgaW52b2NhdGlvbnMgPiBwaHlzX2Rldl9wcm9wcy5saW1pdHMubWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW9tZXRyeSBzaGFkZXIgZW50cnkgcG9pbnQgbXVzdCBoYXZlIGFuIE9wRXhlY3V0aW9uTW9kZSBpbnN0cnVjdGlvbiB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVzIGFuIGludm9jYXRpb24gY291bnQgdGhhdCBpcyBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gb3IgZXF1YWwgdG8gbWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZvY2F0aW9ucz0lZCwgbWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucz0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbnMsIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKwordWludDMyX3QgRGVzY3JpcHRvclR5cGVUb1JlcXMoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqbW9kdWxlLCB1aW50MzJfdCB0eXBlX2lkKSB7CisgICAgYXV0byB0eXBlID0gbW9kdWxlLT5nZXRfZGVmKHR5cGVfaWQpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlLm9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlQXJyYXk6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlUnVudGltZUFycmF5OgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVHlwZVNhbXBsZWRJbWFnZToKKyAgICAgICAgICAgICAgICB0eXBlID0gbW9kdWxlLT5nZXRfZGVmKHR5cGUud29yZCgyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlUG9pbnRlcjoKKyAgICAgICAgICAgICAgICB0eXBlID0gbW9kdWxlLT5nZXRfZGVmKHR5cGUud29yZCgzKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BUeXBlSW1hZ2U6IHsKKyAgICAgICAgICAgICAgICBhdXRvIGRpbSA9IHR5cGUud29yZCgzKTsKKyAgICAgICAgICAgICAgICBhdXRvIGFycmF5ZWQgPSB0eXBlLndvcmQoNSk7CisgICAgICAgICAgICAgICAgYXV0byBtc2FhID0gdHlwZS53b3JkKDYpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgYml0cyA9IDA7CisgICAgICAgICAgICAgICAgc3dpdGNoIChHZXRGdW5kYW1lbnRhbFR5cGUobW9kdWxlLCB0eXBlLndvcmQoMikpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRk9STUFUX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzID0gREVTQ1JJUFRPUl9SRVFfQ09NUE9ORU5UX1RZUEVfRkxPQVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGT1JNQVRfVFlQRV9VSU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IERFU0NSSVBUT1JfUkVRX0NPTVBPTkVOVF9UWVBFX1VJTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGT1JNQVRfVFlQRV9TSU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgYml0cyA9IERFU0NSSVBUT1JfUkVRX0NPTVBPTkVOVF9UWVBFX1NJTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoZGltKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpEaW0xRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgfD0gYXJyYXllZCA/IERFU0NSSVBUT1JfUkVRX1ZJRVdfVFlQRV8xRF9BUlJBWSA6IERFU0NSSVBUT1JfUkVRX1ZJRVdfVFlQRV8xRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRzOworICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6RGltMkQ6CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzIHw9IG1zYWEgPyBERVNDUklQVE9SX1JFUV9NVUxUSV9TQU1QTEUgOiBERVNDUklQVE9SX1JFUV9TSU5HTEVfU0FNUExFOworICAgICAgICAgICAgICAgICAgICAgICAgYml0cyB8PSBhcnJheWVkID8gREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFXzJEX0FSUkFZIDogREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFXzJEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpEaW0zRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgfD0gREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFXzNEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpEaW1DdWJlOgorICAgICAgICAgICAgICAgICAgICAgICAgYml0cyB8PSBhcnJheWVkID8gREVTQ1JJUFRPUl9SRVFfVklFV19UWVBFX0NVQkVfQVJSQVkgOiBERVNDUklQVE9SX1JFUV9WSUVXX1RZUEVfQ1VCRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRzOworICAgICAgICAgICAgICAgICAgICBjYXNlIHNwdjo6RGltU3VicGFzc0RhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzIHw9IG1zYWEgPyBERVNDUklQVE9SX1JFUV9NVUxUSV9TQU1QTEUgOiBERVNDUklQVE9SX1JFUV9TSU5HTEVfU0FNUExFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBidWZmZXIsIGV0Yy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEZvciBnaXZlbiBwaXBlbGluZUxheW91dCB2ZXJpZnkgdGhhdCB0aGUgc2V0X2xheW91dF9ub2RlIGF0IHNsb3QuZmlyc3QKKy8vICBoYXMgdGhlIHJlcXVlc3RlZCBiaW5kaW5nIGF0IHNsb3Quc2Vjb25kIGFuZCByZXR1cm4gcHRyIHRvIHRoYXQgYmluZGluZworc3RhdGljIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgY29uc3QgKkdldERlc2NyaXB0b3JCaW5kaW5nKFBJUEVMSU5FX0xBWU9VVF9TVEFURSBjb25zdCAqcGlwZWxpbmVMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9zbG90X3Qgc2xvdCkgeworICAgIGlmICghcGlwZWxpbmVMYXlvdXQpIHJldHVybiBudWxscHRyOworCisgICAgaWYgKHNsb3QuZmlyc3QgPj0gcGlwZWxpbmVMYXlvdXQtPnNldF9sYXlvdXRzLnNpemUoKSkgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gcGlwZWxpbmVMYXlvdXQtPnNldF9sYXlvdXRzW3Nsb3QuZmlyc3RdLT5HZXREZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ1B0ckZyb21CaW5kaW5nKHNsb3Quc2Vjb25kKTsKK30KKworc3RhdGljIGJvb2wgRmluZExvY2FsU2l6ZShTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIHVpbnQzMl90ICZsb2NhbF9zaXplX3gsIHVpbnQzMl90ICZsb2NhbF9zaXplX3ksIHVpbnQzMl90ICZsb2NhbF9zaXplX3opIHsKKyAgICBmb3IgKGF1dG8gaW5zbiA6ICpzcmMpIHsKKyAgICAgICAgaWYgKGluc24ub3Bjb2RlKCkgPT0gc3B2OjpPcEVudHJ5UG9pbnQpIHsKKyAgICAgICAgICAgIGF1dG8gZXhlY3V0aW9uTW9kZWwgPSBpbnNuLndvcmQoMSk7CisgICAgICAgICAgICBhdXRvIGVudHJ5cG9pbnRTdGFnZUJpdHMgPSBFeGVjdXRpb25Nb2RlbFRvU2hhZGVyU3RhZ2VGbGFnQml0cyhleGVjdXRpb25Nb2RlbCk7CisgICAgICAgICAgICBpZiAoZW50cnlwb2ludFN0YWdlQml0cyA9PSBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVudHJ5cG9pbnRfaWQgPSBpbnNuLndvcmQoMik7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGluc24xIDogKnNyYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbjEub3Bjb2RlKCkgPT0gc3B2OjpPcEV4ZWN1dGlvbk1vZGUgJiYgaW5zbjEud29yZCgxKSA9PSBlbnRyeXBvaW50X2lkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBpbnNuMS53b3JkKDIpID09IHNwdjo6RXhlY3V0aW9uTW9kZUxvY2FsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfc2l6ZV94ID0gaW5zbjEud29yZCgzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemVfeSA9IGluc24xLndvcmQoNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9zaXplX3ogPSBpbnNuMS53b3JkKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFByb2Nlc3NFeGVjdXRpb25Nb2RlcyhTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpzcmMsIGNvbnN0IHNwaXJ2X2luc3RfaXRlciAmZW50cnlwb2ludCwgUElQRUxJTkVfU1RBVEUgKnBpcGVsaW5lKSB7CisgICAgYXV0byBlbnRyeXBvaW50X2lkID0gZW50cnlwb2ludC53b3JkKDIpOworICAgIGJvb2wgaXNfcG9pbnRfbW9kZSA9IGZhbHNlOworCisgICAgZm9yIChhdXRvIGluc24gOiAqc3JjKSB7CisgICAgICAgIGlmIChpbnNuLm9wY29kZSgpID09IHNwdjo6T3BFeGVjdXRpb25Nb2RlICYmIGluc24ud29yZCgxKSA9PSBlbnRyeXBvaW50X2lkKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGluc24ud29yZCgyKSkgeworICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlUG9pbnRNb2RlOgorICAgICAgICAgICAgICAgICAgICAvLyBJbiB0ZXNzZWxsYXRpb24gc2hhZGVycywgUG9pbnRNb2RlIGlzIHNlcGFyYXRlIGFuZCB0cnVtcHMgdGhlIHRlc3NlbGxhdGlvbiB0b3BvbG9neS4KKyAgICAgICAgICAgICAgICAgICAgaXNfcG9pbnRfbW9kZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVPdXRwdXRQb2ludHM6CisgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLT50b3BvbG9neV9hdF9yYXN0ZXJpemVyID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BPSU5UX0xJU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVJc29saW5lczoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZU91dHB1dExpbmVTdHJpcDoKKyAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUtPnRvcG9sb2d5X2F0X3Jhc3Rlcml6ZXIgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZVRyaWFuZ2xlczoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZVF1YWRzOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlT3V0cHV0VHJpYW5nbGVTdHJpcDoKKyAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUtPnRvcG9sb2d5X2F0X3Jhc3Rlcml6ZXIgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfU1RSSVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX3BvaW50X21vZGUpIHBpcGVsaW5lLT50b3BvbG9neV9hdF9yYXN0ZXJpemVyID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BPSU5UX0xJU1Q7Cit9CisKKy8vIElmIFBvaW50TGlzdCB0b3BvbG9neSBpcyBzcGVjaWZpZWQgaW4gdGhlIHBpcGVsaW5lLCB2ZXJpZnkgdGhhdCBhIHNoYWRlciBnZW9tZXRyeSBzdGFnZSB3cml0ZXMgUG9pbnRTaXplCisvLyAgICBvIElmIHRoZXJlIGlzIG9ubHkgYSB2ZXJ0ZXggc2hhZGVyIDogZ2xfUG9pbnRTaXplIG11c3QgYmUgd3JpdHRlbiB3aGVuIHVzaW5nIHBvaW50cworLy8gICAgbyBJZiB0aGVyZSBpcyBhIGdlb21ldHJ5IG9yIHRlc3NlbGxhdGlvbiBzaGFkZXI6CisvLyAgICAgICAgLSBJZiBzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSBmZWF0dXJlIGlzIGVuYWJsZWQ6CisvLyAgICAgICAgICAgICogZ2xfUG9pbnRTaXplIG11c3QgYmUgd3JpdHRlbiBpbiB0aGUgZmluYWwgZ2VvbWV0cnkgc3RhZ2UKKy8vICAgICAgICAtIElmIHNoYWRlclRlc3NlbGxhdGlvbkFuZEdlb21ldHJ5UG9pbnRTaXplIGZlYXR1cmUgaXMgZGlzYWJsZWQ6CisvLyAgICAgICAgICAgICogZ2xfUG9pbnRTaXplIG11c3QgTk9UIGJlIHdyaXR0ZW4gYW5kIGEgZGVmYXVsdCBvZiAxLjAgaXMgYXNzdW1lZAorYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVBvaW50TGlzdFNoYWRlclN0YXRlKGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwaXBlbGluZSwgU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaXJ2X2luc3RfaXRlciBlbnRyeXBvaW50LCBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UpIGNvbnN0IHsKKyAgICBpZiAocGlwZWxpbmUtPnRvcG9sb2d5X2F0X3Jhc3Rlcml6ZXIgIT0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BPSU5UX0xJU1QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcG9pbnRzaXplX3dyaXR0ZW4gPSBmYWxzZTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIC8vIFNlYXJjaCBmb3IgUG9pbnRTaXplIGJ1aWx0LWluIGRlY29yYXRpb25zCisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHBvaW50c2l6ZV9idWlsdGluX29mZnNldHM7CisgICAgc3BpcnZfaW5zdF9pdGVyIGluc24gPSBlbnRyeXBvaW50OworICAgIHdoaWxlICghcG9pbnRzaXplX3dyaXR0ZW4gJiYgKGluc24ub3Bjb2RlKCkgIT0gc3B2OjpPcEZ1bmN0aW9uKSkgeworICAgICAgICBpZiAoaW5zbi5vcGNvZGUoKSA9PSBzcHY6Ok9wTWVtYmVyRGVjb3JhdGUpIHsKKyAgICAgICAgICAgIGlmIChpbnNuLndvcmQoMykgPT0gc3B2OjpEZWNvcmF0aW9uQnVpbHRJbikgeworICAgICAgICAgICAgICAgIGlmIChpbnNuLndvcmQoNCkgPT0gc3B2OjpCdWlsdEluUG9pbnRTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHBvaW50c2l6ZV93cml0dGVuID0gSXNQb2ludFNpemVXcml0dGVuKHNyYywgaW5zbiwgZW50cnlwb2ludCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGluc24ub3Bjb2RlKCkgPT0gc3B2OjpPcERlY29yYXRlKSB7CisgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDIpID09IHNwdjo6RGVjb3JhdGlvbkJ1aWx0SW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbi53b3JkKDMpID09IHNwdjo6QnVpbHRJblBvaW50U2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBwb2ludHNpemVfd3JpdHRlbiA9IElzUG9pbnRTaXplV3JpdHRlbihzcmMsIGluc24sIGVudHJ5cG9pbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluc24rKzsKKyAgICB9CisKKyAgICBpZiAoKHN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQgfHwgc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCkgJiYKKyAgICAgICAgIWVuYWJsZWRfZmVhdHVyZXMuY29yZS5zaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSkgeworICAgICAgICBpZiAocG9pbnRzaXplX3dyaXR0ZW4pIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfUG9pbnRTaXplQnVpbHRJbk92ZXJTcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpcGVsaW5lIHRvcG9sb2d5IGlzIHNldCB0byBQT0lOVF9MSVNUIGFuZCBnZW9tZXRyeSBvciB0ZXNzZWxsYXRpb24gc2hhZGVycyB3cml0ZSBQb2ludFNpemUgd2hpY2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBwcm9oaWJpdGVkIHdoZW4gdGhlIHNoYWRlclRlc3NlbGxhdGlvbkFuZEdlb21ldHJ5UG9pbnRTaXplIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFwb2ludHNpemVfd3JpdHRlbikgeworICAgICAgICBza2lwIHw9CisgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocGlwZWxpbmUtPnBpcGVsaW5lKSwga1ZVSURfQ29yZV9TaGFkZXJfTWlzc2luZ1BvaW50U2l6ZUJ1aWx0SW4sCisgICAgICAgICAgICAgICAgICAgICJQaXBlbGluZSB0b3BvbG9neSBpcyBzZXQgdG8gUE9JTlRfTElTVCwgYnV0IFBvaW50U2l6ZSBpcyBub3Qgd3JpdHRlbiB0byBpbiB0aGUgc2hhZGVyIGNvcnJlc3BvbmRpbmcgdG8gJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFnQml0cyhzdGFnZSkpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworYm9vbCBDb3JlQ2hlY2tzOjpWYWxpZGF0ZVBpcGVsaW5lU2hhZGVyU3RhZ2UoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBjb25zdCAqcFN0YWdlLCBjb25zdCBQSVBFTElORV9TVEFURSAqcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQSVBFTElORV9TVEFURTo6U3RhZ2VTdGF0ZSAmc3RhZ2Vfc3RhdGUsIGNvbnN0IFNIQURFUl9NT0RVTEVfU1RBVEUgKm1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwaXJ2X2luc3RfaXRlciAmZW50cnlwb2ludCwgYm9vbCBjaGVja19wb2ludF9zaXplKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICAvLyBDaGVjayB0aGUgbW9kdWxlCisgICAgaWYgKCFtb2R1bGUtPmhhc192YWxpZF9zcGlydikgeworICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1vZHVsZS1wYXJhbWV0ZXIiLCAiJXMgZG9lcyBub3QgY29udGFpbiB2YWxpZCBzcGlydiBmb3Igc3RhZ2UgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLT5Gb3JtYXRIYW5kbGUobW9kdWxlLT52a19zaGFkZXJfbW9kdWxlKS5jX3N0cigpLCBzdHJpbmdfVmtTaGFkZXJTdGFnZUZsYWdCaXRzKHBTdGFnZS0+c3RhZ2UpKTsKKyAgICB9CisKKyAgICAvLyBJZiBzcGVjaWFsaXphdGlvbi1jb25zdGFudCB2YWx1ZXMgYXJlIGdpdmVuIGFuZCBzcGVjaWFsaXphdGlvbi1jb25zdGFudCBpbnN0cnVjdGlvbnMgYXJlIHByZXNlbnQgaW4gdGhlIHNoYWRlciwgdGhlCisgICAgLy8gc3BlY2lhbGl6YXRpb25zIHNob3VsZCBiZSBhcHBsaWVkIGFuZCB2YWxpZGF0ZWQuCisgICAgaWYgKHBTdGFnZS0+cFNwZWNpYWxpemF0aW9uSW5mbyAhPSBudWxscHRyICYmIHBTdGFnZS0+cFNwZWNpYWxpemF0aW9uSW5mby0+bWFwRW50cnlDb3VudCA+IDAgJiYKKyAgICAgICAgcFN0YWdlLT5wU3BlY2lhbGl6YXRpb25JbmZvLT5wTWFwRW50cmllcyAhPSBudWxscHRyICYmIG1vZHVsZS0+aGFzX3NwZWNpYWxpemF0aW9uX2NvbnN0YW50cykgeworICAgICAgICAvLyBHYXRoZXIgdGhlIHNwZWNpYWxpemF0aW9uLWNvbnN0YW50IHZhbHVlcy4KKyAgICAgICAgYXV0byBjb25zdCAmc3BlY2lhbGl6YXRpb25faW5mbyA9IHBTdGFnZS0+cFNwZWNpYWxpemF0aW9uSW5mbzsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4+IGlkX3ZhbHVlX21hcDsKKyAgICAgICAgaWRfdmFsdWVfbWFwLnJlc2VydmUoc3BlY2lhbGl6YXRpb25faW5mby0+bWFwRW50cnlDb3VudCk7CisgICAgICAgIGZvciAoYXV0byBpID0gMHU7IGkgPCBzcGVjaWFsaXphdGlvbl9pbmZvLT5tYXBFbnRyeUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8gY29uc3QgJm1hcF9lbnRyeSA9IHNwZWNpYWxpemF0aW9uX2luZm8tPnBNYXBFbnRyaWVzW2ldOworICAgICAgICAgICAgYXNzZXJ0KG1hcF9lbnRyeS5zaXplICUgNCA9PSAwKTsKKworICAgICAgICAgICAgYXV0byBjb25zdCBiZWdpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oc3BlY2lhbGl6YXRpb25faW5mby0+cERhdGEpICsgbWFwX2VudHJ5Lm9mZnNldCAvIDQ7CisgICAgICAgICAgICBhdXRvIGNvbnN0IGVuZCA9IGJlZ2luICsgbWFwX2VudHJ5LnNpemUgLyA0OworICAgICAgICAgICAgaWRfdmFsdWVfbWFwLmVtcGxhY2UobWFwX2VudHJ5LmNvbnN0YW50SUQsIHN0ZDo6dmVjdG9yPHVpbnQzMl90PihiZWdpbiwgZW5kKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBseSB0aGUgc3BlY2lhbGl6YXRpb24tY29uc3RhbnQgdmFsdWVzIGFuZCByZXZhbGlkYXRlIHRoZSBzaGFkZXIgbW9kdWxlLgorICAgICAgICBzcHZfdGFyZ2V0X2VudiBjb25zdCBzcGlydl9lbnZpcm9ubWVudCA9ICgoYXBpX3ZlcnNpb24gPj0gVktfQVBJX1ZFUlNJT05fMV8xKSA/IFNQVl9FTlZfVlVMS0FOXzFfMSA6IFNQVl9FTlZfVlVMS0FOXzFfMCk7CisgICAgICAgIHNwdnRvb2xzOjpPcHRpbWl6ZXIgb3B0aW1pemVyKHNwaXJ2X2Vudmlyb25tZW50KTsKKyAgICAgICAgc3B2dG9vbHM6Ok1lc3NhZ2VDb25zdW1lciBjb25zdW1lciA9IFsmc2tpcCwgJm1vZHVsZSwgJnBTdGFnZSwgdGhpc10oc3B2X21lc3NhZ2VfbGV2ZWxfdCBsZXZlbCwgY29uc3QgY2hhciAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcHZfcG9zaXRpb25fdCAmcG9zaXRpb24sIGNvbnN0IGNoYXIgKm1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLW1vZHVsZS1wYXJhbWV0ZXIiLCAiJXMgZG9lcyBub3QgY29udGFpbiB2YWxpZCBzcGlydiBmb3Igc3RhZ2UgJXMuICVzIiwKKyAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1vZHVsZS0+dmtfc2hhZGVyX21vZHVsZSkuY19zdHIoKSwgc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFnQml0cyhwU3RhZ2UtPnN0YWdlKSwgbWVzc2FnZSk7CisgICAgICAgIH07CisgICAgICAgIG9wdGltaXplci5TZXRNZXNzYWdlQ29uc3VtZXIoY29uc3VtZXIpOworICAgICAgICBvcHRpbWl6ZXIuUmVnaXN0ZXJQYXNzKHNwdnRvb2xzOjpDcmVhdGVTZXRTcGVjQ29uc3RhbnREZWZhdWx0VmFsdWVQYXNzKGlkX3ZhbHVlX21hcCkpOworICAgICAgICBvcHRpbWl6ZXIuUmVnaXN0ZXJQYXNzKHNwdnRvb2xzOjpDcmVhdGVGcmVlemVTcGVjQ29uc3RhbnRWYWx1ZVBhc3MoKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzcGVjaWFsaXplZF9zcGlydjsKKyAgICAgICAgYXV0byBjb25zdCBvcHRpbWl6ZWQgPQorICAgICAgICAgICAgb3B0aW1pemVyLlJ1bihtb2R1bGUtPndvcmRzLmRhdGEoKSwgbW9kdWxlLT53b3Jkcy5zaXplKCksICZzcGVjaWFsaXplZF9zcGlydiwgc3B2dG9vbHM6OlZhbGlkYXRvck9wdGlvbnMoKSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydChvcHRpbWl6ZWQgPT0gdHJ1ZSk7CisKKyAgICAgICAgaWYgKG9wdGltaXplZCkgeworICAgICAgICAgICAgc3B2X2NvbnRleHQgY3R4ID0gc3B2Q29udGV4dENyZWF0ZShzcGlydl9lbnZpcm9ubWVudCk7CisgICAgICAgICAgICBzcHZfY29uc3RfYmluYXJ5X3QgYmluYXJ5e3NwZWNpYWxpemVkX3NwaXJ2LmRhdGEoKSwgc3BlY2lhbGl6ZWRfc3BpcnYuc2l6ZSgpfTsKKyAgICAgICAgICAgIHNwdl9kaWFnbm9zdGljIGRpYWcgPSBudWxscHRyOworICAgICAgICAgICAgc3B2X3ZhbGlkYXRvcl9vcHRpb25zIG9wdGlvbnMgPSBzcHZWYWxpZGF0b3JPcHRpb25zQ3JlYXRlKCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3JlbGF4ZWRfYmxvY2tfbGF5b3V0KSB7CisgICAgICAgICAgICAgICAgc3B2VmFsaWRhdG9yT3B0aW9uc1NldFJlbGF4QmxvY2tMYXlvdXQob3B0aW9ucywgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3VuaWZvcm1fYnVmZmVyX3N0YW5kYXJkX2xheW91dCAmJgorICAgICAgICAgICAgICAgIGVuYWJsZWRfZmVhdHVyZXMudW5pZm9ybV9idWZmZXJfc3RhbmRhcmRfbGF5b3V0LnVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dCA9PSBWS19UUlVFKSB7CisgICAgICAgICAgICAgICAgc3B2VmFsaWRhdG9yT3B0aW9uc1NldFVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dChvcHRpb25zLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19leHRfc2NhbGFyX2Jsb2NrX2xheW91dCAmJgorICAgICAgICAgICAgICAgIGVuYWJsZWRfZmVhdHVyZXMuc2NhbGFyX2Jsb2NrX2xheW91dF9mZWF0dXJlcy5zY2FsYXJCbG9ja0xheW91dCA9PSBWS19UUlVFKSB7CisgICAgICAgICAgICAgICAgc3B2VmFsaWRhdG9yT3B0aW9uc1NldFNjYWxhckJsb2NrTGF5b3V0KG9wdGlvbnMsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBjb25zdCBzcHZfdmFsaWQgPSBzcHZWYWxpZGF0ZVdpdGhPcHRpb25zKGN0eCwgb3B0aW9ucywgJmJpbmFyeSwgJmRpYWcpOworICAgICAgICAgICAgaWYgKHNwdl92YWxpZCAhPSBTUFZfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1tb2R1bGUtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmdGVyIHNwZWNpYWxpemF0aW9uIHdhcyBhcHBsaWVkLCAlcyBkb2VzIG5vdCBjb250YWluIHZhbGlkIHNwaXJ2IGZvciBzdGFnZSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKG1vZHVsZS0+dmtfc2hhZGVyX21vZHVsZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFnQml0cyhwU3RhZ2UtPnN0YWdlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwdlZhbGlkYXRvck9wdGlvbnNEZXN0cm95KG9wdGlvbnMpOworICAgICAgICAgICAgc3B2RGlhZ25vc3RpY0Rlc3Ryb3koZGlhZyk7CisgICAgICAgICAgICBzcHZDb250ZXh0RGVzdHJveShjdHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhlIGVudHJ5cG9pbnQKKyAgICBpZiAoZW50cnlwb2ludCA9PSBtb2R1bGUtPmVuZCgpKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5hbWUtMDA3MDciLCAiTm8gZW50cnlwb2ludCBmb3VuZCBuYW1lZCBgJXNgIGZvciBzdGFnZSAlcy4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFnZS0+cE5hbWUsIHN0cmluZ19Wa1NoYWRlclN0YWdlRmxhZ0JpdHMocFN0YWdlLT5zdGFnZSkpOworICAgIH0KKyAgICBpZiAoc2tpcCkgcmV0dXJuIHRydWU7ICAvLyBubyBwb2ludCBjb250aW51aW5nIGJleW9uZCBoZXJlLCBhbnkgYW5hbHlzaXMgaXMganVzdCBnb2luZyB0byBiZSBnYXJiYWdlLgorCisgICAgLy8gTWFyayBhY2Nlc3NpYmxlIGlkcworICAgIGF1dG8gJmFjY2Vzc2libGVfaWRzID0gc3RhZ2Vfc3RhdGUuYWNjZXNzaWJsZV9pZHM7CisKKyAgICAvLyBWYWxpZGF0ZSBkZXNjcmlwdG9yIHNldCBsYXlvdXQgYWdhaW5zdCB3aGF0IHRoZSBlbnRyeXBvaW50IGFjdHVhbGx5IHVzZXMKKyAgICBib29sIGhhc193cml0YWJsZV9kZXNjcmlwdG9yID0gc3RhZ2Vfc3RhdGUuaGFzX3dyaXRhYmxlX2Rlc2NyaXB0b3I7CisgICAgYXV0byAmZGVzY3JpcHRvcl91c2VzID0gc3RhZ2Vfc3RhdGUuZGVzY3JpcHRvcl91c2VzOworCisgICAgLy8gVmFsaWRhdGUgc2hhZGVyIGNhcGFiaWxpdGllcyBhZ2FpbnN0IGVuYWJsZWQgZGV2aWNlIGZlYXR1cmVzCisgICAgc2tpcCB8PSBWYWxpZGF0ZVNoYWRlckNhcGFiaWxpdGllcyhtb2R1bGUsIHBTdGFnZS0+c3RhZ2UpOworICAgIHNraXAgfD0gVmFsaWRhdGVTaGFkZXJTdGFnZVdyaXRhYmxlRGVzY3JpcHRvcihwU3RhZ2UtPnN0YWdlLCBoYXNfd3JpdGFibGVfZGVzY3JpcHRvcik7CisgICAgc2tpcCB8PSBWYWxpZGF0ZVNoYWRlclN0YWdlSW5wdXRPdXRwdXRMaW1pdHMobW9kdWxlLCBwU3RhZ2UsIHBpcGVsaW5lLCBlbnRyeXBvaW50KTsKKyAgICBza2lwIHw9IFZhbGlkYXRlU2hhZGVyU3RhZ2VHcm91cE5vblVuaWZvcm0obW9kdWxlLCBwU3RhZ2UtPnN0YWdlKTsKKyAgICBza2lwIHw9IFZhbGlkYXRlRXhlY3V0aW9uTW9kZXMobW9kdWxlLCBlbnRyeXBvaW50KTsKKyAgICBza2lwIHw9IFZhbGlkYXRlU3BlY2lhbGl6YXRpb25PZmZzZXRzKHJlcG9ydF9kYXRhLCBwU3RhZ2UpOworICAgIHNraXAgfD0gVmFsaWRhdGVQdXNoQ29uc3RhbnRVc2FnZShyZXBvcnRfZGF0YSwgcGlwZWxpbmUtPnBpcGVsaW5lX2xheW91dC0+cHVzaF9jb25zdGFudF9yYW5nZXMuZ2V0KCksIG1vZHVsZSwgYWNjZXNzaWJsZV9pZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFnZS0+c3RhZ2UpOworICAgIGlmIChjaGVja19wb2ludF9zaXplICYmICFwaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVQb2ludExpc3RTaGFkZXJTdGF0ZShwaXBlbGluZSwgbW9kdWxlLCBlbnRyeXBvaW50LCBwU3RhZ2UtPnN0YWdlKTsKKyAgICB9CisgICAgc2tpcCB8PSBWYWxpZGF0ZUNvb3BlcmF0aXZlTWF0cml4KG1vZHVsZSwgcFN0YWdlLCBwaXBlbGluZSk7CisKKyAgICAvLyBWYWxpZGF0ZSBkZXNjcmlwdG9yIHVzZQorICAgIGZvciAoYXV0byB1c2UgOiBkZXNjcmlwdG9yX3VzZXMpIHsKKyAgICAgICAgLy8gVmVyaWZ5IGdpdmVuIHBpcGVsaW5lTGF5b3V0IGhhcyByZXF1ZXN0ZWQgc2V0TGF5b3V0IHdpdGggcmVxdWVzdGVkIGJpbmRpbmcKKyAgICAgICAgY29uc3QgYXV0byAmYmluZGluZyA9IEdldERlc2NyaXB0b3JCaW5kaW5nKHBpcGVsaW5lLT5waXBlbGluZV9sYXlvdXQuZ2V0KCksIHVzZS5maXJzdCk7CisgICAgICAgIHVuc2lnbmVkIHJlcXVpcmVkX2Rlc2NyaXB0b3JfY291bnQ7CisgICAgICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBkZXNjcmlwdG9yX3R5cGVzID0gVHlwZVRvRGVzY3JpcHRvclR5cGVTZXQobW9kdWxlLCB1c2Uuc2Vjb25kLnR5cGVfaWQsIHJlcXVpcmVkX2Rlc2NyaXB0b3JfY291bnQpOworCisgICAgICAgIGlmICghYmluZGluZykgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU2hhZGVyX01pc3NpbmdEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGFkZXIgdXNlcyBkZXNjcmlwdG9yIHNsb3QgJXUuJXUgKGV4cGVjdGVkIGAlc2ApIGJ1dCBub3QgZGVjbGFyZWQgaW4gcGlwZWxpbmUgbGF5b3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UuZmlyc3QuZmlyc3QsIHVzZS5maXJzdC5zZWNvbmQsIHN0cmluZ19kZXNjcmlwdG9yVHlwZXMoZGVzY3JpcHRvcl90eXBlcykuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSBpZiAofmJpbmRpbmctPnN0YWdlRmxhZ3MgJiBwU3RhZ2UtPnN0YWdlKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX1NoYWRlcl9EZXNjcmlwdG9yTm90QWNjZXNzaWJsZUZyb21TdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hhZGVyIHVzZXMgZGVzY3JpcHRvciBzbG90ICV1LiV1IGJ1dCBkZXNjcmlwdG9yIG5vdCBhY2Nlc3NpYmxlIGZyb20gc3RhZ2UgJXMiLCB1c2UuZmlyc3QuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlLmZpcnN0LnNlY29uZCwgc3RyaW5nX1ZrU2hhZGVyU3RhZ2VGbGFnQml0cyhwU3RhZ2UtPnN0YWdlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvcl90eXBlcy5maW5kKGJpbmRpbmctPmRlc2NyaXB0b3JUeXBlKSA9PSBkZXNjcmlwdG9yX3R5cGVzLmVuZCgpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfQ29yZV9TaGFkZXJfRGVzY3JpcHRvclR5cGVNaXNtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZSBtaXNtYXRjaCBvbiBkZXNjcmlwdG9yIHNsb3QgJXUuJXUgKGV4cGVjdGVkIGAlc2ApIGJ1dCBkZXNjcmlwdG9yIG9mIHR5cGUgJXMiLCB1c2UuZmlyc3QuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlLmZpcnN0LnNlY29uZCwgc3RyaW5nX2Rlc2NyaXB0b3JUeXBlcyhkZXNjcmlwdG9yX3R5cGVzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa0Rlc2NyaXB0b3JUeXBlKGJpbmRpbmctPmRlc2NyaXB0b3JUeXBlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoYmluZGluZy0+ZGVzY3JpcHRvckNvdW50IDwgcmVxdWlyZWRfZGVzY3JpcHRvcl9jb3VudCkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU2hhZGVyX0Rlc2NyaXB0b3JUeXBlTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciBleHBlY3RzIGF0IGxlYXN0ICV1IGRlc2NyaXB0b3JzIGZvciBiaW5kaW5nICV1LiV1IGJ1dCBvbmx5ICV1IHByb3ZpZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9kZXNjcmlwdG9yX2NvdW50LCB1c2UuZmlyc3QuZmlyc3QsIHVzZS5maXJzdC5zZWNvbmQsIGJpbmRpbmctPmRlc2NyaXB0b3JDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSB1c2Ugb2YgaW5wdXQgYXR0YWNobWVudHMgYWdhaW5zdCBzdWJwYXNzIHN0cnVjdHVyZQorICAgIGlmIChwU3RhZ2UtPnN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQpIHsKKyAgICAgICAgYXV0byBpbnB1dF9hdHRhY2htZW50X3VzZXMgPSBDb2xsZWN0SW50ZXJmYWNlQnlJbnB1dEF0dGFjaG1lbnRJbmRleChtb2R1bGUsIGFjY2Vzc2libGVfaWRzKTsKKworICAgICAgICBhdXRvIHJwY2kgPSBwaXBlbGluZS0+cnBfc3RhdGUtPmNyZWF0ZUluZm8ucHRyKCk7CisgICAgICAgIGF1dG8gc3VicGFzcyA9IHBpcGVsaW5lLT5ncmFwaGljc1BpcGVsaW5lQ0kuc3VicGFzczsKKworICAgICAgICBmb3IgKGF1dG8gdXNlIDogaW5wdXRfYXR0YWNobWVudF91c2VzKSB7CisgICAgICAgICAgICBhdXRvIGlucHV0X2F0dGFjaG1lbnRzID0gcnBjaS0+cFN1YnBhc3Nlc1tzdWJwYXNzXS5wSW5wdXRBdHRhY2htZW50czsKKyAgICAgICAgICAgIGF1dG8gaW5kZXggPSAoaW5wdXRfYXR0YWNobWVudHMgJiYgdXNlLmZpcnN0IDwgcnBjaS0+cFN1YnBhc3Nlc1tzdWJwYXNzXS5pbnB1dEF0dGFjaG1lbnRDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dF9hdHRhY2htZW50c1t1c2UuZmlyc3RdLmF0dGFjaG1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWS19BVFRBQ0hNRU5UX1VOVVNFRDsKKworICAgICAgICAgICAgaWYgKGluZGV4ID09IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9Db3JlX1NoYWRlcl9NaXNzaW5nSW5wdXRBdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hhZGVyIGNvbnN1bWVzIGlucHV0IGF0dGFjaG1lbnQgaW5kZXggJWQgYnV0IG5vdCBwcm92aWRlZCBpbiBzdWJwYXNzIiwgdXNlLmZpcnN0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShHZXRGb3JtYXRUeXBlKHJwY2ktPnBBdHRhY2htZW50c1tpbmRleF0uZm9ybWF0KSAmIEdldEZ1bmRhbWVudGFsVHlwZShtb2R1bGUsIHVzZS5zZWNvbmQudHlwZV9pZCkpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX0NvcmVfU2hhZGVyX0lucHV0QXR0YWNobWVudFR5cGVNaXNtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VicGFzcyBpbnB1dCBhdHRhY2htZW50ICV1IGZvcm1hdCBvZiAlcyBkb2VzIG5vdCBtYXRjaCB0eXBlIHVzZWQgaW4gc2hhZGVyIGAlc2AiLCB1c2UuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX1ZrRm9ybWF0KHJwY2ktPnBBdHRhY2htZW50c1tpbmRleF0uZm9ybWF0KSwgRGVzY3JpYmVUeXBlKG1vZHVsZSwgdXNlLnNlY29uZC50eXBlX2lkKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocFN0YWdlLT5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQpIHsKKyAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZUNvbXB1dGVXb3JrR3JvdXBTaXplcyhtb2R1bGUpOworICAgIH0KKyAgICByZXR1cm4gc2tpcDsKK30KKworc3RhdGljIGJvb2wgVmFsaWRhdGVJbnRlcmZhY2VCZXR3ZWVuU3RhZ2VzKGRlYnVnX3JlcG9ydF9kYXRhIGNvbnN0ICpyZXBvcnRfZGF0YSwgU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqcHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BpcnZfaW5zdF9pdGVyIHByb2R1Y2VyX2VudHJ5cG9pbnQsIHNoYWRlcl9zdGFnZV9hdHRyaWJ1dGVzIGNvbnN0ICpwcm9kdWNlcl9zdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICpjb25zdW1lciwgc3BpcnZfaW5zdF9pdGVyIGNvbnN1bWVyX2VudHJ5cG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyX3N0YWdlX2F0dHJpYnV0ZXMgY29uc3QgKmNvbnN1bWVyX3N0YWdlKSB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBhdXRvIG91dHB1dHMgPQorICAgICAgICBDb2xsZWN0SW50ZXJmYWNlQnlMb2NhdGlvbihwcm9kdWNlciwgcHJvZHVjZXJfZW50cnlwb2ludCwgc3B2OjpTdG9yYWdlQ2xhc3NPdXRwdXQsIHByb2R1Y2VyX3N0YWdlLT5hcnJheWVkX291dHB1dCk7CisgICAgYXV0byBpbnB1dHMgPSBDb2xsZWN0SW50ZXJmYWNlQnlMb2NhdGlvbihjb25zdW1lciwgY29uc3VtZXJfZW50cnlwb2ludCwgc3B2OjpTdG9yYWdlQ2xhc3NJbnB1dCwgY29uc3VtZXJfc3RhZ2UtPmFycmF5ZWRfaW5wdXQpOworCisgICAgYXV0byBhX2l0ID0gb3V0cHV0cy5iZWdpbigpOworICAgIGF1dG8gYl9pdCA9IGlucHV0cy5iZWdpbigpOworCisgICAgLy8gTWFwcyBzb3J0ZWQgYnkga2V5IChsb2NhdGlvbik7IHdhbGsgdGhlbSB0b2dldGhlciB0byBmaW5kIG1pc21hdGNoZXMKKyAgICB3aGlsZSAoKG91dHB1dHMuc2l6ZSgpID4gMCAmJiBhX2l0ICE9IG91dHB1dHMuZW5kKCkpIHx8IChpbnB1dHMuc2l6ZSgpICYmIGJfaXQgIT0gaW5wdXRzLmVuZCgpKSkgeworICAgICAgICBib29sIGFfYXRfZW5kID0gb3V0cHV0cy5zaXplKCkgPT0gMCB8fCBhX2l0ID09IG91dHB1dHMuZW5kKCk7CisgICAgICAgIGJvb2wgYl9hdF9lbmQgPSBpbnB1dHMuc2l6ZSgpID09IDAgfHwgYl9pdCA9PSBpbnB1dHMuZW5kKCk7CisgICAgICAgIGF1dG8gYV9maXJzdCA9IGFfYXRfZW5kID8gc3RkOjptYWtlX3BhaXIoMHUsIDB1KSA6IGFfaXQtPmZpcnN0OworICAgICAgICBhdXRvIGJfZmlyc3QgPSBiX2F0X2VuZCA/IHN0ZDo6bWFrZV9wYWlyKDB1LCAwdSkgOiBiX2l0LT5maXJzdDsKKworICAgICAgICBpZiAoYl9hdF9lbmQgfHwgKCghYV9hdF9lbmQpICYmIChhX2ZpcnN0IDwgYl9maXJzdCkpKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwcm9kdWNlci0+dmtfc2hhZGVyX21vZHVsZSksIGtWVUlEX0NvcmVfU2hhZGVyX091dHB1dE5vdENvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyB3cml0ZXMgdG8gb3V0cHV0IGxvY2F0aW9uICV1LiV1IHdoaWNoIGlzIG5vdCBjb25zdW1lZCBieSAlcyIsIHByb2R1Y2VyX3N0YWdlLT5uYW1lLCBhX2ZpcnN0LmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfZmlyc3Quc2Vjb25kLCBjb25zdW1lcl9zdGFnZS0+bmFtZSk7CisgICAgICAgICAgICBhX2l0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoYV9hdF9lbmQgfHwgYV9maXJzdCA+IGJfZmlyc3QpIHsKKyAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChjb25zdW1lci0+dmtfc2hhZGVyX21vZHVsZSksIGtWVUlEX0NvcmVfU2hhZGVyX0lucHV0Tm90UHJvZHVjZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNvbnN1bWVzIGlucHV0IGxvY2F0aW9uICV1LiV1IHdoaWNoIGlzIG5vdCB3cml0dGVuIGJ5ICVzIiwgY29uc3VtZXJfc3RhZ2UtPm5hbWUsIGJfZmlyc3QuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYl9maXJzdC5zZWNvbmQsIHByb2R1Y2VyX3N0YWdlLT5uYW1lKTsKKyAgICAgICAgICAgIGJfaXQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHN1YnRsZXRpZXMgb2YgYXJyYXllZCBpbnRlcmZhY2VzOgorICAgICAgICAgICAgLy8gLSBpZiBpc19wYXRjaCwgdGhlbiB0aGUgbWVtYmVyIGlzIG5vdCBhcnJheWVkLCBldmVuIHRob3VnaCB0aGUgaW50ZXJmYWNlIG1heSBiZS4KKyAgICAgICAgICAgIC8vIC0gaWYgaXNfYmxvY2tfbWVtYmVyLCB0aGVuIHRoZSBleHRyYSBhcnJheSBsZXZlbCBvZiBhbiBhcnJheWVkIGludGVyZmFjZSBpcyBub3QKKyAgICAgICAgICAgIC8vICAgZXhwcmVzc2VkIGluIHRoZSBtZW1iZXIgdHlwZSAtLSBpdCdzIGV4cHJlc3NlZCBpbiB0aGUgYmxvY2sgdHlwZS4KKyAgICAgICAgICAgIGlmICghVHlwZXNNYXRjaChwcm9kdWNlciwgY29uc3VtZXIsIGFfaXQtPnNlY29uZC50eXBlX2lkLCBiX2l0LT5zZWNvbmQudHlwZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9zdGFnZS0+YXJyYXllZF9vdXRwdXQgJiYgIWFfaXQtPnNlY29uZC5pc19wYXRjaCAmJiAhYV9pdC0+c2Vjb25kLmlzX2Jsb2NrX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9zdGFnZS0+YXJyYXllZF9pbnB1dCAmJiAhYl9pdC0+c2Vjb25kLmlzX3BhdGNoICYmICFiX2l0LT5zZWNvbmQuaXNfYmxvY2tfbWVtYmVyLCB0cnVlKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocHJvZHVjZXItPnZrX3NoYWRlcl9tb2R1bGUpLCBrVlVJRF9Db3JlX1NoYWRlcl9JbnRlcmZhY2VUeXBlTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIG1pc21hdGNoIG9uIGxvY2F0aW9uICV1LiV1OiAnJXMnIHZzICclcyciLCBhX2ZpcnN0LmZpcnN0LCBhX2ZpcnN0LnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpYmVUeXBlKHByb2R1Y2VyLCBhX2l0LT5zZWNvbmQudHlwZV9pZCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpYmVUeXBlKGNvbnN1bWVyLCBiX2l0LT5zZWNvbmQudHlwZV9pZCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYV9pdC0+c2Vjb25kLmlzX3BhdGNoICE9IGJfaXQtPnNlY29uZC5pc19wYXRjaCkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocHJvZHVjZXItPnZrX3NoYWRlcl9tb2R1bGUpLCBrVlVJRF9Db3JlX1NoYWRlcl9JbnRlcmZhY2VUeXBlTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNvcmF0aW9uIG1pc21hdGNoIG9uIGxvY2F0aW9uICV1LiV1OiBpcyBwZXItJXMgaW4gJXMgc3RhZ2UgYnV0IHBlci0lcyBpbiAlcyBzdGFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfZmlyc3QuZmlyc3QsIGFfZmlyc3Quc2Vjb25kLCBhX2l0LT5zZWNvbmQuaXNfcGF0Y2ggPyAicGF0Y2giIDogInZlcnRleCIsIHByb2R1Y2VyX3N0YWdlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX2l0LT5zZWNvbmQuaXNfcGF0Y2ggPyAicGF0Y2giIDogInZlcnRleCIsIGNvbnN1bWVyX3N0YWdlLT5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhX2l0LT5zZWNvbmQuaXNfcmVsYXhlZF9wcmVjaXNpb24gIT0gYl9pdC0+c2Vjb25kLmlzX3JlbGF4ZWRfcHJlY2lzaW9uKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUb1VpbnQ2NChwcm9kdWNlci0+dmtfc2hhZGVyX21vZHVsZSksIGtWVUlEX0NvcmVfU2hhZGVyX0ludGVyZmFjZVR5cGVNaXNtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlY29yYXRpb24gbWlzbWF0Y2ggb24gbG9jYXRpb24gJXUuJXU6ICVzIGFuZCAlcyBzdGFnZXMgZGlmZmVyIGluIHByZWNpc2lvbiIsIGFfZmlyc3QuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfZmlyc3Quc2Vjb25kLCBwcm9kdWNlcl9zdGFnZS0+bmFtZSwgY29uc3VtZXJfc3RhZ2UtPm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9pdCsrOworICAgICAgICAgICAgYl9pdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbnN1bWVyX3N0YWdlLT5zdGFnZSAhPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUKSB7CisgICAgICAgIGF1dG8gYnVpbHRpbnNfcHJvZHVjZXIgPSBDb2xsZWN0QnVpbHRpbkJsb2NrTWVtYmVycyhwcm9kdWNlciwgcHJvZHVjZXJfZW50cnlwb2ludCwgc3B2OjpTdG9yYWdlQ2xhc3NPdXRwdXQpOworICAgICAgICBhdXRvIGJ1aWx0aW5zX2NvbnN1bWVyID0gQ29sbGVjdEJ1aWx0aW5CbG9ja01lbWJlcnMoY29uc3VtZXIsIGNvbnN1bWVyX2VudHJ5cG9pbnQsIHNwdjo6U3RvcmFnZUNsYXNzSW5wdXQpOworCisgICAgICAgIGlmICghYnVpbHRpbnNfcHJvZHVjZXIuZW1wdHkoKSAmJiAhYnVpbHRpbnNfY29uc3VtZXIuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKGJ1aWx0aW5zX3Byb2R1Y2VyLnNpemUoKSAhPSBidWlsdGluc19jb25zdW1lci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocHJvZHVjZXItPnZrX3NoYWRlcl9tb2R1bGUpLCBrVlVJRF9Db3JlX1NoYWRlcl9JbnRlcmZhY2VUeXBlTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBlbGVtZW50cyBpbnNpZGUgYnVpbHRpbiBibG9jayBkaWZmZXIgYmV0d2VlbiBzdGFnZXMgKCVzICVkIHZzICVzICVkKS4iLCBwcm9kdWNlcl9zdGFnZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWJ1aWx0aW5zX3Byb2R1Y2VyLnNpemUoKSwgY29uc3VtZXJfc3RhZ2UtPm5hbWUsIChpbnQpYnVpbHRpbnNfY29uc3VtZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdF9wcm9kdWNlciA9IGJ1aWx0aW5zX3Byb2R1Y2VyLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgYXV0byBpdF9jb25zdW1lciA9IGJ1aWx0aW5zX2NvbnN1bWVyLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0X3Byb2R1Y2VyICE9IGJ1aWx0aW5zX3Byb2R1Y2VyLmVuZCgpICYmIGl0X2NvbnN1bWVyICE9IGJ1aWx0aW5zX2NvbnN1bWVyLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqaXRfcHJvZHVjZXIgIT0gKml0X2NvbnN1bWVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQocHJvZHVjZXItPnZrX3NoYWRlcl9tb2R1bGUpLCBrVlVJRF9Db3JlX1NoYWRlcl9JbnRlcmZhY2VUeXBlTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1aWx0aW4gdmFyaWFibGUgaW5zaWRlIGJsb2NrIGRvZXNuJ3QgbWF0Y2ggYmV0d2VlbiAlcyBhbmQgJXMuIiwgcHJvZHVjZXJfc3RhZ2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfc3RhZ2UtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXRfcHJvZHVjZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgaXRfY29uc3VtZXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2tpcDsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBEZXRlcm1pbmVGaW5hbEdlb21TdGFnZShjb25zdCBQSVBFTElORV9TVEFURSAqcGlwZWxpbmUsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvKSB7CisgICAgdWludDMyX3Qgc3RhZ2VfbWFzayA9IDA7CisgICAgaWYgKHBpcGVsaW5lLT50b3BvbG9neV9hdF9yYXN0ZXJpemVyID09IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+c3RhZ2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBzdGFnZV9tYXNrIHw9IHBDcmVhdGVJbmZvLT5wU3RhZ2VzW2ldLnN0YWdlOworICAgICAgICB9CisgICAgICAgIC8vIERldGVybWluZSB3aGljaCBzaGFkZXIgaW4gd2hpY2ggUG9pbnRTaXplIHNob3VsZCBiZSB3cml0dGVuICh0aGUgZmluYWwgZ2VvbWV0cnkgc3RhZ2UpCisgICAgICAgIGlmIChzdGFnZV9tYXNrICYgVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WKSB7CisgICAgICAgICAgICBzdGFnZV9tYXNrID0gVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WOworICAgICAgICB9IGVsc2UgaWYgKHN0YWdlX21hc2sgJiBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUKSB7CisgICAgICAgICAgICBzdGFnZV9tYXNrID0gVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVDsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFnZV9tYXNrICYgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCkgeworICAgICAgICAgICAgc3RhZ2VfbWFzayA9IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhZ2VfbWFzayAmIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUKSB7CisgICAgICAgICAgICBzdGFnZV9tYXNrID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YWdlX21hc2s7Cit9CisKKy8vIFZhbGlkYXRlIHRoYXQgdGhlIHNoYWRlcnMgdXNlZCBieSB0aGUgZ2l2ZW4gcGlwZWxpbmUgYW5kIHN0b3JlIHRoZSBhY3RpdmVfc2xvdHMKKy8vICB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBwaXBlbGluZSBpbnRvIHBQaXBlbGluZS0+YWN0aXZlX3Nsb3RzCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlR3JhcGhpY3NQaXBlbGluZVNoYWRlclN0YXRlKGNvbnN0IFBJUEVMSU5FX1NUQVRFICpwaXBlbGluZSkgY29uc3QgeworICAgIGF1dG8gcENyZWF0ZUluZm8gPSBwaXBlbGluZS0+Z3JhcGhpY3NQaXBlbGluZUNJLnB0cigpOworICAgIGludCB2ZXJ0ZXhfc3RhZ2UgPSBHZXRTaGFkZXJTdGFnZUlkKFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUKTsKKyAgICBpbnQgZnJhZ21lbnRfc3RhZ2UgPSBHZXRTaGFkZXJTdGFnZUlkKFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQpOworCisgICAgY29uc3QgU0hBREVSX01PRFVMRV9TVEFURSAqc2hhZGVyc1szMl07CisgICAgbWVtc2V0KHNoYWRlcnMsIDAsIHNpemVvZihzaGFkZXJzKSk7CisgICAgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnRzWzMyXTsKKyAgICBtZW1zZXQoZW50cnlwb2ludHMsIDAsIHNpemVvZihlbnRyeXBvaW50cykpOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgdWludDMyX3QgcG9pbnRsaXN0X3N0YWdlX21hc2sgPSBEZXRlcm1pbmVGaW5hbEdlb21TdGFnZShwaXBlbGluZSwgcENyZWF0ZUluZm8pOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5zdGFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgYXV0byBwU3RhZ2UgPSAmcENyZWF0ZUluZm8tPnBTdGFnZXNbaV07CisgICAgICAgIGF1dG8gc3RhZ2VfaWQgPSBHZXRTaGFkZXJTdGFnZUlkKHBTdGFnZS0+c3RhZ2UpOworICAgICAgICBzaGFkZXJzW3N0YWdlX2lkXSA9IEdldFNoYWRlck1vZHVsZVN0YXRlKHBTdGFnZS0+bW9kdWxlKTsKKyAgICAgICAgZW50cnlwb2ludHNbc3RhZ2VfaWRdID0gRmluZEVudHJ5cG9pbnQoc2hhZGVyc1tzdGFnZV9pZF0sIHBTdGFnZS0+cE5hbWUsIHBTdGFnZS0+c3RhZ2UpOworICAgICAgICBza2lwIHw9IFZhbGlkYXRlUGlwZWxpbmVTaGFkZXJTdGFnZShwU3RhZ2UsIHBpcGVsaW5lLCBwaXBlbGluZS0+c3RhZ2Vfc3RhdGVbaV0sIHNoYWRlcnNbc3RhZ2VfaWRdLCBlbnRyeXBvaW50c1tzdGFnZV9pZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludGxpc3Rfc3RhZ2VfbWFzayA9PSBwU3RhZ2UtPnN0YWdlKSk7CisgICAgfQorCisgICAgLy8gaWYgdGhlIHNoYWRlciBzdGFnZXMgYXJlIG5vIGdvb2QgaW5kaXZpZHVhbGx5LCBjcm9zcy1zdGFnZSB2YWxpZGF0aW9uIGlzIHBvaW50bGVzcy4KKyAgICBpZiAoc2tpcCkgcmV0dXJuIHRydWU7CisKKyAgICBhdXRvIHZpID0gcENyZWF0ZUluZm8tPnBWZXJ0ZXhJbnB1dFN0YXRlOworCisgICAgaWYgKHZpKSB7CisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVWaUNvbnNpc3RlbmN5KHJlcG9ydF9kYXRhLCB2aSk7CisgICAgfQorCisgICAgaWYgKHNoYWRlcnNbdmVydGV4X3N0YWdlXSAmJiBzaGFkZXJzW3ZlcnRleF9zdGFnZV0tPmhhc192YWxpZF9zcGlydikgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlVmlBZ2FpbnN0VnNJbnB1dHMocmVwb3J0X2RhdGEsIHZpLCBzaGFkZXJzW3ZlcnRleF9zdGFnZV0sIGVudHJ5cG9pbnRzW3ZlcnRleF9zdGFnZV0pOworICAgIH0KKworICAgIGludCBwcm9kdWNlciA9IEdldFNoYWRlclN0YWdlSWQoVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQpOworICAgIGludCBjb25zdW1lciA9IEdldFNoYWRlclN0YWdlSWQoVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCk7CisKKyAgICB3aGlsZSAoIXNoYWRlcnNbcHJvZHVjZXJdICYmIHByb2R1Y2VyICE9IGZyYWdtZW50X3N0YWdlKSB7CisgICAgICAgIHByb2R1Y2VyKys7CisgICAgICAgIGNvbnN1bWVyKys7CisgICAgfQorCisgICAgZm9yICg7IHByb2R1Y2VyICE9IGZyYWdtZW50X3N0YWdlICYmIGNvbnN1bWVyIDw9IGZyYWdtZW50X3N0YWdlOyBjb25zdW1lcisrKSB7CisgICAgICAgIGFzc2VydChzaGFkZXJzW3Byb2R1Y2VyXSk7CisgICAgICAgIGlmIChzaGFkZXJzW2NvbnN1bWVyXSkgeworICAgICAgICAgICAgaWYgKHNoYWRlcnNbY29uc3VtZXJdLT5oYXNfdmFsaWRfc3BpcnYgJiYgc2hhZGVyc1twcm9kdWNlcl0tPmhhc192YWxpZF9zcGlydikgeworICAgICAgICAgICAgICAgIHNraXAgfD0gVmFsaWRhdGVJbnRlcmZhY2VCZXR3ZWVuU3RhZ2VzKHJlcG9ydF9kYXRhLCBzaGFkZXJzW3Byb2R1Y2VyXSwgZW50cnlwb2ludHNbcHJvZHVjZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFkZXJfc3RhZ2VfYXR0cmlic1twcm9kdWNlcl0sIHNoYWRlcnNbY29uc3VtZXJdLCBlbnRyeXBvaW50c1tjb25zdW1lcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYWRlcl9zdGFnZV9hdHRyaWJzW2NvbnN1bWVyXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2R1Y2VyID0gY29uc3VtZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hhZGVyc1tmcmFnbWVudF9zdGFnZV0gJiYgc2hhZGVyc1tmcmFnbWVudF9zdGFnZV0tPmhhc192YWxpZF9zcGlydikgeworICAgICAgICBza2lwIHw9IFZhbGlkYXRlRnNPdXRwdXRzQWdhaW5zdFJlbmRlclBhc3MocmVwb3J0X2RhdGEsIHNoYWRlcnNbZnJhZ21lbnRfc3RhZ2VdLCBlbnRyeXBvaW50c1tmcmFnbWVudF9zdGFnZV0sIHBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnN1YnBhc3MpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ29tcHV0ZVBpcGVsaW5lKFBJUEVMSU5FX1NUQVRFICpwaXBlbGluZSkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gJnN0YWdlID0gKnBpcGVsaW5lLT5jb21wdXRlUGlwZWxpbmVDSS5zdGFnZS5wdHIoKTsKKworICAgIGNvbnN0IFNIQURFUl9NT0RVTEVfU1RBVEUgKm1vZHVsZSA9IEdldFNoYWRlck1vZHVsZVN0YXRlKHN0YWdlLm1vZHVsZSk7CisgICAgY29uc3Qgc3BpcnZfaW5zdF9pdGVyIGVudHJ5cG9pbnQgPSBGaW5kRW50cnlwb2ludChtb2R1bGUsIHN0YWdlLnBOYW1lLCBzdGFnZS5zdGFnZSk7CisKKyAgICByZXR1cm4gVmFsaWRhdGVQaXBlbGluZVNoYWRlclN0YWdlKCZzdGFnZSwgcGlwZWxpbmUsIHBpcGVsaW5lLT5zdGFnZV9zdGF0ZVswXSwgbW9kdWxlLCBlbnRyeXBvaW50LCBmYWxzZSk7Cit9CisKK2Jvb2wgQ29yZUNoZWNrczo6VmFsaWRhdGVSYXlUcmFjaW5nUGlwZWxpbmVOVihQSVBFTElORV9TVEFURSAqcGlwZWxpbmUpIGNvbnN0IHsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGlmIChwaXBlbGluZS0+cmF5dHJhY2luZ1BpcGVsaW5lQ0kubWF4UmVjdXJzaW9uRGVwdGggPiBwaHlzX2Rldl9leHRfcHJvcHMucmF5X3RyYWNpbmdfcHJvcHMubWF4UmVjdXJzaW9uRGVwdGgpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtbWF4UmVjdXJzaW9uRGVwdGgtMDI0MTIiLCAiOiAlZCA+ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLT5yYXl0cmFjaW5nUGlwZWxpbmVDSS5tYXhSZWN1cnNpb25EZXB0aCwgcGh5c19kZXZfZXh0X3Byb3BzLnJheV90cmFjaW5nX3Byb3BzLm1heFJlY3Vyc2lvbkRlcHRoKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICpzdGFnZXMgPSBwaXBlbGluZS0+cmF5dHJhY2luZ1BpcGVsaW5lQ0kucHRyKCktPnBTdGFnZXM7CisgICAgY29uc3QgYXV0byAqZ3JvdXBzID0gcGlwZWxpbmUtPnJheXRyYWNpbmdQaXBlbGluZUNJLnB0cigpLT5wR3JvdXBzOworCisgICAgdWludDMyX3QgcmF5Z2VuX3N0YWdlc19mb3VuZCA9IDA7CisgICAgZm9yICh1aW50MzJfdCBzdGFnZV9pbmRleCA9IDA7IHN0YWdlX2luZGV4IDwgcGlwZWxpbmUtPnJheXRyYWNpbmdQaXBlbGluZUNJLnN0YWdlQ291bnQ7IHN0YWdlX2luZGV4KyspIHsKKyAgICAgICAgY29uc3QgYXV0byAmc3RhZ2UgPSBzdGFnZXNbc3RhZ2VfaW5kZXhdOworCisgICAgICAgIGNvbnN0IFNIQURFUl9NT0RVTEVfU1RBVEUgKm1vZHVsZSA9IEdldFNoYWRlck1vZHVsZVN0YXRlKHN0YWdlLm1vZHVsZSk7CisgICAgICAgIGNvbnN0IHNwaXJ2X2luc3RfaXRlciBlbnRyeXBvaW50ID0gRmluZEVudHJ5cG9pbnQobW9kdWxlLCBzdGFnZS5wTmFtZSwgc3RhZ2Uuc3RhZ2UpOworCisgICAgICAgIHNraXAgfD0gVmFsaWRhdGVQaXBlbGluZVNoYWRlclN0YWdlKCZzdGFnZSwgcGlwZWxpbmUsIHBpcGVsaW5lLT5zdGFnZV9zdGF0ZVtzdGFnZV9pbmRleF0sIG1vZHVsZSwgZW50cnlwb2ludCwgZmFsc2UpOworCisgICAgICAgIGlmIChzdGFnZS5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVikgeworICAgICAgICAgICAgcmF5Z2VuX3N0YWdlc19mb3VuZCsrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyYXlnZW5fc3RhZ2VzX2ZvdW5kICE9IDEpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtc3RhZ2UtMDI0MDgiLCAiIDogJWQgcmF5Z2VuIHN0YWdlcyBzcGVjaWZpZWQiLCByYXlnZW5fc3RhZ2VzX2ZvdW5kKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGdyb3VwX2luZGV4ID0gMDsgZ3JvdXBfaW5kZXggPCBwaXBlbGluZS0+cmF5dHJhY2luZ1BpcGVsaW5lQ0kuZ3JvdXBDb3VudDsgZ3JvdXBfaW5kZXgrKykgeworICAgICAgICBjb25zdCBhdXRvICZncm91cCA9IGdyb3Vwc1tncm91cF9pbmRleF07CisKKyAgICAgICAgaWYgKGdyb3VwLnR5cGUgPT0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfR0VORVJBTF9OVikgeworICAgICAgICAgICAgaWYgKGdyb3VwLmdlbmVyYWxTaGFkZXIgPj0gcGlwZWxpbmUtPnJheXRyYWNpbmdQaXBlbGluZUNJLnN0YWdlQ291bnQgfHwKKyAgICAgICAgICAgICAgICAoc3RhZ2VzW2dyb3VwLmdlbmVyYWxTaGFkZXJdLnN0YWdlICE9IFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WICYmCisgICAgICAgICAgICAgICAgIHN0YWdlc1tncm91cC5nZW5lcmFsU2hhZGVyXS5zdGFnZSAhPSBWS19TSEFERVJfU1RBR0VfTUlTU19CSVRfTlYgJiYKKyAgICAgICAgICAgICAgICAgc3RhZ2VzW2dyb3VwLmdlbmVyYWxTaGFkZXJdLnN0YWdlICE9IFZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlYpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi10eXBlLTAyNDEzIiwgIjogcEdyb3Vwc1slZF0iLCBncm91cF9pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ3JvdXAuYW55SGl0U2hhZGVyICE9IFZLX1NIQURFUl9VTlVTRURfTlYgfHwgZ3JvdXAuY2xvc2VzdEhpdFNoYWRlciAhPSBWS19TSEFERVJfVU5VU0VEX05WIHx8CisgICAgICAgICAgICAgICAgZ3JvdXAuaW50ZXJzZWN0aW9uU2hhZGVyICE9IFZLX1NIQURFUl9VTlVTRURfTlYpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXR5cGUtMDI0MTQiLCAiOiBwR3JvdXBzWyVkXSIsIGdyb3VwX2luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChncm91cC50eXBlID09IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1BST0NFRFVSQUxfSElUX0dST1VQX05WKSB7CisgICAgICAgICAgICBpZiAoZ3JvdXAuaW50ZXJzZWN0aW9uU2hhZGVyID49IHBpcGVsaW5lLT5yYXl0cmFjaW5nUGlwZWxpbmVDSS5zdGFnZUNvdW50IHx8CisgICAgICAgICAgICAgICAgc3RhZ2VzW2dyb3VwLmludGVyc2VjdGlvblNoYWRlcl0uc3RhZ2UgIT0gVktfU0hBREVSX1NUQUdFX0lOVEVSU0VDVElPTl9CSVRfTlYpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXR5cGUtMDI0MTUiLCAiOiBwR3JvdXBzWyVkXSIsIGdyb3VwX2luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChncm91cC50eXBlID09IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1RSSUFOR0xFU19ISVRfR1JPVVBfTlYpIHsKKyAgICAgICAgICAgIGlmIChncm91cC5pbnRlcnNlY3Rpb25TaGFkZXIgIT0gVktfU0hBREVSX1VOVVNFRF9OVikgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxNiIsICI6IHBHcm91cHNbJWRdIiwgZ3JvdXBfaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGdyb3VwLnR5cGUgPT0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfUFJPQ0VEVVJBTF9ISVRfR1JPVVBfTlYgfHwKKyAgICAgICAgICAgIGdyb3VwLnR5cGUgPT0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OVikgeworICAgICAgICAgICAgaWYgKGdyb3VwLmFueUhpdFNoYWRlciAhPSBWS19TSEFERVJfVU5VU0VEX05WICYmIChncm91cC5hbnlIaXRTaGFkZXIgPj0gcGlwZWxpbmUtPnJheXRyYWNpbmdQaXBlbGluZUNJLnN0YWdlQ291bnQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VzW2dyb3VwLmFueUhpdFNoYWRlcl0uc3RhZ2UgIT0gVktfU0hBREVSX1NUQUdFX0FOWV9ISVRfQklUX05WKSkgeworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtYW55SGl0U2hhZGVyLTAyNDE4IiwgIjogcEdyb3Vwc1slZF0iLCBncm91cF9pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ3JvdXAuY2xvc2VzdEhpdFNoYWRlciAhPSBWS19TSEFERVJfVU5VU0VEX05WICYmCisgICAgICAgICAgICAgICAgKGdyb3VwLmNsb3Nlc3RIaXRTaGFkZXIgPj0gcGlwZWxpbmUtPnJheXRyYWNpbmdQaXBlbGluZUNJLnN0YWdlQ291bnQgfHwKKyAgICAgICAgICAgICAgICAgc3RhZ2VzW2dyb3VwLmNsb3Nlc3RIaXRTaGFkZXJdLnN0YWdlICE9IFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlYpKSB7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi1jbG9zZXN0SGl0U2hhZGVyLTAyNDE3IiwgIjogcEdyb3Vwc1slZF0iLCBncm91cF9pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CisKK3VpbnQzMl90IFZhbGlkYXRpb25DYWNoZTo6TWFrZVNoYWRlckhhc2goVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIGNvbnN0ICpzbWNpKSB7IHJldHVybiBYWEgzMihzbWNpLT5wQ29kZSwgc21jaS0+Y29kZVNpemUsIDApOyB9CisKK3N0YXRpYyBWYWxpZGF0aW9uQ2FjaGUgKkdldFZhbGlkYXRpb25DYWNoZUluZm8oVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIGNvbnN0ICpwQ3JlYXRlSW5mbykgeworICAgIGNvbnN0IGF1dG8gdmFsaWRhdGlvbl9jYWNoZV9jaSA9IGx2bF9maW5kX2luX2NoYWluPFZrU2hhZGVyTW9kdWxlVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVD4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAodmFsaWRhdGlvbl9jYWNoZV9jaSkgeworICAgICAgICByZXR1cm4gQ2FzdEZyb21IYW5kbGU8VmFsaWRhdGlvbkNhY2hlICo+KHZhbGlkYXRpb25fY2FjaGVfY2ktPnZhbGlkYXRpb25DYWNoZSk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitib29sIENvcmVDaGVja3M6OlByZUNhbGxWYWxpZGF0ZUNyZWF0ZVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU2hhZGVyTW9kdWxlICpwU2hhZGVyTW9kdWxlKSBjb25zdCB7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgc3B2X3Jlc3VsdF90IHNwdl92YWxpZCA9IFNQVl9TVUNDRVNTOworCisgICAgaWYgKGRpc2FibGVkLnNoYWRlcl92YWxpZGF0aW9uKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIGhhdmVfZ2xzbF9zaGFkZXIgPSBkZXZpY2VfZXh0ZW5zaW9ucy52a19udl9nbHNsX3NoYWRlcjsKKworICAgIGlmICghaGF2ZV9nbHNsX3NoYWRlciAmJiAocENyZWF0ZUluZm8tPmNvZGVTaXplICUgNCkpIHsKKyAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvLXBDb2RlLTAxMzc2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUElSLVYgbW9kdWxlIG5vdCB2YWxpZDogQ29kZXNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgYnV0IGlzICIgUFJJTlRGX1NJWkVfVF9TUEVDSUZJRVIgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPmNvZGVTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdXRvIGNhY2hlID0gR2V0VmFsaWRhdGlvbkNhY2hlSW5mbyhwQ3JlYXRlSW5mbyk7CisgICAgICAgIHVpbnQzMl90IGhhc2ggPSAwOworICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgIGhhc2ggPSBWYWxpZGF0aW9uQ2FjaGU6Ok1ha2VTaGFkZXJIYXNoKHBDcmVhdGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChjYWNoZS0+Q29udGFpbnMoaGFzaCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVzZSBTUElSVi1Ub29scyB2YWxpZGF0b3IgdG8gdHJ5IGFuZCBjYXRjaCBhbnkgaXNzdWVzIHdpdGggdGhlIG1vZHVsZSBpdHNlbGYuIElmIHNwZWNpYWxpemF0aW9uIGNvbnN0YW50cyBhcmUgcHJlc2VudCwKKyAgICAgICAgLy8gdGhlIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgdXNlZCBkdXJpbmcgdmFsaWRhdGlvbi4KKyAgICAgICAgc3B2X3RhcmdldF9lbnYgc3BpcnZfZW52aXJvbm1lbnQgPSBTUFZfRU5WX1ZVTEtBTl8xXzA7CisgICAgICAgIGlmIChhcGlfdmVyc2lvbiA+PSBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfc3BpcnZfMV80KSB7CisgICAgICAgICAgICAgICAgc3BpcnZfZW52aXJvbm1lbnQgPSBTUFZfRU5WX1ZVTEtBTl8xXzFfU1BJUlZfMV80OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcGlydl9lbnZpcm9ubWVudCA9IFNQVl9FTlZfVlVMS0FOXzFfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcHZfY29udGV4dCBjdHggPSBzcHZDb250ZXh0Q3JlYXRlKHNwaXJ2X2Vudmlyb25tZW50KTsKKyAgICAgICAgc3B2X2NvbnN0X2JpbmFyeV90IGJpbmFyeXtwQ3JlYXRlSW5mby0+cENvZGUsIHBDcmVhdGVJbmZvLT5jb2RlU2l6ZSAvIHNpemVvZih1aW50MzJfdCl9OworICAgICAgICBzcHZfZGlhZ25vc3RpYyBkaWFnID0gbnVsbHB0cjsKKyAgICAgICAgc3B2X3ZhbGlkYXRvcl9vcHRpb25zIG9wdGlvbnMgPSBzcHZWYWxpZGF0b3JPcHRpb25zQ3JlYXRlKCk7CisgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfcmVsYXhlZF9ibG9ja19sYXlvdXQpIHsKKyAgICAgICAgICAgIHNwdlZhbGlkYXRvck9wdGlvbnNTZXRSZWxheEJsb2NrTGF5b3V0KG9wdGlvbnMsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VfZXh0ZW5zaW9ucy52a19raHJfdW5pZm9ybV9idWZmZXJfc3RhbmRhcmRfbGF5b3V0ICYmCisgICAgICAgICAgICBlbmFibGVkX2ZlYXR1cmVzLnVuaWZvcm1fYnVmZmVyX3N0YW5kYXJkX2xheW91dC51bmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXQgPT0gVktfVFJVRSkgeworICAgICAgICAgICAgc3B2VmFsaWRhdG9yT3B0aW9uc1NldFVuaWZvcm1CdWZmZXJTdGFuZGFyZExheW91dChvcHRpb25zLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfZXh0X3NjYWxhcl9ibG9ja19sYXlvdXQgJiYKKyAgICAgICAgICAgIGVuYWJsZWRfZmVhdHVyZXMuc2NhbGFyX2Jsb2NrX2xheW91dF9mZWF0dXJlcy5zY2FsYXJCbG9ja0xheW91dCA9PSBWS19UUlVFKSB7CisgICAgICAgICAgICBzcHZWYWxpZGF0b3JPcHRpb25zU2V0U2NhbGFyQmxvY2tMYXlvdXQob3B0aW9ucywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc3B2X3ZhbGlkID0gc3B2VmFsaWRhdGVXaXRoT3B0aW9ucyhjdHgsIG9wdGlvbnMsICZiaW5hcnksICZkaWFnKTsKKyAgICAgICAgaWYgKHNwdl92YWxpZCAhPSBTUFZfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKCFoYXZlX2dsc2xfc2hhZGVyIHx8IChwQ3JlYXRlSW5mby0+cENvZGVbMF0gPT0gc3B2OjpNYWdpY051bWJlcikpIHsKKyAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIHNwdl92YWxpZCA9PSBTUFZfV0FSTklORyA/IFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQgOiBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIGtWVUlEX0NvcmVfU2hhZGVyX0luY29uc2lzdGVudFNwaXJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTUElSLVYgbW9kdWxlIG5vdCB2YWxpZDogJXMiLCBkaWFnICYmIGRpYWctPmVycm9yID8gZGlhZy0+ZXJyb3IgOiAiKG5vIGVycm9yIHRleHQpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICBjYWNoZS0+SW5zZXJ0KGhhc2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3B2VmFsaWRhdG9yT3B0aW9uc0Rlc3Ryb3kob3B0aW9ucyk7CisgICAgICAgIHNwdkRpYWdub3N0aWNEZXN0cm95KGRpYWcpOworICAgICAgICBzcHZDb250ZXh0RGVzdHJveShjdHgpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCitib29sIENvcmVDaGVja3M6OlZhbGlkYXRlQ29tcHV0ZVdvcmtHcm91cFNpemVzKGNvbnN0IFNIQURFUl9NT0RVTEVfU1RBVEUgKnNoYWRlcikgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIHVpbnQzMl90IGxvY2FsX3NpemVfeCA9IDA7CisgICAgdWludDMyX3QgbG9jYWxfc2l6ZV95ID0gMDsKKyAgICB1aW50MzJfdCBsb2NhbF9zaXplX3ogPSAwOworICAgIGlmIChGaW5kTG9jYWxTaXplKHNoYWRlciwgbG9jYWxfc2l6ZV94LCBsb2NhbF9zaXplX3ksIGxvY2FsX3NpemVfeikpIHsKKyAgICAgICAgaWYgKGxvY2FsX3NpemVfeCA+IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVswXSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNoYWRlci0+dmtfc2hhZGVyX21vZHVsZSksICJVTkFTU0lHTkVELWZlYXR1cmVzLWxpbWl0cy1tYXhDb21wdXRlV29ya0dyb3VwU2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGxvY2FsX3NpemVfeCAoJSIgUFJJdTMyICIpIGV4Y2VlZHMgZGV2aWNlIGxpbWl0IG1heENvbXB1dGVXb3JrR3JvdXBTaXplWzBdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNoYWRlci0+dmtfc2hhZGVyX21vZHVsZSkuY19zdHIoKSwgbG9jYWxfc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVswXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvY2FsX3NpemVfeSA+IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsxXSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNoYWRlci0+dmtfc2hhZGVyX21vZHVsZSksICJVTkFTU0lHTkVELWZlYXR1cmVzLWxpbWl0cy1tYXhDb21wdXRlV29ya0dyb3VwU2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGxvY2FsX3NpemVfeSAoJSIgUFJJdTMyICIpIGV4Y2VlZHMgZGV2aWNlIGxpbWl0IG1heENvbXB1dGVXb3JrR3JvdXBTaXplWzFdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNoYWRlci0+dmtfc2hhZGVyX21vZHVsZSkuY19zdHIoKSwgbG9jYWxfc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsxXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvY2FsX3NpemVfeiA+IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSkgeworICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KHNoYWRlci0+dmtfc2hhZGVyX21vZHVsZSksICJVTkFTU0lHTkVELWZlYXR1cmVzLWxpbWl0cy1tYXhDb21wdXRlV29ya0dyb3VwU2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGxvY2FsX3NpemVfeiAoJSIgUFJJdTMyICIpIGV4Y2VlZHMgZGV2aWNlIGxpbWl0IG1heENvbXB1dGVXb3JrR3JvdXBTaXplWzJdICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNoYWRlci0+dmtfc2hhZGVyX21vZHVsZSkuY19zdHIoKSwgbG9jYWxfc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSk7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBsaW1pdCA9IHBoeXNfZGV2X3Byb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnM7CisgICAgICAgIHVpbnQ2NF90IGludm9jYXRpb25zID0gbG9jYWxfc2l6ZV94ICogbG9jYWxfc2l6ZV95OworICAgICAgICAvLyBQcmV2ZW50IG92ZXJmbG93LgorICAgICAgICBib29sIGZhaWwgPSBmYWxzZTsKKyAgICAgICAgaWYgKGludm9jYXRpb25zID4gVUlOVDMyX01BWCB8fCBpbnZvY2F0aW9ucyA+IGxpbWl0KSB7CisgICAgICAgICAgICBmYWlsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZhaWwpIHsKKyAgICAgICAgICAgIGludm9jYXRpb25zICo9IGxvY2FsX3NpemVfejsKKyAgICAgICAgICAgIGlmIChpbnZvY2F0aW9ucyA+IFVJTlQzMl9NQVggfHwgaW52b2NhdGlvbnMgPiBsaW1pdCkgeworICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmYWlsKSB7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVG9VaW50NjQoc2hhZGVyLT52a19zaGFkZXJfbW9kdWxlKSwgIlVOQVNTSUdORUQtZmVhdHVyZXMtbGltaXRzLW1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGxvY2FsX3NpemUgKCUiIFBSSXUzMiAiLCAlIiBQUkl1MzIgIiwgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zICglIiBQUkl1MzIgIikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YS0+Rm9ybWF0SGFuZGxlKHNoYWRlci0+dmtfc2hhZGVyX21vZHVsZSkuY19zdHIoKSwgbG9jYWxfc2l6ZV94LCBsb2NhbF9zaXplX3ksIGxvY2FsX3NpemVfeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNraXA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvc2hhZGVyX3ZhbGlkYXRpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9zaGFkZXJfdmFsaWRhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDExZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvc2hhZGVyX3ZhbGlkYXRpb24uaApAQCAtMCwwICsxLDMyOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqLworI2lmbmRlZiBWVUxLQU5fU0hBREVSX1ZBTElEQVRJT05fSAorI2RlZmluZSBWVUxLQU5fU0hBREVSX1ZBTElEQVRJT05fSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKyNpbmNsdWRlIDxTUElSVi9zcGlydi5ocHA+CisjaW5jbHVkZSA8Z2VuZXJhdGVkL3NwaXJ2X3Rvb2xzX2NvbW1pdF9pZC5oPgorI2luY2x1ZGUgInNwaXJ2LXRvb2xzL29wdGltaXplci5ocHAiCisjaW5jbHVkZSAiY29yZV92YWxpZGF0aW9uX3R5cGVzLmgiCisKKy8vIEEgZm9yd2FyZCBpdGVyYXRvciBvdmVyIHNwaXJ2IGluc3RydWN0aW9ucy4gUHJvdmlkZXMgZWFzeSBhY2Nlc3MgdG8gbGVuLCBvcGNvZGUsIGFuZCBjb250ZW50IHdvcmRzCisvLyB3aXRob3V0IHRoZSBjYWxsZXIgbmVlZGluZyB0byBjYXJlIHRvbyBtdWNoIGFib3V0IHRoZSBwaHlzaWNhbCBTUElSViBtb2R1bGUgbGF5b3V0Lgorc3RydWN0IHNwaXJ2X2luc3RfaXRlciB7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciB6ZXJvOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisKKyAgICB1aW50MzJfdCBsZW4oKSBjb25zdCB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gKml0ID4+IDE2OworICAgICAgICBhc3NlcnQocmVzdWx0ID4gMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdWludDMyX3Qgb3Bjb2RlKCkgeyByZXR1cm4gKml0ICYgMHgwZmZmZnU7IH0KKworICAgIHVpbnQzMl90IGNvbnN0ICZ3b3JkKHVuc2lnbmVkIG4pIGNvbnN0IHsKKyAgICAgICAgYXNzZXJ0KG4gPCBsZW4oKSk7CisgICAgICAgIHJldHVybiBpdFtuXTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBvZmZzZXQoKSB7IHJldHVybiAodWludDMyX3QpKGl0IC0gemVybyk7IH0KKworICAgIHNwaXJ2X2luc3RfaXRlcigpIHt9CisKKyAgICBzcGlydl9pbnN0X2l0ZXIoc3RkOjp2ZWN0b3I8dWludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciB6ZXJvLCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGl0KSA6IHplcm8oemVybyksIGl0KGl0KSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj09KHNwaXJ2X2luc3RfaXRlciBjb25zdCAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuIGl0ID09IG90aGVyLml0OyB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oc3BpcnZfaW5zdF9pdGVyIGNvbnN0ICZvdGhlcikgY29uc3QgeyByZXR1cm4gaXQgIT0gb3RoZXIuaXQ7IH0KKworICAgIHNwaXJ2X2luc3RfaXRlciBvcGVyYXRvcisrKGludCkgeyAgLy8geCsrCisgICAgICAgIHNwaXJ2X2luc3RfaXRlciBpaSA9ICp0aGlzOworICAgICAgICBpdCArPSBsZW4oKTsKKyAgICAgICAgcmV0dXJuIGlpOworICAgIH0KKworICAgIHNwaXJ2X2luc3RfaXRlciBvcGVyYXRvcisrKCkgeyAgLy8gKyt4OworICAgICAgICBpdCArPSBsZW4oKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIFRoZSBpdGVyYXRvciBhbmQgdGhlIHZhbHVlIGFyZSB0aGUgc2FtZSB0aGluZy4KKyAgICBzcGlydl9pbnN0X2l0ZXIgJm9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgICAgc3BpcnZfaW5zdF9pdGVyIGNvbnN0ICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorfTsKKworc3RydWN0IGRlY29yYXRpb25fc2V0IHsKKyAgICBlbnVtIHsKKyAgICAgICAgbG9jYXRpb25fYml0ID0gMSA8PCAwLAorICAgICAgICBwYXRjaF9iaXQgPSAxIDw8IDEsCisgICAgICAgIHJlbGF4ZWRfcHJlY2lzaW9uX2JpdCA9IDEgPDwgMiwKKyAgICAgICAgYmxvY2tfYml0ID0gMSA8PCAzLAorICAgICAgICBidWZmZXJfYmxvY2tfYml0ID0gMSA8PCA0LAorICAgICAgICBjb21wb25lbnRfYml0ID0gMSA8PCA1LAorICAgICAgICBpbnB1dF9hdHRhY2htZW50X2luZGV4X2JpdCA9IDEgPDwgNiwKKyAgICAgICAgZGVzY3JpcHRvcl9zZXRfYml0ID0gMSA8PCA3LAorICAgICAgICBiaW5kaW5nX2JpdCA9IDEgPDwgOCwKKyAgICAgICAgbm9ud3JpdGFibGVfYml0ID0gMSA8PCA5LAorICAgICAgICBidWlsdGluX2JpdCA9IDEgPDwgMTAsCisgICAgfTsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgbG9jYXRpb24gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpOworICAgIHVpbnQzMl90IGNvbXBvbmVudCA9IDA7CisgICAgdWludDMyX3QgaW5wdXRfYXR0YWNobWVudF9pbmRleCA9IDA7CisgICAgdWludDMyX3QgZGVzY3JpcHRvcl9zZXQgPSAwOworICAgIHVpbnQzMl90IGJpbmRpbmcgPSAwOworICAgIHVpbnQzMl90IGJ1aWx0aW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpOworCisgICAgdm9pZCBtZXJnZShkZWNvcmF0aW9uX3NldCBjb25zdCAmb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLmZsYWdzICYgbG9jYXRpb25fYml0KSBsb2NhdGlvbiA9IG90aGVyLmxvY2F0aW9uOworICAgICAgICBpZiAob3RoZXIuZmxhZ3MgJiBjb21wb25lbnRfYml0KSBjb21wb25lbnQgPSBvdGhlci5jb21wb25lbnQ7CisgICAgICAgIGlmIChvdGhlci5mbGFncyAmIGlucHV0X2F0dGFjaG1lbnRfaW5kZXhfYml0KSBpbnB1dF9hdHRhY2htZW50X2luZGV4ID0gb3RoZXIuaW5wdXRfYXR0YWNobWVudF9pbmRleDsKKyAgICAgICAgaWYgKG90aGVyLmZsYWdzICYgZGVzY3JpcHRvcl9zZXRfYml0KSBkZXNjcmlwdG9yX3NldCA9IG90aGVyLmRlc2NyaXB0b3Jfc2V0OworICAgICAgICBpZiAob3RoZXIuZmxhZ3MgJiBiaW5kaW5nX2JpdCkgYmluZGluZyA9IG90aGVyLmJpbmRpbmc7CisgICAgICAgIGlmIChvdGhlci5mbGFncyAmIGJ1aWx0aW5fYml0KSBidWlsdGluID0gb3RoZXIuYnVpbHRpbjsKKyAgICAgICAgZmxhZ3MgfD0gb3RoZXIuZmxhZ3M7CisgICAgfQorCisgICAgdm9pZCBhZGQodWludDMyX3QgZGVjb3JhdGlvbiwgdWludDMyX3QgdmFsdWUpOworfTsKKworc3RydWN0IFNIQURFUl9NT0RVTEVfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgICAvLyBUaGUgc3BpcnYgaW1hZ2UgaXRzZWxmCisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHdvcmRzOworICAgIC8vIEEgbWFwcGluZyBvZiA8aWQ+IHRvIHRoZSBmaXJzdCB3b3JkIG9mIGl0cyBkZWYuIHRoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugd2Fsa2luZyB0eXBlCisgICAgLy8gdHJlZXMsIGNvbnN0YW50IGV4cHJlc3Npb25zLCBldGMgcmVxdWlyZXMganVtcGluZyBhbGwgb3ZlciB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1bnNpZ25lZCwgdW5zaWduZWQ+IGRlZl9pbmRleDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dW5zaWduZWQsIGRlY29yYXRpb25fc2V0PiBkZWNvcmF0aW9uczsKKyAgICBzdHJ1Y3QgRW50cnlQb2ludCB7CisgICAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgICAgVmtTaGFkZXJTdGFnZUZsYWdzIHN0YWdlOworICAgIH07CisgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXA8c3RkOjpzdHJpbmcsIEVudHJ5UG9pbnQ+IGVudHJ5X3BvaW50czsKKyAgICBib29sIGhhc192YWxpZF9zcGlydjsKKyAgICBib29sIGhhc19zcGVjaWFsaXphdGlvbl9jb25zdGFudHM7CisgICAgVmtTaGFkZXJNb2R1bGUgdmtfc2hhZGVyX21vZHVsZTsKKyAgICB1aW50MzJfdCBncHVfdmFsaWRhdGlvbl9zaGFkZXJfaWQ7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gUHJlcHJvY2Vzc1NoYWRlckJpbmFyeSh1aW50MzJfdCAqc3JjX2JpbmFyeSwgc2l6ZV90IGJpbmFyeV9zaXplLCBzcHZfdGFyZ2V0X2VudiBlbnYpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHNyYyhzcmNfYmluYXJ5LCBzcmNfYmluYXJ5ICsgYmluYXJ5X3NpemUgLyBzaXplb2YodWludDMyX3QpKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGdyb3VwIGRlY29yYXRpb24gaW5zdHJ1Y3Rpb25zLCBhbmQgZmxhdHRlbiB0aGVtIGlmIGZvdW5kLgorICAgICAgICBib29sIGhhc19ncm91cF9kZWNvcmF0aW9uID0gZmFsc2U7CisgICAgICAgIGJvb2wgZG9uZSA9IGZhbHNlOworCisgICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgU1BJUi1WIG1vZHVsZSwgbG9va2luZyBmb3IgZ3JvdXAgZGVjb3JhdGlvbiBhbmQgc3BlY2lhbGl6YXRpb24gY29uc3RhbnQgaW5zdHJ1Y3Rpb25zLgorICAgICAgICAvLyBTa2lwIHRoZSBoZWFkZXIgKDUgd29yZHMpLgorICAgICAgICBhdXRvIGl0ciA9IHNwaXJ2X2luc3RfaXRlcihzcmMuYmVnaW4oKSwgc3JjLmJlZ2luKCkgKyA1KTsKKyAgICAgICAgYXV0byBpdHJlbmQgPSBzcGlydl9pbnN0X2l0ZXIoc3JjLmJlZ2luKCksIHNyYy5lbmQoKSk7CisgICAgICAgIHdoaWxlIChpdHIgIT0gaXRyZW5kICYmICFkb25lKSB7CisgICAgICAgICAgICBzcHY6Ok9wIG9wY29kZSA9IChzcHY6Ok9wKWl0ci5vcGNvZGUoKTsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wRGVjb3JhdGlvbkdyb3VwOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEdyb3VwRGVjb3JhdGU6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wR3JvdXBNZW1iZXJEZWNvcmF0ZToKKyAgICAgICAgICAgICAgICAgICAgaGFzX2dyb3VwX2RlY29yYXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BTcGVjQ29uc3RhbnRUcnVlOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFNwZWNDb25zdGFudEZhbHNlOgorICAgICAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFNwZWNDb25zdGFudDoKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BTcGVjQ29uc3RhbnRDb21wb3NpdGU6CisgICAgICAgICAgICAgICAgY2FzZSBzcHY6Ok9wU3BlY0NvbnN0YW50T3A6CisgICAgICAgICAgICAgICAgICAgIGhhc19zcGVjaWFsaXphdGlvbl9jb25zdGFudHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIHNwdjo6T3BGdW5jdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgLy8gQW4gT3BGdW5jdGlvbiBpbmRpY2F0ZXMgdGhlcmUgYXJlIG5vIG1vcmUgZGVjb3JhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXRyKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFzX2dyb3VwX2RlY29yYXRpb24pIHsKKyAgICAgICAgICAgIHNwdnRvb2xzOjpPcHRpbWl6ZXIgb3B0aW1pemVyKGVudik7CisgICAgICAgICAgICBvcHRpbWl6ZXIuUmVnaXN0ZXJQYXNzKHNwdnRvb2xzOjpDcmVhdGVGbGF0dGVuRGVjb3JhdGlvblBhc3MoKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gb3B0aW1pemVkX2JpbmFyeTsKKyAgICAgICAgICAgIC8vIFJ1biBvcHRpbWl6ZXIgdG8gZmxhdHRlbiBkZWNvcmF0aW9ucyBvbmx5LCBzZXQgc2tpcF92YWxpZGF0aW9uIHNvIGFzIHRvIG5vdCByZS1ydW4gdmFsaWRhdG9yCisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgb3B0aW1pemVyLlJ1bihzcmNfYmluYXJ5LCBiaW5hcnlfc2l6ZSAvIHNpemVvZih1aW50MzJfdCksICZvcHRpbWl6ZWRfYmluYXJ5LCBzcHZ0b29sczo6VmFsaWRhdG9yT3B0aW9ucygpLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW1pemVkX2JpbmFyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBSZXR1cm4gdGhlIG9yaWdpbmFsIG1vZHVsZS4KKyAgICAgICAgcmV0dXJuIHNyYzsKKyAgICB9CisKKyAgICBTSEFERVJfTU9EVUxFX1NUQVRFKFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBjb25zdCAqcENyZWF0ZUluZm8sIFZrU2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwgc3B2X3RhcmdldF9lbnYgZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdW5pcXVlX3NoYWRlcl9pZCkKKyAgICAgICAgOiB3b3JkcyhQcmVwcm9jZXNzU2hhZGVyQmluYXJ5KCh1aW50MzJfdCAqKXBDcmVhdGVJbmZvLT5wQ29kZSwgcENyZWF0ZUluZm8tPmNvZGVTaXplLCBlbnYpKSwKKyAgICAgICAgICBkZWZfaW5kZXgoKSwKKyAgICAgICAgICBoYXNfdmFsaWRfc3BpcnYodHJ1ZSksCisgICAgICAgICAgdmtfc2hhZGVyX21vZHVsZShzaGFkZXJNb2R1bGUpLAorICAgICAgICAgIGdwdV92YWxpZGF0aW9uX3NoYWRlcl9pZCh1bmlxdWVfc2hhZGVyX2lkKSB7CisgICAgICAgIEJ1aWxkRGVmSW5kZXgoKTsKKyAgICB9CisKKyAgICBTSEFERVJfTU9EVUxFX1NUQVRFKCkgOiBoYXNfdmFsaWRfc3BpcnYoZmFsc2UpLCB2a19zaGFkZXJfbW9kdWxlKFZLX05VTExfSEFORExFKSwgZ3B1X3ZhbGlkYXRpb25fc2hhZGVyX2lkKFVJTlQzMl9NQVgpIHt9CisKKyAgICBkZWNvcmF0aW9uX3NldCBnZXRfZGVjb3JhdGlvbnModW5zaWduZWQgaWQpIGNvbnN0IHsKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBhY3R1YWwgZGVjb3JhdGlvbnMgZm9yIHRoaXMgaWQsIG9yIGEgZGVmYXVsdCBzZXQuCisgICAgICAgIGF1dG8gaXQgPSBkZWNvcmF0aW9ucy5maW5kKGlkKTsKKyAgICAgICAgaWYgKGl0ICE9IGRlY29yYXRpb25zLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIGRlY29yYXRpb25fc2V0KCk7CisgICAgfQorCisgICAgLy8gRXhwb3NlIGJlZ2luKCkgLyBlbmQoKSB0byBlbmFibGUgcmFuZ2UtYmFzZWQgZm9yCisgICAgc3BpcnZfaW5zdF9pdGVyIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gc3BpcnZfaW5zdF9pdGVyKHdvcmRzLmJlZ2luKCksIHdvcmRzLmJlZ2luKCkgKyA1KTsgfSAgLy8gRmlyc3QgaW5zbgorICAgIHNwaXJ2X2luc3RfaXRlciBlbmQoKSBjb25zdCB7IHJldHVybiBzcGlydl9pbnN0X2l0ZXIod29yZHMuYmVnaW4oKSwgd29yZHMuZW5kKCkpOyB9ICAgICAgICAgIC8vIEp1c3QgcGFzdCBsYXN0IGluc24KKyAgICAvLyBHaXZlbiBhbiBvZmZzZXQgaW50byB0aGUgbW9kdWxlLCBwcm9kdWNlIGFuIGl0ZXJhdG9yIHRoZXJlLgorICAgIHNwaXJ2X2luc3RfaXRlciBhdCh1bnNpZ25lZCBvZmZzZXQpIGNvbnN0IHsgcmV0dXJuIHNwaXJ2X2luc3RfaXRlcih3b3Jkcy5iZWdpbigpLCB3b3Jkcy5iZWdpbigpICsgb2Zmc2V0KTsgfQorCisgICAgLy8gR2V0cyBhbiBpdGVyYXRvciB0byB0aGUgZGVmaW5pdGlvbiBvZiBhbiBpZAorICAgIHNwaXJ2X2luc3RfaXRlciBnZXRfZGVmKHVuc2lnbmVkIGlkKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBkZWZfaW5kZXguZmluZChpZCk7CisgICAgICAgIGlmIChpdCA9PSBkZWZfaW5kZXguZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbmQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXQoaXQtPnNlY29uZCk7CisgICAgfQorCisgICAgdm9pZCBCdWlsZERlZkluZGV4KCk7Cit9OworCitjbGFzcyBWYWxpZGF0aW9uQ2FjaGUgeworICAgIC8vIGhhc2hlcyBvZiBzaGFkZXJzIHRoYXQgaGF2ZSBwYXNzZWQgdmFsaWRhdGlvbiBiZWZvcmUsIGFuZCBjYW4gYmUgc2tpcHBlZC4KKyAgICAvLyB3ZSBkb24ndCBzdG9yZSBuZWdhdGl2ZSByZXN1bHRzLCBhcyB3ZSB3b3VsZCBoYXZlIHRvIGFsc28gc3RvcmUgd2hhdCB3YXMKKyAgICAvLyB3cm9uZyB3aXRoIHRoZW07IGFsc28sIHdlIGV4cGVjdCB0aGV5IHdpbGwgZ2V0IGZpeGVkLCBzbyB3ZSdyZSBsZXNzCisgICAgLy8gbGlrZWx5IHRvIHNlZSB0aGVtIGFnYWluLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gZ29vZF9zaGFkZXJfaGFzaGVzOworICAgIFZhbGlkYXRpb25DYWNoZSgpIHt9CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBWa1ZhbGlkYXRpb25DYWNoZUVYVCBDcmVhdGUoVmtWYWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvRVhUIGNvbnN0ICpwQ3JlYXRlSW5mbykgeworICAgICAgICBhdXRvIGNhY2hlID0gbmV3IFZhbGlkYXRpb25DYWNoZSgpOworICAgICAgICBjYWNoZS0+TG9hZChwQ3JlYXRlSW5mbyk7CisgICAgICAgIHJldHVybiBWa1ZhbGlkYXRpb25DYWNoZUVYVChjYWNoZSk7CisgICAgfQorCisgICAgdm9pZCBMb2FkKFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCBjb25zdCAqcENyZWF0ZUluZm8pIHsKKyAgICAgICAgY29uc3QgYXV0byBoZWFkZXJTaXplID0gMiAqIHNpemVvZih1aW50MzJfdCkgKyBWS19VVUlEX1NJWkU7CisgICAgICAgIGF1dG8gc2l6ZSA9IGhlYWRlclNpemU7CisgICAgICAgIGlmICghcENyZWF0ZUluZm8tPnBJbml0aWFsRGF0YSB8fCBwQ3JlYXRlSW5mby0+aW5pdGlhbERhdGFTaXplIDwgc2l6ZSkgcmV0dXJuOworCisgICAgICAgIHVpbnQzMl90IGNvbnN0ICpkYXRhID0gKHVpbnQzMl90IGNvbnN0ICopcENyZWF0ZUluZm8tPnBJbml0aWFsRGF0YTsKKyAgICAgICAgaWYgKGRhdGFbMF0gIT0gc2l6ZSkgcmV0dXJuOworICAgICAgICBpZiAoZGF0YVsxXSAhPSBWS19WQUxJREFUSU9OX0NBQ0hFX0hFQURFUl9WRVJTSU9OX09ORV9FWFQpIHJldHVybjsKKyAgICAgICAgdWludDhfdCBleHBlY3RlZF91dWlkW1ZLX1VVSURfU0laRV07CisgICAgICAgIFNoYTFUb1ZrVXVpZChTUElSVl9UT09MU19DT01NSVRfSUQsIGV4cGVjdGVkX3V1aWQpOworICAgICAgICBpZiAobWVtY21wKCZkYXRhWzJdLCBleHBlY3RlZF91dWlkLCBWS19VVUlEX1NJWkUpICE9IDApIHJldHVybjsgIC8vIGRpZmZlcmVudCB2ZXJzaW9uCisKKyAgICAgICAgZGF0YSA9ICh1aW50MzJfdCBjb25zdCAqKShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QgY29uc3QgKj4oZGF0YSkgKyBoZWFkZXJTaXplKTsKKworICAgICAgICBmb3IgKDsgc2l6ZSA8IHBDcmVhdGVJbmZvLT5pbml0aWFsRGF0YVNpemU7IGRhdGErKywgc2l6ZSArPSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICBnb29kX3NoYWRlcl9oYXNoZXMuaW5zZXJ0KCpkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgV3JpdGUoc2l6ZV90ICpwRGF0YVNpemUsIHZvaWQgKnBEYXRhKSB7CisgICAgICAgIGNvbnN0IGF1dG8gaGVhZGVyU2l6ZSA9IDIgKiBzaXplb2YodWludDMyX3QpICsgVktfVVVJRF9TSVpFOyAgLy8gNCBieXRlcyBmb3IgaGVhZGVyIHNpemUgKyA0IGJ5dGVzIGZvciB2ZXJzaW9uIG51bWJlciArIFVVSUQKKyAgICAgICAgaWYgKCFwRGF0YSkgeworICAgICAgICAgICAgKnBEYXRhU2l6ZSA9IGhlYWRlclNpemUgKyBnb29kX3NoYWRlcl9oYXNoZXMuc2l6ZSgpICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqcERhdGFTaXplIDwgaGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgKnBEYXRhU2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm47ICAvLyBUb28gc21hbGwgZm9yIGV2ZW4gdGhlIGhlYWRlciEKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90ICpvdXQgPSAodWludDMyX3QgKilwRGF0YTsKKyAgICAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSBoZWFkZXJTaXplOworCisgICAgICAgIC8vIFdyaXRlIHRoZSBoZWFkZXIKKyAgICAgICAgKm91dCsrID0gaGVhZGVyU2l6ZTsKKyAgICAgICAgKm91dCsrID0gVktfVkFMSURBVElPTl9DQUNIRV9IRUFERVJfVkVSU0lPTl9PTkVfRVhUOworICAgICAgICBTaGExVG9Wa1V1aWQoU1BJUlZfVE9PTFNfQ09NTUlUX0lELCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4ob3V0KSk7CisgICAgICAgIG91dCA9ICh1aW50MzJfdCAqKShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4ob3V0KSArIFZLX1VVSURfU0laRSk7CisKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gZ29vZF9zaGFkZXJfaGFzaGVzLmJlZ2luKCk7IGl0ICE9IGdvb2Rfc2hhZGVyX2hhc2hlcy5lbmQoKSAmJiBhY3R1YWxTaXplIDwgKnBEYXRhU2l6ZTsKKyAgICAgICAgICAgICBpdCsrLCBvdXQrKywgYWN0dWFsU2l6ZSArPSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICAqb3V0ID0gKml0OworICAgICAgICB9CisKKyAgICAgICAgKnBEYXRhU2l6ZSA9IGFjdHVhbFNpemU7CisgICAgfQorCisgICAgdm9pZCBNZXJnZShWYWxpZGF0aW9uQ2FjaGUgY29uc3QgKm90aGVyKSB7CisgICAgICAgIGdvb2Rfc2hhZGVyX2hhc2hlcy5yZXNlcnZlKGdvb2Rfc2hhZGVyX2hhc2hlcy5zaXplKCkgKyBvdGhlci0+Z29vZF9zaGFkZXJfaGFzaGVzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byBoIDogb3RoZXItPmdvb2Rfc2hhZGVyX2hhc2hlcykgZ29vZF9zaGFkZXJfaGFzaGVzLmluc2VydChoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdWludDMyX3QgTWFrZVNoYWRlckhhc2goVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIGNvbnN0ICpzbWNpKTsKKworICAgIGJvb2wgQ29udGFpbnModWludDMyX3QgaGFzaCkgeyByZXR1cm4gZ29vZF9zaGFkZXJfaGFzaGVzLmNvdW50KGhhc2gpICE9IDA7IH0KKworICAgIHZvaWQgSW5zZXJ0KHVpbnQzMl90IGhhc2gpIHsgZ29vZF9zaGFkZXJfaGFzaGVzLmluc2VydChoYXNoKTsgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBTaGExVG9Wa1V1aWQoY29uc3QgY2hhciAqc2hhMV9zdHIsIHVpbnQ4X3QgKnV1aWQpIHsKKyAgICAgICAgLy8gQ29udmVydCBzaGExX3N0ciBmcm9tIGEgaGV4IHN0cmluZyB0byBiaW5hcnkuIFdlIG9ubHkgbmVlZCBWS19VVUlEX1NJWkUgYnl0ZXMgb2YKKyAgICAgICAgLy8gb3V0cHV0LCBzbyBwYWQgd2l0aCB6ZXJvZXMgaWYgdGhlIGlucHV0IHN0cmluZyBpcyBzaG9ydGVyIHRoYW4gdGhhdCwgYW5kIHRydW5jYXRlCisgICAgICAgIC8vIGlmIGl0J3MgbG9uZ2VyLgorICAgICAgICBjaGFyIHBhZGRlZF9zaGExX3N0clsyICogVktfVVVJRF9TSVpFICsgMV0gPSB7fTsgIC8vIDIgaGV4IGRpZ2l0cyA9PSAxIGJ5dGUKKyAgICAgICAgc3RkOjpzdHJuY3B5KHBhZGRlZF9zaGExX3N0ciwgc2hhMV9zdHIsIDIgKiBWS19VVUlEX1NJWkUpOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBWS19VVUlEX1NJWkU7ICsraSkgeworICAgICAgICAgICAgY29uc3QgY2hhciBieXRlX3N0cltdID0ge3BhZGRlZF9zaGExX3N0clsyICogaSArIDBdLCBwYWRkZWRfc2hhMV9zdHJbMiAqIGkgKyAxXSwgJ1wwJ307CisgICAgICAgICAgICB1dWlkW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc3RkOjpzdHJ0b3VsKGJ5dGVfc3RyLCBudWxscHRyLCAxNikpOworICAgICAgICB9CisgICAgfQorfTsKKworc3BpcnZfaW5zdF9pdGVyIEZpbmRFbnRyeXBvaW50KFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QgKnNyYywgY2hhciBjb25zdCAqbmFtZSwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHN0YWdlQml0cyk7CisKKy8vIEZvciBzb21lIGFuYWx5c2VzLCB3ZSBuZWVkIHRvIGtub3cgYWJvdXQgYWxsIGlkcyByZWZlcmVuY2VkIGJ5IHRoZSBzdGF0aWMgY2FsbCB0cmVlIG9mIGEgcGFydGljdWxhciBlbnRyeXBvaW50LiBUaGlzIGlzCisvLyBpbXBvcnRhbnQgZm9yIGlkZW50aWZ5aW5nIHRoZSBzZXQgb2Ygc2hhZGVyIHJlc291cmNlcyBhY3R1YWxseSB1c2VkIGJ5IGFuIGVudHJ5cG9pbnQsIGZvciBleGFtcGxlLgorLy8gTm90ZTogd2Ugb25seSBleHBsb3JlIHBhcnRzIG9mIHRoZSBpbWFnZSB3aGljaCBtaWdodCBhY3R1YWxseSBjb250YWluIGlkcyB3ZSBjYXJlIGFib3V0IGZvciB0aGUgYWJvdmUgYW5hbHlzZXMuCisvLyAgLSBOT1QgdGhlIHNoYWRlciBpbnB1dC9vdXRwdXQgaW50ZXJmYWNlcy4KKy8vCisvLyBUT0RPOiBUaGUgc2V0IG9mIGludGVyZXN0aW5nIG9wY29kZXMgaGVyZSB3YXMgZGV0ZXJtaW5lZCBieSBleWViYWxsaW5nIHRoZSBTUElSViBzcGVjLiBJdCBtaWdodCBiZSB3b3J0aAorLy8gY29udmVydGluZyBwYXJ0cyBvZiB0aGlzIHRvIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBtYWNoaW5lLXJlYWRhYmxlIHNwZWMgaW5zdGVhZC4KK3N0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gTWFya0FjY2Vzc2libGVJZHMoU0hBREVSX01PRFVMRV9TVEFURSBjb25zdCAqc3JjLCBzcGlydl9pbnN0X2l0ZXIgZW50cnlwb2ludCk7CisKK3ZvaWQgUHJvY2Vzc0V4ZWN1dGlvbk1vZGVzKFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QgKnNyYywgY29uc3Qgc3BpcnZfaW5zdF9pdGVyICZlbnRyeXBvaW50LCBQSVBFTElORV9TVEFURSAqcGlwZWxpbmUpOworCitzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8ZGVzY3JpcHRvcl9zbG90X3QsIGludGVyZmFjZV92YXI+PiBDb2xsZWN0SW50ZXJmYWNlQnlEZXNjcmlwdG9yU2xvdCgKKyAgICBkZWJ1Z19yZXBvcnRfZGF0YSBjb25zdCAqcmVwb3J0X2RhdGEsIFNIQURFUl9NT0RVTEVfU1RBVEUgY29uc3QgKnNyYywgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBjb25zdCAmYWNjZXNzaWJsZV9pZHMsCisgICAgYm9vbCAqaGFzX3dyaXRhYmxlX2Rlc2NyaXB0b3IpOworCit1aW50MzJfdCBEZXNjcmlwdG9yVHlwZVRvUmVxcyhTSEFERVJfTU9EVUxFX1NUQVRFIGNvbnN0ICptb2R1bGUsIHVpbnQzMl90IHR5cGVfaWQpOworCisjZW5kaWYgIC8vIFZVTEtBTl9TSEFERVJfVkFMSURBVElPTl9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvc3BhcnNlX2NvbnRhaW5lcnMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9zcGFyc2VfY29udGFpbmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwY2E4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvc3BhcnNlX2NvbnRhaW5lcnMuaApAQCAtMCwwICsxLDQwNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogSm9obiBadWxhdWYgPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKyNpZm5kZWYgU1BBUlNFX0NPTlRBSU5FUlNfSF8KKyNkZWZpbmUgU1BBUlNFX0NPTlRBSU5FUlNfSF8KKyNkZWZpbmUgTk9NSU5NQVgKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHNwYXJzZV9jb250YWluZXIgeworLy8gU3BhcnNlVmVjdG9yOgorLy8KKy8vIERlZmluZXMgYSBzcGFyc2Ugc2luZ2xlLWRpbWVuc2lvbmFsIGNvbnRhaW5lciB3aGljaCBpcyB0YXJnZXRlZCBmb3IgdGhyZWUgZGlzdGluY3QgdXNlIGNhc2VzCisvLyAxKSBMYXJnZSByYW5nZSBvZiBpbmRpY2VzIHNwYXJzZWx5IHBvcHVsYXRlZCAoIlNwYXJzZSBhY2Nlc3MiIGJlbG93KQorLy8gMikgTGFyZ2UgcmFuZ2Ugb2YgaW5kaWNlcyB3aGVyZSBhbGwgdmFsdWVzIGFyZSB0aGUgc2FtZSAoIlNwYXJzZSBhY2Nlc3MiIGJlbG93KQorLy8gMykgTGFyZ2UgcmFuZ2Ugb2YgdmFsdWVzIGRlbnNlbHkgcG9wdWxhdGVkIChtb3JlIHRoYXQgMS80IGZ1bGwpICgiRGVuc2UgYWNjZXNzIiBiZWxvdykKKy8vIDQpIFNtYWxsIHJhbmdlIG9mIHZhbHVlcyB3aGVyZSBkaXJlY3QgYWNjZXNzIGlzIG1vc3QgZWZmaWNpZW50ICgiRGVuc2UgYWNjZXNzIiBiZWxvdykKKy8vCisvLyBUbyB1cGRhdGUgc2VtYW50aWNzIGFyZSBzdXBwb3J0ZWQgYmFzZXMgb24ga1NldFJlcGxhY2VzOgorLy8gICAgdHJ1ZSAtLSB1cGRhdGVzIHRvIGFscmVhZHkgc2V0ICh2YWxpZCkgaW5kaWNlcyByZXBsYWNlIGN1cnJlbnQgdmFsdWUKKy8vICAgIGZhbHNlIC0tIHVwZGF0ZXMgdG8gYWxyZWFkeSBzZXQgKHZhbGlkKSBpbmRpY2llcyBhcmUgaWdub3JlZC4KKy8vCisvLyBUaGVvcnkgb2Ygb3BlcmF0aW9uOgorLy8KKy8vIFdoZW4gY3JlYXRlZCwgYSBzcGFyc2UgdmVjdG9yIGlzIGNyZWF0ZWQgKGJhc2VkIG9uIHNpemUgcmVsYXRpdmUgdG8KKy8vIHRoZSBrU3BhcnNlVGhyZXNob2xkKSBpbiBlaXRoZXIgU3BhcnNlIG9yIERlbnNlIGFjY2VzcyBtb2RlLgorLy8KKy8vIEluICJTcGFyc2UgYWNjZXNzIiBtb2RlIGluZGl2aWR1YWwgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYSBtYXAga2V5ZWQKKy8vIGJ5IHRoZSBpbmRleC4gIEEgImZ1bGwgcmFuZ2UiIHZhbHVlIChpZiBzZXQpIGRlZmluZXMgdGhlIHZhbHVlIG9mIGFsbAorLy8gZW50cmllcyBub3QgcHJlc2VudCBpbiB0aGUgbWFwLiBTZXR0aW5nIGEgZnVsbCByYW5nZSB2YWx1ZSB2aWEKKy8vCisvLyAgICAgU2V0UmFuZ2UocmFuZ2VfbWluLCByYW5nZV9tYXgsIGZ1bGxfcmFuZ2VfdmFsdWUgKQorLy8KKy8vIGVpdGhlciBjbGVhcnMgdGhlIG1hcCAoa1NldFJlcGxhY2VzPT10cnVlKSBvciBwcmV2ZW50cyBmdXJ0aGVyCisvLyB1cGRhdGVzIHRvIHRoZSB2ZWN0b3IgKGtTZXRSZXBsYWNlcz09ZmFsc2UpLiAgSWYgdGhlIG1hcCBiZWNvbWVzCisvLyBtb3JlIHRoYW4gMS9rQ29udmVyc2lvblRocmVzaG9sZCAoPTQpIGZ1bGwsIHRoZSBTcGFyc2VWZWN0b3IgaXMKKy8vIGNvbnZlcnRlZCBpbnRvICJEZW5zZSBhY2Nlc3MiIG1vZGUuIEVudHJpZXMgYXJlIGNvcGllZCBmcm9tIG1hcCwKKy8vIHdpdGggbm9uLXByZXNlbnQgaW5kaWNlcyBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgKGtEZWZhdWx0VmFsdWUpCisvLyBvciB0aGUgZnVsbCByYW5nZSB2YWx1ZSAoaWYgcHJlc2VudCkuCisvLworLy8gSW4gIkRlbnNlIGFjY2VzcyIgbW9kZSwgdmFsdWVzIGFyZSAgc3RvcmVkIGluIGEgdmVjdG9yIHRoZSBzaXplIG9mCisvLyB0aGUgdmFsaWQgcmFuZ2UgaW5kZXhlZCBieSB0aGUgaW5jb21pbmcgaW5kZXggdmFsdWUgbWludXMgcmFuZ2VfbWluXy4KKy8vIFRoZSBzYW1lIHVwYXRlIHNlbWFudGljIGFwcGxpZXMgYmFzZXMgb24ga1NldFJlcGxhY2VzLgorLy8KKy8vIE5vdGUgdGhhdCB3aGVuIGtTcGFyc2VUaHJlc2hvbGQgaXMgemVybywgdGhlIG1hcCBpcyBhbHdheXMgaW4gIkRlbnNlIGFjY2VzcyIgbW9kZS4KKy8vCisvLyBBY2Nlc3M6CisvLworLy8gTk9URSBhbGwgImVuZCIgaW5kaWNlcyAoaW4gY29uc3RydWN0aW9uIG9yIGFjY2VzcykgYXJlICpleGNsdXNpdmUqLgorLy8KKy8vIEdpdmVuIHRoZSB2YXJpYWJsZSBzZW1hbnRpY3MgYW5kIGVmZmVjdGl2ZSBjb21wcmVzc2lvbiBvZiBTcGFyc2UKKy8vIGFjY2VzcyBtb2RlLCBhbGwgYWNjZXNzIGlzIHRocm91Z2ggR2V0LCBTZXQsIGFuZCBTZXRSYW5nZSBmdW5jdGlvbnMKKy8vIGFuZCBhIGNvbnN0YW50IGl0ZXJhdG9yLiBHZXQgcmV0dXJuIGVpdGhlciB0aGUgdmFsdWUgZm91bmQgKHVzaW5nCisvLyB0aGUgY3VycmVudCBhY2Nlc3MgbW9kZSkgb3IgdGhlIGtEZWZhdWx0VmFsdWUuIFNldCBhbmQgU2V0UmFuZ2UKKy8vIHJldHVybiB3aGV0aGVyIG9yIG5vdCBzdGF0ZSB3YXMgdXBkYXRlZCwgaW4gb3JkZXIgdG8gc3VwcG9ydCBkaXJ0eQorLy8gYml0IHVwZGF0ZXMgZm9yIGFueSBkZXBlbmRlbnQgc3RhdGUuCisvLworLy8gVGhlIGl0ZXJhdG9yIENvbnN0SXRlcmF0b3IgcHJvdmlkZXMgYmFzaWMsICJieSB2YWx1ZSIgYWNjZXNzLiBUaGUKKy8vICJieSB2YWx1ZSIgbmF0dXJlIG9mIHRoZSBhY2Nlc3MgcmVmbGVjdCB0aGUgY29tcHJlc3NlZCBuYXR1cmUKKy8vIG9wZXJhdG9ycyAqLCArKywgPT0sIGFuZCAhPSBhcmUgcHJvdmlkZWQsIHdpdGggdGhlIGxhdHRlciB0d28gb25seQorLy8gc3VpdGFibGUgZm9yIGNvbXBhcmlzb25zIHZzLiBjZW5kLiBUaGUgaXRlcmF0b3Igc2tpcHMgYWxsCisvLyBrRGVmYXVsdFZhbHVlIGVudHJpZXMgaW4gZWl0aGVyIGFjY2VzcyBtb2RlLCByZXR1cm5pbmcgYSBzdGQ6OnBhaXIKKy8vIGNvbnRhaW5pbmcge0luZGV4VHlwZSwgVmFsdWVUeXBlfS4gVGhlIG11bHRpcGxlIGFjY2VzcyBtb2RlcyBnaXZlCisvLyB0aGUgaXRlcmF0b3IgYSBiaXQgbW9yZSBjb21wbGV4aXR5IHRoYW4gaXMgb3B0aW1hbCwgYnV0IGhpZGVzIHRoZQorLy8gdW5kZXJseWluZyBjb21wbGV4aXR5IGZyb20gdGhlIGNhbGxlcnMuCisvLworLy8gVE9ETzogVXBkYXRlIGl0ZXJhdG9yIHRvIHVzZSBhIHJlZmVyZW5jZSAobGlrZWx5IHVzaW5nCisvLyByZWZlcmVuY2Vfd3JhcHBlci4uLikKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZV8sIHR5cGVuYW1lIFQsIGJvb2wga1NldFJlcGxhY2VzLCBUIGtEZWZhdWx0VmFsdWUgPSBUKCksIHNpemVfdCBrU3BhcnNlVGhyZXNob2xkID0gMTY+CitjbGFzcyBTcGFyc2VWZWN0b3IgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBJbmRleFR5cGVfIEluZGV4VHlwZTsKKyAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUgVmFsdWVUeXBlOworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPEluZGV4VHlwZSwgVmFsdWVUeXBlPiBTcGFyc2VUeXBlOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VmFsdWVUeXBlPiBEZW5zZVR5cGU7CisKKyAgICBTcGFyc2VWZWN0b3IoSW5kZXhUeXBlIHN0YXJ0LCBJbmRleFR5cGUgZW5kKQorICAgICAgICA6IHJhbmdlX21pbl8oc3RhcnQpLCByYW5nZV9tYXhfKGVuZCksIHRocmVzaG9sZF8oKGVuZCAtIHN0YXJ0KSAvIGtDb252ZXJzaW9uVGhyZXNob2xkKSB7CisgICAgICAgIGFzc2VydChlbmQgPiBzdGFydCk7CisgICAgICAgIFJlc2V0KCk7CisgICAgfQorCisgICAgLy8gSW5pdGlhbCBhY2Nlc3MgbW9kZSBpcyBzZXQgYmFzZWQgb24gcmFuZ2Ugc2l6ZSB2cy4ga1NwYXJzZVRocmVzaG9sZC4gIEVpdGhlciBzcGFyc2VfIG9yIGRlbnNlXyBpcyBhbHdheXMgc2V0LCBidXQgb25seQorICAgIC8vIGV2ZXIgb25lIGF0IGEgdGltZQorICAgIHZvaWQgUmVzZXQoKSB7CisgICAgICAgIGhhc19mdWxsX3JhbmdlX3ZhbHVlXyA9IGZhbHNlOworICAgICAgICBmdWxsX3JhbmdlX3ZhbHVlXyA9IGtEZWZhdWx0VmFsdWU7CisgICAgICAgIHNpemVfdCBjb3VudCA9IHJhbmdlX21heF8gLSByYW5nZV9taW5fOworICAgICAgICBpZiAoa1NwYXJzZVRocmVzaG9sZCA+IDAgJiYgKGNvdW50ID4ga1NwYXJzZVRocmVzaG9sZCkpIHsKKyAgICAgICAgICAgIHNwYXJzZV8ucmVzZXQobmV3IFNwYXJzZVR5cGUoKSk7CisgICAgICAgICAgICBkZW5zZV8ucmVzZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwYXJzZV8ucmVzZXQoKTsKKyAgICAgICAgICAgIGRlbnNlXy5yZXNldChuZXcgRGVuc2VUeXBlKGNvdW50LCBrRGVmYXVsdFZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBWYWx1ZVR5cGUgJkdldChjb25zdCBJbmRleFR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgLy8gTm90ZSB0aGF0IGhlcmUgKGFuZCBzaW1pbGFybHkgYmVsb3csIHRoZSAnSXNTcGFyc2UnIGNsYXVzZSBpcworICAgICAgICAvLyBlbGltaW5hdGVkIGFzIGRlYWQgY29kZSBpbiByZWxlYXNlIGJ1aWxkcyBpZiBrU3BhcnNlVGhyZXNob2xkPT0wCisgICAgICAgIGlmIChJc1NwYXJzZSgpKSB7CisgICAgICAgICAgICBpZiAoIXNwYXJzZV8tPmVtcHR5KCkpIHsgIC8vIERvbid0IGF0dGVtcHQgbG9va3VwIGluIGVtcHR5IG1hcAorICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBzcGFyc2VfLT5maW5kKGluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgIT0gc3BhcnNlXy0+Y2VuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZnVsbF9yYW5nZV92YWx1ZSwgcmV0dXJuIGl0LCBidXQgdGhlcmUgaXNuJ3QgYSBmdWxsX3JhbmdlX3ZhbHVlXywgaXQncyBzZXQgdG8gIGtEZWZhdWx0VmFsdWUKKyAgICAgICAgICAgIC8vIHNvIGl0J3Mgc3RpbGwgdGhlIGNvcnJlY3QgdGhpcyB0byByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBmdWxsX3JhbmdlX3ZhbHVlXzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERpcmVjdCBhY2Nlc3MKKyAgICAgICAgICAgIGFzc2VydChkZW5zZV8uZ2V0KCkpOworICAgICAgICAgICAgY29uc3QgVmFsdWVUeXBlICZ2YWx1ZSA9ICgqZGVuc2VfKVtpbmRleCAtIHJhbmdlX21pbl9dOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGEgaW5kZXhlcyB2YWx1ZSwgYmFzZWQgb24gdGhlIGFjY2VzcyBtb2RlLCB1cGRhdGUgc2VtYW50aWNzIGFyZSBlbmZvcmNlZCB3aXRoaW4gdGhlIGFjY2VzcyBtb2RlIHNwZWNpZmljIGZ1bmN0aW9uCisgICAgYm9vbCBTZXQoY29uc3QgSW5kZXhUeXBlIGluZGV4LCBjb25zdCBWYWx1ZVR5cGUgJnZhbHVlKSB7CisgICAgICAgIGJvb2wgdXBkYXRlZCA9IGZhbHNlOworICAgICAgICBpZiAoSXNTcGFyc2UoKSkgeworICAgICAgICAgICAgdXBkYXRlZCA9IFNldFNwYXJzZShpbmRleCwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGRlbnNlXy5nZXQoKSk7CisgICAgICAgICAgICB1cGRhdGVkID0gU2V0RGVuc2UoaW5kZXgsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXBkYXRlZDsKKyAgICB9CisKKyAgICAvLyBTZXQgYSByYW5nZSBvZiB2YWx1ZXMgYmFzZWQgb24gYWNjZXNzIG1vZGUsIHdpdGggc29tZSB1cGRhdGUgc2VtYW50aWNzIGFwcGxpZWQgYSB0aGUgcmFuZ2UgbGV2ZWwKKyAgICBib29sIFNldFJhbmdlKGNvbnN0IEluZGV4VHlwZSBzdGFydCwgSW5kZXhUeXBlIGVuZCwgVmFsdWVUeXBlIHZhbHVlKSB7CisgICAgICAgIGJvb2wgdXBkYXRlZCA9IGZhbHNlOworICAgICAgICBpZiAoSXNTcGFyc2UoKSkgeworICAgICAgICAgICAgaWYgKCFrU2V0UmVwbGFjZXMgJiYgSGFzRnVsbFJhbmdlKCkpIHJldHVybiBmYWxzZTsgIC8vIFdlIGhhdmUgZnVsbCBjb3ZlcmFnZSwgd2UgY2FuIGNoYW5nZSB0aGlzIG5vIG1vcmUKKworICAgICAgICAgICAgYm9vbCBpc19mdWxsX3JhbmdlID0gSXNGdWxsUmFuZ2Uoc3RhcnQsIGVuZCk7CisgICAgICAgICAgICBpZiAoa1NldFJlcGxhY2VzICYmIGlzX2Z1bGxfcmFuZ2UpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVkID0gdmFsdWUgIT0gZnVsbF9yYW5nZV92YWx1ZV87CisgICAgICAgICAgICAgICAgZnVsbF9yYW5nZV92YWx1ZV8gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoSGFzU3BhcnNlU3VicmFuZ2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNwYXJzZV8tPmNsZWFyKCk7ICAvLyBmdWxsIHJhbmdlIHJlcGxhY2VzIGFsbCBzdWJyYW5nZXMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaGFzX2Z1bGxfcmFuZ2VfdmFsdWVfIHN0YXRlIG9mIHRoZSBmdWxsX3JhbmdlX3ZhbHVlXyB0byBhdm9pZCBWYWx1ZVR5cGUgY29tcGFyaXNvbnMKKyAgICAgICAgICAgICAgICBoYXNfZnVsbF9yYW5nZV92YWx1ZV8gPSB2YWx1ZSAhPSBrRGVmYXVsdFZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgha1NldFJlcGxhY2VzICYmICh2YWx1ZSAhPSBrRGVmYXVsdFZhbHVlKSAmJiBpc19mdWxsX3JhbmdlICYmICFIYXNGdWxsUmFuZ2UoKSkgeworICAgICAgICAgICAgICAgIC8vIFdpdGggdGhlIHVwZGF0ZSBvbmx5IGludmFsaWQgc2VtYW50aWNzLCB0aGUgdmFsdWUgYmVjb21lcyB0aGUgZmFsbGJhY2ssIGFuZCB3aWxsIHByZXZlbnQgb3RoZXIgdXBkYXRlcworICAgICAgICAgICAgICAgIGZ1bGxfcmFuZ2VfdmFsdWVfID0gdmFsdWU7CisgICAgICAgICAgICAgICAgaGFzX2Z1bGxfcmFuZ2VfdmFsdWVfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgc3BhcnNlIG1hcCBhIGJpdAorICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHNwYXJzZV8tPmJlZ2luKCk7IGl0ICE9IHNwYXJzZV8tPmVuZCgpOykgeyAgLy8gbm8gaW5jcmVtZW50IGNsYXVzZSBiZWNhdXNlIG9mIGVyYXNlIGJlbG93CisgICAgICAgICAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kID09IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCA9IHNwYXJzZV8tPmVyYXNlKGl0KTsgIC8vIHJlbW92ZSByZWR1bmRhbnQgZW50cmllcworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgaW5kZXggPSBzdGFydDsgaW5kZXggPCBlbmQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogV2UgY2FuJ3QgdXNlIFNldFNwYXJzZSBoZXJlLCBiZWNhdXNlIHRoaXMgbWF5IGJlIGNvbnZlcnRlZCB0byBkZW5zZSBhY2Nlc3MgbWlkIHVwZGF0ZQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVkIHw9IFNldChpbmRleCwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAiRGVuc2UgQWNjZXNzIiBkb2VzIGF3YXkgd2l0aCB0aGUgZnVsbF9yYW5nZV92YWx1ZV8gbG9naWMsIHN0b3JpbmcgZW1wdHkgZW50cmllcyB1c2luZyBrRGVmYXVsdFZhbHVlCisgICAgICAgICAgICBhc3NlcnQoZGVuc2VfKTsKKyAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGluZGV4ID0gc3RhcnQ7IGluZGV4IDwgZW5kOyArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgdXBkYXRlZCA9IFNldERlbnNlKGluZGV4LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7CisgICAgfQorCisgICAgLy8gU2V0IG9ubHkgdGhlIG5vbi1kZWZhdWx0IHZhbHVlcyBmcm9tIGFub3RoZXIgc3BhcnNlIHZlY3RvcgorICAgIGJvb2wgTWVyZ2UoY29uc3QgU3BhcnNlVmVjdG9yICZmcm9tKSB7CisgICAgICAgIC8vIE11c3Qgbm90IHNldCBmcm9tIFNwYXJzZSBhcnJhY3kgd2l0aCBsYXJnZXIgYm91bmRzLi4uCisgICAgICAgIGFzc2VydCgocmFuZ2VfbWluXyA8PSBmcm9tLnJhbmdlX21pbl8pICYmIChyYW5nZV9tYXhfID49IGZyb20ucmFuZ2VfbWF4XykpOworICAgICAgICBib29sIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGZyb20uSXNTcGFyc2UoKSkgeworICAgICAgICAgICAgaWYgKGZyb20uSGFzRnVsbFJhbmdlKCkgJiYgIWZyb20uSGFzU3BhcnNlU3VicmFuZ2VzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaG9ydCBjdXQgdG8gY29weSBhIGZ1bGwgcmFuZ2UgaWYgdGhhdCdzIGFsbCB3ZSBoYXZlCisgICAgICAgICAgICAgICAgdXBkYXRlZCB8PSBTZXRSYW5nZShmcm9tLnJhbmdlX21pbl8sIGZyb20ucmFuZ2VfbWF4XywgZnJvbS5mdWxsX3JhbmdlX3ZhbHVlXyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhhdmUgdG8gZG8gaXQgdGhlIGNvbXBsZXRlIChwb3RlbnRpYWxseSkgc2xvdyB3YXkKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGFkZCBzb3J0ZWQga2V5cyB0byBpdGVyYXRvciB0byByZWR1Y2UgaGFzaCBsb29rdXBzCisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZnJvbS5jYmVnaW4oKTsgaXQgIT0gZnJvbS5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXhUeXBlIGluZGV4ID0gKCppdCkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHlwZSAmdmFsdWUgPSAoKml0KS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIFNldChpbmRleCwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChmcm9tLmRlbnNlXyk7CisgICAgICAgICAgICBEZW5zZVR5cGUgJnJheSA9ICpmcm9tLmRlbnNlXzsKKyAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGVudHJ5ID0gZnJvbS5yYW5nZV9taW5fOyBlbnRyeSA8IGZyb20ucmFuZ2VfbWF4XzsgKytlbnRyeSkgeworICAgICAgICAgICAgICAgIEluZGV4VHlwZSBpbmRleCA9IGVudHJ5IC0gZnJvbS5yYW5nZV9taW5fOworICAgICAgICAgICAgICAgIGlmIChyYXlbaW5kZXhdICE9IGtEZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCB8PSBTZXQoZW50cnksIHJheVtpbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXBkYXRlZDsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgQ29uc3RJdGVyYXRvcjsKKyAgICBjbGFzcyBDb25zdEl0ZXJhdG9yIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgdXNpbmcgU3BhcnNlVHlwZSA9IHR5cGVuYW1lIFNwYXJzZVZlY3Rvcjo6U3BhcnNlVHlwZTsKKyAgICAgICAgdXNpbmcgU3BhcnNlSXRlcmF0b3IgPSB0eXBlbmFtZSBTcGFyc2VUeXBlOjpjb25zdF9pdGVyYXRvcjsKKyAgICAgICAgdXNpbmcgSW5kZXhUeXBlID0gdHlwZW5hbWUgU3BhcnNlVmVjdG9yOjpJbmRleFR5cGU7CisgICAgICAgIHVzaW5nIFZhbHVlVHlwZSA9IHR5cGVuYW1lIFNwYXJzZVZlY3Rvcjo6VmFsdWVUeXBlOworICAgICAgICB1c2luZyBJdGVyYXRvclZhbHVlVHlwZSA9IHN0ZDo6cGFpcjxJbmRleFR5cGUsIFZhbHVlVHlwZT47CisgICAgICAgIGNvbnN0IEl0ZXJhdG9yVmFsdWVUeXBlICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3ZhbHVlXzsgfQorCisgICAgICAgIENvbnN0SXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICAgICAgICBpZiAoZGVsZWdhdGVkXykgeyAgLy8gaW1wbGllcyBzcGFyc2UKKyAgICAgICAgICAgICAgICArK2l0X3NwYXJzZV87CisgICAgICAgICAgICAgICAgaWYgKGl0X3NwYXJzZV8gPT0gdmVjXy0+c3BhcnNlXy0+Y2VuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoZV9lbmRfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF92YWx1ZV8uZmlyc3QgPSB2ZWNfLT5yYW5nZV9tYXhfOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3ZhbHVlXy5zZWNvbmQgPSBTcGFyc2VWZWN0b3I6OkRlZmF1bHRWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdmFsdWVfLmZpcnN0ID0gaXRfc3BhcnNlXy0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdmFsdWVfLnNlY29uZCA9IGl0X3NwYXJzZV8tPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZGV4XysrOworICAgICAgICAgICAgICAgIFNldEN1cnJlbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb25zdEl0ZXJhdG9yICZyaHMpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAodGhlX2VuZF8gIT0gcmhzLnRoZV9lbmRfKTsgIC8vIEp1c3QgZ29vZCBlbm91Z2ggZm9yIGNlbmQgY2hlY2tzCisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29uc3RJdGVyYXRvciAmcmhzKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKHRoZV9lbmRfID09IHJocy50aGVfZW5kXyk7ICAvLyBKdXN0IGdvb2QgZW5vdWdoIGZvciBjZW5kIGNoZWNrcworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGl0ZXJhdG9yIGhhcyB0d28gbW9kZXM6CisgICAgICAgIC8vICAgICBkZWxlZ2F0ZWQ6CisgICAgICAgIC8vICAgICAgICAgd2hlcmUgd2UgYXJlIGluIHNwYXJzZSBhY2Nlc3MgbW9kZSBhbmQgaGF2ZSBubyBmdWxsX3JhbmdlX3ZhbHVlCisgICAgICAgIC8vICAgICAgICAgYW5kIHRodXMgY2FuIGRlbGVnYXRlIG91ciBpdGVyYXRpb24gdG8gdW5kZXJseWluZyBtYXAKKyAgICAgICAgLy8gICAgIG5vbi1kZWxlZ2F0ZWQ6CisgICAgICAgIC8vICAgICAgICAgZWl0aGVyIGRlbnNlIG1vZGUgb3Igd2UgaGF2ZSBhIGZ1bGwgcmFuZ2UgdmFsdWUgYW5kIHRodXMKKyAgICAgICAgLy8gICAgICAgICBtdXN0IGl0ZXJhdGUgb3ZlciB0aGUgd2hvbGUgcmFuZ2UKKyAgICAgICAgQ29uc3RJdGVyYXRvcihjb25zdCBTcGFyc2VWZWN0b3IgJnZlYykgOiB2ZWNfKCZ2ZWMpIHsKKyAgICAgICAgICAgIGlmICghdmVjXy0+SXNTcGFyc2UoKSB8fCB2ZWNfLT5IYXNGdWxsUmFuZ2UoKSkgeworICAgICAgICAgICAgICAgIC8vIE11c3QgaXRlcmF0ZWQgb3ZlciBlbnRpcmUgcmFuZ2VzIHNraXBwaW5nIChpbiB0aGUgY2FzZSBvZiBkZW5zZSBhY2Nlc3MpLCBpbnZhbGlkIGVudHJpZXMKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZWRfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5kZXhfID0gdmVjXy0+cmFuZ2VfbWluXzsKKyAgICAgICAgICAgICAgICBTZXRDdXJyZW50VmFsdWUoKTsgIC8vIFNraXBzIGludmFsaWQgYW5kIHNldHMgdGhlX2VuZF8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmVjXy0+SGFzU3BhcnNlU3VicmFuZ2VzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgc3VicmFuZ2VzIHN0b3JlIHRoZSBub24tZGVmYXVsdCB2YWx1ZXMuLi4gYW5kIHRoZWlyIGlzIG5vIGZ1bGwgcmFuZ2UgdmFsdWUKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZWRfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpdF9zcGFyc2VfID0gdmVjXy0+c3BhcnNlXy0+Y2JlZ2luKCk7CisgICAgICAgICAgICAgICAgY3VycmVudF92YWx1ZV8uZmlyc3QgPSBpdF9zcGFyc2VfLT5maXJzdDsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3ZhbHVlXy5zZWNvbmQgPSBpdF9zcGFyc2VfLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgdGhlX2VuZF8gPSBmYWxzZTsgIC8vIHRoZSBzcGFyc2UgbWFwIGlzIG5vbi1lbXB0eSAocGVyIEhhc1NwYXJzZVN1YnJhbmdlcygpIGFib3ZlKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTcGFyc2UsIGJ1dCB3aXRoIG5vIHN1YnJhbmdlcworICAgICAgICAgICAgICAgIHRoZV9lbmRfID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENvbnN0SXRlcmF0b3IoKSA6IHZlY18obnVsbHB0ciksIHRoZV9lbmRfKHRydWUpIHt9CisKKyAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3QgU3BhcnNlVmVjdG9yICp2ZWNfOworICAgICAgICBib29sIHRoZV9lbmRfOworICAgICAgICBTcGFyc2VJdGVyYXRvciBpdF9zcGFyc2VfOworICAgICAgICBib29sIGRlbGVnYXRlZF87CisgICAgICAgIEluZGV4VHlwZSBpbmRleF87CisgICAgICAgIFZhbHVlVHlwZSB2YWx1ZV87CisKKyAgICAgICAgSXRlcmF0b3JWYWx1ZVR5cGUgY3VycmVudF92YWx1ZV87CisKKyAgICAgICAgLy8gaW4gdGhlIG5vbi1kZWxlZ2F0ZWQgY2FzZSB3ZSB1c2Ugbm9ybWFsIGFjY2Vzc29ycyBhbmQgc2tpcCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgdm9pZCBTZXRDdXJyZW50VmFsdWUoKSB7CisgICAgICAgICAgICB0aGVfZW5kXyA9IHRydWU7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXhfIDwgdmVjXy0+cmFuZ2VfbWF4XykgeworICAgICAgICAgICAgICAgIHZhbHVlXyA9IHZlY18tPkdldChpbmRleF8pOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZV8gIT0gU3BhcnNlVmVjdG9yOjpEZWZhdWx0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICB0aGVfZW5kXyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IEl0ZXJhdG9yVmFsdWVUeXBlKGluZGV4XywgdmFsdWVfKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4XysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICB0eXBlZGVmIENvbnN0SXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICBDb25zdEl0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIENvbnN0SXRlcmF0b3IoKnRoaXMpOyB9CisgICAgQ29uc3RJdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gQ29uc3RJdGVyYXRvcigpOyB9CisKKyAgICBJbmRleFR5cGUgUmFuZ2VNYXgoKSBjb25zdCB7IHJldHVybiByYW5nZV9tYXhfOyB9CisgICAgSW5kZXhUeXBlIFJhbmdlTWluKCkgY29uc3QgeyByZXR1cm4gcmFuZ2VfbWluXzsgfQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtDb252ZXJzaW9uVGhyZXNob2xkID0gNDsKKyAgICBjb25zdCBJbmRleFR5cGUgcmFuZ2VfbWluXzsgIC8vIGV4Y2x1c2l2ZQorICAgIGNvbnN0IEluZGV4VHlwZSByYW5nZV9tYXhfOyAgLy8gZXhjbHVzaXZlCisgICAgY29uc3QgSW5kZXhUeXBlIHRocmVzaG9sZF87ICAvLyBleGNsdXNpdmUKKworICAgIC8vIERhdGEgZm9yIHNwYXJzZSBtb2RlCisgICAgLy8gV2UgaGF2ZSBhIHNob3J0IGN1dCBmb3IgZnVsbCByYW5nZSB2YWx1ZXMgd2hlbiBpbiBzcGFyc2UgbW9kZQorICAgIGJvb2wgaGFzX2Z1bGxfcmFuZ2VfdmFsdWVfOworICAgIFZhbHVlVHlwZSBmdWxsX3JhbmdlX3ZhbHVlXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3BhcnNlVHlwZT4gc3BhcnNlXzsKKworICAgIC8vIERhdGEgZm9yIGRlbnNlIG1vZGUKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGVuc2VUeXBlPiBkZW5zZV87CisKKyAgICBzdGF0aWMgY29uc3QgVmFsdWVUeXBlICZEZWZhdWx0VmFsdWUoKSB7CisgICAgICAgIHN0YXRpYyBWYWx1ZVR5cGUgdmFsdWUgPSBrRGVmYXVsdFZhbHVlOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIC8vIE5vdGUgdGhhdCBJc1NwYXJzZSBpcyBjb21waWxlLXRpbWUgcmVkdWNpYmxlIGlmIGtTcGFyc2VUaHJlc2hvbGQgaXMgemVyby4uLgorICAgIGlubGluZSBib29sIElzU3BhcnNlKCkgY29uc3QgeyByZXR1cm4ga1NwYXJzZVRocmVzaG9sZCA+IDAgJiYgc3BhcnNlXy5nZXQoKTsgfQorICAgIGJvb2wgSXNGdWxsUmFuZ2UoSW5kZXhUeXBlIHN0YXJ0LCBJbmRleFR5cGUgZW5kKSBjb25zdCB7IHJldHVybiAoc3RhcnQgPT0gcmFuZ2VfbWluXykgJiYgKGVuZCA9PSByYW5nZV9tYXhfKTsgfQorICAgIGJvb2wgSXNGdWxsUmFuZ2VWYWx1ZShjb25zdCBWYWx1ZVR5cGUgJnZhbHVlKSBjb25zdCB7IHJldHVybiBoYXNfZnVsbF9yYW5nZV92YWx1ZV8gJiYgKHZhbHVlID09IGZ1bGxfcmFuZ2VfdmFsdWVfKTsgfQorICAgIGJvb2wgSGFzRnVsbFJhbmdlKCkgY29uc3QgeyByZXR1cm4gSXNTcGFyc2UoKSAmJiBoYXNfZnVsbF9yYW5nZV92YWx1ZV87IH0KKyAgICBib29sIEhhc1NwYXJzZVN1YnJhbmdlcygpIGNvbnN0IHsgcmV0dXJuIElzU3BhcnNlKCkgJiYgIXNwYXJzZV8tPmVtcHR5KCk7IH0KKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHVuY29uZGl0aW9uYWxseSwgdG8gZW5jYXBzdWxhdGUgdGhlIGNvbnZlcnNpb24gY3JpdGVyaWEgYW5kIGxvZ2ljIGhlcmUKKyAgICB2b2lkIFNwYXJzZVRvRGVuc2VDb252ZXJzaW9uKCkgeworICAgICAgICAvLyBJZiB3ZSdyZSB1c2luZyBtb3JlIHRocmVzaG9sZCBvZiB0aGUgc3BhcnNlIHJhbmdlLCBjb252ZXJ0IHRvIGRlbnNlXworICAgICAgICBpZiAoSXNTcGFyc2UoKSAmJiAoc3BhcnNlXy0+c2l6ZSgpID4gdGhyZXNob2xkXykpIHsKKyAgICAgICAgICAgIFZhbHVlVHlwZSBkZWZhdWx0X3ZhbHVlID0gSGFzRnVsbFJhbmdlKCkgPyBmdWxsX3JhbmdlX3ZhbHVlXyA6IGtEZWZhdWx0VmFsdWU7CisgICAgICAgICAgICBkZW5zZV8ucmVzZXQobmV3IERlbnNlVHlwZSgocmFuZ2VfbWF4XyAtIHJhbmdlX21pbl8pLCBkZWZhdWx0X3ZhbHVlKSk7CisgICAgICAgICAgICBEZW5zZVR5cGUgJnJheSA9ICpkZW5zZV87CisgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QgJml0ZW0gOiAqc3BhcnNlXykgeworICAgICAgICAgICAgICAgIHJheVtpdGVtLmZpcnN0IC0gcmFuZ2VfbWluX10gPSBpdGVtLnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwYXJzZV8ucmVzZXQoKTsKKyAgICAgICAgICAgIGhhc19mdWxsX3JhbmdlX3ZhbHVlXyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRGVuc2UgYWNjZXNzIG1vZGUgc2V0dGVyIHdpdGggdXBkYXRlIHNlbWFudGljcyBpbXBsZW1lbnRlZAorICAgIGJvb2wgU2V0RGVuc2UoSW5kZXhUeXBlIGluZGV4LCBjb25zdCBWYWx1ZVR5cGUgJnZhbHVlKSB7CisgICAgICAgIGJvb2wgdXBkYXRlZCA9IGZhbHNlOworICAgICAgICBWYWx1ZVR5cGUgJmN1cnJlbnRfdmFsdWUgPSAoKmRlbnNlXylbaW5kZXggLSByYW5nZV9taW5fXTsKKyAgICAgICAgaWYgKChrU2V0UmVwbGFjZXMgfHwgY3VycmVudF92YWx1ZSA9PSBrRGVmYXVsdFZhbHVlKSAmJiAodmFsdWUgIT0gY3VycmVudF92YWx1ZSkpIHsKKyAgICAgICAgICAgIGN1cnJlbnRfdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cGRhdGVkOworICAgIH0KKworICAgIC8vIFNwYXJzZSBhY2Nlc3MgbW9kZSBzZXR0ZXIgd2l0aCB1cGRhdGUgZnVsbCByYW5nZSBhbmQgdXBkYXRlIHNlbWFudGljcyBpbXBsZW1lbnRlZAorICAgIGJvb2wgU2V0U3BhcnNlKEluZGV4VHlwZSBpbmRleCwgY29uc3QgVmFsdWVUeXBlICZ2YWx1ZSkgeworICAgICAgICBpZiAoIWtTZXRSZXBsYWNlcyAmJiBIYXNGdWxsUmFuZ2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gV2UgaGF2ZSBmdWxsIGNvdmVyYWdlLCB3ZSBjYW4gY2hhbmdlIHRoaXMgbm8gbW9yZQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGtTZXRSZXBsYWNlcyAmJiBJc0Z1bGxSYW5nZVZhbHVlKHZhbHVlKSAmJiBIYXNTcGFyc2VTdWJyYW5nZXMoKSkgeworICAgICAgICAgICAgYXV0byBlcmFzdXJlID0gc3BhcnNlXy0+ZXJhc2UoaW5kZXgpOyAgLy8gUmVtb3ZlIGR1cGxpY2F0ZSByZWNvcmQgZnJvbSBtYXAKKyAgICAgICAgICAgIHJldHVybiBlcmFzdXJlID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVzZSBpbnNlcnQgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgaGFzaCBsb29rdXBzCisgICAgICAgIGF1dG8gbWFwX3BhaXIgPSBzdGQ6Om1ha2VfcGFpcihpbmRleCwgdmFsdWUpOworICAgICAgICBhdXRvIGluc2VydF9wYWlyID0gc3BhcnNlXy0+aW5zZXJ0KG1hcF9wYWlyKTsKKyAgICAgICAgYXV0byAmaXQgPSBpbnNlcnRfcGFpci5maXJzdDsgIC8vIHVzZSByZWZlcmVuY2VzIHRvIGF2b2lkIG5lc3RlZCBwYWlyIGFjY2Vzc2VzCisgICAgICAgIGNvbnN0IGJvb2wgaW5zZXJ0ZWQgPSBpbnNlcnRfcGFpci5zZWNvbmQ7CisgICAgICAgIGJvb2wgdXBkYXRlZCA9IGZhbHNlOworICAgICAgICBpZiAoaW5zZXJ0ZWQpIHsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgU3BhcnNlVG9EZW5zZUNvbnZlcnNpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChrU2V0UmVwbGFjZXMgJiYgdmFsdWUgIT0gaXQtPnNlY29uZCkgeworICAgICAgICAgICAgLy8gT25seSByZXBsYWNlIHZhbHVlIGlmIHNlbWFudGljcyBhbGxvdyBpdCBhbmQgaXQgaGFzIGNoYW5nZWQuCisgICAgICAgICAgICBpdC0+c2Vjb25kID0gdmFsdWU7CisgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXBkYXRlZDsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3BhcnNlX2NvbnRhaW5lcgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvc3RhdGVfdHJhY2tlci5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvc3RhdGVfdHJhY2tlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxZjMzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9zdGF0ZV90cmFja2VyLmNwcApAQCAtMCwwICsxLDQ2NjEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKyAqIFNoYW5ub24gTWNQaGVyc29uIDxzaGFubm9uQGx1bmFyZy5jb20+CisgKi8KKworLy8gQWxsb3cgdXNlIG9mIFNUTCBtaW4gYW5kIG1heCBmdW5jdGlvbnMgaW4gV2luZG93cworI2RlZmluZSBOT01JTk1BWAorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAidmtfZW51bV9zdHJpbmdfaGVscGVyLmgiCisjaW5jbHVkZSAidmtfZm9ybWF0X3V0aWxzLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfZGF0YS5oIgorI2luY2x1ZGUgInZrX2xheWVyX3V0aWxzLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfbG9nZ2luZy5oIgorI2luY2x1ZGUgInZrX3R5cGVtYXBfaGVscGVyLmgiCisKKyNpbmNsdWRlICJjaGFzc2lzLmgiCisjaW5jbHVkZSAic3RhdGVfdHJhY2tlci5oIgorI2luY2x1ZGUgInNoYWRlcl92YWxpZGF0aW9uLmgiCisKK3VzaW5nIHN0ZDo6bWF4OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKK3VzaW5nIHN0ZDo6dW5vcmRlcmVkX21hcDsKK3VzaW5nIHN0ZDo6dW5vcmRlcmVkX3NldDsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisvLyBBbmRyb2lkLXNwZWNpZmljIHZhbGlkYXRpb24gdGhhdCB1c2VzIHR5cGVzIGRlZmluZWQgb25seSB3aXRoIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorLy8gVGhpcyBjb3VsZCBhbHNvIG1vdmUgaW50byBhIHNlcGVyYXRlIGNvcmVfdmFsaWRhdGlvbl9hbmRyb2lkLmNwcCBmaWxlLi4uID8KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZWNvcmRDcmVhdGVJbWFnZUFORFJPSUQoY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmNyZWF0ZV9pbmZvLCBJTUFHRV9TVEFURSAqaXNfbm9kZSkgeworICAgIGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlJbWFnZUNyZWF0ZUluZm8gKmVtaWNpID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbz4oY3JlYXRlX2luZm8tPnBOZXh0KTsKKyAgICBpZiAoZW1pY2kgJiYgKGVtaWNpLT5oYW5kbGVUeXBlcyAmIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCkpIHsKKyAgICAgICAgaXNfbm9kZS0+aW1wb3J0ZWRfYWhiID0gdHJ1ZTsKKyAgICB9CisgICAgY29uc3QgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgKmV4dF9mbXRfYW5kcm9pZCA9IGx2bF9maW5kX2luX2NoYWluPFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEPihjcmVhdGVfaW5mby0+cE5leHQpOworICAgIGlmIChleHRfZm10X2FuZHJvaWQgJiYgKDAgIT0gZXh0X2ZtdF9hbmRyb2lkLT5leHRlcm5hbEZvcm1hdCkpIHsKKyAgICAgICAgaXNfbm9kZS0+aGFzX2FoYl9mb3JtYXQgPSB0cnVlOworICAgICAgICBpc19ub2RlLT5haGJfZm9ybWF0ID0gZXh0X2ZtdF9hbmRyb2lkLT5leHRlcm5hbEZvcm1hdDsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkFORFJPSUQoY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAqY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2Jjcl9jb252ZXJzaW9uKSB7CisgICAgY29uc3QgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgKmV4dF9mb3JtYXRfYW5kcm9pZCA9IGx2bF9maW5kX2luX2NoYWluPFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEPihjcmVhdGVfaW5mby0+cE5leHQpOworICAgIGlmIChleHRfZm9ybWF0X2FuZHJvaWQgJiYgKDAgIT0gZXh0X2Zvcm1hdF9hbmRyb2lkLT5leHRlcm5hbEZvcm1hdCkpIHsKKyAgICAgICAgeWNiY3JfY29udmVyc2lvbl9haGJfZm10X21hcC5lbXBsYWNlKHljYmNyX2NvbnZlcnNpb24sIGV4dF9mb3JtYXRfYW5kcm9pZC0+ZXh0ZXJuYWxGb3JtYXQpOworICAgIH0KK307CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25BTkRST0lEKFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2Jjcl9jb252ZXJzaW9uKSB7CisgICAgeWNiY3JfY29udmVyc2lvbl9haGJfZm10X21hcC5lcmFzZSh5Y2Jjcl9jb252ZXJzaW9uKTsKK307CisKKyNlbHNlCisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkQ3JlYXRlSW1hZ2VBTkRST0lEKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICpjcmVhdGVfaW5mbywgSU1BR0VfU1RBVEUgKmlzX25vZGUpIHt9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkFORFJPSUQoY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyAqY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2Jjcl9jb252ZXJzaW9uKXt9OworCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZERlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uQU5EUk9JRChWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JfY29udmVyc2lvbil7fTsKKworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUltYWdlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtJbWFnZSAqcEltYWdlLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBhdXRvIGlzX25vZGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPElNQUdFX1NUQVRFPigqcEltYWdlLCBwQ3JlYXRlSW5mbyk7CisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2FuZHJvaWRfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSB7CisgICAgICAgIFJlY29yZENyZWF0ZUltYWdlQU5EUk9JRChwQ3JlYXRlSW5mbywgaXNfbm9kZS5nZXQoKSk7CisgICAgfQorICAgIGNvbnN0IGF1dG8gc3dhcGNoYWluX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAoc3dhcGNoYWluX2luZm8pIHsKKyAgICAgICAgaXNfbm9kZS0+Y3JlYXRlX2Zyb21fc3dhcGNoYWluID0gc3dhcGNoYWluX2luZm8tPnN3YXBjaGFpbjsKKyAgICB9CisKKyAgICBib29sIHByZV9mZXRjaF9tZW1vcnlfcmVxcyA9IHRydWU7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgaWYgKGlzX25vZGUtPmV4dGVybmFsX2Zvcm1hdF9hbmRyb2lkKSB7CisgICAgICAgIC8vIERvIG5vdCBmZXRjaCByZXF1aXJlbWVudHMgZm9yIGV4dGVybmFsIG1lbW9yeSBpbWFnZXMKKyAgICAgICAgcHJlX2ZldGNoX21lbW9yeV9yZXFzID0gZmFsc2U7CisgICAgfQorI2VuZGlmCisgICAgLy8gUmVjb3JkIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGluIGNhc2UgdGhleSB3b24ndCBiZSBxdWVyaWVkCisgICAgaWYgKHByZV9mZXRjaF9tZW1vcnlfcmVxcykgeworICAgICAgICBEaXNwYXRjaEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSwgKnBJbWFnZSwgJmlzX25vZGUtPnJlcXVpcmVtZW50cyk7CisgICAgfQorICAgIGltYWdlTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcigqcEltYWdlLCBzdGQ6Om1vdmUoaXNfbm9kZSkpKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveUltYWdlKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFpbWFnZSkgcmV0dXJuOworICAgIElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QoaW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UpOworICAgIEludmFsaWRhdGVDb21tYW5kQnVmZmVycyhpbWFnZV9zdGF0ZS0+Y2JfYmluZGluZ3MsIG9ial9zdHJ1Y3QpOworICAgIC8vIENsZWFuIHVwIG1lbW9yeSBtYXBwaW5nLCBiaW5kaW5ncyBhbmQgcmFuZ2UgcmVmZXJlbmNlcyBmb3IgaW1hZ2UKKyAgICBmb3IgKGF1dG8gbWVtX2JpbmRpbmcgOiBpbWFnZV9zdGF0ZS0+R2V0Qm91bmRNZW1vcnkoKSkgeworICAgICAgICBhdXRvIG1lbV9pbmZvID0gR2V0RGV2TWVtU3RhdGUobWVtX2JpbmRpbmcpOworICAgICAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgICAgIFJlbW92ZUltYWdlTWVtb3J5UmFuZ2UoaW1hZ2UsIG1lbV9pbmZvKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1hZ2Vfc3RhdGUtPmJpbmRfc3dhcGNoYWluKSB7CisgICAgICAgIGF1dG8gc3dhcGNoYWluID0gR2V0U3dhcGNoYWluU3RhdGUoaW1hZ2Vfc3RhdGUtPmJpbmRfc3dhcGNoYWluKTsKKyAgICAgICAgaWYgKHN3YXBjaGFpbikgeworICAgICAgICAgICAgc3dhcGNoYWluLT5pbWFnZXNbaW1hZ2Vfc3RhdGUtPmJpbmRfc3dhcGNoYWluX2ltYWdlSW5kZXhdLmJvdW5kX2ltYWdlcy5lcmFzZShpbWFnZV9zdGF0ZS0+aW1hZ2UpOworICAgICAgICB9CisgICAgfQorICAgIFJlbW92ZUFsaWFzaW5nSW1hZ2UoaW1hZ2Vfc3RhdGUpOworICAgIENsZWFyTWVtb3J5T2JqZWN0QmluZGluZ3Mob2JqX3N0cnVjdCk7CisgICAgaW1hZ2Vfc3RhdGUtPmRlc3Ryb3llZCA9IHRydWU7CisgICAgLy8gUmVtb3ZlIGltYWdlIGZyb20gaW1hZ2VNYXAKKyAgICBpbWFnZU1hcC5lcmFzZShpbWFnZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZENsZWFyQ29sb3JJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSAqcENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKSB7CisgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhdXRvIGltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgaWYgKGNiX25vZGUgJiYgaW1hZ2Vfc3RhdGUpIHsKKyAgICAgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdJbWFnZShjYl9ub2RlLCBpbWFnZV9zdGF0ZSk7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyRGVwdGhTdGVuY2lsVmFsdWUgKnBEZXB0aFN0ZW5jaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKSB7CisgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhdXRvIGltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgaWYgKGNiX25vZGUgJiYgaW1hZ2Vfc3RhdGUpIHsKKyAgICAgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdJbWFnZShjYl9ub2RlLCBpbWFnZV9zdGF0ZSk7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZUNvcHkgKnBSZWdpb25zKSB7CisgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhdXRvIHNyY19pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoc3JjSW1hZ2UpOworICAgIGF1dG8gZHN0X2ltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShkc3RJbWFnZSk7CisKKyAgICAvLyBVcGRhdGUgYmluZGluZ3MgYmV0d2VlbiBpbWFnZXMgYW5kIGNtZCBidWZmZXIKKyAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0ltYWdlKGNiX25vZGUsIHNyY19pbWFnZV9zdGF0ZSk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdJbWFnZShjYl9ub2RlLCBkc3RfaW1hZ2Vfc3RhdGUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRSZXNvbHZlSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlUmVzb2x2ZSAqcFJlZ2lvbnMpIHsKKyAgICBhdXRvIGNiX25vZGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGF1dG8gc3JjX2ltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShzcmNJbWFnZSk7CisgICAgYXV0byBkc3RfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGRzdEltYWdlKTsKKworICAgIC8vIFVwZGF0ZSBiaW5kaW5ncyBiZXR3ZWVuIGltYWdlcyBhbmQgY21kIGJ1ZmZlcgorICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nSW1hZ2UoY2Jfbm9kZSwgc3JjX2ltYWdlX3N0YXRlKTsKKyAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0ltYWdlKGNiX25vZGUsIGRzdF9pbWFnZV9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZEJsaXRJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQmxpdCAqcFJlZ2lvbnMsIFZrRmlsdGVyIGZpbHRlcikgeworICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byBzcmNfaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHNyY0ltYWdlKTsKKyAgICBhdXRvIGRzdF9pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoZHN0SW1hZ2UpOworCisgICAgLy8gVXBkYXRlIGJpbmRpbmdzIGJldHdlZW4gaW1hZ2VzIGFuZCBjbWQgYnVmZmVyCisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdJbWFnZShjYl9ub2RlLCBzcmNfaW1hZ2Vfc3RhdGUpOworICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nSW1hZ2UoY2Jfbm9kZSwgZHN0X2ltYWdlX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtCdWZmZXIgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIC8vIFRPRE8gOiBUaGlzIGRvZXNuJ3QgY3JlYXRlIGRlZXAgY29weSBvZiBwUXVldWVGYW1pbHlJbmRpY2VzIHNvIG5lZWQgdG8gZml4IHRoYXQgaWYvd2hlbiB3ZSB3YW50IHRoYXQgZGF0YSB0byBiZSB2YWxpZAorICAgIGF1dG8gYnVmZmVyX3N0YXRlID0gc3RkOjptYWtlX3NoYXJlZDxCVUZGRVJfU1RBVEU+KCpwQnVmZmVyLCBwQ3JlYXRlSW5mbyk7CisKKyAgICAvLyBHZXQgYSBzZXQgb2YgcmVxdWlyZW1lbnRzIGluIHRoZSBjYXNlIHRoZSBhcHAgZG9lcyBub3QKKyAgICBEaXNwYXRjaEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UsICpwQnVmZmVyLCAmYnVmZmVyX3N0YXRlLT5yZXF1aXJlbWVudHMpOworCisgICAgYnVmZmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcigqcEJ1ZmZlciwgc3RkOjptb3ZlKGJ1ZmZlcl9zdGF0ZSkpKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtCdWZmZXJWaWV3ICpwVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworICAgIGF1dG8gYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU2hhcmVkKHBDcmVhdGVJbmZvLT5idWZmZXIpOworICAgIGJ1ZmZlclZpZXdNYXBbKnBWaWV3XSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QlVGRkVSX1ZJRVdfU1RBVEU+KGJ1ZmZlcl9zdGF0ZSwgKnBWaWV3LCBwQ3JlYXRlSW5mbyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVJbWFnZVZpZXcoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrSW1hZ2VWaWV3ICpwVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgYXV0byBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU2hhcmVkKHBDcmVhdGVJbmZvLT5pbWFnZSk7CisgICAgaW1hZ2VWaWV3TWFwWypwVmlld10gPSBzdGQ6Om1ha2Vfc2hhcmVkPElNQUdFX1ZJRVdfU1RBVEU+KGltYWdlX3N0YXRlLCAqcFZpZXcsIHBDcmVhdGVJbmZvKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0J1ZmZlckNvcHkgKnBSZWdpb25zKSB7CisgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhdXRvIHNyY19idWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShzcmNCdWZmZXIpOworICAgIGF1dG8gZHN0X2J1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGRzdEJ1ZmZlcik7CisKKyAgICAvLyBVcGRhdGUgYmluZGluZ3MgYmV0d2VlbiBidWZmZXJzIGFuZCBjbWQgYnVmZmVyCisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfbm9kZSwgc3JjX2J1ZmZlcl9zdGF0ZSk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfbm9kZSwgZHN0X2J1ZmZlcl9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lJbWFnZVZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIElNQUdFX1ZJRVdfU1RBVEUgKmltYWdlX3ZpZXdfc3RhdGUgPSBHZXRJbWFnZVZpZXdTdGF0ZShpbWFnZVZpZXcpOworICAgIGlmICghaW1hZ2Vfdmlld19zdGF0ZSkgcmV0dXJuOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QoaW1hZ2VWaWV3LCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlVmlldyk7CisKKyAgICAvLyBBbnkgYm91bmQgY21kIGJ1ZmZlcnMgYXJlIG5vdyBpbnZhbGlkCisgICAgSW52YWxpZGF0ZUNvbW1hbmRCdWZmZXJzKGltYWdlX3ZpZXdfc3RhdGUtPmNiX2JpbmRpbmdzLCBvYmpfc3RydWN0KTsKKyAgICBpbWFnZV92aWV3X3N0YXRlLT5kZXN0cm95ZWQgPSB0cnVlOworICAgIGltYWdlVmlld01hcC5lcmFzZShpbWFnZVZpZXcpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmREZXN0cm95QnVmZmVyKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBpZiAoIWJ1ZmZlcikgcmV0dXJuOworICAgIGF1dG8gYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSBvYmpfc3RydWN0KGJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIpOworCisgICAgSW52YWxpZGF0ZUNvbW1hbmRCdWZmZXJzKGJ1ZmZlcl9zdGF0ZS0+Y2JfYmluZGluZ3MsIG9ial9zdHJ1Y3QpOworICAgIGZvciAoYXV0byBtZW1fYmluZGluZyA6IGJ1ZmZlcl9zdGF0ZS0+R2V0Qm91bmRNZW1vcnkoKSkgeworICAgICAgICBhdXRvIG1lbV9pbmZvID0gR2V0RGV2TWVtU3RhdGUobWVtX2JpbmRpbmcpOworICAgICAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgICAgIFJlbW92ZUJ1ZmZlck1lbW9yeVJhbmdlKGJ1ZmZlciwgbWVtX2luZm8pOworICAgICAgICB9CisgICAgfQorICAgIENsZWFyTWVtb3J5T2JqZWN0QmluZGluZ3Mob2JqX3N0cnVjdCk7CisgICAgYnVmZmVyX3N0YXRlLT5kZXN0cm95ZWQgPSB0cnVlOworICAgIGJ1ZmZlck1hcC5lcmFzZShidWZmZXJfc3RhdGUtPmJ1ZmZlcik7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lCdWZmZXJWaWV3KFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXJWaWV3IGJ1ZmZlclZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBpZiAoIWJ1ZmZlclZpZXcpIHJldHVybjsKKyAgICBhdXRvIGJ1ZmZlcl92aWV3X3N0YXRlID0gR2V0QnVmZmVyVmlld1N0YXRlKGJ1ZmZlclZpZXcpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QoYnVmZmVyVmlldywga1Z1bGthbk9iamVjdFR5cGVCdWZmZXJWaWV3KTsKKworICAgIC8vIEFueSBib3VuZCBjbWQgYnVmZmVycyBhcmUgbm93IGludmFsaWQKKyAgICBJbnZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnMoYnVmZmVyX3ZpZXdfc3RhdGUtPmNiX2JpbmRpbmdzLCBvYmpfc3RydWN0KTsKKyAgICBidWZmZXJfdmlld19zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBidWZmZXJWaWV3TWFwLmVyYXNlKGJ1ZmZlclZpZXcpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRGaWxsQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBkYXRhKSB7CisgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhdXRvIGJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGRzdEJ1ZmZlcik7CisgICAgLy8gVXBkYXRlIGJpbmRpbmdzIGJldHdlZW4gYnVmZmVyIGFuZCBjbWQgYnVmZmVyCisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfbm9kZSwgYnVmZmVyX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQ29weUltYWdlVG9CdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0J1ZmZlciBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkgKnBSZWdpb25zKSB7CisgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhdXRvIHNyY19pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoc3JjSW1hZ2UpOworICAgIGF1dG8gZHN0X2J1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGRzdEJ1ZmZlcik7CisKKyAgICAvLyBVcGRhdGUgYmluZGluZ3MgYmV0d2VlbiBidWZmZXIvaW1hZ2UgYW5kIGNtZCBidWZmZXIKKyAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0ltYWdlKGNiX25vZGUsIHNyY19pbWFnZV9zdGF0ZSk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfbm9kZSwgZHN0X2J1ZmZlcl9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZENvcHlCdWZmZXJUb0ltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBzcmNCdWZmZXIsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5ICpwUmVnaW9ucykgeworICAgIGF1dG8gY2Jfbm9kZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byBzcmNfYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoc3JjQnVmZmVyKTsKKyAgICBhdXRvIGRzdF9pbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoZHN0SW1hZ2UpOworCisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfbm9kZSwgc3JjX2J1ZmZlcl9zdGF0ZSk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdJbWFnZShjYl9ub2RlLCBkc3RfaW1hZ2Vfc3RhdGUpOworfQorCisvLyBHZXQgdGhlIGltYWdlIHZpZXdzdGF0ZSBmb3IgYSBnaXZlbiBmcmFtZWJ1ZmZlciBhdHRhY2htZW50CitJTUFHRV9WSUVXX1NUQVRFICpWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpHZXRBdHRhY2htZW50SW1hZ2VWaWV3U3RhdGUoRlJBTUVCVUZGRVJfU1RBVEUgKmZyYW1lYnVmZmVyLCB1aW50MzJfdCBpbmRleCkgeworICAgIGlmIChmcmFtZWJ1ZmZlci0+Y3JlYXRlSW5mby5mbGFncyAmIFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUikgcmV0dXJuIG51bGxwdHI7CisgICAgYXNzZXJ0KGZyYW1lYnVmZmVyICYmIChpbmRleCA8IGZyYW1lYnVmZmVyLT5jcmVhdGVJbmZvLmF0dGFjaG1lbnRDb3VudCkpOworICAgIGNvbnN0IFZrSW1hZ2VWaWV3ICZpbWFnZV92aWV3ID0gZnJhbWVidWZmZXItPmNyZWF0ZUluZm8ucEF0dGFjaG1lbnRzW2luZGV4XTsKKyAgICByZXR1cm4gR2V0SW1hZ2VWaWV3U3RhdGUoaW1hZ2Vfdmlldyk7Cit9CisKKy8vIEdldCB0aGUgaW1hZ2Ugdmlld3N0YXRlIGZvciBhIGdpdmVuIGZyYW1lYnVmZmVyIGF0dGFjaG1lbnQKK2NvbnN0IElNQUdFX1ZJRVdfU1RBVEUgKlZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkdldEF0dGFjaG1lbnRJbWFnZVZpZXdTdGF0ZShjb25zdCBGUkFNRUJVRkZFUl9TVEFURSAqZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoZnJhbWVidWZmZXItPmNyZWF0ZUluZm8uZmxhZ3MgJiBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFIpIHJldHVybiBudWxscHRyOworICAgIGFzc2VydChmcmFtZWJ1ZmZlciAmJiAoaW5kZXggPCBmcmFtZWJ1ZmZlci0+Y3JlYXRlSW5mby5hdHRhY2htZW50Q291bnQpKTsKKyAgICBjb25zdCBWa0ltYWdlVmlldyAmaW1hZ2VfdmlldyA9IGZyYW1lYnVmZmVyLT5jcmVhdGVJbmZvLnBBdHRhY2htZW50c1tpbmRleF07CisgICAgcmV0dXJuIEdldEltYWdlVmlld1N0YXRlKGltYWdlX3ZpZXcpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkFkZEFsaWFzaW5nSW1hZ2UoSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlKSB7CisgICAgaWYgKCEoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUKSkgcmV0dXJuOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxWa0ltYWdlPiAqYm91bmRfaW1hZ2VzID0gbnVsbHB0cjsKKworICAgIGlmIChpbWFnZV9zdGF0ZS0+YmluZF9zd2FwY2hhaW4pIHsKKyAgICAgICAgYXV0byBzd2FwY2hhaW5fc3RhdGUgPSBHZXRTd2FwY2hhaW5TdGF0ZShpbWFnZV9zdGF0ZS0+YmluZF9zd2FwY2hhaW4pOworICAgICAgICBpZiAoc3dhcGNoYWluX3N0YXRlKSB7CisgICAgICAgICAgICBib3VuZF9pbWFnZXMgPSAmc3dhcGNoYWluX3N0YXRlLT5pbWFnZXNbaW1hZ2Vfc3RhdGUtPmJpbmRfc3dhcGNoYWluX2ltYWdlSW5kZXhdLmJvdW5kX2ltYWdlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8gbWVtX3N0YXRlID0gR2V0RGV2TWVtU3RhdGUoaW1hZ2Vfc3RhdGUtPmJpbmRpbmcubWVtKTsKKyAgICAgICAgaWYgKG1lbV9zdGF0ZSkgeworICAgICAgICAgICAgYm91bmRfaW1hZ2VzID0gJm1lbV9zdGF0ZS0+Ym91bmRfaW1hZ2VzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJvdW5kX2ltYWdlcykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmhhbmRsZSA6ICpib3VuZF9pbWFnZXMpIHsKKyAgICAgICAgICAgIGlmIChoYW5kbGUgIT0gaW1hZ2Vfc3RhdGUtPmltYWdlKSB7CisgICAgICAgICAgICAgICAgYXV0byBpcyA9IEdldEltYWdlU3RhdGUoaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaXMgJiYgaXMtPklzQ29tcGF0aWJsZUFsaWFzaW5nKGltYWdlX3N0YXRlKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGluc2VydGVkID0gaXMtPmFsaWFzaW5nX2ltYWdlcy5lbXBsYWNlKGltYWdlX3N0YXRlLT5pbWFnZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRlZC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N0YXRlLT5hbGlhc2luZ19pbWFnZXMuZW1wbGFjZShoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlbW92ZUFsaWFzaW5nSW1hZ2UoSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZpbWFnZSA6IGltYWdlX3N0YXRlLT5hbGlhc2luZ19pbWFnZXMpIHsKKyAgICAgICAgYXV0byBpcyA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworICAgICAgICBpZiAoaXMpIHsKKyAgICAgICAgICAgIGlzLT5hbGlhc2luZ19pbWFnZXMuZXJhc2UoaW1hZ2Vfc3RhdGUtPmltYWdlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbWFnZV9zdGF0ZS0+YWxpYXNpbmdfaW1hZ2VzLmNsZWFyKCk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVtb3ZlQWxpYXNpbmdJbWFnZXMoY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PFZrSW1hZ2U+ICZib3VuZF9pbWFnZXMpIHsKKyAgICAvLyBUaGlzIGlzIG9uZSB3YXkgY2xlYXIuIEJlY2F1c2UgdGhlIGJvdW5kX2ltYWdlcyBpbmNsdWRlIGNyb3NzIHJlZmVyZW5jZXMsIHRoZSBvbmUgd2F5IGNsZWFyIGxvb3AgY291bGQgY2xlYXIgdGhlIHdob2xlCisgICAgLy8gcmVmZXJlbmNlLiBJdCBkb2Vzbid0IG5lZWQgdHdvIHdheXMgY2xlYXIuCisgICAgZm9yIChjb25zdCBhdXRvICZoYW5kbGUgOiBib3VuZF9pbWFnZXMpIHsKKyAgICAgICAgYXV0byBpcyA9IEdldEltYWdlU3RhdGUoaGFuZGxlKTsKKyAgICAgICAgaWYgKGlzKSB7CisgICAgICAgICAgICBpcy0+YWxpYXNpbmdfaW1hZ2VzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NvbnN0IEVWRU5UX1NUQVRFICpWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpHZXRFdmVudFN0YXRlKFZrRXZlbnQgZXZlbnQpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gZXZlbnRNYXAuZmluZChldmVudCk7CisgICAgaWYgKGl0ID09IGV2ZW50TWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gJml0LT5zZWNvbmQ7Cit9CisKK0VWRU5UX1NUQVRFICpWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpHZXRFdmVudFN0YXRlKFZrRXZlbnQgZXZlbnQpIHsKKyAgICBhdXRvIGl0ID0gZXZlbnRNYXAuZmluZChldmVudCk7CisgICAgaWYgKGl0ID09IGV2ZW50TWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gJml0LT5zZWNvbmQ7Cit9CisKK2NvbnN0IFFVRVVFX1NUQVRFICpWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpHZXRRdWV1ZVN0YXRlKFZrUXVldWUgcXVldWUpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gcXVldWVNYXAuZmluZChxdWV1ZSk7CisgICAgaWYgKGl0ID09IHF1ZXVlTWFwLmNlbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuICZpdC0+c2Vjb25kOworfQorCitRVUVVRV9TVEFURSAqVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6R2V0UXVldWVTdGF0ZShWa1F1ZXVlIHF1ZXVlKSB7CisgICAgYXV0byBpdCA9IHF1ZXVlTWFwLmZpbmQocXVldWUpOworICAgIGlmIChpdCA9PSBxdWV1ZU1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuICZpdC0+c2Vjb25kOworfQorCitjb25zdCBQSFlTSUNBTF9ERVZJQ0VfU1RBVEUgKlZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkdldFBoeXNpY2FsRGV2aWNlU3RhdGUoVmtQaHlzaWNhbERldmljZSBwaHlzKSBjb25zdCB7CisgICAgYXV0byAqcGh5c19kZXZfbWFwID0gKChwaHlzaWNhbF9kZXZpY2VfbWFwLnNpemUoKSA+IDApID8gJnBoeXNpY2FsX2RldmljZV9tYXAgOiAmaW5zdGFuY2Vfc3RhdGUtPnBoeXNpY2FsX2RldmljZV9tYXApOworICAgIGF1dG8gaXQgPSBwaHlzX2Rldl9tYXAtPmZpbmQocGh5cyk7CisgICAgaWYgKGl0ID09IHBoeXNfZGV2X21hcC0+ZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiAmaXQtPnNlY29uZDsKK30KKworUEhZU0lDQUxfREVWSUNFX1NUQVRFICpWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpHZXRQaHlzaWNhbERldmljZVN0YXRlKFZrUGh5c2ljYWxEZXZpY2UgcGh5cykgeworICAgIGF1dG8gKnBoeXNfZGV2X21hcCA9ICgocGh5c2ljYWxfZGV2aWNlX21hcC5zaXplKCkgPiAwKSA/ICZwaHlzaWNhbF9kZXZpY2VfbWFwIDogJmluc3RhbmNlX3N0YXRlLT5waHlzaWNhbF9kZXZpY2VfbWFwKTsKKyAgICBhdXRvIGl0ID0gcGh5c19kZXZfbWFwLT5maW5kKHBoeXMpOworICAgIGlmIChpdCA9PSBwaHlzX2Rldl9tYXAtPmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gJml0LT5zZWNvbmQ7Cit9CisKK1BIWVNJQ0FMX0RFVklDRV9TVEFURSAqVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6R2V0UGh5c2ljYWxEZXZpY2VTdGF0ZSgpIHsgcmV0dXJuIHBoeXNpY2FsX2RldmljZV9zdGF0ZTsgfQorY29uc3QgUEhZU0lDQUxfREVWSUNFX1NUQVRFICpWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpHZXRQaHlzaWNhbERldmljZVN0YXRlKCkgY29uc3QgeyByZXR1cm4gcGh5c2ljYWxfZGV2aWNlX3N0YXRlOyB9CisKKy8vIFJldHVybiBwdHIgdG8gbWVtb3J5IGJpbmRpbmcgZm9yIGdpdmVuIGhhbmRsZSBvZiBzcGVjaWZpZWQgdHlwZQordGVtcGxhdGUgPHR5cGVuYW1lIFN0YXRlLCB0eXBlbmFtZSBSZXN1bHQ+CitzdGF0aWMgUmVzdWx0IEdldE9iamVjdE1lbUJpbmRpbmdJbXBsKFN0YXRlIHN0YXRlLCBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlKSB7CisgICAgc3dpdGNoICh0eXBlZF9oYW5kbGUudHlwZSkgeworICAgICAgICBjYXNlIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2U6CisgICAgICAgICAgICByZXR1cm4gc3RhdGUtPkdldEltYWdlU3RhdGUodHlwZWRfaGFuZGxlLkNhc3Q8VmtJbWFnZT4oKSk7CisgICAgICAgIGNhc2Uga1Z1bGthbk9iamVjdFR5cGVCdWZmZXI6CisgICAgICAgICAgICByZXR1cm4gc3RhdGUtPkdldEJ1ZmZlclN0YXRlKHR5cGVkX2hhbmRsZS5DYXN0PFZrQnVmZmVyPigpKTsKKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOgorICAgICAgICAgICAgcmV0dXJuIHN0YXRlLT5HZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZSh0eXBlZF9oYW5kbGUuQ2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPigpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgQklOREFCTEUgKlZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkdldE9iamVjdE1lbUJpbmRpbmcoY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgJnR5cGVkX2hhbmRsZSkgY29uc3QgeworICAgIHJldHVybiBHZXRPYmplY3RNZW1CaW5kaW5nSW1wbDxjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICosIGNvbnN0IEJJTkRBQkxFICo+KHRoaXMsIHR5cGVkX2hhbmRsZSk7Cit9CisKK0JJTkRBQkxFICpWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpHZXRPYmplY3RNZW1CaW5kaW5nKGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlICZ0eXBlZF9oYW5kbGUpIHsKKyAgICByZXR1cm4gR2V0T2JqZWN0TWVtQmluZGluZ0ltcGw8VmFsaWRhdGlvblN0YXRlVHJhY2tlciAqLCBCSU5EQUJMRSAqPih0aGlzLCB0eXBlZF9oYW5kbGUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkFkZE1lbU9iakluZm8odm9pZCAqb2JqZWN0LCBjb25zdCBWa0RldmljZU1lbW9yeSBtZW0sIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvICpwQWxsb2NhdGVJbmZvKSB7CisgICAgYXNzZXJ0KG9iamVjdCAhPSBOVUxMKTsKKworICAgIG1lbU9iak1hcFttZW1dID0gc3RkOjptYWtlX3NoYXJlZDxERVZJQ0VfTUVNT1JZX1NUQVRFPihvYmplY3QsIG1lbSwgcEFsbG9jYXRlSW5mbyk7CisgICAgYXV0byBtZW1faW5mbyA9IG1lbU9iak1hcFttZW1dLmdldCgpOworCisgICAgYXV0byBkZWRpY2F0ZWQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb0tIUj4ocEFsbG9jYXRlSW5mby0+cE5leHQpOworICAgIGlmIChkZWRpY2F0ZWQpIHsKKyAgICAgICAgbWVtX2luZm8tPmlzX2RlZGljYXRlZCA9IHRydWU7CisgICAgICAgIG1lbV9pbmZvLT5kZWRpY2F0ZWRfYnVmZmVyID0gZGVkaWNhdGVkLT5idWZmZXI7CisgICAgICAgIG1lbV9pbmZvLT5kZWRpY2F0ZWRfaW1hZ2UgPSBkZWRpY2F0ZWQtPmltYWdlOworICAgIH0KKyAgICBhdXRvIGV4cG9ydF9pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtFeHBvcnRNZW1vcnlBbGxvY2F0ZUluZm8+KHBBbGxvY2F0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAoZXhwb3J0X2luZm8pIHsKKyAgICAgICAgbWVtX2luZm8tPmlzX2V4cG9ydCA9IHRydWU7CisgICAgICAgIG1lbV9pbmZvLT5leHBvcnRfaGFuZGxlX3R5cGVfZmxhZ3MgPSBleHBvcnRfaW5mby0+aGFuZGxlVHlwZXM7CisgICAgfQorfQorCisvLyBDcmVhdGUgYmluZGluZyBsaW5rIGJldHdlZW4gZ2l2ZW4gc2FtcGxlciBhbmQgY29tbWFuZCBidWZmZXIgbm9kZQordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpBZGRDb21tYW5kQnVmZmVyQmluZGluZ1NhbXBsZXIoQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgU0FNUExFUl9TVEFURSAqc2FtcGxlcl9zdGF0ZSkgeworICAgIGlmIChkaXNhYmxlZC5jb21tYW5kX2J1ZmZlcl9zdGF0ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKHNhbXBsZXJfc3RhdGUtPmNiX2JpbmRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZ1bGthblR5cGVkSGFuZGxlKHNhbXBsZXJfc3RhdGUtPnNhbXBsZXIsIGtWdWxrYW5PYmplY3RUeXBlU2FtcGxlciwgc2FtcGxlcl9zdGF0ZSksIGNiX25vZGUpOworfQorCisvLyBDcmVhdGUgYmluZGluZyBsaW5rIGJldHdlZW4gZ2l2ZW4gaW1hZ2Ugbm9kZSBhbmQgY29tbWFuZCBidWZmZXIgbm9kZQordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpBZGRDb21tYW5kQnVmZmVyQmluZGluZ0ltYWdlKENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIElNQUdFX1NUQVRFICppbWFnZV9zdGF0ZSkgeworICAgIGlmIChkaXNhYmxlZC5jb21tYW5kX2J1ZmZlcl9zdGF0ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiB0aGlzIGltYWdlIHdhcyBjcmVhdGVkIHRocm91Z2ggV1NJCisgICAgaWYgKGltYWdlX3N0YXRlLT5jcmVhdGVfZnJvbV9zd2FwY2hhaW4gPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgLy8gRmlyc3QgdXBkYXRlIGNiIGJpbmRpbmcgZm9yIGltYWdlCisgICAgICAgIGlmIChBZGRDb21tYW5kQnVmZmVyQmluZGluZyhpbWFnZV9zdGF0ZS0+Y2JfYmluZGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShpbWFnZV9zdGF0ZS0+aW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UsIGltYWdlX3N0YXRlKSwgY2Jfbm9kZSkpIHsKKyAgICAgICAgICAgIC8vIE5vdyB1cGRhdGUgQ0IgYmluZGluZyBpbiBNZW1PYmogbWluaSBDQiBsaXN0CisgICAgICAgICAgICBmb3IgKGF1dG8gbWVtX2JpbmRpbmcgOiBpbWFnZV9zdGF0ZS0+R2V0Qm91bmRNZW1vcnkoKSkgeworICAgICAgICAgICAgICAgIERFVklDRV9NRU1PUllfU1RBVEUgKnBNZW1JbmZvID0gR2V0RGV2TWVtU3RhdGUobWVtX2JpbmRpbmcpOworICAgICAgICAgICAgICAgIGlmIChwTWVtSW5mbykgeworICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdXBkYXRlIENCSW5mbydzIE1lbSByZWZlcmVuY2UgbGlzdAorICAgICAgICAgICAgICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZyhwTWVtSW5mby0+Y2JfYmluZGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZ1bGthblR5cGVkSGFuZGxlKG1lbV9iaW5kaW5nLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeSwgcE1lbUluZm8pLCBjYl9ub2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENyZWF0ZSBiaW5kaW5nIGxpbmsgYmV0d2VlbiBnaXZlbiBpbWFnZSB2aWV3IG5vZGUgYW5kIGl0cyBpbWFnZSB3aXRoIGNvbW1hbmQgYnVmZmVyIG5vZGUKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6QWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdJbWFnZVZpZXcoQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgSU1BR0VfVklFV19TVEFURSAqdmlld19zdGF0ZSkgeworICAgIGlmIChkaXNhYmxlZC5jb21tYW5kX2J1ZmZlcl9zdGF0ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEZpcnN0IGFkZCBiaW5kaW5ncyBmb3IgaW1hZ2VWaWV3CisgICAgaWYgKEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKHZpZXdfc3RhdGUtPmNiX2JpbmRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZSh2aWV3X3N0YXRlLT5pbWFnZV92aWV3LCBrVnVsa2FuT2JqZWN0VHlwZUltYWdlVmlldywgdmlld19zdGF0ZSksIGNiX25vZGUpKSB7CisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBjb250aW51ZSBpZiB0aGlzIGlzIGEgbmV3IGl0ZW0KKyAgICAgICAgYXV0byBpbWFnZV9zdGF0ZSA9IHZpZXdfc3RhdGUtPmltYWdlX3N0YXRlLmdldCgpOworICAgICAgICAvLyBBZGQgYmluZGluZ3MgZm9yIGltYWdlIHdpdGhpbiBpbWFnZVZpZXcKKyAgICAgICAgaWYgKGltYWdlX3N0YXRlKSB7CisgICAgICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0ltYWdlKGNiX25vZGUsIGltYWdlX3N0YXRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gQ3JlYXRlIGJpbmRpbmcgbGluayBiZXR3ZWVuIGdpdmVuIGJ1ZmZlciBub2RlIGFuZCBjb21tYW5kIGJ1ZmZlciBub2RlCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkFkZENvbW1hbmRCdWZmZXJCaW5kaW5nQnVmZmVyKENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUsIEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlKSB7CisgICAgaWYgKGRpc2FibGVkLmNvbW1hbmRfYnVmZmVyX3N0YXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gRmlyc3QgdXBkYXRlIGNiIGJpbmRpbmcgZm9yIGJ1ZmZlcgorICAgIGlmIChBZGRDb21tYW5kQnVmZmVyQmluZGluZyhidWZmZXJfc3RhdGUtPmNiX2JpbmRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShidWZmZXJfc3RhdGUtPmJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIGJ1ZmZlcl9zdGF0ZSksIGNiX25vZGUpKSB7CisgICAgICAgIC8vIE5vdyB1cGRhdGUgQ0IgYmluZGluZyBpbiBNZW1PYmogbWluaSBDQiBsaXN0CisgICAgICAgIGZvciAoYXV0byBtZW1fYmluZGluZyA6IGJ1ZmZlcl9zdGF0ZS0+R2V0Qm91bmRNZW1vcnkoKSkgeworICAgICAgICAgICAgREVWSUNFX01FTU9SWV9TVEFURSAqcE1lbUluZm8gPSBHZXREZXZNZW1TdGF0ZShtZW1fYmluZGluZyk7CisgICAgICAgICAgICBpZiAocE1lbUluZm8pIHsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdXBkYXRlIENCSW5mbydzIE1lbSByZWZlcmVuY2UgbGlzdAorICAgICAgICAgICAgICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKHBNZW1JbmZvLT5jYl9iaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShtZW1fYmluZGluZywga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIHBNZW1JbmZvKSwgY2Jfbm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENyZWF0ZSBiaW5kaW5nIGxpbmsgYmV0d2VlbiBnaXZlbiBidWZmZXIgdmlldyBub2RlIGFuZCBpdHMgYnVmZmVyIHdpdGggY29tbWFuZCBidWZmZXIgbm9kZQordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpBZGRDb21tYW5kQnVmZmVyQmluZGluZ0J1ZmZlclZpZXcoQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwgQlVGRkVSX1ZJRVdfU1RBVEUgKnZpZXdfc3RhdGUpIHsKKyAgICBpZiAoZGlzYWJsZWQuY29tbWFuZF9idWZmZXJfc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBGaXJzdCBhZGQgYmluZGluZ3MgZm9yIGJ1ZmZlclZpZXcKKyAgICBpZiAoQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmcodmlld19zdGF0ZS0+Y2JfYmluZGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZ1bGthblR5cGVkSGFuZGxlKHZpZXdfc3RhdGUtPmJ1ZmZlcl92aWV3LCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlclZpZXcsIHZpZXdfc3RhdGUpLCBjYl9ub2RlKSkgeworICAgICAgICBhdXRvIGJ1ZmZlcl9zdGF0ZSA9IHZpZXdfc3RhdGUtPmJ1ZmZlcl9zdGF0ZS5nZXQoKTsKKyAgICAgICAgLy8gQWRkIGJpbmRpbmdzIGZvciBidWZmZXIgd2l0aGluIGJ1ZmZlclZpZXcKKyAgICAgICAgaWYgKGJ1ZmZlcl9zdGF0ZSkgeworICAgICAgICAgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfbm9kZSwgYnVmZmVyX3N0YXRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gQ3JlYXRlIGJpbmRpbmcgbGluayBiZXR3ZWVuIGdpdmVuIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYW5kIGNvbW1hbmQgYnVmZmVyIG5vZGUKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6QWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdBY2NlbGVyYXRpb25TdHJ1Y3R1cmUoQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9TVEFURSAqYXNfc3RhdGUpIHsKKyAgICBpZiAoZGlzYWJsZWQuY29tbWFuZF9idWZmZXJfc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmcoCisgICAgICAgICAgICBhc19zdGF0ZS0+Y2JfYmluZGluZ3MsCisgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShhc19zdGF0ZS0+YWNjZWxlcmF0aW9uX3N0cnVjdHVyZSwga1Z1bGthbk9iamVjdFR5cGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgYXNfc3RhdGUpLCBjYl9ub2RlKSkgeworICAgICAgICAvLyBOb3cgdXBkYXRlIENCIGJpbmRpbmcgaW4gTWVtT2JqIG1pbmkgQ0IgbGlzdAorICAgICAgICBmb3IgKGF1dG8gbWVtX2JpbmRpbmcgOiBhc19zdGF0ZS0+R2V0Qm91bmRNZW1vcnkoKSkgeworICAgICAgICAgICAgREVWSUNFX01FTU9SWV9TVEFURSAqcE1lbUluZm8gPSBHZXREZXZNZW1TdGF0ZShtZW1fYmluZGluZyk7CisgICAgICAgICAgICBpZiAocE1lbUluZm8pIHsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdXBkYXRlIENCSW5mbydzIE1lbSByZWZlcmVuY2UgbGlzdAorICAgICAgICAgICAgICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKHBNZW1JbmZvLT5jYl9iaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShtZW1fYmluZGluZywga1Z1bGthbk9iamVjdFR5cGVEZXZpY2VNZW1vcnksIHBNZW1JbmZvKSwgY2Jfbm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENsZWFyIGEgc2luZ2xlIG9iamVjdCBiaW5kaW5nIGZyb20gZ2l2ZW4gbWVtb3J5IG9iamVjdAordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpDbGVhck1lbW9yeU9iamVjdEJpbmRpbmcoY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgJnR5cGVkX2hhbmRsZSwgVmtEZXZpY2VNZW1vcnkgbWVtKSB7CisgICAgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW0pOworICAgIC8vIFRoaXMgb2JqIGlzIGJvdW5kIHRvIGEgbWVtb3J5IG9iamVjdC4gUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QgaW4gdGhhdCBtZW1vcnkgb2JqZWN0J3MgbGlzdAorICAgIGlmIChtZW1faW5mbykgeworICAgICAgICBtZW1faW5mby0+b2JqX2JpbmRpbmdzLmVyYXNlKHR5cGVkX2hhbmRsZSk7CisgICAgfQorfQorCisvLyBDbGVhck1lbW9yeU9iamVjdEJpbmRpbmdzIGNsZWFycyB0aGUgYmluZGluZyBvZiBvYmplY3RzIHRvIG1lbW9yeQorLy8gIEZvciB0aGUgZ2l2ZW4gb2JqZWN0IGl0IHB1bGxzIHRoZSBtZW1vcnkgYmluZGluZ3MgYW5kIG1ha2VzIHN1cmUgdGhhdCB0aGUgYmluZGluZ3MKKy8vICBubyBsb25nZXIgcmVmZXIgdG8gdGhlIG9iamVjdCBiZWluZyBjbGVhcmVkLiBUaGlzIG9jY3VycyB3aGVuIG9iamVjdHMgYXJlIGRlc3Ryb3llZC4KK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6Q2xlYXJNZW1vcnlPYmplY3RCaW5kaW5ncyhjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlKSB7CisgICAgQklOREFCTEUgKm1lbV9iaW5kaW5nID0gR2V0T2JqZWN0TWVtQmluZGluZyh0eXBlZF9oYW5kbGUpOworICAgIGlmIChtZW1fYmluZGluZykgeworICAgICAgICBpZiAoIW1lbV9iaW5kaW5nLT5zcGFyc2UpIHsKKyAgICAgICAgICAgIENsZWFyTWVtb3J5T2JqZWN0QmluZGluZyh0eXBlZF9oYW5kbGUsIG1lbV9iaW5kaW5nLT5iaW5kaW5nLm1lbSk7CisgICAgICAgIH0gZWxzZSB7ICAvLyBTcGFyc2UsIGNsZWFyIGFsbCBiaW5kaW5ncworICAgICAgICAgICAgZm9yIChhdXRvICZzcGFyc2VfbWVtX2JpbmRpbmcgOiBtZW1fYmluZGluZy0+c3BhcnNlX2JpbmRpbmdzKSB7CisgICAgICAgICAgICAgICAgQ2xlYXJNZW1vcnlPYmplY3RCaW5kaW5nKHR5cGVkX2hhbmRsZSwgc3BhcnNlX21lbV9iaW5kaW5nLm1lbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFNldE1lbUJpbmRpbmcgaXMgdXNlZCB0byBlc3RhYmxpc2ggaW1tdXRhYmxlLCBub24tc3BhcnNlIGJpbmRpbmcgYmV0d2VlbiBhIHNpbmdsZSBpbWFnZS9idWZmZXIgb2JqZWN0IGFuZCBtZW1vcnkgb2JqZWN0LgorLy8gQ29ycmVzcG9uZGluZyB2YWxpZCB1c2FnZSBjaGVja3MgYXJlIGluIFZhbGlkYXRlU2V0TWVtQmluZGluZygpLgordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpTZXRNZW1CaW5kaW5nKFZrRGV2aWNlTWVtb3J5IG1lbSwgQklOREFCTEUgKm1lbV9iaW5kaW5nLCBWa0RldmljZVNpemUgbWVtb3J5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlKSB7CisgICAgYXNzZXJ0KG1lbV9iaW5kaW5nKTsKKyAgICBtZW1fYmluZGluZy0+YmluZGluZy5tZW0gPSBtZW07CisgICAgbWVtX2JpbmRpbmctPlVwZGF0ZUJvdW5kTWVtb3J5U2V0KCk7ICAvLyBmb3JjZSByZWNyZWF0aW9uIG9mIGNhY2hlZCBzZXQKKyAgICBtZW1fYmluZGluZy0+YmluZGluZy5vZmZzZXQgPSBtZW1vcnlfb2Zmc2V0OworICAgIG1lbV9iaW5kaW5nLT5iaW5kaW5nLnNpemUgPSBtZW1fYmluZGluZy0+cmVxdWlyZW1lbnRzLnNpemU7CisKKyAgICBpZiAobWVtICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIERFVklDRV9NRU1PUllfU1RBVEUgKm1lbV9pbmZvID0gR2V0RGV2TWVtU3RhdGUobWVtKTsKKyAgICAgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgICAgICBtZW1faW5mby0+b2JqX2JpbmRpbmdzLmluc2VydCh0eXBlZF9oYW5kbGUpOworICAgICAgICAgICAgLy8gRm9yIGltYWdlIG9iamVjdHMsIG1ha2Ugc3VyZSBkZWZhdWx0IG1lbW9yeSBzdGF0ZSBpcyBjb3JyZWN0bHkgc2V0CisgICAgICAgICAgICAvLyBUT0RPIDogV2hhdCdzIHRoZSBiZXN0L2NvcnJlY3Qgd2F5IHRvIGhhbmRsZSB0aGlzPworICAgICAgICAgICAgaWYgKGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UgPT0gdHlwZWRfaGFuZGxlLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnN0IGltYWdlX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBJTUFHRV9TVEFURSAqPihtZW1fYmluZGluZyk7CisgICAgICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGljaSA9IGltYWdlX3N0YXRlLT5jcmVhdGVJbmZvOworICAgICAgICAgICAgICAgICAgICBpZiAoaWNpLnVzYWdlICYgKFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86OiAgTW9yZSBtZW1vcnkgc3RhdGUgdHJhbnNpdGlvbiBzdHVmZi4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gRm9yIE5VTEwgbWVtIGNhc2UsIGNsZWFyIGFueSBwcmV2aW91cyBiaW5kaW5nIEVsc2UuLi4KKy8vIE1ha2Ugc3VyZSBnaXZlbiBvYmplY3QgaXMgaW4gaXRzIG9iamVjdCBtYXAKKy8vICBJRiBhIHByZXZpb3VzIGJpbmRpbmcgZXhpc3RlZCwgdXBkYXRlIGJpbmRpbmcKKy8vICBBZGQgcmVmZXJlbmNlIGZyb20gb2JqZWN0SW5mbyB0byBtZW1vcnlJbmZvCisvLyAgQWRkIHJlZmVyZW5jZSBvZmYgb2Ygb2JqZWN0J3MgYmluZGluZyBpbmZvCisvLyBSZXR1cm4gVktfVFJVRSBpZiBhZGRpdGlvbiBpcyBzdWNjZXNzZnVsLCBWS19GQUxTRSBvdGhlcndpc2UKK2Jvb2wgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6U2V0U3BhcnNlTWVtQmluZGluZyhNRU1fQklORElORyBiaW5kaW5nLCBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlKSB7CisgICAgYm9vbCBza2lwID0gVktfRkFMU0U7CisgICAgLy8gSGFuZGxlIE5VTEwgY2FzZSBzZXBhcmF0ZWx5LCBqdXN0IGNsZWFyIHByZXZpb3VzIGJpbmRpbmcgJiBkZWNyZW1lbnQgcmVmZXJlbmNlCisgICAgaWYgKGJpbmRpbmcubWVtID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIC8vIFRPRE8gOiBUaGlzIHNob3VsZCBjYXVzZSB0aGUgcmFuZ2Ugb2YgdGhlIHJlc291cmNlIHRvIGJlIHVuYm91bmQgYWNjb3JkaW5nIHRvIHNwZWMKKyAgICB9IGVsc2UgeworICAgICAgICBCSU5EQUJMRSAqbWVtX2JpbmRpbmcgPSBHZXRPYmplY3RNZW1CaW5kaW5nKHR5cGVkX2hhbmRsZSk7CisgICAgICAgIGFzc2VydChtZW1fYmluZGluZyk7CisgICAgICAgIGlmIChtZW1fYmluZGluZykgeyAgLy8gSW52YWxpZCBoYW5kbGVzIGFyZSByZXBvcnRlZCBieSBvYmplY3QgdHJhY2tlciwgYnV0IEdldCByZXR1cm5zIE5VTEwgZm9yIHRoZW0sIHNvIGF2b2lkIFNFR1YgaGVyZQorICAgICAgICAgICAgYXNzZXJ0KG1lbV9iaW5kaW5nLT5zcGFyc2UpOworICAgICAgICAgICAgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShiaW5kaW5nLm1lbSk7CisgICAgICAgICAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgICAgICAgICBtZW1faW5mby0+b2JqX2JpbmRpbmdzLmluc2VydCh0eXBlZF9oYW5kbGUpOworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gc2V0IG1lbSBiaW5kaW5nIGZvciB0aGlzIG9iamVjdAorICAgICAgICAgICAgICAgIG1lbV9iaW5kaW5nLT5zcGFyc2VfYmluZGluZ3MuaW5zZXJ0KGJpbmRpbmcpOworICAgICAgICAgICAgICAgIG1lbV9iaW5kaW5nLT5VcGRhdGVCb3VuZE1lbW9yeVNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBza2lwOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlVwZGF0ZURyYXdTdGF0ZShDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgY29uc3QgVmtQaXBlbGluZUJpbmRQb2ludCBiaW5kX3BvaW50KSB7CisgICAgYXV0byAmc3RhdGUgPSBjYl9zdGF0ZS0+bGFzdEJvdW5kW2JpbmRfcG9pbnRdOworICAgIFBJUEVMSU5FX1NUQVRFICpwUGlwZSA9IHN0YXRlLnBpcGVsaW5lX3N0YXRlOworICAgIGlmIChWS19OVUxMX0hBTkRMRSAhPSBzdGF0ZS5waXBlbGluZV9sYXlvdXQpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZzZXRfYmluZGluZ19wYWlyIDogcFBpcGUtPmFjdGl2ZV9zbG90cykgeworICAgICAgICAgICAgdWludDMyX3Qgc2V0SW5kZXggPSBzZXRfYmluZGluZ19wYWlyLmZpcnN0OworICAgICAgICAgICAgLy8gUHVsbCB0aGUgc2V0IG5vZGUKKyAgICAgICAgICAgIGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqZGVzY3JpcHRvcl9zZXQgPSBzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS5ib3VuZF9kZXNjcmlwdG9yX3NldDsKKyAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcl9zZXQtPklzUHVzaERlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAgICAgIC8vIEZvciB0aGUgImJpbmRsZXNzIiBzdHlsZSByZXNvdXJjZSB1c2FnZSB3aXRoIG1hbnkgZGVzY3JpcHRvcnMsIG5lZWQgdG8gb3B0aW1pemUgY29tbWFuZCA8LT4gZGVzY3JpcHRvciBiaW5kaW5nCisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBJZiByZWNyZWF0aW5nIHRoZSByZWR1Y2VkX21hcCBoZXJlIHNob3dzIHVwIGluIHByb2ZpbGluZ2luZywgbmVlZCB0byBmaW5kIGEgd2F5IG9mIHNoYXJpbmcgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBwYXNzLiAgVGhvdWdoIGluIHRoZSBjYXNlIG9mICJtYW55IiBkZXNjcmlwdG9ycywgdHlwaWNhbGx5IHRoZSBkZXNjcmlwdG9yIGNvdW50ID4+IGJpbmRpbmcgY291bnQKKyAgICAgICAgICAgICAgICBjdmRlc2NyaXB0b3JzZXQ6OlByZWZpbHRlckJpbmRSZXF1ZXN0TWFwIHJlZHVjZWRfbWFwKCpkZXNjcmlwdG9yX3NldCwgc2V0X2JpbmRpbmdfcGFpci5zZWNvbmQpOworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJmJpbmRpbmdfcmVxX21hcCA9IHJlZHVjZWRfbWFwLkZpbHRlcmVkTWFwKCpjYl9zdGF0ZSwgKnBQaXBlKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWR1Y2VkX21hcC5Jc01hbnlEZXNjcmlwdG9ycygpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHZhbGlkYXRlIGJpbmRpbmcgdGFncyBpZiB3ZSBtZWV0IHRoZSAibWFueSIgY3JpdGVyaWEgaW4gdGhlIFByZWZpbHRlciBjbGFzcworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC0+VXBkYXRlVmFsaWRhdGlvbkNhY2hlKCpjYl9zdGF0ZSwgKnBQaXBlLCBiaW5kaW5nX3JlcV9tYXApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBza2lwIHVwZGF0aW5nIHRoZSBzdGF0ZSBpZiAibm90aGluZyIgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdmFsaWRhdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBTZWUgQ29yZUNoZWNrczo6VmFsaWRhdGVDbWRCdWZEcmF3U3RhdGUgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgICAgICAgICAgICBib29sIGRlc2NyaXB0b3Jfc2V0X2NoYW5nZWQgPQorICAgICAgICAgICAgICAgICAgICAhcmVkdWNlZF9tYXAuSXNNYW55RGVzY3JpcHRvcnMoKSB8fAorICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgaWYgZGVzY3JpcHRvciBzZXQgKG9yIGNvbnRlbnRzKSBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS52YWxpZGF0ZWRfc2V0ICE9IGRlc2NyaXB0b3Jfc2V0IHx8CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLnZhbGlkYXRlZF9zZXRfY2hhbmdlX2NvdW50ICE9IGRlc2NyaXB0b3Jfc2V0LT5HZXRDaGFuZ2VDb3VudCgpIHx8CisgICAgICAgICAgICAgICAgICAgICghZGlzYWJsZWQuaW1hZ2VfbGF5b3V0X3ZhbGlkYXRpb24gJiYKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLnZhbGlkYXRlZF9zZXRfaW1hZ2VfbGF5b3V0X2NoYW5nZV9jb3VudCAhPSBjYl9zdGF0ZS0+aW1hZ2VfbGF5b3V0X2NoYW5nZV9jb3VudCk7CisgICAgICAgICAgICAgICAgYm9vbCBuZWVkX3VwZGF0ZSA9IGRlc2NyaXB0b3Jfc2V0X2NoYW5nZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGlmIHByZXZpb3VzIGJpbmRpbmdSZXFNYXAgZG9lc24ndCBpbmNsdWRlIG5ldyBiaW5kaW5nUmVxTWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGQ6OmluY2x1ZGVzKHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLnZhbGlkYXRlZF9zZXRfYmluZGluZ19yZXFfbWFwLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLnZhbGlkYXRlZF9zZXRfYmluZGluZ19yZXFfbWFwLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nX3JlcV9tYXAuYmVnaW4oKSwgYmluZGluZ19yZXFfbWFwLmVuZCgpKTsKKworICAgICAgICAgICAgICAgIGlmIChuZWVkX3VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBCaW5kIHRoaXMgc2V0IGFuZCBpdHMgYWN0aXZlIGRlc2NyaXB0b3IgcmVzb3VyY2VzIHRvIHRoZSBjb21tYW5kIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3Jfc2V0X2NoYW5nZWQgJiYgcmVkdWNlZF9tYXAuSXNNYW55RGVzY3JpcHRvcnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZWNvcmQgdGhlIGJpbmRpbmdzIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gcmVjb3JkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdSZXFNYXAgZGVsdGFfcmVxczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0X2RpZmZlcmVuY2UoYmluZGluZ19yZXFfbWFwLmJlZ2luKCksIGJpbmRpbmdfcmVxX21hcC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyX3NldFtzZXRJbmRleF0udmFsaWRhdGVkX3NldF9iaW5kaW5nX3JlcV9tYXAuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyX3NldFtzZXRJbmRleF0udmFsaWRhdGVkX3NldF9iaW5kaW5nX3JlcV9tYXAuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoZGVsdGFfcmVxcywgZGVsdGFfcmVxcy5iZWdpbigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC0+VXBkYXRlRHJhd1N0YXRlKHRoaXMsIGNiX3N0YXRlLCBwUGlwZSwgZGVsdGFfcmVxcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC0+VXBkYXRlRHJhd1N0YXRlKHRoaXMsIGNiX3N0YXRlLCBwUGlwZSwgYmluZGluZ19yZXFfbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLnZhbGlkYXRlZF9zZXQgPSBkZXNjcmlwdG9yX3NldDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyX3NldFtzZXRJbmRleF0udmFsaWRhdGVkX3NldF9jaGFuZ2VfY291bnQgPSBkZXNjcmlwdG9yX3NldC0+R2V0Q2hhbmdlQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyX3NldFtzZXRJbmRleF0udmFsaWRhdGVkX3NldF9pbWFnZV9sYXlvdXRfY2hhbmdlX2NvdW50ID0gY2Jfc3RhdGUtPmltYWdlX2xheW91dF9jaGFuZ2VfY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2VkX21hcC5Jc01hbnlEZXNjcmlwdG9ycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIG9sZCA9PSBuZXcgYmVmb3JlIGFzc2lnbmluZywgdGhlIGVxdWFsaXR5IGNoZWNrIGlzIG11Y2ggY2hlYXBlciB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVlaW5nIGFuZCByZWFsbG9jYXRpbmcgdGhlIG1hcC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS52YWxpZGF0ZWRfc2V0X2JpbmRpbmdfcmVxX21hcCAhPSBzZXRfYmluZGluZ19wYWlyLnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBlcl9zZXRbc2V0SW5kZXhdLnZhbGlkYXRlZF9zZXRfYmluZGluZ19yZXFfbWFwID0gc2V0X2JpbmRpbmdfcGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wZXJfc2V0W3NldEluZGV4XS52YWxpZGF0ZWRfc2V0X2JpbmRpbmdfcmVxX21hcCA9IEJpbmRpbmdSZXFNYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXBQaXBlLT52ZXJ0ZXhfYmluZGluZ19kZXNjcmlwdGlvbnNfLmVtcHR5KCkpIHsKKyAgICAgICAgY2Jfc3RhdGUtPnZlcnRleF9idWZmZXJfdXNlZCA9IHRydWU7CisgICAgfQorfQorCisvLyBSZW1vdmUgc2V0IGZyb20gc2V0TWFwIGFuZCBkZWxldGUgdGhlIHNldAordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpGcmVlRGVzY3JpcHRvclNldChjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQgKmRlc2NyaXB0b3Jfc2V0KSB7CisgICAgZGVzY3JpcHRvcl9zZXQtPmRlc3Ryb3llZCA9IHRydWU7CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChkZXNjcmlwdG9yX3NldC0+R2V0U2V0KCksIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldCk7CisgICAgLy8gQW55IGJvdW5kIGNtZCBidWZmZXJzIGFyZSBub3cgaW52YWxpZAorICAgIEludmFsaWRhdGVDb21tYW5kQnVmZmVycyhkZXNjcmlwdG9yX3NldC0+Y2JfYmluZGluZ3MsIG9ial9zdHJ1Y3QpOworCisgICAgc2V0TWFwLmVyYXNlKGRlc2NyaXB0b3Jfc2V0LT5HZXRTZXQoKSk7Cit9CisKKy8vIEZyZWUgYWxsIERTIFBvb2xzIGluY2x1ZGluZyB0aGVpciBTZXRzICYgcmVsYXRlZCBzdWItc3RydWN0cworLy8gTk9URSA6IENhbGxzIHRvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHdyYXBwZWQgaW4gbXV0ZXgKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6RGVsZXRlRGVzY3JpcHRvclNldFBvb2xzKCkgeworICAgIGZvciAoYXV0byBpaSA9IGRlc2NyaXB0b3JQb29sTWFwLmJlZ2luKCk7IGlpICE9IGRlc2NyaXB0b3JQb29sTWFwLmVuZCgpOykgeworICAgICAgICAvLyBSZW1vdmUgdGhpcyBwb29scycgc2V0cyBmcm9tIHNldE1hcCBhbmQgZGVsZXRlIHRoZW0KKyAgICAgICAgZm9yIChhdXRvIGRzIDogaWktPnNlY29uZC0+c2V0cykgeworICAgICAgICAgICAgRnJlZURlc2NyaXB0b3JTZXQoZHMpOworICAgICAgICB9CisgICAgICAgIGlpLT5zZWNvbmQtPnNldHMuY2xlYXIoKTsKKyAgICAgICAgaWkgPSBkZXNjcmlwdG9yUG9vbE1hcC5lcmFzZShpaSk7CisgICAgfQorfQorCisvLyBGb3IgZ2l2ZW4gb2JqZWN0IHN0cnVjdCByZXR1cm4gYSBwdHIgb2YgQkFTRV9OT0RFIHR5cGUgZm9yIGl0cyB3cmFwcGluZyBzdHJ1Y3QKK0JBU0VfTk9ERSAqVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6R2V0U3RhdGVTdHJ1Y3RQdHJGcm9tT2JqZWN0KGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlICZvYmplY3Rfc3RydWN0KSB7CisgICAgaWYgKG9iamVjdF9zdHJ1Y3Qubm9kZSkgeworI2lmZGVmIF9ERUJVRworICAgICAgICAvLyBhc3NlcnQgdGhhdCBsb29rdXAgd291bGQgZmluZCB0aGUgc2FtZSBvYmplY3QKKyAgICAgICAgVnVsa2FuVHlwZWRIYW5kbGUgb3RoZXIgPSBvYmplY3Rfc3RydWN0OworICAgICAgICBvdGhlci5ub2RlID0gbnVsbHB0cjsKKyAgICAgICAgYXNzZXJ0KG9iamVjdF9zdHJ1Y3Qubm9kZSA9PSBHZXRTdGF0ZVN0cnVjdFB0ckZyb21PYmplY3Qob3RoZXIpKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gb2JqZWN0X3N0cnVjdC5ub2RlOworICAgIH0KKyAgICBCQVNFX05PREUgKmJhc2VfcHRyID0gbnVsbHB0cjsKKyAgICBzd2l0Y2ggKG9iamVjdF9zdHJ1Y3QudHlwZSkgeworICAgICAgICBjYXNlIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclNldDogeworICAgICAgICAgICAgYmFzZV9wdHIgPSBHZXRTZXROb2RlKG9iamVjdF9zdHJ1Y3QuQ2FzdDxWa0Rlc2NyaXB0b3JTZXQ+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZVNhbXBsZXI6IHsKKyAgICAgICAgICAgIGJhc2VfcHRyID0gR2V0U2FtcGxlclN0YXRlKG9iamVjdF9zdHJ1Y3QuQ2FzdDxWa1NhbXBsZXI+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZVF1ZXJ5UG9vbDogeworICAgICAgICAgICAgYmFzZV9wdHIgPSBHZXRRdWVyeVBvb2xTdGF0ZShvYmplY3Rfc3RydWN0LkNhc3Q8VmtRdWVyeVBvb2w+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZVBpcGVsaW5lOiB7CisgICAgICAgICAgICBiYXNlX3B0ciA9IEdldFBpcGVsaW5lU3RhdGUob2JqZWN0X3N0cnVjdC5DYXN0PFZrUGlwZWxpbmU+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcjogeworICAgICAgICAgICAgYmFzZV9wdHIgPSBHZXRCdWZmZXJTdGF0ZShvYmplY3Rfc3RydWN0LkNhc3Q8VmtCdWZmZXI+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlclZpZXc6IHsKKyAgICAgICAgICAgIGJhc2VfcHRyID0gR2V0QnVmZmVyVmlld1N0YXRlKG9iamVjdF9zdHJ1Y3QuQ2FzdDxWa0J1ZmZlclZpZXc+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUltYWdlOiB7CisgICAgICAgICAgICBiYXNlX3B0ciA9IEdldEltYWdlU3RhdGUob2JqZWN0X3N0cnVjdC5DYXN0PFZrSW1hZ2U+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUltYWdlVmlldzogeworICAgICAgICAgICAgYmFzZV9wdHIgPSBHZXRJbWFnZVZpZXdTdGF0ZShvYmplY3Rfc3RydWN0LkNhc3Q8VmtJbWFnZVZpZXc+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUV2ZW50OiB7CisgICAgICAgICAgICBiYXNlX3B0ciA9IEdldEV2ZW50U3RhdGUob2JqZWN0X3N0cnVjdC5DYXN0PFZrRXZlbnQ+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZURlc2NyaXB0b3JQb29sOiB7CisgICAgICAgICAgICBiYXNlX3B0ciA9IEdldERlc2NyaXB0b3JQb29sU3RhdGUob2JqZWN0X3N0cnVjdC5DYXN0PFZrRGVzY3JpcHRvclBvb2w+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRQb29sOiB7CisgICAgICAgICAgICBiYXNlX3B0ciA9IEdldENvbW1hbmRQb29sU3RhdGUob2JqZWN0X3N0cnVjdC5DYXN0PFZrQ29tbWFuZFBvb2w+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyOiB7CisgICAgICAgICAgICBiYXNlX3B0ciA9IEdldEZyYW1lYnVmZmVyU3RhdGUob2JqZWN0X3N0cnVjdC5DYXN0PFZrRnJhbWVidWZmZXI+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3M6IHsKKyAgICAgICAgICAgIGJhc2VfcHRyID0gR2V0UmVuZGVyUGFzc1N0YXRlKG9iamVjdF9zdHJ1Y3QuQ2FzdDxWa1JlbmRlclBhc3M+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeTogeworICAgICAgICAgICAgYmFzZV9wdHIgPSBHZXREZXZNZW1TdGF0ZShvYmplY3Rfc3RydWN0LkNhc3Q8VmtEZXZpY2VNZW1vcnk+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WOiB7CisgICAgICAgICAgICBiYXNlX3B0ciA9IEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZVN0YXRlKG9iamVjdF9zdHJ1Y3QuQ2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1Z1bGthbk9iamVjdFR5cGVVbmtub3duOgorICAgICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGFuIGVsZW1lbnQgb2YgdGhlIG9iamVjdF9iaW5kaW5ncyB2ZWN0b3IgaGFzIGJlZW4KKyAgICAgICAgICAgIC8vIHplcm9lZCBvdXQsIGFmdGVyIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRPRE8gOiBBbnkgb3RoZXIgb2JqZWN0cyB0byBiZSBoYW5kbGVkIGhlcmU/CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGJhc2VfcHRyOworfQorCisvLyBUaWUgdGhlIFZ1bGthblR5cGVkSGFuZGxlIHRvIHRoZSBjbWQgYnVmZmVyIHdoaWNoIGluY2x1ZGVzOgorLy8gIEFkZCBvYmplY3RfYmluZGluZyB0byBjbWQgYnVmZmVyCisvLyAgQWRkIGNiX2JpbmRpbmcgdG8gb2JqZWN0Citib29sIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKHNtYWxsX3Vub3JkZXJlZF9tYXA8Q01EX0JVRkZFUl9TVEFURSAqLCBpbnQsIDg+ICZjYl9iaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgJm9iaiwgQ01EX0JVRkZFUl9TVEFURSAqY2Jfbm9kZSkgeworICAgIGlmIChkaXNhYmxlZC5jb21tYW5kX2J1ZmZlcl9zdGF0ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIEluc2VydCB0aGUgY2JfYmluZGluZyB3aXRoIGEgZGVmYXVsdCAnaW5kZXgnIG9mIC0xLiBUaGVuIHB1c2ggdGhlIG9iaiBpbnRvIHRoZSBvYmplY3RfYmluZGluZ3MKKyAgICAvLyB2ZWN0b3IsIGFuZCB1cGRhdGUgY2JfYmluZGluZ3NbY2Jfbm9kZV0gd2l0aCB0aGUgaW5kZXggb2YgdGhhdCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IuCisgICAgYXV0byBpbnNlcnRlZCA9IGNiX2JpbmRpbmdzLmluc2VydCh7Y2Jfbm9kZSwgLTF9KTsKKyAgICBpZiAoaW5zZXJ0ZWQuc2Vjb25kKSB7CisgICAgICAgIGNiX25vZGUtPm9iamVjdF9iaW5kaW5ncy5wdXNoX2JhY2sob2JqKTsKKyAgICAgICAgaW5zZXJ0ZWQuZmlyc3QtPnNlY29uZCA9IChpbnQpY2Jfbm9kZS0+b2JqZWN0X2JpbmRpbmdzLnNpemUoKSAtIDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEZvciBhIGdpdmVuIG9iamVjdCwgaWYgY2Jfbm9kZSBpcyBpbiB0aGF0IG9iamVjdHMgY2JfYmluZGluZ3MsIHJlbW92ZSBjYl9ub2RlCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlbW92ZUNvbW1hbmRCdWZmZXJCaW5kaW5nKFZ1bGthblR5cGVkSGFuZGxlIGNvbnN0ICZvYmplY3QsIENNRF9CVUZGRVJfU1RBVEUgKmNiX25vZGUpIHsKKyAgICBCQVNFX05PREUgKmJhc2Vfb2JqID0gR2V0U3RhdGVTdHJ1Y3RQdHJGcm9tT2JqZWN0KG9iamVjdCk7CisgICAgaWYgKGJhc2Vfb2JqKSBiYXNlX29iai0+Y2JfYmluZGluZ3MuZXJhc2UoY2Jfbm9kZSk7Cit9CisKKy8vIFJlc2V0IHRoZSBjb21tYW5kIGJ1ZmZlciBzdGF0ZQorLy8gIE1haW50YWluIHRoZSBjcmVhdGVJbmZvIGFuZCBzZXQgc3RhdGUgdG8gQ0JfTkVXLCBidXQgY2xlYXIgYWxsIG90aGVyIHN0YXRlCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlc2V0Q29tbWFuZEJ1ZmZlclN0YXRlKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciBjYikgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKnBDQiA9IEdldENCU3RhdGUoY2IpOworICAgIGlmIChwQ0IpIHsKKyAgICAgICAgcENCLT5pbl91c2Uuc3RvcmUoMCk7CisgICAgICAgIC8vIFJlc2V0IENCIHN0YXRlIChub3RlIHRoYXQgY3JlYXRlSW5mbyBpcyBub3QgY2xlYXJlZCkKKyAgICAgICAgcENCLT5jb21tYW5kQnVmZmVyID0gY2I7CisgICAgICAgIG1lbXNldCgmcENCLT5iZWdpbkluZm8sIDAsIHNpemVvZihWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8pKTsKKyAgICAgICAgbWVtc2V0KCZwQ0ItPmluaGVyaXRhbmNlSW5mbywgMCwgc2l6ZW9mKFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbykpOworICAgICAgICBwQ0ItPmhhc0RyYXdDbWQgPSBmYWxzZTsKKyAgICAgICAgcENCLT5oYXNUcmFjZVJheXNDbWQgPSBmYWxzZTsKKyAgICAgICAgcENCLT5oYXNCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZUNtZCA9IGZhbHNlOworICAgICAgICBwQ0ItPmhhc0Rpc3BhdGNoQ21kID0gZmFsc2U7CisgICAgICAgIHBDQi0+c3RhdGUgPSBDQl9ORVc7CisgICAgICAgIHBDQi0+Y29tbWFuZENvdW50ID0gMDsKKyAgICAgICAgcENCLT5zdWJtaXRDb3VudCA9IDA7CisgICAgICAgIHBDQi0+aW1hZ2VfbGF5b3V0X2NoYW5nZV9jb3VudCA9IDE7ICAvLyBTdGFydCBhdCAxLiAwIGlzIGluc2VydCB2YWx1ZSBmb3IgdmFsaWRhdGlvbiBjYWNoZSB2ZXJzaW9ucywgcy50LiBuZXcgPT0gZGlydHkKKyAgICAgICAgcENCLT5zdGF0dXMgPSAwOworICAgICAgICBwQ0ItPnN0YXRpY19zdGF0dXMgPSAwOworICAgICAgICBwQ0ItPnZpZXdwb3J0TWFzayA9IDA7CisgICAgICAgIHBDQi0+c2Npc3Nvck1hc2sgPSAwOworCisgICAgICAgIGZvciAoYXV0byAmaXRlbSA6IHBDQi0+bGFzdEJvdW5kKSB7CisgICAgICAgICAgICBpdGVtLnNlY29uZC5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZwQ0ItPmFjdGl2ZVJlbmRlclBhc3NCZWdpbkluZm8sIDAsIHNpemVvZihwQ0ItPmFjdGl2ZVJlbmRlclBhc3NCZWdpbkluZm8pKTsKKyAgICAgICAgcENCLT5hY3RpdmVSZW5kZXJQYXNzID0gbnVsbHB0cjsKKyAgICAgICAgcENCLT5hY3RpdmVTdWJwYXNzQ29udGVudHMgPSBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORTsKKyAgICAgICAgcENCLT5hY3RpdmVTdWJwYXNzID0gMDsKKyAgICAgICAgcENCLT5icm9rZW5fYmluZGluZ3MuY2xlYXIoKTsKKyAgICAgICAgcENCLT53YWl0ZWRFdmVudHMuY2xlYXIoKTsKKyAgICAgICAgcENCLT5ldmVudHMuY2xlYXIoKTsKKyAgICAgICAgcENCLT53cml0ZUV2ZW50c0JlZm9yZVdhaXQuY2xlYXIoKTsKKyAgICAgICAgcENCLT5hY3RpdmVRdWVyaWVzLmNsZWFyKCk7CisgICAgICAgIHBDQi0+c3RhcnRlZFF1ZXJpZXMuY2xlYXIoKTsKKyAgICAgICAgcENCLT5pbWFnZV9sYXlvdXRfbWFwLmNsZWFyKCk7CisgICAgICAgIHBDQi0+Y3VycmVudF92ZXJ0ZXhfYnVmZmVyX2JpbmRpbmdfaW5mby52ZXJ0ZXhfYnVmZmVyX2JpbmRpbmdzLmNsZWFyKCk7CisgICAgICAgIHBDQi0+dmVydGV4X2J1ZmZlcl91c2VkID0gZmFsc2U7CisgICAgICAgIHBDQi0+cHJpbWFyeUNvbW1hbmRCdWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgLy8gSWYgc2Vjb25kYXJ5LCBpbnZhbGlkYXRlIGFueSBwcmltYXJ5IGNvbW1hbmQgYnVmZmVyIHRoYXQgbWF5IGNhbGwgdXMuCisgICAgICAgIGlmIChwQ0ItPmNyZWF0ZUluZm8ubGV2ZWwgPT0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZKSB7CisgICAgICAgICAgICBJbnZhbGlkYXRlTGlua2VkQ29tbWFuZEJ1ZmZlcnMocENCLT5saW5rZWRDb21tYW5kQnVmZmVycywgVnVsa2FuVHlwZWRIYW5kbGUoY2IsIGtWdWxrYW5PYmplY3RUeXBlQ29tbWFuZEJ1ZmZlcikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIHJldmVyc2UgY29tbWFuZCBidWZmZXIgbGlua3MuCisgICAgICAgIGZvciAoYXV0byBwU3ViQ0IgOiBwQ0ItPmxpbmtlZENvbW1hbmRCdWZmZXJzKSB7CisgICAgICAgICAgICBwU3ViQ0ItPmxpbmtlZENvbW1hbmRCdWZmZXJzLmVyYXNlKHBDQik7CisgICAgICAgIH0KKyAgICAgICAgcENCLT5saW5rZWRDb21tYW5kQnVmZmVycy5jbGVhcigpOworICAgICAgICBwQ0ItPnF1ZXVlX3N1Ym1pdF9mdW5jdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgcENCLT5jbWRfZXhlY3V0ZV9jb21tYW5kc19mdW5jdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgcENCLT5ldmVudFVwZGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgcENCLT5xdWVyeVVwZGF0ZXMuY2xlYXIoKTsKKworICAgICAgICAvLyBSZW1vdmUgb2JqZWN0IGJpbmRpbmdzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmb2JqIDogcENCLT5vYmplY3RfYmluZGluZ3MpIHsKKyAgICAgICAgICAgIFJlbW92ZUNvbW1hbmRCdWZmZXJCaW5kaW5nKG9iaiwgcENCKTsKKyAgICAgICAgfQorICAgICAgICBwQ0ItPm9iamVjdF9iaW5kaW5ncy5jbGVhcigpOworICAgICAgICAvLyBSZW1vdmUgdGhpcyBjbWRCdWZmZXIncyByZWZlcmVuY2UgZnJvbSBlYWNoIEZyYW1lQnVmZmVyJ3MgQ0IgcmVmIGxpc3QKKyAgICAgICAgZm9yIChhdXRvIGZyYW1lYnVmZmVyIDogcENCLT5mcmFtZWJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGF1dG8gZmJfc3RhdGUgPSBHZXRGcmFtZWJ1ZmZlclN0YXRlKGZyYW1lYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChmYl9zdGF0ZSkgZmJfc3RhdGUtPmNiX2JpbmRpbmdzLmVyYXNlKHBDQik7CisgICAgICAgIH0KKyAgICAgICAgcENCLT5mcmFtZWJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgcENCLT5hY3RpdmVGcmFtZWJ1ZmZlciA9IFZLX05VTExfSEFORExFOworICAgICAgICBtZW1zZXQoJnBDQi0+aW5kZXhfYnVmZmVyX2JpbmRpbmcsIDAsIHNpemVvZihwQ0ItPmluZGV4X2J1ZmZlcl9iaW5kaW5nKSk7CisKKyAgICAgICAgcENCLT5xZm9fdHJhbnNmZXJfaW1hZ2VfYmFycmllcnMuUmVzZXQoKTsKKyAgICAgICAgcENCLT5xZm9fdHJhbnNmZXJfYnVmZmVyX2JhcnJpZXJzLlJlc2V0KCk7CisKKyAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGxhYmVsIGRhdGEKKyAgICAgICAgUmVzZXRDbWREZWJ1Z1V0aWxzTGFiZWwocmVwb3J0X2RhdGEsIHBDQi0+Y29tbWFuZEJ1ZmZlcik7CisgICAgICAgIHBDQi0+ZGVidWdfbGFiZWwuUmVzZXQoKTsKKyAgICAgICAgcENCLT52YWxpZGF0ZV9kZXNjcmlwdG9yc2V0c19pbl9xdWV1ZXN1Ym1pdC5jbGVhcigpOworICAgIH0KKyAgICBpZiAoY29tbWFuZF9idWZmZXJfcmVzZXRfY2FsbGJhY2spIHsKKyAgICAgICAgKCpjb21tYW5kX2J1ZmZlcl9yZXNldF9jYWxsYmFjaykoY2IpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIGdwdSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RldmljZSAqcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgKmVuYWJsZWRfZmVhdHVyZXNfZm91bmQgPSBwQ3JlYXRlSW5mby0+cEVuYWJsZWRGZWF0dXJlczsKKyAgICBpZiAobnVsbHB0ciA9PSBlbmFibGVkX2ZlYXR1cmVzX2ZvdW5kKSB7CisgICAgICAgIGNvbnN0IGF1dG8gKmZlYXR1cmVzMiA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgICAgIGlmIChmZWF0dXJlczIpIHsKKyAgICAgICAgICAgIGVuYWJsZWRfZmVhdHVyZXNfZm91bmQgPSAmKGZlYXR1cmVzMi0+ZmVhdHVyZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgVmFsaWRhdGlvbk9iamVjdCAqZGV2aWNlX29iamVjdCA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KCpwRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZhbGlkYXRpb25PYmplY3QgKnZhbGlkYXRpb25fZGF0YSA9IEdldFZhbGlkYXRpb25PYmplY3QoZGV2aWNlX29iamVjdC0+b2JqZWN0X2Rpc3BhdGNoLCB0aGlzLT5jb250YWluZXJfdHlwZSk7CisgICAgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqc3RhdGVfdHJhY2tlciA9IHN0YXRpY19jYXN0PFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKj4odmFsaWRhdGlvbl9kYXRhKTsKKworICAgIGlmIChudWxscHRyID09IGVuYWJsZWRfZmVhdHVyZXNfZm91bmQpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5jb3JlID0ge307CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5jb3JlID0gKmVuYWJsZWRfZmVhdHVyZXNfZm91bmQ7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgcXVldWVfZmFtaWx5X3Byb3BlcnRpZXMgYXJlIG9idGFpbmVkIGZvciB0aGlzIGRldmljZSdzIHBoeXNpY2FsX2RldmljZSwgZXZlbiBpZiB0aGUgYXBwIGhhcyBub3QKKyAgICAvLyBwcmV2aW91c2x5IHNldCB0aGVtIHRocm91Z2ggYW4gZXhwbGljaXQgQVBJIGNhbGwuCisgICAgdWludDMyX3QgY291bnQ7CisgICAgYXV0byBwZF9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUoZ3B1KTsKKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKGdwdSwgJmNvdW50LCBudWxscHRyKTsKKyAgICBwZF9zdGF0ZS0+cXVldWVfZmFtaWx5X3Byb3BlcnRpZXMucmVzaXplKHN0ZDo6bWF4KHN0YXRpY19jYXN0PHVpbnQzMl90PihwZF9zdGF0ZS0+cXVldWVfZmFtaWx5X3Byb3BlcnRpZXMuc2l6ZSgpKSwgY291bnQpKTsKKyAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKGdwdSwgJmNvdW50LCAmcGRfc3RhdGUtPnF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzWzBdKTsKKyAgICAvLyBTYXZlIGxvY2FsIGxpbmsgdG8gdGhpcyBkZXZpY2UncyBwaHlzaWNhbCBkZXZpY2Ugc3RhdGUKKyAgICBzdGF0ZV90cmFja2VyLT5waHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBwZF9zdGF0ZTsKKworICAgIGNvbnN0IGF1dG8gKmRldmljZV9ncm91cF9jaSA9IGx2bF9maW5kX2luX2NoYWluPFZrRGV2aWNlR3JvdXBEZXZpY2VDcmVhdGVJbmZvPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIHN0YXRlX3RyYWNrZXItPnBoeXNpY2FsX2RldmljZV9jb3VudCA9CisgICAgICAgIGRldmljZV9ncm91cF9jaSAmJiBkZXZpY2VfZ3JvdXBfY2ktPnBoeXNpY2FsRGV2aWNlQ291bnQgPiAwID8gZGV2aWNlX2dyb3VwX2NpLT5waHlzaWNhbERldmljZUNvdW50IDogMTsKKworICAgIGNvbnN0IGF1dG8gKmRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5kZXNjcmlwdG9yX2luZGV4aW5nID0gKmRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqZWlnaHRfYml0X3N0b3JhZ2VfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlOEJpdFN0b3JhZ2VGZWF0dXJlc0tIUj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAoZWlnaHRfYml0X3N0b3JhZ2VfZmVhdHVyZXMpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5laWdodF9iaXRfc3RvcmFnZSA9ICplaWdodF9iaXRfc3RvcmFnZV9mZWF0dXJlczsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICpleGNsdXNpdmVfc2Npc3Nvcl9mZWF0dXJlcyA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VFeGNsdXNpdmVTY2lzc29yRmVhdHVyZXNOVj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAoZXhjbHVzaXZlX3NjaXNzb3JfZmVhdHVyZXMpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5leGNsdXNpdmVfc2Npc3NvciA9ICpleGNsdXNpdmVfc2Npc3Nvcl9mZWF0dXJlczsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICpzaGFkaW5nX3JhdGVfaW1hZ2VfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlY+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHNoYWRpbmdfcmF0ZV9pbWFnZV9mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLnNoYWRpbmdfcmF0ZV9pbWFnZSA9ICpzaGFkaW5nX3JhdGVfaW1hZ2VfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqbWVzaF9zaGFkZXJfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlckZlYXR1cmVzTlY+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKG1lc2hfc2hhZGVyX2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMubWVzaF9zaGFkZXIgPSAqbWVzaF9zaGFkZXJfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqaW5saW5lX3VuaWZvcm1fYmxvY2tfZmVhdHVyZXMgPQorICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrRmVhdHVyZXNFWFQ+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGlubGluZV91bmlmb3JtX2Jsb2NrX2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMuaW5saW5lX3VuaWZvcm1fYmxvY2sgPSAqaW5saW5lX3VuaWZvcm1fYmxvY2tfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqdHJhbnNmb3JtX2ZlZWRiYWNrX2ZlYXR1cmVzID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrRmVhdHVyZXNFWFQ+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHRyYW5zZm9ybV9mZWVkYmFja19mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLnRyYW5zZm9ybV9mZWVkYmFja19mZWF0dXJlcyA9ICp0cmFuc2Zvcm1fZmVlZGJhY2tfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqZmxvYXQxNl9pbnQ4X2ZlYXR1cmVzID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZUZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGZsb2F0MTZfaW50OF9mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLmZsb2F0MTZfaW50OCA9ICpmbG9hdDE2X2ludDhfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqdnR4X2F0dHJpYl9kaXZfZmVhdHVyZXMgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmICh2dHhfYXR0cmliX2Rpdl9mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLnZ0eF9hdHRyaWJfZGl2aXNvcl9mZWF0dXJlcyA9ICp2dHhfYXR0cmliX2Rpdl9mZWF0dXJlczsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICp1bmlmb3JtX2J1ZmZlcl9zdGFuZGFyZF9sYXlvdXRfZmVhdHVyZXMgPQorICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHVuaWZvcm1fYnVmZmVyX3N0YW5kYXJkX2xheW91dF9mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLnVuaWZvcm1fYnVmZmVyX3N0YW5kYXJkX2xheW91dCA9ICp1bmlmb3JtX2J1ZmZlcl9zdGFuZGFyZF9sYXlvdXRfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqc2NhbGFyX2Jsb2NrX2xheW91dF9mZWF0dXJlcyA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmIChzY2FsYXJfYmxvY2tfbGF5b3V0X2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMuc2NhbGFyX2Jsb2NrX2xheW91dF9mZWF0dXJlcyA9ICpzY2FsYXJfYmxvY2tfbGF5b3V0X2ZlYXR1cmVzOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gKmJ1ZmZlcl9kZXZpY2VfYWRkcmVzcyA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGJ1ZmZlcl9kZXZpY2VfYWRkcmVzcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLmJ1ZmZlcl9kZXZpY2VfYWRkcmVzcyA9ICpidWZmZXJfZGV2aWNlX2FkZHJlc3M7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqYnVmZmVyX2RldmljZV9hZGRyZXNzX2V4dCA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNFWFQ+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGJ1ZmZlcl9kZXZpY2VfYWRkcmVzc19leHQpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5idWZmZXJfZGV2aWNlX2FkZHJlc3NfZXh0ID0gKmJ1ZmZlcl9kZXZpY2VfYWRkcmVzc19leHQ7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqY29vcGVyYXRpdmVfbWF0cml4X2ZlYXR1cmVzID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4RmVhdHVyZXNOVj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAoY29vcGVyYXRpdmVfbWF0cml4X2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMuY29vcGVyYXRpdmVfbWF0cml4X2ZlYXR1cmVzID0gKmNvb3BlcmF0aXZlX21hdHJpeF9mZWF0dXJlczsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICpob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVzID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQ+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXMpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5ob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVzID0gKmhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqY29tcHV0ZV9zaGFkZXJfZGVyaXZhdGl2ZXNfZmVhdHVyZXMgPQorICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAoY29tcHV0ZV9zaGFkZXJfZGVyaXZhdGl2ZXNfZmVhdHVyZXMpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlc19mZWF0dXJlcyA9ICpjb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlc19mZWF0dXJlczsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICpmcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWNfZmVhdHVyZXMgPQorICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpY0ZlYXR1cmVzTlY+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpY19mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLmZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpY19mZWF0dXJlcyA9ICpmcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWNfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqc2hhZGVyX2ltYWdlX2Zvb3RwcmludF9mZWF0dXJlcyA9CisgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHNoYWRlcl9pbWFnZV9mb290cHJpbnRfZmVhdHVyZXMpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy5zaGFkZXJfaW1hZ2VfZm9vdHByaW50X2ZlYXR1cmVzID0gKnNoYWRlcl9pbWFnZV9mb290cHJpbnRfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqZnJhZ21lbnRfc2hhZGVyX2ludGVybG9ja19mZWF0dXJlcyA9CisgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckludGVybG9ja0ZlYXR1cmVzRVhUPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmIChmcmFnbWVudF9zaGFkZXJfaW50ZXJsb2NrX2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMuZnJhZ21lbnRfc2hhZGVyX2ludGVybG9ja19mZWF0dXJlcyA9ICpmcmFnbWVudF9zaGFkZXJfaW50ZXJsb2NrX2ZlYXR1cmVzOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gKmRlbW90ZV90b19oZWxwZXJfaW52b2NhdGlvbl9mZWF0dXJlcyA9CisgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVD4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAoZGVtb3RlX3RvX2hlbHBlcl9pbnZvY2F0aW9uX2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMuZGVtb3RlX3RvX2hlbHBlcl9pbnZvY2F0aW9uX2ZlYXR1cmVzID0gKmRlbW90ZV90b19oZWxwZXJfaW52b2NhdGlvbl9mZWF0dXJlczsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICp0ZXhlbF9idWZmZXJfYWxpZ25tZW50X2ZlYXR1cmVzID0KKyAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZVRleGVsQnVmZmVyQWxpZ25tZW50RmVhdHVyZXNFWFQ+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHRleGVsX2J1ZmZlcl9hbGlnbm1lbnRfZmVhdHVyZXMpIHsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+ZW5hYmxlZF9mZWF0dXJlcy50ZXhlbF9idWZmZXJfYWxpZ25tZW50X2ZlYXR1cmVzID0gKnRleGVsX2J1ZmZlcl9hbGlnbm1lbnRfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqaW1hZ2VsZXNzX2ZyYW1lYnVmZmVyX2ZlYXR1cmVzID0KKyAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGltYWdlbGVzc19mcmFtZWJ1ZmZlcl9mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLmltYWdlbGVzc19mcmFtZWJ1ZmZlcl9mZWF0dXJlcyA9ICppbWFnZWxlc3NfZnJhbWVidWZmZXJfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqcGlwZWxpbmVfZXhlX3Byb3BzX2ZlYXR1cmVzID0KKyAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZVBpcGVsaW5lRXhlY3V0YWJsZVByb3BlcnRpZXNGZWF0dXJlc0tIUj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAocGlwZWxpbmVfZXhlX3Byb3BzX2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMucGlwZWxpbmVfZXhlX3Byb3BzX2ZlYXR1cmVzID0gKnBpcGVsaW5lX2V4ZV9wcm9wc19mZWF0dXJlczsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICpkZWRpY2F0ZWRfYWxsb2NhdGlvbl9pbWFnZV9hbGlhc2luZ19mZWF0dXJlcyA9CisgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VEZWRpY2F0ZWRBbGxvY2F0aW9uSW1hZ2VBbGlhc2luZ0ZlYXR1cmVzTlY+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKGRlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nX2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMuZGVkaWNhdGVkX2FsbG9jYXRpb25faW1hZ2VfYWxpYXNpbmdfZmVhdHVyZXMgPQorICAgICAgICAgICAgKmRlZGljYXRlZF9hbGxvY2F0aW9uX2ltYWdlX2FsaWFzaW5nX2ZlYXR1cmVzOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gKnN1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzX2ZlYXR1cmVzID0KKyAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmIChzdWJncm91cF9leHRlbmRlZF90eXBlc19mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLnN1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzX2ZlYXR1cmVzID0gKnN1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzX2ZlYXR1cmVzOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gKnNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlcyA9CisgICAgICAgIGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUj4ocENyZWF0ZUluZm8tPnBOZXh0KTsKKyAgICBpZiAoc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMuc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzID0gKnNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlczsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICpwZXJmb3JtYW5jZV9xdWVyeV9mZWF0dXJlcyA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHBlcmZvcm1hbmNlX3F1ZXJ5X2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMucGVyZm9ybWFuY2VfcXVlcnlfZmVhdHVyZXMgPSAqcGVyZm9ybWFuY2VfcXVlcnlfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqdGltZWxpbmVfc2VtYXBob3JlX2ZlYXR1cmVzID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlRmVhdHVyZXNLSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHRpbWVsaW5lX3NlbWFwaG9yZV9mZWF0dXJlcykgeworICAgICAgICBzdGF0ZV90cmFja2VyLT5lbmFibGVkX2ZlYXR1cmVzLnRpbWVsaW5lX3NlbWFwaG9yZV9mZWF0dXJlcyA9ICp0aW1lbGluZV9zZW1hcGhvcmVfZmVhdHVyZXM7CisgICAgfQorCisgICAgY29uc3QgYXV0byAqZGV2aWNlX2NvaGVyZW50X21lbW9yeV9mZWF0dXJlcyA9IGx2bF9maW5kX2luX2NoYWluPFZrUGh5c2ljYWxEZXZpY2VDb2hlcmVudE1lbW9yeUZlYXR1cmVzQU1EPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmIChkZXZpY2VfY29oZXJlbnRfbWVtb3J5X2ZlYXR1cmVzKSB7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmVuYWJsZWRfZmVhdHVyZXMuZGV2aWNlX2NvaGVyZW50X21lbW9yeV9mZWF0dXJlcyA9ICpkZXZpY2VfY29oZXJlbnRfbWVtb3J5X2ZlYXR1cmVzOworICAgIH0KKworICAgIC8vIFN0b3JlIHBoeXNpY2FsIGRldmljZSBwcm9wZXJ0aWVzIGFuZCBwaHlzaWNhbCBkZXZpY2UgbWVtIGxpbWl0cyBpbnRvIENvcmVDaGVja3Mgc3RydWN0cworICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKGdwdSwgJnN0YXRlX3RyYWNrZXItPnBoeXNfZGV2X21lbV9wcm9wcyk7CisgICAgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoZ3B1LCAmc3RhdGVfdHJhY2tlci0+cGh5c19kZXZfcHJvcHMpOworCisgICAgY29uc3QgYXV0byAmZGV2X2V4dCA9IHN0YXRlX3RyYWNrZXItPmRldmljZV9leHRlbnNpb25zOworICAgIGF1dG8gKnBoeXNfZGV2X3Byb3BzID0gJnN0YXRlX3RyYWNrZXItPnBoeXNfZGV2X2V4dF9wcm9wczsKKworICAgIGlmIChkZXZfZXh0LnZrX2tocl9wdXNoX2Rlc2NyaXB0b3IpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBuZWVkZWQgcHVzaF9kZXNjcmlwdG9yIGxpbWl0cworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzS0hSIHB1c2hfZGVzY3JpcHRvcl9wcm9wOworICAgICAgICBHZXRQaHlzaWNhbERldmljZUV4dFByb3BlcnRpZXMoZ3B1LCBkZXZfZXh0LnZrX2tocl9wdXNoX2Rlc2NyaXB0b3IsICZwdXNoX2Rlc2NyaXB0b3JfcHJvcCk7CisgICAgICAgIHBoeXNfZGV2X3Byb3BzLT5tYXhfcHVzaF9kZXNjcmlwdG9ycyA9IHB1c2hfZGVzY3JpcHRvcl9wcm9wLm1heFB1c2hEZXNjcmlwdG9yczsKKyAgICB9CisKKyAgICBHZXRQaHlzaWNhbERldmljZUV4dFByb3BlcnRpZXMoZ3B1LCBkZXZfZXh0LnZrX2V4dF9kZXNjcmlwdG9yX2luZGV4aW5nLCAmcGh5c19kZXZfcHJvcHMtPmRlc2NyaXB0b3JfaW5kZXhpbmdfcHJvcHMpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0UHJvcGVydGllcyhncHUsIGRldl9leHQudmtfbnZfc2hhZGluZ19yYXRlX2ltYWdlLCAmcGh5c19kZXZfcHJvcHMtPnNoYWRpbmdfcmF0ZV9pbWFnZV9wcm9wcyk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VFeHRQcm9wZXJ0aWVzKGdwdSwgZGV2X2V4dC52a19udl9tZXNoX3NoYWRlciwgJnBoeXNfZGV2X3Byb3BzLT5tZXNoX3NoYWRlcl9wcm9wcyk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VFeHRQcm9wZXJ0aWVzKGdwdSwgZGV2X2V4dC52a19leHRfaW5saW5lX3VuaWZvcm1fYmxvY2ssICZwaHlzX2Rldl9wcm9wcy0+aW5saW5lX3VuaWZvcm1fYmxvY2tfcHJvcHMpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0UHJvcGVydGllcyhncHUsIGRldl9leHQudmtfZXh0X3ZlcnRleF9hdHRyaWJ1dGVfZGl2aXNvciwgJnBoeXNfZGV2X3Byb3BzLT52dHhfYXR0cmliX2Rpdmlzb3JfcHJvcHMpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0UHJvcGVydGllcyhncHUsIGRldl9leHQudmtfa2hyX2RlcHRoX3N0ZW5jaWxfcmVzb2x2ZSwgJnBoeXNfZGV2X3Byb3BzLT5kZXB0aF9zdGVuY2lsX3Jlc29sdmVfcHJvcHMpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0UHJvcGVydGllcyhncHUsIGRldl9leHQudmtfZXh0X3RyYW5zZm9ybV9mZWVkYmFjaywgJnBoeXNfZGV2X3Byb3BzLT50cmFuc2Zvcm1fZmVlZGJhY2tfcHJvcHMpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0UHJvcGVydGllcyhncHUsIGRldl9leHQudmtfbnZfcmF5X3RyYWNpbmcsICZwaHlzX2Rldl9wcm9wcy0+cmF5X3RyYWNpbmdfcHJvcHMpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0UHJvcGVydGllcyhncHUsIGRldl9leHQudmtfZXh0X3RleGVsX2J1ZmZlcl9hbGlnbm1lbnQsICZwaHlzX2Rldl9wcm9wcy0+dGV4ZWxfYnVmZmVyX2FsaWdubWVudF9wcm9wcyk7CisgICAgR2V0UGh5c2ljYWxEZXZpY2VFeHRQcm9wZXJ0aWVzKGdwdSwgZGV2X2V4dC52a19leHRfZnJhZ21lbnRfZGVuc2l0eV9tYXAsICZwaHlzX2Rldl9wcm9wcy0+ZnJhZ21lbnRfZGVuc2l0eV9tYXBfcHJvcHMpOworICAgIEdldFBoeXNpY2FsRGV2aWNlRXh0UHJvcGVydGllcyhncHUsIGRldl9leHQudmtfa2hyX3BlcmZvcm1hbmNlX3F1ZXJ5LCAmcGh5c19kZXZfcHJvcHMtPnBlcmZvcm1hbmNlX3F1ZXJ5X3Byb3BzKTsKKyAgICBHZXRQaHlzaWNhbERldmljZUV4dFByb3BlcnRpZXMoZ3B1LCBkZXZfZXh0LnZrX2tocl90aW1lbGluZV9zZW1hcGhvcmUsICZwaHlzX2Rldl9wcm9wcy0+dGltZWxpbmVfc2VtYXBob3JlX3Byb3BzKTsKKyAgICBpZiAoc3RhdGVfdHJhY2tlci0+ZGV2aWNlX2V4dGVuc2lvbnMudmtfbnZfY29vcGVyYXRpdmVfbWF0cml4KSB7CisgICAgICAgIC8vIEdldCB0aGUgbmVlZGVkIGNvb3BlcmF0aXZlX21hdHJpeCBwcm9wZXJ0aWVzCisgICAgICAgIGF1dG8gY29vcGVyYXRpdmVfbWF0cml4X3Byb3BzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVj4oKTsKKyAgICAgICAgYXV0byBwcm9wMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFI+KCZjb29wZXJhdGl2ZV9tYXRyaXhfcHJvcHMpOworICAgICAgICBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKGdwdSwgJnByb3AyKTsKKyAgICAgICAgc3RhdGVfdHJhY2tlci0+cGh5c19kZXZfZXh0X3Byb3BzLmNvb3BlcmF0aXZlX21hdHJpeF9wcm9wcyA9IGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wczsKKworICAgICAgICB1aW50MzJfdCBudW1Db29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXMgPSAwOworICAgICAgICBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WKGdwdSwgJm51bUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllcywgTlVMTCk7CisgICAgICAgIHN0YXRlX3RyYWNrZXItPmNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzLnJlc2l6ZShudW1Db29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdmxfaW5pdF9zdHJ1Y3Q8VmtDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVj4oKSk7CisKKyAgICAgICAgaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXNOVihncHUsICZudW1Db29wZXJhdGl2ZU1hdHJpeFByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdHJhY2tlci0+Y29vcGVyYXRpdmVfbWF0cml4X3Byb3BlcnRpZXMuZGF0YSgpKTsKKyAgICB9CisgICAgaWYgKHN0YXRlX3RyYWNrZXItPmFwaV92ZXJzaW9uID49IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICAvLyBHZXQgdGhlIG5lZWRlZCBzdWJncm91cCBsaW1pdHMKKyAgICAgICAgYXV0byBzdWJncm91cF9wcm9wID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM+KCk7CisgICAgICAgIGF1dG8gcHJvcDIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSPigmc3ViZ3JvdXBfcHJvcCk7CisgICAgICAgIGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoZ3B1LCAmcHJvcDIpOworCisgICAgICAgIHN0YXRlX3RyYWNrZXItPnBoeXNfZGV2X2V4dF9wcm9wcy5zdWJncm91cF9wcm9wcyA9IHN1Ymdyb3VwX3Byb3A7CisgICAgfQorCisgICAgLy8gU3RvcmUgcXVldWUgZmFtaWx5IGRhdGEKKyAgICBpZiAocENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zICE9IG51bGxwdHIpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5xdWV1ZUNyZWF0ZUluZm9Db3VudDsgKytpKSB7CisgICAgICAgICAgICBzdGF0ZV90cmFja2VyLT5xdWV1ZV9mYW1pbHlfaW5kZXhfbWFwLmluc2VydCgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucXVldWVGYW1pbHlJbmRleCwgcENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zW2ldLnF1ZXVlQ291bnQpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveURldmljZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGlmICghZGV2aWNlKSByZXR1cm47CisKKyAgICAvLyBSZXNldCBhbGwgY29tbWFuZCBidWZmZXJzIGJlZm9yZSBkZXN0cm95aW5nIHRoZW0sIHRvIHVubGluayBvYmplY3RfYmluZGluZ3MuCisgICAgZm9yIChhdXRvICZjb21tYW5kQnVmZmVyIDogY29tbWFuZEJ1ZmZlck1hcCkgeworICAgICAgICBSZXNldENvbW1hbmRCdWZmZXJTdGF0ZShjb21tYW5kQnVmZmVyLmZpcnN0KTsKKyAgICB9CisgICAgcGlwZWxpbmVNYXAuY2xlYXIoKTsKKyAgICByZW5kZXJQYXNzTWFwLmNsZWFyKCk7CisgICAgY29tbWFuZEJ1ZmZlck1hcC5jbGVhcigpOworCisgICAgLy8gVGhpcyB3aWxsIGFsc28gZGVsZXRlIGFsbCBzZXRzIGluIHRoZSBwb29sICYgcmVtb3ZlIHRoZW0gZnJvbSBzZXRNYXAKKyAgICBEZWxldGVEZXNjcmlwdG9yU2V0UG9vbHMoKTsKKyAgICAvLyBBbGwgc2V0cyBzaG91bGQgYmUgcmVtb3ZlZAorICAgIGFzc2VydChzZXRNYXAuZW1wdHkoKSk7CisgICAgZGVzY3JpcHRvclNldExheW91dE1hcC5jbGVhcigpOworICAgIGltYWdlVmlld01hcC5jbGVhcigpOworICAgIGltYWdlTWFwLmNsZWFyKCk7CisgICAgYnVmZmVyVmlld01hcC5jbGVhcigpOworICAgIGJ1ZmZlck1hcC5jbGVhcigpOworICAgIC8vIFF1ZXVlcyBwZXJzaXN0IHVudGlsIGRldmljZSBpcyBkZXN0cm95ZWQKKyAgICBxdWV1ZU1hcC5jbGVhcigpOworfQorCisvLyBMb29wIHRocm91Z2ggYm91bmQgb2JqZWN0cyBhbmQgaW5jcmVtZW50IHRoZWlyIGluX3VzZSBjb3VudHMuCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkluY3JlbWVudEJvdW5kT2JqZWN0cyhDTURfQlVGRkVSX1NUQVRFIGNvbnN0ICpjYl9ub2RlKSB7CisgICAgZm9yIChhdXRvIG9iaiA6IGNiX25vZGUtPm9iamVjdF9iaW5kaW5ncykgeworICAgICAgICBhdXRvIGJhc2Vfb2JqID0gR2V0U3RhdGVTdHJ1Y3RQdHJGcm9tT2JqZWN0KG9iaik7CisgICAgICAgIGlmIChiYXNlX29iaikgeworICAgICAgICAgICAgYmFzZV9vYmotPmluX3VzZS5mZXRjaF9hZGQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFRyYWNrIHdoaWNoIHJlc291cmNlcyBhcmUgaW4tZmxpZ2h0IGJ5IGF0b21pY2FsbHkgaW5jcmVtZW50aW5nIHRoZWlyICJpbl91c2UiIGNvdW50Cit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkluY3JlbWVudFJlc291cmNlcyhDTURfQlVGRkVSX1NUQVRFICpjYl9ub2RlKSB7CisgICAgY2Jfbm9kZS0+c3VibWl0Q291bnQrKzsKKyAgICBjYl9ub2RlLT5pbl91c2UuZmV0Y2hfYWRkKDEpOworCisgICAgLy8gRmlyc3QgSW5jcmVtZW50IGZvciBhbGwgImdlbmVyaWMiIG9iamVjdHMgYm91bmQgdG8gY21kIGJ1ZmZlciwgZm9sbG93ZWQgYnkgc3BlY2lhbC1jYXNlIG9iamVjdHMgYmVsb3cKKyAgICBJbmNyZW1lbnRCb3VuZE9iamVjdHMoY2Jfbm9kZSk7CisgICAgLy8gVE9ETyA6IFdlIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSB0aGUgTlVMTCBsb29rLXVwIGNoZWNrcyBmcm9tIHRoZSBjb2RlIGJlbG93IGFzIGxvbmcgYXMKKyAgICAvLyAgYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhc2VzIGFyZSB2ZXJpZmllZCB0byBjYXVzZSBDQl9JTlZBTElEIHN0YXRlIGFuZCB0aGUgQ0JfSU5WQUxJRCBzdGF0ZQorICAgIC8vICBzaG91bGQgdGhlbiBiZSBmbGFnZ2VkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICAgIGZvciAoYXV0byBldmVudCA6IGNiX25vZGUtPndyaXRlRXZlbnRzQmVmb3JlV2FpdCkgeworICAgICAgICBhdXRvIGV2ZW50X3N0YXRlID0gR2V0RXZlbnRTdGF0ZShldmVudCk7CisgICAgICAgIGlmIChldmVudF9zdGF0ZSkgZXZlbnRfc3RhdGUtPndyaXRlX2luX3VzZSsrOworICAgIH0KK30KKworLy8gRGVjcmVtZW50IGluLXVzZSBjb3VudCBmb3Igb2JqZWN0cyBib3VuZCB0byBjb21tYW5kIGJ1ZmZlcgordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpEZWNyZW1lbnRCb3VuZFJlc291cmNlcyhDTURfQlVGRkVSX1NUQVRFIGNvbnN0ICpjYl9ub2RlKSB7CisgICAgQkFTRV9OT0RFICpiYXNlX29iaiA9IG51bGxwdHI7CisgICAgZm9yIChhdXRvIG9iaiA6IGNiX25vZGUtPm9iamVjdF9iaW5kaW5ncykgeworICAgICAgICBiYXNlX29iaiA9IEdldFN0YXRlU3RydWN0UHRyRnJvbU9iamVjdChvYmopOworICAgICAgICBpZiAoYmFzZV9vYmopIHsKKyAgICAgICAgICAgIGJhc2Vfb2JqLT5pbl91c2UuZmV0Y2hfc3ViKDEpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJldGlyZVdvcmtPblF1ZXVlKFFVRVVFX1NUQVRFICpwUXVldWUsIHVpbnQ2NF90IHNlcSkgeworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa1F1ZXVlLCB1aW50NjRfdD4gb3RoZXJRdWV1ZVNlcXM7CisKKyAgICAvLyBSb2xsIHRoaXMgcXVldWUgZm9yd2FyZCwgb25lIHN1Ym1pc3Npb24gYXQgYSB0aW1lLgorICAgIHdoaWxlIChwUXVldWUtPnNlcSA8IHNlcSkgeworICAgICAgICBhdXRvICZzdWJtaXNzaW9uID0gcFF1ZXVlLT5zdWJtaXNzaW9ucy5mcm9udCgpOworCisgICAgICAgIGZvciAoYXV0byAmd2FpdCA6IHN1Ym1pc3Npb24ud2FpdFNlbWFwaG9yZXMpIHsKKyAgICAgICAgICAgIGF1dG8gcFNlbWFwaG9yZSA9IEdldFNlbWFwaG9yZVN0YXRlKHdhaXQuc2VtYXBob3JlKTsKKyAgICAgICAgICAgIGlmIChwU2VtYXBob3JlKSB7CisgICAgICAgICAgICAgICAgcFNlbWFwaG9yZS0+aW5fdXNlLmZldGNoX3N1YigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gJmxhc3RTZXEgPSBvdGhlclF1ZXVlU2Vxc1t3YWl0LnF1ZXVlXTsKKyAgICAgICAgICAgIGxhc3RTZXEgPSBzdGQ6Om1heChsYXN0U2VxLCB3YWl0LnNlcSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8gJnNlbWFwaG9yZSA6IHN1Ym1pc3Npb24uc2lnbmFsU2VtYXBob3JlcykgeworICAgICAgICAgICAgYXV0byBwU2VtYXBob3JlID0gR2V0U2VtYXBob3JlU3RhdGUoc2VtYXBob3JlKTsKKyAgICAgICAgICAgIGlmIChwU2VtYXBob3JlKSB7CisgICAgICAgICAgICAgICAgcFNlbWFwaG9yZS0+aW5fdXNlLmZldGNoX3N1YigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byAmc2VtYXBob3JlIDogc3VibWlzc2lvbi5leHRlcm5hbFNlbWFwaG9yZXMpIHsKKyAgICAgICAgICAgIGF1dG8gcFNlbWFwaG9yZSA9IEdldFNlbWFwaG9yZVN0YXRlKHNlbWFwaG9yZSk7CisgICAgICAgICAgICBpZiAocFNlbWFwaG9yZSkgeworICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPmluX3VzZS5mZXRjaF9zdWIoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8gY2IgOiBzdWJtaXNzaW9uLmNicykgeworICAgICAgICAgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShjYik7CisgICAgICAgICAgICBpZiAoIWNiX25vZGUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZpcnN0IHBlcmZvcm0gZGVjcmVtZW50IG9uIGdlbmVyYWwgY2FzZSBib3VuZCBvYmplY3RzCisgICAgICAgICAgICBEZWNyZW1lbnRCb3VuZFJlc291cmNlcyhjYl9ub2RlKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBldmVudCA6IGNiX25vZGUtPndyaXRlRXZlbnRzQmVmb3JlV2FpdCkgeworICAgICAgICAgICAgICAgIGF1dG8gZXZlbnROb2RlID0gZXZlbnRNYXAuZmluZChldmVudCk7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50Tm9kZSAhPSBldmVudE1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBldmVudE5vZGUtPnNlY29uZC53cml0ZV9pbl91c2UtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBRdWVyeU1hcCBsb2NhbFF1ZXJ5VG9TdGF0ZU1hcDsKKyAgICAgICAgICAgIGZvciAoYXV0byAmZnVuY3Rpb24gOiBjYl9ub2RlLT5xdWVyeVVwZGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbihudWxscHRyLCAvKmRvX3ZhbGlkYXRlKi8gZmFsc2UsICZsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoYXV0byBxdWVyeVN0YXRlUGFpciA6IGxvY2FsUXVlcnlUb1N0YXRlTWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5U3RhdGVQYWlyLnNlY29uZCA9PSBRVUVSWVNUQVRFX0VOREVEKSB7CisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9TdGF0ZU1hcFtxdWVyeVN0YXRlUGFpci5maXJzdF0gPSBRVUVSWVNUQVRFX0FWQUlMQUJMRTsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBRVUVSWV9QT09MX1NUQVRFICpxcF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5U3RhdGVQYWlyLmZpcnN0LnBvb2wpOworICAgICAgICAgICAgICAgICAgICBpZiAocXBfc3RhdGUtPmNyZWF0ZUluZm8ucXVlcnlUeXBlID09IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSKQorICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXNzVG9TdGF0ZU1hcFtRdWVyeU9iamVjdFBhc3MocXVlcnlTdGF0ZVBhaXIuZmlyc3QsIHN1Ym1pc3Npb24ucGVyZl9zdWJtaXRfcGFzcyldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWVNUQVRFX0FWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYl9ub2RlLT5pbl91c2UuZmV0Y2hfc3ViKDEpOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBwRmVuY2UgPSBHZXRGZW5jZVN0YXRlKHN1Ym1pc3Npb24uZmVuY2UpOworICAgICAgICBpZiAocEZlbmNlICYmIHBGZW5jZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsKSB7CisgICAgICAgICAgICBwRmVuY2UtPnN0YXRlID0gRkVOQ0VfUkVUSVJFRDsKKyAgICAgICAgfQorCisgICAgICAgIHBRdWV1ZS0+c3VibWlzc2lvbnMucG9wX2Zyb250KCk7CisgICAgICAgIHBRdWV1ZS0+c2VxKys7CisgICAgfQorCisgICAgLy8gUm9sbCBvdGhlciBxdWV1ZXMgZm9yd2FyZCB0byB0aGUgaGlnaGVzdCBzZXEgd2Ugc2F3IGEgd2FpdCBmb3IKKyAgICBmb3IgKGF1dG8gcXMgOiBvdGhlclF1ZXVlU2VxcykgeworICAgICAgICBSZXRpcmVXb3JrT25RdWV1ZShHZXRRdWV1ZVN0YXRlKHFzLmZpcnN0KSwgcXMuc2Vjb25kKTsKKyAgICB9Cit9CisKKy8vIFN1Ym1pdCBhIGZlbmNlIHRvIGEgcXVldWUsIGRlbGltaXRpbmcgcHJldmlvdXMgZmVuY2VzIGFuZCBwcmV2aW91cyB1bnRyYWNrZWQKKy8vIHdvcmsgYnkgaXQuCitzdGF0aWMgdm9pZCBTdWJtaXRGZW5jZShRVUVVRV9TVEFURSAqcFF1ZXVlLCBGRU5DRV9TVEFURSAqcEZlbmNlLCB1aW50NjRfdCBzdWJtaXRDb3VudCkgeworICAgIHBGZW5jZS0+c3RhdGUgPSBGRU5DRV9JTkZMSUdIVDsKKyAgICBwRmVuY2UtPnNpZ25hbGVyLmZpcnN0ID0gcFF1ZXVlLT5xdWV1ZTsKKyAgICBwRmVuY2UtPnNpZ25hbGVyLnNlY29uZCA9IHBRdWV1ZS0+c2VxICsgcFF1ZXVlLT5zdWJtaXNzaW9ucy5zaXplKCkgKyBzdWJtaXRDb3VudDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZFF1ZXVlU3VibWl0KFZrUXVldWUgcXVldWUsIHVpbnQzMl90IHN1Ym1pdENvdW50LCBjb25zdCBWa1N1Ym1pdEluZm8gKnBTdWJtaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmVuY2UgZmVuY2UsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIHVpbnQ2NF90IGVhcmx5X3JldGlyZV9zZXEgPSAwOworICAgIGF1dG8gcFF1ZXVlID0gR2V0UXVldWVTdGF0ZShxdWV1ZSk7CisgICAgYXV0byBwRmVuY2UgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKworICAgIGlmIChwRmVuY2UpIHsKKyAgICAgICAgaWYgKHBGZW5jZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsKSB7CisgICAgICAgICAgICAvLyBNYXJrIGZlbmNlIGluIHVzZQorICAgICAgICAgICAgU3VibWl0RmVuY2UocFF1ZXVlLCBwRmVuY2UsIHN0ZDo6bWF4KDF1LCBzdWJtaXRDb3VudCkpOworICAgICAgICAgICAgaWYgKCFzdWJtaXRDb3VudCkgeworICAgICAgICAgICAgICAgIC8vIElmIG5vIHN1Ym1pc3Npb25zLCBidXQganVzdCBkcm9wcGluZyBhIGZlbmNlIG9uIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLAorICAgICAgICAgICAgICAgIC8vIHJlY29yZCBhbiBlbXB0eSBzdWJtaXNzaW9uIHdpdGgganVzdCB0aGUgZmVuY2UsIHNvIHdlIGNhbiBkZXRlcm1pbmUKKyAgICAgICAgICAgICAgICAvLyBpdHMgY29tcGxldGlvbi4KKyAgICAgICAgICAgICAgICBwUXVldWUtPnN1Ym1pc3Npb25zLmVtcGxhY2VfYmFjayhzdGQ6OnZlY3RvcjxWa0NvbW1hbmRCdWZmZXI+KCksIHN0ZDo6dmVjdG9yPFNFTUFQSE9SRV9XQUlUPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZrU2VtYXBob3JlPigpLCBzdGQ6OnZlY3RvcjxWa1NlbWFwaG9yZT4oKSwgZmVuY2UsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmV0aXJlIHdvcmsgdXAgdW50aWwgdGhpcyBmZW5jZSBlYXJseSwgd2Ugd2lsbCBub3Qgc2VlIHRoZSB3YWl0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBzaWduYWwKKyAgICAgICAgICAgIGVhcmx5X3JldGlyZV9zZXEgPSBwUXVldWUtPnNlcSArIHBRdWV1ZS0+c3VibWlzc2lvbnMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm93IHByb2Nlc3MgZWFjaCBpbmRpdmlkdWFsIHN1Ym1pdAorICAgIGZvciAodWludDMyX3Qgc3VibWl0X2lkeCA9IDA7IHN1Ym1pdF9pZHggPCBzdWJtaXRDb3VudDsgc3VibWl0X2lkeCsrKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFZrQ29tbWFuZEJ1ZmZlcj4gY2JzOworICAgICAgICBjb25zdCBWa1N1Ym1pdEluZm8gKnN1Ym1pdCA9ICZwU3VibWl0c1tzdWJtaXRfaWR4XTsKKyAgICAgICAgdmVjdG9yPFNFTUFQSE9SRV9XQUlUPiBzZW1hcGhvcmVfd2FpdHM7CisgICAgICAgIHZlY3RvcjxWa1NlbWFwaG9yZT4gc2VtYXBob3JlX3NpZ25hbHM7CisgICAgICAgIHZlY3RvcjxWa1NlbWFwaG9yZT4gc2VtYXBob3JlX2V4dGVybmFsczsKKyAgICAgICAgYXV0byAqdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdCA9IGx2bF9maW5kX2luX2NoYWluPFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSPihzdWJtaXQtPnBOZXh0KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1Ym1pdC0+d2FpdFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSA9IHN1Ym1pdC0+cFdhaXRTZW1hcGhvcmVzW2ldOworICAgICAgICAgICAgYXV0byBwU2VtYXBob3JlID0gR2V0U2VtYXBob3JlU3RhdGUoc2VtYXBob3JlKTsKKyAgICAgICAgICAgIGlmIChwU2VtYXBob3JlKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUtPnNjb3BlID09IGtTeW5jU2NvcGVJbnRlcm5hbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocFNlbWFwaG9yZS0+c2lnbmFsZXIuZmlyc3QgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZV93YWl0cy5wdXNoX2JhY2soe3NlbWFwaG9yZSwgcFNlbWFwaG9yZS0+c2lnbmFsZXIuZmlyc3QsIHBTZW1hcGhvcmUtPnNpZ25hbGVyLnNlY29uZH0pOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZS0+aW5fdXNlLmZldGNoX2FkZCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLT5zaWduYWxlci5maXJzdCA9IFZLX05VTExfSEFORExFOworICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLT5zaWduYWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZV9leHRlcm5hbHMucHVzaF9iYWNrKHNlbWFwaG9yZSk7CisgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPmluX3VzZS5mZXRjaF9hZGQoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwU2VtYXBob3JlLT5zY29wZSA9PSBrU3luY1Njb3BlRXh0ZXJuYWxUZW1wb3JhcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPnNjb3BlID0ga1N5bmNTY29wZUludGVybmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJtaXQtPnNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSA9IHN1Ym1pdC0+cFNpZ25hbFNlbWFwaG9yZXNbaV07CisgICAgICAgICAgICBhdXRvIHBTZW1hcGhvcmUgPSBHZXRTZW1hcGhvcmVTdGF0ZShzZW1hcGhvcmUpOworICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUpIHsKKyAgICAgICAgICAgICAgICBpZiAocFNlbWFwaG9yZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwU2VtYXBob3JlLT50eXBlID09IFZLX1NFTUFQSE9SRV9UWVBFX0JJTkFSWV9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPnNpZ25hbGVyLmZpcnN0ID0gcXVldWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLT5zaWduYWxlci5zZWNvbmQgPSBwUXVldWUtPnNlcSArIHBRdWV1ZS0+c3VibWlzc2lvbnMuc2l6ZSgpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPnNpZ25hbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPnBheWxvYWQgPSB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0LT5wU2lnbmFsU2VtYXBob3JlVmFsdWVzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPmluX3VzZS5mZXRjaF9hZGQoMSk7CisgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZV9zaWduYWxzLnB1c2hfYmFjayhzZW1hcGhvcmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJldGlyZSB3b3JrIHVwIHVudGlsIHRoaXMgc3VibWl0IGVhcmx5LCB3ZSB3aWxsIG5vdCBzZWUgdGhlIHdhaXQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICBlYXJseV9yZXRpcmVfc2VxID0gc3RkOjptYXgoZWFybHlfcmV0aXJlX3NlcSwgcFF1ZXVlLT5zZXEgKyBwUXVldWUtPnN1Ym1pc3Npb25zLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VibWl0LT5jb21tYW5kQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgYXV0byBjYl9ub2RlID0gR2V0Q0JTdGF0ZShzdWJtaXQtPnBDb21tYW5kQnVmZmVyc1tpXSk7CisgICAgICAgICAgICBpZiAoY2Jfbm9kZSkgeworICAgICAgICAgICAgICAgIGNicy5wdXNoX2JhY2soc3VibWl0LT5wQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBzZWNvbmRhcnlDbWRCdWZmZXIgOiBjYl9ub2RlLT5saW5rZWRDb21tYW5kQnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBjYnMucHVzaF9iYWNrKHNlY29uZGFyeUNtZEJ1ZmZlci0+Y29tbWFuZEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudFJlc291cmNlcyhzZWNvbmRhcnlDbWRCdWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJbmNyZW1lbnRSZXNvdXJjZXMoY2Jfbm9kZSk7CisKKyAgICAgICAgICAgICAgICBRdWVyeU1hcCBsb2NhbFF1ZXJ5VG9TdGF0ZU1hcDsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gJmZ1bmN0aW9uIDogY2Jfbm9kZS0+cXVlcnlVcGRhdGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG51bGxwdHIsIC8qZG9fdmFsaWRhdGUqLyBmYWxzZSwgJmxvY2FsUXVlcnlUb1N0YXRlTWFwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gcXVlcnlTdGF0ZVBhaXIgOiBsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCkgeworICAgICAgICAgICAgICAgICAgICBxdWVyeVRvU3RhdGVNYXBbcXVlcnlTdGF0ZVBhaXIuZmlyc3RdID0gcXVlcnlTdGF0ZVBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEV2ZW50VG9TdGFnZU1hcCBsb2NhbEV2ZW50VG9TdGFnZU1hcDsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gJmZ1bmN0aW9uIDogY2Jfbm9kZS0+ZXZlbnRVcGRhdGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG51bGxwdHIsIC8qZG9fdmFsaWRhdGUqLyBmYWxzZSwgJmxvY2FsRXZlbnRUb1N0YWdlTWFwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gZXZlbnRTdGFnZVBhaXIgOiBsb2NhbEV2ZW50VG9TdGFnZU1hcCkgeworICAgICAgICAgICAgICAgICAgICBldmVudE1hcFtldmVudFN0YWdlUGFpci5maXJzdF0uc3RhZ2VNYXNrID0gZXZlbnRTdGFnZVBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8gcGVyZl9zdWJtaXQgPSBsdmxfZmluZF9pbl9jaGFpbjxWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSPihzdWJtaXQtPnBOZXh0KTsKKworICAgICAgICBwUXVldWUtPnN1Ym1pc3Npb25zLmVtcGxhY2VfYmFjayhjYnMsIHNlbWFwaG9yZV93YWl0cywgc2VtYXBob3JlX3NpZ25hbHMsIHNlbWFwaG9yZV9leHRlcm5hbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdF9pZHggPT0gc3VibWl0Q291bnQgLSAxID8gZmVuY2UgOiAoVmtGZW5jZSlWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZl9zdWJtaXQgPyBwZXJmX3N1Ym1pdC0+Y291bnRlclBhc3NJbmRleCA6IDApOworICAgIH0KKworICAgIGlmIChlYXJseV9yZXRpcmVfc2VxKSB7CisgICAgICAgIFJldGlyZVdvcmtPblF1ZXVlKHBRdWV1ZSwgZWFybHlfcmV0aXJlX3NlcSk7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQWxsb2NhdGVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRGV2aWNlTWVtb3J5ICpwTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICBBZGRNZW1PYmpJbmZvKGRldmljZSwgKnBNZW1vcnksIHBBbGxvY2F0ZUluZm8pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZEZyZWVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW0sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGlmICghbWVtKSByZXR1cm47CisgICAgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW0pOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QobWVtLCBrVnVsa2FuT2JqZWN0VHlwZURldmljZU1lbW9yeSk7CisKKyAgICAvLyBDbGVhciBtZW0gYmluZGluZyBmb3IgYW55IGJvdW5kIG9iamVjdHMKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm9iaiA6IG1lbV9pbmZvLT5vYmpfYmluZGluZ3MpIHsKKyAgICAgICAgQklOREFCTEUgKmJpbmRhYmxlX3N0YXRlID0gbnVsbHB0cjsKKyAgICAgICAgc3dpdGNoIChvYmoudHlwZSkgeworICAgICAgICAgICAgY2FzZSBrVnVsa2FuT2JqZWN0VHlwZUltYWdlOgorICAgICAgICAgICAgICAgIGJpbmRhYmxlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShvYmouQ2FzdDxWa0ltYWdlPigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1Z1bGthbk9iamVjdFR5cGVCdWZmZXI6CisgICAgICAgICAgICAgICAgYmluZGFibGVfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShvYmouQ2FzdDxWa0J1ZmZlcj4oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY6CisgICAgICAgICAgICAgICAgYmluZGFibGVfc3RhdGUgPSBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShvYmouQ2FzdDxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgb25seSBoYXZlIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUsIGJ1ZmZlciwgb3IgaW1hZ2Ugb2JqZWN0cyBib3VuZCB0byBtZW1vcnkKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmluZGFibGVfc3RhdGUpIHsKKyAgICAgICAgICAgIGJpbmRhYmxlX3N0YXRlLT5iaW5kaW5nLm1lbSA9IE1FTU9SWV9VTkJPVU5EOworICAgICAgICAgICAgYmluZGFibGVfc3RhdGUtPlVwZGF0ZUJvdW5kTWVtb3J5U2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQW55IGJvdW5kIGNtZCBidWZmZXJzIGFyZSBub3cgaW52YWxpZAorICAgIEludmFsaWRhdGVDb21tYW5kQnVmZmVycyhtZW1faW5mby0+Y2JfYmluZGluZ3MsIG9ial9zdHJ1Y3QpOworICAgIFJlbW92ZUFsaWFzaW5nSW1hZ2VzKG1lbV9pbmZvLT5ib3VuZF9pbWFnZXMpOworICAgIG1lbV9pbmZvLT5kZXN0cm95ZWQgPSB0cnVlOworICAgIG1lbU9iak1hcC5lcmFzZShtZW0pOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkUXVldWVCaW5kU3BhcnNlKFZrUXVldWUgcXVldWUsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsIGNvbnN0IFZrQmluZFNwYXJzZUluZm8gKnBCaW5kSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGZW5jZSBmZW5jZSwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47CisgICAgdWludDY0X3QgZWFybHlfcmV0aXJlX3NlcSA9IDA7CisgICAgYXV0byBwRmVuY2UgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKyAgICBhdXRvIHBRdWV1ZSA9IEdldFF1ZXVlU3RhdGUocXVldWUpOworCisgICAgaWYgKHBGZW5jZSkgeworICAgICAgICBpZiAocEZlbmNlLT5zY29wZSA9PSBrU3luY1Njb3BlSW50ZXJuYWwpIHsKKyAgICAgICAgICAgIFN1Ym1pdEZlbmNlKHBRdWV1ZSwgcEZlbmNlLCBzdGQ6Om1heCgxdSwgYmluZEluZm9Db3VudCkpOworICAgICAgICAgICAgaWYgKCFiaW5kSW5mb0NvdW50KSB7CisgICAgICAgICAgICAgICAgLy8gTm8gd29yayB0byBkbywganVzdCBkcm9wcGluZyBhIGZlbmNlIGluIHRoZSBxdWV1ZSBieSBpdHNlbGYuCisgICAgICAgICAgICAgICAgcFF1ZXVlLT5zdWJtaXNzaW9ucy5lbXBsYWNlX2JhY2soc3RkOjp2ZWN0b3I8VmtDb21tYW5kQnVmZmVyPigpLCBzdGQ6OnZlY3RvcjxTRU1BUEhPUkVfV0FJVD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWa1NlbWFwaG9yZT4oKSwgc3RkOjp2ZWN0b3I8VmtTZW1hcGhvcmU+KCksIGZlbmNlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJldGlyZSB3b3JrIHVwIHVudGlsIHRoaXMgZmVuY2UgZWFybHksIHdlIHdpbGwgbm90IHNlZSB0aGUgd2FpdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgc2lnbmFsCisgICAgICAgICAgICBlYXJseV9yZXRpcmVfc2VxID0gcFF1ZXVlLT5zZXEgKyBwUXVldWUtPnN1Ym1pc3Npb25zLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgYmluZElkeCA9IDA7IGJpbmRJZHggPCBiaW5kSW5mb0NvdW50OyArK2JpbmRJZHgpIHsKKyAgICAgICAgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyAmYmluZEluZm8gPSBwQmluZEluZm9bYmluZElkeF07CisgICAgICAgIC8vIFRyYWNrIG9iamVjdHMgdGllZCB0byBtZW1vcnkKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGJpbmRJbmZvLmJ1ZmZlckJpbmRDb3VudDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgYmluZEluZm8ucEJ1ZmZlckJpbmRzW2pdLmJpbmRDb3VudDsgaysrKSB7CisgICAgICAgICAgICAgICAgYXV0byBzcGFyc2VfYmluZGluZyA9IGJpbmRJbmZvLnBCdWZmZXJCaW5kc1tqXS5wQmluZHNba107CisgICAgICAgICAgICAgICAgU2V0U3BhcnNlTWVtQmluZGluZyh7c3BhcnNlX2JpbmRpbmcubWVtb3J5LCBzcGFyc2VfYmluZGluZy5tZW1vcnlPZmZzZXQsIHNwYXJzZV9iaW5kaW5nLnNpemV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVnVsa2FuVHlwZWRIYW5kbGUoYmluZEluZm8ucEJ1ZmZlckJpbmRzW2pdLmJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgYmluZEluZm8uaW1hZ2VPcGFxdWVCaW5kQ291bnQ7IGorKykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBrID0gMDsgayA8IGJpbmRJbmZvLnBJbWFnZU9wYXF1ZUJpbmRzW2pdLmJpbmRDb3VudDsgaysrKSB7CisgICAgICAgICAgICAgICAgYXV0byBzcGFyc2VfYmluZGluZyA9IGJpbmRJbmZvLnBJbWFnZU9wYXF1ZUJpbmRzW2pdLnBCaW5kc1trXTsKKyAgICAgICAgICAgICAgICBTZXRTcGFyc2VNZW1CaW5kaW5nKHtzcGFyc2VfYmluZGluZy5tZW1vcnksIHNwYXJzZV9iaW5kaW5nLm1lbW9yeU9mZnNldCwgc3BhcnNlX2JpbmRpbmcuc2l6ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShiaW5kSW5mby5wSW1hZ2VPcGFxdWVCaW5kc1tqXS5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBiaW5kSW5mby5pbWFnZUJpbmRDb3VudDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgYmluZEluZm8ucEltYWdlQmluZHNbal0uYmluZENvdW50OyBrKyspIHsKKyAgICAgICAgICAgICAgICBhdXRvIHNwYXJzZV9iaW5kaW5nID0gYmluZEluZm8ucEltYWdlQmluZHNbal0ucEJpbmRzW2tdOworICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2l6ZSBpcyBicm9rZW4gZm9yIG5vbi1vcGFxdWUgYmluZGluZ3MsIG5lZWQgdG8gdXBkYXRlIHRvIGNvbXByZWhlbmQgZnVsbCBzcGFyc2UgYmluZGluZyBkYXRhCisgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHNpemUgPSBzcGFyc2VfYmluZGluZy5leHRlbnQuZGVwdGggKiBzcGFyc2VfYmluZGluZy5leHRlbnQuaGVpZ2h0ICogc3BhcnNlX2JpbmRpbmcuZXh0ZW50LndpZHRoICogNDsKKyAgICAgICAgICAgICAgICBTZXRTcGFyc2VNZW1CaW5kaW5nKHtzcGFyc2VfYmluZGluZy5tZW1vcnksIHNwYXJzZV9iaW5kaW5nLm1lbW9yeU9mZnNldCwgc2l6ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShiaW5kSW5mby5wSW1hZ2VCaW5kc1tqXS5pbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8U0VNQVBIT1JFX1dBSVQ+IHNlbWFwaG9yZV93YWl0czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VmtTZW1hcGhvcmU+IHNlbWFwaG9yZV9zaWduYWxzOworICAgICAgICBzdGQ6OnZlY3RvcjxWa1NlbWFwaG9yZT4gc2VtYXBob3JlX2V4dGVybmFsczsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvLndhaXRTZW1hcGhvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmUgPSBiaW5kSW5mby5wV2FpdFNlbWFwaG9yZXNbaV07CisgICAgICAgICAgICBhdXRvIHBTZW1hcGhvcmUgPSBHZXRTZW1hcGhvcmVTdGF0ZShzZW1hcGhvcmUpOworICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUpIHsKKyAgICAgICAgICAgICAgICBpZiAocFNlbWFwaG9yZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwU2VtYXBob3JlLT5zaWduYWxlci5maXJzdCAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlX3dhaXRzLnB1c2hfYmFjayh7c2VtYXBob3JlLCBwU2VtYXBob3JlLT5zaWduYWxlci5maXJzdCwgcFNlbWFwaG9yZS0+c2lnbmFsZXIuc2Vjb25kfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLT5pbl91c2UuZmV0Y2hfYWRkKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPnNpZ25hbGVyLmZpcnN0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICAgICAgICAgIHBTZW1hcGhvcmUtPnNpZ25hbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlX2V4dGVybmFscy5wdXNoX2JhY2soc2VtYXBob3JlKTsKKyAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZS0+aW5fdXNlLmZldGNoX2FkZCgxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUtPnNjb3BlID09IGtTeW5jU2NvcGVFeHRlcm5hbFRlbXBvcmFyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZS0+c2NvcGUgPSBrU3luY1Njb3BlSW50ZXJuYWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSA9IGJpbmRJbmZvLnBTaWduYWxTZW1hcGhvcmVzW2ldOworICAgICAgICAgICAgYXV0byBwU2VtYXBob3JlID0gR2V0U2VtYXBob3JlU3RhdGUoc2VtYXBob3JlKTsKKyAgICAgICAgICAgIGlmIChwU2VtYXBob3JlKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTZW1hcGhvcmUtPnNjb3BlID09IGtTeW5jU2NvcGVJbnRlcm5hbCkgeworICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLT5zaWduYWxlci5maXJzdCA9IHF1ZXVlOworICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLT5zaWduYWxlci5zZWNvbmQgPSBwUXVldWUtPnNlcSArIHBRdWV1ZS0+c3VibWlzc2lvbnMuc2l6ZSgpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgcFNlbWFwaG9yZS0+c2lnbmFsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlLT5pbl91c2UuZmV0Y2hfYWRkKDEpOworICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmVfc2lnbmFscy5wdXNoX2JhY2soc2VtYXBob3JlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXRpcmUgd29yayB1cCB1bnRpbCB0aGlzIHN1Ym1pdCBlYXJseSwgd2Ugd2lsbCBub3Qgc2VlIHRoZSB3YWl0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgZWFybHlfcmV0aXJlX3NlcSA9IHN0ZDo6bWF4KGVhcmx5X3JldGlyZV9zZXEsIHBRdWV1ZS0+c2VxICsgcFF1ZXVlLT5zdWJtaXNzaW9ucy5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwUXVldWUtPnN1Ym1pc3Npb25zLmVtcGxhY2VfYmFjayhzdGQ6OnZlY3RvcjxWa0NvbW1hbmRCdWZmZXI+KCksIHNlbWFwaG9yZV93YWl0cywgc2VtYXBob3JlX3NpZ25hbHMsIHNlbWFwaG9yZV9leHRlcm5hbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJZHggPT0gYmluZEluZm9Db3VudCAtIDEgPyBmZW5jZSA6IChWa0ZlbmNlKVZLX05VTExfSEFORExFLCAwKTsKKyAgICB9CisKKyAgICBpZiAoZWFybHlfcmV0aXJlX3NlcSkgeworICAgICAgICBSZXRpcmVXb3JrT25RdWV1ZShwUXVldWUsIGVhcmx5X3JldGlyZV9zZXEpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVNlbWFwaG9yZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTZW1hcGhvcmUgKnBTZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIGF1dG8gc2VtYXBob3JlX3N0YXRlID0gc3RkOjptYWtlX3NoYXJlZDxTRU1BUEhPUkVfU1RBVEU+KCk7CisgICAgc2VtYXBob3JlX3N0YXRlLT5zaWduYWxlci5maXJzdCA9IFZLX05VTExfSEFORExFOworICAgIHNlbWFwaG9yZV9zdGF0ZS0+c2lnbmFsZXIuc2Vjb25kID0gMDsKKyAgICBzZW1hcGhvcmVfc3RhdGUtPnNpZ25hbGVkID0gZmFsc2U7CisgICAgc2VtYXBob3JlX3N0YXRlLT5zY29wZSA9IGtTeW5jU2NvcGVJbnRlcm5hbDsKKyAgICBzZW1hcGhvcmVfc3RhdGUtPnR5cGUgPSBWS19TRU1BUEhPUkVfVFlQRV9CSU5BUllfS0hSOworICAgIHNlbWFwaG9yZV9zdGF0ZS0+cGF5bG9hZCA9IDA7CisgICAgYXV0byBzZW1hcGhvcmVfdHlwZV9jcmVhdGVfaW5mbyA9IGx2bF9maW5kX2luX2NoYWluPFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgaWYgKHNlbWFwaG9yZV90eXBlX2NyZWF0ZV9pbmZvKSB7CisgICAgICAgIHNlbWFwaG9yZV9zdGF0ZS0+dHlwZSA9IHNlbWFwaG9yZV90eXBlX2NyZWF0ZV9pbmZvLT5zZW1hcGhvcmVUeXBlOworICAgICAgICBzZW1hcGhvcmVfc3RhdGUtPnBheWxvYWQgPSBzZW1hcGhvcmVfdHlwZV9jcmVhdGVfaW5mby0+aW5pdGlhbFZhbHVlOworICAgIH0KKyAgICBzZW1hcGhvcmVNYXBbKnBTZW1hcGhvcmVdID0gc3RkOjptb3ZlKHNlbWFwaG9yZV9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkSW1wb3J0U2VtYXBob3JlU3RhdGUoVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzS0hSIGhhbmRsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NlbWFwaG9yZUltcG9ydEZsYWdzS0hSIGZsYWdzKSB7CisgICAgU0VNQVBIT1JFX1NUQVRFICpzZW1hX25vZGUgPSBHZXRTZW1hcGhvcmVTdGF0ZShzZW1hcGhvcmUpOworICAgIGlmIChzZW1hX25vZGUgJiYgc2VtYV9ub2RlLT5zY29wZSAhPSBrU3luY1Njb3BlRXh0ZXJuYWxQZXJtYW5lbnQpIHsKKyAgICAgICAgaWYgKChoYW5kbGVfdHlwZSA9PSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfU1lOQ19GRF9CSVRfS0hSIHx8IGZsYWdzICYgVktfU0VNQVBIT1JFX0lNUE9SVF9URU1QT1JBUllfQklUX0tIUikgJiYKKyAgICAgICAgICAgIHNlbWFfbm9kZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsKSB7CisgICAgICAgICAgICBzZW1hX25vZGUtPnNjb3BlID0ga1N5bmNTY29wZUV4dGVybmFsVGVtcG9yYXJ5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VtYV9ub2RlLT5zY29wZSA9IGtTeW5jU2NvcGVFeHRlcm5hbFBlcm1hbmVudDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZFNpZ25hbFNlbWFwaG9yZUtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlU2lnbmFsSW5mb0tIUiAqcFNpZ25hbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGF1dG8gKnBTZW1hcGhvcmUgPSBHZXRTZW1hcGhvcmVTdGF0ZShwU2lnbmFsSW5mby0+c2VtYXBob3JlKTsKKyAgICBwU2VtYXBob3JlLT5wYXlsb2FkID0gcFNpZ25hbEluZm8tPnZhbHVlOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZE1hcHBlZE1lbW9yeShWa0RldmljZU1lbW9yeSBtZW0sIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCB2b2lkICoqcHBEYXRhKSB7CisgICAgYXV0byBtZW1faW5mbyA9IEdldERldk1lbVN0YXRlKG1lbSk7CisgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgIG1lbV9pbmZvLT5tYXBwZWRfcmFuZ2Uub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtZW1faW5mby0+bWFwcGVkX3JhbmdlLnNpemUgPSBzaXplOworICAgICAgICBtZW1faW5mby0+cF9kcml2ZXJfZGF0YSA9ICpwcERhdGE7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJldGlyZUZlbmNlKFZrRmVuY2UgZmVuY2UpIHsKKyAgICBhdXRvIHBGZW5jZSA9IEdldEZlbmNlU3RhdGUoZmVuY2UpOworICAgIGlmIChwRmVuY2UgJiYgcEZlbmNlLT5zY29wZSA9PSBrU3luY1Njb3BlSW50ZXJuYWwpIHsKKyAgICAgICAgaWYgKHBGZW5jZS0+c2lnbmFsZXIuZmlyc3QgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIC8vIEZlbmNlIHNpZ25hbGxlciBpcyBhIHF1ZXVlIC0tIHVzZSB0aGlzIGFzIHByb29mIHRoYXQgcHJpb3Igb3BlcmF0aW9ucyBvbiB0aGF0IHF1ZXVlIGhhdmUgY29tcGxldGVkLgorICAgICAgICAgICAgUmV0aXJlV29ya09uUXVldWUoR2V0UXVldWVTdGF0ZShwRmVuY2UtPnNpZ25hbGVyLmZpcnN0KSwgcEZlbmNlLT5zaWduYWxlci5zZWNvbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRmVuY2Ugc2lnbmFsbGVyIGlzIHRoZSBXU0kuIFdlJ3JlIG5vdCB0cmFja2luZyB3aGF0IHRoZSBXU0kgb3AgYWN0dWFsbHkgL3dhcy8gaW4gQ1YgeWV0LCBidXQgd2UgbmVlZCB0byBtYXJrCisgICAgICAgICAgICAvLyB0aGUgZmVuY2UgYXMgcmV0aXJlZC4KKyAgICAgICAgICAgIHBGZW5jZS0+c3RhdGUgPSBGRU5DRV9SRVRJUkVEOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkV2FpdEZvckZlbmNlcyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGZlbmNlQ291bnQsIGNvbnN0IFZrRmVuY2UgKnBGZW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Jvb2wzMiB3YWl0QWxsLCB1aW50NjRfdCB0aW1lb3V0LCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKworICAgIC8vIFdoZW4gd2Uga25vdyB0aGF0IGFsbCBmZW5jZXMgYXJlIGNvbXBsZXRlIHdlIGNhbiBjbGVhbi9yZW1vdmUgdGhlaXIgQ0JzCisgICAgaWYgKChWS19UUlVFID09IHdhaXRBbGwpIHx8ICgxID09IGZlbmNlQ291bnQpKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmZW5jZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFJldGlyZUZlbmNlKHBGZW5jZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIC8vIE5PVEUgOiBBbHRlcm5hdGUgY2FzZSBub3QgaGFuZGxlZCBoZXJlIGlzIHdoZW4gc29tZSBmZW5jZXMgaGF2ZSBjb21wbGV0ZWQuIEluCisgICAgLy8gIHRoaXMgY2FzZSBmb3IgYXBwIHRvIGd1YXJhbnRlZSB3aGljaCBmZW5jZXMgY29tcGxldGVkIGl0IHdpbGwgaGF2ZSB0byBjYWxsCisgICAgLy8gIHZrR2V0RmVuY2VTdGF0dXMoKSBhdCB3aGljaCBwb2ludCB3ZSdsbCBjbGVhbi9yZW1vdmUgdGhlaXIgQ0JzIGlmIGNvbXBsZXRlLgorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0RmVuY2VTdGF0dXMoVmtEZXZpY2UgZGV2aWNlLCBWa0ZlbmNlIGZlbmNlLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBSZXRpcmVGZW5jZShmZW5jZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkR2V0RGV2aWNlUXVldWVTdGF0ZSh1aW50MzJfdCBxdWV1ZV9mYW1pbHlfaW5kZXgsIFZrUXVldWUgcXVldWUpIHsKKyAgICAvLyBBZGQgcXVldWUgdG8gdHJhY2tpbmcgc2V0IG9ubHkgaWYgaXQgaXMgbmV3CisgICAgYXV0byBxdWV1ZV9pc19uZXcgPSBxdWV1ZXMuZW1wbGFjZShxdWV1ZSk7CisgICAgaWYgKHF1ZXVlX2lzX25ldy5zZWNvbmQgPT0gdHJ1ZSkgeworICAgICAgICBRVUVVRV9TVEFURSAqcXVldWVfc3RhdGUgPSAmcXVldWVNYXBbcXVldWVdOworICAgICAgICBxdWV1ZV9zdGF0ZS0+cXVldWUgPSBxdWV1ZTsKKyAgICAgICAgcXVldWVfc3RhdGUtPnF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZV9mYW1pbHlfaW5kZXg7CisgICAgICAgIHF1ZXVlX3N0YXRlLT5zZXEgPSAwOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgdWludDMyX3QgcXVldWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlICpwUXVldWUpIHsKKyAgICBSZWNvcmRHZXREZXZpY2VRdWV1ZVN0YXRlKHF1ZXVlRmFtaWx5SW5kZXgsICpwUXVldWUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXZpY2VRdWV1ZUluZm8yICpwUXVldWVJbmZvLCBWa1F1ZXVlICpwUXVldWUpIHsKKyAgICBSZWNvcmRHZXREZXZpY2VRdWV1ZVN0YXRlKHBRdWV1ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXgsICpwUXVldWUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkUXVldWVXYWl0SWRsZShWa1F1ZXVlIHF1ZXVlLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBRVUVVRV9TVEFURSAqcXVldWVfc3RhdGUgPSBHZXRRdWV1ZVN0YXRlKHF1ZXVlKTsKKyAgICBSZXRpcmVXb3JrT25RdWV1ZShxdWV1ZV9zdGF0ZSwgcXVldWVfc3RhdGUtPnNlcSArIHF1ZXVlX3N0YXRlLT5zdWJtaXNzaW9ucy5zaXplKCkpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkRGV2aWNlV2FpdElkbGUoVmtEZXZpY2UgZGV2aWNlLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBmb3IgKGF1dG8gJnF1ZXVlIDogcXVldWVNYXApIHsKKyAgICAgICAgUmV0aXJlV29ya09uUXVldWUoJnF1ZXVlLnNlY29uZCwgcXVldWUuc2Vjb25kLnNlcSArIHF1ZXVlLnNlY29uZC5zdWJtaXNzaW9ucy5zaXplKCkpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveUZlbmNlKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFmZW5jZSkgcmV0dXJuOworICAgIGF1dG8gZmVuY2Vfc3RhdGUgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKyAgICBmZW5jZV9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBmZW5jZU1hcC5lcmFzZShmZW5jZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTZW1hcGhvcmUoVmtEZXZpY2UgZGV2aWNlLCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGlmICghc2VtYXBob3JlKSByZXR1cm47CisgICAgYXV0byBzZW1hcGhvcmVfc3RhdGUgPSBHZXRTZW1hcGhvcmVTdGF0ZShzZW1hcGhvcmUpOworICAgIHNlbWFwaG9yZV9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBzZW1hcGhvcmVNYXAuZXJhc2Uoc2VtYXBob3JlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveUV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFldmVudCkgcmV0dXJuOworICAgIEVWRU5UX1NUQVRFICpldmVudF9zdGF0ZSA9IEdldEV2ZW50U3RhdGUoZXZlbnQpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QoZXZlbnQsIGtWdWxrYW5PYmplY3RUeXBlRXZlbnQpOworICAgIEludmFsaWRhdGVDb21tYW5kQnVmZmVycyhldmVudF9zdGF0ZS0+Y2JfYmluZGluZ3MsIG9ial9zdHJ1Y3QpOworICAgIGV2ZW50TWFwLmVyYXNlKGV2ZW50KTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveVF1ZXJ5UG9vbChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFxdWVyeVBvb2wpIHJldHVybjsKKyAgICBRVUVSWV9QT09MX1NUQVRFICpxcF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5UG9vbCk7CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChxdWVyeVBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sKTsKKyAgICBJbnZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnMocXBfc3RhdGUtPmNiX2JpbmRpbmdzLCBvYmpfc3RydWN0KTsKKyAgICBxcF9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBxdWVyeVBvb2xNYXAuZXJhc2UocXVlcnlQb29sKTsKK30KKworLy8gT2JqZWN0IHdpdGggZ2l2ZW4gaGFuZGxlIGlzIGJlaW5nIGJvdW5kIHRvIG1lbW9yeSB3LyBnaXZlbiBtZW1faW5mbyBzdHJ1Y3QuCisvLyAgVHJhY2sgdGhlIG5ld2x5IGJvdW5kIG1lbW9yeSByYW5nZSB3aXRoIGdpdmVuIG1lbW9yeU9mZnNldAorLy8gIEFsc28gc2NhbiBhbnkgcHJldmlvdXMgcmFuZ2VzLCB0cmFjayBhbGlhc2VkIHJhbmdlcyB3aXRoIG5ldyByYW5nZSwgYW5kIGZsYWcgYW4gZXJyb3IgaWYgYSBsaW5lYXIKKy8vICBhbmQgbm9uLWxpbmVhciByYW5nZSBpbmNvcnJlY3RseSBvdmVybGFwLgorLy8gUmV0dXJuIHRydWUgaWYgYW4gZXJyb3IgaXMgZmxhZ2dlZCBhbmQgdGhlIHVzZXIgY2FsbGJhY2sgcmV0dXJucyAidHJ1ZSIsIG90aGVyd2lzZSBmYWxzZQorLy8gaXNfaW1hZ2UgaW5kaWNhdGVzIGFuIGltYWdlIG9iamVjdCwgb3RoZXJ3aXNlIGhhbmRsZSBpcyBmb3IgYSBidWZmZXIKKy8vIGlzX2xpbmVhciBpbmRpY2F0ZXMgYSBidWZmZXIgb3IgbGluZWFyIGltYWdlCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6Okluc2VydE1lbW9yeVJhbmdlKGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlICZ0eXBlZF9oYW5kbGUsIERFVklDRV9NRU1PUllfU1RBVEUgKm1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0LCBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1SZXF1aXJlbWVudHMsIGJvb2wgaXNfbGluZWFyKSB7CisgICAgaWYgKHR5cGVkX2hhbmRsZS50eXBlID09IGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UpIHsKKyAgICAgICAgbWVtX2luZm8tPmJvdW5kX2ltYWdlcy5pbnNlcnQodHlwZWRfaGFuZGxlLkNhc3Q8VmtJbWFnZT4oKSk7CisgICAgfSBlbHNlIGlmICh0eXBlZF9oYW5kbGUudHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcikgeworICAgICAgICBtZW1faW5mby0+Ym91bmRfYnVmZmVycy5pbnNlcnQodHlwZWRfaGFuZGxlLmhhbmRsZSk7CisgICAgfSBlbHNlIGlmICh0eXBlZF9oYW5kbGUudHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKSB7CisgICAgICAgIG1lbV9pbmZvLT5ib3VuZF9hY2NlbGVyYXRpb25fc3RydWN0dXJlcy5pbnNlcnQodHlwZWRfaGFuZGxlLmhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGUKKyAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6SW5zZXJ0SW1hZ2VNZW1vcnlSYW5nZShWa0ltYWdlIGltYWdlLCBERVZJQ0VfTUVNT1JZX1NUQVRFICptZW1faW5mbywgVmtEZXZpY2VTaXplIG1lbV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXMsIGJvb2wgaXNfbGluZWFyKSB7CisgICAgSW5zZXJ0TWVtb3J5UmFuZ2UoVnVsa2FuVHlwZWRIYW5kbGUoaW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UpLCBtZW1faW5mbywgbWVtX29mZnNldCwgbWVtX3JlcXMsIGlzX2xpbmVhcik7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6SW5zZXJ0QnVmZmVyTWVtb3J5UmFuZ2UoVmtCdWZmZXIgYnVmZmVyLCBERVZJQ0VfTUVNT1JZX1NUQVRFICptZW1faW5mbywgVmtEZXZpY2VTaXplIG1lbV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzICZtZW1fcmVxcykgeworICAgIEluc2VydE1lbW9yeVJhbmdlKFZ1bGthblR5cGVkSGFuZGxlKGJ1ZmZlciwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIpLCBtZW1faW5mbywgbWVtX29mZnNldCwgbWVtX3JlcXMsIHRydWUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6Okluc2VydEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJhbmdlKFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYXMsIERFVklDRV9NRU1PUllfU1RBVEUgKm1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgbWVtX29mZnNldCwgY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMgJm1lbV9yZXFzKSB7CisgICAgSW5zZXJ0TWVtb3J5UmFuZ2UoVnVsa2FuVHlwZWRIYW5kbGUoYXMsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpLCBtZW1faW5mbywgbWVtX29mZnNldCwgbWVtX3JlcXMsIHRydWUpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVtb3ZlIHRoZSBoYW5kbGUtdG8taW5kZXggbWFwcGluZyBmcm9tIHRoZSBhcHByb3ByaWF0ZSBtYXAuCitzdGF0aWMgdm9pZCBSZW1vdmVNZW1vcnlSYW5nZShjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmdHlwZWRfaGFuZGxlLCBERVZJQ0VfTUVNT1JZX1NUQVRFICptZW1faW5mbykgeworICAgIGlmICh0eXBlZF9oYW5kbGUudHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZUltYWdlKSB7CisgICAgICAgIG1lbV9pbmZvLT5ib3VuZF9pbWFnZXMuZXJhc2UodHlwZWRfaGFuZGxlLkNhc3Q8VmtJbWFnZT4oKSk7CisgICAgfSBlbHNlIGlmICh0eXBlZF9oYW5kbGUudHlwZSA9PSBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcikgeworICAgICAgICBtZW1faW5mby0+Ym91bmRfYnVmZmVycy5lcmFzZSh0eXBlZF9oYW5kbGUuaGFuZGxlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGVkX2hhbmRsZS50eXBlID09IGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpIHsKKyAgICAgICAgbWVtX2luZm8tPmJvdW5kX2FjY2VsZXJhdGlvbl9zdHJ1Y3R1cmVzLmVyYXNlKHR5cGVkX2hhbmRsZS5oYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVuc3VwcG9ydGVkIG9iamVjdCB0eXBlCisgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlbW92ZUJ1ZmZlck1lbW9yeVJhbmdlKFZrQnVmZmVyIGJ1ZmZlciwgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8pIHsKKyAgICBSZW1vdmVNZW1vcnlSYW5nZShWdWxrYW5UeXBlZEhhbmRsZShidWZmZXIsIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyKSwgbWVtX2luZm8pOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlbW92ZUltYWdlTWVtb3J5UmFuZ2UoVmtJbWFnZSBpbWFnZSwgREVWSUNFX01FTU9SWV9TVEFURSAqbWVtX2luZm8pIHsKKyAgICBSZW1vdmVNZW1vcnlSYW5nZShWdWxrYW5UeXBlZEhhbmRsZShpbWFnZSwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSksIG1lbV9pbmZvKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZW1vdmVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSYW5nZShWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFzLCBERVZJQ0VfTUVNT1JZX1NUQVRFICptZW1faW5mbykgeworICAgIFJlbW92ZU1lbW9yeVJhbmdlKFZ1bGthblR5cGVkSGFuZGxlKGFzLCBrVnVsa2FuT2JqZWN0VHlwZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKSwgbWVtX2luZm8pOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlVwZGF0ZUJpbmRCdWZmZXJNZW1vcnlTdGF0ZShWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCkgeworICAgIEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyX3N0YXRlKSB7CisgICAgICAgIC8vIFRyYWNrIGJvdW5kIG1lbW9yeSByYW5nZSBpbmZvcm1hdGlvbgorICAgICAgICBhdXRvIG1lbV9pbmZvID0gR2V0RGV2TWVtU3RhdGUobWVtKTsKKyAgICAgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgICAgICBJbnNlcnRCdWZmZXJNZW1vcnlSYW5nZShidWZmZXIsIG1lbV9pbmZvLCBtZW1vcnlPZmZzZXQsIGJ1ZmZlcl9zdGF0ZS0+cmVxdWlyZW1lbnRzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUcmFjayBvYmplY3RzIHRpZWQgdG8gbWVtb3J5CisgICAgICAgIFNldE1lbUJpbmRpbmcobWVtLCBidWZmZXJfc3RhdGUsIG1lbW9yeU9mZnNldCwgVnVsa2FuVHlwZWRIYW5kbGUoYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUJ1ZmZlcikpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlTWVtb3J5IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFVwZGF0ZUJpbmRCdWZmZXJNZW1vcnlTdGF0ZShidWZmZXIsIG1lbSwgbWVtb3J5T2Zmc2V0KTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvS0hSICpwQmluZEluZm9zLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIFVwZGF0ZUJpbmRCdWZmZXJNZW1vcnlTdGF0ZShwQmluZEluZm9zW2ldLmJ1ZmZlciwgcEJpbmRJbmZvc1tpXS5tZW1vcnksIHBCaW5kSW5mb3NbaV0ubWVtb3J5T2Zmc2V0KTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRCaW5kQnVmZmVyTWVtb3J5MktIUihWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGJpbmRJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mb0tIUiAqcEJpbmRJbmZvcywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvQ291bnQ7IGkrKykgeworICAgICAgICBVcGRhdGVCaW5kQnVmZmVyTWVtb3J5U3RhdGUocEJpbmRJbmZvc1tpXS5idWZmZXIsIHBCaW5kSW5mb3NbaV0ubWVtb3J5LCBwQmluZEluZm9zW2ldLm1lbW9yeU9mZnNldCk7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c1N0YXRlKFZrQnVmZmVyIGJ1ZmZlciwgVmtNZW1vcnlSZXF1aXJlbWVudHMgKnBNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgaWYgKGJ1ZmZlcl9zdGF0ZSkgeworICAgICAgICBidWZmZXJfc3RhdGUtPnJlcXVpcmVtZW50cyA9ICpwTWVtb3J5UmVxdWlyZW1lbnRzOworICAgICAgICBidWZmZXJfc3RhdGUtPm1lbW9yeV9yZXF1aXJlbWVudHNfY2hlY2tlZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKFZrRGV2aWNlIGRldmljZSwgVmtCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyAqcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c1N0YXRlKGJ1ZmZlciwgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJLSFIgKnBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSICpwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzU3RhdGUocEluZm8tPmJ1ZmZlciwgJnBNZW1vcnlSZXF1aXJlbWVudHMtPm1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJLSFIgKnBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSICpwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzU3RhdGUocEluZm8tPmJ1ZmZlciwgJnBNZW1vcnlSZXF1aXJlbWVudHMtPm1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aWVtZW50c1N0YXRlKFZrSW1hZ2UgaW1hZ2UsIFZrTWVtb3J5UmVxdWlyZW1lbnRzICpwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShpbWFnZSk7CisgICAgaWYgKGltYWdlX3N0YXRlKSB7CisgICAgICAgIGltYWdlX3N0YXRlLT5yZXF1aXJlbWVudHMgPSAqcE1lbW9yeVJlcXVpcmVtZW50czsKKyAgICAgICAgaW1hZ2Vfc3RhdGUtPm1lbW9yeV9yZXF1aXJlbWVudHNfY2hlY2tlZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzICpwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aWVtZW50c1N0YXRlKGltYWdlLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiAqcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMiAqcE1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWllbWVudHNTdGF0ZShwSW5mby0+aW1hZ2UsICZwTWVtb3J5UmVxdWlyZW1lbnRzLT5tZW1vcnlSZXF1aXJlbWVudHMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyICpwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aWVtZW50c1N0YXRlKHBJbmZvLT5pbWFnZSwgJnBNZW1vcnlSZXF1aXJlbWVudHMtPm1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK3N0YXRpYyB2b2lkIFJlY29yZEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzU3RhdGUoSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzICpzcGFyc2VfaW1hZ2VfbWVtb3J5X3JlcXVpcmVtZW50cykgeworICAgIGltYWdlX3N0YXRlLT5zcGFyc2VfcmVxdWlyZW1lbnRzLmVtcGxhY2VfYmFjaygqc3BhcnNlX2ltYWdlX21lbW9yeV9yZXF1aXJlbWVudHMpOworICAgIGlmIChzcGFyc2VfaW1hZ2VfbWVtb3J5X3JlcXVpcmVtZW50cy0+Zm9ybWF0UHJvcGVydGllcy5hc3BlY3RNYXNrICYgVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVCkgeworICAgICAgICBpbWFnZV9zdGF0ZS0+c3BhcnNlX21ldGFkYXRhX3JlcXVpcmVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIHVpbnQzMl90ICpwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzICpwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgYXV0byBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworICAgIGltYWdlX3N0YXRlLT5nZXRfc3BhcnNlX3JlcXNfY2FsbGVkID0gdHJ1ZTsKKyAgICBpZiAoIXBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpIHJldHVybjsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50OyBpKyspIHsKKyAgICAgICAgUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNTdGF0ZShpbWFnZV9zdGF0ZSwgJnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNbaV0pOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMigKKyAgICBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiAqcEluZm8sIHVpbnQzMl90ICpwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiAqcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIGF1dG8gaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHBJbmZvLT5pbWFnZSk7CisgICAgaW1hZ2Vfc3RhdGUtPmdldF9zcGFyc2VfcmVxc19jYWxsZWQgPSB0cnVlOworICAgIGlmICghcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgcmV0dXJuOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQ7IGkrKykgeworICAgICAgICBhc3NlcnQoIXBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNbaV0ucE5leHQpOyAgLy8gVE9ETzogSWYgYW4gZXh0ZW5zaW9uIGlzIGV2ZXIgYWRkZWQgaGVyZSB3ZSBuZWVkIHRvIGhhbmRsZSBpdAorICAgICAgICBSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c1N0YXRlKGltYWdlX3N0YXRlLCAmcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c1tpXS5tZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUigKKyAgICBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiAqcEluZm8sIHVpbnQzMl90ICpwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiAqcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgeworICAgIGF1dG8gaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKHBJbmZvLT5pbWFnZSk7CisgICAgaW1hZ2Vfc3RhdGUtPmdldF9zcGFyc2VfcmVxc19jYWxsZWQgPSB0cnVlOworICAgIGlmICghcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykgcmV0dXJuOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQ7IGkrKykgeworICAgICAgICBhc3NlcnQoIXBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHNbaV0ucE5leHQpOyAgLy8gVE9ETzogSWYgYW4gZXh0ZW5zaW9uIGlzIGV2ZXIgYWRkZWQgaGVyZSB3ZSBuZWVkIHRvIGhhbmRsZSBpdAorICAgICAgICBSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c1N0YXRlKGltYWdlX3N0YXRlLCAmcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50c1tpXS5tZW1vcnlSZXF1aXJlbWVudHMpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIFZrU2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFzaGFkZXJNb2R1bGUpIHJldHVybjsKKyAgICBhdXRvIHNoYWRlcl9tb2R1bGVfc3RhdGUgPSBHZXRTaGFkZXJNb2R1bGVTdGF0ZShzaGFkZXJNb2R1bGUpOworICAgIHNoYWRlcl9tb2R1bGVfc3RhdGUtPmRlc3Ryb3llZCA9IHRydWU7CisgICAgc2hhZGVyTW9kdWxlTWFwLmVyYXNlKHNoYWRlck1vZHVsZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmUgcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFwaXBlbGluZSkgcmV0dXJuOworICAgIFBJUEVMSU5FX1NUQVRFICpwaXBlbGluZV9zdGF0ZSA9IEdldFBpcGVsaW5lU3RhdGUocGlwZWxpbmUpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QocGlwZWxpbmUsIGtWdWxrYW5PYmplY3RUeXBlUGlwZWxpbmUpOworICAgIC8vIEFueSBib3VuZCBjbWQgYnVmZmVycyBhcmUgbm93IGludmFsaWQKKyAgICBJbnZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnMocGlwZWxpbmVfc3RhdGUtPmNiX2JpbmRpbmdzLCBvYmpfc3RydWN0KTsKKyAgICBwaXBlbGluZV9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBwaXBlbGluZU1hcC5lcmFzZShwaXBlbGluZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFwaXBlbGluZUxheW91dCkgcmV0dXJuOworICAgIGF1dG8gcGlwZWxpbmVfbGF5b3V0X3N0YXRlID0gR2V0UGlwZWxpbmVMYXlvdXQocGlwZWxpbmVMYXlvdXQpOworICAgIHBpcGVsaW5lX2xheW91dF9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBwaXBlbGluZUxheW91dE1hcC5lcmFzZShwaXBlbGluZUxheW91dCk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyKFZrRGV2aWNlIGRldmljZSwgVmtTYW1wbGVyIHNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBpZiAoIXNhbXBsZXIpIHJldHVybjsKKyAgICBTQU1QTEVSX1NUQVRFICpzYW1wbGVyX3N0YXRlID0gR2V0U2FtcGxlclN0YXRlKHNhbXBsZXIpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3Qoc2FtcGxlciwga1Z1bGthbk9iamVjdFR5cGVTYW1wbGVyKTsKKyAgICAvLyBBbnkgYm91bmQgY21kIGJ1ZmZlcnMgYXJlIG5vdyBpbnZhbGlkCisgICAgaWYgKHNhbXBsZXJfc3RhdGUpIHsKKyAgICAgICAgSW52YWxpZGF0ZUNvbW1hbmRCdWZmZXJzKHNhbXBsZXJfc3RhdGUtPmNiX2JpbmRpbmdzLCBvYmpfc3RydWN0KTsKKyAgICB9CisgICAgc2FtcGxlcl9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBzYW1wbGVyTWFwLmVyYXNlKHNhbXBsZXIpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclNldExheW91dChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldExheW91dCBkZXNjcmlwdG9yU2V0TGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFkZXNjcmlwdG9yU2V0TGF5b3V0KSByZXR1cm47CisgICAgYXV0byBsYXlvdXRfaXQgPSBkZXNjcmlwdG9yU2V0TGF5b3V0TWFwLmZpbmQoZGVzY3JpcHRvclNldExheW91dCk7CisgICAgaWYgKGxheW91dF9pdCAhPSBkZXNjcmlwdG9yU2V0TGF5b3V0TWFwLmVuZCgpKSB7CisgICAgICAgIGxheW91dF9pdC0+c2Vjb25kLmdldCgpLT5kZXN0cm95ZWQgPSB0cnVlOworICAgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0TWFwLmVyYXNlKGxheW91dF9pdCk7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGlmICghZGVzY3JpcHRvclBvb2wpIHJldHVybjsKKyAgICBERVNDUklQVE9SX1BPT0xfU1RBVEUgKmRlc2NfcG9vbF9zdGF0ZSA9IEdldERlc2NyaXB0b3JQb29sU3RhdGUoZGVzY3JpcHRvclBvb2wpOworICAgIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlIG9ial9zdHJ1Y3QoZGVzY3JpcHRvclBvb2wsIGtWdWxrYW5PYmplY3RUeXBlRGVzY3JpcHRvclBvb2wpOworICAgIGlmIChkZXNjX3Bvb2xfc3RhdGUpIHsKKyAgICAgICAgLy8gQW55IGJvdW5kIGNtZCBidWZmZXJzIGFyZSBub3cgaW52YWxpZAorICAgICAgICBJbnZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnMoZGVzY19wb29sX3N0YXRlLT5jYl9iaW5kaW5ncywgb2JqX3N0cnVjdCk7CisgICAgICAgIC8vIEZyZWUgc2V0cyB0aGF0IHdlcmUgaW4gdGhpcyBwb29sCisgICAgICAgIGZvciAoYXV0byBkcyA6IGRlc2NfcG9vbF9zdGF0ZS0+c2V0cykgeworICAgICAgICAgICAgRnJlZURlc2NyaXB0b3JTZXQoZHMpOworICAgICAgICB9CisgICAgICAgIGRlc2NfcG9vbF9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICAgICAgZGVzY3JpcHRvclBvb2xNYXAuZXJhc2UoZGVzY3JpcHRvclBvb2wpOworICAgIH0KK30KKworLy8gRnJlZSBhbGwgY29tbWFuZCBidWZmZXJzIGluIGdpdmVuIGxpc3QsIHJlbW92aW5nIGFsbCByZWZlcmVuY2VzL2xpbmtzIHRvIHRoZW0gdXNpbmcgUmVzZXRDb21tYW5kQnVmZmVyU3RhdGUKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6RnJlZUNvbW1hbmRCdWZmZXJTdGF0ZXMoQ09NTUFORF9QT09MX1NUQVRFICpwb29sX3N0YXRlLCBjb25zdCB1aW50MzJfdCBjb21tYW5kX2J1ZmZlcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyICpjb21tYW5kX2J1ZmZlcnMpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29tbWFuZF9idWZmZXJfY291bnQ7IGkrKykgeworICAgICAgICBhdXRvIGNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kX2J1ZmZlcnNbaV0pOworICAgICAgICAvLyBSZW1vdmUgcmVmZXJlbmNlcyB0byBjb21tYW5kIGJ1ZmZlcidzIHN0YXRlIGFuZCBkZWxldGUKKyAgICAgICAgaWYgKGNiX3N0YXRlKSB7CisgICAgICAgICAgICAvLyByZXNldCBwcmlvciB0byBkZWxldGUsIHJlbW92aW5nIHZhcmlvdXMgcmVmZXJlbmNlcyB0byBpdC4KKyAgICAgICAgICAgIC8vIFRPRE86IGZpeCB0aGlzLCBpdCdzIGluc2FuZS4KKyAgICAgICAgICAgIFJlc2V0Q29tbWFuZEJ1ZmZlclN0YXRlKGNiX3N0YXRlLT5jb21tYW5kQnVmZmVyKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgY2Jfc3RhdGUncyByZWZlcmVuY2VzIGZyb20gQ09NTUFORF9QT09MX1NUQVRFcworICAgICAgICAgICAgcG9vbF9zdGF0ZS0+Y29tbWFuZEJ1ZmZlcnMuZXJhc2UoY29tbWFuZF9idWZmZXJzW2ldKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgY2IgZGVidWcgbGFiZWxzCisgICAgICAgICAgICBFcmFzZUNtZERlYnVnVXRpbHNMYWJlbChyZXBvcnRfZGF0YSwgY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXIpOworICAgICAgICAgICAgLy8gUmVtb3ZlIENCU3RhdGUgZnJvbSBDQiBtYXAKKyAgICAgICAgICAgIGNiX3N0YXRlLT5kZXN0cm95ZWQgPSB0cnVlOworICAgICAgICAgICAgY29tbWFuZEJ1ZmZlck1hcC5lcmFzZShjYl9zdGF0ZS0+Y29tbWFuZEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZEZyZWVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LCBjb25zdCBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgeworICAgIGF1dG8gcFBvb2wgPSBHZXRDb21tYW5kUG9vbFN0YXRlKGNvbW1hbmRQb29sKTsKKyAgICBGcmVlQ29tbWFuZEJ1ZmZlclN0YXRlcyhwUG9vbCwgY29tbWFuZEJ1ZmZlckNvdW50LCBwQ29tbWFuZEJ1ZmZlcnMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlQ29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0NvbW1hbmRQb29sICpwQ29tbWFuZFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgYXV0byBjbWRfcG9vbF9zdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q09NTUFORF9QT09MX1NUQVRFPigpOworICAgIGNtZF9wb29sX3N0YXRlLT5jcmVhdGVGbGFncyA9IHBDcmVhdGVJbmZvLT5mbGFnczsKKyAgICBjbWRfcG9vbF9zdGF0ZS0+cXVldWVGYW1pbHlJbmRleCA9IHBDcmVhdGVJbmZvLT5xdWV1ZUZhbWlseUluZGV4OworICAgIGNvbW1hbmRQb29sTWFwWypwQ29tbWFuZFBvb2xdID0gc3RkOjptb3ZlKGNtZF9wb29sX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVF1ZXJ5UG9vbChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtRdWVyeVBvb2wgKnBRdWVyeVBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIGF1dG8gcXVlcnlfcG9vbF9zdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UVVFUllfUE9PTF9TVEFURT4oKTsKKyAgICBxdWVyeV9wb29sX3N0YXRlLT5jcmVhdGVJbmZvID0gKnBDcmVhdGVJbmZvOworICAgIHF1ZXJ5X3Bvb2xfc3RhdGUtPnBvb2wgPSAqcFF1ZXJ5UG9vbDsKKyAgICBpZiAocENyZWF0ZUluZm8tPnF1ZXJ5VHlwZSA9PSBWS19RVUVSWV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX0tIUikgeworICAgICAgICBjb25zdCBhdXRvICpwZXJmID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFI+KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgICAgIGNvbnN0IFFVRVVFX0ZBTUlMWV9QRVJGX0NPVU5URVJTICZjb3VudGVycyA9ICpwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnBlcmZfY291bnRlcnNbcGVyZi0+cXVldWVGYW1pbHlJbmRleF07CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBlcmYtPmNvdW50ZXJJbmRleENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJmNvdW50ZXIgPSBjb3VudGVycy5jb3VudGVyc1twZXJmLT5wQ291bnRlckluZGljZXNbaV1dOworICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyLnNjb3BlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWS19RVUVSWV9TQ09QRV9DT01NQU5EX0JVRkZFUl9LSFI6CisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X3Bvb2xfc3RhdGUtPmhhc19wZXJmX3Njb3BlX2NvbW1hbmRfYnVmZmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFI6CisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X3Bvb2xfc3RhdGUtPmhhc19wZXJmX3Njb3BlX3JlbmRlcl9wYXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+cGh5c19kZXZpY2UsIHBlcmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXJ5X3Bvb2xfc3RhdGUtPm5fcGVyZm9ybWFuY2VfcGFzc2VzKTsKKyAgICB9CisKKyAgICBxdWVyeVBvb2xNYXBbKnBRdWVyeVBvb2xdID0gc3RkOjptb3ZlKHF1ZXJ5X3Bvb2xfc3RhdGUpOworCisgICAgUXVlcnlPYmplY3QgcXVlcnlfb2JqeypwUXVlcnlQb29sLCAwdX07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5xdWVyeUNvdW50OyArK2kpIHsKKyAgICAgICAgcXVlcnlfb2JqLnF1ZXJ5ID0gaTsKKyAgICAgICAgcXVlcnlUb1N0YXRlTWFwW3F1ZXJ5X29ial0gPSBRVUVSWVNUQVRFX1VOS05PV047CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmREZXN0cm95Q29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGlmICghY29tbWFuZFBvb2wpIHJldHVybjsKKyAgICBDT01NQU5EX1BPT0xfU1RBVEUgKmNwX3N0YXRlID0gR2V0Q29tbWFuZFBvb2xTdGF0ZShjb21tYW5kUG9vbCk7CisgICAgLy8gUmVtb3ZlIGNtZHBvb2wgZnJvbSBjbWRwb29sbWFwLCBhZnRlciBmcmVlaW5nIGxheWVyIGRhdGEgZm9yIHRoZSBjb21tYW5kIGJ1ZmZlcnMKKyAgICAvLyAiV2hlbiBhIHBvb2wgaXMgZGVzdHJveWVkLCBhbGwgY29tbWFuZCBidWZmZXJzIGFsbG9jYXRlZCBmcm9tIHRoZSBwb29sIGFyZSBmcmVlZC4iCisgICAgaWYgKGNwX3N0YXRlKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIHZlY3RvciwgYXMgRnJlZUNvbW1hbmRCdWZmZXJTdGF0ZXMgZGVsZXRlcyBmcm9tIGNwX3N0YXRlLT5jb21tYW5kQnVmZmVycyBkdXJpbmcgaXRlcmF0aW9uLgorICAgICAgICBzdGQ6OnZlY3RvcjxWa0NvbW1hbmRCdWZmZXI+IGNiX3ZlY3tjcF9zdGF0ZS0+Y29tbWFuZEJ1ZmZlcnMuYmVnaW4oKSwgY3Bfc3RhdGUtPmNvbW1hbmRCdWZmZXJzLmVuZCgpfTsKKyAgICAgICAgRnJlZUNvbW1hbmRCdWZmZXJTdGF0ZXMoY3Bfc3RhdGUsIHN0YXRpY19jYXN0PHVpbnQzMl90PihjYl92ZWMuc2l6ZSgpKSwgY2JfdmVjLmRhdGEoKSk7CisgICAgICAgIGNwX3N0YXRlLT5kZXN0cm95ZWQgPSB0cnVlOworICAgICAgICBjb21tYW5kUG9vbE1hcC5lcmFzZShjb21tYW5kUG9vbCk7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkUmVzZXRDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyBmbGFncywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgLy8gUmVzZXQgYWxsIG9mIHRoZSBDQnMgYWxsb2NhdGVkIGZyb20gdGhpcyBwb29sCisgICAgYXV0byBjb21tYW5kX3Bvb2xfc3RhdGUgPSBHZXRDb21tYW5kUG9vbFN0YXRlKGNvbW1hbmRQb29sKTsKKyAgICBmb3IgKGF1dG8gY21kQnVmZmVyIDogY29tbWFuZF9wb29sX3N0YXRlLT5jb21tYW5kQnVmZmVycykgeworICAgICAgICBSZXNldENvbW1hbmRCdWZmZXJTdGF0ZShjbWRCdWZmZXIpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZFJlc2V0RmVuY2VzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZmVuY2VDb3VudCwgY29uc3QgVmtGZW5jZSAqcEZlbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZmVuY2VDb3VudDsgKytpKSB7CisgICAgICAgIGF1dG8gcEZlbmNlID0gR2V0RmVuY2VTdGF0ZShwRmVuY2VzW2ldKTsKKyAgICAgICAgaWYgKHBGZW5jZSkgeworICAgICAgICAgICAgaWYgKHBGZW5jZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsKSB7CisgICAgICAgICAgICAgICAgcEZlbmNlLT5zdGF0ZSA9IEZFTkNFX1VOU0lHTkFMRUQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBGZW5jZS0+c2NvcGUgPT0ga1N5bmNTY29wZUV4dGVybmFsVGVtcG9yYXJ5KSB7CisgICAgICAgICAgICAgICAgcEZlbmNlLT5zY29wZSA9IGtTeW5jU2NvcGVJbnRlcm5hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gRm9yIGdpdmVuIGNiX25vZGVzLCBpbnZhbGlkYXRlIHRoZW0gYW5kIHRyYWNrIG9iamVjdCBjYXVzaW5nIGludmFsaWRhdGlvbi4KKy8vIEludmFsaWRhdGVDb21tYW5kQnVmZmVycyBhbmQgSW52YWxpZGF0ZUxpbmtlZENvbW1hbmRCdWZmZXJzIGFyZSBlc3NlbnRpYWxseQorLy8gdGhlIHNhbWUsIGV4Y2VwdCBvbmUgdGFrZXMgYSBtYXAgYW5kIG9uZSB0YWtlcyBhIHNldCwgYW5kIEludmFsaWRhdGVDb21tYW5kQnVmZmVycworLy8gY2FuIGFsc28gdW5saW5rIG9iamVjdHMgZnJvbSBjb21tYW5kIGJ1ZmZlcnMuCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkludmFsaWRhdGVDb21tYW5kQnVmZmVycyhzbWFsbF91bm9yZGVyZWRfbWFwPENNRF9CVUZGRVJfU1RBVEUgKiwgaW50LCA4PiAmY2Jfbm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSAmb2JqLCBib29sIHVubGluaykgeworICAgIGZvciAoY29uc3QgYXV0byAmY2Jfbm9kZV9wYWlyIDogY2Jfbm9kZXMpIHsKKyAgICAgICAgYXV0byAmY2Jfbm9kZSA9IGNiX25vZGVfcGFpci5maXJzdDsKKyAgICAgICAgaWYgKGNiX25vZGUtPnN0YXRlID09IENCX1JFQ09SRElORykgeworICAgICAgICAgICAgY2Jfbm9kZS0+c3RhdGUgPSBDQl9JTlZBTElEX0lOQ09NUExFVEU7CisgICAgICAgIH0gZWxzZSBpZiAoY2Jfbm9kZS0+c3RhdGUgPT0gQ0JfUkVDT1JERUQpIHsKKyAgICAgICAgICAgIGNiX25vZGUtPnN0YXRlID0gQ0JfSU5WQUxJRF9DT01QTEVURTsKKyAgICAgICAgfQorICAgICAgICBjYl9ub2RlLT5icm9rZW5fYmluZGluZ3MucHVzaF9iYWNrKG9iaik7CisKKyAgICAgICAgLy8gaWYgc2Vjb25kYXJ5LCB0aGVuIHByb3BhZ2F0ZSB0aGUgaW52YWxpZGF0aW9uIHRvIHRoZSBwcmltYXJpZXMgdGhhdCB3aWxsIGNhbGwgdXMuCisgICAgICAgIGlmIChjYl9ub2RlLT5jcmVhdGVJbmZvLmxldmVsID09IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSkgeworICAgICAgICAgICAgSW52YWxpZGF0ZUxpbmtlZENvbW1hbmRCdWZmZXJzKGNiX25vZGUtPmxpbmtlZENvbW1hbmRCdWZmZXJzLCBvYmopOworICAgICAgICB9CisgICAgICAgIGlmICh1bmxpbmspIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGNiX25vZGVfcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBhc3NlcnQoY2Jfbm9kZS0+b2JqZWN0X2JpbmRpbmdzW2luZGV4XSA9PSBvYmopOworICAgICAgICAgICAgY2Jfbm9kZS0+b2JqZWN0X2JpbmRpbmdzW2luZGV4XSA9IFZ1bGthblR5cGVkSGFuZGxlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHVubGluaykgeworICAgICAgICBjYl9ub2Rlcy5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpJbnZhbGlkYXRlTGlua2VkQ29tbWFuZEJ1ZmZlcnMoc3RkOjp1bm9yZGVyZWRfc2V0PENNRF9CVUZGRVJfU1RBVEUgKj4gJmNiX25vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgJm9iaikgeworICAgIGZvciAoYXV0byBjYl9ub2RlIDogY2Jfbm9kZXMpIHsKKyAgICAgICAgaWYgKGNiX25vZGUtPnN0YXRlID09IENCX1JFQ09SRElORykgeworICAgICAgICAgICAgY2Jfbm9kZS0+c3RhdGUgPSBDQl9JTlZBTElEX0lOQ09NUExFVEU7CisgICAgICAgIH0gZWxzZSBpZiAoY2Jfbm9kZS0+c3RhdGUgPT0gQ0JfUkVDT1JERUQpIHsKKyAgICAgICAgICAgIGNiX25vZGUtPnN0YXRlID0gQ0JfSU5WQUxJRF9DT01QTEVURTsKKyAgICAgICAgfQorICAgICAgICBjYl9ub2RlLT5icm9rZW5fYmluZGluZ3MucHVzaF9iYWNrKG9iaik7CisKKyAgICAgICAgLy8gaWYgc2Vjb25kYXJ5LCB0aGVuIHByb3BhZ2F0ZSB0aGUgaW52YWxpZGF0aW9uIHRvIHRoZSBwcmltYXJpZXMgdGhhdCB3aWxsIGNhbGwgdXMuCisgICAgICAgIGlmIChjYl9ub2RlLT5jcmVhdGVJbmZvLmxldmVsID09IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSkgeworICAgICAgICAgICAgSW52YWxpZGF0ZUxpbmtlZENvbW1hbmRCdWZmZXJzKGNiX25vZGUtPmxpbmtlZENvbW1hbmRCdWZmZXJzLCBvYmopOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmREZXN0cm95RnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGlmICghZnJhbWVidWZmZXIpIHJldHVybjsKKyAgICBGUkFNRUJVRkZFUl9TVEFURSAqZnJhbWVidWZmZXJfc3RhdGUgPSBHZXRGcmFtZWJ1ZmZlclN0YXRlKGZyYW1lYnVmZmVyKTsKKyAgICBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSBvYmpfc3RydWN0KGZyYW1lYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyKTsKKyAgICBJbnZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnMoZnJhbWVidWZmZXJfc3RhdGUtPmNiX2JpbmRpbmdzLCBvYmpfc3RydWN0KTsKKyAgICBmcmFtZWJ1ZmZlcl9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBmcmFtZUJ1ZmZlck1hcC5lcmFzZShmcmFtZWJ1ZmZlcik7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBpZiAoIXJlbmRlclBhc3MpIHJldHVybjsKKyAgICBSRU5ERVJfUEFTU19TVEFURSAqcnBfc3RhdGUgPSBHZXRSZW5kZXJQYXNzU3RhdGUocmVuZGVyUGFzcyk7CisgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChyZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MpOworICAgIEludmFsaWRhdGVDb21tYW5kQnVmZmVycyhycF9zdGF0ZS0+Y2JfYmluZGluZ3MsIG9ial9zdHJ1Y3QpOworICAgIHJwX3N0YXRlLT5kZXN0cm95ZWQgPSB0cnVlOworICAgIHJlbmRlclBhc3NNYXAuZXJhc2UocmVuZGVyUGFzcyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVGZW5jZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRmVuY2UgKnBGZW5jZSwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgYXV0byBmZW5jZV9zdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8RkVOQ0VfU1RBVEU+KCk7CisgICAgZmVuY2Vfc3RhdGUtPmZlbmNlID0gKnBGZW5jZTsKKyAgICBmZW5jZV9zdGF0ZS0+Y3JlYXRlSW5mbyA9ICpwQ3JlYXRlSW5mbzsKKyAgICBmZW5jZV9zdGF0ZS0+c3RhdGUgPSAocENyZWF0ZUluZm8tPmZsYWdzICYgVktfRkVOQ0VfQ1JFQVRFX1NJR05BTEVEX0JJVCkgPyBGRU5DRV9SRVRJUkVEIDogRkVOQ0VfVU5TSUdOQUxFRDsKKyAgICBmZW5jZU1hcFsqcEZlbmNlXSA9IHN0ZDo6bW92ZShmZW5jZV9zdGF0ZSk7Cit9CisKK2Jvb2wgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1BpcGVsaW5lICpwUGlwZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjZ3BsX3N0YXRlX2RhdGEpIGNvbnN0IHsKKyAgICAvLyBTZXQgdXAgdGhlIHN0YXRlIHRoYXQgQ29yZUNoZWNrcywgZ3B1X3ZhbGlkYXRpb24gYW5kIGxhdGVyIFN0YXRlVHJhY2tlciBSZWNvcmQgd2lsbCB1c2UuCisgICAgY3JlYXRlX2dyYXBoaWNzX3BpcGVsaW5lX2FwaV9zdGF0ZSAqY2dwbF9zdGF0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y3JlYXRlX2dyYXBoaWNzX3BpcGVsaW5lX2FwaV9zdGF0ZSAqPihjZ3BsX3N0YXRlX2RhdGEpOworICAgIGNncGxfc3RhdGUtPnBDcmVhdGVJbmZvcyA9IHBDcmVhdGVJbmZvczsgIC8vIEdQVSB2YWxpZGF0aW9uIGNhbiBhbHRlciB0aGlzLCBzbyB3ZSBoYXZlIHRvIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBDaGFzc2lzCisgICAgY2dwbF9zdGF0ZS0+cGlwZV9zdGF0ZS5yZXNlcnZlKGNvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjZ3BsX3N0YXRlLT5waXBlX3N0YXRlLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPFBJUEVMSU5FX1NUQVRFPigpKTsKKyAgICAgICAgKGNncGxfc3RhdGUtPnBpcGVfc3RhdGUpW2ldLT5pbml0R3JhcGhpY3NQaXBlbGluZSh0aGlzLCAmcENyZWF0ZUluZm9zW2ldLCBHZXRSZW5kZXJQYXNzU2hhcmVkKHBDcmVhdGVJbmZvc1tpXS5yZW5kZXJQYXNzKSk7CisgICAgICAgIChjZ3BsX3N0YXRlLT5waXBlX3N0YXRlKVtpXS0+cGlwZWxpbmVfbGF5b3V0ID0gR2V0UGlwZWxpbmVMYXlvdXRTaGFyZWQocENyZWF0ZUluZm9zW2ldLmxheW91dCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0LCB2b2lkICpjZ3BsX3N0YXRlX2RhdGEpIHsKKyAgICBjcmVhdGVfZ3JhcGhpY3NfcGlwZWxpbmVfYXBpX3N0YXRlICpjZ3BsX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxjcmVhdGVfZ3JhcGhpY3NfcGlwZWxpbmVfYXBpX3N0YXRlICo+KGNncGxfc3RhdGVfZGF0YSk7CisgICAgLy8gVGhpcyBBUEkgbWF5IGNyZWF0ZSBwaXBlbGluZXMgcmVnYXJkbGVzcyBvZiB0aGUgcmV0dXJuIHZhbHVlCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHBQaXBlbGluZXNbaV0gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIChjZ3BsX3N0YXRlLT5waXBlX3N0YXRlKVtpXS0+cGlwZWxpbmUgPSBwUGlwZWxpbmVzW2ldOworICAgICAgICAgICAgcGlwZWxpbmVNYXBbcFBpcGVsaW5lc1tpXV0gPSBzdGQ6Om1vdmUoKGNncGxfc3RhdGUtPnBpcGVfc3RhdGUpW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjZ3BsX3N0YXRlLT5waXBlX3N0YXRlLmNsZWFyKCk7Cit9CisKK2Jvb2wgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2NwbF9zdGF0ZV9kYXRhKSBjb25zdCB7CisgICAgYXV0byAqY2NwbF9zdGF0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y3JlYXRlX2NvbXB1dGVfcGlwZWxpbmVfYXBpX3N0YXRlICo+KGNjcGxfc3RhdGVfZGF0YSk7CisgICAgY2NwbF9zdGF0ZS0+cENyZWF0ZUluZm9zID0gcENyZWF0ZUluZm9zOyAgLy8gR1BVIHZhbGlkYXRpb24gY2FuIGFsdGVyIHRoaXMsIHNvIHdlIGhhdmUgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIENoYXNzaXMKKyAgICBjY3BsX3N0YXRlLT5waXBlX3N0YXRlLnJlc2VydmUoY291bnQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIC8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBpbnRlcm5hbCB0cmFja2luZyBkYXRhIHN0cnVjdHVyZQorICAgICAgICBjY3BsX3N0YXRlLT5waXBlX3N0YXRlLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPFBJUEVMSU5FX1NUQVRFPigpKTsKKyAgICAgICAgY2NwbF9zdGF0ZS0+cGlwZV9zdGF0ZS5iYWNrKCktPmluaXRDb21wdXRlUGlwZWxpbmUodGhpcywgJnBDcmVhdGVJbmZvc1tpXSk7CisgICAgICAgIGNjcGxfc3RhdGUtPnBpcGVfc3RhdGUuYmFjaygpLT5waXBlbGluZV9sYXlvdXQgPSBHZXRQaXBlbGluZUxheW91dFNoYXJlZChwQ3JlYXRlSW5mb3NbaV0ubGF5b3V0KTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1BpcGVsaW5lICpwUGlwZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0LCB2b2lkICpjY3BsX3N0YXRlX2RhdGEpIHsKKyAgICBjcmVhdGVfY29tcHV0ZV9waXBlbGluZV9hcGlfc3RhdGUgKmNjcGxfc3RhdGUgPSByZWludGVycHJldF9jYXN0PGNyZWF0ZV9jb21wdXRlX3BpcGVsaW5lX2FwaV9zdGF0ZSAqPihjY3BsX3N0YXRlX2RhdGEpOworCisgICAgLy8gVGhpcyBBUEkgbWF5IGNyZWF0ZSBwaXBlbGluZXMgcmVnYXJkbGVzcyBvZiB0aGUgcmV0dXJuIHZhbHVlCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHBQaXBlbGluZXNbaV0gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIChjY3BsX3N0YXRlLT5waXBlX3N0YXRlKVtpXS0+cGlwZWxpbmUgPSBwUGlwZWxpbmVzW2ldOworICAgICAgICAgICAgcGlwZWxpbmVNYXBbcFBpcGVsaW5lc1tpXV0gPSBzdGQ6Om1vdmUoKGNjcGxfc3RhdGUtPnBpcGVfc3RhdGUpW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjY3BsX3N0YXRlLT5waXBlX3N0YXRlLmNsZWFyKCk7Cit9CisKK2Jvb2wgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICpwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lICpwUGlwZWxpbmVzLCB2b2lkICpjcnRwbF9zdGF0ZV9kYXRhKSBjb25zdCB7CisgICAgYXV0byAqY3J0cGxfc3RhdGUgPSByZWludGVycHJldF9jYXN0PGNyZWF0ZV9yYXlfdHJhY2luZ19waXBlbGluZV9hcGlfc3RhdGUgKj4oY3J0cGxfc3RhdGVfZGF0YSk7CisgICAgY3J0cGxfc3RhdGUtPnBpcGVfc3RhdGUucmVzZXJ2ZShjb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBpbml0aWFsaXplIGludGVybmFsIHRyYWNraW5nIGRhdGEgc3RydWN0dXJlCisgICAgICAgIGNydHBsX3N0YXRlLT5waXBlX3N0YXRlLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPFBJUEVMSU5FX1NUQVRFPigpKTsKKyAgICAgICAgY3J0cGxfc3RhdGUtPnBpcGVfc3RhdGUuYmFjaygpLT5pbml0UmF5VHJhY2luZ1BpcGVsaW5lTlYodGhpcywgJnBDcmVhdGVJbmZvc1tpXSk7CisgICAgICAgIGNydHBsX3N0YXRlLT5waXBlX3N0YXRlLmJhY2soKS0+cGlwZWxpbmVfbGF5b3V0ID0gR2V0UGlwZWxpbmVMYXlvdXRTaGFyZWQocENyZWF0ZUluZm9zW2ldLmxheW91dCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgKnBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMsIFZrUmVzdWx0IHJlc3VsdCwgdm9pZCAqY3J0cGxfc3RhdGVfZGF0YSkgeworICAgIGF1dG8gKmNydHBsX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxjcmVhdGVfcmF5X3RyYWNpbmdfcGlwZWxpbmVfYXBpX3N0YXRlICo+KGNydHBsX3N0YXRlX2RhdGEpOworICAgIC8vIFRoaXMgQVBJIG1heSBjcmVhdGUgcGlwZWxpbmVzIHJlZ2FyZGxlc3Mgb2YgdGhlIHJldHVybiB2YWx1ZQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChwUGlwZWxpbmVzW2ldICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICAoY3J0cGxfc3RhdGUtPnBpcGVfc3RhdGUpW2ldLT5waXBlbGluZSA9IHBQaXBlbGluZXNbaV07CisgICAgICAgICAgICBwaXBlbGluZU1hcFtwUGlwZWxpbmVzW2ldXSA9IHN0ZDo6bW92ZSgoY3J0cGxfc3RhdGUtPnBpcGVfc3RhdGUpW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjcnRwbF9zdGF0ZS0+cGlwZV9zdGF0ZS5jbGVhcigpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlU2FtcGxlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1NhbXBsZXIgKnBTYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgc2FtcGxlck1hcFsqcFNhbXBsZXJdID0gc3RkOjptYWtlX3NoYXJlZDxTQU1QTEVSX1NUQVRFPihwU2FtcGxlciwgcENyZWF0ZUluZm8pOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclNldExheW91dChWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dCAqcFNldExheW91dCwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgZGVzY3JpcHRvclNldExheW91dE1hcFsqcFNldExheW91dF0gPSBzdGQ6Om1ha2Vfc2hhcmVkPGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dD4ocENyZWF0ZUluZm8sICpwU2V0TGF5b3V0KTsKK30KKworLy8gRm9yIHJlcGVhdGFibGUgc29ydGluZywgbm90IHZlcnkgdXNlZnVsIGZvciAibWVtb3J5IGluIHJhbmdlIiBzZWFyY2gKK3N0cnVjdCBQdXNoQ29uc3RhbnRSYW5nZUNvbXBhcmUgeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBWa1B1c2hDb25zdGFudFJhbmdlICpsaHMsIGNvbnN0IFZrUHVzaENvbnN0YW50UmFuZ2UgKnJocykgY29uc3QgeworICAgICAgICBpZiAobGhzLT5vZmZzZXQgPT0gcmhzLT5vZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChsaHMtPnNpemUgPT0gcmhzLT5zaXplKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNvbXBhcmlzb24gaXMgYXJiaXRyYXJ5LCBidXQgYXZvaWRzIGZhbHNlIGFsaWFzaW5nIGJ5IGNvbXBhcmluZyBhbGwgZmllbGRzLgorICAgICAgICAgICAgICAgIHJldHVybiBsaHMtPnN0YWdlRmxhZ3MgPCByaHMtPnN0YWdlRmxhZ3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGUgb2Zmc2V0cyBhcmUgdGhlIHNhbWUgdGhlbiBzb3J0aW5nIGJ5IHRoZSBlbmQgb2YgcmFuZ2UgaXMgdXNlZnVsIGZvciB2YWxpZGF0aW9uCisgICAgICAgICAgICByZXR1cm4gbGhzLT5zaXplIDwgcmhzLT5zaXplOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaHMtPm9mZnNldCA8IHJocy0+b2Zmc2V0OworICAgIH0KK307CisKK3N0YXRpYyBQdXNoQ29uc3RhbnRSYW5nZXNEaWN0IHB1c2hfY29uc3RhbnRfcmFuZ2VzX2RpY3Q7CisKK1B1c2hDb25zdGFudFJhbmdlc0lkIEdldENhbm9uaWNhbElkKGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICppbmZvKSB7CisgICAgaWYgKCFpbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzKSB7CisgICAgICAgIC8vIEhhbmQgYmFjayB0aGUgZW1wdHkgZW50cnkgKGNyZWF0aW5nIGFzIG5lZWRlZCkuLi4KKyAgICAgICAgcmV0dXJuIHB1c2hfY29uc3RhbnRfcmFuZ2VzX2RpY3QubG9va191cChQdXNoQ29uc3RhbnRSYW5nZXMoKSk7CisgICAgfQorCisgICAgLy8gU29ydCB0aGUgaW5wdXQgcmFuZ2VzIHRvIGVuc3VyZSBlcXVpdmFsZW50IHJhbmdlcyBtYXAgdG8gdGhlIHNhbWUgaWQKKyAgICBzdGQ6OnNldDxjb25zdCBWa1B1c2hDb25zdGFudFJhbmdlICosIFB1c2hDb25zdGFudFJhbmdlQ29tcGFyZT4gc29ydGVkOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbmZvLT5wdXNoQ29uc3RhbnRSYW5nZUNvdW50OyBpKyspIHsKKyAgICAgICAgc29ydGVkLmluc2VydChpbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzICsgaSk7CisgICAgfQorCisgICAgUHVzaENvbnN0YW50UmFuZ2VzIHJhbmdlczsKKyAgICByYW5nZXMucmVzZXJ2ZShzb3J0ZWQuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gcmFuZ2UgOiBzb3J0ZWQpIHsKKyAgICAgICAgcmFuZ2VzLmVtcGxhY2VfYmFjaygqcmFuZ2UpOworICAgIH0KKyAgICByZXR1cm4gcHVzaF9jb25zdGFudF9yYW5nZXNfZGljdC5sb29rX3VwKHN0ZDo6bW92ZShyYW5nZXMpKTsKK30KKworLy8gRGljdGlvbmFyeSBvZiBjYW5vbmNpYWwgZm9ybSBvZiB0aGUgcGlwZWxpbmUgc2V0IGxheW91dCBvZiBkZXNjcmlwdG9yIHNldCBsYXlvdXRzCitzdGF0aWMgUGlwZWxpbmVMYXlvdXRTZXRMYXlvdXRzRGljdCBwaXBlbGluZV9sYXlvdXRfc2V0X2xheW91dHNfZGljdDsKKworLy8gRGljdGlvbmFyeSBvZiBjYW5vbmljYWwgZm9ybSBvZiB0aGUgImNvbXBhdGlibGUgZm9yIHNldCIgcmVjb3Jkcworc3RhdGljIFBpcGVsaW5lTGF5b3V0Q29tcGF0RGljdCBwaXBlbGluZV9sYXlvdXRfY29tcGF0X2RpY3Q7CisKK3N0YXRpYyBQaXBlbGluZUxheW91dENvbXBhdElkIEdldENhbm9uaWNhbElkKGNvbnN0IHVpbnQzMl90IHNldF9pbmRleCwgY29uc3QgUHVzaENvbnN0YW50UmFuZ2VzSWQgcGNyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVMYXlvdXRTZXRMYXlvdXRzSWQgc2V0X2xheW91dHNfaWQpIHsKKyAgICByZXR1cm4gcGlwZWxpbmVfbGF5b3V0X2NvbXBhdF9kaWN0Lmxvb2tfdXAoUGlwZWxpbmVMYXlvdXRDb21wYXREZWYoc2V0X2luZGV4LCBwY3JfaWQsIHNldF9sYXlvdXRzX2lkKSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZUxheW91dCAqcFBpcGVsaW5lTGF5b3V0LCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKworICAgIGF1dG8gcGlwZWxpbmVfbGF5b3V0X3N0YXRlID0gc3RkOjptYWtlX3NoYXJlZDxQSVBFTElORV9MQVlPVVRfU1RBVEU+KCk7CisgICAgcGlwZWxpbmVfbGF5b3V0X3N0YXRlLT5sYXlvdXQgPSAqcFBpcGVsaW5lTGF5b3V0OworICAgIHBpcGVsaW5lX2xheW91dF9zdGF0ZS0+c2V0X2xheW91dHMucmVzaXplKHBDcmVhdGVJbmZvLT5zZXRMYXlvdXRDb3VudCk7CisgICAgUGlwZWxpbmVMYXlvdXRTZXRMYXlvdXRzRGVmIHNldF9sYXlvdXRzKHBDcmVhdGVJbmZvLT5zZXRMYXlvdXRDb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5zZXRMYXlvdXRDb3VudDsgKytpKSB7CisgICAgICAgIHBpcGVsaW5lX2xheW91dF9zdGF0ZS0+c2V0X2xheW91dHNbaV0gPSBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U2hhcmVkKHBDcmVhdGVJbmZvLT5wU2V0TGF5b3V0c1tpXSk7CisgICAgICAgIHNldF9sYXlvdXRzW2ldID0gcGlwZWxpbmVfbGF5b3V0X3N0YXRlLT5zZXRfbGF5b3V0c1tpXS0+R2V0TGF5b3V0SWQoKTsKKyAgICB9CisKKyAgICAvLyBHZXQgY2Fub25pY2FsIGZvcm0gSURzIGZvciB0aGUgImNvbXBhdGlibGUgZm9yIHNldCIgY29udGVudHMKKyAgICBwaXBlbGluZV9sYXlvdXRfc3RhdGUtPnB1c2hfY29uc3RhbnRfcmFuZ2VzID0gR2V0Q2Fub25pY2FsSWQocENyZWF0ZUluZm8pOworICAgIGF1dG8gc2V0X2xheW91dHNfaWQgPSBwaXBlbGluZV9sYXlvdXRfc2V0X2xheW91dHNfZGljdC5sb29rX3VwKHNldF9sYXlvdXRzKTsKKyAgICBwaXBlbGluZV9sYXlvdXRfc3RhdGUtPmNvbXBhdF9mb3Jfc2V0LnJlc2VydmUocENyZWF0ZUluZm8tPnNldExheW91dENvdW50KTsKKworICAgIC8vIENyZWF0ZSB0YWJsZSBvZiAiY29tcGF0aWJsZSBmb3Igc2V0IE4iIGNhbm5vbmljYWwgZm9ybXMgZm9yIHRyaXZpYWwgYWNjZXB0IHZhbGlkYXRpb24KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPnNldExheW91dENvdW50OyArK2kpIHsKKyAgICAgICAgcGlwZWxpbmVfbGF5b3V0X3N0YXRlLT5jb21wYXRfZm9yX3NldC5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICBHZXRDYW5vbmljYWxJZChpLCBwaXBlbGluZV9sYXlvdXRfc3RhdGUtPnB1c2hfY29uc3RhbnRfcmFuZ2VzLCBzZXRfbGF5b3V0c19pZCkpOworICAgIH0KKyAgICBwaXBlbGluZUxheW91dE1hcFsqcFBpcGVsaW5lTGF5b3V0XSA9IHN0ZDo6bW92ZShwaXBlbGluZV9sYXlvdXRfc3RhdGUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclBvb2wgKnBEZXNjcmlwdG9yUG9vbCwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgZGVzY3JpcHRvclBvb2xNYXBbKnBEZXNjcmlwdG9yUG9vbF0gPSBzdGQ6Om1ha2Vfc2hhcmVkPERFU0NSSVBUT1JfUE9PTF9TVEFURT4oKnBEZXNjcmlwdG9yUG9vbCwgcENyZWF0ZUluZm8pOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkUmVzZXREZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JQb29sUmVzZXRGbGFncyBmbGFncywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgREVTQ1JJUFRPUl9QT09MX1NUQVRFICpwUG9vbCA9IEdldERlc2NyaXB0b3JQb29sU3RhdGUoZGVzY3JpcHRvclBvb2wpOworICAgIC8vIFRPRE86IHZhbGlkYXRlIGZsYWdzCisgICAgLy8gRm9yIGV2ZXJ5IHNldCBvZmYgb2YgdGhpcyBwb29sLCBjbGVhciBpdCwgcmVtb3ZlIGZyb20gc2V0TWFwLCBhbmQgZnJlZSBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQKKyAgICBmb3IgKGF1dG8gZHMgOiBwUG9vbC0+c2V0cykgeworICAgICAgICBGcmVlRGVzY3JpcHRvclNldChkcyk7CisgICAgfQorICAgIHBQb29sLT5zZXRzLmNsZWFyKCk7CisgICAgLy8gUmVzZXQgYXZhaWxhYmxlIGNvdW50IGZvciBlYWNoIHR5cGUgYW5kIGF2YWlsYWJsZSBzZXRzIGZvciB0aGlzIHBvb2wKKyAgICBmb3IgKGF1dG8gaXQgPSBwUG9vbC0+YXZhaWxhYmxlRGVzY3JpcHRvclR5cGVDb3VudC5iZWdpbigpOyBpdCAhPSBwUG9vbC0+YXZhaWxhYmxlRGVzY3JpcHRvclR5cGVDb3VudC5lbmQoKTsgKytpdCkgeworICAgICAgICBwUG9vbC0+YXZhaWxhYmxlRGVzY3JpcHRvclR5cGVDb3VudFtpdC0+Zmlyc3RdID0gcFBvb2wtPm1heERlc2NyaXB0b3JUeXBlQ291bnRbaXQtPmZpcnN0XTsKKyAgICB9CisgICAgcFBvb2wtPmF2YWlsYWJsZVNldHMgPSBwUG9vbC0+bWF4U2V0czsKK30KKworYm9vbCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsVmFsaWRhdGVBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gKnBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvclNldHMsIHZvaWQgKmFkc19zdGF0ZV9kYXRhKSBjb25zdCB7CisgICAgLy8gQWx3YXlzIHVwZGF0ZSBjb21tb24gZGF0YQorICAgIGN2ZGVzY3JpcHRvcnNldDo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEgKmFkc19zdGF0ZSA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y3ZkZXNjcmlwdG9yc2V0OjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzRGF0YSAqPihhZHNfc3RhdGVfZGF0YSk7CisgICAgVXBkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEocEFsbG9jYXRlSW5mbywgYWRzX3N0YXRlKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gQWxsb2NhdGlvbiBzdGF0ZSB3YXMgZ29vZCBhbmQgY2FsbCBkb3duIGNoYWluIHdhcyBtYWRlIHNvIHVwZGF0ZSBzdGF0ZSBiYXNlZCBvbiBhbGxvY2F0aW5nIGRlc2NyaXB0b3Igc2V0cwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEFsbG9jYXRlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gKnBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cywgVmtSZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYWRzX3N0YXRlX2RhdGEpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICAvLyBBbGwgdGhlIHVwZGF0ZXMgYXJlIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBjdmRlc2NyaXB0b3JzZXQgZnVuY3Rpb24KKyAgICBjdmRlc2NyaXB0b3JzZXQ6OkFsbG9jYXRlRGVzY3JpcHRvclNldHNEYXRhICphZHNfc3RhdGUgPQorICAgICAgICByZWludGVycHJldF9jYXN0PGN2ZGVzY3JpcHRvcnNldDo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEgKj4oYWRzX3N0YXRlX2RhdGEpOworICAgIFBlcmZvcm1BbGxvY2F0ZURlc2NyaXB0b3JTZXRzKHBBbGxvY2F0ZUluZm8sIHBEZXNjcmlwdG9yU2V0cywgYWRzX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRnJlZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvclNldHMpIHsKKyAgICBERVNDUklQVE9SX1BPT0xfU1RBVEUgKnBvb2xfc3RhdGUgPSBHZXREZXNjcmlwdG9yUG9vbFN0YXRlKGRlc2NyaXB0b3JQb29sKTsKKyAgICAvLyBVcGRhdGUgYXZhaWxhYmxlIGRlc2NyaXB0b3Igc2V0cyBpbiBwb29sCisgICAgcG9vbF9zdGF0ZS0+YXZhaWxhYmxlU2V0cyArPSBjb3VudDsKKworICAgIC8vIEZvciBlYWNoIGZyZWVkIGRlc2NyaXB0b3IgYWRkIGl0cyByZXNvdXJjZXMgYmFjayBpbnRvIHRoZSBwb29sIGFzIGF2YWlsYWJsZSBhbmQgcmVtb3ZlIGZyb20gcG9vbCBhbmQgc2V0TWFwCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKHBEZXNjcmlwdG9yU2V0c1tpXSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgYXV0byBkZXNjcmlwdG9yX3NldCA9IHNldE1hcFtwRGVzY3JpcHRvclNldHNbaV1dLmdldCgpOworICAgICAgICAgICAgdWludDMyX3QgdHlwZV9pbmRleCA9IDAsIGRlc2NyaXB0b3JfY291bnQgPSAwOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGRlc2NyaXB0b3Jfc2V0LT5HZXRCaW5kaW5nQ291bnQoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgdHlwZV9pbmRleCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yX3NldC0+R2V0VHlwZUZyb21JbmRleChqKSk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9jb3VudCA9IGRlc2NyaXB0b3Jfc2V0LT5HZXREZXNjcmlwdG9yQ291bnRGcm9tSW5kZXgoaik7CisgICAgICAgICAgICAgICAgcG9vbF9zdGF0ZS0+YXZhaWxhYmxlRGVzY3JpcHRvclR5cGVDb3VudFt0eXBlX2luZGV4XSArPSBkZXNjcmlwdG9yX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgRnJlZURlc2NyaXB0b3JTZXQoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICAgICAgcG9vbF9zdGF0ZS0+c2V0cy5lcmFzZShkZXNjcmlwdG9yX3NldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JXcml0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICBjdmRlc2NyaXB0b3JzZXQ6OlBlcmZvcm1VcGRhdGVEZXNjcmlwdG9yU2V0cyh0aGlzLCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcERlc2NyaXB0b3JXcml0ZXMsIGRlc2NyaXB0b3JDb3B5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQWxsb2NhdGVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVyLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBhdXRvIHBQb29sID0gR2V0Q29tbWFuZFBvb2xTaGFyZWQocENyZWF0ZUluZm8tPmNvbW1hbmRQb29sKTsKKyAgICBpZiAocFBvb2wpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5jb21tYW5kQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgLy8gQWRkIGNvbW1hbmQgYnVmZmVyIHRvIGl0cyBjb21tYW5kUG9vbCBtYXAKKyAgICAgICAgICAgIHBQb29sLT5jb21tYW5kQnVmZmVycy5pbnNlcnQocENvbW1hbmRCdWZmZXJbaV0pOworICAgICAgICAgICAgYXV0byBwQ0IgPSBzdGQ6Om1ha2Vfc2hhcmVkPENNRF9CVUZGRVJfU1RBVEU+KCk7CisgICAgICAgICAgICBwQ0ItPmNyZWF0ZUluZm8gPSAqcENyZWF0ZUluZm87CisgICAgICAgICAgICBwQ0ItPmRldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgIHBDQi0+Y29tbWFuZF9wb29sID0gcFBvb2w7CisgICAgICAgICAgICAvLyBBZGQgY29tbWFuZCBidWZmZXIgdG8gbWFwCisgICAgICAgICAgICBjb21tYW5kQnVmZmVyTWFwW3BDb21tYW5kQnVmZmVyW2ldXSA9IHN0ZDo6bW92ZShwQ0IpOworICAgICAgICAgICAgUmVzZXRDb21tYW5kQnVmZmVyU3RhdGUocENvbW1hbmRCdWZmZXJbaV0pOworICAgICAgICB9CisgICAgfQorfQorCisvLyBBZGQgYmluZGluZ3MgYmV0d2VlbiB0aGUgZ2l2ZW4gY21kIGJ1ZmZlciAmIGZyYW1lYnVmZmVyIGFuZCB0aGUgZnJhbWVidWZmZXIncyBjaGlsZHJlbgordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpBZGRGcmFtZWJ1ZmZlckJpbmRpbmcoQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIEZSQU1FQlVGRkVSX1NUQVRFICpmYl9zdGF0ZSkgeworICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKGZiX3N0YXRlLT5jYl9iaW5kaW5ncywgVnVsa2FuVHlwZWRIYW5kbGUoZmJfc3RhdGUtPmZyYW1lYnVmZmVyLCBrVnVsa2FuT2JqZWN0VHlwZUZyYW1lYnVmZmVyLCBmYl9zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfc3RhdGUpOworICAgIC8vIElmIGltYWdlbGVzcyBmYiwgc2tpcCBmYiBiaW5kaW5nCisgICAgaWYgKGZiX3N0YXRlLT5jcmVhdGVJbmZvLmZsYWdzICYgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSKSByZXR1cm47CisgICAgY29uc3QgdWludDMyX3QgYXR0YWNobWVudENvdW50ID0gZmJfc3RhdGUtPmNyZWF0ZUluZm8uYXR0YWNobWVudENvdW50OworICAgIGZvciAodWludDMyX3QgYXR0YWNobWVudCA9IDA7IGF0dGFjaG1lbnQgPCBhdHRhY2htZW50Q291bnQ7ICsrYXR0YWNobWVudCkgeworICAgICAgICBhdXRvIHZpZXdfc3RhdGUgPSBHZXRBdHRhY2htZW50SW1hZ2VWaWV3U3RhdGUoZmJfc3RhdGUsIGF0dGFjaG1lbnQpOworICAgICAgICBpZiAodmlld19zdGF0ZSkgeworICAgICAgICAgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdJbWFnZVZpZXcoY2Jfc3RhdGUsIHZpZXdfc3RhdGUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvICpwQmVnaW5JbmZvKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGlmICghY2Jfc3RhdGUpIHJldHVybjsKKyAgICBpZiAoY2Jfc3RhdGUtPmNyZWF0ZUluZm8ubGV2ZWwgIT0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSkgeworICAgICAgICAvLyBTZWNvbmRhcnkgQ29tbWFuZCBCdWZmZXIKKyAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvICpwSW5mbyA9IHBCZWdpbkluZm8tPnBJbmhlcml0YW5jZUluZm87CisgICAgICAgIGlmIChwSW5mbykgeworICAgICAgICAgICAgaWYgKHBCZWdpbkluZm8tPmZsYWdzICYgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHBJbmZvLT5yZW5kZXJQYXNzKTsKKyAgICAgICAgICAgICAgICBhdXRvIGZyYW1lYnVmZmVyID0gR2V0RnJhbWVidWZmZXJTdGF0ZShwSW5mby0+ZnJhbWVidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChmcmFtZWJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0IHRoaXMgZnJhbWVidWZmZXIgYW5kIGl0cyBjaGlsZHJlbiB0byB0aGlzIGNtZEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBBZGRGcmFtZWJ1ZmZlckJpbmRpbmcoY2Jfc3RhdGUsIGZyYW1lYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKENCX1JFQ09SREVEID09IGNiX3N0YXRlLT5zdGF0ZSB8fCBDQl9JTlZBTElEX0NPTVBMRVRFID09IGNiX3N0YXRlLT5zdGF0ZSkgeworICAgICAgICBSZXNldENvbW1hbmRCdWZmZXJTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICB9CisgICAgLy8gU2V0IHVwZGF0ZWQgc3RhdGUgaGVyZSBpbiBjYXNlIGltcGxpY2l0IHJlc2V0IG9jY3VycyBhYm92ZQorICAgIGNiX3N0YXRlLT5zdGF0ZSA9IENCX1JFQ09SRElORzsKKyAgICBjYl9zdGF0ZS0+YmVnaW5JbmZvID0gKnBCZWdpbkluZm87CisgICAgaWYgKGNiX3N0YXRlLT5iZWdpbkluZm8ucEluaGVyaXRhbmNlSW5mbykgeworICAgICAgICBjYl9zdGF0ZS0+aW5oZXJpdGFuY2VJbmZvID0gKihjYl9zdGF0ZS0+YmVnaW5JbmZvLnBJbmhlcml0YW5jZUluZm8pOworICAgICAgICBjYl9zdGF0ZS0+YmVnaW5JbmZvLnBJbmhlcml0YW5jZUluZm8gPSAmY2Jfc3RhdGUtPmluaGVyaXRhbmNlSW5mbzsKKyAgICAgICAgLy8gSWYgd2UgYXJlIGEgc2Vjb25kYXJ5IGNvbW1hbmQtYnVmZmVyIGFuZCBpbmhlcml0aW5nLiAgVXBkYXRlIHRoZSBpdGVtcyB3ZSBzaG91bGQgaW5oZXJpdC4KKyAgICAgICAgaWYgKChjYl9zdGF0ZS0+Y3JlYXRlSW5mby5sZXZlbCAhPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZKSAmJgorICAgICAgICAgICAgKGNiX3N0YXRlLT5iZWdpbkluZm8uZmxhZ3MgJiBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQpKSB7CisgICAgICAgICAgICBjYl9zdGF0ZS0+YWN0aXZlUmVuZGVyUGFzcyA9IEdldFJlbmRlclBhc3NTdGF0ZShjYl9zdGF0ZS0+YmVnaW5JbmZvLnBJbmhlcml0YW5jZUluZm8tPnJlbmRlclBhc3MpOworICAgICAgICAgICAgY2Jfc3RhdGUtPmFjdGl2ZVN1YnBhc3MgPSBjYl9zdGF0ZS0+YmVnaW5JbmZvLnBJbmhlcml0YW5jZUluZm8tPnN1YnBhc3M7CisgICAgICAgICAgICBjYl9zdGF0ZS0+YWN0aXZlRnJhbWVidWZmZXIgPSBjYl9zdGF0ZS0+YmVnaW5JbmZvLnBJbmhlcml0YW5jZUluZm8tPmZyYW1lYnVmZmVyOworICAgICAgICAgICAgY2Jfc3RhdGUtPmZyYW1lYnVmZmVycy5pbnNlcnQoY2Jfc3RhdGUtPmJlZ2luSW5mby5wSW5oZXJpdGFuY2VJbmZvLT5mcmFtZWJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrRGV2aWNlR3JvdXBDb21tYW5kQnVmZmVyQmVnaW5JbmZvPihwQmVnaW5JbmZvLT5wTmV4dCk7CisgICAgaWYgKGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdCkgeworICAgICAgICBjYl9zdGF0ZS0+aW5pdGlhbF9kZXZpY2VfbWFzayA9IGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+ZGV2aWNlTWFzazsKKyAgICB9IGVsc2UgeworICAgICAgICBjYl9zdGF0ZS0+aW5pdGlhbF9kZXZpY2VfbWFzayA9ICgxIDw8IHBoeXNpY2FsX2RldmljZV9jb3VudCkgLSAxOworICAgIH0KKworICAgIGNiX3N0YXRlLT5wZXJmb3JtYW5jZV9sb2NrX2FjcXVpcmVkID0gcGVyZm9ybWFuY2VfbG9ja19hY3F1aXJlZDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEVuZENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAoIWNiX3N0YXRlKSByZXR1cm47CisgICAgLy8gQ2FjaGVkIHZhbGlkYXRpb24gaXMgc3BlY2lmaWMgdG8gYSBzcGVjaWZpYyByZWNvcmRpbmcgb2YgYSBzcGVjaWZpYyBjb21tYW5kIGJ1ZmZlci4KKyAgICBmb3IgKGF1dG8gZGVzY3JpcHRvcl9zZXQgOiBjYl9zdGF0ZS0+dmFsaWRhdGVkX2Rlc2NyaXB0b3Jfc2V0cykgeworICAgICAgICBkZXNjcmlwdG9yX3NldC0+Q2xlYXJDYWNoZWRWYWxpZGF0aW9uKGNiX3N0YXRlKTsKKyAgICB9CisgICAgY2Jfc3RhdGUtPnZhbGlkYXRlZF9kZXNjcmlwdG9yX3NldHMuY2xlYXIoKTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgY2Jfc3RhdGUtPnN0YXRlID0gQ0JfUkVDT1JERUQ7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkUmVzZXRDb21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgUmVzZXRDb21tYW5kQnVmZmVyU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgfQorfQorCitDQlN0YXR1c0ZsYWdzIE1ha2VTdGF0aWNTdGF0ZU1hc2soVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gY29uc3QgKmRzKSB7CisgICAgLy8gaW5pdGlhbGx5IGFzc3VtZSBldmVyeXRoaW5nIGlzIHN0YXRpYyBzdGF0ZQorICAgIENCU3RhdHVzRmxhZ3MgZmxhZ3MgPSBDQlNUQVRVU19BTExfU1RBVEVfU0VUOworCisgICAgaWYgKGRzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkcy0+ZHluYW1pY1N0YXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChkcy0+cER5bmFtaWNTdGF0ZXNbaV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfTElORV9XSURUSDoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJj0gfkNCU1RBVFVTX0xJTkVfV0lEVEhfU0VUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfREVQVEhfQklBUzoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJj0gfkNCU1RBVFVTX0RFUFRIX0JJQVNfU0VUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfQkxFTkRfQ09OU1RBTlRTOgorICAgICAgICAgICAgICAgICAgICBmbGFncyAmPSB+Q0JTVEFUVVNfQkxFTkRfQ09OU1RBTlRTX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUzoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJj0gfkNCU1RBVFVTX0RFUFRIX0JPVU5EU19TRVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX0NPTVBBUkVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJj0gfkNCU1RBVFVTX1NURU5DSUxfUkVBRF9NQVNLX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfV1JJVEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJj0gfkNCU1RBVFVTX1NURU5DSUxfV1JJVEVfTUFTS19TRVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1JFRkVSRU5DRToKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJj0gfkNCU1RBVFVTX1NURU5DSUxfUkVGRVJFTkNFX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1I6CisgICAgICAgICAgICAgICAgICAgIGZsYWdzICY9IH5DQlNUQVRVU19TQ0lTU09SX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUOgorICAgICAgICAgICAgICAgICAgICBmbGFncyAmPSB+Q0JTVEFUVVNfVklFV1BPUlRfU0VUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfRVhDTFVTSVZFX1NDSVNTT1JfTlY6CisgICAgICAgICAgICAgICAgICAgIGZsYWdzICY9IH5DQlNUQVRVU19FWENMVVNJVkVfU0NJU1NPUl9TRVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfUEFMRVRURV9OVjoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJj0gfkNCU1RBVFVTX1NIQURJTkdfUkFURV9QQUxFVFRFX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX0xJTkVfU1RJUFBMRV9FWFQ6CisgICAgICAgICAgICAgICAgICAgIGZsYWdzICY9IH5DQlNUQVRVU19MSU5FX1NUSVBQTEVfU0VUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfV19TQ0FMSU5HX05WOgorICAgICAgICAgICAgICAgICAgICBmbGFncyAmPSB+Q0JTVEFUVVNfVklFV1BPUlRfV19TQ0FMSU5HX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKKy8vIFZhbGlkYXRpb24gY2FjaGU6CisvLyBDViBpcyB0aGUgYm90dG9tbW9zdCBpbXBsZW1lbnRvciBvZiB0aGlzIGV4dGVuc2lvbi4gRG9uJ3QgcGFzcyBjYWxscyBkb3duLgorLy8gdXRpbGl0eSBmdW5jdGlvbiB0byBzZXQgY29sbGVjdGl2ZSBzdGF0ZSBmb3IgcGlwZWxpbmUKK3ZvaWQgU2V0UGlwZWxpbmVTdGF0ZShQSVBFTElORV9TVEFURSAqcFBpcGUpIHsKKyAgICAvLyBJZiBhbnkgYXR0YWNobWVudCB1c2VkIGJ5IHRoaXMgcGlwZWxpbmUgaGFzIGJsZW5kRW5hYmxlLCBzZXQgdG9wLWxldmVsIGJsZW5kRW5hYmxlCisgICAgaWYgKHBQaXBlLT5ncmFwaGljc1BpcGVsaW5lQ0kucENvbG9yQmxlbmRTdGF0ZSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBQaXBlLT5hdHRhY2htZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKFZLX1RSVUUgPT0gcFBpcGUtPmF0dGFjaG1lbnRzW2ldLmJsZW5kRW5hYmxlKSB7CisgICAgICAgICAgICAgICAgaWYgKCgocFBpcGUtPmF0dGFjaG1lbnRzW2ldLmRzdEFscGhhQmxlbmRGYWN0b3IgPj0gVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0NPTE9SKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBQaXBlLT5hdHRhY2htZW50c1tpXS5kc3RBbHBoYUJsZW5kRmFjdG9yIDw9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEpKSB8fAorICAgICAgICAgICAgICAgICAgICAoKHBQaXBlLT5hdHRhY2htZW50c1tpXS5kc3RDb2xvckJsZW5kRmFjdG9yID49IFZLX0JMRU5EX0ZBQ1RPUl9DT05TVEFOVF9DT0xPUikgJiYKKyAgICAgICAgICAgICAgICAgICAgIChwUGlwZS0+YXR0YWNobWVudHNbaV0uZHN0Q29sb3JCbGVuZEZhY3RvciA8PSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKChwUGlwZS0+YXR0YWNobWVudHNbaV0uc3JjQWxwaGFCbGVuZEZhY3RvciA+PSBWS19CTEVORF9GQUNUT1JfQ09OU1RBTlRfQ09MT1IpICYmCisgICAgICAgICAgICAgICAgICAgICAocFBpcGUtPmF0dGFjaG1lbnRzW2ldLnNyY0FscGhhQmxlbmRGYWN0b3IgPD0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQSkpIHx8CisgICAgICAgICAgICAgICAgICAgICgocFBpcGUtPmF0dGFjaG1lbnRzW2ldLnNyY0NvbG9yQmxlbmRGYWN0b3IgPj0gVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0NPTE9SKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBQaXBlLT5hdHRhY2htZW50c1tpXS5zcmNDb2xvckJsZW5kRmFjdG9yIDw9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEpKSkgeworICAgICAgICAgICAgICAgICAgICBwUGlwZS0+YmxlbmRDb25zdGFudHNFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZEJpbmRQaXBlbGluZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lIHBpcGVsaW5lKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydChjYl9zdGF0ZSk7CisKKyAgICBhdXRvIHBpcGVfc3RhdGUgPSBHZXRQaXBlbGluZVN0YXRlKHBpcGVsaW5lKTsKKyAgICBpZiAoVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyA9PSBwaXBlbGluZUJpbmRQb2ludCkgeworICAgICAgICBjYl9zdGF0ZS0+c3RhdHVzICY9IH5jYl9zdGF0ZS0+c3RhdGljX3N0YXR1czsKKyAgICAgICAgY2Jfc3RhdGUtPnN0YXRpY19zdGF0dXMgPSBNYWtlU3RhdGljU3RhdGVNYXNrKHBpcGVfc3RhdGUtPmdyYXBoaWNzUGlwZWxpbmVDSS5wdHIoKS0+cER5bmFtaWNTdGF0ZSk7CisgICAgICAgIGNiX3N0YXRlLT5zdGF0dXMgfD0gY2Jfc3RhdGUtPnN0YXRpY19zdGF0dXM7CisgICAgfQorICAgIFJlc2V0Q29tbWFuZEJ1ZmZlclB1c2hDb25zdGFudERhdGFJZkluY29tcGF0aWJsZShjYl9zdGF0ZSwgcGlwZV9zdGF0ZS0+cGlwZWxpbmVfbGF5b3V0LT5sYXlvdXQpOworICAgIGNiX3N0YXRlLT5sYXN0Qm91bmRbcGlwZWxpbmVCaW5kUG9pbnRdLnBpcGVsaW5lX3N0YXRlID0gcGlwZV9zdGF0ZTsKKyAgICBTZXRQaXBlbGluZVN0YXRlKHBpcGVfc3RhdGUpOworICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKHBpcGVfc3RhdGUtPmNiX2JpbmRpbmdzLCBWdWxrYW5UeXBlZEhhbmRsZShwaXBlbGluZSwga1Z1bGthbk9iamVjdFR5cGVQaXBlbGluZSksIGNiX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0Vmlld3BvcnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWa1ZpZXdwb3J0ICpwVmlld3BvcnRzKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT52aWV3cG9ydE1hc2sgfD0gKCgxdSA8PCB2aWV3cG9ydENvdW50KSAtIDF1KSA8PCBmaXJzdFZpZXdwb3J0OworICAgIGNiX3N0YXRlLT5zdGF0dXMgfD0gQ0JTVEFUVVNfVklFV1BPUlRfU0VUOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0RXhjbHVzaXZlU2Npc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleGNsdXNpdmVTY2lzc29yQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZWN0MkQgKnBFeGNsdXNpdmVTY2lzc29ycykgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICAvLyBUT0RPOiBXZSBkb24ndCBoYXZlIFZVSURzIGZvciB2YWxpZGF0aW5nIHRoYXQgYWxsIGV4Y2x1c2l2ZSBzY2lzc29ycyBoYXZlIGJlZW4gc2V0LgorICAgIC8vIGNiX3N0YXRlLT5leGNsdXNpdmVTY2lzc29yTWFzayB8PSAoKDF1IDw8IGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCkgLSAxdSkgPDwgZmlyc3RFeGNsdXNpdmVTY2lzc29yOworICAgIGNiX3N0YXRlLT5zdGF0dXMgfD0gQ0JTVEFUVVNfRVhDTFVTSVZFX1NDSVNTT1JfU0VUOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBpZiAoaW1hZ2VWaWV3ICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIGF1dG8gdmlld19zdGF0ZSA9IEdldEltYWdlVmlld1N0YXRlKGltYWdlVmlldyk7CisgICAgICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nSW1hZ2VWaWV3KGNiX3N0YXRlLCB2aWV3X3N0YXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgKnBTaGFkaW5nUmF0ZVBhbGV0dGVzKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIC8vIFRPRE86IFdlIGRvbid0IGhhdmUgVlVJRHMgZm9yIHZhbGlkYXRpbmcgdGhhdCBhbGwgc2hhZGluZyByYXRlIHBhbGV0dGVzIGhhdmUgYmVlbiBzZXQuCisgICAgLy8gY2Jfc3RhdGUtPnNoYWRpbmdSYXRlUGFsZXR0ZU1hc2sgfD0gKCgxdSA8PCB2aWV3cG9ydENvdW50KSAtIDF1KSA8PCBmaXJzdFZpZXdwb3J0OworICAgIGNiX3N0YXRlLT5zdGF0dXMgfD0gQ0JTVEFUVVNfU0hBRElOR19SQVRFX1BBTEVUVEVfU0VUOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAqcEFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBhdXRvIGFzX3N0YXRlID0gc3RkOjptYWtlX3NoYXJlZDxBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFPigqcEFjY2VsZXJhdGlvblN0cnVjdHVyZSwgcENyZWF0ZUluZm8pOworCisgICAgLy8gUXVlcnkgdGhlIHJlcXVpcmVtZW50cyBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBkb2Vzbid0ICh0byBhdm9pZCBiaW5kL3ZhbGlkYXRpb24gdGltZSBxdWVyeSkKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViBhc19tZW1vcnlfcmVxdWlyZW1lbnRzX2luZm8gPSB7fTsKKyAgICBhc19tZW1vcnlfcmVxdWlyZW1lbnRzX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OVjsKKyAgICBhc19tZW1vcnlfcmVxdWlyZW1lbnRzX2luZm8udHlwZSA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX09CSkVDVF9OVjsKKyAgICBhc19tZW1vcnlfcmVxdWlyZW1lbnRzX2luZm8uYWNjZWxlcmF0aW9uU3RydWN0dXJlID0gYXNfc3RhdGUtPmFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmU7CisgICAgRGlzcGF0Y2hHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVihkZXZpY2UsICZhc19tZW1vcnlfcmVxdWlyZW1lbnRzX2luZm8sICZhc19zdGF0ZS0+bWVtb3J5X3JlcXVpcmVtZW50cyk7CisKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c0luZm9OViBzY3JhdGNoX21lbW9yeV9yZXFfaW5mbyA9IHt9OworICAgIHNjcmF0Y2hfbWVtb3J5X3JlcV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlY7CisgICAgc2NyYXRjaF9tZW1vcnlfcmVxX2luZm8udHlwZSA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX1JFUVVJUkVNRU5UU19UWVBFX0JVSUxEX1NDUkFUQ0hfTlY7CisgICAgc2NyYXRjaF9tZW1vcnlfcmVxX2luZm8uYWNjZWxlcmF0aW9uU3RydWN0dXJlID0gYXNfc3RhdGUtPmFjY2VsZXJhdGlvbl9zdHJ1Y3R1cmU7CisgICAgRGlzcGF0Y2hHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVihkZXZpY2UsICZzY3JhdGNoX21lbW9yeV9yZXFfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhc19zdGF0ZS0+YnVpbGRfc2NyYXRjaF9tZW1vcnlfcmVxdWlyZW1lbnRzKTsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WIHVwZGF0ZV9tZW1vcnlfcmVxX2luZm8gPSB7fTsKKyAgICB1cGRhdGVfbWVtb3J5X3JlcV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlY7CisgICAgdXBkYXRlX21lbW9yeV9yZXFfaW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfVVBEQVRFX1NDUkFUQ0hfTlY7CisgICAgdXBkYXRlX21lbW9yeV9yZXFfaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBhc19zdGF0ZS0+YWNjZWxlcmF0aW9uX3N0cnVjdHVyZTsKKyAgICBEaXNwYXRjaEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKGRldmljZSwgJnVwZGF0ZV9tZW1vcnlfcmVxX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXNfc3RhdGUtPnVwZGF0ZV9zY3JhdGNoX21lbW9yeV9yZXF1aXJlbWVudHMpOworCisgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlTWFwWypwQWNjZWxlcmF0aW9uU3RydWN0dXJlXSA9IHN0ZDo6bW92ZShhc19zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigKKyAgICBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WICpwSW5mbywgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSICpwTWVtb3J5UmVxdWlyZW1lbnRzKSB7CisgICAgQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9TVEFURSAqYXNfc3RhdGUgPSBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShwSW5mby0+YWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICBpZiAoYXNfc3RhdGUgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAocEluZm8tPnR5cGUgPT0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WKSB7CisgICAgICAgICAgICBhc19zdGF0ZS0+bWVtb3J5X3JlcXVpcmVtZW50cyA9ICpwTWVtb3J5UmVxdWlyZW1lbnRzOworICAgICAgICAgICAgYXNfc3RhdGUtPm1lbW9yeV9yZXF1aXJlbWVudHNfY2hlY2tlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAocEluZm8tPnR5cGUgPT0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfQlVJTERfU0NSQVRDSF9OVikgeworICAgICAgICAgICAgYXNfc3RhdGUtPmJ1aWxkX3NjcmF0Y2hfbWVtb3J5X3JlcXVpcmVtZW50cyA9ICpwTWVtb3J5UmVxdWlyZW1lbnRzOworICAgICAgICAgICAgYXNfc3RhdGUtPmJ1aWxkX3NjcmF0Y2hfbWVtb3J5X3JlcXVpcmVtZW50c19jaGVja2VkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChwSW5mby0+dHlwZSA9PSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9VUERBVEVfU0NSQVRDSF9OVikgeworICAgICAgICAgICAgYXNfc3RhdGUtPnVwZGF0ZV9zY3JhdGNoX21lbW9yeV9yZXF1aXJlbWVudHMgPSAqcE1lbW9yeVJlcXVpcmVtZW50czsKKyAgICAgICAgICAgIGFzX3N0YXRlLT51cGRhdGVfc2NyYXRjaF9tZW1vcnlfcmVxdWlyZW1lbnRzX2NoZWNrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKAorICAgIFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WICpwQmluZEluZm9zLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZEluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OViAmaW5mbyA9IHBCaW5kSW5mb3NbaV07CisKKyAgICAgICAgQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9TVEFURSAqYXNfc3RhdGUgPSBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShpbmZvLmFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisgICAgICAgIGlmIChhc19zdGF0ZSkgeworICAgICAgICAgICAgLy8gVHJhY2sgYm91bmQgbWVtb3J5IHJhbmdlIGluZm9ybWF0aW9uCisgICAgICAgICAgICBhdXRvIG1lbV9pbmZvID0gR2V0RGV2TWVtU3RhdGUoaW5mby5tZW1vcnkpOworICAgICAgICAgICAgaWYgKG1lbV9pbmZvKSB7CisgICAgICAgICAgICAgICAgSW5zZXJ0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmFuZ2UoaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIG1lbV9pbmZvLCBpbmZvLm1lbW9yeU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19zdGF0ZS0+cmVxdWlyZW1lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRyYWNrIG9iamVjdHMgdGllZCB0byBtZW1vcnkKKyAgICAgICAgICAgIFNldE1lbUJpbmRpbmcoaW5mby5tZW1vcnksIGFzX3N0YXRlLCBpbmZvLm1lbW9yeU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVnVsa2FuVHlwZWRIYW5kbGUoaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpKTsKKworICAgICAgICAgICAgLy8gR1BVIHZhbGlkYXRpb24gb2YgdG9wIGxldmVsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYnVpbGRpbmcgbmVlZHMgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBoYW5kbGVzLgorICAgICAgICAgICAgaWYgKGVuYWJsZWQuZ3B1X3ZhbGlkYXRpb24pIHsKKyAgICAgICAgICAgICAgICBEaXNwYXRjaEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKGRldmljZSwgaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIDgsICZhc19zdGF0ZS0+b3BhcXVlX2hhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKAorICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViAqcEluZm8sIFZrQnVmZmVyIGluc3RhbmNlRGF0YSwgVmtEZXZpY2VTaXplIGluc3RhbmNlT2Zmc2V0LAorICAgIFZrQm9vbDMyIHVwZGF0ZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBkc3QsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0J1ZmZlciBzY3JhdGNoLCBWa0RldmljZVNpemUgc2NyYXRjaE9mZnNldCkgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAoY2Jfc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9TVEFURSAqZHN0X2FzX3N0YXRlID0gR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlU3RhdGUoZHN0KTsKKyAgICBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFICpzcmNfYXNfc3RhdGUgPSBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShzcmMpOworICAgIGlmIChkc3RfYXNfc3RhdGUgIT0gbnVsbHB0cikgeworICAgICAgICBkc3RfYXNfc3RhdGUtPmJ1aWx0ID0gdHJ1ZTsKKyAgICAgICAgZHN0X2FzX3N0YXRlLT5idWlsZF9pbmZvLmluaXRpYWxpemUocEluZm8pOworICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0FjY2VsZXJhdGlvblN0cnVjdHVyZShjYl9zdGF0ZSwgZHN0X2FzX3N0YXRlKTsKKyAgICB9CisgICAgaWYgKHNyY19hc19zdGF0ZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nQWNjZWxlcmF0aW9uU3RydWN0dXJlKGNiX3N0YXRlLCBzcmNfYXNfc3RhdGUpOworICAgIH0KKyAgICBjYl9zdGF0ZS0+aGFzQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDbWQgPSB0cnVlOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU1vZGVOViBtb2RlKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGlmIChjYl9zdGF0ZSkgeworICAgICAgICBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFICpzcmNfYXNfc3RhdGUgPSBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShzcmMpOworICAgICAgICBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFICpkc3RfYXNfc3RhdGUgPSBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShkc3QpOworICAgICAgICBpZiAoZHN0X2FzX3N0YXRlICE9IG51bGxwdHIgJiYgc3JjX2FzX3N0YXRlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdF9hc19zdGF0ZS0+YnVpbHQgPSB0cnVlOworICAgICAgICAgICAgZHN0X2FzX3N0YXRlLT5idWlsZF9pbmZvID0gc3JjX2FzX3N0YXRlLT5idWlsZF9pbmZvOworICAgICAgICAgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdBY2NlbGVyYXRpb25TdHJ1Y3R1cmUoY2Jfc3RhdGUsIGRzdF9hc19zdGF0ZSk7CisgICAgICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0FjY2VsZXJhdGlvblN0cnVjdHVyZShjYl9zdGF0ZSwgc3JjX2FzX3N0YXRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFjY2VsZXJhdGlvblN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBpZiAoIWFjY2VsZXJhdGlvblN0cnVjdHVyZSkgcmV0dXJuOworICAgIGF1dG8gKmFzX3N0YXRlID0gR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlU3RhdGUoYWNjZWxlcmF0aW9uU3RydWN0dXJlKTsKKyAgICBpZiAoYXNfc3RhdGUpIHsKKyAgICAgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgb2JqX3N0cnVjdChhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIGtWdWxrYW5PYmplY3RUeXBlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpOworICAgICAgICBJbnZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnMoYXNfc3RhdGUtPmNiX2JpbmRpbmdzLCBvYmpfc3RydWN0KTsKKyAgICAgICAgZm9yIChhdXRvIG1lbV9iaW5kaW5nIDogYXNfc3RhdGUtPkdldEJvdW5kTWVtb3J5KCkpIHsKKyAgICAgICAgICAgIGF1dG8gbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW1fYmluZGluZyk7CisgICAgICAgICAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgICAgICAgICBSZW1vdmVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSYW5nZShhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIG1lbV9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDbGVhck1lbW9yeU9iamVjdEJpbmRpbmdzKG9ial9zdHJ1Y3QpOworICAgICAgICBhc19zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICAgICAgYWNjZWxlcmF0aW9uU3RydWN0dXJlTWFwLmVyYXNlKGFjY2VsZXJhdGlvblN0cnVjdHVyZSk7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgdmlld3BvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViAqcFZpZXdwb3J0V1NjYWxpbmdzKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT5zdGF0dXMgfD0gQ0JTVEFUVVNfVklFV1BPUlRfV19TQ0FMSU5HX1NFVDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVdpZHRoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBsaW5lV2lkdGgpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY2Jfc3RhdGUtPnN0YXR1cyB8PSBDQlNUQVRVU19MSU5FX1dJRFRIX1NFVDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVN0aXBwbGVFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGxpbmVTdGlwcGxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGluZVN0aXBwbGVQYXR0ZXJuKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT5zdGF0dXMgfD0gQ0JTVEFUVVNfTElORV9TVElQUExFX1NFVDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0RGVwdGhCaWFzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBkZXB0aEJpYXNDb25zdGFudEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZXB0aEJpYXNDbGFtcCwgZmxvYXQgZGVwdGhCaWFzU2xvcGVGYWN0b3IpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY2Jfc3RhdGUtPnN0YXR1cyB8PSBDQlNUQVRVU19ERVBUSF9CSUFTX1NFVDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0U2Npc3NvcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RTY2lzc29yLCB1aW50MzJfdCBzY2lzc29yQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVjdDJEICpwU2Npc3NvcnMpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY2Jfc3RhdGUtPnNjaXNzb3JNYXNrIHw9ICgoMXUgPDwgc2Npc3NvckNvdW50KSAtIDF1KSA8PCBmaXJzdFNjaXNzb3I7CisgICAgY2Jfc3RhdGUtPnN0YXR1cyB8PSBDQlNUQVRVU19TQ0lTU09SX1NFVDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0QmxlbmRDb25zdGFudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IGZsb2F0IGJsZW5kQ29uc3RhbnRzWzRdKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT5zdGF0dXMgfD0gQ0JTVEFUVVNfQkxFTkRfQ09OU1RBTlRTX1NFVDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0RGVwdGhCb3VuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IG1pbkRlcHRoQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4RGVwdGhCb3VuZHMpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY2Jfc3RhdGUtPnN0YXR1cyB8PSBDQlNUQVRVU19ERVBUSF9CT1VORFNfU0VUOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb21wYXJlTWFzaykgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBjYl9zdGF0ZS0+c3RhdHVzIHw9IENCU1RBVFVTX1NURU5DSUxfUkVBRF9NQVNLX1NFVDsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFdyaXRlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZU1hc2spIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY2Jfc3RhdGUtPnN0YXR1cyB8PSBDQlNUQVRVU19TVEVOQ0lMX1dSSVRFX01BU0tfU0VUOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZmVyZW5jZSkgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBjYl9zdGF0ZS0+c3RhdHVzIHw9IENCU1RBVFVTX1NURU5DSUxfUkVGRVJFTkNFX1NFVDsKK30KKworLy8gVXBkYXRlIHBpcGVsaW5lX2xheW91dCBiaW5kIHBvaW50cyBhcHBseWluZyB0aGUgIlBpcGVsaW5lIExheW91dCBDb21wYXRpYmlsaXR5IiBydWxlcy4KKy8vIE9uZSBvZiBwRGVzY3JpcHRvclNldHMgb3IgcHVzaF9kZXNjcmlwdG9yX3NldCBzaG91bGQgYmUgbnVsbHB0ciwgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMKKy8vIGlzIGNhbGxlZCBmb3IgQ21kQmluZERlc2NyaXB0b3JTZXRzIG9yIENtZFB1c2hEZXNjcmlwdG9yU2V0Lgordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpVcGRhdGVMYXN0Qm91bmREZXNjcmlwdG9yU2V0cyhDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZV9iaW5kX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQSVBFTElORV9MQVlPVVRfU1RBVEUgKnBpcGVsaW5lX2xheW91dCwgdWludDMyX3QgZmlyc3Rfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXRfY291bnQsIGNvbnN0IFZrRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQgKnB1c2hfZGVzY3JpcHRvcl9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR5bmFtaWNfb2Zmc2V0X2NvdW50LCBjb25zdCB1aW50MzJfdCAqcF9keW5hbWljX29mZnNldHMpIHsKKyAgICBhc3NlcnQoKHBEZXNjcmlwdG9yU2V0cyA9PSBudWxscHRyKSBeIChwdXNoX2Rlc2NyaXB0b3Jfc2V0ID09IG51bGxwdHIpKTsKKyAgICAvLyBEZWZlbnNpdmUKKyAgICBhc3NlcnQocGlwZWxpbmVfbGF5b3V0KTsKKyAgICBpZiAoIXBpcGVsaW5lX2xheW91dCkgcmV0dXJuOworCisgICAgdWludDMyX3QgcmVxdWlyZWRfc2l6ZSA9IGZpcnN0X3NldCArIHNldF9jb3VudDsKKyAgICBjb25zdCB1aW50MzJfdCBsYXN0X2JpbmRpbmdfaW5kZXggPSByZXF1aXJlZF9zaXplIC0gMTsKKyAgICBhc3NlcnQobGFzdF9iaW5kaW5nX2luZGV4IDwgcGlwZWxpbmVfbGF5b3V0LT5jb21wYXRfZm9yX3NldC5zaXplKCkpOworCisgICAgLy8gU29tZSB1c2VmdWwgc2hvcnRoYW5kCisgICAgYXV0byAmbGFzdF9ib3VuZCA9IGNiX3N0YXRlLT5sYXN0Qm91bmRbcGlwZWxpbmVfYmluZF9wb2ludF07CisgICAgYXV0byAmcGlwZV9jb21wYXRfaWRzID0gcGlwZWxpbmVfbGF5b3V0LT5jb21wYXRfZm9yX3NldDsKKyAgICBjb25zdCB1aW50MzJfdCBjdXJyZW50X3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obGFzdF9ib3VuZC5wZXJfc2V0LnNpemUoKSk7CisKKyAgICAvLyBXZSBuZWVkIHRoaXMgdGhyZWUgdGltZXMgaW4gdGhpcyBmdW5jdGlvbiwgYnV0IG5vd2hlcmUgZWxzZQorICAgIGF1dG8gcHVzaF9kZXNjcmlwdG9yX2NsZWFudXAgPSBbJmxhc3RfYm91bmRdKGNvbnN0IGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCAqZHMpIC0+IGJvb2wgeworICAgICAgICBpZiAoZHMgJiYgZHMtPklzUHVzaERlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAgYXNzZXJ0KGRzID09IGxhc3RfYm91bmQucHVzaF9kZXNjcmlwdG9yX3NldC5nZXQoKSk7CisgICAgICAgICAgICBsYXN0X2JvdW5kLnB1c2hfZGVzY3JpcHRvcl9zZXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisKKyAgICAvLyBDbGVhbiB1cCB0aGUgImRpc3R1cmJlZCIgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmFuZ2UgdG8gYmUgc2V0CisgICAgaWYgKHJlcXVpcmVkX3NpemUgPCBjdXJyZW50X3NpemUpIHsKKyAgICAgICAgaWYgKGxhc3RfYm91bmQucGVyX3NldFtsYXN0X2JpbmRpbmdfaW5kZXhdLmNvbXBhdF9pZF9mb3Jfc2V0ICE9IHBpcGVfY29tcGF0X2lkc1tsYXN0X2JpbmRpbmdfaW5kZXhdKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBkaXN0dXJiaW5nIHRob3NlIGFmdGVyIGxhc3QsIHdlJ2xsIHNocmluayBiZWxvdywgYnV0IGZpcnN0IG5lZWQgdG8gY2hlY2sgZm9yIGFuZCBjbGVhbnVwIHRoZSBwdXNoX2Rlc2NyaXB0b3IKKyAgICAgICAgICAgIGZvciAoYXV0byBzZXRfaWR4ID0gcmVxdWlyZWRfc2l6ZTsgc2V0X2lkeCA8IGN1cnJlbnRfc2l6ZTsgKytzZXRfaWR4KSB7CisgICAgICAgICAgICAgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9jbGVhbnVwKGxhc3RfYm91bmQucGVyX3NldFtzZXRfaWR4XS5ib3VuZF9kZXNjcmlwdG9yX3NldCkpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UncmUgbm90IGRpc3R1cmJpbmcgcGFzdCBsYXN0LCBzbyBsZWF2ZSB0aGUgdXBwZXIgYmluZGluZyBkYXRhIGFsb25lLgorICAgICAgICAgICAgcmVxdWlyZWRfc2l6ZSA9IGN1cnJlbnRfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIHJlc2l6ZSBpZiB3ZSBuZWVkIG1vcmUgc2V0IGVudHJpZXMgb3IgaWYgdGhvc2UgcGFzdCAibGFzdCIgYXJlIGRpc3R1cmJlZAorICAgIGlmIChyZXF1aXJlZF9zaXplICE9IGN1cnJlbnRfc2l6ZSkgeworICAgICAgICBsYXN0X2JvdW5kLnBlcl9zZXQucmVzaXplKHJlcXVpcmVkX3NpemUpOworICAgIH0KKworICAgIC8vIEZvciBhbnkgcHJldmlvdXNseSBib3VuZCBzZXRzLCBuZWVkIHRvIHNldCB0aGVtIHRvICJpbnZhbGlkIiBpZiB0aGV5IHdlcmUgZGlzdHVyYmVkIGJ5IHRoaXMgdXBkYXRlCisgICAgZm9yICh1aW50MzJfdCBzZXRfaWR4ID0gMDsgc2V0X2lkeCA8IGZpcnN0X3NldDsgKytzZXRfaWR4KSB7CisgICAgICAgIGlmIChsYXN0X2JvdW5kLnBlcl9zZXRbc2V0X2lkeF0uY29tcGF0X2lkX2Zvcl9zZXQgIT0gcGlwZV9jb21wYXRfaWRzW3NldF9pZHhdKSB7CisgICAgICAgICAgICBwdXNoX2Rlc2NyaXB0b3JfY2xlYW51cChsYXN0X2JvdW5kLnBlcl9zZXRbc2V0X2lkeF0uYm91bmRfZGVzY3JpcHRvcl9zZXQpOworICAgICAgICAgICAgbGFzdF9ib3VuZC5wZXJfc2V0W3NldF9pZHhdLmJvdW5kX2Rlc2NyaXB0b3Jfc2V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGxhc3RfYm91bmQucGVyX3NldFtzZXRfaWR4XS5keW5hbWljT2Zmc2V0cy5jbGVhcigpOworICAgICAgICAgICAgbGFzdF9ib3VuZC5wZXJfc2V0W3NldF9pZHhdLmNvbXBhdF9pZF9mb3Jfc2V0ID0gcGlwZV9jb21wYXRfaWRzW3NldF9pZHhdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm93IHVwZGF0ZSB0aGUgYm91bmQgc2V0cyB3aXRoIHRoZSBpbnB1dCBzZXRzCisgICAgY29uc3QgdWludDMyX3QgKmlucHV0X2R5bmFtaWNfb2Zmc2V0cyA9IHBfZHluYW1pY19vZmZzZXRzOyAgLy8gInJlYWQiIHBvaW50ZXIgZm9yIGR5bmFtaWMgb2Zmc2V0IGRhdGEKKyAgICBmb3IgKHVpbnQzMl90IGlucHV0X2lkeCA9IDA7IGlucHV0X2lkeCA8IHNldF9jb3VudDsgaW5wdXRfaWR4KyspIHsKKyAgICAgICAgYXV0byBzZXRfaWR4ID0gaW5wdXRfaWR4ICsgZmlyc3Rfc2V0OyAgLy8gc2V0X2lkeCBpcyBpbmRleCB3aXRoaW4gbGF5b3V0LCBpbnB1dF9pZHggaXMgaW5kZXggd2l0aGluIGlucHV0IGRlc2NyaXB0b3Igc2V0cworICAgICAgICBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQgKmRlc2NyaXB0b3Jfc2V0ID0KKyAgICAgICAgICAgIHB1c2hfZGVzY3JpcHRvcl9zZXQgPyBwdXNoX2Rlc2NyaXB0b3Jfc2V0IDogR2V0U2V0Tm9kZShwRGVzY3JpcHRvclNldHNbaW5wdXRfaWR4XSk7CisKKyAgICAgICAgLy8gUmVjb3JkIGJpbmRpbmcgKG9yIHB1c2gpCisgICAgICAgIGlmIChkZXNjcmlwdG9yX3NldCAhPSBsYXN0X2JvdW5kLnB1c2hfZGVzY3JpcHRvcl9zZXQuZ2V0KCkpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgY2xlYW51cCB0aGUgcHVzaCBkZXNjcmlwdG9ycyBpZiB0aGV5IGFyZW4ndCB0aGUgY3VycmVudGx5IHVzZWQgc2V0LgorICAgICAgICAgICAgcHVzaF9kZXNjcmlwdG9yX2NsZWFudXAobGFzdF9ib3VuZC5wZXJfc2V0W3NldF9pZHhdLmJvdW5kX2Rlc2NyaXB0b3Jfc2V0KTsKKyAgICAgICAgfQorICAgICAgICBsYXN0X2JvdW5kLnBlcl9zZXRbc2V0X2lkeF0uYm91bmRfZGVzY3JpcHRvcl9zZXQgPSBkZXNjcmlwdG9yX3NldDsKKyAgICAgICAgbGFzdF9ib3VuZC5wZXJfc2V0W3NldF9pZHhdLmNvbXBhdF9pZF9mb3Jfc2V0ID0gcGlwZV9jb21wYXRfaWRzW3NldF9pZHhdOyAgLy8gY29tcGF0IGlkcyBhcmUgY2Fub25pY2FsICpwZXIqIHNldCBpbmRleAorCisgICAgICAgIGlmIChkZXNjcmlwdG9yX3NldCkgeworICAgICAgICAgICAgYXV0byBzZXRfZHluYW1pY19kZXNjcmlwdG9yX2NvdW50ID0gZGVzY3JpcHRvcl9zZXQtPkdldER5bmFtaWNEZXNjcmlwdG9yQ291bnQoKTsKKyAgICAgICAgICAgIC8vIFRPRE86IEFkZCBsb2dpYyBmb3IgdHJhY2tpbmcgcHVzaF9kZXNjcmlwdG9yIG9mZnNldHMgKGhlcmUgb3IgaW4gY2FsbGVyKQorICAgICAgICAgICAgaWYgKHNldF9keW5hbWljX2Rlc2NyaXB0b3JfY291bnQgJiYgaW5wdXRfZHluYW1pY19vZmZzZXRzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKmVuZF9vZmZzZXQgPSBpbnB1dF9keW5hbWljX29mZnNldHMgKyBzZXRfZHluYW1pY19kZXNjcmlwdG9yX2NvdW50OworICAgICAgICAgICAgICAgIGxhc3RfYm91bmQucGVyX3NldFtzZXRfaWR4XS5keW5hbWljT2Zmc2V0cyA9IHN0ZDo6dmVjdG9yPHVpbnQzMl90PihpbnB1dF9keW5hbWljX29mZnNldHMsIGVuZF9vZmZzZXQpOworICAgICAgICAgICAgICAgIGlucHV0X2R5bmFtaWNfb2Zmc2V0cyA9IGVuZF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGlucHV0X2R5bmFtaWNfb2Zmc2V0cyA8PSAocF9keW5hbWljX29mZnNldHMgKyBkeW5hbWljX29mZnNldF9jb3VudCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXN0X2JvdW5kLnBlcl9zZXRbc2V0X2lkeF0uZHluYW1pY09mZnNldHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcl9zZXQtPklzUHVzaERlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAgICAgIC8vIENhbid0IGNhY2hlIHZhbGlkYXRpb24gb2YgcHVzaF9kZXNjcmlwdG9ycworICAgICAgICAgICAgICAgIGNiX3N0YXRlLT52YWxpZGF0ZWRfZGVzY3JpcHRvcl9zZXRzLmluc2VydChkZXNjcmlwdG9yX3NldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFVwZGF0ZSB0aGUgYm91bmQgc3RhdGUgZm9yIHRoZSBiaW5kIHBvaW50LCBpbmNsdWRpbmcgdGhlIGVmZmVjdHMgb2YgaW5jb21wYXRpYmxlIHBpcGVsaW5lIGxheW91dHMKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZEJpbmREZXNjcmlwdG9yU2V0cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3Qgc2V0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvclNldHMsIHVpbnQzMl90IGR5bmFtaWNPZmZzZXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcER5bmFtaWNPZmZzZXRzKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGF1dG8gcGlwZWxpbmVfbGF5b3V0ID0gR2V0UGlwZWxpbmVMYXlvdXQobGF5b3V0KTsKKworICAgIC8vIFJlc2l6ZSBiaW5kaW5nIGFycmF5cworICAgIHVpbnQzMl90IGxhc3Rfc2V0X2luZGV4ID0gZmlyc3RTZXQgKyBzZXRDb3VudCAtIDE7CisgICAgaWYgKGxhc3Rfc2V0X2luZGV4ID49IGNiX3N0YXRlLT5sYXN0Qm91bmRbcGlwZWxpbmVCaW5kUG9pbnRdLnBlcl9zZXQuc2l6ZSgpKSB7CisgICAgICAgIGNiX3N0YXRlLT5sYXN0Qm91bmRbcGlwZWxpbmVCaW5kUG9pbnRdLnBlcl9zZXQucmVzaXplKGxhc3Rfc2V0X2luZGV4ICsgMSk7CisgICAgfQorCisgICAgVXBkYXRlTGFzdEJvdW5kRGVzY3JpcHRvclNldHMoY2Jfc3RhdGUsIHBpcGVsaW5lQmluZFBvaW50LCBwaXBlbGluZV9sYXlvdXQsIGZpcnN0U2V0LCBzZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNPZmZzZXRDb3VudCwgcER5bmFtaWNPZmZzZXRzKTsKKyAgICBjYl9zdGF0ZS0+bGFzdEJvdW5kW3BpcGVsaW5lQmluZFBvaW50XS5waXBlbGluZV9sYXlvdXQgPSBsYXlvdXQ7CisgICAgUmVzZXRDb21tYW5kQnVmZmVyUHVzaENvbnN0YW50RGF0YUlmSW5jb21wYXRpYmxlKGNiX3N0YXRlLCBsYXlvdXQpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0U3RhdGUoQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIHVpbnQzMl90IHNldCwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yV3JpdGVzKSB7CisgICAgY29uc3QgYXV0byAmcGlwZWxpbmVfbGF5b3V0ID0gR2V0UGlwZWxpbmVMYXlvdXQobGF5b3V0KTsKKyAgICAvLyBTaG9ydCBjaXJjdWl0IGludmFsaWQgdXBkYXRlcworICAgIGlmICghcGlwZWxpbmVfbGF5b3V0IHx8IChzZXQgPj0gcGlwZWxpbmVfbGF5b3V0LT5zZXRfbGF5b3V0cy5zaXplKCkpIHx8ICFwaXBlbGluZV9sYXlvdXQtPnNldF9sYXlvdXRzW3NldF0gfHwKKyAgICAgICAgIXBpcGVsaW5lX2xheW91dC0+c2V0X2xheW91dHNbc2V0XS0+SXNQdXNoRGVzY3JpcHRvcigpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXZSBuZWVkIGEgZGVzY3JpcHRvciBzZXQgdG8gdXBkYXRlIHRoZSBiaW5kaW5ncyB3aXRoLCBjb21wYXRpYmxlIHdpdGggdGhlIHBhc3NlZCBsYXlvdXQKKyAgICBjb25zdCBhdXRvIGRzbCA9IHBpcGVsaW5lX2xheW91dC0+c2V0X2xheW91dHNbc2V0XTsKKyAgICBhdXRvICZsYXN0X2JvdW5kID0gY2Jfc3RhdGUtPmxhc3RCb3VuZFtwaXBlbGluZUJpbmRQb2ludF07CisgICAgYXV0byAmcHVzaF9kZXNjcmlwdG9yX3NldCA9IGxhc3RfYm91bmQucHVzaF9kZXNjcmlwdG9yX3NldDsKKyAgICAvLyBJZiB3ZSBhcmUgZGlzdHVyYmluZyB0aGUgY3VycmVudCBwdXNoX2Rlc3JpcHRvcl9zZXQgY2xlYXIgaXQKKyAgICBpZiAoIXB1c2hfZGVzY3JpcHRvcl9zZXQgfHwgIUNvbXBhdEZvclNldChzZXQsIGxhc3RfYm91bmQsIHBpcGVsaW5lX2xheW91dC0+Y29tcGF0X2Zvcl9zZXQpKSB7CisgICAgICAgIGxhc3RfYm91bmQuVW5iaW5kQW5kUmVzZXRQdXNoRGVzY3JpcHRvclNldChuZXcgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0KDAsIG51bGxwdHIsIGRzbCwgMCwgdGhpcywgcmVwb3J0X2RhdGEpKTsKKyAgICB9CisKKyAgICBVcGRhdGVMYXN0Qm91bmREZXNjcmlwdG9yU2V0cyhjYl9zdGF0ZSwgcGlwZWxpbmVCaW5kUG9pbnQsIHBpcGVsaW5lX2xheW91dCwgc2V0LCAxLCBudWxscHRyLCBwdXNoX2Rlc2NyaXB0b3Jfc2V0LmdldCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIGxhc3RfYm91bmQucGlwZWxpbmVfbGF5b3V0ID0gbGF5b3V0OworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBlaXRoZXIgdGhlIG5ldyBvciBleHRhbnQgcHVzaF9kZXNjcmlwdG9yIHNldCAuLi4gZG8gdGhlIHdyaXRlIHVwZGF0ZXMgYWdhaW5zdCBpdAorICAgIHB1c2hfZGVzY3JpcHRvcl9zZXQtPlBlcmZvcm1QdXNoRGVzY3JpcHRvcnNVcGRhdGUodGhpcywgZGVzY3JpcHRvcldyaXRlQ291bnQsIHBEZXNjcmlwdG9yV3JpdGVzKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNldCwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JXcml0ZXMpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRTdGF0ZShjYl9zdGF0ZSwgcGlwZWxpbmVCaW5kUG9pbnQsIGxheW91dCwgc2V0LCBkZXNjcmlwdG9yV3JpdGVDb3VudCwgcERlc2NyaXB0b3JXcml0ZXMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kUHVzaENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ3Mgc3RhZ2VGbGFncywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcFZhbHVlcykgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBpZiAoY2Jfc3RhdGUgIT0gbnVsbHB0cikgeworICAgICAgICBSZXNldENvbW1hbmRCdWZmZXJQdXNoQ29uc3RhbnREYXRhSWZJbmNvbXBhdGlibGUoY2Jfc3RhdGUsIGxheW91dCk7CisKKyAgICAgICAgYXV0byAmcHVzaF9jb25zdGFudF9kYXRhID0gY2Jfc3RhdGUtPnB1c2hfY29uc3RhbnRfZGF0YTsKKyAgICAgICAgYXNzZXJ0KChvZmZzZXQgKyBzaXplKSA8PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocHVzaF9jb25zdGFudF9kYXRhLnNpemUoKSkpOworICAgICAgICBzdGQ6Om1lbWNweShwdXNoX2NvbnN0YW50X2RhdGEuZGF0YSgpICsgb2Zmc2V0LCBwVmFsdWVzLCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oc2l6ZSkpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQmluZEluZGV4QnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbmRleFR5cGUgaW5kZXhUeXBlKSB7CisgICAgYXV0byBidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShidWZmZXIpOworICAgIGF1dG8gY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworCisgICAgY2Jfc3RhdGUtPnN0YXR1cyB8PSBDQlNUQVRVU19JTkRFWF9CVUZGRVJfQk9VTkQ7CisgICAgY2Jfc3RhdGUtPmluZGV4X2J1ZmZlcl9iaW5kaW5nLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBjYl9zdGF0ZS0+aW5kZXhfYnVmZmVyX2JpbmRpbmcuc2l6ZSA9IGJ1ZmZlcl9zdGF0ZS0+Y3JlYXRlSW5mby5zaXplOworICAgIGNiX3N0YXRlLT5pbmRleF9idWZmZXJfYmluZGluZy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgY2Jfc3RhdGUtPmluZGV4X2J1ZmZlcl9iaW5kaW5nLmluZGV4X3R5cGUgPSBpbmRleFR5cGU7CisgICAgLy8gQWRkIGJpbmRpbmcgZm9yIHRoaXMgaW5kZXggYnVmZmVyIHRvIHRoaXMgY29tbWFuZGJ1ZmZlcgorICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nQnVmZmVyKGNiX3N0YXRlLCBidWZmZXJfc3RhdGUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRCaW5kVmVydGV4QnVmZmVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmluZGluZ0NvdW50LCBjb25zdCBWa0J1ZmZlciAqcEJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgKnBPZmZzZXRzKSB7CisgICAgYXV0byBjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisKKyAgICB1aW50MzJfdCBlbmQgPSBmaXJzdEJpbmRpbmcgKyBiaW5kaW5nQ291bnQ7CisgICAgaWYgKGNiX3N0YXRlLT5jdXJyZW50X3ZlcnRleF9idWZmZXJfYmluZGluZ19pbmZvLnZlcnRleF9idWZmZXJfYmluZGluZ3Muc2l6ZSgpIDwgZW5kKSB7CisgICAgICAgIGNiX3N0YXRlLT5jdXJyZW50X3ZlcnRleF9idWZmZXJfYmluZGluZ19pbmZvLnZlcnRleF9idWZmZXJfYmluZGluZ3MucmVzaXplKGVuZCk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRpbmdDb3VudDsgKytpKSB7CisgICAgICAgIGF1dG8gJnZlcnRleF9idWZmZXJfYmluZGluZyA9IGNiX3N0YXRlLT5jdXJyZW50X3ZlcnRleF9idWZmZXJfYmluZGluZ19pbmZvLnZlcnRleF9idWZmZXJfYmluZGluZ3NbaSArIGZpcnN0QmluZGluZ107CisgICAgICAgIHZlcnRleF9idWZmZXJfYmluZGluZy5idWZmZXIgPSBwQnVmZmVyc1tpXTsKKyAgICAgICAgdmVydGV4X2J1ZmZlcl9iaW5kaW5nLm9mZnNldCA9IHBPZmZzZXRzW2ldOworICAgICAgICAvLyBBZGQgYmluZGluZyBmb3IgdGhpcyB2ZXJ0ZXggYnVmZmVyIHRvIHRoaXMgY29tbWFuZGJ1ZmZlcgorICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0J1ZmZlcihjYl9zdGF0ZSwgR2V0QnVmZmVyU3RhdGUocEJ1ZmZlcnNbaV0pKTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDbWRVcGRhdGVCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIGRhdGFTaXplLCBjb25zdCB2b2lkICpwRGF0YSkgeworICAgIGF1dG8gY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGF1dG8gZHN0X2J1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGRzdEJ1ZmZlcik7CisKKyAgICAvLyBVcGRhdGUgYmluZGluZ3MgYmV0d2VlbiBidWZmZXIgYW5kIGNtZCBidWZmZXIKKyAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0J1ZmZlcihjYl9zdGF0ZSwgZHN0X2J1ZmZlcl9zdGF0ZSk7Cit9CisKK2Jvb2wgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6U2V0RXZlbnRTdGFnZU1hc2soVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRvU3RhZ2VNYXAgKmxvY2FsRXZlbnRUb1N0YWdlTWFwKSB7CisgICAgKCpsb2NhbEV2ZW50VG9TdGFnZU1hcClbZXZlbnRdID0gc3RhZ2VNYXNrOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kU2V0RXZlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2spIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgYXV0byBldmVudF9zdGF0ZSA9IEdldEV2ZW50U3RhdGUoZXZlbnQpOworICAgIGlmIChldmVudF9zdGF0ZSkgeworICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZyhldmVudF9zdGF0ZS0+Y2JfYmluZGluZ3MsIFZ1bGthblR5cGVkSGFuZGxlKGV2ZW50LCBrVnVsa2FuT2JqZWN0VHlwZUV2ZW50LCBldmVudF9zdGF0ZSksIGNiX3N0YXRlKTsKKyAgICB9CisgICAgY2Jfc3RhdGUtPmV2ZW50cy5wdXNoX2JhY2soZXZlbnQpOworICAgIGlmICghY2Jfc3RhdGUtPndhaXRlZEV2ZW50cy5jb3VudChldmVudCkpIHsKKyAgICAgICAgY2Jfc3RhdGUtPndyaXRlRXZlbnRzQmVmb3JlV2FpdC5wdXNoX2JhY2soZXZlbnQpOworICAgIH0KKyAgICBjYl9zdGF0ZS0+ZXZlbnRVcGRhdGVzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgW2V2ZW50LCBzdGFnZU1hc2tdKGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldmljZV9kYXRhLCBib29sIGRvX3ZhbGlkYXRlLCBFdmVudFRvU3RhZ2VNYXAgKmxvY2FsRXZlbnRUb1N0YWdlTWFwKSB7CisgICAgICAgICAgICByZXR1cm4gU2V0RXZlbnRTdGFnZU1hc2soZXZlbnQsIHN0YWdlTWFzaywgbG9jYWxFdmVudFRvU3RhZ2VNYXApOworICAgICAgICB9KTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kUmVzZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGF1dG8gZXZlbnRfc3RhdGUgPSBHZXRFdmVudFN0YXRlKGV2ZW50KTsKKyAgICBpZiAoZXZlbnRfc3RhdGUpIHsKKyAgICAgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmcoZXZlbnRfc3RhdGUtPmNiX2JpbmRpbmdzLCBWdWxrYW5UeXBlZEhhbmRsZShldmVudCwga1Z1bGthbk9iamVjdFR5cGVFdmVudCwgZXZlbnRfc3RhdGUpLCBjYl9zdGF0ZSk7CisgICAgfQorICAgIGNiX3N0YXRlLT5ldmVudHMucHVzaF9iYWNrKGV2ZW50KTsKKyAgICBpZiAoIWNiX3N0YXRlLT53YWl0ZWRFdmVudHMuY291bnQoZXZlbnQpKSB7CisgICAgICAgIGNiX3N0YXRlLT53cml0ZUV2ZW50c0JlZm9yZVdhaXQucHVzaF9iYWNrKGV2ZW50KTsKKyAgICB9CisKKyAgICBjYl9zdGF0ZS0+ZXZlbnRVcGRhdGVzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgW2V2ZW50XShjb25zdCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyICosIGJvb2wgZG9fdmFsaWRhdGUsIEV2ZW50VG9TdGFnZU1hcCAqbG9jYWxFdmVudFRvU3RhZ2VNYXApIHsKKyAgICAgICAgICAgIHJldHVybiBTZXRFdmVudFN0YWdlTWFzayhldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3MoMCksIGxvY2FsRXZlbnRUb1N0YWdlTWFwKTsKKyAgICAgICAgfSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZFdhaXRFdmVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGV2ZW50Q291bnQsIGNvbnN0IFZrRXZlbnQgKnBFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNvdXJjZVN0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciAqcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbW9yeUJhcnJpZXJzKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBldmVudENvdW50OyArK2kpIHsKKyAgICAgICAgYXV0byBldmVudF9zdGF0ZSA9IEdldEV2ZW50U3RhdGUocEV2ZW50c1tpXSk7CisgICAgICAgIGlmIChldmVudF9zdGF0ZSkgeworICAgICAgICAgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmcoZXZlbnRfc3RhdGUtPmNiX2JpbmRpbmdzLCBWdWxrYW5UeXBlZEhhbmRsZShwRXZlbnRzW2ldLCBrVnVsa2FuT2JqZWN0VHlwZUV2ZW50LCBldmVudF9zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9zdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2Jfc3RhdGUtPndhaXRlZEV2ZW50cy5pbnNlcnQocEV2ZW50c1tpXSk7CisgICAgICAgIGNiX3N0YXRlLT5ldmVudHMucHVzaF9iYWNrKHBFdmVudHNbaV0pOworICAgIH0KK30KKworYm9vbCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpTZXRRdWVyeVN0YXRlKFF1ZXJ5T2JqZWN0IG9iamVjdCwgUXVlcnlTdGF0ZSB2YWx1ZSwgUXVlcnlNYXAgKmxvY2FsUXVlcnlUb1N0YXRlTWFwKSB7CisgICAgKCpsb2NhbFF1ZXJ5VG9TdGF0ZU1hcClbb2JqZWN0XSA9IHZhbHVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpTZXRRdWVyeVN0YXRlTXVsdGkoVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBmaXJzdFF1ZXJ5LCB1aW50MzJfdCBxdWVyeUNvdW50LCBRdWVyeVN0YXRlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlNYXAgKmxvY2FsUXVlcnlUb1N0YXRlTWFwKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHF1ZXJ5Q291bnQ7IGkrKykgeworICAgICAgICBRdWVyeU9iamVjdCBvYmplY3QgPSB7cXVlcnlQb29sLCBmaXJzdFF1ZXJ5ICsgaX07CisgICAgICAgICgqbG9jYWxRdWVyeVRvU3RhdGVNYXApW29iamVjdF0gPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitRdWVyeVN0YXRlIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OkdldFF1ZXJ5U3RhdGUoY29uc3QgUXVlcnlNYXAgKmxvY2FsUXVlcnlUb1N0YXRlTWFwLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVlcnlJbmRleCkgY29uc3QgeworICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5ID0ge3F1ZXJ5UG9vbCwgcXVlcnlJbmRleH07CisKKyAgICBjb25zdCBzdGQ6OmFycmF5PGNvbnN0IGRlY2x0eXBlKHF1ZXJ5VG9TdGF0ZU1hcCkgKiwgMj4gbWFwX2xpc3QgPSB7bG9jYWxRdWVyeVRvU3RhdGVNYXAsICZxdWVyeVRvU3RhdGVNYXB9OworCisgICAgZm9yIChjb25zdCBhdXRvIG1hcCA6IG1hcF9saXN0KSB7CisgICAgICAgIGF1dG8gcXVlcnlfZGF0YSA9IG1hcC0+ZmluZChxdWVyeSk7CisgICAgICAgIGlmIChxdWVyeV9kYXRhICE9IG1hcC0+ZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeV9kYXRhLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFFVRVJZU1RBVEVfVU5LTk9XTjsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZWNvcmRDbWRCZWdpblF1ZXJ5KENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLCBjb25zdCBRdWVyeU9iamVjdCAmcXVlcnlfb2JqKSB7CisgICAgaWYgKGRpc2FibGVkLnF1ZXJ5X3ZhbGlkYXRpb24pIHJldHVybjsKKyAgICBjYl9zdGF0ZS0+YWN0aXZlUXVlcmllcy5pbnNlcnQocXVlcnlfb2JqKTsKKyAgICBjYl9zdGF0ZS0+c3RhcnRlZFF1ZXJpZXMuaW5zZXJ0KHF1ZXJ5X29iaik7CisgICAgY2Jfc3RhdGUtPnF1ZXJ5VXBkYXRlcy5lbXBsYWNlX2JhY2soCisgICAgICAgIFtxdWVyeV9vYmpdKGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldmljZV9kYXRhLCBib29sIGRvX3ZhbGlkYXRlLCBRdWVyeU1hcCAqbG9jYWxRdWVyeVRvU3RhdGVNYXApIHsKKyAgICAgICAgICAgIFNldFF1ZXJ5U3RhdGUocXVlcnlfb2JqLCBRVUVSWVNUQVRFX1JVTk5JTkcsIGxvY2FsUXVlcnlUb1N0YXRlTWFwKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSk7CisgICAgYXV0byBwb29sX3N0YXRlID0gR2V0UXVlcnlQb29sU3RhdGUocXVlcnlfb2JqLnBvb2wpOworICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nKHBvb2xfc3RhdGUtPmNiX2JpbmRpbmdzLCBWdWxrYW5UeXBlZEhhbmRsZShxdWVyeV9vYmoucG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIHBvb2xfc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZEJlZ2luUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmxhZ3MgZmxhZ3MpIHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuOworICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5ID0ge3F1ZXJ5UG9vbCwgc2xvdH07CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIFJlY29yZENtZEJlZ2luUXVlcnkoY2Jfc3RhdGUsIHF1ZXJ5KTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZWNvcmRDbWRFbmRRdWVyeShDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgY29uc3QgUXVlcnlPYmplY3QgJnF1ZXJ5X29iaikgeworICAgIGlmIChkaXNhYmxlZC5xdWVyeV92YWxpZGF0aW9uKSByZXR1cm47CisgICAgY2Jfc3RhdGUtPmFjdGl2ZVF1ZXJpZXMuZXJhc2UocXVlcnlfb2JqKTsKKyAgICBjYl9zdGF0ZS0+cXVlcnlVcGRhdGVzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgW3F1ZXJ5X29ial0oY29uc3QgVmFsaWRhdGlvblN0YXRlVHJhY2tlciAqZGV2aWNlX2RhdGEsIGJvb2wgZG9fdmFsaWRhdGUsIFF1ZXJ5TWFwICpsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCkgeworICAgICAgICAgICAgcmV0dXJuIFNldFF1ZXJ5U3RhdGUocXVlcnlfb2JqLCBRVUVSWVNUQVRFX0VOREVELCBsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCk7CisgICAgICAgIH0pOworICAgIGF1dG8gcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5X29iai5wb29sKTsKKyAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZyhwb29sX3N0YXRlLT5jYl9iaW5kaW5ncywgVnVsa2FuVHlwZWRIYW5kbGUocXVlcnlfb2JqLnBvb2wsIGtWdWxrYW5PYmplY3RUeXBlUXVlcnlQb29sLCBwb29sX3N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDbWRFbmRRdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBzbG90KSB7CisgICAgaWYgKGRpc2FibGVkLnF1ZXJ5X3ZhbGlkYXRpb24pIHJldHVybjsKKyAgICBRdWVyeU9iamVjdCBxdWVyeV9vYmogPSB7cXVlcnlQb29sLCBzbG90fTsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgUmVjb3JkQ21kRW5kUXVlcnkoY2Jfc3RhdGUsIHF1ZXJ5X29iaik7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDbWRSZXNldFF1ZXJ5UG9vbChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQpIHsKKyAgICBpZiAoZGlzYWJsZWQucXVlcnlfdmFsaWRhdGlvbikgcmV0dXJuOworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKworICAgIGNiX3N0YXRlLT5xdWVyeVVwZGF0ZXMuZW1wbGFjZV9iYWNrKFtxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnRdKGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldmljZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9fdmFsaWRhdGUsIFF1ZXJ5TWFwICpsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCkgeworICAgICAgICByZXR1cm4gU2V0UXVlcnlTdGF0ZU11bHRpKHF1ZXJ5UG9vbCwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgUVVFUllTVEFURV9SRVNFVCwgbG9jYWxRdWVyeVRvU3RhdGVNYXApOworICAgIH0pOworICAgIGF1dG8gcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5UG9vbCk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmcocG9vbF9zdGF0ZS0+Y2JfYmluZGluZ3MsIFZ1bGthblR5cGVkSGFuZGxlKHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIHBvb2xfc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgVmtCdWZmZXIgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKSB7CisgICAgaWYgKGRpc2FibGVkLnF1ZXJ5X3ZhbGlkYXRpb24pIHJldHVybjsKKyAgICBhdXRvIGNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhdXRvIGRzdF9idWZmX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoZHN0QnVmZmVyKTsKKyAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0J1ZmZlcihjYl9zdGF0ZSwgZHN0X2J1ZmZfc3RhdGUpOworICAgIGF1dG8gcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5UG9vbCk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmcocG9vbF9zdGF0ZS0+Y2JfYmluZGluZ3MsIFZ1bGthblR5cGVkSGFuZGxlKHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIHBvb2xfc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZFdyaXRlVGltZXN0YW1wKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lU3RhZ2VGbGFnQml0cyBwaXBlbGluZVN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCkgeworICAgIGlmIChkaXNhYmxlZC5xdWVyeV92YWxpZGF0aW9uKSByZXR1cm47CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGF1dG8gcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5UG9vbCk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmcocG9vbF9zdGF0ZS0+Y2JfYmluZGluZ3MsIFZ1bGthblR5cGVkSGFuZGxlKHF1ZXJ5UG9vbCwga1Z1bGthbk9iamVjdFR5cGVRdWVyeVBvb2wsIHBvb2xfc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX3N0YXRlKTsKKyAgICBRdWVyeU9iamVjdCBxdWVyeSA9IHtxdWVyeVBvb2wsIHNsb3R9OworICAgIGNiX3N0YXRlLT5xdWVyeVVwZGF0ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICBbcXVlcnldKGNvbnN0IFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgKmRldmljZV9kYXRhLCBib29sIGRvX3ZhbGlkYXRlLCBRdWVyeU1hcCAqbG9jYWxRdWVyeVRvU3RhdGVNYXApIHsKKyAgICAgICAgICAgIHJldHVybiBTZXRRdWVyeVN0YXRlKHF1ZXJ5LCBRVUVSWVNUQVRFX0VOREVELCBsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCk7CisgICAgICAgIH0pOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlRnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0ZyYW1lYnVmZmVyICpwRnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgLy8gU2hhZG93IGNyZWF0ZSBpbmZvIGFuZCBzdG9yZSBpbiBtYXAKKyAgICBhdXRvIGZiX3N0YXRlID0gc3RkOjptYWtlX3NoYXJlZDxGUkFNRUJVRkZFUl9TVEFURT4oKnBGcmFtZWJ1ZmZlciwgcENyZWF0ZUluZm8sIEdldFJlbmRlclBhc3NTaGFyZWQocENyZWF0ZUluZm8tPnJlbmRlclBhc3MpKTsKKworICAgIGlmICgocENyZWF0ZUluZm8tPmZsYWdzICYgVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSKSA9PSAwKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFZrSW1hZ2VWaWV3IHZpZXcgPSBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldOworICAgICAgICAgICAgYXV0byB2aWV3X3N0YXRlID0gR2V0SW1hZ2VWaWV3U3RhdGUodmlldyk7CisgICAgICAgICAgICBpZiAoIXZpZXdfc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmcmFtZUJ1ZmZlck1hcFsqcEZyYW1lYnVmZmVyXSA9IHN0ZDo6bW92ZShmYl9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkUmVuZGVyUGFzc0RBRyhSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVOREVSX1BBU1NfU1RBVEUgKnJlbmRlcl9wYXNzKSB7CisgICAgYXV0byAmc3VicGFzc190b19ub2RlID0gcmVuZGVyX3Bhc3MtPnN1YnBhc3NUb05vZGU7CisgICAgc3VicGFzc190b19ub2RlLnJlc2l6ZShwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50KTsKKyAgICBhdXRvICZzZWxmX2RlcGVuZGVuY2llcyA9IHJlbmRlcl9wYXNzLT5zZWxmX2RlcGVuZGVuY2llczsKKyAgICBzZWxmX2RlcGVuZGVuY2llcy5yZXNpemUocENyZWF0ZUluZm8tPnN1YnBhc3NDb3VudCk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPnN1YnBhc3NDb3VudDsgKytpKSB7CisgICAgICAgIHN1YnBhc3NfdG9fbm9kZVtpXS5wYXNzID0gaTsKKyAgICAgICAgc2VsZl9kZXBlbmRlbmNpZXNbaV0uY2xlYXIoKTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5kZXBlbmRlbmN5Q291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBWa1N1YnBhc3NEZXBlbmRlbmN5MktIUiAmZGVwZW5kZW5jeSA9IHBDcmVhdGVJbmZvLT5wRGVwZW5kZW5jaWVzW2ldOworICAgICAgICBpZiAoKGRlcGVuZGVuY3kuc3JjU3VicGFzcyAhPSBWS19TVUJQQVNTX0VYVEVSTkFMKSAmJiAoZGVwZW5kZW5jeS5kc3RTdWJwYXNzICE9IFZLX1NVQlBBU1NfRVhURVJOQUwpKSB7CisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5zcmNTdWJwYXNzID09IGRlcGVuZGVuY3kuZHN0U3VicGFzcykgeworICAgICAgICAgICAgICAgIHNlbGZfZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3kuc3JjU3VicGFzc10ucHVzaF9iYWNrKGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWJwYXNzX3RvX25vZGVbZGVwZW5kZW5jeS5kc3RTdWJwYXNzXS5wcmV2LnB1c2hfYmFjayhkZXBlbmRlbmN5LnNyY1N1YnBhc3MpOworICAgICAgICAgICAgICAgIHN1YnBhc3NfdG9fbm9kZVtkZXBlbmRlbmN5LnNyY1N1YnBhc3NdLm5leHQucHVzaF9iYWNrKGRlcGVuZGVuY3kuZHN0U3VicGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIE1hcmtBdHRhY2htZW50Rmlyc3RVc2UoUkVOREVSX1BBU1NfU1RBVEUgKnJlbmRlcl9wYXNzLCB1aW50MzJfdCBpbmRleCwgYm9vbCBpc19yZWFkKSB7CisgICAgaWYgKGluZGV4ID09IFZLX0FUVEFDSE1FTlRfVU5VU0VEKSByZXR1cm47CisKKyAgICBpZiAoIXJlbmRlcl9wYXNzLT5hdHRhY2htZW50X2ZpcnN0X3JlYWQuY291bnQoaW5kZXgpKSByZW5kZXJfcGFzcy0+YXR0YWNobWVudF9maXJzdF9yZWFkW2luZGV4XSA9IGlzX3JlYWQ7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkQ3JlYXRlUmVuZGVyUGFzc1N0YXRlKFJlbmRlclBhc3NDcmVhdGVWZXJzaW9uIHJwX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UkVOREVSX1BBU1NfU1RBVEU+ICZyZW5kZXJfcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVuZGVyUGFzcyAqcFJlbmRlclBhc3MpIHsKKyAgICByZW5kZXJfcGFzcy0+cmVuZGVyUGFzcyA9ICpwUmVuZGVyUGFzczsKKyAgICBhdXRvIGNyZWF0ZV9pbmZvID0gcmVuZGVyX3Bhc3MtPmNyZWF0ZUluZm8ucHRyKCk7CisKKyAgICBSZWNvcmRSZW5kZXJQYXNzREFHKFJFTkRFUl9QQVNTX1ZFUlNJT05fMSwgY3JlYXRlX2luZm8sIHJlbmRlcl9wYXNzLmdldCgpKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVfaW5mby0+c3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSICZzdWJwYXNzID0gY3JlYXRlX2luZm8tPnBTdWJwYXNzZXNbaV07CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50OyArK2opIHsKKyAgICAgICAgICAgIE1hcmtBdHRhY2htZW50Rmlyc3RVc2UocmVuZGVyX3Bhc3MuZ2V0KCksIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHNbal0uYXR0YWNobWVudCwgZmFsc2UpOworCisgICAgICAgICAgICAvLyByZXNvbHZlIGF0dGFjaG1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHdyaXR0ZW4KKyAgICAgICAgICAgIGlmIChzdWJwYXNzLnBSZXNvbHZlQXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgICAgICBNYXJrQXR0YWNobWVudEZpcnN0VXNlKHJlbmRlcl9wYXNzLmdldCgpLCBzdWJwYXNzLnBSZXNvbHZlQXR0YWNobWVudHNbal0uYXR0YWNobWVudCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSB7CisgICAgICAgICAgICBNYXJrQXR0YWNobWVudEZpcnN0VXNlKHJlbmRlcl9wYXNzLmdldCgpLCBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHN1YnBhc3MuaW5wdXRBdHRhY2htZW50Q291bnQ7ICsraikgeworICAgICAgICAgICAgTWFya0F0dGFjaG1lbnRGaXJzdFVzZShyZW5kZXJfcGFzcy5nZXQoKSwgc3VicGFzcy5wSW5wdXRBdHRhY2htZW50c1tqXS5hdHRhY2htZW50LCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEV2ZW4gdGhvdWdoIHJlbmRlcl9wYXNzIGlzIGFuIHJ2YWx1ZS1yZWYgcGFyYW1ldGVyLCBzdGlsbCBtdXN0IG1vdmUgcy50LiBtb3ZlIGFzc2lnbm1lbnQgaXMgaW52b2tlZC4KKyAgICByZW5kZXJQYXNzTWFwWypwUmVuZGVyUGFzc10gPSBzdGQ6Om1vdmUocmVuZGVyX3Bhc3MpOworfQorCisvLyBTdHlsZSBub3RlOgorLy8gVXNlIG9mIHJ2YWx1ZSByZWZlcmVuY2UgZXhjZWVkcyByZWNjb21tZW5kZWQgdXNhZ2Ugb2YgcnZhbHVlIHJlZnMgaW4gZ29vZ2xlIHN0eWxlIGd1aWRlLCBidXQgaW50ZW50aW9uYWxseSBmb3JjZXMgY2FsbGVyIHRvIG1vdmUKKy8vIG9yIGNvcHkuICBUaGlzIGlzIGNsZWFyZXIgdGhhbiBwYXNzaW5nIGEgcG9pbnRlciB0byBzaGFyZWRfcHRyIGFuZCBhdm9pZHMgdGhlIGF0b21pYyBpbmNyZW1lbnQvZGVjcmVtZW50IG9mIHNoYXJlZF9wdHIgY29weQorLy8gY29uc3RydWN0aW9uIG9yIGFzc2lnbm1lbnQuCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MgKnBSZW5kZXJQYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgYXV0byByZW5kZXJfcGFzc19zdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UkVOREVSX1BBU1NfU1RBVEU+KHBDcmVhdGVJbmZvKTsKKyAgICBSZWNvcmRDcmVhdGVSZW5kZXJQYXNzU3RhdGUoUkVOREVSX1BBU1NfVkVSU0lPTl8xLCByZW5kZXJfcGFzc19zdGF0ZSwgcFJlbmRlclBhc3MpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzczJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MgKnBSZW5kZXJQYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIGF1dG8gcmVuZGVyX3Bhc3Nfc3RhdGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJFTkRFUl9QQVNTX1NUQVRFPihwQ3JlYXRlSW5mbyk7CisgICAgUmVjb3JkQ3JlYXRlUmVuZGVyUGFzc1N0YXRlKFJFTkRFUl9QQVNTX1ZFUlNJT05fMiwgcmVuZGVyX3Bhc3Nfc3RhdGUsIHBSZW5kZXJQYXNzKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZWNvcmRDbWRCZWdpblJlbmRlclBhc3NTdGF0ZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBhdXRvIHJlbmRlcl9wYXNzX3N0YXRlID0gcFJlbmRlclBhc3NCZWdpbiA/IEdldFJlbmRlclBhc3NTdGF0ZShwUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKSA6IG51bGxwdHI7CisgICAgYXV0byBmcmFtZWJ1ZmZlciA9IHBSZW5kZXJQYXNzQmVnaW4gPyBHZXRGcmFtZWJ1ZmZlclN0YXRlKHBSZW5kZXJQYXNzQmVnaW4tPmZyYW1lYnVmZmVyKSA6IG51bGxwdHI7CisKKyAgICBpZiAocmVuZGVyX3Bhc3Nfc3RhdGUpIHsKKyAgICAgICAgY2Jfc3RhdGUtPmFjdGl2ZUZyYW1lYnVmZmVyID0gcFJlbmRlclBhc3NCZWdpbi0+ZnJhbWVidWZmZXI7CisgICAgICAgIGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzID0gcmVuZGVyX3Bhc3Nfc3RhdGU7CisgICAgICAgIC8vIFRoaXMgaXMgYSBzaGFsbG93IGNvcHkgYXMgdGhhdCBpcyBhbGwgdGhhdCBpcyBuZWVkZWQgZm9yIG5vdworICAgICAgICBjYl9zdGF0ZS0+YWN0aXZlUmVuZGVyUGFzc0JlZ2luSW5mbyA9ICpwUmVuZGVyUGFzc0JlZ2luOworICAgICAgICBjYl9zdGF0ZS0+YWN0aXZlU3VicGFzcyA9IDA7CisgICAgICAgIGNiX3N0YXRlLT5hY3RpdmVTdWJwYXNzQ29udGVudHMgPSBjb250ZW50czsKKyAgICAgICAgY2Jfc3RhdGUtPmZyYW1lYnVmZmVycy5pbnNlcnQocFJlbmRlclBhc3NCZWdpbi0+ZnJhbWVidWZmZXIpOworICAgICAgICAvLyBDb25uZWN0IHRoaXMgZnJhbWVidWZmZXIgYW5kIGl0cyBjaGlsZHJlbiB0byB0aGlzIGNtZEJ1ZmZlcgorICAgICAgICBBZGRGcmFtZWJ1ZmZlckJpbmRpbmcoY2Jfc3RhdGUsIGZyYW1lYnVmZmVyKTsKKyAgICAgICAgLy8gQ29ubmVjdCB0aGlzIFJQIHRvIGNtZEJ1ZmZlcgorICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZyhyZW5kZXJfcGFzc19zdGF0ZS0+Y2JfYmluZGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZ1bGthblR5cGVkSGFuZGxlKHJlbmRlcl9wYXNzX3N0YXRlLT5yZW5kZXJQYXNzLCBrVnVsa2FuT2JqZWN0VHlwZVJlbmRlclBhc3MsIHJlbmRlcl9wYXNzX3N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfc3RhdGUpOworCisgICAgICAgIGF1dG8gY2hhaW5lZF9kZXZpY2VfZ3JvdXBfc3RydWN0ID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8+KHBSZW5kZXJQYXNzQmVnaW4tPnBOZXh0KTsKKyAgICAgICAgaWYgKGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdCkgeworICAgICAgICAgICAgY2Jfc3RhdGUtPmFjdGl2ZV9yZW5kZXJfcGFzc19kZXZpY2VfbWFzayA9IGNoYWluZWRfZGV2aWNlX2dyb3VwX3N0cnVjdC0+ZGV2aWNlTWFzazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNiX3N0YXRlLT5hY3RpdmVfcmVuZGVyX3Bhc3NfZGV2aWNlX21hc2sgPSBjYl9zdGF0ZS0+aW5pdGlhbF9kZXZpY2VfbWFzazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyAqcFJlbmRlclBhc3NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykgeworICAgIFJlY29yZENtZEJlZ2luUmVuZGVyUGFzc1N0YXRlKGNvbW1hbmRCdWZmZXIsIHBSZW5kZXJQYXNzQmVnaW4sIGNvbnRlbnRzKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzMktIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpwUmVuZGVyUGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIgKnBTdWJwYXNzQmVnaW5JbmZvKSB7CisgICAgUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzU3RhdGUoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbiwgcFN1YnBhc3NCZWdpbkluZm8tPmNvbnRlbnRzKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZWNvcmRDbWROZXh0U3VicGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgY2Jfc3RhdGUtPmFjdGl2ZVN1YnBhc3MrKzsKKyAgICBjYl9zdGF0ZS0+YWN0aXZlU3VicGFzc0NvbnRlbnRzID0gY29udGVudHM7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDbWROZXh0U3VicGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpIHsKKyAgICBSZWNvcmRDbWROZXh0U3VicGFzcyhjb21tYW5kQnVmZmVyLCBjb250ZW50cyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDbWROZXh0U3VicGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiAqcFN1YnBhc3NCZWdpbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIgKnBTdWJwYXNzRW5kSW5mbykgeworICAgIFJlY29yZENtZE5leHRTdWJwYXNzKGNvbW1hbmRCdWZmZXIsIHBTdWJwYXNzQmVnaW5JbmZvLT5jb250ZW50cyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkQ21kRW5kUmVuZGVyUGFzc1N0YXRlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT5hY3RpdmVSZW5kZXJQYXNzID0gbnVsbHB0cjsKKyAgICBjYl9zdGF0ZS0+YWN0aXZlU3VicGFzcyA9IDA7CisgICAgY2Jfc3RhdGUtPmFjdGl2ZUZyYW1lYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKSB7CisgICAgUmVjb3JkQ21kRW5kUmVuZGVyUGFzc1N0YXRlKGNvbW1hbmRCdWZmZXIpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTdWJwYXNzRW5kSW5mb0tIUiAqcFN1YnBhc3NFbmRJbmZvKSB7CisgICAgUmVjb3JkQ21kRW5kUmVuZGVyUGFzc1N0YXRlKGNvbW1hbmRCdWZmZXIpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWRFeGVjdXRlQ29tbWFuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJzQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyICpwQ29tbWFuZEJ1ZmZlcnMpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBDTURfQlVGRkVSX1NUQVRFICpzdWJfY2Jfc3RhdGUgPSBOVUxMOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb21tYW5kQnVmZmVyc0NvdW50OyBpKyspIHsKKyAgICAgICAgc3ViX2NiX3N0YXRlID0gR2V0Q0JTdGF0ZShwQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICBhc3NlcnQoc3ViX2NiX3N0YXRlKTsKKyAgICAgICAgaWYgKCEoc3ViX2NiX3N0YXRlLT5iZWdpbkluZm8uZmxhZ3MgJiBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCkpIHsKKyAgICAgICAgICAgIGlmIChjYl9zdGF0ZS0+YmVnaW5JbmZvLmZsYWdzICYgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBCZWNhdXNlIHRoaXMgaXMgYSBzdGF0ZSBjaGFuZ2UsIGNsZWFyaW5nIHRoZSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCBuZWVkcyB0byBiZSBtb3ZlZAorICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIHZhbGlkYXRpb24gc3RlcCB0byB0aGUgcmVjb3JkaW5nIHN0ZXAKKyAgICAgICAgICAgICAgICBjYl9zdGF0ZS0+YmVnaW5JbmZvLmZsYWdzICY9IH5WS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb3BhZ2F0ZSBpbml0YWwgbGF5b3V0IGFuZCBjdXJyZW50IGxheW91dCBzdGF0ZSB0byB0aGUgcHJpbWFyeSBjbWQgYnVmZmVyCisgICAgICAgIC8vIE5PVEU6IFRoZSB1cGRhdGUvcG9wdWxhdGlvbiBvZiB0aGUgaW1hZ2VfbGF5b3V0X21hcCBpcyBkb25lIGluIENvcmVDaGVja3MsIGJ1dCBmb3Igb3RoZXIgY2xhc3NlcyBkZXJpdmVkIGZyb20KKyAgICAgICAgLy8gVmFsaWRhdGlvblN0YXRlVHJhY2tlciB0aGVzZSBtYXBzIHdpbGwgYmUgZW1wdHksIHNvIGxlYXZpbmcgdGhlIHByb3BhZ2F0aW9uIGluIHRoZSB0aGUgc3RhdGUgdHJhY2tlciBzaG91bGQgYmUgYSBuby1vcAorICAgICAgICAvLyBmb3IgdGhvc2Ugb3RoZXIgY2xhc3Nlcy4KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZzdWJfbGF5b3V0X21hcF9lbnRyeSA6IHN1Yl9jYl9zdGF0ZS0+aW1hZ2VfbGF5b3V0X21hcCkgeworICAgICAgICAgICAgY29uc3QgYXV0byBpbWFnZSA9IHN1Yl9sYXlvdXRfbWFwX2VudHJ5LmZpcnN0OworICAgICAgICAgICAgY29uc3QgYXV0byAqaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGltYWdlKTsKKyAgICAgICAgICAgIGlmICghaW1hZ2Vfc3RhdGUpIGNvbnRpbnVlOyAgLy8gQ2FuJ3Qgc2V0IGxheW91dHMgb2YgYSBkZWFkIGltYWdlCisKKyAgICAgICAgICAgIGF1dG8gKmNiX3N1YnJlc19tYXAgPSBHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0TWFwKGNiX3N0YXRlLCAqaW1hZ2Vfc3RhdGUpOworICAgICAgICAgICAgY29uc3QgYXV0byAqc3ViX2NiX3N1YnJlc19tYXAgPSBzdWJfbGF5b3V0X21hcF9lbnRyeS5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnQoY2Jfc3VicmVzX21hcCAmJiBzdWJfY2Jfc3VicmVzX21hcCk7ICAvLyBOb24gY29uc3QgZ2V0IGFuZCBtYXAgdHJhdmVyc2FsIHNob3VsZCBuZXZlciBiZSBudWxsCisgICAgICAgICAgICBjYl9zdWJyZXNfbWFwLT5VcGRhdGVGcm9tKCpzdWJfY2Jfc3VicmVzX21hcCk7CisgICAgICAgIH0KKworICAgICAgICBzdWJfY2Jfc3RhdGUtPnByaW1hcnlDb21tYW5kQnVmZmVyID0gY2Jfc3RhdGUtPmNvbW1hbmRCdWZmZXI7CisgICAgICAgIGNiX3N0YXRlLT5saW5rZWRDb21tYW5kQnVmZmVycy5pbnNlcnQoc3ViX2NiX3N0YXRlKTsKKyAgICAgICAgc3ViX2NiX3N0YXRlLT5saW5rZWRDb21tYW5kQnVmZmVycy5pbnNlcnQoY2Jfc3RhdGUpOworICAgICAgICBmb3IgKGF1dG8gJmZ1bmN0aW9uIDogc3ViX2NiX3N0YXRlLT5xdWVyeVVwZGF0ZXMpIHsKKyAgICAgICAgICAgIGNiX3N0YXRlLT5xdWVyeVVwZGF0ZXMucHVzaF9iYWNrKGZ1bmN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gJmZ1bmN0aW9uIDogc3ViX2NiX3N0YXRlLT5xdWV1ZV9zdWJtaXRfZnVuY3Rpb25zKSB7CisgICAgICAgICAgICBjYl9zdGF0ZS0+cXVldWVfc3VibWl0X2Z1bmN0aW9ucy5wdXNoX2JhY2soZnVuY3Rpb24pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkTWFwTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGbGFncyBmbGFncywgdm9pZCAqKnBwRGF0YSwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgUmVjb3JkTWFwcGVkTWVtb3J5KG1lbSwgb2Zmc2V0LCBzaXplLCBwcERhdGEpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRVbm1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSkgeworICAgIGF1dG8gbWVtX2luZm8gPSBHZXREZXZNZW1TdGF0ZShtZW0pOworICAgIGlmIChtZW1faW5mbykgeworICAgICAgICBtZW1faW5mby0+bWFwcGVkX3JhbmdlID0gTWVtUmFuZ2UoKTsKKyAgICAgICAgbWVtX2luZm8tPnBfZHJpdmVyX2RhdGEgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpVcGRhdGVCaW5kSW1hZ2VNZW1vcnlTdGF0ZShjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8gJmJpbmRJbmZvKSB7CisgICAgSU1BR0VfU1RBVEUgKmltYWdlX3N0YXRlID0gR2V0SW1hZ2VTdGF0ZShiaW5kSW5mby5pbWFnZSk7CisgICAgaWYgKGltYWdlX3N0YXRlKSB7CisgICAgICAgIGNvbnN0IGF1dG8gc3dhcGNoYWluX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0JpbmRJbWFnZU1lbW9yeVN3YXBjaGFpbkluZm9LSFI+KGJpbmRJbmZvLnBOZXh0KTsKKyAgICAgICAgaWYgKHN3YXBjaGFpbl9pbmZvKSB7CisgICAgICAgICAgICBhdXRvIHN3YXBjaGFpbiA9IEdldFN3YXBjaGFpblN0YXRlKHN3YXBjaGFpbl9pbmZvLT5zd2FwY2hhaW4pOworICAgICAgICAgICAgaWYgKHN3YXBjaGFpbikgeworICAgICAgICAgICAgICAgIHN3YXBjaGFpbi0+aW1hZ2VzW3N3YXBjaGFpbl9pbmZvLT5pbWFnZUluZGV4XS5ib3VuZF9pbWFnZXMuZW1wbGFjZShpbWFnZV9zdGF0ZS0+aW1hZ2UpOworICAgICAgICAgICAgICAgIGltYWdlX3N0YXRlLT5iaW5kX3N3YXBjaGFpbiA9IHN3YXBjaGFpbl9pbmZvLT5zd2FwY2hhaW47CisgICAgICAgICAgICAgICAgaW1hZ2Vfc3RhdGUtPmJpbmRfc3dhcGNoYWluX2ltYWdlSW5kZXggPSBzd2FwY2hhaW5faW5mby0+aW1hZ2VJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRyYWNrIGJvdW5kIG1lbW9yeSByYW5nZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgYXV0byBtZW1faW5mbyA9IEdldERldk1lbVN0YXRlKGJpbmRJbmZvLm1lbW9yeSk7CisgICAgICAgICAgICBpZiAobWVtX2luZm8pIHsKKyAgICAgICAgICAgICAgICBJbnNlcnRJbWFnZU1lbW9yeVJhbmdlKGJpbmRJbmZvLmltYWdlLCBtZW1faW5mbywgYmluZEluZm8ubWVtb3J5T2Zmc2V0LCBpbWFnZV9zdGF0ZS0+cmVxdWlyZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8udGlsaW5nID09IFZLX0lNQUdFX1RJTElOR19MSU5FQVIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFjayBvYmplY3RzIHRpZWQgdG8gbWVtb3J5CisgICAgICAgICAgICBTZXRNZW1CaW5kaW5nKGJpbmRJbmZvLm1lbW9yeSwgaW1hZ2Vfc3RhdGUsIGJpbmRJbmZvLm1lbW9yeU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVnVsa2FuVHlwZWRIYW5kbGUoYmluZEluZm8uaW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW1hZ2Vfc3RhdGUtPmNyZWF0ZUluZm8uZmxhZ3MgJiBWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUKSB7CisgICAgICAgICAgICBBZGRBbGlhc2luZ0ltYWdlKGltYWdlX3N0YXRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrSW1hZ2UgaW1hZ2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvIGJpbmRJbmZvID0ge307CisgICAgYmluZEluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPOworICAgIGJpbmRJbmZvLmltYWdlID0gaW1hZ2U7CisgICAgYmluZEluZm8ubWVtb3J5ID0gbWVtOworICAgIGJpbmRJbmZvLm1lbW9yeU9mZnNldCA9IG1lbW9yeU9mZnNldDsKKyAgICBVcGRhdGVCaW5kSW1hZ2VNZW1vcnlTdGF0ZShiaW5kSW5mbyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mb0tIUiAqcEJpbmRJbmZvcywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvQ291bnQ7IGkrKykgeworICAgICAgICBVcGRhdGVCaW5kSW1hZ2VNZW1vcnlTdGF0ZShwQmluZEluZm9zW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkyS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQmluZEltYWdlTWVtb3J5SW5mb0tIUiAqcEJpbmRJbmZvcywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJpbmRJbmZvQ291bnQ7IGkrKykgeworICAgICAgICBVcGRhdGVCaW5kSW1hZ2VNZW1vcnlTdGF0ZShwQmluZEluZm9zW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZFNldEV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCkgeworICAgIGF1dG8gZXZlbnRfc3RhdGUgPSBHZXRFdmVudFN0YXRlKGV2ZW50KTsKKyAgICBpZiAoZXZlbnRfc3RhdGUpIHsKKyAgICAgICAgZXZlbnRfc3RhdGUtPnN0YWdlTWFzayA9IFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZUZkS0hSKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZUZkSW5mb0tIUiAqcEltcG9ydFNlbWFwaG9yZUZkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBSZWNvcmRJbXBvcnRTZW1hcGhvcmVTdGF0ZShwSW1wb3J0U2VtYXBob3JlRmRJbmZvLT5zZW1hcGhvcmUsIHBJbXBvcnRTZW1hcGhvcmVGZEluZm8tPmhhbmRsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltcG9ydFNlbWFwaG9yZUZkSW5mby0+ZmxhZ3MpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZEdldEV4dGVybmFsU2VtYXBob3JlU3RhdGUoVmtTZW1hcGhvcmUgc2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVIYW5kbGVUeXBlRmxhZ0JpdHNLSFIgaGFuZGxlX3R5cGUpIHsKKyAgICBTRU1BUEhPUkVfU1RBVEUgKnNlbWFwaG9yZV9zdGF0ZSA9IEdldFNlbWFwaG9yZVN0YXRlKHNlbWFwaG9yZSk7CisgICAgaWYgKHNlbWFwaG9yZV9zdGF0ZSAmJiBoYW5kbGVfdHlwZSAhPSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfU1lOQ19GRF9CSVRfS0hSKSB7CisgICAgICAgIC8vIENhbm5vdCB0cmFjayBzZW1hcGhvcmUgc3RhdGUgb25jZSBpdCBpcyBleHBvcnRlZCwgZXhjZXB0IGZvciBTeW5jIEZEIGhhbmRsZSB0eXBlcyB3aGljaCBoYXZlIGNvcHkgdHJhbnNmZXJlbmNlCisgICAgICAgIHNlbWFwaG9yZV9zdGF0ZS0+c2NvcGUgPSBrU3luY1Njb3BlRXh0ZXJuYWxQZXJtYW5lbnQ7CisgICAgfQorfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgKnBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8sIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFJlY29yZEltcG9ydFNlbWFwaG9yZVN0YXRlKHBJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm8tPnNlbWFwaG9yZSwgcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mby0+aGFuZGxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvLT5mbGFncyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIgKnBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFICpwSGFuZGxlLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBSZWNvcmRHZXRFeHRlcm5hbFNlbWFwaG9yZVN0YXRlKHBHZXRXaW4zMkhhbmRsZUluZm8tPnNlbWFwaG9yZSwgcEdldFdpbjMySGFuZGxlSW5mby0+aGFuZGxlVHlwZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKAorICAgIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiAqcEltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBSZWNvcmRJbXBvcnRGZW5jZVN0YXRlKHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mby0+ZmVuY2UsIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mby0+aGFuZGxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mby0+ZmxhZ3MpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0RmVuY2VXaW4zMkhhbmRsZUtIUihWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSICpwR2V0V2luMzJIYW5kbGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFICpwSGFuZGxlLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBSZWNvcmRHZXRFeHRlcm5hbEZlbmNlU3RhdGUocEdldFdpbjMySGFuZGxlSW5mby0+ZmVuY2UsIHBHZXRXaW4zMkhhbmRsZUluZm8tPmhhbmRsZVR5cGUpOworfQorI2VuZGlmCisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSICpwR2V0RmRJbmZvLCBpbnQgKnBGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBSZWNvcmRHZXRFeHRlcm5hbFNlbWFwaG9yZVN0YXRlKHBHZXRGZEluZm8tPnNlbWFwaG9yZSwgcEdldEZkSW5mby0+aGFuZGxlVHlwZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkSW1wb3J0RmVuY2VTdGF0ZShWa0ZlbmNlIGZlbmNlLCBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFIgaGFuZGxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGZW5jZUltcG9ydEZsYWdzS0hSIGZsYWdzKSB7CisgICAgRkVOQ0VfU1RBVEUgKmZlbmNlX25vZGUgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKyAgICBpZiAoZmVuY2Vfbm9kZSAmJiBmZW5jZV9ub2RlLT5zY29wZSAhPSBrU3luY1Njb3BlRXh0ZXJuYWxQZXJtYW5lbnQpIHsKKyAgICAgICAgaWYgKChoYW5kbGVfdHlwZSA9PSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVF9LSFIgfHwgZmxhZ3MgJiBWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVF9LSFIpICYmCisgICAgICAgICAgICBmZW5jZV9ub2RlLT5zY29wZSA9PSBrU3luY1Njb3BlSW50ZXJuYWwpIHsKKyAgICAgICAgICAgIGZlbmNlX25vZGUtPnNjb3BlID0ga1N5bmNTY29wZUV4dGVybmFsVGVtcG9yYXJ5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmVuY2Vfbm9kZS0+c2NvcGUgPSBrU3luY1Njb3BlRXh0ZXJuYWxQZXJtYW5lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRJbXBvcnRGZW5jZUZkS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiAqcEltcG9ydEZlbmNlRmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgUmVjb3JkSW1wb3J0RmVuY2VTdGF0ZShwSW1wb3J0RmVuY2VGZEluZm8tPmZlbmNlLCBwSW1wb3J0RmVuY2VGZEluZm8tPmhhbmRsZVR5cGUsIHBJbXBvcnRGZW5jZUZkSW5mby0+ZmxhZ3MpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZEdldEV4dGVybmFsRmVuY2VTdGF0ZShWa0ZlbmNlIGZlbmNlLCBWa0V4dGVybmFsRmVuY2VIYW5kbGVUeXBlRmxhZ0JpdHNLSFIgaGFuZGxlX3R5cGUpIHsKKyAgICBGRU5DRV9TVEFURSAqZmVuY2Vfc3RhdGUgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKyAgICBpZiAoZmVuY2Vfc3RhdGUpIHsKKyAgICAgICAgaWYgKGhhbmRsZV90eXBlICE9IFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUX0tIUikgeworICAgICAgICAgICAgLy8gRXhwb3J0IHdpdGggcmVmZXJlbmNlIHRyYW5zZmVyZW5jZSBiZWNvbWVzIGV4dGVybmFsCisgICAgICAgICAgICBmZW5jZV9zdGF0ZS0+c2NvcGUgPSBrU3luY1Njb3BlRXh0ZXJuYWxQZXJtYW5lbnQ7CisgICAgICAgIH0gZWxzZSBpZiAoZmVuY2Vfc3RhdGUtPnNjb3BlID09IGtTeW5jU2NvcGVJbnRlcm5hbCkgeworICAgICAgICAgICAgLy8gRXhwb3J0IHdpdGggY29weSB0cmFuc2ZlcmVuY2UgaGFzIGEgc2lkZSBlZmZlY3Qgb2YgcmVzZXR0aW5nIHRoZSBmZW5jZQorICAgICAgICAgICAgZmVuY2Vfc3RhdGUtPnN0YXRlID0gRkVOQ0VfVU5TSUdOQUxFRDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldEZlbmNlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ZlbmNlR2V0RmRJbmZvS0hSICpwR2V0RmRJbmZvLCBpbnQgKnBGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFJlY29yZEdldEV4dGVybmFsRmVuY2VTdGF0ZShwR2V0RmRJbmZvLT5mZW5jZSwgcEdldEZkSW5mby0+aGFuZGxlVHlwZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVFdmVudChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRXZlbnQgKnBFdmVudCwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgZXZlbnRNYXBbKnBFdmVudF0ud3JpdGVfaW5fdXNlID0gMDsKKyAgICBldmVudE1hcFsqcEV2ZW50XS5zdGFnZU1hc2sgPSBWa1BpcGVsaW5lU3RhZ2VGbGFncygwKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZWNvcmRDcmVhdGVTd2FwY2hhaW5TdGF0ZShWa1Jlc3VsdCByZXN1bHQsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3dhcGNoYWluS0hSICpwU3dhcGNoYWluLCBTVVJGQUNFX1NUQVRFICpzdXJmYWNlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0FQQ0hBSU5fTk9ERSAqb2xkX3N3YXBjaGFpbl9zdGF0ZSkgeworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICBhdXRvIHN3YXBjaGFpbl9zdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8U1dBUENIQUlOX05PREU+KHBDcmVhdGVJbmZvLCAqcFN3YXBjaGFpbik7CisgICAgICAgIGlmIChWS19QUkVTRU5UX01PREVfU0hBUkVEX0RFTUFORF9SRUZSRVNIX0tIUiA9PSBwQ3JlYXRlSW5mby0+cHJlc2VudE1vZGUgfHwKKyAgICAgICAgICAgIFZLX1BSRVNFTlRfTU9ERV9TSEFSRURfQ09OVElOVU9VU19SRUZSRVNIX0tIUiA9PSBwQ3JlYXRlSW5mby0+cHJlc2VudE1vZGUpIHsKKyAgICAgICAgICAgIHN3YXBjaGFpbl9zdGF0ZS0+c2hhcmVkX3ByZXNlbnRhYmxlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBzdXJmYWNlX3N0YXRlLT5zd2FwY2hhaW4gPSBzd2FwY2hhaW5fc3RhdGUuZ2V0KCk7CisgICAgICAgIHN3YXBjaGFpbk1hcFsqcFN3YXBjaGFpbl0gPSBzdGQ6Om1vdmUoc3dhcGNoYWluX3N0YXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdXJmYWNlX3N0YXRlLT5zd2FwY2hhaW4gPSBudWxscHRyOworICAgIH0KKyAgICAvLyBTcGVjIHJlcXVpcmVzIHRoYXQgZXZlbiBpZiBDcmVhdGVTd2FwY2hhaW5LSFIgZmFpbHMsIG9sZFN3YXBjaGFpbiBpcyByZXRpcmVkCisgICAgaWYgKG9sZF9zd2FwY2hhaW5fc3RhdGUpIHsKKyAgICAgICAgb2xkX3N3YXBjaGFpbl9zdGF0ZS0+cmV0aXJlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIgKnBTd2FwY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGF1dG8gc3VyZmFjZV9zdGF0ZSA9IEdldFN1cmZhY2VTdGF0ZShwQ3JlYXRlSW5mby0+c3VyZmFjZSk7CisgICAgYXV0byBvbGRfc3dhcGNoYWluX3N0YXRlID0gR2V0U3dhcGNoYWluU3RhdGUocENyZWF0ZUluZm8tPm9sZFN3YXBjaGFpbik7CisgICAgUmVjb3JkQ3JlYXRlU3dhcGNoYWluU3RhdGUocmVzdWx0LCBwQ3JlYXRlSW5mbywgcFN3YXBjaGFpbiwgc3VyZmFjZV9zdGF0ZSwgb2xkX3N3YXBjaGFpbl9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTd2FwY2hhaW5LSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGlmICghc3dhcGNoYWluKSByZXR1cm47CisgICAgYXV0byBzd2FwY2hhaW5fZGF0YSA9IEdldFN3YXBjaGFpblN0YXRlKHN3YXBjaGFpbik7CisgICAgaWYgKHN3YXBjaGFpbl9kYXRhKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3dhcGNoYWluX2ltYWdlIDogc3dhcGNoYWluX2RhdGEtPmltYWdlcykgeworICAgICAgICAgICAgQ2xlYXJNZW1vcnlPYmplY3RCaW5kaW5ncyhWdWxrYW5UeXBlZEhhbmRsZShzd2FwY2hhaW5faW1hZ2UuaW1hZ2UsIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2UpKTsKKyAgICAgICAgICAgIGltYWdlTWFwLmVyYXNlKHN3YXBjaGFpbl9pbWFnZS5pbWFnZSk7CisgICAgICAgICAgICBSZW1vdmVBbGlhc2luZ0ltYWdlcyhzd2FwY2hhaW5faW1hZ2UuYm91bmRfaW1hZ2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gc3VyZmFjZV9zdGF0ZSA9IEdldFN1cmZhY2VTdGF0ZShzd2FwY2hhaW5fZGF0YS0+Y3JlYXRlSW5mby5zdXJmYWNlKTsKKyAgICAgICAgaWYgKHN1cmZhY2Vfc3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChzdXJmYWNlX3N0YXRlLT5zd2FwY2hhaW4gPT0gc3dhcGNoYWluX2RhdGEpIHN1cmZhY2Vfc3RhdGUtPnN3YXBjaGFpbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3dhcGNoYWluX2RhdGEtPmRlc3Ryb3llZCA9IHRydWU7CisgICAgICAgIHN3YXBjaGFpbk1hcC5lcmFzZShzd2FwY2hhaW4pOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZFF1ZXVlUHJlc2VudEtIUihWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1ByZXNlbnRJbmZvS0hSICpwUHJlc2VudEluZm8sIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIC8vIFNlbWFwaG9yZSB3YWl0cyBvY2N1ciBiZWZvcmUgZXJyb3IgZ2VuZXJhdGlvbiwgaWYgdGhlIGNhbGwgcmVhY2hlZCB0aGUgSUNELiAoQ29uZmlybT8pCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBQcmVzZW50SW5mby0+d2FpdFNlbWFwaG9yZUNvdW50OyArK2kpIHsKKyAgICAgICAgYXV0byBwU2VtYXBob3JlID0gR2V0U2VtYXBob3JlU3RhdGUocFByZXNlbnRJbmZvLT5wV2FpdFNlbWFwaG9yZXNbaV0pOworICAgICAgICBpZiAocFNlbWFwaG9yZSkgeworICAgICAgICAgICAgcFNlbWFwaG9yZS0+c2lnbmFsZXIuZmlyc3QgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgICAgIHBTZW1hcGhvcmUtPnNpZ25hbGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudDsgKytpKSB7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgaXMgaW1wZXJmZWN0LCBpbiB0aGF0IHdlIGNhbiBnZXQgY29uZnVzZWQgYWJvdXQgd2hhdCBkaWQgb3IgZGlkbid0IHN1Y2NlZWQtLSBidXQgaWYgdGhlIGFwcCBkb2VzIHRoYXQsIGl0J3MKKyAgICAgICAgLy8gY29uZnVzZWQgaXRzZWxmIGp1c3QgYXMgbXVjaC4KKyAgICAgICAgYXV0byBsb2NhbF9yZXN1bHQgPSBwUHJlc2VudEluZm8tPnBSZXN1bHRzID8gcFByZXNlbnRJbmZvLT5wUmVzdWx0c1tpXSA6IHJlc3VsdDsKKyAgICAgICAgaWYgKGxvY2FsX3Jlc3VsdCAhPSBWS19TVUNDRVNTICYmIGxvY2FsX3Jlc3VsdCAhPSBWS19TVUJPUFRJTUFMX0tIUikgY29udGludWU7ICAvLyB0aGlzIHByZXNlbnQgZGlkbid0IGFjdHVhbGx5IGhhcHBlbi4KKyAgICAgICAgLy8gTWFyayB0aGUgaW1hZ2UgYXMgaGF2aW5nIGJlZW4gcmVsZWFzZWQgdG8gdGhlIFdTSQorICAgICAgICBhdXRvIHN3YXBjaGFpbl9kYXRhID0gR2V0U3dhcGNoYWluU3RhdGUocFByZXNlbnRJbmZvLT5wU3dhcGNoYWluc1tpXSk7CisgICAgICAgIGlmIChzd2FwY2hhaW5fZGF0YSAmJiAoc3dhcGNoYWluX2RhdGEtPmltYWdlcy5zaXplKCkgPiBwUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXNbaV0pKSB7CisgICAgICAgICAgICBhdXRvIGltYWdlID0gc3dhcGNoYWluX2RhdGEtPmltYWdlc1twUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXNbaV1dLmltYWdlOworICAgICAgICAgICAgYXV0byBpbWFnZV9zdGF0ZSA9IEdldEltYWdlU3RhdGUoaW1hZ2UpOworICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgaW1hZ2Vfc3RhdGUtPmFjcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGltYWdlX3N0YXRlLT5zaGFyZWRfcHJlc2VudGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2Vfc3RhdGUtPmxheW91dF9sb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBOb3RlOiBldmVuIHRob3VnaCBwcmVzZW50YXRpb24gaXMgZGlyZWN0ZWQgdG8gYSBxdWV1ZSwgdGhlcmUgaXMgbm8gZGlyZWN0IG9yZGVyaW5nIGJldHdlZW4gUVAgYW5kIHN1YnNlcXVlbnQgd29yaywgc28gUVAgKGFuZAorICAgIC8vIGl0cyBzZW1hcGhvcmUgd2FpdHMpIC9uZXZlci8gcGFydGljaXBhdGUgaW4gYW55IGNvbXBsZXRpb24gcHJvb2YuCit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3Qgc3dhcGNoYWluQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3dhcGNoYWluS0hSICpwU3dhcGNoYWlucywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluQ291bnQ7IGkrKykgeworICAgICAgICAgICAgYXV0byBzdXJmYWNlX3N0YXRlID0gR2V0U3VyZmFjZVN0YXRlKHBDcmVhdGVJbmZvc1tpXS5zdXJmYWNlKTsKKyAgICAgICAgICAgIGF1dG8gb2xkX3N3YXBjaGFpbl9zdGF0ZSA9IEdldFN3YXBjaGFpblN0YXRlKHBDcmVhdGVJbmZvc1tpXS5vbGRTd2FwY2hhaW4pOworICAgICAgICAgICAgUmVjb3JkQ3JlYXRlU3dhcGNoYWluU3RhdGUocmVzdWx0LCAmcENyZWF0ZUluZm9zW2ldLCAmcFN3YXBjaGFpbnNbaV0sIHN1cmZhY2Vfc3RhdGUsIG9sZF9zd2FwY2hhaW5fc3RhdGUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZEFjcXVpcmVOZXh0SW1hZ2VTdGF0ZShWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDY0X3QgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgVmtGZW5jZSBmZW5jZSwgdWludDMyX3QgKnBJbWFnZUluZGV4KSB7CisgICAgYXV0byBwRmVuY2UgPSBHZXRGZW5jZVN0YXRlKGZlbmNlKTsKKyAgICBpZiAocEZlbmNlICYmIHBGZW5jZS0+c2NvcGUgPT0ga1N5bmNTY29wZUludGVybmFsKSB7CisgICAgICAgIC8vIFRyZWF0IGFzIGluZmxpZ2h0IHNpbmNlIGl0IGlzIHZhbGlkIHRvIHdhaXQgb24gdGhpcyBmZW5jZSwgZXZlbiBpbiBjYXNlcyB3aGVyZSBpdCBpcyB0ZWNobmljYWxseSBhIHRlbXBvcmFyeQorICAgICAgICAvLyBpbXBvcnQKKyAgICAgICAgcEZlbmNlLT5zdGF0ZSA9IEZFTkNFX0lORkxJR0hUOworICAgICAgICBwRmVuY2UtPnNpZ25hbGVyLmZpcnN0ID0gVktfTlVMTF9IQU5ETEU7ICAvLyBBTkkgaXNuJ3Qgb24gYSBxdWV1ZSwgc28gdGhpcyBjYW4ndCBwYXJ0aWNpcGF0ZSBpbiBhIGNvbXBsZXRpb24gcHJvb2YuCisgICAgfQorCisgICAgYXV0byBwU2VtYXBob3JlID0gR2V0U2VtYXBob3JlU3RhdGUoc2VtYXBob3JlKTsKKyAgICBpZiAocFNlbWFwaG9yZSAmJiBwU2VtYXBob3JlLT5zY29wZSA9PSBrU3luY1Njb3BlSW50ZXJuYWwpIHsKKyAgICAgICAgLy8gVHJlYXQgYXMgc2lnbmFsZWQgc2luY2UgaXQgaXMgdmFsaWQgdG8gd2FpdCBvbiB0aGlzIHNlbWFwaG9yZSwgZXZlbiBpbiBjYXNlcyB3aGVyZSBpdCBpcyB0ZWNobmljYWxseSBhCisgICAgICAgIC8vIHRlbXBvcmFyeSBpbXBvcnQKKyAgICAgICAgcFNlbWFwaG9yZS0+c2lnbmFsZWQgPSB0cnVlOworICAgICAgICBwU2VtYXBob3JlLT5zaWduYWxlci5maXJzdCA9IFZLX05VTExfSEFORExFOworICAgIH0KKworICAgIC8vIE1hcmsgdGhlIGltYWdlIGFzIGFjcXVpcmVkLgorICAgIGF1dG8gc3dhcGNoYWluX2RhdGEgPSBHZXRTd2FwY2hhaW5TdGF0ZShzd2FwY2hhaW4pOworICAgIGlmIChzd2FwY2hhaW5fZGF0YSAmJiAoc3dhcGNoYWluX2RhdGEtPmltYWdlcy5zaXplKCkgPiAqcEltYWdlSW5kZXgpKSB7CisgICAgICAgIGF1dG8gaW1hZ2UgPSBzd2FwY2hhaW5fZGF0YS0+aW1hZ2VzWypwSW1hZ2VJbmRleF0uaW1hZ2U7CisgICAgICAgIGF1dG8gaW1hZ2Vfc3RhdGUgPSBHZXRJbWFnZVN0YXRlKGltYWdlKTsKKyAgICAgICAgaWYgKGltYWdlX3N0YXRlKSB7CisgICAgICAgICAgICBpbWFnZV9zdGF0ZS0+YWNxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgaW1hZ2Vfc3RhdGUtPnNoYXJlZF9wcmVzZW50YWJsZSA9IHN3YXBjaGFpbl9kYXRhLT5zaGFyZWRfcHJlc2VudGFibGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRBY3F1aXJlTmV4dEltYWdlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBWa0ZlbmNlIGZlbmNlLCB1aW50MzJfdCAqcEltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSAmJiAoVktfU1VCT1BUSU1BTF9LSFIgIT0gcmVzdWx0KSkgcmV0dXJuOworICAgIFJlY29yZEFjcXVpcmVOZXh0SW1hZ2VTdGF0ZShkZXZpY2UsIHN3YXBjaGFpbiwgdGltZW91dCwgc2VtYXBob3JlLCBmZW5jZSwgcEltYWdlSW5kZXgpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQWNxdWlyZU5leHRJbWFnZTJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSICpwQWNxdWlyZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBJbWFnZUluZGV4LCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSAmJiAoVktfU1VCT1BUSU1BTF9LSFIgIT0gcmVzdWx0KSkgcmV0dXJuOworICAgIFJlY29yZEFjcXVpcmVOZXh0SW1hZ2VTdGF0ZShkZXZpY2UsIHBBY3F1aXJlSW5mby0+c3dhcGNoYWluLCBwQWNxdWlyZUluZm8tPnRpbWVvdXQsIHBBY3F1aXJlSW5mby0+c2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWNxdWlyZUluZm8tPmZlbmNlLCBwSW1hZ2VJbmRleCk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QgKnBQaHlzaWNhbERldmljZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlICpwUGh5c2ljYWxEZXZpY2VzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoKE5VTEwgIT0gcFBoeXNpY2FsRGV2aWNlcykgJiYgKChyZXN1bHQgPT0gVktfU1VDQ0VTUyB8fCByZXN1bHQgPT0gVktfSU5DT01QTEVURSkpKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFBoeXNpY2FsRGV2aWNlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgYXV0byAmcGh5c19kZXZpY2Vfc3RhdGUgPSBwaHlzaWNhbF9kZXZpY2VfbWFwW3BQaHlzaWNhbERldmljZXNbaV1dOworICAgICAgICAgICAgcGh5c19kZXZpY2Vfc3RhdGUucGh5c19kZXZpY2UgPSBwUGh5c2ljYWxEZXZpY2VzW2ldOworICAgICAgICAgICAgLy8gSW5pdCBhY3R1YWwgZmVhdHVyZXMgZm9yIGVhY2ggcGh5c2ljYWwgZGV2aWNlCisgICAgICAgICAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMocFBoeXNpY2FsRGV2aWNlc1tpXSwgJnBoeXNfZGV2aWNlX3N0YXRlLmZlYXR1cmVzMi5mZWF0dXJlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENvbW1vbiBmdW5jdGlvbiB0byB1cGRhdGUgc3RhdGUgZm9yIEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzICYgMktIUiB2ZXJzaW9uCitzdGF0aWMgdm9pZCBTdGF0ZVVwZGF0ZUNvbW1vbkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKFBIWVNJQ0FMX0RFVklDRV9TVEFURSAqcGRfc3RhdGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgKnBRdWV1ZUZhbWlseVByb3BlcnRpZXMpIHsKKyAgICBwZF9zdGF0ZS0+cXVldWVfZmFtaWx5X2tub3duX2NvdW50ID0gc3RkOjptYXgocGRfc3RhdGUtPnF1ZXVlX2ZhbWlseV9rbm93bl9jb3VudCwgY291bnQpOworCisgICAgaWYgKCFwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7CisgICAgICAgIGlmIChVTkNBTExFRCA9PSBwZF9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllc1N0YXRlKQorICAgICAgICAgICAgcGRfc3RhdGUtPnZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXNTdGF0ZSA9IFFVRVJZX0NPVU5UOworICAgIH0gZWxzZSB7ICAvLyBTYXZlIHF1ZXVlIGZhbWlseSBwcm9wZXJ0aWVzCisgICAgICAgIHBkX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzU3RhdGUgPSBRVUVSWV9ERVRBSUxTOworCisgICAgICAgIHBkX3N0YXRlLT5xdWV1ZV9mYW1pbHlfcHJvcGVydGllcy5yZXNpemUoc3RkOjptYXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBkX3N0YXRlLT5xdWV1ZV9mYW1pbHlfcHJvcGVydGllcy5zaXplKCkpLCBjb3VudCkpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgcGRfc3RhdGUtPnF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW2ldID0gcFF1ZXVlRmFtaWx5UHJvcGVydGllc1tpXS5xdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzICpwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBhc3NlcnQocGh5c2ljYWxfZGV2aWNlX3N0YXRlKTsKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgKnBxZnAgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUj4gcWZwOworICAgIHFmcC5yZXNpemUoKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQpOworICAgIGlmIChwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudDsgKytpKSB7CisgICAgICAgICAgICBxZnBbaV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVVRV9GQU1JTFlfUFJPUEVSVElFU18yX0tIUjsKKyAgICAgICAgICAgIHFmcFtpXS5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgICAgICBxZnBbaV0ucXVldWVGYW1pbHlQcm9wZXJ0aWVzID0gcFF1ZXVlRmFtaWx5UHJvcGVydGllc1tpXTsKKyAgICAgICAgfQorICAgICAgICBwcWZwID0gcWZwLmRhdGEoKTsKKyAgICB9CisgICAgU3RhdGVVcGRhdGVDb21tb25HZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwaHlzaWNhbF9kZXZpY2Vfc3RhdGUsICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBwcWZwKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSICpwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBhc3NlcnQocGh5c2ljYWxfZGV2aWNlX3N0YXRlKTsKKyAgICBTdGF0ZVVwZGF0ZUNvbW1vbkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsX2RldmljZV9zdGF0ZSwgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSICpwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBhc3NlcnQocGh5c2ljYWxfZGV2aWNlX3N0YXRlKTsKKyAgICBTdGF0ZVVwZGF0ZUNvbW1vbkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNpY2FsX2RldmljZV9zdGF0ZSwgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKK30KK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZERlc3Ryb3lTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFzdXJmYWNlKSByZXR1cm47CisgICAgYXV0byBzdXJmYWNlX3N0YXRlID0gR2V0U3VyZmFjZVN0YXRlKHN1cmZhY2UpOworICAgIHN1cmZhY2Vfc3RhdGUtPmRlc3Ryb3llZCA9IHRydWU7CisgICAgc3VyZmFjZV9tYXAuZXJhc2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkVnVsa2FuU3VyZmFjZShWa1N1cmZhY2VLSFIgKnBTdXJmYWNlKSB7CisgICAgc3VyZmFjZV9tYXBbKnBTdXJmYWNlXSA9IHN0ZDo6bWFrZV9zaGFyZWQ8U1VSRkFDRV9TVEFURT4oKnBTdXJmYWNlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGlzcGxheVN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFJlY29yZFZ1bGthblN1cmZhY2UocFN1cmZhY2UpOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIgKnBTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFJlY29yZFZ1bGthblN1cmZhY2UocFN1cmZhY2UpOworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9JT1NfTVZLCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ3JlYXRlSU9TU3VyZmFjZU1WSyhWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0lPU1N1cmZhY2VDcmVhdGVJbmZvTVZLICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSICpwU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFJlY29yZFZ1bGthblN1cmZhY2UocFN1cmZhY2UpOworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fSU9TX01WSworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZU1hY09TU3VyZmFjZU1WSyhWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFJlY29yZFZ1bGthblN1cmZhY2UocFN1cmZhY2UpOworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV2F5bGFuZFN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgUmVjb3JkVnVsa2FuU3VyZmFjZShwU3VyZmFjZSk7Cit9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVdpbjMyU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFJlY29yZFZ1bGthblN1cmZhY2UocFN1cmZhY2UpOworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVhjYlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBSZWNvcmRWdWxrYW5TdXJmYWNlKHBTdXJmYWNlKTsKK30KKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZVhsaWJTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgUmVjb3JkVnVsa2FuU3VyZmFjZShwU3VyZmFjZSk7Cit9CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpwRmVhdHVyZXMpIHsKKyAgICBhdXRvIHBoeXNpY2FsX2RldmljZV9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUocGh5c2ljYWxEZXZpY2UpOworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzU3RhdGUgPSBRVUVSWV9ERVRBSUxTOworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+ZmVhdHVyZXMyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzI7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5mZWF0dXJlczIucE5leHQgPSBudWxscHRyOworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+ZmVhdHVyZXMyLmZlYXR1cmVzID0gKnBGZWF0dXJlczsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiAqcEZlYXR1cmVzKSB7CisgICAgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlc1N0YXRlID0gUVVFUllfREVUQUlMUzsKKyAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPmZlYXR1cmVzMi5pbml0aWFsaXplKHBGZWF0dXJlcyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgKnBGZWF0dXJlcykgeworICAgIGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXNTdGF0ZSA9IFFVRVJZX0RFVEFJTFM7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5mZWF0dXJlczIuaW5pdGlhbGl6ZShwRmVhdHVyZXMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgKnBTdXJmYWNlQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBhdXRvIHBoeXNpY2FsX2RldmljZV9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUocGh5c2ljYWxEZXZpY2UpOworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFJTdGF0ZSA9IFFVRVJZX0RFVEFJTFM7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUl9jYWxsZWQgPSB0cnVlOworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+c3VyZmFjZUNhcGFiaWxpdGllcyA9ICpwU3VyZmFjZUNhcGFiaWxpdGllczsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllczJLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiAqcFN1cmZhY2VJbmZvLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllczJLSFIgKnBTdXJmYWNlQ2FwYWJpbGl0aWVzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXN1bHQpIHJldHVybjsKKyAgICBhdXRvIHBoeXNpY2FsX2RldmljZV9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUocGh5c2ljYWxEZXZpY2UpOworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFJTdGF0ZSA9IFFVRVJZX0RFVEFJTFM7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUl9jYWxsZWQgPSB0cnVlOworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+c3VyZmFjZUNhcGFiaWxpdGllcyA9IHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXJmYWNlQ2FwYWJpbGl0aWVzOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlS0hSIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUICpwU3VyZmFjZUNhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUlN0YXRlID0gUVVFUllfREVUQUlMUzsKKyAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSX2NhbGxlZCA9IHRydWU7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5zdXJmYWNlQ2FwYWJpbGl0aWVzLm1pbkltYWdlQ291bnQgPSBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWluSW1hZ2VDb3VudDsKKyAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnN1cmZhY2VDYXBhYmlsaXRpZXMubWF4SW1hZ2VDb3VudCA9IHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUNvdW50OworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+c3VyZmFjZUNhcGFiaWxpdGllcy5jdXJyZW50RXh0ZW50ID0gcFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRFeHRlbnQ7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5zdXJmYWNlQ2FwYWJpbGl0aWVzLm1pbkltYWdlRXh0ZW50ID0gcFN1cmZhY2VDYXBhYmlsaXRpZXMtPm1pbkltYWdlRXh0ZW50OworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+c3VyZmFjZUNhcGFiaWxpdGllcy5tYXhJbWFnZUV4dGVudCA9IHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUV4dGVudDsKKyAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnN1cmZhY2VDYXBhYmlsaXRpZXMubWF4SW1hZ2VBcnJheUxheWVycyA9IHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUFycmF5TGF5ZXJzOworICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+c3VyZmFjZUNhcGFiaWxpdGllcy5zdXBwb3J0ZWRUcmFuc2Zvcm1zID0gcFN1cmZhY2VDYXBhYmlsaXRpZXMtPnN1cHBvcnRlZFRyYW5zZm9ybXM7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5zdXJmYWNlQ2FwYWJpbGl0aWVzLmN1cnJlbnRUcmFuc2Zvcm0gPSBwU3VyZmFjZUNhcGFiaWxpdGllcy0+Y3VycmVudFRyYW5zZm9ybTsKKyAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnN1cmZhY2VDYXBhYmlsaXRpZXMuc3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEgPSBwU3VyZmFjZUNhcGFiaWxpdGllcy0+c3VwcG9ydGVkQ29tcG9zaXRlQWxwaGE7CisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5zdXJmYWNlQ2FwYWJpbGl0aWVzLnN1cHBvcnRlZFVzYWdlRmxhZ3MgPSBwU3VyZmFjZUNhcGFiaWxpdGllcy0+c3VwcG9ydGVkVXNhZ2VGbGFnczsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCb29sMzIgKnBTdXBwb3J0ZWQsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIGF1dG8gc3VyZmFjZV9zdGF0ZSA9IEdldFN1cmZhY2VTdGF0ZShzdXJmYWNlKTsKKyAgICBzdXJmYWNlX3N0YXRlLT5ncHVfcXVldWVfc3VwcG9ydFt7cGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXh9XSA9ICgqcFN1cHBvcnRlZCA9PSBWS19UUlVFKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBQcmVzZW50TW9kZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1ByZXNlbnRNb2RlS0hSICpwUHJlc2VudE1vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSAmJiAoVktfSU5DT01QTEVURSAhPSByZXN1bHQpKSByZXR1cm47CisKKyAgICAvLyBUT0RPOiBUaGlzIGlzbid0IHF1aXRlIHJpZ2h0IC0tIGF2YWlsYWJsZSBtb2RlcyBtYXkgZGlmZmVyIGJ5IHN1cmZhY2UgQU5EIHBoeXNpY2FsIGRldmljZS4KKyAgICBhdXRvIHBoeXNpY2FsX2RldmljZV9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUocGh5c2ljYWxEZXZpY2UpOworICAgIGF1dG8gJmNhbGxfc3RhdGUgPSBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSU3RhdGU7CisKKyAgICBpZiAoKnBQcmVzZW50TW9kZUNvdW50KSB7CisgICAgICAgIGlmIChjYWxsX3N0YXRlIDwgUVVFUllfQ09VTlQpIGNhbGxfc3RhdGUgPSBRVUVSWV9DT1VOVDsKKyAgICAgICAgaWYgKCpwUHJlc2VudE1vZGVDb3VudCA+IHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+cHJlc2VudF9tb2Rlcy5zaXplKCkpCisgICAgICAgICAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnByZXNlbnRfbW9kZXMucmVzaXplKCpwUHJlc2VudE1vZGVDb3VudCk7CisgICAgfQorICAgIGlmIChwUHJlc2VudE1vZGVzKSB7CisgICAgICAgIGlmIChjYWxsX3N0YXRlIDwgUVVFUllfREVUQUlMUykgY2FsbF9zdGF0ZSA9IFFVRVJZX0RFVEFJTFM7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFByZXNlbnRNb2RlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5wcmVzZW50X21vZGVzW2ldID0gcFByZXNlbnRNb2Rlc1tpXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZUZvcm1hdEtIUiAqcFN1cmZhY2VGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKChWS19TVUNDRVNTICE9IHJlc3VsdCkgJiYgKFZLX0lOQ09NUExFVEUgIT0gcmVzdWx0KSkgcmV0dXJuOworCisgICAgYXV0byBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUgPSBHZXRQaHlzaWNhbERldmljZVN0YXRlKHBoeXNpY2FsRGV2aWNlKTsKKyAgICBhdXRvICZjYWxsX3N0YXRlID0gcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFJTdGF0ZTsKKworICAgIGlmICgqcFN1cmZhY2VGb3JtYXRDb3VudCkgeworICAgICAgICBpZiAoY2FsbF9zdGF0ZSA8IFFVRVJZX0NPVU5UKSBjYWxsX3N0YXRlID0gUVVFUllfQ09VTlQ7CisgICAgICAgIGlmICgqcFN1cmZhY2VGb3JtYXRDb3VudCA+IHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+c3VyZmFjZV9mb3JtYXRzLnNpemUoKSkKKyAgICAgICAgICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+c3VyZmFjZV9mb3JtYXRzLnJlc2l6ZSgqcFN1cmZhY2VGb3JtYXRDb3VudCk7CisgICAgfQorICAgIGlmIChwU3VyZmFjZUZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGNhbGxfc3RhdGUgPCBRVUVSWV9ERVRBSUxTKSBjYWxsX3N0YXRlID0gUVVFUllfREVUQUlMUzsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICpwU3VyZmFjZUZvcm1hdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+c3VyZmFjZV9mb3JtYXRzW2ldID0gcFN1cmZhY2VGb3JtYXRzW2ldOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICpwU3VyZmFjZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTdXJmYWNlRm9ybWF0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlRm9ybWF0MktIUiAqcFN1cmZhY2VGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmICgoVktfU1VDQ0VTUyAhPSByZXN1bHQpICYmIChWS19JTkNPTVBMRVRFICE9IHJlc3VsdCkpIHJldHVybjsKKworICAgIGF1dG8gcGh5c2ljYWxEZXZpY2VTdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUocGh5c2ljYWxEZXZpY2UpOworICAgIGlmICgqcFN1cmZhY2VGb3JtYXRDb3VudCkgeworICAgICAgICBpZiAocGh5c2ljYWxEZXZpY2VTdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSU3RhdGUgPCBRVUVSWV9DT1VOVCkgeworICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2VTdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSU3RhdGUgPSBRVUVSWV9DT1VOVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnBTdXJmYWNlRm9ybWF0Q291bnQgPiBwaHlzaWNhbERldmljZVN0YXRlLT5zdXJmYWNlX2Zvcm1hdHMuc2l6ZSgpKQorICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2VTdGF0ZS0+c3VyZmFjZV9mb3JtYXRzLnJlc2l6ZSgqcFN1cmZhY2VGb3JtYXRDb3VudCk7CisgICAgfQorICAgIGlmIChwU3VyZmFjZUZvcm1hdHMpIHsKKyAgICAgICAgaWYgKHBoeXNpY2FsRGV2aWNlU3RhdGUtPnZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUlN0YXRlIDwgUVVFUllfREVUQUlMUykgeworICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2VTdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSU3RhdGUgPSBRVUVSWV9ERVRBSUxTOworICAgICAgICB9CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFN1cmZhY2VGb3JtYXRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBwaHlzaWNhbERldmljZVN0YXRlLT5zdXJmYWNlX2Zvcm1hdHNbaV0gPSBwU3VyZmFjZUZvcm1hdHNbaV0uc3VyZmFjZUZvcm1hdDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAqcExhYmVsSW5mbykgeworICAgIEJlZ2luQ21kRGVidWdVdGlsc0xhYmVsKHJlcG9ydF9kYXRhLCBjb21tYW5kQnVmZmVyLCBwTGFiZWxJbmZvKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZEVuZERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikgeworICAgIEVuZENtZERlYnVnVXRpbHNMYWJlbChyZXBvcnRfZGF0YSwgY29tbWFuZEJ1ZmZlcik7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAqcExhYmVsSW5mbykgeworICAgIEluc2VydENtZERlYnVnVXRpbHNMYWJlbChyZXBvcnRfZGF0YSwgY29tbWFuZEJ1ZmZlciwgcExhYmVsSW5mbyk7CisKKyAgICAvLyBTcXVpcnJlbCBhd2F5IGFuIGVhc2lseSBhY2Nlc3NpYmxlIGNvcHkuCisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIGNiX3N0YXRlLT5kZWJ1Z19sYWJlbCA9IExvZ2dpbmdMYWJlbChwTGFiZWxJbmZvKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc1N0YXRlKAorICAgIHVpbnQzMl90ICpwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSICpwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpIHsKKyAgICBpZiAoTlVMTCAhPSBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICpwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNbaV0ucGh5c2ljYWxEZXZpY2VDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZSBjdXJfcGh5c19kZXYgPSBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNbaV0ucGh5c2ljYWxEZXZpY2VzW2pdOworICAgICAgICAgICAgICAgIGF1dG8gJnBoeXNfZGV2aWNlX3N0YXRlID0gcGh5c2ljYWxfZGV2aWNlX21hcFtjdXJfcGh5c19kZXZdOworICAgICAgICAgICAgICAgIHBoeXNfZGV2aWNlX3N0YXRlLnBoeXNfZGV2aWNlID0gY3VyX3BoeXNfZGV2OworICAgICAgICAgICAgICAgIC8vIEluaXQgYWN0dWFsIGZlYXR1cmVzIGZvciBlYWNoIHBoeXNpY2FsIGRldmljZQorICAgICAgICAgICAgICAgIERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhjdXJfcGh5c19kZXYsICZwaHlzX2RldmljZV9zdGF0ZS5mZWF0dXJlczIuZmVhdHVyZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoCisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QgKnBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIgKnBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcywKKyAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSAmJiAoVktfSU5DT01QTEVURSAhPSByZXN1bHQpKSByZXR1cm47CisgICAgUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNTdGF0ZShwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFIoCisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QgKnBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIgKnBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcywKKyAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSAmJiAoVktfSU5DT01QTEVURSAhPSByZXN1bHQpKSByZXR1cm47CisgICAgUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNTdGF0ZShwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LCBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ291bnRlckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSICpwQ291bnRlcnMpIHsKKyAgICBpZiAoTlVMTCA9PSBwQ291bnRlcnMpIHJldHVybjsKKworICAgIGF1dG8gcGh5c2ljYWxfZGV2aWNlX3N0YXRlID0gR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShwaHlzaWNhbERldmljZSk7CisgICAgYXNzZXJ0KHBoeXNpY2FsX2RldmljZV9zdGF0ZSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UVVFVUVfRkFNSUxZX1BFUkZfQ09VTlRFUlM+IHF1ZXVlRmFtaWx5Q291bnRlcnMobmV3IFFVRVVFX0ZBTUlMWV9QRVJGX0NPVU5URVJTKCkpOworICAgIHF1ZXVlRmFtaWx5Q291bnRlcnMtPmNvdW50ZXJzLnJlc2l6ZSgqcENvdW50ZXJDb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICpwQ291bnRlckNvdW50OyBpKyspIHF1ZXVlRmFtaWx5Q291bnRlcnMtPmNvdW50ZXJzW2ldID0gcENvdW50ZXJzW2ldOworCisgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT5wZXJmX2NvdW50ZXJzW3F1ZXVlRmFtaWx5SW5kZXhdID0gc3RkOjptb3ZlKHF1ZXVlRmFtaWx5Q291bnRlcnMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCAqcENvdW50ZXJDb3VudCwgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIgKnBDb3VudGVycywKKyAgICBWa1BlcmZvcm1hbmNlQ291bnRlckRlc2NyaXB0aW9uS0hSICpwQ291bnRlckRlc2NyaXB0aW9ucywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKChWS19TVUNDRVNTICE9IHJlc3VsdCkgJiYgKFZLX0lOQ09NUExFVEUgIT0gcmVzdWx0KSkgcmV0dXJuOworICAgIFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnMocGh5c2ljYWxEZXZpY2UsIHF1ZXVlRmFtaWx5SW5kZXgsIHBDb3VudGVyQ291bnQsIHBDb3VudGVycyk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHBlcmZvcm1hbmNlX2xvY2tfYWNxdWlyZWQgPSB0cnVlOworfQorCitib29sIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxWYWxpZGF0ZVJlbGVhc2VQcm9maWxpbmdMb2NrS0hSKFZrRGV2aWNlIGRldmljZSkgY29uc3QgeworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgaWYgKCFwZXJmb3JtYW5jZV9sb2NrX2FjcXVpcmVkKSB7CisgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIEhhbmRsZVRvVWludDY0KGRldmljZSksCisgICAgICAgICAgICAiVlVJRC12a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSLWRldmljZS0wMzIzNSIsCisgICAgICAgICAgICAiVGhlIHByb2ZpbGluZyBsb2NrIG9mIGRldmljZSBtdXN0IGhhdmUgYmVlbiBoZWxkIHZpYSBhIHByZXZpb3VzIHN1Y2Nlc3NmdWwgY2FsbCB0byB2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSLiIpOworICAgIH0KKworICAgIHJldHVybiBza2lwOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoVmtEZXZpY2UgZGV2aWNlKSB7CisgICAgcGVyZm9ybWFuY2VfbG9ja19hY3F1aXJlZCA9IGZhbHNlOworICAgIGZvciAoYXV0byAmY21kX2J1ZmZlciA6IGNvbW1hbmRCdWZmZXJNYXApIHsKKyAgICAgICAgY21kX2J1ZmZlci5zZWNvbmQtPnBlcmZvcm1hbmNlX2xvY2tfcmVsZWFzZWQgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCFkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpIHJldHVybjsKKyAgICBhdXRvIHRlbXBsYXRlX3N0YXRlID0gR2V0RGVzY3JpcHRvclRlbXBsYXRlU3RhdGUoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICB0ZW1wbGF0ZV9zdGF0ZS0+ZGVzdHJveWVkID0gdHJ1ZTsKKyAgICBkZXNjX3RlbXBsYXRlX21hcC5lcmFzZShkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBpZiAoIWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgcmV0dXJuOworICAgIGF1dG8gdGVtcGxhdGVfc3RhdGUgPSBHZXREZXNjcmlwdG9yVGVtcGxhdGVTdGF0ZShkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIHRlbXBsYXRlX3N0YXRlLT5kZXN0cm95ZWQgPSB0cnVlOworICAgIGRlc2NfdGVtcGxhdGVfbWFwLmVyYXNlKGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlU3RhdGUoY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpIHsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyBsb2NhbF9jcmVhdGVfaW5mbyhwQ3JlYXRlSW5mbyk7CisgICAgYXV0byB0ZW1wbGF0ZV9zdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEVNUExBVEVfU1RBVEU+KCpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCAmbG9jYWxfY3JlYXRlX2luZm8pOworICAgIGRlc2NfdGVtcGxhdGVfbWFwWypwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlXSA9IHN0ZDo6bW92ZSh0ZW1wbGF0ZV9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmIChWS19TVUNDRVNTICE9IHJlc3VsdCkgcmV0dXJuOworICAgIFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVN0YXRlKHBDcmVhdGVJbmZvLCBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUigKKyAgICBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiAqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlU3RhdGUocENyZWF0ZUluZm8sIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVTdGF0ZShWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBEYXRhKSB7CisgICAgYXV0byBjb25zdCB0ZW1wbGF0ZV9tYXBfZW50cnkgPSBkZXNjX3RlbXBsYXRlX21hcC5maW5kKGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgaWYgKCh0ZW1wbGF0ZV9tYXBfZW50cnkgPT0gZGVzY190ZW1wbGF0ZV9tYXAuZW5kKCkpIHx8ICh0ZW1wbGF0ZV9tYXBfZW50cnktPnNlY29uZC5nZXQoKSA9PSBudWxscHRyKSkgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgVEVNUExBVEVfU1RBVEUgKnRlbXBsYXRlX3N0YXRlID0gdGVtcGxhdGVfbWFwX2VudHJ5LT5zZWNvbmQuZ2V0KCk7CisgICAgICAgIC8vIFRPRE86IFJlY29yZCB0ZW1wbGF0ZSBwdXNoIGRlc2NyaXB0b3IgdXBkYXRlcworICAgICAgICBpZiAodGVtcGxhdGVfc3RhdGUtPmNyZWF0ZV9pbmZvLnRlbXBsYXRlVHlwZSA9PSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUKSB7CisgICAgICAgICAgICBQZXJmb3JtVXBkYXRlRGVzY3JpcHRvclNldHNXaXRoVGVtcGxhdGVLSFIoZGVzY3JpcHRvclNldCwgdGVtcGxhdGVfc3RhdGUsIHBEYXRhKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBEYXRhKSB7CisgICAgUmVjb3JkVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZVN0YXRlKGRlc2NyaXB0b3JTZXQsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgcERhdGEpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcERhdGEpIHsKKyAgICBSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlU3RhdGUoZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwRGF0YSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKAorICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsCisgICAgY29uc3Qgdm9pZCAqcERhdGEpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBjb25zdCBhdXRvIHRlbXBsYXRlX3N0YXRlID0gR2V0RGVzY3JpcHRvclRlbXBsYXRlU3RhdGUoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICBpZiAodGVtcGxhdGVfc3RhdGUpIHsKKyAgICAgICAgYXV0byBsYXlvdXRfZGF0YSA9IEdldFBpcGVsaW5lTGF5b3V0KGxheW91dCk7CisgICAgICAgIGF1dG8gZHNsID0gR2V0RHNsRnJvbVBpcGVsaW5lTGF5b3V0KGxheW91dF9kYXRhLCBzZXQpOworICAgICAgICBjb25zdCBhdXRvICZ0ZW1wbGF0ZV9jaSA9IHRlbXBsYXRlX3N0YXRlLT5jcmVhdGVfaW5mbzsKKyAgICAgICAgaWYgKGRzbCAmJiAhZHNsLT5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgIC8vIERlY29kZSB0aGUgdGVtcGxhdGUgaW50byBhIHNldCBvZiB3cml0ZSB1cGRhdGVzCisgICAgICAgICAgICBjdmRlc2NyaXB0b3JzZXQ6OkRlY29kZWRUZW1wbGF0ZVVwZGF0ZSBkZWNvZGVkX3RlbXBsYXRlKHRoaXMsIFZLX05VTExfSEFORExFLCB0ZW1wbGF0ZV9zdGF0ZSwgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzbC0+R2V0RGVzY3JpcHRvclNldExheW91dCgpKTsKKyAgICAgICAgICAgIFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0U3RhdGUoY2Jfc3RhdGUsIHRlbXBsYXRlX2NpLnBpcGVsaW5lQmluZFBvaW50LCBsYXlvdXQsIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlY29kZWRfdGVtcGxhdGUuZGVzY193cml0ZXMuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF90ZW1wbGF0ZS5kZXNjX3dyaXRlcy5kYXRhKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc1N0YXRlKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwgdm9pZCAqcFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIHBoeXNpY2FsX2RldmljZV9zdGF0ZSA9IEdldFBoeXNpY2FsRGV2aWNlU3RhdGUocGh5c2ljYWxEZXZpY2UpOworICAgIGlmICgqcFByb3BlcnR5Q291bnQpIHsKKyAgICAgICAgaWYgKHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJTdGF0ZSA8IFFVRVJZX0NPVU5UKSB7CisgICAgICAgICAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPnZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSU3RhdGUgPSBRVUVSWV9DT1VOVDsKKyAgICAgICAgICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJfY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwaHlzaWNhbF9kZXZpY2Vfc3RhdGUtPmRpc3BsYXlfcGxhbmVfcHJvcGVydHlfY291bnQgPSAqcFByb3BlcnR5Q291bnQ7CisgICAgfQorICAgIGlmIChwUHJvcGVydGllcykgeworICAgICAgICBpZiAocGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUlN0YXRlIDwgUVVFUllfREVUQUlMUykgeworICAgICAgICAgICAgcGh5c2ljYWxfZGV2aWNlX3N0YXRlLT52a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUlN0YXRlID0gUVVFUllfREVUQUlMUzsKKyAgICAgICAgICAgIHBoeXNpY2FsX2RldmljZV9zdGF0ZS0+dmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFJfY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUiAqcFByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCkgeworICAgIGlmICgoVktfU1VDQ0VTUyAhPSByZXN1bHQpICYmIChWS19JTkNPTVBMRVRFICE9IHJlc3VsdCkpIHJldHVybjsKKyAgICBSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNTdGF0ZShwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgKnBQcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKChWS19TVUNDRVNTICE9IHJlc3VsdCkgJiYgKFZLX0lOQ09NUExFVEUgIT0gcmVzdWx0KSkgcmV0dXJuOworICAgIFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc1N0YXRlKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kQmVnaW5RdWVyeUluZGV4ZWRFWFQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWVyeSwgVmtRdWVyeUNvbnRyb2xGbGFncyBmbGFncywgdWludDMyX3QgaW5kZXgpIHsKKyAgICBRdWVyeU9iamVjdCBxdWVyeV9vYmogPSB7cXVlcnlQb29sLCBxdWVyeSwgaW5kZXh9OworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBSZWNvcmRDbWRCZWdpblF1ZXJ5KGNiX3N0YXRlLCBxdWVyeV9vYmopOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kRW5kUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXJ5LCB1aW50MzJfdCBpbmRleCkgeworICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5X29iaiA9IHtxdWVyeVBvb2wsIHF1ZXJ5LCBpbmRleH07CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIFJlY29yZENtZEVuZFF1ZXJ5KGNiX3N0YXRlLCBxdWVyeV9vYmopOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25TdGF0ZShjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2Jjcl9jb252ZXJzaW9uKSB7CisgICAgaWYgKGRldmljZV9leHRlbnNpb25zLnZrX2FuZHJvaWRfZXh0ZXJuYWxfbWVtb3J5X2FuZHJvaWRfaGFyZHdhcmVfYnVmZmVyKSB7CisgICAgICAgIFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25BTkRST0lEKGNyZWF0ZV9pbmZvLCB5Y2Jjcl9jb252ZXJzaW9uKTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICpwWWNiY3JDb252ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvblN0YXRlKHBDcmVhdGVJbmZvLCAqcFljYmNyQ29udmVyc2lvbik7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uICpwWWNiY3JDb252ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvblN0YXRlKHBDcmVhdGVJbmZvLCAqcFljYmNyQ29udmVyc2lvbik7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCF5Y2JjckNvbnZlcnNpb24pIHJldHVybjsKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfYW5kcm9pZF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIHsKKyAgICAgICAgUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25BTkRST0lEKHljYmNyQ29udmVyc2lvbik7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgaWYgKCF5Y2JjckNvbnZlcnNpb24pIHJldHVybjsKKyAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfYW5kcm9pZF9leHRlcm5hbF9tZW1vcnlfYW5kcm9pZF9oYXJkd2FyZV9idWZmZXIpIHsKKyAgICAgICAgUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25BTkRST0lEKHljYmNyQ29udmVyc2lvbik7CisgICAgfQorfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkUmVzZXRRdWVyeVBvb2xFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVlcnlDb3VudCkgeworICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuCisgICAgaWYgKCFlbmFibGVkX2ZlYXR1cmVzLmhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXMuaG9zdFF1ZXJ5UmVzZXQpIHJldHVybjsKKworICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHF1ZXJ5IHBvb2wgaGFzIGJlZW4gZGVzdHJveWVkLgorICAgIGF1dG8gcXVlcnlfcG9vbF9zdGF0ZSA9IEdldFF1ZXJ5UG9vbFN0YXRlKHF1ZXJ5UG9vbCk7CisgICAgaWYgKCFxdWVyeV9wb29sX3N0YXRlKSByZXR1cm47CisKKyAgICAvLyBSZXNldCB0aGUgc3RhdGUgb2YgZXhpc3RpbmcgZW50cmllcy4KKyAgICBRdWVyeU9iamVjdCBxdWVyeV9vYmp7cXVlcnlQb29sLCAwfTsKKyAgICBRdWVyeU9iamVjdFBhc3MgcXVlcnlfcGFzc19vYmp7cXVlcnlfb2JqLCAwfTsKKyAgICBjb25zdCB1aW50MzJfdCBtYXhfcXVlcnlfY291bnQgPSBzdGQ6Om1pbihxdWVyeUNvdW50LCBxdWVyeV9wb29sX3N0YXRlLT5jcmVhdGVJbmZvLnF1ZXJ5Q291bnQgLSBmaXJzdFF1ZXJ5KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWF4X3F1ZXJ5X2NvdW50OyArK2kpIHsKKyAgICAgICAgcXVlcnlfb2JqLnF1ZXJ5ID0gZmlyc3RRdWVyeSArIGk7CisgICAgICAgIGF1dG8gcXVlcnlfaXQgPSBxdWVyeVRvU3RhdGVNYXAuZmluZChxdWVyeV9vYmopOworICAgICAgICBpZiAocXVlcnlfaXQgIT0gcXVlcnlUb1N0YXRlTWFwLmVuZCgpKSBxdWVyeV9pdC0+c2Vjb25kID0gUVVFUllTVEFURV9SRVNFVDsKKyAgICAgICAgaWYgKHF1ZXJ5X3Bvb2xfc3RhdGUtPmNyZWF0ZUluZm8ucXVlcnlUeXBlID09IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHBhc3NJbmRleCA9IDA7IHBhc3NJbmRleCA8IHF1ZXJ5X3Bvb2xfc3RhdGUtPm5fcGVyZm9ybWFuY2VfcGFzc2VzOyBwYXNzSW5kZXgrKykgeworICAgICAgICAgICAgICAgIHF1ZXJ5X3Bhc3Nfb2JqLnBlcmZfcGFzcyA9IHBhc3NJbmRleDsKKyAgICAgICAgICAgICAgICBhdXRvIHF1ZXJ5X3BlcmZfaXQgPSBxdWVyeVBhc3NUb1N0YXRlTWFwLmZpbmQocXVlcnlfcGFzc19vYmopOworICAgICAgICAgICAgICAgIGlmIChxdWVyeV9wZXJmX2l0ICE9IHF1ZXJ5UGFzc1RvU3RhdGVNYXAuZW5kKCkpIHF1ZXJ5X3BlcmZfaXQtPnNlY29uZCA9IFFVRVJZU1RBVEVfUkVTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UGVyZm9ybVVwZGF0ZURlc2NyaXB0b3JTZXRzV2l0aFRlbXBsYXRlS0hSKFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVEVNUExBVEVfU1RBVEUgKnRlbXBsYXRlX3N0YXRlLCBjb25zdCB2b2lkICpwRGF0YSkgeworICAgIC8vIFRyYW5zbGF0ZSB0aGUgdGVtcGxhdGVkIHVwZGF0ZSBpbnRvIGEgbm9ybWFsIHVwZGF0ZSBmb3IgdmFsaWRhdGlvbi4uLgorICAgIGN2ZGVzY3JpcHRvcnNldDo6RGVjb2RlZFRlbXBsYXRlVXBkYXRlIGRlY29kZWRfdXBkYXRlKHRoaXMsIGRlc2NyaXB0b3JTZXQsIHRlbXBsYXRlX3N0YXRlLCBwRGF0YSk7CisgICAgY3ZkZXNjcmlwdG9yc2V0OjpQZXJmb3JtVXBkYXRlRGVzY3JpcHRvclNldHModGhpcywgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlY29kZWRfdXBkYXRlLmRlc2Nfd3JpdGVzLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF91cGRhdGUuZGVzY193cml0ZXMuZGF0YSgpLCAwLCBOVUxMKTsKK30KKworLy8gVXBkYXRlIHRoZSBjb21tb24gQWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6VXBkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEoY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICpwX2FsbG9jX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2ZGVzY3JpcHRvcnNldDo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEgKmRzX2RhdGEpIGNvbnN0IHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcF9hbGxvY19pbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQ7IGkrKykgeworICAgICAgICBhdXRvIGxheW91dCA9IEdldERlc2NyaXB0b3JTZXRMYXlvdXRTaGFyZWQocF9hbGxvY19pbmZvLT5wU2V0TGF5b3V0c1tpXSk7CisgICAgICAgIGlmIChsYXlvdXQpIHsKKyAgICAgICAgICAgIGRzX2RhdGEtPmxheW91dF9ub2Rlc1tpXSA9IGxheW91dDsKKyAgICAgICAgICAgIC8vIENvdW50IHRvdGFsIGRlc2NyaXB0b3JzIHJlcXVpcmVkIHBlciB0eXBlCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbGF5b3V0LT5HZXRCaW5kaW5nQ291bnQoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmYmluZGluZ19sYXlvdXQgPSBsYXlvdXQtPkdldERlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nUHRyRnJvbUluZGV4KGopOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGVJbmRleCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihiaW5kaW5nX2xheW91dC0+ZGVzY3JpcHRvclR5cGUpOworICAgICAgICAgICAgICAgIGRzX2RhdGEtPnJlcXVpcmVkX2Rlc2NyaXB0b3JzX2J5X3R5cGVbdHlwZUluZGV4XSArPSBiaW5kaW5nX2xheW91dC0+ZGVzY3JpcHRvckNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEFueSB1bmtub3duIGxheW91dHMgd2lsbCBiZSBmbGFnZ2VkIGFzIGVycm9ycyBkdXJpbmcgVmFsaWRhdGVBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCkgY2FsbAorICAgIH0KK30KKworLy8gRGVjcmVtZW50IGFsbG9jYXRlZCBzZXRzIGZyb20gdGhlIHBvb2wgYW5kIGluc2VydCBuZXcgc2V0cyBpbnRvIHNldF9tYXAKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UGVyZm9ybUFsbG9jYXRlRGVzY3JpcHRvclNldHMoY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICpwX2FsbG9jX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCAqZGVzY3JpcHRvcl9zZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdmRlc2NyaXB0b3JzZXQ6OkFsbG9jYXRlRGVzY3JpcHRvclNldHNEYXRhICpkc19kYXRhKSB7CisgICAgYXV0byBwb29sX3N0YXRlID0gZGVzY3JpcHRvclBvb2xNYXBbcF9hbGxvY19pbmZvLT5kZXNjcmlwdG9yUG9vbF0uZ2V0KCk7CisgICAgLy8gQWNjb3VudCBmb3Igc2V0cyBhbmQgaW5kaXZpZHVhbCBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQgZnJvbSBwb29sCisgICAgcG9vbF9zdGF0ZS0+YXZhaWxhYmxlU2V0cyAtPSBwX2FsbG9jX2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudDsKKyAgICBmb3IgKGF1dG8gaXQgPSBkc19kYXRhLT5yZXF1aXJlZF9kZXNjcmlwdG9yc19ieV90eXBlLmJlZ2luKCk7IGl0ICE9IGRzX2RhdGEtPnJlcXVpcmVkX2Rlc2NyaXB0b3JzX2J5X3R5cGUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgcG9vbF9zdGF0ZS0+YXZhaWxhYmxlRGVzY3JpcHRvclR5cGVDb3VudFtpdC0+Zmlyc3RdIC09IGRzX2RhdGEtPnJlcXVpcmVkX2Rlc2NyaXB0b3JzX2J5X3R5cGUuYXQoaXQtPmZpcnN0KTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICp2YXJpYWJsZV9jb3VudF9pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQ+KHBfYWxsb2NfaW5mby0+cE5leHQpOworICAgIGJvb2wgdmFyaWFibGVfY291bnRfdmFsaWQgPSB2YXJpYWJsZV9jb3VudF9pbmZvICYmIHZhcmlhYmxlX2NvdW50X2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudCA9PSBwX2FsbG9jX2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudDsKKworICAgIC8vIENyZWF0ZSB0cmFja2luZyBvYmplY3QgZm9yIGVhY2ggZGVzY3JpcHRvciBzZXQ7IGluc2VydCBpbnRvIGdsb2JhbCBtYXAgYW5kIHRoZSBwb29sJ3Mgc2V0LgorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwX2FsbG9jX2luZm8tPmRlc2NyaXB0b3JTZXRDb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IHZhcmlhYmxlX2NvdW50ID0gdmFyaWFibGVfY291bnRfdmFsaWQgPyB2YXJpYWJsZV9jb3VudF9pbmZvLT5wRGVzY3JpcHRvckNvdW50c1tpXSA6IDA7CisKKyAgICAgICAgYXV0byBuZXdfZHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldD4oZGVzY3JpcHRvcl9zZXRzW2ldLCBwb29sX3N0YXRlLCBkc19kYXRhLT5sYXlvdXRfbm9kZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX2NvdW50LCB0aGlzLCByZXBvcnRfZGF0YSk7CisgICAgICAgIHBvb2xfc3RhdGUtPnNldHMuaW5zZXJ0KG5ld19kcy5nZXQoKSk7CisgICAgICAgIG5ld19kcy0+aW5fdXNlLnN0b3JlKDApOworICAgICAgICBzZXRNYXBbZGVzY3JpcHRvcl9zZXRzW2ldXSA9IHN0ZDo6bW92ZShuZXdfZHMpOworICAgIH0KK30KKworLy8gR2VuZXJpYyBmdW5jdGlvbiB0byBoYW5kbGUgc3RhdGUgdXBkYXRlIGZvciBhbGwgQ21kRHJhdyogYW5kIENtZERpc3BhdGNoKiB0eXBlIGZ1bmN0aW9ucwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpVcGRhdGVTdGF0ZUNtZERyYXdEaXNwYXRjaFR5cGUoQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUsIFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCkgeworICAgIFVwZGF0ZURyYXdTdGF0ZShjYl9zdGF0ZSwgYmluZF9wb2ludCk7CisgICAgY2Jfc3RhdGUtPmhhc0Rpc3BhdGNoQ21kID0gdHJ1ZTsKK30KKworLy8gR2VuZXJpYyBmdW5jdGlvbiB0byBoYW5kbGUgc3RhdGUgdXBkYXRlIGZvciBhbGwgQ21kRHJhdyogdHlwZSBmdW5jdGlvbnMKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6VXBkYXRlU3RhdGVDbWREcmF3VHlwZShDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSwgVmtQaXBlbGluZUJpbmRQb2ludCBiaW5kX3BvaW50KSB7CisgICAgVXBkYXRlU3RhdGVDbWREcmF3RGlzcGF0Y2hUeXBlKGNiX3N0YXRlLCBiaW5kX3BvaW50KTsKKyAgICBjYl9zdGF0ZS0+aGFzRHJhd0NtZCA9IHRydWU7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDbWREcmF3KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCBmaXJzdEluc3RhbmNlKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIFVwZGF0ZVN0YXRlQ21kRHJhd1R5cGUoY2Jfc3RhdGUsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGV4ZWQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBVcGRhdGVTdGF0ZUNtZERyYXdUeXBlKGNiX3N0YXRlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICBVcGRhdGVTdGF0ZUNtZERyYXdUeXBlKGNiX3N0YXRlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTKTsKKyAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0J1ZmZlcihjYl9zdGF0ZSwgYnVmZmVyX3N0YXRlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBzdHJpZGUpIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgQlVGRkVSX1NUQVRFICpidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShidWZmZXIpOworICAgIFVwZGF0ZVN0YXRlQ21kRHJhd1R5cGUoY2Jfc3RhdGUsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MpOworICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nQnVmZmVyKGNiX3N0YXRlLCBidWZmZXJfc3RhdGUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kRGlzcGF0Y2goVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICBDTURfQlVGRkVSX1NUQVRFICpjYl9zdGF0ZSA9IEdldENCU3RhdGUoY29tbWFuZEJ1ZmZlcik7CisgICAgVXBkYXRlU3RhdGVDbWREcmF3RGlzcGF0Y2hUeXBlKGNiX3N0YXRlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlBvc3RDYWxsUmVjb3JkQ21kRGlzcGF0Y2hJbmRpcmVjdChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCkgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBVcGRhdGVTdGF0ZUNtZERyYXdEaXNwYXRjaFR5cGUoY2Jfc3RhdGUsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSk7CisgICAgQlVGRkVSX1NUQVRFICpidWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShidWZmZXIpOworICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nQnVmZmVyKGNiX3N0YXRlLCBidWZmZXJfc3RhdGUpOworfQorCit2b2lkIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6OlByZUNhbGxSZWNvcmRDbWREcmF3SW5kaXJlY3RDb3VudEtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtCdWZmZXIgY291bnRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgY291bnRCdWZmZXJPZmZzZXQsIHVpbnQzMl90IG1heERyYXdDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSkgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgQlVGRkVSX1NUQVRFICpjb3VudF9idWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShjb3VudEJ1ZmZlcik7CisgICAgVXBkYXRlU3RhdGVDbWREcmF3VHlwZShjYl9zdGF0ZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfc3RhdGUsIGJ1ZmZlcl9zdGF0ZSk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfc3RhdGUsIGNvdW50X2J1ZmZlcl9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrQnVmZmVyIGNvdW50QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSkgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgQlVGRkVSX1NUQVRFICpjb3VudF9idWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShjb3VudEJ1ZmZlcik7CisgICAgVXBkYXRlU3RhdGVDbWREcmF3VHlwZShjYl9zdGF0ZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfc3RhdGUsIGJ1ZmZlcl9zdGF0ZSk7CisgICAgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdCdWZmZXIoY2Jfc3RhdGUsIGNvdW50X2J1ZmZlcl9zdGF0ZSk7Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UHJlQ2FsbFJlY29yZENtZERyYXdNZXNoVGFza3NOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdGFza0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0VGFzaykgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBVcGRhdGVTdGF0ZUNtZERyYXdUeXBlKGNiX3N0YXRlLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSB7CisgICAgQ01EX0JVRkZFUl9TVEFURSAqY2Jfc3RhdGUgPSBHZXRDQlN0YXRlKGNvbW1hbmRCdWZmZXIpOworICAgIFVwZGF0ZVN0YXRlQ21kRHJhd1R5cGUoY2Jfc3RhdGUsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MpOworICAgIEJVRkZFUl9TVEFURSAqYnVmZmVyX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyX3N0YXRlKSB7CisgICAgICAgIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nQnVmZmVyKGNiX3N0YXRlLCBidWZmZXJfc3RhdGUpOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQcmVDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0J1ZmZlciBjb3VudEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIGNvdW50QnVmZmVyT2Zmc2V0LCB1aW50MzJfdCBtYXhEcmF3Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSkgeworICAgIENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlID0gR2V0Q0JTdGF0ZShjb21tYW5kQnVmZmVyKTsKKyAgICBCVUZGRVJfU1RBVEUgKmJ1ZmZlcl9zdGF0ZSA9IEdldEJ1ZmZlclN0YXRlKGJ1ZmZlcik7CisgICAgQlVGRkVSX1NUQVRFICpjb3VudF9idWZmZXJfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZShjb3VudEJ1ZmZlcik7CisgICAgVXBkYXRlU3RhdGVDbWREcmF3VHlwZShjYl9zdGF0ZSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUyk7CisgICAgaWYgKGJ1ZmZlcl9zdGF0ZSkgeworICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0J1ZmZlcihjYl9zdGF0ZSwgYnVmZmVyX3N0YXRlKTsKKyAgICB9CisgICAgaWYgKGNvdW50X2J1ZmZlcl9zdGF0ZSkgeworICAgICAgICBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0J1ZmZlcihjYl9zdGF0ZSwgY291bnRfYnVmZmVyX3N0YXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UG9zdENhbGxSZWNvcmRDcmVhdGVTaGFkZXJNb2R1bGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2hhZGVyTW9kdWxlICpwU2hhZGVyTW9kdWxlLCBWa1Jlc3VsdCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNzbV9zdGF0ZV9kYXRhKSB7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzdWx0KSByZXR1cm47CisgICAgY3JlYXRlX3NoYWRlcl9tb2R1bGVfYXBpX3N0YXRlICpjc21fc3RhdGUgPSByZWludGVycHJldF9jYXN0PGNyZWF0ZV9zaGFkZXJfbW9kdWxlX2FwaV9zdGF0ZSAqPihjc21fc3RhdGVfZGF0YSk7CisKKyAgICBzcHZfdGFyZ2V0X2VudiBzcGlydl9lbnZpcm9ubWVudCA9ICgoYXBpX3ZlcnNpb24gPj0gVktfQVBJX1ZFUlNJT05fMV8xKSA/IFNQVl9FTlZfVlVMS0FOXzFfMSA6IFNQVl9FTlZfVlVMS0FOXzFfMCk7CisgICAgYm9vbCBpc19zcGlydiA9IChwQ3JlYXRlSW5mby0+cENvZGVbMF0gPT0gc3B2OjpNYWdpY051bWJlcik7CisgICAgYXV0byBuZXdfc2hhZGVyX21vZHVsZSA9IGlzX3NwaXJ2ID8gc3RkOjptYWtlX3NoYXJlZDxTSEFERVJfTU9EVUxFX1NUQVRFPihwQ3JlYXRlSW5mbywgKnBTaGFkZXJNb2R1bGUsIHNwaXJ2X2Vudmlyb25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NtX3N0YXRlLT51bmlxdWVfc2hhZGVyX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0ZDo6bWFrZV9zaGFyZWQ8U0hBREVSX01PRFVMRV9TVEFURT4oKTsKKyAgICBzaGFkZXJNb2R1bGVNYXBbKnBTaGFkZXJNb2R1bGVdID0gc3RkOjptb3ZlKG5ld19zaGFkZXJfbW9kdWxlKTsKK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpSZWNvcmRQaXBlbGluZVNoYWRlclN0YWdlKFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gY29uc3QgKnBTdGFnZSwgUElQRUxJTkVfU1RBVEUgKnBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVMSU5FX1NUQVRFOjpTdGFnZVN0YXRlICpzdGFnZV9zdGF0ZSkgY29uc3QgeworICAgIC8vIFZhbGlkYXRpb24gc2hvdWxkbid0IHJlbHkgb24gYW55dGhpbmcgaW4gc3RhZ2Ugc3RhdGUgYmVpbmcgdmFsaWQgaWYgdGhlIHNwaXJ2IGlzbid0CisgICAgYXV0byBtb2R1bGUgPSBHZXRTaGFkZXJNb2R1bGVTdGF0ZShwU3RhZ2UtPm1vZHVsZSk7CisgICAgaWYgKCFtb2R1bGUtPmhhc192YWxpZF9zcGlydikgcmV0dXJuOworCisgICAgLy8gVmFsaWRhdGlvbiBzaG91bGRuJ3QgcmVseSBvbiBhbnl0aGluZyBpbiBzdGFnZSBzdGF0ZSBiZWluZyB2YWxpZCBpZiB0aGUgZW50cnlwb2ludCBpc24ndCBwcmVzZW50CisgICAgYXV0byBlbnRyeXBvaW50ID0gRmluZEVudHJ5cG9pbnQobW9kdWxlLCBwU3RhZ2UtPnBOYW1lLCBwU3RhZ2UtPnN0YWdlKTsKKyAgICBpZiAoZW50cnlwb2ludCA9PSBtb2R1bGUtPmVuZCgpKSByZXR1cm47CisKKyAgICAvLyBNYXJrIGFjY2Vzc2libGUgaWRzCisgICAgc3RhZ2Vfc3RhdGUtPmFjY2Vzc2libGVfaWRzID0gTWFya0FjY2Vzc2libGVJZHMobW9kdWxlLCBlbnRyeXBvaW50KTsKKyAgICBQcm9jZXNzRXhlY3V0aW9uTW9kZXMobW9kdWxlLCBlbnRyeXBvaW50LCBwaXBlbGluZSk7CisKKyAgICBzdGFnZV9zdGF0ZS0+ZGVzY3JpcHRvcl91c2VzID0KKyAgICAgICAgQ29sbGVjdEludGVyZmFjZUJ5RGVzY3JpcHRvclNsb3QocmVwb3J0X2RhdGEsIG1vZHVsZSwgc3RhZ2Vfc3RhdGUtPmFjY2Vzc2libGVfaWRzLCAmc3RhZ2Vfc3RhdGUtPmhhc193cml0YWJsZV9kZXNjcmlwdG9yKTsKKyAgICAvLyBDYXB0dXJlIGRlc2NyaXB0b3IgdXNlcyBmb3IgdGhlIHBpcGVsaW5lCisgICAgZm9yIChhdXRvIHVzZSA6IHN0YWdlX3N0YXRlLT5kZXNjcmlwdG9yX3VzZXMpIHsKKyAgICAgICAgLy8gV2hpbGUgdmFsaWRhdGluZyBzaGFkZXJzIGNhcHR1cmUgd2hpY2ggc2xvdHMgYXJlIHVzZWQgYnkgdGhlIHBpcGVsaW5lCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNsb3QgPSB1c2UuZmlyc3QuZmlyc3Q7CisgICAgICAgIGF1dG8gJnJlcXMgPSBwaXBlbGluZS0+YWN0aXZlX3Nsb3RzW3Nsb3RdW3VzZS5maXJzdC5zZWNvbmRdOworICAgICAgICByZXFzID0gZGVzY3JpcHRvcl9yZXEocmVxcyB8IERlc2NyaXB0b3JUeXBlVG9SZXFzKG1vZHVsZSwgdXNlLnNlY29uZC50eXBlX2lkKSk7CisgICAgICAgIHBpcGVsaW5lLT5tYXhfYWN0aXZlX3Nsb3QgPSBzdGQ6Om1heChwaXBlbGluZS0+bWF4X2FjdGl2ZV9zbG90LCBzbG90KTsKKyAgICB9Cit9CisKK3ZvaWQgVmFsaWRhdGlvblN0YXRlVHJhY2tlcjo6UmVzZXRDb21tYW5kQnVmZmVyUHVzaENvbnN0YW50RGF0YUlmSW5jb21wYXRpYmxlKENNRF9CVUZGRVJfU1RBVEUgKmNiX3N0YXRlLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCkgeworICAgIGlmIChjYl9zdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBQSVBFTElORV9MQVlPVVRfU1RBVEUgKnBpcGVsaW5lX2xheW91dF9zdGF0ZSA9IEdldFBpcGVsaW5lTGF5b3V0KGxheW91dCk7CisgICAgaWYgKHBpcGVsaW5lX2xheW91dF9zdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2Jfc3RhdGUtPnB1c2hfY29uc3RhbnRfZGF0YV9yYW5nZXMgIT0gcGlwZWxpbmVfbGF5b3V0X3N0YXRlLT5wdXNoX2NvbnN0YW50X3JhbmdlcykgeworICAgICAgICBjYl9zdGF0ZS0+cHVzaF9jb25zdGFudF9kYXRhX3JhbmdlcyA9IHBpcGVsaW5lX2xheW91dF9zdGF0ZS0+cHVzaF9jb25zdGFudF9yYW5nZXM7CisgICAgICAgIGNiX3N0YXRlLT5wdXNoX2NvbnN0YW50X2RhdGEuY2xlYXIoKTsKKyAgICAgICAgdWludDMyX3Qgc2l6ZV9uZWVkZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gcHVzaF9jb25zdGFudF9yYW5nZSA6ICpjYl9zdGF0ZS0+cHVzaF9jb25zdGFudF9kYXRhX3JhbmdlcykgeworICAgICAgICAgICAgc2l6ZV9uZWVkZWQgPSBzdGQ6Om1heChzaXplX25lZWRlZCwgKHB1c2hfY29uc3RhbnRfcmFuZ2Uub2Zmc2V0ICsgcHVzaF9jb25zdGFudF9yYW5nZS5zaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgY2Jfc3RhdGUtPnB1c2hfY29uc3RhbnRfZGF0YS5yZXNpemUoc2l6ZV9uZWVkZWQsIDApOworICAgIH0KK30KKwordm9pZCBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjpQb3N0Q2FsbFJlY29yZEdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTd2FwY2hhaW5JbWFnZUNvdW50LCBWa0ltYWdlICpwU3dhcGNoYWluSW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBpZiAoKHJlc3VsdCAhPSBWS19TVUNDRVNTKSAmJiAocmVzdWx0ICE9IFZLX0lOQ09NUExFVEUpKSByZXR1cm47CisgICAgYXV0byBzd2FwY2hhaW5fc3RhdGUgPSBHZXRTd2FwY2hhaW5TdGF0ZShzd2FwY2hhaW4pOworCisgICAgaWYgKCpwU3dhcGNoYWluSW1hZ2VDb3VudCA+IHN3YXBjaGFpbl9zdGF0ZS0+aW1hZ2VzLnNpemUoKSkgc3dhcGNoYWluX3N0YXRlLT5pbWFnZXMucmVzaXplKCpwU3dhcGNoYWluSW1hZ2VDb3VudCk7CisKKyAgICBpZiAocFN3YXBjaGFpbkltYWdlcykgeworICAgICAgICBpZiAoc3dhcGNoYWluX3N0YXRlLT52a0dldFN3YXBjaGFpbkltYWdlc0tIUlN0YXRlIDwgUVVFUllfREVUQUlMUykgeworICAgICAgICAgICAgc3dhcGNoYWluX3N0YXRlLT52a0dldFN3YXBjaGFpbkltYWdlc0tIUlN0YXRlID0gUVVFUllfREVUQUlMUzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKnBTd2FwY2hhaW5JbWFnZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzd2FwY2hhaW5fc3RhdGUtPmltYWdlc1tpXS5pbWFnZSAhPSBWS19OVUxMX0hBTkRMRSkgY29udGludWU7ICAvLyBBbHJlYWR5IHJldHJpZXZlZCB0aGlzLgorCisgICAgICAgICAgICAvLyBBZGQgaW1hZ2VNYXAgZW50cmllcyBmb3IgZWFjaCBzd2FwY2hhaW4gaW1hZ2UKKyAgICAgICAgICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NpOworICAgICAgICAgICAgaW1hZ2VfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIGltYWdlX2NpLnBOZXh0ID0gbnVsbHB0cjsgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHNldCBsYXRlcgorICAgICAgICAgICAgaW1hZ2VfY2kuZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUOyAgLy8gdG8gYmUgdXBkYXRlZCBiZWxvdworICAgICAgICAgICAgaW1hZ2VfY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICAgICAgICAgIGltYWdlX2NpLmZvcm1hdCA9IHN3YXBjaGFpbl9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZUZvcm1hdDsKKyAgICAgICAgICAgIGltYWdlX2NpLmV4dGVudC53aWR0aCA9IHN3YXBjaGFpbl9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZUV4dGVudC53aWR0aDsKKyAgICAgICAgICAgIGltYWdlX2NpLmV4dGVudC5oZWlnaHQgPSBzd2FwY2hhaW5fc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VFeHRlbnQuaGVpZ2h0OworICAgICAgICAgICAgaW1hZ2VfY2kuZXh0ZW50LmRlcHRoID0gMTsKKyAgICAgICAgICAgIGltYWdlX2NpLm1pcExldmVscyA9IDE7CisgICAgICAgICAgICBpbWFnZV9jaS5hcnJheUxheWVycyA9IHN3YXBjaGFpbl9zdGF0ZS0+Y3JlYXRlSW5mby5pbWFnZUFycmF5TGF5ZXJzOworICAgICAgICAgICAgaW1hZ2VfY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICAgICAgICAgIGltYWdlX2NpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgICAgICAgICAgaW1hZ2VfY2kudXNhZ2UgPSBzd2FwY2hhaW5fc3RhdGUtPmNyZWF0ZUluZm8uaW1hZ2VVc2FnZTsKKyAgICAgICAgICAgIGltYWdlX2NpLnNoYXJpbmdNb2RlID0gc3dhcGNoYWluX3N0YXRlLT5jcmVhdGVJbmZvLmltYWdlU2hhcmluZ01vZGU7CisgICAgICAgICAgICBpbWFnZV9jaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSBzd2FwY2hhaW5fc3RhdGUtPmNyZWF0ZUluZm8ucXVldWVGYW1pbHlJbmRleENvdW50OworICAgICAgICAgICAgaW1hZ2VfY2kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IHN3YXBjaGFpbl9zdGF0ZS0+Y3JlYXRlSW5mby5wUXVldWVGYW1pbHlJbmRpY2VzOworICAgICAgICAgICAgaW1hZ2VfY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisKKyAgICAgICAgICAgIGltYWdlX2NpLnBOZXh0ID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtJbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvS0hSPihzd2FwY2hhaW5fc3RhdGUtPmNyZWF0ZUluZm8ucE5leHQpOworCisgICAgICAgICAgICBpZiAoc3dhcGNoYWluX3N0YXRlLT5jcmVhdGVJbmZvLmZsYWdzICYgVktfU1dBUENIQUlOX0NSRUFURV9TUExJVF9JTlNUQU5DRV9CSU5EX1JFR0lPTlNfQklUX0tIUikKKyAgICAgICAgICAgICAgICBpbWFnZV9jaS5mbGFncyB8PSBWS19JTUFHRV9DUkVBVEVfU1BMSVRfSU5TVEFOQ0VfQklORF9SRUdJT05TX0JJVDsKKyAgICAgICAgICAgIGlmIChzd2FwY2hhaW5fc3RhdGUtPmNyZWF0ZUluZm8uZmxhZ3MgJiBWS19TV0FQQ0hBSU5fQ1JFQVRFX1BST1RFQ1RFRF9CSVRfS0hSKQorICAgICAgICAgICAgICAgIGltYWdlX2NpLmZsYWdzIHw9IFZLX0lNQUdFX0NSRUFURV9QUk9URUNURURfQklUOworICAgICAgICAgICAgaWYgKHN3YXBjaGFpbl9zdGF0ZS0+Y3JlYXRlSW5mby5mbGFncyAmIFZLX1NXQVBDSEFJTl9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUX0tIUikKKyAgICAgICAgICAgICAgICBpbWFnZV9jaS5mbGFncyB8PSAoVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCB8IFZLX0lNQUdFX0NSRUFURV9FWFRFTkRFRF9VU0FHRV9CSVRfS0hSKTsKKworICAgICAgICAgICAgaW1hZ2VNYXBbcFN3YXBjaGFpbkltYWdlc1tpXV0gPSBzdGQ6Om1ha2Vfc2hhcmVkPElNQUdFX1NUQVRFPihwU3dhcGNoYWluSW1hZ2VzW2ldLCAmaW1hZ2VfY2kpOworICAgICAgICAgICAgYXV0byAmaW1hZ2Vfc3RhdGUgPSBpbWFnZU1hcFtwU3dhcGNoYWluSW1hZ2VzW2ldXTsKKyAgICAgICAgICAgIGltYWdlX3N0YXRlLT52YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgaW1hZ2Vfc3RhdGUtPmNyZWF0ZV9mcm9tX3N3YXBjaGFpbiA9IHN3YXBjaGFpbjsKKyAgICAgICAgICAgIGltYWdlX3N0YXRlLT5iaW5kX3N3YXBjaGFpbiA9IHN3YXBjaGFpbjsKKyAgICAgICAgICAgIGltYWdlX3N0YXRlLT5iaW5kX3N3YXBjaGFpbl9pbWFnZUluZGV4ID0gaTsKKyAgICAgICAgICAgIHN3YXBjaGFpbl9zdGF0ZS0+aW1hZ2VzW2ldLmltYWdlID0gcFN3YXBjaGFpbkltYWdlc1tpXTsKKyAgICAgICAgICAgIHN3YXBjaGFpbl9zdGF0ZS0+aW1hZ2VzW2ldLmJvdW5kX2ltYWdlcy5lbXBsYWNlKHBTd2FwY2hhaW5JbWFnZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCpwU3dhcGNoYWluSW1hZ2VDb3VudCkgeworICAgICAgICBpZiAoc3dhcGNoYWluX3N0YXRlLT52a0dldFN3YXBjaGFpbkltYWdlc0tIUlN0YXRlIDwgUVVFUllfQ09VTlQpIHsKKyAgICAgICAgICAgIHN3YXBjaGFpbl9zdGF0ZS0+dmtHZXRTd2FwY2hhaW5JbWFnZXNLSFJTdGF0ZSA9IFFVRVJZX0NPVU5UOworICAgICAgICB9CisgICAgICAgIHN3YXBjaGFpbl9zdGF0ZS0+Z2V0X3N3YXBjaGFpbl9pbWFnZV9jb3VudCA9ICpwU3dhcGNoYWluSW1hZ2VDb3VudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvc3RhdGVfdHJhY2tlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3N0YXRlX3RyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTk0YmUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3N0YXRlX3RyYWNrZXIuaApAQCAtMCwwICsxLDExMDEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leWdvQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJjb3JlX3ZhbGlkYXRpb25fZXJyb3JfZW51bXMuaCIKKyNpbmNsdWRlICJjb3JlX3ZhbGlkYXRpb25fdHlwZXMuaCIKKyNpbmNsdWRlICJkZXNjcmlwdG9yX3NldHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9sb2dnaW5nLmgiCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisjaW5jbHVkZSAidmtfdHlwZW1hcF9oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9kYXRhLmgiCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtYXA+CisKK2VudW0gU3luY1Njb3BlIHsKKyAgICBrU3luY1Njb3BlSW50ZXJuYWwsCisgICAga1N5bmNTY29wZUV4dGVybmFsVGVtcG9yYXJ5LAorICAgIGtTeW5jU2NvcGVFeHRlcm5hbFBlcm1hbmVudCwKK307CisKK2VudW0gRkVOQ0VfU1RBVFVTIHsgRkVOQ0VfVU5TSUdOQUxFRCwgRkVOQ0VfSU5GTElHSFQsIEZFTkNFX1JFVElSRUQgfTsKKworY2xhc3MgRkVOQ0VfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgcHVibGljOgorICAgIFZrRmVuY2UgZmVuY2U7CisgICAgVmtGZW5jZUNyZWF0ZUluZm8gY3JlYXRlSW5mbzsKKyAgICBzdGQ6OnBhaXI8VmtRdWV1ZSwgdWludDY0X3Q+IHNpZ25hbGVyOworICAgIEZFTkNFX1NUQVRVUyBzdGF0ZTsKKyAgICBTeW5jU2NvcGUgc2NvcGU7CisKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgRkVOQ0VfU1RBVEUoKSA6IHN0YXRlKEZFTkNFX1VOU0lHTkFMRUQpLCBzY29wZShrU3luY1Njb3BlSW50ZXJuYWwpIHt9Cit9OworCitjbGFzcyBTRU1BUEhPUkVfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgcHVibGljOgorICAgIHN0ZDo6cGFpcjxWa1F1ZXVlLCB1aW50NjRfdD4gc2lnbmFsZXI7CisgICAgYm9vbCBzaWduYWxlZDsKKyAgICBTeW5jU2NvcGUgc2NvcGU7CisgICAgVmtTZW1hcGhvcmVUeXBlS0hSIHR5cGU7CisgICAgdWludDY0X3QgcGF5bG9hZDsKK307CisKK2NsYXNzIEVWRU5UX1NUQVRFIDogcHVibGljIEJBU0VfTk9ERSB7CisgIHB1YmxpYzoKKyAgICBpbnQgd3JpdGVfaW5fdXNlOworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzazsKK307CisKK2NsYXNzIFFVRVVFX1NUQVRFIHsKKyAgcHVibGljOgorICAgIFZrUXVldWUgcXVldWU7CisgICAgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleDsKKworICAgIHVpbnQ2NF90IHNlcTsKKyAgICBzdGQ6OmRlcXVlPENCX1NVQk1JU1NJT04+IHN1Ym1pc3Npb25zOworfTsKKworY2xhc3MgUVVFUllfUE9PTF9TVEFURSA6IHB1YmxpYyBCQVNFX05PREUgeworICBwdWJsaWM6CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIGNyZWF0ZUluZm87CisgICAgVmtRdWVyeVBvb2wgcG9vbDsKKworICAgIGJvb2wgaGFzX3BlcmZfc2NvcGVfY29tbWFuZF9idWZmZXIgPSBmYWxzZTsKKyAgICBib29sIGhhc19wZXJmX3Njb3BlX3JlbmRlcl9wYXNzID0gZmFsc2U7CisgICAgdWludDMyX3Qgbl9wZXJmb3JtYW5jZV9wYXNzZXMgPSAwOworfTsKKworY2xhc3MgUVVFVUVfRkFNSUxZX1BFUkZfQ09VTlRFUlMgeworICBwdWJsaWM6CisgICAgc3RkOjp2ZWN0b3I8VmtQZXJmb3JtYW5jZUNvdW50ZXJLSFI+IGNvdW50ZXJzOworfTsKKworc3RydWN0IFBIWVNJQ0FMX0RFVklDRV9TVEFURSB7CisgICAgLy8gVHJhY2sgdGhlIGNhbGwgc3RhdGUgYW5kIGFycmF5IHNpemVzIGZvciB2YXJpb3VzIHF1ZXJ5IGZ1bmN0aW9ucworICAgIENBTExfU1RBVEUgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllc1N0YXRlID0gVU5DQUxMRUQ7CisgICAgQ0FMTF9TVEFURSB2a0dldFBoeXNpY2FsRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzU3RhdGUgPSBVTkNBTExFRDsKKyAgICBDQUxMX1NUQVRFIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzU3RhdGUgPSBVTkNBTExFRDsKKyAgICBDQUxMX1NUQVRFIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlc1N0YXRlID0gVU5DQUxMRUQ7CisgICAgQ0FMTF9TVEFURSB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUlN0YXRlID0gVU5DQUxMRUQ7CisgICAgYm9vbCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUl9jYWxsZWQgPSBmYWxzZTsKKyAgICBDQUxMX1NUQVRFIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSU3RhdGUgPSBVTkNBTExFRDsKKyAgICBDQUxMX1NUQVRFIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUlN0YXRlID0gVU5DQUxMRUQ7CisgICAgQ0FMTF9TVEFURSB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUlN0YXRlID0gVU5DQUxMRUQ7CisgICAgYm9vbCB2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUl9jYWxsZWQgPSBmYWxzZTsKKyAgICBzYWZlX1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgZmVhdHVyZXMyID0ge307CisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzX2RldmljZSA9IFZLX05VTExfSEFORExFOworICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9rbm93bl9jb3VudCA9IDE7ICAvLyBzcGVjIGltcGxpZXMgb25lIFFGIG11c3QgYWx3YXlzIGJlIHN1cHBvcnRlZAorICAgIHN0ZDo6dmVjdG9yPFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzPiBxdWV1ZV9mYW1pbHlfcHJvcGVydGllczsKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgc3VyZmFjZUNhcGFiaWxpdGllcyA9IHt9OworICAgIHN0ZDo6dmVjdG9yPFZrUHJlc2VudE1vZGVLSFI+IHByZXNlbnRfbW9kZXM7CisgICAgc3RkOjp2ZWN0b3I8VmtTdXJmYWNlRm9ybWF0S0hSPiBzdXJmYWNlX2Zvcm1hdHM7CisgICAgdWludDMyX3QgZGlzcGxheV9wbGFuZV9wcm9wZXJ0eV9jb3VudCA9IDA7CisKKyAgICAvLyBNYXAgb2YgcXVldWUgZmFtaWx5IGluZGV4IHRvIFFVRVVFX0ZBTUlMWV9QRVJGX0NPVU5URVJTCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBzdGQ6OnVuaXF1ZV9wdHI8UVVFVUVfRkFNSUxZX1BFUkZfQ09VTlRFUlM+PiBwZXJmX2NvdW50ZXJzOworfTsKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzYXZlIGRhdGEgYWNyb3NzIHRoZSBDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyBkb3duLWNoYWluIEFQSSBjYWxsCitzdHJ1Y3QgY3JlYXRlX2dyYXBoaWNzX3BpcGVsaW5lX2FwaV9zdGF0ZSB7CisgICAgc3RkOjp2ZWN0b3I8c2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvPiBncHVfY3JlYXRlX2luZm9zOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxQSVBFTElORV9TVEFURT4+IHBpcGVfc3RhdGU7CisgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zOworfTsKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzYXZlIGRhdGEgYWNyb3NzIHRoZSBDcmVhdGVDb21wdXRlUGlwZWxpbmVzIGRvd24tY2hhaW4gQVBJIGNhbGwKK3N0cnVjdCBjcmVhdGVfY29tcHV0ZV9waXBlbGluZV9hcGlfc3RhdGUgeworICAgIHN0ZDo6dmVjdG9yPHNhZmVfVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvPiBncHVfY3JlYXRlX2luZm9zOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxQSVBFTElORV9TVEFURT4+IHBpcGVfc3RhdGU7CisgICAgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3M7Cit9OworCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNhdmUgZGF0YSBhY3Jvc3MgdGhlIENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViBkb3duLWNoYWluIEFQSSBjYWxsLgorc3RydWN0IGNyZWF0ZV9yYXlfdHJhY2luZ19waXBlbGluZV9hcGlfc3RhdGUgeworICAgIHN0ZDo6dmVjdG9yPHNhZmVfVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlY+IGdwdV9jcmVhdGVfaW5mb3M7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFBJUEVMSU5FX1NUQVRFPj4gcGlwZV9zdGF0ZTsKKyAgICBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm9zOworfTsKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBtb2RpZnkgcGFyYW1ldGVycyBmb3IgdGhlIENyZWF0ZVBpcGVsaW5lTGF5b3V0IGRvd24tY2hhaW4gQVBJIGNhbGwKK3N0cnVjdCBjcmVhdGVfcGlwZWxpbmVfbGF5b3V0X2FwaV9zdGF0ZSB7CisgICAgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0PiBuZXdfbGF5b3V0czsKKyAgICBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBtb2RpZmllZF9jcmVhdGVfaW5mbzsKK307CisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgbW9kaWZ5IHBhcmFtZXRlcnMgZm9yIHRoZSBDcmVhdGVCdWZmZXIgZG93bi1jaGFpbiBBUEkgY2FsbAorc3RydWN0IGNyZWF0ZV9idWZmZXJfYXBpX3N0YXRlIHsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gbW9kaWZpZWRfY3JlYXRlX2luZm87Cit9OworCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIG1vZGlmeSBhbmQgcGFzcyBwYXJhbWV0ZXJzIGZvciB0aGUgQ3JlYXRlU2hhZGVyTW9kdWxlIGRvd24tY2hhaW4gQVBJIGNhbGwKK3N0cnVjdCBjcmVhdGVfc2hhZGVyX21vZHVsZV9hcGlfc3RhdGUgeworICAgIHVpbnQzMl90IHVuaXF1ZV9zaGFkZXJfaWQ7CisgICAgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIGluc3RydW1lbnRlZF9jcmVhdGVfaW5mbzsKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IGluc3RydW1lbnRlZF9wZ207Cit9OworCitzdHJ1Y3QgR3B1UXVldWUgeworICAgIFZrUGh5c2ljYWxEZXZpY2UgZ3B1OworICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleDsKK307CisKK3N0cnVjdCBTdWJyZXNvdXJjZVJhbmdlRXJyb3JDb2RlcyB7CisgICAgY29uc3QgY2hhciAqYmFzZV9taXBfZXJyLCAqbWlwX2NvdW50X2VyciwgKmJhc2VfbGF5ZXJfZXJyLCAqbGF5ZXJfY291bnRfZXJyOworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShHcHVRdWV1ZSBjb25zdCYgbGhzLCBHcHVRdWV1ZSBjb25zdCYgcmhzKSB7CisgICAgcmV0dXJuIChsaHMuZ3B1ID09IHJocy5ncHUgJiYgbGhzLnF1ZXVlX2ZhbWlseV9pbmRleCA9PSByaHMucXVldWVfZmFtaWx5X2luZGV4KTsKK30KKworbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8R3B1UXVldWU+IHsKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShHcHVRdWV1ZSBncSkgY29uc3QgdGhyb3coKSB7CisgICAgICAgIHJldHVybiBoYXNoPHVpbnQ2NF90PigpKCh1aW50NjRfdCkoZ3EuZ3B1KSkgXiBoYXNoPHVpbnQzMl90PigpKGdxLnF1ZXVlX2ZhbWlseV9pbmRleCk7CisgICAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworc3RydWN0IFNVUkZBQ0VfU1RBVEUgOiBwdWJsaWMgQkFTRV9OT0RFIHsKKyAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZSA9IFZLX05VTExfSEFORExFOworICAgIFNXQVBDSEFJTl9OT0RFKiBzd2FwY2hhaW4gPSBudWxscHRyOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxHcHVRdWV1ZSwgYm9vbD4gZ3B1X3F1ZXVlX3N1cHBvcnQ7CisKKyAgICBTVVJGQUNFX1NUQVRFKCkge30KKyAgICBTVVJGQUNFX1NUQVRFKFZrU3VyZmFjZUtIUiBzdXJmYWNlKSA6IHN1cmZhY2Uoc3VyZmFjZSkge30KK307CisKK3N0cnVjdCBTdWJwYXNzTGF5b3V0IHsKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICBWa0ltYWdlTGF5b3V0IGxheW91dDsKK307CisKK3VzaW5nIHN0ZDo6dW5vcmRlcmVkX21hcDsKKworI2RlZmluZSBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTX0lNUEwoaGFuZGxlX3R5cGUsIHN0YXRlX3R5cGUsIG1hcF9tZW1iZXIsIGluc3RhbmNlX3Njb3BlKSAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEdW1teT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBBY2Nlc3NvclN0YXRlSGFuZGxlPHN0YXRlX3R5cGUsIER1bW15PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1c2luZyBTdGF0ZVR5cGUgPSBzdGF0ZV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1c2luZyBIYW5kbGVUeXBlID0gaGFuZGxlX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFjY2Vzc29yVHJhaXRzVHlwZXM8c3RhdGVfdHlwZT46Ok1hcFR5cGUgbWFwX21lbWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEdW1teT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBBY2Nlc3NvclRyYWl0czxzdGF0ZV90eXBlLCBEdW1teT4gOiBBY2Nlc3NvclRyYWl0c1R5cGVzPHN0YXRlX3R5cGU+IHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBrSW5zdGFuY2VTY29wZSA9IGluc3RhbmNlX3Njb3BlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgTWFwVHlwZSBWYWxpZGF0aW9uU3RhdGVUcmFja2VyOjoqTWFwKCkgeyByZXR1cm4gJlZhbGlkYXRpb25TdGF0ZVRyYWNrZXI6Om1hcF9tZW1iZXI7IH0gXAorICAgIH07CisKKyNkZWZpbmUgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhoYW5kbGVfdHlwZSwgc3RhdGVfdHlwZSwgbWFwX21lbWJlcikgXAorICAgIFZBTFNUQVRFVFJBQ0tfTUFQX0FORF9UUkFJVFNfSU1QTChoYW5kbGVfdHlwZSwgc3RhdGVfdHlwZSwgbWFwX21lbWJlciwgZmFsc2UpCisjZGVmaW5lIFZBTFNUQVRFVFJBQ0tfTUFQX0FORF9UUkFJVFNfSU5TVEFOQ0VfU0NPUEUoaGFuZGxlX3R5cGUsIHN0YXRlX3R5cGUsIG1hcF9tZW1iZXIpIFwKKyAgICBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTX0lNUEwoaGFuZGxlX3R5cGUsIHN0YXRlX3R5cGUsIG1hcF9tZW1iZXIsIHRydWUpCisKKy8vIEEgc3BlY2lhbCBtZW1vcnkgaGFuZGxlIHVzZWQgdG8gZmxhZyBvYmplY3QgYXMgdW5ib3VuZCBmcm9tIG1lbW9yeQorc3RhdGljIGNvbnN0IFZrRGV2aWNlTWVtb3J5IE1FTU9SWV9VTkJPVU5EID0gVmtEZXZpY2VNZW1vcnkofigodWludDY0X3QpKDApKSAtIDEpOworCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dCBjb25zdD4gR2V0RHNsRnJvbVBpcGVsaW5lTGF5b3V0KAorICAgIFBJUEVMSU5FX0xBWU9VVF9TVEFURSBjb25zdCogbGF5b3V0X2RhdGEsIHVpbnQzMl90IHNldCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXQgY29uc3Q+IGRzbCA9IG51bGxwdHI7CisgICAgaWYgKGxheW91dF9kYXRhICYmIChzZXQgPCBsYXlvdXRfZGF0YS0+c2V0X2xheW91dHMuc2l6ZSgpKSkgeworICAgICAgICBkc2wgPSBsYXlvdXRfZGF0YS0+c2V0X2xheW91dHNbc2V0XTsKKyAgICB9CisgICAgcmV0dXJuIGRzbDsKK30KKworc3RydWN0IFNIQURFUl9NT0RVTEVfU1RBVEU7CisKK2NsYXNzIFZhbGlkYXRpb25TdGF0ZVRyYWNrZXIgOiBwdWJsaWMgVmFsaWRhdGlvbk9iamVjdCB7CisgIHB1YmxpYzoKKyAgICAvLyAgVE9ETyAtLSBtb3ZlIHRvIHByaXZhdGUKKyAgICAvLyAgVE9ETyAtLSBtYWtlIGNvbnNpc3RlbnQgd2l0aCB0cmFpdHMgYXBwcm9hY2ggYmVsb3cuCisgICAgdW5vcmRlcmVkX21hcDxWa1F1ZXVlLCBRVUVVRV9TVEFURT4gcXVldWVNYXA7CisgICAgdW5vcmRlcmVkX21hcDxWa0V2ZW50LCBFVkVOVF9TVEFURT4gZXZlbnRNYXA7CisKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8VmtRdWV1ZT4gcXVldWVzOyAgLy8gQWxsIHF1ZXVlcyB1bmRlciBnaXZlbiBkZXZpY2UKKyAgICBRdWVyeU1hcCBxdWVyeVRvU3RhdGVNYXA7CisgICAgUXVlcnlQYXNzTWFwIHF1ZXJ5UGFzc1RvU3RhdGVNYXA7CisgICAgdW5vcmRlcmVkX21hcDxWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24sIHVpbnQ2NF90PiB5Y2Jjcl9jb252ZXJzaW9uX2FoYl9mbXRfbWFwOworCisgICAgLy8gVHJhaXRzIGZvciBTdGF0ZSBmdW5jdGlvbiByZXNvbHV0aW9uLiAgU3BlY2lhbGl6YXRpb25zIGRlZmluZWQgaW4gdGhlIG1hY3JvLgorICAgIC8vIE5PVEU6IFRoZSBEdW1teSBhcmd1bWVudCBhbGxvd3MgZm9yICpwYXJ0aWFsKiBzcGVjaWFsaXphdGlvbiBhdCBjbGFzcyBzY29wZSwgYXMgZnVsbCBzcGVjaWFsaXphdGlvbiBhdCBjbGFzcyBzY29wZQorICAgIC8vICAgICAgIGlzbid0IHN1cHBvcnRlZCB1bnRpbCBDKysxNy4gIFNpbmNlIHRoZSBEdW1teSBoYXMgYSBkZWZhdWx0IGFsbCBpbnN0YW50aWF0aW9ucyBvZiB0aGUgdGVtcGxhdGUgY2FuIGlnbm9yZSBpdCwgYnV0IGFsbAorICAgIC8vICAgICAgIHNwZWNpYWxpemF0aW9ucyBvZiB0aGUgdGVtcGxhdGUgbXVzdCBsaXN0IGl0IChhbmQgbm90IGdpdmUgaXQgYSBkZWZhdWx0KS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVUeXBlLCB0eXBlbmFtZSBEdW1teSA9IGludD4KKyAgICBzdHJ1Y3QgQWNjZXNzb3JTdGF0ZUhhbmRsZSB7fTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVUeXBlLCB0eXBlbmFtZSBEdW1teSA9IGludD4KKyAgICBzdHJ1Y3QgQWNjZXNzb3JUcmFpdHMge307CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0YXRlVHlwZV8+CisgICAgc3RydWN0IEFjY2Vzc29yVHJhaXRzVHlwZXMgeworICAgICAgICB1c2luZyBTdGF0ZVR5cGUgPSBTdGF0ZVR5cGVfOworICAgICAgICB1c2luZyBIYW5kbGVUeXBlID0gdHlwZW5hbWUgQWNjZXNzb3JTdGF0ZUhhbmRsZTxTdGF0ZVR5cGU+OjpIYW5kbGVUeXBlOworICAgICAgICB1c2luZyBSZXR1cm5UeXBlID0gU3RhdGVUeXBlKjsKKyAgICAgICAgdXNpbmcgU2hhcmVkVHlwZSA9IHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZVR5cGU+OworICAgICAgICB1c2luZyBDb25zdFNoYXJlZFR5cGUgPSBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgU3RhdGVUeXBlPjsKKyAgICAgICAgdXNpbmcgTWFwcGVkVHlwZSA9IHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZVR5cGU+OworICAgICAgICB1c2luZyBNYXBUeXBlID0gdW5vcmRlcmVkX21hcDxIYW5kbGVUeXBlLCBNYXBwZWRUeXBlPjsKKyAgICB9OworCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa1JlbmRlclBhc3MsIFJFTkRFUl9QQVNTX1NUQVRFLCByZW5kZXJQYXNzTWFwKQorICAgIFZBTFNUQVRFVFJBQ0tfTUFQX0FORF9UUkFJVFMoVmtEZXNjcmlwdG9yU2V0TGF5b3V0LCBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXRMYXlvdXQsIGRlc2NyaXB0b3JTZXRMYXlvdXRNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa1NhbXBsZXIsIFNBTVBMRVJfU1RBVEUsIHNhbXBsZXJNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa0ltYWdlVmlldywgSU1BR0VfVklFV19TVEFURSwgaW1hZ2VWaWV3TWFwKQorICAgIFZBTFNUQVRFVFJBQ0tfTUFQX0FORF9UUkFJVFMoVmtJbWFnZSwgSU1BR0VfU1RBVEUsIGltYWdlTWFwKQorICAgIFZBTFNUQVRFVFJBQ0tfTUFQX0FORF9UUkFJVFMoVmtCdWZmZXJWaWV3LCBCVUZGRVJfVklFV19TVEFURSwgYnVmZmVyVmlld01hcCkKKyAgICBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTKFZrQnVmZmVyLCBCVUZGRVJfU1RBVEUsIGJ1ZmZlck1hcCkKKyAgICBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTKFZrUGlwZWxpbmUsIFBJUEVMSU5FX1NUQVRFLCBwaXBlbGluZU1hcCkKKyAgICBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTKFZrRGV2aWNlTWVtb3J5LCBERVZJQ0VfTUVNT1JZX1NUQVRFLCBtZW1PYmpNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa0ZyYW1lYnVmZmVyLCBGUkFNRUJVRkZFUl9TVEFURSwgZnJhbWVCdWZmZXJNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa1NoYWRlck1vZHVsZSwgU0hBREVSX01PRFVMRV9TVEFURSwgc2hhZGVyTW9kdWxlTWFwKQorICAgIFZBTFNUQVRFVFJBQ0tfTUFQX0FORF9UUkFJVFMoVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIsIFRFTVBMQVRFX1NUQVRFLCBkZXNjX3RlbXBsYXRlX21hcCkKKyAgICBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTKFZrU3dhcGNoYWluS0hSLCBTV0FQQ0hBSU5fTk9ERSwgc3dhcGNoYWluTWFwKQorICAgIFZBTFNUQVRFVFJBQ0tfTUFQX0FORF9UUkFJVFMoVmtEZXNjcmlwdG9yUG9vbCwgREVTQ1JJUFRPUl9QT09MX1NUQVRFLCBkZXNjcmlwdG9yUG9vbE1hcCkKKyAgICBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTKFZrRGVzY3JpcHRvclNldCwgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0LCBzZXRNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa0NvbW1hbmRCdWZmZXIsIENNRF9CVUZGRVJfU1RBVEUsIGNvbW1hbmRCdWZmZXJNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa0NvbW1hbmRQb29sLCBDT01NQU5EX1BPT0xfU1RBVEUsIGNvbW1hbmRQb29sTWFwKQorICAgIFZBTFNUQVRFVFJBQ0tfTUFQX0FORF9UUkFJVFMoVmtQaXBlbGluZUxheW91dCwgUElQRUxJTkVfTEFZT1VUX1NUQVRFLCBwaXBlbGluZUxheW91dE1hcCkKKyAgICBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTKFZrRmVuY2UsIEZFTkNFX1NUQVRFLCBmZW5jZU1hcCkKKyAgICBWQUxTVEFURVRSQUNLX01BUF9BTkRfVFJBSVRTKFZrUXVlcnlQb29sLCBRVUVSWV9QT09MX1NUQVRFLCBxdWVyeVBvb2xNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa1NlbWFwaG9yZSwgU0VNQVBIT1JFX1NUQVRFLCBzZW1hcGhvcmVNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUUyhWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WLCBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFLCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVNYXApCisgICAgVkFMU1RBVEVUUkFDS19NQVBfQU5EX1RSQUlUU19JTlNUQU5DRV9TQ09QRShWa1N1cmZhY2VLSFIsIFNVUkZBQ0VfU1RBVEUsIHN1cmZhY2VfbWFwKQorCisgICAgdm9pZCBBZGRBbGlhc2luZ0ltYWdlKElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSk7CisgICAgdm9pZCBSZW1vdmVBbGlhc2luZ0ltYWdlKElNQUdFX1NUQVRFKiBpbWFnZV9zdGF0ZSk7CisgICAgdm9pZCBSZW1vdmVBbGlhc2luZ0ltYWdlcyhjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8VmtJbWFnZT4mIGJvdW5kX2ltYWdlcyk7CisKKyAgcHVibGljOgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdGF0ZT4KKyAgICB0eXBlbmFtZSBBY2Nlc3NvclRyYWl0czxTdGF0ZT46OlJldHVyblR5cGUgR2V0KHR5cGVuYW1lIEFjY2Vzc29yVHJhaXRzPFN0YXRlPjo6SGFuZGxlVHlwZSBoYW5kbGUpIHsKKyAgICAgICAgdXNpbmcgVHJhaXRzID0gQWNjZXNzb3JUcmFpdHM8U3RhdGU+OworICAgICAgICBhdXRvIG1hcF9tZW1iZXIgPSBUcmFpdHM6Ok1hcCgpOworICAgICAgICBjb25zdCB0eXBlbmFtZSBUcmFpdHM6Ok1hcFR5cGUmIG1hcCA9CisgICAgICAgICAgICAoVHJhaXRzOjprSW5zdGFuY2VTY29wZSAmJiAodGhpcy0+Km1hcF9tZW1iZXIpLnNpemUoKSA9PSAwKSA/IGluc3RhbmNlX3N0YXRlLT4qbWFwX21lbWJlciA6IHRoaXMtPiptYXBfbWVtYmVyOworCisgICAgICAgIGNvbnN0IGF1dG8gZm91bmRfaXQgPSBtYXAuZmluZChoYW5kbGUpOworICAgICAgICBpZiAoZm91bmRfaXQgPT0gbWFwLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm91bmRfaXQtPnNlY29uZC5nZXQoKTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0YXRlPgorICAgIGNvbnN0IHR5cGVuYW1lIEFjY2Vzc29yVHJhaXRzPFN0YXRlPjo6UmV0dXJuVHlwZSBHZXQodHlwZW5hbWUgQWNjZXNzb3JUcmFpdHM8U3RhdGU+OjpIYW5kbGVUeXBlIGhhbmRsZSkgY29uc3QgeworICAgICAgICB1c2luZyBUcmFpdHMgPSBBY2Nlc3NvclRyYWl0czxTdGF0ZT47CisgICAgICAgIGF1dG8gbWFwX21lbWJlciA9IFRyYWl0czo6TWFwKCk7CisgICAgICAgIGNvbnN0IHR5cGVuYW1lIFRyYWl0czo6TWFwVHlwZSYgbWFwID0KKyAgICAgICAgICAgIChUcmFpdHM6OmtJbnN0YW5jZVNjb3BlICYmICh0aGlzLT4qbWFwX21lbWJlcikuc2l6ZSgpID09IDApID8gaW5zdGFuY2Vfc3RhdGUtPiptYXBfbWVtYmVyIDogdGhpcy0+Km1hcF9tZW1iZXI7CisKKyAgICAgICAgY29uc3QgYXV0byBmb3VuZF9pdCA9IG1hcC5maW5kKGhhbmRsZSk7CisgICAgICAgIGlmIChmb3VuZF9pdCA9PSBtYXAuY2VuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm91bmRfaXQtPnNlY29uZC5nZXQoKTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0YXRlPgorICAgIHR5cGVuYW1lIEFjY2Vzc29yVHJhaXRzPFN0YXRlPjo6U2hhcmVkVHlwZSBHZXRTaGFyZWQodHlwZW5hbWUgQWNjZXNzb3JUcmFpdHM8U3RhdGU+OjpIYW5kbGVUeXBlIGhhbmRsZSkgeworICAgICAgICB1c2luZyBUcmFpdHMgPSBBY2Nlc3NvclRyYWl0czxTdGF0ZT47CisgICAgICAgIGF1dG8gbWFwX21lbWJlciA9IFRyYWl0czo6TWFwKCk7CisgICAgICAgIGNvbnN0IHR5cGVuYW1lIFRyYWl0czo6TWFwVHlwZSYgbWFwID0KKyAgICAgICAgICAgIChUcmFpdHM6OmtJbnN0YW5jZVNjb3BlICYmICh0aGlzLT4qbWFwX21lbWJlcikuc2l6ZSgpID09IDApID8gaW5zdGFuY2Vfc3RhdGUtPiptYXBfbWVtYmVyIDogdGhpcy0+Km1hcF9tZW1iZXI7CisKKyAgICAgICAgY29uc3QgYXV0byBmb3VuZF9pdCA9IG1hcC5maW5kKGhhbmRsZSk7CisgICAgICAgIGlmIChmb3VuZF9pdCA9PSBtYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3VuZF9pdC0+c2Vjb25kOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGU+CisgICAgdHlwZW5hbWUgQWNjZXNzb3JUcmFpdHM8U3RhdGU+OjpDb25zdFNoYXJlZFR5cGUgR2V0U2hhcmVkKHR5cGVuYW1lIEFjY2Vzc29yVHJhaXRzPFN0YXRlPjo6SGFuZGxlVHlwZSBoYW5kbGUpIGNvbnN0IHsKKyAgICAgICAgdXNpbmcgVHJhaXRzID0gQWNjZXNzb3JUcmFpdHM8U3RhdGU+OworICAgICAgICBhdXRvIG1hcF9tZW1iZXIgPSBUcmFpdHM6Ok1hcCgpOworICAgICAgICBjb25zdCB0eXBlbmFtZSBUcmFpdHM6Ok1hcFR5cGUmIG1hcCA9CisgICAgICAgICAgICAoVHJhaXRzOjprSW5zdGFuY2VTY29wZSAmJiAodGhpcy0+Km1hcF9tZW1iZXIpLnNpemUoKSA9PSAwKSA/IGluc3RhbmNlX3N0YXRlLT4qbWFwX21lbWJlciA6IHRoaXMtPiptYXBfbWVtYmVyOworCisgICAgICAgIGNvbnN0IGF1dG8gZm91bmRfaXQgPSBtYXAuZmluZChoYW5kbGUpOworICAgICAgICBpZiAoZm91bmRfaXQgPT0gbWFwLmNlbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvdW5kX2l0LT5zZWNvbmQ7CisgICAgfTsKKworICAgIC8vIEFjY2Vzc29ycyBmb3IgdGhlIFZBTFNUQVRFLi4uIG1hcHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0PiBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U2hhcmVkKFZrRGVzY3JpcHRvclNldExheW91dCBkc0xheW91dCkgY29uc3QgeworICAgICAgICByZXR1cm4gR2V0U2hhcmVkPGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dD4oZHNMYXlvdXQpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0TGF5b3V0PiBHZXREZXNjcmlwdG9yU2V0TGF5b3V0U2hhcmVkKFZrRGVzY3JpcHRvclNldExheW91dCBkc0xheW91dCkgeworICAgICAgICByZXR1cm4gR2V0U2hhcmVkPGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldExheW91dD4oZHNMYXlvdXQpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSRU5ERVJfUEFTU19TVEFURT4gR2V0UmVuZGVyUGFzc1NoYXJlZChWa1JlbmRlclBhc3MgcmVuZGVycGFzcykgY29uc3QgeworICAgICAgICByZXR1cm4gR2V0U2hhcmVkPFJFTkRFUl9QQVNTX1NUQVRFPihyZW5kZXJwYXNzKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPFJFTkRFUl9QQVNTX1NUQVRFPiBHZXRSZW5kZXJQYXNzU2hhcmVkKFZrUmVuZGVyUGFzcyByZW5kZXJwYXNzKSB7CisgICAgICAgIHJldHVybiBHZXRTaGFyZWQ8UkVOREVSX1BBU1NfU1RBVEU+KHJlbmRlcnBhc3MpOworICAgIH0KKyAgICBjb25zdCBSRU5ERVJfUEFTU19TVEFURSogR2V0UmVuZGVyUGFzc1N0YXRlKFZrUmVuZGVyUGFzcyByZW5kZXJwYXNzKSBjb25zdCB7IHJldHVybiBHZXQ8UkVOREVSX1BBU1NfU1RBVEU+KHJlbmRlcnBhc3MpOyB9CisgICAgUkVOREVSX1BBU1NfU1RBVEUqIEdldFJlbmRlclBhc3NTdGF0ZShWa1JlbmRlclBhc3MgcmVuZGVycGFzcykgeyByZXR1cm4gR2V0PFJFTkRFUl9QQVNTX1NUQVRFPihyZW5kZXJwYXNzKTsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFNBTVBMRVJfU1RBVEU+IEdldFNhbXBsZXJTaGFyZWQoVmtTYW1wbGVyIHNhbXBsZXIpIGNvbnN0IHsgcmV0dXJuIEdldFNoYXJlZDxTQU1QTEVSX1NUQVRFPihzYW1wbGVyKTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxTQU1QTEVSX1NUQVRFPiBHZXRTYW1wbGVyU2hhcmVkKFZrU2FtcGxlciBzYW1wbGVyKSB7IHJldHVybiBHZXRTaGFyZWQ8U0FNUExFUl9TVEFURT4oc2FtcGxlcik7IH0KKyAgICBjb25zdCBTQU1QTEVSX1NUQVRFKiBHZXRTYW1wbGVyU3RhdGUoVmtTYW1wbGVyIHNhbXBsZXIpIGNvbnN0IHsgcmV0dXJuIEdldDxTQU1QTEVSX1NUQVRFPihzYW1wbGVyKTsgfQorICAgIFNBTVBMRVJfU1RBVEUqIEdldFNhbXBsZXJTdGF0ZShWa1NhbXBsZXIgc2FtcGxlcikgeyByZXR1cm4gR2V0PFNBTVBMRVJfU1RBVEU+KHNhbXBsZXIpOyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgSU1BR0VfVklFV19TVEFURT4gR2V0SW1hZ2VWaWV3U2hhcmVkKFZrSW1hZ2VWaWV3IGltYWdlX3ZpZXcpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEdldFNoYXJlZDxJTUFHRV9WSUVXX1NUQVRFPihpbWFnZV92aWV3KTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPElNQUdFX1ZJRVdfU1RBVEU+IEdldEltYWdlVmlld1NoYXJlZChWa0ltYWdlVmlldyBpbWFnZV92aWV3KSB7IHJldHVybiBHZXRTaGFyZWQ8SU1BR0VfVklFV19TVEFURT4oaW1hZ2Vfdmlldyk7IH0KKyAgICBjb25zdCBJTUFHRV9WSUVXX1NUQVRFKiBHZXRJbWFnZVZpZXdTdGF0ZShWa0ltYWdlVmlldyBpbWFnZV92aWV3KSBjb25zdCB7IHJldHVybiBHZXQ8SU1BR0VfVklFV19TVEFURT4oaW1hZ2Vfdmlldyk7IH0KKyAgICBJTUFHRV9WSUVXX1NUQVRFKiBHZXRJbWFnZVZpZXdTdGF0ZShWa0ltYWdlVmlldyBpbWFnZV92aWV3KSB7IHJldHVybiBHZXQ8SU1BR0VfVklFV19TVEFURT4oaW1hZ2Vfdmlldyk7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBJTUFHRV9TVEFURT4gR2V0SW1hZ2VTaGFyZWQoVmtJbWFnZSBpbWFnZSkgY29uc3QgeyByZXR1cm4gR2V0U2hhcmVkPElNQUdFX1NUQVRFPihpbWFnZSk7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SU1BR0VfU1RBVEU+IEdldEltYWdlU2hhcmVkKFZrSW1hZ2UgaW1hZ2UpIHsgcmV0dXJuIEdldFNoYXJlZDxJTUFHRV9TVEFURT4oaW1hZ2UpOyB9CisgICAgY29uc3QgSU1BR0VfU1RBVEUqIEdldEltYWdlU3RhdGUoVmtJbWFnZSBpbWFnZSkgY29uc3QgeyByZXR1cm4gR2V0PElNQUdFX1NUQVRFPihpbWFnZSk7IH0KKyAgICBJTUFHRV9TVEFURSogR2V0SW1hZ2VTdGF0ZShWa0ltYWdlIGltYWdlKSB7IHJldHVybiBHZXQ8SU1BR0VfU1RBVEU+KGltYWdlKTsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEJVRkZFUl9WSUVXX1NUQVRFPiBHZXRCdWZmZXJWaWV3U2hhcmVkKFZrQnVmZmVyVmlldyBidWZmZXJfdmlldykgY29uc3QgeworICAgICAgICByZXR1cm4gR2V0U2hhcmVkPEJVRkZFUl9WSUVXX1NUQVRFPihidWZmZXJfdmlldyk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxCVUZGRVJfVklFV19TVEFURT4gR2V0QnVmZmVyVmlld1NoYXJlZChWa0J1ZmZlclZpZXcgYnVmZmVyX3ZpZXcpIHsKKyAgICAgICAgcmV0dXJuIEdldFNoYXJlZDxCVUZGRVJfVklFV19TVEFURT4oYnVmZmVyX3ZpZXcpOworICAgIH0KKyAgICBjb25zdCBCVUZGRVJfVklFV19TVEFURSogR2V0QnVmZmVyVmlld1N0YXRlKFZrQnVmZmVyVmlldyBidWZmZXJfdmlldykgY29uc3QgeyByZXR1cm4gR2V0PEJVRkZFUl9WSUVXX1NUQVRFPihidWZmZXJfdmlldyk7IH0KKyAgICBCVUZGRVJfVklFV19TVEFURSogR2V0QnVmZmVyVmlld1N0YXRlKFZrQnVmZmVyVmlldyBidWZmZXJfdmlldykgeyByZXR1cm4gR2V0PEJVRkZFUl9WSUVXX1NUQVRFPihidWZmZXJfdmlldyk7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBCVUZGRVJfU1RBVEU+IEdldEJ1ZmZlclNoYXJlZChWa0J1ZmZlciBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIEdldFNoYXJlZDxCVUZGRVJfU1RBVEU+KGJ1ZmZlcik7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QlVGRkVSX1NUQVRFPiBHZXRCdWZmZXJTaGFyZWQoVmtCdWZmZXIgYnVmZmVyKSB7IHJldHVybiBHZXRTaGFyZWQ8QlVGRkVSX1NUQVRFPihidWZmZXIpOyB9CisgICAgY29uc3QgQlVGRkVSX1NUQVRFKiBHZXRCdWZmZXJTdGF0ZShWa0J1ZmZlciBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIEdldDxCVUZGRVJfU1RBVEU+KGJ1ZmZlcik7IH0KKyAgICBCVUZGRVJfU1RBVEUqIEdldEJ1ZmZlclN0YXRlKFZrQnVmZmVyIGJ1ZmZlcikgeyByZXR1cm4gR2V0PEJVRkZFUl9TVEFURT4oYnVmZmVyKTsgfQorCisgICAgY29uc3QgUElQRUxJTkVfU1RBVEUqIEdldFBpcGVsaW5lU3RhdGUoVmtQaXBlbGluZSBwaXBlbGluZSkgY29uc3QgeyByZXR1cm4gR2V0PFBJUEVMSU5FX1NUQVRFPihwaXBlbGluZSk7IH0KKyAgICBQSVBFTElORV9TVEFURSogR2V0UGlwZWxpbmVTdGF0ZShWa1BpcGVsaW5lIHBpcGVsaW5lKSB7IHJldHVybiBHZXQ8UElQRUxJTkVfU1RBVEU+KHBpcGVsaW5lKTsgfQorICAgIGNvbnN0IERFVklDRV9NRU1PUllfU1RBVEUqIEdldERldk1lbVN0YXRlKFZrRGV2aWNlTWVtb3J5IG1lbSkgY29uc3QgeyByZXR1cm4gR2V0PERFVklDRV9NRU1PUllfU1RBVEU+KG1lbSk7IH0KKyAgICBERVZJQ0VfTUVNT1JZX1NUQVRFKiBHZXREZXZNZW1TdGF0ZShWa0RldmljZU1lbW9yeSBtZW0pIHsgcmV0dXJuIEdldDxERVZJQ0VfTUVNT1JZX1NUQVRFPihtZW0pOyB9CisgICAgY29uc3QgRlJBTUVCVUZGRVJfU1RBVEUqIEdldEZyYW1lYnVmZmVyU3RhdGUoVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcikgY29uc3QgeyByZXR1cm4gR2V0PEZSQU1FQlVGRkVSX1NUQVRFPihmcmFtZWJ1ZmZlcik7IH0KKyAgICBGUkFNRUJVRkZFUl9TVEFURSogR2V0RnJhbWVidWZmZXJTdGF0ZShWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyKSB7IHJldHVybiBHZXQ8RlJBTUVCVUZGRVJfU1RBVEU+KGZyYW1lYnVmZmVyKTsgfQorICAgIGNvbnN0IFNIQURFUl9NT0RVTEVfU1RBVEUqIEdldFNoYWRlck1vZHVsZVN0YXRlKFZrU2hhZGVyTW9kdWxlIG1vZHVsZSkgY29uc3QgeyByZXR1cm4gR2V0PFNIQURFUl9NT0RVTEVfU1RBVEU+KG1vZHVsZSk7IH0KKyAgICBTSEFERVJfTU9EVUxFX1NUQVRFKiBHZXRTaGFkZXJNb2R1bGVTdGF0ZShWa1NoYWRlck1vZHVsZSBtb2R1bGUpIHsgcmV0dXJuIEdldDxTSEFERVJfTU9EVUxFX1NUQVRFPihtb2R1bGUpOyB9CisgICAgY29uc3QgVEVNUExBVEVfU1RBVEUqIEdldERlc2NyaXB0b3JUZW1wbGF0ZVN0YXRlKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBHZXQ8VEVNUExBVEVfU1RBVEU+KGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlKTsKKyAgICB9CisgICAgVEVNUExBVEVfU1RBVEUqIEdldERlc2NyaXB0b3JUZW1wbGF0ZVN0YXRlKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlKSB7CisgICAgICAgIHJldHVybiBHZXQ8VEVNUExBVEVfU1RBVEU+KGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlKTsKKyAgICB9CisgICAgY29uc3QgU1dBUENIQUlOX05PREUqIEdldFN3YXBjaGFpblN0YXRlKFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbikgY29uc3QgeyByZXR1cm4gR2V0PFNXQVBDSEFJTl9OT0RFPihzd2FwY2hhaW4pOyB9CisgICAgU1dBUENIQUlOX05PREUqIEdldFN3YXBjaGFpblN0YXRlKFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbikgeyByZXR1cm4gR2V0PFNXQVBDSEFJTl9OT0RFPihzd2FwY2hhaW4pOyB9CisgICAgY29uc3QgREVTQ1JJUFRPUl9QT09MX1NUQVRFKiBHZXREZXNjcmlwdG9yUG9vbFN0YXRlKGNvbnN0IFZrRGVzY3JpcHRvclBvb2wgcG9vbCkgY29uc3QgeworICAgICAgICByZXR1cm4gR2V0PERFU0NSSVBUT1JfUE9PTF9TVEFURT4ocG9vbCk7CisgICAgfQorICAgIERFU0NSSVBUT1JfUE9PTF9TVEFURSogR2V0RGVzY3JpcHRvclBvb2xTdGF0ZShjb25zdCBWa0Rlc2NyaXB0b3JQb29sIHBvb2wpIHsgcmV0dXJuIEdldDxERVNDUklQVE9SX1BPT0xfU1RBVEU+KHBvb2wpOyB9CisgICAgY29uc3QgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0KiBHZXRTZXROb2RlKFZrRGVzY3JpcHRvclNldCBzZXQpIGNvbnN0IHsgcmV0dXJuIEdldDxjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQ+KHNldCk7IH0KKyAgICBjdmRlc2NyaXB0b3JzZXQ6OkRlc2NyaXB0b3JTZXQqIEdldFNldE5vZGUoVmtEZXNjcmlwdG9yU2V0IHNldCkgeyByZXR1cm4gR2V0PGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldD4oc2V0KTsgfQorICAgIGNvbnN0IENNRF9CVUZGRVJfU1RBVEUqIEdldENCU3RhdGUoY29uc3QgVmtDb21tYW5kQnVmZmVyIGNiKSBjb25zdCB7IHJldHVybiBHZXQ8Q01EX0JVRkZFUl9TVEFURT4oY2IpOyB9CisgICAgQ01EX0JVRkZFUl9TVEFURSogR2V0Q0JTdGF0ZShjb25zdCBWa0NvbW1hbmRCdWZmZXIgY2IpIHsgcmV0dXJuIEdldDxDTURfQlVGRkVSX1NUQVRFPihjYik7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDT01NQU5EX1BPT0xfU1RBVEU+IEdldENvbW1hbmRQb29sU2hhcmVkKFZrQ29tbWFuZFBvb2wgcG9vbCkgY29uc3QgeworICAgICAgICByZXR1cm4gR2V0U2hhcmVkPENPTU1BTkRfUE9PTF9TVEFURT4ocG9vbCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDT01NQU5EX1BPT0xfU1RBVEU+IEdldENvbW1hbmRQb29sU2hhcmVkKFZrQ29tbWFuZFBvb2wgcG9vbCkgeyByZXR1cm4gR2V0U2hhcmVkPENPTU1BTkRfUE9PTF9TVEFURT4ocG9vbCk7IH0KKyAgICBjb25zdCBDT01NQU5EX1BPT0xfU1RBVEUqIEdldENvbW1hbmRQb29sU3RhdGUoVmtDb21tYW5kUG9vbCBwb29sKSBjb25zdCB7IHJldHVybiBHZXQ8Q09NTUFORF9QT09MX1NUQVRFPihwb29sKTsgfQorICAgIENPTU1BTkRfUE9PTF9TVEFURSogR2V0Q29tbWFuZFBvb2xTdGF0ZShWa0NvbW1hbmRQb29sIHBvb2wpIHsgcmV0dXJuIEdldDxDT01NQU5EX1BPT0xfU1RBVEU+KHBvb2wpOyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUElQRUxJTkVfTEFZT1VUX1NUQVRFPiBHZXRQaXBlbGluZUxheW91dFNoYXJlZChWa1BpcGVsaW5lTGF5b3V0IHBpcGVMYXlvdXQpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEdldFNoYXJlZDxQSVBFTElORV9MQVlPVVRfU1RBVEU+KHBpcGVMYXlvdXQpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8UElQRUxJTkVfTEFZT1VUX1NUQVRFPiBHZXRQaXBlbGluZUxheW91dFNoYXJlZChWa1BpcGVsaW5lTGF5b3V0IHBpcGVMYXlvdXQpIHsKKyAgICAgICAgcmV0dXJuIEdldFNoYXJlZDxQSVBFTElORV9MQVlPVVRfU1RBVEU+KHBpcGVMYXlvdXQpOworICAgIH0KKyAgICBjb25zdCBQSVBFTElORV9MQVlPVVRfU1RBVEUqIEdldFBpcGVsaW5lTGF5b3V0KFZrUGlwZWxpbmVMYXlvdXQgcGlwZUxheW91dCkgY29uc3QgeworICAgICAgICByZXR1cm4gR2V0PFBJUEVMSU5FX0xBWU9VVF9TVEFURT4ocGlwZUxheW91dCk7CisgICAgfQorICAgIFBJUEVMSU5FX0xBWU9VVF9TVEFURSogR2V0UGlwZWxpbmVMYXlvdXQoVmtQaXBlbGluZUxheW91dCBwaXBlTGF5b3V0KSB7IHJldHVybiBHZXQ8UElQRUxJTkVfTEFZT1VUX1NUQVRFPihwaXBlTGF5b3V0KTsgfQorCisgICAgY29uc3QgRkVOQ0VfU1RBVEUqIEdldEZlbmNlU3RhdGUoVmtGZW5jZSBmZW5jZSkgY29uc3QgeyByZXR1cm4gR2V0PEZFTkNFX1NUQVRFPihmZW5jZSk7IH0KKyAgICBGRU5DRV9TVEFURSogR2V0RmVuY2VTdGF0ZShWa0ZlbmNlIGZlbmNlKSB7IHJldHVybiBHZXQ8RkVOQ0VfU1RBVEU+KGZlbmNlKTsgfQorICAgIGNvbnN0IFFVRVJZX1BPT0xfU1RBVEUqIEdldFF1ZXJ5UG9vbFN0YXRlKFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2wpIGNvbnN0IHsgcmV0dXJuIEdldDxRVUVSWV9QT09MX1NUQVRFPihxdWVyeV9wb29sKTsgfQorICAgIFFVRVJZX1BPT0xfU1RBVEUqIEdldFF1ZXJ5UG9vbFN0YXRlKFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2wpIHsgcmV0dXJuIEdldDxRVUVSWV9QT09MX1NUQVRFPihxdWVyeV9wb29sKTsgfQorICAgIGNvbnN0IFNFTUFQSE9SRV9TVEFURSogR2V0U2VtYXBob3JlU3RhdGUoVmtTZW1hcGhvcmUgc2VtYXBob3JlKSBjb25zdCB7IHJldHVybiBHZXQ8U0VNQVBIT1JFX1NUQVRFPihzZW1hcGhvcmUpOyB9CisgICAgU0VNQVBIT1JFX1NUQVRFKiBHZXRTZW1hcGhvcmVTdGF0ZShWa1NlbWFwaG9yZSBzZW1hcGhvcmUpIHsgcmV0dXJuIEdldDxTRU1BUEhPUkVfU1RBVEU+KHNlbWFwaG9yZSk7IH0KKyAgICBjb25zdCBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFKiBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBHZXQ8QUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9TVEFURT4oYXMpOworICAgIH0KKyAgICBBQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1NUQVRFKiBHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVTdGF0ZShWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGFzKSB7CisgICAgICAgIHJldHVybiBHZXQ8QUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9TVEFURT4oYXMpOworICAgIH0KKyAgICBjb25zdCBTVVJGQUNFX1NUQVRFKiBHZXRTdXJmYWNlU3RhdGUoVmtTdXJmYWNlS0hSIHN1cmZhY2UpIGNvbnN0IHsgcmV0dXJuIEdldDxTVVJGQUNFX1NUQVRFPihzdXJmYWNlKTsgfQorICAgIFNVUkZBQ0VfU1RBVEUqIEdldFN1cmZhY2VTdGF0ZShWa1N1cmZhY2VLSFIgc3VyZmFjZSkgeyByZXR1cm4gR2V0PFNVUkZBQ0VfU1RBVEU+KHN1cmZhY2UpOyB9CisKKyAgICAvLyBDbGFzcyBEZWNsYXJhdGlvbnMgZm9yIGhlbHBlciBmdW5jdGlvbnMKKyAgICBJTUFHRV9WSUVXX1NUQVRFKiBHZXRBdHRhY2htZW50SW1hZ2VWaWV3U3RhdGUoRlJBTUVCVUZGRVJfU1RBVEUqIGZyYW1lYnVmZmVyLCB1aW50MzJfdCBpbmRleCk7CisgICAgY29uc3QgSU1BR0VfVklFV19TVEFURSogR2V0QXR0YWNobWVudEltYWdlVmlld1N0YXRlKGNvbnN0IEZSQU1FQlVGRkVSX1NUQVRFKiBmcmFtZWJ1ZmZlciwgdWludDMyX3QgaW5kZXgpIGNvbnN0OworICAgIGNvbnN0IEVWRU5UX1NUQVRFKiBHZXRFdmVudFN0YXRlKFZrRXZlbnQgZXZlbnQpIGNvbnN0OworICAgIEVWRU5UX1NUQVRFKiBHZXRFdmVudFN0YXRlKFZrRXZlbnQgZXZlbnQpOworICAgIGNvbnN0IFFVRVVFX1NUQVRFKiBHZXRRdWV1ZVN0YXRlKFZrUXVldWUgcXVldWUpIGNvbnN0OworICAgIFFVRVVFX1NUQVRFKiBHZXRRdWV1ZVN0YXRlKFZrUXVldWUgcXVldWUpOworICAgIGNvbnN0IEJJTkRBQkxFKiBHZXRPYmplY3RNZW1CaW5kaW5nKGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiB0eXBlZF9oYW5kbGUpIGNvbnN0OworICAgIEJJTkRBQkxFKiBHZXRPYmplY3RNZW1CaW5kaW5nKGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiB0eXBlZF9oYW5kbGUpOworCisgICAgLy8gVXNlZCBmb3IgaW5zdGFuY2UgdmVyc2lvbnMgb2YgdGhpcyBvYmplY3QKKyAgICB1bm9yZGVyZWRfbWFwPFZrUGh5c2ljYWxEZXZpY2UsIFBIWVNJQ0FMX0RFVklDRV9TVEFURT4gcGh5c2ljYWxfZGV2aWNlX21hcDsKKyAgICAvLyBMaW5rIHRvIHRoZSBkZXZpY2UncyBwaHlzaWNhbC1kZXZpY2UgZGF0YQorICAgIFBIWVNJQ0FMX0RFVklDRV9TVEFURSogcGh5c2ljYWxfZGV2aWNlX3N0YXRlOworCisgICAgLy8gTGluayBmb3IgZGVyaXZlZCBkZXZpY2Ugb2JqZWN0cyBiYWNrIHRvIHRoZWlyIHBhcmVudCBpbnN0YW5jZSBvYmplY3QKKyAgICBWYWxpZGF0aW9uU3RhdGVUcmFja2VyKiBpbnN0YW5jZV9zdGF0ZTsKKworICAgIGNvbnN0IFBIWVNJQ0FMX0RFVklDRV9TVEFURSogR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShWa1BoeXNpY2FsRGV2aWNlIHBoeXMpIGNvbnN0OworICAgIFBIWVNJQ0FMX0RFVklDRV9TVEFURSogR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZShWa1BoeXNpY2FsRGV2aWNlIHBoeXMpOworICAgIFBIWVNJQ0FMX0RFVklDRV9TVEFURSogR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZSgpOworICAgIGNvbnN0IFBIWVNJQ0FMX0RFVklDRV9TVEFURSogR2V0UGh5c2ljYWxEZXZpY2VTdGF0ZSgpIGNvbnN0OworCisgICAgdXNpbmcgQ29tbWFuZEJ1ZmZlclJlc2V0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoVmtDb21tYW5kQnVmZmVyKT47CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRCdWZmZXJSZXNldENhbGxiYWNrPiBjb21tYW5kX2J1ZmZlcl9yZXNldF9jYWxsYmFjazsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRm4+CisgICAgdm9pZCBTZXRDb21tYW5kQnVmZmVyUmVzZXRDYWxsYmFjayhGbiYmIGZuKSB7CisgICAgICAgIGNvbW1hbmRfYnVmZmVyX3Jlc2V0X2NhbGxiYWNrLnJlc2V0KG5ldyBDb21tYW5kQnVmZmVyUmVzZXRDYWxsYmFjayhzdGQ6OmZvcndhcmQ8Rm4+KGZuKSkpOworICAgIH0KKworICAgIHVzaW5nIFNldEltYWdlVmlld0luaXRpYWxMYXlvdXRDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChDTURfQlVGRkVSX1NUQVRFKiwgY29uc3QgSU1BR0VfVklFV19TVEFURSYsIFZrSW1hZ2VMYXlvdXQpPjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U2V0SW1hZ2VWaWV3SW5pdGlhbExheW91dENhbGxiYWNrPiBzZXRfaW1hZ2Vfdmlld19pbml0aWFsX2xheW91dF9jYWxsYmFjazsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRm4+CisgICAgdm9pZCBTZXRTZXRJbWFnZVZpZXdJbml0aWFsTGF5b3V0Q2FsbGJhY2soRm4mJiBmbikgeworICAgICAgICBzZXRfaW1hZ2Vfdmlld19pbml0aWFsX2xheW91dF9jYWxsYmFjay5yZXNldChuZXcgU2V0SW1hZ2VWaWV3SW5pdGlhbExheW91dENhbGxiYWNrKHN0ZDo6Zm9yd2FyZDxGbj4oZm4pKSk7CisgICAgfQorCisgICAgdm9pZCBDYWxsU2V0SW1hZ2VWaWV3SW5pdGlhbExheW91dENhbGxiYWNrKENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUsIGNvbnN0IElNQUdFX1ZJRVdfU1RBVEUmIGl2X3N0YXRlLCBWa0ltYWdlTGF5b3V0IGxheW91dCkgeworICAgICAgICBpZiAoc2V0X2ltYWdlX3ZpZXdfaW5pdGlhbF9sYXlvdXRfY2FsbGJhY2spIHsKKyAgICAgICAgICAgICgqc2V0X2ltYWdlX3ZpZXdfaW5pdGlhbF9sYXlvdXRfY2FsbGJhY2spKGNiX25vZGUsIGl2X3N0YXRlLCBsYXlvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RhdGUgdXBkYXRlIGZ1bmN0aW9ucworICAgIC8vIEdldHMvRW51bWVyYXRpb25zCisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKFZrSW5zdGFuY2UgaW5zdGFuY2UsIHVpbnQzMl90KiBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSKiBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIHVpbnQzMl90KiBwUGh5c2ljYWxEZXZpY2VHcm91cENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzS0hSKiBwUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCogcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlKiBwUGh5c2ljYWxEZXZpY2VzLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKAorICAgICAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCogcENvdW50ZXJDb3VudCwgVmtQZXJmb3JtYW5jZUNvdW50ZXJLSFIqIHBDb3VudGVycywKKyAgICAgICAgVmtQZXJmb3JtYW5jZUNvdW50ZXJEZXNjcmlwdGlvbktIUiogcENvdW50ZXJEZXNjcmlwdGlvbnMsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJLSFIqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiogcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlck1lbW9yeVJlcXVpcmVtZW50c0luZm8yS0hSKiBwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIqIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXREZXZpY2VRdWV1ZShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90IHF1ZXVlSW5kZXgsIFZrUXVldWUqIHBRdWV1ZSk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogcFF1ZXVlSW5mbywgVmtRdWV1ZSogcFF1ZXVlKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RmVuY2VGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRmVuY2VHZXRGZEluZm9LSFIqIHBHZXRGZEluZm8sIGludCogcEZkLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRGZW5jZVN0YXR1cyhWa0RldmljZSBkZXZpY2UsIFZrRmVuY2UgZmVuY2UsIFZrUmVzdWx0IHJlc3VsdCk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRGZW5jZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUdldFdpbjMySGFuZGxlSW5mb0tIUiogcEdldFdpbjMySGFuZGxlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEUqIHBIYW5kbGUsIFZrUmVzdWx0IHJlc3VsdCk7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa01lbW9yeVJlcXVpcmVtZW50cyogcE1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiogcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50czIqIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzIqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyKiBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCB1aW50MzJfdCogcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJLSFIqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzSW5mbzJLSFIqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIqIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSKiBwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUiogcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiBwRmVhdHVyZXMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiBwRmVhdHVyZXMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKiBwRmVhdHVyZXMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSKiBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcywgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMktIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VTdXJmYWNlSW5mbzJLSFIqIHBTdXJmYWNlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyS0hSKiBwU3VyZmFjZUNhcGFiaWxpdGllcywgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzMkVYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXMyRVhUKiBwU3VyZmFjZUNhcGFiaWxpdGllcywgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVmtTdXJmYWNlRm9ybWF0S0hSKiBwU3VyZmFjZUZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0czJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVN1cmZhY2VJbmZvMktIUiogcFN1cmZhY2VJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwgVmtTdXJmYWNlRm9ybWF0MktIUiogcFN1cmZhY2VGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFByZXNlbnRNb2RlQ291bnQsIFZrUHJlc2VudE1vZGVLSFIqIHBQcmVzZW50TW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIFZrQm9vbDMyKiBwU3VwcG9ydGVkLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlR2V0RmRJbmZvS0hSKiBwR2V0RmRJbmZvLCBpbnQqIHBGZCwgVmtSZXN1bHQgcmVzdWx0KTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEdldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVHZXRXaW4zMkhhbmRsZUluZm9LSFIqIHBHZXRXaW4zMkhhbmRsZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSogcEhhbmRsZSwgVmtSZXN1bHQgcmVzdWx0KTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90KiBwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UqIHBTd2FwY2hhaW5JbWFnZXMsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEltcG9ydEZlbmNlRmRLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0ltcG9ydEZlbmNlRmRJbmZvS0hSKiBwSW1wb3J0RmVuY2VGZEluZm8sIFZrUmVzdWx0IHJlc3VsdCk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSKFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltcG9ydEZlbmNlV2luMzJIYW5kbGVJbmZvS0hSKiBwSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRJbXBvcnRTZW1hcGhvcmVGZEtIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSKiBwSW1wb3J0U2VtYXBob3JlRmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mb0tIUiogcEltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRTaWduYWxTZW1hcGhvcmVLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NlbWFwaG9yZVNpZ25hbEluZm9LSFIqIHBTaWduYWxJbmZvLCBWa1Jlc3VsdCByZXN1bHQpOworCisgICAgLy8gQ3JlYXRlL0Rlc3Ryb3kvQmluZAorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WKiBwQmluZEluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VNZW1vcnkgbWVtLCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEJpbmRCdWZmZXJNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kQnVmZmVyTWVtb3J5SW5mb0tIUiogcEJpbmRJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQmluZEJ1ZmZlck1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvS0hSKiBwQmluZEluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlIGltYWdlLCBWa0RldmljZU1lbW9yeSBtZW0sIFZrRGV2aWNlU2l6ZSBtZW1vcnlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRCaW5kSW1hZ2VNZW1vcnkyKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgYmluZEluZm9Db3VudCwgY29uc3QgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvS0hSKiBwQmluZEluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEJpbmRJbWFnZU1lbW9yeTJLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm9LSFIqIHBCaW5kSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBncHUsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlKiBwRGV2aWNlLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworCisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYqIHBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrRGV2aWNlIGRldmljZSwgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhY2NlbGVyYXRpb25TdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyKiBwQnVmZmVyLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lCdWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlciBidWZmZXIsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrQnVmZmVyVmlldyogcFZpZXcsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUJ1ZmZlclZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0J1ZmZlclZpZXcgYnVmZmVyVmlldywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlQ29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtDb21tYW5kUG9vbCogcENvbW1hbmRQb29sLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURpc3BsYXlQbGFuZVN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtEaXNwbGF5U3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVFdmVudChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V2ZW50KiBwRXZlbnQsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlRGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtEZXNjcmlwdG9yUG9vbCogcERlc2NyaXB0b3JQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGVzY3JpcHRvclNldExheW91dCogcFNldExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRSZXNldENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgZmxhZ3MsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZFJlc2V0Q29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyBmbGFncywgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBpcGVfc3RhdGUpIGNvbnN0OworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywgVmtSZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBpcGVfc3RhdGUpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRSZXNldERlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUFsbG9jYXRlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCB2b2lkKiBhZHNfc3RhdGVfZGF0YSkgY29uc3Q7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZGVzY3JpcHRvclNldExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIqIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIqIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUZlbmNlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmVuY2UqIHBGZW5jZSwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95RmVuY2UoVmtEZXZpY2UgZGV2aWNlLCBWa0ZlbmNlIGZlbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRSZXNldEZlbmNlcyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGZlbmNlQ291bnQsIGNvbnN0IFZrRmVuY2UqIHBGZW5jZXMsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUZyYW1lYnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRnJhbWVidWZmZXIqIHBGcmFtZWJ1ZmZlciwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95RnJhbWVidWZmZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjZ3BsX3N0YXRlKSBjb25zdDsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCBWa1Jlc3VsdCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNncGxfc3RhdGUpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVJbWFnZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlKiBwSW1hZ2UsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveUltYWdlKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW1hZ2VWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtJbWFnZVZpZXcqIHBWaWV3LCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lJbWFnZVZpZXcoVmtEZXZpY2UgZGV2aWNlLCBWa0ltYWdlVmlldyBpbWFnZVZpZXcsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisKKyAgICB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UGlwZWxpbmUoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lTGF5b3V0KiBwUGlwZWxpbmVMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVBpcGVsaW5lTGF5b3V0KFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUXVlcnlQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtRdWVyeVBvb2wqIHBRdWVyeVBvb2wsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVF1ZXJ5UG9vbChWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkUmVzZXRRdWVyeVBvb2xFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksIHVpbnQzMl90IHF1ZXJ5Q291bnQpOworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBpcGVfc3RhdGUpIGNvbnN0OworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViogcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCBWa1Jlc3VsdCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwaXBlX3N0YXRlKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzKiBwUmVuZGVyUGFzcywgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmVuZGVyUGFzczJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzKiBwUmVuZGVyUGFzcywgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95UmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVTYW1wbGVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NhbXBsZXIqIHBTYW1wbGVyLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lTYW1wbGVyKFZrRGV2aWNlIGRldmljZSwgVmtTYW1wbGVyIHNhbXBsZXIsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiBwWWNiY3JDb252ZXJzaW9uLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uKiBwWWNiY3JDb252ZXJzaW9uLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUihWa0RldmljZSBkZXZpY2UsIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2JjckNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNlbWFwaG9yZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2VtYXBob3JlKiBwU2VtYXBob3JlLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lTZW1hcGhvcmUoVmtEZXZpY2UgZGV2aWNlLCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU2hhZGVyTW9kdWxlKiBwU2hhZGVyTW9kdWxlLCBWa1Jlc3VsdCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjc21fc3RhdGUpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZERlc3Ryb3lTaGFkZXJNb2R1bGUoVmtEZXZpY2UgZGV2aWNlLCBWa1NoYWRlck1vZHVsZSBzaGFkZXJNb2R1bGUsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRGVzdHJveVN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtTdXJmYWNlS0hSIHN1cmZhY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBzd2FwY2hhaW5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVTd2FwY2hhaW5LSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N3YXBjaGFpbktIUiogcFN3YXBjaGFpbiwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpOworCisgICAgLy8gQ29tbWFuZEJ1ZmZlci9RdWV1ZSBDb250cm9sCisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQmVnaW5Db21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qIHBCZWdpbkluZm8pOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmREZXZpY2VXYWl0SWRsZShWa0RldmljZSBkZXZpY2UsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEVuZENvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZFF1ZXVlQmluZFNwYXJzZShWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBiaW5kSW5mb0NvdW50LCBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiBwQmluZEluZm8sIFZrRmVuY2UgZmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZVByZXNlbnRLSFIoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb0tIUiogcFByZXNlbnRJbmZvLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZVN1Ym1pdChWa1F1ZXVlIHF1ZXVlLCB1aW50MzJfdCBzdWJtaXRDb3VudCwgY29uc3QgVmtTdWJtaXRJbmZvKiBwU3VibWl0cywgVmtGZW5jZSBmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkUXVldWVXYWl0SWRsZShWa1F1ZXVlIHF1ZXVlLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZFNldEV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZFdhaXRGb3JGZW5jZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlKiBwRmVuY2VzLCBWa0Jvb2wzMiB3YWl0QWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVvdXQsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEFjcXVpcmVQcm9maWxpbmdMb2NrS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIqIHBJbmZvLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIGJvb2wgUHJlQ2FsbFZhbGlkYXRlUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoVmtEZXZpY2UgZGV2aWNlKSBjb25zdDsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoVmtEZXZpY2UgZGV2aWNlKTsKKworICAgIC8vIEFsbG9jYXRlL0ZyZWUKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQWxsb2NhdGVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlciwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgVmtSZXN1bHQgcmVzdWx0LCB2b2lkKiBhZHNfc3RhdGUpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRBbGxvY2F0ZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrRGV2aWNlTWVtb3J5KiBwTWVtb3J5LCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZEZyZWVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkRnJlZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvcldyaXRlcywgdWludDMyX3QgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvckNvcGllcyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkKiBwRGF0YSk7CisKKyAgICAvLyBNZW1vcnkgbWFwcGluZworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRNYXBNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW0sIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCBWa0ZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBwRGF0YSwgVmtSZXN1bHQgcmVzdWx0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRVbm1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSk7CisKKyAgICAvLyBSZWNvcmRlZCBDb21tYW5kcworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJlZ2luRGVidWdVdGlsc0xhYmVsRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCogcExhYmVsSW5mbyk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEJlZ2luUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCwgVmtGbGFncyBmbGFncyk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEJlZ2luUXVlcnlJbmRleGVkRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXJ5Q29udHJvbEZsYWdzIGZsYWdzLCB1aW50MzJfdCBpbmRleCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQmVnaW5SZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRCZWdpblJlbmRlclBhc3MyS0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NCZWdpbkluZm9LSFIqIHBTdWJwYXNzQmVnaW5JbmZvKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRCaW5kRGVzY3JpcHRvclNldHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBmaXJzdFNldCwgdWludDMyX3Qgc2V0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzLCB1aW50MzJfdCBkeW5hbWljT2Zmc2V0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwRHluYW1pY09mZnNldHMpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmRJbmRleEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luZGV4VHlwZSBpbmRleFR5cGUpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZEJpbmRQaXBlbGluZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZSBwaXBlbGluZSk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3LCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRCaW5kVmVydGV4QnVmZmVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RCaW5kaW5nLCB1aW50MzJfdCBiaW5kaW5nQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXIqIHBCdWZmZXJzLCBjb25zdCBWa0RldmljZVNpemUqIHBPZmZzZXRzKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRCbGl0SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQmxpdCogcFJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmlsdGVyIGZpbHRlcik7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WKiBwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBpbnN0YW5jZURhdGEsIFZrRGV2aWNlU2l6ZSBpbnN0YW5jZU9mZnNldCwgVmtCb29sMzIgdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBzY3JhdGNoLCBWa0RldmljZVNpemUgc2NyYXRjaE9mZnNldCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQ2xlYXJDb2xvckltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSogcENvbG9yLCB1aW50MzJfdCByYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogcFJhbmdlcyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSogcERlcHRoU3RlbmNpbCwgdWludDMyX3QgcmFuZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiBwUmFuZ2VzKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgc3JjLCBWa0NvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNb2RlTlYgbW9kZSk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIHVpbnQzMl90IHJlZ2lvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJDb3B5KiBwUmVnaW9ucyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kQ29weUJ1ZmZlclRvSW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtJbWFnZSBkc3RJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSogcFJlZ2lvbnMpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZENvcHlJbWFnZVRvQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGRzdEJ1ZmZlciwgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiBwUmVnaW9ucyk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZENvcHlRdWVyeVBvb2xSZXN1bHRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IGZpcnN0UXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXJ5Q291bnQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVJlc3VsdEZsYWdzIGZsYWdzKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRGlzcGF0Y2goVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREaXNwYXRjaEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWREcmF3KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RWZXJ0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3RJbnN0YW5jZSk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRleGVkKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZERyYXdJbmRleGVkSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRHJhd0luZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZERyYXdJbmRpcmVjdENvdW50S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwgdWludDMyX3QgbWF4RHJhd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWREcmF3TWVzaFRhc2tzTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IHRhc2tDb3VudCwgdWludDMyX3QgZmlyc3RUYXNrKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kRGVidWdVdGlsc0xhYmVsRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kUXVlcnkoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3Qgc2xvdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENtZEVuZFF1ZXJ5SW5kZXhlZEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBxdWVyeSwgdWludDMyX3QgaW5kZXgpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRFbmRSZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kRW5kUmVuZGVyUGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU3VicGFzc0VuZEluZm9LSFIqIHBTdWJwYXNzRW5kSW5mbyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRXhlY3V0ZUNvbW1hbmRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyc0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqIHBDb21tYW5kQnVmZmVycyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kRmlsbEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGEpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQqIHBMYWJlbEluZm8pOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWROZXh0U3VicGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWROZXh0U3VicGFzczJLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrU3VicGFzc0JlZ2luSW5mb0tIUiogcFN1YnBhc3NCZWdpbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NFbmRJbmZvS0hSKiBwU3VicGFzc0VuZEluZm8pOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvcldyaXRlcyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LCB1aW50MzJfdCBzZXQsIGNvbnN0IHZvaWQqIHBEYXRhKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kUHVzaENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIFZrU2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSwgY29uc3Qgdm9pZCogcFZhbHVlcyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kUmVzZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VNYXNrKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kUmVzZXRRdWVyeVBvb2woVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVlcnlDb3VudCk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kUmVzb2x2ZUltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVJlc29sdmUqIHBSZWdpb25zKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRCbGVuZENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgZmxvYXQgYmxlbmRDb25zdGFudHNbNF0pOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldERlcHRoQmlhcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsIGZsb2F0IGRlcHRoQmlhc0NsYW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZXB0aEJpYXNTbG9wZUZhY3Rvcik7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RGVwdGhCb3VuZHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IG1pbkRlcHRoQm91bmRzLCBmbG9hdCBtYXhEZXB0aEJvdW5kcyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RXZlbnQoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrRXZlbnQgZXZlbnQsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlTWFzayk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdEV4Y2x1c2l2ZVNjaXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCwgY29uc3QgVmtSZWN0MkQqIHBFeGNsdXNpdmVTY2lzc29ycyk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0TGluZVdpZHRoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBsaW5lV2lkdGgpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldExpbmVTdGlwcGxlRVhUKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBsaW5lU3RpcHBsZUZhY3RvciwgdWludDE2X3QgbGluZVN0aXBwbGVQYXR0ZXJuKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRTY2lzc29yKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFNjaXNzb3IsIHVpbnQzMl90IHNjaXNzb3JDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVjdDJEKiBwU2Npc3NvcnMpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFN0ZW5jaWxDb21wYXJlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCBjb21wYXJlTWFzayk7CisgICAgdm9pZCBQcmVDYWxsUmVjb3JkQ21kU2V0U3RlbmNpbFJlZmVyZW5jZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCByZWZlcmVuY2UpOworICAgIHZvaWQgUHJlQ2FsbFJlY29yZENtZFNldFN0ZW5jaWxXcml0ZU1hc2soVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3Qgd3JpdGVNYXNrKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1ZpZXdwb3J0KiBwVmlld3BvcnRzKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgdmlld3BvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrU2hhZGluZ1JhdGVQYWxldHRlTlYqIHBTaGFkaW5nUmF0ZVBhbGV0dGVzKTsKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ21kVXBkYXRlQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBkc3RCdWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgZGF0YVNpemUsIGNvbnN0IHZvaWQqIHBEYXRhKTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRXYWl0RXZlbnRzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBldmVudENvdW50LCBjb25zdCBWa0V2ZW50KiBwRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc291cmNlU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciogcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDbWRXcml0ZVRpbWVzdGFtcChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBzbG90KTsKKyAgICB2b2lkIFByZUNhbGxSZWNvcmRDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsIHVpbnQzMl90IHZpZXdwb3J0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrVmlld3BvcnRXU2NhbGluZ05WKiBwVmlld3BvcnRXU2NhbGluZ3MpOworCisgICAgLy8gV1NJCisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2VLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQ2NF90IHRpbWVvdXQsIFZrU2VtYXBob3JlIHNlbWFwaG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ZlbmNlIGZlbmNlLCB1aW50MzJfdCogcEltYWdlSW5kZXgsIFZrUmVzdWx0IHJlc3VsdCk7CisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZEFjcXVpcmVOZXh0SW1hZ2UyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiogcEFjcXVpcmVJbmZvLCB1aW50MzJfdCogcEltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCk7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlLCBWa1Jlc3VsdCByZXN1bHQpOworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fSU9TX01WSworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVJT1NTdXJmYWNlTVZLKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrSU9TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSwgVmtSZXN1bHQgcmVzdWx0KTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0lPU19NVksKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZU1hY09TU3VyZmFjZU1WSyhWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa01hY09TU3VyZmFjZUNyZWF0ZUluZm9NVksqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlLCBWa1Jlc3VsdCByZXN1bHQpOworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fTUFDT1NfTVZLCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVXaW4zMlN1cmZhY2VLSFIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSwgVmtSZXN1bHQgcmVzdWx0KTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUgorICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1dheWxhbmRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTdXJmYWNlS0hSKiBwU3VyZmFjZSwgVmtSZXN1bHQgcmVzdWx0KTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlWGNiU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiogcFN1cmZhY2UsIFZrUmVzdWx0IHJlc3VsdCk7CisjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgdm9pZCBQb3N0Q2FsbFJlY29yZENyZWF0ZVhsaWJTdXJmYWNlS0hSKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlLCBWa1Jlc3VsdCByZXN1bHQpOworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworICAgIC8vIFN0YXRlIFV0aWx0eSBmdW5jdGlvbnMKKyAgICBib29sIEFkZENvbW1hbmRCdWZmZXJNZW0oc21hbGxfdW5vcmRlcmVkX21hcDxDTURfQlVGRkVSX1NUQVRFKiwgaW50LCA4PiYgY2JfYmluZGluZ3MsIFZrRGV2aWNlTWVtb3J5IG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSk7CisgICAgYm9vbCBBZGRDb21tYW5kQnVmZmVyQmluZGluZyhzbWFsbF91bm9yZGVyZWRfbWFwPENNRF9CVUZGRVJfU1RBVEUqLCBpbnQsIDg+JiBjYl9iaW5kaW5ncywgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUmIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNRF9CVUZGRVJfU1RBVEUqIGNiX25vZGUpOworICAgIHZvaWQgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdBY2NlbGVyYXRpb25TdHJ1Y3R1cmUoQ01EX0JVRkZFUl9TVEFURSosIEFDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfU1RBVEUqKTsKKyAgICB2b2lkIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nQnVmZmVyKENNRF9CVUZGRVJfU1RBVEUqLCBCVUZGRVJfU1RBVEUqKTsKKyAgICB2b2lkIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nQnVmZmVyVmlldyhDTURfQlVGRkVSX1NUQVRFKiwgQlVGRkVSX1ZJRVdfU1RBVEUqKTsKKyAgICB2b2lkIEFkZENvbW1hbmRCdWZmZXJCaW5kaW5nSW1hZ2UoQ01EX0JVRkZFUl9TVEFURSosIElNQUdFX1NUQVRFKik7CisgICAgdm9pZCBBZGRDb21tYW5kQnVmZmVyQmluZGluZ0ltYWdlVmlldyhDTURfQlVGRkVSX1NUQVRFKiwgSU1BR0VfVklFV19TVEFURSopOworICAgIHZvaWQgQWRkQ29tbWFuZEJ1ZmZlckJpbmRpbmdTYW1wbGVyKENNRF9CVUZGRVJfU1RBVEUqLCBTQU1QTEVSX1NUQVRFKik7CisgICAgdm9pZCBBZGRNZW1PYmpJbmZvKHZvaWQqIG9iamVjdCwgY29uc3QgVmtEZXZpY2VNZW1vcnkgbWVtLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbyk7CisgICAgdm9pZCBBZGRGcmFtZWJ1ZmZlckJpbmRpbmcoQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIEZSQU1FQlVGRkVSX1NUQVRFKiBmYl9zdGF0ZSk7CisgICAgdm9pZCBDbGVhck1lbW9yeU9iamVjdEJpbmRpbmdzKGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiB0eXBlZF9oYW5kbGUpOworICAgIHZvaWQgQ2xlYXJNZW1vcnlPYmplY3RCaW5kaW5nKGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiB0eXBlZF9oYW5kbGUsIFZrRGV2aWNlTWVtb3J5IG1lbSk7CisgICAgdm9pZCBEZWNyZW1lbnRCb3VuZFJlc291cmNlcyhDTURfQlVGRkVSX1NUQVRFIGNvbnN0KiBjYl9ub2RlKTsKKyAgICB2b2lkIERlbGV0ZURlc2NyaXB0b3JTZXRQb29scygpOworICAgIHZvaWQgRnJlZUNvbW1hbmRCdWZmZXJTdGF0ZXMoQ09NTUFORF9QT09MX1NUQVRFKiBwb29sX3N0YXRlLCBjb25zdCB1aW50MzJfdCBjb21tYW5kX2J1ZmZlcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogY29tbWFuZF9idWZmZXJzKTsKKyAgICB2b2lkIEZyZWVEZXNjcmlwdG9yU2V0KGN2ZGVzY3JpcHRvcnNldDo6RGVzY3JpcHRvclNldCogZGVzY3JpcHRvcl9zZXQpOworICAgIEJBU0VfTk9ERSogR2V0U3RhdGVTdHJ1Y3RQdHJGcm9tT2JqZWN0KGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiBvYmplY3Rfc3RydWN0KTsKKyAgICB2b2lkIEluY3JlbWVudEJvdW5kT2JqZWN0cyhDTURfQlVGRkVSX1NUQVRFIGNvbnN0KiBjYl9ub2RlKTsKKyAgICB2b2lkIEluY3JlbWVudFJlc291cmNlcyhDTURfQlVGRkVSX1NUQVRFKiBjYl9ub2RlKTsKKyAgICB2b2lkIEluc2VydEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJhbmdlKFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYXMsIERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG1lbV9vZmZzZXQsIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzJiBtZW1fcmVxcyk7CisgICAgdm9pZCBJbnNlcnRCdWZmZXJNZW1vcnlSYW5nZShWa0J1ZmZlciBidWZmZXIsIERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvLCBWa0RldmljZVNpemUgbWVtX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzJiBtZW1fcmVxcyk7CisgICAgdm9pZCBJbnNlcnRJbWFnZU1lbW9yeVJhbmdlKFZrSW1hZ2UgaW1hZ2UsIERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvLCBWa0RldmljZVNpemUgbWVtX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXMsIGJvb2wgaXNfbGluZWFyKTsKKyAgICB2b2lkIEluc2VydE1lbW9yeVJhbmdlKGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiB0eXBlZF9oYW5kbGUsIERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvLCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtUmVxdWlyZW1lbnRzLCBib29sIGlzX2xpbmVhcik7CisgICAgdm9pZCBJbnZhbGlkYXRlQ29tbWFuZEJ1ZmZlcnMoc21hbGxfdW5vcmRlcmVkX21hcDxDTURfQlVGRkVSX1NUQVRFKiwgaW50LCA4PiYgY2Jfbm9kZXMsIGNvbnN0IFZ1bGthblR5cGVkSGFuZGxlJiBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bmxpbmsgPSB0cnVlKTsKKyAgICB2b2lkIEludmFsaWRhdGVMaW5rZWRDb21tYW5kQnVmZmVycyhzdGQ6OnVub3JkZXJlZF9zZXQ8Q01EX0JVRkZFUl9TVEFURSo+JiBjYl9ub2RlcywgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUmIG9iaik7CisgICAgdm9pZCBQZXJmb3JtQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3ZkZXNjcmlwdG9yc2V0OjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzRGF0YSopOworICAgIHZvaWQgUGVyZm9ybVVwZGF0ZURlc2NyaXB0b3JTZXRzV2l0aFRlbXBsYXRlS0hSKFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCBjb25zdCBURU1QTEFURV9TVEFURSogdGVtcGxhdGVfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcERhdGEpOworICAgIHZvaWQgUmVjb3JkQWNxdWlyZU5leHRJbWFnZVN0YXRlKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGZW5jZSBmZW5jZSwgdWludDMyX3QqIHBJbWFnZUluZGV4KTsKKyAgICB2b2lkIFJlY29yZENtZEJlZ2luUXVlcnkoQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIGNvbnN0IFF1ZXJ5T2JqZWN0JiBxdWVyeV9vYmopOworICAgIHZvaWQgUmVjb3JkQ21kRW5kUXVlcnkoQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIGNvbnN0IFF1ZXJ5T2JqZWN0JiBxdWVyeV9vYmopOworICAgIHZvaWQgUmVjb3JkQ21kRW5kUmVuZGVyUGFzc1N0YXRlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKKyAgICB2b2lkIFJlY29yZENtZEJlZ2luUmVuZGVyUGFzc1N0YXRlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cyk7CisgICAgdm9pZCBSZWNvcmRDbWROZXh0U3VicGFzcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdWJwYXNzQ29udGVudHMgY29udGVudHMpOworICAgIHZvaWQgUmVjb3JkQ21kUHVzaERlc2NyaXB0b3JTZXRTdGF0ZShDTURfQlVGRkVSX1NUQVRFKiBjYl9zdGF0ZSwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgVmtQaXBlbGluZUxheW91dCBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNldCwgdWludDMyX3QgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvcldyaXRlcyk7CisgICAgdm9pZCBSZWNvcmRDcmVhdGVJbWFnZUFORFJPSUQoY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qIGNyZWF0ZV9pbmZvLCBJTUFHRV9TVEFURSogaXNfbm9kZSk7CisgICAgdm9pZCBSZWNvcmRDcmVhdGVSZW5kZXJQYXNzU3RhdGUoUmVuZGVyUGFzc0NyZWF0ZVZlcnNpb24gcnBfdmVyc2lvbiwgc3RkOjpzaGFyZWRfcHRyPFJFTkRFUl9QQVNTX1NUQVRFPiYgcmVuZGVyX3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZW5kZXJQYXNzKiBwUmVuZGVyUGFzcyk7CisgICAgdm9pZCBSZWNvcmRDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uU3RhdGUoY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uIHljYmNyX2NvbnZlcnNpb24pOworICAgIHZvaWQgUmVjb3JkQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkFORFJPSUQoY29uc3QgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyogY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JfY29udmVyc2lvbik7CisgICAgdm9pZCBSZWNvcmRDcmVhdGVTd2FwY2hhaW5TdGF0ZShWa1Jlc3VsdCByZXN1bHQsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VSRkFDRV9TVEFURSogc3VyZmFjZV9zdGF0ZSwgU1dBUENIQUlOX05PREUqIG9sZF9zd2FwY2hhaW5fc3RhdGUpOworICAgIHZvaWQgUmVjb3JkRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25BTkRST0lEKFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiB5Y2Jjcl9jb252ZXJzaW9uKTsKKyAgICB2b2lkIFJlY29yZEVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzU3RhdGUodWludDMyX3QqIHBQaHlzaWNhbERldmljZUdyb3VwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXNLSFIqIHBQaHlzaWNhbERldmljZUdyb3VwUHJvcGVydGllcyk7CisgICAgdm9pZCBSZWNvcmRFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgsIHVpbnQzMl90KiBwQ291bnRlckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BlcmZvcm1hbmNlQ291bnRlcktIUiogcENvdW50ZXJzKTsKKyAgICB2b2lkIFJlY29yZEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50c1N0YXRlKFZrQnVmZmVyIGJ1ZmZlciwgVmtNZW1vcnlSZXF1aXJlbWVudHMqIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHZvaWQgUmVjb3JkR2V0RGV2aWNlUXVldWVTdGF0ZSh1aW50MzJfdCBxdWV1ZV9mYW1pbHlfaW5kZXgsIFZrUXVldWUgcXVldWUpOworICAgIHZvaWQgUmVjb3JkR2V0RXh0ZXJuYWxGZW5jZVN0YXRlKFZrRmVuY2UgZmVuY2UsIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c0tIUiBoYW5kbGVfdHlwZSk7CisgICAgdm9pZCBSZWNvcmRHZXRJbWFnZU1lbW9yeVJlcXVpZW1lbnRzU3RhdGUoVmtJbWFnZSBpbWFnZSwgVmtNZW1vcnlSZXF1aXJlbWVudHMqIHBNZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHZvaWQgUmVjb3JkSW1wb3J0U2VtYXBob3JlU3RhdGUoVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBWa0V4dGVybmFsU2VtYXBob3JlSGFuZGxlVHlwZUZsYWdCaXRzS0hSIGhhbmRsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTZW1hcGhvcmVJbXBvcnRGbGFnc0tIUiBmbGFncyk7CisgICAgdm9pZCBSZWNvcmRHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNTdGF0ZShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUHJvcGVydGllcyk7CisgICAgdm9pZCBSZWNvcmRHZXRFeHRlcm5hbFNlbWFwaG9yZVN0YXRlKFZrU2VtYXBob3JlIHNlbWFwaG9yZSwgVmtFeHRlcm5hbFNlbWFwaG9yZUhhbmRsZVR5cGVGbGFnQml0c0tIUiBoYW5kbGVfdHlwZSk7CisgICAgdm9pZCBSZWNvcmRJbXBvcnRGZW5jZVN0YXRlKFZrRmVuY2UgZmVuY2UsIFZrRXh0ZXJuYWxGZW5jZUhhbmRsZVR5cGVGbGFnQml0c0tIUiBoYW5kbGVfdHlwZSwgVmtGZW5jZUltcG9ydEZsYWdzS0hSIGZsYWdzKTsKKyAgICB2b2lkIFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVTdGF0ZShWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGNvbnN0IHZvaWQqIHBEYXRhKTsKKyAgICB2b2lkIFJlY29yZENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZVN0YXRlKGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiogcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgdm9pZCBSZWNvcmRNYXBwZWRNZW1vcnkoVmtEZXZpY2VNZW1vcnkgbWVtLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgdm9pZCoqIHBwRGF0YSk7CisgICAgdm9pZCBSZWNvcmRQaXBlbGluZVNoYWRlclN0YWdlKGNvbnN0IFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qIHBTdGFnZSwgUElQRUxJTkVfU1RBVEUqIHBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFTElORV9TVEFURTo6U3RhZ2VTdGF0ZSogc3RhZ2Vfc3RhdGUpIGNvbnN0OworICAgIHZvaWQgUmVjb3JkUmVuZGVyUGFzc0RBRyhSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTkRFUl9QQVNTX1NUQVRFKiByZW5kZXJfcGFzcyk7CisgICAgdm9pZCBSZWNvcmRWdWxrYW5TdXJmYWNlKFZrU3VyZmFjZUtIUiogcFN1cmZhY2UpOworICAgIHZvaWQgUmVtb3ZlQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmFuZ2UoVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhcywgREVWSUNFX01FTU9SWV9TVEFURSogbWVtX2luZm8pOworICAgIHZvaWQgUmVtb3ZlQ29tbWFuZEJ1ZmZlckJpbmRpbmcoY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUmIG9iamVjdCwgQ01EX0JVRkZFUl9TVEFURSogY2Jfbm9kZSk7CisgICAgdm9pZCBSZW1vdmVCdWZmZXJNZW1vcnlSYW5nZShWa0J1ZmZlciBidWZmZXIsIERFVklDRV9NRU1PUllfU1RBVEUqIG1lbV9pbmZvKTsKKyAgICB2b2lkIFJlbW92ZUltYWdlTWVtb3J5UmFuZ2UoVmtJbWFnZSBpbWFnZSwgREVWSUNFX01FTU9SWV9TVEFURSogbWVtX2luZm8pOworICAgIHZvaWQgUmVzZXRDb21tYW5kQnVmZmVyU3RhdGUoY29uc3QgVmtDb21tYW5kQnVmZmVyIGNiKTsKKyAgICB2b2lkIFJldGlyZUZlbmNlKFZrRmVuY2UgZmVuY2UpOworICAgIHZvaWQgUmV0aXJlV29ya09uUXVldWUoUVVFVUVfU1RBVEUqIHBRdWV1ZSwgdWludDY0X3Qgc2VxKTsKKyAgICBzdGF0aWMgYm9vbCBTZXRFdmVudFN0YWdlTWFzayhWa0V2ZW50IGV2ZW50LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2ssIEV2ZW50VG9TdGFnZU1hcCogbG9jYWxFdmVudFRvU3RhZ2VNYXApOworICAgIHZvaWQgUmVzZXRDb21tYW5kQnVmZmVyUHVzaENvbnN0YW50RGF0YUlmSW5jb21wYXRpYmxlKENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCBWa1BpcGVsaW5lTGF5b3V0IGxheW91dCk7CisgICAgdm9pZCBTZXRNZW1CaW5kaW5nKFZrRGV2aWNlTWVtb3J5IG1lbSwgQklOREFCTEUqIG1lbV9iaW5kaW5nLCBWa0RldmljZVNpemUgbWVtb3J5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUmIHR5cGVkX2hhbmRsZSk7CisgICAgc3RhdGljIGJvb2wgU2V0UXVlcnlTdGF0ZShRdWVyeU9iamVjdCBvYmplY3QsIFF1ZXJ5U3RhdGUgdmFsdWUsIFF1ZXJ5TWFwKiBsb2NhbFF1ZXJ5VG9TdGF0ZU1hcCk7CisgICAgc3RhdGljIGJvb2wgU2V0UXVlcnlTdGF0ZU11bHRpKFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgUXVlcnlTdGF0ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlNYXAqIGxvY2FsUXVlcnlUb1N0YXRlTWFwKTsKKyAgICBRdWVyeVN0YXRlIEdldFF1ZXJ5U3RhdGUoY29uc3QgUXVlcnlNYXAqIGxvY2FsUXVlcnlUb1N0YXRlTWFwLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHF1ZXJ5SW5kZXgpIGNvbnN0OworICAgIGJvb2wgU2V0U3BhcnNlTWVtQmluZGluZyhNRU1fQklORElORyBiaW5kaW5nLCBjb25zdCBWdWxrYW5UeXBlZEhhbmRsZSYgdHlwZWRfaGFuZGxlKTsKKyAgICB2b2lkIFVwZGF0ZUJpbmRCdWZmZXJNZW1vcnlTdGF0ZShWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlTWVtb3J5IG1lbSwgVmtEZXZpY2VTaXplIG1lbW9yeU9mZnNldCk7CisgICAgdm9pZCBVcGRhdGVCaW5kSW1hZ2VNZW1vcnlTdGF0ZShjb25zdCBWa0JpbmRJbWFnZU1lbW9yeUluZm8mIGJpbmRJbmZvKTsKKyAgICB2b2lkIFVwZGF0ZUxhc3RCb3VuZERlc2NyaXB0b3JTZXRzKENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lX2JpbmRfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQSVBFTElORV9MQVlPVVRfU1RBVEUqIHBpcGVsaW5lX2xheW91dCwgdWludDMyX3QgZmlyc3Rfc2V0LCB1aW50MzJfdCBzZXRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgY3ZkZXNjcmlwdG9yc2V0OjpEZXNjcmlwdG9yU2V0KiBwdXNoX2Rlc2NyaXB0b3Jfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHluYW1pY19vZmZzZXRfY291bnQsIGNvbnN0IHVpbnQzMl90KiBwX2R5bmFtaWNfb2Zmc2V0cyk7CisgICAgdm9pZCBVcGRhdGVTdGF0ZUNtZERyYXdEaXNwYXRjaFR5cGUoQ01EX0JVRkZFUl9TVEFURSogY2Jfc3RhdGUsIFZrUGlwZWxpbmVCaW5kUG9pbnQgYmluZF9wb2ludCk7CisgICAgdm9pZCBVcGRhdGVTdGF0ZUNtZERyYXdUeXBlKENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCBWa1BpcGVsaW5lQmluZFBvaW50IGJpbmRfcG9pbnQpOworICAgIHZvaWQgVXBkYXRlRHJhd1N0YXRlKENNRF9CVUZGRVJfU1RBVEUqIGNiX3N0YXRlLCBjb25zdCBWa1BpcGVsaW5lQmluZFBvaW50IGJpbmRfcG9pbnQpOworICAgIHZvaWQgVXBkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0c0RhdGEoY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiwgY3ZkZXNjcmlwdG9yc2V0OjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzRGF0YSopIGNvbnN0OworCisgICAgRGV2aWNlRmVhdHVyZXMgZW5hYmxlZF9mZWF0dXJlcyA9IHt9OworICAgIC8vIERldmljZSBzcGVjaWZpYyBkYXRhCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgcGh5c19kZXZfbWVtX3Byb3BzID0ge307CisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgcGh5c19kZXZfcHJvcHMgPSB7fTsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9kZXZpY2VfY291bnQ7CisKKyAgICAvLyBEZXZpY2UgZXh0ZW5zaW9uIHByb3BlcnRpZXMgLS0gc3RvcmluZyBwcm9wZXJ0aWVzIGdhdGhlcmVkIGZyb20gVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSOjpwTmV4dCBjaGFpbgorICAgIHN0cnVjdCBEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIHsKKyAgICAgICAgdWludDMyX3QgbWF4X3B1c2hfZGVzY3JpcHRvcnM7ICAvLyBmcm9tIFZrUGh5c2ljYWxEZXZpY2VQdXNoRGVzY3JpcHRvclByb3BlcnRpZXNLSFI6Om1heFB1c2hEZXNjcmlwdG9ycworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nUHJvcGVydGllc0VYVCBkZXNjcmlwdG9yX2luZGV4aW5nX3Byb3BzOworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZVByb3BlcnRpZXNOViBzaGFkaW5nX3JhdGVfaW1hZ2VfcHJvcHM7CisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyUHJvcGVydGllc05WIG1lc2hfc2hhZGVyX3Byb3BzOworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlSW5saW5lVW5pZm9ybUJsb2NrUHJvcGVydGllc0VYVCBpbmxpbmVfdW5pZm9ybV9ibG9ja19wcm9wczsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZVZlcnRleEF0dHJpYnV0ZURpdmlzb3JQcm9wZXJ0aWVzRVhUIHZ0eF9hdHRyaWJfZGl2aXNvcl9wcm9wczsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZURlcHRoU3RlbmNpbFJlc29sdmVQcm9wZXJ0aWVzS0hSIGRlcHRoX3N0ZW5jaWxfcmVzb2x2ZV9wcm9wczsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZUNvb3BlcmF0aXZlTWF0cml4UHJvcGVydGllc05WIGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wczsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZVRyYW5zZm9ybUZlZWRiYWNrUHJvcGVydGllc0VYVCB0cmFuc2Zvcm1fZmVlZGJhY2tfcHJvcHM7CisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMgc3ViZ3JvdXBfcHJvcHM7CisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VGbG9hdENvbnRyb2xzUHJvcGVydGllc0tIUiBmbG9hdF9jb250cm9sc19wcm9wczsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYgcmF5X3RyYWNpbmdfcHJvcHM7CisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgdGV4ZWxfYnVmZmVyX2FsaWdubWVudF9wcm9wczsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZUZyYWdtZW50RGVuc2l0eU1hcFByb3BlcnRpZXNFWFQgZnJhZ21lbnRfZGVuc2l0eV9tYXBfcHJvcHM7CisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5UHJvcGVydGllc0tIUiBwZXJmb3JtYW5jZV9xdWVyeV9wcm9wczsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZVRpbWVsaW5lU2VtYXBob3JlUHJvcGVydGllc0tIUiB0aW1lbGluZV9zZW1hcGhvcmVfcHJvcHM7CisgICAgfTsKKyAgICBEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIHBoeXNfZGV2X2V4dF9wcm9wcyA9IHt9OworICAgIHN0ZDo6dmVjdG9yPFZrQ29vcGVyYXRpdmVNYXRyaXhQcm9wZXJ0aWVzTlY+IGNvb3BlcmF0aXZlX21hdHJpeF9wcm9wZXJ0aWVzOworCisgICAgLy8gTWFwIGZvciBxdWV1ZSBmYW1pbHkgaW5kZXggdG8gcXVldWUgY291bnQKKyAgICB1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCB1aW50MzJfdD4gcXVldWVfZmFtaWx5X2luZGV4X21hcDsKKyAgICBib29sIHBlcmZvcm1hbmNlX2xvY2tfYWNxdWlyZWQgPSBmYWxzZTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeHRQcm9wPgorICAgIHZvaWQgR2V0UGh5c2ljYWxEZXZpY2VFeHRQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgZ3B1LCBFeHRFbmFibGVkIGVuYWJsZWQsIEV4dFByb3AqIGV4dF9wcm9wKSB7CisgICAgICAgIGFzc2VydChleHRfcHJvcCk7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAqZXh0X3Byb3AgPSBsdmxfaW5pdF9zdHJ1Y3Q8RXh0UHJvcD4oKTsKKyAgICAgICAgICAgIGF1dG8gcHJvcDIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSPihleHRfcHJvcCk7CisgICAgICAgICAgICBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoZ3B1LCAmcHJvcDIpOworICAgICAgICB9CisgICAgfQorfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9zdGF0ZWxlc3NfdmFsaWRhdGlvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3N0YXRlbGVzc192YWxpZGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjYWYyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy9zdGF0ZWxlc3NfdmFsaWRhdGlvbi5oCkBAIC0wLDAgKzEsMTM3OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IER1c3RpbiBHcmF2ZXMgPGR1c3RpbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJwYXJhbWV0ZXJfbmFtZS5oIgorI2luY2x1ZGUgInZrX3R5cGVtYXBfaGVscGVyLmgiCisKKy8vIFN1cHByZXNzIHVudXNlZCB3YXJuaW5nIG9uIExpbnV4CisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgREVDT1JBVEVfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBERUNPUkFURV9VTlVTRUQKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX1BWRXJyb3JfTk9ORSA9ICJVTkFTU0lHTkVELUdlbmVyYWxQYXJhbWV0ZXJFcnJvci1JbmZvIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfUFZFcnJvcl9JbnZhbGlkVXNhZ2UgPSAiVU5BU1NJR05FRC1HZW5lcmFsUGFyYW1ldGVyRXJyb3ItSW52YWxpZFVzYWdlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfUFZFcnJvcl9JbnZhbGlkU3RydWN0U1R5cGUgPSAiVU5BU1NJR05FRC1HZW5lcmFsUGFyYW1ldGVyRXJyb3ItSW52YWxpZFN0cnVjdFNUeXBlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfUFZFcnJvcl9JbnZhbGlkU3RydWN0UE5leHQgPSAiVU5BU1NJR05FRC1HZW5lcmFsUGFyYW1ldGVyRXJyb3ItSW52YWxpZFN0cnVjdFBOZXh0IjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfUFZFcnJvcl9SZXF1aXJlZFBhcmFtZXRlciA9ICJVTkFTU0lHTkVELUdlbmVyYWxQYXJhbWV0ZXJFcnJvci1SZXF1aXJlZFBhcmFtZXRlciI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX1BWRXJyb3JfUmVzZXJ2ZWRQYXJhbWV0ZXIgPSAiVU5BU1NJR05FRC1HZW5lcmFsUGFyYW1ldGVyRXJyb3ItUmVzZXJ2ZWRQYXJhbWV0ZXIiOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9QVkVycm9yX1VucmVjb2duaXplZFZhbHVlID0gIlVOQVNTSUdORUQtR2VuZXJhbFBhcmFtZXRlckVycm9yLVVucmVjb2duaXplZFZhbHVlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfUFZFcnJvcl9EZXZpY2VMaW1pdCA9ICJVTkFTU0lHTkVELUdlbmVyYWxQYXJhbWV0ZXJFcnJvci1EZXZpY2VMaW1pdCI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX1BWRXJyb3JfRGV2aWNlRmVhdHVyZSA9ICJVTkFTU0lHTkVELUdlbmVyYWxQYXJhbWV0ZXJFcnJvci1EZXZpY2VGZWF0dXJlIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfUFZFcnJvcl9GYWlsdXJlQ29kZSA9ICJVTkFTU0lHTkVELUdlbmVyYWxQYXJhbWV0ZXJFcnJvci1GYWlsdXJlQ29kZSI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX1BWRXJyb3JfRXh0ZW5zaW9uTm90RW5hYmxlZCA9ICJVTkFTU0lHTkVELUdlbmVyYWxQYXJhbWV0ZXJFcnJvci1FeHRlbnNpb25Ob3RFbmFibGVkIjsKK3N0YXRpYyBjb25zdCBjaGFyIERFQ09SQVRFX1VOVVNFRCAqa1ZVSURfUFZQZXJmV2Fybl9TdWJvcHRpbWFsU3dhcGNoYWluID0gIlVOQVNTSUdORUQtR2VuZXJhbFBhcmFtZXRlclBlcmZXYXJuLVN1Ym9wdGltYWxTd2FwY2hhaW4iOworCisjdW5kZWYgREVDT1JBVEVfVU5VU0VECisKK2V4dGVybiBjb25zdCB1aW50MzJfdCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uOworCitleHRlcm4gY29uc3QgVmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ3MgQWxsVmtRdWVyeVBpcGVsaW5lU3RhdGlzdGljRmxhZ0JpdHM7CitleHRlcm4gY29uc3QgVmtDb2xvckNvbXBvbmVudEZsYWdzIEFsbFZrQ29sb3JDb21wb25lbnRGbGFnQml0czsKK2V4dGVybiBjb25zdCBWa1NoYWRlclN0YWdlRmxhZ3MgQWxsVmtTaGFkZXJTdGFnZUZsYWdCaXRzOworZXh0ZXJuIGNvbnN0IFZrUXVlcnlDb250cm9sRmxhZ3MgQWxsVmtRdWVyeUNvbnRyb2xGbGFnQml0czsKK2V4dGVybiBjb25zdCBWa0ltYWdlVXNhZ2VGbGFncyBBbGxWa0ltYWdlVXNhZ2VGbGFnQml0czsKK2V4dGVybiBjb25zdCBWa1NhbXBsZUNvdW50RmxhZ3MgQWxsVmtTYW1wbGVDb3VudEZsYWdCaXRzOworCitleHRlcm4gY29uc3Qgc3RkOjp2ZWN0b3I8VmtDb21wYXJlT3A+IEFsbFZrQ29tcGFyZU9wRW51bXM7CitleHRlcm4gY29uc3Qgc3RkOjp2ZWN0b3I8VmtTdGVuY2lsT3A+IEFsbFZrU3RlbmNpbE9wRW51bXM7CitleHRlcm4gY29uc3Qgc3RkOjp2ZWN0b3I8VmtCbGVuZEZhY3Rvcj4gQWxsVmtCbGVuZEZhY3RvckVudW1zOworZXh0ZXJuIGNvbnN0IHN0ZDo6dmVjdG9yPFZrQmxlbmRPcD4gQWxsVmtCbGVuZE9wRW51bXM7CitleHRlcm4gY29uc3Qgc3RkOjp2ZWN0b3I8VmtMb2dpY09wPiBBbGxWa0xvZ2ljT3BFbnVtczsKK2V4dGVybiBjb25zdCBzdGQ6OnZlY3RvcjxWa0JvcmRlckNvbG9yPiBBbGxWa0JvcmRlckNvbG9yRW51bXM7CitleHRlcm4gY29uc3Qgc3RkOjp2ZWN0b3I8VmtJbWFnZUxheW91dD4gQWxsVmtJbWFnZUxheW91dEVudW1zOworZXh0ZXJuIGNvbnN0IHN0ZDo6dmVjdG9yPFZrRm9ybWF0PiBBbGxWa0Zvcm1hdEVudW1zOworZXh0ZXJuIGNvbnN0IHN0ZDo6dmVjdG9yPFZrVmVydGV4SW5wdXRSYXRlPiBBbGxWa1ZlcnRleElucHV0UmF0ZUVudW1zOworZXh0ZXJuIGNvbnN0IHN0ZDo6dmVjdG9yPFZrUHJpbWl0aXZlVG9wb2xvZ3k+IEFsbFZrUHJpbWl0aXZlVG9wb2xvZ3lFbnVtczsKKworLy8gU3RyaW5nIHJldHVybmVkIGJ5IHN0cmluZ19Wa1N0cnVjdHVyZVR5cGUgZm9yIGFuIHVucmVjb2duaXplZCB0eXBlLgorY29uc3Qgc3RkOjpzdHJpbmcgVW5zdXBwb3J0ZWRTdHJ1Y3R1cmVUeXBlU3RyaW5nID0gIlVuaGFuZGxlZCBWa1N0cnVjdHVyZVR5cGUiOworCisvLyBTdHJpbmcgcmV0dXJuZWQgYnkgc3RyaW5nX1ZrUmVzdWx0IGZvciBhbiB1bnJlY29nbml6ZWQgdHlwZS4KK2NvbnN0IHN0ZDo6c3RyaW5nIFVuc3VwcG9ydGVkUmVzdWx0U3RyaW5nID0gIlVuaGFuZGxlZCBWa1Jlc3VsdCI7CisKKy8vIFRoZSBiYXNlIHZhbHVlIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIG9mZnNldCBmb3IgYW4gZW51bWVyYXRpb24gdG9rZW4gdmFsdWUgdGhhdCBpcyBhZGRlZCBieSBhbiBleHRlbnNpb24uCisvLyBXaGVuIHZhbGlkYXRpbmcgZW51bWVyYXRpb24gdG9rZW5zLCBhbnkgdmFsdWUgPj0gdG8gdGhpcyB2YWx1ZSBpcyBjb25zaWRlcmVkIHRvIGJlIHByb3ZpZGVkIGJ5IGFuIGV4dGVuc2lvbi4KKy8vIFNlZSBBcHBlbmRpeCBDLjEwICJBc3NpZ25pbmcgRXh0ZW5zaW9uIFRva2VuIFZhbHVlcyIgZnJvbSB0aGUgVnVsa2FuIHNwZWNpZmljYXRpb24KK2NvbnN0IHVpbnQzMl90IEV4dEVudW1CYXNlVmFsdWUgPSAxMDAwMDAwMDAwOworCisvLyBUaGUgdmFsdWUgb2YgYWxsIFZLX3h4eF9NQVhfRU5VTSB0b2tlbnMKK2NvbnN0IHVpbnQzMl90IE1heEVudW1WYWx1ZSA9IDB4N0ZGRkZGRkY7CisKKy8vIE1pc2MgcGFyYW1ldGVycyBvZiBsb2dfbXNnIHRoYXQgYXJlIGxpa2VseSBjb25zdGFudCBwZXIgY29tbWFuZCAob3IgbG93IGZyZXF1ZW5jeSBjaGFuZ2UpCitzdHJ1Y3QgTG9nTWlzY1BhcmFtcyB7CisgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0VHlwZTsKKyAgICB1aW50NjRfdCBzcmNPYmplY3Q7CisgICAgY29uc3QgY2hhciAqYXBpX25hbWU7Cit9OworCitjbGFzcyBTdGF0ZWxlc3NWYWxpZGF0aW9uIDogcHVibGljIFZhbGlkYXRpb25PYmplY3QgeworICBwdWJsaWM6CisgICAgVmtQaHlzaWNhbERldmljZUxpbWl0cyBkZXZpY2VfbGltaXRzID0ge307CisgICAgc2FmZV9Wa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHBoeXNpY2FsX2RldmljZV9mZWF0dXJlczI7CisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICZwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMgPSBwaHlzaWNhbF9kZXZpY2VfZmVhdHVyZXMyLmZlYXR1cmVzOworCisgICAgLy8gT3ZlcnJpZGUgY2hhc3NpcyByZWFkL3dyaXRlIGxvY2tzIGZvciB0aGlzIHZhbGlkYXRpb24gb2JqZWN0CisgICAgLy8gVGhpcyBvdmVycmlkZSB0YWtlcyBhIGRlZmVycmVkIGxvY2suIGkuZS4gaXQgaXMgbm90IGFjcXVpcmVkLgorICAgIHZpcnR1YWwgcmVhZF9sb2NrX2d1YXJkX3QgcmVhZF9sb2NrKCkgeyByZXR1cm4gcmVhZF9sb2NrX2d1YXJkX3QodmFsaWRhdGlvbl9vYmplY3RfbXV0ZXgsIHN0ZDo6ZGVmZXJfbG9jayk7IH0KKyAgICB2aXJ0dWFsIHdyaXRlX2xvY2tfZ3VhcmRfdCB3cml0ZV9sb2NrKCkgeyByZXR1cm4gd3JpdGVfbG9ja19ndWFyZF90KHZhbGlkYXRpb25fb2JqZWN0X211dGV4LCBzdGQ6OmRlZmVyX2xvY2spOyB9CisKKyAgICAvLyBEZXZpY2UgZXh0ZW5zaW9uIHByb3BlcnRpZXMgLS0gc3RvcmluZyBwcm9wZXJ0aWVzIGdhdGhlcmVkIGZyb20gVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSOjpwTmV4dCBjaGFpbgorICAgIHN0cnVjdCBEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIHsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZVNoYWRpbmdSYXRlSW1hZ2VQcm9wZXJ0aWVzTlYgc2hhZGluZ19yYXRlX2ltYWdlX3Byb3BzOworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTWVzaFNoYWRlclByb3BlcnRpZXNOViBtZXNoX3NoYWRlcl9wcm9wczsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZVJheVRyYWNpbmdQcm9wZXJ0aWVzTlYgcmF5X3RyYWNpbmdfcHJvcHM7CisgICAgfTsKKyAgICBEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIHBoeXNfZGV2X2V4dF9wcm9wcyA9IHt9OworCisgICAgc3RydWN0IFN1YnBhc3Nlc1VzYWdlU3RhdGVzIHsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBzdWJwYXNzZXNfdXNpbmdfY29sb3JfYXR0YWNobWVudDsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBzdWJwYXNzZXNfdXNpbmdfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQ7CisgICAgfTsKKworICAgIC8vIFRob3VnaCB0aGlzIHZhbGlkYXRpb24gb2JqZWN0IGlzIHByZWRvbWluYW50bHkgc3RhdGxlc3MsIHRoZSBGcmFtZWJ1ZmZlciBjaGVja3MgYXJlIGdyZWF0bHkgc2ltcGxpZmllZCBieSBjcmVhdGluZyBhbmQKKyAgICAvLyB1cGRhdGluZyBhIG1hcCBvZiB0aGUgcmVuZGVycGFzcyB1c2FnZSBzdGF0ZXMsIGFuZCB0aGVzZSBhY2Nlc3NlcyBuZWVkIHRocmVhZCBwcm90ZWN0aW9uLiBVc2UgYSBtdXRleCBzZXBhcmF0ZSBmcm9tIHRoZQorICAgIC8vIHBhcmVudCBvYmplY3QncyB0byBtYWludGFpbiB0aGF0IGZ1bmN0aW9uYWxpdHkuCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IHJlbmRlcnBhc3NfbWFwX211dGV4OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa1JlbmRlclBhc3MsIFN1YnBhc3Nlc1VzYWdlU3RhdGVzPiByZW5kZXJwYXNzZXNfc3RhdGVzOworCisgICAgLy8gQ29uc3RydWN0b3IgZm9yIHN0YXRlbGVzIHZhbGlkYXRpb24gdHJhY2tpbmcKKyAgICAvLyBTdGF0ZWxlc3NWYWxpZGF0aW9uKCkgOiB7fQorICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGEgbWluaW11bSB2YWx1ZS4KKyAgICAgKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbG93ZXIgYm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpX25hbWUgTmFtZSBvZiBBUEkgY2FsbCBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcl9uYW1lIE5hbWUgb2YgcGFyYW1ldGVyIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gdmFsaWRhdGUuCisgICAgICogQHBhcmFtIGxvd2VyX2JvdW5kIExvd2VyIGJvdW5kIHZhbHVlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBjYWxsIHNob3VsZCBiZSBza2lwcGVkLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIGJvb2wgVmFsaWRhdGVHcmVhdGVyVGhhbihjb25zdCBUIHZhbHVlLCBjb25zdCBUIGxvd2VyX2JvdW5kLCBjb25zdCBQYXJhbWV0ZXJOYW1lICZwYXJhbWV0ZXJfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ01pc2NQYXJhbXMgJm1pc2MpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBza2lwX2NhbGwgPSBmYWxzZTsKKworICAgICAgICBpZiAodmFsdWUgPD0gbG93ZXJfYm91bmQpIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IG1pc2MuYXBpX25hbWUgPDwgIjogcGFyYW1ldGVyICIgPDwgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKSA8PCAiICg9ICIgPDwgdmFsdWUgPDwgIikgaXMgZ3JlYXRlciB0aGFuICIKKyAgICAgICAgICAgICAgIDw8IGxvd2VyX2JvdW5kOworICAgICAgICAgICAgc2tpcF9jYWxsIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG1pc2Mub2JqZWN0VHlwZSwgbWlzYy5zcmNPYmplY3QsIHZ1aWQsICIlcyIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBfY2FsbDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBib29sIFZhbGlkYXRlR3JlYXRlclRoYW5aZXJvKGNvbnN0IFQgdmFsdWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJnBhcmFtZXRlcl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyAmdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ01pc2NQYXJhbXMgJm1pc2MpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFZhbGlkYXRlR3JlYXRlclRoYW4odmFsdWUsIFR7MH0sIHBhcmFtZXRlcl9uYW1lLCB2dWlkLCBtaXNjKTsKKyAgICB9CisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYSByZXF1aXJlZCBwb2ludGVyLgorICAgICAqCisgICAgICogVmVyaWZ5IHRoYXQgYSByZXF1aXJlZCBwb2ludGVyIGlzIG5vdCBOVUxMLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaU5hbWUgTmFtZSBvZiBBUEkgY2FsbCBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUgTmFtZSBvZiBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZSBQb2ludGVyIHRvIHZhbGlkYXRlLgorICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbGwgc2hvdWxkIGJlIHNraXBwZWQuCisgICAgICovCisgICAgYm9vbCB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKGNvbnN0IGNoYXIgKmFwaU5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJnBhcmFtZXRlck5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdnVpZCkgY29uc3QgeworICAgICAgICBib29sIHNraXBfY2FsbCA9IGZhbHNlOworCisgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBza2lwX2NhbGwgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcmVxdWlyZWQgcGFyYW1ldGVyICVzIHNwZWNpZmllZCBhcyBOVUxMLiIsIGFwaU5hbWUsIHBhcmFtZXRlck5hbWUuZ2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBza2lwX2NhbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYXJyYXkgY291bnQgYW5kIHBvaW50ZXIgdG8gYXJyYXkuCisgICAgICoKKyAgICAgKiBWZXJpZnkgdGhhdCByZXF1aXJlZCBjb3VudCBhbmQgYXJyYXkgcGFyYW1ldGVycyBhcmUgbm90IDAgb3IgTlVMTC4gIElmIHRoZQorICAgICAqIGNvdW50IHBhcmFtZXRlciBpcyBub3Qgb3B0aW9uYWwsIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCAwLiAgSWYgdGhlIGFycmF5CisgICAgICogcGFyYW1ldGVyIGlzIE5VTEwsIGFuZCBpdCBpcyBub3Qgb3B0aW9uYWwsIHZlcmlmeSB0aGF0IGNvdW50IGlzIDAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpTmFtZSBOYW1lIG9mIEFQSSBjYWxsIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gY291bnROYW1lIE5hbWUgb2YgY291bnQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBhcnJheU5hbWUgTmFtZSBvZiBhcnJheSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGNvdW50IE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIGFycmF5IEFycmF5IHRvIHZhbGlkYXRlLgorICAgICAqIEBwYXJhbSBjb3VudFJlcXVpcmVkIFRoZSAnY291bnQnIHBhcmFtZXRlciBtYXkgbm90IGJlIDAgd2hlbiB0cnVlLgorICAgICAqIEBwYXJhbSBhcnJheVJlcXVpcmVkIFRoZSAnYXJyYXknIHBhcmFtZXRlciBtYXkgbm90IGJlIE5VTEwgd2hlbiB0cnVlLgorICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbGwgc2hvdWxkIGJlIHNraXBwZWQuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIHZhbGlkYXRlX2FycmF5KGNvbnN0IGNoYXIgKmFwaU5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmNvdW50TmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmYXJyYXlOYW1lLCBUMSBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyICphcnJheSwgYm9vbCBjb3VudFJlcXVpcmVkLCBib29sIGFycmF5UmVxdWlyZWQsIGNvbnN0IGNoYXIgKmNvdW50X3JlcXVpcmVkX3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcnJheV9yZXF1aXJlZF92dWlkKSBjb25zdCB7CisgICAgICAgIGJvb2wgc2tpcF9jYWxsID0gZmFsc2U7CisKKyAgICAgICAgLy8gQ291bnQgcGFyYW1ldGVycyBub3QgdGFnZ2VkIGFzIG9wdGlvbmFsIGNhbm5vdCBiZSAwCisgICAgICAgIGlmIChjb3VudFJlcXVpcmVkICYmIChjb3VudCA9PSAwKSkgeworICAgICAgICAgICAgc2tpcF9jYWxsIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgY291bnRfcmVxdWlyZWRfdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogcGFyYW1ldGVyICVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuIiwgYXBpTmFtZSwgY291bnROYW1lLmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcnJheSBwYXJhbWV0ZXJzIG5vdCB0YWdnZWQgYXMgb3B0aW9uYWwgY2Fubm90IGJlIE5VTEwsIHVubGVzcyB0aGUgY291bnQgaXMgMAorICAgICAgICBpZiAoYXJyYXlSZXF1aXJlZCAmJiAoY291bnQgIT0gMCkgJiYgKCphcnJheSA9PSBOVUxMKSkgeworICAgICAgICAgICAgc2tpcF9jYWxsIHw9CisgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgYXJyYXlfcmVxdWlyZWRfdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogcmVxdWlyZWQgcGFyYW1ldGVyICVzIHNwZWNpZmllZCBhcyBOVUxMLiIsIGFwaU5hbWUsIGFycmF5TmFtZS5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBfY2FsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBwb2ludGVyIHRvIGFycmF5IGNvdW50IGFuZCBwb2ludGVyIHRvIGFycmF5LgorICAgICAqCisgICAgICogVmVyaWZ5IHRoYXQgcmVxdWlyZWQgY291bnQgYW5kIGFycmF5IHBhcmFtZXRlcnMgYXJlIG5vdCBOVUxMLiAgSWYgY291bnQKKyAgICAgKiBpcyBub3QgTlVMTCBhbmQgaXRzIHZhbHVlIGlzIG5vdCBvcHRpb25hbCwgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IDAuICBJZiB0aGUKKyAgICAgKiBhcnJheSBwYXJhbWV0ZXIgaXMgTlVMTCwgYW5kIGl0IGlzIG5vdCBvcHRpb25hbCwgdmVyaWZ5IHRoYXQgY291bnQgaXMgMC4KKyAgICAgKiBUaGUgYXJyYXkgcGFyYW1ldGVyIHdpbGwgdHlwaWNhbGx5IGJlIG9wdGlvbmFsIGZvciB0aGlzIGNhc2UgKHdoZXJlIGNvdW50IGlzCisgICAgICogYSBwb2ludGVyKSwgYWxsb3dpbmcgdGhlIGNhbGxlciB0byByZXRyaWV2ZSB0aGUgYXZhaWxhYmxlIGNvdW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaU5hbWUgTmFtZSBvZiBBUEkgY2FsbCBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIGNvdW50TmFtZSBOYW1lIG9mIGNvdW50IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gYXJyYXlOYW1lIE5hbWUgb2YgYXJyYXkgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBjb3VudCBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBhcnJheSBBcnJheSB0byB2YWxpZGF0ZS4KKyAgICAgKiBAcGFyYW0gY291bnRQdHJSZXF1aXJlZCBUaGUgJ2NvdW50JyBwYXJhbWV0ZXIgbWF5IG5vdCBiZSBOVUxMIHdoZW4gdHJ1ZS4KKyAgICAgKiBAcGFyYW0gY291bnRWYWx1ZVJlcXVpcmVkIFRoZSAnKmNvdW50JyB2YWx1ZSBtYXkgbm90IGJlIDAgd2hlbiB0cnVlLgorICAgICAqIEBwYXJhbSBhcnJheVJlcXVpcmVkIFRoZSAnYXJyYXknIHBhcmFtZXRlciBtYXkgbm90IGJlIE5VTEwgd2hlbiB0cnVlLgorICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbGwgc2hvdWxkIGJlIHNraXBwZWQuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIHZhbGlkYXRlX2FycmF5KGNvbnN0IGNoYXIgKmFwaU5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmNvdW50TmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmYXJyYXlOYW1lLCBjb25zdCBUMSAqY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiAqYXJyYXksIGJvb2wgY291bnRQdHJSZXF1aXJlZCwgYm9vbCBjb3VudFZhbHVlUmVxdWlyZWQsIGJvb2wgYXJyYXlSZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50X3JlcXVpcmVkX3Z1aWQsIGNvbnN0IGNoYXIgKmFycmF5X3JlcXVpcmVkX3Z1aWQpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBza2lwX2NhbGwgPSBmYWxzZTsKKworICAgICAgICBpZiAoY291bnQgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGNvdW50UHRyUmVxdWlyZWQpIHsKKyAgICAgICAgICAgICAgICBza2lwX2NhbGwgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX1JlcXVpcmVkUGFyYW1ldGVyLCAiJXM6IHJlcXVpcmVkIHBhcmFtZXRlciAlcyBzcGVjaWZpZWQgYXMgTlVMTCIsIGFwaU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnROYW1lLmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBza2lwX2NhbGwgfD0gdmFsaWRhdGVfYXJyYXkoYXBpTmFtZSwgY291bnROYW1lLCBhcnJheU5hbWUsICphcnJheSA/ICgqY291bnQpIDogMCwgJmFycmF5LCBjb3VudFZhbHVlUmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlSZXF1aXJlZCwgY291bnRfcmVxdWlyZWRfdnVpZCwgYXJyYXlfcmVxdWlyZWRfdnVpZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2tpcF9jYWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGEgcG9pbnRlciB0byBhIFZ1bGthbiBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBWZXJpZnkgdGhhdCBhIHJlcXVpcmVkIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgaXMgbm90IE5VTEwuICBJZiB0aGUgcG9pbnRlciBpcworICAgICAqIG5vdCBOVUxMLCB2ZXJpZnkgdGhhdCBlYWNoIHN0cnVjdHVyZSdzIHNUeXBlIGZpZWxkIGlzIHNldCB0byB0aGUgY29ycmVjdAorICAgICAqIFZrU3RydWN0dXJlVHlwZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGlOYW1lIE5hbWUgb2YgQVBJIGNhbGwgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lIE5hbWUgb2Ygc3RydWN0IHBhcmFtZXRlciBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIHNUeXBlTmFtZSBOYW1lIG9mIGV4cGVjdGVkIFZrU3RydWN0dXJlVHlwZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgUG9pbnRlciB0byB0aGUgc3RydWN0IHRvIHZhbGlkYXRlLgorICAgICAqIEBwYXJhbSBzVHlwZSBWa1N0cnVjdHVyZVR5cGUgZm9yIHN0cnVjdHVyZSB2YWxpZGF0aW9uLgorICAgICAqIEBwYXJhbSByZXF1aXJlZCBUaGUgcGFyYW1ldGVyIG1heSBub3QgYmUgTlVMTCB3aGVuIHRydWUuCisgICAgICogQHJldHVybiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGUgY2FsbCBzaG91bGQgYmUgc2tpcHBlZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBib29sIHZhbGlkYXRlX3N0cnVjdF90eXBlKGNvbnN0IGNoYXIgKmFwaU5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJnBhcmFtZXRlck5hbWUsIGNvbnN0IGNoYXIgKnNUeXBlTmFtZSwgY29uc3QgVCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGUsIGJvb2wgcmVxdWlyZWQsIGNvbnN0IGNoYXIgKnN0cnVjdF92dWlkLCBjb25zdCBjaGFyICpzdHlwZV92dWlkKSBjb25zdCB7CisgICAgICAgIGJvb2wgc2tpcF9jYWxsID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChyZXF1aXJlZCkgeworICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PQorICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCBzdHJ1Y3RfdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHJlcXVpcmVkIHBhcmFtZXRlciAlcyBzcGVjaWZpZWQgYXMgTlVMTCIsIGFwaU5hbWUsIHBhcmFtZXRlck5hbWUuZ2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+c1R5cGUgIT0gc1R5cGUpIHsKKyAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCBzdHlwZV92dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwYXJhbWV0ZXIgJXMtPnNUeXBlIG11c3QgYmUgJXMuIiwgYXBpTmFtZSwgcGFyYW1ldGVyTmFtZS5nZXRfbmFtZSgpLmNfc3RyKCksIHNUeXBlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2tpcF9jYWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGFuIGFycmF5IG9mIFZ1bGthbiBzdHJ1Y3R1cmVzCisgICAgICoKKyAgICAgKiBWZXJpZnkgdGhhdCByZXF1aXJlZCBjb3VudCBhbmQgYXJyYXkgcGFyYW1ldGVycyBhcmUgbm90IDAgb3IgTlVMTC4gIElmCisgICAgICogdGhlIGFycmF5IGNvbnRhaW5zIDEgb3IgbW9yZSBzdHJ1Y3R1cmVzLCB2ZXJpZnkgdGhhdCBlYWNoIHN0cnVjdHVyZSdzCisgICAgICogc1R5cGUgZmllbGQgaXMgc2V0IHRvIHRoZSBjb3JyZWN0IFZrU3RydWN0dXJlVHlwZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGlOYW1lIE5hbWUgb2YgQVBJIGNhbGwgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBjb3VudE5hbWUgTmFtZSBvZiBjb3VudCBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGFycmF5TmFtZSBOYW1lIG9mIGFycmF5IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gc1R5cGVOYW1lIE5hbWUgb2YgZXhwZWN0ZWQgVmtTdHJ1Y3R1cmVUeXBlIHZhbHVlLgorICAgICAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBhcnJheSBBcnJheSB0byB2YWxpZGF0ZS4KKyAgICAgKiBAcGFyYW0gc1R5cGUgVmtTdHJ1Y3R1cmVUeXBlIGZvciBzdHJ1Y3R1cmUgdmFsaWRhdGlvbi4KKyAgICAgKiBAcGFyYW0gY291bnRSZXF1aXJlZCBUaGUgJ2NvdW50JyBwYXJhbWV0ZXIgbWF5IG5vdCBiZSAwIHdoZW4gdHJ1ZS4KKyAgICAgKiBAcGFyYW0gYXJyYXlSZXF1aXJlZCBUaGUgJ2FycmF5JyBwYXJhbWV0ZXIgbWF5IG5vdCBiZSBOVUxMIHdoZW4gdHJ1ZS4KKyAgICAgKiBAcmV0dXJuIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBjYWxsIHNob3VsZCBiZSBza2lwcGVkLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIGJvb2wgdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoY29uc3QgY2hhciAqYXBpTmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmY291bnROYW1lLCBjb25zdCBQYXJhbWV0ZXJOYW1lICZhcnJheU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzVHlwZU5hbWUsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUICphcnJheSwgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb3VudFJlcXVpcmVkLCBib29sIGFycmF5UmVxdWlyZWQsIGNvbnN0IGNoYXIgKnN0eXBlX3Z1aWQsIGNvbnN0IGNoYXIgKnBhcmFtX3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudF9yZXF1aXJlZF92dWlkKSBjb25zdCB7CisgICAgICAgIGJvb2wgc2tpcF9jYWxsID0gZmFsc2U7CisKKyAgICAgICAgaWYgKChjb3VudCA9PSAwKSB8fCAoYXJyYXkgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIHNraXBfY2FsbCB8PSB2YWxpZGF0ZV9hcnJheShhcGlOYW1lLCBjb3VudE5hbWUsIGFycmF5TmFtZSwgY291bnQsICZhcnJheSwgY291bnRSZXF1aXJlZCwgYXJyYXlSZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9yZXF1aXJlZF92dWlkLCBwYXJhbV92dWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGFsbCBzdHJ1Y3RzIGluIHRoZSBhcnJheSBoYXZlIHRoZSBjb3JyZWN0IHR5cGUKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldLnNUeXBlICE9IHNUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgc3R5cGVfdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwYXJhbWV0ZXIgJXNbJWRdLnNUeXBlIG11c3QgYmUgJXMiLCBhcGlOYW1lLCBhcnJheU5hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCBpLCBzVHlwZU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBza2lwX2NhbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYW4gYXJyYXkgb2YgVnVsa2FuIHN0cnVjdHVyZXMuCisgICAgICoKKyAgICAgKiBWZXJpZnkgdGhhdCByZXF1aXJlZCBjb3VudCBhbmQgYXJyYXkgcGFyYW1ldGVycyBhcmUgbm90IE5VTEwuICBJZiBjb3VudAorICAgICAqIGlzIG5vdCBOVUxMIGFuZCBpdHMgdmFsdWUgaXMgbm90IG9wdGlvbmFsLCB2ZXJpZnkgdGhhdCBpdCBpcyBub3QgMC4KKyAgICAgKiBJZiB0aGUgYXJyYXkgY29udGFpbnMgMSBvciBtb3JlIHN0cnVjdHVyZXMsIHZlcmlmeSB0aGF0IGVhY2ggc3RydWN0dXJlJ3MKKyAgICAgKiBzVHlwZSBmaWVsZCBpcyBzZXQgdG8gdGhlIGNvcnJlY3QgVmtTdHJ1Y3R1cmVUeXBlIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaU5hbWUgTmFtZSBvZiBBUEkgY2FsbCBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIGNvdW50TmFtZSBOYW1lIG9mIGNvdW50IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gYXJyYXlOYW1lIE5hbWUgb2YgYXJyYXkgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBzVHlwZU5hbWUgTmFtZSBvZiBleHBlY3RlZCBWa1N0cnVjdHVyZVR5cGUgdmFsdWUuCisgICAgICogQHBhcmFtIGNvdW50IFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIGFycmF5IEFycmF5IHRvIHZhbGlkYXRlLgorICAgICAqIEBwYXJhbSBzVHlwZSBWa1N0cnVjdHVyZVR5cGUgZm9yIHN0cnVjdHVyZSB2YWxpZGF0aW9uLgorICAgICAqIEBwYXJhbSBjb3VudFB0clJlcXVpcmVkIFRoZSAnY291bnQnIHBhcmFtZXRlciBtYXkgbm90IGJlIE5VTEwgd2hlbiB0cnVlLgorICAgICAqIEBwYXJhbSBjb3VudFZhbHVlUmVxdWlyZWQgVGhlICcqY291bnQnIHZhbHVlIG1heSBub3QgYmUgMCB3aGVuIHRydWUuCisgICAgICogQHBhcmFtIGFycmF5UmVxdWlyZWQgVGhlICdhcnJheScgcGFyYW1ldGVyIG1heSBub3QgYmUgTlVMTCB3aGVuIHRydWUuCisgICAgICogQHJldHVybiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGUgY2FsbCBzaG91bGQgYmUgc2tpcHBlZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBib29sIHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KGNvbnN0IGNoYXIgKmFwaU5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmNvdW50TmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmYXJyYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc1R5cGVOYW1lLCB1aW50MzJfdCAqY291bnQsIGNvbnN0IFQgKmFycmF5LCBWa1N0cnVjdHVyZVR5cGUgc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvdW50UHRyUmVxdWlyZWQsIGJvb2wgY291bnRWYWx1ZVJlcXVpcmVkLCBib29sIGFycmF5UmVxdWlyZWQsIGNvbnN0IGNoYXIgKnN0eXBlX3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbV92dWlkLCBjb25zdCBjaGFyICpjb3VudF9yZXF1aXJlZF92dWlkKSBjb25zdCB7CisgICAgICAgIGJvb2wgc2tpcF9jYWxsID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGNvdW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChjb3VudFB0clJlcXVpcmVkKSB7CisgICAgICAgICAgICAgICAgc2tpcF9jYWxsIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9SZXF1aXJlZFBhcmFtZXRlciwgIiVzOiByZXF1aXJlZCBwYXJhbWV0ZXIgJXMgc3BlY2lmaWVkIGFzIE5VTEwiLCBhcGlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50TmFtZS5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2tpcF9jYWxsIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5KGFwaU5hbWUsIGNvdW50TmFtZSwgYXJyYXlOYW1lLCBzVHlwZU5hbWUsICgqY291bnQpLCBhcnJheSwgc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRWYWx1ZVJlcXVpcmVkLCBhcnJheVJlcXVpcmVkLCBzdHlwZV92dWlkLCBwYXJhbV92dWlkLCBjb3VudF9yZXF1aXJlZF92dWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBza2lwX2NhbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYSBWdWxrYW4gaGFuZGxlLgorICAgICAqCisgICAgICogVmVyaWZ5IHRoYXQgdGhlIHNwZWNpZmllZCBoYW5kbGUgaXMgbm90IFZLX05VTExfSEFORExFLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaV9uYW1lIE5hbWUgb2YgQVBJIGNhbGwgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJfbmFtZSBOYW1lIG9mIHN0cnVjdCBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZSBIYW5kbGUgdG8gdmFsaWRhdGUuCisgICAgICogQHJldHVybiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGUgY2FsbCBzaG91bGQgYmUgc2tpcHBlZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBib29sIHZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZShjb25zdCBjaGFyICphcGlfbmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmcGFyYW1ldGVyX25hbWUsIFQgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBza2lwX2NhbGwgPSBmYWxzZTsKKworICAgICAgICBpZiAodmFsdWUgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9SZXF1aXJlZFBhcmFtZXRlciwgIiVzOiByZXF1aXJlZCBwYXJhbWV0ZXIgJXMgc3BlY2lmaWVkIGFzIFZLX05VTExfSEFORExFIiwgYXBpX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBfY2FsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBhbiBhcnJheSBvZiBWdWxrYW4gaGFuZGxlcy4KKyAgICAgKgorICAgICAqIFZlcmlmeSB0aGF0IHJlcXVpcmVkIGNvdW50IGFuZCBhcnJheSBwYXJhbWV0ZXJzIGFyZSBub3QgTlVMTC4gIElmIGNvdW50CisgICAgICogaXMgbm90IE5VTEwgYW5kIGl0cyB2YWx1ZSBpcyBub3Qgb3B0aW9uYWwsIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCAwLgorICAgICAqIElmIHRoZSBhcnJheSBjb250YWlucyAxIG9yIG1vcmUgaGFuZGxlcywgdmVyaWZ5IHRoYXQgbm8gaGFuZGxlIGlzIHNldCB0bworICAgICAqIFZLX05VTExfSEFORExFLgorICAgICAqCisgICAgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGludGVuZGVkIHRvIHZhbGlkYXRlIGFycmF5cyBvZiBoYW5kbGVzIHdoZW4gbm9uZQorICAgICAqICAgICAgIG9mIHRoZSBoYW5kbGVzIGFyZSBhbGxvd2VkIHRvIGJlIFZLX05VTExfSEFORExFLiAgRm9yIGFycmF5cyBvZiBoYW5kbGVzCisgICAgICogICAgICAgdGhhdCBhcmUgYWxsb3dlZCB0byBjb250YWluIFZLX05VTExfSEFORExFLCB1c2UgdmFsaWRhdGVfYXJyYXkoKSBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaV9uYW1lIE5hbWUgb2YgQVBJIGNhbGwgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBjb3VudF9uYW1lIE5hbWUgb2YgY291bnQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBhcnJheV9uYW1lIE5hbWUgb2YgYXJyYXkgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBhcnJheSBBcnJheSB0byB2YWxpZGF0ZS4KKyAgICAgKiBAcGFyYW0gY291bnRfcmVxdWlyZWQgVGhlICdjb3VudCcgcGFyYW1ldGVyIG1heSBub3QgYmUgMCB3aGVuIHRydWUuCisgICAgICogQHBhcmFtIGFycmF5X3JlcXVpcmVkIFRoZSAnYXJyYXknIHBhcmFtZXRlciBtYXkgbm90IGJlIE5VTEwgd2hlbiB0cnVlLgorICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbGwgc2hvdWxkIGJlIHNraXBwZWQuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYm9vbCB2YWxpZGF0ZV9oYW5kbGVfYXJyYXkoY29uc3QgY2hhciAqYXBpX25hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmNvdW50X25hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmFycmF5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IFQgKmFycmF5LCBib29sIGNvdW50X3JlcXVpcmVkLCBib29sIGFycmF5X3JlcXVpcmVkKSBjb25zdCB7CisgICAgICAgIGJvb2wgc2tpcF9jYWxsID0gZmFsc2U7CisKKyAgICAgICAgaWYgKChjb3VudCA9PSAwKSB8fCAoYXJyYXkgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIHNraXBfY2FsbCB8PSB2YWxpZGF0ZV9hcnJheShhcGlfbmFtZSwgY291bnRfbmFtZSwgYXJyYXlfbmFtZSwgY291bnQsICZhcnJheSwgY291bnRfcmVxdWlyZWQsIGFycmF5X3JlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkLCBrVlVJRFVuZGVmaW5lZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCBubyBoYW5kbGVzIGluIHRoZSBhcnJheSBhcmUgVktfTlVMTF9IQU5ETEUKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9SZXF1aXJlZFBhcmFtZXRlciwgIiVzOiByZXF1aXJlZCBwYXJhbWV0ZXIgJXNbJWRdIHNwZWNpZmllZCBhcyBWS19OVUxMX0hBTkRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9uYW1lLCBhcnJheV9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBfY2FsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBzdHJpbmcgYXJyYXkgY291bnQgYW5kIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBWZXJpZnkgdGhhdCByZXF1aXJlZCBjb3VudCBhbmQgYXJyYXkgcGFyYW1ldGVycyBhcmUgbm90IDAgb3IgTlVMTC4gIElmIHRoZQorICAgICAqIGNvdW50IHBhcmFtZXRlciBpcyBub3Qgb3B0aW9uYWwsIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCAwLiAgSWYgdGhlIGFycmF5CisgICAgICogcGFyYW1ldGVyIGlzIE5VTEwsIGFuZCBpdCBpcyBub3Qgb3B0aW9uYWwsIHZlcmlmeSB0aGF0IGNvdW50IGlzIDAuICBJZiB0aGUKKyAgICAgKiBhcnJheSBwYXJhbWV0ZXIgaXMgbm90IE5VTEwsIHZlcmlmeSB0aGF0IG5vbmUgb2YgdGhlIHN0cmluZ3MgYXJlIE5VTEwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpTmFtZSBOYW1lIG9mIEFQSSBjYWxsIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gY291bnROYW1lIE5hbWUgb2YgY291bnQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBhcnJheU5hbWUgTmFtZSBvZiBhcnJheSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGNvdW50IE51bWJlciBvZiBzdHJpbmdzIGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gYXJyYXkgQXJyYXkgb2Ygc3RyaW5ncyB0byB2YWxpZGF0ZS4KKyAgICAgKiBAcGFyYW0gY291bnRSZXF1aXJlZCBUaGUgJ2NvdW50JyBwYXJhbWV0ZXIgbWF5IG5vdCBiZSAwIHdoZW4gdHJ1ZS4KKyAgICAgKiBAcGFyYW0gYXJyYXlSZXF1aXJlZCBUaGUgJ2FycmF5JyBwYXJhbWV0ZXIgbWF5IG5vdCBiZSBOVUxMIHdoZW4gdHJ1ZS4KKyAgICAgKiBAcmV0dXJuIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBjYWxsIHNob3VsZCBiZSBza2lwcGVkLgorICAgICAqLworICAgIGJvb2wgdmFsaWRhdGVfc3RyaW5nX2FycmF5KGNvbnN0IGNoYXIgKmFwaU5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmNvdW50TmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmYXJyYXlOYW1lLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAqYXJyYXksIGJvb2wgY291bnRSZXF1aXJlZCwgYm9vbCBhcnJheVJlcXVpcmVkLCBjb25zdCBjaGFyICpjb3VudF9yZXF1aXJlZF92dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFycmF5X3JlcXVpcmVkX3Z1aWQpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBza2lwX2NhbGwgPSBmYWxzZTsKKworICAgICAgICBpZiAoKGNvdW50ID09IDApIHx8IChhcnJheSA9PSBOVUxMKSkgeworICAgICAgICAgICAgc2tpcF9jYWxsIHw9IHZhbGlkYXRlX2FycmF5KGFwaU5hbWUsIGNvdW50TmFtZSwgYXJyYXlOYW1lLCBjb3VudCwgJmFycmF5LCBjb3VudFJlcXVpcmVkLCBhcnJheVJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50X3JlcXVpcmVkX3Z1aWQsIGFycmF5X3JlcXVpcmVkX3Z1aWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgc3RyaW5ncyBpbiB0aGUgYXJyYXkgYXJlIG5vdCBOVUxMCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX1JlcXVpcmVkUGFyYW1ldGVyLCAiJXM6IHJlcXVpcmVkIHBhcmFtZXRlciAlc1slZF0gc3BlY2lmaWVkIGFzIE5VTEwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlOYW1lLCBhcnJheU5hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2tpcF9jYWxsOworICAgIH0KKworICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHBOZXh0IHZhbGlkYXRpb24KKyAgICBib29sIFZhbGlkYXRlUG5leHRTdHJ1Y3RDb250ZW50cyhjb25zdCBjaGFyICphcGlfbmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmcGFyYW1ldGVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCYXNlT3V0U3RydWN0dXJlICpoZWFkZXIpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYSBzdHJ1Y3R1cmUncyBwTmV4dCBtZW1iZXIuCisgICAgICoKKyAgICAgKiBWZXJpZnkgdGhhdCB0aGUgc3BlY2lmaWVkIHBOZXh0IHZhbHVlIHBvaW50cyB0byB0aGUgaGVhZCBvZiBhIGxpc3Qgb2YKKyAgICAgKiBhbGxvd2VkIGV4dGVuc2lvbiBzdHJ1Y3R1cmVzLiAgSWYgbm8gZXh0ZW5zaW9uIHN0cnVjdHVyZXMgYXJlIGFsbG93ZWQsCisgICAgICogdmVyaWZ5IHRoYXQgcE5leHQgaXMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGlfbmFtZSBOYW1lIG9mIEFQSSBjYWxsIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyX25hbWUgTmFtZSBvZiBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBhbGxvd2VkX3N0cnVjdF9uYW1lcyBOYW1lcyBvZiBhbGxvd2VkIHN0cnVjdHMuCisgICAgICogQHBhcmFtIG5leHQgUG9pbnRlciB0byB2YWxpZGF0ZS4KKyAgICAgKiBAcGFyYW0gYWxsb3dlZF90eXBlX2NvdW50IFRvdGFsIG51bWJlciBvZiBhbGxvd2VkIHN0cnVjdHVyZSB0eXBlcy4KKyAgICAgKiBAcGFyYW0gYWxsb3dlZF90eXBlcyBBcnJheSBvZiBzdHJ1Y3R1cmUgdHlwZXMgYWxsb3dlZCBmb3IgcE5leHQuCisgICAgICogQHBhcmFtIGhlYWRlcl92ZXJzaW9uIFZlcnNpb24gb2YgaGVhZGVyIGRlZmluaW5nIHRoZSBwTmV4dCB2YWxpZGF0aW9uIHJ1bGVzLgorICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbGwgc2hvdWxkIGJlIHNraXBwZWQuCisgICAgICovCisgICAgYm9vbCB2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQoY29uc3QgY2hhciAqYXBpX25hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJnBhcmFtZXRlcl9uYW1lLCBjb25zdCBjaGFyICphbGxvd2VkX3N0cnVjdF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpuZXh0LCBzaXplX3QgYWxsb3dlZF90eXBlX2NvdW50LCBjb25zdCBWa1N0cnVjdHVyZVR5cGUgKmFsbG93ZWRfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGVhZGVyX3ZlcnNpb24sIGNvbnN0IGNoYXIgKnZ1aWQpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBza2lwX2NhbGwgPSBmYWxzZTsKKworICAgICAgICAvLyBUT0RPOiBUaGUgdmFsaWQgcE5leHQgc3RydWN0dXJlIHR5cGVzIGFyZSBub3QgcmVjdXJzaXZlLiBFYWNoIHN0cnVjdHVyZSBoYXMgaXRzIG93biBsaXN0IG9mIHZhbGlkIHNUeXBlcyBmb3IgcE5leHQuCisgICAgICAgIC8vIENvZGVnZW4gYSBtYXAgb2YgdmVjdG9ycyBjb250YWluaW5nIHRoZSBhbGxvd2FibGUgcE5leHQgdHlwZXMgZm9yIGVhY2ggc3RydWN0IGFuZCB1c2UgdGhhdCBoZXJlIC0tIGFsc28gc2ltcGxpZmllcyBwYXJtcy4KKyAgICAgICAgaWYgKG5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGNvbnN0IHZvaWQgKj4gY3ljbGVfY2hlY2s7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8VmtTdHJ1Y3R1cmVUeXBlLCBzdGQ6Omhhc2g8aW50Pj4gdW5pcXVlX3N0eXBlX2NoZWNrOworCisgICAgICAgICAgICBjb25zdCBjaGFyICpkaXNjbGFpbWVyID0KKyAgICAgICAgICAgICAgICAiVGhpcyB3YXJuaW5nIGlzIGJhc2VkIG9uIHRoZSBWYWxpZCBVc2FnZSBkb2N1bWVudGF0aW9uIGZvciB2ZXJzaW9uICVkIG9mIHRoZSBWdWxrYW4gaGVhZGVyLiAgSXQgaXMgcG9zc2libGUgdGhhdCAiCisgICAgICAgICAgICAgICAgInlvdSAiCisgICAgICAgICAgICAgICAgImFyZSAiCisgICAgICAgICAgICAgICAgInVzaW5nIGEgc3RydWN0IGZyb20gYSBwcml2YXRlIGV4dGVuc2lvbiBvciBhbiBleHRlbnNpb24gdGhhdCB3YXMgYWRkZWQgdG8gYSBsYXRlciB2ZXJzaW9uIG9mIHRoZSBWdWxrYW4gaGVhZGVyLCAiCisgICAgICAgICAgICAgICAgImluICIKKyAgICAgICAgICAgICAgICAid2hpY2ggIgorICAgICAgICAgICAgICAgICJjYXNlIHlvdXIgdXNlIG9mICVzIGlzIHBlcmZlY3RseSB2YWxpZCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB2YWxpZGF0aW9uIGVuYWJsZWQiOworCisgICAgICAgICAgICBpZiAoYWxsb3dlZF90eXBlX2NvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlID0gIiVzOiB2YWx1ZSBvZiAlcyBtdXN0IGJlIE5VTEwuICI7CisgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBkaXNjbGFpbWVyOworICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jX3N0cigpLCBhcGlfbmFtZSwgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCBoZWFkZXJfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgKnN0YXJ0ID0gYWxsb3dlZF90eXBlczsKKyAgICAgICAgICAgICAgICBjb25zdCBWa1N0cnVjdHVyZVR5cGUgKmVuZCA9IGFsbG93ZWRfdHlwZXMgKyBhbGxvd2VkX3R5cGVfY291bnQ7CisgICAgICAgICAgICAgICAgY29uc3QgVmtCYXNlT3V0U3RydWN0dXJlICpjdXJyZW50ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKj4obmV4dCk7CisKKyAgICAgICAgICAgICAgICBjeWNsZV9jaGVjay5pbnNlcnQobmV4dCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKHN0cm5jbXAoYXBpX25hbWUsICJ2a0NyZWF0ZUluc3RhbmNlIiwgc3RybGVuKGFwaV9uYW1lKSkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudC0+c1R5cGUgIT0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RybmNtcChhcGlfbmFtZSwgInZrQ3JlYXRlRGV2aWNlIiwgc3RybGVuKGFwaV9uYW1lKSkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudC0+c1R5cGUgIT0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0RFVklDRV9DUkVBVEVfSU5GTykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3ljbGVfY2hlY2suZmluZChjdXJyZW50LT5wTmV4dCkgIT0gY3ljbGVfY2hlY2suZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlID0gIiVzOiAlcyBjaGFpbiBjb250YWlucyBhIGN5Y2xlIC0tIHBOZXh0IHBvaW50ZXIgIiBQUkl4NjQgIiBpcyByZXBlYXRlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX1BWRXJyb3JfSW52YWxpZFN0cnVjdFBOZXh0LCBtZXNzYWdlLmNfc3RyKCksIGFwaV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdD4obmV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWNsZV9jaGVjay5pbnNlcnQoY3VycmVudC0+cE5leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWUgPSBzdHJpbmdfVmtTdHJ1Y3R1cmVUeXBlKGN1cnJlbnQtPnNUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlxdWVfc3R5cGVfY2hlY2suZmluZChjdXJyZW50LT5zVHlwZSkgIT0gdW5pcXVlX3N0eXBlX2NoZWNrLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZSA9ICIlczogJXMgY2hhaW4gY29udGFpbnMgZHVwbGljYXRlIHN0cnVjdHVyZSB0eXBlczogJXMgYXBwZWFycyBtdWx0aXBsZSB0aW1lcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIGtWVUlEX1BWRXJyb3JfSW52YWxpZFN0cnVjdFBOZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY19zdHIoKSwgYXBpX25hbWUsIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVfc3R5cGVfY2hlY2suaW5zZXJ0KGN1cnJlbnQtPnNUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChzdGFydCwgZW5kLCBjdXJyZW50LT5zVHlwZSkgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfbmFtZSA9PSBVbnN1cHBvcnRlZFN0cnVjdHVyZVR5cGVTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIGNoYWluIGluY2x1ZGVzIGEgc3RydWN0dXJlIHdpdGggdW5rbm93biBWa1N0cnVjdHVyZVR5cGUgKCVkKTsgQWxsb3dlZCBzdHJ1Y3R1cmVzIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVzXS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBkaXNjbGFpbWVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2NhbGwgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdnVpZCwgbWVzc2FnZS5jX3N0cigpLCBhcGlfbmFtZSwgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCBjdXJyZW50LT5zVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZF9zdHJ1Y3RfbmFtZXMsIGhlYWRlcl92ZXJzaW9uLCBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyBjaGFpbiBpbmNsdWRlcyBhIHN0cnVjdHVyZSB3aXRoIHVuZXhwZWN0ZWQgVmtTdHJ1Y3R1cmVUeXBlICVzOyBBbGxvd2VkIHN0cnVjdHVyZXMgYXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJXNdLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGRpc2NsYWltZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsIG1lc3NhZ2UuY19zdHIoKSwgYXBpX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lLmNfc3RyKCksIGFsbG93ZWRfc3RydWN0X25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfdmVyc2lvbiwgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2NhbGwgfD0gVmFsaWRhdGVQbmV4dFN0cnVjdENvbnRlbnRzKGFwaV9uYW1lLCBwYXJhbWV0ZXJfbmFtZSwgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCYXNlT3V0U3RydWN0dXJlICo+KGN1cnJlbnQtPnBOZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2tpcF9jYWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGEgVmtCb29sMzIgdmFsdWUuCisgICAgICoKKyAgICAgKiBHZW5lcmF0ZSBhIHdhcm5pbmcgaWYgYSBWa0Jvb2wzMiB2YWx1ZSBpcyBuZWl0aGVyIFZLX1RSVUUgbm9yIFZLX0ZBTFNFLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaU5hbWUgTmFtZSBvZiBBUEkgY2FsbCBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUgTmFtZSBvZiBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZSBCb29sZWFuIHZhbHVlIHRvIHZhbGlkYXRlLgorICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbGwgc2hvdWxkIGJlIHNraXBwZWQuCisgICAgICovCisgICAgYm9vbCB2YWxpZGF0ZV9ib29sMzIoY29uc3QgY2hhciAqYXBpTmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmcGFyYW1ldGVyTmFtZSwgVmtCb29sMzIgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBza2lwX2NhbGwgPSBmYWxzZTsKKworICAgICAgICBpZiAoKHZhbHVlICE9IFZLX1RSVUUpICYmICh2YWx1ZSAhPSBWS19GQUxTRSkpIHsKKyAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX1VucmVjb2duaXplZFZhbHVlLCAiJXM6IHZhbHVlIG9mICVzICglZCkgaXMgbmVpdGhlciBWS19UUlVFIG5vciBWS19GQUxTRSIsIGFwaU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lLmdldF9uYW1lKCkuY19zdHIoKSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBfY2FsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBhIFZ1bGthbiBlbnVtZXJhdGlvbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEdlbmVyYXRlIGEgd2FybmluZyBpZiBhbiBlbnVtZXJhdGlvbiB0b2tlbiB2YWx1ZSBkb2VzIG5vdCBmYWxsIHdpdGhpbiB0aGUgY29yZSBlbnVtZXJhdGlvbgorICAgICAqIGJlZ2luIGFuZCBlbmQgdG9rZW4gdmFsdWVzLCBhbmQgd2FzIG5vdCBhZGRlZCB0byB0aGUgZW51bWVyYXRpb24gYnkgYW4gZXh0ZW5zaW9uLiAgRXh0ZW5zaW9uCisgICAgICogcHJvdmlkZWQgZW51bWVyYXRpb25zIHVzZSB0aGUgZXF1YXRpb24gc3BlY2lmaWVkIGluIEFwcGVuZGl4IEMuMTAgb2YgdGhlIFZ1bGthbiBzcGVjaWZpY2F0aW9uLAorICAgICAqIHdpdGggMSwwMDAsMDAwLDAwMCBhcyB0aGUgYmFzZSB0b2tlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHRvIHByb2Nlc3MgZW51bWVyYXRpb25zIGRlZmluaW5nIGJpdG1hc2sgZmxhZyBiaXRzLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaU5hbWUgTmFtZSBvZiBBUEkgY2FsbCBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUgTmFtZSBvZiBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBlbnVtTmFtZSBOYW1lIG9mIHRoZSBlbnVtZXJhdGlvbiBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIHZhbGlkX3ZhbHVlcyBUaGUgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgRW51bWVyYXRpb24gdmFsdWUgdG8gdmFsaWRhdGUuCisgICAgICogQHJldHVybiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGUgY2FsbCBzaG91bGQgYmUgc2tpcHBlZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBib29sIHZhbGlkYXRlX3JhbmdlZF9lbnVtKGNvbnN0IGNoYXIgKmFwaU5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJnBhcmFtZXRlck5hbWUsIGNvbnN0IGNoYXIgKmVudW1OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbGlkX3ZhbHVlcywgVCB2YWx1ZSwgY29uc3QgY2hhciAqdnVpZCkgY29uc3QgeworICAgICAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgICAgICBpZiAoc3RkOjpmaW5kKHZhbGlkX3ZhbHVlcy5iZWdpbigpLCB2YWxpZF92YWx1ZXMuZW5kKCksIHZhbHVlKSA9PSB2YWxpZF92YWx1ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHNraXAgfD0KKyAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiB2YWx1ZSBvZiAlcyAoJWQpIGRvZXMgbm90IGZhbGwgd2l0aGluIHRoZSBiZWdpbi4uZW5kIHJhbmdlIG9mIHRoZSBjb3JlICVzIGVudW1lcmF0aW9uIHRva2VucyBhbmQgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbiBleHRlbnNpb24gYWRkZWQgdG9rZW4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaU5hbWUsIHBhcmFtZXRlck5hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCB2YWx1ZSwgZW51bU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYW4gYXJyYXkgb2YgVnVsa2FuIGVudW1lcmF0aW9uIHZhbHVlLgorICAgICAqCisgICAgICogUHJvY2VzcyBhbGwgZW51bWVyYXRpb24gdG9rZW4gdmFsdWVzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYW5kIGdlbmVyYXRlIGEgd2FybmluZyBpZiBhIHZhbHVlCisgICAgICogZG9lcyBub3QgZmFsbCB3aXRoaW4gdGhlIGNvcmUgZW51bWVyYXRpb24gYmVnaW4gYW5kIGVuZCB0b2tlbiB2YWx1ZXMsIGFuZCB3YXMgbm90IGFkZGVkIHRvCisgICAgICogdGhlIGVudW1lcmF0aW9uIGJ5IGFuIGV4dGVuc2lvbi4gIEV4dGVuc2lvbiBwcm92aWRlZCBlbnVtZXJhdGlvbnMgdXNlIHRoZSBlcXVhdGlvbiBzcGVjaWZpZWQKKyAgICAgKiBpbiBBcHBlbmRpeCBDLjEwIG9mIHRoZSBWdWxrYW4gc3BlY2lmaWNhdGlvbiwgd2l0aCAxLDAwMCwwMDAsMDAwIGFzIHRoZSBiYXNlIHRva2VuIHZhbHVlLgorICAgICAqCisgICAgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3QgdG8gcHJvY2VzcyBlbnVtZXJhdGlvbnMgZGVmaW5pbmcgYml0bWFzayBmbGFnIGJpdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpTmFtZSBOYW1lIG9mIEFQSSBjYWxsIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gY291bnROYW1lIE5hbWUgb2YgY291bnQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBhcnJheU5hbWUgTmFtZSBvZiBhcnJheSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGVudW1OYW1lIE5hbWUgb2YgdGhlIGVudW1lcmF0aW9uIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsaWRfdmFsdWVzIFRoZSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGVudW1lcmF0aW9uLgorICAgICAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgZW51bWVyYXRpb24gdmFsdWVzIGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gYXJyYXkgQXJyYXkgb2YgZW51bWVyYXRpb24gdmFsdWVzIHRvIHZhbGlkYXRlLgorICAgICAqIEBwYXJhbSBjb3VudFJlcXVpcmVkIFRoZSAnY291bnQnIHBhcmFtZXRlciBtYXkgbm90IGJlIDAgd2hlbiB0cnVlLgorICAgICAqIEBwYXJhbSBhcnJheVJlcXVpcmVkIFRoZSAnYXJyYXknIHBhcmFtZXRlciBtYXkgbm90IGJlIE5VTEwgd2hlbiB0cnVlLgorICAgICAqIEByZXR1cm4gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbGwgc2hvdWxkIGJlIHNraXBwZWQuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYm9vbCB2YWxpZGF0ZV9yYW5nZWRfZW51bV9hcnJheShjb25zdCBjaGFyICphcGlOYW1lLCBjb25zdCBQYXJhbWV0ZXJOYW1lICZjb3VudE5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmFycmF5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudW1OYW1lLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsaWRfdmFsdWVzLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVCAqYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvdW50UmVxdWlyZWQsIGJvb2wgYXJyYXlSZXF1aXJlZCkgY29uc3QgeworICAgICAgICBib29sIHNraXBfY2FsbCA9IGZhbHNlOworCisgICAgICAgIGlmICgoY291bnQgPT0gMCkgfHwgKGFycmF5ID09IE5VTEwpKSB7CisgICAgICAgICAgICBza2lwX2NhbGwgfD0gdmFsaWRhdGVfYXJyYXkoYXBpTmFtZSwgY291bnROYW1lLCBhcnJheU5hbWUsIGNvdW50LCAmYXJyYXksIGNvdW50UmVxdWlyZWQsIGFycmF5UmVxdWlyZWQsIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZCh2YWxpZF92YWx1ZXMuYmVnaW4oKSwgdmFsaWRfdmFsdWVzLmVuZCgpLCBhcnJheVtpXSkgPT0gdmFsaWRfdmFsdWVzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX1VucmVjb2duaXplZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHZhbHVlIG9mICVzWyVkXSAoJWQpIGRvZXMgbm90IGZhbGwgd2l0aGluIHRoZSBiZWdpbi4uZW5kIHJhbmdlIG9mIHRoZSBjb3JlICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW1lcmF0aW9uIHRva2VucyBhbmQgaXMgbm90IGFuIGV4dGVuc2lvbiBhZGRlZCB0b2tlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaU5hbWUsIGFycmF5TmFtZS5nZXRfbmFtZSgpLmNfc3RyKCksIGksIGFycmF5W2ldLCBlbnVtTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBfY2FsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCBhIHJlc2VydmVkIFZrRmxhZ3MgdmFsdWUgaXMgemVyby4KKyAgICAgKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgemVybywgdG8gY2hlY2sgVmtGbGFncyB2YWx1ZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgZm9yCisgICAgICogZnV0dXJlIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGlfbmFtZSBOYW1lIG9mIEFQSSBjYWxsIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyX25hbWUgTmFtZSBvZiBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byB2YWxpZGF0ZS4KKyAgICAgKiBAcmV0dXJuIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBjYWxsIHNob3VsZCBiZSBza2lwcGVkLgorICAgICAqLworICAgIGJvb2wgdmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MoY29uc3QgY2hhciAqYXBpX25hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJnBhcmFtZXRlcl9uYW1lLCBWa0ZsYWdzIHZhbHVlLCBjb25zdCBjaGFyICp2dWlkKSBjb25zdCB7CisgICAgICAgIGJvb2wgc2tpcF9jYWxsID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwYXJhbWV0ZXIgJXMgbXVzdCBiZSAwLiIsIGFwaV9uYW1lLCBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBfY2FsbDsKKyAgICB9CisKKyAgICBlbnVtIEZsYWdUeXBlIHsga1JlcXVpcmVkRmxhZ3MsIGtPcHRpb25hbEZsYWdzLCBrUmVxdWlyZWRTaW5nbGVCaXQsIGtPcHRpb25hbFNpbmdsZUJpdCB9OworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYSBWdWxrYW4gYml0bWFzayB2YWx1ZS4KKyAgICAgKgorICAgICAqIEdlbmVyYXRlIGEgd2FybmluZyBpZiBhIHZhbHVlIHdpdGggYSBWa0ZsYWdzIGRlcml2ZWQgdHlwZSBkb2VzIG5vdCBjb250YWluIHZhbGlkIGZsYWcgYml0cworICAgICAqIGZvciB0aGF0IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpX25hbWUgTmFtZSBvZiBBUEkgY2FsbCBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcl9uYW1lIE5hbWUgb2YgcGFyYW1ldGVyIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ19iaXRzX25hbWUgTmFtZSBvZiB0aGUgVmtGbGFncyB0eXBlIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gYWxsX2ZsYWdzIEEgYml0IG1hc2sgY29tYmluaW5nIGFsbCB2YWxpZCBmbGFnIGJpdHMgZm9yIHRoZSBWa0ZsYWdzIHR5cGUgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZSBWa0ZsYWdzIHZhbHVlIHRvIHZhbGlkYXRlLgorICAgICAqIEBwYXJhbSBmbGFnX3R5cGUgVGhlIHR5cGUgb2YgZmxhZywgbGlrZSBvcHRpb25hbCwgb3Igc2luZ2xlIGJpdC4KKyAgICAgKiBAcGFyYW0gdnVpZCBWVUlEIHVzZWQgZm9yIGZsYWcgdGhhdCBpcyBvdXRzaWRlIGRlZmluZWQgYml0cyAob3IgaGFzIG1vcmUgdGhhbiBvbmUgYml0IGZvciBCaXRzIHR5cGUpLgorICAgICAqIEBwYXJhbSBmbGFnc196ZXJvX3Z1aWQgVlVJRCB1c2VkIGZvciBub24tb3B0aW9uYWwgRmxhZ3MgdGhhdCBhcmUgemVyby4KKyAgICAgKiBAcmV0dXJuIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBjYWxsIHNob3VsZCBiZSBza2lwcGVkLgorICAgICAqLworICAgIGJvb2wgdmFsaWRhdGVfZmxhZ3MoY29uc3QgY2hhciAqYXBpX25hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJnBhcmFtZXRlcl9uYW1lLCBjb25zdCBjaGFyICpmbGFnX2JpdHNfbmFtZSwgVmtGbGFncyBhbGxfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBWa0ZsYWdzIHZhbHVlLCBjb25zdCBGbGFnVHlwZSBmbGFnX3R5cGUsIGNvbnN0IGNoYXIgKnZ1aWQsIGNvbnN0IGNoYXIgKmZsYWdzX3plcm9fdnVpZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBza2lwX2NhbGwgPSBmYWxzZTsKKworICAgICAgICBpZiAoKHZhbHVlICYgfmFsbF9mbGFncykgIT0gMCkgeworICAgICAgICAgICAgc2tpcF9jYWxsIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHZhbHVlIG9mICVzIGNvbnRhaW5zIGZsYWcgYml0cyB0aGF0IGFyZSBub3QgcmVjb2duaXplZCBtZW1iZXJzIG9mICVzIiwgYXBpX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCksIGZsYWdfYml0c19uYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGJvb2wgcmVxdWlyZWQgPSBmbGFnX3R5cGUgPT0ga1JlcXVpcmVkRmxhZ3MgfHwgZmxhZ190eXBlID09IGtSZXF1aXJlZFNpbmdsZUJpdDsKKyAgICAgICAgY29uc3QgY2hhciAqemVyb192dWlkID0gZmxhZ190eXBlID09IGtSZXF1aXJlZEZsYWdzID8gZmxhZ3NfemVyb192dWlkIDogdnVpZDsKKyAgICAgICAgaWYgKHJlcXVpcmVkICYmIHZhbHVlID09IDApIHsKKyAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB6ZXJvX3Z1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHZhbHVlIG9mICVzIG11c3Qgbm90IGJlIDAuIiwgYXBpX25hbWUsIHBhcmFtZXRlcl9uYW1lLmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBhdXRvIEhhc01heE9uZUJpdFNldCA9IFtdKGNvbnN0IFZrRmxhZ3MgZikgeworICAgICAgICAgICAgLy8gRGVjcmVtZW50IGZsaXBzIGJpdHMgZnJvbSByaWdodCB1cHRvIGZpcnN0IDEuCisgICAgICAgICAgICAvLyBSZXN0IHN0YXlzIHNhbWUsIGFuZCBpZiB0aGVyZSB3YXMgYW55IG90aGVyIDFzICZkZWQgdG9nZXRoZXIgdGhleSB3b3VsZCBiZSBub24temVyby4gUUVECisgICAgICAgICAgICByZXR1cm4gZiA9PSAwIHx8ICEoZiAmIChmIC0gMSkpOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IGJvb2wgaXNfYml0c190eXBlID0gZmxhZ190eXBlID09IGtSZXF1aXJlZFNpbmdsZUJpdCB8fCBmbGFnX3R5cGUgPT0ga09wdGlvbmFsU2luZ2xlQml0OworICAgICAgICBpZiAoaXNfYml0c190eXBlICYmICFIYXNNYXhPbmVCaXRTZXQodmFsdWUpKSB7CisgICAgICAgICAgICBza2lwX2NhbGwgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogdmFsdWUgb2YgJXMgY29udGFpbnMgbXVsdGlwbGUgbWVtYmVycyBvZiAlcyB3aGVuIG9ubHkgYSBzaW5nbGUgdmFsdWUgaXMgYWxsb3dlZCIsIGFwaV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCBmbGFnX2JpdHNfbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2tpcF9jYWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGFuIGFycmF5IG9mIFZ1bGthbiBiaXRtYXNrIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEdlbmVyYXRlIGEgd2FybmluZyBpZiBhIHZhbHVlIHdpdGggYSBWa0ZsYWdzIGRlcml2ZWQgdHlwZSBkb2VzIG5vdCBjb250YWluIHZhbGlkIGZsYWcgYml0cworICAgICAqIGZvciB0aGF0IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpX25hbWUgTmFtZSBvZiBBUEkgY2FsbCBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIGNvdW50X25hbWUgTmFtZSBvZiBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBhcnJheV9uYW1lIE5hbWUgb2YgcGFyYW1ldGVyIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ19iaXRzX25hbWUgTmFtZSBvZiB0aGUgVmtGbGFncyB0eXBlIGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gYWxsX2ZsYWdzIEEgYml0bWFzayBjb21iaW5pbmcgYWxsIHZhbGlkIGZsYWcgYml0cyBmb3IgdGhlIFZrRmxhZ3MgdHlwZSBiZWluZyB2YWxpZGF0ZWQuCisgICAgICogQHBhcmFtIGNvdW50IE51bWJlciBvZiBWa0ZsYWdzIHZhbHVlcyBpbiB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIGFycmF5IEFycmF5IG9mIFZrRmxhZ3MgdmFsdWUgdG8gdmFsaWRhdGUuCisgICAgICogQHBhcmFtIGNvdW50X3JlcXVpcmVkIFRoZSAnY291bnQnIHBhcmFtZXRlciBtYXkgbm90IGJlIDAgd2hlbiB0cnVlLgorICAgICAqIEBwYXJhbSBhcnJheV9yZXF1aXJlZCBUaGUgJ2FycmF5JyBwYXJhbWV0ZXIgbWF5IG5vdCBiZSBOVUxMIHdoZW4gdHJ1ZS4KKyAgICAgKiBAcmV0dXJuIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBjYWxsIHNob3VsZCBiZSBza2lwcGVkLgorICAgICAqLworICAgIGJvb2wgdmFsaWRhdGVfZmxhZ3NfYXJyYXkoY29uc3QgY2hhciAqYXBpX25hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmNvdW50X25hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJmFycmF5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbGFnX2JpdHNfbmFtZSwgVmtGbGFncyBhbGxfZmxhZ3MsIHVpbnQzMl90IGNvdW50LCBjb25zdCBWa0ZsYWdzICphcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY291bnRfcmVxdWlyZWQsIGJvb2wgYXJyYXlfcmVxdWlyZWQpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBza2lwX2NhbGwgPSBmYWxzZTsKKworICAgICAgICBpZiAoKGNvdW50ID09IDApIHx8IChhcnJheSA9PSBOVUxMKSkgeworICAgICAgICAgICAgc2tpcF9jYWxsIHw9IHZhbGlkYXRlX2FycmF5KGFwaV9uYW1lLCBjb3VudF9uYW1lLCBhcnJheV9uYW1lLCBjb3VudCwgJmFycmF5LCBjb3VudF9yZXF1aXJlZCwgYXJyYXlfcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURVbmRlZmluZWQsIGtWVUlEVW5kZWZpbmVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGFsbCBWa0ZsYWdzIHZhbHVlcyBpbiB0aGUgYXJyYXkKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBYTUwgcmVnaXN0cnkgbG9naWMgZm9yIHZhbGlkaXR5IGdlbmVyYXRpb24gdXNlcyB0aGUgYXJyYXkgcGFyYW1ldGVyJ3Mgb3B0aW9uYWwgdGFnIHRvIGRldGVybWluZSBpZgorICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBpbiB0aGUgYXJyYXkgYXJlIGFsbG93ZWQgYmUgMAorICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlfcmVxdWlyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfY2FsbCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfUFZFcnJvcl9SZXF1aXJlZFBhcmFtZXRlciwgIiVzOiB2YWx1ZSBvZiAlc1slZF0gbXVzdCBub3QgYmUgMCIsIGFwaV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfbmFtZS5nZXRfbmFtZSgpLmNfc3RyKCksIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYXJyYXlbaV0gJiAofmFsbF9mbGFncykpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9jYWxsIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVUlEX1BWRXJyb3JfVW5yZWNvZ25pemVkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogdmFsdWUgb2YgJXNbJWRdIGNvbnRhaW5zIGZsYWcgYml0cyB0aGF0IGFyZSBub3QgcmVjb2duaXplZCBtZW1iZXJzIG9mICVzIiwgYXBpX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X25hbWUuZ2V0X25hbWUoKS5jX3N0cigpLCBpLCBmbGFnX2JpdHNfbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBfY2FsbDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXh0ZW5zaW9uU3RhdGU+CisgICAgYm9vbCB2YWxpZGF0ZV9leHRlbnNpb25fcmVxcyhjb25zdCBFeHRlbnNpb25TdGF0ZSAmZXh0ZW5zaW9ucywgY29uc3QgY2hhciAqdnVpZCwgY29uc3QgY2hhciAqZXh0ZW5zaW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHRlbnNpb25fbmFtZSkgY29uc3QgeworICAgICAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFleHRlbnNpb25fbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHNraXA7ICAvLyBSb2J1c3QgdG8gaW52YWxpZCBjaGFyICoKKyAgICAgICAgfQorICAgICAgICBhdXRvIGluZm8gPSBFeHRlbnNpb25TdGF0ZTo6Z2V0X2luZm8oZXh0ZW5zaW9uX25hbWUpOworCisgICAgICAgIGlmICghaW5mby5zdGF0ZSkgeworICAgICAgICAgICAgcmV0dXJuIHNraXA7ICAvLyBVbmtub3duIGV4dGVuc2lvbnMgY2Fubm90IGJlIGNoZWNrZWQgc28gcmVwb3J0IE9LCisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSByZXF1aXJlZCBsaXN0IGluIHRoZSBpbmZvCisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gbWlzc2luZzsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZyZXEgOiBpbmZvLnJlcXVpcmVzKSB7CisgICAgICAgICAgICBpZiAoIShleHRlbnNpb25zLioocmVxLmVuYWJsZWQpKSkgeworICAgICAgICAgICAgICAgIG1pc3NpbmcucHVzaF9iYWNrKHJlcS5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBhbnkgbWlzc2luZyByZXF1aXJlbWVudHMKKyAgICAgICAgaWYgKG1pc3Npbmcuc2l6ZSgpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtaXNzaW5nX2pvaW5lZF9saXN0ID0gc3RyaW5nX2pvaW4oIiwgIiwgbWlzc2luZyk7CisgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVRvVWludDY0KGluc3RhbmNlKSwgdnVpZCwgIk1pc3NpbmcgZXh0ZW5zaW9uJXMgcmVxdWlyZWQgYnkgdGhlICVzIGV4dGVuc2lvbiAlczogJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1pc3Npbmcuc2l6ZSgpID4gMSkgPyAicyIgOiAiIiksIGV4dGVuc2lvbl90eXBlLCBleHRlbnNpb25fbmFtZSwgbWlzc2luZ19qb2luZWRfbGlzdC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2tpcDsKKyAgICB9CisKKyAgICBlbnVtIFJlbmRlclBhc3NDcmVhdGVWZXJzaW9uIHsgUkVOREVSX1BBU1NfVkVSU0lPTl8xID0gMCwgUkVOREVSX1BBU1NfVkVSU0lPTl8yID0gMSB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlbmRlclBhc3NDcmVhdGVJbmZvR2VuZXJpYz4KKyAgICBib29sIFZhbGlkYXRlU3VicGFzc0dyYXBoaWNzRmxhZ3MoY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBjb25zdCBSZW5kZXJQYXNzQ3JlYXRlSW5mb0dlbmVyaWMgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXBlbmRlbmN5X2luZGV4LCB1aW50MzJfdCBzdWJwYXNzLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZXMsIGNvbnN0IGNoYXIgKnZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhcmdldCkgY29uc3QgeworICAgICAgICBjb25zdCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBrQ29tbW9uU3RhZ2VzID0gVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklUOworICAgICAgICBjb25zdCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBrRnJhbWVidWZmZXJTdGFnZXMgPQorICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfRUFSTFlfRlJBR01FTlRfVEVTVFNfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCB8CisgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9MQVRFX0ZSQUdNRU5UX1RFU1RTX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVDsKKyAgICAgICAgY29uc3QgVmtQaXBlbGluZVN0YWdlRmxhZ3Mga1ByaW1pdGl2ZVNoYWRpbmdQaXBlbGluZVN0YWdlcyA9CisgICAgICAgICAgICBrQ29tbW9uU3RhZ2VzIHwgVktfUElQRUxJTkVfU1RBR0VfRFJBV19JTkRJUkVDVF9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfSU5QVVRfQklUIHwKKyAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9TSEFERVJfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCB8CisgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9TSEFERVJfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCB8CisgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZPUk1fRkVFREJBQ0tfQklUX0VYVCB8IFZLX1BJUEVMSU5FX1NUQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlYgfCBrRnJhbWVidWZmZXJTdGFnZXM7CisgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVTdGFnZUZsYWdzIGtNZXNoU2hhZGluZ1BpcGVsaW5lU3RhZ2VzID0KKyAgICAgICAgICAgIGtDb21tb25TdGFnZXMgfCBWS19QSVBFTElORV9TVEFHRV9EUkFXX0lORElSRUNUX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OViB8CisgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYgfCBWS19QSVBFTElORV9TVEFHRV9TSEFESU5HX1JBVEVfSU1BR0VfQklUX05WIHwga0ZyYW1lYnVmZmVyU3RhZ2VzOworICAgICAgICBjb25zdCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBrRnJhZ21lbnREZW5zaXR5U3RhZ2VzID0gVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfREVOU0lUWV9QUk9DRVNTX0JJVF9FWFQ7CisgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVTdGFnZUZsYWdzIGtDb25kaXRpb25hbFJlbmRlcmluZ1N0YWdlcyA9IFZLX1BJUEVMSU5FX1NUQUdFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CSVRfRVhUOworICAgICAgICBjb25zdCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBrQ29tbWFuZFByb2Nlc3NpbmdQaXBlbGluZVN0YWdlcyA9IGtDb21tb25TdGFnZXMgfCBWS19QSVBFTElORV9TVEFHRV9DT01NQU5EX1BST0NFU1NfQklUX05WWDsKKworICAgICAgICBjb25zdCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBrR3JhcGhpY3NTdGFnZXMgPSBWS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklUIHwga1ByaW1pdGl2ZVNoYWRpbmdQaXBlbGluZVN0YWdlcyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNZXNoU2hhZGluZ1BpcGVsaW5lU3RhZ2VzIHwga0ZyYWdtZW50RGVuc2l0eVN0YWdlcyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb25kaXRpb25hbFJlbmRlcmluZ1N0YWdlcyB8IGtDb21tYW5kUHJvY2Vzc2luZ1BpcGVsaW5lU3RhZ2VzOworCisgICAgICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgICAgIGNvbnN0IGF1dG8gSXNQaXBlbGluZSA9IFtwQ3JlYXRlSW5mb10odWludDMyX3Qgc3VicGFzcywgY29uc3QgVmtQaXBlbGluZUJpbmRQb2ludCBzdGFnZSkgeworICAgICAgICAgICAgaWYgKHN1YnBhc3MgPT0gVktfU1VCUEFTU19FWFRFUk5BTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NdLnBpcGVsaW5lQmluZFBvaW50ID09IHN0YWdlOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IGJvb2wgaXNfYWxsX2dyYXBoaWNzX3N0YWdlcyA9IChzdGFnZXMgJiB+a0dyYXBoaWNzU3RhZ2VzKSA9PSAwOworICAgICAgICBpZiAoSXNQaXBlbGluZShzdWJwYXNzLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTKSAmJiAhaXNfYWxsX2dyYXBoaWNzX3N0YWdlcykgeworICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRlcGVuZGVuY3kgcERlcGVuZGVuY2llc1slIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICJdIHNwZWNpZmllcyBhICVzU3RhZ2VNYXNrIHRoYXQgY29udGFpbnMgc3RhZ2VzICglcykgdGhhdCBhcmUgbm90IHBhcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSBHcmFwaGljcyBwaXBlbGluZSwgYXMgc3BlY2lmaWVkIGJ5IHRoZSAlc1N1YnBhc3MgKD0gJSIgUFJJdTMyICIpIGluIHBpcGVsaW5lQmluZFBvaW50LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5X2luZGV4LCB0YXJnZXQsIHN0cmluZ19Wa1BpcGVsaW5lU3RhZ2VGbGFncyhzdGFnZXMgJiB+a0dyYXBoaWNzU3RhZ2VzKS5jX3N0cigpLCB0YXJnZXQsIHN1YnBhc3MpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXA7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZW5kZXJQYXNzQ3JlYXRlSW5mb0dlbmVyaWM+CisgICAgYm9vbCBDcmVhdGVSZW5kZXJQYXNzR2VuZXJpYyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFJlbmRlclBhc3NDcmVhdGVJbmZvR2VuZXJpYyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyAqcFJlbmRlclBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJQYXNzQ3JlYXRlVmVyc2lvbiBycF92ZXJzaW9uKSBjb25zdCB7CisgICAgICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgICAgICB1aW50MzJfdCBtYXhfY29sb3JfYXR0YWNobWVudHMgPSBkZXZpY2VfbGltaXRzLm1heENvbG9yQXR0YWNobWVudHM7CisgICAgICAgIGJvb2wgdXNlX3JwMiA9IChycF92ZXJzaW9uID09IFJFTkRFUl9QQVNTX1ZFUlNJT05fMik7CisgICAgICAgIGNvbnN0IGNoYXIgKnZ1aWQ7CisgICAgICAgIGNvbnN0IGF1dG8gKnNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlcyA9CisgICAgICAgICAgICBsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFI+KHBoeXNpY2FsX2RldmljZV9mZWF0dXJlczIucE5leHQpOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gKmF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQgPQorICAgICAgICAgICAgICAgICh1c2VfcnAyKSA/IGx2bF9maW5kX2luX2NoYWluPFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSIGNvbnN0ICo+KCZwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldKS0+cE5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKworICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZm9ybWF0ID09IFZLX0ZPUk1BVF9VTkRFRklORUQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCAodXNlX3JwMiA/ICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIiA6ICJ2a0NyZWF0ZVJlbmRlclBhc3MiKSA8PCAiOiBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyIgPDwgaQorICAgICAgICAgICAgICAgICAgIDw8ICJdLmZvcm1hdCBpcyBWS19GT1JNQVRfVU5ERUZJTkVELiAiOworICAgICAgICAgICAgICAgIHZ1aWQgPQorICAgICAgICAgICAgICAgICAgICB1c2VfcnAyID8gIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC1wYXJhbWV0ZXIiIDogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LXBhcmFtZXRlciI7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCB8fAorICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZmluYWxMYXlvdXQtMDMwNjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1maW5hbExheW91dC0wMDg0MyI7CisgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slZF0uZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlcyB8fCAhc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzLT5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjk4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI4NCI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbJWRdLmluaXRpYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZpbmFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI5OSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyODUiOworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVkXS5maW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFGb3JtYXRJc0RlcHRoT3JTdGVuY2lsKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmluaXRpYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUikgeworICAgICAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDAiIDogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg2IjsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slZF0uaW5pdGlhbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BX0tIUkwiLAorICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZpbmFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZpbmFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAxIiA6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4NyI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbJWRdLmZpbmFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKEZvcm1hdElzRGVwdGhBbmRTdGVuY2lsKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmICh1c2VfcnAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXR0YWNobWVudF9kZXNjcmlwdGlvbl9zdGVuY2lsX2xheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbXNnKHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cE5leHQgbXVzdCBpbmNsdWRlIGFuIGluc3RhbmNlIG9mIFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZpbmFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvLT5wTmV4dCBtdXN0IGluY2x1ZGUgYW4gaW5zdGFuY2Ugb2YgVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmluaXRpYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVkXS5pbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsIFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZpbmFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slZF0uZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChGb3JtYXRJc0RlcHRoT25seShwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUikgeworICAgICAgICAgICAgICAgICAgICB2dWlkID0gdXNlX3JwMiA/ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDQiIDogIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjkwIjsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsIHZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAicENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1slZF0uaW5pdGlhbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uZmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwNSIgOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyOTEiOworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVkXS5maW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0SXNTdGVuY2lsT25seShwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5pbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSIHx8CisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbaV0uaW5pdGlhbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSKSB7CisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwNiIgOiAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyOTIiOworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzWyVkXS5pbml0aWFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50c1tpXS5maW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzW2ldLmZpbmFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgdnVpZCA9IHVzZV9ycDIgPyAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA3IiA6ICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI5MyI7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgInBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHNbJWRdLmZpbmFsTGF5b3V0IG11c3Qgbm90IGJlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFfS0hSTCIsCisgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXNlX3JwMiAmJiBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0KSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxJbml0aWFsTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9kZXNjcmlwdGlvbl9zdGVuY2lsX2xheW91dC0+c3RlbmNpbEluaXRpYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIgfHwKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9kZXNjcmlwdGlvbl9zdGVuY2lsX2xheW91dC0+c3RlbmNpbEluaXRpYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsSW5pdGlhbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIHx8CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxJbml0aWFsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCB8fAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsSW5pdGlhbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCB8fAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsSW5pdGlhbExheW91dCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEluaXRpYWxMYXlvdXQtMDMzMDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUi5zdGVuY2lsSW5pdGlhbExheW91dCBtdXN0IG5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxGaW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMIHx8CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxGaW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsRmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiB8fAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsRmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIHx8CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQtPnN0ZW5jaWxGaW5hbExheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCB8fAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsRmluYWxMYXlvdXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudF9kZXNjcmlwdGlvbl9zdGVuY2lsX2xheW91dC0+c3RlbmNpbEZpbmFsTGF5b3V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUi1zdGVuY2lsRmluYWxMYXlvdXQtMDMzMDkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUi5zdGVuY2lsRmluYWxMYXlvdXQgbXVzdCBub3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUiwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsRmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCB8fAorICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LT5zdGVuY2lsRmluYWxMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxGaW5hbExheW91dC0wMzMxMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLnN0ZW5jaWxGaW5hbExheW91dCBtdXN0IG5vdCBiZSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVELiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tpXS5jb2xvckF0dGFjaG1lbnRDb3VudCA+IG1heF9jb2xvcl9hdHRhY2htZW50cykgeworICAgICAgICAgICAgICAgIHZ1aWQgPSB1c2VfcnAyID8gIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWNvbG9yQXR0YWNobWVudENvdW50LTAzMDYzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tY29sb3JBdHRhY2htZW50Q291bnQtMDA4NDUiOworICAgICAgICAgICAgICAgIHNraXAgfD0gbG9nX21zZyhyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYSByZW5kZXIgcGFzcyB3aXRoICVkIGNvbG9yIGF0dGFjaG1lbnRzLiBNYXggaXMgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbaV0uY29sb3JBdHRhY2htZW50Q291bnQsIG1heF9jb2xvcl9hdHRhY2htZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmRlcGVuZGVuY3lDb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZkZXBlbmRlbmN5ID0gcENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXNbaV07CisKKyAgICAgICAgICAgIC8vIFNwZWMgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgR3JhcGhpY3MgcGlwZWxpbmUgaW4gcmVuZGVyIHBhc3MgLS0gc28gb25seSB0aGF0IHBpcGVsaW5lIGlzIGN1cnJlbnRseSBjaGVja2VkCisgICAgICAgICAgICB2dWlkID0KKyAgICAgICAgICAgICAgICB1c2VfcnAyID8gIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcERlcGVuZGVuY2llcy0wMzA1NCIgOiAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzciOworICAgICAgICAgICAgc2tpcCB8PSBWYWxpZGF0ZVN1YnBhc3NHcmFwaGljc0ZsYWdzKHJlcG9ydF9kYXRhLCBwQ3JlYXRlSW5mbywgaSwgZGVwZW5kZW5jeS5zcmNTdWJwYXNzLCBkZXBlbmRlbmN5LnNyY1N0YWdlTWFzaywgdnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjIik7CisKKyAgICAgICAgICAgIHZ1aWQgPQorICAgICAgICAgICAgICAgIHVzZV9ycDIgPyAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLTAzMDU1IiA6ICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcERlcGVuZGVuY2llcy0wMDgzOCI7CisgICAgICAgICAgICBza2lwIHw9IFZhbGlkYXRlU3VicGFzc0dyYXBoaWNzRmxhZ3MocmVwb3J0X2RhdGEsIHBDcmVhdGVJbmZvLCBpLCBkZXBlbmRlbmN5LmRzdFN1YnBhc3MsIGRlcGVuZGVuY3kuZHN0U3RhZ2VNYXNrLCB2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBza2lwOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgUmVjb3JkUmVuZGVyUGFzcyhWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgY29uc3QgVCAqcENyZWF0ZUluZm8pIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHJlbmRlcnBhc3NfbWFwX211dGV4KTsKKyAgICAgICAgYXV0byAmcmVuZGVycGFzc19zdGF0ZSA9IHJlbmRlcnBhc3Nlc19zdGF0ZXNbcmVuZGVyUGFzc107CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBzdWJwYXNzID0gMDsgc3VicGFzcyA8IHBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQ7ICsrc3VicGFzcykgeworICAgICAgICAgICAgYm9vbCB1c2VzX2NvbG9yID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc10uY29sb3JBdHRhY2htZW50Q291bnQgJiYgIXVzZXNfY29sb3I7ICsraSkKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc10ucENvbG9yQXR0YWNobWVudHNbaV0uYXR0YWNobWVudCAhPSBWS19BVFRBQ0hNRU5UX1VOVVNFRCkgdXNlc19jb2xvciA9IHRydWU7CisKKyAgICAgICAgICAgIGJvb2wgdXNlc19kZXB0aHN0ZW5jaWwgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzXS5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCkKKyAgICAgICAgICAgICAgICBpZiAocENyZWF0ZUluZm8tPnBTdWJwYXNzZXNbc3VicGFzc10ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtPmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpCisgICAgICAgICAgICAgICAgICAgIHVzZXNfZGVwdGhzdGVuY2lsID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHVzZXNfY29sb3IpIHJlbmRlcnBhc3Nfc3RhdGUuc3VicGFzc2VzX3VzaW5nX2NvbG9yX2F0dGFjaG1lbnQuaW5zZXJ0KHN1YnBhc3MpOworICAgICAgICAgICAgaWYgKHVzZXNfZGVwdGhzdGVuY2lsKSByZW5kZXJwYXNzX3N0YXRlLnN1YnBhc3Nlc191c2luZ19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudC5pbnNlcnQoc3VicGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIHJlcXVpcmVfZGV2aWNlX2V4dGVuc2lvbihib29sIGZsYWcsIGNoYXIgY29uc3QgKmZ1bmN0aW9uX25hbWUsIGNoYXIgY29uc3QgKmV4dGVuc2lvbl9uYW1lKSBjb25zdDsKKworICAgIGJvb2wgdmFsaWRhdGVfaW5zdGFuY2VfZXh0ZW5zaW9ucyhjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pIGNvbnN0OworCisgICAgYm9vbCB2YWxpZGF0ZV9hcGlfdmVyc2lvbih1aW50MzJfdCBhcGlfdmVyc2lvbiwgdWludDMyX3QgZWZmZWN0aXZlX2FwaV92ZXJzaW9uKSBjb25zdDsKKworICAgIGJvb2wgdmFsaWRhdGVfc3RyaW5nKGNvbnN0IGNoYXIgKmFwaU5hbWUsIGNvbnN0IFBhcmFtZXRlck5hbWUgJnN0cmluZ05hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nICZ2dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbGlkYXRlU3RyaW5nKSBjb25zdDsKKworICAgIGJvb2wgVmFsaWRhdGVDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WKGNvbnN0IFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViAqb3JkZXIpIGNvbnN0OworCisgICAgYm9vbCBWYWxpZGF0ZVF1ZXVlRmFtaWxpZXModWludDMyX3QgcXVldWVfZmFtaWx5X2NvdW50LCBjb25zdCB1aW50MzJfdCAqcXVldWVfZmFtaWxpZXMsIGNvbnN0IGNoYXIgKmNtZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFycmF5X3BhcmFtZXRlcl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyAmdW5pcXVlX2Vycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnZhbGlkX2Vycm9yX2NvZGUsIGJvb2wgb3B0aW9uYWwpOworCisgICAgYm9vbCBWYWxpZGF0ZURldmljZVF1ZXVlRmFtaWx5KHVpbnQzMl90IHF1ZXVlX2ZhbWlseSwgY29uc3QgY2hhciAqY21kX25hbWUsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZXJyb3JfY29kZSwgYm9vbCBvcHRpb25hbCk7CisKKyAgICBib29sIFZhbGlkYXRlR2VvbWV0cnlUcmlhbmdsZXNOVihjb25zdCBWa0dlb21ldHJ5VHJpYW5nbGVzTlYgJnRyaWFuZ2xlcywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2JqZWN0X2hhbmRsZSwgY29uc3QgY2hhciAqZnVuY19uYW1lKSBjb25zdDsKKyAgICBib29sIFZhbGlkYXRlR2VvbWV0cnlBQUJCTlYoY29uc3QgVmtHZW9tZXRyeUFBQkJOViAmZ2VvbWV0cnksIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLCB1aW50NjRfdCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jX25hbWUpIGNvbnN0OworICAgIGJvb2wgVmFsaWRhdGVHZW9tZXRyeU5WKGNvbnN0IFZrR2VvbWV0cnlOViAmZ2VvbWV0cnksIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLCB1aW50NjRfdCBvYmplY3RfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSkgY29uc3Q7CisgICAgYm9vbCBWYWxpZGF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVihjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViAmaW5mbywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvYmplY3RfaGFuZGxlLCBjb25zdCBjaGFyICpmdW5jX25hbSkgY29uc3Q7CisKKyAgICBib29sIE91dHB1dEV4dGVuc2lvbkVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nICZhcGlfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmV4dGVuc2lvbl9uYW1lKSBjb25zdDsKKworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MgKnBSZW5kZXJQYXNzLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVSZW5kZXJQYXNzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MgKnBSZW5kZXJQYXNzLCBWa1Jlc3VsdCByZXN1bHQpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmREZXN0cm95UmVuZGVyUGFzcyhWa0RldmljZSBkZXZpY2UsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpOworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UsIFZrUmVzdWx0IHJlc3VsdCk7CisKKyAgICB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW5zdGFuY2UgKnBJbnN0YW5jZSwgVmtSZXN1bHQgcmVzdWx0KTsKKworICAgIHZvaWQgUG9zdENhbGxSZWNvcmRRdWV1ZVByZXNlbnRLSFIoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb0tIUiAqcFByZXNlbnRJbmZvLCBWa1Jlc3VsdCByZXN1bHQpOworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUXVlcnlQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1F1ZXJ5UG9vbCAqcFF1ZXJ5UG9vbCkgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luc3RhbmNlICpwSW5zdGFuY2UpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0J1ZmZlciAqcEJ1ZmZlcikgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVJbWFnZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrSW1hZ2UgKnBJbWFnZSkgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVWaWV3cG9ydChjb25zdCBWa1ZpZXdwb3J0ICZ2aWV3cG9ydCwgY29uc3QgY2hhciAqZm5fbmFtZSwgY29uc3QgUGFyYW1ldGVyTmFtZSAmcGFyYW1ldGVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqZWN0X3R5cGUsIHVpbnQ2NF90IG9iamVjdCkgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtQaXBlbGluZSAqcFBpcGVsaW5lcykgY29uc3Q7CisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtQaXBlbGluZSAqcFBpcGVsaW5lcykgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVTYW1wbGVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU2FtcGxlciAqcFNhbXBsZXIpIGNvbnN0OworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dCAqcFNldExheW91dCkgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVVcGRhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvcldyaXRlcywgdWludDMyX3QgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0ICpwRGVzY3JpcHRvckNvcGllcykgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVGcmVlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JTZXRzKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtSZW5kZXJQYXNzICpwUmVuZGVyUGFzcykgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVSZW5kZXJQYXNzMktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyAqcFJlbmRlclBhc3MpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlRnJlZUNvbW1hbmRCdWZmZXJzKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgdWludDMyX3QgY29tbWFuZEJ1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAqcEJlZ2luSW5mbykgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRTZXRWaWV3cG9ydChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1ZpZXdwb3J0ICpwVmlld3BvcnRzKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZFNldFNjaXNzb3IoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0U2Npc3NvciwgdWludDMyX3Qgc2Npc3NvckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZWN0MkQgKnBTY2lzc29ycykgY29uc3Q7CisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0TGluZVdpZHRoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBsaW5lV2lkdGgpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRHJhdyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdmVydGV4Q291bnQsIHVpbnQzMl90IGluc3RhbmNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdFZlcnRleCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSkgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWREcmF3SW5kZXhlZEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZENsZWFyQXR0YWNobWVudHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGF0dGFjaG1lbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50ICpwQXR0YWNobWVudHMsIHVpbnQzMl90IHJlY3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ2xlYXJSZWN0ICpwUmVjdHMpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kQ29weUltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUNvcHkgKnBSZWdpb25zKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZEJsaXRJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VCbGl0ICpwUmVnaW9ucywgVmtGaWx0ZXIgZmlsdGVyKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZENvcHlCdWZmZXJUb0ltYWdlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBzcmNCdWZmZXIsIFZrSW1hZ2UgZHN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkgKnBSZWdpb25zKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZENvcHlJbWFnZVRvQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIGRzdEJ1ZmZlciwgdWludDMyX3QgcmVnaW9uQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkgKnBSZWdpb25zKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZFVwZGF0ZUJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgZGF0YVNpemUsIGNvbnN0IHZvaWQgKnBEYXRhKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZEZpbGxCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBkYXRhKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIgKnBTd2FwY2hhaW4pIGNvbnN0OworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZVF1ZXVlUHJlc2VudEtIUihWa1F1ZXVlIHF1ZXVlLCBjb25zdCBWa1ByZXNlbnRJbmZvS0hSICpwUHJlc2VudEluZm8pIGNvbnN0OworCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZVdpbjMyU3VyZmFjZUtIUihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3VyZmFjZUtIUiAqcFN1cmZhY2UpIGNvbnN0OworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yUG9vbCAqcERlc2NyaXB0b3JQb29sKSBjb25zdDsKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZ3JvdXBDb3VudFgsIHVpbnQzMl90IGdyb3VwQ291bnRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdyb3VwQ291bnRaKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERpc3BhdGNoSW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCkgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWREaXNwYXRjaEJhc2VLSFIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGJhc2VHcm91cFgsIHVpbnQzMl90IGJhc2VHcm91cFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhc2VHcm91cFosIHVpbnQzMl90IGdyb3VwQ291bnRYLCB1aW50MzJfdCBncm91cENvdW50WSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ3JvdXBDb3VudFopIGNvbnN0OworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RFeGNsdXNpdmVTY2lzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleGNsdXNpdmVTY2lzc29yQ291bnQsIGNvbnN0IFZrUmVjdDJEICpwRXhjbHVzaXZlU2Npc3NvcnMpIGNvbnN0OworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0Vmlld3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2aWV3cG9ydENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViAqcFNoYWRpbmdSYXRlUGFsZXR0ZXMpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtDb2Fyc2VTYW1wbGVPcmRlclR5cGVOViBzYW1wbGVPcmRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXN0b21TYW1wbGVPcmRlckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WICpwQ3VzdG9tU2FtcGxlT3JkZXJzKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NOVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgdGFza0NvdW50LCB1aW50MzJfdCBmaXJzdFRhc2spIGNvbnN0OworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHJhd0NvdW50LCB1aW50MzJfdCBzdHJpZGUpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXIgY291bnRCdWZmZXIsIFZrRGV2aWNlU2l6ZSBjb3VudEJ1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heERyYXdDb3VudCwgdWludDMyX3Qgc3RyaWRlKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgY2hhciAqcExheWVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIGNvbnN0OworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUFsbG9jYXRlTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8gKnBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RldmljZU1lbW9yeSAqcE1lbW9yeSkgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WICpwQWNjZWxlcmF0aW9uU3RydWN0dXJlKSBjb25zdDsKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgKnBJbmZvLCBWa0J1ZmZlciBpbnN0YW5jZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgaW5zdGFuY2VPZmZzZXQsIFZrQm9vbDMyIHVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgZHN0LCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyIHNjcmF0Y2gsIFZrRGV2aWNlU2l6ZSBzY3JhdGNoT2Zmc2V0KSBjb25zdDsKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVihWa0RldmljZSBkZXZpY2UsIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYWNjZWxlcmF0aW9uU3RydWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhU2l6ZSwgdm9pZCAqcERhdGEpIGNvbnN0OworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WICpwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtQaXBlbGluZSAqcFBpcGVsaW5lcykgY29uc3Q7CisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBmaXJzdFZpZXdwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2aWV3cG9ydENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1ZpZXdwb3J0V1NjYWxpbmdOViAqcFZpZXdwb3J0V1NjYWxpbmdzKSBjb25zdDsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIKKyAgICBib29sIFByZUNhbGxWYWxpZGF0ZUdldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlU3VyZmFjZUluZm8yS0hSICpwU3VyZmFjZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlR3JvdXBQcmVzZW50TW9kZUZsYWdzS0hSICpwTW9kZXMpIGNvbnN0OworI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDcmVhdGVGcmFtZWJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrRnJhbWVidWZmZXIgKnBGcmFtZWJ1ZmZlcikgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVDbWRTZXRMaW5lU3RpcHBsZUVYVChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgbGluZVN0aXBwbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGluZVN0aXBwbGVQYXR0ZXJuKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZUNtZEJpbmRJbmRleEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luZGV4VHlwZSBpbmRleFR5cGUpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCAqcE5hbWVJbmZvKSBjb25zdDsKKworICAgIGJvb2wgbWFudWFsX1ByZUNhbGxWYWxpZGF0ZVNldERlYnVnVXRpbHNPYmplY3RUYWdFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0RlYnVnVXRpbHNPYmplY3RUYWdJbmZvRVhUICpwVGFnSW5mbykgY29uc3Q7CisKKyAgICBib29sIG1hbnVhbF9QcmVDYWxsVmFsaWRhdGVBY3F1aXJlTmV4dEltYWdlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCB1aW50NjRfdCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlLCBWa0ZlbmNlIGZlbmNlLCB1aW50MzJfdCAqcEltYWdlSW5kZXgpIGNvbnN0OworCisgICAgYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQWNxdWlyZU5leHRJbWFnZTJLSFIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSICpwQWNxdWlyZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBJbWFnZUluZGV4KSBjb25zdDsKKworI2luY2x1ZGUgInBhcmFtZXRlcl92YWxpZGF0aW9uLmgiCit9OyAgLy8gQ2xhc3MgU3RhdGVsZXNzVmFsaWRhdGlvbgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2Zvcm1hdF91dGlscy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfZm9ybWF0X3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTkwMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2Zvcm1hdF91dGlscy5jcHAKQEAgLTAsMCArMSwxMzcyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKyNpbmNsdWRlICJ2a19mb3JtYXRfdXRpbHMuaCIKKworc3RydWN0IFZVTEtBTl9GT1JNQVRfSU5GTyB7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBjaGFubmVsX2NvdW50OworICAgIFZrRm9ybWF0Q29tcGF0aWJpbGl0eUNsYXNzIGZvcm1hdF9jbGFzczsKK307CisKKy8vIERpc2FibGUgYXV0by1mb3JtYXR0aW5nIGZvciB0aGlzIGxhcmdlIHRhYmxlCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFNldCB1cCBkYXRhIHN0cnVjdHVyZSB3aXRoIHNpemUoYnl0ZXMpIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIGVhY2ggVnVsa2FuIGZvcm1hdAorLy8gRm9yIGNvbXByZXNzZWQgYW5kIG11bHRpLXBsYW5lIGZvcm1hdHMsIHNpemUgaXMgYnl0ZXMgcGVyIGNvbXByZXNzZWQgb3Igc2hhcmVkIGJsb2NrCitjb25zdCBzdGQ6Om1hcDxWa0Zvcm1hdCwgVlVMS0FOX0ZPUk1BVF9JTkZPPiB2a19mb3JtYXRfdGFibGUgPSB7CisgICAge1ZLX0ZPUk1BVF9VTkRFRklORUQsICAgICAgICAgICAgICAgICAgIHswLCAwLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19OT05FX0JJVCB9fSwKKyAgICB7VktfRk9STUFUX1I0RzRfVU5PUk1fUEFDSzgsICAgICAgICAgICAgezEsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SNEc0QjRBNF9VTk9STV9QQUNLMTYsICAgICAgIHsyLCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0I0RzRSNEE0X1VOT1JNX1BBQ0sxNiwgICAgICAgezIsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjVHNkI1X1VOT1JNX1BBQ0sxNiwgICAgICAgICB7MiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9CNUc2UjVfVU5PUk1fUEFDSzE2LCAgICAgICAgIHsyLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I1RzVCNUExX1VOT1JNX1BBQ0sxNiwgICAgICAgezIsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2X0JJVH19LAorICAgIHtWS19GT1JNQVRfQjVHNVI1QTFfVU5PUk1fUEFDSzE2LCAgICAgICB7MiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BMVI1RzVCNV9VTk9STV9QQUNLMTYsICAgICAgIHsyLCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4X1VOT1JNLCAgICAgICAgICAgICAgICAgICAgezEsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOF9TTk9STSwgICAgICAgICAgICAgICAgICAgIHsxLCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjhfVVNDQUxFRCwgICAgICAgICAgICAgICAgICB7MSwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfOF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4X1NTQ0FMRUQsICAgICAgICAgICAgICAgICAgezEsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOF9VSU5ULCAgICAgICAgICAgICAgICAgICAgIHsxLCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjhfU0lOVCwgICAgICAgICAgICAgICAgICAgICB7MSwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfOF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4X1NSR0IsICAgICAgICAgICAgICAgICAgICAgezEsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOEc4X1VOT1JNLCAgICAgICAgICAgICAgICAgIHsyLCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4RzhfU05PUk0sICAgICAgICAgICAgICAgICAgezIsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjhHOF9VU0NBTEVELCAgICAgICAgICAgICAgICB7MiwgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOEc4X1NTQ0FMRUQsICAgICAgICAgICAgICAgIHsyLCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4RzhfVUlOVCwgICAgICAgICAgICAgICAgICAgezIsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjhHOF9TSU5ULCAgICAgICAgICAgICAgICAgICB7MiwgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOEc4X1NSR0IsICAgICAgICAgICAgICAgICAgIHsyLCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4RzhCOF9VTk9STSwgICAgICAgICAgICAgICAgezMsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzI0X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjhHOEI4X1NOT1JNLCAgICAgICAgICAgICAgICB7MywgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOEc4QjhfVVNDQUxFRCwgICAgICAgICAgICAgIHszLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18yNF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4RzhCOF9TU0NBTEVELCAgICAgICAgICAgICAgezMsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzI0X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjhHOEI4X1VJTlQsICAgICAgICAgICAgICAgICB7MywgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOEc4QjhfU0lOVCwgICAgICAgICAgICAgICAgIHszLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18yNF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4RzhCOF9TUkdCLCAgICAgICAgICAgICAgICAgezMsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzI0X0JJVH19LAorICAgIHtWS19GT1JNQVRfQjhHOFI4X1VOT1JNLCAgICAgICAgICAgICAgICB7MywgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9COEc4UjhfU05PUk0sICAgICAgICAgICAgICAgIHszLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18yNF9CSVR9fSwKKyAgICB7VktfRk9STUFUX0I4RzhSOF9VU0NBTEVELCAgICAgICAgICAgICAgezMsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzI0X0JJVH19LAorICAgIHtWS19GT1JNQVRfQjhHOFI4X1NTQ0FMRUQsICAgICAgICAgICAgICB7MywgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9COEc4UjhfVUlOVCwgICAgICAgICAgICAgICAgIHszLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18yNF9CSVR9fSwKKyAgICB7VktfRk9STUFUX0I4RzhSOF9TSU5ULCAgICAgICAgICAgICAgICAgezMsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzI0X0JJVH19LAorICAgIHtWS19GT1JNQVRfQjhHOFI4X1NSR0IsICAgICAgICAgICAgICAgICB7MywgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgICAgICAgICAgICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4RzhCOEE4X1NOT1JNLCAgICAgICAgICAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfUjhHOEI4QThfVVNDQUxFRCwgICAgICAgICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOEc4QjhBOF9TU0NBTEVELCAgICAgICAgICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I4RzhCOEE4X1VJTlQsICAgICAgICAgICAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfUjhHOEI4QThfU0lOVCwgICAgICAgICAgICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SOEc4QjhBOF9TUkdCLCAgICAgICAgICAgICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCAgICAgICAgICAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQjhHOFI4QThfU05PUk0sICAgICAgICAgICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9COEc4UjhBOF9VU0NBTEVELCAgICAgICAgICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0I4RzhSOEE4X1NTQ0FMRUQsICAgICAgICAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQjhHOFI4QThfVUlOVCwgICAgICAgICAgICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9COEc4UjhBOF9TSU5ULCAgICAgICAgICAgICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0I4RzhSOEE4X1NSR0IsICAgICAgICAgICAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQThCOEc4UjhfVU5PUk1fUEFDSzMyLCAgICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BOEI4RzhSOF9TTk9STV9QQUNLMzIsICAgICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyLCAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQThCOEc4UjhfU1NDQUxFRF9QQUNLMzIsICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BOEI4RzhSOF9VSU5UX1BBQ0szMiwgICAgICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyLCAgICAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQThCOEc4UjhfU1JHQl9QQUNLMzIsICAgICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VTk9STV9QQUNLMzIsICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0EyUjEwRzEwQjEwX1NOT1JNX1BBQ0szMiwgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQTJSMTBHMTBCMTBfVVNDQUxFRF9QQUNLMzIsICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TU0NBTEVEX1BBQ0szMiwgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0EyUjEwRzEwQjEwX1VJTlRfUEFDSzMyLCAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQTJSMTBHMTBCMTBfU0lOVF9QQUNLMzIsICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VTk9STV9QQUNLMzIsICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMiwgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQTJCMTBHMTBSMTBfVVNDQUxFRF9QQUNLMzIsICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TU0NBTEVEX1BBQ0szMiwgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0EyQjEwRzEwUjEwX1VJTlRfUEFDSzMyLCAgICAgezQsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQTJCMTBHMTBSMTBfU0lOVF9QQUNLMzIsICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZfVU5PUk0sICAgICAgICAgICAgICAgICAgIHsyLCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNl9TTk9STSwgICAgICAgICAgICAgICAgICAgezIsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2X1VTQ0FMRUQsICAgICAgICAgICAgICAgICB7MiwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZfU1NDQUxFRCwgICAgICAgICAgICAgICAgIHsyLCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNl9VSU5ULCAgICAgICAgICAgICAgICAgICAgezIsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2X1NJTlQsICAgICAgICAgICAgICAgICAgICB7MiwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZfU0ZMT0FULCAgICAgICAgICAgICAgICAgIHsyLCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNkcxNl9VTk9STSwgICAgICAgICAgICAgICAgezQsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2RzE2X1NOT1JNLCAgICAgICAgICAgICAgICB7NCwgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZHMTZfVVNDQUxFRCwgICAgICAgICAgICAgIHs0LCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNkcxNl9TU0NBTEVELCAgICAgICAgICAgICAgezQsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2RzE2X1VJTlQsICAgICAgICAgICAgICAgICB7NCwgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZHMTZfU0lOVCwgICAgICAgICAgICAgICAgIHs0LCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNkcxNl9TRkxPQVQsICAgICAgICAgICAgICAgezQsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2RzE2QjE2X1VOT1JNLCAgICAgICAgICAgICB7NiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNDhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZHMTZCMTZfU05PUk0sICAgICAgICAgICAgIHs2LCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU180OF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNkcxNkIxNl9VU0NBTEVELCAgICAgICAgICAgezYsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzQ4X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2RzE2QjE2X1NTQ0FMRUQsICAgICAgICAgICB7NiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNDhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZHMTZCMTZfVUlOVCwgICAgICAgICAgICAgIHs2LCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU180OF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNkcxNkIxNl9TSU5ULCAgICAgICAgICAgICAgezYsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzQ4X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2RzE2QjE2X1NGTE9BVCwgICAgICAgICAgICB7NiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNDhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk0sICAgICAgICAgIHs4LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNkcxNkIxNkExNl9TTk9STSwgICAgICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRUQsICAgICAgICB7OCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU1NDQUxFRCwgICAgICAgIHs4LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5ULCAgICAgICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NJTlQsICAgICAgICAgICB7OCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FULCAgICAgICAgIHs4LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IzMl9VSU5ULCAgICAgICAgICAgICAgICAgICAgezQsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfUjMyX1NJTlQsICAgICAgICAgICAgICAgICAgICB7NCwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMzJfU0ZMT0FULCAgICAgICAgICAgICAgICAgIHs0LCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IzMkczMl9VSU5ULCAgICAgICAgICAgICAgICAgezgsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjMyRzMyX1NJTlQsICAgICAgICAgICAgICAgICB7OCwgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMzJHMzJfU0ZMT0FULCAgICAgICAgICAgICAgIHs4LCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IzMkczMkIzMl9VSU5ULCAgICAgICAgICAgICAgezEyLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU185Nl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IzMkczMkIzMl9TSU5ULCAgICAgICAgICAgICAgezEyLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU185Nl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IzMkczMkIzMl9TRkxPQVQsICAgICAgICAgICAgezEyLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU185Nl9CSVR9fSwKKyAgICB7VktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5ULCAgICAgICAgICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMjhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVCwgICAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTI4X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVCwgICAgICAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEyOF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I2NF9VSU5ULCAgICAgICAgICAgICAgICAgICAgezgsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjY0X1NJTlQsICAgICAgICAgICAgICAgICAgICB7OCwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNjRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SNjRfU0ZMT0FULCAgICAgICAgICAgICAgICAgIHs4LCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I2NEc2NF9VSU5ULCAgICAgICAgICAgICAgICAgezE2LCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMjhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SNjRHNjRfU0lOVCwgICAgICAgICAgICAgICAgIHsxNiwgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTI4X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjY0RzY0X1NGTE9BVCwgICAgICAgICAgICAgICB7MTYsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEyOF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I2NEc2NEI2NF9VSU5ULCAgICAgICAgICAgICAgezI0LCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xOTJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SNjRHNjRCNjRfU0lOVCwgICAgICAgICAgICAgIHsyNCwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTkyX0JJVH19LAorICAgIHtWS19GT1JNQVRfUjY0RzY0QjY0X1NGTE9BVCwgICAgICAgICAgICB7MjQsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE5Ml9CSVR9fSwKKyAgICB7VktfRk9STUFUX1I2NEc2NEI2NEE2NF9VSU5ULCAgICAgICAgICAgezMyLCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18yNTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0lOVCwgICAgICAgICAgIHszMiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMjU2X0JJVH19LAorICAgIHtWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVCwgICAgICAgICB7MzIsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzI1Nl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0IxMEcxMVIxMV9VRkxPQVRfUEFDSzMyLCAgICAgezQsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyX0JJVH19LAorICAgIHtWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMiwgICAgICB7NCwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9EMTZfVU5PUk0sICAgICAgICAgICAgICAgICAgIHsyLCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19OT05FX0JJVH19LAorICAgIHtWS19GT1JNQVRfWDhfRDI0X1VOT1JNX1BBQ0szMiwgICAgICAgICB7NCwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfTk9ORV9CSVR9fSwKKyAgICB7VktfRk9STUFUX0QzMl9TRkxPQVQsICAgICAgICAgICAgICAgICAgezQsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX05PTkVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9TOF9VSU5ULCAgICAgICAgICAgICAgICAgICAgIHsxLCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19OT05FX0JJVH19LAorICAgIHtWS19GT1JNQVRfRDE2X1VOT1JNX1M4X1VJTlQsICAgICAgICAgICB7MywgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfTk9ORV9CSVR9fSwKKyAgICB7VktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5ULCAgICAgICAgICAgezQsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX05PTkVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQsICAgICAgICAgIHs4LCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19OT05FX0JJVH19LAorICAgIHtWS19GT1JNQVRfQkMxX1JHQl9VTk9STV9CTE9DSywgICAgICAgICB7OCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkMxX1JHQl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0JDMV9SR0JfU1JHQl9CTE9DSywgICAgICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDMV9SR0JfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9CQzFfUkdCQV9VTk9STV9CTE9DSywgICAgICAgIHs4LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19CQzFfUkdCQV9CSVR9fSwKKyAgICB7VktfRk9STUFUX0JDMV9SR0JBX1NSR0JfQkxPQ0ssICAgICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDMV9SR0JBX0JJVH19LAorICAgIHtWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLLCAgICAgICAgICAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDMl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0JDMl9TUkdCX0JMT0NLLCAgICAgICAgICAgICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19CQzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9CQzNfVU5PUk1fQkxPQ0ssICAgICAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkMzX0JJVH19LAorICAgIHtWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0ssICAgICAgICAgICAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDM19CSVR9fSwKKyAgICB7VktfRk9STUFUX0JDNF9VTk9STV9CTE9DSywgICAgICAgICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDNF9CSVR9fSwKKyAgICB7VktfRk9STUFUX0JDNF9TTk9STV9CTE9DSywgICAgICAgICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDNF9CSVR9fSwKKyAgICB7VktfRk9STUFUX0JDNV9VTk9STV9CTE9DSywgICAgICAgICAgICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19CQzVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0ssICAgICAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkM1X0JJVH19LAorICAgIHtWS19GT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0ssICAgICAgICAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDNkhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9CQzZIX1NGTE9BVF9CTE9DSywgICAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkM2SF9CSVR9fSwKKyAgICB7VktfRk9STUFUX0JDN19VTk9STV9CTE9DSywgICAgICAgICAgICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19CQzdfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9CQzdfU1JHQl9CTE9DSywgICAgICAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkM3X0JJVH19LAorICAgIHtWS19GT1JNQVRfRVRDMl9SOEc4QjhfVU5PUk1fQkxPQ0ssICAgICB7OCwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfRVRDMl9SR0JfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9TUkdCX0JMT0NLLCAgICAgIHs4LCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FVEMyX1JHQl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0ssICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VUQzJfUkdCQV9CSVR9fSwKKyAgICB7VktfRk9STUFUX0VUQzJfUjhHOEI4QTFfU1JHQl9CTE9DSywgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VUQzJfUkdCQV9CSVR9fSwKKyAgICB7VktfRk9STUFUX0VUQzJfUjhHOEI4QThfVU5PUk1fQkxPQ0ssICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FVEMyX0VBQ19SR0JBX0JJVH19LAorICAgIHtWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9TUkdCX0JMT0NLLCAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VUQzJfRUFDX1JHQkFfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9FQUNfUjExX1VOT1JNX0JMT0NLLCAgICAgICAgIHs4LCAxLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FQUNfUl9CSVR9fSwKKyAgICB7VktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0ssICAgICAgICAgezgsIDEsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VBQ19SX0JJVH19LAorICAgIHtWS19GT1JNQVRfRUFDX1IxMUcxMV9VTk9STV9CTE9DSywgICAgICB7MTYsIDIsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0VBQ19SR19CSVR9fSwKKyAgICB7VktfRk9STUFUX0VBQ19SMTFHMTFfU05PUk1fQkxPQ0ssICAgICAgezE2LCAyLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FQUNfUkdfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzR4NF9VTk9STV9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ180WDRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzR4NF9TUkdCX0JMT0NLLCAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ180WDRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzV4NF9VTk9STV9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ181WDRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzV4NF9TUkdCX0JMT0NLLCAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ181WDRfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzV4NV9VTk9STV9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ181WDVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzV4NV9TUkdCX0JMT0NLLCAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ181WDVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzZ4NV9VTk9STV9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ182WDVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzZ4NV9TUkdCX0JMT0NLLCAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ182WDVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzZ4Nl9VTk9STV9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ182WDZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzZ4Nl9TUkdCX0JMT0NLLCAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ182WDZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzh4NV9VTk9STV9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzh4NV9TUkdCX0JMT0NLLCAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDVfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzh4Nl9VTk9STV9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzh4Nl9TUkdCX0JMT0NLLCAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzh4OF9VTk9STV9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzh4OF9TUkdCX0JMT0NLLCAgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzEweDVfVU5PUk1fQkxPQ0ssICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ18xMFg1X0JJVH19LAorICAgIHtWS19GT1JNQVRfQVNUQ18xMHg1X1NSR0JfQkxPQ0ssICAgICAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0FTVENfMTBYNV9CSVR9fSwKKyAgICB7VktfRk9STUFUX0FTVENfMTB4Nl9VTk9STV9CTE9DSywgICAgICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzEwWDZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzEweDZfU1JHQl9CTE9DSywgICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ18xMFg2X0JJVH19LAorICAgIHtWS19GT1JNQVRfQVNUQ18xMHg4X1VOT1JNX0JMT0NLLCAgICAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0FTVENfMTBYOF9CSVR9fSwKKyAgICB7VktfRk9STUFUX0FTVENfMTB4OF9TUkdCX0JMT0NLLCAgICAgICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzEwWDhfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzEweDEwX1VOT1JNX0JMT0NLLCAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ18xMFgxMF9CSVR9fSwKKyAgICB7VktfRk9STUFUX0FTVENfMTB4MTBfU1JHQl9CTE9DSywgICAgICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzEwWDEwX0JJVH19LAorICAgIHtWS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DSywgICAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0FTVENfMTJYMTBfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0ssICAgICAgIHsxNiwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ18xMlgxMF9CSVR9fSwKKyAgICB7VktfRk9STUFUX0FTVENfMTJ4MTJfVU5PUk1fQkxPQ0ssICAgICAgezE2LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzEyWDEyX0JJVH19LAorICAgIHtWS19GT1JNQVRfQVNUQ18xMngxMl9TUkdCX0JMT0NLLCAgICAgICB7MTYsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0FTVENfMTJYMTJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9QVlJUQzFfMkJQUF9VTk9STV9CTE9DS19JTUcsIHs4LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19QVlJUQzFfMkJQUF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1BWUlRDMV80QlBQX1VOT1JNX0JMT0NLX0lNRywgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX1BWUlRDMV80QlBQX0JJVH19LAorICAgIHtWS19GT1JNQVRfUFZSVEMyXzJCUFBfVU5PUk1fQkxPQ0tfSU1HLCB7OCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfUFZSVEMyXzJCUFBfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9QVlJUQzJfNEJQUF9VTk9STV9CTE9DS19JTUcsIHs4LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19QVlJUQzJfNEJQUF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1BWUlRDMV8yQlBQX1NSR0JfQkxPQ0tfSU1HLCAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX1BWUlRDMV8yQlBQX0JJVH19LAorICAgIHtWS19GT1JNQVRfUFZSVEMxXzRCUFBfU1JHQl9CTE9DS19JTUcsICB7OCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfUFZSVEMxXzRCUFBfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9TUkdCX0JMT0NLX0lNRywgIHs4LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19QVlJUQzJfMkJQUF9CSVR9fSwKKyAgICB7VktfRk9STUFUX1BWUlRDMl80QlBQX1NSR0JfQkxPQ0tfSU1HLCAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX1BWUlRDMl80QlBQX0JJVH19LAorICAgIC8vIEtIUl9zYW1wbGVyX1lDYkNyX2NvbnZlcnNpb24gZXh0ZW5zaW9uIC0gc2luZ2xlLXBsYW5lIHZhcmlhbnRzCisgICAgLy8gJ1BBQ0snIGZvcm1hdHMgYXJlIG5vcm1hbCwgdW5jb21wcmVzc2VkCisgICAge1ZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTYsICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTBYNkcxMFg2X1VOT1JNXzJQQUNLMTYsICAgICAgICAgICAgICAgICAgICB7NCwgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2LCAgICAgICAgICB7OCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNjRCSVRfUjEwRzEwQjEwQTEwfX0sCisgICAge1ZLX0ZPUk1BVF9SMTJYNF9VTk9STV9QQUNLMTYsICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgMSwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTYsICAgICAgICAgICAgICAgICAgICB7NCwgMiwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZfQklUfX0sCisgICAge1ZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2LCAgICAgICAgICB7OCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNjRCSVRfUjEyRzEyQjEyQTEyfX0sCisgICAgLy8gXzQyMiBmb3JtYXRzIGVuY29kZSAyIHRleGVscyBwZXIgZW50cnkgd2l0aCBCLCBSIGNvbXBvbmVudHMgc2hhcmVkIC0gdHJlYXRlZCBhcyBjb21wcmVzc2VkIHcvIDJ4MSBibG9jayBzaXplCisgICAge1ZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk0sICAgICAgICAgICAgICAgICAgICAgICAgICB7NCwgNCwgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJCSVRfRzhCOEc4Ujh9fSwKKyAgICB7VktfRk9STUFUX0I4RzhSOEc4XzQyMl9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LCA0LCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMkJJVF9COEc4UjhHOH19LAorICAgIHtWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTYsICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0cxMEIxMEcxMFIxMH19LAorICAgIHtWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTYsICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0IxMEcxMFIxMEcxMH19LAorICAgIHtWS19GT1JNQVRfRzEyWDRCMTJYNEcxMlg0UjEyWDRfNDIyX1VOT1JNXzRQQUNLMTYsICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0cxMkIxMkcxMlIxMn19LAorICAgIHtWS19GT1JNQVRfQjEyWDRHMTJYNFIxMlg0RzEyWDRfNDIyX1VOT1JNXzRQQUNLMTYsICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0IxMkcxMlIxMkcxMn19LAorICAgIHtWS19GT1JNQVRfRzE2QjE2RzE2UjE2XzQyMl9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0cxNkIxNkcxNlIxNn19LAorICAgIHtWS19GT1JNQVRfQjE2RzE2UjE2RzE2XzQyMl9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgezgsIDQsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzY0QklUX0IxNkcxNlIxNkcxNn19LAorICAgIC8vIEtIUl9zYW1wbGVyX1lDYkNyX2NvbnZlcnNpb24gZXh0ZW5zaW9uIC0gbXVsdGktcGxhbmUgdmFyaWFudHMKKyAgICAvLyBGb3JtYXRzIHRoYXQgJ3NoYXJlJyBjb21wb25lbnRzIGFtb25nIHRleGVscyAoXzQyMCBhbmQgXzQyMiksIHNpemUgcmVwcmVzZW50cyB0b3RhbCBieXRlcyBmb3IgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHRleGVsIGJsb2NrCisgICAgLy8gXzQyMCBzaGFyZSBCLCBSIGNvbXBvbmVudHMgd2l0aGluIGEgMngyIHRleGVsIGJsb2NrCisgICAge1ZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNLCAgICAgICAgICAgICAgICAgICB7NiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfOEJJVF8zUExBTkVfNDIwfX0sCisgICAge1ZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk0sICAgICAgICAgICAgICAgICAgICB7NiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfOEJJVF8yUExBTkVfNDIwfX0sCisgICAge1ZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYsICB7MTIsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEwQklUXzNQTEFORV80MjB9fSwKKyAgICB7VktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2LCAgIHsxMiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTBCSVRfMlBMQU5FXzQyMH19LAorICAgIHtWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2LCAgezEyLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMkJJVF8zUExBTkVfNDIwfX0sCisgICAge1ZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNiwgICB7MTIsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEyQklUXzJQTEFORV80MjB9fSwKKyAgICB7VktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk0sICAgICAgICAgICAgICAgIHsxMiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZCSVRfM1BMQU5FXzQyMH19LAorICAgIHtWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIwX1VOT1JNLCAgICAgICAgICAgICAgICAgezEyLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNkJJVF8yUExBTkVfNDIwfX0sCisgICAgLy8gXzQyMiBzaGFyZSBCLCBSIGNvbXBvbmVudHMgd2l0aGluIGEgMngxIHRleGVsIGJsb2NrCisgICAge1ZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNLCAgICAgICAgICAgICAgICAgICB7NCwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfOEJJVF8zUExBTkVfNDIyfX0sCisgICAge1ZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjJfVU5PUk0sICAgICAgICAgICAgICAgICAgICB7NCwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfOEJJVF8yUExBTkVfNDIyfX0sCisgICAge1ZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsICB7OCwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTBCSVRfM1BMQU5FXzQyMn19LAorICAgIHtWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsICAgezgsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEwQklUXzJQTEFORV80MjJ9fSwKKyAgICB7VktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiwgIHs4LCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMkJJVF8zUExBTkVfNDIyfX0sCisgICAge1ZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNiwgICB7OCwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTJCSVRfMlBMQU5FXzQyMn19LAorICAgIHtWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STSwgICAgICAgICAgICAgICAgezgsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2QklUXzNQTEFORV80MjJ9fSwKKyAgICB7VktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STSwgICAgICAgICAgICAgICAgIHs4LCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNkJJVF8yUExBTkVfNDIyfX0sCisgICAgLy8gXzQ0NCBkbyBub3Qgc2hhcmUKKyAgICB7VktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80NDRfVU5PUk0sICAgICAgICAgICAgICAgICAgIHszLCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184QklUXzNQTEFORV80NDR9fSwKKyAgICB7VktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNiwgIHs2LCAzLCBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMEJJVF8zUExBTkVfNDQ0fX0sCisgICAge1ZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTYsICB7NiwgMywgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTJCSVRfM1BMQU5FXzQ0NH19LAorICAgIHtWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STSwgICAgICAgICAgICAgICAgezYsIDMsIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2QklUXzNQTEFORV80NDR9fQorfTsKKworLy8gUmVuYWJsZSBmb3JtYXR0aW5nCisvLyBjbGFuZy1mb3JtYXQgb24KKworLy8gUmV0dXJuIHRydWUgaWYgZm9ybWF0IGlzIGFuIEVUQzIgb3IgRUFDIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzQ29tcHJlc3NlZF9FVEMyX0VBQyhWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBMV9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBMV9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFHMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFHMTFfU05PUk1fQkxPQ0s6CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZm91bmQ7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBhbiBBU1RDIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzQ29tcHJlc3NlZF9BU1RDX0xEUihWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzR4NF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDRfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNXg0X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNXg1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NV9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzZ4NV9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDZfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng2X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4NV9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4Nl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDhfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg4X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg1X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4Nl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg2X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4OF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg4X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4MTBfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4MTBfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMngxMF9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1NSR0JfQkxPQ0s6CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZm91bmQ7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBhIEJDIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzQ29tcHJlc3NlZF9CQyhWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCX1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCX1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JBX1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCQV9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzJfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMl9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzNfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDM19TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzRfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDNF9TTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkM1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDNkhfVUZMT0FUX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzZIX1NGTE9BVF9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkM3X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzdfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBmb3VuZDsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgZm9ybWF0IGlzIGEgUFZSVEMgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdAorVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNDb21wcmVzc2VkX1BWUlRDKFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1BWUlRDMV8yQlBQX1VOT1JNX0JMT0NLX0lNRzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUFZSVEMxXzRCUFBfVU5PUk1fQkxPQ0tfSU1HOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9VTk9STV9CTE9DS19JTUc6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1BWUlRDMl80QlBQX1VOT1JNX0JMT0NLX0lNRzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUFZSVEMxXzJCUFBfU1JHQl9CTE9DS19JTUc6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1BWUlRDMV80QlBQX1NSR0JfQkxPQ0tfSU1HOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9TUkdCX0JMT0NLX0lNRzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUFZSVEMyXzRCUFBfU1JHQl9CTE9DS19JTUc6CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZm91bmQ7Cit9CisKKy8vIFNpbmdsZS1wbGFuZSAiXzQyMiIgZm9ybWF0cyBhcmUgdHJlYXRlZCBhcyAyeDEgY29tcHJlc3NlZCAoZm9yIGNvcGllcykKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzU2luZ2xlUGxhbmVfNDIyKFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STV9LSFI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOEc4XzQyMl9VTk9STV9LSFI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMFg2QjEwWDZHMTBYNlIxMFg2XzQyMl9VTk9STV80UEFDSzE2X0tIUjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTZfS0hSOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNEIxMlg0RzEyWDRSMTJYNF80MjJfVU5PUk1fNFBBQ0sxNl9LSFI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0IxMlg0RzEyWDRSMTJYNEcxMlg0XzQyMl9VTk9STV80UEFDSzE2X0tIUjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzE2QjE2RzE2UjE2XzQyMl9VTk9STV9LSFI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0IxNkcxNlIxNkcxNl80MjJfVU5PUk1fS0hSOgorICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZvdW5kOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBmb3JtYXQgaXMgY29tcHJlc3NlZAorVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNDb21wcmVzc2VkKFZrRm9ybWF0IGZvcm1hdCkgeworICAgIHJldHVybiAoRm9ybWF0SXNDb21wcmVzc2VkX0FTVENfTERSKGZvcm1hdCkgfHwgRm9ybWF0SXNDb21wcmVzc2VkX0JDKGZvcm1hdCkgfHwgRm9ybWF0SXNDb21wcmVzc2VkX0VUQzJfRUFDKGZvcm1hdCkgfHwKKyAgICAgICAgICAgIEZvcm1hdElzQ29tcHJlc3NlZF9QVlJUQyhmb3JtYXQpKTsKK30KKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBwYWNrZWQKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzUGFja2VkKFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I0RzRfVU5PUk1fUEFDSzg6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I0RzRCNEE0X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjRHNFI0QTRfVU5PUk1fUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNUc2QjVfVU5PUk1fUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CNUc2UjVfVU5PUk1fUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNUc1QjVBMV9VTk9STV9QQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0I1RzVSNUExX1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTFSNUc1QjVfVU5PUk1fUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0E4QjhHOFI4X1NOT1JNX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfVVNDQUxFRF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0E4QjhHOFI4X1NTQ0FMRURfUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9VSU5UX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfU0lOVF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0E4QjhHOFI4X1NSR0JfUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VTk9STV9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NOT1JNX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVVNDQUxFRF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NTQ0FMRURfUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VSU5UX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfU0lOVF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VOT1JNX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfU05PUk1fUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfU1NDQUxFRF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VJTlRfUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TSU5UX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjEwRzExUjExX1VGTE9BVF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxMFg2X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxMlg0X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjEyWDRHMTJYNF9VTk9STV8yUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNEIxMlg0RzEyWDRSMTJYNF80MjJfVU5PUk1fNFBBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjEyWDRHMTJYNFIxMlg0RzEyWDRfNDIyX1VOT1JNXzRQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2OgorICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZvdW5kOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBmb3JtYXQgaXMgJ25vcm1hbCcsIHdpdGggb25lIHRleGVsIHBlciBmb3JtYXQgZWxlbWVudAorVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0RWxlbWVudElzVGV4ZWwoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgaWYgKEZvcm1hdElzUGFja2VkKGZvcm1hdCkgfHwgRm9ybWF0SXNDb21wcmVzc2VkKGZvcm1hdCkgfHwgRm9ybWF0SXNTaW5nbGVQbGFuZV80MjIoZm9ybWF0KSB8fCBGb3JtYXRJc011bHRpcGxhbmUoZm9ybWF0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBmb3JtYXQgaXMgYSBkZXB0aCBvciBzdGVuY2lsIGZvcm1hdAorVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNEZXB0aE9yU3RlbmNpbChWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICByZXR1cm4gKEZvcm1hdElzRGVwdGhBbmRTdGVuY2lsKGZvcm1hdCkgfHwgRm9ybWF0SXNEZXB0aE9ubHkoZm9ybWF0KSB8fCBGb3JtYXRJc1N0ZW5jaWxPbmx5KGZvcm1hdCkpOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBmb3JtYXQgY29udGFpbnMgZGVwdGggYW5kIHN0ZW5jaWwgaW5mb3JtYXRpb24KK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzRGVwdGhBbmRTdGVuY2lsKFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgaXNfZHMgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0QxNl9VTk9STV9TOF9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UOgorICAgICAgICAgICAgaXNfZHMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGlzX2RzOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBmb3JtYXQgaXMgYSBzdGVuY2lsLW9ubHkgZm9ybWF0CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1N0ZW5jaWxPbmx5KFZrRm9ybWF0IGZvcm1hdCkgeyByZXR1cm4gKGZvcm1hdCA9PSBWS19GT1JNQVRfUzhfVUlOVCk7IH0KKworLy8gUmV0dXJuIHRydWUgaWYgZm9ybWF0IGlzIGEgZGVwdGgtb25seSBmb3JtYXQKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzRGVwdGhPbmx5KFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgaXNfZGVwdGggPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0QxNl9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfWDhfRDI0X1VOT1JNX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVDoKKyAgICAgICAgICAgIGlzX2RlcHRoID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGlzX2RlcHRoOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBmb3JtYXQgaXMgb2YgdHlwZSBOT1JNCitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc05vcm0oVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgYm9vbCBpc19ub3JtID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNEc0X1VOT1JNX1BBQ0s4OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNEc0QjRBNF9VTk9STV9QQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I1RzVCNUExX1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTFSNUc1QjVfVU5PUk1fUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOF9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhfU05PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhfU05PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1NOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfU05PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0E4QjhHOFI4X1VOT1JNX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfU05PUk1fUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VTk9STV9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfU05PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1NOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9TTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU05PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkMzX1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzRfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDNF9TTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkM1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDN19VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QThfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFHMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFHMTFfU05PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDVfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzZ4Nl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDVfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4OF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDZfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4OF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHgxMF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMngxMl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjVHNlI1X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhfU05PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9TTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TTk9STV9QQUNLMzI6CisgICAgICAgICAgICBpc19ub3JtID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGlzX25vcm07Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBvZiB0eXBlIFVOT1JNCitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1VOb3JtKFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgaXNfdW5vcm0gPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I0RzRfVU5PUk1fUEFDSzg6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I0RzRCNEE0X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjVHNkI1X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjVHNUI1QTFfVU5PUk1fUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMVI1RzVCNV9VTk9STV9QQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VOT1JNX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCX1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzJfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDM19VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkM0X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDN19VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QThfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFHMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDVfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzZ4Nl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDVfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4OF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDZfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4OF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHgxMF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMngxMl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjVHNlI1X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyOgorICAgICAgICAgICAgaXNfdW5vcm0gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfdW5vcm07Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBvZiB0eXBlIFNOT1JNCitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NOb3JtKFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgaXNfc25vcm0gPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4X1NOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1NOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfU05PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1NOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9TTk9STV9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfU05PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9TTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzRfU05PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDNV9TTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRUFDX1IxMV9TTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRUFDX1IxMUcxMV9TTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1NOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9TTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfU05PUk1fUEFDSzMyOgorICAgICAgICAgICAgaXNfc25vcm0gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfc25vcm07Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBhbiBpbnRlZ2VyIGZvcm1hdAorVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNJbnQoVmtGb3JtYXQgZm9ybWF0KSB7IHJldHVybiAoRm9ybWF0SXNTSW50KGZvcm1hdCkgfHwgRm9ybWF0SXNVSW50KGZvcm1hdCkpOyB9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGZvcm1hdAorVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNVSW50KFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgaXNfdWludCA9IGZhbHNlOworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUzhfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOF9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfVUlOVF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VJTlRfUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1VJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyX1VJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IzMkczMl9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJCMzJfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NF9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0X1VJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4QThfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVUlOVF9QQUNLMzI6CisgICAgICAgICAgICBpc191aW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGlzX3VpbnQ7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBhIHNpZ25lZCBpbnRlZ2VyIGZvcm1hdAorVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNTSW50KFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGJvb2wgaXNfc2ludCA9IGZhbHNlOworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOF9TSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfU0lOVF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NJTlRfUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1NJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9TSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyX1NJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IzMkczMl9TSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NF9TSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0X1NJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4QThfU0lOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfU0lOVF9QQUNLMzI6CisgICAgICAgICAgICBpc19zaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGlzX3NpbnQ7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBhIGZsb2F0aW5nLXBvaW50IGZvcm1hdAorVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNGbG9hdChWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICBib29sIGlzX2Zsb2F0ID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CMTBHMTFSMTFfVUZMT0FUX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDNkhfU0ZMT0FUX0JMT0NLOgorICAgICAgICAgICAgaXNfZmxvYXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfZmxvYXQ7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBpbiB0aGUgU1JHQiBjb2xvcnNwYWNlCitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NSR0IoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgYm9vbCBpc19zcmdiID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOF9TUkdCOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1NSR0I6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9TUkdCOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9TUkdCOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9TUkdCX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkMxX1JHQl9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzJfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDN19TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QThfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDVfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDVfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg1X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4Nl9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDhfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHgxMF9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1NSR0I6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOEE4X1NSR0I6CisgICAgICAgICAgICBpc19zcmdiID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGlzX3NyZ2I7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBhIFVTQ0FMRUQgZm9ybWF0CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1VTY2FsZWQoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgYm9vbCBpc191c2NhbGVkID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOF9VU0NBTEVEOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1VTQ0FMRUQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9VU0NBTEVEOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhfVVNDQUxFRDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfVVNDQUxFRDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4QThfVVNDQUxFRDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfVVNDQUxFRF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1VTQ0FMRURfUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2X1VTQ0FMRUQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9VU0NBTEVEOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZfVVNDQUxFRDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRUQ6CisgICAgICAgICAgICBpc191c2NhbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGlzX3VzY2FsZWQ7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGZvcm1hdCBpcyBhIFNTQ0FMRUQgZm9ybWF0CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NTY2FsZWQoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgYm9vbCBpc19zc2NhbGVkID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOF9TU0NBTEVEOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1NTQ0FMRUQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9TU0NBTEVEOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhfU1NDQUxFRDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfU1NDQUxFRDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4QThfU1NDQUxFRDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfU1NDQUxFRF9QQUNLMzI6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NTQ0FMRURfUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TU0NBTEVEX1BBQ0szMjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NTQ0FMRUQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9TU0NBTEVEOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NTQ0FMRUQ6CisgICAgICAgICAgICBpc19zc2NhbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGlzX3NzY2FsZWQ7Cit9CisKKy8vIFJldHVybiB0ZXhlbCBibG9jayBzaXplcyBmb3IgYWxsIGZvcm1hdHMKKy8vIFVuY29tcHJlc3NlZCBmb3JtYXRzIHJldHVybiB7MSwgMSwgMX0KKy8vIENvbXByZXNzZWQgZm9ybWF0cyByZXR1cm4gdGhlIGNvbXByZXNzaW9uIGJsb2NrIGV4dGVudHMKKy8vIE11bHRpcGxhbmUgZm9ybWF0cyByZXR1cm4gdGhlICdzaGFyZWQnIGV4dGVudCBvZiB0aGVpciBsb3ctcmVzIGNoYW5uZWwocykKK1ZLX0xBWUVSX0VYUE9SVCBWa0V4dGVudDNEIEZvcm1hdFRleGVsQmxvY2tFeHRlbnQoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgVmtFeHRlbnQzRCBibG9ja19zaXplID0gezEsIDEsIDF9OworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkMxX1JHQkFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JBX1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDMl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDM19VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDNF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkM0X1NOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDNV9TTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDNkhfU0ZMT0FUX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CQzdfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0JDN19TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhfU1JHQl9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBMV9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBMV9TUkdCX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1NSR0JfQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFHMTFfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFHMTFfU05PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzR4NF9TUkdCX0JMT0NLOgorICAgICAgICAgICAgYmxvY2tfc2l6ZSA9IHs0LCA0LCAxfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSB7NSwgNCwgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDVfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNXg1X1NSR0JfQkxPQ0s6CisgICAgICAgICAgICBibG9ja19zaXplID0gezUsIDUsIDF9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzZ4NV9TUkdCX0JMT0NLOgorICAgICAgICAgICAgYmxvY2tfc2l6ZSA9IHs2LCA1LCAxfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzZ4Nl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSB7NiwgNiwgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDVfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg1X1NSR0JfQkxPQ0s6CisgICAgICAgICAgICBibG9ja19zaXplID0gezgsIDUsIDF9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4Nl9TUkdCX0JMT0NLOgorICAgICAgICAgICAgYmxvY2tfc2l6ZSA9IHs4LCA2LCAxfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4OF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSB7OCwgOCwgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg1X1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDVfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSB7MTAsIDUsIDF9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4Nl9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg2X1NSR0JfQkxPQ0s6CisgICAgICAgICAgICBibG9ja19zaXplID0gezEwLCA2LCAxfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDhfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4OF9TUkdCX0JMT0NLOgorICAgICAgICAgICAgYmxvY2tfc2l6ZSA9IHsxMCwgOCwgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHgxMF9VTk9STV9CTE9DSzoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHgxMF9TUkdCX0JMT0NLOgorICAgICAgICAgICAgYmxvY2tfc2l6ZSA9IHsxMCwgMTAsIDF9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTJ4MTBfVU5PUk1fQkxPQ0s6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTJ4MTBfU1JHQl9CTE9DSzoKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSB7MTIsIDEwLCAxfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1VOT1JNX0JMT0NLOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1NSR0JfQkxPQ0s6CisgICAgICAgICAgICBibG9ja19zaXplID0gezEyLCAxMiwgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUFZSVEMxXzJCUFBfVU5PUk1fQkxPQ0tfSU1HOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9VTk9STV9CTE9DS19JTUc6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1BWUlRDMV8yQlBQX1NSR0JfQkxPQ0tfSU1HOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9TUkdCX0JMT0NLX0lNRzoKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSB7OCwgNCwgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUFZSVEMxXzRCUFBfVU5PUk1fQkxPQ0tfSU1HOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzJfNEJQUF9VTk9STV9CTE9DS19JTUc6CisgICAgICAgIGNhc2UgVktfRk9STUFUX1BWUlRDMV80QlBQX1NSR0JfQkxPQ0tfSU1HOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9QVlJUQzJfNEJQUF9TUkdCX0JMT0NLX0lNRzoKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSB7NCwgNCwgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gKEtIUl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24pIF80MjIgc2luZ2xlLXBsYW5lIGZvcm1hdHMgYXJlIHRyZWF0ZWQgYXMgMngxIGNvbXByZXNzZWQgKGZvciBjb3BpZXMpCisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4RzhfNDIyX1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzE2QjE2RzE2UjE2XzQyMl9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfQjE2RzE2UjE2RzE2XzQyMl9VTk9STToKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSB7MiwgMSwgMX07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gXzQyMiBtdWx0aS1wbGFuZSBmb3JtYXRzIGFyZSBub3QgY29uc2lkZXJlZCBjb21wcmVzc2VkLCBidXQgc2hhcmVkIGNvbXBvbmVudHMgZm9ybSBhIGxvZ2ljYWwgMngxIGJsb2NrCisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjJfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNOgorICAgICAgICAgICAgYmxvY2tfc2l6ZSA9IHsyLCAxLCAxfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBfNDIwIGZvcm1hdHMgYXJlIG5vdCBjb25zaWRlcmVkIGNvbXByZXNzZWQsIGJ1dCBzaGFyZWQgY29tcG9uZW50cyBmb3JtIGEgbG9naWNhbCAyeDIgYmxvY2sKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIwX1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjBfVU5PUk06CisgICAgICAgICAgICBibG9ja19zaXplID0gezIsIDIsIDF9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIF80NDQgbXVsdGktcGxhbmUgZm9ybWF0cyBkbyBub3Qgc2hhcmUgY29tcG9uZW50cywgZGVmYXVsdCB0byAxeDEKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDQ0X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80NDRfVU5PUk06CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGJsb2NrX3NpemU7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCB1aW50MzJfdCBGb3JtYXREZXB0aFNpemUoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgdWludDMyX3QgZGVwdGhfc2l6ZSA9IDA7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRDE2X1VOT1JNOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMTZfVU5PUk1fUzhfVUlOVDoKKyAgICAgICAgICAgIGRlcHRoX3NpemUgPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDoKKyAgICAgICAgICAgIGRlcHRoX3NpemUgPSAyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQ6CisgICAgICAgICAgICBkZXB0aF9zaXplID0gMzI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkZXB0aF9zaXplOworfQorCitWS19MQVlFUl9FWFBPUlQgVmtGb3JtYXROdW1lcmljYWxUeXBlIEZvcm1hdERlcHRoTnVtZXJpY2FsVHlwZShWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICBWa0Zvcm1hdE51bWVyaWNhbFR5cGUgbnVtZXJpY2FsX3R5cGUgPSBWS19GT1JNQVRfTlVNRVJJQ0FMX1RZUEVfTk9ORTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMTZfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0QxNl9VTk9STV9TOF9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDoKKyAgICAgICAgICAgIG51bWVyaWNhbF90eXBlID0gVktfRk9STUFUX05VTUVSSUNBTF9UWVBFX1VOT1JNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0QzMl9TRkxPQVQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVDoKKyAgICAgICAgICAgIG51bWVyaWNhbF90eXBlID0gVktfRk9STUFUX05VTUVSSUNBTF9UWVBFX1NGTE9BVDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIG51bWVyaWNhbF90eXBlOworfQorCitWS19MQVlFUl9FWFBPUlQgdWludDMyX3QgRm9ybWF0U3RlbmNpbFNpemUoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgdWludDMyX3Qgc3RlbmNpbF9zaXplID0gMDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9TOF9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMTZfVU5PUk1fUzhfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVDoKKyAgICAgICAgICAgIHN0ZW5jaWxfc2l6ZSA9IDg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGVuY2lsX3NpemU7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWa0Zvcm1hdE51bWVyaWNhbFR5cGUgRm9ybWF0U3RlbmNpbE51bWVyaWNhbFR5cGUoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgVmtGb3JtYXROdW1lcmljYWxUeXBlIG51bWVyaWNhbF90eXBlID0gVktfRk9STUFUX05VTUVSSUNBTF9UWVBFX05PTkU7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfUzhfVUlOVDoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRDE2X1VOT1JNX1M4X1VJTlQ6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5UOgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQ6CisgICAgICAgICAgICBudW1lcmljYWxfdHlwZSA9IFZLX0ZPUk1BVF9OVU1FUklDQUxfVFlQRV9VSU5UOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbnVtZXJpY2FsX3R5cGU7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCB1aW50MzJfdCBGb3JtYXRQbGFuZUNvdW50KFZrRm9ybWF0IGZvcm1hdCkgeworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjJfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80NDRfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjJfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80NDRfVU5PUk06CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk06CisgICAgICAgIGNhc2UgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2OgorICAgICAgICBjYXNlIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNjoKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTY6CisgICAgICAgIGNhc2UgVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STToKKyAgICAgICAgY2FzZSBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvLyBSZXR1cm4gZm9ybWF0IGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgZm9ybWF0CitWS19MQVlFUl9FWFBPUlQgVmtGb3JtYXRDb21wYXRpYmlsaXR5Q2xhc3MgRm9ybWF0Q29tcGF0aWJpbGl0eUNsYXNzKFZrRm9ybWF0IGZvcm1hdCkgeworICAgIGF1dG8gaXRlbSA9IHZrX2Zvcm1hdF90YWJsZS5maW5kKGZvcm1hdCk7CisgICAgaWYgKGl0ZW0gIT0gdmtfZm9ybWF0X3RhYmxlLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdGVtLT5zZWNvbmQuZm9ybWF0X2NsYXNzOworICAgIH0KKyAgICByZXR1cm4gVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfTk9ORV9CSVQ7Cit9CisKKy8vIFJldHVybiBzaXplLCBpbiBieXRlcywgb2Ygb25lIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBmb3JtYXQKKy8vIEZvciB1bmNvbXByZXNzZWQgdGhpcyBpcyBvbmUgdGV4ZWwsIGZvciBjb21wcmVzc2VkIGl0IGlzIG9uZSBibG9jaworVktfTEFZRVJfRVhQT1JUIHVpbnQzMl90IEZvcm1hdEVsZW1lbnRTaXplKFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdE1hc2spIHsKKyAgICAvLyBIYW5kbGUgc3BlY2lhbCBidWZmZXIgcGFja2luZyBydWxlcyBmb3Igc3BlY2lmaWMgZGVwdGgvc3RlbmNpbCBmb3JtYXRzCisgICAgaWYgKGFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpIHsKKyAgICAgICAgZm9ybWF0ID0gVktfRk9STUFUX1M4X1VJTlQ7CisgICAgfSBlbHNlIGlmIChhc3BlY3RNYXNrICYgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCkgeworICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBWS19GT1JNQVRfRDE2X1VOT1JNX1M4X1VJTlQ6CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gVktfRk9STUFUX0QxNl9VTk9STTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVDoKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBWS19GT1JNQVRfRDMyX1NGTE9BVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEZvcm1hdElzTXVsdGlwbGFuZShmb3JtYXQpKSB7CisgICAgICAgIGZvcm1hdCA9IEZpbmRNdWx0aXBsYW5lQ29tcGF0aWJsZUZvcm1hdChmb3JtYXQsIGFzcGVjdE1hc2spOworICAgIH0KKworICAgIGF1dG8gaXRlbSA9IHZrX2Zvcm1hdF90YWJsZS5maW5kKGZvcm1hdCk7CisgICAgaWYgKGl0ZW0gIT0gdmtfZm9ybWF0X3RhYmxlLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdGVtLT5zZWNvbmQuc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBvbmUgdGV4ZWwgb2YgZ2l2ZW4gZm9yYW10CisvLyBGb3IgY29tcHJlc3NlZCBvciBtdWx0aS1wbGFuZSwgdGhpcyBtYXkgYmUgYSBmcmFjdGlvbmFsIG51bWJlcgorVktfTEFZRVJfRVhQT1JUIGRvdWJsZSBGb3JtYXRUZXhlbFNpemUoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgZG91YmxlIHRleGVsX3NpemUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KEZvcm1hdEVsZW1lbnRTaXplKGZvcm1hdCkpOworICAgIFZrRXh0ZW50M0QgYmxvY2tfZXh0ZW50ID0gRm9ybWF0VGV4ZWxCbG9ja0V4dGVudChmb3JtYXQpOworICAgIHVpbnQzMl90IHRleGVsc19wZXJfYmxvY2sgPSBibG9ja19leHRlbnQud2lkdGggKiBibG9ja19leHRlbnQuaGVpZ2h0ICogYmxvY2tfZXh0ZW50LmRlcHRoOworICAgIGlmICgxIDwgdGV4ZWxzX3Blcl9ibG9jaykgeworICAgICAgICB0ZXhlbF9zaXplIC89IHN0YXRpY19jYXN0PGRvdWJsZT4odGV4ZWxzX3Blcl9ibG9jayk7CisgICAgfQorICAgIHJldHVybiB0ZXhlbF9zaXplOworfQorCisvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFubmVscyBmb3IgYSBnaXZlbiBmb3JtYXQKK3VpbnQzMl90IEZvcm1hdENoYW5uZWxDb3VudChWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICBhdXRvIGl0ZW0gPSB2a19mb3JtYXRfdGFibGUuZmluZChmb3JtYXQpOworICAgIGlmIChpdGVtICE9IHZrX2Zvcm1hdF90YWJsZS5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRlbS0+c2Vjb25kLmNoYW5uZWxfY291bnQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvLyBQZXJmb3JtIGEgemVyby10b2xlcmFudCBtb2R1bG8gb3BlcmF0aW9uCitWS19MQVlFUl9FWFBPUlQgVmtEZXZpY2VTaXplIFNhZmVNb2R1bG8oVmtEZXZpY2VTaXplIGRpdmlkZW5kLCBWa0RldmljZVNpemUgZGl2aXNvcikgeworICAgIFZrRGV2aWNlU2l6ZSByZXN1bHQgPSAwOworICAgIGlmIChkaXZpc29yICE9IDApIHsKKyAgICAgICAgcmVzdWx0ID0gZGl2aWRlbmQgJSBkaXZpc29yOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVmtEZXZpY2VTaXplIFNhZmVEaXZpc2lvbihWa0RldmljZVNpemUgZGl2aWRlbmQsIFZrRGV2aWNlU2l6ZSBkaXZpc29yKSB7CisgICAgVmtEZXZpY2VTaXplIHJlc3VsdCA9IDA7CisgICAgaWYgKGRpdmlzb3IgIT0gMCkgeworICAgICAgICByZXN1bHQgPSBkaXZpZGVuZCAvIGRpdmlzb3I7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBWVUxLQU5fUEVSX1BMQU5FX0NPTVBBVElCSUxJVFkgeworICAgIHVpbnQzMl90IHdpZHRoX2Rpdmlzb3I7CisgICAgdWludDMyX3QgaGVpZ2h0X2Rpdmlzb3I7CisgICAgVmtGb3JtYXQgY29tcGF0aWJsZV9mb3JtYXQ7Cit9OworCitzdHJ1Y3QgVlVMS0FOX01VTFRJUExBTkVfQ09NUEFUSUJJTElUWSB7CisgICAgVlVMS0FOX1BFUl9QTEFORV9DT01QQVRJQklMSVRZIHBlcl9wbGFuZVtWS19NVUxUSVBMQU5FX0ZPUk1BVF9NQVhfUExBTkVTXTsKK307CisKKy8vIFNvdXJjZTogVnVsa2FuIHNwZWMgVGFibGUgNDUuIFBsYW5lIEZvcm1hdCBDb21wYXRpYmlsaXR5IFRhYmxlCisvLyBjbGFuZy1mb3JtYXQgb2ZmCitjb25zdCBzdGQ6Om1hcDxWa0Zvcm1hdCwgVlVMS0FOX01VTFRJUExBTkVfQ09NUEFUSUJJTElUWT4gdmtfbXVsdGlwbGFuZV9jb21wYXRpYmlsaXR5X21hcCB7CisgICAgeyBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STSwgICAgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjhfVU5PUk0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDIsIDIsIFZLX0ZPUk1BVF9SOF9VTk9STSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMiwgMiwgVktfRk9STUFUX1I4X1VOT1JNIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIwX1VOT1JNLCAgICAgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjhfVU5PUk0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDIsIDIsIFZLX0ZPUk1BVF9SOEc4X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfVU5ERUZJTkVEIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMl9VTk9STSwgICAgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjhfVU5PUk0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDIsIDEsIFZLX0ZPUk1BVF9SOF9VTk9STSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMiwgMSwgVktfRk9STUFUX1I4X1VOT1JNIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIyX1VOT1JNLCAgICAgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjhfVU5PUk0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDIsIDEsIFZLX0ZPUk1BVF9SOEc4X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfVU5ERUZJTkVEIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STSwgICAgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjhfVU5PUk0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDEsIDEsIFZLX0ZPUk1BVF9SOF9VTk9STSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMSwgMSwgVktfRk9STUFUX1I4X1VOT1JNIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2LCB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYsICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfVU5ERUZJTkVEIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2LCB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfVU5ERUZJTkVEIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2LCB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2IH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2LCB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTYsICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjEyWDRHMTJYNF9VTk9STV8yUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfVU5ERUZJTkVEIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2LCB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTYsICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjEyWDRHMTJYNF9VTk9STV8yUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfVU5ERUZJTkVEIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2LCB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2IH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMF9VTk9STSwgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIwX1VOT1JNLCAgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAyLCBWS19GT1JNQVRfUjE2RzE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfVU5ERUZJTkVEIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STSwgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNLCAgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCAxLCBWS19GT1JNQVRfUjE2RzE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfVU5ERUZJTkVEIH0gfSB9IH0sCisgICAgeyBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STSwgICAgICAgICAgICAgICB7IHsgeyAxLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCAxLCBWS19GT1JNQVRfUjE2X1VOT1JNIH0gfSB9IH0KK307CisvLyBjbGFuZy1mb3JtYXQgb24KKwordWludDMyX3QgR2V0UGxhbmVJbmRleChWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0KSB7CisgICAgLy8gUmV0dXJucyBhbiBvdXQgb2YgYm91bmRzIGluZGV4IG9uIGVycm9yCisgICAgc3dpdGNoIChhc3BlY3QpIHsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgcGxhbmUgYml0IGlzIHNldCwgcmV0dXJuIGVycm9yIGNvbmRpdGlvbgorICAgICAgICAgICAgcmV0dXJuIFZLX01VTFRJUExBTkVfRk9STUFUX01BWF9QTEFORVM7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWa0Zvcm1hdCBGaW5kTXVsdGlwbGFuZUNvbXBhdGlibGVGb3JtYXQoVmtGb3JtYXQgbXBfZm10LCBWa0ltYWdlQXNwZWN0RmxhZ3MgcGxhbmVfYXNwZWN0KSB7CisgICAgdWludDMyX3QgcGxhbmVfaWR4ID0gR2V0UGxhbmVJbmRleChwbGFuZV9hc3BlY3QpOworICAgIGF1dG8gaXQgPSB2a19tdWx0aXBsYW5lX2NvbXBhdGliaWxpdHlfbWFwLmZpbmQobXBfZm10KTsKKyAgICBpZiAoKGl0ID09IHZrX211bHRpcGxhbmVfY29tcGF0aWJpbGl0eV9tYXAuZW5kKCkpIHx8IChwbGFuZV9pZHggPj0gVktfTVVMVElQTEFORV9GT1JNQVRfTUFYX1BMQU5FUykpIHsKKyAgICAgICAgcmV0dXJuIFZLX0ZPUk1BVF9VTkRFRklORUQ7CisgICAgfQorCisgICAgcmV0dXJuIGl0LT5zZWNvbmQucGVyX3BsYW5lW3BsYW5lX2lkeF0uY29tcGF0aWJsZV9mb3JtYXQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWa0V4dGVudDJEIEZpbmRNdWx0aXBsYW5lRXh0ZW50RGl2aXNvcnMoVmtGb3JtYXQgbXBfZm10LCBWa0ltYWdlQXNwZWN0RmxhZ3MgcGxhbmVfYXNwZWN0KSB7CisgICAgVmtFeHRlbnQyRCBkaXZpc29ycyA9IHsxLCAxfTsKKyAgICB1aW50MzJfdCBwbGFuZV9pZHggPSBHZXRQbGFuZUluZGV4KHBsYW5lX2FzcGVjdCk7CisgICAgYXV0byBpdCA9IHZrX211bHRpcGxhbmVfY29tcGF0aWJpbGl0eV9tYXAuZmluZChtcF9mbXQpOworICAgIGlmICgoaXQgPT0gdmtfbXVsdGlwbGFuZV9jb21wYXRpYmlsaXR5X21hcC5lbmQoKSkgfHwgKHBsYW5lX2lkeCA+PSBWS19NVUxUSVBMQU5FX0ZPUk1BVF9NQVhfUExBTkVTKSkgeworICAgICAgICByZXR1cm4gZGl2aXNvcnM7CisgICAgfQorCisgICAgZGl2aXNvcnMud2lkdGggPSBpdC0+c2Vjb25kLnBlcl9wbGFuZVtwbGFuZV9pZHhdLndpZHRoX2Rpdmlzb3I7CisgICAgZGl2aXNvcnMuaGVpZ2h0ID0gaXQtPnNlY29uZC5wZXJfcGxhbmVbcGxhbmVfaWR4XS5oZWlnaHRfZGl2aXNvcjsKKyAgICByZXR1cm4gZGl2aXNvcnM7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdFNpemVzQXJlRXF1YWwoVmtGb3JtYXQgc3JjRm9ybWF0LCBWa0Zvcm1hdCBkc3RGb3JtYXQsIHVpbnQzMl90IHJlZ2lvbl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUNvcHkgKnJlZ2lvbnMpIHsKKyAgICBzaXplX3Qgc3JjU2l6ZSA9IDAsIGRzdFNpemUgPSAwOworCisgICAgaWYgKEZvcm1hdElzTXVsdGlwbGFuZShzcmNGb3JtYXQpIHx8IEZvcm1hdElzTXVsdGlwbGFuZShkc3RGb3JtYXQpKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWdpb25fY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKEZvcm1hdElzTXVsdGlwbGFuZShzcmNGb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgVmtGb3JtYXQgcGxhbmVGb3JtYXQgPSBGaW5kTXVsdGlwbGFuZUNvbXBhdGlibGVGb3JtYXQoc3JjRm9ybWF0LCByZWdpb25zW2ldLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2spOworICAgICAgICAgICAgICAgIHNyY1NpemUgPSBGb3JtYXRFbGVtZW50U2l6ZShwbGFuZUZvcm1hdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNyY1NpemUgPSBGb3JtYXRFbGVtZW50U2l6ZShzcmNGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEZvcm1hdElzTXVsdGlwbGFuZShkc3RGb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgVmtGb3JtYXQgcGxhbmVGb3JtYXQgPSBGaW5kTXVsdGlwbGFuZUNvbXBhdGlibGVGb3JtYXQoZHN0Rm9ybWF0LCByZWdpb25zW2ldLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2spOworICAgICAgICAgICAgICAgIGRzdFNpemUgPSBGb3JtYXRFbGVtZW50U2l6ZShwbGFuZUZvcm1hdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdFNpemUgPSBGb3JtYXRFbGVtZW50U2l6ZShkc3RGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRzdFNpemUgIT0gc3JjU2l6ZSkgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHNyY1NpemUgPSBGb3JtYXRFbGVtZW50U2l6ZShzcmNGb3JtYXQpOworICAgICAgICBkc3RTaXplID0gRm9ybWF0RWxlbWVudFNpemUoZHN0Rm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIChkc3RTaXplID09IHNyY1NpemUpOworICAgIH0KK30KKworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0UmVxdWlyZXNZY2JjckNvbnZlcnNpb24oVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgcmV0dXJuIGZvcm1hdCA+PSBWS19GT1JNQVRfRzhCOEc4UjhfNDIyX1VOT1JNICYmIGZvcm1hdCA8PSBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19mb3JtYXRfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19mb3JtYXRfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjU2MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2Zvcm1hdF91dGlscy5oCkBAIC0wLDAgKzEsMTkxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKworI2lmICFkZWZpbmVkKFZLX0xBWUVSX0VYUE9SVCkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIFZLX0xBWUVSX0VYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgVktfTEFZRVJfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxzZQorI2RlZmluZSBWS19MQVlFUl9FWFBPUlQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBWS19NVUxUSVBMQU5FX0ZPUk1BVF9NQVhfUExBTkVTIDMKKwordHlwZWRlZiBlbnVtIFZrRm9ybWF0Q29tcGF0aWJpbGl0eUNsYXNzIHsKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19OT05FX0JJVCA9IDAsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfOF9CSVQgPSAxLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2X0JJVCA9IDIsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMjRfQklUID0gMywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18zMl9CSVQgPSA0LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzQ4X0JJVCA9IDUsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfNjRfQklUID0gNiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU185Nl9CSVQgPSA3LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEyOF9CSVQgPSA4LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE5Ml9CSVQgPSA5LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzI1Nl9CSVQgPSAxMCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19CQzFfUkdCX0JJVCA9IDExLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDMV9SR0JBX0JJVCA9IDEyLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDMl9CSVQgPSAxMywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19CQzNfQklUID0gMTQsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQkM0X0JJVCA9IDE1LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDNV9CSVQgPSAxNiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19CQzZIX0JJVCA9IDE3LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0JDN19CSVQgPSAxOCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FVEMyX1JHQl9CSVQgPSAxOSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FVEMyX1JHQkFfQklUID0gMjAsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfRVRDMl9FQUNfUkdCQV9CSVQgPSAyMSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FQUNfUl9CSVQgPSAyMiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19FQUNfUkdfQklUID0gMjMsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ180WDRfQklUID0gMjQsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ181WDRfQklUID0gMjUsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ181WDVfQklUID0gMjYsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ182WDVfQklUID0gMjcsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ182WDZfQklUID0gMjgsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDVfQklUID0gMjksCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDZfQklUID0gMjAsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ184WDhfQklUID0gMzEsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ18xMFg1X0JJVCA9IDMyLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0FTVENfMTBYNl9CSVQgPSAzMywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzEwWDhfQklUID0gMzQsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfQVNUQ18xMFgxMF9CSVQgPSAzNSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19BU1RDXzEyWDEwX0JJVCA9IDM2LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0FTVENfMTJYMTJfQklUID0gMzcsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfRDE2X0JJVCA9IDM4LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTX0QyNF9CSVQgPSAzOSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19EMzJfQklUID0gMzAsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfUzhfQklUID0gNDEsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfRDE2UzhfQklUID0gNDIsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfRDI0UzhfQklUID0gNDMsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfRDMyUzhfQklUID0gNDQsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfUFZSVEMxXzJCUFBfQklUID0gNDUsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfUFZSVEMxXzRCUFBfQklUID0gNDYsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfUFZSVEMyXzJCUFBfQklUID0gNDcsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfUFZSVEMyXzRCUFBfQklUID0gNDgsCisgICAgLyogS0hSX3NhbXBsZXJfWUNiQ3JfY29udmVyc2lvbiAqLworICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzMyQklUX0c4QjhHOFI4ID0gNDksCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMzJCSVRfQjhHOFI4RzggPSA1MCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NEJJVF9SMTBHMTBCMTBBMTAgPSA1MSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NEJJVF9HMTBCMTBHMTBSMTAgPSA1MiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NEJJVF9CMTBHMTBSMTBHMTAgPSA1MywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NEJJVF9SMTJHMTJCMTJBMTIgPSA1NCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NEJJVF9HMTJCMTJHMTJSMTIgPSA1NSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NEJJVF9CMTJHMTJSMTJHMTIgPSA1NiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NEJJVF9HMTZCMTZHMTZSMTYgPSA1NywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU182NEJJVF9CMTZHMTZSMTZHMTYgPSA1OCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184QklUXzNQTEFORV80MjAgPSA1OSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184QklUXzJQTEFORV80MjAgPSA2MCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184QklUXzNQTEFORV80MjIgPSA2MSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184QklUXzJQTEFORV80MjIgPSA2MiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU184QklUXzNQTEFORV80NDQgPSA2MywKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMEJJVF8zUExBTkVfNDIwID0gNjQsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTBCSVRfMlBMQU5FXzQyMCA9IDY1LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEwQklUXzNQTEFORV80MjIgPSA2NiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMEJJVF8yUExBTkVfNDIyID0gNjcsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTBCSVRfM1BMQU5FXzQ0NCA9IDY4LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEyQklUXzNQTEFORV80MjAgPSA2OSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMkJJVF8yUExBTkVfNDIwID0gNzAsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTJCSVRfM1BMQU5FXzQyMiA9IDcxLAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzEyQklUXzJQTEFORV80MjIgPSA3MiwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xMkJJVF8zUExBTkVfNDQ0ID0gNzMsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZCSVRfM1BMQU5FXzQyMCA9IDc0LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2QklUXzJQTEFORV80MjAgPSA3NSwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU18xNkJJVF8zUExBTkVfNDIyID0gNzYsCisgICAgVktfRk9STUFUX0NPTVBBVElCSUxJVFlfQ0xBU1NfMTZCSVRfMlBMQU5FXzQyMiA9IDc3LAorICAgIFZLX0ZPUk1BVF9DT01QQVRJQklMSVRZX0NMQVNTXzE2QklUXzNQTEFORV80NDQgPSA3OCwKKyAgICBWS19GT1JNQVRfQ09NUEFUSUJJTElUWV9DTEFTU19NQVhfRU5VTSA9IDc5Cit9IFZrRm9ybWF0Q29tcGF0aWJpbGl0eUNsYXNzOworCit0eXBlZGVmIGVudW0gVmtGb3JtYXROdW1lcmljYWxUeXBlIHsKKyAgICBWS19GT1JNQVRfTlVNRVJJQ0FMX1RZUEVfTk9ORSwKKyAgICBWS19GT1JNQVRfTlVNRVJJQ0FMX1RZUEVfVUlOVCwKKyAgICBWS19GT1JNQVRfTlVNRVJJQ0FMX1RZUEVfU0lOVCwKKyAgICBWS19GT1JNQVRfTlVNRVJJQ0FMX1RZUEVfVU5PUk0sCisgICAgVktfRk9STUFUX05VTUVSSUNBTF9UWVBFX1NOT1JNLAorICAgIFZLX0ZPUk1BVF9OVU1FUklDQUxfVFlQRV9VU0NBTEVELAorICAgIFZLX0ZPUk1BVF9OVU1FUklDQUxfVFlQRV9TU0NBTEVELAorICAgIFZLX0ZPUk1BVF9OVU1FUklDQUxfVFlQRV9VRkxPQVQsCisgICAgVktfRk9STUFUX05VTUVSSUNBTF9UWVBFX1NGTE9BVCwKKyAgICBWS19GT1JNQVRfTlVNRVJJQ0FMX1RZUEVfU1JHQgorfSBWa0Zvcm1hdE51bWVyaWNhbFR5cGU7CisKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzRGVwdGhPclN0ZW5jaWwoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzRGVwdGhBbmRTdGVuY2lsKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc0RlcHRoT25seShWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNTdGVuY2lsT25seShWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNDb21wcmVzc2VkX0VUQzJfRUFDKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc0NvbXByZXNzZWRfQVNUQ19MRFIoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzQ29tcHJlc3NlZF9CQyhWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNDb21wcmVzc2VkX1BWUlRDKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NpbmdsZVBsYW5lXzQyMihWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNOb3JtKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1VOb3JtKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NOb3JtKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc0ludChWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNTSW50KFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1VJbnQoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzRmxvYXQoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzU1JHQihWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNVU2NhbGVkKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRJc1NTY2FsZWQoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdElzQ29tcHJlc3NlZChWa0Zvcm1hdCBmb3JtYXQpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgRm9ybWF0SXNQYWNrZWQoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdEVsZW1lbnRJc1RleGVsKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgYm9vbCBGb3JtYXRTaXplc0FyZUVxdWFsKFZrRm9ybWF0IHNyY0Zvcm1hdCwgVmtGb3JtYXQgZHN0Rm9ybWF0LCB1aW50MzJfdCByZWdpb25fY291bnQsIGNvbnN0IFZrSW1hZ2VDb3B5ICpyZWdpb25zKTsKK1ZLX0xBWUVSX0VYUE9SVCBib29sIEZvcm1hdFJlcXVpcmVzWWNiY3JDb252ZXJzaW9uKFZrRm9ybWF0IGZvcm1hdCk7CisKK1ZLX0xBWUVSX0VYUE9SVCB1aW50MzJfdCBGb3JtYXREZXB0aFNpemUoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBWa0Zvcm1hdE51bWVyaWNhbFR5cGUgRm9ybWF0RGVwdGhOdW1lcmljYWxUeXBlKFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgdWludDMyX3QgRm9ybWF0U3RlbmNpbFNpemUoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBWa0Zvcm1hdE51bWVyaWNhbFR5cGUgRm9ybWF0U3RlbmNpbE51bWVyaWNhbFR5cGUoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCB1aW50MzJfdCBGb3JtYXRQbGFuZUNvdW50KFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgdWludDMyX3QgRm9ybWF0Q2hhbm5lbENvdW50KFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgVmtFeHRlbnQzRCBGb3JtYXRUZXhlbEJsb2NrRXh0ZW50KFZrRm9ybWF0IGZvcm1hdCk7CitWS19MQVlFUl9FWFBPUlQgdWludDMyX3QgRm9ybWF0RWxlbWVudFNpemUoVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQpOworVktfTEFZRVJfRVhQT1JUIGRvdWJsZSBGb3JtYXRUZXhlbFNpemUoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBWa0Zvcm1hdENvbXBhdGliaWxpdHlDbGFzcyBGb3JtYXRDb21wYXRpYmlsaXR5Q2xhc3MoVmtGb3JtYXQgZm9ybWF0KTsKK1ZLX0xBWUVSX0VYUE9SVCBWa0RldmljZVNpemUgU2FmZU1vZHVsbyhWa0RldmljZVNpemUgZGl2aWRlbmQsIFZrRGV2aWNlU2l6ZSBkaXZpc29yKTsKK1ZLX0xBWUVSX0VYUE9SVCBWa0RldmljZVNpemUgU2FmZURpdmlzaW9uKFZrRGV2aWNlU2l6ZSBkaXZpZGVuZCwgVmtEZXZpY2VTaXplIGRpdmlzb3IpOworVktfTEFZRVJfRVhQT1JUIHVpbnQzMl90IEdldFBsYW5lSW5kZXgoVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdCk7CitWS19MQVlFUl9FWFBPUlQgVmtGb3JtYXQgRmluZE11bHRpcGxhbmVDb21wYXRpYmxlRm9ybWF0KFZrRm9ybWF0IGZtdCwgVmtJbWFnZUFzcGVjdEZsYWdzIHBsYW5lX2FzcGVjdCk7CitWS19MQVlFUl9FWFBPUlQgVmtFeHRlbnQyRCBGaW5kTXVsdGlwbGFuZUV4dGVudERpdmlzb3JzKFZrRm9ybWF0IG1wX2ZtdCwgVmtJbWFnZUFzcGVjdEZsYWdzIHBsYW5lX2FzcGVjdCk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBGb3JtYXRJc1VuZGVmKFZrRm9ybWF0IGZvcm1hdCkgeyByZXR1cm4gKGZvcm1hdCA9PSBWS19GT1JNQVRfVU5ERUZJTkVEKTsgfQorc3RhdGljIGlubGluZSBib29sIEZvcm1hdEhhc0RlcHRoKFZrRm9ybWF0IGZvcm1hdCkgeyByZXR1cm4gKEZvcm1hdElzRGVwdGhPbmx5KGZvcm1hdCkgfHwgRm9ybWF0SXNEZXB0aEFuZFN0ZW5jaWwoZm9ybWF0KSk7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBGb3JtYXRIYXNTdGVuY2lsKFZrRm9ybWF0IGZvcm1hdCkgeyByZXR1cm4gKEZvcm1hdElzU3RlbmNpbE9ubHkoZm9ybWF0KSB8fCBGb3JtYXRJc0RlcHRoQW5kU3RlbmNpbChmb3JtYXQpKTsgfQorc3RhdGljIGlubGluZSBib29sIEZvcm1hdElzTXVsdGlwbGFuZShWa0Zvcm1hdCBmb3JtYXQpIHsgcmV0dXJuICgoRm9ybWF0UGxhbmVDb3VudChmb3JtYXQpKSA+IDF1KTsgfQorc3RhdGljIGlubGluZSBib29sIEZvcm1hdElzQ29sb3IoVmtGb3JtYXQgZm9ybWF0KSB7CisgICAgcmV0dXJuICEoRm9ybWF0SXNVbmRlZihmb3JtYXQpIHx8IEZvcm1hdElzRGVwdGhPclN0ZW5jaWwoZm9ybWF0KSB8fCBGb3JtYXRJc011bHRpcGxhbmUoZm9ybWF0KSk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfY29uZmlnLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19sYXllcl9jb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYTA2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfY29uZmlnLmNwcApAQCAtMCwwICsxLDMzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxOSBWYWx2ZSBTb2Z0d2FyZQorICogQ29weXJpZ2h0IDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTkgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInZrX2xheWVyX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPHZ1bGthbi92a19sYXllci5oPgorI2luY2x1ZGUgPHZ1bGthbi92a19zZGtfcGxhdGZvcm0uaD4KKyNpbmNsdWRlICJ2a19sYXllcl91dGlscy5oIgorCisjaWYgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitjbGFzcyBDb25maWdGaWxlIHsKKyAgcHVibGljOgorICAgIENvbmZpZ0ZpbGUoKTsKKyAgICB+Q29uZmlnRmlsZSgpe307CisKKyAgICBjb25zdCBjaGFyICpHZXRPcHRpb24oY29uc3Qgc3RyaW5nICZvcHRpb24pOworICAgIHZvaWQgU2V0T3B0aW9uKGNvbnN0IHN0cmluZyAmb3B0aW9uLCBjb25zdCBzdHJpbmcgJnZhbHVlKTsKKyAgICBzdHJpbmcgdmtfbGF5ZXJfZGlzYWJsZXNfZW52X3ZhcjsKKworICBwcml2YXRlOgorICAgIGJvb2wgZmlsZV9pc19wYXJzZWRfOworICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPiB2YWx1ZV9tYXBfOworCisgICAgc3RyaW5nIEZpbmRTZXR0aW5ncygpOworICAgIHZvaWQgUGFyc2VGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK307CisKK3N0YXRpYyBDb25maWdGaWxlIGxheWVyX2NvbmZpZzsKKworc3RyaW5nIEdldEVudmlyb25tZW50KGNvbnN0IGNoYXIgKnZhcmlhYmxlKSB7CisjaWYgIWRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9XSU4zMikKKyAgICBjb25zdCBjaGFyICpvdXRwdXQgPSBnZXRlbnYodmFyaWFibGUpOworICAgIHJldHVybiBvdXRwdXQgPT0gTlVMTCA/ICIiIDogb3V0cHV0OworI2VsaWYgZGVmaW5lZChfV0lOMzIpCisgICAgaW50IHNpemUgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKHZhcmlhYmxlLCBOVUxMLCAwKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgY2hhciAqYnVmZmVyID0gbmV3IGNoYXJbc2l6ZV07CisgICAgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSh2YXJpYWJsZSwgYnVmZmVyLCBzaXplKTsKKyAgICBzdHJpbmcgb3V0cHV0ID0gYnVmZmVyOworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICByZXR1cm4gb3V0cHV0OworI2Vsc2UKKyAgICByZXR1cm4gIiI7CisjZW5kaWYKK30KKworVktfTEFZRVJfRVhQT1JUIGNvbnN0IGNoYXIgKmdldExheWVyT3B0aW9uKGNvbnN0IGNoYXIgKm9wdGlvbikgeyByZXR1cm4gbGF5ZXJfY29uZmlnLkdldE9wdGlvbihvcHRpb24pOyB9CitWS19MQVlFUl9FWFBPUlQgY29uc3QgY2hhciAqR2V0TGF5ZXJFbnZWYXIoY29uc3QgY2hhciAqb3B0aW9uKSB7CisgICAgbGF5ZXJfY29uZmlnLnZrX2xheWVyX2Rpc2FibGVzX2Vudl92YXIgPSBHZXRFbnZpcm9ubWVudChvcHRpb24pOworICAgIHJldHVybiBsYXllcl9jb25maWcudmtfbGF5ZXJfZGlzYWJsZXNfZW52X3Zhci5jX3N0cigpOworfQorCisvLyBJZiBvcHRpb24gaXMgTlVMTCBvciBzdGRvdXQsIHJldHVybiBzdGRvdXQsIG90aGVyd2lzZSB0cnkgdG8gb3BlbiBvcHRpb24KKy8vIGFzIGEgZmlsZW5hbWUuIElmIHN1Y2Nlc3NmdWwsIHJldHVybiBmaWxlIGhhbmRsZSwgb3RoZXJ3aXNlIHN0ZG91dAorVktfTEFZRVJfRVhQT1JUIEZJTEUgKmdldExheWVyTG9nT3V0cHV0KGNvbnN0IGNoYXIgKm9wdGlvbiwgY29uc3QgY2hhciAqbGF5ZXJfbmFtZSkgeworICAgIEZJTEUgKmxvZ19vdXRwdXQgPSBOVUxMOworICAgIGlmICghb3B0aW9uIHx8ICFzdHJjbXAoInN0ZG91dCIsIG9wdGlvbikpCisgICAgICAgIGxvZ19vdXRwdXQgPSBzdGRvdXQ7CisgICAgZWxzZSB7CisgICAgICAgIGxvZ19vdXRwdXQgPSBmb3BlbihvcHRpb24sICJ3Iik7CisgICAgICAgIGlmIChsb2dfb3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb24pCisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBsYXllcl9uYW1lIDw8ICIgRVJST1I6IEJhZCBvdXRwdXQgZmlsZW5hbWUgc3BlY2lmaWVkOiAiIDw8IG9wdGlvbiA8PCAiLiBXcml0aW5nIHRvIFNURE9VVCBpbnN0ZWFkIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgbG9nX291dHB1dCA9IHN0ZG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbG9nX291dHB1dDsKK30KKworLy8gTWFwIG9wdGlvbiBzdHJpbmdzIHRvIGZsYWcgZW51bSB2YWx1ZXMKK1ZLX0xBWUVSX0VYUE9SVCBWa0ZsYWdzIEdldExheWVyT3B0aW9uRmxhZ3Moc3RyaW5nIG9wdGlvbiwgc3RkOjp1bm9yZGVyZWRfbWFwPHN0cmluZywgVmtGbGFncz4gY29uc3QgJmVudW1fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb3B0aW9uX2RlZmF1bHQpIHsKKyAgICBWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgZmxhZ3MgPSBvcHRpb25fZGVmYXVsdDsKKyAgICBzdHJpbmcgb3B0aW9uX2xpc3QgPSBsYXllcl9jb25maWcuR2V0T3B0aW9uKG9wdGlvbi5jX3N0cigpKTsKKworICAgIHdoaWxlIChvcHRpb25fbGlzdC5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgIC8vIEZpbmQgbGVuZ3RoIG9mIG9wdGlvbiBzdHJpbmcKKyAgICAgICAgc3RkOjpzaXplX3Qgb3B0aW9uX2xlbmd0aCA9IG9wdGlvbl9saXN0LmZpbmQoIiwiKTsKKyAgICAgICAgaWYgKG9wdGlvbl9sZW5ndGggPT0gb3B0aW9uX2xpc3QubnBvcykgeworICAgICAgICAgICAgb3B0aW9uX2xlbmd0aCA9IG9wdGlvbl9saXN0LnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBmaXJzdCBvcHRpb24gaXRlbSBpbiBsaXN0CisgICAgICAgIGNvbnN0IHN0cmluZyBvcHRpb25faXRlbSA9IG9wdGlvbl9saXN0LnN1YnN0cigwLCBvcHRpb25fbGVuZ3RoKTsKKworICAgICAgICBhdXRvIGVudW1fdmFsdWUgPSBlbnVtX2RhdGEuZmluZChvcHRpb25faXRlbSk7CisgICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IGVudW1fZGF0YS5lbmQoKSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gZW51bV92YWx1ZS0+c2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IG9wdGlvbiBmcm9tIG9wdGlvbl9saXN0CisgICAgICAgIG9wdGlvbl9saXN0LmVyYXNlKDAsIG9wdGlvbl9sZW5ndGgpOworICAgICAgICAvLyBSZW1vdmUgcG9zc2libGUgY29tbWEgc2VwYXJhdG9yCisgICAgICAgIHN0ZDo6c2l6ZV90IGNoYXJfcG9zaXRpb24gPSBvcHRpb25fbGlzdC5maW5kKCIsIik7CisgICAgICAgIGlmIChjaGFyX3Bvc2l0aW9uID09IDApIHsKKyAgICAgICAgICAgIG9wdGlvbl9saXN0LmVyYXNlKGNoYXJfcG9zaXRpb24sIDEpOworICAgICAgICB9CisgICAgICAgIC8vIFJlbW92ZSBwb3NzaWJsZSBzcGFjZQorICAgICAgICBjaGFyX3Bvc2l0aW9uID0gb3B0aW9uX2xpc3QuZmluZCgiICIpOworICAgICAgICBpZiAoY2hhcl9wb3NpdGlvbiA9PSAwKSB7CisgICAgICAgICAgICBvcHRpb25fbGlzdC5lcmFzZShjaGFyX3Bvc2l0aW9uLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCB2b2lkIHNldExheWVyT3B0aW9uKGNvbnN0IGNoYXIgKm9wdGlvbiwgY29uc3QgY2hhciAqdmFsdWUpIHsgbGF5ZXJfY29uZmlnLlNldE9wdGlvbihvcHRpb24sIHZhbHVlKTsgfQorCisvLyBDb25zdHJ1Y3RvciBmb3IgQ29uZmlnRmlsZS4gSW5pdGlhbGl6ZSBsYXllcnMgdG8gbG9nIGVycm9yIG1lc3NhZ2VzIHRvIHN0ZG91dCBieSBkZWZhdWx0LiBJZiBhIHZrX2xheWVyX3NldHRpbmdzIGZpbGUgaXMgcHJlc2VudCwKKy8vIGl0cyBzZXR0aW5ncyB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy4KK0NvbmZpZ0ZpbGU6OkNvbmZpZ0ZpbGUoKSA6IGZpbGVfaXNfcGFyc2VkXyhmYWxzZSkgeworICAgIHZhbHVlX21hcF9bImtocm9ub3NfdmFsaWRhdGlvbi5yZXBvcnRfZmxhZ3MiXSA9ICJlcnJvciI7CisKKyNpZmRlZiBXSU4zMgorICAgIC8vIEZvciBXaW5kb3dzLCBlbmFibGUgbWVzc2FnZSBsb2dnaW5nIEFORCBPdXRwdXREZWJ1Z1N0cmluZworICAgIHZhbHVlX21hcF9bImtocm9ub3NfdmFsaWRhdGlvbi5kZWJ1Z19hY3Rpb24iXSA9CisgICAgICAgICJWS19EQkdfTEFZRVJfQUNUSU9OX0RFRkFVTFQsVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHLFZLX0RCR19MQVlFUl9BQ1RJT05fREVCVUdfT1VUUFVUIjsKKyNlbHNlICAgLy8gV0lOMzIKKyAgICB2YWx1ZV9tYXBfWyJraHJvbm9zX3ZhbGlkYXRpb24uZGVidWdfYWN0aW9uIl0gPSAiVktfREJHX0xBWUVSX0FDVElPTl9ERUZBVUxULFZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TRyI7CisjZW5kaWYgIC8vIFdJTjMyCisgICAgdmFsdWVfbWFwX1sia2hyb25vc192YWxpZGF0aW9uLmxvZ19maWxlbmFtZSJdID0gInN0ZG91dCI7Cit9CisKK2NvbnN0IGNoYXIgKkNvbmZpZ0ZpbGU6OkdldE9wdGlvbihjb25zdCBzdHJpbmcgJm9wdGlvbikgeworICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgICAgaWYgKCFmaWxlX2lzX3BhcnNlZF8pIHsKKyAgICAgICAgc3RyaW5nIHNldHRpbmdzX2ZpbGUgPSBGaW5kU2V0dGluZ3MoKTsKKyAgICAgICAgUGFyc2VGaWxlKHNldHRpbmdzX2ZpbGUuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKChpdCA9IHZhbHVlX21hcF8uZmluZChvcHRpb24pKSA9PSB2YWx1ZV9tYXBfLmVuZCgpKQorICAgICAgICByZXR1cm4gIiI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZC5jX3N0cigpOworfQorCit2b2lkIENvbmZpZ0ZpbGU6OlNldE9wdGlvbihjb25zdCBzdHJpbmcgJm9wdGlvbiwgY29uc3Qgc3RyaW5nICZ2YWwpIHsKKyAgICBpZiAoIWZpbGVfaXNfcGFyc2VkXykgeworICAgICAgICBzdHJpbmcgc2V0dGluZ3NfZmlsZSA9IEZpbmRTZXR0aW5ncygpOworICAgICAgICBQYXJzZUZpbGUoc2V0dGluZ3NfZmlsZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICB2YWx1ZV9tYXBfW29wdGlvbl0gPSB2YWw7Cit9CisKK3N0cmluZyBDb25maWdGaWxlOjpGaW5kU2V0dGluZ3MoKSB7CisgICAgc3RydWN0IHN0YXQgaW5mbzsKKworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgSEtFWSBoaXZlOworICAgIExTVEFUVVMgZXJyID0gUmVnT3BlbktleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXEtocm9ub3NcXFZ1bGthblxcU2V0dGluZ3MiLCAwLCBLRVlfUkVBRCwgJmhpdmUpOworICAgIGlmIChlcnIgPT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBjaGFyIG5hbWVbMjA0OF07CisgICAgICAgIERXT1JEIGkgPSAwLCBuYW1lX3NpemUgPSBzaXplb2YobmFtZSksIHR5cGUsIHZhbHVlLCB2YWx1ZV9zaXplID0gc2l6ZW9mKHZhbHVlKTsKKyAgICAgICAgd2hpbGUgKEVSUk9SX1NVQ0NFU1MgPT0KKyAgICAgICAgICAgICAgIFJlZ0VudW1WYWx1ZShoaXZlLCBpKyssIG5hbWUsICZuYW1lX3NpemUsIG51bGxwdHIsICZ0eXBlLCByZWludGVycHJldF9jYXN0PExQQllURT4oJnZhbHVlKSwgJnZhbHVlX3NpemUpKSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVnaXN0cnkgZW50cnkgaXMgYSBkd29yZCB3aXRoIGEgdmFsdWUgb2YgemVybworICAgICAgICAgICAgaWYgKHR5cGUgIT0gUkVHX0RXT1JEIHx8IHZhbHVlICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBhY3R1YWxseSBwb2ludHMgdG8gYSBmaWxlCisgICAgICAgICAgICBpZiAoKHN0YXQobmFtZSwgJmluZm8pICE9IDApIHx8ICEoaW5mby5zdF9tb2RlICYgU19JRlJFRykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXNlIHRoaXMgZmlsZQorICAgICAgICAgICAgUmVnQ2xvc2VLZXkoaGl2ZSk7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFJlZ0Nsb3NlS2V5KGhpdmUpOworICAgIH0KKyNlbHNlCisgICAgc3RyaW5nIHNlYXJjaF9wYXRoID0gR2V0RW52aXJvbm1lbnQoIlhER19EQVRBX0hPTUUiKTsKKyAgICBpZiAoc2VhcmNoX3BhdGggPT0gIiIpIHsKKyAgICAgICAgc2VhcmNoX3BhdGggPSBHZXRFbnZpcm9ubWVudCgiSE9NRSIpOworICAgICAgICBpZiAoc2VhcmNoX3BhdGggIT0gIiIpIHsKKyAgICAgICAgICAgIHNlYXJjaF9wYXRoICs9ICIvLmxvY2FsL3NoYXJlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGUgdmtfbGF5ZXJfc2V0dGluZ3MudHh0IGZpbGUgZnJvbSBoZXJlLCBpZiBpdCBpcyBwcmVzZW50CisgICAgaWYgKHNlYXJjaF9wYXRoICE9ICIiKSB7CisgICAgICAgIHN0cmluZyBob21lX2ZpbGUgPSBzZWFyY2hfcGF0aCArICIvdnVsa2FuL3NldHRpbmdzLmQvdmtfbGF5ZXJfc2V0dGluZ3MudHh0IjsKKyAgICAgICAgaWYgKHN0YXQoaG9tZV9maWxlLmNfc3RyKCksICZpbmZvKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoaW5mby5zdF9tb2RlICYgU19JRlJFRykgeworICAgICAgICAgICAgICAgIHJldHVybiBob21lX2ZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNlbmRpZgorCisgICAgc3RyaW5nIGVudl9wYXRoID0gR2V0RW52aXJvbm1lbnQoIlZLX0xBWUVSX1NFVFRJTkdTX1BBVEgiKTsKKworICAgIC8vIElmIHRoZSBwYXRoIGV4aXN0cyB1c2UgaXQsIGVsc2UgdXNlIHZrX2xheWVyX3NldHRpbmdzCisgICAgaWYgKHN0YXQoZW52X3BhdGguY19zdHIoKSwgJmluZm8pID09IDApIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGRpcmVjdG9yeSwgbG9vayBmb3IgdmtfbGF5ZXJfc2V0dGluZ3Mgd2l0aGluIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgaWYgKGluZm8uc3RfbW9kZSAmIFNfSUZESVIpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnZfcGF0aCArICIvdmtfbGF5ZXJfc2V0dGluZ3MudHh0IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW52X3BhdGg7CisgICAgfQorICAgIHJldHVybiAidmtfbGF5ZXJfc2V0dGluZ3MudHh0IjsKK30KKwordm9pZCBDb25maWdGaWxlOjpQYXJzZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBmaWxlX2lzX3BhcnNlZF8gPSB0cnVlOworCisgICAgLy8gZXh0cmFjdCBvcHRpb24gPSB2YWx1ZSBwYWlycyBmcm9tIGEgZmlsZQorICAgIHN0ZDo6aWZzdHJlYW0gZmlsZShmaWxlbmFtZSk7CisgICAgZm9yIChzdHJpbmcgbGluZTsgc3RkOjpnZXRsaW5lKGZpbGUsIGxpbmUpOykgeworICAgICAgICAvLyBkaXNjYXJkIGNvbW1lbnRzLCB3aGljaCBzdGFydCB3aXRoICcjJworICAgICAgICBjb25zdCBhdXRvIGNvbW1lbnRzX3BvcyA9IGxpbmUuZmluZF9maXJzdF9vZignIycpOworICAgICAgICBpZiAoY29tbWVudHNfcG9zICE9IHN0cmluZzo6bnBvcykgbGluZS5lcmFzZShjb21tZW50c19wb3MpOworCisgICAgICAgIGNvbnN0IGF1dG8gdmFsdWVfcG9zID0gbGluZS5maW5kX2ZpcnN0X29mKCc9Jyk7CisgICAgICAgIGlmICh2YWx1ZV9wb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgb3B0aW9uID0gc3RyaW5nX3RyaW0obGluZS5zdWJzdHIoMCwgdmFsdWVfcG9zKSk7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgdmFsdWUgPSBzdHJpbmdfdHJpbShsaW5lLnN1YnN0cih2YWx1ZV9wb3MgKyAxKSk7CisgICAgICAgICAgICB2YWx1ZV9tYXBfW29wdGlvbl0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworVktfTEFZRVJfRVhQT1JUIHZvaWQgUHJpbnRNZXNzYWdlRmxhZ3MoVmtGbGFncyB2a19mbGFncywgY2hhciAqbXNnX2ZsYWdzKSB7CisgICAgYm9vbCBzZXBhcmF0b3IgPSBmYWxzZTsKKworICAgIG1zZ19mbGFnc1swXSA9IDA7CisgICAgaWYgKHZrX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQpIHsKKyAgICAgICAgc3RyY2F0KG1zZ19mbGFncywgIkRFQlVHIik7CisgICAgICAgIHNlcGFyYXRvciA9IHRydWU7CisgICAgfQorICAgIGlmICh2a19mbGFncyAmIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUKSB7CisgICAgICAgIGlmIChzZXBhcmF0b3IpIHN0cmNhdChtc2dfZmxhZ3MsICIsIik7CisgICAgICAgIHN0cmNhdChtc2dfZmxhZ3MsICJJTkZPIik7CisgICAgICAgIHNlcGFyYXRvciA9IHRydWU7CisgICAgfQorICAgIGlmICh2a19mbGFncyAmIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQpIHsKKyAgICAgICAgaWYgKHNlcGFyYXRvcikgc3RyY2F0KG1zZ19mbGFncywgIiwiKTsKKyAgICAgICAgc3RyY2F0KG1zZ19mbGFncywgIldBUk4iKTsKKyAgICAgICAgc2VwYXJhdG9yID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHZrX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCkgeworICAgICAgICBpZiAoc2VwYXJhdG9yKSBzdHJjYXQobXNnX2ZsYWdzLCAiLCIpOworICAgICAgICBzdHJjYXQobXNnX2ZsYWdzLCAiUEVSRiIpOworICAgICAgICBzZXBhcmF0b3IgPSB0cnVlOworICAgIH0KKyAgICBpZiAodmtfZmxhZ3MgJiBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCkgeworICAgICAgICBpZiAoc2VwYXJhdG9yKSBzdHJjYXQobXNnX2ZsYWdzLCAiLCIpOworICAgICAgICBzdHJjYXQobXNnX2ZsYWdzLCAiRVJST1IiKTsKKyAgICB9Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCB2b2lkIFByaW50TWVzc2FnZVNldmVyaXR5KFZrRmxhZ3MgdmtfZmxhZ3MsIGNoYXIgKm1zZ19mbGFncykgeworICAgIGJvb2wgc2VwYXJhdG9yID0gZmFsc2U7CisKKyAgICBtc2dfZmxhZ3NbMF0gPSAwOworICAgIGlmICh2a19mbGFncyAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfVkVSQk9TRV9CSVRfRVhUKSB7CisgICAgICAgIHN0cmNhdChtc2dfZmxhZ3MsICJWRVJCT1NFIik7CisgICAgICAgIHNlcGFyYXRvciA9IHRydWU7CisgICAgfQorICAgIGlmICh2a19mbGFncyAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUKSB7CisgICAgICAgIGlmIChzZXBhcmF0b3IpIHN0cmNhdChtc2dfZmxhZ3MsICIsIik7CisgICAgICAgIHN0cmNhdChtc2dfZmxhZ3MsICJJTkZPIik7CisgICAgICAgIHNlcGFyYXRvciA9IHRydWU7CisgICAgfQorICAgIGlmICh2a19mbGFncyAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUKSB7CisgICAgICAgIGlmIChzZXBhcmF0b3IpIHN0cmNhdChtc2dfZmxhZ3MsICIsIik7CisgICAgICAgIHN0cmNhdChtc2dfZmxhZ3MsICJXQVJOIik7CisgICAgICAgIHNlcGFyYXRvciA9IHRydWU7CisgICAgfQorICAgIGlmICh2a19mbGFncyAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVCkgeworICAgICAgICBpZiAoc2VwYXJhdG9yKSBzdHJjYXQobXNnX2ZsYWdzLCAiLCIpOworICAgICAgICBzdHJjYXQobXNnX2ZsYWdzLCAiRVJST1IiKTsKKyAgICB9Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCB2b2lkIFByaW50TWVzc2FnZVR5cGUoVmtGbGFncyB2a19mbGFncywgY2hhciAqbXNnX2ZsYWdzKSB7CisgICAgYm9vbCBzZXBhcmF0b3IgPSBmYWxzZTsKKworICAgIG1zZ19mbGFnc1swXSA9IDA7CisgICAgaWYgKHZrX2ZsYWdzICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX0dFTkVSQUxfQklUX0VYVCkgeworICAgICAgICBzdHJjYXQobXNnX2ZsYWdzLCAiR0VOIik7CisgICAgICAgIHNlcGFyYXRvciA9IHRydWU7CisgICAgfQorICAgIGlmICh2a19mbGFncyAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9WQUxJREFUSU9OX0JJVF9FWFQpIHsKKyAgICAgICAgaWYgKHNlcGFyYXRvcikgc3RyY2F0KG1zZ19mbGFncywgIiwiKTsKKyAgICAgICAgc3RyY2F0KG1zZ19mbGFncywgIlNQRUMiKTsKKyAgICAgICAgc2VwYXJhdG9yID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHZrX2ZsYWdzICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1BFUkZPUk1BTkNFX0JJVF9FWFQpIHsKKyAgICAgICAgaWYgKHNlcGFyYXRvcikgc3RyY2F0KG1zZ19mbGFncywgIiwiKTsKKyAgICAgICAgc3RyY2F0KG1zZ19mbGFncywgIlBFUkYiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfY29uZmlnLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1NzE5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19sYXllcl9jb25maWcuaApAQCAtMCwwICsxLDc1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgInZ1bGthbi92a19sYXllci5oIgorI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBEZWZpbml0aW9ucyBmb3IgRGVidWcgQWN0aW9ucwordHlwZWRlZiBlbnVtIFZrTGF5ZXJEYmdBY3Rpb25CaXRzIHsKKyAgICBWS19EQkdfTEFZRVJfQUNUSU9OX0lHTk9SRSA9IDB4MDAwMDAwMDAsCisgICAgVktfREJHX0xBWUVSX0FDVElPTl9DQUxMQkFDSyA9IDB4MDAwMDAwMDEsCisgICAgVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHID0gMHgwMDAwMDAwMiwKKyAgICBWS19EQkdfTEFZRVJfQUNUSU9OX0JSRUFLID0gMHgwMDAwMDAwNCwKKyAgICBWS19EQkdfTEFZRVJfQUNUSU9OX0RFQlVHX09VVFBVVCA9IDB4MDAwMDAwMDgsCisgICAgVktfREJHX0xBWUVSX0FDVElPTl9ERUZBVUxUID0gMHg0MDAwMDAwMCwKK30gVmtMYXllckRiZ0FjdGlvbkJpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVmtMYXllckRiZ0FjdGlvbkZsYWdzOworCitjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFZrRmxhZ3M+IGRlYnVnX2FjdGlvbnNfb3B0aW9uX2RlZmluaXRpb25zID0geworICAgIHtzdGQ6OnN0cmluZygiVktfREJHX0xBWUVSX0FDVElPTl9JR05PUkUiKSwgVktfREJHX0xBWUVSX0FDVElPTl9JR05PUkV9LAorICAgIHtzdGQ6OnN0cmluZygiVktfREJHX0xBWUVSX0FDVElPTl9DQUxMQkFDSyIpLCBWS19EQkdfTEFZRVJfQUNUSU9OX0NBTExCQUNLfSwKKyAgICB7c3RkOjpzdHJpbmcoIlZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TRyIpLCBWS19EQkdfTEFZRVJfQUNUSU9OX0xPR19NU0d9LAorICAgIHtzdGQ6OnN0cmluZygiVktfREJHX0xBWUVSX0FDVElPTl9CUkVBSyIpLCBWS19EQkdfTEFZRVJfQUNUSU9OX0JSRUFLfSwKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIHtzdGQ6OnN0cmluZygiVktfREJHX0xBWUVSX0FDVElPTl9ERUJVR19PVVRQVVQiKSwgVktfREJHX0xBWUVSX0FDVElPTl9ERUJVR19PVVRQVVR9LAorI2VuZGlmCisgICAge3N0ZDo6c3RyaW5nKCJWS19EQkdfTEFZRVJfQUNUSU9OX0RFRkFVTFQiKSwgVktfREJHX0xBWUVSX0FDVElPTl9ERUZBVUxUfX07CisKK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgVmtGbGFncz4gcmVwb3J0X2ZsYWdzX29wdGlvbl9kZWZpbml0aW9ucyA9IHsKKyAgICB7c3RkOjpzdHJpbmcoIndhcm4iKSwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVH0sCisgICAge3N0ZDo6c3RyaW5nKCJpbmZvIiksIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUfSwKKyAgICB7c3RkOjpzdHJpbmcoInBlcmYiKSwgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVH0sCisgICAge3N0ZDo6c3RyaW5nKCJlcnJvciIpLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVH0sCisgICAge3N0ZDo6c3RyaW5nKCJkZWJ1ZyIpLCBWS19ERUJVR19SRVBPUlRfREVCVUdfQklUX0VYVH19OworCitWS19MQVlFUl9FWFBPUlQgY29uc3QgY2hhciAqZ2V0TGF5ZXJPcHRpb24oY29uc3QgY2hhciAqb3B0aW9uKTsKK1ZLX0xBWUVSX0VYUE9SVCBjb25zdCBjaGFyICpHZXRMYXllckVudlZhcihjb25zdCBjaGFyICpvcHRpb24pOworCitWS19MQVlFUl9FWFBPUlQgRklMRSAqZ2V0TGF5ZXJMb2dPdXRwdXQoY29uc3QgY2hhciAqb3B0aW9uLCBjb25zdCBjaGFyICpsYXllcl9uYW1lKTsKK1ZLX0xBWUVSX0VYUE9SVCBWa0ZsYWdzIEdldExheWVyT3B0aW9uRmxhZ3Moc3RkOjpzdHJpbmcgb3B0aW9uLCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFZrRmxhZ3M+IGNvbnN0ICZlbnVtX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9wdGlvbl9kZWZhdWx0KTsKKworVktfTEFZRVJfRVhQT1JUIHZvaWQgc2V0TGF5ZXJPcHRpb24oY29uc3QgY2hhciAqb3B0aW9uLCBjb25zdCBjaGFyICp2YWwpOworVktfTEFZRVJfRVhQT1JUIHZvaWQgUHJpbnRNZXNzYWdlRmxhZ3MoVmtGbGFncyB2a19mbGFncywgY2hhciAqbXNnX2ZsYWdzKTsKK1ZLX0xBWUVSX0VYUE9SVCB2b2lkIFByaW50TWVzc2FnZVNldmVyaXR5KFZrRmxhZ3MgdmtfZmxhZ3MsIGNoYXIgKm1zZ19mbGFncyk7CitWS19MQVlFUl9FWFBPUlQgdm9pZCBQcmludE1lc3NhZ2VUeXBlKFZrRmxhZ3MgdmtfZmxhZ3MsIGNoYXIgKm1zZ19mbGFncyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfZGF0YS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODIyZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX2RhdGEuaApAQCAtMCwwICsxLDM5MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorICovCisKKyNpZm5kZWYgTEFZRVJfREFUQV9ICisjZGVmaW5lIExBWUVSX0RBVEFfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKy8vIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCB1bm9yZGVyZWRfbWFwIHRoYXQgb3B0aW1pemVzIGZvciB0aGUgY29tbW9uIGNhc2UKKy8vIG9mIG9ubHkgY29udGFpbmluZyBhIHNtYWxsIG51bWJlciBvZiBlbGVtZW50cy4gVGhlIGZpcnN0IE4gZWxlbWVudHMgYXJlIHN0b3JlZAorLy8gaW5saW5lIGluIHRoZSBvYmplY3QgYW5kIGRvbid0IHJlcXVpcmUgaGFzaGluZyBvciBtZW1vcnkgKGRlKWFsbG9jYXRpb24uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIHZhbHVlX3R5cGUsIHR5cGVuYW1lIGlubmVyX2NvbnRhaW5lcl90eXBlLCB0eXBlbmFtZSB2YWx1ZV90eXBlX2hlbHBlciwgaW50IE4+CitjbGFzcyBzbWFsbF9jb250YWluZXIgeworICBwcm90ZWN0ZWQ6CisgICAgYm9vbCBzbWFsbF9kYXRhX2FsbG9jYXRlZFtOXTsKKyAgICB2YWx1ZV90eXBlIHNtYWxsX2RhdGFbTl07CisKKyAgICBpbm5lcl9jb250YWluZXJfdHlwZSBpbm5lcl9jb250OworCisgIHB1YmxpYzoKKyAgICBzbWFsbF9jb250YWluZXIoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgICAgICBzbWFsbF9kYXRhX2FsbG9jYXRlZFtpXSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGlubmVyX2NvbnRhaW5lcl90eXBlOjppdGVyYXRvciBpbm5lcl9pdGVyYXRvcjsKKyAgICAgICAgZnJpZW5kIGNsYXNzIHNtYWxsX2NvbnRhaW5lcjxLZXksIHZhbHVlX3R5cGUsIGlubmVyX2NvbnRhaW5lcl90eXBlLCB2YWx1ZV90eXBlX2hlbHBlciwgTj47CisKKyAgICAgICAgc21hbGxfY29udGFpbmVyPEtleSwgdmFsdWVfdHlwZSwgaW5uZXJfY29udGFpbmVyX3R5cGUsIHZhbHVlX3R5cGVfaGVscGVyLCBOPiAqcGFyZW50OworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIGlubmVyX2l0ZXJhdG9yIGl0OworCisgICAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCkge30KKworICAgICAgICBpdGVyYXRvciBvcGVyYXRvcisrKCkgeworICAgICAgICAgICAgaWYgKGluZGV4IDwgTikgeworICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgTiAmJiAhcGFyZW50LT5zbWFsbF9kYXRhX2FsbG9jYXRlZFtpbmRleF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGl0ID0gcGFyZW50LT5pbm5lcl9jb250LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICgoaW5kZXggPCBOKSAhPSAob3RoZXIuaW5kZXggPCBOKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmRleCA8IE4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4ID09IG90aGVyLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpdCA9PSBvdGhlci5pdDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgICAgICAgdmFsdWVfdHlwZSAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgICAgICAgaWYgKGluZGV4IDwgTikgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQtPnNtYWxsX2RhdGFbaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICppdDsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZV90eXBlICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgICAgICAgICAgaWYgKGluZGV4IDwgTikgeworICAgICAgICAgICAgICAgIHJldHVybiAmcGFyZW50LT5zbWFsbF9kYXRhW2luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAmKml0OworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbm5lcl9jb250YWluZXJfdHlwZTo6Y29uc3RfaXRlcmF0b3IgaW5uZXJfaXRlcmF0b3I7CisgICAgICAgIGZyaWVuZCBjbGFzcyBzbWFsbF9jb250YWluZXI8S2V5LCB2YWx1ZV90eXBlLCBpbm5lcl9jb250YWluZXJfdHlwZSwgdmFsdWVfdHlwZV9oZWxwZXIsIE4+OworCisgICAgICAgIGNvbnN0IHNtYWxsX2NvbnRhaW5lcjxLZXksIHZhbHVlX3R5cGUsIGlubmVyX2NvbnRhaW5lcl90eXBlLCB2YWx1ZV90eXBlX2hlbHBlciwgTj4gKnBhcmVudDsKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICBpbm5lcl9pdGVyYXRvciBpdDsKKworICAgICAgcHVibGljOgorICAgICAgICBjb25zdF9pdGVyYXRvcigpIHt9CisKKyAgICAgICAgY29uc3RfaXRlcmF0b3Igb3BlcmF0b3IrKygpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IE4pIHsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IE4gJiYgIXBhcmVudC0+c21hbGxfZGF0YV9hbGxvY2F0ZWRbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IE4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpdCA9IHBhcmVudC0+aW5uZXJfY29udC5iZWdpbigpOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICAgICAgICBpZiAoKGluZGV4IDwgTikgIT0gKG90aGVyLmluZGV4IDwgTikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXggPCBOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbmRleCA9PSBvdGhlci5pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXQgPT0gb3RoZXIuaXQ7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IE4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LT5zbWFsbF9kYXRhW2luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqaXQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgdmFsdWVfdHlwZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IE4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJnBhcmVudC0+c21hbGxfZGF0YVtpbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gJippdDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIHsKKyAgICAgICAgaXRlcmF0b3IgaXQ7CisgICAgICAgIGl0LnBhcmVudCA9IHRoaXM7CisgICAgICAgIC8vIElmIGluZGV4IDAgaXMgYWxsb2NhdGVkLCByZXR1cm4gaXQsIG90aGVyd2lzZSB1c2Ugb3BlcmF0b3IrKyB0byBmaW5kIHRoZSBmaXJzdAorICAgICAgICAvLyBhbGxvY2F0ZWQgZWxlbWVudC4KKyAgICAgICAgaXQuaW5kZXggPSAwOworICAgICAgICBpZiAoc21hbGxfZGF0YV9hbGxvY2F0ZWRbMF0pIHsKKyAgICAgICAgICAgIHJldHVybiBpdDsKKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgICAgICByZXR1cm4gaXQ7CisgICAgfQorCisgICAgaXRlcmF0b3IgZW5kKCkgeworICAgICAgICBpdGVyYXRvciBpdDsKKyAgICAgICAgaXQucGFyZW50ID0gdGhpczsKKyAgICAgICAgaXQuaW5kZXggPSBOOworICAgICAgICBpdC5pdCA9IGlubmVyX2NvbnQuZW5kKCk7CisgICAgICAgIHJldHVybiBpdDsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgaXQ7CisgICAgICAgIGl0LnBhcmVudCA9IHRoaXM7CisgICAgICAgIC8vIElmIGluZGV4IDAgaXMgYWxsb2NhdGVkLCByZXR1cm4gaXQsIG90aGVyd2lzZSB1c2Ugb3BlcmF0b3IrKyB0byBmaW5kIHRoZSBmaXJzdAorICAgICAgICAvLyBhbGxvY2F0ZWQgZWxlbWVudC4KKyAgICAgICAgaXQuaW5kZXggPSAwOworICAgICAgICBpZiAoc21hbGxfZGF0YV9hbGxvY2F0ZWRbMF0pIHsKKyAgICAgICAgICAgIHJldHVybiBpdDsKKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgICAgICByZXR1cm4gaXQ7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgICAgICBjb25zdF9pdGVyYXRvciBpdDsKKyAgICAgICAgaXQucGFyZW50ID0gdGhpczsKKyAgICAgICAgaXQuaW5kZXggPSBOOworICAgICAgICBpdC5pdCA9IGlubmVyX2NvbnQuZW5kKCk7CisgICAgICAgIHJldHVybiBpdDsKKyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IEtleSAma2V5KSBjb25zdCB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgICAgICBpZiAodmFsdWVfdHlwZV9oZWxwZXIoKS5jb21wYXJlX2VxdWFsKHNtYWxsX2RhdGFbaV0sIGtleSkgJiYgc21hbGxfZGF0YV9hbGxvY2F0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBzaXplKCkgZmlyc3QgdG8gYXZvaWQgaGFzaGluZyBrZXkgdW5uZWNlc3NhcmlseS4KKyAgICAgICAgaWYgKGlubmVyX2NvbnQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5uZXJfY29udC5maW5kKGtleSkgIT0gaW5uZXJfY29udC5lbmQoKTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBpbm5lcl9jb250YWluZXJfdHlwZTo6c2l6ZV90eXBlIGNvdW50KGNvbnN0IEtleSAma2V5KSBjb25zdCB7IHJldHVybiBjb250YWlucyhrZXkpID8gMSA6IDA7IH0KKworICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUgJnZhbHVlKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgICAgICBpZiAodmFsdWVfdHlwZV9oZWxwZXIoKS5jb21wYXJlX2VxdWFsKHNtYWxsX2RhdGFbaV0sIHZhbHVlKSAmJiBzbWFsbF9kYXRhX2FsbG9jYXRlZFtpXSkgeworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0OworICAgICAgICAgICAgICAgIGl0LnBhcmVudCA9IHRoaXM7CisgICAgICAgICAgICAgICAgaXQuaW5kZXggPSBpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIHNpemUoKSBmaXJzdCB0byBhdm9pZCBoYXNoaW5nIGtleSB1bm5lY2Vzc2FyaWx5LgorICAgICAgICBhdXRvIGl0ZXIgPSBpbm5lcl9jb250LnNpemUoKSA+IDAgPyBpbm5lcl9jb250LmZpbmQodmFsdWVfdHlwZV9oZWxwZXIoKS5nZXRfa2V5KHZhbHVlKSkgOiBpbm5lcl9jb250LmVuZCgpOworICAgICAgICBpZiAoaXRlciAhPSBpbm5lcl9jb250LmVuZCgpKSB7CisgICAgICAgICAgICBpdGVyYXRvciBpdDsKKyAgICAgICAgICAgIGl0LnBhcmVudCA9IHRoaXM7CisgICAgICAgICAgICBpdC5pbmRleCA9IE47CisgICAgICAgICAgICBpdC5pdCA9IGl0ZXI7CisgICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXQsIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzbWFsbF9kYXRhX2FsbG9jYXRlZFtpXSkgeworICAgICAgICAgICAgICAgICAgICBzbWFsbF9kYXRhX2FsbG9jYXRlZFtpXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGVfaGVscGVyKCkuYXNzaWduKHNtYWxsX2RhdGFbaV0sIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXQ7CisgICAgICAgICAgICAgICAgICAgIGl0LnBhcmVudCA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgIGl0LmluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVyID0gaW5uZXJfY29udC5pbnNlcnQodmFsdWUpLmZpcnN0OworICAgICAgICAgICAgaXRlcmF0b3IgaXQ7CisgICAgICAgICAgICBpdC5wYXJlbnQgPSB0aGlzOworICAgICAgICAgICAgaXQuaW5kZXggPSBOOworICAgICAgICAgICAgaXQuaXQgPSBpdGVyOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0LCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHR5cGVuYW1lIGlubmVyX2NvbnRhaW5lcl90eXBlOjpzaXplX3R5cGUgZXJhc2UoY29uc3QgS2V5ICZrZXkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZV90eXBlX2hlbHBlcigpLmNvbXBhcmVfZXF1YWwoc21hbGxfZGF0YVtpXSwga2V5KSAmJiBzbWFsbF9kYXRhX2FsbG9jYXRlZFtpXSkgeworICAgICAgICAgICAgICAgIHNtYWxsX2RhdGFfYWxsb2NhdGVkW2ldID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlubmVyX2NvbnQuZXJhc2Uoa2V5KTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBpbm5lcl9jb250YWluZXJfdHlwZTo6c2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgICAgIGF1dG8gc2l6ZSA9IGlubmVyX2NvbnQuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47ICsraSkgeworICAgICAgICAgICAgaWYgKHNtYWxsX2RhdGFfYWxsb2NhdGVkW2ldKSB7CisgICAgICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgICAgICBpZiAoc21hbGxfZGF0YV9hbGxvY2F0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlubmVyX2NvbnQuc2l6ZSgpID09IDA7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICAgICAgICAgIHNtYWxsX2RhdGFfYWxsb2NhdGVkW2ldID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW5uZXJfY29udC5jbGVhcigpOworICAgIH0KK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiBvYmplY3RzIHRvIGNvbXBhcmUvYXNzaWduL2dldCBrZXlzIGluIHNtYWxsX3Vub3JkZXJlZF9zZXQvbWFwLgorLy8gVGhpcyBoZWxwcyB0byBhYnN0cmFjdCBhd2F5IHdoZXRoZXIgdmFsdWVfdHlwZSBpcyBhIEtleSBvciBhIHBhaXI8S2V5LCBUPi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+CitjbGFzcyB2YWx1ZV90eXBlX2hlbHBlcl9tYXAgeworICBwdWJsaWM6CisgICAgYm9vbCBjb21wYXJlX2VxdWFsKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBLZXksIFQ+ICZsaHMsIGNvbnN0IEtleSAmcmhzKSBjb25zdCB7IHJldHVybiBsaHMuZmlyc3QgPT0gcmhzOyB9CisgICAgYm9vbCBjb21wYXJlX2VxdWFsKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBLZXksIFQ+ICZsaHMsIGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBLZXksIFQ+ICZyaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxocy5maXJzdCA9PSByaHMuZmlyc3Q7CisgICAgfQorCisgICAgdm9pZCBhc3NpZ24oc3RkOjpwYWlyPGNvbnN0IEtleSwgVD4gJmxocywgY29uc3Qgc3RkOjpwYWlyPEtleSwgVD4gJnJocykgY29uc3QgeworICAgICAgICAvLyBXaGlsZSB0aGUgY29uc3RfY2FzdCBtYXkgYmUgdW5zYXRpc2ZhY3RvcnksIHdlIGFyZSB1c2luZyBzbWFsbF9kYXRhIGFzCisgICAgICAgIC8vIHN0YW5kLWluIGZvciBwbGFjZW1lbnQgbmV3IGFuZCBhIHNtYWxsLWJsb2NrIGFsbG9jYXRvciwgc28gdGhlIGNvbnN0X2Nhc3QKKyAgICAgICAgLy8gaXMgbWluaW1hbCwgY29udGFpbmVkLCB2YWxpZCwgYW5kIGFsbG93cyBvcGVyYXRvcnMgKiBhbmQgLT4gdG8gYXZvaWQgY29waWVzCisgICAgICAgIGNvbnN0X2Nhc3Q8S2V5ICY+KGxocy5maXJzdCkgPSByaHMuZmlyc3Q7CisgICAgICAgIGxocy5zZWNvbmQgPSByaHMuc2Vjb25kOworICAgIH0KKworICAgIEtleSBnZXRfa2V5KGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBLZXksIFQ+ICZ2YWx1ZSkgY29uc3QgeyByZXR1cm4gdmFsdWUuZmlyc3Q7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitjbGFzcyB2YWx1ZV90eXBlX2hlbHBlcl9zZXQgeworICBwdWJsaWM6CisgICAgYm9vbCBjb21wYXJlX2VxdWFsKGNvbnN0IEtleSAmbGhzLCBjb25zdCBLZXkgJnJocykgY29uc3QgeyByZXR1cm4gbGhzID09IHJoczsgfQorCisgICAgdm9pZCBhc3NpZ24oS2V5ICZsaHMsIGNvbnN0IEtleSAmcmhzKSBjb25zdCB7IGxocyA9IHJoczsgfQorCisgICAgS2V5IGdldF9rZXkoY29uc3QgS2V5ICZ2YWx1ZSkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsIGludCBOID0gMT4KK2NsYXNzIHNtYWxsX3Vub3JkZXJlZF9tYXAKKyAgICA6IHB1YmxpYyBzbWFsbF9jb250YWluZXI8S2V5LCBzdGQ6OnBhaXI8Y29uc3QgS2V5LCBUPiwgc3RkOjp1bm9yZGVyZWRfbWFwPEtleSwgVD4sIHZhbHVlX3R5cGVfaGVscGVyX21hcDxLZXksIFQ+LCBOPiB7CisgIHB1YmxpYzoKKyAgICBUICZvcGVyYXRvcltdKGNvbnN0IEtleSAma2V5KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgICAgICBpZiAodmFsdWVfdHlwZV9oZWxwZXJfbWFwPEtleSwgVD4oKS5jb21wYXJlX2VxdWFsKHRoaXMtPnNtYWxsX2RhdGFbaV0sIGtleSkgJiYgdGhpcy0+c21hbGxfZGF0YV9hbGxvY2F0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c21hbGxfZGF0YVtpXS5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXV0byBpdGVyID0gdGhpcy0+aW5uZXJfY29udC5maW5kKGtleSk7CisgICAgICAgIGlmIChpdGVyICE9IHRoaXMtPmlubmVyX2NvbnQuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghdGhpcy0+c21hbGxfZGF0YV9hbGxvY2F0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy0+c21hbGxfZGF0YV9hbGxvY2F0ZWRbaV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlX2hlbHBlcl9tYXA8S2V5LCBUPigpLmFzc2lnbih0aGlzLT5zbWFsbF9kYXRhW2ldLCBzdGQ6Om1ha2VfcGFpcihrZXksIFQoKSkpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5zbWFsbF9kYXRhW2ldLnNlY29uZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpcy0+aW5uZXJfY29udFtrZXldOworICAgICAgICB9CisgICAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgaW50IE4gPSAxPgorY2xhc3Mgc21hbGxfdW5vcmRlcmVkX3NldCA6IHB1YmxpYyBzbWFsbF9jb250YWluZXI8S2V5LCBLZXksIHN0ZDo6dW5vcmRlcmVkX3NldDxLZXk+LCB2YWx1ZV90eXBlX2hlbHBlcl9zZXQ8S2V5PiwgTj4ge307CisKKy8vIEZvciB0aGUgZ2l2ZW4gZGF0YSBrZXksIGxvb2sgdXAgdGhlIGxheWVyX2RhdGEgaW5zdGFuY2UgZnJvbSBnaXZlbiBsYXllcl9kYXRhX21hcAordGVtcGxhdGUgPHR5cGVuYW1lIERBVEFfVD4KK0RBVEFfVCAqR2V0TGF5ZXJEYXRhUHRyKHZvaWQgKmRhdGFfa2V5LCBzbWFsbF91bm9yZGVyZWRfbWFwPHZvaWQgKiwgREFUQV9UICosIDI+ICZsYXllcl9kYXRhX21hcCkgeworICAgIC8qIFRPRE86IFdlIHByb2JhYmx5IHNob3VsZCBsb2NrIGhlcmUsIG9yIGhhdmUgY2FsbGVyIGxvY2sgKi8KKyAgICBEQVRBX1QgKiZnb3QgPSBsYXllcl9kYXRhX21hcFtkYXRhX2tleV07CisKKyAgICBpZiAoZ290ID09IG51bGxwdHIpIHsKKyAgICAgICAgZ290ID0gbmV3IERBVEFfVDsKKyAgICB9CisKKyAgICByZXR1cm4gZ290OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgREFUQV9UPgordm9pZCBGcmVlTGF5ZXJEYXRhUHRyKHZvaWQgKmRhdGFfa2V5LCBzbWFsbF91bm9yZGVyZWRfbWFwPHZvaWQgKiwgREFUQV9UICosIDI+ICZsYXllcl9kYXRhX21hcCkgeworICAgIGRlbGV0ZSBsYXllcl9kYXRhX21hcFtkYXRhX2tleV07CisgICAgbGF5ZXJfZGF0YV9tYXAuZXJhc2UoZGF0YV9rZXkpOworfQorCisvLyBGb3IgdGhlIGdpdmVuIGRhdGEga2V5LCBsb29rIHVwIHRoZSBsYXllcl9kYXRhIGluc3RhbmNlIGZyb20gZ2l2ZW4gbGF5ZXJfZGF0YV9tYXAKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQVRBX1Q+CitEQVRBX1QgKkdldExheWVyRGF0YVB0cih2b2lkICpkYXRhX2tleSwgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQgKiwgREFUQV9UICo+ICZsYXllcl9kYXRhX21hcCkgeworICAgIERBVEFfVCAqZGVidWdfZGF0YTsKKyAgICB0eXBlbmFtZSBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBEQVRBX1QgKj46OmNvbnN0X2l0ZXJhdG9yIGdvdDsKKworICAgIC8qIFRPRE86IFdlIHByb2JhYmx5IHNob3VsZCBsb2NrIGhlcmUsIG9yIGhhdmUgY2FsbGVyIGxvY2sgKi8KKyAgICBnb3QgPSBsYXllcl9kYXRhX21hcC5maW5kKGRhdGFfa2V5KTsKKworICAgIGlmIChnb3QgPT0gbGF5ZXJfZGF0YV9tYXAuZW5kKCkpIHsKKyAgICAgICAgZGVidWdfZGF0YSA9IG5ldyBEQVRBX1Q7CisgICAgICAgIGxheWVyX2RhdGFfbWFwWyh2b2lkICopZGF0YV9rZXldID0gZGVidWdfZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1Z19kYXRhID0gZ290LT5zZWNvbmQ7CisgICAgfQorCisgICAgcmV0dXJuIGRlYnVnX2RhdGE7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQVRBX1Q+Cit2b2lkIEZyZWVMYXllckRhdGFQdHIodm9pZCAqZGF0YV9rZXksIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIERBVEFfVCAqPiAmbGF5ZXJfZGF0YV9tYXApIHsKKyAgICBhdXRvIGdvdCA9IGxheWVyX2RhdGFfbWFwLmZpbmQoZGF0YV9rZXkpOworICAgIGFzc2VydChnb3QgIT0gbGF5ZXJfZGF0YV9tYXAuZW5kKCkpOworCisgICAgZGVsZXRlIGdvdC0+c2Vjb25kOworICAgIGxheWVyX2RhdGFfbWFwLmVyYXNlKGdvdCk7Cit9CisKKyNlbmRpZiAgLy8gTEFZRVJfREFUQV9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19sYXllcl9leHRlbnNpb25fdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWUzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcApAQCAtMCwwICsxLDY2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmgiCisKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBsYXllcnMKKyAqLworCitWS19MQVlFUl9FWFBPUlQgVmtSZXN1bHQgdXRpbF9HZXRFeHRlbnNpb25Qcm9wZXJ0aWVzKGNvbnN0IHVpbnQzMl90IGNvdW50LCBjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKmxheWVyX2V4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICB1aW50MzJfdCBjb3B5X3NpemU7CisKKyAgICBpZiAocFByb3BlcnRpZXMgPT0gTlVMTCB8fCBsYXllcl9leHRlbnNpb25zID09IE5VTEwpIHsKKyAgICAgICAgKnBDb3VudCA9IGNvdW50OworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBjb3B5X3NpemUgPSAqcENvdW50IDwgY291bnQgPyAqcENvdW50IDogY291bnQ7CisgICAgbWVtY3B5KHBQcm9wZXJ0aWVzLCBsYXllcl9leHRlbnNpb25zLCBjb3B5X3NpemUgKiBzaXplb2YoVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKSk7CisgICAgKnBDb3VudCA9IGNvcHlfc2l6ZTsKKyAgICBpZiAoY29weV9zaXplIDwgY291bnQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0lOQ09NUExFVEU7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWa1Jlc3VsdCB1dGlsX0dldExheWVyUHJvcGVydGllcyhjb25zdCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtMYXllclByb3BlcnRpZXMgKmxheWVyX3Byb3BlcnRpZXMsIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgdWludDMyX3QgY29weV9zaXplOworCisgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwgfHwgbGF5ZXJfcHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgICpwQ291bnQgPSBjb3VudDsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgY29weV9zaXplID0gKnBDb3VudCA8IGNvdW50ID8gKnBDb3VudCA6IGNvdW50OworICAgIG1lbWNweShwUHJvcGVydGllcywgbGF5ZXJfcHJvcGVydGllcywgY29weV9zaXplICogc2l6ZW9mKFZrTGF5ZXJQcm9wZXJ0aWVzKSk7CisgICAgKnBDb3VudCA9IGNvcHlfc2l6ZTsKKyAgICBpZiAoY29weV9zaXplIDwgY291bnQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0lOQ09NUExFVEU7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1MWMxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19sYXllcl9leHRlbnNpb25fdXRpbHMuaApAQCAtMCwwICsxLDQwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisKKyNpZm5kZWYgTEFZRVJfRVhURU5TSU9OX1VUSUxTX0gKKyNkZWZpbmUgTEFZRVJfRVhURU5TSU9OX1VUSUxTX0gKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYVswXSkpCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGdlbmVyYXRlZCBsYXllcnMKKyAqLworZXh0ZXJuICJDIiB7CisKK1ZLX0xBWUVSX0VYUE9SVCBWa1Jlc3VsdCB1dGlsX0dldEV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgdWludDMyX3QgY291bnQsIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqbGF5ZXJfZXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcyk7CisKK1ZLX0xBWUVSX0VYUE9SVCBWa1Jlc3VsdCB1dGlsX0dldExheWVyUHJvcGVydGllcyhjb25zdCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtMYXllclByb3BlcnRpZXMgKmxheWVyX3Byb3BlcnRpZXMsIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKTsKKworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmICAvLyBMQVlFUl9FWFRFTlNJT05fVVRJTFNfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX2xvZ2dpbmcuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19sYXllcl9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmN2I4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19sYXllcl9sb2dnaW5nLmgKQEAgLTAsMCArMSw4ODQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIFlvdW5nIDxtYXJreUBsdW5hcmcuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpZm5kZWYgTEFZRVJfTE9HR0lOR19ICisjZGVmaW5lIExBWUVSX0xPR0dJTkdfSAorCisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAidmtfdHlwZW1hcF9oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9jb25maWcuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9kYXRhLmgiCisjaW5jbHVkZSAidmtfbG9hZGVyX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisjaW5jbHVkZSAidmtfb2JqZWN0X3R5cGVzLmgiCisjaW5jbHVkZSAiY2FzdF91dGlscy5oIgorI2luY2x1ZGUgInZrX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZXMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9kaXNwYXRjaF90YWJsZS5oIgorI2luY2x1ZGUgInZrX3NhZmVfc3RydWN0LmgiCisKKy8vIFN1cHByZXNzIHVudXNlZCB3YXJuaW5nIG9uIExpbnV4CisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgREVDT1JBVEVfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBERUNPUkFURV9VTlVTRUQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjZGVmaW5lIExPR0NPTlNPTEUoLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiVkFMSURBVElPTiIsIF9fVkFfQVJHU19fKSkKKyNlbHNlCisjZGVmaW5lIExPR0NPTlNPTEUoLi4uKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYoX19WQV9BUkdTX18pOyBcCisgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgIFwKKyAgICB9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRFVuZGVmaW5lZCA9ICJWVUlEX1VuZGVmaW5lZCI7CisKKyN1bmRlZiBERUNPUkFURV9VTlVTRUQKKwordHlwZWRlZiBlbnVtIERlYnVnQ2FsbGJhY2tTdGF0dXNCaXRzIHsKKyAgICBERUJVR19DQUxMQkFDS19VVElMUyA9IDB4MDAwMDAwMDEsICAgICAvLyBUaGlzIHN0cnVjdCBkZXNjcmliZXMgYSBWS19FWFRfZGVidWdfdXRpbHMgY2FsbGJhY2sKKyAgICBERUJVR19DQUxMQkFDS19ERUZBVUxUID0gMHgwMDAwMDAwMiwgICAvLyBBbiBpbnRlcm5hbGx5IGNyZWF0ZWQgY2FsbGJhY2ssIHVzZWQgaWYgbm8gdXNlci1kZWZpbmVkIGNhbGxiYWNrcyBhcmUgcmVnaXN0ZXJlZAorICAgIERFQlVHX0NBTExCQUNLX0lOU1RBTkNFID0gMHgwMDAwMDAwNCwgIC8vIEFuIGludGVybmFsbHkgY3JlYXRlZCB0ZW1wb3JhcnkgaW5zdGFuY2UgY2FsbGJhY2sKK30gRGVidWdDYWxsYmFja1N0YXR1c0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgRGVidWdDYWxsYmFja1N0YXR1c0ZsYWdzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRGVidWdDYWxsYmFja1N0YXR1c0ZsYWdzIGNhbGxiYWNrX3N0YXR1czsKKworICAgIC8vIERlYnVnIHJlcG9ydCByZWxhdGVkIGluZm9ybWF0aW9uCisgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIGRlYnVnX3JlcG9ydF9jYWxsYmFja19vYmplY3Q7CisgICAgUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBkZWJ1Z19yZXBvcnRfY2FsbGJhY2tfZnVuY3Rpb25fcHRyOworICAgIFZrRmxhZ3MgZGVidWdfcmVwb3J0X21zZ19mbGFnczsKKworICAgIC8vIERlYnVnIHV0aWxzIHJlbGF0ZWQgaW5mb3JtYXRpb24KKyAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgZGVidWdfdXRpbHNfY2FsbGJhY2tfb2JqZWN0OworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdzRVhUIGRlYnVnX3V0aWxzX21zZ19mbGFnczsKKyAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUIGRlYnVnX3V0aWxzX21zZ190eXBlOworICAgIFBGTl92a0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0VYVCBkZWJ1Z191dGlsc19jYWxsYmFja19mdW5jdGlvbl9wdHI7CisKKyAgICB2b2lkICpwVXNlckRhdGE7CisKKyAgICBib29sIElzVXRpbHMoKSB7IHJldHVybiAoKGNhbGxiYWNrX3N0YXR1cyAmIERFQlVHX0NBTExCQUNLX1VUSUxTKSAhPSAwKTsgfQorICAgIGJvb2wgSXNEZWZhdWx0KCkgeyByZXR1cm4gKChjYWxsYmFja19zdGF0dXMgJiBERUJVR19DQUxMQkFDS19ERUZBVUxUKSAhPSAwKTsgfQorICAgIGJvb2wgSXNJbnN0YW5jZSgpIHsgcmV0dXJuICgoY2FsbGJhY2tfc3RhdHVzICYgREVCVUdfQ0FMTEJBQ0tfSU5TVEFOQ0UpICE9IDApOyB9Cit9IFZrTGF5ZXJEYmdGdW5jdGlvblN0YXRlOworCisvLyBUT0RPOiBDb3VsZCBiZSBhdXRvZ2VuZXJhdGVkIGZvciB0aGUgc3BlY2lmaWMgaGFuZGxlcyBmb3IgZXh0cmEgdHlwZSBzYWZldHkuLi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBIQU5ETEVfVD4KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgSGFuZGxlVG9VaW50NjQoSEFORExFX1QgaCkgeworICAgIHJldHVybiBDYXN0VG9VaW50NjQ8SEFORExFX1Q+KGgpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IEhhbmRsZVRvVWludDY0KHVpbnQ2NF90IGgpIHsgcmV0dXJuIGg7IH0KKworLy8gRGF0YSB3ZSBzdG9yZSBwZXIgbGFiZWwgZm9yIGxvZ2dpbmcKK3N0cnVjdCBMb2dnaW5nTGFiZWwgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgc3RkOjphcnJheTxmbG9hdCwgND4gY29sb3I7CisKKyAgICB2b2lkIFJlc2V0KCkgeyAqdGhpcyA9IExvZ2dpbmdMYWJlbCgpOyB9CisgICAgYm9vbCBFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG5hbWUuZW1wdHkoKTsgfQorCisgICAgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgRXhwb3J0KCkgY29uc3QgeworICAgICAgICBhdXRvIG91dCA9IGx2bF9pbml0X3N0cnVjdDxWa0RlYnVnVXRpbHNMYWJlbEVYVD4oKTsKKyAgICAgICAgb3V0LnBMYWJlbE5hbWUgPSBuYW1lLmNfc3RyKCk7CisgICAgICAgIHN0ZDo6Y29weShjb2xvci5jYmVnaW4oKSwgY29sb3IuY2VuZCgpLCBvdXQuY29sb3IpOworICAgICAgICByZXR1cm4gb3V0OworICAgIH07CisKKyAgICBMb2dnaW5nTGFiZWwoKSA6IG5hbWUoKSwgY29sb3Ioe3swLmYsIDAuZiwgMC5mLCAwLmZ9fSkge30KKyAgICBMb2dnaW5nTGFiZWwoY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgKmxhYmVsX2luZm8pIHsKKyAgICAgICAgaWYgKGxhYmVsX2luZm8gJiYgbGFiZWxfaW5mby0+cExhYmVsTmFtZSkgeworICAgICAgICAgICAgbmFtZSA9IGxhYmVsX2luZm8tPnBMYWJlbE5hbWU7CisgICAgICAgICAgICBzdGQ6OmNvcHlfbihzdGQ6OmJlZ2luKGxhYmVsX2luZm8tPmNvbG9yKSwgNCwgY29sb3IuYmVnaW4oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSZXNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgTG9nZ2luZ0xhYmVsKGNvbnN0IExvZ2dpbmdMYWJlbCAmKSA9IGRlZmF1bHQ7CisgICAgTG9nZ2luZ0xhYmVsICZvcGVyYXRvcj0oY29uc3QgTG9nZ2luZ0xhYmVsICYpID0gZGVmYXVsdDsKKyAgICBMb2dnaW5nTGFiZWwgJm9wZXJhdG9yPShMb2dnaW5nTGFiZWwgJiYpID0gZGVmYXVsdDsKKyAgICBMb2dnaW5nTGFiZWwoTG9nZ2luZ0xhYmVsICYmKSA9IGRlZmF1bHQ7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTmFtZSwgdHlwZW5hbWUgVmVjPgorICAgIExvZ2dpbmdMYWJlbChOYW1lICYmbmFtZV8sIFZlYyAmJnZlY18pIDogbmFtZShzdGQ6OmZvcndhcmQ8TmFtZT4obmFtZV8pKSwgY29sb3Ioc3RkOjpmb3J3YXJkPFZlYz4odmVjXykpIHt9Cit9OworCitzdHJ1Y3QgTG9nZ2luZ0xhYmVsU3RhdGUgeworICAgIHN0ZDo6dmVjdG9yPExvZ2dpbmdMYWJlbD4gbGFiZWxzOworICAgIExvZ2dpbmdMYWJlbCBpbnNlcnRfbGFiZWw7CisKKyAgICAvLyBFeHBvcnQgdGhlIGxhYmVscywgYnV0IGluIHJldmVyc2Ugb3JkZXIgc2luY2Ugd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIHRvcC4KKyAgICBzdGQ6OnZlY3RvcjxWa0RlYnVnVXRpbHNMYWJlbEVYVD4gRXhwb3J0KCkgY29uc3QgeworICAgICAgICBzaXplX3QgY291bnQgPSBsYWJlbHMuc2l6ZSgpICsgKGluc2VydF9sYWJlbC5FbXB0eSgpID8gMCA6IDEpOworICAgICAgICBzdGQ6OnZlY3RvcjxWa0RlYnVnVXRpbHNMYWJlbEVYVD4gb3V0KGNvdW50KTsKKworICAgICAgICBpZiAoIWNvdW50KSByZXR1cm4gb3V0OworCisgICAgICAgIHNpemVfdCBpbmRleCA9IGNvdW50IC0gMTsKKyAgICAgICAgaWYgKCFpbnNlcnRfbGFiZWwuRW1wdHkoKSkgeworICAgICAgICAgICAgb3V0W2luZGV4LS1dID0gaW5zZXJ0X2xhYmVsLkV4cG9ydCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmbGFiZWwgOiBsYWJlbHMpIHsKKyAgICAgICAgICAgIG91dFtpbmRleC0tXSA9IGxhYmVsLkV4cG9ydCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorfTsKKworc3RhdGljIGlubGluZSBpbnQgc3RyaW5nX3NwcmludGYoc3RkOjpzdHJpbmcgKm91dHB1dCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCit0eXBlZGVmIHN0cnVjdCBfZGVidWdfcmVwb3J0X2RhdGEgeworICAgIHN0ZDo6dmVjdG9yPFZrTGF5ZXJEYmdGdW5jdGlvblN0YXRlPiBkZWJ1Z19jYWxsYmFja19saXN0OworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdzRVhUIGFjdGl2ZV9zZXZlcml0aWVzezB9OworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgYWN0aXZlX3R5cGVzezB9OworICAgIGJvb2wgcXVldWVMYWJlbEhhc0luc2VydHtmYWxzZX07CisgICAgYm9vbCBjbWRCdWZMYWJlbEhhc0luc2VydHtmYWxzZX07CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz4gZGVidWdPYmplY3ROYW1lTWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgc3RkOjpzdHJpbmc+IGRlYnVnVXRpbHNPYmplY3ROYW1lTWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa1F1ZXVlLCBzdGQ6OnVuaXF1ZV9wdHI8TG9nZ2luZ0xhYmVsU3RhdGU+PiBkZWJ1Z1V0aWxzUXVldWVMYWJlbHM7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZrQ29tbWFuZEJ1ZmZlciwgc3RkOjp1bmlxdWVfcHRyPExvZ2dpbmdMYWJlbFN0YXRlPj4gZGVidWdVdGlsc0NtZEJ1ZkxhYmVsczsKKyAgICAvLyBUaGlzIG11dGV4IGlzIGRlZmluZWQgYXMgbXV0YWJsZSBzaW5jZSB0aGUgbm9ybWFsIHVzYWdlIGZvciBhIGRlYnVnIHJlcG9ydCBvYmplY3QgaXMgYXMgJ2NvbnN0Jy4gVGhlIG11dGFibGUga2V5d29yZCBhbGxvd3MKKyAgICAvLyB0aGUgbGF5ZXJzIHRvIGNvbnRpbnVlIHRoaXMgcGF0dGVybiwgYnV0IGFsc28gYWxsb3dzIHRoZW0gdG8gdXNlL2NoYW5nZSB0aGlzIHNwZWNpZmljIG1lbWJlciBmb3Igc3luY2hyb25pemF0aW9uIHB1cnBvc2VzLgorICAgIG11dGFibGUgc3RkOjptdXRleCBkZWJ1Z19yZXBvcnRfbXV0ZXg7CisgICAgY29uc3Qgdm9pZCAqaW5zdGFuY2VfcG5leHRfY2hhaW57fTsKKworICAgIHZvaWQgRGVidWdSZXBvcnRTZXRVdGlsc09iamVjdE5hbWUoY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgKnBOYW1lSW5mbykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soZGVidWdfcmVwb3J0X211dGV4KTsKKyAgICAgICAgaWYgKHBOYW1lSW5mby0+cE9iamVjdE5hbWUpIHsKKyAgICAgICAgICAgIGRlYnVnVXRpbHNPYmplY3ROYW1lTWFwW3BOYW1lSW5mby0+b2JqZWN0SGFuZGxlXSA9IHBOYW1lSW5mby0+cE9iamVjdE5hbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1Z1V0aWxzT2JqZWN0TmFtZU1hcC5lcmFzZShwTmFtZUluZm8tPm9iamVjdEhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIERlYnVnUmVwb3J0U2V0TWFya2VyT2JqZWN0TmFtZShjb25zdCBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgKnBOYW1lSW5mbykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soZGVidWdfcmVwb3J0X211dGV4KTsKKyAgICAgICAgaWYgKHBOYW1lSW5mby0+cE9iamVjdE5hbWUpIHsKKyAgICAgICAgICAgIGRlYnVnT2JqZWN0TmFtZU1hcFtwTmFtZUluZm8tPm9iamVjdF0gPSBwTmFtZUluZm8tPnBPYmplY3ROYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWdPYmplY3ROYW1lTWFwLmVyYXNlKHBOYW1lSW5mby0+b2JqZWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIERlYnVnUmVwb3J0R2V0VXRpbHNPYmplY3ROYW1lKGNvbnN0IHVpbnQ2NF90IG9iamVjdCkgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZyBsYWJlbCA9ICIiOworICAgICAgICBjb25zdCBhdXRvIHV0aWxzX25hbWVfaXRlciA9IGRlYnVnVXRpbHNPYmplY3ROYW1lTWFwLmZpbmQob2JqZWN0KTsKKyAgICAgICAgaWYgKHV0aWxzX25hbWVfaXRlciAhPSBkZWJ1Z1V0aWxzT2JqZWN0TmFtZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgbGFiZWwgPSB1dGlsc19uYW1lX2l0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgRGVidWdSZXBvcnRHZXRNYXJrZXJPYmplY3ROYW1lKGNvbnN0IHVpbnQ2NF90IG9iamVjdCkgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZyBsYWJlbCA9ICIiOworICAgICAgICBjb25zdCBhdXRvIG1hcmtlcl9uYW1lX2l0ZXIgPSBkZWJ1Z09iamVjdE5hbWVNYXAuZmluZChvYmplY3QpOworICAgICAgICBpZiAobWFya2VyX25hbWVfaXRlciAhPSBkZWJ1Z09iamVjdE5hbWVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIGxhYmVsID0gbWFya2VyX25hbWVfaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBGb3JtYXRIYW5kbGUoY29uc3QgY2hhciAqaGFuZGxlX3R5cGVfbmFtZSwgdWludDY0X3QgaGFuZGxlKSBjb25zdCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGhhbmRsZV9uYW1lID0gRGVidWdSZXBvcnRHZXRVdGlsc09iamVjdE5hbWUoaGFuZGxlKTsKKyAgICAgICAgaWYgKGhhbmRsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGhhbmRsZV9uYW1lID0gRGVidWdSZXBvcnRHZXRNYXJrZXJPYmplY3ROYW1lKGhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgICAgIHN0cmluZ19zcHJpbnRmKCZyZXQsICIlcyAweCUiIFBSSXhMRUFTVDY0ICJbJXNdIiwgaGFuZGxlX3R5cGVfbmFtZSwgaGFuZGxlLCBoYW5kbGVfbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBGb3JtYXRIYW5kbGUoY29uc3QgVnVsa2FuVHlwZWRIYW5kbGUgJmhhbmRsZSkgY29uc3QgeworICAgICAgICByZXR1cm4gRm9ybWF0SGFuZGxlKG9iamVjdF9zdHJpbmdbaGFuZGxlLnR5cGVdLCBoYW5kbGUuaGFuZGxlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSEFORExFX1Q+CisgICAgc3RkOjpzdHJpbmcgRm9ybWF0SGFuZGxlKEhBTkRMRV9UIGhhbmRsZSkgY29uc3QgeworICAgICAgICByZXR1cm4gRm9ybWF0SGFuZGxlKFZrSGFuZGxlSW5mbzxIQU5ETEVfVD46OlR5cGVuYW1lKCksIEhhbmRsZVRvVWludDY0KGhhbmRsZSkpOworICAgIH0KKworfSBkZWJ1Z19yZXBvcnRfZGF0YTsKKwordGVtcGxhdGUgZGVidWdfcmVwb3J0X2RhdGEgKkdldExheWVyRGF0YVB0cjxkZWJ1Z19yZXBvcnRfZGF0YT4odm9pZCAqZGF0YV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBkZWJ1Z19yZXBvcnRfZGF0YSAqPiAmZGF0YV9tYXApOworCitzdGF0aWMgaW5saW5lIHZvaWQgRGVidWdSZXBvcnRGbGFnc1RvQW5ub3RGbGFncyhWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgZHJfZmxhZ3MsIGJvb2wgZGVmYXVsdF9mbGFnX2lzX3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnc0VYVCAqZGFfc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzYWdlVHlwZUZsYWdzRVhUICpkYV90eXBlKSB7CisgICAgKmRhX3NldmVyaXR5ID0gMDsKKyAgICAqZGFfdHlwZSA9IDA7CisgICAgLy8gSWYgaXQncyBleHBsaWNpdGx5IGxpc3RlZCBhcyBhIHBlcmZvcm1hbmNlIHdhcm5pbmcsIHRyZWF0IGl0IGFzIGEgcGVyZm9ybWFuY2UgbWVzc2FnZS4gT3RoZXJ3aXNlLCB0cmVhdCBpdCBhcyBhIHZhbGlkYXRpb24KKyAgICAvLyBpc3N1ZS4KKyAgICBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZGFfdHlwZSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfUEVSRk9STUFOQ0VfQklUX0VYVDsKKyAgICAgICAgKmRhX3NldmVyaXR5IHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUOworICAgIH0KKyAgICBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRhX3R5cGUgfD0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX0dFTkVSQUxfQklUX0VYVCB8IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9WQUxJREFUSU9OX0JJVF9FWFQ7CisgICAgICAgICpkYV9zZXZlcml0eSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1ZFUkJPU0VfQklUX0VYVDsKKyAgICB9CisgICAgaWYgKChkcl9mbGFncyAmIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUKSAhPSAwKSB7CisgICAgICAgICpkYV90eXBlIHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9WQUxJREFUSU9OX0JJVF9FWFQ7CisgICAgICAgICpkYV9zZXZlcml0eSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0lORk9fQklUX0VYVDsKKyAgICB9CisgICAgaWYgKChkcl9mbGFncyAmIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRhX3R5cGUgfD0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1ZBTElEQVRJT05fQklUX0VYVDsKKyAgICAgICAgKmRhX3NldmVyaXR5IHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUOworICAgIH0KKyAgICBpZiAoKGRyX2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQpICE9IDApIHsKKyAgICAgICAgKmRhX3R5cGUgfD0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1ZBTElEQVRJT05fQklUX0VYVDsKKyAgICAgICAgKmRhX3NldmVyaXR5IHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVDsKKyAgICB9Cit9CisKKy8vIEZvcndhcmQgRGVjbGFyYXRpb25zCitzdGF0aWMgaW5saW5lIGJvb2wgZGVidWdfbG9nX21zZyhjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtGbGFncyBtc2dfZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgc2l6ZV90IGxvY2F0aW9uLCBjb25zdCBjaGFyICpsYXllcl9wcmVmaXgsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0X3Z1aWQpOworCitzdGF0aWMgdm9pZCBTZXREZWJ1Z1V0aWxzU2V2ZXJpdHlGbGFncyhzdGQ6OnZlY3RvcjxWa0xheWVyRGJnRnVuY3Rpb25TdGF0ZT4gJmNhbGxiYWNrcywgZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEpIHsKKyAgICAvLyBGb3IgYWxsIGNhbGxiYWNrIGluIGxpc3QsIHJldHVybiB0aGVpciBjb21wbGV0ZSBzZXQgb2Ygc2V2ZXJpdGllcyBhbmQgbW9kZXMKKyAgICBmb3IgKGF1dG8gaXRlbSA6IGNhbGxiYWNrcykgeworICAgICAgICBpZiAoaXRlbS5Jc1V0aWxzKCkpIHsKKyAgICAgICAgICAgIGRlYnVnX2RhdGEtPmFjdGl2ZV9zZXZlcml0aWVzIHw9IGl0ZW0uZGVidWdfdXRpbHNfbXNnX2ZsYWdzOworICAgICAgICAgICAgZGVidWdfZGF0YS0+YWN0aXZlX3R5cGVzIHw9IGl0ZW0uZGVidWdfdXRpbHNfbXNnX3R5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWa0ZsYWdzIHNldmVyaXRpZXMgPSAwOworICAgICAgICAgICAgVmtGbGFncyB0eXBlcyA9IDA7CisgICAgICAgICAgICBEZWJ1Z1JlcG9ydEZsYWdzVG9Bbm5vdEZsYWdzKGl0ZW0uZGVidWdfcmVwb3J0X21zZ19mbGFncywgdHJ1ZSwgJnNldmVyaXRpZXMsICZ0eXBlcyk7CisgICAgICAgICAgICBkZWJ1Z19kYXRhLT5hY3RpdmVfc2V2ZXJpdGllcyB8PSBzZXZlcml0aWVzOworICAgICAgICAgICAgZGVidWdfZGF0YS0+YWN0aXZlX3R5cGVzIHw9IHR5cGVzOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUmVtb3ZlRGVidWdVdGlsc0NhbGxiYWNrKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhLCBzdGQ6OnZlY3RvcjxWa0xheWVyRGJnRnVuY3Rpb25TdGF0ZT4gJmNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY2FsbGJhY2spIHsKKyAgICBhdXRvIGl0ZW0gPSBjYWxsYmFja3MuYmVnaW4oKTsKKyAgICBmb3IgKGl0ZW0gPSBjYWxsYmFja3MuYmVnaW4oKTsgaXRlbSAhPSBjYWxsYmFja3MuZW5kKCk7IGl0ZW0rKykgeworICAgICAgICBpZiAoaXRlbS0+SXNVdGlscygpKSB7CisgICAgICAgICAgICBpZiAoaXRlbS0+ZGVidWdfdXRpbHNfY2FsbGJhY2tfb2JqZWN0ID09IENhc3RUb0hhbmRsZTxWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQ+KGNhbGxiYWNrKSkgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXRlbS0+ZGVidWdfcmVwb3J0X2NhbGxiYWNrX29iamVjdCA9PSBDYXN0VG9IYW5kbGU8VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPihjYWxsYmFjaykpIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpdGVtICE9IGNhbGxiYWNrcy5lbmQoKSkgeworICAgICAgICBjYWxsYmFja3MuZXJhc2UoaXRlbSk7CisgICAgfQorICAgIFNldERlYnVnVXRpbHNTZXZlcml0eUZsYWdzKGNhbGxiYWNrcywgZGVidWdfZGF0YSk7Cit9CisKKy8vIERlbGV0ZXMgYWxsIGRlYnVnIGNhbGxiYWNrIGZ1bmN0aW9uIHN0cnVjdHMKK3N0YXRpYyBpbmxpbmUgdm9pZCBSZW1vdmVBbGxNZXNzYWdlQ2FsbGJhY2tzKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhLCBzdGQ6OnZlY3RvcjxWa0xheWVyRGJnRnVuY3Rpb25TdGF0ZT4gJmNhbGxiYWNrcykgeworICAgIGNhbGxiYWNrcy5jbGVhcigpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZGVidWdfbG9nX21zZyhjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtGbGFncyBtc2dfZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgc2l6ZV90IGxvY2F0aW9uLCBjb25zdCBjaGFyICpsYXllcl9wcmVmaXgsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0X3Z1aWQpIHsKKyAgICBib29sIGJhaWwgPSBmYWxzZTsKKworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdzRVhUIHNldmVyaXR5OworICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgdHlwZXM7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUIGNhbGxiYWNrX2RhdGE7CisgICAgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgb2JqZWN0X25hbWVfaW5mbzsKKworICAgIC8vIENvbnZlcnQgdGhlIGluZm8gdG8gdGhlIFZLX0VYVF9kZWJ1Z191dGlscyBmb3JtIGluIGNhc2Ugd2UgbmVlZCBpdC4KKyAgICBEZWJ1Z1JlcG9ydEZsYWdzVG9Bbm5vdEZsYWdzKG1zZ19mbGFncywgdHJ1ZSwgJnNldmVyaXR5LCAmdHlwZXMpOworICAgIG9iamVjdF9uYW1lX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19PQkpFQ1RfTkFNRV9JTkZPX0VYVDsKKyAgICBvYmplY3RfbmFtZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBvYmplY3RfbmFtZV9pbmZvLm9iamVjdFR5cGUgPSBjb252ZXJ0RGVidWdSZXBvcnRPYmplY3RUb0NvcmVPYmplY3Qob2JqZWN0X3R5cGUpOworICAgIG9iamVjdF9uYW1lX2luZm8ub2JqZWN0SGFuZGxlID0gKHVpbnQ2NF90KSh1aW50cHRyX3Qpc3JjX29iamVjdDsKKyAgICBvYmplY3RfbmFtZV9pbmZvLnBPYmplY3ROYW1lID0gTlVMTDsKKyAgICBzdGQ6OnN0cmluZyBvYmplY3RfbGFiZWwgPSB7fTsKKworICAgIGNhbGxiYWNrX2RhdGEuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19VVElMU19NRVNTRU5HRVJfQ0FMTEJBQ0tfREFUQV9FWFQ7CisgICAgY2FsbGJhY2tfZGF0YS5wTmV4dCA9IE5VTEw7CisgICAgY2FsbGJhY2tfZGF0YS5mbGFncyA9IDA7CisgICAgY2FsbGJhY2tfZGF0YS5wTWVzc2FnZUlkTmFtZSA9IHRleHRfdnVpZDsKKyAgICBjYWxsYmFja19kYXRhLm1lc3NhZ2VJZE51bWJlciA9IDA7ICAvLyBkZXByZWNhdGVkLCB2YWxpZGF0aW9uIGxheWVycyB1c2Ugb25seSB0aGUgcE1lc3NhZ2VJZE5hbWUKKyAgICBjYWxsYmFja19kYXRhLnBNZXNzYWdlID0gbWVzc2FnZTsKKyAgICBjYWxsYmFja19kYXRhLnF1ZXVlTGFiZWxDb3VudCA9IDA7CisgICAgY2FsbGJhY2tfZGF0YS5wUXVldWVMYWJlbHMgPSBOVUxMOworICAgIGNhbGxiYWNrX2RhdGEuY21kQnVmTGFiZWxDb3VudCA9IDA7CisgICAgY2FsbGJhY2tfZGF0YS5wQ21kQnVmTGFiZWxzID0gTlVMTDsKKyAgICBjYWxsYmFja19kYXRhLm9iamVjdENvdW50ID0gMTsKKyAgICBjYWxsYmFja19kYXRhLnBPYmplY3RzID0gJm9iamVjdF9uYW1lX2luZm87CisKKyAgICBzdGQ6OnZlY3RvcjxWa0RlYnVnVXRpbHNMYWJlbEVYVD4gcXVldWVfbGFiZWxzOworICAgIHN0ZDo6dmVjdG9yPFZrRGVidWdVdGlsc0xhYmVsRVhUPiBjbWRfYnVmX2xhYmVsczsKKyAgICBzdGQ6OnN0cmluZyBuZXdfZGVidWdfcmVwb3J0X21lc3NhZ2UgPSAiIjsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisgICAgaWYgKDAgIT0gc3JjX29iamVjdCkgeworICAgICAgICBvc3MgPDwgIk9iamVjdDogMHgiIDw8IHN0ZDo6aGV4IDw8IHNyY19vYmplY3Q7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBxdWV1ZSwgYWRkIGFueSBxdWV1ZSBsYWJlbHMgdG8gdGhlIGNhbGxiYWNrIGRhdGEuCisgICAgICAgIGlmIChWS19PQkpFQ1RfVFlQRV9RVUVVRSA9PSBvYmplY3RfbmFtZV9pbmZvLm9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIGF1dG8gbGFiZWxfaXRlciA9IGRlYnVnX2RhdGEtPmRlYnVnVXRpbHNRdWV1ZUxhYmVscy5maW5kKHJlaW50ZXJwcmV0X2Nhc3Q8VmtRdWV1ZT4oc3JjX29iamVjdCkpOworICAgICAgICAgICAgaWYgKGxhYmVsX2l0ZXIgIT0gZGVidWdfZGF0YS0+ZGVidWdVdGlsc1F1ZXVlTGFiZWxzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgcXVldWVfbGFiZWxzID0gbGFiZWxfaXRlci0+c2Vjb25kLT5FeHBvcnQoKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhLnF1ZXVlTGFiZWxDb3VudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihxdWV1ZV9sYWJlbHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhLnBRdWV1ZUxhYmVscyA9IHF1ZXVlX2xhYmVscy5lbXB0eSgpID8gbnVsbHB0ciA6IHF1ZXVlX2xhYmVscy5kYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY29tbWFuZCBidWZmZXIsIGFkZCBhbnkgY29tbWFuZCBidWZmZXIgbGFiZWxzIHRvIHRoZSBjYWxsYmFjayBkYXRhLgorICAgICAgICB9IGVsc2UgaWYgKFZLX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSID09IG9iamVjdF9uYW1lX2luZm8ub2JqZWN0VHlwZSkgeworICAgICAgICAgICAgYXV0byBsYWJlbF9pdGVyID0gZGVidWdfZGF0YS0+ZGVidWdVdGlsc0NtZEJ1ZkxhYmVscy5maW5kKHJlaW50ZXJwcmV0X2Nhc3Q8VmtDb21tYW5kQnVmZmVyPihzcmNfb2JqZWN0KSk7CisgICAgICAgICAgICBpZiAobGFiZWxfaXRlciAhPSBkZWJ1Z19kYXRhLT5kZWJ1Z1V0aWxzQ21kQnVmTGFiZWxzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY21kX2J1Zl9sYWJlbHMgPSBsYWJlbF9pdGVyLT5zZWNvbmQtPkV4cG9ydCgpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEuY21kQnVmTGFiZWxDb3VudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihjbWRfYnVmX2xhYmVscy5zaXplKCkpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEucENtZEJ1ZkxhYmVscyA9IGNtZF9idWZfbGFiZWxzLmVtcHR5KCkgPyBudWxscHRyIDogY21kX2J1Zl9sYWJlbHMuZGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTG9vayBmb3IgYW55IGRlYnVnIHV0aWxzIG9yIG1hcmtlciBuYW1lcyB0byB1c2UgZm9yIHRoaXMgb2JqZWN0CisgICAgICAgIG9iamVjdF9sYWJlbCA9IGRlYnVnX2RhdGEtPkRlYnVnUmVwb3J0R2V0VXRpbHNPYmplY3ROYW1lKHNyY19vYmplY3QpOworICAgICAgICBpZiAob2JqZWN0X2xhYmVsLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG9iamVjdF9sYWJlbCA9IGRlYnVnX2RhdGEtPkRlYnVnUmVwb3J0R2V0TWFya2VyT2JqZWN0TmFtZShzcmNfb2JqZWN0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iamVjdF9sYWJlbC5lbXB0eSgpKSB7CisgICAgICAgICAgICBvYmplY3RfbmFtZV9pbmZvLnBPYmplY3ROYW1lID0gb2JqZWN0X2xhYmVsLmNfc3RyKCk7CisgICAgICAgICAgICBvc3MgPDwgIiAoTmFtZSA9ICIgPDwgb2JqZWN0X2xhYmVsIDw8ICIgOiBUeXBlID0gIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9zcyA8PCAiIChUeXBlID0gIjsKKyAgICAgICAgfQorICAgICAgICBvc3MgPDwgc3RkOjp0b19zdHJpbmcob2JqZWN0X3R5cGUpIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgICBvc3MgPDwgIk9iamVjdDogVktfTlVMTF9IQU5ETEUgKFR5cGUgPSAiIDw8IHN0ZDo6dG9fc3RyaW5nKG9iamVjdF90eXBlKSA8PCAiKSI7CisgICAgfQorICAgIG5ld19kZWJ1Z19yZXBvcnRfbWVzc2FnZSArPSBvc3Muc3RyKCk7CisgICAgbmV3X2RlYnVnX3JlcG9ydF9tZXNzYWdlICs9ICIgfCAiOworICAgIG5ld19kZWJ1Z19yZXBvcnRfbWVzc2FnZSArPSBtZXNzYWdlOworCisgICAgY29uc3QgYXV0byBjYWxsYmFja19saXN0ID0gJmRlYnVnX2RhdGEtPmRlYnVnX2NhbGxiYWNrX2xpc3Q7CisKKyAgICAvLyBXZSBvbmx5IG91dHB1dCB0byBkZWZhdWx0IGNhbGxiYWNrcyBpZiB0aGVyZSBhcmUgbm8gbm9uLWRlZmF1bHQgY2FsbGJhY2tzCisgICAgYm9vbCB1c2VfZGVmYXVsdF9jYWxsYmFja3MgPSB0cnVlOworICAgIGZvciAoYXV0byBjdXJyZW50X2NhbGxiYWNrIDogKmNhbGxiYWNrX2xpc3QpIHsKKyAgICAgICAgdXNlX2RlZmF1bHRfY2FsbGJhY2tzICY9IGN1cnJlbnRfY2FsbGJhY2suSXNEZWZhdWx0KCk7CisgICAgfQorCisgICAgZm9yIChhdXRvIGN1cnJlbnRfY2FsbGJhY2sgOiAqY2FsbGJhY2tfbGlzdCkgeworICAgICAgICAvLyBTa2lwIGNhbGxiYWNrIGlmIGl0J3MgYSBkZWZhdWx0IGNhbGxiYWNrIGFuZCB0aGVyZSBhcmUgbm9uLWRlZmF1bHQgY2FsbGJhY2tzIHByZXNlbnQKKyAgICAgICAgaWYgKGN1cnJlbnRfY2FsbGJhY2suSXNEZWZhdWx0KCkgJiYgIXVzZV9kZWZhdWx0X2NhbGxiYWNrcykgY29udGludWU7CisKKyAgICAgICAgLy8gVktfRVhUX2RlYnVnX3JlcG9ydCBjYWxsYmFjayAoZGVwcmVjYXRlZCkKKyAgICAgICAgaWYgKCFjdXJyZW50X2NhbGxiYWNrLklzVXRpbHMoKSAmJiAoY3VycmVudF9jYWxsYmFjay5kZWJ1Z19yZXBvcnRfbXNnX2ZsYWdzICYgbXNnX2ZsYWdzKSkgeworICAgICAgICAgICAgaWYgKHRleHRfdnVpZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgYSB0ZXh0IHZ1aWQgaXMgc3VwcGxpZWQgZm9yIHRoZSBvbGQgZGVidWcgcmVwb3J0IGV4dGVuc2lvbiwgcHJlcGVuZCBpdCB0byB0aGUgbWVzc2FnZSBzdHJpbmcKKyAgICAgICAgICAgICAgICBuZXdfZGVidWdfcmVwb3J0X21lc3NhZ2UuaW5zZXJ0KDAsICIgXSAiKTsKKyAgICAgICAgICAgICAgICBuZXdfZGVidWdfcmVwb3J0X21lc3NhZ2UuaW5zZXJ0KDAsIHRleHRfdnVpZCk7CisgICAgICAgICAgICAgICAgbmV3X2RlYnVnX3JlcG9ydF9tZXNzYWdlLmluc2VydCgwLCAiIFsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3VycmVudF9jYWxsYmFjay5kZWJ1Z19yZXBvcnRfY2FsbGJhY2tfZnVuY3Rpb25fcHRyKG1zZ19mbGFncywgb2JqZWN0X3R5cGUsIHNyY19vYmplY3QsIGxvY2F0aW9uLCAwLCBsYXllcl9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19kZWJ1Z19yZXBvcnRfbWVzc2FnZS5jX3N0cigpLCBjdXJyZW50X2NhbGxiYWNrLnBVc2VyRGF0YSkpIHsKKyAgICAgICAgICAgICAgICBiYWlsID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFZLX0VYVF9kZWJ1Z191dGlscyBjYWxsYmFjaworICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfY2FsbGJhY2suSXNVdGlscygpICYmIChjdXJyZW50X2NhbGxiYWNrLmRlYnVnX3V0aWxzX21zZ19mbGFncyAmIHNldmVyaXR5KSAmJgorICAgICAgICAgICAgICAgICAgIChjdXJyZW50X2NhbGxiYWNrLmRlYnVnX3V0aWxzX21zZ190eXBlICYgdHlwZXMpKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudF9jYWxsYmFjay5kZWJ1Z191dGlsc19jYWxsYmFja19mdW5jdGlvbl9wdHIoc3RhdGljX2Nhc3Q8VmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQ+KHNldmVyaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcywgJmNhbGxiYWNrX2RhdGEsIGN1cnJlbnRfY2FsbGJhY2sucFVzZXJEYXRhKSkgeworICAgICAgICAgICAgICAgIGJhaWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiYWlsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRGVidWdBbm5vdEZsYWdzVG9SZXBvcnRGbGFncyhWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBkYV9zZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgZGFfdHlwZSwgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICpkcl9mbGFncykgeworICAgICpkcl9mbGFncyA9IDA7CisKKyAgICBpZiAoKGRhX3NldmVyaXR5ICYgVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9FUlJPUl9CSVRfRVhUKSAhPSAwKSB7CisgICAgICAgICpkcl9mbGFncyB8PSBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVDsKKyAgICB9IGVsc2UgaWYgKChkYV9zZXZlcml0eSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUKSAhPSAwKSB7CisgICAgICAgIGlmICgoZGFfdHlwZSAmIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9QRVJGT1JNQU5DRV9CSVRfRVhUKSAhPSAwKSB7CisgICAgICAgICAgICAqZHJfZmxhZ3MgfD0gVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkcl9mbGFncyB8PSBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgoZGFfc2V2ZXJpdHkgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0lORk9fQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZHJfZmxhZ3MgfD0gVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQ7CisgICAgfSBlbHNlIGlmICgoZGFfc2V2ZXJpdHkgJiBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1ZFUkJPU0VfQklUX0VYVCkgIT0gMCkgeworICAgICAgICAqZHJfZmxhZ3MgfD0gVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQ7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGF5ZXJfZGVidWdfdXRpbHNfZGVzdHJveV9pbnN0YW5jZShkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSkgeworICAgIGlmIChkZWJ1Z19kYXRhKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhkZWJ1Z19kYXRhLT5kZWJ1Z19yZXBvcnRfbXV0ZXgpOworICAgICAgICBSZW1vdmVBbGxNZXNzYWdlQ2FsbGJhY2tzKGRlYnVnX2RhdGEsIGRlYnVnX2RhdGEtPmRlYnVnX2NhbGxiYWNrX2xpc3QpOworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBkZWxldGUgKGRlYnVnX2RhdGEpOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIHZvaWQgbGF5ZXJfZGVzdHJveV9jYWxsYmFjayhkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVCBjYWxsYmFjaywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICphbGxvY2F0b3IpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soZGVidWdfZGF0YS0+ZGVidWdfcmVwb3J0X211dGV4KTsKKyAgICBSZW1vdmVEZWJ1Z1V0aWxzQ2FsbGJhY2soZGVidWdfZGF0YSwgZGVidWdfZGF0YS0+ZGVidWdfY2FsbGJhY2tfbGlzdCwgQ2FzdFRvVWludDY0KGNhbGxiYWNrKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ3JlYXRlSW5mbywgdHlwZW5hbWUgVENhbGxiYWNrPgorc3RhdGljIGlubGluZSB2b2lkIGxheWVyX2NyZWF0ZV9jYWxsYmFjayhEZWJ1Z0NhbGxiYWNrU3RhdHVzRmxhZ3MgY2FsbGJhY2tfc3RhdHVzLCBkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVENyZWF0ZUluZm8gKmNyZWF0ZV9pbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENhbGxiYWNrICpjYWxsYmFjaykgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhkZWJ1Z19kYXRhLT5kZWJ1Z19yZXBvcnRfbXV0ZXgpOworCisgICAgZGVidWdfZGF0YS0+ZGVidWdfY2FsbGJhY2tfbGlzdC5lbXBsYWNlX2JhY2soVmtMYXllckRiZ0Z1bmN0aW9uU3RhdGUoKSk7CisgICAgYXV0byAmY2FsbGJhY2tfc3RhdGUgPSBkZWJ1Z19kYXRhLT5kZWJ1Z19jYWxsYmFja19saXN0LmJhY2soKTsKKyAgICBjYWxsYmFja19zdGF0ZS5jYWxsYmFja19zdGF0dXMgPSBjYWxsYmFja19zdGF0dXM7CisgICAgY2FsbGJhY2tfc3RhdGUucFVzZXJEYXRhID0gY3JlYXRlX2luZm8tPnBVc2VyRGF0YTsKKworICAgIGlmIChjYWxsYmFja19zdGF0ZS5Jc1V0aWxzKCkpIHsKKyAgICAgICAgYXV0byB1dGlsc19jcmVhdGVfaW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ3JlYXRlSW5mb0VYVCAqPihjcmVhdGVfaW5mbyk7CisgICAgICAgIGF1dG8gdXRpbHNfY2FsbGJhY2sgPSByZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCAqPihjYWxsYmFjayk7CisgICAgICAgIGlmICghKCp1dGlsc19jYWxsYmFjaykpIHsKKyAgICAgICAgICAgIC8vIGNhbGxiYWNrIGNvbnN0cnVjdGVkIGRlZmF1bHQgY2FsbGJhY2tzIGhhdmUgbm8gaGFuZGxlIC0tIHNvIHVzZSBzdHJ1Y3QgYWRkcmVzcyBhcyB1bmlxdWUgaGFuZGxlCisgICAgICAgICAgICAqdXRpbHNfY2FsbGJhY2sgPSByZWludGVycHJldF9jYXN0PFZrRGVidWdVdGlsc01lc3NlbmdlckVYVD4oJmNhbGxiYWNrX3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFja19zdGF0ZS5kZWJ1Z191dGlsc19jYWxsYmFja19vYmplY3QgPSAqdXRpbHNfY2FsbGJhY2s7CisgICAgICAgIGNhbGxiYWNrX3N0YXRlLmRlYnVnX3V0aWxzX2NhbGxiYWNrX2Z1bmN0aW9uX3B0ciA9IHV0aWxzX2NyZWF0ZV9pbmZvLT5wZm5Vc2VyQ2FsbGJhY2s7CisgICAgICAgIGNhbGxiYWNrX3N0YXRlLmRlYnVnX3V0aWxzX21zZ19mbGFncyA9IHV0aWxzX2NyZWF0ZV9pbmZvLT5tZXNzYWdlU2V2ZXJpdHk7CisgICAgICAgIGNhbGxiYWNrX3N0YXRlLmRlYnVnX3V0aWxzX21zZ190eXBlID0gdXRpbHNfY3JlYXRlX2luZm8tPm1lc3NhZ2VUeXBlOworICAgIH0gZWxzZSB7ICAvLyBEZWJ1ZyByZXBvcnQgY2FsbGJhY2sKKyAgICAgICAgYXV0byByZXBvcnRfY3JlYXRlX2luZm8gPSByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKj4oY3JlYXRlX2luZm8pOworICAgICAgICBhdXRvIHJlcG9ydF9jYWxsYmFjayA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICo+KGNhbGxiYWNrKTsKKyAgICAgICAgaWYgKCEoKnJlcG9ydF9jYWxsYmFjaykpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsbHkgY29uc3RydWN0ZWQgZGVmYXVsdCBjYWxsYmFja3MgaGF2ZSBubyBoYW5kbGUgLS0gc28gdXNlIHN0cnVjdCBhZGRyZXNzIGFzIHVuaXF1ZSBoYW5kbGUKKyAgICAgICAgICAgICpyZXBvcnRfY2FsbGJhY2sgPSByZWludGVycHJldF9jYXN0PFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVD4oJmNhbGxiYWNrX3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFja19zdGF0ZS5kZWJ1Z19yZXBvcnRfY2FsbGJhY2tfb2JqZWN0ID0gKnJlcG9ydF9jYWxsYmFjazsKKyAgICAgICAgY2FsbGJhY2tfc3RhdGUuZGVidWdfcmVwb3J0X2NhbGxiYWNrX2Z1bmN0aW9uX3B0ciA9IHJlcG9ydF9jcmVhdGVfaW5mby0+cGZuQ2FsbGJhY2s7CisgICAgICAgIGNhbGxiYWNrX3N0YXRlLmRlYnVnX3JlcG9ydF9tc2dfZmxhZ3MgPSByZXBvcnRfY3JlYXRlX2luZm8tPmZsYWdzOworICAgIH0KKworICAgIFNldERlYnVnVXRpbHNTZXZlcml0eUZsYWdzKGRlYnVnX2RhdGEtPmRlYnVnX2NhbGxiYWNrX2xpc3QsIGRlYnVnX2RhdGEpOworfQorCitzdGF0aWMgaW5saW5lIFZrUmVzdWx0IGxheWVyX2NyZWF0ZV9tZXNzZW5nZXJfY2FsbGJhY2soZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsIGJvb2wgZGVmYXVsdF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnVXRpbHNNZXNzZW5nZXJFWFQgKm1lc3NlbmdlcikgeworICAgIGxheWVyX2NyZWF0ZV9jYWxsYmFjaygoREVCVUdfQ0FMTEJBQ0tfVVRJTFMgfCAoZGVmYXVsdF9jYWxsYmFjayA/IERFQlVHX0NBTExCQUNLX0RFRkFVTFQgOiAwKSksIGRlYnVnX2RhdGEsIGNyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIG1lc3Nlbmdlcik7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgVmtSZXN1bHQgbGF5ZXJfY3JlYXRlX3JlcG9ydF9jYWxsYmFjayhkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgYm9vbCBkZWZhdWx0X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgKmNyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqYWxsb2NhdG9yLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKmNhbGxiYWNrKSB7CisgICAgbGF5ZXJfY3JlYXRlX2NhbGxiYWNrKChkZWZhdWx0X2NhbGxiYWNrID8gREVCVUdfQ0FMTEJBQ0tfREVGQVVMVCA6IDApLCBkZWJ1Z19kYXRhLCBjcmVhdGVfaW5mbywgYWxsb2NhdG9yLCBjYWxsYmFjayk7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBBY3RpdmF0ZUluc3RhbmNlRGVidWdDYWxsYmFja3MoZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEpIHsKKyAgICBhdXRvIGN1cnJlbnQgPSBkZWJ1Z19kYXRhLT5pbnN0YW5jZV9wbmV4dF9jaGFpbjsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGF1dG8gY3JlYXRlX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUPihjdXJyZW50KTsKKyAgICAgICAgaWYgKCFjcmVhdGVfaW5mbykgYnJlYWs7CisgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVfaW5mby0+cE5leHQ7CisgICAgICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCB1dGlsc19jYWxsYmFja3t9OworICAgICAgICBsYXllcl9jcmVhdGVfY2FsbGJhY2soKERFQlVHX0NBTExCQUNLX1VUSUxTIHwgREVCVUdfQ0FMTEJBQ0tfSU5TVEFOQ0UpLCBkZWJ1Z19kYXRhLCBjcmVhdGVfaW5mbywgbnVsbHB0ciwgJnV0aWxzX2NhbGxiYWNrKTsKKyAgICB9CisgICAgZm9yICg7OykgeworICAgICAgICBhdXRvIGNyZWF0ZV9pbmZvID0gbHZsX2ZpbmRfaW5fY2hhaW48VmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVD4oY3VycmVudCk7CisgICAgICAgIGlmICghY3JlYXRlX2luZm8pIGJyZWFrOworICAgICAgICBjdXJyZW50ID0gY3JlYXRlX2luZm8tPnBOZXh0OworICAgICAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgcmVwb3J0X2NhbGxiYWNre307CisgICAgICAgIGxheWVyX2NyZWF0ZV9jYWxsYmFjayhERUJVR19DQUxMQkFDS19JTlNUQU5DRSwgZGVidWdfZGF0YSwgY3JlYXRlX2luZm8sIG51bGxwdHIsICZyZXBvcnRfY2FsbGJhY2spOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIERlYWN0aXZhdGVJbnN0YW5jZURlYnVnQ2FsbGJhY2tzKGRlYnVnX3JlcG9ydF9kYXRhICpkZWJ1Z19kYXRhKSB7CisgICAgaWYgKCFsdmxfZmluZF9pbl9jaGFpbjxWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUPihkZWJ1Z19kYXRhLT5pbnN0YW5jZV9wbmV4dF9jaGFpbikgJiYKKyAgICAgICAgIWx2bF9maW5kX2luX2NoYWluPFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQ+KGRlYnVnX2RhdGEtPmluc3RhbmNlX3BuZXh0X2NoYWluKSkKKyAgICAgICAgcmV0dXJuOworICAgIHN0ZDo6dmVjdG9yPFZrRGVidWdVdGlsc01lc3NlbmdlckVYVD4gaW5zdGFuY2VfdXRpbHNfY2FsbGJhY2tfaGFuZGxlc3t9OworICAgIHN0ZDo6dmVjdG9yPFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVD4gaW5zdGFuY2VfcmVwb3J0X2NhbGxiYWNrX2hhbmRsZXN7fTsKKyAgICBmb3IgKGF1dG8gaXRlbSA6IGRlYnVnX2RhdGEtPmRlYnVnX2NhbGxiYWNrX2xpc3QpIHsKKyAgICAgICAgaWYgKGl0ZW0uSXNJbnN0YW5jZSgpKSB7CisgICAgICAgICAgICBpZiAoaXRlbS5Jc1V0aWxzKCkpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZV91dGlsc19jYWxsYmFja19oYW5kbGVzLnB1c2hfYmFjayhpdGVtLmRlYnVnX3V0aWxzX2NhbGxiYWNrX29iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluc3RhbmNlX3JlcG9ydF9jYWxsYmFja19oYW5kbGVzLnB1c2hfYmFjayhpdGVtLmRlYnVnX3JlcG9ydF9jYWxsYmFja19vYmplY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byBpdGVtIDogaW5zdGFuY2VfdXRpbHNfY2FsbGJhY2tfaGFuZGxlcykgeworICAgICAgICBsYXllcl9kZXN0cm95X2NhbGxiYWNrKGRlYnVnX2RhdGEsIGl0ZW0sIG51bGxwdHIpOworICAgIH0KKyAgICBmb3IgKGF1dG8gaXRlbSA6IGluc3RhbmNlX3JlcG9ydF9jYWxsYmFja19oYW5kbGVzKSB7CisgICAgICAgIGxheWVyX2Rlc3Ryb3lfY2FsbGJhY2soZGVidWdfZGF0YSwgaXRlbSwgbnVsbHB0cik7CisgICAgfQorfQorCisjaWZuZGVmIFdJTjMyCitzdGF0aWMgaW5saW5lIGludCBzdHJpbmdfc3ByaW50ZihzdGQ6OnN0cmluZyAqb3V0cHV0LCBjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKKyNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgc3RyaW5nX3NwcmludGYoc3RkOjpzdHJpbmcgKm91dHB1dCwgY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKyAgICBzdGQ6OnN0cmluZyAmZm9ybWF0dGVkID0gKm91dHB1dDsKKyAgICB2YV9saXN0IGFyZ3B0cjsKKyAgICB2YV9zdGFydChhcmdwdHIsIGZtdCk7CisgICAgaW50IHJlc2VydmUgPSB2c25wcmludGYobnVsbHB0ciwgMCwgZm10LCBhcmdwdHIpOworICAgIHZhX2VuZChhcmdwdHIpOworICAgIGZvcm1hdHRlZC5yZXNlcnZlKHJlc2VydmUgKyAxKTsgIC8vIFNldCB0aGUgc3RvcmFnZSBsZW5ndGggbG9uZyBlbm91Z2ggdG8gaG9sZCB0aGUgb3V0cHV0ICsgbnVsbAorICAgIGZvcm1hdHRlZC5yZXNpemUocmVzZXJ2ZSk7ICAgICAgIC8vIFNldCB0aGUgKmxvZ2ljYWwqIGxlbmd0aCB0byBiZSB3aGF0IHZzcHJpbnRmIHdpbGwgd3JpdGUKKyAgICB2YV9zdGFydChhcmdwdHIsIGZtdCk7CisgICAgaW50IHJlc3VsdCA9IHZzbnByaW50ZigoY2hhciAqKWZvcm1hdHRlZC5kYXRhKCksIGZvcm1hdHRlZC5jYXBhY2l0eSgpLCBmbXQsIGFyZ3B0cik7CisgICAgdmFfZW5kKGFyZ3B0cik7CisgICAgYXNzZXJ0KHJlc3VsdCA9PSByZXNlcnZlKTsKKyAgICBhc3NlcnQoKGZvcm1hdHRlZC5zaXplKCkgPT0gc3RybGVuKGZvcm1hdHRlZC5jX3N0cigpKSkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBXSU4zMgorc3RhdGljIGlubGluZSBpbnQgdmFzcHJpbnRmKGNoYXIgKipzdHJwLCBjaGFyIGNvbnN0ICpmbXQsIHZhX2xpc3QgYXApIHsKKyAgICAqc3RycCA9IG51bGxwdHI7CisgICAgaW50IHNpemUgPSBfdnNjcHJpbnRmKGZtdCwgYXApOworICAgIGlmIChzaXplID49IDApIHsKKyAgICAgICAgKnN0cnAgPSAoY2hhciAqKW1hbGxvYyhzaXplICsgMSk7CisgICAgICAgIGlmICghKnN0cnApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBfdnNucHJpbnRmKCpzdHJwLCBzaXplICsgMSwgZm10LCBhcCk7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorI2VuZGlmCisKKy8vIE91dHB1dCBsb2cgbWVzc2FnZSB2aWEgREVCVUdfUkVQT1JULiBUYWtlcyBmb3JtYXQgYW5kIHZhcmlhYmxlIGFyZyBsaXN0IHNvIHRoYXQgb3V0cHV0IHN0cmluZyBpcyBvbmx5IGNvbXB1dGVkIGlmIGEgbWVzc2FnZQorLy8gbmVlZHMgdG8gYmUgbG9nZ2VkCisjaWZuZGVmIFdJTjMyCitzdGF0aWMgaW5saW5lIGJvb2wgbG9nX21zZyhjb25zdCBkZWJ1Z19yZXBvcnRfZGF0YSAqZGVidWdfZGF0YSwgVmtGbGFncyBtc2dfZmxhZ3MsIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJnZ1aWRfdGV4dCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNiwgNykpKTsKKyNlbmRpZgorc3RhdGljIGlubGluZSBib29sIGxvZ19tc2coY29uc3QgZGVidWdfcmVwb3J0X2RhdGEgKmRlYnVnX2RhdGEsIFZrRmxhZ3MgbXNnX2ZsYWdzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNyY19vYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICZ2dWlkX3RleHQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgICAgaWYgKCFkZWJ1Z19kYXRhKSByZXR1cm4gZmFsc2U7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGRlYnVnX2RhdGEtPmRlYnVnX3JlcG9ydF9tdXRleCk7CisgICAgVmtGbGFncyBsb2NhbF9zZXZlcml0eSA9IDA7CisgICAgVmtGbGFncyBsb2NhbF90eXBlID0gMDsKKyAgICBEZWJ1Z1JlcG9ydEZsYWdzVG9Bbm5vdEZsYWdzKG1zZ19mbGFncywgdHJ1ZSwgJmxvY2FsX3NldmVyaXR5LCAmbG9jYWxfdHlwZSk7CisgICAgaWYgKCFkZWJ1Z19kYXRhIHx8ICEoZGVidWdfZGF0YS0+YWN0aXZlX3NldmVyaXRpZXMgJiBsb2NhbF9zZXZlcml0eSkgfHwgIShkZWJ1Z19kYXRhLT5hY3RpdmVfdHlwZXMgJiBsb2NhbF90eXBlKSkgeworICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCB3YW50ZWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZhX2xpc3QgYXJncHRyOworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm9ybWF0KTsKKyAgICBjaGFyICpzdHI7CisgICAgaWYgKC0xID09IHZhc3ByaW50Zigmc3RyLCBmb3JtYXQsIGFyZ3B0cikpIHsKKyAgICAgICAgLy8gT24gZmFpbHVyZSwgZ2xpYmMgdmFzcHJpbnRmIGxlYXZlcyBzdHIgdW5kZWZpbmVkCisgICAgICAgIHN0ciA9IG51bGxwdHI7CisgICAgfQorICAgIHZhX2VuZChhcmdwdHIpOworCisgICAgc3RkOjpzdHJpbmcgc3RyX3BsdXNfc3BlY190ZXh0KHN0ciA/IHN0ciA6ICJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKworICAgIC8vIEFwcGVuZCB0aGUgc3BlYyBlcnJvciB0ZXh0IHRvIHRoZSBlcnJvciBtZXNzYWdlLCB1bmxlc3MgaXQncyBhbiBVTkFTU0lHTkVEIG9yIFVOREVGSU5FRCB2dWlkCisgICAgaWYgKCh2dWlkX3RleHQuZmluZCgiVU5BU1NJR05FRC0iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgJiYgKHZ1aWRfdGV4dC5maW5kKGtWVUlEVW5kZWZpbmVkKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAgICAgICAgLy8gTGluZWFyIHNlYXJjaCBtYWtlcyBubyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbGF5b3V0IG9mIHRoZSBzdHJpbmcgdGFibGUuIFRoaXMgaXMgbm90IGZhc3QsIGJ1dCBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGF0CisgICAgICAgIC8vIHRoaXMgcG9pbnQgaW4gdGhlIGVycm9yIHJlcG9ydGluZyBwYXRoCisgICAgICAgIHVpbnQzMl90IG51bV92dWlkcyA9IHNpemVvZih2dWlkX3NwZWNfdGV4dCkgLyBzaXplb2YodnVpZF9zcGVjX3RleHRfcGFpcik7CisgICAgICAgIGNvbnN0IGNoYXIgKnNwZWNfdGV4dCA9IG51bGxwdHI7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fdnVpZHM7IGkrKykgeworICAgICAgICAgICAgaWYgKDAgPT0gc3RyY21wKHZ1aWRfdGV4dC5jX3N0cigpLCB2dWlkX3NwZWNfdGV4dFtpXS52dWlkKSkgeworICAgICAgICAgICAgICAgIHNwZWNfdGV4dCA9IHZ1aWRfc3BlY190ZXh0W2ldLnNwZWNfdGV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxscHRyID09IHNwZWNfdGV4dCkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB5b3UndmUgaGl0IGEgVlVJRCBzdHJpbmcgdGhhdCBpc24ndCBkZWZpbmVkIGluIHRoZSBzcGVjJ3MganNvbiBmaWxlCisgICAgICAgICAgICAvLyBUcnkgcnVubmluZyAndmtfdmFsaWRhdGlvbl9zdGF0cyAtYycgdG8gbG9vayBmb3IgaW52YWxpZCBWVUlEIHN0cmluZ3MgaW4gdGhlIHJlcG8gY29kZQorICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyX3BsdXNfc3BlY190ZXh0ICs9ICIgVGhlIFZ1bGthbiBzcGVjIHN0YXRlczogIjsKKyAgICAgICAgICAgIHN0cl9wbHVzX3NwZWNfdGV4dCArPSBzcGVjX3RleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBcHBlbmQgbGF5ZXIgcHJlZml4IHdpdGggVlVJRCBzdHJpbmcsIHBhc3MgaW4gcmVjb3ZlcmVkIGxlZ2FjeSBudW1lcmljYWwgVlVJRAorICAgIGJvb2wgcmVzdWx0ID0gZGVidWdfbG9nX21zZyhkZWJ1Z19kYXRhLCBtc2dfZmxhZ3MsIG9iamVjdF90eXBlLCBzcmNfb2JqZWN0LCAwLCAiVmFsaWRhdGlvbiIsIHN0cl9wbHVzX3NwZWNfdGV4dC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dWlkX3RleHQuY19zdHIoKSk7CisKKyAgICBmcmVlKHN0cik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgcmVwb3J0X2xvZ19jYWxsYmFjayhWa0ZsYWdzIG1zZ19mbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNyY19vYmplY3QsIHNpemVfdCBsb2NhdGlvbiwgaW50MzJfdCBtc2dfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGF5ZXJfcHJlZml4LCBjb25zdCBjaGFyICptZXNzYWdlLCB2b2lkICp1c2VyX2RhdGEpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbXNnX2J1ZmZlcjsKKyAgICBjaGFyIG1zZ19mbGFnX3N0cmluZ1szMF07CisKKyAgICBQcmludE1lc3NhZ2VGbGFncyhtc2dfZmxhZ3MsIG1zZ19mbGFnX3N0cmluZyk7CisKKyAgICBtc2dfYnVmZmVyIDw8IGxheWVyX3ByZWZpeCA8PCAiKCIgPDwgbXNnX2ZsYWdfc3RyaW5nIDw8ICIpOiBtc2dfY29kZTogIiA8PCBtc2dfY29kZSA8PCAiOiAiIDw8IG1lc3NhZ2UgPDwgIlxuIjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB0bXAgPSBtc2dfYnVmZmVyLnN0cigpOworICAgIGNvbnN0IGNoYXIgKmNzdHIgPSB0bXAuY19zdHIoKTsKKworICAgIGZwcmludGYoKEZJTEUgKil1c2VyX2RhdGEsICIlcyIsIGNzdHIpOworICAgIGZmbHVzaCgoRklMRSAqKXVzZXJfZGF0YSk7CisKKyNpZiBkZWZpbmVkIF9fQU5EUk9JRF9fCisgICAgTE9HQ09OU09MRSgiJXMiLCBjc3RyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCByZXBvcnRfd2luMzJfZGVidWdfb3V0cHV0X21zZyhWa0ZsYWdzIG1zZ19mbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzcmNfb2JqZWN0LCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXllcl9wcmVmaXgsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyNpZmRlZiBXSU4zMgorICAgIGNoYXIgbXNnX2ZsYWdfc3RyaW5nWzMwXTsKKyAgICBjaGFyIGJ1ZlsyMDQ4XTsKKworICAgIFByaW50TWVzc2FnZUZsYWdzKG1zZ19mbGFncywgbXNnX2ZsYWdfc3RyaW5nKTsKKyAgICBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsICIlcyAoJXMpOiBtc2dfY29kZTogJWQ6ICVzXG4iLCBsYXllcl9wcmVmaXgsIG1zZ19mbGFnX3N0cmluZywgbXNnX2NvZGUsIG1lc3NhZ2UpOworCisgICAgT3V0cHV0RGVidWdTdHJpbmcoYnVmKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBEZWJ1Z0JyZWFrQ2FsbGJhY2soVmtGbGFncyBtc2dGbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwgc2l6ZV90IGxvY2F0aW9uLCBpbnQzMl90IG1zZ19jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxheWVyX3ByZWZpeCwgY29uc3QgY2hhciAqbWVzc2FnZSwgdm9pZCAqdXNlcl9kYXRhKSB7CisjaWZkZWYgV0lOMzIKKyAgICBEZWJ1Z0JyZWFrKCk7CisjZWxzZQorICAgIHJhaXNlKFNJR1RSQVApOworI2VuZGlmCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIE1lc3NlbmdlckJyZWFrQ2FsbGJhY2soVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZV9zZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAqY2FsbGJhY2tfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisjaWZkZWYgV0lOMzIKKyAgICBEZWJ1Z0JyZWFrKCk7CisjZWxzZQorICAgIHJhaXNlKFNJR1RSQVApOworI2VuZGlmCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIG1lc3Nlbmdlcl9sb2dfY2FsbGJhY2soVmtEZWJ1Z1V0aWxzTWVzc2FnZVNldmVyaXR5RmxhZ0JpdHNFWFQgbWVzc2FnZV9zZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAqY2FsbGJhY2tfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG1zZ19idWZmZXI7CisgICAgY2hhciBtc2dfc2V2ZXJpdHlbMzBdOworICAgIGNoYXIgbXNnX3R5cGVbMzBdOworCisgICAgUHJpbnRNZXNzYWdlU2V2ZXJpdHkobWVzc2FnZV9zZXZlcml0eSwgbXNnX3NldmVyaXR5KTsKKyAgICBQcmludE1lc3NhZ2VUeXBlKG1lc3NhZ2VfdHlwZSwgbXNnX3R5cGUpOworCisgICAgbXNnX2J1ZmZlciA8PCBjYWxsYmFja19kYXRhLT5wTWVzc2FnZUlkTmFtZSA8PCAiKCIgPDwgbXNnX3NldmVyaXR5IDw8ICIgLyAiIDw8IG1zZ190eXBlCisgICAgICAgICAgICAgICA8PCAiKTogbXNnTnVtOiAiIDw8IGNhbGxiYWNrX2RhdGEtPm1lc3NhZ2VJZE51bWJlciA8PCAiIC0gIiA8PCBjYWxsYmFja19kYXRhLT5wTWVzc2FnZSA8PCAiXG4iOworICAgIG1zZ19idWZmZXIgPDwgIiAgICBPYmplY3RzOiAiIDw8IGNhbGxiYWNrX2RhdGEtPm9iamVjdENvdW50IDw8ICJcbiI7CisgICAgZm9yICh1aW50MzJfdCBvYmogPSAwOyBvYmogPCBjYWxsYmFja19kYXRhLT5vYmplY3RDb3VudDsgKytvYmopIHsKKyAgICAgICAgbXNnX2J1ZmZlciA8PCAiICAgICAgICBbIiA8PCBvYmogPDwgIl0gIiA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNob3diYXNlCisgICAgICAgICAgICAgICAgICAgPDwgSGFuZGxlVG9VaW50NjQoY2FsbGJhY2tfZGF0YS0+cE9iamVjdHNbb2JqXS5vYmplY3RIYW5kbGUpIDw8ICIsIHR5cGU6ICIgPDwgc3RkOjpkZWMgPDwgc3RkOjpub3Nob3diYXNlCisgICAgICAgICAgICAgICAgICAgPDwgY2FsbGJhY2tfZGF0YS0+cE9iamVjdHNbb2JqXS5vYmplY3RUeXBlCisgICAgICAgICAgICAgICAgICAgPDwgIiwgbmFtZTogIiA8PCAoY2FsbGJhY2tfZGF0YS0+cE9iamVjdHNbb2JqXS5wT2JqZWN0TmFtZSA/IGNhbGxiYWNrX2RhdGEtPnBPYmplY3RzW29ial0ucE9iamVjdE5hbWUgOiAiTlVMTCIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdG1wID0gbXNnX2J1ZmZlci5zdHIoKTsKKyAgICBjb25zdCBjaGFyICpjc3RyID0gdG1wLmNfc3RyKCk7CisgICAgZnByaW50ZigoRklMRSAqKXVzZXJfZGF0YSwgIiVzIiwgY3N0cik7CisgICAgZmZsdXNoKChGSUxFICopdXNlcl9kYXRhKTsKKworI2lmIGRlZmluZWQgX19BTkRST0lEX18KKyAgICBMT0dDT05TT0xFKCIlcyIsIGNzdHIpOworI2VuZGlmCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIG1lc3Nlbmdlcl93aW4zMl9kZWJ1Z19vdXRwdXRfbXNnKAorICAgIFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIG1lc3NhZ2Vfc2V2ZXJpdHksIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgbWVzc2FnZV90eXBlLAorICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAqY2FsbGJhY2tfZGF0YSwgdm9pZCAqdXNlcl9kYXRhKSB7CisjaWZkZWYgV0lOMzIKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbXNnX2J1ZmZlcjsKKyAgICBjaGFyIG1zZ19zZXZlcml0eVszMF07CisgICAgY2hhciBtc2dfdHlwZVszMF07CisKKyAgICBQcmludE1lc3NhZ2VTZXZlcml0eShtZXNzYWdlX3NldmVyaXR5LCBtc2dfc2V2ZXJpdHkpOworICAgIFByaW50TWVzc2FnZVR5cGUobWVzc2FnZV90eXBlLCBtc2dfdHlwZSk7CisKKyAgICBtc2dfYnVmZmVyIDw8IGNhbGxiYWNrX2RhdGEtPnBNZXNzYWdlSWROYW1lIDw8ICIoIiA8PCBtc2dfc2V2ZXJpdHkgPDwgIiAvICIgPDwgbXNnX3R5cGUKKyAgICAgICAgICAgICAgIDw8ICIpOiBtc2dOdW06ICIgPDwgY2FsbGJhY2tfZGF0YS0+bWVzc2FnZUlkTnVtYmVyIDw8ICIgLSAiIDw8IGNhbGxiYWNrX2RhdGEtPnBNZXNzYWdlIDw8ICJcbiI7CisgICAgbXNnX2J1ZmZlciA8PCAiICAgIE9iamVjdHM6ICIgPDwgY2FsbGJhY2tfZGF0YS0+b2JqZWN0Q291bnQgPDwgIlxuIjsKKworICAgIGZvciAodWludDMyX3Qgb2JqID0gMDsgb2JqIDwgY2FsbGJhY2tfZGF0YS0+b2JqZWN0Q291bnQ7ICsrb2JqKSB7CisgICAgICAgIG1zZ19idWZmZXIgPDwgIiAgICAgICBbIiA8PCBvYmogPDwgIl0gICIgPDwgc3RkOjpoZXggPDwgc3RkOjpzaG93YmFzZQorICAgICAgICAgICAgICAgICAgIDw8IEhhbmRsZVRvVWludDY0KGNhbGxiYWNrX2RhdGEtPnBPYmplY3RzW29ial0ub2JqZWN0SGFuZGxlKSA8PCAiLCB0eXBlOiAiIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6bm9zaG93YmFzZQorICAgICAgICAgICAgICAgICAgIDw8IGNhbGxiYWNrX2RhdGEtPnBPYmplY3RzW29ial0ub2JqZWN0VHlwZQorICAgICAgICAgICAgICAgICAgIDw8ICIsIG5hbWU6ICIgPDwgKGNhbGxiYWNrX2RhdGEtPnBPYmplY3RzW29ial0ucE9iamVjdE5hbWUgPyBjYWxsYmFja19kYXRhLT5wT2JqZWN0c1tvYmpdLnBPYmplY3ROYW1lIDogIk5VTEwiKQorICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRtcCA9IG1zZ19idWZmZXIuc3RyKCk7CisgICAgY29uc3QgY2hhciAqY3N0ciA9IHRtcC5jX3N0cigpOworICAgIE91dHB1dERlYnVnU3RyaW5nKGNzdHIpOworI2VuZGlmCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXA+CitzdGF0aWMgTG9nZ2luZ0xhYmVsU3RhdGUgKkdldExvZ2dpbmdMYWJlbFN0YXRlKE1hcCAqbWFwLCB0eXBlbmFtZSBNYXA6OmtleV90eXBlIGtleSwgYm9vbCBpbnNlcnQpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXAtPmZpbmQoa2V5KTsKKyAgICBMb2dnaW5nTGFiZWxTdGF0ZSAqbGFiZWxfc3RhdGUgPSBudWxscHRyOworICAgIGlmIChpdGVyID09IG1hcC0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKGluc2VydCkgeworICAgICAgICAgICAgLy8gQWRkIGEgbGFiZWwgc3RhdGUgaWYgbm90IHByZXNlbnQKKyAgICAgICAgICAgIGF1dG8gaW5zZXJ0ZWQgPSBtYXAtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHN0ZDo6dW5pcXVlX3B0cjxMb2dnaW5nTGFiZWxTdGF0ZT4obmV3IExvZ2dpbmdMYWJlbFN0YXRlKCkpKSk7CisgICAgICAgICAgICBhc3NlcnQoaW5zZXJ0ZWQuc2Vjb25kKTsKKyAgICAgICAgICAgIGl0ZXIgPSBpbnNlcnRlZC5maXJzdDsKKyAgICAgICAgICAgIGxhYmVsX3N0YXRlID0gaXRlci0+c2Vjb25kLmdldCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGFiZWxfc3RhdGUgPSBpdGVyLT5zZWNvbmQuZ2V0KCk7CisgICAgfQorICAgIHJldHVybiBsYWJlbF9zdGF0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEJlZ2luUXVldWVEZWJ1Z1V0aWxzTGFiZWwoZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBWa1F1ZXVlIHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgKmxhYmVsX2luZm8pIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socmVwb3J0X2RhdGEtPmRlYnVnX3JlcG9ydF9tdXRleCk7CisgICAgaWYgKG51bGxwdHIgIT0gbGFiZWxfaW5mbyAmJiBudWxscHRyICE9IGxhYmVsX2luZm8tPnBMYWJlbE5hbWUpIHsKKyAgICAgICAgYXV0byAqbGFiZWxfc3RhdGUgPSBHZXRMb2dnaW5nTGFiZWxTdGF0ZSgmcmVwb3J0X2RhdGEtPmRlYnVnVXRpbHNRdWV1ZUxhYmVscywgcXVldWUsIC8qIGluc2VydCAqLyB0cnVlKTsKKyAgICAgICAgYXNzZXJ0KGxhYmVsX3N0YXRlKTsKKyAgICAgICAgbGFiZWxfc3RhdGUtPmxhYmVscy5wdXNoX2JhY2soTG9nZ2luZ0xhYmVsKGxhYmVsX2luZm8pKTsKKworICAgICAgICAvLyBUT0RPOiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBzZW1hbnRpY3MgZm9yIGluc2VydCBsYWJlbCB2cy4gYmVnaW4vZW5kLCBwZXJzZXJ2aW5nIGV4aXN0aW5nIHNlbWFudGljcyBmb3Igbm93CisgICAgICAgIGxhYmVsX3N0YXRlLT5pbnNlcnRfbGFiZWwuUmVzZXQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBFbmRRdWV1ZURlYnVnVXRpbHNMYWJlbChkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIFZrUXVldWUgcXVldWUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socmVwb3J0X2RhdGEtPmRlYnVnX3JlcG9ydF9tdXRleCk7CisgICAgYXV0byAqbGFiZWxfc3RhdGUgPSBHZXRMb2dnaW5nTGFiZWxTdGF0ZSgmcmVwb3J0X2RhdGEtPmRlYnVnVXRpbHNRdWV1ZUxhYmVscywgcXVldWUsIC8qIGluc2VydCAqLyBmYWxzZSk7CisgICAgaWYgKGxhYmVsX3N0YXRlKSB7CisgICAgICAgIC8vIFBvcCB0aGUgbm9ybWFsIGl0ZW0KKyAgICAgICAgaWYgKCFsYWJlbF9zdGF0ZS0+bGFiZWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGxhYmVsX3N0YXRlLT5sYWJlbHMucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IHNlbWFudGljcyBmb3IgaW5zZXJ0IGxhYmVsIHZzLiBiZWdpbi9lbmQsIHBlcnNlcnZpbmcgZXhpc3Rpbmcgc2VtYW50aWNzIGZvciBub3cKKyAgICAgICAgbGFiZWxfc3RhdGUtPmluc2VydF9sYWJlbC5SZXNldCgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIEluc2VydFF1ZXVlRGVidWdVdGlsc0xhYmVsKGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgVmtRdWV1ZSBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAqbGFiZWxfaW5mbykgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhyZXBvcnRfZGF0YS0+ZGVidWdfcmVwb3J0X211dGV4KTsKKyAgICBhdXRvICpsYWJlbF9zdGF0ZSA9IEdldExvZ2dpbmdMYWJlbFN0YXRlKCZyZXBvcnRfZGF0YS0+ZGVidWdVdGlsc1F1ZXVlTGFiZWxzLCBxdWV1ZSwgLyogaW5zZXJ0ICovIHRydWUpOworCisgICAgLy8gVE9ETzogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3Qgc2VtYW50aWNzIGZvciBpbnNlcnQgbGFiZWwgdnMuIGJlZ2luL2VuZCwgcGVyc2VydmluZyBleGlzdGluZyBzZW1hbnRpY3MgZm9yIG5vdworICAgIGxhYmVsX3N0YXRlLT5pbnNlcnRfbGFiZWwgPSBMb2dnaW5nTGFiZWwobGFiZWxfaW5mbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCZWdpbkNtZERlYnVnVXRpbHNMYWJlbChkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAqbGFiZWxfaW5mbykgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhyZXBvcnRfZGF0YS0+ZGVidWdfcmVwb3J0X211dGV4KTsKKyAgICBpZiAobnVsbHB0ciAhPSBsYWJlbF9pbmZvICYmIG51bGxwdHIgIT0gbGFiZWxfaW5mby0+cExhYmVsTmFtZSkgeworICAgICAgICBhdXRvICpsYWJlbF9zdGF0ZSA9IEdldExvZ2dpbmdMYWJlbFN0YXRlKCZyZXBvcnRfZGF0YS0+ZGVidWdVdGlsc0NtZEJ1ZkxhYmVscywgY29tbWFuZF9idWZmZXIsIC8qIGluc2VydCAqLyB0cnVlKTsKKyAgICAgICAgYXNzZXJ0KGxhYmVsX3N0YXRlKTsKKyAgICAgICAgbGFiZWxfc3RhdGUtPmxhYmVscy5wdXNoX2JhY2soTG9nZ2luZ0xhYmVsKGxhYmVsX2luZm8pKTsKKworICAgICAgICAvLyBUT0RPOiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBzZW1hbnRpY3MgZm9yIGluc2VydCBsYWJlbCB2cy4gYmVnaW4vZW5kLCBwZXJzZXJ2aW5nIGV4aXN0aW5nIHNlbWFudGljcyBmb3Igbm93CisgICAgICAgIGxhYmVsX3N0YXRlLT5pbnNlcnRfbGFiZWwuUmVzZXQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBFbmRDbWREZWJ1Z1V0aWxzTGFiZWwoZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socmVwb3J0X2RhdGEtPmRlYnVnX3JlcG9ydF9tdXRleCk7CisgICAgYXV0byAqbGFiZWxfc3RhdGUgPSBHZXRMb2dnaW5nTGFiZWxTdGF0ZSgmcmVwb3J0X2RhdGEtPmRlYnVnVXRpbHNDbWRCdWZMYWJlbHMsIGNvbW1hbmRfYnVmZmVyLCAvKiBpbnNlcnQgKi8gZmFsc2UpOworICAgIGlmIChsYWJlbF9zdGF0ZSkgeworICAgICAgICAvLyBQb3AgdGhlIG5vcm1hbCBpdGVtCisgICAgICAgIGlmICghbGFiZWxfc3RhdGUtPmxhYmVscy5lbXB0eSgpKSB7CisgICAgICAgICAgICBsYWJlbF9zdGF0ZS0+bGFiZWxzLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBzZW1hbnRpY3MgZm9yIGluc2VydCBsYWJlbCB2cy4gYmVnaW4vZW5kLCBwZXJzZXJ2aW5nIGV4aXN0aW5nIHNlbWFudGljcyBmb3Igbm93CisgICAgICAgIGxhYmVsX3N0YXRlLT5pbnNlcnRfbGFiZWwuUmVzZXQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBJbnNlcnRDbWREZWJ1Z1V0aWxzTGFiZWwoZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc0xhYmVsRVhUICpsYWJlbF9pbmZvKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHJlcG9ydF9kYXRhLT5kZWJ1Z19yZXBvcnRfbXV0ZXgpOworICAgIGF1dG8gKmxhYmVsX3N0YXRlID0gR2V0TG9nZ2luZ0xhYmVsU3RhdGUoJnJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzQ21kQnVmTGFiZWxzLCBjb21tYW5kX2J1ZmZlciwgLyogaW5zZXJ0ICovIHRydWUpOworICAgIGFzc2VydChsYWJlbF9zdGF0ZSk7CisKKyAgICAvLyBUT0RPOiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBzZW1hbnRpY3MgZm9yIGluc2VydCBsYWJlbCB2cy4gYmVnaW4vZW5kLCBwZXJzZXJ2aW5nIGV4aXN0aW5nIHNlbWFudGljcyBmb3Igbm93CisgICAgbGFiZWxfc3RhdGUtPmluc2VydF9sYWJlbCA9IExvZ2dpbmdMYWJlbChsYWJlbF9pbmZvKTsKK30KKworLy8gQ3VycmVudCB0cmFja2luZyBiZXlvbmQgYSBzaW5nbGUgY29tbWFuZCBidWZmZXIgc2NvcGUgaXMgaW5jb3JyZWN0LCBhbmQgZXZlbiB3aGVuIGl0IGlzIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBjbGVhbiB1cAorc3RhdGljIGlubGluZSB2b2lkIFJlc2V0Q21kRGVidWdVdGlsc0xhYmVsKGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHJlcG9ydF9kYXRhLT5kZWJ1Z19yZXBvcnRfbXV0ZXgpOworICAgIGF1dG8gKmxhYmVsX3N0YXRlID0gR2V0TG9nZ2luZ0xhYmVsU3RhdGUoJnJlcG9ydF9kYXRhLT5kZWJ1Z1V0aWxzQ21kQnVmTGFiZWxzLCBjb21tYW5kX2J1ZmZlciwgLyogaW5zZXJ0ICovIGZhbHNlKTsKKyAgICBpZiAobGFiZWxfc3RhdGUpIHsKKyAgICAgICAgbGFiZWxfc3RhdGUtPmxhYmVscy5jbGVhcigpOworICAgICAgICBsYWJlbF9zdGF0ZS0+aW5zZXJ0X2xhYmVsLlJlc2V0KCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRXJhc2VDbWREZWJ1Z1V0aWxzTGFiZWwoZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIpIHsKKyAgICByZXBvcnRfZGF0YS0+ZGVidWdVdGlsc0NtZEJ1ZkxhYmVscy5lcmFzZShjb21tYW5kX2J1ZmZlcik7Cit9CisKKyNlbmRpZiAgLy8gTEFZRVJfTE9HR0lOR19ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfc2V0dGluZ3MudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX3NldHRpbmdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTFmNmVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX3NldHRpbmdzLnR4dApAQCAtMCwwICsxLDEwNSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIFRoaXMgZmlsZSBjb250YWlucyBwZXItbGF5ZXIgc2V0dGluZ3MgdGhhdCBjb25maWd1cmUgbGF5ZXIgYmVoYXZpb3IgYXQKKyMgIGV4ZWN1dGlvbiB0aW1lLiBDb21tZW50cyBpbiB0aGlzIGZpbGUgYXJlIGRlbm90ZWQgd2l0aCB0aGUgIiMiIGNoYXIuCisjICBTZXR0aW5ncyBsaW5lcyBhcmUgb2YgdGhlIGZvcm06CisjICAgICAgIjxMYXllcklkZW50aWZpZXI+LjxTZXR0aW5nTmFtZT4gPSA8U2V0dGluZ1ZhbHVlPiIKKyMKKyMgIDxMYXllcklkZW50aWZpZXI+IGlzIHR5cGljYWxseSB0aGUgb2ZmaWNpYWwgbGF5ZXIgbmFtZSwgbWludXMgdGhlIFZLX0xBWUVSCisjICBwcmVmaXggYW5kIGFsbCBsb3dlci1jYW1lbC1jYXNlIC0tIGkuZS4sIGZvciBWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24sCisjICB0aGUgbGF5ZXIgaWRlbnRpZmllciBpcyAna2hyb25vc192YWxpZGF0aW9uJy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBWYWxpZGF0aW9uIExheWVyIENvbW1vbiBTZXR0aW5nczoKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgREVCVUdfQUNUSU9OOgorIyAgID09PT09PT09PT09PT0KKyMgICA8TGF5ZXJJZGVudGlmaWVyPi5kZWJ1Z19hY3Rpb24gOiBUaGlzIGlzIGFuIGVudW0gdmFsdWUgaW5kaWNhdGluZyB3aGF0CisjICAgIGFjdGlvbiBpcyB0byBiZSB0YWtlbiB3aGVuIGEgbGF5ZXIgd2FudHMgdG8gcmVwb3J0IGluZm9ybWF0aW9uLgorIyAgICBQb3NzaWJsZSBzZXR0aW5ncyB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdGhlIHZrX2xheWVyLmggaGVhZGVyIGZpbGUuCisjICAgIFRoZXNlIHNldHRpbmdzIGFyZToKKyMgICAgVktfREJHX0xBWUVSX0FDVElPTl9JR05PUkUgLSBUYWtlIG5vIGFjdGlvbi4KKyMgICAgVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHIC0gTG9nIGEgdHh0IG1lc3NhZ2UgdG8gc3Rkb3V0IG9yIHRvIGEgbG9nIGZpbGVuYW1lCisjICAgICAgIHNwZWNpZmllZCB2aWEgdGhlIDxMYXllcklkZW50aWZpZXI+LmxvZ19maWxlbmFtZSBzZXR0aW5nIChzZWUgYmVsb3cpLgorIyAgICBWS19EQkdfTEFZRVJfQUNUSU9OX0NBTExCQUNLIC0gQ2FsbCB1c2VyIGRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24ocykgdGhhdAorIyAgICAgICBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB2aWEgdGhlIFZLX0VYVF9kZWJ1Z19yZXBvcnQgZXh0ZW5zaW9uLiBTaW5jZQorIyAgICAgICBhcHAgbXVzdCByZWdpc3RlciBjYWxsYmFjaywgdGhpcyBpcyBhIE5PT1AgZm9yIHRoZSBzZXR0aW5ncyBmaWxlLgorIyAgICBWS19EQkdfTEFZRVJfQUNUSU9OX0RFQlVHX09VVFBVVCBbV2luZG93cyBvbmx5XSAtIExvZyBhIHR4dCBtZXNzYWdlIHVzaW5nIHRoZQorIyAgICAgICBXaW5kb3dzIE91dHB1dERlYnVnU3RyaW5nIGZ1bmN0aW9uIC0tIG1lc3NhZ2VzIHdpbGwgc2hvdyB1cCBpbiB0aGUKKyMgICAgICAgVmlzdWFsIFN0dWRpbyBvdXRwdXQgd2luZG93LCBmb3IgaW5zdGFuY2UuCisjICAgIFZLX0RCR19MQVlFUl9BQ1RJT05fQlJFQUsgLSBUcmlnZ2VyIGEgYnJlYWtwb2ludC4KKyMKKyMgICBSRVBPUlRfRkxBR1M6CisjICAgPT09PT09PT09PT09PQorIyAgIDxMYXllcklkZW50aWZpZXI+LnJlcG9ydF9mbGFncyA6IFRoaXMgaXMgYSBjb21tYS1kZWxpbmVhdGVkIGxpc3Qgb2Ygb3B0aW9ucworIyAgICB0ZWxsaW5nIHRoZSBsYXllciB3aGF0IHR5cGVzIG9mIG1lc3NhZ2VzIGl0IHNob3VsZCByZXBvcnQgYmFjay4KKyMgICAgT3B0aW9ucyBhcmU6CisjICAgIGluZm8gLSBSZXBvcnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKyMgICAgd2FybiAtIFJlcG9ydCB3YXJuaW5ncyBmcm9tIHVzaW5nIHRoZSBBUEkgaW4gYSBtYW5uZXIgd2hpY2ggbWF5IGxlYWQgdG8KKyMgICAgICAgICAgIHVuZGVmaW5lZCBiZWhhdmlvciBvciB0byB3YXJuIHRoZSB1c2VyIG9mIGNvbW1vbiB0cm91YmxlIHNwb3RzLgorIyAgICAgICAgICAgQSB3YXJuaW5nIGRvZXMgTk9UIG5lY2Vzc2FyaWx5IHNpZ25pZnkgaWxsZWdhbCBhcHBsaWNhdGlvbiBiZWhhdmlvci4KKyMgICAgcGVyZiAtIFJlcG9ydCB1c2luZyB0aGUgQVBJIGluIGEgd2F5IHRoYXQgbWF5IGNhdXNlIHN1Ym9wdGltYWwgcGVyZm9ybWFuY2UuCisjICAgIGVycm9yIC0gUmVwb3J0IGVycm9ycyBpbiBBUEkgdXNhZ2UuCisjICAgIGRlYnVnIC0gRm9yIGxheWVyIGRldmVsb3BtZW50LiBSZXBvcnQgbWVzc2FnZXMgZm9yIGRlYnVnZ2luZyBsYXllcgorIyAgICAgICAgICAgIGJlaGF2aW9yLgorIworIyAgIExPR19GSUxFTkFNRToKKyMgICA9PT09PT09PT09PT09CisjICAgPExheWVySWRlbnRpZmllcj4ubG9nX2ZpbGVuYW1lIDogb3V0cHV0IGZpbGVuYW1lLiBDYW4gYmUgcmVsYXRpdmUgdG8KKyMgICAgICBsb2NhdGlvbiBvZiB2a19sYXllcl9zZXR0aW5ncy50eHQgZmlsZSwgb3IgYW4gYWJzb2x1dGUgcGF0aC4gSWYgbm8KKyMgICAgICBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgb3IgaWYgZmlsZW5hbWUgaGFzIGludmFsaWQgcGF0aCwgdGhlbiBzdGRvdXQKKyMgICAgICBpcyB1c2VkIGJ5IGRlZmF1bHQuCisjCisjICAgRElTQUJMRVM6CisjICAgPT09PT09PT09PT09PQorIyAgIDxMYXllcklkZW50aWZpZXI+LmRpc2FibGVzIDogY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmVhdHVyZS9mbGFnL2Rpc2FibGUgZW51bXMKKyMgICAgICBUaGVzZSBjYW4gaW5jbHVkZSBWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVCBmbGFncyBkZWZpbmVkIGluIHRoZSBWdWxrYW4KKyMgICAgICBzcGVjaWZpY2F0aW9uLCBvciBWYWxpZGF0aW9uQ2hlY2tEaXNhYmxlcyBlbnVtcyBkZWZpbmVkIGluIGNoYXNzaXMuaC4KKyMgICAgICBFZmZlY3RzIG9mIHNldHRpbmcgdGhlc2UgZmxhZ3MgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiAob3IgdGhlCisjICAgICAgc291cmNlIGNvZGUgaW4gdGhlIGNhc2Ugb2YgdGhlIFZhbGlkYXRpb25DaGVja0Rpc2FibGVzKS4gVGhlIG1vc3QgdXNlZnVsCisjICAgICAgZmxhZ3MgYXJlIGJyaWVmbHkgZGVzY3JpYmVkIGhlcmU6CisjICAgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVU5JUVVFX0hBTkRMRVNfRVhUIC0gZGlzYWJsZXMgaGFuZGxlIHdyYXBwaW5nLgorIyAgICAgICAgICBEaXNhYmxlIHRoaXMgZmVhdHVyZSBpZiB5b3UgYXJlIHJ1bm5pbmcgaW50byBjcmFzaGVzIHdoZW4gYXV0aG9yaW5nIG5ldyBleHRlbnNpb25zCisjICAgICAgICAgIG9yIGRldmVsb3BpbmcgbmV3IFZ1bGthbiBvYmplY3RzL3N0cnVjdHVyZXMKKyMgICAgICBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9USFJFQURfU0FGRVRZX0VYVCAtIGRpc2FibGVzIHRocmVhZCBjaGVja3MuIEl0IG1heQorIyAgICAgICAgICBoZWxwIHdpdGggcGVyZm9ybWFuY2UgdG8gcnVuIHdpdGggdGhyZWFkLWNoZWNraW5nIGRpc2FibGVkIG1vc3Qgb2YgdGhlIHRpbWUsCisjICAgICAgICAgIGVuYWJsaW5nIGl0IG9jY2FzaW9uYWxseSBmb3IgYSBxdWljayBzYW5pdHkgY2hlY2ssIG9yIHdoZW4gZGVidWdnaW5nIGRpZmZpY3VsdAorIyAgICAgICAgICBhcHBsaWNhdGlvbiBiZWhhdmlvcnMuCisjICAgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQ09SRV9DSEVDS1NfRVhUIC0gZGlzYWJsZXMgdGhlIG1haW4sIGhlYXZ5LWR1dHkKKyMgICAgICAgICAgdmFsaWRhdGlvbiBjaGVja3MuIFRoaXMgbWF5IGJlIHZhbHVhYmxlIGVhcmx5IGluIHRoZSBkZXZlbG9wbWVudCBjeWNsZSB0bworIyAgICAgICAgICByZWR1Y2UgdmFsaWRhdGlvbiBvdXRwdXQgd2hpbGUgY29ycmVjdGluZyBwYXJhbXRlci9vYmplY3QgdXNhZ2UgZXJyb3JzLgorIyAgICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FQSV9QQVJBTUVURVJTX0VYVCAtIGRpc2FibGVzIHN0YXRlbGVzcyBwYXJhbWV0ZXIKKyMgICAgICAgICAgY2hlY2tzLiBUaGlzIG1heSBub3QgYWx3YXlzIGJlIG5lY2Vzc2FyeSBsYXRlIGluIGEgZGV2ZWxvcG1lbnQgY3ljbGUuCisjICAgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfT0JKRUNUX0xJRkVUSU1FU19FWFQgLSBkaXNhYmxlcyBvYmplY3QgdHJhY2tpbmcuCisjICAgICAgICAgIFRoaXMgbWF5IG5vdCBhbHdheXMgYmUgbmVjZXNzYXJ5IGxhdGUgaW4gYSBkZXZlbG9wbWVudCBjeWNsZS4KKyMKKyMgICBFTkFCTEVTOgorIyAgID09PT09PT09PT09PT0KKyMgICA8TGF5ZXJJZGVudGlmaWVyPi5lbmFibGVzIDogY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmVhdHVyZSBlbmFibGUgZW51bXMKKyMgICAgICBUaGVzZSBjYW4gaW5jbHVkZSBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIGZsYWdzIGRlZmluZWQgaW4gdGhlIFZ1bGthbgorIyAgICAgIHNwZWNpZmljYXRpb24sIHdoZXJlIHRoZWlyIGVmZmVjdHMgYXJlIGRlc2NyaWJlZC4gIFRoZSBtb3N0IHVzZWZ1bAorIyAgICAgIGZsYWdzIGFyZSBicmllZmx5IGRlc2NyaWJlZCBoZXJlOgorIyAgICAgIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX0VYVCAtIGVuYWJsZXMgaW50cnVzaXZlIEdQVS1hc3Npc3RlZAorIyAgICAgIHNoYWRlciB2YWxpZGF0aW9uIGluIGtocm9ub3MgdmFsaWRhdGlvbiBsYXllcnMKKyMgICAgICBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0JFU1RfUFJBQ1RJQ0VTX0VYVCAtIGVuYWJsZXMgYmVzdCBwcmFjdGljZXMgd2FybmluZworIyAgICAgIHZhbGlkYXRpb24KKyMKKworIyBWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24gU2V0dGluZ3MKKwora2hyb25vc192YWxpZGF0aW9uLmRlYnVnX2FjdGlvbiA9IFZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TRwora2hyb25vc192YWxpZGF0aW9uLnJlcG9ydF9mbGFncyA9IGVycm9yLHdhcm4scGVyZgora2hyb25vc192YWxpZGF0aW9uLmxvZ19maWxlbmFtZSA9IHN0ZG91dAorCisjIEV4YW1wbGUgZW50cnkgc2hvd2luZyBob3cgdG8gZGlzYWJsZSB0aHJlYWRpbmcgY2hlY2tzIGFuZCB2YWxpZGF0aW9uIGF0IERlc3Ryb3lQaXBlbGluZSB0aW1lCisja2hyb25vc192YWxpZGF0aW9uLmRpc2FibGVzID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVEhSRUFEX1NBRkVUWV9FWFQsVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0RFU1RST1lfUElQRUxJTkUKKworIyBFeGFtcGxlIGVudHJ5IHNob3dpbmcgaG93IHRvIEVuYWJsZSBHUFUtQXNzaXN0ZWQgVmFsaWRhdGlvbgorI2tocm9ub3NfdmFsaWRhdGlvbi5lbmFibGVzID0gVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhULFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX1JFU0VSVkVfQklORElOR19TTE9UX0VYVAorCisjIEV4YW1wbGUgZW50cnkgc2hvd2luZyBob3cgdG8gRW5hYmxlIEJlc3QgUHJhY3RpY2VzIFZhbGlkYXRpb24KKyNraHJvbm9zX3ZhbGlkYXRpb24uZW5hYmxlcyA9IFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfQkVTVF9QUkFDVElDRVNfRVhUCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfdXRpbHMuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzVjYTQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX3V0aWxzLmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIDIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIDIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCAyMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJ2a19sYXllcl91dGlscy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ2dWxrYW4vdnVsa2FuLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfY29uZmlnLmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IFVURjhfT05FX0JZVEVfQ09ERSA9IDB4QzA7CitzdGF0aWMgY29uc3QgdWludDhfdCBVVEY4X09ORV9CWVRFX01BU0sgPSAweEUwOworc3RhdGljIGNvbnN0IHVpbnQ4X3QgVVRGOF9UV09fQllURV9DT0RFID0gMHhFMDsKK3N0YXRpYyBjb25zdCB1aW50OF90IFVURjhfVFdPX0JZVEVfTUFTSyA9IDB4RjA7CitzdGF0aWMgY29uc3QgdWludDhfdCBVVEY4X1RIUkVFX0JZVEVfQ09ERSA9IDB4RjA7CitzdGF0aWMgY29uc3QgdWludDhfdCBVVEY4X1RIUkVFX0JZVEVfTUFTSyA9IDB4Rjg7CitzdGF0aWMgY29uc3QgdWludDhfdCBVVEY4X0RBVEFfQllURV9DT0RFID0gMHg4MDsKK3N0YXRpYyBjb25zdCB1aW50OF90IFVURjhfREFUQV9CWVRFX01BU0sgPSAweEMwOworCitWS19MQVlFUl9FWFBPUlQgVmtTdHJpbmdFcnJvckZsYWdzIHZrX3N0cmluZ192YWxpZGF0ZShjb25zdCBpbnQgbWF4X2xlbmd0aCwgY29uc3QgY2hhciAqdXRmOCkgeworICAgIFZrU3RyaW5nRXJyb3JGbGFncyByZXN1bHQgPSBWS19TVFJJTkdfRVJST1JfTk9ORTsKKyAgICBpbnQgbnVtX2NoYXJfYnl0ZXMgPSAwOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8PSBtYXhfbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKHV0ZjhbaV0gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSBtYXhfbGVuZ3RoKSB7CisgICAgICAgICAgICByZXN1bHQgPSBWS19TVFJJTkdfRVJST1JfTEVOR1RIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoKHV0ZjhbaV0gPj0gMHhhKSAmJiAodXRmOFtpXSA8IDB4N2YpKSB7CisgICAgICAgICAgICBudW1fY2hhcl9ieXRlcyA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoKHV0ZjhbaV0gJiBVVEY4X09ORV9CWVRFX01BU0spID09IFVURjhfT05FX0JZVEVfQ09ERSkgeworICAgICAgICAgICAgbnVtX2NoYXJfYnl0ZXMgPSAxOworICAgICAgICB9IGVsc2UgaWYgKCh1dGY4W2ldICYgVVRGOF9UV09fQllURV9NQVNLKSA9PSBVVEY4X1RXT19CWVRFX0NPREUpIHsKKyAgICAgICAgICAgIG51bV9jaGFyX2J5dGVzID0gMjsKKyAgICAgICAgfSBlbHNlIGlmICgodXRmOFtpXSAmIFVURjhfVEhSRUVfQllURV9NQVNLKSA9PSBVVEY4X1RIUkVFX0JZVEVfQ09ERSkgeworICAgICAgICAgICAgbnVtX2NoYXJfYnl0ZXMgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gVktfU1RSSU5HX0VSUk9SX0JBRF9EQVRBOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGZvbGxvd2luZyBudW1fY2hhcl9ieXRlcyBvZiBkYXRhCisgICAgICAgIGZvciAoaiA9IDA7IChqIDwgbnVtX2NoYXJfYnl0ZXMpICYmIChpIDwgbWF4X2xlbmd0aCk7IGorKykgeworICAgICAgICAgICAgaWYgKCsraSA9PSBtYXhfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFZLX1NUUklOR19FUlJPUl9MRU5HVEg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHV0ZjhbaV0gJiBVVEY4X0RBVEFfQllURV9NQVNLKSAhPSBVVEY4X0RBVEFfQllURV9DT0RFKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFZLX1NUUklOR19FUlJPUl9CQURfREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyBpZiBhIHN0cmluZyBpcyBpbiBhIHNldCBvZiBzdHJpbmdzCitWS19MQVlFUl9FWFBPUlQgYm9vbCB3aGl0ZV9saXN0KGNvbnN0IGNoYXIgKml0ZW0sIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiAmbGlzdCkgeyByZXR1cm4gKGxpc3QuZmluZChpdGVtKSAhPSBsaXN0LmVuZCgpKTsgfQorCisvLyBEZWJ1ZyBjYWxsYmFja3MgZ2V0IGNyZWF0ZWQgaW4gdGhyZWUgd2F5czoKKy8vICAgbyAgQXBwbGljYXRpb24tZGVmaW5lZCBkZWJ1ZyBjYWxsYmFja3MKKy8vICAgbyAgVGhyb3VnaCBzZXR0aW5ncyBpbiBhIHZrX2xheWVyX3NldHRpbmdzLnR4dCBmaWxlCisvLyAgIG8gIEJ5IGRlZmF1bHQsIGlmIG5laXRoZXIgYW4gYXBwLWRlZmluZWQgZGVidWcgY2FsbGJhY2sgbm9yIGEgdmtfbGF5ZXJfc2V0dGluZ3MudHh0IGZpbGUgaXMgcHJlc2VudAorLy8KKy8vIEF0IGxheWVyIGluaXRpYWxpemF0aW9uIHRpbWUsIGRlZmF1bHQgbG9nZ2luZyBjYWxsYmFja3MgYXJlIGNyZWF0ZWQgdG8gb3V0cHV0IGxheWVyIGVycm9yIG1lc3NhZ2VzLgorLy8gSWYgYSB2a19sYXllcl9zZXR0aW5ncy50eHQgZmlsZSBpcyBwcmVzZW50IGl0cyBzZXR0aW5ncyB3aWxsIG92ZXJyaWRlIGFueSBkZWZhdWx0IHNldHRpbmdzLgorLy8KKy8vIElmIGEgdmtfbGF5ZXJfc2V0dGluZ3MudHh0IGZpbGUgaXMgcHJlc2VudCBhbmQgYW4gYXBwbGljYXRpb24gZGVmaW5lcyBhIGRlYnVnIGNhbGxiYWNrLCBib3RoIGNhbGxiYWNrcworLy8gd2lsbCBiZSBhY3RpdmUuICBJZiBubyB2a19sYXllcl9zZXR0aW5ncy50eHQgZmlsZSBpcyBwcmVzZW50LCBjcmVhdGluZyBhbiBhcHBsaWNhdGlvbi1kZWZpbmVkIGRlYnVnCisvLyBjYWxsYmFjayB3aWxsIGNhdXNlIHRoZSBkZWZhdWx0IGNhbGxiYWNrcyB0byBiZSB1bnJlZ2lzdGVyZCBhbmQgcmVtb3ZlZC4KK1ZLX0xBWUVSX0VYUE9SVCB2b2lkIGxheWVyX2RlYnVnX21lc3Nlbmdlcl9hY3Rpb25zKGRlYnVnX3JlcG9ydF9kYXRhICpyZXBvcnRfZGF0YSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGF5ZXJfaWRlbnRpZmllcikgeworICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckVYVCBtZXNzZW5nZXIgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydF9mbGFnc19rZXkgPSBsYXllcl9pZGVudGlmaWVyOworICAgIHN0ZDo6c3RyaW5nIGRlYnVnX2FjdGlvbl9rZXkgPSBsYXllcl9pZGVudGlmaWVyOworICAgIHN0ZDo6c3RyaW5nIGxvZ19maWxlbmFtZV9rZXkgPSBsYXllcl9pZGVudGlmaWVyOworICAgIHJlcG9ydF9mbGFnc19rZXkuYXBwZW5kKCIucmVwb3J0X2ZsYWdzIik7CisgICAgZGVidWdfYWN0aW9uX2tleS5hcHBlbmQoIi5kZWJ1Z19hY3Rpb24iKTsKKyAgICBsb2dfZmlsZW5hbWVfa2V5LmFwcGVuZCgiLmxvZ19maWxlbmFtZSIpOworCisgICAgLy8gSW5pdGlhbGl6ZSBsYXllciBvcHRpb25zCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUIHJlcG9ydF9mbGFncyA9IEdldExheWVyT3B0aW9uRmxhZ3MocmVwb3J0X2ZsYWdzX2tleSwgcmVwb3J0X2ZsYWdzX29wdGlvbl9kZWZpbml0aW9ucywgMCk7CisgICAgVmtMYXllckRiZ0FjdGlvbkZsYWdzIGRlYnVnX2FjdGlvbiA9IEdldExheWVyT3B0aW9uRmxhZ3MoZGVidWdfYWN0aW9uX2tleSwgZGVidWdfYWN0aW9uc19vcHRpb25fZGVmaW5pdGlvbnMsIDApOworICAgIC8vIEZsYWcgYXMgZGVmYXVsdCBpZiB0aGVzZSBzZXR0aW5ncyBhcmUgbm90IGZyb20gYSB2a19sYXllcl9zZXR0aW5ncy50eHQgZmlsZQorICAgIFZrRGVidWdVdGlsc01lc3NlbmdlckNyZWF0ZUluZm9FWFQgZGJnQ3JlYXRlSW5mbzsKKyAgICBtZW1zZXQoJmRiZ0NyZWF0ZUluZm8sIDAsIHNpemVvZihkYmdDcmVhdGVJbmZvKSk7CisgICAgZGJnQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DUkVBVEVfSU5GT19FWFQ7CisgICAgZGJnQ3JlYXRlSW5mby5tZXNzYWdlVHlwZSA9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfVFlQRV9HRU5FUkFMX0JJVF9FWFQgfCBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfVkFMSURBVElPTl9CSVRfRVhUOworICAgIGlmIChyZXBvcnRfZmxhZ3MgJiBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCkgeworICAgICAgICBkYmdDcmVhdGVJbmZvLm1lc3NhZ2VTZXZlcml0eSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX0VSUk9SX0JJVF9FWFQ7CisgICAgfQorICAgIGlmIChyZXBvcnRfZmxhZ3MgJiBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUKSB7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8ubWVzc2FnZVNldmVyaXR5IHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUOworICAgIH0KKyAgICBpZiAocmVwb3J0X2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCkgeworICAgICAgICBkYmdDcmVhdGVJbmZvLm1lc3NhZ2VTZXZlcml0eSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1NFVkVSSVRZX1dBUk5JTkdfQklUX0VYVDsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5tZXNzYWdlVHlwZSB8PSBWS19ERUJVR19VVElMU19NRVNTQUdFX1RZUEVfUEVSRk9STUFOQ0VfQklUX0VYVDsKKyAgICB9CisgICAgaWYgKHJlcG9ydF9mbGFncyAmIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUKSB7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8ubWVzc2FnZVNldmVyaXR5IHw9IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfSU5GT19CSVRfRVhUOworICAgIH0KKyAgICBpZiAocmVwb3J0X2ZsYWdzICYgVktfREVCVUdfUkVQT1JUX0RFQlVHX0JJVF9FWFQpIHsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5tZXNzYWdlU2V2ZXJpdHkgfD0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9TRVZFUklUWV9WRVJCT1NFX0JJVF9FWFQ7CisgICAgfQorCisgICAgaWYgKGRlYnVnX2FjdGlvbiAmIFZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TRykgeworICAgICAgICBjb25zdCBjaGFyICpsb2dfZmlsZW5hbWUgPSBnZXRMYXllck9wdGlvbihsb2dfZmlsZW5hbWVfa2V5LmNfc3RyKCkpOworICAgICAgICBGSUxFICpsb2dfb3V0cHV0ID0gZ2V0TGF5ZXJMb2dPdXRwdXQobG9nX2ZpbGVuYW1lLCBsYXllcl9pZGVudGlmaWVyKTsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5wZm5Vc2VyQ2FsbGJhY2sgPSBtZXNzZW5nZXJfbG9nX2NhbGxiYWNrOworICAgICAgICBkYmdDcmVhdGVJbmZvLnBVc2VyRGF0YSA9ICh2b2lkICopbG9nX291dHB1dDsKKyAgICAgICAgbGF5ZXJfY3JlYXRlX21lc3Nlbmdlcl9jYWxsYmFjayhyZXBvcnRfZGF0YSwgdHJ1ZSwgJmRiZ0NyZWF0ZUluZm8sIHBBbGxvY2F0b3IsICZtZXNzZW5nZXIpOworICAgIH0KKworICAgIG1lc3NlbmdlciA9IFZLX05VTExfSEFORExFOworCisgICAgaWYgKGRlYnVnX2FjdGlvbiAmIFZLX0RCR19MQVlFUl9BQ1RJT05fREVCVUdfT1VUUFVUKSB7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8ucGZuVXNlckNhbGxiYWNrID0gbWVzc2VuZ2VyX3dpbjMyX2RlYnVnX291dHB1dF9tc2c7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8ucFVzZXJEYXRhID0gTlVMTDsKKyAgICAgICAgbGF5ZXJfY3JlYXRlX21lc3Nlbmdlcl9jYWxsYmFjayhyZXBvcnRfZGF0YSwgdHJ1ZSwgJmRiZ0NyZWF0ZUluZm8sIHBBbGxvY2F0b3IsICZtZXNzZW5nZXIpOworICAgIH0KKworICAgIG1lc3NlbmdlciA9IFZLX05VTExfSEFORExFOworCisgICAgaWYgKGRlYnVnX2FjdGlvbiAmIFZLX0RCR19MQVlFUl9BQ1RJT05fQlJFQUspIHsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5wZm5Vc2VyQ2FsbGJhY2sgPSBNZXNzZW5nZXJCcmVha0NhbGxiYWNrOworICAgICAgICBkYmdDcmVhdGVJbmZvLnBVc2VyRGF0YSA9IE5VTEw7CisgICAgICAgIGxheWVyX2NyZWF0ZV9tZXNzZW5nZXJfY2FsbGJhY2socmVwb3J0X2RhdGEsIHRydWUsICZkYmdDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCAmbWVzc2VuZ2VyKTsKKyAgICB9Cit9CisKKy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gZGVwcmVjYXRlZCwgYW5kIHRoZSBhYm92ZSBmdW5jdGlvbiAobGF5ZXJfZGVidWdfbWVzc2VuZ2VyX2FjdGlvbnMpIHNob3VsZCBiZQorLy8gICAgICAgdXNlZCBpbiBpdHMgcGxhY2UuCitWS19MQVlFUl9FWFBPUlQgdm9pZCBsYXllcl9kZWJ1Z19yZXBvcnRfYWN0aW9ucyhkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGEsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxheWVyX2lkZW50aWZpZXIpIHsKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2sgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydF9mbGFnc19rZXkgPSBsYXllcl9pZGVudGlmaWVyOworICAgIHN0ZDo6c3RyaW5nIGRlYnVnX2FjdGlvbl9rZXkgPSBsYXllcl9pZGVudGlmaWVyOworICAgIHN0ZDo6c3RyaW5nIGxvZ19maWxlbmFtZV9rZXkgPSBsYXllcl9pZGVudGlmaWVyOworICAgIHJlcG9ydF9mbGFnc19rZXkuYXBwZW5kKCIucmVwb3J0X2ZsYWdzIik7CisgICAgZGVidWdfYWN0aW9uX2tleS5hcHBlbmQoIi5kZWJ1Z19hY3Rpb24iKTsKKyAgICBsb2dfZmlsZW5hbWVfa2V5LmFwcGVuZCgiLmxvZ19maWxlbmFtZSIpOworCisgICAgLy8gSW5pdGlhbGl6ZSBsYXllciBvcHRpb25zCisgICAgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUIHJlcG9ydF9mbGFncyA9IEdldExheWVyT3B0aW9uRmxhZ3MocmVwb3J0X2ZsYWdzX2tleSwgcmVwb3J0X2ZsYWdzX29wdGlvbl9kZWZpbml0aW9ucywgMCk7CisgICAgVmtMYXllckRiZ0FjdGlvbkZsYWdzIGRlYnVnX2FjdGlvbiA9IEdldExheWVyT3B0aW9uRmxhZ3MoZGVidWdfYWN0aW9uX2tleSwgZGVidWdfYWN0aW9uc19vcHRpb25fZGVmaW5pdGlvbnMsIDApOworICAgIC8vIEZsYWcgYXMgZGVmYXVsdCBpZiB0aGVzZSBzZXR0aW5ncyBhcmUgbm90IGZyb20gYSB2a19sYXllcl9zZXR0aW5ncy50eHQgZmlsZQorICAgIGJvb2wgZGVmYXVsdF9sYXllcl9jYWxsYmFjayA9IChkZWJ1Z19hY3Rpb24gJiBWS19EQkdfTEFZRVJfQUNUSU9OX0RFRkFVTFQpID8gdHJ1ZSA6IGZhbHNlOworCisgICAgaWYgKGRlYnVnX2FjdGlvbiAmIFZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TRykgeworICAgICAgICBjb25zdCBjaGFyICpsb2dfZmlsZW5hbWUgPSBnZXRMYXllck9wdGlvbihsb2dfZmlsZW5hbWVfa2V5LmNfc3RyKCkpOworICAgICAgICBGSUxFICpsb2dfb3V0cHV0ID0gZ2V0TGF5ZXJMb2dPdXRwdXQobG9nX2ZpbGVuYW1lLCBsYXllcl9pZGVudGlmaWVyKTsKKyAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBkYmdDcmVhdGVJbmZvOworICAgICAgICBtZW1zZXQoJmRiZ0NyZWF0ZUluZm8sIDAsIHNpemVvZihkYmdDcmVhdGVJbmZvKSk7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ1JFQVRFX0lORk9fRVhUOworICAgICAgICBkYmdDcmVhdGVJbmZvLmZsYWdzID0gcmVwb3J0X2ZsYWdzOworICAgICAgICBkYmdDcmVhdGVJbmZvLnBmbkNhbGxiYWNrID0gcmVwb3J0X2xvZ19jYWxsYmFjazsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5wVXNlckRhdGEgPSAodm9pZCAqKWxvZ19vdXRwdXQ7CisgICAgICAgIGxheWVyX2NyZWF0ZV9yZXBvcnRfY2FsbGJhY2socmVwb3J0X2RhdGEsIGRlZmF1bHRfbGF5ZXJfY2FsbGJhY2ssICZkYmdDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCAmY2FsbGJhY2spOworICAgIH0KKworICAgIGNhbGxiYWNrID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICBpZiAoZGVidWdfYWN0aW9uICYgVktfREJHX0xBWUVSX0FDVElPTl9ERUJVR19PVVRQVVQpIHsKKyAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBkYmdDcmVhdGVJbmZvOworICAgICAgICBtZW1zZXQoJmRiZ0NyZWF0ZUluZm8sIDAsIHNpemVvZihkYmdDcmVhdGVJbmZvKSk7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ1JFQVRFX0lORk9fRVhUOworICAgICAgICBkYmdDcmVhdGVJbmZvLmZsYWdzID0gcmVwb3J0X2ZsYWdzOworICAgICAgICBkYmdDcmVhdGVJbmZvLnBmbkNhbGxiYWNrID0gcmVwb3J0X3dpbjMyX2RlYnVnX291dHB1dF9tc2c7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8ucFVzZXJEYXRhID0gTlVMTDsKKyAgICAgICAgbGF5ZXJfY3JlYXRlX3JlcG9ydF9jYWxsYmFjayhyZXBvcnRfZGF0YSwgZGVmYXVsdF9sYXllcl9jYWxsYmFjaywgJmRiZ0NyZWF0ZUluZm8sIHBBbGxvY2F0b3IsICZjYWxsYmFjayk7CisgICAgfQorCisgICAgY2FsbGJhY2sgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIGlmIChkZWJ1Z19hY3Rpb24gJiBWS19EQkdfTEFZRVJfQUNUSU9OX0JSRUFLKSB7CisgICAgICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgZGJnQ3JlYXRlSW5mbzsKKyAgICAgICAgbWVtc2V0KCZkYmdDcmVhdGVJbmZvLCAwLCBzaXplb2YoZGJnQ3JlYXRlSW5mbykpOworICAgICAgICBkYmdDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfUkVQT1JUX0NSRUFURV9JTkZPX0VYVDsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5mbGFncyA9IHJlcG9ydF9mbGFnczsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5wZm5DYWxsYmFjayA9IERlYnVnQnJlYWtDYWxsYmFjazsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5wVXNlckRhdGEgPSBOVUxMOworICAgICAgICBsYXllcl9jcmVhdGVfcmVwb3J0X2NhbGxiYWNrKHJlcG9ydF9kYXRhLCBkZWZhdWx0X2xheWVyX2NhbGxiYWNrLCAmZGJnQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgJmNhbGxiYWNrKTsKKyAgICB9Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICpnZXRfY2hhaW5faW5mbyhjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIFZrTGF5ZXJGdW5jdGlvbiBmdW5jKSB7CisgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqY2hhaW5faW5mbyA9IChWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICopcENyZWF0ZUluZm8tPnBOZXh0OworICAgIHdoaWxlIChjaGFpbl9pbmZvICYmICEoY2hhaW5faW5mby0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPICYmIGNoYWluX2luZm8tPmZ1bmN0aW9uID09IGZ1bmMpKSB7CisgICAgICAgIGNoYWluX2luZm8gPSAoVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqKWNoYWluX2luZm8tPnBOZXh0OworICAgIH0KKyAgICBhc3NlcnQoY2hhaW5faW5mbyAhPSBOVUxMKTsKKyAgICByZXR1cm4gY2hhaW5faW5mbzsKK30KKworVktfTEFZRVJfRVhQT1JUIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpnZXRfY2hhaW5faW5mbyhjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBWa0xheWVyRnVuY3Rpb24gZnVuYykgeworICAgIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gKFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICopcENyZWF0ZUluZm8tPnBOZXh0OworICAgIHdoaWxlIChjaGFpbl9pbmZvICYmICEoY2hhaW5faW5mby0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0RFVklDRV9DUkVBVEVfSU5GTyAmJiBjaGFpbl9pbmZvLT5mdW5jdGlvbiA9PSBmdW5jKSkgeworICAgICAgICBjaGFpbl9pbmZvID0gKFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICopY2hhaW5faW5mby0+cE5leHQ7CisgICAgfQorICAgIGFzc2VydChjaGFpbl9pbmZvICE9IE5VTEwpOworICAgIHJldHVybiBjaGFpbl9pbmZvOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbGF5ZXJfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZjYTgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xheWVyX3V0aWxzLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgImNhc3RfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19mb3JtYXRfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9sb2dnaW5nLmgiCisKKyNpZm5kZWYgV0lOMzIKKyNpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBGb3IgZmZzKCkKKyNlbHNlCisjaW5jbHVkZSA8aW50cmluLmg+ICAvLyBGb3IgX19semNudCgpCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisvLyBUcmFpdHMgb2JqZWN0cyB0byBhbGxvdyBzdHJpbmdfam9pbiB0byBvcGVyYXRlIG9uIGNvbGxlY3Rpb25zIG9mIGNvbnN0IGNoYXIgKgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZz4KK3N0cnVjdCBTdHJpbmdKb2luU2l6ZVRyYWl0IHsKKyAgICBzdGF0aWMgc2l6ZV90IHNpemUoY29uc3QgU3RyaW5nICZzdHIpIHsgcmV0dXJuIHN0ci5zaXplKCk7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU3RyaW5nSm9pblNpemVUcmFpdDxjb25zdCBjaGFyICo+IHsKKyAgICBzdGF0aWMgc2l6ZV90IHNpemUoY29uc3QgY2hhciAqc3RyKSB7CisgICAgICAgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHN0cmxlbihzdHIpOworICAgIH0KK307CisvLyBTaW1pbGFyIHRvIHBlcmwvcHl0aG9uIGpvaW4KKy8vICAgICogU3RyaW5nIG11c3Qgc3VwcG9ydCBzaXplLCByZXNlcnZlLCBhcHBlbmQsIGFuZCBiZSBkZWZhdWx0IGNvbnN0cnVjdGFibGUKKy8vICAgICogU3RyaW5nQ29sbGVjdGlvbiBtdXN0IHN1cHBvcnQgc2l6ZSwgY29uc3QgZm9yd2FyZCBpdGVyYXRpb24sIGFuZCBzdG9yZQorLy8gICAgICBzdHJpbmdzIGNvbXBhdGlibGUgd2l0aCBTdHJpbmc6OmFwcGVuZAorLy8gICAgKiBBY2Nlc3NvciB0cmFpdCBjYW4gYmUgc2V0IGlmIGRlZmF1bHQgYWNjZXNzb3JzIChjb21wYXRpYmxlIHdpdGggc3RyaW5nCisvLyAgICAgIGFuZCBjb25zdCBjaGFyICopIGRvbid0IHN1cHBvcnQgc2l6ZShTdHJpbmdDb2xsZWN0aW9uOjp2YWx1ZV90eXBlICYpCisvLworLy8gUmV0dXJuIHR5cGUgYmFzZWQgb24gc2VwIHR5cGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmcgPSBzdGQ6OnN0cmluZywgdHlwZW5hbWUgU3RyaW5nQ29sbGVjdGlvbiA9IHN0ZDo6dmVjdG9yPFN0cmluZz4sCisgICAgICAgICAgdHlwZW5hbWUgQWNjZXNzb3IgPSBTdHJpbmdKb2luU2l6ZVRyYWl0PHR5cGVuYW1lIFN0cmluZ0NvbGxlY3Rpb246OnZhbHVlX3R5cGU+Pgorc3RhdGljIGlubGluZSBTdHJpbmcgc3RyaW5nX2pvaW4oY29uc3QgU3RyaW5nICZzZXAsIGNvbnN0IFN0cmluZ0NvbGxlY3Rpb24gJnN0cmluZ3MpIHsKKyAgICBTdHJpbmcgam9pbmVkOworICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IHN0cmluZ3Muc2l6ZSgpOworICAgIGlmICghY291bnQpIHJldHVybiBqb2luZWQ7CisKKyAgICAvLyBQcmVyZXNlcnZlZCBzdG9yYWdlLCBzLnQuIHdlIHdpbGwgZXhlY3V0ZSBpbiBsaW5lYXIgdGltZSAoYXZvaWRzIHJlYWxsb2NhdGlvbiBjb3BpZXMpCisgICAgc2l6ZV90IHJlc2VydmUgPSAoY291bnQgLSAxKSAqIHNlcC5zaXplKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHIgOiBzdHJpbmdzKSB7CisgICAgICAgIHJlc2VydmUgKz0gQWNjZXNzb3I6OnNpemUoc3RyKTsgIC8vIGFic3RyYWN0ZWQgdG8gYWxsb3cgY29uc3QgY2hhciAqIHR5cGUgaW4gU3RyaW5nQ29sbGVjdGlvbgorICAgIH0KKyAgICBqb2luZWQucmVzZXJ2ZShyZXNlcnZlICsgMSk7CisKKyAgICAvLyBTZXBzIG9ubHkgb2NjdXIgKmJldHdlZW4qIHN0cmluZ3MgZW50cmllcywgc28gZmlyc3QgaXMgc3BlY2lhbAorICAgIGF1dG8gY3VycmVudCA9IHN0cmluZ3MuY2JlZ2luKCk7CisgICAgam9pbmVkLmFwcGVuZCgqY3VycmVudCk7CisgICAgKytjdXJyZW50OworICAgIGZvciAoOyBjdXJyZW50ICE9IHN0cmluZ3MuY2VuZCgpOyArK2N1cnJlbnQpIHsKKyAgICAgICAgam9pbmVkLmFwcGVuZChzZXApOworICAgICAgICBqb2luZWQuYXBwZW5kKCpjdXJyZW50KTsKKyAgICB9CisgICAgcmV0dXJuIGpvaW5lZDsKK30KKworLy8gUmVxdWlyZXMgU3RyaW5nQ29sbGVjdGlvbjo6dmFsdWVfdHlwZSBoYXMgYSBjb25zdCBjaGFyICogY29uc3RydWN0b3IgYW5kIGlzIGNvbXBhdGlibGUgdGhlIHN0cmluZ19qb2luOjpTdHJpbmcgYWJvdmUKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdDb2xsZWN0aW9uID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+LCB0eXBlbmFtZSBTZXBTdHJpbmcgPSBzdGQ6OnN0cmluZz4KK3N0YXRpYyBpbmxpbmUgU2VwU3RyaW5nIHN0cmluZ19qb2luKGNvbnN0IGNoYXIgKnNlcCwgY29uc3QgU3RyaW5nQ29sbGVjdGlvbiAmc3RyaW5ncykgeworICAgIHJldHVybiBzdHJpbmdfam9pbjxTZXBTdHJpbmcsIFN0cmluZ0NvbGxlY3Rpb24+KFNlcFN0cmluZyhzZXApLCBzdHJpbmdzKTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfdHJpbShjb25zdCBzdGQ6OnN0cmluZyAmcykgeworICAgIGNvbnN0IGNoYXIgKndoaXRlc3BhY2UgPSAiIFx0XGZcdlxuXHIiOworCisgICAgY29uc3QgYXV0byB0cmltbWVkX2JlZyA9IHMuZmluZF9maXJzdF9ub3Rfb2Yod2hpdGVzcGFjZSk7CisgICAgaWYgKHRyaW1tZWRfYmVnID09IHN0ZDo6c3RyaW5nOjpucG9zKSByZXR1cm4gIiI7CisKKyAgICBjb25zdCBhdXRvIHRyaW1tZWRfZW5kID0gcy5maW5kX2xhc3Rfbm90X29mKHdoaXRlc3BhY2UpOworICAgIGFzc2VydCh0cmltbWVkX2VuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiB0cmltbWVkX2JlZyA8PSB0cmltbWVkX2VuZCk7CisKKyAgICByZXR1cm4gcy5zdWJzdHIodHJpbW1lZF9iZWcsIHRyaW1tZWRfZW5kIC0gdHJpbW1lZF9iZWcgKyAxKTsKK30KKworLy8gUGVybC9QeXRob24gc3R5bGUgam9pbiBvcGVyYXRpb24gZm9yIGdlbmVyYWwgdHlwZXMgdXNpbmcgc3RyZWFtIHNlbWFudGljcworLy8gTm90ZTogd29uJ3QgYmUgYXMgZmFzdCBhcyBzdHJpbmdfam9pbiBhYm92ZSwgYnV0IHNpbXBsZXIgdG8gdXNlIChhbmQgY29kZSkKKy8vIE5vdGU6IE1vZGlmaWFibGUgcmVmZXJlbmNlIGRvZXNuJ3QgbWF0Y2ggdGhlIGdvb2dsZSBzdHlsZSBidXQgZG9lcyBtYXRjaCBzdGQgc3R5bGUgZm9yIHN0cmVhbSBoYW5kbGluZyBhbmQgYWxnb3JpdGhtcwordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgU3RyaW5nLCB0eXBlbmFtZSBGb3J3YXJkSXQ+CitTdHJlYW0gJnN0cmVhbV9qb2luKFN0cmVhbSAmc3RyZWFtLCBjb25zdCBTdHJpbmcgJnNlcCwgRm9yd2FyZEl0IGZpcnN0LCBGb3J3YXJkSXQgbGFzdCkgeworICAgIGlmIChmaXJzdCAhPSBsYXN0KSB7CisgICAgICAgIHN0cmVhbSA8PCAqZmlyc3Q7CisgICAgICAgICsrZmlyc3Q7CisgICAgICAgIHdoaWxlIChmaXJzdCAhPSBsYXN0KSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgc2VwIDw8ICpmaXJzdDsKKyAgICAgICAgICAgICsrZmlyc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbTsKK30KKworLy8gc3RyZWFtX2pvaW4gRm9yIHdob2xlIGNvbGxlY3Rpb25zIHdpdGggZm9yd2FyZCBpdGVyYXRvcnMKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIFN0cmluZywgdHlwZW5hbWUgQ29sbGVjdGlvbj4KK1N0cmVhbSAmc3RyZWFtX2pvaW4oU3RyZWFtICZzdHJlYW0sIGNvbnN0IFN0cmluZyAmc2VwLCBjb25zdCBDb2xsZWN0aW9uICZ2YWx1ZXMpIHsKKyAgICByZXR1cm4gc3RyZWFtX2pvaW4oc3RyZWFtLCBzZXAsIHZhbHVlcy5jYmVnaW4oKSwgdmFsdWVzLmNlbmQoKSk7Cit9CisKK3R5cGVkZWYgdm9pZCAqZGlzcGF0Y2hfa2V5Oworc3RhdGljIGlubGluZSBkaXNwYXRjaF9rZXkgZ2V0X2Rpc3BhdGNoX2tleShjb25zdCB2b2lkICpvYmplY3QpIHsgcmV0dXJuIChkaXNwYXRjaF9rZXkpICogKFZrTGF5ZXJEaXNwYXRjaFRhYmxlICoqKW9iamVjdDsgfQorCitWS19MQVlFUl9FWFBPUlQgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqZ2V0X2NoYWluX2luZm8oY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBWa0xheWVyRnVuY3Rpb24gZnVuYyk7CitWS19MQVlFUl9FWFBPUlQgVmtMYXllckRldmljZUNyZWF0ZUluZm8gKmdldF9jaGFpbl9pbmZvKGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIFZrTGF5ZXJGdW5jdGlvbiBmdW5jKTsKKworc3RhdGljIGlubGluZSBib29sIElzUG93ZXJPZlR3byh1bnNpZ25lZCB4KSB7IHJldHVybiB4ICYmICEoeCAmICh4IC0gMSkpOyB9CisKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgVktfTEFZRVJfQVBJX1ZFUlNJT04gVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKQorCit0eXBlZGVmIGVudW0gVmtTdHJpbmdFcnJvckZsYWdCaXRzIHsKKyAgICBWS19TVFJJTkdfRVJST1JfTk9ORSA9IDB4MDAwMDAwMDAsCisgICAgVktfU1RSSU5HX0VSUk9SX0xFTkdUSCA9IDB4MDAwMDAwMDEsCisgICAgVktfU1RSSU5HX0VSUk9SX0JBRF9EQVRBID0gMHgwMDAwMDAwMiwKK30gVmtTdHJpbmdFcnJvckZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZrU3RyaW5nRXJyb3JGbGFnczsKKworVktfTEFZRVJfRVhQT1JUIHZvaWQgbGF5ZXJfZGVidWdfcmVwb3J0X2FjdGlvbnMoZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXllcl9pZGVudGlmaWVyKTsKKworVktfTEFZRVJfRVhQT1JUIHZvaWQgbGF5ZXJfZGVidWdfbWVzc2VuZ2VyX2FjdGlvbnMoZGVidWdfcmVwb3J0X2RhdGEgKnJlcG9ydF9kYXRhLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXllcl9pZGVudGlmaWVyKTsKKworVktfTEFZRVJfRVhQT1JUIFZrU3RyaW5nRXJyb3JGbGFncyB2a19zdHJpbmdfdmFsaWRhdGUoY29uc3QgaW50IG1heF9sZW5ndGgsIGNvbnN0IGNoYXIgKmNoYXJfYXJyYXkpOworVktfTEFZRVJfRVhQT1JUIGJvb2wgd2hpdGVfbGlzdChjb25zdCBjaGFyICppdGVtLCBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gJndoaXRlbGlzdCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHVfZmZzKGludCB2YWwpIHsKKyNpZmRlZiBXSU4zMgorICAgIHVuc2lnbmVkIGxvbmcgYml0X3BvcyA9IDA7CisgICAgaWYgKF9CaXRTY2FuRm9yd2FyZCgmYml0X3BvcywgdmFsKSAhPSAwKSB7CisgICAgICAgIGJpdF9wb3MgKz0gMTsKKyAgICB9CisgICAgcmV0dXJuIGJpdF9wb3M7CisjZWxzZQorICAgIHJldHVybiBmZnModmFsKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvLyBzaGFyZWRfbXV0ZXggc3VwcG9ydCBhZGRlZCBpbiBNU1ZDIDIwMTUgdXBkYXRlIDIKKyNpZiBkZWZpbmVkKF9NU0NfRlVMTF9WRVIpICYmIF9NU0NfRlVMTF9WRVIgPj0gMTkwMDIzOTE4ICYmIE5URERJX1ZFUlNJT04gPiBOVERESV9XSU4xMF9SUzIKKyNpbmNsdWRlIDxzaGFyZWRfbXV0ZXg+CisjZW5kaWYKKworY2xhc3MgUmVhZFdyaXRlTG9jayB7CisgIHByaXZhdGU6CisjaWYgZGVmaW5lZChfTVNDX0ZVTExfVkVSKSAmJiBfTVNDX0ZVTExfVkVSID49IDE5MDAyMzkxOCAmJiBOVERESV9WRVJTSU9OID4gTlRERElfV0lOMTBfUlMyCisgICAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9tdXRleCBsb2NrX3Q7CisjZWxzZQorICAgIHR5cGVkZWYgc3RkOjptdXRleCBsb2NrX3Q7CisjZW5kaWYKKworICBwdWJsaWM6CisgICAgdm9pZCBsb2NrKCkgeyBtX2xvY2subG9jaygpOyB9CisgICAgYm9vbCB0cnlfbG9jaygpIHsgcmV0dXJuIG1fbG9jay50cnlfbG9jaygpOyB9CisgICAgdm9pZCB1bmxvY2soKSB7IG1fbG9jay51bmxvY2soKTsgfQorI2lmIGRlZmluZWQoX01TQ19GVUxMX1ZFUikgJiYgX01TQ19GVUxMX1ZFUiA+PSAxOTAwMjM5MTggJiYgTlRERElfVkVSU0lPTiA+IE5URERJX1dJTjEwX1JTMgorICAgIHZvaWQgbG9ja19zaGFyZWQoKSB7IG1fbG9jay5sb2NrX3NoYXJlZCgpOyB9CisgICAgYm9vbCB0cnlfbG9ja19zaGFyZWQoKSB7IHJldHVybiBtX2xvY2sudHJ5X2xvY2tfc2hhcmVkKCk7IH0KKyAgICB2b2lkIHVubG9ja19zaGFyZWQoKSB7IG1fbG9jay51bmxvY2tfc2hhcmVkKCk7IH0KKyNlbHNlCisgICAgdm9pZCBsb2NrX3NoYXJlZCgpIHsgbG9jaygpOyB9CisgICAgYm9vbCB0cnlfbG9ja19zaGFyZWQoKSB7IHJldHVybiB0cnlfbG9jaygpOyB9CisgICAgdm9pZCB1bmxvY2tfc2hhcmVkKCkgeyB1bmxvY2soKTsgfQorI2VuZGlmCisgIHByaXZhdGU6CisgICAgbG9ja190IG1fbG9jazsKK307CisKKyNpZiBkZWZpbmVkKF9NU0NfRlVMTF9WRVIpICYmIF9NU0NfRlVMTF9WRVIgPj0gMTkwMDIzOTE4ICYmIE5URERJX1ZFUlNJT04gPiBOVERESV9XSU4xMF9SUzIKK3R5cGVkZWYgc3RkOjpzaGFyZWRfbG9jazxSZWFkV3JpdGVMb2NrPiByZWFkX2xvY2tfZ3VhcmRfdDsKK3R5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxSZWFkV3JpdGVMb2NrPiB3cml0ZV9sb2NrX2d1YXJkX3Q7CisjZWxzZQordHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPFJlYWRXcml0ZUxvY2s+IHJlYWRfbG9ja19ndWFyZF90OwordHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPFJlYWRXcml0ZUxvY2s+IHdyaXRlX2xvY2tfZ3VhcmRfdDsKKyNlbmRpZgorCisvLyBMaW1pdGVkIGNvbmN1cnJlbnRfdW5vcmRlcmVkX21hcCB0aGF0IHN1cHBvcnRzIGludGVybmFsbHktc3luY2hyb25pemVkCisvLyBpbnNlcnQvZXJhc2UvYWNjZXNzLiBTcGxpdHMgbG9ja2luZyBhY3Jvc3MgTiBidWNrZXRzIGFuZCB1c2VzIHNoYXJlZF9tdXRleAorLy8gZm9yIHJlYWQvd3JpdGUgbG9ja2luZy4gSXRlcmF0b3JzIGFyZSBub3Qgc3VwcG9ydGVkLiBUaGUgZm9sbG93aW5nCisvLyBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQ6CisvLworLy8gaW5zZXJ0X29yX2Fzc2lnbjogSW5zZXJ0IGEgbmV3IGVsZW1lbnQgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIGVsZW1lbnQuCisvLyBpbnNlcnQ6IEluc2VydCBhIG5ldyBlbGVtZW50IGFuZCByZXR1cm4gd2hldGhlciBpdCB3YXMgaW5zZXJ0ZWQuCisvLyBlcmFzZTogUmVtb3ZlIGFuIGVsZW1lbnQuCisvLyBjb250YWluczogUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgaXMgaW4gdGhlIG1hcC4KKy8vIGZpbmQ6IFJldHVybnMgIT0gZW5kKCkgaWYgZm91bmQsIHZhbHVlIGlzIGluIHJldC0+c2Vjb25kLgorLy8gcG9wOiBFcmFzZXMgYW5kIHJldHVybnMgdGhlIGVyYXNlZCB2YWx1ZSBpZiBmb3VuZC4KKy8vCisvLyBmaW5kL2VuZDogZmluZCByZXR1cm5zIGEgdmFndWVseSBpdGVyYXRvci1saWtlIHR5cGUgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8KKy8vIGVuZCBhbmQgY2FuIHVzZSBpdGVyLT5zZWNvbmQgdG8gcmV0cmlldmUgdGhlIHJlZmVyZW5jZS4gVGhpcyBpcyB0byBlYXNlIHBvcnRpbmcKKy8vIGZvciBleGlzdGluZyBjb2RlIHRoYXQgY29tYmluZXMgdGhlIGV4aXN0ZW5jZSBjaGVjayBhbmQgbG9va3VwIGluIGEgc2luZ2xlCisvLyBvcGVyYXRpb24gKGFuZCB0aHVzIGEgc2luZ2xlIGxvY2spLiBpLmUuOgorLy8KKy8vICAgICAgYXV0byBpdGVyID0gbWFwLmZpbmQoa2V5KTsKKy8vICAgICAgaWYgKGl0ZXIgIT0gbWFwLmVuZCgpKSB7CisvLyAgICAgICAgICBUIHQgPSBpdGVyLT5zZWNvbmQ7CisvLyAgICAgICAgICAuLi4KKy8vCisvLyBzbmFwc2hvdDogUmV0dXJuIGFuIGFycmF5IG9mIGVsZW1lbnRzIChrZXksIHZhbHVlIHBhaXJzKSB0aGF0IHNhdGlzZnkgYW4gb3B0aW9uYWwKKy8vIHByZWRpY2F0ZS4gVGhpcyBjYW4gYmUgdXNlZCBhcyBhIHN1YnN0aXR1dGUgZm9yIGl0ZXJhdG9ycyBpbiBleGNlcHRpb25hbCBjYXNlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsIGludCBCVUNLRVRTTE9HMiA9IDIsIHR5cGVuYW1lIEhhc2ggPSBzdGQ6Omhhc2g8S2V5Pj4KK2NsYXNzIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcCB7CisgIHB1YmxpYzoKKyAgICB2b2lkIGluc2VydF9vcl9hc3NpZ24oY29uc3QgS2V5ICZrZXksIGNvbnN0IFQgJnZhbHVlKSB7CisgICAgICAgIHVpbnQzMl90IGggPSBDb25jdXJyZW50TWFwSGFzaE9iamVjdChrZXkpOworICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhsb2Nrc1toXS5sb2NrKTsKKyAgICAgICAgbWFwc1toXVtrZXldID0gdmFsdWU7CisgICAgfQorCisgICAgYm9vbCBpbnNlcnQoY29uc3QgS2V5ICZrZXksIGNvbnN0IFQgJnZhbHVlKSB7CisgICAgICAgIHVpbnQzMl90IGggPSBDb25jdXJyZW50TWFwSGFzaE9iamVjdChrZXkpOworICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhsb2Nrc1toXS5sb2NrKTsKKyAgICAgICAgYXV0byByZXQgPSBtYXBzW2hdLmluc2VydCh0eXBlbmFtZSBzdGQ6OnVub3JkZXJlZF9tYXA8S2V5LCBUPjo6dmFsdWVfdHlwZShrZXksIHZhbHVlKSk7CisgICAgICAgIHJldHVybiByZXQuc2Vjb25kOworICAgIH0KKworICAgIC8vIHJldHVybnMgc2l6ZV90eXBlCisgICAgc2l6ZV90IGVyYXNlKGNvbnN0IEtleSAma2V5KSB7CisgICAgICAgIHVpbnQzMl90IGggPSBDb25jdXJyZW50TWFwSGFzaE9iamVjdChrZXkpOworICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhsb2Nrc1toXS5sb2NrKTsKKyAgICAgICAgcmV0dXJuIG1hcHNbaF0uZXJhc2Uoa2V5KTsKKyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IEtleSAma2V5KSBjb25zdCB7CisgICAgICAgIHVpbnQzMl90IGggPSBDb25jdXJyZW50TWFwSGFzaE9iamVjdChrZXkpOworICAgICAgICByZWFkX2xvY2tfZ3VhcmRfdCBsb2NrKGxvY2tzW2hdLmxvY2spOworICAgICAgICByZXR1cm4gbWFwc1toXS5jb3VudChrZXkpICE9IDA7CisgICAgfQorCisgICAgLy8gdHlwZSByZXR1cm5lZCBieSBmaW5kKCkgYW5kIGVuZCgpLgorICAgIGNsYXNzIEZpbmRSZXN1bHQgeworICAgICAgcHVibGljOgorICAgICAgICBGaW5kUmVzdWx0KGJvb2wgYSwgVCBiKSA6IHJlc3VsdChhLCBzdGQ6Om1vdmUoYikpIHt9CisKKyAgICAgICAgLy8gPT0gYW5kICE9IG9ubHkgc3VwcG9ydCBjb21wYXJpbmcgYWdhaW5zdCBlbmQoKQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRmluZFJlc3VsdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QgPT0gZmFsc2UgJiYgb3RoZXIucmVzdWx0LmZpcnN0ID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpbmRSZXN1bHQgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgICAgICAgIC8vIE1ha2UgLT4gYWN0IGtpbmQgb2YgbGlrZSBhbiBpdGVyYXRvci4KKyAgICAgICAgc3RkOjpwYWlyPGJvb2wsIFQ+ICpvcGVyYXRvci0+KCkgeyByZXR1cm4gJnJlc3VsdDsgfQorICAgICAgICBjb25zdCBzdGQ6OnBhaXI8Ym9vbCwgVD4gKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmcmVzdWx0OyB9CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIC8vIChmb3VuZCwgcmVmZXJlbmNlIHRvIGVsZW1lbnQpCisgICAgICAgIHN0ZDo6cGFpcjxib29sLCBUPiByZXN1bHQ7CisgICAgfTsKKworICAgIC8vIGZpbmQoKS9lbmQoKSByZXR1cm4gYSBGaW5kUmVzdWx0IGNvbnRhaW5pbmcgYSBjb3B5IG9mIHRoZSB2YWx1ZS4gRm9yIGVuZCgpLAorICAgIC8vIHJldHVybiBhIGRlZmF1bHQgdmFsdWUuCisgICAgRmluZFJlc3VsdCBlbmQoKSBjb25zdCB7IHJldHVybiBGaW5kUmVzdWx0KGZhbHNlLCBUKCkpOyB9CisKKyAgICBGaW5kUmVzdWx0IGZpbmQoY29uc3QgS2V5ICZrZXkpIGNvbnN0IHsKKyAgICAgICAgdWludDMyX3QgaCA9IENvbmN1cnJlbnRNYXBIYXNoT2JqZWN0KGtleSk7CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2sobG9ja3NbaF0ubG9jayk7CisKKyAgICAgICAgYXV0byBpdHIgPSBtYXBzW2hdLmZpbmQoa2V5KTsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGl0ciAhPSBtYXBzW2hdLmVuZCgpOworCisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgcmV0dXJuIEZpbmRSZXN1bHQodHJ1ZSwgaXRyLT5zZWNvbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVuZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgRmluZFJlc3VsdCBwb3AoY29uc3QgS2V5ICZrZXkpIHsKKyAgICAgICAgdWludDMyX3QgaCA9IENvbmN1cnJlbnRNYXBIYXNoT2JqZWN0KGtleSk7CisgICAgICAgIHdyaXRlX2xvY2tfZ3VhcmRfdCBsb2NrKGxvY2tzW2hdLmxvY2spOworCisgICAgICAgIGF1dG8gaXRyID0gbWFwc1toXS5maW5kKGtleSk7CisgICAgICAgIGJvb2wgZm91bmQgPSBpdHIgIT0gbWFwc1toXS5lbmQoKTsKKworICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgIGF1dG8gcmV0ID0gc3RkOjptb3ZlKEZpbmRSZXN1bHQodHJ1ZSwgaXRyLT5zZWNvbmQpKTsKKyAgICAgICAgICAgIG1hcHNbaF0uZXJhc2UoaXRyKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW5kKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgS2V5LCBUPj4gc25hcHNob3Qoc3RkOjpmdW5jdGlvbjxib29sKFQpPiBmID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgS2V5LCBUPj4gcmV0OworICAgICAgICBmb3IgKGludCBoID0gMDsgaCA8IEJVQ0tFVFM7ICsraCkgeworICAgICAgICAgICAgcmVhZF9sb2NrX2d1YXJkX3QgbG9jayhsb2Nrc1toXS5sb2NrKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBqIDogbWFwc1toXSkgeworICAgICAgICAgICAgICAgIGlmICghZiB8fCBmKGouc2Vjb25kKSkgeworICAgICAgICAgICAgICAgICAgICByZXQucHVzaF9iYWNrKGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBpbnQgQlVDS0VUUyA9ICgxIDw8IEJVQ0tFVFNMT0cyKTsKKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxLZXksIFQsIEhhc2g+IG1hcHNbQlVDS0VUU107CisgICAgc3RydWN0IHsKKyAgICAgICAgbXV0YWJsZSBSZWFkV3JpdGVMb2NrIGxvY2s7CisgICAgICAgIC8vIFB1dCBlYWNoIGxvY2sgb24gaXRzIG93biBjYWNoZSBsaW5lIHRvIGF2b2lkIGZhbHNlIGNhY2hlIGxpbmUgc2hhcmluZy4KKyAgICAgICAgY2hhciBwYWRkaW5nWygtaW50KHNpemVvZihSZWFkV3JpdGVMb2NrKSkpICYgNjNdOworICAgIH0gbG9ja3NbQlVDS0VUU107CisKKyAgICB1aW50MzJfdCBDb25jdXJyZW50TWFwSGFzaE9iamVjdChjb25zdCBLZXkgJm9iamVjdCkgY29uc3QgeworICAgICAgICB1aW50NjRfdCB1NjQgPSAodWludDY0X3QpKHVpbnRwdHJfdClvYmplY3Q7CisgICAgICAgIHVpbnQzMl90IGhhc2ggPSAodWludDMyX3QpKHU2NCA+PiAzMikgKyAodWludDMyX3QpdTY0OworICAgICAgICBoYXNoIF49IChoYXNoID4+IEJVQ0tFVFNMT0cyKSBeIChoYXNoID4+ICgyICogQlVDS0VUU0xPRzIpKTsKKyAgICAgICAgaGFzaCAmPSAoQlVDS0VUUyAtIDEpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xvYWRlcl9wbGF0Zm9ybS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX2xvYWRlcl9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjI1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMvdmtfbG9hZGVyX3BsYXRmb3JtLmgKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSWFuIEVsbGlvdCA8aWFuQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTGVubnkgS29tb3cgPGxlbm55QGx1bmFyZy5jb20+CisgKgorICovCisjcHJhZ21hIG9uY2UKKworI2lmIGRlZmluZWQoX1dJTjMyKQorLy8gV2luU29jazIuaCBtdXN0IGJlIGluY2x1ZGVkICpCRUZPUkUqIHdpbmRvd3MuaAorI2luY2x1ZGUgPFdpblNvY2syLmg+CisjZW5kaWYgIC8vIF9XSU4zMgorCisjaW5jbHVkZSAidnVsa2FuL3ZrX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidnVsa2FuL3ZrX3Nka19wbGF0Zm9ybS5oIgorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorLyogTGludXgtc3BlY2lmaWMgY29tbW9uIGNvZGU6ICovCisKKy8vIEhlYWRlcnM6CisvLyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQorLy8gVEJEOiBBcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmb2xsb3dpbmcgZmlsZSB1c2VkPworI2luY2x1ZGUgPHVuaXN0ZC5oPgorLy8gTm90ZTogVGhlIGZvbGxvd2luZyBmaWxlIGlzIGZvciBkeW5hbWljIGxvYWRpbmc6CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorCisvLyBWSyBMaWJyYXJ5IEZpbGVuYW1lcywgUGF0aHMsIGV0Yy46CisjZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JworI2RlZmluZSBESVJFQ1RPUllfU1lNQk9MICcvJworCisjZGVmaW5lIFZVTEtBTl9ESVIgIi92dWxrYW4vIgorI2RlZmluZSBWVUxLQU5fSUNEQ09ORl9ESVIgImljZC5kIgorI2RlZmluZSBWVUxLQU5fSUNEX0RJUiAiaWNkIgorI2RlZmluZSBWVUxLQU5fRUxBWUVSQ09ORl9ESVIgImV4cGxpY2l0X2xheWVyLmQiCisjZGVmaW5lIFZVTEtBTl9JTEFZRVJDT05GX0RJUiAiaW1wbGljaXRfbGF5ZXIuZCIKKyNkZWZpbmUgVlVMS0FOX0xBWUVSX0RJUiAibGF5ZXIiCisKKyNkZWZpbmUgREVGQVVMVF9WS19EUklWRVJTX0lORk8gIiIKKyNkZWZpbmUgREVGQVVMVF9WS19FTEFZRVJTX0lORk8gIiIKKyNkZWZpbmUgREVGQVVMVF9WS19JTEFZRVJTX0lORk8gIiIKKworI2RlZmluZSBERUZBVUxUX1ZLX0RSSVZFUlNfUEFUSCAiIgorI2lmICFkZWZpbmVkKERFRkFVTFRfVktfTEFZRVJTX1BBVEgpCisjZGVmaW5lIERFRkFVTFRfVktfTEFZRVJTX1BBVEggIiIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTEFZRVJTX1NPVVJDRV9QQVRIKQorI2RlZmluZSBMQVlFUlNfU09VUkNFX1BBVEggTlVMTAorI2VuZGlmCisjZGVmaW5lIExBWUVSU19QQVRIX0VOViAiVktfTEFZRVJfUEFUSCIKKyNkZWZpbmUgRU5BQkxFRF9MQVlFUlNfRU5WICJWS19JTlNUQU5DRV9MQVlFUlMiCisKKyNkZWZpbmUgUkVMQVRJVkVfVktfRFJJVkVSU19JTkZPIFZVTEtBTl9ESVIgVlVMS0FOX0lDRENPTkZfRElSCisjZGVmaW5lIFJFTEFUSVZFX1ZLX0VMQVlFUlNfSU5GTyBWVUxLQU5fRElSIFZVTEtBTl9FTEFZRVJDT05GX0RJUgorI2RlZmluZSBSRUxBVElWRV9WS19JTEFZRVJTX0lORk8gVlVMS0FOX0RJUiBWVUxLQU5fSUxBWUVSQ09ORl9ESVIKKworLy8gQzk5OgorI2RlZmluZSBQUklOVEZfU0laRV9UX1NQRUNJRklFUiAiJXp1IgorCisvLyBGaWxlIElPCitzdGF0aWMgaW5saW5lIGJvb2wgbG9hZGVyX3BsYXRmb3JtX2ZpbGVfZXhpc3RzKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBpZiAoYWNjZXNzKHBhdGgsIEZfT0spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGxvYWRlcl9wbGF0Zm9ybV9pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBpZiAocGF0aFswXSA9PSAnLycpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmxvYWRlcl9wbGF0Zm9ybV9kaXJuYW1lKGNoYXIgKnBhdGgpIHsgcmV0dXJuIGRpcm5hbWUocGF0aCk7IH0KKworLy8gRHluYW1pYyBMb2FkaW5nIG9mIGxpYnJhcmllczoKK3R5cGVkZWYgdm9pZCAqbG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZTsKK3N0YXRpYyBpbmxpbmUgbG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsb2FkZXJfcGxhdGZvcm1fb3Blbl9saWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICAvLyBXaGVuIGxvYWRpbmcgdGhlIGxpYnJhcnksIHdlIHVzZSBSVExEX0xBWlkgc28gdGhhdCBub3QgYWxsIHN5bWJvbHMgaGF2ZSB0byBiZQorICAgIC8vIHJlc29sdmVkIGF0IHRoaXMgdGltZSAod2hpY2ggaW1wcm92ZXMgcGVyZm9ybWFuY2UpLiBOb3RlIHRoYXQgaWYgbm90IGFsbCBzeW1ib2xzCisgICAgLy8gY2FuIGJlIHJlc29sdmVkLCB0aGlzIGNvdWxkIGNhdXNlIGNyYXNoZXMgbGF0ZXIuIFVzZSB0aGUgTERfQklORF9OT1cgZW52aXJvbm1lbnQKKyAgICAvLyB2YXJpYWJsZSB0byBmb3JjZSBhbGwgc3ltYm9scyB0byBiZSByZXNvbHZlZCBoZXJlLgorICAgIHJldHVybiBkbG9wZW4obGliUGF0aCwgUlRMRF9MQVpZIHwgUlRMRF9MT0NBTCk7Cit9CitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmxvYWRlcl9wbGF0Zm9ybV9vcGVuX2xpYnJhcnlfZXJyb3IoY29uc3QgY2hhciAqbGliUGF0aCkgeyByZXR1cm4gZGxlcnJvcigpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZGVyX3BsYXRmb3JtX2Nsb3NlX2xpYnJhcnkobG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsaWJyYXJ5KSB7IGRsY2xvc2UobGlicmFyeSk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3MobG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsaWJyYXJ5LCBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgYXNzZXJ0KGxpYnJhcnkpOworICAgIGFzc2VydChuYW1lKTsKKyAgICByZXR1cm4gZGxzeW0obGlicmFyeSwgbmFtZSk7Cit9CitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUpIHsgcmV0dXJuIGRsZXJyb3IoKTsgfQorCisvLyBUaHJlYWRzOgordHlwZWRlZiBwdGhyZWFkX3QgbG9hZGVyX3BsYXRmb3JtX3RocmVhZDsKKyNkZWZpbmUgVEhSRUFEX0xPQ0FMX0RFQ0wgX190aHJlYWQKKworLy8gVGhlIG9uY2UgaW5pdCBmdW5jdGlvbmFsaXR5IGlzIG5vdCB1c2VkIG9uIExpbnV4CisjZGVmaW5lIExPQURFUl9QTEFURk9STV9USFJFQURfT05DRV9ERUNMQVJBVElPTih2YXIpCisjZGVmaW5lIExPQURFUl9QTEFURk9STV9USFJFQURfT05DRV9ERUZJTklUSU9OKHZhcikKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFKGN0bCwgZnVuYykKKworLy8gVGhyZWFkIElEczoKK3R5cGVkZWYgcHRocmVhZF90IGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaWQ7CitzdGF0aWMgaW5saW5lIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaWQgbG9hZGVyX3BsYXRmb3JtX2dldF90aHJlYWRfaWQoKSB7IHJldHVybiBwdGhyZWFkX3NlbGYoKTsgfQorCisvLyBUaHJlYWQgbXV0ZXg6Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4Oworc3RhdGljIGlubGluZSB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY3JlYXRlX211dGV4KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBwdGhyZWFkX211dGV4X2luaXQocE11dGV4LCBOVUxMKTsgfQorc3RhdGljIGlubGluZSB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgcHRocmVhZF9tdXRleF9sb2NrKHBNdXRleCk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgcHRocmVhZF9tdXRleF91bmxvY2socE11dGV4KTsgfQorc3RhdGljIGlubGluZSB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfZGVsZXRlX211dGV4KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBwdGhyZWFkX211dGV4X2Rlc3Ryb3kocE11dGV4KTsgfQordHlwZWRlZiBwdGhyZWFkX2NvbmRfdCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NvbmQ7CitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pbml0X2NvbmQobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCkgeyBwdGhyZWFkX2NvbmRfaW5pdChwQ29uZCwgTlVMTCk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NvbmRfd2FpdChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NvbmQgKnBDb25kLCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsKKyAgICBwdGhyZWFkX2NvbmRfd2FpdChwQ29uZCwgcE11dGV4KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NvbmRfYnJvYWRjYXN0KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY29uZCAqcENvbmQpIHsgcHRocmVhZF9jb25kX2Jyb2FkY2FzdChwQ29uZCk7IH0KKworI2RlZmluZSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZSkgYWxsb2NhKHNpemUpCisKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSAgLy8gZGVmaW5lZChfX2xpbnV4X18pCisvKiBXaW5kb3dzLXNwZWNpZmljIGNvbW1vbiBjb2RlOiAqLworLy8gV2luQmFzZS5oIGRlZmluZXMgQ3JlYXRlU2VtYXBob3JlIGFuZCBzeW5jaGFwaS5oIGRlZmluZXMgQ3JlYXRlRXZlbnQKKy8vICB1bmRlZmluZSB0aGVtIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIFZrTGF5ZXJEaXNwYXRjaFRhYmxlIHN0cnVjdCBtZW1iZXJzLgorI2lmZGVmIENyZWF0ZVNlbWFwaG9yZQorI3VuZGVmIENyZWF0ZVNlbWFwaG9yZQorI2VuZGlmCisjaWZkZWYgQ3JlYXRlRXZlbnQKKyN1bmRlZiBDcmVhdGVFdmVudAorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzaGx3YXBpLmg+CisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKy8vIFZLIExpYnJhcnkgRmlsZW5hbWVzLCBQYXRocywgZXRjLjoKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzsnCisjZGVmaW5lIERJUkVDVE9SWV9TWU1CT0wgJ1xcJworI2RlZmluZSBERUZBVUxUX1ZLX1JFR0lTVFJZX0hJVkUgSEtFWV9MT0NBTF9NQUNISU5FCisjZGVmaW5lIERFRkFVTFRfVktfUkVHSVNUUllfSElWRV9TVFIgIkhLRVlfTE9DQUxfTUFDSElORSIKKyNkZWZpbmUgU0VDT05EQVJZX1ZLX1JFR0lTVFJZX0hJVkUgSEtFWV9DVVJSRU5UX1VTRVIKKyNkZWZpbmUgU0VDT05EQVJZX1ZLX1JFR0lTVFJZX0hJVkVfU1RSICJIS0VZX0NVUlJFTlRfVVNFUiIKKyNkZWZpbmUgREVGQVVMVF9WS19EUklWRVJTX0lORk8gIlNPRlRXQVJFXFxLaHJvbm9zXFwiIEFQSV9OQU1FICJcXERyaXZlcnMiCisjZGVmaW5lIERFRkFVTFRfVktfRFJJVkVSU19QQVRIICIiCisjZGVmaW5lIERFRkFVTFRfVktfRUxBWUVSU19JTkZPICJTT0ZUV0FSRVxcS2hyb25vc1xcIiBBUElfTkFNRSAiXFxFeHBsaWNpdExheWVycyIKKyNkZWZpbmUgREVGQVVMVF9WS19JTEFZRVJTX0lORk8gIlNPRlRXQVJFXFxLaHJvbm9zXFwiIEFQSV9OQU1FICJcXEltcGxpY2l0TGF5ZXJzIgorI2lmICFkZWZpbmVkKERFRkFVTFRfVktfTEFZRVJTX1BBVEgpCisjZGVmaW5lIERFRkFVTFRfVktfTEFZRVJTX1BBVEggIiIKKyNlbmRpZgorI2lmICFkZWZpbmVkKExBWUVSU19TT1VSQ0VfUEFUSCkKKyNkZWZpbmUgTEFZRVJTX1NPVVJDRV9QQVRIIE5VTEwKKyNlbmRpZgorI2RlZmluZSBMQVlFUlNfUEFUSF9FTlYgIlZLX0xBWUVSX1BBVEgiCisjZGVmaW5lIEVOQUJMRURfTEFZRVJTX0VOViAiVktfSU5TVEFOQ0VfTEFZRVJTIgorI2RlZmluZSBSRUxBVElWRV9WS19EUklWRVJTX0lORk8gIiIKKyNkZWZpbmUgUkVMQVRJVkVfVktfRUxBWUVSU19JTkZPICIiCisjZGVmaW5lIFJFTEFUSVZFX1ZLX0lMQVlFUlNfSU5GTyAiIgorI2RlZmluZSBQUklOVEZfU0laRV9UX1NQRUNJRklFUiAiJUl1IgorCisjaWYgZGVmaW5lZChfV0lOMzIpCisvLyBHZXQgdGhlIGtleSBmb3IgdGhlIHBsdWcgbiBwbGF5IGRyaXZlciByZWdpc3RyeQorLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBOT1QgYmUgZnJlZWQKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqTG9hZGVyUG5wRHJpdmVyUmVnaXN0cnkoKSB7CisgICAgQk9PTCBpc193b3c7CisgICAgSXNXb3c2NFByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgJmlzX3dvdyk7CisgICAgcmV0dXJuIGlzX3dvdyA/IChBUElfTkFNRSAiRHJpdmVyTmFtZVdvdyIpIDogKEFQSV9OQU1FICJEcml2ZXJOYW1lIik7Cit9CisKKy8vIEdldCB0aGUga2V5IGZvciB0aGUgcGx1ZyAnbiBwbGF5IGV4cGxpY2l0IGxheWVyIHJlZ2lzdHJ5CisvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gc2hvdWxkIE5PVCBiZSBmcmVlZAorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpMb2FkZXJQbnBFTGF5ZXJSZWdpc3RyeSgpIHsKKyAgICBCT09MIGlzX3dvdzsKKyAgICBJc1dvdzY0UHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAmaXNfd293KTsKKyAgICByZXR1cm4gaXNfd293ID8gKEFQSV9OQU1FICJFeHBsaWNpdExheWVyc1dvdyIpIDogKEFQSV9OQU1FICJFeHBsaWNpdExheWVycyIpOworfQorLy8gR2V0IHRoZSBrZXkgZm9yIHRoZSBwbHVnICduIHBsYXkgaW1wbGljaXQgbGF5ZXIgcmVnaXN0cnkKKy8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBzaG91bGQgTk9UIGJlIGZyZWVkCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqTG9hZGVyUG5wSUxheWVyUmVnaXN0cnkoKSB7CisgICAgQk9PTCBpc193b3c7CisgICAgSXNXb3c2NFByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgJmlzX3dvdyk7CisgICAgcmV0dXJuIGlzX3dvdyA/IChBUElfTkFNRSAiSW1wbGljaXRMYXllcnNXb3ciKSA6IChBUElfTkFNRSAiSW1wbGljaXRMYXllcnMiKTsKK30KKyNlbmRpZgorCisvLyBGaWxlIElPCitzdGF0aWMgYm9vbCBsb2FkZXJfcGxhdGZvcm1fZmlsZV9leGlzdHMoY29uc3QgY2hhciAqcGF0aCkgeworICAgIGlmICgoX2FjY2VzcyhwYXRoLCAwKSkgPT0gLTEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBsb2FkZXJfcGxhdGZvcm1faXNfcGF0aF9hYnNvbHV0ZShjb25zdCBjaGFyICpwYXRoKSB7CisgICAgaWYgKCFwYXRoIHx8ICEqcGF0aCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICgqcGF0aCA9PSBESVJFQ1RPUllfU1lNQk9MIHx8IHBhdGhbMV0gPT0gJzonKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFdJTjMyIHJ1bnRpbWUgZG9lc24ndCBoYXZlIGRpcm5hbWUoKS4KK3N0YXRpYyBpbmxpbmUgY2hhciAqbG9hZGVyX3BsYXRmb3JtX2Rpcm5hbWUoY2hhciAqcGF0aCkgeworICAgIGNoYXIgKmN1cnJlbnQsICpuZXh0OworCisgICAgLy8gVE9ETy9UQkQ6IERvIHdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBXaW5kb3dzJ3MgIjoiIGNoYXJhY3Rlcj8KKworICAgIGZvciAoY3VycmVudCA9IHBhdGg7ICpjdXJyZW50ICE9ICdcMCc7IGN1cnJlbnQgPSBuZXh0KSB7CisgICAgICAgIG5leHQgPSBzdHJjaHIoY3VycmVudCwgRElSRUNUT1JZX1NZTUJPTCk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IHBhdGgpICooY3VycmVudCAtIDEpID0gJ1wwJzsKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUG9pbnQgb25lIGNoYXJhY3RlciBwYXN0IHRoZSBESVJFQ1RPUllfU1lNQk9MOgorICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYXRoOworfQorCisvLyBXSU4zMiBydW50aW1lIGRvZXNuJ3QgaGF2ZSBiYXNlbmFtZSgpLgorLy8gTWljcm9zb2Z0IGFsc28gZG9lc24ndCBoYXZlIGJhc2VuYW1lKCkuICBQYXRocyBhcmUgZGlmZmVyZW50IG9uIFdpbmRvd3MsIGFuZAorLy8gc28gdGhpcyBpcyBqdXN0IGEgdGVtcG9yYXJ5IHNvbHV0aW9uIGluIG9yZGVyIHRvIGdldCB1cyBjb21waWxpbmcsIHNvIHRoYXQgd2UKKy8vIGNhbiB0ZXN0IHNvbWUgc2NlbmFyaW9zLCBhbmQgZGV2ZWxvcCB0aGUgY29ycmVjdCBzb2x1dGlvbiBmb3IgV2luZG93cy4KKy8vIFRPRE86IERldmVsb3AgYSBiZXR0ZXIsIHBlcm1hbmVudCBzb2x1dGlvbiBmb3IgV2luZG93cywgdG8gcmVwbGFjZSB0aGlzCisvLyB0ZW1wb3JhcnkgY29kZToKK3N0YXRpYyBjaGFyICpsb2FkZXJfcGxhdGZvcm1fYmFzZW5hbWUoY2hhciAqcGF0aG5hbWUpIHsKKyAgICBjaGFyICpjdXJyZW50LCAqbmV4dDsKKworICAgIC8vIFRPRE8vVEJEOiBEbyB3ZSBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgV2luZG93cydzICI6IiBjaGFyYWN0ZXI/CisKKyAgICBmb3IgKGN1cnJlbnQgPSBwYXRobmFtZTsgKmN1cnJlbnQgIT0gJ1wwJzsgY3VycmVudCA9IG5leHQpIHsKKyAgICAgICAgbmV4dCA9IHN0cmNocihjdXJyZW50LCBESVJFQ1RPUllfU1lNQk9MKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gTm8gbW9yZSBESVJFQ1RPUllfU1lNQk9MJ3Mgc28gcmV0dXJuIHA6CisgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBvaW50IG9uZSBjaGFyYWN0ZXIgcGFzdCB0aGUgRElSRUNUT1JZX1NZTUJPTDoKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IHRvIGhlcmUsIGJ1dCB0aGlzIG1ha2VzIHRoZSBjb21waWxlciBoYXBweToKKyAgICByZXR1cm4gY3VycmVudDsKK30KKworLy8gRHluYW1pYyBMb2FkaW5nOgordHlwZWRlZiBITU9EVUxFIGxvYWRlcl9wbGF0Zm9ybV9kbF9oYW5kbGU7CitzdGF0aWMgbG9hZGVyX3BsYXRmb3JtX2RsX2hhbmRsZSBsb2FkZXJfcGxhdGZvcm1fb3Blbl9saWJyYXJ5KGNvbnN0IGNoYXIgKmxpYl9wYXRoKSB7CisgICAgLy8gVHJ5IGxvYWRpbmcgdGhlIGxpYnJhcnkgdGhlIG9yaWdpbmFsIHdheSBmaXJzdC4KKyAgICBsb2FkZXJfcGxhdGZvcm1fZGxfaGFuZGxlIGxpYl9oYW5kbGUgPSBMb2FkTGlicmFyeShsaWJfcGF0aCk7CisgICAgaWYgKGxpYl9oYW5kbGUgPT0gTlVMTCAmJiBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9NT0RfTk9UX0ZPVU5EKSB7CisgICAgICAgIC8vIElmIHRoYXQgZmFpbGVkLCB0aGVuIHRyeSBsb2FkaW5nIGl0IHdpdGggYnJvYWRlciBzZWFyY2ggZm9sZGVycy4KKyAgICAgICAgbGliX2hhbmRsZSA9IExvYWRMaWJyYXJ5RXgobGliX3BhdGgsIE5VTEwsIExPQURfTElCUkFSWV9TRUFSQ0hfREVGQVVMVF9ESVJTIHwgTE9BRF9MSUJSQVJZX1NFQVJDSF9ETExfTE9BRF9ESVIpOworICAgIH0KKyAgICByZXR1cm4gbGliX2hhbmRsZTsKK30KK3N0YXRpYyBjaGFyICpsb2FkZXJfcGxhdGZvcm1fb3Blbl9saWJyYXJ5X2Vycm9yKGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICBzdGF0aWMgY2hhciBlcnJvck1zZ1sxNjRdOworICAgICh2b2lkKXNucHJpbnRmKGVycm9yTXNnLCAxNjMsICJGYWlsZWQgdG8gb3BlbiBkeW5hbWljIGxpYnJhcnkgXCIlc1wiIHdpdGggZXJyb3IgJWx1IiwgbGliUGF0aCwgR2V0TGFzdEVycm9yKCkpOworICAgIHJldHVybiBlcnJvck1zZzsKK30KK3N0YXRpYyB2b2lkIGxvYWRlcl9wbGF0Zm9ybV9jbG9zZV9saWJyYXJ5KGxvYWRlcl9wbGF0Zm9ybV9kbF9oYW5kbGUgbGlicmFyeSkgeyBGcmVlTGlicmFyeShsaWJyYXJ5KTsgfQorc3RhdGljIHZvaWQgKmxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9wbGF0Zm9ybV9kbF9oYW5kbGUgbGlicmFyeSwgY29uc3QgY2hhciAqbmFtZSkgeworICAgIGFzc2VydChsaWJyYXJ5KTsKKyAgICBhc3NlcnQobmFtZSk7CisgICAgcmV0dXJuICh2b2lkICopR2V0UHJvY0FkZHJlc3MobGlicmFyeSwgbmFtZSk7Cit9CitzdGF0aWMgY2hhciAqbG9hZGVyX3BsYXRmb3JtX2dldF9wcm9jX2FkZHJlc3NfZXJyb3IoY29uc3QgY2hhciAqbmFtZSkgeworICAgIHN0YXRpYyBjaGFyIGVycm9yTXNnWzEyMF07CisgICAgKHZvaWQpc25wcmludGYoZXJyb3JNc2csIDExOSwgIkZhaWxlZCB0byBmaW5kIGZ1bmN0aW9uIFwiJXNcIiBpbiBkeW5hbWljIGxpYnJhcnkiLCBuYW1lKTsKKyAgICByZXR1cm4gZXJyb3JNc2c7Cit9CisKKy8vIFRocmVhZHM6Cit0eXBlZGVmIEhBTkRMRSBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkOworI2RlZmluZSBUSFJFQURfTE9DQUxfREVDTCBfX2RlY2xzcGVjKHRocmVhZCkKKworLy8gVGhlIG9uY2UgaW5pdCBmdW5jdGlvbmFsaXR5IGlzIG5vdCB1c2VkIHdoZW4gYnVpbGRpbmcgYSBETEwgb24gV2luZG93cy4gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0byBjbGVhbiB1cCB0aGUKKy8vIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgYW55dGhpbmcgYWxsb2NhdGVkIGJ5IG9uY2UgaW5pdC4gVGhpcyBpc24ndCBhIHByb2JsZW0gZm9yIHN0YXRpYyBsaWJyYXJpZXMsIGJ1dCBpdCBpcyBmb3IgZHluYW1pYworLy8gb25lcy4gV2hlbiBidWlsZGluZyBhIERMTCwgd2UgdXNlIERsbE1haW4oKSBpbnN0ZWFkIHRvIGFsbG93IHByb3Blcmx5IGNsZWFuaW5nIHVwIHJlc291cmNlcy4KKyNpZiBkZWZpbmVkKExPQURFUl9EWU5BTUlDX0xJQikKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFX0RFQ0xBUkFUSU9OKHZhcikKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFX0RFRklOSVRJT04odmFyKQorI2RlZmluZSBMT0FERVJfUExBVEZPUk1fVEhSRUFEX09OQ0UoY3RsLCBmdW5jKQorI2Vsc2UKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFX0RFQ0xBUkFUSU9OKHZhcikgSU5JVF9PTkNFIHZhciA9IElOSVRfT05DRV9TVEFUSUNfSU5JVDsKKyNkZWZpbmUgTE9BREVSX1BMQVRGT1JNX1RIUkVBRF9PTkNFX0RFRklOSVRJT04odmFyKSBJTklUX09OQ0UgdmFyOworI2RlZmluZSBMT0FERVJfUExBVEZPUk1fVEhSRUFEX09OQ0UoY3RsLCBmdW5jKSBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX29uY2VfZm4oY3RsLCBmdW5jKQorc3RhdGljIEJPT0wgQ0FMTEJBQ0sgSW5pdEZ1bmNXcmFwcGVyKFBJTklUX09OQ0UgSW5pdE9uY2UsIFBWT0lEIFBhcmFtZXRlciwgUFZPSUQgKkNvbnRleHQpIHsKKyAgICB2b2lkICgqZnVuYykodm9pZCkgPSAodm9pZCAoKikodm9pZCkpUGFyYW1ldGVyOworICAgIGZ1bmMoKTsKKyAgICByZXR1cm4gVFJVRTsKK30KK3N0YXRpYyB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfb25jZV9mbih2b2lkICpjdGwsIHZvaWQgKCpmdW5jKSh2b2lkKSkgeworICAgIGFzc2VydChmdW5jICE9IE5VTEwpOworICAgIGFzc2VydChjdGwgIT0gTlVMTCk7CisgICAgSW5pdE9uY2VFeGVjdXRlT25jZSgoUElOSVRfT05DRSljdGwsIEluaXRGdW5jV3JhcHBlciwgKHZvaWQgKilmdW5jLCBOVUxMKTsKK30KKyNlbmRpZgorCisvLyBUaHJlYWQgSURzOgordHlwZWRlZiBEV09SRCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2lkOworc3RhdGljIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaWQgbG9hZGVyX3BsYXRmb3JtX2dldF90aHJlYWRfaWQoKSB7IHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsgfQorCisvLyBUaHJlYWQgbXV0ZXg6Cit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleDsKK3N0YXRpYyB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfY3JlYXRlX211dGV4KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKHBNdXRleCk7IH0KK3N0YXRpYyB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgRW50ZXJDcml0aWNhbFNlY3Rpb24ocE11dGV4KTsgfQorc3RhdGljIHZvaWQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IExlYXZlQ3JpdGljYWxTZWN0aW9uKHBNdXRleCk7IH0KK3N0YXRpYyB2b2lkIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfZGVsZXRlX211dGV4KGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBEZWxldGVDcml0aWNhbFNlY3Rpb24ocE11dGV4KTsgfQordHlwZWRlZiBDT05ESVRJT05fVkFSSUFCTEUgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jb25kOworc3RhdGljIHZvaWQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pbml0X2NvbmQobG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCkgeyBJbml0aWFsaXplQ29uZGl0aW9uVmFyaWFibGUocENvbmQpOyB9CitzdGF0aWMgdm9pZCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NvbmRfd2FpdChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NvbmQgKnBDb25kLCBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsKKyAgICBTbGVlcENvbmRpdGlvblZhcmlhYmxlQ1MocENvbmQsIHBNdXRleCwgSU5GSU5JVEUpOworfQorc3RhdGljIHZvaWQgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jb25kX2Jyb2FkY2FzdChsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NvbmQgKnBDb25kKSB7IFdha2VBbGxDb25kaXRpb25WYXJpYWJsZShwQ29uZCk7IH0KKworI2RlZmluZSBsb2FkZXJfc3RhY2tfYWxsb2Moc2l6ZSkgX2FsbG9jYShzaXplKQorI2Vsc2UgIC8vIGRlZmluZWQoX1dJTjMyKQorCisjZXJyb3IgVGhlICJsb2FkZXJfcGxhdGZvcm0uaCIgZmlsZSBtdXN0IGJlIG1vZGlmaWVkIGZvciB0aGlzIE9TLgorCisvLyBOT1RFOiBJbiBvcmRlciB0byBzdXBwb3J0IGFub3RoZXIgT1MsIGFuICNlbGlmIG5lZWRzIHRvIGJlIGFkZGVkIChhYm92ZSB0aGUKKy8vICIjZWxzZSAvLyBkZWZpbmVkKF9XSU4zMikiKSBmb3IgdGhhdCBPUywgYW5kIE9TLXNwZWNpZmljIHZlcnNpb25zIG9mIHRoZQorLy8gY29udGVudHMgb2YgdGhpcyBmaWxlIG11c3QgYmUgY3JlYXRlZC4KKworLy8gTk9URTogT3RoZXIgT1Mtc3BlY2lmaWMgY2hhbmdlcyBhcmUgYWxzbyBuZWVkZWQgZm9yIHRoaXMgT1MuICBTZWFyY2ggZm9yCisvLyBmaWxlcyB3aXRoICJXSU4zMiIgaW4gaXQsIGFzIGEgcXVpY2sgd2F5IHRvIGZpbmQgZmlsZXMgdGhhdCBtdXN0IGJlIGNoYW5nZWQuCisKKyNlbmRpZiAgLy8gZGVmaW5lZChfV0lOMzIpCisKKy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGFwcGVhcnMgdG8gYmUgYSByZWxhdGl2ZSBvciBhYnNvbHV0ZQorLy8gcGF0aCwgYXMgb3Bwb3NlZCB0byBhIGJhcmUgZmlsZW5hbWUuCitzdGF0aWMgaW5saW5lIGJvb2wgbG9hZGVyX3BsYXRmb3JtX2lzX3BhdGgoY29uc3QgY2hhciAqcGF0aCkgeyByZXR1cm4gc3RyY2hyKHBhdGgsIERJUkVDVE9SWV9TWU1CT0wpICE9IE5VTEw7IH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19tZW1fYWxsb2MuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL2xheWVycy92a19tZW1fYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzEzNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3ZrX21lbV9hbGxvYy5oCkBAIC0wLDAgKzEsMTY4MTMgQEAKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKy8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKy8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKy8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKy8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKy8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKy8vIFRIRSBTT0ZUV0FSRS4KKy8vCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKy8vCisvLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9HUFVPcGVuLUxpYnJhcmllc0FuZFNES3MvVnVsa2FuTWVtb3J5QWxsb2NhdG9yCisvLyBUSElTIEZJTEUgSEFTIEJFRU4gQ0hBTkdFRCBGUk9NIFRIRSBPUklHSU5BTCBWRVJTSU9OCisvLworLy8gQ2hhbmdlIExvZzoKKy8vICAgIDMvMjcvMTkgLSBNYWtlIGNoYW5nZXMgdG8gc3VwcHJlc3Mgd2FybmluZ3MgZnJvbSBHQ0MKKy8vICAgIDQvMTgvMTkgLSBNYWtlIGNoYW5nZXMgdG8gc3VwcHJlc3Mgd2FybmluZ3MgZnJvbSBjbGFuZworLy8gICAgNi8wNS8xOSAtIE1ha2UgY2hhbmdlcyB0byBzdXBwcmVzcyB3YXJuaW5ncyBmcm9tIGNsYW5nIDMuOC4wCisvLyAgICA2LzA1LzE5IC0gTWFrZSBjaGFuZ2VzIHRvIHN1cHByZXNzIG1vcmUgd2FybmluZ3MgZnJvbSBHQ0MKKy8vICAgIDgvMDkvMTkgLSBNYWtlIGNoYW5nZXMgdG8gc3VwcHJlc3MgZGVhZCBjb2RlIHdhcm5pbmdzIChmcm9tIHVwc3RyZWFtIG1hc3RlciBicmFuY2gpCisvLworCisjaWZuZGVmIEFNRF9WVUxLQU5fTUVNT1JZX0FMTE9DQVRPUl9ICisjZGVmaW5lIEFNRF9WVUxLQU5fTUVNT1JZX0FMTE9DQVRPUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFxtYWlucGFnZSBWdWxrYW4gTWVtb3J5IEFsbG9jYXRvcgorCis8Yj5WZXJzaW9uIDIuMi4wPC9iPiAoMjAxOC0xMi0xMykKKworQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBcbgorTGljZW5zZTogTUlUCisKK0RvY3VtZW50YXRpb24gb2YgYWxsIG1lbWJlcnM6IHZrX21lbV9hbGxvYy5oCisKK1xzZWN0aW9uIG1haW5fdGFibGVfb2ZfY29udGVudHMgVGFibGUgb2YgY29udGVudHMKKworLSA8Yj5Vc2VyIGd1aWRlPC9iPgorICAtIFxzdWJwYWdlIHF1aWNrX3N0YXJ0CisgICAgLSBbUHJvamVjdCBzZXR1cF0oQHJlZiBxdWlja19zdGFydF9wcm9qZWN0X3NldHVwKQorICAgIC0gW0luaXRpYWxpemF0aW9uXShAcmVmIHF1aWNrX3N0YXJ0X2luaXRpYWxpemF0aW9uKQorICAgIC0gW1Jlc291cmNlIGFsbG9jYXRpb25dKEByZWYgcXVpY2tfc3RhcnRfcmVzb3VyY2VfYWxsb2NhdGlvbikKKyAgLSBcc3VicGFnZSBjaG9vc2luZ19tZW1vcnlfdHlwZQorICAgIC0gW1VzYWdlXShAcmVmIGNob29zaW5nX21lbW9yeV90eXBlX3VzYWdlKQorICAgIC0gW1JlcXVpcmVkIGFuZCBwcmVmZXJyZWQgZmxhZ3NdKEByZWYgY2hvb3NpbmdfbWVtb3J5X3R5cGVfcmVxdWlyZWRfcHJlZmVycmVkX2ZsYWdzKQorICAgIC0gW0V4cGxpY2l0IG1lbW9yeSB0eXBlc10oQHJlZiBjaG9vc2luZ19tZW1vcnlfdHlwZV9leHBsaWNpdF9tZW1vcnlfdHlwZXMpCisgICAgLSBbQ3VzdG9tIG1lbW9yeSBwb29sc10oQHJlZiBjaG9vc2luZ19tZW1vcnlfdHlwZV9jdXN0b21fbWVtb3J5X3Bvb2xzKQorICAtIFxzdWJwYWdlIG1lbW9yeV9tYXBwaW5nCisgICAgLSBbTWFwcGluZyBmdW5jdGlvbnNdKEByZWYgbWVtb3J5X21hcHBpbmdfbWFwcGluZ19mdW5jdGlvbnMpCisgICAgLSBbUGVyc2lzdGVudGx5IG1hcHBlZCBtZW1vcnldKEByZWYgbWVtb3J5X21hcHBpbmdfcGVyc2lzdGVudGx5X21hcHBlZF9tZW1vcnkpCisgICAgLSBbQ2FjaGUgY29udHJvbF0oQHJlZiBtZW1vcnlfbWFwcGluZ19jYWNoZV9jb250cm9sKQorICAgIC0gW0ZpbmRpbmcgb3V0IGlmIG1lbW9yeSBpcyBtYXBwYWJsZV0oQHJlZiBtZW1vcnlfbWFwcGluZ19maW5kaW5nX2lmX21lbW9yeV9tYXBwYWJsZSkKKyAgLSBcc3VicGFnZSBjdXN0b21fbWVtb3J5X3Bvb2xzCisgICAgLSBbQ2hvb3NpbmcgbWVtb3J5IHR5cGUgaW5kZXhdKEByZWYgY3VzdG9tX21lbW9yeV9wb29sc19NZW1UeXBlSW5kZXgpCisgICAgLSBbTGluZWFyIGFsbG9jYXRpb24gYWxnb3JpdGhtXShAcmVmIGxpbmVhcl9hbGdvcml0aG0pCisgICAgICAtIFtGcmVlLWF0LW9uY2VdKEByZWYgbGluZWFyX2FsZ29yaXRobV9mcmVlX2F0X29uY2UpCisgICAgICAtIFtTdGFja10oQHJlZiBsaW5lYXJfYWxnb3JpdGhtX3N0YWNrKQorICAgICAgLSBbRG91YmxlIHN0YWNrXShAcmVmIGxpbmVhcl9hbGdvcml0aG1fZG91YmxlX3N0YWNrKQorICAgICAgLSBbUmluZyBidWZmZXJdKEByZWYgbGluZWFyX2FsZ29yaXRobV9yaW5nX2J1ZmZlcikKKyAgICAtIFtCdWRkeSBhbGxvY2F0aW9uIGFsZ29yaXRobV0oQHJlZiBidWRkeV9hbGdvcml0aG0pCisgIC0gXHN1YnBhZ2UgZGVmcmFnbWVudGF0aW9uCisgIAktIFtEZWZyYWdtZW50aW5nIENQVSBtZW1vcnldKEByZWYgZGVmcmFnbWVudGF0aW9uX2NwdSkKKyAgCS0gW0RlZnJhZ21lbnRpbmcgR1BVIG1lbW9yeV0oQHJlZiBkZWZyYWdtZW50YXRpb25fZ3B1KQorICAJLSBbQWRkaXRpb25hbCBub3Rlc10oQHJlZiBkZWZyYWdtZW50YXRpb25fYWRkaXRpb25hbF9ub3RlcykKKyAgCS0gW1dyaXRpbmcgY3VzdG9tIGFsbG9jYXRpb24gYWxnb3JpdGhtXShAcmVmIGRlZnJhZ21lbnRhdGlvbl9jdXN0b21fYWxnb3JpdGhtKQorICAtIFxzdWJwYWdlIGxvc3RfYWxsb2NhdGlvbnMKKyAgLSBcc3VicGFnZSBzdGF0aXN0aWNzCisgICAgLSBbTnVtZXJpYyBzdGF0aXN0aWNzXShAcmVmIHN0YXRpc3RpY3NfbnVtZXJpY19zdGF0aXN0aWNzKQorICAgIC0gW0pTT04gZHVtcF0oQHJlZiBzdGF0aXN0aWNzX2pzb25fZHVtcCkKKyAgLSBcc3VicGFnZSBhbGxvY2F0aW9uX2Fubm90YXRpb24KKyAgICAtIFtBbGxvY2F0aW9uIHVzZXIgZGF0YV0oQHJlZiBhbGxvY2F0aW9uX3VzZXJfZGF0YSkKKyAgICAtIFtBbGxvY2F0aW9uIG5hbWVzXShAcmVmIGFsbG9jYXRpb25fbmFtZXMpCisgIC0gXHN1YnBhZ2UgZGVidWdnaW5nX21lbW9yeV91c2FnZQorICAgIC0gW01lbW9yeSBpbml0aWFsaXphdGlvbl0oQHJlZiBkZWJ1Z2dpbmdfbWVtb3J5X3VzYWdlX2luaXRpYWxpemF0aW9uKQorICAgIC0gW01hcmdpbnNdKEByZWYgZGVidWdnaW5nX21lbW9yeV91c2FnZV9tYXJnaW5zKQorICAgIC0gW0NvcnJ1cHRpb24gZGV0ZWN0aW9uXShAcmVmIGRlYnVnZ2luZ19tZW1vcnlfdXNhZ2VfY29ycnVwdGlvbl9kZXRlY3Rpb24pCisgIC0gXHN1YnBhZ2UgcmVjb3JkX2FuZF9yZXBsYXkKKy0gXHN1YnBhZ2UgdXNhZ2VfcGF0dGVybnMKKyAgLSBbU2ltcGxlIHBhdHRlcm5zXShAcmVmIHVzYWdlX3BhdHRlcm5zX3NpbXBsZSkKKyAgLSBbQWR2YW5jZWQgcGF0dGVybnNdKEByZWYgdXNhZ2VfcGF0dGVybnNfYWR2YW5jZWQpCistIFxzdWJwYWdlIGNvbmZpZ3VyYXRpb24KKyAgLSBbUG9pbnRlcnMgdG8gVnVsa2FuIGZ1bmN0aW9uc10oQHJlZiBjb25maWdfVnVsa2FuX2Z1bmN0aW9ucykKKyAgLSBbQ3VzdG9tIGhvc3QgbWVtb3J5IGFsbG9jYXRvcl0oQHJlZiBjdXN0b21fbWVtb3J5X2FsbG9jYXRvcikKKyAgLSBbRGV2aWNlIG1lbW9yeSBhbGxvY2F0aW9uIGNhbGxiYWNrc10oQHJlZiBhbGxvY2F0aW9uX2NhbGxiYWNrcykKKyAgLSBbRGV2aWNlIGhlYXAgbWVtb3J5IGxpbWl0XShAcmVmIGhlYXBfbWVtb3J5X2xpbWl0KQorICAtIFxzdWJwYWdlIHZrX2tocl9kZWRpY2F0ZWRfYWxsb2NhdGlvbgorLSBcc3VicGFnZSBnZW5lcmFsX2NvbnNpZGVyYXRpb25zCisgIC0gW1RocmVhZCBzYWZldHldKEByZWYgZ2VuZXJhbF9jb25zaWRlcmF0aW9uc190aHJlYWRfc2FmZXR5KQorICAtIFtWYWxpZGF0aW9uIGxheWVyIHdhcm5pbmdzXShAcmVmIGdlbmVyYWxfY29uc2lkZXJhdGlvbnNfdmFsaWRhdGlvbl9sYXllcl93YXJuaW5ncykKKyAgLSBbQWxsb2NhdGlvbiBhbGdvcml0aG1dKEByZWYgZ2VuZXJhbF9jb25zaWRlcmF0aW9uc19hbGxvY2F0aW9uX2FsZ29yaXRobSkKKyAgLSBbRmVhdHVyZXMgbm90IHN1cHBvcnRlZF0oQHJlZiBnZW5lcmFsX2NvbnNpZGVyYXRpb25zX2ZlYXR1cmVzX25vdF9zdXBwb3J0ZWQpCisKK1xzZWN0aW9uIG1haW5fc2VlX2Fsc28gU2VlIGFsc28KKworLSBbUHJvZHVjdCBwYWdlIG9uIEdQVU9wZW5dKGh0dHBzOi8vZ3B1b3Blbi5jb20vZ2FtaW5nLXByb2R1Y3QvdnVsa2FuLW1lbW9yeS1hbGxvY2F0b3IvKQorLSBbU291cmNlIHJlcG9zaXRvcnkgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vR1BVT3Blbi1MaWJyYXJpZXNBbmRTREtzL1Z1bGthbk1lbW9yeUFsbG9jYXRvcikKKworCisKKworXHBhZ2UgcXVpY2tfc3RhcnQgUXVpY2sgc3RhcnQKKworXHNlY3Rpb24gcXVpY2tfc3RhcnRfcHJvamVjdF9zZXR1cCBQcm9qZWN0IHNldHVwCisKK1Z1bGthbiBNZW1vcnkgQWxsb2NhdG9yIGNvbWVzIGluIGZvcm0gb2YgYSBzaW5nbGUgaGVhZGVyIGZpbGUuCitZb3UgZG9uJ3QgbmVlZCB0byBidWlsZCBpdCBhcyBhIHNlcGFyYXRlIGxpYnJhcnkgcHJvamVjdC4KK1lvdSBjYW4gYWRkIHRoaXMgZmlsZSBkaXJlY3RseSB0byB5b3VyIHByb2plY3QgYW5kIHN1Ym1pdCBpdCB0byBjb2RlIHJlcG9zaXRvcnkgbmV4dCB0byB5b3VyIG90aGVyIHNvdXJjZSBmaWxlcy4KKworIlNpbmdsZSBoZWFkZXIiIGRvZXNuJ3QgbWVhbiB0aGF0IGV2ZXJ5dGhpbmcgaXMgY29udGFpbmVkIGluIEMvQysrIGRlY2xhcmF0aW9ucywKK2xpa2UgaXQgdGVuZHMgdG8gYmUgaW4gY2FzZSBvZiBpbmxpbmUgZnVuY3Rpb25zIG9yIEMrKyB0ZW1wbGF0ZXMuCitJdCBtZWFucyB0aGF0IGltcGxlbWVudGF0aW9uIGlzIGJ1bmRsZWQgd2l0aCBpbnRlcmZhY2UgaW4gYSBzaW5nbGUgZmlsZSBhbmQgbmVlZHMgdG8gYmUgZXh0cmFjdGVkIHVzaW5nIHByZXByb2Nlc3NvciBtYWNyby4KK0lmIHlvdSBkb24ndCBkbyBpdCBwcm9wZXJseSwgeW91IHdpbGwgZ2V0IGxpbmtlciBlcnJvcnMuCisKK1RvIGRvIGl0IHByb3Blcmx5OgorCistIyBJbmNsdWRlICJ2a19tZW1fYWxsb2MuaCIgZmlsZSBpbiBlYWNoIENQUCBmaWxlIHdoZXJlIHlvdSB3YW50IHRvIHVzZSB0aGUgbGlicmFyeS4KKyAgIFRoaXMgaW5jbHVkZXMgZGVjbGFyYXRpb25zIG9mIGFsbCBtZW1iZXJzIG9mIHRoZSBsaWJyYXJ5LgorLSMgSW4gZXhhY2x5IG9uZSBDUFAgZmlsZSBkZWZpbmUgZm9sbG93aW5nIG1hY3JvIGJlZm9yZSB0aGlzIGluY2x1ZGUuCisgICBJdCBlbmFibGVzIGFsc28gaW50ZXJuYWwgZGVmaW5pdGlvbnMuCisKK1xjb2RlCisjZGVmaW5lIFZNQV9JTVBMRU1FTlRBVElPTgorI2luY2x1ZGUgInZrX21lbV9hbGxvYy5oIgorXGVuZGNvZGUKKworSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGNyZWF0ZSBkZWRpY2F0ZWQgQ1BQIGZpbGUganVzdCBmb3IgdGhpcyBwdXJwb3NlLgorCitOb3RlIG9uIGxhbmd1YWdlOiBUaGlzIGxpYnJhcnkgaXMgd3JpdHRlbiBpbiBDKyssIGJ1dCBoYXMgQy1jb21wYXRpYmxlIGludGVyZmFjZS4KK1RodXMgeW91IGNhbiBpbmNsdWRlIGFuZCB1c2UgdmtfbWVtX2FsbG9jLmggaW4gQyBvciBDKysgY29kZSwgYnV0IGZ1bGwKK2ltcGxlbWVudGF0aW9uIHdpdGggYFZNQV9JTVBMRU1FTlRBVElPTmAgbWFjcm8gbXVzdCBiZSBjb21waWxlZCBhcyBDKyssIE5PVCBhcyBDLgorCitQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbGlicmFyeSBpbmNsdWRlcyBoZWFkZXIgYDx2dWxrYW4vdnVsa2FuLmg+YCwgd2hpY2ggaW4gdHVybgoraW5jbHVkZXMgYDx3aW5kb3dzLmg+YCBvbiBXaW5kb3dzLiBJZiB5b3UgbmVlZCBzb21lIHNwZWNpZmljIG1hY3JvcyBkZWZpbmVkCitiZWZvcmUgaW5jbHVkaW5nIHRoZXNlIGhlYWRlcnMgKGxpa2UgYFdJTjMyX0xFQU5fQU5EX01FQU5gIG9yCitgV0lOVkVSYCBmb3IgV2luZG93cywgYFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFJgIGZvciBWdWxrYW4pLCB5b3UgbXVzdCBkZWZpbmUKK3RoZW0gYmVmb3JlIGV2ZXJ5IGAjaW5jbHVkZWAgb2YgdGhpcyBsaWJyYXJ5LgorCisKK1xzZWN0aW9uIHF1aWNrX3N0YXJ0X2luaXRpYWxpemF0aW9uIEluaXRpYWxpemF0aW9uCisKK0F0IHByb2dyYW0gc3RhcnR1cDoKKworLSMgSW5pdGlhbGl6ZSBWdWxrYW4gdG8gaGF2ZSBgVmtQaHlzaWNhbERldmljZWAgYW5kIGBWa0RldmljZWAgb2JqZWN0LgorLSMgRmlsbCBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvIHN0cnVjdHVyZSBhbmQgY3JlYXRlICNWbWFBbGxvY2F0b3Igb2JqZWN0IGJ5CisgICBjYWxsaW5nIHZtYUNyZWF0ZUFsbG9jYXRvcigpLgorCitcY29kZQorVm1hQWxsb2NhdG9yQ3JlYXRlSW5mbyBhbGxvY2F0b3JJbmZvID0ge307CithbGxvY2F0b3JJbmZvLnBoeXNpY2FsRGV2aWNlID0gcGh5c2ljYWxEZXZpY2U7CithbGxvY2F0b3JJbmZvLmRldmljZSA9IGRldmljZTsKKworVm1hQWxsb2NhdG9yIGFsbG9jYXRvcjsKK3ZtYUNyZWF0ZUFsbG9jYXRvcigmYWxsb2NhdG9ySW5mbywgJmFsbG9jYXRvcik7CitcZW5kY29kZQorCitcc2VjdGlvbiBxdWlja19zdGFydF9yZXNvdXJjZV9hbGxvY2F0aW9uIFJlc291cmNlIGFsbG9jYXRpb24KKworV2hlbiB5b3Ugd2FudCB0byBjcmVhdGUgYSBidWZmZXIgb3IgaW1hZ2U6CisKKy0jIEZpbGwgYFZrQnVmZmVyQ3JlYXRlSW5mb2AgLyBgVmtJbWFnZUNyZWF0ZUluZm9gIHN0cnVjdHVyZS4KKy0jIEZpbGwgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gc3RydWN0dXJlLgorLSMgQ2FsbCB2bWFDcmVhdGVCdWZmZXIoKSAvIHZtYUNyZWF0ZUltYWdlKCkgdG8gZ2V0IGBWa0J1ZmZlcmAvYFZrSW1hZ2VgIHdpdGggbWVtb3J5CisgICBhbHJlYWR5IGFsbG9jYXRlZCBhbmQgYm91bmQgdG8gaXQuCisKK1xjb2RlCitWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVySW5mbyA9IHsgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPIH07CitidWZmZXJJbmZvLnNpemUgPSA2NTUzNjsKK2J1ZmZlckluZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQgfCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKworVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gYWxsb2NJbmZvID0ge307CithbGxvY0luZm8udXNhZ2UgPSBWTUFfTUVNT1JZX1VTQUdFX0dQVV9PTkxZOworCitWa0J1ZmZlciBidWZmZXI7CitWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb247Cit2bWFDcmVhdGVCdWZmZXIoYWxsb2NhdG9yLCAmYnVmZmVySW5mbywgJmFsbG9jSW5mbywgJmJ1ZmZlciwgJmFsbG9jYXRpb24sIG51bGxwdHIpOworXGVuZGNvZGUKKworRG9uJ3QgZm9yZ2V0IHRvIGRlc3Ryb3kgeW91ciBvYmplY3RzIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZDoKKworXGNvZGUKK3ZtYURlc3Ryb3lCdWZmZXIoYWxsb2NhdG9yLCBidWZmZXIsIGFsbG9jYXRpb24pOwordm1hRGVzdHJveUFsbG9jYXRvcihhbGxvY2F0b3IpOworXGVuZGNvZGUKKworCitccGFnZSBjaG9vc2luZ19tZW1vcnlfdHlwZSBDaG9vc2luZyBtZW1vcnkgdHlwZQorCitQaHlzaWNhbCBkZXZpY2VzIGluIFZ1bGthbiBzdXBwb3J0IHZhcmlvdXMgY29tYmluYXRpb25zIG9mIG1lbW9yeSBoZWFwcyBhbmQKK3R5cGVzLiBIZWxwIHdpdGggY2hvb3NpbmcgY29ycmVjdCBhbmQgb3B0aW1hbCBtZW1vcnkgdHlwZSBmb3IgeW91ciBzcGVjaWZpYworcmVzb3VyY2UgaXMgb25lIG9mIHRoZSBrZXkgZmVhdHVyZXMgb2YgdGhpcyBsaWJyYXJ5LiBZb3UgY2FuIHVzZSBpdCBieSBmaWxsaW5nCithcHByb3ByaWF0ZSBtZW1iZXJzIG9mIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIHN0cnVjdHVyZSwgYXMgZGVzY3JpYmVkIGJlbG93LgorWW91IGNhbiBhbHNvIGNvbWJpbmUgbXVsdGlwbGUgbWV0aG9kcy4KKworLSMgSWYgeW91IGp1c3Qgd2FudCB0byBmaW5kIG1lbW9yeSB0eXBlIGluZGV4IHRoYXQgbWVldHMgeW91ciByZXF1aXJlbWVudHMsIHlvdQorICAgY2FuIHVzZSBmdW5jdGlvbiB2bWFGaW5kTWVtb3J5VHlwZUluZGV4KCkuCistIyBJZiB5b3Ugd2FudCB0byBhbGxvY2F0ZSBhIHJlZ2lvbiBvZiBkZXZpY2UgbWVtb3J5IHdpdGhvdXQgYXNzb2NpYXRpb24gd2l0aCBhbnkKKyAgIHNwZWNpZmljIGltYWdlIG9yIGJ1ZmZlciwgeW91IGNhbiB1c2UgZnVuY3Rpb24gdm1hQWxsb2NhdGVNZW1vcnkoKS4gVXNhZ2Ugb2YKKyAgIHRoaXMgZnVuY3Rpb24gaXMgbm90IHJlY29tbWVuZGVkIGFuZCB1c3VhbGx5IG5vdCBuZWVkZWQuCistIyBJZiB5b3UgYWxyZWFkeSBoYXZlIGEgYnVmZmVyIG9yIGFuIGltYWdlIGNyZWF0ZWQsIHlvdSB3YW50IHRvIGFsbG9jYXRlIG1lbW9yeQorICAgZm9yIGl0IGFuZCB0aGVuIHlvdSB3aWxsIGJpbmQgaXQgeW91cnNlbGYsIHlvdSBjYW4gdXNlIGZ1bmN0aW9uCisgICB2bWFBbGxvY2F0ZU1lbW9yeUZvckJ1ZmZlcigpLCB2bWFBbGxvY2F0ZU1lbW9yeUZvckltYWdlKCkuCisgICBGb3IgYmluZGluZyB5b3Ugc2hvdWxkIHVzZSBmdW5jdGlvbnM6IHZtYUJpbmRCdWZmZXJNZW1vcnkoKSwgdm1hQmluZEltYWdlTWVtb3J5KCkuCistIyBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBidWZmZXIgb3IgYW4gaW1hZ2UsIGFsbG9jYXRlIG1lbW9yeSBmb3IgaXQgYW5kIGJpbmQKKyAgIHRoZW0gdG9nZXRoZXIsIGFsbCBpbiBvbmUgY2FsbCwgeW91IGNhbiB1c2UgZnVuY3Rpb24gdm1hQ3JlYXRlQnVmZmVyKCksCisgICB2bWFDcmVhdGVJbWFnZSgpLiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gdXNlIHRoaXMgbGlicmFyeS4KKworV2hlbiB1c2luZyAzLiBvciA0LiwgdGhlIGxpYnJhcnkgaW50ZXJuYWxseSBxdWVyaWVzIFZ1bGthbiBmb3IgbWVtb3J5IHR5cGVzCitzdXBwb3J0ZWQgZm9yIHRoYXQgYnVmZmVyIG9yIGltYWdlIChmdW5jdGlvbiBgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoKWApCithbmQgdXNlcyBvbmx5IG9uZSBvZiB0aGVzZSB0eXBlcy4KKworSWYgbm8gbWVtb3J5IHR5cGUgY2FuIGJlIGZvdW5kIHRoYXQgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMsIHRoZXNlIGZ1bmN0aW9ucworcmV0dXJuIGBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UYC4KKworWW91IGNhbiBsZWF2ZSBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyBzdHJ1Y3R1cmUgY29tcGxldGVseSBmaWxsZWQgd2l0aCB6ZXJvcy4KK0l0IG1lYW5zIG5vIHJlcXVpcmVtZW50cyBhcmUgc3BlY2lmaWVkIGZvciBtZW1vcnkgdHlwZS4KK0l0IGlzIHZhbGlkLCBhbHRob3VnaCBub3QgdmVyeSB1c2VmdWwuCisKK1xzZWN0aW9uIGNob29zaW5nX21lbW9yeV90eXBlX3VzYWdlIFVzYWdlCisKK1RoZSBlYXNpZXN0IHdheSB0byBzcGVjaWZ5IG1lbW9yeSByZXF1aXJlbWVudHMgaXMgdG8gZmlsbCBtZW1iZXIKK1ZtYUFsbG9jYXRpb25DcmVhdGVJbmZvOjp1c2FnZSB1c2luZyBvbmUgb2YgdGhlIHZhbHVlcyBvZiBlbnVtICNWbWFNZW1vcnlVc2FnZS4KK0l0IGRlZmluZXMgaGlnaCBsZXZlbCwgY29tbW9uIHVzYWdlIHR5cGVzLgorRm9yIG1vcmUgZGV0YWlscywgc2VlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZW51bS4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIHVuaWZvcm0gYnVmZmVyIHRoYXQgd2lsbCBiZSBmaWxsZWQgdXNpbmcKK3RyYW5zZmVyIG9ubHkgb25jZSBvciBpbmZyZXF1ZW50bHkgYW5kIHVzZWQgZm9yIHJlbmRlcmluZyBldmVyeSBmcmFtZSwgeW91IGNhbgorZG8gaXQgdXNpbmcgZm9sbG93aW5nIGNvZGU6CisKK1xjb2RlCitWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVySW5mbyA9IHsgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPIH07CitidWZmZXJJbmZvLnNpemUgPSA2NTUzNjsKK2J1ZmZlckluZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUIHwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisKK1ZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFsbG9jSW5mbyA9IHt9OworYWxsb2NJbmZvLnVzYWdlID0gVk1BX01FTU9SWV9VU0FHRV9HUFVfT05MWTsKKworVmtCdWZmZXIgYnVmZmVyOworVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uOwordm1hQ3JlYXRlQnVmZmVyKGFsbG9jYXRvciwgJmJ1ZmZlckluZm8sICZhbGxvY0luZm8sICZidWZmZXIsICZhbGxvY2F0aW9uLCBudWxscHRyKTsKK1xlbmRjb2RlCisKK1xzZWN0aW9uIGNob29zaW5nX21lbW9yeV90eXBlX3JlcXVpcmVkX3ByZWZlcnJlZF9mbGFncyBSZXF1aXJlZCBhbmQgcHJlZmVycmVkIGZsYWdzCisKK1lvdSBjYW4gc3BlY2lmeSBtb3JlIGRldGFpbGVkIHJlcXVpcmVtZW50cyBieSBmaWxsaW5nIG1lbWJlcnMKK1ZtYUFsbG9jYXRpb25DcmVhdGVJbmZvOjpyZXF1aXJlZEZsYWdzIGFuZCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbzo6cHJlZmVycmVkRmxhZ3MKK3dpdGggYSBjb21iaW5hdGlvbiBvZiBiaXRzIGZyb20gZW51bSBgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzYC4gRm9yIGV4YW1wbGUsCitpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBidWZmZXIgdGhhdCB3aWxsIGJlIHBlcnNpc3RlbnRseSBtYXBwZWQgb24gaG9zdCAoc28gaXQKK211c3QgYmUgYEhPU1RfVklTSUJMRWApIGFuZCBwcmVmZXJhYmx5IHdpbGwgYWxzbyBiZSBgSE9TVF9DT0hFUkVOVGAgYW5kIGBIT1NUX0NBQ0hFRGAsCit1c2UgZm9sbG93aW5nIGNvZGU6CisKK1xjb2RlCitWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyBhbGxvY0luZm8gPSB7fTsKK2FsbG9jSW5mby5yZXF1aXJlZEZsYWdzID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQ7CithbGxvY0luZm8ucHJlZmVycmVkRmxhZ3MgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DQUNIRURfQklUOworYWxsb2NJbmZvLmZsYWdzID0gVk1BX0FMTE9DQVRJT05fQ1JFQVRFX01BUFBFRF9CSVQ7CisKK1ZrQnVmZmVyIGJ1ZmZlcjsKK1ZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbjsKK3ZtYUNyZWF0ZUJ1ZmZlcihhbGxvY2F0b3IsICZidWZmZXJJbmZvLCAmYWxsb2NJbmZvLCAmYnVmZmVyLCAmYWxsb2NhdGlvbiwgbnVsbHB0cik7CitcZW5kY29kZQorCitBIG1lbW9yeSB0eXBlIGlzIGNob3NlbiB0aGF0IGhhcyBhbGwgdGhlIHJlcXVpcmVkIGZsYWdzIGFuZCBhcyBtYW55IHByZWZlcnJlZAorZmxhZ3Mgc2V0IGFzIHBvc3NpYmxlLgorCitJZiB5b3UgdXNlIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvOjp1c2FnZSwgaXQgaXMganVzdCBpbnRlcm5hbGx5IGNvbnZlcnRlZCB0bworYSBzZXQgb2YgcmVxdWlyZWQgYW5kIHByZWZlcnJlZCBmbGFncy4KKworXHNlY3Rpb24gY2hvb3NpbmdfbWVtb3J5X3R5cGVfZXhwbGljaXRfbWVtb3J5X3R5cGVzIEV4cGxpY2l0IG1lbW9yeSB0eXBlcworCitJZiB5b3UgaW5zcGVjdGVkIG1lbW9yeSB0eXBlcyBhdmFpbGFibGUgb24gdGhlIHBoeXNpY2FsIGRldmljZSBhbmQgeW91IGhhdmUKK2EgcHJlZmVyZW5jZSBmb3IgbWVtb3J5IHR5cGVzIHRoYXQgeW91IHdhbnQgdG8gdXNlLCB5b3UgY2FuIGZpbGwgbWVtYmVyCitWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbzo6bWVtb3J5VHlwZUJpdHMuIEl0IGlzIGEgYml0IG1hc2ssIHdoZXJlIGVhY2ggYml0IHNldAorbWVhbnMgdGhhdCBhIG1lbW9yeSB0eXBlIHdpdGggdGhhdCBpbmRleCBpcyBhbGxvd2VkIHRvIGJlIHVzZWQgZm9yIHRoZQorYWxsb2NhdGlvbi4gU3BlY2lhbCB2YWx1ZSAwLCBqdXN0IGxpa2UgYFVJTlQzMl9NQVhgLCBtZWFucyB0aGVyZSBhcmUgbm8KK3Jlc3RyaWN0aW9ucyB0byBtZW1vcnkgdHlwZSBpbmRleC4KKworUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1lbWJlciBpcyBOT1QganVzdCBhIG1lbW9yeSB0eXBlIGluZGV4LgorU3RpbGwgeW91IGNhbiB1c2UgaXQgdG8gY2hvb3NlIGp1c3Qgb25lLCBzcGVjaWZpYyBtZW1vcnkgdHlwZS4KK0ZvciBleGFtcGxlLCBpZiB5b3UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQgeW91ciBidWZmZXIgc2hvdWxkIGJlIGNyZWF0ZWQgaW4KK21lbW9yeSB0eXBlIDIsIHVzZSBmb2xsb3dpbmcgY29kZToKKworXGNvZGUKK3VpbnQzMl90IG1lbW9yeVR5cGVJbmRleCA9IDI7CisKK1ZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFsbG9jSW5mbyA9IHt9OworYWxsb2NJbmZvLm1lbW9yeVR5cGVCaXRzID0gMXUgPDwgbWVtb3J5VHlwZUluZGV4OworCitWa0J1ZmZlciBidWZmZXI7CitWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb247Cit2bWFDcmVhdGVCdWZmZXIoYWxsb2NhdG9yLCAmYnVmZmVySW5mbywgJmFsbG9jSW5mbywgJmJ1ZmZlciwgJmFsbG9jYXRpb24sIG51bGxwdHIpOworXGVuZGNvZGUKKworXHNlY3Rpb24gY2hvb3NpbmdfbWVtb3J5X3R5cGVfY3VzdG9tX21lbW9yeV9wb29scyBDdXN0b20gbWVtb3J5IHBvb2xzCisKK0lmIHlvdSBhbGxvY2F0ZSBmcm9tIGN1c3RvbSBtZW1vcnkgcG9vbCwgYWxsIHRoZSB3YXlzIG9mIHNwZWNpZnlpbmcgbWVtb3J5CityZXF1aXJlbWVudHMgZGVzY3JpYmVkIGFib3ZlIGFyZSBub3QgYXBwbGljYWJsZSBhbmQgdGhlIGFmb3JlbWVudGlvbmVkIG1lbWJlcnMKK29mIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIHN0cnVjdHVyZSBhcmUgaWdub3JlZC4gTWVtb3J5IHR5cGUgaXMgc2VsZWN0ZWQKK2V4cGxpY2l0bHkgd2hlbiBjcmVhdGluZyB0aGUgcG9vbCBhbmQgdGhlbiB1c2VkIHRvIG1ha2UgYWxsIHRoZSBhbGxvY2F0aW9ucyBmcm9tCit0aGF0IHBvb2wuIEZvciBmdXJ0aGVyIGRldGFpbHMsIHNlZSBccmVmIGN1c3RvbV9tZW1vcnlfcG9vbHMuCisKKworXHBhZ2UgbWVtb3J5X21hcHBpbmcgTWVtb3J5IG1hcHBpbmcKKworVG8gIm1hcCBtZW1vcnkiIGluIFZ1bGthbiBtZWFucyB0byBvYnRhaW4gYSBDUFUgcG9pbnRlciB0byBgVmtEZXZpY2VNZW1vcnlgLAordG8gYmUgYWJsZSB0byByZWFkIGZyb20gaXQgb3Igd3JpdGUgdG8gaXQgaW4gQ1BVIGNvZGUuCitNYXBwaW5nIGlzIHBvc3NpYmxlIG9ubHkgb2YgbWVtb3J5IGFsbG9jYXRlZCBmcm9tIGEgbWVtb3J5IHR5cGUgdGhhdCBoYXMKK2BWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVGAgZmxhZy4KK0Z1bmN0aW9ucyBgdmtNYXBNZW1vcnkoKWAsIGB2a1VubWFwTWVtb3J5KClgIGFyZSBkZXNpZ25lZCBmb3IgdGhpcyBwdXJwb3NlLgorWW91IGNhbiB1c2UgdGhlbSBkaXJlY3RseSB3aXRoIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyBsaWJyYXJ5LAorYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCBiZWNhdXNlIG9mIGZvbGxvd2luZyBpc3N1ZToKK01hcHBpbmcgdGhlIHNhbWUgYFZrRGV2aWNlTWVtb3J5YCBibG9jayBtdWx0aXBsZSB0aW1lcyBpcyBpbGxlZ2FsIC0gb25seSBvbmUgbWFwcGluZyBhdCBhIHRpbWUgaXMgYWxsb3dlZC4KK1RoaXMgaW5jbHVkZXMgbWFwcGluZyBkaXNqb2ludCByZWdpb25zLiBNYXBwaW5nIGlzIG5vdCByZWZlcmVuY2UtY291bnRlZCBpbnRlcm5hbGx5IGJ5IFZ1bGthbi4KK0JlY2F1c2Ugb2YgdGhpcywgVnVsa2FuIE1lbW9yeSBBbGxvY2F0b3IgcHJvdmlkZXMgZm9sbG93aW5nIGZhY2lsaXRpZXM6CisKK1xzZWN0aW9uIG1lbW9yeV9tYXBwaW5nX21hcHBpbmdfZnVuY3Rpb25zIE1hcHBpbmcgZnVuY3Rpb25zCisKK1RoZSBsaWJyYXJ5IHByb3ZpZGVzIGZvbGxvd2luZyBmdW5jdGlvbnMgZm9yIG1hcHBpbmcgb2YgYSBzcGVjaWZpYyAjVm1hQWxsb2NhdGlvbjogdm1hTWFwTWVtb3J5KCksIHZtYVVubWFwTWVtb3J5KCkuCitUaGV5IGFyZSBzYWZlciBhbmQgbW9yZSBjb252ZW5pZW50IHRvIHVzZSB0aGFuIHN0YW5kYXJkIFZ1bGthbiBmdW5jdGlvbnMuCitZb3UgY2FuIG1hcCBhbiBhbGxvY2F0aW9uIG11bHRpcGxlIHRpbWVzIHNpbXVsdGFuZW91c2x5IC0gbWFwcGluZyBpcyByZWZlcmVuY2UtY291bnRlZCBpbnRlcm5hbGx5LgorWW91IGNhbiBhbHNvIG1hcCBkaWZmZXJlbnQgYWxsb2NhdGlvbnMgc2ltdWx0YW5lb3VzbHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgdXNlIHRoZSBzYW1lIGBWa0RldmljZU1lbW9yeWAgYmxvY2suCitUaGUgd2F5IGl0J3MgaW1wbGVtZW50ZWQgaXMgdGhhdCB0aGUgbGlicmFyeSBhbHdheXMgbWFwcyBlbnRpcmUgbWVtb3J5IGJsb2NrLCBub3QganVzdCByZWdpb24gb2YgdGhlIGFsbG9jYXRpb24uCitGb3IgZnVydGhlciBkZXRhaWxzLCBzZWUgZGVzY3JpcHRpb24gb2Ygdm1hTWFwTWVtb3J5KCkgZnVuY3Rpb24uCitFeGFtcGxlOgorCitcY29kZQorLy8gSGF2aW5nIHRoZXNlIG9iamVjdHMgaW5pdGlhbGl6ZWQ6CisKK3N0cnVjdCBDb25zdGFudEJ1ZmZlcgoreworICAgIC4uLgorfTsKK0NvbnN0YW50QnVmZmVyIGNvbnN0YW50QnVmZmVyRGF0YTsKKworVm1hQWxsb2NhdG9yIGFsbG9jYXRvcjsKK1ZrQnVmZmVyIGNvbnN0YW50QnVmZmVyOworVm1hQWxsb2NhdGlvbiBjb25zdGFudEJ1ZmZlckFsbG9jYXRpb247CisKKy8vIFlvdSBjYW4gbWFwIGFuZCBmaWxsIHlvdXIgYnVmZmVyIHVzaW5nIGZvbGxvd2luZyBjb2RlOgorCit2b2lkKiBtYXBwZWREYXRhOwordm1hTWFwTWVtb3J5KGFsbG9jYXRvciwgY29uc3RhbnRCdWZmZXJBbGxvY2F0aW9uLCAmbWFwcGVkRGF0YSk7CittZW1jcHkobWFwcGVkRGF0YSwgJmNvbnN0YW50QnVmZmVyRGF0YSwgc2l6ZW9mKGNvbnN0YW50QnVmZmVyRGF0YSkpOwordm1hVW5tYXBNZW1vcnkoYWxsb2NhdG9yLCBjb25zdGFudEJ1ZmZlckFsbG9jYXRpb24pOworXGVuZGNvZGUKKworV2hlbiBtYXBwaW5nLCB5b3UgbWF5IHNlZSBhIHdhcm5pbmcgZnJvbSBWdWxrYW4gdmFsaWRhdGlvbiBsYXllciBzaW1pbGFyIHRvIHRoaXMgb25lOgorCis8aT5NYXBwaW5nIGFuIGltYWdlIHdpdGggbGF5b3V0IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCBjYW4gcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvciBpZiB0aGlzIG1lbW9yeSBpcyB1c2VkIGJ5IHRoZSBkZXZpY2UuIE9ubHkgR0VORVJBTCBvciBQUkVJTklUSUFMSVpFRCBzaG91bGQgYmUgdXNlZC48L2k+CisKK0l0IGhhcHBlbnMgYmVjYXVzZSB0aGUgbGlicmFyeSBtYXBzIGVudGlyZSBgVmtEZXZpY2VNZW1vcnlgIGJsb2NrLCB3aGVyZSBkaWZmZXJlbnQKK3R5cGVzIG9mIGltYWdlcyBhbmQgYnVmZmVycyBtYXkgZW5kIHVwIHRvZ2V0aGVyLCBlc3BlY2lhbGx5IG9uIEdQVXMgd2l0aCB1bmlmaWVkIG1lbW9yeSBsaWtlIEludGVsLgorWW91IGNhbiBzYWZlbHkgaWdub3JlIGl0IGlmIHlvdSBhcmUgc3VyZSB5b3UgYWNjZXNzIG9ubHkgbWVtb3J5IG9mIHRoZSBpbnRlbmRlZAorb2JqZWN0IHRoYXQgeW91IHdhbnRlZCB0byBtYXAuCisKKworXHNlY3Rpb24gbWVtb3J5X21hcHBpbmdfcGVyc2lzdGVudGx5X21hcHBlZF9tZW1vcnkgUGVyc2lzdGVudGx5IG1hcHBlZCBtZW1vcnkKKworS2VwcGluZyB5b3VyIG1lbW9yeSBwZXJzaXN0ZW50bHkgbWFwcGVkIGlzIGdlbmVyYWxseSBPSyBpbiBWdWxrYW4uCitZb3UgZG9uJ3QgbmVlZCB0byB1bm1hcCBpdCBiZWZvcmUgdXNpbmcgaXRzIGRhdGEgb24gdGhlIEdQVS4KK1RoZSBsaWJyYXJ5IHByb3ZpZGVzIGEgc3BlY2lhbCBmZWF0dXJlIGRlc2lnbmVkIGZvciB0aGF0OgorQWxsb2NhdGlvbnMgbWFkZSB3aXRoICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfTUFQUEVEX0JJVCBmbGFnIHNldCBpbgorVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm86OmZsYWdzIHN0YXkgbWFwcGVkIGFsbCB0aGUgdGltZSwKK3NvIHlvdSBjYW4ganVzdCBhY2Nlc3MgQ1BVIHBvaW50ZXIgdG8gaXQgYW55IHRpbWUKK3dpdGhvdXQgYSBuZWVkIHRvIGNhbGwgYW55ICJtYXAiIG9yICJ1bm1hcCIgZnVuY3Rpb24uCitFeGFtcGxlOgorCitcY29kZQorVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZkNyZWF0ZUluZm8gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTyB9OworYnVmQ3JlYXRlSW5mby5zaXplID0gc2l6ZW9mKENvbnN0YW50QnVmZmVyKTsKK2J1ZkNyZWF0ZUluZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKworVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gYWxsb2NDcmVhdGVJbmZvID0ge307CithbGxvY0NyZWF0ZUluZm8udXNhZ2UgPSBWTUFfTUVNT1JZX1VTQUdFX0NQVV9PTkxZOworYWxsb2NDcmVhdGVJbmZvLmZsYWdzID0gVk1BX0FMTE9DQVRJT05fQ1JFQVRFX01BUFBFRF9CSVQ7CisKK1ZrQnVmZmVyIGJ1ZjsKK1ZtYUFsbG9jYXRpb24gYWxsb2M7CitWbWFBbGxvY2F0aW9uSW5mbyBhbGxvY0luZm87Cit2bWFDcmVhdGVCdWZmZXIoYWxsb2NhdG9yLCAmYnVmQ3JlYXRlSW5mbywgJmFsbG9jQ3JlYXRlSW5mbywgJmJ1ZiwgJmFsbG9jLCAmYWxsb2NJbmZvKTsKKworLy8gQnVmZmVyIGlzIGFscmVhZHkgbWFwcGVkLiBZb3UgY2FuIGFjY2VzcyBpdHMgbWVtb3J5LgorbWVtY3B5KGFsbG9jSW5mby5wTWFwcGVkRGF0YSwgJmNvbnN0YW50QnVmZmVyRGF0YSwgc2l6ZW9mKGNvbnN0YW50QnVmZmVyRGF0YSkpOworXGVuZGNvZGUKKworVGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucyB0aG91Z2gsIHdoZW4geW91IHNob3VsZCBjb25zaWRlciBtYXBwaW5nIG1lbW9yeSBvbmx5IGZvciBhIHNob3J0IHBlcmlvZCBvZiB0aW1lOgorCistIFdoZW4gb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzIDcgb3IgOC54IChXaW5kb3dzIDEwIGlzIG5vdCBhZmZlY3RlZCBiZWNhdXNlIGl0IHVzZXMgV0RETTIpLAorICBkZXZpY2UgaXMgZGlzY3JldGUgQU1EIEdQVSwKKyAgYW5kIG1lbW9yeSB0eXBlIGlzIHRoZSBzcGVjaWFsIDI1NiBNaUIgcG9vbCBvZiBgREVWSUNFX0xPQ0FMICsgSE9TVF9WSVNJQkxFYCBtZW1vcnkKKyAgKHNlbGVjdGVkIHdoZW4geW91IHVzZSAjVk1BX01FTU9SWV9VU0FHRV9DUFVfVE9fR1BVKSwKKyAgdGhlbiB3aGVuZXZlciBhIG1lbW9yeSBibG9jayBhbGxvY2F0ZWQgZnJvbSB0aGlzIG1lbW9yeSB0eXBlIHN0YXlzIG1hcHBlZAorICBmb3IgdGhlIHRpbWUgb2YgYW55IGNhbGwgdG8gYHZrUXVldWVTdWJtaXQoKWAgb3IgYHZrUXVldWVQcmVzZW50S0hSKClgLCB0aGlzCisgIGJsb2NrIGlzIG1pZ3JhdGVkIGJ5IFdERE0gdG8gc3lzdGVtIFJBTSwgd2hpY2ggZGVncmFkZXMgcGVyZm9ybWFuY2UuIEl0IGRvZXNuJ3QKKyAgbWF0dGVyIGlmIHRoYXQgcGFydGljdWxhciBtZW1vcnkgYmxvY2sgaXMgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tbWFuZCBidWZmZXIKKyAgYmVpbmcgc3VibWl0dGVkLgorLSBPbiBNYWMvTW9sdGVuVksgdGhlcmUgaXMgYSBrbm93biBidWcgLSBbSXNzdWUgIzE3NV0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9Nb2x0ZW5WSy9pc3N1ZXMvMTc1KQorICB3aGljaCByZXF1aXJlcyB1bm1hcHBpbmcgYmVmb3JlIEdQVSBjYW4gc2VlIHVwZGF0ZWQgdGV4dHVyZS4KKy0gS2VlcGluZyBtYW55IGxhcmdlIG1lbW9yeSBibG9ja3MgbWFwcGVkIG1heSBpbXBhY3QgcGVyZm9ybWFuY2Ugb3Igc3RhYmlsaXR5IG9mIHNvbWUgZGVidWdnaW5nIHRvb2xzLgorCitcc2VjdGlvbiBtZW1vcnlfbWFwcGluZ19jYWNoZV9jb250cm9sIENhY2hlIGNvbnRyb2wKKyAgCitNZW1vcnkgaW4gVnVsa2FuIGRvZXNuJ3QgbmVlZCB0byBiZSB1bm1hcHBlZCBiZWZvcmUgdXNpbmcgaXQgb24gR1BVLAorYnV0IHVubGVzcyBhIG1lbW9yeSB0eXBlcyBoYXMgYFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVGAgZmxhZyBzZXQsCit5b3UgbmVlZCB0byBtYW51YWxseSBpbnZhbGlkYXRlIGNhY2hlIGJlZm9yZSByZWFkaW5nIG9mIG1hcHBlZCBwb2ludGVyCithbmQgZmx1c2ggY2FjaGUgYWZ0ZXIgd3JpdGluZyB0byBtYXBwZWQgcG9pbnRlci4KK1Z1bGthbiBwcm92aWRlcyBmb2xsb3dpbmcgZnVuY3Rpb25zIGZvciB0aGlzIHB1cnBvc2UgYHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoKWAsCitgdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKClgLCBidXQgdGhpcyBsaWJyYXJ5IHByb3ZpZGVzIG1vcmUgY29udmVuaWVudAorZnVuY3Rpb25zIHRoYXQgcmVmZXIgdG8gZ2l2ZW4gYWxsb2NhdGlvbiBvYmplY3Q6IHZtYUZsdXNoQWxsb2NhdGlvbigpLAordm1hSW52YWxpZGF0ZUFsbG9jYXRpb24oKS4KKworUmVnaW9ucyBvZiBtZW1vcnkgc3BlY2lmaWVkIGZvciBmbHVzaC9pbnZhbGlkYXRlIG11c3QgYmUgYWxpZ25lZCB0bworYFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om5vbkNvaGVyZW50QXRvbVNpemVgLiBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgZW5zdXJlZCBieSB0aGUgbGlicmFyeS4KK0luIGFueSBtZW1vcnkgdHlwZSB0aGF0IGlzIGBIT1NUX1ZJU0lCTEVgIGJ1dCBub3QgYEhPU1RfQ09IRVJFTlRgLCBhbGwgYWxsb2NhdGlvbnMKK3dpdGhpbiBibG9ja3MgYXJlIGFsaWduZWQgdG8gdGhpcyB2YWx1ZSwgc28gdGhlaXIgb2Zmc2V0cyBhcmUgYWx3YXlzIG11bHRpcGx5IG9mCitgbm9uQ29oZXJlbnRBdG9tU2l6ZWAgYW5kIHR3byBkaWZmZXJlbnQgYWxsb2NhdGlvbnMgbmV2ZXIgc2hhcmUgc2FtZSAibGluZSIgb2YgdGhpcyBzaXplLgorCitQbGVhc2Ugbm90ZSB0aGF0IG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCAjVk1BX01FTU9SWV9VU0FHRV9DUFVfT05MWSBpcyBndWFyYW50ZWVkIHRvIGJlIGBIT1NUX0NPSEVSRU5UYC4KKworQWxzbywgV2luZG93cyBkcml2ZXJzIGZyb20gYWxsIDMgUEMgR1BVIHZlbmRvcnMgKEFNRCwgSW50ZWwsIE5WSURJQSkKK2N1cnJlbnRseSBwcm92aWRlIGBIT1NUX0NPSEVSRU5UYCBmbGFnIG9uIGFsbCBtZW1vcnkgdHlwZXMgdGhhdCBhcmUKK2BIT1NUX1ZJU0lCTEVgLCBzbyBvbiB0aGlzIHBsYXRmb3JtIHlvdSBtYXkgbm90IG5lZWQgdG8gYm90aGVyLgorCitcc2VjdGlvbiBtZW1vcnlfbWFwcGluZ19maW5kaW5nX2lmX21lbW9yeV9tYXBwYWJsZSBGaW5kaW5nIG91dCBpZiBtZW1vcnkgaXMgbWFwcGFibGUKKworSXQgbWF5IGhhcHBlbiB0aGF0IHlvdXIgYWxsb2NhdGlvbiBlbmRzIHVwIGluIG1lbW9yeSB0aGF0IGlzIGBIT1NUX1ZJU0lCTEVgIChhdmFpbGFibGUgZm9yIG1hcHBpbmcpCitkZXNwaXRlIGl0IHdhc24ndCBleHBsaWNpdGx5IHJlcXVlc3RlZC4KK0ZvciBleGFtcGxlLCBhcHBsaWNhdGlvbiBtYXkgd29yayBvbiBpbnRlZ3JhdGVkIGdyYXBoaWNzIHdpdGggdW5pZmllZCBtZW1vcnkgKGxpa2UgSW50ZWwpIG9yCithbGxvY2F0aW9uIGZyb20gdmlkZW8gbWVtb3J5IG1pZ2h0IGhhdmUgZmFpbGVkLCBzbyB0aGUgbGlicmFyeSBjaG9zZSBzeXN0ZW0gbWVtb3J5IGFzIGZhbGxiYWNrLgorCitZb3UgY2FuIGRldGVjdCB0aGlzIGNhc2UgYW5kIG1hcCBzdWNoIGFsbG9jYXRpb24gdG8gYWNjZXNzIGl0cyBtZW1vcnkgb24gQ1BVIGRpcmVjdGx5LAoraW5zdGVhZCBvZiBsYXVuY2hpbmcgYSB0cmFuc2ZlciBvcGVyYXRpb24uCitJbiBvcmRlciB0byBkbyB0aGF0OiBpbnNwZWN0IGBhbGxvY0luZm8ubWVtb3J5VHlwZWAsIGNhbGwgdm1hR2V0TWVtb3J5VHlwZVByb3BlcnRpZXMoKSwKK2FuZCBsb29rIGZvciBgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVRgIGZsYWcgaW4gcHJvcGVydGllcyBvZiB0aGF0IG1lbW9yeSB0eXBlLgorCitcY29kZQorVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZkNyZWF0ZUluZm8gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTyB9OworYnVmQ3JlYXRlSW5mby5zaXplID0gc2l6ZW9mKENvbnN0YW50QnVmZmVyKTsKK2J1ZkNyZWF0ZUluZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUIHwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisKK1ZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFsbG9jQ3JlYXRlSW5mbyA9IHt9OworYWxsb2NDcmVhdGVJbmZvLnVzYWdlID0gVk1BX01FTU9SWV9VU0FHRV9HUFVfT05MWTsKK2FsbG9jQ3JlYXRlSW5mby5wcmVmZXJyZWRGbGFncyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUOworCitWa0J1ZmZlciBidWY7CitWbWFBbGxvY2F0aW9uIGFsbG9jOworVm1hQWxsb2NhdGlvbkluZm8gYWxsb2NJbmZvOwordm1hQ3JlYXRlQnVmZmVyKGFsbG9jYXRvciwgJmJ1ZkNyZWF0ZUluZm8sICZhbGxvY0NyZWF0ZUluZm8sICZidWYsICZhbGxvYywgJmFsbG9jSW5mbyk7CisKK1ZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1GbGFnczsKK3ZtYUdldE1lbW9yeVR5cGVQcm9wZXJ0aWVzKGFsbG9jYXRvciwgYWxsb2NJbmZvLm1lbW9yeVR5cGUsICZtZW1GbGFncyk7CitpZigobWVtRmxhZ3MgJiBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCkgPT0gMCkKK3sKKyAgICAvLyBBbGxvY2F0aW9uIGVuZGVkIHVwIGluIG1hcHBhYmxlIG1lbW9yeS4gWW91IGNhbiBtYXAgaXQgYW5kIGFjY2VzcyBpdCBkaXJlY3RseS4KKyAgICB2b2lkKiBtYXBwZWREYXRhOworICAgIHZtYU1hcE1lbW9yeShhbGxvY2F0b3IsIGFsbG9jLCAmbWFwcGVkRGF0YSk7CisgICAgbWVtY3B5KG1hcHBlZERhdGEsICZjb25zdGFudEJ1ZmZlckRhdGEsIHNpemVvZihjb25zdGFudEJ1ZmZlckRhdGEpKTsKKyAgICB2bWFVbm1hcE1lbW9yeShhbGxvY2F0b3IsIGFsbG9jKTsKK30KK2Vsc2UKK3sKKyAgICAvLyBBbGxvY2F0aW9uIGVuZGVkIHVwIGluIG5vbi1tYXBwYWJsZSBtZW1vcnkuCisgICAgLy8gWW91IG5lZWQgdG8gY3JlYXRlIENQVS1zaWRlIGJ1ZmZlciBpbiBWTUFfTUVNT1JZX1VTQUdFX0NQVV9PTkxZIGFuZCBtYWtlIGEgdHJhbnNmZXIuCit9CitcZW5kY29kZQorCitZb3UgY2FuIGV2ZW4gdXNlICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfTUFQUEVEX0JJVCBmbGFnIHdoaWxlIGNyZWF0aW5nIGFsbG9jYXRpb25zCit0aGF0IGFyZSBub3QgbmVjZXNzYXJpbHkgYEhPU1RfVklTSUJMRWAgKGUuZy4gdXNpbmcgI1ZNQV9NRU1PUllfVVNBR0VfR1BVX09OTFkpLgorSWYgdGhlIGFsbG9jYXRpb24gZW5kcyB1cCBpbiBtZW1vcnkgdHlwZSB0aGF0IGlzIGBIT1NUX1ZJU0lCTEVgLCBpdCB3aWxsIGJlIHBlcnNpc3RlbnRseSBtYXBwZWQgYW5kIHlvdSBjYW4gdXNlIGl0IGRpcmVjdGx5LgorSWYgbm90LCB0aGUgZmxhZyBpcyBqdXN0IGlnbm9yZWQuCitFeGFtcGxlOgorCitcY29kZQorVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZkNyZWF0ZUluZm8gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTyB9OworYnVmQ3JlYXRlSW5mby5zaXplID0gc2l6ZW9mKENvbnN0YW50QnVmZmVyKTsKK2J1ZkNyZWF0ZUluZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUIHwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisKK1ZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFsbG9jQ3JlYXRlSW5mbyA9IHt9OworYWxsb2NDcmVhdGVJbmZvLnVzYWdlID0gVk1BX01FTU9SWV9VU0FHRV9HUFVfT05MWTsKK2FsbG9jQ3JlYXRlSW5mby5mbGFncyA9IFZNQV9BTExPQ0FUSU9OX0NSRUFURV9NQVBQRURfQklUOworCitWa0J1ZmZlciBidWY7CitWbWFBbGxvY2F0aW9uIGFsbG9jOworVm1hQWxsb2NhdGlvbkluZm8gYWxsb2NJbmZvOwordm1hQ3JlYXRlQnVmZmVyKGFsbG9jYXRvciwgJmJ1ZkNyZWF0ZUluZm8sICZhbGxvY0NyZWF0ZUluZm8sICZidWYsICZhbGxvYywgJmFsbG9jSW5mbyk7CisKK2lmKGFsbG9jSW5mby5wVXNlckRhdGEgIT0gbnVsbHB0cikKK3sKKyAgICAvLyBBbGxvY2F0aW9uIGVuZGVkIHVwIGluIG1hcHBhYmxlIG1lbW9yeS4KKyAgICAvLyBJdCdzIHBlcnNpc3RlbnRseSBtYXBwZWQuIFlvdSBjYW4gYWNjZXNzIGl0IGRpcmVjdGx5LgorICAgIG1lbWNweShhbGxvY0luZm8ucE1hcHBlZERhdGEsICZjb25zdGFudEJ1ZmZlckRhdGEsIHNpemVvZihjb25zdGFudEJ1ZmZlckRhdGEpKTsKK30KK2Vsc2UKK3sKKyAgICAvLyBBbGxvY2F0aW9uIGVuZGVkIHVwIGluIG5vbi1tYXBwYWJsZSBtZW1vcnkuCisgICAgLy8gWW91IG5lZWQgdG8gY3JlYXRlIENQVS1zaWRlIGJ1ZmZlciBpbiBWTUFfTUVNT1JZX1VTQUdFX0NQVV9PTkxZIGFuZCBtYWtlIGEgdHJhbnNmZXIuCit9CitcZW5kY29kZQorCisKK1xwYWdlIGN1c3RvbV9tZW1vcnlfcG9vbHMgQ3VzdG9tIG1lbW9yeSBwb29scworCitBIG1lbW9yeSBwb29sIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGBWa0RldmljZU1lbW9yeWAgYmxvY2tzLgorVGhlIGxpYnJhcnkgYXV0b21hdGljYWxseSBjcmVhdGVzIGFuZCBtYW5hZ2VzIGRlZmF1bHQgcG9vbCBmb3IgZWFjaCBtZW1vcnkgdHlwZSBhdmFpbGFibGUgb24gdGhlIGRldmljZS4KK0RlZmF1bHQgbWVtb3J5IHBvb2wgYXV0b21hdGljYWxseSBncm93cyBpbiBzaXplLgorU2l6ZSBvZiBhbGxvY2F0ZWQgYmxvY2tzIGlzIGFsc28gdmFyaWFibGUgYW5kIG1hbmFnZWQgYXV0b21hdGljYWxseS4KKworWW91IGNhbiBjcmVhdGUgY3VzdG9tIHBvb2wgYW5kIGFsbG9jYXRlIG1lbW9yeSBvdXQgb2YgaXQuCitJdCBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvOgorCistIEtlZXAgY2VydGFpbiBraW5kIG9mIGFsbG9jYXRpb25zIHNlcGFyYXRlIGZyb20gb3RoZXJzLgorLSBFbmZvcmNlIHBhcnRpY3VsYXIsIGZpeGVkIHNpemUgb2YgVnVsa2FuIG1lbW9yeSBibG9ja3MuCistIExpbWl0IG1heGltdW0gYW1vdW50IG9mIFZ1bGthbiBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGF0IHBvb2wuCistIFJlc2VydmUgbWluaW11bSBvciBmaXhlZCBhbW91bnQgb2YgVnVsa2FuIG1lbW9yeSBhbHdheXMgcHJlYWxsb2NhdGVkIGZvciB0aGF0IHBvb2wuCisKK1RvIHVzZSBjdXN0b20gbWVtb3J5IHBvb2xzOgorCistIyBGaWxsIFZtYVBvb2xDcmVhdGVJbmZvIHN0cnVjdHVyZS4KKy0jIENhbGwgdm1hQ3JlYXRlUG9vbCgpIHRvIG9idGFpbiAjVm1hUG9vbCBoYW5kbGUuCistIyBXaGVuIG1ha2luZyBhbiBhbGxvY2F0aW9uLCBzZXQgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm86OnBvb2wgdG8gdGhpcyBoYW5kbGUuCisgICBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGFueSBvdGhlciBwYXJhbWV0ZXJzIG9mIHRoaXMgc3RydWN0dXJlLCBsaWtlIGB1c2FnZWAuCisKK0V4YW1wbGU6CisKK1xjb2RlCisvLyBDcmVhdGUgYSBwb29sIHRoYXQgY2FuIGhhdmUgYXQgbW9zdCAyIGJsb2NrcywgMTI4IE1pQiBlYWNoLgorVm1hUG9vbENyZWF0ZUluZm8gcG9vbENyZWF0ZUluZm8gPSB7fTsKK3Bvb2xDcmVhdGVJbmZvLm1lbW9yeVR5cGVJbmRleCA9IC4uLgorcG9vbENyZWF0ZUluZm8uYmxvY2tTaXplID0gMTI4dWxsICogMTAyNCAqIDEwMjQ7Citwb29sQ3JlYXRlSW5mby5tYXhCbG9ja0NvdW50ID0gMjsKKworVm1hUG9vbCBwb29sOwordm1hQ3JlYXRlUG9vbChhbGxvY2F0b3IsICZwb29sQ3JlYXRlSW5mbywgJnBvb2wpOworCisvLyBBbGxvY2F0ZSBhIGJ1ZmZlciBvdXQgb2YgaXQuCitWa0J1ZmZlckNyZWF0ZUluZm8gYnVmQ3JlYXRlSW5mbyA9IHsgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPIH07CitidWZDcmVhdGVJbmZvLnNpemUgPSAxMDI0OworYnVmQ3JlYXRlSW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQgfCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKworVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gYWxsb2NDcmVhdGVJbmZvID0ge307CithbGxvY0NyZWF0ZUluZm8ucG9vbCA9IHBvb2w7CisKK1ZrQnVmZmVyIGJ1ZjsKK1ZtYUFsbG9jYXRpb24gYWxsb2M7CitWbWFBbGxvY2F0aW9uSW5mbyBhbGxvY0luZm87Cit2bWFDcmVhdGVCdWZmZXIoYWxsb2NhdG9yLCAmYnVmQ3JlYXRlSW5mbywgJmFsbG9jQ3JlYXRlSW5mbywgJmJ1ZiwgJmFsbG9jLCAmYWxsb2NJbmZvKTsKK1xlbmRjb2RlCisKK1lvdSBoYXZlIHRvIGZyZWUgYWxsIGFsbG9jYXRpb25zIG1hZGUgZnJvbSB0aGlzIHBvb2wgYmVmb3JlIGRlc3Ryb3lpbmcgaXQuCisKK1xjb2RlCit2bWFEZXN0cm95QnVmZmVyKGFsbG9jYXRvciwgYnVmLCBhbGxvYyk7Cit2bWFEZXN0cm95UG9vbChhbGxvY2F0b3IsIHBvb2wpOworXGVuZGNvZGUKKworXHNlY3Rpb24gY3VzdG9tX21lbW9yeV9wb29sc19NZW1UeXBlSW5kZXggQ2hvb3NpbmcgbWVtb3J5IHR5cGUgaW5kZXgKKworV2hlbiBjcmVhdGluZyBhIHBvb2wsIHlvdSBtdXN0IGV4cGxpY2l0bHkgc3BlY2lmeSBtZW1vcnkgdHlwZSBpbmRleC4KK1RvIGZpbmQgdGhlIG9uZSBzdWl0YWJsZSBmb3IgeW91ciBidWZmZXJzIG9yIGltYWdlcywgeW91IGNhbiB1c2UgaGVscGVyIGZ1bmN0aW9ucwordm1hRmluZE1lbW9yeVR5cGVJbmRleEZvckJ1ZmZlckluZm8oKSwgdm1hRmluZE1lbW9yeVR5cGVJbmRleEZvckltYWdlSW5mbygpLgorWW91IG5lZWQgdG8gcHJvdmlkZSBzdHJ1Y3R1cmVzIHdpdGggZXhhbXBsZSBwYXJhbWV0ZXJzIG9mIGJ1ZmZlcnMgb3IgaW1hZ2VzCit0aGF0IHlvdSBhcmUgZ29pbmcgdG8gY3JlYXRlIGluIHRoYXQgcG9vbC4KKworXGNvZGUKK1ZrQnVmZmVyQ3JlYXRlSW5mbyBleGFtcGxlQnVmQ3JlYXRlSW5mbyA9IHsgVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPIH07CitleGFtcGxlQnVmQ3JlYXRlSW5mby5zaXplID0gMTAyNDsgLy8gV2hhdGV2ZXIuCitleGFtcGxlQnVmQ3JlYXRlSW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQgfCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsgLy8gQ2hhbmdlIGlmIG5lZWRlZC4KKworVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gYWxsb2NDcmVhdGVJbmZvID0ge307CithbGxvY0NyZWF0ZUluZm8udXNhZ2UgPSBWTUFfTUVNT1JZX1VTQUdFX0dQVV9PTkxZOyAvLyBDaGFuZ2UgaWYgbmVlZGVkLgorCit1aW50MzJfdCBtZW1UeXBlSW5kZXg7Cit2bWFGaW5kTWVtb3J5VHlwZUluZGV4Rm9yQnVmZmVySW5mbyhhbGxvY2F0b3IsICZleGFtcGxlQnVmQ3JlYXRlSW5mbywgJmFsbG9jQ3JlYXRlSW5mbywgJm1lbVR5cGVJbmRleCk7CisKK1ZtYVBvb2xDcmVhdGVJbmZvIHBvb2xDcmVhdGVJbmZvID0ge307Citwb29sQ3JlYXRlSW5mby5tZW1vcnlUeXBlSW5kZXggPSBtZW1UeXBlSW5kZXg7CisvLyAuLi4KK1xlbmRjb2RlCisKK1doZW4gY3JlYXRpbmcgYnVmZmVycy9pbWFnZXMgYWxsb2NhdGVkIGluIHRoYXQgcG9vbCwgcHJvdmlkZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworLSBgVmtCdWZmZXJDcmVhdGVJbmZvYDogUHJlZmVyIHRvIHBhc3Mgc2FtZSBwYXJhbWV0ZXJzIGFzIGFib3ZlLgorICBPdGhlcndpc2UgeW91IHJpc2sgY3JlYXRpbmcgcmVzb3VyY2VzIGluIGEgbWVtb3J5IHR5cGUgdGhhdCBpcyBub3Qgc3VpdGFibGUgZm9yIHRoZW0sIHdoaWNoIG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICBVc2luZyBkaWZmZXJlbnQgYFZLX0JVRkZFUl9VU0FHRV9gIGZsYWdzIG1heSB3b3JrLCBidXQgeW91IHNob3VsZG4ndCBjcmVhdGUgaW1hZ2VzIGluIGEgcG9vbCBpbnRlbmRlZCBmb3IgYnVmZmVycworICBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKy0gVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm86IFlvdSBkb24ndCBuZWVkIHRvIHBhc3Mgc2FtZSBwYXJhbWV0ZXJzLiBGaWxsIG9ubHkgYHBvb2xgIG1lbWJlci4KKyAgT3RoZXIgbWVtYmVycyBhcmUgaWdub3JlZCBhbnl3YXkuCisKK1xzZWN0aW9uIGxpbmVhcl9hbGdvcml0aG0gTGluZWFyIGFsbG9jYXRpb24gYWxnb3JpdGhtCisKK0VhY2ggVnVsa2FuIG1lbW9yeSBibG9jayBtYW5hZ2VkIGJ5IHRoaXMgbGlicmFyeSBoYXMgYWNjb21wYW55aW5nIG1ldGFkYXRhIHRoYXQKK2tlZXBzIHRyYWNrIG9mIHVzZWQgYW5kIHVudXNlZCByZWdpb25zLiBCeSBkZWZhdWx0LCB0aGUgbWV0YWRhdGEgc3RydWN0dXJlIGFuZAorYWxnb3JpdGhtIHRyaWVzIHRvIGZpbmQgYmVzdCBwbGFjZSBmb3IgbmV3IGFsbG9jYXRpb25zIGFtb25nIGZyZWUgcmVnaW9ucyB0bworb3B0aW1pemUgbWVtb3J5IHVzYWdlLiBUaGlzIHdheSB5b3UgY2FuIGFsbG9jYXRlIGFuZCBmcmVlIG9iamVjdHMgaW4gYW55IG9yZGVyLgorCishW0RlZmF1bHQgYWxsb2NhdGlvbiBhbGdvcml0aG1dKC4uL2dmeC9MaW5lYXJfYWxsb2NhdG9yXzFfYWxnb19kZWZhdWx0LnBuZykKKworU29tZXRpbWVzIHRoZXJlIGlzIGEgbmVlZCB0byB1c2Ugc2ltcGxlciwgbGluZWFyIGFsbG9jYXRpb24gYWxnb3JpdGhtLiBZb3UgY2FuCitjcmVhdGUgY3VzdG9tIHBvb2wgdGhhdCB1c2VzIHN1Y2ggYWxnb3JpdGhtIGJ5IGFkZGluZyBmbGFnCisjVk1BX1BPT0xfQ1JFQVRFX0xJTkVBUl9BTEdPUklUSE1fQklUIHRvIFZtYVBvb2xDcmVhdGVJbmZvOjpmbGFncyB3aGlsZSBjcmVhdGluZworI1ZtYVBvb2wgb2JqZWN0LiBUaGVuIGFuIGFsdGVybmF0aXZlIG1ldGFkYXRhIG1hbmFnZW1lbnQgaXMgdXNlZC4gSXQgYWx3YXlzCitjcmVhdGVzIG5ldyBhbGxvY2F0aW9ucyBhZnRlciBsYXN0IG9uZSBhbmQgZG9lc24ndCByZXVzZSBmcmVlIHJlZ2lvbnMgYWZ0ZXIKK2FsbG9jYXRpb25zIGZyZWVkIGluIHRoZSBtaWRkbGUuIEl0IHJlc3VsdHMgaW4gYmV0dGVyIGFsbG9jYXRpb24gcGVyZm9ybWFuY2UgYW5kCitsZXNzIG1lbW9yeSBjb25zdW1lZCBieSBtZXRhZGF0YS4KKworIVtMaW5lYXIgYWxsb2NhdGlvbiBhbGdvcml0aG1dKC4uL2dmeC9MaW5lYXJfYWxsb2NhdG9yXzJfYWxnb19saW5lYXIucG5nKQorCitXaXRoIHRoaXMgb25lIGZsYWcsIHlvdSBjYW4gY3JlYXRlIGEgY3VzdG9tIHBvb2wgdGhhdCBjYW4gYmUgdXNlZCBpbiBtYW55IHdheXM6CitmcmVlLWF0LW9uY2UsIHN0YWNrLCBkb3VibGUgc3RhY2ssIGFuZCByaW5nIGJ1ZmZlci4gU2VlIGJlbG93IGZvciBkZXRhaWxzLgorCitcc3Vic2VjdGlvbiBsaW5lYXJfYWxnb3JpdGhtX2ZyZWVfYXRfb25jZSBGcmVlLWF0LW9uY2UKKworSW4gYSBwb29sIHRoYXQgdXNlcyBsaW5lYXIgYWxnb3JpdGhtLCB5b3Ugc3RpbGwgbmVlZCB0byBmcmVlIGFsbCB0aGUgYWxsb2NhdGlvbnMKK2luZGl2aWR1YWxseSwgZS5nLiBieSB1c2luZyB2bWFGcmVlTWVtb3J5KCkgb3Igdm1hRGVzdHJveUJ1ZmZlcigpLiBZb3UgY2FuIGZyZWUKK3RoZW0gaW4gYW55IG9yZGVyLiBOZXcgYWxsb2NhdGlvbnMgYXJlIGFsd2F5cyBtYWRlIGFmdGVyIGxhc3Qgb25lIC0gZnJlZSBzcGFjZQoraW4gdGhlIG1pZGRsZSBpcyBub3QgcmV1c2VkLiBIb3dldmVyLCB3aGVuIHlvdSByZWxlYXNlIGFsbCB0aGUgYWxsb2NhdGlvbiBhbmQKK3RoZSBwb29sIGJlY29tZXMgZW1wdHksIGFsbG9jYXRpb24gc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZyBhZ2Fpbi4gVGhpcyB3YXkgeW91CitjYW4gdXNlIGxpbmVhciBhbGdvcml0aG0gdG8gc3BlZWQgdXAgY3JlYXRpb24gb2YgYWxsb2NhdGlvbnMgdGhhdCB5b3UgYXJlIGdvaW5nCit0byByZWxlYXNlIGFsbCBhdCBvbmNlLgorCishW0ZyZWUtYXQtb25jZV0oLi4vZ2Z4L0xpbmVhcl9hbGxvY2F0b3JfM19mcmVlX2F0X29uY2UucG5nKQorCitUaGlzIG1vZGUgaXMgYWxzbyBhdmFpbGFibGUgZm9yIHBvb2xzIGNyZWF0ZWQgd2l0aCBWbWFQb29sQ3JlYXRlSW5mbzo6bWF4QmxvY2tDb3VudAordmFsdWUgdGhhdCBhbGxvd3MgbXVsdGlwbGUgbWVtb3J5IGJsb2Nrcy4KKworXHN1YnNlY3Rpb24gbGluZWFyX2FsZ29yaXRobV9zdGFjayBTdGFjaworCitXaGVuIHlvdSBmcmVlIGFuIGFsbG9jYXRpb24gdGhhdCB3YXMgY3JlYXRlZCBsYXN0LCBpdHMgc3BhY2UgY2FuIGJlIHJldXNlZC4KK1RoYW5rcyB0byB0aGlzLCBpZiB5b3UgYWx3YXlzIHJlbGVhc2UgYWxsb2NhdGlvbnMgaW4gdGhlIG9yZGVyIG9wcG9zaXRlIHRvIHRoZWlyCitjcmVhdGlvbiAoTElGTyAtIExhc3QgSW4gRmlyc3QgT3V0KSwgeW91IGNhbiBhY2hpZXZlIGJlaGF2aW9yIG9mIGEgc3RhY2suCisKKyFbU3RhY2tdKC4uL2dmeC9MaW5lYXJfYWxsb2NhdG9yXzRfc3RhY2sucG5nKQorCitUaGlzIG1vZGUgaXMgYWxzbyBhdmFpbGFibGUgZm9yIHBvb2xzIGNyZWF0ZWQgd2l0aCBWbWFQb29sQ3JlYXRlSW5mbzo6bWF4QmxvY2tDb3VudAordmFsdWUgdGhhdCBhbGxvd3MgbXVsdGlwbGUgbWVtb3J5IGJsb2Nrcy4KKworXHN1YnNlY3Rpb24gbGluZWFyX2FsZ29yaXRobV9kb3VibGVfc3RhY2sgRG91YmxlIHN0YWNrCisKK1RoZSBzcGFjZSByZXNlcnZlZCBieSBhIGN1c3RvbSBwb29sIHdpdGggbGluZWFyIGFsZ29yaXRobSBtYXkgYmUgdXNlZCBieSB0d28KK3N0YWNrczoKKworLSBGaXJzdCwgZGVmYXVsdCBvbmUsIGdyb3dpbmcgdXAgZnJvbSBvZmZzZXQgMC4KKy0gU2Vjb25kLCAidXBwZXIiIG9uZSwgZ3Jvd2luZyBkb3duIGZyb20gdGhlIGVuZCB0b3dhcmRzIGxvd2VyIG9mZnNldHMuCisKK1RvIG1ha2UgYWxsb2NhdGlvbiBmcm9tIHVwcGVyIHN0YWNrLCBhZGQgZmxhZyAjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1VQUEVSX0FERFJFU1NfQklUCit0byBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbzo6ZmxhZ3MuCisKKyFbRG91YmxlIHN0YWNrXSguLi9nZngvTGluZWFyX2FsbG9jYXRvcl83X2RvdWJsZV9zdGFjay5wbmcpCisKK0RvdWJsZSBzdGFjayBpcyBhdmFpbGFibGUgb25seSBpbiBwb29scyB3aXRoIG9uZSBtZW1vcnkgYmxvY2sgLQorVm1hUG9vbENyZWF0ZUluZm86Om1heEJsb2NrQ291bnQgbXVzdCBiZSAxLiBPdGhlcndpc2UgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorCitXaGVuIHRoZSB0d28gc3RhY2tzJyBlbmRzIG1lZXQgc28gdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBiZXR3ZWVuIHRoZW0gZm9yIGEKK25ldyBhbGxvY2F0aW9uLCBzdWNoIGFsbG9jYXRpb24gZmFpbHMgd2l0aCB1c3VhbAorYFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZYCBlcnJvci4KKworXHN1YnNlY3Rpb24gbGluZWFyX2FsZ29yaXRobV9yaW5nX2J1ZmZlciBSaW5nIGJ1ZmZlcgorCitXaGVuIHlvdSBmcmVlIHNvbWUgYWxsb2NhdGlvbnMgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCB0aGVyZSBpcyBub3QgZW5vdWdoIGZyZWUgc3BhY2UKK2ZvciBhIG5ldyBvbmUgYXQgdGhlIGVuZCBvZiBhIHBvb2wsIGFsbG9jYXRvcidzICJjdXJzb3IiIHdyYXBzIGFyb3VuZCB0byB0aGUKK2JlZ2lubmluZyBhbmQgc3RhcnRzIGFsbG9jYXRpb24gdGhlcmUuIFRoYW5rcyB0byB0aGlzLCBpZiB5b3UgYWx3YXlzIHJlbGVhc2UKK2FsbG9jYXRpb25zIGluIHRoZSBzYW1lIG9yZGVyIGFzIHlvdSBjcmVhdGVkIHRoZW0gKEZJRk8gLSBGaXJzdCBJbiBGaXJzdCBPdXQpLAoreW91IGNhbiBhY2hpZXZlIGJlaGF2aW9yIG9mIGEgcmluZyBidWZmZXIgLyBxdWV1ZS4KKworIVtSaW5nIGJ1ZmZlcl0oLi4vZ2Z4L0xpbmVhcl9hbGxvY2F0b3JfNV9yaW5nX2J1ZmZlci5wbmcpCisKK1Bvb2xzIHdpdGggbGluZWFyIGFsZ29yaXRobSBzdXBwb3J0IFtsb3N0IGFsbG9jYXRpb25zXShAcmVmIGxvc3RfYWxsb2NhdGlvbnMpIHdoZW4gdXNlZCBhcyByaW5nIGJ1ZmZlci4KK0lmIHRoZXJlIGlzIG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBmb3IgYSBuZXcgYWxsb2NhdGlvbiwgYnV0IGV4aXN0aW5nIGFsbG9jYXRpb25zCitmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgY2FuIGJlY29tZSBsb3N0LCB0aGV5IGJlY29tZSBsb3N0IGFuZCB0aGUgYWxsb2NhdGlvbgorc3VjY2VlZHMuCisKKyFbUmluZyBidWZmZXIgd2l0aCBsb3N0IGFsbG9jYXRpb25zXSguLi9nZngvTGluZWFyX2FsbG9jYXRvcl82X3JpbmdfYnVmZmVyX2xvc3QucG5nKQorCitSaW5nIGJ1ZmZlciBpcyBhdmFpbGFibGUgb25seSBpbiBwb29scyB3aXRoIG9uZSBtZW1vcnkgYmxvY2sgLQorVm1hUG9vbENyZWF0ZUluZm86Om1heEJsb2NrQ291bnQgbXVzdCBiZSAxLiBPdGhlcndpc2UgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorCitcc2VjdGlvbiBidWRkeV9hbGdvcml0aG0gQnVkZHkgYWxsb2NhdGlvbiBhbGdvcml0aG0KKworVGhlcmUgaXMgYW5vdGhlciBhbGxvY2F0aW9uIGFsZ29yaXRobSB0aGF0IGNhbiBiZSB1c2VkIHdpdGggY3VzdG9tIHBvb2xzLCBjYWxsZWQKKyJidWRkeSIuIEl0cyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBpcyBiYXNlZCBvbiBhIHRyZWUgb2YgYmxvY2tzLCBlYWNoIGhhdmluZworc2l6ZSB0aGF0IGlzIGEgcG93ZXIgb2YgdHdvIGFuZCBhIGhhbGYgb2YgaXRzIHBhcmVudCdzIHNpemUuIFdoZW4geW91IHdhbnQgdG8KK2FsbG9jYXRlIG1lbW9yeSBvZiBjZXJ0YWluIHNpemUsIGEgZnJlZSBub2RlIGluIHRoZSB0cmVlIGlzIGxvY2F0ZWQuIElmIGl0J3MgdG9vCitsYXJnZSwgaXQgaXMgcmVjdXJzaXZlbHkgc3BsaXQgaW50byB0d28gaGFsdmVzIChjYWxsZWQgImJ1ZGRpZXMiKS4gSG93ZXZlciwgaWYKK3JlcXVlc3RlZCBhbGxvY2F0aW9uIHNpemUgaXMgbm90IGEgcG93ZXIgb2YgdHdvLCB0aGUgc2l6ZSBvZiBhIHRyZWUgbm9kZSBpcworYWxpZ25lZCB1cCB0byB0aGUgbmVhcmVzdCBwb3dlciBvZiB0d28gYW5kIHRoZSByZW1haW5pbmcgc3BhY2UgaXMgd2FzdGVkLiBXaGVuCit0d28gYnVkZHkgbm9kZXMgYmVjb21lIGZyZWUsIHRoZXkgYXJlIG1lcmdlZCBiYWNrIGludG8gb25lIGxhcmdlciBub2RlLgorCishW0J1ZGR5IGFsbG9jYXRvcl0oLi4vZ2Z4L0J1ZGR5X2FsbG9jYXRvci5wbmcpCisKK1RoZSBhZHZhbnRhZ2Ugb2YgYnVkZHkgYWxsb2NhdGlvbiBhbGdvcml0aG0gb3ZlciBkZWZhdWx0IGFsZ29yaXRobSBpcyBmYXN0ZXIKK2FsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiwgYXMgd2VsbCBhcyBzbWFsbGVyIGV4dGVybmFsIGZyYWdtZW50YXRpb24uIFRoZQorZGlzYWR2YW50YWdlIGlzIG1vcmUgd2FzdGVkIHNwYWNlIChpbnRlcm5hbCBmcmFnbWVudGF0aW9uKS4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkIFsiQnVkZHkgbWVtb3J5IGFsbG9jYXRpb24iIG9uIFdpa2lwZWRpYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnVkZHlfbWVtb3J5X2FsbG9jYXRpb24pCitvciBvdGhlciBzb3VyY2VzIHRoYXQgZGVzY3JpYmUgdGhpcyBjb25jZXB0IGluIGdlbmVyYWwuCisKK1RvIHVzZSBidWRkeSBhbGxvY2F0aW9uIGFsZ29yaXRobSB3aXRoIGEgY3VzdG9tIHBvb2wsIGFkZCBmbGFnCisjVk1BX1BPT0xfQ1JFQVRFX0JVRERZX0FMR09SSVRITV9CSVQgdG8gVm1hUG9vbENyZWF0ZUluZm86OmZsYWdzIHdoaWxlIGNyZWF0aW5nCisjVm1hUG9vbCBvYmplY3QuCisKK1NldmVyYWwgbGltaXRhdGlvbnMgYXBwbHkgdG8gcG9vbHMgdGhhdCB1c2UgYnVkZHkgYWxnb3JpdGhtOgorCistIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBWbWFQb29sQ3JlYXRlSW5mbzo6YmxvY2tTaXplIHRoYXQgaXMgYSBwb3dlciBvZiB0d28uCisgIE90aGVyd2lzZSwgb25seSBsYXJnZXN0IHBvd2VyIG9mIHR3byBzbWFsbGVyIHRoYW4gdGhlIHNpemUgaXMgdXNlZCBmb3IKKyAgYWxsb2NhdGlvbnMuIFRoZSByZW1haW5pbmcgc3BhY2UgYWx3YXlzIHN0YXlzIHVudXNlZC4KKy0gW01hcmdpbnNdKEByZWYgZGVidWdnaW5nX21lbW9yeV91c2FnZV9tYXJnaW5zKSBhbmQKKyAgW2NvcnJ1cHRpb24gZGV0ZWN0aW9uXShAcmVmIGRlYnVnZ2luZ19tZW1vcnlfdXNhZ2VfY29ycnVwdGlvbl9kZXRlY3Rpb24pCisgIGRvbid0IHdvcmsgaW4gc3VjaCBwb29scy4KKy0gW0xvc3QgYWxsb2NhdGlvbnNdKEByZWYgbG9zdF9hbGxvY2F0aW9ucykgZG9uJ3Qgd29yayBpbiBzdWNoIHBvb2xzLiBZb3UgY2FuCisgIHVzZSB0aGVtLCBidXQgdGhleSBuZXZlciBiZWNvbWUgbG9zdC4gU3VwcG9ydCBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4KKy0gW0RlZnJhZ21lbnRhdGlvbl0oQHJlZiBkZWZyYWdtZW50YXRpb24pIGRvZXNuJ3Qgd29yayB3aXRoIGFsbG9jYXRpb25zIG1hZGUgZnJvbQorICBzdWNoIHBvb2wuCisKK1xwYWdlIGRlZnJhZ21lbnRhdGlvbiBEZWZyYWdtZW50YXRpb24KKworSW50ZXJsZWF2ZWQgYWxsb2NhdGlvbnMgYW5kIGRlYWxsb2NhdGlvbnMgb2YgbWFueSBvYmplY3RzIG9mIHZhcnlpbmcgc2l6ZSBjYW4KK2NhdXNlIGZyYWdtZW50YXRpb24gb3ZlciB0aW1lLCB3aGljaCBjYW4gbGVhZCB0byBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgbGlicmFyeSBpcyB1bmFibGUKK3RvIGZpbmQgYSBjb250aW51b3VzIHJhbmdlIG9mIGZyZWUgbWVtb3J5IGZvciBhIG5ldyBhbGxvY2F0aW9uIGRlc3BpdGUgdGhlcmUgaXMKK2Vub3VnaCBmcmVlIHNwYWNlLCBqdXN0IHNjYXR0ZXJlZCBhY3Jvc3MgbWFueSBzbWFsbCBmcmVlIHJhbmdlcyBiZXR3ZWVuIGV4aXN0aW5nCithbGxvY2F0aW9ucy4KKworVG8gbWl0aWdhdGUgdGhpcyBwcm9ibGVtLCB5b3UgY2FuIHVzZSBkZWZyYWdtZW50YXRpb24gZmVhdHVyZToKK3N0cnVjdHVyZSAjVm1hRGVmcmFnbWVudGF0aW9uSW5mbzIsIGZ1bmN0aW9uIHZtYURlZnJhZ21lbnRhdGlvbkJlZ2luKCksIHZtYURlZnJhZ21lbnRhdGlvbkVuZCgpLgorR2l2ZW4gc2V0IG9mIGFsbG9jYXRpb25zLCAKK3RoaXMgZnVuY3Rpb24gY2FuIG1vdmUgdGhlbSB0byBjb21wYWN0IHVzZWQgbWVtb3J5LCBlbnN1cmUgbW9yZSBjb250aW51b3VzIGZyZWUKK3NwYWNlIGFuZCBwb3NzaWJseSBhbHNvIGZyZWUgc29tZSBgVmtEZXZpY2VNZW1vcnlgIGJsb2Nrcy4KKworV2hhdCB0aGUgZGVmcmFnbWVudGF0aW9uIGRvZXMgaXM6CisKKy0gVXBkYXRlcyAjVm1hQWxsb2NhdGlvbiBvYmplY3RzIHRvIHBvaW50IHRvIG5ldyBgVmtEZXZpY2VNZW1vcnlgIGFuZCBvZmZzZXQuCisgIEFmdGVyIGFsbG9jYXRpb24gaGFzIGJlZW4gbW92ZWQsIGl0cyBWbWFBbGxvY2F0aW9uSW5mbzo6ZGV2aWNlTWVtb3J5IGFuZC9vcgorICBWbWFBbGxvY2F0aW9uSW5mbzo6b2Zmc2V0IGNoYW5nZXMuIFlvdSBtdXN0IHF1ZXJ5IHRoZW0gYWdhaW4gdXNpbmcKKyAgdm1hR2V0QWxsb2NhdGlvbkluZm8oKSBpZiB5b3UgbmVlZCB0aGVtLgorLSBNb3ZlcyBhY3R1YWwgZGF0YSBpbiBtZW1vcnkuCisKK1doYXQgaXQgZG9lc24ndCBkbywgc28geW91IG5lZWQgdG8gZG8gaXQgeW91cnNlbGY6CisKKy0gUmVjcmVhdGUgYnVmZmVycyBhbmQgaW1hZ2VzIHRoYXQgd2VyZSBib3VuZCB0byBhbGxvY2F0aW9ucyB0aGF0IHdlcmUgZGVmcmFnbWVudGVkIGFuZAorICBiaW5kIHRoZW0gd2l0aCB0aGVpciBuZXcgcGxhY2VzIGluIG1lbW9yeS4KKyAgWW91IG11c3QgdXNlIGB2a0Rlc3Ryb3lCdWZmZXIoKWAsIGB2a0Rlc3Ryb3lJbWFnZSgpYCwKKyAgYHZrQ3JlYXRlQnVmZmVyKClgLCBgdmtDcmVhdGVJbWFnZSgpYCBmb3IgdGhhdCBwdXJwb3NlIGFuZCBOT1Qgdm1hRGVzdHJveUJ1ZmZlcigpLAorICB2bWFEZXN0cm95SW1hZ2UoKSwgdm1hQ3JlYXRlQnVmZmVyKCksIHZtYUNyZWF0ZUltYWdlKCksIGJlY2F1c2UgeW91IGRvbid0IG5lZWQgdG8KKyAgZGVzdHJveSBvciBjcmVhdGUgYWxsb2NhdGlvbiBvYmplY3RzIQorLSBSZWNyZWF0ZSB2aWV3cyBhbmQgdXBkYXRlIGRlc2NyaXB0b3JzIHRoYXQgcG9pbnQgdG8gdGhlc2UgYnVmZmVycyBhbmQgaW1hZ2VzLgorCitcc2VjdGlvbiBkZWZyYWdtZW50YXRpb25fY3B1IERlZnJhZ21lbnRpbmcgQ1BVIG1lbW9yeQorCitGb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHlvdSBjYW4gcnVuIGRlZnJhZ21lbnRhdGlvbiBvbiBDUFUuCitPbmx5IGFsbG9jYXRpb25zIGNyZWF0ZWQgaW4gbWVtb3J5IHR5cGVzIHRoYXQgYXJlIGBIT1NUX1ZJU0lCTEVgIGNhbiBiZSBkZWZyYWdtZW50ZWQuCitPdGhlcnMgYXJlIGlnbm9yZWQuCisKK1RoZSB3YXkgaXQgd29ya3MgaXM6CisKKy0gSXQgdGVtcG9yYXJpbHkgbWFwcyBlbnRpcmUgbWVtb3J5IGJsb2NrcyB3aGVuIG5lY2Vzc2FyeS4KKy0gSXQgbW92ZXMgZGF0YSB1c2luZyBgbWVtbW92ZSgpYCBmdW5jdGlvbi4KKworXGNvZGUKKy8vIEdpdmVuIGZvbGxvd2luZyB2YXJpYWJsZXMgYWxyZWFkeSBpbml0aWFsaXplZDoKK1ZrRGV2aWNlIGRldmljZTsKK1ZtYUFsbG9jYXRvciBhbGxvY2F0b3I7CitzdGQ6OnZlY3RvcjxWa0J1ZmZlcj4gYnVmZmVyczsKK3N0ZDo6dmVjdG9yPFZtYUFsbG9jYXRpb24+IGFsbG9jYXRpb25zOworCisKK2NvbnN0IHVpbnQzMl90IGFsbG9jQ291bnQgPSAodWludDMyX3QpYWxsb2NhdGlvbnMuc2l6ZSgpOworc3RkOjp2ZWN0b3I8VmtCb29sMzI+IGFsbG9jYXRpb25zQ2hhbmdlZChhbGxvY0NvdW50KTsKKworVm1hRGVmcmFnbWVudGF0aW9uSW5mbzIgZGVmcmFnSW5mbyA9IHt9OworZGVmcmFnSW5mby5hbGxvY2F0aW9uQ291bnQgPSBhbGxvY0NvdW50OworZGVmcmFnSW5mby5wQWxsb2NhdGlvbnMgPSBhbGxvY2F0aW9ucy5kYXRhKCk7CitkZWZyYWdJbmZvLnBBbGxvY2F0aW9uc0NoYW5nZWQgPSBhbGxvY2F0aW9uc0NoYW5nZWQuZGF0YSgpOworZGVmcmFnSW5mby5tYXhDcHVCeXRlc1RvTW92ZSA9IFZLX1dIT0xFX1NJWkU7IC8vIE5vIGxpbWl0LgorZGVmcmFnSW5mby5tYXhDcHVBbGxvY2F0aW9uc1RvTW92ZSA9IFVJTlQzMl9NQVg7IC8vIE5vIGxpbWl0LgorCitWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0IGRlZnJhZ0N0eDsKK3ZtYURlZnJhZ21lbnRhdGlvbkJlZ2luKGFsbG9jYXRvciwgJmRlZnJhZ0luZm8sIG51bGxwdHIsICZkZWZyYWdDdHgpOwordm1hRGVmcmFnbWVudGF0aW9uRW5kKGFsbG9jYXRvciwgZGVmcmFnQ3R4KTsKKworZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgYWxsb2NDb3VudDsgKytpKQoreworICAgIGlmKGFsbG9jYXRpb25zQ2hhbmdlZFtpXSkKKyAgICB7CisgICAgICAgIC8vIERlc3Ryb3kgYnVmZmVyIHRoYXQgaXMgaW1tdXRhYmx5IGJvdW5kIHRvIG1lbW9yeSByZWdpb24gd2hpY2ggaXMgbm8gbG9uZ2VyIHZhbGlkLgorICAgICAgICB2a0Rlc3Ryb3lCdWZmZXIoZGV2aWNlLCBidWZmZXJzW2ldLCBudWxscHRyKTsKKworICAgICAgICAvLyBDcmVhdGUgbmV3IGJ1ZmZlciB3aXRoIHNhbWUgcGFyYW1ldGVycy4KKyAgICAgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlckluZm8gPSAuLi47CisgICAgICAgIHZrQ3JlYXRlQnVmZmVyKGRldmljZSwgJmJ1ZmZlckluZm8sIG51bGxwdHIsICZidWZmZXJzW2ldKTsKKyAgICAgICAgICAgIAorICAgICAgICAvLyBZb3UgY2FuIG1ha2UgZHVtbXkgY2FsbCB0byB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyBoZXJlIHRvIHNpbGVuY2UgdmFsaWRhdGlvbiBsYXllciB3YXJuaW5nLgorICAgICAgICAgICAgCisgICAgICAgIC8vIEJpbmQgbmV3IGJ1ZmZlciB0byBuZXcgbWVtb3J5IHJlZ2lvbi4gRGF0YSBjb250YWluZWQgaW4gaXQgaXMgYWxyZWFkeSBtb3ZlZC4KKyAgICAgICAgVm1hQWxsb2NhdGlvbkluZm8gYWxsb2NJbmZvOworICAgICAgICB2bWFHZXRBbGxvY2F0aW9uSW5mbyhhbGxvY2F0b3IsIGFsbG9jYXRpb25zW2ldLCAmYWxsb2NJbmZvKTsKKyAgICAgICAgdmtCaW5kQnVmZmVyTWVtb3J5KGRldmljZSwgYnVmZmVyc1tpXSwgYWxsb2NJbmZvLmRldmljZU1lbW9yeSwgYWxsb2NJbmZvLm9mZnNldCk7CisgICAgfQorfQorXGVuZGNvZGUKKworU2V0dGluZyBWbWFEZWZyYWdtZW50YXRpb25JbmZvMjo6cEFsbG9jYXRpb25zQ2hhbmdlZCBpcyBvcHRpb25hbC4KK1RoaXMgb3V0cHV0IGFycmF5IHRlbGxzIHdoZXRoZXIgcGFydGljdWxhciBhbGxvY2F0aW9uIGluIFZtYURlZnJhZ21lbnRhdGlvbkluZm8yOjpwQWxsb2NhdGlvbnMgYXQgdGhlIHNhbWUgaW5kZXgKK2hhcyBiZWVuIG1vZGlmaWVkIGR1cmluZyBkZWZyYWdtZW50YXRpb24uCitZb3UgY2FuIHBhc3MgbnVsbCwgYnV0IHlvdSB0aGVuIG5lZWQgdG8gcXVlcnkgZXZlcnkgYWxsb2NhdGlvbiBwYXNzZWQgdG8gZGVmcmFnbWVudGF0aW9uCitmb3IgbmV3IHBhcmFtZXRlcnMgdXNpbmcgdm1hR2V0QWxsb2NhdGlvbkluZm8oKSBpZiB5b3UgbWlnaHQgbmVlZCB0byByZWNyZWF0ZSBhbmQgcmViaW5kIGEgYnVmZmVyIG9yIGltYWdlIGFzc29jaWF0ZWQgd2l0aCBpdC4KKworSWYgeW91IHVzZSBbQ3VzdG9tIG1lbW9yeSBwb29sc10oQHJlZiBjaG9vc2luZ19tZW1vcnlfdHlwZV9jdXN0b21fbWVtb3J5X3Bvb2xzKSwKK3lvdSBjYW4gZmlsbCBWbWFEZWZyYWdtZW50YXRpb25JbmZvMjo6cG9vbENvdW50IGFuZCBWbWFEZWZyYWdtZW50YXRpb25JbmZvMjo6cFBvb2xzCitpbnN0ZWFkIG9mIFZtYURlZnJhZ21lbnRhdGlvbkluZm8yOjphbGxvY2F0aW9uQ291bnQgYW5kIFZtYURlZnJhZ21lbnRhdGlvbkluZm8yOjpwQWxsb2NhdGlvbnMKK3RvIGRlZnJhZ21lbnQgYWxsIGFsbG9jYXRpb25zIGluIGdpdmVuIHBvb2xzLgorWW91IGNhbm5vdCB1c2UgVm1hRGVmcmFnbWVudGF0aW9uSW5mbzI6OnBBbGxvY2F0aW9uc0NoYW5nZWQgaW4gdGhhdCBjYXNlLgorWW91IGNhbiBhbHNvIGNvbWJpbmUgYm90aCBtZXRob2RzLgorCitcc2VjdGlvbiBkZWZyYWdtZW50YXRpb25fZ3B1IERlZnJhZ21lbnRpbmcgR1BVIG1lbW9yeQorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRlZnJhZ21lbnQgYWxsb2NhdGlvbnMgY3JlYXRlZCBpbiBtZW1vcnkgdHlwZXMgdGhhdCBhcmUgbm90IGBIT1NUX1ZJU0lCTEVgLgorVG8gZG8gdGhhdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNvbW1hbmQgYnVmZmVyIHRoYXQgbWVldHMgcmVxdWlyZW1lbnRzIGFzIGRlc2NyaWJlZCBpbgorVm1hRGVmcmFnbWVudGF0aW9uSW5mbzI6OmNvbW1hbmRCdWZmZXIuIFRoZSB3YXkgaXQgd29ya3MgaXM6CisKKy0gSXQgY3JlYXRlcyB0ZW1wb3JhcnkgYnVmZmVycyBhbmQgYmluZHMgdGhlbSB0byBlbnRpcmUgbWVtb3J5IGJsb2NrcyB3aGVuIG5lY2Vzc2FyeS4KKy0gSXQgaXNzdWVzIGB2a0NtZENvcHlCdWZmZXIoKWAgdG8gcGFzc2VkIGNvbW1hbmQgYnVmZmVyLgorCitFeGFtcGxlOgorCitcY29kZQorLy8gR2l2ZW4gZm9sbG93aW5nIHZhcmlhYmxlcyBhbHJlYWR5IGluaXRpYWxpemVkOgorVmtEZXZpY2UgZGV2aWNlOworVm1hQWxsb2NhdG9yIGFsbG9jYXRvcjsKK1ZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyOworc3RkOjp2ZWN0b3I8VmtCdWZmZXI+IGJ1ZmZlcnM7CitzdGQ6OnZlY3RvcjxWbWFBbGxvY2F0aW9uPiBhbGxvY2F0aW9uczsKKworCitjb25zdCB1aW50MzJfdCBhbGxvY0NvdW50ID0gKHVpbnQzMl90KWFsbG9jYXRpb25zLnNpemUoKTsKK3N0ZDo6dmVjdG9yPFZrQm9vbDMyPiBhbGxvY2F0aW9uc0NoYW5nZWQoYWxsb2NDb3VudCk7CisKK1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjbWRCdWZCZWdpbkluZm8gPSAuLi47Cit2a0JlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLCAmY21kQnVmQmVnaW5JbmZvKTsKKworVm1hRGVmcmFnbWVudGF0aW9uSW5mbzIgZGVmcmFnSW5mbyA9IHt9OworZGVmcmFnSW5mby5hbGxvY2F0aW9uQ291bnQgPSBhbGxvY0NvdW50OworZGVmcmFnSW5mby5wQWxsb2NhdGlvbnMgPSBhbGxvY2F0aW9ucy5kYXRhKCk7CitkZWZyYWdJbmZvLnBBbGxvY2F0aW9uc0NoYW5nZWQgPSBhbGxvY2F0aW9uc0NoYW5nZWQuZGF0YSgpOworZGVmcmFnSW5mby5tYXhHcHVCeXRlc1RvTW92ZSA9IFZLX1dIT0xFX1NJWkU7IC8vIE5vdGljZSBpdCdzICJHUFUiIHRoaXMgdGltZS4KK2RlZnJhZ0luZm8ubWF4R3B1QWxsb2NhdGlvbnNUb01vdmUgPSBVSU5UMzJfTUFYOyAvLyBOb3RpY2UgaXQncyAiR1BVIiB0aGlzIHRpbWUuCitkZWZyYWdJbmZvLmNvbW1hbmRCdWZmZXIgPSBjb21tYW5kQnVmZmVyOworCitWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0IGRlZnJhZ0N0eDsKK3ZtYURlZnJhZ21lbnRhdGlvbkJlZ2luKGFsbG9jYXRvciwgJmRlZnJhZ0luZm8sIG51bGxwdHIsICZkZWZyYWdDdHgpOworCit2a0VuZENvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlcik7CisKKy8vIFN1Ym1pdCBjb21tYW5kQnVmZmVyLgorLy8gV2FpdCBmb3IgYSBmZW5jZSB0aGF0IGVuc3VyZXMgY29tbWFuZEJ1ZmZlciBleGVjdXRpb24gZmluaXNoZWQuCisKK3ZtYURlZnJhZ21lbnRhdGlvbkVuZChhbGxvY2F0b3IsIGRlZnJhZ0N0eCk7CisKK2Zvcih1aW50MzJfdCBpID0gMDsgaSA8IGFsbG9jQ291bnQ7ICsraSkKK3sKKyAgICBpZihhbGxvY2F0aW9uc0NoYW5nZWRbaV0pCisgICAgeworICAgICAgICAvLyBEZXN0cm95IGJ1ZmZlciB0aGF0IGlzIGltbXV0YWJseSBib3VuZCB0byBtZW1vcnkgcmVnaW9uIHdoaWNoIGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgICAgICAgdmtEZXN0cm95QnVmZmVyKGRldmljZSwgYnVmZmVyc1tpXSwgbnVsbHB0cik7CisKKyAgICAgICAgLy8gQ3JlYXRlIG5ldyBidWZmZXIgd2l0aCBzYW1lIHBhcmFtZXRlcnMuCisgICAgICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmZXJJbmZvID0gLi4uOworICAgICAgICB2a0NyZWF0ZUJ1ZmZlcihkZXZpY2UsICZidWZmZXJJbmZvLCBudWxscHRyLCAmYnVmZmVyc1tpXSk7CisgICAgICAgICAgICAKKyAgICAgICAgLy8gWW91IGNhbiBtYWtlIGR1bW15IGNhbGwgdG8gdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMgaGVyZSB0byBzaWxlbmNlIHZhbGlkYXRpb24gbGF5ZXIgd2FybmluZy4KKyAgICAgICAgICAgIAorICAgICAgICAvLyBCaW5kIG5ldyBidWZmZXIgdG8gbmV3IG1lbW9yeSByZWdpb24uIERhdGEgY29udGFpbmVkIGluIGl0IGlzIGFscmVhZHkgbW92ZWQuCisgICAgICAgIFZtYUFsbG9jYXRpb25JbmZvIGFsbG9jSW5mbzsKKyAgICAgICAgdm1hR2V0QWxsb2NhdGlvbkluZm8oYWxsb2NhdG9yLCBhbGxvY2F0aW9uc1tpXSwgJmFsbG9jSW5mbyk7CisgICAgICAgIHZrQmluZEJ1ZmZlck1lbW9yeShkZXZpY2UsIGJ1ZmZlcnNbaV0sIGFsbG9jSW5mby5kZXZpY2VNZW1vcnksIGFsbG9jSW5mby5vZmZzZXQpOworICAgIH0KK30KK1xlbmRjb2RlCisKK1lvdSBjYW4gY29tYmluZSB0aGVzZSB0d28gbWV0aG9kcyBieSBzcGVjaWZ5aW5nIG5vbi16ZXJvIGBtYXhHcHUqYCBhcyB3ZWxsIGFzIGBtYXhDcHUqYCBwYXJhbWV0ZXJzLgorVGhlIGxpYnJhcnkgYXV0b21hdGljYWxseSBjaG9vc2VzIGJlc3QgbWV0aG9kIHRvIGRlZnJhZ21lbnQgZWFjaCBtZW1vcnkgcG9vbC4KKworWW91IG1heSB0cnkgbm90IHRvIGJsb2NrIHlvdXIgZW50aXJlIHByb2dyYW0gdG8gd2FpdCB1bnRpbCBkZWZyYWdtZW50YXRpb24gZmluaXNoZXMsCitidXQgZG8gaXQgaW4gdGhlIGJhY2tncm91bmQsIGFzIGxvbmcgYXMgeW91IGNhcmVmdWxseSBmdWxsZmlsbCByZXF1aXJlbWVudHMgZGVzY3JpYmVkCitpbiBmdW5jdGlvbiB2bWFEZWZyYWdtZW50YXRpb25CZWdpbigpLgorCitcc2VjdGlvbiBkZWZyYWdtZW50YXRpb25fYWRkaXRpb25hbF9ub3RlcyBBZGRpdGlvbmFsIG5vdGVzCisKK1doaWxlIHVzaW5nIGRlZnJhZ21lbnRhdGlvbiwgeW91IG1heSBleHBlcmllbmNlIHZhbGlkYXRpb24gbGF5ZXIgd2FybmluZ3MsIHdoaWNoIHlvdSBqdXN0IG5lZWQgdG8gaWdub3JlLgorU2VlIFtWYWxpZGF0aW9uIGxheWVyIHdhcm5pbmdzXShAcmVmIGdlbmVyYWxfY29uc2lkZXJhdGlvbnNfdmFsaWRhdGlvbl9sYXllcl93YXJuaW5ncykuCisKK0lmIHlvdSBkZWZyYWdtZW50IGFsbG9jYXRpb25zIGJvdW5kIHRvIGltYWdlcywgdGhlc2UgaW1hZ2VzIHNob3VsZCBiZSBjcmVhdGVkIHdpdGgKK2BWS19JTUFHRV9DUkVBVEVfQUxJQVNfQklUYCBmbGFnLCB0byBtYWtlIHN1cmUgdGhhdCBuZXcgaW1hZ2UgY3JlYXRlZCB3aXRoIHNhbWUKK3BhcmFtZXRlcnMgYW5kIHBvaW50aW5nIHRvIGRhdGEgY29waWVkIHRvIGFub3RoZXIgbWVtb3J5IHJlZ2lvbiB3aWxsIGludGVycHJldAoraXRzIGNvbnRlbnRzIGNvbnNpc3RlbnRseS4gT3RoZXJ3aXNlIHlvdSBtYXkgZXhwZXJpZW5jZSBjb3JydXB0ZWQgZGF0YSBvbiBzb21lCitpbXBsZW1lbnRhdGlvbnMsIGUuZy4gZHVlIHRvIGRpZmZlcmVudCBwaXhlbCBzd2l6emxpbmcgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBncmFwaGljcyBkcml2ZXIuCisKK0lmIHlvdSBkZWZyYWdtZW50IGFsbG9jYXRpb25zIGJvdW5kIHRvIGltYWdlcywgbmV3IGltYWdlcyB0byBiZSBib3VuZCB0byBuZXcKK21lbW9yeSByZWdpb24gYWZ0ZXIgZGVmcmFnbWVudGF0aW9uIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggYFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRGAKK2FuZCB0aGVuIHRyYW5zaXRpb25lZCB0byB0aGVpciBvcmlnaW5hbCBsYXlvdXQgZnJvbSBiZWZvcmUgZGVmcmFnbWVudGF0aW9uIHVzaW5nCithbiBpbWFnZSBtZW1vcnkgYmFycmllci4KKworUGxlYXNlIGRvbid0IGV4cGVjdCBtZW1vcnkgdG8gYmUgZnVsbHkgY29tcGFjdGVkIGFmdGVyIGRlZnJhZ21lbnRhdGlvbi4KK0FsZ29yaXRobXMgaW5zaWRlIGFyZSBiYXNlZCBvbiBzb21lIGhldXJpc3RpY3MgdGhhdCB0cnkgdG8gbWF4aW1pemUgbnVtYmVyIG9mIFZ1bGthbgorbWVtb3J5IGJsb2NrcyB0byBtYWtlIHRvdGFsbHkgZW1wdHkgdG8gcmVsZWFzZSB0aGVtLCBhcyB3ZWxsIGFzIHRvIG1heGltaW16ZSBjb250aW51b3VzCitlbXB0eSBzcGFjZSBpbnNpZGUgcmVtYWluaW5nIGJsb2Nrcywgd2hpbGUgbWluaW1pemluZyB0aGUgbnVtYmVyIGFuZCBzaXplIG9mIGFsbG9jYXRpb25zIHRoYXQKK25lZWQgdG8gYmUgbW92ZWQuIFNvbWUgZnJhZ21lbnRhdGlvbiBtYXkgc3RpbGwgcmVtYWluIC0gdGhpcyBpcyBub3JtYWwuCisKK1xzZWN0aW9uIGRlZnJhZ21lbnRhdGlvbl9jdXN0b21fYWxnb3JpdGhtIFdyaXRpbmcgY3VzdG9tIGRlZnJhZ21lbnRhdGlvbiBhbGdvcml0aG0KKworSWYgeW91IHdhbnQgdG8gaW1wbGVtZW50IHlvdXIgb3duLCBjdXN0b20gZGVmcmFnbWVudGF0aW9uIGFsZ29yaXRobSwKK3RoZXJlIGlzIGluZnJhc3RydWN0dXJlIHByZXBhcmVkIGZvciB0aGF0LAorYnV0IGl0IGlzIG5vdCBleHBvc2VkIHRocm91Z2ggdGhlIGxpYnJhcnkgQVBJIC0geW91IG5lZWQgdG8gaGFjayBpdHMgc291cmNlIGNvZGUuCitIZXJlIGFyZSBzdGVwcyBuZWVkZWQgdG8gZG8gdGhpczoKKworLSMgTWFpbiB0aGluZyB5b3UgbmVlZCB0byBkbyBpcyB0byBkZWZpbmUgeW91ciBvd24gY2xhc3MgZGVyaXZlZCBmcm9tIGJhc2UgYWJzdHJhY3QKKyAgIGNsYXNzIGBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1gIGFuZCBpbXBsZW1lbnQgeW91ciB2ZXJzaW9uIG9mIGl0cyBwdXJlIHZpcnR1YWwgbWV0aG9kcy4KKyAgIFNlZSBkZWZpbml0aW9uIGFuZCBjb21tZW50cyBvZiB0aGlzIGNsYXNzIGZvciBkZXRhaWxzLgorLSMgWW91ciBjb2RlIG5lZWRzIHRvIGludGVyYWN0IHdpdGggZGV2aWNlIG1lbW9yeSBibG9jayBtZXRhZGF0YS4KKyAgIElmIHlvdSBuZWVkIG1vcmUgYWNjZXNzIHRvIGl0cyBkYXRhIHRoYW4gaXQncyBwcm92aWRlZCBieSBpdHMgcHVibGljIGludGVyZmFjZSwKKyAgIGRlY2xhcmUgeW91ciBuZXcgY2xhc3MgYXMgYSBmcmllbmQgY2xhc3MgZS5nLiBpbiBjbGFzcyBgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljYC4KKy0jIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGZsYWcgdGhhdCB3b3VsZCBlbmFibGUgeW91ciBhbGdvcml0aG0gb3IgcGFzcyBzb21lIGFkZGl0aW9uYWwKKyAgIGZsYWdzIHRvIGNvbmZpZ3VyZSBpdCwgYWRkIHRoZW0gdG8gYFZtYURlZnJhZ21lbnRhdGlvbkZsYWdCaXRzYCBhbmQgdXNlIHRoZW0gaW4KKyAgIFZtYURlZnJhZ21lbnRhdGlvbkluZm8yOjpmbGFncy4KKy0jIE1vZGlmeSBmdW5jdGlvbiBgVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0OjpCZWdpbmAgdG8gY3JlYXRlIG9iamVjdAorICAgb2YgeW91ciBuZXcgY2xhc3Mgd2hlbmV2ZXIgbmVlZGVkLgorCisKK1xwYWdlIGxvc3RfYWxsb2NhdGlvbnMgTG9zdCBhbGxvY2F0aW9ucworCitJZiB5b3VyIGdhbWUgb3ZlcnN1YnNjcmliZXMgdmlkZW8gbWVtb3J5LCBpZiBtYXkgd29yayBPSyBpbiBwcmV2aW91cy1nZW5lcmF0aW9uCitncmFwaGljcyBBUElzIChEaXJlY3RYIDksIDEwLCAxMSwgT3BlbkdMKSBiZWNhdXNlIHJlc291cmNlcyBhcmUgYXV0b21hdGljYWxseQorcGFnZWQgdG8gc3lzdGVtIFJBTS4gSW4gVnVsa2FuIHlvdSBjYW4ndCBkbyBpdCBiZWNhdXNlIHdoZW4geW91IHJ1biBvdXQgb2YKK21lbW9yeSwgYW4gYWxsb2NhdGlvbiBqdXN0IGZhaWxzLiBJZiB5b3UgaGF2ZSBtb3JlIGRhdGEgKGUuZy4gdGV4dHVyZXMpIHRoYXQgY2FuCitmaXQgaW50byBWUkFNIGFuZCB5b3UgZG9uJ3QgbmVlZCBpdCBhbGwgYXQgb25jZSwgeW91IG1heSB3YW50IHRvIHVwbG9hZCB0aGVtIHRvCitHUFUgb24gZGVtYW5kIGFuZCAicHVzaCBvdXQiIG9uZXMgdGhhdCBhcmUgbm90IHVzZWQgZm9yIGEgbG9uZyB0aW1lIHRvIG1ha2Ugcm9vbQorZm9yIHRoZSBuZXcgb25lcywgZWZmZWN0aXZlbHkgdXNpbmcgVlJBTSAob3IgYSBjYXJ0YWluIG1lbW9yeSBwb29sKSBhcyBhIGZvcm0gb2YKK2NhY2hlLiBWdWxrYW4gTWVtb3J5IEFsbG9jYXRvciBjYW4gaGVscCB5b3Ugd2l0aCB0aGF0IGJ5IHN1cHBvcnRpbmcgYSBjb25jZXB0IG9mCisibG9zdCBhbGxvY2F0aW9ucyIuCisKK1RvIGNyZWF0ZSBhbiBhbGxvY2F0aW9uIHRoYXQgY2FuIGJlY29tZSBsb3N0LCBpbmNsdWRlICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX0JFQ09NRV9MT1NUX0JJVAorZmxhZyBpbiBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbzo6ZmxhZ3MuIEJlZm9yZSB1c2luZyBhIGJ1ZmZlciBvciBpbWFnZSBib3VuZCB0bworc3VjaCBhbGxvY2F0aW9uIGluIGV2ZXJ5IG5ldyBmcmFtZSwgeW91IG5lZWQgdG8gcXVlcnkgaXQgaWYgaXQncyBub3QgbG9zdC4KK1RvIGNoZWNrIGl0LCBjYWxsIHZtYVRvdWNoQWxsb2NhdGlvbigpLgorSWYgdGhlIGFsbG9jYXRpb24gaXMgbG9zdCwgeW91IHNob3VsZCBub3QgdXNlIGl0IG9yIGJ1ZmZlci9pbWFnZSBib3VuZCB0byBpdC4KK1lvdSBtdXN0bid0IGZvcmdldCB0byBkZXN0cm95IHRoaXMgYWxsb2NhdGlvbiBhbmQgdGhpcyBidWZmZXIvaW1hZ2UuCit2bWFHZXRBbGxvY2F0aW9uSW5mbygpIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGNoZWNraW5nIHN0YXR1cyBvZiB0aGUgYWxsb2NhdGlvbi4KK0FsbG9jYXRpb24gaXMgbG9zdCB3aGVuIHJldHVybmVkIFZtYUFsbG9jYXRpb25JbmZvOjpkZXZpY2VNZW1vcnkgPT0gYFZLX05VTExfSEFORExFYC4KKworVG8gY3JlYXRlIGFuIGFsbG9jYXRpb24gdGhhdCBjYW4gbWFrZSBzb21lIG90aGVyIGFsbG9jYXRpb25zIGxvc3QgdG8gbWFrZSByb29tCitmb3IgaXQsIHVzZSAjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0NBTl9NQUtFX09USEVSX0xPU1RfQklUIGZsYWcuIFlvdSB3aWxsCit1c3VhbGx5IHVzZSBib3RoIGZsYWdzICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX01BS0VfT1RIRVJfTE9TVF9CSVQgYW5kCisjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0NBTl9CRUNPTUVfTE9TVF9CSVQgYXQgdGhlIHNhbWUgdGltZS4KKworV2FybmluZyEgQ3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIHF1aXRlIG5haXZlLCBicnV0ZSBmb3JjZSBhbGdvcml0aG0sCit3aGljaCBjYW4gbWFrZSBhbGxvY2F0aW9uIGNhbGxzIHRoYXQgdXNlICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX01BS0VfT1RIRVJfTE9TVF9CSVQKK2ZsYWcgcXVpdGUgc2xvdy4gQSBuZXcsIG1vcmUgb3B0aW1hbCBhbGdvcml0aG0gYW5kIGRhdGEgc3RydWN0dXJlIHRvIHNwZWVkIHRoaXMKK3VwIGlzIHBsYW5uZWQgZm9yIHRoZSBmdXR1cmUuCisKKzxiPlE6IFdoZW4gaW50ZXJsZWF2aW5nIGNyZWF0aW9uIG9mIG5ldyBhbGxvY2F0aW9ucyB3aXRoIHVzYWdlIG9mIGV4aXN0aW5nIG9uZXMsCitob3cgZG8geW91IG1ha2Ugc3VyZSB0aGF0IGFuIGFsbG9jYXRpb24gd29uJ3QgYmVjb21lIGxvc3Qgd2hpbGUgaXQncyB1c2VkIGluIHRoZQorY3VycmVudCBmcmFtZT88L2I+CisKK0l0IGlzIGVuc3VyZWQgYmVjYXVzZSB2bWFUb3VjaEFsbG9jYXRpb24oKSAvIHZtYUdldEFsbG9jYXRpb25JbmZvKCkgbm90IG9ubHkgcmV0dXJucyBhbGxvY2F0aW9uCitzdGF0dXMvcGFyYW1ldGVycyBhbmQgY2hlY2tzIHdoZXRoZXIgaXQncyBub3QgbG9zdCwgYnV0IHdoZW4gaXQncyBub3QsIGl0IGFsc28KK2F0b21pY2FsbHkgbWFya3MgaXQgYXMgdXNlZCBpbiB0aGUgY3VycmVudCBmcmFtZSwgd2hpY2ggbWFrZXMgaXQgaW1wb3NzaWJsZSB0bworYmVjb21lIGxvc3QgaW4gdGhhdCBmcmFtZS4gSXQgdXNlcyBsb2NrbGVzcyBhbGdvcml0aG0sIHNvIGl0IHdvcmtzIGZhc3QgYW5kCitkb2Vzbid0IGludm9sdmUgbG9ja2luZyBhbnkgaW50ZXJuYWwgbXV0ZXguCisKKzxiPlE6IFdoYXQgaWYgbXkgYWxsb2NhdGlvbiBtYXkgc3RpbGwgYmUgaW4gdXNlIGJ5IHRoZSBHUFUgd2hlbiBpdCdzIHJlbmRlcmluZyBhCitwcmV2aW91cyBmcmFtZSB3aGlsZSBJIGFscmVhZHkgc3VibWl0IG5ldyBmcmFtZSBvbiB0aGUgQ1BVPzwvYj4KKworWW91IGNhbiBtYWtlIHN1cmUgdGhhdCBhbGxvY2F0aW9ucyAidG91Y2hlZCIgYnkgdm1hVG91Y2hBbGxvY2F0aW9uKCkgLyB2bWFHZXRBbGxvY2F0aW9uSW5mbygpIHdpbGwgbm90CitiZWNvbWUgbG9zdCBmb3IgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBmcmFtZXMgYmFjayBmcm9tIHRoZSBjdXJyZW50IG9uZSBieQorc3BlY2lmeWluZyB0aGlzIG51bWJlciBhcyBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvOjpmcmFtZUluVXNlQ291bnQgKGZvciBkZWZhdWx0CittZW1vcnkgcG9vbCkgYW5kIFZtYVBvb2xDcmVhdGVJbmZvOjpmcmFtZUluVXNlQ291bnQgKGZvciBjdXN0b20gcG9vbCkuCisKKzxiPlE6IEhvdyBkbyB5b3UgaW5mb3JtIHRoZSBsaWJyYXJ5IHdoZW4gbmV3IGZyYW1lIHN0YXJ0cz88L2I+CisKK1lvdSBuZWVkIHRvIGNhbGwgZnVuY3Rpb24gdm1hU2V0Q3VycmVudEZyYW1lSW5kZXgoKS4KKworRXhhbXBsZSBjb2RlOgorCitcY29kZQorc3RydWN0IE15QnVmZmVyCit7CisgICAgVmtCdWZmZXIgbV9CdWYgPSBudWxscHRyOworICAgIFZtYUFsbG9jYXRpb24gbV9BbGxvYyA9IG51bGxwdHI7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIHJlYWxseSBuZWVkZWQgaW4gdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgdm9pZCBFbnN1cmVCdWZmZXIoKTsKK307CisKK3ZvaWQgTXlCdWZmZXI6OkVuc3VyZUJ1ZmZlcigpCit7CisgICAgLy8gQnVmZmVyIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgaWYobV9CdWYgIT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiBpdHMgYWxsb2NhdGlvbiBpcyBub3QgbG9zdCArIG1hcmsgaXQgYXMgdXNlZCBpbiBjdXJyZW50IGZyYW1lLgorICAgICAgICBpZih2bWFUb3VjaEFsbG9jYXRpb24oYWxsb2NhdG9yLCBtX0FsbG9jKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSXQncyBhbGwgT0sgLSBzYWZlIHRvIHVzZSBtX0J1Zi4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEJ1ZmZlciBub3QgeWV0IGV4aXN0cyBvciBsb3N0IC0gZGVzdHJveSBhbmQgcmVjcmVhdGUgaXQuCisKKyAgICB2bWFEZXN0cm95QnVmZmVyKGFsbG9jYXRvciwgbV9CdWYsIG1fQWxsb2MpOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZkNyZWF0ZUluZm8gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTyB9OworICAgIGJ1ZkNyZWF0ZUluZm8uc2l6ZSA9IDEwMjQ7CisgICAgYnVmQ3JlYXRlSW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQgfCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKworICAgIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFsbG9jQ3JlYXRlSW5mbyA9IHt9OworICAgIGFsbG9jQ3JlYXRlSW5mby51c2FnZSA9IFZNQV9NRU1PUllfVVNBR0VfR1BVX09OTFk7CisgICAgYWxsb2NDcmVhdGVJbmZvLmZsYWdzID0gVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0NBTl9CRUNPTUVfTE9TVF9CSVQgfAorICAgICAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX01BS0VfT1RIRVJfTE9TVF9CSVQ7CisKKyAgICB2bWFDcmVhdGVCdWZmZXIoYWxsb2NhdG9yLCAmYnVmQ3JlYXRlSW5mbywgJmFsbG9jQ3JlYXRlSW5mbywgJm1fQnVmLCAmbV9BbGxvYywgbnVsbHB0cik7Cit9CitcZW5kY29kZQorCitXaGVuIHVzaW5nIGxvc3QgYWxsb2NhdGlvbnMsIHlvdSBtYXkgc2VlIHNvbWUgVnVsa2FuIHZhbGlkYXRpb24gbGF5ZXIgd2FybmluZ3MKK2Fib3V0IG92ZXJsYXBwaW5nIHJlZ2lvbnMgb2YgbWVtb3J5IGJvdW5kIHRvIGRpZmZlcmVudCBraW5kcyBvZiBidWZmZXJzIGFuZAoraW1hZ2VzLiBUaGlzIGlzIHN0aWxsIHZhbGlkIGFzIGxvbmcgYXMgeW91IGltcGxlbWVudCBwcm9wZXIgaGFuZGxpbmcgb2YgbG9zdAorYWxsb2NhdGlvbnMgKGxpa2UgaW4gdGhlIGV4YW1wbGUgYWJvdmUpIGFuZCBkb24ndCB1c2UgdGhlbS4KKworWW91IGNhbiBjcmVhdGUgYW4gYWxsb2NhdGlvbiB0aGF0IGlzIGFscmVhZHkgaW4gbG9zdCBzdGF0ZSBmcm9tIHRoZSBiZWdpbm5pbmcgdXNpbmcgZnVuY3Rpb24KK3ZtYUNyZWF0ZUxvc3RBbGxvY2F0aW9uKCkuIEl0IG1heSBiZSB1c2VmdWwgaWYgeW91IG5lZWQgYSAiZHVtbXkiIGFsbG9jYXRpb24gdGhhdCBpcyBub3QgbnVsbC4KKworWW91IGNhbiBjYWxsIGZ1bmN0aW9uIHZtYU1ha2VQb29sQWxsb2NhdGlvbnNMb3N0KCkgdG8gc2V0IGFsbCBlbGlnaWJsZSBhbGxvY2F0aW9ucworaW4gYSBzcGVjaWZpZWQgY3VzdG9tIHBvb2wgdG8gbG9zdCBzdGF0ZS4KK0FsbG9jYXRpb25zIHRoYXQgaGF2ZSBiZWVuICJ0b3VjaGVkIiBpbiBjdXJyZW50IGZyYW1lIG9yIFZtYVBvb2xDcmVhdGVJbmZvOjpmcmFtZUluVXNlQ291bnQgZnJhbWVzIGJhY2sKK2Nhbm5vdCBiZWNvbWUgbG9zdC4KKworPGI+UTogQ2FuIEkgdG91Y2ggYWxsb2NhdGlvbiB0aGF0IGNhbm5vdCBiZWNvbWUgbG9zdD88L2I+CisKK1llcywgYWx0aG91Z2ggaXQgaGFzIG5vIHZpc2libGUgZWZmZWN0LgorQ2FsbHMgdG8gdm1hR2V0QWxsb2NhdGlvbkluZm8oKSBhbmQgdm1hVG91Y2hBbGxvY2F0aW9uKCkgdXBkYXRlIGxhc3QgdXNlIGZyYW1lIGluZGV4CithbHNvIGZvciBhbGxvY2F0aW9ucyB0aGF0IGNhbm5vdCBiZWNvbWUgbG9zdCwgYnV0IHRoZSBvbmx5IHdheSB0byBvYnNlcnZlIGl0IGlzIHRvIGR1bXAKK2ludGVybmFsIGFsbG9jYXRvciBzdGF0ZSB1c2luZyB2bWFCdWlsZFN0YXRzU3RyaW5nKCkuCitZb3UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB0byBleHBsaWNpdGx5IG1hcmsgYWxsb2NhdGlvbnMgdGhhdCB5b3UgdXNlCitpbiBjdXJyZW50IGZyYW1lIGFuZCB0aGVuIGFuYWx5emUgSlNPTiBkdW1wIHRvIHNlZSBmb3IgaG93IGxvbmcgZWFjaCBhbGxvY2F0aW9uIHN0YXlzIHVudXNlZC4KKworCitccGFnZSBzdGF0aXN0aWNzIFN0YXRpc3RpY3MKKworVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBpdHMgaW50ZXJuYWwgc3RhdGUsCitlc3BlY2lhbGx5IHRoZSBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCBmcm9tIFZ1bGthbi4KK1BsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGVzZSBmdW5jdGlvbnMgbmVlZCB0byB0cmF2ZXJzZSBhbGwgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCit0byBnYXRoZXIgdGhlc2UgaW5mb3JtYXRpb24sIHNvIHRoZXkgbWF5IGJlIHF1aXRlIHRpbWUtY29uc3VtaW5nLgorRG9uJ3QgY2FsbCB0aGVtIHRvbyBvZnRlbi4KKworXHNlY3Rpb24gc3RhdGlzdGljc19udW1lcmljX3N0YXRpc3RpY3MgTnVtZXJpYyBzdGF0aXN0aWNzCisKK1lvdSBjYW4gcXVlcnkgZm9yIG92ZXJhbGwgc3RhdGlzdGljcyBvZiB0aGUgYWxsb2NhdG9yIHVzaW5nIGZ1bmN0aW9uIHZtYUNhbGN1bGF0ZVN0YXRzKCkuCitJbmZvcm1hdGlvbiBhcmUgcmV0dXJuZWQgdXNpbmcgc3RydWN0dXJlICNWbWFTdGF0cy4KK0l0IGNvbnRhaW5zICNWbWFTdGF0SW5mbyAtIG51bWJlciBvZiBhbGxvY2F0ZWQgYmxvY2tzLCBudW1iZXIgb2YgYWxsb2NhdGlvbnMKKyhvY2N1cGllZCByYW5nZXMgaW4gdGhlc2UgYmxvY2tzKSwgbnVtYmVyIG9mIHVudXNlZCAoZnJlZSkgcmFuZ2VzIGluIHRoZXNlIGJsb2NrcywKK251bWJlciBvZiBieXRlcyB1c2VkIGFuZCB1bnVzZWQgKGJ1dCBzdGlsbCBhbGxvY2F0ZWQgZnJvbSBWdWxrYW4pIGFuZCBvdGhlciBpbmZvcm1hdGlvbi4KK1RoZXkgYXJlIHN1bW1lZCBhY3Jvc3MgbWVtb3J5IGhlYXBzLCBtZW1vcnkgdHlwZXMgYW5kIHRvdGFsIGZvciB3aG9sZSBhbGxvY2F0b3IuCisKK1lvdSBjYW4gcXVlcnkgZm9yIHN0YXRpc3RpY3Mgb2YgYSBjdXN0b20gcG9vbCB1c2luZyBmdW5jdGlvbiB2bWFHZXRQb29sU3RhdHMoKS4KK0luZm9ybWF0aW9uIGFyZSByZXR1cm5lZCB1c2luZyBzdHJ1Y3R1cmUgI1ZtYVBvb2xTdGF0cy4KKworWW91IGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgc3BlY2lmaWMgYWxsb2NhdGlvbiB1c2luZyBmdW5jdGlvbiB2bWFHZXRBbGxvY2F0aW9uSW5mbygpLgorSXQgZmlsbCBzdHJ1Y3R1cmUgI1ZtYUFsbG9jYXRpb25JbmZvLgorCitcc2VjdGlvbiBzdGF0aXN0aWNzX2pzb25fZHVtcCBKU09OIGR1bXAKKworWW91IGNhbiBkdW1wIGludGVybmFsIHN0YXRlIG9mIHRoZSBhbGxvY2F0b3IgdG8gYSBzdHJpbmcgaW4gSlNPTiBmb3JtYXQgdXNpbmcgZnVuY3Rpb24gdm1hQnVpbGRTdGF0c1N0cmluZygpLgorVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgSlNPTi4KK0l0IHVzZXMgQU5TSSBlbmNvZGluZy4KK0FueSBzdHJpbmdzIHByb3ZpZGVkIGJ5IHVzZXIgKHNlZSBbQWxsb2NhdGlvbiBuYW1lc10oQHJlZiBhbGxvY2F0aW9uX25hbWVzKSkKK2FyZSBjb3BpZWQgYXMtaXMgYW5kIHByb3Blcmx5IGVzY2FwZWQgZm9yIEpTT04sIHNvIGlmIHRoZXkgdXNlIFVURi04LCBJU08tODg1OS0yIG9yIGFueSBvdGhlciBlbmNvZGluZywKK3RoaXMgSlNPTiBzdHJpbmcgY2FuIGJlIHRyZWF0ZWQgYXMgdXNpbmcgdGhpcyBlbmNvZGluZy4KK0l0IG11c3QgYmUgZnJlZWQgdXNpbmcgZnVuY3Rpb24gdm1hRnJlZVN0YXRzU3RyaW5nKCkuCisKK1RoZSBmb3JtYXQgb2YgdGhpcyBKU09OIHN0cmluZyBpcyBub3QgcGFydCBvZiBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5LAorYnV0IGl0IHdpbGwgbm90IGNoYW5nZSBpbiBiYWNrd2FyZC1pbmNvbXBhdGlibGUgd2F5IHdpdGhvdXQgaW5jcmVhc2luZyBsaWJyYXJ5IG1ham9yIHZlcnNpb24gbnVtYmVyCithbmQgYXBwcm9wcmlhdGUgbWVudGlvbiBpbiBjaGFuZ2Vsb2cuCisKK1RoZSBKU09OIHN0cmluZyBjb250YWlucyBhbGwgdGhlIGRhdGEgdGhhdCBjYW4gYmUgb2J0YWluZWQgdXNpbmcgdm1hQ2FsY3VsYXRlU3RhdHMoKS4KK0l0IGNhbiBhbHNvIGNvbnRhaW4gZGV0YWlsZWQgbWFwIG9mIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2tzIGFuZCB0aGVpciByZWdpb25zIC0KK2ZyZWUgYW5kIG9jY3VwaWVkIGJ5IGFsbG9jYXRpb25zLgorVGhpcyBhbGxvd3MgZS5nLiB0byB2aXN1YWxpemUgdGhlIG1lbW9yeSBvciBhc3Nlc3MgZnJhZ21lbnRhdGlvbi4KKworCitccGFnZSBhbGxvY2F0aW9uX2Fubm90YXRpb24gQWxsb2NhdGlvbiBuYW1lcyBhbmQgdXNlciBkYXRhCisKK1xzZWN0aW9uIGFsbG9jYXRpb25fdXNlcl9kYXRhIEFsbG9jYXRpb24gdXNlciBkYXRhCisKK1lvdSBjYW4gYW5ub3RhdGUgYWxsb2NhdGlvbnMgd2l0aCB5b3VyIG93biBpbmZvcm1hdGlvbiwgZS5nLiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorVG8gZG8gdGhhdCwgZmlsbCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbzo6cFVzZXJEYXRhIGZpZWxkIHdoZW4gY3JlYXRpbmcKK2FuIGFsbG9jYXRpb24uIEl0J3MgYW4gb3BhcXVlIGB2b2lkKmAgcG9pbnRlci4gWW91IGNhbiB1c2UgaXQgZS5nLiBhcyBhIHBvaW50ZXIsCitzb21lIGhhbmRsZSwgaW5kZXgsIGtleSwgb3JkaW5hbCBudW1iZXIgb3IgYW55IG90aGVyIHZhbHVlIHRoYXQgd291bGQgYXNzb2NpYXRlCit0aGUgYWxsb2NhdGlvbiB3aXRoIHlvdXIgY3VzdG9tIG1ldGFkYXRhLgorCitcY29kZQorVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlckluZm8gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTyB9OworLy8gRmlsbCBidWZmZXJJbmZvLi4uCisKK015QnVmZmVyTWV0YWRhdGEqIHBNZXRhZGF0YSA9IENyZWF0ZUJ1ZmZlck1ldGFkYXRhKCk7CisKK1ZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFsbG9jQ3JlYXRlSW5mbyA9IHt9OworYWxsb2NDcmVhdGVJbmZvLnVzYWdlID0gVk1BX01FTU9SWV9VU0FHRV9HUFVfT05MWTsKK2FsbG9jQ3JlYXRlSW5mby5wVXNlckRhdGEgPSBwTWV0YWRhdGE7CisKK1ZrQnVmZmVyIGJ1ZmZlcjsKK1ZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbjsKK3ZtYUNyZWF0ZUJ1ZmZlcihhbGxvY2F0b3IsICZidWZmZXJJbmZvLCAmYWxsb2NDcmVhdGVJbmZvLCAmYnVmZmVyLCAmYWxsb2NhdGlvbiwgbnVsbHB0cik7CitcZW5kY29kZQorCitUaGUgcG9pbnRlciBtYXkgYmUgbGF0ZXIgcmV0cmlldmVkIGFzIFZtYUFsbG9jYXRpb25JbmZvOjpwVXNlckRhdGE6CisKK1xjb2RlCitWbWFBbGxvY2F0aW9uSW5mbyBhbGxvY0luZm87Cit2bWFHZXRBbGxvY2F0aW9uSW5mbyhhbGxvY2F0b3IsIGFsbG9jYXRpb24sICZhbGxvY0luZm8pOworTXlCdWZmZXJNZXRhZGF0YSogcE1ldGFkYXRhID0gKE15QnVmZmVyTWV0YWRhdGEqKWFsbG9jSW5mby5wVXNlckRhdGE7CitcZW5kY29kZQorCitJdCBjYW4gYWxzbyBiZSBjaGFuZ2VkIHVzaW5nIGZ1bmN0aW9uIHZtYVNldEFsbG9jYXRpb25Vc2VyRGF0YSgpLgorCitWYWx1ZXMgb2YgKG5vbi16ZXJvKSBhbGxvY2F0aW9ucycgYHBVc2VyRGF0YWAgYXJlIHByaW50ZWQgaW4gSlNPTiByZXBvcnQgY3JlYXRlZCBieQordm1hQnVpbGRTdGF0c1N0cmluZygpLCBpbiBoZXhhZGVjaW1hbCBmb3JtLgorCitcc2VjdGlvbiBhbGxvY2F0aW9uX25hbWVzIEFsbG9jYXRpb24gbmFtZXMKKworVGhlcmUgaXMgYWx0ZXJuYXRpdmUgbW9kZSBhdmFpbGFibGUgd2hlcmUgYHBVc2VyRGF0YWAgcG9pbnRlciBpcyB1c2VkIHRvIHBvaW50IHRvCithIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIGdpdmluZyBhIG5hbWUgdG8gdGhlIGFsbG9jYXRpb24uIFRvIHVzZSB0aGlzIG1vZGUsCitzZXQgI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUIGZsYWcgaW4gVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm86OmZsYWdzLgorVGhlbiBgcFVzZXJEYXRhYCBwYXNzZWQgYXMgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm86OnBVc2VyRGF0YSBvciBhcmd1bWVudCB0bwordm1hU2V0QWxsb2NhdGlvblVzZXJEYXRhKCkgbXVzdCBiZSBlaXRoZXIgbnVsbCBvciBwb2ludGVyIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KK1RoZSBsaWJyYXJ5IGNyZWF0ZXMgaW50ZXJuYWwgY29weSBvZiB0aGUgc3RyaW5nLCBzbyB0aGUgcG9pbnRlciB5b3UgcGFzcyBkb2Vzbid0IG5lZWQKK3RvIGJlIHZhbGlkIGZvciB3aG9sZSBsaWZldGltZSBvZiB0aGUgYWxsb2NhdGlvbi4gWW91IGNhbiBmcmVlIGl0IGFmdGVyIHRoZSBjYWxsLgorCitcY29kZQorVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VJbmZvID0geyBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTyB9OworLy8gRmlsbCBpbWFnZUluZm8uLi4KKworc3RkOjpzdHJpbmcgaW1hZ2VOYW1lID0gIlRleHR1cmU6ICI7CitpbWFnZU5hbWUgKz0gZmlsZU5hbWU7CisKK1ZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFsbG9jQ3JlYXRlSW5mbyA9IHt9OworYWxsb2NDcmVhdGVJbmZvLnVzYWdlID0gVk1BX01FTU9SWV9VU0FHRV9HUFVfT05MWTsKK2FsbG9jQ3JlYXRlSW5mby5mbGFncyA9IFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUOworYWxsb2NDcmVhdGVJbmZvLnBVc2VyRGF0YSA9IGltYWdlTmFtZS5jX3N0cigpOworCitWa0ltYWdlIGltYWdlOworVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uOwordm1hQ3JlYXRlSW1hZ2UoYWxsb2NhdG9yLCAmaW1hZ2VJbmZvLCAmYWxsb2NDcmVhdGVJbmZvLCAmaW1hZ2UsICZhbGxvY2F0aW9uLCBudWxscHRyKTsKK1xlbmRjb2RlCisKK1RoZSB2YWx1ZSBvZiBgcFVzZXJEYXRhYCBwb2ludGVyIG9mIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGlmZmVyZW50IHRoYW4gdGhlIG9uZQoreW91IHBhc3NlZCB3aGVuIHNldHRpbmcgYWxsb2NhdGlvbidzIG5hbWUgLSBwb2ludGluZyB0byBhIGJ1ZmZlciBtYW5hZ2VkCitpbnRlcm5hbGx5IHRoYXQgaG9sZHMgY29weSBvZiB0aGUgc3RyaW5nLgorCitcY29kZQorVm1hQWxsb2NhdGlvbkluZm8gYWxsb2NJbmZvOwordm1hR2V0QWxsb2NhdGlvbkluZm8oYWxsb2NhdG9yLCBhbGxvY2F0aW9uLCAmYWxsb2NJbmZvKTsKK2NvbnN0IGNoYXIqIGltYWdlTmFtZSA9IChjb25zdCBjaGFyKilhbGxvY0luZm8ucFVzZXJEYXRhOworcHJpbnRmKCJJbWFnZSBuYW1lOiAlc1xuIiwgaW1hZ2VOYW1lKTsKK1xlbmRjb2RlCisKK1RoYXQgc3RyaW5nIGlzIGFsc28gcHJpbnRlZCBpbiBKU09OIHJlcG9ydCBjcmVhdGVkIGJ5IHZtYUJ1aWxkU3RhdHNTdHJpbmcoKS4KKworCitccGFnZSBkZWJ1Z2dpbmdfbWVtb3J5X3VzYWdlIERlYnVnZ2luZyBpbmNvcnJlY3QgbWVtb3J5IHVzYWdlCisKK0lmIHlvdSBzdXNwZWN0IGEgYnVnIHdpdGggbWVtb3J5IHVzYWdlLCBsaWtlIHVzYWdlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IG9yCittZW1vcnkgYmVpbmcgb3ZlcndyaXR0ZW4gb3V0IG9mIGJvdW5kcyBvZiBhbiBhbGxvY2F0aW9uLAoreW91IGNhbiB1c2UgZGVidWcgZmVhdHVyZXMgb2YgdGhpcyBsaWJyYXJ5IHRvIHZlcmlmeSB0aGlzLgorCitcc2VjdGlvbiBkZWJ1Z2dpbmdfbWVtb3J5X3VzYWdlX2luaXRpYWxpemF0aW9uIE1lbW9yeSBpbml0aWFsaXphdGlvbgorCitJZiB5b3UgZXhwZXJpZW5jZSBhIGJ1ZyB3aXRoIGluY29ycmVjdCBhbmQgbm9uZGV0ZXJtaW5pc3RpYyBkYXRhIGluIHlvdXIgcHJvZ3JhbSBhbmQgeW91IHN1c3BlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gYmUgdXNlZCwKK3lvdSBjYW4gZW5hYmxlIGF1dG9tYXRpYyBtZW1vcnkgaW5pdGlhbGl6YXRpb24gdG8gdmVyaWZ5IHRoaXMuCitUbyBkbyBpdCwgZGVmaW5lIG1hY3JvIGBWTUFfREVCVUdfSU5JVElBTElaRV9BTExPQ0FUSU9OU2AgdG8gMS4KKworXGNvZGUKKyNkZWZpbmUgVk1BX0RFQlVHX0lOSVRJQUxJWkVfQUxMT0NBVElPTlMgMQorI2luY2x1ZGUgInZrX21lbV9hbGxvYy5oIgorXGVuZGNvZGUKKworSXQgbWFrZXMgbWVtb3J5IG9mIGFsbCBuZXcgYWxsb2NhdGlvbnMgaW5pdGlhbGl6ZWQgdG8gYml0IHBhdHRlcm4gYDB4RENEQ0RDRENgLgorQmVmb3JlIGFuIGFsbG9jYXRpb24gaXMgZGVzdHJveWVkLCBpdHMgbWVtb3J5IGlzIGZpbGxlZCB3aXRoIGJpdCBwYXR0ZXJuIGAweEVGRUZFRkVGYC4KK01lbW9yeSBpcyBhdXRvbWF0aWNhbGx5IG1hcHBlZCBhbmQgdW5tYXBwZWQgaWYgbmVjZXNzYXJ5LgorCitJZiB5b3UgZmluZCB0aGVzZSB2YWx1ZXMgd2hpbGUgZGVidWdnaW5nIHlvdXIgcHJvZ3JhbSwgZ29vZCBjaGFuY2VzIGFyZSB0aGF0IHlvdSBpbmNvcnJlY3RseQorcmVhZCBWdWxrYW4gbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGJ1dCBub3QgaW5pdGlhbGl6ZWQsIG9yIGFscmVhZHkgZnJlZWQsIHJlc3BlY3RpdmVseS4KKworTWVtb3J5IGluaXRpYWxpemF0aW9uIHdvcmtzIG9ubHkgd2l0aCBtZW1vcnkgdHlwZXMgdGhhdCBhcmUgYEhPU1RfVklTSUJMRWAuCitJdCB3b3JrcyBhbHNvIHdpdGggZGVkaWNhdGVkIGFsbG9jYXRpb25zLgorSXQgZG9lc24ndCB3b3JrIHdpdGggYWxsb2NhdGlvbnMgY3JlYXRlZCB3aXRoICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX0JFQ09NRV9MT1NUX0JJVCBmbGFnLAorYXMgdGhleSBjYW5ub3QgYmUgbWFwcGVkLgorCitcc2VjdGlvbiBkZWJ1Z2dpbmdfbWVtb3J5X3VzYWdlX21hcmdpbnMgTWFyZ2lucworCitCeSBkZWZhdWx0LCBhbGxvY2F0aW9ucyBhcmUgbGFpZCBvdXQgaW4gbWVtb3J5IGJsb2NrcyBuZXh0IHRvIGVhY2ggb3RoZXIgaWYgcG9zc2libGUKKyhjb25zaWRlcmluZyByZXF1aXJlZCBhbGlnbm1lbnQsIGBidWZmZXJJbWFnZUdyYW51bGFyaXR5YCwgYW5kIGBub25Db2hlcmVudEF0b21TaXplYCkuCisKKyFbQWxsb2NhdGlvbnMgd2l0aG91dCBtYXJnaW5dKC4uL2dmeC9NYXJnaW5zXzEucG5nKQorCitEZWZpbmUgbWFjcm8gYFZNQV9ERUJVR19NQVJHSU5gIHRvIHNvbWUgbm9uLXplcm8gdmFsdWUgKGUuZy4gMTYpIHRvIGVuZm9yY2Ugc3BlY2lmaWVkCitudW1iZXIgb2YgYnl0ZXMgYXMgYSBtYXJnaW4gYmVmb3JlIGFuZCBhZnRlciBldmVyeSBhbGxvY2F0aW9uLgorCitcY29kZQorI2RlZmluZSBWTUFfREVCVUdfTUFSR0lOIDE2CisjaW5jbHVkZSAidmtfbWVtX2FsbG9jLmgiCitcZW5kY29kZQorCishW0FsbG9jYXRpb25zIHdpdGggbWFyZ2luXSguLi9nZngvTWFyZ2luc18yLnBuZykKKworSWYgeW91ciBidWcgZ29lcyBhd2F5IGFmdGVyIGVuYWJsaW5nIG1hcmdpbnMsIGl0IG1lYW5zIGl0IG1heSBiZSBjYXVzZWQgYnkgbWVtb3J5CitiZWluZyBvdmVyd3JpdHRlbiBvdXRzaWRlIG9mIGFsbG9jYXRpb24gYm91bmRhcmllcy4gSXQgaXMgbm90IDEwMCUgY2VydGFpbiB0aG91Z2guCitDaGFuZ2UgaW4gYXBwbGljYXRpb24gYmVoYXZpb3IgbWF5IGFsc28gYmUgY2F1c2VkIGJ5IGRpZmZlcmVudCBvcmRlciBhbmQgZGlzdHJpYnV0aW9uCitvZiBhbGxvY2F0aW9ucyBhY3Jvc3MgbWVtb3J5IGJsb2NrcyBhZnRlciBtYXJnaW5zIGFyZSBhcHBsaWVkLgorCitUaGUgbWFyZ2luIGlzIGFwcGxpZWQgYWxzbyBiZWZvcmUgZmlyc3QgYW5kIGFmdGVyIGxhc3QgYWxsb2NhdGlvbiBpbiBhIGJsb2NrLgorSXQgbWF5IG9jY3VyIG9ubHkgb25jZSBiZXR3ZWVuIHR3byBhZGphY2VudCBhbGxvY2F0aW9ucy4KKworTWFyZ2lucyB3b3JrIHdpdGggYWxsIHR5cGVzIG9mIG1lbW9yeS4KKworTWFyZ2luIGlzIGFwcGxpZWQgb25seSB0byBhbGxvY2F0aW9ucyBtYWRlIG91dCBvZiBtZW1vcnkgYmxvY2tzIGFuZCBub3QgdG8gZGVkaWNhdGVkCithbGxvY2F0aW9ucywgd2hpY2ggaGF2ZSB0aGVpciBvd24gbWVtb3J5IGJsb2NrIG9mIHNwZWNpZmljIHNpemUuCitJdCBpcyB0aHVzIG5vdCBhcHBsaWVkIHRvIGFsbG9jYXRpb25zIG1hZGUgdXNpbmcgI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9ERURJQ0FURURfTUVNT1JZX0JJVCBmbGFnCitvciB0aG9zZSBhdXRvbWF0aWNhbGx5IGRlY2lkZWQgdG8gcHV0IGludG8gZGVkaWNhdGVkIGFsbG9jYXRpb25zLCBlLmcuIGR1ZSB0byBpdHMKK2xhcmdlIHNpemUgb3IgcmVjb21tZW5kZWQgYnkgVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uIGV4dGVuc2lvbi4KK01hcmdpbnMgYXJlIGFsc28gbm90IGFjdGl2ZSBpbiBjdXN0b20gcG9vbHMgY3JlYXRlZCB3aXRoICNWTUFfUE9PTF9DUkVBVEVfQlVERFlfQUxHT1JJVEhNX0JJVCBmbGFnLgorCitNYXJnaW5zIGFwcGVhciBpbiBbSlNPTiBkdW1wXShAcmVmIHN0YXRpc3RpY3NfanNvbl9kdW1wKSBhcyBwYXJ0IG9mIGZyZWUgc3BhY2UuCisKK05vdGUgdGhhdCBlbmFibGluZyBtYXJnaW5zIGluY3JlYXNlcyBtZW1vcnkgdXNhZ2UgYW5kIGZyYWdtZW50YXRpb24uCisKK1xzZWN0aW9uIGRlYnVnZ2luZ19tZW1vcnlfdXNhZ2VfY29ycnVwdGlvbl9kZXRlY3Rpb24gQ29ycnVwdGlvbiBkZXRlY3Rpb24KKworWW91IGNhbiBhZGRpdGlvbmFsbHkgZGVmaW5lIG1hY3JvIGBWTUFfREVCVUdfREVURUNUX0NPUlJVUFRJT05gIHRvIDEgdG8gZW5hYmxlIHZhbGlkYXRpb24KK29mIGNvbnRlbnRzIG9mIHRoZSBtYXJnaW5zLgorCitcY29kZQorI2RlZmluZSBWTUFfREVCVUdfTUFSR0lOIDE2CisjZGVmaW5lIFZNQV9ERUJVR19ERVRFQ1RfQ09SUlVQVElPTiAxCisjaW5jbHVkZSAidmtfbWVtX2FsbG9jLmgiCitcZW5kY29kZQorCitXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBudW1iZXIgb2YgYnl0ZXMgc3BlY2lmaWVkIGFzIGBWTUFfREVCVUdfTUFSR0lOYAorKGl0IG11c3QgYmUgbXVsdGlwbHkgb2YgNCkgYmVmb3JlIGFuZCBhZnRlciBldmVyeSBhbGxvY2F0aW9uIGlzIGZpbGxlZCB3aXRoIGEgbWFnaWMgbnVtYmVyLgorVGhpcyBpZGVhIGlzIGFsc28ga25vdyBhcyAiY2FuYXJ5Ii4KK01lbW9yeSBpcyBhdXRvbWF0aWNhbGx5IG1hcHBlZCBhbmQgdW5tYXBwZWQgaWYgbmVjZXNzYXJ5LgorCitUaGlzIG51bWJlciBpcyB2YWxpZGF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBhbGxvY2F0aW9uIGlzIGRlc3Ryb3llZC4KK0lmIGl0J3Mgbm90IGVxdWFsIHRvIHRoZSBleHBlY3RlZCB2YWx1ZSwgYFZNQV9BU1NFUlQoKWAgaXMgZXhlY3V0ZWQuCitJdCBjbGVhcmx5IG1lYW5zIHRoYXQgZWl0aGVyIENQVSBvciBHUFUgb3ZlcndyaXR0ZW4gdGhlIG1lbW9yeSBvdXRzaWRlIG9mIGJvdW5kYXJpZXMgb2YgdGhlIGFsbG9jYXRpb24sCit3aGljaCBpbmRpY2F0ZXMgYSBzZXJpb3VzIGJ1Zy4KKworWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgcmVxdWVzdCBjaGVja2luZyBtYXJnaW5zIG9mIGFsbCBhbGxvY2F0aW9ucyBpbiBhbGwgbWVtb3J5IGJsb2NrcwordGhhdCBiZWxvbmcgdG8gc3BlY2lmaWVkIG1lbW9yeSB0eXBlcyBieSB1c2luZyBmdW5jdGlvbiB2bWFDaGVja0NvcnJ1cHRpb24oKSwKK29yIGluIG1lbW9yeSBibG9ja3MgdGhhdCBiZWxvbmcgdG8gc3BlY2lmaWVkIGN1c3RvbSBwb29sLCBieSB1c2luZyBmdW5jdGlvbiAKK3ZtYUNoZWNrUG9vbENvcnJ1cHRpb24oKS4KKworTWFyZ2luIHZhbGlkYXRpb24gKGNvcnJ1cHRpb24gZGV0ZWN0aW9uKSB3b3JrcyBvbmx5IGZvciBtZW1vcnkgdHlwZXMgdGhhdCBhcmUKK2BIT1NUX1ZJU0lCTEVgIGFuZCBgSE9TVF9DT0hFUkVOVGAuCisKKworXHBhZ2UgcmVjb3JkX2FuZF9yZXBsYXkgUmVjb3JkIGFuZCByZXBsYXkKKworXHNlY3Rpb24gcmVjb3JkX2FuZF9yZXBsYXlfaW50cm9kdWN0aW9uIEludHJvZHVjdGlvbgorCitXaGlsZSB1c2luZyB0aGUgbGlicmFyeSwgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gaXRzIGZ1bmN0aW9ucyB0b2dldGhlciB3aXRoIHRoZWlyCitwYXJhbWV0ZXJzIGNhbiBiZSByZWNvcmRlZCB0byBhIGZpbGUgYW5kIGxhdGVyIHJlcGxheWVkIHVzaW5nIHN0YW5kYWxvbmUgcGxheWVyCithcHBsaWNhdGlvbi4gSXQgY2FuIGJlIHVzZWZ1bCB0bzoKKworLSBUZXN0IGNvcnJlY3RuZXNzIC0gY2hlY2sgaWYgc2FtZSBzZXF1ZW5jZSBvZiBjYWxscyB3aWxsIG5vdCBjYXVzZSBjcmFzaCBvcgorICBmYWlsdXJlcyBvbiBhIHRhcmdldCBwbGF0Zm9ybS4KKy0gR2F0aGVyIHN0YXRpc3RpY3MgLSBzZWUgbnVtYmVyIG9mIGFsbG9jYXRpb25zLCBwZWFrIG1lbW9yeSB1c2FnZSwgbnVtYmVyIG9mCisgIGNhbGxzIGV0Yy4KKy0gQmVuY2htYXJrIHBlcmZvcm1hbmNlIC0gc2VlIGhvdyBtdWNoIHRpbWUgaXQgdGFrZXMgdG8gcmVwbGF5IHRoZSB3aG9sZQorICBzZXF1ZW5jZS4KKworXHNlY3Rpb24gcmVjb3JkX2FuZF9yZXBsYXlfdXNhZ2UgVXNhZ2UKKworPGI+VG8gcmVjb3JkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIGEgZmlsZTo8L2I+IEZpbGwgaW4KK1ZtYUFsbG9jYXRvckNyZWF0ZUluZm86OnBSZWNvcmRTZXR0aW5ncyBtZW1iZXIgd2hpbGUgY3JlYXRpbmcgI1ZtYUFsbG9jYXRvcgorb2JqZWN0LiBGaWxlIGlzIG9wZW5lZCBhbmQgd3JpdHRlbiBkdXJpbmcgd2hvbGUgbGlmZXRpbWUgb2YgdGhlIGFsbG9jYXRvci4KKworPGI+VG8gcmVwbGF5IGZpbGU6PC9iPiBVc2UgVm1hUmVwbGF5IC0gc3RhbmRhbG9uZSBjb21tYW5kLWxpbmUgcHJvZ3JhbS4KK1ByZWNvbXBpbGVkIGJpbmFyeSBjYW4gYmUgZm91bmQgaW4gImJpbiIgZGlyZWN0b3J5LgorSXRzIHNvdXJjZSBjYW4gYmUgZm91bmQgaW4gInNyYy9WbWFSZXBsYXkiIGRpcmVjdG9yeS4KK0l0cyBwcm9qZWN0IGlzIGdlbmVyYXRlZCBieSBQcmVtYWtlLgorQ29tbWFuZCBsaW5lIHN5bnRheCBpcyBwcmludGVkIHdoZW4gdGhlIHByb2dyYW0gaXMgbGF1bmNoZWQgd2l0aG91dCBwYXJhbWV0ZXJzLgorQmFzaWMgdXNhZ2U6CisKKyAgICBWbWFSZXBsYXkuZXhlIE15UmVjb3JkaW5nLmNzdgorCis8Yj5Eb2N1bWVudGF0aW9uIG9mIGZpbGUgZm9ybWF0PC9iPiBjYW4gYmUgZm91bmQgaW4gZmlsZTogImRvY3MvUmVjb3JkaW5nIGZpbGUgZm9ybWF0Lm1kIi4KK0l0J3MgYSBodW1hbi1yZWFkYWJsZSwgdGV4dCBmaWxlIGluIENTViBmb3JtYXQgKENvbW1hIFNlcGFyYXRlZCBWYWx1ZXMpLgorCitcc2VjdGlvbiByZWNvcmRfYW5kX3JlcGxheV9hZGRpdGlvbmFsX2NvbnNpZGVyYXRpb25zIEFkZGl0aW9uYWwgY29uc2lkZXJhdGlvbnMKKworLSBSZXBsYXlpbmcgZmlsZSB0aGF0IHdhcyByZWNvcmRlZCBvbiBhIGRpZmZlcmVudCBHUFUgKHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMKKyAgbGlrZSBgYnVmZmVySW1hZ2VHcmFudWxhcml0eWAsIGBub25Db2hlcmVudEF0b21TaXplYCwgYW5kIGVzcGVjaWFsbHkgZGlmZmVyZW50CisgIHNldCBvZiBtZW1vcnkgaGVhcHMgYW5kIHR5cGVzKSBtYXkgZ2l2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgYW5kIG1lbW9yeSB1c2FnZQorICByZXN1bHRzLCBhcyB3ZWxsIGFzIGlzc3VlIHNvbWUgd2FybmluZ3MgYW5kIGVycm9ycy4KKy0gQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiByZWNvcmRpbmcgaW4gVk1BLCBhcyB3ZWxsIGFzIFZtYVJlcGxheSBhcHBsaWNhdGlvbiwgaXMKKyAgY29kZWQgYW5kIHRlc3RlZCBvbmx5IG9uIFdpbmRvd3MuIEluY2x1c2lvbiBvZiByZWNvcmRpbmcgY29kZSBpcyBkcml2ZW4gYnkKKyAgYFZNQV9SRUNPUkRJTkdfRU5BQkxFRGAgbWFjcm8uIFN1cHBvcnQgZm9yIG90aGVyIHBsYXRmb3JtcyBzaG91bGQgYmUgZWFzeSB0bworICBhZGQuIENvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWVkLgorLSBDdXJyZW50bHkgY2FsbHMgdG8gdm1hRGVmcmFnbWVudCgpIGZ1bmN0aW9uIGFyZSBub3QgcmVjb3JkZWQuCisKKworXHBhZ2UgdXNhZ2VfcGF0dGVybnMgUmVjb21tZW5kZWQgdXNhZ2UgcGF0dGVybnMKKworU2VlIGFsc28gc2xpZGVzIGZyb20gdGFsazoKK1tTYXdpY2tpLCBBZGFtLiBBZHZhbmNlZCBHcmFwaGljcyBUZWNobmlxdWVzIFR1dG9yaWFsOiBNZW1vcnkgbWFuYWdlbWVudCBpbiBWdWxrYW4gYW5kIERYMTIuIEdhbWUgRGV2ZWxvcGVycyBDb25mZXJlbmNlLCAyMDE4XShodHRwczovL3d3dy5nZGN2YXVsdC5jb20vcGxheS8xMDI1NDU4L0FkdmFuY2VkLUdyYXBoaWNzLVRlY2huaXF1ZXMtVHV0b3JpYWwtTmV3KQorCisKK1xzZWN0aW9uIHVzYWdlX3BhdHRlcm5zX3NpbXBsZSBTaW1wbGUgcGF0dGVybnMKKworXHN1YnNlY3Rpb24gdXNhZ2VfcGF0dGVybnNfc2ltcGxlX3JlbmRlcl90YXJnZXRzIFJlbmRlciB0YXJnZXRzCisKKzxiPldoZW46PC9iPgorQW55IHJlc291cmNlcyB0aGF0IHlvdSBmcmVxdWVudGx5IHdyaXRlIGFuZCByZWFkIG9uIEdQVSwKK2UuZy4gaW1hZ2VzIHVzZWQgYXMgY29sb3IgYXR0YWNobWVudHMgKGFrYSAicmVuZGVyIHRhcmdldHMiKSwgZGVwdGgtc3RlbmNpbCBhdHRhY2htZW50cywKK2ltYWdlcy9idWZmZXJzIHVzZWQgYXMgc3RvcmFnZSBpbWFnZS9idWZmZXIgKGFrYSAiVW5vcmRlcmVkIEFjY2VzcyBWaWV3IChVQVYpIikuCisKKzxiPldoYXQgdG8gZG86PC9iPgorQ3JlYXRlIHRoZW0gaW4gdmlkZW8gbWVtb3J5IHRoYXQgaXMgZmFzdGVzdCB0byBhY2Nlc3MgZnJvbSBHUFUgdXNpbmcKKyNWTUFfTUVNT1JZX1VTQUdFX0dQVV9PTkxZLgorCitDb25zaWRlciB1c2luZyBbVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uXShAcmVmIHZrX2tocl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikgZXh0ZW5zaW9uCithbmQvb3IgbWFudWFsbHkgY3JlYXRpbmcgdGhlbSBhcyBkZWRpY2F0ZWQgYWxsb2NhdGlvbnMgdXNpbmcgI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9ERURJQ0FURURfTUVNT1JZX0JJVCwKK2VzcGVjaWFsbHkgaWYgdGhleSBhcmUgbGFyZ2Ugb3IgaWYgeW91IHBsYW4gdG8gZGVzdHJveSBhbmQgcmVjcmVhdGUgdGhlbSBlLmcuIHdoZW4KK2Rpc3BsYXkgcmVzb2x1dGlvbiBjaGFuZ2VzLgorUHJlZmVyIHRvIGNyZWF0ZSBzdWNoIHJlc291cmNlcyBmaXJzdCBhbmQgYWxsIG90aGVyIEdQVSByZXNvdXJjZXMgKGxpa2UgdGV4dHVyZXMgYW5kIHZlcnRleCBidWZmZXJzKSBsYXRlci4KKworXHN1YnNlY3Rpb24gdXNhZ2VfcGF0dGVybnNfc2ltcGxlX2ltbXV0YWJsZV9yZXNvdXJjZXMgSW1tdXRhYmxlIHJlc291cmNlcworCis8Yj5XaGVuOjwvYj4KK0FueSByZXNvdXJjZXMgdGhhdCB5b3UgZmlsbCBvbiBDUFUgb25seSBvbmNlIChha2EgImltbXV0YWJsZSIpIG9yIGluZnJlcXVlbnRseQorYW5kIHRoZW4gcmVhZCBmcmVxdWVudGx5IG9uIEdQVSwKK2UuZy4gdGV4dHVyZXMsIHZlcnRleCBhbmQgaW5kZXggYnVmZmVycywgY29uc3RhbnQgYnVmZmVycyB0aGF0IGRvbid0IGNoYW5nZSBvZnRlbi4KKworPGI+V2hhdCB0byBkbzo8L2I+CitDcmVhdGUgdGhlbSBpbiB2aWRlbyBtZW1vcnkgdGhhdCBpcyBmYXN0ZXN0IHRvIGFjY2VzcyBmcm9tIEdQVSB1c2luZworI1ZNQV9NRU1PUllfVVNBR0VfR1BVX09OTFkuCisKK1RvIGluaXRpYWxpemUgY29udGVudCBvZiBzdWNoIHJlc291cmNlLCBjcmVhdGUgYSBDUFUtc2lkZSAoYWthICJzdGFnaW5nIikgY29weSBvZiBpdAoraW4gc3lzdGVtIG1lbW9yeSAtICNWTUFfTUVNT1JZX1VTQUdFX0NQVV9PTkxZLCBtYXAgaXQsIGZpbGwgaXQsCithbmQgc3VibWl0IGEgdHJhbnNmZXIgZnJvbSBpdCB0byB0aGUgR1BVIHJlc291cmNlLgorWW91IGNhbiBrZWVwIHRoZSBzdGFnaW5nIGNvcHkgaWYgeW91IG5lZWQgaXQgZm9yIGFub3RoZXIgdXBsb2FkIHRyYW5zZmVyIGluIHRoZSBmdXR1cmUuCitJZiB5b3UgZG9uJ3QsIHlvdSBjYW4gZGVzdHJveSBpdCBvciByZXVzZSB0aGlzIGJ1ZmZlciBmb3IgdXBsb2FkaW5nIGRpZmZlcmVudCByZXNvdXJjZQorYWZ0ZXIgdGhlIHRyYW5zZmVyIGZpbmlzaGVzLgorCitQcmVmZXIgdG8gY3JlYXRlIGp1c3QgYnVmZmVycyBpbiBzeXN0ZW0gbWVtb3J5IHJhdGhlciB0aGFuIGltYWdlcywgZXZlbiBmb3IgdXBsb2FkaW5nIHRleHR1cmVzLgorVXNlIGB2a0NtZENvcHlCdWZmZXJUb0ltYWdlKClgLgorRG9udCB1c2UgaW1hZ2VzIHdpdGggYFZLX0lNQUdFX1RJTElOR19MSU5FQVJgLgorCitcc3Vic2VjdGlvbiB1c2FnZV9wYXR0ZXJuc19keW5hbWljX3Jlc291cmNlcyBEeW5hbWljIHJlc291cmNlcworCis8Yj5XaGVuOjwvYj4KK0FueSByZXNvdXJjZXMgdGhhdCBjaGFuZ2UgZnJlcXVlbnRseSAoYWthICJkeW5hbWljIiksIGUuZy4gZXZlcnkgZnJhbWUgb3IgZXZlcnkgZHJhdyBjYWxsLAord3JpdHRlbiBvbiBDUFUsIHJlYWQgb24gR1BVLgorCis8Yj5XaGF0IHRvIGRvOjwvYj4KK0NyZWF0ZSB0aGVtIHVzaW5nICNWTUFfTUVNT1JZX1VTQUdFX0NQVV9UT19HUFUuCitZb3UgY2FuIG1hcCBpdCBhbmQgd3JpdGUgdG8gaXQgZGlyZWN0bHkgb24gQ1BVLCBhcyB3ZWxsIGFzIHJlYWQgZnJvbSBpdCBvbiBHUFUuCisKK1RoaXMgaXMgYSBtb3JlIGNvbXBsZXggc2l0dWF0aW9uLiBEaWZmZXJlbnQgc29sdXRpb25zIGFyZSBwb3NzaWJsZSwKK2FuZCB0aGUgYmVzdCBvbmUgZGVwZW5kcyBvbiBzcGVjaWZpYyBHUFUgdHlwZSwgYnV0IHlvdSBjYW4gdXNlIHRoaXMgc2ltcGxlIGFwcHJvYWNoIGZvciB0aGUgc3RhcnQuCitQcmVmZXIgdG8gd3JpdGUgdG8gc3VjaCByZXNvdXJjZSBzZXF1ZW50aWFsbHkgKGUuZy4gdXNpbmcgYG1lbWNweWApLgorRG9uJ3QgcGVyZm9ybSByYW5kb20gYWNjZXNzIG9yIGFueSByZWFkcyBmcm9tIGl0IG9uIENQVSwgYXMgaXQgbWF5IGJlIHZlcnkgc2xvdy4KKworXHN1YnNlY3Rpb24gdXNhZ2VfcGF0dGVybnNfcmVhZGJhY2sgUmVhZGJhY2sKKworPGI+V2hlbjo8L2I+CitSZXNvdXJjZXMgdGhhdCBjb250YWluIGRhdGEgd3JpdHRlbiBieSBHUFUgdGhhdCB5b3Ugd2FudCB0byByZWFkIGJhY2sgb24gQ1BVLAorZS5nLiByZXN1bHRzIG9mIHNvbWUgY29tcHV0YXRpb25zLgorCis8Yj5XaGF0IHRvIGRvOjwvYj4KK0NyZWF0ZSB0aGVtIHVzaW5nICNWTUFfTUVNT1JZX1VTQUdFX0dQVV9UT19DUFUuCitZb3UgY2FuIHdyaXRlIHRvIHRoZW0gZGlyZWN0bHkgb24gR1BVLCBhcyB3ZWxsIGFzIG1hcCBhbmQgcmVhZCB0aGVtIG9uIENQVS4KKworXHNlY3Rpb24gdXNhZ2VfcGF0dGVybnNfYWR2YW5jZWQgQWR2YW5jZWQgcGF0dGVybnMKKworXHN1YnNlY3Rpb24gdXNhZ2VfcGF0dGVybnNfaW50ZWdyYXRlZF9ncmFwaGljcyBEZXRlY3RpbmcgaW50ZWdyYXRlZCBncmFwaGljcworCitZb3UgY2FuIHN1cHBvcnQgaW50ZWdyYXRlZCBncmFwaGljcyAobGlrZSBJbnRlbCBIRCBHcmFwaGljcywgQU1EIEFQVSkgYmV0dGVyCitieSBkZXRlY3RpbmcgaXQgaW4gVnVsa2FuLgorVG8gZG8gaXQsIGNhbGwgYHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKClgLCBpbnNwZWN0CitgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXM6OmRldmljZVR5cGVgIGFuZCBsb29rIGZvciBgVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfSU5URUdSQVRFRF9HUFVgLgorV2hlbiB5b3UgZmluZCBpdCwgeW91IGNhbiBhc3N1bWUgdGhhdCBtZW1vcnkgaXMgdW5pZmllZCBhbmQgYWxsIG1lbW9yeSB0eXBlcyBhcmUgY29tcGFyYWJseSBmYXN0Cit0byBhY2Nlc3MgZnJvbSBHUFUsIHJlZ2FyZGxlc3Mgb2YgYFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUYC4KKworWW91IGNhbiB0aGVuIHN1bSB1cCBzaXplcyBvZiBhbGwgYXZhaWxhYmxlIG1lbW9yeSBoZWFwcyBhbmQgdHJlYXQgdGhlbSBhcyB1c2VmdWwgZm9yCit5b3VyIEdQVSByZXNvdXJjZXMsIGluc3RlYWQgb2Ygb25seSBgREVWSUNFX0xPQ0FMYCBvbmVzLgorWW91IGNhbiBhbHNvIHByZWZlciB0byBjcmVhdGUgeW91ciByZXNvdXJjZXMgaW4gbWVtb3J5IHR5cGVzIHRoYXQgYXJlIGBIT1NUX1ZJU0lCTEVgIHRvIG1hcCB0aGVtCitkaXJlY3RseSBpbnN0ZWFkIG9mIHN1Ym1pdHRpbmcgZXhwbGljaXQgdHJhbnNmZXIgKHNlZSBiZWxvdykuCisKK1xzdWJzZWN0aW9uIHVzYWdlX3BhdHRlcm5zX2RpcmVjdF92c190cmFuc2ZlciBEaXJlY3QgYWNjZXNzIHZlcnN1cyB0cmFuc2ZlcgorCitGb3IgcmVzb3VyY2VzIHRoYXQgeW91IGZyZXF1ZW50bHkgd3JpdGUgb24gQ1BVIGFuZCByZWFkIG9uIEdQVSwgbWFueSBzb2x1dGlvbnMgYXJlIHBvc3NpYmxlOgorCistIyBDcmVhdGUgb25lIGNvcHkgaW4gdmlkZW8gbWVtb3J5IHVzaW5nICNWTUFfTUVNT1JZX1VTQUdFX0dQVV9PTkxZLAorICAgc2Vjb25kIGNvcHkgaW4gc3lzdGVtIG1lbW9yeSB1c2luZyAjVk1BX01FTU9SWV9VU0FHRV9DUFVfT05MWSBhbmQgc3VibWl0IGV4cGxpY2l0IHRyYW5mZXIgZWFjaCB0aW1lLgorLSMgQ3JlYXRlIGp1c3Qgc2luZ2xlIGNvcHkgdXNpbmcgI1ZNQV9NRU1PUllfVVNBR0VfQ1BVX1RPX0dQVSwgbWFwIGl0IGFuZCBmaWxsIGl0IG9uIENQVSwKKyAgIHJlYWQgaXQgZGlyZWN0bHkgb24gR1BVLgorLSMgQ3JlYXRlIGp1c3Qgc2luZ2xlIGNvcHkgdXNpbmcgI1ZNQV9NRU1PUllfVVNBR0VfQ1BVX09OTFksIG1hcCBpdCBhbmQgZmlsbCBpdCBvbiBDUFUsCisgICByZWFkIGl0IGRpcmVjdGx5IG9uIEdQVS4KKworV2hpY2ggc29sdXRpb24gaXMgdGhlIG1vc3QgZWZmaWNpZW50IGRlcGVuZHMgb24geW91ciByZXNvdXJjZSBhbmQgZXNwZWNpYWxseSBvbiB0aGUgR1BVLgorSXQgaXMgYmVzdCB0byBtZWFzdXJlIGl0IGFuZCB0aGVuIG1ha2UgdGhlIGRlY2lzaW9uLgorU29tZSBnZW5lcmFsIHJlY29tbWVuZGF0aW9uczoKKworLSBPbiBpbnRlZ3JhdGVkIGdyYXBoaWNzIHVzZSAoMikgb3IgKDMpIHRvIGF2b2lkIHVubmVjZXNhcnkgdGltZSBhbmQgbWVtb3J5IG92ZXJoZWFkCisgIHJlbGF0ZWQgdG8gdXNpbmcgYSBzZWNvbmQgY29weSBhbmQgbWFraW5nIHRyYW5zZmVyLgorLSBGb3Igc21hbGwgcmVzb3VyY2VzIChlLmcuIGNvbnN0YW50IGJ1ZmZlcnMpIHVzZSAoMikuCisgIERpc2NyZXRlIEFNRCBjYXJkcyBoYXZlIHNwZWNpYWwgMjU2IE1pQiBwb29sIG9mIHZpZGVvIG1lbW9yeSB0aGF0IGlzIGRpcmVjdGx5IG1hcHBhYmxlLgorICBFdmVuIGlmIHRoZSByZXNvdXJjZSBlbmRzIHVwIGluIHN5c3RlbSBtZW1vcnksIGl0cyBkYXRhIG1heSBiZSBjYWNoZWQgb24gR1BVIGFmdGVyIGZpcnN0CisgIGZldGNoIG92ZXIgUENJZSBidXMuCistIEZvciBsYXJnZXIgcmVzb3VyY2VzIChlLmcuIHRleHR1cmVzKSwgZGVjaWRlIGJldHdlZW4gKDEpIGFuZCAoMikuCisgIFlvdSBtYXkgd2FudCB0byBkaWZmZXJlbnRpYXRlIE5WSURJQSBhbmQgQU1ELCBlLmcuIGJ5IGxvb2tpbmcgZm9yIG1lbW9yeSB0eXBlIHRoYXQgaXMKKyAgYm90aCBgREVWSUNFX0xPQ0FMYCBhbmQgYEhPU1RfVklTSUJMRWAuIFdoZW4geW91IGZpbmQgaXQsIHVzZSAoMiksIG90aGVyd2lzZSB1c2UgKDEpLgorCitTaW1pbGFybHksIGZvciByZXNvdXJjZXMgdGhhdCB5b3UgZnJlcXVlbnRseSB3cml0ZSBvbiBHUFUgYW5kIHJlYWQgb24gQ1BVLCBtdWx0aXBsZQorc29sdXRpb25zIGFyZSBwb3NzaWJsZToKKworLSMgQ3JlYXRlIG9uZSBjb3B5IGluIHZpZGVvIG1lbW9yeSB1c2luZyAjVk1BX01FTU9SWV9VU0FHRV9HUFVfT05MWSwKKyAgIHNlY29uZCBjb3B5IGluIHN5c3RlbSBtZW1vcnkgdXNpbmcgI1ZNQV9NRU1PUllfVVNBR0VfR1BVX1RPX0NQVSBhbmQgc3VibWl0IGV4cGxpY2l0IHRyYW5mZXIgZWFjaCB0aW1lLgorLSMgQ3JlYXRlIGp1c3Qgc2luZ2xlIGNvcHkgdXNpbmcgI1ZNQV9NRU1PUllfVVNBR0VfR1BVX1RPX0NQVSwgd3JpdGUgdG8gaXQgZGlyZWN0bHkgb24gR1BVLAorICAgbWFwIGl0IGFuZCByZWFkIGl0IG9uIENQVS4KKworWW91IHNob3VsZCB0YWtlIHNvbWUgbWVhc3VyZW1lbnRzIHRvIGRlY2lkZSB3aGljaCBvcHRpb24gaXMgZmFzdGVyIGluIGNhc2Ugb2YgeW91ciBzcGVjaWZpYworcmVzb3VyY2UuCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHNwZWNpYWxpemUgeW91ciBjb2RlIGZvciBzcGVjaWZpYyB0eXBlcyBvZiBHUFVzLCB5b3UgY2FuIHN0aWxsIG1ha2UKK2FuIHNpbXBsZSBvcHRpbWl6YXRpb24gZm9yIGNhc2VzIHdoZW4geW91ciByZXNvdXJjZSBlbmRzIHVwIGluIG1hcHBhYmxlIG1lbW9yeSB0byB1c2UgaXQKK2RpcmVjdGx5IGluIHRoaXMgY2FzZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIENQVS1zaWRlIHN0YWdpbmcgY29weS4KK0ZvciBkZXRhaWxzIHNlZSBbRmluZGluZyBvdXQgaWYgbWVtb3J5IGlzIG1hcHBhYmxlXShAcmVmIG1lbW9yeV9tYXBwaW5nX2ZpbmRpbmdfaWZfbWVtb3J5X21hcHBhYmxlKS4KKworCitccGFnZSBjb25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKworUGxlYXNlIGNoZWNrICJDT05GSUdVUkFUSU9OIFNFQ1RJT04iIGluIHRoZSBjb2RlIHRvIGZpbmQgbWFjcm9zIHRoYXQgeW91IGNhbiBkZWZpbmUKK2JlZm9yZSBlYWNoIGluY2x1ZGUgb2YgdGhpcyBmaWxlIG9yIGNoYW5nZSBkaXJlY3RseSBpbiB0aGlzIGZpbGUgdG8gcHJvdmlkZQoreW91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgYmFzaWMgZmFjaWxpdGllcyBsaWtlIGFzc2VydCwgYG1pbigpYCBhbmQgYG1heCgpYCBmdW5jdGlvbnMsCittdXRleCwgYXRvbWljIGV0Yy4KK1RoZSBsaWJyYXJ5IHVzZXMgaXRzIG93biBpbXBsZW1lbnRhdGlvbiBvZiBjb250YWluZXJzIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgY2FuIHN3aXRjaCB0byB1c2luZworU1RMIGNvbnRhaW5lcnMgaW5zdGVhZC4KKworXHNlY3Rpb24gY29uZmlnX1Z1bGthbl9mdW5jdGlvbnMgUG9pbnRlcnMgdG8gVnVsa2FuIGZ1bmN0aW9ucworCitUaGUgbGlicmFyeSB1c2VzIFZ1bGthbiBmdW5jdGlvbnMgc3RyYWlnaHQgZnJvbSB0aGUgYHZ1bGthbi5oYCBoZWFkZXIgYnkgZGVmYXVsdC4KK0lmIHlvdSB3YW50IHRvIHByb3ZpZGUgeW91ciBvd24gcG9pbnRlcnMgdG8gdGhlc2UgZnVuY3Rpb25zLCBlLmcuIGZldGNoZWQgdXNpbmcKK2B2a0dldEluc3RhbmNlUHJvY0FkZHIoKWAgYW5kIGB2a0dldERldmljZVByb2NBZGRyKClgOgorCistIyBEZWZpbmUgYFZNQV9TVEFUSUNfVlVMS0FOX0ZVTkNUSU9OUyAwYC4KKy0jIFByb3ZpZGUgdmFsaWQgcG9pbnRlcnMgdGhyb3VnaCBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvOjpwVnVsa2FuRnVuY3Rpb25zLgorCitcc2VjdGlvbiBjdXN0b21fbWVtb3J5X2FsbG9jYXRvciBDdXN0b20gaG9zdCBtZW1vcnkgYWxsb2NhdG9yCisKK0lmIHlvdSB1c2UgY3VzdG9tIGFsbG9jYXRvciBmb3IgQ1BVIG1lbW9yeSByYXRoZXIgdGhhbiBkZWZhdWx0IG9wZXJhdG9yIGBuZXdgCithbmQgYGRlbGV0ZWAgZnJvbSBDKyssIHlvdSBjYW4gbWFrZSB0aGlzIGxpYnJhcnkgdXNpbmcgeW91ciBhbGxvY2F0b3IgYXMgd2VsbAorYnkgZmlsbGluZyBvcHRpb25hbCBtZW1iZXIgVm1hQWxsb2NhdG9yQ3JlYXRlSW5mbzo6cEFsbG9jYXRpb25DYWxsYmFja3MuIFRoZXNlCitmdW5jdGlvbnMgd2lsbCBiZSBwYXNzZWQgdG8gVnVsa2FuLCBhcyB3ZWxsIGFzIHVzZWQgYnkgdGhlIGxpYnJhcnkgaXRzZWxmIHRvCittYWtlIGFueSBDUFUtc2lkZSBhbGxvY2F0aW9ucy4KKworXHNlY3Rpb24gYWxsb2NhdGlvbl9jYWxsYmFja3MgRGV2aWNlIG1lbW9yeSBhbGxvY2F0aW9uIGNhbGxiYWNrcworCitUaGUgbGlicmFyeSBtYWtlcyBjYWxscyB0byBgdmtBbGxvY2F0ZU1lbW9yeSgpYCBhbmQgYHZrRnJlZU1lbW9yeSgpYCBpbnRlcm5hbGx5LgorWW91IGNhbiBzZXR1cCBjYWxsYmFja3MgdG8gYmUgaW5mb3JtZWQgYWJvdXQgdGhlc2UgY2FsbHMsIGUuZy4gZm9yIHRoZSBwdXJwb3NlCitvZiBnYXRoZXJpbmcgc29tZSBzdGF0aXN0aWNzLiBUbyBkbyBpdCwgZmlsbCBvcHRpb25hbCBtZW1iZXIKK1ZtYUFsbG9jYXRvckNyZWF0ZUluZm86OnBEZXZpY2VNZW1vcnlDYWxsYmFja3MuCisKK1xzZWN0aW9uIGhlYXBfbWVtb3J5X2xpbWl0IERldmljZSBoZWFwIG1lbW9yeSBsaW1pdAorCitJZiB5b3Ugd2FudCB0byB0ZXN0IGhvdyB5b3VyIHByb2dyYW0gYmVoYXZlcyB3aXRoIGxpbWl0ZWQgYW1vdW50IG9mIFZ1bGthbiBkZXZpY2UKK21lbW9yeSBhdmFpbGFibGUgd2l0aG91dCBzd2l0Y2hpbmcgeW91ciBncmFwaGljcyBjYXJkIHRvIG9uZSB0aGF0IHJlYWxseSBoYXMKK3NtYWxsZXIgVlJBTSwgeW91IGNhbiB1c2UgYSBmZWF0dXJlIG9mIHRoaXMgbGlicmFyeSBpbnRlbmRlZCBmb3IgdGhpcyBwdXJwb3NlLgorVG8gZG8gaXQsIGZpbGwgb3B0aW9uYWwgbWVtYmVyIFZtYUFsbG9jYXRvckNyZWF0ZUluZm86OnBIZWFwU2l6ZUxpbWl0LgorCisKKworXHBhZ2Ugdmtfa2hyX2RlZGljYXRlZF9hbGxvY2F0aW9uIFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbgorCitWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24gaXMgYSBWdWxrYW4gZXh0ZW5zaW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUKK3BlcmZvcm1hbmNlIG9uIHNvbWUgR1BVcy4gSXQgYXVnbWVudHMgVnVsa2FuIEFQSSB3aXRoIHBvc3NpYmlsaXR5IHRvIHF1ZXJ5Citkcml2ZXIgd2hldGhlciBpdCBwcmVmZXJzIHBhcnRpY3VsYXIgYnVmZmVyIG9yIGltYWdlIHRvIGhhdmUgaXRzIG93biwgZGVkaWNhdGVkCithbGxvY2F0aW9uIChzZXBhcmF0ZSBgVmtEZXZpY2VNZW1vcnlgIGJsb2NrKSBmb3IgYmV0dGVyIGVmZmljaWVuY3kgLSB0byBiZSBhYmxlCit0byBkbyBzb21lIGludGVybmFsIG9wdGltaXphdGlvbnMuCisKK1RoZSBleHRlbnNpb24gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgbGlicmFyeS4gSXQgd2lsbCBiZSB1c2VkIGF1dG9tYXRpY2FsbHkgd2hlbgorZW5hYmxlZC4gVG8gZW5hYmxlIGl0OgorCisxIC4gV2hlbiBjcmVhdGluZyBWdWxrYW4gZGV2aWNlLCBjaGVjayBpZiBmb2xsb3dpbmcgMiBkZXZpY2UgZXh0ZW5zaW9ucyBhcmUKK3N1cHBvcnRlZCAoY2FsbCBgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKClgKS4KK0lmIHllcywgZW5hYmxlIHRoZW0gKGZpbGwgYFZrRGV2aWNlQ3JlYXRlSW5mbzo6cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNgKS4KKworLSBWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyCistIFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbgorCitJZiB5b3UgZW5hYmxlZCB0aGVzZSBleHRlbnNpb25zOgorCisyIC4gVXNlICNWTUFfQUxMT0NBVE9SX0NSRUFURV9LSFJfREVESUNBVEVEX0FMTE9DQVRJT05fQklUIGZsYWcgd2hlbiBjcmVhdGluZworeW91ciAjVm1hQWxsb2NhdG9yYHRvIGluZm9ybSB0aGUgbGlicmFyeSB0aGF0IHlvdSBlbmFibGVkIHJlcXVpcmVkIGV4dGVuc2lvbnMKK2FuZCB5b3Ugd2FudCB0aGUgbGlicmFyeSB0byB1c2UgdGhlbS4KKworXGNvZGUKK2FsbG9jYXRvckluZm8uZmxhZ3MgfD0gVk1BX0FMTE9DQVRPUl9DUkVBVEVfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JJVDsKKwordm1hQ3JlYXRlQWxsb2NhdG9yKCZhbGxvY2F0b3JJbmZvLCAmYWxsb2NhdG9yKTsKK1xlbmRjb2RlCisKK1RoYXQncyBhbGwuIFRoZSBleHRlbnNpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVzZWQgd2hlbmV2ZXIgeW91IGNyZWF0ZSBhCitidWZmZXIgdXNpbmcgdm1hQ3JlYXRlQnVmZmVyKCkgb3IgaW1hZ2UgdXNpbmcgdm1hQ3JlYXRlSW1hZ2UoKS4KKworV2hlbiB1c2luZyB0aGUgZXh0ZW5zaW9uIHRvZ2V0aGVyIHdpdGggVnVsa2FuIFZhbGlkYXRpb24gTGF5ZXIsIHlvdSB3aWxsIHJlY2VpdmUKK3dhcm5pbmdzIGxpa2UgdGhpczoKKworICAgIHZrQmluZEJ1ZmZlck1lbW9yeSgpOiBCaW5kaW5nIG1lbW9yeSB0byBidWZmZXIgMHgzMyBidXQgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoKSBoYXMgbm90IGJlZW4gY2FsbGVkIG9uIHRoYXQgYnVmZmVyLgorCitJdCBpcyBPSywgeW91IHNob3VsZCBqdXN0IGlnbm9yZSBpdC4gSXQgaGFwcGVucyBiZWNhdXNlIHlvdSB1c2UgZnVuY3Rpb24KK2B2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIoKWAgaW5zdGVhZCBvZiBzdGFuZGFyZAorYHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKClgLCB3aGlsZSB0aGUgdmFsaWRhdGlvbiBsYXllciBzZWVtcyB0byBiZQordW5hd2FyZSBvZiBpdC4KKworVG8gbGVhcm4gbW9yZSBhYm91dCB0aGlzIGV4dGVuc2lvbiwgc2VlOgorCistIFtWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24gaW4gVnVsa2FuIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjAtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sI1ZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbikKKy0gW1ZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiB1bm9mZmljaWFsIG1hbnVhbF0oaHR0cDovL2FzYXdpY2tpLmluZm8vYXJ0aWNsZXMvVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uLnBocDUpCisKKworCitccGFnZSBnZW5lcmFsX2NvbnNpZGVyYXRpb25zIEdlbmVyYWwgY29uc2lkZXJhdGlvbnMKKworXHNlY3Rpb24gZ2VuZXJhbF9jb25zaWRlcmF0aW9uc190aHJlYWRfc2FmZXR5IFRocmVhZCBzYWZldHkKKworLSBUaGUgbGlicmFyeSBoYXMgbm8gZ2xvYmFsIHN0YXRlLCBzbyBzZXBhcmF0ZSAjVm1hQWxsb2NhdG9yIG9iamVjdHMgY2FuIGJlIHVzZWQKKyAgaW5kZXBlbmRlbnRseS4KKyAgVGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gY3JlYXRlIG11bHRpcGxlIHN1Y2ggb2JqZWN0cyB0aG91Z2ggLSBvbmUgcGVyIGBWa0RldmljZWAgaXMgZW5vdWdoLgorLSBCeSBkZWZhdWx0LCBhbGwgY2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgdGFrZSAjVm1hQWxsb2NhdG9yIGFzIGZpcnN0IHBhcmFtZXRlcgorICBhcmUgc2FmZSB0byBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseSBiZWNhdXNlIHRoZXkgYXJlCisgIHN5bmNocm9uaXplZCBpbnRlcm5hbGx5IHdoZW4gbmVlZGVkLgorLSBXaGVuIHRoZSBhbGxvY2F0b3IgaXMgY3JlYXRlZCB3aXRoICNWTUFfQUxMT0NBVE9SX0NSRUFURV9FWFRFUk5BTExZX1NZTkNIUk9OSVpFRF9CSVQKKyAgZmxhZywgY2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgdGFrZSBzdWNoICNWbWFBbGxvY2F0b3Igb2JqZWN0IG11c3QgYmUKKyAgc3luY2hyb25pemVkIGV4dGVybmFsbHkuCistIEFjY2VzcyB0byBhICNWbWFBbGxvY2F0aW9uIG9iamVjdCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSwKKyAgeW91IG11c3Qgbm90IGNhbGwgdm1hR2V0QWxsb2NhdGlvbkluZm8oKSBhbmQgdm1hTWFwTWVtb3J5KCkgZnJvbSBkaWZmZXJlbnQKKyAgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lIGlmIHlvdSBwYXNzIHRoZSBzYW1lICNWbWFBbGxvY2F0aW9uIG9iamVjdCB0byB0aGVzZQorICBmdW5jdGlvbnMuCisKK1xzZWN0aW9uIGdlbmVyYWxfY29uc2lkZXJhdGlvbnNfdmFsaWRhdGlvbl9sYXllcl93YXJuaW5ncyBWYWxpZGF0aW9uIGxheWVyIHdhcm5pbmdzCisKK1doZW4gdXNpbmcgdGhpcyBsaWJyYXJ5LCB5b3UgY2FuIG1lZXQgZm9sbG93aW5nIHR5cGVzIG9mIHdhcm5pbmdzIGlzc3VlZCBieQorVnVsa2FuIHZhbGlkYXRpb24gbGF5ZXIuIFRoZXkgZG9uJ3QgbmVjZXNzYXJpbHkgaW5kaWNhdGUgYSBidWcsIHNvIHlvdSBtYXkgbmVlZAordG8ganVzdCBpZ25vcmUgdGhlbS4KKworLSAqdmtCaW5kQnVmZmVyTWVtb3J5KCk6IEJpbmRpbmcgbWVtb3J5IHRvIGJ1ZmZlciAweGViOGU0IGJ1dCB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cygpIGhhcyBub3QgYmVlbiBjYWxsZWQgb24gdGhhdCBidWZmZXIuKgorICAtIEl0IGhhcHBlbnMgd2hlbiBWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24gZXh0ZW5zaW9uIGlzIGVuYWJsZWQuCisgICAgYHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUmAgZnVuY3Rpb24gaXMgdXNlZCBpbnN0ZWFkLCB3aGlsZSB2YWxpZGF0aW9uIGxheWVyIHNlZW1zIHRvIGJlIHVuYXdhcmUgb2YgaXQuCistICpNYXBwaW5nIGFuIGltYWdlIHdpdGggbGF5b3V0IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCBjYW4gcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvciBpZiB0aGlzIG1lbW9yeSBpcyB1c2VkIGJ5IHRoZSBkZXZpY2UuIE9ubHkgR0VORVJBTCBvciBQUkVJTklUSUFMSVpFRCBzaG91bGQgYmUgdXNlZC4qCisgIC0gSXQgaGFwcGVucyB3aGVuIHlvdSBtYXAgYSBidWZmZXIgb3IgaW1hZ2UsIGJlY2F1c2UgdGhlIGxpYnJhcnkgbWFwcyBlbnRpcmUKKyAgICBgVmtEZXZpY2VNZW1vcnlgIGJsb2NrLCB3aGVyZSBkaWZmZXJlbnQgdHlwZXMgb2YgaW1hZ2VzIGFuZCBidWZmZXJzIG1heSBlbmQKKyAgICB1cCB0b2dldGhlciwgZXNwZWNpYWxseSBvbiBHUFVzIHdpdGggdW5pZmllZCBtZW1vcnkgbGlrZSBJbnRlbC4KKy0gKk5vbi1saW5lYXIgaW1hZ2UgMHhlYmM5MSBpcyBhbGlhc2VkIHdpdGggbGluZWFyIGJ1ZmZlciAweGViOGU0IHdoaWNoIG1heSBpbmRpY2F0ZSBhIGJ1Zy4qCisgIC0gSXQgaGFwcGVucyB3aGVuIHlvdSB1c2UgbG9zdCBhbGxvY2F0aW9ucywgYW5kIGEgbmV3IGltYWdlIG9yIGJ1ZmZlciBpcworICAgIGNyZWF0ZWQgaW4gcGxhY2Ugb2YgYW4gZXhpc3Rpbmcgb2JqZWN0IHRoYXQgYmFjYW1lIGxvc3QuCisgIC0gSXQgbWF5IGhhcHBlbiBhbHNvIHdoZW4geW91IHVzZSBbZGVmcmFnbWVudGF0aW9uXShAcmVmIGRlZnJhZ21lbnRhdGlvbikuCisKK1xzZWN0aW9uIGdlbmVyYWxfY29uc2lkZXJhdGlvbnNfYWxsb2NhdGlvbl9hbGdvcml0aG0gQWxsb2NhdGlvbiBhbGdvcml0aG0KKworVGhlIGxpYnJhcnkgdXNlcyBmb2xsb3dpbmcgYWxnb3JpdGhtIGZvciBhbGxvY2F0aW9uLCBpbiBvcmRlcjoKKworLSMgVHJ5IHRvIGZpbmQgZnJlZSByYW5nZSBvZiBtZW1vcnkgaW4gZXhpc3RpbmcgYmxvY2tzLgorLSMgSWYgZmFpbGVkLCB0cnkgdG8gY3JlYXRlIGEgbmV3IGJsb2NrIG9mIGBWa0RldmljZU1lbW9yeWAsIHdpdGggcHJlZmVycmVkIGJsb2NrIHNpemUuCistIyBJZiBmYWlsZWQsIHRyeSB0byBjcmVhdGUgc3VjaCBibG9jayB3aXRoIHNpemUvMiwgc2l6ZS80LCBzaXplLzguCistIyBJZiBmYWlsZWQgYW5kICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX01BS0VfT1RIRVJfTE9TVF9CSVQgZmxhZyB3YXMKKyAgIHNwZWNpZmllZCwgdHJ5IHRvIGZpbmQgc3BhY2UgaW4gZXhpc3RpbmcgYmxvY2tzLCBwb3NzaWxieSBtYWtpbmcgc29tZSBvdGhlcgorICAgYWxsb2NhdGlvbnMgbG9zdC4KKy0jIElmIGZhaWxlZCwgdHJ5IHRvIGFsbG9jYXRlIHNlcGFyYXRlIGBWa0RldmljZU1lbW9yeWAgZm9yIHRoaXMgYWxsb2NhdGlvbiwKKyAgIGp1c3QgbGlrZSB3aGVuIHlvdSB1c2UgI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9ERURJQ0FURURfTUVNT1JZX0JJVC4KKy0jIElmIGZhaWxlZCwgY2hvb3NlIG90aGVyIG1lbW9yeSB0eXBlIHRoYXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgaW4KKyAgIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIGFuZCBnbyB0byBwb2ludCAxLgorLSMgSWYgZmFpbGVkLCByZXR1cm4gYFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZYC4KKworXHNlY3Rpb24gZ2VuZXJhbF9jb25zaWRlcmF0aW9uc19mZWF0dXJlc19ub3Rfc3VwcG9ydGVkIEZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQKKworRmVhdHVyZXMgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGVkIGZyb20gdGhlIHNjb3BlIG9mIHRoaXMgbGlicmFyeToKKworLSBEYXRhIHRyYW5zZmVyLiBVcGxvYWRpbmcgKHN0cmFtaW5nKSBhbmQgZG93bmxvYWRpbmcgZGF0YSBvZiBidWZmZXJzIGFuZCBpbWFnZXMKKyAgYmV0d2VlbiBDUFUgYW5kIEdQVSBtZW1vcnkgYW5kIHJlbGF0ZWQgc3luY2hyb25pemF0aW9uIGlzIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyLgorLSBBbGxvY2F0aW9ucyBmb3IgaW1wb3J0ZWQvZXhwb3J0ZWQgZXh0ZXJuYWwgbWVtb3J5LiBUaGV5IHRlbmQgdG8gcmVxdWlyZQorICBleHBsaWNpdCBtZW1vcnkgdHlwZSBpbmRleCBhbmQgZGVkaWNhdGVkIGFsbG9jYXRpb24gYW55d2F5LCBzbyB0aGV5IGRvbid0CisgIGludGVyYWN0IHdpdGggbWFpbiBmZWF0dXJlcyBvZiB0aGlzIGxpYnJhcnkuIFN1Y2ggc3BlY2lhbCBwdXJwb3NlIGFsbG9jYXRpb25zCisgIHNob3VsZCBiZSBtYWRlIG1hbnVhbGx5LCB1c2luZyBgdmtDcmVhdGVCdWZmZXIoKWAgYW5kIGB2a0FsbG9jYXRlTWVtb3J5KClgLgorLSBSZWNyZWF0aW9uIG9mIGJ1ZmZlcnMgYW5kIGltYWdlcy4gQWx0aG91Z2ggdGhlIGxpYnJhcnkgaGFzIGZ1bmN0aW9ucyBmb3IKKyAgYnVmZmVyIGFuZCBpbWFnZSBjcmVhdGlvbiAodm1hQ3JlYXRlQnVmZmVyKCksIHZtYUNyZWF0ZUltYWdlKCkpLCB5b3UgbmVlZCB0bworICByZWNyZWF0ZSB0aGVzZSBvYmplY3RzIHlvdXJzZWxmIGFmdGVyIGRlZnJhZ21lbnRhdGlvbi4gVGhhdCdzIGJlY2F1c2UgdGhlIGJpZworICBzdHJ1Y3R1cmVzIGBWa0J1ZmZlckNyZWF0ZUluZm9gLCBgVmtJbWFnZUNyZWF0ZUluZm9gIGFyZSBub3Qgc3RvcmVkIGluCisgICNWbWFBbGxvY2F0aW9uIG9iamVjdC4KKy0gSGFuZGxpbmcgQ1BVIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0aW5nIHNtYWxsIEMrKworICBvYmplY3RzIGluIENQVSBtZW1vcnkgKG5vdCBWdWxrYW4gbWVtb3J5KSwgYWxsb2NhdGlvbiBmYWlsdXJlcyBhcmUgbm90IGNoZWNrZWQKKyAgYW5kIGhhbmRsZWQgZ3JhY2VmdWxseSwgYmVjYXVzZSB0aGF0IHdvdWxkIGNvbXBsaWNhdGUgY29kZSBzaWduaWZpY2FudGx5IGFuZAorICBpcyB1c3VhbGx5IG5vdCBuZWVkZWQgaW4gZGVza3RvcCBQQyBhcHBsaWNhdGlvbnMgYW55d2F5LgorLSBDb2RlIGZyZWUgb2YgYW55IGNvbXBpbGVyIHdhcm5pbmdzLiBNYWludGFpbmluZyB0aGUgbGlicmFyeSB0byBjb21waWxlIGFuZAorICB3b3JrIGNvcnJlY3RseSBvbiBzbyBtYW55IGRpZmZlcmVudCBwbGF0Zm9ybXMgaXMgaGFyZCBlbm91Z2guIEJlaW5nIGZyZWUgb2YgCisgIGFueSB3YXJuaW5ncywgb24gYW55IHZlcnNpb24gb2YgYW55IGNvbXBpbGVyLCBpcyBzaW1wbHkgbm90IGZlYXNpYmxlLgorLSBUaGlzIGlzIGEgQysrIGxpYnJhcnkgd2l0aCBDIGludGVyZmFjZS4KKyAgQmluZGluZ3Mgb3IgcG9ydHMgdG8gYW55IG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcyBhcmUgd2VsY29tZWQgYXMgZXh0ZXJuYWwgcHJvamVjdHMgYW5kCisgIGFyZSBub3QgZ29pbmcgdG8gYmUgaW5jbHVkZWQgaW50byB0aGlzIHJlcG9zaXRvcnkuCisKKyovCisKKy8qCitEZWZpbmUgdGhpcyBtYWNybyB0byAwLzEgdG8gZGlzYWJsZS9lbmFibGUgc3VwcG9ydCBmb3IgcmVjb3JkaW5nIGZ1bmN0aW9uYWxpdHksCithdmFpbGFibGUgdGhyb3VnaCBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvOjpwUmVjb3JkU2V0dGluZ3MuCisqLworI2lmbmRlZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICAjaWZkZWYgX1dJTjMyCisgICAgICAgICNkZWZpbmUgVk1BX1JFQ09SRElOR19FTkFCTEVEIDEKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIFZNQV9SRUNPUkRJTkdfRU5BQkxFRCAwCisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBOT01JTk1BWAorICAgICNkZWZpbmUgTk9NSU5NQVggLy8gRm9yIHdpbmRvd3MuaAorI2VuZGlmCisKKyNpZm5kZWYgVlVMS0FOX0hfCisgICAgI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKyNlbmRpZgorCisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisgICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVk1BX0RFRElDQVRFRF9BTExPQ0FUSU9OKQorICAgICNpZiBWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyICYmIFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbgorICAgICAgICAjZGVmaW5lIFZNQV9ERURJQ0FURURfQUxMT0NBVElPTiAxCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBWTUFfREVESUNBVEVEX0FMTE9DQVRJT04gMAorICAgICNlbmRpZgorI2VuZGlmCisKKy8qKiBcc3RydWN0IFZtYUFsbG9jYXRvcgorXGJyaWVmIFJlcHJlc2VudHMgbWFpbiBvYmplY3Qgb2YgdGhpcyBsaWJyYXJ5IGluaXRpYWxpemVkLgorCitGaWxsIHN0cnVjdHVyZSAjVm1hQWxsb2NhdG9yQ3JlYXRlSW5mbyBhbmQgY2FsbCBmdW5jdGlvbiB2bWFDcmVhdGVBbGxvY2F0b3IoKSB0byBjcmVhdGUgaXQuCitDYWxsIGZ1bmN0aW9uIHZtYURlc3Ryb3lBbGxvY2F0b3IoKSB0byBkZXN0cm95IGl0LgorCitJdCBpcyByZWNvbW1lbmRlZCB0byBjcmVhdGUganVzdCBvbmUgb2JqZWN0IG9mIHRoaXMgdHlwZSBwZXIgYFZrRGV2aWNlYCBvYmplY3QsCityaWdodCBhZnRlciBWdWxrYW4gaXMgaW5pdGlhbGl6ZWQgYW5kIGtlZXAgaXQgYWxpdmUgdW50aWwgYmVmb3JlIFZ1bGthbiBkZXZpY2UgaXMgZGVzdHJveWVkLgorKi8KK1ZLX0RFRklORV9IQU5ETEUoVm1hQWxsb2NhdG9yKQorCisvLy8gQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWwgdmtBbGxvY2F0ZU1lbW9yeS4KK3R5cGVkZWYgdm9pZCAoVktBUElfUFRSICpQRk5fdm1hQWxsb2NhdGVEZXZpY2VNZW1vcnlGdW5jdGlvbikoCisgICAgVm1hQWxsb2NhdG9yICAgICAgYWxsb2NhdG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgIG1lbW9yeVR5cGUsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgIHNpemUpOworLy8vIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBiZWZvcmUgdmtGcmVlTWVtb3J5LgordHlwZWRlZiB2b2lkIChWS0FQSV9QVFIgKlBGTl92bWFGcmVlRGV2aWNlTWVtb3J5RnVuY3Rpb24pKAorICAgIFZtYUFsbG9jYXRvciAgICAgIGFsbG9jYXRvciwKKyAgICB1aW50MzJfdCAgICAgICAgICBtZW1vcnlUeXBlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICBzaXplKTsKKworLyoqIFxicmllZiBTZXQgb2YgY2FsbGJhY2tzIHRoYXQgdGhlIGxpYnJhcnkgd2lsbCBjYWxsIGZvciBgdmtBbGxvY2F0ZU1lbW9yeWAgYW5kIGB2a0ZyZWVNZW1vcnlgLgorCitQcm92aWRlZCBmb3IgaW5mb3JtYXRpdmUgcHVycG9zZSwgZS5nLiB0byBnYXRoZXIgc3RhdGlzdGljcyBhYm91dCBudW1iZXIgb2YKK2FsbG9jYXRpb25zIG9yIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkIGluIFZ1bGthbi4KKworVXNlZCBpbiBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvOjpwRGV2aWNlTWVtb3J5Q2FsbGJhY2tzLgorKi8KK3R5cGVkZWYgc3RydWN0IFZtYURldmljZU1lbW9yeUNhbGxiYWNrcyB7CisgICAgLy8vIE9wdGlvbmFsLCBjYW4gYmUgbnVsbC4KKyAgICBQRk5fdm1hQWxsb2NhdGVEZXZpY2VNZW1vcnlGdW5jdGlvbiBwZm5BbGxvY2F0ZTsKKyAgICAvLy8gT3B0aW9uYWwsIGNhbiBiZSBudWxsLgorICAgIFBGTl92bWFGcmVlRGV2aWNlTWVtb3J5RnVuY3Rpb24gcGZuRnJlZTsKK30gVm1hRGV2aWNlTWVtb3J5Q2FsbGJhY2tzOworCisvLy8gRmxhZ3MgZm9yIGNyZWF0ZWQgI1ZtYUFsbG9jYXRvci4KK3R5cGVkZWYgZW51bSBWbWFBbGxvY2F0b3JDcmVhdGVGbGFnQml0cyB7CisgICAgLyoqIFxicmllZiBBbGxvY2F0b3IgYW5kIGFsbCBvYmplY3RzIGNyZWF0ZWQgZnJvbSBpdCB3aWxsIG5vdCBiZSBzeW5jaHJvbml6ZWQgaW50ZXJuYWxseSwgc28geW91IG11c3QgZ3VhcmFudGVlIHRoZXkgYXJlIHVzZWQgZnJvbSBvbmx5IG9uZSB0aHJlYWQgYXQgYSB0aW1lIG9yIHN5bmNocm9uaXplZCBleHRlcm5hbGx5IGJ5IHlvdS4KKworICAgIFVzaW5nIHRoaXMgZmxhZyBtYXkgaW5jcmVhc2UgcGVyZm9ybWFuY2UgYmVjYXVzZSBpbnRlcm5hbCBtdXRleGVzIGFyZSBub3QgdXNlZC4KKyAgICAqLworICAgIFZNQV9BTExPQ0FUT1JfQ1JFQVRFX0VYVEVSTkFMTFlfU1lOQ0hST05JWkVEX0JJVCA9IDB4MDAwMDAwMDEsCisgICAgLyoqIFxicmllZiBFbmFibGVzIHVzYWdlIG9mIFZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiBleHRlbnNpb24uCisKKyAgICBVc2luZyB0aGlzIGV4dGVuaW9uIHdpbGwgYXV0b21hdGljYWxseSBhbGxvY2F0ZSBkZWRpY2F0ZWQgYmxvY2tzIG9mIG1lbW9yeSBmb3IKKyAgICBzb21lIGJ1ZmZlcnMgYW5kIGltYWdlcyBpbnN0ZWFkIG9mIHN1YmFsbG9jYXRpbmcgcGxhY2UgZm9yIHRoZW0gb3V0IG9mIGJpZ2dlcgorICAgIG1lbW9yeSBibG9ja3MgKGFzIGlmIHlvdSBleHBsaWNpdGx5IHVzZWQgI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9ERURJQ0FURURfTUVNT1JZX0JJVAorICAgIGZsYWcpIHdoZW4gaXQgaXMgcmVjb21tZW5kZWQgYnkgdGhlIGRyaXZlci4gSXQgbWF5IGltcHJvdmUgcGVyZm9ybWFuY2Ugb24gc29tZQorICAgIEdQVXMuCisKKyAgICBZb3UgbWF5IHNldCB0aGlzIGZsYWcgb25seSBpZiB5b3UgZm91bmQgb3V0IHRoYXQgZm9sbG93aW5nIGRldmljZSBleHRlbnNpb25zIGFyZQorICAgIHN1cHBvcnRlZCwgeW91IGVuYWJsZWQgdGhlbSB3aGlsZSBjcmVhdGluZyBWdWxrYW4gZGV2aWNlIHBhc3NlZCBhcworICAgIFZtYUFsbG9jYXRvckNyZWF0ZUluZm86OmRldmljZSwgYW5kIHlvdSB3YW50IHRoZW0gdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoaXMKKyAgICBsaWJyYXJ5OgorCisgICAgLSBWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyCisgICAgLSBWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24KKworV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB5b3UgY2FuIGV4cGVyaWVuY2UgZm9sbG93aW5nIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IFZ1bGthbgordmFsaWRhdGlvbiBsYXllci4gWW91IGNhbiBpZ25vcmUgdGhlbS4KKworPiB2a0JpbmRCdWZmZXJNZW1vcnkoKTogQmluZGluZyBtZW1vcnkgdG8gYnVmZmVyIDB4MmQgYnV0IHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCBvbiB0aGF0IGJ1ZmZlci4KKyAgICAqLworICAgIFZNQV9BTExPQ0FUT1JfQ1JFQVRFX0tIUl9ERURJQ0FURURfQUxMT0NBVElPTl9CSVQgPSAweDAwMDAwMDAyLAorCisgICAgVk1BX0FMTE9DQVRPUl9DUkVBVEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWbWFBbGxvY2F0b3JDcmVhdGVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWbWFBbGxvY2F0b3JDcmVhdGVGbGFnczsKKworLyoqIFxicmllZiBQb2ludGVycyB0byBzb21lIFZ1bGthbiBmdW5jdGlvbnMgLSBhIHN1YnNldCB1c2VkIGJ5IHRoZSBsaWJyYXJ5LgorCitVc2VkIGluIFZtYUFsbG9jYXRvckNyZWF0ZUluZm86OnBWdWxrYW5GdW5jdGlvbnMuCisqLwordHlwZWRlZiBzdHJ1Y3QgVm1hVnVsa2FuRnVuY3Rpb25zIHsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXM7CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIFBGTl92a0FsbG9jYXRlTWVtb3J5IHZrQWxsb2NhdGVNZW1vcnk7CisgICAgUEZOX3ZrRnJlZU1lbW9yeSB2a0ZyZWVNZW1vcnk7CisgICAgUEZOX3ZrTWFwTWVtb3J5IHZrTWFwTWVtb3J5OworICAgIFBGTl92a1VubWFwTWVtb3J5IHZrVW5tYXBNZW1vcnk7CisgICAgUEZOX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlczsKKyAgICBQRk5fdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzIHZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlczsKKyAgICBQRk5fdmtCaW5kQnVmZmVyTWVtb3J5IHZrQmluZEJ1ZmZlck1lbW9yeTsKKyAgICBQRk5fdmtCaW5kSW1hZ2VNZW1vcnkgdmtCaW5kSW1hZ2VNZW1vcnk7CisgICAgUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM7CisgICAgUEZOX3ZrQ3JlYXRlQnVmZmVyIHZrQ3JlYXRlQnVmZmVyOworICAgIFBGTl92a0Rlc3Ryb3lCdWZmZXIgdmtEZXN0cm95QnVmZmVyOworICAgIFBGTl92a0NyZWF0ZUltYWdlIHZrQ3JlYXRlSW1hZ2U7CisgICAgUEZOX3ZrRGVzdHJveUltYWdlIHZrRGVzdHJveUltYWdlOworICAgIFBGTl92a0NtZENvcHlCdWZmZXIgdmtDbWRDb3B5QnVmZmVyOworI2lmIFZNQV9ERURJQ0FURURfQUxMT0NBVElPTgorICAgIFBGTl92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSOworICAgIFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUjsKKyNlbmRpZgorfSBWbWFWdWxrYW5GdW5jdGlvbnM7CisKKy8vLyBGbGFncyB0byBiZSB1c2VkIGluIFZtYVJlY29yZFNldHRpbmdzOjpmbGFncy4KK3R5cGVkZWYgZW51bSBWbWFSZWNvcmRGbGFnQml0cyB7CisgICAgLyoqIFxicmllZiBFbmFibGVzIGZsdXNoIGFmdGVyIHJlY29yZGluZyBldmVyeSBmdW5jdGlvbiBjYWxsLgorCisgICAgRW5hYmxlIGl0IGlmIHlvdSBleHBlY3QgeW91ciBhcHBsaWNhdGlvbiB0byBjcmFzaCwgd2hpY2ggbWF5IGxlYXZlIHJlY29yZGluZyBmaWxlIHRydW5jYXRlZC4KKyAgICBJdCBtYXkgZGVncmFkZSBwZXJmb3JtYW5jZSB0aG91Z2guCisgICAgKi8KKyAgICBWTUFfUkVDT1JEX0ZMVVNIX0FGVEVSX0NBTExfQklUID0gMHgwMDAwMDAwMSwKKyAgICAKKyAgICBWTUFfUkVDT1JEX0ZMQUdfQklUU19NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK30gVm1hUmVjb3JkRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVm1hUmVjb3JkRmxhZ3M7CisKKy8vLyBQYXJhbWV0ZXJzIGZvciByZWNvcmRpbmcgY2FsbHMgdG8gVk1BIGZ1bmN0aW9ucy4gVG8gYmUgdXNlZCBpbiBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvOjpwUmVjb3JkU2V0dGluZ3MuCit0eXBlZGVmIHN0cnVjdCBWbWFSZWNvcmRTZXR0aW5ncworeworICAgIC8vLyBGbGFncyBmb3IgcmVjb3JkaW5nLiBVc2UgI1ZtYVJlY29yZEZsYWdCaXRzIGVudW0uCisgICAgVm1hUmVjb3JkRmxhZ3MgZmxhZ3M7CisgICAgLyoqIFxicmllZiBQYXRoIHRvIHRoZSBmaWxlIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gYnkgdGhlIHJlY29yZGluZy4KKworICAgIFN1Z2dlc3RlZCBleHRlbnNpb246ICJjc3YiLgorICAgIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLgorICAgIEl0IHdpbGwgYmUgb3BlbmVkIGZvciB0aGUgd2hvbGUgdGltZSAjVm1hQWxsb2NhdG9yIG9iamVjdCBpcyBhbGl2ZS4KKyAgICBJZiBvcGVuaW5nIHRoaXMgZmlsZSBmYWlscywgY3JlYXRpb24gb2YgdGhlIHdob2xlIGFsbG9jYXRvciBvYmplY3QgZmFpbHMuCisgICAgKi8KKyAgICBjb25zdCBjaGFyKiBwRmlsZVBhdGg7Cit9IFZtYVJlY29yZFNldHRpbmdzOworCisvLy8gRGVzY3JpcHRpb24gb2YgYSBBbGxvY2F0b3IgdG8gYmUgY3JlYXRlZC4KK3R5cGVkZWYgc3RydWN0IFZtYUFsbG9jYXRvckNyZWF0ZUluZm8KK3sKKyAgICAvLy8gRmxhZ3MgZm9yIGNyZWF0ZWQgYWxsb2NhdG9yLiBVc2UgI1ZtYUFsbG9jYXRvckNyZWF0ZUZsYWdCaXRzIGVudW0uCisgICAgVm1hQWxsb2NhdG9yQ3JlYXRlRmxhZ3MgZmxhZ3M7CisgICAgLy8vIFZ1bGthbiBwaHlzaWNhbCBkZXZpY2UuCisgICAgLyoqIEl0IG11c3QgYmUgdmFsaWQgdGhyb3VnaG91dCB3aG9sZSBsaWZldGltZSBvZiBjcmVhdGVkIGFsbG9jYXRvci4gKi8KKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlOworICAgIC8vLyBWdWxrYW4gZGV2aWNlLgorICAgIC8qKiBJdCBtdXN0IGJlIHZhbGlkIHRocm91Z2hvdXQgd2hvbGUgbGlmZXRpbWUgb2YgY3JlYXRlZCBhbGxvY2F0b3IuICovCisgICAgVmtEZXZpY2UgZGV2aWNlOworICAgIC8vLyBQcmVmZXJyZWQgc2l6ZSBvZiBhIHNpbmdsZSBgVmtEZXZpY2VNZW1vcnlgIGJsb2NrIHRvIGJlIGFsbG9jYXRlZCBmcm9tIGxhcmdlIGhlYXBzID4gMSBHaUIuIE9wdGlvbmFsLgorICAgIC8qKiBTZXQgdG8gMCB0byB1c2UgZGVmYXVsdCwgd2hpY2ggaXMgY3VycmVudGx5IDI1NiBNaUIuICovCisgICAgVmtEZXZpY2VTaXplIHByZWZlcnJlZExhcmdlSGVhcEJsb2NrU2l6ZTsKKyAgICAvLy8gQ3VzdG9tIENQVSBtZW1vcnkgYWxsb2NhdGlvbiBjYWxsYmFja3MuIE9wdGlvbmFsLgorICAgIC8qKiBPcHRpb25hbCwgY2FuIGJlIG51bGwuIFdoZW4gc3BlY2lmaWVkLCB3aWxsIGFsc28gYmUgdXNlZCBmb3IgYWxsIENQVS1zaWRlIG1lbW9yeSBhbGxvY2F0aW9ucy4gKi8KKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0aW9uQ2FsbGJhY2tzOworICAgIC8vLyBJbmZvcm1hdGl2ZSBjYWxsYmFja3MgZm9yIGB2a0FsbG9jYXRlTWVtb3J5YCwgYHZrRnJlZU1lbW9yeWAuIE9wdGlvbmFsLgorICAgIC8qKiBPcHRpb25hbCwgY2FuIGJlIG51bGwuICovCisgICAgY29uc3QgVm1hRGV2aWNlTWVtb3J5Q2FsbGJhY2tzKiBwRGV2aWNlTWVtb3J5Q2FsbGJhY2tzOworICAgIC8qKiBcYnJpZWYgTWF4aW11bSBudW1iZXIgb2YgYWRkaXRpb25hbCBmcmFtZXMgdGhhdCBhcmUgaW4gdXNlIGF0IHRoZSBzYW1lIHRpbWUgYXMgY3VycmVudCBmcmFtZS4KKworICAgIFRoaXMgdmFsdWUgaXMgdXNlZCBvbmx5IHdoZW4geW91IG1ha2UgYWxsb2NhdGlvbnMgd2l0aAorICAgIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9DQU5fQkVDT01FX0xPU1RfQklUIGZsYWcuIFN1Y2ggYWxsb2NhdGlvbiBjYW5ub3QgYmVjb21lCisgICAgbG9zdCBpZiBhbGxvY2F0aW9uLmxhc3RVc2VGcmFtZUluZGV4ID49IGFsbG9jYXRvci5jdXJyZW50RnJhbWVJbmRleCAtIGZyYW1lSW5Vc2VDb3VudC4KKworICAgIEZvciBleGFtcGxlLCBpZiB5b3UgZG91YmxlLWJ1ZmZlciB5b3VyIGNvbW1hbmQgYnVmZmVycywgc28gcmVzb3VyY2VzIHVzZWQgZm9yCisgICAgcmVuZGVyaW5nIGluIHByZXZpb3VzIGZyYW1lIG1heSBzdGlsbCBiZSBpbiB1c2UgYnkgdGhlIEdQVSBhdCB0aGUgbW9tZW50IHlvdQorICAgIGFsbG9jYXRlIHJlc291cmNlcyBuZWVkZWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLCBzZXQgdGhpcyB2YWx1ZSB0byAxLgorCisgICAgSWYgeW91IHdhbnQgdG8gYWxsb3cgYW55IGFsbG9jYXRpb25zIG90aGVyIHRoYW4gdXNlZCBpbiB0aGUgY3VycmVudCBmcmFtZSB0bworICAgIGJlY29tZSBsb3N0LCBzZXQgdGhpcyB2YWx1ZSB0byAwLgorICAgICovCisgICAgdWludDMyX3QgZnJhbWVJblVzZUNvdW50OworICAgIC8qKiBcYnJpZWYgRWl0aGVyIG51bGwgb3IgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGxpbWl0cyBvbiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgb3V0IG9mIHBhcnRpY3VsYXIgVnVsa2FuIG1lbW9yeSBoZWFwLgorCisgICAgSWYgbm90IE5VTEwsIGl0IG11c3QgYmUgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mCisgICAgYFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOjptZW1vcnlIZWFwQ291bnRgIGVsZW1lbnRzLCBkZWZpbmluZyBsaW1pdCBvbgorICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZCBvdXQgb2YgcGFydGljdWxhciBWdWxrYW4gbWVtb3J5CisgICAgaGVhcC4KKworICAgIEFueSBvZiB0aGUgZWxlbWVudHMgbWF5IGJlIGVxdWFsIHRvIGBWS19XSE9MRV9TSVpFYCwgd2hpY2ggbWVhbnMgbm8gbGltaXQgb24gdGhhdAorICAgIGhlYXAuIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCBpbiBjYXNlIG9mIGBwSGVhcFNpemVMaW1pdGAgPSBOVUxMLgorCisgICAgSWYgdGhlcmUgaXMgYSBsaW1pdCBkZWZpbmVkIGZvciBhIGhlYXA6CisKKyAgICAtIElmIHVzZXIgdHJpZXMgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkgZnJvbSB0aGF0IGhlYXAgdXNpbmcgdGhpcyBhbGxvY2F0b3IsCisgICAgICB0aGUgYWxsb2NhdGlvbiBmYWlscyB3aXRoIGBWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWWAuCisgICAgLSBJZiB0aGUgbGltaXQgaXMgc21hbGxlciB0aGFuIGhlYXAgc2l6ZSByZXBvcnRlZCBpbiBgVmtNZW1vcnlIZWFwOjpzaXplYCwgdGhlCisgICAgICB2YWx1ZSBvZiB0aGlzIGxpbWl0IHdpbGwgYmUgcmVwb3J0ZWQgaW5zdGVhZCB3aGVuIHVzaW5nIHZtYUdldE1lbW9yeVByb3BlcnRpZXMoKS4KKworICAgIFdhcm5pbmchIFVzaW5nIHRoaXMgZmVhdHVyZSBtYXkgbm90IGJlIGVxdWl2YWxlbnQgdG8gaW5zdGFsbGluZyBhIEdQVSB3aXRoCisgICAgc21hbGxlciBhbW91bnQgb2YgbWVtb3J5LCBiZWNhdXNlIGdyYXBoaWNzIGRyaXZlciBkb2Vzbid0IG5lY2Vzc2FyeSBmYWlsIG5ldworICAgIGFsbG9jYXRpb25zIHdpdGggYFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZYCByZXN1bHQgd2hlbiBtZW1vcnkgY2FwYWNpdHkgaXMKKyAgICBleGNlZWRlZC4gSXQgbWF5IHJldHVybiBzdWNjZXNzIGFuZCBqdXN0IHNpbGVudGx5IG1pZ3JhdGUgc29tZSBkZXZpY2UgbWVtb3J5CisgICAgYmxvY2tzIHRvIHN5c3RlbSBSQU0uIFRoaXMgZHJpdmVyIGJlaGF2aW9yIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgdXNpbmcKKyAgICBWS19BTURfbWVtb3J5X292ZXJhbGxvY2F0aW9uX2JlaGF2aW9yIGV4dGVuc2lvbi4KKyAgICAqLworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogcEhlYXBTaXplTGltaXQ7CisgICAgLyoqIFxicmllZiBQb2ludGVycyB0byBWdWxrYW4gZnVuY3Rpb25zLiBDYW4gYmUgbnVsbCBpZiB5b3UgbGVhdmUgZGVmaW5lIGBWTUFfU1RBVElDX1ZVTEtBTl9GVU5DVElPTlMgMWAuCisKKyAgICBJZiB5b3UgbGVhdmUgZGVmaW5lIGBWTUFfU1RBVElDX1ZVTEtBTl9GVU5DVElPTlMgMWAgaW4gY29uZmlndXJhdGlvbiBzZWN0aW9uLAorICAgIHlvdSBjYW4gcGFzcyBudWxsIGFzIHRoaXMgbWVtYmVyLCBiZWNhdXNlIHRoZSBsaWJyYXJ5IHdpbGwgZmV0Y2ggcG9pbnRlcnMgdG8KKyAgICBWdWxrYW4gZnVuY3Rpb25zIGludGVybmFsbHkgaW4gYSBzdGF0aWMgd2F5LCBsaWtlOgorCisgICAgICAgIHZ1bGthbkZ1bmN0aW9ucy52a0FsbG9jYXRlTWVtb3J5ID0gJnZrQWxsb2NhdGVNZW1vcnk7CisKKyAgICBGaWxsIHRoaXMgbWVtYmVyIGlmIHlvdSB3YW50IHRvIHByb3ZpZGUgeW91ciBvd24gcG9pbnRlcnMgdG8gVnVsa2FuIGZ1bmN0aW9ucywKKyAgICBlLmcuIGZldGNoZWQgdXNpbmcgYHZrR2V0SW5zdGFuY2VQcm9jQWRkcigpYCBhbmQgYHZrR2V0RGV2aWNlUHJvY0FkZHIoKWAuCisgICAgKi8KKyAgICBjb25zdCBWbWFWdWxrYW5GdW5jdGlvbnMqIHBWdWxrYW5GdW5jdGlvbnM7CisgICAgLyoqIFxicmllZiBQYXJhbWV0ZXJzIGZvciByZWNvcmRpbmcgb2YgVk1BIGNhbGxzLiBDYW4gYmUgbnVsbC4KKworICAgIElmIG5vdCBudWxsLCBpdCBlbmFibGVzIHJlY29yZGluZyBvZiBjYWxscyB0byBWTUEgZnVuY3Rpb25zIHRvIGEgZmlsZS4KKyAgICBJZiBzdXBwb3J0IGZvciByZWNvcmRpbmcgaXMgbm90IGVuYWJsZWQgdXNpbmcgYFZNQV9SRUNPUkRJTkdfRU5BQkxFRGAgbWFjcm8sCisgICAgY3JlYXRpb24gb2YgdGhlIGFsbG9jYXRvciBvYmplY3QgZmFpbHMgd2l0aCBgVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVGAuCisgICAgKi8KKyAgICBjb25zdCBWbWFSZWNvcmRTZXR0aW5ncyogcFJlY29yZFNldHRpbmdzOworfSBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvOworCisvLy8gQ3JlYXRlcyBBbGxvY2F0b3Igb2JqZWN0LgorVmtSZXN1bHQgdm1hQ3JlYXRlQWxsb2NhdG9yKAorICAgIGNvbnN0IFZtYUFsbG9jYXRvckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIFZtYUFsbG9jYXRvciogcEFsbG9jYXRvcik7CisKKy8vLyBEZXN0cm95cyBhbGxvY2F0b3Igb2JqZWN0Lgordm9pZCB2bWFEZXN0cm95QWxsb2NhdG9yKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IpOworCisvKioKK1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBhcmUgZmV0Y2hlZCBmcm9tIHBoeXNpY2FsRGV2aWNlIGJ5IHRoZSBhbGxvY2F0b3IuCitZb3UgY2FuIGFjY2VzcyBpdCBoZXJlLCB3aXRob3V0IGZldGNoaW5nIGl0IGFnYWluIG9uIHlvdXIgb3duLgorKi8KK3ZvaWQgdm1hR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMqKiBwcFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyk7CisKKy8qKgorUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIGFyZSBmZXRjaGVkIGZyb20gcGh5c2ljYWxEZXZpY2UgYnkgdGhlIGFsbG9jYXRvci4KK1lvdSBjYW4gYWNjZXNzIGl0IGhlcmUsIHdpdGhvdXQgZmV0Y2hpbmcgaXQgYWdhaW4gb24geW91ciBvd24uCisqLwordm9pZCB2bWFHZXRNZW1vcnlQcm9wZXJ0aWVzKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqKiBwcFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyk7CisKKy8qKgorXGJyaWVmIEdpdmVuIE1lbW9yeSBUeXBlIEluZGV4LCByZXR1cm5zIFByb3BlcnR5IEZsYWdzIG9mIHRoaXMgbWVtb3J5IHR5cGUuCisKK1RoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uLiBTYW1lIGluZm9ybWF0aW9uIGNhbiBiZSBvYnRhaW5lZCB1c2luZwordm1hR2V0TWVtb3J5UHJvcGVydGllcygpLgorKi8KK3ZvaWQgdm1hR2V0TWVtb3J5VHlwZVByb3BlcnRpZXMoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICB1aW50MzJfdCBtZW1vcnlUeXBlSW5kZXgsCisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzKiBwRmxhZ3MpOworCisvKiogXGJyaWVmIFNldHMgaW5kZXggb2YgdGhlIGN1cnJlbnQgZnJhbWUuCisKK1RoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIGlmIHlvdSBtYWtlIGFsbG9jYXRpb25zIHdpdGgKKyNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX0JFQ09NRV9MT1NUX0JJVCBhbmQKKyNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX01BS0VfT1RIRVJfTE9TVF9CSVQgZmxhZ3MgdG8gaW5mb3JtIHRoZSBhbGxvY2F0b3IKK3doZW4gYSBuZXcgZnJhbWUgYmVnaW5zLiBBbGxvY2F0aW9ucyBxdWVyaWVkIHVzaW5nIHZtYUdldEFsbG9jYXRpb25JbmZvKCkgY2Fubm90CitiZWNvbWUgbG9zdCBpbiB0aGUgY3VycmVudCBmcmFtZS4KKyovCit2b2lkIHZtYVNldEN1cnJlbnRGcmFtZUluZGV4KAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgdWludDMyX3QgZnJhbWVJbmRleCk7CisKKy8qKiBcYnJpZWYgQ2FsY3VsYXRlZCBzdGF0aXN0aWNzIG9mIG1lbW9yeSB1c2FnZSBpbiBlbnRpcmUgYWxsb2NhdG9yLgorKi8KK3R5cGVkZWYgc3RydWN0IFZtYVN0YXRJbmZvCit7CisgICAgLy8vIE51bWJlciBvZiBgVmtEZXZpY2VNZW1vcnlgIFZ1bGthbiBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZC4KKyAgICB1aW50MzJfdCBibG9ja0NvdW50OworICAgIC8vLyBOdW1iZXIgb2YgI1ZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiBvYmplY3RzIGFsbG9jYXRlZC4KKyAgICB1aW50MzJfdCBhbGxvY2F0aW9uQ291bnQ7CisgICAgLy8vIE51bWJlciBvZiBmcmVlIHJhbmdlcyBvZiBtZW1vcnkgYmV0d2VlbiBhbGxvY2F0aW9ucy4KKyAgICB1aW50MzJfdCB1bnVzZWRSYW5nZUNvdW50OworICAgIC8vLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgYWxsIGFsbG9jYXRpb25zLgorICAgIFZrRGV2aWNlU2l6ZSB1c2VkQnl0ZXM7CisgICAgLy8vIFRvdGFsIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSB1bnVzZWQgcmFuZ2VzLgorICAgIFZrRGV2aWNlU2l6ZSB1bnVzZWRCeXRlczsKKyAgICBWa0RldmljZVNpemUgYWxsb2NhdGlvblNpemVNaW4sIGFsbG9jYXRpb25TaXplQXZnLCBhbGxvY2F0aW9uU2l6ZU1heDsKKyAgICBWa0RldmljZVNpemUgdW51c2VkUmFuZ2VTaXplTWluLCB1bnVzZWRSYW5nZVNpemVBdmcsIHVudXNlZFJhbmdlU2l6ZU1heDsKK30gVm1hU3RhdEluZm87CisKKy8vLyBHZW5lcmFsIHN0YXRpc3RpY3MgZnJvbSBjdXJyZW50IHN0YXRlIG9mIEFsbG9jYXRvci4KK3R5cGVkZWYgc3RydWN0IFZtYVN0YXRzCit7CisgICAgVm1hU3RhdEluZm8gbWVtb3J5VHlwZVtWS19NQVhfTUVNT1JZX1RZUEVTXTsKKyAgICBWbWFTdGF0SW5mbyBtZW1vcnlIZWFwW1ZLX01BWF9NRU1PUllfSEVBUFNdOworICAgIFZtYVN0YXRJbmZvIHRvdGFsOworfSBWbWFTdGF0czsKKworLy8vIFJldHJpZXZlcyBzdGF0aXN0aWNzIGZyb20gY3VycmVudCBzdGF0ZSBvZiB0aGUgQWxsb2NhdG9yLgordm9pZCB2bWFDYWxjdWxhdGVTdGF0cygKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYVN0YXRzKiBwU3RhdHMpOworCisjZGVmaW5lIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRCAxCisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworLy8vIEJ1aWxkcyBhbmQgcmV0dXJucyBzdGF0aXN0aWNzIGFzIHN0cmluZyBpbiBKU09OIGZvcm1hdC4KKy8qKiBAcGFyYW1bb3V0XSBwcFN0YXRzU3RyaW5nIE11c3QgYmUgZnJlZWQgdXNpbmcgdm1hRnJlZVN0YXRzU3RyaW5nKCkgZnVuY3Rpb24uCisqLwordm9pZCB2bWFCdWlsZFN0YXRzU3RyaW5nKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY2hhcioqIHBwU3RhdHNTdHJpbmcsCisgICAgVmtCb29sMzIgZGV0YWlsZWRNYXApOworCit2b2lkIHZtYUZyZWVTdGF0c1N0cmluZygKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIGNoYXIqIHBTdGF0c1N0cmluZyk7CisKKyNlbmRpZiAvLyAjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisKKy8qKiBcc3RydWN0IFZtYVBvb2wKK1xicmllZiBSZXByZXNlbnRzIGN1c3RvbSBtZW1vcnkgcG9vbAorCitGaWxsIHN0cnVjdHVyZSBWbWFQb29sQ3JlYXRlSW5mbyBhbmQgY2FsbCBmdW5jdGlvbiB2bWFDcmVhdGVQb29sKCkgdG8gY3JlYXRlIGl0LgorQ2FsbCBmdW5jdGlvbiB2bWFEZXN0cm95UG9vbCgpIHRvIGRlc3Ryb3kgaXQuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBbQ3VzdG9tIG1lbW9yeSBwb29sc10oQHJlZiBjaG9vc2luZ19tZW1vcnlfdHlwZV9jdXN0b21fbWVtb3J5X3Bvb2xzKS4KKyovCitWS19ERUZJTkVfSEFORExFKFZtYVBvb2wpCisKK3R5cGVkZWYgZW51bSBWbWFNZW1vcnlVc2FnZQoreworICAgIC8qKiBObyBpbnRlbmRlZCBtZW1vcnkgdXNhZ2Ugc3BlY2lmaWVkLgorICAgIFVzZSBvdGhlciBtZW1iZXJzIG9mIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvIHRvIHNwZWNpZnkgeW91ciByZXF1aXJlbWVudHMuCisgICAgKi8KKyAgICBWTUFfTUVNT1JZX1VTQUdFX1VOS05PV04gPSAwLAorICAgIC8qKiBNZW1vcnkgd2lsbCBiZSB1c2VkIG9uIGRldmljZSBvbmx5LCBzbyBmYXN0IGFjY2VzcyBmcm9tIHRoZSBkZXZpY2UgaXMgcHJlZmVycmVkLgorICAgIEl0IHVzdWFsbHkgbWVhbnMgZGV2aWNlLWxvY2FsIEdQVSAodmlkZW8pIG1lbW9yeS4KKyAgICBObyBuZWVkIHRvIGJlIG1hcHBhYmxlIG9uIGhvc3QuCisgICAgSXQgaXMgcm91Z2hseSBlcXVpdmFsZW50IG9mIGBEM0QxMl9IRUFQX1RZUEVfREVGQVVMVGAuCisKKyAgICBVc2FnZToKKyAgICAKKyAgICAtIFJlc291cmNlcyB3cml0dGVuIGFuZCByZWFkIGJ5IGRldmljZSwgZS5nLiBpbWFnZXMgdXNlZCBhcyBhdHRhY2htZW50cy4KKyAgICAtIFJlc291cmNlcyB0cmFuc2ZlcnJlZCBmcm9tIGhvc3Qgb25jZSAoaW1tdXRhYmxlKSBvciBpbmZyZXF1ZW50bHkgYW5kIHJlYWQgYnkKKyAgICAgIGRldmljZSBtdWx0aXBsZSB0aW1lcywgZS5nLiB0ZXh0dXJlcyB0byBiZSBzYW1wbGVkLCB2ZXJ0ZXggYnVmZmVycywgdW5pZm9ybQorICAgICAgKGNvbnN0YW50KSBidWZmZXJzLCBhbmQgbWFqb3JpdHkgb2Ygb3RoZXIgdHlwZXMgb2YgcmVzb3VyY2VzIHVzZWQgb24gR1BVLgorCisgICAgQWxsb2NhdGlvbiBtYXkgc3RpbGwgZW5kIHVwIGluIGBIT1NUX1ZJU0lCTEVgIG1lbW9yeSBvbiBzb21lIGltcGxlbWVudGF0aW9ucy4KKyAgICBJbiBzdWNoIGNhc2UsIHlvdSBhcmUgZnJlZSB0byBtYXAgaXQuCisgICAgWW91IGNhbiB1c2UgI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9NQVBQRURfQklUIHdpdGggdGhpcyB1c2FnZSB0eXBlLgorICAgICovCisgICAgVk1BX01FTU9SWV9VU0FHRV9HUFVfT05MWSA9IDEsCisgICAgLyoqIE1lbW9yeSB3aWxsIGJlIG1hcHBhYmxlIG9uIGhvc3QuCisgICAgSXQgdXN1YWxseSBtZWFucyBDUFUgKHN5c3RlbSkgbWVtb3J5LgorICAgIEd1YXJhbnRlZXMgdG8gYmUgYEhPU1RfVklTSUJMRWAgYW5kIGBIT1NUX0NPSEVSRU5UYC4KKyAgICBDUFUgYWNjZXNzIGlzIHR5cGljYWxseSB1bmNhY2hlZC4gV3JpdGVzIG1heSBiZSB3cml0ZS1jb21iaW5lZC4KKyAgICBSZXNvdXJjZXMgY3JlYXRlZCBpbiB0aGlzIHBvb2wgbWF5IHN0aWxsIGJlIGFjY2Vzc2libGUgdG8gdGhlIGRldmljZSwgYnV0IGFjY2VzcyB0byB0aGVtIGNhbiBiZSBzbG93LgorICAgIEl0IGlzIHJvdWdobHkgZXF1aXZhbGVudCBvZiBgRDNEMTJfSEVBUF9UWVBFX1VQTE9BRGAuCisKKyAgICBVc2FnZTogU3RhZ2luZyBjb3B5IG9mIHJlc291cmNlcyB1c2VkIGFzIHRyYW5zZmVyIHNvdXJjZS4KKyAgICAqLworICAgIFZNQV9NRU1PUllfVVNBR0VfQ1BVX09OTFkgPSAyLAorICAgIC8qKgorICAgIE1lbW9yeSB0aGF0IGlzIGJvdGggbWFwcGFibGUgb24gaG9zdCAoZ3VhcmFudGVlcyB0byBiZSBgSE9TVF9WSVNJQkxFYCkgYW5kIHByZWZlcmFibHkgZmFzdCB0byBhY2Nlc3MgYnkgR1BVLgorICAgIENQVSBhY2Nlc3MgaXMgdHlwaWNhbGx5IHVuY2FjaGVkLiBXcml0ZXMgbWF5IGJlIHdyaXRlLWNvbWJpbmVkLgorCisgICAgVXNhZ2U6IFJlc291cmNlcyB3cml0dGVuIGZyZXF1ZW50bHkgYnkgaG9zdCAoZHluYW1pYyksIHJlYWQgYnkgZGV2aWNlLiBFLmcuIHRleHR1cmVzLCB2ZXJ0ZXggYnVmZmVycywgdW5pZm9ybSBidWZmZXJzIHVwZGF0ZWQgZXZlcnkgZnJhbWUgb3IgZXZlcnkgZHJhdyBjYWxsLgorICAgICovCisgICAgVk1BX01FTU9SWV9VU0FHRV9DUFVfVE9fR1BVID0gMywKKyAgICAvKiogTWVtb3J5IG1hcHBhYmxlIG9uIGhvc3QgKGd1YXJhbnRlZXMgdG8gYmUgYEhPU1RfVklTSUJMRWApIGFuZCBjYWNoZWQuCisgICAgSXQgaXMgcm91Z2hseSBlcXVpdmFsZW50IG9mIGBEM0QxMl9IRUFQX1RZUEVfUkVBREJBQ0tgLgorCisgICAgVXNhZ2U6CisKKyAgICAtIFJlc291cmNlcyB3cml0dGVuIGJ5IGRldmljZSwgcmVhZCBieSBob3N0IC0gcmVzdWx0cyBvZiBzb21lIGNvbXB1dGF0aW9ucywgZS5nLiBzY3JlZW4gY2FwdHVyZSwgYXZlcmFnZSBzY2VuZSBsdW1pbmFuY2UgZm9yIEhEUiB0b25lIG1hcHBpbmcuCisgICAgLSBBbnkgcmVzb3VyY2VzIHJlYWQgb3IgYWNjZXNzZWQgcmFuZG9tbHkgb24gaG9zdCwgZS5nLiBDUFUtc2lkZSBjb3B5IG9mIHZlcnRleCBidWZmZXIgdXNlZCBhcyBzb3VyY2Ugb2YgdHJhbnNmZXIsIGJ1dCBhbHNvIHVzZWQgZm9yIGNvbGxpc2lvbiBkZXRlY3Rpb24uCisgICAgKi8KKyAgICBWTUFfTUVNT1JZX1VTQUdFX0dQVV9UT19DUFUgPSA0LAorICAgIFZNQV9NRU1PUllfVVNBR0VfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZtYU1lbW9yeVVzYWdlOworCisvLy8gRmxhZ3MgdG8gYmUgcGFzc2VkIGFzIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvOjpmbGFncy4KK3R5cGVkZWYgZW51bSBWbWFBbGxvY2F0aW9uQ3JlYXRlRmxhZ0JpdHMgeworICAgIC8qKiBcYnJpZWYgU2V0IHRoaXMgZmxhZyBpZiB0aGUgYWxsb2NhdGlvbiBzaG91bGQgaGF2ZSBpdHMgb3duIG1lbW9yeSBibG9jay4KKyAgICAKKyAgICBVc2UgaXQgZm9yIHNwZWNpYWwsIGJpZyByZXNvdXJjZXMsIGxpa2UgZnVsbHNjcmVlbiBpbWFnZXMgdXNlZCBhcyBhdHRhY2htZW50cy4KKyAgIAorICAgIFRoaXMgZmxhZyBtdXN0IGFsc28gYmUgdXNlZCBmb3IgaG9zdCB2aXNpYmxlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1hcAorICAgIHNpbXVsdGFuZW91c2x5IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZXkgbWlnaHQgZW5kIHVwIGFzIHJlZ2lvbnMgb2YgdGhlIHNhbWUKKyAgICBgVmtEZXZpY2VNZW1vcnlgLCB3aGlsZSBtYXBwaW5nIHNhbWUgYFZrRGV2aWNlTWVtb3J5YCBtdWx0aXBsZSB0aW1lcworICAgIHNpbXVsdGFuZW91c2x5IGlzIGlsbGVnYWwuCisKKyAgICBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmbGFnIGlmIFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvOjpwb29sIGlzIG5vdCBudWxsLgorICAgICovCisgICAgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0RFRElDQVRFRF9NRU1PUllfQklUID0gMHgwMDAwMDAwMSwKKworICAgIC8qKiBcYnJpZWYgU2V0IHRoaXMgZmxhZyB0byBvbmx5IHRyeSB0byBhbGxvY2F0ZSBmcm9tIGV4aXN0aW5nIGBWa0RldmljZU1lbW9yeWAgYmxvY2tzIGFuZCBuZXZlciBjcmVhdGUgbmV3IHN1Y2ggYmxvY2suCisgICAgCisgICAgSWYgbmV3IGFsbG9jYXRpb24gY2Fubm90IGJlIHBsYWNlZCBpbiBhbnkgb2YgdGhlIGV4aXN0aW5nIGJsb2NrcywgYWxsb2NhdGlvbgorICAgIGZhaWxzIHdpdGggYFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZYCBlcnJvci4KKyAgICAKKyAgICBZb3Ugc2hvdWxkIG5vdCB1c2UgI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9ERURJQ0FURURfTUVNT1JZX0JJVCBhbmQKKyAgICAjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX05FVkVSX0FMTE9DQVRFX0JJVCBhdCB0aGUgc2FtZSB0aW1lLiBJdCBtYWtlcyBubyBzZW5zZS4KKyAgICAKKyAgICBJZiBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbzo6cG9vbCBpcyBub3QgbnVsbCwgdGhpcyBmbGFnIGlzIGltcGxpZWQgYW5kIGlnbm9yZWQuICovCisgICAgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX05FVkVSX0FMTE9DQVRFX0JJVCA9IDB4MDAwMDAwMDIsCisgICAgLyoqIFxicmllZiBTZXQgdGhpcyBmbGFnIHRvIHVzZSBhIG1lbW9yeSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVudGx5IG1hcHBlZCBhbmQgcmV0cmlldmUgcG9pbnRlciB0byBpdC4KKyAgICAKKyAgICBQb2ludGVyIHRvIG1hcHBlZCBtZW1vcnkgd2lsbCBiZSByZXR1cm5lZCB0aHJvdWdoIFZtYUFsbG9jYXRpb25JbmZvOjpwTWFwcGVkRGF0YS4KKworICAgIElzIGl0IHZhbGlkIHRvIHVzZSB0aGlzIGZsYWcgZm9yIGFsbG9jYXRpb24gbWFkZSBmcm9tIG1lbW9yeSB0eXBlIHRoYXQgaXMgbm90CisgICAgYEhPU1RfVklTSUJMRWAuIFRoaXMgZmxhZyBpcyB0aGVuIGlnbm9yZWQgYW5kIG1lbW9yeSBpcyBub3QgbWFwcGVkLiBUaGlzIGlzCisgICAgdXNlZnVsIGlmIHlvdSBuZWVkIGFuIGFsbG9jYXRpb24gdGhhdCBpcyBlZmZpY2llbnQgdG8gdXNlIG9uIEdQVQorICAgIChgREVWSUNFX0xPQ0FMYCkgYW5kIHN0aWxsIHdhbnQgdG8gbWFwIGl0IGRpcmVjdGx5IGlmIHBvc3NpYmxlIG9uIHBsYXRmb3JtcyB0aGF0CisgICAgc3VwcG9ydCBpdCAoZS5nLiBJbnRlbCBHUFUpLgorCisgICAgWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZmxhZyB0b2dldGhlciB3aXRoICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX0JFQ09NRV9MT1NUX0JJVC4KKyAgICAqLworICAgIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9NQVBQRURfQklUID0gMHgwMDAwMDAwNCwKKyAgICAvKiogQWxsb2NhdGlvbiBjcmVhdGVkIHdpdGggdGhpcyBmbGFnIGNhbiBiZWNvbWUgbG9zdCBhcyBhIHJlc3VsdCBvZiBhbm90aGVyCisgICAgYWxsb2NhdGlvbiB3aXRoICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX01BS0VfT1RIRVJfTE9TVF9CSVQgZmxhZywgc28geW91CisgICAgbXVzdCBjaGVjayBpdCBiZWZvcmUgdXNlLgorCisgICAgVG8gY2hlY2sgaWYgYWxsb2NhdGlvbiBpcyBub3QgbG9zdCwgY2FsbCB2bWFHZXRBbGxvY2F0aW9uSW5mbygpIGFuZCBjaGVjayBpZgorICAgIFZtYUFsbG9jYXRpb25JbmZvOjpkZXZpY2VNZW1vcnkgaXMgbm90IGBWS19OVUxMX0hBTkRMRWAuCisKKyAgICBGb3IgZGV0YWlscyBhYm91dCBzdXBwb3J0aW5nIGxvc3QgYWxsb2NhdGlvbnMsIHNlZSBMb3N0IEFsbG9jYXRpb25zCisgICAgY2hhcHRlciBvZiBVc2VyIEd1aWRlIG9uIE1haW4gUGFnZS4KKworICAgIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGZsYWcgdG9nZXRoZXIgd2l0aCAjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX01BUFBFRF9CSVQuCisgICAgKi8KKyAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX0JFQ09NRV9MT1NUX0JJVCA9IDB4MDAwMDAwMDgsCisgICAgLyoqIFdoaWxlIGNyZWF0aW5nIGFsbG9jYXRpb24gdXNpbmcgdGhpcyBmbGFnLCBvdGhlciBhbGxvY2F0aW9ucyB0aGF0IHdlcmUKKyAgICBjcmVhdGVkIHdpdGggZmxhZyAjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0NBTl9CRUNPTUVfTE9TVF9CSVQgY2FuIGJlY29tZSBsb3N0LgorCisgICAgRm9yIGRldGFpbHMgYWJvdXQgc3VwcG9ydGluZyBsb3N0IGFsbG9jYXRpb25zLCBzZWUgTG9zdCBBbGxvY2F0aW9ucworICAgIGNoYXB0ZXIgb2YgVXNlciBHdWlkZSBvbiBNYWluIFBhZ2UuCisgICAgKi8KKyAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX01BS0VfT1RIRVJfTE9TVF9CSVQgPSAweDAwMDAwMDEwLAorICAgIC8qKiBTZXQgdGhpcyBmbGFnIHRvIHRyZWF0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvOjpwVXNlckRhdGEgYXMgcG9pbnRlciB0byBhCisgICAgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gSW5zdGVhZCBvZiBjb3B5aW5nIHBvaW50ZXIgdmFsdWUsIGEgbG9jYWwgY29weSBvZiB0aGUKKyAgICBzdHJpbmcgaXMgbWFkZSBhbmQgc3RvcmVkIGluIGFsbG9jYXRpb24ncyBgcFVzZXJEYXRhYC4gVGhlIHN0cmluZyBpcyBhdXRvbWF0aWNhbGx5CisgICAgZnJlZWQgdG9nZXRoZXIgd2l0aCB0aGUgYWxsb2NhdGlvbi4gSXQgaXMgYWxzbyB1c2VkIGluIHZtYUJ1aWxkU3RhdHNTdHJpbmcoKS4KKyAgICAqLworICAgIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUID0gMHgwMDAwMDAyMCwKKyAgICAvKiogQWxsb2NhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgZnJvbSB1cHBlciBzdGFjayBpbiBhIGRvdWJsZSBzdGFjayBwb29sLgorCisgICAgVGhpcyBmbGFnIGlzIG9ubHkgYWxsb3dlZCBmb3IgY3VzdG9tIHBvb2xzIGNyZWF0ZWQgd2l0aCAjVk1BX1BPT0xfQ1JFQVRFX0xJTkVBUl9BTEdPUklUSE1fQklUIGZsYWcuCisgICAgKi8KKyAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfVVBQRVJfQUREUkVTU19CSVQgPSAweDAwMDAwMDQwLAorCisgICAgLyoqIEFsbG9jYXRpb24gc3RyYXRlZ3kgdGhhdCBjaG9vc2VzIHNtYWxsZXN0IHBvc3NpYmxlIGZyZWUgcmFuZ2UgZm9yIHRoZQorICAgIGFsbG9jYXRpb24uCisgICAgKi8KKyAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfQkVTVF9GSVRfQklUICA9IDB4MDAwMTAwMDAsCisgICAgLyoqIEFsbG9jYXRpb24gc3RyYXRlZ3kgdGhhdCBjaG9vc2VzIGJpZ2dlc3QgcG9zc2libGUgZnJlZSByYW5nZSBmb3IgdGhlCisgICAgYWxsb2NhdGlvbi4KKyAgICAqLworICAgIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9XT1JTVF9GSVRfQklUID0gMHgwMDAyMDAwMCwKKyAgICAvKiogQWxsb2NhdGlvbiBzdHJhdGVneSB0aGF0IGNob29zZXMgZmlyc3Qgc3VpdGFibGUgZnJlZSByYW5nZSBmb3IgdGhlCisgICAgYWxsb2NhdGlvbi4KKworICAgICJGaXJzdCIgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFucyB0aGUgb25lIHdpdGggc21hbGxlc3Qgb2Zmc2V0IGluIG1lbW9yeSwKKyAgICBidXQgcmF0aGVyIHRoZSBvbmUgdGhhdCBpcyBlYXNpZXN0IGFuZCBmYXN0ZXN0IHRvIGZpbmQuCisgICAgKi8KKyAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfRklSU1RfRklUX0JJVCA9IDB4MDAwNDAwMDAsCisKKyAgICAvKiogQWxsb2NhdGlvbiBzdHJhdGVneSB0aGF0IHRyaWVzIHRvIG1pbmltaXplIG1lbW9yeSB1c2FnZS4KKyAgICAqLworICAgIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9NSU5fTUVNT1JZX0JJVCA9IFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9CRVNUX0ZJVF9CSVQsCisgICAgLyoqIEFsbG9jYXRpb24gc3RyYXRlZ3kgdGhhdCB0cmllcyB0byBtaW5pbWl6ZSBhbGxvY2F0aW9uIHRpbWUuCisgICAgKi8KKyAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfTUlOX1RJTUVfQklUID0gVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZX0ZJUlNUX0ZJVF9CSVQsCisgICAgLyoqIEFsbG9jYXRpb24gc3RyYXRlZ3kgdGhhdCB0cmllcyB0byBtaW5pbWl6ZSBtZW1vcnkgZnJhZ21lbnRhdGlvbi4KKyAgICAqLworICAgIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9NSU5fRlJBR01FTlRBVElPTl9CSVQgPSBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfV09SU1RfRklUX0JJVCwKKworICAgIC8qKiBBIGJpdCBtYXNrIHRvIGV4dHJhY3Qgb25seSBgU1RSQVRFR1lgIGJpdHMgZnJvbSBlbnRpcmUgc2V0IG9mIGZsYWdzLgorICAgICovCisgICAgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZX01BU0sgPQorICAgICAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfQkVTVF9GSVRfQklUIHwKKyAgICAgICAgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZX1dPUlNUX0ZJVF9CSVQgfAorICAgICAgICBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfRklSU1RfRklUX0JJVCwKKworICAgIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZtYUFsbG9jYXRpb25DcmVhdGVGbGFnQml0czsKK3R5cGVkZWYgVmtGbGFncyBWbWFBbGxvY2F0aW9uQ3JlYXRlRmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvCit7CisgICAgLy8vIFVzZSAjVm1hQWxsb2NhdGlvbkNyZWF0ZUZsYWdCaXRzIGVudW0uCisgICAgVm1hQWxsb2NhdGlvbkNyZWF0ZUZsYWdzIGZsYWdzOworICAgIC8qKiBcYnJpZWYgSW50ZW5kZWQgdXNhZ2Ugb2YgbWVtb3J5LgorICAgIAorICAgIFlvdSBjYW4gbGVhdmUgI1ZNQV9NRU1PUllfVVNBR0VfVU5LTk9XTiBpZiB5b3Ugc3BlY2lmeSBtZW1vcnkgcmVxdWlyZW1lbnRzIGluIG90aGVyIHdheS4gXG4KKyAgICBJZiBgcG9vbGAgaXMgbm90IG51bGwsIHRoaXMgbWVtYmVyIGlzIGlnbm9yZWQuCisgICAgKi8KKyAgICBWbWFNZW1vcnlVc2FnZSB1c2FnZTsKKyAgICAvKiogXGJyaWVmIEZsYWdzIHRoYXQgbXVzdCBiZSBzZXQgaW4gYSBNZW1vcnkgVHlwZSBjaG9zZW4gZm9yIGFuIGFsbG9jYXRpb24uCisgICAgCisgICAgTGVhdmUgMCBpZiB5b3Ugc3BlY2lmeSBtZW1vcnkgcmVxdWlyZW1lbnRzIGluIG90aGVyIHdheS4gXG4KKyAgICBJZiBgcG9vbGAgaXMgbm90IG51bGwsIHRoaXMgbWVtYmVyIGlzIGlnbm9yZWQuKi8KKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxdWlyZWRGbGFnczsKKyAgICAvKiogXGJyaWVmIEZsYWdzIHRoYXQgcHJlZmVyYWJseSBzaG91bGQgYmUgc2V0IGluIGEgbWVtb3J5IHR5cGUgY2hvc2VuIGZvciBhbiBhbGxvY2F0aW9uLgorICAgIAorICAgIFNldCB0byAwIGlmIG5vIGFkZGl0aW9uYWwgZmxhZ3MgYXJlIHByZWZlcmVkLiBcbgorICAgIElmIGBwb29sYCBpcyBub3QgbnVsbCwgdGhpcyBtZW1iZXIgaXMgaWdub3JlZC4gKi8KKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcHJlZmVycmVkRmxhZ3M7CisgICAgLyoqIFxicmllZiBCaXRtYXNrIGNvbnRhaW5pbmcgb25lIGJpdCBzZXQgZm9yIGV2ZXJ5IG1lbW9yeSB0eXBlIGFjY2VwdGFibGUgZm9yIHRoaXMgYWxsb2NhdGlvbi4KKworICAgIFZhbHVlIDAgaXMgZXF1aXZhbGVudCB0byBgVUlOVDMyX01BWGAgLSBpdCBtZWFucyBhbnkgbWVtb3J5IHR5cGUgaXMgYWNjZXB0ZWQgaWYKKyAgICBpdCBtZWV0cyBvdGhlciByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgc3RydWN0dXJlLCB3aXRoIG5vIGZ1cnRoZXIKKyAgICByZXN0cmljdGlvbnMgb24gbWVtb3J5IHR5cGUgaW5kZXguIFxuCisgICAgSWYgYHBvb2xgIGlzIG5vdCBudWxsLCB0aGlzIG1lbWJlciBpcyBpZ25vcmVkLgorICAgICovCisgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHM7CisgICAgLyoqIFxicmllZiBQb29sIHRoYXQgdGhpcyBhbGxvY2F0aW9uIHNob3VsZCBiZSBjcmVhdGVkIGluLgorCisgICAgTGVhdmUgYFZLX05VTExfSEFORExFYCB0byBhbGxvY2F0ZSBmcm9tIGRlZmF1bHQgcG9vbC4gSWYgbm90IG51bGwsIG1lbWJlcnM6CisgICAgYHVzYWdlYCwgYHJlcXVpcmVkRmxhZ3NgLCBgcHJlZmVycmVkRmxhZ3NgLCBgbWVtb3J5VHlwZUJpdHNgIGFyZSBpZ25vcmVkLgorICAgICovCisgICAgVm1hUG9vbCBwb29sOworICAgIC8qKiBcYnJpZWYgQ3VzdG9tIGdlbmVyYWwtcHVycG9zZSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gI1ZtYUFsbG9jYXRpb24sIGNhbiBiZSByZWFkIGFzIFZtYUFsbG9jYXRpb25JbmZvOjpwVXNlckRhdGEgYW5kIGNoYW5nZWQgdXNpbmcgdm1hU2V0QWxsb2NhdGlvblVzZXJEYXRhKCkuCisgICAgCisgICAgSWYgI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUIGlzIHVzZWQsIGl0IG11c3QgYmUgZWl0aGVyCisgICAgbnVsbCBvciBwb2ludGVyIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gVGhlIHN0cmluZyB3aWxsIGJlIHRoZW4gY29waWVkIHRvCisgICAgaW50ZXJuYWwgYnVmZmVyLCBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgdmFsaWQgYWZ0ZXIgYWxsb2NhdGlvbiBjYWxsLgorICAgICovCisgICAgdm9pZCogcFVzZXJEYXRhOworfSBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbzsKKworLyoqCitcYnJpZWYgSGVscHMgdG8gZmluZCBtZW1vcnlUeXBlSW5kZXgsIGdpdmVuIG1lbW9yeVR5cGVCaXRzIGFuZCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mby4KKworVGhpcyBhbGdvcml0aG0gdHJpZXMgdG8gZmluZCBhIG1lbW9yeSB0eXBlIHRoYXQ6CisKKy0gSXMgYWxsb3dlZCBieSBtZW1vcnlUeXBlQml0cy4KKy0gQ29udGFpbnMgYWxsIHRoZSBmbGFncyBmcm9tIHBBbGxvY2F0aW9uQ3JlYXRlSW5mby0+cmVxdWlyZWRGbGFncy4KKy0gTWF0Y2hlcyBpbnRlbmRlZCB1c2FnZS4KKy0gSGFzIGFzIG1hbnkgZmxhZ3MgZnJvbSBwQWxsb2NhdGlvbkNyZWF0ZUluZm8tPnByZWZlcnJlZEZsYWdzIGFzIHBvc3NpYmxlLgorCitccmV0dXJuIFJldHVybnMgVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVCBpZiBub3QgZm91bmQuIFJlY2VpdmluZyBzdWNoIHJlc3VsdAorZnJvbSB0aGlzIGZ1bmN0aW9uIG9yIGFueSBvdGhlciBhbGxvY2F0aW5nIGZ1bmN0aW9uIHByb2JhYmx5IG1lYW5zIHRoYXQgeW91cgorZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgbWVtb3J5IHR5cGUgd2l0aCByZXF1ZXN0ZWQgZmVhdHVyZXMgZm9yIHRoZSBzcGVjaWZpYwordHlwZSBvZiByZXNvdXJjZSB5b3Ugd2FudCB0byB1c2UgaXQgZm9yLiBQbGVhc2UgY2hlY2sgcGFyYW1ldGVycyBvZiB5b3VyCityZXNvdXJjZSwgbGlrZSBpbWFnZSBsYXlvdXQgKE9QVElNQUwgdmVyc3VzIExJTkVBUikgb3IgbWlwIGxldmVsIGNvdW50LgorKi8KK1ZrUmVzdWx0IHZtYUZpbmRNZW1vcnlUeXBlSW5kZXgoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICB1aW50MzJfdCBtZW1vcnlUeXBlQml0cywKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyogcEFsbG9jYXRpb25DcmVhdGVJbmZvLAorICAgIHVpbnQzMl90KiBwTWVtb3J5VHlwZUluZGV4KTsKKworLyoqCitcYnJpZWYgSGVscHMgdG8gZmluZCBtZW1vcnlUeXBlSW5kZXgsIGdpdmVuIFZrQnVmZmVyQ3JlYXRlSW5mbyBhbmQgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8uCisKK0l0IGNhbiBiZSB1c2VmdWwgZS5nLiB0byBkZXRlcm1pbmUgdmFsdWUgdG8gYmUgdXNlZCBhcyBWbWFQb29sQ3JlYXRlSW5mbzo6bWVtb3J5VHlwZUluZGV4LgorSXQgaW50ZXJuYWxseSBjcmVhdGVzIGEgdGVtcG9yYXJ5LCBkdW1teSBidWZmZXIgdGhhdCBuZXZlciBoYXMgbWVtb3J5IGJvdW5kLgorSXQgaXMganVzdCBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCBlcXVpdmFsZW50IHRvIGNhbGxpbmc6CisKKy0gYHZrQ3JlYXRlQnVmZmVyYAorLSBgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNgCistIGB2bWFGaW5kTWVtb3J5VHlwZUluZGV4YAorLSBgdmtEZXN0cm95QnVmZmVyYAorKi8KK1ZrUmVzdWx0IHZtYUZpbmRNZW1vcnlUeXBlSW5kZXhGb3JCdWZmZXJJbmZvKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQnVmZmVyQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyogcEFsbG9jYXRpb25DcmVhdGVJbmZvLAorICAgIHVpbnQzMl90KiBwTWVtb3J5VHlwZUluZGV4KTsKKworLyoqCitcYnJpZWYgSGVscHMgdG8gZmluZCBtZW1vcnlUeXBlSW5kZXgsIGdpdmVuIFZrSW1hZ2VDcmVhdGVJbmZvIGFuZCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mby4KKworSXQgY2FuIGJlIHVzZWZ1bCBlLmcuIHRvIGRldGVybWluZSB2YWx1ZSB0byBiZSB1c2VkIGFzIFZtYVBvb2xDcmVhdGVJbmZvOjptZW1vcnlUeXBlSW5kZXguCitJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSB0ZW1wb3JhcnksIGR1bW15IGltYWdlIHRoYXQgbmV2ZXIgaGFzIG1lbW9yeSBib3VuZC4KK0l0IGlzIGp1c3QgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiwgZXF1aXZhbGVudCB0byBjYWxsaW5nOgorCistIGB2a0NyZWF0ZUltYWdlYAorLSBgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50c2AKKy0gYHZtYUZpbmRNZW1vcnlUeXBlSW5kZXhgCistIGB2a0Rlc3Ryb3lJbWFnZWAKKyovCitWa1Jlc3VsdCB2bWFGaW5kTWVtb3J5VHlwZUluZGV4Rm9ySW1hZ2VJbmZvKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qIHBJbWFnZUNyZWF0ZUluZm8sCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8qIHBBbGxvY2F0aW9uQ3JlYXRlSW5mbywKKyAgICB1aW50MzJfdCogcE1lbW9yeVR5cGVJbmRleCk7CisKKy8vLyBGbGFncyB0byBiZSBwYXNzZWQgYXMgVm1hUG9vbENyZWF0ZUluZm86OmZsYWdzLgordHlwZWRlZiBlbnVtIFZtYVBvb2xDcmVhdGVGbGFnQml0cyB7CisgICAgLyoqIFxicmllZiBVc2UgdGhpcyBmbGFnIGlmIHlvdSBhbHdheXMgYWxsb2NhdGUgb25seSBidWZmZXJzIGFuZCBsaW5lYXIgaW1hZ2VzIG9yIG9ubHkgb3B0aW1hbCBpbWFnZXMgb3V0IG9mIHRoaXMgcG9vbCBhbmQgc28gQnVmZmVyLUltYWdlIEdyYW51bGFyaXR5IGNhbiBiZSBpZ25vcmVkLgorCisgICAgVGhpcyBpcyBhbiBvcHRpb25hbCBvcHRpbWl6YXRpb24gZmxhZy4KKworICAgIElmIHlvdSBhbHdheXMgYWxsb2NhdGUgdXNpbmcgdm1hQ3JlYXRlQnVmZmVyKCksIHZtYUNyZWF0ZUltYWdlKCksCisgICAgdm1hQWxsb2NhdGVNZW1vcnlGb3JCdWZmZXIoKSwgdGhlbiB5b3UgZG9uJ3QgbmVlZCB0byB1c2UgaXQgYmVjYXVzZSBhbGxvY2F0b3IKKyAgICBrbm93cyBleGFjdCB0eXBlIG9mIHlvdXIgYWxsb2NhdGlvbnMgc28gaXQgY2FuIGhhbmRsZSBCdWZmZXItSW1hZ2UgR3JhbnVsYXJpdHkKKyAgICBpbiB0aGUgb3B0aW1hbCB3YXkuCisKKyAgICBJZiB5b3UgYWxzbyBhbGxvY2F0ZSB1c2luZyB2bWFBbGxvY2F0ZU1lbW9yeUZvckltYWdlKCkgb3Igdm1hQWxsb2NhdGVNZW1vcnkoKSwKKyAgICBleGFjdCB0eXBlIG9mIHN1Y2ggYWxsb2NhdGlvbnMgaXMgbm90IGtub3duLCBzbyBhbGxvY2F0b3IgbXVzdCBiZSBjb25zZXJ2YXRpdmUKKyAgICBpbiBoYW5kbGluZyBCdWZmZXItSW1hZ2UgR3JhbnVsYXJpdHksIHdoaWNoIGNhbiBsZWFkIHRvIHN1Ym9wdGltYWwgYWxsb2NhdGlvbgorICAgICh3YXN0ZWQgbWVtb3J5KS4gSW4gdGhhdCBjYXNlLCBpZiB5b3UgY2FuIG1ha2Ugc3VyZSB5b3UgYWx3YXlzIGFsbG9jYXRlIG9ubHkKKyAgICBidWZmZXJzIGFuZCBsaW5lYXIgaW1hZ2VzIG9yIG9ubHkgb3B0aW1hbCBpbWFnZXMgb3V0IG9mIHRoaXMgcG9vbCwgdXNlIHRoaXMgZmxhZworICAgIHRvIG1ha2UgYWxsb2NhdG9yIGRpc3JlZ2FyZCBCdWZmZXItSW1hZ2UgR3JhbnVsYXJpdHkgYW5kIHNvIG1ha2UgYWxsb2NhdGlvbnMKKyAgICBmYXN0ZXIgYW5kIG1vcmUgb3B0aW1hbC4KKyAgICAqLworICAgIFZNQV9QT09MX0NSRUFURV9JR05PUkVfQlVGRkVSX0lNQUdFX0dSQU5VTEFSSVRZX0JJVCA9IDB4MDAwMDAwMDIsCisKKyAgICAvKiogXGJyaWVmIEVuYWJsZXMgYWx0ZXJuYXRpdmUsIGxpbmVhciBhbGxvY2F0aW9uIGFsZ29yaXRobSBpbiB0aGlzIHBvb2wuCisKKyAgICBTcGVjaWZ5IHRoaXMgZmxhZyB0byBlbmFibGUgbGluZWFyIGFsbG9jYXRpb24gYWxnb3JpdGhtLCB3aGljaCBhbHdheXMgY3JlYXRlcworICAgIG5ldyBhbGxvY2F0aW9ucyBhZnRlciBsYXN0IG9uZSBhbmQgZG9lc24ndCByZXVzZSBzcGFjZSBmcm9tIGFsbG9jYXRpb25zIGZyZWVkIGluCisgICAgYmV0d2Vlbi4gSXQgdHJhZGVzIG1lbW9yeSBjb25zdW1wdGlvbiBmb3Igc2ltcGxpZmllZCBhbGdvcml0aG0gYW5kIGRhdGEKKyAgICBzdHJ1Y3R1cmUsIHdoaWNoIGhhcyBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIHVzZXMgbGVzcyBtZW1vcnkgZm9yIG1ldGFkYXRhLgorCisgICAgQnkgdXNpbmcgdGhpcyBmbGFnLCB5b3UgY2FuIGFjaGlldmUgYmVoYXZpb3Igb2YgZnJlZS1hdC1vbmNlLCBzdGFjaywKKyAgICByaW5nIGJ1ZmZlciwgYW5kIGRvdWJsZSBzdGFjay4gRm9yIGRldGFpbHMsIHNlZSBkb2N1bWVudGF0aW9uIGNoYXB0ZXIKKyAgICBccmVmIGxpbmVhcl9hbGdvcml0aG0uCisKKyAgICBXaGVuIHVzaW5nIHRoaXMgZmxhZywgeW91IG11c3Qgc3BlY2lmeSBWbWFQb29sQ3JlYXRlSW5mbzo6bWF4QmxvY2tDb3VudCA9PSAxIChvciAwIGZvciBkZWZhdWx0KS4KKworICAgIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTGluZWFyIGFsbG9jYXRpb24gYWxnb3JpdGhtXShAcmVmIGxpbmVhcl9hbGdvcml0aG0pLgorICAgICovCisgICAgVk1BX1BPT0xfQ1JFQVRFX0xJTkVBUl9BTEdPUklUSE1fQklUID0gMHgwMDAwMDAwNCwKKworICAgIC8qKiBcYnJpZWYgRW5hYmxlcyBhbHRlcm5hdGl2ZSwgYnVkZHkgYWxsb2NhdGlvbiBhbGdvcml0aG0gaW4gdGhpcyBwb29sLgorCisgICAgSXQgb3BlcmF0ZXMgb24gYSB0cmVlIG9mIGJsb2NrcywgZWFjaCBoYXZpbmcgc2l6ZSB0aGF0IGlzIGEgcG93ZXIgb2YgdHdvIGFuZAorICAgIGEgaGFsZiBvZiBpdHMgcGFyZW50J3Mgc2l6ZS4gQ29tcGFyaW5nIHRvIGRlZmF1bHQgYWxnb3JpdGhtLCB0aGlzIG9uZSBwcm92aWRlcworICAgIGZhc3RlciBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gYW5kIGRlY3JlYXNlZCBleHRlcm5hbCBmcmFnbWVudGF0aW9uLAorICAgIGF0IHRoZSBleHBlbnNlIG9mIG1vcmUgbWVtb3J5IHdhc3RlZCAoaW50ZXJuYWwgZnJhZ21lbnRhdGlvbikuCisKKyAgICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0J1ZGR5IGFsbG9jYXRpb24gYWxnb3JpdGhtXShAcmVmIGJ1ZGR5X2FsZ29yaXRobSkuCisgICAgKi8KKyAgICBWTUFfUE9PTF9DUkVBVEVfQlVERFlfQUxHT1JJVEhNX0JJVCA9IDB4MDAwMDAwMDgsCisKKyAgICAvKiogQml0IG1hc2sgdG8gZXh0cmFjdCBvbmx5IGBBTEdPUklUSE1gIGJpdHMgZnJvbSBlbnRpcmUgc2V0IG9mIGZsYWdzLgorICAgICovCisgICAgVk1BX1BPT0xfQ1JFQVRFX0FMR09SSVRITV9NQVNLID0KKyAgICAgICAgVk1BX1BPT0xfQ1JFQVRFX0xJTkVBUl9BTEdPUklUSE1fQklUIHwKKyAgICAgICAgVk1BX1BPT0xfQ1JFQVRFX0JVRERZX0FMR09SSVRITV9CSVQsCisKKyAgICBWTUFfUE9PTF9DUkVBVEVfRkxBR19CSVRTX01BWF9FTlVNID0gMHg3RkZGRkZGRgorfSBWbWFQb29sQ3JlYXRlRmxhZ0JpdHM7Cit0eXBlZGVmIFZrRmxhZ3MgVm1hUG9vbENyZWF0ZUZsYWdzOworCisvKiogXGJyaWVmIERlc2NyaWJlcyBwYXJhbWV0ZXIgb2YgY3JlYXRlZCAjVm1hUG9vbC4KKyovCit0eXBlZGVmIHN0cnVjdCBWbWFQb29sQ3JlYXRlSW5mbyB7CisgICAgLyoqIFxicmllZiBWdWxrYW4gbWVtb3J5IHR5cGUgaW5kZXggdG8gYWxsb2NhdGUgdGhpcyBwb29sIGZyb20uCisgICAgKi8KKyAgICB1aW50MzJfdCBtZW1vcnlUeXBlSW5kZXg7CisgICAgLyoqIFxicmllZiBVc2UgY29tYmluYXRpb24gb2YgI1ZtYVBvb2xDcmVhdGVGbGFnQml0cy4KKyAgICAqLworICAgIFZtYVBvb2xDcmVhdGVGbGFncyBmbGFnczsKKyAgICAvKiogXGJyaWVmIFNpemUgb2YgYSBzaW5nbGUgYFZrRGV2aWNlTWVtb3J5YCBibG9jayB0byBiZSBhbGxvY2F0ZWQgYXMgcGFydCBvZiB0aGlzIHBvb2wsIGluIGJ5dGVzLiBPcHRpb25hbC4KKworICAgIFNwZWNpZnkgbm9uemVybyB0byBzZXQgZXhwbGljaXQsIGNvbnN0YW50IHNpemUgb2YgbWVtb3J5IGJsb2NrcyB1c2VkIGJ5IHRoaXMKKyAgICBwb29sLgorCisgICAgTGVhdmUgMCB0byB1c2UgZGVmYXVsdCBhbmQgbGV0IHRoZSBsaWJyYXJ5IG1hbmFnZSBibG9jayBzaXplcyBhdXRvbWF0aWNhbGx5LgorICAgIFNpemVzIG9mIHBhcnRpY3VsYXIgYmxvY2tzIG1heSB2YXJ5LgorICAgICovCisgICAgVmtEZXZpY2VTaXplIGJsb2NrU2l6ZTsKKyAgICAvKiogXGJyaWVmIE1pbmltdW0gbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBhbHdheXMgYWxsb2NhdGVkIGluIHRoaXMgcG9vbCwgZXZlbiBpZiB0aGV5IHN0YXkgZW1wdHkuCisKKyAgICBTZXQgdG8gMCB0byBoYXZlIG5vIHByZWFsbG9jYXRlZCBibG9ja3MgYW5kIGFsbG93IHRoZSBwb29sIGJlIGNvbXBsZXRlbHkgZW1wdHkuCisgICAgKi8KKyAgICBzaXplX3QgbWluQmxvY2tDb3VudDsKKyAgICAvKiogXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBwb29sLiBPcHRpb25hbC4KKworICAgIFNldCB0byAwIHRvIHVzZSBkZWZhdWx0LCB3aGljaCBpcyBgU0laRV9NQVhgLCB3aGljaCBtZWFucyBubyBsaW1pdC4KKyAgICAKKyAgICBTZXQgdG8gc2FtZSB2YWx1ZSBhcyBWbWFQb29sQ3JlYXRlSW5mbzo6bWluQmxvY2tDb3VudCB0byBoYXZlIGZpeGVkIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkCisgICAgdGhyb3VnaG91dCB3aG9sZSBsaWZldGltZSBvZiB0aGlzIHBvb2wuCisgICAgKi8KKyAgICBzaXplX3QgbWF4QmxvY2tDb3VudDsKKyAgICAvKiogXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIGFkZGl0aW9uYWwgZnJhbWVzIHRoYXQgYXJlIGluIHVzZSBhdCB0aGUgc2FtZSB0aW1lIGFzIGN1cnJlbnQgZnJhbWUuCisKKyAgICBUaGlzIHZhbHVlIGlzIHVzZWQgb25seSB3aGVuIHlvdSBtYWtlIGFsbG9jYXRpb25zIHdpdGgKKyAgICAjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0NBTl9CRUNPTUVfTE9TVF9CSVQgZmxhZy4gU3VjaCBhbGxvY2F0aW9uIGNhbm5vdCBiZWNvbWUKKyAgICBsb3N0IGlmIGFsbG9jYXRpb24ubGFzdFVzZUZyYW1lSW5kZXggPj0gYWxsb2NhdG9yLmN1cnJlbnRGcmFtZUluZGV4IC0gZnJhbWVJblVzZUNvdW50LgorCisgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkb3VibGUtYnVmZmVyIHlvdXIgY29tbWFuZCBidWZmZXJzLCBzbyByZXNvdXJjZXMgdXNlZCBmb3IKKyAgICByZW5kZXJpbmcgaW4gcHJldmlvdXMgZnJhbWUgbWF5IHN0aWxsIGJlIGluIHVzZSBieSB0aGUgR1BVIGF0IHRoZSBtb21lbnQgeW91CisgICAgYWxsb2NhdGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUsIHNldCB0aGlzIHZhbHVlIHRvIDEuCisKKyAgICBJZiB5b3Ugd2FudCB0byBhbGxvdyBhbnkgYWxsb2NhdGlvbnMgb3RoZXIgdGhhbiB1c2VkIGluIHRoZSBjdXJyZW50IGZyYW1lIHRvCisgICAgYmVjb21lIGxvc3QsIHNldCB0aGlzIHZhbHVlIHRvIDAuCisgICAgKi8KKyAgICB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQ7Cit9IFZtYVBvb2xDcmVhdGVJbmZvOworCisvKiogXGJyaWVmIERlc2NyaWJlcyBwYXJhbWV0ZXIgb2YgZXhpc3RpbmcgI1ZtYVBvb2wuCisqLwordHlwZWRlZiBzdHJ1Y3QgVm1hUG9vbFN0YXRzIHsKKyAgICAvKiogXGJyaWVmIFRvdGFsIGFtb3VudCBvZiBgVmtEZXZpY2VNZW1vcnlgIGFsbG9jYXRlZCBmcm9tIFZ1bGthbiBmb3IgdGhpcyBwb29sLCBpbiBieXRlcy4KKyAgICAqLworICAgIFZrRGV2aWNlU2l6ZSBzaXplOworICAgIC8qKiBcYnJpZWYgVG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBwb29sIG5vdCB1c2VkIGJ5IGFueSAjVm1hQWxsb2NhdGlvbi4KKyAgICAqLworICAgIFZrRGV2aWNlU2l6ZSB1bnVzZWRTaXplOworICAgIC8qKiBcYnJpZWYgTnVtYmVyIG9mICNWbWFBbGxvY2F0aW9uIG9iamVjdHMgY3JlYXRlZCBmcm9tIHRoaXMgcG9vbCB0aGF0IHdlcmUgbm90IGRlc3Ryb3llZCBvciBsb3N0LgorICAgICovCisgICAgc2l6ZV90IGFsbG9jYXRpb25Db3VudDsKKyAgICAvKiogXGJyaWVmIE51bWJlciBvZiBjb250aW51b3VzIG1lbW9yeSByYW5nZXMgaW4gdGhlIHBvb2wgbm90IHVzZWQgYnkgYW55ICNWbWFBbGxvY2F0aW9uLgorICAgICovCisgICAgc2l6ZV90IHVudXNlZFJhbmdlQ291bnQ7CisgICAgLyoqIFxicmllZiBTaXplIG9mIHRoZSBsYXJnZXN0IGNvbnRpbnVvdXMgZnJlZSBtZW1vcnkgcmVnaW9uIGF2YWlsYWJsZSBmb3IgbmV3IGFsbG9jYXRpb24uCisKKyAgICBNYWtpbmcgYSBuZXcgYWxsb2NhdGlvbiBvZiB0aGF0IHNpemUgaXMgbm90IGd1YXJhbnRlZWQgdG8gc3VjY2VlZCBiZWNhdXNlIG9mCisgICAgcG9zc2libGUgYWRkaXRpb25hbCBtYXJnaW4gcmVxdWlyZWQgdG8gcmVzcGVjdCBhbGlnbm1lbnQgYW5kIGJ1ZmZlci9pbWFnZQorICAgIGdyYW51bGFyaXR5LgorICAgICovCisgICAgVmtEZXZpY2VTaXplIHVudXNlZFJhbmdlU2l6ZU1heDsKKyAgICAvKiogXGJyaWVmIE51bWJlciBvZiBgVmtEZXZpY2VNZW1vcnlgIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIHRoaXMgcG9vbC4KKyAgICAqLworICAgIHNpemVfdCBibG9ja0NvdW50OworfSBWbWFQb29sU3RhdHM7CisKKy8qKiBcYnJpZWYgQWxsb2NhdGVzIFZ1bGthbiBkZXZpY2UgbWVtb3J5IGFuZCBjcmVhdGVzICNWbWFQb29sIG9iamVjdC4KKworQHBhcmFtIGFsbG9jYXRvciBBbGxvY2F0b3Igb2JqZWN0LgorQHBhcmFtIHBDcmVhdGVJbmZvIFBhcmFtZXRlcnMgb2YgcG9vbCB0byBjcmVhdGUuCitAcGFyYW1bb3V0XSBwUG9vbCBIYW5kbGUgdG8gY3JlYXRlZCBwb29sLgorKi8KK1ZrUmVzdWx0IHZtYUNyZWF0ZVBvb2woCisJVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKwljb25zdCBWbWFQb29sQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisJVm1hUG9vbCogcFBvb2wpOworCisvKiogXGJyaWVmIERlc3Ryb3lzICNWbWFQb29sIG9iamVjdCBhbmQgZnJlZXMgVnVsa2FuIGRldmljZSBtZW1vcnkuCisqLwordm9pZCB2bWFEZXN0cm95UG9vbCgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYVBvb2wgcG9vbCk7CisKKy8qKiBcYnJpZWYgUmV0cmlldmVzIHN0YXRpc3RpY3Mgb2YgZXhpc3RpbmcgI1ZtYVBvb2wgb2JqZWN0LgorCitAcGFyYW0gYWxsb2NhdG9yIEFsbG9jYXRvciBvYmplY3QuCitAcGFyYW0gcG9vbCBQb29sIG9iamVjdC4KK0BwYXJhbVtvdXRdIHBQb29sU3RhdHMgU3RhdGlzdGljcyBvZiBzcGVjaWZpZWQgcG9vbC4KKyovCit2b2lkIHZtYUdldFBvb2xTdGF0cygKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYVBvb2wgcG9vbCwKKyAgICBWbWFQb29sU3RhdHMqIHBQb29sU3RhdHMpOworCisvKiogXGJyaWVmIE1hcmtzIGFsbCBhbGxvY2F0aW9ucyBpbiBnaXZlbiBwb29sIGFzIGxvc3QgaWYgdGhleSBhcmUgbm90IHVzZWQgaW4gY3VycmVudCBmcmFtZSBvciBWbWFQb29sQ3JlYXRlSW5mbzo6ZnJhbWVJblVzZUNvdW50IGJhY2sgZnJvbSBub3cuCisKK0BwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIG9iamVjdC4KK0BwYXJhbSBwb29sIFBvb2wuCitAcGFyYW1bb3V0XSBwTG9zdEFsbG9jYXRpb25Db3VudCBOdW1iZXIgb2YgYWxsb2NhdGlvbnMgbWFya2VkIGFzIGxvc3QuIE9wdGlvbmFsIC0gcGFzcyBudWxsIGlmIHlvdSBkb24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uCisqLwordm9pZCB2bWFNYWtlUG9vbEFsbG9jYXRpb25zTG9zdCgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYVBvb2wgcG9vbCwKKyAgICBzaXplX3QqIHBMb3N0QWxsb2NhdGlvbkNvdW50KTsKKworLyoqIFxicmllZiBDaGVja3MgbWFnaWMgbnVtYmVyIGluIG1hcmdpbnMgYXJvdW5kIGFsbCBhbGxvY2F0aW9ucyBpbiBnaXZlbiBtZW1vcnkgcG9vbCBpbiBzZWFyY2ggZm9yIGNvcnJ1cHRpb25zLgorCitDb3JydXB0aW9uIGRldGVjdGlvbiBpcyBlbmFibGVkIG9ubHkgd2hlbiBgVk1BX0RFQlVHX0RFVEVDVF9DT1JSVVBUSU9OYCBtYWNybyBpcyBkZWZpbmVkIHRvIG5vbnplcm8sCitgVk1BX0RFQlVHX01BUkdJTmAgaXMgZGVmaW5lZCB0byBub256ZXJvIGFuZCB0aGUgcG9vbCBpcyBjcmVhdGVkIGluIG1lbW9yeSB0eXBlIHRoYXQgaXMKK2BIT1NUX1ZJU0lCTEVgIGFuZCBgSE9TVF9DT0hFUkVOVGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NvcnJ1cHRpb24gZGV0ZWN0aW9uXShAcmVmIGRlYnVnZ2luZ19tZW1vcnlfdXNhZ2VfY29ycnVwdGlvbl9kZXRlY3Rpb24pLgorCitQb3NzaWJsZSByZXR1cm4gdmFsdWVzOgorCistIGBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UYCAtIGNvcnJ1cHRpb24gZGV0ZWN0aW9uIGlzIG5vdCBlbmFibGVkIGZvciBzcGVjaWZpZWQgcG9vbC4KKy0gYFZLX1NVQ0NFU1NgIC0gY29ycnVwdGlvbiBkZXRlY3Rpb24gaGFzIGJlZW4gcGVyZm9ybWVkIGFuZCBzdWNjZWVkZWQuCistIGBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFRgIC0gY29ycnVwdGlvbiBkZXRlY3Rpb24gaGFzIGJlZW4gcGVyZm9ybWVkIGFuZCBmb3VuZCBtZW1vcnkgY29ycnVwdGlvbnMgYXJvdW5kIG9uZSBvZiB0aGUgYWxsb2NhdGlvbnMuCisgIGBWTUFfQVNTRVJUYCBpcyBhbHNvIGZpcmVkIGluIHRoYXQgY2FzZS4KKy0gT3RoZXIgdmFsdWU6IEVycm9yIHJldHVybmVkIGJ5IFZ1bGthbiwgZS5nLiBtZW1vcnkgbWFwcGluZyBmYWlsdXJlLgorKi8KK1ZrUmVzdWx0IHZtYUNoZWNrUG9vbENvcnJ1cHRpb24oVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwgVm1hUG9vbCBwb29sKTsKKworLyoqIFxzdHJ1Y3QgVm1hQWxsb2NhdGlvbgorXGJyaWVmIFJlcHJlc2VudHMgc2luZ2xlIG1lbW9yeSBhbGxvY2F0aW9uLgorCitJdCBtYXkgYmUgZWl0aGVyIGRlZGljYXRlZCBibG9jayBvZiBgVmtEZXZpY2VNZW1vcnlgIG9yIGEgc3BlY2lmaWMgcmVnaW9uIG9mIGEgYmlnZ2VyIGJsb2NrIG9mIHRoaXMgdHlwZQorcGx1cyB1bmlxdWUgb2Zmc2V0LgorCitUaGVyZSBhcmUgbXVsdGlwbGUgd2F5cyB0byBjcmVhdGUgc3VjaCBvYmplY3QuCitZb3UgbmVlZCB0byBmaWxsIHN0cnVjdHVyZSBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mby4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBbQ2hvb3NpbmcgbWVtb3J5IHR5cGVdKEByZWYgY2hvb3NpbmdfbWVtb3J5X3R5cGUpLgorCitBbHRob3VnaCB0aGUgbGlicmFyeSBwcm92aWRlcyBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdGhhdCBjcmVhdGUgVnVsa2FuIGJ1ZmZlciBvciBpbWFnZSwKK2FsbG9jYXRlIG1lbW9yeSBmb3IgaXQgYW5kIGJpbmQgdGhlbSB0b2dldGhlciwKK2JpbmRpbmcgb2YgdGhlIGFsbG9jYXRpb24gdG8gYSBidWZmZXIgb3IgYW4gaW1hZ2UgaXMgb3V0IG9mIHNjb3BlIG9mIHRoZSBhbGxvY2F0aW9uIGl0c2VsZi4KK0FsbG9jYXRpb24gb2JqZWN0IGNhbiBleGlzdCB3aXRob3V0IGJ1ZmZlci9pbWFnZSBib3VuZCwKK2JpbmRpbmcgY2FuIGJlIGRvbmUgbWFudWFsbHkgYnkgdGhlIHVzZXIsIGFuZCBkZXN0cnVjdGlvbiBvZiBpdCBjYW4gYmUgZG9uZQoraW5kZXBlbmRlbnRseSBvZiBkZXN0cnVjdGlvbiBvZiB0aGUgYWxsb2NhdGlvbi4KKworVGhlIG9iamVjdCBhbHNvIHJlbWVtYmVycyBpdHMgc2l6ZSBhbmQgc29tZSBvdGhlciBpbmZvcm1hdGlvbi4KK1RvIHJldHJpZXZlIHRoaXMgaW5mb3JtYXRpb24sIHVzZSBmdW5jdGlvbiB2bWFHZXRBbGxvY2F0aW9uSW5mbygpIGFuZCBpbnNwZWN0CityZXR1cm5lZCBzdHJ1Y3R1cmUgVm1hQWxsb2NhdGlvbkluZm8uCisKK1NvbWUga2luZHMgYWxsb2NhdGlvbnMgY2FuIGJlIGluIGxvc3Qgc3RhdGUuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtMb3N0IGFsbG9jYXRpb25zXShAcmVmIGxvc3RfYWxsb2NhdGlvbnMpLgorKi8KK1ZLX0RFRklORV9IQU5ETEUoVm1hQWxsb2NhdGlvbikKKworLyoqIFxicmllZiBQYXJhbWV0ZXJzIG9mICNWbWFBbGxvY2F0aW9uIG9iamVjdHMsIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyBmdW5jdGlvbiB2bWFHZXRBbGxvY2F0aW9uSW5mbygpLgorKi8KK3R5cGVkZWYgc3RydWN0IFZtYUFsbG9jYXRpb25JbmZvIHsKKyAgICAvKiogXGJyaWVmIE1lbW9yeSB0eXBlIGluZGV4IHRoYXQgdGhpcyBhbGxvY2F0aW9uIHdhcyBhbGxvY2F0ZWQgZnJvbS4KKyAgICAKKyAgICBJdCBuZXZlciBjaGFuZ2VzLgorICAgICovCisgICAgdWludDMyX3QgbWVtb3J5VHlwZTsKKyAgICAvKiogXGJyaWVmIEhhbmRsZSB0byBWdWxrYW4gbWVtb3J5IG9iamVjdC4KKworICAgIFNhbWUgbWVtb3J5IG9iamVjdCBjYW4gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIGFsbG9jYXRpb25zLgorICAgIAorICAgIEl0IGNhbiBjaGFuZ2UgYWZ0ZXIgY2FsbCB0byB2bWFEZWZyYWdtZW50KCkgaWYgdGhpcyBhbGxvY2F0aW9uIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24sIG9yIGlmIGFsbG9jYXRpb24gaXMgbG9zdC4KKworICAgIElmIHRoZSBhbGxvY2F0aW9uIGlzIGxvc3QsIGl0IGlzIGVxdWFsIHRvIGBWS19OVUxMX0hBTkRMRWAuCisgICAgKi8KKyAgICBWa0RldmljZU1lbW9yeSBkZXZpY2VNZW1vcnk7CisgICAgLyoqIFxicmllZiBPZmZzZXQgaW50byBkZXZpY2VNZW1vcnkgb2JqZWN0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBhbGxvY2F0aW9uLCBpbiBieXRlcy4gKGRldmljZU1lbW9yeSwgb2Zmc2V0KSBwYWlyIGlzIHVuaXF1ZSB0byB0aGlzIGFsbG9jYXRpb24uCisKKyAgICBJdCBjYW4gY2hhbmdlIGFmdGVyIGNhbGwgdG8gdm1hRGVmcmFnbWVudCgpIGlmIHRoaXMgYWxsb2NhdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLCBvciBpZiBhbGxvY2F0aW9uIGlzIGxvc3QuCisgICAgKi8KKyAgICBWa0RldmljZVNpemUgb2Zmc2V0OworICAgIC8qKiBcYnJpZWYgU2l6ZSBvZiB0aGlzIGFsbG9jYXRpb24sIGluIGJ5dGVzLgorCisgICAgSXQgbmV2ZXIgY2hhbmdlcywgdW5sZXNzIGFsbG9jYXRpb24gaXMgbG9zdC4KKyAgICAqLworICAgIFZrRGV2aWNlU2l6ZSBzaXplOworICAgIC8qKiBcYnJpZWYgUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgYWxsb2NhdGlvbiBhcyBtYXBwZWQgZGF0YS4KKworICAgIElmIHRoZSBhbGxvY2F0aW9uIGhhc24ndCBiZWVuIG1hcHBlZCB1c2luZyB2bWFNYXBNZW1vcnkoKSBhbmQgaGFzbid0IGJlZW4KKyAgICBjcmVhdGVkIHdpdGggI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9NQVBQRURfQklUIGZsYWcsIHRoaXMgdmFsdWUgbnVsbC4KKworICAgIEl0IGNhbiBjaGFuZ2UgYWZ0ZXIgY2FsbCB0byB2bWFNYXBNZW1vcnkoKSwgdm1hVW5tYXBNZW1vcnkoKS4KKyAgICBJdCBjYW4gYWxzbyBjaGFuZ2UgYWZ0ZXIgY2FsbCB0byB2bWFEZWZyYWdtZW50KCkgaWYgdGhpcyBhbGxvY2F0aW9uIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCisgICAgKi8KKyAgICB2b2lkKiBwTWFwcGVkRGF0YTsKKyAgICAvKiogXGJyaWVmIEN1c3RvbSBnZW5lcmFsLXB1cnBvc2UgcG9pbnRlciB0aGF0IHdhcyBwYXNzZWQgYXMgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm86OnBVc2VyRGF0YSBvciBzZXQgdXNpbmcgdm1hU2V0QWxsb2NhdGlvblVzZXJEYXRhKCkuCisKKyAgICBJdCBjYW4gY2hhbmdlIGFmdGVyIGNhbGwgdG8gdm1hU2V0QWxsb2NhdGlvblVzZXJEYXRhKCkgZm9yIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAqLworICAgIHZvaWQqIHBVc2VyRGF0YTsKK30gVm1hQWxsb2NhdGlvbkluZm87CisKKy8qKiBcYnJpZWYgR2VuZXJhbCBwdXJwb3NlIG1lbW9yeSBhbGxvY2F0aW9uLgorCitAcGFyYW1bb3V0XSBwQWxsb2NhdGlvbiBIYW5kbGUgdG8gYWxsb2NhdGVkIG1lbW9yeS4KK0BwYXJhbVtvdXRdIHBBbGxvY2F0aW9uSW5mbyBPcHRpb25hbC4gSW5mb3JtYXRpb24gYWJvdXQgYWxsb2NhdGVkIG1lbW9yeS4gSXQgY2FuIGJlIGxhdGVyIGZldGNoZWQgdXNpbmcgZnVuY3Rpb24gdm1hR2V0QWxsb2NhdGlvbkluZm8oKS4KKworWW91IHNob3VsZCBmcmVlIHRoZSBtZW1vcnkgdXNpbmcgdm1hRnJlZU1lbW9yeSgpIG9yIHZtYUZyZWVNZW1vcnlQYWdlcygpLgorCitJdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ugdm1hQWxsb2NhdGVNZW1vcnlGb3JCdWZmZXIoKSwgdm1hQWxsb2NhdGVNZW1vcnlGb3JJbWFnZSgpLAordm1hQ3JlYXRlQnVmZmVyKCksIHZtYUNyZWF0ZUltYWdlKCkgaW5zdGVhZCB3aGVuZXZlciBwb3NzaWJsZS4KKyovCitWa1Jlc3VsdCB2bWFBbGxvY2F0ZU1lbW9yeSgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzKiBwVmtNZW1vcnlSZXF1aXJlbWVudHMsCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9uLAorICAgIFZtYUFsbG9jYXRpb25JbmZvKiBwQWxsb2NhdGlvbkluZm8pOworCisvKiogXGJyaWVmIEdlbmVyYWwgcHVycG9zZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgbXVsdGlwbGUgYWxsb2NhdGlvbiBvYmplY3RzIGF0IG9uY2UuCisKK0BwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIG9iamVjdC4KK0BwYXJhbSBwVmtNZW1vcnlSZXF1aXJlbWVudHMgTWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZWFjaCBhbGxvY2F0aW9uLgorQHBhcmFtIHBDcmVhdGVJbmZvIENyZWF0aW9uIHBhcmFtZXRlcnMgZm9yIGVhY2ggYWxsb2N0aW9uLgorQHBhcmFtIGFsbG9jYXRpb25Db3VudCBOdW1iZXIgb2YgYWxsb2NhdGlvbnMgdG8gbWFrZS4KK0BwYXJhbVtvdXRdIHBBbGxvY2F0aW9ucyBQb2ludGVyIHRvIGFycmF5IHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBoYW5kbGVzIHRvIGNyZWF0ZWQgYWxsb2NhdGlvbnMuCitAcGFyYW1bb3V0XSBwQWxsb2NhdGlvbkluZm8gT3B0aW9uYWwuIFBvaW50ZXIgdG8gYXJyYXkgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHBhcmFtZXRlcnMgb2YgY3JlYXRlZCBhbGxvY2F0aW9ucy4KKworWW91IHNob3VsZCBmcmVlIHRoZSBtZW1vcnkgdXNpbmcgdm1hRnJlZU1lbW9yeSgpIG9yIHZtYUZyZWVNZW1vcnlQYWdlcygpLgorCitXb3JkICJwYWdlcyIgaXMganVzdCBhIHN1Z2dlc3Rpb24gdG8gdXNlIHRoaXMgZnVuY3Rpb24gdG8gYWxsb2NhdGUgcGllY2VzIG9mIG1lbW9yeSBuZWVkZWQgZm9yIHNwYXJzZSBiaW5kaW5nLgorSXQgaXMganVzdCBhIGdlbmVyYWwgcHVycG9zZSBhbGxvY2F0aW9uIGZ1bmN0aW9uIGFibGUgdG8gbWFrZSBtdWx0aXBsZSBhbGxvY2F0aW9ucyBhdCBvbmNlLgorSXQgbWF5IGJlIGludGVybmFsbHkgb3B0aW1pemVkIHRvIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gY2FsbGluZyB2bWFBbGxvY2F0ZU1lbW9yeSgpIGBhbGxvY2F0aW9uQ291bnRgIHRpbWVzLgorCitBbGwgYWxsb2NhdGlvbnMgYXJlIG1hZGUgdXNpbmcgc2FtZSBwYXJhbWV0ZXJzLiBBbGwgb2YgdGhlbSBhcmUgY3JlYXRlZCBvdXQgb2YgdGhlIHNhbWUgbWVtb3J5IHBvb2wgYW5kIHR5cGUuCitJZiBhbnkgYWxsb2NhdGlvbiBmYWlscywgYWxsIGFsbG9jYXRpb25zIGFscmVhZHkgbWFkZSB3aXRoaW4gdGhpcyBmdW5jdGlvbiBjYWxsIGFyZSBhbHNvIGZyZWVkLCBzbyB0aGF0IHdoZW4KK3JldHVybmVkIHJlc3VsdCBpcyBub3QgYFZLX1NVQ0NFU1NgLCBgcEFsbG9jYXRpb25gIGFycmF5IGlzIGFsd2F5cyBlbnRpcmVseSBmaWxsZWQgd2l0aCBgVktfTlVMTF9IQU5ETEVgLgorKi8KK1ZrUmVzdWx0IHZtYUFsbG9jYXRlTWVtb3J5UGFnZXMoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyogcFZrTWVtb3J5UmVxdWlyZW1lbnRzLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBzaXplX3QgYWxsb2NhdGlvbkNvdW50LAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9ucywKKyAgICBWbWFBbGxvY2F0aW9uSW5mbyogcEFsbG9jYXRpb25JbmZvKTsKKworLyoqCitAcGFyYW1bb3V0XSBwQWxsb2NhdGlvbiBIYW5kbGUgdG8gYWxsb2NhdGVkIG1lbW9yeS4KK0BwYXJhbVtvdXRdIHBBbGxvY2F0aW9uSW5mbyBPcHRpb25hbC4gSW5mb3JtYXRpb24gYWJvdXQgYWxsb2NhdGVkIG1lbW9yeS4gSXQgY2FuIGJlIGxhdGVyIGZldGNoZWQgdXNpbmcgZnVuY3Rpb24gdm1hR2V0QWxsb2NhdGlvbkluZm8oKS4KKworWW91IHNob3VsZCBmcmVlIHRoZSBtZW1vcnkgdXNpbmcgdm1hRnJlZU1lbW9yeSgpLgorKi8KK1ZrUmVzdWx0IHZtYUFsbG9jYXRlTWVtb3J5Rm9yQnVmZmVyKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVmtCdWZmZXIgYnVmZmVyLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbiwKKyAgICBWbWFBbGxvY2F0aW9uSW5mbyogcEFsbG9jYXRpb25JbmZvKTsKKworLy8vIEZ1bmN0aW9uIHNpbWlsYXIgdG8gdm1hQWxsb2NhdGVNZW1vcnlGb3JCdWZmZXIoKS4KK1ZrUmVzdWx0IHZtYUFsbG9jYXRlTWVtb3J5Rm9ySW1hZ2UoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWa0ltYWdlIGltYWdlLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbiwKKyAgICBWbWFBbGxvY2F0aW9uSW5mbyogcEFsbG9jYXRpb25JbmZvKTsKKworLyoqIFxicmllZiBGcmVlcyBtZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgdXNpbmcgdm1hQWxsb2NhdGVNZW1vcnkoKSwgdm1hQWxsb2NhdGVNZW1vcnlGb3JCdWZmZXIoKSwgb3Igdm1hQWxsb2NhdGVNZW1vcnlGb3JJbWFnZSgpLgorCitQYXNzaW5nIGBWS19OVUxMX0hBTkRMRWAgYXMgYGFsbG9jYXRpb25gIGlzIHZhbGlkLiBTdWNoIGZ1bmN0aW9uIGNhbGwgaXMganVzdCBza2lwcGVkLgorKi8KK3ZvaWQgdm1hRnJlZU1lbW9yeSgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CisKKy8qKiBcYnJpZWYgRnJlZXMgbWVtb3J5IGFuZCBkZXN0cm95cyBtdWx0aXBsZSBhbGxvY2F0aW9ucy4KKworV29yZCAicGFnZXMiIGlzIGp1c3QgYSBzdWdnZXN0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZyZWUgcGllY2VzIG9mIG1lbW9yeSB1c2VkIGZvciBzcGFyc2UgYmluZGluZy4KK0l0IGlzIGp1c3QgYSBnZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gdG8gZnJlZSBtZW1vcnkgYW5kIGRlc3Ryb3kgYWxsb2NhdGlvbnMgbWFkZSB1c2luZyBlLmcuIHZtYUFsbG9jYXRlTWVtb3J5KCksCit2bWFBbGxvY2F0ZU1lbW9yeVBhZ2VzKCkgYW5kIG90aGVyIGZ1bmN0aW9ucy4KK0l0IG1heSBiZSBpbnRlcm5hbGx5IG9wdGltaXplZCB0byBiZSBtb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcgdm1hRnJlZU1lbW9yeSgpIGBhbGxvY2F0aW9uQ291bnRgIHRpbWVzLgorCitBbGxvY2F0aW9ucyBpbiBgcEFsbG9jYXRpb25zYCBhcnJheSBjYW4gY29tZSBmcm9tIGFueSBtZW1vcnkgcG9vbHMgYW5kIHR5cGVzLgorUGFzc2luZyBgVktfTlVMTF9IQU5ETEVgIGFzIGVsZW1lbnRzIG9mIGBwQWxsb2NhdGlvbnNgIGFycmF5IGlzIHZhbGlkLiBTdWNoIGVudHJpZXMgYXJlIGp1c3Qgc2tpcHBlZC4KKyovCit2b2lkIHZtYUZyZWVNZW1vcnlQYWdlcygKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIHNpemVfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKTsKKworLyoqIFxicmllZiBUcmllcyB0byByZXNpemUgYW4gYWxsb2NhdGlvbiBpbiBwbGFjZSwgaWYgdGhlcmUgaXMgZW5vdWdoIGZyZWUgbWVtb3J5IGFmdGVyIGl0LgorCitUcmllcyB0byBjaGFuZ2UgYWxsb2NhdGlvbidzIHNpemUgd2l0aG91dCBtb3Zpbmcgb3IgcmVhbGxvY2F0aW5nIGl0LgorWW91IGNhbiBib3RoIHNocmluayBhbmQgZ3JvdyBhbGxvY2F0aW9uIHNpemUuCitXaGVuIGdyb3dpbmcsIGl0IHN1Y2NlZWRzIG9ubHkgd2hlbiB0aGUgYWxsb2NhdGlvbiBiZWxvbmdzIHRvIGEgbWVtb3J5IGJsb2NrIHdpdGggZW5vdWdoCitmcmVlIHNwYWNlIGFmdGVyIGl0LgorCitSZXR1cm5zIGBWS19TVUNDRVNTYCBpZiBhbGxvY2F0aW9uJ3Mgc2l6ZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2hhbmdlZC4KK1JldHVybnMgYFZLX0VSUk9SX09VVF9PRl9QT09MX01FTU9SWWAgaWYgYWxsb2NhdGlvbidzIHNpemUgY291bGQgbm90IGJlIGNoYW5nZWQuCisKK0FmdGVyIHN1Y2Nlc3NmdWwgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBWbWFBbGxvY2F0aW9uSW5mbzo6c2l6ZSBvZiB0aGlzIGFsbG9jYXRpb24gY2hhbmdlcy4KK0FsbCBvdGhlciBwYXJhbWV0ZXJzIHN0YXkgdGhlIHNhbWU6IG1lbW9yeSBwb29sIGFuZCB0eXBlLCBhbGlnbm1lbnQsIG9mZnNldCwgbWFwcGVkIHBvaW50ZXIuCisKKy0gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIG9uIGFsbG9jYXRpb24gdGhhdCBpcyBpbiBsb3N0IHN0YXRlIGZhaWxzIHdpdGggcmVzdWx0IGBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFRgLgorLSBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBgbmV3U2l6ZWAgc2FtZSBhcyBjdXJyZW50IGFsbG9jYXRpb24gc2l6ZSBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgYFZLX1NVQ0NFU1NgLgorLSBSZXNpemluZyBkZWRpY2F0ZWQgYWxsb2NhdGlvbnMsIGFzIHdlbGwgYXMgYWxsb2NhdGlvbnMgY3JlYXRlZCBpbiBwb29scyB0aGF0IHVzZSBsaW5lYXIKKyAgb3IgYnVkZHkgYWxnb3JpdGhtLCBpcyBub3Qgc3VwcG9ydGVkLgorICBUaGUgZnVuY3Rpb24gcmV0dXJucyBgVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVGAgaW4gc3VjaCBjYXNlcy4KKyAgU3VwcG9ydCBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4KKyovCitWa1Jlc3VsdCB2bWFSZXNpemVBbGxvY2F0aW9uKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIFZrRGV2aWNlU2l6ZSBuZXdTaXplKTsKKworLyoqIFxicmllZiBSZXR1cm5zIGN1cnJlbnQgaW5mb3JtYXRpb24gYWJvdXQgc3BlY2lmaWVkIGFsbG9jYXRpb24gYW5kIGF0b21pY2FsbHkgbWFya3MgaXQgYXMgdXNlZCBpbiBjdXJyZW50IGZyYW1lLgorCitDdXJyZW50IHBhcmFtdGVycyBvZiBnaXZlbiBhbGxvY2F0aW9uIGFyZSByZXR1cm5lZCBpbiBgcEFsbG9jYXRpb25JbmZvYC4KKworVGhpcyBmdW5jdGlvbiBhbHNvIGF0b21pY2FsbHkgInRvdWNoZXMiIGFsbG9jYXRpb24gLSBtYXJrcyBpdCBhcyB1c2VkIGluIGN1cnJlbnQgZnJhbWUsCitqdXN0IGxpa2Ugdm1hVG91Y2hBbGxvY2F0aW9uKCkuCitJZiB0aGUgYWxsb2NhdGlvbiBpcyBpbiBsb3N0IHN0YXRlLCBgcEFsbG9jYXRpb25JbmZvLT5kZXZpY2VNZW1vcnkgPT0gVktfTlVMTF9IQU5ETEVgLgorCitBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIHVzZXMgYXRvbWljcyBhbmQgZG9lc24ndCBsb2NrIGFueSBtdXRleCwgc28gaXQgc2hvdWxkIGJlIHF1aXRlIGVmZmljaWVudCwKK3lvdSBjYW4gYXZvaWQgY2FsbGluZyBpdCB0b28gb2Z0ZW4uCisKKy0gWW91IGNhbiByZXRyaWV2ZSBzYW1lIFZtYUFsbG9jYXRpb25JbmZvIHN0cnVjdHVyZSB3aGlsZSBjcmVhdGluZyB5b3VyIHJlc291cmNlLCBmcm9tIGZ1bmN0aW9uCisgIHZtYUNyZWF0ZUJ1ZmZlcigpLCB2bWFDcmVhdGVJbWFnZSgpLiBZb3UgY2FuIHJlbWVtYmVyIGl0IGlmIHlvdSBhcmUgc3VyZSBwYXJhbWV0ZXJzIGRvbid0IGNoYW5nZQorICAoZS5nLiBkdWUgdG8gZGVmcmFnbWVudGF0aW9uIG9yIGFsbG9jYXRpb24gYmVjb21pbmcgbG9zdCkuCistIElmIHlvdSBqdXN0IHdhbnQgdG8gY2hlY2sgaWYgYWxsb2NhdGlvbiBpcyBub3QgbG9zdCwgdm1hVG91Y2hBbGxvY2F0aW9uKCkgd2lsbCB3b3JrIGZhc3Rlci4KKyovCit2b2lkIHZtYUdldEFsbG9jYXRpb25JbmZvKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIFZtYUFsbG9jYXRpb25JbmZvKiBwQWxsb2NhdGlvbkluZm8pOworCisvKiogXGJyaWVmIFJldHVybnMgYFZLX1RSVUVgIGlmIGFsbG9jYXRpb24gaXMgbm90IGxvc3QgYW5kIGF0b21pY2FsbHkgbWFya3MgaXQgYXMgdXNlZCBpbiBjdXJyZW50IGZyYW1lLgorCitJZiB0aGUgYWxsb2NhdGlvbiBoYXMgYmVlbiBjcmVhdGVkIHdpdGggI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9DQU5fQkVDT01FX0xPU1RfQklUIGZsYWcsCit0aGlzIGZ1bmN0aW9uIHJldHVybnMgYFZLX1RSVUVgIGlmIGl0J3Mgbm90IGluIGxvc3Qgc3RhdGUsIHNvIGl0IGNhbiBzdGlsbCBiZSB1c2VkLgorSXQgdGhlbiBhbHNvIGF0b21pY2FsbHkgInRvdWNoZXMiIHRoZSBhbGxvY2F0aW9uIC0gbWFya3MgaXQgYXMgdXNlZCBpbiBjdXJyZW50IGZyYW1lLAorc28gdGhhdCB5b3UgY2FuIGJlIHN1cmUgaXQgd29uJ3QgYmVjb21lIGxvc3QgaW4gY3VycmVudCBmcmFtZSBvciBuZXh0IGBmcmFtZUluVXNlQ291bnRgIGZyYW1lcy4KKworSWYgdGhlIGFsbG9jYXRpb24gaXMgaW4gbG9zdCBzdGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYFZLX0ZBTFNFYC4KK01lbW9yeSBvZiBzdWNoIGFsbG9jYXRpb24sIGFzIHdlbGwgYXMgYnVmZmVyIG9yIGltYWdlIGJvdW5kIHRvIGl0LCBzaG91bGQgbm90IGJlIHVzZWQuCitMb3N0IGFsbG9jYXRpb24gYW5kIHRoZSBidWZmZXIvaW1hZ2Ugc3RpbGwgbmVlZCB0byBiZSBkZXN0cm95ZWQuCisKK0lmIHRoZSBhbGxvY2F0aW9uIGhhcyBiZWVuIGNyZWF0ZWQgd2l0aG91dCAjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0NBTl9CRUNPTUVfTE9TVF9CSVQgZmxhZywKK3RoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYFZLX1RSVUVgLgorKi8KK1ZrQm9vbDMyIHZtYVRvdWNoQWxsb2NhdGlvbigKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CisKKy8qKiBcYnJpZWYgU2V0cyBwVXNlckRhdGEgaW4gZ2l2ZW4gYWxsb2NhdGlvbiB0byBuZXcgdmFsdWUuCisKK0lmIHRoZSBhbGxvY2F0aW9uIHdhcyBjcmVhdGVkIHdpdGggVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1VTRVJfREFUQV9DT1BZX1NUUklOR19CSVQsCitwVXNlckRhdGEgbXVzdCBiZSBlaXRoZXIgbnVsbCwgb3IgcG9pbnRlciB0byBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIFRoZSBmdW5jdGlvbgorbWFrZXMgbG9jYWwgY29weSBvZiB0aGUgc3RyaW5nIGFuZCBzZXRzIGl0IGFzIGFsbG9jYXRpb24ncyBgcFVzZXJEYXRhYC4gU3RyaW5nCitwYXNzZWQgYXMgcFVzZXJEYXRhIGRvZXNuJ3QgbmVlZCB0byBiZSB2YWxpZCBmb3Igd2hvbGUgbGlmZXRpbWUgb2YgdGhlIGFsbG9jYXRpb24gLQoreW91IGNhbiBmcmVlIGl0IGFmdGVyIHRoaXMgY2FsbC4gU3RyaW5nIHByZXZpb3VzbHkgcG9pbnRlZCBieSBhbGxvY2F0aW9uJ3MKK3BVc2VyRGF0YSBpcyBmcmVlZCBmcm9tIG1lbW9yeS4KKworSWYgdGhlIGZsYWcgd2FzIG5vdCB1c2VkLCB0aGUgdmFsdWUgb2YgcG9pbnRlciBgcFVzZXJEYXRhYCBpcyBqdXN0IGNvcGllZCB0bworYWxsb2NhdGlvbidzIGBwVXNlckRhdGFgLiBJdCBpcyBvcGFxdWUsIHNvIHlvdSBjYW4gdXNlIGl0IGhvd2V2ZXIgeW91IHdhbnQgLSBlLmcuCithcyBhIHBvaW50ZXIsIG9yZGluYWwgbnVtYmVyIG9yIHNvbWUgaGFuZGxlIHRvIHlvdSBvd24gZGF0YS4KKyovCit2b2lkIHZtYVNldEFsbG9jYXRpb25Vc2VyRGF0YSgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiwKKyAgICB2b2lkKiBwVXNlckRhdGEpOworCisvKiogXGJyaWVmIENyZWF0ZXMgbmV3IGFsbG9jYXRpb24gdGhhdCBpcyBpbiBsb3N0IHN0YXRlIGZyb20gdGhlIGJlZ2lubmluZy4KKworSXQgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgbmVlZCBhIGR1bW15LCBub24tbnVsbCBhbGxvY2F0aW9uLgorCitZb3Ugc3RpbGwgbmVlZCB0byBkZXN0cm95IGNyZWF0ZWQgb2JqZWN0IHVzaW5nIHZtYUZyZWVNZW1vcnkoKS4KKworUmV0dXJuZWQgYWxsb2NhdGlvbiBpcyBub3QgdGllZCB0byBhbnkgc3BlY2lmaWMgbWVtb3J5IHBvb2wgb3IgbWVtb3J5IHR5cGUgYW5kCitub3QgYm91bmQgdG8gYW55IGltYWdlIG9yIGJ1ZmZlci4gSXQgaGFzIHNpemUgPSAwLiBJdCBjYW5ub3QgYmUgdHVybmVkIGludG8KK2EgcmVhbCwgbm9uLWVtcHR5IGFsbG9jYXRpb24uCisqLwordm9pZCB2bWFDcmVhdGVMb3N0QWxsb2NhdGlvbigKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9uKTsKKworLyoqIFxicmllZiBNYXBzIG1lbW9yeSByZXByZXNlbnRlZCBieSBnaXZlbiBhbGxvY2F0aW9uIGFuZCByZXR1cm5zIHBvaW50ZXIgdG8gaXQuCisKK01hcHMgbWVtb3J5IHJlcHJlc2VudGVkIGJ5IGdpdmVuIGFsbG9jYXRpb24gdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIHRvIENQVSBjb2RlLgorV2hlbiBzdWNjZWVkZWQsIGAqcHBEYXRhYCBjb250YWlucyBwb2ludGVyIHRvIGZpcnN0IGJ5dGUgb2YgdGhpcyBtZW1vcnkuCitJZiB0aGUgYWxsb2NhdGlvbiBpcyBwYXJ0IG9mIGJpZ2dlciBgVmtEZXZpY2VNZW1vcnlgIGJsb2NrLCB0aGUgcG9pbnRlciBpcworY29ycmVjdGx5IG9mZnNldGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgcmVnaW9uIGFzc2lnbmVkIHRvIHRoaXMgcGFydGljdWxhcgorYWxsb2NhdGlvbi4KKworTWFwcGluZyBpcyBpbnRlcm5hbGx5IHJlZmVyZW5jZS1jb3VudGVkIGFuZCBzeW5jaHJvbml6ZWQsIHNvIGRlc3BpdGUgcmF3IFZ1bGthbgorZnVuY3Rpb24gYHZrTWFwTWVtb3J5KClgIGNhbm5vdCBiZSB1c2VkIHRvIG1hcCBzYW1lIGJsb2NrIG9mIGBWa0RldmljZU1lbW9yeWAKK211bHRpcGxlIHRpbWVzIHNpbXVsdGFuZW91c2x5LCBpdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiBhbGxvY2F0aW9ucworYXNzaWduZWQgdG8gdGhlIHNhbWUgbWVtb3J5IGJsb2NrLiBBY3R1YWwgVnVsa2FuIG1lbW9yeSB3aWxsIGJlIG1hcHBlZCBvbiBmaXJzdAorbWFwcGluZyBhbmQgdW5tYXBwZWQgb24gbGFzdCB1bm1hcHBpbmcuCisKK0lmIHRoZSBmdW5jdGlvbiBzdWNjZWVkZWQsIHlvdSBtdXN0IGNhbGwgdm1hVW5tYXBNZW1vcnkoKSB0byB1bm1hcCB0aGUKK2FsbG9jYXRpb24gd2hlbiBtYXBwaW5nIGlzIG5vIGxvbmdlciBuZWVkZWQgb3IgYmVmb3JlIGZyZWVpbmcgdGhlIGFsbG9jYXRpb24sIGF0Cit0aGUgbGF0ZXN0LgorCitJdCBhbHNvIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGFsbG9jYXRpb24uIFlvdQorbXVzdCBjYWxsIHZtYVVubWFwTWVtb3J5KCkgc2FtZSBudW1iZXIgb2YgdGltZXMgYXMgeW91IGNhbGxlZCB2bWFNYXBNZW1vcnkoKS4KKworSXQgaXMgYWxzbyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiBhbGxvY2F0aW9uIGNyZWF0ZWQgd2l0aAorI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9NQVBQRURfQklUIGZsYWcuIEl0cyBtZW1vcnkgc3RheXMgbWFwcGVkIGFsbCB0aGUgdGltZS4KK1lvdSBtdXN0IHN0aWxsIGNhbGwgdm1hVW5tYXBNZW1vcnkoKSBzYW1lIG51bWJlciBvZiB0aW1lcyBhcyB5b3UgY2FsbGVkCit2bWFNYXBNZW1vcnkoKS4gWW91IG11c3Qgbm90IGNhbGwgdm1hVW5tYXBNZW1vcnkoKSBhZGRpdGlvbmFsIHRpbWUgdG8gZnJlZSB0aGUKKyIwLXRoIiBtYXBwaW5nIG1hZGUgYXV0b21hdGljYWxseSBkdWUgdG8gI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9NQVBQRURfQklUIGZsYWcuCisKK1RoaXMgZnVuY3Rpb24gZmFpbHMgd2hlbiB1c2VkIG9uIGFsbG9jYXRpb24gbWFkZSBpbiBtZW1vcnkgdHlwZSB0aGF0IGlzIG5vdAorYEhPU1RfVklTSUJMRWAuCisKK1RoaXMgZnVuY3Rpb24gYWx3YXlzIGZhaWxzIHdoZW4gY2FsbGVkIGZvciBhbGxvY2F0aW9uIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aAorI1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9DQU5fQkVDT01FX0xPU1RfQklUIGZsYWcuIFN1Y2ggYWxsb2NhdGlvbnMgY2Fubm90IGJlCittYXBwZWQuCisqLworVmtSZXN1bHQgdm1hTWFwTWVtb3J5KAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIHZvaWQqKiBwcERhdGEpOworCisvKiogXGJyaWVmIFVubWFwcyBtZW1vcnkgcmVwcmVzZW50ZWQgYnkgZ2l2ZW4gYWxsb2NhdGlvbiwgbWFwcGVkIHByZXZpb3VzbHkgdXNpbmcgdm1hTWFwTWVtb3J5KCkuCisKK0ZvciBkZXRhaWxzLCBzZWUgZGVzY3JpcHRpb24gb2Ygdm1hTWFwTWVtb3J5KCkuCisqLwordm9pZCB2bWFVbm1hcE1lbW9yeSgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CisKKy8qKiBcYnJpZWYgRmx1c2hlcyBtZW1vcnkgb2YgZ2l2ZW4gYWxsb2NhdGlvbi4KKworQ2FsbHMgYHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoKWAgZm9yIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gcmFuZ2Ugb2YgZ2l2ZW4gYWxsb2NhdGlvbi4KKworLSBgb2Zmc2V0YCBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgYWxsb2NhdGlvbi4KKy0gYHNpemVgIGNhbiBiZSBgVktfV0hPTEVfU0laRWAuIEl0IG1lYW5zIGFsbCBtZW1vcnkgZnJvbSBgb2Zmc2V0YCB0aGUgdGhlIGVuZCBvZiBnaXZlbiBhbGxvY2F0aW9uLgorLSBgb2Zmc2V0YCBhbmQgYHNpemVgIGRvbid0IGhhdmUgdG8gYmUgYWxpZ25lZC4KKyAgVGhleSBhcmUgaW50ZXJuYWxseSByb3VuZGVkIGRvd24vdXAgdG8gbXVsdGlwbHkgb2YgYG5vbkNvaGVyZW50QXRvbVNpemVgLgorLSBJZiBgc2l6ZWAgaXMgMCwgdGhpcyBjYWxsIGlzIGlnbm9yZWQuCistIElmIG1lbW9yeSB0eXBlIHRoYXQgdGhlIGBhbGxvY2F0aW9uYCBiZWxvbmdzIHRvIGlzIG5vdCBgSE9TVF9WSVNJQkxFYCBvciBpdCBpcyBgSE9TVF9DT0hFUkVOVGAsCisgIHRoaXMgY2FsbCBpcyBpZ25vcmVkLgorKi8KK3ZvaWQgdm1hRmx1c2hBbGxvY2F0aW9uKFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpOworCisvKiogXGJyaWVmIEludmFsaWRhdGVzIG1lbW9yeSBvZiBnaXZlbiBhbGxvY2F0aW9uLgorCitDYWxscyBgdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKClgIGZvciBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHJhbmdlIG9mIGdpdmVuIGFsbG9jYXRpb24uCisKKy0gYG9mZnNldGAgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIGFsbG9jYXRpb24uCistIGBzaXplYCBjYW4gYmUgYFZLX1dIT0xFX1NJWkVgLiBJdCBtZWFucyBhbGwgbWVtb3J5IGZyb20gYG9mZnNldGAgdGhlIHRoZSBlbmQgb2YgZ2l2ZW4gYWxsb2NhdGlvbi4KKy0gYG9mZnNldGAgYW5kIGBzaXplYCBkb24ndCBoYXZlIHRvIGJlIGFsaWduZWQuCisgIFRoZXkgYXJlIGludGVybmFsbHkgcm91bmRlZCBkb3duL3VwIHRvIG11bHRpcGx5IG9mIGBub25Db2hlcmVudEF0b21TaXplYC4KKy0gSWYgYHNpemVgIGlzIDAsIHRoaXMgY2FsbCBpcyBpZ25vcmVkLgorLSBJZiBtZW1vcnkgdHlwZSB0aGF0IHRoZSBgYWxsb2NhdGlvbmAgYmVsb25ncyB0byBpcyBub3QgYEhPU1RfVklTSUJMRWAgb3IgaXQgaXMgYEhPU1RfQ09IRVJFTlRgLAorICB0aGlzIGNhbGwgaXMgaWdub3JlZC4KKyovCit2b2lkIHZtYUludmFsaWRhdGVBbGxvY2F0aW9uKFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpOworCisvKiogXGJyaWVmIENoZWNrcyBtYWdpYyBudW1iZXIgaW4gbWFyZ2lucyBhcm91bmQgYWxsIGFsbG9jYXRpb25zIGluIGdpdmVuIG1lbW9yeSB0eXBlcyAoaW4gYm90aCBkZWZhdWx0IGFuZCBjdXN0b20gcG9vbHMpIGluIHNlYXJjaCBmb3IgY29ycnVwdGlvbnMuCisKK0BwYXJhbSBtZW1vcnlUeXBlQml0cyBCaXQgbWFzaywgd2hlcmUgZWFjaCBiaXQgc2V0IG1lYW5zIHRoYXQgYSBtZW1vcnkgdHlwZSB3aXRoIHRoYXQgaW5kZXggc2hvdWxkIGJlIGNoZWNrZWQuCisKK0NvcnJ1cHRpb24gZGV0ZWN0aW9uIGlzIGVuYWJsZWQgb25seSB3aGVuIGBWTUFfREVCVUdfREVURUNUX0NPUlJVUFRJT05gIG1hY3JvIGlzIGRlZmluZWQgdG8gbm9uemVybywKK2BWTUFfREVCVUdfTUFSR0lOYCBpcyBkZWZpbmVkIHRvIG5vbnplcm8gYW5kIG9ubHkgZm9yIG1lbW9yeSB0eXBlcyB0aGF0IGFyZQorYEhPU1RfVklTSUJMRWAgYW5kIGBIT1NUX0NPSEVSRU5UYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ29ycnVwdGlvbiBkZXRlY3Rpb25dKEByZWYgZGVidWdnaW5nX21lbW9yeV91c2FnZV9jb3JydXB0aW9uX2RldGVjdGlvbikuCisKK1Bvc3NpYmxlIHJldHVybiB2YWx1ZXM6CisKKy0gYFZLX0VSUk9SX0ZFQVRVUkVfTk9UX1BSRVNFTlRgIC0gY29ycnVwdGlvbiBkZXRlY3Rpb24gaXMgbm90IGVuYWJsZWQgZm9yIGFueSBvZiBzcGVjaWZpZWQgbWVtb3J5IHR5cGVzLgorLSBgVktfU1VDQ0VTU2AgLSBjb3JydXB0aW9uIGRldGVjdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgYW5kIHN1Y2NlZWRlZC4KKy0gYFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVGAgLSBjb3JydXB0aW9uIGRldGVjdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgYW5kIGZvdW5kIG1lbW9yeSBjb3JydXB0aW9ucyBhcm91bmQgb25lIG9mIHRoZSBhbGxvY2F0aW9ucy4KKyAgYFZNQV9BU1NFUlRgIGlzIGFsc28gZmlyZWQgaW4gdGhhdCBjYXNlLgorLSBPdGhlciB2YWx1ZTogRXJyb3IgcmV0dXJuZWQgYnkgVnVsa2FuLCBlLmcuIG1lbW9yeSBtYXBwaW5nIGZhaWx1cmUuCisqLworVmtSZXN1bHQgdm1hQ2hlY2tDb3JydXB0aW9uKFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsIHVpbnQzMl90IG1lbW9yeVR5cGVCaXRzKTsKKworLyoqIFxzdHJ1Y3QgVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dAorXGJyaWVmIFJlcHJlc2VudHMgT3BhcXVlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgc3RhcnRlZCBkZWZyYWdtZW50YXRpb24gcHJvY2Vzcy4KKworRmlsbCBzdHJ1Y3R1cmUgI1ZtYURlZnJhZ21lbnRhdGlvbkluZm8yIGFuZCBjYWxsIGZ1bmN0aW9uIHZtYURlZnJhZ21lbnRhdGlvbkJlZ2luKCkgdG8gY3JlYXRlIGl0LgorQ2FsbCBmdW5jdGlvbiB2bWFEZWZyYWdtZW50YXRpb25FbmQoKSB0byBkZXN0cm95IGl0LgorKi8KK1ZLX0RFRklORV9IQU5ETEUoVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dCkKKworLy8vIEZsYWdzIHRvIGJlIHVzZWQgaW4gdm1hRGVmcmFnbWVudGF0aW9uQmVnaW4oKS4gTm9uZSBhdCB0aGUgbW9tZW50LiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KK3R5cGVkZWYgZW51bSBWbWFEZWZyYWdtZW50YXRpb25GbGFnQml0cyB7CisgICAgVk1BX0RFRlJBR01FTlRBVElPTl9GTEFHX0JJVFNfTUFYX0VOVU0gPSAweDdGRkZGRkZGCit9IFZtYURlZnJhZ21lbnRhdGlvbkZsYWdCaXRzOwordHlwZWRlZiBWa0ZsYWdzIFZtYURlZnJhZ21lbnRhdGlvbkZsYWdzOworCisvKiogXGJyaWVmIFBhcmFtZXRlcnMgZm9yIGRlZnJhZ21lbnRhdGlvbi4KKworVG8gYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIHZtYURlZnJhZ21lbnRhdGlvbkJlZ2luKCkuCisqLwordHlwZWRlZiBzdHJ1Y3QgVm1hRGVmcmFnbWVudGF0aW9uSW5mbzIgeworICAgIC8qKiBcYnJpZWYgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIFNob3VsZCBiZSAwLgorICAgICovCisgICAgVm1hRGVmcmFnbWVudGF0aW9uRmxhZ3MgZmxhZ3M7CisgICAgLyoqIFxicmllZiBOdW1iZXIgb2YgYWxsb2NhdGlvbnMgaW4gYHBBbGxvY2F0aW9uc2AgYXJyYXkuCisgICAgKi8KKyAgICB1aW50MzJfdCBhbGxvY2F0aW9uQ291bnQ7CisgICAgLyoqIFxicmllZiBQb2ludGVyIHRvIGFycmF5IG9mIGFsbG9jYXRpb25zIHRoYXQgY2FuIGJlIGRlZnJhZ21lbnRlZC4KKworICAgIFRoZSBhcnJheSBzaG91bGQgaGF2ZSBgYWxsb2NhdGlvbkNvdW50YCBlbGVtZW50cy4KKyAgICBUaGUgYXJyYXkgc2hvdWxkIG5vdCBjb250YWluIG51bGxzLgorICAgIEVsZW1lbnRzIGluIHRoZSBhcnJheSBzaG91bGQgYmUgdW5pcXVlIC0gc2FtZSBhbGxvY2F0aW9uIGNhbm5vdCBvY2N1ciB0d2ljZS4KKyAgICBJdCBpcyBzYWZlIHRvIHBhc3MgYWxsb2NhdGlvbnMgdGhhdCBhcmUgaW4gdGhlIGxvc3Qgc3RhdGUgLSB0aGV5IGFyZSBpZ25vcmVkLgorICAgIEFsbCBhbGxvY2F0aW9ucyBub3QgcHJlc2VudCBpbiB0aGlzIGFycmF5IGFyZSBjb25zaWRlcmVkIG5vbi1tb3ZlYWJsZSBkdXJpbmcgdGhpcyBkZWZyYWdtZW50YXRpb24uCisgICAgKi8KKyAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbnM7CisgICAgLyoqIFxicmllZiBPcHRpb25hbCwgb3V0cHV0LiBQb2ludGVyIHRvIGFycmF5IHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBpbmZvcm1hdGlvbiB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGF0IGNlcnRhaW4gaW5kZXggaGFzIGJlZW4gY2hhbmdlZCBkdXJpbmcgZGVmcmFnbWVudGF0aW9uLgorCisgICAgVGhlIGFycmF5IHNob3VsZCBoYXZlIGBhbGxvY2F0aW9uQ291bnRgIGVsZW1lbnRzLgorICAgIFlvdSBjYW4gcGFzcyBudWxsIGlmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBpbmZvcm1hdGlvbi4KKyAgICAqLworICAgIFZrQm9vbDMyKiBwQWxsb2NhdGlvbnNDaGFuZ2VkOworICAgIC8qKiBcYnJpZWYgTnVtZXIgb2YgcG9vbHMgaW4gYHBQb29sc2AgYXJyYXkuCisgICAgKi8KKyAgICB1aW50MzJfdCBwb29sQ291bnQ7CisgICAgLyoqIFxicmllZiBFaXRoZXIgbnVsbCBvciBwb2ludGVyIHRvIGFycmF5IG9mIHBvb2xzIHRvIGJlIGRlZnJhZ21lbnRlZC4KKworICAgIEFsbCB0aGUgYWxsb2NhdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBwb29scyBjYW4gYmUgbW92ZWQgZHVyaW5nIGRlZnJhZ21lbnRhdGlvbgorICAgIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gY2hlY2sgaWYgdGhleSB3ZXJlIHJlYWxseSBtb3ZlZCBhcyBpbiBgcEFsbG9jYXRpb25zQ2hhbmdlZGAsCisgICAgc28geW91IG11c3QgcXVlcnkgYWxsIHRoZSBhbGxvY2F0aW9ucyBpbiBhbGwgdGhlc2UgcG9vbHMgZm9yIG5ldyBgVmtEZXZpY2VNZW1vcnlgCisgICAgYW5kIG9mZnNldCB1c2luZyB2bWFHZXRBbGxvY2F0aW9uSW5mbygpIGlmIHlvdSBtaWdodCBuZWVkIHRvIHJlY3JlYXRlIGJ1ZmZlcnMKKyAgICBhbmQgaW1hZ2VzIGJvdW5kIHRvIHRoZW0uCisKKyAgICBUaGUgYXJyYXkgc2hvdWxkIGhhdmUgYHBvb2xDb3VudGAgZWxlbWVudHMuCisgICAgVGhlIGFycmF5IHNob3VsZCBub3QgY29udGFpbiBudWxscy4KKyAgICBFbGVtZW50cyBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHVuaXF1ZSAtIHNhbWUgcG9vbCBjYW5ub3Qgb2NjdXIgdHdpY2UuCisKKyAgICBVc2luZyB0aGlzIGFycmF5IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhbGwgYWxsb2NhdGlvbnMgZnJvbSB0aGUgcG9vbHMgaW4gYHBBbGxvY2F0aW9uc2AuCisgICAgSXQgbWlnaHQgYmUgbW9yZSBlZmZpY2llbnQuCisgICAgKi8KKyAgICBWbWFQb29sKiBwUG9vbHM7CisgICAgLyoqIFxicmllZiBNYXhpbXVtIHRvdGFsIG51bWJlcnMgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgY29waWVkIHdoaWxlIG1vdmluZyBhbGxvY2F0aW9ucyB0byBkaWZmZXJlbnQgcGxhY2VzIHVzaW5nIHRyYW5zZmVycyBvbiBDUFUgc2lkZSwgbGlrZSBgbWVtY3B5KClgLCBgbWVtbW92ZSgpYC4KKyAgICAKKyAgICBgVktfV0hPTEVfU0laRWAgbWVhbnMgbm8gbGltaXQuCisgICAgKi8KKyAgICBWa0RldmljZVNpemUgbWF4Q3B1Qnl0ZXNUb01vdmU7CisgICAgLyoqIFxicmllZiBNYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0aW9ucyB0aGF0IGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBwbGFjZSB1c2luZyB0cmFuc2ZlcnMgb24gQ1BVIHNpZGUsIGxpa2UgYG1lbWNweSgpYCwgYG1lbW1vdmUoKWAuCisKKyAgICBgVUlOVDMyX01BWGAgbWVhbnMgbm8gbGltaXQuCisgICAgKi8KKyAgICB1aW50MzJfdCBtYXhDcHVBbGxvY2F0aW9uc1RvTW92ZTsKKyAgICAvKiogXGJyaWVmIE1heGltdW0gdG90YWwgbnVtYmVycyBvZiBieXRlcyB0aGF0IGNhbiBiZSBjb3BpZWQgd2hpbGUgbW92aW5nIGFsbG9jYXRpb25zIHRvIGRpZmZlcmVudCBwbGFjZXMgdXNpbmcgdHJhbnNmZXJzIG9uIEdQVSBzaWRlLCBwb3N0ZWQgdG8gYGNvbW1hbmRCdWZmZXJgLgorICAgIAorICAgIGBWS19XSE9MRV9TSVpFYCBtZWFucyBubyBsaW1pdC4KKyAgICAqLworICAgIFZrRGV2aWNlU2l6ZSBtYXhHcHVCeXRlc1RvTW92ZTsKKyAgICAvKiogXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIGFsbG9jYXRpb25zIHRoYXQgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBsYWNlIHVzaW5nIHRyYW5zZmVycyBvbiBHUFUgc2lkZSwgcG9zdGVkIHRvIGBjb21tYW5kQnVmZmVyYC4KKworICAgIGBVSU5UMzJfTUFYYCBtZWFucyBubyBsaW1pdC4KKyAgICAqLworICAgIHVpbnQzMl90IG1heEdwdUFsbG9jYXRpb25zVG9Nb3ZlOworICAgIC8qKiBcYnJpZWYgT3B0aW9uYWwuIENvbW1hbmQgYnVmZmVyIHdoZXJlIEdQVSBjb3B5IGNvbW1hbmRzIHdpbGwgYmUgcG9zdGVkLgorCisgICAgSWYgbm90IG51bGwsIGl0IG11c3QgYmUgYSB2YWxpZCBjb21tYW5kIGJ1ZmZlciBoYW5kbGUgdGhhdCBzdXBwb3J0cyBUcmFuc2ZlciBxdWV1ZSB0eXBlLgorICAgIEl0IG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZSBhbmQgb3V0c2lkZSBvZiBhIHJlbmRlciBwYXNzIGluc3RhbmNlLgorICAgIFlvdSBuZWVkIHRvIHN1Ym1pdCBpdCBhbmQgbWFrZSBzdXJlIGl0IGZpbmlzaGVkIGV4ZWN1dGlvbiBiZWZvcmUgY2FsbGluZyB2bWFEZWZyYWdtZW50YXRpb25FbmQoKS4KKworICAgIFBhc3NpbmcgbnVsbCBtZWFucyB0aGF0IG9ubHkgQ1BVIGRlZnJhZ21lbnRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4KKyAgICAqLworICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyOworfSBWbWFEZWZyYWdtZW50YXRpb25JbmZvMjsKKworLyoqIFxicmllZiBEZXByZWNhdGVkLiBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIGZ1bmN0aW9uIHZtYURlZnJhZ21lbnQoKS4KKworXGRlcHJlY2F0ZWQgVGhpcyBpcyBhIHBhcnQgb2YgdGhlIG9sZCBpbnRlcmZhY2UuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBzdHJ1Y3R1cmUgI1ZtYURlZnJhZ21lbnRhdGlvbkluZm8yIGFuZCBmdW5jdGlvbiB2bWFEZWZyYWdtZW50YXRpb25CZWdpbigpIGluc3RlYWQuCisqLwordHlwZWRlZiBzdHJ1Y3QgVm1hRGVmcmFnbWVudGF0aW9uSW5mbyB7CisgICAgLyoqIFxicmllZiBNYXhpbXVtIHRvdGFsIG51bWJlcnMgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgY29waWVkIHdoaWxlIG1vdmluZyBhbGxvY2F0aW9ucyB0byBkaWZmZXJlbnQgcGxhY2VzLgorICAgIAorICAgIERlZmF1bHQgaXMgYFZLX1dIT0xFX1NJWkVgLCB3aGljaCBtZWFucyBubyBsaW1pdC4KKyAgICAqLworICAgIFZrRGV2aWNlU2l6ZSBtYXhCeXRlc1RvTW92ZTsKKyAgICAvKiogXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIGFsbG9jYXRpb25zIHRoYXQgY2FuIGJlIG1vdmVkIHRvIGRpZmZlcmVudCBwbGFjZS4KKworICAgIERlZmF1bHQgaXMgYFVJTlQzMl9NQVhgLCB3aGljaCBtZWFucyBubyBsaW1pdC4KKyAgICAqLworICAgIHVpbnQzMl90IG1heEFsbG9jYXRpb25zVG9Nb3ZlOworfSBWbWFEZWZyYWdtZW50YXRpb25JbmZvOworCisvKiogXGJyaWVmIFN0YXRpc3RpY3MgcmV0dXJuZWQgYnkgZnVuY3Rpb24gdm1hRGVmcmFnbWVudCgpLiAqLwordHlwZWRlZiBzdHJ1Y3QgVm1hRGVmcmFnbWVudGF0aW9uU3RhdHMgeworICAgIC8vLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gY29waWVkIHdoaWxlIG1vdmluZyBhbGxvY2F0aW9ucyB0byBkaWZmZXJlbnQgcGxhY2VzLgorICAgIFZrRGV2aWNlU2l6ZSBieXRlc01vdmVkOworICAgIC8vLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmVsZWFzZWQgdG8gdGhlIHN5c3RlbSBieSBmcmVlaW5nIGVtcHR5IGBWa0RldmljZU1lbW9yeWAgb2JqZWN0cy4KKyAgICBWa0RldmljZVNpemUgYnl0ZXNGcmVlZDsKKyAgICAvLy8gTnVtYmVyIG9mIGFsbG9jYXRpb25zIHRoYXQgaGF2ZSBiZWVuIG1vdmVkIHRvIGRpZmZlcmVudCBwbGFjZXMuCisgICAgdWludDMyX3QgYWxsb2NhdGlvbnNNb3ZlZDsKKyAgICAvLy8gTnVtYmVyIG9mIGVtcHR5IGBWa0RldmljZU1lbW9yeWAgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiByZWxlYXNlZCB0byB0aGUgc3lzdGVtLgorICAgIHVpbnQzMl90IGRldmljZU1lbW9yeUJsb2Nrc0ZyZWVkOworfSBWbWFEZWZyYWdtZW50YXRpb25TdGF0czsKKworLyoqIFxicmllZiBCZWdpbnMgZGVmcmFnbWVudGF0aW9uIHByb2Nlc3MuCisKK0BwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIG9iamVjdC4KK0BwYXJhbSBwSW5mbyBTdHJ1Y3R1cmUgZmlsbGVkIHdpdGggcGFyYW1ldGVycyBvZiBkZWZyYWdtZW50YXRpb24uCitAcGFyYW1bb3V0XSBwU3RhdHMgT3B0aW9uYWwuIFN0YXRpc3RpY3Mgb2YgZGVmcmFnbWVudGF0aW9uLiBZb3UgY2FuIHBhc3MgbnVsbCBpZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgaW5mb3JtYXRpb24uCitAcGFyYW1bb3V0XSBwQ29udGV4dCBDb250ZXh0IG9iamVjdCB0aGF0IG11c3QgYmUgcGFzc2VkIHRvIHZtYURlZnJhZ21lbnRhdGlvbkVuZCgpIHRvIGZpbmlzaCBkZWZyYWdtZW50YXRpb24uCitAcmV0dXJuIGBWS19TVUNDRVNTYCBhbmQgYCpwQ29udGV4dCA9PSBudWxsYCBpZiBkZWZyYWdtZW50YXRpb24gZmluaXNoZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gY2FsbC4gYFZLX05PVF9SRUFEWWAgYW5kIGAqcENvbnRleHQgIT0gbnVsbGAgaWYgZGVmcmFnbWVudGF0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIHlvdSBuZWVkIHRvIGNhbGwgdm1hRGVmcmFnbWVudGF0aW9uRW5kKCkgdG8gZmluaXNoIGl0LiBOZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorCitVc2UgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIG9sZCwgZGVwcmVjYXRlZCB2bWFEZWZyYWdtZW50KCkuCisKK1dhcm5pbmchIEJldHdlZW4gdGhlIGNhbGwgdG8gdm1hRGVmcmFnbWVudGF0aW9uQmVnaW4oKSBhbmQgdm1hRGVmcmFnbWVudGF0aW9uRW5kKCk6CisKKy0gWW91IHNob3VsZCBub3QgdXNlIGFueSBvZiBhbGxvY2F0aW9ucyBwYXNzZWQgYXMgYHBJbmZvLT5wQWxsb2NhdGlvbnNgIG9yCisgIGFueSBhbGxvY2F0aW9ucyB0aGF0IGJlbG9uZyB0byBwb29scyBwYXNzZWQgYXMgYHBJbmZvLT5wUG9vbHNgLAorICBpbmNsdWRpbmcgY2FsbGluZyB2bWFHZXRBbGxvY2F0aW9uSW5mbygpLCB2bWFUb3VjaEFsbG9jYXRpb24oKSwgb3IgYWNjZXNzCisgIHRoZWlyIGRhdGEuCistIFNvbWUgbXV0ZXhlcyBwcm90ZWN0aW5nIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBtYXkgYmUgbG9ja2VkLCBzbyB0cnlpbmcgdG8KKyAgbWFrZSBvciBmcmVlIGFueSBhbGxvY2F0aW9ucywgYmluZCBidWZmZXJzIG9yIGltYWdlcywgbWFwIG1lbW9yeSwgb3IgbGF1bmNoCisgIGFub3RoZXIgc2ltdWx0YW5lb3VzIGRlZnJhZ21lbnRhdGlvbiBpbiBiZXR3ZWVuIG1heSBjYXVzZSBzdGFsbCAod2hlbiBkb25lIG9uCisgIGFub3RoZXIgdGhyZWFkKSBvciBkZWFkbG9jayAod2hlbiBkb25lIG9uIHRoZSBzYW1lIHRocmVhZCksIHVubGVzcyB5b3UgYXJlCisgIDEwMCUgc3VyZSB0aGF0IGRlZnJhZ21lbnRlZCBhbGxvY2F0aW9ucyBhcmUgaW4gZGlmZmVyZW50IHBvb2xzLgorLSBJbmZvcm1hdGlvbiByZXR1cm5lZCB2aWEgYHBTdGF0c2AgYW5kIGBwSW5mby0+cEFsbG9jYXRpb25zQ2hhbmdlZGAgYXJlIHVuZGVmaW5lZC4KKyAgVGhleSBiZWNvbWUgdmFsaWQgYWZ0ZXIgY2FsbCB0byB2bWFEZWZyYWdtZW50YXRpb25FbmQoKS4KKy0gSWYgYHBJbmZvLT5jb21tYW5kQnVmZmVyYCBpcyBub3QgbnVsbCwgeW91IG11c3Qgc3VibWl0IHRoYXQgY29tbWFuZCBidWZmZXIKKyAgYW5kIG1ha2Ugc3VyZSBpdCBmaW5pc2hlZCBleGVjdXRpb24gYmVmb3JlIGNhbGxpbmcgdm1hRGVmcmFnbWVudGF0aW9uRW5kKCkuCisqLworVmtSZXN1bHQgdm1hRGVmcmFnbWVudGF0aW9uQmVnaW4oCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBjb25zdCBWbWFEZWZyYWdtZW50YXRpb25JbmZvMiogcEluZm8sCisgICAgVm1hRGVmcmFnbWVudGF0aW9uU3RhdHMqIHBTdGF0cywKKyAgICBWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0ICpwQ29udGV4dCk7CisKKy8qKiBcYnJpZWYgRW5kcyBkZWZyYWdtZW50YXRpb24gcHJvY2Vzcy4KKworVXNlIHRoaXMgZnVuY3Rpb24gdG8gZmluaXNoIGRlZnJhZ21lbnRhdGlvbiBzdGFydGVkIGJ5IHZtYURlZnJhZ21lbnRhdGlvbkJlZ2luKCkuCitJdCBpcyBzYWZlIHRvIHBhc3MgYGNvbnRleHQgPT0gbnVsbGAuIFRoZSBmdW5jdGlvbiB0aGVuIGRvZXMgbm90aGluZy4KKyovCitWa1Jlc3VsdCB2bWFEZWZyYWdtZW50YXRpb25FbmQoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0IGNvbnRleHQpOworCisvKiogXGJyaWVmIERlcHJlY2F0ZWQuIENvbXBhY3RzIG1lbW9yeSBieSBtb3ZpbmcgYWxsb2NhdGlvbnMuCisKK0BwYXJhbSBwQWxsb2NhdGlvbnMgQXJyYXkgb2YgYWxsb2NhdGlvbnMgdGhhdCBjYW4gYmUgbW92ZWQgZHVyaW5nIHRoaXMgY29tcGF0aW9uLgorQHBhcmFtIGFsbG9jYXRpb25Db3VudCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcEFsbG9jYXRpb25zIGFuZCBwQWxsb2NhdGlvbnNDaGFuZ2VkIGFycmF5cy4KK0BwYXJhbVtvdXRdIHBBbGxvY2F0aW9uc0NoYW5nZWQgQXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMgdGhhdCB3aWxsIGluZGljYXRlIHdoZXRoZXIgbWF0Y2hpbmcgYWxsb2NhdGlvbiBpbiBwQWxsb2NhdGlvbnMgYXJyYXkgaGFzIGJlZW4gbW92ZWQuIFRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBQYXNzIG51bGwgaWYgeW91IGRvbid0IG5lZWQgdGhpcyBpbmZvcm1hdGlvbi4KK0BwYXJhbSBwRGVmcmFnbWVudGF0aW9uSW5mbyBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuIE9wdGlvbmFsIC0gcGFzcyBudWxsIHRvIHVzZSBkZWZhdWx0IHZhbHVlcy4KK0BwYXJhbVtvdXRdIHBEZWZyYWdtZW50YXRpb25TdGF0cyBTdGF0aXN0aWNzIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4gT3B0aW9uYWwgLSBwYXNzIG51bGwgaWYgeW91IGRvbid0IG5lZWQgdGhpcyBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gYFZLX1NVQ0NFU1NgIGlmIGNvbXBsZXRlZCwgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGVycm9yLgorCitcZGVwcmVjYXRlZCBUaGlzIGlzIGEgcGFydCBvZiB0aGUgb2xkIGludGVyZmFjZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHN0cnVjdHVyZSAjVm1hRGVmcmFnbWVudGF0aW9uSW5mbzIgYW5kIGZ1bmN0aW9uIHZtYURlZnJhZ21lbnRhdGlvbkJlZ2luKCkgaW5zdGVhZC4KKworVGhpcyBmdW5jdGlvbiB3b3JrcyBieSBtb3ZpbmcgYWxsb2NhdGlvbnMgdG8gZGlmZmVyZW50IHBsYWNlcyAoZGlmZmVyZW50CitgVmtEZXZpY2VNZW1vcnlgIG9iamVjdHMgYW5kL29yIGRpZmZlcmVudCBvZmZzZXRzKSBpbiBvcmRlciB0byBvcHRpbWl6ZSBtZW1vcnkKK3VzYWdlLiBPbmx5IGFsbG9jYXRpb25zIHRoYXQgYXJlIGluIGBwQWxsb2NhdGlvbnNgIGFycmF5IGNhbiBiZSBtb3ZlZC4gQWxsIG90aGVyCithbGxvY2F0aW9ucyBhcmUgY29uc2lkZXJlZCBub25tb3ZhYmxlIGluIHRoaXMgY2FsbC4gQmFzaWMgcnVsZXM6CisKKy0gT25seSBhbGxvY2F0aW9ucyBtYWRlIGluIG1lbW9yeSB0eXBlcyB0aGF0IGhhdmUKKyAgYFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUYCBhbmQgYFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVGAKKyAgZmxhZ3MgY2FuIGJlIGNvbXBhY3RlZC4gWW91IG1heSBwYXNzIG90aGVyIGFsbG9jYXRpb25zIGJ1dCBpdCBtYWtlcyBubyBzZW5zZSAtCisgIHRoZXNlIHdpbGwgbmV2ZXIgYmUgbW92ZWQuCistIEN1c3RvbSBwb29scyBjcmVhdGVkIHdpdGggI1ZNQV9QT09MX0NSRUFURV9MSU5FQVJfQUxHT1JJVEhNX0JJVCBvcgorICAjVk1BX1BPT0xfQ1JFQVRFX0JVRERZX0FMR09SSVRITV9CSVQgZmxhZyBhcmUgbm90IGRlZnJhZ21lbnRlZC4gQWxsb2NhdGlvbnMKKyAgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhhdCBjb21lIGZyb20gc3VjaCBwb29scyBhcmUgaWdub3JlZC4KKy0gQWxsb2NhdGlvbnMgY3JlYXRlZCB3aXRoICNWTUFfQUxMT0NBVElPTl9DUkVBVEVfREVESUNBVEVEX01FTU9SWV9CSVQgb3IKKyAgY3JlYXRlZCBhcyBkZWRpY2F0ZWQgYWxsb2NhdGlvbnMgZm9yIGFueSBvdGhlciByZWFzb24gYXJlIGFsc28gaWdub3JlZC4KKy0gQm90aCBhbGxvY2F0aW9ucyBtYWRlIHdpdGggb3Igd2l0aG91dCAjVk1BX0FMTE9DQVRJT05fQ1JFQVRFX01BUFBFRF9CSVQKKyAgZmxhZyBjYW4gYmUgY29tcGFjdGVkLiBJZiBub3QgcGVyc2lzdGVudGx5IG1hcHBlZCwgbWVtb3J5IHdpbGwgYmUgbWFwcGVkCisgIHRlbXBvcmFyaWx5IGluc2lkZSB0aGlzIGZ1bmN0aW9uIGlmIG5lZWRlZC4KKy0gWW91IG11c3Qgbm90IHBhc3Mgc2FtZSAjVm1hQWxsb2NhdGlvbiBvYmplY3QgbXVsdGlwbGUgdGltZXMgaW4gYHBBbGxvY2F0aW9uc2AgYXJyYXkuCisKK1RoZSBmdW5jdGlvbiBhbHNvIGZyZWVzIGVtcHR5IGBWa0RldmljZU1lbW9yeWAgYmxvY2tzLgorCitXYXJuaW5nOiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB0aW1lLWNvbnN1bWluZywgc28geW91IHNob3VsZG4ndCBjYWxsIGl0IHRvbyBvZnRlbgorKGxpa2UgYWZ0ZXIgZXZlcnkgcmVzb3VyY2UgY3JlYXRpb24vZGVzdHJ1Y3Rpb24pLgorWW91IGNhbiBjYWxsIGl0IG9uIHNwZWNpYWwgb2NjYXNpb25zIChsaWtlIHdoZW4gcmVsb2FkaW5nIGEgZ2FtZSBsZXZlbCBvcgord2hlbiB5b3UganVzdCBkZXN0cm95ZWQgYSBsb3Qgb2Ygb2JqZWN0cykuIENhbGxpbmcgaXQgZXZlcnkgZnJhbWUgbWF5IGJlIE9LLCBidXQKK3lvdSBzaG91bGQgbWVhc3VyZSB0aGF0IG9uIHlvdXIgcGxhdGZvcm0uCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0RlZnJhZ21lbnRhdGlvbl0oQHJlZiBkZWZyYWdtZW50YXRpb24pIGNoYXB0ZXIuCisqLworVmtSZXN1bHQgdm1hRGVmcmFnbWVudCgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9ucywKKyAgICBzaXplX3QgYWxsb2NhdGlvbkNvdW50LAorICAgIFZrQm9vbDMyKiBwQWxsb2NhdGlvbnNDaGFuZ2VkLAorICAgIGNvbnN0IFZtYURlZnJhZ21lbnRhdGlvbkluZm8gKnBEZWZyYWdtZW50YXRpb25JbmZvLAorICAgIFZtYURlZnJhZ21lbnRhdGlvblN0YXRzKiBwRGVmcmFnbWVudGF0aW9uU3RhdHMpOworCisvKiogXGJyaWVmIEJpbmRzIGJ1ZmZlciB0byBhbGxvY2F0aW9uLgorCitCaW5kcyBzcGVjaWZpZWQgYnVmZmVyIHRvIHJlZ2lvbiBvZiBtZW1vcnkgcmVwcmVzZW50ZWQgYnkgc3BlY2lmaWVkIGFsbG9jYXRpb24uCitHZXRzIGBWa0RldmljZU1lbW9yeWAgaGFuZGxlIGFuZCBvZmZzZXQgZnJvbSB0aGUgYWxsb2NhdGlvbi4KK0lmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGJ1ZmZlciwgYWxsb2NhdGUgbWVtb3J5IGZvciBpdCBhbmQgYmluZCB0aGVtIHRvZ2V0aGVyIHNlcGFyYXRlbHksCit5b3Ugc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBiaW5kaW5nIGluc3RlYWQgb2Ygc3RhbmRhcmQgYHZrQmluZEJ1ZmZlck1lbW9yeSgpYCwKK2JlY2F1c2UgaXQgZW5zdXJlcyBwcm9wZXIgc3luY2hyb25pemF0aW9uIHNvIHRoYXQgd2hlbiBhIGBWa0RldmljZU1lbW9yeWAgb2JqZWN0IGlzIHVzZWQgYnkgbXVsdGlwbGUKK2FsbG9jYXRpb25zLCBjYWxscyB0byBgdmtCaW5kKk1lbW9yeSgpYCBvciBgdmtNYXBNZW1vcnkoKWAgd29uJ3QgaGFwcGVuIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseQorKHdoaWNoIGlzIGlsbGVnYWwgaW4gVnVsa2FuKS4KKworSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGZ1bmN0aW9uIHZtYUNyZWF0ZUJ1ZmZlcigpIGluc3RlYWQgb2YgdGhpcyBvbmUuCisqLworVmtSZXN1bHQgdm1hQmluZEJ1ZmZlck1lbW9yeSgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiwKKyAgICBWa0J1ZmZlciBidWZmZXIpOworCisvKiogXGJyaWVmIEJpbmRzIGltYWdlIHRvIGFsbG9jYXRpb24uCisKK0JpbmRzIHNwZWNpZmllZCBpbWFnZSB0byByZWdpb24gb2YgbWVtb3J5IHJlcHJlc2VudGVkIGJ5IHNwZWNpZmllZCBhbGxvY2F0aW9uLgorR2V0cyBgVmtEZXZpY2VNZW1vcnlgIGhhbmRsZSBhbmQgb2Zmc2V0IGZyb20gdGhlIGFsbG9jYXRpb24uCitJZiB5b3Ugd2FudCB0byBjcmVhdGUgYW4gaW1hZ2UsIGFsbG9jYXRlIG1lbW9yeSBmb3IgaXQgYW5kIGJpbmQgdGhlbSB0b2dldGhlciBzZXBhcmF0ZWx5LAoreW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgYmluZGluZyBpbnN0ZWFkIG9mIHN0YW5kYXJkIGB2a0JpbmRJbWFnZU1lbW9yeSgpYCwKK2JlY2F1c2UgaXQgZW5zdXJlcyBwcm9wZXIgc3luY2hyb25pemF0aW9uIHNvIHRoYXQgd2hlbiBhIGBWa0RldmljZU1lbW9yeWAgb2JqZWN0IGlzIHVzZWQgYnkgbXVsdGlwbGUKK2FsbG9jYXRpb25zLCBjYWxscyB0byBgdmtCaW5kKk1lbW9yeSgpYCBvciBgdmtNYXBNZW1vcnkoKWAgd29uJ3QgaGFwcGVuIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseQorKHdoaWNoIGlzIGlsbGVnYWwgaW4gVnVsa2FuKS4KKworSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGZ1bmN0aW9uIHZtYUNyZWF0ZUltYWdlKCkgaW5zdGVhZCBvZiB0aGlzIG9uZS4KKyovCitWa1Jlc3VsdCB2bWFCaW5kSW1hZ2VNZW1vcnkoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24sCisgICAgVmtJbWFnZSBpbWFnZSk7CisKKy8qKgorQHBhcmFtW291dF0gcEJ1ZmZlciBCdWZmZXIgdGhhdCB3YXMgY3JlYXRlZC4KK0BwYXJhbVtvdXRdIHBBbGxvY2F0aW9uIEFsbG9jYXRpb24gdGhhdCB3YXMgY3JlYXRlZC4KK0BwYXJhbVtvdXRdIHBBbGxvY2F0aW9uSW5mbyBPcHRpb25hbC4gSW5mb3JtYXRpb24gYWJvdXQgYWxsb2NhdGVkIG1lbW9yeS4gSXQgY2FuIGJlIGxhdGVyIGZldGNoZWQgdXNpbmcgZnVuY3Rpb24gdm1hR2V0QWxsb2NhdGlvbkluZm8oKS4KKworVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5OgorCistIyBDcmVhdGVzIGJ1ZmZlci4KKy0jIEFsbG9jYXRlcyBhcHByb3ByaWF0ZSBtZW1vcnkgZm9yIGl0LgorLSMgQmluZHMgdGhlIGJ1ZmZlciB3aXRoIHRoZSBtZW1vcnkuCisKK0lmIGFueSBvZiB0aGVzZSBvcGVyYXRpb25zIGZhaWwsIGJ1ZmZlciBhbmQgYWxsb2NhdGlvbiBhcmUgbm90IGNyZWF0ZWQsCityZXR1cm5lZCB2YWx1ZSBpcyBuZWdhdGl2ZSBlcnJvciBjb2RlLCAqcEJ1ZmZlciBhbmQgKnBBbGxvY2F0aW9uIGFyZSBudWxsLgorCitJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZGVkLCB5b3UgbXVzdCBkZXN0cm95IGJvdGggYnVmZmVyIGFuZCBhbGxvY2F0aW9uIHdoZW4geW91CitubyBsb25nZXIgbmVlZCB0aGVtIHVzaW5nIGVpdGhlciBjb252ZW5pZW5jZSBmdW5jdGlvbiB2bWFEZXN0cm95QnVmZmVyKCkgb3IKK3NlcGFyYXRlbHksIHVzaW5nIGB2a0Rlc3Ryb3lCdWZmZXIoKWAgYW5kIHZtYUZyZWVNZW1vcnkoKS4KKworSWYgVk1BX0FMTE9DQVRPUl9DUkVBVEVfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JJVCBmbGFnIHdhcyB1c2VkLAorVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uIGV4dGVuc2lvbiBpcyB1c2VkIGludGVybmFsbHkgdG8gcXVlcnkgZHJpdmVyIHdoZXRoZXIKK2l0IHJlcXVpcmVzIG9yIHByZWZlcnMgdGhlIG5ldyBidWZmZXIgdG8gaGF2ZSBkZWRpY2F0ZWQgYWxsb2NhdGlvbi4gSWYgeWVzLAorYW5kIGlmIGRlZGljYXRlZCBhbGxvY2F0aW9uIGlzIHBvc3NpYmxlIChWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbzo6cG9vbCBpcyBudWxsCithbmQgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX05FVkVSX0FMTE9DQVRFX0JJVCBpcyBub3QgdXNlZCksIGl0IGNyZWF0ZXMgZGVkaWNhdGVkCithbGxvY2F0aW9uIGZvciB0aGlzIGJ1ZmZlciwganVzdCBsaWtlIHdoZW4gdXNpbmcKK1ZNQV9BTExPQ0FUSU9OX0NSRUFURV9ERURJQ0FURURfTUVNT1JZX0JJVC4KKyovCitWa1Jlc3VsdCB2bWFDcmVhdGVCdWZmZXIoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qIHBCdWZmZXJDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvKiBwQWxsb2NhdGlvbkNyZWF0ZUluZm8sCisgICAgVmtCdWZmZXIqIHBCdWZmZXIsCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24sCisgICAgVm1hQWxsb2NhdGlvbkluZm8qIHBBbGxvY2F0aW9uSW5mbyk7CisKKy8qKiBcYnJpZWYgRGVzdHJveXMgVnVsa2FuIGJ1ZmZlciBhbmQgZnJlZXMgYWxsb2NhdGVkIG1lbW9yeS4KKworVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZXF1aXZhbGVudCB0bzoKKworXGNvZGUKK3ZrRGVzdHJveUJ1ZmZlcihkZXZpY2UsIGJ1ZmZlciwgYWxsb2NhdGlvbkNhbGxiYWNrcyk7Cit2bWFGcmVlTWVtb3J5KGFsbG9jYXRvciwgYWxsb2NhdGlvbik7CitcZW5kY29kZQorCitJdCBpdCBzYWZlIHRvIHBhc3MgbnVsbCBhcyBidWZmZXIgYW5kL29yIGFsbG9jYXRpb24uCisqLwordm9pZCB2bWFEZXN0cm95QnVmZmVyKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVmtCdWZmZXIgYnVmZmVyLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CisKKy8vLyBGdW5jdGlvbiBzaW1pbGFyIHRvIHZtYUNyZWF0ZUJ1ZmZlcigpLgorVmtSZXN1bHQgdm1hQ3JlYXRlSW1hZ2UoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogcEltYWdlQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyogcEFsbG9jYXRpb25DcmVhdGVJbmZvLAorICAgIFZrSW1hZ2UqIHBJbWFnZSwKKyAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbiwKKyAgICBWbWFBbGxvY2F0aW9uSW5mbyogcEFsbG9jYXRpb25JbmZvKTsKKworLyoqIFxicmllZiBEZXN0cm95cyBWdWxrYW4gaW1hZ2UgYW5kIGZyZWVzIGFsbG9jYXRlZCBtZW1vcnkuCisKK1RoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG86CisKK1xjb2RlCit2a0Rlc3Ryb3lJbWFnZShkZXZpY2UsIGltYWdlLCBhbGxvY2F0aW9uQ2FsbGJhY2tzKTsKK3ZtYUZyZWVNZW1vcnkoYWxsb2NhdG9yLCBhbGxvY2F0aW9uKTsKK1xlbmRjb2RlCisKK0l0IGl0IHNhZmUgdG8gcGFzcyBudWxsIGFzIGltYWdlIGFuZC9vciBhbGxvY2F0aW9uLgorKi8KK3ZvaWQgdm1hRGVzdHJveUltYWdlKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVmtJbWFnZSBpbWFnZSwKKyAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gQU1EX1ZVTEtBTl9NRU1PUllfQUxMT0NBVE9SX0gKKworLy8gRm9yIFZpc3VhbCBTdHVkaW8gSW50ZWxsaVNlbnNlLgorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIGRlZmluZWQoX19JTlRFTExJU0VOU0VfXykKKyNkZWZpbmUgVk1BX0lNUExFTUVOVEFUSU9OCisjZW5kaWYKKworI2lmZGVmIFZNQV9JTVBMRU1FTlRBVElPTgorI3VuZGVmIFZNQV9JTVBMRU1FTlRBVElPTgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDT05GSUdVUkFUSU9OIFNFQ1RJT04KKworRGVmaW5lIHNvbWUgb2YgdGhlc2UgbWFjcm9zIGJlZm9yZSBlYWNoICNpbmNsdWRlIG9mIHRoaXMgaGVhZGVyIG9yIGNoYW5nZSB0aGVtCitoZXJlIGlmIHlvdSBuZWVkIG90aGVyIHRoZW4gZGVmYXVsdCBiZWhhdmlvciBkZXBlbmRpbmcgb24geW91ciBlbnZpcm9ubWVudC4KKyovCisKKy8qCitEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG1ha2UgdGhlIGxpYnJhcnkgZmV0Y2ggcG9pbnRlcnMgdG8gVnVsa2FuIGZ1bmN0aW9ucworaW50ZXJuYWxseSwgbGlrZToKKworICAgIHZ1bGthbkZ1bmN0aW9ucy52a0FsbG9jYXRlTWVtb3J5ID0gJnZrQWxsb2NhdGVNZW1vcnk7CisKK0RlZmluZSB0byAwIGlmIHlvdSBhcmUgZ29pbmcgdG8gcHJvdmlkZSB5b3Ugb3duIHBvaW50ZXJzIHRvIFZ1bGthbiBmdW5jdGlvbnMgdmlhCitWbWFBbGxvY2F0b3JDcmVhdGVJbmZvOjpwVnVsa2FuRnVuY3Rpb25zLgorKi8KKyNpZiAhZGVmaW5lZChWTUFfU1RBVElDX1ZVTEtBTl9GVU5DVElPTlMpICYmICFkZWZpbmVkKFZLX05PX1BST1RPVFlQRVMpCisjZGVmaW5lIFZNQV9TVEFUSUNfVlVMS0FOX0ZVTkNUSU9OUyAxCisjZW5kaWYKKworLy8gRGVmaW5lIHRoaXMgbWFjcm8gdG8gMSB0byBtYWtlIHRoZSBsaWJyYXJ5IHVzZSBTVEwgY29udGFpbmVycyBpbnN0ZWFkIG9mIGl0cyBvd24gaW1wbGVtZW50YXRpb24uCisvLyNkZWZpbmUgVk1BX1VTRV9TVExfQ09OVEFJTkVSUyAxCisKKy8qIFNldCB0aGlzIG1hY3JvIHRvIDEgdG8gbWFrZSB0aGUgbGlicmFyeSBpbmNsdWRpbmcgYW5kIHVzaW5nIFNUTCBjb250YWluZXJzOgorc3RkOjpwYWlyLCBzdGQ6OnZlY3Rvciwgc3RkOjpsaXN0LCBzdGQ6OnVub3JkZXJlZF9tYXAuCisKK1NldCBpdCB0byAwIG9yIHVuZGVmaW5lZCB0byBtYWtlIHRoZSBsaWJyYXJ5IHVzaW5nIGl0cyBvd24gaW1wbGVtZW50YXRpb24gb2YKK3RoZSBjb250YWluZXJzLgorKi8KKyNpZiBWTUFfVVNFX1NUTF9DT05UQUlORVJTCisgICAjZGVmaW5lIFZNQV9VU0VfU1RMX1ZFQ1RPUiAxCisgICAjZGVmaW5lIFZNQV9VU0VfU1RMX1VOT1JERVJFRF9NQVAgMQorICAgI2RlZmluZSBWTUFfVVNFX1NUTF9MSVNUIDEKKyNlbmRpZgorCisjaWZuZGVmIFZNQV9VU0VfU1RMX1NIQVJFRF9NVVRFWAorICAgIC8vIE1pbmltdW0gVmlzdWFsIFN0dWRpbyAyMDE1IFVwZGF0ZSAyCisgICAgI2lmIGRlZmluZWQoX01TQ19GVUxMX1ZFUikgJiYgX01TQ19GVUxMX1ZFUiA+PSAxOTAwMjM5MTggJiYgTlRERElfVkVSU0lPTiA+IE5URERJX1dJTjEwX1JTMgorICAgICAgICAjZGVmaW5lIFZNQV9VU0VfU1RMX1NIQVJFRF9NVVRFWCAxCisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmIFZNQV9VU0VfU1RMX1ZFQ1RPUgorICAgI2luY2x1ZGUgPHZlY3Rvcj4KKyNlbmRpZgorCisjaWYgVk1BX1VTRV9TVExfVU5PUkRFUkVEX01BUAorICAgI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjZW5kaWYKKworI2lmIFZNQV9VU0VfU1RMX0xJU1QKKyAgICNpbmNsdWRlIDxsaXN0PgorI2VuZGlmCisKKy8qCitGb2xsb3dpbmcgaGVhZGVycyBhcmUgdXNlZCBpbiB0aGlzIENPTkZJR1VSQVRJT04gc2VjdGlvbiBvbmx5LCBzbyBmZWVsIGZyZWUgdG8KK3JlbW92ZSB0aGVtIGlmIG5vdCBuZWVkZWQuCisqLworI2luY2x1ZGUgPGNhc3NlcnQ+IC8vIGZvciBhc3NlcnQKKyNpbmNsdWRlIDxhbGdvcml0aG0+IC8vIGZvciBtaW4sIG1heAorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGF0b21pYz4gLy8gZm9yIHN0ZDo6YXRvbWljCisKKyNpZm5kZWYgVk1BX05VTEwKKyAgIC8vIFZhbHVlIHVzZWQgYXMgbnVsbCBwb2ludGVyLiBEZWZpbmUgaXQgdG8gZS5nLjogbnVsbHB0ciwgTlVMTCwgMCwgKHZvaWQqKTAuCisgICAjZGVmaW5lIFZNQV9OVUxMICAgbnVsbHB0cgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9BUElfXykgJiYgKF9fQU5EUk9JRF9BUElfXyA8IDE2KQorI2luY2x1ZGUgPGNzdGRsaWI+Cit2b2lkICphbGlnbmVkX2FsbG9jKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplKQoreworICAgIC8vIGFsaWdubWVudCBtdXN0IGJlID49IHNpemVvZih2b2lkKikKKyAgICBpZihhbGlnbm1lbnQgPCBzaXplb2Yodm9pZCopKQorICAgIHsKKyAgICAgICAgYWxpZ25tZW50ID0gc2l6ZW9mKHZvaWQqKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fQU5EUk9JRF9fKQorIyAgZGVmaW5lIEFMSUdORURfQUxMT0NfV0lUSF9QT1NJWF9NRU1BTElHTgorI2VsaWYgZGVmaW5lZChfX0dOVV9MSUJSQVJZX18pCisjICBpZiAhZGVmaW5lZChfX0dMSUJDX1BSRVJFUSkgfHwgIV9fR0xJQkNfUFJFUkVRKDIsIDE2KQorLy8gYWxpZ25lZF9hbGxvYygpIGlzIGRlZmluZWQgaW4gZ2xpYmMgb25seSBmb3IgdmVyc2lvbiA+PSAyLjE2CisjICAgIGRlZmluZSBBTElHTkVEX0FMTE9DX1dJVEhfUE9TSVhfTUVNQUxJR04KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEFMSUdORURfQUxMT0NfV0lUSF9QT1NJWF9NRU1BTElHTgorI2luY2x1ZGUgPGNzdGRsaWI+Cit2b2lkICphbGlnbmVkX2FsbG9jKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplKQoreworICAgIC8vIGFsaWdubWVudCBtdXN0IGJlID49IHNpemVvZih2b2lkKikKKyAgICBpZihhbGlnbm1lbnQgPCBzaXplb2Yodm9pZCopKQorICAgIHsKKyAgICAgICAgYWxpZ25tZW50ID0gc2l6ZW9mKHZvaWQqKTsKKyAgICB9CisKKyAgICB2b2lkICpwb2ludGVyOworICAgIGlmKHBvc2l4X21lbWFsaWduKCZwb2ludGVyLCBhbGlnbm1lbnQsIHNpemUpID09IDApCisgICAgICAgIHJldHVybiBwb2ludGVyOworICAgIHJldHVybiBWTUFfTlVMTDsKK30KKyNlbmRpZgorCisvLyBJZiB5b3VyIGNvbXBpbGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQysrMTEgYW5kIGRlZmluaXRpb24gb2YKKy8vIGFsaWduZWRfYWxsb2MoKSBmdW5jdGlvbiBpcyBtaXNzaW5nLCB1bmNvbW1ldGluZyBmb2xsb3dpbmcgbGluZSBtYXkgaGVscDoKKworLy8jaW5jbHVkZSA8bWFsbG9jLmg+CisKKy8vIE5vcm1hbCBhc3NlcnQgdG8gY2hlY2sgZm9yIHByb2dyYW1tZXIncyBlcnJvcnMsIGVzcGVjaWFsbHkgaW4gRGVidWcgY29uZmlndXJhdGlvbi4KKyNpZm5kZWYgVk1BX0FTU0VSVAorICAgI2lmZGVmIF9ERUJVRworICAgICAgICNkZWZpbmUgVk1BX0FTU0VSVChleHByKSAgICAgICAgIGFzc2VydChleHByKQorICAgI2Vsc2UKKyAgICAgICAjZGVmaW5lIFZNQV9BU1NFUlQoZXhwcikKKyAgICNlbmRpZgorI2VuZGlmCisKKy8vIEFzc2VydCB0aGF0IHdpbGwgYmUgY2FsbGVkIHZlcnkgb2Z0ZW4sIGxpa2UgaW5zaWRlIGRhdGEgc3RydWN0dXJlcyBlLmcuIG9wZXJhdG9yW10uCisvLyBNYWtpbmcgaXQgbm9uLWVtcHR5IGNhbiBtYWtlIHByb2dyYW0gc2xvdy4KKyNpZm5kZWYgVk1BX0hFQVZZX0FTU0VSVAorICAgI2lmZGVmIF9ERUJVRworICAgICAgICNkZWZpbmUgVk1BX0hFQVZZX0FTU0VSVChleHByKSAgIC8vVk1BX0FTU0VSVChleHByKQorICAgI2Vsc2UKKyAgICAgICAjZGVmaW5lIFZNQV9IRUFWWV9BU1NFUlQoZXhwcikKKyAgICNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgVk1BX0FMSUdOX09GCisgICAjZGVmaW5lIFZNQV9BTElHTl9PRih0eXBlKSAgICAgICAoX19hbGlnbm9mKHR5cGUpKQorI2VuZGlmCisKKyNpZm5kZWYgVk1BX1NZU1RFTV9BTElHTkVEX01BTExPQworICAgI2lmIGRlZmluZWQoX1dJTjMyKQorICAgICAgICNkZWZpbmUgVk1BX1NZU1RFTV9BTElHTkVEX01BTExPQyhzaXplLCBhbGlnbm1lbnQpICAgKF9hbGlnbmVkX21hbGxvYygoc2l6ZSksIChhbGlnbm1lbnQpKSkKKyAgICNlbHNlCisgICAgICAgI2RlZmluZSBWTUFfU1lTVEVNX0FMSUdORURfTUFMTE9DKHNpemUsIGFsaWdubWVudCkgICAoYWxpZ25lZF9hbGxvYygoYWxpZ25tZW50KSwgKHNpemUpICkpCisgICAjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFZNQV9TWVNURU1fRlJFRQorICAgI2lmIGRlZmluZWQoX1dJTjMyKQorICAgICAgICNkZWZpbmUgVk1BX1NZU1RFTV9GUkVFKHB0cikgICBfYWxpZ25lZF9mcmVlKHB0cikKKyAgICNlbHNlCisgICAgICAgI2RlZmluZSBWTUFfU1lTVEVNX0ZSRUUocHRyKSAgIGZyZWUocHRyKQorICAgI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBWTUFfTUlOCisgICAjZGVmaW5lIFZNQV9NSU4odjEsIHYyKSAgICAoc3RkOjptaW4oKHYxKSwgKHYyKSkpCisjZW5kaWYKKworI2lmbmRlZiBWTUFfTUFYCisgICAjZGVmaW5lIFZNQV9NQVgodjEsIHYyKSAgICAoc3RkOjptYXgoKHYxKSwgKHYyKSkpCisjZW5kaWYKKworI2lmbmRlZiBWTUFfU1dBUAorICAgI2RlZmluZSBWTUFfU1dBUCh2MSwgdjIpICAgc3RkOjpzd2FwKCh2MSksICh2MikpCisjZW5kaWYKKworI2lmbmRlZiBWTUFfU09SVAorICAgI2RlZmluZSBWTUFfU09SVChiZWcsIGVuZCwgY21wKSAgc3RkOjpzb3J0KGJlZywgZW5kLCBjbXApCisjZW5kaWYKKworI2lmbmRlZiBWTUFfREVCVUdfTE9HCisgICAjZGVmaW5lIFZNQV9ERUJVR19MT0coZm9ybWF0LCAuLi4pCisgICAvKgorICAgI2RlZmluZSBWTUFfREVCVUdfTE9HKGZvcm1hdCwgLi4uKSBkbyB7IFwKKyAgICAgICBwcmludGYoZm9ybWF0LCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICBwcmludGYoIlxuIik7IFwKKyAgIH0gd2hpbGUoZmFsc2UpCisgICAqLworI2VuZGlmCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gZW5hYmxlIGZ1bmN0aW9uczogdm1hQnVpbGRTdGF0c1N0cmluZywgdm1hRnJlZVN0YXRzU3RyaW5nLgorI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBWbWFVaW50MzJUb1N0cihjaGFyKiBvdXRTdHIsIHNpemVfdCBzdHJMZW4sIHVpbnQzMl90IG51bSkKKyAgICB7CisgICAgICAgIHNucHJpbnRmKG91dFN0ciwgc3RyTGVuLCAiJXUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KG51bSkpOworICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgVm1hVWludDY0VG9TdHIoY2hhciogb3V0U3RyLCBzaXplX3Qgc3RyTGVuLCB1aW50NjRfdCBudW0pCisgICAgeworICAgICAgICBzbnByaW50ZihvdXRTdHIsIHN0ckxlbiwgIiVsbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KG51bSkpOworICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgVm1hUHRyVG9TdHIoY2hhciogb3V0U3RyLCBzaXplX3Qgc3RyTGVuLCBjb25zdCB2b2lkKiBwdHIpCisgICAgeworICAgICAgICBzbnByaW50ZihvdXRTdHIsIHN0ckxlbiwgIiVwIiwgcHRyKTsKKyAgICB9CisjZW5kaWYKKworI2lmbmRlZiBWTUFfTVVURVgKKyAgICBjbGFzcyBWbWFNdXRleAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgTG9jaygpIHsgbV9NdXRleC5sb2NrKCk7IH0KKyAgICAgICAgdm9pZCBVbmxvY2soKSB7IG1fTXV0ZXgudW5sb2NrKCk7IH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1fTXV0ZXg7CisgICAgfTsKKyAgICAjZGVmaW5lIFZNQV9NVVRFWCBWbWFNdXRleAorI2VuZGlmCisKKy8vIFJlYWQtd3JpdGUgbXV0ZXgsIHdoZXJlICJyZWFkIiBpcyBzaGFyZWQgYWNjZXNzLCAid3JpdGUiIGlzIGV4Y2x1c2l2ZSBhY2Nlc3MuCisjaWZuZGVmIFZNQV9SV19NVVRFWAorICAgICNpZiBWTUFfVVNFX1NUTF9TSEFSRURfTVVURVgKKyAgICAgICAgLy8gVXNlIHN0ZDo6c2hhcmVkX211dGV4IGZyb20gQysrMTcuCisgICAgICAgICNpbmNsdWRlIDxzaGFyZWRfbXV0ZXg+CisgICAgICAgIGNsYXNzIFZtYVJXTXV0ZXgKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2b2lkIExvY2tSZWFkKCkgeyBtX011dGV4LmxvY2tfc2hhcmVkKCk7IH0KKyAgICAgICAgICAgIHZvaWQgVW5sb2NrUmVhZCgpIHsgbV9NdXRleC51bmxvY2tfc2hhcmVkKCk7IH0KKyAgICAgICAgICAgIHZvaWQgTG9ja1dyaXRlKCkgeyBtX011dGV4LmxvY2soKTsgfQorICAgICAgICAgICAgdm9pZCBVbmxvY2tXcml0ZSgpIHsgbV9NdXRleC51bmxvY2soKTsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfbXV0ZXggbV9NdXRleDsKKyAgICAgICAgfTsKKyAgICAgICAgI2RlZmluZSBWTUFfUldfTVVURVggVm1hUldNdXRleAorICAgICNlbGlmIGRlZmluZWQoX1dJTjMyKQorICAgICAgICAvLyBVc2UgU1JXTE9DSyBmcm9tIFdpbkFQSS4KKyAgICAgICAgY2xhc3MgVm1hUldNdXRleAorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFZtYVJXTXV0ZXgoKSB7IEluaXRpYWxpemVTUldMb2NrKCZtX0xvY2spOyB9CisgICAgICAgICAgICB2b2lkIExvY2tSZWFkKCkgeyBBY3F1aXJlU1JXTG9ja1NoYXJlZCgmbV9Mb2NrKTsgfQorICAgICAgICAgICAgdm9pZCBVbmxvY2tSZWFkKCkgeyBSZWxlYXNlU1JXTG9ja1NoYXJlZCgmbV9Mb2NrKTsgfQorICAgICAgICAgICAgdm9pZCBMb2NrV3JpdGUoKSB7IEFjcXVpcmVTUldMb2NrRXhjbHVzaXZlKCZtX0xvY2spOyB9CisgICAgICAgICAgICB2b2lkIFVubG9ja1dyaXRlKCkgeyBSZWxlYXNlU1JXTG9ja0V4Y2x1c2l2ZSgmbV9Mb2NrKTsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgU1JXTE9DSyBtX0xvY2s7CisgICAgICAgIH07CisgICAgICAgICNkZWZpbmUgVk1BX1JXX01VVEVYIFZtYVJXTXV0ZXgKKyAgICAjZWxzZQorICAgICAgICAvLyBMZXNzIGVmZmljaWVudCBmYWxsYmFjazogVXNlIG5vcm1hbCBtdXRleC4KKyAgICAgICAgY2xhc3MgVm1hUldNdXRleAorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZvaWQgTG9ja1JlYWQoKSB7IG1fTXV0ZXguTG9jaygpOyB9CisgICAgICAgICAgICB2b2lkIFVubG9ja1JlYWQoKSB7IG1fTXV0ZXguVW5sb2NrKCk7IH0KKyAgICAgICAgICAgIHZvaWQgTG9ja1dyaXRlKCkgeyBtX011dGV4LkxvY2soKTsgfQorICAgICAgICAgICAgdm9pZCBVbmxvY2tXcml0ZSgpIHsgbV9NdXRleC5VbmxvY2soKTsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgVk1BX01VVEVYIG1fTXV0ZXg7CisgICAgICAgIH07CisgICAgICAgICNkZWZpbmUgVk1BX1JXX01VVEVYIFZtYVJXTXV0ZXgKKyAgICAjZW5kaWYgLy8gI2lmIFZNQV9VU0VfU1RMX1NIQVJFRF9NVVRFWAorI2VuZGlmIC8vICNpZm5kZWYgVk1BX1JXX01VVEVYCisKKy8qCitJZiBwcm92aWRpbmcgeW91ciBvd24gaW1wbGVtZW50YXRpb24sIHlvdSBuZWVkIHRvIGltcGxlbWVudCBhIHN1YnNldCBvZiBzdGQ6OmF0b21pYzoKKworLSBDb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXNpcmVkKQorLSB1aW50MzJfdCBsb2FkKCkgY29uc3QKKy0gdm9pZCBzdG9yZSh1aW50MzJfdCBkZXNpcmVkKQorLSBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfd2Vhayh1aW50MzJfdCYgZXhwZWN0ZWQsIHVpbnQzMl90IGRlc2lyZWQpCisqLworI2lmbmRlZiBWTUFfQVRPTUlDX1VJTlQzMgorICAgI2RlZmluZSBWTUFfQVRPTUlDX1VJTlQzMiBzdGQ6OmF0b21pYzx1aW50MzJfdD4KKyNlbmRpZgorCisjaWZuZGVmIFZNQV9ERUJVR19BTFdBWVNfREVESUNBVEVEX01FTU9SWQorICAgIC8qKgorICAgIEV2ZXJ5IGFsbG9jYXRpb24gd2lsbCBoYXZlIGl0cyBvd24gbWVtb3J5IGJsb2NrLgorICAgIERlZmluZSB0byAxIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKyAgICAqLworICAgICNkZWZpbmUgVk1BX0RFQlVHX0FMV0FZU19ERURJQ0FURURfTUVNT1JZICgwKQorI2VuZGlmCisKKyNpZm5kZWYgVk1BX0RFQlVHX0FMSUdOTUVOVAorICAgIC8qKgorICAgIE1pbmltdW0gYWxpZ25tZW50IG9mIGFsbCBhbGxvY2F0aW9ucywgaW4gYnl0ZXMuCisgICAgU2V0IHRvIG1vcmUgdGhhbiAxIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4gTXVzdCBiZSBwb3dlciBvZiB0d28uCisgICAgKi8KKyAgICAjZGVmaW5lIFZNQV9ERUJVR19BTElHTk1FTlQgKDEpCisjZW5kaWYKKworI2lmbmRlZiBWTUFfREVCVUdfTUFSR0lOCisgICAgLyoqCisgICAgTWluaW11bSBtYXJnaW4gYmVmb3JlIGFuZCBhZnRlciBldmVyeSBhbGxvY2F0aW9uLCBpbiBieXRlcy4KKyAgICBTZXQgbm9uemVybyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCisgICAgKi8KKyAgICAjZGVmaW5lIFZNQV9ERUJVR19NQVJHSU4gKDApCisjZW5kaWYKKworI2lmbmRlZiBWTUFfREVCVUdfSU5JVElBTElaRV9BTExPQ0FUSU9OUworICAgIC8qKgorICAgIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gYXV0b21hdGljYWxseSBmaWxsIG5ldyBhbGxvY2F0aW9ucyBhbmQgZGVzdHJveWVkCisgICAgYWxsb2NhdGlvbnMgd2l0aCBzb21lIGJpdCBwYXR0ZXJuLgorICAgICovCisgICAgI2RlZmluZSBWTUFfREVCVUdfSU5JVElBTElaRV9BTExPQ0FUSU9OUyAoMCkKKyNlbmRpZgorCisjaWZuZGVmIFZNQV9ERUJVR19ERVRFQ1RfQ09SUlVQVElPTgorICAgIC8qKgorICAgIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG9nZXRoZXIgd2l0aCBub24temVybyB2YWx1ZSBvZiBWTUFfREVCVUdfTUFSR0lOIHRvCisgICAgZW5hYmxlIHdyaXRpbmcgbWFnaWMgdmFsdWUgdG8gdGhlIG1hcmdpbiBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGFsbG9jYXRpb24gYW5kCisgICAgdmFsaWRhdGluZyBpdCwgc28gdGhhdCBtZW1vcnkgY29ycnVwdGlvbnMgKG91dC1vZi1ib3VuZHMgd3JpdGVzKSBhcmUgZGV0ZWN0ZWQuCisgICAgKi8KKyAgICAjZGVmaW5lIFZNQV9ERUJVR19ERVRFQ1RfQ09SUlVQVElPTiAoMCkKKyNlbmRpZgorCisjaWZuZGVmIFZNQV9ERUJVR19HTE9CQUxfTVVURVgKKyAgICAvKioKKyAgICBTZXQgdGhpcyB0byAxIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSwgdG8gZW5hYmxlIHNpbmdsZSBtdXRleCBwcm90ZWN0aW5nIGFsbAorICAgIGVudHJ5IGNhbGxzIHRvIHRoZSBsaWJyYXJ5LiBDYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgbXVsdGl0aHJlYWRpbmcgaXNzdWVzLgorICAgICovCisgICAgI2RlZmluZSBWTUFfREVCVUdfR0xPQkFMX01VVEVYICgwKQorI2VuZGlmCisKKyNpZm5kZWYgVk1BX0RFQlVHX01JTl9CVUZGRVJfSU1BR0VfR1JBTlVMQVJJVFkKKyAgICAvKioKKyAgICBNaW5pbXVtIHZhbHVlIGZvciBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjpidWZmZXJJbWFnZUdyYW51bGFyaXR5LgorICAgIFNldCB0byBtb3JlIHRoYW4gMSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuIE11c3QgYmUgcG93ZXIgb2YgdHdvLgorICAgICovCisgICAgI2RlZmluZSBWTUFfREVCVUdfTUlOX0JVRkZFUl9JTUFHRV9HUkFOVUxBUklUWSAoMSkKKyNlbmRpZgorCisjaWZuZGVmIFZNQV9TTUFMTF9IRUFQX01BWF9TSVpFCisgICAvLy8gTWF4aW11bSBzaXplIG9mIGEgbWVtb3J5IGhlYXAgaW4gVnVsa2FuIHRvIGNvbnNpZGVyIGl0ICJzbWFsbCIuCisgICAjZGVmaW5lIFZNQV9TTUFMTF9IRUFQX01BWF9TSVpFICgxMDI0dWxsICogMTAyNCAqIDEwMjQpCisjZW5kaWYKKworI2lmbmRlZiBWTUFfREVGQVVMVF9MQVJHRV9IRUFQX0JMT0NLX1NJWkUKKyAgIC8vLyBEZWZhdWx0IHNpemUgb2YgYSBibG9jayBhbGxvY2F0ZWQgYXMgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IGZyb20gYSAibGFyZ2UiIGhlYXAuCisgICAjZGVmaW5lIFZNQV9ERUZBVUxUX0xBUkdFX0hFQVBfQkxPQ0tfU0laRSAoMjU2dWxsICogMTAyNCAqIDEwMjQpCisjZW5kaWYKKworI2lmbmRlZiBWTUFfQ0xBU1NfTk9fQ09QWQorICAgICNkZWZpbmUgVk1BX0NMQVNTX05PX0NPUFkoY2xhc3NOYW1lKSBcCisgICAgICAgIHByaXZhdGU6IFwKKyAgICAgICAgICAgIGNsYXNzTmFtZShjb25zdCBjbGFzc05hbWUmKSA9IGRlbGV0ZTsgXAorICAgICAgICAgICAgY2xhc3NOYW1lJiBvcGVyYXRvcj0oY29uc3QgY2xhc3NOYW1lJikgPSBkZWxldGU7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IFZNQV9GUkFNRV9JTkRFWF9MT1NUID0gVUlOVDMyX01BWDsKKworLy8gRGVjaW1hbCAyMTM5NDE2MTY2LCBmbG9hdCBOYU4sIGxpdHRsZS1lbmRpYW4gYmluYXJ5IDY2IEU2IDg0IDdGLgorc3RhdGljIGNvbnN0IHVpbnQzMl90IFZNQV9DT1JSVVBUSU9OX0RFVEVDVElPTl9NQUdJQ19WQUxVRSA9IDB4N0Y4NEU2NjY7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFZNQV9BTExPQ0FUSU9OX0ZJTExfUEFUVEVSTl9DUkVBVEVEICAgPSAweERDOworc3RhdGljIGNvbnN0IHVpbnQ4X3QgVk1BX0FMTE9DQVRJT05fRklMTF9QQVRURVJOX0RFU1RST1lFRCA9IDB4RUY7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFTkQgT0YgQ09ORklHVVJBVElPTgorKi8KKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIEdDQ19WRVJTSU9OIChfX0dOVUNfXyAqIDEwMDAwICsgX19HTlVDX01JTk9SX18gKiAxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdHlwZS1saW1pdHMiCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXZhcmlhYmxlIgorI2lmIGRlZmluZWQoX19jbGFuZ19fKQorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3RhdXRvbG9naWNhbC1jb21wYXJlIgorI2VuZGlmCisjaWYgR0NDX1ZFUlNJT04gPj0gODAwMDAKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjbGFzcy1tZW1hY2Nlc3MiCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFORFJPSUQpCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXByaXZhdGUtZmllbGQiCisjZW5kaWYKKyNlbmRpZgorc3RhdGljIGNvbnN0IHVpbnQzMl90IFZNQV9BTExPQ0FUSU9OX0lOVEVSTkFMX1NUUkFURUdZX01JTl9PRkZTRVQgPSAweDEwMDAwMDAwdTsKKworc3RhdGljIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBWbWFFbXB0eUFsbG9jYXRpb25DYWxsYmFja3MgPSB7CisgICAgVk1BX05VTEwsIFZNQV9OVUxMLCBWTUFfTlVMTCwgVk1BX05VTEwsIFZNQV9OVUxMLCBWTUFfTlVMTCB9OworCisvLyBSZXR1cm5zIG51bWJlciBvZiBiaXRzIHNldCB0byAxIGluICh2KS4KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgVm1hQ291bnRCaXRzU2V0KHVpbnQzMl90IHYpCit7CisJdWludDMyX3QgYyA9IHYgLSAoKHYgPj4gMSkgJiAweDU1NTU1NTU1KTsKKwljID0gKChjID4+ICAyKSAmIDB4MzMzMzMzMzMpICsgKGMgJiAweDMzMzMzMzMzKTsKKwljID0gKChjID4+ICA0KSArIGMpICYgMHgwRjBGMEYwRjsKKwljID0gKChjID4+ICA4KSArIGMpICYgMHgwMEZGMDBGRjsKKwljID0gKChjID4+IDE2KSArIGMpICYgMHgwMDAwRkZGRjsKKwlyZXR1cm4gYzsKK30KKworLy8gQWxpZ25zIGdpdmVuIHZhbHVlIHVwIHRvIG5lYXJlc3QgbXVsdGlwbHkgb2YgYWxpZ24gdmFsdWUuIEZvciBleGFtcGxlOiBWbWFBbGlnblVwKDExLCA4KSA9IDE2LgorLy8gVXNlIHR5cGVzIGxpa2UgdWludDMyX3QsIHVpbnQ2NF90IGFzIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgVCBWbWFBbGlnblVwKFQgdmFsLCBUIGFsaWduKQoreworCXJldHVybiAodmFsICsgYWxpZ24gLSAxKSAvIGFsaWduICogYWxpZ247Cit9CisvLyBBbGlnbnMgZ2l2ZW4gdmFsdWUgZG93biB0byBuZWFyZXN0IG11bHRpcGx5IG9mIGFsaWduIHZhbHVlLiBGb3IgZXhhbXBsZTogVm1hQWxpZ25VcCgxMSwgOCkgPSA4LgorLy8gVXNlIHR5cGVzIGxpa2UgdWludDMyX3QsIHVpbnQ2NF90IGFzIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgVCBWbWFBbGlnbkRvd24oVCB2YWwsIFQgYWxpZ24pCit7CisgICAgcmV0dXJuIHZhbCAvIGFsaWduICogYWxpZ247Cit9CisKKy8vIERpdmlzaW9uIHdpdGggbWF0aGVtYXRpY2FsIHJvdW5kaW5nIHRvIG5lYXJlc3QgbnVtYmVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIFQgVm1hUm91bmREaXYoVCB4LCBUIHkpCit7CisJcmV0dXJuICh4ICsgKHkgLyAoVCkyKSkgLyB5OworfQorCisvKgorUmV0dXJucyB0cnVlIGlmIGdpdmVuIG51bWJlciBpcyBhIHBvd2VyIG9mIHR3by4KK1QgbXVzdCBiZSB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlciBvciBzaWduZWQgaW50ZWdlciBidXQgYWx3YXlzIG5vbm5lZ2F0aXZlLgorRm9yIDAgcmV0dXJucyB0cnVlLgorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIGJvb2wgVm1hSXNQb3cyKFQgeCkKK3sKKyAgICByZXR1cm4gKHggJiAoeC0xKSkgPT0gMDsKK30KKworLy8gUmV0dXJucyBzbWFsbGVzdCBwb3dlciBvZiAyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdi4KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgVm1hTmV4dFBvdzIodWludDMyX3QgdikKK3sKKwl2LS07CisgICAgdiB8PSB2ID4+IDE7CisgICAgdiB8PSB2ID4+IDI7CisgICAgdiB8PSB2ID4+IDQ7CisgICAgdiB8PSB2ID4+IDg7CisgICAgdiB8PSB2ID4+IDE2OworICAgIHYrKzsKKyAgICByZXR1cm4gdjsKK30KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgVm1hTmV4dFBvdzIodWludDY0X3QgdikKK3sKKwl2LS07CisgICAgdiB8PSB2ID4+IDE7CisgICAgdiB8PSB2ID4+IDI7CisgICAgdiB8PSB2ID4+IDQ7CisgICAgdiB8PSB2ID4+IDg7CisgICAgdiB8PSB2ID4+IDE2OworICAgIHYgfD0gdiA+PiAzMjsKKyAgICB2Kys7CisgICAgcmV0dXJuIHY7Cit9CisKKy8vIFJldHVybnMgbGFyZ2VzdCBwb3dlciBvZiAyIGxlc3Mgb3IgZXF1YWwgdG8gdi4KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgVm1hUHJldlBvdzIodWludDMyX3QgdikKK3sKKyAgICB2IHw9IHYgPj4gMTsKKyAgICB2IHw9IHYgPj4gMjsKKyAgICB2IHw9IHYgPj4gNDsKKyAgICB2IHw9IHYgPj4gODsKKyAgICB2IHw9IHYgPj4gMTY7CisgICAgdiA9IHYgXiAodiA+PiAxKTsKKyAgICByZXR1cm4gdjsKK30KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgVm1hUHJldlBvdzIodWludDY0X3QgdikKK3sKKyAgICB2IHw9IHYgPj4gMTsKKyAgICB2IHw9IHYgPj4gMjsKKyAgICB2IHw9IHYgPj4gNDsKKyAgICB2IHw9IHYgPj4gODsKKyAgICB2IHw9IHYgPj4gMTY7CisgICAgdiB8PSB2ID4+IDMyOworICAgIHYgPSB2IF4gKHYgPj4gMSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBWbWFTdHJJc0VtcHR5KGNvbnN0IGNoYXIqIHBTdHIpCit7CisgICAgcmV0dXJuIHBTdHIgPT0gVk1BX05VTEwgfHwgKnBTdHIgPT0gJ1wwJzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIFZtYUFsZ29yaXRobVRvU3RyKHVpbnQzMl90IGFsZ29yaXRobSkKK3sKKyAgICBzd2l0Y2goYWxnb3JpdGhtKQorICAgIHsKKyAgICBjYXNlIFZNQV9QT09MX0NSRUFURV9MSU5FQVJfQUxHT1JJVEhNX0JJVDoKKyAgICAgICAgcmV0dXJuICJMaW5lYXIiOworICAgIGNhc2UgVk1BX1BPT0xfQ1JFQVRFX0JVRERZX0FMR09SSVRITV9CSVQ6CisgICAgICAgIHJldHVybiAiQnVkZHkiOworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuICJEZWZhdWx0IjsKKyAgICBkZWZhdWx0OgorICAgICAgICBWTUFfQVNTRVJUKDApOworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorfQorCisjaWZuZGVmIFZNQV9TT1JUCisKK3RlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBDb21wYXJlPgorSXRlcmF0b3IgVm1hUXVpY2tTb3J0UGFydGl0aW9uKEl0ZXJhdG9yIGJlZywgSXRlcmF0b3IgZW5kLCBDb21wYXJlIGNtcCkKK3sKKyAgICBJdGVyYXRvciBjZW50ZXJWYWx1ZSA9IGVuZDsgLS1jZW50ZXJWYWx1ZTsKKyAgICBJdGVyYXRvciBpbnNlcnRJbmRleCA9IGJlZzsKKyAgICBmb3IoSXRlcmF0b3IgbWVtVHlwZUluZGV4ID0gYmVnOyBtZW1UeXBlSW5kZXggPCBjZW50ZXJWYWx1ZTsgKyttZW1UeXBlSW5kZXgpCisgICAgeworICAgICAgICBpZihjbXAoKm1lbVR5cGVJbmRleCwgKmNlbnRlclZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoaW5zZXJ0SW5kZXggIT0gbWVtVHlwZUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZNQV9TV0FQKCptZW1UeXBlSW5kZXgsICppbnNlcnRJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2luc2VydEluZGV4OworICAgICAgICB9CisgICAgfQorICAgIGlmKGluc2VydEluZGV4ICE9IGNlbnRlclZhbHVlKQorICAgIHsKKyAgICAgICAgVk1BX1NXQVAoKmluc2VydEluZGV4LCAqY2VudGVyVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gaW5zZXJ0SW5kZXg7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBDb21wYXJlPgordm9pZCBWbWFRdWlja1NvcnQoSXRlcmF0b3IgYmVnLCBJdGVyYXRvciBlbmQsIENvbXBhcmUgY21wKQoreworICAgIGlmKGJlZyA8IGVuZCkKKyAgICB7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gVm1hUXVpY2tTb3J0UGFydGl0aW9uPEl0ZXJhdG9yLCBDb21wYXJlPihiZWcsIGVuZCwgY21wKTsKKyAgICAgICAgVm1hUXVpY2tTb3J0PEl0ZXJhdG9yLCBDb21wYXJlPihiZWcsIGl0LCBjbXApOworICAgICAgICBWbWFRdWlja1NvcnQ8SXRlcmF0b3IsIENvbXBhcmU+KGl0ICsgMSwgZW5kLCBjbXApOworICAgIH0KK30KKworI2RlZmluZSBWTUFfU09SVChiZWcsIGVuZCwgY21wKSBWbWFRdWlja1NvcnQoYmVnLCBlbmQsIGNtcCkKKworI2VuZGlmIC8vICNpZm5kZWYgVk1BX1NPUlQKKworLyoKK1JldHVybnMgdHJ1ZSBpZiB0d28gbWVtb3J5IGJsb2NrcyBvY2N1cHkgb3ZlcmxhcHBpbmcgcGFnZXMuCitSZXNvdXJjZUEgbXVzdCBiZSBpbiBsZXNzIG1lbW9yeSBvZmZzZXQgdGhhbiBSZXNvdXJjZUIuCisKK0FsZ29yaXRobSBpcyBiYXNlZCBvbiAiVnVsa2FuIDEuMC4zOSAtIEEgU3BlY2lmaWNhdGlvbiAod2l0aCBhbGwgcmVnaXN0ZXJlZCBWdWxrYW4gZXh0ZW5zaW9ucykiCitjaGFwdGVyIDExLjYgIlJlc291cmNlIE1lbW9yeSBBc3NvY2lhdGlvbiIsIHBhcmFncmFwaCAiQnVmZmVyLUltYWdlIEdyYW51bGFyaXR5Ii4KKyovCitzdGF0aWMgaW5saW5lIGJvb2wgVm1hQmxvY2tzT25TYW1lUGFnZSgKKyAgICBWa0RldmljZVNpemUgcmVzb3VyY2VBT2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSByZXNvdXJjZUFTaXplLAorICAgIFZrRGV2aWNlU2l6ZSByZXNvdXJjZUJPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplIHBhZ2VTaXplKQoreworICAgIFZNQV9BU1NFUlQocmVzb3VyY2VBT2Zmc2V0ICsgcmVzb3VyY2VBU2l6ZSA8PSByZXNvdXJjZUJPZmZzZXQgJiYgcmVzb3VyY2VBU2l6ZSA+IDAgJiYgcGFnZVNpemUgPiAwKTsKKyAgICBWa0RldmljZVNpemUgcmVzb3VyY2VBRW5kID0gcmVzb3VyY2VBT2Zmc2V0ICsgcmVzb3VyY2VBU2l6ZSAtIDE7CisgICAgVmtEZXZpY2VTaXplIHJlc291cmNlQUVuZFBhZ2UgPSByZXNvdXJjZUFFbmQgJiB+KHBhZ2VTaXplIC0gMSk7CisgICAgVmtEZXZpY2VTaXplIHJlc291cmNlQlN0YXJ0ID0gcmVzb3VyY2VCT2Zmc2V0OworICAgIFZrRGV2aWNlU2l6ZSByZXNvdXJjZUJTdGFydFBhZ2UgPSByZXNvdXJjZUJTdGFydCAmIH4ocGFnZVNpemUgLSAxKTsKKyAgICByZXR1cm4gcmVzb3VyY2VBRW5kUGFnZSA9PSByZXNvdXJjZUJTdGFydFBhZ2U7Cit9CisKK2VudW0gVm1hU3ViYWxsb2NhdGlvblR5cGUKK3sKKyAgICBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUgPSAwLAorICAgIFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfVU5LTk9XTiA9IDEsCisgICAgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9CVUZGRVIgPSAyLAorICAgIFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfSU1BR0VfVU5LTk9XTiA9IDMsCisgICAgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9JTUFHRV9MSU5FQVIgPSA0LAorICAgIFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfSU1BR0VfT1BUSU1BTCA9IDUsCisgICAgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9NQVhfRU5VTSA9IDB4N0ZGRkZGRkYKK307CisKKy8qCitSZXR1cm5zIHRydWUgaWYgZ2l2ZW4gc3ViYWxsb2NhdGlvbiB0eXBlcyBjb3VsZCBjb25mbGljdCBhbmQgbXVzdCByZXNwZWN0CitWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjpidWZmZXJJbWFnZUdyYW51bGFyaXR5LiBUaGV5IGNvbmZsaWN0IGlmIG9uZSBpcyBidWZmZXIKK29yIGxpbmVhciBpbWFnZSBhbmQgYW5vdGhlciBvbmUgaXMgb3B0aW1hbCBpbWFnZS4gSWYgdHlwZSBpcyB1bmtub3duLCBiZWhhdmUKK2NvbnNlcnZhdGl2ZWx5LgorKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBWbWFJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdCgKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBzdWJhbGxvY1R5cGUxLAorICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIHN1YmFsbG9jVHlwZTIpCit7CisgICAgaWYoc3ViYWxsb2NUeXBlMSA+IHN1YmFsbG9jVHlwZTIpCisgICAgeworICAgICAgICBWTUFfU1dBUChzdWJhbGxvY1R5cGUxLCBzdWJhbGxvY1R5cGUyKTsKKyAgICB9CisgICAgCisgICAgc3dpdGNoKHN1YmFsbG9jVHlwZTEpCisgICAgeworICAgIGNhc2UgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFOgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX1VOS05PV046CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9CVUZGRVI6CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgc3ViYWxsb2NUeXBlMiA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0lNQUdFX1VOS05PV04gfHwKKyAgICAgICAgICAgIHN1YmFsbG9jVHlwZTIgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9JTUFHRV9PUFRJTUFMOworICAgIGNhc2UgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9JTUFHRV9VTktOT1dOOgorICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHN1YmFsbG9jVHlwZTIgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9JTUFHRV9VTktOT1dOIHx8CisgICAgICAgICAgICBzdWJhbGxvY1R5cGUyID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfSU1BR0VfTElORUFSIHx8CisgICAgICAgICAgICBzdWJhbGxvY1R5cGUyID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfSU1BR0VfT1BUSU1BTDsKKyAgICBjYXNlIFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfSU1BR0VfTElORUFSOgorICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHN1YmFsbG9jVHlwZTIgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9JTUFHRV9PUFRJTUFMOworICAgIGNhc2UgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9JTUFHRV9PUFRJTUFMOgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBWbWFXcml0ZU1hZ2ljVmFsdWUodm9pZCogcERhdGEsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpCit7CisjaWYgVk1BX0RFQlVHX01BUkdJTiA+IDAgJiYgVk1BX0RFQlVHX0RFVEVDVF9DT1JSVVBUSU9OCisgICAgdWludDMyX3QqIHBEc3QgPSAodWludDMyX3QqKSgoY2hhciopcERhdGEgKyBvZmZzZXQpOworICAgIGNvbnN0IHNpemVfdCBudW1iZXJDb3VudCA9IFZNQV9ERUJVR19NQVJHSU4gLyBzaXplb2YodWludDMyX3QpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBudW1iZXJDb3VudDsgKytpLCArK3BEc3QpCisgICAgeworICAgICAgICAqcERzdCA9IFZNQV9DT1JSVVBUSU9OX0RFVEVDVElPTl9NQUdJQ19WQUxVRTsKKyAgICB9CisjZWxzZQorICAgIC8vIG5vLW9wCisjZW5kaWYKK30KKworc3RhdGljIGJvb2wgVm1hVmFsaWRhdGVNYWdpY1ZhbHVlKGNvbnN0IHZvaWQqIHBEYXRhLCBWa0RldmljZVNpemUgb2Zmc2V0KQoreworI2lmIFZNQV9ERUJVR19NQVJHSU4gPiAwICYmIFZNQV9ERUJVR19ERVRFQ1RfQ09SUlVQVElPTgorICAgIGNvbnN0IHVpbnQzMl90KiBwU3JjID0gKGNvbnN0IHVpbnQzMl90KikoKGNvbnN0IGNoYXIqKXBEYXRhICsgb2Zmc2V0KTsKKyAgICBjb25zdCBzaXplX3QgbnVtYmVyQ291bnQgPSBWTUFfREVCVUdfTUFSR0lOIC8gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbnVtYmVyQ291bnQ7ICsraSwgKytwU3JjKQorICAgIHsKKyAgICAgICAgaWYoKnBTcmMgIT0gVk1BX0NPUlJVUFRJT05fREVURUNUSU9OX01BR0lDX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSGVscGVyIFJBSUkgY2xhc3MgdG8gbG9jayBhIG11dGV4IGluIGNvbnN0cnVjdG9yIGFuZCB1bmxvY2sgaXQgaW4gZGVzdHJ1Y3RvciAoYXQgdGhlIGVuZCBvZiBzY29wZSkuCitzdHJ1Y3QgVm1hTXV0ZXhMb2NrCit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hTXV0ZXhMb2NrKQorcHVibGljOgorICAgIFZtYU11dGV4TG9jayhWTUFfTVVURVgmIG11dGV4LCBib29sIHVzZU11dGV4KSA6CisgICAgICAgIG1fcE11dGV4KHVzZU11dGV4ID8gJm11dGV4IDogVk1BX05VTEwpCisgICAgeyBpZihtX3BNdXRleCkgeyBtX3BNdXRleC0+TG9jaygpOyB9IH0KKyAgICB+Vm1hTXV0ZXhMb2NrKCkKKyAgICB7IGlmKG1fcE11dGV4KSB7IG1fcE11dGV4LT5VbmxvY2soKTsgfSB9Citwcml2YXRlOgorICAgIFZNQV9NVVRFWCogbV9wTXV0ZXg7Cit9OworCisvLyBIZWxwZXIgUkFJSSBjbGFzcyB0byBsb2NrIGEgUlcgbXV0ZXggaW4gY29uc3RydWN0b3IgYW5kIHVubG9jayBpdCBpbiBkZXN0cnVjdG9yIChhdCB0aGUgZW5kIG9mIHNjb3BlKSwgZm9yIHJlYWRpbmcuCitzdHJ1Y3QgVm1hTXV0ZXhMb2NrUmVhZAoreworICAgIFZNQV9DTEFTU19OT19DT1BZKFZtYU11dGV4TG9ja1JlYWQpCitwdWJsaWM6CisgICAgVm1hTXV0ZXhMb2NrUmVhZChWTUFfUldfTVVURVgmIG11dGV4LCBib29sIHVzZU11dGV4KSA6CisgICAgICAgIG1fcE11dGV4KHVzZU11dGV4ID8gJm11dGV4IDogVk1BX05VTEwpCisgICAgeyBpZihtX3BNdXRleCkgeyBtX3BNdXRleC0+TG9ja1JlYWQoKTsgfSB9CisgICAgflZtYU11dGV4TG9ja1JlYWQoKSB7IGlmKG1fcE11dGV4KSB7IG1fcE11dGV4LT5VbmxvY2tSZWFkKCk7IH0gfQorcHJpdmF0ZToKKyAgICBWTUFfUldfTVVURVgqIG1fcE11dGV4OworfTsKKworLy8gSGVscGVyIFJBSUkgY2xhc3MgdG8gbG9jayBhIFJXIG11dGV4IGluIGNvbnN0cnVjdG9yIGFuZCB1bmxvY2sgaXQgaW4gZGVzdHJ1Y3RvciAoYXQgdGhlIGVuZCBvZiBzY29wZSksIGZvciB3cml0aW5nLgorc3RydWN0IFZtYU11dGV4TG9ja1dyaXRlCit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hTXV0ZXhMb2NrV3JpdGUpCitwdWJsaWM6CisgICAgVm1hTXV0ZXhMb2NrV3JpdGUoVk1BX1JXX01VVEVYJiBtdXRleCwgYm9vbCB1c2VNdXRleCkgOgorICAgICAgICBtX3BNdXRleCh1c2VNdXRleCA/ICZtdXRleCA6IFZNQV9OVUxMKQorICAgIHsgaWYobV9wTXV0ZXgpIHsgbV9wTXV0ZXgtPkxvY2tXcml0ZSgpOyB9IH0KKyAgICB+Vm1hTXV0ZXhMb2NrV3JpdGUoKSB7IGlmKG1fcE11dGV4KSB7IG1fcE11dGV4LT5VbmxvY2tXcml0ZSgpOyB9IH0KK3ByaXZhdGU6CisgICAgVk1BX1JXX01VVEVYKiBtX3BNdXRleDsKK307CisKKyNpZiBWTUFfREVCVUdfR0xPQkFMX01VVEVYCisgICAgc3RhdGljIFZNQV9NVVRFWCBnRGVidWdHbG9iYWxNdXRleDsKKyAgICAjZGVmaW5lIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSyBWbWFNdXRleExvY2sgZGVidWdHbG9iYWxNdXRleExvY2soZ0RlYnVnR2xvYmFsTXV0ZXgsIHRydWUpOworI2Vsc2UKKyAgICAjZGVmaW5lIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworI2VuZGlmCisKKy8vIE1pbmltdW0gc2l6ZSBvZiBhIGZyZWUgc3ViYWxsb2NhdGlvbiB0byByZWdpc3RlciBpdCBpbiB0aGUgZnJlZSBzdWJhbGxvY2F0aW9uIGNvbGxlY3Rpb24uCitzdGF0aWMgY29uc3QgVmtEZXZpY2VTaXplIFZNQV9NSU5fRlJFRV9TVUJBTExPQ0FUSU9OX1NJWkVfVE9fUkVHSVNURVIgPSAxNjsKKworLyoKK1BlcmZvcm1zIGJpbmFyeSBzZWFyY2ggYW5kIHJldHVybnMgaXRlcmF0b3IgdG8gZmlyc3QgZWxlbWVudCB0aGF0IGlzIGdyZWF0ZXIgb3IKK2VxdWFsIHRvIChrZXkpLCBhY2NvcmRpbmcgdG8gY29tcGFyaXNvbiAoY21wKS4KKworQ21wIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiBmaXJzdCBhcmd1bWVudCBpcyBsZXNzIHRoYW4gc2Vjb25kIGFyZ3VtZW50LgorCitSZXR1cm5lZCB2YWx1ZSBpcyB0aGUgZm91bmQgZWxlbWVudCwgaWYgcHJlc2VudCBpbiB0aGUgY29sbGVjdGlvbiBvciBwbGFjZSB3aGVyZQorbmV3IGVsZW1lbnQgd2l0aCB2YWx1ZSAoa2V5KSBzaG91bGQgYmUgaW5zZXJ0ZWQuCisqLwordGVtcGxhdGUgPHR5cGVuYW1lIENtcExlc3MsIHR5cGVuYW1lIEl0ZXJULCB0eXBlbmFtZSBLZXlUPgorc3RhdGljIEl0ZXJUIFZtYUJpbmFyeUZpbmRGaXJzdE5vdExlc3MoSXRlclQgYmVnLCBJdGVyVCBlbmQsIGNvbnN0IEtleVQgJmtleSwgQ21wTGVzcyBjbXApCit7CisgICAgc2l6ZV90IGRvd24gPSAwLCB1cCA9IChlbmQgLSBiZWcpOworICAgIHdoaWxlKGRvd24gPCB1cCkKKyAgICB7CisgICAgICAgIGNvbnN0IHNpemVfdCBtaWQgPSAoZG93biArIHVwKSAvIDI7CisgICAgICAgIGlmKGNtcCgqKGJlZyttaWQpLCBrZXkpKQorICAgICAgICB7CisgICAgICAgICAgICBkb3duID0gbWlkICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gbWlkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiZWcgKyBkb3duOworfQorCisvKgorUmV0dXJucyB0cnVlIGlmIGFsbCBwb2ludGVycyBpbiB0aGUgYXJyYXkgYXJlIG5vdC1udWxsIGFuZCB1bmlxdWUuCitXYXJuaW5nISBPKG5eMikgY29tcGxleGl0eS4gVXNlIG9ubHkgaW5zaWRlIFZNQV9IRUFWWV9BU1NFUlQuCitUIG11c3QgYmUgcG9pbnRlciB0eXBlLCBlLmcuIFZtYUFsbG9jYXRpb24sIFZtYVBvb2wuCisqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBib29sIFZtYVZhbGlkYXRlUG9pbnRlckFycmF5KHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBhcnIpCit7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICB7CisgICAgICAgIGNvbnN0IFQgaVB0ciA9IGFycltpXTsKKyAgICAgICAgaWYoaVB0ciA9PSBWTUFfTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvcih1aW50MzJfdCBqID0gaSArIDE7IGogPCBjb3VudDsgKytqKQorICAgICAgICB7CisgICAgICAgICAgICBpZihpUHRyID09IGFycltqXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNZW1vcnkgYWxsb2NhdGlvbgorCitzdGF0aWMgdm9pZCogVm1hTWFsbG9jKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRpb25DYWxsYmFja3MsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50KQoreworICAgIGlmKChwQWxsb2NhdGlvbkNhbGxiYWNrcyAhPSBWTUFfTlVMTCkgJiYKKyAgICAgICAgKHBBbGxvY2F0aW9uQ2FsbGJhY2tzLT5wZm5BbGxvY2F0aW9uICE9IFZNQV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoKnBBbGxvY2F0aW9uQ2FsbGJhY2tzLT5wZm5BbGxvY2F0aW9uKSgKKyAgICAgICAgICAgIHBBbGxvY2F0aW9uQ2FsbGJhY2tzLT5wVXNlckRhdGEsCisgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgYWxpZ25tZW50LAorICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZNQV9TWVNURU1fQUxJR05FRF9NQUxMT0Moc2l6ZSwgYWxpZ25tZW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFZtYUZyZWUoY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdGlvbkNhbGxiYWNrcywgdm9pZCogcHRyKQoreworICAgIGlmKChwQWxsb2NhdGlvbkNhbGxiYWNrcyAhPSBWTUFfTlVMTCkgJiYKKyAgICAgICAgKHBBbGxvY2F0aW9uQ2FsbGJhY2tzLT5wZm5GcmVlICE9IFZNQV9OVUxMKSkKKyAgICB7CisgICAgICAgICgqcEFsbG9jYXRpb25DYWxsYmFja3MtPnBmbkZyZWUpKHBBbGxvY2F0aW9uQ2FsbGJhY2tzLT5wVXNlckRhdGEsIHB0cik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZNQV9TWVNURU1fRlJFRShwdHIpOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBUKiBWbWFBbGxvY2F0ZShjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0aW9uQ2FsbGJhY2tzKQoreworICAgIHJldHVybiAoVCopVm1hTWFsbG9jKHBBbGxvY2F0aW9uQ2FsbGJhY2tzLCBzaXplb2YoVCksIFZNQV9BTElHTl9PRihUKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgVCogVm1hQWxsb2NhdGVBcnJheShjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0aW9uQ2FsbGJhY2tzLCBzaXplX3QgY291bnQpCit7CisgICAgcmV0dXJuIChUKilWbWFNYWxsb2MocEFsbG9jYXRpb25DYWxsYmFja3MsIHNpemVvZihUKSAqIGNvdW50LCBWTUFfQUxJR05fT0YoVCkpOworfQorCisjZGVmaW5lIHZtYV9uZXcoYWxsb2NhdG9yLCB0eXBlKSAgIG5ldyhWbWFBbGxvY2F0ZTx0eXBlPihhbGxvY2F0b3IpKSh0eXBlKQorCisjZGVmaW5lIHZtYV9uZXdfYXJyYXkoYWxsb2NhdG9yLCB0eXBlLCBjb3VudCkgICBuZXcoVm1hQWxsb2NhdGVBcnJheTx0eXBlPigoYWxsb2NhdG9yKSwgKGNvdW50KSkpKHR5cGUpCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCB2bWFfZGVsZXRlKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRpb25DYWxsYmFja3MsIFQqIHB0cikKK3sKKyAgICBwdHItPn5UKCk7CisgICAgVm1hRnJlZShwQWxsb2NhdGlvbkNhbGxiYWNrcywgcHRyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIHZtYV9kZWxldGVfYXJyYXkoY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdGlvbkNhbGxiYWNrcywgVCogcHRyLCBzaXplX3QgY291bnQpCit7CisgICAgaWYocHRyICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgZm9yKHNpemVfdCBpID0gY291bnQ7IGktLTsgKQorICAgICAgICB7CisgICAgICAgICAgICBwdHJbaV0uflQoKTsKKyAgICAgICAgfQorICAgICAgICBWbWFGcmVlKHBBbGxvY2F0aW9uQ2FsbGJhY2tzLCBwdHIpOworICAgIH0KK30KKworLy8gU1RMLWNvbXBhdGlibGUgYWxsb2NhdG9yLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFZtYVN0bEFsbG9jYXRvcgoreworcHVibGljOgorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogY29uc3QgbV9wQ2FsbGJhY2tzOworICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworICAgIAorICAgIFZtYVN0bEFsbG9jYXRvcihjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBDYWxsYmFja3MpIDogbV9wQ2FsbGJhY2tzKHBDYWxsYmFja3MpIHsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IFZtYVN0bEFsbG9jYXRvcihjb25zdCBWbWFTdGxBbGxvY2F0b3I8VT4mIHNyYykgOiBtX3BDYWxsYmFja3Moc3JjLm1fcENhbGxiYWNrcykgeyB9CisKKyAgICBUKiBhbGxvY2F0ZShzaXplX3QgbikgeyByZXR1cm4gVm1hQWxsb2NhdGVBcnJheTxUPihtX3BDYWxsYmFja3MsIG4pOyB9CisgICAgdm9pZCBkZWFsbG9jYXRlKFQqIHAsIHNpemVfdCBuKSB7IFZtYUZyZWUobV9wQ2FsbGJhY2tzLCBwKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVm1hU3RsQWxsb2NhdG9yPFU+JiByaHMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9wQ2FsbGJhY2tzID09IHJocy5tX3BDYWxsYmFja3M7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZtYVN0bEFsbG9jYXRvcjxVPiYgcmhzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcENhbGxiYWNrcyAhPSByaHMubV9wQ2FsbGJhY2tzOworICAgIH0KKworICAgIFZtYVN0bEFsbG9jYXRvciYgb3BlcmF0b3I9KGNvbnN0IFZtYVN0bEFsbG9jYXRvciYgeCkgPSBkZWxldGU7Cit9OworCisjaWYgVk1BX1VTRV9TVExfVkVDVE9SCisKKyNkZWZpbmUgVm1hVmVjdG9yIHN0ZDo6dmVjdG9yCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIGFsbG9jYXRvclQ+CitzdGF0aWMgdm9pZCBWbWFWZWN0b3JJbnNlcnQoc3RkOjp2ZWN0b3I8VCwgYWxsb2NhdG9yVD4mIHZlYywgc2l6ZV90IGluZGV4LCBjb25zdCBUJiBpdGVtKQoreworICAgIHZlYy5pbnNlcnQodmVjLmJlZ2luKCkgKyBpbmRleCwgaXRlbSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIGFsbG9jYXRvclQ+CitzdGF0aWMgdm9pZCBWbWFWZWN0b3JSZW1vdmUoc3RkOjp2ZWN0b3I8VCwgYWxsb2NhdG9yVD4mIHZlYywgc2l6ZV90IGluZGV4KQoreworICAgIHZlYy5lcmFzZSh2ZWMuYmVnaW4oKSArIGluZGV4KTsKK30KKworI2Vsc2UgLy8gI2lmIFZNQV9VU0VfU1RMX1ZFQ1RPUgorCisvKiBDbGFzcyB3aXRoIGludGVyZmFjZSBjb21wYXRpYmxlIHdpdGggc3Vic2V0IG9mIHN0ZDo6dmVjdG9yLgorVCBtdXN0IGJlIFBPRCBiZWNhdXNlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIG5vdCBjYWxsZWQgYW5kIG1lbWNweSBpcwordXNlZCBmb3IgdGhlc2Ugb2JqZWN0cy4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvclQ+CitjbGFzcyBWbWFWZWN0b3IKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKworICAgIFZtYVZlY3Rvcihjb25zdCBBbGxvY2F0b3JUJiBhbGxvY2F0b3IpIDoKKyAgICAgICAgbV9BbGxvY2F0b3IoYWxsb2NhdG9yKSwKKyAgICAgICAgbV9wQXJyYXkoVk1BX05VTEwpLAorICAgICAgICBtX0NvdW50KDApLAorICAgICAgICBtX0NhcGFjaXR5KDApCisgICAgeworICAgIH0KKworICAgIFZtYVZlY3RvcihzaXplX3QgY291bnQsIGNvbnN0IEFsbG9jYXRvclQmIGFsbG9jYXRvcikgOgorICAgICAgICBtX0FsbG9jYXRvcihhbGxvY2F0b3IpLAorICAgICAgICBtX3BBcnJheShjb3VudCA/IChUKilWbWFBbGxvY2F0ZUFycmF5PFQ+KGFsbG9jYXRvci5tX3BDYWxsYmFja3MsIGNvdW50KSA6IFZNQV9OVUxMKSwKKyAgICAgICAgbV9Db3VudChjb3VudCksCisgICAgICAgIG1fQ2FwYWNpdHkoY291bnQpCisgICAgeworICAgIH0KKyAgICAKKyAgICBWbWFWZWN0b3IoY29uc3QgVm1hVmVjdG9yPFQsIEFsbG9jYXRvclQ+JiBzcmMpIDoKKyAgICAgICAgbV9BbGxvY2F0b3Ioc3JjLm1fQWxsb2NhdG9yKSwKKyAgICAgICAgbV9wQXJyYXkoc3JjLm1fQ291bnQgPyAoVCopVm1hQWxsb2NhdGVBcnJheTxUPihzcmMubV9BbGxvY2F0b3IubV9wQ2FsbGJhY2tzLCBzcmMubV9Db3VudCkgOiBWTUFfTlVMTCksCisgICAgICAgIG1fQ291bnQoc3JjLm1fQ291bnQpLAorICAgICAgICBtX0NhcGFjaXR5KHNyYy5tX0NvdW50KQorICAgIHsKKyAgICAgICAgaWYobV9Db3VudCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkobV9wQXJyYXksIHNyYy5tX3BBcnJheSwgbV9Db3VudCAqIHNpemVvZihUKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgflZtYVZlY3RvcigpCisgICAgeworICAgICAgICBWbWFGcmVlKG1fQWxsb2NhdG9yLm1fcENhbGxiYWNrcywgbV9wQXJyYXkpOworICAgIH0KKworICAgIFZtYVZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IFZtYVZlY3RvcjxULCBBbGxvY2F0b3JUPiYgcmhzKQorICAgIHsKKyAgICAgICAgaWYoJnJocyAhPSB0aGlzKQorICAgICAgICB7CisgICAgICAgICAgICByZXNpemUocmhzLm1fQ291bnQpOworICAgICAgICAgICAgaWYobV9Db3VudCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbWNweShtX3BBcnJheSwgcmhzLm1fcEFycmF5LCBtX0NvdW50ICogc2l6ZW9mKFQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBtX0NvdW50ID09IDA7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fQ291bnQ7IH0KKyAgICBUKiBkYXRhKCkgeyByZXR1cm4gbV9wQXJyYXk7IH0KKyAgICBjb25zdCBUKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wQXJyYXk7IH0KKyAgICAKKyAgICBUJiBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkKKyAgICB7CisgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQoaW5kZXggPCBtX0NvdW50KTsKKyAgICAgICAgcmV0dXJuIG1fcEFycmF5W2luZGV4XTsKKyAgICB9CisgICAgY29uc3QgVCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICBWTUFfSEVBVllfQVNTRVJUKGluZGV4IDwgbV9Db3VudCk7CisgICAgICAgIHJldHVybiBtX3BBcnJheVtpbmRleF07CisgICAgfQorCisgICAgVCYgZnJvbnQoKQorICAgIHsKKyAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChtX0NvdW50ID4gMCk7CisgICAgICAgIHJldHVybiBtX3BBcnJheVswXTsKKyAgICB9CisgICAgY29uc3QgVCYgZnJvbnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChtX0NvdW50ID4gMCk7CisgICAgICAgIHJldHVybiBtX3BBcnJheVswXTsKKyAgICB9CisgICAgVCYgYmFjaygpCisgICAgeworICAgICAgICBWTUFfSEVBVllfQVNTRVJUKG1fQ291bnQgPiAwKTsKKyAgICAgICAgcmV0dXJuIG1fcEFycmF5W21fQ291bnQgLSAxXTsKKyAgICB9CisgICAgY29uc3QgVCYgYmFjaygpIGNvbnN0CisgICAgeworICAgICAgICBWTUFfSEVBVllfQVNTRVJUKG1fQ291bnQgPiAwKTsKKyAgICAgICAgcmV0dXJuIG1fcEFycmF5W21fQ291bnQgLSAxXTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90IG5ld0NhcGFjaXR5LCBib29sIGZyZWVNZW1vcnkgPSBmYWxzZSkKKyAgICB7CisgICAgICAgIG5ld0NhcGFjaXR5ID0gVk1BX01BWChuZXdDYXBhY2l0eSwgbV9Db3VudCk7CisgICAgICAgIAorICAgICAgICBpZigobmV3Q2FwYWNpdHkgPCBtX0NhcGFjaXR5KSAmJiAhZnJlZU1lbW9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBtX0NhcGFjaXR5OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihuZXdDYXBhY2l0eSAhPSBtX0NhcGFjaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBUKiBjb25zdCBuZXdBcnJheSA9IG5ld0NhcGFjaXR5ID8gVm1hQWxsb2NhdGVBcnJheTxUPihtX0FsbG9jYXRvciwgbmV3Q2FwYWNpdHkpIDogVk1BX05VTEw7CisgICAgICAgICAgICBpZihtX0NvdW50ICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG5ld0FycmF5LCBtX3BBcnJheSwgbV9Db3VudCAqIHNpemVvZihUKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWbWFGcmVlKG1fQWxsb2NhdG9yLm1fcENhbGxiYWNrcywgbV9wQXJyYXkpOworICAgICAgICAgICAgbV9DYXBhY2l0eSA9IG5ld0NhcGFjaXR5OworICAgICAgICAgICAgbV9wQXJyYXkgPSBuZXdBcnJheTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVzaXplKHNpemVfdCBuZXdDb3VudCwgYm9vbCBmcmVlTWVtb3J5ID0gZmFsc2UpCisgICAgeworICAgICAgICBzaXplX3QgbmV3Q2FwYWNpdHkgPSBtX0NhcGFjaXR5OworICAgICAgICBpZihuZXdDb3VudCA+IG1fQ2FwYWNpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld0NhcGFjaXR5ID0gVk1BX01BWChuZXdDb3VudCwgVk1BX01BWChtX0NhcGFjaXR5ICogMyAvIDIsIChzaXplX3QpOCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoZnJlZU1lbW9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBuZXdDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKG5ld0NhcGFjaXR5ICE9IG1fQ2FwYWNpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFQqIGNvbnN0IG5ld0FycmF5ID0gbmV3Q2FwYWNpdHkgPyBWbWFBbGxvY2F0ZUFycmF5PFQ+KG1fQWxsb2NhdG9yLm1fcENhbGxiYWNrcywgbmV3Q2FwYWNpdHkpIDogVk1BX05VTEw7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgZWxlbWVudHNUb0NvcHkgPSBWTUFfTUlOKG1fQ291bnQsIG5ld0NvdW50KTsKKyAgICAgICAgICAgIGlmKGVsZW1lbnRzVG9Db3B5ICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG5ld0FycmF5LCBtX3BBcnJheSwgZWxlbWVudHNUb0NvcHkgKiBzaXplb2YoVCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVm1hRnJlZShtX0FsbG9jYXRvci5tX3BDYWxsYmFja3MsIG1fcEFycmF5KTsKKyAgICAgICAgICAgIG1fQ2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKKyAgICAgICAgICAgIG1fcEFycmF5ID0gbmV3QXJyYXk7CisgICAgICAgIH0KKworICAgICAgICBtX0NvdW50ID0gbmV3Q291bnQ7CisgICAgfQorCisgICAgdm9pZCBjbGVhcihib29sIGZyZWVNZW1vcnkgPSBmYWxzZSkKKyAgICB7CisgICAgICAgIHJlc2l6ZSgwLCBmcmVlTWVtb3J5KTsKKyAgICB9CisKKyAgICB2b2lkIGluc2VydChzaXplX3QgaW5kZXgsIGNvbnN0IFQmIHNyYykKKyAgICB7CisgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQoaW5kZXggPD0gbV9Db3VudCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBvbGRDb3VudCA9IHNpemUoKTsKKyAgICAgICAgcmVzaXplKG9sZENvdW50ICsgMSk7CisgICAgICAgIGlmKGluZGV4IDwgb2xkQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbW1vdmUobV9wQXJyYXkgKyAoaW5kZXggKyAxKSwgbV9wQXJyYXkgKyBpbmRleCwgKG9sZENvdW50IC0gaW5kZXgpICogc2l6ZW9mKFQpKTsKKyAgICAgICAgfQorICAgICAgICBtX3BBcnJheVtpbmRleF0gPSBzcmM7CisgICAgfQorCisgICAgdm9pZCByZW1vdmUoc2l6ZV90IGluZGV4KQorICAgIHsKKyAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChpbmRleCA8IG1fQ291bnQpOworICAgICAgICBjb25zdCBzaXplX3Qgb2xkQ291bnQgPSBzaXplKCk7CisgICAgICAgIGlmKGluZGV4IDwgb2xkQ291bnQgLSAxKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1tb3ZlKG1fcEFycmF5ICsgaW5kZXgsIG1fcEFycmF5ICsgKGluZGV4ICsgMSksIChvbGRDb3VudCAtIGluZGV4IC0gMSkgKiBzaXplb2YoVCkpOworICAgICAgICB9CisgICAgICAgIHJlc2l6ZShvbGRDb3VudCAtIDEpOworICAgIH0KKworICAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IFQmIHNyYykKKyAgICB7CisgICAgICAgIGNvbnN0IHNpemVfdCBuZXdJbmRleCA9IHNpemUoKTsKKyAgICAgICAgcmVzaXplKG5ld0luZGV4ICsgMSk7CisgICAgICAgIG1fcEFycmF5W25ld0luZGV4XSA9IHNyYzsKKyAgICB9CisKKyAgICB2b2lkIHBvcF9iYWNrKCkKKyAgICB7CisgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQobV9Db3VudCA+IDApOworICAgICAgICByZXNpemUoc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IFQmIHNyYykKKyAgICB7CisgICAgICAgIGluc2VydCgwLCBzcmMpOworICAgIH0KKworICAgIHZvaWQgcG9wX2Zyb250KCkKKyAgICB7CisgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQobV9Db3VudCA+IDApOworICAgICAgICByZW1vdmUoMCk7CisgICAgfQorCisgICAgdHlwZWRlZiBUKiBpdGVyYXRvcjsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbV9wQXJyYXk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBtX3BBcnJheSArIG1fQ291bnQ7IH0KKworcHJpdmF0ZToKKyAgICBBbGxvY2F0b3JUIG1fQWxsb2NhdG9yOworICAgIFQqIG1fcEFycmF5OworICAgIHNpemVfdCBtX0NvdW50OworICAgIHNpemVfdCBtX0NhcGFjaXR5OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgYWxsb2NhdG9yVD4KK3N0YXRpYyB2b2lkIFZtYVZlY3Rvckluc2VydChWbWFWZWN0b3I8VCwgYWxsb2NhdG9yVD4mIHZlYywgc2l6ZV90IGluZGV4LCBjb25zdCBUJiBpdGVtKQoreworICAgIHZlYy5pbnNlcnQoaW5kZXgsIGl0ZW0pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBhbGxvY2F0b3JUPgorc3RhdGljIHZvaWQgVm1hVmVjdG9yUmVtb3ZlKFZtYVZlY3RvcjxULCBhbGxvY2F0b3JUPiYgdmVjLCBzaXplX3QgaW5kZXgpCit7CisgICAgdmVjLnJlbW92ZShpbmRleCk7Cit9CisKKyNlbmRpZiAvLyAjaWYgVk1BX1VTRV9TVExfVkVDVE9SCisKK3RlbXBsYXRlPHR5cGVuYW1lIENtcExlc3MsIHR5cGVuYW1lIFZlY3RvclQ+CitzaXplX3QgVm1hVmVjdG9ySW5zZXJ0U29ydGVkKFZlY3RvclQmIHZlY3RvciwgY29uc3QgdHlwZW5hbWUgVmVjdG9yVDo6dmFsdWVfdHlwZSYgdmFsdWUpCit7CisgICAgY29uc3Qgc2l6ZV90IGluZGV4VG9JbnNlcnQgPSBWbWFCaW5hcnlGaW5kRmlyc3ROb3RMZXNzKAorICAgICAgICB2ZWN0b3IuZGF0YSgpLAorICAgICAgICB2ZWN0b3IuZGF0YSgpICsgdmVjdG9yLnNpemUoKSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIENtcExlc3MoKSkgLSB2ZWN0b3IuZGF0YSgpOworICAgIFZtYVZlY3Rvckluc2VydCh2ZWN0b3IsIGluZGV4VG9JbnNlcnQsIHZhbHVlKTsKKyAgICByZXR1cm4gaW5kZXhUb0luc2VydDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQ21wTGVzcywgdHlwZW5hbWUgVmVjdG9yVD4KK2Jvb2wgVm1hVmVjdG9yUmVtb3ZlU29ydGVkKFZlY3RvclQmIHZlY3RvciwgY29uc3QgdHlwZW5hbWUgVmVjdG9yVDo6dmFsdWVfdHlwZSYgdmFsdWUpCit7CisgICAgQ21wTGVzcyBjb21wYXJhdG9yOworICAgIHR5cGVuYW1lIFZlY3RvclQ6Oml0ZXJhdG9yIGl0ID0gVm1hQmluYXJ5RmluZEZpcnN0Tm90TGVzcygKKyAgICAgICAgdmVjdG9yLmJlZ2luKCksCisgICAgICAgIHZlY3Rvci5lbmQoKSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIGNvbXBhcmF0b3IpOworICAgIGlmKChpdCAhPSB2ZWN0b3IuZW5kKCkpICYmICFjb21wYXJhdG9yKCppdCwgdmFsdWUpICYmICFjb21wYXJhdG9yKHZhbHVlLCAqaXQpKQorICAgIHsKKyAgICAgICAgc2l6ZV90IGluZGV4VG9SZW1vdmUgPSBpdCAtIHZlY3Rvci5iZWdpbigpOworICAgICAgICBWbWFWZWN0b3JSZW1vdmUodmVjdG9yLCBpbmRleFRvUmVtb3ZlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQ21wTGVzcywgdHlwZW5hbWUgSXRlclQsIHR5cGVuYW1lIEtleVQ+CitJdGVyVCBWbWFWZWN0b3JGaW5kU29ydGVkKGNvbnN0IEl0ZXJUJiBiZWcsIGNvbnN0IEl0ZXJUJiBlbmQsIGNvbnN0IEtleVQmIHZhbHVlKQoreworICAgIENtcExlc3MgY29tcGFyYXRvcjsKKyAgICBJdGVyVCBpdCA9IFZtYUJpbmFyeUZpbmRGaXJzdE5vdExlc3M8Q21wTGVzcywgSXRlclQsIEtleVQ+KAorICAgICAgICBiZWcsIGVuZCwgdmFsdWUsIGNvbXBhcmF0b3IpOworICAgIGlmKGl0ID09IGVuZCB8fAorICAgICAgICAoIWNvbXBhcmF0b3IoKml0LCB2YWx1ZSkgJiYgIWNvbXBhcmF0b3IodmFsdWUsICppdCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGl0OworICAgIH0KKyAgICByZXR1cm4gZW5kOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gY2xhc3MgVm1hUG9vbEFsbG9jYXRvcgorCisvKgorQWxsb2NhdG9yIGZvciBvYmplY3RzIG9mIHR5cGUgVCB1c2luZyBhIGxpc3Qgb2YgYXJyYXlzIChwb29scykgdG8gc3BlZWQgdXAKK2FsbG9jYXRpb24uIE51bWJlciBvZiBlbGVtZW50cyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgaXMgbm90IGJvdW5kZWQgYmVjYXVzZQorYWxsb2NhdG9yIGNhbiBjcmVhdGUgbXVsdGlwbGUgYmxvY2tzLgorKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBWbWFQb29sQWxsb2NhdG9yCit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hUG9vbEFsbG9jYXRvcikKK3B1YmxpYzoKKyAgICBWbWFQb29sQWxsb2NhdG9yKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRpb25DYWxsYmFja3MsIHNpemVfdCBpdGVtc1BlckJsb2NrKTsKKyAgICB+Vm1hUG9vbEFsbG9jYXRvcigpOworICAgIHZvaWQgQ2xlYXIoKTsKKyAgICBUKiBBbGxvYygpOworICAgIHZvaWQgRnJlZShUKiBwdHIpOworCitwcml2YXRlOgorICAgIHVuaW9uIEl0ZW0KKyAgICB7CisgICAgICAgIHVpbnQzMl90IE5leHRGcmVlSW5kZXg7CisgICAgICAgIFQgVmFsdWU7CisgICAgfTsKKworICAgIHN0cnVjdCBJdGVtQmxvY2sKKyAgICB7CisgICAgICAgIEl0ZW0qIHBJdGVtczsKKyAgICAgICAgdWludDMyX3QgRmlyc3RGcmVlSW5kZXg7CisgICAgfTsKKyAgICAKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIG1fcEFsbG9jYXRpb25DYWxsYmFja3M7CisgICAgc2l6ZV90IG1fSXRlbXNQZXJCbG9jazsKKyAgICBWbWFWZWN0b3I8IEl0ZW1CbG9jaywgVm1hU3RsQWxsb2NhdG9yPEl0ZW1CbG9jaz4gPiBtX0l0ZW1CbG9ja3M7CisKKyAgICBJdGVtQmxvY2smIENyZWF0ZU5ld0Jsb2NrKCk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVm1hUG9vbEFsbG9jYXRvcjxUPjo6Vm1hUG9vbEFsbG9jYXRvcihjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0aW9uQ2FsbGJhY2tzLCBzaXplX3QgaXRlbXNQZXJCbG9jaykgOgorICAgIG1fcEFsbG9jYXRpb25DYWxsYmFja3MocEFsbG9jYXRpb25DYWxsYmFja3MpLAorICAgIG1fSXRlbXNQZXJCbG9jayhpdGVtc1BlckJsb2NrKSwKKyAgICBtX0l0ZW1CbG9ja3MoVm1hU3RsQWxsb2NhdG9yPEl0ZW1CbG9jaz4ocEFsbG9jYXRpb25DYWxsYmFja3MpKQoreworICAgIFZNQV9BU1NFUlQoaXRlbXNQZXJCbG9jayA+IDApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVm1hUG9vbEFsbG9jYXRvcjxUPjo6flZtYVBvb2xBbGxvY2F0b3IoKQoreworICAgIENsZWFyKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIFZtYVBvb2xBbGxvY2F0b3I8VD46OkNsZWFyKCkKK3sKKyAgICBmb3Ioc2l6ZV90IGkgPSBtX0l0ZW1CbG9ja3Muc2l6ZSgpOyBpLS07ICkKKyAgICAgICAgdm1hX2RlbGV0ZV9hcnJheShtX3BBbGxvY2F0aW9uQ2FsbGJhY2tzLCBtX0l0ZW1CbG9ja3NbaV0ucEl0ZW1zLCBtX0l0ZW1zUGVyQmxvY2spOworICAgIG1fSXRlbUJsb2Nrcy5jbGVhcigpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCogVm1hUG9vbEFsbG9jYXRvcjxUPjo6QWxsb2MoKQoreworICAgIGZvcihzaXplX3QgaSA9IG1fSXRlbUJsb2Nrcy5zaXplKCk7IGktLTsgKQorICAgIHsKKyAgICAgICAgSXRlbUJsb2NrJiBibG9jayA9IG1fSXRlbUJsb2Nrc1tpXTsKKyAgICAgICAgLy8gVGhpcyBibG9jayBoYXMgc29tZSBmcmVlIGl0ZW1zOiBVc2UgZmlyc3Qgb25lLgorICAgICAgICBpZihibG9jay5GaXJzdEZyZWVJbmRleCAhPSBVSU5UMzJfTUFYKQorICAgICAgICB7CisgICAgICAgICAgICBJdGVtKiBjb25zdCBwSXRlbSA9ICZibG9jay5wSXRlbXNbYmxvY2suRmlyc3RGcmVlSW5kZXhdOworICAgICAgICAgICAgYmxvY2suRmlyc3RGcmVlSW5kZXggPSBwSXRlbS0+TmV4dEZyZWVJbmRleDsKKyAgICAgICAgICAgIHJldHVybiAmcEl0ZW0tPlZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gYmxvY2sgaGFzIGZyZWUgaXRlbTogQ3JlYXRlIG5ldyBvbmUgYW5kIHVzZSBpdC4KKyAgICBJdGVtQmxvY2smIG5ld0Jsb2NrID0gQ3JlYXRlTmV3QmxvY2soKTsKKyAgICBJdGVtKiBjb25zdCBwSXRlbSA9ICZuZXdCbG9jay5wSXRlbXNbMF07CisgICAgbmV3QmxvY2suRmlyc3RGcmVlSW5kZXggPSBwSXRlbS0+TmV4dEZyZWVJbmRleDsKKyAgICByZXR1cm4gJnBJdGVtLT5WYWx1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgVm1hUG9vbEFsbG9jYXRvcjxUPjo6RnJlZShUKiBwdHIpCit7CisgICAgLy8gU2VhcmNoIGFsbCBtZW1vcnkgYmxvY2tzIHRvIGZpbmQgcHRyLgorICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtX0l0ZW1CbG9ja3Muc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgICBJdGVtQmxvY2smIGJsb2NrID0gbV9JdGVtQmxvY2tzW2ldOworICAgICAgICAKKyAgICAgICAgLy8gQ2FzdGluZyB0byB1bmlvbi4KKyAgICAgICAgSXRlbSogcEl0ZW1QdHI7CisgICAgICAgIG1lbWNweSgmcEl0ZW1QdHIsICZwdHIsIHNpemVvZihwSXRlbVB0cikpOworICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgaWYgcEl0ZW1QdHIgaXMgaW4gYWRkcmVzcyByYW5nZSBvZiB0aGlzIGJsb2NrLgorICAgICAgICBpZigocEl0ZW1QdHIgPj0gYmxvY2sucEl0ZW1zKSAmJiAocEl0ZW1QdHIgPCBibG9jay5wSXRlbXMgKyBtX0l0ZW1zUGVyQmxvY2spKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBpbmRleCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwSXRlbVB0ciAtIGJsb2NrLnBJdGVtcyk7CisgICAgICAgICAgICBwSXRlbVB0ci0+TmV4dEZyZWVJbmRleCA9IGJsb2NrLkZpcnN0RnJlZUluZGV4OworICAgICAgICAgICAgYmxvY2suRmlyc3RGcmVlSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBWTUFfQVNTRVJUKDAgJiYgIlBvaW50ZXIgZG9lc24ndCBiZWxvbmcgdG8gdGhpcyBtZW1vcnkgcG9vbC4iKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIFZtYVBvb2xBbGxvY2F0b3I8VD46Okl0ZW1CbG9jayYgVm1hUG9vbEFsbG9jYXRvcjxUPjo6Q3JlYXRlTmV3QmxvY2soKQoreworICAgIEl0ZW1CbG9jayBuZXdCbG9jayA9IHsKKyAgICAgICAgdm1hX25ld19hcnJheShtX3BBbGxvY2F0aW9uQ2FsbGJhY2tzLCBJdGVtLCBtX0l0ZW1zUGVyQmxvY2spLCAwIH07CisKKyAgICBtX0l0ZW1CbG9ja3MucHVzaF9iYWNrKG5ld0Jsb2NrKTsKKworICAgIC8vIFNldHVwIHNpbmdseS1saW5rZWQgbGlzdCBvZiBhbGwgZnJlZSBpdGVtcyBpbiB0aGlzIGJsb2NrLgorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1fSXRlbXNQZXJCbG9jayAtIDE7ICsraSkKKyAgICAgICAgbmV3QmxvY2sucEl0ZW1zW2ldLk5leHRGcmVlSW5kZXggPSBpICsgMTsKKyAgICBuZXdCbG9jay5wSXRlbXNbbV9JdGVtc1BlckJsb2NrIC0gMV0uTmV4dEZyZWVJbmRleCA9IFVJTlQzMl9NQVg7CisgICAgcmV0dXJuIG1fSXRlbUJsb2Nrcy5iYWNrKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBjbGFzcyBWbWFSYXdMaXN0LCBWbWFMaXN0CisKKyNpZiBWTUFfVVNFX1NUTF9MSVNUCisKKyNkZWZpbmUgVm1hTGlzdCBzdGQ6Omxpc3QKKworI2Vsc2UgLy8gI2lmIFZNQV9VU0VfU1RMX0xJU1QKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBWbWFMaXN0SXRlbQoreworICAgIFZtYUxpc3RJdGVtKiBwUHJldjsKKyAgICBWbWFMaXN0SXRlbSogcE5leHQ7CisgICAgVCBWYWx1ZTsKK307CisKKy8vIERvdWJseSBsaW5rZWQgbGlzdC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBWbWFSYXdMaXN0Cit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hUmF3TGlzdCkKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFZtYUxpc3RJdGVtPFQ+IEl0ZW1UeXBlOworCisgICAgVm1hUmF3TGlzdChjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0aW9uQ2FsbGJhY2tzKTsKKyAgICB+Vm1hUmF3TGlzdCgpOworICAgIHZvaWQgQ2xlYXIoKTsKKworICAgIHNpemVfdCBHZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fQ291bnQ7IH0KKyAgICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX0NvdW50ID09IDA7IH0KKworICAgIEl0ZW1UeXBlKiBGcm9udCgpIHsgcmV0dXJuIG1fcEZyb250OyB9CisgICAgY29uc3QgSXRlbVR5cGUqIEZyb250KCkgY29uc3QgeyByZXR1cm4gbV9wRnJvbnQ7IH0KKyAgICBJdGVtVHlwZSogQmFjaygpIHsgcmV0dXJuIG1fcEJhY2s7IH0KKyAgICBjb25zdCBJdGVtVHlwZSogQmFjaygpIGNvbnN0IHsgcmV0dXJuIG1fcEJhY2s7IH0KKworICAgIEl0ZW1UeXBlKiBQdXNoQmFjaygpOworICAgIEl0ZW1UeXBlKiBQdXNoRnJvbnQoKTsKKyAgICBJdGVtVHlwZSogUHVzaEJhY2soY29uc3QgVCYgdmFsdWUpOworICAgIEl0ZW1UeXBlKiBQdXNoRnJvbnQoY29uc3QgVCYgdmFsdWUpOworICAgIHZvaWQgUG9wQmFjaygpOworICAgIHZvaWQgUG9wRnJvbnQoKTsKKyAgICAKKyAgICAvLyBJdGVtIGNhbiBiZSBudWxsIC0gaXQgbWVhbnMgUHVzaEJhY2suCisgICAgSXRlbVR5cGUqIEluc2VydEJlZm9yZShJdGVtVHlwZSogcEl0ZW0pOworICAgIC8vIEl0ZW0gY2FuIGJlIG51bGwgLSBpdCBtZWFucyBQdXNoRnJvbnQuCisgICAgSXRlbVR5cGUqIEluc2VydEFmdGVyKEl0ZW1UeXBlKiBwSXRlbSk7CisKKyAgICBJdGVtVHlwZSogSW5zZXJ0QmVmb3JlKEl0ZW1UeXBlKiBwSXRlbSwgY29uc3QgVCYgdmFsdWUpOworICAgIEl0ZW1UeXBlKiBJbnNlcnRBZnRlcihJdGVtVHlwZSogcEl0ZW0sIGNvbnN0IFQmIHZhbHVlKTsKKworICAgIHZvaWQgUmVtb3ZlKEl0ZW1UeXBlKiBwSXRlbSk7CisKK3ByaXZhdGU6CisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBjb25zdCBtX3BBbGxvY2F0aW9uQ2FsbGJhY2tzOworICAgIFZtYVBvb2xBbGxvY2F0b3I8SXRlbVR5cGU+IG1fSXRlbUFsbG9jYXRvcjsKKyAgICBJdGVtVHlwZSogbV9wRnJvbnQ7CisgICAgSXRlbVR5cGUqIG1fcEJhY2s7CisgICAgc2l6ZV90IG1fQ291bnQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVm1hUmF3TGlzdDxUPjo6Vm1hUmF3TGlzdChjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0aW9uQ2FsbGJhY2tzKSA6CisgICAgbV9wQWxsb2NhdGlvbkNhbGxiYWNrcyhwQWxsb2NhdGlvbkNhbGxiYWNrcyksCisgICAgbV9JdGVtQWxsb2NhdG9yKHBBbGxvY2F0aW9uQ2FsbGJhY2tzLCAxMjgpLAorICAgIG1fcEZyb250KFZNQV9OVUxMKSwKKyAgICBtX3BCYWNrKFZNQV9OVUxMKSwKKyAgICBtX0NvdW50KDApCit7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitWbWFSYXdMaXN0PFQ+Ojp+Vm1hUmF3TGlzdCgpCit7CisgICAgLy8gSW50ZW50aW9uYWxseSBub3QgY2FsbGluZyBDbGVhciwgYmVjYXVzZSB0aGF0IHdvdWxkIGJlIHVubmVjZXNzYXJ5CisgICAgLy8gY29tcHV0YXRpb25zIHRvIHJldHVybiBhbGwgaXRlbXMgdG8gbV9JdGVtQWxsb2NhdG9yIGFzIGZyZWUuCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIFZtYVJhd0xpc3Q8VD46OkNsZWFyKCkKK3sKKyAgICBpZihJc0VtcHR5KCkgPT0gZmFsc2UpCisgICAgeworICAgICAgICBJdGVtVHlwZSogcEl0ZW0gPSBtX3BCYWNrOworICAgICAgICB3aGlsZShwSXRlbSAhPSBWTUFfTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgSXRlbVR5cGUqIGNvbnN0IHBQcmV2SXRlbSA9IHBJdGVtLT5wUHJldjsKKyAgICAgICAgICAgIG1fSXRlbUFsbG9jYXRvci5GcmVlKHBJdGVtKTsKKyAgICAgICAgICAgIHBJdGVtID0gcFByZXZJdGVtOworICAgICAgICB9CisgICAgICAgIG1fcEZyb250ID0gVk1BX05VTEw7CisgICAgICAgIG1fcEJhY2sgPSBWTUFfTlVMTDsKKyAgICAgICAgbV9Db3VudCA9IDA7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVm1hTGlzdEl0ZW08VD4qIFZtYVJhd0xpc3Q8VD46OlB1c2hCYWNrKCkKK3sKKyAgICBJdGVtVHlwZSogY29uc3QgcE5ld0l0ZW0gPSBtX0l0ZW1BbGxvY2F0b3IuQWxsb2MoKTsKKyAgICBwTmV3SXRlbS0+cE5leHQgPSBWTUFfTlVMTDsKKyAgICBpZihJc0VtcHR5KCkpCisgICAgeworICAgICAgICBwTmV3SXRlbS0+cFByZXYgPSBWTUFfTlVMTDsKKyAgICAgICAgbV9wRnJvbnQgPSBwTmV3SXRlbTsKKyAgICAgICAgbV9wQmFjayA9IHBOZXdJdGVtOworICAgICAgICBtX0NvdW50ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE5ld0l0ZW0tPnBQcmV2ID0gbV9wQmFjazsKKyAgICAgICAgbV9wQmFjay0+cE5leHQgPSBwTmV3SXRlbTsKKyAgICAgICAgbV9wQmFjayA9IHBOZXdJdGVtOworICAgICAgICArK21fQ291bnQ7CisgICAgfQorICAgIHJldHVybiBwTmV3SXRlbTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1ZtYUxpc3RJdGVtPFQ+KiBWbWFSYXdMaXN0PFQ+OjpQdXNoRnJvbnQoKQoreworICAgIEl0ZW1UeXBlKiBjb25zdCBwTmV3SXRlbSA9IG1fSXRlbUFsbG9jYXRvci5BbGxvYygpOworICAgIHBOZXdJdGVtLT5wUHJldiA9IFZNQV9OVUxMOworICAgIGlmKElzRW1wdHkoKSkKKyAgICB7CisgICAgICAgIHBOZXdJdGVtLT5wTmV4dCA9IFZNQV9OVUxMOworICAgICAgICBtX3BGcm9udCA9IHBOZXdJdGVtOworICAgICAgICBtX3BCYWNrID0gcE5ld0l0ZW07CisgICAgICAgIG1fQ291bnQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwTmV3SXRlbS0+cE5leHQgPSBtX3BGcm9udDsKKyAgICAgICAgbV9wRnJvbnQtPnBQcmV2ID0gcE5ld0l0ZW07CisgICAgICAgIG1fcEZyb250ID0gcE5ld0l0ZW07CisgICAgICAgICsrbV9Db3VudDsKKyAgICB9CisgICAgcmV0dXJuIHBOZXdJdGVtOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVm1hTGlzdEl0ZW08VD4qIFZtYVJhd0xpc3Q8VD46OlB1c2hCYWNrKGNvbnN0IFQmIHZhbHVlKQoreworICAgIEl0ZW1UeXBlKiBjb25zdCBwTmV3SXRlbSA9IFB1c2hCYWNrKCk7CisgICAgcE5ld0l0ZW0tPlZhbHVlID0gdmFsdWU7CisgICAgcmV0dXJuIHBOZXdJdGVtOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVm1hTGlzdEl0ZW08VD4qIFZtYVJhd0xpc3Q8VD46OlB1c2hGcm9udChjb25zdCBUJiB2YWx1ZSkKK3sKKyAgICBJdGVtVHlwZSogY29uc3QgcE5ld0l0ZW0gPSBQdXNoRnJvbnQoKTsKKyAgICBwTmV3SXRlbS0+VmFsdWUgPSB2YWx1ZTsKKyAgICByZXR1cm4gcE5ld0l0ZW07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIFZtYVJhd0xpc3Q8VD46OlBvcEJhY2soKQoreworICAgIFZNQV9IRUFWWV9BU1NFUlQobV9Db3VudCA+IDApOworICAgIEl0ZW1UeXBlKiBjb25zdCBwQmFja0l0ZW0gPSBtX3BCYWNrOworICAgIEl0ZW1UeXBlKiBjb25zdCBwUHJldkl0ZW0gPSBwQmFja0l0ZW0tPnBQcmV2OworICAgIGlmKHBQcmV2SXRlbSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIHBQcmV2SXRlbS0+cE5leHQgPSBWTUFfTlVMTDsKKyAgICB9CisgICAgbV9wQmFjayA9IHBQcmV2SXRlbTsKKyAgICBtX0l0ZW1BbGxvY2F0b3IuRnJlZShwQmFja0l0ZW0pOworICAgIC0tbV9Db3VudDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgVm1hUmF3TGlzdDxUPjo6UG9wRnJvbnQoKQoreworICAgIFZNQV9IRUFWWV9BU1NFUlQobV9Db3VudCA+IDApOworICAgIEl0ZW1UeXBlKiBjb25zdCBwRnJvbnRJdGVtID0gbV9wRnJvbnQ7CisgICAgSXRlbVR5cGUqIGNvbnN0IHBOZXh0SXRlbSA9IHBGcm9udEl0ZW0tPnBOZXh0OworICAgIGlmKHBOZXh0SXRlbSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIHBOZXh0SXRlbS0+cFByZXYgPSBWTUFfTlVMTDsKKyAgICB9CisgICAgbV9wRnJvbnQgPSBwTmV4dEl0ZW07CisgICAgbV9JdGVtQWxsb2NhdG9yLkZyZWUocEZyb250SXRlbSk7CisgICAgLS1tX0NvdW50OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBWbWFSYXdMaXN0PFQ+OjpSZW1vdmUoSXRlbVR5cGUqIHBJdGVtKQoreworICAgIFZNQV9IRUFWWV9BU1NFUlQocEl0ZW0gIT0gVk1BX05VTEwpOworICAgIFZNQV9IRUFWWV9BU1NFUlQobV9Db3VudCA+IDApOworCisgICAgaWYocEl0ZW0tPnBQcmV2ICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgcEl0ZW0tPnBQcmV2LT5wTmV4dCA9IHBJdGVtLT5wTmV4dDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChtX3BGcm9udCA9PSBwSXRlbSk7CisgICAgICAgIG1fcEZyb250ID0gcEl0ZW0tPnBOZXh0OworICAgIH0KKworICAgIGlmKHBJdGVtLT5wTmV4dCAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIHBJdGVtLT5wTmV4dC0+cFByZXYgPSBwSXRlbS0+cFByZXY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQobV9wQmFjayA9PSBwSXRlbSk7CisgICAgICAgIG1fcEJhY2sgPSBwSXRlbS0+cFByZXY7CisgICAgfQorCisgICAgbV9JdGVtQWxsb2NhdG9yLkZyZWUocEl0ZW0pOworICAgIC0tbV9Db3VudDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1ZtYUxpc3RJdGVtPFQ+KiBWbWFSYXdMaXN0PFQ+OjpJbnNlcnRCZWZvcmUoSXRlbVR5cGUqIHBJdGVtKQoreworICAgIGlmKHBJdGVtICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgSXRlbVR5cGUqIGNvbnN0IHByZXZJdGVtID0gcEl0ZW0tPnBQcmV2OworICAgICAgICBJdGVtVHlwZSogY29uc3QgbmV3SXRlbSA9IG1fSXRlbUFsbG9jYXRvci5BbGxvYygpOworICAgICAgICBuZXdJdGVtLT5wUHJldiA9IHByZXZJdGVtOworICAgICAgICBuZXdJdGVtLT5wTmV4dCA9IHBJdGVtOworICAgICAgICBwSXRlbS0+cFByZXYgPSBuZXdJdGVtOworICAgICAgICBpZihwcmV2SXRlbSAhPSBWTUFfTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJldkl0ZW0tPnBOZXh0ID0gbmV3SXRlbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQobV9wRnJvbnQgPT0gcEl0ZW0pOworICAgICAgICAgICAgbV9wRnJvbnQgPSBuZXdJdGVtOworICAgICAgICB9CisgICAgICAgICsrbV9Db3VudDsKKyAgICAgICAgcmV0dXJuIG5ld0l0ZW07CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB1c2hCYWNrKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitWbWFMaXN0SXRlbTxUPiogVm1hUmF3TGlzdDxUPjo6SW5zZXJ0QWZ0ZXIoSXRlbVR5cGUqIHBJdGVtKQoreworICAgIGlmKHBJdGVtICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgSXRlbVR5cGUqIGNvbnN0IG5leHRJdGVtID0gcEl0ZW0tPnBOZXh0OworICAgICAgICBJdGVtVHlwZSogY29uc3QgbmV3SXRlbSA9IG1fSXRlbUFsbG9jYXRvci5BbGxvYygpOworICAgICAgICBuZXdJdGVtLT5wTmV4dCA9IG5leHRJdGVtOworICAgICAgICBuZXdJdGVtLT5wUHJldiA9IHBJdGVtOworICAgICAgICBwSXRlbS0+cE5leHQgPSBuZXdJdGVtOworICAgICAgICBpZihuZXh0SXRlbSAhPSBWTUFfTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dEl0ZW0tPnBQcmV2ID0gbmV3SXRlbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQobV9wQmFjayA9PSBwSXRlbSk7CisgICAgICAgICAgICBtX3BCYWNrID0gbmV3SXRlbTsKKyAgICAgICAgfQorICAgICAgICArK21fQ291bnQ7CisgICAgICAgIHJldHVybiBuZXdJdGVtOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQdXNoRnJvbnQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1ZtYUxpc3RJdGVtPFQ+KiBWbWFSYXdMaXN0PFQ+OjpJbnNlcnRCZWZvcmUoSXRlbVR5cGUqIHBJdGVtLCBjb25zdCBUJiB2YWx1ZSkKK3sKKyAgICBJdGVtVHlwZSogY29uc3QgbmV3SXRlbSA9IEluc2VydEJlZm9yZShwSXRlbSk7CisgICAgbmV3SXRlbS0+VmFsdWUgPSB2YWx1ZTsKKyAgICByZXR1cm4gbmV3SXRlbTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1ZtYUxpc3RJdGVtPFQ+KiBWbWFSYXdMaXN0PFQ+OjpJbnNlcnRBZnRlcihJdGVtVHlwZSogcEl0ZW0sIGNvbnN0IFQmIHZhbHVlKQoreworICAgIEl0ZW1UeXBlKiBjb25zdCBuZXdJdGVtID0gSW5zZXJ0QWZ0ZXIocEl0ZW0pOworICAgIG5ld0l0ZW0tPlZhbHVlID0gdmFsdWU7CisgICAgcmV0dXJuIG5ld0l0ZW07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvclQ+CitjbGFzcyBWbWFMaXN0Cit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hTGlzdCkKK3B1YmxpYzoKKyAgICBjbGFzcyBpdGVyYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCkgOgorICAgICAgICAgICAgbV9wTGlzdChWTUFfTlVMTCksCisgICAgICAgICAgICBtX3BJdGVtKFZNQV9OVUxMKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBUJiBvcGVyYXRvciooKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBWTUFfSEVBVllfQVNTRVJUKG1fcEl0ZW0gIT0gVk1BX05VTEwpOworICAgICAgICAgICAgcmV0dXJuIG1fcEl0ZW0tPlZhbHVlOworICAgICAgICB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBWTUFfSEVBVllfQVNTRVJUKG1fcEl0ZW0gIT0gVk1BX05VTEwpOworICAgICAgICAgICAgcmV0dXJuICZtX3BJdGVtLT5WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChtX3BJdGVtICE9IFZNQV9OVUxMKTsKKyAgICAgICAgICAgIG1fcEl0ZW0gPSBtX3BJdGVtLT5wTmV4dDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3ItLSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1fcEl0ZW0gIT0gVk1BX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9wSXRlbSA9IG1fcEl0ZW0tPnBQcmV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQoIW1fcExpc3QtPklzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgbV9wSXRlbSA9IG1fcExpc3QtPkJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgICAgICB7CisgICAgICAgICAgICBpdGVyYXRvciByZXN1bHQgPSAqdGhpczsKKyAgICAgICAgICAgICsrKnRoaXM7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KQorICAgICAgICB7CisgICAgICAgICAgICBpdGVyYXRvciByZXN1bHQgPSAqdGhpczsKKyAgICAgICAgICAgIC0tKnRoaXM7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiByaHMpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQobV9wTGlzdCA9PSByaHMubV9wTGlzdCk7CisgICAgICAgICAgICByZXR1cm4gbV9wSXRlbSA9PSByaHMubV9wSXRlbTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChtX3BMaXN0ID09IHJocy5tX3BMaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBtX3BJdGVtICE9IHJocy5tX3BJdGVtOworICAgICAgICB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIFZtYVJhd0xpc3Q8VD4qIG1fcExpc3Q7CisgICAgICAgIFZtYUxpc3RJdGVtPFQ+KiBtX3BJdGVtOworCisgICAgICAgIGl0ZXJhdG9yKFZtYVJhd0xpc3Q8VD4qIHBMaXN0LCBWbWFMaXN0SXRlbTxUPiogcEl0ZW0pIDoKKyAgICAgICAgICAgIG1fcExpc3QocExpc3QpLAorICAgICAgICAgICAgbV9wSXRlbShwSXRlbSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIFZtYUxpc3Q8VCwgQWxsb2NhdG9yVD47CisgICAgfTsKKworICAgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgY29uc3RfaXRlcmF0b3IoKSA6CisgICAgICAgICAgICBtX3BMaXN0KFZNQV9OVUxMKSwKKyAgICAgICAgICAgIG1fcEl0ZW0oVk1BX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBzcmMpIDoKKyAgICAgICAgICAgIG1fcExpc3Qoc3JjLm1fcExpc3QpLAorICAgICAgICAgICAgbV9wSXRlbShzcmMubV9wSXRlbSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjb25zdCBUJiBvcGVyYXRvciooKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBWTUFfSEVBVllfQVNTRVJUKG1fcEl0ZW0gIT0gVk1BX05VTEwpOworICAgICAgICAgICAgcmV0dXJuIG1fcEl0ZW0tPlZhbHVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBWTUFfSEVBVllfQVNTRVJUKG1fcEl0ZW0gIT0gVk1BX05VTEwpOworICAgICAgICAgICAgcmV0dXJuICZtX3BJdGVtLT5WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChtX3BJdGVtICE9IFZNQV9OVUxMKTsKKyAgICAgICAgICAgIG1fcEl0ZW0gPSBtX3BJdGVtLT5wTmV4dDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBjb25zdF9pdGVyYXRvciYgb3BlcmF0b3ItLSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1fcEl0ZW0gIT0gVk1BX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9wSXRlbSA9IG1fcEl0ZW0tPnBQcmV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQoIW1fcExpc3QtPklzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgbV9wSXRlbSA9IG1fcExpc3QtPkJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdF9pdGVyYXRvciByZXN1bHQgPSAqdGhpczsKKyAgICAgICAgICAgICsrKnRoaXM7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdF9pdGVyYXRvciByZXN1bHQgPSAqdGhpczsKKyAgICAgICAgICAgIC0tKnRoaXM7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQobV9wTGlzdCA9PSByaHMubV9wTGlzdCk7CisgICAgICAgICAgICByZXR1cm4gbV9wSXRlbSA9PSByaHMubV9wSXRlbTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIHJocykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChtX3BMaXN0ID09IHJocy5tX3BMaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBtX3BJdGVtICE9IHJocy5tX3BJdGVtOworICAgICAgICB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yKGNvbnN0IFZtYVJhd0xpc3Q8VD4qIHBMaXN0LCBjb25zdCBWbWFMaXN0SXRlbTxUPiogcEl0ZW0pIDoKKyAgICAgICAgICAgIG1fcExpc3QocExpc3QpLAorICAgICAgICAgICAgbV9wSXRlbShwSXRlbSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgVm1hUmF3TGlzdDxUPiogbV9wTGlzdDsKKyAgICAgICAgY29uc3QgVm1hTGlzdEl0ZW08VD4qIG1fcEl0ZW07CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIFZtYUxpc3Q8VCwgQWxsb2NhdG9yVD47CisgICAgfTsKKworICAgIFZtYUxpc3QoY29uc3QgQWxsb2NhdG9yVCYgYWxsb2NhdG9yKSA6IG1fUmF3TGlzdChhbGxvY2F0b3IubV9wQ2FsbGJhY2tzKSB7IH0KKworICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBtX1Jhd0xpc3QuSXNFbXB0eSgpOyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX1Jhd0xpc3QuR2V0Q291bnQoKTsgfQorCisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcigmbV9SYXdMaXN0LCBtX1Jhd0xpc3QuRnJvbnQoKSk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigmbV9SYXdMaXN0LCBWTUFfTlVMTCk7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZtX1Jhd0xpc3QsIG1fUmF3TGlzdC5Gcm9udCgpKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmbV9SYXdMaXN0LCBWTUFfTlVMTCk7IH0KKworICAgIHZvaWQgY2xlYXIoKSB7IG1fUmF3TGlzdC5DbGVhcigpOyB9CisgICAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCYgdmFsdWUpIHsgbV9SYXdMaXN0LlB1c2hCYWNrKHZhbHVlKTsgfQorICAgIHZvaWQgZXJhc2UoaXRlcmF0b3IgaXQpIHsgbV9SYXdMaXN0LlJlbW92ZShpdC5tX3BJdGVtKTsgfQorICAgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBpdCwgY29uc3QgVCYgdmFsdWUpIHsgcmV0dXJuIGl0ZXJhdG9yKCZtX1Jhd0xpc3QsIG1fUmF3TGlzdC5JbnNlcnRCZWZvcmUoaXQubV9wSXRlbSwgdmFsdWUpKTsgfQorCitwcml2YXRlOgorICAgIFZtYVJhd0xpc3Q8VD4gbV9SYXdMaXN0OworfTsKKworI2VuZGlmIC8vICNpZiBWTUFfVVNFX1NUTF9MSVNUCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBjbGFzcyBWbWFNYXAKKworLy8gVW51c2VkIGluIHRoaXMgdmVyc2lvbi4KKyNpZiAwCisKKyNpZiBWTUFfVVNFX1NUTF9VTk9SREVSRURfTUFQCisKKyNkZWZpbmUgVm1hUGFpciBzdGQ6OnBhaXIKKworI2RlZmluZSBWTUFfTUFQX1RZUEUoS2V5VCwgVmFsdWVUKSBcCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPCBLZXlULCBWYWx1ZVQsIHN0ZDo6aGFzaDxLZXlUPiwgc3RkOjplcXVhbF90bzxLZXlUPiwgVm1hU3RsQWxsb2NhdG9yPCBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiA+ID4KKworI2Vsc2UgLy8gI2lmIFZNQV9VU0VfU1RMX1VOT1JERVJFRF9NQVAKKwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IFZtYVBhaXIKK3sKKyAgICBUMSBmaXJzdDsKKyAgICBUMiBzZWNvbmQ7CisKKyAgICBWbWFQYWlyKCkgOiBmaXJzdCgpLCBzZWNvbmQoKSB7IH0KKyAgICBWbWFQYWlyKGNvbnN0IFQxJiBmaXJzdFNyYywgY29uc3QgVDImIHNlY29uZFNyYykgOiBmaXJzdChmaXJzdFNyYyksIHNlY29uZChzZWNvbmRTcmMpIHsgfQorfTsKKworLyogQ2xhc3MgY29tcGF0aWJsZSB3aXRoIHN1YnNldCBvZiBpbnRlcmZhY2Ugb2Ygc3RkOjp1bm9yZGVyZWRfbWFwLgorS2V5VCwgVmFsdWVUIG11c3QgYmUgUE9EIGJlY2F1c2UgdGhleSB3aWxsIGJlIHN0b3JlZCBpbiBWbWFWZWN0b3IuCisqLwordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVUPgorY2xhc3MgVm1hTWFwCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWbWFQYWlyPEtleVQsIFZhbHVlVD4gUGFpclR5cGU7CisgICAgdHlwZWRlZiBQYWlyVHlwZSogaXRlcmF0b3I7CisKKyAgICBWbWFNYXAoY29uc3QgVm1hU3RsQWxsb2NhdG9yPFBhaXJUeXBlPiYgYWxsb2NhdG9yKSA6IG1fVmVjdG9yKGFsbG9jYXRvcikgeyB9CisKKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fVmVjdG9yLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBtX1ZlY3Rvci5lbmQoKTsgfQorCisgICAgdm9pZCBpbnNlcnQoY29uc3QgUGFpclR5cGUmIHBhaXIpOworICAgIGl0ZXJhdG9yIGZpbmQoY29uc3QgS2V5VCYga2V5KTsKKyAgICB2b2lkIGVyYXNlKGl0ZXJhdG9yIGl0KTsKKyAgICAKK3ByaXZhdGU6CisgICAgVm1hVmVjdG9yPCBQYWlyVHlwZSwgVm1hU3RsQWxsb2NhdG9yPFBhaXJUeXBlPiA+IG1fVmVjdG9yOworfTsKKworI2RlZmluZSBWTUFfTUFQX1RZUEUoS2V5VCwgVmFsdWVUKSBWbWFNYXA8S2V5VCwgVmFsdWVUPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGaXJzdFQsIHR5cGVuYW1lIFNlY29uZFQ+CitzdHJ1Y3QgVm1hUGFpckZpcnN0TGVzcworeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBWbWFQYWlyPEZpcnN0VCwgU2Vjb25kVD4mIGxocywgY29uc3QgVm1hUGFpcjxGaXJzdFQsIFNlY29uZFQ+JiByaHMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbGhzLmZpcnN0IDwgcmhzLmZpcnN0OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVm1hUGFpcjxGaXJzdFQsIFNlY29uZFQ+JiBsaHMsIGNvbnN0IEZpcnN0VCYgcmhzRmlyc3QpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbGhzLmZpcnN0IDwgcmhzRmlyc3Q7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVUPgordm9pZCBWbWFNYXA8S2V5VCwgVmFsdWVUPjo6aW5zZXJ0KGNvbnN0IFBhaXJUeXBlJiBwYWlyKQoreworICAgIGNvbnN0IHNpemVfdCBpbmRleFRvSW5zZXJ0ID0gVm1hQmluYXJ5RmluZEZpcnN0Tm90TGVzcygKKyAgICAgICAgbV9WZWN0b3IuZGF0YSgpLAorICAgICAgICBtX1ZlY3Rvci5kYXRhKCkgKyBtX1ZlY3Rvci5zaXplKCksCisgICAgICAgIHBhaXIsCisgICAgICAgIFZtYVBhaXJGaXJzdExlc3M8S2V5VCwgVmFsdWVUPigpKSAtIG1fVmVjdG9yLmRhdGEoKTsKKyAgICBWbWFWZWN0b3JJbnNlcnQobV9WZWN0b3IsIGluZGV4VG9JbnNlcnQsIHBhaXIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQ+CitWbWFQYWlyPEtleVQsIFZhbHVlVD4qIFZtYU1hcDxLZXlULCBWYWx1ZVQ+OjpmaW5kKGNvbnN0IEtleVQmIGtleSkKK3sKKyAgICBQYWlyVHlwZSogaXQgPSBWbWFCaW5hcnlGaW5kRmlyc3ROb3RMZXNzKAorICAgICAgICBtX1ZlY3Rvci5kYXRhKCksCisgICAgICAgIG1fVmVjdG9yLmRhdGEoKSArIG1fVmVjdG9yLnNpemUoKSwKKyAgICAgICAga2V5LAorICAgICAgICBWbWFQYWlyRmlyc3RMZXNzPEtleVQsIFZhbHVlVD4oKSk7CisgICAgaWYoKGl0ICE9IG1fVmVjdG9yLmVuZCgpKSAmJiAoaXQtPmZpcnN0ID09IGtleSkpCisgICAgeworICAgICAgICByZXR1cm4gaXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBtX1ZlY3Rvci5lbmQoKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVD4KK3ZvaWQgVm1hTWFwPEtleVQsIFZhbHVlVD46OmVyYXNlKGl0ZXJhdG9yIGl0KQoreworICAgIFZtYVZlY3RvclJlbW92ZShtX1ZlY3RvciwgaXQgLSBtX1ZlY3Rvci5iZWdpbigpKTsKK30KKworI2VuZGlmIC8vICNpZiBWTUFfVVNFX1NUTF9VTk9SREVSRURfTUFQCisKKyNlbmRpZiAvLyAjaWYgMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBWbWFEZXZpY2VNZW1vcnlCbG9jazsKKworZW51bSBWTUFfQ0FDSEVfT1BFUkFUSU9OIHsgVk1BX0NBQ0hFX0ZMVVNILCBWTUFfQ0FDSEVfSU5WQUxJREFURSB9OworCitzdHJ1Y3QgVm1hQWxsb2NhdGlvbl9UCit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hQWxsb2NhdGlvbl9UKQorcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBNQVBfQ09VTlRfRkxBR19QRVJTSVNURU5UX01BUCA9IDB4ODA7CisKKyAgICBlbnVtIEZMQUdTCisgICAgeworICAgICAgICBGTEFHX1VTRVJfREFUQV9TVFJJTkcgPSAweDAxLAorICAgIH07CisKK3B1YmxpYzoKKyAgICBlbnVtIEFMTE9DQVRJT05fVFlQRQorICAgIHsKKyAgICAgICAgQUxMT0NBVElPTl9UWVBFX05PTkUsCisgICAgICAgIEFMTE9DQVRJT05fVFlQRV9CTE9DSywKKyAgICAgICAgQUxMT0NBVElPTl9UWVBFX0RFRElDQVRFRCwKKyAgICB9OworCisgICAgVm1hQWxsb2NhdGlvbl9UKHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LCBib29sIHVzZXJEYXRhU3RyaW5nKSA6CisgICAgICAgIG1fQWxpZ25tZW50KDEpLAorICAgICAgICBtX1NpemUoMCksCisgICAgICAgIG1fcFVzZXJEYXRhKFZNQV9OVUxMKSwKKyAgICAgICAgbV9MYXN0VXNlRnJhbWVJbmRleChjdXJyZW50RnJhbWVJbmRleCksCisgICAgICAgIG1fVHlwZSgodWludDhfdClBTExPQ0FUSU9OX1RZUEVfTk9ORSksCisgICAgICAgIG1fU3ViYWxsb2NhdGlvblR5cGUoKHVpbnQ4X3QpVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9VTktOT1dOKSwKKyAgICAgICAgbV9NYXBDb3VudCgwKSwKKyAgICAgICAgbV9GbGFncyh1c2VyRGF0YVN0cmluZyA/ICh1aW50OF90KUZMQUdfVVNFUl9EQVRBX1NUUklORyA6IDApCisgICAgeworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorICAgICAgICBtX0NyZWF0aW9uRnJhbWVJbmRleCA9IGN1cnJlbnRGcmFtZUluZGV4OworICAgICAgICBtX0J1ZmZlckltYWdlVXNhZ2UgPSAwOworI2VuZGlmCisgICAgfQorCisgICAgflZtYUFsbG9jYXRpb25fVCgpCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKChtX01hcENvdW50ICYgfk1BUF9DT1VOVF9GTEFHX1BFUlNJU1RFTlRfTUFQKSA9PSAwICYmICJBbGxvY2F0aW9uIHdhcyBub3QgdW5tYXBwZWQgYmVmb3JlIGRlc3RydWN0aW9uLiIpOworCisgICAgICAgIC8vIENoZWNrIGlmIG93bmVkIHN0cmluZyB3YXMgZnJlZWQuCisgICAgICAgIFZNQV9BU1NFUlQobV9wVXNlckRhdGEgPT0gVk1BX05VTEwpOworICAgIH0KKworICAgIHZvaWQgSW5pdEJsb2NrQWxsb2NhdGlvbigKKyAgICAgICAgVm1hUG9vbCBoUG9vbCwKKyAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGJsb2NrLAorICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICBWa0RldmljZVNpemUgYWxpZ25tZW50LAorICAgICAgICBWa0RldmljZVNpemUgc2l6ZSwKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgc3ViYWxsb2NhdGlvblR5cGUsCisgICAgICAgIGJvb2wgbWFwcGVkLAorICAgICAgICBib29sIGNhbkJlY29tZUxvc3QpCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKG1fVHlwZSA9PSBBTExPQ0FUSU9OX1RZUEVfTk9ORSk7CisgICAgICAgIFZNQV9BU1NFUlQoYmxvY2sgIT0gVk1BX05VTEwpOworICAgICAgICBtX1R5cGUgPSAodWludDhfdClBTExPQ0FUSU9OX1RZUEVfQkxPQ0s7CisgICAgICAgIG1fQWxpZ25tZW50ID0gYWxpZ25tZW50OworICAgICAgICBtX1NpemUgPSBzaXplOworICAgICAgICBtX01hcENvdW50ID0gbWFwcGVkID8gTUFQX0NPVU5UX0ZMQUdfUEVSU0lTVEVOVF9NQVAgOiAwOworICAgICAgICBtX1N1YmFsbG9jYXRpb25UeXBlID0gKHVpbnQ4X3Qpc3ViYWxsb2NhdGlvblR5cGU7CisgICAgICAgIG1fQmxvY2tBbGxvY2F0aW9uLm1faFBvb2wgPSBoUG9vbDsKKyAgICAgICAgbV9CbG9ja0FsbG9jYXRpb24ubV9CbG9jayA9IGJsb2NrOworICAgICAgICBtX0Jsb2NrQWxsb2NhdGlvbi5tX09mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbV9CbG9ja0FsbG9jYXRpb24ubV9DYW5CZWNvbWVMb3N0ID0gY2FuQmVjb21lTG9zdDsKKyAgICB9CisKKyAgICB2b2lkIEluaXRMb3N0KCkKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQobV9UeXBlID09IEFMTE9DQVRJT05fVFlQRV9OT05FKTsKKyAgICAgICAgVk1BX0FTU0VSVChtX0xhc3RVc2VGcmFtZUluZGV4LmxvYWQoKSA9PSBWTUFfRlJBTUVfSU5ERVhfTE9TVCk7CisgICAgICAgIG1fVHlwZSA9ICh1aW50OF90KUFMTE9DQVRJT05fVFlQRV9CTE9DSzsKKyAgICAgICAgbV9CbG9ja0FsbG9jYXRpb24ubV9oUG9vbCA9IFZLX05VTExfSEFORExFOworICAgICAgICBtX0Jsb2NrQWxsb2NhdGlvbi5tX0Jsb2NrID0gVk1BX05VTEw7CisgICAgICAgIG1fQmxvY2tBbGxvY2F0aW9uLm1fT2Zmc2V0ID0gMDsKKyAgICAgICAgbV9CbG9ja0FsbG9jYXRpb24ubV9DYW5CZWNvbWVMb3N0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIENoYW5nZUJsb2NrQWxsb2NhdGlvbigKKyAgICAgICAgVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsCisgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBibG9jaywKKyAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCk7IAorCisgICAgdm9pZCBDaGFuZ2VTaXplKFZrRGV2aWNlU2l6ZSBuZXdTaXplKTsKKyAgICB2b2lkIENoYW5nZU9mZnNldChWa0RldmljZVNpemUgbmV3T2Zmc2V0KTsKKworICAgIC8vIHBNYXBwZWREYXRhIG5vdCBudWxsIG1lYW5zIGFsbG9jYXRpb24gaXMgY3JlYXRlZCB3aXRoIE1BUFBFRCBmbGFnLgorICAgIHZvaWQgSW5pdERlZGljYXRlZEFsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IG1lbW9yeVR5cGVJbmRleCwKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgaE1lbW9yeSwKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgc3ViYWxsb2NhdGlvblR5cGUsCisgICAgICAgIHZvaWQqIHBNYXBwZWREYXRhLAorICAgICAgICBWa0RldmljZVNpemUgc2l6ZSkKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQobV9UeXBlID09IEFMTE9DQVRJT05fVFlQRV9OT05FKTsKKyAgICAgICAgVk1BX0FTU0VSVChoTWVtb3J5ICE9IFZLX05VTExfSEFORExFKTsKKyAgICAgICAgbV9UeXBlID0gKHVpbnQ4X3QpQUxMT0NBVElPTl9UWVBFX0RFRElDQVRFRDsKKyAgICAgICAgbV9BbGlnbm1lbnQgPSAwOworICAgICAgICBtX1NpemUgPSBzaXplOworICAgICAgICBtX1N1YmFsbG9jYXRpb25UeXBlID0gKHVpbnQ4X3Qpc3ViYWxsb2NhdGlvblR5cGU7CisgICAgICAgIG1fTWFwQ291bnQgPSAocE1hcHBlZERhdGEgIT0gVk1BX05VTEwpID8gTUFQX0NPVU5UX0ZMQUdfUEVSU0lTVEVOVF9NQVAgOiAwOworICAgICAgICBtX0RlZGljYXRlZEFsbG9jYXRpb24ubV9NZW1vcnlUeXBlSW5kZXggPSBtZW1vcnlUeXBlSW5kZXg7CisgICAgICAgIG1fRGVkaWNhdGVkQWxsb2NhdGlvbi5tX2hNZW1vcnkgPSBoTWVtb3J5OworICAgICAgICBtX0RlZGljYXRlZEFsbG9jYXRpb24ubV9wTWFwcGVkRGF0YSA9IHBNYXBwZWREYXRhOworICAgIH0KKworICAgIEFMTE9DQVRJT05fVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gKEFMTE9DQVRJT05fVFlQRSltX1R5cGU7IH0KKyAgICBWa0RldmljZVNpemUgR2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gbV9BbGlnbm1lbnQ7IH0KKyAgICBWa0RldmljZVNpemUgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fU2l6ZTsgfQorICAgIGJvb2wgSXNVc2VyRGF0YVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIChtX0ZsYWdzICYgRkxBR19VU0VSX0RBVEFfU1RSSU5HKSAhPSAwOyB9CisgICAgdm9pZCogR2V0VXNlckRhdGEoKSBjb25zdCB7IHJldHVybiBtX3BVc2VyRGF0YTsgfQorICAgIHZvaWQgU2V0VXNlckRhdGEoVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsIHZvaWQqIHBVc2VyRGF0YSk7CisgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgR2V0U3ViYWxsb2NhdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiAoVm1hU3ViYWxsb2NhdGlvblR5cGUpbV9TdWJhbGxvY2F0aW9uVHlwZTsgfQorCisgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIEdldEJsb2NrKCkgY29uc3QKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQobV9UeXBlID09IEFMTE9DQVRJT05fVFlQRV9CTE9DSyk7CisgICAgICAgIHJldHVybiBtX0Jsb2NrQWxsb2NhdGlvbi5tX0Jsb2NrOworICAgIH0KKyAgICBWa0RldmljZVNpemUgR2V0T2Zmc2V0KCkgY29uc3Q7CisgICAgVmtEZXZpY2VNZW1vcnkgR2V0TWVtb3J5KCkgY29uc3Q7CisgICAgdWludDMyX3QgR2V0TWVtb3J5VHlwZUluZGV4KCkgY29uc3Q7CisgICAgYm9vbCBJc1BlcnNpc3RlbnRNYXAoKSBjb25zdCB7IHJldHVybiAobV9NYXBDb3VudCAmIE1BUF9DT1VOVF9GTEFHX1BFUlNJU1RFTlRfTUFQKSAhPSAwOyB9CisgICAgdm9pZCogR2V0TWFwcGVkRGF0YSgpIGNvbnN0OworICAgIGJvb2wgQ2FuQmVjb21lTG9zdCgpIGNvbnN0OworICAgIFZtYVBvb2wgR2V0UG9vbCgpIGNvbnN0OworICAgIAorICAgIHVpbnQzMl90IEdldExhc3RVc2VGcmFtZUluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX0xhc3RVc2VGcmFtZUluZGV4LmxvYWQoKTsKKyAgICB9CisgICAgYm9vbCBDb21wYXJlRXhjaGFuZ2VMYXN0VXNlRnJhbWVJbmRleCh1aW50MzJfdCYgZXhwZWN0ZWQsIHVpbnQzMl90IGRlc2lyZWQpCisgICAgeworICAgICAgICByZXR1cm4gbV9MYXN0VXNlRnJhbWVJbmRleC5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoZXhwZWN0ZWQsIGRlc2lyZWQpOworICAgIH0KKyAgICAvKgorICAgIC0gSWYgaEFsbG9jYXRpb24uTGFzdFVzZUZyYW1lSW5kZXggKyBmcmFtZUluVXNlQ291bnQgPCBhbGxvY2F0b3IuQ3VycmVudEZyYW1lSW5kZXgsCisgICAgICBtYWtlcyBpdCBsb3N0IGJ5IHNldHRpbmcgTGFzdFVzZUZyYW1lSW5kZXggPSBWTUFfRlJBTUVfSU5ERVhfTE9TVCBhbmQgcmV0dXJucyB0cnVlLgorICAgIC0gRWxzZSwgcmV0dXJucyBmYWxzZS4KKyAgICAKKyAgICBJZiBoQWxsb2NhdGlvbiBpcyBhbHJlYWR5IGxvc3QsIGFzc2VydCAtIHlvdSBzaG91bGQgbm90IGNhbGwgaXQgdGhlbi4KKyAgICBJZiBoQWxsb2NhdGlvbiB3YXMgbm90IGNyZWF0ZWQgd2l0aCBDQU5fQkVDT01FX0xPU1RfQklULCBhc3NlcnQuCisgICAgKi8KKyAgICBib29sIE1ha2VMb3N0KHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LCB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQpOworCisgICAgdm9pZCBEZWRpY2F0ZWRBbGxvY0NhbGNTdGF0c0luZm8oVm1hU3RhdEluZm8mIG91dEluZm8pCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKG1fVHlwZSA9PSBBTExPQ0FUSU9OX1RZUEVfREVESUNBVEVEKTsKKyAgICAgICAgb3V0SW5mby5ibG9ja0NvdW50ID0gMTsKKyAgICAgICAgb3V0SW5mby5hbGxvY2F0aW9uQ291bnQgPSAxOworICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlQ291bnQgPSAwOworICAgICAgICBvdXRJbmZvLnVzZWRCeXRlcyA9IG1fU2l6ZTsKKyAgICAgICAgb3V0SW5mby51bnVzZWRCeXRlcyA9IDA7CisgICAgICAgIG91dEluZm8uYWxsb2NhdGlvblNpemVNaW4gPSBvdXRJbmZvLmFsbG9jYXRpb25TaXplTWF4ID0gbV9TaXplOworICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFVJTlQ2NF9NQVg7CisgICAgICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4ID0gMDsKKyAgICB9CisKKyAgICB2b2lkIEJsb2NrQWxsb2NNYXAoKTsKKyAgICB2b2lkIEJsb2NrQWxsb2NVbm1hcCgpOworICAgIFZrUmVzdWx0IERlZGljYXRlZEFsbG9jTWFwKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLCB2b2lkKiogcHBEYXRhKTsKKyAgICB2b2lkIERlZGljYXRlZEFsbG9jVW5tYXAoVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IpOworCisjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisgICAgdWludDMyX3QgR2V0Q3JlYXRpb25GcmFtZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9DcmVhdGlvbkZyYW1lSW5kZXg7IH0KKyAgICB1aW50MzJfdCBHZXRCdWZmZXJJbWFnZVVzYWdlKCkgY29uc3QgeyByZXR1cm4gbV9CdWZmZXJJbWFnZVVzYWdlOyB9CisKKyAgICB2b2lkIEluaXRCdWZmZXJJbWFnZVVzYWdlKHVpbnQzMl90IGJ1ZmZlckltYWdlVXNhZ2UpCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKG1fQnVmZmVySW1hZ2VVc2FnZSA9PSAwKTsKKyAgICAgICAgbV9CdWZmZXJJbWFnZVVzYWdlID0gYnVmZmVySW1hZ2VVc2FnZTsKKyAgICB9CisKKyAgICB2b2lkIFByaW50UGFyYW1ldGVycyhjbGFzcyBWbWFKc29uV3JpdGVyJiBqc29uKSBjb25zdDsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIFZrRGV2aWNlU2l6ZSBtX0FsaWdubWVudDsKKyAgICBWa0RldmljZVNpemUgbV9TaXplOworICAgIHZvaWQqIG1fcFVzZXJEYXRhOworICAgIFZNQV9BVE9NSUNfVUlOVDMyIG1fTGFzdFVzZUZyYW1lSW5kZXg7CisgICAgdWludDhfdCBtX1R5cGU7IC8vIEFMTE9DQVRJT05fVFlQRQorICAgIHVpbnQ4X3QgbV9TdWJhbGxvY2F0aW9uVHlwZTsgLy8gVm1hU3ViYWxsb2NhdGlvblR5cGUKKyAgICAvLyBCaXQgMHg4MCBpcyBzZXQgd2hlbiBhbGxvY2F0aW9uIHdhcyBjcmVhdGVkIHdpdGggVk1BX0FMTE9DQVRJT05fQ1JFQVRFX01BUFBFRF9CSVQuCisgICAgLy8gQml0cyB3aXRoIG1hc2sgMHg3RiBhcmUgcmVmZXJlbmNlIGNvdW50ZXIgZm9yIHZtYU1hcE1lbW9yeSgpL3ZtYVVubWFwTWVtb3J5KCkuCisgICAgdWludDhfdCBtX01hcENvdW50OworICAgIHVpbnQ4X3QgbV9GbGFnczsgLy8gZW51bSBGTEFHUworCisgICAgLy8gQWxsb2NhdGlvbiBvdXQgb2YgVm1hRGV2aWNlTWVtb3J5QmxvY2suCisgICAgc3RydWN0IEJsb2NrQWxsb2NhdGlvbgorICAgIHsKKyAgICAgICAgVm1hUG9vbCBtX2hQb29sOyAvLyBOdWxsIGlmIGJlbG9uZ3MgdG8gZ2VuZXJhbCBtZW1vcnkuCisgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBtX0Jsb2NrOworICAgICAgICBWa0RldmljZVNpemUgbV9PZmZzZXQ7CisgICAgICAgIGJvb2wgbV9DYW5CZWNvbWVMb3N0OworICAgIH07CisKKyAgICAvLyBBbGxvY2F0aW9uIGZvciBhbiBvYmplY3QgdGhhdCBoYXMgaXRzIG93biBwcml2YXRlIFZrRGV2aWNlTWVtb3J5LgorICAgIHN0cnVjdCBEZWRpY2F0ZWRBbGxvY2F0aW9uCisgICAgeworICAgICAgICB1aW50MzJfdCBtX01lbW9yeVR5cGVJbmRleDsKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgbV9oTWVtb3J5OworICAgICAgICB2b2lkKiBtX3BNYXBwZWREYXRhOyAvLyBOb3QgbnVsbCBtZWFucyBtZW1vcnkgaXMgbWFwcGVkLgorICAgIH07CisKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgLy8gQWxsb2NhdGlvbiBvdXQgb2YgVm1hRGV2aWNlTWVtb3J5QmxvY2suCisgICAgICAgIEJsb2NrQWxsb2NhdGlvbiBtX0Jsb2NrQWxsb2NhdGlvbjsKKyAgICAgICAgLy8gQWxsb2NhdGlvbiBmb3IgYW4gb2JqZWN0IHRoYXQgaGFzIGl0cyBvd24gcHJpdmF0ZSBWa0RldmljZU1lbW9yeS4KKyAgICAgICAgRGVkaWNhdGVkQWxsb2NhdGlvbiBtX0RlZGljYXRlZEFsbG9jYXRpb247CisgICAgfTsKKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorICAgIHVpbnQzMl90IG1fQ3JlYXRpb25GcmFtZUluZGV4OworICAgIHVpbnQzMl90IG1fQnVmZmVySW1hZ2VVc2FnZTsgLy8gMCBpZiB1bmtub3duLgorI2VuZGlmCisKKyAgICB2b2lkIEZyZWVVc2VyRGF0YVN0cmluZyhWbWFBbGxvY2F0b3IgaEFsbG9jYXRvcik7Cit9OworCisvKgorUmVwcmVzZW50cyBhIHJlZ2lvbiBvZiBWbWFEZXZpY2VNZW1vcnlCbG9jayB0aGF0IGlzIGVpdGhlciBhc3NpZ25lZCBhbmQgcmV0dXJuZWQgYXMKK2FsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb3IgZnJlZS4KKyovCitzdHJ1Y3QgVm1hU3ViYWxsb2NhdGlvbgoreworICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQ7CisgICAgVmtEZXZpY2VTaXplIHNpemU7CisgICAgVm1hQWxsb2NhdGlvbiBoQWxsb2NhdGlvbjsKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSB0eXBlOworfTsKKworLy8gQ29tcGFyYXRvciBmb3Igb2Zmc2V0cy4KK3N0cnVjdCBWbWFTdWJhbGxvY2F0aW9uT2Zmc2V0TGVzcworeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBsaHMsIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHJocykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBsaHMub2Zmc2V0IDwgcmhzLm9mZnNldDsKKyAgICB9Cit9Oworc3RydWN0IFZtYVN1YmFsbG9jYXRpb25PZmZzZXRHcmVhdGVyCit7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIGxocywgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgcmhzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxocy5vZmZzZXQgPiByaHMub2Zmc2V0OworICAgIH0KK307CisKK3R5cGVkZWYgVm1hTGlzdDwgVm1hU3ViYWxsb2NhdGlvbiwgVm1hU3RsQWxsb2NhdG9yPFZtYVN1YmFsbG9jYXRpb24+ID4gVm1hU3ViYWxsb2NhdGlvbkxpc3Q7CisKKy8vIENvc3Qgb2Ygb25lIGFkZGl0aW9uYWwgYWxsb2NhdGlvbiBsb3N0LCBhcyBlcXVpdmFsZW50IGluIGJ5dGVzLgorc3RhdGljIGNvbnN0IFZrRGV2aWNlU2l6ZSBWTUFfTE9TVF9BTExPQ0FUSU9OX0NPU1QgPSAxMDQ4NTc2OworCisvKgorUGFyYW1ldGVycyBvZiBwbGFubmVkIGFsbG9jYXRpb24gaW5zaWRlIGEgVm1hRGV2aWNlTWVtb3J5QmxvY2suCisKK0lmIGNhbk1ha2VPdGhlckxvc3Qgd2FzIGZhbHNlOgorLSBpdGVtIHBvaW50cyB0byBhIEZSRUUgc3ViYWxsb2NhdGlvbi4KKy0gaXRlbXNUb01ha2VMb3N0Q291bnQgaXMgMC4KKworSWYgY2FuTWFrZU90aGVyTG9zdCB3YXMgdHJ1ZToKKy0gaXRlbSBwb2ludHMgdG8gZmlyc3Qgb2Ygc2VxdWVuY2Ugb2Ygc3ViYWxsb2NhdGlvbnMsIHdoaWNoIGFyZSBlaXRoZXIgRlJFRSwKKyAgb3IgcG9pbnQgdG8gVm1hQWxsb2NhdGlvbnMgdGhhdCBjYW4gYmVjb21lIGxvc3QuCistIGl0ZW1zVG9NYWtlTG9zdENvdW50IGlzIHRoZSBudW1iZXIgb2YgVm1hQWxsb2NhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIG1hZGUgbG9zdCBmb3IKKyAgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIHRvIHN1Y2NlZWQuCisqLworc3RydWN0IFZtYUFsbG9jYXRpb25SZXF1ZXN0Cit7CisgICAgVmtEZXZpY2VTaXplIG9mZnNldDsKKyAgICBWa0RldmljZVNpemUgc3VtRnJlZVNpemU7IC8vIFN1bSBzaXplIG9mIGZyZWUgaXRlbXMgdGhhdCBvdmVybGFwIHdpdGggcHJvcG9zZWQgYWxsb2NhdGlvbi4KKyAgICBWa0RldmljZVNpemUgc3VtSXRlbVNpemU7IC8vIFN1bSBzaXplIG9mIGl0ZW1zIHRvIG1ha2UgbG9zdCB0aGF0IG92ZXJsYXAgd2l0aCBwcm9wb3NlZCBhbGxvY2F0aW9uLgorICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdGVtOworICAgIHNpemVfdCBpdGVtc1RvTWFrZUxvc3RDb3VudDsKKyAgICB2b2lkKiBjdXN0b21EYXRhOworCisgICAgVmtEZXZpY2VTaXplIENhbGNDb3N0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzdW1JdGVtU2l6ZSArIGl0ZW1zVG9NYWtlTG9zdENvdW50ICogVk1BX0xPU1RfQUxMT0NBVElPTl9DT1NUOworICAgIH0KK307CisKKy8qCitEYXRhIHN0cnVjdHVyZSB1c2VkIGZvciBib29ra2VlcGluZyBvZiBhbGxvY2F0aW9ucyBhbmQgdW51c2VkIHJhbmdlcyBvZiBtZW1vcnkKK2luIGEgc2luZ2xlIFZrRGV2aWNlTWVtb3J5IGJsb2NrLgorKi8KK2NsYXNzIFZtYUJsb2NrTWV0YWRhdGEKK3sKK3B1YmxpYzoKKyAgICBWbWFCbG9ja01ldGFkYXRhKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yKTsKKyAgICB2aXJ0dWFsIH5WbWFCbG9ja01ldGFkYXRhKCkgeyB9CisgICAgdmlydHVhbCB2b2lkIEluaXQoVmtEZXZpY2VTaXplIHNpemUpIHsgbV9TaXplID0gc2l6ZTsgfQorCisgICAgLy8gVmFsaWRhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMgaW5zaWRlIHRoaXMgb2JqZWN0LiBJZiBub3QgdmFsaWQsIHJldHVybnMgZmFsc2UuCisgICAgdmlydHVhbCBib29sIFZhbGlkYXRlKCkgY29uc3QgPSAwOworICAgIFZrRGV2aWNlU2l6ZSBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9TaXplOyB9CisgICAgdmlydHVhbCBzaXplX3QgR2V0QWxsb2NhdGlvbkNvdW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgVmtEZXZpY2VTaXplIEdldFN1bUZyZWVTaXplKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgVmtEZXZpY2VTaXplIEdldFVudXNlZFJhbmdlU2l6ZU1heCgpIGNvbnN0ID0gMDsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBibG9jayBpcyBlbXB0eSAtIGNvbnRhaW5zIG9ubHkgc2luZ2xlIGZyZWUgc3ViYWxsb2NhdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgSXNFbXB0eSgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBDYWxjQWxsb2NhdGlvblN0YXRJbmZvKFZtYVN0YXRJbmZvJiBvdXRJbmZvKSBjb25zdCA9IDA7CisgICAgLy8gU2hvdWxkbid0IG1vZGlmeSBibG9ja0NvdW50LgorICAgIHZpcnR1YWwgdm9pZCBBZGRQb29sU3RhdHMoVm1hUG9vbFN0YXRzJiBpbm91dFN0YXRzKSBjb25zdCA9IDA7CisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnREZXRhaWxlZE1hcChjbGFzcyBWbWFKc29uV3JpdGVyJiBqc29uKSBjb25zdCA9IDA7CisjZW5kaWYKKworICAgIC8vIFRyaWVzIHRvIGZpbmQgYSBwbGFjZSBmb3Igc3ViYWxsb2NhdGlvbiB3aXRoIGdpdmVuIHBhcmFtZXRlcnMgaW5zaWRlIHRoaXMgYmxvY2suCisgICAgLy8gSWYgc3VjY2VlZGVkLCBmaWxscyBwQWxsb2NhdGlvblJlcXVlc3QgYW5kIHJldHVybnMgdHJ1ZS4KKyAgICAvLyBJZiBmYWlsZWQsIHJldHVybnMgZmFsc2UuCisgICAgdmlydHVhbCBib29sIENyZWF0ZUFsbG9jYXRpb25SZXF1ZXN0KAorICAgICAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVJblVzZUNvdW50LAorICAgICAgICBWa0RldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsbG9jQWxpZ25tZW50LAorICAgICAgICBib29sIHVwcGVyQWRkcmVzcywKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgYWxsb2NUeXBlLAorICAgICAgICBib29sIGNhbk1ha2VPdGhlckxvc3QsCisgICAgICAgIC8vIEFsd2F5cyBvbmUgb2YgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZXyogb3IgVk1BX0FMTE9DQVRJT05fSU5URVJOQUxfU1RSQVRFR1lfKiBmbGFncy4KKyAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgIFZtYUFsbG9jYXRpb25SZXF1ZXN0KiBwQWxsb2NhdGlvblJlcXVlc3QpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBNYWtlUmVxdWVzdGVkQWxsb2NhdGlvbnNMb3N0KAorICAgICAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVJblVzZUNvdW50LAorICAgICAgICBWbWFBbGxvY2F0aW9uUmVxdWVzdCogcEFsbG9jYXRpb25SZXF1ZXN0KSA9IDA7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IE1ha2VBbGxvY2F0aW9uc0xvc3QodWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCkgPSAwOworCisgICAgdmlydHVhbCBWa1Jlc3VsdCBDaGVja0NvcnJ1cHRpb24oY29uc3Qgdm9pZCogcEJsb2NrRGF0YSkgPSAwOworCisgICAgLy8gTWFrZXMgYWN0dWFsIGFsbG9jYXRpb24gYmFzZWQgb24gcmVxdWVzdC4gUmVxdWVzdCBtdXN0IGFscmVhZHkgYmUgY2hlY2tlZCBhbmQgdmFsaWQuCisgICAgdmlydHVhbCB2b2lkIEFsbG9jKAorICAgICAgICBjb25zdCBWbWFBbGxvY2F0aW9uUmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgdHlwZSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSwKKyAgICAgICAgYm9vbCB1cHBlckFkZHJlc3MsCisgICAgICAgIFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24pID0gMDsKKworICAgIC8vIEZyZWVzIHN1YmFsbG9jYXRpb24gYXNzaWduZWQgdG8gZ2l2ZW4gbWVtb3J5IHJlZ2lvbi4KKyAgICB2aXJ0dWFsIHZvaWQgRnJlZShjb25zdCBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgRnJlZUF0T2Zmc2V0KFZrRGV2aWNlU2l6ZSBvZmZzZXQpID0gMDsKKworICAgIC8vIFRyaWVzIHRvIHJlc2l6ZSAoZ3JvdyBvciBzaHJpbmspIHNwYWNlIGZvciBnaXZlbiBhbGxvY2F0aW9uLCBpbiBwbGFjZS4KKyAgICB2aXJ0dWFsIGJvb2wgUmVzaXplQWxsb2NhdGlvbihjb25zdCBWbWFBbGxvY2F0aW9uIGFsbG9jLCBWa0RldmljZVNpemUgbmV3U2l6ZSkgeyByZXR1cm4gZmFsc2U7IH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogR2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpIGNvbnN0IHsgcmV0dXJuIG1fcEFsbG9jYXRpb25DYWxsYmFja3M7IH0KKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorICAgIHZvaWQgUHJpbnREZXRhaWxlZE1hcF9CZWdpbihjbGFzcyBWbWFKc29uV3JpdGVyJiBqc29uLAorICAgICAgICBWa0RldmljZVNpemUgdW51c2VkQnl0ZXMsCisgICAgICAgIHNpemVfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgICAgIHNpemVfdCB1bnVzZWRSYW5nZUNvdW50KSBjb25zdDsKKyAgICB2b2lkIFByaW50RGV0YWlsZWRNYXBfQWxsb2NhdGlvbihjbGFzcyBWbWFKc29uV3JpdGVyJiBqc29uLAorICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICBWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uKSBjb25zdDsKKyAgICB2b2lkIFByaW50RGV0YWlsZWRNYXBfVW51c2VkUmFuZ2UoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbiwKKyAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgVmtEZXZpY2VTaXplIHNpemUpIGNvbnN0OworICAgIHZvaWQgUHJpbnREZXRhaWxlZE1hcF9FbmQoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbikgY29uc3Q7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBWa0RldmljZVNpemUgbV9TaXplOworICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogbV9wQWxsb2NhdGlvbkNhbGxiYWNrczsKK307CisKKyNkZWZpbmUgVk1BX1ZBTElEQVRFKGNvbmQpIGRvIHsgaWYoIShjb25kKSkgeyBcCisgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiVmFsaWRhdGlvbiBmYWlsZWQ6ICIgI2NvbmQpOyBcCisgICAgICAgIHJldHVybiBmYWxzZTsgXAorICAgIH0gfSB3aGlsZShmYWxzZSkKKworY2xhc3MgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljIDogcHVibGljIFZtYUJsb2NrTWV0YWRhdGEKK3sKKyAgICBWTUFfQ0xBU1NfTk9fQ09QWShWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMpCitwdWJsaWM6CisgICAgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yKTsKKyAgICB2aXJ0dWFsIH5WbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgSW5pdChWa0RldmljZVNpemUgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgVmFsaWRhdGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNpemVfdCBHZXRBbGxvY2F0aW9uQ291bnQoKSBjb25zdCB7IHJldHVybiBtX1N1YmFsbG9jYXRpb25zLnNpemUoKSAtIG1fRnJlZUNvdW50OyB9CisgICAgdmlydHVhbCBWa0RldmljZVNpemUgR2V0U3VtRnJlZVNpemUoKSBjb25zdCB7IHJldHVybiBtX1N1bUZyZWVTaXplOyB9CisgICAgdmlydHVhbCBWa0RldmljZVNpemUgR2V0VW51c2VkUmFuZ2VTaXplTWF4KCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIElzRW1wdHkoKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBDYWxjQWxsb2NhdGlvblN0YXRJbmZvKFZtYVN0YXRJbmZvJiBvdXRJbmZvKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgQWRkUG9vbFN0YXRzKFZtYVBvb2xTdGF0cyYgaW5vdXRTdGF0cykgY29uc3Q7CisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnREZXRhaWxlZE1hcChjbGFzcyBWbWFKc29uV3JpdGVyJiBqc29uKSBjb25zdDsKKyNlbmRpZgorCisgICAgdmlydHVhbCBib29sIENyZWF0ZUFsbG9jYXRpb25SZXF1ZXN0KAorICAgICAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVJblVzZUNvdW50LAorICAgICAgICBWa0RldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsbG9jQWxpZ25tZW50LAorICAgICAgICBib29sIHVwcGVyQWRkcmVzcywKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgYWxsb2NUeXBlLAorICAgICAgICBib29sIGNhbk1ha2VPdGhlckxvc3QsCisgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICBWbWFBbGxvY2F0aW9uUmVxdWVzdCogcEFsbG9jYXRpb25SZXF1ZXN0KTsKKworICAgIHZpcnR1YWwgYm9vbCBNYWtlUmVxdWVzdGVkQWxsb2NhdGlvbnNMb3N0KAorICAgICAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVJblVzZUNvdW50LAorICAgICAgICBWbWFBbGxvY2F0aW9uUmVxdWVzdCogcEFsbG9jYXRpb25SZXF1ZXN0KTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgTWFrZUFsbG9jYXRpb25zTG9zdCh1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwgdWludDMyX3QgZnJhbWVJblVzZUNvdW50KTsKKworICAgIHZpcnR1YWwgVmtSZXN1bHQgQ2hlY2tDb3JydXB0aW9uKGNvbnN0IHZvaWQqIHBCbG9ja0RhdGEpOworCisgICAgdmlydHVhbCB2b2lkIEFsbG9jKAorICAgICAgICBjb25zdCBWbWFBbGxvY2F0aW9uUmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgdHlwZSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSwKKyAgICAgICAgYm9vbCB1cHBlckFkZHJlc3MsCisgICAgICAgIFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24pOworCisgICAgdmlydHVhbCB2b2lkIEZyZWUoY29uc3QgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgRnJlZUF0T2Zmc2V0KFZrRGV2aWNlU2l6ZSBvZmZzZXQpOworCisgICAgdmlydHVhbCBib29sIFJlc2l6ZUFsbG9jYXRpb24oY29uc3QgVm1hQWxsb2NhdGlvbiBhbGxvYywgVmtEZXZpY2VTaXplIG5ld1NpemUpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBGb3IgZGVmcmFnbWVudGF0aW9uCisgICAgCisgICAgYm9vbCBJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdFBvc3NpYmxlKAorICAgICAgICBWa0RldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUmIGluT3V0UHJldlN1YmFsbG9jVHlwZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9HZW5lcmljOworICAgIGZyaWVuZCBjbGFzcyBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fRmFzdDsKKworICAgIHVpbnQzMl90IG1fRnJlZUNvdW50OworICAgIFZrRGV2aWNlU2l6ZSBtX1N1bUZyZWVTaXplOworICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0IG1fU3ViYWxsb2NhdGlvbnM7CisgICAgLy8gU3ViYWxsb2NhdGlvbnMgdGhhdCBhcmUgZnJlZSBhbmQgaGF2ZSBzaXplIGdyZWF0ZXIgdGhhbiBjZXJ0YWluIHRocmVzaG9sZC4KKyAgICAvLyBTb3J0ZWQgYnkgc2l6ZSwgYXNjZW5kaW5nLgorICAgIFZtYVZlY3RvcjwgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yLCBWbWFTdGxBbGxvY2F0b3I8IFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciA+ID4gbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemU7CisKKyAgICBib29sIFZhbGlkYXRlRnJlZVN1YmFsbG9jYXRpb25MaXN0KCkgY29uc3Q7CisKKyAgICAvLyBDaGVja3MgaWYgcmVxdWVzdGVkIHN1YmFsbG9jYXRpb24gd2l0aCBnaXZlbiBwYXJhbWV0ZXJzIGNhbiBiZSBwbGFjZWQgaW4gZ2l2ZW4gcEZyZWVTdWJhbGxvY0l0ZW0uCisgICAgLy8gSWYgeWVzLCBmaWxscyBwT2Zmc2V0IGFuZCByZXR1cm5zIHRydWUuIElmIG5vLCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgQ2hlY2tBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVJblVzZUNvdW50LAorICAgICAgICBWa0RldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsbG9jQWxpZ25tZW50LAorICAgICAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBhbGxvY1R5cGUsCisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0Ojpjb25zdF9pdGVyYXRvciBzdWJhbGxvY0l0ZW0sCisgICAgICAgIGJvb2wgY2FuTWFrZU90aGVyTG9zdCwKKyAgICAgICAgVmtEZXZpY2VTaXplKiBwT2Zmc2V0LAorICAgICAgICBzaXplX3QqIGl0ZW1zVG9NYWtlTG9zdENvdW50LAorICAgICAgICBWa0RldmljZVNpemUqIHBTdW1GcmVlU2l6ZSwKKyAgICAgICAgVmtEZXZpY2VTaXplKiBwU3VtSXRlbVNpemUpIGNvbnN0OworICAgIC8vIEdpdmVuIGZyZWUgc3ViYWxsb2NhdGlvbiwgaXQgbWVyZ2VzIGl0IHdpdGggZm9sbG93aW5nIG9uZSwgd2hpY2ggbXVzdCBhbHNvIGJlIGZyZWUuCisgICAgdm9pZCBNZXJnZUZyZWVXaXRoTmV4dChWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3IgaXRlbSk7CisgICAgLy8gUmVsZWFzZXMgZ2l2ZW4gc3ViYWxsb2NhdGlvbiwgbWFraW5nIGl0IGZyZWUuCisgICAgLy8gTWVyZ2VzIGl0IHdpdGggYWRqYWNlbnQgZnJlZSBzdWJhbGxvY2F0aW9ucyBpZiBhcHBsaWNhYmxlLgorICAgIC8vIFJldHVybnMgaXRlcmF0b3IgdG8gbmV3IGZyZWUgc3ViYWxsb2NhdGlvbiBhdCB0aGlzIHBsYWNlLgorICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBGcmVlU3ViYWxsb2NhdGlvbihWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3Igc3ViYWxsb2NJdGVtKTsKKyAgICAvLyBHaXZlbiBmcmVlIHN1YmFsbG9jYXRpb24sIGl0IGluc2VydHMgaXQgaW50byBzb3J0ZWQgbGlzdCBvZgorICAgIC8vIG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplIGlmIGl0J3Mgc3VpdGFibGUuCisgICAgdm9pZCBSZWdpc3RlckZyZWVTdWJhbGxvY2F0aW9uKFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdGVtKTsKKyAgICAvLyBHaXZlbiBmcmVlIHN1YmFsbG9jYXRpb24sIGl0IHJlbW92ZXMgaXQgZnJvbSBzb3J0ZWQgbGlzdCBvZgorICAgIC8vIG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplIGlmIGl0J3Mgc3VpdGFibGUuCisgICAgdm9pZCBVbnJlZ2lzdGVyRnJlZVN1YmFsbG9jYXRpb24oVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIGl0ZW0pOworfTsKKworLyoKK0FsbG9jYXRpb25zIGFuZCB0aGVpciByZWZlcmVuY2VzIGluIGludGVybmFsIGRhdGEgc3RydWN0dXJlIGxvb2sgbGlrZSB0aGlzOgorCitpZihtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9FTVBUWSk6CisKKyAgICAgICAgMCArLS0tLS0tLSsKKyAgICAgICAgICB8ICAgICAgIHwKKyAgICAgICAgICB8ICAgICAgIHwKKyAgICAgICAgICB8ICAgICAgIHwKKyAgICAgICAgICArLS0tLS0tLSsKKyAgICAgICAgICB8IEFsbG9jIHwgIDFzdFttXzFzdE51bGxJdGVtc0JlZ2luQ291bnRdCisgICAgICAgICAgKy0tLS0tLS0rCisgICAgICAgICAgfCBBbGxvYyB8ICAxc3RbbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50ICsgMV0KKyAgICAgICAgICArLS0tLS0tLSsKKyAgICAgICAgICB8ICAuLi4gIHwKKyAgICAgICAgICArLS0tLS0tLSsKKyAgICAgICAgICB8IEFsbG9jIHwgIDFzdFsxc3Quc2l6ZSgpIC0gMV0KKyAgICAgICAgICArLS0tLS0tLSsKKyAgICAgICAgICB8ICAgICAgIHwKKyAgICAgICAgICB8ICAgICAgIHwKKyAgICAgICAgICB8ICAgICAgIHwKK0dldFNpemUoKSArLS0tLS0tLSsKKworaWYobV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfUklOR19CVUZGRVIpOgorCisgICAgICAgIDAgKy0tLS0tLS0rCisgICAgICAgICAgfCBBbGxvYyB8ICAybmRbMF0KKyAgICAgICAgICArLS0tLS0tLSsKKyAgICAgICAgICB8IEFsbG9jIHwgIDJuZFsxXQorICAgICAgICAgICstLS0tLS0tKworICAgICAgICAgIHwgIC4uLiAgfAorICAgICAgICAgICstLS0tLS0tKworICAgICAgICAgIHwgQWxsb2MgfCAgMm5kWzJuZC5zaXplKCkgLSAxXQorICAgICAgICAgICstLS0tLS0tKworICAgICAgICAgIHwgICAgICAgfAorICAgICAgICAgIHwgICAgICAgfAorICAgICAgICAgIHwgICAgICAgfAorICAgICAgICAgICstLS0tLS0tKworICAgICAgICAgIHwgQWxsb2MgfCAgMXN0W21fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudF0KKyAgICAgICAgICArLS0tLS0tLSsKKyAgICAgICAgICB8IEFsbG9jIHwgIDFzdFttXzFzdE51bGxJdGVtc0JlZ2luQ291bnQgKyAxXQorICAgICAgICAgICstLS0tLS0tKworICAgICAgICAgIHwgIC4uLiAgfAorICAgICAgICAgICstLS0tLS0tKworICAgICAgICAgIHwgQWxsb2MgfCAgMXN0WzFzdC5zaXplKCkgLSAxXQorICAgICAgICAgICstLS0tLS0tKworICAgICAgICAgIHwgICAgICAgfAorR2V0U2l6ZSgpICstLS0tLS0tKworCitpZihtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9ET1VCTEVfU1RBQ0spOgorCisgICAgICAgIDAgKy0tLS0tLS0rCisgICAgICAgICAgfCAgICAgICB8CisgICAgICAgICAgfCAgICAgICB8CisgICAgICAgICAgfCAgICAgICB8CisgICAgICAgICAgKy0tLS0tLS0rCisgICAgICAgICAgfCBBbGxvYyB8ICAxc3RbbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50XQorICAgICAgICAgICstLS0tLS0tKworICAgICAgICAgIHwgQWxsb2MgfCAgMXN0W21fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudCArIDFdCisgICAgICAgICAgKy0tLS0tLS0rCisgICAgICAgICAgfCAgLi4uICB8CisgICAgICAgICAgKy0tLS0tLS0rCisgICAgICAgICAgfCBBbGxvYyB8ICAxc3RbMXN0LnNpemUoKSAtIDFdCisgICAgICAgICAgKy0tLS0tLS0rCisgICAgICAgICAgfCAgICAgICB8CisgICAgICAgICAgfCAgICAgICB8CisgICAgICAgICAgfCAgICAgICB8CisgICAgICAgICAgKy0tLS0tLS0rCisgICAgICAgICAgfCBBbGxvYyB8ICAybmRbMm5kLnNpemUoKSAtIDFdCisgICAgICAgICAgKy0tLS0tLS0rCisgICAgICAgICAgfCAgLi4uICB8CisgICAgICAgICAgKy0tLS0tLS0rCisgICAgICAgICAgfCBBbGxvYyB8ICAybmRbMV0KKyAgICAgICAgICArLS0tLS0tLSsKKyAgICAgICAgICB8IEFsbG9jIHwgIDJuZFswXQorR2V0U2l6ZSgpICstLS0tLS0tKworCisqLworY2xhc3MgVm1hQmxvY2tNZXRhZGF0YV9MaW5lYXIgOiBwdWJsaWMgVm1hQmxvY2tNZXRhZGF0YQoreworICAgIFZNQV9DTEFTU19OT19DT1BZKFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyKQorcHVibGljOgorICAgIFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yKTsKKyAgICB2aXJ0dWFsIH5WbWFCbG9ja01ldGFkYXRhX0xpbmVhcigpOworICAgIHZpcnR1YWwgdm9pZCBJbml0KFZrRGV2aWNlU2l6ZSBzaXplKTsKKworICAgIHZpcnR1YWwgYm9vbCBWYWxpZGF0ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IEdldEFsbG9jYXRpb25Db3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgVmtEZXZpY2VTaXplIEdldFN1bUZyZWVTaXplKCkgY29uc3QgeyByZXR1cm4gbV9TdW1GcmVlU2l6ZTsgfQorICAgIHZpcnR1YWwgVmtEZXZpY2VTaXplIEdldFVudXNlZFJhbmdlU2l6ZU1heCgpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gR2V0QWxsb2NhdGlvbkNvdW50KCkgPT0gMDsgfQorCisgICAgdmlydHVhbCB2b2lkIENhbGNBbGxvY2F0aW9uU3RhdEluZm8oVm1hU3RhdEluZm8mIG91dEluZm8pIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBBZGRQb29sU3RhdHMoVm1hUG9vbFN0YXRzJiBpbm91dFN0YXRzKSBjb25zdDsKKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorICAgIHZpcnR1YWwgdm9pZCBQcmludERldGFpbGVkTWFwKGNsYXNzIFZtYUpzb25Xcml0ZXImIGpzb24pIGNvbnN0OworI2VuZGlmCisKKyAgICB2aXJ0dWFsIGJvb2wgQ3JlYXRlQWxsb2NhdGlvblJlcXVlc3QoCisgICAgICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgICAgICB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQsCisgICAgICAgIFZrRGV2aWNlU2l6ZSBidWZmZXJJbWFnZUdyYW51bGFyaXR5LAorICAgICAgICBWa0RldmljZVNpemUgYWxsb2NTaXplLAorICAgICAgICBWa0RldmljZVNpemUgYWxsb2NBbGlnbm1lbnQsCisgICAgICAgIGJvb2wgdXBwZXJBZGRyZXNzLAorICAgICAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBhbGxvY1R5cGUsCisgICAgICAgIGJvb2wgY2FuTWFrZU90aGVyTG9zdCwKKyAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgIFZtYUFsbG9jYXRpb25SZXF1ZXN0KiBwQWxsb2NhdGlvblJlcXVlc3QpOworCisgICAgdmlydHVhbCBib29sIE1ha2VSZXF1ZXN0ZWRBbGxvY2F0aW9uc0xvc3QoCisgICAgICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgICAgICB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQsCisgICAgICAgIFZtYUFsbG9jYXRpb25SZXF1ZXN0KiBwQWxsb2NhdGlvblJlcXVlc3QpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBNYWtlQWxsb2NhdGlvbnNMb3N0KHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LCB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQpOworCisgICAgdmlydHVhbCBWa1Jlc3VsdCBDaGVja0NvcnJ1cHRpb24oY29uc3Qgdm9pZCogcEJsb2NrRGF0YSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgQWxsb2MoCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb25SZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSB0eXBlLAorICAgICAgICBWa0RldmljZVNpemUgYWxsb2NTaXplLAorICAgICAgICBib29sIHVwcGVyQWRkcmVzcywKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBoQWxsb2NhdGlvbik7CisKKyAgICB2aXJ0dWFsIHZvaWQgRnJlZShjb25zdCBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pOworICAgIHZpcnR1YWwgdm9pZCBGcmVlQXRPZmZzZXQoVmtEZXZpY2VTaXplIG9mZnNldCk7CisKK3ByaXZhdGU6CisgICAgLyoKKyAgICBUaGVyZSBhcmUgdHdvIHN1YmFsbG9jYXRpb24gdmVjdG9ycywgdXNlZCBpbiBwaW5nLXBvbmcgd2F5LgorICAgIFRoZSBvbmUgd2l0aCBpbmRleCBtXzFzdFZlY3RvckluZGV4IGlzIGNhbGxlZCAxc3QuCisgICAgVGhlIG9uZSB3aXRoIGluZGV4IChtXzFzdFZlY3RvckluZGV4IF4gMSkgaXMgY2FsbGVkIDJuZC4KKyAgICAybmQgY2FuIGJlIG5vbi1lbXB0eSBvbmx5IHdoZW4gMXN0IGlzIG5vdCBlbXB0eS4KKyAgICBXaGVuIDJuZCBpcyBub3QgZW1wdHksIG1fMm5kVmVjdG9yTW9kZSBpbmRpY2F0ZXMgaXRzIG1vZGUgb2Ygb3BlcmF0aW9uLgorICAgICovCisgICAgdHlwZWRlZiBWbWFWZWN0b3I8IFZtYVN1YmFsbG9jYXRpb24sIFZtYVN0bEFsbG9jYXRvcjxWbWFTdWJhbGxvY2F0aW9uPiA+IFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlOworCisgICAgZW51bSBTRUNPTkRfVkVDVE9SX01PREUKKyAgICB7CisgICAgICAgIFNFQ09ORF9WRUNUT1JfRU1QVFksCisgICAgICAgIC8qCisgICAgICAgIFN1YmFsbG9jYXRpb25zIGluIDJuZCB2ZWN0b3IgYXJlIGNyZWF0ZWQgbGF0ZXIgdGhhbiB0aGUgb25lcyBpbiAxc3QsIGJ1dCB0aGV5CisgICAgICAgIGFsbCBoYXZlIHNtYWxsZXIgb2Zmc2V0LgorICAgICAgICAqLworICAgICAgICBTRUNPTkRfVkVDVE9SX1JJTkdfQlVGRkVSLAorICAgICAgICAvKgorICAgICAgICBTdWJhbGxvY2F0aW9ucyBpbiAybmQgdmVjdG9yIGFyZSB1cHBlciBzaWRlIG9mIGRvdWJsZSBzdGFjay4KKyAgICAgICAgVGhleSBhbGwgaGF2ZSBvZmZzZXRzIGhpZ2hlciB0aGFuIHRob3NlIGluIDFzdCB2ZWN0b3IuCisgICAgICAgIFRvcCBvZiB0aGlzIHN0YWNrIG1lYW5zIHNtYWxsZXIgb2Zmc2V0cywgYnV0IGhpZ2hlciBpbmRpY2VzIGluIHRoaXMgdmVjdG9yLgorICAgICAgICAqLworICAgICAgICBTRUNPTkRfVkVDVE9SX0RPVUJMRV9TVEFDSywKKyAgICB9OworCisgICAgVmtEZXZpY2VTaXplIG1fU3VtRnJlZVNpemU7CisgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUgbV9TdWJhbGxvY2F0aW9uczAsIG1fU3ViYWxsb2NhdGlvbnMxOworICAgIHVpbnQzMl90IG1fMXN0VmVjdG9ySW5kZXg7CisgICAgU0VDT05EX1ZFQ1RPUl9NT0RFIG1fMm5kVmVjdG9yTW9kZTsKKworICAgIFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBBY2Nlc3NTdWJhbGxvY2F0aW9uczFzdCgpIHsgcmV0dXJuIG1fMXN0VmVjdG9ySW5kZXggPyBtX1N1YmFsbG9jYXRpb25zMSA6IG1fU3ViYWxsb2NhdGlvbnMwOyB9CisgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIEFjY2Vzc1N1YmFsbG9jYXRpb25zMm5kKCkgeyByZXR1cm4gbV8xc3RWZWN0b3JJbmRleCA/IG1fU3ViYWxsb2NhdGlvbnMwIDogbV9TdWJhbGxvY2F0aW9uczE7IH0KKyAgICBjb25zdCBTdWJhbGxvY2F0aW9uVmVjdG9yVHlwZSYgQWNjZXNzU3ViYWxsb2NhdGlvbnMxc3QoKSBjb25zdCB7IHJldHVybiBtXzFzdFZlY3RvckluZGV4ID8gbV9TdWJhbGxvY2F0aW9uczEgOiBtX1N1YmFsbG9jYXRpb25zMDsgfQorICAgIGNvbnN0IFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBBY2Nlc3NTdWJhbGxvY2F0aW9uczJuZCgpIGNvbnN0IHsgcmV0dXJuIG1fMXN0VmVjdG9ySW5kZXggPyBtX1N1YmFsbG9jYXRpb25zMCA6IG1fU3ViYWxsb2NhdGlvbnMxOyB9CisgICAgCisgICAgLy8gTnVtYmVyIG9mIGl0ZW1zIGluIDFzdCB2ZWN0b3Igd2l0aCBoQWxsb2NhdGlvbiA9IG51bGwgYXQgdGhlIGJlZ2lubmluZy4KKyAgICBzaXplX3QgbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50OworICAgIC8vIE51bWJlciBvZiBvdGhlciBpdGVtcyBpbiAxc3QgdmVjdG9yIHdpdGggaEFsbG9jYXRpb24gPSBudWxsIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlLgorICAgIHNpemVfdCBtXzFzdE51bGxJdGVtc01pZGRsZUNvdW50OworICAgIC8vIE51bWJlciBvZiBpdGVtcyBpbiAybmQgdmVjdG9yIHdpdGggaEFsbG9jYXRpb24gPSBudWxsLgorICAgIHNpemVfdCBtXzJuZE51bGxJdGVtc0NvdW50OworCisgICAgYm9vbCBTaG91bGRDb21wYWN0MXN0KCkgY29uc3Q7CisgICAgdm9pZCBDbGVhbnVwQWZ0ZXJGcmVlKCk7Cit9OworCisvKgorLSBHZXRTaXplKCkgaXMgdGhlIG9yaWdpbmFsIHNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9jay4KKy0gbV9Vc2FibGVTaXplIGlzIHRoaXMgc2l6ZSBhbGlnbmVkIGRvd24gdG8gYSBwb3dlciBvZiB0d28uCisgIEFsbCBhbGxvY2F0aW9ucyBhbmQgY2FsY3VsYXRpb25zIGhhcHBlbiByZWxhdGl2ZSB0byBtX1VzYWJsZVNpemUuCistIEdldFVudXNhYmxlU2l6ZSgpIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbS4KKyAgSXQgaXMgcmVwb3RlZCBhcyBzZXBhcmF0ZSwgdW51c2VkIHJhbmdlLCBub3QgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9ucy4KKworTm9kZSBhdCBsZXZlbCAwIGhhcyBzaXplID0gbV9Vc2FibGVTaXplLgorRWFjaCBuZXh0IGxldmVsIGNvbnRhaW5zIG5vZGVzIHdpdGggc2l6ZSAyIHRpbWVzIHNtYWxsZXIgdGhhbiBjdXJyZW50IGxldmVsLgorbV9MZXZlbENvdW50IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsZXZlbHMgdG8gdXNlIGluIHRoZSBjdXJyZW50IG9iamVjdC4KKyovCitjbGFzcyBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5IDogcHVibGljIFZtYUJsb2NrTWV0YWRhdGEKK3sKKyAgICBWTUFfQ0xBU1NfTk9fQ09QWShWbWFCbG9ja01ldGFkYXRhX0J1ZGR5KQorcHVibGljOgorICAgIFZtYUJsb2NrTWV0YWRhdGFfQnVkZHkoVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IpOworICAgIHZpcnR1YWwgflZtYUJsb2NrTWV0YWRhdGFfQnVkZHkoKTsKKyAgICB2aXJ0dWFsIHZvaWQgSW5pdChWa0RldmljZVNpemUgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgVmFsaWRhdGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNpemVfdCBHZXRBbGxvY2F0aW9uQ291bnQoKSBjb25zdCB7IHJldHVybiBtX0FsbG9jYXRpb25Db3VudDsgfQorICAgIHZpcnR1YWwgVmtEZXZpY2VTaXplIEdldFN1bUZyZWVTaXplKCkgY29uc3QgeyByZXR1cm4gbV9TdW1GcmVlU2l6ZSArIEdldFVudXNhYmxlU2l6ZSgpOyB9CisgICAgdmlydHVhbCBWa0RldmljZVNpemUgR2V0VW51c2VkUmFuZ2VTaXplTWF4KCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX1Jvb3QtPnR5cGUgPT0gTm9kZTo6VFlQRV9GUkVFOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgQ2FsY0FsbG9jYXRpb25TdGF0SW5mbyhWbWFTdGF0SW5mbyYgb3V0SW5mbykgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIEFkZFBvb2xTdGF0cyhWbWFQb29sU3RhdHMmIGlub3V0U3RhdHMpIGNvbnN0OworCisjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisgICAgdmlydHVhbCB2b2lkIFByaW50RGV0YWlsZWRNYXAoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbikgY29uc3Q7CisjZW5kaWYKKworICAgIHZpcnR1YWwgYm9vbCBDcmVhdGVBbGxvY2F0aW9uUmVxdWVzdCgKKyAgICAgICAgdWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCwKKyAgICAgICAgVmtEZXZpY2VTaXplIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHksCisgICAgICAgIFZrRGV2aWNlU2l6ZSBhbGxvY1NpemUsCisgICAgICAgIFZrRGV2aWNlU2l6ZSBhbGxvY0FsaWdubWVudCwKKyAgICAgICAgYm9vbCB1cHBlckFkZHJlc3MsCisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIGFsbG9jVHlwZSwKKyAgICAgICAgYm9vbCBjYW5NYWtlT3RoZXJMb3N0LAorICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgVm1hQWxsb2NhdGlvblJlcXVlc3QqIHBBbGxvY2F0aW9uUmVxdWVzdCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgTWFrZVJlcXVlc3RlZEFsbG9jYXRpb25zTG9zdCgKKyAgICAgICAgdWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCwKKyAgICAgICAgVm1hQWxsb2NhdGlvblJlcXVlc3QqIHBBbGxvY2F0aW9uUmVxdWVzdCk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IE1ha2VBbGxvY2F0aW9uc0xvc3QodWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCk7CisKKyAgICB2aXJ0dWFsIFZrUmVzdWx0IENoZWNrQ29ycnVwdGlvbihjb25zdCB2b2lkKiBwQmxvY2tEYXRhKSB7IHJldHVybiBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgQWxsb2MoCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb25SZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSB0eXBlLAorICAgICAgICBWa0RldmljZVNpemUgYWxsb2NTaXplLAorICAgICAgICBib29sIHVwcGVyQWRkcmVzcywKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBoQWxsb2NhdGlvbik7CisKKyAgICB2aXJ0dWFsIHZvaWQgRnJlZShjb25zdCBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pIHsgRnJlZUF0T2Zmc2V0KGFsbG9jYXRpb24sIGFsbG9jYXRpb24tPkdldE9mZnNldCgpKTsgfQorICAgIHZpcnR1YWwgdm9pZCBGcmVlQXRPZmZzZXQoVmtEZXZpY2VTaXplIG9mZnNldCkgeyBGcmVlQXRPZmZzZXQoVk1BX05VTEwsIG9mZnNldCk7IH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgVmtEZXZpY2VTaXplIE1JTl9OT0RFX1NJWkUgPSAzMjsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9MRVZFTFMgPSAzMDsKKworICAgIHN0cnVjdCBWYWxpZGF0aW9uQ29udGV4dAorICAgIHsKKyAgICAgICAgc2l6ZV90IGNhbGN1bGF0ZWRBbGxvY2F0aW9uQ291bnQ7CisgICAgICAgIHNpemVfdCBjYWxjdWxhdGVkRnJlZUNvdW50OworICAgICAgICBWa0RldmljZVNpemUgY2FsY3VsYXRlZFN1bUZyZWVTaXplOworCisgICAgICAgIFZhbGlkYXRpb25Db250ZXh0KCkgOgorICAgICAgICAgICAgY2FsY3VsYXRlZEFsbG9jYXRpb25Db3VudCgwKSwKKyAgICAgICAgICAgIGNhbGN1bGF0ZWRGcmVlQ291bnQoMCksCisgICAgICAgICAgICBjYWxjdWxhdGVkU3VtRnJlZVNpemUoMCkgeyB9CisgICAgfTsKKworICAgIHN0cnVjdCBOb2RlCisgICAgeworICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0OworICAgICAgICBlbnVtIFRZUEUKKyAgICAgICAgeworICAgICAgICAgICAgVFlQRV9GUkVFLAorICAgICAgICAgICAgVFlQRV9BTExPQ0FUSU9OLAorICAgICAgICAgICAgVFlQRV9TUExJVCwKKyAgICAgICAgICAgIFRZUEVfQ09VTlQKKyAgICAgICAgfSB0eXBlOworICAgICAgICBOb2RlKiBwYXJlbnQ7CisgICAgICAgIE5vZGUqIGJ1ZGR5OworCisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vZGUqIHByZXY7CisgICAgICAgICAgICAgICAgTm9kZSogbmV4dDsKKyAgICAgICAgICAgIH0gZnJlZTsKKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZtYUFsbG9jYXRpb24gYWxsb2M7CisgICAgICAgICAgICB9IGFsbG9jYXRpb247CisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOb2RlKiBsZWZ0Q2hpbGQ7CisgICAgICAgICAgICB9IHNwbGl0OworICAgICAgICB9OworICAgIH07CisKKyAgICAvLyBTaXplIG9mIHRoZSBtZW1vcnkgYmxvY2sgYWxpZ25lZCBkb3duIHRvIGEgcG93ZXIgb2YgdHdvLgorICAgIFZrRGV2aWNlU2l6ZSBtX1VzYWJsZVNpemU7CisgICAgdWludDMyX3QgbV9MZXZlbENvdW50OworCisgICAgTm9kZSogbV9Sb290OworICAgIHN0cnVjdCB7CisgICAgICAgIE5vZGUqIGZyb250OworICAgICAgICBOb2RlKiBiYWNrOworICAgIH0gbV9GcmVlTGlzdFtNQVhfTEVWRUxTXTsKKyAgICAvLyBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhlIHRyZWUgd2l0aCB0eXBlID09IFRZUEVfQUxMT0NBVElPTi4KKyAgICBzaXplX3QgbV9BbGxvY2F0aW9uQ291bnQ7CisgICAgLy8gTnVtYmVyIG9mIG5vZGVzIGluIHRoZSB0cmVlIHdpdGggdHlwZSA9PSBUWVBFX0ZSRUUuCisgICAgc2l6ZV90IG1fRnJlZUNvdW50OworICAgIC8vIFRoaXMgaW5jbHVkZXMgc3BhY2Ugd2FzdGVkIGR1ZSB0byBpbnRlcm5hbCBmcmFnbWVudGF0aW9uLiBEb2Vzbid0IGluY2x1ZGUgdW51c2FibGUgc2l6ZS4KKyAgICBWa0RldmljZVNpemUgbV9TdW1GcmVlU2l6ZTsKKworICAgIFZrRGV2aWNlU2l6ZSBHZXRVbnVzYWJsZVNpemUoKSBjb25zdCB7IHJldHVybiBHZXRTaXplKCkgLSBtX1VzYWJsZVNpemU7IH0KKyAgICB2b2lkIERlbGV0ZU5vZGUoTm9kZSogbm9kZSk7CisgICAgYm9vbCBWYWxpZGF0ZU5vZGUoVmFsaWRhdGlvbkNvbnRleHQmIGN0eCwgY29uc3QgTm9kZSogcGFyZW50LCBjb25zdCBOb2RlKiBjdXJyLCB1aW50MzJfdCBsZXZlbCwgVmtEZXZpY2VTaXplIGxldmVsTm9kZVNpemUpIGNvbnN0OworICAgIHVpbnQzMl90IEFsbG9jU2l6ZVRvTGV2ZWwoVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSkgY29uc3Q7CisgICAgaW5saW5lIFZrRGV2aWNlU2l6ZSBMZXZlbFRvTm9kZVNpemUodWludDMyX3QgbGV2ZWwpIGNvbnN0IHsgcmV0dXJuIG1fVXNhYmxlU2l6ZSA+PiBsZXZlbDsgfQorICAgIC8vIEFsbG9jIHBhc3NlZCBqdXN0IGZvciB2YWxpZGF0aW9uLiBDYW4gYmUgbnVsbC4KKyAgICB2b2lkIEZyZWVBdE9mZnNldChWbWFBbGxvY2F0aW9uIGFsbG9jLCBWa0RldmljZVNpemUgb2Zmc2V0KTsKKyAgICB2b2lkIENhbGNBbGxvY2F0aW9uU3RhdEluZm9Ob2RlKFZtYVN0YXRJbmZvJiBvdXRJbmZvLCBjb25zdCBOb2RlKiBub2RlLCBWa0RldmljZVNpemUgbGV2ZWxOb2RlU2l6ZSkgY29uc3Q7CisgICAgLy8gQWRkcyBub2RlIHRvIHRoZSBmcm9udCBvZiBGcmVlTGlzdCBhdCBnaXZlbiBsZXZlbC4KKyAgICAvLyBub2RlLT50eXBlIG11c3QgYmUgRlJFRS4KKyAgICAvLyBub2RlLT5mcmVlLnByZXYsIG5leHQgY2FuIGJlIHVuZGVmaW5lZC4KKyAgICB2b2lkIEFkZFRvRnJlZUxpc3RGcm9udCh1aW50MzJfdCBsZXZlbCwgTm9kZSogbm9kZSk7CisgICAgLy8gUmVtb3ZlcyBub2RlIGZyb20gRnJlZUxpc3QgYXQgZ2l2ZW4gbGV2ZWwuCisgICAgLy8gbm9kZS0+dHlwZSBtdXN0IGJlIEZSRUUuCisgICAgLy8gbm9kZS0+ZnJlZS5wcmV2LCBuZXh0IHN0YXkgdW50b3VjaGVkLgorICAgIHZvaWQgUmVtb3ZlRnJvbUZyZWVMaXN0KHVpbnQzMl90IGxldmVsLCBOb2RlKiBub2RlKTsKKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorICAgIHZvaWQgUHJpbnREZXRhaWxlZE1hcE5vZGUoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbiwgY29uc3QgTm9kZSogbm9kZSwgVmtEZXZpY2VTaXplIGxldmVsTm9kZVNpemUpIGNvbnN0OworI2VuZGlmCit9OworCisvKgorUmVwcmVzZW50cyBhIHNpbmdsZSBibG9jayBvZiBkZXZpY2UgbWVtb3J5IChgVmtEZXZpY2VNZW1vcnlgKSB3aXRoIGFsbCB0aGUKK2RhdGEgYWJvdXQgaXRzIHJlZ2lvbnMgKGFrYSBzdWJhbGxvY2F0aW9ucywgI1ZtYUFsbG9jYXRpb24pLCBhc3NpZ25lZCBhbmQgZnJlZS4KKworVGhyZWFkLXNhZmV0eTogVGhpcyBjbGFzcyBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkLgorKi8KK2NsYXNzIFZtYURldmljZU1lbW9yeUJsb2NrCit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hRGV2aWNlTWVtb3J5QmxvY2spCitwdWJsaWM6CisgICAgVm1hQmxvY2tNZXRhZGF0YSogbV9wTWV0YWRhdGE7CisKKyAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayhWbWFBbGxvY2F0b3IgaEFsbG9jYXRvcik7CisKKyAgICB+Vm1hRGV2aWNlTWVtb3J5QmxvY2soKQorICAgIHsKKyAgICAgICAgVk1BX0FTU0VSVChtX01hcENvdW50ID09IDAgJiYgIlZrRGV2aWNlTWVtb3J5IGJsb2NrIGlzIGJlaW5nIGRlc3Ryb3llZCB3aGlsZSBpdCBpcyBzdGlsbCBtYXBwZWQuIik7CisgICAgICAgIFZNQV9BU1NFUlQobV9oTWVtb3J5ID09IFZLX05VTExfSEFORExFKTsKKyAgICB9CisKKyAgICAvLyBBbHdheXMgY2FsbCBhZnRlciBjb25zdHJ1Y3Rpb24uCisgICAgdm9pZCBJbml0KAorICAgICAgICBWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwKKyAgICAgICAgdWludDMyX3QgbmV3TWVtb3J5VHlwZUluZGV4LAorICAgICAgICBWa0RldmljZU1lbW9yeSBuZXdNZW1vcnksCisgICAgICAgIFZrRGV2aWNlU2l6ZSBuZXdTaXplLAorICAgICAgICB1aW50MzJfdCBpZCwKKyAgICAgICAgdWludDMyX3QgYWxnb3JpdGhtKTsKKyAgICAvLyBBbHdheXMgY2FsbCBiZWZvcmUgZGVzdHJ1Y3Rpb24uCisgICAgdm9pZCBEZXN0cm95KFZtYUFsbG9jYXRvciBhbGxvY2F0b3IpOworICAgIAorICAgIFZrRGV2aWNlTWVtb3J5IEdldERldmljZU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIG1faE1lbW9yeTsgfQorICAgIHVpbnQzMl90IEdldE1lbW9yeVR5cGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fTWVtb3J5VHlwZUluZGV4OyB9CisgICAgdWludDMyX3QgR2V0SWQoKSBjb25zdCB7IHJldHVybiBtX0lkOyB9CisgICAgdm9pZCogR2V0TWFwcGVkRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fcE1hcHBlZERhdGE7IH0KKworICAgIC8vIFZhbGlkYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGluc2lkZSB0aGlzIG9iamVjdC4gSWYgbm90IHZhbGlkLCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgVmFsaWRhdGUoKSBjb25zdDsKKworICAgIFZrUmVzdWx0IENoZWNrQ29ycnVwdGlvbihWbWFBbGxvY2F0b3IgaEFsbG9jYXRvcik7CisKKyAgICAvLyBwcERhdGEgY2FuIGJlIG51bGwuCisgICAgVmtSZXN1bHQgTWFwKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLCB1aW50MzJfdCBjb3VudCwgdm9pZCoqIHBwRGF0YSk7CisgICAgdm9pZCBVbm1hcChWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwgdWludDMyX3QgY291bnQpOworCisgICAgVmtSZXN1bHQgV3JpdGVNYWdpY1ZhbHVlQXJvdW5kQWxsb2NhdGlvbihWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwgVmtEZXZpY2VTaXplIGFsbG9jT2Zmc2V0LCBWa0RldmljZVNpemUgYWxsb2NTaXplKTsKKyAgICBWa1Jlc3VsdCBWYWxpZGF0ZU1hZ2ljVmFsdWVBcm91bmRBbGxvY2F0aW9uKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLCBWa0RldmljZVNpemUgYWxsb2NPZmZzZXQsIFZrRGV2aWNlU2l6ZSBhbGxvY1NpemUpOworCisgICAgVmtSZXN1bHQgQmluZEJ1ZmZlck1lbW9yeSgKKyAgICAgICAgY29uc3QgVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sCisgICAgICAgIFZrQnVmZmVyIGhCdWZmZXIpOworICAgIFZrUmVzdWx0IEJpbmRJbWFnZU1lbW9yeSgKKyAgICAgICAgY29uc3QgVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sCisgICAgICAgIFZrSW1hZ2UgaEltYWdlKTsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtX01lbW9yeVR5cGVJbmRleDsKKyAgICB1aW50MzJfdCBtX0lkOworICAgIFZrRGV2aWNlTWVtb3J5IG1faE1lbW9yeTsKKworICAgIC8qCisgICAgUHJvdGVjdHMgYWNjZXNzIHRvIG1faE1lbW9yeSBzbyBpdCdzIG5vdCB1c2VkIGJ5IG11bHRpcGxlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHksIGUuZy4gdmtNYXBNZW1vcnksIHZrQmluZEJ1ZmZlck1lbW9yeS4KKyAgICBBbHNvIHByb3RlY3RzIG1fTWFwQ291bnQsIG1fcE1hcHBlZERhdGEuCisgICAgQWxsb2NhdGlvbnMsIGRlYWxsb2NhdGlvbnMsIGFueSBjaGFuZ2UgaW4gbV9wTWV0YWRhdGEgaXMgcHJvdGVjdGVkIGJ5IHBhcmVudCdzIFZtYUJsb2NrVmVjdG9yOjptX011dGV4LgorICAgICovCisgICAgVk1BX01VVEVYIG1fTXV0ZXg7CisgICAgdWludDMyX3QgbV9NYXBDb3VudDsKKyAgICB2b2lkKiBtX3BNYXBwZWREYXRhOworfTsKKworc3RydWN0IFZtYVBvaW50ZXJMZXNzCit7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHZvaWQqIGxocywgY29uc3Qgdm9pZCogcmhzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxocyA8IHJoczsKKyAgICB9Cit9OworCitzdHJ1Y3QgVm1hRGVmcmFnbWVudGF0aW9uTW92ZQoreworICAgIHNpemVfdCBzcmNCbG9ja0luZGV4OworICAgIHNpemVfdCBkc3RCbG9ja0luZGV4OworICAgIFZrRGV2aWNlU2l6ZSBzcmNPZmZzZXQ7CisgICAgVmtEZXZpY2VTaXplIGRzdE9mZnNldDsKKyAgICBWa0RldmljZVNpemUgc2l6ZTsKK307CisKK2NsYXNzIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobTsKKworLyoKK1NlcXVlbmNlIG9mIFZtYURldmljZU1lbW9yeUJsb2NrLiBSZXByZXNlbnRzIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkIGZvciBhIHNwZWNpZmljCitWdWxrYW4gbWVtb3J5IHR5cGUuCisKK1N5bmNocm9uaXplZCBpbnRlcm5hbGx5IHdpdGggYSBtdXRleC4KKyovCitzdHJ1Y3QgVm1hQmxvY2tWZWN0b3IKK3sKKyAgICBWTUFfQ0xBU1NfTk9fQ09QWShWbWFCbG9ja1ZlY3RvcikKK3B1YmxpYzoKKyAgICBWbWFCbG9ja1ZlY3RvcigKKyAgICAgICAgVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsCisgICAgICAgIHVpbnQzMl90IG1lbW9yeVR5cGVJbmRleCwKKyAgICAgICAgVmtEZXZpY2VTaXplIHByZWZlcnJlZEJsb2NrU2l6ZSwKKyAgICAgICAgc2l6ZV90IG1pbkJsb2NrQ291bnQsCisgICAgICAgIHNpemVfdCBtYXhCbG9ja0NvdW50LAorICAgICAgICBWa0RldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgdWludDMyX3QgZnJhbWVJblVzZUNvdW50LAorICAgICAgICBib29sIGlzQ3VzdG9tUG9vbCwKKyAgICAgICAgYm9vbCBleHBsaWNpdEJsb2NrU2l6ZSwKKyAgICAgICAgdWludDMyX3QgYWxnb3JpdGhtKTsKKyAgICB+Vm1hQmxvY2tWZWN0b3IoKTsKKworICAgIFZrUmVzdWx0IENyZWF0ZU1pbkJsb2NrcygpOworCisgICAgdWludDMyX3QgR2V0TWVtb3J5VHlwZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9NZW1vcnlUeXBlSW5kZXg7IH0KKyAgICBWa0RldmljZVNpemUgR2V0UHJlZmVycmVkQmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gbV9QcmVmZXJyZWRCbG9ja1NpemU7IH0KKyAgICBWa0RldmljZVNpemUgR2V0QnVmZmVySW1hZ2VHcmFudWxhcml0eSgpIGNvbnN0IHsgcmV0dXJuIG1fQnVmZmVySW1hZ2VHcmFudWxhcml0eTsgfQorICAgIHVpbnQzMl90IEdldEZyYW1lSW5Vc2VDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fRnJhbWVJblVzZUNvdW50OyB9CisgICAgdWludDMyX3QgR2V0QWxnb3JpdGhtKCkgY29uc3QgeyByZXR1cm4gbV9BbGdvcml0aG07IH0KKworICAgIHZvaWQgR2V0UG9vbFN0YXRzKFZtYVBvb2xTdGF0cyogcFN0YXRzKTsKKworICAgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fQmxvY2tzLmVtcHR5KCk7IH0KKyAgICBib29sIElzQ29ycnVwdGlvbkRldGVjdGlvbkVuYWJsZWQoKSBjb25zdDsKKworICAgIFZrUmVzdWx0IEFsbG9jYXRlKAorICAgICAgICBWbWFQb29sIGhDdXJyZW50UG9vbCwKKyAgICAgICAgdWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgICAgICBWa0RldmljZVNpemUgYWxpZ25tZW50LAorICAgICAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyYgY3JlYXRlSW5mbywKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgc3ViYWxsb2NUeXBlLAorICAgICAgICBzaXplX3QgYWxsb2NhdGlvbkNvdW50LAorICAgICAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbnMpOworCisgICAgdm9pZCBGcmVlKAorICAgICAgICBWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uKTsKKworICAgIC8vIEFkZHMgc3RhdGlzdGljcyBvZiB0aGlzIEJsb2NrVmVjdG9yIHRvIHBTdGF0cy4KKyAgICB2b2lkIEFkZFN0YXRzKFZtYVN0YXRzKiBwU3RhdHMpOworCisjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisgICAgdm9pZCBQcmludERldGFpbGVkTWFwKGNsYXNzIFZtYUpzb25Xcml0ZXImIGpzb24pOworI2VuZGlmCisKKyAgICB2b2lkIE1ha2VQb29sQWxsb2NhdGlvbnNMb3N0KAorICAgICAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgc2l6ZV90KiBwTG9zdEFsbG9jYXRpb25Db3VudCk7CisgICAgVmtSZXN1bHQgQ2hlY2tDb3JydXB0aW9uKCk7CisKKyAgICAvLyBTYXZlcyByZXN1bHRzIGluIHBDdHgtPnJlcy4KKyAgICB2b2lkIERlZnJhZ21lbnQoCisgICAgICAgIGNsYXNzIFZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dCogcEN0eCwKKyAgICAgICAgVm1hRGVmcmFnbWVudGF0aW9uU3RhdHMqIHBTdGF0cywKKyAgICAgICAgVmtEZXZpY2VTaXplJiBtYXhDcHVCeXRlc1RvTW92ZSwgdWludDMyX3QmIG1heENwdUFsbG9jYXRpb25zVG9Nb3ZlLAorICAgICAgICBWa0RldmljZVNpemUmIG1heEdwdUJ5dGVzVG9Nb3ZlLCB1aW50MzJfdCYgbWF4R3B1QWxsb2NhdGlvbnNUb01vdmUsCisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKTsKKyAgICB2b2lkIERlZnJhZ21lbnRhdGlvbkVuZCgKKyAgICAgICAgY2xhc3MgVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0KiBwQ3R4LAorICAgICAgICBWbWFEZWZyYWdtZW50YXRpb25TdGF0cyogcFN0YXRzKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gVG8gYmUgdXNlZCBvbmx5IHdoaWxlIHRoZSBtX011dGV4IGlzIGxvY2tlZC4gVXNlZCBkdXJpbmcgZGVmcmFnbWVudGF0aW9uLgorCisgICAgc2l6ZV90IEdldEJsb2NrQ291bnQoKSBjb25zdCB7IHJldHVybiBtX0Jsb2Nrcy5zaXplKCk7IH0KKyAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogR2V0QmxvY2soc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX0Jsb2Nrc1tpbmRleF07IH0KKyAgICBzaXplX3QgQ2FsY0FsbG9jYXRpb25Db3VudCgpIGNvbnN0OworICAgIGJvb2wgSXNCdWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3RQb3NzaWJsZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fR2VuZXJpYzsKKworICAgIGNvbnN0IFZtYUFsbG9jYXRvciBtX2hBbGxvY2F0b3I7CisgICAgY29uc3QgdWludDMyX3QgbV9NZW1vcnlUeXBlSW5kZXg7CisgICAgY29uc3QgVmtEZXZpY2VTaXplIG1fUHJlZmVycmVkQmxvY2tTaXplOworICAgIGNvbnN0IHNpemVfdCBtX01pbkJsb2NrQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1fTWF4QmxvY2tDb3VudDsKKyAgICBjb25zdCBWa0RldmljZVNpemUgbV9CdWZmZXJJbWFnZUdyYW51bGFyaXR5OworICAgIGNvbnN0IHVpbnQzMl90IG1fRnJhbWVJblVzZUNvdW50OworICAgIGNvbnN0IGJvb2wgbV9Jc0N1c3RvbVBvb2w7CisgICAgY29uc3QgYm9vbCBtX0V4cGxpY2l0QmxvY2tTaXplOworICAgIGNvbnN0IHVpbnQzMl90IG1fQWxnb3JpdGhtOworICAgIC8qIFRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZSBhbGxvY2F0aW9uIHRoYXQgaXMgY29tcGxldGVseSBlbXB0eSAtIGEKKyAgICBoeXN0ZXJlc2lzIHRvIGF2b2lkIHBlc3NpbWlzdGljIGNhc2Ugb2YgYWx0ZXJuYXRpbmcgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uCisgICAgb2YgYSBWa0RldmljZU1lbW9yeS4gKi8KKyAgICBib29sIG1fSGFzRW1wdHlCbG9jazsKKyAgICBWTUFfUldfTVVURVggbV9NdXRleDsKKyAgICAvLyBJbmNyZW1lbnRhbGx5IHNvcnRlZCBieSBzdW1GcmVlU2l6ZSwgYXNjZW5kaW5nLgorICAgIFZtYVZlY3RvcjwgVm1hRGV2aWNlTWVtb3J5QmxvY2sqLCBWbWFTdGxBbGxvY2F0b3I8Vm1hRGV2aWNlTWVtb3J5QmxvY2sqPiA+IG1fQmxvY2tzOworICAgIHVpbnQzMl90IG1fTmV4dEJsb2NrSWQ7CisKKyAgICBWa0RldmljZVNpemUgQ2FsY01heEJsb2NrU2l6ZSgpIGNvbnN0OworCisgICAgLy8gRmluZHMgYW5kIHJlbW92ZXMgZ2l2ZW4gYmxvY2sgZnJvbSB2ZWN0b3IuCisgICAgdm9pZCBSZW1vdmUoVm1hRGV2aWNlTWVtb3J5QmxvY2sqIHBCbG9jayk7CisKKyAgICAvLyBQZXJmb3JtcyBzaW5nbGUgc3RlcCBpbiBzb3J0aW5nIG1fQmxvY2tzLiBUaGV5IG1heSBub3QgYmUgZnVsbHkgc29ydGVkCisgICAgLy8gYWZ0ZXIgdGhpcyBjYWxsLgorICAgIHZvaWQgSW5jcmVtZW50YWxseVNvcnRCbG9ja3MoKTsKKworICAgIFZrUmVzdWx0IEFsbG9jYXRlUGFnZSgKKyAgICAgICAgVm1hUG9vbCBoQ3VycmVudFBvb2wsCisgICAgICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgICAgICBWa0RldmljZVNpemUgc2l6ZSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsaWdubWVudCwKKyAgICAgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8mIGNyZWF0ZUluZm8sCisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24pOworCisgICAgLy8gVG8gYmUgdXNlZCBvbmx5IHdpdGhvdXQgQ0FOX01BS0VfT1RIRVJfTE9TVCBmbGFnLgorICAgIFZrUmVzdWx0IEFsbG9jYXRlRnJvbUJsb2NrKAorICAgICAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogcEJsb2NrLAorICAgICAgICBWbWFQb29sIGhDdXJyZW50UG9vbCwKKyAgICAgICAgdWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgICAgICBWa0RldmljZVNpemUgYWxpZ25tZW50LAorICAgICAgICBWbWFBbGxvY2F0aW9uQ3JlYXRlRmxhZ3MgYWxsb2NGbGFncywKKyAgICAgICAgdm9pZCogcFVzZXJEYXRhLAorICAgICAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBzdWJhbGxvY1R5cGUsCisgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbik7CisKKyAgICBWa1Jlc3VsdCBDcmVhdGVCbG9jayhWa0RldmljZVNpemUgYmxvY2tTaXplLCBzaXplX3QqIHBOZXdCbG9ja0luZGV4KTsKKworICAgIC8vIFNhdmVzIHJlc3VsdCB0byBwQ3R4LT5yZXMuCisgICAgdm9pZCBBcHBseURlZnJhZ21lbnRhdGlvbk1vdmVzQ3B1KAorICAgICAgICBjbGFzcyBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQqIHBEZWZyYWdDdHgsCisgICAgICAgIGNvbnN0IFZtYVZlY3RvcjwgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSwgVm1hU3RsQWxsb2NhdG9yPFZtYURlZnJhZ21lbnRhdGlvbk1vdmU+ID4mIG1vdmVzKTsKKyAgICAvLyBTYXZlcyByZXN1bHQgdG8gcEN0eC0+cmVzLgorICAgIHZvaWQgQXBwbHlEZWZyYWdtZW50YXRpb25Nb3Zlc0dwdSgKKyAgICAgICAgY2xhc3MgVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0KiBwRGVmcmFnQ3R4LAorICAgICAgICBjb25zdCBWbWFWZWN0b3I8IFZtYURlZnJhZ21lbnRhdGlvbk1vdmUsIFZtYVN0bEFsbG9jYXRvcjxWbWFEZWZyYWdtZW50YXRpb25Nb3ZlPiA+JiBtb3ZlcywKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIpOworCisgICAgLyoKKyAgICBVc2VkIGR1cmluZyBkZWZyYWdtZW50YXRpb24uIHBEZWZyYWdtZW50YXRpb25TdGF0cyBpcyBvcHRpb25hbC4gSXQncyBpbi9vdXQKKyAgICAtIHVwZGF0ZWQgd2l0aCBuZXcgZGF0YS4KKyAgICAqLworICAgIHZvaWQgRnJlZUVtcHR5QmxvY2tzKFZtYURlZnJhZ21lbnRhdGlvblN0YXRzKiBwRGVmcmFnbWVudGF0aW9uU3RhdHMpOworfTsKKworc3RydWN0IFZtYVBvb2xfVAoreworICAgIFZNQV9DTEFTU19OT19DT1BZKFZtYVBvb2xfVCkKK3B1YmxpYzoKKyAgICBWbWFCbG9ja1ZlY3RvciBtX0Jsb2NrVmVjdG9yOworCisgICAgVm1hUG9vbF9UKAorICAgICAgICBWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwKKyAgICAgICAgY29uc3QgVm1hUG9vbENyZWF0ZUluZm8mIGNyZWF0ZUluZm8sCisgICAgICAgIFZrRGV2aWNlU2l6ZSBwcmVmZXJyZWRCbG9ja1NpemUpOworICAgIH5WbWFQb29sX1QoKTsKKworICAgIHVpbnQzMl90IEdldElkKCkgY29uc3QgeyByZXR1cm4gbV9JZDsgfQorICAgIHZvaWQgU2V0SWQodWludDMyX3QgaWQpIHsgVk1BX0FTU0VSVChtX0lkID09IDApOyBtX0lkID0gaWQ7IH0KKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorICAgIC8vdm9pZCBQcmludERldGFpbGVkTWFwKGNsYXNzIFZtYVN0cmluZ0J1aWxkZXImIHNiKTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1fSWQ7Cit9OworCisvKgorUGVyZm9ybXMgZGVmcmFnbWVudGF0aW9uOgorCistIFVwZGF0ZXMgYHBCbG9ja1ZlY3Rvci0+bV9wTWV0YWRhdGFgLgorLSBVcGRhdGVzIGFsbG9jYXRpb25zIGJ5IGNhbGxpbmcgQ2hhbmdlQmxvY2tBbGxvY2F0aW9uKCkgb3IgQ2hhbmdlT2Zmc2V0KCkuCistIERvZXMgbm90IG1vdmUgYWN0dWFsIGRhdGEsIG9ubHkgcmV0dXJucyByZXF1ZXN0ZWQgbW92ZXMgYXMgYG1vdmVzYC4KKyovCitjbGFzcyBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG0KK3sKKyAgICBWTUFfQ0xBU1NfTk9fQ09QWShWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG0pCitwdWJsaWM6CisgICAgVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtKAorICAgICAgICBWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwKKyAgICAgICAgVm1hQmxvY2tWZWN0b3IqIHBCbG9ja1ZlY3RvciwKKyAgICAgICAgdWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgpIDoKKyAgICAgICAgbV9oQWxsb2NhdG9yKGhBbGxvY2F0b3IpLAorICAgICAgICBtX3BCbG9ja1ZlY3RvcihwQmxvY2tWZWN0b3IpLAorICAgICAgICBtX0N1cnJlbnRGcmFtZUluZGV4KGN1cnJlbnRGcmFtZUluZGV4KQorICAgIHsKKyAgICB9CisgICAgdmlydHVhbCB+Vm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtKCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIEFkZEFsbG9jYXRpb24oVm1hQWxsb2NhdGlvbiBoQWxsb2MsIFZrQm9vbDMyKiBwQ2hhbmdlZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBBZGRBbGwoKSA9IDA7CisKKyAgICB2aXJ0dWFsIFZrUmVzdWx0IERlZnJhZ21lbnQoCisgICAgICAgIFZtYVZlY3RvcjwgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSwgVm1hU3RsQWxsb2NhdG9yPFZtYURlZnJhZ21lbnRhdGlvbk1vdmU+ID4mIG1vdmVzLAorICAgICAgICBWa0RldmljZVNpemUgbWF4Qnl0ZXNUb01vdmUsCisgICAgICAgIHVpbnQzMl90IG1heEFsbG9jYXRpb25zVG9Nb3ZlKSA9IDA7CisKKyAgICB2aXJ0dWFsIFZrRGV2aWNlU2l6ZSBHZXRCeXRlc01vdmVkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgR2V0QWxsb2NhdGlvbnNNb3ZlZCgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIFZtYUFsbG9jYXRvciBjb25zdCBtX2hBbGxvY2F0b3I7CisgICAgVm1hQmxvY2tWZWN0b3IqIGNvbnN0IG1fcEJsb2NrVmVjdG9yOworICAgIGNvbnN0IHVpbnQzMl90IG1fQ3VycmVudEZyYW1lSW5kZXg7CisKKyAgICBzdHJ1Y3QgQWxsb2NhdGlvbkluZm8KKyAgICB7CisgICAgICAgIFZtYUFsbG9jYXRpb24gbV9oQWxsb2NhdGlvbjsKKyAgICAgICAgVmtCb29sMzIqIG1fcENoYW5nZWQ7CisKKyAgICAgICAgQWxsb2NhdGlvbkluZm8oKSA6CisgICAgICAgICAgICBtX2hBbGxvY2F0aW9uKFZLX05VTExfSEFORExFKSwKKyAgICAgICAgICAgIG1fcENoYW5nZWQoVk1BX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBBbGxvY2F0aW9uSW5mbyhWbWFBbGxvY2F0aW9uIGhBbGxvYywgVmtCb29sMzIqIHBDaGFuZ2VkKSA6CisgICAgICAgICAgICBtX2hBbGxvY2F0aW9uKGhBbGxvYyksCisgICAgICAgICAgICBtX3BDaGFuZ2VkKHBDaGFuZ2VkKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9OworfTsKKworY2xhc3MgVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0dlbmVyaWMgOiBwdWJsaWMgVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtCit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0dlbmVyaWMpCitwdWJsaWM6CisgICAgVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0dlbmVyaWMoCisgICAgICAgIFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLAorICAgICAgICBWbWFCbG9ja1ZlY3RvciogcEJsb2NrVmVjdG9yLAorICAgICAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgYm9vbCBvdmVybGFwcGluZ01vdmVTdXBwb3J0ZWQpOworICAgIHZpcnR1YWwgflZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9HZW5lcmljKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgQWRkQWxsb2NhdGlvbihWbWFBbGxvY2F0aW9uIGhBbGxvYywgVmtCb29sMzIqIHBDaGFuZ2VkKTsKKyAgICB2aXJ0dWFsIHZvaWQgQWRkQWxsKCkgeyBtX0FsbEFsbG9jYXRpb25zID0gdHJ1ZTsgfQorCisgICAgdmlydHVhbCBWa1Jlc3VsdCBEZWZyYWdtZW50KAorICAgICAgICBWbWFWZWN0b3I8IFZtYURlZnJhZ21lbnRhdGlvbk1vdmUsIFZtYVN0bEFsbG9jYXRvcjxWbWFEZWZyYWdtZW50YXRpb25Nb3ZlPiA+JiBtb3ZlcywKKyAgICAgICAgVmtEZXZpY2VTaXplIG1heEJ5dGVzVG9Nb3ZlLAorICAgICAgICB1aW50MzJfdCBtYXhBbGxvY2F0aW9uc1RvTW92ZSk7CisKKyAgICB2aXJ0dWFsIFZrRGV2aWNlU2l6ZSBHZXRCeXRlc01vdmVkKCkgY29uc3QgeyByZXR1cm4gbV9CeXRlc01vdmVkOyB9CisgICAgdmlydHVhbCB1aW50MzJfdCBHZXRBbGxvY2F0aW9uc01vdmVkKCkgY29uc3QgeyByZXR1cm4gbV9BbGxvY2F0aW9uc01vdmVkOyB9CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbV9BbGxvY2F0aW9uQ291bnQ7CisgICAgYm9vbCBtX0FsbEFsbG9jYXRpb25zOworCisgICAgVmtEZXZpY2VTaXplIG1fQnl0ZXNNb3ZlZDsKKyAgICB1aW50MzJfdCBtX0FsbG9jYXRpb25zTW92ZWQ7CisKKyAgICBzdHJ1Y3QgQWxsb2NhdGlvbkluZm9TaXplR3JlYXRlcgorICAgIHsKKyAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEFsbG9jYXRpb25JbmZvJiBsaHMsIGNvbnN0IEFsbG9jYXRpb25JbmZvJiByaHMpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV9oQWxsb2NhdGlvbi0+R2V0U2l6ZSgpID4gcmhzLm1faEFsbG9jYXRpb24tPkdldFNpemUoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgQWxsb2NhdGlvbkluZm9PZmZzZXRHcmVhdGVyCisgICAgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgQWxsb2NhdGlvbkluZm8mIGxocywgY29uc3QgQWxsb2NhdGlvbkluZm8mIHJocykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX2hBbGxvY2F0aW9uLT5HZXRPZmZzZXQoKSA+IHJocy5tX2hBbGxvY2F0aW9uLT5HZXRPZmZzZXQoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgQmxvY2tJbmZvCisgICAgeworICAgICAgICBzaXplX3QgbV9PcmlnaW5hbEJsb2NrSW5kZXg7CisgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBtX3BCbG9jazsKKyAgICAgICAgYm9vbCBtX0hhc05vbk1vdmFibGVBbGxvY2F0aW9uczsKKyAgICAgICAgVm1hVmVjdG9yPCBBbGxvY2F0aW9uSW5mbywgVm1hU3RsQWxsb2NhdG9yPEFsbG9jYXRpb25JbmZvPiA+IG1fQWxsb2NhdGlvbnM7CisKKyAgICAgICAgQmxvY2tJbmZvKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRpb25DYWxsYmFja3MpIDoKKyAgICAgICAgICAgIG1fT3JpZ2luYWxCbG9ja0luZGV4KFNJWkVfTUFYKSwKKyAgICAgICAgICAgIG1fcEJsb2NrKFZNQV9OVUxMKSwKKyAgICAgICAgICAgIG1fSGFzTm9uTW92YWJsZUFsbG9jYXRpb25zKHRydWUpLAorICAgICAgICAgICAgbV9BbGxvY2F0aW9ucyhwQWxsb2NhdGlvbkNhbGxiYWNrcykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBDYWxjSGFzTm9uTW92YWJsZUFsbG9jYXRpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGJsb2NrQWxsb2NDb3VudCA9IG1fcEJsb2NrLT5tX3BNZXRhZGF0YS0+R2V0QWxsb2NhdGlvbkNvdW50KCk7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgZGVmcmFnbWVudEFsbG9jQ291bnQgPSBtX0FsbG9jYXRpb25zLnNpemUoKTsKKyAgICAgICAgICAgIG1fSGFzTm9uTW92YWJsZUFsbG9jYXRpb25zID0gYmxvY2tBbGxvY0NvdW50ICE9IGRlZnJhZ21lbnRBbGxvY0NvdW50OworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBTb3J0QWxsb2NhdGlvbnNCeVNpemVEZXNjZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX1NPUlQobV9BbGxvY2F0aW9ucy5iZWdpbigpLCBtX0FsbG9jYXRpb25zLmVuZCgpLCBBbGxvY2F0aW9uSW5mb1NpemVHcmVhdGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBTb3J0QWxsb2NhdGlvbnNCeU9mZnNldERlc2NlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBWTUFfU09SVChtX0FsbG9jYXRpb25zLmJlZ2luKCksIG1fQWxsb2NhdGlvbnMuZW5kKCksIEFsbG9jYXRpb25JbmZvT2Zmc2V0R3JlYXRlcigpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgQmxvY2tQb2ludGVyTGVzcworICAgIHsKKyAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEJsb2NrSW5mbyogcExoc0Jsb2NrSW5mbywgY29uc3QgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIHBSaHNCbG9jaykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBMaHNCbG9ja0luZm8tPm1fcEJsb2NrIDwgcFJoc0Jsb2NrOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBCbG9ja0luZm8qIHBMaHNCbG9ja0luZm8sIGNvbnN0IEJsb2NrSW5mbyogcFJoc0Jsb2NrSW5mbykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBMaHNCbG9ja0luZm8tPm1fcEJsb2NrIDwgcFJoc0Jsb2NrSW5mby0+bV9wQmxvY2s7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gMS4gQmxvY2tzIHdpdGggc29tZSBub24tbW92YWJsZSBhbGxvY2F0aW9ucyBnbyBmaXJzdC4KKyAgICAvLyAyLiBCbG9ja3Mgd2l0aCBzbWFsbGVyIHN1bUZyZWVTaXplIGdvIGZpcnN0LgorICAgIHN0cnVjdCBCbG9ja0luZm9Db21wYXJlTW92ZURlc3RpbmF0aW9uCisgICAgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgQmxvY2tJbmZvKiBwTGhzQmxvY2tJbmZvLCBjb25zdCBCbG9ja0luZm8qIHBSaHNCbG9ja0luZm8pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBMaHNCbG9ja0luZm8tPm1fSGFzTm9uTW92YWJsZUFsbG9jYXRpb25zICYmICFwUmhzQmxvY2tJbmZvLT5tX0hhc05vbk1vdmFibGVBbGxvY2F0aW9ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFwTGhzQmxvY2tJbmZvLT5tX0hhc05vbk1vdmFibGVBbGxvY2F0aW9ucyAmJiBwUmhzQmxvY2tJbmZvLT5tX0hhc05vbk1vdmFibGVBbGxvY2F0aW9ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwTGhzQmxvY2tJbmZvLT5tX3BCbG9jay0+bV9wTWV0YWRhdGEtPkdldFN1bUZyZWVTaXplKCkgPCBwUmhzQmxvY2tJbmZvLT5tX3BCbG9jay0+bV9wTWV0YWRhdGEtPkdldFN1bUZyZWVTaXplKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdHlwZWRlZiBWbWFWZWN0b3I8IEJsb2NrSW5mbyosIFZtYVN0bEFsbG9jYXRvcjxCbG9ja0luZm8qPiA+IEJsb2NrSW5mb1ZlY3RvcjsKKyAgICBCbG9ja0luZm9WZWN0b3IgbV9CbG9ja3M7CisKKyAgICBWa1Jlc3VsdCBEZWZyYWdtZW50Um91bmQoCisgICAgICAgIFZtYVZlY3RvcjwgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSwgVm1hU3RsQWxsb2NhdG9yPFZtYURlZnJhZ21lbnRhdGlvbk1vdmU+ID4mIG1vdmVzLAorICAgICAgICBWa0RldmljZVNpemUgbWF4Qnl0ZXNUb01vdmUsCisgICAgICAgIHVpbnQzMl90IG1heEFsbG9jYXRpb25zVG9Nb3ZlKTsKKworICAgIHNpemVfdCBDYWxjQmxvY2tzV2l0aE5vbk1vdmFibGVDb3VudCgpIGNvbnN0OworCisgICAgc3RhdGljIGJvb2wgTW92ZU1ha2VzU2Vuc2UoCisgICAgICAgIHNpemVfdCBkc3RCbG9ja0luZGV4LCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LAorICAgICAgICBzaXplX3Qgc3JjQmxvY2tJbmRleCwgVmtEZXZpY2VTaXplIHNyY09mZnNldCk7Cit9OworCitjbGFzcyBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fRmFzdCA6IHB1YmxpYyBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG0KK3sKKyAgICBWTUFfQ0xBU1NfTk9fQ09QWShWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fRmFzdCkKK3B1YmxpYzoKKyAgICBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fRmFzdCgKKyAgICAgICAgVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsCisgICAgICAgIFZtYUJsb2NrVmVjdG9yKiBwQmxvY2tWZWN0b3IsCisgICAgICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgICAgICBib29sIG92ZXJsYXBwaW5nTW92ZVN1cHBvcnRlZCk7CisgICAgdmlydHVhbCB+Vm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0Zhc3QoKTsKKworICAgIHZpcnR1YWwgdm9pZCBBZGRBbGxvY2F0aW9uKFZtYUFsbG9jYXRpb24gaEFsbG9jLCBWa0Jvb2wzMiogcENoYW5nZWQpIHsgKyttX0FsbG9jYXRpb25Db3VudDsgfQorICAgIHZpcnR1YWwgdm9pZCBBZGRBbGwoKSB7IG1fQWxsQWxsb2NhdGlvbnMgPSB0cnVlOyB9CisKKyAgICB2aXJ0dWFsIFZrUmVzdWx0IERlZnJhZ21lbnQoCisgICAgICAgIFZtYVZlY3RvcjwgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSwgVm1hU3RsQWxsb2NhdG9yPFZtYURlZnJhZ21lbnRhdGlvbk1vdmU+ID4mIG1vdmVzLAorICAgICAgICBWa0RldmljZVNpemUgbWF4Qnl0ZXNUb01vdmUsCisgICAgICAgIHVpbnQzMl90IG1heEFsbG9jYXRpb25zVG9Nb3ZlKTsKKworICAgIHZpcnR1YWwgVmtEZXZpY2VTaXplIEdldEJ5dGVzTW92ZWQoKSBjb25zdCB7IHJldHVybiBtX0J5dGVzTW92ZWQ7IH0KKyAgICB2aXJ0dWFsIHVpbnQzMl90IEdldEFsbG9jYXRpb25zTW92ZWQoKSBjb25zdCB7IHJldHVybiBtX0FsbG9jYXRpb25zTW92ZWQ7IH0KKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQmxvY2tJbmZvCisgICAgeworICAgICAgICBzaXplX3Qgb3JpZ0Jsb2NrSW5kZXg7CisgICAgfTsKKworICAgIGNsYXNzIEZyZWVTcGFjZURhdGFiYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgRnJlZVNwYWNlRGF0YWJhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBGcmVlU3BhY2UgcyA9IHt9OworICAgICAgICAgICAgcy5ibG9ja0luZm9JbmRleCA9IFNJWkVfTUFYOworICAgICAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IE1BWF9DT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fRnJlZVNwYWNlc1tpXSA9IHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIFJlZ2lzdGVyKHNpemVfdCBibG9ja0luZm9JbmRleCwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNpemUgPCBWTUFfTUlOX0ZSRUVfU1VCQUxMT0NBVElPTl9TSVpFX1RPX1JFR0lTVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluZCBmaXJzdCBpbnZhbGlkIG9yIHRoZSBzbWFsbGVzdCBzdHJ1Y3R1cmUuCisgICAgICAgICAgICBzaXplX3QgYmVzdEluZGV4ID0gU0laRV9NQVg7CisgICAgICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0NPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW1wdHkgc3RydWN0dXJlLgorICAgICAgICAgICAgICAgIGlmKG1fRnJlZVNwYWNlc1tpXS5ibG9ja0luZm9JbmRleCA9PSBTSVpFX01BWCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihtX0ZyZWVTcGFjZXNbaV0uc2l6ZSA8IHNpemUgJiYKKyAgICAgICAgICAgICAgICAgICAgKGJlc3RJbmRleCA9PSBTSVpFX01BWCB8fCBtX0ZyZWVTcGFjZXNbYmVzdEluZGV4XS5zaXplID4gbV9GcmVlU3BhY2VzW2ldLnNpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGJlc3RJbmRleCAhPSBTSVpFX01BWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX0ZyZWVTcGFjZXNbYmVzdEluZGV4XS5ibG9ja0luZm9JbmRleCA9IGJsb2NrSW5mb0luZGV4OworICAgICAgICAgICAgICAgIG1fRnJlZVNwYWNlc1tiZXN0SW5kZXhdLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBtX0ZyZWVTcGFjZXNbYmVzdEluZGV4XS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgRmV0Y2goVmtEZXZpY2VTaXplIGFsaWdubWVudCwgVmtEZXZpY2VTaXplIHNpemUsCisgICAgICAgICAgICBzaXplX3QmIG91dEJsb2NrSW5mb0luZGV4LCBWa0RldmljZVNpemUmIG91dERzdE9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGJlc3RJbmRleCA9IFNJWkVfTUFYOworICAgICAgICAgICAgVmtEZXZpY2VTaXplIGJlc3RGcmVlU3BhY2VBZnRlciA9IDA7CisgICAgICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0NPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU3RydWN0dXJlIGlzIHZhbGlkLgorICAgICAgICAgICAgICAgIGlmKG1fRnJlZVNwYWNlc1tpXS5ibG9ja0luZm9JbmRleCAhPSBTSVpFX01BWCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQgPSBWbWFBbGlnblVwKG1fRnJlZVNwYWNlc1tpXS5vZmZzZXQsIGFsaWdubWVudCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRpb24gZml0cyBpbnRvIHRoaXMgc3RydWN0dXJlLgorICAgICAgICAgICAgICAgICAgICBpZihkc3RPZmZzZXQgKyBzaXplIDw9IG1fRnJlZVNwYWNlc1tpXS5vZmZzZXQgKyBtX0ZyZWVTcGFjZXNbaV0uc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGZyZWVTcGFjZUFmdGVyID0gKG1fRnJlZVNwYWNlc1tpXS5vZmZzZXQgKyBtX0ZyZWVTcGFjZXNbaV0uc2l6ZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkc3RPZmZzZXQgKyBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJlc3RJbmRleCA9PSBTSVpFX01BWCB8fCBmcmVlU3BhY2VBZnRlciA+IGJlc3RGcmVlU3BhY2VBZnRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RGcmVlU3BhY2VBZnRlciA9IGZyZWVTcGFjZUFmdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZihiZXN0SW5kZXggIT0gU0laRV9NQVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0QmxvY2tJbmZvSW5kZXggPSBtX0ZyZWVTcGFjZXNbYmVzdEluZGV4XS5ibG9ja0luZm9JbmRleDsKKyAgICAgICAgICAgICAgICBvdXREc3RPZmZzZXQgPSBWbWFBbGlnblVwKG1fRnJlZVNwYWNlc1tiZXN0SW5kZXhdLm9mZnNldCwgYWxpZ25tZW50KTsKKworICAgICAgICAgICAgICAgIGlmKGJlc3RGcmVlU3BhY2VBZnRlciA+PSBWTUFfTUlOX0ZSRUVfU1VCQUxMT0NBVElPTl9TSVpFX1RPX1JFR0lTVEVSKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmUgdGhpcyBzdHJ1Y3R1cmUgZm9yIHJlbWFpbmluZyBlbXB0eSBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGFsaWdubWVudFBsdXNTaXplID0gKG91dERzdE9mZnNldCAtIG1fRnJlZVNwYWNlc1tiZXN0SW5kZXhdLm9mZnNldCkgKyBzaXplOworICAgICAgICAgICAgICAgICAgICBtX0ZyZWVTcGFjZXNbYmVzdEluZGV4XS5vZmZzZXQgKz0gYWxpZ25tZW50UGx1c1NpemU7CisgICAgICAgICAgICAgICAgICAgIG1fRnJlZVNwYWNlc1tiZXN0SW5kZXhdLnNpemUgLT0gYWxpZ25tZW50UGx1c1NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc3RydWN0dXJlIGJlY29tZXMgaW52YWxpZC4KKyAgICAgICAgICAgICAgICAgICAgbV9GcmVlU3BhY2VzW2Jlc3RJbmRleF0uYmxvY2tJbmZvSW5kZXggPSBTSVpFX01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9DT1VOVCA9IDQ7CisKKyAgICAgICAgc3RydWN0IEZyZWVTcGFjZQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgYmxvY2tJbmZvSW5kZXg7IC8vIFNJWkVfTUFYIG1lYW5zIHRoaXMgc3RydWN0dXJlIGlzIGludmFsaWQuCisgICAgICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0OworICAgICAgICAgICAgVmtEZXZpY2VTaXplIHNpemU7CisgICAgICAgIH0gbV9GcmVlU3BhY2VzW01BWF9DT1VOVF07CisgICAgfTsKKworICAgIGNvbnN0IGJvb2wgbV9PdmVybGFwcGluZ01vdmVTdXBwb3J0ZWQ7CisKKyAgICB1aW50MzJfdCBtX0FsbG9jYXRpb25Db3VudDsKKyAgICBib29sIG1fQWxsQWxsb2NhdGlvbnM7CisKKyAgICBWa0RldmljZVNpemUgbV9CeXRlc01vdmVkOworICAgIHVpbnQzMl90IG1fQWxsb2NhdGlvbnNNb3ZlZDsKKworICAgIFZtYVZlY3RvcjwgQmxvY2tJbmZvLCBWbWFTdGxBbGxvY2F0b3I8QmxvY2tJbmZvPiA+IG1fQmxvY2tJbmZvczsKKworICAgIHZvaWQgUHJlcHJvY2Vzc01ldGFkYXRhKCk7CisgICAgdm9pZCBQb3N0cHJvY2Vzc01ldGFkYXRhKCk7CisgICAgdm9pZCBJbnNlcnRTdWJhbGxvYyhWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMqIHBNZXRhZGF0YSwgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MpOworfTsKKworc3RydWN0IFZtYUJsb2NrRGVmcmFnbWVudGF0aW9uQ29udGV4dAoreworICAgIGVudW0gQkxPQ0tfRkxBRworICAgIHsKKyAgICAgICAgQkxPQ0tfRkxBR19VU0VEID0gMHgwMDAwMDAwMSwKKyAgICB9OworICAgIHVpbnQzMl90IGZsYWdzOworICAgIFZrQnVmZmVyIGhCdWZmZXI7CisKKyAgICBWbWFCbG9ja0RlZnJhZ21lbnRhdGlvbkNvbnRleHQoKSA6CisgICAgICAgIGZsYWdzKDApLAorICAgICAgICBoQnVmZmVyKFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICB9Cit9OworCitjbGFzcyBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQKK3sKKyAgICBWTUFfQ0xBU1NfTk9fQ09QWShWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQpCitwdWJsaWM6CisgICAgVmtSZXN1bHQgcmVzOworICAgIGJvb2wgbXV0ZXhMb2NrZWQ7CisgICAgVm1hVmVjdG9yPCBWbWFCbG9ja0RlZnJhZ21lbnRhdGlvbkNvbnRleHQsIFZtYVN0bEFsbG9jYXRvcjxWbWFCbG9ja0RlZnJhZ21lbnRhdGlvbkNvbnRleHQ+ID4gYmxvY2tDb250ZXh0czsKKworICAgIFZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dCgKKyAgICAgICAgVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsCisgICAgICAgIFZtYVBvb2wgaEN1c3RvbVBvb2wsIC8vIE9wdGlvbmFsLgorICAgICAgICBWbWFCbG9ja1ZlY3RvciogcEJsb2NrVmVjdG9yLAorICAgICAgICB1aW50MzJfdCBjdXJyRnJhbWVJbmRleCwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgIH5WbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQoKTsKKworICAgIFZtYVBvb2wgR2V0Q3VzdG9tUG9vbCgpIGNvbnN0IHsgcmV0dXJuIG1faEN1c3RvbVBvb2w7IH0KKyAgICBWbWFCbG9ja1ZlY3RvciogR2V0QmxvY2tWZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX3BCbG9ja1ZlY3RvcjsgfQorICAgIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobSogR2V0QWxnb3JpdGhtKCkgY29uc3QgeyByZXR1cm4gbV9wQWxnb3JpdGhtOyB9CisKKyAgICB2b2lkIEFkZEFsbG9jYXRpb24oVm1hQWxsb2NhdGlvbiBoQWxsb2MsIFZrQm9vbDMyKiBwQ2hhbmdlZCk7CisgICAgdm9pZCBBZGRBbGwoKSB7IG1fQWxsQWxsb2NhdGlvbnMgPSB0cnVlOyB9CisKKyAgICB2b2lkIEJlZ2luKGJvb2wgb3ZlcmxhcHBpbmdNb3ZlU3VwcG9ydGVkKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBWbWFBbGxvY2F0b3IgbV9oQWxsb2NhdG9yOworICAgIC8vIE51bGwgaWYgbm90IGZyb20gY3VzdG9tIHBvb2wuCisgICAgY29uc3QgVm1hUG9vbCBtX2hDdXN0b21Qb29sOworICAgIC8vIFJlZHVuZGFudCwgZm9yIGNvbnZlbmllbmNlIG5vdCB0byBmZXRjaCBmcm9tIG1faEN1c3RvbVBvb2wtPm1fQmxvY2tWZWN0b3Igb3IgbV9oQWxsb2NhdG9yLT5tX3BCbG9ja1ZlY3RvcnMuCisgICAgVm1hQmxvY2tWZWN0b3IqIGNvbnN0IG1fcEJsb2NrVmVjdG9yOworICAgIGNvbnN0IHVpbnQzMl90IG1fQ3VyckZyYW1lSW5kZXg7CisgICAgLy9jb25zdCB1aW50MzJfdCBtX0FsZ29yaXRobUZsYWdzOworICAgIC8vIE93bmVyIG9mIHRoaXMgb2JqZWN0LgorICAgIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobSogbV9wQWxnb3JpdGhtOworCisgICAgc3RydWN0IEFsbG9jSW5mbworICAgIHsKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBoQWxsb2M7CisgICAgICAgIFZrQm9vbDMyKiBwQ2hhbmdlZDsKKyAgICB9OworICAgIC8vIFVzZWQgYmV0d2VlbiBjb25zdHJ1Y3RvciBhbmQgQmVnaW4uCisgICAgVm1hVmVjdG9yPCBBbGxvY0luZm8sIFZtYVN0bEFsbG9jYXRvcjxBbGxvY0luZm8+ID4gbV9BbGxvY2F0aW9uczsKKyAgICBib29sIG1fQWxsQWxsb2NhdGlvbnM7Cit9OworCitzdHJ1Y3QgVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dF9UCit7Citwcml2YXRlOgorICAgIFZNQV9DTEFTU19OT19DT1BZKFZtYURlZnJhZ21lbnRhdGlvbkNvbnRleHRfVCkKK3B1YmxpYzoKKyAgICBWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0X1QoCisgICAgICAgIFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLAorICAgICAgICB1aW50MzJfdCBjdXJyRnJhbWVJbmRleCwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIFZtYURlZnJhZ21lbnRhdGlvblN0YXRzKiBwU3RhdHMpOworICAgIH5WbWFEZWZyYWdtZW50YXRpb25Db250ZXh0X1QoKTsKKworICAgIHZvaWQgQWRkUG9vbHModWludDMyX3QgcG9vbENvdW50LCBWbWFQb29sKiBwUG9vbHMpOworICAgIHZvaWQgQWRkQWxsb2NhdGlvbnMoCisgICAgICAgIHVpbnQzMl90IGFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zLAorICAgICAgICBWa0Jvb2wzMiogcEFsbG9jYXRpb25zQ2hhbmdlZCk7CisKKyAgICAvKgorICAgIFJldHVybnM6CisgICAgLSBgVktfU1VDQ0VTU2AgaWYgc3VjY2VlZGVkIGFuZCBvYmplY3QgY2FuIGJlIGRlc3Ryb3llZCBpbW1lZGlhdGVseS4KKyAgICAtIGBWS19OT1RfUkVBRFlgIGlmIHN1Y2NlZWRlZCBidXQgdGhlIG9iamVjdCBtdXN0IHJlbWFpbiBhbGl2ZSB1bnRpbCB2bWFEZWZyYWdtZW50YXRpb25FbmQoKS4KKyAgICAtIE5lZ2F0aXZlIHZhbHVlIGlmIGVycm9yIG9jY3VyZWQgYW5kIG9iamVjdCBjYW4gYmUgZGVzdHJveWVkIGltbWVkaWF0ZWx5LgorICAgICovCisgICAgVmtSZXN1bHQgRGVmcmFnbWVudCgKKyAgICAgICAgVmtEZXZpY2VTaXplIG1heENwdUJ5dGVzVG9Nb3ZlLCB1aW50MzJfdCBtYXhDcHVBbGxvY2F0aW9uc1RvTW92ZSwKKyAgICAgICAgVmtEZXZpY2VTaXplIG1heEdwdUJ5dGVzVG9Nb3ZlLCB1aW50MzJfdCBtYXhHcHVBbGxvY2F0aW9uc1RvTW92ZSwKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZtYURlZnJhZ21lbnRhdGlvblN0YXRzKiBwU3RhdHMpOworCitwcml2YXRlOgorICAgIGNvbnN0IFZtYUFsbG9jYXRvciBtX2hBbGxvY2F0b3I7CisgICAgY29uc3QgdWludDMyX3QgbV9DdXJyRnJhbWVJbmRleDsKKyAgICBjb25zdCB1aW50MzJfdCBtX0ZsYWdzOworICAgIFZtYURlZnJhZ21lbnRhdGlvblN0YXRzKiBjb25zdCBtX3BTdGF0czsKKyAgICAvLyBPd25lciBvZiB0aGVzZSBvYmplY3RzLgorICAgIFZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dCogbV9EZWZhdWx0UG9vbENvbnRleHRzW1ZLX01BWF9NRU1PUllfVFlQRVNdOworICAgIC8vIE93bmVyIG9mIHRoZXNlIG9iamVjdHMuCisgICAgVm1hVmVjdG9yPCBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQqLCBWbWFTdGxBbGxvY2F0b3I8Vm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0Kj4gPiBtX0N1c3RvbVBvb2xDb250ZXh0czsKK307CisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKworY2xhc3MgVm1hUmVjb3JkZXIKK3sKK3B1YmxpYzoKKyAgICBWbWFSZWNvcmRlcigpOworICAgIFZrUmVzdWx0IEluaXQoY29uc3QgVm1hUmVjb3JkU2V0dGluZ3MmIHNldHRpbmdzLCBib29sIHVzZU11dGV4KTsKKyAgICB2b2lkIFdyaXRlQ29uZmlndXJhdGlvbigKKyAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMmIGRldlByb3BzLAorICAgICAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyYgbWVtUHJvcHMsCisgICAgICAgIGJvb2wgZGVkaWNhdGVkQWxsb2NhdGlvbkV4dGVuc2lvbkVuYWJsZWQpOworICAgIH5WbWFSZWNvcmRlcigpOworCisgICAgdm9pZCBSZWNvcmRDcmVhdGVBbGxvY2F0b3IodWludDMyX3QgZnJhbWVJbmRleCk7CisgICAgdm9pZCBSZWNvcmREZXN0cm95QWxsb2NhdG9yKHVpbnQzMl90IGZyYW1lSW5kZXgpOworICAgIHZvaWQgUmVjb3JkQ3JlYXRlUG9vbCh1aW50MzJfdCBmcmFtZUluZGV4LAorICAgICAgICBjb25zdCBWbWFQb29sQ3JlYXRlSW5mbyYgY3JlYXRlSW5mbywKKyAgICAgICAgVm1hUG9vbCBwb29sKTsKKyAgICB2b2lkIFJlY29yZERlc3Ryb3lQb29sKHVpbnQzMl90IGZyYW1lSW5kZXgsIFZtYVBvb2wgcG9vbCk7CisgICAgdm9pZCBSZWNvcmRBbGxvY2F0ZU1lbW9yeSh1aW50MzJfdCBmcmFtZUluZGV4LAorICAgICAgICBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyYgdmtNZW1SZXEsCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBjcmVhdGVJbmZvLAorICAgICAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pOworICAgIHZvaWQgUmVjb3JkQWxsb2NhdGVNZW1vcnlQYWdlcyh1aW50MzJfdCBmcmFtZUluZGV4LAorICAgICAgICBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyYgdmtNZW1SZXEsCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBjcmVhdGVJbmZvLAorICAgICAgICB1aW50NjRfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9ucyk7CisgICAgdm9pZCBSZWNvcmRBbGxvY2F0ZU1lbW9yeUZvckJ1ZmZlcih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgICAgICBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyYgdmtNZW1SZXEsCisgICAgICAgIGJvb2wgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICBib29sIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyYgY3JlYXRlSW5mbywKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKTsKKyAgICB2b2lkIFJlY29yZEFsbG9jYXRlTWVtb3J5Rm9ySW1hZ2UodWludDMyX3QgZnJhbWVJbmRleCwKKyAgICAgICAgY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMmIHZrTWVtUmVxLAorICAgICAgICBib29sIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICAgICAgYm9vbCBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICAgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8mIGNyZWF0ZUluZm8sCisgICAgICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CisgICAgdm9pZCBSZWNvcmRGcmVlTWVtb3J5KHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CisgICAgdm9pZCBSZWNvcmRGcmVlTWVtb3J5UGFnZXModWludDMyX3QgZnJhbWVJbmRleCwKKyAgICAgICAgdWludDY0X3QgYWxsb2NhdGlvbkNvdW50LAorICAgICAgICBjb25zdCBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbnMpOworICAgIHZvaWQgUmVjb3JkUmVzaXplQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3QgZnJhbWVJbmRleCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgICAgICBWa0RldmljZVNpemUgbmV3U2l6ZSk7CisgICAgdm9pZCBSZWNvcmRTZXRBbGxvY2F0aW9uVXNlckRhdGEodWludDMyX3QgZnJhbWVJbmRleCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgICAgICBjb25zdCB2b2lkKiBwVXNlckRhdGEpOworICAgIHZvaWQgUmVjb3JkQ3JlYXRlTG9zdEFsbG9jYXRpb24odWludDMyX3QgZnJhbWVJbmRleCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKTsKKyAgICB2b2lkIFJlY29yZE1hcE1lbW9yeSh1aW50MzJfdCBmcmFtZUluZGV4LAorICAgICAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pOworICAgIHZvaWQgUmVjb3JkVW5tYXBNZW1vcnkodWludDMyX3QgZnJhbWVJbmRleCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKTsKKyAgICB2b2lkIFJlY29yZEZsdXNoQWxsb2NhdGlvbih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgICAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24sIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplKTsKKyAgICB2b2lkIFJlY29yZEludmFsaWRhdGVBbGxvY2F0aW9uKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpOworICAgIHZvaWQgUmVjb3JkQ3JlYXRlQnVmZmVyKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyYgYnVmQ3JlYXRlSW5mbywKKyAgICAgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8mIGFsbG9jQ3JlYXRlSW5mbywKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKTsKKyAgICB2b2lkIFJlY29yZENyZWF0ZUltYWdlKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvJiBpbWFnZUNyZWF0ZUluZm8sCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBhbGxvY0NyZWF0ZUluZm8sCisgICAgICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CisgICAgdm9pZCBSZWNvcmREZXN0cm95QnVmZmVyKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CisgICAgdm9pZCBSZWNvcmREZXN0cm95SW1hZ2UodWludDMyX3QgZnJhbWVJbmRleCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKTsKKyAgICB2b2lkIFJlY29yZFRvdWNoQWxsb2NhdGlvbih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgICAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pOworICAgIHZvaWQgUmVjb3JkR2V0QWxsb2NhdGlvbkluZm8odWludDMyX3QgZnJhbWVJbmRleCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKTsKKyAgICB2b2lkIFJlY29yZE1ha2VQb29sQWxsb2NhdGlvbnNMb3N0KHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgICAgIFZtYVBvb2wgcG9vbCk7CisgICAgdm9pZCBSZWNvcmREZWZyYWdtZW50YXRpb25CZWdpbih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgICAgICBjb25zdCBWbWFEZWZyYWdtZW50YXRpb25JbmZvMiYgaW5mbywKKyAgICAgICAgVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dCBjdHgpOworICAgIHZvaWQgUmVjb3JkRGVmcmFnbWVudGF0aW9uRW5kKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgICAgIFZtYURlZnJhZ21lbnRhdGlvbkNvbnRleHQgY3R4KTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQ2FsbFBhcmFtcworICAgIHsKKyAgICAgICAgdWludDMyX3QgdGhyZWFkSWQ7CisgICAgICAgIGRvdWJsZSB0aW1lOworICAgIH07CisKKyAgICBjbGFzcyBVc2VyRGF0YVN0cmluZworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFVzZXJEYXRhU3RyaW5nKFZtYUFsbG9jYXRpb25DcmVhdGVGbGFncyBhbGxvY0ZsYWdzLCBjb25zdCB2b2lkKiBwVXNlckRhdGEpOworICAgICAgICBjb25zdCBjaGFyKiBHZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX1N0cjsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY2hhciBtX1B0clN0clsxN107CisgICAgICAgIGNvbnN0IGNoYXIqIG1fU3RyOworICAgIH07CisKKyAgICBib29sIG1fVXNlTXV0ZXg7CisgICAgVm1hUmVjb3JkRmxhZ3MgbV9GbGFnczsKKyAgICBGSUxFKiBtX0ZpbGU7CisgICAgVk1BX01VVEVYIG1fRmlsZU11dGV4OworICAgIGludDY0X3QgbV9GcmVxOworICAgIGludDY0X3QgbV9TdGFydENvdW50ZXI7CisKKyAgICB2b2lkIEdldEJhc2ljUGFyYW1zKENhbGxQYXJhbXMmIG91dFBhcmFtcyk7CisKKyAgICAvLyBUIG11c3QgYmUgYSBwb2ludGVyIHR5cGUsIGUuZy4gVm1hQWxsb2NhdGlvbiwgVm1hUG9vbC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgUHJpbnRQb2ludGVyTGlzdCh1aW50NjRfdCBjb3VudCwgY29uc3QgVCogcEl0ZW1zKQorICAgIHsKKyAgICAgICAgaWYoY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYobV9GaWxlLCAiJXAiLCBwSXRlbXNbMF0pOworICAgICAgICAgICAgZm9yKHVpbnQ2NF90IGkgPSAxOyBpIDwgY291bnQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKG1fRmlsZSwgIiAlcCIsIHBJdGVtc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFByaW50UG9pbnRlckxpc3QodWludDY0X3QgY291bnQsIGNvbnN0IFZtYUFsbG9jYXRpb24qIHBJdGVtcyk7CisgICAgdm9pZCBGbHVzaCgpOworfTsKKworI2VuZGlmIC8vICNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKworLy8gTWFpbiBhbGxvY2F0b3Igb2JqZWN0Lgorc3RydWN0IFZtYUFsbG9jYXRvcl9UCit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hQWxsb2NhdG9yX1QpCitwdWJsaWM6CisgICAgYm9vbCBtX1VzZU11dGV4OworICAgIGJvb2wgbV9Vc2VLaHJEZWRpY2F0ZWRBbGxvY2F0aW9uOworICAgIFZrRGV2aWNlIG1faERldmljZTsKKyAgICBib29sIG1fQWxsb2NhdGlvbkNhbGxiYWNrc1NwZWNpZmllZDsKKyAgICBWa0FsbG9jYXRpb25DYWxsYmFja3MgbV9BbGxvY2F0aW9uQ2FsbGJhY2tzOworICAgIFZtYURldmljZU1lbW9yeUNhbGxiYWNrcyBtX0RldmljZU1lbW9yeUNhbGxiYWNrczsKKyAgICAKKyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgZnJlZSBvdXQgb2YgbGltaXQsIG9yIFZLX1dIT0xFX1NJWkUgaWYgbm8gbGltaXQgZm9yIHRoYXQgaGVhcC4KKyAgICBWa0RldmljZVNpemUgbV9IZWFwU2l6ZUxpbWl0W1ZLX01BWF9NRU1PUllfSEVBUFNdOworICAgIFZNQV9NVVRFWCBtX0hlYXBTaXplTGltaXRNdXRleDsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIG1fUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzOworICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIG1fTWVtUHJvcHM7CisKKyAgICAvLyBEZWZhdWx0IHBvb2xzLgorICAgIFZtYUJsb2NrVmVjdG9yKiBtX3BCbG9ja1ZlY3RvcnNbVktfTUFYX01FTU9SWV9UWVBFU107CisKKyAgICAvLyBFYWNoIHZlY3RvciBpcyBzb3J0ZWQgYnkgbWVtb3J5IChoYW5kbGUgdmFsdWUpLgorICAgIHR5cGVkZWYgVm1hVmVjdG9yPCBWbWFBbGxvY2F0aW9uLCBWbWFTdGxBbGxvY2F0b3I8Vm1hQWxsb2NhdGlvbj4gPiBBbGxvY2F0aW9uVmVjdG9yVHlwZTsKKyAgICBBbGxvY2F0aW9uVmVjdG9yVHlwZSogbV9wRGVkaWNhdGVkQWxsb2NhdGlvbnNbVktfTUFYX01FTU9SWV9UWVBFU107CisgICAgVk1BX1JXX01VVEVYIG1fRGVkaWNhdGVkQWxsb2NhdGlvbnNNdXRleFtWS19NQVhfTUVNT1JZX1RZUEVTXTsKKworICAgIFZtYUFsbG9jYXRvcl9UKGNvbnN0IFZtYUFsbG9jYXRvckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvKTsKKyAgICBWa1Jlc3VsdCBJbml0KGNvbnN0IFZtYUFsbG9jYXRvckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvKTsKKyAgICB+Vm1hQWxsb2NhdG9yX1QoKTsKKworICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogR2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9BbGxvY2F0aW9uQ2FsbGJhY2tzU3BlY2lmaWVkID8gJm1fQWxsb2NhdGlvbkNhbGxiYWNrcyA6IDA7CisgICAgfQorICAgIGNvbnN0IFZtYVZ1bGthbkZ1bmN0aW9ucyYgR2V0VnVsa2FuRnVuY3Rpb25zKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX1Z1bGthbkZ1bmN0aW9uczsKKyAgICB9CisKKyAgICBWa0RldmljZVNpemUgR2V0QnVmZmVySW1hZ2VHcmFudWxhcml0eSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gVk1BX01BWCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oVk1BX0RFQlVHX01JTl9CVUZGRVJfSU1BR0VfR1JBTlVMQVJJVFkpLAorICAgICAgICAgICAgbV9QaHlzaWNhbERldmljZVByb3BlcnRpZXMubGltaXRzLmJ1ZmZlckltYWdlR3JhbnVsYXJpdHkpOworICAgIH0KKworICAgIHVpbnQzMl90IEdldE1lbW9yeUhlYXBDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fTWVtUHJvcHMubWVtb3J5SGVhcENvdW50OyB9CisgICAgdWludDMyX3QgR2V0TWVtb3J5VHlwZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9NZW1Qcm9wcy5tZW1vcnlUeXBlQ291bnQ7IH0KKworICAgIHVpbnQzMl90IE1lbW9yeVR5cGVJbmRleFRvSGVhcEluZGV4KHVpbnQzMl90IG1lbVR5cGVJbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQobWVtVHlwZUluZGV4IDwgbV9NZW1Qcm9wcy5tZW1vcnlUeXBlQ291bnQpOworICAgICAgICByZXR1cm4gbV9NZW1Qcm9wcy5tZW1vcnlUeXBlc1ttZW1UeXBlSW5kZXhdLmhlYXBJbmRleDsKKyAgICB9CisgICAgLy8gVHJ1ZSB3aGVuIHNwZWNpZmljIG1lbW9yeSB0eXBlIGlzIEhPU1RfVklTSUJMRSBidXQgbm90IEhPU1RfQ09IRVJFTlQuCisgICAgYm9vbCBJc01lbW9yeVR5cGVOb25Db2hlcmVudCh1aW50MzJfdCBtZW1UeXBlSW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKG1fTWVtUHJvcHMubWVtb3J5VHlwZXNbbWVtVHlwZUluZGV4XS5wcm9wZXJ0eUZsYWdzICYgKFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUKSkgPT0KKyAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUOworICAgIH0KKyAgICAvLyBNaW5pbXVtIGFsaWdubWVudCBmb3IgYWxsIGFsbG9jYXRpb25zIGluIHNwZWNpZmljIG1lbW9yeSB0eXBlLgorICAgIFZrRGV2aWNlU2l6ZSBHZXRNZW1vcnlUeXBlTWluQWxpZ25tZW50KHVpbnQzMl90IG1lbVR5cGVJbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBJc01lbW9yeVR5cGVOb25Db2hlcmVudChtZW1UeXBlSW5kZXgpID8KKyAgICAgICAgICAgIFZNQV9NQVgoKFZrRGV2aWNlU2l6ZSlWTUFfREVCVUdfQUxJR05NRU5ULCBtX1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcy5saW1pdHMubm9uQ29oZXJlbnRBdG9tU2l6ZSkgOgorICAgICAgICAgICAgKFZrRGV2aWNlU2l6ZSlWTUFfREVCVUdfQUxJR05NRU5UOworICAgIH0KKworICAgIGJvb2wgSXNJbnRlZ3JhdGVkR3B1KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcy5kZXZpY2VUeXBlID09IFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0lOVEVHUkFURURfR1BVOworICAgIH0KKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIFZtYVJlY29yZGVyKiBHZXRSZWNvcmRlcigpIGNvbnN0IHsgcmV0dXJuIG1fcFJlY29yZGVyOyB9CisjZW5kaWYKKworICAgIHZvaWQgR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgICAgICBWa0J1ZmZlciBoQnVmZmVyLAorICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyYgbWVtUmVxLAorICAgICAgICBib29sJiByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgICAgIGJvb2wmIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uKSBjb25zdDsKKyAgICB2b2lkIEdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgICAgICBWa0ltYWdlIGhJbWFnZSwKKyAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMmIG1lbVJlcSwKKyAgICAgICAgYm9vbCYgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICBib29sJiBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbikgY29uc3Q7CisKKyAgICAvLyBNYWluIGFsbG9jYXRpb24gZnVuY3Rpb24uCisgICAgVmtSZXN1bHQgQWxsb2NhdGVNZW1vcnkoCisgICAgICAgIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzJiB2a01lbVJlcSwKKyAgICAgICAgYm9vbCByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgICAgIGJvb2wgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgICAgIFZrQnVmZmVyIGRlZGljYXRlZEJ1ZmZlciwKKyAgICAgICAgVmtJbWFnZSBkZWRpY2F0ZWRJbWFnZSwKKyAgICAgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8mIGNyZWF0ZUluZm8sCisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKTsKKworICAgIC8vIE1haW4gZGVhbGxvY2F0aW9uIGZ1bmN0aW9uLgorICAgIHZvaWQgRnJlZU1lbW9yeSgKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgY29uc3QgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKTsKKworICAgIFZrUmVzdWx0IFJlc2l6ZUFsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb24gYWxsb2MsCisgICAgICAgIFZrRGV2aWNlU2l6ZSBuZXdTaXplKTsKKworICAgIHZvaWQgQ2FsY3VsYXRlU3RhdHMoVm1hU3RhdHMqIHBTdGF0cyk7CisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKyAgICB2b2lkIFByaW50RGV0YWlsZWRNYXAoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbik7CisjZW5kaWYKKworICAgIFZrUmVzdWx0IERlZnJhZ21lbnRhdGlvbkJlZ2luKAorICAgICAgICBjb25zdCBWbWFEZWZyYWdtZW50YXRpb25JbmZvMiYgaW5mbywKKyAgICAgICAgVm1hRGVmcmFnbWVudGF0aW9uU3RhdHMqIHBTdGF0cywKKyAgICAgICAgVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dCogcENvbnRleHQpOworICAgIFZrUmVzdWx0IERlZnJhZ21lbnRhdGlvbkVuZCgKKyAgICAgICAgVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dCBjb250ZXh0KTsKKworICAgIHZvaWQgR2V0QWxsb2NhdGlvbkluZm8oVm1hQWxsb2NhdGlvbiBoQWxsb2NhdGlvbiwgVm1hQWxsb2NhdGlvbkluZm8qIHBBbGxvY2F0aW9uSW5mbyk7CisgICAgYm9vbCBUb3VjaEFsbG9jYXRpb24oVm1hQWxsb2NhdGlvbiBoQWxsb2NhdGlvbik7CisKKyAgICBWa1Jlc3VsdCBDcmVhdGVQb29sKGNvbnN0IFZtYVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVm1hUG9vbCogcFBvb2wpOworICAgIHZvaWQgRGVzdHJveVBvb2woVm1hUG9vbCBwb29sKTsKKyAgICB2b2lkIEdldFBvb2xTdGF0cyhWbWFQb29sIHBvb2wsIFZtYVBvb2xTdGF0cyogcFBvb2xTdGF0cyk7CisKKyAgICB2b2lkIFNldEN1cnJlbnRGcmFtZUluZGV4KHVpbnQzMl90IGZyYW1lSW5kZXgpOworICAgIHVpbnQzMl90IEdldEN1cnJlbnRGcmFtZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9DdXJyZW50RnJhbWVJbmRleC5sb2FkKCk7IH0KKworICAgIHZvaWQgTWFrZVBvb2xBbGxvY2F0aW9uc0xvc3QoCisgICAgICAgIFZtYVBvb2wgaFBvb2wsCisgICAgICAgIHNpemVfdCogcExvc3RBbGxvY2F0aW9uQ291bnQpOworICAgIFZrUmVzdWx0IENoZWNrUG9vbENvcnJ1cHRpb24oVm1hUG9vbCBoUG9vbCk7CisgICAgVmtSZXN1bHQgQ2hlY2tDb3JydXB0aW9uKHVpbnQzMl90IG1lbW9yeVR5cGVCaXRzKTsKKworICAgIHZvaWQgQ3JlYXRlTG9zdEFsbG9jYXRpb24oVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24pOworCisgICAgVmtSZXN1bHQgQWxsb2NhdGVWdWxrYW5NZW1vcnkoY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sIFZrRGV2aWNlTWVtb3J5KiBwTWVtb3J5KTsKKyAgICB2b2lkIEZyZWVWdWxrYW5NZW1vcnkodWludDMyX3QgbWVtb3J5VHlwZSwgVmtEZXZpY2VTaXplIHNpemUsIFZrRGV2aWNlTWVtb3J5IGhNZW1vcnkpOworCisgICAgVmtSZXN1bHQgTWFwKFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sIHZvaWQqKiBwcERhdGEpOworICAgIHZvaWQgVW5tYXAoVm1hQWxsb2NhdGlvbiBoQWxsb2NhdGlvbik7CisKKyAgICBWa1Jlc3VsdCBCaW5kQnVmZmVyTWVtb3J5KFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sIFZrQnVmZmVyIGhCdWZmZXIpOworICAgIFZrUmVzdWx0IEJpbmRJbWFnZU1lbW9yeShWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uLCBWa0ltYWdlIGhJbWFnZSk7CisKKyAgICB2b2lkIEZsdXNoT3JJbnZhbGlkYXRlQWxsb2NhdGlvbigKKyAgICAgICAgVm1hQWxsb2NhdGlvbiBoQWxsb2NhdGlvbiwKKyAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsCisgICAgICAgIFZNQV9DQUNIRV9PUEVSQVRJT04gb3ApOworCisgICAgdm9pZCBGaWxsQWxsb2NhdGlvbihjb25zdCBWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uLCB1aW50OF90IHBhdHRlcm4pOworCitwcml2YXRlOgorICAgIFZrRGV2aWNlU2l6ZSBtX1ByZWZlcnJlZExhcmdlSGVhcEJsb2NrU2l6ZTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2UgbV9QaHlzaWNhbERldmljZTsKKyAgICBWTUFfQVRPTUlDX1VJTlQzMiBtX0N1cnJlbnRGcmFtZUluZGV4OworICAgIAorICAgIFZNQV9SV19NVVRFWCBtX1Bvb2xzTXV0ZXg7CisgICAgLy8gUHJvdGVjdGVkIGJ5IG1fUG9vbHNNdXRleC4gU29ydGVkIGJ5IHBvaW50ZXIgdmFsdWUuCisgICAgVm1hVmVjdG9yPFZtYVBvb2wsIFZtYVN0bEFsbG9jYXRvcjxWbWFQb29sPiA+IG1fUG9vbHM7CisgICAgdWludDMyX3QgbV9OZXh0UG9vbElkOworCisgICAgVm1hVnVsa2FuRnVuY3Rpb25zIG1fVnVsa2FuRnVuY3Rpb25zOworCisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisgICAgVm1hUmVjb3JkZXIqIG1fcFJlY29yZGVyOworI2VuZGlmCisKKyAgICB2b2lkIEltcG9ydFZ1bGthbkZ1bmN0aW9ucyhjb25zdCBWbWFWdWxrYW5GdW5jdGlvbnMqIHBWdWxrYW5GdW5jdGlvbnMpOworCisgICAgVmtEZXZpY2VTaXplIENhbGNQcmVmZXJyZWRCbG9ja1NpemUodWludDMyX3QgbWVtVHlwZUluZGV4KTsKKworICAgIFZrUmVzdWx0IEFsbG9jYXRlTWVtb3J5T2ZUeXBlKAorICAgICAgICBWa0RldmljZVNpemUgc2l6ZSwKKyAgICAgICAgVmtEZXZpY2VTaXplIGFsaWdubWVudCwKKyAgICAgICAgYm9vbCBkZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICBWa0J1ZmZlciBkZWRpY2F0ZWRCdWZmZXIsCisgICAgICAgIFZrSW1hZ2UgZGVkaWNhdGVkSW1hZ2UsCisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBjcmVhdGVJbmZvLAorICAgICAgICB1aW50MzJfdCBtZW1UeXBlSW5kZXgsCisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKTsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiBvbmx5IHRvIGJlIHVzZWQgaW5zaWRlIEFsbG9jYXRlRGVkaWNhdGVkTWVtb3J5LgorICAgIFZrUmVzdWx0IEFsbG9jYXRlRGVkaWNhdGVkTWVtb3J5UGFnZSgKKyAgICAgICAgVmtEZXZpY2VTaXplIHNpemUsCisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgdWludDMyX3QgbWVtVHlwZUluZGV4LAorICAgICAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyYgYWxsb2NJbmZvLAorICAgICAgICBib29sIG1hcCwKKyAgICAgICAgYm9vbCBpc1VzZXJEYXRhU3RyaW5nLAorICAgICAgICB2b2lkKiBwVXNlckRhdGEsCisgICAgICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9uKTsKKworICAgIC8vIEFsbG9jYXRlcyBhbmQgcmVnaXN0ZXJzIG5ldyBWa0RldmljZU1lbW9yeSBzcGVjaWZpY2FsbHkgZm9yIGRlZGljYXRlZCBhbGxvY2F0aW9ucy4KKyAgICBWa1Jlc3VsdCBBbGxvY2F0ZURlZGljYXRlZE1lbW9yeSgKKyAgICAgICAgVmtEZXZpY2VTaXplIHNpemUsCisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgdWludDMyX3QgbWVtVHlwZUluZGV4LAorICAgICAgICBib29sIG1hcCwKKyAgICAgICAgYm9vbCBpc1VzZXJEYXRhU3RyaW5nLAorICAgICAgICB2b2lkKiBwVXNlckRhdGEsCisgICAgICAgIFZrQnVmZmVyIGRlZGljYXRlZEJ1ZmZlciwKKyAgICAgICAgVmtJbWFnZSBkZWRpY2F0ZWRJbWFnZSwKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKTsKKworICAgIC8vIFRyaWVzIHRvIGZyZWUgcE1lbW9yeSBhcyBEZWRpY2F0ZWQgTWVtb3J5LiBSZXR1cm5zIHRydWUgaWYgZm91bmQgYW5kIGZyZWVkLgorICAgIHZvaWQgRnJlZURlZGljYXRlZE1lbW9yeShWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1lbW9yeSBhbGxvY2F0aW9uICMyIGFmdGVyIFZtYUFsbG9jYXRvcl9UIGRlZmluaXRpb24KKworc3RhdGljIHZvaWQqIFZtYU1hbGxvYyhWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQpCit7CisgICAgcmV0dXJuIFZtYU1hbGxvYygmaEFsbG9jYXRvci0+bV9BbGxvY2F0aW9uQ2FsbGJhY2tzLCBzaXplLCBhbGlnbm1lbnQpOworfQorCitzdGF0aWMgdm9pZCBWbWFGcmVlKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLCB2b2lkKiBwdHIpCit7CisgICAgVm1hRnJlZSgmaEFsbG9jYXRvci0+bV9BbGxvY2F0aW9uQ2FsbGJhY2tzLCBwdHIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIFQqIFZtYUFsbG9jYXRlKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yKQoreworICAgIHJldHVybiAoVCopVm1hTWFsbG9jKGhBbGxvY2F0b3IsIHNpemVvZihUKSwgVk1BX0FMSUdOX09GKFQpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBUKiBWbWFBbGxvY2F0ZUFycmF5KFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLCBzaXplX3QgY291bnQpCit7CisgICAgcmV0dXJuIChUKilWbWFNYWxsb2MoaEFsbG9jYXRvciwgc2l6ZW9mKFQpICogY291bnQsIFZNQV9BTElHTl9PRihUKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCB2bWFfZGVsZXRlKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLCBUKiBwdHIpCit7CisgICAgaWYocHRyICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgcHRyLT5+VCgpOworICAgICAgICBWbWFGcmVlKGhBbGxvY2F0b3IsIHB0cik7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgdm1hX2RlbGV0ZV9hcnJheShWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwgVCogcHRyLCBzaXplX3QgY291bnQpCit7CisgICAgaWYocHRyICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgZm9yKHNpemVfdCBpID0gY291bnQ7IGktLTsgKQorICAgICAgICAgICAgcHRyW2ldLn5UKCk7CisgICAgICAgIFZtYUZyZWUoaEFsbG9jYXRvciwgcHRyKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWbWFTdHJpbmdCdWlsZGVyCisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworY2xhc3MgVm1hU3RyaW5nQnVpbGRlcgoreworcHVibGljOgorICAgIFZtYVN0cmluZ0J1aWxkZXIoVm1hQWxsb2NhdG9yIGFsbG9jKSA6IG1fRGF0YShWbWFTdGxBbGxvY2F0b3I8Y2hhcj4oYWxsb2MtPkdldEFsbG9jYXRpb25DYWxsYmFja3MoKSkpIHsgfQorICAgIHNpemVfdCBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX0RhdGEuc2l6ZSgpOyB9CisgICAgY29uc3QgY2hhciogR2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fRGF0YS5kYXRhKCk7IH0KKworICAgIHZvaWQgQWRkKGNoYXIgY2gpIHsgbV9EYXRhLnB1c2hfYmFjayhjaCk7IH0KKyAgICB2b2lkIEFkZChjb25zdCBjaGFyKiBwU3RyKTsKKyAgICB2b2lkIEFkZE5ld0xpbmUoKSB7IEFkZCgnXG4nKTsgfQorICAgIHZvaWQgQWRkTnVtYmVyKHVpbnQzMl90IG51bSk7CisgICAgdm9pZCBBZGROdW1iZXIodWludDY0X3QgbnVtKTsKKyAgICB2b2lkIEFkZFBvaW50ZXIoY29uc3Qgdm9pZCogcHRyKTsKKworcHJpdmF0ZToKKyAgICBWbWFWZWN0b3I8IGNoYXIsIFZtYVN0bEFsbG9jYXRvcjxjaGFyPiA+IG1fRGF0YTsKK307CisKK3ZvaWQgVm1hU3RyaW5nQnVpbGRlcjo6QWRkKGNvbnN0IGNoYXIqIHBTdHIpCit7CisgICAgY29uc3Qgc2l6ZV90IHN0ckxlbiA9IHN0cmxlbihwU3RyKTsKKyAgICBpZihzdHJMZW4gPiAwKQorICAgIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG9sZENvdW50ID0gbV9EYXRhLnNpemUoKTsKKyAgICAgICAgbV9EYXRhLnJlc2l6ZShvbGRDb3VudCArIHN0ckxlbik7CisgICAgICAgIG1lbWNweShtX0RhdGEuZGF0YSgpICsgb2xkQ291bnQsIHBTdHIsIHN0ckxlbik7CisgICAgfQorfQorCit2b2lkIFZtYVN0cmluZ0J1aWxkZXI6OkFkZE51bWJlcih1aW50MzJfdCBudW0pCit7CisgICAgY2hhciBidWZbMTFdOworICAgIFZtYVVpbnQzMlRvU3RyKGJ1Ziwgc2l6ZW9mKGJ1ZiksIG51bSk7CisgICAgQWRkKGJ1Zik7Cit9CisKK3ZvaWQgVm1hU3RyaW5nQnVpbGRlcjo6QWRkTnVtYmVyKHVpbnQ2NF90IG51bSkKK3sKKyAgICBjaGFyIGJ1ZlsyMV07CisgICAgVm1hVWludDY0VG9TdHIoYnVmLCBzaXplb2YoYnVmKSwgbnVtKTsKKyAgICBBZGQoYnVmKTsKK30KKwordm9pZCBWbWFTdHJpbmdCdWlsZGVyOjpBZGRQb2ludGVyKGNvbnN0IHZvaWQqIHB0cikKK3sKKyAgICBjaGFyIGJ1ZlsyMV07CisgICAgVm1hUHRyVG9TdHIoYnVmLCBzaXplb2YoYnVmKSwgcHRyKTsKKyAgICBBZGQoYnVmKTsKK30KKworI2VuZGlmIC8vICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZtYUpzb25Xcml0ZXIKKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorCitjbGFzcyBWbWFKc29uV3JpdGVyCit7CisgICAgVk1BX0NMQVNTX05PX0NPUFkoVm1hSnNvbldyaXRlcikKK3B1YmxpYzoKKyAgICBWbWFKc29uV3JpdGVyKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRpb25DYWxsYmFja3MsIFZtYVN0cmluZ0J1aWxkZXImIHNiKTsKKyAgICB+Vm1hSnNvbldyaXRlcigpOworCisgICAgdm9pZCBCZWdpbk9iamVjdChib29sIHNpbmdsZUxpbmUgPSBmYWxzZSk7CisgICAgdm9pZCBFbmRPYmplY3QoKTsKKyAgICAKKyAgICB2b2lkIEJlZ2luQXJyYXkoYm9vbCBzaW5nbGVMaW5lID0gZmFsc2UpOworICAgIHZvaWQgRW5kQXJyYXkoKTsKKyAgICAKKyAgICB2b2lkIFdyaXRlU3RyaW5nKGNvbnN0IGNoYXIqIHBTdHIpOworICAgIHZvaWQgQmVnaW5TdHJpbmcoY29uc3QgY2hhciogcFN0ciA9IFZNQV9OVUxMKTsKKyAgICB2b2lkIENvbnRpbnVlU3RyaW5nKGNvbnN0IGNoYXIqIHBTdHIpOworICAgIHZvaWQgQ29udGludWVTdHJpbmcodWludDMyX3Qgbik7CisgICAgdm9pZCBDb250aW51ZVN0cmluZyh1aW50NjRfdCBuKTsKKyAgICB2b2lkIENvbnRpbnVlU3RyaW5nX1BvaW50ZXIoY29uc3Qgdm9pZCogcHRyKTsKKyAgICB2b2lkIEVuZFN0cmluZyhjb25zdCBjaGFyKiBwU3RyID0gVk1BX05VTEwpOworICAgIAorICAgIHZvaWQgV3JpdGVOdW1iZXIodWludDMyX3Qgbik7CisgICAgdm9pZCBXcml0ZU51bWJlcih1aW50NjRfdCBuKTsKKyAgICB2b2lkIFdyaXRlQm9vbChib29sIGIpOworICAgIHZvaWQgV3JpdGVOdWxsKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IElOREVOVDsKKworICAgIGVudW0gQ09MTEVDVElPTl9UWVBFCisgICAgeworICAgICAgICBDT0xMRUNUSU9OX1RZUEVfT0JKRUNULAorICAgICAgICBDT0xMRUNUSU9OX1RZUEVfQVJSQVksCisgICAgfTsKKyAgICBzdHJ1Y3QgU3RhY2tJdGVtCisgICAgeworICAgICAgICBDT0xMRUNUSU9OX1RZUEUgdHlwZTsKKyAgICAgICAgdWludDMyX3QgdmFsdWVDb3VudDsKKyAgICAgICAgYm9vbCBzaW5nbGVMaW5lTW9kZTsKKyAgICB9OworCisgICAgVm1hU3RyaW5nQnVpbGRlciYgbV9TQjsKKyAgICBWbWFWZWN0b3I8IFN0YWNrSXRlbSwgVm1hU3RsQWxsb2NhdG9yPFN0YWNrSXRlbT4gPiBtX1N0YWNrOworICAgIGJvb2wgbV9JbnNpZGVTdHJpbmc7CisKKyAgICB2b2lkIEJlZ2luVmFsdWUoYm9vbCBpc1N0cmluZyk7CisgICAgdm9pZCBXcml0ZUluZGVudChib29sIG9uZUxlc3MgPSBmYWxzZSk7Cit9OworCitjb25zdCBjaGFyKiBjb25zdCBWbWFKc29uV3JpdGVyOjpJTkRFTlQgPSAiICAiOworCitWbWFKc29uV3JpdGVyOjpWbWFKc29uV3JpdGVyKGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRpb25DYWxsYmFja3MsIFZtYVN0cmluZ0J1aWxkZXImIHNiKSA6CisgICAgbV9TQihzYiksCisgICAgbV9TdGFjayhWbWFTdGxBbGxvY2F0b3I8U3RhY2tJdGVtPihwQWxsb2NhdGlvbkNhbGxiYWNrcykpLAorICAgIG1fSW5zaWRlU3RyaW5nKGZhbHNlKQoreworfQorCitWbWFKc29uV3JpdGVyOjp+Vm1hSnNvbldyaXRlcigpCit7CisgICAgVk1BX0FTU0VSVCghbV9JbnNpZGVTdHJpbmcpOworICAgIFZNQV9BU1NFUlQobV9TdGFjay5lbXB0eSgpKTsKK30KKwordm9pZCBWbWFKc29uV3JpdGVyOjpCZWdpbk9iamVjdChib29sIHNpbmdsZUxpbmUpCit7CisgICAgVk1BX0FTU0VSVCghbV9JbnNpZGVTdHJpbmcpOworCisgICAgQmVnaW5WYWx1ZShmYWxzZSk7CisgICAgbV9TQi5BZGQoJ3snKTsKKworICAgIFN0YWNrSXRlbSBpdGVtOworICAgIGl0ZW0udHlwZSA9IENPTExFQ1RJT05fVFlQRV9PQkpFQ1Q7CisgICAgaXRlbS52YWx1ZUNvdW50ID0gMDsKKyAgICBpdGVtLnNpbmdsZUxpbmVNb2RlID0gc2luZ2xlTGluZTsKKyAgICBtX1N0YWNrLnB1c2hfYmFjayhpdGVtKTsKK30KKwordm9pZCBWbWFKc29uV3JpdGVyOjpFbmRPYmplY3QoKQoreworICAgIFZNQV9BU1NFUlQoIW1fSW5zaWRlU3RyaW5nKTsKKworICAgIFdyaXRlSW5kZW50KHRydWUpOworICAgIG1fU0IuQWRkKCd9Jyk7CisKKyAgICBWTUFfQVNTRVJUKCFtX1N0YWNrLmVtcHR5KCkgJiYgbV9TdGFjay5iYWNrKCkudHlwZSA9PSBDT0xMRUNUSU9OX1RZUEVfT0JKRUNUKTsKKyAgICBtX1N0YWNrLnBvcF9iYWNrKCk7Cit9CisKK3ZvaWQgVm1hSnNvbldyaXRlcjo6QmVnaW5BcnJheShib29sIHNpbmdsZUxpbmUpCit7CisgICAgVk1BX0FTU0VSVCghbV9JbnNpZGVTdHJpbmcpOworCisgICAgQmVnaW5WYWx1ZShmYWxzZSk7CisgICAgbV9TQi5BZGQoJ1snKTsKKworICAgIFN0YWNrSXRlbSBpdGVtOworICAgIGl0ZW0udHlwZSA9IENPTExFQ1RJT05fVFlQRV9BUlJBWTsKKyAgICBpdGVtLnZhbHVlQ291bnQgPSAwOworICAgIGl0ZW0uc2luZ2xlTGluZU1vZGUgPSBzaW5nbGVMaW5lOworICAgIG1fU3RhY2sucHVzaF9iYWNrKGl0ZW0pOworfQorCit2b2lkIFZtYUpzb25Xcml0ZXI6OkVuZEFycmF5KCkKK3sKKyAgICBWTUFfQVNTRVJUKCFtX0luc2lkZVN0cmluZyk7CisKKyAgICBXcml0ZUluZGVudCh0cnVlKTsKKyAgICBtX1NCLkFkZCgnXScpOworCisgICAgVk1BX0FTU0VSVCghbV9TdGFjay5lbXB0eSgpICYmIG1fU3RhY2suYmFjaygpLnR5cGUgPT0gQ09MTEVDVElPTl9UWVBFX0FSUkFZKTsKKyAgICBtX1N0YWNrLnBvcF9iYWNrKCk7Cit9CisKK3ZvaWQgVm1hSnNvbldyaXRlcjo6V3JpdGVTdHJpbmcoY29uc3QgY2hhciogcFN0cikKK3sKKyAgICBCZWdpblN0cmluZyhwU3RyKTsKKyAgICBFbmRTdHJpbmcoKTsKK30KKwordm9pZCBWbWFKc29uV3JpdGVyOjpCZWdpblN0cmluZyhjb25zdCBjaGFyKiBwU3RyKQoreworICAgIFZNQV9BU1NFUlQoIW1fSW5zaWRlU3RyaW5nKTsKKworICAgIEJlZ2luVmFsdWUodHJ1ZSk7CisgICAgbV9TQi5BZGQoJyInKTsKKyAgICBtX0luc2lkZVN0cmluZyA9IHRydWU7CisgICAgaWYocFN0ciAhPSBWTUFfTlVMTCAmJiBwU3RyWzBdICE9ICdcMCcpCisgICAgeworICAgICAgICBDb250aW51ZVN0cmluZyhwU3RyKTsKKyAgICB9Cit9CisKK3ZvaWQgVm1hSnNvbldyaXRlcjo6Q29udGludWVTdHJpbmcoY29uc3QgY2hhciogcFN0cikKK3sKKyAgICBWTUFfQVNTRVJUKG1fSW5zaWRlU3RyaW5nKTsKKworICAgIGNvbnN0IHNpemVfdCBzdHJMZW4gPSBzdHJsZW4ocFN0cik7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHN0ckxlbjsgKytpKQorICAgIHsKKyAgICAgICAgY2hhciBjaCA9IHBTdHJbaV07CisgICAgICAgIGlmKGNoID09ICdcXCcpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fU0IuQWRkKCJcXFxcIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihjaCA9PSAnIicpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fU0IuQWRkKCJcXFwiIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihjaCA+PSAzMikKKyAgICAgICAgeworICAgICAgICAgICAgbV9TQi5BZGQoY2gpOworICAgICAgICB9CisgICAgICAgIGVsc2Ugc3dpdGNoKGNoKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgIG1fU0IuQWRkKCJcXGIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICBtX1NCLkFkZCgiXFxmIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgbV9TQi5BZGQoIlxcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgIG1fU0IuQWRkKCJcXHIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICBtX1NCLkFkZCgiXFx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiQ2hhcmFjdGVyIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVm1hSnNvbldyaXRlcjo6Q29udGludWVTdHJpbmcodWludDMyX3QgbikKK3sKKyAgICBWTUFfQVNTRVJUKG1fSW5zaWRlU3RyaW5nKTsKKyAgICBtX1NCLkFkZE51bWJlcihuKTsKK30KKwordm9pZCBWbWFKc29uV3JpdGVyOjpDb250aW51ZVN0cmluZyh1aW50NjRfdCBuKQoreworICAgIFZNQV9BU1NFUlQobV9JbnNpZGVTdHJpbmcpOworICAgIG1fU0IuQWRkTnVtYmVyKG4pOworfQorCit2b2lkIFZtYUpzb25Xcml0ZXI6OkNvbnRpbnVlU3RyaW5nX1BvaW50ZXIoY29uc3Qgdm9pZCogcHRyKQoreworICAgIFZNQV9BU1NFUlQobV9JbnNpZGVTdHJpbmcpOworICAgIG1fU0IuQWRkUG9pbnRlcihwdHIpOworfQorCit2b2lkIFZtYUpzb25Xcml0ZXI6OkVuZFN0cmluZyhjb25zdCBjaGFyKiBwU3RyKQoreworICAgIFZNQV9BU1NFUlQobV9JbnNpZGVTdHJpbmcpOworICAgIGlmKHBTdHIgIT0gVk1BX05VTEwgJiYgcFN0clswXSAhPSAnXDAnKQorICAgIHsKKyAgICAgICAgQ29udGludWVTdHJpbmcocFN0cik7CisgICAgfQorICAgIG1fU0IuQWRkKCciJyk7CisgICAgbV9JbnNpZGVTdHJpbmcgPSBmYWxzZTsKK30KKwordm9pZCBWbWFKc29uV3JpdGVyOjpXcml0ZU51bWJlcih1aW50MzJfdCBuKQoreworICAgIFZNQV9BU1NFUlQoIW1fSW5zaWRlU3RyaW5nKTsKKyAgICBCZWdpblZhbHVlKGZhbHNlKTsKKyAgICBtX1NCLkFkZE51bWJlcihuKTsKK30KKwordm9pZCBWbWFKc29uV3JpdGVyOjpXcml0ZU51bWJlcih1aW50NjRfdCBuKQoreworICAgIFZNQV9BU1NFUlQoIW1fSW5zaWRlU3RyaW5nKTsKKyAgICBCZWdpblZhbHVlKGZhbHNlKTsKKyAgICBtX1NCLkFkZE51bWJlcihuKTsKK30KKwordm9pZCBWbWFKc29uV3JpdGVyOjpXcml0ZUJvb2woYm9vbCBiKQoreworICAgIFZNQV9BU1NFUlQoIW1fSW5zaWRlU3RyaW5nKTsKKyAgICBCZWdpblZhbHVlKGZhbHNlKTsKKyAgICBtX1NCLkFkZChiID8gInRydWUiIDogImZhbHNlIik7Cit9CisKK3ZvaWQgVm1hSnNvbldyaXRlcjo6V3JpdGVOdWxsKCkKK3sKKyAgICBWTUFfQVNTRVJUKCFtX0luc2lkZVN0cmluZyk7CisgICAgQmVnaW5WYWx1ZShmYWxzZSk7CisgICAgbV9TQi5BZGQoIm51bGwiKTsKK30KKwordm9pZCBWbWFKc29uV3JpdGVyOjpCZWdpblZhbHVlKGJvb2wgaXNTdHJpbmcpCit7CisgICAgaWYoIW1fU3RhY2suZW1wdHkoKSkKKyAgICB7CisgICAgICAgIFN0YWNrSXRlbSYgY3Vyckl0ZW0gPSBtX1N0YWNrLmJhY2soKTsKKyAgICAgICAgaWYoY3Vyckl0ZW0udHlwZSA9PSBDT0xMRUNUSU9OX1RZUEVfT0JKRUNUICYmCisgICAgICAgICAgICBjdXJySXRlbS52YWx1ZUNvdW50ICUgMiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBWTUFfQVNTRVJUKGlzU3RyaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN1cnJJdGVtLnR5cGUgPT0gQ09MTEVDVElPTl9UWVBFX09CSkVDVCAmJgorICAgICAgICAgICAgY3Vyckl0ZW0udmFsdWVDb3VudCAlIDIgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9TQi5BZGQoIjogIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihjdXJySXRlbS52YWx1ZUNvdW50ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9TQi5BZGQoIiwgIik7CisgICAgICAgICAgICBXcml0ZUluZGVudCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVJbmRlbnQoKTsKKyAgICAgICAgfQorICAgICAgICArK2N1cnJJdGVtLnZhbHVlQ291bnQ7CisgICAgfQorfQorCit2b2lkIFZtYUpzb25Xcml0ZXI6OldyaXRlSW5kZW50KGJvb2wgb25lTGVzcykKK3sKKyAgICBpZighbV9TdGFjay5lbXB0eSgpICYmICFtX1N0YWNrLmJhY2soKS5zaW5nbGVMaW5lTW9kZSkKKyAgICB7CisgICAgICAgIG1fU0IuQWRkTmV3TGluZSgpOworICAgICAgICAKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gbV9TdGFjay5zaXplKCk7CisgICAgICAgIGlmKGNvdW50ID4gMCAmJiBvbmVMZXNzKQorICAgICAgICB7CisgICAgICAgICAgICAtLWNvdW50OworICAgICAgICB9CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBtX1NCLkFkZChJTkRFTlQpOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYgLy8gI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFZtYUFsbG9jYXRpb25fVDo6U2V0VXNlckRhdGEoVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgICBpZihJc1VzZXJEYXRhU3RyaW5nKCkpCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKHBVc2VyRGF0YSA9PSBWTUFfTlVMTCB8fCBwVXNlckRhdGEgIT0gbV9wVXNlckRhdGEpOworCisgICAgICAgIEZyZWVVc2VyRGF0YVN0cmluZyhoQWxsb2NhdG9yKTsKKworICAgICAgICBpZihwVXNlckRhdGEgIT0gVk1BX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IG5ld1N0clNyYyA9IChjaGFyKilwVXNlckRhdGE7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgbmV3U3RyTGVuID0gc3RybGVuKG5ld1N0clNyYyk7CisgICAgICAgICAgICBjaGFyKiBjb25zdCBuZXdTdHJEc3QgPSB2bWFfbmV3X2FycmF5KGhBbGxvY2F0b3IsIGNoYXIsIG5ld1N0ckxlbiArIDEpOworICAgICAgICAgICAgbWVtY3B5KG5ld1N0ckRzdCwgbmV3U3RyU3JjLCBuZXdTdHJMZW4gKyAxKTsKKyAgICAgICAgICAgIG1fcFVzZXJEYXRhID0gbmV3U3RyRHN0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1fcFVzZXJEYXRhID0gcFVzZXJEYXRhOworICAgIH0KK30KKwordm9pZCBWbWFBbGxvY2F0aW9uX1Q6OkNoYW5nZUJsb2NrQWxsb2NhdGlvbigKKyAgICBWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwKKyAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogYmxvY2ssCisgICAgVmtEZXZpY2VTaXplIG9mZnNldCkKK3sKKyAgICBWTUFfQVNTRVJUKGJsb2NrICE9IFZNQV9OVUxMKTsKKyAgICBWTUFfQVNTRVJUKG1fVHlwZSA9PSBBTExPQ0FUSU9OX1RZUEVfQkxPQ0spOworCisgICAgLy8gTW92ZSBtYXBwaW5nIHJlZmVyZW5jZSBjb3VudGVyIGZyb20gb2xkIGJsb2NrIHRvIG5ldyBibG9jay4KKyAgICBpZihibG9jayAhPSBtX0Jsb2NrQWxsb2NhdGlvbi5tX0Jsb2NrKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgbWFwUmVmQ291bnQgPSBtX01hcENvdW50ICYgfk1BUF9DT1VOVF9GTEFHX1BFUlNJU1RFTlRfTUFQOworICAgICAgICBpZihJc1BlcnNpc3RlbnRNYXAoKSkKKyAgICAgICAgICAgICsrbWFwUmVmQ291bnQ7CisgICAgICAgIG1fQmxvY2tBbGxvY2F0aW9uLm1fQmxvY2stPlVubWFwKGhBbGxvY2F0b3IsIG1hcFJlZkNvdW50KTsKKyAgICAgICAgYmxvY2stPk1hcChoQWxsb2NhdG9yLCBtYXBSZWZDb3VudCwgVk1BX05VTEwpOworICAgIH0KKworICAgIG1fQmxvY2tBbGxvY2F0aW9uLm1fQmxvY2sgPSBibG9jazsKKyAgICBtX0Jsb2NrQWxsb2NhdGlvbi5tX09mZnNldCA9IG9mZnNldDsKK30KKwordm9pZCBWbWFBbGxvY2F0aW9uX1Q6OkNoYW5nZVNpemUoVmtEZXZpY2VTaXplIG5ld1NpemUpCit7CisgICAgVk1BX0FTU0VSVChuZXdTaXplID4gMCk7CisgICAgbV9TaXplID0gbmV3U2l6ZTsKK30KKwordm9pZCBWbWFBbGxvY2F0aW9uX1Q6OkNoYW5nZU9mZnNldChWa0RldmljZVNpemUgbmV3T2Zmc2V0KQoreworICAgIFZNQV9BU1NFUlQobV9UeXBlID09IEFMTE9DQVRJT05fVFlQRV9CTE9DSyk7CisgICAgbV9CbG9ja0FsbG9jYXRpb24ubV9PZmZzZXQgPSBuZXdPZmZzZXQ7Cit9CisKK1ZrRGV2aWNlU2l6ZSBWbWFBbGxvY2F0aW9uX1Q6OkdldE9mZnNldCgpIGNvbnN0Cit7CisgICAgc3dpdGNoKG1fVHlwZSkKKyAgICB7CisgICAgY2FzZSBBTExPQ0FUSU9OX1RZUEVfQkxPQ0s6CisgICAgICAgIHJldHVybiBtX0Jsb2NrQWxsb2NhdGlvbi5tX09mZnNldDsKKyAgICBjYXNlIEFMTE9DQVRJT05fVFlQRV9ERURJQ0FURUQ6CisgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIFZNQV9BU1NFUlQoMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworVmtEZXZpY2VNZW1vcnkgVm1hQWxsb2NhdGlvbl9UOjpHZXRNZW1vcnkoKSBjb25zdAoreworICAgIHN3aXRjaChtX1R5cGUpCisgICAgeworICAgIGNhc2UgQUxMT0NBVElPTl9UWVBFX0JMT0NLOgorICAgICAgICByZXR1cm4gbV9CbG9ja0FsbG9jYXRpb24ubV9CbG9jay0+R2V0RGV2aWNlTWVtb3J5KCk7CisgICAgY2FzZSBBTExPQ0FUSU9OX1RZUEVfREVESUNBVEVEOgorICAgICAgICByZXR1cm4gbV9EZWRpY2F0ZWRBbGxvY2F0aW9uLm1faE1lbW9yeTsKKyAgICBkZWZhdWx0OgorICAgICAgICBWTUFfQVNTRVJUKDApOworICAgICAgICByZXR1cm4gVktfTlVMTF9IQU5ETEU7CisgICAgfQorfQorCit1aW50MzJfdCBWbWFBbGxvY2F0aW9uX1Q6OkdldE1lbW9yeVR5cGVJbmRleCgpIGNvbnN0Cit7CisgICAgc3dpdGNoKG1fVHlwZSkKKyAgICB7CisgICAgY2FzZSBBTExPQ0FUSU9OX1RZUEVfQkxPQ0s6CisgICAgICAgIHJldHVybiBtX0Jsb2NrQWxsb2NhdGlvbi5tX0Jsb2NrLT5HZXRNZW1vcnlUeXBlSW5kZXgoKTsKKyAgICBjYXNlIEFMTE9DQVRJT05fVFlQRV9ERURJQ0FURUQ6CisgICAgICAgIHJldHVybiBtX0RlZGljYXRlZEFsbG9jYXRpb24ubV9NZW1vcnlUeXBlSW5kZXg7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICAgICAgcmV0dXJuIFVJTlQzMl9NQVg7CisgICAgfQorfQorCit2b2lkKiBWbWFBbGxvY2F0aW9uX1Q6OkdldE1hcHBlZERhdGEoKSBjb25zdAoreworICAgIHN3aXRjaChtX1R5cGUpCisgICAgeworICAgIGNhc2UgQUxMT0NBVElPTl9UWVBFX0JMT0NLOgorICAgICAgICBpZihtX01hcENvdW50ICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvaWQqIHBCbG9ja0RhdGEgPSBtX0Jsb2NrQWxsb2NhdGlvbi5tX0Jsb2NrLT5HZXRNYXBwZWREYXRhKCk7CisgICAgICAgICAgICBWTUFfQVNTRVJUKHBCbG9ja0RhdGEgIT0gVk1BX05VTEwpOworICAgICAgICAgICAgcmV0dXJuIChjaGFyKilwQmxvY2tEYXRhICsgbV9CbG9ja0FsbG9jYXRpb24ubV9PZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVk1BX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTExPQ0FUSU9OX1RZUEVfREVESUNBVEVEOgorICAgICAgICBWTUFfQVNTRVJUKChtX0RlZGljYXRlZEFsbG9jYXRpb24ubV9wTWFwcGVkRGF0YSAhPSBWTUFfTlVMTCkgPT0gKG1fTWFwQ291bnQgIT0gMCkpOworICAgICAgICByZXR1cm4gbV9EZWRpY2F0ZWRBbGxvY2F0aW9uLm1fcE1hcHBlZERhdGE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICAgICAgcmV0dXJuIFZNQV9OVUxMOworICAgIH0KK30KKworYm9vbCBWbWFBbGxvY2F0aW9uX1Q6OkNhbkJlY29tZUxvc3QoKSBjb25zdAoreworICAgIHN3aXRjaChtX1R5cGUpCisgICAgeworICAgIGNhc2UgQUxMT0NBVElPTl9UWVBFX0JMT0NLOgorICAgICAgICByZXR1cm4gbV9CbG9ja0FsbG9jYXRpb24ubV9DYW5CZWNvbWVMb3N0OworICAgIGNhc2UgQUxMT0NBVElPTl9UWVBFX0RFRElDQVRFRDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGRlZmF1bHQ6CisgICAgICAgIFZNQV9BU1NFUlQoMCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK1ZtYVBvb2wgVm1hQWxsb2NhdGlvbl9UOjpHZXRQb29sKCkgY29uc3QKK3sKKyAgICBWTUFfQVNTRVJUKG1fVHlwZSA9PSBBTExPQ0FUSU9OX1RZUEVfQkxPQ0spOworICAgIHJldHVybiBtX0Jsb2NrQWxsb2NhdGlvbi5tX2hQb29sOworfQorCitib29sIFZtYUFsbG9jYXRpb25fVDo6TWFrZUxvc3QodWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCkKK3sKKyAgICBWTUFfQVNTRVJUKENhbkJlY29tZUxvc3QoKSk7CisKKyAgICAvKgorICAgIFdhcm5pbmc6IFRoaXMgaXMgYSBjYXJlZnVsbHkgZGVzaWduZWQgYWxnb3JpdGhtLgorICAgIERvIG5vdCBtb2RpZnkgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZyA6KQorICAgICovCisgICAgdWludDMyX3QgbG9jYWxMYXN0VXNlRnJhbWVJbmRleCA9IEdldExhc3RVc2VGcmFtZUluZGV4KCk7CisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgaWYobG9jYWxMYXN0VXNlRnJhbWVJbmRleCA9PSBWTUFfRlJBTUVfSU5ERVhfTE9TVCkKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGxvY2FsTGFzdFVzZUZyYW1lSW5kZXggKyBmcmFtZUluVXNlQ291bnQgPj0gY3VycmVudEZyYW1lSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIExhc3QgdXNlIHRpbWUgZWFybGllciB0aGFuIGN1cnJlbnQgdGltZS4KKyAgICAgICAgeworICAgICAgICAgICAgaWYoQ29tcGFyZUV4Y2hhbmdlTGFzdFVzZUZyYW1lSW5kZXgobG9jYWxMYXN0VXNlRnJhbWVJbmRleCwgVk1BX0ZSQU1FX0lOREVYX0xPU1QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgaEFsbG9jYXRpb24uTGFzdFVzZUZyYW1lSW5kZXggYXRvbWljIHRvIFZNQV9GUkFNRV9JTkRFWF9MT1NUIGlzIGVub3VnaCB0byBtYXJrIGl0IGFzIExPU1QuCisgICAgICAgICAgICAgICAgLy8gQ2FsbGluZyBjb2RlIGp1c3QgbmVlZHMgdG8gdW5yZWdpc3RlciB0aGlzIGFsbG9jYXRpb24gaW4gb3duaW5nIFZtYURldmljZU1lbW9yeUJsb2NrLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisKKy8vIENvcnJlc3BvbmQgdG8gdmFsdWVzIG9mIGVudW0gVm1hU3ViYWxsb2NhdGlvblR5cGUuCitzdGF0aWMgY29uc3QgY2hhciogVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9OQU1FU1tdID0geworICAgICJGUkVFIiwKKyAgICAiVU5LTk9XTiIsCisgICAgIkJVRkZFUiIsCisgICAgIklNQUdFX1VOS05PV04iLAorICAgICJJTUFHRV9MSU5FQVIiLAorICAgICJJTUFHRV9PUFRJTUFMIiwKK307CisKK3ZvaWQgVm1hQWxsb2NhdGlvbl9UOjpQcmludFBhcmFtZXRlcnMoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbikgY29uc3QKK3sKKyAgICBqc29uLldyaXRlU3RyaW5nKCJUeXBlIik7CisgICAganNvbi5Xcml0ZVN0cmluZyhWTUFfU1VCQUxMT0NBVElPTl9UWVBFX05BTUVTW21fU3ViYWxsb2NhdGlvblR5cGVdKTsKKworICAgIGpzb24uV3JpdGVTdHJpbmcoIlNpemUiKTsKKyAgICBqc29uLldyaXRlTnVtYmVyKG1fU2l6ZSk7CisKKyAgICBpZihtX3BVc2VyRGF0YSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIlVzZXJEYXRhIik7CisgICAgICAgIGlmKElzVXNlckRhdGFTdHJpbmcoKSkKKyAgICAgICAgeworICAgICAgICAgICAganNvbi5Xcml0ZVN0cmluZygoY29uc3QgY2hhciopbV9wVXNlckRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAganNvbi5CZWdpblN0cmluZygpOworICAgICAgICAgICAganNvbi5Db250aW51ZVN0cmluZ19Qb2ludGVyKG1fcFVzZXJEYXRhKTsKKyAgICAgICAgICAgIGpzb24uRW5kU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBqc29uLldyaXRlU3RyaW5nKCJDcmVhdGlvbkZyYW1lSW5kZXgiKTsKKyAgICBqc29uLldyaXRlTnVtYmVyKG1fQ3JlYXRpb25GcmFtZUluZGV4KTsKKworICAgIGpzb24uV3JpdGVTdHJpbmcoIkxhc3RVc2VGcmFtZUluZGV4Iik7CisgICAganNvbi5Xcml0ZU51bWJlcihHZXRMYXN0VXNlRnJhbWVJbmRleCgpKTsKKworICAgIGlmKG1fQnVmZmVySW1hZ2VVc2FnZSAhPSAwKQorICAgIHsKKyAgICAgICAganNvbi5Xcml0ZVN0cmluZygiVXNhZ2UiKTsKKyAgICAgICAganNvbi5Xcml0ZU51bWJlcihtX0J1ZmZlckltYWdlVXNhZ2UpOworICAgIH0KK30KKworI2VuZGlmCisKK3ZvaWQgVm1hQWxsb2NhdGlvbl9UOjpGcmVlVXNlckRhdGFTdHJpbmcoVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IpCit7CisgICAgVk1BX0FTU0VSVChJc1VzZXJEYXRhU3RyaW5nKCkpOworICAgIGlmKG1fcFVzZXJEYXRhICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgY2hhciogY29uc3Qgb2xkU3RyID0gKGNoYXIqKW1fcFVzZXJEYXRhOworICAgICAgICBjb25zdCBzaXplX3Qgb2xkU3RyTGVuID0gc3RybGVuKG9sZFN0cik7CisgICAgICAgIHZtYV9kZWxldGVfYXJyYXkoaEFsbG9jYXRvciwgb2xkU3RyLCBvbGRTdHJMZW4gKyAxKTsKKyAgICAgICAgbV9wVXNlckRhdGEgPSBWTUFfTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgVm1hQWxsb2NhdGlvbl9UOjpCbG9ja0FsbG9jTWFwKCkKK3sKKyAgICBWTUFfQVNTRVJUKEdldFR5cGUoKSA9PSBBTExPQ0FUSU9OX1RZUEVfQkxPQ0spOworCisgICAgaWYoKG1fTWFwQ291bnQgJiB+TUFQX0NPVU5UX0ZMQUdfUEVSU0lTVEVOVF9NQVApIDwgMHg3RikKKyAgICB7CisgICAgICAgICsrbV9NYXBDb3VudDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVk1BX0FTU0VSVCgwICYmICJBbGxvY2F0aW9uIG1hcHBlZCB0b28gbWFueSB0aW1lcyBzaW11bHRhbmVvdXNseS4iKTsKKyAgICB9Cit9CisKK3ZvaWQgVm1hQWxsb2NhdGlvbl9UOjpCbG9ja0FsbG9jVW5tYXAoKQoreworICAgIFZNQV9BU1NFUlQoR2V0VHlwZSgpID09IEFMTE9DQVRJT05fVFlQRV9CTE9DSyk7CisKKyAgICBpZigobV9NYXBDb3VudCAmIH5NQVBfQ09VTlRfRkxBR19QRVJTSVNURU5UX01BUCkgIT0gMCkKKyAgICB7CisgICAgICAgIC0tbV9NYXBDb3VudDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVk1BX0FTU0VSVCgwICYmICJVbm1hcHBpbmcgYWxsb2NhdGlvbiBub3QgcHJldmlvdXNseSBtYXBwZWQuIik7CisgICAgfQorfQorCitWa1Jlc3VsdCBWbWFBbGxvY2F0aW9uX1Q6OkRlZGljYXRlZEFsbG9jTWFwKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLCB2b2lkKiogcHBEYXRhKQoreworICAgIFZNQV9BU1NFUlQoR2V0VHlwZSgpID09IEFMTE9DQVRJT05fVFlQRV9ERURJQ0FURUQpOworCisgICAgaWYobV9NYXBDb3VudCAhPSAwKQorICAgIHsKKyAgICAgICAgaWYoKG1fTWFwQ291bnQgJiB+TUFQX0NPVU5UX0ZMQUdfUEVSU0lTVEVOVF9NQVApIDwgMHg3RikKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0FTU0VSVChtX0RlZGljYXRlZEFsbG9jYXRpb24ubV9wTWFwcGVkRGF0YSAhPSBWTUFfTlVMTCk7CisgICAgICAgICAgICAqcHBEYXRhID0gbV9EZWRpY2F0ZWRBbGxvY2F0aW9uLm1fcE1hcHBlZERhdGE7CisgICAgICAgICAgICArK21fTWFwQ291bnQ7CisgICAgICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiRGVkaWNhdGVkIGFsbG9jYXRpb24gbWFwcGVkIHRvbyBtYW55IHRpbWVzIHNpbXVsdGFuZW91c2x5LiIpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX01FTU9SWV9NQVBfRkFJTEVEOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZrUmVzdWx0IHJlc3VsdCA9ICgqaEFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtNYXBNZW1vcnkpKAorICAgICAgICAgICAgaEFsbG9jYXRvci0+bV9oRGV2aWNlLAorICAgICAgICAgICAgbV9EZWRpY2F0ZWRBbGxvY2F0aW9uLm1faE1lbW9yeSwKKyAgICAgICAgICAgIDAsIC8vIG9mZnNldAorICAgICAgICAgICAgVktfV0hPTEVfU0laRSwKKyAgICAgICAgICAgIDAsIC8vIGZsYWdzCisgICAgICAgICAgICBwcERhdGEpOworICAgICAgICBpZihyZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbV9EZWRpY2F0ZWRBbGxvY2F0aW9uLm1fcE1hcHBlZERhdGEgPSAqcHBEYXRhOworICAgICAgICAgICAgbV9NYXBDb3VudCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKK3ZvaWQgVm1hQWxsb2NhdGlvbl9UOjpEZWRpY2F0ZWRBbGxvY1VubWFwKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yKQoreworICAgIFZNQV9BU1NFUlQoR2V0VHlwZSgpID09IEFMTE9DQVRJT05fVFlQRV9ERURJQ0FURUQpOworCisgICAgaWYoKG1fTWFwQ291bnQgJiB+TUFQX0NPVU5UX0ZMQUdfUEVSU0lTVEVOVF9NQVApICE9IDApCisgICAgeworICAgICAgICAtLW1fTWFwQ291bnQ7CisgICAgICAgIGlmKG1fTWFwQ291bnQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9EZWRpY2F0ZWRBbGxvY2F0aW9uLm1fcE1hcHBlZERhdGEgPSBWTUFfTlVMTDsKKyAgICAgICAgICAgICgqaEFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtVbm1hcE1lbW9yeSkoCisgICAgICAgICAgICAgICAgaEFsbG9jYXRvci0+bV9oRGV2aWNlLAorICAgICAgICAgICAgICAgIG1fRGVkaWNhdGVkQWxsb2NhdGlvbi5tX2hNZW1vcnkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiVW5tYXBwaW5nIGRlZGljYXRlZCBhbGxvY2F0aW9uIG5vdCBwcmV2aW91c2x5IG1hcHBlZC4iKTsKKyAgICB9Cit9CisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworc3RhdGljIHZvaWQgVm1hUHJpbnRTdGF0SW5mbyhWbWFKc29uV3JpdGVyJiBqc29uLCBjb25zdCBWbWFTdGF0SW5mbyYgc3RhdCkKK3sKKyAgICBqc29uLkJlZ2luT2JqZWN0KCk7CisKKyAgICBqc29uLldyaXRlU3RyaW5nKCJCbG9ja3MiKTsKKyAgICBqc29uLldyaXRlTnVtYmVyKHN0YXQuYmxvY2tDb3VudCk7CisKKyAgICBqc29uLldyaXRlU3RyaW5nKCJBbGxvY2F0aW9ucyIpOworICAgIGpzb24uV3JpdGVOdW1iZXIoc3RhdC5hbGxvY2F0aW9uQ291bnQpOworCisgICAganNvbi5Xcml0ZVN0cmluZygiVW51c2VkUmFuZ2VzIik7CisgICAganNvbi5Xcml0ZU51bWJlcihzdGF0LnVudXNlZFJhbmdlQ291bnQpOworCisgICAganNvbi5Xcml0ZVN0cmluZygiVXNlZEJ5dGVzIik7CisgICAganNvbi5Xcml0ZU51bWJlcihzdGF0LnVzZWRCeXRlcyk7CisKKyAgICBqc29uLldyaXRlU3RyaW5nKCJVbnVzZWRCeXRlcyIpOworICAgIGpzb24uV3JpdGVOdW1iZXIoc3RhdC51bnVzZWRCeXRlcyk7CisKKyAgICBpZihzdGF0LmFsbG9jYXRpb25Db3VudCA+IDEpCisgICAgeworICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJBbGxvY2F0aW9uU2l6ZSIpOworICAgICAgICBqc29uLkJlZ2luT2JqZWN0KHRydWUpOworICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJNaW4iKTsKKyAgICAgICAganNvbi5Xcml0ZU51bWJlcihzdGF0LmFsbG9jYXRpb25TaXplTWluKTsKKyAgICAgICAganNvbi5Xcml0ZVN0cmluZygiQXZnIik7CisgICAgICAgIGpzb24uV3JpdGVOdW1iZXIoc3RhdC5hbGxvY2F0aW9uU2l6ZUF2Zyk7CisgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIk1heCIpOworICAgICAgICBqc29uLldyaXRlTnVtYmVyKHN0YXQuYWxsb2NhdGlvblNpemVNYXgpOworICAgICAgICBqc29uLkVuZE9iamVjdCgpOworICAgIH0KKworICAgIGlmKHN0YXQudW51c2VkUmFuZ2VDb3VudCA+IDEpCisgICAgeworICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJVbnVzZWRSYW5nZVNpemUiKTsKKyAgICAgICAganNvbi5CZWdpbk9iamVjdCh0cnVlKTsKKyAgICAgICAganNvbi5Xcml0ZVN0cmluZygiTWluIik7CisgICAgICAgIGpzb24uV3JpdGVOdW1iZXIoc3RhdC51bnVzZWRSYW5nZVNpemVNaW4pOworICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJBdmciKTsKKyAgICAgICAganNvbi5Xcml0ZU51bWJlcihzdGF0LnVudXNlZFJhbmdlU2l6ZUF2Zyk7CisgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIk1heCIpOworICAgICAgICBqc29uLldyaXRlTnVtYmVyKHN0YXQudW51c2VkUmFuZ2VTaXplTWF4KTsKKyAgICAgICAganNvbi5FbmRPYmplY3QoKTsKKyAgICB9CisKKyAgICBqc29uLkVuZE9iamVjdCgpOworfQorCisjZW5kaWYgLy8gI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorCitzdHJ1Y3QgVm1hU3ViYWxsb2NhdGlvbkl0ZW1TaXplTGVzcworeworICAgIGJvb2wgb3BlcmF0b3IoKSgKKyAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIGxocywKKyAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIHJocykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBsaHMtPnNpemUgPCByaHMtPnNpemU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IoKSgKKyAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIGxocywKKyAgICAgICAgVmtEZXZpY2VTaXplIHJoc1NpemUpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbGhzLT5zaXplIDwgcmhzU2l6ZTsKKyAgICB9Cit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBjbGFzcyBWbWFCbG9ja01ldGFkYXRhCisKK1ZtYUJsb2NrTWV0YWRhdGE6OlZtYUJsb2NrTWV0YWRhdGEoVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IpIDoKKyAgICBtX1NpemUoMCksCisgICAgbV9wQWxsb2NhdGlvbkNhbGxiYWNrcyhoQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpCit7Cit9CisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKwordm9pZCBWbWFCbG9ja01ldGFkYXRhOjpQcmludERldGFpbGVkTWFwX0JlZ2luKGNsYXNzIFZtYUpzb25Xcml0ZXImIGpzb24sCisgICAgVmtEZXZpY2VTaXplIHVudXNlZEJ5dGVzLAorICAgIHNpemVfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgc2l6ZV90IHVudXNlZFJhbmdlQ291bnQpIGNvbnN0Cit7CisgICAganNvbi5CZWdpbk9iamVjdCgpOworCisgICAganNvbi5Xcml0ZVN0cmluZygiVG90YWxCeXRlcyIpOworICAgIGpzb24uV3JpdGVOdW1iZXIoR2V0U2l6ZSgpKTsKKworICAgIGpzb24uV3JpdGVTdHJpbmcoIlVudXNlZEJ5dGVzIik7CisgICAganNvbi5Xcml0ZU51bWJlcih1bnVzZWRCeXRlcyk7CisKKyAgICBqc29uLldyaXRlU3RyaW5nKCJBbGxvY2F0aW9ucyIpOworICAgIGpzb24uV3JpdGVOdW1iZXIoKHVpbnQ2NF90KWFsbG9jYXRpb25Db3VudCk7CisKKyAgICBqc29uLldyaXRlU3RyaW5nKCJVbnVzZWRSYW5nZXMiKTsKKyAgICBqc29uLldyaXRlTnVtYmVyKCh1aW50NjRfdCl1bnVzZWRSYW5nZUNvdW50KTsKKworICAgIGpzb24uV3JpdGVTdHJpbmcoIlN1YmFsbG9jYXRpb25zIik7CisgICAganNvbi5CZWdpbkFycmF5KCk7Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YTo6UHJpbnREZXRhaWxlZE1hcF9BbGxvY2F0aW9uKGNsYXNzIFZtYUpzb25Xcml0ZXImIGpzb24sCisgICAgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICBWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uKSBjb25zdAoreworICAgIGpzb24uQmVnaW5PYmplY3QodHJ1ZSk7CisgICAgICAgIAorICAgIGpzb24uV3JpdGVTdHJpbmcoIk9mZnNldCIpOworICAgIGpzb24uV3JpdGVOdW1iZXIob2Zmc2V0KTsKKworICAgIGhBbGxvY2F0aW9uLT5QcmludFBhcmFtZXRlcnMoanNvbik7CisKKyAgICBqc29uLkVuZE9iamVjdCgpOworfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGE6OlByaW50RGV0YWlsZWRNYXBfVW51c2VkUmFuZ2UoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbiwKKyAgICBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSBzaXplKSBjb25zdAoreworICAgIGpzb24uQmVnaW5PYmplY3QodHJ1ZSk7CisgICAgICAgIAorICAgIGpzb24uV3JpdGVTdHJpbmcoIk9mZnNldCIpOworICAgIGpzb24uV3JpdGVOdW1iZXIob2Zmc2V0KTsKKworICAgIGpzb24uV3JpdGVTdHJpbmcoIlR5cGUiKTsKKyAgICBqc29uLldyaXRlU3RyaW5nKFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfTkFNRVNbVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFXSk7CisKKyAgICBqc29uLldyaXRlU3RyaW5nKCJTaXplIik7CisgICAganNvbi5Xcml0ZU51bWJlcihzaXplKTsKKworICAgIGpzb24uRW5kT2JqZWN0KCk7Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YTo6UHJpbnREZXRhaWxlZE1hcF9FbmQoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbikgY29uc3QKK3sKKyAgICBqc29uLkVuZEFycmF5KCk7CisgICAganNvbi5FbmRPYmplY3QoKTsKK30KKworI2VuZGlmIC8vICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGNsYXNzIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYworCitWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6OlZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYyhWbWFBbGxvY2F0b3IgaEFsbG9jYXRvcikgOgorICAgIFZtYUJsb2NrTWV0YWRhdGEoaEFsbG9jYXRvciksCisgICAgbV9GcmVlQ291bnQoMCksCisgICAgbV9TdW1GcmVlU2l6ZSgwKSwKKyAgICBtX1N1YmFsbG9jYXRpb25zKFZtYVN0bEFsbG9jYXRvcjxWbWFTdWJhbGxvY2F0aW9uPihoQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKSwKKyAgICBtX0ZyZWVTdWJhbGxvY2F0aW9uc0J5U2l6ZShWbWFTdGxBbGxvY2F0b3I8Vm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yPihoQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKQoreworfQorCitWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6On5WbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMoKQoreworfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYzo6SW5pdChWa0RldmljZVNpemUgc2l6ZSkKK3sKKyAgICBWbWFCbG9ja01ldGFkYXRhOjpJbml0KHNpemUpOworCisgICAgbV9GcmVlQ291bnQgPSAxOworICAgIG1fU3VtRnJlZVNpemUgPSBzaXplOworCisgICAgVm1hU3ViYWxsb2NhdGlvbiBzdWJhbGxvYyA9IHt9OworICAgIHN1YmFsbG9jLm9mZnNldCA9IDA7CisgICAgc3ViYWxsb2Muc2l6ZSA9IHNpemU7CisgICAgc3ViYWxsb2MudHlwZSA9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRTsKKyAgICBzdWJhbGxvYy5oQWxsb2NhdGlvbiA9IFZLX05VTExfSEFORExFOworCisgICAgVk1BX0FTU0VSVChzaXplID4gVk1BX01JTl9GUkVFX1NVQkFMTE9DQVRJT05fU0laRV9UT19SRUdJU1RFUik7CisgICAgbV9TdWJhbGxvY2F0aW9ucy5wdXNoX2JhY2soc3ViYWxsb2MpOworICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBzdWJhbGxvY0l0ZW0gPSBtX1N1YmFsbG9jYXRpb25zLmVuZCgpOworICAgIC0tc3ViYWxsb2NJdGVtOworICAgIG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLnB1c2hfYmFjayhzdWJhbGxvY0l0ZW0pOworfQorCitib29sIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYzo6VmFsaWRhdGUoKSBjb25zdAoreworICAgIFZNQV9WQUxJREFURSghbV9TdWJhbGxvY2F0aW9ucy5lbXB0eSgpKTsKKyAgICAKKyAgICAvLyBFeHBlY3RlZCBvZmZzZXQgb2YgbmV3IHN1YmFsbG9jYXRpb24gYXMgY2FsY3VsYXRlZCBmcm9tIHByZXZpb3VzIG9uZXMuCisgICAgVmtEZXZpY2VTaXplIGNhbGN1bGF0ZWRPZmZzZXQgPSAwOworICAgIC8vIEV4cGVjdGVkIG51bWJlciBvZiBmcmVlIHN1YmFsbG9jYXRpb25zIGFzIGNhbGN1bGF0ZWQgZnJvbSB0cmF2ZXJzaW5nIHRoZWlyIGxpc3QuCisgICAgdWludDMyX3QgY2FsY3VsYXRlZEZyZWVDb3VudCA9IDA7CisgICAgLy8gRXhwZWN0ZWQgc3VtIHNpemUgb2YgZnJlZSBzdWJhbGxvY2F0aW9ucyBhcyBjYWxjdWxhdGVkIGZyb20gdHJhdmVyc2luZyB0aGVpciBsaXN0LgorICAgIFZrRGV2aWNlU2l6ZSBjYWxjdWxhdGVkU3VtRnJlZVNpemUgPSAwOworICAgIC8vIEV4cGVjdGVkIG51bWJlciBvZiBmcmVlIHN1YmFsbG9jYXRpb25zIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaW4KKyAgICAvLyBtX0ZyZWVTdWJhbGxvY2F0aW9uc0J5U2l6ZSBjYWxjdWxhdGVkIGZyb20gdHJhdmVyc2luZyB0aGVpciBsaXN0LgorICAgIHNpemVfdCBmcmVlU3ViYWxsb2NhdGlvbnNUb1JlZ2lzdGVyID0gMDsKKyAgICAvLyBUcnVlIGlmIHByZXZpb3VzIHZpc2l0ZWQgc3ViYWxsb2NhdGlvbiB3YXMgZnJlZS4KKyAgICBib29sIHByZXZGcmVlID0gZmFsc2U7CisKKyAgICBmb3IoVm1hU3ViYWxsb2NhdGlvbkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIHN1YmFsbG9jSXRlbSA9IG1fU3ViYWxsb2NhdGlvbnMuY2JlZ2luKCk7CisgICAgICAgIHN1YmFsbG9jSXRlbSAhPSBtX1N1YmFsbG9jYXRpb25zLmNlbmQoKTsKKyAgICAgICAgKytzdWJhbGxvY0l0ZW0pCisgICAgeworICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJBbGxvYyA9ICpzdWJhbGxvY0l0ZW07CisgICAgICAgIAorICAgICAgICAvLyBBY3R1YWwgb2Zmc2V0IG9mIHRoaXMgc3ViYWxsb2NhdGlvbiBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIG9uZS4KKyAgICAgICAgVk1BX1ZBTElEQVRFKHN1YkFsbG9jLm9mZnNldCA9PSBjYWxjdWxhdGVkT2Zmc2V0KTsKKworICAgICAgICBjb25zdCBib29sIGN1cnJGcmVlID0gKHN1YkFsbG9jLnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKTsKKyAgICAgICAgLy8gVHdvIGFkamFjZW50IGZyZWUgc3ViYWxsb2NhdGlvbnMgYXJlIGludmFsaWQuIFRoZXkgc2hvdWxkIGJlIG1lcmdlZC4KKyAgICAgICAgVk1BX1ZBTElEQVRFKCFwcmV2RnJlZSB8fCAhY3VyckZyZWUpOworCisgICAgICAgIFZNQV9WQUxJREFURShjdXJyRnJlZSA9PSAoc3ViQWxsb2MuaEFsbG9jYXRpb24gPT0gVktfTlVMTF9IQU5ETEUpKTsKKworICAgICAgICBpZihjdXJyRnJlZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FsY3VsYXRlZFN1bUZyZWVTaXplICs9IHN1YkFsbG9jLnNpemU7CisgICAgICAgICAgICArK2NhbGN1bGF0ZWRGcmVlQ291bnQ7CisgICAgICAgICAgICBpZihzdWJBbGxvYy5zaXplID49IFZNQV9NSU5fRlJFRV9TVUJBTExPQ0FUSU9OX1NJWkVfVE9fUkVHSVNURVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytmcmVlU3ViYWxsb2NhdGlvbnNUb1JlZ2lzdGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYXJnaW4gcmVxdWlyZWQgYmV0d2VlbiBhbGxvY2F0aW9ucyAtIGV2ZXJ5IGZyZWUgc3BhY2UgbXVzdCBiZSBhdCBsZWFzdCB0aGF0IGxhcmdlLgorICAgICAgICAgICAgVk1BX1ZBTElEQVRFKHN1YkFsbG9jLnNpemUgPj0gVk1BX0RFQlVHX01BUkdJTik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWTUFfVkFMSURBVEUoc3ViQWxsb2MuaEFsbG9jYXRpb24tPkdldE9mZnNldCgpID09IHN1YkFsbG9jLm9mZnNldCk7CisgICAgICAgICAgICBWTUFfVkFMSURBVEUoc3ViQWxsb2MuaEFsbG9jYXRpb24tPkdldFNpemUoKSA9PSBzdWJBbGxvYy5zaXplKTsKKworICAgICAgICAgICAgLy8gTWFyZ2luIHJlcXVpcmVkIGJldHdlZW4gYWxsb2NhdGlvbnMgLSBwcmV2aW91cyBhbGxvY2F0aW9uIG11c3QgYmUgZnJlZS4KKyAgICAgICAgICAgIFZNQV9WQUxJREFURShWTUFfREVCVUdfTUFSR0lOID09IDAgfHwgcHJldkZyZWUpOworICAgICAgICB9CisKKyAgICAgICAgY2FsY3VsYXRlZE9mZnNldCArPSBzdWJBbGxvYy5zaXplOworICAgICAgICBwcmV2RnJlZSA9IGN1cnJGcmVlOworICAgIH0KKworICAgIC8vIE51bWJlciBvZiBmcmVlIHN1YmFsbG9jYXRpb25zIHJlZ2lzdGVyZWQgaW4gbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUgZG9lc24ndAorICAgIC8vIG1hdGNoIGV4cGVjdGVkIG9uZS4KKyAgICBWTUFfVkFMSURBVEUobV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuc2l6ZSgpID09IGZyZWVTdWJhbGxvY2F0aW9uc1RvUmVnaXN0ZXIpOworCisgICAgVmtEZXZpY2VTaXplIGxhc3RTaXplID0gMDsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3Igc3ViYWxsb2NJdGVtID0gbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemVbaV07CisgICAgICAgIAorICAgICAgICAvLyBPbmx5IGZyZWUgc3ViYWxsb2NhdGlvbnMgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuCisgICAgICAgIFZNQV9WQUxJREFURShzdWJhbGxvY0l0ZW0tPnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKTsKKyAgICAgICAgLy8gVGhleSBtdXN0IGJlIHNvcnRlZCBieSBzaXplIGFzY2VuZGluZy4KKyAgICAgICAgVk1BX1ZBTElEQVRFKHN1YmFsbG9jSXRlbS0+c2l6ZSA+PSBsYXN0U2l6ZSk7CisKKyAgICAgICAgbGFzdFNpemUgPSBzdWJhbGxvY0l0ZW0tPnNpemU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdG90YWxzIG1hdGNoIGNhbGN1bGFjdGVkIHZhbHVlcy4KKyAgICBWTUFfVkFMSURBVEUoVmFsaWRhdGVGcmVlU3ViYWxsb2NhdGlvbkxpc3QoKSk7CisgICAgVk1BX1ZBTElEQVRFKGNhbGN1bGF0ZWRPZmZzZXQgPT0gR2V0U2l6ZSgpKTsKKyAgICBWTUFfVkFMSURBVEUoY2FsY3VsYXRlZFN1bUZyZWVTaXplID09IG1fU3VtRnJlZVNpemUpOworICAgIFZNQV9WQUxJREFURShjYWxjdWxhdGVkRnJlZUNvdW50ID09IG1fRnJlZUNvdW50KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitWa0RldmljZVNpemUgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljOjpHZXRVbnVzZWRSYW5nZVNpemVNYXgoKSBjb25zdAoreworICAgIGlmKCFtX0ZyZWVTdWJhbGxvY2F0aW9uc0J5U2l6ZS5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLmJhY2soKS0+c2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitib29sIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYzo6SXNFbXB0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtX1N1YmFsbG9jYXRpb25zLnNpemUoKSA9PSAxKSAmJiAobV9GcmVlQ291bnQgPT0gMSk7Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljOjpDYWxjQWxsb2NhdGlvblN0YXRJbmZvKFZtYVN0YXRJbmZvJiBvdXRJbmZvKSBjb25zdAoreworICAgIG91dEluZm8uYmxvY2tDb3VudCA9IDE7CisKKyAgICBjb25zdCB1aW50MzJfdCByYW5nZUNvdW50ID0gKHVpbnQzMl90KW1fU3ViYWxsb2NhdGlvbnMuc2l6ZSgpOworICAgIG91dEluZm8uYWxsb2NhdGlvbkNvdW50ID0gcmFuZ2VDb3VudCAtIG1fRnJlZUNvdW50OworICAgIG91dEluZm8udW51c2VkUmFuZ2VDb3VudCA9IG1fRnJlZUNvdW50OworICAgIAorICAgIG91dEluZm8udW51c2VkQnl0ZXMgPSBtX1N1bUZyZWVTaXplOworICAgIG91dEluZm8udXNlZEJ5dGVzID0gR2V0U2l6ZSgpIC0gb3V0SW5mby51bnVzZWRCeXRlczsKKworICAgIG91dEluZm8uYWxsb2NhdGlvblNpemVNaW4gPSBVSU5UNjRfTUFYOworICAgIG91dEluZm8uYWxsb2NhdGlvblNpemVNYXggPSAwOworICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWluID0gVUlOVDY0X01BWDsKKyAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1heCA9IDA7CisKKyAgICBmb3IoVm1hU3ViYWxsb2NhdGlvbkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIHN1YmFsbG9jSXRlbSA9IG1fU3ViYWxsb2NhdGlvbnMuY2JlZ2luKCk7CisgICAgICAgIHN1YmFsbG9jSXRlbSAhPSBtX1N1YmFsbG9jYXRpb25zLmNlbmQoKTsKKyAgICAgICAgKytzdWJhbGxvY0l0ZW0pCisgICAgeworICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9ICpzdWJhbGxvY0l0ZW07CisgICAgICAgIGlmKHN1YmFsbG9jLnR5cGUgIT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRJbmZvLmFsbG9jYXRpb25TaXplTWluID0gVk1BX01JTihvdXRJbmZvLmFsbG9jYXRpb25TaXplTWluLCBzdWJhbGxvYy5zaXplKTsKKyAgICAgICAgICAgIG91dEluZm8uYWxsb2NhdGlvblNpemVNYXggPSBWTUFfTUFYKG91dEluZm8uYWxsb2NhdGlvblNpemVNYXgsIHN1YmFsbG9jLnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4gPSBWTUFfTUlOKG91dEluZm8udW51c2VkUmFuZ2VTaXplTWluLCBzdWJhbGxvYy5zaXplKTsKKyAgICAgICAgICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4ID0gVk1BX01BWChvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1heCwgc3ViYWxsb2Muc2l6ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljOjpBZGRQb29sU3RhdHMoVm1hUG9vbFN0YXRzJiBpbm91dFN0YXRzKSBjb25zdAoreworICAgIGNvbnN0IHVpbnQzMl90IHJhbmdlQ291bnQgPSAodWludDMyX3QpbV9TdWJhbGxvY2F0aW9ucy5zaXplKCk7CisKKyAgICBpbm91dFN0YXRzLnNpemUgKz0gR2V0U2l6ZSgpOworICAgIGlub3V0U3RhdHMudW51c2VkU2l6ZSArPSBtX1N1bUZyZWVTaXplOworICAgIGlub3V0U3RhdHMuYWxsb2NhdGlvbkNvdW50ICs9IHJhbmdlQ291bnQgLSBtX0ZyZWVDb3VudDsKKyAgICBpbm91dFN0YXRzLnVudXNlZFJhbmdlQ291bnQgKz0gbV9GcmVlQ291bnQ7CisgICAgaW5vdXRTdGF0cy51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUFYKGlub3V0U3RhdHMudW51c2VkUmFuZ2VTaXplTWF4LCBHZXRVbnVzZWRSYW5nZVNpemVNYXgoKSk7Cit9CisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6OlByaW50RGV0YWlsZWRNYXAoY2xhc3MgVm1hSnNvbldyaXRlciYganNvbikgY29uc3QKK3sKKyAgICBQcmludERldGFpbGVkTWFwX0JlZ2luKGpzb24sCisgICAgICAgIG1fU3VtRnJlZVNpemUsIC8vIHVudXNlZEJ5dGVzCisgICAgICAgIG1fU3ViYWxsb2NhdGlvbnMuc2l6ZSgpIC0gKHNpemVfdCltX0ZyZWVDb3VudCwgLy8gYWxsb2NhdGlvbkNvdW50CisgICAgICAgIG1fRnJlZUNvdW50KTsgLy8gdW51c2VkUmFuZ2VDb3VudAorCisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvcihWbWFTdWJhbGxvY2F0aW9uTGlzdDo6Y29uc3RfaXRlcmF0b3Igc3ViYWxsb2NJdGVtID0gbV9TdWJhbGxvY2F0aW9ucy5jYmVnaW4oKTsKKyAgICAgICAgc3ViYWxsb2NJdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuY2VuZCgpOworICAgICAgICArK3N1YmFsbG9jSXRlbSwgKytpKQorICAgIHsKKyAgICAgICAgaWYoc3ViYWxsb2NJdGVtLT50eXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSkKKyAgICAgICAgeworICAgICAgICAgICAgUHJpbnREZXRhaWxlZE1hcF9VbnVzZWRSYW5nZShqc29uLCBzdWJhbGxvY0l0ZW0tPm9mZnNldCwgc3ViYWxsb2NJdGVtLT5zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFByaW50RGV0YWlsZWRNYXBfQWxsb2NhdGlvbihqc29uLCBzdWJhbGxvY0l0ZW0tPm9mZnNldCwgc3ViYWxsb2NJdGVtLT5oQWxsb2NhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQcmludERldGFpbGVkTWFwX0VuZChqc29uKTsKK30KKworI2VuZGlmIC8vICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworYm9vbCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6OkNyZWF0ZUFsbG9jYXRpb25SZXF1ZXN0KAorICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCwKKyAgICBWa0RldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICBWa0RldmljZVNpemUgYWxsb2NTaXplLAorICAgIFZrRGV2aWNlU2l6ZSBhbGxvY0FsaWdubWVudCwKKyAgICBib29sIHVwcGVyQWRkcmVzcywKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBhbGxvY1R5cGUsCisgICAgYm9vbCBjYW5NYWtlT3RoZXJMb3N0LAorICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgIFZtYUFsbG9jYXRpb25SZXF1ZXN0KiBwQWxsb2NhdGlvblJlcXVlc3QpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY1NpemUgPiAwKTsKKyAgICBWTUFfQVNTRVJUKCF1cHBlckFkZHJlc3MpOworICAgIFZNQV9BU1NFUlQoYWxsb2NUeXBlICE9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSk7CisgICAgVk1BX0FTU0VSVChwQWxsb2NhdGlvblJlcXVlc3QgIT0gVk1BX05VTEwpOworICAgIFZNQV9IRUFWWV9BU1NFUlQoVmFsaWRhdGUoKSk7CisKKyAgICAvLyBUaGVyZSBpcyBub3QgZW5vdWdoIHRvdGFsIGZyZWUgc3BhY2UgaW4gdGhpcyBibG9jayB0byBmdWxsZmlsbCB0aGUgcmVxdWVzdDogRWFybHkgcmV0dXJuLgorICAgIGlmKGNhbk1ha2VPdGhlckxvc3QgPT0gZmFsc2UgJiYKKyAgICAgICAgbV9TdW1GcmVlU2l6ZSA8IGFsbG9jU2l6ZSArIDIgKiBWTUFfREVCVUdfTUFSR0lOKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE5ldyBhbGdvcml0aG0sIGVmZmljaWVudGx5IHNlYXJjaGluZyBmcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuCisgICAgY29uc3Qgc2l6ZV90IGZyZWVTdWJhbGxvY0NvdW50ID0gbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuc2l6ZSgpOworICAgIGlmKGZyZWVTdWJhbGxvY0NvdW50ID4gMCkKKyAgICB7CisgICAgICAgIGlmKHN0cmF0ZWd5ID09IFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9CRVNUX0ZJVF9CSVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZpbmQgZmlyc3QgZnJlZSBzdWJhbGxvY2F0aW9uIHdpdGggc2l6ZSBub3QgbGVzcyB0aGFuIGFsbG9jU2l6ZSArIDIgKiBWTUFfREVCVUdfTUFSR0lOLgorICAgICAgICAgICAgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yKiBjb25zdCBpdCA9IFZtYUJpbmFyeUZpbmRGaXJzdE5vdExlc3MoCisgICAgICAgICAgICAgICAgbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuZGF0YSgpLAorICAgICAgICAgICAgICAgIG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLmRhdGEoKSArIGZyZWVTdWJhbGxvY0NvdW50LAorICAgICAgICAgICAgICAgIGFsbG9jU2l6ZSArIDIgKiBWTUFfREVCVUdfTUFSR0lOLAorICAgICAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb25JdGVtU2l6ZUxlc3MoKSk7CisgICAgICAgICAgICBzaXplX3QgaW5kZXggPSBpdCAtIG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLmRhdGEoKTsKKyAgICAgICAgICAgIGZvcig7IGluZGV4IDwgZnJlZVN1YmFsbG9jQ291bnQ7ICsraW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoQ2hlY2tBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVJblVzZUNvdW50LAorICAgICAgICAgICAgICAgICAgICBidWZmZXJJbWFnZUdyYW51bGFyaXR5LAorICAgICAgICAgICAgICAgICAgICBhbGxvY1NpemUsCisgICAgICAgICAgICAgICAgICAgIGFsbG9jQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICBhbGxvY1R5cGUsCisgICAgICAgICAgICAgICAgICAgIG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIGNhbk1ha2VPdGhlckxvc3QKKyAgICAgICAgICAgICAgICAgICAgJnBBbGxvY2F0aW9uUmVxdWVzdC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAmcEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtc1RvTWFrZUxvc3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgJnBBbGxvY2F0aW9uUmVxdWVzdC0+c3VtRnJlZVNpemUsCisgICAgICAgICAgICAgICAgICAgICZwQWxsb2NhdGlvblJlcXVlc3QtPnN1bUl0ZW1TaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbSA9IG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc3RyYXRlZ3kgPT0gVk1BX0FMTE9DQVRJT05fSU5URVJOQUxfU1RSQVRFR1lfTUlOX09GRlNFVCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdCA9IG1fU3ViYWxsb2NhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtX1N1YmFsbG9jYXRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICsraXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoaXQtPnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFICYmIENoZWNrQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5Vc2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NTaXplLAorICAgICAgICAgICAgICAgICAgICBhbGxvY0FsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICBpdCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIGNhbk1ha2VPdGhlckxvc3QKKyAgICAgICAgICAgICAgICAgICAgJnBBbGxvY2F0aW9uUmVxdWVzdC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAmcEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtc1RvTWFrZUxvc3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgJnBBbGxvY2F0aW9uUmVxdWVzdC0+c3VtRnJlZVNpemUsCisgICAgICAgICAgICAgICAgICAgICZwQWxsb2NhdGlvblJlcXVlc3QtPnN1bUl0ZW1TaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbSA9IGl0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvLyBXT1JTVF9GSVQsIEZJUlNUX0ZJVAorICAgICAgICB7CisgICAgICAgICAgICAvLyBTZWFyY2ggc3RhcmluZyBmcm9tIGJpZ2dlc3Qgc3ViYWxsb2NhdGlvbnMuCisgICAgICAgICAgICBmb3Ioc2l6ZV90IGluZGV4ID0gZnJlZVN1YmFsbG9jQ291bnQ7IGluZGV4LS07ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihDaGVja0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICBmcmFtZUluVXNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHksCisgICAgICAgICAgICAgICAgICAgIGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIGFsbG9jVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemVbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gY2FuTWFrZU90aGVyTG9zdAorICAgICAgICAgICAgICAgICAgICAmcEFsbG9jYXRpb25SZXF1ZXN0LT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICZwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW1zVG9NYWtlTG9zdENvdW50LAorICAgICAgICAgICAgICAgICAgICAmcEFsbG9jYXRpb25SZXF1ZXN0LT5zdW1GcmVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJnBBbGxvY2F0aW9uUmVxdWVzdC0+c3VtSXRlbVNpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtID0gbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemVbaW5kZXhdOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihjYW5NYWtlT3RoZXJMb3N0KQorICAgIHsKKyAgICAgICAgLy8gQnJ1dGUtZm9yY2UgYWxnb3JpdGhtLiBUT0RPOiBDb21lIHVwIHdpdGggc29tZXRoaW5nIGJldHRlci4KKworICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPnN1bUZyZWVTaXplID0gVktfV0hPTEVfU0laRTsKKyAgICAgICAgcEFsbG9jYXRpb25SZXF1ZXN0LT5zdW1JdGVtU2l6ZSA9IFZLX1dIT0xFX1NJWkU7CisKKyAgICAgICAgVm1hQWxsb2NhdGlvblJlcXVlc3QgdG1wQWxsb2NSZXF1ZXN0ID0ge307CisgICAgICAgIGZvcihWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3Igc3ViYWxsb2NJdCA9IG1fU3ViYWxsb2NhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgIHN1YmFsbG9jSXQgIT0gbV9TdWJhbGxvY2F0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICsrc3ViYWxsb2NJdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3ViYWxsb2NJdC0+dHlwZSA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUgfHwKKyAgICAgICAgICAgICAgICBzdWJhbGxvY0l0LT5oQWxsb2NhdGlvbi0+Q2FuQmVjb21lTG9zdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKENoZWNrQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5Vc2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NTaXplLAorICAgICAgICAgICAgICAgICAgICBhbGxvY0FsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICBzdWJhbGxvY0l0LAorICAgICAgICAgICAgICAgICAgICBjYW5NYWtlT3RoZXJMb3N0LAorICAgICAgICAgICAgICAgICAgICAmdG1wQWxsb2NSZXF1ZXN0Lm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgJnRtcEFsbG9jUmVxdWVzdC5pdGVtc1RvTWFrZUxvc3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgJnRtcEFsbG9jUmVxdWVzdC5zdW1GcmVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJnRtcEFsbG9jUmVxdWVzdC5zdW1JdGVtU2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXBBbGxvY1JlcXVlc3QuaXRlbSA9IHN1YmFsbG9jSXQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYodG1wQWxsb2NSZXF1ZXN0LkNhbGNDb3N0KCkgPCBwQWxsb2NhdGlvblJlcXVlc3QtPkNhbGNDb3N0KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID09IFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9GSVJTVF9GSVRfQklUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcEFsbG9jYXRpb25SZXF1ZXN0ID0gdG1wQWxsb2NSZXF1ZXN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYocEFsbG9jYXRpb25SZXF1ZXN0LT5zdW1JdGVtU2l6ZSAhPSBWS19XSE9MRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6Ok1ha2VSZXF1ZXN0ZWRBbGxvY2F0aW9uc0xvc3QoCisgICAgdWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsCisgICAgdWludDMyX3QgZnJhbWVJblVzZUNvdW50LAorICAgIFZtYUFsbG9jYXRpb25SZXF1ZXN0KiBwQWxsb2NhdGlvblJlcXVlc3QpCit7CisgICAgd2hpbGUocEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtc1RvTWFrZUxvc3RDb3VudCA+IDApCisgICAgeworICAgICAgICBpZihwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW0tPnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKQorICAgICAgICB7CisgICAgICAgICAgICArK3BBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbTsKKyAgICAgICAgfQorICAgICAgICBWTUFfQVNTRVJUKHBBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbSAhPSBtX1N1YmFsbG9jYXRpb25zLmVuZCgpKTsKKyAgICAgICAgVk1BX0FTU0VSVChwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW0tPmhBbGxvY2F0aW9uICE9IFZLX05VTExfSEFORExFKTsKKyAgICAgICAgVk1BX0FTU0VSVChwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW0tPmhBbGxvY2F0aW9uLT5DYW5CZWNvbWVMb3N0KCkpOworICAgICAgICBpZihwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW0tPmhBbGxvY2F0aW9uLT5NYWtlTG9zdChjdXJyZW50RnJhbWVJbmRleCwgZnJhbWVJblVzZUNvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtID0gRnJlZVN1YmFsbG9jYXRpb24ocEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtKTsKKyAgICAgICAgICAgIC0tcEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtc1RvTWFrZUxvc3RDb3VudDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZNQV9IRUFWWV9BU1NFUlQoVmFsaWRhdGUoKSk7CisgICAgVk1BX0FTU0VSVChwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW0gIT0gbV9TdWJhbGxvY2F0aW9ucy5lbmQoKSk7CisgICAgVk1BX0FTU0VSVChwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW0tPnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordWludDMyX3QgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljOjpNYWtlQWxsb2NhdGlvbnNMb3N0KHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LCB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQpCit7CisgICAgdWludDMyX3QgbG9zdEFsbG9jYXRpb25Db3VudCA9IDA7CisgICAgZm9yKFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdCA9IG1fU3ViYWxsb2NhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbV9TdWJhbGxvY2F0aW9ucy5lbmQoKTsKKyAgICAgICAgKytpdCkKKyAgICB7CisgICAgICAgIGlmKGl0LT50eXBlICE9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSAmJgorICAgICAgICAgICAgaXQtPmhBbGxvY2F0aW9uLT5DYW5CZWNvbWVMb3N0KCkgJiYKKyAgICAgICAgICAgIGl0LT5oQWxsb2NhdGlvbi0+TWFrZUxvc3QoY3VycmVudEZyYW1lSW5kZXgsIGZyYW1lSW5Vc2VDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ID0gRnJlZVN1YmFsbG9jYXRpb24oaXQpOworICAgICAgICAgICAgKytsb3N0QWxsb2NhdGlvbkNvdW50OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsb3N0QWxsb2NhdGlvbkNvdW50OworfQorCitWa1Jlc3VsdCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6OkNoZWNrQ29ycnVwdGlvbihjb25zdCB2b2lkKiBwQmxvY2tEYXRhKQoreworICAgIGZvcihWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3IgaXQgPSBtX1N1YmFsbG9jYXRpb25zLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1fU3ViYWxsb2NhdGlvbnMuZW5kKCk7CisgICAgICAgICsraXQpCisgICAgeworICAgICAgICBpZihpdC0+dHlwZSAhPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFWbWFWYWxpZGF0ZU1hZ2ljVmFsdWUocEJsb2NrRGF0YSwgaXQtPm9mZnNldCAtIFZNQV9ERUJVR19NQVJHSU4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiTUVNT1JZIENPUlJVUFRJT04gREVURUNURUQgQkVGT1JFIFZBTElEQVRFRCBBTExPQ0FUSU9OISIpOworICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighVm1hVmFsaWRhdGVNYWdpY1ZhbHVlKHBCbG9ja0RhdGEsIGl0LT5vZmZzZXQgKyBpdC0+c2l6ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk1BX0FTU0VSVCgwICYmICJNRU1PUlkgQ09SUlVQVElPTiBERVRFQ1RFRCBBRlRFUiBWQUxJREFURUQgQUxMT0NBVElPTiEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljOjpBbGxvYygKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uUmVxdWVzdCYgcmVxdWVzdCwKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSB0eXBlLAorICAgIFZrRGV2aWNlU2l6ZSBhbGxvY1NpemUsCisgICAgYm9vbCB1cHBlckFkZHJlc3MsCisgICAgVm1hQWxsb2NhdGlvbiBoQWxsb2NhdGlvbikKK3sKKyAgICBWTUFfQVNTRVJUKCF1cHBlckFkZHJlc3MpOworICAgIFZNQV9BU1NFUlQocmVxdWVzdC5pdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuZW5kKCkpOworICAgIFZtYVN1YmFsbG9jYXRpb24mIHN1YmFsbG9jID0gKnJlcXVlc3QuaXRlbTsKKyAgICAvLyBHaXZlbiBzdWJhbGxvY2F0aW9uIGlzIGEgZnJlZSBibG9jay4KKyAgICBWTUFfQVNTRVJUKHN1YmFsbG9jLnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKTsKKyAgICAvLyBHaXZlbiBvZmZzZXQgaXMgaW5zaWRlIHRoaXMgc3ViYWxsb2NhdGlvbi4KKyAgICBWTUFfQVNTRVJUKHJlcXVlc3Qub2Zmc2V0ID49IHN1YmFsbG9jLm9mZnNldCk7CisgICAgY29uc3QgVmtEZXZpY2VTaXplIHBhZGRpbmdCZWdpbiA9IHJlcXVlc3Qub2Zmc2V0IC0gc3ViYWxsb2Mub2Zmc2V0OworICAgIFZNQV9BU1NFUlQoc3ViYWxsb2Muc2l6ZSA+PSBwYWRkaW5nQmVnaW4gKyBhbGxvY1NpemUpOworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBwYWRkaW5nRW5kID0gc3ViYWxsb2Muc2l6ZSAtIHBhZGRpbmdCZWdpbiAtIGFsbG9jU2l6ZTsKKworICAgIC8vIFVucmVnaXN0ZXIgdGhpcyBmcmVlIHN1YmFsbG9jYXRpb24gZnJvbSBtX0ZyZWVTdWJhbGxvY2F0aW9uc0J5U2l6ZSBhbmQgdXBkYXRlCisgICAgLy8gaXQgdG8gYmVjb21lIHVzZWQuCisgICAgVW5yZWdpc3RlckZyZWVTdWJhbGxvY2F0aW9uKHJlcXVlc3QuaXRlbSk7CisKKyAgICBzdWJhbGxvYy5vZmZzZXQgPSByZXF1ZXN0Lm9mZnNldDsKKyAgICBzdWJhbGxvYy5zaXplID0gYWxsb2NTaXplOworICAgIHN1YmFsbG9jLnR5cGUgPSB0eXBlOworICAgIHN1YmFsbG9jLmhBbGxvY2F0aW9uID0gaEFsbG9jYXRpb247CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGZyZWUgYnl0ZXMgcmVtYWluaW5nIGF0IHRoZSBlbmQsIGluc2VydCBuZXcgZnJlZSBzdWJhbGxvY2F0aW9uIGFmdGVyIGN1cnJlbnQgb25lLgorICAgIGlmKHBhZGRpbmdFbmQpCisgICAgeworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uIHBhZGRpbmdTdWJhbGxvYyA9IHt9OworICAgICAgICBwYWRkaW5nU3ViYWxsb2Mub2Zmc2V0ID0gcmVxdWVzdC5vZmZzZXQgKyBhbGxvY1NpemU7CisgICAgICAgIHBhZGRpbmdTdWJhbGxvYy5zaXplID0gcGFkZGluZ0VuZDsKKyAgICAgICAgcGFkZGluZ1N1YmFsbG9jLnR5cGUgPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUU7CisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBuZXh0ID0gcmVxdWVzdC5pdGVtOworICAgICAgICArK25leHQ7CisgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBwYWRkaW5nRW5kSXRlbSA9CisgICAgICAgICAgICBtX1N1YmFsbG9jYXRpb25zLmluc2VydChuZXh0LCBwYWRkaW5nU3ViYWxsb2MpOworICAgICAgICBSZWdpc3RlckZyZWVTdWJhbGxvY2F0aW9uKHBhZGRpbmdFbmRJdGVtKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGZyZWUgYnl0ZXMgcmVtYWluaW5nIGF0IHRoZSBiZWdpbm5pbmcsIGluc2VydCBuZXcgZnJlZSBzdWJhbGxvY2F0aW9uIGJlZm9yZSBjdXJyZW50IG9uZS4KKyAgICBpZihwYWRkaW5nQmVnaW4pCisgICAgeworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uIHBhZGRpbmdTdWJhbGxvYyA9IHt9OworICAgICAgICBwYWRkaW5nU3ViYWxsb2Mub2Zmc2V0ID0gcmVxdWVzdC5vZmZzZXQgLSBwYWRkaW5nQmVnaW47CisgICAgICAgIHBhZGRpbmdTdWJhbGxvYy5zaXplID0gcGFkZGluZ0JlZ2luOworICAgICAgICBwYWRkaW5nU3ViYWxsb2MudHlwZSA9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRTsKKyAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIHBhZGRpbmdCZWdpbkl0ZW0gPQorICAgICAgICAgICAgbV9TdWJhbGxvY2F0aW9ucy5pbnNlcnQocmVxdWVzdC5pdGVtLCBwYWRkaW5nU3ViYWxsb2MpOworICAgICAgICBSZWdpc3RlckZyZWVTdWJhbGxvY2F0aW9uKHBhZGRpbmdCZWdpbkl0ZW0pOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0b3RhbHMuCisgICAgbV9GcmVlQ291bnQgPSBtX0ZyZWVDb3VudCAtIDE7CisgICAgaWYocGFkZGluZ0JlZ2luID4gMCkKKyAgICB7CisgICAgICAgICsrbV9GcmVlQ291bnQ7CisgICAgfQorICAgIGlmKHBhZGRpbmdFbmQgPiAwKQorICAgIHsKKyAgICAgICAgKyttX0ZyZWVDb3VudDsKKyAgICB9CisgICAgbV9TdW1GcmVlU2l6ZSAtPSBhbGxvY1NpemU7Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljOjpGcmVlKGNvbnN0IFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBmb3IoVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIHN1YmFsbG9jSXRlbSA9IG1fU3ViYWxsb2NhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgc3ViYWxsb2NJdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuZW5kKCk7CisgICAgICAgICsrc3ViYWxsb2NJdGVtKQorICAgIHsKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSAqc3ViYWxsb2NJdGVtOworICAgICAgICBpZihzdWJhbGxvYy5oQWxsb2NhdGlvbiA9PSBhbGxvY2F0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBGcmVlU3ViYWxsb2NhdGlvbihzdWJhbGxvY0l0ZW0pOworICAgICAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChWYWxpZGF0ZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBWTUFfQVNTRVJUKDAgJiYgIk5vdCBmb3VuZCEiKTsKK30KKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6OkZyZWVBdE9mZnNldChWa0RldmljZVNpemUgb2Zmc2V0KQoreworICAgIGZvcihWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3Igc3ViYWxsb2NJdGVtID0gbV9TdWJhbGxvY2F0aW9ucy5iZWdpbigpOworICAgICAgICBzdWJhbGxvY0l0ZW0gIT0gbV9TdWJhbGxvY2F0aW9ucy5lbmQoKTsKKyAgICAgICAgKytzdWJhbGxvY0l0ZW0pCisgICAgeworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9ICpzdWJhbGxvY0l0ZW07CisgICAgICAgIGlmKHN1YmFsbG9jLm9mZnNldCA9PSBvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZyZWVTdWJhbGxvY2F0aW9uKHN1YmFsbG9jSXRlbSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgVk1BX0FTU0VSVCgwICYmICJOb3QgZm91bmQhIik7Cit9CisKK2Jvb2wgVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljOjpSZXNpemVBbGxvY2F0aW9uKGNvbnN0IFZtYUFsbG9jYXRpb24gYWxsb2MsIFZrRGV2aWNlU2l6ZSBuZXdTaXplKQoreworICAgIHR5cGVkZWYgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIGl0ZXJfdHlwZTsKKyAgICBmb3IoaXRlcl90eXBlIHN1YmFsbG9jSXRlbSA9IG1fU3ViYWxsb2NhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgc3ViYWxsb2NJdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuZW5kKCk7CisgICAgICAgICsrc3ViYWxsb2NJdGVtKQorICAgIHsKKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSAqc3ViYWxsb2NJdGVtOworICAgICAgICBpZihzdWJhbGxvYy5oQWxsb2NhdGlvbiA9PSBhbGxvYykKKyAgICAgICAgeworICAgICAgICAgICAgaXRlcl90eXBlIG5leHRJdGVtID0gc3ViYWxsb2NJdGVtOworICAgICAgICAgICAgKytuZXh0SXRlbTsKKworICAgICAgICAgICAgLy8gU2hvdWxkIGhhdmUgYmVlbiBlbnN1cmVkIG9uIGhpZ2hlciBsZXZlbC4KKyAgICAgICAgICAgIFZNQV9BU1NFUlQobmV3U2l6ZSAhPSBhbGxvYy0+R2V0U2l6ZSgpICYmIG5ld1NpemUgPiAwKTsKKworICAgICAgICAgICAgLy8gU2hyaW5raW5nLgorICAgICAgICAgICAgaWYobmV3U2l6ZSA8IGFsbG9jLT5HZXRTaXplKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHNpemVEaWZmID0gc3ViYWxsb2Muc2l6ZSAtIG5ld1NpemU7CisKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBuZXh0IGl0ZW0uCisgICAgICAgICAgICAgICAgaWYobmV4dEl0ZW0gIT0gbV9TdWJhbGxvY2F0aW9ucy5lbmQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgaXRlbSBpcyBmcmVlLgorICAgICAgICAgICAgICAgICAgICBpZihuZXh0SXRlbS0+dHlwZSA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyb3cgdGhpcyBuZXh0IGl0ZW0gYmFja3dhcmQuCisgICAgICAgICAgICAgICAgICAgICAgICBVbnJlZ2lzdGVyRnJlZVN1YmFsbG9jYXRpb24obmV4dEl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZW0tPm9mZnNldCAtPSBzaXplRGlmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJdGVtLT5zaXplICs9IHNpemVEaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJGcmVlU3ViYWxsb2NhdGlvbihuZXh0SXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBpdGVtIGlzIG5vdCBmcmVlLgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBmcmVlIGl0ZW0gYWZ0ZXIgY3VycmVudCBvbmUuCisgICAgICAgICAgICAgICAgICAgICAgICBWbWFTdWJhbGxvY2F0aW9uIG5ld0ZyZWVTdWJhbGxvYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZyZWVTdWJhbGxvYy5oQWxsb2NhdGlvbiA9IFZLX05VTExfSEFORExFOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RnJlZVN1YmFsbG9jLm9mZnNldCA9IHN1YmFsbG9jLm9mZnNldCArIG5ld1NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdGcmVlU3ViYWxsb2Muc2l6ZSA9IHNpemVEaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3RnJlZVN1YmFsbG9jLnR5cGUgPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUU7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUgbmV3RnJlZVN1YmFsbG9jSXQgPSBtX1N1YmFsbG9jYXRpb25zLmluc2VydChuZXh0SXRlbSwgbmV3RnJlZVN1YmFsbG9jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRnJlZVN1YmFsbG9jYXRpb24obmV3RnJlZVN1YmFsbG9jSXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICArK21fRnJlZUNvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxhc3QgaXRlbS4KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgZnJlZSBpdGVtIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb24gbmV3RnJlZVN1YmFsbG9jOworICAgICAgICAgICAgICAgICAgICBuZXdGcmVlU3ViYWxsb2MuaEFsbG9jYXRpb24gPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgICAgICAgICAgICAgbmV3RnJlZVN1YmFsbG9jLm9mZnNldCA9IHN1YmFsbG9jLm9mZnNldCArIG5ld1NpemU7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZyZWVTdWJhbGxvYy5zaXplID0gc2l6ZURpZmY7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZyZWVTdWJhbGxvYy50eXBlID0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFOworICAgICAgICAgICAgICAgICAgICBtX1N1YmFsbG9jYXRpb25zLnB1c2hfYmFjayhuZXdGcmVlU3ViYWxsb2MpOworCisgICAgICAgICAgICAgICAgICAgIGl0ZXJfdHlwZSBuZXdGcmVlU3ViYWxsb2NJdCA9IG1fU3ViYWxsb2NhdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRnJlZVN1YmFsbG9jYXRpb24oLS1uZXdGcmVlU3ViYWxsb2NJdCk7CisKKyAgICAgICAgICAgICAgICAgICAgKyttX0ZyZWVDb3VudDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdWJhbGxvYy5zaXplID0gbmV3U2l6ZTsKKyAgICAgICAgICAgICAgICBtX1N1bUZyZWVTaXplICs9IHNpemVEaWZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gR3Jvd2luZy4KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgc2l6ZURpZmYgPSBuZXdTaXplIC0gc3ViYWxsb2Muc2l6ZTsKKworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5leHQgaXRlbS4KKyAgICAgICAgICAgICAgICBpZihuZXh0SXRlbSAhPSBtX1N1YmFsbG9jYXRpb25zLmVuZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBpdGVtIGlzIGZyZWUuCisgICAgICAgICAgICAgICAgICAgIGlmKG5leHRJdGVtLT50eXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIHNwYWNlLCBpbmNsdWRpbmcgbWFyZ2luLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV4dEl0ZW0tPnNpemUgPCBzaXplRGlmZiArIFZNQV9ERUJVR19NQVJHSU4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBtb3JlIGZyZWUgc3BhY2UgdGhhbiByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5leHRJdGVtLT5zaXplID4gc2l6ZURpZmYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBhbmQgc2hyaW5rIHRoaXMgbmV4dCBpdGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmVnaXN0ZXJGcmVlU3ViYWxsb2NhdGlvbihuZXh0SXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZW0tPm9mZnNldCArPSBzaXplRGlmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SXRlbS0+c2l6ZSAtPSBzaXplRGlmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckZyZWVTdWJhbGxvY2F0aW9uKG5leHRJdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGV4YWN0bHkgdGhlIGFtb3VudCBvZiBmcmVlIHNwYWNlIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIG5leHQgZnJlZSBpdGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmVnaXN0ZXJGcmVlU3ViYWxsb2NhdGlvbihuZXh0SXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdWJhbGxvY2F0aW9ucy5lcmFzZShuZXh0SXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1tX0ZyZWVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGl0ZW0gaXMgbm90IGZyZWUgLSB0aGVyZSBpcyBubyBzcGFjZSB0byBncm93LgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGl0ZW0gLSB0aGVyZSBpcyBubyBzcGFjZSB0byBncm93LgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdWJhbGxvYy5zaXplID0gbmV3U2l6ZTsKKyAgICAgICAgICAgICAgICBtX1N1bUZyZWVTaXplIC09IHNpemVEaWZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBjYW5ub3QgY2FsbCBWYWxpZGF0ZSgpIGhlcmUgYmVjYXVzZSBhbGxvYyBvYmplY3QgaXMgdXBkYXRlZCB0byBuZXcgc2l6ZSBvdXRzaWRlIG9mIHRoaXMgY2FsbC4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIFZNQV9BU1NFUlQoMCAmJiAiTm90IGZvdW5kISIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6OlZhbGlkYXRlRnJlZVN1YmFsbG9jYXRpb25MaXN0KCkgY29uc3QKK3sKKyAgICBWa0RldmljZVNpemUgbGFzdFNpemUgPSAwOworICAgIGZvcihzaXplX3QgaSA9IDAsIGNvdW50ID0gbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuc2l6ZSgpOyBpIDwgY291bnQ7ICsraSkKKyAgICB7CisgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdCA9IG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplW2ldOworCisgICAgICAgIFZNQV9WQUxJREFURShpdC0+dHlwZSA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpOworICAgICAgICBWTUFfVkFMSURBVEUoaXQtPnNpemUgPj0gVk1BX01JTl9GUkVFX1NVQkFMTE9DQVRJT05fU0laRV9UT19SRUdJU1RFUik7CisgICAgICAgIFZNQV9WQUxJREFURShpdC0+c2l6ZSA+PSBsYXN0U2l6ZSk7CisgICAgICAgIGxhc3RTaXplID0gaXQtPnNpemU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYzo6Q2hlY2tBbGxvY2F0aW9uKAorICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCwKKyAgICBWa0RldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICBWa0RldmljZVNpemUgYWxsb2NTaXplLAorICAgIFZrRGV2aWNlU2l6ZSBhbGxvY0FsaWdubWVudCwKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBhbGxvY1R5cGUsCisgICAgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIHN1YmFsbG9jSXRlbSwKKyAgICBib29sIGNhbk1ha2VPdGhlckxvc3QsCisgICAgVmtEZXZpY2VTaXplKiBwT2Zmc2V0LAorICAgIHNpemVfdCogaXRlbXNUb01ha2VMb3N0Q291bnQsCisgICAgVmtEZXZpY2VTaXplKiBwU3VtRnJlZVNpemUsCisgICAgVmtEZXZpY2VTaXplKiBwU3VtSXRlbVNpemUpIGNvbnN0Cit7CisgICAgVk1BX0FTU0VSVChhbGxvY1NpemUgPiAwKTsKKyAgICBWTUFfQVNTRVJUKGFsbG9jVHlwZSAhPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpOworICAgIFZNQV9BU1NFUlQoc3ViYWxsb2NJdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuY2VuZCgpKTsKKyAgICBWTUFfQVNTRVJUKHBPZmZzZXQgIT0gVk1BX05VTEwpOworICAgIAorICAgICppdGVtc1RvTWFrZUxvc3RDb3VudCA9IDA7CisgICAgKnBTdW1GcmVlU2l6ZSA9IDA7CisgICAgKnBTdW1JdGVtU2l6ZSA9IDA7CisKKyAgICBpZihjYW5NYWtlT3RoZXJMb3N0KQorICAgIHsKKyAgICAgICAgaWYoc3ViYWxsb2NJdGVtLT50eXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBTdW1GcmVlU2l6ZSA9IHN1YmFsbG9jSXRlbS0+c2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHN1YmFsbG9jSXRlbS0+aEFsbG9jYXRpb24tPkNhbkJlY29tZUxvc3QoKSAmJgorICAgICAgICAgICAgICAgIHN1YmFsbG9jSXRlbS0+aEFsbG9jYXRpb24tPkdldExhc3RVc2VGcmFtZUluZGV4KCkgKyBmcmFtZUluVXNlQ291bnQgPCBjdXJyZW50RnJhbWVJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArKyppdGVtc1RvTWFrZUxvc3RDb3VudDsKKyAgICAgICAgICAgICAgICAqcFN1bUl0ZW1TaXplID0gc3ViYWxsb2NJdGVtLT5zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbWFpbmluZyBzaXplIGlzIHRvbyBzbWFsbCBmb3IgdGhpcyByZXF1ZXN0OiBFYXJseSByZXR1cm4uCisgICAgICAgIGlmKEdldFNpemUoKSAtIHN1YmFsbG9jSXRlbS0+b2Zmc2V0IDwgYWxsb2NTaXplKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBmcm9tIG9mZnNldCBlcXVhbCB0byBiZWdpbm5pbmcgb2YgdGhpcyBzdWJhbGxvY2F0aW9uLgorICAgICAgICAqcE9mZnNldCA9IHN1YmFsbG9jSXRlbS0+b2Zmc2V0OworICAgIAorICAgICAgICAvLyBBcHBseSBWTUFfREVCVUdfTUFSR0lOIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgICAgIGlmKFZNQV9ERUJVR19NQVJHSU4gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICAqcE9mZnNldCArPSBWTUFfREVCVUdfTUFSR0lOOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIEFwcGx5IGFsaWdubWVudC4KKyAgICAgICAgKnBPZmZzZXQgPSBWbWFBbGlnblVwKCpwT2Zmc2V0LCBhbGxvY0FsaWdubWVudCk7CisKKyAgICAgICAgLy8gQ2hlY2sgcHJldmlvdXMgc3ViYWxsb2NhdGlvbnMgZm9yIEJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgY29uZmxpY3RzLgorICAgICAgICAvLyBNYWtlIGJpZ2dlciBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LgorICAgICAgICBpZihidWZmZXJJbWFnZUdyYW51bGFyaXR5ID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBidWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0Ojpjb25zdF9pdGVyYXRvciBwcmV2U3ViYWxsb2NJdGVtID0gc3ViYWxsb2NJdGVtOworICAgICAgICAgICAgd2hpbGUocHJldlN1YmFsbG9jSXRlbSAhPSBtX1N1YmFsbG9jYXRpb25zLmNiZWdpbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC0tcHJldlN1YmFsbG9jSXRlbTsKKyAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBwcmV2U3ViYWxsb2MgPSAqcHJldlN1YmFsbG9jSXRlbTsKKyAgICAgICAgICAgICAgICBpZihWbWFCbG9ja3NPblNhbWVQYWdlKHByZXZTdWJhbGxvYy5vZmZzZXQsIHByZXZTdWJhbGxvYy5zaXplLCAqcE9mZnNldCwgYnVmZmVySW1hZ2VHcmFudWxhcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihWbWFJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdChwcmV2U3ViYWxsb2MudHlwZSwgYWxsb2NUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBvbiBwcmV2aW91cyBwYWdlLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGJ1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcE9mZnNldCA9IFZtYUFsaWduVXAoKnBPZmZzZXQsIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgCisgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZmluYWwgKnBPZmZzZXQsIGNoZWNrIGlmIHdlIGFyZSBwYXN0IHN1YmFsbG9jSXRlbS4KKyAgICAgICAgLy8gSWYgeWVzLCByZXR1cm4gZmFsc2UgLSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZm9yIGFub3RoZXIgc3ViYWxsb2NJdGVtIGFzIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICBpZigqcE9mZnNldCA+PSBzdWJhbGxvY0l0ZW0tPm9mZnNldCArIHN1YmFsbG9jSXRlbS0+c2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIENhbGN1bGF0ZSBwYWRkaW5nIGF0IHRoZSBiZWdpbm5pbmcgYmFzZWQgb24gY3VycmVudCBvZmZzZXQuCisgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBwYWRkaW5nQmVnaW4gPSAqcE9mZnNldCAtIHN1YmFsbG9jSXRlbS0+b2Zmc2V0OworCisgICAgICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBtYXJnaW4gYXQgdGhlIGVuZC4KKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHJlcXVpcmVkRW5kTWFyZ2luID0gVk1BX0RFQlVHX01BUkdJTjsKKworICAgICAgICBjb25zdCBWa0RldmljZVNpemUgdG90YWxTaXplID0gcGFkZGluZ0JlZ2luICsgYWxsb2NTaXplICsgcmVxdWlyZWRFbmRNYXJnaW47CisgICAgICAgIC8vIEFub3RoZXIgZWFybHkgcmV0dXJuIGNoZWNrLgorICAgICAgICBpZihzdWJhbGxvY0l0ZW0tPm9mZnNldCArIHRvdGFsU2l6ZSA+IEdldFNpemUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWR2YW5jZSBsYXN0U3ViYWxsb2NJdGVtIHVudGlsIGRlc2lyZWQgc2l6ZSBpcyByZWFjaGVkLgorICAgICAgICAvLyBVcGRhdGUgaXRlbXNUb01ha2VMb3N0Q291bnQuCisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0Ojpjb25zdF9pdGVyYXRvciBsYXN0U3ViYWxsb2NJdGVtID0gc3ViYWxsb2NJdGVtOworICAgICAgICBpZih0b3RhbFNpemUgPiBzdWJhbGxvY0l0ZW0tPnNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSByZW1haW5pbmdTaXplID0gdG90YWxTaXplIC0gc3ViYWxsb2NJdGVtLT5zaXplOworICAgICAgICAgICAgd2hpbGUocmVtYWluaW5nU2l6ZSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytsYXN0U3ViYWxsb2NJdGVtOworICAgICAgICAgICAgICAgIGlmKGxhc3RTdWJhbGxvY0l0ZW0gPT0gbV9TdWJhbGxvY2F0aW9ucy5jZW5kKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGxhc3RTdWJhbGxvY0l0ZW0tPnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBTdW1GcmVlU2l6ZSArPSBsYXN0U3ViYWxsb2NJdGVtLT5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKGxhc3RTdWJhbGxvY0l0ZW0tPmhBbGxvY2F0aW9uICE9IFZLX05VTExfSEFORExFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobGFzdFN1YmFsbG9jSXRlbS0+aEFsbG9jYXRpb24tPkNhbkJlY29tZUxvc3QoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFN1YmFsbG9jSXRlbS0+aEFsbG9jYXRpb24tPkdldExhc3RVc2VGcmFtZUluZGV4KCkgKyBmcmFtZUluVXNlQ291bnQgPCBjdXJyZW50RnJhbWVJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKysqaXRlbXNUb01ha2VMb3N0Q291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqcFN1bUl0ZW1TaXplICs9IGxhc3RTdWJhbGxvY0l0ZW0tPnNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtYWluaW5nU2l6ZSA9IChsYXN0U3ViYWxsb2NJdGVtLT5zaXplIDwgcmVtYWluaW5nU2l6ZSkgPworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTaXplIC0gbGFzdFN1YmFsbG9jSXRlbS0+c2l6ZSA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBuZXh0IHN1YmFsbG9jYXRpb25zIGZvciBCdWZmZXJJbWFnZUdyYW51bGFyaXR5IGNvbmZsaWN0cy4KKyAgICAgICAgLy8gSWYgY29uZmxpY3QgZXhpc3RzLCB3ZSBtdXN0IG1hcmsgbW9yZSBhbGxvY2F0aW9ucyBsb3N0IG9yIGZhaWwuCisgICAgICAgIGlmKGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICBWbWFTdWJhbGxvY2F0aW9uTGlzdDo6Y29uc3RfaXRlcmF0b3IgbmV4dFN1YmFsbG9jSXRlbSA9IGxhc3RTdWJhbGxvY0l0ZW07CisgICAgICAgICAgICArK25leHRTdWJhbGxvY0l0ZW07CisgICAgICAgICAgICB3aGlsZShuZXh0U3ViYWxsb2NJdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuY2VuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIG5leHRTdWJhbGxvYyA9ICpuZXh0U3ViYWxsb2NJdGVtOworICAgICAgICAgICAgICAgIGlmKFZtYUJsb2Nrc09uU2FtZVBhZ2UoKnBPZmZzZXQsIGFsbG9jU2l6ZSwgbmV4dFN1YmFsbG9jLm9mZnNldCwgYnVmZmVySW1hZ2VHcmFudWxhcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihWbWFJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdChhbGxvY1R5cGUsIG5leHRTdWJhbGxvYy50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVk1BX0FTU0VSVChuZXh0U3ViYWxsb2MuaEFsbG9jYXRpb24gIT0gVktfTlVMTF9IQU5ETEUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV4dFN1YmFsbG9jLmhBbGxvY2F0aW9uLT5DYW5CZWNvbWVMb3N0KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3ViYWxsb2MuaEFsbG9jYXRpb24tPkdldExhc3RVc2VGcmFtZUluZGV4KCkgKyBmcmFtZUluVXNlQ291bnQgPCBjdXJyZW50RnJhbWVJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyppdGVtc1RvTWFrZUxvc3RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBvbiBuZXh0IHBhZ2UuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK25leHRTdWJhbGxvY0l0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSAqc3ViYWxsb2NJdGVtOworICAgICAgICBWTUFfQVNTRVJUKHN1YmFsbG9jLnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKTsKKworICAgICAgICAqcFN1bUZyZWVTaXplID0gc3ViYWxsb2Muc2l6ZTsKKworICAgICAgICAvLyBTaXplIG9mIHRoaXMgc3ViYWxsb2NhdGlvbiBpcyB0b28gc21hbGwgZm9yIHRoaXMgcmVxdWVzdDogRWFybHkgcmV0dXJuLgorICAgICAgICBpZihzdWJhbGxvYy5zaXplIDwgYWxsb2NTaXplKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBmcm9tIG9mZnNldCBlcXVhbCB0byBiZWdpbm5pbmcgb2YgdGhpcyBzdWJhbGxvY2F0aW9uLgorICAgICAgICAqcE9mZnNldCA9IHN1YmFsbG9jLm9mZnNldDsKKyAgICAKKyAgICAgICAgLy8gQXBwbHkgVk1BX0RFQlVHX01BUkdJTiBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAgICBpZihWTUFfREVCVUdfTUFSR0lOID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPZmZzZXQgKz0gVk1BX0RFQlVHX01BUkdJTjsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBBcHBseSBhbGlnbm1lbnQuCisgICAgICAgICpwT2Zmc2V0ID0gVm1hQWxpZ25VcCgqcE9mZnNldCwgYWxsb2NBbGlnbm1lbnQpOworICAgIAorICAgICAgICAvLyBDaGVjayBwcmV2aW91cyBzdWJhbGxvY2F0aW9ucyBmb3IgQnVmZmVySW1hZ2VHcmFudWxhcml0eSBjb25mbGljdHMuCisgICAgICAgIC8vIE1ha2UgYmlnZ2VyIGFsaWdubWVudCBpZiBuZWNlc3NhcnkuCisgICAgICAgIGlmKGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdCA9IGZhbHNlOworICAgICAgICAgICAgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIHByZXZTdWJhbGxvY0l0ZW0gPSBzdWJhbGxvY0l0ZW07CisgICAgICAgICAgICB3aGlsZShwcmV2U3ViYWxsb2NJdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuY2JlZ2luKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1wcmV2U3ViYWxsb2NJdGVtOworICAgICAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHByZXZTdWJhbGxvYyA9ICpwcmV2U3ViYWxsb2NJdGVtOworICAgICAgICAgICAgICAgIGlmKFZtYUJsb2Nrc09uU2FtZVBhZ2UocHJldlN1YmFsbG9jLm9mZnNldCwgcHJldlN1YmFsbG9jLnNpemUsICpwT2Zmc2V0LCBidWZmZXJJbWFnZUdyYW51bGFyaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKFZtYUlzQnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0KHByZXZTdWJhbGxvYy50eXBlLCBhbGxvY1R5cGUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IG9uIHByZXZpb3VzIHBhZ2UuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwT2Zmc2V0ID0gVm1hQWxpZ25VcCgqcE9mZnNldCwgYnVmZmVySW1hZ2VHcmFudWxhcml0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHBhZGRpbmcgYXQgdGhlIGJlZ2lubmluZyBiYXNlZCBvbiBjdXJyZW50IG9mZnNldC4KKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHBhZGRpbmdCZWdpbiA9ICpwT2Zmc2V0IC0gc3ViYWxsb2Mub2Zmc2V0OworCisgICAgICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBtYXJnaW4gYXQgdGhlIGVuZC4KKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHJlcXVpcmVkRW5kTWFyZ2luID0gVk1BX0RFQlVHX01BUkdJTjsKKworICAgICAgICAvLyBGYWlsIGlmIHJlcXVlc3RlZCBzaXplIHBsdXMgbWFyZ2luIGJlZm9yZSBhbmQgYWZ0ZXIgaXMgYmlnZ2VyIHRoYW4gc2l6ZSBvZiB0aGlzIHN1YmFsbG9jYXRpb24uCisgICAgICAgIGlmKHBhZGRpbmdCZWdpbiArIGFsbG9jU2l6ZSArIHJlcXVpcmVkRW5kTWFyZ2luID4gc3ViYWxsb2Muc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgbmV4dCBzdWJhbGxvY2F0aW9ucyBmb3IgQnVmZmVySW1hZ2VHcmFudWxhcml0eSBjb25mbGljdHMuCisgICAgICAgIC8vIElmIGNvbmZsaWN0IGV4aXN0cywgYWxsb2NhdGlvbiBjYW5ub3QgYmUgbWFkZSBoZXJlLgorICAgICAgICBpZihidWZmZXJJbWFnZUdyYW51bGFyaXR5ID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIG5leHRTdWJhbGxvY0l0ZW0gPSBzdWJhbGxvY0l0ZW07CisgICAgICAgICAgICArK25leHRTdWJhbGxvY0l0ZW07CisgICAgICAgICAgICB3aGlsZShuZXh0U3ViYWxsb2NJdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuY2VuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIG5leHRTdWJhbGxvYyA9ICpuZXh0U3ViYWxsb2NJdGVtOworICAgICAgICAgICAgICAgIGlmKFZtYUJsb2Nrc09uU2FtZVBhZ2UoKnBPZmZzZXQsIGFsbG9jU2l6ZSwgbmV4dFN1YmFsbG9jLm9mZnNldCwgYnVmZmVySW1hZ2VHcmFudWxhcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihWbWFJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdChhbGxvY1R5cGUsIG5leHRTdWJhbGxvYy50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgb24gbmV4dCBwYWdlLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytuZXh0U3ViYWxsb2NJdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWxsIHRlc3RzIHBhc3NlZDogU3VjY2Vzcy4gcE9mZnNldCBpcyBhbHJlYWR5IGZpbGxlZC4KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6Ok1lcmdlRnJlZVdpdGhOZXh0KFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdGVtKQoreworICAgIFZNQV9BU1NFUlQoaXRlbSAhPSBtX1N1YmFsbG9jYXRpb25zLmVuZCgpKTsKKyAgICBWTUFfQVNTRVJUKGl0ZW0tPnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKTsKKyAgICAKKyAgICBWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3IgbmV4dEl0ZW0gPSBpdGVtOworICAgICsrbmV4dEl0ZW07CisgICAgVk1BX0FTU0VSVChuZXh0SXRlbSAhPSBtX1N1YmFsbG9jYXRpb25zLmVuZCgpKTsKKyAgICBWTUFfQVNTRVJUKG5leHRJdGVtLT50eXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSk7CisKKyAgICBpdGVtLT5zaXplICs9IG5leHRJdGVtLT5zaXplOworICAgIC0tbV9GcmVlQ291bnQ7CisgICAgbV9TdWJhbGxvY2F0aW9ucy5lcmFzZShuZXh0SXRlbSk7Cit9CisKK1ZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6OkZyZWVTdWJhbGxvY2F0aW9uKFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBzdWJhbGxvY0l0ZW0pCit7CisgICAgLy8gQ2hhbmdlIHRoaXMgc3ViYWxsb2NhdGlvbiB0byBiZSBtYXJrZWQgYXMgZnJlZS4KKyAgICBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9ICpzdWJhbGxvY0l0ZW07CisgICAgc3ViYWxsb2MudHlwZSA9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRTsKKyAgICBzdWJhbGxvYy5oQWxsb2NhdGlvbiA9IFZLX05VTExfSEFORExFOworICAgIAorICAgIC8vIFVwZGF0ZSB0b3RhbHMuCisgICAgKyttX0ZyZWVDb3VudDsKKyAgICBtX1N1bUZyZWVTaXplICs9IHN1YmFsbG9jLnNpemU7CisKKyAgICAvLyBNZXJnZSB3aXRoIHByZXZpb3VzIGFuZC9vciBuZXh0IHN1YmFsbG9jYXRpb24gaWYgaXQncyBhbHNvIGZyZWUuCisgICAgYm9vbCBtZXJnZVdpdGhOZXh0ID0gZmFsc2U7CisgICAgYm9vbCBtZXJnZVdpdGhQcmV2ID0gZmFsc2U7CisgICAgCisgICAgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIG5leHRJdGVtID0gc3ViYWxsb2NJdGVtOworICAgICsrbmV4dEl0ZW07CisgICAgaWYoKG5leHRJdGVtICE9IG1fU3ViYWxsb2NhdGlvbnMuZW5kKCkpICYmIChuZXh0SXRlbS0+dHlwZSA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpKQorICAgIHsKKyAgICAgICAgbWVyZ2VXaXRoTmV4dCA9IHRydWU7CisgICAgfQorCisgICAgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIHByZXZJdGVtID0gc3ViYWxsb2NJdGVtOworICAgIGlmKHN1YmFsbG9jSXRlbSAhPSBtX1N1YmFsbG9jYXRpb25zLmJlZ2luKCkpCisgICAgeworICAgICAgICAtLXByZXZJdGVtOworICAgICAgICBpZihwcmV2SXRlbS0+dHlwZSA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lcmdlV2l0aFByZXYgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYobWVyZ2VXaXRoTmV4dCkKKyAgICB7CisgICAgICAgIFVucmVnaXN0ZXJGcmVlU3ViYWxsb2NhdGlvbihuZXh0SXRlbSk7CisgICAgICAgIE1lcmdlRnJlZVdpdGhOZXh0KHN1YmFsbG9jSXRlbSk7CisgICAgfQorCisgICAgaWYobWVyZ2VXaXRoUHJldikKKyAgICB7CisgICAgICAgIFVucmVnaXN0ZXJGcmVlU3ViYWxsb2NhdGlvbihwcmV2SXRlbSk7CisgICAgICAgIE1lcmdlRnJlZVdpdGhOZXh0KHByZXZJdGVtKTsKKyAgICAgICAgUmVnaXN0ZXJGcmVlU3ViYWxsb2NhdGlvbihwcmV2SXRlbSk7CisgICAgICAgIHJldHVybiBwcmV2SXRlbTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUmVnaXN0ZXJGcmVlU3ViYWxsb2NhdGlvbihzdWJhbGxvY0l0ZW0pOworICAgICAgICByZXR1cm4gc3ViYWxsb2NJdGVtOworICAgIH0KK30KKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWM6OlJlZ2lzdGVyRnJlZVN1YmFsbG9jYXRpb24oVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIGl0ZW0pCit7CisgICAgVk1BX0FTU0VSVChpdGVtLT50eXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSk7CisgICAgVk1BX0FTU0VSVChpdGVtLT5zaXplID4gMCk7CisKKyAgICAvLyBZb3UgbWF5IHdhbnQgdG8gZW5hYmxlIHRoaXMgdmFsaWRhdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9yIGF0IHRoZSBlbmQgb2YKKyAgICAvLyB0aGlzIGZ1bmN0aW9uLCBkZXBlbmRpbmcgb24gd2hhdCBkbyB5b3Ugd2FudCB0byBjaGVjay4KKyAgICBWTUFfSEVBVllfQVNTRVJUKFZhbGlkYXRlRnJlZVN1YmFsbG9jYXRpb25MaXN0KCkpOworCisgICAgaWYoaXRlbS0+c2l6ZSA+PSBWTUFfTUlOX0ZSRUVfU1VCQUxMT0NBVElPTl9TSVpFX1RPX1JFR0lTVEVSKQorICAgIHsKKyAgICAgICAgaWYobV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUucHVzaF9iYWNrKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVm1hVmVjdG9ySW5zZXJ0U29ydGVkPFZtYVN1YmFsbG9jYXRpb25JdGVtU2l6ZUxlc3M+KG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vVk1BX0hFQVZZX0FTU0VSVChWYWxpZGF0ZUZyZWVTdWJhbGxvY2F0aW9uTGlzdCgpKTsKK30KKworCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYzo6VW5yZWdpc3RlckZyZWVTdWJhbGxvY2F0aW9uKFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdGVtKQoreworICAgIFZNQV9BU1NFUlQoaXRlbS0+dHlwZSA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpOworICAgIFZNQV9BU1NFUlQoaXRlbS0+c2l6ZSA+IDApOworCisgICAgLy8gWW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGlzIHZhbGlkYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvciBhdCB0aGUgZW5kIG9mCisgICAgLy8gdGhpcyBmdW5jdGlvbiwgZGVwZW5kaW5nIG9uIHdoYXQgZG8geW91IHdhbnQgdG8gY2hlY2suCisgICAgVk1BX0hFQVZZX0FTU0VSVChWYWxpZGF0ZUZyZWVTdWJhbGxvY2F0aW9uTGlzdCgpKTsKKworICAgIGlmKGl0ZW0tPnNpemUgPj0gVk1BX01JTl9GUkVFX1NVQkFMTE9DQVRJT05fU0laRV9UT19SRUdJU1RFUikKKyAgICB7CisgICAgICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciogY29uc3QgaXQgPSBWbWFCaW5hcnlGaW5kRmlyc3ROb3RMZXNzKAorICAgICAgICAgICAgbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuZGF0YSgpLAorICAgICAgICAgICAgbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuZGF0YSgpICsgbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuc2l6ZSgpLAorICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb25JdGVtU2l6ZUxlc3MoKSk7CisgICAgICAgIGZvcihzaXplX3QgaW5kZXggPSBpdCAtIG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLmRhdGEoKTsKKyAgICAgICAgICAgIGluZGV4IDwgbV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuc2l6ZSgpOworICAgICAgICAgICAgKytpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYobV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemVbaW5kZXhdID09IGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVm1hVmVjdG9yUmVtb3ZlKG1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLCBpbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVk1BX0FTU0VSVCgobV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemVbaW5kZXhdLT5zaXplID09IGl0ZW0tPnNpemUpICYmICJOb3QgZm91bmQuIik7CisgICAgICAgIH0KKyAgICAgICAgVk1BX0FTU0VSVCgwICYmICJOb3QgZm91bmQuIik7CisgICAgfQorCisgICAgLy9WTUFfSEVBVllfQVNTRVJUKFZhbGlkYXRlRnJlZVN1YmFsbG9jYXRpb25MaXN0KCkpOworfQorCitib29sIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYzo6SXNCdWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3RQb3NzaWJsZSgKKyAgICBWa0RldmljZVNpemUgYnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSYgaW5PdXRQcmV2U3ViYWxsb2NUeXBlKSBjb25zdAoreworICAgIGlmKGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgPT0gMSB8fCBJc0VtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVmtEZXZpY2VTaXplIG1pbkFsaWdubWVudCA9IFZLX1dIT0xFX1NJWkU7CisgICAgYm9vbCB0eXBlQ29uZmxpY3RGb3VuZCA9IGZhbHNlOworICAgIGZvcihWbWFTdWJhbGxvY2F0aW9uTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX1N1YmFsbG9jYXRpb25zLmNiZWdpbigpOworICAgICAgICBpdCAhPSBtX1N1YmFsbG9jYXRpb25zLmNlbmQoKTsKKyAgICAgICAgKytpdCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb25UeXBlIHN1YmFsbG9jVHlwZSA9IGl0LT50eXBlOworICAgICAgICBpZihzdWJhbGxvY1R5cGUgIT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKQorICAgICAgICB7CisgICAgICAgICAgICBtaW5BbGlnbm1lbnQgPSBWTUFfTUlOKG1pbkFsaWdubWVudCwgaXQtPmhBbGxvY2F0aW9uLT5HZXRBbGlnbm1lbnQoKSk7CisgICAgICAgICAgICBpZihWbWFJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdChpbk91dFByZXZTdWJhbGxvY1R5cGUsIHN1YmFsbG9jVHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZUNvbmZsaWN0Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5PdXRQcmV2U3ViYWxsb2NUeXBlID0gc3ViYWxsb2NUeXBlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHR5cGVDb25mbGljdEZvdW5kIHx8IG1pbkFsaWdubWVudCA+PSBidWZmZXJJbWFnZUdyYW51bGFyaXR5OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gY2xhc3MgVm1hQmxvY2tNZXRhZGF0YV9MaW5lYXIKKworVm1hQmxvY2tNZXRhZGF0YV9MaW5lYXI6OlZtYUJsb2NrTWV0YWRhdGFfTGluZWFyKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yKSA6CisgICAgVm1hQmxvY2tNZXRhZGF0YShoQWxsb2NhdG9yKSwKKyAgICBtX1N1bUZyZWVTaXplKDApLAorICAgIG1fU3ViYWxsb2NhdGlvbnMwKFZtYVN0bEFsbG9jYXRvcjxWbWFTdWJhbGxvY2F0aW9uPihoQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKSwKKyAgICBtX1N1YmFsbG9jYXRpb25zMShWbWFTdGxBbGxvY2F0b3I8Vm1hU3ViYWxsb2NhdGlvbj4oaEFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpKSksCisgICAgbV8xc3RWZWN0b3JJbmRleCgwKSwKKyAgICBtXzJuZFZlY3Rvck1vZGUoU0VDT05EX1ZFQ1RPUl9FTVBUWSksCisgICAgbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50KDApLAorICAgIG1fMXN0TnVsbEl0ZW1zTWlkZGxlQ291bnQoMCksCisgICAgbV8ybmROdWxsSXRlbXNDb3VudCgwKQoreworfQorCitWbWFCbG9ja01ldGFkYXRhX0xpbmVhcjo6flZtYUJsb2NrTWV0YWRhdGFfTGluZWFyKCkKK3sKK30KKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0xpbmVhcjo6SW5pdChWa0RldmljZVNpemUgc2l6ZSkKK3sKKyAgICBWbWFCbG9ja01ldGFkYXRhOjpJbml0KHNpemUpOworICAgIG1fU3VtRnJlZVNpemUgPSBzaXplOworfQorCitib29sIFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpWYWxpZGF0ZSgpIGNvbnN0Cit7CisgICAgY29uc3QgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMXN0ID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMxc3QoKTsKKyAgICBjb25zdCBTdWJhbGxvY2F0aW9uVmVjdG9yVHlwZSYgc3ViYWxsb2NhdGlvbnMybmQgPSBBY2Nlc3NTdWJhbGxvY2F0aW9uczJuZCgpOworCisgICAgVk1BX1ZBTElEQVRFKHN1YmFsbG9jYXRpb25zMm5kLmVtcHR5KCkgPT0gKG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX0VNUFRZKSk7CisgICAgVk1BX1ZBTElEQVRFKCFzdWJhbGxvY2F0aW9uczFzdC5lbXB0eSgpIHx8CisgICAgICAgIHN1YmFsbG9jYXRpb25zMm5kLmVtcHR5KCkgfHwKKyAgICAgICAgbV8ybmRWZWN0b3JNb2RlICE9IFNFQ09ORF9WRUNUT1JfUklOR19CVUZGRVIpOworCisgICAgaWYoIXN1YmFsbG9jYXRpb25zMXN0LmVtcHR5KCkpCisgICAgeworICAgICAgICAvLyBOdWxsIGl0ZW0gYXQgdGhlIGJlZ2lubmluZyBzaG91bGQgYmUgYWNjb3VudGVkIGludG8gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50LgorICAgICAgICBWTUFfVkFMSURBVEUoc3ViYWxsb2NhdGlvbnMxc3RbbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50XS5oQWxsb2NhdGlvbiAhPSBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIC8vIE51bGwgaXRlbSBhdCB0aGUgZW5kIHNob3VsZCBiZSBqdXN0IHBvcF9iYWNrKCkuCisgICAgICAgIFZNQV9WQUxJREFURShzdWJhbGxvY2F0aW9uczFzdC5iYWNrKCkuaEFsbG9jYXRpb24gIT0gVktfTlVMTF9IQU5ETEUpOworICAgIH0KKyAgICBpZighc3ViYWxsb2NhdGlvbnMybmQuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIC8vIE51bGwgaXRlbSBhdCB0aGUgZW5kIHNob3VsZCBiZSBqdXN0IHBvcF9iYWNrKCkuCisgICAgICAgIFZNQV9WQUxJREFURShzdWJhbGxvY2F0aW9uczJuZC5iYWNrKCkuaEFsbG9jYXRpb24gIT0gVktfTlVMTF9IQU5ETEUpOworICAgIH0KKworICAgIFZNQV9WQUxJREFURShtXzFzdE51bGxJdGVtc0JlZ2luQ291bnQgKyBtXzFzdE51bGxJdGVtc01pZGRsZUNvdW50IDw9IHN1YmFsbG9jYXRpb25zMXN0LnNpemUoKSk7CisgICAgVk1BX1ZBTElEQVRFKG1fMm5kTnVsbEl0ZW1zQ291bnQgPD0gc3ViYWxsb2NhdGlvbnMybmQuc2l6ZSgpKTsKKworICAgIFZrRGV2aWNlU2l6ZSBzdW1Vc2VkU2l6ZSA9IDA7CisgICAgY29uc3Qgc2l6ZV90IHN1YmFsbG9jMXN0Q291bnQgPSBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCk7CisgICAgVmtEZXZpY2VTaXplIG9mZnNldCA9IFZNQV9ERUJVR19NQVJHSU47CisKKyAgICBpZihtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9SSU5HX0JVRkZFUikKKyAgICB7CisgICAgICAgIGNvbnN0IHNpemVfdCBzdWJhbGxvYzJuZENvdW50ID0gc3ViYWxsb2NhdGlvbnMybmQuc2l6ZSgpOworICAgICAgICBzaXplX3QgbnVsbEl0ZW0ybmRDb3VudCA9IDA7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzdWJhbGxvYzJuZENvdW50OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMybmRbaV07CisgICAgICAgICAgICBjb25zdCBib29sIGN1cnJGcmVlID0gKHN1YmFsbG9jLnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKTsKKworICAgICAgICAgICAgVk1BX1ZBTElEQVRFKGN1cnJGcmVlID09IChzdWJhbGxvYy5oQWxsb2NhdGlvbiA9PSBWS19OVUxMX0hBTkRMRSkpOworICAgICAgICAgICAgVk1BX1ZBTElEQVRFKHN1YmFsbG9jLm9mZnNldCA+PSBvZmZzZXQpOworCisgICAgICAgICAgICBpZighY3VyckZyZWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk1BX1ZBTElEQVRFKHN1YmFsbG9jLmhBbGxvY2F0aW9uLT5HZXRPZmZzZXQoKSA9PSBzdWJhbGxvYy5vZmZzZXQpOworICAgICAgICAgICAgICAgIFZNQV9WQUxJREFURShzdWJhbGxvYy5oQWxsb2NhdGlvbi0+R2V0U2l6ZSgpID09IHN1YmFsbG9jLnNpemUpOworICAgICAgICAgICAgICAgIHN1bVVzZWRTaXplICs9IHN1YmFsbG9jLnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytudWxsSXRlbTJuZENvdW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgPSBzdWJhbGxvYy5vZmZzZXQgKyBzdWJhbGxvYy5zaXplICsgVk1BX0RFQlVHX01BUkdJTjsKKyAgICAgICAgfQorCisgICAgICAgIFZNQV9WQUxJREFURShudWxsSXRlbTJuZENvdW50ID09IG1fMm5kTnVsbEl0ZW1zQ291bnQpOworICAgIH0KKworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtXzFzdE51bGxJdGVtc0JlZ2luQ291bnQ7ICsraSkKKyAgICB7CisgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMxc3RbaV07CisgICAgICAgIFZNQV9WQUxJREFURShzdWJhbGxvYy50eXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSAmJgorICAgICAgICAgICAgc3ViYWxsb2MuaEFsbG9jYXRpb24gPT0gVktfTlVMTF9IQU5ETEUpOworICAgIH0KKworICAgIHNpemVfdCBudWxsSXRlbTFzdENvdW50ID0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50OworCisgICAgZm9yKHNpemVfdCBpID0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50OyBpIDwgc3ViYWxsb2Mxc3RDb3VudDsgKytpKQorICAgIHsKKyAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczFzdFtpXTsKKyAgICAgICAgY29uc3QgYm9vbCBjdXJyRnJlZSA9IChzdWJhbGxvYy50eXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSk7CisKKyAgICAgICAgVk1BX1ZBTElEQVRFKGN1cnJGcmVlID09IChzdWJhbGxvYy5oQWxsb2NhdGlvbiA9PSBWS19OVUxMX0hBTkRMRSkpOworICAgICAgICBWTUFfVkFMSURBVEUoc3ViYWxsb2Mub2Zmc2V0ID49IG9mZnNldCk7CisgICAgICAgIFZNQV9WQUxJREFURShpID49IG1fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudCB8fCBjdXJyRnJlZSk7CisKKyAgICAgICAgaWYoIWN1cnJGcmVlKQorICAgICAgICB7CisgICAgICAgICAgICBWTUFfVkFMSURBVEUoc3ViYWxsb2MuaEFsbG9jYXRpb24tPkdldE9mZnNldCgpID09IHN1YmFsbG9jLm9mZnNldCk7CisgICAgICAgICAgICBWTUFfVkFMSURBVEUoc3ViYWxsb2MuaEFsbG9jYXRpb24tPkdldFNpemUoKSA9PSBzdWJhbGxvYy5zaXplKTsKKyAgICAgICAgICAgIHN1bVVzZWRTaXplICs9IHN1YmFsbG9jLnNpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICArK251bGxJdGVtMXN0Q291bnQ7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgPSBzdWJhbGxvYy5vZmZzZXQgKyBzdWJhbGxvYy5zaXplICsgVk1BX0RFQlVHX01BUkdJTjsKKyAgICB9CisgICAgVk1BX1ZBTElEQVRFKG51bGxJdGVtMXN0Q291bnQgPT0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50ICsgbV8xc3ROdWxsSXRlbXNNaWRkbGVDb3VudCk7CisKKyAgICBpZihtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9ET1VCTEVfU1RBQ0spCisgICAgeworICAgICAgICBjb25zdCBzaXplX3Qgc3ViYWxsb2MybmRDb3VudCA9IHN1YmFsbG9jYXRpb25zMm5kLnNpemUoKTsKKyAgICAgICAgc2l6ZV90IG51bGxJdGVtMm5kQ291bnQgPSAwOworICAgICAgICBmb3Ioc2l6ZV90IGkgPSBzdWJhbGxvYzJuZENvdW50OyBpLS07ICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczJuZFtpXTsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgY3VyckZyZWUgPSAoc3ViYWxsb2MudHlwZSA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpOworCisgICAgICAgICAgICBWTUFfVkFMSURBVEUoY3VyckZyZWUgPT0gKHN1YmFsbG9jLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKSk7CisgICAgICAgICAgICBWTUFfVkFMSURBVEUoc3ViYWxsb2Mub2Zmc2V0ID49IG9mZnNldCk7CisKKyAgICAgICAgICAgIGlmKCFjdXJyRnJlZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWTUFfVkFMSURBVEUoc3ViYWxsb2MuaEFsbG9jYXRpb24tPkdldE9mZnNldCgpID09IHN1YmFsbG9jLm9mZnNldCk7CisgICAgICAgICAgICAgICAgVk1BX1ZBTElEQVRFKHN1YmFsbG9jLmhBbGxvY2F0aW9uLT5HZXRTaXplKCkgPT0gc3ViYWxsb2Muc2l6ZSk7CisgICAgICAgICAgICAgICAgc3VtVXNlZFNpemUgKz0gc3ViYWxsb2Muc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK251bGxJdGVtMm5kQ291bnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCA9IHN1YmFsbG9jLm9mZnNldCArIHN1YmFsbG9jLnNpemUgKyBWTUFfREVCVUdfTUFSR0lOOworICAgICAgICB9CisKKyAgICAgICAgVk1BX1ZBTElEQVRFKG51bGxJdGVtMm5kQ291bnQgPT0gbV8ybmROdWxsSXRlbXNDb3VudCk7CisgICAgfQorCisgICAgVk1BX1ZBTElEQVRFKG9mZnNldCA8PSBHZXRTaXplKCkpOworICAgIFZNQV9WQUxJREFURShtX1N1bUZyZWVTaXplID09IEdldFNpemUoKSAtIHN1bVVzZWRTaXplKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzaXplX3QgVm1hQmxvY2tNZXRhZGF0YV9MaW5lYXI6OkdldEFsbG9jYXRpb25Db3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCkuc2l6ZSgpIC0gKG1fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudCArIG1fMXN0TnVsbEl0ZW1zTWlkZGxlQ291bnQpICsKKyAgICAgICAgQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKS5zaXplKCkgLSBtXzJuZE51bGxJdGVtc0NvdW50OworfQorCitWa0RldmljZVNpemUgVm1hQmxvY2tNZXRhZGF0YV9MaW5lYXI6OkdldFVudXNlZFJhbmdlU2l6ZU1heCgpIGNvbnN0Cit7CisgICAgY29uc3QgVmtEZXZpY2VTaXplIHNpemUgPSBHZXRTaXplKCk7CisKKyAgICAvKgorICAgIFdlIGRvbid0IGNvbnNpZGVyIGdhcHMgaW5zaWRlIGFsbG9jYXRpb24gdmVjdG9ycyB3aXRoIGZyZWVkIGFsbG9jYXRpb25zIGJlY2F1c2UKKyAgICB0aGV5IGFyZSBub3Qgc3VpdGFibGUgZm9yIHJldXNlIGluIGxpbmVhciBhbGxvY2F0b3IuIFdlIGNvbnNpZGVyIG9ubHkgc3BhY2UgdGhhdAorICAgIGlzIGF2YWlsYWJsZSBmb3IgbmV3IGFsbG9jYXRpb25zLgorICAgICovCisgICAgaWYoSXNFbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICAgIAorICAgIGNvbnN0IFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBzdWJhbGxvY2F0aW9uczFzdCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCk7CisKKyAgICBzd2l0Y2gobV8ybmRWZWN0b3JNb2RlKQorICAgIHsKKyAgICBjYXNlIFNFQ09ORF9WRUNUT1JfRU1QVFk6CisgICAgICAgIC8qCisgICAgICAgIEF2YWlsYWJsZSBzcGFjZSBpcyBhZnRlciBlbmQgb2YgMXN0LCBhcyB3ZWxsIGFzIGJlZm9yZSBiZWdpbm5pbmcgb2YgMXN0ICh3aGljaAorICAgICAgICB3aG91bGQgbWFrZSBpdCBhIHJpbmcgYnVmZmVyKS4KKyAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHN1YmFsbG9jYXRpb25zMXN0Q291bnQgPSBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCk7CisgICAgICAgICAgICBWTUFfQVNTRVJUKHN1YmFsbG9jYXRpb25zMXN0Q291bnQgPiBtXzFzdE51bGxJdGVtc0JlZ2luQ291bnQpOworICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgZmlyc3RTdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMXN0W21fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudF07CisgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBsYXN0U3ViYWxsb2MgID0gc3ViYWxsb2NhdGlvbnMxc3Rbc3ViYWxsb2NhdGlvbnMxc3RDb3VudCAtIDFdOworICAgICAgICAgICAgcmV0dXJuIFZNQV9NQVgoCisgICAgICAgICAgICAgICAgZmlyc3RTdWJhbGxvYy5vZmZzZXQsCisgICAgICAgICAgICAgICAgc2l6ZSAtIChsYXN0U3ViYWxsb2Mub2Zmc2V0ICsgbGFzdFN1YmFsbG9jLnNpemUpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgU0VDT05EX1ZFQ1RPUl9SSU5HX0JVRkZFUjoKKyAgICAgICAgLyoKKyAgICAgICAgQXZhaWxhYmxlIHNwYWNlIGlzIG9ubHkgYmV0d2VlbiBlbmQgb2YgMm5kIGFuZCBiZWdpbm5pbmcgb2YgMXN0LgorICAgICAgICAqLworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBTdWJhbGxvY2F0aW9uVmVjdG9yVHlwZSYgc3ViYWxsb2NhdGlvbnMybmQgPSBBY2Nlc3NTdWJhbGxvY2F0aW9uczJuZCgpOworICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgbGFzdFN1YmFsbG9jMm5kID0gc3ViYWxsb2NhdGlvbnMybmQuYmFjaygpOworICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgZmlyc3RTdWJhbGxvYzFzdCA9IHN1YmFsbG9jYXRpb25zMXN0W21fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudF07CisgICAgICAgICAgICByZXR1cm4gZmlyc3RTdWJhbGxvYzFzdC5vZmZzZXQgLSAobGFzdFN1YmFsbG9jMm5kLm9mZnNldCArIGxhc3RTdWJhbGxvYzJuZC5zaXplKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgU0VDT05EX1ZFQ1RPUl9ET1VCTEVfU1RBQ0s6CisgICAgICAgIC8qCisgICAgICAgIEF2YWlsYWJsZSBzcGFjZSBpcyBvbmx5IGJldHdlZW4gZW5kIG9mIDFzdCBhbmQgdG9wIG9mIDJuZC4KKyAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKyAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHRvcFN1YmFsbG9jMm5kID0gc3ViYWxsb2NhdGlvbnMybmQuYmFjaygpOworICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgbGFzdFN1YmFsbG9jMXN0ID0gc3ViYWxsb2NhdGlvbnMxc3QuYmFjaygpOworICAgICAgICAgICAgcmV0dXJuIHRvcFN1YmFsbG9jMm5kLm9mZnNldCAtIChsYXN0U3ViYWxsb2Mxc3Qub2Zmc2V0ICsgbGFzdFN1YmFsbG9jMXN0LnNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpDYWxjQWxsb2NhdGlvblN0YXRJbmZvKFZtYVN0YXRJbmZvJiBvdXRJbmZvKSBjb25zdAoreworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBzaXplID0gR2V0U2l6ZSgpOworICAgIGNvbnN0IFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBzdWJhbGxvY2F0aW9uczFzdCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCk7CisgICAgY29uc3QgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKyAgICBjb25zdCBzaXplX3Qgc3ViYWxsb2Mxc3RDb3VudCA9IHN1YmFsbG9jYXRpb25zMXN0LnNpemUoKTsKKyAgICBjb25zdCBzaXplX3Qgc3ViYWxsb2MybmRDb3VudCA9IHN1YmFsbG9jYXRpb25zMm5kLnNpemUoKTsKKworICAgIG91dEluZm8uYmxvY2tDb3VudCA9IDE7CisgICAgb3V0SW5mby5hbGxvY2F0aW9uQ291bnQgPSAodWludDMyX3QpR2V0QWxsb2NhdGlvbkNvdW50KCk7CisgICAgb3V0SW5mby51bnVzZWRSYW5nZUNvdW50ID0gMDsKKyAgICBvdXRJbmZvLnVzZWRCeXRlcyA9IDA7CisgICAgb3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1pbiA9IFVJTlQ2NF9NQVg7CisgICAgb3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1heCA9IDA7CisgICAgb3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4gPSBVSU5UNjRfTUFYOworICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4ID0gMDsKKworICAgIFZrRGV2aWNlU2l6ZSBsYXN0T2Zmc2V0ID0gMDsKKworICAgIGlmKG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX1JJTkdfQlVGRkVSKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGZyZWVTcGFjZTJuZFRvMXN0RW5kID0gc3ViYWxsb2NhdGlvbnMxc3RbbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50XS5vZmZzZXQ7CisgICAgICAgIHNpemVfdCBuZXh0QWxsb2MybmRJbmRleCA9IDA7CisgICAgICAgIHdoaWxlKGxhc3RPZmZzZXQgPCBmcmVlU3BhY2UybmRUbzFzdEVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRmluZCBuZXh0IG5vbi1udWxsIGFsbG9jYXRpb24gb3IgbW92ZSBuZXh0QWxsb2NJbmRleCB0byB0aGUgZW5kLgorICAgICAgICAgICAgd2hpbGUobmV4dEFsbG9jMm5kSW5kZXggPCBzdWJhbGxvYzJuZENvdW50ICYmCisgICAgICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMybmRbbmV4dEFsbG9jMm5kSW5kZXhdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvdW5kIG5vbi1udWxsIGFsbG9jYXRpb24uCisgICAgICAgICAgICBpZihuZXh0QWxsb2MybmRJbmRleCA8IHN1YmFsbG9jMm5kQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczJuZFtuZXh0QWxsb2MybmRJbmRleF07CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyAxLiBQcm9jZXNzIGZyZWUgc3BhY2UgYmVmb3JlIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc3ViYWxsb2Mub2Zmc2V0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgZnJlZSBzcGFjZSBmcm9tIGxhc3RPZmZzZXQgdG8gc3ViYWxsb2Mub2Zmc2V0LgorICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgdW51c2VkUmFuZ2VTaXplID0gc3ViYWxsb2Mub2Zmc2V0IC0gbGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgKytvdXRJbmZvLnVudXNlZFJhbmdlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8udW51c2VkQnl0ZXMgKz0gdW51c2VkUmFuZ2VTaXplOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFZNQV9NSU4ob3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4sIHVudXNlZFJhbmdlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4ID0gVk1BX01JTihvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1heCwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyAyLiBQcm9jZXNzIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbGxvY2F0aW9uIHdpdGggc3ViYWxsb2Mub2Zmc2V0LCBzdWJhbGxvYy5zaXplLgorICAgICAgICAgICAgICAgIG91dEluZm8udXNlZEJ5dGVzICs9IHN1YmFsbG9jLnNpemU7CisgICAgICAgICAgICAgICAgb3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1pbiA9IFZNQV9NSU4ob3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1pbiwgc3ViYWxsb2Muc2l6ZSk7CisgICAgICAgICAgICAgICAgb3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1heCA9IFZNQV9NSU4ob3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1heCwgc3ViYWxsb2Muc2l6ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyAzLiBQcmVwYXJlIGZvciBuZXh0IGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gc3ViYWxsb2Mub2Zmc2V0ICsgc3ViYWxsb2Muc2l6ZTsKKyAgICAgICAgICAgICAgICArK25leHRBbGxvYzJuZEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBlbmQuCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgZnJlZSBzcGFjZSBmcm9tIGxhc3RPZmZzZXQgdG8gZnJlZVNwYWNlMm5kVG8xc3RFbmQuCisgICAgICAgICAgICAgICAgaWYobGFzdE9mZnNldCA8IGZyZWVTcGFjZTJuZFRvMXN0RW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHVudXNlZFJhbmdlU2l6ZSA9IGZyZWVTcGFjZTJuZFRvMXN0RW5kIC0gbGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgKytvdXRJbmZvLnVudXNlZFJhbmdlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8udW51c2VkQnl0ZXMgKz0gdW51c2VkUmFuZ2VTaXplOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFZNQV9NSU4ob3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4sIHVudXNlZFJhbmdlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4ID0gVk1BX01JTihvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1heCwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBsb29wLgorICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBmcmVlU3BhY2UybmRUbzFzdEVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBuZXh0QWxsb2Mxc3RJbmRleCA9IG1fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudDsKKyAgICBjb25zdCBWa0RldmljZVNpemUgZnJlZVNwYWNlMXN0VG8ybmRFbmQgPQorICAgICAgICBtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9ET1VCTEVfU1RBQ0sgPyBzdWJhbGxvY2F0aW9uczJuZC5iYWNrKCkub2Zmc2V0IDogc2l6ZTsKKyAgICB3aGlsZShsYXN0T2Zmc2V0IDwgZnJlZVNwYWNlMXN0VG8ybmRFbmQpCisgICAgeworICAgICAgICAvLyBGaW5kIG5leHQgbm9uLW51bGwgYWxsb2NhdGlvbiBvciBtb3ZlIG5leHRBbGxvY0luZGV4IHRvIHRoZSBlbmQuCisgICAgICAgIHdoaWxlKG5leHRBbGxvYzFzdEluZGV4IDwgc3ViYWxsb2Mxc3RDb3VudCAmJgorICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMxc3RbbmV4dEFsbG9jMXN0SW5kZXhdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICArK25leHRBbGxvYzFzdEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgLy8gRm91bmQgbm9uLW51bGwgYWxsb2NhdGlvbi4KKyAgICAgICAgaWYobmV4dEFsbG9jMXN0SW5kZXggPCBzdWJhbGxvYzFzdENvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMXN0W25leHRBbGxvYzFzdEluZGV4XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gMS4gUHJvY2VzcyBmcmVlIHNwYWNlIGJlZm9yZSB0aGlzIGFsbG9jYXRpb24uCisgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc3ViYWxsb2Mub2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHN1YmFsbG9jLm9mZnNldC4KKyAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgdW51c2VkUmFuZ2VTaXplID0gc3ViYWxsb2Mub2Zmc2V0IC0gbGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICArK291dEluZm8udW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLnVudXNlZEJ5dGVzICs9IHVudXNlZFJhbmdlU2l6ZTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFZNQV9NSU4ob3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4sIHVudXNlZFJhbmdlU2l6ZSk7CisgICAgICAgICAgICAgICAgb3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUlOKG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyAyLiBQcm9jZXNzIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFsbG9jYXRpb24gd2l0aCBzdWJhbGxvYy5vZmZzZXQsIHN1YmFsbG9jLnNpemUuCisgICAgICAgICAgICBvdXRJbmZvLnVzZWRCeXRlcyArPSBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgb3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1pbiA9IFZNQV9NSU4ob3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1pbiwgc3ViYWxsb2Muc2l6ZSk7CisgICAgICAgICAgICBvdXRJbmZvLmFsbG9jYXRpb25TaXplTWF4ID0gVk1BX01JTihvdXRJbmZvLmFsbG9jYXRpb25TaXplTWF4LCBzdWJhbGxvYy5zaXplKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gMy4gUHJlcGFyZSBmb3IgbmV4dCBpdGVyYXRpb24uCisgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gc3ViYWxsb2Mub2Zmc2V0ICsgc3ViYWxsb2Muc2l6ZTsKKyAgICAgICAgICAgICsrbmV4dEFsbG9jMXN0SW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBlbmQuCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMgZnJlZSBzcGFjZSBmcm9tIGxhc3RPZmZzZXQgdG8gZnJlZVNwYWNlMXN0VG8ybmRFbmQuCisgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgZnJlZVNwYWNlMXN0VG8ybmRFbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHVudXNlZFJhbmdlU2l6ZSA9IGZyZWVTcGFjZTFzdFRvMm5kRW5kIC0gbGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICArK291dEluZm8udW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLnVudXNlZEJ5dGVzICs9IHVudXNlZFJhbmdlU2l6ZTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFZNQV9NSU4ob3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4sIHVudXNlZFJhbmdlU2l6ZSk7CisgICAgICAgICAgICAgICAgb3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUlOKG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVuZCBvZiBsb29wLgorICAgICAgICAgICAgbGFzdE9mZnNldCA9IGZyZWVTcGFjZTFzdFRvMm5kRW5kOworICAgICAgICB9CisgICAgfQorCisgICAgaWYobV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfRE9VQkxFX1NUQUNLKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG5leHRBbGxvYzJuZEluZGV4ID0gc3ViYWxsb2NhdGlvbnMybmQuc2l6ZSgpIC0gMTsKKyAgICAgICAgd2hpbGUobGFzdE9mZnNldCA8IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZpbmQgbmV4dCBub24tbnVsbCBhbGxvY2F0aW9uIG9yIG1vdmUgbmV4dEFsbG9jSW5kZXggdG8gdGhlIGVuZC4KKyAgICAgICAgICAgIHdoaWxlKG5leHRBbGxvYzJuZEluZGV4ICE9IFNJWkVfTUFYICYmCisgICAgICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMybmRbbmV4dEFsbG9jMm5kSW5kZXhdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC0tbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvdW5kIG5vbi1udWxsIGFsbG9jYXRpb24uCisgICAgICAgICAgICBpZihuZXh0QWxsb2MybmRJbmRleCAhPSBTSVpFX01BWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMm5kW25leHRBbGxvYzJuZEluZGV4XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDEuIFByb2Nlc3MgZnJlZSBzcGFjZSBiZWZvcmUgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgIGlmKGxhc3RPZmZzZXQgPCBzdWJhbGxvYy5vZmZzZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBmcmVlIHNwYWNlIGZyb20gbGFzdE9mZnNldCB0byBzdWJhbGxvYy5vZmZzZXQuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSB1bnVzZWRSYW5nZVNpemUgPSBzdWJhbGxvYy5vZmZzZXQgLSBsYXN0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICArK291dEluZm8udW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby51bnVzZWRCeXRlcyArPSB1bnVzZWRSYW5nZVNpemU7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWluID0gVk1BX01JTihvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUlOKG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDIuIFByb2Nlc3MgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFsbG9jYXRpb24gd2l0aCBzdWJhbGxvYy5vZmZzZXQsIHN1YmFsbG9jLnNpemUuCisgICAgICAgICAgICAgICAgb3V0SW5mby51c2VkQnl0ZXMgKz0gc3ViYWxsb2Muc2l6ZTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLmFsbG9jYXRpb25TaXplTWluID0gVk1BX01JTihvdXRJbmZvLmFsbG9jYXRpb25TaXplTWluLCBzdWJhbGxvYy5zaXplKTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLmFsbG9jYXRpb25TaXplTWF4ID0gVk1BX01JTihvdXRJbmZvLmFsbG9jYXRpb25TaXplTWF4LCBzdWJhbGxvYy5zaXplKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDMuIFByZXBhcmUgZm9yIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBzdWJhbGxvYy5vZmZzZXQgKyBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgICAgIC0tbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBmcmVlIHNwYWNlIGZyb20gbGFzdE9mZnNldCB0byBzaXplLgorICAgICAgICAgICAgICAgIGlmKGxhc3RPZmZzZXQgPCBzaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHVudXNlZFJhbmdlU2l6ZSA9IHNpemUgLSBsYXN0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICArK291dEluZm8udW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby51bnVzZWRCeXRlcyArPSB1bnVzZWRSYW5nZVNpemU7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWluID0gVk1BX01JTihvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUlOKG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRW5kIG9mIGxvb3AuCisgICAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRJbmZvLnVudXNlZEJ5dGVzID0gc2l6ZSAtIG91dEluZm8udXNlZEJ5dGVzOworfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpBZGRQb29sU3RhdHMoVm1hUG9vbFN0YXRzJiBpbm91dFN0YXRzKSBjb25zdAoreworICAgIGNvbnN0IFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBzdWJhbGxvY2F0aW9uczFzdCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCk7CisgICAgY29uc3QgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKyAgICBjb25zdCBWa0RldmljZVNpemUgc2l6ZSA9IEdldFNpemUoKTsKKyAgICBjb25zdCBzaXplX3Qgc3ViYWxsb2Mxc3RDb3VudCA9IHN1YmFsbG9jYXRpb25zMXN0LnNpemUoKTsKKyAgICBjb25zdCBzaXplX3Qgc3ViYWxsb2MybmRDb3VudCA9IHN1YmFsbG9jYXRpb25zMm5kLnNpemUoKTsKKworICAgIGlub3V0U3RhdHMuc2l6ZSArPSBzaXplOworCisgICAgVmtEZXZpY2VTaXplIGxhc3RPZmZzZXQgPSAwOworCisgICAgaWYobV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfUklOR19CVUZGRVIpCisgICAgeworICAgICAgICBjb25zdCBWa0RldmljZVNpemUgZnJlZVNwYWNlMm5kVG8xc3RFbmQgPSBzdWJhbGxvY2F0aW9uczFzdFttXzFzdE51bGxJdGVtc0JlZ2luQ291bnRdLm9mZnNldDsKKyAgICAgICAgc2l6ZV90IG5leHRBbGxvYzJuZEluZGV4ID0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50OworICAgICAgICB3aGlsZShsYXN0T2Zmc2V0IDwgZnJlZVNwYWNlMm5kVG8xc3RFbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZpbmQgbmV4dCBub24tbnVsbCBhbGxvY2F0aW9uIG9yIG1vdmUgbmV4dEFsbG9jMm5kSW5kZXggdG8gdGhlIGVuZC4KKyAgICAgICAgICAgIHdoaWxlKG5leHRBbGxvYzJuZEluZGV4IDwgc3ViYWxsb2MybmRDb3VudCAmJgorICAgICAgICAgICAgICAgIHN1YmFsbG9jYXRpb25zMm5kW25leHRBbGxvYzJuZEluZGV4XS5oQWxsb2NhdGlvbiA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK25leHRBbGxvYzJuZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3VuZCBub24tbnVsbCBhbGxvY2F0aW9uLgorICAgICAgICAgICAgaWYobmV4dEFsbG9jMm5kSW5kZXggPCBzdWJhbGxvYzJuZENvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMybmRbbmV4dEFsbG9jMm5kSW5kZXhdOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gMS4gUHJvY2VzcyBmcmVlIHNwYWNlIGJlZm9yZSB0aGlzIGFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgaWYobGFzdE9mZnNldCA8IHN1YmFsbG9jLm9mZnNldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHN1YmFsbG9jLm9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHVudXNlZFJhbmdlU2l6ZSA9IHN1YmFsbG9jLm9mZnNldCAtIGxhc3RPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGlub3V0U3RhdHMudW51c2VkU2l6ZSArPSB1bnVzZWRSYW5nZVNpemU7CisgICAgICAgICAgICAgICAgICAgICsraW5vdXRTdGF0cy51bnVzZWRSYW5nZUNvdW50OworICAgICAgICAgICAgICAgICAgICBpbm91dFN0YXRzLnVudXNlZFJhbmdlU2l6ZU1heCA9IFZNQV9NQVgoaW5vdXRTdGF0cy51bnVzZWRSYW5nZVNpemVNYXgsIHVudXNlZFJhbmdlU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gMi4gUHJvY2VzcyB0aGlzIGFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYWxsb2NhdGlvbiB3aXRoIHN1YmFsbG9jLm9mZnNldCwgc3ViYWxsb2Muc2l6ZS4KKyAgICAgICAgICAgICAgICArK2lub3V0U3RhdHMuYWxsb2NhdGlvbkNvdW50OworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gMy4gUHJlcGFyZSBmb3IgbmV4dCBpdGVyYXRpb24uCisgICAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IHN1YmFsbG9jLm9mZnNldCArIHN1YmFsbG9jLnNpemU7CisgICAgICAgICAgICAgICAgKytuZXh0QWxsb2MybmRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGxhc3RPZmZzZXQgPCBmcmVlU3BhY2UybmRUbzFzdEVuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIGZyZWVTcGFjZTJuZFRvMXN0RW5kLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgdW51c2VkUmFuZ2VTaXplID0gZnJlZVNwYWNlMm5kVG8xc3RFbmQgLSBsYXN0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBpbm91dFN0YXRzLnVudXNlZFNpemUgKz0gdW51c2VkUmFuZ2VTaXplOworICAgICAgICAgICAgICAgICAgICArK2lub3V0U3RhdHMudW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgaW5vdXRTdGF0cy51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUFYKGlub3V0U3RhdHMudW51c2VkUmFuZ2VTaXplTWF4LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBsb29wLgorICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBmcmVlU3BhY2UybmRUbzFzdEVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBuZXh0QWxsb2Mxc3RJbmRleCA9IG1fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudDsKKyAgICBjb25zdCBWa0RldmljZVNpemUgZnJlZVNwYWNlMXN0VG8ybmRFbmQgPQorICAgICAgICBtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9ET1VCTEVfU1RBQ0sgPyBzdWJhbGxvY2F0aW9uczJuZC5iYWNrKCkub2Zmc2V0IDogc2l6ZTsKKyAgICB3aGlsZShsYXN0T2Zmc2V0IDwgZnJlZVNwYWNlMXN0VG8ybmRFbmQpCisgICAgeworICAgICAgICAvLyBGaW5kIG5leHQgbm9uLW51bGwgYWxsb2NhdGlvbiBvciBtb3ZlIG5leHRBbGxvY0luZGV4IHRvIHRoZSBlbmQuCisgICAgICAgIHdoaWxlKG5leHRBbGxvYzFzdEluZGV4IDwgc3ViYWxsb2Mxc3RDb3VudCAmJgorICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMxc3RbbmV4dEFsbG9jMXN0SW5kZXhdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICArK25leHRBbGxvYzFzdEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgLy8gRm91bmQgbm9uLW51bGwgYWxsb2NhdGlvbi4KKyAgICAgICAgaWYobmV4dEFsbG9jMXN0SW5kZXggPCBzdWJhbGxvYzFzdENvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMXN0W25leHRBbGxvYzFzdEluZGV4XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gMS4gUHJvY2VzcyBmcmVlIHNwYWNlIGJlZm9yZSB0aGlzIGFsbG9jYXRpb24uCisgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc3ViYWxsb2Mub2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHN1YmFsbG9jLm9mZnNldC4KKyAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgdW51c2VkUmFuZ2VTaXplID0gc3ViYWxsb2Mub2Zmc2V0IC0gbGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICBpbm91dFN0YXRzLnVudXNlZFNpemUgKz0gdW51c2VkUmFuZ2VTaXplOworICAgICAgICAgICAgICAgICsraW5vdXRTdGF0cy51bnVzZWRSYW5nZUNvdW50OworICAgICAgICAgICAgICAgIGlub3V0U3RhdHMudW51c2VkUmFuZ2VTaXplTWF4ID0gVk1BX01BWChpbm91dFN0YXRzLnVudXNlZFJhbmdlU2l6ZU1heCwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gMi4gUHJvY2VzcyB0aGlzIGFsbG9jYXRpb24uCisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbGxvY2F0aW9uIHdpdGggc3ViYWxsb2Mub2Zmc2V0LCBzdWJhbGxvYy5zaXplLgorICAgICAgICAgICAgKytpbm91dFN0YXRzLmFsbG9jYXRpb25Db3VudDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gMy4gUHJlcGFyZSBmb3IgbmV4dCBpdGVyYXRpb24uCisgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gc3ViYWxsb2Mub2Zmc2V0ICsgc3ViYWxsb2Muc2l6ZTsKKyAgICAgICAgICAgICsrbmV4dEFsbG9jMXN0SW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBlbmQuCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYobGFzdE9mZnNldCA8IGZyZWVTcGFjZTFzdFRvMm5kRW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIGZyZWVTcGFjZTFzdFRvMm5kRW5kLgorICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSB1bnVzZWRSYW5nZVNpemUgPSBmcmVlU3BhY2Uxc3RUbzJuZEVuZCAtIGxhc3RPZmZzZXQ7CisgICAgICAgICAgICAgICAgaW5vdXRTdGF0cy51bnVzZWRTaXplICs9IHVudXNlZFJhbmdlU2l6ZTsKKyAgICAgICAgICAgICAgICArK2lub3V0U3RhdHMudW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICBpbm91dFN0YXRzLnVudXNlZFJhbmdlU2l6ZU1heCA9IFZNQV9NQVgoaW5vdXRTdGF0cy51bnVzZWRSYW5nZVNpemVNYXgsIHVudXNlZFJhbmdlU2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVuZCBvZiBsb29wLgorICAgICAgICAgICAgbGFzdE9mZnNldCA9IGZyZWVTcGFjZTFzdFRvMm5kRW5kOworICAgICAgICB9CisgICAgfQorCisgICAgaWYobV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfRE9VQkxFX1NUQUNLKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG5leHRBbGxvYzJuZEluZGV4ID0gc3ViYWxsb2NhdGlvbnMybmQuc2l6ZSgpIC0gMTsKKyAgICAgICAgd2hpbGUobGFzdE9mZnNldCA8IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZpbmQgbmV4dCBub24tbnVsbCBhbGxvY2F0aW9uIG9yIG1vdmUgbmV4dEFsbG9jMm5kSW5kZXggdG8gdGhlIGVuZC4KKyAgICAgICAgICAgIHdoaWxlKG5leHRBbGxvYzJuZEluZGV4ICE9IFNJWkVfTUFYICYmCisgICAgICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMybmRbbmV4dEFsbG9jMm5kSW5kZXhdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC0tbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvdW5kIG5vbi1udWxsIGFsbG9jYXRpb24uCisgICAgICAgICAgICBpZihuZXh0QWxsb2MybmRJbmRleCAhPSBTSVpFX01BWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMm5kW25leHRBbGxvYzJuZEluZGV4XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDEuIFByb2Nlc3MgZnJlZSBzcGFjZSBiZWZvcmUgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgIGlmKGxhc3RPZmZzZXQgPCBzdWJhbGxvYy5vZmZzZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBmcmVlIHNwYWNlIGZyb20gbGFzdE9mZnNldCB0byBzdWJhbGxvYy5vZmZzZXQuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSB1bnVzZWRSYW5nZVNpemUgPSBzdWJhbGxvYy5vZmZzZXQgLSBsYXN0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBpbm91dFN0YXRzLnVudXNlZFNpemUgKz0gdW51c2VkUmFuZ2VTaXplOworICAgICAgICAgICAgICAgICAgICArK2lub3V0U3RhdHMudW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgaW5vdXRTdGF0cy51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUFYKGlub3V0U3RhdHMudW51c2VkUmFuZ2VTaXplTWF4LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDIuIFByb2Nlc3MgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFsbG9jYXRpb24gd2l0aCBzdWJhbGxvYy5vZmZzZXQsIHN1YmFsbG9jLnNpemUuCisgICAgICAgICAgICAgICAgKytpbm91dFN0YXRzLmFsbG9jYXRpb25Db3VudDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDMuIFByZXBhcmUgZm9yIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBzdWJhbGxvYy5vZmZzZXQgKyBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgICAgIC0tbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHNpemUuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSB1bnVzZWRSYW5nZVNpemUgPSBzaXplIC0gbGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaW5vdXRTdGF0cy51bnVzZWRTaXplICs9IHVudXNlZFJhbmdlU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgKytpbm91dFN0YXRzLnVudXNlZFJhbmdlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlub3V0U3RhdHMudW51c2VkUmFuZ2VTaXplTWF4ID0gVk1BX01BWChpbm91dFN0YXRzLnVudXNlZFJhbmdlU2l6ZU1heCwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBFbmQgb2YgbG9vcC4KKyAgICAgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAordm9pZCBWbWFCbG9ja01ldGFkYXRhX0xpbmVhcjo6UHJpbnREZXRhaWxlZE1hcChjbGFzcyBWbWFKc29uV3JpdGVyJiBqc29uKSBjb25zdAoreworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBzaXplID0gR2V0U2l6ZSgpOworICAgIGNvbnN0IFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBzdWJhbGxvY2F0aW9uczFzdCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCk7CisgICAgY29uc3QgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKyAgICBjb25zdCBzaXplX3Qgc3ViYWxsb2Mxc3RDb3VudCA9IHN1YmFsbG9jYXRpb25zMXN0LnNpemUoKTsKKyAgICBjb25zdCBzaXplX3Qgc3ViYWxsb2MybmRDb3VudCA9IHN1YmFsbG9jYXRpb25zMm5kLnNpemUoKTsKKworICAgIC8vIEZJUlNUIFBBU1MKKworICAgIHNpemVfdCB1bnVzZWRSYW5nZUNvdW50ID0gMDsKKyAgICBWa0RldmljZVNpemUgdXNlZEJ5dGVzID0gMDsKKworICAgIFZrRGV2aWNlU2l6ZSBsYXN0T2Zmc2V0ID0gMDsKKworICAgIHNpemVfdCBhbGxvYzJuZENvdW50ID0gMDsKKyAgICBpZihtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9SSU5HX0JVRkZFUikKKyAgICB7CisgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBmcmVlU3BhY2UybmRUbzFzdEVuZCA9IHN1YmFsbG9jYXRpb25zMXN0W21fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudF0ub2Zmc2V0OworICAgICAgICBzaXplX3QgbmV4dEFsbG9jMm5kSW5kZXggPSAwOworICAgICAgICB3aGlsZShsYXN0T2Zmc2V0IDwgZnJlZVNwYWNlMm5kVG8xc3RFbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZpbmQgbmV4dCBub24tbnVsbCBhbGxvY2F0aW9uIG9yIG1vdmUgbmV4dEFsbG9jMm5kSW5kZXggdG8gdGhlIGVuZC4KKyAgICAgICAgICAgIHdoaWxlKG5leHRBbGxvYzJuZEluZGV4IDwgc3ViYWxsb2MybmRDb3VudCAmJgorICAgICAgICAgICAgICAgIHN1YmFsbG9jYXRpb25zMm5kW25leHRBbGxvYzJuZEluZGV4XS5oQWxsb2NhdGlvbiA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK25leHRBbGxvYzJuZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3VuZCBub24tbnVsbCBhbGxvY2F0aW9uLgorICAgICAgICAgICAgaWYobmV4dEFsbG9jMm5kSW5kZXggPCBzdWJhbGxvYzJuZENvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMybmRbbmV4dEFsbG9jMm5kSW5kZXhdOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gMS4gUHJvY2VzcyBmcmVlIHNwYWNlIGJlZm9yZSB0aGlzIGFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgaWYobGFzdE9mZnNldCA8IHN1YmFsbG9jLm9mZnNldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHN1YmFsbG9jLm9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgKyt1bnVzZWRSYW5nZUNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDIuIFByb2Nlc3MgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFsbG9jYXRpb24gd2l0aCBzdWJhbGxvYy5vZmZzZXQsIHN1YmFsbG9jLnNpemUuCisgICAgICAgICAgICAgICAgKythbGxvYzJuZENvdW50OworICAgICAgICAgICAgICAgIHVzZWRCeXRlcyArPSBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gMy4gUHJlcGFyZSBmb3IgbmV4dCBpdGVyYXRpb24uCisgICAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IHN1YmFsbG9jLm9mZnNldCArIHN1YmFsbG9jLnNpemU7CisgICAgICAgICAgICAgICAgKytuZXh0QWxsb2MybmRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGxhc3RPZmZzZXQgPCBmcmVlU3BhY2UybmRUbzFzdEVuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIGZyZWVTcGFjZTJuZFRvMXN0RW5kLgorICAgICAgICAgICAgICAgICAgICArK3VudXNlZFJhbmdlQ291bnQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRW5kIG9mIGxvb3AuCisgICAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IGZyZWVTcGFjZTJuZFRvMXN0RW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG5leHRBbGxvYzFzdEluZGV4ID0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50OworICAgIHNpemVfdCBhbGxvYzFzdENvdW50ID0gMDsKKyAgICBjb25zdCBWa0RldmljZVNpemUgZnJlZVNwYWNlMXN0VG8ybmRFbmQgPQorICAgICAgICBtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9ET1VCTEVfU1RBQ0sgPyBzdWJhbGxvY2F0aW9uczJuZC5iYWNrKCkub2Zmc2V0IDogc2l6ZTsKKyAgICB3aGlsZShsYXN0T2Zmc2V0IDwgZnJlZVNwYWNlMXN0VG8ybmRFbmQpCisgICAgeworICAgICAgICAvLyBGaW5kIG5leHQgbm9uLW51bGwgYWxsb2NhdGlvbiBvciBtb3ZlIG5leHRBbGxvY0luZGV4IHRvIHRoZSBlbmQuCisgICAgICAgIHdoaWxlKG5leHRBbGxvYzFzdEluZGV4IDwgc3ViYWxsb2Mxc3RDb3VudCAmJgorICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMxc3RbbmV4dEFsbG9jMXN0SW5kZXhdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICArK25leHRBbGxvYzFzdEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgLy8gRm91bmQgbm9uLW51bGwgYWxsb2NhdGlvbi4KKyAgICAgICAgaWYobmV4dEFsbG9jMXN0SW5kZXggPCBzdWJhbGxvYzFzdENvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMXN0W25leHRBbGxvYzFzdEluZGV4XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gMS4gUHJvY2VzcyBmcmVlIHNwYWNlIGJlZm9yZSB0aGlzIGFsbG9jYXRpb24uCisgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc3ViYWxsb2Mub2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHN1YmFsbG9jLm9mZnNldC4KKyAgICAgICAgICAgICAgICArK3VudXNlZFJhbmdlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIDIuIFByb2Nlc3MgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgLy8gVGhlcmUgaXMgYWxsb2NhdGlvbiB3aXRoIHN1YmFsbG9jLm9mZnNldCwgc3ViYWxsb2Muc2l6ZS4KKyAgICAgICAgICAgICsrYWxsb2Mxc3RDb3VudDsKKyAgICAgICAgICAgIHVzZWRCeXRlcyArPSBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyAzLiBQcmVwYXJlIGZvciBuZXh0IGl0ZXJhdGlvbi4KKyAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBzdWJhbGxvYy5vZmZzZXQgKyBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgKytuZXh0QWxsb2Mxc3RJbmRleDsKKyAgICAgICAgfQorICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGVuZC4KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBmcmVlIHNwYWNlIGZyb20gbGFzdE9mZnNldCB0byBmcmVlU3BhY2Uxc3RUbzJuZEVuZC4KKyAgICAgICAgICAgICAgICArK3VudXNlZFJhbmdlQ291bnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVuZCBvZiBsb29wLgorICAgICAgICAgICAgbGFzdE9mZnNldCA9IGZyZWVTcGFjZTFzdFRvMm5kRW5kOworICAgICAgICB9CisgICAgfQorCisgICAgaWYobV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfRE9VQkxFX1NUQUNLKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG5leHRBbGxvYzJuZEluZGV4ID0gc3ViYWxsb2NhdGlvbnMybmQuc2l6ZSgpIC0gMTsKKyAgICAgICAgd2hpbGUobGFzdE9mZnNldCA8IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZpbmQgbmV4dCBub24tbnVsbCBhbGxvY2F0aW9uIG9yIG1vdmUgbmV4dEFsbG9jMm5kSW5kZXggdG8gdGhlIGVuZC4KKyAgICAgICAgICAgIHdoaWxlKG5leHRBbGxvYzJuZEluZGV4ICE9IFNJWkVfTUFYICYmCisgICAgICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMybmRbbmV4dEFsbG9jMm5kSW5kZXhdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC0tbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvdW5kIG5vbi1udWxsIGFsbG9jYXRpb24uCisgICAgICAgICAgICBpZihuZXh0QWxsb2MybmRJbmRleCAhPSBTSVpFX01BWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMm5kW25leHRBbGxvYzJuZEluZGV4XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDEuIFByb2Nlc3MgZnJlZSBzcGFjZSBiZWZvcmUgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgIGlmKGxhc3RPZmZzZXQgPCBzdWJhbGxvYy5vZmZzZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBmcmVlIHNwYWNlIGZyb20gbGFzdE9mZnNldCB0byBzdWJhbGxvYy5vZmZzZXQuCisgICAgICAgICAgICAgICAgICAgICsrdW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyAyLiBQcm9jZXNzIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbGxvY2F0aW9uIHdpdGggc3ViYWxsb2Mub2Zmc2V0LCBzdWJhbGxvYy5zaXplLgorICAgICAgICAgICAgICAgICsrYWxsb2MybmRDb3VudDsKKyAgICAgICAgICAgICAgICB1c2VkQnl0ZXMgKz0gc3ViYWxsb2Muc2l6ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDMuIFByZXBhcmUgZm9yIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBzdWJhbGxvYy5vZmZzZXQgKyBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgICAgIC0tbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHNpemUuCisgICAgICAgICAgICAgICAgICAgICsrdW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBFbmQgb2YgbG9vcC4KKyAgICAgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSB1bnVzZWRCeXRlcyA9IHNpemUgLSB1c2VkQnl0ZXM7CisgICAgUHJpbnREZXRhaWxlZE1hcF9CZWdpbihqc29uLCB1bnVzZWRCeXRlcywgYWxsb2Mxc3RDb3VudCArIGFsbG9jMm5kQ291bnQsIHVudXNlZFJhbmdlQ291bnQpOworCisgICAgLy8gU0VDT05EIFBBU1MKKyAgICBsYXN0T2Zmc2V0ID0gMDsKKworICAgIGlmKG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX1JJTkdfQlVGRkVSKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGZyZWVTcGFjZTJuZFRvMXN0RW5kID0gc3ViYWxsb2NhdGlvbnMxc3RbbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50XS5vZmZzZXQ7CisgICAgICAgIHNpemVfdCBuZXh0QWxsb2MybmRJbmRleCA9IDA7CisgICAgICAgIHdoaWxlKGxhc3RPZmZzZXQgPCBmcmVlU3BhY2UybmRUbzFzdEVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRmluZCBuZXh0IG5vbi1udWxsIGFsbG9jYXRpb24gb3IgbW92ZSBuZXh0QWxsb2MybmRJbmRleCB0byB0aGUgZW5kLgorICAgICAgICAgICAgd2hpbGUobmV4dEFsbG9jMm5kSW5kZXggPCBzdWJhbGxvYzJuZENvdW50ICYmCisgICAgICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMybmRbbmV4dEFsbG9jMm5kSW5kZXhdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvdW5kIG5vbi1udWxsIGFsbG9jYXRpb24uCisgICAgICAgICAgICBpZihuZXh0QWxsb2MybmRJbmRleCA8IHN1YmFsbG9jMm5kQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczJuZFtuZXh0QWxsb2MybmRJbmRleF07CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyAxLiBQcm9jZXNzIGZyZWUgc3BhY2UgYmVmb3JlIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc3ViYWxsb2Mub2Zmc2V0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgZnJlZSBzcGFjZSBmcm9tIGxhc3RPZmZzZXQgdG8gc3ViYWxsb2Mub2Zmc2V0LgorICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgdW51c2VkUmFuZ2VTaXplID0gc3ViYWxsb2Mub2Zmc2V0IC0gbGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnREZXRhaWxlZE1hcF9VbnVzZWRSYW5nZShqc29uLCBsYXN0T2Zmc2V0LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDIuIFByb2Nlc3MgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFsbG9jYXRpb24gd2l0aCBzdWJhbGxvYy5vZmZzZXQsIHN1YmFsbG9jLnNpemUuCisgICAgICAgICAgICAgICAgUHJpbnREZXRhaWxlZE1hcF9BbGxvY2F0aW9uKGpzb24sIHN1YmFsbG9jLm9mZnNldCwgc3ViYWxsb2MuaEFsbG9jYXRpb24pOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gMy4gUHJlcGFyZSBmb3IgbmV4dCBpdGVyYXRpb24uCisgICAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IHN1YmFsbG9jLm9mZnNldCArIHN1YmFsbG9jLnNpemU7CisgICAgICAgICAgICAgICAgKytuZXh0QWxsb2MybmRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGxhc3RPZmZzZXQgPCBmcmVlU3BhY2UybmRUbzFzdEVuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIGZyZWVTcGFjZTJuZFRvMXN0RW5kLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgdW51c2VkUmFuZ2VTaXplID0gZnJlZVNwYWNlMm5kVG8xc3RFbmQgLSBsYXN0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBQcmludERldGFpbGVkTWFwX1VudXNlZFJhbmdlKGpzb24sIGxhc3RPZmZzZXQsIHVudXNlZFJhbmdlU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRW5kIG9mIGxvb3AuCisgICAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IGZyZWVTcGFjZTJuZFRvMXN0RW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbmV4dEFsbG9jMXN0SW5kZXggPSBtXzFzdE51bGxJdGVtc0JlZ2luQ291bnQ7CisgICAgd2hpbGUobGFzdE9mZnNldCA8IGZyZWVTcGFjZTFzdFRvMm5kRW5kKQorICAgIHsKKyAgICAgICAgLy8gRmluZCBuZXh0IG5vbi1udWxsIGFsbG9jYXRpb24gb3IgbW92ZSBuZXh0QWxsb2NJbmRleCB0byB0aGUgZW5kLgorICAgICAgICB3aGlsZShuZXh0QWxsb2Mxc3RJbmRleCA8IHN1YmFsbG9jMXN0Q291bnQgJiYKKyAgICAgICAgICAgIHN1YmFsbG9jYXRpb25zMXN0W25leHRBbGxvYzFzdEluZGV4XS5oQWxsb2NhdGlvbiA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgeworICAgICAgICAgICAgKytuZXh0QWxsb2Mxc3RJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvdW5kIG5vbi1udWxsIGFsbG9jYXRpb24uCisgICAgICAgIGlmKG5leHRBbGxvYzFzdEluZGV4IDwgc3ViYWxsb2Mxc3RDb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczFzdFtuZXh0QWxsb2Mxc3RJbmRleF07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIDEuIFByb2Nlc3MgZnJlZSBzcGFjZSBiZWZvcmUgdGhpcyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgaWYobGFzdE9mZnNldCA8IHN1YmFsbG9jLm9mZnNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBmcmVlIHNwYWNlIGZyb20gbGFzdE9mZnNldCB0byBzdWJhbGxvYy5vZmZzZXQuCisgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHVudXNlZFJhbmdlU2l6ZSA9IHN1YmFsbG9jLm9mZnNldCAtIGxhc3RPZmZzZXQ7CisgICAgICAgICAgICAgICAgUHJpbnREZXRhaWxlZE1hcF9VbnVzZWRSYW5nZShqc29uLCBsYXN0T2Zmc2V0LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyAyLiBQcm9jZXNzIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFsbG9jYXRpb24gd2l0aCBzdWJhbGxvYy5vZmZzZXQsIHN1YmFsbG9jLnNpemUuCisgICAgICAgICAgICBQcmludERldGFpbGVkTWFwX0FsbG9jYXRpb24oanNvbiwgc3ViYWxsb2Mub2Zmc2V0LCBzdWJhbGxvYy5oQWxsb2NhdGlvbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIDMuIFByZXBhcmUgZm9yIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgICAgbGFzdE9mZnNldCA9IHN1YmFsbG9jLm9mZnNldCArIHN1YmFsbG9jLnNpemU7CisgICAgICAgICAgICArK25leHRBbGxvYzFzdEluZGV4OworICAgICAgICB9CisgICAgICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kLgorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGxhc3RPZmZzZXQgPCBmcmVlU3BhY2Uxc3RUbzJuZEVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBmcmVlIHNwYWNlIGZyb20gbGFzdE9mZnNldCB0byBmcmVlU3BhY2Uxc3RUbzJuZEVuZC4KKyAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgdW51c2VkUmFuZ2VTaXplID0gZnJlZVNwYWNlMXN0VG8ybmRFbmQgLSBsYXN0T2Zmc2V0OworICAgICAgICAgICAgICAgIFByaW50RGV0YWlsZWRNYXBfVW51c2VkUmFuZ2UoanNvbiwgbGFzdE9mZnNldCwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRW5kIG9mIGxvb3AuCisgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gZnJlZVNwYWNlMXN0VG8ybmRFbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9ET1VCTEVfU1RBQ0spCisgICAgeworICAgICAgICBzaXplX3QgbmV4dEFsbG9jMm5kSW5kZXggPSBzdWJhbGxvY2F0aW9uczJuZC5zaXplKCkgLSAxOworICAgICAgICB3aGlsZShsYXN0T2Zmc2V0IDwgc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRmluZCBuZXh0IG5vbi1udWxsIGFsbG9jYXRpb24gb3IgbW92ZSBuZXh0QWxsb2MybmRJbmRleCB0byB0aGUgZW5kLgorICAgICAgICAgICAgd2hpbGUobmV4dEFsbG9jMm5kSW5kZXggIT0gU0laRV9NQVggJiYKKyAgICAgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczJuZFtuZXh0QWxsb2MybmRJbmRleF0uaEFsbG9jYXRpb24gPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1uZXh0QWxsb2MybmRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm91bmQgbm9uLW51bGwgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIGlmKG5leHRBbGxvYzJuZEluZGV4ICE9IFNJWkVfTUFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMybmRbbmV4dEFsbG9jMm5kSW5kZXhdOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gMS4gUHJvY2VzcyBmcmVlIHNwYWNlIGJlZm9yZSB0aGlzIGFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgaWYobGFzdE9mZnNldCA8IHN1YmFsbG9jLm9mZnNldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHN1YmFsbG9jLm9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHVudXNlZFJhbmdlU2l6ZSA9IHN1YmFsbG9jLm9mZnNldCAtIGxhc3RPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIFByaW50RGV0YWlsZWRNYXBfVW51c2VkUmFuZ2UoanNvbiwgbGFzdE9mZnNldCwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyAyLiBQcm9jZXNzIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbGxvY2F0aW9uIHdpdGggc3ViYWxsb2Mub2Zmc2V0LCBzdWJhbGxvYy5zaXplLgorICAgICAgICAgICAgICAgIFByaW50RGV0YWlsZWRNYXBfQWxsb2NhdGlvbihqc29uLCBzdWJhbGxvYy5vZmZzZXQsIHN1YmFsbG9jLmhBbGxvY2F0aW9uKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIDMuIFByZXBhcmUgZm9yIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBzdWJhbGxvYy5vZmZzZXQgKyBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgICAgIC0tbmV4dEFsbG9jMm5kSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihsYXN0T2Zmc2V0IDwgc2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGZyZWUgc3BhY2UgZnJvbSBsYXN0T2Zmc2V0IHRvIHNpemUuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSB1bnVzZWRSYW5nZVNpemUgPSBzaXplIC0gbGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnREZXRhaWxlZE1hcF9VbnVzZWRSYW5nZShqc29uLCBsYXN0T2Zmc2V0LCB1bnVzZWRSYW5nZVNpemUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBsb29wLgorICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUHJpbnREZXRhaWxlZE1hcF9FbmQoanNvbik7Cit9CisjZW5kaWYgLy8gI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorCitib29sIFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpDcmVhdGVBbGxvY2F0aW9uUmVxdWVzdCgKKyAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQsCisgICAgVmtEZXZpY2VTaXplIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHksCisgICAgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSwKKyAgICBWa0RldmljZVNpemUgYWxsb2NBbGlnbm1lbnQsCisgICAgYm9vbCB1cHBlckFkZHJlc3MsCisgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgYWxsb2NUeXBlLAorICAgIGJvb2wgY2FuTWFrZU90aGVyTG9zdCwKKyAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICBWbWFBbGxvY2F0aW9uUmVxdWVzdCogcEFsbG9jYXRpb25SZXF1ZXN0KQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NTaXplID4gMCk7CisgICAgVk1BX0FTU0VSVChhbGxvY1R5cGUgIT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKTsKKyAgICBWTUFfQVNTRVJUKHBBbGxvY2F0aW9uUmVxdWVzdCAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0hFQVZZX0FTU0VSVChWYWxpZGF0ZSgpKTsKKworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBzaXplID0gR2V0U2l6ZSgpOworICAgIFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBzdWJhbGxvY2F0aW9uczFzdCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCk7CisgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKworICAgIGlmKHVwcGVyQWRkcmVzcykKKyAgICB7CisgICAgICAgIGlmKG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX1JJTkdfQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIlRyeWluZyB0byB1c2UgcG9vbCB3aXRoIGxpbmVhciBhbGdvcml0aG0gYXMgZG91YmxlIHN0YWNrLCB3aGlsZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHVzZWQgYXMgcmluZyBidWZmZXIuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgdG8gYWxsb2NhdGUgYmVmb3JlIDJuZC5iYWNrKCksIG9yIGVuZCBvZiBibG9jayBpZiAybmQuZW1wdHkoKS4KKyAgICAgICAgaWYoYWxsb2NTaXplID4gc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFZrRGV2aWNlU2l6ZSByZXN1bHRCYXNlT2Zmc2V0ID0gc2l6ZSAtIGFsbG9jU2l6ZTsKKyAgICAgICAgaWYoIXN1YmFsbG9jYXRpb25zMm5kLmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIGxhc3RTdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMm5kLmJhY2soKTsKKyAgICAgICAgICAgIHJlc3VsdEJhc2VPZmZzZXQgPSBsYXN0U3ViYWxsb2Mub2Zmc2V0IC0gYWxsb2NTaXplOworICAgICAgICAgICAgaWYoYWxsb2NTaXplID4gbGFzdFN1YmFsbG9jLm9mZnNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBmcm9tIG9mZnNldCBlcXVhbCB0byBlbmQgb2YgZnJlZSBzcGFjZS4KKyAgICAgICAgVmtEZXZpY2VTaXplIHJlc3VsdE9mZnNldCA9IHJlc3VsdEJhc2VPZmZzZXQ7CisKKyAgICAgICAgLy8gQXBwbHkgVk1BX0RFQlVHX01BUkdJTiBhdCB0aGUgZW5kLgorICAgICAgICBpZihWTUFfREVCVUdfTUFSR0lOID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocmVzdWx0T2Zmc2V0IDwgVk1BX0RFQlVHX01BUkdJTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHRPZmZzZXQgLT0gVk1BX0RFQlVHX01BUkdJTjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFwcGx5IGFsaWdubWVudC4KKyAgICAgICAgcmVzdWx0T2Zmc2V0ID0gVm1hQWxpZ25Eb3duKHJlc3VsdE9mZnNldCwgYWxsb2NBbGlnbm1lbnQpOworCisgICAgICAgIC8vIENoZWNrIG5leHQgc3ViYWxsb2NhdGlvbnMgZnJvbSAybmQgZm9yIEJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgY29uZmxpY3RzLgorICAgICAgICAvLyBNYWtlIGJpZ2dlciBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LgorICAgICAgICBpZihidWZmZXJJbWFnZUdyYW51bGFyaXR5ID4gMSAmJiAhc3ViYWxsb2NhdGlvbnMybmQuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBidWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvcihzaXplX3QgbmV4dFN1YmFsbG9jSW5kZXggPSBzdWJhbGxvY2F0aW9uczJuZC5zaXplKCk7IG5leHRTdWJhbGxvY0luZGV4LS07ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBuZXh0U3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczJuZFtuZXh0U3ViYWxsb2NJbmRleF07CisgICAgICAgICAgICAgICAgaWYoVm1hQmxvY2tzT25TYW1lUGFnZShyZXN1bHRPZmZzZXQsIGFsbG9jU2l6ZSwgbmV4dFN1YmFsbG9jLm9mZnNldCwgYnVmZmVySW1hZ2VHcmFudWxhcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihWbWFJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdChuZXh0U3ViYWxsb2MudHlwZSwgYWxsb2NUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBvbiBwcmV2aW91cyBwYWdlLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGJ1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBWbWFBbGlnbkRvd24ocmVzdWx0T2Zmc2V0LCBidWZmZXJJbWFnZUdyYW51bGFyaXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXJlIGlzIGVub3VnaCBmcmVlIHNwYWNlLgorICAgICAgICBjb25zdCBWa0RldmljZVNpemUgZW5kT2Yxc3QgPSAhc3ViYWxsb2NhdGlvbnMxc3QuZW1wdHkoKSA/CisgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczFzdC5iYWNrKCkub2Zmc2V0ICsgc3ViYWxsb2NhdGlvbnMxc3QuYmFjaygpLnNpemUgOgorICAgICAgICAgICAgMDsKKyAgICAgICAgaWYoZW5kT2Yxc3QgKyBWTUFfREVCVUdfTUFSR0lOIDw9IHJlc3VsdE9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2hlY2sgcHJldmlvdXMgc3ViYWxsb2NhdGlvbnMgZm9yIEJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgY29uZmxpY3RzLgorICAgICAgICAgICAgLy8gSWYgY29uZmxpY3QgZXhpc3RzLCBhbGxvY2F0aW9uIGNhbm5vdCBiZSBtYWRlIGhlcmUuCisgICAgICAgICAgICBpZihidWZmZXJJbWFnZUdyYW51bGFyaXR5ID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3Ioc2l6ZV90IHByZXZTdWJhbGxvY0luZGV4ID0gc3ViYWxsb2NhdGlvbnMxc3Quc2l6ZSgpOyBwcmV2U3ViYWxsb2NJbmRleC0tOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBwcmV2U3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczFzdFtwcmV2U3ViYWxsb2NJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlmKFZtYUJsb2Nrc09uU2FtZVBhZ2UocHJldlN1YmFsbG9jLm9mZnNldCwgcHJldlN1YmFsbG9jLnNpemUsIHJlc3VsdE9mZnNldCwgYnVmZmVySW1hZ2VHcmFudWxhcml0eSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKFZtYUlzQnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0KGFsbG9jVHlwZSwgcHJldlN1YmFsbG9jLnR5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgb24gbmV4dCBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFsbCB0ZXN0cyBwYXNzZWQ6IFN1Y2Nlc3MuCisgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPm9mZnNldCA9IHJlc3VsdE9mZnNldDsKKyAgICAgICAgICAgIHBBbGxvY2F0aW9uUmVxdWVzdC0+c3VtRnJlZVNpemUgPSByZXN1bHRCYXNlT2Zmc2V0ICsgYWxsb2NTaXplIC0gZW5kT2Yxc3Q7CisgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPnN1bUl0ZW1TaXplID0gMDsKKyAgICAgICAgICAgIC8vIHBBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbSB1bnVzZWQuCisgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW1zVG9NYWtlTG9zdENvdW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gIXVwcGVyQWRkcmVzcworICAgIHsKKyAgICAgICAgaWYobV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfRU1QVFkgfHwgbV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfRE9VQkxFX1NUQUNLKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUcnkgdG8gYWxsb2NhdGUgYXQgdGhlIGVuZCBvZiAxc3QgdmVjdG9yLgorCisgICAgICAgICAgICBWa0RldmljZVNpemUgcmVzdWx0QmFzZU9mZnNldCA9IDA7CisgICAgICAgICAgICBpZighc3ViYWxsb2NhdGlvbnMxc3QuZW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBsYXN0U3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczFzdC5iYWNrKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0QmFzZU9mZnNldCA9IGxhc3RTdWJhbGxvYy5vZmZzZXQgKyBsYXN0U3ViYWxsb2Muc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3RhcnQgZnJvbSBvZmZzZXQgZXF1YWwgdG8gYmVnaW5uaW5nIG9mIGZyZWUgc3BhY2UuCisgICAgICAgICAgICBWa0RldmljZVNpemUgcmVzdWx0T2Zmc2V0ID0gcmVzdWx0QmFzZU9mZnNldDsKKworICAgICAgICAgICAgLy8gQXBwbHkgVk1BX0RFQlVHX01BUkdJTiBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAgICAgICAgaWYoVk1BX0RFQlVHX01BUkdJTiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IFZNQV9ERUJVR19NQVJHSU47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFwcGx5IGFsaWdubWVudC4KKyAgICAgICAgICAgIHJlc3VsdE9mZnNldCA9IFZtYUFsaWduVXAocmVzdWx0T2Zmc2V0LCBhbGxvY0FsaWdubWVudCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHByZXZpb3VzIHN1YmFsbG9jYXRpb25zIGZvciBCdWZmZXJJbWFnZUdyYW51bGFyaXR5IGNvbmZsaWN0cy4KKyAgICAgICAgICAgIC8vIE1ha2UgYmlnZ2VyIGFsaWdubWVudCBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICBpZihidWZmZXJJbWFnZUdyYW51bGFyaXR5ID4gMSAmJiAhc3ViYWxsb2NhdGlvbnMxc3QuZW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvcihzaXplX3QgcHJldlN1YmFsbG9jSW5kZXggPSBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCk7IHByZXZTdWJhbGxvY0luZGV4LS07ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHByZXZTdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMXN0W3ByZXZTdWJhbGxvY0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYoVm1hQmxvY2tzT25TYW1lUGFnZShwcmV2U3ViYWxsb2Mub2Zmc2V0LCBwcmV2U3ViYWxsb2Muc2l6ZSwgcmVzdWx0T2Zmc2V0LCBidWZmZXJJbWFnZUdyYW51bGFyaXR5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoVm1hSXNCdWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3QocHJldlN1YmFsbG9jLnR5cGUsIGFsbG9jVHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IG9uIHByZXZpb3VzIHBhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoYnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ID0gVm1hQWxpZ25VcChyZXN1bHRPZmZzZXQsIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGZyZWVTcGFjZUVuZCA9IG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX0RPVUJMRV9TVEFDSyA/CisgICAgICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMybmQuYmFjaygpLm9mZnNldCA6IHNpemU7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGVub3VnaCBmcmVlIHNwYWNlIGF0IHRoZSBlbmQgYWZ0ZXIgYWxpZ25tZW50LgorICAgICAgICAgICAgaWYocmVzdWx0T2Zmc2V0ICsgYWxsb2NTaXplICsgVk1BX0RFQlVHX01BUkdJTiA8PSBmcmVlU3BhY2VFbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgbmV4dCBzdWJhbGxvY2F0aW9ucyBmb3IgQnVmZmVySW1hZ2VHcmFudWxhcml0eSBjb25mbGljdHMuCisgICAgICAgICAgICAgICAgLy8gSWYgY29uZmxpY3QgZXhpc3RzLCBhbGxvY2F0aW9uIGNhbm5vdCBiZSBtYWRlIGhlcmUuCisgICAgICAgICAgICAgICAgaWYoYnVmZmVySW1hZ2VHcmFudWxhcml0eSA+IDEgJiYgbV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfRE9VQkxFX1NUQUNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHNpemVfdCBuZXh0U3ViYWxsb2NJbmRleCA9IHN1YmFsbG9jYXRpb25zMm5kLnNpemUoKTsgbmV4dFN1YmFsbG9jSW5kZXgtLTsgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBuZXh0U3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczJuZFtuZXh0U3ViYWxsb2NJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZihWbWFCbG9ja3NPblNhbWVQYWdlKHJlc3VsdE9mZnNldCwgYWxsb2NTaXplLCBuZXh0U3ViYWxsb2Mub2Zmc2V0LCBidWZmZXJJbWFnZUdyYW51bGFyaXR5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihWbWFJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdChhbGxvY1R5cGUsIG5leHRTdWJhbGxvYy50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBvbiBwcmV2aW91cyBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQWxsIHRlc3RzIHBhc3NlZDogU3VjY2Vzcy4KKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPm9mZnNldCA9IHJlc3VsdE9mZnNldDsKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPnN1bUZyZWVTaXplID0gZnJlZVNwYWNlRW5kIC0gcmVzdWx0QmFzZU9mZnNldDsKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPnN1bUl0ZW1TaXplID0gMDsKKyAgICAgICAgICAgICAgICAvLyBwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW0gdW51c2VkLgorICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbXNUb01ha2VMb3N0Q291bnQgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV3JhcC1hcm91bmQgdG8gZW5kIG9mIDJuZCB2ZWN0b3IuIFRyeSB0byBhbGxvY2F0ZSB0aGVyZSwgd2F0Y2hpbmcgZm9yIHRoZQorICAgICAgICAvLyBiZWdpbm5pbmcgb2YgMXN0IHZlY3RvciBhcyB0aGUgZW5kIG9mIGZyZWUgc3BhY2UuCisgICAgICAgIGlmKG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX0VNUFRZIHx8IG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX1JJTkdfQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICBWTUFfQVNTRVJUKCFzdWJhbGxvY2F0aW9uczFzdC5lbXB0eSgpKTsKKworICAgICAgICAgICAgVmtEZXZpY2VTaXplIHJlc3VsdEJhc2VPZmZzZXQgPSAwOworICAgICAgICAgICAgaWYoIXN1YmFsbG9jYXRpb25zMm5kLmVtcHR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgbGFzdFN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMybmQuYmFjaygpOworICAgICAgICAgICAgICAgIHJlc3VsdEJhc2VPZmZzZXQgPSBsYXN0U3ViYWxsb2Mub2Zmc2V0ICsgbGFzdFN1YmFsbG9jLnNpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IGZyb20gb2Zmc2V0IGVxdWFsIHRvIGJlZ2lubmluZyBvZiBmcmVlIHNwYWNlLgorICAgICAgICAgICAgVmtEZXZpY2VTaXplIHJlc3VsdE9mZnNldCA9IHJlc3VsdEJhc2VPZmZzZXQ7CisKKyAgICAgICAgICAgIC8vIEFwcGx5IFZNQV9ERUJVR19NQVJHSU4gYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgICAgICAgIGlmKFZNQV9ERUJVR19NQVJHSU4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBWTUFfREVCVUdfTUFSR0lOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBcHBseSBhbGlnbm1lbnQuCisgICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBWbWFBbGlnblVwKHJlc3VsdE9mZnNldCwgYWxsb2NBbGlnbm1lbnQpOworCisgICAgICAgICAgICAvLyBDaGVjayBwcmV2aW91cyBzdWJhbGxvY2F0aW9ucyBmb3IgQnVmZmVySW1hZ2VHcmFudWxhcml0eSBjb25mbGljdHMuCisgICAgICAgICAgICAvLyBNYWtlIGJpZ2dlciBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAgaWYoYnVmZmVySW1hZ2VHcmFudWxhcml0eSA+IDEgJiYgIXN1YmFsbG9jYXRpb25zMm5kLmVtcHR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCBidWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3Ioc2l6ZV90IHByZXZTdWJhbGxvY0luZGV4ID0gc3ViYWxsb2NhdGlvbnMybmQuc2l6ZSgpOyBwcmV2U3ViYWxsb2NJbmRleC0tOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBwcmV2U3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczJuZFtwcmV2U3ViYWxsb2NJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlmKFZtYUJsb2Nrc09uU2FtZVBhZ2UocHJldlN1YmFsbG9jLm9mZnNldCwgcHJldlN1YmFsbG9jLnNpemUsIHJlc3VsdE9mZnNldCwgYnVmZmVySW1hZ2VHcmFudWxhcml0eSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKFZtYUlzQnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0KHByZXZTdWJhbGxvYy50eXBlLCBhbGxvY1R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBvbiBwcmV2aW91cyBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGJ1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCA9IFZtYUFsaWduVXAocmVzdWx0T2Zmc2V0LCBidWZmZXJJbWFnZUdyYW51bGFyaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbXNUb01ha2VMb3N0Q291bnQgPSAwOworICAgICAgICAgICAgcEFsbG9jYXRpb25SZXF1ZXN0LT5zdW1JdGVtU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3QgaW5kZXgxc3QgPSBtXzFzdE51bGxJdGVtc0JlZ2luQ291bnQ7CisKKyAgICAgICAgICAgIGlmKGNhbk1ha2VPdGhlckxvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUoaW5kZXgxc3QgPCBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICsgYWxsb2NTaXplICsgVk1BX0RFQlVHX01BUkdJTiA+IHN1YmFsbG9jYXRpb25zMXN0W2luZGV4MXN0XS5vZmZzZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGNvbGxpZGluZyBhbGxvY2F0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgMXN0IHZlY3RvciBmb3VuZC4gVHJ5IHRvIG1ha2UgaXQgbG9zdC4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczFzdFtpbmRleDFzdF07CisgICAgICAgICAgICAgICAgICAgIGlmKHN1YmFsbG9jLnR5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBwcm9ibGVtLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVk1BX0FTU0VSVChzdWJhbGxvYy5oQWxsb2NhdGlvbiAhPSBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihzdWJhbGxvYy5oQWxsb2NhdGlvbi0+Q2FuQmVjb21lTG9zdCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2MuaEFsbG9jYXRpb24tPkdldExhc3RVc2VGcmFtZUluZGV4KCkgKyBmcmFtZUluVXNlQ291bnQgPCBjdXJyZW50RnJhbWVJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3BBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbXNUb01ha2VMb3N0Q291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25SZXF1ZXN0LT5zdW1JdGVtU2l6ZSArPSBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2luZGV4MXN0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENoZWNrIG5leHQgc3ViYWxsb2NhdGlvbnMgZm9yIEJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgY29uZmxpY3RzLgorICAgICAgICAgICAgICAgIC8vIElmIGNvbmZsaWN0IGV4aXN0cywgd2UgbXVzdCBtYXJrIG1vcmUgYWxsb2NhdGlvbnMgbG9zdCBvciBmYWlsLgorICAgICAgICAgICAgICAgIGlmKGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoaW5kZXgxc3QgPCBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZtYVN1YmFsbG9jYXRpb24mIHN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMxc3RbaW5kZXgxc3RdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoVm1hQmxvY2tzT25TYW1lUGFnZShyZXN1bHRPZmZzZXQsIGFsbG9jU2l6ZSwgc3ViYWxsb2Mub2Zmc2V0LCBidWZmZXJJbWFnZUdyYW51bGFyaXR5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdWJhbGxvYy5oQWxsb2NhdGlvbiAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBjaGVja2luZyBhY3R1YWwgVm1hSXNCdWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3QoYWxsb2NUeXBlLCBzdWJhbGxvYy50eXBlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3ViYWxsb2MuaEFsbG9jYXRpb24tPkNhbkJlY29tZUxvc3QoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2MuaEFsbG9jYXRpb24tPkdldExhc3RVc2VGcmFtZUluZGV4KCkgKyBmcmFtZUluVXNlQ291bnQgPCBjdXJyZW50RnJhbWVJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW1zVG9NYWtlTG9zdENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25SZXF1ZXN0LT5zdW1JdGVtU2l6ZSArPSBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgb24gbmV4dCBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKytpbmRleDFzdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhlcmUgaXMgZW5vdWdoIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBhZnRlciBhbGlnbm1lbnQuCisgICAgICAgICAgICBpZigoaW5kZXgxc3QgPT0gc3ViYWxsb2NhdGlvbnMxc3Quc2l6ZSgpICYmIHJlc3VsdE9mZnNldCArIGFsbG9jU2l6ZSArIFZNQV9ERUJVR19NQVJHSU4gPCBzaXplKSB8fAorICAgICAgICAgICAgICAgIChpbmRleDFzdCA8IHN1YmFsbG9jYXRpb25zMXN0LnNpemUoKSAmJiByZXN1bHRPZmZzZXQgKyBhbGxvY1NpemUgKyBWTUFfREVCVUdfTUFSR0lOIDw9IHN1YmFsbG9jYXRpb25zMXN0W2luZGV4MXN0XS5vZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIG5leHQgc3ViYWxsb2NhdGlvbnMgZm9yIEJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgY29uZmxpY3RzLgorICAgICAgICAgICAgICAgIC8vIElmIGNvbmZsaWN0IGV4aXN0cywgYWxsb2NhdGlvbiBjYW5ub3QgYmUgbWFkZSBoZXJlLgorICAgICAgICAgICAgICAgIGlmKGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHNpemVfdCBuZXh0U3ViYWxsb2NJbmRleCA9IGluZGV4MXN0OworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN1YmFsbG9jSW5kZXggPCBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3ViYWxsb2NJbmRleCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBuZXh0U3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczFzdFtuZXh0U3ViYWxsb2NJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZihWbWFCbG9ja3NPblNhbWVQYWdlKHJlc3VsdE9mZnNldCwgYWxsb2NTaXplLCBuZXh0U3ViYWxsb2Mub2Zmc2V0LCBidWZmZXJJbWFnZUdyYW51bGFyaXR5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihWbWFJc0J1ZmZlckltYWdlR3JhbnVsYXJpdHlDb25mbGljdChhbGxvY1R5cGUsIG5leHRTdWJhbGxvYy50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBvbiBuZXh0IHBhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBbGwgdGVzdHMgcGFzc2VkOiBTdWNjZXNzLgorICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uUmVxdWVzdC0+b2Zmc2V0ID0gcmVzdWx0T2Zmc2V0OworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uUmVxdWVzdC0+c3VtRnJlZVNpemUgPQorICAgICAgICAgICAgICAgICAgICAoaW5kZXgxc3QgPCBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCkgPyBzdWJhbGxvY2F0aW9uczFzdFtpbmRleDFzdF0ub2Zmc2V0IDogc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgLSByZXN1bHRCYXNlT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIC0gcEFsbG9jYXRpb25SZXF1ZXN0LT5zdW1JdGVtU2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW0gdW51c2VkLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpNYWtlUmVxdWVzdGVkQWxsb2NhdGlvbnNMb3N0KAorICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCwKKyAgICBWbWFBbGxvY2F0aW9uUmVxdWVzdCogcEFsbG9jYXRpb25SZXF1ZXN0KQoreworICAgIGlmKHBBbGxvY2F0aW9uUmVxdWVzdC0+aXRlbXNUb01ha2VMb3N0Q291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFZNQV9BU1NFUlQobV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfRU1QVFkgfHwgbV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfUklOR19CVUZGRVIpOworICAgIAorICAgIFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBzdWJhbGxvY2F0aW9uczFzdCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCk7CisgICAgc2l6ZV90IGluZGV4MXN0ID0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50OworICAgIHNpemVfdCBtYWRlTG9zdENvdW50ID0gMDsKKyAgICB3aGlsZShtYWRlTG9zdENvdW50IDwgcEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtc1RvTWFrZUxvc3RDb3VudCkKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQoaW5kZXgxc3QgPCBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCkpOworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMXN0W2luZGV4MXN0XTsKKyAgICAgICAgaWYoc3ViYWxsb2MudHlwZSAhPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9BU1NFUlQoc3ViYWxsb2MuaEFsbG9jYXRpb24gIT0gVktfTlVMTF9IQU5ETEUpOworICAgICAgICAgICAgVk1BX0FTU0VSVChzdWJhbGxvYy5oQWxsb2NhdGlvbi0+Q2FuQmVjb21lTG9zdCgpKTsKKyAgICAgICAgICAgIGlmKHN1YmFsbG9jLmhBbGxvY2F0aW9uLT5NYWtlTG9zdChjdXJyZW50RnJhbWVJbmRleCwgZnJhbWVJblVzZUNvdW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdWJhbGxvYy50eXBlID0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFOworICAgICAgICAgICAgICAgIHN1YmFsbG9jLmhBbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICAgICAgbV9TdW1GcmVlU2l6ZSArPSBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgICAgICsrbV8xc3ROdWxsSXRlbXNNaWRkbGVDb3VudDsKKyAgICAgICAgICAgICAgICArK21hZGVMb3N0Q291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICsraW5kZXgxc3Q7CisgICAgfQorCisgICAgQ2xlYW51cEFmdGVyRnJlZSgpOworICAgIC8vVk1BX0hFQVZZX0FTU0VSVChWYWxpZGF0ZSgpKTsgLy8gQWxyZWFkeSBjYWxsZWQgYnkgQ2xhbnVwQWZ0ZXJGcmVlKCkuCisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQzMl90IFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpNYWtlQWxsb2NhdGlvbnNMb3N0KHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LCB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQpCit7CisgICAgdWludDMyX3QgbG9zdEFsbG9jYXRpb25Db3VudCA9IDA7CisgICAgCisgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMXN0ID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMxc3QoKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSBtXzFzdE51bGxJdGVtc0JlZ2luQ291bnQsIGNvdW50ID0gc3ViYWxsb2NhdGlvbnMxc3Quc2l6ZSgpOyBpIDwgY291bnQ7ICsraSkKKyAgICB7CisgICAgICAgIFZtYVN1YmFsbG9jYXRpb24mIHN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMxc3RbaV07CisgICAgICAgIGlmKHN1YmFsbG9jLnR5cGUgIT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFICYmCisgICAgICAgICAgICBzdWJhbGxvYy5oQWxsb2NhdGlvbi0+Q2FuQmVjb21lTG9zdCgpICYmCisgICAgICAgICAgICBzdWJhbGxvYy5oQWxsb2NhdGlvbi0+TWFrZUxvc3QoY3VycmVudEZyYW1lSW5kZXgsIGZyYW1lSW5Vc2VDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1YmFsbG9jLnR5cGUgPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUU7CisgICAgICAgICAgICBzdWJhbGxvYy5oQWxsb2NhdGlvbiA9IFZLX05VTExfSEFORExFOworICAgICAgICAgICAgKyttXzFzdE51bGxJdGVtc01pZGRsZUNvdW50OworICAgICAgICAgICAgbV9TdW1GcmVlU2l6ZSArPSBzdWJhbGxvYy5zaXplOworICAgICAgICAgICAgKytsb3N0QWxsb2NhdGlvbkNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwLCBjb3VudCA9IHN1YmFsbG9jYXRpb25zMm5kLnNpemUoKTsgaSA8IGNvdW50OyArK2kpCisgICAgeworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMm5kW2ldOworICAgICAgICBpZihzdWJhbGxvYy50eXBlICE9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSAmJgorICAgICAgICAgICAgc3ViYWxsb2MuaEFsbG9jYXRpb24tPkNhbkJlY29tZUxvc3QoKSAmJgorICAgICAgICAgICAgc3ViYWxsb2MuaEFsbG9jYXRpb24tPk1ha2VMb3N0KGN1cnJlbnRGcmFtZUluZGV4LCBmcmFtZUluVXNlQ291bnQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdWJhbGxvYy50eXBlID0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFOworICAgICAgICAgICAgc3ViYWxsb2MuaEFsbG9jYXRpb24gPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgICAgICsrbV8ybmROdWxsSXRlbXNDb3VudDsKKyAgICAgICAgICAgICsrbG9zdEFsbG9jYXRpb25Db3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGxvc3RBbGxvY2F0aW9uQ291bnQpCisgICAgeworICAgICAgICBDbGVhbnVwQWZ0ZXJGcmVlKCk7CisgICAgfQorCisgICAgcmV0dXJuIGxvc3RBbGxvY2F0aW9uQ291bnQ7Cit9CisKK1ZrUmVzdWx0IFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpDaGVja0NvcnJ1cHRpb24oY29uc3Qgdm9pZCogcEJsb2NrRGF0YSkKK3sKKyAgICBTdWJhbGxvY2F0aW9uVmVjdG9yVHlwZSYgc3ViYWxsb2NhdGlvbnMxc3QgPSBBY2Nlc3NTdWJhbGxvY2F0aW9uczFzdCgpOworICAgIGZvcihzaXplX3QgaSA9IG1fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudCwgY291bnQgPSBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCk7IGkgPCBjb3VudDsgKytpKQorICAgIHsKKyAgICAgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczFzdFtpXTsKKyAgICAgICAgaWYoc3ViYWxsb2MudHlwZSAhPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFWbWFWYWxpZGF0ZU1hZ2ljVmFsdWUocEJsb2NrRGF0YSwgc3ViYWxsb2Mub2Zmc2V0IC0gVk1BX0RFQlVHX01BUkdJTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk1BX0FTU0VSVCgwICYmICJNRU1PUlkgQ09SUlVQVElPTiBERVRFQ1RFRCBCRUZPUkUgVkFMSURBVEVEIEFMTE9DQVRJT04hIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFWbWFWYWxpZGF0ZU1hZ2ljVmFsdWUocEJsb2NrRGF0YSwgc3ViYWxsb2Mub2Zmc2V0ICsgc3ViYWxsb2Muc2l6ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk1BX0FTU0VSVCgwICYmICJNRU1PUlkgQ09SUlVQVElPTiBERVRFQ1RFRCBBRlRFUiBWQUxJREFURUQgQUxMT0NBVElPTiEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwLCBjb3VudCA9IHN1YmFsbG9jYXRpb25zMm5kLnNpemUoKTsgaSA8IGNvdW50OyArK2kpCisgICAgeworICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uJiBzdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMm5kW2ldOworICAgICAgICBpZihzdWJhbGxvYy50eXBlICE9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIVZtYVZhbGlkYXRlTWFnaWNWYWx1ZShwQmxvY2tEYXRhLCBzdWJhbGxvYy5vZmZzZXQgLSBWTUFfREVCVUdfTUFSR0lOKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIk1FTU9SWSBDT1JSVVBUSU9OIERFVEVDVEVEIEJFRk9SRSBWQUxJREFURUQgQUxMT0NBVElPTiEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIVZtYVZhbGlkYXRlTWFnaWNWYWx1ZShwQmxvY2tEYXRhLCBzdWJhbGxvYy5vZmZzZXQgKyBzdWJhbGxvYy5zaXplKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIk1FTU9SWSBDT1JSVVBUSU9OIERFVEVDVEVEIEFGVEVSIFZBTElEQVRFRCBBTExPQ0FUSU9OISIpOworICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0xpbmVhcjo6QWxsb2MoCisgICAgY29uc3QgVm1hQWxsb2NhdGlvblJlcXVlc3QmIHJlcXVlc3QsCisgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgdHlwZSwKKyAgICBWa0RldmljZVNpemUgYWxsb2NTaXplLAorICAgIGJvb2wgdXBwZXJBZGRyZXNzLAorICAgIFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24pCit7CisgICAgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiBuZXdTdWJhbGxvYyA9IHsgcmVxdWVzdC5vZmZzZXQsIGFsbG9jU2l6ZSwgaEFsbG9jYXRpb24sIHR5cGUgfTsKKworICAgIGlmKHVwcGVyQWRkcmVzcykKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQobV8ybmRWZWN0b3JNb2RlICE9IFNFQ09ORF9WRUNUT1JfUklOR19CVUZGRVIgJiYKKyAgICAgICAgICAgICJDUklUSUNBTCBFUlJPUjogVHJ5aW5nIHRvIHVzZSBsaW5lYXIgYWxsb2NhdG9yIGFzIGRvdWJsZSBzdGFjayB3aGlsZSBpdCB3YXMgYWxyZWFkeSB1c2VkIGFzIHJpbmcgYnVmZmVyLiIpOworICAgICAgICBTdWJhbGxvY2F0aW9uVmVjdG9yVHlwZSYgc3ViYWxsb2NhdGlvbnMybmQgPSBBY2Nlc3NTdWJhbGxvY2F0aW9uczJuZCgpOworICAgICAgICBzdWJhbGxvY2F0aW9uczJuZC5wdXNoX2JhY2sobmV3U3ViYWxsb2MpOworICAgICAgICBtXzJuZFZlY3Rvck1vZGUgPSBTRUNPTkRfVkVDVE9SX0RPVUJMRV9TVEFDSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMXN0ID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMxc3QoKTsKKworICAgICAgICAvLyBGaXJzdCBhbGxvY2F0aW9uLgorICAgICAgICBpZihzdWJhbGxvY2F0aW9uczFzdC5lbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczFzdC5wdXNoX2JhY2sobmV3U3ViYWxsb2MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTmV3IGFsbG9jYXRpb24gYXQgdGhlIGVuZCBvZiAxc3QgdmVjdG9yLgorICAgICAgICAgICAgaWYocmVxdWVzdC5vZmZzZXQgPj0gc3ViYWxsb2NhdGlvbnMxc3QuYmFjaygpLm9mZnNldCArIHN1YmFsbG9jYXRpb25zMXN0LmJhY2soKS5zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0IGZpdHMgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorICAgICAgICAgICAgICAgIFZNQV9BU1NFUlQocmVxdWVzdC5vZmZzZXQgKyBhbGxvY1NpemUgPD0gR2V0U2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczFzdC5wdXNoX2JhY2sobmV3U3ViYWxsb2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTmV3IGFsbG9jYXRpb24gYXQgdGhlIGVuZCBvZiAyLXBhcnQgcmluZyBidWZmZXIsIHNvIGJlZm9yZSBmaXJzdCBhbGxvY2F0aW9uIGZyb20gMXN0IHZlY3Rvci4KKyAgICAgICAgICAgIGVsc2UgaWYocmVxdWVzdC5vZmZzZXQgKyBhbGxvY1NpemUgPD0gc3ViYWxsb2NhdGlvbnMxc3RbbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50XS5vZmZzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaChtXzJuZFZlY3Rvck1vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU0VDT05EX1ZFQ1RPUl9FTVBUWToKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgYWxsb2NhdGlvbiBmcm9tIHNlY29uZCBwYXJ0IHJpbmcgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKHN1YmFsbG9jYXRpb25zMm5kLmVtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICBtXzJuZFZlY3Rvck1vZGUgPSBTRUNPTkRfVkVDVE9SX1JJTkdfQlVGRkVSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFQ09ORF9WRUNUT1JfUklOR19CVUZGRVI6CisgICAgICAgICAgICAgICAgICAgIC8vIDItcGFydCByaW5nIGJ1ZmZlciBpcyBhbHJlYWR5IHN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgICAgIFZNQV9BU1NFUlQoIXN1YmFsbG9jYXRpb25zMm5kLmVtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFQ09ORF9WRUNUT1JfRE9VQkxFX1NUQUNLOgorICAgICAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIkNSSVRJQ0FMIEVSUk9SOiBUcnlpbmcgdG8gdXNlIGxpbmVhciBhbGxvY2F0b3IgYXMgcmluZyBidWZmZXIgd2hpbGUgaXQgd2FzIGFscmVhZHkgdXNlZCBhcyBkb3VibGUgc3RhY2suIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFZNQV9BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMybmQucHVzaF9iYWNrKG5ld1N1YmFsbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIkNSSVRJQ0FMIElOVEVSTkFMIEVSUk9SLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9TdW1GcmVlU2l6ZSAtPSBuZXdTdWJhbGxvYy5zaXplOworfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpGcmVlKGNvbnN0IFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBGcmVlQXRPZmZzZXQoYWxsb2NhdGlvbi0+R2V0T2Zmc2V0KCkpOworfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfTGluZWFyOjpGcmVlQXRPZmZzZXQoVmtEZXZpY2VTaXplIG9mZnNldCkKK3sKKyAgICBTdWJhbGxvY2F0aW9uVmVjdG9yVHlwZSYgc3ViYWxsb2NhdGlvbnMxc3QgPSBBY2Nlc3NTdWJhbGxvY2F0aW9uczFzdCgpOworICAgIFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBzdWJhbGxvY2F0aW9uczJuZCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMm5kKCk7CisKKyAgICBpZighc3ViYWxsb2NhdGlvbnMxc3QuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIC8vIEZpcnN0IGFsbG9jYXRpb246IE1hcmsgaXQgYXMgbmV4dCBlbXB0eSBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAgICBWbWFTdWJhbGxvY2F0aW9uJiBmaXJzdFN1YmFsbG9jID0gc3ViYWxsb2NhdGlvbnMxc3RbbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50XTsKKyAgICAgICAgaWYoZmlyc3RTdWJhbGxvYy5vZmZzZXQgPT0gb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdFN1YmFsbG9jLnR5cGUgPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUU7CisgICAgICAgICAgICBmaXJzdFN1YmFsbG9jLmhBbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICBtX1N1bUZyZWVTaXplICs9IGZpcnN0U3ViYWxsb2Muc2l6ZTsKKyAgICAgICAgICAgICsrbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50OworICAgICAgICAgICAgQ2xlYW51cEFmdGVyRnJlZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTGFzdCBhbGxvY2F0aW9uIGluIDItcGFydCByaW5nIGJ1ZmZlciBvciB0b3Agb2YgdXBwZXIgc3RhY2sgKHNhbWUgbG9naWMpLgorICAgIGlmKG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX1JJTkdfQlVGRkVSIHx8CisgICAgICAgIG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX0RPVUJMRV9TVEFDSykKKyAgICB7CisgICAgICAgIFZtYVN1YmFsbG9jYXRpb24mIGxhc3RTdWJhbGxvYyA9IHN1YmFsbG9jYXRpb25zMm5kLmJhY2soKTsKKyAgICAgICAgaWYobGFzdFN1YmFsbG9jLm9mZnNldCA9PSBvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fU3VtRnJlZVNpemUgKz0gbGFzdFN1YmFsbG9jLnNpemU7CisgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczJuZC5wb3BfYmFjaygpOworICAgICAgICAgICAgQ2xlYW51cEFmdGVyRnJlZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIC8vIExhc3QgYWxsb2NhdGlvbiBpbiAxc3QgdmVjdG9yLgorICAgIGVsc2UgaWYobV8ybmRWZWN0b3JNb2RlID09IFNFQ09ORF9WRUNUT1JfRU1QVFkpCisgICAgeworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uJiBsYXN0U3ViYWxsb2MgPSBzdWJhbGxvY2F0aW9uczFzdC5iYWNrKCk7CisgICAgICAgIGlmKGxhc3RTdWJhbGxvYy5vZmZzZXQgPT0gb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBtX1N1bUZyZWVTaXplICs9IGxhc3RTdWJhbGxvYy5zaXplOworICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMxc3QucG9wX2JhY2soKTsKKyAgICAgICAgICAgIENsZWFudXBBZnRlckZyZWUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEl0ZW0gZnJvbSB0aGUgbWlkZGxlIG9mIDFzdCB2ZWN0b3IuCisgICAgeworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uIHJlZlN1YmFsbG9jOworICAgICAgICByZWZTdWJhbGxvYy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIC8vIFJlc3Qgb2YgbWVtYmVycyBzdGF5cyB1bmluaXRpYWxpemVkIGludGVudGlvbmFsbHkgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KKyAgICAgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGU6Oml0ZXJhdG9yIGl0ID0gVm1hVmVjdG9yRmluZFNvcnRlZDxWbWFTdWJhbGxvY2F0aW9uT2Zmc2V0TGVzcz4oCisgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczFzdC5iZWdpbigpICsgbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50LAorICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMxc3QuZW5kKCksCisgICAgICAgICAgICByZWZTdWJhbGxvYyk7CisgICAgICAgIGlmKGl0ICE9IHN1YmFsbG9jYXRpb25zMXN0LmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpdC0+dHlwZSA9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRTsKKyAgICAgICAgICAgIGl0LT5oQWxsb2NhdGlvbiA9IFZLX05VTExfSEFORExFOworICAgICAgICAgICAgKyttXzFzdE51bGxJdGVtc01pZGRsZUNvdW50OworICAgICAgICAgICAgbV9TdW1GcmVlU2l6ZSArPSBpdC0+c2l6ZTsKKyAgICAgICAgICAgIENsZWFudXBBZnRlckZyZWUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKG1fMm5kVmVjdG9yTW9kZSAhPSBTRUNPTkRfVkVDVE9SX0VNUFRZKQorICAgIHsKKyAgICAgICAgLy8gSXRlbSBmcm9tIHRoZSBtaWRkbGUgb2YgMm5kIHZlY3Rvci4KKyAgICAgICAgVm1hU3ViYWxsb2NhdGlvbiByZWZTdWJhbGxvYzsKKyAgICAgICAgcmVmU3ViYWxsb2Mub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAvLyBSZXN0IG9mIG1lbWJlcnMgc3RheXMgdW5pbml0aWFsaXplZCBpbnRlbnRpb25hbGx5IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAgIFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlOjppdGVyYXRvciBpdCA9IG1fMm5kVmVjdG9yTW9kZSA9PSBTRUNPTkRfVkVDVE9SX1JJTkdfQlVGRkVSID8KKyAgICAgICAgICAgIFZtYVZlY3RvckZpbmRTb3J0ZWQ8Vm1hU3ViYWxsb2NhdGlvbk9mZnNldExlc3M+KHN1YmFsbG9jYXRpb25zMm5kLmJlZ2luKCksIHN1YmFsbG9jYXRpb25zMm5kLmVuZCgpLCByZWZTdWJhbGxvYykgOgorICAgICAgICAgICAgVm1hVmVjdG9yRmluZFNvcnRlZDxWbWFTdWJhbGxvY2F0aW9uT2Zmc2V0R3JlYXRlcj4oc3ViYWxsb2NhdGlvbnMybmQuYmVnaW4oKSwgc3ViYWxsb2NhdGlvbnMybmQuZW5kKCksIHJlZlN1YmFsbG9jKTsKKyAgICAgICAgaWYoaXQgIT0gc3ViYWxsb2NhdGlvbnMybmQuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0LT50eXBlID0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9GUkVFOworICAgICAgICAgICAgaXQtPmhBbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICArK21fMm5kTnVsbEl0ZW1zQ291bnQ7CisgICAgICAgICAgICBtX1N1bUZyZWVTaXplICs9IGl0LT5zaXplOworICAgICAgICAgICAgQ2xlYW51cEFmdGVyRnJlZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgVk1BX0FTU0VSVCgwICYmICJBbGxvY2F0aW9uIHRvIGZyZWUgbm90IGZvdW5kIGluIGxpbmVhciBhbGxvY2F0b3IhIik7Cit9CisKK2Jvb2wgVm1hQmxvY2tNZXRhZGF0YV9MaW5lYXI6OlNob3VsZENvbXBhY3Qxc3QoKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBudWxsSXRlbUNvdW50ID0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50ICsgbV8xc3ROdWxsSXRlbXNNaWRkbGVDb3VudDsKKyAgICBjb25zdCBzaXplX3Qgc3ViYWxsb2NDb3VudCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCkuc2l6ZSgpOworICAgIHJldHVybiBzdWJhbGxvY0NvdW50ID4gMzIgJiYgbnVsbEl0ZW1Db3VudCAqIDIgPj0gKHN1YmFsbG9jQ291bnQgLSBudWxsSXRlbUNvdW50KSAqIDM7Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9MaW5lYXI6OkNsZWFudXBBZnRlckZyZWUoKQoreworICAgIFN1YmFsbG9jYXRpb25WZWN0b3JUeXBlJiBzdWJhbGxvY2F0aW9uczFzdCA9IEFjY2Vzc1N1YmFsbG9jYXRpb25zMXN0KCk7CisgICAgU3ViYWxsb2NhdGlvblZlY3RvclR5cGUmIHN1YmFsbG9jYXRpb25zMm5kID0gQWNjZXNzU3ViYWxsb2NhdGlvbnMybmQoKTsKKworICAgIGlmKElzRW1wdHkoKSkKKyAgICB7CisgICAgICAgIHN1YmFsbG9jYXRpb25zMXN0LmNsZWFyKCk7CisgICAgICAgIHN1YmFsbG9jYXRpb25zMm5kLmNsZWFyKCk7CisgICAgICAgIG1fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudCA9IDA7CisgICAgICAgIG1fMXN0TnVsbEl0ZW1zTWlkZGxlQ291bnQgPSAwOworICAgICAgICBtXzJuZE51bGxJdGVtc0NvdW50ID0gMDsKKyAgICAgICAgbV8ybmRWZWN0b3JNb2RlID0gU0VDT05EX1ZFQ1RPUl9FTVBUWTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHN1YmFsbG9jMXN0Q291bnQgPSBzdWJhbGxvY2F0aW9uczFzdC5zaXplKCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBudWxsSXRlbTFzdENvdW50ID0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50ICsgbV8xc3ROdWxsSXRlbXNNaWRkbGVDb3VudDsKKyAgICAgICAgVk1BX0FTU0VSVChudWxsSXRlbTFzdENvdW50IDw9IHN1YmFsbG9jMXN0Q291bnQpOworCisgICAgICAgIC8vIEZpbmQgbW9yZSBudWxsIGl0ZW1zIGF0IHRoZSBiZWdpbm5pbmcgb2YgMXN0IHZlY3Rvci4KKyAgICAgICAgd2hpbGUobV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50IDwgc3ViYWxsb2Mxc3RDb3VudCAmJgorICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMxc3RbbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50XS5oQWxsb2NhdGlvbiA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgeworICAgICAgICAgICAgKyttXzFzdE51bGxJdGVtc0JlZ2luQ291bnQ7CisgICAgICAgICAgICAtLW1fMXN0TnVsbEl0ZW1zTWlkZGxlQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIG1vcmUgbnVsbCBpdGVtcyBhdCB0aGUgZW5kIG9mIDFzdCB2ZWN0b3IuCisgICAgICAgIHdoaWxlKG1fMXN0TnVsbEl0ZW1zTWlkZGxlQ291bnQgPiAwICYmCisgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczFzdC5iYWNrKCkuaEFsbG9jYXRpb24gPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC0tbV8xc3ROdWxsSXRlbXNNaWRkbGVDb3VudDsKKyAgICAgICAgICAgIHN1YmFsbG9jYXRpb25zMXN0LnBvcF9iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIG1vcmUgbnVsbCBpdGVtcyBhdCB0aGUgZW5kIG9mIDJuZCB2ZWN0b3IuCisgICAgICAgIHdoaWxlKG1fMm5kTnVsbEl0ZW1zQ291bnQgPiAwICYmCisgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczJuZC5iYWNrKCkuaEFsbG9jYXRpb24gPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC0tbV8ybmROdWxsSXRlbXNDb3VudDsKKyAgICAgICAgICAgIHN1YmFsbG9jYXRpb25zMm5kLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICBpZihTaG91bGRDb21wYWN0MXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBub25OdWxsSXRlbUNvdW50ID0gc3ViYWxsb2Mxc3RDb3VudCAtIG51bGxJdGVtMXN0Q291bnQ7CisgICAgICAgICAgICBzaXplX3Qgc3JjSW5kZXggPSBtXzFzdE51bGxJdGVtc0JlZ2luQ291bnQ7CisgICAgICAgICAgICBmb3Ioc2l6ZV90IGRzdEluZGV4ID0gMDsgZHN0SW5kZXggPCBub25OdWxsSXRlbUNvdW50OyArK2RzdEluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlKHN1YmFsbG9jYXRpb25zMXN0W3NyY0luZGV4XS5oQWxsb2NhdGlvbiA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrc3JjSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGRzdEluZGV4ICE9IHNyY0luZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMxc3RbZHN0SW5kZXhdID0gc3ViYWxsb2NhdGlvbnMxc3Rbc3JjSW5kZXhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3NyY0luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ViYWxsb2NhdGlvbnMxc3QucmVzaXplKG5vbk51bGxJdGVtQ291bnQpOworICAgICAgICAgICAgbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50ID0gMDsKKyAgICAgICAgICAgIG1fMXN0TnVsbEl0ZW1zTWlkZGxlQ291bnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gMm5kIHZlY3RvciBiZWNhbWUgZW1wdHkuCisgICAgICAgIGlmKHN1YmFsbG9jYXRpb25zMm5kLmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fMm5kVmVjdG9yTW9kZSA9IFNFQ09ORF9WRUNUT1JfRU1QVFk7CisgICAgICAgIH0KKworICAgICAgICAvLyAxc3QgdmVjdG9yIGJlY2FtZSBlbXB0eS4KKyAgICAgICAgaWYoc3ViYWxsb2NhdGlvbnMxc3Quc2l6ZSgpIC0gbV8xc3ROdWxsSXRlbXNCZWdpbkNvdW50ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1YmFsbG9jYXRpb25zMXN0LmNsZWFyKCk7CisgICAgICAgICAgICBtXzFzdE51bGxJdGVtc0JlZ2luQ291bnQgPSAwOworCisgICAgICAgICAgICBpZighc3ViYWxsb2NhdGlvbnMybmQuZW1wdHkoKSAmJiBtXzJuZFZlY3Rvck1vZGUgPT0gU0VDT05EX1ZFQ1RPUl9SSU5HX0JVRkZFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTd2FwIDFzdCB3aXRoIDJuZC4gTm93IDJuZCBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICBtXzJuZFZlY3Rvck1vZGUgPSBTRUNPTkRfVkVDVE9SX0VNUFRZOworICAgICAgICAgICAgICAgIG1fMXN0TnVsbEl0ZW1zTWlkZGxlQ291bnQgPSBtXzJuZE51bGxJdGVtc0NvdW50OworICAgICAgICAgICAgICAgIHdoaWxlKG1fMXN0TnVsbEl0ZW1zQmVnaW5Db3VudCA8IHN1YmFsbG9jYXRpb25zMm5kLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAgICBzdWJhbGxvY2F0aW9uczJuZFttXzFzdE51bGxJdGVtc0JlZ2luQ291bnRdLmhBbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKyttXzFzdE51bGxJdGVtc0JlZ2luQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIC0tbV8xc3ROdWxsSXRlbXNNaWRkbGVDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV8ybmROdWxsSXRlbXNDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgbV8xc3RWZWN0b3JJbmRleCBePSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVk1BX0hFQVZZX0FTU0VSVChWYWxpZGF0ZSgpKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gY2xhc3MgVm1hQmxvY2tNZXRhZGF0YV9CdWRkeQorCitWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpWbWFCbG9ja01ldGFkYXRhX0J1ZGR5KFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yKSA6CisgICAgVm1hQmxvY2tNZXRhZGF0YShoQWxsb2NhdG9yKSwKKyAgICBtX1Jvb3QoVk1BX05VTEwpLAorICAgIG1fQWxsb2NhdGlvbkNvdW50KDApLAorICAgIG1fRnJlZUNvdW50KDEpLAorICAgIG1fU3VtRnJlZVNpemUoMCkKK3sKKyAgICBtZW1zZXQobV9GcmVlTGlzdCwgMCwgc2l6ZW9mKG1fRnJlZUxpc3QpKTsKK30KKworVm1hQmxvY2tNZXRhZGF0YV9CdWRkeTo6flZtYUJsb2NrTWV0YWRhdGFfQnVkZHkoKQoreworICAgIERlbGV0ZU5vZGUobV9Sb290KTsKK30KKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpJbml0KFZrRGV2aWNlU2l6ZSBzaXplKQoreworICAgIFZtYUJsb2NrTWV0YWRhdGE6OkluaXQoc2l6ZSk7CisKKyAgICBtX1VzYWJsZVNpemUgPSBWbWFQcmV2UG93MihzaXplKTsKKyAgICBtX1N1bUZyZWVTaXplID0gbV9Vc2FibGVTaXplOworCisgICAgLy8gQ2FsY3VsYXRlIG1fTGV2ZWxDb3VudC4KKyAgICBtX0xldmVsQ291bnQgPSAxOworICAgIHdoaWxlKG1fTGV2ZWxDb3VudCA8IE1BWF9MRVZFTFMgJiYKKyAgICAgICAgTGV2ZWxUb05vZGVTaXplKG1fTGV2ZWxDb3VudCkgPj0gTUlOX05PREVfU0laRSkKKyAgICB7CisgICAgICAgICsrbV9MZXZlbENvdW50OworICAgIH0KKworICAgIE5vZGUqIHJvb3ROb2RlID0gdm1hX25ldyhHZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksIE5vZGUpKCk7CisgICAgcm9vdE5vZGUtPm9mZnNldCA9IDA7CisgICAgcm9vdE5vZGUtPnR5cGUgPSBOb2RlOjpUWVBFX0ZSRUU7CisgICAgcm9vdE5vZGUtPnBhcmVudCA9IFZNQV9OVUxMOworICAgIHJvb3ROb2RlLT5idWRkeSA9IFZNQV9OVUxMOworCisgICAgbV9Sb290ID0gcm9vdE5vZGU7CisgICAgQWRkVG9GcmVlTGlzdEZyb250KDAsIHJvb3ROb2RlKTsKK30KKworYm9vbCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpWYWxpZGF0ZSgpIGNvbnN0Cit7CisgICAgLy8gVmFsaWRhdGUgdHJlZS4KKyAgICBWYWxpZGF0aW9uQ29udGV4dCBjdHg7CisgICAgaWYoIVZhbGlkYXRlTm9kZShjdHgsIFZNQV9OVUxMLCBtX1Jvb3QsIDAsIExldmVsVG9Ob2RlU2l6ZSgwKSkpCisgICAgeworICAgICAgICBWTUFfVkFMSURBVEUoZmFsc2UgJiYgIlZhbGlkYXRlTm9kZSBmYWlsZWQuIik7CisgICAgfQorICAgIFZNQV9WQUxJREFURShtX0FsbG9jYXRpb25Db3VudCA9PSBjdHguY2FsY3VsYXRlZEFsbG9jYXRpb25Db3VudCk7CisgICAgVk1BX1ZBTElEQVRFKG1fU3VtRnJlZVNpemUgPT0gY3R4LmNhbGN1bGF0ZWRTdW1GcmVlU2l6ZSk7CisKKyAgICAvLyBWYWxpZGF0ZSBmcmVlIG5vZGUgbGlzdHMuCisgICAgZm9yKHVpbnQzMl90IGxldmVsID0gMDsgbGV2ZWwgPCBtX0xldmVsQ291bnQ7ICsrbGV2ZWwpCisgICAgeworICAgICAgICBWTUFfVkFMSURBVEUobV9GcmVlTGlzdFtsZXZlbF0uZnJvbnQgPT0gVk1BX05VTEwgfHwKKyAgICAgICAgICAgIG1fRnJlZUxpc3RbbGV2ZWxdLmZyb250LT5mcmVlLnByZXYgPT0gVk1BX05VTEwpOworCisgICAgICAgIGZvcihOb2RlKiBub2RlID0gbV9GcmVlTGlzdFtsZXZlbF0uZnJvbnQ7CisgICAgICAgICAgICBub2RlICE9IFZNQV9OVUxMOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPmZyZWUubmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX1ZBTElEQVRFKG5vZGUtPnR5cGUgPT0gTm9kZTo6VFlQRV9GUkVFKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYobm9kZS0+ZnJlZS5uZXh0ID09IFZNQV9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZNQV9WQUxJREFURShtX0ZyZWVMaXN0W2xldmVsXS5iYWNrID09IG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZNQV9WQUxJREFURShub2RlLT5mcmVlLm5leHQtPmZyZWUucHJldiA9PSBub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlIHRoYXQgZnJlZSBsaXN0cyBhciBoaWdoZXIgbGV2ZWxzIGFyZSBlbXB0eS4KKyAgICBmb3IodWludDMyX3QgbGV2ZWwgPSBtX0xldmVsQ291bnQ7IGxldmVsIDwgTUFYX0xFVkVMUzsgKytsZXZlbCkKKyAgICB7CisgICAgICAgIFZNQV9WQUxJREFURShtX0ZyZWVMaXN0W2xldmVsXS5mcm9udCA9PSBWTUFfTlVMTCAmJiBtX0ZyZWVMaXN0W2xldmVsXS5iYWNrID09IFZNQV9OVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVmtEZXZpY2VTaXplIFZtYUJsb2NrTWV0YWRhdGFfQnVkZHk6OkdldFVudXNlZFJhbmdlU2l6ZU1heCgpIGNvbnN0Cit7CisgICAgZm9yKHVpbnQzMl90IGxldmVsID0gMDsgbGV2ZWwgPCBtX0xldmVsQ291bnQ7ICsrbGV2ZWwpCisgICAgeworICAgICAgICBpZihtX0ZyZWVMaXN0W2xldmVsXS5mcm9udCAhPSBWTUFfTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExldmVsVG9Ob2RlU2l6ZShsZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9CdWRkeTo6Q2FsY0FsbG9jYXRpb25TdGF0SW5mbyhWbWFTdGF0SW5mbyYgb3V0SW5mbykgY29uc3QKK3sKKyAgICBjb25zdCBWa0RldmljZVNpemUgdW51c2FibGVTaXplID0gR2V0VW51c2FibGVTaXplKCk7CisKKyAgICBvdXRJbmZvLmJsb2NrQ291bnQgPSAxOworCisgICAgb3V0SW5mby5hbGxvY2F0aW9uQ291bnQgPSBvdXRJbmZvLnVudXNlZFJhbmdlQ291bnQgPSAwOworICAgIG91dEluZm8udXNlZEJ5dGVzID0gb3V0SW5mby51bnVzZWRCeXRlcyA9IDA7CisKKyAgICBvdXRJbmZvLmFsbG9jYXRpb25TaXplTWF4ID0gb3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXggPSAwOworICAgIG91dEluZm8uYWxsb2NhdGlvblNpemVNaW4gPSBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFVJTlQ2NF9NQVg7CisgICAgb3V0SW5mby5hbGxvY2F0aW9uU2l6ZUF2ZyA9IG91dEluZm8udW51c2VkUmFuZ2VTaXplQXZnID0gMDsgLy8gVW51c2VkLgorCisgICAgQ2FsY0FsbG9jYXRpb25TdGF0SW5mb05vZGUob3V0SW5mbywgbV9Sb290LCBMZXZlbFRvTm9kZVNpemUoMCkpOworCisgICAgaWYodW51c2FibGVTaXplID4gMCkKKyAgICB7CisgICAgICAgICsrb3V0SW5mby51bnVzZWRSYW5nZUNvdW50OworICAgICAgICBvdXRJbmZvLnVudXNlZEJ5dGVzICs9IHVudXNhYmxlU2l6ZTsKKyAgICAgICAgb3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUFYKG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4LCB1bnVzYWJsZVNpemUpOworICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFZNQV9NSU4ob3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4sIHVudXNhYmxlU2l6ZSk7CisgICAgfQorfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfQnVkZHk6OkFkZFBvb2xTdGF0cyhWbWFQb29sU3RhdHMmIGlub3V0U3RhdHMpIGNvbnN0Cit7CisgICAgY29uc3QgVmtEZXZpY2VTaXplIHVudXNhYmxlU2l6ZSA9IEdldFVudXNhYmxlU2l6ZSgpOworCisgICAgaW5vdXRTdGF0cy5zaXplICs9IEdldFNpemUoKTsKKyAgICBpbm91dFN0YXRzLnVudXNlZFNpemUgKz0gbV9TdW1GcmVlU2l6ZSArIHVudXNhYmxlU2l6ZTsKKyAgICBpbm91dFN0YXRzLmFsbG9jYXRpb25Db3VudCArPSBtX0FsbG9jYXRpb25Db3VudDsKKyAgICBpbm91dFN0YXRzLnVudXNlZFJhbmdlQ291bnQgKz0gbV9GcmVlQ291bnQ7CisgICAgaW5vdXRTdGF0cy51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUFYKGlub3V0U3RhdHMudW51c2VkUmFuZ2VTaXplTWF4LCBHZXRVbnVzZWRSYW5nZVNpemVNYXgoKSk7CisKKyAgICBpZih1bnVzYWJsZVNpemUgPiAwKQorICAgIHsKKyAgICAgICAgKytpbm91dFN0YXRzLnVudXNlZFJhbmdlQ291bnQ7CisgICAgICAgIC8vIE5vdCB1cGRhdGluZyBpbm91dFN0YXRzLnVudXNlZFJhbmdlU2l6ZU1heCB3aXRoIHVudXNhYmxlU2l6ZSBiZWNhdXNlIHRoaXMgc3BhY2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbnMuCisgICAgfQorfQorCisjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9CdWRkeTo6UHJpbnREZXRhaWxlZE1hcChjbGFzcyBWbWFKc29uV3JpdGVyJiBqc29uKSBjb25zdAoreworICAgIC8vIFRPRE8gb3B0aW1pemUKKyAgICBWbWFTdGF0SW5mbyBzdGF0OworICAgIENhbGNBbGxvY2F0aW9uU3RhdEluZm8oc3RhdCk7CisKKyAgICBQcmludERldGFpbGVkTWFwX0JlZ2luKAorICAgICAgICBqc29uLAorICAgICAgICBzdGF0LnVudXNlZEJ5dGVzLAorICAgICAgICBzdGF0LmFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgc3RhdC51bnVzZWRSYW5nZUNvdW50KTsKKworICAgIFByaW50RGV0YWlsZWRNYXBOb2RlKGpzb24sIG1fUm9vdCwgTGV2ZWxUb05vZGVTaXplKDApKTsKKworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSB1bnVzYWJsZVNpemUgPSBHZXRVbnVzYWJsZVNpemUoKTsKKyAgICBpZih1bnVzYWJsZVNpemUgPiAwKQorICAgIHsKKyAgICAgICAgUHJpbnREZXRhaWxlZE1hcF9VbnVzZWRSYW5nZShqc29uLAorICAgICAgICAgICAgbV9Vc2FibGVTaXplLCAvLyBvZmZzZXQKKyAgICAgICAgICAgIHVudXNhYmxlU2l6ZSk7IC8vIHNpemUKKyAgICB9CisKKyAgICBQcmludERldGFpbGVkTWFwX0VuZChqc29uKTsKK30KKworI2VuZGlmIC8vICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworYm9vbCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpDcmVhdGVBbGxvY2F0aW9uUmVxdWVzdCgKKyAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQsCisgICAgVmtEZXZpY2VTaXplIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHksCisgICAgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSwKKyAgICBWa0RldmljZVNpemUgYWxsb2NBbGlnbm1lbnQsCisgICAgYm9vbCB1cHBlckFkZHJlc3MsCisgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgYWxsb2NUeXBlLAorICAgIGJvb2wgY2FuTWFrZU90aGVyTG9zdCwKKyAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICBWbWFBbGxvY2F0aW9uUmVxdWVzdCogcEFsbG9jYXRpb25SZXF1ZXN0KQoreworICAgIFZNQV9BU1NFUlQoIXVwcGVyQWRkcmVzcyAmJiAiVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1VQUEVSX0FERFJFU1NfQklUIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBsaW5lYXIgYWxnb3JpdGhtLiIpOworCisgICAgLy8gU2ltcGxlIHdheSB0byByZXNwZWN0IGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkuIE1heSBiZSBvcHRpbWl6ZWQgc29tZSBkYXkuCisgICAgLy8gV2hlbmV2ZXIgaXQgbWlnaHQgYmUgYW4gT1BUSU1BTCBpbWFnZS4uLgorICAgIGlmKGFsbG9jVHlwZSA9PSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX1VOS05PV04gfHwKKyAgICAgICAgYWxsb2NUeXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfSU1BR0VfVU5LTk9XTiB8fAorICAgICAgICBhbGxvY1R5cGUgPT0gVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9JTUFHRV9PUFRJTUFMKQorICAgIHsKKyAgICAgICAgYWxsb2NBbGlnbm1lbnQgPSBWTUFfTUFYKGFsbG9jQWxpZ25tZW50LCBidWZmZXJJbWFnZUdyYW51bGFyaXR5KTsKKyAgICAgICAgYWxsb2NTaXplID0gVk1BX01BWChhbGxvY1NpemUsIGJ1ZmZlckltYWdlR3JhbnVsYXJpdHkpOworICAgIH0KKworICAgIGlmKGFsbG9jU2l6ZSA+IG1fVXNhYmxlU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50MzJfdCB0YXJnZXRMZXZlbCA9IEFsbG9jU2l6ZVRvTGV2ZWwoYWxsb2NTaXplKTsKKyAgICBmb3IodWludDMyX3QgbGV2ZWwgPSB0YXJnZXRMZXZlbCArIDE7IGxldmVsLS07ICkKKyAgICB7CisgICAgICAgIGZvcihOb2RlKiBmcmVlTm9kZSA9IG1fRnJlZUxpc3RbbGV2ZWxdLmZyb250OworICAgICAgICAgICAgZnJlZU5vZGUgIT0gVk1BX05VTEw7CisgICAgICAgICAgICBmcmVlTm9kZSA9IGZyZWVOb2RlLT5mcmVlLm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGZyZWVOb2RlLT5vZmZzZXQgJSBhbGxvY0FsaWdubWVudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uUmVxdWVzdC0+b2Zmc2V0ID0gZnJlZU5vZGUtPm9mZnNldDsKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPnN1bUZyZWVTaXplID0gTGV2ZWxUb05vZGVTaXplKGxldmVsKTsKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPnN1bUl0ZW1TaXplID0gMDsKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPml0ZW1zVG9NYWtlTG9zdENvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvblJlcXVlc3QtPmN1c3RvbURhdGEgPSAodm9pZCopKHVpbnRwdHJfdClsZXZlbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpNYWtlUmVxdWVzdGVkQWxsb2NhdGlvbnNMb3N0KAorICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCwKKyAgICBWbWFBbGxvY2F0aW9uUmVxdWVzdCogcEFsbG9jYXRpb25SZXF1ZXN0KQoreworICAgIC8qCisgICAgTG9zdCBhbGxvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBidWRkeSBhbGxvY2F0b3IgYXQgdGhlIG1vbWVudC4KKyAgICBTdXBwb3J0IG1pZ2h0IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuCisgICAgKi8KKyAgICByZXR1cm4gcEFsbG9jYXRpb25SZXF1ZXN0LT5pdGVtc1RvTWFrZUxvc3RDb3VudCA9PSAwOworfQorCit1aW50MzJfdCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpNYWtlQWxsb2NhdGlvbnNMb3N0KHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LCB1aW50MzJfdCBmcmFtZUluVXNlQ291bnQpCit7CisgICAgLyoKKyAgICBMb3N0IGFsbG9jYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIGJ1ZGR5IGFsbG9jYXRvciBhdCB0aGUgbW9tZW50LgorICAgIFN1cHBvcnQgbWlnaHQgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICAqLworICAgIHJldHVybiAwOworfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfQnVkZHk6OkFsbG9jKAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25SZXF1ZXN0JiByZXF1ZXN0LAorICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIHR5cGUsCisgICAgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSwKKyAgICBib29sIHVwcGVyQWRkcmVzcywKKyAgICBWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uKQoreworICAgIGNvbnN0IHVpbnQzMl90IHRhcmdldExldmVsID0gQWxsb2NTaXplVG9MZXZlbChhbGxvY1NpemUpOworICAgIHVpbnQzMl90IGN1cnJMZXZlbCA9ICh1aW50MzJfdCkodWludHB0cl90KXJlcXVlc3QuY3VzdG9tRGF0YTsKKyAgICAKKyAgICBOb2RlKiBjdXJyTm9kZSA9IG1fRnJlZUxpc3RbY3VyckxldmVsXS5mcm9udDsKKyAgICBWTUFfQVNTRVJUKGN1cnJOb2RlICE9IFZNQV9OVUxMICYmIGN1cnJOb2RlLT50eXBlID09IE5vZGU6OlRZUEVfRlJFRSk7CisgICAgd2hpbGUoY3Vyck5vZGUtPm9mZnNldCAhPSByZXF1ZXN0Lm9mZnNldCkKKyAgICB7CisgICAgICAgIGN1cnJOb2RlID0gY3Vyck5vZGUtPmZyZWUubmV4dDsKKyAgICAgICAgVk1BX0FTU0VSVChjdXJyTm9kZSAhPSBWTUFfTlVMTCAmJiBjdXJyTm9kZS0+dHlwZSA9PSBOb2RlOjpUWVBFX0ZSRUUpOworICAgIH0KKyAgICAKKyAgICAvLyBHbyBkb3duLCBzcGxpdHRpbmcgZnJlZSBub2Rlcy4KKyAgICB3aGlsZShjdXJyTGV2ZWwgPCB0YXJnZXRMZXZlbCkKKyAgICB7CisgICAgICAgIC8vIGN1cnJOb2RlIGlzIGFscmVhZHkgZmlyc3QgZnJlZSBub2RlIGF0IGN1cnJMZXZlbC4KKyAgICAgICAgLy8gUmVtb3ZlIGl0IGZyb20gbGlzdCBvZiBmcmVlIG5vZGVzIGF0IHRoaXMgY3VyckxldmVsLgorICAgICAgICBSZW1vdmVGcm9tRnJlZUxpc3QoY3VyckxldmVsLCBjdXJyTm9kZSk7CisgICAgICAgICAKKyAgICAgICAgY29uc3QgdWludDMyX3QgY2hpbGRyZW5MZXZlbCA9IGN1cnJMZXZlbCArIDE7CisKKyAgICAgICAgLy8gQ3JlYXRlIHR3byBmcmVlIHN1Yi1ub2Rlcy4KKyAgICAgICAgTm9kZSogbGVmdENoaWxkID0gdm1hX25ldyhHZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksIE5vZGUpKCk7CisgICAgICAgIE5vZGUqIHJpZ2h0Q2hpbGQgPSB2bWFfbmV3KEdldEFsbG9jYXRpb25DYWxsYmFja3MoKSwgTm9kZSkoKTsKKworICAgICAgICBsZWZ0Q2hpbGQtPm9mZnNldCA9IGN1cnJOb2RlLT5vZmZzZXQ7CisgICAgICAgIGxlZnRDaGlsZC0+dHlwZSA9IE5vZGU6OlRZUEVfRlJFRTsKKyAgICAgICAgbGVmdENoaWxkLT5wYXJlbnQgPSBjdXJyTm9kZTsKKyAgICAgICAgbGVmdENoaWxkLT5idWRkeSA9IHJpZ2h0Q2hpbGQ7CisKKyAgICAgICAgcmlnaHRDaGlsZC0+b2Zmc2V0ID0gY3Vyck5vZGUtPm9mZnNldCArIExldmVsVG9Ob2RlU2l6ZShjaGlsZHJlbkxldmVsKTsKKyAgICAgICAgcmlnaHRDaGlsZC0+dHlwZSA9IE5vZGU6OlRZUEVfRlJFRTsKKyAgICAgICAgcmlnaHRDaGlsZC0+cGFyZW50ID0gY3Vyck5vZGU7CisgICAgICAgIHJpZ2h0Q2hpbGQtPmJ1ZGR5ID0gbGVmdENoaWxkOworCisgICAgICAgIC8vIENvbnZlcnQgY3VycmVudCBjdXJyTm9kZSB0byBzcGxpdCB0eXBlLgorICAgICAgICBjdXJyTm9kZS0+dHlwZSA9IE5vZGU6OlRZUEVfU1BMSVQ7CisgICAgICAgIGN1cnJOb2RlLT5zcGxpdC5sZWZ0Q2hpbGQgPSBsZWZ0Q2hpbGQ7CisKKyAgICAgICAgLy8gQWRkIGNoaWxkIG5vZGVzIHRvIGZyZWUgbGlzdC4gT3JkZXIgaXMgaW1wb3J0YW50IQorICAgICAgICBBZGRUb0ZyZWVMaXN0RnJvbnQoY2hpbGRyZW5MZXZlbCwgcmlnaHRDaGlsZCk7CisgICAgICAgIEFkZFRvRnJlZUxpc3RGcm9udChjaGlsZHJlbkxldmVsLCBsZWZ0Q2hpbGQpOworCisgICAgICAgICsrbV9GcmVlQ291bnQ7CisgICAgICAgIC8vbV9TdW1GcmVlU2l6ZSAtPSBMZXZlbFRvTm9kZVNpemUoY3VyckxldmVsKSAlIDI7IC8vIFVzZWZ1bCBvbmx5IHdoZW4gbGV2ZWwgbm9kZSBzaXplcyBjYW4gYmUgbm9uIHBvd2VyIG9mIDIuCisgICAgICAgICsrY3VyckxldmVsOworICAgICAgICBjdXJyTm9kZSA9IG1fRnJlZUxpc3RbY3VyckxldmVsXS5mcm9udDsKKworICAgICAgICAvKgorICAgICAgICBXZSBjYW4gYmUgc3VyZSB0aGF0IGN1cnJOb2RlLCBhcyBsZWZ0IGNoaWxkIG9mIG5vZGUgcHJldmlvdXNseSBzcGxpdCwKKyAgICAgICAgYWxzbyBmdWxsZmlsbHMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudC4KKyAgICAgICAgKi8KKyAgICB9CisKKyAgICAvLyBSZW1vdmUgZnJvbSBmcmVlIGxpc3QuCisgICAgVk1BX0FTU0VSVChjdXJyTGV2ZWwgPT0gdGFyZ2V0TGV2ZWwgJiYKKyAgICAgICAgY3Vyck5vZGUgIT0gVk1BX05VTEwgJiYKKyAgICAgICAgY3Vyck5vZGUtPnR5cGUgPT0gTm9kZTo6VFlQRV9GUkVFKTsKKyAgICBSZW1vdmVGcm9tRnJlZUxpc3QoY3VyckxldmVsLCBjdXJyTm9kZSk7CisKKyAgICAvLyBDb252ZXJ0IHRvIGFsbG9jYXRpb24gbm9kZS4KKyAgICBjdXJyTm9kZS0+dHlwZSA9IE5vZGU6OlRZUEVfQUxMT0NBVElPTjsKKyAgICBjdXJyTm9kZS0+YWxsb2NhdGlvbi5hbGxvYyA9IGhBbGxvY2F0aW9uOworCisgICAgKyttX0FsbG9jYXRpb25Db3VudDsKKyAgICAtLW1fRnJlZUNvdW50OworICAgIG1fU3VtRnJlZVNpemUgLT0gYWxsb2NTaXplOworfQorCit2b2lkIFZtYUJsb2NrTWV0YWRhdGFfQnVkZHk6OkRlbGV0ZU5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBpZihub2RlLT50eXBlID09IE5vZGU6OlRZUEVfU1BMSVQpCisgICAgeworICAgICAgICBEZWxldGVOb2RlKG5vZGUtPnNwbGl0LmxlZnRDaGlsZC0+YnVkZHkpOworICAgICAgICBEZWxldGVOb2RlKG5vZGUtPnNwbGl0LmxlZnRDaGlsZCk7CisgICAgfQorCisgICAgdm1hX2RlbGV0ZShHZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksIG5vZGUpOworfQorCitib29sIFZtYUJsb2NrTWV0YWRhdGFfQnVkZHk6OlZhbGlkYXRlTm9kZShWYWxpZGF0aW9uQ29udGV4dCYgY3R4LCBjb25zdCBOb2RlKiBwYXJlbnQsIGNvbnN0IE5vZGUqIGN1cnIsIHVpbnQzMl90IGxldmVsLCBWa0RldmljZVNpemUgbGV2ZWxOb2RlU2l6ZSkgY29uc3QKK3sKKyAgICBWTUFfVkFMSURBVEUobGV2ZWwgPCBtX0xldmVsQ291bnQpOworICAgIFZNQV9WQUxJREFURShjdXJyLT5wYXJlbnQgPT0gcGFyZW50KTsKKyAgICBWTUFfVkFMSURBVEUoKGN1cnItPmJ1ZGR5ID09IFZNQV9OVUxMKSA9PSAocGFyZW50ID09IFZNQV9OVUxMKSk7CisgICAgVk1BX1ZBTElEQVRFKGN1cnItPmJ1ZGR5ID09IFZNQV9OVUxMIHx8IGN1cnItPmJ1ZGR5LT5idWRkeSA9PSBjdXJyKTsKKyAgICBzd2l0Y2goY3Vyci0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBOb2RlOjpUWVBFX0ZSRUU6CisgICAgICAgIC8vIGN1cnItPmZyZWUucHJldiwgbmV4dCBhcmUgdmFsaWRhdGVkIHNlcGFyYXRlbHkuCisgICAgICAgIGN0eC5jYWxjdWxhdGVkU3VtRnJlZVNpemUgKz0gbGV2ZWxOb2RlU2l6ZTsKKyAgICAgICAgKytjdHguY2FsY3VsYXRlZEZyZWVDb3VudDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpUWVBFX0FMTE9DQVRJT046CisgICAgICAgICsrY3R4LmNhbGN1bGF0ZWRBbGxvY2F0aW9uQ291bnQ7CisgICAgICAgIGN0eC5jYWxjdWxhdGVkU3VtRnJlZVNpemUgKz0gbGV2ZWxOb2RlU2l6ZSAtIGN1cnItPmFsbG9jYXRpb24uYWxsb2MtPkdldFNpemUoKTsKKyAgICAgICAgVk1BX1ZBTElEQVRFKGN1cnItPmFsbG9jYXRpb24uYWxsb2MgIT0gVktfTlVMTF9IQU5ETEUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OlRZUEVfU1BMSVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoaWxkcmVuTGV2ZWwgPSBsZXZlbCArIDE7CisgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgY2hpbGRyZW5MZXZlbE5vZGVTaXplID0gbGV2ZWxOb2RlU2l6ZSAvIDI7CisgICAgICAgICAgICBjb25zdCBOb2RlKiBjb25zdCBsZWZ0Q2hpbGQgPSBjdXJyLT5zcGxpdC5sZWZ0Q2hpbGQ7CisgICAgICAgICAgICBWTUFfVkFMSURBVEUobGVmdENoaWxkICE9IFZNQV9OVUxMKTsKKyAgICAgICAgICAgIFZNQV9WQUxJREFURShsZWZ0Q2hpbGQtPm9mZnNldCA9PSBjdXJyLT5vZmZzZXQpOworICAgICAgICAgICAgaWYoIVZhbGlkYXRlTm9kZShjdHgsIGN1cnIsIGxlZnRDaGlsZCwgY2hpbGRyZW5MZXZlbCwgY2hpbGRyZW5MZXZlbE5vZGVTaXplKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWTUFfVkFMSURBVEUoZmFsc2UgJiYgIlZhbGlkYXRlTm9kZSBmb3IgbGVmdCBjaGlsZCBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBOb2RlKiBjb25zdCByaWdodENoaWxkID0gbGVmdENoaWxkLT5idWRkeTsKKyAgICAgICAgICAgIFZNQV9WQUxJREFURShyaWdodENoaWxkLT5vZmZzZXQgPT0gY3Vyci0+b2Zmc2V0ICsgY2hpbGRyZW5MZXZlbE5vZGVTaXplKTsKKyAgICAgICAgICAgIGlmKCFWYWxpZGF0ZU5vZGUoY3R4LCBjdXJyLCByaWdodENoaWxkLCBjaGlsZHJlbkxldmVsLCBjaGlsZHJlbkxldmVsTm9kZVNpemUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZNQV9WQUxJREFURShmYWxzZSAmJiAiVmFsaWRhdGVOb2RlIGZvciByaWdodCBjaGlsZCBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpBbGxvY1NpemVUb0xldmVsKFZrRGV2aWNlU2l6ZSBhbGxvY1NpemUpIGNvbnN0Cit7CisgICAgLy8gSSBrbm93IHRoaXMgY291bGQgYmUgb3B0aW1pemVkIHNvbWVob3cgZS5nLiBieSB1c2luZyBzdGQ6OmxvZzJwMSBmcm9tIEMrKzIwLgorICAgIHVpbnQzMl90IGxldmVsID0gMDsKKyAgICBWa0RldmljZVNpemUgY3VyckxldmVsTm9kZVNpemUgPSBtX1VzYWJsZVNpemU7CisgICAgVmtEZXZpY2VTaXplIG5leHRMZXZlbE5vZGVTaXplID0gY3VyckxldmVsTm9kZVNpemUgPj4gMTsKKyAgICB3aGlsZShhbGxvY1NpemUgPD0gbmV4dExldmVsTm9kZVNpemUgJiYgbGV2ZWwgKyAxIDwgbV9MZXZlbENvdW50KQorICAgIHsKKyAgICAgICAgKytsZXZlbDsKKyAgICAgICAgY3VyckxldmVsTm9kZVNpemUgPSBuZXh0TGV2ZWxOb2RlU2l6ZTsKKyAgICAgICAgbmV4dExldmVsTm9kZVNpemUgPSBjdXJyTGV2ZWxOb2RlU2l6ZSA+PiAxOworICAgIH0KKyAgICByZXR1cm4gbGV2ZWw7Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9CdWRkeTo6RnJlZUF0T2Zmc2V0KFZtYUFsbG9jYXRpb24gYWxsb2MsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpCit7CisgICAgLy8gRmluZCBub2RlIGFuZCBsZXZlbC4KKyAgICBOb2RlKiBub2RlID0gbV9Sb290OworICAgIFZrRGV2aWNlU2l6ZSBub2RlT2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBsZXZlbCA9IDA7CisgICAgVmtEZXZpY2VTaXplIGxldmVsTm9kZVNpemUgPSBMZXZlbFRvTm9kZVNpemUoMCk7CisgICAgd2hpbGUobm9kZS0+dHlwZSA9PSBOb2RlOjpUWVBFX1NQTElUKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIG5leHRMZXZlbFNpemUgPSBsZXZlbE5vZGVTaXplID4+IDE7CisgICAgICAgIGlmKG9mZnNldCA8IG5vZGVPZmZzZXQgKyBuZXh0TGV2ZWxTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+c3BsaXQubGVmdENoaWxkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnNwbGl0LmxlZnRDaGlsZC0+YnVkZHk7CisgICAgICAgICAgICBub2RlT2Zmc2V0ICs9IG5leHRMZXZlbFNpemU7CisgICAgICAgIH0KKyAgICAgICAgKytsZXZlbDsKKyAgICAgICAgbGV2ZWxOb2RlU2l6ZSA9IG5leHRMZXZlbFNpemU7CisgICAgfQorCisgICAgVk1BX0FTU0VSVChub2RlICE9IFZNQV9OVUxMICYmIG5vZGUtPnR5cGUgPT0gTm9kZTo6VFlQRV9BTExPQ0FUSU9OKTsKKyAgICBWTUFfQVNTRVJUKGFsbG9jID09IFZLX05VTExfSEFORExFIHx8IG5vZGUtPmFsbG9jYXRpb24uYWxsb2MgPT0gYWxsb2MpOworCisgICAgKyttX0ZyZWVDb3VudDsKKyAgICAtLW1fQWxsb2NhdGlvbkNvdW50OworICAgIG1fU3VtRnJlZVNpemUgKz0gYWxsb2MtPkdldFNpemUoKTsKKworICAgIG5vZGUtPnR5cGUgPSBOb2RlOjpUWVBFX0ZSRUU7CisKKyAgICAvLyBKb2luIGZyZWUgbm9kZXMgaWYgcG9zc2libGUuCisgICAgd2hpbGUobGV2ZWwgPiAwICYmIG5vZGUtPmJ1ZGR5LT50eXBlID09IE5vZGU6OlRZUEVfRlJFRSkKKyAgICB7CisgICAgICAgIFJlbW92ZUZyb21GcmVlTGlzdChsZXZlbCwgbm9kZS0+YnVkZHkpOworICAgICAgICBOb2RlKiBjb25zdCBwYXJlbnQgPSBub2RlLT5wYXJlbnQ7CisKKyAgICAgICAgdm1hX2RlbGV0ZShHZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksIG5vZGUtPmJ1ZGR5KTsKKyAgICAgICAgdm1hX2RlbGV0ZShHZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksIG5vZGUpOworICAgICAgICBwYXJlbnQtPnR5cGUgPSBOb2RlOjpUWVBFX0ZSRUU7CisgICAgICAgIAorICAgICAgICBub2RlID0gcGFyZW50OworICAgICAgICAtLWxldmVsOworICAgICAgICAvL21fU3VtRnJlZVNpemUgKz0gTGV2ZWxUb05vZGVTaXplKGxldmVsKSAlIDI7IC8vIFVzZWZ1bCBvbmx5IHdoZW4gbGV2ZWwgbm9kZSBzaXplcyBjYW4gYmUgbm9uIHBvd2VyIG9mIDIuCisgICAgICAgIC0tbV9GcmVlQ291bnQ7CisgICAgfQorCisgICAgQWRkVG9GcmVlTGlzdEZyb250KGxldmVsLCBub2RlKTsKK30KKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpDYWxjQWxsb2NhdGlvblN0YXRJbmZvTm9kZShWbWFTdGF0SW5mbyYgb3V0SW5mbywgY29uc3QgTm9kZSogbm9kZSwgVmtEZXZpY2VTaXplIGxldmVsTm9kZVNpemUpIGNvbnN0Cit7CisgICAgc3dpdGNoKG5vZGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgTm9kZTo6VFlQRV9GUkVFOgorICAgICAgICArK291dEluZm8udW51c2VkUmFuZ2VDb3VudDsKKyAgICAgICAgb3V0SW5mby51bnVzZWRCeXRlcyArPSBsZXZlbE5vZGVTaXplOworICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1heCA9IFZNQV9NQVgob3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXgsIGxldmVsTm9kZVNpemUpOworICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFZNQV9NQVgob3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4sIGxldmVsTm9kZVNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OlRZUEVfQUxMT0NBVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSA9IG5vZGUtPmFsbG9jYXRpb24uYWxsb2MtPkdldFNpemUoKTsKKyAgICAgICAgICAgICsrb3V0SW5mby5hbGxvY2F0aW9uQ291bnQ7CisgICAgICAgICAgICBvdXRJbmZvLnVzZWRCeXRlcyArPSBhbGxvY1NpemU7CisgICAgICAgICAgICBvdXRJbmZvLmFsbG9jYXRpb25TaXplTWF4ID0gVk1BX01BWChvdXRJbmZvLmFsbG9jYXRpb25TaXplTWF4LCBhbGxvY1NpemUpOworICAgICAgICAgICAgb3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1pbiA9IFZNQV9NQVgob3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1pbiwgYWxsb2NTaXplKTsKKworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHVudXNlZFJhbmdlU2l6ZSA9IGxldmVsTm9kZVNpemUgLSBhbGxvY1NpemU7CisgICAgICAgICAgICBpZih1bnVzZWRSYW5nZVNpemUgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrb3V0SW5mby51bnVzZWRSYW5nZUNvdW50OworICAgICAgICAgICAgICAgIG91dEluZm8udW51c2VkQnl0ZXMgKz0gdW51c2VkUmFuZ2VTaXplOworICAgICAgICAgICAgICAgIG91dEluZm8udW51c2VkUmFuZ2VTaXplTWF4ID0gVk1BX01BWChvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1heCwgdW51c2VkUmFuZ2VTaXplKTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFZNQV9NQVgob3V0SW5mby51bnVzZWRSYW5nZVNpemVNaW4sIHVudXNlZFJhbmdlU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpUWVBFX1NQTElUOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgY2hpbGRyZW5Ob2RlU2l6ZSA9IGxldmVsTm9kZVNpemUgLyAyOworICAgICAgICAgICAgY29uc3QgTm9kZSogY29uc3QgbGVmdENoaWxkID0gbm9kZS0+c3BsaXQubGVmdENoaWxkOworICAgICAgICAgICAgQ2FsY0FsbG9jYXRpb25TdGF0SW5mb05vZGUob3V0SW5mbywgbGVmdENoaWxkLCBjaGlsZHJlbk5vZGVTaXplKTsKKyAgICAgICAgICAgIGNvbnN0IE5vZGUqIGNvbnN0IHJpZ2h0Q2hpbGQgPSBsZWZ0Q2hpbGQtPmJ1ZGR5OworICAgICAgICAgICAgQ2FsY0FsbG9jYXRpb25TdGF0SW5mb05vZGUob3V0SW5mbywgcmlnaHRDaGlsZCwgY2hpbGRyZW5Ob2RlU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgVm1hQmxvY2tNZXRhZGF0YV9CdWRkeTo6QWRkVG9GcmVlTGlzdEZyb250KHVpbnQzMl90IGxldmVsLCBOb2RlKiBub2RlKQoreworICAgIFZNQV9BU1NFUlQobm9kZS0+dHlwZSA9PSBOb2RlOjpUWVBFX0ZSRUUpOworCisgICAgLy8gTGlzdCBpcyBlbXB0eS4KKyAgICBOb2RlKiBjb25zdCBmcm9udE5vZGUgPSBtX0ZyZWVMaXN0W2xldmVsXS5mcm9udDsKKyAgICBpZihmcm9udE5vZGUgPT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKG1fRnJlZUxpc3RbbGV2ZWxdLmJhY2sgPT0gVk1BX05VTEwpOworICAgICAgICBub2RlLT5mcmVlLnByZXYgPSBub2RlLT5mcmVlLm5leHQgPSBWTUFfTlVMTDsKKyAgICAgICAgbV9GcmVlTGlzdFtsZXZlbF0uZnJvbnQgPSBtX0ZyZWVMaXN0W2xldmVsXS5iYWNrID0gbm9kZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVk1BX0FTU0VSVChmcm9udE5vZGUtPmZyZWUucHJldiA9PSBWTUFfTlVMTCk7CisgICAgICAgIG5vZGUtPmZyZWUucHJldiA9IFZNQV9OVUxMOworICAgICAgICBub2RlLT5mcmVlLm5leHQgPSBmcm9udE5vZGU7CisgICAgICAgIGZyb250Tm9kZS0+ZnJlZS5wcmV2ID0gbm9kZTsKKyAgICAgICAgbV9GcmVlTGlzdFtsZXZlbF0uZnJvbnQgPSBub2RlOworICAgIH0KK30KKwordm9pZCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpSZW1vdmVGcm9tRnJlZUxpc3QodWludDMyX3QgbGV2ZWwsIE5vZGUqIG5vZGUpCit7CisgICAgVk1BX0FTU0VSVChtX0ZyZWVMaXN0W2xldmVsXS5mcm9udCAhPSBWTUFfTlVMTCk7CisKKyAgICAvLyBJdCBpcyBhdCB0aGUgZnJvbnQuCisgICAgaWYobm9kZS0+ZnJlZS5wcmV2ID09IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgVk1BX0FTU0VSVChtX0ZyZWVMaXN0W2xldmVsXS5mcm9udCA9PSBub2RlKTsKKyAgICAgICAgbV9GcmVlTGlzdFtsZXZlbF0uZnJvbnQgPSBub2RlLT5mcmVlLm5leHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE5vZGUqIGNvbnN0IHByZXZGcmVlTm9kZSA9IG5vZGUtPmZyZWUucHJldjsKKyAgICAgICAgVk1BX0FTU0VSVChwcmV2RnJlZU5vZGUtPmZyZWUubmV4dCA9PSBub2RlKTsKKyAgICAgICAgcHJldkZyZWVOb2RlLT5mcmVlLm5leHQgPSBub2RlLT5mcmVlLm5leHQ7CisgICAgfQorCisgICAgLy8gSXQgaXMgYXQgdGhlIGJhY2suCisgICAgaWYobm9kZS0+ZnJlZS5uZXh0ID09IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgVk1BX0FTU0VSVChtX0ZyZWVMaXN0W2xldmVsXS5iYWNrID09IG5vZGUpOworICAgICAgICBtX0ZyZWVMaXN0W2xldmVsXS5iYWNrID0gbm9kZS0+ZnJlZS5wcmV2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOb2RlKiBjb25zdCBuZXh0RnJlZU5vZGUgPSBub2RlLT5mcmVlLm5leHQ7CisgICAgICAgIFZNQV9BU1NFUlQobmV4dEZyZWVOb2RlLT5mcmVlLnByZXYgPT0gbm9kZSk7CisgICAgICAgIG5leHRGcmVlTm9kZS0+ZnJlZS5wcmV2ID0gbm9kZS0+ZnJlZS5wcmV2OworICAgIH0KK30KKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAordm9pZCBWbWFCbG9ja01ldGFkYXRhX0J1ZGR5OjpQcmludERldGFpbGVkTWFwTm9kZShjbGFzcyBWbWFKc29uV3JpdGVyJiBqc29uLCBjb25zdCBOb2RlKiBub2RlLCBWa0RldmljZVNpemUgbGV2ZWxOb2RlU2l6ZSkgY29uc3QKK3sKKyAgICBzd2l0Y2gobm9kZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBOb2RlOjpUWVBFX0ZSRUU6CisgICAgICAgIFByaW50RGV0YWlsZWRNYXBfVW51c2VkUmFuZ2UoanNvbiwgbm9kZS0+b2Zmc2V0LCBsZXZlbE5vZGVTaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpUWVBFX0FMTE9DQVRJT046CisgICAgICAgIHsgICAKKyAgICAgICAgICAgIFByaW50RGV0YWlsZWRNYXBfQWxsb2NhdGlvbihqc29uLCBub2RlLT5vZmZzZXQsIG5vZGUtPmFsbG9jYXRpb24uYWxsb2MpOworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSA9IG5vZGUtPmFsbG9jYXRpb24uYWxsb2MtPkdldFNpemUoKTsKKyAgICAgICAgICAgIGlmKGFsbG9jU2l6ZSA8IGxldmVsTm9kZVNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJpbnREZXRhaWxlZE1hcF9VbnVzZWRSYW5nZShqc29uLCBub2RlLT5vZmZzZXQgKyBhbGxvY1NpemUsIGxldmVsTm9kZVNpemUgLSBhbGxvY1NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6VFlQRV9TUExJVDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGNoaWxkcmVuTm9kZVNpemUgPSBsZXZlbE5vZGVTaXplIC8gMjsKKyAgICAgICAgICAgIGNvbnN0IE5vZGUqIGNvbnN0IGxlZnRDaGlsZCA9IG5vZGUtPnNwbGl0LmxlZnRDaGlsZDsKKyAgICAgICAgICAgIFByaW50RGV0YWlsZWRNYXBOb2RlKGpzb24sIGxlZnRDaGlsZCwgY2hpbGRyZW5Ob2RlU2l6ZSk7CisgICAgICAgICAgICBjb25zdCBOb2RlKiBjb25zdCByaWdodENoaWxkID0gbGVmdENoaWxkLT5idWRkeTsKKyAgICAgICAgICAgIFByaW50RGV0YWlsZWRNYXBOb2RlKGpzb24sIHJpZ2h0Q2hpbGQsIGNoaWxkcmVuTm9kZVNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFZNQV9BU1NFUlQoMCk7CisgICAgfQorfQorI2VuZGlmIC8vICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gY2xhc3MgVm1hRGV2aWNlTWVtb3J5QmxvY2sKKworVm1hRGV2aWNlTWVtb3J5QmxvY2s6OlZtYURldmljZU1lbW9yeUJsb2NrKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yKSA6CisgICAgbV9wTWV0YWRhdGEoVk1BX05VTEwpLAorICAgIG1fTWVtb3J5VHlwZUluZGV4KFVJTlQzMl9NQVgpLAorICAgIG1fSWQoMCksCisgICAgbV9oTWVtb3J5KFZLX05VTExfSEFORExFKSwKKyAgICBtX01hcENvdW50KDApLAorICAgIG1fcE1hcHBlZERhdGEoVk1BX05VTEwpCit7Cit9CisKK3ZvaWQgVm1hRGV2aWNlTWVtb3J5QmxvY2s6OkluaXQoCisgICAgVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsCisgICAgdWludDMyX3QgbmV3TWVtb3J5VHlwZUluZGV4LAorICAgIFZrRGV2aWNlTWVtb3J5IG5ld01lbW9yeSwKKyAgICBWa0RldmljZVNpemUgbmV3U2l6ZSwKKyAgICB1aW50MzJfdCBpZCwKKyAgICB1aW50MzJfdCBhbGdvcml0aG0pCit7CisgICAgVk1BX0FTU0VSVChtX2hNZW1vcnkgPT0gVktfTlVMTF9IQU5ETEUpOworCisgICAgbV9NZW1vcnlUeXBlSW5kZXggPSBuZXdNZW1vcnlUeXBlSW5kZXg7CisgICAgbV9JZCA9IGlkOworICAgIG1faE1lbW9yeSA9IG5ld01lbW9yeTsKKworICAgIHN3aXRjaChhbGdvcml0aG0pCisgICAgeworICAgIGNhc2UgVk1BX1BPT0xfQ1JFQVRFX0xJTkVBUl9BTEdPUklUSE1fQklUOgorICAgICAgICBtX3BNZXRhZGF0YSA9IHZtYV9uZXcoaEFsbG9jYXRvciwgVm1hQmxvY2tNZXRhZGF0YV9MaW5lYXIpKGhBbGxvY2F0b3IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZNQV9QT09MX0NSRUFURV9CVUREWV9BTEdPUklUSE1fQklUOgorICAgICAgICBtX3BNZXRhZGF0YSA9IHZtYV9uZXcoaEFsbG9jYXRvciwgVm1hQmxvY2tNZXRhZGF0YV9CdWRkeSkoaEFsbG9jYXRvcik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFZNQV9BU1NFUlQoMCk7CisgICAgICAgIC8vIEZhbGwtdGhyb3VnaC4KKyAgICBjYXNlIDA6CisgICAgICAgIG1fcE1ldGFkYXRhID0gdm1hX25ldyhoQWxsb2NhdG9yLCBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMpKGhBbGxvY2F0b3IpOworICAgIH0KKyAgICBtX3BNZXRhZGF0YS0+SW5pdChuZXdTaXplKTsKK30KKwordm9pZCBWbWFEZXZpY2VNZW1vcnlCbG9jazo6RGVzdHJveShWbWFBbGxvY2F0b3IgYWxsb2NhdG9yKQoreworICAgIC8vIFRoaXMgaXMgdGhlIG1vc3QgaW1wb3J0YW50IGFzc2VydCBpbiB0aGUgZW50aXJlIGxpYnJhcnkuCisgICAgLy8gSGl0dGluZyBpdCBtZWFucyB5b3UgaGF2ZSBzb21lIG1lbW9yeSBsZWFrIC0gdW5yZWxlYXNlZCBWbWFBbGxvY2F0aW9uIG9iamVjdHMuCisgICAgVk1BX0FTU0VSVChtX3BNZXRhZGF0YS0+SXNFbXB0eSgpICYmICJTb21lIGFsbG9jYXRpb25zIHdlcmUgbm90IGZyZWVkIGJlZm9yZSBkZXN0cnVjdGlvbiBvZiB0aGlzIG1lbW9yeSBibG9jayEiKTsKKworICAgIFZNQV9BU1NFUlQobV9oTWVtb3J5ICE9IFZLX05VTExfSEFORExFKTsKKyAgICBhbGxvY2F0b3ItPkZyZWVWdWxrYW5NZW1vcnkobV9NZW1vcnlUeXBlSW5kZXgsIG1fcE1ldGFkYXRhLT5HZXRTaXplKCksIG1faE1lbW9yeSk7CisgICAgbV9oTWVtb3J5ID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICB2bWFfZGVsZXRlKGFsbG9jYXRvciwgbV9wTWV0YWRhdGEpOworICAgIG1fcE1ldGFkYXRhID0gVk1BX05VTEw7Cit9CisKK2Jvb2wgVm1hRGV2aWNlTWVtb3J5QmxvY2s6OlZhbGlkYXRlKCkgY29uc3QKK3sKKyAgICBWTUFfVkFMSURBVEUoKG1faE1lbW9yeSAhPSBWS19OVUxMX0hBTkRMRSkgJiYKKyAgICAgICAgKG1fcE1ldGFkYXRhLT5HZXRTaXplKCkgIT0gMCkpOworICAgIAorICAgIHJldHVybiBtX3BNZXRhZGF0YS0+VmFsaWRhdGUoKTsKK30KKworVmtSZXN1bHQgVm1hRGV2aWNlTWVtb3J5QmxvY2s6OkNoZWNrQ29ycnVwdGlvbihWbWFBbGxvY2F0b3IgaEFsbG9jYXRvcikKK3sKKyAgICB2b2lkKiBwRGF0YSA9IG51bGxwdHI7CisgICAgVmtSZXN1bHQgcmVzID0gTWFwKGhBbGxvY2F0b3IsIDEsICZwRGF0YSk7CisgICAgaWYocmVzICE9IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IG1fcE1ldGFkYXRhLT5DaGVja0NvcnJ1cHRpb24ocERhdGEpOworCisgICAgVW5tYXAoaEFsbG9jYXRvciwgMSk7CisKKyAgICByZXR1cm4gcmVzOworfQorCitWa1Jlc3VsdCBWbWFEZXZpY2VNZW1vcnlCbG9jazo6TWFwKFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLCB1aW50MzJfdCBjb3VudCwgdm9pZCoqIHBwRGF0YSkKK3sKKyAgICBpZihjb3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgVm1hTXV0ZXhMb2NrIGxvY2sobV9NdXRleCwgaEFsbG9jYXRvci0+bV9Vc2VNdXRleCk7CisgICAgaWYobV9NYXBDb3VudCAhPSAwKQorICAgIHsKKyAgICAgICAgbV9NYXBDb3VudCArPSBjb3VudDsKKyAgICAgICAgVk1BX0FTU0VSVChtX3BNYXBwZWREYXRhICE9IFZNQV9OVUxMKTsKKyAgICAgICAgaWYocHBEYXRhICE9IFZNQV9OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAqcHBEYXRhID0gbV9wTWFwcGVkRGF0YTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmtSZXN1bHQgcmVzdWx0ID0gKCpoQWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a01hcE1lbW9yeSkoCisgICAgICAgICAgICBoQWxsb2NhdG9yLT5tX2hEZXZpY2UsCisgICAgICAgICAgICBtX2hNZW1vcnksCisgICAgICAgICAgICAwLCAvLyBvZmZzZXQKKyAgICAgICAgICAgIFZLX1dIT0xFX1NJWkUsCisgICAgICAgICAgICAwLCAvLyBmbGFncworICAgICAgICAgICAgJm1fcE1hcHBlZERhdGEpOworICAgICAgICBpZihyZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYocHBEYXRhICE9IFZNQV9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwcERhdGEgPSBtX3BNYXBwZWREYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9NYXBDb3VudCA9IGNvdW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQorCit2b2lkIFZtYURldmljZU1lbW9yeUJsb2NrOjpVbm1hcChWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwgdWludDMyX3QgY291bnQpCit7CisgICAgaWYoY291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX011dGV4LCBoQWxsb2NhdG9yLT5tX1VzZU11dGV4KTsKKyAgICBpZihtX01hcENvdW50ID49IGNvdW50KQorICAgIHsKKyAgICAgICAgbV9NYXBDb3VudCAtPSBjb3VudDsKKyAgICAgICAgaWYobV9NYXBDb3VudCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBtX3BNYXBwZWREYXRhID0gVk1BX05VTEw7CisgICAgICAgICAgICAoKmhBbGxvY2F0b3ItPkdldFZ1bGthbkZ1bmN0aW9ucygpLnZrVW5tYXBNZW1vcnkpKGhBbGxvY2F0b3ItPm1faERldmljZSwgbV9oTWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIlZrRGV2aWNlTWVtb3J5IGJsb2NrIGlzIGJlaW5nIHVubWFwcGVkIHdoaWxlIGl0IHdhcyBub3QgcHJldmlvdXNseSBtYXBwZWQuIik7CisgICAgfQorfQorCitWa1Jlc3VsdCBWbWFEZXZpY2VNZW1vcnlCbG9jazo6V3JpdGVNYWdpY1ZhbHVlQXJvdW5kQWxsb2NhdGlvbihWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwgVmtEZXZpY2VTaXplIGFsbG9jT2Zmc2V0LCBWa0RldmljZVNpemUgYWxsb2NTaXplKQoreworICAgIFZNQV9BU1NFUlQoVk1BX0RFQlVHX01BUkdJTiA+IDAgJiYgVk1BX0RFQlVHX01BUkdJTiAlIDQgPT0gMCAmJiBWTUFfREVCVUdfREVURUNUX0NPUlJVUFRJT04pOworICAgIFZNQV9BU1NFUlQoYWxsb2NPZmZzZXQgPj0gVk1BX0RFQlVHX01BUkdJTik7CisKKyAgICB2b2lkKiBwRGF0YTsKKyAgICBWa1Jlc3VsdCByZXMgPSBNYXAoaEFsbG9jYXRvciwgMSwgJnBEYXRhKTsKKyAgICBpZihyZXMgIT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgVm1hV3JpdGVNYWdpY1ZhbHVlKHBEYXRhLCBhbGxvY09mZnNldCAtIFZNQV9ERUJVR19NQVJHSU4pOworICAgIFZtYVdyaXRlTWFnaWNWYWx1ZShwRGF0YSwgYWxsb2NPZmZzZXQgKyBhbGxvY1NpemUpOworCisgICAgVW5tYXAoaEFsbG9jYXRvciwgMSk7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVmtSZXN1bHQgVm1hRGV2aWNlTWVtb3J5QmxvY2s6OlZhbGlkYXRlTWFnaWNWYWx1ZUFyb3VuZEFsbG9jYXRpb24oVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsIFZrRGV2aWNlU2l6ZSBhbGxvY09mZnNldCwgVmtEZXZpY2VTaXplIGFsbG9jU2l6ZSkKK3sKKyAgICBWTUFfQVNTRVJUKFZNQV9ERUJVR19NQVJHSU4gPiAwICYmIFZNQV9ERUJVR19NQVJHSU4gJSA0ID09IDAgJiYgVk1BX0RFQlVHX0RFVEVDVF9DT1JSVVBUSU9OKTsKKyAgICBWTUFfQVNTRVJUKGFsbG9jT2Zmc2V0ID49IFZNQV9ERUJVR19NQVJHSU4pOworCisgICAgdm9pZCogcERhdGE7CisgICAgVmtSZXN1bHQgcmVzID0gTWFwKGhBbGxvY2F0b3IsIDEsICZwRGF0YSk7CisgICAgaWYocmVzICE9IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmKCFWbWFWYWxpZGF0ZU1hZ2ljVmFsdWUocERhdGEsIGFsbG9jT2Zmc2V0IC0gVk1BX0RFQlVHX01BUkdJTikpCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIk1FTU9SWSBDT1JSVVBUSU9OIERFVEVDVEVEIEJFRk9SRSBGUkVFRCBBTExPQ0FUSU9OISIpOworICAgIH0KKyAgICBlbHNlIGlmKCFWbWFWYWxpZGF0ZU1hZ2ljVmFsdWUocERhdGEsIGFsbG9jT2Zmc2V0ICsgYWxsb2NTaXplKSkKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiTUVNT1JZIENPUlJVUFRJT04gREVURUNURUQgQUZURVIgRlJFRUQgQUxMT0NBVElPTiEiKTsKKyAgICB9CisKKyAgICBVbm1hcChoQWxsb2NhdG9yLCAxKTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWa1Jlc3VsdCBWbWFEZXZpY2VNZW1vcnlCbG9jazo6QmluZEJ1ZmZlck1lbW9yeSgKKyAgICBjb25zdCBWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uLAorICAgIFZrQnVmZmVyIGhCdWZmZXIpCit7CisgICAgVk1BX0FTU0VSVChoQWxsb2NhdGlvbi0+R2V0VHlwZSgpID09IFZtYUFsbG9jYXRpb25fVDo6QUxMT0NBVElPTl9UWVBFX0JMT0NLICYmCisgICAgICAgIGhBbGxvY2F0aW9uLT5HZXRCbG9jaygpID09IHRoaXMpOworICAgIC8vIFRoaXMgbG9jayBpcyBpbXBvcnRhbnQgc28gdGhhdCB3ZSBkb24ndCBjYWxsIHZrQmluZC4uLiBhbmQvb3IgdmtNYXAuLi4gc2ltdWx0YW5lb3VzbHkgb24gdGhlIHNhbWUgVmtEZXZpY2VNZW1vcnkgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICAgIFZtYU11dGV4TG9jayBsb2NrKG1fTXV0ZXgsIGhBbGxvY2F0b3ItPm1fVXNlTXV0ZXgpOworICAgIHJldHVybiBoQWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a0JpbmRCdWZmZXJNZW1vcnkoCisgICAgICAgIGhBbGxvY2F0b3ItPm1faERldmljZSwKKyAgICAgICAgaEJ1ZmZlciwKKyAgICAgICAgbV9oTWVtb3J5LAorICAgICAgICBoQWxsb2NhdGlvbi0+R2V0T2Zmc2V0KCkpOworfQorCitWa1Jlc3VsdCBWbWFEZXZpY2VNZW1vcnlCbG9jazo6QmluZEltYWdlTWVtb3J5KAorICAgIGNvbnN0IFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sCisgICAgVmtJbWFnZSBoSW1hZ2UpCit7CisgICAgVk1BX0FTU0VSVChoQWxsb2NhdGlvbi0+R2V0VHlwZSgpID09IFZtYUFsbG9jYXRpb25fVDo6QUxMT0NBVElPTl9UWVBFX0JMT0NLICYmCisgICAgICAgIGhBbGxvY2F0aW9uLT5HZXRCbG9jaygpID09IHRoaXMpOworICAgIC8vIFRoaXMgbG9jayBpcyBpbXBvcnRhbnQgc28gdGhhdCB3ZSBkb24ndCBjYWxsIHZrQmluZC4uLiBhbmQvb3IgdmtNYXAuLi4gc2ltdWx0YW5lb3VzbHkgb24gdGhlIHNhbWUgVmtEZXZpY2VNZW1vcnkgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICAgIFZtYU11dGV4TG9jayBsb2NrKG1fTXV0ZXgsIGhBbGxvY2F0b3ItPm1fVXNlTXV0ZXgpOworICAgIHJldHVybiBoQWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a0JpbmRJbWFnZU1lbW9yeSgKKyAgICAgICAgaEFsbG9jYXRvci0+bV9oRGV2aWNlLAorICAgICAgICBoSW1hZ2UsCisgICAgICAgIG1faE1lbW9yeSwKKyAgICAgICAgaEFsbG9jYXRpb24tPkdldE9mZnNldCgpKTsKK30KKworc3RhdGljIHZvaWQgSW5pdFN0YXRJbmZvKFZtYVN0YXRJbmZvJiBvdXRJbmZvKQoreworICAgIG1lbXNldCgmb3V0SW5mbywgMCwgc2l6ZW9mKG91dEluZm8pKTsKKyAgICBvdXRJbmZvLmFsbG9jYXRpb25TaXplTWluID0gVUlOVDY0X01BWDsKKyAgICBvdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFVJTlQ2NF9NQVg7Cit9CisKKy8vIEFkZHMgc3RhdGlzdGljcyBzcmNJbmZvIGludG8gaW5vdXRJbmZvLCBsaWtlOiBpbm91dEluZm8gKz0gc3JjSW5mby4KK3N0YXRpYyB2b2lkIFZtYUFkZFN0YXRJbmZvKFZtYVN0YXRJbmZvJiBpbm91dEluZm8sIGNvbnN0IFZtYVN0YXRJbmZvJiBzcmNJbmZvKQoreworICAgIGlub3V0SW5mby5ibG9ja0NvdW50ICs9IHNyY0luZm8uYmxvY2tDb3VudDsKKyAgICBpbm91dEluZm8uYWxsb2NhdGlvbkNvdW50ICs9IHNyY0luZm8uYWxsb2NhdGlvbkNvdW50OworICAgIGlub3V0SW5mby51bnVzZWRSYW5nZUNvdW50ICs9IHNyY0luZm8udW51c2VkUmFuZ2VDb3VudDsKKyAgICBpbm91dEluZm8udXNlZEJ5dGVzICs9IHNyY0luZm8udXNlZEJ5dGVzOworICAgIGlub3V0SW5mby51bnVzZWRCeXRlcyArPSBzcmNJbmZvLnVudXNlZEJ5dGVzOworICAgIGlub3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1pbiA9IFZNQV9NSU4oaW5vdXRJbmZvLmFsbG9jYXRpb25TaXplTWluLCBzcmNJbmZvLmFsbG9jYXRpb25TaXplTWluKTsKKyAgICBpbm91dEluZm8uYWxsb2NhdGlvblNpemVNYXggPSBWTUFfTUFYKGlub3V0SW5mby5hbGxvY2F0aW9uU2l6ZU1heCwgc3JjSW5mby5hbGxvY2F0aW9uU2l6ZU1heCk7CisgICAgaW5vdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiA9IFZNQV9NSU4oaW5vdXRJbmZvLnVudXNlZFJhbmdlU2l6ZU1pbiwgc3JjSW5mby51bnVzZWRSYW5nZVNpemVNaW4pOworICAgIGlub3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXggPSBWTUFfTUFYKGlub3V0SW5mby51bnVzZWRSYW5nZVNpemVNYXgsIHNyY0luZm8udW51c2VkUmFuZ2VTaXplTWF4KTsKK30KKworc3RhdGljIHZvaWQgVm1hUG9zdHByb2Nlc3NDYWxjU3RhdEluZm8oVm1hU3RhdEluZm8mIGlub3V0SW5mbykKK3sKKyAgICBpbm91dEluZm8uYWxsb2NhdGlvblNpemVBdmcgPSAoaW5vdXRJbmZvLmFsbG9jYXRpb25Db3VudCA+IDApID8KKyAgICAgICAgVm1hUm91bmREaXY8VmtEZXZpY2VTaXplPihpbm91dEluZm8udXNlZEJ5dGVzLCBpbm91dEluZm8uYWxsb2NhdGlvbkNvdW50KSA6IDA7CisgICAgaW5vdXRJbmZvLnVudXNlZFJhbmdlU2l6ZUF2ZyA9IChpbm91dEluZm8udW51c2VkUmFuZ2VDb3VudCA+IDApID8KKyAgICAgICAgVm1hUm91bmREaXY8VmtEZXZpY2VTaXplPihpbm91dEluZm8udW51c2VkQnl0ZXMsIGlub3V0SW5mby51bnVzZWRSYW5nZUNvdW50KSA6IDA7Cit9CisKK1ZtYVBvb2xfVDo6Vm1hUG9vbF9UKAorICAgIFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLAorICAgIGNvbnN0IFZtYVBvb2xDcmVhdGVJbmZvJiBjcmVhdGVJbmZvLAorICAgIFZrRGV2aWNlU2l6ZSBwcmVmZXJyZWRCbG9ja1NpemUpIDoKKyAgICBtX0Jsb2NrVmVjdG9yKAorICAgICAgICBoQWxsb2NhdG9yLAorICAgICAgICBjcmVhdGVJbmZvLm1lbW9yeVR5cGVJbmRleCwKKyAgICAgICAgY3JlYXRlSW5mby5ibG9ja1NpemUgIT0gMCA/IGNyZWF0ZUluZm8uYmxvY2tTaXplIDogcHJlZmVycmVkQmxvY2tTaXplLAorICAgICAgICBjcmVhdGVJbmZvLm1pbkJsb2NrQ291bnQsCisgICAgICAgIGNyZWF0ZUluZm8ubWF4QmxvY2tDb3VudCwKKyAgICAgICAgKGNyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfUE9PTF9DUkVBVEVfSUdOT1JFX0JVRkZFUl9JTUFHRV9HUkFOVUxBUklUWV9CSVQpICE9IDAgPyAxIDogaEFsbG9jYXRvci0+R2V0QnVmZmVySW1hZ2VHcmFudWxhcml0eSgpLAorICAgICAgICBjcmVhdGVJbmZvLmZyYW1lSW5Vc2VDb3VudCwKKyAgICAgICAgdHJ1ZSwgLy8gaXNDdXN0b21Qb29sCisgICAgICAgIGNyZWF0ZUluZm8uYmxvY2tTaXplICE9IDAsIC8vIGV4cGxpY2l0QmxvY2tTaXplCisgICAgICAgIGNyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfUE9PTF9DUkVBVEVfQUxHT1JJVEhNX01BU0spLCAvLyBhbGdvcml0aG0KKyAgICBtX0lkKDApCit7Cit9CisKK1ZtYVBvb2xfVDo6flZtYVBvb2xfVCgpCit7Cit9CisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworI2VuZGlmIC8vICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworVm1hQmxvY2tWZWN0b3I6OlZtYUJsb2NrVmVjdG9yKAorICAgIFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLAorICAgIHVpbnQzMl90IG1lbW9yeVR5cGVJbmRleCwKKyAgICBWa0RldmljZVNpemUgcHJlZmVycmVkQmxvY2tTaXplLAorICAgIHNpemVfdCBtaW5CbG9ja0NvdW50LAorICAgIHNpemVfdCBtYXhCbG9ja0NvdW50LAorICAgIFZrRGV2aWNlU2l6ZSBidWZmZXJJbWFnZUdyYW51bGFyaXR5LAorICAgIHVpbnQzMl90IGZyYW1lSW5Vc2VDb3VudCwKKyAgICBib29sIGlzQ3VzdG9tUG9vbCwKKyAgICBib29sIGV4cGxpY2l0QmxvY2tTaXplLAorICAgIHVpbnQzMl90IGFsZ29yaXRobSkgOgorICAgIG1faEFsbG9jYXRvcihoQWxsb2NhdG9yKSwKKyAgICBtX01lbW9yeVR5cGVJbmRleChtZW1vcnlUeXBlSW5kZXgpLAorICAgIG1fUHJlZmVycmVkQmxvY2tTaXplKHByZWZlcnJlZEJsb2NrU2l6ZSksCisgICAgbV9NaW5CbG9ja0NvdW50KG1pbkJsb2NrQ291bnQpLAorICAgIG1fTWF4QmxvY2tDb3VudChtYXhCbG9ja0NvdW50KSwKKyAgICBtX0J1ZmZlckltYWdlR3JhbnVsYXJpdHkoYnVmZmVySW1hZ2VHcmFudWxhcml0eSksCisgICAgbV9GcmFtZUluVXNlQ291bnQoZnJhbWVJblVzZUNvdW50KSwKKyAgICBtX0lzQ3VzdG9tUG9vbChpc0N1c3RvbVBvb2wpLAorICAgIG1fRXhwbGljaXRCbG9ja1NpemUoZXhwbGljaXRCbG9ja1NpemUpLAorICAgIG1fQWxnb3JpdGhtKGFsZ29yaXRobSksCisgICAgbV9IYXNFbXB0eUJsb2NrKGZhbHNlKSwKKyAgICBtX0Jsb2NrcyhWbWFTdGxBbGxvY2F0b3I8Vm1hRGV2aWNlTWVtb3J5QmxvY2sqPihoQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKSwKKyAgICBtX05leHRCbG9ja0lkKDApCit7Cit9CisKK1ZtYUJsb2NrVmVjdG9yOjp+Vm1hQmxvY2tWZWN0b3IoKQoreworICAgIGZvcihzaXplX3QgaSA9IG1fQmxvY2tzLnNpemUoKTsgaS0tOyApCisgICAgeworICAgICAgICBtX0Jsb2Nrc1tpXS0+RGVzdHJveShtX2hBbGxvY2F0b3IpOworICAgICAgICB2bWFfZGVsZXRlKG1faEFsbG9jYXRvciwgbV9CbG9ja3NbaV0pOworICAgIH0KK30KKworVmtSZXN1bHQgVm1hQmxvY2tWZWN0b3I6OkNyZWF0ZU1pbkJsb2NrcygpCit7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1fTWluQmxvY2tDb3VudDsgKytpKQorICAgIHsKKyAgICAgICAgVmtSZXN1bHQgcmVzID0gQ3JlYXRlQmxvY2sobV9QcmVmZXJyZWRCbG9ja1NpemUsIFZNQV9OVUxMKTsKKyAgICAgICAgaWYocmVzICE9IFZLX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgVm1hQmxvY2tWZWN0b3I6OkdldFBvb2xTdGF0cyhWbWFQb29sU3RhdHMqIHBTdGF0cykKK3sKKyAgICBWbWFNdXRleExvY2tSZWFkIGxvY2sobV9NdXRleCwgbV9oQWxsb2NhdG9yLT5tX1VzZU11dGV4KTsKKworICAgIGNvbnN0IHNpemVfdCBibG9ja0NvdW50ID0gbV9CbG9ja3Muc2l6ZSgpOworCisgICAgcFN0YXRzLT5zaXplID0gMDsKKyAgICBwU3RhdHMtPnVudXNlZFNpemUgPSAwOworICAgIHBTdGF0cy0+YWxsb2NhdGlvbkNvdW50ID0gMDsKKyAgICBwU3RhdHMtPnVudXNlZFJhbmdlQ291bnQgPSAwOworICAgIHBTdGF0cy0+dW51c2VkUmFuZ2VTaXplTWF4ID0gMDsKKyAgICBwU3RhdHMtPmJsb2NrQ291bnQgPSBibG9ja0NvdW50OworCisgICAgZm9yKHVpbnQzMl90IGJsb2NrSW5kZXggPSAwOyBibG9ja0luZGV4IDwgYmxvY2tDb3VudDsgKytibG9ja0luZGV4KQorICAgIHsKKyAgICAgICAgY29uc3QgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGNvbnN0IHBCbG9jayA9IG1fQmxvY2tzW2Jsb2NrSW5kZXhdOworICAgICAgICBWTUFfQVNTRVJUKHBCbG9jayk7CisgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQocEJsb2NrLT5WYWxpZGF0ZSgpKTsKKyAgICAgICAgcEJsb2NrLT5tX3BNZXRhZGF0YS0+QWRkUG9vbFN0YXRzKCpwU3RhdHMpOworICAgIH0KK30KKworYm9vbCBWbWFCbG9ja1ZlY3Rvcjo6SXNDb3JydXB0aW9uRGV0ZWN0aW9uRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgY29uc3QgdWludDMyX3QgcmVxdWlyZWRNZW1GbGFncyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUOworICAgIHJldHVybiAoVk1BX0RFQlVHX0RFVEVDVF9DT1JSVVBUSU9OICE9IDApICYmCisgICAgICAgIChWTUFfREVCVUdfTUFSR0lOID4gMCkgJiYKKyAgICAgICAgKG1faEFsbG9jYXRvci0+bV9NZW1Qcm9wcy5tZW1vcnlUeXBlc1ttX01lbW9yeVR5cGVJbmRleF0ucHJvcGVydHlGbGFncyAmIHJlcXVpcmVkTWVtRmxhZ3MpID09IHJlcXVpcmVkTWVtRmxhZ3M7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBWTUFfQUxMT0NBVElPTl9UUllfQ09VTlQgPSAzMjsKKworVmtSZXN1bHQgVm1hQmxvY2tWZWN0b3I6OkFsbG9jYXRlKAorICAgIFZtYVBvb2wgaEN1cnJlbnRQb29sLAorICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgIFZrRGV2aWNlU2l6ZSBhbGlnbm1lbnQsCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8mIGNyZWF0ZUluZm8sCisgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgc3ViYWxsb2NUeXBlLAorICAgIHNpemVfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKQoreworICAgIHNpemVfdCBhbGxvY0luZGV4OworICAgIFZrUmVzdWx0IHJlcyA9IFZLX1NVQ0NFU1M7CisKKyAgICB7CisgICAgICAgIFZtYU11dGV4TG9ja1dyaXRlIGxvY2sobV9NdXRleCwgbV9oQWxsb2NhdG9yLT5tX1VzZU11dGV4KTsKKyAgICAgICAgZm9yKGFsbG9jSW5kZXggPSAwOyBhbGxvY0luZGV4IDwgYWxsb2NhdGlvbkNvdW50OyArK2FsbG9jSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IEFsbG9jYXRlUGFnZSgKKyAgICAgICAgICAgICAgICBoQ3VycmVudFBvb2wsCisgICAgICAgICAgICAgICAgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgY3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICBzdWJhbGxvY1R5cGUsCisgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25zICsgYWxsb2NJbmRleCk7CisgICAgICAgICAgICBpZihyZXMgIT0gVktfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHJlcyAhPSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8gRnJlZSBhbGwgYWxyZWFkeSBjcmVhdGVkIGFsbG9jYXRpb25zLgorICAgICAgICB3aGlsZShhbGxvY0luZGV4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIEZyZWUocEFsbG9jYXRpb25zW2FsbG9jSW5kZXhdKTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocEFsbG9jYXRpb25zLCAwLCBzaXplb2YoVm1hQWxsb2NhdGlvbikgKiBhbGxvY2F0aW9uQ291bnQpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK1ZrUmVzdWx0IFZtYUJsb2NrVmVjdG9yOjpBbGxvY2F0ZVBhZ2UoCisgICAgVm1hUG9vbCBoQ3VycmVudFBvb2wsCisgICAgdWludDMyX3QgY3VycmVudEZyYW1lSW5kZXgsCisgICAgVmtEZXZpY2VTaXplIHNpemUsCisgICAgVmtEZXZpY2VTaXplIGFsaWdubWVudCwKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyYgY3JlYXRlSW5mbywKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBzdWJhbGxvY1R5cGUsCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24pCit7CisgICAgY29uc3QgYm9vbCBpc1VwcGVyQWRkcmVzcyA9IChjcmVhdGVJbmZvLmZsYWdzICYgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1VQUEVSX0FERFJFU1NfQklUKSAhPSAwOworICAgIGJvb2wgY2FuTWFrZU90aGVyTG9zdCA9IChjcmVhdGVJbmZvLmZsYWdzICYgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0NBTl9NQUtFX09USEVSX0xPU1RfQklUKSAhPSAwOworICAgIGNvbnN0IGJvb2wgbWFwcGVkID0gKGNyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTUFQUEVEX0JJVCkgIT0gMDsKKyAgICBjb25zdCBib29sIGlzVXNlckRhdGFTdHJpbmcgPSAoY3JlYXRlSW5mby5mbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUKSAhPSAwOworICAgIGNvbnN0IGJvb2wgY2FuQ3JlYXRlTmV3QmxvY2sgPQorICAgICAgICAoKGNyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTkVWRVJfQUxMT0NBVEVfQklUKSA9PSAwKSAmJgorICAgICAgICAobV9CbG9ja3Muc2l6ZSgpIDwgbV9NYXhCbG9ja0NvdW50KTsKKyAgICB1aW50MzJfdCBzdHJhdGVneSA9IGNyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfTUFTSzsKKworICAgIC8vIElmIGxpbmVhckFsZ29yaXRobSBpcyB1c2VkLCBjYW5NYWtlT3RoZXJMb3N0IGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gdXNlZCBhcyByaW5nIGJ1ZmZlci4KKyAgICAvLyBXaGljaCBpbiB0dXJuIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gbWF4QmxvY2tDb3VudCA9IDEuCisgICAgaWYobV9BbGdvcml0aG0gPT0gVk1BX1BPT0xfQ1JFQVRFX0xJTkVBUl9BTEdPUklUSE1fQklUICYmIG1fTWF4QmxvY2tDb3VudCA+IDEpCisgICAgeworICAgICAgICBjYW5NYWtlT3RoZXJMb3N0ID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gVXBwZXIgYWRkcmVzcyBjYW4gb25seSBiZSB1c2VkIHdpdGggbGluZWFyIGFsbG9jYXRvciBhbmQgd2l0aGluIHNpbmdsZSBtZW1vcnkgYmxvY2suCisgICAgaWYoaXNVcHBlckFkZHJlc3MgJiYKKyAgICAgICAgKG1fQWxnb3JpdGhtICE9IFZNQV9QT09MX0NSRUFURV9MSU5FQVJfQUxHT1JJVEhNX0JJVCB8fCBtX01heEJsb2NrQ291bnQgPiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIHN0cmF0ZWd5LgorICAgIHN3aXRjaChzdHJhdGVneSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgICBzdHJhdGVneSA9IFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9CRVNUX0ZJVF9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZX0JFU1RfRklUX0JJVDoKKyAgICBjYXNlIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9XT1JTVF9GSVRfQklUOgorICAgIGNhc2UgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZX0ZJUlNUX0ZJVF9CSVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UOworICAgIH0KKworICAgIC8vIEVhcmx5IHJlamVjdDogcmVxdWVzdGVkIGFsbG9jYXRpb24gc2l6ZSBpcyBsYXJnZXIgdGhhdCBtYXhpbXVtIGJsb2NrIHNpemUgZm9yIHRoaXMgYmxvY2sgdmVjdG9yLgorICAgIGlmKHNpemUgKyAyICogVk1BX0RFQlVHX01BUkdJTiA+IG1fUHJlZmVycmVkQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworICAgIH0KKworICAgIC8qCisgICAgVW5kZXIgY2VydGFpbiBjb25kaXRpb24sIHRoaXMgd2hvbGUgc2VjdGlvbiBjYW4gYmUgc2tpcHBlZCBmb3Igb3B0aW1pemF0aW9uLCBzbworICAgIHdlIG1vdmUgb24gZGlyZWN0bHkgdG8gdHJ5aW5nIHRvIGFsbG9jYXRlIHdpdGggY2FuTWFrZU90aGVyTG9zdC4gVGhhdCdzIHRoZSBjYXNlCisgICAgZS5nLiBmb3IgY3VzdG9tIHBvb2xzIHdpdGggbGluZWFyIGFsZ29yaXRobS4KKyAgICAqLworICAgIGlmKCFjYW5NYWtlT3RoZXJMb3N0IHx8IGNhbkNyZWF0ZU5ld0Jsb2NrKQorICAgIHsKKyAgICAgICAgLy8gMS4gU2VhcmNoIGV4aXN0aW5nIGFsbG9jYXRpb25zLiBUcnkgdG8gYWxsb2NhdGUgd2l0aG91dCBtYWtpbmcgb3RoZXIgYWxsb2NhdGlvbnMgbG9zdC4KKyAgICAgICAgVm1hQWxsb2NhdGlvbkNyZWF0ZUZsYWdzIGFsbG9jRmxhZ3NDb3B5ID0gY3JlYXRlSW5mby5mbGFnczsKKyAgICAgICAgYWxsb2NGbGFnc0NvcHkgJj0gflZNQV9BTExPQ0FUSU9OX0NSRUFURV9DQU5fTUFLRV9PVEhFUl9MT1NUX0JJVDsKKworICAgICAgICBpZihtX0FsZ29yaXRobSA9PSBWTUFfUE9PTF9DUkVBVEVfTElORUFSX0FMR09SSVRITV9CSVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVzZSBvbmx5IGxhc3QgYmxvY2suCisgICAgICAgICAgICBpZighbV9CbG9ja3MuZW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogY29uc3QgcEN1cnJCbG9jayA9IG1fQmxvY2tzLmJhY2soKTsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKHBDdXJyQmxvY2spOworICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlcyA9IEFsbG9jYXRlRnJvbUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBwQ3VyckJsb2NrLAorICAgICAgICAgICAgICAgICAgICBoQ3VycmVudFBvb2wsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIGFsbG9jRmxhZ3NDb3B5LAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvLnBVc2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRpb24pOworICAgICAgICAgICAgICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVk1BX0RFQlVHX0xPRygiICAgIFJldHVybmVkIGZyb20gbGFzdCBibG9jayAjJXUiLCAodWludDMyX3QpKG1fQmxvY2tzLnNpemUoKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3RyYXRlZ3kgPT0gVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZX0JFU1RfRklUX0JJVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBGb3J3YXJkIG9yZGVyIGluIG1fQmxvY2tzIC0gcHJlZmVyIGJsb2NrcyB3aXRoIHNtYWxsZXN0IGFtb3VudCBvZiBmcmVlIHNwYWNlLgorICAgICAgICAgICAgICAgIGZvcihzaXplX3QgYmxvY2tJbmRleCA9IDA7IGJsb2NrSW5kZXggPCBtX0Jsb2Nrcy5zaXplKCk7ICsrYmxvY2tJbmRleCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogY29uc3QgcEN1cnJCbG9jayA9IG1fQmxvY2tzW2Jsb2NrSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKHBDdXJyQmxvY2spOworICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXMgPSBBbGxvY2F0ZUZyb21CbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBoQ3VycmVudFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY0ZsYWdzQ29weSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm8ucFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWTUFfREVCVUdfTE9HKCIgICAgUmV0dXJuZWQgZnJvbSBleGlzdGluZyBibG9jayAjJXUiLCAodWludDMyX3QpYmxvY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy8gV09SU1RfRklULCBGSVJTVF9GSVQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBCYWNrd2FyZCBvcmRlciBpbiBtX0Jsb2NrcyAtIHByZWZlciBibG9ja3Mgd2l0aCBsYXJnZXN0IGFtb3VudCBvZiBmcmVlIHNwYWNlLgorICAgICAgICAgICAgICAgIGZvcihzaXplX3QgYmxvY2tJbmRleCA9IG1fQmxvY2tzLnNpemUoKTsgYmxvY2tJbmRleC0tOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogY29uc3QgcEN1cnJCbG9jayA9IG1fQmxvY2tzW2Jsb2NrSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKHBDdXJyQmxvY2spOworICAgICAgICAgICAgICAgICAgICBWa1Jlc3VsdCByZXMgPSBBbGxvY2F0ZUZyb21CbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBoQ3VycmVudFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY0ZsYWdzQ29weSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm8ucFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWTUFfREVCVUdfTE9HKCIgICAgUmV0dXJuZWQgZnJvbSBleGlzdGluZyBibG9jayAjJXUiLCAodWludDMyX3QpYmxvY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIDIuIFRyeSB0byBjcmVhdGUgbmV3IGJsb2NrLgorICAgICAgICBpZihjYW5DcmVhdGVOZXdCbG9jaykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9wdGltYWwgc2l6ZSBmb3IgbmV3IGJsb2NrLgorICAgICAgICAgICAgVmtEZXZpY2VTaXplIG5ld0Jsb2NrU2l6ZSA9IG1fUHJlZmVycmVkQmxvY2tTaXplOworICAgICAgICAgICAgdWludDMyX3QgbmV3QmxvY2tTaXplU2hpZnQgPSAwOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgTkVXX0JMT0NLX1NJWkVfU0hJRlRfTUFYID0gMzsKKworICAgICAgICAgICAgaWYoIW1fRXhwbGljaXRCbG9ja1NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgMS84LCAxLzQsIDEvMiBhcyBmaXJzdCBibG9ja3MuCisgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIG1heEV4aXN0aW5nQmxvY2tTaXplID0gQ2FsY01heEJsb2NrU2l6ZSgpOworICAgICAgICAgICAgICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IE5FV19CTE9DS19TSVpFX1NISUZUX01BWDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHNtYWxsZXJOZXdCbG9ja1NpemUgPSBuZXdCbG9ja1NpemUgLyAyOworICAgICAgICAgICAgICAgICAgICBpZihzbWFsbGVyTmV3QmxvY2tTaXplID4gbWF4RXhpc3RpbmdCbG9ja1NpemUgJiYgc21hbGxlck5ld0Jsb2NrU2l6ZSA+PSBzaXplICogMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2tTaXplID0gc21hbGxlck5ld0Jsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbmV3QmxvY2tTaXplU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IG5ld0Jsb2NrSW5kZXggPSAwOworICAgICAgICAgICAgVmtSZXN1bHQgcmVzID0gQ3JlYXRlQmxvY2sobmV3QmxvY2tTaXplLCAmbmV3QmxvY2tJbmRleCk7CisgICAgICAgICAgICAvLyBBbGxvY2F0aW9uIG9mIHRoaXMgc2l6ZSBmYWlsZWQ/IFRyeSAxLzIsIDEvNCwgMS84IG9mIG1fUHJlZmVycmVkQmxvY2tTaXplLgorICAgICAgICAgICAgaWYoIW1fRXhwbGljaXRCbG9ja1NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUocmVzIDwgMCAmJiBuZXdCbG9ja1NpemVTaGlmdCA8IE5FV19CTE9DS19TSVpFX1NISUZUX01BWCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBzbWFsbGVyTmV3QmxvY2tTaXplID0gbmV3QmxvY2tTaXplIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgaWYoc21hbGxlck5ld0Jsb2NrU2l6ZSA+PSBzaXplKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdCbG9ja1NpemUgPSBzbWFsbGVyTmV3QmxvY2tTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgKytuZXdCbG9ja1NpemVTaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENyZWF0ZUJsb2NrKG5ld0Jsb2NrU2l6ZSwgJm5ld0Jsb2NrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBjb25zdCBwQmxvY2sgPSBtX0Jsb2Nrc1tuZXdCbG9ja0luZGV4XTsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKHBCbG9jay0+bV9wTWV0YWRhdGEtPkdldFNpemUoKSA+PSBzaXplKTsKKworICAgICAgICAgICAgICAgIHJlcyA9IEFsbG9jYXRlRnJvbUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBwQmxvY2ssCisgICAgICAgICAgICAgICAgICAgIGhDdXJyZW50UG9vbCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NGbGFnc0NvcHksCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm8ucFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICBzdWJhbGxvY1R5cGUsCisgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgaWYocmVzID09IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWTUFfREVCVUdfTE9HKCIgICAgQ3JlYXRlZCBuZXcgYmxvY2sgU2l6ZT0lbGx1IiwgbmV3QmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRpb24gZnJvbSBuZXcgYmxvY2sgZmFpbGVkLCBwb3NzaWJseSBkdWUgdG8gVk1BX0RFQlVHX01BUkdJTiBvciBhbGlnbm1lbnQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAzLiBUcnkgdG8gYWxsb2NhdGUgZnJvbSBleGlzdGluZyBibG9ja3Mgd2l0aCBtYWtpbmcgb3RoZXIgYWxsb2NhdGlvbnMgbG9zdC4KKyAgICBpZihjYW5NYWtlT3RoZXJMb3N0KQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdHJ5SW5kZXggPSAwOworICAgICAgICBmb3IoOyB0cnlJbmRleCA8IFZNQV9BTExPQ0FUSU9OX1RSWV9DT1VOVDsgKyt0cnlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIHBCZXN0UmVxdWVzdEJsb2NrID0gVk1BX05VTEw7CisgICAgICAgICAgICBWbWFBbGxvY2F0aW9uUmVxdWVzdCBiZXN0UmVxdWVzdCA9IHt9OworICAgICAgICAgICAgVmtEZXZpY2VTaXplIGJlc3RSZXF1ZXN0Q29zdCA9IFZLX1dIT0xFX1NJWkU7CisKKyAgICAgICAgICAgIC8vIDEuIFNlYXJjaCBleGlzdGluZyBhbGxvY2F0aW9ucy4KKyAgICAgICAgICAgIGlmKHN0cmF0ZWd5ID09IFZNQV9BTExPQ0FUSU9OX0NSRUFURV9TVFJBVEVHWV9CRVNUX0ZJVF9CSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRm9yd2FyZCBvcmRlciBpbiBtX0Jsb2NrcyAtIHByZWZlciBibG9ja3Mgd2l0aCBzbWFsbGVzdCBhbW91bnQgb2YgZnJlZSBzcGFjZS4KKyAgICAgICAgICAgICAgICBmb3Ioc2l6ZV90IGJsb2NrSW5kZXggPSAwOyBibG9ja0luZGV4IDwgbV9CbG9ja3Muc2l6ZSgpOyArK2Jsb2NrSW5kZXggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGNvbnN0IHBDdXJyQmxvY2sgPSBtX0Jsb2Nrc1tibG9ja0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgVk1BX0FTU0VSVChwQ3VyckJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgVm1hQWxsb2NhdGlvblJlcXVlc3QgY3VyclJlcXVlc3QgPSB7fTsKKyAgICAgICAgICAgICAgICAgICAgaWYocEN1cnJCbG9jay0+bV9wTWV0YWRhdGEtPkNyZWF0ZUFsbG9jYXRpb25SZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBtX0ZyYW1lSW5Vc2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAoY3JlYXRlSW5mby5mbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VUFBFUl9BRERSRVNTX0JJVCkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbk1ha2VPdGhlckxvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyUmVxdWVzdCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBjdXJyUmVxdWVzdENvc3QgPSBjdXJyUmVxdWVzdC5DYWxjQ29zdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocEJlc3RSZXF1ZXN0QmxvY2sgPT0gVk1BX05VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyUmVxdWVzdENvc3QgPCBiZXN0UmVxdWVzdENvc3QpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJlc3RSZXF1ZXN0QmxvY2sgPSBwQ3VyckJsb2NrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RSZXF1ZXN0ID0gY3VyclJlcXVlc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFJlcXVlc3RDb3N0ID0gY3VyclJlcXVlc3RDb3N0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmVzdFJlcXVlc3RDb3N0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8vIFdPUlNUX0ZJVCwgRklSU1RfRklUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQmFja3dhcmQgb3JkZXIgaW4gbV9CbG9ja3MgLSBwcmVmZXIgYmxvY2tzIHdpdGggbGFyZ2VzdCBhbW91bnQgb2YgZnJlZSBzcGFjZS4KKyAgICAgICAgICAgICAgICBmb3Ioc2l6ZV90IGJsb2NrSW5kZXggPSBtX0Jsb2Nrcy5zaXplKCk7IGJsb2NrSW5kZXgtLTsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGNvbnN0IHBDdXJyQmxvY2sgPSBtX0Jsb2Nrc1tibG9ja0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgVk1BX0FTU0VSVChwQ3VyckJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgVm1hQWxsb2NhdGlvblJlcXVlc3QgY3VyclJlcXVlc3QgPSB7fTsKKyAgICAgICAgICAgICAgICAgICAgaWYocEN1cnJCbG9jay0+bV9wTWV0YWRhdGEtPkNyZWF0ZUFsbG9jYXRpb25SZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBtX0ZyYW1lSW5Vc2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQnVmZmVySW1hZ2VHcmFudWxhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAoY3JlYXRlSW5mby5mbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VUFBFUl9BRERSRVNTX0JJVCkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbk1ha2VPdGhlckxvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyUmVxdWVzdCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBjdXJyUmVxdWVzdENvc3QgPSBjdXJyUmVxdWVzdC5DYWxjQ29zdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocEJlc3RSZXF1ZXN0QmxvY2sgPT0gVk1BX05VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyUmVxdWVzdENvc3QgPCBiZXN0UmVxdWVzdENvc3QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9PSBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfRklSU1RfRklUX0JJVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmVzdFJlcXVlc3RCbG9jayA9IHBDdXJyQmxvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFJlcXVlc3QgPSBjdXJyUmVxdWVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0UmVxdWVzdENvc3QgPSBjdXJyUmVxdWVzdENvc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiZXN0UmVxdWVzdENvc3QgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9PSBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfRklSU1RfRklUX0JJVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocEJlc3RSZXF1ZXN0QmxvY2sgIT0gVk1BX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYobWFwcGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmtSZXN1bHQgcmVzID0gcEJlc3RSZXF1ZXN0QmxvY2stPk1hcChtX2hBbGxvY2F0b3IsIDEsIFZNQV9OVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocmVzICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihwQmVzdFJlcXVlc3RCbG9jay0+bV9wTWV0YWRhdGEtPk1ha2VSZXF1ZXN0ZWRBbGxvY2F0aW9uc0xvc3QoCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICBtX0ZyYW1lSW5Vc2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgJmJlc3RSZXF1ZXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5vIGxvbmdlciBoYXZlIGFuIGVtcHR5IEFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIGlmKHBCZXN0UmVxdWVzdEJsb2NrLT5tX3BNZXRhZGF0YS0+SXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX0hhc0VtcHR5QmxvY2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBmcm9tIHRoaXMgcEJsb2NrLgorICAgICAgICAgICAgICAgICAgICAqcEFsbG9jYXRpb24gPSB2bWFfbmV3KG1faEFsbG9jYXRvciwgVm1hQWxsb2NhdGlvbl9UKShjdXJyZW50RnJhbWVJbmRleCwgaXNVc2VyRGF0YVN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIHBCZXN0UmVxdWVzdEJsb2NrLT5tX3BNZXRhZGF0YS0+QWxsb2MoYmVzdFJlcXVlc3QsIHN1YmFsbG9jVHlwZSwgc2l6ZSwgaXNVcHBlckFkZHJlc3MsICpwQWxsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICgqcEFsbG9jYXRpb24pLT5Jbml0QmxvY2tBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgaEN1cnJlbnRQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgcEJlc3RSZXF1ZXN0QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0UmVxdWVzdC5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX0JFQ09NRV9MT1NUX0JJVCkgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQocEJlc3RSZXF1ZXN0QmxvY2stPlZhbGlkYXRlKCkpOworICAgICAgICAgICAgICAgICAgICBWTUFfREVCVUdfTE9HKCIgICAgUmV0dXJuZWQgZnJvbSBleGlzdGluZyBhbGxvY2F0aW9uICMldSIsICh1aW50MzJfdClibG9ja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKCpwQWxsb2NhdGlvbiktPlNldFVzZXJEYXRhKG1faEFsbG9jYXRvciwgY3JlYXRlSW5mby5wVXNlckRhdGEpOworICAgICAgICAgICAgICAgICAgICBpZihWTUFfREVCVUdfSU5JVElBTElaRV9BTExPQ0FUSU9OUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9oQWxsb2NhdG9yLT5GaWxsQWxsb2NhdGlvbigqcEFsbG9jYXRpb24sIFZNQV9BTExPQ0FUSU9OX0ZJTExfUEFUVEVSTl9DUkVBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihJc0NvcnJ1cHRpb25EZXRlY3Rpb25FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZrUmVzdWx0IHJlcyA9IHBCZXN0UmVxdWVzdEJsb2NrLT5Xcml0ZU1hZ2ljVmFsdWVBcm91bmRBbGxvY2F0aW9uKG1faEFsbG9jYXRvciwgYmVzdFJlcXVlc3Qub2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZNQV9BU1NFUlQocmVzID09IFZLX1NVQ0NFU1MgJiYgIkNvdWxkbid0IG1hcCBibG9jayBtZW1vcnkgdG8gd3JpdGUgbWFnaWMgdmFsdWUuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGVsc2U6IFNvbWUgYWxsb2NhdGlvbnMgbXVzdCBoYXZlIGJlZW4gdG91Y2hlZCB3aGlsZSB3ZSBhcmUgaGVyZS4gTmV4dCB0cnkuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGZpbmQgcGxhY2UgaW4gYW55IG9mIHRoZSBibG9ja3MgLSBicmVhayBvdXRlciBsb29wLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIHRyaWVzIGV4Y2VlZGVkIC0gYSB2ZXJ5IHVubGlrZSBldmVudCB3aGVuIG1hbnkgb3RoZXIKKyAgICAgICAgdGhyZWFkcyBhcmUgc2ltdWx0YW5lb3VzbHkgdG91Y2hpbmcgYWxsb2NhdGlvbnMgbWFraW5nIGl0IGltcG9zc2libGUgdG8gbWFrZQorICAgICAgICBsb3N0IGF0IHRoZSBzYW1lIHRpbWUgYXMgd2UgdHJ5IHRvIGFsbG9jYXRlLiAqLworICAgICAgICBpZih0cnlJbmRleCA9PSBWTUFfQUxMT0NBVElPTl9UUllfQ09VTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9UT09fTUFOWV9PQkpFQ1RTOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworfQorCit2b2lkIFZtYUJsb2NrVmVjdG9yOjpGcmVlKAorICAgIFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24pCit7CisgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIHBCbG9ja1RvRGVsZXRlID0gVk1BX05VTEw7CisKKyAgICAvLyBTY29wZSBmb3IgbG9jay4KKyAgICB7CisgICAgICAgIFZtYU11dGV4TG9ja1dyaXRlIGxvY2sobV9NdXRleCwgbV9oQWxsb2NhdG9yLT5tX1VzZU11dGV4KTsKKworICAgICAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogcEJsb2NrID0gaEFsbG9jYXRpb24tPkdldEJsb2NrKCk7CisKKyAgICAgICAgaWYoSXNDb3JydXB0aW9uRGV0ZWN0aW9uRW5hYmxlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBWa1Jlc3VsdCByZXMgPSBwQmxvY2stPlZhbGlkYXRlTWFnaWNWYWx1ZUFyb3VuZEFsbG9jYXRpb24obV9oQWxsb2NhdG9yLCBoQWxsb2NhdGlvbi0+R2V0T2Zmc2V0KCksIGhBbGxvY2F0aW9uLT5HZXRTaXplKCkpOworICAgICAgICAgICAgVk1BX0FTU0VSVChyZXMgPT0gVktfU1VDQ0VTUyAmJiAiQ291bGRuJ3QgbWFwIGJsb2NrIG1lbW9yeSB0byB2YWxpZGF0ZSBtYWdpYyB2YWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGhBbGxvY2F0aW9uLT5Jc1BlcnNpc3RlbnRNYXAoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEJsb2NrLT5Vbm1hcChtX2hBbGxvY2F0b3IsIDEpOworICAgICAgICB9CisKKyAgICAgICAgcEJsb2NrLT5tX3BNZXRhZGF0YS0+RnJlZShoQWxsb2NhdGlvbik7CisgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQocEJsb2NrLT5WYWxpZGF0ZSgpKTsKKworICAgICAgICBWTUFfREVCVUdfTE9HKCIgIEZyZWVkIGZyb20gTWVtb3J5VHlwZUluZGV4PSV1IiwgbWVtVHlwZUluZGV4KTsKKworICAgICAgICAvLyBwQmxvY2sgYmVjYW1lIGVtcHR5IGFmdGVyIHRoaXMgZGVhbGxvY2F0aW9uLgorICAgICAgICBpZihwQmxvY2stPm1fcE1ldGFkYXRhLT5Jc0VtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIGVtcHR5IEFsbG9jYXRpb24uIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0d28sIHNvIGRlbGV0ZSB0aGlzIG9uZS4KKyAgICAgICAgICAgIGlmKG1fSGFzRW1wdHlCbG9jayAmJiBtX0Jsb2Nrcy5zaXplKCkgPiBtX01pbkJsb2NrQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJsb2NrVG9EZWxldGUgPSBwQmxvY2s7CisgICAgICAgICAgICAgICAgUmVtb3ZlKHBCbG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBXZSBub3cgaGF2ZSBmaXJzdCBlbXB0eSBibG9jay4KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX0hhc0VtcHR5QmxvY2sgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHBCbG9jayBkaWRuJ3QgYmVjb21lIGVtcHR5LCBidXQgd2UgaGF2ZSBhbm90aGVyIGVtcHR5IGJsb2NrIC0gZmluZCBhbmQgZnJlZSB0aGF0IG9uZS4KKyAgICAgICAgLy8gKFRoaXMgaXMgb3B0aW9uYWwsIGhldXJpc3RpY3MuKQorICAgICAgICBlbHNlIGlmKG1fSGFzRW1wdHlCbG9jaykKKyAgICAgICAgeworICAgICAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIHBMYXN0QmxvY2sgPSBtX0Jsb2Nrcy5iYWNrKCk7CisgICAgICAgICAgICBpZihwTGFzdEJsb2NrLT5tX3BNZXRhZGF0YS0+SXNFbXB0eSgpICYmIG1fQmxvY2tzLnNpemUoKSA+IG1fTWluQmxvY2tDb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQmxvY2tUb0RlbGV0ZSA9IHBMYXN0QmxvY2s7CisgICAgICAgICAgICAgICAgbV9CbG9ja3MucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBtX0hhc0VtcHR5QmxvY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEluY3JlbWVudGFsbHlTb3J0QmxvY2tzKCk7CisgICAgfQorCisgICAgLy8gRGVzdHJ1Y3Rpb24gb2YgYSBmcmVlIEFsbG9jYXRpb24uIERlZmVycmVkIHVudGlsIHRoaXMgcG9pbnQsIG91dHNpZGUgb2YgbXV0ZXgKKyAgICAvLyBsb2NrLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uLgorICAgIGlmKHBCbG9ja1RvRGVsZXRlICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgVk1BX0RFQlVHX0xPRygiICAgIERlbGV0ZWQgZW1wdHkgYWxsb2NhdGlvbiIpOworICAgICAgICBwQmxvY2tUb0RlbGV0ZS0+RGVzdHJveShtX2hBbGxvY2F0b3IpOworICAgICAgICB2bWFfZGVsZXRlKG1faEFsbG9jYXRvciwgcEJsb2NrVG9EZWxldGUpOworICAgIH0KK30KKworVmtEZXZpY2VTaXplIFZtYUJsb2NrVmVjdG9yOjpDYWxjTWF4QmxvY2tTaXplKCkgY29uc3QKK3sKKyAgICBWa0RldmljZVNpemUgcmVzdWx0ID0gMDsKKyAgICBmb3Ioc2l6ZV90IGkgPSBtX0Jsb2Nrcy5zaXplKCk7IGktLTsgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gVk1BX01BWChyZXN1bHQsIG1fQmxvY2tzW2ldLT5tX3BNZXRhZGF0YS0+R2V0U2l6ZSgpKTsKKyAgICAgICAgaWYocmVzdWx0ID49IG1fUHJlZmVycmVkQmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFZtYUJsb2NrVmVjdG9yOjpSZW1vdmUoVm1hRGV2aWNlTWVtb3J5QmxvY2sqIHBCbG9jaykKK3sKKyAgICBmb3IodWludDMyX3QgYmxvY2tJbmRleCA9IDA7IGJsb2NrSW5kZXggPCBtX0Jsb2Nrcy5zaXplKCk7ICsrYmxvY2tJbmRleCkKKyAgICB7CisgICAgICAgIGlmKG1fQmxvY2tzW2Jsb2NrSW5kZXhdID09IHBCbG9jaykKKyAgICAgICAgeworICAgICAgICAgICAgVm1hVmVjdG9yUmVtb3ZlKG1fQmxvY2tzLCBibG9ja0luZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBWTUFfQVNTRVJUKDApOworfQorCit2b2lkIFZtYUJsb2NrVmVjdG9yOjpJbmNyZW1lbnRhbGx5U29ydEJsb2NrcygpCit7CisgICAgaWYobV9BbGdvcml0aG0gIT0gVk1BX1BPT0xfQ1JFQVRFX0xJTkVBUl9BTEdPUklUSE1fQklUKQorICAgIHsKKyAgICAgICAgLy8gQnViYmxlIHNvcnQgb25seSB1bnRpbCBmaXJzdCBzd2FwLgorICAgICAgICBmb3Ioc2l6ZV90IGkgPSAxOyBpIDwgbV9CbG9ja3Muc2l6ZSgpOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1fQmxvY2tzW2kgLSAxXS0+bV9wTWV0YWRhdGEtPkdldFN1bUZyZWVTaXplKCkgPiBtX0Jsb2Nrc1tpXS0+bV9wTWV0YWRhdGEtPkdldFN1bUZyZWVTaXplKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk1BX1NXQVAobV9CbG9ja3NbaSAtIDFdLCBtX0Jsb2Nrc1tpXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitWa1Jlc3VsdCBWbWFCbG9ja1ZlY3Rvcjo6QWxsb2NhdGVGcm9tQmxvY2soCisgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIHBCbG9jaywKKyAgICBWbWFQb29sIGhDdXJyZW50UG9vbCwKKyAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICBWa0RldmljZVNpemUgc2l6ZSwKKyAgICBWa0RldmljZVNpemUgYWxpZ25tZW50LAorICAgIFZtYUFsbG9jYXRpb25DcmVhdGVGbGFncyBhbGxvY0ZsYWdzLAorICAgIHZvaWQqIHBVc2VyRGF0YSwKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBzdWJhbGxvY1R5cGUsCisgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24pCit7CisgICAgVk1BX0FTU0VSVCgoYWxsb2NGbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9DQU5fTUFLRV9PVEhFUl9MT1NUX0JJVCkgPT0gMCk7CisgICAgY29uc3QgYm9vbCBpc1VwcGVyQWRkcmVzcyA9IChhbGxvY0ZsYWdzICYgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1VQUEVSX0FERFJFU1NfQklUKSAhPSAwOworICAgIGNvbnN0IGJvb2wgbWFwcGVkID0gKGFsbG9jRmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTUFQUEVEX0JJVCkgIT0gMDsKKyAgICBjb25zdCBib29sIGlzVXNlckRhdGFTdHJpbmcgPSAoYWxsb2NGbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUKSAhPSAwOworCisgICAgVm1hQWxsb2NhdGlvblJlcXVlc3QgY3VyclJlcXVlc3QgPSB7fTsKKyAgICBpZihwQmxvY2stPm1fcE1ldGFkYXRhLT5DcmVhdGVBbGxvY2F0aW9uUmVxdWVzdCgKKyAgICAgICAgY3VycmVudEZyYW1lSW5kZXgsCisgICAgICAgIG1fRnJhbWVJblVzZUNvdW50LAorICAgICAgICBtX0J1ZmZlckltYWdlR3JhbnVsYXJpdHksCisgICAgICAgIHNpemUsCisgICAgICAgIGFsaWdubWVudCwKKyAgICAgICAgaXNVcHBlckFkZHJlc3MsCisgICAgICAgIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgZmFsc2UsIC8vIGNhbk1ha2VPdGhlckxvc3QKKyAgICAgICAgc3RyYXRlZ3ksCisgICAgICAgICZjdXJyUmVxdWVzdCkpCisgICAgeworICAgICAgICAvLyBBbGxvY2F0ZSBmcm9tIHBDdXJyQmxvY2suCisgICAgICAgIFZNQV9BU1NFUlQoY3VyclJlcXVlc3QuaXRlbXNUb01ha2VMb3N0Q291bnQgPT0gMCk7CisKKyAgICAgICAgaWYobWFwcGVkKQorICAgICAgICB7CisgICAgICAgICAgICBWa1Jlc3VsdCByZXMgPSBwQmxvY2stPk1hcChtX2hBbGxvY2F0b3IsIDEsIFZNQV9OVUxMKTsKKyAgICAgICAgICAgIGlmKHJlcyAhPSBWS19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvLyBXZSBubyBsb25nZXIgaGF2ZSBhbiBlbXB0eSBBbGxvY2F0aW9uLgorICAgICAgICBpZihwQmxvY2stPm1fcE1ldGFkYXRhLT5Jc0VtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fSGFzRW1wdHlCbG9jayA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgKnBBbGxvY2F0aW9uID0gdm1hX25ldyhtX2hBbGxvY2F0b3IsIFZtYUFsbG9jYXRpb25fVCkoY3VycmVudEZyYW1lSW5kZXgsIGlzVXNlckRhdGFTdHJpbmcpOworICAgICAgICBwQmxvY2stPm1fcE1ldGFkYXRhLT5BbGxvYyhjdXJyUmVxdWVzdCwgc3ViYWxsb2NUeXBlLCBzaXplLCBpc1VwcGVyQWRkcmVzcywgKnBBbGxvY2F0aW9uKTsKKyAgICAgICAgKCpwQWxsb2NhdGlvbiktPkluaXRCbG9ja0FsbG9jYXRpb24oCisgICAgICAgICAgICBoQ3VycmVudFBvb2wsCisgICAgICAgICAgICBwQmxvY2ssCisgICAgICAgICAgICBjdXJyUmVxdWVzdC5vZmZzZXQsCisgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgc3ViYWxsb2NUeXBlLAorICAgICAgICAgICAgbWFwcGVkLAorICAgICAgICAgICAgKGFsbG9jRmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX0JFQ09NRV9MT1NUX0JJVCkgIT0gMCk7CisgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQocEJsb2NrLT5WYWxpZGF0ZSgpKTsKKyAgICAgICAgKCpwQWxsb2NhdGlvbiktPlNldFVzZXJEYXRhKG1faEFsbG9jYXRvciwgcFVzZXJEYXRhKTsKKyAgICAgICAgaWYoVk1BX0RFQlVHX0lOSVRJQUxJWkVfQUxMT0NBVElPTlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faEFsbG9jYXRvci0+RmlsbEFsbG9jYXRpb24oKnBBbGxvY2F0aW9uLCBWTUFfQUxMT0NBVElPTl9GSUxMX1BBVFRFUk5fQ1JFQVRFRCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoSXNDb3JydXB0aW9uRGV0ZWN0aW9uRW5hYmxlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBWa1Jlc3VsdCByZXMgPSBwQmxvY2stPldyaXRlTWFnaWNWYWx1ZUFyb3VuZEFsbG9jYXRpb24obV9oQWxsb2NhdG9yLCBjdXJyUmVxdWVzdC5vZmZzZXQsIHNpemUpOworICAgICAgICAgICAgVk1BX0FTU0VSVChyZXMgPT0gVktfU1VDQ0VTUyAmJiAiQ291bGRuJ3QgbWFwIGJsb2NrIG1lbW9yeSB0byB3cml0ZSBtYWdpYyB2YWx1ZS4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworfQorCitWa1Jlc3VsdCBWbWFCbG9ja1ZlY3Rvcjo6Q3JlYXRlQmxvY2soVmtEZXZpY2VTaXplIGJsb2NrU2l6ZSwgc2l6ZV90KiBwTmV3QmxvY2tJbmRleCkKK3sKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBhbGxvY0luZm8gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPIH07CisgICAgYWxsb2NJbmZvLm1lbW9yeVR5cGVJbmRleCA9IG1fTWVtb3J5VHlwZUluZGV4OworICAgIGFsbG9jSW5mby5hbGxvY2F0aW9uU2l6ZSA9IGJsb2NrU2l6ZTsKKyAgICBWa0RldmljZU1lbW9yeSBtZW0gPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1Jlc3VsdCByZXMgPSBtX2hBbGxvY2F0b3ItPkFsbG9jYXRlVnVsa2FuTWVtb3J5KCZhbGxvY0luZm8sICZtZW0pOworICAgIGlmKHJlcyA8IDApCisgICAgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE5ldyBWa0RldmljZU1lbW9yeSBzdWNjZXNzZnVsbHkgY3JlYXRlZC4KKworICAgIC8vIENyZWF0ZSBuZXcgQWxsb2NhdGlvbiBmb3IgaXQuCisgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGNvbnN0IHBCbG9jayA9IHZtYV9uZXcobV9oQWxsb2NhdG9yLCBWbWFEZXZpY2VNZW1vcnlCbG9jaykobV9oQWxsb2NhdG9yKTsKKyAgICBwQmxvY2stPkluaXQoCisgICAgICAgIG1faEFsbG9jYXRvciwKKyAgICAgICAgbV9NZW1vcnlUeXBlSW5kZXgsCisgICAgICAgIG1lbSwKKyAgICAgICAgYWxsb2NJbmZvLmFsbG9jYXRpb25TaXplLAorICAgICAgICBtX05leHRCbG9ja0lkKyssCisgICAgICAgIG1fQWxnb3JpdGhtKTsKKworICAgIG1fQmxvY2tzLnB1c2hfYmFjayhwQmxvY2spOworICAgIGlmKHBOZXdCbG9ja0luZGV4ICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBOZXdCbG9ja0luZGV4ID0gbV9CbG9ja3Muc2l6ZSgpIC0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBWbWFCbG9ja1ZlY3Rvcjo6QXBwbHlEZWZyYWdtZW50YXRpb25Nb3Zlc0NwdSgKKyAgICBjbGFzcyBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQqIHBEZWZyYWdDdHgsCisgICAgY29uc3QgVm1hVmVjdG9yPCBWbWFEZWZyYWdtZW50YXRpb25Nb3ZlLCBWbWFTdGxBbGxvY2F0b3I8Vm1hRGVmcmFnbWVudGF0aW9uTW92ZT4gPiYgbW92ZXMpCit7CisgICAgY29uc3Qgc2l6ZV90IGJsb2NrQ291bnQgPSBtX0Jsb2Nrcy5zaXplKCk7CisgICAgY29uc3QgYm9vbCBpc05vbkNvaGVyZW50ID0gbV9oQWxsb2NhdG9yLT5Jc01lbW9yeVR5cGVOb25Db2hlcmVudChtX01lbW9yeVR5cGVJbmRleCk7CisKKyAgICBlbnVtIEJMT0NLX0ZMQUcKKyAgICB7CisgICAgICAgIEJMT0NLX0ZMQUdfVVNFRCA9IDB4MDAwMDAwMDEsCisgICAgICAgIEJMT0NLX0ZMQUdfTUFQUEVEX0ZPUl9ERUZSQUdNRU5UQVRJT04gPSAweDAwMDAwMDAyLAorICAgIH07CisKKyAgICBzdHJ1Y3QgQmxvY2tJbmZvCisgICAgeworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgdm9pZCogcE1hcHBlZERhdGE7CisgICAgfTsKKyAgICBWbWFWZWN0b3I8IEJsb2NrSW5mbywgVm1hU3RsQWxsb2NhdG9yPEJsb2NrSW5mbz4gPgorICAgICAgICBibG9ja0luZm8oYmxvY2tDb3VudCwgVm1hU3RsQWxsb2NhdG9yPEJsb2NrSW5mbz4obV9oQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKTsKKyAgICBtZW1zZXQoYmxvY2tJbmZvLmRhdGEoKSwgMCwgYmxvY2tDb3VudCAqIHNpemVvZihCbG9ja0luZm8pKTsKKworICAgIC8vIEdvIG92ZXIgYWxsIG1vdmVzLiBNYXJrIGJsb2NrcyB0aGF0IGFyZSB1c2VkIHdpdGggQkxPQ0tfRkxBR19VU0VELgorICAgIGNvbnN0IHNpemVfdCBtb3ZlQ291bnQgPSBtb3Zlcy5zaXplKCk7CisgICAgZm9yKHNpemVfdCBtb3ZlSW5kZXggPSAwOyBtb3ZlSW5kZXggPCBtb3ZlQ291bnQ7ICsrbW92ZUluZGV4KQorICAgIHsKKyAgICAgICAgY29uc3QgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSYgbW92ZSA9IG1vdmVzW21vdmVJbmRleF07CisgICAgICAgIGJsb2NrSW5mb1ttb3ZlLnNyY0Jsb2NrSW5kZXhdLmZsYWdzIHw9IEJMT0NLX0ZMQUdfVVNFRDsKKyAgICAgICAgYmxvY2tJbmZvW21vdmUuZHN0QmxvY2tJbmRleF0uZmxhZ3MgfD0gQkxPQ0tfRkxBR19VU0VEOworICAgIH0KKworICAgIFZNQV9BU1NFUlQocERlZnJhZ0N0eC0+cmVzID09IFZLX1NVQ0NFU1MpOworCisgICAgLy8gR28gb3ZlciBhbGwgYmxvY2tzLiBHZXQgbWFwcGVkIHBvaW50ZXIgb3IgbWFwIGlmIG5lY2Vzc2FyeS4KKyAgICBmb3Ioc2l6ZV90IGJsb2NrSW5kZXggPSAwOyBwRGVmcmFnQ3R4LT5yZXMgPT0gVktfU1VDQ0VTUyAmJiBibG9ja0luZGV4IDwgYmxvY2tDb3VudDsgKytibG9ja0luZGV4KQorICAgIHsKKyAgICAgICAgQmxvY2tJbmZvJiBjdXJyQmxvY2tJbmZvID0gYmxvY2tJbmZvW2Jsb2NrSW5kZXhdOworICAgICAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogcEJsb2NrID0gbV9CbG9ja3NbYmxvY2tJbmRleF07CisgICAgICAgIGlmKChjdXJyQmxvY2tJbmZvLmZsYWdzICYgQkxPQ0tfRkxBR19VU0VEKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyQmxvY2tJbmZvLnBNYXBwZWREYXRhID0gcEJsb2NrLT5HZXRNYXBwZWREYXRhKCk7CisgICAgICAgICAgICAvLyBJdCBpcyBub3Qgb3JpZ2luYWxseSBtYXBwZWQgLSBtYXAgaXQuCisgICAgICAgICAgICBpZihjdXJyQmxvY2tJbmZvLnBNYXBwZWREYXRhID09IFZNQV9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEZWZyYWdDdHgtPnJlcyA9IHBCbG9jay0+TWFwKG1faEFsbG9jYXRvciwgMSwgJmN1cnJCbG9ja0luZm8ucE1hcHBlZERhdGEpOworICAgICAgICAgICAgICAgIGlmKHBEZWZyYWdDdHgtPnJlcyA9PSBWS19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyckJsb2NrSW5mby5mbGFncyB8PSBCTE9DS19GTEFHX01BUFBFRF9GT1JfREVGUkFHTUVOVEFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdvIG92ZXIgYWxsIG1vdmVzLiBEbyBhY3R1YWwgZGF0YSB0cmFuc2Zlci4KKyAgICBpZihwRGVmcmFnQ3R4LT5yZXMgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBub25Db2hlcmVudEF0b21TaXplID0gbV9oQWxsb2NhdG9yLT5tX1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcy5saW1pdHMubm9uQ29oZXJlbnRBdG9tU2l6ZTsKKyAgICAgICAgVmtNYXBwZWRNZW1vcnlSYW5nZSBtZW1SYW5nZSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfTUFQUEVEX01FTU9SWV9SQU5HRSB9OworCisgICAgICAgIGZvcihzaXplX3QgbW92ZUluZGV4ID0gMDsgbW92ZUluZGV4IDwgbW92ZUNvdW50OyArK21vdmVJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSYgbW92ZSA9IG1vdmVzW21vdmVJbmRleF07CisKKyAgICAgICAgICAgIGNvbnN0IEJsb2NrSW5mbyYgc3JjQmxvY2tJbmZvID0gYmxvY2tJbmZvW21vdmUuc3JjQmxvY2tJbmRleF07CisgICAgICAgICAgICBjb25zdCBCbG9ja0luZm8mIGRzdEJsb2NrSW5mbyA9IGJsb2NrSW5mb1ttb3ZlLmRzdEJsb2NrSW5kZXhdOworCisgICAgICAgICAgICBWTUFfQVNTRVJUKHNyY0Jsb2NrSW5mby5wTWFwcGVkRGF0YSAmJiBkc3RCbG9ja0luZm8ucE1hcHBlZERhdGEpOworCisgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHNvdXJjZS4KKyAgICAgICAgICAgIGlmKGlzTm9uQ29oZXJlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGNvbnN0IHBTcmNCbG9jayA9IG1fQmxvY2tzW21vdmUuc3JjQmxvY2tJbmRleF07CisgICAgICAgICAgICAgICAgbWVtUmFuZ2UubWVtb3J5ID0gcFNyY0Jsb2NrLT5HZXREZXZpY2VNZW1vcnkoKTsKKyAgICAgICAgICAgICAgICBtZW1SYW5nZS5vZmZzZXQgPSBWbWFBbGlnbkRvd24obW92ZS5zcmNPZmZzZXQsIG5vbkNvaGVyZW50QXRvbVNpemUpOworICAgICAgICAgICAgICAgIG1lbVJhbmdlLnNpemUgPSBWTUFfTUlOKAorICAgICAgICAgICAgICAgICAgICBWbWFBbGlnblVwKG1vdmUuc2l6ZSArIChtb3ZlLnNyY09mZnNldCAtIG1lbVJhbmdlLm9mZnNldCksIG5vbkNvaGVyZW50QXRvbVNpemUpLAorICAgICAgICAgICAgICAgICAgICBwU3JjQmxvY2stPm1fcE1ldGFkYXRhLT5HZXRTaXplKCkgLSBtZW1SYW5nZS5vZmZzZXQpOworICAgICAgICAgICAgICAgICgqbV9oQWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMpKG1faEFsbG9jYXRvci0+bV9oRGV2aWNlLCAxLCAmbWVtUmFuZ2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUSEUgUExBQ0UgV0hFUkUgQUNUVUFMIERBVEEgQ09QWSBIQVBQRU5TLgorICAgICAgICAgICAgbWVtbW92ZSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihkc3RCbG9ja0luZm8ucE1hcHBlZERhdGEpICsgbW92ZS5kc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oc3JjQmxvY2tJbmZvLnBNYXBwZWREYXRhKSArIG1vdmUuc3JjT2Zmc2V0LAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obW92ZS5zaXplKSk7CisKKyAgICAgICAgICAgIGlmKElzQ29ycnVwdGlvbkRldGVjdGlvbkVuYWJsZWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWbWFXcml0ZU1hZ2ljVmFsdWUoZHN0QmxvY2tJbmZvLnBNYXBwZWREYXRhLCBtb3ZlLmRzdE9mZnNldCAtIFZNQV9ERUJVR19NQVJHSU4pOworICAgICAgICAgICAgICAgIFZtYVdyaXRlTWFnaWNWYWx1ZShkc3RCbG9ja0luZm8ucE1hcHBlZERhdGEsIG1vdmUuZHN0T2Zmc2V0ICsgbW92ZS5zaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmx1c2ggZGVzdGluYXRpb24uCisgICAgICAgICAgICBpZihpc05vbkNvaGVyZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBjb25zdCBwRHN0QmxvY2sgPSBtX0Jsb2Nrc1ttb3ZlLmRzdEJsb2NrSW5kZXhdOworICAgICAgICAgICAgICAgIG1lbVJhbmdlLm1lbW9yeSA9IHBEc3RCbG9jay0+R2V0RGV2aWNlTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgbWVtUmFuZ2Uub2Zmc2V0ID0gVm1hQWxpZ25Eb3duKG1vdmUuZHN0T2Zmc2V0LCBub25Db2hlcmVudEF0b21TaXplKTsKKyAgICAgICAgICAgICAgICBtZW1SYW5nZS5zaXplID0gVk1BX01JTigKKyAgICAgICAgICAgICAgICAgICAgVm1hQWxpZ25VcChtb3ZlLnNpemUgKyAobW92ZS5kc3RPZmZzZXQgLSBtZW1SYW5nZS5vZmZzZXQpLCBub25Db2hlcmVudEF0b21TaXplKSwKKyAgICAgICAgICAgICAgICAgICAgcERzdEJsb2NrLT5tX3BNZXRhZGF0YS0+R2V0U2l6ZSgpIC0gbWVtUmFuZ2Uub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAoKm1faEFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcykobV9oQWxsb2NhdG9yLT5tX2hEZXZpY2UsIDEsICZtZW1SYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHbyBvdmVyIGFsbCBibG9ja3MgaW4gcmV2ZXJzZSBvcmRlci4gVW5tYXAgdGhvc2UgdGhhdCB3ZXJlIG1hcHBlZCBqdXN0IGZvciBkZWZyYWdtZW50YXRpb24uCisgICAgLy8gUmVnYXJkbGVzcyBvZiBwQ3R4LT5yZXMgPT0gVktfU1VDQ0VTUy4KKyAgICBmb3Ioc2l6ZV90IGJsb2NrSW5kZXggPSBibG9ja0NvdW50OyBibG9ja0luZGV4LS07ICkKKyAgICB7CisgICAgICAgIGNvbnN0IEJsb2NrSW5mbyYgY3VyckJsb2NrSW5mbyA9IGJsb2NrSW5mb1tibG9ja0luZGV4XTsKKyAgICAgICAgaWYoKGN1cnJCbG9ja0luZm8uZmxhZ3MgJiBCTE9DS19GTEFHX01BUFBFRF9GT1JfREVGUkFHTUVOVEFUSU9OKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogcEJsb2NrID0gbV9CbG9ja3NbYmxvY2tJbmRleF07CisgICAgICAgICAgICBwQmxvY2stPlVubWFwKG1faEFsbG9jYXRvciwgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVm1hQmxvY2tWZWN0b3I6OkFwcGx5RGVmcmFnbWVudGF0aW9uTW92ZXNHcHUoCisgICAgY2xhc3MgVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0KiBwRGVmcmFnQ3R4LAorICAgIGNvbnN0IFZtYVZlY3RvcjwgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSwgVm1hU3RsQWxsb2NhdG9yPFZtYURlZnJhZ21lbnRhdGlvbk1vdmU+ID4mIG1vdmVzLAorICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKQoreworICAgIGNvbnN0IHNpemVfdCBibG9ja0NvdW50ID0gbV9CbG9ja3Muc2l6ZSgpOworCisgICAgcERlZnJhZ0N0eC0+YmxvY2tDb250ZXh0cy5yZXNpemUoYmxvY2tDb3VudCk7CisgICAgbWVtc2V0KHBEZWZyYWdDdHgtPmJsb2NrQ29udGV4dHMuZGF0YSgpLCAwLCBibG9ja0NvdW50ICogc2l6ZW9mKFZtYUJsb2NrRGVmcmFnbWVudGF0aW9uQ29udGV4dCkpOworCisgICAgLy8gR28gb3ZlciBhbGwgbW92ZXMuIE1hcmsgYmxvY2tzIHRoYXQgYXJlIHVzZWQgd2l0aCBCTE9DS19GTEFHX1VTRUQuCisgICAgY29uc3Qgc2l6ZV90IG1vdmVDb3VudCA9IG1vdmVzLnNpemUoKTsKKyAgICBmb3Ioc2l6ZV90IG1vdmVJbmRleCA9IDA7IG1vdmVJbmRleCA8IG1vdmVDb3VudDsgKyttb3ZlSW5kZXgpCisgICAgeworICAgICAgICBjb25zdCBWbWFEZWZyYWdtZW50YXRpb25Nb3ZlJiBtb3ZlID0gbW92ZXNbbW92ZUluZGV4XTsKKyAgICAgICAgcERlZnJhZ0N0eC0+YmxvY2tDb250ZXh0c1ttb3ZlLnNyY0Jsb2NrSW5kZXhdLmZsYWdzIHw9IFZtYUJsb2NrRGVmcmFnbWVudGF0aW9uQ29udGV4dDo6QkxPQ0tfRkxBR19VU0VEOworICAgICAgICBwRGVmcmFnQ3R4LT5ibG9ja0NvbnRleHRzW21vdmUuZHN0QmxvY2tJbmRleF0uZmxhZ3MgfD0gVm1hQmxvY2tEZWZyYWdtZW50YXRpb25Db250ZXh0OjpCTE9DS19GTEFHX1VTRUQ7CisgICAgfQorCisgICAgVk1BX0FTU0VSVChwRGVmcmFnQ3R4LT5yZXMgPT0gVktfU1VDQ0VTUyk7CisKKyAgICAvLyBHbyBvdmVyIGFsbCBibG9ja3MuIENyZWF0ZSBhbmQgYmluZCBidWZmZXIgZm9yIHdob2xlIGJsb2NrIGlmIG5lY2Vzc2FyeS4KKyAgICB7CisgICAgICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZDcmVhdGVJbmZvID0geyBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8gfTsKKyAgICAgICAgYnVmQ3JlYXRlSW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwKKyAgICAgICAgICAgIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworCisgICAgICAgIGZvcihzaXplX3QgYmxvY2tJbmRleCA9IDA7IHBEZWZyYWdDdHgtPnJlcyA9PSBWS19TVUNDRVNTICYmIGJsb2NrSW5kZXggPCBibG9ja0NvdW50OyArK2Jsb2NrSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZtYUJsb2NrRGVmcmFnbWVudGF0aW9uQ29udGV4dCYgY3VyckJsb2NrQ3R4ID0gcERlZnJhZ0N0eC0+YmxvY2tDb250ZXh0c1tibG9ja0luZGV4XTsKKyAgICAgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBwQmxvY2sgPSBtX0Jsb2Nrc1tibG9ja0luZGV4XTsKKyAgICAgICAgICAgIGlmKChjdXJyQmxvY2tDdHguZmxhZ3MgJiBWbWFCbG9ja0RlZnJhZ21lbnRhdGlvbkNvbnRleHQ6OkJMT0NLX0ZMQUdfVVNFRCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZDcmVhdGVJbmZvLnNpemUgPSBwQmxvY2stPm1fcE1ldGFkYXRhLT5HZXRTaXplKCk7CisgICAgICAgICAgICAgICAgcERlZnJhZ0N0eC0+cmVzID0gKCptX2hBbGxvY2F0b3ItPkdldFZ1bGthbkZ1bmN0aW9ucygpLnZrQ3JlYXRlQnVmZmVyKSgKKyAgICAgICAgICAgICAgICAgICAgbV9oQWxsb2NhdG9yLT5tX2hEZXZpY2UsICZidWZDcmVhdGVJbmZvLCBtX2hBbGxvY2F0b3ItPkdldEFsbG9jYXRpb25DYWxsYmFja3MoKSwgJmN1cnJCbG9ja0N0eC5oQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZihwRGVmcmFnQ3R4LT5yZXMgPT0gVktfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBEZWZyYWdDdHgtPnJlcyA9ICgqbV9oQWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a0JpbmRCdWZmZXJNZW1vcnkpKAorICAgICAgICAgICAgICAgICAgICAgICAgbV9oQWxsb2NhdG9yLT5tX2hEZXZpY2UsIGN1cnJCbG9ja0N0eC5oQnVmZmVyLCBwQmxvY2stPkdldERldmljZU1lbW9yeSgpLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHbyBvdmVyIGFsbCBtb3Zlcy4gUG9zdCBkYXRhIHRyYW5zZmVyIGNvbW1hbmRzIHRvIGNvbW1hbmQgYnVmZmVyLgorICAgIGlmKHBEZWZyYWdDdHgtPnJlcyA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIG5vbkNvaGVyZW50QXRvbVNpemUgPSBtX2hBbGxvY2F0b3ItPm1fUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzLmxpbWl0cy5ub25Db2hlcmVudEF0b21TaXplOworICAgICAgICBWa01hcHBlZE1lbW9yeVJhbmdlIG1lbVJhbmdlID0geyBWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFIH07CisKKyAgICAgICAgZm9yKHNpemVfdCBtb3ZlSW5kZXggPSAwOyBtb3ZlSW5kZXggPCBtb3ZlQ291bnQ7ICsrbW92ZUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWbWFEZWZyYWdtZW50YXRpb25Nb3ZlJiBtb3ZlID0gbW92ZXNbbW92ZUluZGV4XTsKKworICAgICAgICAgICAgY29uc3QgVm1hQmxvY2tEZWZyYWdtZW50YXRpb25Db250ZXh0JiBzcmNCbG9ja0N0eCA9IHBEZWZyYWdDdHgtPmJsb2NrQ29udGV4dHNbbW92ZS5zcmNCbG9ja0luZGV4XTsKKyAgICAgICAgICAgIGNvbnN0IFZtYUJsb2NrRGVmcmFnbWVudGF0aW9uQ29udGV4dCYgZHN0QmxvY2tDdHggPSBwRGVmcmFnQ3R4LT5ibG9ja0NvbnRleHRzW21vdmUuZHN0QmxvY2tJbmRleF07CisKKyAgICAgICAgICAgIFZNQV9BU1NFUlQoc3JjQmxvY2tDdHguaEJ1ZmZlciAmJiBkc3RCbG9ja0N0eC5oQnVmZmVyKTsKKworICAgICAgICAgICAgVmtCdWZmZXJDb3B5IHJlZ2lvbiA9IHsKKyAgICAgICAgICAgICAgICBtb3ZlLnNyY09mZnNldCwKKyAgICAgICAgICAgICAgICBtb3ZlLmRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICBtb3ZlLnNpemUgfTsKKyAgICAgICAgICAgICgqbV9oQWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a0NtZENvcHlCdWZmZXIpKAorICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsIHNyY0Jsb2NrQ3R4LmhCdWZmZXIsIGRzdEJsb2NrQ3R4LmhCdWZmZXIsIDEsICZyZWdpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2F2ZSBidWZmZXJzIHRvIGRlZnJhZyBjb250ZXh0IGZvciBsYXRlciBkZXN0cnVjdGlvbi4KKyAgICBpZihwRGVmcmFnQ3R4LT5yZXMgPT0gVktfU1VDQ0VTUyAmJiBtb3ZlQ291bnQgPiAwKQorICAgIHsKKyAgICAgICAgcERlZnJhZ0N0eC0+cmVzID0gVktfTk9UX1JFQURZOworICAgIH0KK30KKwordm9pZCBWbWFCbG9ja1ZlY3Rvcjo6RnJlZUVtcHR5QmxvY2tzKFZtYURlZnJhZ21lbnRhdGlvblN0YXRzKiBwRGVmcmFnbWVudGF0aW9uU3RhdHMpCit7CisgICAgbV9IYXNFbXB0eUJsb2NrID0gZmFsc2U7CisgICAgZm9yKHNpemVfdCBibG9ja0luZGV4ID0gbV9CbG9ja3Muc2l6ZSgpOyBibG9ja0luZGV4LS07ICkKKyAgICB7CisgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBwQmxvY2sgPSBtX0Jsb2Nrc1tibG9ja0luZGV4XTsKKyAgICAgICAgaWYocEJsb2NrLT5tX3BNZXRhZGF0YS0+SXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihtX0Jsb2Nrcy5zaXplKCkgPiBtX01pbkJsb2NrQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocERlZnJhZ21lbnRhdGlvblN0YXRzICE9IFZNQV9OVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwRGVmcmFnbWVudGF0aW9uU3RhdHMtPmRldmljZU1lbW9yeUJsb2Nrc0ZyZWVkOworICAgICAgICAgICAgICAgICAgICBwRGVmcmFnbWVudGF0aW9uU3RhdHMtPmJ5dGVzRnJlZWQgKz0gcEJsb2NrLT5tX3BNZXRhZGF0YS0+R2V0U2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFZtYVZlY3RvclJlbW92ZShtX0Jsb2NrcywgYmxvY2tJbmRleCk7CisgICAgICAgICAgICAgICAgcEJsb2NrLT5EZXN0cm95KG1faEFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgdm1hX2RlbGV0ZShtX2hBbGxvY2F0b3IsIHBCbG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9IYXNFbXB0eUJsb2NrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2lmIFZNQV9TVEFUU19TVFJJTkdfRU5BQkxFRAorCit2b2lkIFZtYUJsb2NrVmVjdG9yOjpQcmludERldGFpbGVkTWFwKGNsYXNzIFZtYUpzb25Xcml0ZXImIGpzb24pCit7CisgICAgVm1hTXV0ZXhMb2NrUmVhZCBsb2NrKG1fTXV0ZXgsIG1faEFsbG9jYXRvci0+bV9Vc2VNdXRleCk7CisKKyAgICBqc29uLkJlZ2luT2JqZWN0KCk7CisKKyAgICBpZihtX0lzQ3VzdG9tUG9vbCkKKyAgICB7CisgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIk1lbW9yeVR5cGVJbmRleCIpOworICAgICAgICBqc29uLldyaXRlTnVtYmVyKG1fTWVtb3J5VHlwZUluZGV4KTsKKworICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJCbG9ja1NpemUiKTsKKyAgICAgICAganNvbi5Xcml0ZU51bWJlcihtX1ByZWZlcnJlZEJsb2NrU2l6ZSk7CisKKyAgICAgICAganNvbi5Xcml0ZVN0cmluZygiQmxvY2tDb3VudCIpOworICAgICAgICBqc29uLkJlZ2luT2JqZWN0KHRydWUpOworICAgICAgICBpZihtX01pbkJsb2NrQ291bnQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJNaW4iKTsKKyAgICAgICAgICAgIGpzb24uV3JpdGVOdW1iZXIoKHVpbnQ2NF90KW1fTWluQmxvY2tDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYobV9NYXhCbG9ja0NvdW50IDwgU0laRV9NQVgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIk1heCIpOworICAgICAgICAgICAganNvbi5Xcml0ZU51bWJlcigodWludDY0X3QpbV9NYXhCbG9ja0NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJDdXIiKTsKKyAgICAgICAganNvbi5Xcml0ZU51bWJlcigodWludDY0X3QpbV9CbG9ja3Muc2l6ZSgpKTsKKyAgICAgICAganNvbi5FbmRPYmplY3QoKTsKKworICAgICAgICBpZihtX0ZyYW1lSW5Vc2VDb3VudCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIkZyYW1lSW5Vc2VDb3VudCIpOworICAgICAgICAgICAganNvbi5Xcml0ZU51bWJlcihtX0ZyYW1lSW5Vc2VDb3VudCk7CisgICAgICAgIH0KKworICAgICAgICBpZihtX0FsZ29yaXRobSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJBbGdvcml0aG0iKTsKKyAgICAgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoVm1hQWxnb3JpdGhtVG9TdHIobV9BbGdvcml0aG0pKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJQcmVmZXJyZWRCbG9ja1NpemUiKTsKKyAgICAgICAganNvbi5Xcml0ZU51bWJlcihtX1ByZWZlcnJlZEJsb2NrU2l6ZSk7CisgICAgfQorCisgICAganNvbi5Xcml0ZVN0cmluZygiQmxvY2tzIik7CisgICAganNvbi5CZWdpbk9iamVjdCgpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtX0Jsb2Nrcy5zaXplKCk7ICsraSkKKyAgICB7CisgICAgICAgIGpzb24uQmVnaW5TdHJpbmcoKTsKKyAgICAgICAganNvbi5Db250aW51ZVN0cmluZyhtX0Jsb2Nrc1tpXS0+R2V0SWQoKSk7CisgICAgICAgIGpzb24uRW5kU3RyaW5nKCk7CisKKyAgICAgICAgbV9CbG9ja3NbaV0tPm1fcE1ldGFkYXRhLT5QcmludERldGFpbGVkTWFwKGpzb24pOworICAgIH0KKyAgICBqc29uLkVuZE9iamVjdCgpOworCisgICAganNvbi5FbmRPYmplY3QoKTsKK30KKworI2VuZGlmIC8vICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKwordm9pZCBWbWFCbG9ja1ZlY3Rvcjo6RGVmcmFnbWVudCgKKyAgICBjbGFzcyBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQqIHBDdHgsCisgICAgVm1hRGVmcmFnbWVudGF0aW9uU3RhdHMqIHBTdGF0cywKKyAgICBWa0RldmljZVNpemUmIG1heENwdUJ5dGVzVG9Nb3ZlLCB1aW50MzJfdCYgbWF4Q3B1QWxsb2NhdGlvbnNUb01vdmUsCisgICAgVmtEZXZpY2VTaXplJiBtYXhHcHVCeXRlc1RvTW92ZSwgdWludDMyX3QmIG1heEdwdUFsbG9jYXRpb25zVG9Nb3ZlLAorICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKQoreworICAgIHBDdHgtPnJlcyA9IFZLX1NVQ0NFU1M7CisgICAgCisgICAgY29uc3QgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbVByb3BGbGFncyA9CisgICAgICAgIG1faEFsbG9jYXRvci0+bV9NZW1Qcm9wcy5tZW1vcnlUeXBlc1ttX01lbW9yeVR5cGVJbmRleF0ucHJvcGVydHlGbGFnczsKKyAgICBjb25zdCBib29sIGlzSG9zdFZpc2libGUgPSAobWVtUHJvcEZsYWdzICYgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQpICE9IDA7CisgICAgY29uc3QgYm9vbCBpc0hvc3RDb2hlcmVudCA9IChtZW1Qcm9wRmxhZ3MgJiBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQpICE9IDA7CisKKyAgICBjb25zdCBib29sIGNhbkRlZnJhZ21lbnRPbkNwdSA9IG1heENwdUJ5dGVzVG9Nb3ZlID4gMCAmJiBtYXhDcHVBbGxvY2F0aW9uc1RvTW92ZSA+IDAgJiYKKyAgICAgICAgaXNIb3N0VmlzaWJsZTsKKyAgICBjb25zdCBib29sIGNhbkRlZnJhZ21lbnRPbkdwdSA9IG1heEdwdUJ5dGVzVG9Nb3ZlID4gMCAmJiBtYXhHcHVBbGxvY2F0aW9uc1RvTW92ZSA+IDAgJiYKKyAgICAgICAgKFZNQV9ERUJVR19ERVRFQ1RfQ09SUlVQVElPTiA9PSAwIHx8ICEoaXNIb3N0VmlzaWJsZSAmJiBpc0hvc3RDb2hlcmVudCkpOworCisgICAgLy8gVGhlcmUgYXJlIG9wdGlvbnMgdG8gZGVmcmFnbWVudCB0aGlzIG1lbW9yeSB0eXBlLgorICAgIGlmKGNhbkRlZnJhZ21lbnRPbkNwdSB8fCBjYW5EZWZyYWdtZW50T25HcHUpCisgICAgeworICAgICAgICBib29sIGRlZnJhZ21lbnRPbkdwdTsKKyAgICAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgb3B0aW9uIHRvIGRlZnJhZ21lbnQgdGhpcyBtZW1vcnkgdHlwZS4KKyAgICAgICAgaWYoY2FuRGVmcmFnbWVudE9uR3B1ICE9IGNhbkRlZnJhZ21lbnRPbkNwdSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVmcmFnbWVudE9uR3B1ID0gY2FuRGVmcmFnbWVudE9uR3B1OworICAgICAgICB9CisgICAgICAgIC8vIEJvdGggb3B0aW9ucyBhcmUgYXZhaWxhYmxlOiBIZXVyaXN0aWNzIHRvIGNob29zZSB0aGUgYmVzdCBvbmUuCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGVmcmFnbWVudE9uR3B1ID0gKG1lbVByb3BGbGFncyAmIFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUKSAhPSAwIHx8CisgICAgICAgICAgICAgICAgbV9oQWxsb2NhdG9yLT5Jc0ludGVncmF0ZWRHcHUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3ZlcmxhcHBpbmdNb3ZlU3VwcG9ydGVkID0gIWRlZnJhZ21lbnRPbkdwdTsKKworICAgICAgICBpZihtX2hBbGxvY2F0b3ItPm1fVXNlTXV0ZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fTXV0ZXguTG9ja1dyaXRlKCk7CisgICAgICAgICAgICBwQ3R4LT5tdXRleExvY2tlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwQ3R4LT5CZWdpbihvdmVybGFwcGluZ01vdmVTdXBwb3J0ZWQpOworCisgICAgICAgIC8vIERlZnJhZ21lbnQuCisKKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIG1heEJ5dGVzVG9Nb3ZlID0gZGVmcmFnbWVudE9uR3B1ID8gbWF4R3B1Qnl0ZXNUb01vdmUgOiBtYXhDcHVCeXRlc1RvTW92ZTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbWF4QWxsb2NhdGlvbnNUb01vdmUgPSBkZWZyYWdtZW50T25HcHUgPyBtYXhHcHVBbGxvY2F0aW9uc1RvTW92ZSA6IG1heENwdUFsbG9jYXRpb25zVG9Nb3ZlOworICAgICAgICBWbWFWZWN0b3I8IFZtYURlZnJhZ21lbnRhdGlvbk1vdmUsIFZtYVN0bEFsbG9jYXRvcjxWbWFEZWZyYWdtZW50YXRpb25Nb3ZlPiA+IG1vdmVzID0gCisgICAgICAgICAgICBWbWFWZWN0b3I8IFZtYURlZnJhZ21lbnRhdGlvbk1vdmUsIFZtYVN0bEFsbG9jYXRvcjxWbWFEZWZyYWdtZW50YXRpb25Nb3ZlPiA+KFZtYVN0bEFsbG9jYXRvcjxWbWFEZWZyYWdtZW50YXRpb25Nb3ZlPihtX2hBbGxvY2F0b3ItPkdldEFsbG9jYXRpb25DYWxsYmFja3MoKSkpOworICAgICAgICBwQ3R4LT5yZXMgPSBwQ3R4LT5HZXRBbGdvcml0aG0oKS0+RGVmcmFnbWVudChtb3ZlcywgbWF4Qnl0ZXNUb01vdmUsIG1heEFsbG9jYXRpb25zVG9Nb3ZlKTsKKworICAgICAgICAvLyBBY2N1bXVsYXRlIHN0YXRpc3RpY3MuCisgICAgICAgIGlmKHBTdGF0cyAhPSBWTUFfTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGJ5dGVzTW92ZWQgPSBwQ3R4LT5HZXRBbGdvcml0aG0oKS0+R2V0Qnl0ZXNNb3ZlZCgpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYWxsb2NhdGlvbnNNb3ZlZCA9IHBDdHgtPkdldEFsZ29yaXRobSgpLT5HZXRBbGxvY2F0aW9uc01vdmVkKCk7CisgICAgICAgICAgICBwU3RhdHMtPmJ5dGVzTW92ZWQgKz0gYnl0ZXNNb3ZlZDsKKyAgICAgICAgICAgIHBTdGF0cy0+YWxsb2NhdGlvbnNNb3ZlZCArPSBhbGxvY2F0aW9uc01vdmVkOworICAgICAgICAgICAgVk1BX0FTU0VSVChieXRlc01vdmVkIDw9IG1heEJ5dGVzVG9Nb3ZlKTsKKyAgICAgICAgICAgIFZNQV9BU1NFUlQoYWxsb2NhdGlvbnNNb3ZlZCA8PSBtYXhBbGxvY2F0aW9uc1RvTW92ZSk7CisgICAgICAgICAgICBpZihkZWZyYWdtZW50T25HcHUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF4R3B1Qnl0ZXNUb01vdmUgLT0gYnl0ZXNNb3ZlZDsKKyAgICAgICAgICAgICAgICBtYXhHcHVBbGxvY2F0aW9uc1RvTW92ZSAtPSBhbGxvY2F0aW9uc01vdmVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heENwdUJ5dGVzVG9Nb3ZlIC09IGJ5dGVzTW92ZWQ7CisgICAgICAgICAgICAgICAgbWF4Q3B1QWxsb2NhdGlvbnNUb01vdmUgLT0gYWxsb2NhdGlvbnNNb3ZlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorICAgICAgICBpZihwQ3R4LT5yZXMgPj0gVktfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoZGVmcmFnbWVudE9uR3B1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFwcGx5RGVmcmFnbWVudGF0aW9uTW92ZXNHcHUocEN0eCwgbW92ZXMsIGNvbW1hbmRCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFwcGx5RGVmcmFnbWVudGF0aW9uTW92ZXNDcHUocEN0eCwgbW92ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZtYUJsb2NrVmVjdG9yOjpEZWZyYWdtZW50YXRpb25FbmQoCisgICAgY2xhc3MgVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0KiBwQ3R4LAorICAgIFZtYURlZnJhZ21lbnRhdGlvblN0YXRzKiBwU3RhdHMpCit7CisgICAgLy8gRGVzdHJveSBidWZmZXJzLgorICAgIGZvcihzaXplX3QgYmxvY2tJbmRleCA9IHBDdHgtPmJsb2NrQ29udGV4dHMuc2l6ZSgpOyBibG9ja0luZGV4LS07ICkKKyAgICB7CisgICAgICAgIFZtYUJsb2NrRGVmcmFnbWVudGF0aW9uQ29udGV4dCYgYmxvY2tDdHggPSBwQ3R4LT5ibG9ja0NvbnRleHRzW2Jsb2NrSW5kZXhdOworICAgICAgICBpZihibG9ja0N0eC5oQnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICAoKm1faEFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtEZXN0cm95QnVmZmVyKSgKKyAgICAgICAgICAgICAgICBtX2hBbGxvY2F0b3ItPm1faERldmljZSwgYmxvY2tDdHguaEJ1ZmZlciwgbV9oQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocEN0eC0+cmVzID49IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBGcmVlRW1wdHlCbG9ja3MocFN0YXRzKTsKKyAgICB9CisKKyAgICBpZihwQ3R4LT5tdXRleExvY2tlZCkKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQobV9oQWxsb2NhdG9yLT5tX1VzZU11dGV4KTsKKyAgICAgICAgbV9NdXRleC5VbmxvY2tXcml0ZSgpOworICAgIH0KK30KKworc2l6ZV90IFZtYUJsb2NrVmVjdG9yOjpDYWxjQWxsb2NhdGlvbkNvdW50KCkgY29uc3QKK3sKKyAgICBzaXplX3QgcmVzdWx0ID0gMDsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbV9CbG9ja3Muc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgICByZXN1bHQgKz0gbV9CbG9ja3NbaV0tPm1fcE1ldGFkYXRhLT5HZXRBbGxvY2F0aW9uQ291bnQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBWbWFCbG9ja1ZlY3Rvcjo6SXNCdWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3RQb3NzaWJsZSgpIGNvbnN0Cit7CisgICAgaWYobV9CdWZmZXJJbWFnZUdyYW51bGFyaXR5ID09IDEpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIGxhc3RTdWJhbGxvY1R5cGUgPSBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUU7CisgICAgZm9yKHNpemVfdCBpID0gMCwgY291bnQgPSBtX0Jsb2Nrcy5zaXplKCk7IGkgPCBjb3VudDsgKytpKQorICAgIHsKKyAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGNvbnN0IHBCbG9jayA9IG1fQmxvY2tzW2ldOworICAgICAgICBWTUFfQVNTRVJUKG1fQWxnb3JpdGhtID09IDApOworICAgICAgICBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMqIGNvbnN0IHBNZXRhZGF0YSA9IChWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMqKXBCbG9jay0+bV9wTWV0YWRhdGE7CisgICAgICAgIGlmKHBNZXRhZGF0YS0+SXNCdWZmZXJJbWFnZUdyYW51bGFyaXR5Q29uZmxpY3RQb3NzaWJsZShtX0J1ZmZlckltYWdlR3JhbnVsYXJpdHksIGxhc3RTdWJhbGxvY1R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVm1hQmxvY2tWZWN0b3I6Ok1ha2VQb29sQWxsb2NhdGlvbnNMb3N0KAorICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgIHNpemVfdCogcExvc3RBbGxvY2F0aW9uQ291bnQpCit7CisgICAgVm1hTXV0ZXhMb2NrV3JpdGUgbG9jayhtX011dGV4LCBtX2hBbGxvY2F0b3ItPm1fVXNlTXV0ZXgpOworICAgIHNpemVfdCBsb3N0QWxsb2NhdGlvbkNvdW50ID0gMDsKKyAgICBmb3IodWludDMyX3QgYmxvY2tJbmRleCA9IDA7IGJsb2NrSW5kZXggPCBtX0Jsb2Nrcy5zaXplKCk7ICsrYmxvY2tJbmRleCkKKyAgICB7CisgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBjb25zdCBwQmxvY2sgPSBtX0Jsb2Nrc1tibG9ja0luZGV4XTsKKyAgICAgICAgVk1BX0FTU0VSVChwQmxvY2spOworICAgICAgICBsb3N0QWxsb2NhdGlvbkNvdW50ICs9IHBCbG9jay0+bV9wTWV0YWRhdGEtPk1ha2VBbGxvY2F0aW9uc0xvc3QoY3VycmVudEZyYW1lSW5kZXgsIG1fRnJhbWVJblVzZUNvdW50KTsKKyAgICB9CisgICAgaWYocExvc3RBbGxvY2F0aW9uQ291bnQgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICAqcExvc3RBbGxvY2F0aW9uQ291bnQgPSBsb3N0QWxsb2NhdGlvbkNvdW50OworICAgIH0KK30KKworVmtSZXN1bHQgVm1hQmxvY2tWZWN0b3I6OkNoZWNrQ29ycnVwdGlvbigpCit7CisgICAgaWYoIUlzQ29ycnVwdGlvbkRldGVjdGlvbkVuYWJsZWQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UOworICAgIH0KKworICAgIFZtYU11dGV4TG9ja1JlYWQgbG9jayhtX011dGV4LCBtX2hBbGxvY2F0b3ItPm1fVXNlTXV0ZXgpOworICAgIGZvcih1aW50MzJfdCBibG9ja0luZGV4ID0gMDsgYmxvY2tJbmRleCA8IG1fQmxvY2tzLnNpemUoKTsgKytibG9ja0luZGV4KQorICAgIHsKKyAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGNvbnN0IHBCbG9jayA9IG1fQmxvY2tzW2Jsb2NrSW5kZXhdOworICAgICAgICBWTUFfQVNTRVJUKHBCbG9jayk7CisgICAgICAgIFZrUmVzdWx0IHJlcyA9IHBCbG9jay0+Q2hlY2tDb3JydXB0aW9uKG1faEFsbG9jYXRvcik7CisgICAgICAgIGlmKHJlcyAhPSBWS19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIFZtYUJsb2NrVmVjdG9yOjpBZGRTdGF0cyhWbWFTdGF0cyogcFN0YXRzKQoreworICAgIGNvbnN0IHVpbnQzMl90IG1lbVR5cGVJbmRleCA9IG1fTWVtb3J5VHlwZUluZGV4OworICAgIGNvbnN0IHVpbnQzMl90IG1lbUhlYXBJbmRleCA9IG1faEFsbG9jYXRvci0+TWVtb3J5VHlwZUluZGV4VG9IZWFwSW5kZXgobWVtVHlwZUluZGV4KTsKKworICAgIFZtYU11dGV4TG9ja1JlYWQgbG9jayhtX011dGV4LCBtX2hBbGxvY2F0b3ItPm1fVXNlTXV0ZXgpOworCisgICAgZm9yKHVpbnQzMl90IGJsb2NrSW5kZXggPSAwOyBibG9ja0luZGV4IDwgbV9CbG9ja3Muc2l6ZSgpOyArK2Jsb2NrSW5kZXgpCisgICAgeworICAgICAgICBjb25zdCBWbWFEZXZpY2VNZW1vcnlCbG9jayogY29uc3QgcEJsb2NrID0gbV9CbG9ja3NbYmxvY2tJbmRleF07CisgICAgICAgIFZNQV9BU1NFUlQocEJsb2NrKTsKKyAgICAgICAgVk1BX0hFQVZZX0FTU0VSVChwQmxvY2stPlZhbGlkYXRlKCkpOworICAgICAgICBWbWFTdGF0SW5mbyBhbGxvY2F0aW9uU3RhdEluZm87CisgICAgICAgIHBCbG9jay0+bV9wTWV0YWRhdGEtPkNhbGNBbGxvY2F0aW9uU3RhdEluZm8oYWxsb2NhdGlvblN0YXRJbmZvKTsKKyAgICAgICAgVm1hQWRkU3RhdEluZm8ocFN0YXRzLT50b3RhbCwgYWxsb2NhdGlvblN0YXRJbmZvKTsKKyAgICAgICAgVm1hQWRkU3RhdEluZm8ocFN0YXRzLT5tZW1vcnlUeXBlW21lbVR5cGVJbmRleF0sIGFsbG9jYXRpb25TdGF0SW5mbyk7CisgICAgICAgIFZtYUFkZFN0YXRJbmZvKHBTdGF0cy0+bWVtb3J5SGVhcFttZW1IZWFwSW5kZXhdLCBhbGxvY2F0aW9uU3RhdEluZm8pOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9HZW5lcmljIG1lbWJlcnMgZGVmaW5pdGlvbgorCitWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fR2VuZXJpYzo6Vm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0dlbmVyaWMoCisgICAgVm1hQWxsb2NhdG9yIGhBbGxvY2F0b3IsCisgICAgVm1hQmxvY2tWZWN0b3IqIHBCbG9ja1ZlY3RvciwKKyAgICB1aW50MzJfdCBjdXJyZW50RnJhbWVJbmRleCwKKyAgICBib29sIG92ZXJsYXBwaW5nTW92ZVN1cHBvcnRlZCkgOgorICAgIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobShoQWxsb2NhdG9yLCBwQmxvY2tWZWN0b3IsIGN1cnJlbnRGcmFtZUluZGV4KSwKKyAgICBtX0FsbG9jYXRpb25Db3VudCgwKSwKKyAgICBtX0FsbEFsbG9jYXRpb25zKGZhbHNlKSwKKyAgICBtX0J5dGVzTW92ZWQoMCksCisgICAgbV9BbGxvY2F0aW9uc01vdmVkKDApLAorICAgIG1fQmxvY2tzKFZtYVN0bEFsbG9jYXRvcjxCbG9ja0luZm8qPihoQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKQoreworICAgIC8vIENyZWF0ZSBibG9jayBpbmZvIGZvciBlYWNoIGJsb2NrLgorICAgIGNvbnN0IHNpemVfdCBibG9ja0NvdW50ID0gbV9wQmxvY2tWZWN0b3ItPm1fQmxvY2tzLnNpemUoKTsKKyAgICBmb3Ioc2l6ZV90IGJsb2NrSW5kZXggPSAwOyBibG9ja0luZGV4IDwgYmxvY2tDb3VudDsgKytibG9ja0luZGV4KQorICAgIHsKKyAgICAgICAgQmxvY2tJbmZvKiBwQmxvY2tJbmZvID0gdm1hX25ldyhtX2hBbGxvY2F0b3IsIEJsb2NrSW5mbykobV9oQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpOworICAgICAgICBwQmxvY2tJbmZvLT5tX09yaWdpbmFsQmxvY2tJbmRleCA9IGJsb2NrSW5kZXg7CisgICAgICAgIHBCbG9ja0luZm8tPm1fcEJsb2NrID0gbV9wQmxvY2tWZWN0b3ItPm1fQmxvY2tzW2Jsb2NrSW5kZXhdOworICAgICAgICBtX0Jsb2Nrcy5wdXNoX2JhY2socEJsb2NrSW5mbyk7CisgICAgfQorCisgICAgLy8gU29ydCB0aGVtIGJ5IG1fcEJsb2NrIHBvaW50ZXIgdmFsdWUuCisgICAgVk1BX1NPUlQobV9CbG9ja3MuYmVnaW4oKSwgbV9CbG9ja3MuZW5kKCksIEJsb2NrUG9pbnRlckxlc3MoKSk7Cit9CisKK1ZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9HZW5lcmljOjp+Vm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0dlbmVyaWMoKQoreworICAgIGZvcihzaXplX3QgaSA9IG1fQmxvY2tzLnNpemUoKTsgaS0tOyApCisgICAgeworICAgICAgICB2bWFfZGVsZXRlKG1faEFsbG9jYXRvciwgbV9CbG9ja3NbaV0pOworICAgIH0KK30KKwordm9pZCBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fR2VuZXJpYzo6QWRkQWxsb2NhdGlvbihWbWFBbGxvY2F0aW9uIGhBbGxvYywgVmtCb29sMzIqIHBDaGFuZ2VkKQoreworICAgIC8vIE5vdyBhcyB3ZSBhcmUgaW5zaWRlIFZtYUJsb2NrVmVjdG9yOjptX011dGV4LCB3ZSBjYW4gbWFrZSBmaW5hbCBjaGVjayBpZiB0aGlzIGFsbG9jYXRpb24gd2FzIG5vdCBsb3N0LgorICAgIGlmKGhBbGxvYy0+R2V0TGFzdFVzZUZyYW1lSW5kZXgoKSAhPSBWTUFfRlJBTUVfSU5ERVhfTE9TVCkKKyAgICB7CisgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBwQmxvY2sgPSBoQWxsb2MtPkdldEJsb2NrKCk7CisgICAgICAgIEJsb2NrSW5mb1ZlY3Rvcjo6aXRlcmF0b3IgaXQgPSBWbWFCaW5hcnlGaW5kRmlyc3ROb3RMZXNzKG1fQmxvY2tzLmJlZ2luKCksIG1fQmxvY2tzLmVuZCgpLCBwQmxvY2ssIEJsb2NrUG9pbnRlckxlc3MoKSk7CisgICAgICAgIGlmKGl0ICE9IG1fQmxvY2tzLmVuZCgpICYmICgqaXQpLT5tX3BCbG9jayA9PSBwQmxvY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsbG9jYXRpb25JbmZvIGFsbG9jSW5mbyA9IEFsbG9jYXRpb25JbmZvKGhBbGxvYywgcENoYW5nZWQpOworICAgICAgICAgICAgKCppdCktPm1fQWxsb2NhdGlvbnMucHVzaF9iYWNrKGFsbG9jSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWTUFfQVNTRVJUKDApOworICAgICAgICB9CisKKyAgICAgICAgKyttX0FsbG9jYXRpb25Db3VudDsKKyAgICB9Cit9CisKK1ZrUmVzdWx0IFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9HZW5lcmljOjpEZWZyYWdtZW50Um91bmQoCisgICAgVm1hVmVjdG9yPCBWbWFEZWZyYWdtZW50YXRpb25Nb3ZlLCBWbWFTdGxBbGxvY2F0b3I8Vm1hRGVmcmFnbWVudGF0aW9uTW92ZT4gPiYgbW92ZXMsCisgICAgVmtEZXZpY2VTaXplIG1heEJ5dGVzVG9Nb3ZlLAorICAgIHVpbnQzMl90IG1heEFsbG9jYXRpb25zVG9Nb3ZlKQoreworICAgIGlmKG1fQmxvY2tzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGEgY2hvaWNlIGJhc2VkIG9uIHJlc2VhcmNoLgorICAgIC8vIE9wdGlvbiAxOgorICAgIHVpbnQzMl90IHN0cmF0ZWd5ID0gVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZX01JTl9USU1FX0JJVDsKKyAgICAvLyBPcHRpb24gMjoKKyAgICAvL3VpbnQzMl90IHN0cmF0ZWd5ID0gVk1BX0FMTE9DQVRJT05fQ1JFQVRFX1NUUkFURUdZX01JTl9NRU1PUllfQklUOworICAgIC8vIE9wdGlvbiAzOgorICAgIC8vdWludDMyX3Qgc3RyYXRlZ3kgPSBWTUFfQUxMT0NBVElPTl9DUkVBVEVfU1RSQVRFR1lfTUlOX0ZSQUdNRU5UQVRJT05fQklUOworCisgICAgc2l6ZV90IHNyY0Jsb2NrTWluSW5kZXggPSAwOworICAgIC8vIFdoZW4gRkFTVF9BTEdPUklUSE0sIG1vdmUgYWxsb2NhdGlvbnMgZnJvbSBvbmx5IGxhc3Qgb3V0IG9mIGJsb2NrcyB0aGF0IGNvbnRhaW4gbm9uLW1vdmFibGUgYWxsb2NhdGlvbnMuCisgICAgLyoKKyAgICBpZihtX0FsZ29yaXRobUZsYWdzICYgVk1BX0RFRlJBR01FTlRBVElPTl9GQVNUX0FMR09SSVRITV9CSVQpCisgICAgeworICAgICAgICBjb25zdCBzaXplX3QgYmxvY2tzV2l0aE5vbk1vdmFibGVDb3VudCA9IENhbGNCbG9ja3NXaXRoTm9uTW92YWJsZUNvdW50KCk7CisgICAgICAgIGlmKGJsb2Nrc1dpdGhOb25Nb3ZhYmxlQ291bnQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzcmNCbG9ja01pbkluZGV4ID0gYmxvY2tzV2l0aE5vbk1vdmFibGVDb3VudCAtIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgKi8KKworICAgIHNpemVfdCBzcmNCbG9ja0luZGV4ID0gbV9CbG9ja3Muc2l6ZSgpIC0gMTsKKyAgICBzaXplX3Qgc3JjQWxsb2NJbmRleCA9IFNJWkVfTUFYOworICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIC8vIDEuIEZpbmQgbmV4dCBhbGxvY2F0aW9uIHRvIG1vdmUuCisgICAgICAgIC8vIDEuMS4gU3RhcnQgZnJvbSBsYXN0IHRvIGZpcnN0IG1fQmxvY2tzIC0gdGhleSBhcmUgc29ydGVkIGZyb20gbW9zdCAiZGVzdGluYXRpb24iIHRvIG1vc3QgInNvdXJjZSIuCisgICAgICAgIC8vIDEuMi4gVGhlbiBzdGFydCBmcm9tIGxhc3QgdG8gZmlyc3QgbV9BbGxvY2F0aW9ucy4KKyAgICAgICAgd2hpbGUoc3JjQWxsb2NJbmRleCA+PSBtX0Jsb2Nrc1tzcmNCbG9ja0luZGV4XS0+bV9BbGxvY2F0aW9ucy5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1fQmxvY2tzW3NyY0Jsb2NrSW5kZXhdLT5tX0FsbG9jYXRpb25zLmVtcHR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRmluaXNoZWQ6IG5vIG1vcmUgYWxsb2NhdGlvbnMgdG8gcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICBpZihzcmNCbG9ja0luZGV4ID09IHNyY0Jsb2NrTWluSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLS1zcmNCbG9ja0luZGV4OworICAgICAgICAgICAgICAgICAgICBzcmNBbGxvY0luZGV4ID0gU0laRV9NQVg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNyY0FsbG9jSW5kZXggPSBtX0Jsb2Nrc1tzcmNCbG9ja0luZGV4XS0+bV9BbGxvY2F0aW9ucy5zaXplKCkgLSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBCbG9ja0luZm8qIHBTcmNCbG9ja0luZm8gPSBtX0Jsb2Nrc1tzcmNCbG9ja0luZGV4XTsKKyAgICAgICAgQWxsb2NhdGlvbkluZm8mIGFsbG9jSW5mbyA9IHBTcmNCbG9ja0luZm8tPm1fQWxsb2NhdGlvbnNbc3JjQWxsb2NJbmRleF07CisKKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHNpemUgPSBhbGxvY0luZm8ubV9oQWxsb2NhdGlvbi0+R2V0U2l6ZSgpOworICAgICAgICBjb25zdCBWa0RldmljZVNpemUgc3JjT2Zmc2V0ID0gYWxsb2NJbmZvLm1faEFsbG9jYXRpb24tPkdldE9mZnNldCgpOworICAgICAgICBjb25zdCBWa0RldmljZVNpemUgYWxpZ25tZW50ID0gYWxsb2NJbmZvLm1faEFsbG9jYXRpb24tPkdldEFsaWdubWVudCgpOworICAgICAgICBjb25zdCBWbWFTdWJhbGxvY2F0aW9uVHlwZSBzdWJhbGxvY1R5cGUgPSBhbGxvY0luZm8ubV9oQWxsb2NhdGlvbi0+R2V0U3ViYWxsb2NhdGlvblR5cGUoKTsKKworICAgICAgICAvLyAyLiBUcnkgdG8gZmluZCBuZXcgcGxhY2UgZm9yIHRoaXMgYWxsb2NhdGlvbiBpbiBwcmVjZWRpbmcgb3IgY3VycmVudCBibG9jay4KKyAgICAgICAgZm9yKHNpemVfdCBkc3RCbG9ja0luZGV4ID0gMDsgZHN0QmxvY2tJbmRleCA8PSBzcmNCbG9ja0luZGV4OyArK2RzdEJsb2NrSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJsb2NrSW5mbyogcERzdEJsb2NrSW5mbyA9IG1fQmxvY2tzW2RzdEJsb2NrSW5kZXhdOworICAgICAgICAgICAgVm1hQWxsb2NhdGlvblJlcXVlc3QgZHN0QWxsb2NSZXF1ZXN0OworICAgICAgICAgICAgaWYocERzdEJsb2NrSW5mby0+bV9wQmxvY2stPm1fcE1ldGFkYXRhLT5DcmVhdGVBbGxvY2F0aW9uUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBtX0N1cnJlbnRGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgIG1fcEJsb2NrVmVjdG9yLT5HZXRGcmFtZUluVXNlQ291bnQoKSwKKyAgICAgICAgICAgICAgICBtX3BCbG9ja1ZlY3Rvci0+R2V0QnVmZmVySW1hZ2VHcmFudWxhcml0eSgpLAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgIGZhbHNlLCAvLyB1cHBlckFkZHJlc3MKKyAgICAgICAgICAgICAgICBzdWJhbGxvY1R5cGUsCisgICAgICAgICAgICAgICAgZmFsc2UsIC8vIGNhbk1ha2VPdGhlckxvc3QKKyAgICAgICAgICAgICAgICBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAmZHN0QWxsb2NSZXF1ZXN0KSAmJgorICAgICAgICAgICAgTW92ZU1ha2VzU2Vuc2UoCisgICAgICAgICAgICAgICAgZHN0QmxvY2tJbmRleCwgZHN0QWxsb2NSZXF1ZXN0Lm9mZnNldCwgc3JjQmxvY2tJbmRleCwgc3JjT2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKGRzdEFsbG9jUmVxdWVzdC5pdGVtc1RvTWFrZUxvc3RDb3VudCA9PSAwKTsKKworICAgICAgICAgICAgICAgIC8vIFJlYWNoZWQgbGltaXQgb24gbnVtYmVyIG9mIGFsbG9jYXRpb25zIG9yIGJ5dGVzIHRvIG1vdmUuCisgICAgICAgICAgICAgICAgaWYoKG1fQWxsb2NhdGlvbnNNb3ZlZCArIDEgPiBtYXhBbGxvY2F0aW9uc1RvTW92ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1fQnl0ZXNNb3ZlZCArIHNpemUgPiBtYXhCeXRlc1RvTW92ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBWbWFEZWZyYWdtZW50YXRpb25Nb3ZlIG1vdmU7CisgICAgICAgICAgICAgICAgbW92ZS5zcmNCbG9ja0luZGV4ID0gcFNyY0Jsb2NrSW5mby0+bV9PcmlnaW5hbEJsb2NrSW5kZXg7CisgICAgICAgICAgICAgICAgbW92ZS5kc3RCbG9ja0luZGV4ID0gcERzdEJsb2NrSW5mby0+bV9PcmlnaW5hbEJsb2NrSW5kZXg7CisgICAgICAgICAgICAgICAgbW92ZS5zcmNPZmZzZXQgPSBzcmNPZmZzZXQ7CisgICAgICAgICAgICAgICAgbW92ZS5kc3RPZmZzZXQgPSBkc3RBbGxvY1JlcXVlc3Qub2Zmc2V0OworICAgICAgICAgICAgICAgIG1vdmUuc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgbW92ZXMucHVzaF9iYWNrKG1vdmUpOworCisgICAgICAgICAgICAgICAgcERzdEJsb2NrSW5mby0+bV9wQmxvY2stPm1fcE1ldGFkYXRhLT5BbGxvYygKKyAgICAgICAgICAgICAgICAgICAgZHN0QWxsb2NSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICBzdWJhbGxvY1R5cGUsCisgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyB1cHBlckFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NJbmZvLm1faEFsbG9jYXRpb24pOworICAgICAgICAgICAgICAgIHBTcmNCbG9ja0luZm8tPm1fcEJsb2NrLT5tX3BNZXRhZGF0YS0+RnJlZUF0T2Zmc2V0KHNyY09mZnNldCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYWxsb2NJbmZvLm1faEFsbG9jYXRpb24tPkNoYW5nZUJsb2NrQWxsb2NhdGlvbihtX2hBbGxvY2F0b3IsIHBEc3RCbG9ja0luZm8tPm1fcEJsb2NrLCBkc3RBbGxvY1JlcXVlc3Qub2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGlmKGFsbG9jSW5mby5tX3BDaGFuZ2VkICE9IFZNQV9OVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKmFsbG9jSW5mby5tX3BDaGFuZ2VkID0gVktfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK21fQWxsb2NhdGlvbnNNb3ZlZDsKKyAgICAgICAgICAgICAgICBtX0J5dGVzTW92ZWQgKz0gc2l6ZTsKKworICAgICAgICAgICAgICAgIFZtYVZlY3RvclJlbW92ZShwU3JjQmxvY2tJbmZvLT5tX0FsbG9jYXRpb25zLCBzcmNBbGxvY0luZGV4KTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgbm90IHByb2Nlc3NlZCwgdGhpcyBhbGxvY0luZm8gcmVtYWlucyBpbiBwQmxvY2tJbmZvLT5tX0FsbG9jYXRpb25zIGZvciBuZXh0IHJvdW5kLgorCisgICAgICAgIGlmKHNyY0FsbG9jSW5kZXggPiAwKQorICAgICAgICB7CisgICAgICAgICAgICAtLXNyY0FsbG9jSW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihzcmNCbG9ja0luZGV4ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLXNyY0Jsb2NrSW5kZXg7CisgICAgICAgICAgICAgICAgc3JjQWxsb2NJbmRleCA9IFNJWkVfTUFYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzaXplX3QgVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0dlbmVyaWM6OkNhbGNCbG9ja3NXaXRoTm9uTW92YWJsZUNvdW50KCkgY29uc3QKK3sKKyAgICBzaXplX3QgcmVzdWx0ID0gMDsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbV9CbG9ja3Muc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgICBpZihtX0Jsb2Nrc1tpXS0+bV9IYXNOb25Nb3ZhYmxlQWxsb2NhdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9HZW5lcmljOjpEZWZyYWdtZW50KAorICAgIFZtYVZlY3RvcjwgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSwgVm1hU3RsQWxsb2NhdG9yPFZtYURlZnJhZ21lbnRhdGlvbk1vdmU+ID4mIG1vdmVzLAorICAgIFZrRGV2aWNlU2l6ZSBtYXhCeXRlc1RvTW92ZSwKKyAgICB1aW50MzJfdCBtYXhBbGxvY2F0aW9uc1RvTW92ZSkKK3sKKyAgICBpZighbV9BbGxBbGxvY2F0aW9ucyAmJiBtX0FsbG9jYXRpb25Db3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IGJsb2NrQ291bnQgPSBtX0Jsb2Nrcy5zaXplKCk7CisgICAgZm9yKHNpemVfdCBibG9ja0luZGV4ID0gMDsgYmxvY2tJbmRleCA8IGJsb2NrQ291bnQ7ICsrYmxvY2tJbmRleCkKKyAgICB7CisgICAgICAgIEJsb2NrSW5mbyogcEJsb2NrSW5mbyA9IG1fQmxvY2tzW2Jsb2NrSW5kZXhdOworCisgICAgICAgIGlmKG1fQWxsQWxsb2NhdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYyogcE1ldGFkYXRhID0gKFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYyopcEJsb2NrSW5mby0+bV9wQmxvY2stPm1fcE1ldGFkYXRhOworICAgICAgICAgICAgZm9yKFZtYVN1YmFsbG9jYXRpb25MaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IHBNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IHBNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICArK2l0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGl0LT50eXBlICE9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb25JbmZvIGFsbG9jSW5mbyA9IEFsbG9jYXRpb25JbmZvKGl0LT5oQWxsb2NhdGlvbiwgVk1BX05VTEwpOworICAgICAgICAgICAgICAgICAgICBwQmxvY2tJbmZvLT5tX0FsbG9jYXRpb25zLnB1c2hfYmFjayhhbGxvY0luZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCbG9ja0luZm8tPkNhbGNIYXNOb25Nb3ZhYmxlQWxsb2NhdGlvbnMoKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoaXMgaXMgYSBjaG9pY2UgYmFzZWQgb24gcmVzZWFyY2guCisgICAgICAgIC8vIE9wdGlvbiAxOgorICAgICAgICBwQmxvY2tJbmZvLT5Tb3J0QWxsb2NhdGlvbnNCeU9mZnNldERlc2NlbmRpbmcoKTsKKyAgICAgICAgLy8gT3B0aW9uIDI6CisgICAgICAgIC8vcEJsb2NrSW5mby0+U29ydEFsbG9jYXRpb25zQnlTaXplRGVzY2VuZGluZygpOworICAgIH0KKworICAgIC8vIFNvcnQgbV9CbG9ja3MgdGhpcyB0aW1lIGJ5IHRoZSBtYWluIGNyaXRlcml1bSwgZnJvbSBtb3N0ICJkZXN0aW5hdGlvbiIgdG8gbW9zdCAic291cmNlIiBibG9ja3MuCisgICAgVk1BX1NPUlQobV9CbG9ja3MuYmVnaW4oKSwgbV9CbG9ja3MuZW5kKCksIEJsb2NrSW5mb0NvbXBhcmVNb3ZlRGVzdGluYXRpb24oKSk7CisKKyAgICAvLyBUaGlzIGlzIGEgY2hvaWNlIGJhc2VkIG9uIHJlc2VhcmNoLgorICAgIGNvbnN0IHVpbnQzMl90IHJvdW5kQ291bnQgPSAyOworCisgICAgLy8gRXhlY3V0ZSBkZWZyYWdtZW50YXRpb24gcm91bmRzICh0aGUgbWFpbiBwYXJ0KS4KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBWS19TVUNDRVNTOworICAgIGZvcih1aW50MzJfdCByb3VuZCA9IDA7IChyb3VuZCA8IHJvdW5kQ291bnQpICYmIChyZXN1bHQgPT0gVktfU1VDQ0VTUyk7ICsrcm91bmQpCisgICAgeworICAgICAgICByZXN1bHQgPSBEZWZyYWdtZW50Um91bmQobW92ZXMsIG1heEJ5dGVzVG9Nb3ZlLCBtYXhBbGxvY2F0aW9uc1RvTW92ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fR2VuZXJpYzo6TW92ZU1ha2VzU2Vuc2UoCisgICAgICAgIHNpemVfdCBkc3RCbG9ja0luZGV4LCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LAorICAgICAgICBzaXplX3Qgc3JjQmxvY2tJbmRleCwgVmtEZXZpY2VTaXplIHNyY09mZnNldCkKK3sKKyAgICBpZihkc3RCbG9ja0luZGV4IDwgc3JjQmxvY2tJbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZihkc3RCbG9ja0luZGV4ID4gc3JjQmxvY2tJbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYoZHN0T2Zmc2V0IDwgc3JjT2Zmc2V0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9GYXN0CisKK1ZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9GYXN0OjpWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fRmFzdCgKKyAgICBWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwKKyAgICBWbWFCbG9ja1ZlY3RvciogcEJsb2NrVmVjdG9yLAorICAgIHVpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4LAorICAgIGJvb2wgb3ZlcmxhcHBpbmdNb3ZlU3VwcG9ydGVkKSA6CisgICAgVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtKGhBbGxvY2F0b3IsIHBCbG9ja1ZlY3RvciwgY3VycmVudEZyYW1lSW5kZXgpLAorICAgIG1fT3ZlcmxhcHBpbmdNb3ZlU3VwcG9ydGVkKG92ZXJsYXBwaW5nTW92ZVN1cHBvcnRlZCksCisgICAgbV9BbGxvY2F0aW9uQ291bnQoMCksCisgICAgbV9BbGxBbGxvY2F0aW9ucyhmYWxzZSksCisgICAgbV9CeXRlc01vdmVkKDApLAorICAgIG1fQWxsb2NhdGlvbnNNb3ZlZCgwKSwKKyAgICBtX0Jsb2NrSW5mb3MoVm1hU3RsQWxsb2NhdG9yPEJsb2NrSW5mbz4oaEFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpKSkKK3sKKyAgICBWTUFfQVNTRVJUKFZNQV9ERUJVR19NQVJHSU4gPT0gMCk7CisKK30KKworVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0Zhc3Q6On5WbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fRmFzdCgpCit7Cit9CisKK1ZrUmVzdWx0IFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9GYXN0OjpEZWZyYWdtZW50KAorICAgIFZtYVZlY3RvcjwgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSwgVm1hU3RsQWxsb2NhdG9yPFZtYURlZnJhZ21lbnRhdGlvbk1vdmU+ID4mIG1vdmVzLAorICAgIFZrRGV2aWNlU2l6ZSBtYXhCeXRlc1RvTW92ZSwKKyAgICB1aW50MzJfdCBtYXhBbGxvY2F0aW9uc1RvTW92ZSkKK3sKKyAgICBWTUFfQVNTRVJUKG1fQWxsQWxsb2NhdGlvbnMgfHwgbV9wQmxvY2tWZWN0b3ItPkNhbGNBbGxvY2F0aW9uQ291bnQoKSA9PSBtX0FsbG9jYXRpb25Db3VudCk7CisKKyAgICBjb25zdCBzaXplX3QgYmxvY2tDb3VudCA9IG1fcEJsb2NrVmVjdG9yLT5HZXRCbG9ja0NvdW50KCk7CisgICAgaWYoYmxvY2tDb3VudCA9PSAwIHx8IG1heEJ5dGVzVG9Nb3ZlID09IDAgfHwgbWF4QWxsb2NhdGlvbnNUb01vdmUgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIFByZXByb2Nlc3NNZXRhZGF0YSgpOworCisgICAgLy8gU29ydCBibG9ja3MgaW4gb3JkZXIgZnJvbSBtb3N0IGRlc3RpbmF0aW9uLgorCisgICAgbV9CbG9ja0luZm9zLnJlc2l6ZShibG9ja0NvdW50KTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgYmxvY2tDb3VudDsgKytpKQorICAgIHsKKyAgICAgICAgbV9CbG9ja0luZm9zW2ldLm9yaWdCbG9ja0luZGV4ID0gaTsKKyAgICB9CisKKyAgICBWTUFfU09SVChtX0Jsb2NrSW5mb3MuYmVnaW4oKSwgbV9CbG9ja0luZm9zLmVuZCgpLCBbdGhpc10oY29uc3QgQmxvY2tJbmZvJiBsaHMsIGNvbnN0IEJsb2NrSW5mbyYgcmhzKSAtPiBib29sIHsKKyAgICAgICAgcmV0dXJuIG1fcEJsb2NrVmVjdG9yLT5HZXRCbG9jayhsaHMub3JpZ0Jsb2NrSW5kZXgpLT5tX3BNZXRhZGF0YS0+R2V0U3VtRnJlZVNpemUoKSA8CisgICAgICAgICAgICBtX3BCbG9ja1ZlY3Rvci0+R2V0QmxvY2socmhzLm9yaWdCbG9ja0luZGV4KS0+bV9wTWV0YWRhdGEtPkdldFN1bUZyZWVTaXplKCk7CisgICAgfSk7CisKKyAgICAvLyBUSEUgTUFJTiBBTEdPUklUSE0KKworICAgIEZyZWVTcGFjZURhdGFiYXNlIGZyZWVTcGFjZURiOworCisgICAgc2l6ZV90IGRzdEJsb2NrSW5mb0luZGV4ID0gMDsKKyAgICBzaXplX3QgZHN0T3JpZ0Jsb2NrSW5kZXggPSBtX0Jsb2NrSW5mb3NbZHN0QmxvY2tJbmZvSW5kZXhdLm9yaWdCbG9ja0luZGV4OworICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBwRHN0QmxvY2sgPSBtX3BCbG9ja1ZlY3Rvci0+R2V0QmxvY2soZHN0T3JpZ0Jsb2NrSW5kZXgpOworICAgIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYyogcERzdE1ldGFkYXRhID0gKFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYyopcERzdEJsb2NrLT5tX3BNZXRhZGF0YTsKKyAgICBWa0RldmljZVNpemUgZHN0QmxvY2tTaXplID0gcERzdE1ldGFkYXRhLT5HZXRTaXplKCk7CisgICAgVmtEZXZpY2VTaXplIGRzdE9mZnNldCA9IDA7CisKKyAgICBib29sIGVuZCA9IGZhbHNlOworICAgIGZvcihzaXplX3Qgc3JjQmxvY2tJbmZvSW5kZXggPSAwOyAhZW5kICYmIHNyY0Jsb2NrSW5mb0luZGV4IDwgYmxvY2tDb3VudDsgKytzcmNCbG9ja0luZm9JbmRleCkKKyAgICB7CisgICAgICAgIGNvbnN0IHNpemVfdCBzcmNPcmlnQmxvY2tJbmRleCA9IG1fQmxvY2tJbmZvc1tzcmNCbG9ja0luZm9JbmRleF0ub3JpZ0Jsb2NrSW5kZXg7CisgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBjb25zdCBwU3JjQmxvY2sgPSBtX3BCbG9ja1ZlY3Rvci0+R2V0QmxvY2soc3JjT3JpZ0Jsb2NrSW5kZXgpOworICAgICAgICBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMqIGNvbnN0IHBTcmNNZXRhZGF0YSA9IChWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMqKXBTcmNCbG9jay0+bV9wTWV0YWRhdGE7CisgICAgICAgIGZvcihWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3Igc3JjU3ViYWxsb2NJdCA9IHBTcmNNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5iZWdpbigpOworICAgICAgICAgICAgIWVuZCAmJiBzcmNTdWJhbGxvY0l0ICE9IHBTcmNNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5lbmQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBWbWFBbGxvY2F0aW9uX1QqIGNvbnN0IHBBbGxvYyA9IHNyY1N1YmFsbG9jSXQtPmhBbGxvY2F0aW9uOworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIHNyY0FsbG9jQWxpZ25tZW50ID0gcEFsbG9jLT5HZXRBbGlnbm1lbnQoKTsKKyAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBzcmNBbGxvY1NpemUgPSBzcmNTdWJhbGxvY0l0LT5zaXplOworICAgICAgICAgICAgaWYobV9BbGxvY2F0aW9uc01vdmVkID09IG1heEFsbG9jYXRpb25zVG9Nb3ZlIHx8CisgICAgICAgICAgICAgICAgbV9CeXRlc01vdmVkICsgc3JjQWxsb2NTaXplID4gbWF4Qnl0ZXNUb01vdmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBzcmNBbGxvY09mZnNldCA9IHNyY1N1YmFsbG9jSXQtPm9mZnNldDsKKworICAgICAgICAgICAgLy8gVHJ5IHRvIHBsYWNlIGl0IGluIG9uZSBvZiBmcmVlIHNwYWNlcyBmcm9tIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgICAgIHNpemVfdCBmcmVlU3BhY2VJbmZvSW5kZXg7CisgICAgICAgICAgICBWa0RldmljZVNpemUgZHN0QWxsb2NPZmZzZXQ7CisgICAgICAgICAgICBpZihmcmVlU3BhY2VEYi5GZXRjaChzcmNBbGxvY0FsaWdubWVudCwgc3JjQWxsb2NTaXplLAorICAgICAgICAgICAgICAgIGZyZWVTcGFjZUluZm9JbmRleCwgZHN0QWxsb2NPZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemVfdCBmcmVlU3BhY2VPcmlnQmxvY2tJbmRleCA9IG1fQmxvY2tJbmZvc1tmcmVlU3BhY2VJbmZvSW5kZXhdLm9yaWdCbG9ja0luZGV4OworICAgICAgICAgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBwRnJlZVNwYWNlQmxvY2sgPSBtX3BCbG9ja1ZlY3Rvci0+R2V0QmxvY2soZnJlZVNwYWNlT3JpZ0Jsb2NrSW5kZXgpOworICAgICAgICAgICAgICAgIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYyogcEZyZWVTcGFjZU1ldGFkYXRhID0gKFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYyopcEZyZWVTcGFjZUJsb2NrLT5tX3BNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgZnJlZVNwYWNlQmxvY2tTaXplID0gcEZyZWVTcGFjZU1ldGFkYXRhLT5HZXRTaXplKCk7CisKKyAgICAgICAgICAgICAgICAvLyBTYW1lIGJsb2NrCisgICAgICAgICAgICAgICAgaWYoZnJlZVNwYWNlSW5mb0luZGV4ID09IHNyY0Jsb2NrSW5mb0luZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVk1BX0FTU0VSVChkc3RBbGxvY09mZnNldCA8PSBzcmNBbGxvY09mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTU9WRSBPUFRJT04gMTogTW92ZSB0aGUgYWxsb2NhdGlvbiBpbnNpZGUgdGhlIHNhbWUgYmxvY2sgYnkgZGVjcmVhc2luZyBvZmZzZXQuCisKKyAgICAgICAgICAgICAgICAgICAgVm1hU3ViYWxsb2NhdGlvbiBzdWJhbGxvYyA9ICpzcmNTdWJhbGxvY0l0OworICAgICAgICAgICAgICAgICAgICBzdWJhbGxvYy5vZmZzZXQgPSBkc3RBbGxvY09mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2MuaEFsbG9jYXRpb24tPkNoYW5nZU9mZnNldChkc3RBbGxvY09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIG1fQnl0ZXNNb3ZlZCArPSBzcmNBbGxvY1NpemU7CisgICAgICAgICAgICAgICAgICAgICsrbV9BbGxvY2F0aW9uc01vdmVkOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIG5leHRTdWJhbGxvY0l0ID0gc3JjU3ViYWxsb2NJdDsKKyAgICAgICAgICAgICAgICAgICAgKytuZXh0U3ViYWxsb2NJdDsKKyAgICAgICAgICAgICAgICAgICAgcFNyY01ldGFkYXRhLT5tX1N1YmFsbG9jYXRpb25zLmVyYXNlKHNyY1N1YmFsbG9jSXQpOworICAgICAgICAgICAgICAgICAgICBzcmNTdWJhbGxvY0l0ID0gbmV4dFN1YmFsbG9jSXQ7CisKKyAgICAgICAgICAgICAgICAgICAgSW5zZXJ0U3ViYWxsb2MocEZyZWVTcGFjZU1ldGFkYXRhLCBzdWJhbGxvYyk7CisKKyAgICAgICAgICAgICAgICAgICAgVm1hRGVmcmFnbWVudGF0aW9uTW92ZSBtb3ZlID0geworICAgICAgICAgICAgICAgICAgICAgICAgc3JjT3JpZ0Jsb2NrSW5kZXgsIGZyZWVTcGFjZU9yaWdCbG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjQWxsb2NPZmZzZXQsIGRzdEFsbG9jT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjQWxsb2NTaXplIH07CisgICAgICAgICAgICAgICAgICAgIG1vdmVzLnB1c2hfYmFjayhtb3ZlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTU9WRSBPUFRJT04gMjogTW92ZSB0aGUgYWxsb2NhdGlvbiB0byBhIGRpZmZlcmVudCBibG9jay4KKworICAgICAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKGZyZWVTcGFjZUluZm9JbmRleCA8IHNyY0Jsb2NrSW5mb0luZGV4KTsKKworICAgICAgICAgICAgICAgICAgICBWbWFTdWJhbGxvY2F0aW9uIHN1YmFsbG9jID0gKnNyY1N1YmFsbG9jSXQ7CisgICAgICAgICAgICAgICAgICAgIHN1YmFsbG9jLm9mZnNldCA9IGRzdEFsbG9jT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzdWJhbGxvYy5oQWxsb2NhdGlvbi0+Q2hhbmdlQmxvY2tBbGxvY2F0aW9uKG1faEFsbG9jYXRvciwgcEZyZWVTcGFjZUJsb2NrLCBkc3RBbGxvY09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIG1fQnl0ZXNNb3ZlZCArPSBzcmNBbGxvY1NpemU7CisgICAgICAgICAgICAgICAgICAgICsrbV9BbGxvY2F0aW9uc01vdmVkOworCisgICAgICAgICAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBuZXh0U3ViYWxsb2NJdCA9IHNyY1N1YmFsbG9jSXQ7CisgICAgICAgICAgICAgICAgICAgICsrbmV4dFN1YmFsbG9jSXQ7CisgICAgICAgICAgICAgICAgICAgIHBTcmNNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5lcmFzZShzcmNTdWJhbGxvY0l0KTsKKyAgICAgICAgICAgICAgICAgICAgc3JjU3ViYWxsb2NJdCA9IG5leHRTdWJhbGxvY0l0OworCisgICAgICAgICAgICAgICAgICAgIEluc2VydFN1YmFsbG9jKHBGcmVlU3BhY2VNZXRhZGF0YSwgc3ViYWxsb2MpOworCisgICAgICAgICAgICAgICAgICAgIFZtYURlZnJhZ21lbnRhdGlvbk1vdmUgbW92ZSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY09yaWdCbG9ja0luZGV4LCBmcmVlU3BhY2VPcmlnQmxvY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY0FsbG9jT2Zmc2V0LCBkc3RBbGxvY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY0FsbG9jU2l6ZSB9OworICAgICAgICAgICAgICAgICAgICBtb3Zlcy5wdXNoX2JhY2sobW92ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdEFsbG9jT2Zmc2V0ID0gVm1hQWxpZ25VcChkc3RPZmZzZXQsIHNyY0FsbG9jQWxpZ25tZW50KTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbGxvY2F0aW9uIGRvZXNuJ3QgZml0IGJlZm9yZSB0aGUgZW5kIG9mIGRzdEJsb2NrLCBmb3J3YXJkIHRvIG5leHQgYmxvY2suCisgICAgICAgICAgICAgICAgd2hpbGUoZHN0QmxvY2tJbmZvSW5kZXggPCBzcmNCbG9ja0luZm9JbmRleCAmJgorICAgICAgICAgICAgICAgICAgICBkc3RBbGxvY09mZnNldCArIHNyY0FsbG9jU2l6ZSA+IGRzdEJsb2NrU2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBiZWZvcmUgdGhhdCwgcmVnaXN0ZXIgcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiBkc3QgYmxvY2suCisgICAgICAgICAgICAgICAgICAgIGZyZWVTcGFjZURiLlJlZ2lzdGVyKGRzdEJsb2NrSW5mb0luZGV4LCBkc3RPZmZzZXQsIGRzdEJsb2NrU2l6ZSAtIGRzdE9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgKytkc3RCbG9ja0luZm9JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgZHN0T3JpZ0Jsb2NrSW5kZXggPSBtX0Jsb2NrSW5mb3NbZHN0QmxvY2tJbmZvSW5kZXhdLm9yaWdCbG9ja0luZGV4OworICAgICAgICAgICAgICAgICAgICBwRHN0QmxvY2sgPSBtX3BCbG9ja1ZlY3Rvci0+R2V0QmxvY2soZHN0T3JpZ0Jsb2NrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBwRHN0TWV0YWRhdGEgPSAoVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljKilwRHN0QmxvY2stPm1fcE1ldGFkYXRhOworICAgICAgICAgICAgICAgICAgICBkc3RCbG9ja1NpemUgPSBwRHN0TWV0YWRhdGEtPkdldFNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZHN0QWxsb2NPZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFNhbWUgYmxvY2sKKyAgICAgICAgICAgICAgICBpZihkc3RCbG9ja0luZm9JbmRleCA9PSBzcmNCbG9ja0luZm9JbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZNQV9BU1NFUlQoZHN0QWxsb2NPZmZzZXQgPD0gc3JjQWxsb2NPZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgb3ZlcmxhcCA9IGRzdEFsbG9jT2Zmc2V0ICsgc3JjQWxsb2NTaXplID4gc3JjQWxsb2NPZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwT3ZlciA9IG92ZXJsYXA7CisgICAgICAgICAgICAgICAgICAgIGlmKG92ZXJsYXAgJiYgbV9PdmVybGFwcGluZ01vdmVTdXBwb3J0ZWQgJiYgZHN0QWxsb2NPZmZzZXQgPCBzcmNBbGxvY09mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBwbGFjZSBvdmVybGFwLCBza2lwIGlmIGl0IHdvdWxkIG1vdmUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IG9ubHkgPCAxLzY0IG9mIGl0cyBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcE92ZXIgPSAoc3JjQWxsb2NPZmZzZXQgLSBkc3RBbGxvY09mZnNldCkgKiA2NCA8IHNyY0FsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKHNraXBPdmVyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlU3BhY2VEYi5SZWdpc3Rlcihkc3RCbG9ja0luZm9JbmRleCwgZHN0T2Zmc2V0LCBzcmNBbGxvY09mZnNldCAtIGRzdE9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCA9IHNyY0FsbG9jT2Zmc2V0ICsgc3JjQWxsb2NTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgKytzcmNTdWJhbGxvY0l0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIE1PVkUgT1BUSU9OIDE6IE1vdmUgdGhlIGFsbG9jYXRpb24gaW5zaWRlIHRoZSBzYW1lIGJsb2NrIGJ5IGRlY3JlYXNpbmcgb2Zmc2V0LgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N1YmFsbG9jSXQtPm9mZnNldCA9IGRzdEFsbG9jT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3ViYWxsb2NJdC0+aEFsbG9jYXRpb24tPkNoYW5nZU9mZnNldChkc3RBbGxvY09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgPSBkc3RBbGxvY09mZnNldCArIHNyY0FsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQnl0ZXNNb3ZlZCArPSBzcmNBbGxvY1NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICArK21fQWxsb2NhdGlvbnNNb3ZlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrc3JjU3ViYWxsb2NJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZtYURlZnJhZ21lbnRhdGlvbk1vdmUgbW92ZSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNPcmlnQmxvY2tJbmRleCwgZHN0T3JpZ0Jsb2NrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQWxsb2NPZmZzZXQsIGRzdEFsbG9jT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0FsbG9jU2l6ZSB9OworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZXMucHVzaF9iYWNrKG1vdmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBibG9jaworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1PVkUgT1BUSU9OIDI6IE1vdmUgdGhlIGFsbG9jYXRpb24gdG8gYSBkaWZmZXJlbnQgYmxvY2suCisKKyAgICAgICAgICAgICAgICAgICAgVk1BX0FTU0VSVChkc3RCbG9ja0luZm9JbmRleCA8IHNyY0Jsb2NrSW5mb0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgVk1BX0FTU0VSVChkc3RBbGxvY09mZnNldCArIHNyY0FsbG9jU2l6ZSA8PSBkc3RCbG9ja1NpemUpOworCisgICAgICAgICAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb24gc3ViYWxsb2MgPSAqc3JjU3ViYWxsb2NJdDsKKyAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2Mub2Zmc2V0ID0gZHN0QWxsb2NPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHN1YmFsbG9jLmhBbGxvY2F0aW9uLT5DaGFuZ2VCbG9ja0FsbG9jYXRpb24obV9oQWxsb2NhdG9yLCBwRHN0QmxvY2ssIGRzdEFsbG9jT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ID0gZHN0QWxsb2NPZmZzZXQgKyBzcmNBbGxvY1NpemU7CisgICAgICAgICAgICAgICAgICAgIG1fQnl0ZXNNb3ZlZCArPSBzcmNBbGxvY1NpemU7CisgICAgICAgICAgICAgICAgICAgICsrbV9BbGxvY2F0aW9uc01vdmVkOworCisgICAgICAgICAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBuZXh0U3ViYWxsb2NJdCA9IHNyY1N1YmFsbG9jSXQ7CisgICAgICAgICAgICAgICAgICAgICsrbmV4dFN1YmFsbG9jSXQ7CisgICAgICAgICAgICAgICAgICAgIHBTcmNNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5lcmFzZShzcmNTdWJhbGxvY0l0KTsKKyAgICAgICAgICAgICAgICAgICAgc3JjU3ViYWxsb2NJdCA9IG5leHRTdWJhbGxvY0l0OworCisgICAgICAgICAgICAgICAgICAgIHBEc3RNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5wdXNoX2JhY2soc3ViYWxsb2MpOworCisgICAgICAgICAgICAgICAgICAgIFZtYURlZnJhZ21lbnRhdGlvbk1vdmUgbW92ZSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY09yaWdCbG9ja0luZGV4LCBkc3RPcmlnQmxvY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY0FsbG9jT2Zmc2V0LCBkc3RBbGxvY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY0FsbG9jU2l6ZSB9OworICAgICAgICAgICAgICAgICAgICBtb3Zlcy5wdXNoX2JhY2sobW92ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9CbG9ja0luZm9zLmNsZWFyKCk7CisgICAgCisgICAgUG9zdHByb2Nlc3NNZXRhZGF0YSgpOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0Zhc3Q6OlByZXByb2Nlc3NNZXRhZGF0YSgpCit7CisgICAgY29uc3Qgc2l6ZV90IGJsb2NrQ291bnQgPSBtX3BCbG9ja1ZlY3Rvci0+R2V0QmxvY2tDb3VudCgpOworICAgIGZvcihzaXplX3QgYmxvY2tJbmRleCA9IDA7IGJsb2NrSW5kZXggPCBibG9ja0NvdW50OyArK2Jsb2NrSW5kZXgpCisgICAgeworICAgICAgICBWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMqIGNvbnN0IHBNZXRhZGF0YSA9CisgICAgICAgICAgICAoVm1hQmxvY2tNZXRhZGF0YV9HZW5lcmljKiltX3BCbG9ja1ZlY3Rvci0+R2V0QmxvY2soYmxvY2tJbmRleCktPm1fcE1ldGFkYXRhOworICAgICAgICBwTWV0YWRhdGEtPm1fRnJlZUNvdW50ID0gMDsKKyAgICAgICAgcE1ldGFkYXRhLT5tX1N1bUZyZWVTaXplID0gcE1ldGFkYXRhLT5HZXRTaXplKCk7CisgICAgICAgIHBNZXRhZGF0YS0+bV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuY2xlYXIoKTsKKyAgICAgICAgZm9yKFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdCA9IHBNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gcE1ldGFkYXRhLT5tX1N1YmFsbG9jYXRpb25zLmVuZCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGl0LT50eXBlID09IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3IgbmV4dEl0ID0gaXQ7CisgICAgICAgICAgICAgICAgKytuZXh0SXQ7CisgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5tX1N1YmFsbG9jYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBpdCA9IG5leHRJdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9GYXN0OjpQb3N0cHJvY2Vzc01ldGFkYXRhKCkKK3sKKyAgICBjb25zdCBzaXplX3QgYmxvY2tDb3VudCA9IG1fcEJsb2NrVmVjdG9yLT5HZXRCbG9ja0NvdW50KCk7CisgICAgZm9yKHNpemVfdCBibG9ja0luZGV4ID0gMDsgYmxvY2tJbmRleCA8IGJsb2NrQ291bnQ7ICsrYmxvY2tJbmRleCkKKyAgICB7CisgICAgICAgIFZtYUJsb2NrTWV0YWRhdGFfR2VuZXJpYyogY29uc3QgcE1ldGFkYXRhID0KKyAgICAgICAgICAgIChWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMqKW1fcEJsb2NrVmVjdG9yLT5HZXRCbG9jayhibG9ja0luZGV4KS0+bV9wTWV0YWRhdGE7CisgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBibG9ja1NpemUgPSBwTWV0YWRhdGEtPkdldFNpemUoKTsKKyAgICAgICAgCisgICAgICAgIC8vIE5vIGFsbG9jYXRpb25zIGluIHRoaXMgYmxvY2sgLSBlbnRpcmUgYXJlYSBpcyBmcmVlLgorICAgICAgICBpZihwTWV0YWRhdGEtPm1fU3ViYWxsb2NhdGlvbnMuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcE1ldGFkYXRhLT5tX0ZyZWVDb3VudCA9IDE7CisgICAgICAgICAgICAvL3BNZXRhZGF0YS0+bV9TdW1GcmVlU2l6ZSBpcyBhbHJlYWR5IHNldCB0byBibG9ja1NpemUuCisgICAgICAgICAgICBWbWFTdWJhbGxvY2F0aW9uIHN1YmFsbG9jID0geworICAgICAgICAgICAgICAgIDAsIC8vIG9mZnNldAorICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSwgLy8gc2l6ZQorICAgICAgICAgICAgICAgIFZNQV9OVUxMLCAvLyBoQWxsb2NhdGlvbgorICAgICAgICAgICAgICAgIFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSB9OworICAgICAgICAgICAgcE1ldGFkYXRhLT5tX1N1YmFsbG9jYXRpb25zLnB1c2hfYmFjayhzdWJhbGxvYyk7CisgICAgICAgICAgICBwTWV0YWRhdGEtPlJlZ2lzdGVyRnJlZVN1YmFsbG9jYXRpb24ocE1ldGFkYXRhLT5tX1N1YmFsbG9jYXRpb25zLmJlZ2luKCkpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIGFsbG9jYXRpb25zIGluIHRoaXMgYmxvY2suCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCA9IDA7CisgICAgICAgICAgICBWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3IgaXQ7CisgICAgICAgICAgICBmb3IoaXQgPSBwTWV0YWRhdGEtPm1fU3ViYWxsb2NhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBwTWV0YWRhdGEtPm1fU3ViYWxsb2NhdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgKytpdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKGl0LT50eXBlICE9IFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSk7CisgICAgICAgICAgICAgICAgVk1BX0FTU0VSVChpdC0+b2Zmc2V0ID49IG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGluc2VydCBwcmVjZWRpbmcgZnJlZSBzcGFjZS4KKyAgICAgICAgICAgICAgICBpZihpdC0+b2Zmc2V0ID4gb2Zmc2V0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwTWV0YWRhdGEtPm1fRnJlZUNvdW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVNpemUgZnJlZVNpemUgPSBpdC0+b2Zmc2V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBWbWFTdWJhbGxvY2F0aW9uIHN1YmFsbG9jID0geworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCAvLyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVTaXplLCAvLyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBWTUFfTlVMTCwgLy8gaEFsbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfRlJFRSB9OworICAgICAgICAgICAgICAgICAgICBWbWFTdWJhbGxvY2F0aW9uTGlzdDo6aXRlcmF0b3IgcHJlY2VkaW5nRnJlZUl0ID0gcE1ldGFkYXRhLT5tX1N1YmFsbG9jYXRpb25zLmluc2VydChpdCwgc3ViYWxsb2MpOworICAgICAgICAgICAgICAgICAgICBpZihmcmVlU2l6ZSA+PSBWTUFfTUlOX0ZSRUVfU1VCQUxMT0NBVElPTl9TSVpFX1RPX1JFR0lTVEVSKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPm1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLnB1c2hfYmFjayhwcmVjZWRpbmdGcmVlSXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5tX1N1bUZyZWVTaXplIC09IGl0LT5zaXplOworICAgICAgICAgICAgICAgIG9mZnNldCA9IGl0LT5vZmZzZXQgKyBpdC0+c2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTmVlZCB0byBpbnNlcnQgdHJhaWxpbmcgZnJlZSBzcGFjZS4KKyAgICAgICAgICAgIGlmKG9mZnNldCA8IGJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK3BNZXRhZGF0YS0+bV9GcmVlQ291bnQ7CisgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGZyZWVTaXplID0gYmxvY2tTaXplIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb24gc3ViYWxsb2MgPSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgLy8gb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIGZyZWVTaXplLCAvLyBzaXplCisgICAgICAgICAgICAgICAgICAgIFZNQV9OVUxMLCAvLyBoQWxsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX0ZSRUUgfTsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKGl0ID09IHBNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5lbmQoKSk7CisgICAgICAgICAgICAgICAgVm1hU3ViYWxsb2NhdGlvbkxpc3Q6Oml0ZXJhdG9yIHRyYWlsaW5nRnJlZUl0ID0gcE1ldGFkYXRhLT5tX1N1YmFsbG9jYXRpb25zLmluc2VydChpdCwgc3ViYWxsb2MpOworICAgICAgICAgICAgICAgIGlmKGZyZWVTaXplID4gVk1BX01JTl9GUkVFX1NVQkFMTE9DQVRJT05fU0laRV9UT19SRUdJU1RFUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YS0+bV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUucHVzaF9iYWNrKHRyYWlsaW5nRnJlZUl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZNQV9TT1JUKAorICAgICAgICAgICAgICAgIHBNZXRhZGF0YS0+bV9GcmVlU3ViYWxsb2NhdGlvbnNCeVNpemUuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPm1fRnJlZVN1YmFsbG9jYXRpb25zQnlTaXplLmVuZCgpLAorICAgICAgICAgICAgICAgIFZtYVN1YmFsbG9jYXRpb25JdGVtU2l6ZUxlc3MoKSk7CisgICAgICAgIH0KKworICAgICAgICBWTUFfSEVBVllfQVNTRVJUKHBNZXRhZGF0YS0+VmFsaWRhdGUoKSk7CisgICAgfQorfQorCit2b2lkIFZtYURlZnJhZ21lbnRhdGlvbkFsZ29yaXRobV9GYXN0OjpJbnNlcnRTdWJhbGxvYyhWbWFCbG9ja01ldGFkYXRhX0dlbmVyaWMqIHBNZXRhZGF0YSwgY29uc3QgVm1hU3ViYWxsb2NhdGlvbiYgc3ViYWxsb2MpCit7CisgICAgLy8gVE9ETzogT3B0aW1pemUgc29tZWhvdy4gUmVtZW1iZXIgaXRlcmF0b3IgaW5zdGVhZCBvZiBzZWFyY2hpbmcgZm9yIGl0IGxpbmVhcmx5LgorICAgIFZtYVN1YmFsbG9jYXRpb25MaXN0OjppdGVyYXRvciBpdCA9IHBNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5iZWdpbigpOworICAgIHdoaWxlKGl0ICE9IHBNZXRhZGF0YS0+bV9TdWJhbGxvY2F0aW9ucy5lbmQoKSkKKyAgICB7CisgICAgICAgIGlmKGl0LT5vZmZzZXQgPCBzdWJhbGxvYy5vZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcE1ldGFkYXRhLT5tX1N1YmFsbG9jYXRpb25zLmluc2VydChpdCwgc3ViYWxsb2MpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0CisKK1ZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dDo6Vm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0KAorICAgIFZtYUFsbG9jYXRvciBoQWxsb2NhdG9yLAorICAgIFZtYVBvb2wgaEN1c3RvbVBvb2wsCisgICAgVm1hQmxvY2tWZWN0b3IqIHBCbG9ja1ZlY3RvciwKKyAgICB1aW50MzJfdCBjdXJyRnJhbWVJbmRleCwKKyAgICB1aW50MzJfdCBhbGdvcml0aG1GbGFncykgOgorICAgIHJlcyhWS19TVUNDRVNTKSwKKyAgICBtdXRleExvY2tlZChmYWxzZSksCisgICAgYmxvY2tDb250ZXh0cyhWbWFTdGxBbGxvY2F0b3I8Vm1hQmxvY2tEZWZyYWdtZW50YXRpb25Db250ZXh0PihoQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKSwKKyAgICBtX2hBbGxvY2F0b3IoaEFsbG9jYXRvciksCisgICAgbV9oQ3VzdG9tUG9vbChoQ3VzdG9tUG9vbCksCisgICAgbV9wQmxvY2tWZWN0b3IocEJsb2NrVmVjdG9yKSwKKyAgICBtX0N1cnJGcmFtZUluZGV4KGN1cnJGcmFtZUluZGV4KSwKKyAgICAvL21fQWxnb3JpdGhtRmxhZ3MoYWxnb3JpdGhtRmxhZ3MpLAorICAgIG1fcEFsZ29yaXRobShWTUFfTlVMTCksCisgICAgbV9BbGxvY2F0aW9ucyhWbWFTdGxBbGxvY2F0b3I8QWxsb2NJbmZvPihoQWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKSwKKyAgICBtX0FsbEFsbG9jYXRpb25zKGZhbHNlKQoreworfQorCitWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQ6On5WbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQoKQoreworICAgIHZtYV9kZWxldGUobV9oQWxsb2NhdG9yLCBtX3BBbGdvcml0aG0pOworfQorCit2b2lkIFZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dDo6QWRkQWxsb2NhdGlvbihWbWFBbGxvY2F0aW9uIGhBbGxvYywgVmtCb29sMzIqIHBDaGFuZ2VkKQoreworICAgIEFsbG9jSW5mbyBpbmZvID0geyBoQWxsb2MsIHBDaGFuZ2VkIH07CisgICAgbV9BbGxvY2F0aW9ucy5wdXNoX2JhY2soaW5mbyk7Cit9CisKK3ZvaWQgVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0OjpCZWdpbihib29sIG92ZXJsYXBwaW5nTW92ZVN1cHBvcnRlZCkKK3sKKyAgICBjb25zdCBib29sIGFsbEFsbG9jYXRpb25zID0gbV9BbGxBbGxvY2F0aW9ucyB8fAorICAgICAgICBtX0FsbG9jYXRpb25zLnNpemUoKSA9PSBtX3BCbG9ja1ZlY3Rvci0+Q2FsY0FsbG9jYXRpb25Db3VudCgpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgSEVSRSBJUyBUSEUgQ0hPSUNFIE9GIERFRlJBR01FTlRBVElPTiBBTEdPUklUSE0uCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKgorICAgIEZhc3QgYWxnb3JpdGhtIGlzIHN1cHBvcnRlZCBvbmx5IHdoZW4gY2VydGFpbiBjcml0ZXJpYSBhcmUgbWV0OgorICAgIC0gVk1BX0RFQlVHX01BUkdJTiBpcyAwLgorICAgIC0gQWxsIGFsbG9jYXRpb25zIGluIHRoaXMgYmxvY2sgdmVjdG9yIGFyZSBtb3ZlYWJsZS4KKyAgICAtIFRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IG9mIGltYWdlL2J1ZmZlciBncmFudWxhcml0eSBjb25mbGljdC4KKyAgICAqLworICAgIGlmKFZNQV9ERUJVR19NQVJHSU4gPT0gMCAmJgorICAgICAgICBhbGxBbGxvY2F0aW9ucyAmJgorICAgICAgICAhbV9wQmxvY2tWZWN0b3ItPklzQnVmZmVySW1hZ2VHcmFudWxhcml0eUNvbmZsaWN0UG9zc2libGUoKSkKKyAgICB7CisgICAgICAgIG1fcEFsZ29yaXRobSA9IHZtYV9uZXcobV9oQWxsb2NhdG9yLCBWbWFEZWZyYWdtZW50YXRpb25BbGdvcml0aG1fRmFzdCkoCisgICAgICAgICAgICBtX2hBbGxvY2F0b3IsIG1fcEJsb2NrVmVjdG9yLCBtX0N1cnJGcmFtZUluZGV4LCBvdmVybGFwcGluZ01vdmVTdXBwb3J0ZWQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtX3BBbGdvcml0aG0gPSB2bWFfbmV3KG1faEFsbG9jYXRvciwgVm1hRGVmcmFnbWVudGF0aW9uQWxnb3JpdGhtX0dlbmVyaWMpKAorICAgICAgICAgICAgbV9oQWxsb2NhdG9yLCBtX3BCbG9ja1ZlY3RvciwgbV9DdXJyRnJhbWVJbmRleCwgb3ZlcmxhcHBpbmdNb3ZlU3VwcG9ydGVkKTsKKyAgICB9CisKKyAgICBpZihhbGxBbGxvY2F0aW9ucykKKyAgICB7CisgICAgICAgIG1fcEFsZ29yaXRobS0+QWRkQWxsKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDAsIGNvdW50ID0gbV9BbGxvY2F0aW9ucy5zaXplKCk7IGkgPCBjb3VudDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBtX3BBbGdvcml0aG0tPkFkZEFsbG9jYXRpb24obV9BbGxvY2F0aW9uc1tpXS5oQWxsb2MsIG1fQWxsb2NhdGlvbnNbaV0ucENoYW5nZWQpOworICAgICAgICB9CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dAorCitWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0X1Q6OlZtYURlZnJhZ21lbnRhdGlvbkNvbnRleHRfVCgKKyAgICBWbWFBbGxvY2F0b3IgaEFsbG9jYXRvciwKKyAgICB1aW50MzJfdCBjdXJyRnJhbWVJbmRleCwKKyAgICB1aW50MzJfdCBmbGFncywKKyAgICBWbWFEZWZyYWdtZW50YXRpb25TdGF0cyogcFN0YXRzKSA6CisgICAgbV9oQWxsb2NhdG9yKGhBbGxvY2F0b3IpLAorICAgIG1fQ3VyckZyYW1lSW5kZXgoY3VyckZyYW1lSW5kZXgpLAorICAgIG1fRmxhZ3MoZmxhZ3MpLAorICAgIG1fcFN0YXRzKHBTdGF0cyksCisgICAgbV9DdXN0b21Qb29sQ29udGV4dHMoVm1hU3RsQWxsb2NhdG9yPFZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dCo+KGhBbGxvY2F0b3ItPkdldEFsbG9jYXRpb25DYWxsYmFja3MoKSkpCit7CisgICAgbWVtc2V0KG1fRGVmYXVsdFBvb2xDb250ZXh0cywgMCwgc2l6ZW9mKG1fRGVmYXVsdFBvb2xDb250ZXh0cykpOworfQorCitWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0X1Q6On5WbWFEZWZyYWdtZW50YXRpb25Db250ZXh0X1QoKQoreworICAgIGZvcihzaXplX3QgaSA9IG1fQ3VzdG9tUG9vbENvbnRleHRzLnNpemUoKTsgaS0tOyApCisgICAgeworICAgICAgICBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQqIHBCbG9ja1ZlY3RvckN0eCA9IG1fQ3VzdG9tUG9vbENvbnRleHRzW2ldOworICAgICAgICBwQmxvY2tWZWN0b3JDdHgtPkdldEJsb2NrVmVjdG9yKCktPkRlZnJhZ21lbnRhdGlvbkVuZChwQmxvY2tWZWN0b3JDdHgsIG1fcFN0YXRzKTsKKyAgICAgICAgdm1hX2RlbGV0ZShtX2hBbGxvY2F0b3IsIHBCbG9ja1ZlY3RvckN0eCk7CisgICAgfQorICAgIGZvcihzaXplX3QgaSA9IG1faEFsbG9jYXRvci0+bV9NZW1Qcm9wcy5tZW1vcnlUeXBlQ291bnQ7IGktLTsgKQorICAgIHsKKyAgICAgICAgVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0KiBwQmxvY2tWZWN0b3JDdHggPSBtX0RlZmF1bHRQb29sQ29udGV4dHNbaV07CisgICAgICAgIGlmKHBCbG9ja1ZlY3RvckN0eCkKKyAgICAgICAgeworICAgICAgICAgICAgcEJsb2NrVmVjdG9yQ3R4LT5HZXRCbG9ja1ZlY3RvcigpLT5EZWZyYWdtZW50YXRpb25FbmQocEJsb2NrVmVjdG9yQ3R4LCBtX3BTdGF0cyk7CisgICAgICAgICAgICB2bWFfZGVsZXRlKG1faEFsbG9jYXRvciwgcEJsb2NrVmVjdG9yQ3R4KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0X1Q6OkFkZFBvb2xzKHVpbnQzMl90IHBvb2xDb3VudCwgVm1hUG9vbCogcFBvb2xzKQoreworICAgIGZvcih1aW50MzJfdCBwb29sSW5kZXggPSAwOyBwb29sSW5kZXggPCBwb29sQ291bnQ7ICsrcG9vbEluZGV4KQorICAgIHsKKyAgICAgICAgVm1hUG9vbCBwb29sID0gcFBvb2xzW3Bvb2xJbmRleF07CisgICAgICAgIFZNQV9BU1NFUlQocG9vbCk7CisgICAgICAgIC8vIFBvb2xzIHdpdGggYWxnb3JpdGhtIG90aGVyIHRoYW4gZGVmYXVsdCBhcmUgbm90IGRlZnJhZ21lbnRlZC4KKyAgICAgICAgaWYocG9vbC0+bV9CbG9ja1ZlY3Rvci5HZXRBbGdvcml0aG0oKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQqIHBCbG9ja1ZlY3RvckRlZnJhZ0N0eCA9IFZNQV9OVUxMOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3Ioc2l6ZV90IGkgPSBtX0N1c3RvbVBvb2xDb250ZXh0cy5zaXplKCk7IGktLTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKG1fQ3VzdG9tUG9vbENvbnRleHRzW2ldLT5HZXRDdXN0b21Qb29sKCkgPT0gcG9vbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCbG9ja1ZlY3RvckRlZnJhZ0N0eCA9IG1fQ3VzdG9tUG9vbENvbnRleHRzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCFwQmxvY2tWZWN0b3JEZWZyYWdDdHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJsb2NrVmVjdG9yRGVmcmFnQ3R4ID0gdm1hX25ldyhtX2hBbGxvY2F0b3IsIFZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dCkoCisgICAgICAgICAgICAgICAgICAgIG1faEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgJnBvb2wtPm1fQmxvY2tWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgIG1fQ3VyckZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIG1fRmxhZ3MpOworICAgICAgICAgICAgICAgIG1fQ3VzdG9tUG9vbENvbnRleHRzLnB1c2hfYmFjayhwQmxvY2tWZWN0b3JEZWZyYWdDdHgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQmxvY2tWZWN0b3JEZWZyYWdDdHgtPkFkZEFsbCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZtYURlZnJhZ21lbnRhdGlvbkNvbnRleHRfVDo6QWRkQWxsb2NhdGlvbnMoCisgICAgdWludDMyX3QgYWxsb2NhdGlvbkNvdW50LAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9ucywKKyAgICBWa0Jvb2wzMiogcEFsbG9jYXRpb25zQ2hhbmdlZCkKK3sKKyAgICAvLyBEaXNwYXRjaCBwQWxsb2NhdGlvbnMgYW1vbmcgZGVmcmFnbWVudGF0b3JzLiBDcmVhdGUgdGhlbSB3aGVuIG5lY2Vzc2FyeS4KKyAgICBmb3IodWludDMyX3QgYWxsb2NJbmRleCA9IDA7IGFsbG9jSW5kZXggPCBhbGxvY2F0aW9uQ291bnQ7ICsrYWxsb2NJbmRleCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZtYUFsbG9jYXRpb24gaEFsbG9jID0gcEFsbG9jYXRpb25zW2FsbG9jSW5kZXhdOworICAgICAgICBWTUFfQVNTRVJUKGhBbGxvYyk7CisgICAgICAgIC8vIERlZGljYXRlZEFsbG9jIGNhbm5vdCBiZSBkZWZyYWdtZW50ZWQuCisgICAgICAgIGlmKChoQWxsb2MtPkdldFR5cGUoKSA9PSBWbWFBbGxvY2F0aW9uX1Q6OkFMTE9DQVRJT05fVFlQRV9CTE9DSykgJiYKKyAgICAgICAgICAgIC8vIExvc3QgYWxsb2NhdGlvbiBjYW5ub3QgYmUgZGVmcmFnbWVudGVkLgorICAgICAgICAgICAgKGhBbGxvYy0+R2V0TGFzdFVzZUZyYW1lSW5kZXgoKSAhPSBWTUFfRlJBTUVfSU5ERVhfTE9TVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dCogcEJsb2NrVmVjdG9yRGVmcmFnQ3R4ID0gVk1BX05VTEw7CisKKyAgICAgICAgICAgIGNvbnN0IFZtYVBvb2wgaEFsbG9jUG9vbCA9IGhBbGxvYy0+R2V0UG9vbCgpOworICAgICAgICAgICAgLy8gVGhpcyBhbGxvY2F0aW9uIGJlbG9uZ3MgdG8gY3VzdG9tIHBvb2wuCisgICAgICAgICAgICBpZihoQWxsb2NQb29sICE9IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFBvb2xzIHdpdGggYWxnb3JpdGhtIG90aGVyIHRoYW4gZGVmYXVsdCBhcmUgbm90IGRlZnJhZ21lbnRlZC4KKyAgICAgICAgICAgICAgICBpZihoQWxsb2NQb29sLT5tX0Jsb2NrVmVjdG9yLkdldEFsZ29yaXRobSgpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3Ioc2l6ZV90IGkgPSBtX0N1c3RvbVBvb2xDb250ZXh0cy5zaXplKCk7IGktLTsgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihtX0N1c3RvbVBvb2xDb250ZXh0c1tpXS0+R2V0Q3VzdG9tUG9vbCgpID09IGhBbGxvY1Bvb2wpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJsb2NrVmVjdG9yRGVmcmFnQ3R4ID0gbV9DdXN0b21Qb29sQ29udGV4dHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIXBCbG9ja1ZlY3RvckRlZnJhZ0N0eCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEJsb2NrVmVjdG9yRGVmcmFnQ3R4ID0gdm1hX25ldyhtX2hBbGxvY2F0b3IsIFZtYUJsb2NrVmVjdG9yRGVmcmFnbWVudGF0aW9uQ29udGV4dCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9oQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBbGxvY1Bvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBbGxvY1Bvb2wtPm1fQmxvY2tWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJyRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0ZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VzdG9tUG9vbENvbnRleHRzLnB1c2hfYmFjayhwQmxvY2tWZWN0b3JEZWZyYWdDdHgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhpcyBhbGxvY2F0aW9uIGJlbG9uZ3MgdG8gZGVmYXVsdCBwb29sLgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1lbVR5cGVJbmRleCA9IGhBbGxvYy0+R2V0TWVtb3J5VHlwZUluZGV4KCk7CisgICAgICAgICAgICAgICAgcEJsb2NrVmVjdG9yRGVmcmFnQ3R4ID0gbV9EZWZhdWx0UG9vbENvbnRleHRzW21lbVR5cGVJbmRleF07CisgICAgICAgICAgICAgICAgaWYoIXBCbG9ja1ZlY3RvckRlZnJhZ0N0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCbG9ja1ZlY3RvckRlZnJhZ0N0eCA9IHZtYV9uZXcobV9oQWxsb2NhdG9yLCBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQpKAorICAgICAgICAgICAgICAgICAgICAgICAgbV9oQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgVk1BX05VTEwsIC8vIGhDdXN0b21Qb29sCisgICAgICAgICAgICAgICAgICAgICAgICBtX2hBbGxvY2F0b3ItPm1fcEJsb2NrVmVjdG9yc1ttZW1UeXBlSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJyRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fRmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBtX0RlZmF1bHRQb29sQ29udGV4dHNbbWVtVHlwZUluZGV4XSA9IHBCbG9ja1ZlY3RvckRlZnJhZ0N0eDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBCbG9ja1ZlY3RvckRlZnJhZ0N0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWa0Jvb2wzMiogY29uc3QgcENoYW5nZWQgPSAocEFsbG9jYXRpb25zQ2hhbmdlZCAhPSBWTUFfTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAmcEFsbG9jYXRpb25zQ2hhbmdlZFthbGxvY0luZGV4XSA6IFZNQV9OVUxMOworICAgICAgICAgICAgICAgIHBCbG9ja1ZlY3RvckRlZnJhZ0N0eC0+QWRkQWxsb2NhdGlvbihoQWxsb2MsIHBDaGFuZ2VkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworVmtSZXN1bHQgVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dF9UOjpEZWZyYWdtZW50KAorICAgIFZrRGV2aWNlU2l6ZSBtYXhDcHVCeXRlc1RvTW92ZSwgdWludDMyX3QgbWF4Q3B1QWxsb2NhdGlvbnNUb01vdmUsCisgICAgVmtEZXZpY2VTaXplIG1heEdwdUJ5dGVzVG9Nb3ZlLCB1aW50MzJfdCBtYXhHcHVBbGxvY2F0aW9uc1RvTW92ZSwKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVm1hRGVmcmFnbWVudGF0aW9uU3RhdHMqIHBTdGF0cykKK3sKKyAgICBpZihwU3RhdHMpCisgICAgeworICAgICAgICBtZW1zZXQocFN0YXRzLCAwLCBzaXplb2YoVm1hRGVmcmFnbWVudGF0aW9uU3RhdHMpKTsKKyAgICB9CisKKyAgICBpZihjb21tYW5kQnVmZmVyID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgbWF4R3B1Qnl0ZXNUb01vdmUgPSAwOworICAgICAgICBtYXhHcHVBbGxvY2F0aW9uc1RvTW92ZSA9IDA7CisgICAgfQorCisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKworICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBwb29scy4KKyAgICBmb3IodWludDMyX3QgbWVtVHlwZUluZGV4ID0gMDsKKyAgICAgICAgbWVtVHlwZUluZGV4IDwgbV9oQWxsb2NhdG9yLT5HZXRNZW1vcnlUeXBlQ291bnQoKSAmJiByZXMgPj0gVktfU1VDQ0VTUzsKKyAgICAgICAgKyttZW1UeXBlSW5kZXgpCisgICAgeworICAgICAgICBWbWFCbG9ja1ZlY3RvckRlZnJhZ21lbnRhdGlvbkNvbnRleHQqIHBCbG9ja1ZlY3RvckN0eCA9IG1fRGVmYXVsdFBvb2xDb250ZXh0c1ttZW1UeXBlSW5kZXhdOworICAgICAgICBpZihwQmxvY2tWZWN0b3JDdHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9BU1NFUlQocEJsb2NrVmVjdG9yQ3R4LT5HZXRCbG9ja1ZlY3RvcigpKTsKKyAgICAgICAgICAgIHBCbG9ja1ZlY3RvckN0eC0+R2V0QmxvY2tWZWN0b3IoKS0+RGVmcmFnbWVudCgKKyAgICAgICAgICAgICAgICBwQmxvY2tWZWN0b3JDdHgsCisgICAgICAgICAgICAgICAgcFN0YXRzLAorICAgICAgICAgICAgICAgIG1heENwdUJ5dGVzVG9Nb3ZlLCBtYXhDcHVBbGxvY2F0aW9uc1RvTW92ZSwKKyAgICAgICAgICAgICAgICBtYXhHcHVCeXRlc1RvTW92ZSwgbWF4R3B1QWxsb2NhdGlvbnNUb01vdmUsCisgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcik7CisgICAgICAgICAgICBpZihwQmxvY2tWZWN0b3JDdHgtPnJlcyAhPSBWS19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcyA9IHBCbG9ja1ZlY3RvckN0eC0+cmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBjdXN0b20gcG9vbHMuCisgICAgZm9yKHNpemVfdCBjdXN0b21DdHhJbmRleCA9IDAsIGN1c3RvbUN0eENvdW50ID0gbV9DdXN0b21Qb29sQ29udGV4dHMuc2l6ZSgpOworICAgICAgICBjdXN0b21DdHhJbmRleCA8IGN1c3RvbUN0eENvdW50ICYmIHJlcyA+PSBWS19TVUNDRVNTOworICAgICAgICArK2N1c3RvbUN0eEluZGV4KQorICAgIHsKKyAgICAgICAgVm1hQmxvY2tWZWN0b3JEZWZyYWdtZW50YXRpb25Db250ZXh0KiBwQmxvY2tWZWN0b3JDdHggPSBtX0N1c3RvbVBvb2xDb250ZXh0c1tjdXN0b21DdHhJbmRleF07CisgICAgICAgIFZNQV9BU1NFUlQocEJsb2NrVmVjdG9yQ3R4ICYmIHBCbG9ja1ZlY3RvckN0eC0+R2V0QmxvY2tWZWN0b3IoKSk7CisgICAgICAgIHBCbG9ja1ZlY3RvckN0eC0+R2V0QmxvY2tWZWN0b3IoKS0+RGVmcmFnbWVudCgKKyAgICAgICAgICAgIHBCbG9ja1ZlY3RvckN0eCwKKyAgICAgICAgICAgIHBTdGF0cywKKyAgICAgICAgICAgIG1heENwdUJ5dGVzVG9Nb3ZlLCBtYXhDcHVBbGxvY2F0aW9uc1RvTW92ZSwKKyAgICAgICAgICAgIG1heEdwdUJ5dGVzVG9Nb3ZlLCBtYXhHcHVBbGxvY2F0aW9uc1RvTW92ZSwKKyAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIpOworICAgICAgICBpZihwQmxvY2tWZWN0b3JDdHgtPnJlcyAhPSBWS19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSBwQmxvY2tWZWN0b3JDdHgtPnJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWbWFSZWNvcmRlcgorCisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisKK1ZtYVJlY29yZGVyOjpWbWFSZWNvcmRlcigpIDoKKyAgICBtX1VzZU11dGV4KHRydWUpLAorICAgIG1fRmxhZ3MoMCksCisgICAgbV9GaWxlKFZNQV9OVUxMKSwKKyAgICBtX0ZyZXEoSU5UNjRfTUFYKSwKKyAgICBtX1N0YXJ0Q291bnRlcihJTlQ2NF9NQVgpCit7Cit9CisKK1ZrUmVzdWx0IFZtYVJlY29yZGVyOjpJbml0KGNvbnN0IFZtYVJlY29yZFNldHRpbmdzJiBzZXR0aW5ncywgYm9vbCB1c2VNdXRleCkKK3sKKyAgICBtX1VzZU11dGV4ID0gdXNlTXV0ZXg7CisgICAgbV9GbGFncyA9IHNldHRpbmdzLmZsYWdzOworCisgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopJm1fRnJlcSk7CisgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZtX1N0YXJ0Q291bnRlcik7CisKKyAgICAvLyBPcGVuIGZpbGUgZm9yIHdyaXRpbmcuCisgICAgZXJybm9fdCBlcnIgPSBmb3Blbl9zKCZtX0ZpbGUsIHNldHRpbmdzLnBGaWxlUGF0aCwgIndiIik7CisgICAgaWYoZXJyICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKworICAgIC8vIFdyaXRlIGhlYWRlci4KKyAgICBmcHJpbnRmKG1fRmlsZSwgIiVzXG4iLCAiVnVsa2FuIE1lbW9yeSBBbGxvY2F0b3IsQ2FsbHMgcmVjb3JkaW5nIik7CisgICAgZnByaW50ZihtX0ZpbGUsICIlc1xuIiwgIjEsNSIpOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZtYVJlY29yZGVyOjp+Vm1hUmVjb3JkZXIoKQoreworICAgIGlmKG1fRmlsZSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGZjbG9zZShtX0ZpbGUpOworICAgIH0KK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkQ3JlYXRlQWxsb2NhdG9yKHVpbnQzMl90IGZyYW1lSW5kZXgpCit7CisgICAgQ2FsbFBhcmFtcyBjYWxsUGFyYW1zOworICAgIEdldEJhc2ljUGFyYW1zKGNhbGxQYXJhbXMpOworCisgICAgVm1hTXV0ZXhMb2NrIGxvY2sobV9GaWxlTXV0ZXgsIG1fVXNlTXV0ZXgpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFDcmVhdGVBbGxvY2F0b3JcbiIsIGNhbGxQYXJhbXMudGhyZWFkSWQsIGNhbGxQYXJhbXMudGltZSwgZnJhbWVJbmRleCk7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkRGVzdHJveUFsbG9jYXRvcih1aW50MzJfdCBmcmFtZUluZGV4KQoreworICAgIENhbGxQYXJhbXMgY2FsbFBhcmFtczsKKyAgICBHZXRCYXNpY1BhcmFtcyhjYWxsUGFyYW1zKTsKKworICAgIFZtYU11dGV4TG9jayBsb2NrKG1fRmlsZU11dGV4LCBtX1VzZU11dGV4KTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiV1LCUuM2YsJXUsdm1hRGVzdHJveUFsbG9jYXRvclxuIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4KTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmRDcmVhdGVQb29sKHVpbnQzMl90IGZyYW1lSW5kZXgsIGNvbnN0IFZtYVBvb2xDcmVhdGVJbmZvJiBjcmVhdGVJbmZvLCBWbWFQb29sIHBvb2wpCit7CisgICAgQ2FsbFBhcmFtcyBjYWxsUGFyYW1zOworICAgIEdldEJhc2ljUGFyYW1zKGNhbGxQYXJhbXMpOworCisgICAgVm1hTXV0ZXhMb2NrIGxvY2sobV9GaWxlTXV0ZXgsIG1fVXNlTXV0ZXgpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFDcmVhdGVQb29sLCV1LCV1LCVsbHUsJWxsdSwlbGx1LCV1LCVwXG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIGNyZWF0ZUluZm8ubWVtb3J5VHlwZUluZGV4LAorICAgICAgICBjcmVhdGVJbmZvLmZsYWdzLAorICAgICAgICBjcmVhdGVJbmZvLmJsb2NrU2l6ZSwKKyAgICAgICAgKHVpbnQ2NF90KWNyZWF0ZUluZm8ubWluQmxvY2tDb3VudCwKKyAgICAgICAgKHVpbnQ2NF90KWNyZWF0ZUluZm8ubWF4QmxvY2tDb3VudCwKKyAgICAgICAgY3JlYXRlSW5mby5mcmFtZUluVXNlQ291bnQsCisgICAgICAgIHBvb2wpOworICAgIEZsdXNoKCk7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OlJlY29yZERlc3Ryb3lQb29sKHVpbnQzMl90IGZyYW1lSW5kZXgsIFZtYVBvb2wgcG9vbCkKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYURlc3Ryb3lQb29sLCVwXG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIHBvb2wpOworICAgIEZsdXNoKCk7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OlJlY29yZEFsbG9jYXRlTWVtb3J5KHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgICAgIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzJiB2a01lbVJlcSwKKyAgICAgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8mIGNyZWF0ZUluZm8sCisgICAgICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgVXNlckRhdGFTdHJpbmcgdXNlckRhdGFTdHIoY3JlYXRlSW5mby5mbGFncywgY3JlYXRlSW5mby5wVXNlckRhdGEpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFBbGxvY2F0ZU1lbW9yeSwlbGx1LCVsbHUsJXUsJXUsJXUsJXUsJXUsJXUsJXAsJXAsJXNcbiIsIGNhbGxQYXJhbXMudGhyZWFkSWQsIGNhbGxQYXJhbXMudGltZSwgZnJhbWVJbmRleCwKKyAgICAgICAgdmtNZW1SZXEuc2l6ZSwKKyAgICAgICAgdmtNZW1SZXEuYWxpZ25tZW50LAorICAgICAgICB2a01lbVJlcS5tZW1vcnlUeXBlQml0cywKKyAgICAgICAgY3JlYXRlSW5mby5mbGFncywKKyAgICAgICAgY3JlYXRlSW5mby51c2FnZSwKKyAgICAgICAgY3JlYXRlSW5mby5yZXF1aXJlZEZsYWdzLAorICAgICAgICBjcmVhdGVJbmZvLnByZWZlcnJlZEZsYWdzLAorICAgICAgICBjcmVhdGVJbmZvLm1lbW9yeVR5cGVCaXRzLAorICAgICAgICBjcmVhdGVJbmZvLnBvb2wsCisgICAgICAgIGFsbG9jYXRpb24sCisgICAgICAgIHVzZXJEYXRhU3RyLkdldFN0cmluZygpKTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmRBbGxvY2F0ZU1lbW9yeVBhZ2VzKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMmIHZrTWVtUmVxLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBjcmVhdGVJbmZvLAorICAgIHVpbnQ2NF90IGFsbG9jYXRpb25Db3VudCwKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbnMpCit7CisgICAgQ2FsbFBhcmFtcyBjYWxsUGFyYW1zOworICAgIEdldEJhc2ljUGFyYW1zKGNhbGxQYXJhbXMpOworCisgICAgVm1hTXV0ZXhMb2NrIGxvY2sobV9GaWxlTXV0ZXgsIG1fVXNlTXV0ZXgpOworICAgIFVzZXJEYXRhU3RyaW5nIHVzZXJEYXRhU3RyKGNyZWF0ZUluZm8uZmxhZ3MsIGNyZWF0ZUluZm8ucFVzZXJEYXRhKTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiV1LCUuM2YsJXUsdm1hQWxsb2NhdGVNZW1vcnlQYWdlcywlbGx1LCVsbHUsJXUsJXUsJXUsJXUsJXUsJXUsJXAsIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4LAorICAgICAgICB2a01lbVJlcS5zaXplLAorICAgICAgICB2a01lbVJlcS5hbGlnbm1lbnQsCisgICAgICAgIHZrTWVtUmVxLm1lbW9yeVR5cGVCaXRzLAorICAgICAgICBjcmVhdGVJbmZvLmZsYWdzLAorICAgICAgICBjcmVhdGVJbmZvLnVzYWdlLAorICAgICAgICBjcmVhdGVJbmZvLnJlcXVpcmVkRmxhZ3MsCisgICAgICAgIGNyZWF0ZUluZm8ucHJlZmVycmVkRmxhZ3MsCisgICAgICAgIGNyZWF0ZUluZm8ubWVtb3J5VHlwZUJpdHMsCisgICAgICAgIGNyZWF0ZUluZm8ucG9vbCk7CisgICAgUHJpbnRQb2ludGVyTGlzdChhbGxvY2F0aW9uQ291bnQsIHBBbGxvY2F0aW9ucyk7CisgICAgZnByaW50ZihtX0ZpbGUsICIsJXNcbiIsIHVzZXJEYXRhU3RyLkdldFN0cmluZygpKTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmRBbGxvY2F0ZU1lbW9yeUZvckJ1ZmZlcih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzJiB2a01lbVJlcSwKKyAgICBib29sIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICBib29sIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBjcmVhdGVJbmZvLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgVXNlckRhdGFTdHJpbmcgdXNlckRhdGFTdHIoY3JlYXRlSW5mby5mbGFncywgY3JlYXRlSW5mby5wVXNlckRhdGEpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFBbGxvY2F0ZU1lbW9yeUZvckJ1ZmZlciwlbGx1LCVsbHUsJXUsJXUsJXUsJXUsJXUsJXUsJXUsJXUsJXAsJXAsJXNcbiIsIGNhbGxQYXJhbXMudGhyZWFkSWQsIGNhbGxQYXJhbXMudGltZSwgZnJhbWVJbmRleCwKKyAgICAgICAgdmtNZW1SZXEuc2l6ZSwKKyAgICAgICAgdmtNZW1SZXEuYWxpZ25tZW50LAorICAgICAgICB2a01lbVJlcS5tZW1vcnlUeXBlQml0cywKKyAgICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uID8gMSA6IDAsCisgICAgICAgIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uID8gMSA6IDAsCisgICAgICAgIGNyZWF0ZUluZm8uZmxhZ3MsCisgICAgICAgIGNyZWF0ZUluZm8udXNhZ2UsCisgICAgICAgIGNyZWF0ZUluZm8ucmVxdWlyZWRGbGFncywKKyAgICAgICAgY3JlYXRlSW5mby5wcmVmZXJyZWRGbGFncywKKyAgICAgICAgY3JlYXRlSW5mby5tZW1vcnlUeXBlQml0cywKKyAgICAgICAgY3JlYXRlSW5mby5wb29sLAorICAgICAgICBhbGxvY2F0aW9uLAorICAgICAgICB1c2VyRGF0YVN0ci5HZXRTdHJpbmcoKSk7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkQWxsb2NhdGVNZW1vcnlGb3JJbWFnZSh1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIGNvbnN0IFZrTWVtb3J5UmVxdWlyZW1lbnRzJiB2a01lbVJlcSwKKyAgICBib29sIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICBib29sIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBjcmVhdGVJbmZvLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgVXNlckRhdGFTdHJpbmcgdXNlckRhdGFTdHIoY3JlYXRlSW5mby5mbGFncywgY3JlYXRlSW5mby5wVXNlckRhdGEpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFBbGxvY2F0ZU1lbW9yeUZvckltYWdlLCVsbHUsJWxsdSwldSwldSwldSwldSwldSwldSwldSwldSwlcCwlcCwlc1xuIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4LAorICAgICAgICB2a01lbVJlcS5zaXplLAorICAgICAgICB2a01lbVJlcS5hbGlnbm1lbnQsCisgICAgICAgIHZrTWVtUmVxLm1lbW9yeVR5cGVCaXRzLAorICAgICAgICByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gPyAxIDogMCwKKyAgICAgICAgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24gPyAxIDogMCwKKyAgICAgICAgY3JlYXRlSW5mby5mbGFncywKKyAgICAgICAgY3JlYXRlSW5mby51c2FnZSwKKyAgICAgICAgY3JlYXRlSW5mby5yZXF1aXJlZEZsYWdzLAorICAgICAgICBjcmVhdGVJbmZvLnByZWZlcnJlZEZsYWdzLAorICAgICAgICBjcmVhdGVJbmZvLm1lbW9yeVR5cGVCaXRzLAorICAgICAgICBjcmVhdGVJbmZvLnBvb2wsCisgICAgICAgIGFsbG9jYXRpb24sCisgICAgICAgIHVzZXJEYXRhU3RyLkdldFN0cmluZygpKTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmRGcmVlTWVtb3J5KHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKQoreworICAgIENhbGxQYXJhbXMgY2FsbFBhcmFtczsKKyAgICBHZXRCYXNpY1BhcmFtcyhjYWxsUGFyYW1zKTsKKworICAgIFZtYU11dGV4TG9jayBsb2NrKG1fRmlsZU11dGV4LCBtX1VzZU11dGV4KTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiV1LCUuM2YsJXUsdm1hRnJlZU1lbW9yeSwlcFxuIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4LAorICAgICAgICBhbGxvY2F0aW9uKTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmRGcmVlTWVtb3J5UGFnZXModWludDMyX3QgZnJhbWVJbmRleCwKKyAgICB1aW50NjRfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKQoreworICAgIENhbGxQYXJhbXMgY2FsbFBhcmFtczsKKyAgICBHZXRCYXNpY1BhcmFtcyhjYWxsUGFyYW1zKTsKKworICAgIFZtYU11dGV4TG9jayBsb2NrKG1fRmlsZU11dGV4LCBtX1VzZU11dGV4KTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiV1LCUuM2YsJXUsdm1hRnJlZU1lbW9yeVBhZ2VzLCIsIGNhbGxQYXJhbXMudGhyZWFkSWQsIGNhbGxQYXJhbXMudGltZSwgZnJhbWVJbmRleCk7CisgICAgUHJpbnRQb2ludGVyTGlzdChhbGxvY2F0aW9uQ291bnQsIHBBbGxvY2F0aW9ucyk7CisgICAgZnByaW50ZihtX0ZpbGUsICJcbiIpOworICAgIEZsdXNoKCk7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OlJlY29yZFJlc2l6ZUFsbG9jYXRpb24oCisgICAgdWludDMyX3QgZnJhbWVJbmRleCwKKyAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24sCisgICAgVmtEZXZpY2VTaXplIG5ld1NpemUpCit7CisgICAgQ2FsbFBhcmFtcyBjYWxsUGFyYW1zOworICAgIEdldEJhc2ljUGFyYW1zKGNhbGxQYXJhbXMpOworCisgICAgVm1hTXV0ZXhMb2NrIGxvY2sobV9GaWxlTXV0ZXgsIG1fVXNlTXV0ZXgpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFSZXNpemVBbGxvY2F0aW9uLCVwLCVsbHVcbiIsIGNhbGxQYXJhbXMudGhyZWFkSWQsIGNhbGxQYXJhbXMudGltZSwgZnJhbWVJbmRleCwKKyAgICAgICAgYWxsb2NhdGlvbiwgbmV3U2l6ZSk7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkU2V0QWxsb2NhdGlvblVzZXJEYXRhKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIGNvbnN0IHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgVXNlckRhdGFTdHJpbmcgdXNlckRhdGFTdHIoCisgICAgICAgIGFsbG9jYXRpb24tPklzVXNlckRhdGFTdHJpbmcoKSA/IFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUIDogMCwKKyAgICAgICAgcFVzZXJEYXRhKTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiV1LCUuM2YsJXUsdm1hU2V0QWxsb2NhdGlvblVzZXJEYXRhLCVwLCVzXG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIGFsbG9jYXRpb24sCisgICAgICAgIHVzZXJEYXRhU3RyLkdldFN0cmluZygpKTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmRDcmVhdGVMb3N0QWxsb2NhdGlvbih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYUNyZWF0ZUxvc3RBbGxvY2F0aW9uLCVwXG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIGFsbG9jYXRpb24pOworICAgIEZsdXNoKCk7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OlJlY29yZE1hcE1lbW9yeSh1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYU1hcE1lbW9yeSwlcFxuIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4LAorICAgICAgICBhbGxvY2F0aW9uKTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmRVbm1hcE1lbW9yeSh1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYVVubWFwTWVtb3J5LCVwXG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIGFsbG9jYXRpb24pOworICAgIEZsdXNoKCk7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OlJlY29yZEZsdXNoQWxsb2NhdGlvbih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpCit7CisgICAgQ2FsbFBhcmFtcyBjYWxsUGFyYW1zOworICAgIEdldEJhc2ljUGFyYW1zKGNhbGxQYXJhbXMpOworCisgICAgVm1hTXV0ZXhMb2NrIGxvY2sobV9GaWxlTXV0ZXgsIG1fVXNlTXV0ZXgpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFGbHVzaEFsbG9jYXRpb24sJXAsJWxsdSwlbGx1XG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIGFsbG9jYXRpb24sCisgICAgICAgIG9mZnNldCwKKyAgICAgICAgc2l6ZSk7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkSW52YWxpZGF0ZUFsbG9jYXRpb24odWludDMyX3QgZnJhbWVJbmRleCwKKyAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24sIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplKQoreworICAgIENhbGxQYXJhbXMgY2FsbFBhcmFtczsKKyAgICBHZXRCYXNpY1BhcmFtcyhjYWxsUGFyYW1zKTsKKworICAgIFZtYU11dGV4TG9jayBsb2NrKG1fRmlsZU11dGV4LCBtX1VzZU11dGV4KTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiV1LCUuM2YsJXUsdm1hSW52YWxpZGF0ZUFsbG9jYXRpb24sJXAsJWxsdSwlbGx1XG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIGFsbG9jYXRpb24sCisgICAgICAgIG9mZnNldCwKKyAgICAgICAgc2l6ZSk7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkQ3JlYXRlQnVmZmVyKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvJiBidWZDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBhbGxvY0NyZWF0ZUluZm8sCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKQoreworICAgIENhbGxQYXJhbXMgY2FsbFBhcmFtczsKKyAgICBHZXRCYXNpY1BhcmFtcyhjYWxsUGFyYW1zKTsKKworICAgIFZtYU11dGV4TG9jayBsb2NrKG1fRmlsZU11dGV4LCBtX1VzZU11dGV4KTsKKyAgICBVc2VyRGF0YVN0cmluZyB1c2VyRGF0YVN0cihhbGxvY0NyZWF0ZUluZm8uZmxhZ3MsIGFsbG9jQ3JlYXRlSW5mby5wVXNlckRhdGEpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFDcmVhdGVCdWZmZXIsJXUsJWxsdSwldSwldSwldSwldSwldSwldSwldSwlcCwlcCwlc1xuIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4LAorICAgICAgICBidWZDcmVhdGVJbmZvLmZsYWdzLAorICAgICAgICBidWZDcmVhdGVJbmZvLnNpemUsCisgICAgICAgIGJ1ZkNyZWF0ZUluZm8udXNhZ2UsCisgICAgICAgIGJ1ZkNyZWF0ZUluZm8uc2hhcmluZ01vZGUsCisgICAgICAgIGFsbG9jQ3JlYXRlSW5mby5mbGFncywKKyAgICAgICAgYWxsb2NDcmVhdGVJbmZvLnVzYWdlLAorICAgICAgICBhbGxvY0NyZWF0ZUluZm8ucmVxdWlyZWRGbGFncywKKyAgICAgICAgYWxsb2NDcmVhdGVJbmZvLnByZWZlcnJlZEZsYWdzLAorICAgICAgICBhbGxvY0NyZWF0ZUluZm8ubWVtb3J5VHlwZUJpdHMsCisgICAgICAgIGFsbG9jQ3JlYXRlSW5mby5wb29sLAorICAgICAgICBhbGxvY2F0aW9uLAorICAgICAgICB1c2VyRGF0YVN0ci5HZXRTdHJpbmcoKSk7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkQ3JlYXRlSW1hZ2UodWludDMyX3QgZnJhbWVJbmRleCwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyYgaW1hZ2VDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBhbGxvY0NyZWF0ZUluZm8sCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKQoreworICAgIENhbGxQYXJhbXMgY2FsbFBhcmFtczsKKyAgICBHZXRCYXNpY1BhcmFtcyhjYWxsUGFyYW1zKTsKKworICAgIFZtYU11dGV4TG9jayBsb2NrKG1fRmlsZU11dGV4LCBtX1VzZU11dGV4KTsKKyAgICBVc2VyRGF0YVN0cmluZyB1c2VyRGF0YVN0cihhbGxvY0NyZWF0ZUluZm8uZmxhZ3MsIGFsbG9jQ3JlYXRlSW5mby5wVXNlckRhdGEpOworICAgIGZwcmludGYobV9GaWxlLCAiJXUsJS4zZiwldSx2bWFDcmVhdGVJbWFnZSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwldSwlcCwlcCwlc1xuIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4LAorICAgICAgICBpbWFnZUNyZWF0ZUluZm8uZmxhZ3MsCisgICAgICAgIGltYWdlQ3JlYXRlSW5mby5pbWFnZVR5cGUsCisgICAgICAgIGltYWdlQ3JlYXRlSW5mby5mb3JtYXQsCisgICAgICAgIGltYWdlQ3JlYXRlSW5mby5leHRlbnQud2lkdGgsCisgICAgICAgIGltYWdlQ3JlYXRlSW5mby5leHRlbnQuaGVpZ2h0LAorICAgICAgICBpbWFnZUNyZWF0ZUluZm8uZXh0ZW50LmRlcHRoLAorICAgICAgICBpbWFnZUNyZWF0ZUluZm8ubWlwTGV2ZWxzLAorICAgICAgICBpbWFnZUNyZWF0ZUluZm8uYXJyYXlMYXllcnMsCisgICAgICAgIGltYWdlQ3JlYXRlSW5mby5zYW1wbGVzLAorICAgICAgICBpbWFnZUNyZWF0ZUluZm8udGlsaW5nLAorICAgICAgICBpbWFnZUNyZWF0ZUluZm8udXNhZ2UsCisgICAgICAgIGltYWdlQ3JlYXRlSW5mby5zaGFyaW5nTW9kZSwKKyAgICAgICAgaW1hZ2VDcmVhdGVJbmZvLmluaXRpYWxMYXlvdXQsCisgICAgICAgIGFsbG9jQ3JlYXRlSW5mby5mbGFncywKKyAgICAgICAgYWxsb2NDcmVhdGVJbmZvLnVzYWdlLAorICAgICAgICBhbGxvY0NyZWF0ZUluZm8ucmVxdWlyZWRGbGFncywKKyAgICAgICAgYWxsb2NDcmVhdGVJbmZvLnByZWZlcnJlZEZsYWdzLAorICAgICAgICBhbGxvY0NyZWF0ZUluZm8ubWVtb3J5VHlwZUJpdHMsCisgICAgICAgIGFsbG9jQ3JlYXRlSW5mby5wb29sLAorICAgICAgICBhbGxvY2F0aW9uLAorICAgICAgICB1c2VyRGF0YVN0ci5HZXRTdHJpbmcoKSk7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkRGVzdHJveUJ1ZmZlcih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYURlc3Ryb3lCdWZmZXIsJXBcbiIsIGNhbGxQYXJhbXMudGhyZWFkSWQsIGNhbGxQYXJhbXMudGltZSwgZnJhbWVJbmRleCwKKyAgICAgICAgYWxsb2NhdGlvbik7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkRGVzdHJveUltYWdlKHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKQoreworICAgIENhbGxQYXJhbXMgY2FsbFBhcmFtczsKKyAgICBHZXRCYXNpY1BhcmFtcyhjYWxsUGFyYW1zKTsKKworICAgIFZtYU11dGV4TG9jayBsb2NrKG1fRmlsZU11dGV4LCBtX1VzZU11dGV4KTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiV1LCUuM2YsJXUsdm1hRGVzdHJveUltYWdlLCVwXG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIGFsbG9jYXRpb24pOworICAgIEZsdXNoKCk7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OlJlY29yZFRvdWNoQWxsb2NhdGlvbih1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYVRvdWNoQWxsb2NhdGlvbiwlcFxuIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4LAorICAgICAgICBhbGxvY2F0aW9uKTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmRHZXRBbGxvY2F0aW9uSW5mbyh1aW50MzJfdCBmcmFtZUluZGV4LAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYUdldEFsbG9jYXRpb25JbmZvLCVwXG4iLCBjYWxsUGFyYW1zLnRocmVhZElkLCBjYWxsUGFyYW1zLnRpbWUsIGZyYW1lSW5kZXgsCisgICAgICAgIGFsbG9jYXRpb24pOworICAgIEZsdXNoKCk7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OlJlY29yZE1ha2VQb29sQWxsb2NhdGlvbnNMb3N0KHVpbnQzMl90IGZyYW1lSW5kZXgsCisgICAgVm1hUG9vbCBwb29sKQoreworICAgIENhbGxQYXJhbXMgY2FsbFBhcmFtczsKKyAgICBHZXRCYXNpY1BhcmFtcyhjYWxsUGFyYW1zKTsKKworICAgIFZtYU11dGV4TG9jayBsb2NrKG1fRmlsZU11dGV4LCBtX1VzZU11dGV4KTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiV1LCUuM2YsJXUsdm1hTWFrZVBvb2xBbGxvY2F0aW9uc0xvc3QsJXBcbiIsIGNhbGxQYXJhbXMudGhyZWFkSWQsIGNhbGxQYXJhbXMudGltZSwgZnJhbWVJbmRleCwKKyAgICAgICAgcG9vbCk7CisgICAgRmx1c2goKTsKK30KKwordm9pZCBWbWFSZWNvcmRlcjo6UmVjb3JkRGVmcmFnbWVudGF0aW9uQmVnaW4odWludDMyX3QgZnJhbWVJbmRleCwKKyAgICBjb25zdCBWbWFEZWZyYWdtZW50YXRpb25JbmZvMiYgaW5mbywKKyAgICBWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0IGN0eCkKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYURlZnJhZ21lbnRhdGlvbkJlZ2luLCV1LCIsIGNhbGxQYXJhbXMudGhyZWFkSWQsIGNhbGxQYXJhbXMudGltZSwgZnJhbWVJbmRleCwKKyAgICAgICAgaW5mby5mbGFncyk7CisgICAgUHJpbnRQb2ludGVyTGlzdChpbmZvLmFsbG9jYXRpb25Db3VudCwgaW5mby5wQWxsb2NhdGlvbnMpOworICAgIGZwcmludGYobV9GaWxlLCAiLCIpOworICAgIFByaW50UG9pbnRlckxpc3QoaW5mby5wb29sQ291bnQsIGluZm8ucFBvb2xzKTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIiwlbGx1LCV1LCVsbHUsJXUsJXAsJXBcbiIsCisgICAgICAgIGluZm8ubWF4Q3B1Qnl0ZXNUb01vdmUsCisgICAgICAgIGluZm8ubWF4Q3B1QWxsb2NhdGlvbnNUb01vdmUsCisgICAgICAgIGluZm8ubWF4R3B1Qnl0ZXNUb01vdmUsCisgICAgICAgIGluZm8ubWF4R3B1QWxsb2NhdGlvbnNUb01vdmUsCisgICAgICAgIGluZm8uY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgY3R4KTsKKyAgICBGbHVzaCgpOworfQorCit2b2lkIFZtYVJlY29yZGVyOjpSZWNvcmREZWZyYWdtZW50YXRpb25FbmQodWludDMyX3QgZnJhbWVJbmRleCwKKyAgICBWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0IGN0eCkKK3sKKyAgICBDYWxsUGFyYW1zIGNhbGxQYXJhbXM7CisgICAgR2V0QmFzaWNQYXJhbXMoY2FsbFBhcmFtcyk7CisKKyAgICBWbWFNdXRleExvY2sgbG9jayhtX0ZpbGVNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgZnByaW50ZihtX0ZpbGUsICIldSwlLjNmLCV1LHZtYURlZnJhZ21lbnRhdGlvbkVuZCwlcFxuIiwgY2FsbFBhcmFtcy50aHJlYWRJZCwgY2FsbFBhcmFtcy50aW1lLCBmcmFtZUluZGV4LAorICAgICAgICBjdHgpOworICAgIEZsdXNoKCk7Cit9CisKK1ZtYVJlY29yZGVyOjpVc2VyRGF0YVN0cmluZzo6VXNlckRhdGFTdHJpbmcoVm1hQWxsb2NhdGlvbkNyZWF0ZUZsYWdzIGFsbG9jRmxhZ3MsIGNvbnN0IHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgICBpZihwVXNlckRhdGEgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBpZigoYWxsb2NGbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBtX1N0ciA9IChjb25zdCBjaGFyKilwVXNlckRhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzcHJpbnRmX3MobV9QdHJTdHIsICIlcCIsIHBVc2VyRGF0YSk7CisgICAgICAgICAgICBtX1N0ciA9IG1fUHRyU3RyOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1fU3RyID0gIiI7CisgICAgfQorfQorCit2b2lkIFZtYVJlY29yZGVyOjpXcml0ZUNvbmZpZ3VyYXRpb24oCisgICAgY29uc3QgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMmIGRldlByb3BzLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzJiBtZW1Qcm9wcywKKyAgICBib29sIGRlZGljYXRlZEFsbG9jYXRpb25FeHRlbnNpb25FbmFibGVkKQoreworICAgIGZwcmludGYobV9GaWxlLCAiQ29uZmlnLEJlZ2luXG4iKTsKKworICAgIGZwcmludGYobV9GaWxlLCAiUGh5c2ljYWxEZXZpY2UsYXBpVmVyc2lvbiwldVxuIiwgZGV2UHJvcHMuYXBpVmVyc2lvbik7CisgICAgZnByaW50ZihtX0ZpbGUsICJQaHlzaWNhbERldmljZSxkcml2ZXJWZXJzaW9uLCV1XG4iLCBkZXZQcm9wcy5kcml2ZXJWZXJzaW9uKTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIlBoeXNpY2FsRGV2aWNlLHZlbmRvcklELCV1XG4iLCBkZXZQcm9wcy52ZW5kb3JJRCk7CisgICAgZnByaW50ZihtX0ZpbGUsICJQaHlzaWNhbERldmljZSxkZXZpY2VJRCwldVxuIiwgZGV2UHJvcHMuZGV2aWNlSUQpOworICAgIGZwcmludGYobV9GaWxlLCAiUGh5c2ljYWxEZXZpY2UsZGV2aWNlVHlwZSwldVxuIiwgZGV2UHJvcHMuZGV2aWNlVHlwZSk7CisgICAgZnByaW50ZihtX0ZpbGUsICJQaHlzaWNhbERldmljZSxkZXZpY2VOYW1lLCVzXG4iLCBkZXZQcm9wcy5kZXZpY2VOYW1lKTsKKworICAgIGZwcmludGYobV9GaWxlLCAiUGh5c2ljYWxEZXZpY2VMaW1pdHMsbWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50LCV1XG4iLCBkZXZQcm9wcy5saW1pdHMubWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50KTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIlBoeXNpY2FsRGV2aWNlTGltaXRzLGJ1ZmZlckltYWdlR3JhbnVsYXJpdHksJWxsdVxuIiwgZGV2UHJvcHMubGltaXRzLmJ1ZmZlckltYWdlR3JhbnVsYXJpdHkpOworICAgIGZwcmludGYobV9GaWxlLCAiUGh5c2ljYWxEZXZpY2VMaW1pdHMsbm9uQ29oZXJlbnRBdG9tU2l6ZSwlbGx1XG4iLCBkZXZQcm9wcy5saW1pdHMubm9uQ29oZXJlbnRBdG9tU2l6ZSk7CisKKyAgICBmcHJpbnRmKG1fRmlsZSwgIlBoeXNpY2FsRGV2aWNlTWVtb3J5LEhlYXBDb3VudCwldVxuIiwgbWVtUHJvcHMubWVtb3J5SGVhcENvdW50KTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtZW1Qcm9wcy5tZW1vcnlIZWFwQ291bnQ7ICsraSkKKyAgICB7CisgICAgICAgIGZwcmludGYobV9GaWxlLCAiUGh5c2ljYWxEZXZpY2VNZW1vcnksSGVhcCwldSxzaXplLCVsbHVcbiIsIGksIG1lbVByb3BzLm1lbW9yeUhlYXBzW2ldLnNpemUpOworICAgICAgICBmcHJpbnRmKG1fRmlsZSwgIlBoeXNpY2FsRGV2aWNlTWVtb3J5LEhlYXAsJXUsZmxhZ3MsJXVcbiIsIGksIG1lbVByb3BzLm1lbW9yeUhlYXBzW2ldLmZsYWdzKTsKKyAgICB9CisgICAgZnByaW50ZihtX0ZpbGUsICJQaHlzaWNhbERldmljZU1lbW9yeSxUeXBlQ291bnQsJXVcbiIsIG1lbVByb3BzLm1lbW9yeVR5cGVDb3VudCk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbWVtUHJvcHMubWVtb3J5VHlwZUNvdW50OyArK2kpCisgICAgeworICAgICAgICBmcHJpbnRmKG1fRmlsZSwgIlBoeXNpY2FsRGV2aWNlTWVtb3J5LFR5cGUsJXUsaGVhcEluZGV4LCV1XG4iLCBpLCBtZW1Qcm9wcy5tZW1vcnlUeXBlc1tpXS5oZWFwSW5kZXgpOworICAgICAgICBmcHJpbnRmKG1fRmlsZSwgIlBoeXNpY2FsRGV2aWNlTWVtb3J5LFR5cGUsJXUscHJvcGVydHlGbGFncywldVxuIiwgaSwgbWVtUHJvcHMubWVtb3J5VHlwZXNbaV0ucHJvcGVydHlGbGFncyk7CisgICAgfQorCisgICAgZnByaW50ZihtX0ZpbGUsICJFeHRlbnNpb24sVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uLCV1XG4iLCBkZWRpY2F0ZWRBbGxvY2F0aW9uRXh0ZW5zaW9uRW5hYmxlZCA/IDEgOiAwKTsKKworICAgIGZwcmludGYobV9GaWxlLCAiTWFjcm8sVk1BX0RFQlVHX0FMV0FZU19ERURJQ0FURURfTUVNT1JZLCV1XG4iLCBWTUFfREVCVUdfQUxXQVlTX0RFRElDQVRFRF9NRU1PUlkgPyAxIDogMCk7CisgICAgZnByaW50ZihtX0ZpbGUsICJNYWNybyxWTUFfREVCVUdfQUxJR05NRU5ULCVsbHVcbiIsIChWa0RldmljZVNpemUpVk1BX0RFQlVHX0FMSUdOTUVOVCk7CisgICAgZnByaW50ZihtX0ZpbGUsICJNYWNybyxWTUFfREVCVUdfTUFSR0lOLCVsbHVcbiIsIChWa0RldmljZVNpemUpVk1BX0RFQlVHX01BUkdJTik7CisgICAgZnByaW50ZihtX0ZpbGUsICJNYWNybyxWTUFfREVCVUdfSU5JVElBTElaRV9BTExPQ0FUSU9OUywldVxuIiwgVk1BX0RFQlVHX0lOSVRJQUxJWkVfQUxMT0NBVElPTlMgPyAxIDogMCk7CisgICAgZnByaW50ZihtX0ZpbGUsICJNYWNybyxWTUFfREVCVUdfREVURUNUX0NPUlJVUFRJT04sJXVcbiIsIFZNQV9ERUJVR19ERVRFQ1RfQ09SUlVQVElPTiA/IDEgOiAwKTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIk1hY3JvLFZNQV9ERUJVR19HTE9CQUxfTVVURVgsJXVcbiIsIFZNQV9ERUJVR19HTE9CQUxfTVVURVggPyAxIDogMCk7CisgICAgZnByaW50ZihtX0ZpbGUsICJNYWNybyxWTUFfREVCVUdfTUlOX0JVRkZFUl9JTUFHRV9HUkFOVUxBUklUWSwlbGx1XG4iLCAoVmtEZXZpY2VTaXplKVZNQV9ERUJVR19NSU5fQlVGRkVSX0lNQUdFX0dSQU5VTEFSSVRZKTsKKyAgICBmcHJpbnRmKG1fRmlsZSwgIk1hY3JvLFZNQV9TTUFMTF9IRUFQX01BWF9TSVpFLCVsbHVcbiIsIChWa0RldmljZVNpemUpVk1BX1NNQUxMX0hFQVBfTUFYX1NJWkUpOworICAgIGZwcmludGYobV9GaWxlLCAiTWFjcm8sVk1BX0RFRkFVTFRfTEFSR0VfSEVBUF9CTE9DS19TSVpFLCVsbHVcbiIsIChWa0RldmljZVNpemUpVk1BX0RFRkFVTFRfTEFSR0VfSEVBUF9CTE9DS19TSVpFKTsKKworICAgIGZwcmludGYobV9GaWxlLCAiQ29uZmlnLEVuZFxuIik7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OkdldEJhc2ljUGFyYW1zKENhbGxQYXJhbXMmIG91dFBhcmFtcykKK3sKKyAgICBvdXRQYXJhbXMudGhyZWFkSWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKworICAgIExBUkdFX0lOVEVHRVIgY291bnRlcjsKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmY291bnRlcik7CisgICAgb3V0UGFyYW1zLnRpbWUgPSAoZG91YmxlKShjb3VudGVyLlF1YWRQYXJ0IC0gbV9TdGFydENvdW50ZXIpIC8gKGRvdWJsZSltX0ZyZXE7Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OlByaW50UG9pbnRlckxpc3QodWludDY0X3QgY291bnQsIGNvbnN0IFZtYUFsbG9jYXRpb24qIHBJdGVtcykKK3sKKyAgICBpZihjb3VudCkKKyAgICB7CisgICAgICAgIGZwcmludGYobV9GaWxlLCAiJXAiLCBwSXRlbXNbMF0pOworICAgICAgICBmb3IodWludDY0X3QgaSA9IDE7IGkgPCBjb3VudDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKG1fRmlsZSwgIiAlcCIsIHBJdGVtc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVm1hUmVjb3JkZXI6OkZsdXNoKCkKK3sKKyAgICBpZigobV9GbGFncyAmIFZNQV9SRUNPUkRfRkxVU0hfQUZURVJfQ0FMTF9CSVQpICE9IDApCisgICAgeworICAgICAgICBmZmx1c2gobV9GaWxlKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyAjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWbWFBbGxvY2F0b3JfVAorCitWbWFBbGxvY2F0b3JfVDo6Vm1hQWxsb2NhdG9yX1QoY29uc3QgVm1hQWxsb2NhdG9yQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8pIDoKKyAgICBtX1VzZU11dGV4KChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWTUFfQUxMT0NBVE9SX0NSRUFURV9FWFRFUk5BTExZX1NZTkNIUk9OSVpFRF9CSVQpID09IDApLAorICAgIG1fVXNlS2hyRGVkaWNhdGVkQWxsb2NhdGlvbigocENyZWF0ZUluZm8tPmZsYWdzICYgVk1BX0FMTE9DQVRPUl9DUkVBVEVfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JJVCkgIT0gMCksCisgICAgbV9oRGV2aWNlKHBDcmVhdGVJbmZvLT5kZXZpY2UpLAorICAgIG1fQWxsb2NhdGlvbkNhbGxiYWNrc1NwZWNpZmllZChwQ3JlYXRlSW5mby0+cEFsbG9jYXRpb25DYWxsYmFja3MgIT0gVk1BX05VTEwpLAorICAgIG1fQWxsb2NhdGlvbkNhbGxiYWNrcyhwQ3JlYXRlSW5mby0+cEFsbG9jYXRpb25DYWxsYmFja3MgPworICAgICAgICAqcENyZWF0ZUluZm8tPnBBbGxvY2F0aW9uQ2FsbGJhY2tzIDogVm1hRW1wdHlBbGxvY2F0aW9uQ2FsbGJhY2tzKSwKKyAgICBtX1ByZWZlcnJlZExhcmdlSGVhcEJsb2NrU2l6ZSgwKSwKKyAgICBtX1BoeXNpY2FsRGV2aWNlKHBDcmVhdGVJbmZvLT5waHlzaWNhbERldmljZSksCisgICAgbV9DdXJyZW50RnJhbWVJbmRleCgwKSwKKyAgICBtX1Bvb2xzKFZtYVN0bEFsbG9jYXRvcjxWbWFQb29sPihHZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKSwKKyAgICBtX05leHRQb29sSWQoMCkKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICAsbV9wUmVjb3JkZXIoVk1BX05VTEwpCisjZW5kaWYKK3sKKyAgICBpZihWTUFfREVCVUdfREVURUNUX0NPUlJVUFRJT04pCisgICAgeworICAgICAgICAvLyBOZWVkcyB0byBiZSBtdWx0aXBseSBvZiB1aW50MzJfdCBzaXplIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIHdyaXRlIFZNQV9DT1JSVVBUSU9OX0RFVEVDVElPTl9NQUdJQ19WQUxVRSB0byBpdC4KKyAgICAgICAgVk1BX0FTU0VSVChWTUFfREVCVUdfTUFSR0lOICUgc2l6ZW9mKHVpbnQzMl90KSA9PSAwKTsKKyAgICB9CisKKyAgICBWTUFfQVNTRVJUKHBDcmVhdGVJbmZvLT5waHlzaWNhbERldmljZSAmJiBwQ3JlYXRlSW5mby0+ZGV2aWNlKTsKKworI2lmICEoVk1BX0RFRElDQVRFRF9BTExPQ0FUSU9OKQorICAgIGlmKChwQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWTUFfQUxMT0NBVE9SX0NSRUFURV9LSFJfREVESUNBVEVEX0FMTE9DQVRJT05fQklUKSAhPSAwKQorICAgIHsKKyAgICAgICAgVk1BX0FTU0VSVCgwICYmICJWTUFfQUxMT0NBVE9SX0NSRUFURV9LSFJfREVESUNBVEVEX0FMTE9DQVRJT05fQklUIHNldCBidXQgcmVxdWlyZWQgZXh0ZW5zaW9ucyBhcmUgZGlzYWJsZWQgYnkgcHJlcHJvY2Vzc29yIG1hY3Jvcy4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIG1lbXNldCgmbV9EZXZpY2VNZW1vcnlDYWxsYmFja3MsIDAgLHNpemVvZihtX0RldmljZU1lbW9yeUNhbGxiYWNrcykpOworICAgIG1lbXNldCgmbV9QaHlzaWNhbERldmljZVByb3BlcnRpZXMsIDAsIHNpemVvZihtX1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcykpOworICAgIG1lbXNldCgmbV9NZW1Qcm9wcywgMCwgc2l6ZW9mKG1fTWVtUHJvcHMpKTsKKyAgICAgICAgCisgICAgbWVtc2V0KCZtX3BCbG9ja1ZlY3RvcnMsIDAsIHNpemVvZihtX3BCbG9ja1ZlY3RvcnMpKTsKKyAgICBtZW1zZXQoJm1fcERlZGljYXRlZEFsbG9jYXRpb25zLCAwLCBzaXplb2YobV9wRGVkaWNhdGVkQWxsb2NhdGlvbnMpKTsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IFZLX01BWF9NRU1PUllfSEVBUFM7ICsraSkKKyAgICB7CisgICAgICAgIG1fSGVhcFNpemVMaW1pdFtpXSA9IFZLX1dIT0xFX1NJWkU7CisgICAgfQorCisgICAgaWYocENyZWF0ZUluZm8tPnBEZXZpY2VNZW1vcnlDYWxsYmFja3MgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBtX0RldmljZU1lbW9yeUNhbGxiYWNrcy5wZm5BbGxvY2F0ZSA9IHBDcmVhdGVJbmZvLT5wRGV2aWNlTWVtb3J5Q2FsbGJhY2tzLT5wZm5BbGxvY2F0ZTsKKyAgICAgICAgbV9EZXZpY2VNZW1vcnlDYWxsYmFja3MucGZuRnJlZSA9IHBDcmVhdGVJbmZvLT5wRGV2aWNlTWVtb3J5Q2FsbGJhY2tzLT5wZm5GcmVlOworICAgIH0KKworICAgIEltcG9ydFZ1bGthbkZ1bmN0aW9ucyhwQ3JlYXRlSW5mby0+cFZ1bGthbkZ1bmN0aW9ucyk7CisKKyAgICAoKm1fVnVsa2FuRnVuY3Rpb25zLnZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKShtX1BoeXNpY2FsRGV2aWNlLCAmbV9QaHlzaWNhbERldmljZVByb3BlcnRpZXMpOworICAgICgqbV9WdWxrYW5GdW5jdGlvbnMudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMpKG1fUGh5c2ljYWxEZXZpY2UsICZtX01lbVByb3BzKTsKKworICAgIFZNQV9BU1NFUlQoVm1hSXNQb3cyKFZNQV9ERUJVR19BTElHTk1FTlQpKTsKKyAgICBWTUFfQVNTRVJUKFZtYUlzUG93MihWTUFfREVCVUdfTUlOX0JVRkZFUl9JTUFHRV9HUkFOVUxBUklUWSkpOworICAgIFZNQV9BU1NFUlQoVm1hSXNQb3cyKG1fUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzLmxpbWl0cy5idWZmZXJJbWFnZUdyYW51bGFyaXR5KSk7CisgICAgVk1BX0FTU0VSVChWbWFJc1BvdzIobV9QaHlzaWNhbERldmljZVByb3BlcnRpZXMubGltaXRzLm5vbkNvaGVyZW50QXRvbVNpemUpKTsKKworICAgIG1fUHJlZmVycmVkTGFyZ2VIZWFwQmxvY2tTaXplID0gKHBDcmVhdGVJbmZvLT5wcmVmZXJyZWRMYXJnZUhlYXBCbG9ja1NpemUgIT0gMCkgPworICAgICAgICBwQ3JlYXRlSW5mby0+cHJlZmVycmVkTGFyZ2VIZWFwQmxvY2tTaXplIDogc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPihWTUFfREVGQVVMVF9MQVJHRV9IRUFQX0JMT0NLX1NJWkUpOworCisgICAgaWYocENyZWF0ZUluZm8tPnBIZWFwU2l6ZUxpbWl0ICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgZm9yKHVpbnQzMl90IGhlYXBJbmRleCA9IDA7IGhlYXBJbmRleCA8IEdldE1lbW9yeUhlYXBDb3VudCgpOyArK2hlYXBJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGxpbWl0ID0gcENyZWF0ZUluZm8tPnBIZWFwU2l6ZUxpbWl0W2hlYXBJbmRleF07CisgICAgICAgICAgICBpZihsaW1pdCAhPSBWS19XSE9MRV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fSGVhcFNpemVMaW1pdFtoZWFwSW5kZXhdID0gbGltaXQ7CisgICAgICAgICAgICAgICAgaWYobGltaXQgPCBtX01lbVByb3BzLm1lbW9yeUhlYXBzW2hlYXBJbmRleF0uc2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fTWVtUHJvcHMubWVtb3J5SGVhcHNbaGVhcEluZGV4XS5zaXplID0gbGltaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IG1lbVR5cGVJbmRleCA9IDA7IG1lbVR5cGVJbmRleCA8IEdldE1lbW9yeVR5cGVDb3VudCgpOyArK21lbVR5cGVJbmRleCkKKyAgICB7CisgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBwcmVmZXJyZWRCbG9ja1NpemUgPSBDYWxjUHJlZmVycmVkQmxvY2tTaXplKG1lbVR5cGVJbmRleCk7CisKKyAgICAgICAgbV9wQmxvY2tWZWN0b3JzW21lbVR5cGVJbmRleF0gPSB2bWFfbmV3KHRoaXMsIFZtYUJsb2NrVmVjdG9yKSgKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICBtZW1UeXBlSW5kZXgsCisgICAgICAgICAgICBwcmVmZXJyZWRCbG9ja1NpemUsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgU0laRV9NQVgsCisgICAgICAgICAgICBHZXRCdWZmZXJJbWFnZUdyYW51bGFyaXR5KCksCisgICAgICAgICAgICBwQ3JlYXRlSW5mby0+ZnJhbWVJblVzZUNvdW50LAorICAgICAgICAgICAgZmFsc2UsIC8vIGlzQ3VzdG9tUG9vbAorICAgICAgICAgICAgZmFsc2UsIC8vIGV4cGxpY2l0QmxvY2tTaXplCisgICAgICAgICAgICBmYWxzZSk7IC8vIGxpbmVhckFsZ29yaXRobQorICAgICAgICAvLyBObyBuZWVkIHRvIGNhbGwgbV9wQmxvY2tWZWN0b3JzW21lbVR5cGVJbmRleF1bYmxvY2tWZWN0b3JUeXBlSW5kZXhdLT5DcmVhdGVNaW5CbG9ja3MgaGVyZSwKKyAgICAgICAgLy8gYmVjYXNlIG1pbkJsb2NrQ291bnQgaXMgMC4KKyAgICAgICAgbV9wRGVkaWNhdGVkQWxsb2NhdGlvbnNbbWVtVHlwZUluZGV4XSA9IHZtYV9uZXcodGhpcywgQWxsb2NhdGlvblZlY3RvclR5cGUpKFZtYVN0bEFsbG9jYXRvcjxWbWFBbGxvY2F0aW9uPihHZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpKTsKKworICAgIH0KK30KKworVmtSZXN1bHQgVm1hQWxsb2NhdG9yX1Q6OkluaXQoY29uc3QgVm1hQWxsb2NhdG9yQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8pCit7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKworICAgIGlmKHBDcmVhdGVJbmZvLT5wUmVjb3JkU2V0dGluZ3MgIT0gVk1BX05VTEwgJiYKKyAgICAgICAgIVZtYVN0cklzRW1wdHkocENyZWF0ZUluZm8tPnBSZWNvcmRTZXR0aW5ncy0+cEZpbGVQYXRoKSkKKyAgICB7CisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisgICAgICAgIG1fcFJlY29yZGVyID0gdm1hX25ldyh0aGlzLCBWbWFSZWNvcmRlcikoKTsKKyAgICAgICAgcmVzID0gbV9wUmVjb3JkZXItPkluaXQoKnBDcmVhdGVJbmZvLT5wUmVjb3JkU2V0dGluZ3MsIG1fVXNlTXV0ZXgpOworICAgICAgICBpZihyZXMgIT0gVktfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBtX3BSZWNvcmRlci0+V3JpdGVDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgbV9QaHlzaWNhbERldmljZVByb3BlcnRpZXMsCisgICAgICAgICAgICBtX01lbVByb3BzLAorICAgICAgICAgICAgbV9Vc2VLaHJEZWRpY2F0ZWRBbGxvY2F0aW9uKTsKKyAgICAgICAgbV9wUmVjb3JkZXItPlJlY29yZENyZWF0ZUFsbG9jYXRvcihHZXRDdXJyZW50RnJhbWVJbmRleCgpKTsKKyNlbHNlCisgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiVm1hQWxsb2NhdG9yQ3JlYXRlSW5mbzo6cFJlY29yZFNldHRpbmdzIHVzZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIGR1ZSB0byBWTUFfUkVDT1JESU5HX0VOQUJMRUQgbm90IGRlZmluZWQgdG8gMS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0ZFQVRVUkVfTk9UX1BSRVNFTlQ7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitWbWFBbGxvY2F0b3JfVDo6flZtYUFsbG9jYXRvcl9UKCkKK3sKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihtX3BSZWNvcmRlciAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIG1fcFJlY29yZGVyLT5SZWNvcmREZXN0cm95QWxsb2NhdG9yKEdldEN1cnJlbnRGcmFtZUluZGV4KCkpOworICAgICAgICB2bWFfZGVsZXRlKHRoaXMsIG1fcFJlY29yZGVyKTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICBWTUFfQVNTRVJUKG1fUG9vbHMuZW1wdHkoKSk7CisKKyAgICBmb3Ioc2l6ZV90IGkgPSBHZXRNZW1vcnlUeXBlQ291bnQoKTsgaS0tOyApCisgICAgeworICAgICAgICB2bWFfZGVsZXRlKHRoaXMsIG1fcERlZGljYXRlZEFsbG9jYXRpb25zW2ldKTsKKyAgICAgICAgdm1hX2RlbGV0ZSh0aGlzLCBtX3BCbG9ja1ZlY3RvcnNbaV0pOworICAgIH0KK30KKwordm9pZCBWbWFBbGxvY2F0b3JfVDo6SW1wb3J0VnVsa2FuRnVuY3Rpb25zKGNvbnN0IFZtYVZ1bGthbkZ1bmN0aW9ucyogcFZ1bGthbkZ1bmN0aW9ucykKK3sKKyNpZiBWTUFfU1RBVElDX1ZVTEtBTl9GVU5DVElPTlMgPT0gMQorICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzID0gJnZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzOworICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzID0gJnZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrQWxsb2NhdGVNZW1vcnkgPSAmdmtBbGxvY2F0ZU1lbW9yeTsKKyAgICBtX1Z1bGthbkZ1bmN0aW9ucy52a0ZyZWVNZW1vcnkgPSAmdmtGcmVlTWVtb3J5OworICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrTWFwTWVtb3J5ID0gJnZrTWFwTWVtb3J5OworICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrVW5tYXBNZW1vcnkgPSAmdmtVbm1hcE1lbW9yeTsKKyAgICBtX1Z1bGthbkZ1bmN0aW9ucy52a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzID0gJnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXM7CisgICAgbV9WdWxrYW5GdW5jdGlvbnMudmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzID0gJnZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlczsKKyAgICBtX1Z1bGthbkZ1bmN0aW9ucy52a0JpbmRCdWZmZXJNZW1vcnkgPSAmdmtCaW5kQnVmZmVyTWVtb3J5OworICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrQmluZEltYWdlTWVtb3J5ID0gJnZrQmluZEltYWdlTWVtb3J5OworICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzID0gJnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgPSAmdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBtX1Z1bGthbkZ1bmN0aW9ucy52a0NyZWF0ZUJ1ZmZlciA9ICZ2a0NyZWF0ZUJ1ZmZlcjsKKyAgICBtX1Z1bGthbkZ1bmN0aW9ucy52a0Rlc3Ryb3lCdWZmZXIgPSAmdmtEZXN0cm95QnVmZmVyOworICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrQ3JlYXRlSW1hZ2UgPSAmdmtDcmVhdGVJbWFnZTsKKyAgICBtX1Z1bGthbkZ1bmN0aW9ucy52a0Rlc3Ryb3lJbWFnZSA9ICZ2a0Rlc3Ryb3lJbWFnZTsKKyAgICBtX1Z1bGthbkZ1bmN0aW9ucy52a0NtZENvcHlCdWZmZXIgPSAmdmtDbWRDb3B5QnVmZmVyOworI2lmIFZNQV9ERURJQ0FURURfQUxMT0NBVElPTgorICAgIGlmKG1fVXNlS2hyRGVkaWNhdGVkQWxsb2NhdGlvbikKKyAgICB7CisgICAgICAgIG1fVnVsa2FuRnVuY3Rpb25zLnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9CisgICAgICAgICAgICAoUEZOX3ZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUil2a0dldERldmljZVByb2NBZGRyKG1faERldmljZSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIpOworICAgICAgICBtX1Z1bGthbkZ1bmN0aW9ucy52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9CisgICAgICAgICAgICAoUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKXZrR2V0RGV2aWNlUHJvY0FkZHIobV9oRGV2aWNlLCAidmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIiKTsKKyAgICB9CisjZW5kaWYgLy8gI2lmIFZNQV9ERURJQ0FURURfQUxMT0NBVElPTgorI2VuZGlmIC8vICNpZiBWTUFfU1RBVElDX1ZVTEtBTl9GVU5DVElPTlMgPT0gMQorCisjZGVmaW5lIFZNQV9DT1BZX0lGX05PVF9OVUxMKGZ1bmNOYW1lKSBcCisgICAgaWYocFZ1bGthbkZ1bmN0aW9ucy0+ZnVuY05hbWUgIT0gVk1BX05VTEwpIG1fVnVsa2FuRnVuY3Rpb25zLmZ1bmNOYW1lID0gcFZ1bGthbkZ1bmN0aW9ucy0+ZnVuY05hbWU7CisKKyAgICBpZihwVnVsa2FuRnVuY3Rpb25zICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgVk1BX0NPUFlfSUZfTk9UX05VTEwodmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMpOworICAgICAgICBWTUFfQ09QWV9JRl9OT1RfTlVMTCh2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyk7CisgICAgICAgIFZNQV9DT1BZX0lGX05PVF9OVUxMKHZrQWxsb2NhdGVNZW1vcnkpOworICAgICAgICBWTUFfQ09QWV9JRl9OT1RfTlVMTCh2a0ZyZWVNZW1vcnkpOworICAgICAgICBWTUFfQ09QWV9JRl9OT1RfTlVMTCh2a01hcE1lbW9yeSk7CisgICAgICAgIFZNQV9DT1BZX0lGX05PVF9OVUxMKHZrVW5tYXBNZW1vcnkpOworICAgICAgICBWTUFfQ09QWV9JRl9OT1RfTlVMTCh2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKTsKKyAgICAgICAgVk1BX0NPUFlfSUZfTk9UX05VTEwodmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKTsKKyAgICAgICAgVk1BX0NPUFlfSUZfTk9UX05VTEwodmtCaW5kQnVmZmVyTWVtb3J5KTsKKyAgICAgICAgVk1BX0NPUFlfSUZfTk9UX05VTEwodmtCaW5kSW1hZ2VNZW1vcnkpOworICAgICAgICBWTUFfQ09QWV9JRl9OT1RfTlVMTCh2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyk7CisgICAgICAgIFZNQV9DT1BZX0lGX05PVF9OVUxMKHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMpOworICAgICAgICBWTUFfQ09QWV9JRl9OT1RfTlVMTCh2a0NyZWF0ZUJ1ZmZlcik7CisgICAgICAgIFZNQV9DT1BZX0lGX05PVF9OVUxMKHZrRGVzdHJveUJ1ZmZlcik7CisgICAgICAgIFZNQV9DT1BZX0lGX05PVF9OVUxMKHZrQ3JlYXRlSW1hZ2UpOworICAgICAgICBWTUFfQ09QWV9JRl9OT1RfTlVMTCh2a0Rlc3Ryb3lJbWFnZSk7CisgICAgICAgIFZNQV9DT1BZX0lGX05PVF9OVUxMKHZrQ21kQ29weUJ1ZmZlcik7CisjaWYgVk1BX0RFRElDQVRFRF9BTExPQ0FUSU9OCisgICAgICAgIFZNQV9DT1BZX0lGX05PVF9OVUxMKHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUik7CisgICAgICAgIFZNQV9DT1BZX0lGX05PVF9OVUxMKHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSKTsKKyNlbmRpZgorICAgIH0KKworI3VuZGVmIFZNQV9DT1BZX0lGX05PVF9OVUxMCisKKyAgICAvLyBJZiB0aGVzZSBhc3NlcnRzIGFyZSBoaXQsIHlvdSBtdXN0IGVpdGhlciAjZGVmaW5lIFZNQV9TVEFUSUNfVlVMS0FOX0ZVTkNUSU9OUyAxCisgICAgLy8gb3IgcGFzcyB2YWxpZCBwb2ludGVycyBhcyBWbWFBbGxvY2F0b3JDcmVhdGVJbmZvOjpwVnVsa2FuRnVuY3Rpb25zLgorICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMgIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtBbGxvY2F0ZU1lbW9yeSAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0FTU0VSVChtX1Z1bGthbkZ1bmN0aW9ucy52a0ZyZWVNZW1vcnkgIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtNYXBNZW1vcnkgIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtVbm1hcE1lbW9yeSAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0FTU0VSVChtX1Z1bGthbkZ1bmN0aW9ucy52a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzICE9IFZNQV9OVUxMKTsKKyAgICBWTUFfQVNTRVJUKG1fVnVsa2FuRnVuY3Rpb25zLnZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0FTU0VSVChtX1Z1bGthbkZ1bmN0aW9ucy52a0JpbmRCdWZmZXJNZW1vcnkgIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtCaW5kSW1hZ2VNZW1vcnkgIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMgIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0FTU0VSVChtX1Z1bGthbkZ1bmN0aW9ucy52a0NyZWF0ZUJ1ZmZlciAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0FTU0VSVChtX1Z1bGthbkZ1bmN0aW9ucy52a0Rlc3Ryb3lCdWZmZXIgIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtDcmVhdGVJbWFnZSAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0FTU0VSVChtX1Z1bGthbkZ1bmN0aW9ucy52a0Rlc3Ryb3lJbWFnZSAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0FTU0VSVChtX1Z1bGthbkZ1bmN0aW9ucy52a0NtZENvcHlCdWZmZXIgIT0gVk1BX05VTEwpOworI2lmIFZNQV9ERURJQ0FURURfQUxMT0NBVElPTgorICAgIGlmKG1fVXNlS2hyRGVkaWNhdGVkQWxsb2NhdGlvbikKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQobV9WdWxrYW5GdW5jdGlvbnMudmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSICE9IFZNQV9OVUxMKTsKKyAgICAgICAgVk1BX0FTU0VSVChtX1Z1bGthbkZ1bmN0aW9ucy52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiAhPSBWTUFfTlVMTCk7CisgICAgfQorI2VuZGlmCit9CisKK1ZrRGV2aWNlU2l6ZSBWbWFBbGxvY2F0b3JfVDo6Q2FsY1ByZWZlcnJlZEJsb2NrU2l6ZSh1aW50MzJfdCBtZW1UeXBlSW5kZXgpCit7CisgICAgY29uc3QgdWludDMyX3QgaGVhcEluZGV4ID0gTWVtb3J5VHlwZUluZGV4VG9IZWFwSW5kZXgobWVtVHlwZUluZGV4KTsKKyAgICBjb25zdCBWa0RldmljZVNpemUgaGVhcFNpemUgPSBtX01lbVByb3BzLm1lbW9yeUhlYXBzW2hlYXBJbmRleF0uc2l6ZTsKKyAgICBjb25zdCBib29sIGlzU21hbGxIZWFwID0gaGVhcFNpemUgPD0gVk1BX1NNQUxMX0hFQVBfTUFYX1NJWkU7CisgICAgcmV0dXJuIGlzU21hbGxIZWFwID8gKGhlYXBTaXplIC8gOCkgOiBtX1ByZWZlcnJlZExhcmdlSGVhcEJsb2NrU2l6ZTsKK30KKworVmtSZXN1bHQgVm1hQWxsb2NhdG9yX1Q6OkFsbG9jYXRlTWVtb3J5T2ZUeXBlKAorICAgIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgIFZrRGV2aWNlU2l6ZSBhbGlnbm1lbnQsCisgICAgYm9vbCBkZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgIFZrQnVmZmVyIGRlZGljYXRlZEJ1ZmZlciwKKyAgICBWa0ltYWdlIGRlZGljYXRlZEltYWdlLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvJiBjcmVhdGVJbmZvLAorICAgIHVpbnQzMl90IG1lbVR5cGVJbmRleCwKKyAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBzdWJhbGxvY1R5cGUsCisgICAgc2l6ZV90IGFsbG9jYXRpb25Db3VudCwKKyAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbnMpCit7CisgICAgVk1BX0FTU0VSVChwQWxsb2NhdGlvbnMgIT0gVk1BX05VTEwpOworICAgIFZNQV9ERUJVR19MT0coIiAgQWxsb2NhdGVNZW1vcnk6IE1lbW9yeVR5cGVJbmRleD0ldSwgQWxsb2NhdGlvbkNvdW50PSV6dSwgU2l6ZT0lbGx1IiwgbWVtVHlwZUluZGV4LCBhbGxvY2F0aW9uQ291bnQsIHZrTWVtUmVxLnNpemUpOworCisgICAgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8gZmluYWxDcmVhdGVJbmZvID0gY3JlYXRlSW5mbzsKKworICAgIC8vIElmIG1lbW9yeSB0eXBlIGlzIG5vdCBIT1NUX1ZJU0lCTEUsIGRpc2FibGUgTUFQUEVELgorICAgIGlmKChmaW5hbENyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTUFQUEVEX0JJVCkgIT0gMCAmJgorICAgICAgICAobV9NZW1Qcm9wcy5tZW1vcnlUeXBlc1ttZW1UeXBlSW5kZXhdLnByb3BlcnR5RmxhZ3MgJiBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCkgPT0gMCkKKyAgICB7CisgICAgICAgIGZpbmFsQ3JlYXRlSW5mby5mbGFncyAmPSB+Vk1BX0FMTE9DQVRJT05fQ1JFQVRFX01BUFBFRF9CSVQ7CisgICAgfQorCisgICAgVm1hQmxvY2tWZWN0b3IqIGNvbnN0IGJsb2NrVmVjdG9yID0gbV9wQmxvY2tWZWN0b3JzW21lbVR5cGVJbmRleF07CisgICAgVk1BX0FTU0VSVChibG9ja1ZlY3Rvcik7CisKKyAgICBjb25zdCBWa0RldmljZVNpemUgcHJlZmVycmVkQmxvY2tTaXplID0gYmxvY2tWZWN0b3ItPkdldFByZWZlcnJlZEJsb2NrU2l6ZSgpOworICAgIGJvb2wgcHJlZmVyRGVkaWNhdGVkTWVtb3J5ID0KKyAgICAgICAgVk1BX0RFQlVHX0FMV0FZU19ERURJQ0FURURfTUVNT1JZIHx8CisgICAgICAgIGRlZGljYXRlZEFsbG9jYXRpb24gfHwKKyAgICAgICAgLy8gSGV1cmlzdGljczogQWxsb2NhdGUgZGVkaWNhdGVkIG1lbW9yeSBpZiByZXF1ZXN0ZWQgc2l6ZSBpZiBncmVhdGVyIHRoYW4gaGFsZiBvZiBwcmVmZXJyZWQgYmxvY2sgc2l6ZS4KKyAgICAgICAgc2l6ZSA+IHByZWZlcnJlZEJsb2NrU2l6ZSAvIDI7CisKKyAgICBpZihwcmVmZXJEZWRpY2F0ZWRNZW1vcnkgJiYKKyAgICAgICAgKGZpbmFsQ3JlYXRlSW5mby5mbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9ORVZFUl9BTExPQ0FURV9CSVQpID09IDAgJiYKKyAgICAgICAgZmluYWxDcmVhdGVJbmZvLnBvb2wgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICBmaW5hbENyZWF0ZUluZm8uZmxhZ3MgfD0gVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0RFRElDQVRFRF9NRU1PUllfQklUOworICAgIH0KKworICAgIGlmKChmaW5hbENyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfREVESUNBVEVEX01FTU9SWV9CSVQpICE9IDApCisgICAgeworICAgICAgICBpZigoZmluYWxDcmVhdGVJbmZvLmZsYWdzICYgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX05FVkVSX0FMTE9DQVRFX0JJVCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFsbG9jYXRlRGVkaWNhdGVkTWVtb3J5KAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgc3ViYWxsb2NUeXBlLAorICAgICAgICAgICAgICAgIG1lbVR5cGVJbmRleCwKKyAgICAgICAgICAgICAgICAoZmluYWxDcmVhdGVJbmZvLmZsYWdzICYgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX01BUFBFRF9CSVQpICE9IDAsCisgICAgICAgICAgICAgICAgKGZpbmFsQ3JlYXRlSW5mby5mbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9VU0VSX0RBVEFfQ09QWV9TVFJJTkdfQklUKSAhPSAwLAorICAgICAgICAgICAgICAgIGZpbmFsQ3JlYXRlSW5mby5wVXNlckRhdGEsCisgICAgICAgICAgICAgICAgZGVkaWNhdGVkQnVmZmVyLAorICAgICAgICAgICAgICAgIGRlZGljYXRlZEltYWdlLAorICAgICAgICAgICAgICAgIGFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvbnMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZrUmVzdWx0IHJlcyA9IGJsb2NrVmVjdG9yLT5BbGxvY2F0ZSgKKyAgICAgICAgICAgIFZLX05VTExfSEFORExFLCAvLyBoQ3VycmVudFBvb2wKKyAgICAgICAgICAgIG1fQ3VycmVudEZyYW1lSW5kZXgubG9hZCgpLAorICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgIGFsaWdubWVudCwKKyAgICAgICAgICAgIGZpbmFsQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgICAgIGFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgICAgIHBBbGxvY2F0aW9ucyk7CisgICAgICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgLy8gNS4gVHJ5IGRlZGljYXRlZCBtZW1vcnkuCisgICAgICAgIGlmKChmaW5hbENyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTkVWRVJfQUxMT0NBVEVfQklUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSBBbGxvY2F0ZURlZGljYXRlZE1lbW9yeSgKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIHN1YmFsbG9jVHlwZSwKKyAgICAgICAgICAgICAgICBtZW1UeXBlSW5kZXgsCisgICAgICAgICAgICAgICAgKGZpbmFsQ3JlYXRlSW5mby5mbGFncyAmIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9NQVBQRURfQklUKSAhPSAwLAorICAgICAgICAgICAgICAgIChmaW5hbENyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfVVNFUl9EQVRBX0NPUFlfU1RSSU5HX0JJVCkgIT0gMCwKKyAgICAgICAgICAgICAgICBmaW5hbENyZWF0ZUluZm8ucFVzZXJEYXRhLAorICAgICAgICAgICAgICAgIGRlZGljYXRlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBkZWRpY2F0ZWRJbWFnZSwKKyAgICAgICAgICAgICAgICBhbGxvY2F0aW9uQ291bnQsCisgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25zKTsKKyAgICAgICAgICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFN1Y2NlZWRlZDogQWxsb2NhdGVEZWRpY2F0ZWRNZW1vcnkgZnVuY3Rpb24gYWxyZWFkeSBmaWxsZCBwTWVtb3J5LCBub3RoaW5nIG1vcmUgdG8gZG8gaGVyZS4KKyAgICAgICAgICAgICAgICBWTUFfREVCVUdfTE9HKCIgICAgQWxsb2NhdGVkIGFzIERlZGljYXRlZE1lbW9yeSIpOworICAgICAgICAgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEV2ZXJ5dGhpbmcgZmFpbGVkOiBSZXR1cm4gZXJyb3IgY29kZS4KKyAgICAgICAgICAgICAgICBWTUFfREVCVUdfTE9HKCIgICAgdmtBbGxvY2F0ZU1lbW9yeSBGQUlMRUQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitWa1Jlc3VsdCBWbWFBbGxvY2F0b3JfVDo6QWxsb2NhdGVEZWRpY2F0ZWRNZW1vcnkoCisgICAgVmtEZXZpY2VTaXplIHNpemUsCisgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgc3ViYWxsb2NUeXBlLAorICAgIHVpbnQzMl90IG1lbVR5cGVJbmRleCwKKyAgICBib29sIG1hcCwKKyAgICBib29sIGlzVXNlckRhdGFTdHJpbmcsCisgICAgdm9pZCogcFVzZXJEYXRhLAorICAgIFZrQnVmZmVyIGRlZGljYXRlZEJ1ZmZlciwKKyAgICBWa0ltYWdlIGRlZGljYXRlZEltYWdlLAorICAgIHNpemVfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdGlvbkNvdW50ID4gMCAmJiBwQWxsb2NhdGlvbnMpOworCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gYWxsb2NJbmZvID0geyBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTyB9OworICAgIGFsbG9jSW5mby5tZW1vcnlUeXBlSW5kZXggPSBtZW1UeXBlSW5kZXg7CisgICAgYWxsb2NJbmZvLmFsbG9jYXRpb25TaXplID0gc2l6ZTsKKworI2lmIFZNQV9ERURJQ0FURURfQUxMT0NBVElPTgorICAgIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvS0hSIGRlZGljYXRlZEFsbG9jSW5mbyA9IHsgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPX0tIUiB9OworICAgIGlmKG1fVXNlS2hyRGVkaWNhdGVkQWxsb2NhdGlvbikKKyAgICB7CisgICAgICAgIGlmKGRlZGljYXRlZEJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0FTU0VSVChkZWRpY2F0ZWRJbWFnZSA9PSBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgICAgICBkZWRpY2F0ZWRBbGxvY0luZm8uYnVmZmVyID0gZGVkaWNhdGVkQnVmZmVyOworICAgICAgICAgICAgYWxsb2NJbmZvLnBOZXh0ID0gJmRlZGljYXRlZEFsbG9jSW5mbzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGRlZGljYXRlZEltYWdlICE9IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICBkZWRpY2F0ZWRBbGxvY0luZm8uaW1hZ2UgPSBkZWRpY2F0ZWRJbWFnZTsKKyAgICAgICAgICAgIGFsbG9jSW5mby5wTmV4dCA9ICZkZWRpY2F0ZWRBbGxvY0luZm87CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gI2lmIFZNQV9ERURJQ0FURURfQUxMT0NBVElPTgorCisgICAgc2l6ZV90IGFsbG9jSW5kZXg7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICBmb3IoYWxsb2NJbmRleCA9IDA7IGFsbG9jSW5kZXggPCBhbGxvY2F0aW9uQ291bnQ7ICsrYWxsb2NJbmRleCkKKyAgICB7CisgICAgICAgIHJlcyA9IEFsbG9jYXRlRGVkaWNhdGVkTWVtb3J5UGFnZSgKKyAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICBzdWJhbGxvY1R5cGUsCisgICAgICAgICAgICBtZW1UeXBlSW5kZXgsCisgICAgICAgICAgICBhbGxvY0luZm8sCisgICAgICAgICAgICBtYXAsCisgICAgICAgICAgICBpc1VzZXJEYXRhU3RyaW5nLAorICAgICAgICAgICAgcFVzZXJEYXRhLAorICAgICAgICAgICAgcEFsbG9jYXRpb25zICsgYWxsb2NJbmRleCk7CisgICAgICAgIGlmKHJlcyAhPSBWS19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8gUmVnaXN0ZXIgdGhlbSBpbiBtX3BEZWRpY2F0ZWRBbGxvY2F0aW9ucy4KKyAgICAgICAgeworICAgICAgICAgICAgVm1hTXV0ZXhMb2NrV3JpdGUgbG9jayhtX0RlZGljYXRlZEFsbG9jYXRpb25zTXV0ZXhbbWVtVHlwZUluZGV4XSwgbV9Vc2VNdXRleCk7CisgICAgICAgICAgICBBbGxvY2F0aW9uVmVjdG9yVHlwZSogcERlZGljYXRlZEFsbG9jYXRpb25zID0gbV9wRGVkaWNhdGVkQWxsb2NhdGlvbnNbbWVtVHlwZUluZGV4XTsKKyAgICAgICAgICAgIFZNQV9BU1NFUlQocERlZGljYXRlZEFsbG9jYXRpb25zKTsKKyAgICAgICAgICAgIGZvcihhbGxvY0luZGV4ID0gMDsgYWxsb2NJbmRleCA8IGFsbG9jYXRpb25Db3VudDsgKythbGxvY0luZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZtYVZlY3Rvckluc2VydFNvcnRlZDxWbWFQb2ludGVyTGVzcz4oKnBEZWRpY2F0ZWRBbGxvY2F0aW9ucywgcEFsbG9jYXRpb25zW2FsbG9jSW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFZNQV9ERUJVR19MT0coIiAgICBBbGxvY2F0ZWQgRGVkaWNhdGVkTWVtb3J5IENvdW50PSV6dSwgTWVtb3J5VHlwZUluZGV4PSMldSIsIGFsbG9jYXRpb25Db3VudCwgbWVtVHlwZUluZGV4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gRnJlZSBhbGwgYWxyZWFkeSBjcmVhdGVkIGFsbG9jYXRpb25zLgorICAgICAgICB3aGlsZShhbGxvY0luZGV4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFZtYUFsbG9jYXRpb24gY3VyckFsbG9jID0gcEFsbG9jYXRpb25zW2FsbG9jSW5kZXhdOworICAgICAgICAgICAgVmtEZXZpY2VNZW1vcnkgaE1lbW9yeSA9IGN1cnJBbGxvYy0+R2V0TWVtb3J5KCk7CisgICAgCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgVGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIHRoaXMsIGJlY2F1c2UgVnVsa2FuIHNwZWMgYWxsb3dzIHRvIHNraXAgdmtVbm1hcE1lbW9yeQorICAgICAgICAgICAgYmVmb3JlIHZrRnJlZU1lbW9yeS4KKworICAgICAgICAgICAgaWYoY3VyckFsbG9jLT5HZXRNYXBwZWREYXRhKCkgIT0gVk1BX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCptX1Z1bGthbkZ1bmN0aW9ucy52a1VubWFwTWVtb3J5KShtX2hEZXZpY2UsIGhNZW1vcnkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKi8KKyAgICAKKyAgICAgICAgICAgIEZyZWVWdWxrYW5NZW1vcnkobWVtVHlwZUluZGV4LCBjdXJyQWxsb2MtPkdldFNpemUoKSwgaE1lbW9yeSk7CisKKyAgICAgICAgICAgIGN1cnJBbGxvYy0+U2V0VXNlckRhdGEodGhpcywgVk1BX05VTEwpOworICAgICAgICAgICAgdm1hX2RlbGV0ZSh0aGlzLCBjdXJyQWxsb2MpOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KHBBbGxvY2F0aW9ucywgMCwgc2l6ZW9mKFZtYUFsbG9jYXRpb24pICogYWxsb2NhdGlvbkNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitWa1Jlc3VsdCBWbWFBbGxvY2F0b3JfVDo6QWxsb2NhdGVEZWRpY2F0ZWRNZW1vcnlQYWdlKAorICAgIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgIFZtYVN1YmFsbG9jYXRpb25UeXBlIHN1YmFsbG9jVHlwZSwKKyAgICB1aW50MzJfdCBtZW1UeXBlSW5kZXgsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8mIGFsbG9jSW5mbywKKyAgICBib29sIG1hcCwKKyAgICBib29sIGlzVXNlckRhdGFTdHJpbmcsCisgICAgdm9pZCogcFVzZXJEYXRhLAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9uKQoreworICAgIFZrRGV2aWNlTWVtb3J5IGhNZW1vcnkgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1Jlc3VsdCByZXMgPSBBbGxvY2F0ZVZ1bGthbk1lbW9yeSgmYWxsb2NJbmZvLCAmaE1lbW9yeSk7CisgICAgaWYocmVzIDwgMCkKKyAgICB7CisgICAgICAgIFZNQV9ERUJVR19MT0coIiAgICB2a0FsbG9jYXRlTWVtb3J5IEZBSUxFRCIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZvaWQqIHBNYXBwZWREYXRhID0gVk1BX05VTEw7CisgICAgaWYobWFwKQorICAgIHsKKyAgICAgICAgcmVzID0gKCptX1Z1bGthbkZ1bmN0aW9ucy52a01hcE1lbW9yeSkoCisgICAgICAgICAgICBtX2hEZXZpY2UsCisgICAgICAgICAgICBoTWVtb3J5LAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIFZLX1dIT0xFX1NJWkUsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgJnBNYXBwZWREYXRhKTsKKyAgICAgICAgaWYocmVzIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0RFQlVHX0xPRygiICAgIHZrTWFwTWVtb3J5IEZBSUxFRCIpOworICAgICAgICAgICAgRnJlZVZ1bGthbk1lbW9yeShtZW1UeXBlSW5kZXgsIHNpemUsIGhNZW1vcnkpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwQWxsb2NhdGlvbiA9IHZtYV9uZXcodGhpcywgVm1hQWxsb2NhdGlvbl9UKShtX0N1cnJlbnRGcmFtZUluZGV4LmxvYWQoKSwgaXNVc2VyRGF0YVN0cmluZyk7CisgICAgKCpwQWxsb2NhdGlvbiktPkluaXREZWRpY2F0ZWRBbGxvY2F0aW9uKG1lbVR5cGVJbmRleCwgaE1lbW9yeSwgc3ViYWxsb2NUeXBlLCBwTWFwcGVkRGF0YSwgc2l6ZSk7CisgICAgKCpwQWxsb2NhdGlvbiktPlNldFVzZXJEYXRhKHRoaXMsIHBVc2VyRGF0YSk7CisgICAgaWYoVk1BX0RFQlVHX0lOSVRJQUxJWkVfQUxMT0NBVElPTlMpCisgICAgeworICAgICAgICBGaWxsQWxsb2NhdGlvbigqcEFsbG9jYXRpb24sIFZNQV9BTExPQ0FUSU9OX0ZJTExfUEFUVEVSTl9DUkVBVEVEKTsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBWbWFBbGxvY2F0b3JfVDo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrQnVmZmVyIGhCdWZmZXIsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMmIG1lbVJlcSwKKyAgICBib29sJiByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgYm9vbCYgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24pIGNvbnN0Cit7CisjaWYgVk1BX0RFRElDQVRFRF9BTExPQ0FUSU9OCisgICAgaWYobV9Vc2VLaHJEZWRpY2F0ZWRBbGxvY2F0aW9uKQorICAgIHsKKyAgICAgICAgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiBtZW1SZXFJbmZvID0geyBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzJfS0hSIH07CisgICAgICAgIG1lbVJlcUluZm8uYnVmZmVyID0gaEJ1ZmZlcjsKKworICAgICAgICBWa01lbW9yeURlZGljYXRlZFJlcXVpcmVtZW50c0tIUiBtZW1EZWRpY2F0ZWRSZXEgPSB7IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9ERURJQ0FURURfUkVRVUlSRU1FTlRTX0tIUiB9OworCisgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzMktIUiBtZW1SZXEyID0geyBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzJfS0hSIH07CisgICAgICAgIG1lbVJlcTIucE5leHQgPSAmbWVtRGVkaWNhdGVkUmVxOworCisgICAgICAgICgqbV9WdWxrYW5GdW5jdGlvbnMudmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKShtX2hEZXZpY2UsICZtZW1SZXFJbmZvLCAmbWVtUmVxMik7CisKKyAgICAgICAgbWVtUmVxID0gbWVtUmVxMi5tZW1vcnlSZXF1aXJlbWVudHM7CisgICAgICAgIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiA9IChtZW1EZWRpY2F0ZWRSZXEucmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uICE9IFZLX0ZBTFNFKTsKKyAgICAgICAgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24gID0gKG1lbURlZGljYXRlZFJlcS5wcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiAgIT0gVktfRkFMU0UpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gI2lmIFZNQV9ERURJQ0FURURfQUxMT0NBVElPTgorICAgIHsKKyAgICAgICAgKCptX1Z1bGthbkZ1bmN0aW9ucy52a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cykobV9oRGV2aWNlLCBoQnVmZmVyLCAmbWVtUmVxKTsKKyAgICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uID0gZmFsc2U7CisgICAgICAgIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uICA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBWbWFBbGxvY2F0b3JfVDo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtJbWFnZSBoSW1hZ2UsCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMmIG1lbVJlcSwKKyAgICBib29sJiByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgYm9vbCYgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24pIGNvbnN0Cit7CisjaWYgVk1BX0RFRElDQVRFRF9BTExPQ0FUSU9OCisgICAgaWYobV9Vc2VLaHJEZWRpY2F0ZWRBbGxvY2F0aW9uKQorICAgIHsKKyAgICAgICAgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yS0hSIG1lbVJlcUluZm8gPSB7IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yX0tIUiB9OworICAgICAgICBtZW1SZXFJbmZvLmltYWdlID0gaEltYWdlOworCisgICAgICAgIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzS0hSIG1lbURlZGljYXRlZFJlcSA9IHsgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9SRVFVSVJFTUVOVFNfS0hSIH07CisKKyAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSIG1lbVJlcTIgPSB7IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9LSFIgfTsKKyAgICAgICAgbWVtUmVxMi5wTmV4dCA9ICZtZW1EZWRpY2F0ZWRSZXE7CisKKyAgICAgICAgKCptX1Z1bGthbkZ1bmN0aW9ucy52a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUikobV9oRGV2aWNlLCAmbWVtUmVxSW5mbywgJm1lbVJlcTIpOworCisgICAgICAgIG1lbVJlcSA9IG1lbVJlcTIubWVtb3J5UmVxdWlyZW1lbnRzOworICAgICAgICByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gPSAobWVtRGVkaWNhdGVkUmVxLnJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiAhPSBWS19GQUxTRSk7CisgICAgICAgIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uICA9IChtZW1EZWRpY2F0ZWRSZXEucHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24gICE9IFZLX0ZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vICNpZiBWTUFfREVESUNBVEVEX0FMTE9DQVRJT04KKyAgICB7CisgICAgICAgICgqbV9WdWxrYW5GdW5jdGlvbnMudmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cykobV9oRGV2aWNlLCBoSW1hZ2UsICZtZW1SZXEpOworICAgICAgICByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gPSBmYWxzZTsKKyAgICAgICAgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24gID0gZmFsc2U7CisgICAgfQorfQorCitWa1Jlc3VsdCBWbWFBbGxvY2F0b3JfVDo6QWxsb2NhdGVNZW1vcnkoCisgICAgY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMmIHZrTWVtUmVxLAorICAgIGJvb2wgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgIGJvb2wgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgVmtCdWZmZXIgZGVkaWNhdGVkQnVmZmVyLAorICAgIFZrSW1hZ2UgZGVkaWNhdGVkSW1hZ2UsCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8mIGNyZWF0ZUluZm8sCisgICAgVm1hU3ViYWxsb2NhdGlvblR5cGUgc3ViYWxsb2NUeXBlLAorICAgIHNpemVfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKQoreworICAgIG1lbXNldChwQWxsb2NhdGlvbnMsIDAsIHNpemVvZihWbWFBbGxvY2F0aW9uKSAqIGFsbG9jYXRpb25Db3VudCk7CisKKyAgICBWTUFfQVNTRVJUKFZtYUlzUG93Mih2a01lbVJlcS5hbGlnbm1lbnQpKTsKKworICAgIGlmKHZrTWVtUmVxLnNpemUgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIGlmKChjcmVhdGVJbmZvLmZsYWdzICYgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0RFRElDQVRFRF9NRU1PUllfQklUKSAhPSAwICYmCisgICAgICAgIChjcmVhdGVJbmZvLmZsYWdzICYgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX05FVkVSX0FMTE9DQVRFX0JJVCkgIT0gMCkKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiU3BlY2lmeWluZyBWTUFfQUxMT0NBVElPTl9DUkVBVEVfREVESUNBVEVEX01FTU9SWV9CSVQgdG9nZXRoZXIgd2l0aCBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTkVWRVJfQUxMT0NBVEVfQklUIG1ha2VzIG5vIHNlbnNlLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlk7CisgICAgfQorICAgIGlmKChjcmVhdGVJbmZvLmZsYWdzICYgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX01BUFBFRF9CSVQpICE9IDAgJiYKKyAgICAgICAgKGNyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfQ0FOX0JFQ09NRV9MT1NUX0JJVCkgIT0gMCkKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQoMCAmJiAiU3BlY2lmeWluZyBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTUFQUEVEX0JJVCB0b2dldGhlciB3aXRoIFZNQV9BTExPQ0FUSU9OX0NSRUFURV9DQU5fQkVDT01FX0xPU1RfQklUIGlzIGludmFsaWQuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWTsKKyAgICB9CisgICAgaWYocmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uKQorICAgIHsKKyAgICAgICAgaWYoKGNyZWF0ZUluZm8uZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTkVWRVJfQUxMT0NBVEVfQklUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIlZNQV9BTExPQ0FUSU9OX0NSRUFURV9ORVZFUl9BTExPQ0FURV9CSVQgc3BlY2lmaWVkIHdoaWxlIGRlZGljYXRlZCBhbGxvY2F0aW9uIGlzIHJlcXVpcmVkLiIpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmKGNyZWF0ZUluZm8ucG9vbCAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0FTU0VSVCgwICYmICJQb29sIHNwZWNpZmllZCB3aGlsZSBkZWRpY2F0ZWQgYWxsb2NhdGlvbiBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZigoY3JlYXRlSW5mby5wb29sICE9IFZLX05VTExfSEFORExFKSAmJgorICAgICAgICAoKGNyZWF0ZUluZm8uZmxhZ3MgJiAoVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0RFRElDQVRFRF9NRU1PUllfQklUKSkgIT0gMCkpCisgICAgeworICAgICAgICBWTUFfQVNTRVJUKDAgJiYgIlNwZWNpZnlpbmcgVk1BX0FMTE9DQVRJT05fQ1JFQVRFX0RFRElDQVRFRF9NRU1PUllfQklUIHdoZW4gcG9vbCAhPSBudWxsIGlzIGludmFsaWQuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWTsKKyAgICB9CisKKyAgICBpZihjcmVhdGVJbmZvLnBvb2wgIT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICBjb25zdCBWa0RldmljZVNpemUgYWxpZ25tZW50Rm9yUG9vbCA9IFZNQV9NQVgoCisgICAgICAgICAgICB2a01lbVJlcS5hbGlnbm1lbnQsCisgICAgICAgICAgICBHZXRNZW1vcnlUeXBlTWluQWxpZ25tZW50KGNyZWF0ZUluZm8ucG9vbC0+bV9CbG9ja1ZlY3Rvci5HZXRNZW1vcnlUeXBlSW5kZXgoKSkpOworICAgICAgICByZXR1cm4gY3JlYXRlSW5mby5wb29sLT5tX0Jsb2NrVmVjdG9yLkFsbG9jYXRlKAorICAgICAgICAgICAgY3JlYXRlSW5mby5wb29sLAorICAgICAgICAgICAgbV9DdXJyZW50RnJhbWVJbmRleC5sb2FkKCksCisgICAgICAgICAgICB2a01lbVJlcS5zaXplLAorICAgICAgICAgICAgYWxpZ25tZW50Rm9yUG9vbCwKKyAgICAgICAgICAgIGNyZWF0ZUluZm8sCisgICAgICAgICAgICBzdWJhbGxvY1R5cGUsCisgICAgICAgICAgICBhbGxvY2F0aW9uQ291bnQsCisgICAgICAgICAgICBwQWxsb2NhdGlvbnMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBCaXQgbWFzayBvZiBtZW1vcnkgVnVsa2FuIHR5cGVzIGFjY2VwdGFibGUgZm9yIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHMgPSB2a01lbVJlcS5tZW1vcnlUeXBlQml0czsKKyAgICAgICAgdWludDMyX3QgbWVtVHlwZUluZGV4ID0gVUlOVDMyX01BWDsKKyAgICAgICAgVmtSZXN1bHQgcmVzID0gdm1hRmluZE1lbW9yeVR5cGVJbmRleCh0aGlzLCBtZW1vcnlUeXBlQml0cywgJmNyZWF0ZUluZm8sICZtZW1UeXBlSW5kZXgpOworICAgICAgICBpZihyZXMgPT0gVktfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgVmtEZXZpY2VTaXplIGFsaWdubWVudEZvck1lbVR5cGUgPSBWTUFfTUFYKAorICAgICAgICAgICAgICAgIHZrTWVtUmVxLmFsaWdubWVudCwKKyAgICAgICAgICAgICAgICBHZXRNZW1vcnlUeXBlTWluQWxpZ25tZW50KG1lbVR5cGVJbmRleCkpOworCisgICAgICAgICAgICByZXMgPSBBbGxvY2F0ZU1lbW9yeU9mVHlwZSgKKyAgICAgICAgICAgICAgICB2a01lbVJlcS5zaXplLAorICAgICAgICAgICAgICAgIGFsaWdubWVudEZvck1lbVR5cGUsCisgICAgICAgICAgICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uIHx8IHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICAgICAgICAgIGRlZGljYXRlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBkZWRpY2F0ZWRJbWFnZSwKKyAgICAgICAgICAgICAgICBjcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgIG1lbVR5cGVJbmRleCwKKyAgICAgICAgICAgICAgICBzdWJhbGxvY1R5cGUsCisgICAgICAgICAgICAgICAgYWxsb2NhdGlvbkNvdW50LAorICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9ucyk7CisgICAgICAgICAgICAvLyBTdWNjZWVkZWQgb24gZmlyc3QgdHJ5LgorICAgICAgICAgICAgaWYocmVzID09IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFsbG9jYXRpb24gZnJvbSB0aGlzIG1lbW9yeSB0eXBlIGZhaWxlZC4gVHJ5IG90aGVyIGNvbXBhdGlibGUgbWVtb3J5IHR5cGVzLgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcig7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBvbGQgbWVtVHlwZUluZGV4IGZyb20gbGlzdCBvZiBwb3NzaWJpbGl0aWVzLgorICAgICAgICAgICAgICAgICAgICBtZW1vcnlUeXBlQml0cyAmPSB+KDF1IDw8IG1lbVR5cGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgYWx0ZXJuYXRpdmUgbWVtVHlwZUluZGV4LgorICAgICAgICAgICAgICAgICAgICByZXMgPSB2bWFGaW5kTWVtb3J5VHlwZUluZGV4KHRoaXMsIG1lbW9yeVR5cGVCaXRzLCAmY3JlYXRlSW5mbywgJm1lbVR5cGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb3JNZW1UeXBlID0gVk1BX01BWCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2a01lbVJlcS5hbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TWVtb3J5VHlwZU1pbkFsaWdubWVudChtZW1UeXBlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQWxsb2NhdGVNZW1vcnlPZlR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmtNZW1SZXEuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb3JNZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiB8fCBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWRpY2F0ZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVkaWNhdGVkSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1UeXBlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYWxsb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGlvbiBmcm9tIHRoaXMgYWx0ZXJuYXRpdmUgbWVtb3J5IHR5cGUgc3VjY2VlZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzID09IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2U6IEFsbG9jYXRpb24gZnJvbSB0aGlzIG1lbW9yeSB0eXBlIGZhaWxlZC4gVHJ5IG5leHQgb25lIC0gbmV4dCBsb29wIGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBObyBvdGhlciBtYXRjaGluZyBtZW1vcnkgdHlwZSBpbmRleCBjb3VsZCBiZSBmb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgcmV0dXJuaW5nIHJlcywgd2hpY2ggaXMgVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVCwgYmVjYXVzZSB3ZSBhbHJlYWR5IGZhaWxlZCB0byBhbGxvY2F0ZSBvbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENhbid0IGZpbmQgYW55IHNpbmdsZSBtZW1vcnkgdHlwZSBtYWNoaW5nIHJlcXVpcmVtZW50cy4gcmVzIGlzIFZLX0VSUk9SX0ZFQVRVUkVfTk9UX1BSRVNFTlQuCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgfQorfQorCit2b2lkIFZtYUFsbG9jYXRvcl9UOjpGcmVlTWVtb3J5KAorICAgIHNpemVfdCBhbGxvY2F0aW9uQ291bnQsCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb25zKQoreworICAgIFZNQV9BU1NFUlQocEFsbG9jYXRpb25zKTsKKworICAgIGZvcihzaXplX3QgYWxsb2NJbmRleCA9IGFsbG9jYXRpb25Db3VudDsgYWxsb2NJbmRleC0tOyApCisgICAgeworICAgICAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24gPSBwQWxsb2NhdGlvbnNbYWxsb2NJbmRleF07CisKKyAgICAgICAgaWYoYWxsb2NhdGlvbiAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVG91Y2hBbGxvY2F0aW9uKGFsbG9jYXRpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKFZNQV9ERUJVR19JTklUSUFMSVpFX0FMTE9DQVRJT05TKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsbEFsbG9jYXRpb24oYWxsb2NhdGlvbiwgVk1BX0FMTE9DQVRJT05fRklMTF9QQVRURVJOX0RFU1RST1lFRCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoKGFsbG9jYXRpb24tPkdldFR5cGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBWbWFBbGxvY2F0aW9uX1Q6OkFMTE9DQVRJT05fVFlQRV9CTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVm1hQmxvY2tWZWN0b3IqIHBCbG9ja1ZlY3RvciA9IFZNQV9OVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgVm1hUG9vbCBoUG9vbCA9IGFsbG9jYXRpb24tPkdldFBvb2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhQb29sICE9IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCbG9ja1ZlY3RvciA9ICZoUG9vbC0+bV9CbG9ja1ZlY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtZW1UeXBlSW5kZXggPSBhbGxvY2F0aW9uLT5HZXRNZW1vcnlUeXBlSW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmxvY2tWZWN0b3IgPSBtX3BCbG9ja1ZlY3RvcnNbbWVtVHlwZUluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBCbG9ja1ZlY3Rvci0+RnJlZShhbGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZtYUFsbG9jYXRpb25fVDo6QUxMT0NBVElPTl9UWVBFX0RFRElDQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgRnJlZURlZGljYXRlZE1lbW9yeShhbGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFsbG9jYXRpb24tPlNldFVzZXJEYXRhKHRoaXMsIFZNQV9OVUxMKTsKKyAgICAgICAgICAgIHZtYV9kZWxldGUodGhpcywgYWxsb2NhdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZrUmVzdWx0IFZtYUFsbG9jYXRvcl9UOjpSZXNpemVBbGxvY2F0aW9uKAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb24gYWxsb2MsCisgICAgVmtEZXZpY2VTaXplIG5ld1NpemUpCit7CisgICAgaWYobmV3U2l6ZSA9PSAwIHx8IGFsbG9jLT5HZXRMYXN0VXNlRnJhbWVJbmRleCgpID09IFZNQV9GUkFNRV9JTkRFWF9MT1NUKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgaWYobmV3U2l6ZSA9PSBhbGxvYy0+R2V0U2l6ZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgc3dpdGNoKGFsbG9jLT5HZXRUeXBlKCkpCisgICAgeworICAgIGNhc2UgVm1hQWxsb2NhdGlvbl9UOjpBTExPQ0FUSU9OX1RZUEVfREVESUNBVEVEOgorICAgICAgICByZXR1cm4gVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVDsKKyAgICBjYXNlIFZtYUFsbG9jYXRpb25fVDo6QUxMT0NBVElPTl9UWVBFX0JMT0NLOgorICAgICAgICBpZihhbGxvYy0+R2V0QmxvY2soKS0+bV9wTWV0YWRhdGEtPlJlc2l6ZUFsbG9jYXRpb24oYWxsb2MsIG5ld1NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICBhbGxvYy0+Q2hhbmdlU2l6ZShuZXdTaXplKTsKKyAgICAgICAgICAgIFZNQV9IRUFWWV9BU1NFUlQoYWxsb2MtPkdldEJsb2NrKCktPm1fcE1ldGFkYXRhLT5WYWxpZGF0ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9QT09MX01FTU9SWTsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIFZNQV9BU1NFUlQoMCk7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorfQorCit2b2lkIFZtYUFsbG9jYXRvcl9UOjpDYWxjdWxhdGVTdGF0cyhWbWFTdGF0cyogcFN0YXRzKQoreworICAgIC8vIEluaXRpYWxpemUuCisgICAgSW5pdFN0YXRJbmZvKHBTdGF0cy0+dG90YWwpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBWS19NQVhfTUVNT1JZX1RZUEVTOyArK2kpCisgICAgICAgIEluaXRTdGF0SW5mbyhwU3RhdHMtPm1lbW9yeVR5cGVbaV0pOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBWS19NQVhfTUVNT1JZX0hFQVBTOyArK2kpCisgICAgICAgIEluaXRTdGF0SW5mbyhwU3RhdHMtPm1lbW9yeUhlYXBbaV0pOworICAgIAorICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBwb29scy4KKyAgICBmb3IodWludDMyX3QgbWVtVHlwZUluZGV4ID0gMDsgbWVtVHlwZUluZGV4IDwgR2V0TWVtb3J5VHlwZUNvdW50KCk7ICsrbWVtVHlwZUluZGV4KQorICAgIHsKKyAgICAgICAgVm1hQmxvY2tWZWN0b3IqIGNvbnN0IHBCbG9ja1ZlY3RvciA9IG1fcEJsb2NrVmVjdG9yc1ttZW1UeXBlSW5kZXhdOworICAgICAgICBWTUFfQVNTRVJUKHBCbG9ja1ZlY3Rvcik7CisgICAgICAgIHBCbG9ja1ZlY3Rvci0+QWRkU3RhdHMocFN0YXRzKTsKKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIGN1c3RvbSBwb29scy4KKyAgICB7CisgICAgICAgIFZtYU11dGV4TG9ja1JlYWQgbG9jayhtX1Bvb2xzTXV0ZXgsIG1fVXNlTXV0ZXgpOworICAgICAgICBmb3Ioc2l6ZV90IHBvb2xJbmRleCA9IDAsIHBvb2xDb3VudCA9IG1fUG9vbHMuc2l6ZSgpOyBwb29sSW5kZXggPCBwb29sQ291bnQ7ICsrcG9vbEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBtX1Bvb2xzW3Bvb2xJbmRleF0tPm1fQmxvY2tWZWN0b3IuQWRkU3RhdHMocFN0YXRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByb2Nlc3MgZGVkaWNhdGVkIGFsbG9jYXRpb25zLgorICAgIGZvcih1aW50MzJfdCBtZW1UeXBlSW5kZXggPSAwOyBtZW1UeXBlSW5kZXggPCBHZXRNZW1vcnlUeXBlQ291bnQoKTsgKyttZW1UeXBlSW5kZXgpCisgICAgeworICAgICAgICBjb25zdCB1aW50MzJfdCBtZW1IZWFwSW5kZXggPSBNZW1vcnlUeXBlSW5kZXhUb0hlYXBJbmRleChtZW1UeXBlSW5kZXgpOworICAgICAgICBWbWFNdXRleExvY2tSZWFkIGRlZGljYXRlZEFsbG9jYXRpb25zTG9jayhtX0RlZGljYXRlZEFsbG9jYXRpb25zTXV0ZXhbbWVtVHlwZUluZGV4XSwgbV9Vc2VNdXRleCk7CisgICAgICAgIEFsbG9jYXRpb25WZWN0b3JUeXBlKiBjb25zdCBwRGVkaWNhdGVkQWxsb2NWZWN0b3IgPSBtX3BEZWRpY2F0ZWRBbGxvY2F0aW9uc1ttZW1UeXBlSW5kZXhdOworICAgICAgICBWTUFfQVNTRVJUKHBEZWRpY2F0ZWRBbGxvY1ZlY3Rvcik7CisgICAgICAgIGZvcihzaXplX3QgYWxsb2NJbmRleCA9IDAsIGFsbG9jQ291bnQgPSBwRGVkaWNhdGVkQWxsb2NWZWN0b3ItPnNpemUoKTsgYWxsb2NJbmRleCA8IGFsbG9jQ291bnQ7ICsrYWxsb2NJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgVm1hU3RhdEluZm8gYWxsb2NhdGlvblN0YXRJbmZvOworICAgICAgICAgICAgKCpwRGVkaWNhdGVkQWxsb2NWZWN0b3IpW2FsbG9jSW5kZXhdLT5EZWRpY2F0ZWRBbGxvY0NhbGNTdGF0c0luZm8oYWxsb2NhdGlvblN0YXRJbmZvKTsKKyAgICAgICAgICAgIFZtYUFkZFN0YXRJbmZvKHBTdGF0cy0+dG90YWwsIGFsbG9jYXRpb25TdGF0SW5mbyk7CisgICAgICAgICAgICBWbWFBZGRTdGF0SW5mbyhwU3RhdHMtPm1lbW9yeVR5cGVbbWVtVHlwZUluZGV4XSwgYWxsb2NhdGlvblN0YXRJbmZvKTsKKyAgICAgICAgICAgIFZtYUFkZFN0YXRJbmZvKHBTdGF0cy0+bWVtb3J5SGVhcFttZW1IZWFwSW5kZXhdLCBhbGxvY2F0aW9uU3RhdEluZm8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUG9zdHByb2Nlc3MuCisgICAgVm1hUG9zdHByb2Nlc3NDYWxjU3RhdEluZm8ocFN0YXRzLT50b3RhbCk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IEdldE1lbW9yeVR5cGVDb3VudCgpOyArK2kpCisgICAgICAgIFZtYVBvc3Rwcm9jZXNzQ2FsY1N0YXRJbmZvKHBTdGF0cy0+bWVtb3J5VHlwZVtpXSk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IEdldE1lbW9yeUhlYXBDb3VudCgpOyArK2kpCisgICAgICAgIFZtYVBvc3Rwcm9jZXNzQ2FsY1N0YXRJbmZvKHBTdGF0cy0+bWVtb3J5SGVhcFtpXSk7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBWTUFfVkVORE9SX0lEX0FNRCA9IDQwOTg7CisKK1ZrUmVzdWx0IFZtYUFsbG9jYXRvcl9UOjpEZWZyYWdtZW50YXRpb25CZWdpbigKKyAgICBjb25zdCBWbWFEZWZyYWdtZW50YXRpb25JbmZvMiYgaW5mbywKKyAgICBWbWFEZWZyYWdtZW50YXRpb25TdGF0cyogcFN0YXRzLAorICAgIFZtYURlZnJhZ21lbnRhdGlvbkNvbnRleHQqIHBDb250ZXh0KQoreworICAgIGlmKGluZm8ucEFsbG9jYXRpb25zQ2hhbmdlZCAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIG1lbXNldChpbmZvLnBBbGxvY2F0aW9uc0NoYW5nZWQsIDAsIGluZm8uYWxsb2NhdGlvbkNvdW50ICogc2l6ZW9mKFZrQm9vbDMyKSk7CisgICAgfQorCisgICAgKnBDb250ZXh0ID0gdm1hX25ldyh0aGlzLCBWbWFEZWZyYWdtZW50YXRpb25Db250ZXh0X1QpKAorICAgICAgICB0aGlzLCBtX0N1cnJlbnRGcmFtZUluZGV4LmxvYWQoKSwgaW5mby5mbGFncywgcFN0YXRzKTsKKworICAgICgqcENvbnRleHQpLT5BZGRQb29scyhpbmZvLnBvb2xDb3VudCwgaW5mby5wUG9vbHMpOworICAgICgqcENvbnRleHQpLT5BZGRBbGxvY2F0aW9ucygKKyAgICAgICAgaW5mby5hbGxvY2F0aW9uQ291bnQsIGluZm8ucEFsbG9jYXRpb25zLCBpbmZvLnBBbGxvY2F0aW9uc0NoYW5nZWQpOworCisgICAgVmtSZXN1bHQgcmVzID0gKCpwQ29udGV4dCktPkRlZnJhZ21lbnQoCisgICAgICAgIGluZm8ubWF4Q3B1Qnl0ZXNUb01vdmUsIGluZm8ubWF4Q3B1QWxsb2NhdGlvbnNUb01vdmUsCisgICAgICAgIGluZm8ubWF4R3B1Qnl0ZXNUb01vdmUsIGluZm8ubWF4R3B1QWxsb2NhdGlvbnNUb01vdmUsCisgICAgICAgIGluZm8uY29tbWFuZEJ1ZmZlciwgcFN0YXRzKTsKKworICAgIGlmKHJlcyAhPSBWS19OT1RfUkVBRFkpCisgICAgeworICAgICAgICB2bWFfZGVsZXRlKHRoaXMsICpwQ29udGV4dCk7CisgICAgICAgICpwQ29udGV4dCA9IFZNQV9OVUxMOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK1ZrUmVzdWx0IFZtYUFsbG9jYXRvcl9UOjpEZWZyYWdtZW50YXRpb25FbmQoCisgICAgVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dCBjb250ZXh0KQoreworICAgIHZtYV9kZWxldGUodGhpcywgY29udGV4dCk7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgVm1hQWxsb2NhdG9yX1Q6OkdldEFsbG9jYXRpb25JbmZvKFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sIFZtYUFsbG9jYXRpb25JbmZvKiBwQWxsb2NhdGlvbkluZm8pCit7CisgICAgaWYoaEFsbG9jYXRpb24tPkNhbkJlY29tZUxvc3QoKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgIFdhcm5pbmc6IFRoaXMgaXMgYSBjYXJlZnVsbHkgZGVzaWduZWQgYWxnb3JpdGhtLgorICAgICAgICBEbyBub3QgbW9kaWZ5IHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgOikKKyAgICAgICAgKi8KKyAgICAgICAgY29uc3QgdWludDMyX3QgbG9jYWxDdXJyRnJhbWVJbmRleCA9IG1fQ3VycmVudEZyYW1lSW5kZXgubG9hZCgpOworICAgICAgICB1aW50MzJfdCBsb2NhbExhc3RVc2VGcmFtZUluZGV4ID0gaEFsbG9jYXRpb24tPkdldExhc3RVc2VGcmFtZUluZGV4KCk7CisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgaWYobG9jYWxMYXN0VXNlRnJhbWVJbmRleCA9PSBWTUFfRlJBTUVfSU5ERVhfTE9TVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWxsb2NhdGlvbkluZm8tPm1lbW9yeVR5cGUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+ZGV2aWNlTWVtb3J5ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25JbmZvLT5vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+c2l6ZSA9IGhBbGxvY2F0aW9uLT5HZXRTaXplKCk7CisgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25JbmZvLT5wTWFwcGVkRGF0YSA9IFZNQV9OVUxMOworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+cFVzZXJEYXRhID0gaEFsbG9jYXRpb24tPkdldFVzZXJEYXRhKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihsb2NhbExhc3RVc2VGcmFtZUluZGV4ID09IGxvY2FsQ3VyckZyYW1lSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25JbmZvLT5tZW1vcnlUeXBlID0gaEFsbG9jYXRpb24tPkdldE1lbW9yeVR5cGVJbmRleCgpOworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+ZGV2aWNlTWVtb3J5ID0gaEFsbG9jYXRpb24tPkdldE1lbW9yeSgpOworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+b2Zmc2V0ID0gaEFsbG9jYXRpb24tPkdldE9mZnNldCgpOworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+c2l6ZSA9IGhBbGxvY2F0aW9uLT5HZXRTaXplKCk7CisgICAgICAgICAgICAgICAgcEFsbG9jYXRpb25JbmZvLT5wTWFwcGVkRGF0YSA9IFZNQV9OVUxMOworICAgICAgICAgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+cFVzZXJEYXRhID0gaEFsbG9jYXRpb24tPkdldFVzZXJEYXRhKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvLyBMYXN0IHVzZSB0aW1lIGVhcmxpZXIgdGhhbiBjdXJyZW50IHRpbWUuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoaEFsbG9jYXRpb24tPkNvbXBhcmVFeGNoYW5nZUxhc3RVc2VGcmFtZUluZGV4KGxvY2FsTGFzdFVzZUZyYW1lSW5kZXgsIGxvY2FsQ3VyckZyYW1lSW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxMYXN0VXNlRnJhbWVJbmRleCA9IGxvY2FsQ3VyckZyYW1lSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisgICAgICAgIHVpbnQzMl90IGxvY2FsQ3VyckZyYW1lSW5kZXggPSBtX0N1cnJlbnRGcmFtZUluZGV4LmxvYWQoKTsKKyAgICAgICAgdWludDMyX3QgbG9jYWxMYXN0VXNlRnJhbWVJbmRleCA9IGhBbGxvY2F0aW9uLT5HZXRMYXN0VXNlRnJhbWVJbmRleCgpOworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9BU1NFUlQobG9jYWxMYXN0VXNlRnJhbWVJbmRleCAhPSBWTUFfRlJBTUVfSU5ERVhfTE9TVCk7CisgICAgICAgICAgICBpZihsb2NhbExhc3RVc2VGcmFtZUluZGV4ID09IGxvY2FsQ3VyckZyYW1lSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8vIExhc3QgdXNlIHRpbWUgZWFybGllciB0aGFuIGN1cnJlbnQgdGltZS4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihoQWxsb2NhdGlvbi0+Q29tcGFyZUV4Y2hhbmdlTGFzdFVzZUZyYW1lSW5kZXgobG9jYWxMYXN0VXNlRnJhbWVJbmRleCwgbG9jYWxDdXJyRnJhbWVJbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbExhc3RVc2VGcmFtZUluZGV4ID0gbG9jYWxDdXJyRnJhbWVJbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+bWVtb3J5VHlwZSA9IGhBbGxvY2F0aW9uLT5HZXRNZW1vcnlUeXBlSW5kZXgoKTsKKyAgICAgICAgcEFsbG9jYXRpb25JbmZvLT5kZXZpY2VNZW1vcnkgPSBoQWxsb2NhdGlvbi0+R2V0TWVtb3J5KCk7CisgICAgICAgIHBBbGxvY2F0aW9uSW5mby0+b2Zmc2V0ID0gaEFsbG9jYXRpb24tPkdldE9mZnNldCgpOworICAgICAgICBwQWxsb2NhdGlvbkluZm8tPnNpemUgPSBoQWxsb2NhdGlvbi0+R2V0U2l6ZSgpOworICAgICAgICBwQWxsb2NhdGlvbkluZm8tPnBNYXBwZWREYXRhID0gaEFsbG9jYXRpb24tPkdldE1hcHBlZERhdGEoKTsKKyAgICAgICAgcEFsbG9jYXRpb25JbmZvLT5wVXNlckRhdGEgPSBoQWxsb2NhdGlvbi0+R2V0VXNlckRhdGEoKTsKKyAgICB9Cit9CisKK2Jvb2wgVm1hQWxsb2NhdG9yX1Q6OlRvdWNoQWxsb2NhdGlvbihWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uKQoreworICAgIC8vIFRoaXMgaXMgYSBzdHJpcHBlZC1kb3duIHZlcnNpb24gb2YgVm1hQWxsb2NhdG9yX1Q6OkdldEFsbG9jYXRpb25JbmZvLgorICAgIGlmKGhBbGxvY2F0aW9uLT5DYW5CZWNvbWVMb3N0KCkpCisgICAgeworICAgICAgICB1aW50MzJfdCBsb2NhbEN1cnJGcmFtZUluZGV4ID0gbV9DdXJyZW50RnJhbWVJbmRleC5sb2FkKCk7CisgICAgICAgIHVpbnQzMl90IGxvY2FsTGFzdFVzZUZyYW1lSW5kZXggPSBoQWxsb2NhdGlvbi0+R2V0TGFzdFVzZUZyYW1lSW5kZXgoKTsKKyAgICAgICAgZm9yKDs7KQorICAgICAgICB7CisgICAgICAgICAgICBpZihsb2NhbExhc3RVc2VGcmFtZUluZGV4ID09IFZNQV9GUkFNRV9JTkRFWF9MT1NUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYobG9jYWxMYXN0VXNlRnJhbWVJbmRleCA9PSBsb2NhbEN1cnJGcmFtZUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvLyBMYXN0IHVzZSB0aW1lIGVhcmxpZXIgdGhhbiBjdXJyZW50IHRpbWUuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoaEFsbG9jYXRpb24tPkNvbXBhcmVFeGNoYW5nZUxhc3RVc2VGcmFtZUluZGV4KGxvY2FsTGFzdFVzZUZyYW1lSW5kZXgsIGxvY2FsQ3VyckZyYW1lSW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxMYXN0VXNlRnJhbWVJbmRleCA9IGxvY2FsQ3VyckZyYW1lSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisgICAgICAgIHVpbnQzMl90IGxvY2FsQ3VyckZyYW1lSW5kZXggPSBtX0N1cnJlbnRGcmFtZUluZGV4LmxvYWQoKTsKKyAgICAgICAgdWludDMyX3QgbG9jYWxMYXN0VXNlRnJhbWVJbmRleCA9IGhBbGxvY2F0aW9uLT5HZXRMYXN0VXNlRnJhbWVJbmRleCgpOworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZNQV9BU1NFUlQobG9jYWxMYXN0VXNlRnJhbWVJbmRleCAhPSBWTUFfRlJBTUVfSU5ERVhfTE9TVCk7CisgICAgICAgICAgICBpZihsb2NhbExhc3RVc2VGcmFtZUluZGV4ID09IGxvY2FsQ3VyckZyYW1lSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8vIExhc3QgdXNlIHRpbWUgZWFybGllciB0aGFuIGN1cnJlbnQgdGltZS4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihoQWxsb2NhdGlvbi0+Q29tcGFyZUV4Y2hhbmdlTGFzdFVzZUZyYW1lSW5kZXgobG9jYWxMYXN0VXNlRnJhbWVJbmRleCwgbG9jYWxDdXJyRnJhbWVJbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NhbExhc3RVc2VGcmFtZUluZGV4ID0gbG9jYWxDdXJyRnJhbWVJbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworVmtSZXN1bHQgVm1hQWxsb2NhdG9yX1Q6OkNyZWF0ZVBvb2woY29uc3QgVm1hUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWbWFQb29sKiBwUG9vbCkKK3sKKyAgICBWTUFfREVCVUdfTE9HKCIgIENyZWF0ZVBvb2w6IE1lbW9yeVR5cGVJbmRleD0ldSwgZmxhZ3M9JXUiLCBwQ3JlYXRlSW5mby0+bWVtb3J5VHlwZUluZGV4LCBwQ3JlYXRlSW5mby0+ZmxhZ3MpOworCisgICAgVm1hUG9vbENyZWF0ZUluZm8gbmV3Q3JlYXRlSW5mbyA9ICpwQ3JlYXRlSW5mbzsKKworICAgIGlmKG5ld0NyZWF0ZUluZm8ubWF4QmxvY2tDb3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgbmV3Q3JlYXRlSW5mby5tYXhCbG9ja0NvdW50ID0gU0laRV9NQVg7CisgICAgfQorICAgIGlmKG5ld0NyZWF0ZUluZm8ubWluQmxvY2tDb3VudCA+IG5ld0NyZWF0ZUluZm8ubWF4QmxvY2tDb3VudCkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgY29uc3QgVmtEZXZpY2VTaXplIHByZWZlcnJlZEJsb2NrU2l6ZSA9IENhbGNQcmVmZXJyZWRCbG9ja1NpemUobmV3Q3JlYXRlSW5mby5tZW1vcnlUeXBlSW5kZXgpOworCisgICAgKnBQb29sID0gdm1hX25ldyh0aGlzLCBWbWFQb29sX1QpKHRoaXMsIG5ld0NyZWF0ZUluZm8sIHByZWZlcnJlZEJsb2NrU2l6ZSk7CisKKyAgICBWa1Jlc3VsdCByZXMgPSAoKnBQb29sKS0+bV9CbG9ja1ZlY3Rvci5DcmVhdGVNaW5CbG9ja3MoKTsKKyAgICBpZihyZXMgIT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHZtYV9kZWxldGUodGhpcywgKnBQb29sKTsKKyAgICAgICAgKnBQb29sID0gVk1BX05VTEw7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gQWRkIHRvIG1fUG9vbHMuCisgICAgeworICAgICAgICBWbWFNdXRleExvY2tXcml0ZSBsb2NrKG1fUG9vbHNNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgICAgICgqcFBvb2wpLT5TZXRJZChtX05leHRQb29sSWQrKyk7CisgICAgICAgIFZtYVZlY3Rvckluc2VydFNvcnRlZDxWbWFQb2ludGVyTGVzcz4obV9Qb29scywgKnBQb29sKTsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBWbWFBbGxvY2F0b3JfVDo6RGVzdHJveVBvb2woVm1hUG9vbCBwb29sKQoreworICAgIC8vIFJlbW92ZSBmcm9tIG1fUG9vbHMuCisgICAgeworICAgICAgICBWbWFNdXRleExvY2tXcml0ZSBsb2NrKG1fUG9vbHNNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IFZtYVZlY3RvclJlbW92ZVNvcnRlZDxWbWFQb2ludGVyTGVzcz4obV9Qb29scywgcG9vbCk7CisgICAgICAgIFZNQV9BU1NFUlQoc3VjY2VzcyAmJiAiUG9vbCBub3QgZm91bmQgaW4gQWxsb2NhdG9yLiIpOworICAgIH0KKworICAgIHZtYV9kZWxldGUodGhpcywgcG9vbCk7Cit9CisKK3ZvaWQgVm1hQWxsb2NhdG9yX1Q6OkdldFBvb2xTdGF0cyhWbWFQb29sIHBvb2wsIFZtYVBvb2xTdGF0cyogcFBvb2xTdGF0cykKK3sKKyAgICBwb29sLT5tX0Jsb2NrVmVjdG9yLkdldFBvb2xTdGF0cyhwUG9vbFN0YXRzKTsKK30KKwordm9pZCBWbWFBbGxvY2F0b3JfVDo6U2V0Q3VycmVudEZyYW1lSW5kZXgodWludDMyX3QgZnJhbWVJbmRleCkKK3sKKyAgICBtX0N1cnJlbnRGcmFtZUluZGV4LnN0b3JlKGZyYW1lSW5kZXgpOworfQorCit2b2lkIFZtYUFsbG9jYXRvcl9UOjpNYWtlUG9vbEFsbG9jYXRpb25zTG9zdCgKKyAgICBWbWFQb29sIGhQb29sLAorICAgIHNpemVfdCogcExvc3RBbGxvY2F0aW9uQ291bnQpCit7CisgICAgaFBvb2wtPm1fQmxvY2tWZWN0b3IuTWFrZVBvb2xBbGxvY2F0aW9uc0xvc3QoCisgICAgICAgIG1fQ3VycmVudEZyYW1lSW5kZXgubG9hZCgpLAorICAgICAgICBwTG9zdEFsbG9jYXRpb25Db3VudCk7Cit9CisKK1ZrUmVzdWx0IFZtYUFsbG9jYXRvcl9UOjpDaGVja1Bvb2xDb3JydXB0aW9uKFZtYVBvb2wgaFBvb2wpCit7CisgICAgcmV0dXJuIGhQb29sLT5tX0Jsb2NrVmVjdG9yLkNoZWNrQ29ycnVwdGlvbigpOworfQorCitWa1Jlc3VsdCBWbWFBbGxvY2F0b3JfVDo6Q2hlY2tDb3JydXB0aW9uKHVpbnQzMl90IG1lbW9yeVR5cGVCaXRzKQoreworICAgIFZrUmVzdWx0IGZpbmFsUmVzID0gVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVDsKKworICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBwb29scy4KKyAgICBmb3IodWludDMyX3QgbWVtVHlwZUluZGV4ID0gMDsgbWVtVHlwZUluZGV4IDwgR2V0TWVtb3J5VHlwZUNvdW50KCk7ICsrbWVtVHlwZUluZGV4KQorICAgIHsKKyAgICAgICAgaWYoKCgxdSA8PCBtZW1UeXBlSW5kZXgpICYgbWVtb3J5VHlwZUJpdHMpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZtYUJsb2NrVmVjdG9yKiBjb25zdCBwQmxvY2tWZWN0b3IgPSBtX3BCbG9ja1ZlY3RvcnNbbWVtVHlwZUluZGV4XTsKKyAgICAgICAgICAgIFZNQV9BU1NFUlQocEJsb2NrVmVjdG9yKTsKKyAgICAgICAgICAgIFZrUmVzdWx0IGxvY2FsUmVzID0gcEJsb2NrVmVjdG9yLT5DaGVja0NvcnJ1cHRpb24oKTsKKyAgICAgICAgICAgIHN3aXRjaChsb2NhbFJlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBmaW5hbFJlcyA9IFZLX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByb2Nlc3MgY3VzdG9tIHBvb2xzLgorICAgIHsKKyAgICAgICAgVm1hTXV0ZXhMb2NrUmVhZCBsb2NrKG1fUG9vbHNNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgICAgIGZvcihzaXplX3QgcG9vbEluZGV4ID0gMCwgcG9vbENvdW50ID0gbV9Qb29scy5zaXplKCk7IHBvb2xJbmRleCA8IHBvb2xDb3VudDsgKytwb29sSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCgoMXUgPDwgbV9Qb29sc1twb29sSW5kZXhdLT5tX0Jsb2NrVmVjdG9yLkdldE1lbW9yeVR5cGVJbmRleCgpKSAmIG1lbW9yeVR5cGVCaXRzKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZrUmVzdWx0IGxvY2FsUmVzID0gbV9Qb29sc1twb29sSW5kZXhdLT5tX0Jsb2NrVmVjdG9yLkNoZWNrQ29ycnVwdGlvbigpOworICAgICAgICAgICAgICAgIHN3aXRjaChsb2NhbFJlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZLX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIGZpbmFsUmVzID0gVktfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmaW5hbFJlczsKK30KKwordm9pZCBWbWFBbGxvY2F0b3JfVDo6Q3JlYXRlTG9zdEFsbG9jYXRpb24oVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24pCit7CisgICAgKnBBbGxvY2F0aW9uID0gdm1hX25ldyh0aGlzLCBWbWFBbGxvY2F0aW9uX1QpKFZNQV9GUkFNRV9JTkRFWF9MT1NULCBmYWxzZSk7CisgICAgKCpwQWxsb2NhdGlvbiktPkluaXRMb3N0KCk7Cit9CisKK1ZrUmVzdWx0IFZtYUFsbG9jYXRvcl9UOjpBbGxvY2F0ZVZ1bGthbk1lbW9yeShjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtEZXZpY2VNZW1vcnkqIHBNZW1vcnkpCit7CisgICAgY29uc3QgdWludDMyX3QgaGVhcEluZGV4ID0gTWVtb3J5VHlwZUluZGV4VG9IZWFwSW5kZXgocEFsbG9jYXRlSW5mby0+bWVtb3J5VHlwZUluZGV4KTsKKworICAgIFZrUmVzdWx0IHJlczsKKyAgICBpZihtX0hlYXBTaXplTGltaXRbaGVhcEluZGV4XSAhPSBWS19XSE9MRV9TSVpFKQorICAgIHsKKyAgICAgICAgVm1hTXV0ZXhMb2NrIGxvY2sobV9IZWFwU2l6ZUxpbWl0TXV0ZXgsIG1fVXNlTXV0ZXgpOworICAgICAgICBpZihtX0hlYXBTaXplTGltaXRbaGVhcEluZGV4XSA+PSBwQWxsb2NhdGVJbmZvLT5hbGxvY2F0aW9uU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzID0gKCptX1Z1bGthbkZ1bmN0aW9ucy52a0FsbG9jYXRlTWVtb3J5KShtX2hEZXZpY2UsIHBBbGxvY2F0ZUluZm8sIEdldEFsbG9jYXRpb25DYWxsYmFja3MoKSwgcE1lbW9yeSk7CisgICAgICAgICAgICBpZihyZXMgPT0gVktfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX0hlYXBTaXplTGltaXRbaGVhcEluZGV4XSAtPSBwQWxsb2NhdGVJbmZvLT5hbGxvY2F0aW9uU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlcyA9ICgqbV9WdWxrYW5GdW5jdGlvbnMudmtBbGxvY2F0ZU1lbW9yeSkobV9oRGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBHZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksIHBNZW1vcnkpOworICAgIH0KKworICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTICYmIG1fRGV2aWNlTWVtb3J5Q2FsbGJhY2tzLnBmbkFsbG9jYXRlICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgKCptX0RldmljZU1lbW9yeUNhbGxiYWNrcy5wZm5BbGxvY2F0ZSkodGhpcywgcEFsbG9jYXRlSW5mby0+bWVtb3J5VHlwZUluZGV4LCAqcE1lbW9yeSwgcEFsbG9jYXRlSW5mby0+YWxsb2NhdGlvblNpemUpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgVm1hQWxsb2NhdG9yX1Q6OkZyZWVWdWxrYW5NZW1vcnkodWludDMyX3QgbWVtb3J5VHlwZSwgVmtEZXZpY2VTaXplIHNpemUsIFZrRGV2aWNlTWVtb3J5IGhNZW1vcnkpCit7CisgICAgaWYobV9EZXZpY2VNZW1vcnlDYWxsYmFja3MucGZuRnJlZSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgICgqbV9EZXZpY2VNZW1vcnlDYWxsYmFja3MucGZuRnJlZSkodGhpcywgbWVtb3J5VHlwZSwgaE1lbW9yeSwgc2l6ZSk7CisgICAgfQorCisgICAgKCptX1Z1bGthbkZ1bmN0aW9ucy52a0ZyZWVNZW1vcnkpKG1faERldmljZSwgaE1lbW9yeSwgR2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpKTsKKworICAgIGNvbnN0IHVpbnQzMl90IGhlYXBJbmRleCA9IE1lbW9yeVR5cGVJbmRleFRvSGVhcEluZGV4KG1lbW9yeVR5cGUpOworICAgIGlmKG1fSGVhcFNpemVMaW1pdFtoZWFwSW5kZXhdICE9IFZLX1dIT0xFX1NJWkUpCisgICAgeworICAgICAgICBWbWFNdXRleExvY2sgbG9jayhtX0hlYXBTaXplTGltaXRNdXRleCwgbV9Vc2VNdXRleCk7CisgICAgICAgIG1fSGVhcFNpemVMaW1pdFtoZWFwSW5kZXhdICs9IHNpemU7CisgICAgfQorfQorCitWa1Jlc3VsdCBWbWFBbGxvY2F0b3JfVDo6TWFwKFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sIHZvaWQqKiBwcERhdGEpCit7CisgICAgaWYoaEFsbG9jYXRpb24tPkNhbkJlY29tZUxvc3QoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9NRU1PUllfTUFQX0ZBSUxFRDsKKyAgICB9CisKKyAgICBzd2l0Y2goaEFsbG9jYXRpb24tPkdldFR5cGUoKSkKKyAgICB7CisgICAgY2FzZSBWbWFBbGxvY2F0aW9uX1Q6OkFMTE9DQVRJT05fVFlQRV9CTE9DSzoKKyAgICAgICAgeworICAgICAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIGNvbnN0IHBCbG9jayA9IGhBbGxvY2F0aW9uLT5HZXRCbG9jaygpOworICAgICAgICAgICAgY2hhciAqcEJ5dGVzID0gVk1BX05VTEw7CisgICAgICAgICAgICBWa1Jlc3VsdCByZXMgPSBwQmxvY2stPk1hcCh0aGlzLCAxLCAodm9pZCoqKSZwQnl0ZXMpOworICAgICAgICAgICAgaWYocmVzID09IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBwRGF0YSA9IHBCeXRlcyArIChwdHJkaWZmX3QpaEFsbG9jYXRpb24tPkdldE9mZnNldCgpOworICAgICAgICAgICAgICAgIGhBbGxvY2F0aW9uLT5CbG9ja0FsbG9jTWFwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgY2FzZSBWbWFBbGxvY2F0aW9uX1Q6OkFMTE9DQVRJT05fVFlQRV9ERURJQ0FURUQ6CisgICAgICAgIHJldHVybiBoQWxsb2NhdGlvbi0+RGVkaWNhdGVkQWxsb2NNYXAodGhpcywgcHBEYXRhKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBWTUFfQVNTRVJUKDApOworICAgICAgICByZXR1cm4gVktfRVJST1JfTUVNT1JZX01BUF9GQUlMRUQ7CisgICAgfQorfQorCit2b2lkIFZtYUFsbG9jYXRvcl9UOjpVbm1hcChWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uKQoreworICAgIHN3aXRjaChoQWxsb2NhdGlvbi0+R2V0VHlwZSgpKQorICAgIHsKKyAgICBjYXNlIFZtYUFsbG9jYXRpb25fVDo6QUxMT0NBVElPTl9UWVBFX0JMT0NLOgorICAgICAgICB7CisgICAgICAgICAgICBWbWFEZXZpY2VNZW1vcnlCbG9jayogY29uc3QgcEJsb2NrID0gaEFsbG9jYXRpb24tPkdldEJsb2NrKCk7CisgICAgICAgICAgICBoQWxsb2NhdGlvbi0+QmxvY2tBbGxvY1VubWFwKCk7CisgICAgICAgICAgICBwQmxvY2stPlVubWFwKHRoaXMsIDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVm1hQWxsb2NhdGlvbl9UOjpBTExPQ0FUSU9OX1RZUEVfREVESUNBVEVEOgorICAgICAgICBoQWxsb2NhdGlvbi0+RGVkaWNhdGVkQWxsb2NVbm1hcCh0aGlzKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICB9Cit9CisKK1ZrUmVzdWx0IFZtYUFsbG9jYXRvcl9UOjpCaW5kQnVmZmVyTWVtb3J5KFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sIFZrQnVmZmVyIGhCdWZmZXIpCit7CisgICAgVmtSZXN1bHQgcmVzID0gVktfU1VDQ0VTUzsKKyAgICBzd2l0Y2goaEFsbG9jYXRpb24tPkdldFR5cGUoKSkKKyAgICB7CisgICAgY2FzZSBWbWFBbGxvY2F0aW9uX1Q6OkFMTE9DQVRJT05fVFlQRV9ERURJQ0FURUQ6CisgICAgICAgIHJlcyA9IEdldFZ1bGthbkZ1bmN0aW9ucygpLnZrQmluZEJ1ZmZlck1lbW9yeSgKKyAgICAgICAgICAgIG1faERldmljZSwKKyAgICAgICAgICAgIGhCdWZmZXIsCisgICAgICAgICAgICBoQWxsb2NhdGlvbi0+R2V0TWVtb3J5KCksCisgICAgICAgICAgICAwKTsgLy9tZW1vcnlPZmZzZXQKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWbWFBbGxvY2F0aW9uX1Q6OkFMTE9DQVRJT05fVFlQRV9CTE9DSzoKKyAgICB7CisgICAgICAgIFZtYURldmljZU1lbW9yeUJsb2NrKiBwQmxvY2sgPSBoQWxsb2NhdGlvbi0+R2V0QmxvY2soKTsKKyAgICAgICAgVk1BX0FTU0VSVChwQmxvY2sgJiYgIkJpbmRpbmcgYnVmZmVyIHRvIGFsbG9jYXRpb24gdGhhdCBkb2Vzbid0IGJlbG9uZyB0byBhbnkgYmxvY2suIElzIHRoZSBhbGxvY2F0aW9uIGxvc3Q/Iik7CisgICAgICAgIHJlcyA9IHBCbG9jay0+QmluZEJ1ZmZlck1lbW9yeSh0aGlzLCBoQWxsb2NhdGlvbiwgaEJ1ZmZlcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBWTUFfQVNTRVJUKDApOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitWa1Jlc3VsdCBWbWFBbGxvY2F0b3JfVDo6QmluZEltYWdlTWVtb3J5KFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sIFZrSW1hZ2UgaEltYWdlKQoreworICAgIFZrUmVzdWx0IHJlcyA9IFZLX1NVQ0NFU1M7CisgICAgc3dpdGNoKGhBbGxvY2F0aW9uLT5HZXRUeXBlKCkpCisgICAgeworICAgIGNhc2UgVm1hQWxsb2NhdGlvbl9UOjpBTExPQ0FUSU9OX1RZUEVfREVESUNBVEVEOgorICAgICAgICByZXMgPSBHZXRWdWxrYW5GdW5jdGlvbnMoKS52a0JpbmRJbWFnZU1lbW9yeSgKKyAgICAgICAgICAgIG1faERldmljZSwKKyAgICAgICAgICAgIGhJbWFnZSwKKyAgICAgICAgICAgIGhBbGxvY2F0aW9uLT5HZXRNZW1vcnkoKSwKKyAgICAgICAgICAgIDApOyAvL21lbW9yeU9mZnNldAorICAgICAgICBicmVhazsKKyAgICBjYXNlIFZtYUFsbG9jYXRpb25fVDo6QUxMT0NBVElPTl9UWVBFX0JMT0NLOgorICAgIHsKKyAgICAgICAgVm1hRGV2aWNlTWVtb3J5QmxvY2sqIHBCbG9jayA9IGhBbGxvY2F0aW9uLT5HZXRCbG9jaygpOworICAgICAgICBWTUFfQVNTRVJUKHBCbG9jayAmJiAiQmluZGluZyBpbWFnZSB0byBhbGxvY2F0aW9uIHRoYXQgZG9lc24ndCBiZWxvbmcgdG8gYW55IGJsb2NrLiBJcyB0aGUgYWxsb2NhdGlvbiBsb3N0PyIpOworICAgICAgICByZXMgPSBwQmxvY2stPkJpbmRJbWFnZU1lbW9yeSh0aGlzLCBoQWxsb2NhdGlvbiwgaEltYWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIFZNQV9BU1NFUlQoMCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgVm1hQWxsb2NhdG9yX1Q6OkZsdXNoT3JJbnZhbGlkYXRlQWxsb2NhdGlvbigKKyAgICBWbWFBbGxvY2F0aW9uIGhBbGxvY2F0aW9uLAorICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgIFZNQV9DQUNIRV9PUEVSQVRJT04gb3ApCit7CisgICAgY29uc3QgdWludDMyX3QgbWVtVHlwZUluZGV4ID0gaEFsbG9jYXRpb24tPkdldE1lbW9yeVR5cGVJbmRleCgpOworICAgIGlmKHNpemUgPiAwICYmIElzTWVtb3J5VHlwZU5vbkNvaGVyZW50KG1lbVR5cGVJbmRleCkpCisgICAgeworICAgICAgICBjb25zdCBWa0RldmljZVNpemUgYWxsb2NhdGlvblNpemUgPSBoQWxsb2NhdGlvbi0+R2V0U2l6ZSgpOworICAgICAgICBWTUFfQVNTRVJUKG9mZnNldCA8PSBhbGxvY2F0aW9uU2l6ZSk7CisKKyAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIG5vbkNvaGVyZW50QXRvbVNpemUgPSBtX1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcy5saW1pdHMubm9uQ29oZXJlbnRBdG9tU2l6ZTsKKworICAgICAgICBWa01hcHBlZE1lbW9yeVJhbmdlIG1lbVJhbmdlID0geyBWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFIH07CisgICAgICAgIG1lbVJhbmdlLm1lbW9yeSA9IGhBbGxvY2F0aW9uLT5HZXRNZW1vcnkoKTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaChoQWxsb2NhdGlvbi0+R2V0VHlwZSgpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgVm1hQWxsb2NhdGlvbl9UOjpBTExPQ0FUSU9OX1RZUEVfREVESUNBVEVEOgorICAgICAgICAgICAgbWVtUmFuZ2Uub2Zmc2V0ID0gVm1hQWxpZ25Eb3duKG9mZnNldCwgbm9uQ29oZXJlbnRBdG9tU2l6ZSk7CisgICAgICAgICAgICBpZihzaXplID09IFZLX1dIT0xFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtUmFuZ2Uuc2l6ZSA9IGFsbG9jYXRpb25TaXplIC0gbWVtUmFuZ2Uub2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZNQV9BU1NFUlQob2Zmc2V0ICsgc2l6ZSA8PSBhbGxvY2F0aW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtUmFuZ2Uuc2l6ZSA9IFZNQV9NSU4oCisgICAgICAgICAgICAgICAgICAgIFZtYUFsaWduVXAoc2l6ZSArIChvZmZzZXQgLSBtZW1SYW5nZS5vZmZzZXQpLCBub25Db2hlcmVudEF0b21TaXplKSwKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvblNpemUgLSBtZW1SYW5nZS5vZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWbWFBbGxvY2F0aW9uX1Q6OkFMTE9DQVRJT05fVFlQRV9CTE9DSzoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMS4gU3RpbGwgd2l0aGluIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIG1lbVJhbmdlLm9mZnNldCA9IFZtYUFsaWduRG93bihvZmZzZXQsIG5vbkNvaGVyZW50QXRvbVNpemUpOworICAgICAgICAgICAgaWYoc2l6ZSA9PSBWS19XSE9MRV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSBhbGxvY2F0aW9uU2l6ZSAtIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWTUFfQVNTRVJUKG9mZnNldCArIHNpemUgPD0gYWxsb2NhdGlvblNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtUmFuZ2Uuc2l6ZSA9IFZtYUFsaWduVXAoc2l6ZSArIChvZmZzZXQgLSBtZW1SYW5nZS5vZmZzZXQpLCBub25Db2hlcmVudEF0b21TaXplKTsKKworICAgICAgICAgICAgLy8gMi4gQWRqdXN0IHRvIHdob2xlIGJsb2NrLgorICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGFsbG9jYXRpb25PZmZzZXQgPSBoQWxsb2NhdGlvbi0+R2V0T2Zmc2V0KCk7CisgICAgICAgICAgICBWTUFfQVNTRVJUKGFsbG9jYXRpb25PZmZzZXQgJSBub25Db2hlcmVudEF0b21TaXplID09IDApOworICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VTaXplIGJsb2NrU2l6ZSA9IGhBbGxvY2F0aW9uLT5HZXRCbG9jaygpLT5tX3BNZXRhZGF0YS0+R2V0U2l6ZSgpOworICAgICAgICAgICAgbWVtUmFuZ2Uub2Zmc2V0ICs9IGFsbG9jYXRpb25PZmZzZXQ7CisgICAgICAgICAgICBtZW1SYW5nZS5zaXplID0gVk1BX01JTihtZW1SYW5nZS5zaXplLCBibG9ja1NpemUgLSBtZW1SYW5nZS5vZmZzZXQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFZNQV9BU1NFUlQoMCk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2gob3ApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBWTUFfQ0FDSEVfRkxVU0g6CisgICAgICAgICAgICAoKkdldFZ1bGthbkZ1bmN0aW9ucygpLnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMpKG1faERldmljZSwgMSwgJm1lbVJhbmdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZNQV9DQUNIRV9JTlZBTElEQVRFOgorICAgICAgICAgICAgKCpHZXRWdWxrYW5GdW5jdGlvbnMoKS52a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMpKG1faERldmljZSwgMSwgJm1lbVJhbmdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVk1BX0FTU0VSVCgwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBlbHNlOiBKdXN0IGlnbm9yZSB0aGlzIGNhbGwuCit9CisKK3ZvaWQgVm1hQWxsb2NhdG9yX1Q6OkZyZWVEZWRpY2F0ZWRNZW1vcnkoVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdGlvbiAmJiBhbGxvY2F0aW9uLT5HZXRUeXBlKCkgPT0gVm1hQWxsb2NhdGlvbl9UOjpBTExPQ0FUSU9OX1RZUEVfREVESUNBVEVEKTsKKworICAgIGNvbnN0IHVpbnQzMl90IG1lbVR5cGVJbmRleCA9IGFsbG9jYXRpb24tPkdldE1lbW9yeVR5cGVJbmRleCgpOworICAgIHsKKyAgICAgICAgVm1hTXV0ZXhMb2NrV3JpdGUgbG9jayhtX0RlZGljYXRlZEFsbG9jYXRpb25zTXV0ZXhbbWVtVHlwZUluZGV4XSwgbV9Vc2VNdXRleCk7CisgICAgICAgIEFsbG9jYXRpb25WZWN0b3JUeXBlKiBjb25zdCBwRGVkaWNhdGVkQWxsb2NhdGlvbnMgPSBtX3BEZWRpY2F0ZWRBbGxvY2F0aW9uc1ttZW1UeXBlSW5kZXhdOworICAgICAgICBWTUFfQVNTRVJUKHBEZWRpY2F0ZWRBbGxvY2F0aW9ucyk7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IFZtYVZlY3RvclJlbW92ZVNvcnRlZDxWbWFQb2ludGVyTGVzcz4oKnBEZWRpY2F0ZWRBbGxvY2F0aW9ucywgYWxsb2NhdGlvbik7CisgICAgICAgIFZNQV9BU1NFUlQoc3VjY2Vzcyk7CisgICAgfQorCisgICAgVmtEZXZpY2VNZW1vcnkgaE1lbW9yeSA9IGFsbG9jYXRpb24tPkdldE1lbW9yeSgpOworICAgIAorICAgIC8qCisgICAgVGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIHRoaXMsIGJlY2F1c2UgVnVsa2FuIHNwZWMgYWxsb3dzIHRvIHNraXAgdmtVbm1hcE1lbW9yeQorICAgIGJlZm9yZSB2a0ZyZWVNZW1vcnkuCisKKyAgICBpZihhbGxvY2F0aW9uLT5HZXRNYXBwZWREYXRhKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICAoKm1fVnVsa2FuRnVuY3Rpb25zLnZrVW5tYXBNZW1vcnkpKG1faERldmljZSwgaE1lbW9yeSk7CisgICAgfQorICAgICovCisgICAgCisgICAgRnJlZVZ1bGthbk1lbW9yeShtZW1UeXBlSW5kZXgsIGFsbG9jYXRpb24tPkdldFNpemUoKSwgaE1lbW9yeSk7CisKKyAgICBWTUFfREVCVUdfTE9HKCIgICAgRnJlZWQgRGVkaWNhdGVkTWVtb3J5IE1lbW9yeVR5cGVJbmRleD0ldSIsIG1lbVR5cGVJbmRleCk7Cit9CisKK3ZvaWQgVm1hQWxsb2NhdG9yX1Q6OkZpbGxBbGxvY2F0aW9uKGNvbnN0IFZtYUFsbG9jYXRpb24gaEFsbG9jYXRpb24sIHVpbnQ4X3QgcGF0dGVybikKK3sKKyAgICBpZihWTUFfREVCVUdfSU5JVElBTElaRV9BTExPQ0FUSU9OUyAmJgorICAgICAgICAhaEFsbG9jYXRpb24tPkNhbkJlY29tZUxvc3QoKSAmJgorICAgICAgICAobV9NZW1Qcm9wcy5tZW1vcnlUeXBlc1toQWxsb2NhdGlvbi0+R2V0TWVtb3J5VHlwZUluZGV4KCldLnByb3BlcnR5RmxhZ3MgJiBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCkgIT0gMCkKKyAgICB7CisgICAgICAgIHZvaWQqIHBEYXRhID0gVk1BX05VTEw7CisgICAgICAgIFZrUmVzdWx0IHJlcyA9IE1hcChoQWxsb2NhdGlvbiwgJnBEYXRhKTsKKyAgICAgICAgaWYocmVzID09IFZLX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldChwRGF0YSwgKGludClwYXR0ZXJuLCAoc2l6ZV90KWhBbGxvY2F0aW9uLT5HZXRTaXplKCkpOworICAgICAgICAgICAgRmx1c2hPckludmFsaWRhdGVBbGxvY2F0aW9uKGhBbGxvY2F0aW9uLCAwLCBWS19XSE9MRV9TSVpFLCBWTUFfQ0FDSEVfRkxVU0gpOworICAgICAgICAgICAgVW5tYXAoaEFsbG9jYXRpb24pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVk1BX0FTU0VSVCgwICYmICJWTUFfREVCVUdfSU5JVElBTElaRV9BTExPQ0FUSU9OUyBpcyBlbmFibGVkLCBidXQgY291bGRuJ3QgbWFwIG1lbW9yeSB0byBmaWxsIGFsbG9jYXRpb24uIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKwordm9pZCBWbWFBbGxvY2F0b3JfVDo6UHJpbnREZXRhaWxlZE1hcChWbWFKc29uV3JpdGVyJiBqc29uKQoreworICAgIGJvb2wgZGVkaWNhdGVkQWxsb2NhdGlvbnNTdGFydGVkID0gZmFsc2U7CisgICAgZm9yKHVpbnQzMl90IG1lbVR5cGVJbmRleCA9IDA7IG1lbVR5cGVJbmRleCA8IEdldE1lbW9yeVR5cGVDb3VudCgpOyArK21lbVR5cGVJbmRleCkKKyAgICB7CisgICAgICAgIFZtYU11dGV4TG9ja1JlYWQgZGVkaWNhdGVkQWxsb2NhdGlvbnNMb2NrKG1fRGVkaWNhdGVkQWxsb2NhdGlvbnNNdXRleFttZW1UeXBlSW5kZXhdLCBtX1VzZU11dGV4KTsKKyAgICAgICAgQWxsb2NhdGlvblZlY3RvclR5cGUqIGNvbnN0IHBEZWRpY2F0ZWRBbGxvY1ZlY3RvciA9IG1fcERlZGljYXRlZEFsbG9jYXRpb25zW21lbVR5cGVJbmRleF07CisgICAgICAgIFZNQV9BU1NFUlQocERlZGljYXRlZEFsbG9jVmVjdG9yKTsKKyAgICAgICAgaWYocERlZGljYXRlZEFsbG9jVmVjdG9yLT5lbXB0eSgpID09IGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICBpZihkZWRpY2F0ZWRBbGxvY2F0aW9uc1N0YXJ0ZWQgPT0gZmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVkaWNhdGVkQWxsb2NhdGlvbnNTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJEZWRpY2F0ZWRBbGxvY2F0aW9ucyIpOworICAgICAgICAgICAgICAgIGpzb24uQmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAganNvbi5CZWdpblN0cmluZygiVHlwZSAiKTsKKyAgICAgICAgICAgIGpzb24uQ29udGludWVTdHJpbmcobWVtVHlwZUluZGV4KTsKKyAgICAgICAgICAgIGpzb24uRW5kU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBqc29uLkJlZ2luQXJyYXkoKTsKKworICAgICAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHBEZWRpY2F0ZWRBbGxvY1ZlY3Rvci0+c2l6ZSgpOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbi5CZWdpbk9iamVjdCh0cnVlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBWbWFBbGxvY2F0aW9uIGhBbGxvYyA9ICgqcERlZGljYXRlZEFsbG9jVmVjdG9yKVtpXTsKKyAgICAgICAgICAgICAgICBoQWxsb2MtPlByaW50UGFyYW1ldGVycyhqc29uKTsKKyAgICAgICAgICAgICAgICBqc29uLkVuZE9iamVjdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBqc29uLkVuZEFycmF5KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoZGVkaWNhdGVkQWxsb2NhdGlvbnNTdGFydGVkKQorICAgIHsKKyAgICAgICAganNvbi5FbmRPYmplY3QoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGJvb2wgYWxsb2NhdGlvbnNTdGFydGVkID0gZmFsc2U7CisgICAgICAgIGZvcih1aW50MzJfdCBtZW1UeXBlSW5kZXggPSAwOyBtZW1UeXBlSW5kZXggPCBHZXRNZW1vcnlUeXBlQ291bnQoKTsgKyttZW1UeXBlSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1fcEJsb2NrVmVjdG9yc1ttZW1UeXBlSW5kZXhdLT5Jc0VtcHR5KCkgPT0gZmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoYWxsb2NhdGlvbnNTdGFydGVkID09IGZhbHNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbnNTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAganNvbi5Xcml0ZVN0cmluZygiRGVmYXVsdFBvb2xzIik7CisgICAgICAgICAgICAgICAgICAgIGpzb24uQmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBqc29uLkJlZ2luU3RyaW5nKCJUeXBlICIpOworICAgICAgICAgICAgICAgIGpzb24uQ29udGludWVTdHJpbmcobWVtVHlwZUluZGV4KTsKKyAgICAgICAgICAgICAgICBqc29uLkVuZFN0cmluZygpOworCisgICAgICAgICAgICAgICAgbV9wQmxvY2tWZWN0b3JzW21lbVR5cGVJbmRleF0tPlByaW50RGV0YWlsZWRNYXAoanNvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoYWxsb2NhdGlvbnNTdGFydGVkKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uLkVuZE9iamVjdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ3VzdG9tIHBvb2xzCisgICAgeworICAgICAgICBWbWFNdXRleExvY2tSZWFkIGxvY2sobV9Qb29sc011dGV4LCBtX1VzZU11dGV4KTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHBvb2xDb3VudCA9IG1fUG9vbHMuc2l6ZSgpOworICAgICAgICBpZihwb29sQ291bnQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJQb29scyIpOworICAgICAgICAgICAganNvbi5CZWdpbk9iamVjdCgpOworICAgICAgICAgICAgZm9yKHNpemVfdCBwb29sSW5kZXggPSAwOyBwb29sSW5kZXggPCBwb29sQ291bnQ7ICsrcG9vbEluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24uQmVnaW5TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBqc29uLkNvbnRpbnVlU3RyaW5nKG1fUG9vbHNbcG9vbEluZGV4XS0+R2V0SWQoKSk7CisgICAgICAgICAgICAgICAganNvbi5FbmRTdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIG1fUG9vbHNbcG9vbEluZGV4XS0+bV9CbG9ja1ZlY3Rvci5QcmludERldGFpbGVkTWFwKGpzb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAganNvbi5FbmRPYmplY3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmIC8vICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFB1YmxpYyBpbnRlcmZhY2UKKworVmtSZXN1bHQgdm1hQ3JlYXRlQWxsb2NhdG9yKAorICAgIGNvbnN0IFZtYUFsbG9jYXRvckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIFZtYUFsbG9jYXRvciogcEFsbG9jYXRvcikKK3sKKyAgICBWTUFfQVNTRVJUKHBDcmVhdGVJbmZvICYmIHBBbGxvY2F0b3IpOworICAgIFZNQV9ERUJVR19MT0coInZtYUNyZWF0ZUFsbG9jYXRvciIpOworICAgICpwQWxsb2NhdG9yID0gdm1hX25ldyhwQ3JlYXRlSW5mby0+cEFsbG9jYXRpb25DYWxsYmFja3MsIFZtYUFsbG9jYXRvcl9UKShwQ3JlYXRlSW5mbyk7CisgICAgcmV0dXJuICgqcEFsbG9jYXRvciktPkluaXQocENyZWF0ZUluZm8pOworfQorCit2b2lkIHZtYURlc3Ryb3lBbGxvY2F0b3IoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvcikKK3sKKyAgICBpZihhbGxvY2F0b3IgIT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICBWTUFfREVCVUdfTE9HKCJ2bWFEZXN0cm95QWxsb2NhdG9yIik7CisgICAgICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY2F0aW9uQ2FsbGJhY2tzID0gYWxsb2NhdG9yLT5tX0FsbG9jYXRpb25DYWxsYmFja3M7CisgICAgICAgIHZtYV9kZWxldGUoJmFsbG9jYXRpb25DYWxsYmFja3MsIGFsbG9jYXRvcik7CisgICAgfQorfQorCit2b2lkIHZtYUdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcygKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzICoqcHBQaHlzaWNhbERldmljZVByb3BlcnRpZXMpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgcHBQaHlzaWNhbERldmljZVByb3BlcnRpZXMpOworICAgICpwcFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyA9ICZhbGxvY2F0b3ItPm1fUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzOworfQorCit2b2lkIHZtYUdldE1lbW9yeVByb3BlcnRpZXMoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyoqIHBwUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIHBwUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKTsKKyAgICAqcHBQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgPSAmYWxsb2NhdG9yLT5tX01lbVByb3BzOworfQorCit2b2lkIHZtYUdldE1lbW9yeVR5cGVQcm9wZXJ0aWVzKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgdWludDMyX3QgbWVtb3J5VHlwZUluZGV4LAorICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyogcEZsYWdzKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIHBGbGFncyk7CisgICAgVk1BX0FTU0VSVChtZW1vcnlUeXBlSW5kZXggPCBhbGxvY2F0b3ItPkdldE1lbW9yeVR5cGVDb3VudCgpKTsKKyAgICAqcEZsYWdzID0gYWxsb2NhdG9yLT5tX01lbVByb3BzLm1lbW9yeVR5cGVzW21lbW9yeVR5cGVJbmRleF0ucHJvcGVydHlGbGFnczsKK30KKwordm9pZCB2bWFTZXRDdXJyZW50RnJhbWVJbmRleCgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIHVpbnQzMl90IGZyYW1lSW5kZXgpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IpOworICAgIFZNQV9BU1NFUlQoZnJhbWVJbmRleCAhPSBWTUFfRlJBTUVfSU5ERVhfTE9TVCk7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworICAgIGFsbG9jYXRvci0+U2V0Q3VycmVudEZyYW1lSW5kZXgoZnJhbWVJbmRleCk7Cit9CisKK3ZvaWQgdm1hQ2FsY3VsYXRlU3RhdHMoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWbWFTdGF0cyogcFN0YXRzKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIHBTdGF0cyk7CisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLCisgICAgYWxsb2NhdG9yLT5DYWxjdWxhdGVTdGF0cyhwU3RhdHMpOworfQorCisjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisKK3ZvaWQgdm1hQnVpbGRTdGF0c1N0cmluZygKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIGNoYXIqKiBwcFN0YXRzU3RyaW5nLAorICAgIFZrQm9vbDMyIGRldGFpbGVkTWFwKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIHBwU3RhdHNTdHJpbmcpOworICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisgICAgVm1hU3RyaW5nQnVpbGRlciBzYihhbGxvY2F0b3IpOworICAgIHsKKyAgICAgICAgVm1hSnNvbldyaXRlciBqc29uKGFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpLCBzYik7CisgICAgICAgIGpzb24uQmVnaW5PYmplY3QoKTsKKworICAgICAgICBWbWFTdGF0cyBzdGF0czsKKyAgICAgICAgYWxsb2NhdG9yLT5DYWxjdWxhdGVTdGF0cygmc3RhdHMpOworCisgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIlRvdGFsIik7CisgICAgICAgIFZtYVByaW50U3RhdEluZm8oanNvbiwgc3RhdHMudG90YWwpOworICAgIAorICAgICAgICBmb3IodWludDMyX3QgaGVhcEluZGV4ID0gMDsgaGVhcEluZGV4IDwgYWxsb2NhdG9yLT5HZXRNZW1vcnlIZWFwQ291bnQoKTsgKytoZWFwSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24uQmVnaW5TdHJpbmcoIkhlYXAgIik7CisgICAgICAgICAgICBqc29uLkNvbnRpbnVlU3RyaW5nKGhlYXBJbmRleCk7CisgICAgICAgICAgICBqc29uLkVuZFN0cmluZygpOworICAgICAgICAgICAganNvbi5CZWdpbk9iamVjdCgpOworCisgICAgICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJTaXplIik7CisgICAgICAgICAgICBqc29uLldyaXRlTnVtYmVyKGFsbG9jYXRvci0+bV9NZW1Qcm9wcy5tZW1vcnlIZWFwc1toZWFwSW5kZXhdLnNpemUpOworCisgICAgICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJGbGFncyIpOworICAgICAgICAgICAganNvbi5CZWdpbkFycmF5KHRydWUpOworICAgICAgICAgICAgaWYoKGFsbG9jYXRvci0+bV9NZW1Qcm9wcy5tZW1vcnlIZWFwc1toZWFwSW5kZXhdLmZsYWdzICYgVktfTUVNT1JZX0hFQVBfREVWSUNFX0xPQ0FMX0JJVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJERVZJQ0VfTE9DQUwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGpzb24uRW5kQXJyYXkoKTsKKworICAgICAgICAgICAgaWYoc3RhdHMubWVtb3J5SGVhcFtoZWFwSW5kZXhdLmJsb2NrQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIlN0YXRzIik7CisgICAgICAgICAgICAgICAgVm1hUHJpbnRTdGF0SW5mbyhqc29uLCBzdGF0cy5tZW1vcnlIZWFwW2hlYXBJbmRleF0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IodWludDMyX3QgdHlwZUluZGV4ID0gMDsgdHlwZUluZGV4IDwgYWxsb2NhdG9yLT5HZXRNZW1vcnlUeXBlQ291bnQoKTsgKyt0eXBlSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoYWxsb2NhdG9yLT5NZW1vcnlUeXBlSW5kZXhUb0hlYXBJbmRleCh0eXBlSW5kZXgpID09IGhlYXBJbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24uQmVnaW5TdHJpbmcoIlR5cGUgIik7CisgICAgICAgICAgICAgICAgICAgIGpzb24uQ29udGludWVTdHJpbmcodHlwZUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAganNvbi5FbmRTdHJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBqc29uLkJlZ2luT2JqZWN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAganNvbi5Xcml0ZVN0cmluZygiRmxhZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAganNvbi5CZWdpbkFycmF5KHRydWUpOworICAgICAgICAgICAgICAgICAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgZmxhZ3MgPSBhbGxvY2F0b3ItPm1fTWVtUHJvcHMubWVtb3J5VHlwZXNbdHlwZUluZGV4XS5wcm9wZXJ0eUZsYWdzOworICAgICAgICAgICAgICAgICAgICBpZigoZmxhZ3MgJiBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAganNvbi5Xcml0ZVN0cmluZygiREVWSUNFX0xPQ0FMIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoKGZsYWdzICYgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIkhPU1RfVklTSUJMRSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKChmbGFncyAmIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAganNvbi5Xcml0ZVN0cmluZygiSE9TVF9DT0hFUkVOVCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKChmbGFncyAmIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NBQ0hFRF9CSVQpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24uV3JpdGVTdHJpbmcoIkhPU1RfQ0FDSEVEIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoKGZsYWdzICYgVktfTUVNT1JZX1BST1BFUlRZX0xBWklMWV9BTExPQ0FURURfQklUKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBqc29uLldyaXRlU3RyaW5nKCJMQVpJTFlfQUxMT0NBVEVEIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAganNvbi5FbmRBcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmKHN0YXRzLm1lbW9yeVR5cGVbdHlwZUluZGV4XS5ibG9ja0NvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAganNvbi5Xcml0ZVN0cmluZygiU3RhdHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZtYVByaW50U3RhdEluZm8oanNvbiwgc3RhdHMubWVtb3J5VHlwZVt0eXBlSW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGpzb24uRW5kT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBqc29uLkVuZE9iamVjdCgpOworICAgICAgICB9CisgICAgICAgIGlmKGRldGFpbGVkTWFwID09IFZLX1RSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFsbG9jYXRvci0+UHJpbnREZXRhaWxlZE1hcChqc29uKTsKKyAgICAgICAgfQorCisgICAgICAgIGpzb24uRW5kT2JqZWN0KCk7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IGxlbiA9IHNiLkdldExlbmd0aCgpOworICAgIGNoYXIqIGNvbnN0IHBDaGFycyA9IHZtYV9uZXdfYXJyYXkoYWxsb2NhdG9yLCBjaGFyLCBsZW4gKyAxKTsKKyAgICBpZihsZW4gPiAwKQorICAgIHsKKyAgICAgICAgbWVtY3B5KHBDaGFycywgc2IuR2V0RGF0YSgpLCBsZW4pOworICAgIH0KKyAgICBwQ2hhcnNbbGVuXSA9ICdcMCc7CisgICAgKnBwU3RhdHNTdHJpbmcgPSBwQ2hhcnM7Cit9CisKK3ZvaWQgdm1hRnJlZVN0YXRzU3RyaW5nKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY2hhciogcFN0YXRzU3RyaW5nKQoreworICAgIGlmKHBTdGF0c1N0cmluZyAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yKTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihwU3RhdHNTdHJpbmcpOworICAgICAgICB2bWFfZGVsZXRlX2FycmF5KGFsbG9jYXRvciwgcFN0YXRzU3RyaW5nLCBsZW4gKyAxKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyAjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisKKy8qCitUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwcm90ZWN0ZWQgYnkgYW55IG11dGV4IGJlY2F1c2UgaXQganVzdCByZWFkcyBpbW11dGFibGUgZGF0YS4KKyovCitWa1Jlc3VsdCB2bWFGaW5kTWVtb3J5VHlwZUluZGV4KAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgdWludDMyX3QgbWVtb3J5VHlwZUJpdHMsCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8qIHBBbGxvY2F0aW9uQ3JlYXRlSW5mbywKKyAgICB1aW50MzJfdCogcE1lbW9yeVR5cGVJbmRleCkKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvciAhPSBWS19OVUxMX0hBTkRMRSk7CisgICAgVk1BX0FTU0VSVChwQWxsb2NhdGlvbkNyZWF0ZUluZm8gIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQocE1lbW9yeVR5cGVJbmRleCAhPSBWTUFfTlVMTCk7CisKKyAgICBpZihwQWxsb2NhdGlvbkNyZWF0ZUluZm8tPm1lbW9yeVR5cGVCaXRzICE9IDApCisgICAgeworICAgICAgICBtZW1vcnlUeXBlQml0cyAmPSBwQWxsb2NhdGlvbkNyZWF0ZUluZm8tPm1lbW9yeVR5cGVCaXRzOworICAgIH0KKyAgICAKKyAgICB1aW50MzJfdCByZXF1aXJlZEZsYWdzID0gcEFsbG9jYXRpb25DcmVhdGVJbmZvLT5yZXF1aXJlZEZsYWdzOworICAgIHVpbnQzMl90IHByZWZlcnJlZEZsYWdzID0gcEFsbG9jYXRpb25DcmVhdGVJbmZvLT5wcmVmZXJyZWRGbGFnczsKKworICAgIGNvbnN0IGJvb2wgbWFwcGVkID0gKHBBbGxvY2F0aW9uQ3JlYXRlSW5mby0+ZmxhZ3MgJiBWTUFfQUxMT0NBVElPTl9DUkVBVEVfTUFQUEVEX0JJVCkgIT0gMDsKKyAgICBpZihtYXBwZWQpCisgICAgeworICAgICAgICBwcmVmZXJyZWRGbGFncyB8PSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVDsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHVzYWdlIHRvIHJlcXVpcmVkRmxhZ3MgYW5kIHByZWZlcnJlZEZsYWdzLgorICAgIHN3aXRjaChwQWxsb2NhdGlvbkNyZWF0ZUluZm8tPnVzYWdlKQorICAgIHsKKyAgICBjYXNlIFZNQV9NRU1PUllfVVNBR0VfVU5LTk9XTjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWTUFfTUVNT1JZX1VTQUdFX0dQVV9PTkxZOgorICAgICAgICBpZighYWxsb2NhdG9yLT5Jc0ludGVncmF0ZWRHcHUoKSB8fCAocHJlZmVycmVkRmxhZ3MgJiBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZmVycmVkRmxhZ3MgfD0gVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWTUFfTUVNT1JZX1VTQUdFX0NQVV9PTkxZOgorICAgICAgICByZXF1aXJlZEZsYWdzIHw9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZNQV9NRU1PUllfVVNBR0VfQ1BVX1RPX0dQVToKKyAgICAgICAgcmVxdWlyZWRGbGFncyB8PSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVDsKKyAgICAgICAgaWYoIWFsbG9jYXRvci0+SXNJbnRlZ3JhdGVkR3B1KCkgfHwgKHByZWZlcnJlZEZsYWdzICYgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWZlcnJlZEZsYWdzIHw9IFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVk1BX01FTU9SWV9VU0FHRV9HUFVfVE9fQ1BVOgorICAgICAgICByZXF1aXJlZEZsYWdzIHw9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUOworICAgICAgICBwcmVmZXJyZWRGbGFncyB8PSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DQUNIRURfQklUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAqcE1lbW9yeVR5cGVJbmRleCA9IFVJTlQzMl9NQVg7CisgICAgdWludDMyX3QgbWluQ29zdCA9IFVJTlQzMl9NQVg7CisgICAgZm9yKHVpbnQzMl90IG1lbVR5cGVJbmRleCA9IDAsIG1lbVR5cGVCaXQgPSAxOworICAgICAgICBtZW1UeXBlSW5kZXggPCBhbGxvY2F0b3ItPkdldE1lbW9yeVR5cGVDb3VudCgpOworICAgICAgICArK21lbVR5cGVJbmRleCwgbWVtVHlwZUJpdCA8PD0gMSkKKyAgICB7CisgICAgICAgIC8vIFRoaXMgbWVtb3J5IHR5cGUgaXMgYWNjZXB0YWJsZSBhY2NvcmRpbmcgdG8gbWVtb3J5VHlwZUJpdHMgYml0bWFzay4KKyAgICAgICAgaWYoKG1lbVR5cGVCaXQgJiBtZW1vcnlUeXBlQml0cykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIGN1cnJGbGFncyA9CisgICAgICAgICAgICAgICAgYWxsb2NhdG9yLT5tX01lbVByb3BzLm1lbW9yeVR5cGVzW21lbVR5cGVJbmRleF0ucHJvcGVydHlGbGFnczsKKyAgICAgICAgICAgIC8vIFRoaXMgbWVtb3J5IHR5cGUgY29udGFpbnMgcmVxdWlyZWRGbGFncy4KKyAgICAgICAgICAgIGlmKChyZXF1aXJlZEZsYWdzICYgfmN1cnJGbGFncykgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29zdCBhcyBudW1iZXIgb2YgYml0cyBmcm9tIHByZWZlcnJlZEZsYWdzIG5vdCBwcmVzZW50IGluIHRoaXMgbWVtb3J5IHR5cGUuCisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VyckNvc3QgPSBWbWFDb3VudEJpdHNTZXQocHJlZmVycmVkRmxhZ3MgJiB+Y3VyckZsYWdzKTsKKyAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciBtZW1vcnkgdHlwZSB3aXRoIGxvd2VzdCBjb3N0LgorICAgICAgICAgICAgICAgIGlmKGN1cnJDb3N0IDwgbWluQ29zdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwTWVtb3J5VHlwZUluZGV4ID0gbWVtVHlwZUluZGV4OworICAgICAgICAgICAgICAgICAgICBpZihjdXJyQ29zdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtaW5Db3N0ID0gY3VyckNvc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoKnBNZW1vcnlUeXBlSW5kZXggIT0gVUlOVDMyX01BWCkgPyBWS19TVUNDRVNTIDogVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVDsKK30KKworVmtSZXN1bHQgdm1hRmluZE1lbW9yeVR5cGVJbmRleEZvckJ1ZmZlckluZm8oCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qIHBCdWZmZXJDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvKiBwQWxsb2NhdGlvbkNyZWF0ZUluZm8sCisgICAgdWludDMyX3QqIHBNZW1vcnlUeXBlSW5kZXgpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgIT0gVktfTlVMTF9IQU5ETEUpOworICAgIFZNQV9BU1NFUlQocEJ1ZmZlckNyZWF0ZUluZm8gIT0gVk1BX05VTEwpOworICAgIFZNQV9BU1NFUlQocEFsbG9jYXRpb25DcmVhdGVJbmZvICE9IFZNQV9OVUxMKTsKKyAgICBWTUFfQVNTRVJUKHBNZW1vcnlUeXBlSW5kZXggIT0gVk1BX05VTEwpOworCisgICAgY29uc3QgVmtEZXZpY2UgaERldiA9IGFsbG9jYXRvci0+bV9oRGV2aWNlOworICAgIFZrQnVmZmVyIGhCdWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1Jlc3VsdCByZXMgPSBhbGxvY2F0b3ItPkdldFZ1bGthbkZ1bmN0aW9ucygpLnZrQ3JlYXRlQnVmZmVyKAorICAgICAgICBoRGV2LCBwQnVmZmVyQ3JlYXRlSW5mbywgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksICZoQnVmZmVyKTsKKyAgICBpZihyZXMgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbVJlcSA9IHt9OworICAgICAgICBhbGxvY2F0b3ItPkdldFZ1bGthbkZ1bmN0aW9ucygpLnZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgICAgICAgICAgaERldiwgaEJ1ZmZlciwgJm1lbVJlcSk7CisKKyAgICAgICAgcmVzID0gdm1hRmluZE1lbW9yeVR5cGVJbmRleCgKKyAgICAgICAgICAgIGFsbG9jYXRvciwKKyAgICAgICAgICAgIG1lbVJlcS5tZW1vcnlUeXBlQml0cywKKyAgICAgICAgICAgIHBBbGxvY2F0aW9uQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIHBNZW1vcnlUeXBlSW5kZXgpOworCisgICAgICAgIGFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtEZXN0cm95QnVmZmVyKAorICAgICAgICAgICAgaERldiwgaEJ1ZmZlciwgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitWa1Jlc3VsdCB2bWFGaW5kTWVtb3J5VHlwZUluZGV4Rm9ySW1hZ2VJbmZvKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qIHBJbWFnZUNyZWF0ZUluZm8sCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8qIHBBbGxvY2F0aW9uQ3JlYXRlSW5mbywKKyAgICB1aW50MzJfdCogcE1lbW9yeVR5cGVJbmRleCkKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvciAhPSBWS19OVUxMX0hBTkRMRSk7CisgICAgVk1BX0FTU0VSVChwSW1hZ2VDcmVhdGVJbmZvICE9IFZNQV9OVUxMKTsKKyAgICBWTUFfQVNTRVJUKHBBbGxvY2F0aW9uQ3JlYXRlSW5mbyAhPSBWTUFfTlVMTCk7CisgICAgVk1BX0FTU0VSVChwTWVtb3J5VHlwZUluZGV4ICE9IFZNQV9OVUxMKTsKKworICAgIGNvbnN0IFZrRGV2aWNlIGhEZXYgPSBhbGxvY2F0b3ItPm1faERldmljZTsKKyAgICBWa0ltYWdlIGhJbWFnZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlcyA9IGFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtDcmVhdGVJbWFnZSgKKyAgICAgICAgaERldiwgcEltYWdlQ3JlYXRlSW5mbywgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksICZoSW1hZ2UpOworICAgIGlmKHJlcyA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtUmVxID0ge307CisgICAgICAgIGFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICAgICAgICAgIGhEZXYsIGhJbWFnZSwgJm1lbVJlcSk7CisKKyAgICAgICAgcmVzID0gdm1hRmluZE1lbW9yeVR5cGVJbmRleCgKKyAgICAgICAgICAgIGFsbG9jYXRvciwKKyAgICAgICAgICAgIG1lbVJlcS5tZW1vcnlUeXBlQml0cywKKyAgICAgICAgICAgIHBBbGxvY2F0aW9uQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIHBNZW1vcnlUeXBlSW5kZXgpOworCisgICAgICAgIGFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtEZXN0cm95SW1hZ2UoCisgICAgICAgICAgICBoRGV2LCBoSW1hZ2UsIGFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworVmtSZXN1bHQgdm1hQ3JlYXRlUG9vbCgKKwlWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorCWNvbnN0IFZtYVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKwlWbWFQb29sKiBwUG9vbCkKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvciAmJiBwQ3JlYXRlSW5mbyAmJiBwUG9vbCk7CisgICAgCisgICAgVk1BX0RFQlVHX0xPRygidm1hQ3JlYXRlUG9vbCIpOworICAgIAorICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworICAgIAorICAgIFZrUmVzdWx0IHJlcyA9IGFsbG9jYXRvci0+Q3JlYXRlUG9vbChwQ3JlYXRlSW5mbywgcFBvb2wpOworICAgIAorI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIGlmKGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkQ3JlYXRlUG9vbChhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksICpwQ3JlYXRlSW5mbywgKnBQb29sKTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIHZtYURlc3Ryb3lQb29sKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hUG9vbCBwb29sKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yKTsKKyAgICAKKyAgICBpZihwb29sID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFEZXN0cm95UG9vbCIpOworICAgIAorICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworICAgIAorI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIGlmKGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkRGVzdHJveVBvb2woYWxsb2NhdG9yLT5HZXRDdXJyZW50RnJhbWVJbmRleCgpLCBwb29sKTsKKyAgICB9CisjZW5kaWYKKworICAgIGFsbG9jYXRvci0+RGVzdHJveVBvb2wocG9vbCk7Cit9CisKK3ZvaWQgdm1hR2V0UG9vbFN0YXRzKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hUG9vbCBwb29sLAorICAgIFZtYVBvb2xTdGF0cyogcFBvb2xTdGF0cykKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvciAmJiBwb29sICYmIHBQb29sU3RhdHMpOworCisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLCisKKyAgICBhbGxvY2F0b3ItPkdldFBvb2xTdGF0cyhwb29sLCBwUG9vbFN0YXRzKTsKK30KKwordm9pZCB2bWFNYWtlUG9vbEFsbG9jYXRpb25zTG9zdCgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYVBvb2wgcG9vbCwKKyAgICBzaXplX3QqIHBMb3N0QWxsb2NhdGlvbkNvdW50KQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIHBvb2wpOworCisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLCisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldFJlY29yZGVyKCktPlJlY29yZE1ha2VQb29sQWxsb2NhdGlvbnNMb3N0KGFsbG9jYXRvci0+R2V0Q3VycmVudEZyYW1lSW5kZXgoKSwgcG9vbCk7CisgICAgfQorI2VuZGlmCisKKyAgICBhbGxvY2F0b3ItPk1ha2VQb29sQWxsb2NhdGlvbnNMb3N0KHBvb2wsIHBMb3N0QWxsb2NhdGlvbkNvdW50KTsKK30KKworVmtSZXN1bHQgdm1hQ2hlY2tQb29sQ29ycnVwdGlvbihWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLCBWbWFQb29sIHBvb2wpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgcG9vbCk7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworICAgIFZNQV9ERUJVR19MT0coInZtYUNoZWNrUG9vbENvcnJ1cHRpb24iKTsKKworICAgIHJldHVybiBhbGxvY2F0b3ItPkNoZWNrUG9vbENvcnJ1cHRpb24ocG9vbCk7Cit9CisKK1ZrUmVzdWx0IHZtYUFsbG9jYXRlTWVtb3J5KAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMqIHBWa01lbW9yeVJlcXVpcmVtZW50cywKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24sCisgICAgVm1hQWxsb2NhdGlvbkluZm8qIHBBbGxvY2F0aW9uSW5mbykKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvciAmJiBwVmtNZW1vcnlSZXF1aXJlbWVudHMgJiYgcENyZWF0ZUluZm8gJiYgcEFsbG9jYXRpb24pOworCisgICAgVk1BX0RFQlVHX0xPRygidm1hQWxsb2NhdGVNZW1vcnkiKTsKKworICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisJVmtSZXN1bHQgcmVzdWx0ID0gYWxsb2NhdG9yLT5BbGxvY2F0ZU1lbW9yeSgKKyAgICAgICAgKnBWa01lbW9yeVJlcXVpcmVtZW50cywKKyAgICAgICAgZmFsc2UsIC8vIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbgorICAgICAgICBmYWxzZSwgLy8gcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24KKyAgICAgICAgVktfTlVMTF9IQU5ETEUsIC8vIGRlZGljYXRlZEJ1ZmZlcgorICAgICAgICBWS19OVUxMX0hBTkRMRSwgLy8gZGVkaWNhdGVkSW1hZ2UKKyAgICAgICAgKnBDcmVhdGVJbmZvLAorICAgICAgICBWTUFfU1VCQUxMT0NBVElPTl9UWVBFX1VOS05PV04sCisgICAgICAgIDEsIC8vIGFsbG9jYXRpb25Db3VudAorICAgICAgICBwQWxsb2NhdGlvbik7CisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldFJlY29yZGVyKCktPlJlY29yZEFsbG9jYXRlTWVtb3J5KAorICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRDdXJyZW50RnJhbWVJbmRleCgpLAorICAgICAgICAgICAgKnBWa01lbW9yeVJlcXVpcmVtZW50cywKKyAgICAgICAgICAgICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICpwQWxsb2NhdGlvbik7CisgICAgfQorI2VuZGlmCisgICAgICAgIAorICAgIGlmKHBBbGxvY2F0aW9uSW5mbyAhPSBWTUFfTlVMTCAmJiByZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkluZm8oKnBBbGxvY2F0aW9uLCBwQWxsb2NhdGlvbkluZm8pOworICAgIH0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZtYUFsbG9jYXRlTWVtb3J5UGFnZXMoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyogcFZrTWVtb3J5UmVxdWlyZW1lbnRzLAorICAgIGNvbnN0IFZtYUFsbG9jYXRpb25DcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBzaXplX3QgYWxsb2NhdGlvbkNvdW50LAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9ucywKKyAgICBWbWFBbGxvY2F0aW9uSW5mbyogcEFsbG9jYXRpb25JbmZvKQoreworICAgIGlmKGFsbG9jYXRpb25Db3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgcFZrTWVtb3J5UmVxdWlyZW1lbnRzICYmIHBDcmVhdGVJbmZvICYmIHBBbGxvY2F0aW9ucyk7CisKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFBbGxvY2F0ZU1lbW9yeVBhZ2VzIik7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworCVZrUmVzdWx0IHJlc3VsdCA9IGFsbG9jYXRvci0+QWxsb2NhdGVNZW1vcnkoCisgICAgICAgICpwVmtNZW1vcnlSZXF1aXJlbWVudHMsCisgICAgICAgIGZhbHNlLCAvLyByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24KKyAgICAgICAgZmFsc2UsIC8vIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uCisgICAgICAgIFZLX05VTExfSEFORExFLCAvLyBkZWRpY2F0ZWRCdWZmZXIKKyAgICAgICAgVktfTlVMTF9IQU5ETEUsIC8vIGRlZGljYXRlZEltYWdlCisgICAgICAgICpwQ3JlYXRlSW5mbywKKyAgICAgICAgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9VTktOT1dOLAorICAgICAgICBhbGxvY2F0aW9uQ291bnQsCisgICAgICAgIHBBbGxvY2F0aW9ucyk7CisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldFJlY29yZGVyKCktPlJlY29yZEFsbG9jYXRlTWVtb3J5UGFnZXMoCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksCisgICAgICAgICAgICAqcFZrTWVtb3J5UmVxdWlyZW1lbnRzLAorICAgICAgICAgICAgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgKHVpbnQ2NF90KWFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgICAgIHBBbGxvY2F0aW9ucyk7CisgICAgfQorI2VuZGlmCisgICAgICAgIAorICAgIGlmKHBBbGxvY2F0aW9uSW5mbyAhPSBWTUFfTlVMTCAmJiByZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBhbGxvY2F0aW9uQ291bnQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uSW5mbyhwQWxsb2NhdGlvbnNbaV0sIHBBbGxvY2F0aW9uSW5mbyArIGkpOworICAgICAgICB9CisgICAgfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgdm1hQWxsb2NhdGVNZW1vcnlGb3JCdWZmZXIoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciBidWZmZXIsCisgICAgY29uc3QgVm1hQWxsb2NhdGlvbkNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9uLAorICAgIFZtYUFsbG9jYXRpb25JbmZvKiBwQWxsb2NhdGlvbkluZm8pCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgYnVmZmVyICE9IFZLX05VTExfSEFORExFICYmIHBDcmVhdGVJbmZvICYmIHBBbGxvY2F0aW9uKTsKKworICAgIFZNQV9ERUJVR19MT0coInZtYUFsbG9jYXRlTWVtb3J5Rm9yQnVmZmVyIik7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHZrTWVtUmVxID0ge307CisgICAgYm9vbCByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gPSBmYWxzZTsKKyAgICBib29sIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uID0gZmFsc2U7CisgICAgYWxsb2NhdG9yLT5HZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoYnVmZmVyLCB2a01lbVJlcSwKKyAgICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbik7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBhbGxvY2F0b3ItPkFsbG9jYXRlTWVtb3J5KAorICAgICAgICB2a01lbVJlcSwKKyAgICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICAgICAgYnVmZmVyLCAvLyBkZWRpY2F0ZWRCdWZmZXIKKyAgICAgICAgVktfTlVMTF9IQU5ETEUsIC8vIGRlZGljYXRlZEltYWdlCisgICAgICAgICpwQ3JlYXRlSW5mbywKKyAgICAgICAgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9CVUZGRVIsCisgICAgICAgIDEsIC8vIGFsbG9jYXRpb25Db3VudAorICAgICAgICBwQWxsb2NhdGlvbik7CisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldFJlY29yZGVyKCktPlJlY29yZEFsbG9jYXRlTWVtb3J5Rm9yQnVmZmVyKAorICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRDdXJyZW50RnJhbWVJbmRleCgpLAorICAgICAgICAgICAgdmtNZW1SZXEsCisgICAgICAgICAgICByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgICAgICAgICBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICAgICAgICAgICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICpwQWxsb2NhdGlvbik7CisgICAgfQorI2VuZGlmCisKKyAgICBpZihwQWxsb2NhdGlvbkluZm8gJiYgcmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldEFsbG9jYXRpb25JbmZvKCpwQWxsb2NhdGlvbiwgcEFsbG9jYXRpb25JbmZvKTsKKyAgICB9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCB2bWFBbGxvY2F0ZU1lbW9yeUZvckltYWdlKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVmtJbWFnZSBpbWFnZSwKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24sCisgICAgVm1hQWxsb2NhdGlvbkluZm8qIHBBbGxvY2F0aW9uSW5mbykKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvciAmJiBpbWFnZSAhPSBWS19OVUxMX0hBTkRMRSAmJiBwQ3JlYXRlSW5mbyAmJiBwQWxsb2NhdGlvbik7CisKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFBbGxvY2F0ZU1lbW9yeUZvckltYWdlIik7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHZrTWVtUmVxID0ge307CisgICAgYm9vbCByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gPSBmYWxzZTsKKyAgICBib29sIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uICA9IGZhbHNlOworICAgIGFsbG9jYXRvci0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoaW1hZ2UsIHZrTWVtUmVxLAorICAgICAgICByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24sIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uKTsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGFsbG9jYXRvci0+QWxsb2NhdGVNZW1vcnkoCisgICAgICAgIHZrTWVtUmVxLAorICAgICAgICByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgICAgIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICBWS19OVUxMX0hBTkRMRSwgLy8gZGVkaWNhdGVkQnVmZmVyCisgICAgICAgIGltYWdlLCAvLyBkZWRpY2F0ZWRJbWFnZQorICAgICAgICAqcENyZWF0ZUluZm8sCisgICAgICAgIFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfSU1BR0VfVU5LTk9XTiwKKyAgICAgICAgMSwgLy8gYWxsb2NhdGlvbkNvdW50CisgICAgICAgIHBBbGxvY2F0aW9uKTsKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIGlmKGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkQWxsb2NhdGVNZW1vcnlGb3JJbWFnZSgKKyAgICAgICAgICAgIGFsbG9jYXRvci0+R2V0Q3VycmVudEZyYW1lSW5kZXgoKSwKKyAgICAgICAgICAgIHZrTWVtUmVxLAorICAgICAgICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICAgICAgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24sCisgICAgICAgICAgICAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAqcEFsbG9jYXRpb24pOworICAgIH0KKyNlbmRpZgorCisgICAgaWYocEFsbG9jYXRpb25JbmZvICYmIHJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uSW5mbygqcEFsbG9jYXRpb24sIHBBbGxvY2F0aW9uSW5mbyk7CisgICAgfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCB2bWFGcmVlTWVtb3J5KAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yKTsKKyAgICAKKyAgICBpZihhbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFGcmVlTWVtb3J5Iik7CisgICAgCisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLCisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldFJlY29yZGVyKCktPlJlY29yZEZyZWVNZW1vcnkoCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksCisgICAgICAgICAgICBhbGxvY2F0aW9uKTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICBhbGxvY2F0b3ItPkZyZWVNZW1vcnkoCisgICAgICAgIDEsIC8vIGFsbG9jYXRpb25Db3VudAorICAgICAgICAmYWxsb2NhdGlvbik7Cit9CisKK3ZvaWQgdm1hRnJlZU1lbW9yeVBhZ2VzKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgc2l6ZV90IGFsbG9jYXRpb25Db3VudCwKKyAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbnMpCit7CisgICAgaWYoYWxsb2NhdGlvbkNvdW50ID09IDApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IpOworICAgIAorICAgIFZNQV9ERUJVR19MT0coInZtYUZyZWVNZW1vcnlQYWdlcyIpOworICAgIAorICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisgICAgaWYoYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpLT5SZWNvcmRGcmVlTWVtb3J5UGFnZXMoCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksCisgICAgICAgICAgICAodWludDY0X3QpYWxsb2NhdGlvbkNvdW50LAorICAgICAgICAgICAgcEFsbG9jYXRpb25zKTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICBhbGxvY2F0b3ItPkZyZWVNZW1vcnkoYWxsb2NhdGlvbkNvdW50LCBwQWxsb2NhdGlvbnMpOworfQorCitWa1Jlc3VsdCB2bWFSZXNpemVBbGxvY2F0aW9uKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIFZrRGV2aWNlU2l6ZSBuZXdTaXplKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIGFsbG9jYXRpb24pOworICAgIAorICAgIFZNQV9ERUJVR19MT0coInZtYVJlc2l6ZUFsbG9jYXRpb24iKTsKKyAgICAKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIGlmKGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkUmVzaXplQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGFsbG9jYXRvci0+R2V0Q3VycmVudEZyYW1lSW5kZXgoKSwKKyAgICAgICAgICAgIGFsbG9jYXRpb24sCisgICAgICAgICAgICBuZXdTaXplKTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICByZXR1cm4gYWxsb2NhdG9yLT5SZXNpemVBbGxvY2F0aW9uKGFsbG9jYXRpb24sIG5ld1NpemUpOworfQorCit2b2lkIHZtYUdldEFsbG9jYXRpb25JbmZvKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIFZtYUFsbG9jYXRpb25JbmZvKiBwQWxsb2NhdGlvbkluZm8pCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgYWxsb2NhdGlvbiAmJiBwQWxsb2NhdGlvbkluZm8pOworCisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLCisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldFJlY29yZGVyKCktPlJlY29yZEdldEFsbG9jYXRpb25JbmZvKAorICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRDdXJyZW50RnJhbWVJbmRleCgpLAorICAgICAgICAgICAgYWxsb2NhdGlvbik7CisgICAgfQorI2VuZGlmCisKKyAgICBhbGxvY2F0b3ItPkdldEFsbG9jYXRpb25JbmZvKGFsbG9jYXRpb24sIHBBbGxvY2F0aW9uSW5mbyk7Cit9CisKK1ZrQm9vbDMyIHZtYVRvdWNoQWxsb2NhdGlvbigKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbikKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvciAmJiBhbGxvY2F0aW9uKTsKKworICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisgICAgaWYoYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpLT5SZWNvcmRUb3VjaEFsbG9jYXRpb24oCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksCisgICAgICAgICAgICBhbGxvY2F0aW9uKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBhbGxvY2F0b3ItPlRvdWNoQWxsb2NhdGlvbihhbGxvY2F0aW9uKTsKK30KKwordm9pZCB2bWFTZXRBbGxvY2F0aW9uVXNlckRhdGEoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24sCisgICAgdm9pZCogcFVzZXJEYXRhKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIGFsbG9jYXRpb24pOworCisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLCisKKyAgICBhbGxvY2F0aW9uLT5TZXRVc2VyRGF0YShhbGxvY2F0b3IsIHBVc2VyRGF0YSk7CisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldFJlY29yZGVyKCktPlJlY29yZFNldEFsbG9jYXRpb25Vc2VyRGF0YSgKKyAgICAgICAgICAgIGFsbG9jYXRvci0+R2V0Q3VycmVudEZyYW1lSW5kZXgoKSwKKyAgICAgICAgICAgIGFsbG9jYXRpb24sCisgICAgICAgICAgICBwVXNlckRhdGEpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIHZtYUNyZWF0ZUxvc3RBbGxvY2F0aW9uKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiogcEFsbG9jYXRpb24pCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgcEFsbG9jYXRpb24pOworCisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLOworCisgICAgYWxsb2NhdG9yLT5DcmVhdGVMb3N0QWxsb2NhdGlvbihwQWxsb2NhdGlvbik7CisKKyNpZiBWTUFfUkVDT1JESU5HX0VOQUJMRUQKKyAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkdldFJlY29yZGVyKCktPlJlY29yZENyZWF0ZUxvc3RBbGxvY2F0aW9uKAorICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRDdXJyZW50RnJhbWVJbmRleCgpLAorICAgICAgICAgICAgKnBBbGxvY2F0aW9uKTsKKyAgICB9CisjZW5kaWYKK30KKworVmtSZXN1bHQgdm1hTWFwTWVtb3J5KAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIHZvaWQqKiBwcERhdGEpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgYWxsb2NhdGlvbiAmJiBwcERhdGEpOworCisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLCisKKyAgICBWa1Jlc3VsdCByZXMgPSBhbGxvY2F0b3ItPk1hcChhbGxvY2F0aW9uLCBwcERhdGEpOworCisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisgICAgaWYoYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpLT5SZWNvcmRNYXBNZW1vcnkoCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksCisgICAgICAgICAgICBhbGxvY2F0aW9uKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgdm1hVW5tYXBNZW1vcnkoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWbWFBbGxvY2F0aW9uIGFsbG9jYXRpb24pCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgYWxsb2NhdGlvbik7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIGlmKGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkVW5tYXBNZW1vcnkoCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksCisgICAgICAgICAgICBhbGxvY2F0aW9uKTsKKyAgICB9CisjZW5kaWYKKworICAgIGFsbG9jYXRvci0+VW5tYXAoYWxsb2NhdGlvbik7Cit9CisKK3ZvaWQgdm1hRmx1c2hBbGxvY2F0aW9uKFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgYWxsb2NhdGlvbik7CisKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFGbHVzaEFsbG9jYXRpb24iKTsKKworICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisgICAgYWxsb2NhdG9yLT5GbHVzaE9ySW52YWxpZGF0ZUFsbG9jYXRpb24oYWxsb2NhdGlvbiwgb2Zmc2V0LCBzaXplLCBWTUFfQ0FDSEVfRkxVU0gpOworCisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisgICAgaWYoYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpLT5SZWNvcmRGbHVzaEFsbG9jYXRpb24oCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksCisgICAgICAgICAgICBhbGxvY2F0aW9uLCBvZmZzZXQsIHNpemUpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIHZtYUludmFsaWRhdGVBbGxvY2F0aW9uKFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsIFZtYUFsbG9jYXRpb24gYWxsb2NhdGlvbiwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgYWxsb2NhdGlvbik7CisKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFJbnZhbGlkYXRlQWxsb2NhdGlvbiIpOworCisgICAgVk1BX0RFQlVHX0dMT0JBTF9NVVRFWF9MT0NLCisKKyAgICBhbGxvY2F0b3ItPkZsdXNoT3JJbnZhbGlkYXRlQWxsb2NhdGlvbihhbGxvY2F0aW9uLCBvZmZzZXQsIHNpemUsIFZNQV9DQUNIRV9JTlZBTElEQVRFKTsKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIGlmKGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkSW52YWxpZGF0ZUFsbG9jYXRpb24oCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksCisgICAgICAgICAgICBhbGxvY2F0aW9uLCBvZmZzZXQsIHNpemUpOworICAgIH0KKyNlbmRpZgorfQorCitWa1Jlc3VsdCB2bWFDaGVja0NvcnJ1cHRpb24oVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwgdWludDMyX3QgbWVtb3J5VHlwZUJpdHMpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IpOworCisgICAgVk1BX0RFQlVHX0xPRygidm1hQ2hlY2tDb3JydXB0aW9uIik7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworICAgIHJldHVybiBhbGxvY2F0b3ItPkNoZWNrQ29ycnVwdGlvbihtZW1vcnlUeXBlQml0cyk7Cit9CisKK1ZrUmVzdWx0IHZtYURlZnJhZ21lbnQoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbnMsCisgICAgc2l6ZV90IGFsbG9jYXRpb25Db3VudCwKKyAgICBWa0Jvb2wzMiogcEFsbG9jYXRpb25zQ2hhbmdlZCwKKyAgICBjb25zdCBWbWFEZWZyYWdtZW50YXRpb25JbmZvICpwRGVmcmFnbWVudGF0aW9uSW5mbywKKyAgICBWbWFEZWZyYWdtZW50YXRpb25TdGF0cyogcERlZnJhZ21lbnRhdGlvblN0YXRzKQoreworICAgIC8vIERlcHJlY2F0ZWQgaW50ZXJmYWNlLCByZWltcGxlbWVudGVkIHVzaW5nIG5ldyBvbmUuCisKKyAgICBWbWFEZWZyYWdtZW50YXRpb25JbmZvMiBpbmZvMiA9IHt9OworICAgIGluZm8yLmFsbG9jYXRpb25Db3VudCA9ICh1aW50MzJfdClhbGxvY2F0aW9uQ291bnQ7CisgICAgaW5mbzIucEFsbG9jYXRpb25zID0gcEFsbG9jYXRpb25zOworICAgIGluZm8yLnBBbGxvY2F0aW9uc0NoYW5nZWQgPSBwQWxsb2NhdGlvbnNDaGFuZ2VkOworICAgIGlmKHBEZWZyYWdtZW50YXRpb25JbmZvICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgaW5mbzIubWF4Q3B1QWxsb2NhdGlvbnNUb01vdmUgPSBwRGVmcmFnbWVudGF0aW9uSW5mby0+bWF4QWxsb2NhdGlvbnNUb01vdmU7CisgICAgICAgIGluZm8yLm1heENwdUJ5dGVzVG9Nb3ZlID0gcERlZnJhZ21lbnRhdGlvbkluZm8tPm1heEJ5dGVzVG9Nb3ZlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmZvMi5tYXhDcHVBbGxvY2F0aW9uc1RvTW92ZSA9IFVJTlQzMl9NQVg7CisgICAgICAgIGluZm8yLm1heENwdUJ5dGVzVG9Nb3ZlID0gVktfV0hPTEVfU0laRTsKKyAgICB9CisgICAgLy8gaW5mbzIuZmxhZ3MsIG1heEdwdUFsbG9jYXRpb25zVG9Nb3ZlLCBtYXhHcHVCeXRlc1RvTW92ZSwgY29tbWFuZEJ1ZmZlciBkZWxpYmVyYXRlbHkgbGVmdCB6ZXJvLgorCisgICAgVm1hRGVmcmFnbWVudGF0aW9uQ29udGV4dCBjdHg7CisgICAgVmtSZXN1bHQgcmVzID0gdm1hRGVmcmFnbWVudGF0aW9uQmVnaW4oYWxsb2NhdG9yLCAmaW5mbzIsIHBEZWZyYWdtZW50YXRpb25TdGF0cywgJmN0eCk7CisgICAgaWYocmVzID09IFZLX05PVF9SRUFEWSkKKyAgICB7CisgICAgICAgIHJlcyA9IHZtYURlZnJhZ21lbnRhdGlvbkVuZCggYWxsb2NhdG9yLCBjdHgpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitWa1Jlc3VsdCB2bWFEZWZyYWdtZW50YXRpb25CZWdpbigKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIGNvbnN0IFZtYURlZnJhZ21lbnRhdGlvbkluZm8yKiBwSW5mbywKKyAgICBWbWFEZWZyYWdtZW50YXRpb25TdGF0cyogcFN0YXRzLAorICAgIFZtYURlZnJhZ21lbnRhdGlvbkNvbnRleHQgKnBDb250ZXh0KQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIHBJbmZvICYmIHBDb250ZXh0KTsKKworICAgIC8vIERlZ2VuZXJhdGUgY2FzZTogTm90aGluZyB0byBkZWZyYWdtZW50LgorICAgIGlmKHBJbmZvLT5hbGxvY2F0aW9uQ291bnQgPT0gMCAmJiBwSW5mby0+cG9vbENvdW50ID09IDApCisgICAgeworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBWTUFfQVNTRVJUKHBJbmZvLT5hbGxvY2F0aW9uQ291bnQgPT0gMCB8fCBwSW5mby0+cEFsbG9jYXRpb25zICE9IFZNQV9OVUxMKTsKKyAgICBWTUFfQVNTRVJUKHBJbmZvLT5wb29sQ291bnQgPT0gMCB8fCBwSW5mby0+cFBvb2xzICE9IFZNQV9OVUxMKTsKKyAgICBWTUFfSEVBVllfQVNTRVJUKFZtYVZhbGlkYXRlUG9pbnRlckFycmF5KHBJbmZvLT5hbGxvY2F0aW9uQ291bnQsIHBJbmZvLT5wQWxsb2NhdGlvbnMpKTsKKyAgICBWTUFfSEVBVllfQVNTRVJUKFZtYVZhbGlkYXRlUG9pbnRlckFycmF5KHBJbmZvLT5wb29sQ291bnQsIHBJbmZvLT5wUG9vbHMpKTsKKworICAgIFZNQV9ERUJVR19MT0coInZtYURlZnJhZ21lbnRhdGlvbkJlZ2luIik7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworICAgIFZrUmVzdWx0IHJlcyA9IGFsbG9jYXRvci0+RGVmcmFnbWVudGF0aW9uQmVnaW4oKnBJbmZvLCBwU3RhdHMsIHBDb250ZXh0KTsKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIGlmKGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkRGVmcmFnbWVudGF0aW9uQmVnaW4oCisgICAgICAgICAgICBhbGxvY2F0b3ItPkdldEN1cnJlbnRGcmFtZUluZGV4KCksICpwSW5mbywgKnBDb250ZXh0KTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByZXM7Cit9CisKK1ZrUmVzdWx0IHZtYURlZnJhZ21lbnRhdGlvbkVuZCgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZtYURlZnJhZ21lbnRhdGlvbkNvbnRleHQgY29udGV4dCkKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvcik7CisKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFEZWZyYWdtZW50YXRpb25FbmQiKTsKKworICAgIGlmKGNvbnRleHQgIT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgICAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkRGVmcmFnbWVudGF0aW9uRW5kKAorICAgICAgICAgICAgICAgIGFsbG9jYXRvci0+R2V0Q3VycmVudEZyYW1lSW5kZXgoKSwgY29udGV4dCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybiBhbGxvY2F0b3ItPkRlZnJhZ21lbnRhdGlvbkVuZChjb250ZXh0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorfQorCitWa1Jlc3VsdCB2bWFCaW5kQnVmZmVyTWVtb3J5KAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIFZrQnVmZmVyIGJ1ZmZlcikKK3sKKyAgICBWTUFfQVNTRVJUKGFsbG9jYXRvciAmJiBhbGxvY2F0aW9uICYmIGJ1ZmZlcik7CisKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFCaW5kQnVmZmVyTWVtb3J5Iik7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworICAgIHJldHVybiBhbGxvY2F0b3ItPkJpbmRCdWZmZXJNZW1vcnkoYWxsb2NhdGlvbiwgYnVmZmVyKTsKK30KKworVmtSZXN1bHQgdm1hQmluZEltYWdlTWVtb3J5KAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uLAorICAgIFZrSW1hZ2UgaW1hZ2UpCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgYWxsb2NhdGlvbiAmJiBpbWFnZSk7CisKKyAgICBWTUFfREVCVUdfTE9HKCJ2bWFCaW5kSW1hZ2VNZW1vcnkiKTsKKworICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisgICAgcmV0dXJuIGFsbG9jYXRvci0+QmluZEltYWdlTWVtb3J5KGFsbG9jYXRpb24sIGltYWdlKTsKK30KKworVmtSZXN1bHQgdm1hQ3JlYXRlQnVmZmVyKAorICAgIFZtYUFsbG9jYXRvciBhbGxvY2F0b3IsCisgICAgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQnVmZmVyQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyogcEFsbG9jYXRpb25DcmVhdGVJbmZvLAorICAgIFZrQnVmZmVyKiBwQnVmZmVyLAorICAgIFZtYUFsbG9jYXRpb24qIHBBbGxvY2F0aW9uLAorICAgIFZtYUFsbG9jYXRpb25JbmZvKiBwQWxsb2NhdGlvbkluZm8pCit7CisgICAgVk1BX0FTU0VSVChhbGxvY2F0b3IgJiYgcEJ1ZmZlckNyZWF0ZUluZm8gJiYgcEFsbG9jYXRpb25DcmVhdGVJbmZvICYmIHBCdWZmZXIgJiYgcEFsbG9jYXRpb24pOworCisgICAgaWYocEJ1ZmZlckNyZWF0ZUluZm8tPnNpemUgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorICAgIAorICAgIFZNQV9ERUJVR19MT0coInZtYUNyZWF0ZUJ1ZmZlciIpOworICAgIAorICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisgICAgKnBCdWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAqcEFsbG9jYXRpb24gPSBWS19OVUxMX0hBTkRMRTsKKworICAgIC8vIDEuIENyZWF0ZSBWa0J1ZmZlci4KKyAgICBWa1Jlc3VsdCByZXMgPSAoKmFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtDcmVhdGVCdWZmZXIpKAorICAgICAgICBhbGxvY2F0b3ItPm1faERldmljZSwKKyAgICAgICAgcEJ1ZmZlckNyZWF0ZUluZm8sCisgICAgICAgIGFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpLAorICAgICAgICBwQnVmZmVyKTsKKyAgICBpZihyZXMgPj0gMCkKKyAgICB7CisgICAgICAgIC8vIDIuIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzLgorICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyB2a01lbVJlcSA9IHt9OworICAgICAgICBib29sIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiA9IGZhbHNlOworICAgICAgICBib29sIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uICA9IGZhbHNlOworICAgICAgICBhbGxvY2F0b3ItPkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cygqcEJ1ZmZlciwgdmtNZW1SZXEsCisgICAgICAgICAgICByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24sIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBmb3Igc3BlY2lmaWMgYnVmZmVyIHVzYWdlcyByZXBvcnRlZAorICAgICAgICAvLyBpbiBQaHlzaWNhbCBEZXZpY2UgUHJvcGVydGllcyBhcmUgaW5jbHVkZWQgaW4gYWxpZ25tZW50IHJlcG9ydGVkIGJ5IG1lbW9yeSByZXF1aXJlbWVudHMuCisgICAgICAgIGlmKChwQnVmZmVyQ3JlYXRlSW5mby0+dXNhZ2UgJiBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgIFZNQV9BU1NFUlQodmtNZW1SZXEuYWxpZ25tZW50ICUKKyAgICAgICAgICAgICAgYWxsb2NhdG9yLT5tX1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcy5saW1pdHMubWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQgPT0gMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoKHBCdWZmZXJDcmVhdGVJbmZvLT51c2FnZSAmIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgVk1BX0FTU0VSVCh2a01lbVJlcS5hbGlnbm1lbnQgJQorICAgICAgICAgICAgICBhbGxvY2F0b3ItPm1fUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzLmxpbWl0cy5taW5Vbmlmb3JtQnVmZmVyT2Zmc2V0QWxpZ25tZW50ID09IDApOworICAgICAgICB9CisgICAgICAgIGlmKChwQnVmZmVyQ3JlYXRlSW5mby0+dXNhZ2UgJiBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgIFZNQV9BU1NFUlQodmtNZW1SZXEuYWxpZ25tZW50ICUKKyAgICAgICAgICAgICAgYWxsb2NhdG9yLT5tX1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcy5saW1pdHMubWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCA9PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDMuIEFsbG9jYXRlIG1lbW9yeSB1c2luZyBhbGxvY2F0b3IuCisgICAgICAgIHJlcyA9IGFsbG9jYXRvci0+QWxsb2NhdGVNZW1vcnkoCisgICAgICAgICAgICB2a01lbVJlcSwKKyAgICAgICAgICAgIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICAgICAgICAgIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICAgICAgKnBCdWZmZXIsIC8vIGRlZGljYXRlZEJ1ZmZlcgorICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsIC8vIGRlZGljYXRlZEltYWdlCisgICAgICAgICAgICAqcEFsbG9jYXRpb25DcmVhdGVJbmZvLAorICAgICAgICAgICAgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9CVUZGRVIsCisgICAgICAgICAgICAxLCAvLyBhbGxvY2F0aW9uQ291bnQKKyAgICAgICAgICAgIHBBbGxvY2F0aW9uKTsKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgICAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkQ3JlYXRlQnVmZmVyKAorICAgICAgICAgICAgICAgIGFsbG9jYXRvci0+R2V0Q3VycmVudEZyYW1lSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAqcEJ1ZmZlckNyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgKnBBbGxvY2F0aW9uQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAqcEFsbG9jYXRpb24pOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZihyZXMgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMy4gQmluZCBidWZmZXIgd2l0aCBtZW1vcnkuCisgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3ItPkJpbmRCdWZmZXJNZW1vcnkoKnBBbGxvY2F0aW9uLCAqcEJ1ZmZlcik7CisgICAgICAgICAgICBpZihyZXMgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgc3RlcHMgc3VjY2VlZGVkLgorICAgICAgICAgICAgICAgICNpZiBWTUFfU1RBVFNfU1RSSU5HX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgKCpwQWxsb2NhdGlvbiktPkluaXRCdWZmZXJJbWFnZVVzYWdlKHBCdWZmZXJDcmVhdGVJbmZvLT51c2FnZSk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgaWYocEFsbG9jYXRpb25JbmZvICE9IFZNQV9OVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uSW5mbygqcEFsbG9jYXRpb24sIHBBbGxvY2F0aW9uSW5mbyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbGxvY2F0b3ItPkZyZWVNZW1vcnkoCisgICAgICAgICAgICAgICAgMSwgLy8gYWxsb2NhdGlvbkNvdW50CisgICAgICAgICAgICAgICAgcEFsbG9jYXRpb24pOworICAgICAgICAgICAgKnBBbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICAoKmFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtEZXN0cm95QnVmZmVyKShhbGxvY2F0b3ItPm1faERldmljZSwgKnBCdWZmZXIsIGFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpKTsKKyAgICAgICAgICAgICpwQnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgICgqYWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a0Rlc3Ryb3lCdWZmZXIpKGFsbG9jYXRvci0+bV9oRGV2aWNlLCAqcEJ1ZmZlciwgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCkpOworICAgICAgICAqcEJ1ZmZlciA9IFZLX05VTExfSEFORExFOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIHZtYURlc3Ryb3lCdWZmZXIoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBWa0J1ZmZlciBidWZmZXIsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yKTsKKworICAgIGlmKGJ1ZmZlciA9PSBWS19OVUxMX0hBTkRMRSAmJiBhbGxvY2F0aW9uID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZNQV9ERUJVR19MT0coInZtYURlc3Ryb3lCdWZmZXIiKTsKKworICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisjaWYgVk1BX1JFQ09SRElOR19FTkFCTEVECisgICAgaWYoYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpICE9IFZNQV9OVUxMKQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yLT5HZXRSZWNvcmRlcigpLT5SZWNvcmREZXN0cm95QnVmZmVyKAorICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRDdXJyZW50RnJhbWVJbmRleCgpLAorICAgICAgICAgICAgYWxsb2NhdGlvbik7CisgICAgfQorI2VuZGlmCisKKyAgICBpZihidWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICAoKmFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtEZXN0cm95QnVmZmVyKShhbGxvY2F0b3ItPm1faERldmljZSwgYnVmZmVyLCBhbGxvY2F0b3ItPkdldEFsbG9jYXRpb25DYWxsYmFja3MoKSk7CisgICAgfQorCisgICAgaWYoYWxsb2NhdGlvbiAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+RnJlZU1lbW9yeSgKKyAgICAgICAgICAgIDEsIC8vIGFsbG9jYXRpb25Db3VudAorICAgICAgICAgICAgJmFsbG9jYXRpb24pOworICAgIH0KK30KKworVmtSZXN1bHQgdm1hQ3JlYXRlSW1hZ2UoCisgICAgVm1hQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyogcEltYWdlQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWbWFBbGxvY2F0aW9uQ3JlYXRlSW5mbyogcEFsbG9jYXRpb25DcmVhdGVJbmZvLAorICAgIFZrSW1hZ2UqIHBJbWFnZSwKKyAgICBWbWFBbGxvY2F0aW9uKiBwQWxsb2NhdGlvbiwKKyAgICBWbWFBbGxvY2F0aW9uSW5mbyogcEFsbG9jYXRpb25JbmZvKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yICYmIHBJbWFnZUNyZWF0ZUluZm8gJiYgcEFsbG9jYXRpb25DcmVhdGVJbmZvICYmIHBJbWFnZSAmJiBwQWxsb2NhdGlvbik7CisKKyAgICBpZihwSW1hZ2VDcmVhdGVJbmZvLT5leHRlbnQud2lkdGggPT0gMCB8fAorICAgICAgICBwSW1hZ2VDcmVhdGVJbmZvLT5leHRlbnQuaGVpZ2h0ID09IDAgfHwKKyAgICAgICAgcEltYWdlQ3JlYXRlSW5mby0+ZXh0ZW50LmRlcHRoID09IDAgfHwKKyAgICAgICAgcEltYWdlQ3JlYXRlSW5mby0+bWlwTGV2ZWxzID09IDAgfHwKKyAgICAgICAgcEltYWdlQ3JlYXRlSW5mby0+YXJyYXlMYXllcnMgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVk1BX0RFQlVHX0xPRygidm1hQ3JlYXRlSW1hZ2UiKTsKKworICAgIFZNQV9ERUJVR19HTE9CQUxfTVVURVhfTE9DSworCisgICAgKnBJbWFnZSA9IFZLX05VTExfSEFORExFOworICAgICpwQWxsb2NhdGlvbiA9IFZLX05VTExfSEFORExFOworCisgICAgLy8gMS4gQ3JlYXRlIFZrSW1hZ2UuCisgICAgVmtSZXN1bHQgcmVzID0gKCphbGxvY2F0b3ItPkdldFZ1bGthbkZ1bmN0aW9ucygpLnZrQ3JlYXRlSW1hZ2UpKAorICAgICAgICBhbGxvY2F0b3ItPm1faERldmljZSwKKyAgICAgICAgcEltYWdlQ3JlYXRlSW5mbywKKyAgICAgICAgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uQ2FsbGJhY2tzKCksCisgICAgICAgIHBJbWFnZSk7CisgICAgaWYocmVzID49IDApCisgICAgeworICAgICAgICBWbWFTdWJhbGxvY2F0aW9uVHlwZSBzdWJhbGxvY1R5cGUgPSBwSW1hZ2VDcmVhdGVJbmZvLT50aWxpbmcgPT0gVktfSU1BR0VfVElMSU5HX09QVElNQUwgPworICAgICAgICAgICAgVk1BX1NVQkFMTE9DQVRJT05fVFlQRV9JTUFHRV9PUFRJTUFMIDoKKyAgICAgICAgICAgIFZNQV9TVUJBTExPQ0FUSU9OX1RZUEVfSU1BR0VfTElORUFSOworICAgICAgICAKKyAgICAgICAgLy8gMi4gQWxsb2NhdGUgbWVtb3J5IHVzaW5nIGFsbG9jYXRvci4KKyAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgdmtNZW1SZXEgPSB7fTsKKyAgICAgICAgYm9vbCByZXF1aXJlc0RlZGljYXRlZEFsbG9jYXRpb24gPSBmYWxzZTsKKyAgICAgICAgYm9vbCBwcmVmZXJzRGVkaWNhdGVkQWxsb2NhdGlvbiAgPSBmYWxzZTsKKyAgICAgICAgYWxsb2NhdG9yLT5HZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cygqcEltYWdlLCB2a01lbVJlcSwKKyAgICAgICAgICAgIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiwgcHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24pOworCisgICAgICAgIHJlcyA9IGFsbG9jYXRvci0+QWxsb2NhdGVNZW1vcnkoCisgICAgICAgICAgICB2a01lbVJlcSwKKyAgICAgICAgICAgIHJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbiwKKyAgICAgICAgICAgIHByZWZlcnNEZWRpY2F0ZWRBbGxvY2F0aW9uLAorICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsIC8vIGRlZGljYXRlZEJ1ZmZlcgorICAgICAgICAgICAgKnBJbWFnZSwgLy8gZGVkaWNhdGVkSW1hZ2UKKyAgICAgICAgICAgICpwQWxsb2NhdGlvbkNyZWF0ZUluZm8sCisgICAgICAgICAgICBzdWJhbGxvY1R5cGUsCisgICAgICAgICAgICAxLCAvLyBhbGxvY2F0aW9uQ291bnQKKyAgICAgICAgICAgIHBBbGxvY2F0aW9uKTsKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgICAgICBpZihhbGxvY2F0b3ItPkdldFJlY29yZGVyKCkgIT0gVk1BX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkQ3JlYXRlSW1hZ2UoCisgICAgICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRDdXJyZW50RnJhbWVJbmRleCgpLAorICAgICAgICAgICAgICAgICpwSW1hZ2VDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICpwQWxsb2NhdGlvbkNyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgKnBBbGxvY2F0aW9uKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYocmVzID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIDMuIEJpbmQgaW1hZ2Ugd2l0aCBtZW1vcnkuCisgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3ItPkJpbmRJbWFnZU1lbW9yeSgqcEFsbG9jYXRpb24sICpwSW1hZ2UpOworICAgICAgICAgICAgaWYocmVzID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWxsIHN0ZXBzIHN1Y2NlZWRlZC4KKyAgICAgICAgICAgICAgICAjaWYgVk1BX1NUQVRTX1NUUklOR19FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICgqcEFsbG9jYXRpb24pLT5Jbml0QnVmZmVySW1hZ2VVc2FnZShwSW1hZ2VDcmVhdGVJbmZvLT51c2FnZSk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgaWYocEFsbG9jYXRpb25JbmZvICE9IFZNQV9OVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRBbGxvY2F0aW9uSW5mbygqcEFsbG9jYXRpb24sIHBBbGxvY2F0aW9uSW5mbyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbGxvY2F0b3ItPkZyZWVNZW1vcnkoCisgICAgICAgICAgICAgICAgMSwgLy8gYWxsb2NhdGlvbkNvdW50CisgICAgICAgICAgICAgICAgcEFsbG9jYXRpb24pOworICAgICAgICAgICAgKnBBbGxvY2F0aW9uID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICAoKmFsbG9jYXRvci0+R2V0VnVsa2FuRnVuY3Rpb25zKCkudmtEZXN0cm95SW1hZ2UpKGFsbG9jYXRvci0+bV9oRGV2aWNlLCAqcEltYWdlLCBhbGxvY2F0b3ItPkdldEFsbG9jYXRpb25DYWxsYmFja3MoKSk7CisgICAgICAgICAgICAqcEltYWdlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgICgqYWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a0Rlc3Ryb3lJbWFnZSkoYWxsb2NhdG9yLT5tX2hEZXZpY2UsICpwSW1hZ2UsIGFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkNhbGxiYWNrcygpKTsKKyAgICAgICAgKnBJbWFnZSA9IFZLX05VTExfSEFORExFOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIHZtYURlc3Ryb3lJbWFnZSgKKyAgICBWbWFBbGxvY2F0b3IgYWxsb2NhdG9yLAorICAgIFZrSW1hZ2UgaW1hZ2UsCisgICAgVm1hQWxsb2NhdGlvbiBhbGxvY2F0aW9uKQoreworICAgIFZNQV9BU1NFUlQoYWxsb2NhdG9yKTsKKworICAgIGlmKGltYWdlID09IFZLX05VTExfSEFORExFICYmIGFsbG9jYXRpb24gPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVk1BX0RFQlVHX0xPRygidm1hRGVzdHJveUltYWdlIik7CisKKyAgICBWTUFfREVCVUdfR0xPQkFMX01VVEVYX0xPQ0sKKworI2lmIFZNQV9SRUNPUkRJTkdfRU5BQkxFRAorICAgIGlmKGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKSAhPSBWTUFfTlVMTCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvci0+R2V0UmVjb3JkZXIoKS0+UmVjb3JkRGVzdHJveUltYWdlKAorICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRDdXJyZW50RnJhbWVJbmRleCgpLAorICAgICAgICAgICAgYWxsb2NhdGlvbik7CisgICAgfQorI2VuZGlmCisKKyAgICBpZihpbWFnZSAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgICgqYWxsb2NhdG9yLT5HZXRWdWxrYW5GdW5jdGlvbnMoKS52a0Rlc3Ryb3lJbWFnZSkoYWxsb2NhdG9yLT5tX2hEZXZpY2UsIGltYWdlLCBhbGxvY2F0b3ItPkdldEFsbG9jYXRpb25DYWxsYmFja3MoKSk7CisgICAgfQorICAgIGlmKGFsbG9jYXRpb24gIT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICBhbGxvY2F0b3ItPkZyZWVNZW1vcnkoCisgICAgICAgICAgICAxLCAvLyBhbGxvY2F0aW9uQ291bnQKKyAgICAgICAgICAgICZhbGxvY2F0aW9uKTsKKyAgICB9Cit9CisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8vICNpZmRlZiBWTUFfSU1QTEVNRU5UQVRJT04KKy8vIGNsYW5nLWZvcm1hdCBvbgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3h4aGFzaC5jIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3h4aGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2I5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMveHhoYXNoLmMKQEAgLTAsMCArMSw4ODggQEAKKy8qCisqICB4eEhhc2ggLSBGYXN0IEhhc2ggYWxnb3JpdGhtCisqICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiwgWWFubiBDb2xsZXQKKyoKKyogIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKKyoKKyogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiAgbWV0OgorKgorKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisqICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICBkaXN0cmlidXRpb24uCisqCisqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisqICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorKiAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisqICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorKiAgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisqICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisqICBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisqICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKiAgWW91IGNhbiBjb250YWN0IHRoZSBhdXRob3IgYXQgOgorKiAgLSB4eEhhc2ggaG9tZXBhZ2U6IGh0dHA6Ly93d3cueHhoYXNoLmNvbQorKiAgLSB4eEhhc2ggc291cmNlIHJlcG9zaXRvcnkgOiBodHRwczovL2dpdGh1Yi5jb20vQ3lhbjQ5NzMveHhIYXNoCisqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFR1bmluZyBwYXJhbWV0ZXJzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiFYWEhfRk9SQ0VfTUVNT1JZX0FDQ0VTUyA6CisgKiBCeSBkZWZhdWx0LCBhY2Nlc3MgdG8gdW5hbGlnbmVkIG1lbW9yeSBpcyBjb250cm9sbGVkIGJ5IGBtZW1jcHkoKWAsIHdoaWNoIGlzIHNhZmUgYW5kIHBvcnRhYmxlLgorICogVW5mb3J0dW5hdGVseSwgb24gc29tZSB0YXJnZXQvY29tcGlsZXIgY29tYmluYXRpb25zLCB0aGUgZ2VuZXJhdGVkIGFzc2VtYmx5IGlzIHN1Yi1vcHRpbWFsLgorICogVGhlIGJlbG93IHN3aXRjaCBhbGxvdyB0byBzZWxlY3QgZGlmZmVyZW50IGFjY2VzcyBtZXRob2QgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlLgorICogTWV0aG9kIDAgKGRlZmF1bHQpIDogdXNlIGBtZW1jcHkoKWAuIFNhZmUgYW5kIHBvcnRhYmxlLgorICogTWV0aG9kIDEgOiBgX19wYWNrZWRgIHN0YXRlbWVudC4gSXQgZGVwZW5kcyBvbiBjb21waWxlciBleHRlbnNpb24gKGllLCBub3QgcG9ydGFibGUpLgorICogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBzYWZlIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaXQsIGFuZCAqZ2VuZXJhbGx5KiBhcyBmYXN0IG9yIGZhc3RlciB0aGFuIGBtZW1jcHlgLgorICogTWV0aG9kIDIgOiBkaXJlY3QgYWNjZXNzLiBUaGlzIG1ldGhvZCBkb2Vzbid0IGRlcGVuZCBvbiBjb21waWxlciBidXQgdmlvbGF0ZSBDIHN0YW5kYXJkLgorICogICAgICAgICAgICBJdCBjYW4gZ2VuZXJhdGUgYnVnZ3kgY29kZSBvbiB0YXJnZXRzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMuCisgKiAgICAgICAgICAgIEJ1dCBpbiBzb21lIGNpcmN1bXN0YW5jZXMsIGl0J3MgdGhlIG9ubHkga25vd24gd2F5IHRvIGdldCB0aGUgbW9zdCBwZXJmb3JtYW5jZSAoaWUgR0NDICsgQVJNdjYpCisgKiBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzIwOTUxMDYvNjQ2OTQ3IGZvciBkZXRhaWxzLgorICogUHJlZmVyIHRoZXNlIG1ldGhvZHMgaW4gcHJpb3JpdHkgb3JkZXIgKDAgPiAxID4gMikKKyAqLworI2lmbmRlZiBYWEhfRk9SQ0VfTUVNT1JZX0FDQ0VTUyAgIC8qIGNhbiBiZSBkZWZpbmVkIGV4dGVybmFsbHksIG9uIGNvbW1hbmQgbGluZSBmb3IgZXhhbXBsZSAqLworIyAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZLX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Wl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpLX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgKQorIyAgICBkZWZpbmUgWFhIX0ZPUkNFX01FTU9SWV9BQ0NFU1MgMgorIyAgZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpIHx8IFwKKyAgKGRlZmluZWQoX19HTlVDX18pICYmICggZGVmaW5lZChfX0FSTV9BUkNIXzdfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83Ul9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN01fXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdTX18pICkpCisjICAgIGRlZmluZSBYWEhfRk9SQ0VfTUVNT1JZX0FDQ0VTUyAxCisjICBlbmRpZgorI2VuZGlmCisKKy8qIVhYSF9BQ0NFUFRfTlVMTF9JTlBVVF9QT0lOVEVSIDoKKyAqIElmIHRoZSBpbnB1dCBwb2ludGVyIGlzIGEgbnVsbCBwb2ludGVyLCB4eEhhc2ggZGVmYXVsdCBiZWhhdmlvciBpcyB0byB0cmlnZ2VyIGEgbWVtb3J5IGFjY2VzcyBlcnJvciwgc2luY2UgaXQgaXMgYSBiYWQgcG9pbnRlci4KKyAqIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgeHhIYXNoIG91dHB1dCBmb3IgbnVsbCBpbnB1dCBwb2ludGVycyB3aWxsIGJlIHRoZSBzYW1lIGFzIGEgbnVsbC1sZW5ndGggaW5wdXQuCisgKiBCeSBkZWZhdWx0LCB0aGlzIG9wdGlvbiBpcyBkaXNhYmxlZC4gVG8gZW5hYmxlIGl0LCB1bmNvbW1lbnQgYmVsb3cgZGVmaW5lIDoKKyAqLworLyogI2RlZmluZSBYWEhfQUNDRVBUX05VTExfSU5QVVRfUE9JTlRFUiAxICovCisKKy8qIVhYSF9GT1JDRV9OQVRJVkVfRk9STUFUIDoKKyAqIEJ5IGRlZmF1bHQsIHh4SGFzaCBsaWJyYXJ5IHByb3ZpZGVzIGVuZGlhbi1pbmRlcGVuZGVudCBIYXNoIHZhbHVlcywgYmFzZWQgb24gbGl0dGxlLWVuZGlhbiBjb252ZW50aW9uLgorICogUmVzdWx0cyBhcmUgdGhlcmVmb3JlIGlkZW50aWNhbCBmb3IgbGl0dGxlLWVuZGlhbiBhbmQgYmlnLWVuZGlhbiBDUFUuCisgKiBUaGlzIGNvbWVzIGF0IGEgcGVyZm9ybWFuY2UgY29zdCBmb3IgYmlnLWVuZGlhbiBDUFUsIHNpbmNlIHNvbWUgc3dhcHBpbmcgaXMgcmVxdWlyZWQgdG8gZW11bGF0ZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAqIFNob3VsZCBlbmRpYW4taW5kZXBlbmRlbmNlIGJlIG9mIG5vIGltcG9ydGFuY2UgZm9yIHlvdXIgYXBwbGljYXRpb24sIHlvdSBtYXkgc2V0IHRoZSAjZGVmaW5lIGJlbG93IHRvIDEsCisgKiB0byBpbXByb3ZlIHNwZWVkIGZvciBCaWctZW5kaWFuIENQVS4KKyAqIFRoaXMgb3B0aW9uIGhhcyBubyBpbXBhY3Qgb24gTGl0dGxlX0VuZGlhbiBDUFUuCisgKi8KKyNpZm5kZWYgWFhIX0ZPUkNFX05BVElWRV9GT1JNQVQgICAvKiBjYW4gYmUgZGVmaW5lZCBleHRlcm5hbGx5ICovCisjICBkZWZpbmUgWFhIX0ZPUkNFX05BVElWRV9GT1JNQVQgMAorI2VuZGlmCisKKy8qIVhYSF9GT1JDRV9BTElHTl9DSEVDSyA6CisgKiBUaGlzIGlzIGEgbWlub3IgcGVyZm9ybWFuY2UgdHJpY2ssIG9ubHkgdXNlZnVsIHdpdGggbG90cyBvZiB2ZXJ5IHNtYWxsIGtleXMuCisgKiBJdCBtZWFucyA6IGNoZWNrIGZvciBhbGlnbmVkL3VuYWxpZ25lZCBpbnB1dC4KKyAqIFRoZSBjaGVjayBjb3N0cyBvbmUgaW5pdGlhbCBicmFuY2ggcGVyIGhhc2g7CisgKiBzZXQgaXQgdG8gMCB3aGVuIHRoZSBpbnB1dCBpcyBndWFyYW50ZWVkIHRvIGJlIGFsaWduZWQsCisgKiBvciB3aGVuIGFsaWdubWVudCBkb2Vzbid0IG1hdHRlciBmb3IgcGVyZm9ybWFuY2UuCisgKi8KKyNpZm5kZWYgWFhIX0ZPUkNFX0FMSUdOX0NIRUNLIC8qIGNhbiBiZSBkZWZpbmVkIGV4dGVybmFsbHkgKi8KKyMgIGlmIGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpCisjICAgIGRlZmluZSBYWEhfRk9SQ0VfQUxJR05fQ0hFQ0sgMAorIyAgZWxzZQorIyAgICBkZWZpbmUgWFhIX0ZPUkNFX0FMSUdOX0NIRUNLIDEKKyMgIGVuZGlmCisjZW5kaWYKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJbmNsdWRlcyAmIE1lbW9yeSByZWxhdGVkIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohIE1vZGlmeSB0aGUgbG9jYWwgZnVuY3Rpb25zIGJlbG93IHNob3VsZCB5b3Ugd2lzaCB0byB1c2Ugc29tZSBvdGhlciBtZW1vcnkgcm91dGluZXMKKyogICBmb3IgbWFsbG9jKCksIGZyZWUoKSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorc3RhdGljIHZvaWQqIFhYSF9tYWxsb2Moc2l6ZV90IHMpIHsgcmV0dXJuIG1hbGxvYyhzKTsgfQorc3RhdGljIHZvaWQgIFhYSF9mcmVlICAodm9pZCogcCkgIHsgZnJlZShwKTsgfQorLyohIGFuZCBmb3IgbWVtY3B5KCkgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KK3N0YXRpYyB2b2lkKiBYWEhfbWVtY3B5KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IHNpemUpIHsgcmV0dXJuIG1lbWNweShkZXN0LHNyYyxzaXplKTsgfQorCisjZGVmaW5lIFhYSF9TVEFUSUNfTElOS0lOR19PTkxZCisjaW5jbHVkZSAieHhoYXNoLmgiCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQ29tcGlsZXIgU3BlY2lmaWMgT3B0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9NU0NfVkVSICAgIC8qIFZpc3VhbCBTdHVkaW8gKi8KKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MTI3KSAgICAgIC8qIGRpc2FibGU6IEM0MTI3OiBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50ICovCisjICBkZWZpbmUgRk9SQ0VfSU5MSU5FIHN0YXRpYyBfX2ZvcmNlaW5saW5lCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCAgIC8qIEM5OSAqLworIyAgICBpZmRlZiBfX0dOVUNfXworIyAgICAgIGRlZmluZSBGT1JDRV9JTkxJTkUgc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGT1JDRV9JTkxJTkUgc3RhdGljIGlubGluZQorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBkZWZpbmUgRk9SQ0VfSU5MSU5FIHN0YXRpYworIyAgZW5kaWYgLyogX19TVERDX1ZFUlNJT05fXyAqLworI2VuZGlmCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQmFzaWMgVHlwZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgTUVNX01PRFVMRQorIyBpZiAhZGVmaW5lZCAoX19WTVMpICYmIChkZWZpbmVkIChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIC8qIEM5OSAqLykgKQorIyAgIGluY2x1ZGUgPHN0ZGludC5oPgorICAgIHR5cGVkZWYgdWludDhfdCAgQllURTsKKyAgICB0eXBlZGVmIHVpbnQxNl90IFUxNjsKKyAgICB0eXBlZGVmIHVpbnQzMl90IFUzMjsKKyMgZWxzZQorICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgIEJZVEU7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgVTE2OworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgIFUzMjsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoWFhIX0ZPUkNFX01FTU9SWV9BQ0NFU1MpICYmIChYWEhfRk9SQ0VfTUVNT1JZX0FDQ0VTUz09MikpCisKKy8qIEZvcmNlIGRpcmVjdCBtZW1vcnkgYWNjZXNzLiBPbmx5IHdvcmtzIG9uIENQVSB3aGljaCBzdXBwb3J0IHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGluIGhhcmR3YXJlICovCitzdGF0aWMgVTMyIFhYSF9yZWFkMzIoY29uc3Qgdm9pZCogbWVtUHRyKSB7IHJldHVybiAqKGNvbnN0IFUzMiopIG1lbVB0cjsgfQorCisjZWxpZiAoZGVmaW5lZChYWEhfRk9SQ0VfTUVNT1JZX0FDQ0VTUykgJiYgKFhYSF9GT1JDRV9NRU1PUllfQUNDRVNTPT0xKSkKKworLyogX19wYWNrIGluc3RydWN0aW9ucyBhcmUgc2FmZXIsIGJ1dCBjb21waWxlciBzcGVjaWZpYywgaGVuY2UgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMgZm9yIHNvbWUgY29tcGlsZXJzICovCisvKiBjdXJyZW50bHkgb25seSBkZWZpbmVkIGZvciBnY2MgYW5kIGljYyAqLwordHlwZWRlZiB1bmlvbiB7IFUzMiB1MzI7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdW5hbGlnbjsKK3N0YXRpYyBVMzIgWFhIX3JlYWQzMihjb25zdCB2b2lkKiBwdHIpIHsgcmV0dXJuICgoY29uc3QgdW5hbGlnbiopcHRyKS0+dTMyOyB9CisKKyNlbHNlCisKKy8qIHBvcnRhYmxlIGFuZCBzYWZlIHNvbHV0aW9uLiBHZW5lcmFsbHkgZWZmaWNpZW50LgorICogc2VlIDogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzIwOTUxMDYvNjQ2OTQ3CisgKi8KK3N0YXRpYyBVMzIgWFhIX3JlYWQzMihjb25zdCB2b2lkKiBtZW1QdHIpCit7CisgICAgVTMyIHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgbWVtUHRyLCBzaXplb2YodmFsKSk7CisgICAgcmV0dXJuIHZhbDsKK30KKworI2VuZGlmICAgLyogWFhIX0ZPUkNFX0RJUkVDVF9NRU1PUllfQUNDRVNTICovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQ29tcGlsZXItc3BlY2lmaWMgRnVuY3Rpb25zIGFuZCBNYWNyb3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWFhIX0dDQ19WRVJTSU9OIChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKQorCisvKiBOb3RlIDogYWx0aG91Z2ggX3JvdGwgZXhpc3RzIGZvciBtaW5HVyAoR0NDIHVuZGVyIHdpbmRvd3MpLCBwZXJmb3JtYW5jZSBzZWVtcyBwb29yICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgIGRlZmluZSBYWEhfcm90bDMyKHgscikgX3JvdGwoeCxyKQorIyAgZGVmaW5lIFhYSF9yb3RsNjQoeCxyKSBfcm90bDY0KHgscikKKyNlbHNlCisjICBkZWZpbmUgWFhIX3JvdGwzMih4LHIpICgoeCA8PCByKSB8ICh4ID4+ICgzMiAtIHIpKSkKKyMgIGRlZmluZSBYWEhfcm90bDY0KHgscikgKCh4IDw8IHIpIHwgKHggPj4gKDY0IC0gcikpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAgICAgLyogVmlzdWFsIFN0dWRpbyAqLworIyAgZGVmaW5lIFhYSF9zd2FwMzIgX2J5dGVzd2FwX3Vsb25nCisjZWxpZiBYWEhfR0NDX1ZFUlNJT04gPj0gNDAzCisjICBkZWZpbmUgWFhIX3N3YXAzMiBfX2J1aWx0aW5fYnN3YXAzMgorI2Vsc2UKK3N0YXRpYyBVMzIgWFhIX3N3YXAzMiAoVTMyIHgpCit7CisgICAgcmV0dXJuICAoKHggPDwgMjQpICYgMHhmZjAwMDAwMCApIHwKKyAgICAgICAgICAgICgoeCA8PCAgOCkgJiAweDAwZmYwMDAwICkgfAorICAgICAgICAgICAgKCh4ID4+ICA4KSAmIDB4MDAwMGZmMDAgKSB8CisgICAgICAgICAgICAoKHggPj4gMjQpICYgMHgwMDAwMDBmZiApOworfQorI2VuZGlmCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQXJjaGl0ZWN0dXJlIE1hY3JvcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsgWFhIX2JpZ0VuZGlhbj0wLCBYWEhfbGl0dGxlRW5kaWFuPTEgfSBYWEhfZW5kaWFuZXNzOworCisvKiBYWEhfQ1BVX0xJVFRMRV9FTkRJQU4gY2FuIGJlIGRlZmluZWQgZXh0ZXJuYWxseSwgZm9yIGV4YW1wbGUgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmQgbGluZSAqLworI2lmbmRlZiBYWEhfQ1BVX0xJVFRMRV9FTkRJQU4KKyAgICBzdGF0aWMgY29uc3QgaW50IGdfb25lID0gMTsKKyMgICBkZWZpbmUgWFhIX0NQVV9MSVRUTEVfRU5ESUFOICAgKCooY29uc3QgY2hhciopKCZnX29uZSkpCisjZW5kaWYKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIE1lbW9yeSByZWFkcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geyBYWEhfYWxpZ25lZCwgWFhIX3VuYWxpZ25lZCB9IFhYSF9hbGlnbm1lbnQ7CisKK0ZPUkNFX0lOTElORSBVMzIgWFhIX3JlYWRMRTMyX2FsaWduKGNvbnN0IHZvaWQqIHB0ciwgWFhIX2VuZGlhbmVzcyBlbmRpYW4sIFhYSF9hbGlnbm1lbnQgYWxpZ24pCit7CisgICAgaWYgKGFsaWduPT1YWEhfdW5hbGlnbmVkKQorICAgICAgICByZXR1cm4gZW5kaWFuPT1YWEhfbGl0dGxlRW5kaWFuID8gWFhIX3JlYWQzMihwdHIpIDogWFhIX3N3YXAzMihYWEhfcmVhZDMyKHB0cikpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVuZGlhbj09WFhIX2xpdHRsZUVuZGlhbiA/ICooY29uc3QgVTMyKilwdHIgOiBYWEhfc3dhcDMyKCooY29uc3QgVTMyKilwdHIpOworfQorCitGT1JDRV9JTkxJTkUgVTMyIFhYSF9yZWFkTEUzMihjb25zdCB2b2lkKiBwdHIsIFhYSF9lbmRpYW5lc3MgZW5kaWFuKQoreworICAgIHJldHVybiBYWEhfcmVhZExFMzJfYWxpZ24ocHRyLCBlbmRpYW4sIFhYSF91bmFsaWduZWQpOworfQorCitzdGF0aWMgVTMyIFhYSF9yZWFkQkUzMihjb25zdCB2b2lkKiBwdHIpCit7CisgICAgcmV0dXJuIFhYSF9DUFVfTElUVExFX0VORElBTiA/IFhYSF9zd2FwMzIoWFhIX3JlYWQzMihwdHIpKSA6IFhYSF9yZWFkMzIocHRyKTsKK30KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBNYWNyb3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWFhIX1NUQVRJQ19BU1NFUlQoYykgICB7IGVudW0geyBYWEhfc3RhdGljX2Fzc2VydCA9IDEvKGludCkoISEoYykpIH07IH0gICAgLyogdXNlIG9ubHkgKmFmdGVyKiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgKi8KK1hYSF9QVUJMSUNfQVBJIHVuc2lnbmVkIFhYSF92ZXJzaW9uTnVtYmVyICh2b2lkKSB7IHJldHVybiBYWEhfVkVSU0lPTl9OVU1CRVI7IH0KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAzMi1iaXRzIGhhc2ggZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgVTMyIFBSSU1FMzJfMSA9IDI2NTQ0MzU3NjFVOworc3RhdGljIGNvbnN0IFUzMiBQUklNRTMyXzIgPSAyMjQ2ODIyNTE5VTsKK3N0YXRpYyBjb25zdCBVMzIgUFJJTUUzMl8zID0gMzI2NjQ4OTkxN1U7CitzdGF0aWMgY29uc3QgVTMyIFBSSU1FMzJfNCA9ICA2NjgyNjUyNjNVOworc3RhdGljIGNvbnN0IFUzMiBQUklNRTMyXzUgPSAgMzc0NzYxMzkzVTsKKworc3RhdGljIFUzMiBYWEgzMl9yb3VuZChVMzIgc2VlZCwgVTMyIGlucHV0KQoreworICAgIHNlZWQgKz0gaW5wdXQgKiBQUklNRTMyXzI7CisgICAgc2VlZCAgPSBYWEhfcm90bDMyKHNlZWQsIDEzKTsKKyAgICBzZWVkICo9IFBSSU1FMzJfMTsKKyAgICByZXR1cm4gc2VlZDsKK30KKworRk9SQ0VfSU5MSU5FIFUzMiBYWEgzMl9lbmRpYW5fYWxpZ24oY29uc3Qgdm9pZCogaW5wdXQsIHNpemVfdCBsZW4sIFUzMiBzZWVkLCBYWEhfZW5kaWFuZXNzIGVuZGlhbiwgWFhIX2FsaWdubWVudCBhbGlnbikKK3sKKyAgICBjb25zdCBCWVRFKiBwID0gKGNvbnN0IEJZVEUqKWlucHV0OworICAgIGNvbnN0IEJZVEUqIGJFbmQgPSBwICsgbGVuOworICAgIFUzMiBoMzI7CisjZGVmaW5lIFhYSF9nZXQzMmJpdHMocCkgWFhIX3JlYWRMRTMyX2FsaWduKHAsIGVuZGlhbiwgYWxpZ24pCisKKyNpZmRlZiBYWEhfQUNDRVBUX05VTExfSU5QVVRfUE9JTlRFUgorICAgIGlmIChwPT1OVUxMKSB7CisgICAgICAgIGxlbj0wOworICAgICAgICBiRW5kPXA9KGNvbnN0IEJZVEUqKShzaXplX3QpMTY7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobGVuPj0xNikgeworICAgICAgICBjb25zdCBCWVRFKiBjb25zdCBsaW1pdCA9IGJFbmQgLSAxNjsKKyAgICAgICAgVTMyIHYxID0gc2VlZCArIFBSSU1FMzJfMSArIFBSSU1FMzJfMjsKKyAgICAgICAgVTMyIHYyID0gc2VlZCArIFBSSU1FMzJfMjsKKyAgICAgICAgVTMyIHYzID0gc2VlZCArIDA7CisgICAgICAgIFUzMiB2NCA9IHNlZWQgLSBQUklNRTMyXzE7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgdjEgPSBYWEgzMl9yb3VuZCh2MSwgWFhIX2dldDMyYml0cyhwKSk7IHArPTQ7CisgICAgICAgICAgICB2MiA9IFhYSDMyX3JvdW5kKHYyLCBYWEhfZ2V0MzJiaXRzKHApKTsgcCs9NDsKKyAgICAgICAgICAgIHYzID0gWFhIMzJfcm91bmQodjMsIFhYSF9nZXQzMmJpdHMocCkpOyBwKz00OworICAgICAgICAgICAgdjQgPSBYWEgzMl9yb3VuZCh2NCwgWFhIX2dldDMyYml0cyhwKSk7IHArPTQ7CisgICAgICAgIH0gd2hpbGUgKHA8PWxpbWl0KTsKKworICAgICAgICBoMzIgPSBYWEhfcm90bDMyKHYxLCAxKSArIFhYSF9yb3RsMzIodjIsIDcpICsgWFhIX3JvdGwzMih2MywgMTIpICsgWFhIX3JvdGwzMih2NCwgMTgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGgzMiAgPSBzZWVkICsgUFJJTUUzMl81OworICAgIH0KKworICAgIGgzMiArPSAoVTMyKSBsZW47CisKKyAgICB3aGlsZSAocCs0PD1iRW5kKSB7CisgICAgICAgIGgzMiArPSBYWEhfZ2V0MzJiaXRzKHApICogUFJJTUUzMl8zOworICAgICAgICBoMzIgID0gWFhIX3JvdGwzMihoMzIsIDE3KSAqIFBSSU1FMzJfNCA7CisgICAgICAgIHArPTQ7CisgICAgfQorCisgICAgd2hpbGUgKHA8YkVuZCkgeworICAgICAgICBoMzIgKz0gKCpwKSAqIFBSSU1FMzJfNTsKKyAgICAgICAgaDMyID0gWFhIX3JvdGwzMihoMzIsIDExKSAqIFBSSU1FMzJfMSA7CisgICAgICAgIHArKzsKKyAgICB9CisKKyAgICBoMzIgXj0gaDMyID4+IDE1OworICAgIGgzMiAqPSBQUklNRTMyXzI7CisgICAgaDMyIF49IGgzMiA+PiAxMzsKKyAgICBoMzIgKj0gUFJJTUUzMl8zOworICAgIGgzMiBePSBoMzIgPj4gMTY7CisKKyAgICByZXR1cm4gaDMyOworfQorCisKK1hYSF9QVUJMSUNfQVBJIHVuc2lnbmVkIGludCBYWEgzMiAoY29uc3Qgdm9pZCogaW5wdXQsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBzZWVkKQoreworI2lmIDAKKyAgICAvKiBTaW1wbGUgdmVyc2lvbiwgZ29vZCBmb3IgY29kZSBtYWludGVuYW5jZSwgYnV0IHVuZm9ydHVuYXRlbHkgc2xvdyBmb3Igc21hbGwgaW5wdXRzICovCisgICAgWFhIMzJfc3RhdGVfdCBzdGF0ZTsKKyAgICBYWEgzMl9yZXNldCgmc3RhdGUsIHNlZWQpOworICAgIFhYSDMyX3VwZGF0ZSgmc3RhdGUsIGlucHV0LCBsZW4pOworICAgIHJldHVybiBYWEgzMl9kaWdlc3QoJnN0YXRlKTsKKyNlbHNlCisgICAgWFhIX2VuZGlhbmVzcyBlbmRpYW5fZGV0ZWN0ZWQgPSAoWFhIX2VuZGlhbmVzcylYWEhfQ1BVX0xJVFRMRV9FTkRJQU47CisKKyAgICBpZiAoWFhIX0ZPUkNFX0FMSUdOX0NIRUNLKSB7CisgICAgICAgIGlmICgoKChzaXplX3QpaW5wdXQpICYgMykgPT0gMCkgeyAgIC8qIElucHV0IGlzIDQtYnl0ZXMgYWxpZ25lZCwgbGV2ZXJhZ2UgdGhlIHNwZWVkIGJlbmVmaXQgKi8KKyAgICAgICAgICAgIGlmICgoZW5kaWFuX2RldGVjdGVkPT1YWEhfbGl0dGxlRW5kaWFuKSB8fCBYWEhfRk9SQ0VfTkFUSVZFX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gWFhIMzJfZW5kaWFuX2FsaWduKGlucHV0LCBsZW4sIHNlZWQsIFhYSF9saXR0bGVFbmRpYW4sIFhYSF9hbGlnbmVkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gWFhIMzJfZW5kaWFuX2FsaWduKGlucHV0LCBsZW4sIHNlZWQsIFhYSF9iaWdFbmRpYW4sIFhYSF9hbGlnbmVkKTsKKyAgICB9ICAgfQorCisgICAgaWYgKChlbmRpYW5fZGV0ZWN0ZWQ9PVhYSF9saXR0bGVFbmRpYW4pIHx8IFhYSF9GT1JDRV9OQVRJVkVfRk9STUFUKQorICAgICAgICByZXR1cm4gWFhIMzJfZW5kaWFuX2FsaWduKGlucHV0LCBsZW4sIHNlZWQsIFhYSF9saXR0bGVFbmRpYW4sIFhYSF91bmFsaWduZWQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFhYSDMyX2VuZGlhbl9hbGlnbihpbnB1dCwgbGVuLCBzZWVkLCBYWEhfYmlnRW5kaWFuLCBYWEhfdW5hbGlnbmVkKTsKKyNlbmRpZgorfQorCisKKworLyo9PT09PT0gICBIYXNoIHN0cmVhbWluZyAgID09PT09PSovCisKK1hYSF9QVUJMSUNfQVBJIFhYSDMyX3N0YXRlX3QqIFhYSDMyX2NyZWF0ZVN0YXRlKHZvaWQpCit7CisgICAgcmV0dXJuIChYWEgzMl9zdGF0ZV90KilYWEhfbWFsbG9jKHNpemVvZihYWEgzMl9zdGF0ZV90KSk7Cit9CitYWEhfUFVCTElDX0FQSSBYWEhfZXJyb3Jjb2RlIFhYSDMyX2ZyZWVTdGF0ZShYWEgzMl9zdGF0ZV90KiBzdGF0ZVB0cikKK3sKKyAgICBYWEhfZnJlZShzdGF0ZVB0cik7CisgICAgcmV0dXJuIFhYSF9PSzsKK30KKworWFhIX1BVQkxJQ19BUEkgdm9pZCBYWEgzMl9jb3B5U3RhdGUoWFhIMzJfc3RhdGVfdCogZHN0U3RhdGUsIGNvbnN0IFhYSDMyX3N0YXRlX3QqIHNyY1N0YXRlKQoreworICAgIG1lbWNweShkc3RTdGF0ZSwgc3JjU3RhdGUsIHNpemVvZigqZHN0U3RhdGUpKTsKK30KKworWFhIX1BVQkxJQ19BUEkgWFhIX2Vycm9yY29kZSBYWEgzMl9yZXNldChYWEgzMl9zdGF0ZV90KiBzdGF0ZVB0ciwgdW5zaWduZWQgaW50IHNlZWQpCit7CisgICAgWFhIMzJfc3RhdGVfdCBzdGF0ZTsgICAvKiB1c2luZyBhIGxvY2FsIHN0YXRlIHRvIG1lbWNweSgpIGluIG9yZGVyIHRvIGF2b2lkIHN0cmljdC1hbGlhc2luZyB3YXJuaW5ncyAqLworICAgIG1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihzdGF0ZSktNCk7ICAgLyogZG8gbm90IHdyaXRlIGludG8gcmVzZXJ2ZWQsIGZvciBmdXR1cmUgcmVtb3ZhbCAqLworICAgIHN0YXRlLnYxID0gc2VlZCArIFBSSU1FMzJfMSArIFBSSU1FMzJfMjsKKyAgICBzdGF0ZS52MiA9IHNlZWQgKyBQUklNRTMyXzI7CisgICAgc3RhdGUudjMgPSBzZWVkICsgMDsKKyAgICBzdGF0ZS52NCA9IHNlZWQgLSBQUklNRTMyXzE7CisgICAgbWVtY3B5KHN0YXRlUHRyLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOworICAgIHJldHVybiBYWEhfT0s7Cit9CisKKworRk9SQ0VfSU5MSU5FIFhYSF9lcnJvcmNvZGUgWFhIMzJfdXBkYXRlX2VuZGlhbiAoWFhIMzJfc3RhdGVfdCogc3RhdGUsIGNvbnN0IHZvaWQqIGlucHV0LCBzaXplX3QgbGVuLCBYWEhfZW5kaWFuZXNzIGVuZGlhbikKK3sKKyAgICBjb25zdCBCWVRFKiBwID0gKGNvbnN0IEJZVEUqKWlucHV0OworICAgIGNvbnN0IEJZVEUqIGNvbnN0IGJFbmQgPSBwICsgbGVuOworCisjaWZkZWYgWFhIX0FDQ0VQVF9OVUxMX0lOUFVUX1BPSU5URVIKKyAgICBpZiAoaW5wdXQ9PU5VTEwpIHJldHVybiBYWEhfRVJST1I7CisjZW5kaWYKKworICAgIHN0YXRlLT50b3RhbF9sZW5fMzIgKz0gKHVuc2lnbmVkKWxlbjsKKyAgICBzdGF0ZS0+bGFyZ2VfbGVuIHw9IChsZW4+PTE2KSB8IChzdGF0ZS0+dG90YWxfbGVuXzMyPj0xNik7CisKKyAgICBpZiAoc3RhdGUtPm1lbXNpemUgKyBsZW4gPCAxNikgIHsgICAvKiBmaWxsIGluIHRtcCBidWZmZXIgKi8KKyAgICAgICAgWFhIX21lbWNweSgoQllURSopKHN0YXRlLT5tZW0zMikgKyBzdGF0ZS0+bWVtc2l6ZSwgaW5wdXQsIGxlbik7CisgICAgICAgIHN0YXRlLT5tZW1zaXplICs9ICh1bnNpZ25lZClsZW47CisgICAgICAgIHJldHVybiBYWEhfT0s7CisgICAgfQorCisgICAgaWYgKHN0YXRlLT5tZW1zaXplKSB7ICAgLyogc29tZSBkYXRhIGxlZnQgZnJvbSBwcmV2aW91cyB1cGRhdGUgKi8KKyAgICAgICAgWFhIX21lbWNweSgoQllURSopKHN0YXRlLT5tZW0zMikgKyBzdGF0ZS0+bWVtc2l6ZSwgaW5wdXQsIDE2LXN0YXRlLT5tZW1zaXplKTsKKyAgICAgICAgeyAgIGNvbnN0IFUzMiogcDMyID0gc3RhdGUtPm1lbTMyOworICAgICAgICAgICAgc3RhdGUtPnYxID0gWFhIMzJfcm91bmQoc3RhdGUtPnYxLCBYWEhfcmVhZExFMzIocDMyLCBlbmRpYW4pKTsgcDMyKys7CisgICAgICAgICAgICBzdGF0ZS0+djIgPSBYWEgzMl9yb3VuZChzdGF0ZS0+djIsIFhYSF9yZWFkTEUzMihwMzIsIGVuZGlhbikpOyBwMzIrKzsKKyAgICAgICAgICAgIHN0YXRlLT52MyA9IFhYSDMyX3JvdW5kKHN0YXRlLT52MywgWFhIX3JlYWRMRTMyKHAzMiwgZW5kaWFuKSk7IHAzMisrOworICAgICAgICAgICAgc3RhdGUtPnY0ID0gWFhIMzJfcm91bmQoc3RhdGUtPnY0LCBYWEhfcmVhZExFMzIocDMyLCBlbmRpYW4pKTsKKyAgICAgICAgfQorICAgICAgICBwICs9IDE2LXN0YXRlLT5tZW1zaXplOworICAgICAgICBzdGF0ZS0+bWVtc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKHAgPD0gYkVuZC0xNikgeworICAgICAgICBjb25zdCBCWVRFKiBjb25zdCBsaW1pdCA9IGJFbmQgLSAxNjsKKyAgICAgICAgVTMyIHYxID0gc3RhdGUtPnYxOworICAgICAgICBVMzIgdjIgPSBzdGF0ZS0+djI7CisgICAgICAgIFUzMiB2MyA9IHN0YXRlLT52MzsKKyAgICAgICAgVTMyIHY0ID0gc3RhdGUtPnY0OworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHYxID0gWFhIMzJfcm91bmQodjEsIFhYSF9yZWFkTEUzMihwLCBlbmRpYW4pKTsgcCs9NDsKKyAgICAgICAgICAgIHYyID0gWFhIMzJfcm91bmQodjIsIFhYSF9yZWFkTEUzMihwLCBlbmRpYW4pKTsgcCs9NDsKKyAgICAgICAgICAgIHYzID0gWFhIMzJfcm91bmQodjMsIFhYSF9yZWFkTEUzMihwLCBlbmRpYW4pKTsgcCs9NDsKKyAgICAgICAgICAgIHY0ID0gWFhIMzJfcm91bmQodjQsIFhYSF9yZWFkTEUzMihwLCBlbmRpYW4pKTsgcCs9NDsKKyAgICAgICAgfSB3aGlsZSAocDw9bGltaXQpOworCisgICAgICAgIHN0YXRlLT52MSA9IHYxOworICAgICAgICBzdGF0ZS0+djIgPSB2MjsKKyAgICAgICAgc3RhdGUtPnYzID0gdjM7CisgICAgICAgIHN0YXRlLT52NCA9IHY0OworICAgIH0KKworICAgIGlmIChwIDwgYkVuZCkgeworICAgICAgICBYWEhfbWVtY3B5KHN0YXRlLT5tZW0zMiwgcCwgKHNpemVfdCkoYkVuZC1wKSk7CisgICAgICAgIHN0YXRlLT5tZW1zaXplID0gKHVuc2lnbmVkKShiRW5kLXApOworICAgIH0KKworICAgIHJldHVybiBYWEhfT0s7Cit9CisKK1hYSF9QVUJMSUNfQVBJIFhYSF9lcnJvcmNvZGUgWFhIMzJfdXBkYXRlIChYWEgzMl9zdGF0ZV90KiBzdGF0ZV9pbiwgY29uc3Qgdm9pZCogaW5wdXQsIHNpemVfdCBsZW4pCit7CisgICAgWFhIX2VuZGlhbmVzcyBlbmRpYW5fZGV0ZWN0ZWQgPSAoWFhIX2VuZGlhbmVzcylYWEhfQ1BVX0xJVFRMRV9FTkRJQU47CisKKyAgICBpZiAoKGVuZGlhbl9kZXRlY3RlZD09WFhIX2xpdHRsZUVuZGlhbikgfHwgWFhIX0ZPUkNFX05BVElWRV9GT1JNQVQpCisgICAgICAgIHJldHVybiBYWEgzMl91cGRhdGVfZW5kaWFuKHN0YXRlX2luLCBpbnB1dCwgbGVuLCBYWEhfbGl0dGxlRW5kaWFuKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBYWEgzMl91cGRhdGVfZW5kaWFuKHN0YXRlX2luLCBpbnB1dCwgbGVuLCBYWEhfYmlnRW5kaWFuKTsKK30KKworCisKK0ZPUkNFX0lOTElORSBVMzIgWFhIMzJfZGlnZXN0X2VuZGlhbiAoY29uc3QgWFhIMzJfc3RhdGVfdCogc3RhdGUsIFhYSF9lbmRpYW5lc3MgZW5kaWFuKQoreworICAgIGNvbnN0IEJZVEUgKiBwID0gKGNvbnN0IEJZVEUqKXN0YXRlLT5tZW0zMjsKKyAgICBjb25zdCBCWVRFKiBjb25zdCBiRW5kID0gKGNvbnN0IEJZVEUqKShzdGF0ZS0+bWVtMzIpICsgc3RhdGUtPm1lbXNpemU7CisgICAgVTMyIGgzMjsKKworICAgIGlmIChzdGF0ZS0+bGFyZ2VfbGVuKSB7CisgICAgICAgIGgzMiA9IFhYSF9yb3RsMzIoc3RhdGUtPnYxLCAxKSArIFhYSF9yb3RsMzIoc3RhdGUtPnYyLCA3KSArIFhYSF9yb3RsMzIoc3RhdGUtPnYzLCAxMikgKyBYWEhfcm90bDMyKHN0YXRlLT52NCwgMTgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGgzMiA9IHN0YXRlLT52MyAvKiA9PSBzZWVkICovICsgUFJJTUUzMl81OworICAgIH0KKworICAgIGgzMiArPSBzdGF0ZS0+dG90YWxfbGVuXzMyOworCisgICAgd2hpbGUgKHArNDw9YkVuZCkgeworICAgICAgICBoMzIgKz0gWFhIX3JlYWRMRTMyKHAsIGVuZGlhbikgKiBQUklNRTMyXzM7CisgICAgICAgIGgzMiAgPSBYWEhfcm90bDMyKGgzMiwgMTcpICogUFJJTUUzMl80OworICAgICAgICBwKz00OworICAgIH0KKworICAgIHdoaWxlIChwPGJFbmQpIHsKKyAgICAgICAgaDMyICs9ICgqcCkgKiBQUklNRTMyXzU7CisgICAgICAgIGgzMiAgPSBYWEhfcm90bDMyKGgzMiwgMTEpICogUFJJTUUzMl8xOworICAgICAgICBwKys7CisgICAgfQorCisgICAgaDMyIF49IGgzMiA+PiAxNTsKKyAgICBoMzIgKj0gUFJJTUUzMl8yOworICAgIGgzMiBePSBoMzIgPj4gMTM7CisgICAgaDMyICo9IFBSSU1FMzJfMzsKKyAgICBoMzIgXj0gaDMyID4+IDE2OworCisgICAgcmV0dXJuIGgzMjsKK30KKworCitYWEhfUFVCTElDX0FQSSB1bnNpZ25lZCBpbnQgWFhIMzJfZGlnZXN0IChjb25zdCBYWEgzMl9zdGF0ZV90KiBzdGF0ZV9pbikKK3sKKyAgICBYWEhfZW5kaWFuZXNzIGVuZGlhbl9kZXRlY3RlZCA9IChYWEhfZW5kaWFuZXNzKVhYSF9DUFVfTElUVExFX0VORElBTjsKKworICAgIGlmICgoZW5kaWFuX2RldGVjdGVkPT1YWEhfbGl0dGxlRW5kaWFuKSB8fCBYWEhfRk9SQ0VfTkFUSVZFX0ZPUk1BVCkKKyAgICAgICAgcmV0dXJuIFhYSDMyX2RpZ2VzdF9lbmRpYW4oc3RhdGVfaW4sIFhYSF9saXR0bGVFbmRpYW4pOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFhYSDMyX2RpZ2VzdF9lbmRpYW4oc3RhdGVfaW4sIFhYSF9iaWdFbmRpYW4pOworfQorCisKKy8qPT09PT09ICAgQ2Fub25pY2FsIHJlcHJlc2VudGF0aW9uICAgPT09PT09Ki8KKworLyohIERlZmF1bHQgWFhIIHJlc3VsdCB0eXBlcyBhcmUgYmFzaWMgdW5zaWduZWQgMzIgYW5kIDY0IGJpdHMuCisqICAgVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBmb2xsb3dzIGh1bWFuLXJlYWRhYmxlIHdyaXRlIGNvbnZlbnRpb24sIGFrYSBiaWctZW5kaWFuIChsYXJnZSBkaWdpdHMgZmlyc3QpLgorKiAgIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyB0cmFuc2Zvcm1hdGlvbiBvZiBoYXNoIHJlc3VsdCBpbnRvIGFuZCBmcm9tIGl0cyBjYW5vbmljYWwgZm9ybWF0LgorKiAgIFRoaXMgd2F5LCBoYXNoIHZhbHVlcyBjYW4gYmUgd3JpdHRlbiBpbnRvIGEgZmlsZSBvciBidWZmZXIsIGFuZCByZW1haW4gY29tcGFyYWJsZSBhY3Jvc3MgZGlmZmVyZW50IHN5c3RlbXMgYW5kIHByb2dyYW1zLgorKi8KKworWFhIX1BVQkxJQ19BUEkgdm9pZCBYWEgzMl9jYW5vbmljYWxGcm9tSGFzaChYWEgzMl9jYW5vbmljYWxfdCogZHN0LCBYWEgzMl9oYXNoX3QgaGFzaCkKK3sKKyAgICBYWEhfU1RBVElDX0FTU0VSVChzaXplb2YoWFhIMzJfY2Fub25pY2FsX3QpID09IHNpemVvZihYWEgzMl9oYXNoX3QpKTsKKyAgICBpZiAoWFhIX0NQVV9MSVRUTEVfRU5ESUFOKSBoYXNoID0gWFhIX3N3YXAzMihoYXNoKTsKKyAgICBtZW1jcHkoZHN0LCAmaGFzaCwgc2l6ZW9mKCpkc3QpKTsKK30KKworWFhIX1BVQkxJQ19BUEkgWFhIMzJfaGFzaF90IFhYSDMyX2hhc2hGcm9tQ2Fub25pY2FsKGNvbnN0IFhYSDMyX2Nhbm9uaWNhbF90KiBzcmMpCit7CisgICAgcmV0dXJuIFhYSF9yZWFkQkUzMihzcmMpOworfQorCisKKyNpZm5kZWYgWFhIX05PX0xPTkdfTE9ORworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICA2NC1iaXRzIGhhc2ggZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09ICAgTWVtb3J5IGFjY2VzcyAgID09PT09PSovCisKKyNpZm5kZWYgTUVNX01PRFVMRQorIyBkZWZpbmUgTUVNX01PRFVMRQorIyBpZiAhZGVmaW5lZCAoX19WTVMpICYmIChkZWZpbmVkIChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIC8qIEM5OSAqLykgKQorIyAgIGluY2x1ZGUgPHN0ZGludC5oPgorICAgIHR5cGVkZWYgdWludDY0X3QgVTY0OworIyBlbHNlCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVTY0OyAgIC8qIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IHVuc2lnbmVkIGxvbmcgbG9uZywgcmVwbGFjZSBieSBhbm90aGVyIDY0LWJpdCB0eXBlIGhlcmUuIE5vdGUgdGhhdCB4eGhhc2guaCB3aWxsIGFsc28gbmVlZCB0byBiZSB1cGRhdGVkLiAqLworIyBlbmRpZgorI2VuZGlmCisKKworI2lmIChkZWZpbmVkKFhYSF9GT1JDRV9NRU1PUllfQUNDRVNTKSAmJiAoWFhIX0ZPUkNFX01FTU9SWV9BQ0NFU1M9PTIpKQorCisvKiBGb3JjZSBkaXJlY3QgbWVtb3J5IGFjY2Vzcy4gT25seSB3b3JrcyBvbiBDUFUgd2hpY2ggc3VwcG9ydCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBpbiBoYXJkd2FyZSAqLworc3RhdGljIFU2NCBYWEhfcmVhZDY0KGNvbnN0IHZvaWQqIG1lbVB0cikgeyByZXR1cm4gKihjb25zdCBVNjQqKSBtZW1QdHI7IH0KKworI2VsaWYgKGRlZmluZWQoWFhIX0ZPUkNFX01FTU9SWV9BQ0NFU1MpICYmIChYWEhfRk9SQ0VfTUVNT1JZX0FDQ0VTUz09MSkpCisKKy8qIF9fcGFjayBpbnN0cnVjdGlvbnMgYXJlIHNhZmVyLCBidXQgY29tcGlsZXIgc3BlY2lmaWMsIGhlbmNlIHBvdGVudGlhbGx5IHByb2JsZW1hdGljIGZvciBzb21lIGNvbXBpbGVycyAqLworLyogY3VycmVudGx5IG9ubHkgZGVmaW5lZCBmb3IgZ2NjIGFuZCBpY2MgKi8KK3R5cGVkZWYgdW5pb24geyBVMzIgdTMyOyBVNjQgdTY0OyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHVuYWxpZ242NDsKK3N0YXRpYyBVNjQgWFhIX3JlYWQ2NChjb25zdCB2b2lkKiBwdHIpIHsgcmV0dXJuICgoY29uc3QgdW5hbGlnbjY0KilwdHIpLT51NjQ7IH0KKworI2Vsc2UKKworLyogcG9ydGFibGUgYW5kIHNhZmUgc29sdXRpb24uIEdlbmVyYWxseSBlZmZpY2llbnQuCisgKiBzZWUgOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMjA5NTEwNi82NDY5NDcKKyAqLworCitzdGF0aWMgVTY0IFhYSF9yZWFkNjQoY29uc3Qgdm9pZCogbWVtUHRyKQoreworICAgIFU2NCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIG1lbVB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHJldHVybiB2YWw7Cit9CisKKyNlbmRpZiAgIC8qIFhYSF9GT1JDRV9ESVJFQ1RfTUVNT1JZX0FDQ0VTUyAqLworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgICAgIC8qIFZpc3VhbCBTdHVkaW8gKi8KKyMgIGRlZmluZSBYWEhfc3dhcDY0IF9ieXRlc3dhcF91aW50NjQKKyNlbGlmIFhYSF9HQ0NfVkVSU0lPTiA+PSA0MDMKKyMgIGRlZmluZSBYWEhfc3dhcDY0IF9fYnVpbHRpbl9ic3dhcDY0CisjZWxzZQorc3RhdGljIFU2NCBYWEhfc3dhcDY0IChVNjQgeCkKK3sKKyAgICByZXR1cm4gICgoeCA8PCA1NikgJiAweGZmMDAwMDAwMDAwMDAwMDBVTEwpIHwKKyAgICAgICAgICAgICgoeCA8PCA0MCkgJiAweDAwZmYwMDAwMDAwMDAwMDBVTEwpIHwKKyAgICAgICAgICAgICgoeCA8PCAyNCkgJiAweDAwMDBmZjAwMDAwMDAwMDBVTEwpIHwKKyAgICAgICAgICAgICgoeCA8PCA4KSAgJiAweDAwMDAwMGZmMDAwMDAwMDBVTEwpIHwKKyAgICAgICAgICAgICgoeCA+PiA4KSAgJiAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIHwKKyAgICAgICAgICAgICgoeCA+PiAyNCkgJiAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIHwKKyAgICAgICAgICAgICgoeCA+PiA0MCkgJiAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIHwKKyAgICAgICAgICAgICgoeCA+PiA1NikgJiAweDAwMDAwMDAwMDAwMDAwZmZVTEwpOworfQorI2VuZGlmCisKK0ZPUkNFX0lOTElORSBVNjQgWFhIX3JlYWRMRTY0X2FsaWduKGNvbnN0IHZvaWQqIHB0ciwgWFhIX2VuZGlhbmVzcyBlbmRpYW4sIFhYSF9hbGlnbm1lbnQgYWxpZ24pCit7CisgICAgaWYgKGFsaWduPT1YWEhfdW5hbGlnbmVkKQorICAgICAgICByZXR1cm4gZW5kaWFuPT1YWEhfbGl0dGxlRW5kaWFuID8gWFhIX3JlYWQ2NChwdHIpIDogWFhIX3N3YXA2NChYWEhfcmVhZDY0KHB0cikpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVuZGlhbj09WFhIX2xpdHRsZUVuZGlhbiA/ICooY29uc3QgVTY0KilwdHIgOiBYWEhfc3dhcDY0KCooY29uc3QgVTY0KilwdHIpOworfQorCitGT1JDRV9JTkxJTkUgVTY0IFhYSF9yZWFkTEU2NChjb25zdCB2b2lkKiBwdHIsIFhYSF9lbmRpYW5lc3MgZW5kaWFuKQoreworICAgIHJldHVybiBYWEhfcmVhZExFNjRfYWxpZ24ocHRyLCBlbmRpYW4sIFhYSF91bmFsaWduZWQpOworfQorCitzdGF0aWMgVTY0IFhYSF9yZWFkQkU2NChjb25zdCB2b2lkKiBwdHIpCit7CisgICAgcmV0dXJuIFhYSF9DUFVfTElUVExFX0VORElBTiA/IFhYSF9zd2FwNjQoWFhIX3JlYWQ2NChwdHIpKSA6IFhYSF9yZWFkNjQocHRyKTsKK30KKworCisvKj09PT09PSAgIHh4aDY0ICAgPT09PT09Ki8KKworc3RhdGljIGNvbnN0IFU2NCBQUklNRTY0XzEgPSAxMTQwMDcxNDc4NTA3NDY5NDc5MVVMTDsKK3N0YXRpYyBjb25zdCBVNjQgUFJJTUU2NF8yID0gMTQwMjk0NjczNjY4OTcwMTk3MjdVTEw7CitzdGF0aWMgY29uc3QgVTY0IFBSSU1FNjRfMyA9ICAxNjA5NTg3OTI5MzkyODM5MTYxVUxMOworc3RhdGljIGNvbnN0IFU2NCBQUklNRTY0XzQgPSAgOTY1MDAyOTI0MjI4NzgyODU3OVVMTDsKK3N0YXRpYyBjb25zdCBVNjQgUFJJTUU2NF81ID0gIDI4NzAxNzc0NTAwMTI2MDAyNjFVTEw7CisKK3N0YXRpYyBVNjQgWFhINjRfcm91bmQoVTY0IGFjYywgVTY0IGlucHV0KQoreworICAgIGFjYyArPSBpbnB1dCAqIFBSSU1FNjRfMjsKKyAgICBhY2MgID0gWFhIX3JvdGw2NChhY2MsIDMxKTsKKyAgICBhY2MgKj0gUFJJTUU2NF8xOworICAgIHJldHVybiBhY2M7Cit9CisKK3N0YXRpYyBVNjQgWFhINjRfbWVyZ2VSb3VuZChVNjQgYWNjLCBVNjQgdmFsKQoreworICAgIHZhbCAgPSBYWEg2NF9yb3VuZCgwLCB2YWwpOworICAgIGFjYyBePSB2YWw7CisgICAgYWNjICA9IGFjYyAqIFBSSU1FNjRfMSArIFBSSU1FNjRfNDsKKyAgICByZXR1cm4gYWNjOworfQorCitGT1JDRV9JTkxJTkUgVTY0IFhYSDY0X2VuZGlhbl9hbGlnbihjb25zdCB2b2lkKiBpbnB1dCwgc2l6ZV90IGxlbiwgVTY0IHNlZWQsIFhYSF9lbmRpYW5lc3MgZW5kaWFuLCBYWEhfYWxpZ25tZW50IGFsaWduKQoreworICAgIGNvbnN0IEJZVEUqIHAgPSAoY29uc3QgQllURSopaW5wdXQ7CisgICAgY29uc3QgQllURSogYkVuZCA9IHAgKyBsZW47CisgICAgVTY0IGg2NDsKKyNkZWZpbmUgWFhIX2dldDY0Yml0cyhwKSBYWEhfcmVhZExFNjRfYWxpZ24ocCwgZW5kaWFuLCBhbGlnbikKKworI2lmZGVmIFhYSF9BQ0NFUFRfTlVMTF9JTlBVVF9QT0lOVEVSCisgICAgaWYgKHA9PU5VTEwpIHsKKyAgICAgICAgbGVuPTA7CisgICAgICAgIGJFbmQ9cD0oY29uc3QgQllURSopKHNpemVfdCkzMjsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChsZW4+PTMyKSB7CisgICAgICAgIGNvbnN0IEJZVEUqIGNvbnN0IGxpbWl0ID0gYkVuZCAtIDMyOworICAgICAgICBVNjQgdjEgPSBzZWVkICsgUFJJTUU2NF8xICsgUFJJTUU2NF8yOworICAgICAgICBVNjQgdjIgPSBzZWVkICsgUFJJTUU2NF8yOworICAgICAgICBVNjQgdjMgPSBzZWVkICsgMDsKKyAgICAgICAgVTY0IHY0ID0gc2VlZCAtIFBSSU1FNjRfMTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICB2MSA9IFhYSDY0X3JvdW5kKHYxLCBYWEhfZ2V0NjRiaXRzKHApKTsgcCs9ODsKKyAgICAgICAgICAgIHYyID0gWFhINjRfcm91bmQodjIsIFhYSF9nZXQ2NGJpdHMocCkpOyBwKz04OworICAgICAgICAgICAgdjMgPSBYWEg2NF9yb3VuZCh2MywgWFhIX2dldDY0Yml0cyhwKSk7IHArPTg7CisgICAgICAgICAgICB2NCA9IFhYSDY0X3JvdW5kKHY0LCBYWEhfZ2V0NjRiaXRzKHApKTsgcCs9ODsKKyAgICAgICAgfSB3aGlsZSAocDw9bGltaXQpOworCisgICAgICAgIGg2NCA9IFhYSF9yb3RsNjQodjEsIDEpICsgWFhIX3JvdGw2NCh2MiwgNykgKyBYWEhfcm90bDY0KHYzLCAxMikgKyBYWEhfcm90bDY0KHY0LCAxOCk7CisgICAgICAgIGg2NCA9IFhYSDY0X21lcmdlUm91bmQoaDY0LCB2MSk7CisgICAgICAgIGg2NCA9IFhYSDY0X21lcmdlUm91bmQoaDY0LCB2Mik7CisgICAgICAgIGg2NCA9IFhYSDY0X21lcmdlUm91bmQoaDY0LCB2Myk7CisgICAgICAgIGg2NCA9IFhYSDY0X21lcmdlUm91bmQoaDY0LCB2NCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBoNjQgID0gc2VlZCArIFBSSU1FNjRfNTsKKyAgICB9CisKKyAgICBoNjQgKz0gKFU2NCkgbGVuOworCisgICAgd2hpbGUgKHArODw9YkVuZCkgeworICAgICAgICBVNjQgY29uc3QgazEgPSBYWEg2NF9yb3VuZCgwLCBYWEhfZ2V0NjRiaXRzKHApKTsKKyAgICAgICAgaDY0IF49IGsxOworICAgICAgICBoNjQgID0gWFhIX3JvdGw2NChoNjQsMjcpICogUFJJTUU2NF8xICsgUFJJTUU2NF80OworICAgICAgICBwKz04OworICAgIH0KKworICAgIGlmIChwKzQ8PWJFbmQpIHsKKyAgICAgICAgaDY0IF49IChVNjQpKFhYSF9nZXQzMmJpdHMocCkpICogUFJJTUU2NF8xOworICAgICAgICBoNjQgPSBYWEhfcm90bDY0KGg2NCwgMjMpICogUFJJTUU2NF8yICsgUFJJTUU2NF8zOworICAgICAgICBwKz00OworICAgIH0KKworICAgIHdoaWxlIChwPGJFbmQpIHsKKyAgICAgICAgaDY0IF49ICgqcCkgKiBQUklNRTY0XzU7CisgICAgICAgIGg2NCA9IFhYSF9yb3RsNjQoaDY0LCAxMSkgKiBQUklNRTY0XzE7CisgICAgICAgIHArKzsKKyAgICB9CisKKyAgICBoNjQgXj0gaDY0ID4+IDMzOworICAgIGg2NCAqPSBQUklNRTY0XzI7CisgICAgaDY0IF49IGg2NCA+PiAyOTsKKyAgICBoNjQgKj0gUFJJTUU2NF8zOworICAgIGg2NCBePSBoNjQgPj4gMzI7CisKKyAgICByZXR1cm4gaDY0OworfQorCisKK1hYSF9QVUJMSUNfQVBJIHVuc2lnbmVkIGxvbmcgbG9uZyBYWEg2NCAoY29uc3Qgdm9pZCogaW5wdXQsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgbG9uZyBzZWVkKQoreworI2lmIDAKKyAgICAvKiBTaW1wbGUgdmVyc2lvbiwgZ29vZCBmb3IgY29kZSBtYWludGVuYW5jZSwgYnV0IHVuZm9ydHVuYXRlbHkgc2xvdyBmb3Igc21hbGwgaW5wdXRzICovCisgICAgWFhINjRfc3RhdGVfdCBzdGF0ZTsKKyAgICBYWEg2NF9yZXNldCgmc3RhdGUsIHNlZWQpOworICAgIFhYSDY0X3VwZGF0ZSgmc3RhdGUsIGlucHV0LCBsZW4pOworICAgIHJldHVybiBYWEg2NF9kaWdlc3QoJnN0YXRlKTsKKyNlbHNlCisgICAgWFhIX2VuZGlhbmVzcyBlbmRpYW5fZGV0ZWN0ZWQgPSAoWFhIX2VuZGlhbmVzcylYWEhfQ1BVX0xJVFRMRV9FTkRJQU47CisKKyAgICBpZiAoWFhIX0ZPUkNFX0FMSUdOX0NIRUNLKSB7CisgICAgICAgIGlmICgoKChzaXplX3QpaW5wdXQpICYgNyk9PTApIHsgIC8qIElucHV0IGlzIGFsaWduZWQsIGxldCdzIGxldmVyYWdlIHRoZSBzcGVlZCBhZHZhbnRhZ2UgKi8KKyAgICAgICAgICAgIGlmICgoZW5kaWFuX2RldGVjdGVkPT1YWEhfbGl0dGxlRW5kaWFuKSB8fCBYWEhfRk9SQ0VfTkFUSVZFX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gWFhINjRfZW5kaWFuX2FsaWduKGlucHV0LCBsZW4sIHNlZWQsIFhYSF9saXR0bGVFbmRpYW4sIFhYSF9hbGlnbmVkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gWFhINjRfZW5kaWFuX2FsaWduKGlucHV0LCBsZW4sIHNlZWQsIFhYSF9iaWdFbmRpYW4sIFhYSF9hbGlnbmVkKTsKKyAgICB9ICAgfQorCisgICAgaWYgKChlbmRpYW5fZGV0ZWN0ZWQ9PVhYSF9saXR0bGVFbmRpYW4pIHx8IFhYSF9GT1JDRV9OQVRJVkVfRk9STUFUKQorICAgICAgICByZXR1cm4gWFhINjRfZW5kaWFuX2FsaWduKGlucHV0LCBsZW4sIHNlZWQsIFhYSF9saXR0bGVFbmRpYW4sIFhYSF91bmFsaWduZWQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFhYSDY0X2VuZGlhbl9hbGlnbihpbnB1dCwgbGVuLCBzZWVkLCBYWEhfYmlnRW5kaWFuLCBYWEhfdW5hbGlnbmVkKTsKKyNlbmRpZgorfQorCisvKj09PT09PSAgIEhhc2ggU3RyZWFtaW5nICAgPT09PT09Ki8KKworWFhIX1BVQkxJQ19BUEkgWFhINjRfc3RhdGVfdCogWFhINjRfY3JlYXRlU3RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gKFhYSDY0X3N0YXRlX3QqKVhYSF9tYWxsb2Moc2l6ZW9mKFhYSDY0X3N0YXRlX3QpKTsKK30KK1hYSF9QVUJMSUNfQVBJIFhYSF9lcnJvcmNvZGUgWFhINjRfZnJlZVN0YXRlKFhYSDY0X3N0YXRlX3QqIHN0YXRlUHRyKQoreworICAgIFhYSF9mcmVlKHN0YXRlUHRyKTsKKyAgICByZXR1cm4gWFhIX09LOworfQorCitYWEhfUFVCTElDX0FQSSB2b2lkIFhYSDY0X2NvcHlTdGF0ZShYWEg2NF9zdGF0ZV90KiBkc3RTdGF0ZSwgY29uc3QgWFhINjRfc3RhdGVfdCogc3JjU3RhdGUpCit7CisgICAgbWVtY3B5KGRzdFN0YXRlLCBzcmNTdGF0ZSwgc2l6ZW9mKCpkc3RTdGF0ZSkpOworfQorCitYWEhfUFVCTElDX0FQSSBYWEhfZXJyb3Jjb2RlIFhYSDY0X3Jlc2V0KFhYSDY0X3N0YXRlX3QqIHN0YXRlUHRyLCB1bnNpZ25lZCBsb25nIGxvbmcgc2VlZCkKK3sKKyAgICBYWEg2NF9zdGF0ZV90IHN0YXRlOyAgIC8qIHVzaW5nIGEgbG9jYWwgc3RhdGUgdG8gbWVtY3B5KCkgaW4gb3JkZXIgdG8gYXZvaWQgc3RyaWN0LWFsaWFzaW5nIHdhcm5pbmdzICovCisgICAgbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKS04KTsgICAvKiBkbyBub3Qgd3JpdGUgaW50byByZXNlcnZlZCwgZm9yIGZ1dHVyZSByZW1vdmFsICovCisgICAgc3RhdGUudjEgPSBzZWVkICsgUFJJTUU2NF8xICsgUFJJTUU2NF8yOworICAgIHN0YXRlLnYyID0gc2VlZCArIFBSSU1FNjRfMjsKKyAgICBzdGF0ZS52MyA9IHNlZWQgKyAwOworICAgIHN0YXRlLnY0ID0gc2VlZCAtIFBSSU1FNjRfMTsKKyAgICBtZW1jcHkoc3RhdGVQdHIsICZzdGF0ZSwgc2l6ZW9mKHN0YXRlKSk7CisgICAgcmV0dXJuIFhYSF9PSzsKK30KKworRk9SQ0VfSU5MSU5FIFhYSF9lcnJvcmNvZGUgWFhINjRfdXBkYXRlX2VuZGlhbiAoWFhINjRfc3RhdGVfdCogc3RhdGUsIGNvbnN0IHZvaWQqIGlucHV0LCBzaXplX3QgbGVuLCBYWEhfZW5kaWFuZXNzIGVuZGlhbikKK3sKKyAgICBjb25zdCBCWVRFKiBwID0gKGNvbnN0IEJZVEUqKWlucHV0OworICAgIGNvbnN0IEJZVEUqIGNvbnN0IGJFbmQgPSBwICsgbGVuOworCisjaWZkZWYgWFhIX0FDQ0VQVF9OVUxMX0lOUFVUX1BPSU5URVIKKyAgICBpZiAoaW5wdXQ9PU5VTEwpIHJldHVybiBYWEhfRVJST1I7CisjZW5kaWYKKworICAgIHN0YXRlLT50b3RhbF9sZW4gKz0gbGVuOworCisgICAgaWYgKHN0YXRlLT5tZW1zaXplICsgbGVuIDwgMzIpIHsgIC8qIGZpbGwgaW4gdG1wIGJ1ZmZlciAqLworICAgICAgICBYWEhfbWVtY3B5KCgoQllURSopc3RhdGUtPm1lbTY0KSArIHN0YXRlLT5tZW1zaXplLCBpbnB1dCwgbGVuKTsKKyAgICAgICAgc3RhdGUtPm1lbXNpemUgKz0gKFUzMilsZW47CisgICAgICAgIHJldHVybiBYWEhfT0s7CisgICAgfQorCisgICAgaWYgKHN0YXRlLT5tZW1zaXplKSB7ICAgLyogdG1wIGJ1ZmZlciBpcyBmdWxsICovCisgICAgICAgIFhYSF9tZW1jcHkoKChCWVRFKilzdGF0ZS0+bWVtNjQpICsgc3RhdGUtPm1lbXNpemUsIGlucHV0LCAzMi1zdGF0ZS0+bWVtc2l6ZSk7CisgICAgICAgIHN0YXRlLT52MSA9IFhYSDY0X3JvdW5kKHN0YXRlLT52MSwgWFhIX3JlYWRMRTY0KHN0YXRlLT5tZW02NCswLCBlbmRpYW4pKTsKKyAgICAgICAgc3RhdGUtPnYyID0gWFhINjRfcm91bmQoc3RhdGUtPnYyLCBYWEhfcmVhZExFNjQoc3RhdGUtPm1lbTY0KzEsIGVuZGlhbikpOworICAgICAgICBzdGF0ZS0+djMgPSBYWEg2NF9yb3VuZChzdGF0ZS0+djMsIFhYSF9yZWFkTEU2NChzdGF0ZS0+bWVtNjQrMiwgZW5kaWFuKSk7CisgICAgICAgIHN0YXRlLT52NCA9IFhYSDY0X3JvdW5kKHN0YXRlLT52NCwgWFhIX3JlYWRMRTY0KHN0YXRlLT5tZW02NCszLCBlbmRpYW4pKTsKKyAgICAgICAgcCArPSAzMi1zdGF0ZS0+bWVtc2l6ZTsKKyAgICAgICAgc3RhdGUtPm1lbXNpemUgPSAwOworICAgIH0KKworICAgIGlmIChwKzMyIDw9IGJFbmQpIHsKKyAgICAgICAgY29uc3QgQllURSogY29uc3QgbGltaXQgPSBiRW5kIC0gMzI7CisgICAgICAgIFU2NCB2MSA9IHN0YXRlLT52MTsKKyAgICAgICAgVTY0IHYyID0gc3RhdGUtPnYyOworICAgICAgICBVNjQgdjMgPSBzdGF0ZS0+djM7CisgICAgICAgIFU2NCB2NCA9IHN0YXRlLT52NDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICB2MSA9IFhYSDY0X3JvdW5kKHYxLCBYWEhfcmVhZExFNjQocCwgZW5kaWFuKSk7IHArPTg7CisgICAgICAgICAgICB2MiA9IFhYSDY0X3JvdW5kKHYyLCBYWEhfcmVhZExFNjQocCwgZW5kaWFuKSk7IHArPTg7CisgICAgICAgICAgICB2MyA9IFhYSDY0X3JvdW5kKHYzLCBYWEhfcmVhZExFNjQocCwgZW5kaWFuKSk7IHArPTg7CisgICAgICAgICAgICB2NCA9IFhYSDY0X3JvdW5kKHY0LCBYWEhfcmVhZExFNjQocCwgZW5kaWFuKSk7IHArPTg7CisgICAgICAgIH0gd2hpbGUgKHA8PWxpbWl0KTsKKworICAgICAgICBzdGF0ZS0+djEgPSB2MTsKKyAgICAgICAgc3RhdGUtPnYyID0gdjI7CisgICAgICAgIHN0YXRlLT52MyA9IHYzOworICAgICAgICBzdGF0ZS0+djQgPSB2NDsKKyAgICB9CisKKyAgICBpZiAocCA8IGJFbmQpIHsKKyAgICAgICAgWFhIX21lbWNweShzdGF0ZS0+bWVtNjQsIHAsIChzaXplX3QpKGJFbmQtcCkpOworICAgICAgICBzdGF0ZS0+bWVtc2l6ZSA9ICh1bnNpZ25lZCkoYkVuZC1wKTsKKyAgICB9CisKKyAgICByZXR1cm4gWFhIX09LOworfQorCitYWEhfUFVCTElDX0FQSSBYWEhfZXJyb3Jjb2RlIFhYSDY0X3VwZGF0ZSAoWFhINjRfc3RhdGVfdCogc3RhdGVfaW4sIGNvbnN0IHZvaWQqIGlucHV0LCBzaXplX3QgbGVuKQoreworICAgIFhYSF9lbmRpYW5lc3MgZW5kaWFuX2RldGVjdGVkID0gKFhYSF9lbmRpYW5lc3MpWFhIX0NQVV9MSVRUTEVfRU5ESUFOOworCisgICAgaWYgKChlbmRpYW5fZGV0ZWN0ZWQ9PVhYSF9saXR0bGVFbmRpYW4pIHx8IFhYSF9GT1JDRV9OQVRJVkVfRk9STUFUKQorICAgICAgICByZXR1cm4gWFhINjRfdXBkYXRlX2VuZGlhbihzdGF0ZV9pbiwgaW5wdXQsIGxlbiwgWFhIX2xpdHRsZUVuZGlhbik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gWFhINjRfdXBkYXRlX2VuZGlhbihzdGF0ZV9pbiwgaW5wdXQsIGxlbiwgWFhIX2JpZ0VuZGlhbik7Cit9CisKK0ZPUkNFX0lOTElORSBVNjQgWFhINjRfZGlnZXN0X2VuZGlhbiAoY29uc3QgWFhINjRfc3RhdGVfdCogc3RhdGUsIFhYSF9lbmRpYW5lc3MgZW5kaWFuKQoreworICAgIGNvbnN0IEJZVEUgKiBwID0gKGNvbnN0IEJZVEUqKXN0YXRlLT5tZW02NDsKKyAgICBjb25zdCBCWVRFKiBjb25zdCBiRW5kID0gKGNvbnN0IEJZVEUqKXN0YXRlLT5tZW02NCArIHN0YXRlLT5tZW1zaXplOworICAgIFU2NCBoNjQ7CisKKyAgICBpZiAoc3RhdGUtPnRvdGFsX2xlbiA+PSAzMikgeworICAgICAgICBVNjQgY29uc3QgdjEgPSBzdGF0ZS0+djE7CisgICAgICAgIFU2NCBjb25zdCB2MiA9IHN0YXRlLT52MjsKKyAgICAgICAgVTY0IGNvbnN0IHYzID0gc3RhdGUtPnYzOworICAgICAgICBVNjQgY29uc3QgdjQgPSBzdGF0ZS0+djQ7CisKKyAgICAgICAgaDY0ID0gWFhIX3JvdGw2NCh2MSwgMSkgKyBYWEhfcm90bDY0KHYyLCA3KSArIFhYSF9yb3RsNjQodjMsIDEyKSArIFhYSF9yb3RsNjQodjQsIDE4KTsKKyAgICAgICAgaDY0ID0gWFhINjRfbWVyZ2VSb3VuZChoNjQsIHYxKTsKKyAgICAgICAgaDY0ID0gWFhINjRfbWVyZ2VSb3VuZChoNjQsIHYyKTsKKyAgICAgICAgaDY0ID0gWFhINjRfbWVyZ2VSb3VuZChoNjQsIHYzKTsKKyAgICAgICAgaDY0ID0gWFhINjRfbWVyZ2VSb3VuZChoNjQsIHY0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoNjQgID0gc3RhdGUtPnYzICsgUFJJTUU2NF81OworICAgIH0KKworICAgIGg2NCArPSAoVTY0KSBzdGF0ZS0+dG90YWxfbGVuOworCisgICAgd2hpbGUgKHArODw9YkVuZCkgeworICAgICAgICBVNjQgY29uc3QgazEgPSBYWEg2NF9yb3VuZCgwLCBYWEhfcmVhZExFNjQocCwgZW5kaWFuKSk7CisgICAgICAgIGg2NCBePSBrMTsKKyAgICAgICAgaDY0ICA9IFhYSF9yb3RsNjQoaDY0LDI3KSAqIFBSSU1FNjRfMSArIFBSSU1FNjRfNDsKKyAgICAgICAgcCs9ODsKKyAgICB9CisKKyAgICBpZiAocCs0PD1iRW5kKSB7CisgICAgICAgIGg2NCBePSAoVTY0KShYWEhfcmVhZExFMzIocCwgZW5kaWFuKSkgKiBQUklNRTY0XzE7CisgICAgICAgIGg2NCAgPSBYWEhfcm90bDY0KGg2NCwgMjMpICogUFJJTUU2NF8yICsgUFJJTUU2NF8zOworICAgICAgICBwKz00OworICAgIH0KKworICAgIHdoaWxlIChwPGJFbmQpIHsKKyAgICAgICAgaDY0IF49ICgqcCkgKiBQUklNRTY0XzU7CisgICAgICAgIGg2NCAgPSBYWEhfcm90bDY0KGg2NCwgMTEpICogUFJJTUU2NF8xOworICAgICAgICBwKys7CisgICAgfQorCisgICAgaDY0IF49IGg2NCA+PiAzMzsKKyAgICBoNjQgKj0gUFJJTUU2NF8yOworICAgIGg2NCBePSBoNjQgPj4gMjk7CisgICAgaDY0ICo9IFBSSU1FNjRfMzsKKyAgICBoNjQgXj0gaDY0ID4+IDMyOworCisgICAgcmV0dXJuIGg2NDsKK30KKworWFhIX1BVQkxJQ19BUEkgdW5zaWduZWQgbG9uZyBsb25nIFhYSDY0X2RpZ2VzdCAoY29uc3QgWFhINjRfc3RhdGVfdCogc3RhdGVfaW4pCit7CisgICAgWFhIX2VuZGlhbmVzcyBlbmRpYW5fZGV0ZWN0ZWQgPSAoWFhIX2VuZGlhbmVzcylYWEhfQ1BVX0xJVFRMRV9FTkRJQU47CisKKyAgICBpZiAoKGVuZGlhbl9kZXRlY3RlZD09WFhIX2xpdHRsZUVuZGlhbikgfHwgWFhIX0ZPUkNFX05BVElWRV9GT1JNQVQpCisgICAgICAgIHJldHVybiBYWEg2NF9kaWdlc3RfZW5kaWFuKHN0YXRlX2luLCBYWEhfbGl0dGxlRW5kaWFuKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBYWEg2NF9kaWdlc3RfZW5kaWFuKHN0YXRlX2luLCBYWEhfYmlnRW5kaWFuKTsKK30KKworCisvKj09PT09PSBDYW5vbmljYWwgcmVwcmVzZW50YXRpb24gICA9PT09PT0qLworCitYWEhfUFVCTElDX0FQSSB2b2lkIFhYSDY0X2Nhbm9uaWNhbEZyb21IYXNoKFhYSDY0X2Nhbm9uaWNhbF90KiBkc3QsIFhYSDY0X2hhc2hfdCBoYXNoKQoreworICAgIFhYSF9TVEFUSUNfQVNTRVJUKHNpemVvZihYWEg2NF9jYW5vbmljYWxfdCkgPT0gc2l6ZW9mKFhYSDY0X2hhc2hfdCkpOworICAgIGlmIChYWEhfQ1BVX0xJVFRMRV9FTkRJQU4pIGhhc2ggPSBYWEhfc3dhcDY0KGhhc2gpOworICAgIG1lbWNweShkc3QsICZoYXNoLCBzaXplb2YoKmRzdCkpOworfQorCitYWEhfUFVCTElDX0FQSSBYWEg2NF9oYXNoX3QgWFhINjRfaGFzaEZyb21DYW5vbmljYWwoY29uc3QgWFhINjRfY2Fub25pY2FsX3QqIHNyYykKK3sKKyAgICByZXR1cm4gWFhIX3JlYWRCRTY0KHNyYyk7Cit9CisKKyNlbmRpZiAgLyogWFhIX05PX0xPTkdfTE9ORyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3h4aGFzaC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvbGF5ZXJzL3h4aGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODMxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9sYXllcnMveHhoYXNoLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgICB4eEhhc2ggLSBFeHRyZW1lbHkgRmFzdCBIYXNoIGFsZ29yaXRobQorICAgSGVhZGVyIEZpbGUKKyAgIENvcHlyaWdodCAoQykgMjAxMi0yMDE2LCBZYW5uIENvbGxldC4KKworICAgQlNEIDItQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQorCisgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAgIG1ldDoKKworICAgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgIGRpc3RyaWJ1dGlvbi4KKworICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICAgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgWW91IGNhbiBjb250YWN0IHRoZSBhdXRob3IgYXQgOgorICAgLSB4eEhhc2ggc291cmNlIHJlcG9zaXRvcnkgOiBodHRwczovL2dpdGh1Yi5jb20vQ3lhbjQ5NzMveHhIYXNoCisqLworCisvKiBOb3RpY2UgZXh0cmFjdGVkIGZyb20geHhIYXNoIGhvbWVwYWdlIDoKKworeHhIYXNoIGlzIGFuIGV4dHJlbWVseSBmYXN0IEhhc2ggYWxnb3JpdGhtLCBydW5uaW5nIGF0IFJBTSBzcGVlZCBsaW1pdHMuCitJdCBhbHNvIHN1Y2Nlc3NmdWxseSBwYXNzZXMgYWxsIHRlc3RzIGZyb20gdGhlIFNNSGFzaGVyIHN1aXRlLgorCitDb21wYXJpc29uIChzaW5nbGUgdGhyZWFkLCBXaW5kb3dzIFNldmVuIDMyIGJpdHMsIHVzaW5nIFNNSGFzaGVyIG9uIGEgQ29yZSAyIER1byBAM0dIeikKKworTmFtZSAgICAgICAgICAgIFNwZWVkICAgICAgIFEuU2NvcmUgICBBdXRob3IKK3h4SGFzaCAgICAgICAgICA1LjQgR0IvcyAgICAgMTAKK0NyYXBXb3cgICAgICAgICAzLjIgR0IvcyAgICAgIDIgICAgICAgQW5kcmV3CitNdW11ckhhc2ggM2EgICAgMi43IEdCL3MgICAgIDEwICAgICAgIEF1c3RpbiBBcHBsZWJ5CitTcG9va3lIYXNoICAgICAgMi4wIEdCL3MgICAgIDEwICAgICAgIEJvYiBKZW5raW5zCitTQm94ICAgICAgICAgICAgMS40IEdCL3MgICAgICA5ICAgICAgIEJyZXQgTXVsdmV5CitMb29rdXAzICAgICAgICAgMS4yIEdCL3MgICAgICA5ICAgICAgIEJvYiBKZW5raW5zCitTdXBlckZhc3RIYXNoICAgMS4yIEdCL3MgICAgICAxICAgICAgIFBhdWwgSHNpZWgKK0NpdHlIYXNoNjQgICAgICAxLjA1IEdCL3MgICAgMTAgICAgICAgUGlrZSAmIEFsYWt1aWphbGEKK0ZOViAgICAgICAgICAgICAwLjU1IEdCL3MgICAgIDUgICAgICAgRm93bGVyLCBOb2xsLCBWbworQ1JDMzIgICAgICAgICAgIDAuNDMgR0IvcyAgICAgOQorTUQ1LTMyICAgICAgICAgIDAuMzMgR0IvcyAgICAxMCAgICAgICBSb25hbGQgTC4gUml2ZXN0CitTSEExLTMyICAgICAgICAgMC4yOCBHQi9zICAgIDEwCisKK1EuU2NvcmUgaXMgYSBtZWFzdXJlIG9mIHF1YWxpdHkgb2YgdGhlIGhhc2ggZnVuY3Rpb24uCitJdCBkZXBlbmRzIG9uIHN1Y2Nlc3NmdWxseSBwYXNzaW5nIFNNSGFzaGVyIHRlc3Qgc2V0LgorMTAgaXMgYSBwZXJmZWN0IHNjb3JlLgorCitBIDY0LWJpdHMgdmVyc2lvbiwgbmFtZWQgWFhINjQsIGlzIGF2YWlsYWJsZSBzaW5jZSByMzUuCitJdCBvZmZlcnMgbXVjaCBiZXR0ZXIgc3BlZWQsIGJ1dCBmb3IgNjQtYml0cyBhcHBsaWNhdGlvbnMgb25seS4KK05hbWUgICAgIFNwZWVkIG9uIDY0IGJpdHMgICAgU3BlZWQgb24gMzIgYml0cworWFhINjQgICAgICAgMTMuOCBHQi9zICAgICAgICAgICAgMS45IEdCL3MKK1hYSDMyICAgICAgICA2LjggR0IvcyAgICAgICAgICAgIDYuMCBHQi9zCisqLworCisjaWZuZGVmIFhYSEFTSF9IXzU2MjcxMzU1ODU2NjYxNzkKKyNkZWZpbmUgWFhIQVNIX0hfNTYyNzEzNTU4NTY2NjE3OSAxCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRGVmaW5pdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAvKiBzaXplX3QgKi8KK3R5cGVkZWYgZW51bSB7IFhYSF9PSz0wLCBYWEhfRVJST1IgfSBYWEhfZXJyb3Jjb2RlOworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEFQSSBtb2RpZmllcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFhYSF9QUklWQVRFX0FQSQorKiAgIFRoaXMgaXMgdXNlZnVsIHRvIGluY2x1ZGUgeHhoYXNoIGZ1bmN0aW9ucyBpbiBgc3RhdGljYCBtb2RlCisqICAgaW4gb3JkZXIgdG8gaW5saW5lIHRoZW0sIGFuZCByZW1vdmUgdGhlaXIgc3ltYm9sIGZyb20gdGhlIHB1YmxpYyBsaXN0LgorKiAgIE1ldGhvZG9sb2d5IDoKKyogICAgICNkZWZpbmUgWFhIX1BSSVZBVEVfQVBJCisqICAgICAjaW5jbHVkZSAieHhoYXNoLmgiCisqICAgYHh4aGFzaC5jYCBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkLgorKiAgIEl0J3Mgbm90IHVzZWZ1bCB0byBjb21waWxlIGFuZCBsaW5rIGl0IGFzIGEgc2VwYXJhdGUgbW9kdWxlLgorKi8KKyNpZmRlZiBYWEhfUFJJVkFURV9BUEkKKyMgIGlmbmRlZiBYWEhfU1RBVElDX0xJTktJTkdfT05MWQorIyAgICBkZWZpbmUgWFhIX1NUQVRJQ19MSU5LSU5HX09OTFkKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgICBkZWZpbmUgWFhIX1BVQkxJQ19BUEkgc3RhdGljIF9faW5saW5lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjICBlbGlmIGRlZmluZWQgKF9fY3BsdXNwbHVzKSB8fCAoZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkgLyogQzk5ICovKQorIyAgICBkZWZpbmUgWFhIX1BVQkxJQ19BUEkgc3RhdGljIGlubGluZQorIyAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgICBkZWZpbmUgWFhIX1BVQkxJQ19BUEkgc3RhdGljIF9faW5saW5lCisjICBlbHNlCisjICAgIGRlZmluZSBYWEhfUFVCTElDX0FQSSBzdGF0aWMgICAvKiB0aGlzIHZlcnNpb24gbWF5IGdlbmVyYXRlIHdhcm5pbmdzIGZvciB1bnVzZWQgc3RhdGljIGZ1bmN0aW9uczsgZGlzYWJsZSB0aGUgcmVsZXZhbnQgd2FybmluZyAqLworIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgWFhIX1BVQkxJQ19BUEkgICAvKiBkbyBub3RoaW5nICovCisjZW5kaWYgLyogWFhIX1BSSVZBVEVfQVBJICovCisKKy8qIVhYSF9OQU1FU1BBQ0UsIGFrYSBOYW1lc3BhY2UgRW11bGF0aW9uIDoKKworSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBfYW5kIGV4cG9zZV8geHhIYXNoIGZ1bmN0aW9ucyBmcm9tIHdpdGhpbiB5b3VyIG93biBsaWJyYXJ5LAorYnV0IGFsc28gd2FudCB0byBhdm9pZCBzeW1ib2wgY29sbGlzaW9ucyB3aXRoIG90aGVyIGxpYnJhcmllcyB3aGljaCBtYXkgYWxzbyBpbmNsdWRlIHh4SGFzaCwKKworeW91IGNhbiB1c2UgWFhIX05BTUVTUEFDRSwgdG8gYXV0b21hdGljYWxseSBwcmVmaXggYW55IHB1YmxpYyBzeW1ib2wgZnJvbSB4eGhhc2ggbGlicmFyeQord2l0aCB0aGUgdmFsdWUgb2YgWFhIX05BTUVTUEFDRSAodGhlcmVmb3JlLCBhdm9pZCBOVUxMIGFuZCBudW1lcmljIHZhbHVlcykuCisKK05vdGUgdGhhdCBubyBjaGFuZ2UgaXMgcmVxdWlyZWQgd2l0aGluIHRoZSBjYWxsaW5nIHByb2dyYW0gYXMgbG9uZyBhcyBpdCBpbmNsdWRlcyBgeHhoYXNoLmhgIDoKK3JlZ3VsYXIgc3ltYm9sIG5hbWUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgYnkgdGhpcyBoZWFkZXIuCisqLworI2lmZGVmIFhYSF9OQU1FU1BBQ0UKKyMgIGRlZmluZSBYWEhfQ0FUKEEsQikgQSMjQgorIyAgZGVmaW5lIFhYSF9OQU1FMihBLEIpIFhYSF9DQVQoQSxCKQorIyAgZGVmaW5lIFhYSF92ZXJzaW9uTnVtYmVyIFhYSF9OQU1FMihYWEhfTkFNRVNQQUNFLCBYWEhfdmVyc2lvbk51bWJlcikKKyMgIGRlZmluZSBYWEgzMiBYWEhfTkFNRTIoWFhIX05BTUVTUEFDRSwgWFhIMzIpCisjICBkZWZpbmUgWFhIMzJfY3JlYXRlU3RhdGUgWFhIX05BTUUyKFhYSF9OQU1FU1BBQ0UsIFhYSDMyX2NyZWF0ZVN0YXRlKQorIyAgZGVmaW5lIFhYSDMyX2ZyZWVTdGF0ZSBYWEhfTkFNRTIoWFhIX05BTUVTUEFDRSwgWFhIMzJfZnJlZVN0YXRlKQorIyAgZGVmaW5lIFhYSDMyX3Jlc2V0IFhYSF9OQU1FMihYWEhfTkFNRVNQQUNFLCBYWEgzMl9yZXNldCkKKyMgIGRlZmluZSBYWEgzMl91cGRhdGUgWFhIX05BTUUyKFhYSF9OQU1FU1BBQ0UsIFhYSDMyX3VwZGF0ZSkKKyMgIGRlZmluZSBYWEgzMl9kaWdlc3QgWFhIX05BTUUyKFhYSF9OQU1FU1BBQ0UsIFhYSDMyX2RpZ2VzdCkKKyMgIGRlZmluZSBYWEgzMl9jb3B5U3RhdGUgWFhIX05BTUUyKFhYSF9OQU1FU1BBQ0UsIFhYSDMyX2NvcHlTdGF0ZSkKKyMgIGRlZmluZSBYWEgzMl9jYW5vbmljYWxGcm9tSGFzaCBYWEhfTkFNRTIoWFhIX05BTUVTUEFDRSwgWFhIMzJfY2Fub25pY2FsRnJvbUhhc2gpCisjICBkZWZpbmUgWFhIMzJfaGFzaEZyb21DYW5vbmljYWwgWFhIX05BTUUyKFhYSF9OQU1FU1BBQ0UsIFhYSDMyX2hhc2hGcm9tQ2Fub25pY2FsKQorIyAgZGVmaW5lIFhYSDY0IFhYSF9OQU1FMihYWEhfTkFNRVNQQUNFLCBYWEg2NCkKKyMgIGRlZmluZSBYWEg2NF9jcmVhdGVTdGF0ZSBYWEhfTkFNRTIoWFhIX05BTUVTUEFDRSwgWFhINjRfY3JlYXRlU3RhdGUpCisjICBkZWZpbmUgWFhINjRfZnJlZVN0YXRlIFhYSF9OQU1FMihYWEhfTkFNRVNQQUNFLCBYWEg2NF9mcmVlU3RhdGUpCisjICBkZWZpbmUgWFhINjRfcmVzZXQgWFhIX05BTUUyKFhYSF9OQU1FU1BBQ0UsIFhYSDY0X3Jlc2V0KQorIyAgZGVmaW5lIFhYSDY0X3VwZGF0ZSBYWEhfTkFNRTIoWFhIX05BTUVTUEFDRSwgWFhINjRfdXBkYXRlKQorIyAgZGVmaW5lIFhYSDY0X2RpZ2VzdCBYWEhfTkFNRTIoWFhIX05BTUVTUEFDRSwgWFhINjRfZGlnZXN0KQorIyAgZGVmaW5lIFhYSDY0X2NvcHlTdGF0ZSBYWEhfTkFNRTIoWFhIX05BTUVTUEFDRSwgWFhINjRfY29weVN0YXRlKQorIyAgZGVmaW5lIFhYSDY0X2Nhbm9uaWNhbEZyb21IYXNoIFhYSF9OQU1FMihYWEhfTkFNRVNQQUNFLCBYWEg2NF9jYW5vbmljYWxGcm9tSGFzaCkKKyMgIGRlZmluZSBYWEg2NF9oYXNoRnJvbUNhbm9uaWNhbCBYWEhfTkFNRTIoWFhIX05BTUVTUEFDRSwgWFhINjRfaGFzaEZyb21DYW5vbmljYWwpCisjZW5kaWYKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBWZXJzaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFhYSF9WRVJTSU9OX01BSk9SICAgIDAKKyNkZWZpbmUgWFhIX1ZFUlNJT05fTUlOT1IgICAgNgorI2RlZmluZSBYWEhfVkVSU0lPTl9SRUxFQVNFICAyCisjZGVmaW5lIFhYSF9WRVJTSU9OX05VTUJFUiAgKFhYSF9WRVJTSU9OX01BSk9SICoxMDAqMTAwICsgWFhIX1ZFUlNJT05fTUlOT1IgKjEwMCArIFhYSF9WRVJTSU9OX1JFTEVBU0UpCitYWEhfUFVCTElDX0FQSSB1bnNpZ25lZCBYWEhfdmVyc2lvbk51bWJlciAodm9pZCk7CisKKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgMzItYml0cyBoYXNoCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHVuc2lnbmVkIGludCBYWEgzMl9oYXNoX3Q7CisKKy8qISBYWEgzMigpIDoKKyAgICBDYWxjdWxhdGUgdGhlIDMyLWJpdHMgaGFzaCBvZiBzZXF1ZW5jZSAibGVuZ3RoIiBieXRlcyBzdG9yZWQgYXQgbWVtb3J5IGFkZHJlc3MgImlucHV0Ii4KKyAgICBUaGUgbWVtb3J5IGJldHdlZW4gaW5wdXQgJiBpbnB1dCtsZW5ndGggbXVzdCBiZSB2YWxpZCAoYWxsb2NhdGVkIGFuZCByZWFkLWFjY2Vzc2libGUpLgorICAgICJzZWVkIiBjYW4gYmUgdXNlZCB0byBhbHRlciB0aGUgcmVzdWx0IHByZWRpY3RhYmx5LgorICAgIFNwZWVkIG9uIENvcmUgMiBEdW8gQCAzIEdIeiAoc2luZ2xlIHRocmVhZCwgU01IYXNoZXIgYmVuY2htYXJrKSA6IDUuNCBHQi9zICovCitYWEhfUFVCTElDX0FQSSBYWEgzMl9oYXNoX3QgWFhIMzIgKGNvbnN0IHZvaWQqIGlucHV0LCBzaXplX3QgbGVuZ3RoLCB1bnNpZ25lZCBpbnQgc2VlZCk7CisKKy8qPT09PT09ICAgU3RyZWFtaW5nICAgPT09PT09Ki8KK3R5cGVkZWYgc3RydWN0IFhYSDMyX3N0YXRlX3MgWFhIMzJfc3RhdGVfdDsgICAvKiBpbmNvbXBsZXRlIHR5cGUgKi8KK1hYSF9QVUJMSUNfQVBJIFhYSDMyX3N0YXRlX3QqIFhYSDMyX2NyZWF0ZVN0YXRlKHZvaWQpOworWFhIX1BVQkxJQ19BUEkgWFhIX2Vycm9yY29kZSAgWFhIMzJfZnJlZVN0YXRlKFhYSDMyX3N0YXRlX3QqIHN0YXRlUHRyKTsKK1hYSF9QVUJMSUNfQVBJIHZvaWQgWFhIMzJfY29weVN0YXRlKFhYSDMyX3N0YXRlX3QqIGRzdF9zdGF0ZSwgY29uc3QgWFhIMzJfc3RhdGVfdCogc3JjX3N0YXRlKTsKKworWFhIX1BVQkxJQ19BUEkgWFhIX2Vycm9yY29kZSBYWEgzMl9yZXNldCAgKFhYSDMyX3N0YXRlX3QqIHN0YXRlUHRyLCB1bnNpZ25lZCBpbnQgc2VlZCk7CitYWEhfUFVCTElDX0FQSSBYWEhfZXJyb3Jjb2RlIFhYSDMyX3VwZGF0ZSAoWFhIMzJfc3RhdGVfdCogc3RhdGVQdHIsIGNvbnN0IHZvaWQqIGlucHV0LCBzaXplX3QgbGVuZ3RoKTsKK1hYSF9QVUJMSUNfQVBJIFhYSDMyX2hhc2hfdCAgWFhIMzJfZGlnZXN0IChjb25zdCBYWEgzMl9zdGF0ZV90KiBzdGF0ZVB0cik7CisKKy8qCitUaGVzZSBmdW5jdGlvbnMgZ2VuZXJhdGUgdGhlIHh4SGFzaCBvZiBhbiBpbnB1dCBwcm92aWRlZCBpbiBtdWx0aXBsZSBzZWdtZW50cy4KK05vdGUgdGhhdCwgZm9yIHNtYWxsIGlucHV0LCB0aGV5IGFyZSBzbG93ZXIgdGhhbiBzaW5nbGUtY2FsbCBmdW5jdGlvbnMsIGR1ZSB0byBzdGF0ZSBtYW5hZ2VtZW50LgorRm9yIHNtYWxsIGlucHV0LCBwcmVmZXIgYFhYSDMyKClgIGFuZCBgWFhINjQoKWAgLgorCitYWEggc3RhdGUgbXVzdCBmaXJzdCBiZSBhbGxvY2F0ZWQsIHVzaW5nIFhYSCpfY3JlYXRlU3RhdGUoKSAuCisKK1N0YXJ0IGEgbmV3IGhhc2ggYnkgaW5pdGlhbGl6aW5nIHN0YXRlIHdpdGggYSBzZWVkLCB1c2luZyBYWEgqX3Jlc2V0KCkuCisKK1RoZW4sIGZlZWQgdGhlIGhhc2ggc3RhdGUgYnkgY2FsbGluZyBYWEgqX3VwZGF0ZSgpIGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5LgorT2J2aW91c2x5LCBpbnB1dCBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgcmVhZCBhY2Nlc3NpYmxlLgorVGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZSwgd2l0aCAwIG1lYW5pbmcgT0ssIGFuZCBhbnkgb3RoZXIgdmFsdWUgbWVhbmluZyB0aGVyZSBpcyBhbiBlcnJvci4KKworRmluYWxseSwgYSBoYXNoIHZhbHVlIGNhbiBiZSBwcm9kdWNlZCBhbnl0aW1lLCBieSB1c2luZyBYWEgqX2RpZ2VzdCgpLgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBubi1iaXRzIGhhc2ggYXMgYW4gaW50IG9yIGxvbmcgbG9uZy4KKworSXQncyBzdGlsbCBwb3NzaWJsZSB0byBjb250aW51ZSBpbnNlcnRpbmcgaW5wdXQgaW50byB0aGUgaGFzaCBzdGF0ZSBhZnRlciBhIGRpZ2VzdCwKK2FuZCBnZW5lcmF0ZSBzb21lIG5ldyBoYXNoZXMgbGF0ZXIgb24sIGJ5IGNhbGxpbmcgYWdhaW4gWFhIKl9kaWdlc3QoKS4KKworV2hlbiBkb25lLCBmcmVlIFhYSCBzdGF0ZSBzcGFjZSBpZiBpdCB3YXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorKi8KKworLyo9PT09PT0gICBDYW5vbmljYWwgcmVwcmVzZW50YXRpb24gICA9PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgZGlnZXN0WzRdOyB9IFhYSDMyX2Nhbm9uaWNhbF90OworWFhIX1BVQkxJQ19BUEkgdm9pZCBYWEgzMl9jYW5vbmljYWxGcm9tSGFzaChYWEgzMl9jYW5vbmljYWxfdCogZHN0LCBYWEgzMl9oYXNoX3QgaGFzaCk7CitYWEhfUFVCTElDX0FQSSBYWEgzMl9oYXNoX3QgWFhIMzJfaGFzaEZyb21DYW5vbmljYWwoY29uc3QgWFhIMzJfY2Fub25pY2FsX3QqIHNyYyk7CisKKy8qIERlZmF1bHQgcmVzdWx0IHR5cGUgZm9yIFhYSCBmdW5jdGlvbnMgYXJlIHByaW1pdGl2ZSB1bnNpZ25lZCAzMiBhbmQgNjQgYml0cy4KKyogIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdXNlcyBodW1hbi1yZWFkYWJsZSB3cml0ZSBjb252ZW50aW9uLCBha2EgYmlnLWVuZGlhbiAobGFyZ2UgZGlnaXRzIGZpcnN0KS4KKyogIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyB0cmFuc2Zvcm1hdGlvbiBvZiBoYXNoIHJlc3VsdCBpbnRvIGFuZCBmcm9tIGl0cyBjYW5vbmljYWwgZm9ybWF0LgorKiAgVGhpcyB3YXksIGhhc2ggdmFsdWVzIGNhbiBiZSB3cml0dGVuIGludG8gYSBmaWxlIC8gbWVtb3J5LCBhbmQgcmVtYWluIGNvbXBhcmFibGUgb24gZGlmZmVyZW50IHN5c3RlbXMgYW5kIHByb2dyYW1zLgorKi8KKworCisjaWZuZGVmIFhYSF9OT19MT05HX0xPTkcKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIDY0LWJpdHMgaGFzaAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgWFhINjRfaGFzaF90OworCisvKiEgWFhINjQoKSA6CisgICAgQ2FsY3VsYXRlIHRoZSA2NC1iaXRzIGhhc2ggb2Ygc2VxdWVuY2Ugb2YgbGVuZ3RoICJsZW4iIHN0b3JlZCBhdCBtZW1vcnkgYWRkcmVzcyAiaW5wdXQiLgorICAgICJzZWVkIiBjYW4gYmUgdXNlZCB0byBhbHRlciB0aGUgcmVzdWx0IHByZWRpY3RhYmx5LgorICAgIFRoaXMgZnVuY3Rpb24gcnVucyBmYXN0ZXIgb24gNjQtYml0cyBzeXN0ZW1zLCBidXQgc2xvd2VyIG9uIDMyLWJpdHMgc3lzdGVtcyAoc2VlIGJlbmNobWFyaykuCisqLworWFhIX1BVQkxJQ19BUEkgWFhINjRfaGFzaF90IFhYSDY0IChjb25zdCB2b2lkKiBpbnB1dCwgc2l6ZV90IGxlbmd0aCwgdW5zaWduZWQgbG9uZyBsb25nIHNlZWQpOworCisvKj09PT09PSAgIFN0cmVhbWluZyAgID09PT09PSovCit0eXBlZGVmIHN0cnVjdCBYWEg2NF9zdGF0ZV9zIFhYSDY0X3N0YXRlX3Q7ICAgLyogaW5jb21wbGV0ZSB0eXBlICovCitYWEhfUFVCTElDX0FQSSBYWEg2NF9zdGF0ZV90KiBYWEg2NF9jcmVhdGVTdGF0ZSh2b2lkKTsKK1hYSF9QVUJMSUNfQVBJIFhYSF9lcnJvcmNvZGUgIFhYSDY0X2ZyZWVTdGF0ZShYWEg2NF9zdGF0ZV90KiBzdGF0ZVB0cik7CitYWEhfUFVCTElDX0FQSSB2b2lkIFhYSDY0X2NvcHlTdGF0ZShYWEg2NF9zdGF0ZV90KiBkc3Rfc3RhdGUsIGNvbnN0IFhYSDY0X3N0YXRlX3QqIHNyY19zdGF0ZSk7CisKK1hYSF9QVUJMSUNfQVBJIFhYSF9lcnJvcmNvZGUgWFhINjRfcmVzZXQgIChYWEg2NF9zdGF0ZV90KiBzdGF0ZVB0ciwgdW5zaWduZWQgbG9uZyBsb25nIHNlZWQpOworWFhIX1BVQkxJQ19BUEkgWFhIX2Vycm9yY29kZSBYWEg2NF91cGRhdGUgKFhYSDY0X3N0YXRlX3QqIHN0YXRlUHRyLCBjb25zdCB2b2lkKiBpbnB1dCwgc2l6ZV90IGxlbmd0aCk7CitYWEhfUFVCTElDX0FQSSBYWEg2NF9oYXNoX3QgIFhYSDY0X2RpZ2VzdCAoY29uc3QgWFhINjRfc3RhdGVfdCogc3RhdGVQdHIpOworCisvKj09PT09PSAgIENhbm9uaWNhbCByZXByZXNlbnRhdGlvbiAgID09PT09PSovCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgZGlnZXN0WzhdOyB9IFhYSDY0X2Nhbm9uaWNhbF90OworWFhIX1BVQkxJQ19BUEkgdm9pZCBYWEg2NF9jYW5vbmljYWxGcm9tSGFzaChYWEg2NF9jYW5vbmljYWxfdCogZHN0LCBYWEg2NF9oYXNoX3QgaGFzaCk7CitYWEhfUFVCTElDX0FQSSBYWEg2NF9oYXNoX3QgWFhINjRfaGFzaEZyb21DYW5vbmljYWwoY29uc3QgWFhINjRfY2Fub25pY2FsX3QqIHNyYyk7CisjZW5kaWYgIC8qIFhYSF9OT19MT05HX0xPTkcgKi8KKworCisjaWZkZWYgWFhIX1NUQVRJQ19MSU5LSU5HX09OTFkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGVmaW5pdGlvbnMgd2hpY2ggYXJlIG5vdCBndWFyYW50ZWVkIHRvIHJlbWFpbiBzdGFibGUuCisgICBUaGV5IG1heSBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zLCBiZWNvbWluZyBpbmNvbXBhdGlibGUgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgVGhleSBzaGFsbCBvbmx5IGJlIHVzZWQgd2l0aCBzdGF0aWMgbGlua2luZy4KKyAgIE5ldmVyIHVzZSB0aGVzZSBkZWZpbml0aW9ucyBpbiBhc3NvY2lhdGlvbiB3aXRoIGR5bmFtaWMgbGlua2luZyAhCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIG9ubHkgbWVhbnQgdG8gbWFrZSBwb3NzaWJsZQorICAgc3RhdGljIGFsbG9jYXRpb24gb2YgWFhIIHN0YXRlLCBvbiBzdGFjayBvciBpbiBhIHN0cnVjdCBmb3IgZXhhbXBsZS4KKyAgIE5ldmVyIHVzZSBtZW1iZXJzIGRpcmVjdGx5LiAqLworCitzdHJ1Y3QgWFhIMzJfc3RhdGVfcyB7CisgICB1bnNpZ25lZCB0b3RhbF9sZW5fMzI7CisgICB1bnNpZ25lZCBsYXJnZV9sZW47CisgICB1bnNpZ25lZCB2MTsKKyAgIHVuc2lnbmVkIHYyOworICAgdW5zaWduZWQgdjM7CisgICB1bnNpZ25lZCB2NDsKKyAgIHVuc2lnbmVkIG1lbTMyWzRdOyAgIC8qIGJ1ZmZlciBkZWZpbmVkIGFzIFUzMiBmb3IgYWxpZ25tZW50ICovCisgICB1bnNpZ25lZCBtZW1zaXplOworICAgdW5zaWduZWQgcmVzZXJ2ZWQ7ICAgLyogbmV2ZXIgcmVhZCBub3Igd3JpdGUsIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uICovCit9OyAgIC8qIHR5cGVkZWYnZCB0byBYWEgzMl9zdGF0ZV90ICovCisKKyNpZm5kZWYgWFhIX05PX0xPTkdfTE9ORyAgIC8qIHJlbW92ZSA2NC1iaXRzIHN1cHBvcnQgKi8KK3N0cnVjdCBYWEg2NF9zdGF0ZV9zIHsKKyAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9sZW47CisgICB1bnNpZ25lZCBsb25nIGxvbmcgdjE7CisgICB1bnNpZ25lZCBsb25nIGxvbmcgdjI7CisgICB1bnNpZ25lZCBsb25nIGxvbmcgdjM7CisgICB1bnNpZ25lZCBsb25nIGxvbmcgdjQ7CisgICB1bnNpZ25lZCBsb25nIGxvbmcgbWVtNjRbNF07ICAgLyogYnVmZmVyIGRlZmluZWQgYXMgVTY0IGZvciBhbGlnbm1lbnQgKi8KKyAgIHVuc2lnbmVkIG1lbXNpemU7CisgICB1bnNpZ25lZCByZXNlcnZlZFsyXTsgICAgICAgICAgLyogbmV2ZXIgcmVhZCBub3Igd3JpdGUsIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uICovCit9OyAgIC8qIHR5cGVkZWYnZCB0byBYWEg2NF9zdGF0ZV90ICovCisjZW5kaWYKKworI2lmZGVmIFhYSF9QUklWQVRFX0FQSQorIyAgaW5jbHVkZSAieHhoYXNoLmMiICAgLyogaW5jbHVkZSB4eGhhc2ggZnVuY3Rpb24gYm9kaWVzIGFzIGBzdGF0aWNgLCBmb3IgaW5saW5pbmcgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogWFhIX1NUQVRJQ19MSU5LSU5HX09OTFkgKi8KKworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFhYSEFTSF9IXzU2MjcxMzU1ODU2NjYxNzkgKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvY2hlY2tfY29kZV9mb3JtYXQuc2ggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2NoZWNrX2NvZGVfZm9ybWF0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiNWIwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2NoZWNrX2NvZGVfZm9ybWF0LnNoCkBAIC0wLDAgKzEsNjYgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoYykgMjAxNy0yMDE5IEdvb2dsZSBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxOSBMdW5hckcsIEluYy4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBTY3JpcHQgdG8gZGV0ZXJtaW5lIGlmIHNvdXJjZSBjb2RlIGluIFB1bGwgUmVxdWVzdCBpcyBwcm9wZXJseSBmb3JtYXR0ZWQuCisjIEV4aXRzIHdpdGggbm9uIDAgZXhpdCBjb2RlIGlmIGZvcm1hdHRpbmcgaXMgbmVlZGVkLgorIworIyBUaGlzIHNjcmlwdCBhc3N1bWVzIHRvIGJlIGludm9rZWQgYXQgdGhlIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuCisKK1JFRD0nXDAzM1swOzMxbScKK0dSRUVOPSdcMDMzWzA7MzJtJworTkM9J1wwMzNbMG0nICMgTm8gQ29sb3IKK0ZPVU5EX0VSUk9SPTAKKworRklMRVNfVE9fQ0hFQ0s9JChnaXQgZGlmZiAtLW5hbWUtb25seSBtYXN0ZXIgfCBncmVwIC12IC1FICJeaW5jbHVkZS92dWxrYW4iIHwgZ3JlcCAtRSAiLipcLihjcHB8Y2N8Y1wrXCt8Y3h4fGN8aHxocHApJCIpCitDT1BZUklHSFRFRF9GSUxFU19UT19DSEVDSz0kKGdpdCBkaWZmIC0tbmFtZS1vbmx5IG1hc3RlciB8IGdyZXAgLXYgLUUgIl5pbmNsdWRlL3Z1bGthbiIpCisKK2lmIFsgLXogIiR7RklMRVNfVE9fQ0hFQ0t9IiBdOyB0aGVuCisgIGVjaG8gLWUgIiR7R1JFRU59Tm8gc291cmNlIGNvZGUgdG8gY2hlY2sgZm9yIGZvcm1hdHRpbmcuJHtOQ30iCitlbHNlCisgICMgQ2hlY2sgc291cmNlIGZpbGVzIGluIFBSIGZvciBjbGFuZy1mb3JtYXQgZXJyb3JzCisgIEZPUk1BVF9ESUZGPSQoZ2l0IGRpZmYgLVUwIG1hc3RlciAtLSAke0ZJTEVTX1RPX0NIRUNLfSB8IHB5dGhvbiAuL3NjcmlwdHMvY2xhbmctZm9ybWF0LWRpZmYucHkgLXAxIC1zdHlsZT1maWxlKQorCisgIGlmIFsgISAteiAiJHtGT1JNQVRfRElGRn0iIF07IHRoZW4KKyAgICBlY2hvIC1lICIke1JFRH1Gb3VuZCBmb3JtYXR0aW5nIGVycm9ycyEke05DfSIKKyAgICBlY2hvICIke0ZPUk1BVF9ESUZGfSIKKyAgICBGT1VORF9FUlJPUj0xCisgIGZpCisKKyAgIyBDaGVjayBmaWxlcyBpbiBQUiBvdXQtb2YtZGF0ZSBjb3B5cmlnaHQgbm90aWNlcworICBpZiBbIC16ICIke0NPUFlSSUdIVEVEX0ZJTEVTX1RPX0NIRUNLfSIgXTsgdGhlbgorICAgIGVjaG8gLWUgIiR7R1JFRU59Tm8gc291cmNlIGNvZGUgdG8gY2hlY2sgZm9yIGNvcHlyaWdodCBkYXRlcy4ke05DfSIKKyAgZWxzZQorICAgIFRISVNZRUFSPSQoZGF0ZSArIiVZIikKKyAgICAjIExvb2sgZm9yIGN1cnJlbnQgeWVhciBpbiBjb3B5cmlnaHQgbGluZXMKKyAgICBmb3IgQUZJTEUgaW4gJHtDT1BZUklHSFRFRF9GSUxFU19UT19DSEVDS30KKyAgICBkbworICAgICAgQ09QWVJJR0hUX0lORk89JChjYXQgJHtBRklMRX0gfCBncmVwIC1FICJDb3B5cmlnaHQgKC4pKkx1bmFyRyIpCisgICAgICBpZiBbICEgLXogIiR7Q09QWVJJR0hUX0lORk99IiBdOyB0aGVuCisgICAgICAgIGlmICEgZWNobyAiJENPUFlSSUdIVF9JTkZPIiB8IGdyZXAgLXEgIiRUSElTWUVBUiIgOyB0aGVuCisgICAgICAgICAgZWNobyAtZSAiJHtSRUR9ICIkQUZJTEUiIGhhcyBhbiBvdXQtb2YtZGF0ZSBjb3B5cmlnaHQgbm90aWNlLiR7TkN9IgorICAgICAgICAgIEZPVU5EX0VSUk9SPTEKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorZmkKKworaWYgWyAkRk9VTkRfRVJST1IgIC1ndCAwIF07IHRoZW4KKyAgZXhpdCAxCitlbHNlCisgIGVjaG8gLWUgIiR7R1JFRU59QWxsIHNvdXJjZSBjb2RlIGluIFBSIHByb3Blcmx5IGZvcm1hdHRlZC4ke05DfSIKKyAgZXhpdCAwCitmaQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9jaGVja19jb21taXRfbWVzc2FnZV9mb3JtYXQuc2ggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2NoZWNrX2NvbW1pdF9tZXNzYWdlX2Zvcm1hdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YjdjM2NlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9jaGVja19jb21taXRfbWVzc2FnZV9mb3JtYXQuc2gKQEAgLTAsMCArMSwxMTEgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoYykgMjAxOCBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVuYXJHLCBJbmMuCisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQ2hlY2tzIGNvbW1pdCBtZXNzYWdlcyBhZ2FpbnN0IHByb2plY3Qgc3RhbmRhcmRzIGluIENPTlRSSUJVVElORy5tZCBkb2N1bWVudAorIyBTY3JpcHQgdG8gZGV0ZXJtaW5lIGlmIGNvbW1pdCBtZXNzYWdlcyBpbiBQdWxsIFJlcXVlc3QgYXJlIHByb3Blcmx5IGZvcm1hdHRlZC4KKyMgRXhpdHMgd2l0aCBub24gMCBleGl0IGNvZGUgaWYgcmVmb3JtYXR0aW5nIGlzIG5lZWRlZC4KKworIyBEaXNhYmxlIHN1YnNoZWxscworc2hvcHQgLXMgbGFzdHBpcGUKKworUkVEPSdcMDMzWzA7MzFtJworR1JFRU49J1wwMzNbMDszMm0nCitOQz0nXDAzM1swbScgIyBObyBDb2xvcgorCisjIFRSQVZJU19DT01NSVRfUkFOR0UgY29udGFpbnMgcmFuZ2Ugb2YgY29tbWl0cyBmb3IgdGhpcyBQUgorCisjIEdldCB1c2VyLXN1cHBsaWVkIGNvbW1pdCBtZXNzYWdlIHRleHQgZm9yIGFwcGxpY2FibGUgY29tbWl0cyBhbmQgaW5zZXJ0CisjIGEgdW5pcXVlIHNlcGFyYXRvciBzdHJpbmcgaWRlbnRpZmllci4gVGhlIGdpdCBjb21tYW5kIHJldHVybnMgT05MWSB0aGUKKyMgc3ViamVjdCBsaW5lIGFuZCBib2R5IGZvciBlYWNoIG9mIHRoZSBjb21taXRzLgorVFJBVklTX0NPTU1JVF9SQU5HRT0iJHtUUkFWSVNfQ09NTUlUX1JBTkdFLy4uLi8uLn0iCitDT01NSVRfVEVYVD0kKGdpdCBsb2cgJHtUUkFWSVNfQ09NTUlUX1JBTkdFfSAtLXByZXR0eT1mb3JtYXQ6IlhYWE5FV0xJTkVYWFgiJW4lQikKKworIyBCYWlsIGlmIHRoZXJlIGFyZSBub25lCitpZiBbIC16ICIke0NPTU1JVF9URVhUfSIgXTsgdGhlbgorICBlY2hvIC1lICIke0dSRUVOfU5vIGNvbW1pdCBtZXNzZ2FnZXMgdG8gY2hlY2sgZm9yIGZvcm1hdHRpbmcuJHtOQ30iCisgIGV4aXQgMAorZWxpZiAhIGVjaG8gJFRSQVZJU19DT01NSVRfUkFOR0UgfCBncmVwIC1xICJcLlwuXC4iOyB0aGVuCisgIGVjaG8gLWUgIiR7R1JFRU59Tm8gY29tbWl0IG1lc3NnYWdlcyB0byBjaGVjayBmb3IgZm9ybWF0dGluZy4ke05DfSIKKyAgZXhpdCAwCitmaQorCisjIFByb2Nlc3MgY29tbWl0IG1lc3NhZ2VzCitzdWNjZXNzPTEKK2N1cnJlbnRfbGluZT0wCitwcmV2bGluZT0iIgorCisjIFByb2Nlc3MgZWFjaCBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZSBvdXRwdXQsIHJlc2V0dGluZyBjb3VudGVyIG9uIHNlcGFyYXRvcgorcHJpbnRmICVzICIkQ09NTUlUX1RFWFQiIHwgd2hpbGUgSUZTPScnIHJlYWQgLXIgbGluZTsgZG8KKyAgIyBlY2hvICJDb3VudCA9ICRjdXJyZW50X2xpbmUgPExpbmU+ID0gJGxpbmUiCisgIGN1cnJlbnRfbGluZT0kKChjdXJyZW50X2xpbmUrMSkpCisgIGlmIFsgIiRsaW5lIiA9ICJYWFhORVdMSU5FWFhYIiBdOyB0aGVuCisgICAgY3VycmVudF9saW5lPTAKKyAgZmkKKyAgY2hhcnM9JHsjbGluZX0KKyAgaWYgWyAkY3VycmVudF9saW5lIC1lcSAxIF07IHRoZW4KKyAgICAjIFN1YmplY3QgbGluZSBzaG91bGQgYmUgNjQgY2hhcnMgb3IgbGVzcworICAgIGlmIFsgJGNoYXJzIC1ndCA2NCBdOyB0aGVuCisgICAgICBlY2hvICJUaGUgZm9sbG93aW5nIHN1YmplY3QgbGluZSBleGNlZWRzIDY0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLiIKKyAgICAgIGVjaG8gIiAgICAgJyRsaW5lJyIKKyAgICAgIHN1Y2Nlc3M9MAorICAgIGZpCisgICAgaT0kKCgkY2hhcnMtMSkpCisgICAgbGFzdF9jaGFyPSR7bGluZTokaToxfQorICAgICMgT3V0cHV0IGVycm9yIGlmIGxhc3QgY2hhciBvZiBzdWJqZWN0IGxpbmUgaXMgbm90IGFscGhhLW51bWVyaWMKKyAgICBpZiBbWyAkbGFzdF9jaGFyID1+IFsuLF0gXV07IHRoZW4KKyAgICAgIGVjaG8gIkZvciB0aGUgZm9sbG93aW5nIGNvbW1pdCwgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdWJqZWN0IGxpbmUgbXVzdCBub3QgYmUgYSBwZXJpb2Qgb3IgY29tbWEuIgorICAgICAgZWNobyAiICAgICAnJGxpbmUnIgorICAgICAgc3VjY2Vzcz0wCisgICAgZmkKKyAgICAjIENoZWNraW5nIGlmIHN1YmplY3QgbGluZSBkb2Vzbid0IHN0YXJ0IHdpdGggJ21vZHVsZTogJworICAgIHByZWZpeD0kKGVjaG8gJGxpbmUgfCBjdXQgLWYxIC1kICIgIikKKyAgICBpZiBbICIke3ByZWZpeDogLTF9IiAhPSAiOiIgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIGZvbGxvd2luZyBzdWJqZWN0IGxpbmUgbXVzdCBzdGFydCB3aXRoIGEgc2luZ2xlIHdvcmQgc3BlY2lmeWluZyB0aGUgZnVuY3Rpb25hbCBhcmVhIG9mIHRoZSBjaGFuZ2UsIGZvbGxvd2VkIGJ5IGEgY29sb24gYW5kIHNwYWNlLiBJLmUuLCAnbGF5ZXJzOiBTdWJqZWN0IGxpbmUgaGVyZSciCisgICAgICBlY2hvICIgICAgICckbGluZSciCisgICAgICBzdWNjZXNzPTAKKyAgICBmaQorICAgICMgQ2hlY2sgaWYgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBjb2xvbiBpcyBsb3dlci1jYXNlCisgICAgc3ViamVjdD0kKGVjaG8gJGxpbmUgfCBjdXQgLWYyIC1kICIgIikKKyAgICBmaXJzdGNoYXI9JChlY2hvICR7c3ViamVjdH0gfCBjdXQgLWMgMSkKKyAgICBpZiBbWyAiJHtmaXJzdGNoYXJ9IiA9fiBbYS16XSBdXTsgdGhlbgorICAgICAgZWNobyAiVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHN1YmplY3QgbGluZSBhZnRlciB0aGUgJzonIGNoYXJhY3RlciBtdXN0IGJlIGNhcGl0YWxpemVkLiIKKyAgICAgIGVjaG8gIiAgICAgJyRsaW5lJyIKKyAgICAgIHN1Y2Nlc3M9MAorICAgIGZpCisgIGVsaWYgWyAkY3VycmVudF9saW5lIC1lcSAyIF07IHRoZW4KKyAgICAjIENvbW1pdCBtZXNzYWdlIG11c3QgaGF2ZSBhIGJsYW5rIGxpbmUgYmV0d2VlbiBzdWJqZWN0IGFuZCBib2R5CisgICAgaWYgWyAkY2hhcnMgLW5lIDAgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIGZvbGxvd2luZyBzdWJqZWN0IGxpbmUgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUuIgorICAgICAgZWNobyAiICAgICAnJHByZXZsaW5lJyIKKyAgICAgIHN1Y2Nlc3M9MAorICAgIGZpCisgIGVsc2UKKyAgICAjIExpbmVzIGluIGEgY29tbWl0IG1lc3NhZ2UgYm9keSBtdXN0IGJlIGxlc3MgdGhhbiA3MiBjaGFyYWN0ZXJzIGluIGxlbmd0aCAoYnV0IGdpdmUgc29tZSBzbGFjaykKKyAgICBpZiBbICRjaGFycyAtZ3QgNzYgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIGZvbGxvd2luZyBjb21taXQgbWVzc2FnZSBib2R5IGxpbmUgZXhjZWVkcyB0aGUgNzIgY2hhcmFjdGVyIGxpbWl0LiIKKyAgICAgIGVjaG8gIickbGluZVwnIgorICAgICAgc3VjY2Vzcz0wCisgICAgZmkKKyAgZmkKKyAgcHJldmxpbmU9JGxpbmUKK2RvbmUKKworaWYgWyAkc3VjY2VzcyAtZXEgMSBdOyB0aGVuCisgIGVjaG8gLWUgIiR7R1JFRU59QWxsIGNvbW1pdCBtZXNzYWdlcyBpbiBwdWxsIHJlcXVlc3QgYXJlIHByb3Blcmx5IGZvcm1hdHRlZC4ke05DfSIKKyAgZXhpdCAwCitlbHNlCisgIGV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvY21ha2UtZm9ybWF0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9jbWFrZS1mb3JtYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkMmY5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvY21ha2UtZm9ybWF0LnB5CkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgY21ha2UtZm9ybWF0ICh2MC40LjEsIGNpcmNhIEp1bCAyMDE4KQorIyBodHRwczovL2dpdGh1Yi5jb20vY2hlc2hpcmVrb3cvY21ha2VfZm9ybWF0CisKKyMgSG93IHdpZGUgdG8gYWxsb3cgZm9ybWF0dGVkIGNtYWtlIGZpbGVzCitsaW5lX3dpZHRoID0gMTMyCisKKyMgSG93IG1hbnkgc3BhY2VzIHRvIHRhYiBmb3IgaW5kZW50Cit0YWJfc2l6ZSA9IDQKKworIyBJZiBhcmdsaXN0cyBhcmUgbG9uZ2VyIHRoYW4gdGhpcywgYnJlYWsgdGhlbSBhbHdheXMKK21heF9zdWJhcmdzX3Blcl9saW5lID0gMworCisjIElmIHRydWUsIHNlcGFyYXRlIGZsb3cgY29udHJvbCBuYW1lcyBmcm9tIHRoZWlyIHBhcmVudGhlc2VzIHdpdGggYSBzcGFjZQorc2VwYXJhdGVfY3RybF9uYW1lX3dpdGhfc3BhY2UgPSBGYWxzZQorCisjIElmIHRydWUsIHNlcGFyYXRlIGZ1bmN0aW9uIG5hbWVzIGZyb20gcGFyZW50aGVzZXMgd2l0aCBhIHNwYWNlCitzZXBhcmF0ZV9mbl9uYW1lX3dpdGhfc3BhY2UgPSBGYWxzZQorCisjIElmIGEgc3RhdGVtZW50IGlzIHdyYXBwZWQgdG8gbW9yZSB0aGFuIG9uZSBsaW5lLCB0aGFuIGRhbmdsZSB0aGUgY2xvc2luZworIyBwYXJlbnRoZXNpcyBvbiBpdCdzIG93biBsaW5lCitkYW5nbGVfcGFyZW5zID0gRmFsc2UKKworIyBXaGF0IGNoYXJhY3RlciB0byB1c2UgZm9yIGJ1bGxldGVkIGxpc3RzCitidWxsZXRfY2hhciA9IHUnKicKKworIyBXaGF0IGNoYXJhY3RlciB0byB1c2UgYXMgcHVuY3R1YXRpb24gYWZ0ZXIgbnVtZXJhbHMgaW4gYW4gZW51bWVyYXRlZCBsaXN0CitlbnVtX2NoYXIgPSB1Jy4nCisKKyMgV2hhdCBzdHlsZSBsaW5lIGVuZGluZ3MgdG8gdXNlIGluIHRoZSBvdXRwdXQuCitsaW5lX2VuZGluZyA9IHUndW5peCcKKworIyBGb3JtYXQgY29tbWFuZCBuYW1lcyBjb25zaXN0ZW50bHkgYXMgJ2xvd2VyJyBvciAndXBwZXInIGNhc2UKK2NvbW1hbmRfY2FzZSA9IHUnbG93ZXInCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvY29tbWFuZF9jb3VudGVyX2dlbmVyYXRvci5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvY29tbWFuZF9jb3VudGVyX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWRiNTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9jb21tYW5kX2NvdW50ZXJfZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMjEwIEBACisjIS91c3IvYmluL3B5dGhvbjMgLWkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE5ICAgICAgSW50ZWwgY29wb3JhdGlvbgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyMgQXV0aG9yOiBMaW9uZWwgTGFuZHdlcmxpbiA8bGlvbmVsLmcubGFuZHdlcmxpbkBpbnRlbC5jb20+CisKK2ltcG9ydCBvcyxyZSxzeXMKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgZXRyZWUKK2Zyb20gZ2VuZXJhdG9yIGltcG9ydCAqCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCitmcm9tIGNvbW1vbl9jb2RlZ2VuIGltcG9ydCAqCisKKyMKKyMgQ29tbWFuZENvdW50ZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zIC0gc3ViY2xhc3Mgb2YgR2VuZXJhdG9yT3B0aW9ucy4KK2NsYXNzIENvbW1hbmRDb3VudGVyT3V0cHV0R2VuZXJhdG9yT3B0aW9ucyhHZW5lcmF0b3JPcHRpb25zKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgY29udmVudGlvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9ICcuJywKKyAgICAgICAgICAgICAgICAgYXBpbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBOb25lLAorICAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHNvcnRQcm9jZWR1cmUgPSByZWdTb3J0RmVhdHVyZXMsCisgICAgICAgICAgICAgICAgIHByZWZpeFRleHQgPSAiIiwKKyAgICAgICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgYXBpY2FsbCA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeSA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeXAgPSAnJywKKyAgICAgICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgbHZ0X2ZpbGVfdHlwZSA9ICcnKToKKyAgICAgICAgR2VuZXJhdG9yT3B0aW9ucy5fX2luaXRfXyhzZWxmLCBjb252ZW50aW9ucywgZmlsZW5hbWUsIGRpcmVjdG9yeSwgYXBpbmFtZSwgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucywgZW1pdHZlcnNpb25zLCBkZWZhdWx0RXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zLCByZW1vdmVFeHRlbnNpb25zLCBlbWl0RXh0ZW5zaW9ucywgc29ydFByb2NlZHVyZSkKKyAgICAgICAgc2VsZi5wcmVmaXhUZXh0ICAgICAgPSBwcmVmaXhUZXh0CisgICAgICAgIHNlbGYuZ2VuRnVuY1BvaW50ZXJzID0gZ2VuRnVuY1BvaW50ZXJzCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gTm9uZQorICAgICAgICBzZWxmLmFwaWNhbGwgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgPSBhcGllbnRyeQorICAgICAgICBzZWxmLmFwaWVudHJ5cCAgICAgICA9IGFwaWVudHJ5cAorICAgICAgICBzZWxmLmFsaWduRnVuY1BhcmFtICA9IGFsaWduRnVuY1BhcmFtCisgICAgICAgIHNlbGYubHZ0X2ZpbGVfdHlwZSAgID0gbHZ0X2ZpbGVfdHlwZQorIworIyBDb21tYW5kQ291bnRlck91dHB1dEdlbmVyYXRvciAtIHN1YmNsYXNzIG9mIE91dHB1dEdlbmVyYXRvci4KKyMgR2VuZXJhdGVzIGZpbGVzIG5lZWRlZCBieSB0aGUgbGF5ZXIgdmFsaWRhdGlvbiBzdGF0ZSB0cmFja2VyCitjbGFzcyBDb21tYW5kQ291bnRlck91dHB1dEdlbmVyYXRvcihPdXRwdXRHZW5lcmF0b3IpOgorICAgICIiIkdlbmVyYXRlIGNvbW1hbmQgY291bnRlciBpbiBWa0NvbW1hbmRCdWZmZXIgYmFzZWQgb24gWE1MIGVsZW1lbnQgYXR0cmlidXRlcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBlcnJGaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgd2FybkZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICBkaWFnRmlsZSA9IHN5cy5zdGRvdXQpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuX19pbml0X18oc2VsZiwgZXJyRmlsZSwgd2FybkZpbGUsIGRpYWdGaWxlKQorICAgICAgICAjIEludGVybmFsIHN0YXRlIC0gYWNjdW11bGF0b3JzIGZvciBkaWZmZXJlbnQgaW5uZXIgYmxvY2sgdGV4dAorICAgICAgICBzZWxmLmRpc3BhdGNoX2xpc3QgPSBbXSAgICAgICAgICAgICAgICMgTGlzdCBvZiBlbnRyaWVzIGZvciBkaXNwYXRjaCBsaXN0CisgICAgIworICAgICMgQ2FsbGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bgorICAgIGRlZiBiZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cykKKworICAgICAgICAjIEluaXRpYWxpemUgbWVtYmVycyB0aGF0IHJlcXVpcmUgdGhlIHRyZWUKKyAgICAgICAgc2VsZi5oYW5kbGVfdHlwZXMgPSBHZXRIYW5kbGVUeXBlcyhzZWxmLnJlZ2lzdHJ5LnRyZWUpCisgICAgICAgIHNlbGYubHZ0X2ZpbGVfdHlwZSA9IGdlbk9wdHMubHZ0X2ZpbGVfdHlwZQorCisgICAgICAgIGlmIGdlbk9wdHMubHZ0X2ZpbGVfdHlwZSA9PSAnZnVuY3Rpb25fcG9pbnRlcl9oZWFkZXInOgorICAgICAgICAgICAgd3JpdGUoIiNwcmFnbWEgb25jZSIsIGZpbGU9c2VsZi5vdXRGaWxlKQorCisgICAgICAgICMgVXNlci1zdXBwbGllZCBwcmVmaXggdGV4dCwgaWYgYW55IChsaXN0IG9mIHN0cmluZ3MpCisgICAgICAgIGlmIChnZW5PcHRzLnByZWZpeFRleHQpOgorICAgICAgICAgICAgZm9yIHMgaW4gZ2VuT3B0cy5wcmVmaXhUZXh0OgorICAgICAgICAgICAgICAgIHdyaXRlKHMsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAjIEZpbGUgQ29tbWVudAorICAgICAgICBmaWxlX2NvbW1lbnQgPSAnLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKipcbicKKyAgICAgICAgZmlsZV9jb21tZW50ICs9ICcvLyBTZWUgY29tbWFuZF9jb3VudGVyX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9uc1xuJworICAgICAgICB3cml0ZShmaWxlX2NvbW1lbnQsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAjIENvcHlyaWdodCBOb3RpY2UKKyAgICAgICAgY29weXJpZ2h0ID0gICcvKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvblxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxOSAgICAgIEludGVsIENvcnBvcmF0aW9uXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTtcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUyxcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IExpb25lbCBMYW5kd2VybGluIDxsaW9uZWwuZy5sYW5kd2VybGluQGludGVsLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKi9cbicKKyAgICAgICAgd3JpdGUoY29weXJpZ2h0LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAjCisgICAgIyBXcml0ZSBjb21wbGV0ZWQgc291cmNlIGNvZGUgdG8gb3V0cHV0IGZpbGUKKyAgICBkZWYgZW5kRmlsZShzZWxmKToKKyAgICAgICAgZGVzdF9maWxlID0gJycKKyAgICAgICAgZGVzdF9maWxlICs9IHNlbGYuT3V0cHV0RGVzdEZpbGUoKQorICAgICAgICAjIFJlbW92ZSBibGFuayBsaW5lcyBhdCBFT0YKKyAgICAgICAgaWYgZGVzdF9maWxlLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgZGVzdF9maWxlID0gZGVzdF9maWxlWzotMV0KKyAgICAgICAgd3JpdGUoZGVzdF9maWxlLCBmaWxlPXNlbGYub3V0RmlsZSk7CisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorICAgICMKKyAgICAjIFByb2Nlc3NpbmcgYXQgYmVnaW5uaW5nIG9mIGVhY2ggZmVhdHVyZSBvciBleHRlbnNpb24KKyAgICBkZWYgYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KQorICAgICAgICBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgPSBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpCisKKyAgICAjCisgICAgIyBQcm9jZXNzIGNvbW1hbmRzLCBhZGRpbmcgdG8gZGlzcGF0Y2ggbGlzdAorICAgIGRlZiBnZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuQ21kKHNlbGYsIGNtZGluZm8sIG5hbWUsIGFsaWFzKQorICAgICAgICAjIEdldCBmaXJzdCBwYXJhbSB0eXBlCisgICAgICAgIHBhcmFtcyA9IGNtZGluZm8uZWxlbS5maW5kYWxsKCdwYXJhbScpCisgICAgICAgIGluZm8gPSBzZWxmLmdldFR5cGVOYW1lVHVwbGUocGFyYW1zWzBdKQorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ3ZrQ21kJykgYW5kIGluZm9bMF0gPT0gJ1ZrQ29tbWFuZEJ1ZmZlcic6CisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoX2xpc3QuYXBwZW5kKChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsIG5hbWUsIGNtZGluZm8pKQorCisgICAgIworICAgICMgUmV0cmlldmUgdGhlIHR5cGUgYW5kIG5hbWUgZm9yIGEgcGFyYW1ldGVyCisgICAgZGVmIGdldFR5cGVOYW1lVHVwbGUoc2VsZiwgcGFyYW0pOgorICAgICAgICB0eXBlID0gJycKKyAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gJ3R5cGUnOgorICAgICAgICAgICAgICAgIHR5cGUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgICAgIGVsaWYgZWxlbS50YWcgPT0gJ25hbWUnOgorICAgICAgICAgICAgICAgIG5hbWUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgcmV0dXJuICh0eXBlLCBuYW1lKQorCisgICAgIworICAgICMgQ3JlYXRlIHRoZSB0ZXN0IGZ1bmN0aW9uIHBvaW50ZXIgc291cmNlIGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcKKyAgICBkZWYgR2VuZXJhdGVGdW5jdGlvblBvaW50ZXJTb3VyY2Uoc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBbXQorICAgICAgICBlbnRyaWVzID0gc2VsZi5kaXNwYXRjaF9saXN0CisKKyAgICAgICAgdGFibGUgPSAnI2luY2x1ZGUgImNoYXNzaXMuaCJcbicKKyAgICAgICAgdGFibGUgKz0gJyNpbmNsdWRlICJzdGF0ZV90cmFja2VyLmgiXG4nCisgICAgICAgIHRhYmxlICs9ICcjaW5jbHVkZSAiY29tbWFuZF9jb3VudGVyLmgiXG4nCisgICAgICAgIHRhYmxlICs9ICdcbicKKworICAgICAgICBmb3IgaXRlbSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgIyBSZW1vdmUgJ3ZrJyBmcm9tIHByb3RvIG5hbWUKKyAgICAgICAgICAgIGJhc2VfbmFtZSA9IGl0ZW1bMV1bMjpdCisKKyAgICAgICAgICAgIGlmIGl0ZW1bMF0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdGFibGUgKz0gJyNpZmRlZiAlc1xuJyAlIGl0ZW1bMF0KKyAgICAgICAgICAgIHBhcmFtcyA9IGl0ZW1bMl0uZWxlbS5maW5kYWxsKCdwYXJhbScpCisgICAgICAgICAgICBwYXJhbXN0ZXh0ID0gJywgJy5qb2luKFsnJy5qb2luKHBhcmFtLml0ZXJ0ZXh0KCkpIGZvciBwYXJhbSBpbiBwYXJhbXNdKQorICAgICAgICAgICAgdGFibGUgKz0gJ3ZvaWQgQ29tbWFuZENvdW50ZXI6OlByZUNhbGxSZWNvcmQlcyglcykge1xuJyAlIChiYXNlX25hbWUsIHBhcmFtc3RleHQpCisgICAgICAgICAgICB0YWJsZSArPSAnICAgIGNvcmVDaGVja3MtPkluY3JlbWVudENvbW1hbmRDb3VudCglcyk7XG4nICUgcGFyYW1zWzBdLmZpbmRhbGwoJ25hbWUnKVswXS50ZXh0CisgICAgICAgICAgICB0YWJsZSArPSAnfVxuJworICAgICAgICAgICAgaWYgaXRlbVswXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2VuZGlmIC8vICVzXG4nICUgaXRlbVswXQorICAgICAgICByZXR1cm4gdGFibGUKKyAgICAjCisgICAgIyBDcmVhdGUgdGhlIHRlc3QgZnVuY3Rpb24gcG9pbnRlciBzb3VyY2UgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZworICAgIGRlZiBHZW5lcmF0ZUZ1bmN0aW9uUG9pbnRlckhlYWRlcihzZWxmKToKKyAgICAgICAgZW50cmllcyA9IFtdCisgICAgICAgIHRhYmxlID0gJycKKyAgICAgICAgZW50cmllcyA9IHNlbGYuZGlzcGF0Y2hfbGlzdAorCisgICAgICAgIGZvciBpdGVtIGluIGVudHJpZXM6CisgICAgICAgICAgICAjIFJlbW92ZSAndmsnIGZyb20gcHJvdG8gbmFtZQorICAgICAgICAgICAgYmFzZV9uYW1lID0gaXRlbVsxXVsyOl0KKworICAgICAgICAgICAgaWYgaXRlbVswXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgaXRlbVswXQorICAgICAgICAgICAgcGFyYW1zID0gaXRlbVsyXS5lbGVtLmZpbmRhbGwoJ3BhcmFtJykKKyAgICAgICAgICAgIHBhcmFtc3RleHQgPSAnLCAnLmpvaW4oWycnLmpvaW4ocGFyYW0uaXRlcnRleHQoKSkgZm9yIHBhcmFtIGluIHBhcmFtc10pCisgICAgICAgICAgICB0YWJsZSArPSAndm9pZCBQcmVDYWxsUmVjb3JkJXMoJXMpO1xuJyAlIChiYXNlX25hbWUsIHBhcmFtc3RleHQpCisgICAgICAgICAgICBpZiBpdGVtWzBdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBpdGVtWzBdCisgICAgICAgIHJldHVybiB0YWJsZQorCisgICAgIyBDcmVhdGUgYSBoZWxwZXIgZmlsZSBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nCisgICAgZGVmIE91dHB1dERlc3RGaWxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmx2dF9maWxlX3R5cGUgPT0gJ2Z1bmN0aW9uX3BvaW50ZXJfaGVhZGVyJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkdlbmVyYXRlRnVuY3Rpb25Qb2ludGVySGVhZGVyKCkKKyAgICAgICAgZWxpZiBzZWxmLmx2dF9maWxlX3R5cGUgPT0gJ2Z1bmN0aW9uX3BvaW50ZXJfc291cmNlJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkdlbmVyYXRlRnVuY3Rpb25Qb2ludGVyU291cmNlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnQmFkIExWVCBGaWxlIEdlbmVyYXRvciBPcHRpb24gJXMnICUgc2VsZi5sdnRfZmlsZV90eXBlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2NvbW1vbl9jb2RlZ2VuLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9jb21tb25fY29kZWdlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTA1ZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9jb21tb25fY29kZWdlbi5weQpAQCAtMCwwICsxLDEzOCBAQAorIyEvdXNyL2Jpbi9weXRob24zIC1pCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIDIwMTkgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorCitpbXBvcnQgb3MscmUsc3lzLHN0cmluZworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBldHJlZQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZSwgT3JkZXJlZERpY3QKKworIyBDb3B5cmlnaHQgdGV4dCBwcmVmaXhpbmcgYWxsIGhlYWRlcnMgKGxpc3Qgb2Ygc3RyaW5ncykuCitwcmVmaXhTdHJpbmdzID0gWworICAgICcvKicsCisgICAgJyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4nLAorICAgICcqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbicsCisgICAgJyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IEx1bmFyRywgSW5jLicsCisgICAgJyoqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCAyMDE5IEdvb2dsZSBJbmMuJywKKyAgICAnKionLAorICAgICcqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsnLAorICAgICcqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuJywKKyAgICAnKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JywKKyAgICAnKionLAorICAgICcqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJywKKyAgICAnKionLAorICAgICcqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlJywKKyAgICAnKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywnLAorICAgICcqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4nLAorICAgICcqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kJywKKyAgICAnKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuJywKKyAgICAnKi8nLAorICAgICcnCitdCisKKworcGxhdGZvcm1fZGljdCA9IHsKKyAgICAnYW5kcm9pZCcgOiAnVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSJywKKyAgICAnZnVjaHNpYScgOiAnVktfVVNFX1BMQVRGT1JNX0ZVQ0hTSUEnLAorICAgICdnZ3AnOiAnVktfVVNFX1BMQVRGT1JNX0dHUCcsCisgICAgJ2lvcycgOiAnVktfVVNFX1BMQVRGT1JNX0lPU19NVksnLAorICAgICdtYWNvcycgOiAnVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSycsCisgICAgJ21ldGFsJyA6ICdWS19VU0VfUExBVEZPUk1fTUVUQUxfRVhUJywKKyAgICAndmknIDogJ1ZLX1VTRV9QTEFURk9STV9WSV9OTicsCisgICAgJ3dheWxhbmQnIDogJ1ZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUicsCisgICAgJ3dpbjMyJyA6ICdWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSJywKKyAgICAneGNiJyA6ICdWS19VU0VfUExBVEZPUk1fWENCX0tIUicsCisgICAgJ3hsaWInIDogJ1ZLX1VTRV9QTEFURk9STV9YTElCX0tIUicsCisgICAgJ3hsaWJfeHJhbmRyJyA6ICdWS19VU0VfUExBVEZPUk1fWExJQl9YUkFORFJfRVhUJywKK30KKworIworIyBSZXR1cm4gYXBwcm9wcmlhdGUgZmVhdHVyZSBwcm90ZWN0IHN0cmluZyBmcm9tICdwbGF0Zm9ybScgdGFnIG9uIGZlYXR1cmUKK2RlZiBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpOgorICAgICIiIkdldCBwbGF0Zm9ybSBwcm90ZWN0aW9uIHN0cmluZyIiIgorICAgIHBsYXRmb3JtID0gaW50ZXJmYWNlLmdldCgncGxhdGZvcm0nKQorICAgIHByb3RlY3QgPSBOb25lCisgICAgaWYgcGxhdGZvcm0gaXMgbm90IE5vbmU6CisgICAgICAgIHByb3RlY3QgPSBwbGF0Zm9ybV9kaWN0W3BsYXRmb3JtXQorICAgIHJldHVybiBwcm90ZWN0CisKKyMgUmV0dXJuIGEgZGljdCBjb250YWluaW5nIHRoZSBkaXNwYXRjaGFibGUvbm9uLWRpc3BhdGNoYWJsZSB0eXBlIG9mIGV2ZXJ5IGhhbmRsZQorZGVmIEdldEhhbmRsZVR5cGVzKHRyZWUpOgorICAgICMgRXh0ZW5kIE9yZGVyZWREaWN0IHdpdGggY29tbW9uIGhhbmRsZSBvcGVyYXRpb25zCisgICAgY2xhc3MgSGFuZGxlRGljdChPcmRlcmVkRGljdCk6CisgICAgICAgIGRlZiBJc0Rpc3BhdGNoYWJsZShzZWxmLCBoYW5kbGVfdHlwZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXQoaGFuZGxlX3R5cGUpID09ICdWS19ERUZJTkVfSEFORExFJworICAgICAgICBkZWYgSXNOb25EaXNwYXRjaGFibGUoc2VsZiwgaGFuZGxlX3R5cGUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KGhhbmRsZV90eXBlKSA9PSAnVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFJworCisgICAgaGFuZGxlcyA9IEhhbmRsZURpY3QoKQorICAgIGZvciBlbGVtIGluIHRyZWUuZmluZGFsbCgidHlwZXMvdHlwZS9bQGNhdGVnb3J5PSdoYW5kbGUnXSIpOgorICAgICAgICBpZiBub3QgZWxlbS5nZXQoJ2FsaWFzJyk6CisgICAgICAgICAgICBuYW1lID0gZWxlbS5nZXQoJ25hbWUnKQorICAgICAgICAgICAgaGFuZGxlc1tuYW1lXSA9IGVsZW0uZmluZCgndHlwZScpLnRleHQKKyAgICByZXR1cm4gaGFuZGxlcworCisjIFJldHVybiBhIGRpY3QgY29udGFpbmluZyB0aGUgcGFyZW50IG9mIGV2ZXJ5IGhhbmRsZQorZGVmIEdldEhhbmRsZVBhcmVudHModHJlZSk6CisgICAgIyBFeHRlbmQgT3JkZXJlZERpY3Qgd2l0aCBjb21tb24gaGFuZGxlIG9wZXJhdGlvbnMKKyAgICBjbGFzcyBIYW5kbGVQYXJlbnREaWN0KE9yZGVyZWREaWN0KToKKyAgICAgICAgZGVmIElzUGFyZW50RGV2aWNlKHNlbGYsIGhhbmRsZV90eXBlKToKKyAgICAgICAgICAgIG5leHRfb2JqZWN0ID0gc2VsZi5nZXQoaGFuZGxlX3R5cGUpCisgICAgICAgICAgICB3aGlsZSBuZXh0X29iamVjdCAhPSAnVmtEZXZpY2UnIGFuZCBuZXh0X29iamVjdCAhPSAnVmtJbnN0YW5jZScgYW5kIG5leHRfb2JqZWN0ICE9ICdWa1BoeXNpY2FsRGV2aWNlJyBhbmQgbmV4dF9vYmplY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbmV4dF9vYmplY3QgPSBzZWxmLmdldChuZXh0X29iamVjdCkKKyAgICAgICAgICAgIHJldHVybiBuZXh0X29iamVjdCA9PSAnVmtEZXZpY2UnCisgICAgICAgIGRlZiBHZXRIYW5kbGVQYXJlbnQoc2VsZiwgaGFuZGxlX3R5cGUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KGhhbmRsZV90eXBlKQorCisgICAgaGFuZGxlX3BhcmVudHMgPSBIYW5kbGVQYXJlbnREaWN0KCkKKyAgICBmb3IgZWxlbSBpbiB0cmVlLmZpbmRhbGwoInR5cGVzL3R5cGUvW0BjYXRlZ29yeT0naGFuZGxlJ10iKToKKyAgICAgICAgaWYgbm90IGVsZW0uZ2V0KCdhbGlhcycpIG9yIG5vdCBlbGVtLmdldCgncGFyZW50Jyk6CisgICAgICAgICAgICBuYW1lID0gZWxlbS5nZXQoJ25hbWUnKQorICAgICAgICAgICAgaGFuZGxlX3BhcmVudHNbbmFtZV0gPSBlbGVtLmdldCgncGFyZW50JykKKyAgICByZXR1cm4gaGFuZGxlX3BhcmVudHMKKworIyBSZXR1cm4gYSBkaWN0IGNvbnRhaW5pbmcgdGhlIGNhdGVnb3J5IGF0dHJpYnV0ZSBvZiBldmVyeSB0eXBlCitkZWYgR2V0VHlwZUNhdGVnb3JpZXModHJlZSk6CisgICAgdHlwZV9jYXRlZ29yaWVzID0gT3JkZXJlZERpY3QoKQorICAgIGZvciBlbGVtIGluIHRyZWUuZmluZGFsbCgidHlwZXMvdHlwZSIpOgorICAgICAgICBpZiBub3QgZWxlbS5nZXQoJ2FsaWFzJyk6CisgICAgICAgICAgICAjIG5hbWUgaXMgZWl0aGVyIGFuIGF0dHJpYnV0ZSBvciB0aGUgdGV4dCBvZiBhIGNoaWxkIDxuYW1lPiB0YWcKKyAgICAgICAgICAgIG5hbWUgPSBlbGVtLmdldCgnbmFtZScpIG9yIChlbGVtLmZpbmQoIm5hbWUiKSBhbmQgZWxlbS5maW5kKCduYW1lJykudGV4dCkKKyAgICAgICAgICAgIHR5cGVfY2F0ZWdvcmllc1tuYW1lXSA9IGVsZW0uZ2V0KCdjYXRlZ29yeScpCisgICAgcmV0dXJuIHR5cGVfY2F0ZWdvcmllcworCisjIFRyZWF0cyBvdXRkZW50cyBhIG11bHRpbGluZSBzdHJpbmcgYnkgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiB0aGUgZmlyc3QgbGluZQorIyBPcHRpb25hbGx5IGluZGVudGluZyBieSB0aGUgZ2l2ZW4gcHJlZml4CitkZWYgT3V0ZGVudChzdHJpbmdfaW4sIGluZGVudD0nJyk6CisgICAgc3RyaW5nX291dCA9IHJlLnN1YignXiAqJywgJycsIHN0cmluZ19pbikgIyBraWxsIHN0cmF5ICBsZWFkaW5nIHNwYWNlcworICAgIGlmIHN0cmluZ19vdXRbMF0gIT0gJ1xuJzoKKyAgICAgICAgcmV0dXJuIHN0cmluZ19pbiAjIG5lZWRzIG5ldyBsaW5lIHRvIGZpbmQgdGhlIGZpcnN0IGxpbmUncyBpbmRlbnQgbGV2ZWwKKworICAgIGZpcnN0X2luZGVudCA9IHN0cmluZ19vdXRbMTpdCisgICAgZmFrZV9pbmRlbnQgPSAnXG4nICsgJyAnICogKGxlbihmaXJzdF9pbmRlbnQpIC0gbGVuKGZpcnN0X2luZGVudC5sc3RyaXAoKSkpCisgICAgaW5kZW50ID0gJ1xuJyArIGluZGVudAorCisgICAgc3RyaW5nX291dCA9IHN0cmluZ19vdXQucnN0cmlwKCkgKyAnXG4nICMgcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZXhjZXB0IGZvciBhIG5ld2xpbmUKKyAgICBvdXRkZW50ID0gcmUuc3ViKGZha2VfaW5kZW50LCBpbmRlbnQsIHN0cmluZ19vdXQpCisgICAgcmV0dXJuIG91dGRlbnRbMTpdCisKKworIyBoZWxwZXIgdG8gZGVmaW5lIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QKK2RlZiByZXBvX3JlbGF0aXZlKHBhdGgpOgorICAgIHJldHVybiBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicsIHBhdGgpKQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2Rpc3BhdGNoX3RhYmxlX2hlbHBlcl9nZW5lcmF0b3IucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2Rpc3BhdGNoX3RhYmxlX2hlbHBlcl9nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmM2E0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvZGlzcGF0Y2hfdGFibGVfaGVscGVyX2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDI4OSBAQAorIyEvdXNyL2Jpbi9weXRob24zIC1pCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorCitpbXBvcnQgb3MscmUsc3lzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIGV0cmVlCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgKgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorZnJvbSBjb21tb25fY29kZWdlbiBpbXBvcnQgKgorCisjCisjIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zIC0gc3ViY2xhc3Mgb2YgR2VuZXJhdG9yT3B0aW9ucy4KK2NsYXNzIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zKEdlbmVyYXRvck9wdGlvbnMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBjb252ZW50aW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gJy4nLAorICAgICAgICAgICAgICAgICBhcGluYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZW1pdHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgc29ydFByb2NlZHVyZSA9IHJlZ1NvcnRGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgcHJlZml4VGV4dCA9ICIiLAorICAgICAgICAgICAgICAgICBnZW5GdW5jUG9pbnRlcnMgPSBUcnVlLAorICAgICAgICAgICAgICAgICBhcGljYWxsID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5ID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5cCA9ICcnLAorICAgICAgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgPSBUcnVlKToKKyAgICAgICAgR2VuZXJhdG9yT3B0aW9ucy5fX2luaXRfXyhzZWxmLCBjb252ZW50aW9ucywgZmlsZW5hbWUsIGRpcmVjdG9yeSwgYXBpbmFtZSwgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucywgZW1pdHZlcnNpb25zLCBkZWZhdWx0RXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zLCByZW1vdmVFeHRlbnNpb25zLCBlbWl0RXh0ZW5zaW9ucywgc29ydFByb2NlZHVyZSkKKyAgICAgICAgc2VsZi5wcmVmaXhUZXh0ICAgICAgPSBwcmVmaXhUZXh0CisgICAgICAgIHNlbGYuZ2VuRnVuY1BvaW50ZXJzID0gZ2VuRnVuY1BvaW50ZXJzCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gTm9uZQorICAgICAgICBzZWxmLmFwaWNhbGwgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgPSBhcGllbnRyeQorICAgICAgICBzZWxmLmFwaWVudHJ5cCAgICAgICA9IGFwaWVudHJ5cAorICAgICAgICBzZWxmLmFsaWduRnVuY1BhcmFtICA9IGFsaWduRnVuY1BhcmFtCisjCisjIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3IgLSBzdWJjbGFzcyBvZiBPdXRwdXRHZW5lcmF0b3IuCisjIEdlbmVyYXRlcyBkaXNwYXRjaCB0YWJsZSBoZWxwZXIgaGVhZGVyIGZpbGVzIGZvciBMVkwKK2NsYXNzIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3IoT3V0cHV0R2VuZXJhdG9yKToKKyAgICAiIiJHZW5lcmF0ZSBkaXNwYXRjaCB0YWJsZSBoZWxwZXIgaGVhZGVyIGJhc2VkIG9uIFhNTCBlbGVtZW50IGF0dHJpYnV0ZXMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgZXJyRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIHdhcm5GaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgZGlhZ0ZpbGUgPSBzeXMuc3Rkb3V0KToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkKKyAgICAgICAgIyBJbnRlcm5hbCBzdGF0ZSAtIGFjY3VtdWxhdG9ycyBmb3IgZGlmZmVyZW50IGlubmVyIGJsb2NrIHRleHQKKyAgICAgICAgc2VsZi5pbnN0YW5jZV9kaXNwYXRjaF9saXN0ID0gW10gICAgICAjIExpc3Qgb2YgZW50cmllcyBmb3IgaW5zdGFuY2UgZGlzcGF0Y2ggbGlzdAorICAgICAgICBzZWxmLmRldmljZV9kaXNwYXRjaF9saXN0ID0gW10gICAgICAgICMgTGlzdCBvZiBlbnRyaWVzIGZvciBkZXZpY2UgZGlzcGF0Y2ggbGlzdAorICAgICAgICBzZWxmLmRldl9leHRfc3R1Yl9saXN0ID0gW10gICAgICAgICAgICMgTGlzdCBvZiBzdHViIGZ1bmN0aW9ucyBmb3IgZGV2aWNlIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5kZXZpY2VfZXh0ZW5zaW9uX2xpc3QgPSBbXSAgICAgICAjIExpc3Qgb2YgZGV2aWNlIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5kZXZpY2Vfc3R1Yl9saXN0ID0gW10gICAgICAgICAgICAjIExpc3Qgb2YgZGV2aWNlIGZ1bmN0aW9ucyB3aXRoIHN0dWJzIChwcm9tb3RlZCBvciBleHRlbnNpb25zKQorICAgICAgICBzZWxmLmV4dGVuc2lvbl90eXBlID0gJycKKyAgICAjCisgICAgIyBDYWxsZWQgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnVuCisgICAgZGVmIGJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKQorICAgICAgICAKKyAgICAgICAgIyBJbml0aWFsaXplIG1lbWJlcnMgdGhhdCByZXF1aXJlIHRoZSB0cmVlCisgICAgICAgIHNlbGYuaGFuZGxlX3R5cGVzID0gR2V0SGFuZGxlVHlwZXMoc2VsZi5yZWdpc3RyeS50cmVlKQorCisgICAgICAgIHdyaXRlKCIjcHJhZ21hIG9uY2UiLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgIyBVc2VyLXN1cHBsaWVkIHByZWZpeCB0ZXh0LCBpZiBhbnkgKGxpc3Qgb2Ygc3RyaW5ncykKKyAgICAgICAgaWYgKGdlbk9wdHMucHJlZml4VGV4dCk6CisgICAgICAgICAgICBmb3IgcyBpbiBnZW5PcHRzLnByZWZpeFRleHQ6CisgICAgICAgICAgICAgICAgd3JpdGUocywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICMgRmlsZSBDb21tZW50CisgICAgICAgIGZpbGVfY29tbWVudCA9ICcvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKlxuJworICAgICAgICBmaWxlX2NvbW1lbnQgKz0gJy8vIFNlZSBkaXNwYXRjaF9oZWxwZXJfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zXG4nCisgICAgICAgIHdyaXRlKGZpbGVfY29tbWVudCwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICMgQ29weXJpZ2h0IE5vdGljZQorICAgICAgICBjb3B5cmlnaHQgPSAgJy8qXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTtcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUyxcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICovXG4nCisKKyAgICAgICAgcHJlYW1ibGUgPSAnJworICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD5cbicKKyAgICAgICAgcHJlYW1ibGUgKz0gJyNpbmNsdWRlIDx2dWxrYW4vdmtfbGF5ZXIuaD5cbicKKyAgICAgICAgcHJlYW1ibGUgKz0gJyNpbmNsdWRlIDxjc3RyaW5nPlxuJworICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgPHN0cmluZz5cbicKKyAgICAgICAgcHJlYW1ibGUgKz0gJyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PlxuJworICAgICAgICBwcmVhbWJsZSArPSAnI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+XG4nCisgICAgICAgIHByZWFtYmxlICs9ICcjaW5jbHVkZSAidmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCJcbicKKyAgICAgICAgcHJlYW1ibGUgKz0gJyNpbmNsdWRlICJ2a19leHRlbnNpb25faGVscGVyLmgiXG4nCisKKyAgICAgICAgd3JpdGUoY29weXJpZ2h0LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUocHJlYW1ibGUsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICMKKyAgICAjIFdyaXRlIGdlbmVyYXRlIGFuZCB3cml0ZSBkaXNwYXRjaCB0YWJsZXMgdG8gb3V0cHV0IGZpbGUKKyAgICBkZWYgZW5kRmlsZShzZWxmKToKKyAgICAgICAgZXh0X2VuYWJsZWRfZmNuID0gJycKKyAgICAgICAgZGV2aWNlX3RhYmxlID0gJycKKyAgICAgICAgaW5zdGFuY2VfdGFibGUgPSAnJworCisgICAgICAgIGV4dF9lbmFibGVkX2ZjbiArPSBzZWxmLk91dHB1dEV4dEVuYWJsZWRGdW5jdGlvbigpCisgICAgICAgIGRldmljZV90YWJsZSArPSBzZWxmLk91dHB1dERpc3BhdGNoVGFibGVIZWxwZXIoJ2RldmljZScpCisgICAgICAgIGluc3RhbmNlX3RhYmxlICs9IHNlbGYuT3V0cHV0RGlzcGF0Y2hUYWJsZUhlbHBlcignaW5zdGFuY2UnKQorCisgICAgICAgIGZvciBzdHViIGluIHNlbGYuZGV2X2V4dF9zdHViX2xpc3Q6CisgICAgICAgICAgICB3cml0ZShzdHViLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUoIlxuXG4iLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUoZXh0X2VuYWJsZWRfZmNuLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUoIlxuIiwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIHdyaXRlKGRldmljZV90YWJsZSwgZmlsZT1zZWxmLm91dEZpbGUpOworICAgICAgICB3cml0ZSgiXG4iLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgd3JpdGUoaW5zdGFuY2VfdGFibGUsIGZpbGU9c2VsZi5vdXRGaWxlKTsKKworICAgICAgICAjIEZpbmlzaCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmVuZEZpbGUoc2VsZikKKyAgICAjCisgICAgIyBQcm9jZXNzaW5nIGF0IGJlZ2lubmluZyBvZiBlYWNoIGZlYXR1cmUgb3IgZXh0ZW5zaW9uCisgICAgZGVmIGJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCkKKyAgICAgICAgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0ID0gR2V0RmVhdHVyZVByb3RlY3QoaW50ZXJmYWNlKQorICAgICAgICBzZWxmLmV4dGVuc2lvbl90eXBlID0gaW50ZXJmYWNlLmdldCgndHlwZScpCisKKyAgICAjCisgICAgIyBQcm9jZXNzIGNvbW1hbmRzLCBhZGRpbmcgdG8gYXBwcm9wcmlhdGUgZGlzcGF0Y2ggdGFibGVzCisgICAgZGVmIGdlbkNtZChzZWxmLCBjbWRpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpCisKKyAgICAgICAgYXZvaWRfZW50cmllcyA9IFsndmtDcmVhdGVJbnN0YW5jZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrQ3JlYXRlRGV2aWNlJ10KKyAgICAgICAgIyBHZXQgZmlyc3QgcGFyYW0gdHlwZQorICAgICAgICBwYXJhbXMgPSBjbWRpbmZvLmVsZW0uZmluZGFsbCgncGFyYW0nKQorICAgICAgICBpbmZvID0gc2VsZi5nZXRUeXBlTmFtZVR1cGxlKHBhcmFtc1swXSkKKworICAgICAgICBpZiBuYW1lIG5vdCBpbiBhdm9pZF9lbnRyaWVzOgorICAgICAgICAgICAgc2VsZi5BZGRDb21tYW5kVG9EaXNwYXRjaExpc3QobmFtZSwgaW5mb1swXSwgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0LCBjbWRpbmZvKQorCisgICAgIworICAgICMgRGV0ZXJtaW5lIGlmIHRoaXMgQVBJIHNob3VsZCBiZSBpZ25vcmVkIG9yIGFkZGVkIHRvIHRoZSBpbnN0YW5jZSBvciBkZXZpY2UgZGlzcGF0Y2ggdGFibGUKKyAgICBkZWYgQWRkQ29tbWFuZFRvRGlzcGF0Y2hMaXN0KHNlbGYsIG5hbWUsIGhhbmRsZV90eXBlLCBwcm90ZWN0LCBjbWRpbmZvKToKKyAgICAgICAgaWYgaGFuZGxlX3R5cGUgbm90IGluIHNlbGYuaGFuZGxlX3R5cGVzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGhhbmRsZV90eXBlICE9ICdWa0luc3RhbmNlJyBhbmQgaGFuZGxlX3R5cGUgIT0gJ1ZrUGh5c2ljYWxEZXZpY2UnIGFuZCBuYW1lICE9ICd2a0dldEluc3RhbmNlUHJvY0FkZHInOgorICAgICAgICAgICAgc2VsZi5kZXZpY2VfZGlzcGF0Y2hfbGlzdC5hcHBlbmQoKG5hbWUsIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCkpCisgICAgICAgICAgICBleHRlbnNpb24gPSAiVktfVkVSU0lPTiIgbm90IGluIHNlbGYuZmVhdHVyZU5hbWUKKyAgICAgICAgICAgIHByb21vdGVkID0gbm90IGV4dGVuc2lvbiBhbmQgIlZLX1ZFUlNJT05fMV8wIiAhPSBzZWxmLmZlYXR1cmVOYW1lCisgICAgICAgICAgICBpZiBwcm9tb3RlZCBvciBleHRlbnNpb246CisgICAgICAgICAgICAgICAgIyBXZSB3YW50IGZlYXR1cmUgd3JpdHRlbiBmb3IgYWxsIHByb21vdGVkIGVudHJ5cG9pbnRzLCBpbiBhZGRpdGlvbiB0byBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgc2VsZi5kZXZpY2Vfc3R1Yl9saXN0LmFwcGVuZChbbmFtZSwgc2VsZi5mZWF0dXJlTmFtZV0pCisgICAgICAgICAgICAgICAgc2VsZi5kZXZpY2VfZXh0ZW5zaW9uX2xpc3QuYXBwZW5kKFtuYW1lLCBzZWxmLmZlYXR1cmVOYW1lXSkKKyAgICAgICAgICAgICAgICAjIEJ1aWxkIHVwIHN0dWIgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICByZXR1cm5fdHlwZSA9ICcnCisgICAgICAgICAgICAgICAgZGVjbCA9IHNlbGYubWFrZUNEZWNscyhjbWRpbmZvLmVsZW0pWzFdCisgICAgICAgICAgICAgICAgaWYgZGVjbC5zdGFydHN3aXRoKCd0eXBlZGVmIFZrUmVzdWx0Jyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybl90eXBlID0gJ3JldHVybiBWS19TVUNDRVNTOycKKyAgICAgICAgICAgICAgICBlbGlmIGRlY2wuc3RhcnRzd2l0aCgndHlwZWRlZiBWa0RldmljZUFkZHJlc3MnKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgPSAncmV0dXJuIDA7JworICAgICAgICAgICAgICAgIGVsaWYgZGVjbC5zdGFydHN3aXRoKCd0eXBlZGVmIHVpbnQzMl90Jyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybl90eXBlID0gJ3JldHVybiAwOycKKyAgICAgICAgICAgICAgICBlbGlmIGRlY2wuc3RhcnRzd2l0aCgndHlwZWRlZiB1aW50NjRfdCcpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm5fdHlwZSA9ICdyZXR1cm4gMDsnCisgICAgICAgICAgICAgICAgcHJlX2RlY2wsIGRlY2wgPSBkZWNsLnNwbGl0KCcqUEZOX3ZrJykKKyAgICAgICAgICAgICAgICBwcmVfZGVjbCA9IHByZV9kZWNsLnJlcGxhY2UoJ3R5cGVkZWYgJywgJycpCisgICAgICAgICAgICAgICAgcHJlX2RlY2wgPSBwcmVfZGVjbC5zcGxpdCgnICgnKVswXQorICAgICAgICAgICAgICAgIGRlY2wgPSBkZWNsLnJlcGxhY2UoJykoJywgJygnKQorICAgICAgICAgICAgICAgIGRlY2wgPSAnc3RhdGljIFZLQVBJX0FUVFIgJyArIHByZV9kZWNsICsgJyBWS0FQSV9DQUxMIFN0dWInICsgZGVjbAorICAgICAgICAgICAgICAgIGZ1bmNfYm9keSA9ICcgeyAnICsgcmV0dXJuX3R5cGUgKyAnIH07JworICAgICAgICAgICAgICAgIGRlY2wgPSBkZWNsLnJlcGxhY2UgKCc7JywgZnVuY19ib2R5KQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXZfZXh0X3N0dWJfbGlzdC5hcHBlbmQoJyNpZmRlZiAlcycgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QpCisgICAgICAgICAgICAgICAgc2VsZi5kZXZfZXh0X3N0dWJfbGlzdC5hcHBlbmQoZGVjbCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGV2X2V4dF9zdHViX2xpc3QuYXBwZW5kKCcjZW5kaWYgLy8gJXMnICUgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pbnN0YW5jZV9kaXNwYXRjaF9saXN0LmFwcGVuZCgobmFtZSwgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0KSkKKyAgICAgICAgcmV0dXJuCisgICAgIworICAgICMgUmV0cmlldmUgdGhlIHR5cGUgYW5kIG5hbWUgZm9yIGEgcGFyYW1ldGVyCisgICAgZGVmIGdldFR5cGVOYW1lVHVwbGUoc2VsZiwgcGFyYW0pOgorICAgICAgICB0eXBlID0gJycKKyAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gJ3R5cGUnOgorICAgICAgICAgICAgICAgIHR5cGUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgICAgIGVsaWYgZWxlbS50YWcgPT0gJ25hbWUnOgorICAgICAgICAgICAgICAgIG5hbWUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgcmV0dXJuICh0eXBlLCBuYW1lKQorICAgICMKKyAgICAjIE91dHB1dCBhIGZ1bmN0aW9uIHRoYXQnbGwgZGV0ZXJtaW5lIGlmIGFuIGV4dGVuc2lvbiBpcyBpbiB0aGUgZW5hYmxlZCBsaXN0CisgICAgZGVmIE91dHB1dEV4dEVuYWJsZWRGdW5jdGlvbihzZWxmKToKKyAgICAgICAgIyNleHRlbnNpb25fZnVuY3Rpb25zID0gZGljdChzZWxmLmRldmljZV9kaXNwYXRjaF9saXN0KQorICAgICAgICBleHRfZmNuICA9ICcnCisgICAgICAgICMgRmlyc3QsIHdyaXRlIG91dCBvdXIgc3RhdGljIGRhdGEgc3RydWN0dXJlIC0tIG1hcCBvZiBhbGwgQVBJcyB0aGF0IGFyZSBwYXJ0IG9mIGV4dGVuc2lvbnMgdG8gdGhlaXIgZXh0ZW5zaW9uLgorICAgICAgICBleHRfZmNuICs9ICdjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhcGlfZXh0ZW5zaW9uX21hcCB7XG4nCisgICAgICAgIGZvciBleHRuIGluIHNlbGYuZGV2aWNlX2V4dGVuc2lvbl9saXN0OgorICAgICAgICAgICAgZXh0X2ZjbiArPSAnICAgIHsiJXMiLCAiJXMifSxcbicgJSAoZXh0blswXSwgZXh0blsxXSkKKyAgICAgICAgZXh0X2ZjbiArPSAnfTtcblxuJworICAgICAgICBleHRfZmNuICs9ICcvLyBVc2luZyB0aGUgYWJvdmUgY29kZS1nZW5lcmF0ZWQgbWFwIG9mIEFQSU5hbWVzLXRvLXBhcmVudCBleHRlbnNpb24gbmFtZXMsIHRoaXMgZnVuY3Rpb24gd2lsbDpcbicKKyAgICAgICAgZXh0X2ZjbiArPSAnLy8gICBvICBEZXRlcm1pbmUgaWYgdGhlIEFQSSBoYXMgYW4gYXNzb2NpYXRlZCBleHRlbnNpb25cbicKKyAgICAgICAgZXh0X2ZjbiArPSAnLy8gICBvICBJZiBpdCBkb2VzLCBkZXRlcm1pbmUgaWYgdGhhdCBleHRlbnNpb24gbmFtZSBpcyBwcmVzZW50IGluIHRoZSBwYXNzZWQtaW4gc2V0IG9mIGVuYWJsZWRfZXh0X25hbWVzIFxuJworICAgICAgICBleHRfZmNuICs9ICcvLyAgIElmIHRoZSBBUEluYW1lIGhhcyBubyBwYXJlbnQgZXh0ZW5zaW9uLCBPUiBpdHMgcGFyZW50IGV4dGVuc2lvbiBuYW1lIGlzIElOIHRoZSBzZXQsIHJldHVybiBUUlVFLCBlbHNlIEZBTFNFXG4nCisgICAgICAgIGV4dF9mY24gKz0gJ3N0YXRpYyBpbmxpbmUgYm9vbCBBcGlQYXJlbnRFeHRlbnNpb25FbmFibGVkKGNvbnN0IHN0ZDo6c3RyaW5nIGFwaV9uYW1lLCBjb25zdCBEZXZpY2VFeHRlbnNpb25zICpkZXZpY2VfZXh0ZW5zaW9uX2luZm8pIHtcbicKKyAgICAgICAgZXh0X2ZjbiArPSAnICAgIGF1dG8gaGFzX2V4dCA9IGFwaV9leHRlbnNpb25fbWFwLmZpbmQoYXBpX25hbWUpO1xuJworICAgICAgICBleHRfZmNuICs9ICcgICAgLy8gSXMgdGhpcyBBUEkgcGFydCBvZiBhbiBleHRlbnNpb24gb3IgZmVhdHVyZSBncm91cD9cbicKKyAgICAgICAgZXh0X2ZjbiArPSAnICAgIGlmIChoYXNfZXh0ICE9IGFwaV9leHRlbnNpb25fbWFwLmVuZCgpKSB7XG4nCisgICAgICAgIGV4dF9mY24gKz0gJyAgICAgICAgLy8gV2FzIHRoZSBleHRlbnNpb24gZm9yIHRoaXMgQVBJIGVuYWJsZWQgaW4gdGhlIENyZWF0ZURldmljZSBjYWxsP1xuJworICAgICAgICBleHRfZmNuICs9ICcgICAgICAgIGF1dG8gaW5mbyA9IGRldmljZV9leHRlbnNpb25faW5mby0+Z2V0X2luZm8oaGFzX2V4dC0+c2Vjb25kLmNfc3RyKCkpO1xuJworICAgICAgICBleHRfZmNuICs9ICcgICAgICAgIGlmICgoIWluZm8uc3RhdGUpIHx8IChkZXZpY2VfZXh0ZW5zaW9uX2luZm8tPiooaW5mby5zdGF0ZSkgIT0ga0VuYWJsZWRCeUNyZWF0ZWluZm8pKSB7XG4nCisgICAgICAgIGV4dF9mY24gKz0gJyAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbicKKyAgICAgICAgZXh0X2ZjbiArPSAnICAgICAgICB9XG4nCisgICAgICAgIGV4dF9mY24gKz0gJyAgICB9XG4nCisgICAgICAgIGV4dF9mY24gKz0gJyAgICByZXR1cm4gdHJ1ZTtcbicKKyAgICAgICAgZXh0X2ZjbiArPSAnfVxuJworICAgICAgICByZXR1cm4gZXh0X2ZjbgorICAgICMKKyAgICAjIENyZWF0ZSBhIGRpc3BhdGNoIHRhYmxlIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxpc3QgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZworICAgIGRlZiBPdXRwdXREaXNwYXRjaFRhYmxlSGVscGVyKHNlbGYsIHRhYmxlX3R5cGUpOgorICAgICAgICBlbnRyaWVzID0gW10KKyAgICAgICAgdGFibGUgPSAnJworICAgICAgICBpZiB0YWJsZV90eXBlID09ICdkZXZpY2UnOgorICAgICAgICAgICAgZW50cmllcyA9IHNlbGYuZGV2aWNlX2Rpc3BhdGNoX2xpc3QKKyAgICAgICAgICAgIHRhYmxlICs9ICdzdGF0aWMgaW5saW5lIHZvaWQgbGF5ZXJfaW5pdF9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoVmtEZXZpY2UgZGV2aWNlLCBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqdGFibGUsIFBGTl92a0dldERldmljZVByb2NBZGRyIGdwYSkge1xuJworICAgICAgICAgICAgdGFibGUgKz0gJyAgICBtZW1zZXQodGFibGUsIDAsIHNpemVvZigqdGFibGUpKTtcbicKKyAgICAgICAgICAgIHRhYmxlICs9ICcgICAgLy8gRGV2aWNlIGZ1bmN0aW9uIHBvaW50ZXJzXG4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnRyaWVzID0gc2VsZi5pbnN0YW5jZV9kaXNwYXRjaF9saXN0CisgICAgICAgICAgICB0YWJsZSArPSAnc3RhdGljIGlubGluZSB2b2lkIGxheWVyX2luaXRfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqdGFibGUsIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ3BhKSB7XG4nCisgICAgICAgICAgICB0YWJsZSArPSAnICAgIG1lbXNldCh0YWJsZSwgMCwgc2l6ZW9mKCp0YWJsZSkpO1xuJworICAgICAgICAgICAgdGFibGUgKz0gJyAgICAvLyBJbnN0YW5jZSBmdW5jdGlvbiBwb2ludGVyc1xuJworCisgICAgICAgIHN0dWJiZWRfZnVuY3Rpb25zID0gZGljdChzZWxmLmRldmljZV9zdHViX2xpc3QpCisgICAgICAgIGZvciBpdGVtIGluIGVudHJpZXM6CisgICAgICAgICAgICAjIFJlbW92ZSAndmsnIGZyb20gcHJvdG8gbmFtZQorICAgICAgICAgICAgYmFzZV9uYW1lID0gaXRlbVswXVsyOl0KKworICAgICAgICAgICAgaWYgaXRlbVsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgaXRlbVsxXQorCisgICAgICAgICAgICAjIElmIHdlJ3JlIGxvb2tpbmcgZm9yIHRoZSBwcm9jIHdlIGFyZSBwYXNzaW5nIGluLCBqdXN0IHBvaW50IHRoZSB0YWJsZSB0byBpdC4gIFRoaXMgZml4ZXMgdGhlIGlzc3VlIHdoZXJlCisgICAgICAgICAgICAjIGEgbGF5ZXIgb3ZlcnJpZGVzIHRoZSBmdW5jdGlvbiBuYW1lIGZvciB0aGUgbG9hZGVyLgorICAgICAgICAgICAgaWYgKCdkZXZpY2UnIGluIHRhYmxlX3R5cGUgYW5kIGJhc2VfbmFtZSA9PSAnR2V0RGV2aWNlUHJvY0FkZHInKToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnICAgIHRhYmxlLT5HZXREZXZpY2VQcm9jQWRkciA9IGdwYTtcbicKKyAgICAgICAgICAgIGVsaWYgKCdkZXZpY2UnIG5vdCBpbiB0YWJsZV90eXBlIGFuZCBiYXNlX25hbWUgPT0gJ0dldEluc3RhbmNlUHJvY0FkZHInKToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnICAgIHRhYmxlLT5HZXRJbnN0YW5jZVByb2NBZGRyID0gZ3BhO1xuJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnICAgIHRhYmxlLT4lcyA9IChQRk5fJXMpIGdwYSglcywgIiVzIik7XG4nICUgKGJhc2VfbmFtZSwgaXRlbVswXSwgdGFibGVfdHlwZSwgaXRlbVswXSkKKyAgICAgICAgICAgICAgICBpZiAnZGV2aWNlJyBpbiB0YWJsZV90eXBlIGFuZCBpdGVtWzBdIGluIHN0dWJiZWRfZnVuY3Rpb25zOgorICAgICAgICAgICAgICAgICAgICBzdHViX2NoZWNrID0gJyAgICBpZiAodGFibGUtPiVzID09IG51bGxwdHIpIHsgdGFibGUtPiVzID0gKFBGTl8lcylTdHViJXM7IH1cbicgJSAoYmFzZV9uYW1lLCBiYXNlX25hbWUsIGl0ZW1bMF0sIGJhc2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gc3R1Yl9jaGVjaworICAgICAgICAgICAgaWYgaXRlbVsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2VuZGlmIC8vICVzXG4nICUgaXRlbVsxXQorCisgICAgICAgIHRhYmxlICs9ICd9JworICAgICAgICByZXR1cm4gdGFibGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvZXh0ZXJuYWxfcmV2aXNpb25fZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9leHRlcm5hbF9yZXZpc2lvbl9nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3MjkxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvZXh0ZXJuYWxfcmV2aXNpb25fZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMTQzIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogQ29ydCBTdHJhdHRvbiA8Y29ydEBnb29nbGUuY29tPgorIyBBdXRob3I6IEplYW4tRnJhbmNvaXMgUm95IDxqZnJveUBnb29nbGUuY29tPgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHV1aWQKK2ltcG9ydCBqc29uCisKK2RlZiBnZW5lcmF0ZShzeW1ib2xfbmFtZSwgY29tbWl0X2lkLCBvdXRwdXRfaGVhZGVyX2ZpbGUpOgorICAgICMgV3JpdGUgY29tbWl0IElEIHRvIG91dHB1dCBoZWFkZXIgZmlsZQorICAgIHdpdGggb3BlbihvdXRwdXRfaGVhZGVyX2ZpbGUsICJ3IikgYXMgaGVhZGVyX2ZpbGU6CisgICAgICAgICAjIEZpbGUgQ29tbWVudAorICAgICAgICBmaWxlX2NvbW1lbnQgPSAnLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKipcbicKKyAgICAgICAgZmlsZV9jb21tZW50ICs9ICcvLyBTZWUgZXh0ZXJuYWxfcmV2aXNpb25fZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zXG4nCisgICAgICAgIGhlYWRlcl9maWxlLndyaXRlKGZpbGVfY29tbWVudCkKKyAgICAgICAgIyBDb3B5cmlnaHQgTm90aWNlCisgICAgICAgIGNvcHlyaWdodCA9ICcnCisgICAgICAgIGNvcHlyaWdodCArPSAnXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpO1xuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZvcmJlc0Bnb29nbGUuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogQ29ydCBTdHJhdHRvbiA8Y29ydEBnb29nbGUuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4nCisgICAgICAgIGhlYWRlcl9maWxlLndyaXRlKGNvcHlyaWdodCkKKyAgICAgICAgIyBDb250ZW50cworICAgICAgICBjb250ZW50cyA9ICcjcHJhZ21hIG9uY2VcblxuJworICAgICAgICBjb250ZW50cyArPSAnI2RlZmluZSAlcyAiJXMiXG4nICUgKHN5bWJvbF9uYW1lLCBjb21taXRfaWQpCisgICAgICAgIGhlYWRlcl9maWxlLndyaXRlKGNvbnRlbnRzKQorCitkZWYgZ2V0X2NvbW1pdF9pZF9mcm9tX2dpdChnaXRfYmluYXJ5LCBzb3VyY2VfZGlyKToKKyAgICB2YWx1ZSA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFtnaXRfYmluYXJ5LCAicmV2LXBhcnNlIiwgIkhFQUQiXSwgY3dkPXNvdXJjZV9kaXIpLmRlY29kZSgndXRmLTgnKS5zdHJpcCgpCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBpc19zaGExKHN0cik6CisgICAgdHJ5OiBzdHJfYXNfaW50ID0gaW50KHN0ciwgMTYpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHJldHVybiBGYWxzZQorICAgIHJldHVybiBsZW4oc3RyKSA9PSA0MAorCitkZWYgZ2V0X2NvbW1pdF9pZF9mcm9tX2ZpbGUocmV2X2ZpbGUpOgorICAgIHdpdGggb3BlbihyZXZfZmlsZSwgJ3InKSBhcyByZXZfc3RyZWFtOgorICAgICAgICByZXZfY29udGVudHMgPSByZXZfc3RyZWFtLnJlYWQoKQorICAgICAgICByZXZfY29udGVudHNfc3RyaXBwZWQgPSByZXZfY29udGVudHMuc3RyaXAoKQorICAgICAgICBpZiBpc19zaGExKHJldl9jb250ZW50c19zdHJpcHBlZCk6CisgICAgICAgICAgICByZXR1cm4gcmV2X2NvbnRlbnRzX3N0cmlwcGVkOworICAgICAgICAjIG90aGVyd2lzZSwgU0hBMSB0aGUgZW50aXJlICh1bnN0cmlwcGVkKSBmaWxlIGNvbnRlbnRzCisgICAgICAgIHNoYTEgPSBoYXNobGliLnNoYTEoKTsKKyAgICAgICAgc2hhMS51cGRhdGUocmV2X2NvbnRlbnRzLmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgcmV0dXJuIHNoYTEuaGV4ZGlnZXN0KCkKKworZGVmIGdldF9jb21taXRfaWRfZnJvbV91dWlkKCk6CisgICAgdW5pcXVlX3V1aWQgPSBzdHIodXVpZC51dWlkNCgpKQorICAgIHNoYTEgPSBoYXNobGliLnNoYTEoKTsKKyAgICBzaGExLnVwZGF0ZSh1bmlxdWVfdXVpZC5lbmNvZGUoKSkKKyAgICByZXR1cm4gc2hhMS5oZXhkaWdlc3QoKQorCitkZWYgZ2V0X2NvbW1pdF9pZF9mcm9tX2pzb24oanNvbl9maWxlLCBqc29uX2tleXMpOgorICAgIHdpdGggb3Blbihqc29uX2ZpbGUpIGFzIGpzb25fc3RyZWFtOgorICAgICAgICBqc29uX2RhdGEgPSBqc29uLmxvYWQoanNvbl9zdHJlYW0pCisgICAgZm9yIGtleSBpbiBqc29uX2tleXMuc3BsaXQoJywnKToKKyAgICAgICAgaWYgdHlwZShqc29uX2RhdGEpID09IGxpc3Q6CisgICAgICAgICAgICBqc29uX2RhdGEgPSBqc29uX2RhdGFbaW50KGtleSldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBqc29uX2RhdGEgPSBqc29uX2RhdGFba2V5XQorICAgIHJldHVybiBqc29uX2RhdGEKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcmV2X21ldGhvZF9ncm91cCA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKHJlcXVpcmVkPVRydWUpCisgICAgcmV2X21ldGhvZF9ncm91cC5hZGRfYXJndW1lbnQoIi0tZ2l0X2RpciIsIG1ldGF2YXI9IlNPVVJDRV9ESVIiLCBoZWxwPSJnaXQgd29ya2luZyBjb3B5IGRpcmVjdG9yeSIpCisgICAgcmV2X21ldGhvZF9ncm91cC5hZGRfYXJndW1lbnQoIi0tcmV2X2ZpbGUiLCBtZXRhdmFyPSJSRVZJU0lPTl9GSUxFIiwgaGVscD0ic291cmNlIHJldmlzaW9uIGZpbGUgcGF0aCAobXVzdCBjb250YWluIGEgU0hBMSBoYXNoIikKKyAgICByZXZfbWV0aG9kX2dyb3VwLmFkZF9hcmd1bWVudCgiLS1mcm9tX3V1aWQiLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSJiYXNlIFNIQTEgb24gYSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgVVVJRCIpCisgICAgcmV2X21ldGhvZF9ncm91cC5hZGRfYXJndW1lbnQoIi0tanNvbl9maWxlIiwgbWV0YXZhcj0iSlNPTl9GSUxFIiwgaGVscD0icGF0aCB0byBqc29uIGZpbGUiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi1zIiwgIi0tc3ltYm9sX25hbWUiLCBtZXRhdmFyPSJTWU1CT0xfTkFNRSIsIHJlcXVpcmVkPVRydWUsIGhlbHA9IkMgc3ltYm9sIG5hbWUiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi1vIiwgIi0tb3V0cHV0X2hlYWRlcl9maWxlIiwgbWV0YXZhcj0iT1VUUFVUX0hFQURFUl9GSUxFIiwgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0ib3V0cHV0IGhlYWRlciBmaWxlIHBhdGgiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tanNvbl9rZXlzIiwgYWN0aW9uPSdzdG9yZScsIG1ldGF2YXI9IkpTT05fS0VZUyIsIGhlbHA9ImNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGtleXMgc3BlY2lmeWluZyBTSEExIGxvY2F0aW9uIGluIHJvb3QganNvbiBvYmplY3QgZm9yIC0tanNvbl9maWxlIG9wdGlvbiIpCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmICgnanNvbl9maWxlJyBpbiBhcmdzKSAhPSAoJ2pzb25fa2V5cycgaW4gYXJncyk6CisgICAgICAgIHBhcnNlci5lcnJvcignLS1qc29uX2ZpbGUgYW5kIC0tanNvbl9rZXlzIG11c3QgYmUgcHJvdmlkZWQgdG9nZXRoZXInKQorCisgICAgIyBXZSBjYW4gZWl0aGVyIHBhcnNlIHRoZSBsYXRlc3QgR2l0IGNvbW1pdCBJRCBvdXQgb2YgdGhlIHNwZWNpZmllZCByZXBvc2l0b3J5IChwcmVmZXJyZWQgd2hlcmUgcG9zc2libGUpLAorICAgICMgb3IgY29tcHV0aW5nIHRoZSBTSEExIGhhc2ggb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgKHdoZXJlIG5lY2Vzc2FyeSAtLQorICAgICMgZS5nLiB3aGVuIGJ1aWxkaW5nIHRoZSBsYXllcnMgb3V0c2lkZSBvZiBhIEdpdCBlbnZpcm9ubWVudCkuCisgICAgaWYgYXJncy5naXRfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAjIEV4dHJhY3QgY29tbWl0IElEIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgZGlyZWN0b3J5CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbW1pdF9pZCA9IGdldF9jb21taXRfaWRfZnJvbV9naXQoJ2dpdCcsIGFyZ3MuZ2l0X2RpcikKKyAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjoKKyAgICAgICAgICAgICMgQ2FsbCBnaXQuYmF0IG9uIFdpbmRvd3MgZm9yIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAgICBjb21taXRfaWQgPSBnZXRfY29tbWl0X2lkX2Zyb21fZ2l0KCdnaXQuYmF0JywgYXJncy5naXRfZGlyKQorICAgIGVsaWYgYXJncy5yZXZfZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgIyBSZWFkIHRoZSBjb21taXQgSUQgZnJvbSBhIGZpbGUuCisgICAgICAgIGNvbW1pdF9pZCA9IGdldF9jb21taXRfaWRfZnJvbV9maWxlKGFyZ3MucmV2X2ZpbGUpCisgICAgZWxpZiBhcmdzLmpzb25fZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgY29tbWl0X2lkID0gZ2V0X2NvbW1pdF9pZF9mcm9tX2pzb24oYXJncy5qc29uX2ZpbGUsIGFyZ3MuanNvbl9rZXlzKQorICAgIGVsaWYgYXJncy5mcm9tX3V1aWQ6CisgICAgICAgIGNvbW1pdF9pZCA9IGdldF9jb21taXRfaWRfZnJvbV91dWlkKCkKKworICAgIGlmIG5vdCBpc19zaGExKGNvbW1pdF9pZCk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNvbW1pdCBJRCBmb3IgIiArIGFyZ3Muc3ltYm9sX25hbWUgKyAiIG11c3QgYmUgYSBTSEExIGhhc2guIikKKworICAgIGdlbmVyYXRlKGFyZ3Muc3ltYm9sX25hbWUsIGNvbW1pdF9pZCwgYXJncy5vdXRwdXRfaGVhZGVyX2ZpbGUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvZ2VuZXJhdGVfc291cmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2NzVlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2dlbmVyYXRlX3NvdXJjZS5weQpAQCAtMCwwICsxLDEzNiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIyBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEx1bmFyRywgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBNaWtlIFNjaHVjaGFyZHQgPG1pa2VzQGx1bmFyZy5jb20+CisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGZpbGVjbXAKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQorCitpbXBvcnQgY29tbW9uX2NvZGVnZW4KKworIyBmaWxlcyB0byBleGNsdWRlIGZyb20gLS12ZXJpZnkgY2hlY2sKK3ZlcmlmeV9leGNsdWRlID0gWycuY2xhbmctZm9ybWF0J10KKworZGVmIG1haW4oYXJndik6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J0dlbmVyYXRlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHJlcG9zaXRvcnknKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3JlZ2lzdHJ5JywgbWV0YXZhcj0nUkVHSVNUUllfUEFUSCcsIGhlbHA9J3BhdGggdG8gdGhlIFZ1bGthbi1IZWFkZXJzIHJlZ2lzdHJ5IGRpcmVjdG9yeScpCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaScsICctLWluY3JlbWVudGFsJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nb25seSB1cGRhdGUgcmVwbyBmaWxlcyB0aGF0IGNoYW5nZScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmlmeScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J3ZlcmlmeSByZXBvIGZpbGVzIG1hdGNoIGdlbmVyYXRvciBvdXRwdXQnKQorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQorCisgICAgZ2VuX2NtZHMgPSBbKltbY29tbW9uX2NvZGVnZW4ucmVwb19yZWxhdGl2ZSgnc2NyaXB0cy9sdmxfZ2VudmsucHknKSwKKyAgICAgICAgICAgICAgICAgICAnLXJlZ2lzdHJ5Jywgb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihhcmdzLnJlZ2lzdHJ5LCAgJ3ZrLnhtbCcpKSwKKyAgICAgICAgICAgICAgICAgICAnLXF1aWV0JywKKyAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV0gZm9yIGZpbGVuYW1lIGluIFsiY2hhc3Npcy5jcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFzc2lzLmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmNwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxheWVyX2NoYXNzaXNfZGlzcGF0Y2guaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdF90cmFja2VyLmNwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdF90cmFja2VyLmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXJfdmFsaWRhdGlvbi5jcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXJfdmFsaWRhdGlvbi5oIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkX3NhZmV0eS5jcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfc2FmZXR5LmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrX2VudW1fc3RyaW5nX2hlbHBlci5oIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtfZXh0ZW5zaW9uX2hlbHBlci5oIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrX29iamVjdF90eXBlcy5oIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtfc2FmZV9zdHJ1Y3QuY3BwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtfc2FmZV9zdHJ1Y3QuaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImx2dF9mdW5jdGlvbl9wb2ludGVycy5jcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsdnRfZnVuY3Rpb25fcG9pbnRlcnMuaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrX3R5cGVtYXBfaGVscGVyLmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2NvdW50ZXJfaGVscGVyLmNwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfY291bnRlcl9oZWxwZXIuaCJdXSwKKyAgICAgICAgICAgICAgICBbY29tbW9uX2NvZGVnZW4ucmVwb19yZWxhdGl2ZSgnc2NyaXB0cy92a192YWxpZGF0aW9uX3N0YXRzLnB5JyksCisgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oYXJncy5yZWdpc3RyeSwgJ3ZhbGlkdXNhZ2UuanNvbicpKSwKKyAgICAgICAgICAgICAgICAgJy1leHBvcnRfaGVhZGVyJ10sCisgICAgICAgICAgICAgICAgW2NvbW1vbl9jb2RlZ2VuLnJlcG9fcmVsYXRpdmUoJ3NjcmlwdHMvZXh0ZXJuYWxfcmV2aXNpb25fZ2VuZXJhdG9yLnB5JyksCisgICAgICAgICAgICAgICAgICctLWpzb25fZmlsZScsIGNvbW1vbl9jb2RlZ2VuLnJlcG9fcmVsYXRpdmUoJ3NjcmlwdHMva25vd25fZ29vZC5qc29uJyksCisgICAgICAgICAgICAgICAgICctLWpzb25fa2V5cycsICdyZXBvcywwLGNvbW1pdCcsCisgICAgICAgICAgICAgICAgICctcycsICdTUElSVl9UT09MU19DT01NSVRfSUQnLAorICAgICAgICAgICAgICAgICAnLW8nLCAnc3BpcnZfdG9vbHNfY29tbWl0X2lkLmgnXV0KKworICAgIHJlcG9fZGlyID0gY29tbW9uX2NvZGVnZW4ucmVwb19yZWxhdGl2ZSgnbGF5ZXJzL2dlbmVyYXRlZCcpCisKKyAgICAjIGdldCBkaXJlY3Rvcnkgd2hlcmUgZ2VuZXJhdG9ycyB3aWxsIHJ1bgorICAgIGlmIGFyZ3MudmVyaWZ5IG9yIGFyZ3MuaW5jcmVtZW50YWw6CisgICAgICAgICMgZ2VuZXJhdGUgaW4gdGVtcCBkaXJlY3Rvcnkgc28gd2UgY2FuIGNvbXBhcmUgb3IgY29weSBsYXRlcgorICAgICAgICB0ZW1wX29iaiA9IHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeShwcmVmaXg9J1Z1bGthblZMX2dlbmVyYXRlZF9zb3VyY2VfJykKKyAgICAgICAgdGVtcF9kaXIgPSB0ZW1wX29iai5uYW1lCisgICAgICAgIGdlbl9kaXIgPSB0ZW1wX2RpcgorICAgIGVsc2U6CisgICAgICAgICMgZ2VuZXJhdGUgZGlyZWN0bHkgaW4gdGhlIHJlcG8KKyAgICAgICAgZ2VuX2RpciA9IHJlcG9fZGlyCisKKyAgICAjIHJ1biBlYWNoIGNvZGUgZ2VuZXJhdG9yCisgICAgZm9yIGNtZCBpbiBnZW5fY21kczoKKyAgICAgICAgcHJpbnQoJyAnLmpvaW4oY21kKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzeXMuZXhlY3V0YWJsZV0gKyBjbWQsIGN3ZD1nZW5fZGlyKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBwcmludCgnRVJST1I6Jywgc3RyKGUpKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICMgb3B0aW9uYWwgcG9zdC1nZW5lcmF0aW9uIHN0ZXBzCisgICAgaWYgYXJncy52ZXJpZnk6CisgICAgICAgICMgY29tcGFyZSBjb250ZW50cyBvZiB0ZW1wIGRpciBhbmQgcmVwbworICAgICAgICB0ZW1wX2ZpbGVzID0gc2V0KG9zLmxpc3RkaXIodGVtcF9kaXIpKQorICAgICAgICByZXBvX2ZpbGVzID0gc2V0KG9zLmxpc3RkaXIocmVwb19kaXIpKQorICAgICAgICBmaWxlc19tYXRjaCA9IFRydWUKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNvcnRlZCgodGVtcF9maWxlcyB8IHJlcG9fZmlsZXMpIC0gc2V0KHZlcmlmeV9leGNsdWRlKSk6CisgICAgICAgICAgICBpZiBmaWxlbmFtZSBub3QgaW4gcmVwb19maWxlczoKKyAgICAgICAgICAgICAgICBwcmludCgnRVJST1I6IE1pc3NpbmcgcmVwbyBmaWxlJywgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZmlsZXNfbWF0Y2ggPSBGYWxzZQorICAgICAgICAgICAgZWxpZiBmaWxlbmFtZSBub3QgaW4gdGVtcF9maWxlczoKKyAgICAgICAgICAgICAgICBwcmludCgnRVJST1I6IE1pc3NpbmcgZ2VuZXJhdG9yIGZvcicsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGZpbGVzX21hdGNoID0gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgbm90IGZpbGVjbXAuY21wKG9zLnBhdGguam9pbih0ZW1wX2RpciwgZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihyZXBvX2RpciwgZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWxsb3c9RmFsc2UpOgorICAgICAgICAgICAgICAgIHByaW50KCdFUlJPUjogUmVwbyBmaWxlcyBkbyBub3QgbWF0Y2ggZ2VuZXJhdG9yIG91dHB1dCBmb3InLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBmaWxlc19tYXRjaCA9IEZhbHNlCisKKyAgICAgICAgIyByZXR1cm4gY29kZSBmb3IgdGVzdCBzY3JpcHRzCisgICAgICAgIGlmIGZpbGVzX21hdGNoOgorICAgICAgICAgICAgcHJpbnQoJ1NVQ0NFU1M6IFJlcG8gZmlsZXMgbWF0Y2ggZ2VuZXJhdG9yIG91dHB1dCcpCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gMQorCisgICAgZWxpZiBhcmdzLmluY3JlbWVudGFsOgorICAgICAgICAjIGNvcHkgbWlzc2luZyBvciBkaWZmZXJpbmcgZmlsZXMgZnJvbSB0ZW1wIGRpcmVjdG9yeSB0byByZXBvCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKHRlbXBfZGlyKToKKyAgICAgICAgICAgIHRlbXBfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsIGZpbGVuYW1lKQorICAgICAgICAgICAgcmVwb19maWxlbmFtZSA9IG9zLnBhdGguam9pbihyZXBvX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVwb19maWxlbmFtZSkgb3IgXAorICAgICAgICAgICAgICAgbm90IGZpbGVjbXAuY21wKHRlbXBfZmlsZW5hbWUsIHJlcG9fZmlsZW5hbWUsIHNoYWxsb3c9RmFsc2UpOgorICAgICAgICAgICAgICAgIHByaW50KCd1cGRhdGUnLCByZXBvX2ZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZSh0ZW1wX2ZpbGVuYW1lLCByZXBvX2ZpbGVuYW1lKQorCisgICAgcmV0dXJuIDAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvaGVscGVyX2ZpbGVfZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9oZWxwZXJfZmlsZV9nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmMjY0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvaGVscGVyX2ZpbGVfZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMTUyNyBAQAorIyEvdXNyL2Jpbi9weXRob24zIC1pCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorIyBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyMgQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorCitpbXBvcnQgb3MscmUsc3lzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIGV0cmVlCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgKgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorZnJvbSBjb21tb25fY29kZWdlbiBpbXBvcnQgKgorCisjCisjIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zIC0gc3ViY2xhc3Mgb2YgR2VuZXJhdG9yT3B0aW9ucy4KK2NsYXNzIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zKEdlbmVyYXRvck9wdGlvbnMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBjb252ZW50aW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gJy4nLAorICAgICAgICAgICAgICAgICBhcGluYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZW1pdHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgc29ydFByb2NlZHVyZSA9IHJlZ1NvcnRGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgcHJlZml4VGV4dCA9ICIiLAorICAgICAgICAgICAgICAgICBnZW5GdW5jUG9pbnRlcnMgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0RmlsZSA9IFRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgYXBpY2FsbCA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeSA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeXAgPSAnJywKKyAgICAgICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICBsaWJyYXJ5X25hbWUgPSAnJywKKyAgICAgICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IFRydWUsCisgICAgICAgICAgICAgICAgIGhlbHBlcl9maWxlX3R5cGUgPSAnJyk6CisgICAgICAgIEdlbmVyYXRvck9wdGlvbnMuX19pbml0X18oc2VsZiwgY29udmVudGlvbnMsIGZpbGVuYW1lLCBkaXJlY3RvcnksIGFwaW5hbWUsIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMsIGVtaXR2ZXJzaW9ucywgZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucywgcmVtb3ZlRXh0ZW5zaW9ucywgZW1pdEV4dGVuc2lvbnMsIHNvcnRQcm9jZWR1cmUpCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgICA9IHByZWZpeFRleHQKKyAgICAgICAgc2VsZi5nZW5GdW5jUG9pbnRlcnMgID0gZ2VuRnVuY1BvaW50ZXJzCisgICAgICAgIHNlbGYucHJvdGVjdEZpbGUgICAgICA9IHByb3RlY3RGaWxlCisgICAgICAgIHNlbGYucHJvdGVjdEZlYXR1cmUgICA9IHByb3RlY3RGZWF0dXJlCisgICAgICAgIHNlbGYuYXBpY2FsbCAgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgID0gYXBpZW50cnkKKyAgICAgICAgc2VsZi5hcGllbnRyeXAgICAgICAgID0gYXBpZW50cnlwCisgICAgICAgIHNlbGYuYWxpZ25GdW5jUGFyYW0gICA9IGFsaWduRnVuY1BhcmFtCisgICAgICAgIHNlbGYubGlicmFyeV9uYW1lICAgICA9IGxpYnJhcnlfbmFtZQorICAgICAgICBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPSBoZWxwZXJfZmlsZV90eXBlCisjCisjIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3IgLSBzdWJjbGFzcyBvZiBPdXRwdXRHZW5lcmF0b3IuIE91dHB1dHMgVnVsa2FuIGhlbHBlciBmaWxlcworY2xhc3MgSGVscGVyRmlsZU91dHB1dEdlbmVyYXRvcihPdXRwdXRHZW5lcmF0b3IpOgorICAgICIiIkdlbmVyYXRlIGhlbHBlciBmaWxlIGJhc2VkIG9uIFhNTCBlbGVtZW50IGF0dHJpYnV0ZXMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgZXJyRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIHdhcm5GaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgZGlhZ0ZpbGUgPSBzeXMuc3Rkb3V0KToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkKKyAgICAgICAgIyBJbnRlcm5hbCBzdGF0ZSAtIGFjY3VtdWxhdG9ycyBmb3IgZGlmZmVyZW50IGlubmVyIGJsb2NrIHRleHQKKyAgICAgICAgc2VsZi5lbnVtX291dHB1dCA9ICcnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmluZyBidWlsdCB1cCBvZiBlbnVtIHN0cmluZyByb3V0aW5lcworICAgICAgICAjIEludGVybmFsIHN0YXRlIC0gYWNjdW11bGF0b3JzIGZvciBkaWZmZXJlbnQgaW5uZXIgYmxvY2sgdGV4dAorICAgICAgICBzZWxmLnN0cnVjdE5hbWVzID0gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTGlzdCBvZiBWdWxrYW4gc3RydWN0IHR5cGVuYW1lcworICAgICAgICBzZWxmLnN0cnVjdFR5cGVzID0gZGljdCgpICAgICAgICAgICAgICAgICAgICAgICAgICMgTWFwIG9mIFZ1bGthbiBzdHJ1Y3QgdHlwZW5hbWUgdG8gcmVxdWlyZWQgVmtTdHJ1Y3R1cmVUeXBlCisgICAgICAgIHNlbGYuc3RydWN0TWVtYmVycyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMaXN0IG9mIFN0cnVjdE1lbWJlckRhdGEgcmVjb3JkcyBmb3IgYWxsIFZ1bGthbiBzdHJ1Y3RzCisgICAgICAgIHNlbGYub2JqZWN0X3R5cGVzID0gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMaXN0IG9mIGFsbCBoYW5kbGUgdHlwZXMKKyAgICAgICAgc2VsZi5vYmplY3RfdHlwZV9hbGlhc2VzID0gW10gICAgICAgICAgICAgICAgICAgICAjIEFsaWFzZXMgdG8gaGFuZGxlcyB0eXBlcyAoZm9yIGhhbmRsZXMgdGhhdCB3ZXJlIGV4dGVuc2lvbnMpCisgICAgICAgIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlcyA9IFtdICAgICAgICAgICAgICAgIyBIYW5keSBjb3B5IG9mIGRlYnVnX3JlcG9ydF9vYmplY3RfdHlwZSBlbnVtIGRhdGEKKyAgICAgICAgc2VsZi5jb3JlX29iamVjdF90eXBlcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAjIEhhbmR5IGNvcHkgb2YgY29yZV9vYmplY3RfdHlwZSBlbnVtIGRhdGEKKyAgICAgICAgc2VsZi5kZXZpY2VfZXh0ZW5zaW9uX2luZm8gPSBkaWN0KCkgICAgICAgICAgICAgICAjIERpY3Qgb2YgZGV2aWNlIGV4dGVuc2lvbiBuYW1lIGRlZmluZXMgYW5kIGlmZGVmIHZhbHVlcworICAgICAgICBzZWxmLmluc3RhbmNlX2V4dGVuc2lvbl9pbmZvID0gZGljdCgpICAgICAgICAgICAgICMgRGljdCBvZiBpbnN0YW5jZSBleHRlbnNpb24gbmFtZSBkZWZpbmVzIGFuZCBpZmRlZiB2YWx1ZXMKKyAgICAgICAgc2VsZi5zdHJ1Y3RleHRlbmRzX2xpc3QgPSBbXSAgICAgICAgICAgICAgICAgICAgICAjIExpc3Qgb2Ygc3RydWN0cyB3aGljaCBleHRlbmQgYW5vdGhlciBzdHJ1Y3QgdmlhIHBOZXh0CisKKworICAgICAgICAjIE5hbWVkIHR1cGxlcyB0byBzdG9yZSBzdHJ1Y3QgYW5kIGNvbW1hbmQgZGF0YQorICAgICAgICBzZWxmLlN0cnVjdFR5cGUgPSBuYW1lZHR1cGxlKCdTdHJ1Y3RUeXBlJywgWyduYW1lJywgJ3ZhbHVlJ10pCisgICAgICAgIHNlbGYuQ29tbWFuZFBhcmFtID0gbmFtZWR0dXBsZSgnQ29tbWFuZFBhcmFtJywgWyd0eXBlJywgJ25hbWUnLCAnaXNwb2ludGVyJywgJ2lzc3RhdGljYXJyYXknLCAnaXNjb25zdCcsICdpc2NvdW50JywgJ2xlbicsICdleHRzdHJ1Y3RzJywgJ2NkZWNsJ10pCisgICAgICAgIHNlbGYuU3RydWN0TWVtYmVyRGF0YSA9IG5hbWVkdHVwbGUoJ1N0cnVjdE1lbWJlckRhdGEnLCBbJ25hbWUnLCAnbWVtYmVycycsICdpZmRlZl9wcm90ZWN0J10pCisKKyAgICAgICAgc2VsZi5jdXN0b21fY29uc3RydWN0X3BhcmFtcyA9IHsKKyAgICAgICAgICAgICMgc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIG5lZWRzIHRvIGtub3cgaWYgc3VicGFzcyBoYXMgY29sb3IgYW5kXG9yIGRlcHRoXHN0ZW5jaWwgYXR0YWNobWVudHMgdG8gdXNlIGl0cyBwb2ludGVycworICAgICAgICAgICAgJ1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAnLCBjb25zdCBib29sIHVzZXNfY29sb3JfYXR0YWNobWVudCwgY29uc3QgYm9vbCB1c2VzX2RlcHRoc3RlbmNpbF9hdHRhY2htZW50JywKKyAgICAgICAgICAgICMgc2FmZV9Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gbmVlZHMgdG8ga25vdyBpZiB2aWV3cG9ydCBhbmQgc2Npc3NvciBpcyBkeW5hbWljIHRvIHVzZSBpdHMgcG9pbnRlcnMKKyAgICAgICAgICAgICdWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAnLCBjb25zdCBib29sIGlzX2R5bmFtaWNfdmlld3BvcnRzLCBjb25zdCBib29sIGlzX2R5bmFtaWNfc2Npc3NvcnMnLAorICAgICAgICB9CisgICAgIworICAgICMgQ2FsbGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bgorICAgIGRlZiBiZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cykKKyAgICAgICAgIyBJbml0aWFsaXplIG1lbWJlcnMgdGhhdCByZXF1aXJlIHRoZSB0cmVlCisgICAgICAgIHNlbGYuaGFuZGxlX3R5cGVzID0gR2V0SGFuZGxlVHlwZXMoc2VsZi5yZWdpc3RyeS50cmVlKQorICAgICAgICAjIFVzZXItc3VwcGxpZWQgcHJlZml4IHRleHQsIGlmIGFueSAobGlzdCBvZiBzdHJpbmdzKQorICAgICAgICBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPSBnZW5PcHRzLmhlbHBlcl9maWxlX3R5cGUKKyAgICAgICAgc2VsZi5saWJyYXJ5X25hbWUgPSBnZW5PcHRzLmxpYnJhcnlfbmFtZQorICAgICAgICAjIEZpbGUgQ29tbWVudAorICAgICAgICBmaWxlX2NvbW1lbnQgPSAnLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKipcbicKKyAgICAgICAgZmlsZV9jb21tZW50ICs9ICcvLyBTZWUgaGVscGVyX2ZpbGVfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zXG4nCisgICAgICAgIHdyaXRlKGZpbGVfY29tbWVudCwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICMgQ29weXJpZ2h0IE5vdGljZQorICAgICAgICBjb3B5cmlnaHQgPSAnJworICAgICAgICBjb3B5cmlnaHQgKz0gJ1xuJworICAgICAgICBjb3B5cmlnaHQgKz0gJy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvblxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTtcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUyxcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5Z29AZ29vZ2xlLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmb3JiZXNAZ29vZ2xlLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IEpvaG4gWnVsYXVmPGp6dWxhdWZAbHVuYXJnLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuJworICAgICAgICB3cml0ZShjb3B5cmlnaHQsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICMKKyAgICAjIFdyaXRlIGdlbmVyYXRlZCBmaWxlIGNvbnRlbnQgdG8gb3V0cHV0IGZpbGUKKyAgICBkZWYgZW5kRmlsZShzZWxmKToKKyAgICAgICAgZGVzdF9maWxlID0gJycKKyAgICAgICAgZGVzdF9maWxlICs9IHNlbGYuT3V0cHV0RGVzdEZpbGUoKQorICAgICAgICAjIFJlbW92ZSBibGFuayBsaW5lcyBhdCBFT0YKKyAgICAgICAgaWYgZGVzdF9maWxlLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgZGVzdF9maWxlID0gZGVzdF9maWxlWzotMV0KKyAgICAgICAgd3JpdGUoZGVzdF9maWxlLCBmaWxlPXNlbGYub3V0RmlsZSk7CisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorICAgICMKKyAgICAjIE92ZXJyaWRlIHBhcmVudCBjbGFzcyB0byBiZSBub3RpZmllZCBvZiB0aGUgYmVnaW5uaW5nIG9mIGFuIGV4dGVuc2lvbgorICAgIGRlZiBiZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KToKKyAgICAgICAgIyBTdGFydCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpCisgICAgICAgIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCA9IEdldEZlYXR1cmVQcm90ZWN0KGludGVyZmFjZSkKKworICAgICAgICBpZiBzZWxmLmZlYXR1cmVOYW1lID09ICdWS19WRVJTSU9OXzFfMCcgb3Igc2VsZi5mZWF0dXJlTmFtZSA9PSAnVktfVkVSU0lPTl8xXzEnOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5hbWUgPSBzZWxmLmZlYXR1cmVOYW1lCisgICAgICAgIG5hbWVFbGVtID0gaW50ZXJmYWNlWzBdWzFdCisgICAgICAgIG5hbWVfZGVmaW5lID0gbmFtZUVsZW0uZ2V0KCduYW1lJykKKyAgICAgICAgaWYgJ0VYVEVOU0lPTl9OQU1FJyBub3QgaW4gbmFtZV9kZWZpbmU6CisgICAgICAgICAgICBwcmludCgiRXJyb3IgaW4gdmsueG1sIGZpbGUgLS0gZXh0ZW5zaW9uIG5hbWUgaXMgbm90IGF2YWlsYWJsZSIpCisgICAgICAgIHJlcXVpcmVzID0gaW50ZXJmYWNlLmdldCgncmVxdWlyZXMnKQorICAgICAgICBpZiByZXF1aXJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlcXVpcmVkX2V4dGVuc2lvbnMgPSByZXF1aXJlcy5zcGxpdCgnLCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXF1aXJlZF9leHRlbnNpb25zID0gbGlzdCgpCisgICAgICAgIHJlcXVpcmVzQ29yZSA9IGludGVyZmFjZS5nZXQoJ3JlcXVpcmVzQ29yZScpCisgICAgICAgIGlmIHJlcXVpcmVzQ29yZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlcXVpcmVkX2V4dGVuc2lvbnMuYXBwZW5kKCdWS19WRVJTSU9OXyVzJyAlICgnXycuam9pbihyZXF1aXJlc0NvcmUuc3BsaXQoJy4nKSkpKQorICAgICAgICBpbmZvID0geyAnZGVmaW5lJzogbmFtZV9kZWZpbmUsICdpZmRlZic6c2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0LCAncmVxcyc6cmVxdWlyZWRfZXh0ZW5zaW9ucyB9CisgICAgICAgIGlmIGludGVyZmFjZS5nZXQoJ3R5cGUnKSA9PSAnaW5zdGFuY2UnOgorICAgICAgICAgICAgc2VsZi5pbnN0YW5jZV9leHRlbnNpb25faW5mb1tuYW1lXSA9IGluZm8KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGV2aWNlX2V4dGVuc2lvbl9pbmZvW25hbWVdID0gaW5mbworCisgICAgIworICAgICMgT3ZlcnJpZGUgcGFyZW50IGNsYXNzIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBlbmQgb2YgYW4gZXh0ZW5zaW9uCisgICAgZGVmIGVuZEZlYXR1cmUoc2VsZik6CisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmVhdHVyZShzZWxmKQorICAgICMKKyAgICAjIEdyYWIgZ3JvdXAgKGUuZy4gQyAiZW51bSIgdHlwZSkgaW5mbyB0byBvdXRwdXQgZm9yIGVudW0tc3RyaW5nIGNvbnZlcnNpb24gaGVscGVyCisgICAgZGVmIGdlbkdyb3VwKHNlbGYsIGdyb3VwaW5mbywgZ3JvdXBOYW1lLCBhbGlhcyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5Hcm91cChzZWxmLCBncm91cGluZm8sIGdyb3VwTmFtZSwgYWxpYXMpCisgICAgICAgIGdyb3VwRWxlbSA9IGdyb3VwaW5mby5lbGVtCisgICAgICAgICMgRm9yIGVudW1fc3RyaW5nX2hlYWRlcgorICAgICAgICBpZiBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPT0gJ2VudW1fc3RyaW5nX2hlYWRlcic6CisgICAgICAgICAgICB2YWx1ZV9zZXQgPSBzZXQoKQorICAgICAgICAgICAgZm9yIGVsZW0gaW4gZ3JvdXBFbGVtLmZpbmRhbGwoJ2VudW0nKToKKyAgICAgICAgICAgICAgICBpZiBlbGVtLmdldCgnc3VwcG9ydGVkJykgIT0gJ2Rpc2FibGVkJyBhbmQgZWxlbS5nZXQoJ2FsaWFzJykgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfc2V0LmFkZChlbGVtLmdldCgnbmFtZScpKQorICAgICAgICAgICAgaWYgdmFsdWVfc2V0ICE9IHNldCgpOgorICAgICAgICAgICAgICAgIHNlbGYuZW51bV9vdXRwdXQgKz0gc2VsZi5HZW5lcmF0ZUVudW1TdHJpbmdDb252ZXJzaW9uKGdyb3VwTmFtZSwgdmFsdWVfc2V0KQorICAgICAgICBlbGlmIHNlbGYuaGVscGVyX2ZpbGVfdHlwZSA9PSAnb2JqZWN0X3R5cGVzX2hlYWRlcic6CisgICAgICAgICAgICBpZiBncm91cE5hbWUgPT0gJ1ZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUJzoKKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBncm91cEVsZW0uZmluZGFsbCgnZW51bScpOgorICAgICAgICAgICAgICAgICAgICBpZiBlbGVtLmdldCgnc3VwcG9ydGVkJykgIT0gJ2Rpc2FibGVkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVsZW0uZ2V0KCdhbGlhcycpIGlzIE5vbmU6ICMgVE9ETzogU3RyYW5nZWx5IHRoZSAiYWxpYXMiIGZuIHBhcmFtZXRlciBkb2VzIG5vdCB3b3JrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9uYW1lID0gZWxlbS5nZXQoJ25hbWUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlcy5jb3VudChpdGVtX25hbWUpID09IDA6ICMgVE9ETzogU3RyYW5nZWx5IHRoZXJlIGFyZSBkdXBsaWNhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlcy5hcHBlbmQoaXRlbV9uYW1lKQorICAgICAgICAgICAgZWxpZiBncm91cE5hbWUgPT0gJ1ZrT2JqZWN0VHlwZSc6CisgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gZ3JvdXBFbGVtLmZpbmRhbGwoJ2VudW0nKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZWxlbS5nZXQoJ3N1cHBvcnRlZCcpICE9ICdkaXNhYmxlZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlbGVtLmdldCgnYWxpYXMnKSBpcyBOb25lOiAjIFRPRE86IFN0cmFuZ2VseSB0aGUgImFsaWFzIiBmbiBwYXJhbWV0ZXIgZG9lcyBub3Qgd29yaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fbmFtZSA9IGVsZW0uZ2V0KCduYW1lJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvcmVfb2JqZWN0X3R5cGVzLmFwcGVuZChpdGVtX25hbWUpCisKKyAgICAjCisgICAgIyBDYWxsZWQgZm9yIGVhY2ggdHlwZSAtLSBpZiB0aGUgdHlwZSBpcyBhIHN0cnVjdC91bmlvbiwgZ3JhYiB0aGUgbWV0YWRhdGEKKyAgICBkZWYgZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgIHR5cGVFbGVtID0gdHlwZWluZm8uZWxlbQorICAgICAgICAjIElmIHRoZSB0eXBlIGlzIGEgc3RydWN0IHR5cGUsIHRyYXZlcnNlIHRoZSBpbWJlZGRlZCA8bWVtYmVyPiB0YWdzIGdlbmVyYXRpbmcgYSBzdHJ1Y3R1cmUuCisgICAgICAgICMgT3RoZXJ3aXNlLCBlbWl0IHRoZSB0YWcgdGV4dC4KKyAgICAgICAgY2F0ZWdvcnkgPSB0eXBlRWxlbS5nZXQoJ2NhdGVnb3J5JykKKyAgICAgICAgaWYgY2F0ZWdvcnkgPT0gJ2hhbmRsZSc6CisgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICBzZWxmLm9iamVjdF90eXBlX2FsaWFzZXMuYXBwZW5kKChuYW1lLGFsaWFzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vYmplY3RfdHlwZXMuYXBwZW5kKG5hbWUpCisgICAgICAgIGVsaWYgKGNhdGVnb3J5ID09ICdzdHJ1Y3QnIG9yIGNhdGVnb3J5ID09ICd1bmlvbicpOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3ROYW1lcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIHNlbGYuZ2VuU3RydWN0KHR5cGVpbmZvLCBuYW1lLCBhbGlhcykKKyAgICAjCisgICAgIyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBhIHBvaW50ZXIKKyAgICBkZWYgcGFyYW1Jc1BvaW50ZXIoc2VsZiwgcGFyYW0pOgorICAgICAgICBpc3BvaW50ZXIgPSBGYWxzZQorICAgICAgICBmb3IgZWxlbSBpbiBwYXJhbToKKyAgICAgICAgICAgIGlmIGVsZW0udGFnID09ICd0eXBlJyBhbmQgZWxlbS50YWlsIGlzIG5vdCBOb25lIGFuZCAnKicgaW4gZWxlbS50YWlsOgorICAgICAgICAgICAgICAgIGlzcG9pbnRlciA9IFRydWUKKyAgICAgICAgcmV0dXJuIGlzcG9pbnRlcgorICAgICMKKyAgICAjIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGEgc3RhdGljIGFycmF5CisgICAgZGVmIHBhcmFtSXNTdGF0aWNBcnJheShzZWxmLCBwYXJhbSk6CisgICAgICAgIGlzc3RhdGljYXJyYXkgPSAwCisgICAgICAgIHBhcmFtbmFtZSA9IHBhcmFtLmZpbmQoJ25hbWUnKQorICAgICAgICBpZiAocGFyYW1uYW1lLnRhaWwgaXMgbm90IE5vbmUpIGFuZCAoJ1snIGluIHBhcmFtbmFtZS50YWlsKToKKyAgICAgICAgICAgIGlzc3RhdGljYXJyYXkgPSBwYXJhbW5hbWUudGFpbC5jb3VudCgnWycpCisgICAgICAgIHJldHVybiBpc3N0YXRpY2FycmF5CisgICAgIworICAgICMgUmV0cmlldmUgdGhlIHR5cGUgYW5kIG5hbWUgZm9yIGEgcGFyYW1ldGVyCisgICAgZGVmIGdldFR5cGVOYW1lVHVwbGUoc2VsZiwgcGFyYW0pOgorICAgICAgICB0eXBlID0gJycKKyAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gJ3R5cGUnOgorICAgICAgICAgICAgICAgIHR5cGUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgICAgIGVsaWYgZWxlbS50YWcgPT0gJ25hbWUnOgorICAgICAgICAgICAgICAgIG5hbWUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgcmV0dXJuICh0eXBlLCBuYW1lKQorICAgICMgRXh0cmFjdCBsZW5ndGggdmFsdWVzIGZyb20gbGF0ZXhtYXRoLiAgQ3VycmVudGx5IGFuIGluZmxleGlibGUgc29sdXRpb24gdGhhdCBsb29rcyBmb3Igc3BlY2lmaWMKKyAgICAjIHBhdHRlcm5zIHRoYXQgYXJlIGZvdW5kIGluIHZrLnhtbC4gIFdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIHdoZW4gbmV3IHBhdHRlcm5zIGFyZSBpbnRyb2R1Y2VkLgorICAgIGRlZiBwYXJzZUxhdGVYTWF0aChzZWxmLCBzb3VyY2UpOgorICAgICAgICBuYW1lID0gJ0VSUk9SJworICAgICAgICBkZWNvcmF0ZWROYW1lID0gJ0VSUk9SJworICAgICAgICBpZiAnbWF0aGl0JyBpbiBzb3VyY2U6CisgICAgICAgICAgICAjIE1hdGNoZXMgZXhwcmVzc2lvbnMgc2ltaWxhciB0byAnbGF0ZXhtYXRoOltcbGNlaWx7XG1hdGhpdHtyYXN0ZXJpemF0aW9uU2FtcGxlc30gXG92ZXIgMzJ9XHJjZWlsXScKKyAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gocidsYXRleG1hdGhccypcOlxzKlxbXHMqXFxsKFx3Kylccypce1xzKlxcbWF0aGl0XHMqXHtccyooXHcrKVxzKlx9XHMqXFxvdmVyXHMqKFxkKylccypcfVxzKlxccihcdyspXHMqXF0nLCBzb3VyY2UpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2ggb3IgbWF0Y2guZ3JvdXAoMSkgIT0gbWF0Y2guZ3JvdXAoNCk6CisgICAgICAgICAgICAgICAgcmFpc2UgJ1VucmVjb2duaXplZCBsYXRleG1hdGggZXhwcmVzc2lvbicKKyAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgIyBOZWVkIHRvIGFkZCAxIGZvciBjZWlsaW5nIGZ1bmN0aW9uOyBvdGhlcndpc2UsIHRoZSBhbGxvY2F0ZWQgcGFja2V0CisgICAgICAgICAgICAjIHNpemUgd2lsbCBiZSBsZXNzIHRoYW4gbmVlZGVkIGR1cmluZyBjYXB0dXJlIGZvciBzb21lIHRpdGxlIHdoaWNoIHVzZQorICAgICAgICAgICAgIyB0aGlzIGluIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby4gYmFzZWQgb24gY2VpbGluZyBmdW5jdGlvbgorICAgICAgICAgICAgIyBkZWZpbml0aW9uLGl0IGlzICd7MH0lezF9P3swfS97MX0gKyAxOnswfS97MX0nLmZvcm1hdCgqbWF0Y2guZ3JvdXAoMiwgMykpLAorICAgICAgICAgICAgIyBpdHMgdmFsdWUgPD0gJ3t9L3t9ICsgMScuCisgICAgICAgICAgICBpZiBtYXRjaC5ncm91cCgxKSA9PSAnY2VpbCc6CisgICAgICAgICAgICAgICAgZGVjb3JhdGVkTmFtZSA9ICd7fS97fSArIDEnLmZvcm1hdCgqbWF0Y2guZ3JvdXAoMiwgMykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlY29yYXRlZE5hbWUgPSAne30ve30nLmZvcm1hdCgqbWF0Y2guZ3JvdXAoMiwgMykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE1hdGNoZXMgZXhwcmVzc2lvbnMgc2ltaWxhciB0byAnbGF0ZXhtYXRoIDogW2RhdGFTaXplIFxvdmVyIDRdJworICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyJ2xhdGV4bWF0aFxzKlw6XHMqXFtccyooXFx0ZXh0cm1ceyk/KFx3KylcfT9ccypcXG92ZXJccyooXGQrKVxzKlxdJywgc291cmNlKQorICAgICAgICAgICAgbmFtZSA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBkZWNvcmF0ZWROYW1lID0gJ3t9L3t9Jy5mb3JtYXQoKm1hdGNoLmdyb3VwKDIsIDMpKQorICAgICAgICByZXR1cm4gbmFtZSwgZGVjb3JhdGVkTmFtZQorICAgICMKKyAgICAjIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgbGVuIHRhZworICAgIGRlZiBnZXRMZW4oc2VsZiwgcGFyYW0pOgorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIGxlbiA9IHBhcmFtLmF0dHJpYi5nZXQoJ2xlbicpCisgICAgICAgIGlmIGxlbiBhbmQgbGVuICE9ICdudWxsLXRlcm1pbmF0ZWQnOgorICAgICAgICAgICAgIyBGb3Igc3RyaW5nIGFycmF5cywgJ2xlbicgY2FuIGxvb2sgbGlrZSAnY291bnQsbnVsbC10ZXJtaW5hdGVkJywgaW5kaWNhdGluZyB0aGF0IHdlCisgICAgICAgICAgICAjIGhhdmUgYSBudWxsIHRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncy4gIFdlIHN0cmlwIHRoZSBudWxsLXRlcm1pbmF0ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICMgJ2xlbicgZmllbGQgYW5kIG9ubHkgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgc3RyaW5nIGNvdW50CisgICAgICAgICAgICBpZiAnbnVsbC10ZXJtaW5hdGVkJyBpbiBsZW46CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuLnNwbGl0KCcsJylbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuCisgICAgICAgICAgICBpZiAnbGF0ZXhtYXRoJyBpbiBsZW46CisgICAgICAgICAgICAgICAgcGFyYW1fdHlwZSwgcGFyYW1fbmFtZSA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShwYXJhbSkKKyAgICAgICAgICAgICAgICBsZW5fbmFtZSwgcmVzdWx0ID0gc2VsZi5wYXJzZUxhdGVYTWF0aChsZW4pCisgICAgICAgICAgICAjIFNwZWMgaGFzIG5vdyBub3RhdGlvbiBmb3IgbGVuIGF0dHJpYnV0ZXMsIHVzaW5nIDo6IGluc3RlYWQgb2YgcGxhdGZvcm0gc3BlY2lmaWMgcG9pbnRlciBzeW1ib2wKKyAgICAgICAgICAgIHJlc3VsdCA9IHN0cihyZXN1bHQpLnJlcGxhY2UoJzo6JywgJy0+JykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICMKKyAgICAjIENoZWNrIGlmIGEgc3RydWN0dXJlIGlzIG9yIGNvbnRhaW5zIGEgZGlzcGF0Y2hhYmxlIChkaXNwYXRjaGFibGUgPSBUcnVlKSBvcgorICAgICMgbm9uLWRpc3BhdGNoYWJsZSAoZGlzcGF0Y2hhYmxlID0gRmFsc2UpIGhhbmRsZQorICAgIGRlZiBUeXBlQ29udGFpbnNPYmplY3RIYW5kbGUoc2VsZiwgaGFuZGxlX3R5cGUsIGRpc3BhdGNoYWJsZSk6CisgICAgICAgIGlmIGRpc3BhdGNoYWJsZToKKyAgICAgICAgICAgIHR5cGVfY2hlY2sgPSBzZWxmLmhhbmRsZV90eXBlcy5Jc0Rpc3BhdGNoYWJsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHlwZV9jaGVjayA9IHNlbGYuaGFuZGxlX3R5cGVzLklzTm9uRGlzcGF0Y2hhYmxlCisgICAgICAgIGlmIHR5cGVfY2hlY2soaGFuZGxlX3R5cGUpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBpZiBoYW5kbGVfdHlwZSBpcyBhIHN0cnVjdCwgc2VhcmNoIGl0cyBtZW1iZXJzCisgICAgICAgIGlmIGhhbmRsZV90eXBlIGluIHNlbGYuc3RydWN0TmFtZXM6CisgICAgICAgICAgICBtZW1iZXJfaW5kZXggPSBuZXh0KChpIGZvciBpLCB2IGluIGVudW1lcmF0ZShzZWxmLnN0cnVjdE1lbWJlcnMpIGlmIHZbMF0gPT0gaGFuZGxlX3R5cGUpLCBOb25lKQorICAgICAgICAgICAgaWYgbWVtYmVyX2luZGV4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuc3RydWN0TWVtYmVyc1ttZW1iZXJfaW5kZXhdLm1lbWJlcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIHR5cGVfY2hlY2soaXRlbS50eXBlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgICMKKyAgICAjIEdlbmVyYXRlIGxvY2FsIHJlYWR5LWFjY2VzcyBkYXRhIGRlc2NyaWJpbmcgVnVsa2FuIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyBmcm9tIHRoZSBYTUwgbWV0YWRhdGEKKyAgICBkZWYgZ2VuU3RydWN0KHNlbGYsIHR5cGVpbmZvLCB0eXBlTmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuU3RydWN0KHNlbGYsIHR5cGVpbmZvLCB0eXBlTmFtZSwgYWxpYXMpCisgICAgICAgIG1lbWJlcnMgPSB0eXBlaW5mby5lbGVtLmZpbmRhbGwoJy4vL21lbWJlcicpCisgICAgICAgICMgSXRlcmF0ZSBvdmVyIG1lbWJlcnMgb25jZSB0byBnZXQgbGVuZ3RoIHBhcmFtZXRlcnMgZm9yIGFycmF5cworICAgICAgICBsZW5zID0gc2V0KCkKKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgbGVuID0gc2VsZi5nZXRMZW4obWVtYmVyKQorICAgICAgICAgICAgaWYgbGVuOgorICAgICAgICAgICAgICAgIGxlbnMuYWRkKGxlbikKKyAgICAgICAgIyBHZW5lcmF0ZSBtZW1iZXIgaW5mbworICAgICAgICBtZW1iZXJzSW5mbyA9IFtdCisgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgICMgR2V0IHRoZSBtZW1iZXIncyB0eXBlIGFuZCBuYW1lCisgICAgICAgICAgICBpbmZvID0gc2VsZi5nZXRUeXBlTmFtZVR1cGxlKG1lbWJlcikKKyAgICAgICAgICAgIHR5cGUgPSBpbmZvWzBdCisgICAgICAgICAgICBuYW1lID0gaW5mb1sxXQorICAgICAgICAgICAgY2RlY2wgPSBzZWxmLm1ha2VDUGFyYW1EZWNsKG1lbWJlciwgMSkKKyAgICAgICAgICAgICMgUHJvY2VzcyBWa1N0cnVjdHVyZVR5cGUKKyAgICAgICAgICAgIGlmIHR5cGUgPT0gJ1ZrU3RydWN0dXJlVHlwZSc6CisgICAgICAgICAgICAgICAgIyBFeHRyYWN0IHRoZSByZXF1aXJlZCBzdHJ1Y3QgdHlwZSB2YWx1ZSBmcm9tIHRoZSBjb21tZW50cworICAgICAgICAgICAgICAgICMgZW1iZWRkZWQgaW4gdGhlIG9yaWdpbmFsIHRleHQgZGVmaW5pbmcgdGhlICd0eXBlaW5mbycgZWxlbWVudAorICAgICAgICAgICAgICAgIHJhd1htbCA9IGV0cmVlLnRvc3RyaW5nKHR5cGVpbmZvLmVsZW0pLmRlY29kZSgnYXNjaWknKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlLnNlYXJjaChyJ1ZLX1NUUlVDVFVSRV9UWVBFX1x3KycsIHJhd1htbCkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0Lmdyb3VwKDApCisgICAgICAgICAgICAgICAgICAgICMgU3RvcmUgdGhlIHJlcXVpcmVkIHR5cGUgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJ1Y3RUeXBlc1t0eXBlTmFtZV0gPSBzZWxmLlN0cnVjdFR5cGUobmFtZT1uYW1lLCB2YWx1ZT12YWx1ZSkKKyAgICAgICAgICAgICMgU3RvcmUgcG9pbnRlci9hcnJheS9zdHJpbmcgaW5mbworICAgICAgICAgICAgaXNzdGF0aWNhcnJheSA9IHNlbGYucGFyYW1Jc1N0YXRpY0FycmF5KG1lbWJlcikKKyAgICAgICAgICAgIHN0cnVjdGV4dGVuZHMgPSBGYWxzZQorICAgICAgICAgICAgbWVtYmVyc0luZm8uYXBwZW5kKHNlbGYuQ29tbWFuZFBhcmFtKHR5cGU9dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNwb2ludGVyPXNlbGYucGFyYW1Jc1BvaW50ZXIobWVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N0YXRpY2FycmF5PWlzc3RhdGljYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNjb25zdD1UcnVlIGlmICdjb25zdCcgaW4gY2RlY2wgZWxzZSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2NvdW50PVRydWUgaWYgbmFtZSBpbiBsZW5zIGVsc2UgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuPXNlbGYuZ2V0TGVuKG1lbWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0c3RydWN0cz1zZWxmLnJlZ2lzdHJ5LnZhbGlkZXh0ZW5zaW9uc3RydWN0c1t0eXBlTmFtZV0gaWYgbmFtZSA9PSAncE5leHQnIGVsc2UgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGVjbD1jZGVjbCkpCisgICAgICAgICMgSWYgdGhpcyBzdHJ1Y3QgZXh0ZW5kcyBhbm90aGVyLCBrZWVwIGl0cyBuYW1lIGluIGxpc3QgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgICAgICBpZiB0eXBlaW5mby5lbGVtLmF0dHJpYi5nZXQoJ3N0cnVjdGV4dGVuZHMnKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3RydWN0ZXh0ZW5kc19saXN0LmFwcGVuZCh0eXBlTmFtZSkKKyAgICAgICAgc2VsZi5zdHJ1Y3RNZW1iZXJzLmFwcGVuZChzZWxmLlN0cnVjdE1lbWJlckRhdGEobmFtZT10eXBlTmFtZSwgbWVtYmVycz1tZW1iZXJzSW5mbywgaWZkZWZfcHJvdGVjdD1zZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QpKQorICAgICMKKyAgICAjIEVudW1fc3RyaW5nX2hlYWRlcjogQ3JlYXRlIGEgcm91dGluZSB0byBjb252ZXJ0IGFuIGVudW1lcmF0ZWQgdmFsdWUgaW50byBhIHN0cmluZworICAgIGRlZiBHZW5lcmF0ZUVudW1TdHJpbmdDb252ZXJzaW9uKHNlbGYsIGdyb3VwTmFtZSwgdmFsdWVfbGlzdCk6CisgICAgICAgIG91dHN0cmluZyA9ICdcbicKKyAgICAgICAgaWYgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICdcbiNpZmRlZiAlc1xuXG4nICUgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0CisgICAgICAgIG91dHN0cmluZyArPSAnc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBzdHJpbmdfJXMoJXMgaW5wdXRfdmFsdWUpXG4nICUgKGdyb3VwTmFtZSwgZ3JvdXBOYW1lKQorICAgICAgICBvdXRzdHJpbmcgKz0gJ3tcbicKKyAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgc3dpdGNoICgoJXMpaW5wdXRfdmFsdWUpXG4nICUgZ3JvdXBOYW1lCisgICAgICAgIG91dHN0cmluZyArPSAnICAgIHtcbicKKyAgICAgICAgIyBFbWl0IHRoZXNlIGluIGEgcmVwZWF0YWJsZSBvcmRlciBzbyBmaWxlIGlzIGdlbmVyYXRlZCB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzIGVhY2ggdGltZS4KKyAgICAgICAgIyBUaGlzIGhlbHBzIGNvbXBpbGVyIGNhY2hpbmcgc3lzdGVtcyBsaWtlIGNjYWNoZS4KKyAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkKHZhbHVlX2xpc3QpOgorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgICAgIGNhc2UgJXM6XG4nICUgaXRlbQorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgICAgICAgICByZXR1cm4gIiVzIjtcbicgJSBpdGVtCisgICAgICAgIG91dHN0cmluZyArPSAnICAgICAgICBkZWZhdWx0OlxuJworICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkICVzIjtcbicgJSBncm91cE5hbWUKKyAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgfVxuJworICAgICAgICBvdXRzdHJpbmcgKz0gJ31cbicKKworICAgICAgICBiaXRzSW5kZXggPSBncm91cE5hbWUuZmluZCgnQml0cycpCisgICAgICAgIGlmIChiaXRzSW5kZXggIT0gLTEpOgorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICdcbicKKyAgICAgICAgICAgIGZsYWdzTmFtZSA9IGdyb3VwTmFtZVswOmJpdHNJbmRleF0gKyAicyIgKyAgZ3JvdXBOYW1lW2JpdHNJbmRleCs0Ol0KKyAgICAgICAgICAgIG91dHN0cmluZyArPSAnc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmdfJXMoJXMgaW5wdXRfdmFsdWUpXG4nICUgKGZsYWdzTmFtZSwgZmxhZ3NOYW1lKQorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICd7XG4nCisgICAgICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICBzdGQ6OnN0cmluZyByZXQ7XG4nCisgICAgICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICBpbnQgaW5kZXggPSAwO1xuJworICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgd2hpbGUoaW5wdXRfdmFsdWUpIHtcbicKKyAgICAgICAgICAgIG91dHN0cmluZyArPSAnICAgICAgICBpZiAoaW5wdXRfdmFsdWUgJiAxKSB7XG4nCisgICAgICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICAgICAgICAgIGlmKCAhcmV0LmVtcHR5KCkpIHJldC5hcHBlbmQoInwiKTtcbicKKyAgICAgICAgICAgIG91dHN0cmluZyArPSAnICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmdfJXMoc3RhdGljX2Nhc3Q8JXM+KDEgPDwgaW5kZXgpKSk7XG4nICUgKGdyb3VwTmFtZSwgZ3JvdXBOYW1lKQorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgICAgIH1cbicKKyAgICAgICAgICAgIG91dHN0cmluZyArPSAnICAgICAgICArK2luZGV4O1xuJworICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgICAgIGlucHV0X3ZhbHVlID4+PSAxO1xuJworICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgfVxuJworICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcgICAgaWYoIHJldC5lbXB0eSgpKSByZXQuYXBwZW5kKHN0cmluZ18lcyhzdGF0aWNfY2FzdDwlcz4oMCkpKTtcbicgJSAoZ3JvdXBOYW1lLCBncm91cE5hbWUpCisgICAgICAgICAgICBvdXRzdHJpbmcgKz0gJyAgICByZXR1cm4gcmV0O1xuJworICAgICAgICAgICAgb3V0c3RyaW5nICs9ICd9XG4nCisKKyAgICAgICAgaWYgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0c3RyaW5nICs9ICcjZW5kaWYgLy8gJXNcbicgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QKKyAgICAgICAgcmV0dXJuIG91dHN0cmluZworICAgICMKKyAgICAjIFRhY2sgb24gYSBoZWxwZXIgd2hpY2gsIGdpdmVuIGFuIGluZGV4IGludG8gYSBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgc3RydWN0dXJlLCB3aWxsIHByaW50IHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgbmFtZQorICAgIGRlZiBEZUluZGV4UGh5c0RldkZlYXR1cmVzKHNlbGYpOgorICAgICAgICBwZGV2X21lbWJlcnMgPSBOb25lCisgICAgICAgIGZvciBuYW1lLCBtZW1iZXJzLCBpZmRlZiBpbiBzZWxmLnN0cnVjdE1lbWJlcnM6CisgICAgICAgICAgICBpZiBuYW1lID09ICdWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMnOgorICAgICAgICAgICAgICAgIHBkZXZfbWVtYmVycyA9IG1lbWJlcnMKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBkZWluZGV4ID0gJ1xuJworICAgICAgICBkZWluZGV4ICs9ICdzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKiBHZXRQaHlzRGV2RmVhdHVyZVN0cmluZyh1aW50MzJfdCBpbmRleCkge1xuJworICAgICAgICBkZWluZGV4ICs9ICcgICAgY29uc3QgY2hhciAqIEluZGV4VG9QaHlzRGV2RmVhdHVyZVN0cmluZ1tdID0ge1xuJworICAgICAgICBmb3IgZmVhdHVyZSBpbiBwZGV2X21lbWJlcnM6CisgICAgICAgICAgICBkZWluZGV4ICs9ICcgICAgICAgICIlcyIsXG4nICUgZmVhdHVyZS5uYW1lCisgICAgICAgIGRlaW5kZXggKz0gJyAgICB9O1xuXG4nCisgICAgICAgIGRlaW5kZXggKz0gJyAgICByZXR1cm4gSW5kZXhUb1BoeXNEZXZGZWF0dXJlU3RyaW5nW2luZGV4XTtcbicKKyAgICAgICAgZGVpbmRleCArPSAnfVxuJworICAgICAgICByZXR1cm4gZGVpbmRleAorICAgICMKKyAgICAjIENvbWJpbmUgZW51bSBzdHJpbmcgaGVscGVyIGhlYWRlciBmaWxlIHByZWFtYmxlIHdpdGggYm9keSB0ZXh0IGFuZCByZXR1cm4KKyAgICBkZWYgR2VuZXJhdGVFbnVtU3RyaW5nSGVscGVySGVhZGVyKHNlbGYpOgorICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciA9ICdcbicKKyAgICAgICAgICAgIGVudW1fc3RyaW5nX2hlbHBlcl9oZWFkZXIgKz0gJyNwcmFnbWEgb25jZVxuJworICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciArPSAnI2lmZGVmIF9XSU4zMlxuJworICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciArPSAnI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDA2NSApXG4nCisgICAgICAgICAgICBlbnVtX3N0cmluZ19oZWxwZXJfaGVhZGVyICs9ICcjZW5kaWZcbicKKyAgICAgICAgICAgIGVudW1fc3RyaW5nX2hlbHBlcl9oZWFkZXIgKz0gJ1xuJworICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciArPSAnI2luY2x1ZGUgPHN0cmluZz5cbicKKyAgICAgICAgICAgIGVudW1fc3RyaW5nX2hlbHBlcl9oZWFkZXIgKz0gJyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+XG4nCisgICAgICAgICAgICBlbnVtX3N0cmluZ19oZWxwZXJfaGVhZGVyICs9ICdcbicKKyAgICAgICAgICAgIGVudW1fc3RyaW5nX2hlbHBlcl9oZWFkZXIgKz0gc2VsZi5lbnVtX291dHB1dAorICAgICAgICAgICAgZW51bV9zdHJpbmdfaGVscGVyX2hlYWRlciArPSBzZWxmLkRlSW5kZXhQaHlzRGV2RmVhdHVyZXMoKQorICAgICAgICAgICAgcmV0dXJuIGVudW1fc3RyaW5nX2hlbHBlcl9oZWFkZXIKKyAgICAjCisgICAgIyBIZWxwZXIgZnVuY3Rpb24gZm9yIGRlY2xhcmluZyBhIGNvdW50ZXIgdmFyaWFibGUgb25seSBvbmNlCisgICAgZGVmIERlY2xhcmVDb3VudGVyKHNlbGYsIHN0cmluZ192YXIsIGRlY2xhcmVfZmxhZyk6CisgICAgICAgIGlmIGRlY2xhcmVfZmxhZyA9PSBGYWxzZToKKyAgICAgICAgICAgIHN0cmluZ192YXIgKz0gJyAgICAgICAgdWludDMyX3QgaSA9IDA7XG4nCisgICAgICAgICAgICBkZWNsYXJlX2ZsYWcgPSBUcnVlCisgICAgICAgIHJldHVybiBzdHJpbmdfdmFyLCBkZWNsYXJlX2ZsYWcKKyAgICAjCisgICAgIyBDb21iaW5lIHNhZmUgc3RydWN0IGhlbHBlciBoZWFkZXIgZmlsZSBwcmVhbWJsZSB3aXRoIGJvZHkgdGV4dCBhbmQgcmV0dXJuCisgICAgZGVmIEdlbmVyYXRlU2FmZVN0cnVjdEhlbHBlckhlYWRlcihzZWxmKToKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX2hlYWRlciA9ICdcbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX2hlYWRlciArPSAnI3ByYWdtYSBvbmNlXG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9oZWFkZXIgKz0gJyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+XG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9oZWFkZXIgKz0gJ1xuJworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfaGVhZGVyICs9ICd2b2lkICpTYWZlUG5leHRDb3B5KGNvbnN0IHZvaWQgKnBOZXh0KTtcbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX2hlYWRlciArPSAndm9pZCBGcmVlUG5leHRDaGFpbihjb25zdCB2b2lkICpwTmV4dCk7XG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9oZWFkZXIgKz0gJ2NoYXIgKlNhZmVTdHJpbmdDb3B5KGNvbnN0IGNoYXIgKmluX3N0cmluZyk7XG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9oZWFkZXIgKz0gJ1xuJworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfaGVhZGVyICs9IHNlbGYuR2VuZXJhdGVTYWZlU3RydWN0SGVhZGVyKCkKKyAgICAgICAgcmV0dXJuIHNhZmVfc3RydWN0X2hlbHBlcl9oZWFkZXIKKyAgICAjCisgICAgIyBzYWZlX3N0cnVjdCBoZWFkZXI6IGJ1aWxkIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGhlYWRlciBmaWxlCisgICAgZGVmIEdlbmVyYXRlU2FmZVN0cnVjdEhlYWRlcihzZWxmKToKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyID0gJycKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5zdHJ1Y3RNZW1iZXJzOgorICAgICAgICAgICAgaWYgc2VsZi5OZWVkU2FmZVN0cnVjdChpdGVtKSA9PSBUcnVlOgorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnXG4nCisgICAgICAgICAgICAgICAgaWYgaXRlbS5pZmRlZl9wcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyNpZmRlZiAlc1xuJyAlIGl0ZW0uaWZkZWZfcHJvdGVjdAorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnc3RydWN0IHNhZmVfJXMge1xuJyAlIChpdGVtLm5hbWUpCisgICAgICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBpdGVtLm1lbWJlcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlci50eXBlIGluIHNlbGYuc3RydWN0TmFtZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfaW5kZXggPSBuZXh0KChpIGZvciBpLCB2IGluIGVudW1lcmF0ZShzZWxmLnN0cnVjdE1lbWJlcnMpIGlmIHZbMF0gPT0gbWVtYmVyLnR5cGUpLCBOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyX2luZGV4IGlzIG5vdCBOb25lIGFuZCBzZWxmLk5lZWRTYWZlU3RydWN0KHNlbGYuc3RydWN0TWVtYmVyc1ttZW1iZXJfaW5kZXhdKSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlci5pc3BvaW50ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgIHNhZmVfJXMqICVzO1xuJyAlIChtZW1iZXIudHlwZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcgICAgc2FmZV8lcyAlcztcbicgJSAobWVtYmVyLnR5cGUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlci5sZW4gaXMgbm90IE5vbmUgYW5kIChzZWxmLlR5cGVDb250YWluc09iamVjdEhhbmRsZShtZW1iZXIudHlwZSwgVHJ1ZSkgb3Igc2VsZi5UeXBlQ29udGFpbnNPYmplY3RIYW5kbGUobWVtYmVyLnR5cGUsIEZhbHNlKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcgICAgJXMqICVzO1xuJyAlIChtZW1iZXIudHlwZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyVzO1xuJyAlIG1lbWJlci5jZGVjbAorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgIHNhZmVfJXMoY29uc3QgJXMqIGluX3N0cnVjdCVzKTtcbicgJSAoaXRlbS5uYW1lLCBpdGVtLm5hbWUsIHNlbGYuY3VzdG9tX2NvbnN0cnVjdF9wYXJhbXMuZ2V0KGl0ZW0ubmFtZSwgJycpKQorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgIHNhZmVfJXMoY29uc3Qgc2FmZV8lcyYgc3JjKTtcbicgJSAoaXRlbS5uYW1lLCBpdGVtLm5hbWUpCisgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcgICAgc2FmZV8lcyYgb3BlcmF0b3I9KGNvbnN0IHNhZmVfJXMmIHNyYyk7XG4nICUgKGl0ZW0ubmFtZSwgaXRlbS5uYW1lKQorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgIHNhZmVfJXMoKTtcbicgJSBpdGVtLm5hbWUKKyAgICAgICAgICAgICAgICBzYWZlX3N0cnVjdF9oZWFkZXIgKz0gJyAgICB+c2FmZV8lcygpO1xuJyAlIGl0ZW0ubmFtZQorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCAlcyogaW5fc3RydWN0JXMpO1xuJyAlIChpdGVtLm5hbWUsIHNlbGYuY3VzdG9tX2NvbnN0cnVjdF9wYXJhbXMuZ2V0KGl0ZW0ubmFtZSwgJycpKQorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2hlYWRlciArPSAnICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzYWZlXyVzKiBzcmMpO1xuJyAlIChpdGVtLm5hbWUpCisgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcgICAgJXMgKnB0cigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8JXMgKj4odGhpcyk7IH1cbicgJSAoaXRlbS5uYW1lLCBpdGVtLm5hbWUpCisgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcgICAgJXMgY29uc3QgKnB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8JXMgY29uc3QgKj4odGhpcyk7IH1cbicgJSAoaXRlbS5uYW1lLCBpdGVtLm5hbWUpCisgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICd9O1xuJworICAgICAgICAgICAgICAgIGlmIGl0ZW0uaWZkZWZfcHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfaGVhZGVyICs9ICcjZW5kaWYgLy8gJXNcbicgJSBpdGVtLmlmZGVmX3Byb3RlY3QKKyAgICAgICAgcmV0dXJuIHNhZmVfc3RydWN0X2hlYWRlcgorICAgICMKKyAgICAjIEdlbmVyYXRlIGV4dGVuc2lvbiBoZWxwZXIgaGVhZGVyIGZpbGUKKyAgICBkZWYgR2VuZXJhdGVFeHRlbnNpb25IZWxwZXJIZWFkZXIoc2VsZik6CisKKyAgICAgICAgVl8xXzFfbGV2ZWxfZmVhdHVyZV9zZXQgPSBbCisgICAgICAgICAgICAnVktfVkVSU0lPTl8xXzEnLAorICAgICAgICAgICAgXQorCisgICAgICAgIFZfMV8wX2luc3RhbmNlX2V4dGVuc2lvbnNfcHJvbW90ZWRfdG9fVl8xXzFfY29yZSA9IFsKKyAgICAgICAgICAgICd2a19raHJfZGV2aWNlX2dyb3VwX2NyZWF0aW9uJywKKyAgICAgICAgICAgICd2a19raHJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzJywKKyAgICAgICAgICAgICd2a19raHJfZXh0ZXJuYWxfbWVtb3J5X2NhcGFiaWxpdGllcycsCisgICAgICAgICAgICAndmtfa2hyX2V4dGVybmFsX3NlbWFwaG9yZV9jYXBhYmlsaXRpZXMnLAorICAgICAgICAgICAgJ3ZrX2tocl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXNfMicsCisgICAgICAgICAgICBdCisKKyAgICAgICAgVl8xXzBfZGV2aWNlX2V4dGVuc2lvbnNfcHJvbW90ZWRfdG9fVl8xXzFfY29yZSA9IFsKKyAgICAgICAgICAgICd2a19raHJfMTZiaXRfc3RvcmFnZScsCisgICAgICAgICAgICAndmtfa2hyX2JpbmRfbWVtb3J5XzInLAorICAgICAgICAgICAgJ3ZrX2tocl9kZWRpY2F0ZWRfYWxsb2NhdGlvbicsCisgICAgICAgICAgICAndmtfa2hyX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlJywKKyAgICAgICAgICAgICd2a19raHJfZGV2aWNlX2dyb3VwJywKKyAgICAgICAgICAgICd2a19raHJfZXh0ZXJuYWxfZmVuY2UnLAorICAgICAgICAgICAgJ3ZrX2tocl9leHRlcm5hbF9tZW1vcnknLAorICAgICAgICAgICAgJ3ZrX2tocl9leHRlcm5hbF9zZW1hcGhvcmUnLAorICAgICAgICAgICAgJ3ZrX2tocl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50c18yJywKKyAgICAgICAgICAgICd2a19raHJfbWFpbnRlbmFuY2UxJywKKyAgICAgICAgICAgICd2a19raHJfbWFpbnRlbmFuY2UyJywKKyAgICAgICAgICAgICd2a19raHJfbWFpbnRlbmFuY2UzJywKKyAgICAgICAgICAgICd2a19raHJfbXVsdGl2aWV3JywKKyAgICAgICAgICAgICd2a19raHJfcmVsYXhlZF9ibG9ja19sYXlvdXQnLAorICAgICAgICAgICAgJ3ZrX2tocl9zYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24nLAorICAgICAgICAgICAgJ3ZrX2tocl9zaGFkZXJfZHJhd19wYXJhbWV0ZXJzJywKKyAgICAgICAgICAgICd2a19raHJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcycsCisgICAgICAgICAgICAndmtfa2hyX3ZhcmlhYmxlX3BvaW50ZXJzJywKKyAgICAgICAgICAgIF0KKworICAgICAgICBvdXRwdXQgPSBbCisgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICcjaWZuZGVmIFZLX0VYVEVOU0lPTl9IRUxQRVJfSF8nLAorICAgICAgICAgICAgJyNkZWZpbmUgVktfRVhURU5TSU9OX0hFTFBFUl9IXycsCisgICAgICAgICAgICAnI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+JywKKyAgICAgICAgICAgICcjaW5jbHVkZSA8c3RyaW5nPicsCisgICAgICAgICAgICAnI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+JywKKyAgICAgICAgICAgICcjaW5jbHVkZSA8dXRpbGl0eT4nLAorICAgICAgICAgICAgJyNpbmNsdWRlIDxzZXQ+JywKKyAgICAgICAgICAgICcjaW5jbHVkZSA8dmVjdG9yPicsCisgICAgICAgICAgICAnI2luY2x1ZGUgPGNhc3NlcnQ+JywKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+JywKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJyNkZWZpbmUgVktfVkVSU0lPTl8xXzFfTkFNRSAiVktfVkVSU0lPTl8xXzEiJywKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJ2VudW0gRXh0RW5hYmxlZCA6IHVuc2lnbmVkIGNoYXIgeycsCisgICAgICAgICAgICAnICAgIGtOb3RFbmFibGVkLCcsCisgICAgICAgICAgICAnICAgIGtFbmFibGVkQnlDcmVhdGVpbmZvLCcsCisgICAgICAgICAgICAnICAgIGtFbmFibGVkQnlBcGlMZXZlbCwnLAorICAgICAgICAgICAgJ307JywKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJ3N0YXRpYyBib29sIElzRXh0RW5hYmxlZChFeHRFbmFibGVkIGZlYXR1cmUpIHsnLAorICAgICAgICAgICAgJyAgICBpZiAoZmVhdHVyZSA9PSBrTm90RW5hYmxlZCkgcmV0dXJuIGZhbHNlOycsCisgICAgICAgICAgICAnICAgIHJldHVybiB0cnVlOycsCisgICAgICAgICAgICAnfTsnLAorICAgICAgICAgICAgJyddCisKKyAgICAgICAgZGVmIGd1YXJkZWQoaWZkZWYsIHZhbHVlKToKKyAgICAgICAgICAgIGlmIGlmZGVmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiAnXG4nLmpvaW4oWyAnI2lmZGVmICVzJyAlIGlmZGVmLCB2YWx1ZSwgJyNlbmRpZicgXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgZm9yIHR5cGUgaW4gWydJbnN0YW5jZScsICdEZXZpY2UnXToKKyAgICAgICAgICAgIHN0cnVjdF90eXBlID0gJyVzRXh0ZW5zaW9ucycgJSB0eXBlCisgICAgICAgICAgICBpZiB0eXBlID09ICdJbnN0YW5jZSc6CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2RpY3QgPSBzZWxmLmluc3RhbmNlX2V4dGVuc2lvbl9pbmZvCisgICAgICAgICAgICAgICAgcHJvbW90ZWRfZXh0X2xpc3QgPSBWXzFfMF9pbnN0YW5jZV9leHRlbnNpb25zX3Byb21vdGVkX3RvX1ZfMV8xX2NvcmUKKyAgICAgICAgICAgICAgICBzdHJ1Y3RfZGVjbCA9ICdzdHJ1Y3QgJXMgeycgJSBzdHJ1Y3RfdHlwZQorICAgICAgICAgICAgICAgIGluc3RhbmNlX3N0cnVjdF90eXBlID0gc3RydWN0X3R5cGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2RpY3QgPSBzZWxmLmRldmljZV9leHRlbnNpb25faW5mbworICAgICAgICAgICAgICAgIHByb21vdGVkX2V4dF9saXN0ID0gVl8xXzBfZGV2aWNlX2V4dGVuc2lvbnNfcHJvbW90ZWRfdG9fVl8xXzFfY29yZQorICAgICAgICAgICAgICAgIHN0cnVjdF9kZWNsID0gJ3N0cnVjdCAlcyA6IHB1YmxpYyAlcyB7JyAlIChzdHJ1Y3RfdHlwZSwgaW5zdGFuY2Vfc3RydWN0X3R5cGUpCisKKyAgICAgICAgICAgIGV4dGVuc2lvbl9pdGVtcyA9IHNvcnRlZChleHRlbnNpb25fZGljdC5pdGVtcygpKQorCisgICAgICAgICAgICBmaWVsZF9uYW1lID0geyBleHRfbmFtZTogcmUuc3ViKCdfZXh0ZW5zaW9uX25hbWUnLCAnJywgaW5mb1snZGVmaW5lJ10ubG93ZXIoKSkgZm9yIGV4dF9uYW1lLCBpbmZvIGluIGV4dGVuc2lvbl9pdGVtcyB9CisKKyAgICAgICAgICAgICMgQWRkIGluIHBzZXVkby1leHRlbnNpb25zIGZvciBjb3JlIEFQSSB2ZXJzaW9ucyBzbyByZWFsIGV4dGVuc2lvbnMgY2FuIGRlcGVuZCBvbiB0aGVtCisgICAgICAgICAgICBleHRlbnNpb25fZGljdFsnVktfVkVSU0lPTl8xXzEnXSA9IHsnZGVmaW5lJzoiVktfVkVSU0lPTl8xXzFfTkFNRSIsICdpZmRlZic6Tm9uZSwgJ3JlcXMnOltdfQorICAgICAgICAgICAgZmllbGRfbmFtZVsnVktfVkVSU0lPTl8xXzEnXSA9ICJ2a19mZWF0dXJlX3ZlcnNpb25fMV8xIgorCisgICAgICAgICAgICBpZiB0eXBlID09ICdJbnN0YW5jZSc6CisgICAgICAgICAgICAgICAgaW5zdGFuY2VfZmllbGRfbmFtZSA9IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICBpbnN0YW5jZV9leHRlbnNpb25fZGljdCA9IGV4dGVuc2lvbl9kaWN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgR2V0IGNvbXBsZXRlIGZpZWxkIG5hbWUgYW5kIGV4dGVuc2lvbiBkYXRhIGZvciBib3RoIEluc3RhbmNlIGFuZCBEZXZpY2UgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIGZpZWxkX25hbWUudXBkYXRlKGluc3RhbmNlX2ZpZWxkX25hbWUpCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2RpY3QgPSBleHRlbnNpb25fZGljdC5jb3B5KCkgICMgRG9uJ3QgbW9kaWZ5IHRoZSBzZWxmLjxkaWN0PiB3ZSdyZSBwb2ludGluZyB0bworICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9kaWN0LnVwZGF0ZShpbnN0YW5jZV9leHRlbnNpb25fZGljdCkKKworICAgICAgICAgICAgIyBPdXRwdXQgdGhlIGRhdGEgbWVtYmVyIGxpc3QKKyAgICAgICAgICAgIHN0cnVjdCAgPSBbc3RydWN0X2RlY2xdCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsgJyAgICBFeHRFbmFibGVkIHZrX2ZlYXR1cmVfdmVyc2lvbl8xXzF7a05vdEVuYWJsZWR9OyddKQorICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbICcgICAgRXh0RW5hYmxlZCAlc3trTm90RW5hYmxlZH07JyAlIGZpZWxkX25hbWVbZXh0X25hbWVdIGZvciBleHRfbmFtZSwgaW5mbyBpbiBleHRlbnNpb25faXRlbXNdKQorCisgICAgICAgICAgICAjIENvbnN0cnVjdCB0aGUgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIG1hcCAtLSBtYXBwaW5nIG5hbWUgdG8gZGF0YSBtZW1iZXIgKGZpZWxkKSwgYW5kIHJlcXVpcmVkIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICMgVGhlIG1hcCBpcyBjb250YWluZWQgd2l0aGluIGEgc3RhdGljIGZ1bmN0aW9uIG1lbWJlciBmb3IgcG9ydGFiaWxpdHkgcmVhc29ucy4KKyAgICAgICAgICAgIGluZm9fdHlwZSA9ICclc0luZm8nICUgdHlwZQorICAgICAgICAgICAgaW5mb19tYXBfdHlwZSA9ICclc01hcCcgJSBpbmZvX3R5cGUKKyAgICAgICAgICAgIHJlcV90eXBlID0gJyVzUmVxJyAlIHR5cGUKKyAgICAgICAgICAgIHJlcV92ZWNfdHlwZSA9ICclc1ZlYycgJSByZXFfdHlwZQorICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbCisgICAgICAgICAgICAgICAgJycsCisgICAgICAgICAgICAgICAgJyAgICBzdHJ1Y3QgJXMgeycgJSByZXFfdHlwZSwKKyAgICAgICAgICAgICAgICAnICAgICAgICBjb25zdCBFeHRFbmFibGVkICVzOjoqIGVuYWJsZWQ7JyAlIHN0cnVjdF90eXBlLAorICAgICAgICAgICAgICAgICcgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7JywKKyAgICAgICAgICAgICAgICAnICAgIH07JywKKyAgICAgICAgICAgICAgICAnICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8JXM+ICVzOycgJSAocmVxX3R5cGUsIHJlcV92ZWNfdHlwZSksCisgICAgICAgICAgICAgICAgJyAgICBzdHJ1Y3QgJXMgeycgJSBpbmZvX3R5cGUsCisgICAgICAgICAgICAgICAgJyAgICAgICAlcyhFeHRFbmFibGVkICVzOjoqIHN0YXRlXywgY29uc3QgJXMgcmVxdWlyZXNfKTogc3RhdGUoc3RhdGVfKSwgcmVxdWlyZXMocmVxdWlyZXNfKSB7fScgJSAoIGluZm9fdHlwZSwgc3RydWN0X3R5cGUsIHJlcV92ZWNfdHlwZSksCisgICAgICAgICAgICAgICAgJyAgICAgICBFeHRFbmFibGVkICVzOjoqIHN0YXRlOycgJSBzdHJ1Y3RfdHlwZSwKKyAgICAgICAgICAgICAgICAnICAgICAgICVzIHJlcXVpcmVzOycgJSByZXFfdmVjX3R5cGUsCisgICAgICAgICAgICAgICAgJyAgICB9OycsCisgICAgICAgICAgICAgICAgJycsCisgICAgICAgICAgICAgICAgJyAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywlcz4gJXM7JyAlIChpbmZvX3R5cGUsIGluZm9fbWFwX3R5cGUpLAorICAgICAgICAgICAgICAgICcgICAgc3RhdGljIGNvbnN0ICVzICZnZXRfaW5mbyhjb25zdCBjaGFyICpuYW1lKSB7JyAlaW5mb190eXBlLAorICAgICAgICAgICAgICAgICcgICAgICAgIHN0YXRpYyBjb25zdCAlcyBpbmZvX21hcCA9IHsnICUgaW5mb19tYXBfdHlwZSBdKQorICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJWS19WRVJTSU9OXzFfMSIsICVzSW5mbygmJXNFeHRlbnNpb25zOjp2a19mZWF0dXJlX3ZlcnNpb25fMV8xLCB7fSkpLCcgJSAodHlwZSwgdHlwZSldKQorCisgICAgICAgICAgICBmaWVsZF9mb3JtYXQgPSAnJicgKyBzdHJ1Y3RfdHlwZSArICc6OiVzJworICAgICAgICAgICAgcmVxX2Zvcm1hdCA9ICd7JyArIGZpZWxkX2Zvcm1hdCsgJywgJXN9JworICAgICAgICAgICAgcmVxX2luZGVudCA9ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgIHJlcV9qb2luID0gJywnICsgcmVxX2luZGVudAorICAgICAgICAgICAgaW5mb19mb3JtYXQgPSAoJyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCVzLCAnICsgaW5mb190eXBlICsgJygnICsgZmllbGRfZm9ybWF0ICsgJywgeyVzfSkpLCcpCisgICAgICAgICAgICBkZWYgZm9ybWF0X2luZm8oZXh0X25hbWUsIGluZm8pOgorICAgICAgICAgICAgICAgIHJlcXMgPSByZXFfam9pbi5qb2luKFtyZXFfZm9ybWF0ICUgKGZpZWxkX25hbWVbcmVxXSwgZXh0ZW5zaW9uX2RpY3RbcmVxXVsnZGVmaW5lJ10pIGZvciByZXEgaW4gaW5mb1sncmVxcyddXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mb19mb3JtYXQgJSAoaW5mb1snZGVmaW5lJ10sIGZpZWxkX25hbWVbZXh0X25hbWVdLCAneyVzfScgJSAocmVxX2luZGVudCArIHJlcXMpIGlmIHJlcXMgZWxzZSAnJykKKworICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbZ3VhcmRlZChpbmZvWydpZmRlZiddLCBmb3JtYXRfaW5mbyhleHRfbmFtZSwgaW5mbykpIGZvciBleHRfbmFtZSwgaW5mbyBpbiBleHRlbnNpb25faXRlbXNdKQorICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbCisgICAgICAgICAgICAgICAgJyAgICAgICAgfTsnLAorICAgICAgICAgICAgICAgICcnLAorICAgICAgICAgICAgICAgICcgICAgICAgIHN0YXRpYyBjb25zdCAlcyBlbXB0eV9pbmZvIHtudWxscHRyLCAlcygpfTsnICUgKGluZm9fdHlwZSwgcmVxX3ZlY190eXBlKSwKKyAgICAgICAgICAgICAgICAnICAgICAgICAlczo6Y29uc3RfaXRlcmF0b3IgaW5mbyA9IGluZm9fbWFwLmZpbmQobmFtZSk7JyAlIGluZm9fbWFwX3R5cGUsCisgICAgICAgICAgICAgICAgJyAgICAgICAgaWYgKCBpbmZvICE9IGluZm9fbWFwLmNlbmQoKSkgeycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHJldHVybiBpbmZvLT5zZWNvbmQ7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICB9JywKKyAgICAgICAgICAgICAgICAnICAgICAgICByZXR1cm4gZW1wdHlfaW5mbzsnLAorICAgICAgICAgICAgICAgICcgICAgfScsCisgICAgICAgICAgICAgICAgJyddKQorCisgICAgICAgICAgICBpZiB0eXBlID09ICdJbnN0YW5jZSc6CisgICAgICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbCisgICAgICAgICAgICAgICAgICAgICcgICAgdWludDMyX3QgTm9ybWFsaXplQXBpVmVyc2lvbih1aW50MzJfdCBzcGVjaWZpZWRfdmVyc2lvbikgeycsCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHVpbnQzMl90IGFwaV92ZXJzaW9uID0gKHNwZWNpZmllZF92ZXJzaW9uIDwgVktfQVBJX1ZFUlNJT05fMV8xKSA/IFZLX0FQSV9WRVJTSU9OXzFfMCA6IFZLX0FQSV9WRVJTSU9OXzFfMTsnLAorICAgICAgICAgICAgICAgICAgICAnICAgICAgICByZXR1cm4gYXBpX3ZlcnNpb247JywKKyAgICAgICAgICAgICAgICAgICAgJyAgICB9JywKKyAgICAgICAgICAgICAgICAgICAgJycsCisgICAgICAgICAgICAgICAgICAgICcgICAgdWludDMyX3QgSW5pdEZyb21JbnN0YW5jZUNyZWF0ZUluZm8odWludDMyX3QgcmVxdWVzdGVkX2FwaV92ZXJzaW9uLCBjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pIHsnXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbCisgICAgICAgICAgICAgICAgICAgICcgICAgJXMoKSA9IGRlZmF1bHQ7JyAlIHN0cnVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAnICAgICVzKGNvbnN0ICVzJiBpbnN0YW5jZV9leHQpIDogJXMoaW5zdGFuY2VfZXh0KSB7fScgJSAoc3RydWN0X3R5cGUsIGluc3RhbmNlX3N0cnVjdF90eXBlLCBpbnN0YW5jZV9zdHJ1Y3RfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICcnLAorICAgICAgICAgICAgICAgICAgICAnICAgIHVpbnQzMl90IEluaXRGcm9tRGV2aWNlQ3JlYXRlSW5mbyhjb25zdCAlcyAqaW5zdGFuY2VfZXh0ZW5zaW9ucywgdWludDMyX3QgcmVxdWVzdGVkX2FwaV92ZXJzaW9uLCcgJSBpbnN0YW5jZV9zdHJ1Y3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbykgeycsCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIC8vIEluaXRpYWxpemU6IHRoaXMgdG8gZGVmYXVsdHMsICBiYXNlIGNsYXNzIGZpZWxkcyB0byBpbnB1dC4nLAorICAgICAgICAgICAgICAgICAgICAnICAgICAgICBhc3NlcnQoaW5zdGFuY2VfZXh0ZW5zaW9ucyk7JywKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgKnRoaXMgPSAlcygqaW5zdGFuY2VfZXh0ZW5zaW9ucyk7JyAlIHN0cnVjdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAnJ10pLAorICAgICAgICAgICAgc3RydWN0LmV4dGVuZChbCisgICAgICAgICAgICAgICAgJycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gVl8xXzFfcHJvbW90ZWRfJXNfYXBpcyA9IHsnICUgdHlwZS5sb3dlcigpIF0pCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFsnICAgICAgICAgICAgJXNfRVhURU5TSU9OX05BTUUsJyAlIGV4dF9uYW1lLnVwcGVyKCkgZm9yIGV4dF9uYW1lIGluIHByb21vdGVkX2V4dF9saXN0XSkKKyAgICAgICAgICAgIHN0cnVjdC5leHRlbmQoWworICAgICAgICAgICAgICAgICcgICAgICAgIH07JywKKyAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICAgICAnICAgICAgICAvLyBJbml0aWFsaXplIHN0cnVjdCBkYXRhLCByb2J1c3QgdG8gaW52YWxpZCBwQ3JlYXRlSW5mbycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgdWludDMyX3QgYXBpX3ZlcnNpb24gPSBOb3JtYWxpemVBcGlWZXJzaW9uKHJlcXVlc3RlZF9hcGlfdmVyc2lvbik7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICBpZiAoYXBpX3ZlcnNpb24gPj0gVktfQVBJX1ZFUlNJT05fMV8xKSB7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgYXV0byBpbmZvID0gZ2V0X2luZm8oIlZLX1ZFUlNJT05fMV8xIik7JywKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgaWYgKGluZm8uc3RhdGUpIHRoaXMtPiooaW5mby5zdGF0ZSkgPSBrRW5hYmxlZEJ5Q3JlYXRlaW5mbzsnLAorICAgICAgICAgICAgICAgICcgICAgICAgICAgICBmb3IgKGF1dG8gcHJvbW90ZWRfZXh0IDogVl8xXzFfcHJvbW90ZWRfJXNfYXBpcykgeycgJSB0eXBlLmxvd2VyKCksCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBpbmZvID0gZ2V0X2luZm8ocHJvbW90ZWRfZXh0KTsnLAorICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgYXNzZXJ0KGluZm8uc3RhdGUpOycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBpZiAoaW5mby5zdGF0ZSkgdGhpcy0+KihpbmZvLnN0YXRlKSA9IGtFbmFibGVkQnlBcGlMZXZlbDsnLAorICAgICAgICAgICAgICAgICcgICAgICAgICAgICB9JywKKyAgICAgICAgICAgICAgICAnICAgICAgICB9JywKKyAgICAgICAgICAgICAgICAnICAgICAgICAvLyBDcmVhdGVJbmZvIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwcm9tb3RlZCcsCisgICAgICAgICAgICAgICAgJyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcykgeycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsnLAorICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgaWYgKCFwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pIGNvbnRpbnVlOycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBhdXRvIGluZm8gPSBnZXRfaW5mbyhwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBpZiAoaW5mby5zdGF0ZSkgdGhpcy0+KihpbmZvLnN0YXRlKSA9IGtFbmFibGVkQnlDcmVhdGVpbmZvOycsCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIH0nLAorICAgICAgICAgICAgICAgICcgICAgICAgIH0nLAorCisgICAgICAgICAgICAgICAgJyAgICAgICAgcmV0dXJuIGFwaV92ZXJzaW9uOycsCisgICAgICAgICAgICAgICAgJyAgICB9JywKKyAgICAgICAgICAgICAgICAnfTsnXSkKKworICAgICAgICAgICAgIyBPdXRwdXQgcmVmZXJlbmNlIGxpc3RzIG9mIGluc3RhbmNlL2RldmljZSBleHRlbnNpb24gbmFtZXMKKyAgICAgICAgICAgIHN0cnVjdC5leHRlbmQoWycnLCAnc3RhdGljIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrJXNFeHRlbnNpb25OYW1lcyA9IHsnICUgdHlwZV0pCisgICAgICAgICAgICBzdHJ1Y3QuZXh0ZW5kKFtndWFyZGVkKGluZm9bJ2lmZGVmJ10sICcgICAgJXMsJyAlIGluZm9bJ2RlZmluZSddKSBmb3IgZXh0X25hbWUsIGluZm8gaW4gZXh0ZW5zaW9uX2l0ZW1zXSkKKyAgICAgICAgICAgIHN0cnVjdC5leHRlbmQoWyd9OycsICcnXSkKKyAgICAgICAgICAgIG91dHB1dC5leHRlbmQoc3RydWN0KQorCisgICAgICAgIG91dHB1dC5leHRlbmQoWycnLCAnI2VuZGlmIC8vIFZLX0VYVEVOU0lPTl9IRUxQRVJfSF8nXSkKKyAgICAgICAgcmV0dXJuICdcbicuam9pbihvdXRwdXQpCisgICAgIworICAgICMgQ29tYmluZSBvYmplY3QgdHlwZXMgaGVscGVyIGhlYWRlciBmaWxlIHByZWFtYmxlIHdpdGggYm9keSB0ZXh0IGFuZCByZXR1cm4KKyAgICBkZWYgR2VuZXJhdGVPYmplY3RUeXBlc0hlbHBlckhlYWRlcihzZWxmKToKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlbHBlcl9oZWFkZXIgPSAnXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWxwZXJfaGVhZGVyICs9ICcjcHJhZ21hIG9uY2VcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlbHBlcl9oZWFkZXIgKz0gJ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVscGVyX2hlYWRlciArPSBzZWxmLkdlbmVyYXRlT2JqZWN0VHlwZXNIZWFkZXIoKQorICAgICAgICByZXR1cm4gb2JqZWN0X3R5cGVzX2hlbHBlcl9oZWFkZXIKKyAgICAjCisgICAgIyBPYmplY3QgdHlwZXMgaGVhZGVyOiBjcmVhdGUgb2JqZWN0IGVudW0gdHlwZSBoZWFkZXIgZmlsZQorICAgIGRlZiBHZW5lcmF0ZU9iamVjdFR5cGVzSGVhZGVyKHNlbGYpOgorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyID0gJyNpbmNsdWRlICJjYXN0X3V0aWxzLmgiXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcvLyBPYmplY3QgVHlwZSBlbnVtIGZvciB2YWxpZGF0aW9uIGxheWVyIGludGVybmFsIG9iamVjdCBoYW5kbGluZ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICd0eXBlZGVmIGVudW0gVnVsa2FuT2JqZWN0VHlwZSB7XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICBrVnVsa2FuT2JqZWN0VHlwZVVua25vd24gPSAwLFxuJworICAgICAgICBlbnVtX251bSA9IDEKKyAgICAgICAgdHlwZV9saXN0ID0gW107CisgICAgICAgIGVudW1fZW50cnlfbWFwID0ge30KKyAgICAgICAgbm9uX2Rpc3BhdGNoYWJsZSA9IHt9CisgICAgICAgIGRpc3BhdGNoYWJsZSA9IHt9CisgICAgICAgIG9iamVjdF90eXBlX2luZm8gPSB7fQorCisgICAgICAgICMgT3V0cHV0IGVudW0gZGVmaW5pdGlvbiBhcyBlYWNoIGhhbmRsZSBpcyBwcm9jZXNzZWQsIHNhdmluZyB0aGUgbmFtZXMgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbiByb3V0aW5lCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYub2JqZWN0X3R5cGVzOgorICAgICAgICAgICAgZml4dXBfbmFtZSA9IGl0ZW1bMjpdCisgICAgICAgICAgICBlbnVtX2VudHJ5ID0gJ2tWdWxrYW5PYmplY3RUeXBlJXMnICUgZml4dXBfbmFtZQorICAgICAgICAgICAgZW51bV9lbnRyeV9tYXBbaXRlbV0gPSBlbnVtX2VudHJ5CisgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgJyArIGVudW1fZW50cnkKKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyA9ICVkLFxuJyAlIGVudW1fbnVtCisgICAgICAgICAgICBlbnVtX251bSArPSAxCisgICAgICAgICAgICB0eXBlX2xpc3QuYXBwZW5kKGVudW1fZW50cnkpCisgICAgICAgICAgICBvYmplY3RfdHlwZV9pbmZvW2VudW1fZW50cnldID0geyAnVmtUeXBlJzogaXRlbSB9CisgICAgICAgICAgICAjIFdlJ2xsIHdhbnQgbGlzdHMgb2YgdGhlIGRpc3BhdGNoYWJsZSBhbmQgbm9uIGRpc3BhdGNoYWJsZSBoYW5kbGVzIGJlbG93IHdpdGggYWNjZXNzIHRvIHRoZSBzYW1lIGluZm8KKyAgICAgICAgICAgIGlmIHNlbGYuaGFuZGxlX3R5cGVzLklzTm9uRGlzcGF0Y2hhYmxlKGl0ZW0pOgorICAgICAgICAgICAgICAgIG5vbl9kaXNwYXRjaGFibGVbaXRlbV0gPSBlbnVtX2VudHJ5CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRpc3BhdGNoYWJsZVtpdGVtXSA9IGVudW1fZW50cnkKKworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAga1Z1bGthbk9iamVjdFR5cGVNYXggPSAlZCxcbicgJSBlbnVtX251bQorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgLy8gQWxpYXNlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWx0eSBvZiAicHJvbW90ZWQiIHR5cGVzXG4nCisgICAgICAgIGZvciAobmFtZSwgYWxpYXMpIGluIHNlbGYub2JqZWN0X3R5cGVfYWxpYXNlczoKKyAgICAgICAgICAgIGZpeHVwX25hbWUgPSBuYW1lWzI6XQorICAgICAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgIGtWdWxrYW5PYmplY3RUeXBle30gPSB7fSxcbicuZm9ybWF0KGZpeHVwX25hbWUsIGVudW1fZW50cnlfbWFwW2FsaWFzXSkKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnfSBWdWxrYW5PYmplY3RUeXBlO1xuXG4nCisKKyAgICAgICAgIyBPdXRwdXQgbmFtZSBzdHJpbmcgaGVscGVyCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJy8vIEFycmF5IG9mIG9iamVjdCBuYW1lIHN0cmluZ3MgZm9yIE9CSkVDVF9UWVBFIGVudW0gY29udmVyc2lvblxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICdzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG9iamVjdF9zdHJpbmdba1Z1bGthbk9iamVjdFR5cGVNYXhdID0ge1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgIlZrTm9uRGlzcGF0Y2hhYmxlSGFuZGxlIixcbicKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5vYmplY3RfdHlwZXM6CisgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgIiVzIixcbicgJSBpdGVtCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ307XG4nCisKKyAgICAgICAgIyBIZWxwZXJzIHRvIGNyZWF0ZSB1bmlmaWVkIGRpY3Qga2V5IGZyb20gazxOYW1lPiwgVktfT0JKRUNUX1RZUEVfPE5hbWU+LCBhbmQgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFXzxOYW1lPgorICAgICAgICBkZWYgZHJvX3RvX2tleShyYXdfa2V5KTogcmV0dXJuIHJlLnNlYXJjaCgnXlZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV8oLiopX0VYVCQnLCByYXdfa2V5KS5ncm91cCgxKS5sb3dlcigpLnJlcGxhY2UoIl8iLCIiKQorICAgICAgICBkZWYgdmtvX3RvX2tleShyYXdfa2V5KTogcmV0dXJuIHJlLnNlYXJjaCgnXlZLX09CSkVDVF9UWVBFXyguKiknLCByYXdfa2V5KS5ncm91cCgxKS5sb3dlcigpLnJlcGxhY2UoIl8iLCIiKQorICAgICAgICBkZWYga2VudW1fdG9fa2V5KHJhd19rZXkpOiByZXR1cm4gcmUuc2VhcmNoKCdea1Z1bGthbk9iamVjdFR5cGUoLiopJywgcmF3X2tleSkuZ3JvdXAoMSkubG93ZXIoKQorCisgICAgICAgIGRyb19kaWN0ID0ge2Ryb190b19rZXkoZHJvKSA6IGRybyBmb3IgZHJvIGluIHNlbGYuZGVidWdfcmVwb3J0X29iamVjdF90eXBlc30KKyAgICAgICAgdmtvX2RpY3QgPSB7dmtvX3RvX2tleSh2a28pIDogdmtvIGZvciB2a28gaW4gc2VsZi5jb3JlX29iamVjdF90eXBlc30KKworICAgICAgICAjIE91dHB1dCBhIGNvbnZlcnNpb24gcm91dGluZSBmcm9tIHRoZSBsYXllciBvYmplY3QgZGVmaW5pdGlvbnMgdG8gdGhlIGRlYnVnIHJlcG9ydCBkZWZpbml0aW9ucworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICdcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnLy8gSGVscGVyIGFycmF5IHRvIGdldCBWdWxrYW4gVktfRVhUX2RlYnVnX3JlcG9ydCBvYmplY3QgdHlwZSBlbnVtIGZyb20gdGhlIGludGVybmFsIGxheWVycyB2ZXJzaW9uXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ2NvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIGdldF9kZWJ1Z19yZXBvcnRfZW51bVtdID0ge1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAvLyBrVnVsa2FuT2JqZWN0VHlwZVVua25vd25cbicgIyBubyB1bmtub3duIGhhbmRsZSwgc28gdGhpcyBtdXN0IGJlIGhlcmUgZXhwbGljaXRseQorCisgICAgICAgIGZvciBvYmplY3RfdHlwZSBpbiB0eXBlX2xpc3Q6CisgICAgICAgICAgICAjIFZLX0RFQlVHX1JFUE9SVCBpcyBub3QgdXBkYXRlZCBhbnltb3JlOyB0aGVyZSBtaWdodCBiZSBtaXNzaW5nIG9iamVjdCB0eXBlcworICAgICAgICAgICAga2VudW1fdHlwZSA9IGRyb19kaWN0LmdldChrZW51bV90b19rZXkob2JqZWN0X3R5cGUpLCAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUJykKKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAlcywgICAvLyAlc1xuJyAlIChrZW51bV90eXBlLCBvYmplY3RfdHlwZSkKKyAgICAgICAgICAgIG9iamVjdF90eXBlX2luZm9bb2JqZWN0X3R5cGVdWydEYmdUeXBlJ10gPSBrZW51bV90eXBlCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ307XG4nCisKKyAgICAgICAgIyBPdXRwdXQgYSBjb252ZXJzaW9uIHJvdXRpbmUgZnJvbSB0aGUgbGF5ZXIgb2JqZWN0IGRlZmluaXRpb25zIHRvIHRoZSBjb3JlIG9iamVjdCB0eXBlIGRlZmluaXRpb25zCisgICAgICAgICMgVGhpcyB3aWxsIGludGVudGlvbmFsbHkgKmZhaWwqIGZvciB1bm1hdGNoZWQgdHlwZXMgYXMgdGhlIFZLX09CSkVDVF9UWVBFIGxpc3Qgc2hvdWxkIG1hdGNoIHRoZSBrVnVsa2FuT2JqZWN0VHlwZSBsaXN0CisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcvLyBIZWxwZXIgYXJyYXkgdG8gZ2V0IE9mZmljaWFsIFZ1bGthbiBWa09iamVjdFR5cGUgZW51bSBmcm9tIHRoZSBpbnRlcm5hbCBsYXllcnMgdmVyc2lvblxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICdjb25zdCBWa09iamVjdFR5cGUgZ2V0X29iamVjdF90eXBlX2VudW1bXSA9IHtcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgIFZLX09CSkVDVF9UWVBFX1VOS05PV04sIC8vIGtWdWxrYW5PYmplY3RUeXBlVW5rbm93blxuJyAjIG5vIHVua25vd24gaGFuZGxlLCBzbyBtdXN0IGJlIGhlcmUgZXhwbGljaXRseQorCisgICAgICAgIGZvciBvYmplY3RfdHlwZSBpbiB0eXBlX2xpc3Q6CisgICAgICAgICAgICBrZW51bV90eXBlID0gdmtvX2RpY3Rba2VudW1fdG9fa2V5KG9iamVjdF90eXBlKV0KKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAlcywgICAvLyAlc1xuJyAlIChrZW51bV90eXBlLCBvYmplY3RfdHlwZSkKKyAgICAgICAgICAgIG9iamVjdF90eXBlX2luZm9bb2JqZWN0X3R5cGVdWydWa29UeXBlJ10gPSBrZW51bV90eXBlCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ307XG4nCisKKyAgICAgICAgIyBPdXRwdXQgYSBmdW5jdGlvbiBjb252ZXJ0aW5nIGZyb20gY29yZSBvYmplY3QgdHlwZSBkZWZpbml0aW9ucyB0byB0aGUgVnVsa2FuIG9iamVjdCB0eXBlIGVudW1zCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJ1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGludGVybmFsIGxheWVycyBvYmplY3QgaWRzIGZyb20gdGhlIG9mZmljaWFsIFZ1bGthbiBWa09iamVjdFR5cGUgZW51bVxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICdzdGF0aWMgaW5saW5lIFZ1bGthbk9iamVjdFR5cGUgQ29udmVydENvcmVPYmplY3RUb1Z1bGthbk9iamVjdChWa09iamVjdFR5cGUgdnVsa2FuX29iamVjdF90eXBlKSB7XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICBzd2l0Y2ggKHZ1bGthbl9vYmplY3RfdHlwZSkge1xuJworCisgICAgICAgIGZvciBvYmplY3RfdHlwZSBpbiB0eXBlX2xpc3Q6CisgICAgICAgICAgICBrZW51bV90eXBlID0gdmtvX2RpY3Rba2VudW1fdG9fa2V5KG9iamVjdF90eXBlKV0KKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gJyAgICAgICAgY2FzZSAlczogcmV0dXJuICVzO1xuJyAlIChrZW51bV90eXBlLCBvYmplY3RfdHlwZSkKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnICAgICAgICBkZWZhdWx0OiByZXR1cm4ga1Z1bGthbk9iamVjdFR5cGVVbmtub3duO1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgfVxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICd9O1xuJworCisgICAgICAgICMgQ3JlYXRlIGEgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBhbmQgVmtPYmplY3RUeXBlCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gICAgICdcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAgICAgJ3N0YXRpYyBpbmxpbmUgVmtPYmplY3RUeXBlIGNvbnZlcnREZWJ1Z1JlcG9ydE9iamVjdFRvQ29yZU9iamVjdChWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBkZWJ1Z19yZXBvcnRfb2JqKSB7XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gICAgICcgICAgc3dpdGNoIChkZWJ1Z19yZXBvcnRfb2JqKSB7XG4nCisgICAgICAgIGZvciBkcl9vYmplY3RfdHlwZSBpbiBzZWxmLmRlYnVnX3JlcG9ydF9vYmplY3RfdHlwZXM6CisgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgICAgIGNhc2UgJXM6IHJldHVybiAlcztcbicgJSAoZHJfb2JqZWN0X3R5cGUsIHZrb19kaWN0W2Ryb190b19rZXkoZHJfb2JqZWN0X3R5cGUpXSkKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAgICAgJyAgICAgICAgZGVmYXVsdDogcmV0dXJuIFZLX09CSkVDVF9UWVBFX1VOS05PV047XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gICAgICcgICAgfVxuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICAgICAnfVxuJworCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gICAgICAgICAnXG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gICAgICAgICAnc3RhdGljIGlubGluZSBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBjb252ZXJ0Q29yZU9iamVjdFRvRGVidWdSZXBvcnRPYmplY3QoVmtPYmplY3RUeXBlIGNvcmVfcmVwb3J0X29iaikge1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICAgICAgICAgJyAgICBzd2l0Y2ggKGNvcmVfcmVwb3J0X29iaikge1xuJworICAgICAgICBmb3IgY29yZV9vYmplY3RfdHlwZSBpbiBzZWxmLmNvcmVfb2JqZWN0X3R5cGVzOgorICAgICAgICAgICAgIyBWS19ERUJVR19SRVBPUlQgaXMgbm90IHVwZGF0ZWQgYW55bW9yZTsgdGhlcmUgbWlnaHQgYmUgbWlzc2luZyBvYmplY3QgdHlwZXMKKyAgICAgICAgICAgIGRyX29iamVjdF90eXBlID0gZHJvX2RpY3QuZ2V0KHZrb190b19rZXkoY29yZV9vYmplY3RfdHlwZSkpCisgICAgICAgICAgICBpZiBkcl9vYmplY3RfdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcgICAgICAgIGNhc2UgJXM6IHJldHVybiAlcztcbicgJSAoY29yZV9vYmplY3RfdHlwZSwgZHJfb2JqZWN0X3R5cGUpCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gICAgICAgICAnICAgICAgICBkZWZhdWx0OiByZXR1cm4gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUO1xuJworICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICAgICAgICAgJyAgICB9XG4nCisgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gICAgICAgICAnfVxuJworCisgICAgICAgICMKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnXG4nCisgICAgICAgIHRyYWl0c19mb3JtYXQgPSBPdXRkZW50KCcnJworICAgICAgICAgICAgdGVtcGxhdGUgPD4gc3RydWN0IFZrSGFuZGxlSW5mbzx7dmtfdHlwZX0+IHt7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IFZ1bGthbk9iamVjdFR5cGUga1Z1bGthbk9iamVjdFR5cGUgPSB7b2JqX3R5cGV9OworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBrRGVidWdSZXBvcnRPYmplY3RUeXBlID0ge2RiZ190eXBlfTsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgVmtPYmplY3RUeXBlIGtWa09iamVjdFR5cGUgPSB7dmtvX3R5cGV9OworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlbmFtZSgpIHt7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAie3ZrX3R5cGV9IjsKKyAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgfX07CisgICAgICAgICAgICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm88e29ial90eXBlfT4ge3sKKyAgICAgICAgICAgICAgICB0eXBlZGVmIHt2a190eXBlfSBUeXBlOworICAgICAgICAgICAgfX07CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSBPdXRkZW50KCcnJworICAgICAgICAgICAgLy8gVHJhaXRzIG9iamVjdHMgZnJvbSBlYWNoIHR5cGUgc3RhdGljYWxseSBtYXAgZnJvbSBWazxoYW5kbGVUeXBlPiB0byB0aGUgdmFyaW91cyBlbnVtcworICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZrVHlwZT4gc3RydWN0IFZrSGFuZGxlSW5mbyB7fTsKKyAgICAgICAgICAgIHRlbXBsYXRlIDxWdWxrYW5PYmplY3RUeXBlIGlkPiBzdHJ1Y3QgVnVsa2FuT2JqZWN0VHlwZUluZm8ge307CisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBtdXN0IG1hdGNoIHRoZSB2dWxrYW5fY29yZS5oIGNvbmRpdGlvbiBndWFyZGluZyBWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUKKyAgICAgICAgICAgICNpZiBkZWZpbmVkKF9fTFA2NF9fKSB8fCBkZWZpbmVkKF9XSU42NCkgfHwgKGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoX19JTFAzMl9fKSkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX19pYTY0KSB8fCBcCisgICAgICAgICAgICAgICAgZGVmaW5lZChfTV9JQTY0KSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisgICAgICAgICAgICAjZGVmaW5lIFRZUEVTQUZFX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgVktfREVGSU5FX05PTl9ESVNQQVRDSEFCTEVfSEFORExFKFZrTm9uRGlzcGF0Y2hhYmxlSGFuZGxlKQorICAgICAgICAgICAgJycnKSAgKydcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSB0cmFpdHNfZm9ybWF0LmZvcm1hdCh2a190eXBlPSdWa05vbkRpc3BhdGNoYWJsZUhhbmRsZScsIG9ial90eXBlPSdrVnVsa2FuT2JqZWN0VHlwZVVua25vd24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmdfdHlwZT0nVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmtvX3R5cGU9J1ZLX09CSkVDVF9UWVBFX1VOS05PV04nKSArICdcbicKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnI2VuZGlmIC8vICBWS19ERUZJTkVfSEFORExFIGxvZ2ljIGR1cGxpY2F0aW9uXG4nCisKKyAgICAgICAgZm9yIHZrX3R5cGUsIG9iamVjdF90eXBlIGluIHNvcnRlZChkaXNwYXRjaGFibGUuaXRlbXMoKSk6CisgICAgICAgICAgICBpbmZvID0gb2JqZWN0X3R5cGVfaW5mb1tvYmplY3RfdHlwZV0KKyAgICAgICAgICAgIG9iamVjdF90eXBlc19oZWFkZXIgKz0gdHJhaXRzX2Zvcm1hdC5mb3JtYXQodmtfdHlwZT12a190eXBlLCBvYmpfdHlwZT1vYmplY3RfdHlwZSwgZGJnX3R5cGU9aW5mb1snRGJnVHlwZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmtvX3R5cGU9aW5mb1snVmtvVHlwZSddKQorICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9ICcjaWZkZWYgVFlQRVNBRkVfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVNcbicKKyAgICAgICAgZm9yIHZrX3R5cGUsIG9iamVjdF90eXBlIGluIHNvcnRlZChub25fZGlzcGF0Y2hhYmxlLml0ZW1zKCkpOgorICAgICAgICAgICAgaW5mbyA9IG9iamVjdF90eXBlX2luZm9bb2JqZWN0X3R5cGVdCisgICAgICAgICAgICBvYmplY3RfdHlwZXNfaGVhZGVyICs9IHRyYWl0c19mb3JtYXQuZm9ybWF0KHZrX3R5cGU9dmtfdHlwZSwgb2JqX3R5cGU9b2JqZWN0X3R5cGUsIGRiZ190eXBlPWluZm9bJ0RiZ1R5cGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrb190eXBlPWluZm9bJ1Zrb1R5cGUnXSkKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSAnI2VuZGlmIC8vIFRZUEVTQUZFX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTXG4nCisKKyAgICAgICAgb2JqZWN0X3R5cGVzX2hlYWRlciArPSBPdXRkZW50KCcnJworICAgICAgICAgICAgc3RydWN0IFZ1bGthblR5cGVkSGFuZGxlIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBoYW5kbGU7CisgICAgICAgICAgICAgICAgVnVsa2FuT2JqZWN0VHlwZSB0eXBlOworICAgICAgICAgICAgICAgIC8vIG5vZGUgaXMgb3B0aW9uYWwsIGFuZCBpZiBub24tTlVMTCBpcyB1c2VkIHRvIGF2b2lkIGEgaGFzaCB0YWJsZSBsb29rdXAKKyAgICAgICAgICAgICAgICBjbGFzcyBCQVNFX05PREUgKm5vZGU7CisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZT4KKyAgICAgICAgICAgICAgICBWdWxrYW5UeXBlZEhhbmRsZShIYW5kbGUgaGFuZGxlXywgVnVsa2FuT2JqZWN0VHlwZSB0eXBlXywgY2xhc3MgQkFTRV9OT0RFICpub2RlXyA9IG51bGxwdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlKENhc3RUb1VpbnQ2NChoYW5kbGVfKSksCisgICAgICAgICAgICAgICAgICAgIHR5cGUodHlwZV8pLAorICAgICAgICAgICAgICAgICAgICBub2RlKG5vZGVfKSB7CisgICAgICAgICAgICAjaWZkZWYgVFlQRVNBRkVfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIDMyIGJpdCBpdCdzIG5vdCBhbHdheXMgc2FmZSB0byBjaGVjayBmb3IgdHJhaXRzIDwtPiB0eXBlCisgICAgICAgICAgICAgICAgICAgIC8vIGFzIGFsbCBub24tZGlzcGF0Y2hhYmxlIGhhbmRsZXMgaGF2ZSB0aGUgc2FtZSB0eXBlLWlkIGFuZCB0aHVzIHRyYWl0cywKKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG9uIDY0IGJpdCB3ZSBjYW4gdmFsaWRhdGUgdGhlIHBhc3NlZCB0eXBlIG1hdGNoZXMgdGhlIHBhc3NlZCBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGUgPT0gVmtIYW5kbGVJbmZvPEhhbmRsZT46OmtWdWxrYW5PYmplY3RUeXBlKTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBUWVBFU0FGRV9OT05ESVNQQVRDSEFCTEVfSEFORExFUworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlPgorICAgICAgICAgICAgICAgIEhhbmRsZSBDYXN0KCkgY29uc3QgeworICAgICAgICAgICAgI2lmZGVmIFRZUEVTQUZFX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlID09IFZrSGFuZGxlSW5mbzxIYW5kbGU+OjprVnVsa2FuT2JqZWN0VHlwZSk7CisgICAgICAgICAgICAjZW5kaWYgLy8gVFlQRVNBRkVfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENhc3RGcm9tVWludDY0PEhhbmRsZT4oaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVnVsa2FuVHlwZWRIYW5kbGUoKSA6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZShWS19OVUxMX0hBTkRMRSksCisgICAgICAgICAgICAgICAgICAgIHR5cGUoa1Z1bGthbk9iamVjdFR5cGVVbmtub3duKSwKKyAgICAgICAgICAgICAgICAgICAgbm9kZShudWxscHRyKSB7fQorICAgICAgICAgICAgfTsgJycnKSAgKydcbicKKworICAgICAgICByZXR1cm4gb2JqZWN0X3R5cGVzX2hlYWRlcgorICAgICMKKyAgICAjIEdlbmVyYXRlIHBOZXh0IGhhbmRsaW5nIGZ1bmN0aW9uCisgICAgZGVmIGJ1aWxkX3NhZmVfc3RydWN0X3V0aWxpdHlfZnVuY3Moc2VsZik6CisgICAgICAgICMgQ29uc3RydWN0IFNhZmUtc3RydWN0IGhlbHBlciBmdW5jdGlvbnMKKworICAgICAgICBzdHJpbmdfY29weV9wcm9jID0gJ1xuXG4nCisgICAgICAgIHN0cmluZ19jb3B5X3Byb2MgKz0gJ2NoYXIgKlNhZmVTdHJpbmdDb3B5KGNvbnN0IGNoYXIgKmluX3N0cmluZykge1xuJworICAgICAgICBzdHJpbmdfY29weV9wcm9jICs9ICcgICAgaWYgKG51bGxwdHIgPT0gaW5fc3RyaW5nKSByZXR1cm4gbnVsbHB0cjtcbicKKyAgICAgICAgc3RyaW5nX2NvcHlfcHJvYyArPSAnICAgIGNoYXIqIGRlc3QgPSBuZXcgY2hhcltzdGQ6OnN0cmxlbihpbl9zdHJpbmcpICsgMV07XG4nCisgICAgICAgIHN0cmluZ19jb3B5X3Byb2MgKz0gJyAgICByZXR1cm4gc3RkOjpzdHJjcHkoZGVzdCwgaW5fc3RyaW5nKTtcbicKKyAgICAgICAgc3RyaW5nX2NvcHlfcHJvYyArPSAnfVxuJworCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgPSAnXG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJ3ZvaWQgKlNhZmVQbmV4dENvcHkoY29uc3Qgdm9pZCAqcE5leHQpIHtcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgIGlmICghcE5leHQpIHJldHVybiBudWxscHRyO1xuJworICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICdcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgIHZvaWQgKnNhZmVfcE5leHQ7XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICBjb25zdCBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCYXNlT3V0U3RydWN0dXJlICo+KHBOZXh0KTtcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnXG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICBzd2l0Y2ggKGhlYWRlci0+c1R5cGUpIHtcbicKKyAgICAgICAgIyBBZGQgc3BlY2lhbC1jYXNlIGNvZGUgdG8gY29weSBiZWxvdmVkIHNlY3JldCBsb2FkZXIgc3RydWN0cworICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICcgICAgICAgIC8vIFNwZWNpYWwtY2FzZSBMb2FkZXIgSW5zdGFuY2UgU3RydWN0IHBhc3NlZCB0by9mcm9tIGxheWVyIGluIHBOZXh0IGNoYWluXG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9MT0FERVJfSU5TVEFOQ0VfQ1JFQVRFX0lORk86IHtcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqc3RydWN0X2NvcHkgPSBuZXcgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbztcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgLy8gVE9ETzogVXNlcyBvcmlnaW5hbCBWa0xheWVySW5zdGFuY2VMaW5rKiBjaGFpbiwgd2hpY2ggc2hvdWxkIGJlIG9rYXkgZm9yIG91ciB1c2VzXG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIG1lbWNweShzdHJ1Y3RfY29weSwgcE5leHQsIHNpemVvZihWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvKSk7XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIHN0cnVjdF9jb3B5LT5wTmV4dCA9IFNhZmVQbmV4dENvcHkoaGVhZGVyLT5wTmV4dCk7XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBzdHJ1Y3RfY29weTtcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgYnJlYWs7XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgfVxuJworICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICcgICAgICAgIC8vIFNwZWNpYWwtY2FzZSBMb2FkZXIgRGV2aWNlIFN0cnVjdCBwYXNzZWQgdG8vZnJvbSBsYXllciBpbiBwTmV4dCBjaGFpblxuJworICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICcgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0RFVklDRV9DUkVBVEVfSU5GTzoge1xuJworICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICcgICAgICAgICAgICBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyAqc3RydWN0X2NvcHkgPSBuZXcgVmtMYXllckRldmljZUNyZWF0ZUluZm87XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIC8vIFRPRE86IFVzZXMgb3JpZ2luYWwgVmtMYXllckRldmljZUxpbmsqLCB3aGljaCBzaG91bGQgYmUgb2theSBmb3Igb3VyIHVzZXNcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgbWVtY3B5KHN0cnVjdF9jb3B5LCBwTmV4dCwgc2l6ZW9mKFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvKSk7XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIHN0cnVjdF9jb3B5LT5wTmV4dCA9IFNhZmVQbmV4dENvcHkoaGVhZGVyLT5wTmV4dCk7XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIHNhZmVfcE5leHQgPSBzdHJ1Y3RfY29weTtcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgYnJlYWs7XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgfVxuJworCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyA9ICdcbicKKyAgICAgICAgZnJlZV9wbmV4dF9wcm9jICs9ICd2b2lkIEZyZWVQbmV4dENoYWluKGNvbnN0IHZvaWQgKnBOZXh0KSB7XG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgIGlmICghcE5leHQpIHJldHVybjtcbicKKyAgICAgICAgZnJlZV9wbmV4dF9wcm9jICs9ICdcbicKKyAgICAgICAgZnJlZV9wbmV4dF9wcm9jICs9ICcgICAgYXV0byBoZWFkZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFZrQmFzZU91dFN0cnVjdHVyZSAqPihwTmV4dCk7XG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnXG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgIHN3aXRjaCAoaGVhZGVyLT5zVHlwZSkge1xuJworICAgICAgICBmcmVlX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgLy8gU3BlY2lhbC1jYXNlIExvYWRlciBJbnN0YW5jZSBTdHJ1Y3QgcGFzc2VkIHRvL2Zyb20gbGF5ZXIgaW4gcE5leHQgY2hhaW5cbicKKyAgICAgICAgZnJlZV9wbmV4dF9wcm9jICs9ICcgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0lOU1RBTkNFX0NSRUFURV9JTkZPOlxuJworICAgICAgICBmcmVlX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIEZyZWVQbmV4dENoYWluKGhlYWRlci0+cE5leHQpO1xuJworICAgICAgICBmcmVlX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKj4ocE5leHQpO1xuJworICAgICAgICBmcmVlX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIGJyZWFrO1xuJworICAgICAgICBmcmVlX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgLy8gU3BlY2lhbC1jYXNlIExvYWRlciBEZXZpY2UgU3RydWN0IHBhc3NlZCB0by9mcm9tIGxheWVyIGluIHBOZXh0IGNoYWluXG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9ERVZJQ0VfQ1JFQVRFX0lORk86XG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgRnJlZVBuZXh0Q2hhaW4oaGVhZGVyLT5wTmV4dCk7XG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtMYXllckRldmljZUNyZWF0ZUluZm8gKj4ocE5leHQpO1xuJworICAgICAgICBmcmVlX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIGJyZWFrO1xuJworCisgICAgICAgIGNoYWluX3N0cnVjdHMgPSB0dXBsZShzIGZvciBzIGluIHNlbGYuc3RydWN0TWVtYmVycyBpZiBzLm5hbWUgaW4gc2VsZi5zdHJ1Y3RleHRlbmRzX2xpc3QpCisgICAgICAgIGlmZGVmcyA9IHNvcnRlZCh7Y3MuaWZkZWZfcHJvdGVjdCBmb3IgY3MgaW4gY2hhaW5fc3RydWN0c30sIGtleSA9IGxhbWJkYSBpIDogaSBpZiBpIGlzIG5vdCBOb25lIGVsc2UgJycpCisgICAgICAgIGZvciBpZmRlZiBpbiBpZmRlZnM6CisgICAgICAgICAgICBpZiBpZmRlZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICcjaWZkZWYgJXNcbicgJSBpZmRlZgorICAgICAgICAgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnI2lmZGVmICVzXG4nICUgaWZkZWYKKworICAgICAgICAgICAgYXNzb3J0ZWRfY2hhaW5fc3RydWN0cyA9IHR1cGxlKHMgZm9yIHMgaW4gY2hhaW5fc3RydWN0cyBpZiBzLmlmZGVmX3Byb3RlY3QgPT0gaWZkZWYpCisgICAgICAgICAgICBmb3Igc3RydWN0IGluIGFzc29ydGVkX2NoYWluX3N0cnVjdHM6CisgICAgICAgICAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgICAgICBjYXNlICVzOlxuJyAlIHNlbGYuc3RydWN0VHlwZXNbc3RydWN0Lm5hbWVdLnZhbHVlCisgICAgICAgICAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgc2FmZV9wTmV4dCA9IG5ldyBzYWZlXyVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgJXMgKj4ocE5leHQpKTtcbicgJSAoc3RydWN0Lm5hbWUsIHN0cnVjdC5uYW1lKQorICAgICAgICAgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIGJyZWFrO1xuJworCisgICAgICAgICAgICAgICAgZnJlZV9wbmV4dF9wcm9jICs9ICcgICAgICAgIGNhc2UgJXM6XG4nICUgc2VsZi5zdHJ1Y3RUeXBlc1tzdHJ1Y3QubmFtZV0udmFsdWUKKyAgICAgICAgICAgICAgICBmcmVlX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PGNvbnN0IHNhZmVfJXMgKj4oaGVhZGVyKTtcbicgJSBzdHJ1Y3QubmFtZQorICAgICAgICAgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgYnJlYWs7XG4nCisKKyAgICAgICAgICAgIGlmIGlmZGVmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyNlbmRpZiAvLyAlc1xuJyAlIGlmZGVmCisgICAgICAgICAgICAgICAgZnJlZV9wbmV4dF9wcm9jICs9ICcjZW5kaWYgLy8gJXNcbicgJSBpZmRlZgorCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgZGVmYXVsdDogLy8gRW5jb3VudGVyZWQgYW4gdW5rbm93biBzVHlwZSAtLSBza2lwIChkbyBub3QgY29weSkgdGhpcyBlbnRyeSBpbiB0aGUgY2hhaW5cbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgc2FmZV9wTmV4dCA9IFNhZmVQbmV4dENvcHkoaGVhZGVyLT5wTmV4dCk7XG4nCisgICAgICAgIGJ1aWxkX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIGJyZWFrO1xuJworICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICcgICAgfVxuJworICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICdcbicKKyAgICAgICAgYnVpbGRfcG5leHRfcHJvYyArPSAnICAgIHJldHVybiBzYWZlX3BOZXh0O1xuJworICAgICAgICBidWlsZF9wbmV4dF9wcm9jICs9ICd9XG4nCisKKyAgICAgICAgZnJlZV9wbmV4dF9wcm9jICs9ICcgICAgICAgIGRlZmF1bHQ6IC8vIEVuY291bnRlcmVkIGFuIHVua25vd24gc1R5cGUgLS0gcGFuaWMsIHRoZXJlIHNob3VsZCBiZSBub25lIHN1Y2ggaW4gc2FmZSBjaGFpblxuJworICAgICAgICBmcmVlX3BuZXh0X3Byb2MgKz0gJyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgRnJlZVBuZXh0Q2hhaW4oaGVhZGVyLT5wTmV4dCk7XG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgYnJlYWs7XG4nCisgICAgICAgIGZyZWVfcG5leHRfcHJvYyArPSAnICAgIH1cbicKKyAgICAgICAgZnJlZV9wbmV4dF9wcm9jICs9ICd9XG4nCisKKyAgICAgICAgcG5leHRfcHJvY3MgPSBzdHJpbmdfY29weV9wcm9jICsgYnVpbGRfcG5leHRfcHJvYyArIGZyZWVfcG5leHRfcHJvYworICAgICAgICByZXR1cm4gcG5leHRfcHJvY3MKKyAgICAjCisgICAgIyBEZXRlcm1pbmUgaWYgYSBzdHJ1Y3R1cmUgbmVlZHMgYSBzYWZlX3N0cnVjdCBoZWxwZXIgZnVuY3Rpb24KKyAgICAjIFRoYXQgaXMsIGl0IGhhcyBhbiBzVHlwZSBvciBvbmUgb2YgaXRzIG1lbWJlcnMgaXMgYSBwb2ludGVyCisgICAgZGVmIE5lZWRTYWZlU3RydWN0KHNlbGYsIHN0cnVjdHVyZSk6CisgICAgICAgIGlmICdWa0Jhc2UnIGluIHN0cnVjdHVyZS5uYW1lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmICdzVHlwZScgPT0gc3RydWN0dXJlLm5hbWU6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBmb3IgbWVtYmVyIGluIHN0cnVjdHVyZS5tZW1iZXJzOgorICAgICAgICAgICAgaWYgbWVtYmVyLmlzcG9pbnRlciA9PSBUcnVlOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgICMKKyAgICAjIENvbWJpbmUgc2FmZSBzdHJ1Y3QgaGVscGVyIHNvdXJjZSBmaWxlIHByZWFtYmxlIHdpdGggYm9keSB0ZXh0IGFuZCByZXR1cm4KKyAgICBkZWYgR2VuZXJhdGVTYWZlU3RydWN0SGVscGVyU291cmNlKHNlbGYpOgorICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfc291cmNlID0gJ1xuJworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfc291cmNlICs9ICcjaW5jbHVkZSAidmtfc2FmZV9zdHJ1Y3QuaCJcbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX3NvdXJjZSArPSAnXG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9zb3VyY2UgKz0gJyNpbmNsdWRlIDxzdHJpbmcuaD5cbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX3NvdXJjZSArPSAnI2luY2x1ZGUgPGNhc3NlcnQ+XG4nCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9zb3VyY2UgKz0gJyNpbmNsdWRlIDxjc3RyaW5nPlxuJworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfc291cmNlICs9ICdcbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX3NvdXJjZSArPSAnI2luY2x1ZGUgPHZ1bGthbi92a19sYXllci5oPlxuJworICAgICAgICBzYWZlX3N0cnVjdF9oZWxwZXJfc291cmNlICs9ICdcbicKKyAgICAgICAgc2FmZV9zdHJ1Y3RfaGVscGVyX3NvdXJjZSArPSBzZWxmLkdlbmVyYXRlU2FmZVN0cnVjdFNvdXJjZSgpCisgICAgICAgIHNhZmVfc3RydWN0X2hlbHBlcl9zb3VyY2UgKz0gc2VsZi5idWlsZF9zYWZlX3N0cnVjdF91dGlsaXR5X2Z1bmNzKCkKKworICAgICAgICByZXR1cm4gc2FmZV9zdHJ1Y3RfaGVscGVyX3NvdXJjZQorICAgICMKKyAgICAjIHNhZmVfc3RydWN0IHNvdXJjZSAtLSBjcmVhdGUgYm9kaWVzIG9mIHNhZmUgc3RydWN0IGhlbHBlciBmdW5jdGlvbnMKKyAgICBkZWYgR2VuZXJhdGVTYWZlU3RydWN0U291cmNlKHNlbGYpOgorICAgICAgICBzYWZlX3N0cnVjdF9ib2R5ID0gW10KKyAgICAgICAgd3NpX3N0cnVjdHMgPSBbJ1ZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ1ZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFInLAorICAgICAgICAgICAgICAgICAgICAgICAnVmtXYXlsYW5kU3VyZmFjZUNyZWF0ZUluZm9LSFInLAorICAgICAgICAgICAgICAgICAgICAgICAnVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFInLAorICAgICAgICAgICAgICAgICAgICAgICAnVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSJworICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgIyBGb3IgYWJzdHJhY3QgdHlwZXMganVzdCB3YW50IHRvIHNhdmUgdGhlIHBvaW50ZXIgYXdheQorICAgICAgICAjIHNpbmNlIHdlIGNhbm5vdCBtYWtlIGEgY29weS4KKyAgICAgICAgYWJzdHJhY3RfdHlwZXMgPSBbJ0FIYXJkd2FyZUJ1ZmZlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdBTmF0aXZlV2luZG93JywKKyAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuc3RydWN0TWVtYmVyczoKKyAgICAgICAgICAgIGlmIHNlbGYuTmVlZFNhZmVTdHJ1Y3QoaXRlbSkgPT0gRmFsc2U6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGl0ZW0ubmFtZSBpbiB3c2lfc3RydWN0czoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXRlbS5pZmRlZl9wcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCIjaWZkZWYgJXNcbiIgJSBpdGVtLmlmZGVmX3Byb3RlY3QpCisgICAgICAgICAgICBzc19uYW1lID0gInNhZmVfJXMiICUgaXRlbS5uYW1lCisgICAgICAgICAgICBpbml0X2xpc3QgPSAnJyAgICAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBpbiBzdHJ1Y3QgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIKKyAgICAgICAgICAgIGRlZmF1bHRfaW5pdF9saXN0ID0gJycgICMgRGVmYXVsdCBjb25zdHJ1Y3RvciBqdXN0IGluaXRzIHB0cnMgdG8gbnVsbHB0ciBpbiBpbml0aWFsaXplcgorICAgICAgICAgICAgaW5pdF9mdW5jX3R4dCA9ICcnICAgICAgIyBUeHQgZm9yIGluaXRpYWxpemUoKSBmdW5jdGlvbiB0aGF0IHRha2VzIHN0cnVjdCBwdHIgYW5kIGluaXRzIG1lbWJlcnMKKyAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgPSAnJyAgICAgICMgQm9keSBvZiBjb25zdHVjdG9yIGFzIHdlbGwgYXMgYm9keSBvZiBpbml0aWFsaXplKCkgZnVuYyBmb2xsb3dpbmcgaW5pdF9mdW5jX3R4dAorICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ID0gJycKKworICAgICAgICAgICAgY3VzdG9tX2NvbnN0cnVjdF90eHQgPSB7CisgICAgICAgICAgICAgICAgIyBWa1dyaXRlRGVzY3JpcHRvclNldCBpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSBwb2ludGVycyBtYXkgYmUgbm9uLW51bGwgYnV0IGlnbm9yZWQKKyAgICAgICAgICAgICAgICAnVmtXcml0ZURlc2NyaXB0b3JTZXQnIDoKKyAgICAgICAgICAgICAgICAgICAgJyAgICBzd2l0Y2ggKGRlc2NyaXB0b3JUeXBlKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0U6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgaW5fc3RydWN0LT5wSW1hZ2VJbmZvKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBwSW1hZ2VJbmZvID0gbmV3IFZrRGVzY3JpcHRvckltYWdlSW5mb1tkZXNjcmlwdG9yQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGRlc2NyaXB0b3JDb3VudDsgKytpKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgcEltYWdlSW5mb1tpXSA9IGluX3N0cnVjdC0+cEltYWdlSW5mb1tpXTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBicmVhaztcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOlxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDOlxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOlxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIGluX3N0cnVjdC0+cEJ1ZmZlckluZm8pIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHBCdWZmZXJJbmZvID0gbmV3IFZrRGVzY3JpcHRvckJ1ZmZlckluZm9bZGVzY3JpcHRvckNvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIHBCdWZmZXJJbmZvW2ldID0gaW5fc3RydWN0LT5wQnVmZmVySW5mb1tpXTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBicmVhaztcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSOlxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIGluX3N0cnVjdC0+cFRleGVsQnVmZmVyVmlldykge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgcFRleGVsQnVmZmVyVmlldyA9IG5ldyBWa0J1ZmZlclZpZXdbZGVzY3JpcHRvckNvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ291bnQ7ICsraSkge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIHBUZXhlbEJ1ZmZlclZpZXdbaV0gPSBpbl9zdHJ1Y3QtPnBUZXhlbEJ1ZmZlclZpZXdbaV07XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgYnJlYWs7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGRlZmF1bHQ6XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJyZWFrO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicsCisgICAgICAgICAgICAgICAgJ1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbycgOgorICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBDb2RlKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBDb2RlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCAqPihuZXcgdWludDhfdFtjb2RlU2l6ZV0pO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ29kZSwgKHZvaWQgKilpbl9zdHJ1Y3QtPnBDb2RlLCBjb2RlU2l6ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJywKKyAgICAgICAgICAgICAgICAjIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UgaXRzIHBvaW50ZXJzIG1heSBiZSBub24tbnVsbCBidXQgaWdub3JlZAorICAgICAgICAgICAgICAgICdWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvJyA6CisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHN0YWdlQ291bnQgJiYgaW5fc3RydWN0LT5wU3RhZ2VzKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBTdGFnZXMgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvW3N0YWdlQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3RhZ2VDb3VudDsgKytpKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBwU3RhZ2VzW2ldLmluaXRpYWxpemUoJmluX3N0cnVjdC0+cFN0YWdlc1tpXSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKGluX3N0cnVjdC0+cFZlcnRleElucHV0U3RhdGUpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBWZXJ0ZXhJbnB1dFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cFZlcnRleElucHV0U3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFZlcnRleElucHV0U3RhdGUgPSBOVUxMO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBJbnB1dEFzc2VtYmx5U3RhdGUpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBJbnB1dEFzc2VtYmx5U3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcElucHV0QXNzZW1ibHlTdGF0ZSA9IE5VTEw7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgYm9vbCBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlID0gZmFsc2U7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHN0YWdlQ291bnQgJiYgcFN0YWdlcylcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0YWdlQ291bnQgJiYgIWhhc190ZXNzZWxsYXRpb25fc3RhZ2U7ICsraSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGlmIChwU3RhZ2VzW2ldLnN0YWdlID09IFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQgfHwgcFN0YWdlc1tpXS5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGhhc190ZXNzZWxsYXRpb25fc3RhZ2UgPSB0cnVlO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBUZXNzZWxsYXRpb25TdGF0ZSAmJiBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cFRlc3NlbGxhdGlvblN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBUZXNzZWxsYXRpb25TdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBUZXNzZWxsYXRpb25TdGF0ZSBwb2ludGVyIGlnbm9yZWRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBib29sIGhhc19yYXN0ZXJpemF0aW9uID0gaW5fc3RydWN0LT5wUmFzdGVyaXphdGlvblN0YXRlID8gIWluX3N0cnVjdC0+cFJhc3Rlcml6YXRpb25TdGF0ZS0+cmFzdGVyaXplckRpc2NhcmRFbmFibGUgOiBmYWxzZTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wVmlld3BvcnRTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbikge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBib29sIGlzX2R5bmFtaWNfdmlld3BvcnRzID0gZmFsc2U7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJvb2wgaXNfZHluYW1pY19zY2lzc29ycyA9IGZhbHNlO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBpZiAoaW5fc3RydWN0LT5wRHluYW1pY1N0YXRlICYmIGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZS0+cER5bmFtaWNTdGF0ZXMpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUtPmR5bmFtaWNTdGF0ZUNvdW50ICYmICFpc19keW5hbWljX3ZpZXdwb3J0czsgKytpKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGlmIChpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzW2ldID09IFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgIGlzX2R5bmFtaWNfdmlld3BvcnRzID0gdHJ1ZTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUtPmR5bmFtaWNTdGF0ZUNvdW50ICYmICFpc19keW5hbWljX3NjaXNzb3JzOyArK2kpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgaWYgKGluX3N0cnVjdC0+cER5bmFtaWNTdGF0ZS0+cER5bmFtaWNTdGF0ZXNbaV0gPT0gVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICBpc19keW5hbWljX3NjaXNzb3JzID0gdHJ1ZTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVmlld3BvcnRTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBWaWV3cG9ydFN0YXRlLCBpc19keW5hbWljX3ZpZXdwb3J0cywgaXNfZHluYW1pY19zY2lzc29ycyk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfSBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBWaWV3cG9ydFN0YXRlID0gTlVMTDsgLy8gb3JpZ2luYWwgcFZpZXdwb3J0U3RhdGUgcG9pbnRlciBpZ25vcmVkXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKGluX3N0cnVjdC0+cFJhc3Rlcml6YXRpb25TdGF0ZSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFJhc3Rlcml6YXRpb25TdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKGluX3N0cnVjdC0+cFJhc3Rlcml6YXRpb25TdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwUmFzdGVyaXphdGlvblN0YXRlID0gTlVMTDtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wTXVsdGlzYW1wbGVTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbilcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcE11bHRpc2FtcGxlU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wTXVsdGlzYW1wbGVTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwTXVsdGlzYW1wbGVTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBNdWx0aXNhbXBsZVN0YXRlIHBvaW50ZXIgaWdub3JlZFxuJworICAgICAgICAgICAgICAgICAgICAnICAgIC8vIG5lZWRzIGEgdHJhY2tlZCBzdWJwYXNzIHN0YXRlIHVzZXNfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoaW5fc3RydWN0LT5wRGVwdGhTdGVuY2lsU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24gJiYgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudClcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcERlcHRoU3RlbmNpbFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBEZXB0aFN0ZW5jaWxTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwRGVwdGhTdGVuY2lsU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwRGVwdGhTdGVuY2lsU3RhdGUgcG9pbnRlciBpZ25vcmVkXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgLy8gbmVlZHMgYSB0cmFja2VkIHN1YnBhc3Mgc3RhdGUgdXNlc0NvbG9yQXR0YWNobWVudFxuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBDb2xvckJsZW5kU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24gJiYgdXNlc19jb2xvcl9hdHRhY2htZW50KVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwQ29sb3JCbGVuZFN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8oaW5fc3RydWN0LT5wQ29sb3JCbGVuZFN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwQ29sb3JCbGVuZFN0YXRlIHBvaW50ZXIgaWdub3JlZFxuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBEeW5hbWljU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyhpbl9zdHJ1Y3QtPnBEeW5hbWljU3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcER5bmFtaWNTdGF0ZSA9IE5VTEw7XG4nLAorICAgICAgICAgICAgICAgICAjIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSBpdHMgcG9pbnRlcnMgbWF5IGJlIG5vbi1udWxsIGJ1dCBpZ25vcmVkCisgICAgICAgICAgICAgICAgJ1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbycgOgorICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBWaWV3cG9ydHMgJiYgIWlzX2R5bmFtaWNfdmlld3BvcnRzKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBWaWV3cG9ydHMgPSBuZXcgVmtWaWV3cG9ydFtpbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBtZW1jcHkgKCh2b2lkICopcFZpZXdwb3J0cywgKHZvaWQgKilpbl9zdHJ1Y3QtPnBWaWV3cG9ydHMsIHNpemVvZihWa1ZpZXdwb3J0KSppbl9zdHJ1Y3QtPnZpZXdwb3J0Q291bnQpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBWaWV3cG9ydHMgPSBOVUxMO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChpbl9zdHJ1Y3QtPnBTY2lzc29ycyAmJiAhaXNfZHluYW1pY19zY2lzc29ycykge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwU2Npc3NvcnMgPSBuZXcgVmtSZWN0MkRbaW5fc3RydWN0LT5zY2lzc29yQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNjaXNzb3JzLCAodm9pZCAqKWluX3N0cnVjdC0+cFNjaXNzb3JzLCBzaXplb2YoVmtSZWN0MkQpKmluX3N0cnVjdC0+c2Npc3NvckNvdW50KTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwU2Npc3NvcnMgPSBOVUxMO1xuJywKKyAgICAgICAgICAgICAgICAjIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UgaXRzIHBJbW11dGFibGVTYW1wbGVycyBwb2ludGVyIG1heSBiZSBub24tbnVsbCBidXQgaWdub3JlZAorICAgICAgICAgICAgICAgICdWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nJyA6CisgICAgICAgICAgICAgICAgICAgICcgICAgY29uc3QgYm9vbCBzYW1wbGVyX3R5cGUgPSBpbl9zdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSIHx8IGluX3N0cnVjdC0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBpbl9zdHJ1Y3QtPnBJbW11dGFibGVTYW1wbGVycyAmJiBzYW1wbGVyX3R5cGUpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcEltbXV0YWJsZVNhbXBsZXJzID0gbmV3IFZrU2FtcGxlcltkZXNjcmlwdG9yQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvckNvdW50OyArK2kpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHBJbW11dGFibGVTYW1wbGVyc1tpXSA9IGluX3N0cnVjdC0+cEltbXV0YWJsZVNhbXBsZXJzW2ldO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJywKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VzdG9tX2NvcHlfdHh0ID0geworICAgICAgICAgICAgICAgICMgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSBpdCBoYXMgY3VzdG9tIGNvbnN0cnVjdCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgJ1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAgICAgJyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3RhZ2VDb3VudCAmJiBzcmMucFN0YWdlcykge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwU3RhZ2VzID0gbmV3IHNhZmVfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb1tzdGFnZUNvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0YWdlQ291bnQ7ICsraSkge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgcFN0YWdlc1tpXS5pbml0aWFsaXplKCZzcmMucFN0YWdlc1tpXSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wVmVydGV4SW5wdXRTdGF0ZSlcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFZlcnRleElucHV0U3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wVmVydGV4SW5wdXRTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVmVydGV4SW5wdXRTdGF0ZSA9IE5VTEw7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wSW5wdXRBc3NlbWJseVN0YXRlKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwSW5wdXRBc3NlbWJseVN0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wSW5wdXRBc3NlbWJseVN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBJbnB1dEFzc2VtYmx5U3RhdGUgPSBOVUxMO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGJvb2wgaGFzX3Rlc3NlbGxhdGlvbl9zdGFnZSA9IGZhbHNlO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChzdGFnZUNvdW50ICYmIHBTdGFnZXMpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdGFnZUNvdW50ICYmICFoYXNfdGVzc2VsbGF0aW9uX3N0YWdlOyArK2kpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBpZiAocFN0YWdlc1tpXS5zdGFnZSA9PSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUIHx8IHBTdGFnZXNbaV0uc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVClcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlID0gdHJ1ZTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3JjLnBUZXNzZWxsYXRpb25TdGF0ZSAmJiBoYXNfdGVzc2VsbGF0aW9uX3N0YWdlKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVGVzc2VsbGF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKCpzcmMucFRlc3NlbGxhdGlvblN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBUZXNzZWxsYXRpb25TdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBUZXNzZWxsYXRpb25TdGF0ZSBwb2ludGVyIGlnbm9yZWRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBib29sIGhhc19yYXN0ZXJpemF0aW9uID0gc3JjLnBSYXN0ZXJpemF0aW9uU3RhdGUgPyAhc3JjLnBSYXN0ZXJpemF0aW9uU3RhdGUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlIDogZmFsc2U7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wVmlld3BvcnRTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbikge1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwVmlld3BvcnRTdGF0ZSA9IG5ldyBzYWZlX1ZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbygqc3JjLnBWaWV3cG9ydFN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICB9IGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFZpZXdwb3J0U3RhdGUgPSBOVUxMOyAvLyBvcmlnaW5hbCBwVmlld3BvcnRTdGF0ZSBwb2ludGVyIGlnbm9yZWRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3JjLnBSYXN0ZXJpemF0aW9uU3RhdGUpXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBSYXN0ZXJpemF0aW9uU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbygqc3JjLnBSYXN0ZXJpemF0aW9uU3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFJhc3Rlcml6YXRpb25TdGF0ZSA9IE5VTEw7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wTXVsdGlzYW1wbGVTdGF0ZSAmJiBoYXNfcmFzdGVyaXphdGlvbilcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcE11bHRpc2FtcGxlU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wTXVsdGlzYW1wbGVTdGF0ZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZWxzZVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwTXVsdGlzYW1wbGVTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBNdWx0aXNhbXBsZVN0YXRlIHBvaW50ZXIgaWdub3JlZFxuJworICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChzcmMucERlcHRoU3RlbmNpbFN0YXRlICYmIGhhc19yYXN0ZXJpemF0aW9uKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwRGVwdGhTdGVuY2lsU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKCpzcmMucERlcHRoU3RlbmNpbFN0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBEZXB0aFN0ZW5jaWxTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBEZXB0aFN0ZW5jaWxTdGF0ZSBwb2ludGVyIGlnbm9yZWRcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3JjLnBDb2xvckJsZW5kU3RhdGUgJiYgaGFzX3Jhc3Rlcml6YXRpb24pXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBDb2xvckJsZW5kU3RhdGUgPSBuZXcgc2FmZV9Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbygqc3JjLnBDb2xvckJsZW5kU3RhdGUpO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcENvbG9yQmxlbmRTdGF0ZSA9IE5VTEw7IC8vIG9yaWdpbmFsIHBDb2xvckJsZW5kU3RhdGUgcG9pbnRlciBpZ25vcmVkXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wRHluYW1pY1N0YXRlKVxuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBwRHluYW1pY1N0YXRlID0gbmV3IHNhZmVfVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8oKnNyYy5wRHluYW1pY1N0YXRlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBlbHNlXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBEeW5hbWljU3RhdGUgPSBOVUxMO1xuJywKKyAgICAgICAgICAgICAgICAgIyBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UgaXQgaGFzIGN1c3RvbSBjb25zdHJ1Y3QgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICdWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8nIDoKKyAgICAgICAgICAgICAgICAgICAgJyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoc3JjLnBOZXh0KTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoc3JjLnBWaWV3cG9ydHMpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFZpZXdwb3J0cyA9IG5ldyBWa1ZpZXdwb3J0W3NyYy52aWV3cG9ydENvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgbWVtY3B5ICgodm9pZCAqKXBWaWV3cG9ydHMsICh2b2lkICopc3JjLnBWaWV3cG9ydHMsIHNpemVvZihWa1ZpZXdwb3J0KSpzcmMudmlld3BvcnRDb3VudCk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFZpZXdwb3J0cyA9IE5VTEw7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHNyYy5wU2Npc3NvcnMpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFNjaXNzb3JzID0gbmV3IFZrUmVjdDJEW3NyYy5zY2lzc29yQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAnICAgICAgICBtZW1jcHkgKCh2b2lkICopcFNjaXNzb3JzLCAodm9pZCAqKXNyYy5wU2Npc3NvcnMsIHNpemVvZihWa1JlY3QyRCkqc3JjLnNjaXNzb3JDb3VudCk7XG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcFNjaXNzb3JzID0gTlVMTDtcbicsCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1c3RvbV9kZXN0cnVjdF90eHQgPSB7J1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbycgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChwQ29kZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgZGVsZXRlW10gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KHBDb2RlKTtcbicgfQorICAgICAgICAgICAgY29weV9wbmV4dCA9ICcnCisgICAgICAgICAgICBjb3B5X3N0cmluZ3MgPSAnJworICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBpdGVtLm1lbWJlcnM6CisgICAgICAgICAgICAgICAgbV90eXBlID0gbWVtYmVyLnR5cGUKKyAgICAgICAgICAgICAgICBpZiBtZW1iZXIubmFtZSA9PSAncE5leHQnOgorICAgICAgICAgICAgICAgICAgICBjb3B5X3BuZXh0ID0gJyAgICBwTmV4dCA9IFNhZmVQbmV4dENvcHkoaW5fc3RydWN0LT5wTmV4dCk7XG4nCisgICAgICAgICAgICAgICAgaWYgbWVtYmVyLnR5cGUgaW4gc2VsZi5zdHJ1Y3ROYW1lczoKKyAgICAgICAgICAgICAgICAgICAgbWVtYmVyX2luZGV4ID0gbmV4dCgoaSBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoc2VsZi5zdHJ1Y3RNZW1iZXJzKSBpZiB2WzBdID09IG1lbWJlci50eXBlKSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyX2luZGV4IGlzIG5vdCBOb25lIGFuZCBzZWxmLk5lZWRTYWZlU3RydWN0KHNlbGYuc3RydWN0TWVtYmVyc1ttZW1iZXJfaW5kZXhdKSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgbV90eXBlID0gJ3NhZmVfJXMnICUgbWVtYmVyLnR5cGUKKyAgICAgICAgICAgICAgICBpZiBtZW1iZXIuaXNwb2ludGVyIGFuZCAnc2FmZV8nIG5vdCBpbiBtX3R5cGUgYW5kIHNlbGYuVHlwZUNvbnRhaW5zT2JqZWN0SGFuZGxlKG1lbWJlci50eXBlLCBGYWxzZSkgPT0gRmFsc2U6CisgICAgICAgICAgICAgICAgICAgICMgUHRyIHR5cGVzIHcvbyBhIHNhZmVfc3RydWN0LCBmb3Igbm9uLW51bGwgY2FzZSBuZWVkIHRvIGFsbG9jYXRlIG5ldyBwdHIgYW5kIGNvcHkgZGF0YSBpbgorICAgICAgICAgICAgICAgICAgICBpZiBtX3R5cGUgaW4gWyd2b2lkJywgJ2NoYXInXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlci5uYW1lICE9ICdwTmV4dCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbV90eXBlID09ICdjaGFyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgZGVlcCBjb3BpZXMgb2Ygc3RyaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIubGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9zdHJpbmdzICs9ICcgICAgY2hhciAqKnRtcF8lcyA9IG5ldyBjaGFyICpbaW5fc3RydWN0LT4lc107XG4nICUgKG1lbWJlci5uYW1lLCBtZW1iZXIubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9zdHJpbmdzICs9ICcgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICVzOyArK2kpIHtcbicgJSBtZW1iZXIubGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X3N0cmluZ3MgKz0gJyAgICAgICAgdG1wXyVzW2ldID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT4lc1tpXSk7XG4nICUgKG1lbWJlci5uYW1lLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfc3RyaW5ncyArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfc3RyaW5ncyArPSAnICAgICVzID0gdG1wXyVzO1xuJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgIGlmICglcykge1xuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdF90eHQgKz0gJyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICVzOyArK2kpIHtcbicgJSBtZW1iZXIubGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdF90eHQgKz0gJyAgICAgICAgICAgIGRlbGV0ZSBbXSAlc1tpXTtcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgICAgICBkZWxldGUgW10gJXM7XG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfc3RyaW5ncyArPSAnICAgICVzID0gU2FmZVN0cmluZ0NvcHkoaW5fc3RydWN0LT4lcyk7XG4nICUgKG1lbWJlci5uYW1lLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgIGlmICglcykgZGVsZXRlIFtdICVzO1xuJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3IgdGhlc2UgZXhjZXB0aW9ucyBqdXN0IGNvcHkgaW5pdGlhbCB2YWx1ZSBvdmVyIGZvciBub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9saXN0ICs9ICdcbiAgICAlcyhpbl9zdHJ1Y3QtPiVzKSwnICUgKG1lbWJlci5uYW1lLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9mdW5jX3R4dCArPSAnICAgICVzID0gaW5fc3RydWN0LT4lcztcbicgJSAobWVtYmVyLm5hbWUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9pbml0X2xpc3QgKz0gJ1xuICAgICVzKG51bGxwdHIpLCcgJSAobWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2luaXRfbGlzdCArPSAnXG4gICAgJXMobnVsbHB0ciksJyAlIChtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG4gICAgJXMobnVsbHB0ciksJyAlIChtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1fdHlwZSBpbiBhYnN0cmFjdF90eXBlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgJXMgPSBpbl9zdHJ1Y3QtPiVzO1xuJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZnVuY190eHQgKz0gJyAgICAlcyA9IG51bGxwdHI7XG4nICUgKG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtZW1iZXIuaXNzdGF0aWNhcnJheSBhbmQgKG1lbWJlci5sZW4gaXMgTm9uZSBvciAnLycgaW4gbWVtYmVyLmxlbik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICBpZiAoaW5fc3RydWN0LT4lcykge1xuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgJXMgPSBuZXcgJXMoKmluX3N0cnVjdC0+JXMpO1xuJyAlIChtZW1iZXIubmFtZSwgbV90eXBlLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKCVzKVxuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgICAgICBkZWxldGUgJXM7XG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKGluX3N0cnVjdC0+JXMpIHtcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICVzID0gbmV3ICVzW2luX3N0cnVjdC0+JXNdO1xuJyAlIChtZW1iZXIubmFtZSwgbV90eXBlLCBtZW1iZXIubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgIG1lbWNweSAoKHZvaWQgKiklcywgKHZvaWQgKilpbl9zdHJ1Y3QtPiVzLCBzaXplb2YoJXMpKmluX3N0cnVjdC0+JXMpO1xuJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUsIG1fdHlwZSwgbWVtYmVyLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKCVzKVxuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgICAgICBkZWxldGVbXSAlcztcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgIGVsaWYgbWVtYmVyLmlzc3RhdGljYXJyYXkgb3IgbWVtYmVyLmxlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyLmxlbiBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IGxlbmd0aCBvZiBzdGF0aWMgYXJyYXkgYnkgZ3JhYmJpbmcgdmFsIGJldHdlZW4gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19hcnJheV9zaXplID0gcmUubWF0Y2gociJbXltdKlxbKFteXV0qKVxdIiwgbWVtYmVyLmNkZWNsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAlczsgKytpKSB7XG4nICUgc3RhdGljX2FycmF5X3NpemUuZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgJXNbaV0gPSBpbl9zdHJ1Y3QtPiVzW2ldO1xuJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJbml0IGFycmF5IHB0ciB0byBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2luaXRfbGlzdCArPSAnXG4gICAgJXMobnVsbHB0ciksJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2xpc3QgKz0gJ1xuICAgICVzKG51bGxwdHIpLCcgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9mdW5jX3R4dCArPSAnICAgICVzID0gbnVsbHB0cjtcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfZWxlbWVudCA9ICdpbl9zdHJ1Y3QtPiVzW2ldJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIudHlwZSBpbiBzZWxmLnN0cnVjdE5hbWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcl9pbmRleCA9IG5leHQoKGkgZm9yIGksIHYgaW4gZW51bWVyYXRlKHNlbGYuc3RydWN0TWVtYmVycykgaWYgdlswXSA9PSBtZW1iZXIudHlwZSksIE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyX2luZGV4IGlzIG5vdCBOb25lIGFuZCBzZWxmLk5lZWRTYWZlU3RydWN0KHNlbGYuc3RydWN0TWVtYmVyc1ttZW1iZXJfaW5kZXhdKSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9lbGVtZW50ID0gJyVzKCZpbl9zdHJ1Y3QtPnNhZmVfJXNbaV0pJyAlIChtZW1iZXIudHlwZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKCVzICYmIGluX3N0cnVjdC0+JXMpIHtcbicgJSAobWVtYmVyLmxlbiwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICVzID0gbmV3ICVzWyVzXTtcbicgJSAobWVtYmVyLm5hbWUsIG1fdHlwZSwgbWVtYmVyLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgIGlmICglcylcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgICAgIGRlbGV0ZVtdICVzO1xuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAlczsgKytpKSB7XG4nICUgKG1lbWJlci5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAnc2FmZV8nIGluIG1fdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICAgICAlc1tpXS5pbml0aWFsaXplKCZpbl9zdHJ1Y3QtPiVzW2ldKTtcbicgJSAobWVtYmVyLm5hbWUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICAgICAlc1tpXSA9ICVzO1xuJyAlIChtZW1iZXIubmFtZSwgYXJyYXlfZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICBlbGlmIG1lbWJlci5pc3BvaW50ZXIgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9pbml0X2xpc3QgKz0gJ1xuICAgICVzKG51bGxwdHIpLCcgJSAobWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG4gICAgJXMobnVsbHB0ciksJyAlIChtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaW5pdF9mdW5jX3R4dCArPSAnICAgICVzID0gbnVsbHB0cjtcbicgJSAobWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICBpZiAoaW5fc3RydWN0LT4lcylcbicgJSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICVzID0gbmV3ICVzKGluX3N0cnVjdC0+JXMpO1xuJyAlIChtZW1iZXIubmFtZSwgbV90eXBlLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKCVzKVxuJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgICAgICBkZWxldGUgJXM7XG4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICBlbGlmICdzYWZlXycgaW4gbV90eXBlOgorICAgICAgICAgICAgICAgICAgICBpbml0X2xpc3QgKz0gJ1xuICAgICVzKCZpbl9zdHJ1Y3QtPiVzKSwnICUgKG1lbWJlci5uYW1lLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaW5pdF9mdW5jX3R4dCArPSAnICAgICVzLmluaXRpYWxpemUoJmluX3N0cnVjdC0+JXMpO1xuJyAlIChtZW1iZXIubmFtZSwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaW5pdF9saXN0ICs9ICdcbiAgICAlcyhpbl9zdHJ1Y3QtPiVzKSwnICUgKG1lbWJlci5uYW1lLCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaW5pdF9mdW5jX3R4dCArPSAnICAgICVzID0gaW5fc3RydWN0LT4lcztcbicgJSAobWVtYmVyLm5hbWUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgaWYgJycgIT0gaW5pdF9saXN0OgorICAgICAgICAgICAgICAgIGluaXRfbGlzdCA9IGluaXRfbGlzdFs6LTFdICMgaGFjayBvZmYgZmluYWwgY29tbWEKKworCisgICAgICAgICAgICBpZiBpdGVtLm5hbWUgaW4gY3VzdG9tX2NvbnN0cnVjdF90eHQ6CisgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCA9IGN1c3RvbV9jb25zdHJ1Y3RfdHh0W2l0ZW0ubmFtZV0KKworICAgICAgICAgICAgY29uc3RydWN0X3R4dCA9IGNvcHlfcG5leHQgKyBjb3B5X3N0cmluZ3MgKyBjb25zdHJ1Y3RfdHh0CisKKyAgICAgICAgICAgIGlmIGl0ZW0ubmFtZSBpbiBjdXN0b21fZGVzdHJ1Y3RfdHh0OgorICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCA9IGN1c3RvbV9kZXN0cnVjdF90eHRbaXRlbS5uYW1lXQorCisgICAgICAgICAgICBpZiBjb3B5X3BuZXh0OgorICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgIGlmIChwTmV4dClcbiAgICAgICAgRnJlZVBuZXh0Q2hhaW4ocE5leHQpO1xuJworCisgICAgICAgICAgICBzYWZlX3N0cnVjdF9ib2R5LmFwcGVuZCgiXG4lczo6JXMoY29uc3QgJXMqIGluX3N0cnVjdCVzKSA6JXNcbntcbiVzfSIgJSAoc3NfbmFtZSwgc3NfbmFtZSwgaXRlbS5uYW1lLCBzZWxmLmN1c3RvbV9jb25zdHJ1Y3RfcGFyYW1zLmdldChpdGVtLm5hbWUsICcnKSwgaW5pdF9saXN0LCBjb25zdHJ1Y3RfdHh0KSkKKyAgICAgICAgICAgIGlmICcnICE9IGRlZmF1bHRfaW5pdF9saXN0OgorICAgICAgICAgICAgICAgIGRlZmF1bHRfaW5pdF9saXN0ID0gIiA6JXMiICUgKGRlZmF1bHRfaW5pdF9saXN0WzotMV0pCisgICAgICAgICAgICBzYWZlX3N0cnVjdF9ib2R5LmFwcGVuZCgiXG4lczo6JXMoKSVzXG57fSIgJSAoc3NfbmFtZSwgc3NfbmFtZSwgZGVmYXVsdF9pbml0X2xpc3QpKQorICAgICAgICAgICAgIyBDcmVhdGUgc2xpZ2h0IHZhcmlhdGlvbiBvZiBpbml0IGFuZCBjb25zdHJ1Y3QgdHh0IGZvciBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSBzcmMgb2JqZWN0IHJlZmVyZW5jZSB2cy4gc3RydWN0IHB0cgorICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RfaW5pdCA9IGluaXRfZnVuY190eHQucmVwbGFjZSgnaW5fc3RydWN0LT4nLCAnc3JjLicpCisgICAgICAgICAgICBjb3B5X2NvbnN0cnVjdF90eHQgPSBjb25zdHJ1Y3RfdHh0LnJlcGxhY2UoJyAoaW5fc3RydWN0LT4nLCAnIChzcmMuJykgICAgICAgICAgICAjIEV4Y2x1ZGUgJ2lmJyBibG9ja3MgZnJvbSBuZXh0IGxpbmUKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0X3R4dCA9IGNvbnN0cnVjdF90eHQucmVwbGFjZSgnIChpbl9zdHJ1Y3QtPicsICcgKHNyYy4nKSAgICAgICAgICAgICAgICMgRXhjbHVkZSAnaWYnIGJsb2NrcyBmcm9tIG5leHQgbGluZQorICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RfdHh0ID0gcmUuc3ViKCcobmV3IFxcdyspXFwoaW5fc3RydWN0LT4nLCAnXFwxKCpzcmMuJywgY29uc3RydWN0X3R4dCkgIyBQYXNzIG9iamVjdCB0byBjb3B5IGNvbnN0cnVjdG9ycworICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RfdHh0ID0gY29weV9jb25zdHJ1Y3RfdHh0LnJlcGxhY2UoJ2luX3N0cnVjdC0+JywgJ3NyYy4nKSAgICAgICAgICAgICAgIyBNb2RpZnkgcmVtYWluaW5nIHN0cnVjdCByZWZzIGZvciBzcmMgb2JqZWN0CisgICAgICAgICAgICBpZiBpdGVtLm5hbWUgaW4gY3VzdG9tX2NvcHlfdHh0OgorICAgICAgICAgICAgICAgIGNvcHlfY29uc3RydWN0X3R4dCA9IGN1c3RvbV9jb3B5X3R4dFtpdGVtLm5hbWVdCisgICAgICAgICAgICBjb3B5X2Fzc2lnbl90eHQgPSAnICAgIGlmICgmc3JjID09IHRoaXMpIHJldHVybiAqdGhpcztcblxuJyArIGRlc3RydWN0X3R4dCArICdcbicgKyBjb3B5X2NvbnN0cnVjdF9pbml0ICsgY29weV9jb25zdHJ1Y3RfdHh0ICsgJ1xuICAgIHJldHVybiAqdGhpczsnCisgICAgICAgICAgICBzYWZlX3N0cnVjdF9ib2R5LmFwcGVuZCgiXG4lczo6JXMoY29uc3QgJXMmIHNyYylcbntcbiVzJXN9IiAlIChzc19uYW1lLCBzc19uYW1lLCBzc19uYW1lLCBjb3B5X2NvbnN0cnVjdF9pbml0LCBjb3B5X2NvbnN0cnVjdF90eHQpKSAjIENvcHkgY29uc3RydWN0b3IKKyAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCJcbiVzJiAlczo6b3BlcmF0b3I9KGNvbnN0ICVzJiBzcmMpXG57XG4lc1xufSIgJSAoc3NfbmFtZSwgc3NfbmFtZSwgc3NfbmFtZSwgY29weV9hc3NpZ25fdHh0KSkgIyBDb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCJcbiVzOjp+JXMoKVxue1xuJXN9IiAlIChzc19uYW1lLCBzc19uYW1lLCBkZXN0cnVjdF90eHQpKQorICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfYm9keS5hcHBlbmQoIlxudm9pZCAlczo6aW5pdGlhbGl6ZShjb25zdCAlcyogaW5fc3RydWN0JXMpXG57XG4lcyVzfSIgJSAoc3NfbmFtZSwgaXRlbS5uYW1lLCBzZWxmLmN1c3RvbV9jb25zdHJ1Y3RfcGFyYW1zLmdldChpdGVtLm5hbWUsICcnKSwgaW5pdF9mdW5jX3R4dCwgY29uc3RydWN0X3R4dCkpCisgICAgICAgICAgICAjIENvcHkgaW5pdGlhbGl6ZXIgdXNlcyBzYW1lIHR4dCBhcyBjb3B5IGNvbnN0cnVjdG9yIGJ1dCBoYXMgYSBwdHIgYW5kIG5vdCBhIHJlZmVyZW5jZQorICAgICAgICAgICAgaW5pdF9jb3B5ID0gY29weV9jb25zdHJ1Y3RfaW5pdC5yZXBsYWNlKCdzcmMuJywgJ3NyYy0+JykKKyAgICAgICAgICAgIGluaXRfY29uc3RydWN0ID0gY29weV9jb25zdHJ1Y3RfdHh0LnJlcGxhY2UoJ3NyYy4nLCAnc3JjLT4nKQorICAgICAgICAgICAgc2FmZV9zdHJ1Y3RfYm9keS5hcHBlbmQoIlxudm9pZCAlczo6aW5pdGlhbGl6ZShjb25zdCAlcyogc3JjKVxue1xuJXMlc30iICUgKHNzX25hbWUsIHNzX25hbWUsIGluaXRfY29weSwgaW5pdF9jb25zdHJ1Y3QpKQorICAgICAgICAgICAgaWYgaXRlbS5pZmRlZl9wcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNhZmVfc3RydWN0X2JvZHkuYXBwZW5kKCIjZW5kaWYgLy8gJXNcbiIgJSBpdGVtLmlmZGVmX3Byb3RlY3QpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oc2FmZV9zdHJ1Y3RfYm9keSkKKyAgICAjCisgICAgIyBHZW5lcmF0ZSB0aGUgdHlwZSBtYXAKKyAgICBkZWYgR2VuZXJhdGVUeXBlTWFwSGVscGVySGVhZGVyKHNlbGYpOgorICAgICAgICBwcmVmaXggPSAnTHZsJworICAgICAgICBmcHJlZml4ID0gJ2x2bF8nCisgICAgICAgIHR5cGVtYXAgPSBwcmVmaXggKyAnVHlwZU1hcCcKKyAgICAgICAgaWRtYXAgPSBwcmVmaXggKyAnU1R5cGVNYXAnCisgICAgICAgIHR5cGVfbWVtYmVyID0gJ1R5cGUnCisgICAgICAgIGlkX21lbWJlciA9ICdrU1R5cGUnCisgICAgICAgIGlkX2RlY2wgPSAnc3RhdGljIGNvbnN0IFZrU3RydWN0dXJlVHlwZSAnCisgICAgICAgIGdlbmVyaWNfaGVhZGVyID0gJ1ZrQmFzZU91dFN0cnVjdHVyZScKKyAgICAgICAgdHlwZW5hbWVfZnVuYyA9IGZwcmVmaXggKyAndHlwZW5hbWUnCisgICAgICAgIGlkbmFtZV9mdW5jID0gZnByZWZpeCArICdzdHlwZV9uYW1lJworICAgICAgICBmaW5kX2Z1bmMgPSBmcHJlZml4ICsgJ2ZpbmRfaW5fY2hhaW4nCisgICAgICAgIGluaXRfZnVuYyA9IGZwcmVmaXggKyAnaW5pdF9zdHJ1Y3QnCisKKyAgICAgICAgZXhwbGFuYXRvcnlfY29tbWVudCA9ICdcbicuam9pbigoCisgICAgICAgICAgICAgICAgJy8vIFRoZXNlIGVtcHR5IGdlbmVyaWMgdGVtcGxhdGVzIGFyZSBzcGVjaWFsaXplZCBmb3IgZWFjaCB0eXBlIHdpdGggc1R5cGUnLAorICAgICAgICAgICAgICAgICcvLyBtZW1iZXJzIGFuZCBmb3IgZWFjaCBzVHlwZSAtLSBwcm92aWRpbmcgYSB0d28gd2F5IG1hcCBiZXR3ZWVuIHN0cnVjdHVyZScsCisgICAgICAgICAgICAgICAgJy8vIHR5cGVzIGFuZCBzVHlwZXMnKSkKKworICAgICAgICBlbXB0eV90eXBlbWFwID0gJ3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgJyArIHR5cGVtYXAgKyAnIHt9OycKKyAgICAgICAgdHlwZW1hcF9mb3JtYXQgID0gJ3RlbXBsYXRlIDw+IHN0cnVjdCB7dGVtcGxhdGV9PHt0eXBlbmFtZX0+IHt7XG4nCisgICAgICAgIHR5cGVtYXBfZm9ybWF0ICs9ICcgICAge2lkX2RlY2x9e2lkX21lbWJlcn0gPSB7aWRfdmFsdWV9O1xuJworICAgICAgICB0eXBlbWFwX2Zvcm1hdCArPSAnfX07XG4nCisKKyAgICAgICAgZW1wdHlfaWRtYXAgPSAndGVtcGxhdGUgPFZrU3RydWN0dXJlVHlwZSBpZD4gc3RydWN0ICcgKyBpZG1hcCArICcge307JworICAgICAgICBpZG1hcF9mb3JtYXQgPSAnJy5qb2luKCgKKyAgICAgICAgICAgICd0ZW1wbGF0ZSA8PiBzdHJ1Y3Qge3RlbXBsYXRlfTx7aWRfdmFsdWV9PiB7e1xuJywKKyAgICAgICAgICAgICcgICAgdHlwZWRlZiB7dHlwZW5hbWV9IHt0eXBlZGVmfTtcbicsCisgICAgICAgICAgICAnfX07XG4nKSkKKworICAgICAgICAjIERlZmluZSB0aGUgdXRpbGl0aWVzIChoZXJlIHNvIGFueSByZW5hbWluZyBzdGF5cyBjb25zaXN0ZW50KSwgaWYgdGhpcyBncm93cyBsYXJnZSwgcmVmYWN0b3IgdG8gYSBmaXhlZCAuaCBmaWxlCisgICAgICAgIHV0aWxpdGllc19mb3JtYXQgPSAnXG4nLmpvaW4oKAorICAgICAgICAgICAgJy8vIEZpbmQgYW4gZW50cnkgb2YgdGhlIGdpdmVuIHR5cGUgaW4gdGhlIHBOZXh0IGNoYWluJywKKyAgICAgICAgICAgICd0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCAqe2ZpbmRfZnVuY30oY29uc3Qgdm9pZCAqbmV4dCkge3snLAorICAgICAgICAgICAgJyAgICBjb25zdCB7aGVhZGVyfSAqY3VycmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qge2hlYWRlcn0gKj4obmV4dCk7JywKKyAgICAgICAgICAgICcgICAgY29uc3QgVCAqZm91bmQgPSBudWxscHRyOycsCisgICAgICAgICAgICAnICAgIHdoaWxlIChjdXJyZW50KSB7eycsCisgICAgICAgICAgICAnICAgICAgICBpZiAoe3R5cGVfbWFwfTxUPjo6e2lkX21lbWJlcn0gPT0gY3VycmVudC0+c1R5cGUpIHt7JywKKyAgICAgICAgICAgICcgICAgICAgICAgICBmb3VuZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGN1cnJlbnQpOycsCisgICAgICAgICAgICAnICAgICAgICAgICAgY3VycmVudCA9IG51bGxwdHI7JywKKyAgICAgICAgICAgICcgICAgICAgIH19IGVsc2Uge3snLAorICAgICAgICAgICAgJyAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wTmV4dDsnLAorICAgICAgICAgICAgJyAgICAgICAgfX0nLAorICAgICAgICAgICAgJyAgICB9fScsCisgICAgICAgICAgICAnICAgIHJldHVybiBmb3VuZDsnLAorICAgICAgICAgICAgJ319JywKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJy8vIEluaXQgdGhlIGhlYWRlciBvZiBhbiBzVHlwZSBzdHJ1Y3Qgd2l0aCBwTmV4dCcsCisgICAgICAgICAgICAndGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQge2luaXRfZnVuY30odm9pZCAqcF9uZXh0KSB7eycsCisgICAgICAgICAgICAnICAgIFQgb3V0ID0ge3t9fTsnLAorICAgICAgICAgICAgJyAgICBvdXQuc1R5cGUgPSB7dHlwZV9tYXB9PFQ+OjprU1R5cGU7JywKKyAgICAgICAgICAgICcgICAgb3V0LnBOZXh0ID0gcF9uZXh0OycsCisgICAgICAgICAgICAnICAgIHJldHVybiBvdXQ7JywKKyAgICAgICAgICAgICd9fScsCisgICAgICAgICAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICcvLyBJbml0IHRoZSBoZWFkZXIgb2YgYW4gc1R5cGUgc3RydWN0JywKKyAgICAgICAgICAgICd0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCB7aW5pdF9mdW5jfSgpIHt7JywKKyAgICAgICAgICAgICcgICAgVCBvdXQgPSB7e319OycsCisgICAgICAgICAgICAnICAgIG91dC5zVHlwZSA9IHt0eXBlX21hcH08VD46OmtTVHlwZTsnLAorICAgICAgICAgICAgJyAgICByZXR1cm4gb3V0OycsCisgICAgICAgICAgICAnfX0nLAorCisgICAgICAgICAgICAnJykpCisKKyAgICAgICAgY29kZSA9IFtdCisKKyAgICAgICAgIyBHZW5lcmF0ZSBoZWFkZXIKKyAgICAgICAgY29kZS5hcHBlbmQoJ1xuJy5qb2luKCgKKyAgICAgICAgICAgICcjcHJhZ21hIG9uY2UnLAorICAgICAgICAgICAgJyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+XG4nLAorICAgICAgICAgICAgZXhwbGFuYXRvcnlfY29tbWVudCwgJycsCisgICAgICAgICAgICBlbXB0eV9pZG1hcCwKKyAgICAgICAgICAgIGVtcHR5X3R5cGVtYXAsICcnKSkpCisKKyAgICAgICAgIyBHZW5lcmF0ZSB0aGUgc3BlY2lhbGl6YXRpb25zIGZvciBlYWNoIHR5cGUgYW5kIHN0eXBlCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuc3RydWN0TWVtYmVyczoKKyAgICAgICAgICAgIHR5cGVuYW1lID0gaXRlbS5uYW1lCisgICAgICAgICAgICBpbmZvID0gc2VsZi5zdHJ1Y3RUeXBlcy5nZXQodHlwZW5hbWUpCisgICAgICAgICAgICBpZiBub3QgaW5mbzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpdGVtLmlmZGVmX3Byb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoJyNpZmRlZiAlcycgJSBpdGVtLmlmZGVmX3Byb3RlY3QpCisKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCcvLyBNYXAgdHlwZSB7fSB0byBpZCB7fScuZm9ybWF0KHR5cGVuYW1lLCBpbmZvLnZhbHVlKSkKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKHR5cGVtYXBfZm9ybWF0LmZvcm1hdCh0ZW1wbGF0ZT10eXBlbWFwLCB0eXBlbmFtZT10eXBlbmFtZSwgaWRfdmFsdWU9aW5mby52YWx1ZSwKKyAgICAgICAgICAgICAgICBpZF9kZWNsPWlkX2RlY2wsIGlkX21lbWJlcj1pZF9tZW1iZXIpKQorICAgICAgICAgICAgY29kZS5hcHBlbmQoaWRtYXBfZm9ybWF0LmZvcm1hdCh0ZW1wbGF0ZT1pZG1hcCwgdHlwZW5hbWU9dHlwZW5hbWUsIGlkX3ZhbHVlPWluZm8udmFsdWUsIHR5cGVkZWY9dHlwZV9tZW1iZXIpKQorCisgICAgICAgICAgICBpZiBpdGVtLmlmZGVmX3Byb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoJyNlbmRpZiAvLyAlcycgJSBpdGVtLmlmZGVmX3Byb3RlY3QpCisKKyAgICAgICAgIyBHZW5lcmF0ZSB1dGlsaXRpZXMgZm9yIGFsbCB0eXBlcworICAgICAgICBjb2RlLmFwcGVuZCgnXG4nLmpvaW4oKAorICAgICAgICAgICAgdXRpbGl0aWVzX2Zvcm1hdC5mb3JtYXQoaWRfbWVtYmVyPWlkX21lbWJlciwgaWRfbWFwPWlkbWFwLCB0eXBlX21hcD10eXBlbWFwLAorICAgICAgICAgICAgICAgIHR5cGVfbWVtYmVyPXR5cGVfbWVtYmVyLCBoZWFkZXI9Z2VuZXJpY19oZWFkZXIsIHR5cGVuYW1lX2Z1bmM9dHlwZW5hbWVfZnVuYywgaWRuYW1lX2Z1bmM9aWRuYW1lX2Z1bmMsCisgICAgICAgICAgICAgICAgZmluZF9mdW5jPWZpbmRfZnVuYywgaW5pdF9mdW5jPWluaXRfZnVuYyksICcnCisgICAgICAgICAgICApKSkKKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGNvZGUpCisKKyAgICAjCisgICAgIyBDcmVhdGUgYSBoZWxwZXIgZmlsZSBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nCisgICAgZGVmIE91dHB1dERlc3RGaWxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPT0gJ2VudW1fc3RyaW5nX2hlYWRlcic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5HZW5lcmF0ZUVudW1TdHJpbmdIZWxwZXJIZWFkZXIoKQorICAgICAgICBlbGlmIHNlbGYuaGVscGVyX2ZpbGVfdHlwZSA9PSAnc2FmZV9zdHJ1Y3RfaGVhZGVyJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkdlbmVyYXRlU2FmZVN0cnVjdEhlbHBlckhlYWRlcigpCisgICAgICAgIGVsaWYgc2VsZi5oZWxwZXJfZmlsZV90eXBlID09ICdzYWZlX3N0cnVjdF9zb3VyY2UnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2VuZXJhdGVTYWZlU3RydWN0SGVscGVyU291cmNlKCkKKyAgICAgICAgZWxpZiBzZWxmLmhlbHBlcl9maWxlX3R5cGUgPT0gJ29iamVjdF90eXBlc19oZWFkZXInOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2VuZXJhdGVPYmplY3RUeXBlc0hlbHBlckhlYWRlcigpCisgICAgICAgIGVsaWYgc2VsZi5oZWxwZXJfZmlsZV90eXBlID09ICdleHRlbnNpb25faGVscGVyX2hlYWRlcic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5HZW5lcmF0ZUV4dGVuc2lvbkhlbHBlckhlYWRlcigpCisgICAgICAgIGVsaWYgc2VsZi5oZWxwZXJfZmlsZV90eXBlID09ICd0eXBlbWFwX2hlbHBlcl9oZWFkZXInOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2VuZXJhdGVUeXBlTWFwSGVscGVySGVhZGVyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnQmFkIEhlbHBlciBGaWxlIEdlbmVyYXRvciBPcHRpb24gJXMnICUgc2VsZi5oZWxwZXJfZmlsZV90eXBlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2tub3duX2dvb2QuanNvbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMva25vd25fZ29vZC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDgzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2tub3duX2dvb2QuanNvbgpAQCAtMCwwICsxLDk4IEBACit7CisgICJyZXBvcyIgOiBbCisgICAgeworICAgICAgIm5hbWUiIDogImdsc2xhbmciLAorICAgICAgInVybCIgOiAiaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbHNsYW5nLmdpdCIsCisgICAgICAic3ViX2RpciIgOiAiZ2xzbGFuZyIsCisgICAgICAiYnVpbGRfZGlyIiA6ICJnbHNsYW5nL2J1aWxkIiwKKyAgICAgICJpbnN0YWxsX2RpciIgOiAiZ2xzbGFuZy9idWlsZC9pbnN0YWxsIiwKKyAgICAgICJjb21taXQiIDogImIxMzE2MzBlN2M3NDlhNWRjMTlmYWE0NTgwMjQyNjBjNzFmYjE3MGYiLAorICAgICAgInByZWJ1aWxkIiA6IFsKKyAgICAgICAgInB5dGhvbiB1cGRhdGVfZ2xzbGFuZ19zb3VyY2VzLnB5IgorICAgICAgXSwKKyAgICAgICJjbWFrZV9vcHRpb25zIiA6IFsKKyAgICAgICAgIi1EVVNFX0NDQUNIRT1PTiIKKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIiA6ICJWdWxrYW4tSGVhZGVycyIsCisgICAgICAidXJsIiA6ICJodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1IZWFkZXJzLmdpdCIsCisgICAgICAic3ViX2RpciIgOiAiVnVsa2FuLUhlYWRlcnMiLAorICAgICAgImJ1aWxkX2RpciIgOiAiVnVsa2FuLUhlYWRlcnMvYnVpbGQiLAorICAgICAgImluc3RhbGxfZGlyIiA6ICJWdWxrYW4tSGVhZGVycy9idWlsZC9pbnN0YWxsIiwKKyAgICAgICJjb21taXQiIDogInYxLjEuMTMwIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiIDogIlZ1bGthblRvb2xzIiwKKyAgICAgICJ1cmwiIDogImh0dHBzOi8vZ2l0aHViLmNvbS9MdW5hckcvVnVsa2FuVG9vbHMuZ2l0IiwKKyAgICAgICJzdWJfZGlyIiA6ICJWdWxrYW5Ub29scyIsCisgICAgICAiYnVpbGRfZGlyIiA6ICJWdWxrYW5Ub29scy9idWlsZCIsCisgICAgICAiaW5zdGFsbF9kaXIiIDogIlZ1bGthblRvb2xzL2J1aWxkL2luc3RhbGwiLAorICAgICAgImNvbW1pdCIgOiAiODQzZDg4NGY4YWEzMjhkOGUzM2JjNmNlOTk2Y2Q1Nzk5ZTE2YzRmNCIsCisgICAgICAiZGVwcyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidmFyX25hbWUiIDogIlZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSIiwKKyAgICAgICAgICAicmVwb19uYW1lIiA6ICJWdWxrYW4tSGVhZGVycyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2YXJfbmFtZSIgOiAiVlVMS0FOX0xPQURFUl9JTlNUQUxMX0RJUiIsCisgICAgICAgICAgInJlcG9fbmFtZSIgOiAiVnVsa2FuLUxvYWRlciIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2YXJfbmFtZSIgOiAiVlVMS0FOX1ZBTElEQVRJT05MQVlFUlNfSU5TVEFMTF9ESVIiLAorICAgICAgICAgICJyZXBvX25hbWUiIDogIlZ1bGthbi1WYWxpZGF0aW9uTGF5ZXJzIgorICAgICAgICB9CisgICAgICBdLAorICAgICAgInByZWJ1aWxkX2xpbnV4IiA6IFsKKyAgICAgICAgImJhc2ggdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuc2giCisgICAgICBdLAorICAgICAgInByZWJ1aWxkX3dpbmRvd3MiIDogWworICAgICAgICAiLlxcdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuYmF0IgorICAgICAgXSwKKyAgICAgICJjbWFrZV9vcHRpb25zIiA6IFsKKyAgICAgICAgIi1EQlVJTERfVEVTVFM9Tk8iLAorICAgICAgICAiLURCVUlMRF9WS1RSQUNFPU5PIiwKKyAgICAgICAgIi1EQlVJTERfVkxGPU5PIiwKKyAgICAgICAgIi1EQlVJTERfVklBPU5PIgorICAgICAgXSwKKyAgICAgICJjaV9vbmx5IiA6IFsKKyAgICAgICAgIlRSQVZJUyIKKyAgICAgIF0sCisgICAgICAiYnVpbGRfc3RlcCIgOiAic2tpcCIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIiA6ICJWdWxrYW4tVG9vbHMiLAorICAgICAgInVybCIgOiAiaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tVG9vbHMuZ2l0IiwKKyAgICAgICJzdWJfZGlyIiA6ICJWdWxrYW4tVG9vbHMiLAorICAgICAgImJ1aWxkX2RpciIgOiAiVnVsa2FuLVRvb2xzL2J1aWxkIiwKKyAgICAgICJpbnN0YWxsX2RpciIgOiAiVnVsa2FuLVRvb2xzL2J1aWxkL2luc3RhbGwiLAorICAgICAgImNvbW1pdCIgOiAiNWNlYjdiZTlhM2JmODZmMzRhZGU1YTdmNzI0NTkyNDhkOTlhNGI3NiIsCisgICAgICAiZGVwcyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAidmFyX25hbWUiIDogIlZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSIiwKKyAgICAgICAgICAicmVwb19uYW1lIiA6ICJWdWxrYW4tSGVhZGVycyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2YXJfbmFtZSIgOiAiR0xTTEFOR19JTlNUQUxMX0RJUiIsCisgICAgICAgICAgInJlcG9fbmFtZSIgOiAiZ2xzbGFuZyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJ2YXJfbmFtZSIgOiAiTU9MVEVOVktfUkVQT19ST09UIiwKKyAgICAgICAgICAicmVwb19uYW1lIiA6ICJNb2x0ZW5WSyIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgICJjbWFrZV9vcHRpb25zIiA6IFsKKyAgICAgICAgIi1EQlVJTERfQ1VCRT1OTyIsCisgICAgICAgICItREJVSUxEX1ZVTEtBTklORk89Tk8iLAorICAgICAgICAiLURJTlNUQUxMX0lDRD1PTiIKKyAgICAgIF0sCisgICAgICAiY2lfb25seSIgOiBbCisgICAgICAgICJUUkFWSVMiCisgICAgICBdCisgICAgfQorICBdLAorICAiaW5zdGFsbF9uYW1lcyIgOiB7CisgICAgICAiZ2xzbGFuZyIgOiAiR0xTTEFOR19JTlNUQUxMX0RJUiIsCisgICAgICAiVnVsa2FuLUhlYWRlcnMiIDogIlZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbGF5ZXJfY2hhc3Npc19kaXNwYXRjaF9nZW5lcmF0b3IucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2xheWVyX2NoYXNzaXNfZGlzcGF0Y2hfZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmIwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL2xheWVyX2NoYXNzaXNfZGlzcGF0Y2hfZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMTc5NiBAQAorIyEvdXNyL2Jpbi9weXRob24zIC1pCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKworaW1wb3J0IG9zLHJlLHN5cworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBldHJlZQorZnJvbSBnZW5lcmF0b3IgaW1wb3J0ICoKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKK2Zyb20gY29tbW9uX2NvZGVnZW4gaW1wb3J0ICoKKworIyBMYXllckNoYXNzaXNEaXNwYXRjaEdlbmVyYXRvck9wdGlvbnMgLSBzdWJjbGFzcyBvZiBHZW5lcmF0b3JPcHRpb25zLgorIworIyBBZGRzIG9wdGlvbnMgdXNlZCBieSBMYXllckNoYXNzaXNEaXNwYXRjaE91dHB1dEdlbmVyYXRvciBvYmplY3RzIGR1cmluZworIyBsYXllciBjaGFzc2lzIGRpc3BhdGNoIGZpbGUgZ2VuZXJhdGlvbi4KKyMKKyMgQWRkaXRpb25hbCBtZW1iZXJzCisjICAgcHJlZml4VGV4dCAtIGxpc3Qgb2Ygc3RyaW5ncyB0byBwcmVmaXggZ2VuZXJhdGVkIGhlYWRlciB3aXRoCisjICAgICAodXN1YWxseSBhIGNvcHlyaWdodCBzdGF0ZW1lbnQgKyBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm9zKS4KKyMgICBwcm90ZWN0RmlsZSAtIFRydWUgaWYgbXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gc2hvdWxkIGJlCisjICAgICBnZW5lcmF0ZWQgKGJhc2VkIG9uIHRoZSBmaWxlbmFtZSkgYXJvdW5kIHRoZSBlbnRpcmUgaGVhZGVyLgorIyAgIHByb3RlY3RGZWF0dXJlIC0gVHJ1ZSBpZiAjaWZuZGVmLi4jZW5kaWYgcHJvdGVjdGlvbiBzaG91bGQgYmUKKyMgICAgIGdlbmVyYXRlZCBhcm91bmQgYSBmZWF0dXJlIGludGVyZmFjZSBpbiB0aGUgaGVhZGVyIGZpbGUuCisjICAgZ2VuRnVuY1BvaW50ZXJzIC0gVHJ1ZSBpZiBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzIHNob3VsZCBiZQorIyAgICAgZ2VuZXJhdGVkCisjICAgcHJvdGVjdFByb3RvIC0gSWYgY29uZGl0aW9uYWwgcHJvdGVjdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkCisjICAgICBhcm91bmQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgc2V0IHRvIGVpdGhlciAnI2lmZGVmJworIyAgICAgdG8gcmVxdWlyZSBvcHQtaW4gKCNpZmRlZiBwcm90ZWN0UHJvdG9TdHIpIG9yICcjaWZuZGVmJworIyAgICAgdG8gcmVxdWlyZSBvcHQtb3V0ICgjaWZuZGVmIHByb3RlY3RQcm90b1N0cikuIE90aGVyd2lzZQorIyAgICAgc2V0IHRvIE5vbmUuCisjICAgcHJvdGVjdFByb3RvU3RyIC0gI2lmZGVmLyNpZm5kZWYgc3ltYm9sIHRvIHVzZSBhcm91bmQgcHJvdG90eXBlCisjICAgICBkZWNsYXJhdGlvbnMsIGlmIHByb3RlY3RQcm90byBpcyBzZXQKKyMgICBhcGljYWxsIC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHByZWZpeCwKKyMgICAgIHN1Y2ggYXMgQVBJQ0FMTCBvbiBXaW5kb3dzLgorIyAgIGFwaWVudHJ5IC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGNhbGxpbmcgY29udmVudGlvbiBtYWNybywKKyMgICAgIGluIHR5cGVkZWZzLCBzdWNoIGFzIEFQSUVOVFJZLgorIyAgIGFwaWVudHJ5cCAtIHN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8KKyMgICAgIGluIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMsIHN1Y2ggYXMgQVBJRU5UUllQLgorIyAgIGluZGVudEZ1bmNQcm90byAtIFRydWUgaWYgcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBzaG91bGQgcHV0IGVhY2gKKyMgICAgIHBhcmFtZXRlciBvbiBhIHNlcGFyYXRlIGxpbmUKKyMgICBpbmRlbnRGdW5jUG9pbnRlciAtIFRydWUgaWYgdHlwZWRlZmVkIGZ1bmN0aW9uIHBvaW50ZXJzIHNob3VsZCBwdXQgZWFjaAorIyAgICAgcGFyYW1ldGVyIG9uIGEgc2VwYXJhdGUgbGluZQorIyAgIGFsaWduRnVuY1BhcmFtIC0gaWYgbm9uemVybyBhbmQgcGFyYW1ldGVycyBhcmUgYmVpbmcgcHV0IG9uIGEKKyMgICAgIHNlcGFyYXRlIGxpbmUsIGFsaWduIHBhcmFtZXRlciBuYW1lcyBhdCB0aGUgc3BlY2lmaWVkIGNvbHVtbgorY2xhc3MgTGF5ZXJDaGFzc2lzRGlzcGF0Y2hHZW5lcmF0b3JPcHRpb25zKEdlbmVyYXRvck9wdGlvbnMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBjb252ZW50aW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gJy4nLAorICAgICAgICAgICAgICAgICBhcGluYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZW1pdHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgc29ydFByb2NlZHVyZSA9IHJlZ1NvcnRGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgcHJlZml4VGV4dCA9ICIiLAorICAgICAgICAgICAgICAgICBnZW5GdW5jUG9pbnRlcnMgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0RmlsZSA9IFRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgYXBpY2FsbCA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeSA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeXAgPSAnJywKKyAgICAgICAgICAgICAgICAgaW5kZW50RnVuY1Byb3RvID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgaW5kZW50RnVuY1BvaW50ZXIgPSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gVHJ1ZSk6CisgICAgICAgIEdlbmVyYXRvck9wdGlvbnMuX19pbml0X18oc2VsZiwgY29udmVudGlvbnMsIGZpbGVuYW1lLCBkaXJlY3RvcnksIGFwaW5hbWUsIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMsIGVtaXR2ZXJzaW9ucywgZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucywgcmVtb3ZlRXh0ZW5zaW9ucywgZW1pdEV4dGVuc2lvbnMsIHNvcnRQcm9jZWR1cmUpCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gcHJlZml4VGV4dAorICAgICAgICBzZWxmLmdlbkZ1bmNQb2ludGVycyA9IGdlbkZ1bmNQb2ludGVycworICAgICAgICBzZWxmLnByb3RlY3RGaWxlICAgICA9IHByb3RlY3RGaWxlCisgICAgICAgIHNlbGYucHJvdGVjdEZlYXR1cmUgID0gcHJvdGVjdEZlYXR1cmUKKyAgICAgICAgc2VsZi5hcGljYWxsICAgICAgICAgPSBhcGljYWxsCisgICAgICAgIHNlbGYuYXBpZW50cnkgICAgICAgID0gYXBpZW50cnkKKyAgICAgICAgc2VsZi5hcGllbnRyeXAgICAgICAgPSBhcGllbnRyeXAKKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUHJvdG8gPSBpbmRlbnRGdW5jUHJvdG8KKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUG9pbnRlciA9IGluZGVudEZ1bmNQb2ludGVyCisgICAgICAgIHNlbGYuYWxpZ25GdW5jUGFyYW0gICA9IGFsaWduRnVuY1BhcmFtCisgICAgICAgIHNlbGYuZXhwYW5kRW51bWVyYW50cyA9IGV4cGFuZEVudW1lcmFudHMKKworCisjIExheWVyQ2hhc3Npc0Rpc3BhdGNoT3V0cHV0R2VuZXJhdG9yIC0gc3ViY2xhc3Mgb2YgT3V0cHV0R2VuZXJhdG9yLgorIyBHZW5lcmF0ZXMgbGF5ZXIgY2hhc3NpcyBub24tZGlzcGF0Y2hhYmxlIGhhbmRsZS13cmFwcGluZyBjb2RlLgorIworIyAtLS0tIG1ldGhvZHMgLS0tLQorIyBMYXllckNoYXNzaXNEaXNwYXRjaE91dHB1dEdlbmVyYXRvcihlcnJGaWxlLCB3YXJuRmlsZSwgZGlhZ0ZpbGUpIC0gYXJncyBhcyBmb3IgT3V0cHV0R2VuZXJhdG9yLiBEZWZpbmVzIGFkZGl0aW9uYWwgaW50ZXJuYWwgc3RhdGUuCisjIC0tLS0gbWV0aG9kcyBvdmVycmlkaW5nIGJhc2UgY2xhc3MgLS0tLQorIyBiZWdpbkZpbGUoZ2VuT3B0cykKKyMgZW5kRmlsZSgpCisjIGJlZ2luRmVhdHVyZShpbnRlcmZhY2UsIGVtaXQpCisjIGVuZEZlYXR1cmUoKQorIyBnZW5DbWQoY21kaW5mbykKKyMgZ2VuU3RydWN0KCkKKyMgZ2VuVHlwZSgpCitjbGFzcyBMYXllckNoYXNzaXNEaXNwYXRjaE91dHB1dEdlbmVyYXRvcihPdXRwdXRHZW5lcmF0b3IpOgorICAgICIiIkdlbmVyYXRlIGxheWVyIGNoYXNzaXMgaGFuZGxlIHdyYXBwaW5nIGNvZGUgYmFzZWQgb24gWE1MIGVsZW1lbnQgYXR0cmlidXRlcyIiIgorICAgIGlubGluZV9jb3B5cmlnaHRfbWVzc2FnZSA9ICIiIgorLy8gVGhpcyBmaWxlIGlzICoqKkdFTkVSQVRFRCoqKi4gIERvIE5vdCBFZGl0LgorLy8gU2VlIGxheWVyX2NoYXNzaXNfZGlzcGF0Y2hfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zLgorCisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICovIiIiCisKKyAgICBpbmxpbmVfY3VzdG9tX3NvdXJjZV9wcmVhbWJsZSA9ICIiIgorCisjZGVmaW5lIERJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OUyAzMgorCisvLyBUaGUgVktfRVhUX3BpcGVsaW5lX2NyZWF0aW9uX2ZlZWRiYWNrIGV4dGVuc2lvbiByZXR1cm5zIGRhdGEgZnJvbSB0aGUgZHJpdmVyIC0tIHdlJ3ZlIGNyZWF0ZWQgYSBjb3B5IG9mIHRoZSBwbmV4dCBjaGFpbiwgc28KKy8vIGNvcHkgdGhlIHJldHVybmVkIGRhdGEgdG8gdGhlIGNhbGxlciBiZWZvcmUgZnJlZWluZyB0aGUgY29weSdzIGRhdGEuCit2b2lkIENvcHlDcmVhdGVQaXBlbGluZUZlZWRiYWNrRGF0YShjb25zdCB2b2lkICpzcmNfY2hhaW4sIGNvbnN0IHZvaWQgKmRzdF9jaGFpbikgeworICAgIGF1dG8gc3JjX2ZlZWRiYWNrX3N0cnVjdCA9IGx2bF9maW5kX2luX2NoYWluPFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVD4oc3JjX2NoYWluKTsKKyAgICBpZiAoIXNyY19mZWVkYmFja19zdHJ1Y3QpIHJldHVybjsKKyAgICBhdXRvIGRzdF9mZWVkYmFja19zdHJ1Y3QgPSBjb25zdF9jYXN0PFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVCAqPigKKyAgICAgICAgbHZsX2ZpbmRfaW5fY2hhaW48VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUPihkc3RfY2hhaW4pKTsKKyAgICAqZHN0X2ZlZWRiYWNrX3N0cnVjdC0+cFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9ICpzcmNfZmVlZGJhY2tfc3RydWN0LT5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzcmNfZmVlZGJhY2tfc3RydWN0LT5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50OyBpKyspIHsKKyAgICAgICAgZHN0X2ZlZWRiYWNrX3N0cnVjdC0+cFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrc1tpXSA9IHNyY19mZWVkYmFja19zdHJ1Y3QtPnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3NbaV07CisgICAgfQorfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUGlwZWxpbmUgKnBQaXBlbGluZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICBzYWZlX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvcyA9IG51bGxwdHI7CisgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mb3MgPSBuZXcgc2FmZV9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvW2NyZWF0ZUluZm9Db3VudF07CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIGZvciAodWludDMyX3QgaWR4MCA9IDA7IGlkeDAgPCBjcmVhdGVJbmZvQ291bnQ7ICsraWR4MCkgeworICAgICAgICAgICAgYm9vbCB1c2VzX2NvbG9yX2F0dGFjaG1lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2wgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCA9IGZhbHNlOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gc3VicGFzc2VzX3VzZXNfaXQgPSBsYXllcl9kYXRhLT5yZW5kZXJwYXNzZXNfc3RhdGVzLmZpbmQobGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvc1tpZHgwXS5yZW5kZXJQYXNzKSk7CisgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3Nlc191c2VzX2l0ICE9IGxheWVyX2RhdGEtPnJlbmRlcnBhc3Nlc19zdGF0ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmc3VicGFzc2VzX3VzZXMgPSBzdWJwYXNzZXNfdXNlc19pdC0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VicGFzc2VzX3VzZXMuc3VicGFzc2VzX3VzaW5nX2NvbG9yX2F0dGFjaG1lbnQuY291bnQocENyZWF0ZUluZm9zW2lkeDBdLnN1YnBhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgdXNlc19jb2xvcl9hdHRhY2htZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhc3Nlc191c2VzLnN1YnBhc3Nlc191c2luZ19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudC5jb3VudChwQ3JlYXRlSW5mb3NbaWR4MF0uc3VicGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VzX2RlcHRoc3RlbmNpbF9hdHRhY2htZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvc1tpZHgwXS5pbml0aWFsaXplKCZwQ3JlYXRlSW5mb3NbaWR4MF0sIHVzZXNfY29sb3JfYXR0YWNobWVudCwgdXNlc19kZXB0aHN0ZW5jaWxfYXR0YWNobWVudCk7CisKKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaWR4MF0uYmFzZVBpcGVsaW5lSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2lkeDBdLmJhc2VQaXBlbGluZUhhbmRsZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mb3NbaWR4MF0uYmFzZVBpcGVsaW5lSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaWR4MF0ubGF5b3V0KSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2lkeDBdLmxheW91dCA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mb3NbaWR4MF0ubGF5b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaWR4MF0ucFN0YWdlcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaWR4MSA9IDA7IGlkeDEgPCBwQ3JlYXRlSW5mb3NbaWR4MF0uc3RhZ2VDb3VudDsgKytpZHgxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQ3JlYXRlSW5mb3NbaWR4MF0ucFN0YWdlc1tpZHgxXS5tb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvc1tpZHgwXS5wU3RhZ2VzW2lkeDFdLm1vZHVsZSA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mb3NbaWR4MF0ucFN0YWdlc1tpZHgxXS5tb2R1bGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpZHgwXS5yZW5kZXJQYXNzKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2lkeDBdLnJlbmRlclBhc3MgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm9zW2lkeDBdLnJlbmRlclBhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwaXBlbGluZUNhY2hlKSB7CisgICAgICAgIHBpcGVsaW5lQ2FjaGUgPSBsYXllcl9kYXRhLT5VbndyYXAocGlwZWxpbmVDYWNoZSk7CisgICAgfQorCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mb3MtPnB0cigpLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3JlYXRlSW5mb0NvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5wTmV4dCAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgQ29weUNyZWF0ZVBpcGVsaW5lRmVlZGJhY2tEYXRhKGxvY2FsX3BDcmVhdGVJbmZvc1tpXS5wTmV4dCwgcENyZWF0ZUluZm9zW2ldLnBOZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZVtdIGxvY2FsX3BDcmVhdGVJbmZvczsKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHBQaXBlbGluZXNbaV0gIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICBwUGlwZWxpbmVzW2ldID0gbGF5ZXJfZGF0YS0+V3JhcE5ldyhwUGlwZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIFVwZGF0ZUNyZWF0ZVJlbmRlclBhc3NTdGF0ZShWYWxpZGF0aW9uT2JqZWN0ICpsYXllcl9kYXRhLCBjb25zdCBUICpwQ3JlYXRlSW5mbywgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3MpIHsKKyAgICBhdXRvICZyZW5kZXJwYXNzX3N0YXRlID0gbGF5ZXJfZGF0YS0+cmVuZGVycGFzc2VzX3N0YXRlc1tyZW5kZXJQYXNzXTsKKworICAgIGZvciAodWludDMyX3Qgc3VicGFzcyA9IDA7IHN1YnBhc3MgPCBwQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50OyArK3N1YnBhc3MpIHsKKyAgICAgICAgYm9vbCB1c2VzX2NvbG9yID0gZmFsc2U7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tzdWJwYXNzXS5jb2xvckF0dGFjaG1lbnRDb3VudCAmJiAhdXNlc19jb2xvcjsgKytpKQorICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NdLnBDb2xvckF0dGFjaG1lbnRzW2ldLmF0dGFjaG1lbnQgIT0gVktfQVRUQUNITUVOVF9VTlVTRUQpIHVzZXNfY29sb3IgPSB0cnVlOworCisgICAgICAgIGJvb2wgdXNlc19kZXB0aHN0ZW5jaWwgPSBmYWxzZTsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NdLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KQorICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzW3N1YnBhc3NdLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50ICE9IFZLX0FUVEFDSE1FTlRfVU5VU0VEKQorICAgICAgICAgICAgICAgIHVzZXNfZGVwdGhzdGVuY2lsID0gdHJ1ZTsKKworICAgICAgICBpZiAodXNlc19jb2xvcikgcmVuZGVycGFzc19zdGF0ZS5zdWJwYXNzZXNfdXNpbmdfY29sb3JfYXR0YWNobWVudC5pbnNlcnQoc3VicGFzcyk7CisgICAgICAgIGlmICh1c2VzX2RlcHRoc3RlbmNpbCkgcmVuZGVycGFzc19zdGF0ZS5zdWJwYXNzZXNfdXNpbmdfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQuaW5zZXJ0KHN1YnBhc3MpOworICAgIH0KK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa1JlbmRlclBhc3MgKnBSZW5kZXJQYXNzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVSZW5kZXJQYXNzKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgd3JpdGVfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIFVwZGF0ZUNyZWF0ZVJlbmRlclBhc3NTdGF0ZShsYXllcl9kYXRhLCBwQ3JlYXRlSW5mbywgKnBSZW5kZXJQYXNzKTsKKyAgICAgICAgKnBSZW5kZXJQYXNzID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFJlbmRlclBhc3MpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVJlbmRlclBhc3MyS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrUmVuZGVyUGFzcyAqcFJlbmRlclBhc3MpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVJlbmRlclBhc3MyS0hSKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgd3JpdGVfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIFVwZGF0ZUNyZWF0ZVJlbmRlclBhc3NTdGF0ZShsYXllcl9kYXRhLCBwQ3JlYXRlSW5mbywgKnBSZW5kZXJQYXNzKTsKKyAgICAgICAgKnBSZW5kZXJQYXNzID0gbGF5ZXJfZGF0YS0+V3JhcE5ldygqcFJlbmRlclBhc3MpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveVJlbmRlclBhc3MoVmtEZXZpY2UgZGV2aWNlLCBWa1JlbmRlclBhc3MgcmVuZGVyUGFzcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lSZW5kZXJQYXNzKGRldmljZSwgcmVuZGVyUGFzcywgcEFsbG9jYXRvcik7CisgICAgdWludDY0X3QgcmVuZGVyUGFzc19pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4ocmVuZGVyUGFzcyk7CisKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AocmVuZGVyUGFzc19pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgcmVuZGVyUGFzcyA9IChWa1JlbmRlclBhc3MpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlclBhc3MgPSAoVmtSZW5kZXJQYXNzKTA7CisgICAgfQorCisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lSZW5kZXJQYXNzKGRldmljZSwgcmVuZGVyUGFzcywgcEFsbG9jYXRvcik7CisKKyAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICBsYXllcl9kYXRhLT5yZW5kZXJwYXNzZXNfc3RhdGVzLmVyYXNlKHJlbmRlclBhc3MpOworfQorCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZVN3YXBjaGFpbktIUihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSICpwU3dhcGNoYWluKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKyAgICBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqbG9jYWxfcENyZWF0ZUluZm8gPSBOVUxMOworICAgIGlmIChwQ3JlYXRlSW5mbykgeworICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mbyA9IG5ldyBzYWZlX1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUihwQ3JlYXRlSW5mbyk7CisgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5vbGRTd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm8tPm9sZFN3YXBjaGFpbik7CisgICAgICAgIC8vIFN1cmZhY2UgaXMgaW5zdGFuY2UtbGV2ZWwgb2JqZWN0CisgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5zdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5zdXJmYWNlKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlU3dhcGNoYWluS0hSKGRldmljZSwgbG9jYWxfcENyZWF0ZUluZm8tPnB0cigpLCBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKyAgICBkZWxldGUgbG9jYWxfcENyZWF0ZUluZm87CisKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBTd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwU3dhcGNoYWluKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSKFZrRGV2aWNlIGRldmljZSwgdWludDMyX3Qgc3dhcGNoYWluQ291bnQsIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTd2FwY2hhaW5LSFIgKnBTd2FwY2hhaW5zKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbnMpOworICAgIHNhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpsb2NhbF9wQ3JlYXRlSW5mb3MgPSBOVUxMOworICAgIHsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvcykgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zID0gbmV3IHNhZmVfVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSW3N3YXBjaGFpbkNvdW50XTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5Db3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2ldLmluaXRpYWxpemUoJnBDcmVhdGVJbmZvc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5zdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN1cmZhY2UgaXMgaW5zdGFuY2UtbGV2ZWwgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvc1tpXS5zdXJmYWNlID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvc1tpXS5zdXJmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5vbGRTd2FwY2hhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm9zW2ldLm9sZFN3YXBjaGFpbiA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mb3NbaV0ub2xkU3dhcGNoYWluKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFIoZGV2aWNlLCBzd2FwY2hhaW5Db3VudCwgbG9jYWxfcENyZWF0ZUluZm9zLT5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLCBwU3dhcGNoYWlucyk7CisgICAgZGVsZXRlW10gbG9jYWxfcENyZWF0ZUluZm9zOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcFN3YXBjaGFpbnNbaV0gPSBsYXllcl9kYXRhLT5XcmFwTmV3KHBTd2FwY2hhaW5zW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwgdWludDMyX3QgKnBTd2FwY2hhaW5JbWFnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZSAqcFN3YXBjaGFpbkltYWdlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5HZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBwU3dhcGNoYWluSW1hZ2VzKTsKKyAgICBWa1N3YXBjaGFpbktIUiB3cmFwcGVkX3N3YXBjaGFpbl9oYW5kbGUgPSBzd2FwY2hhaW47CisgICAgaWYgKFZLX05VTExfSEFORExFICE9IHN3YXBjaGFpbikgeworICAgICAgICBzd2FwY2hhaW4gPSBsYXllcl9kYXRhLT5VbndyYXAoc3dhcGNoYWluKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkdldFN3YXBjaGFpbkltYWdlc0tIUihkZXZpY2UsIHN3YXBjaGFpbiwgcFN3YXBjaGFpbkltYWdlQ291bnQsIHBTd2FwY2hhaW5JbWFnZXMpOworICAgIGlmICgoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHx8IChWS19JTkNPTVBMRVRFID09IHJlc3VsdCkpIHsKKyAgICAgICAgaWYgKCgqcFN3YXBjaGFpbkltYWdlQ291bnQgPiAwKSAmJiBwU3dhcGNoYWluSW1hZ2VzKSB7CisgICAgICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICAgICAgICAgIGF1dG8gJndyYXBwZWRfc3dhcGNoYWluX2ltYWdlX2hhbmRsZXMgPSBsYXllcl9kYXRhLT5zd2FwY2hhaW5fd3JhcHBlZF9pbWFnZV9oYW5kbGVfbWFwW3dyYXBwZWRfc3dhcGNoYWluX2hhbmRsZV07CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od3JhcHBlZF9zd2FwY2hhaW5faW1hZ2VfaGFuZGxlcy5zaXplKCkpOyBpIDwgKnBTd2FwY2hhaW5JbWFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVkX3N3YXBjaGFpbl9pbWFnZV9oYW5kbGVzLmVtcGxhY2VfYmFjayhsYXllcl9kYXRhLT5XcmFwTmV3KHBTd2FwY2hhaW5JbWFnZXNbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcFN3YXBjaGFpbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZXNbaV0gPSB3cmFwcGVkX3N3YXBjaGFpbl9pbWFnZV9oYW5kbGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGlzcGF0Y2hEZXN0cm95U3dhcGNoYWluS0hSKFZrRGV2aWNlIGRldmljZSwgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveVN3YXBjaGFpbktIUihkZXZpY2UsIHN3YXBjaGFpbiwgcEFsbG9jYXRvcik7CisgICAgd3JpdGVfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisKKyAgICBhdXRvICZpbWFnZV9hcnJheSA9IGxheWVyX2RhdGEtPnN3YXBjaGFpbl93cmFwcGVkX2ltYWdlX2hhbmRsZV9tYXBbc3dhcGNoYWluXTsKKyAgICBmb3IgKGF1dG8gJmltYWdlX2hhbmRsZSA6IGltYWdlX2FycmF5KSB7CisgICAgICAgIHVuaXF1ZV9pZF9tYXBwaW5nLmVyYXNlKEhhbmRsZVRvVWludDY0KGltYWdlX2hhbmRsZSkpOworICAgIH0KKyAgICBsYXllcl9kYXRhLT5zd2FwY2hhaW5fd3JhcHBlZF9pbWFnZV9oYW5kbGVfbWFwLmVyYXNlKHN3YXBjaGFpbik7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHVpbnQ2NF90IHN3YXBjaGFpbl9pZCA9IEhhbmRsZVRvVWludDY0KHN3YXBjaGFpbik7CisKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3Aoc3dhcGNoYWluX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBzd2FwY2hhaW4gPSAoVmtTd2FwY2hhaW5LSFIpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3YXBjaGFpbiA9IChWa1N3YXBjaGFpbktIUikwOworICAgIH0KKworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95U3dhcGNoYWluS0hSKGRldmljZSwgc3dhcGNoYWluLCBwQWxsb2NhdG9yKTsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hRdWV1ZVByZXNlbnRLSFIoVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb0tIUiAqcFByZXNlbnRJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocXVldWUpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVQcmVzZW50S0hSKHF1ZXVlLCBwUHJlc2VudEluZm8pOworICAgIHNhZmVfVmtQcmVzZW50SW5mb0tIUiAqbG9jYWxfcFByZXNlbnRJbmZvID0gTlVMTDsKKyAgICB7CisgICAgICAgIGlmIChwUHJlc2VudEluZm8pIHsKKyAgICAgICAgICAgIGxvY2FsX3BQcmVzZW50SW5mbyA9IG5ldyBzYWZlX1ZrUHJlc2VudEluZm9LSFIocFByZXNlbnRJbmZvKTsKKyAgICAgICAgICAgIGlmIChsb2NhbF9wUHJlc2VudEluZm8tPnBXYWl0U2VtYXBob3JlcykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcFByZXNlbnRJbmZvLT53YWl0U2VtYXBob3JlQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BQcmVzZW50SW5mby0+cFdhaXRTZW1hcGhvcmVzW2luZGV4MV0gPSBsYXllcl9kYXRhLT5VbndyYXAocFByZXNlbnRJbmZvLT5wV2FpdFNlbWFwaG9yZXNbaW5kZXgxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2FsX3BQcmVzZW50SW5mby0+cFN3YXBjaGFpbnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MSA9IDA7IGluZGV4MSA8IGxvY2FsX3BQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQ7ICsraW5kZXgxKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaW5kZXgxXSA9IGxheWVyX2RhdGEtPlVud3JhcChwUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zW2luZGV4MV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUXVldWVQcmVzZW50S0hSKHF1ZXVlLCBsb2NhbF9wUHJlc2VudEluZm8tPnB0cigpKTsKKworICAgIC8vIHBSZXN1bHRzIGlzIGFuIG91dHB1dCBhcnJheSBlbWJlZGRlZCBpbiBhIHN0cnVjdHVyZS4gVGhlIGNvZGUgZ2VuZXJhdG9yIG5lZ2xlY3RzIHRvIGNvcHkgYmFjayBmcm9tIHRoZSBzYWZlXyogdmVyc2lvbiwKKyAgICAvLyBzbyBoYW5kbGUgaXQgYXMgYSBzcGVjaWFsIGNhc2UgaGVyZToKKyAgICBpZiAocFByZXNlbnRJbmZvICYmIHBQcmVzZW50SW5mby0+cFJlc3VsdHMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcFByZXNlbnRJbmZvLT5wUmVzdWx0c1tpXSA9IGxvY2FsX3BQcmVzZW50SW5mby0+cFJlc3VsdHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIGxvY2FsX3BQcmVzZW50SW5mbzsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERpc3BhdGNoRGVzdHJveURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbCBkZXNjcmlwdG9yUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZXNjcmlwdG9yUG9vbChkZXZpY2UsIGRlc2NyaXB0b3JQb29sLCBwQWxsb2NhdG9yKTsKKyAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKworICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGltcGxpY2l0bHkgZnJlZWQgZGVzY3JpcHRvciBzZXRzCisgICAgZm9yKGF1dG8gZGVzY3JpcHRvcl9zZXQgOiBsYXllcl9kYXRhLT5wb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXBbZGVzY3JpcHRvclBvb2xdKSB7CisgICAgICAgIHVuaXF1ZV9pZF9tYXBwaW5nLmVyYXNlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvcl9zZXQpKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+cG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwLmVyYXNlKGRlc2NyaXB0b3JQb29sKTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgdWludDY0X3QgZGVzY3JpcHRvclBvb2xfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGRlc2NyaXB0b3JQb29sKTsKKworICAgIGF1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcChkZXNjcmlwdG9yUG9vbF9pZCk7CisgICAgaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgZGVzY3JpcHRvclBvb2wgPSAoVmtEZXNjcmlwdG9yUG9vbClpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRvclBvb2wgPSAoVmtEZXNjcmlwdG9yUG9vbCkwOworICAgIH0KKworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVzY3JpcHRvclBvb2woZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgcEFsbG9jYXRvcik7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoUmVzZXREZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlJlc2V0RGVzY3JpcHRvclBvb2woZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgZmxhZ3MpOworICAgIFZrRGVzY3JpcHRvclBvb2wgbG9jYWxfZGVzY3JpcHRvcl9wb29sID0gVktfTlVMTF9IQU5ETEU7CisgICAgeworICAgICAgICBsb2NhbF9kZXNjcmlwdG9yX3Bvb2wgPSBsYXllcl9kYXRhLT5VbndyYXAoZGVzY3JpcHRvclBvb2wpOworICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuUmVzZXREZXNjcmlwdG9yUG9vbChkZXZpY2UsIGxvY2FsX2Rlc2NyaXB0b3JfcG9vbCwgZmxhZ3MpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICAgICAgLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gaW1wbGljaXRseSBmcmVlZCBkZXNjcmlwdG9yIHNldHMKKyAgICAgICAgZm9yKGF1dG8gZGVzY3JpcHRvcl9zZXQgOiBsYXllcl9kYXRhLT5wb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXBbZGVzY3JpcHRvclBvb2xdKSB7CisgICAgICAgICAgICB1bmlxdWVfaWRfbWFwcGluZy5lcmFzZShyZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGRlc2NyaXB0b3Jfc2V0KSk7CisgICAgICAgIH0KKyAgICAgICAgbGF5ZXJfZGF0YS0+cG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwW2Rlc2NyaXB0b3JQb29sXS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5BbGxvY2F0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgcEFsbG9jYXRlSW5mbywgcERlc2NyaXB0b3JTZXRzKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqbG9jYWxfcEFsbG9jYXRlSW5mbyA9IE5VTEw7CisgICAgeworICAgICAgICBpZiAocEFsbG9jYXRlSW5mbykgeworICAgICAgICAgICAgbG9jYWxfcEFsbG9jYXRlSW5mbyA9IG5ldyBzYWZlX1ZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyhwQWxsb2NhdGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbCkgeworICAgICAgICAgICAgICAgIGxvY2FsX3BBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2NhbF9wQWxsb2NhdGVJbmZvLT5wU2V0TGF5b3V0cykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgxID0gMDsgaW5kZXgxIDwgbG9jYWxfcEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyArK2luZGV4MSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbF9wQWxsb2NhdGVJbmZvLT5wU2V0TGF5b3V0c1tpbmRleDFdID0gbGF5ZXJfZGF0YS0+VW53cmFwKGxvY2FsX3BBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzW2luZGV4MV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygKKyAgICAgICAgZGV2aWNlLCAoY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICopbG9jYWxfcEFsbG9jYXRlSW5mbywgcERlc2NyaXB0b3JTZXRzKTsKKyAgICBpZiAobG9jYWxfcEFsbG9jYXRlSW5mbykgeworICAgICAgICBkZWxldGUgbG9jYWxfcEFsbG9jYXRlSW5mbzsKKyAgICB9CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgIHdyaXRlX2xvY2tfZ3VhcmRfdCBsb2NrKGRpc3BhdGNoX2xvY2spOworICAgICAgICBhdXRvICZwb29sX2Rlc2NyaXB0b3Jfc2V0cyA9IGxheWVyX2RhdGEtPnBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbF07CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgcEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyBpbmRleDArKykgeworICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5XcmFwTmV3KHBEZXNjcmlwdG9yU2V0c1tpbmRleDBdKTsKKyAgICAgICAgICAgIHBvb2xfZGVzY3JpcHRvcl9zZXRzLmluc2VydChwRGVzY3JpcHRvclNldHNbaW5kZXgwXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hGcmVlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5GcmVlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBkZXNjcmlwdG9yUG9vbCwgZGVzY3JpcHRvclNldENvdW50LCBwRGVzY3JpcHRvclNldHMpOworICAgIFZrRGVzY3JpcHRvclNldCAqbG9jYWxfcERlc2NyaXB0b3JTZXRzID0gTlVMTDsKKyAgICBWa0Rlc2NyaXB0b3JQb29sIGxvY2FsX2Rlc2NyaXB0b3JfcG9vbCA9IFZLX05VTExfSEFORExFOworICAgIHsKKyAgICAgICAgbG9jYWxfZGVzY3JpcHRvcl9wb29sID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRlc2NyaXB0b3JQb29sKTsKKyAgICAgICAgaWYgKHBEZXNjcmlwdG9yU2V0cykgeworICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JTZXRzID0gbmV3IFZrRGVzY3JpcHRvclNldFtkZXNjcmlwdG9yU2V0Q291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBkZXNjcmlwdG9yU2V0Q291bnQ7ICsraW5kZXgwKSB7CisgICAgICAgICAgICAgICAgbG9jYWxfcERlc2NyaXB0b3JTZXRzW2luZGV4MF0gPSBsYXllcl9kYXRhLT5VbndyYXAocERlc2NyaXB0b3JTZXRzW2luZGV4MF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5GcmVlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBsb2NhbF9kZXNjcmlwdG9yX3Bvb2wsIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBWa0Rlc2NyaXB0b3JTZXQgKilsb2NhbF9wRGVzY3JpcHRvclNldHMpOworICAgIGlmIChsb2NhbF9wRGVzY3JpcHRvclNldHMpIGRlbGV0ZVtdIGxvY2FsX3BEZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSAmJiAocERlc2NyaXB0b3JTZXRzKSkgeworICAgICAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICAgICAgYXV0byAmcG9vbF9kZXNjcmlwdG9yX3NldHMgPSBsYXllcl9kYXRhLT5wb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXBbZGVzY3JpcHRvclBvb2xdOworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGRlc2NyaXB0b3JTZXRDb3VudDsgaW5kZXgwKyspIHsKKyAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldCBoYW5kbGUgPSBwRGVzY3JpcHRvclNldHNbaW5kZXgwXTsKKyAgICAgICAgICAgIHBvb2xfZGVzY3JpcHRvcl9zZXRzLmVyYXNlKGhhbmRsZSk7CisgICAgICAgICAgICB1aW50NjRfdCB1bmlxdWVfaWQgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90ICY+KGhhbmRsZSk7CisgICAgICAgICAgICB1bmlxdWVfaWRfbWFwcGluZy5lcmFzZSh1bmlxdWVfaWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGNvcmUgdmVyc2lvbiBvZiB0aGlzIHJvdXRpbmUuICBUaGUgZXh0ZW5zaW9uIHZlcnNpb24gaXMgYmVsb3cuCitWa1Jlc3VsdCBEaXNwYXRjaENyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUiAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiAqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgIHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvICpsb2NhbF9wQ3JlYXRlSW5mbyA9IE5VTEw7CisgICAgaWYgKHBDcmVhdGVJbmZvKSB7CisgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvID0gJnZhcl9sb2NhbF9wQ3JlYXRlSW5mbzsKKyAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPmluaXRpYWxpemUocENyZWF0ZUluZm8pOworICAgICAgICBpZiAocENyZWF0ZUluZm8tPnRlbXBsYXRlVHlwZSA9PSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+ZGVzY3JpcHRvclNldExheW91dCA9IGxheWVyX2RhdGEtPlVud3JhcChwQ3JlYXRlSW5mby0+ZGVzY3JpcHRvclNldExheW91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvLT50ZW1wbGF0ZVR5cGUgPT0gVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9QVVNIX0RFU0NSSVBUT1JTX0tIUikgeworICAgICAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8tPnBpcGVsaW5lTGF5b3V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5waXBlbGluZUxheW91dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShkZXZpY2UsIGxvY2FsX3BDcmVhdGVJbmZvLT5wdHIoKSwgcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICAqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IGxheWVyX2RhdGEtPldyYXBOZXcoKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCisgICAgICAgIC8vIFNoYWRvdyB0ZW1wbGF0ZSBjcmVhdGVJbmZvIGZvciBsYXRlciB1cGRhdGVzCisgICAgICAgIGlmIChsb2NhbF9wQ3JlYXRlSW5mbykgeworICAgICAgICAgICAgd3JpdGVfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VEVNUExBVEVfU1RBVEU+IHRlbXBsYXRlX3N0YXRlKG5ldyBURU1QTEFURV9TVEFURSgqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgbG9jYWxfcENyZWF0ZUluZm8pKTsKKyAgICAgICAgICAgIGxheWVyX2RhdGEtPmRlc2NfdGVtcGxhdGVfY3JlYXRlaW5mb19tYXBbKHVpbnQ2NF90KSpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlXSA9IHN0ZDo6bW92ZSh0ZW1wbGF0ZV9zdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIHZlcnNpb24gb2YgdGhpcyByb3V0aW5lLiAgVGhlIGNvcmUgdmVyc2lvbiBpcyBhYm92ZS4KK1ZrUmVzdWx0IERpc3BhdGNoQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSICpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyB2YXJfbG9jYWxfcENyZWF0ZUluZm87CisgICAgc2FmZV9Wa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gKmxvY2FsX3BDcmVhdGVJbmZvID0gTlVMTDsKKyAgICBpZiAocENyZWF0ZUluZm8pIHsKKyAgICAgICAgbG9jYWxfcENyZWF0ZUluZm8gPSAmdmFyX2xvY2FsX3BDcmVhdGVJbmZvOworICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+aW5pdGlhbGl6ZShwQ3JlYXRlSW5mbyk7CisgICAgICAgIGlmIChwQ3JlYXRlSW5mby0+dGVtcGxhdGVUeXBlID09IFZLX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX1RZUEVfREVTQ1JJUFRPUl9TRVQpIHsKKyAgICAgICAgICAgIGxvY2FsX3BDcmVhdGVJbmZvLT5kZXNjcmlwdG9yU2V0TGF5b3V0ID0gbGF5ZXJfZGF0YS0+VW53cmFwKHBDcmVhdGVJbmZvLT5kZXNjcmlwdG9yU2V0TGF5b3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocENyZWF0ZUluZm8tPnRlbXBsYXRlVHlwZSA9PSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSKSB7CisgICAgICAgICAgICBsb2NhbF9wQ3JlYXRlSW5mby0+cGlwZWxpbmVMYXlvdXQgPSBsYXllcl9kYXRhLT5VbndyYXAocENyZWF0ZUluZm8tPnBpcGVsaW5lTGF5b3V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKGRldmljZSwgbG9jYWxfcENyZWF0ZUluZm8tPnB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSBsYXllcl9kYXRhLT5XcmFwTmV3KCpwRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKworICAgICAgICAvLyBTaGFkb3cgdGVtcGxhdGUgY3JlYXRlSW5mbyBmb3IgbGF0ZXIgdXBkYXRlcworICAgICAgICBpZiAobG9jYWxfcENyZWF0ZUluZm8pIHsKKyAgICAgICAgICAgIHdyaXRlX2xvY2tfZ3VhcmRfdCBsb2NrKGRpc3BhdGNoX2xvY2spOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRFTVBMQVRFX1NUQVRFPiB0ZW1wbGF0ZV9zdGF0ZShuZXcgVEVNUExBVEVfU1RBVEUoKnBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGxvY2FsX3BDcmVhdGVJbmZvKSk7CisgICAgICAgICAgICBsYXllcl9kYXRhLT5kZXNjX3RlbXBsYXRlX2NyZWF0ZWluZm9fbWFwWyh1aW50NjRfdCkqcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZV0gPSBzdGQ6Om1vdmUodGVtcGxhdGVfc3RhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGNvcmUgdmVyc2lvbiBvZiB0aGlzIHJvdXRpbmUuICBUaGUgZXh0ZW5zaW9uIHZlcnNpb24gaXMgYmVsb3cuCit2b2lkIERpc3BhdGNoRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKKyAgICB3cml0ZV9sb2NrX2d1YXJkX3QgbG9jayhkaXNwYXRjaF9sb2NrKTsKKyAgICB1aW50NjRfdCBkZXNjcmlwdG9yX3VwZGF0ZV90ZW1wbGF0ZV9pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICBsYXllcl9kYXRhLT5kZXNjX3RlbXBsYXRlX2NyZWF0ZWluZm9fbWFwLmVyYXNlKGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlX2lkKTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcucG9wKGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlX2lkKTsKKyAgICBpZiAoaXRlciAhPSB1bmlxdWVfaWRfbWFwcGluZy5lbmQoKSkgeworICAgICAgICBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgPSAoVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpaXRlci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSkwOworICAgIH0KKworICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBwQWxsb2NhdG9yKTsKK30KKworLy8gVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIHZlcnNpb24gb2YgdGhpcyByb3V0aW5lLiAgVGhlIGNvcmUgdmVyc2lvbiBpcyBhYm92ZS4KK3ZvaWQgRGlzcGF0Y2hEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworICAgIHdyaXRlX2xvY2tfZ3VhcmRfdCBsb2NrKGRpc3BhdGNoX2xvY2spOworICAgIHVpbnQ2NF90IGRlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGxheWVyX2RhdGEtPmRlc2NfdGVtcGxhdGVfY3JlYXRlaW5mb19tYXAuZXJhc2UoZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGVfaWQpOworICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICBhdXRvIGl0ZXIgPSB1bmlxdWVfaWRfbWFwcGluZy5wb3AoZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGVfaWQpOworICAgIGlmIChpdGVyICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSlpdGVyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlID0gKFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTA7CisgICAgfQorCisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHBBbGxvY2F0b3IpOworfQorCit2b2lkICpCdWlsZFVud3JhcHBlZFVwZGF0ZVRlbXBsYXRlQnVmZmVyKFZhbGlkYXRpb25PYmplY3QgKmxheWVyX2RhdGEsIHVpbnQ2NF90IGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwgY29uc3Qgdm9pZCAqcERhdGEpIHsKKyAgICBhdXRvIGNvbnN0IHRlbXBsYXRlX21hcF9lbnRyeSA9IGxheWVyX2RhdGEtPmRlc2NfdGVtcGxhdGVfY3JlYXRlaW5mb19tYXAuZmluZChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgIGF1dG8gY29uc3QgJmNyZWF0ZV9pbmZvID0gdGVtcGxhdGVfbWFwX2VudHJ5LT5zZWNvbmQtPmNyZWF0ZV9pbmZvOworICAgIHNpemVfdCBhbGxvY2F0aW9uX3NpemUgPSAwOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBWdWxrYW5PYmplY3RUeXBlLCB1aW50NjRfdCwgc2l6ZV90Pj4gdGVtcGxhdGVfZW50cmllczsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVfaW5mby5kZXNjcmlwdG9yVXBkYXRlRW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0uZGVzY3JpcHRvckNvdW50OyBqKyspIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBjcmVhdGVfaW5mby5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXNbaV0ub2Zmc2V0ICsgaiAqIGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tpXS5zdHJpZGU7CisgICAgICAgICAgICBjaGFyICp1cGRhdGVfZW50cnkgPSAoY2hhciAqKShwRGF0YSkgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAoY3JlYXRlX2luZm8ucERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzW2ldLmRlc2NyaXB0b3JUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOgorICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U6CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRToKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaW1hZ2VfZW50cnkgPSByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvckltYWdlSW5mbyAqPih1cGRhdGVfZW50cnkpOworICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uX3NpemUgPSBzdGQ6Om1heChhbGxvY2F0aW9uX3NpemUsIG9mZnNldCArIHNpemVvZihWa0Rlc2NyaXB0b3JJbWFnZUluZm8pKTsKKworICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gKndyYXBwZWRfZW50cnkgPSBuZXcgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvKCppbWFnZV9lbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRfZW50cnktPnNhbXBsZXIgPSBsYXllcl9kYXRhLT5VbndyYXAoaW1hZ2VfZW50cnktPnNhbXBsZXIpOworICAgICAgICAgICAgICAgICAgICB3cmFwcGVkX2VudHJ5LT5pbWFnZVZpZXcgPSBsYXllcl9kYXRhLT5VbndyYXAoaW1hZ2VfZW50cnktPmltYWdlVmlldyk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2VudHJpZXMuZW1wbGFjZV9iYWNrKG9mZnNldCwga1Z1bGthbk9iamVjdFR5cGVJbWFnZSwgQ2FzdFRvVWludDY0KHdyYXBwZWRfZW50cnkpLCAwKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI6CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyX2VudHJ5ID0gcmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICo+KHVwZGF0ZV9lbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25fc2l6ZSA9IHN0ZDo6bWF4KGFsbG9jYXRpb25fc2l6ZSwgb2Zmc2V0ICsgc2l6ZW9mKFZrRGVzY3JpcHRvckJ1ZmZlckluZm8pKTsKKworICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICp3cmFwcGVkX2VudHJ5ID0gbmV3IFZrRGVzY3JpcHRvckJ1ZmZlckluZm8oKmJ1ZmZlcl9lbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRfZW50cnktPmJ1ZmZlciA9IGxheWVyX2RhdGEtPlVud3JhcChidWZmZXJfZW50cnktPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2VudHJpZXMuZW1wbGFjZV9iYWNrKG9mZnNldCwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXIsIENhc3RUb1VpbnQ2NCh3cmFwcGVkX2VudHJ5KSwgMCk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICAgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyX3ZpZXdfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxWa0J1ZmZlclZpZXcgKj4odXBkYXRlX2VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbl9zaXplID0gc3RkOjptYXgoYWxsb2NhdGlvbl9zaXplLCBvZmZzZXQgKyBzaXplb2YoVmtCdWZmZXJWaWV3KSk7CisKKyAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXJWaWV3IHdyYXBwZWRfZW50cnkgPSBsYXllcl9kYXRhLT5VbndyYXAoKmJ1ZmZlcl92aWV3X2hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2VudHJpZXMuZW1wbGFjZV9iYWNrKG9mZnNldCwga1Z1bGthbk9iamVjdFR5cGVCdWZmZXJWaWV3LCBDYXN0VG9VaW50NjQod3JhcHBlZF9lbnRyeSksIDApOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOiB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1CeXRlcyA9IGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tpXS5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25fc2l6ZSA9IHN0ZDo6bWF4KGFsbG9jYXRpb25fc2l6ZSwgb2Zmc2V0ICsgbnVtQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIHVud3JhcCwganVzdCBwbGFpbiBkYXRhCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2VudHJpZXMuZW1wbGFjZV9iYWNrKG9mZnNldCwga1Z1bGthbk9iamVjdFR5cGVVbmtub3duLCBDYXN0VG9VaW50NjQodXBkYXRlX2VudHJ5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAvLyB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgaiA9IGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllc1tpXS5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIEFsbG9jYXRlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGFuZCBwb3B1bGF0ZSB3aXRoIHNvdXJjZS91bndyYXBwZWQgZGF0YQorICAgIHZvaWQgKnVud3JhcHBlZF9kYXRhID0gbWFsbG9jKGFsbG9jYXRpb25fc2l6ZSk7CisgICAgZm9yIChhdXRvICZ0aGlzX2VudHJ5IDogdGVtcGxhdGVfZW50cmllcykgeworICAgICAgICBWdWxrYW5PYmplY3RUeXBlIHR5cGUgPSBzdGQ6OmdldDwxPih0aGlzX2VudHJ5KTsKKyAgICAgICAgdm9pZCAqZGVzdGluYXRpb24gPSAoY2hhciAqKXVud3JhcHBlZF9kYXRhICsgc3RkOjpnZXQ8MD4odGhpc19lbnRyeSk7CisgICAgICAgIHVpbnQ2NF90IHNvdXJjZSA9IHN0ZDo6Z2V0PDI+KHRoaXNfZW50cnkpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0ZDo6Z2V0PDM+KHRoaXNfZW50cnkpOworCisgICAgICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgICAgICAgIGFzc2VydCh0eXBlID09IGtWdWxrYW5PYmplY3RUeXBlVW5rbm93bik7CisgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24sIENhc3RGcm9tVWludDY0PHZvaWQgKj4oc291cmNlKSwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtWdWxrYW5PYmplY3RUeXBlSW1hZ2U6CisgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JJbWFnZUluZm8gKj4oZGVzdGluYXRpb24pKSA9CisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9ySW1hZ2VJbmZvICo+KHNvdXJjZSkpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgQ2FzdEZyb21VaW50NjQ8VmtEZXNjcmlwdG9ySW1hZ2VJbmZvICo+KHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1Z1bGthbk9iamVjdFR5cGVCdWZmZXI6CisgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICo+KGRlc3RpbmF0aW9uKSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKihDYXN0RnJvbVVpbnQ2NDxWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvICo+KHNvdXJjZSkpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgQ2FzdEZyb21VaW50NjQ8VmtEZXNjcmlwdG9yQnVmZmVySW5mbyAqPihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtWdWxrYW5PYmplY3RUeXBlQnVmZmVyVmlldzoKKyAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PFZrQnVmZmVyVmlldyAqPihkZXN0aW5hdGlvbikpID0gQ2FzdEZyb21VaW50NjQ8VmtCdWZmZXJWaWV3Pihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAodm9pZCAqKXVud3JhcHBlZF9kYXRhOworfQorCit2b2lkIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkICpwRGF0YSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworICAgIHVpbnQ2NF90IHRlbXBsYXRlX2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICB2b2lkICp1bndyYXBwZWRfYnVmZmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIGRlc2NyaXB0b3JTZXQgPSBsYXllcl9kYXRhLT5VbndyYXAoZGVzY3JpcHRvclNldCk7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IChWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSlsYXllcl9kYXRhLT5VbndyYXAoZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICAgICAgdW53cmFwcGVkX2J1ZmZlciA9IEJ1aWxkVW53cmFwcGVkVXBkYXRlVGVtcGxhdGVCdWZmZXIobGF5ZXJfZGF0YSwgdGVtcGxhdGVfaGFuZGxlLCBwRGF0YSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCB1bndyYXBwZWRfYnVmZmVyKTsKKyAgICBmcmVlKHVud3JhcHBlZF9idWZmZXIpOworfQorCit2b2lkIERpc3BhdGNoVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLCBjb25zdCB2b2lkICpwRGF0YSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5VcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKGRldmljZSwgZGVzY3JpcHRvclNldCwgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpOworICAgIHVpbnQ2NF90IHRlbXBsYXRlX2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICB2b2lkICp1bndyYXBwZWRfYnVmZmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIGRlc2NyaXB0b3JTZXQgPSBsYXllcl9kYXRhLT5VbndyYXAoZGVzY3JpcHRvclNldCk7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IGxheWVyX2RhdGEtPlVud3JhcChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgICAgICB1bndyYXBwZWRfYnVmZmVyID0gQnVpbGRVbndyYXBwZWRVcGRhdGVUZW1wbGF0ZUJ1ZmZlcihsYXllcl9kYXRhLCB0ZW1wbGF0ZV9oYW5kbGUsIHBEYXRhKTsKKyAgICB9CisgICAgbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLlVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoZGV2aWNlLCBkZXNjcmlwdG9yU2V0LCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIHVud3JhcHBlZF9idWZmZXIpOworICAgIGZyZWUodW53cmFwcGVkX2J1ZmZlcik7Cit9CisKK3ZvaWQgRGlzcGF0Y2hDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNldCwgY29uc3Qgdm9pZCAqcERhdGEpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShjb21tYW5kQnVmZmVyKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkNtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKGNvbW1hbmRCdWZmZXIsIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsIHNldCwgcERhdGEpOworICAgIHVpbnQ2NF90IHRlbXBsYXRlX2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4oZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlKTsKKyAgICB2b2lkICp1bndyYXBwZWRfYnVmZmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHJlYWRfbG9ja19ndWFyZF90IGxvY2soZGlzcGF0Y2hfbG9jayk7CisgICAgICAgIGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSA9IGxheWVyX2RhdGEtPlVud3JhcChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworICAgICAgICBsYXlvdXQgPSBsYXllcl9kYXRhLT5VbndyYXAobGF5b3V0KTsKKyAgICAgICAgdW53cmFwcGVkX2J1ZmZlciA9IEJ1aWxkVW53cmFwcGVkVXBkYXRlVGVtcGxhdGVCdWZmZXIobGF5ZXJfZGF0YSwgdGVtcGxhdGVfaGFuZGxlLCBwRGF0YSk7CisgICAgfQorICAgIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5DbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihjb21tYW5kQnVmZmVyLCBkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUsIGxheW91dCwgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBwZWRfYnVmZmVyKTsKKyAgICBmcmVlKHVud3JhcHBlZF9idWZmZXIpOworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVByb3BlcnRpZXNLSFIgKnBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXkgPSBsYXllcl9kYXRhLT5NYXliZVdyYXBEaXNwbGF5KHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXksIGxheWVyX2RhdGEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPQorICAgICAgICBsYXllcl9kYXRhLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXlQcm9wZXJ0aWVzLmRpc3BsYXkgPQorICAgICAgICAgICAgICAgIGxheWVyX2RhdGEtPk1heWJlV3JhcERpc3BsYXkocFByb3BlcnRpZXNbaWR4MF0uZGlzcGxheVByb3BlcnRpZXMuZGlzcGxheSwgbGF5ZXJfZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9CisgICAgICAgIGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIFZrRGlzcGxheUtIUiAmb3B0X2Rpc3BsYXkgPSBwUHJvcGVydGllc1tpZHgwXS5jdXJyZW50RGlzcGxheTsKKyAgICAgICAgICAgIGlmIChvcHRfZGlzcGxheSkgb3B0X2Rpc3BsYXkgPSBsYXllcl9kYXRhLT5NYXliZVdyYXBEaXNwbGF5KG9wdF9kaXNwbGF5LCBsYXllcl9kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheVBsYW5lUHJvcGVydGllczJLSFIgKnBQcm9wZXJ0aWVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LCBwUHJvcGVydGllcyk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiByZXN1bHQ7CisgICAgaWYgKChyZXN1bHQgPT0gVktfU1VDQ0VTUyB8fCByZXN1bHQgPT0gVktfSU5DT01QTEVURSkgJiYgcFByb3BlcnRpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpZHgwID0gMDsgaWR4MCA8ICpwUHJvcGVydHlDb3VudDsgKytpZHgwKSB7CisgICAgICAgICAgICBWa0Rpc3BsYXlLSFIgJm9wdF9kaXNwbGF5ID0gcFByb3BlcnRpZXNbaWR4MF0uZGlzcGxheVBsYW5lUHJvcGVydGllcy5jdXJyZW50RGlzcGxheTsKKyAgICAgICAgICAgIGlmIChvcHRfZGlzcGxheSkgb3B0X2Rpc3BsYXkgPSBsYXllcl9kYXRhLT5NYXliZVdyYXBEaXNwbGF5KG9wdF9kaXNwbGF5LCBsYXllcl9kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaEdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHBsYW5lSW5kZXgsIHVpbnQzMl90ICpwRGlzcGxheUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rpc3BsYXlLSFIgKnBEaXNwbGF5cykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSKHBoeXNpY2FsRGV2aWNlLCBwbGFuZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaXNwbGF5Q291bnQsIHBEaXNwbGF5cyk7CisgICAgaWYgKChyZXN1bHQgPT0gVktfU1VDQ0VTUyB8fCByZXN1bHQgPT0gVktfSU5DT01QTEVURSkgJiYgcERpc3BsYXlzKSB7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiByZXN1bHQ7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqcERpc3BsYXlDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAocERpc3BsYXlzW2ldKSBwRGlzcGxheXNbaV0gPSBsYXllcl9kYXRhLT5NYXliZVdyYXBEaXNwbGF5KHBEaXNwbGF5c1tpXSwgbGF5ZXJfZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKHBoeXNpY2FsRGV2aWNlLCBkaXNwbGF5LCBwUHJvcGVydHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7CisgICAgeworICAgICAgICBkaXNwbGF5ID0gbGF5ZXJfZGF0YS0+VW53cmFwKGRpc3BsYXkpOworICAgIH0KKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlLkdldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUihwaHlzaWNhbERldmljZSwgZGlzcGxheSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXlNb2RlID0gbGF5ZXJfZGF0YS0+V3JhcE5ldyhwUHJvcGVydGllc1tpZHgwXS5kaXNwbGF5TW9kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtSZXN1bHQgRGlzcGF0Y2hHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSICpwUHJvcGVydGllcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKQorICAgICAgICByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgZGlzcGxheSwgcFByb3BlcnR5Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKTsKKyAgICB7CisgICAgICAgIGRpc3BsYXkgPSBsYXllcl9kYXRhLT5VbndyYXAoZGlzcGxheSk7CisgICAgfQorCisgICAgVmtSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzMktIUihwaHlzaWNhbERldmljZSwgZGlzcGxheSwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICBpZiAoKHJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IHJlc3VsdCA9PSBWS19JTkNPTVBMRVRFKSAmJiBwUHJvcGVydGllcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGlkeDAgPSAwOyBpZHgwIDwgKnBQcm9wZXJ0eUNvdW50OyArK2lkeDApIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzW2lkeDBdLmRpc3BsYXlNb2RlUHJvcGVydGllcy5kaXNwbGF5TW9kZSA9IGxheWVyX2RhdGEtPldyYXBOZXcocFByb3BlcnRpZXNbaWR4MF0uZGlzcGxheU1vZGVQcm9wZXJ0aWVzLmRpc3BsYXlNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaERlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgKnBUYWdJbmZvKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghd3JhcF9oYW5kbGVzKSByZXR1cm4gbGF5ZXJfZGF0YS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLkRlYnVnTWFya2VyU2V0T2JqZWN0VGFnRVhUKGRldmljZSwgcFRhZ0luZm8pOworICAgIHNhZmVfVmtEZWJ1Z01hcmtlck9iamVjdFRhZ0luZm9FWFQgbG9jYWxfdGFnX2luZm8ocFRhZ0luZm8pOworICAgIHsKKyAgICAgICAgYXV0byBpdCA9IHVuaXF1ZV9pZF9tYXBwaW5nLmZpbmQocmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihsb2NhbF90YWdfaW5mby5vYmplY3QpKTsKKyAgICAgICAgaWYgKGl0ICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgICAgICBsb2NhbF90YWdfaW5mby5vYmplY3QgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZWJ1Z01hcmtlclNldE9iamVjdFRhZ0VYVChkZXZpY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFZrRGVidWdNYXJrZXJPYmplY3RUYWdJbmZvRVhUICo+KCZsb2NhbF90YWdfaW5mbykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IERpc3BhdGNoRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z01hcmtlck9iamVjdE5hbWVJbmZvRVhUICpwTmFtZUluZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKGRldmljZSwgcE5hbWVJbmZvKTsKKyAgICBzYWZlX1ZrRGVidWdNYXJrZXJPYmplY3ROYW1lSW5mb0VYVCBsb2NhbF9uYW1lX2luZm8ocE5hbWVJbmZvKTsKKyAgICB7CisgICAgICAgIGF1dG8gaXQgPSB1bmlxdWVfaWRfbWFwcGluZy5maW5kKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4obG9jYWxfbmFtZV9pbmZvLm9iamVjdCkpOworICAgICAgICBpZiAoaXQgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgICAgIGxvY2FsX25hbWVfaW5mby5vYmplY3QgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5EZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoCisgICAgICAgIGRldmljZSwgcmVpbnRlcnByZXRfY2FzdDxWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgKj4oJmxvY2FsX25hbWVfaW5mbykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFZLX0VYVF9kZWJ1Z191dGlscworVmtSZXN1bHQgRGlzcGF0Y2hTZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCAqcFRhZ0luZm8pIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgaWYgKCF3cmFwX2hhbmRsZXMpIHJldHVybiBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVChkZXZpY2UsIHBUYWdJbmZvKTsKKyAgICBzYWZlX1ZrRGVidWdVdGlsc09iamVjdFRhZ0luZm9FWFQgbG9jYWxfdGFnX2luZm8ocFRhZ0luZm8pOworICAgIHsKKyAgICAgICAgYXV0byBpdCA9IHVuaXF1ZV9pZF9tYXBwaW5nLmZpbmQocmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihsb2NhbF90YWdfaW5mby5vYmplY3RIYW5kbGUpKTsKKyAgICAgICAgaWYgKGl0ICE9IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKSB7CisgICAgICAgICAgICBsb2NhbF90YWdfaW5mby5vYmplY3RIYW5kbGUgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXREZWJ1Z1V0aWxzT2JqZWN0VGFnRVhUKAorICAgICAgICBkZXZpY2UsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0VGFnSW5mb0VYVCAqPigmbG9jYWxfdGFnX2luZm8pKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBEaXNwYXRjaFNldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgKnBOYW1lSW5mbykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuIGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UsIHBOYW1lSW5mbyk7CisgICAgc2FmZV9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVCBsb2NhbF9uYW1lX2luZm8ocE5hbWVJbmZvKTsKKyAgICB7CisgICAgICAgIGF1dG8gaXQgPSB1bmlxdWVfaWRfbWFwcGluZy5maW5kKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgJj4obG9jYWxfbmFtZV9pbmZvLm9iamVjdEhhbmRsZSkpOworICAgICAgICBpZiAoaXQgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHsKKyAgICAgICAgICAgIGxvY2FsX25hbWVfaW5mby5vYmplY3RIYW5kbGUgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZS5TZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCgKKyAgICAgICAgZGV2aWNlLCByZWludGVycHJldF9jYXN0PGNvbnN0IFZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhUICo+KCZsb2NhbF9uYW1lX2luZm8pKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisiIiIKKyAgICAjIFNlcGFyYXRlIGdlbmVyYXRlZCB0ZXh0IGZvciBzb3VyY2UgYW5kIGhlYWRlcnMKKyAgICBBTExfU0VDVElPTlMgPSBbJ3NvdXJjZV9maWxlJywgJ2hlYWRlcl9maWxlJ10KKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgZXJyRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIHdhcm5GaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgZGlhZ0ZpbGUgPSBzeXMuc3Rkb3V0KToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkKKyAgICAgICAgc2VsZi5JTkRFTlRfU1BBQ0VTID0gNAorICAgICAgICBzZWxmLmluc3RhbmNlX2V4dGVuc2lvbnMgPSBbXQorICAgICAgICBzZWxmLmRldmljZV9leHRlbnNpb25zID0gW10KKyAgICAgICAgIyBDb21tYW5kcyB3aGljaCBhcmUgbm90IGF1dG9nZW5lcmF0ZWQgYnV0IHN0aWxsIGludGVyY2VwdGVkCisgICAgICAgIHNlbGYubm9fYXV0b2dlbl9saXN0ID0gWworICAgICAgICAgICAgJ3ZrQ3JlYXRlSW5zdGFuY2UnLAorICAgICAgICAgICAgJ3ZrRGVzdHJveUluc3RhbmNlJywKKyAgICAgICAgICAgICd2a0NyZWF0ZURldmljZScsCisgICAgICAgICAgICAndmtEZXN0cm95RGV2aWNlJywKKyAgICAgICAgICAgICd2a0NyZWF0ZVN3YXBjaGFpbktIUicsCisgICAgICAgICAgICAndmtDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSJywKKyAgICAgICAgICAgICd2a0dldFN3YXBjaGFpbkltYWdlc0tIUicsCisgICAgICAgICAgICAndmtEZXN0cm95U3dhcGNoYWluS0hSJywKKyAgICAgICAgICAgICd2a1F1ZXVlUHJlc2VudEtIUicsCisgICAgICAgICAgICAndmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcycsCisgICAgICAgICAgICAndmtSZXNldERlc2NyaXB0b3JQb29sJywKKyAgICAgICAgICAgICd2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCcsCisgICAgICAgICAgICAndmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzJywKKyAgICAgICAgICAgICd2a0ZyZWVEZXNjcmlwdG9yU2V0cycsCisgICAgICAgICAgICAndmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUnLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSJywKKyAgICAgICAgICAgICd2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUnLAorICAgICAgICAgICAgJ3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUicsCisgICAgICAgICAgICAndmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlJywKKyAgICAgICAgICAgICd2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFInLAorICAgICAgICAgICAgJ3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFInLAorICAgICAgICAgICAgJ3ZrRGVidWdNYXJrZXJTZXRPYmplY3RUYWdFWFQnLAorICAgICAgICAgICAgJ3ZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUJywKKyAgICAgICAgICAgICd2a0NyZWF0ZVJlbmRlclBhc3MnLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlUmVuZGVyUGFzczJLSFInLAorICAgICAgICAgICAgJ3ZrRGVzdHJveVJlbmRlclBhc3MnLAorICAgICAgICAgICAgJ3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQnLAorICAgICAgICAgICAgJ3ZrU2V0RGVidWdVdGlsc09iamVjdFRhZ0VYVCcsCisgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSJywKKyAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXMyS0hSJywKKyAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVBsYW5lUHJvcGVydGllc0tIUicsCisgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXMyS0hSJywKKyAgICAgICAgICAgICd2a0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSJywKKyAgICAgICAgICAgICd2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUicsCisgICAgICAgICAgICAndmtHZXREaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSJywKKyAgICAgICAgICAgICd2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsCisgICAgICAgICAgICAndmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcycsCisgICAgICAgICAgICAndmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICd2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcycsCisgICAgICAgICAgICAndmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24nLAorICAgICAgICAgICAgXQorICAgICAgICBzZWxmLmhlYWRlclZlcnNpb24gPSBOb25lCisgICAgICAgICMgSW50ZXJuYWwgc3RhdGUgLSBhY2N1bXVsYXRvcnMgZm9yIGRpZmZlcmVudCBpbm5lciBibG9jayB0ZXh0CisgICAgICAgIHNlbGYuc2VjdGlvbnMgPSBkaWN0KFsoc2VjdGlvbiwgW10pIGZvciBzZWN0aW9uIGluIHNlbGYuQUxMX1NFQ1RJT05TXSkKKworICAgICAgICBzZWxmLmNtZE1lbWJlcnMgPSBbXQorICAgICAgICBzZWxmLmNtZF9mZWF0dXJlX3Byb3RlY3QgPSBbXSAgIyBTYXZlIGlmZGVmJ3MgZm9yIGVhY2ggY29tbWFuZAorICAgICAgICBzZWxmLmNtZF9pbmZvX2RhdGEgPSBbXSAgICAgICAgIyBTYXZlIHRoZSBjbWRpbmZvIGRhdGEgZm9yIHdyYXBwaW5nIHRoZSBoYW5kbGVzIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZQorICAgICAgICBzZWxmLnN0cnVjdE1lbWJlcnMgPSBbXSAgICAgICAgIyBMaXN0IG9mIFN0cnVjdE1lbWJlckRhdGEgcmVjb3JkcyBmb3IgYWxsIFZ1bGthbiBzdHJ1Y3RzCisgICAgICAgIHNlbGYuZXh0ZW5zaW9uX3N0cnVjdHMgPSBbXSAgICAjIExpc3Qgb2YgYWxsIHN0cnVjdHMgb3Igc2lzdGVyLXN0cnVjdHMgY29udGFpbmluZyBoYW5kbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEEgc2lzdGVyLXN0cnVjdCBtYXkgY29udGFpbiBubyBoYW5kbGVzIGJ1dCBzaGFyZXMgYSBzdHJ1Y3RleHRlbmRzIGF0dHJpYnV0ZSB3aXRoIG9uZSB0aGF0IGRvZXMKKyAgICAgICAgc2VsZi5wbmV4dF9leHRlbnNpb25fc3RydWN0cyA9IFtdICAgICMgTGlzdCBvZiBhbGwgc3RydWN0cyB3aGljaCBjYW4gYmUgZXh0ZW5kZWQgYnkgYSBwbmV4dCBjaGFpbgorICAgICAgICBzZWxmLnN0cnVjdFR5cGVzID0gZGljdCgpICAgICAgIyBNYXAgb2YgVnVsa2FuIHN0cnVjdCB0eXBlbmFtZSB0byByZXF1aXJlZCBWa1N0cnVjdHVyZVR5cGUKKyAgICAgICAgc2VsZi5zdHJ1Y3RfbWVtYmVyX2RpY3QgPSBkaWN0KCkKKyAgICAgICAgIyBOYW1lZCB0dXBsZXMgdG8gc3RvcmUgc3RydWN0IGFuZCBjb21tYW5kIGRhdGEKKyAgICAgICAgc2VsZi5TdHJ1Y3RUeXBlID0gbmFtZWR0dXBsZSgnU3RydWN0VHlwZScsIFsnbmFtZScsICd2YWx1ZSddKQorICAgICAgICBzZWxmLkNtZE1lbWJlckRhdGEgPSBuYW1lZHR1cGxlKCdDbWRNZW1iZXJEYXRhJywgWyduYW1lJywgJ21lbWJlcnMnXSkKKyAgICAgICAgc2VsZi5DbWRJbmZvRGF0YSA9IG5hbWVkdHVwbGUoJ0NtZEluZm9EYXRhJywgWyduYW1lJywgJ2NtZGluZm8nXSkKKyAgICAgICAgc2VsZi5DbWRFeHRyYVByb3RlY3QgPSBuYW1lZHR1cGxlKCdDbWRFeHRyYVByb3RlY3QnLCBbJ25hbWUnLCAnZXh0cmFfcHJvdGVjdCddKQorCisgICAgICAgIHNlbGYuQ29tbWFuZFBhcmFtID0gbmFtZWR0dXBsZSgnQ29tbWFuZFBhcmFtJywgWyd0eXBlJywgJ25hbWUnLCAnaXNwb2ludGVyJywgJ2lzY29uc3QnLCAnaXNjb3VudCcsICdsZW4nLCAnZXh0c3RydWN0cycsICdjZGVjbCcsICdpc2xvY2FsJywgJ2lzY3JlYXRlJywgJ2lzZGVzdHJveScsICdmZWF0dXJlX3Byb3RlY3QnXSkKKyAgICAgICAgc2VsZi5TdHJ1Y3RNZW1iZXJEYXRhID0gbmFtZWR0dXBsZSgnU3RydWN0TWVtYmVyRGF0YScsIFsnbmFtZScsICdtZW1iZXJzJ10pCisgICAgIworICAgIGRlZiBpbmNJbmRlbnQoc2VsZiwgaW5kZW50KToKKyAgICAgICAgaW5jID0gJyAnICogc2VsZi5JTkRFTlRfU1BBQ0VTCisgICAgICAgIGlmIGluZGVudDoKKyAgICAgICAgICAgIHJldHVybiBpbmRlbnQgKyBpbmMKKyAgICAgICAgcmV0dXJuIGluYworICAgICMKKyAgICBkZWYgZGVjSW5kZW50KHNlbGYsIGluZGVudCk6CisgICAgICAgIGlmIGluZGVudCBhbmQgKGxlbihpbmRlbnQpID4gc2VsZi5JTkRFTlRfU1BBQ0VTKToKKyAgICAgICAgICAgIHJldHVybiBpbmRlbnRbOi1zZWxmLklOREVOVF9TUEFDRVNdCisgICAgICAgIHJldHVybiAnJworICAgICMKKyAgICAjIE92ZXJyaWRlIG1ha2VQcm90b05hbWUgdG8gZHJvcCB0aGUgInZrIiBwcmVmaXgKKyAgICBkZWYgbWFrZVByb3RvTmFtZShzZWxmLCBuYW1lLCB0YWlsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2VuT3B0cy5hcGllbnRyeSArIG5hbWVbMjpdICsgdGFpbAorICAgICMKKyAgICAjIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheQorICAgIGRlZiBwYXJhbUlzQXJyYXkoc2VsZiwgcGFyYW0pOgorICAgICAgICByZXR1cm4gcGFyYW0uYXR0cmliLmdldCgnbGVuJykgaXMgbm90IE5vbmUKKyAgICAjCisgICAgZGVmIGJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKQorICAgICAgICAjIEluaXRpYWxpemUgbWVtYmVycyB0aGF0IHJlcXVpcmUgdGhlIHRyZWUKKyAgICAgICAgc2VsZi5oYW5kbGVfdHlwZXMgPSBHZXRIYW5kbGVUeXBlcyhzZWxmLnJlZ2lzdHJ5LnRyZWUpCisgICAgICAgIHNlbGYudHlwZV9jYXRlZ29yaWVzID0gR2V0VHlwZUNhdGVnb3JpZXMoc2VsZi5yZWdpc3RyeS50cmVlKQorICAgICAgICAjIE91dHB1dCBDb3B5cmlnaHQKKyAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdoZWFkZXJfZmlsZScsIHNlbGYuaW5saW5lX2NvcHlyaWdodF9tZXNzYWdlKQorICAgICAgICAjIE11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0aW9uICYgQysrIG5hbWVzcGFjZS4KKyAgICAgICAgc2VsZi5oZWFkZXIgPSBGYWxzZQorICAgICAgICBpZiAoc2VsZi5nZW5PcHRzLmZpbGVuYW1lIGFuZCAnaCcgPT0gc2VsZi5nZW5PcHRzLmZpbGVuYW1lWy0xXSk6CisgICAgICAgICAgICBzZWxmLmhlYWRlciA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignaGVhZGVyX2ZpbGUnLCAnI3ByYWdtYSBvbmNlJykKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignaGVhZGVyX2ZpbGUnLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignaGVhZGVyX2ZpbGUnLCAnI2lmIGRlZmluZWQoTEFZRVJfQ0hBU1NJU19DQU5fV1JBUF9IQU5ETEVTKScpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2hlYWRlcl9maWxlJywgJ2V4dGVybiBib29sIHdyYXBfaGFuZGxlczsnKQorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdoZWFkZXJfZmlsZScsICcjZWxzZScpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2hlYWRlcl9maWxlJywgJ2V4dGVybiBib29sIHdyYXBfaGFuZGxlczsnKQorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdoZWFkZXJfZmlsZScsICcjZW5kaWYnKQorCisgICAgIyBOb3cgdGhhdCB0aGUgZGF0YSBpcyBhbGwgY29sbGVjdGVkIGFuZCBjb21wbGV0ZSwgZ2VuZXJhdGUgYW5kIG91dHB1dCB0aGUgd3JhcHBpbmcvdW53cmFwcGluZyByb3V0aW5lcworICAgIGRlZiBlbmRGaWxlKHNlbGYpOgorICAgICAgICBzZWxmLnN0cnVjdF9tZW1iZXJfZGljdCA9IGRpY3Qoc2VsZi5zdHJ1Y3RNZW1iZXJzKQorICAgICAgICAjIEdlbmVyYXRlIHRoZSBsaXN0IG9mIEFQSXMgdGhhdCBtaWdodCBuZWVkIHRvIGhhbmRsZSB3cmFwcGVkIGV4dGVuc2lvbiBzdHJ1Y3RzCisgICAgICAgIHNlbGYuR2VuZXJhdGVDb21tYW5kV3JhcEV4dGVuc2lvbkxpc3QoKQorICAgICAgICAjIFdyaXRlIG91dCB3cmFwcGluZy91bndyYXBwaW5nIGZ1bmN0aW9ucworICAgICAgICBzZWxmLldyYXBDb21tYW5kcygpCisgICAgICAgICMgQnVpbGQgYW5kIHdyaXRlIG91dCBwTmV4dCBwcm9jZXNzaW5nIGZ1bmN0aW9uCisgICAgICAgIGV4dGVuc2lvbl9wcm9jID0gc2VsZi5idWlsZF9leHRlbnNpb25fcHJvY2Vzc2luZ19mdW5jKCkKKworICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXI6CisgICAgICAgICAgICB3cml0ZShzZWxmLmlubGluZV9jb3B5cmlnaHRfbWVzc2FnZSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgd3JpdGUoJyNpbmNsdWRlIDxtdXRleD4nLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCcjaW5jbHVkZSAiY2hhc3Npcy5oIicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJyNpbmNsdWRlICJsYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmgiJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnI2luY2x1ZGUgInZrX2xheWVyX3V0aWxzLmgiJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgd3JpdGUoJy8vIFRoaXMgaW50ZW50aW9uYWxseSBpbmNsdWRlcyBhIGNwcCBmaWxlJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnI2luY2x1ZGUgInZrX3NhZmVfc3RydWN0LmNwcCInLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICB3cml0ZSgnUmVhZFdyaXRlTG9jayBkaXNwYXRjaF9sb2NrOycsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgIHdyaXRlKCcvLyBVbmlxdWUgT2JqZWN0cyBwTmV4dCBleHRlbnNpb24gaGFuZGxpbmcgZnVuY3Rpb24nLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCclcycgJSBleHRlbnNpb25fcHJvYywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgd3JpdGUoJy8vIE1hbnVhbGx5IHdyaXR0ZW4gRGlzcGF0Y2ggcm91dGluZXMnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCclcycgJSBzZWxmLmlubGluZV9jdXN0b21fc291cmNlX3ByZWFtYmxlLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICBpZiAoc2VsZi5zZWN0aW9uc1snc291cmNlX2ZpbGUnXSk6CisgICAgICAgICAgICAgICAgd3JpdGUoJ1xuJy5qb2luKHNlbGYuc2VjdGlvbnNbJ3NvdXJjZV9maWxlJ10pLCBlbmQ9dScnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICBpZiAoc2VsZi5zZWN0aW9uc1snaGVhZGVyX2ZpbGUnXSk6CisgICAgICAgICAgICAgICAgd3JpdGUoJ1xuJy5qb2luKHNlbGYuc2VjdGlvbnNbJ2hlYWRlcl9maWxlJ10pLCBlbmQ9dScnLCBmaWxlPXNlbGYub3V0RmlsZSkKKworICAgICAgICAjIEZpbmlzaCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmVuZEZpbGUoc2VsZikKKyAgICAjCisgICAgZGVmIGJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpOgorICAgICAgICAjIFN0YXJ0IHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCkKKyAgICAgICAgc2VsZi5oZWFkZXJWZXJzaW9uID0gTm9uZQorICAgICAgICBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgPSBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpCisgICAgICAgIGlmIHNlbGYuZmVhdHVyZU5hbWUgIT0gJ1ZLX1ZFUlNJT05fMV8wJyBhbmQgc2VsZi5mZWF0dXJlTmFtZSAhPSAnVktfVkVSU0lPTl8xXzEnOgorICAgICAgICAgICAgd2hpdGVfbGlzdF9lbnRyeSA9IFtdCisgICAgICAgICAgICBpZiAoc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICB3aGl0ZV9saXN0X2VudHJ5ICs9IFsgJyNpZmRlZiAlcycgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgXQorICAgICAgICAgICAgd2hpdGVfbGlzdF9lbnRyeSArPSBbICciJXMiJyAlIHNlbGYuZmVhdHVyZU5hbWUgXQorICAgICAgICAgICAgaWYgKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgd2hpdGVfbGlzdF9lbnRyeSArPSBbICcjZW5kaWYnIF0KKyAgICAgICAgICAgIGZlYXR1cmVUeXBlID0gaW50ZXJmYWNlLmdldCgndHlwZScpCisgICAgICAgICAgICBpZiBmZWF0dXJlVHlwZSA9PSAnaW5zdGFuY2UnOgorICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFuY2VfZXh0ZW5zaW9ucyArPSB3aGl0ZV9saXN0X2VudHJ5CisgICAgICAgICAgICBlbGlmIGZlYXR1cmVUeXBlID09ICdkZXZpY2UnOgorICAgICAgICAgICAgICAgIHNlbGYuZGV2aWNlX2V4dGVuc2lvbnMgKz0gd2hpdGVfbGlzdF9lbnRyeQorICAgICMKKyAgICBkZWYgZW5kRmVhdHVyZShzZWxmKToKKyAgICAgICAgIyBGaW5pc2ggcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5lbmRGZWF0dXJlKHNlbGYpCisgICAgIworICAgIGRlZiBnZW5UeXBlKHNlbGYsIHR5cGVpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5UeXBlKHNlbGYsIHR5cGVpbmZvLCBuYW1lLCBhbGlhcykKKyAgICAgICAgdHlwZUVsZW0gPSB0eXBlaW5mby5lbGVtCisgICAgICAgICMgSWYgdGhlIHR5cGUgaXMgYSBzdHJ1Y3QgdHlwZSwgdHJhdmVyc2UgdGhlIGltYmVkZGVkIDxtZW1iZXI+IHRhZ3MgZ2VuZXJhdGluZyBhIHN0cnVjdHVyZS4KKyAgICAgICAgIyBPdGhlcndpc2UsIGVtaXQgdGhlIHRhZyB0ZXh0LgorICAgICAgICBjYXRlZ29yeSA9IHR5cGVFbGVtLmdldCgnY2F0ZWdvcnknKQorICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gJ3N0cnVjdCcgb3IgY2F0ZWdvcnkgPT0gJ3VuaW9uJyk6CisgICAgICAgICAgICBzZWxmLmdlblN0cnVjdCh0eXBlaW5mbywgbmFtZSwgYWxpYXMpCisgICAgIworICAgICMgQXBwZW5kIGEgZGVmaW5pdGlvbiB0byB0aGUgc3BlY2lmaWVkIHNlY3Rpb24KKyAgICBkZWYgYXBwZW5kU2VjdGlvbihzZWxmLCBzZWN0aW9uLCB0ZXh0KToKKyAgICAgICAgIyBzZWxmLnNlY3Rpb25zW3NlY3Rpb25dLmFwcGVuZCgnU0VDVElPTjogJyArIHNlY3Rpb24gKyAnXG4nKQorICAgICAgICBzZWxmLnNlY3Rpb25zW3NlY3Rpb25dLmFwcGVuZCh0ZXh0KQorICAgICMKKyAgICAjIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGEgcG9pbnRlcgorICAgIGRlZiBwYXJhbUlzUG9pbnRlcihzZWxmLCBwYXJhbSk6CisgICAgICAgIGlzcG9pbnRlciA9IEZhbHNlCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gJ3R5cGUnIGFuZCBlbGVtLnRhaWwgaXMgbm90IE5vbmUgYW5kICcqJyBpbiBlbGVtLnRhaWw6CisgICAgICAgICAgICAgICAgaXNwb2ludGVyID0gVHJ1ZQorICAgICAgICByZXR1cm4gaXNwb2ludGVyCisgICAgIworICAgICMgUmV0cmlldmUgdGhlIHR5cGUgYW5kIG5hbWUgZm9yIGEgcGFyYW1ldGVyCisgICAgZGVmIGdldFR5cGVOYW1lVHVwbGUoc2VsZiwgcGFyYW0pOgorICAgICAgICB0eXBlID0gJycKKyAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gJ3R5cGUnOgorICAgICAgICAgICAgICAgIHR5cGUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgICAgIGVsaWYgZWxlbS50YWcgPT0gJ25hbWUnOgorICAgICAgICAgICAgICAgIG5hbWUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgcmV0dXJuICh0eXBlLCBuYW1lKQorICAgICMKKyAgICAjIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgbGVuIHRhZworICAgIGRlZiBnZXRMZW4oc2VsZiwgcGFyYW0pOgorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIGxlbiA9IHBhcmFtLmF0dHJpYi5nZXQoJ2xlbicpCisgICAgICAgIGlmIGxlbiBhbmQgbGVuICE9ICdudWxsLXRlcm1pbmF0ZWQnOgorICAgICAgICAgICAgIyBGb3Igc3RyaW5nIGFycmF5cywgJ2xlbicgY2FuIGxvb2sgbGlrZSAnY291bnQsbnVsbC10ZXJtaW5hdGVkJywgaW5kaWNhdGluZyB0aGF0IHdlCisgICAgICAgICAgICAjIGhhdmUgYSBudWxsIHRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncy4gIFdlIHN0cmlwIHRoZSBudWxsLXRlcm1pbmF0ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICMgJ2xlbicgZmllbGQgYW5kIG9ubHkgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgc3RyaW5nIGNvdW50CisgICAgICAgICAgICBpZiAnbnVsbC10ZXJtaW5hdGVkJyBpbiBsZW46CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuLnNwbGl0KCcsJylbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuCisgICAgICAgICAgICAjIFNwZWMgaGFzIG5vdyBub3RhdGlvbiBmb3IgbGVuIGF0dHJpYnV0ZXMsIHVzaW5nIDo6IGluc3RlYWQgb2YgcGxhdGZvcm0gc3BlY2lmaWMgcG9pbnRlciBzeW1ib2wKKyAgICAgICAgICAgIHJlc3VsdCA9IHN0cihyZXN1bHQpLnJlcGxhY2UoJzo6JywgJy0+JykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICMKKyAgICAjIEdlbmVyYXRlIGEgVmtTdHJ1Y3R1cmVUeXBlIGJhc2VkIG9uIGEgc3RydWN0dXJlIHR5cGVuYW1lCisgICAgZGVmIGdlblZrU3RydWN0dXJlVHlwZShzZWxmLCB0eXBlbmFtZSk6CisgICAgICAgICMgQWRkIHVuZGVyc2NvcmUgYmV0d2VlbiBsb3dlcmNhc2UgdGhlbiB1cHBlcmNhc2UKKyAgICAgICAgdmFsdWUgPSByZS5zdWIoJyhbYS16MC05XSkoW0EtWl0pJywgcidcMV9cMicsIHR5cGVuYW1lKQorICAgICAgICAjIENoYW5nZSB0byB1cHBlcmNhc2UKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS51cHBlcigpCisgICAgICAgICMgQWRkIFNUUlVDVFVSRV9UWVBFXworICAgICAgICByZXR1cm4gcmUuc3ViKCdWS18nLCAnVktfU1RSVUNUVVJFX1RZUEVfJywgdmFsdWUpCisgICAgIworICAgICMgU3RydWN0IHBhcmFtZXRlciBjaGVjayBnZW5lcmF0aW9uLgorICAgICMgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgPHR5cGU+IHRhZyB3aGVyZSB0aGUgY29udGVudHMgYXJlIGludGVycHJldGVkIGFzIGEgc2V0IG9mCisgICAgIyA8bWVtYmVyPiB0YWdzIGluc3RlYWQgb2YgZnJlZWZvcm0gQyB0eXBlIGRlY2xhcmF0aW9ucy4gVGhlIDxtZW1iZXI+IHRhZ3MgYXJlIGp1c3QgbGlrZQorICAgICMgPHBhcmFtPiB0YWdzIC0gdGhleSBhcmUgYSBkZWNsYXJhdGlvbiBvZiBhIHN0cnVjdCBvciB1bmlvbiBtZW1iZXIuIE9ubHkgc2ltcGxlIG1lbWJlcgorICAgICMgZGVjbGFyYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vIG5lc3RlZCBzdHJ1Y3RzIGV0Yy4pCisgICAgZGVmIGdlblN0cnVjdChzZWxmLCB0eXBlaW5mbywgdHlwZU5hbWUsIGFsaWFzKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlblN0cnVjdChzZWxmLCB0eXBlaW5mbywgdHlwZU5hbWUsIGFsaWFzKQorICAgICAgICBtZW1iZXJzID0gdHlwZWluZm8uZWxlbS5maW5kYWxsKCcuLy9tZW1iZXInKQorICAgICAgICAjIEl0ZXJhdGUgb3ZlciBtZW1iZXJzIG9uY2UgdG8gZ2V0IGxlbmd0aCBwYXJhbWV0ZXJzIGZvciBhcnJheXMKKyAgICAgICAgbGVucyA9IHNldCgpCisgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgIGxlbiA9IHNlbGYuZ2V0TGVuKG1lbWJlcikKKyAgICAgICAgICAgIGlmIGxlbjoKKyAgICAgICAgICAgICAgICBsZW5zLmFkZChsZW4pCisgICAgICAgICMgR2VuZXJhdGUgbWVtYmVyIGluZm8KKyAgICAgICAgbWVtYmVyc0luZm8gPSBbXQorICAgICAgICBmb3IgbWVtYmVyIGluIG1lbWJlcnM6CisgICAgICAgICAgICAjIEdldCB0aGUgbWVtYmVyJ3MgdHlwZSBhbmQgbmFtZQorICAgICAgICAgICAgaW5mbyA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShtZW1iZXIpCisgICAgICAgICAgICB0eXBlID0gaW5mb1swXQorICAgICAgICAgICAgbmFtZSA9IGluZm9bMV0KKyAgICAgICAgICAgIGNkZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbChtZW1iZXIsIDApCisgICAgICAgICAgICAjIFByb2Nlc3MgVmtTdHJ1Y3R1cmVUeXBlCisgICAgICAgICAgICBpZiB0eXBlID09ICdWa1N0cnVjdHVyZVR5cGUnOgorICAgICAgICAgICAgICAgICMgRXh0cmFjdCB0aGUgcmVxdWlyZWQgc3RydWN0IHR5cGUgdmFsdWUgZnJvbSB0aGUgY29tbWVudHMKKyAgICAgICAgICAgICAgICAjIGVtYmVkZGVkIGluIHRoZSBvcmlnaW5hbCB0ZXh0IGRlZmluaW5nIHRoZSAndHlwZWluZm8nIGVsZW1lbnQKKyAgICAgICAgICAgICAgICByYXdYbWwgPSBldHJlZS50b3N0cmluZyh0eXBlaW5mby5lbGVtKS5kZWNvZGUoJ2FzY2lpJykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZS5zZWFyY2gocidWS19TVFJVQ1RVUkVfVFlQRV9cdysnLCByYXdYbWwpCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC5ncm91cCgwKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5nZW5Wa1N0cnVjdHVyZVR5cGUodHlwZU5hbWUpCisgICAgICAgICAgICAgICAgIyBTdG9yZSB0aGUgcmVxdWlyZWQgdHlwZSB2YWx1ZQorICAgICAgICAgICAgICAgIHNlbGYuc3RydWN0VHlwZXNbdHlwZU5hbWVdID0gc2VsZi5TdHJ1Y3RUeXBlKG5hbWU9bmFtZSwgdmFsdWU9dmFsdWUpCisgICAgICAgICAgICAjIFN0b3JlIHBvaW50ZXIvYXJyYXkvc3RyaW5nIGluZm8KKyAgICAgICAgICAgIGV4dHN0cnVjdHMgPSBzZWxmLnJlZ2lzdHJ5LnZhbGlkZXh0ZW5zaW9uc3RydWN0c1t0eXBlTmFtZV0gaWYgbmFtZSA9PSAncE5leHQnIGVsc2UgTm9uZQorICAgICAgICAgICAgbWVtYmVyc0luZm8uYXBwZW5kKHNlbGYuQ29tbWFuZFBhcmFtKHR5cGU9dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNwb2ludGVyPXNlbGYucGFyYW1Jc1BvaW50ZXIobWVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2NvbnN0PVRydWUgaWYgJ2NvbnN0JyBpbiBjZGVjbCBlbHNlIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY291bnQ9VHJ1ZSBpZiBuYW1lIGluIGxlbnMgZWxzZSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW49c2VsZi5nZXRMZW4obWVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRzdHJ1Y3RzPWV4dHN0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9Y2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNsb2NhbD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2NyZWF0ZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2Rlc3Ryb3k9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9wcm90ZWN0PXNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCkpCisgICAgICAgIHNlbGYuc3RydWN0TWVtYmVycy5hcHBlbmQoc2VsZi5TdHJ1Y3RNZW1iZXJEYXRhKG5hbWU9dHlwZU5hbWUsIG1lbWJlcnM9bWVtYmVyc0luZm8pKQorCisgICAgIworICAgICMgRGV0ZXJtaW5lIGlmIGEgc3RydWN0IGhhcyBhbiBORE8gYXMgYSBtZW1iZXIgb3IgYW4gZW1iZWRkZWQgbWVtYmVyCisgICAgZGVmIHN0cnVjdF9jb250YWluc19uZG8oc2VsZiwgc3RydWN0X2l0ZW0pOgorICAgICAgICBzdHJ1Y3RfbWVtYmVyX2RpY3QgPSBkaWN0KHNlbGYuc3RydWN0TWVtYmVycykKKyAgICAgICAgc3RydWN0X21lbWJlcnMgPSBzdHJ1Y3RfbWVtYmVyX2RpY3Rbc3RydWN0X2l0ZW1dCisKKyAgICAgICAgZm9yIG1lbWJlciBpbiBzdHJ1Y3RfbWVtYmVyczoKKyAgICAgICAgICAgIGlmIHNlbGYuaGFuZGxlX3R5cGVzLklzTm9uRGlzcGF0Y2hhYmxlKG1lbWJlci50eXBlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxpZiBtZW1iZXIudHlwZSBpbiBzdHJ1Y3RfbWVtYmVyX2RpY3Q6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdHJ1Y3RfY29udGFpbnNfbmRvKG1lbWJlci50eXBlKSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAjCisgICAgIyBSZXR1cm4gbGlzdCBvZiBzdHJ1Y3QgbWVtYmVycyB3aGljaCBjb250YWluLCBvciB3aGljaCBzdWItc3RydWN0dXJlcyBjb250YWluCisgICAgIyBhbiBORE8gaW4gYSBnaXZlbiBsaXN0IG9mIHBhcmFtZXRlcnMgb3IgbWVtYmVycworICAgIGRlZiBnZXRQYXJtZXRlclN0cnVjdHNXaXRoTmRvcyhzZWxmLCBpdGVtX2xpc3QpOgorICAgICAgICBzdHJ1Y3RfbGlzdCA9IHNldCgpCisgICAgICAgIGZvciBpdGVtIGluIGl0ZW1fbGlzdDoKKyAgICAgICAgICAgIHBhcmFtdHlwZSA9IGl0ZW0uZmluZCgndHlwZScpCisgICAgICAgICAgICB0eXBlY2F0ZWdvcnkgPSBzZWxmLnR5cGVfY2F0ZWdvcmllc1twYXJhbXR5cGUudGV4dF0KKyAgICAgICAgICAgIGlmIHR5cGVjYXRlZ29yeSA9PSAnc3RydWN0JzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cnVjdF9jb250YWluc19uZG8ocGFyYW10eXBlLnRleHQpID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9saXN0LmFkZChpdGVtKQorICAgICAgICByZXR1cm4gc3RydWN0X2xpc3QKKyAgICAjCisgICAgIyBSZXR1cm4gbGlzdCBvZiBub24tZGlzcGF0Y2hhYmxlIG9iamVjdHMgZnJvbSBhIGdpdmVuIGxpc3Qgb2YgcGFyYW1ldGVycyBvciBtZW1iZXJzCisgICAgZGVmIGdldE5kb3NJblBhcmFtZXRlckxpc3Qoc2VsZiwgaXRlbV9saXN0LCBjcmVhdGVfZnVuYyk6CisgICAgICAgIG5kb19saXN0ID0gc2V0KCkKKyAgICAgICAgaWYgY3JlYXRlX2Z1bmMgPT0gVHJ1ZToKKyAgICAgICAgICAgIG1lbWJlcl9saXN0ID0gaXRlbV9saXN0WzA6LTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZW1iZXJfbGlzdCA9IGl0ZW1fbGlzdAorICAgICAgICBmb3IgaXRlbSBpbiBtZW1iZXJfbGlzdDoKKyAgICAgICAgICAgIGlmIHNlbGYuaGFuZGxlX3R5cGVzLklzTm9uRGlzcGF0Y2hhYmxlKHBhcmFtdHlwZS50ZXh0KToKKyAgICAgICAgICAgICAgICBuZG9fbGlzdC5hZGQoaXRlbSkKKyAgICAgICAgcmV0dXJuIG5kb19saXN0CisgICAgIworICAgICMgQ29uc3RydWN0IGxpc3Qgb2YgZXh0ZW5zaW9uIHN0cnVjdHMgY29udGFpbmluZyBoYW5kbGVzLCBvciBleHRlbnNpb24gc3RydWN0cyB0aGF0IHNoYXJlIGEgc3RydWN0ZXh0ZW5kcyBhdHRyaWJ1dGUKKyAgICAjIFdJVEggYW4gZXh0ZW5zaW9uIHN0cnVjdCBjb250YWluaW5nIGhhbmRsZXMuIEFsbCBleHRlbnNpb24gc3RydWN0cyBpbiBhbnkgcE5leHQgY2hhaW4gd2lsbCBoYXZlIHRvIGJlIGNvcGllZC4KKyAgICAjIFRPRE86IG1ha2UgdGhpcyByZWN1cnNpdmUgLS0gc3RydWN0cyBidXJpZWQgdGhyZWUgb3IgbW9yZSBsZXZlbHMgZGVlcCBhcmUgbm90IHNlYXJjaGVkIGZvciBleHRlbnNpb25zCisgICAgZGVmIEdlbmVyYXRlQ29tbWFuZFdyYXBFeHRlbnNpb25MaXN0KHNlbGYpOgorICAgICAgICBmb3Igc3RydWN0IGluIHNlbGYuc3RydWN0TWVtYmVyczoKKyAgICAgICAgICAgIGlmIChsZW4oc3RydWN0Lm1lbWJlcnMpID4gMSkgYW5kIHN0cnVjdC5tZW1iZXJzWzFdLmV4dHN0cnVjdHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBzdHJ1Y3QubWVtYmVyc1sxXS5leHRzdHJ1Y3RzOgorICAgICAgICAgICAgICAgICAgICBpZiBpdGVtICE9ICcnIGFuZCBpdGVtIG5vdCBpbiBzZWxmLnBuZXh0X2V4dGVuc2lvbl9zdHJ1Y3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wbmV4dF9leHRlbnNpb25fc3RydWN0cy5hcHBlbmQoaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaXRlbSAhPSAnJyBhbmQgc2VsZi5zdHJ1Y3RfY29udGFpbnNfbmRvKGl0ZW0pID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBmb3VuZCA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBzdHJ1Y3QubWVtYmVyc1sxXS5leHRzdHJ1Y3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXRlbSAhPSAnJyBhbmQgaXRlbSBub3QgaW4gc2VsZi5leHRlbnNpb25fc3RydWN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4dGVuc2lvbl9zdHJ1Y3RzLmFwcGVuZChpdGVtKQorICAgICMKKyAgICAjIFJldHVybnMgVHJ1ZSBpZiBhIHN0cnVjdCBtYXkgaGF2ZSBhIHBOZXh0IGNoYWluIGNvbnRhaW5pbmcgYW4gTkRPCisgICAgZGVmIFN0cnVjdFdpdGhFeHRlbnNpb25zKHNlbGYsIHN0cnVjdF90eXBlKToKKyAgICAgICAgaWYgc3RydWN0X3R5cGUgaW4gc2VsZi5zdHJ1Y3RfbWVtYmVyX2RpY3Q6CisgICAgICAgICAgICBwYXJhbV9pbmZvID0gc2VsZi5zdHJ1Y3RfbWVtYmVyX2RpY3Rbc3RydWN0X3R5cGVdCisgICAgICAgICAgICBpZiAobGVuKHBhcmFtX2luZm8pID4gMSkgYW5kIHBhcmFtX2luZm9bMV0uZXh0c3RydWN0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBwYXJhbV9pbmZvWzFdLmV4dHN0cnVjdHM6CisgICAgICAgICAgICAgICAgICAgIGlmIGl0ZW0gaW4gc2VsZi5leHRlbnNpb25fc3RydWN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgICMKKyAgICAjIEdlbmVyYXRlIHBOZXh0IGhhbmRsaW5nIGZ1bmN0aW9uCisgICAgZGVmIGJ1aWxkX2V4dGVuc2lvbl9wcm9jZXNzaW5nX2Z1bmMoc2VsZik6CisgICAgICAgICMgQ29uc3RydWN0IGhlbHBlciBmdW5jdGlvbnMgdG8gYnVpbGQgYW5kIGZyZWUgcE5leHQgZXh0ZW5zaW9uIGNoYWlucworICAgICAgICBwbmV4dF9wcm9jID0gJycKKyAgICAgICAgcG5leHRfcHJvYyArPSAndm9pZCBXcmFwUG5leHRDaGFpbkhhbmRsZXMoVmFsaWRhdGlvbk9iamVjdCAqbGF5ZXJfZGF0YSwgY29uc3Qgdm9pZCAqcE5leHQpIHtcbicKKyAgICAgICAgcG5leHRfcHJvYyArPSAnICAgIHZvaWQgKmN1cl9wbmV4dCA9IGNvbnN0X2Nhc3Q8dm9pZCAqPihwTmV4dCk7XG4nCisgICAgICAgIHBuZXh0X3Byb2MgKz0gJyAgICB3aGlsZSAoY3VyX3BuZXh0ICE9IE5VTEwpIHtcbicKKyAgICAgICAgcG5leHRfcHJvYyArPSAnICAgICAgICBWa0Jhc2VPdXRTdHJ1Y3R1cmUgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtCYXNlT3V0U3RydWN0dXJlICo+KGN1cl9wbmV4dCk7XG5cbicKKyAgICAgICAgcG5leHRfcHJvYyArPSAnICAgICAgICBzd2l0Y2ggKGhlYWRlci0+c1R5cGUpIHtcbicKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5wbmV4dF9leHRlbnNpb25fc3RydWN0czoKKyAgICAgICAgICAgIHN0cnVjdF9pbmZvID0gc2VsZi5zdHJ1Y3RfbWVtYmVyX2RpY3RbaXRlbV0KKyAgICAgICAgICAgIGluZGVudCA9ICcgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgKHRtcF9kZWNsLCB0bXBfcHJlLCB0bXBfcG9zdCkgPSBzZWxmLnVuaXF1aWZ5X21lbWJlcnMoc3RydWN0X2luZm8sIGluZGVudCwgJ3NhZmVfc3RydWN0LT4nLCAwLCBGYWxzZSwgRmFsc2UsIEZhbHNlLCBGYWxzZSkKKyAgICAgICAgICAgICMgT25seSBwcm9jZXNzIGV4dGVuc2lvbiBzdHJ1Y3RzIGNvbnRhaW5pbmcgaGFuZGxlcworICAgICAgICAgICAgaWYgbm90IHRtcF9wcmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHN0cnVjdF9pbmZvWzBdLmZlYXR1cmVfcHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBwbmV4dF9wcm9jICs9ICcjaWZkZWYgJXMgXG4nICUgc3RydWN0X2luZm9bMF0uZmVhdHVyZV9wcm90ZWN0CisgICAgICAgICAgICBwbmV4dF9wcm9jICs9ICcgICAgICAgICAgICBjYXNlICVzOiB7XG4nICUgc2VsZi5zdHJ1Y3RUeXBlc1tpdGVtXS52YWx1ZQorICAgICAgICAgICAgcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgICAgICAgICBzYWZlXyVzICpzYWZlX3N0cnVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2FmZV8lcyAqPihjdXJfcG5leHQpO1xuJyAlIChpdGVtLCBpdGVtKQorICAgICAgICAgICAgIyBHZW5lcmF0ZSBjb2RlIHRvIHVud3JhcCB0aGUgaGFuZGxlcworICAgICAgICAgICAgcG5leHRfcHJvYyArPSB0bXBfcHJlCisgICAgICAgICAgICBwbmV4dF9wcm9jICs9ICcgICAgICAgICAgICAgICAgfSBicmVhaztcbicKKyAgICAgICAgICAgIGlmIHN0cnVjdF9pbmZvWzBdLmZlYXR1cmVfcHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBwbmV4dF9wcm9jICs9ICcjZW5kaWYgLy8gJXMgXG4nICUgc3RydWN0X2luZm9bMF0uZmVhdHVyZV9wcm90ZWN0CisgICAgICAgICAgICBwbmV4dF9wcm9jICs9ICdcbicKKyAgICAgICAgcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgZGVmYXVsdDpcbicKKyAgICAgICAgcG5leHRfcHJvYyArPSAnICAgICAgICAgICAgICAgIGJyZWFrO1xuJworICAgICAgICBwbmV4dF9wcm9jICs9ICcgICAgICAgIH1cblxuJworICAgICAgICBwbmV4dF9wcm9jICs9ICcgICAgICAgIC8vIFByb2Nlc3MgdGhlIG5leHQgc3RydWN0dXJlIGluIHRoZSBjaGFpblxuJworICAgICAgICBwbmV4dF9wcm9jICs9ICcgICAgICAgIGN1cl9wbmV4dCA9IGhlYWRlci0+cE5leHQ7XG4nCisgICAgICAgIHBuZXh0X3Byb2MgKz0gJyAgICB9XG4nCisgICAgICAgIHBuZXh0X3Byb2MgKz0gJ31cbicKKyAgICAgICAgcmV0dXJuIHBuZXh0X3Byb2MKKworICAgICMKKyAgICAjIEdlbmVyYXRlIHNvdXJjZSBmb3IgY3JlYXRpbmcgYSBub24tZGlzcGF0Y2hhYmxlIG9iamVjdAorICAgIGRlZiBnZW5lcmF0ZV9jcmVhdGVfbmRvX2NvZGUoc2VsZiwgaW5kZW50LCBwcm90bywgcGFyYW1zLCBjbWRfaW5mbyk6CisgICAgICAgIGNyZWF0ZV9uZG9fY29kZSA9ICcnCisgICAgICAgIGhhbmRsZV90eXBlID0gcGFyYW1zWy0xXS5maW5kKCd0eXBlJykKKyAgICAgICAgaWYgc2VsZi5oYW5kbGVfdHlwZXMuSXNOb25EaXNwYXRjaGFibGUoaGFuZGxlX3R5cGUudGV4dCk6CisgICAgICAgICAgICAjIENoZWNrIGZvciBzcGVjaWFsIGNhc2Ugd2hlcmUgbXVsdGlwbGUgaGFuZGxlcyBhcmUgcmV0dXJuZWQKKyAgICAgICAgICAgIG5kb19hcnJheSA9IEZhbHNlCisgICAgICAgICAgICBpZiBjbWRfaW5mb1stMV0ubGVuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5kb19hcnJheSA9IFRydWU7CisgICAgICAgICAgICBoYW5kbGVfbmFtZSA9IHBhcmFtc1stMV0uZmluZCgnbmFtZScpCisgICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSByZXR1cm4gdmFsdWUgaGFuZGxpbmcgZm9yIHRoZSBjcmVhdGVwaXBlbGluZSBBUElzCisgICAgICAgICAgICBpc19jcmVhdGVfcGlwZWxpbmVzID0gKCdDcmVhdGVHcmFwaGljc1BpcGVsaW5lcycgaW4gcHJvdG8udGV4dCkgb3IgKCdDcmVhdGVDb21wdXRlUGlwZWxpbmVzJyBpbiBwcm90by50ZXh0KSBvciAoJ0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXMnIGluIHByb3RvLnRleHQpCisgICAgICAgICAgICBpZiBpc19jcmVhdGVfcGlwZWxpbmVzOgorICAgICAgICAgICAgICAgIGNyZWF0ZV9uZG9fY29kZSArPSAnJXN7XG4nICUgKGluZGVudCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3JlYXRlX25kb19jb2RlICs9ICclc2lmIChWS19TVUNDRVNTID09IHJlc3VsdCkge1xuJyAlIChpbmRlbnQpCisgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICBuZG9fZGVzdCA9ICcqJXMnICUgaGFuZGxlX25hbWUudGV4dAorICAgICAgICAgICAgaWYgbmRvX2FycmF5ID09IFRydWU6CisgICAgICAgICAgICAgICAgY3JlYXRlX25kb19jb2RlICs9ICclc2ZvciAodWludDMyX3QgaW5kZXgwID0gMDsgaW5kZXgwIDwgJXM7IGluZGV4MCsrKSB7XG4nICUgKGluZGVudCwgY21kX2luZm9bLTFdLmxlbikKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgbmRvX2Rlc3QgPSAnJXNbaW5kZXgwXScgJSBjbWRfaW5mb1stMV0ubmFtZQorICAgICAgICAgICAgICAgIGlmIGlzX2NyZWF0ZV9waXBlbGluZXM6CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9uZG9fY29kZSArPSAnJXNpZiAoJXMgIT0gVktfTlVMTF9IQU5ETEUpIHtcbicgJSAoaW5kZW50LCBuZG9fZGVzdCkKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgY3JlYXRlX25kb19jb2RlICs9ICclcyVzID0gbGF5ZXJfZGF0YS0+V3JhcE5ldyglcyk7XG4nICUgKGluZGVudCwgbmRvX2Rlc3QsIG5kb19kZXN0KQorICAgICAgICAgICAgaWYgbmRvX2FycmF5ID09IFRydWU6CisgICAgICAgICAgICAgICAgaWYgaXNfY3JlYXRlX3BpcGVsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICBjcmVhdGVfbmRvX2NvZGUgKz0gJyVzfVxuJyAlIGluZGVudAorICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuZGVjSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICBjcmVhdGVfbmRvX2NvZGUgKz0gJyVzfVxuJyAlIGluZGVudAorICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgY3JlYXRlX25kb19jb2RlICs9ICclc31cbicgJSAoaW5kZW50KQorICAgICAgICByZXR1cm4gY3JlYXRlX25kb19jb2RlCisgICAgIworICAgICMgR2VuZXJhdGUgc291cmNlIGZvciBkZXN0cm95aW5nIGEgbm9uLWRpc3BhdGNoYWJsZSBvYmplY3QKKyAgICBkZWYgZ2VuZXJhdGVfZGVzdHJveV9uZG9fY29kZShzZWxmLCBpbmRlbnQsIHByb3RvLCBjbWRfaW5mbyk6CisgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgPSAnJworICAgICAgICBuZG9fYXJyYXkgPSBGYWxzZQorICAgICAgICBpZiBUcnVlIGluIFtkZXN0cm95X3R4dCBpbiBwcm90by50ZXh0IGZvciBkZXN0cm95X3R4dCBpbiBbJ0Rlc3Ryb3knLCAnRnJlZSddXToKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIHNwZWNpYWwgY2FzZSB3aGVyZSBtdWx0aXBsZSBoYW5kbGVzIGFyZSByZXR1cm5lZAorICAgICAgICAgICAgaWYgY21kX2luZm9bLTFdLmxlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBuZG9fYXJyYXkgPSBUcnVlOworICAgICAgICAgICAgICAgIHBhcmFtID0gLTEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFyYW0gPSAtMgorICAgICAgICAgICAgaWYgc2VsZi5oYW5kbGVfdHlwZXMuSXNOb25EaXNwYXRjaGFibGUoY21kX2luZm9bcGFyYW1dLnR5cGUpOgorICAgICAgICAgICAgICAgIGlmIG5kb19hcnJheSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgQVBJIGlzIGZyZWVpbmcgYW4gYXJyYXkgb2YgaGFuZGxlcy4gIFJlbW92ZSB0aGVtIGZyb20gdGhlIHVuaXF1ZV9pZCBtYXAuCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgKz0gJyVzaWYgKChWS19TVUNDRVNTID09IHJlc3VsdCkgJiYgKCVzKSkge1xuJyAlIChpbmRlbnQsIGNtZF9pbmZvW3BhcmFtXS5uYW1lKQorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgKz0gJyVzZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCAlczsgaW5kZXgwKyspIHtcbicgJSAoaW5kZW50LCBjbWRfaW5mb1twYXJhbV0ubGVuKQorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgKz0gJyVzJXMgaGFuZGxlID0gJXNbaW5kZXgwXTtcbicgJSAoaW5kZW50LCBjbWRfaW5mb1twYXJhbV0udHlwZSwgY21kX2luZm9bcGFyYW1dLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgKz0gJyVzdWludDY0X3QgdW5pcXVlX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPihoYW5kbGUpO1xuJyAlIChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgKz0gJyVzdW5pcXVlX2lkX21hcHBpbmcuZXJhc2UodW5pcXVlX2lkKTtcbicgJSAoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmRlY0luZGVudChpbmRlbnQpOworICAgICAgICAgICAgICAgICAgICBkZXN0cm95X25kb19jb2RlICs9ICclc31cbicgJSBpbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9uZG9fY29kZSArPSAnJXN9XG4nICUgaW5kZW50CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgYSBzaW5nbGUgaGFuZGxlIGZyb20gdGhlIG1hcAorICAgICAgICAgICAgICAgICAgICBkZXN0cm95X25kb19jb2RlICs9ICclc3VpbnQ2NF90ICVzX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAmPiglcyk7XG4nICUgKGluZGVudCwgY21kX2luZm9bcGFyYW1dLm5hbWUsIGNtZF9pbmZvW3BhcmFtXS5uYW1lKQorICAgICAgICAgICAgICAgICAgICBkZXN0cm95X25kb19jb2RlICs9ICclc2F1dG8gaXRlciA9IHVuaXF1ZV9pZF9tYXBwaW5nLnBvcCglc19pZCk7XG4nICUgKGluZGVudCwgY21kX2luZm9bcGFyYW1dLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgKz0gJyVzaWYgKGl0ZXIgIT0gdW5pcXVlX2lkX21hcHBpbmcuZW5kKCkpIHtcbicgJSAoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgKz0gJyVzJXMgPSAoJXMpaXRlci0+c2Vjb25kO1xuJyAlIChpbmRlbnQsIGNtZF9pbmZvW3BhcmFtXS5uYW1lLCBjbWRfaW5mb1twYXJhbV0udHlwZSkKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9uZG9fY29kZSArPSAnJXN9IGVsc2Uge1xuJyAlIChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5jSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9uZG9fY29kZSArPSAnJXMlcyA9ICglcykwO1xuJyAlIChpbmRlbnQsIGNtZF9pbmZvW3BhcmFtXS5uYW1lLCBjbWRfaW5mb1twYXJhbV0udHlwZSkKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9uZG9fY29kZSArPSAnJXN9XG4nICUgKGluZGVudCkKKworICAgICAgICByZXR1cm4gbmRvX2FycmF5LCBkZXN0cm95X25kb19jb2RlCisKKyAgICAjCisgICAgIyBDbGVhbiB1cCBsb2NhbCBkZWNsYXJhdGlvbnMKKyAgICBkZWYgY2xlYW5VcExvY2FsRGVjbGFyYXRpb25zKHNlbGYsIGluZGVudCwgcHJlZml4LCBuYW1lLCBsZW4sIGluZGV4KToKKyAgICAgICAgY2xlYW51cCA9ICcnCisgICAgICAgIGlmIGxlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNsZWFudXAgPSAnJXNpZiAobG9jYWxfJXMlcykge1xuJyAlIChpbmRlbnQsIHByZWZpeCwgbmFtZSkKKyAgICAgICAgICAgIGNsZWFudXAgKz0gJyVzICAgIGRlbGV0ZVtdIGxvY2FsXyVzJXM7XG4nICUgKGluZGVudCwgcHJlZml4LCBuYW1lKQorICAgICAgICAgICAgY2xlYW51cCArPSAiJXN9XG4iICUgKGluZGVudCkKKyAgICAgICAgcmV0dXJuIGNsZWFudXAKKyAgICAjCisgICAgIyBPdXRwdXQgVU8gY29kZSBmb3IgYSBzaW5nbGUgTkRPIChuZG9fY291bnQgaXMgTlVMTCkgb3IgYSBjb3VudGVkIGxpc3Qgb2YgTkRPcworICAgIGRlZiBvdXRwdXRORE9zKHNlbGYsIG5kb190eXBlLCBuZG9fbmFtZSwgbmRvX2NvdW50LCBwcmVmaXgsIGluZGV4LCBpbmRlbnQsIGRlc3Ryb3lfZnVuYywgZGVzdHJveV9hcnJheSwgdG9wX2xldmVsKToKKyAgICAgICAgZGVjbF9jb2RlID0gJycKKyAgICAgICAgcHJlX2NhbGxfY29kZSA9ICcnCisgICAgICAgIHBvc3RfY2FsbF9jb2RlID0gJycKKyAgICAgICAgaWYgbmRvX2NvdW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgdG9wX2xldmVsID09IFRydWU6CisgICAgICAgICAgICAgICAgZGVjbF9jb2RlICs9ICclcyVzIHZhcl9sb2NhbF8lcyVzW0RJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OU107XG4nICUgKGluZGVudCwgbmRvX3R5cGUsIHByZWZpeCwgbmRvX25hbWUpCisgICAgICAgICAgICAgICAgZGVjbF9jb2RlICs9ICclcyVzICpsb2NhbF8lcyVzID0gTlVMTDtcbicgJSAoaW5kZW50LCBuZG9fdHlwZSwgcHJlZml4LCBuZG9fbmFtZSkKKyAgICAgICAgICAgIHByZV9jYWxsX2NvZGUgKz0gJyVzICAgIGlmICglcyVzKSB7XG4nICUgKGluZGVudCwgcHJlZml4LCBuZG9fbmFtZSkKKyAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5jSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgIGlmIHRvcF9sZXZlbCA9PSBUcnVlOgorICAgICAgICAgICAgICAgIHByZV9jYWxsX2NvZGUgKz0gJyVzICAgIGxvY2FsXyVzJXMgPSAlcyA+IERJU1BBVENIX01BWF9TVEFDS19BTExPQ0FUSU9OUyA/IG5ldyAlc1slc10gOiB2YXJfbG9jYWxfJXMlcztcbicgJSAoaW5kZW50LCBwcmVmaXgsIG5kb19uYW1lLCBuZG9fY291bnQsIG5kb190eXBlLCBuZG9fY291bnQsIHByZWZpeCwgbmRvX25hbWUpCisgICAgICAgICAgICAgICAgcHJlX2NhbGxfY29kZSArPSAnJXMgICAgZm9yICh1aW50MzJfdCAlcyA9IDA7ICVzIDwgJXM7ICsrJXMpIHtcbicgJSAoaW5kZW50LCBpbmRleCwgaW5kZXgsIG5kb19jb3VudCwgaW5kZXgpCisgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgIHByZV9jYWxsX2NvZGUgKz0gJyVzICAgIGxvY2FsXyVzJXNbJXNdID0gbGF5ZXJfZGF0YS0+VW53cmFwKCVzWyVzXSk7XG4nICUgKGluZGVudCwgcHJlZml4LCBuZG9fbmFtZSwgaW5kZXgsIG5kb19uYW1lLCBpbmRleCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJlX2NhbGxfY29kZSArPSAnJXMgICAgZm9yICh1aW50MzJfdCAlcyA9IDA7ICVzIDwgJXM7ICsrJXMpIHtcbicgJSAoaW5kZW50LCBpbmRleCwgaW5kZXgsIG5kb19jb3VudCwgaW5kZXgpCisgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgIHByZV9jYWxsX2NvZGUgKz0gJyVzICAgICVzJXNbJXNdID0gbGF5ZXJfZGF0YS0+VW53cmFwKCVzJXNbJXNdKTtcbicgJSAoaW5kZW50LCBwcmVmaXgsIG5kb19uYW1lLCBpbmRleCwgcHJlZml4LCBuZG9fbmFtZSwgaW5kZXgpCisgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmRlY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICBwcmVfY2FsbF9jb2RlICs9ICclcyAgICB9XG4nICUgaW5kZW50CisgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmRlY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICBwcmVfY2FsbF9jb2RlICs9ICclcyAgICB9XG4nICUgaW5kZW50CisgICAgICAgICAgICBpZiB0b3BfbGV2ZWwgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICBwb3N0X2NhbGxfY29kZSArPSAnJXNpZiAobG9jYWxfJXMlcyAhPSB2YXJfbG9jYWxfJXMlcylcbicgJSAoaW5kZW50LCBwcmVmaXgsIG5kb19uYW1lLCBwcmVmaXgsIG5kb19uYW1lKQorICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5jSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICBwb3N0X2NhbGxfY29kZSArPSAnJXNkZWxldGVbXSBsb2NhbF8lcztcbicgJSAoaW5kZW50LCBuZG9fbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHRvcF9sZXZlbCA9PSBUcnVlOgorICAgICAgICAgICAgICAgIGlmIChkZXN0cm95X2Z1bmMgPT0gRmFsc2UpIG9yIChkZXN0cm95X2FycmF5ID09IFRydWUpOgorICAgICAgICAgICAgICAgICAgICBwcmVfY2FsbF9jb2RlICs9ICclcyAgICAlcyA9IGxheWVyX2RhdGEtPlVud3JhcCglcyk7XG4nICUgKGluZGVudCwgbmRvX25hbWUsIG5kb19uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE1ha2UgdGVtcCBjb3B5IG9mIHRoaXMgdmFyIHdpdGggdGhlICdsb2NhbCcgcmVtb3ZlZC4gSXQgbWF5IGJlIGJldHRlciB0byBub3QgcGFzcyBpbiAnbG9jYWxfJworICAgICAgICAgICAgICAgICMgYXMgcGFydCBvZiB0aGUgc3RyaW5nIGFuZCBleHBsaWNpdGx5IHByaW50IGl0CisgICAgICAgICAgICAgICAgZml4ID0gc3RyKHByZWZpeCkuc3RyaXAoJ2xvY2FsXycpOworICAgICAgICAgICAgICAgIHByZV9jYWxsX2NvZGUgKz0gJyVzICAgIGlmICglcyVzKSB7XG4nICUgKGluZGVudCwgZml4LCBuZG9fbmFtZSkKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgcHJlX2NhbGxfY29kZSArPSAnJXMgICAgJXMlcyA9IGxheWVyX2RhdGEtPlVud3JhcCglcyVzKTtcbicgJSAoaW5kZW50LCBwcmVmaXgsIG5kb19uYW1lLCBmaXgsIG5kb19uYW1lKQorICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuZGVjSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICBwcmVfY2FsbF9jb2RlICs9ICclcyAgICB9XG4nICUgaW5kZW50CisgICAgICAgIHJldHVybiBkZWNsX2NvZGUsIHByZV9jYWxsX2NvZGUsIHBvc3RfY2FsbF9jb2RlCisgICAgIworICAgICMgZmlyc3RfbGV2ZWxfcGFyYW0gaW5kaWNhdGVzIGlmIGVsZW1lbnRzIGFyZSBwYXNzZWQgZGlyZWN0bHkgaW50byB0aGUgZnVuY3Rpb24gZWxzZSB0aGV5J3JlIGJlbG93IGEgcHRyL3N0cnVjdAorICAgICMgY3JlYXRlX2Z1bmMgbWVhbnMgdGhhdCB0aGlzIGlzIEFQSSBjcmVhdGVzIG9yIGFsbG9jYXRlcyBORE9zCisgICAgIyBkZXN0cm95X2Z1bmMgaW5kaWNhdGVzIHRoYXQgdGhpcyBBUEkgZGVzdHJveXMgb3IgZnJlZXMgTkRPcworICAgICMgZGVzdHJveV9hcnJheSBtZWFucyB0aGF0IHRoZSBkZXN0cm95X2Z1bmMgb3BlcmF0ZWQgb24gYW4gYXJyYXkgb2YgTkRPcworICAgIGRlZiB1bmlxdWlmeV9tZW1iZXJzKHNlbGYsIG1lbWJlcnMsIGluZGVudCwgcHJlZml4LCBhcnJheV9pbmRleCwgY3JlYXRlX2Z1bmMsIGRlc3Ryb3lfZnVuYywgZGVzdHJveV9hcnJheSwgZmlyc3RfbGV2ZWxfcGFyYW0pOgorICAgICAgICBkZWNscyA9ICcnCisgICAgICAgIHByZV9jb2RlID0gJycKKyAgICAgICAgcG9zdF9jb2RlID0gJycKKyAgICAgICAgaW5kZXggPSAnaW5kZXglcycgJSBzdHIoYXJyYXlfaW5kZXgpCisgICAgICAgIGFycmF5X2luZGV4ICs9IDEKKyAgICAgICAgIyBQcm9jZXNzIGFueSBORE9zIGluIHRoaXMgc3RydWN0dXJlIGFuZCByZWN1cnNlIGZvciBhbnkgc3ViLXN0cnVjdHMgaW4gdGhpcyBzdHJ1Y3QKKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgcHJvY2Vzc19wbmV4dCA9IHNlbGYuU3RydWN0V2l0aEV4dGVuc2lvbnMobWVtYmVyLnR5cGUpCisgICAgICAgICAgICAjIEhhbmRsZSBORE9zCisgICAgICAgICAgICBpZiBzZWxmLmhhbmRsZV90eXBlcy5Jc05vbkRpc3BhdGNoYWJsZShtZW1iZXIudHlwZSk6CisgICAgICAgICAgICAgICAgY291bnRfbmFtZSA9IG1lbWJlci5sZW4KKyAgICAgICAgICAgICAgICBpZiAoY291bnRfbmFtZSBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGZpcnN0X2xldmVsX3BhcmFtID09IEZhbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfbmFtZSA9ICclcyVzJyAlIChwcmVmaXgsIG1lbWJlci5sZW4pCisKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RfbGV2ZWxfcGFyYW0gPT0gRmFsc2UpIG9yIChjcmVhdGVfZnVuYyA9PSBGYWxzZSkgb3IgKG5vdCAnKicgaW4gbWVtYmVyLmNkZWNsKToKKyAgICAgICAgICAgICAgICAgICAgKHRtcF9kZWNsLCB0bXBfcHJlLCB0bXBfcG9zdCkgPSBzZWxmLm91dHB1dE5ET3MobWVtYmVyLnR5cGUsIG1lbWJlci5uYW1lLCBjb3VudF9uYW1lLCBwcmVmaXgsIGluZGV4LCBpbmRlbnQsIGRlc3Ryb3lfZnVuYywgZGVzdHJveV9hcnJheSwgZmlyc3RfbGV2ZWxfcGFyYW0pCisgICAgICAgICAgICAgICAgICAgIGRlY2xzICs9IHRtcF9kZWNsCisgICAgICAgICAgICAgICAgICAgIHByZV9jb2RlICs9IHRtcF9wcmUKKyAgICAgICAgICAgICAgICAgICAgcG9zdF9jb2RlICs9IHRtcF9wb3N0CisgICAgICAgICAgICAjIEhhbmRsZSBTdHJ1Y3RzIHRoYXQgY29udGFpbiBORE9zIGF0IHNvbWUgbGV2ZWwKKyAgICAgICAgICAgIGVsaWYgbWVtYmVyLnR5cGUgaW4gc2VsZi5zdHJ1Y3RfbWVtYmVyX2RpY3Q6CisgICAgICAgICAgICAgICAgIyBTdHJ1Y3RzIGF0IGZpcnN0IGxldmVsIHdpbGwgaGF2ZSBhbiBORE8sIE9SLCB3ZSBuZWVkIGEgc2FmZV9zdHJ1Y3QgZm9yIHRoZSBwbmV4dCBjaGFpbgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RydWN0X2NvbnRhaW5zX25kbyhtZW1iZXIudHlwZSkgPT0gVHJ1ZSBvciBwcm9jZXNzX3BuZXh0OgorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfaW5mbyA9IHNlbGYuc3RydWN0X21lbWJlcl9kaWN0W21lbWJlci50eXBlXQorICAgICAgICAgICAgICAgICAgICAjIFRPRE8gKGpib2x6KTogQ2FuIHRoaXMgdXNlIHBhcmFtSXNQb2ludGVyPworICAgICAgICAgICAgICAgICAgICBpc3BvaW50ZXIgPSAnKicgaW4gbWVtYmVyLmNkZWNsOworICAgICAgICAgICAgICAgICAgICAjIFN0cnVjdCBBcnJheQorICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIubGVuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBVcGRhdGUgc3RydWN0IHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RfbGV2ZWxfcGFyYW0gPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcHJlZml4ID0gJ2xvY2FsXyVzJyAlIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWNsYXJlIHNhZmVfVmFyVHlwZSBmb3Igc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHMgKz0gJyVzc2FmZV8lcyAqJXMgPSBOVUxMO1xuJyAlIChpbmRlbnQsIG1lbWJlci50eXBlLCBuZXdfcHJlZml4KQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcHJlZml4ID0gJyVzJXMnICUgKHByZWZpeCwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXMgICAgaWYgKCVzJXMpIHtcbicgJSAoaW5kZW50LCBwcmVmaXgsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RfbGV2ZWxfcGFyYW0gPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXMgICAgJXMgPSBuZXcgc2FmZV8lc1slc107XG4nICUgKGluZGVudCwgbmV3X3ByZWZpeCwgbWVtYmVyLnR5cGUsIG1lbWJlci5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXMgICAgZm9yICh1aW50MzJfdCAlcyA9IDA7ICVzIDwgJXMlczsgKyslcykge1xuJyAlIChpbmRlbnQsIGluZGV4LCBpbmRleCwgcHJlZml4LCBtZW1iZXIubGVuLCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5jSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpcnN0X2xldmVsX3BhcmFtID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gJyVzICAgICVzWyVzXS5pbml0aWFsaXplKCYlc1slc10pO1xuJyAlIChpbmRlbnQsIG5ld19wcmVmaXgsIGluZGV4LCBtZW1iZXIubmFtZSwgaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJvY2Vzc19wbmV4dDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gJyVzICAgIFdyYXBQbmV4dENoYWluSGFuZGxlcyhsYXllcl9kYXRhLCAlc1slc10ucE5leHQpO1xuJyAlIChpbmRlbnQsIG5ld19wcmVmaXgsIGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcHJlZml4ID0gJyVzWyVzXS4nICUgKG5ld19wcmVmaXgsIGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIHN1Yi1zdHJ1Y3RzIGluIHRoaXMgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAodG1wX2RlY2wsIHRtcF9wcmUsIHRtcF9wb3N0KSA9IHNlbGYudW5pcXVpZnlfbWVtYmVycyhzdHJ1Y3RfaW5mbywgaW5kZW50LCBsb2NhbF9wcmVmaXgsIGFycmF5X2luZGV4LCBjcmVhdGVfZnVuYywgZGVzdHJveV9mdW5jLCBkZXN0cm95X2FycmF5LCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xzICs9IHRtcF9kZWNsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSB0bXBfcHJlCisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X2NvZGUgKz0gdG1wX3Bvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuZGVjSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZV9jb2RlICs9ICclcyAgICB9XG4nICUgaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmRlY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXMgICAgfVxuJyAlIGluZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RfbGV2ZWxfcGFyYW0gPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X2NvZGUgKz0gc2VsZi5jbGVhblVwTG9jYWxEZWNsYXJhdGlvbnMoaW5kZW50LCBwcmVmaXgsIG1lbWJlci5uYW1lLCBtZW1iZXIubGVuLCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgIyBTaW5nbGUgU3RydWN0CisgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNwb2ludGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBVcGRhdGUgc3RydWN0IHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RfbGV2ZWxfcGFyYW0gPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcHJlZml4ID0gJ2xvY2FsXyVzLT4nICUgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNscyArPSAnJXNzYWZlXyVzIHZhcl9sb2NhbF8lcyVzO1xuJyAlIChpbmRlbnQsIG1lbWJlci50eXBlLCBwcmVmaXgsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xzICs9ICclc3NhZmVfJXMgKmxvY2FsXyVzJXMgPSBOVUxMO1xuJyAlIChpbmRlbnQsIG1lbWJlci50eXBlLCBwcmVmaXgsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcHJlZml4ID0gJyVzJXMtPicgJSAocHJlZml4LCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRGVjbGFyZSBzYWZlX1ZhclR5cGUgZm9yIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gJyVzICAgIGlmICglcyVzKSB7XG4nICUgKGluZGVudCwgcHJlZml4LCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5jSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpcnN0X2xldmVsX3BhcmFtID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gJyVzICAgIGxvY2FsXyVzJXMgPSAmdmFyX2xvY2FsXyVzJXM7XG4nICUgKGluZGVudCwgcHJlZml4LCBtZW1iZXIubmFtZSwgcHJlZml4LCBtZW1iZXIubmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gJyVzICAgIGxvY2FsXyVzJXMtPmluaXRpYWxpemUoJXMpO1xuJyAlIChpbmRlbnQsIHByZWZpeCwgbWVtYmVyLm5hbWUsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIHN1Yi1zdHJ1Y3RzIGluIHRoaXMgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAodG1wX2RlY2wsIHRtcF9wcmUsIHRtcF9wb3N0KSA9IHNlbGYudW5pcXVpZnlfbWVtYmVycyhzdHJ1Y3RfaW5mbywgaW5kZW50LCBuZXdfcHJlZml4LCBhcnJheV9pbmRleCwgY3JlYXRlX2Z1bmMsIGRlc3Ryb3lfZnVuYywgZGVzdHJveV9hcnJheSwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNscyArPSB0bXBfZGVjbAorICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gdG1wX3ByZQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9jb2RlICs9IHRtcF9wb3N0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcm9jZXNzX3BuZXh0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9jb2RlICs9ICclcyAgICBXcmFwUG5leHRDaGFpbkhhbmRsZXMobGF5ZXJfZGF0YSwgbG9jYWxfJXMlcy0+cE5leHQpO1xuJyAlIChpbmRlbnQsIHByZWZpeCwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmRlY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXMgICAgfVxuJyAlIGluZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RfbGV2ZWxfcGFyYW0gPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X2NvZGUgKz0gc2VsZi5jbGVhblVwTG9jYWxEZWNsYXJhdGlvbnMoaW5kZW50LCBwcmVmaXgsIG1lbWJlci5uYW1lLCBtZW1iZXIubGVuLCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVXBkYXRlIHN0cnVjdCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpcnN0X2xldmVsX3BhcmFtID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3ByZWZpeCA9ICclcyVzLicgJSAocHJlZml4LCBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgUHJvY2VzcyBzdWItc3RydWN0cyBpbiB0aGlzIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgKHRtcF9kZWNsLCB0bXBfcHJlLCB0bXBfcG9zdCkgPSBzZWxmLnVuaXF1aWZ5X21lbWJlcnMoc3RydWN0X2luZm8sIGluZGVudCwgbmV3X3ByZWZpeCwgYXJyYXlfaW5kZXgsIGNyZWF0ZV9mdW5jLCBkZXN0cm95X2Z1bmMsIGRlc3Ryb3lfYXJyYXksIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHMgKz0gdG1wX2RlY2wKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZV9jb2RlICs9IHRtcF9wcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfY29kZSArPSB0bXBfcG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJvY2Vzc19wbmV4dDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXMgICAgV3JhcFBuZXh0Q2hhaW5IYW5kbGVzKGxheWVyX2RhdGEsIGxvY2FsXyVzJXMucE5leHQpO1xuJyAlIChpbmRlbnQsIHByZWZpeCwgbWVtYmVyLm5hbWUpCisgICAgICAgIHJldHVybiBkZWNscywgcHJlX2NvZGUsIHBvc3RfY29kZQorICAgICMKKyAgICAjIEZvciBhIHBhcnRpY3VsYXIgQVBJLCBnZW5lcmF0ZSB0aGUgbm9uLWRpc3BhdGNoYWJsZS1vYmplY3Qgd3JhcHBpbmcvdW53cmFwcGluZyBjb2RlCisgICAgZGVmIGdlbmVyYXRlX3dyYXBwaW5nX2NvZGUoc2VsZiwgY21kKToKKyAgICAgICAgaW5kZW50ID0gJyAgICAnCisgICAgICAgIHByb3RvID0gY21kLmZpbmQoJ3Byb3RvL25hbWUnKQorICAgICAgICBwYXJhbXMgPSBjbWQuZmluZGFsbCgncGFyYW0nKQorCisgICAgICAgIGlmIHByb3RvLnRleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjbWRfbWVtYmVyX2RpY3QgPSBkaWN0KHNlbGYuY21kTWVtYmVycykKKyAgICAgICAgICAgIGNtZF9pbmZvID0gY21kX21lbWJlcl9kaWN0W3Byb3RvLnRleHRdCisgICAgICAgICAgICAjIEhhbmRsZSBuZG8gY3JlYXRlL2FsbG9jYXRlIG9wZXJhdGlvbnMKKyAgICAgICAgICAgIGlmIGNtZF9pbmZvWzBdLmlzY3JlYXRlOgorICAgICAgICAgICAgICAgIGNyZWF0ZV9uZG9fY29kZSA9IHNlbGYuZ2VuZXJhdGVfY3JlYXRlX25kb19jb2RlKGluZGVudCwgcHJvdG8sIHBhcmFtcywgY21kX2luZm8pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNyZWF0ZV9uZG9fY29kZSA9ICcnCisgICAgICAgICAgICAjIEhhbmRsZSBuZG8gZGVzdHJveS9mcmVlIG9wZXJhdGlvbnMKKyAgICAgICAgICAgIGlmIGNtZF9pbmZvWzBdLmlzZGVzdHJveToKKyAgICAgICAgICAgICAgICAoZGVzdHJveV9hcnJheSwgZGVzdHJveV9uZG9fY29kZSkgPSBzZWxmLmdlbmVyYXRlX2Rlc3Ryb3lfbmRvX2NvZGUoaW5kZW50LCBwcm90bywgY21kX2luZm8pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlc3Ryb3lfYXJyYXkgPSBGYWxzZQorICAgICAgICAgICAgICAgIGRlc3Ryb3lfbmRvX2NvZGUgPSAnJworICAgICAgICAgICAgcGFyYW1kZWNsID0gJycKKyAgICAgICAgICAgIHBhcmFtX3ByZV9jb2RlID0gJycKKyAgICAgICAgICAgIHBhcmFtX3Bvc3RfY29kZSA9ICcnCisgICAgICAgICAgICBjcmVhdGVfZnVuYyA9IFRydWUgaWYgY3JlYXRlX25kb19jb2RlIGVsc2UgRmFsc2UKKyAgICAgICAgICAgIGRlc3Ryb3lfZnVuYyA9IFRydWUgaWYgZGVzdHJveV9uZG9fY29kZSBlbHNlIEZhbHNlCisgICAgICAgICAgICAocGFyYW1kZWNsLCBwYXJhbV9wcmVfY29kZSwgcGFyYW1fcG9zdF9jb2RlKSA9IHNlbGYudW5pcXVpZnlfbWVtYmVycyhjbWRfaW5mbywgaW5kZW50LCAnJywgMCwgY3JlYXRlX2Z1bmMsIGRlc3Ryb3lfZnVuYywgZGVzdHJveV9hcnJheSwgVHJ1ZSkKKyAgICAgICAgICAgIHBhcmFtX3Bvc3RfY29kZSArPSBjcmVhdGVfbmRvX2NvZGUKKyAgICAgICAgICAgIGlmIGRlc3Ryb3lfbmRvX2NvZGU6CisgICAgICAgICAgICAgICAgaWYgZGVzdHJveV9hcnJheSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBwYXJhbV9wb3N0X2NvZGUgKz0gZGVzdHJveV9uZG9fY29kZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ByZV9jb2RlICs9IGRlc3Ryb3lfbmRvX2NvZGUKKyAgICAgICAgICAgIGlmIHBhcmFtX3ByZV9jb2RlOgorICAgICAgICAgICAgICAgIGlmIChub3QgZGVzdHJveV9mdW5jKSBvciAoZGVzdHJveV9hcnJheSk6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ByZV9jb2RlID0gJyVze1xuJXMlc31cbicgJSAoJyAgICAnLCBwYXJhbV9wcmVfY29kZSwgaW5kZW50KQorICAgICAgICByZXR1cm4gcGFyYW1kZWNsLCBwYXJhbV9wcmVfY29kZSwgcGFyYW1fcG9zdF9jb2RlCisgICAgIworICAgICMgQ2FwdHVyZSBjb21tYW5kIHBhcmFtZXRlciBpbmZvIG5lZWRlZCB0byB3cmFwIE5ET3MgYXMgd2VsbCBhcyBoYW5kbGluZyBzb21lIGJvaWxlcnBsYXRlIGNvZGUKKyAgICBkZWYgZ2VuQ21kKHNlbGYsIGNtZGluZm8sIGNtZG5hbWUsIGFsaWFzKToKKworICAgICAgICAjIEFkZCBzdHJ1Y3QtbWVtYmVyIHR5cGUgaW5mb3JtYXRpb24gdG8gY29tbWFuZCBwYXJhbWV0ZXIgaW5mb3JtYXRpb24KKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlbkNtZChzZWxmLCBjbWRpbmZvLCBjbWRuYW1lLCBhbGlhcykKKyAgICAgICAgbWVtYmVycyA9IGNtZGluZm8uZWxlbS5maW5kYWxsKCcuLy9wYXJhbScpCisgICAgICAgICMgSXRlcmF0ZSBvdmVyIG1lbWJlcnMgb25jZSB0byBnZXQgbGVuZ3RoIHBhcmFtZXRlcnMgZm9yIGFycmF5cworICAgICAgICBsZW5zID0gc2V0KCkKKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgbGVuID0gc2VsZi5nZXRMZW4obWVtYmVyKQorICAgICAgICAgICAgaWYgbGVuOgorICAgICAgICAgICAgICAgIGxlbnMuYWRkKGxlbikKKyAgICAgICAgc3RydWN0X21lbWJlcl9kaWN0ID0gZGljdChzZWxmLnN0cnVjdE1lbWJlcnMpCisgICAgICAgICMgR2VuZXJhdGUgbWVtYmVyIGluZm8KKyAgICAgICAgbWVtYmVyc0luZm8gPSBbXQorICAgICAgICBmb3IgbWVtYmVyIGluIG1lbWJlcnM6CisgICAgICAgICAgICAjIEdldCB0eXBlIGFuZCBuYW1lIG9mIG1lbWJlcgorICAgICAgICAgICAgaW5mbyA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShtZW1iZXIpCisgICAgICAgICAgICB0eXBlID0gaW5mb1swXQorICAgICAgICAgICAgbmFtZSA9IGluZm9bMV0KKyAgICAgICAgICAgIGNkZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbChtZW1iZXIsIDApCisgICAgICAgICAgICAjIENoZWNrIGZvciBwYXJhbWV0ZXIgbmFtZSBpbiBsZW5zIHNldAorICAgICAgICAgICAgaXNjb3VudCA9IFRydWUgaWYgbmFtZSBpbiBsZW5zIGVsc2UgRmFsc2UKKyAgICAgICAgICAgIGxlbiA9IHNlbGYuZ2V0TGVuKG1lbWJlcikKKyAgICAgICAgICAgIGlzY29uc3QgPSBUcnVlIGlmICdjb25zdCcgaW4gY2RlY2wgZWxzZSBGYWxzZQorICAgICAgICAgICAgaXNwb2ludGVyID0gc2VsZi5wYXJhbUlzUG9pbnRlcihtZW1iZXIpCisgICAgICAgICAgICAjIE1hcmsgcGFyYW0gYXMgbG9jYWwgaWYgaXQgaXMgYW4gYXJyYXkgb2YgTkRPcworICAgICAgICAgICAgaXNsb2NhbCA9IEZhbHNlOworICAgICAgICAgICAgaWYgc2VsZi5oYW5kbGVfdHlwZXMuSXNOb25EaXNwYXRjaGFibGUodHlwZSk6CisgICAgICAgICAgICAgICAgaWYgKGxlbiBpcyBub3QgTm9uZSkgYW5kIChpc2NvbnN0ID09IFRydWUpOgorICAgICAgICAgICAgICAgICAgICBpc2xvY2FsID0gVHJ1ZQorICAgICAgICAgICAgIyBPciBpZiBpdCdzIGEgc3RydWN0IHRoYXQgY29udGFpbnMgYW4gTkRPCisgICAgICAgICAgICBlbGlmIHR5cGUgaW4gc3RydWN0X21lbWJlcl9kaWN0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RydWN0X2NvbnRhaW5zX25kbyh0eXBlKSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBpc2xvY2FsID0gVHJ1ZQorICAgICAgICAgICAgaXNkZXN0cm95ID0gVHJ1ZSBpZiBUcnVlIGluIFtkZXN0cm95X3R4dCBpbiBjbWRuYW1lIGZvciBkZXN0cm95X3R4dCBpbiBbJ0Rlc3Ryb3knLCAnRnJlZSddXSBlbHNlIEZhbHNlCisgICAgICAgICAgICBpc2NyZWF0ZSA9IFRydWUgaWYgVHJ1ZSBpbiBbY3JlYXRlX3R4dCBpbiBjbWRuYW1lIGZvciBjcmVhdGVfdHh0IGluIFsnQ3JlYXRlJywgJ0FsbG9jYXRlJywgJ0dldFJhbmRST3V0cHV0RGlzcGxheUVYVCcsICdSZWdpc3RlckRldmljZUV2ZW50JywgJ1JlZ2lzdGVyRGlzcGxheUV2ZW50J11dIGVsc2UgRmFsc2UKKyAgICAgICAgICAgIGV4dHN0cnVjdHMgPSBzZWxmLnJlZ2lzdHJ5LnZhbGlkZXh0ZW5zaW9uc3RydWN0c1t0eXBlXSBpZiBuYW1lID09ICdwTmV4dCcgZWxzZSBOb25lCisgICAgICAgICAgICBtZW1iZXJzSW5mby5hcHBlbmQoc2VsZi5Db21tYW5kUGFyYW0odHlwZT10eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3BvaW50ZXI9aXNwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY29uc3Q9aXNjb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2NvdW50PWlzY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuPWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRzdHJ1Y3RzPWV4dHN0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9Y2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNsb2NhbD1pc2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY3JlYXRlPWlzY3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZGVzdHJveT1pc2Rlc3Ryb3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9wcm90ZWN0PXNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCkpCisgICAgICAgIHNlbGYuY21kTWVtYmVycy5hcHBlbmQoc2VsZi5DbWRNZW1iZXJEYXRhKG5hbWU9Y21kbmFtZSwgbWVtYmVycz1tZW1iZXJzSW5mbykpCisgICAgICAgIHNlbGYuY21kX2luZm9fZGF0YS5hcHBlbmQoc2VsZi5DbWRJbmZvRGF0YShuYW1lPWNtZG5hbWUsIGNtZGluZm89Y21kaW5mbykpCisgICAgICAgIHNlbGYuY21kX2ZlYXR1cmVfcHJvdGVjdC5hcHBlbmQoc2VsZi5DbWRFeHRyYVByb3RlY3QobmFtZT1jbWRuYW1lLCBleHRyYV9wcm90ZWN0PXNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCkpCisgICAgIworICAgICMgQ3JlYXRlIHByb3RvdHlwZSBmb3IgZGlzcGF0Y2ggaGVhZGVyIGZpbGUKKyAgICBkZWYgR2VuRGlzcGF0Y2hGdW5jdGlvblByb3RvdHlwZShzZWxmLCBjbWRpbmZvLCBpZmRlZl90ZXh0KToKKyAgICAgICAgZGVjbHMgPSBzZWxmLm1ha2VDRGVjbHMoY21kaW5mby5lbGVtKQorICAgICAgICBmdW5jX3NpZyA9IGRlY2xzWzBdWzotMV0KKyAgICAgICAgZnVuY19zaWcgPSBmdW5jX3NpZy5yZXBsYWNlKCJWS0FQSV9BVFRSICIsICIiKQorICAgICAgICBmdW5jX3NpZyA9IGZ1bmNfc2lnLnJlcGxhY2UoIlZLQVBJX0NBTEwgIiwgIkRpc3BhdGNoIikKKyAgICAgICAgZnVuY19zaWcgKz0gJzsnCisgICAgICAgIGRpc3BhdGNoX3Byb3RvdHlwZSA9ICcnCisgICAgICAgIGlmIGlmZGVmX3RleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkaXNwYXRjaF9wcm90b3R5cGUgPSAnI2lmZGVmICVzXG4nICUgaWZkZWZfdGV4dAorICAgICAgICBkaXNwYXRjaF9wcm90b3R5cGUgKz0gZnVuY19zaWcKKyAgICAgICAgaWYgaWZkZWZfdGV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRpc3BhdGNoX3Byb3RvdHlwZSArPSAnXG4jZW5kaWYgLy8gJXMnICUgaWZkZWZfdGV4dAorICAgICAgICByZXR1cm4gZGlzcGF0Y2hfcHJvdG90eXBlCisgICAgIworICAgICMgQ3JlYXRlIGNvZGUgdG8gd3JhcCBORE9zIGFzIHdlbGwgYXMgaGFuZGxpbmcgc29tZSBib2lsZXJwbGF0ZSBjb2RlCisgICAgZGVmIFdyYXBDb21tYW5kcyhzZWxmKToKKyAgICAgICAgY21kX21lbWJlcl9kaWN0ID0gZGljdChzZWxmLmNtZE1lbWJlcnMpCisgICAgICAgIGNtZF9pbmZvX2RpY3QgPSBkaWN0KHNlbGYuY21kX2luZm9fZGF0YSkKKyAgICAgICAgY21kX3Byb3RlY3RfZGljdCA9IGRpY3Qoc2VsZi5jbWRfZmVhdHVyZV9wcm90ZWN0KQorCisgICAgICAgIGZvciBhcGlfY2FsbCBpbiBzZWxmLmNtZE1lbWJlcnM6CisgICAgICAgICAgICBjbWRuYW1lID0gYXBpX2NhbGwubmFtZQorICAgICAgICAgICAgY21kaW5mbyA9IGNtZF9pbmZvX2RpY3RbYXBpX2NhbGwubmFtZV0KKyAgICAgICAgICAgIGZlYXR1cmVfZXh0cmFfcHJvdGVjdCA9IGNtZF9wcm90ZWN0X2RpY3RbYXBpX2NhbGwubmFtZV0KKworICAgICAgICAgICAgIyBBZGQgZnVjdGlvbiBwcm90b3R5cGUgdG8gaGVhZGVyIGRhdGEKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignaGVhZGVyX2ZpbGUnLCBzZWxmLkdlbkRpc3BhdGNoRnVuY3Rpb25Qcm90b3R5cGUoY21kaW5mbywgZmVhdHVyZV9leHRyYV9wcm90ZWN0KSkKKworICAgICAgICAgICAgaWYgY21kbmFtZSBpbiBzZWxmLm5vX2F1dG9nZW5fbGlzdDoKKyAgICAgICAgICAgICAgICBkZWNscyA9IHNlbGYubWFrZUNEZWNscyhjbWRpbmZvLmVsZW0pCisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdzb3VyY2VfZmlsZScsICcnKQorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc291cmNlX2ZpbGUnLCAnLy8gU2tpcCAlcyBkaXNwYXRjaCwgbWFudWFsbHkgZ2VuZXJhdGVkJyAlIGNtZG5hbWUpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBHZW5lcmF0ZSBORE8gd3JhcHBpbmcvdW53cmFwcGluZyBjb2RlIGZvciBhbGwgcGFyYW1ldGVycworICAgICAgICAgICAgKGFwaV9kZWNscywgYXBpX3ByZSwgYXBpX3Bvc3QpID0gc2VsZi5nZW5lcmF0ZV93cmFwcGluZ19jb2RlKGNtZGluZm8uZWxlbSkKKyAgICAgICAgICAgICMgSWYgQVBJIGRvZXNuJ3QgY29udGFpbiBORE8ncywgd2Ugc3RpbGwgbmVlZCB0byBtYWtlIGEgZG93bi1jaGFpbiBjYWxsCisgICAgICAgICAgICBkb3duX2NoYWluX2NhbGxfb25seSA9IEZhbHNlCisgICAgICAgICAgICBpZiBub3QgYXBpX2RlY2xzIGFuZCBub3QgYXBpX3ByZSBhbmQgbm90IGFwaV9wb3N0OgorICAgICAgICAgICAgICAgIGRvd25fY2hhaW5fY2FsbF9vbmx5ID0gVHJ1ZQorICAgICAgICAgICAgaWYgKGZlYXR1cmVfZXh0cmFfcHJvdGVjdCBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdzb3VyY2VfZmlsZScsICcnKQorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc291cmNlX2ZpbGUnLCAnI2lmZGVmICcgKyBmZWF0dXJlX2V4dHJhX3Byb3RlY3QpCisKKyAgICAgICAgICAgIGRlY2xzID0gc2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSkKKyAgICAgICAgICAgIGZ1bmNfc2lnID0gZGVjbHNbMF1bOi0xXQorICAgICAgICAgICAgZnVuY19zaWcgPSBmdW5jX3NpZy5yZXBsYWNlKCJWS0FQSV9BVFRSICIsICIiKQorICAgICAgICAgICAgZnVuY19zaWcgPSBmdW5jX3NpZy5yZXBsYWNlKCJWS0FQSV9DQUxMICIsICJEaXNwYXRjaCIpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ3NvdXJjZV9maWxlJywgJycpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ3NvdXJjZV9maWxlJywgZnVuY19zaWcpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ3NvdXJjZV9maWxlJywgJ3snKQorICAgICAgICAgICAgIyBTZXR1cCBjb21tb24gdG8gY2FsbCB3cmFwcGVycywgZmlyc3QgcGFyYW1ldGVyIGlzIGFsd2F5cyBkaXNwYXRjaGFibGUKKyAgICAgICAgICAgIGRpc3BhdGNoYWJsZV90eXBlID0gY21kaW5mby5lbGVtLmZpbmQoJ3BhcmFtL3R5cGUnKS50ZXh0CisgICAgICAgICAgICBkaXNwYXRjaGFibGVfbmFtZSA9IGNtZGluZm8uZWxlbS5maW5kKCdwYXJhbS9uYW1lJykudGV4dAorCisgICAgICAgICAgICAjIEdhdGhlciB0aGUgcGFyYW1ldGVyIGl0ZW1zCisgICAgICAgICAgICBwYXJhbXMgPSBjbWRpbmZvLmVsZW0uZmluZGFsbCgncGFyYW0vbmFtZScpCisgICAgICAgICAgICAjIFB1bGwgb3V0IHRoZSB0ZXh0IGZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXJzLCBzZXBhcmF0ZSB0aGVtIGJ5IGNvbW1hcyBpbiBhIGxpc3QKKyAgICAgICAgICAgIHBhcmFtc3RleHQgPSAnLCAnLmpvaW4oW3N0cihwYXJhbS50ZXh0KSBmb3IgcGFyYW0gaW4gcGFyYW1zXSkKKyAgICAgICAgICAgIHdyYXBwZWRfcGFyYW1zdGV4dCA9IHBhcmFtc3RleHQKKyAgICAgICAgICAgICMgSWYgYW55IG9mIHRoZXNlIHBhcmFtdGVycyBoYXMgYmVlbiByZXBsYWNlZCBieSBhIGxvY2FsIHZhciwgZml4IHVwIHRoZSBsaXN0CisgICAgICAgICAgICBwYXJhbXMgPSBjbWRfbWVtYmVyX2RpY3RbY21kbmFtZV0KKyAgICAgICAgICAgIGZvciBwYXJhbSBpbiBwYXJhbXM6CisgICAgICAgICAgICAgICAgaWYgcGFyYW0uaXNsb2NhbCA9PSBUcnVlIG9yIHNlbGYuU3RydWN0V2l0aEV4dGVuc2lvbnMocGFyYW0udHlwZSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHBhcmFtLmlzcG9pbnRlciA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZF9wYXJhbXN0ZXh0ID0gd3JhcHBlZF9wYXJhbXN0ZXh0LnJlcGxhY2UocGFyYW0ubmFtZSwgJyglcyAlcyopbG9jYWxfJXMnICUgKCdjb25zdCcsIHBhcmFtLnR5cGUsIHBhcmFtLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZF9wYXJhbXN0ZXh0ID0gd3JhcHBlZF9wYXJhbXN0ZXh0LnJlcGxhY2UocGFyYW0ubmFtZSwgJyglcyAlcylsb2NhbF8lcycgJSAoJ2NvbnN0JywgcGFyYW0udHlwZSwgcGFyYW0ubmFtZSkpCisKKyAgICAgICAgICAgICMgRmlyc3QsIGFkZCBjaGVjayBhbmQgZG93bi1jaGFpbiBjYWxsLiBVc2UgY29ycmVjdCBkaXNwYXRjaCB0YWJsZQorICAgICAgICAgICAgZGlzcGF0Y2hfdGFibGVfdHlwZSA9ICJkZXZpY2VfZGlzcGF0Y2hfdGFibGUiCisgICAgICAgICAgICBpZiBkaXNwYXRjaGFibGVfdHlwZSBpbiBbIlZrUGh5c2ljYWxEZXZpY2UiLCAiVmtJbnN0YW5jZSJdOgorICAgICAgICAgICAgICAgIGRpc3BhdGNoX3RhYmxlX3R5cGUgPSAiaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUiCisKKyAgICAgICAgICAgIGFwaV9mdW5jID0gY21kaW5mby5lbGVtLmF0dHJpYi5nZXQoJ25hbWUnKS5yZXBsYWNlKCd2aycsJ2xheWVyX2RhdGEtPiVzLicsMSkgJSBkaXNwYXRjaF90YWJsZV90eXBlCisgICAgICAgICAgICAjIENhbGwgdG8gZ2V0IHRoZSBsYXllcl9kYXRhIHBvaW50ZXIKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc291cmNlX2ZpbGUnLCAnICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KCVzKSwgbGF5ZXJfZGF0YV9tYXApOycgJSBkaXNwYXRjaGFibGVfbmFtZSkKKyAgICAgICAgICAgICMgUHV0IGFsbCB0aGlzIHRvZ2V0aGVyIGZvciB0aGUgZmluYWwgZG93bi1jaGFpbiBjYWxsCisgICAgICAgICAgICBpZiBub3QgZG93bl9jaGFpbl9jYWxsX29ubHk6CisgICAgICAgICAgICAgICAgdW53cmFwcGVkX2Rpc3BhdGNoX2NhbGwgPSBhcGlfZnVuYyArICcoJyArIHBhcmFtc3RleHQgKyAnKScKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ3NvdXJjZV9maWxlJywgJyAgICBpZiAoIXdyYXBfaGFuZGxlcykgcmV0dXJuICVzOycgJSB1bndyYXBwZWRfZGlzcGF0Y2hfY2FsbCkKKworICAgICAgICAgICAgIyBIYW5kbGUgcmV0dXJuIHZhbHVlcywgaWYgYW55CisgICAgICAgICAgICByZXN1bHR0eXBlID0gY21kaW5mby5lbGVtLmZpbmQoJ3Byb3RvL3R5cGUnKQorICAgICAgICAgICAgaWYgKHJlc3VsdHR5cGUgaXMgbm90IE5vbmUgYW5kIHJlc3VsdHR5cGUudGV4dCA9PSAndm9pZCcpOgorICAgICAgICAgICAgICByZXN1bHR0eXBlID0gTm9uZQorICAgICAgICAgICAgaWYgKHJlc3VsdHR5cGUgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgICAgIGFzc2lnbnJlc3VsdCA9IHJlc3VsdHR5cGUudGV4dCArICcgcmVzdWx0ID0gJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NpZ25yZXN1bHQgPSAnJworICAgICAgICAgICAgIyBQcmUtcGVuZCBkZWNsYXJhdGlvbnMgYW5kIHByZS1hcGktY2FsbCBjb2RlZ2VuCisgICAgICAgICAgICBpZiBhcGlfZGVjbHM6CisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdzb3VyY2VfZmlsZScsICJcbiIuam9pbihzdHIoYXBpX2RlY2xzKS5yc3RyaXAoKS5zcGxpdCgiXG4iKSkpCisgICAgICAgICAgICBpZiBhcGlfcHJlOgorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc291cmNlX2ZpbGUnLCAiXG4iLmpvaW4oc3RyKGFwaV9wcmUpLnJzdHJpcCgpLnNwbGl0KCJcbiIpKSkKKyAgICAgICAgICAgICMgR2VuZXJhdGUgdGhlIHdyYXBwZWQgZGlzcGF0Y2ggY2FsbCAKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc291cmNlX2ZpbGUnLCAnICAgICcgKyBhc3NpZ25yZXN1bHQgKyBhcGlfZnVuYyArICcoJyArIHdyYXBwZWRfcGFyYW1zdGV4dCArICcpOycpCisKKyAgICAgICAgICAgICMgQW5kIGFkZCB0aGUgcG9zdC1BUEktY2FsbCBjb2RlZ2VuCisgICAgICAgICAgICBpZiAoJ0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzJyBpbiBjbWRuYW1lKSBvciAoJ0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMnIGluIGNtZG5hbWUpIG9yICgnQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lcycgaW4gY21kbmFtZSk6CisgICAgICAgICAgICAgICAgY29weV9mZWVkYmFja19zb3VyY2UgID0gJyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3JlYXRlSW5mb0NvdW50OyArK2kpIHtcbicKKyAgICAgICAgICAgICAgICBjb3B5X2ZlZWRiYWNrX3NvdXJjZSArPSAnICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnBOZXh0ICE9IFZLX05VTExfSEFORExFKSB7XG4nCisgICAgICAgICAgICAgICAgY29weV9mZWVkYmFja19zb3VyY2UgKz0gJyAgICAgICAgICAgIENvcHlDcmVhdGVQaXBlbGluZUZlZWRiYWNrRGF0YShsb2NhbF9wQ3JlYXRlSW5mb3NbaV0ucE5leHQsIHBDcmVhdGVJbmZvc1tpXS5wTmV4dCk7XG4nCisgICAgICAgICAgICAgICAgY29weV9mZWVkYmFja19zb3VyY2UgKz0gJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgIGNvcHlfZmVlZGJhY2tfc291cmNlICs9ICcgICAgfVxuJworICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc291cmNlX2ZpbGUnLCBjb3B5X2ZlZWRiYWNrX3NvdXJjZSkKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc291cmNlX2ZpbGUnLCAiXG4iLmpvaW4oc3RyKGFwaV9wb3N0KS5yc3RyaXAoKS5zcGxpdCgiXG4iKSkpCisgICAgICAgICAgICAjIEhhbmRsZSB0aGUgcmV0dXJuIHJlc3VsdCB2YXJpYWJsZSwgaWYgYW55CisgICAgICAgICAgICBpZiAocmVzdWx0dHlwZSBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdzb3VyY2VfZmlsZScsICcgICAgcmV0dXJuIHJlc3VsdDsnKQorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdzb3VyY2VfZmlsZScsICd9JykKKyAgICAgICAgICAgIGlmIChmZWF0dXJlX2V4dHJhX3Byb3RlY3QgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignc291cmNlX2ZpbGUnLCAnI2VuZGlmIC8vICcrIGZlYXR1cmVfZXh0cmFfcHJvdGVjdCkKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9sYXllcl9jaGFzc2lzX2dlbmVyYXRvci5weSBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbGF5ZXJfY2hhc3Npc19nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2MmYyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbGF5ZXJfY2hhc3Npc19nZW5lcmF0b3IucHkKQEAgLTAsMCArMSwxNzY4IEBACisjIS91c3IvYmluL3B5dGhvbjMgLWkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyMKKyMgVGhpcyBzY3JpcHQgZ2VuZXJhdGVzIHRoZSBkaXNwYXRjaCBwb3J0aW9uIG9mIGEgZmFjdG9yeSBsYXllciB3aGljaCBpbnRlcmNlcHRzCisjIGFsbCBWdWxrYW4gIGZ1bmN0aW9ucy4gVGhlIHJlc3VsdGFudCBmYWN0b3J5IGxheWVyIGFsbG93cyByYXBpZCBkZXZlbG9wbWVudCBvZgorIyBsYXllcnMgYW5kIGludGVyY2VwdG9ycy4KKworaW1wb3J0IG9zLHJlLHN5cworZnJvbSBnZW5lcmF0b3IgaW1wb3J0ICoKK2Zyb20gY29tbW9uX2NvZGVnZW4gaW1wb3J0ICoKKworIyBMYXllckZhY3RvcnlHZW5lcmF0b3JPcHRpb25zIC0gc3ViY2xhc3Mgb2YgR2VuZXJhdG9yT3B0aW9ucy4KKyMKKyMgQWRkcyBvcHRpb25zIHVzZWQgYnkgTGF5ZXJGYWN0b3J5T3V0cHV0R2VuZXJhdG9yIG9iamVjdHMgZHVyaW5nIGZhY3RvcnkKKyMgbGF5ZXIgZ2VuZXJhdGlvbi4KKyMKKyMgQWRkaXRpb25hbCBtZW1iZXJzCisjICAgcHJlZml4VGV4dCAtIGxpc3Qgb2Ygc3RyaW5ncyB0byBwcmVmaXggZ2VuZXJhdGVkIGhlYWRlciB3aXRoCisjICAgICAodXN1YWxseSBhIGNvcHlyaWdodCBzdGF0ZW1lbnQgKyBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm9zKS4KKyMgICBwcm90ZWN0RmlsZSAtIFRydWUgaWYgbXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gc2hvdWxkIGJlCisjICAgICBnZW5lcmF0ZWQgKGJhc2VkIG9uIHRoZSBmaWxlbmFtZSkgYXJvdW5kIHRoZSBlbnRpcmUgaGVhZGVyLgorIyAgIHByb3RlY3RGZWF0dXJlIC0gVHJ1ZSBpZiAjaWZuZGVmLi4jZW5kaWYgcHJvdGVjdGlvbiBzaG91bGQgYmUKKyMgICAgIGdlbmVyYXRlZCBhcm91bmQgYSBmZWF0dXJlIGludGVyZmFjZSBpbiB0aGUgaGVhZGVyIGZpbGUuCisjICAgZ2VuRnVuY1BvaW50ZXJzIC0gVHJ1ZSBpZiBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzIHNob3VsZCBiZQorIyAgICAgZ2VuZXJhdGVkCisjICAgcHJvdGVjdFByb3RvIC0gSWYgY29uZGl0aW9uYWwgcHJvdGVjdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkCisjICAgICBhcm91bmQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgc2V0IHRvIGVpdGhlciAnI2lmZGVmJworIyAgICAgdG8gcmVxdWlyZSBvcHQtaW4gKCNpZmRlZiBwcm90ZWN0UHJvdG9TdHIpIG9yICcjaWZuZGVmJworIyAgICAgdG8gcmVxdWlyZSBvcHQtb3V0ICgjaWZuZGVmIHByb3RlY3RQcm90b1N0cikuIE90aGVyd2lzZQorIyAgICAgc2V0IHRvIE5vbmUuCisjICAgcHJvdGVjdFByb3RvU3RyIC0gI2lmZGVmLyNpZm5kZWYgc3ltYm9sIHRvIHVzZSBhcm91bmQgcHJvdG90eXBlCisjICAgICBkZWNsYXJhdGlvbnMsIGlmIHByb3RlY3RQcm90byBpcyBzZXQKKyMgICBhcGljYWxsIC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHByZWZpeCwKKyMgICAgIHN1Y2ggYXMgQVBJQ0FMTCBvbiBXaW5kb3dzLgorIyAgIGFwaWVudHJ5IC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGNhbGxpbmcgY29udmVudGlvbiBtYWNybywKKyMgICAgIGluIHR5cGVkZWZzLCBzdWNoIGFzIEFQSUVOVFJZLgorIyAgIGFwaWVudHJ5cCAtIHN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8KKyMgICAgIGluIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMsIHN1Y2ggYXMgQVBJRU5UUllQLgorIyAgIGluZGVudEZ1bmNQcm90byAtIFRydWUgaWYgcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBzaG91bGQgcHV0IGVhY2gKKyMgICAgIHBhcmFtZXRlciBvbiBhIHNlcGFyYXRlIGxpbmUKKyMgICBpbmRlbnRGdW5jUG9pbnRlciAtIFRydWUgaWYgdHlwZWRlZmVkIGZ1bmN0aW9uIHBvaW50ZXJzIHNob3VsZCBwdXQgZWFjaAorIyAgICAgcGFyYW1ldGVyIG9uIGEgc2VwYXJhdGUgbGluZQorIyAgIGFsaWduRnVuY1BhcmFtIC0gaWYgbm9uemVybyBhbmQgcGFyYW1ldGVycyBhcmUgYmVpbmcgcHV0IG9uIGEKKyMgICAgIHNlcGFyYXRlIGxpbmUsIGFsaWduIHBhcmFtZXRlciBuYW1lcyBhdCB0aGUgc3BlY2lmaWVkIGNvbHVtbgorY2xhc3MgTGF5ZXJDaGFzc2lzR2VuZXJhdG9yT3B0aW9ucyhHZW5lcmF0b3JPcHRpb25zKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgY29udmVudGlvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9ICcuJywKKyAgICAgICAgICAgICAgICAgYXBpbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBOb25lLAorICAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHNvcnRQcm9jZWR1cmUgPSByZWdTb3J0RmVhdHVyZXMsCisgICAgICAgICAgICAgICAgIHByZWZpeFRleHQgPSAiIiwKKyAgICAgICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdEZpbGUgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0RmVhdHVyZSA9IFRydWUsCisgICAgICAgICAgICAgICAgIGFwaWNhbGwgPSAnJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnkgPSAnJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnlwID0gJycsCisgICAgICAgICAgICAgICAgIGluZGVudEZ1bmNQcm90byA9IFRydWUsCisgICAgICAgICAgICAgICAgIGluZGVudEZ1bmNQb2ludGVyID0gRmFsc2UsCisgICAgICAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICAgaGVscGVyX2ZpbGVfdHlwZSA9ICcnLAorICAgICAgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gVHJ1ZSk6CisgICAgICAgIEdlbmVyYXRvck9wdGlvbnMuX19pbml0X18oc2VsZiwgY29udmVudGlvbnMsIGZpbGVuYW1lLCBkaXJlY3RvcnksIGFwaW5hbWUsIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMsIGVtaXR2ZXJzaW9ucywgZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucywgcmVtb3ZlRXh0ZW5zaW9ucywgZW1pdEV4dGVuc2lvbnMsIHNvcnRQcm9jZWR1cmUpCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gcHJlZml4VGV4dAorICAgICAgICBzZWxmLmdlbkZ1bmNQb2ludGVycyA9IGdlbkZ1bmNQb2ludGVycworICAgICAgICBzZWxmLnByb3RlY3RGaWxlICAgICA9IHByb3RlY3RGaWxlCisgICAgICAgIHNlbGYucHJvdGVjdEZlYXR1cmUgID0gcHJvdGVjdEZlYXR1cmUKKyAgICAgICAgc2VsZi5hcGljYWxsICAgICAgICAgPSBhcGljYWxsCisgICAgICAgIHNlbGYuYXBpZW50cnkgICAgICAgID0gYXBpZW50cnkKKyAgICAgICAgc2VsZi5hcGllbnRyeXAgICAgICAgPSBhcGllbnRyeXAKKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUHJvdG8gPSBpbmRlbnRGdW5jUHJvdG8KKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUG9pbnRlciA9IGluZGVudEZ1bmNQb2ludGVyCisgICAgICAgIHNlbGYuYWxpZ25GdW5jUGFyYW0gID0gYWxpZ25GdW5jUGFyYW0KKworIyBMYXllckNoYXNzaXNPdXRwdXRHZW5lcmF0b3IgLSBzdWJjbGFzcyBvZiBPdXRwdXRHZW5lcmF0b3IuCisjIEdlbmVyYXRlcyBhIExheWVyRmFjdG9yeSBsYXllciB0aGF0IGludGVyY2VwdHMgYWxsIEFQSSBlbnRyeXBvaW50cworIyAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIGNyZWF0aW5nIGN1c3RvbSBsYXllcnMKKyMKKyMgLS0tLSBtZXRob2RzIC0tLS0KKyMgTGF5ZXJDaGFzc2lzT3V0cHV0R2VuZXJhdG9yKGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkgLSBhcmdzIGFzIGZvcgorIyAgIE91dHB1dEdlbmVyYXRvci4gRGVmaW5lcyBhZGRpdGlvbmFsIGludGVybmFsIHN0YXRlLgorIyAtLS0tIG1ldGhvZHMgb3ZlcnJpZGluZyBiYXNlIGNsYXNzIC0tLS0KKyMgYmVnaW5GaWxlKGdlbk9wdHMpCisjIGVuZEZpbGUoKQorIyBiZWdpbkZlYXR1cmUoaW50ZXJmYWNlLCBlbWl0KQorIyBlbmRGZWF0dXJlKCkKKyMgZ2VuVHlwZSh0eXBlaW5mbyxuYW1lKQorIyBnZW5TdHJ1Y3QodHlwZWluZm8sbmFtZSkKKyMgZ2VuR3JvdXAoZ3JvdXBpbmZvLG5hbWUpCisjIGdlbkVudW0oZW51bWluZm8sIG5hbWUpCisjIGdlbkNtZChjbWRpbmZvKQorY2xhc3MgTGF5ZXJDaGFzc2lzT3V0cHV0R2VuZXJhdG9yKE91dHB1dEdlbmVyYXRvcik6CisgICAgIiIiR2VuZXJhdGUgc3BlY2lmaWVkIEFQSSBpbnRlcmZhY2VzIGluIGEgc3BlY2lmaWMgc3R5bGUsIHN1Y2ggYXMgYSBDIGhlYWRlciIiIgorICAgICMgVGhpcyBpcyBhbiBvcmRlcmVkIGxpc3Qgb2Ygc2VjdGlvbnMgaW4gdGhlIGhlYWRlciBmaWxlLgorICAgIFRZUEVfU0VDVElPTlMgPSBbJ2luY2x1ZGUnLCAnZGVmaW5lJywgJ2Jhc2V0eXBlJywgJ2hhbmRsZScsICdlbnVtJywKKyAgICAgICAgICAgICAgICAgICAgICdncm91cCcsICdiaXRtYXNrJywgJ2Z1bmNwb2ludGVyJywgJ3N0cnVjdCddCisgICAgQUxMX1NFQ1RJT05TID0gVFlQRV9TRUNUSU9OUyArIFsnY29tbWFuZCddCisKKyAgICBtYW51YWxfZnVuY3Rpb25zID0gWworICAgICAgICAjIEluY2x1ZGUgZnVuY3Rpb25zIGhlcmUgdG8gYmUgaW50ZXJlY3B0ZWQgdy8gbWFudWFsbHkgaW1wbGVtZW50ZWQgZnVuY3Rpb24gYm9kaWVzCisgICAgICAgICd2a0dldERldmljZVByb2NBZGRyJywKKyAgICAgICAgJ3ZrR2V0SW5zdGFuY2VQcm9jQWRkcicsCisgICAgICAgICd2a0NyZWF0ZURldmljZScsCisgICAgICAgICd2a0Rlc3Ryb3lEZXZpY2UnLAorICAgICAgICAndmtDcmVhdGVJbnN0YW5jZScsCisgICAgICAgICd2a0Rlc3Ryb3lJbnN0YW5jZScsCisgICAgICAgICd2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJywKKyAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywKKyAgICAgICAgJ3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzJywKKyAgICAgICAgJ3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcycsCisgICAgICAgICMgRnVuY3Rpb25zIHRoYXQgYXJlIGhhbmRsZWQgZXhwbGljaXRseSBkdWUgdG8gY2hhc3NpcyBhcmNoaXRlY3R1cmUgdmlvbGF0aW9ucworICAgICAgICAndmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcycsCisgICAgICAgICd2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMnLAorICAgICAgICAndmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYnLAorICAgICAgICAndmtDcmVhdGVQaXBlbGluZUxheW91dCcsCisgICAgICAgICd2a0NyZWF0ZVNoYWRlck1vZHVsZScsCisgICAgICAgICd2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMnLAorICAgICAgICAndmtDcmVhdGVCdWZmZXInLAorICAgICAgICAjIFZhbGlkYXRpb25DYWNoZSBmdW5jdGlvbnMgZG8gbm90IGdldCBkaXNwYXRjaGVkCisgICAgICAgICd2a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCcsCisgICAgICAgICd2a0Rlc3Ryb3lWYWxpZGF0aW9uQ2FjaGVFWFQnLAorICAgICAgICAndmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQnLAorICAgICAgICAndmtHZXRWYWxpZGF0aW9uQ2FjaGVEYXRhRVhUJywKKyAgICAgICAgIyBXZSBkb24ndCB3YW5uYSBob29rIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcicsCisgICAgICAgIF0KKworICAgIGFsdF9yZXRfY29kZXMgPSBbCisgICAgICAgICMgSW5jbHVkZSBmdW5jdGlvbnMgaGVyZSB3aGljaCBtdXN0IHRvbGVyYXRlIFZLX0lOQ09NUExFVEUgYXMgYSByZXR1cm4gY29kZQorICAgICAgICAndmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMnLAorICAgICAgICAndmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUicsCisgICAgICAgICd2a0dldFZhbGlkYXRpb25DYWNoZURhdGFFWFQnLAorICAgICAgICAndmtHZXRQaXBlbGluZUNhY2hlRGF0YScsCisgICAgICAgICd2a0dldFNoYWRlckluZm9BTUQnLAorICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQcm9wZXJ0aWVzS0hSJywKKyAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFInLAorICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFInLAorICAgICAgICAndmtHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUicsCisgICAgICAgICd2a0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUicsCisgICAgICAgICd2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFInLAorICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSJywKKyAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSJywKKyAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VQcmVzZW50UmVjdGFuZ2xlc0tIUicsCisgICAgICAgICd2a0dldFBhc3RQcmVzZW50YXRpb25UaW1pbmdHT09HTEUnLAorICAgICAgICAndmtHZXRTd2FwY2hhaW5JbWFnZXNLSFInLAorICAgICAgICAndmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcycsCisgICAgICAgICd2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcycsCisgICAgICAgICd2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsCisgICAgICAgICd2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMnLAorICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZUNhbGlicmF0ZWFibGVUaW1lRG9tYWluc0VYVCcsCisgICAgXQorCisgICAgcHJlX2Rpc3BhdGNoX2RlYnVnX3V0aWxzX2Z1bmN0aW9ucyA9IHsKKyAgICAgICAgJ3ZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUJyA6ICdsYXllcl9kYXRhLT5yZXBvcnRfZGF0YS0+RGVidWdSZXBvcnRTZXRNYXJrZXJPYmplY3ROYW1lKHBOYW1lSW5mbyk7JywKKyAgICAgICAgJ3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQnIDogJ2xheWVyX2RhdGEtPnJlcG9ydF9kYXRhLT5EZWJ1Z1JlcG9ydFNldFV0aWxzT2JqZWN0TmFtZShwTmFtZUluZm8pOycsCisgICAgICAgICd2a1F1ZXVlQmVnaW5EZWJ1Z1V0aWxzTGFiZWxFWFQnIDogJ0JlZ2luUXVldWVEZWJ1Z1V0aWxzTGFiZWwobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEsIHF1ZXVlLCBwTGFiZWxJbmZvKTsnLAorICAgICAgICAndmtRdWV1ZUluc2VydERlYnVnVXRpbHNMYWJlbEVYVCcgOiAnSW5zZXJ0UXVldWVEZWJ1Z1V0aWxzTGFiZWwobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEsIHF1ZXVlLCBwTGFiZWxJbmZvKTsnLAorICAgICAgICB9CisKKyAgICBwb3N0X2Rpc3BhdGNoX2RlYnVnX3V0aWxzX2Z1bmN0aW9ucyA9IHsKKyAgICAgICAgJ3ZrUXVldWVFbmREZWJ1Z1V0aWxzTGFiZWxFWFQnIDogJ0VuZFF1ZXVlRGVidWdVdGlsc0xhYmVsKGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhLCBxdWV1ZSk7JywKKyAgICAgICAgJ3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCcgOiAnbGF5ZXJfY3JlYXRlX3JlcG9ydF9jYWxsYmFjayhsYXllcl9kYXRhLT5yZXBvcnRfZGF0YSwgZmFsc2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ2FsbGJhY2spOycsCisgICAgICAgICd2a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUJyA6ICdsYXllcl9kZXN0cm95X2NhbGxiYWNrKGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhLCBjYWxsYmFjaywgcEFsbG9jYXRvcik7JywKKyAgICAgICAgJ3ZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCcgOiAnbGF5ZXJfY3JlYXRlX21lc3Nlbmdlcl9jYWxsYmFjayhsYXllcl9kYXRhLT5yZXBvcnRfZGF0YSwgZmFsc2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwTWVzc2VuZ2VyKTsnLAorICAgICAgICAndmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVCcgOiAnbGF5ZXJfZGVzdHJveV9jYWxsYmFjayhsYXllcl9kYXRhLT5yZXBvcnRfZGF0YSwgbWVzc2VuZ2VyLCBwQWxsb2NhdG9yKTsnLAorICAgICAgICB9CisKKyAgICBwcmVjYWxsdmFsaWRhdGVfbG9vcCA9ICJmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7IgorICAgIHByZWNhbGxyZWNvcmRfbG9vcCA9IHByZWNhbGx2YWxpZGF0ZV9sb29wCisgICAgcG9zdGNhbGxyZWNvcmRfbG9vcCA9ICJmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7IgorCisgICAgaW5saW5lX2N1c3RvbV9oZWFkZXJfcHJlYW1ibGUgPSAiIiIKKyNkZWZpbmUgTk9NSU5NQVgKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2dWxrYW4vdnVsa2FuLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfY29uZmlnLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfZGF0YS5oIgorI2luY2x1ZGUgInZrX2xheWVyX2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ2a19vYmplY3RfdHlwZXMuaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19lbnVtX3N0cmluZ19oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9leHRlbnNpb25fdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl91dGlscy5oIgorI2luY2x1ZGUgInZ1bGthbi92a19sYXllci5oIgorI2luY2x1ZGUgInZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oIgorI2luY2x1ZGUgInZrX2V4dGVuc2lvbl9oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a19zYWZlX3N0cnVjdC5oIgorI2luY2x1ZGUgInZrX3R5cGVtYXBfaGVscGVyLmgiCisKKworZXh0ZXJuIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBnbG9iYWxfdW5pcXVlX2lkOworCisvLyBUbyBhdm9pZCByZS1oYXNoaW5nIHVuaXF1ZSBpZHMgb24gZWFjaCB1c2UsIHdlIHByZWNvbXB1dGUgdGhlIGhhc2ggYW5kIHN0b3JlIHRoZQorLy8gaGFzaCdzIExTQnMgaW4gdGhlIGhpZ2ggMjQgYml0cy4KK3N0cnVjdCBIYXNoZWRVaW50NjQgeworICAgIHN0YXRpYyBjb25zdCBpbnQgSEFTSEVEX1VJTlQ2NF9TSElGVCA9IDQwOworICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHVpbnQ2NF90ICZ0KSBjb25zdCB7IHJldHVybiB0ID4+IEhBU0hFRF9VSU5UNjRfU0hJRlQ7IH0KKworICAgIHN0YXRpYyB1aW50NjRfdCBoYXNoKHVpbnQ2NF90IGlkKSB7CisgICAgICAgIHVpbnQ2NF90IGggPSAodWludDY0X3Qpc3RkOjpoYXNoPHVpbnQ2NF90PigpKGlkKTsKKyAgICAgICAgaWQgfD0gaCA8PCBIQVNIRURfVUlOVDY0X1NISUZUOworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorfTsKKworZXh0ZXJuIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdWludDY0X3QsIDQsIEhhc2hlZFVpbnQ2ND4gdW5pcXVlX2lkX21hcHBpbmc7CisiIiIKKworICAgIGlubGluZV9jdXN0b21faGVhZGVyX2NsYXNzX2RlZmluaXRpb24gPSAiIiIKKworLy8gTGF5ZXIgb2JqZWN0IHR5cGUgaWRlbnRpZmllcnMKK2VudW0gTGF5ZXJPYmplY3RUeXBlSWQgeworICAgIExheWVyT2JqZWN0VHlwZUluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgLy8gQ29udGFpbmVyIGZvciBhbiBpbnN0YW5jZSBkaXNwYXRjaCBvYmplY3QKKyAgICBMYXllck9iamVjdFR5cGVEZXZpY2UsICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRhaW5lciBmb3IgYSBkZXZpY2UgZGlzcGF0Y2ggb2JqZWN0CisgICAgTGF5ZXJPYmplY3RUeXBlVGhyZWFkaW5nLCAgICAgICAgICAgICAgICAgICAvLyBJbnN0YW5jZSBvciBkZXZpY2UgdGhyZWFkaW5nIGxheWVyIG9iamVjdAorICAgIExheWVyT2JqZWN0VHlwZVBhcmFtZXRlclZhbGlkYXRpb24sICAgICAgICAgLy8gSW5zdGFuY2Ugb3IgZGV2aWNlIHBhcmFtZXRlciB2YWxpZGF0aW9uIGxheWVyIG9iamVjdAorICAgIExheWVyT2JqZWN0VHlwZU9iamVjdFRyYWNrZXIsICAgICAgICAgICAgICAgLy8gSW5zdGFuY2Ugb3IgZGV2aWNlIG9iamVjdCB0cmFja2VyIGxheWVyIG9iamVjdAorICAgIExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uLCAgICAgICAgICAgICAgLy8gSW5zdGFuY2Ugb3IgZGV2aWNlIGNvcmUgdmFsaWRhdGlvbiBsYXllciBvYmplY3QKKyAgICBMYXllck9iamVjdFR5cGVCZXN0UHJhY3RpY2VzLCAgICAgICAgICAgICAgIC8vIEluc3RhbmNlIG9yIGRldmljZSBiZXN0IHByYWN0aWNlcyBsYXllciBvYmplY3QKKyAgICBMYXllck9iamVjdFR5cGVHcHVBc3Npc3RlZCwgICAgICAgICAgICAgICAgIC8vIEluc3RhbmNlIG9yIGRldmljZSBncHUgYXNzaXN0ZWQgdmFsaWRhdGlvbiBsYXllciBvYmplY3QKKyAgICBMYXllck9iamVjdFR5cGVNYXhFbnVtLCAgICAgICAgICAgICAgICAgICAgIC8vIE1heCBlbnVtIGNvdW50Cit9OworCitzdHJ1Y3QgVEVNUExBVEVfU1RBVEUgeworICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIGRlc2NfdXBkYXRlX3RlbXBsYXRlOworICAgIHNhZmVfVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvOworICAgIGJvb2wgZGVzdHJveWVkOworCisgICAgVEVNUExBVEVfU1RBVEUoVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgdXBkYXRlX3RlbXBsYXRlLCBzYWZlX1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8pCisgICAgICAgIDogZGVzY191cGRhdGVfdGVtcGxhdGUodXBkYXRlX3RlbXBsYXRlKSwgY3JlYXRlX2luZm8oKnBDcmVhdGVJbmZvKSwgZGVzdHJveWVkKGZhbHNlKSB7fQorfTsKKworY2xhc3MgTEFZRVJfUEhZU19ERVZfUFJPUEVSVElFUyB7CitwdWJsaWM6CisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgcHJvcGVydGllczsKKyAgICBzdGQ6OnZlY3RvcjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllcz4gcXVldWVfZmFtaWx5X3Byb3BlcnRpZXM7Cit9OworCit0eXBlZGVmIGVudW0gVmFsaWRhdGlvbkNoZWNrRGlzYWJsZXMgeworICAgIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9DT01NQU5EX0JVRkZFUl9TVEFURSwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfT0JKRUNUX0lOX1VTRSwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfSURMRV9ERVNDUklQVE9SX1NFVCwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfUFVTSF9DT05TVEFOVF9SQU5HRSwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfUVVFUllfVkFMSURBVElPTiwKKyAgICBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfSU1BR0VfTEFZT1VUX1ZBTElEQVRJT04sCit9IFZhbGlkYXRpb25DaGVja0Rpc2FibGVzOworCisvLyBDSEVDS19ESVNBQkxFRCBzdHJ1Y3QgaXMgYSBjb250YWluZXIgZm9yIGJvb2xzIHRoYXQgY2FuIGJsb2NrIHZhbGlkYXRpb24gY2hlY2tzIGZyb20gYmVpbmcgcGVyZm9ybWVkLgorLy8gVGhlc2UgYm9vbHMgYXJlIGFsbCAiZmFsc2UiIGJ5IGRlZmF1bHQgbWVhbmluZyB0aGF0IGFsbCBjaGVja3MgYXJlIGVuYWJsZWQuIEVudW0gdmFsdWVzIGNhbiBiZSBzcGVjaWZpZWQKKy8vIHZpYSB0aGUgdmtfbGF5ZXJfc2V0dGluZy50eHQgY29uZmlnIGZpbGUgb3IgYXQgQ3JlYXRlSW5zdGFuY2UgdGltZSB2aWEgdGhlIFZLX0VYVF92YWxpZGF0aW9uX2ZlYXR1cmVzIGV4dGVuc2lvbgorLy8gdGhhdCBjYW4gc2VsZWN0aXZlbHkgZGlzYWJsZSBjaGVja3MuCitzdHJ1Y3QgQ0hFQ0tfRElTQUJMRUQgeworICAgIGJvb2wgY29tbWFuZF9idWZmZXJfc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgY29tbWFuZCBidWZmZXIgc3RhdGUgdmFsaWRhdGlvbgorICAgIGJvb2wgb2JqZWN0X2luX3VzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIG9iamVjdCBpbl91c2UgY2hlY2tpbmcKKyAgICBib29sIGlkbGVfZGVzY3JpcHRvcl9zZXQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGNoZWNrIHRvIHZlcmlmeSB0aGF0IGRlc2NyaXB0b3Igc2V0IGlzIG5vdCBpbi11c2UKKyAgICBib29sIHB1c2hfY29uc3RhbnRfcmFuZ2U7ICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHB1c2ggY29uc3RhbnQgcmFuZ2UgY2hlY2tzCisgICAgYm9vbCBxdWVyeV92YWxpZGF0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBhbGwgY29yZSB2YWxpZGF0aW9uIHF1ZXJ5LXJlbGF0ZWQgY2hlY2tzCisgICAgYm9vbCBpbWFnZV9sYXlvdXRfdmFsaWRhdGlvbjsgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBpbWFnZSBsYXlvdXQgdmFsaWRhdGlvbgorICAgIGJvb2wgb2JqZWN0X3RyYWNraW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgb2JqZWN0IGxpZmV0aW1lIHZhbGlkYXRpb24KKyAgICBib29sIGNvcmVfY2hlY2tzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGNvcmUgdmFsaWRhdGlvbiBjaGVja3MKKyAgICBib29sIHRocmVhZF9zYWZldHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRocmVhZCBzYWZldHkgdmFsaWRhdGlvbgorICAgIGJvb2wgc3RhdGVsZXNzX2NoZWNrczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgc3RhdGVsZXNzIHZhbGlkYXRpb24gY2hlY2tzCisgICAgYm9vbCBoYW5kbGVfd3JhcHBpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB1bmlxdWUgaGFuZGxlcy9oYW5kbGUgd3JhcHBpbmcKKyAgICBib29sIHNoYWRlcl92YWxpZGF0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gZm9yIHNoYWRlcnMKKworICAgIHZvaWQgU2V0QWxsKGJvb2wgdmFsdWUpIHsgc3RkOjpmaWxsKCZjb21tYW5kX2J1ZmZlcl9zdGF0ZSwgJnNoYWRlcl92YWxpZGF0aW9uICsgMSwgdmFsdWUpOyB9Cit9OworCitzdHJ1Y3QgQ0hFQ0tfRU5BQkxFRCB7CisgICAgYm9vbCBncHVfdmFsaWRhdGlvbjsKKyAgICBib29sIGdwdV92YWxpZGF0aW9uX3Jlc2VydmVfYmluZGluZ19zbG90OworICAgIGJvb2wgYmVzdF9wcmFjdGljZXM7CisKKyAgICB2b2lkIFNldEFsbChib29sIHZhbHVlKSB7IHN0ZDo6ZmlsbCgmZ3B1X3ZhbGlkYXRpb24sICZncHVfdmFsaWRhdGlvbl9yZXNlcnZlX2JpbmRpbmdfc2xvdCArIDEsIHZhbHVlKTsgfQorfTsKKworLy8gTGF5ZXIgY2hhc3NpcyB2YWxpZGF0aW9uIG9iamVjdCBiYXNlIGNsYXNzIGRlZmluaXRpb24KK2NsYXNzIFZhbGlkYXRpb25PYmplY3QgeworICAgIHB1YmxpYzoKKyAgICAgICAgdWludDMyX3QgYXBpX3ZlcnNpb247CisgICAgICAgIGRlYnVnX3JlcG9ydF9kYXRhKiByZXBvcnRfZGF0YSA9IG51bGxwdHI7CisKKyAgICAgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZTsKKyAgICAgICAgVmtMYXllckRpc3BhdGNoVGFibGUgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlOworCisgICAgICAgIEluc3RhbmNlRXh0ZW5zaW9ucyBpbnN0YW5jZV9leHRlbnNpb25zOworICAgICAgICBEZXZpY2VFeHRlbnNpb25zIGRldmljZV9leHRlbnNpb25zID0ge307CisgICAgICAgIENIRUNLX0RJU0FCTEVEIGRpc2FibGVkID0ge307CisgICAgICAgIENIRUNLX0VOQUJMRUQgZW5hYmxlZCA9IHt9OworCisgICAgICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbF9kZXZpY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgVmtEZXZpY2UgZGV2aWNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIExBWUVSX1BIWVNfREVWX1BST1BFUlRJRVMgcGh5c19kZXZfcHJvcGVydGllcyA9IHt9OworCisgICAgICAgIHN0ZDo6dmVjdG9yPFZhbGlkYXRpb25PYmplY3QqPiBvYmplY3RfZGlzcGF0Y2g7CisgICAgICAgIExheWVyT2JqZWN0VHlwZUlkIGNvbnRhaW5lcl90eXBlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGxheWVyX25hbWUgPSAiQ0hBU1NJUyI7CisKKyAgICAgICAgLy8gQ29uc3RydWN0b3IKKyAgICAgICAgVmFsaWRhdGlvbk9iamVjdCgpe307CisgICAgICAgIC8vIERlc3RydWN0b3IKKyAgICAgICAgdmlydHVhbCB+VmFsaWRhdGlvbk9iamVjdCgpIHt9OworCisgICAgICAgIFJlYWRXcml0ZUxvY2sgdmFsaWRhdGlvbl9vYmplY3RfbXV0ZXg7CisgICAgICAgIHZpcnR1YWwgcmVhZF9sb2NrX2d1YXJkX3QgcmVhZF9sb2NrKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRfbG9ja19ndWFyZF90KHZhbGlkYXRpb25fb2JqZWN0X211dGV4KTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHdyaXRlX2xvY2tfZ3VhcmRfdCB3cml0ZV9sb2NrKCkgeworICAgICAgICAgICAgcmV0dXJuIHdyaXRlX2xvY2tfZ3VhcmRfdCh2YWxpZGF0aW9uX29iamVjdF9tdXRleCk7CisgICAgICAgIH0KKworICAgICAgICBWYWxpZGF0aW9uT2JqZWN0KiBHZXRWYWxpZGF0aW9uT2JqZWN0KHN0ZDo6dmVjdG9yPFZhbGlkYXRpb25PYmplY3QqPiYgb2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVJZCBvYmplY3RfdHlwZSkgeworICAgICAgICAgICAgZm9yIChhdXRvIHZhbGlkYXRpb25fb2JqZWN0IDogb2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25fb2JqZWN0LT5jb250YWluZXJfdHlwZSA9PSBvYmplY3RfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvbl9vYmplY3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gSGFuZGxlIFdyYXBwaW5nIERhdGEKKyAgICAgICAgLy8gUmV2ZXJzZSBtYXAgZGlzcGxheSBoYW5kbGVzCisgICAgICAgIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcDxWa0Rpc3BsYXlLSFIsIHVpbnQ2NF90LCAwPiBkaXNwbGF5X2lkX3JldmVyc2VfbWFwcGluZzsKKyAgICAgICAgLy8gV3JhcHBpbmcgRGVzY3JpcHRvciBUZW1wbGF0ZSBVcGRhdGUgc3RydWN0dXJlcyByZXF1aXJlcyBhY2Nlc3MgdG8gdGhlIHRlbXBsYXRlIGNyZWF0ZWluZm8gc3RydWN0cworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dW5pcXVlX3B0cjxURU1QTEFURV9TVEFURT4+IGRlc2NfdGVtcGxhdGVfY3JlYXRlaW5mb19tYXA7CisgICAgICAgIHN0cnVjdCBTdWJwYXNzZXNVc2FnZVN0YXRlcyB7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHN1YnBhc3Nlc191c2luZ19jb2xvcl9hdHRhY2htZW50OworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBzdWJwYXNzZXNfdXNpbmdfZGVwdGhzdGVuY2lsX2F0dGFjaG1lbnQ7CisgICAgICAgIH07CisgICAgICAgIC8vIFVzZXMgdW53cmFwcGVkIGhhbmRsZXMKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZrUmVuZGVyUGFzcywgU3VicGFzc2VzVXNhZ2VTdGF0ZXM+IHJlbmRlcnBhc3Nlc19zdGF0ZXM7CisgICAgICAgIC8vIE1hcCBvZiB3cmFwcGVkIHN3YXBjaGFpbiBoYW5kbGVzIHRvIGFycmF5cyBvZiB3cmFwcGVkIHN3YXBjaGFpbiBpbWFnZSBJRHMKKyAgICAgICAgLy8gRWFjaCBzd2FwY2hhaW4gaGFzIGFuIGltbXV0YWJsZSBsaXN0IG9mIHdyYXBwZWQgc3dhcGNoYWluIGltYWdlIElEcyAtLSBhbHdheXMgcmV0dXJuIHRoZXNlIElEcyBpZiB0aGV5IGV4aXN0CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa1N3YXBjaGFpbktIUiwgc3RkOjp2ZWN0b3I8VmtJbWFnZT4+IHN3YXBjaGFpbl93cmFwcGVkX2ltYWdlX2hhbmRsZV9tYXA7CisgICAgICAgIC8vIE1hcCBvZiB3cmFwcGVkIGRlc2NyaXB0b3IgcG9vbHMgdG8gc2V0IG9mIHdyYXBwZWQgZGVzY3JpcHRvciBzZXRzIGFsbG9jYXRlZCBmcm9tIGVhY2ggcG9vbAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtEZXNjcmlwdG9yUG9vbCwgc3RkOjp1bm9yZGVyZWRfc2V0PFZrRGVzY3JpcHRvclNldD4+IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcDsKKworCisgICAgICAgIC8vIFVud3JhcCBhIGhhbmRsZS4KKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZVR5cGU+CisgICAgICAgIEhhbmRsZVR5cGUgVW53cmFwKEhhbmRsZVR5cGUgd3JhcHBlZEhhbmRsZSkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gdW5pcXVlX2lkX21hcHBpbmcuZmluZChyZWludGVycHJldF9jYXN0PHVpbnQ2NF90IGNvbnN0ICY+KHdyYXBwZWRIYW5kbGUpKTsKKyAgICAgICAgICAgIGlmIChpdGVyID09IHVuaXF1ZV9pZF9tYXBwaW5nLmVuZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAoSGFuZGxlVHlwZSkwOworICAgICAgICAgICAgcmV0dXJuIChIYW5kbGVUeXBlKWl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdyYXAgYSBuZXdseSBjcmVhdGVkIGhhbmRsZSB3aXRoIGEgbmV3IHVuaXF1ZSBJRCwgYW5kIHJldHVybiB0aGUgbmV3IElELgorICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlVHlwZT4KKyAgICAgICAgSGFuZGxlVHlwZSBXcmFwTmV3KEhhbmRsZVR5cGUgbmV3bHlDcmVhdGVkSGFuZGxlKSB7CisgICAgICAgICAgICBhdXRvIHVuaXF1ZV9pZCA9IGdsb2JhbF91bmlxdWVfaWQrKzsKKyAgICAgICAgICAgIHVuaXF1ZV9pZCA9IEhhc2hlZFVpbnQ2NDo6aGFzaCh1bmlxdWVfaWQpOworICAgICAgICAgICAgdW5pcXVlX2lkX21hcHBpbmcuaW5zZXJ0X29yX2Fzc2lnbih1bmlxdWVfaWQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgY29uc3QgJj4obmV3bHlDcmVhdGVkSGFuZGxlKSk7CisgICAgICAgICAgICByZXR1cm4gKEhhbmRsZVR5cGUpdW5pcXVlX2lkOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3BlY2lhbGl6ZWQgaGFuZGxpbmcgZm9yIFZrRGlzcGxheUtIUi4gQWRkcyBhbiBlbnRyeSB0byBlbmFibGUgcmV2ZXJzZS1sb29rdXAuCisgICAgICAgIFZrRGlzcGxheUtIUiBXcmFwRGlzcGxheShWa0Rpc3BsYXlLSFIgbmV3bHlDcmVhdGVkSGFuZGxlLCBWYWxpZGF0aW9uT2JqZWN0ICptYXBfZGF0YSkgeworICAgICAgICAgICAgYXV0byB1bmlxdWVfaWQgPSBnbG9iYWxfdW5pcXVlX2lkKys7CisgICAgICAgICAgICB1bmlxdWVfaWQgPSBIYXNoZWRVaW50NjQ6Omhhc2godW5pcXVlX2lkKTsKKyAgICAgICAgICAgIHVuaXF1ZV9pZF9tYXBwaW5nLmluc2VydF9vcl9hc3NpZ24odW5pcXVlX2lkLCByZWludGVycHJldF9jYXN0PHVpbnQ2NF90IGNvbnN0ICY+KG5ld2x5Q3JlYXRlZEhhbmRsZSkpOworICAgICAgICAgICAgbWFwX2RhdGEtPmRpc3BsYXlfaWRfcmV2ZXJzZV9tYXBwaW5nLmluc2VydF9vcl9hc3NpZ24obmV3bHlDcmVhdGVkSGFuZGxlLCB1bmlxdWVfaWQpOworICAgICAgICAgICAgcmV0dXJuIChWa0Rpc3BsYXlLSFIpdW5pcXVlX2lkOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmtEaXNwbGF5S0hSIG9iamVjdHMgZG9uJ3QgaGF2ZSBhIHNpbmdsZSBwb2ludCBvZiBjcmVhdGlvbiwgc28gd2UgbmVlZCB0byBzZWUgaWYgb25lIGFscmVhZHkgZXhpc3RzIGluIHRoZSBtYXAgYmVmb3JlCisgICAgICAgIC8vIGNyZWF0aW5nIGFub3RoZXIuCisgICAgICAgIFZrRGlzcGxheUtIUiBNYXliZVdyYXBEaXNwbGF5KFZrRGlzcGxheUtIUiBoYW5kbGUsIFZhbGlkYXRpb25PYmplY3QgKm1hcF9kYXRhKSB7CisgICAgICAgICAgICAvLyBTZWUgaWYgdGhpcyBkaXNwbGF5IGlzIGFscmVhZHkga25vd24KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtYXBfZGF0YS0+ZGlzcGxheV9pZF9yZXZlcnNlX21hcHBpbmcuZmluZChoYW5kbGUpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1hcF9kYXRhLT5kaXNwbGF5X2lkX3JldmVyc2VfbWFwcGluZy5lbmQoKSkgcmV0dXJuIChWa0Rpc3BsYXlLSFIpaXQtPnNlY29uZDsKKyAgICAgICAgICAgIC8vIFVua25vd24sIHNvIHdyYXAKKyAgICAgICAgICAgIHJldHVybiBXcmFwRGlzcGxheShoYW5kbGUsIG1hcF9kYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZS9wb3N0IGhvb2sgcG9pbnQgZGVjbGFyYXRpb25zCisiIiIKKworICAgIGlubGluZV9jb3B5cmlnaHRfbWVzc2FnZSA9ICIiIgorLy8gVGhpcyBmaWxlIGlzICoqKkdFTkVSQVRFRCoqKi4gIERvIE5vdCBFZGl0LgorLy8gU2VlIGxheWVyX2NoYXNzaXNfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zLgorCisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICovIiIiCisKKyAgICBpbmxpbmVfY3VzdG9tX3NvdXJjZV9wcmVhbWJsZSA9ICIiIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNkZWZpbmUgVkFMSURBVElPTl9FUlJPUl9NQVBfSU1QTAorCisjaW5jbHVkZSAiY2hhc3Npcy5oIgorI2luY2x1ZGUgImxheWVyX2NoYXNzaXNfZGlzcGF0Y2guaCIKKworc21hbGxfdW5vcmRlcmVkX21hcDx2b2lkKiwgVmFsaWRhdGlvbk9iamVjdCosIDI+IGxheWVyX2RhdGFfbWFwOworCisvLyBHbG9iYWwgdW5pcXVlIG9iamVjdCBpZGVudGlmaWVyLgorc3RkOjphdG9taWM8dWludDY0X3Q+IGdsb2JhbF91bmlxdWVfaWQoMVVMTCk7CisvLyBNYXAgdW5pcXVlSUQgdG8gYWN0dWFsIG9iamVjdCBoYW5kbGUuIEFjY2Vzc2VzIHRvIHRoZSBtYXAgaXRzZWxmIGFyZQorLy8gaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQuCit2bF9jb25jdXJyZW50X3Vub3JkZXJlZF9tYXA8dWludDY0X3QsIHVpbnQ2NF90LCA0LCBIYXNoZWRVaW50NjQ+IHVuaXF1ZV9pZF9tYXBwaW5nOworCitib29sIHdyYXBfaGFuZGxlcyA9IHRydWU7CisKKyNkZWZpbmUgT0JKRUNUX0xBWUVSX05BTUUgIlZLX0xBWUVSX0tIUk9OT1NfdmFsaWRhdGlvbiIKKyNkZWZpbmUgT0JKRUNUX0xBWUVSX0RFU0NSSVBUSU9OICJraHJvbm9zX3ZhbGlkYXRpb24iCisKKy8vIEluY2x1ZGUgbGF5ZXIgdmFsaWRhdGlvbiBvYmplY3QgZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJiZXN0X3ByYWN0aWNlcy5oIgorI2luY2x1ZGUgImNvcmVfdmFsaWRhdGlvbi5oIgorI2luY2x1ZGUgImNvbW1hbmRfY291bnRlci5oIgorI2luY2x1ZGUgImdwdV92YWxpZGF0aW9uLmgiCisjaW5jbHVkZSAib2JqZWN0X2xpZmV0aW1lX3ZhbGlkYXRpb24uaCIKKyNpbmNsdWRlICJzdGF0ZWxlc3NfdmFsaWRhdGlvbi5oIgorI2luY2x1ZGUgInRocmVhZF9zYWZldHkuaCIKKworbmFtZXNwYWNlIHZ1bGthbl9sYXllcl9jaGFzc2lzIHsKKwordXNpbmcgc3RkOjp1bm9yZGVyZWRfbWFwOworCitzdGF0aWMgY29uc3QgVmtMYXllclByb3BlcnRpZXMgZ2xvYmFsX2xheWVyID0geworICAgIE9CSkVDVF9MQVlFUl9OQU1FLCBWS19MQVlFUl9BUElfVkVSU0lPTiwgMSwgIkx1bmFyRyB2YWxpZGF0aW9uIExheWVyIiwKK307CisKK3N0YXRpYyBjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgaW5zdGFuY2VfZXh0ZW5zaW9uc1tdID0ge3tWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FLCBWS19FWFRfREVCVUdfUkVQT1JUX1NQRUNfVkVSU0lPTn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FLCBWS19FWFRfREVCVUdfVVRJTFNfU1BFQ19WRVJTSU9OfX07CitzdGF0aWMgY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIGRldmljZV9leHRlbnNpb25zW10gPSB7CisgICAge1ZLX0VYVF9WQUxJREFUSU9OX0NBQ0hFX0VYVEVOU0lPTl9OQU1FLCBWS19FWFRfVkFMSURBVElPTl9DQUNIRV9TUEVDX1ZFUlNJT059LAorICAgIHtWS19FWFRfREVCVUdfTUFSS0VSX0VYVEVOU0lPTl9OQU1FLCBWS19FWFRfREVCVUdfTUFSS0VSX1NQRUNfVkVSU0lPTn0sCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYm9vbCBpc19pbnN0YW5jZV9hcGk7CisgICAgdm9pZCogZnVuY3B0cjsKK30gZnVuY3Rpb25fZGF0YTsKKworZXh0ZXJuIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgZnVuY3Rpb25fZGF0YT4gbmFtZV90b19mdW5jcHRyX21hcDsKKworLy8gTWFudWFsbHkgd3JpdHRlbiBmdW5jdGlvbnMKKworLy8gQ2hlY2sgZW5hYmxlZCBpbnN0YW5jZSBleHRlbnNpb25zIGFnYWluc3Qgc3VwcG9ydGVkIGluc3RhbmNlIGV4dGVuc2lvbiB3aGl0ZWxpc3QKK3N0YXRpYyB2b2lkIEluc3RhbmNlRXh0ZW5zaW9uV2hpdGVsaXN0KFZhbGlkYXRpb25PYmplY3QgKmxheWVyX2RhdGEsIGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywgVmtJbnN0YW5jZSBpbnN0YW5jZSkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHJlY29nbml6ZWQgaW5zdGFuY2UgZXh0ZW5zaW9ucworICAgICAgICBpZiAoIXdoaXRlX2xpc3QocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBrSW5zdGFuY2VFeHRlbnNpb25OYW1lcykpIHsKKyAgICAgICAgICAgIGxvZ19tc2cobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOX0VYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAga1ZVSURVbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICJJbnN0YW5jZSBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGxheWVyLiAgVXNpbmcgdGhpcyBleHRlbnNpb24gbWF5IGFkdmVyc2VseSBhZmZlY3QgdmFsaWRhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICJyZXN1bHRzIGFuZC9vciBwcm9kdWNlIHVuZGVmaW5lZCBiZWhhdmlvci4iLAorICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCisvLyBDaGVjayBlbmFibGVkIGRldmljZSBleHRlbnNpb25zIGFnYWluc3Qgc3VwcG9ydGVkIGRldmljZSBleHRlbnNpb24gd2hpdGVsaXN0CitzdGF0aWMgdm9pZCBEZXZpY2VFeHRlbnNpb25XaGl0ZWxpc3QoVmFsaWRhdGlvbk9iamVjdCAqbGF5ZXJfZGF0YSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywgVmtEZXZpY2UgZGV2aWNlKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworICAgICAgICAvLyBDaGVjayBmb3IgcmVjb2duaXplZCBkZXZpY2UgZXh0ZW5zaW9ucworICAgICAgICBpZiAoIXdoaXRlX2xpc3QocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBrRGV2aWNlRXh0ZW5zaW9uTmFtZXMpKSB7CisgICAgICAgICAgICBsb2dfbXNnKGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsCisgICAgICAgICAgICAgICAgICAgIGtWVUlEVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAiRGV2aWNlIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbGF5ZXIuICBVc2luZyB0aGlzIGV4dGVuc2lvbiBtYXkgYWR2ZXJzZWx5IGFmZmVjdCB2YWxpZGF0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgInJlc3VsdHMgYW5kL29yIHByb2R1Y2UgdW5kZWZpbmVkIGJlaGF2aW9yLiIsCisgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gUHJvY2VzcyB2YWxpZGF0aW9uIGZlYXR1cmVzLCBmbGFncyBhbmQgc2V0dGluZ3Mgc3BlY2lmaWVkIHRocm91Z2ggZXh0ZW5zaW9ucywgYSBsYXllciBzZXR0aW5ncyBmaWxlLCBvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKworc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgVmtWYWxpZGF0aW9uRmVhdHVyZURpc2FibGVFWFQ+IFZrVmFsRmVhdHVyZURpc2FibGVMb29rdXAgPSB7CisgICAgeyJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9TSEFERVJTX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1NIQURFUlNfRVhUfSwKKyAgICB7IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1RIUkVBRF9TQUZFVFlfRVhUIiwgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVEhSRUFEX1NBRkVUWV9FWFR9LAorICAgIHsiVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQVBJX1BBUkFNRVRFUlNfRVhUIiwgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQVBJX1BBUkFNRVRFUlNfRVhUfSwKKyAgICB7IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX09CSkVDVF9MSUZFVElNRVNfRVhUIiwgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfT0JKRUNUX0xJRkVUSU1FU19FWFR9LAorICAgIHsiVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQ09SRV9DSEVDS1NfRVhUIiwgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQ09SRV9DSEVDS1NfRVhUfSwKKyAgICB7IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1VOSVFVRV9IQU5ETEVTX0VYVCIsIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1VOSVFVRV9IQU5ETEVTX0VYVH0sCisgICAgeyJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9BTExfRVhUIiwgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQUxMX0VYVH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUPiBWa1ZhbEZlYXR1cmVFbmFibGVMb29rdXAgPSB7CisgICAgeyJWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9FWFQiLCBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9FWFR9LAorICAgIHsiVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfUkVTRVJWRV9CSU5ESU5HX1NMT1RfRVhUIiwgVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfUkVTRVJWRV9CSU5ESU5HX1NMT1RfRVhUfSwKKyAgICB7IlZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfQkVTVF9QUkFDVElDRVNfRVhUIiwgVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9CRVNUX1BSQUNUSUNFU19FWFR9LAorfTsKKworc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgVmFsaWRhdGlvbkNoZWNrRGlzYWJsZXM+IFZhbGlkYXRpb25EaXNhYmxlTG9va3VwID0geworICAgIHsiVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0NPTU1BTkRfQlVGRkVSX1NUQVRFIiwgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0NPTU1BTkRfQlVGRkVSX1NUQVRFfSwKKyAgICB7IlZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9PQkpFQ1RfSU5fVVNFIiwgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX09CSkVDVF9JTl9VU0V9LAorICAgIHsiVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0lETEVfREVTQ1JJUFRPUl9TRVQiLCBWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfSURMRV9ERVNDUklQVE9SX1NFVH0sCisgICAgeyJWQUxJREFUSU9OX0NIRUNLX0RJU0FCTEVfUFVTSF9DT05TVEFOVF9SQU5HRSIsIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9QVVNIX0NPTlNUQU5UX1JBTkdFfSwKKyAgICB7IlZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9RVUVSWV9WQUxJREFUSU9OIiwgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX1FVRVJZX1ZBTElEQVRJT059LAorICAgIHsiVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0lNQUdFX0xBWU9VVF9WQUxJREFUSU9OIiwgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0lNQUdFX0xBWU9VVF9WQUxJREFUSU9OfSwKK307CisKKy8vIFNldCB0aGUgbG9jYWwgZGlzYWJsZSBmbGFnIGZvciB0aGUgYXBwcm9wcmlhdGUgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFIGVudW0KK3ZvaWQgU2V0VmFsaWRhdGlvbkRpc2FibGUoQ0hFQ0tfRElTQUJMRUQqIGRpc2FibGVfZGF0YSwgY29uc3QgVmFsaWRhdGlvbkNoZWNrRGlzYWJsZXMgZGlzYWJsZV9pZCkgeworICAgIHN3aXRjaCAoZGlzYWJsZV9pZCkgeworICAgICAgICBjYXNlIFZBTElEQVRJT05fQ0hFQ0tfRElTQUJMRV9DT01NQU5EX0JVRkZFUl9TVEFURToKKyAgICAgICAgICAgIGRpc2FibGVfZGF0YS0+Y29tbWFuZF9idWZmZXJfc3RhdGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX09CSkVDVF9JTl9VU0U6CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPm9iamVjdF9pbl91c2UgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0lETEVfREVTQ1JJUFRPUl9TRVQ6CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPmlkbGVfZGVzY3JpcHRvcl9zZXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX1BVU0hfQ09OU1RBTlRfUkFOR0U6CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPnB1c2hfY29uc3RhbnRfcmFuZ2UgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX1FVRVJZX1ZBTElEQVRJT046CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPnF1ZXJ5X3ZhbGlkYXRpb24gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFMSURBVElPTl9DSEVDS19ESVNBQkxFX0lNQUdFX0xBWU9VVF9WQUxJREFUSU9OOgorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT5pbWFnZV9sYXlvdXRfdmFsaWRhdGlvbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCh0cnVlKTsKKyAgICB9Cit9CisKKy8vIFNldCB0aGUgbG9jYWwgZGlzYWJsZSBmbGFnIGZvciBhIHNpbmdsZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV8qIGZsYWcKK3ZvaWQgU2V0VmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlKENIRUNLX0RJU0FCTEVEKiBkaXNhYmxlX2RhdGEsIGNvbnN0IFZrVmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlRVhUIGZlYXR1cmVfZGlzYWJsZSkgeworICAgIHN3aXRjaCAoZmVhdHVyZV9kaXNhYmxlKSB7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfU0hBREVSU19FWFQ6CisgICAgICAgICAgICBkaXNhYmxlX2RhdGEtPnNoYWRlcl92YWxpZGF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX1RIUkVBRF9TQUZFVFlfRVhUOgorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT50aHJlYWRfc2FmZXR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FQSV9QQVJBTUVURVJTX0VYVDoKKyAgICAgICAgICAgIGRpc2FibGVfZGF0YS0+c3RhdGVsZXNzX2NoZWNrcyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRElTQUJMRV9PQkpFQ1RfTElGRVRJTUVTX0VYVDoKKyAgICAgICAgICAgIGRpc2FibGVfZGF0YS0+b2JqZWN0X3RyYWNraW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0NPUkVfQ0hFQ0tTX0VYVDoKKyAgICAgICAgICAgIGRpc2FibGVfZGF0YS0+Y29yZV9jaGVja3MgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfVU5JUVVFX0hBTkRMRVNfRVhUOgorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT5oYW5kbGVfd3JhcHBpbmcgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9GRUFUVVJFX0RJU0FCTEVfQUxMX0VYVDoKKyAgICAgICAgICAgIC8vIFNldCBhbGwgZGlzYWJsZWQgZmxhZ3MgdG8gdHJ1ZQorICAgICAgICAgICAgZGlzYWJsZV9kYXRhLT5TZXRBbGwodHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gU2V0IHRoZSBsb2NhbCBlbmFibGUgZmxhZyBmb3IgYSBzaW5nbGUgVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV8qIGZsYWcKK3ZvaWQgU2V0VmFsaWRhdGlvbkZlYXR1cmVFbmFibGUoQ0hFQ0tfRU5BQkxFRCAqZW5hYmxlX2RhdGEsIGNvbnN0IFZrVmFsaWRhdGlvbkZlYXR1cmVFbmFibGVFWFQgZmVhdHVyZV9lbmFibGUpIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVfZW5hYmxlKSB7CisgICAgICAgIGNhc2UgVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhUOgorICAgICAgICAgICAgZW5hYmxlX2RhdGEtPmdwdV92YWxpZGF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX1JFU0VSVkVfQklORElOR19TTE9UX0VYVDoKKyAgICAgICAgICAgIGVuYWJsZV9kYXRhLT5ncHVfdmFsaWRhdGlvbl9yZXNlcnZlX2JpbmRpbmdfc2xvdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0JFU1RfUFJBQ1RJQ0VTX0VYVDoKKyAgICAgICAgICAgIGVuYWJsZV9kYXRhLT5iZXN0X3ByYWN0aWNlcyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gU2V0IHRoZSBsb2NhbCBkaXNhYmxlIGZsYWcgZm9yIHNldHRpbmdzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBWS19FWFRfdmFsaWRhdGlvbl9mbGFncyBleHRlbnNpb24KK3ZvaWQgU2V0VmFsaWRhdGlvbkZsYWdzKENIRUNLX0RJU0FCTEVEKiBkaXNhYmxlcywgY29uc3QgVmtWYWxpZGF0aW9uRmxhZ3NFWFQqIHZhbF9mbGFnc19zdHJ1Y3QpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdmFsX2ZsYWdzX3N0cnVjdC0+ZGlzYWJsZWRWYWxpZGF0aW9uQ2hlY2tDb3VudDsgKytpKSB7CisgICAgICAgIHN3aXRjaCAodmFsX2ZsYWdzX3N0cnVjdC0+cERpc2FibGVkVmFsaWRhdGlvbkNoZWNrc1tpXSkgeworICAgICAgICAgICAgY2FzZSBWS19WQUxJREFUSU9OX0NIRUNLX1NIQURFUlNfRVhUOgorICAgICAgICAgICAgICAgIGRpc2FibGVzLT5zaGFkZXJfdmFsaWRhdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX1ZBTElEQVRJT05fQ0hFQ0tfQUxMX0VYVDoKKyAgICAgICAgICAgICAgICAvLyBTZXQgYWxsIGRpc2FibGVkIGZsYWdzIHRvIHRydWUKKyAgICAgICAgICAgICAgICBkaXNhYmxlcy0+U2V0QWxsKHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gUHJvY2VzcyBWYWxpZGF0aW9uIEZlYXR1cmVzIGZsYWdzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBWYWxpZGF0aW9uRmVhdHVyZSBleHRlbnNpb24KK3ZvaWQgU2V0VmFsaWRhdGlvbkZlYXR1cmVzKENIRUNLX0RJU0FCTEVEICpkaXNhYmxlX2RhdGEsIENIRUNLX0VOQUJMRUQgKmVuYWJsZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgKnZhbF9mZWF0dXJlc19zdHJ1Y3QpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdmFsX2ZlYXR1cmVzX3N0cnVjdC0+ZGlzYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50OyArK2kpIHsKKyAgICAgICAgU2V0VmFsaWRhdGlvbkZlYXR1cmVEaXNhYmxlKGRpc2FibGVfZGF0YSwgdmFsX2ZlYXR1cmVzX3N0cnVjdC0+cERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzW2ldKTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHZhbF9mZWF0dXJlc19zdHJ1Y3QtPmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50OyArK2kpIHsKKyAgICAgICAgU2V0VmFsaWRhdGlvbkZlYXR1cmVFbmFibGUoZW5hYmxlX2RhdGEsIHZhbF9mZWF0dXJlc19zdHJ1Y3QtPnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzW2ldKTsKKyAgICB9Cit9CisKKy8vIEdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBvZiBlbmFibGUgZW51bSB2YWx1ZXMsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHNldHRlciBmdW5jdGlvbgordm9pZCBTZXRMb2NhbEVuYWJsZVNldHRpbmcoc3RkOjpzdHJpbmcgbGlzdF9vZl9lbmFibGVzLCBzdGQ6OnN0cmluZyBkZWxpbWl0ZXIsIENIRUNLX0VOQUJMRUQqIGVuYWJsZXMpIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBzdGQ6OnN0cmluZyB0b2tlbjsKKyAgICB3aGlsZSAobGlzdF9vZl9lbmFibGVzLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgcG9zID0gbGlzdF9vZl9lbmFibGVzLmZpbmQoZGVsaW1pdGVyKTsKKyAgICAgICAgaWYgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgdG9rZW4gPSBsaXN0X29mX2VuYWJsZXMuc3Vic3RyKDAsIHBvcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwb3MgPSBsaXN0X29mX2VuYWJsZXMubGVuZ3RoKCkgLSBkZWxpbWl0ZXIubGVuZ3RoKCk7CisgICAgICAgICAgICB0b2tlbiA9IGxpc3Rfb2ZfZW5hYmxlczsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9rZW4uZmluZCgiVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBWa1ZhbEZlYXR1cmVFbmFibGVMb29rdXAuZmluZCh0b2tlbik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFZrVmFsRmVhdHVyZUVuYWJsZUxvb2t1cC5lbmQoKSkgeworICAgICAgICAgICAgICAgIFNldFZhbGlkYXRpb25GZWF0dXJlRW5hYmxlKGVuYWJsZXMsIHJlc3VsdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsaXN0X29mX2VuYWJsZXMuZXJhc2UoMCwgcG9zICsgZGVsaW1pdGVyLmxlbmd0aCgpKTsKKyAgICB9Cit9CisKKy8vIEdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBvZiBkaXNhYmxlIGVudW0gdmFsdWVzLCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBzZXR0ZXIgZnVuY3Rpb24KK3ZvaWQgU2V0TG9jYWxEaXNhYmxlU2V0dGluZyhzdGQ6OnN0cmluZyBsaXN0X29mX2Rpc2FibGVzLCBzdGQ6OnN0cmluZyBkZWxpbWl0ZXIsIENIRUNLX0RJU0FCTEVEKiBkaXNhYmxlcykgeworICAgIHNpemVfdCBwb3MgPSAwOworICAgIHN0ZDo6c3RyaW5nIHRva2VuOworICAgIHdoaWxlIChsaXN0X29mX2Rpc2FibGVzLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgcG9zID0gbGlzdF9vZl9kaXNhYmxlcy5maW5kKGRlbGltaXRlcik7CisgICAgICAgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHRva2VuID0gbGlzdF9vZl9kaXNhYmxlcy5zdWJzdHIoMCwgcG9zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvcyA9IGxpc3Rfb2ZfZGlzYWJsZXMubGVuZ3RoKCkgLSBkZWxpbWl0ZXIubGVuZ3RoKCk7CisgICAgICAgICAgICB0b2tlbiA9IGxpc3Rfb2ZfZGlzYWJsZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRva2VuLmZpbmQoIlZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IFZrVmFsRmVhdHVyZURpc2FibGVMb29rdXAuZmluZCh0b2tlbik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFZrVmFsRmVhdHVyZURpc2FibGVMb29rdXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBTZXRWYWxpZGF0aW9uRmVhdHVyZURpc2FibGUoZGlzYWJsZXMsIHJlc3VsdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodG9rZW4uZmluZCgiVkFMSURBVElPTl9DSEVDS19ESVNBQkxFXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IFZhbGlkYXRpb25EaXNhYmxlTG9va3VwLmZpbmQodG9rZW4pOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBWYWxpZGF0aW9uRGlzYWJsZUxvb2t1cC5lbmQoKSkgeworICAgICAgICAgICAgICAgIFNldFZhbGlkYXRpb25EaXNhYmxlKGRpc2FibGVzLCByZXN1bHQtPnNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGlzdF9vZl9kaXNhYmxlcy5lcmFzZSgwLCBwb3MgKyBkZWxpbWl0ZXIubGVuZ3RoKCkpOworICAgIH0KK30KKworLy8gUHJvY2VzcyBlbmFibGVzIGFuZCBkaXNhYmxlcyBzZXQgdGhvdWdoIHRoZSB2a19sYXllcl9zZXR0aW5ncy50eHQgY29uZmlnIGZpbGUgb3IgdGhyb3VnaCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQordm9pZCBQcm9jZXNzQ29uZmlnQW5kRW52U2V0dGluZ3MoY29uc3QgY2hhciogbGF5ZXJfZGVzY3JpcHRpb24sIENIRUNLX0VOQUJMRUQqIGVuYWJsZXMsIENIRUNLX0RJU0FCTEVEKiBkaXNhYmxlcykgeworICAgIHN0ZDo6c3RyaW5nIGVuYWJsZV9rZXkgPSBsYXllcl9kZXNjcmlwdGlvbjsKKyAgICBzdGQ6OnN0cmluZyBkaXNhYmxlX2tleSA9IGxheWVyX2Rlc2NyaXB0aW9uOworICAgIGVuYWJsZV9rZXkuYXBwZW5kKCIuZW5hYmxlcyIpOworICAgIGRpc2FibGVfa2V5LmFwcGVuZCgiLmRpc2FibGVzIik7CisgICAgc3RkOjpzdHJpbmcgbGlzdF9vZl9jb25maWdfZW5hYmxlcyA9IGdldExheWVyT3B0aW9uKGVuYWJsZV9rZXkuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgbGlzdF9vZl9lbnZfZW5hYmxlcyA9IEdldExheWVyRW52VmFyKCJWS19MQVlFUl9FTkFCTEVTIik7CisgICAgc3RkOjpzdHJpbmcgbGlzdF9vZl9jb25maWdfZGlzYWJsZXMgPSBnZXRMYXllck9wdGlvbihkaXNhYmxlX2tleS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBsaXN0X29mX2Vudl9kaXNhYmxlcyA9IEdldExheWVyRW52VmFyKCJWS19MQVlFUl9ESVNBQkxFUyIpOworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgIHN0ZDo6c3RyaW5nIGVudl9kZWxpbWl0ZXIgPSAiOyI7CisjZWxzZQorICAgIHN0ZDo6c3RyaW5nIGVudl9kZWxpbWl0ZXIgPSAiOiI7CisjZW5kaWYKKyAgICBTZXRMb2NhbEVuYWJsZVNldHRpbmcobGlzdF9vZl9jb25maWdfZW5hYmxlcywgIiwiLCBlbmFibGVzKTsKKyAgICBTZXRMb2NhbEVuYWJsZVNldHRpbmcobGlzdF9vZl9lbnZfZW5hYmxlcywgZW52X2RlbGltaXRlciwgZW5hYmxlcyk7CisgICAgU2V0TG9jYWxEaXNhYmxlU2V0dGluZyhsaXN0X29mX2NvbmZpZ19kaXNhYmxlcywgIiwiLCBkaXNhYmxlcyk7CisgICAgU2V0TG9jYWxEaXNhYmxlU2V0dGluZyhsaXN0X29mX2Vudl9kaXNhYmxlcywgZW52X2RlbGltaXRlciwgZGlzYWJsZXMpOworfQorCisKKy8vIE5vbi1jb2RlLWdlbmVyYXRlZCBjaGFzc2lzIEFQSSBmdW5jdGlvbnMKKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBHZXREZXZpY2VQcm9jQWRkcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGlmICghQXBpUGFyZW50RXh0ZW5zaW9uRW5hYmxlZChmdW5jTmFtZSwgJmxheWVyX2RhdGEtPmRldmljZV9leHRlbnNpb25zKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3QgYXV0byAmaXRlbSA9IG5hbWVfdG9fZnVuY3B0cl9tYXAuZmluZChmdW5jTmFtZSk7CisgICAgaWYgKGl0ZW0gIT0gbmFtZV90b19mdW5jcHRyX21hcC5lbmQoKSkgeworICAgICAgICBpZiAoaXRlbS0+c2Vjb25kLmlzX2luc3RhbmNlX2FwaSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KGl0ZW0tPnNlY29uZC5mdW5jcHRyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdXRvICZ0YWJsZSA9IGxheWVyX2RhdGEtPmRldmljZV9kaXNwYXRjaF90YWJsZTsKKyAgICBpZiAoIXRhYmxlLkdldERldmljZVByb2NBZGRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gdGFibGUuR2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlLCBmdW5jTmFtZSk7Cit9CisKK1ZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIGNvbnN0IGF1dG8gJml0ZW0gPSBuYW1lX3RvX2Z1bmNwdHJfbWFwLmZpbmQoZnVuY05hbWUpOworICAgIGlmIChpdGVtICE9IG5hbWVfdG9fZnVuY3B0cl9tYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihpdGVtLT5zZWNvbmQuZnVuY3B0cik7CisgICAgfQorICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGF1dG8gJnRhYmxlID0gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgaWYgKCF0YWJsZS5HZXRJbnN0YW5jZVByb2NBZGRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gdGFibGUuR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXModWludDMyX3QgKnBDb3VudCwgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgcmV0dXJuIHV0aWxfR2V0TGF5ZXJQcm9wZXJ0aWVzKDEsICZnbG9iYWxfbGF5ZXIsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiB1dGlsX0dldExheWVyUHJvcGVydGllcygxLCAmZ2xvYmFsX2xheWVyLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgaWYgKHBMYXllck5hbWUgJiYgIXN0cmNtcChwTGF5ZXJOYW1lLCBnbG9iYWxfbGF5ZXIubGF5ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIHV0aWxfR2V0RXh0ZW5zaW9uUHJvcGVydGllcyhBUlJBWV9TSVpFKGluc3RhbmNlX2V4dGVuc2lvbnMpLCBpbnN0YW5jZV9leHRlbnNpb25zLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiBWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgY2hhciAqcExheWVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICBpZiAocExheWVyTmFtZSAmJiAhc3RyY21wKHBMYXllck5hbWUsIGdsb2JhbF9sYXllci5sYXllck5hbWUpKSByZXR1cm4gdXRpbF9HZXRFeHRlbnNpb25Qcm9wZXJ0aWVzKEFSUkFZX1NJWkUoZGV2aWNlX2V4dGVuc2lvbnMpLCBkZXZpY2VfZXh0ZW5zaW9ucywgcENvdW50LCBwUHJvcGVydGllcyk7CisgICAgYXNzZXJ0KHBoeXNpY2FsRGV2aWNlKTsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShwaHlzaWNhbERldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICByZXR1cm4gbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcExheWVyTmFtZSwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luc3RhbmNlICpwSW5zdGFuY2UpIHsKKyAgICBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvKiBjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisKKyAgICBhc3NlcnQoY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvKTsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgUEZOX3ZrQ3JlYXRlSW5zdGFuY2UgZnBDcmVhdGVJbnN0YW5jZSA9IChQRk5fdmtDcmVhdGVJbnN0YW5jZSlmcEdldEluc3RhbmNlUHJvY0FkZHIoTlVMTCwgInZrQ3JlYXRlSW5zdGFuY2UiKTsKKyAgICBpZiAoZnBDcmVhdGVJbnN0YW5jZSA9PSBOVUxMKSByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIGNoYWluX2luZm8tPnUucExheWVySW5mbyA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cE5leHQ7CisgICAgdWludDMyX3Qgc3BlY2lmaWVkX3ZlcnNpb24gPSAocENyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8gPyBwQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mby0+YXBpVmVyc2lvbiA6IFZLX0FQSV9WRVJTSU9OXzFfMCk7CisgICAgdWludDMyX3QgYXBpX3ZlcnNpb24gPSAoc3BlY2lmaWVkX3ZlcnNpb24gPCBWS19BUElfVkVSU0lPTl8xXzEpID8gVktfQVBJX1ZFUlNJT05fMV8wIDogVktfQVBJX1ZFUlNJT05fMV8xOworICAgIGF1dG8gcmVwb3J0X2RhdGEgPSBuZXcgZGVidWdfcmVwb3J0X2RhdGF7fTsKKyAgICByZXBvcnRfZGF0YS0+aW5zdGFuY2VfcG5leHRfY2hhaW4gPSBTYWZlUG5leHRDb3B5KHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgQWN0aXZhdGVJbnN0YW5jZURlYnVnQ2FsbGJhY2tzKHJlcG9ydF9kYXRhKTsKKworICAgIENIRUNLX0VOQUJMRUQgbG9jYWxfZW5hYmxlcyB7fTsKKyAgICBDSEVDS19ESVNBQkxFRCBsb2NhbF9kaXNhYmxlcyB7fTsKKyAgICBjb25zdCBhdXRvICp2YWxpZGF0aW9uX2ZlYXR1cmVzX2V4dCA9IGx2bF9maW5kX2luX2NoYWluPFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmICh2YWxpZGF0aW9uX2ZlYXR1cmVzX2V4dCkgeworICAgICAgICBTZXRWYWxpZGF0aW9uRmVhdHVyZXMoJmxvY2FsX2Rpc2FibGVzLCAmbG9jYWxfZW5hYmxlcywgdmFsaWRhdGlvbl9mZWF0dXJlc19leHQpOworICAgIH0KKyAgICBjb25zdCBhdXRvICp2YWxpZGF0aW9uX2ZsYWdzX2V4dCA9IGx2bF9maW5kX2luX2NoYWluPFZrVmFsaWRhdGlvbkZsYWdzRVhUPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgIGlmICh2YWxpZGF0aW9uX2ZsYWdzX2V4dCkgeworICAgICAgICBTZXRWYWxpZGF0aW9uRmxhZ3MoJmxvY2FsX2Rpc2FibGVzLCB2YWxpZGF0aW9uX2ZsYWdzX2V4dCk7CisgICAgfQorICAgIFByb2Nlc3NDb25maWdBbmRFbnZTZXR0aW5ncyhPQkpFQ1RfTEFZRVJfREVTQ1JJUFRJT04sICZsb2NhbF9lbmFibGVzLCAmbG9jYWxfZGlzYWJsZXMpOworCisgICAgLy8gQ3JlYXRlIHRlbXBvcmFyeSBkaXNwYXRjaCB2ZWN0b3IgZm9yIHByZS1jYWxscyB1bnRpbCBpbnN0YW5jZSBpcyBjcmVhdGVkCisgICAgc3RkOjp2ZWN0b3I8VmFsaWRhdGlvbk9iamVjdCo+IGxvY2FsX29iamVjdF9kaXNwYXRjaDsKKyAgICAvLyBBZGQgVk9zIHRvIGRpc3BhdGNoIHZlY3Rvci4gT3JkZXIgaGVyZSB3aWxsIGJlIHRoZSB2YWxpZGF0aW9uIGRpc3BhdGNoIG9yZGVyIQorICAgIGF1dG8gdGhyZWFkX2NoZWNrZXIgPSBuZXcgVGhyZWFkU2FmZXR5KG51bGxwdHIpOworICAgIGlmICghbG9jYWxfZGlzYWJsZXMudGhyZWFkX3NhZmV0eSkgeworICAgICAgICBsb2NhbF9vYmplY3RfZGlzcGF0Y2guZW1wbGFjZV9iYWNrKHRocmVhZF9jaGVja2VyKTsKKyAgICB9CisgICAgdGhyZWFkX2NoZWNrZXItPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlVGhyZWFkaW5nOworICAgIHRocmVhZF9jaGVja2VyLT5hcGlfdmVyc2lvbiA9IGFwaV92ZXJzaW9uOworICAgIHRocmVhZF9jaGVja2VyLT5yZXBvcnRfZGF0YSA9IHJlcG9ydF9kYXRhOworICAgIGF1dG8gcGFyYW1ldGVyX3ZhbGlkYXRpb24gPSBuZXcgU3RhdGVsZXNzVmFsaWRhdGlvbjsKKyAgICBpZiAoIWxvY2FsX2Rpc2FibGVzLnN0YXRlbGVzc19jaGVja3MpIHsKKyAgICAgICAgbG9jYWxfb2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhwYXJhbWV0ZXJfdmFsaWRhdGlvbik7CisgICAgfQorICAgIHBhcmFtZXRlcl92YWxpZGF0aW9uLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZVBhcmFtZXRlclZhbGlkYXRpb247CisgICAgcGFyYW1ldGVyX3ZhbGlkYXRpb24tPmFwaV92ZXJzaW9uID0gYXBpX3ZlcnNpb247CisgICAgcGFyYW1ldGVyX3ZhbGlkYXRpb24tPnJlcG9ydF9kYXRhID0gcmVwb3J0X2RhdGE7CisgICAgYXV0byBvYmplY3RfdHJhY2tlciA9IG5ldyBPYmplY3RMaWZldGltZXM7CisgICAgaWYgKCFsb2NhbF9kaXNhYmxlcy5vYmplY3RfdHJhY2tpbmcpIHsKKyAgICAgICAgbG9jYWxfb2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhvYmplY3RfdHJhY2tlcik7CisgICAgfQorICAgIG9iamVjdF90cmFja2VyLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZU9iamVjdFRyYWNrZXI7CisgICAgb2JqZWN0X3RyYWNrZXItPmFwaV92ZXJzaW9uID0gYXBpX3ZlcnNpb247CisgICAgb2JqZWN0X3RyYWNrZXItPnJlcG9ydF9kYXRhID0gcmVwb3J0X2RhdGE7CisgICAgYXV0byBjb3JlX2NoZWNrcyA9IG5ldyBDb3JlQ2hlY2tzOworICAgIGlmICghbG9jYWxfZGlzYWJsZXMuY29yZV9jaGVja3MpIHsKKyAgICAgICAgbG9jYWxfb2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhjb3JlX2NoZWNrcyk7CisgICAgfQorICAgIGNvcmVfY2hlY2tzLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uOworICAgIGNvcmVfY2hlY2tzLT5hcGlfdmVyc2lvbiA9IGFwaV92ZXJzaW9uOworICAgIGNvcmVfY2hlY2tzLT5yZXBvcnRfZGF0YSA9IHJlcG9ydF9kYXRhOworICAgIGF1dG8gYmVzdF9wcmFjdGljZXMgPSBuZXcgQmVzdFByYWN0aWNlczsKKyAgICBpZiAobG9jYWxfZW5hYmxlcy5iZXN0X3ByYWN0aWNlcykgeworICAgICAgICBsb2NhbF9vYmplY3RfZGlzcGF0Y2guZW1wbGFjZV9iYWNrKGJlc3RfcHJhY3RpY2VzKTsKKyAgICB9CisgICAgYmVzdF9wcmFjdGljZXMtPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlQmVzdFByYWN0aWNlczsKKyAgICBiZXN0X3ByYWN0aWNlcy0+YXBpX3ZlcnNpb24gPSBhcGlfdmVyc2lvbjsKKyAgICBiZXN0X3ByYWN0aWNlcy0+cmVwb3J0X2RhdGEgPSByZXBvcnRfZGF0YTsKKyAgICBhdXRvIGdwdV9hc3Npc3RlZCA9IG5ldyBHcHVBc3Npc3RlZDsKKyAgICBpZiAobG9jYWxfZW5hYmxlcy5ncHVfdmFsaWRhdGlvbikgeworICAgICAgICBsb2NhbF9vYmplY3RfZGlzcGF0Y2guZW1wbGFjZV9iYWNrKGdwdV9hc3Npc3RlZCk7CisgICAgfQorICAgIGdwdV9hc3Npc3RlZC0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVHcHVBc3Npc3RlZDsKKworICAgIC8vIElmIGhhbmRsZSB3cmFwcGluZyBpcyBkaXNhYmxlZCB2aWEgdGhlIFZhbGlkYXRpb25GZWF0dXJlcyBleHRlbnNpb24sIG92ZXJyaWRlIGJ1aWxkIGZsYWcKKyAgICBpZiAobG9jYWxfZGlzYWJsZXMuaGFuZGxlX3dyYXBwaW5nKSB7CisgICAgICAgIHdyYXBfaGFuZGxlcyA9IGZhbHNlOworICAgIH0KKworICAgIC8vIEluaXQgZGlzcGF0Y2ggYXJyYXkgYW5kIGNhbGwgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsb2NhbF9vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVJbnN0YW5jZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluc3RhbmNlKTsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxvY2FsX29iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVJbnN0YW5jZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluc3RhbmNlKTsKKyAgICB9CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBmcENyZWF0ZUluc3RhbmNlKHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuIHJlc3VsdDsKKworICAgIGF1dG8gZnJhbWV3b3JrID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoKnBJbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsKKworICAgIGZyYW1ld29yay0+b2JqZWN0X2Rpc3BhdGNoID0gbG9jYWxfb2JqZWN0X2Rpc3BhdGNoOworICAgIGZyYW1ld29yay0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVJbnN0YW5jZTsKKyAgICBmcmFtZXdvcmstPmRpc2FibGVkID0gbG9jYWxfZGlzYWJsZXM7CisgICAgZnJhbWV3b3JrLT5lbmFibGVkID0gbG9jYWxfZW5hYmxlczsKKworICAgIGZyYW1ld29yay0+aW5zdGFuY2UgPSAqcEluc3RhbmNlOworICAgIGxheWVyX2luaXRfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoKnBJbnN0YW5jZSwgJmZyYW1ld29yay0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUsIGZwR2V0SW5zdGFuY2VQcm9jQWRkcik7CisgICAgZnJhbWV3b3JrLT5yZXBvcnRfZGF0YSA9IHJlcG9ydF9kYXRhOworICAgIGZyYW1ld29yay0+YXBpX3ZlcnNpb24gPSBhcGlfdmVyc2lvbjsKKyAgICBmcmFtZXdvcmstPmluc3RhbmNlX2V4dGVuc2lvbnMuSW5pdEZyb21JbnN0YW5jZUNyZWF0ZUluZm8oc3BlY2lmaWVkX3ZlcnNpb24sIHBDcmVhdGVJbmZvKTsKKworICAgIGxheWVyX2RlYnVnX21lc3Nlbmdlcl9hY3Rpb25zKGZyYW1ld29yay0+cmVwb3J0X2RhdGEsIHBBbGxvY2F0b3IsIE9CSkVDVF9MQVlFUl9ERVNDUklQVElPTik7CisKKyAgICBvYmplY3RfdHJhY2tlci0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUgPSBmcmFtZXdvcmstPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlOworICAgIG9iamVjdF90cmFja2VyLT5lbmFibGVkID0gZnJhbWV3b3JrLT5lbmFibGVkOworICAgIG9iamVjdF90cmFja2VyLT5kaXNhYmxlZCA9IGZyYW1ld29yay0+ZGlzYWJsZWQ7CisgICAgdGhyZWFkX2NoZWNrZXItPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlID0gZnJhbWV3b3JrLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZTsKKyAgICB0aHJlYWRfY2hlY2tlci0+ZW5hYmxlZCA9IGZyYW1ld29yay0+ZW5hYmxlZDsKKyAgICB0aHJlYWRfY2hlY2tlci0+ZGlzYWJsZWQgPSBmcmFtZXdvcmstPmRpc2FibGVkOworICAgIHBhcmFtZXRlcl92YWxpZGF0aW9uLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZSA9IGZyYW1ld29yay0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgcGFyYW1ldGVyX3ZhbGlkYXRpb24tPmVuYWJsZWQgPSBmcmFtZXdvcmstPmVuYWJsZWQ7CisgICAgcGFyYW1ldGVyX3ZhbGlkYXRpb24tPmRpc2FibGVkID0gZnJhbWV3b3JrLT5kaXNhYmxlZDsKKyAgICBjb3JlX2NoZWNrcy0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUgPSBmcmFtZXdvcmstPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlOworICAgIGNvcmVfY2hlY2tzLT5pbnN0YW5jZSA9ICpwSW5zdGFuY2U7CisgICAgY29yZV9jaGVja3MtPmVuYWJsZWQgPSBmcmFtZXdvcmstPmVuYWJsZWQ7CisgICAgY29yZV9jaGVja3MtPmRpc2FibGVkID0gZnJhbWV3b3JrLT5kaXNhYmxlZDsKKyAgICBjb3JlX2NoZWNrcy0+aW5zdGFuY2Vfc3RhdGUgPSBjb3JlX2NoZWNrczsKKyAgICBiZXN0X3ByYWN0aWNlcy0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUgPSBmcmFtZXdvcmstPmluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlOworICAgIGJlc3RfcHJhY3RpY2VzLT5lbmFibGVkID0gZnJhbWV3b3JrLT5lbmFibGVkOworICAgIGJlc3RfcHJhY3RpY2VzLT5kaXNhYmxlZCA9IGZyYW1ld29yay0+ZGlzYWJsZWQ7CisgICAgZ3B1X2Fzc2lzdGVkLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZSA9IGZyYW1ld29yay0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgZ3B1X2Fzc2lzdGVkLT5lbmFibGVkID0gZnJhbWV3b3JrLT5lbmFibGVkOworICAgIGdwdV9hc3Npc3RlZC0+ZGlzYWJsZWQgPSBmcmFtZXdvcmstPmRpc2FibGVkOworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGZyYW1ld29yay0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVJbnN0YW5jZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluc3RhbmNlLCByZXN1bHQpOworICAgIH0KKworICAgIEluc3RhbmNlRXh0ZW5zaW9uV2hpdGVsaXN0KGZyYW1ld29yaywgcENyZWF0ZUluZm8sICpwSW5zdGFuY2UpOworICAgIERlYWN0aXZhdGVJbnN0YW5jZURlYnVnQ2FsbGJhY2tzKHJlcG9ydF9kYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBEZXN0cm95SW5zdGFuY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpOworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihrZXksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBBY3RpdmF0ZUluc3RhbmNlRGVidWdDYWxsYmFja3MobGF5ZXJfZGF0YS0+cmVwb3J0X2RhdGEpOworCisgICAgIiIiICsgcHJlY2FsbHZhbGlkYXRlX2xvb3AgKyAiIiIKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICAiIiIgKyBwcmVjYWxscmVjb3JkX2xvb3AgKyAiIiIKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgcEFsbG9jYXRvcik7CisgICAgfQorCisgICAgbGF5ZXJfZGF0YS0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBwQWxsb2NhdG9yKTsKKworICAgICIiIiArIHBvc3RjYWxscmVjb3JkX2xvb3AgKyAiIiIKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmREZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIHBBbGxvY2F0b3IpOworICAgIH0KKworICAgIERlYWN0aXZhdGVJbnN0YW5jZURlYnVnQ2FsbGJhY2tzKGxheWVyX2RhdGEtPnJlcG9ydF9kYXRhKTsKKyAgICBGcmVlUG5leHRDaGFpbihsYXllcl9kYXRhLT5yZXBvcnRfZGF0YS0+aW5zdGFuY2VfcG5leHRfY2hhaW4pOworCisgICAgbGF5ZXJfZGVidWdfdXRpbHNfZGVzdHJveV9pbnN0YW5jZShsYXllcl9kYXRhLT5yZXBvcnRfZGF0YSk7CisKKyAgICBmb3IgKGF1dG8gaXRlbSA9IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaC5iZWdpbigpOyBpdGVtICE9IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaC5lbmQoKTsgaXRlbSsrKSB7CisgICAgICAgIGRlbGV0ZSAqaXRlbTsKKyAgICB9CisgICAgRnJlZUxheWVyRGF0YVB0cihrZXksIGxheWVyX2RhdGFfbWFwKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIGdwdSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLCBWa0RldmljZSAqcERldmljZSkgeworICAgIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisKKyAgICBhdXRvIGluc3RhbmNlX2ludGVyY2VwdG9yID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZ3B1KSwgbGF5ZXJfZGF0YV9tYXApOworCisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcEdldEluc3RhbmNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGZwR2V0RGV2aWNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXREZXZpY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVEZXZpY2UgZnBDcmVhdGVEZXZpY2UgPSAoUEZOX3ZrQ3JlYXRlRGV2aWNlKWZwR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZV9pbnRlcmNlcHRvci0+aW5zdGFuY2UsICJ2a0NyZWF0ZURldmljZSIpOworICAgIGlmIChmcENyZWF0ZURldmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGNoYWluX2luZm8tPnUucExheWVySW5mbyA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cE5leHQ7CisKKyAgICAvLyBHZXQgcGh5c2ljYWwgZGV2aWNlIGxpbWl0cyBmb3IgZGV2aWNlCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgZGV2aWNlX3Byb3BlcnRpZXMgPSB7fTsKKyAgICBpbnN0YW5jZV9pbnRlcmNlcHRvci0+aW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKGdwdSwgJmRldmljZV9wcm9wZXJ0aWVzKTsKKworICAgIC8vIFNldHVwIHRoZSB2YWxpZGF0aW9uIHRhYmxlcyBiYXNlZCBvbiB0aGUgYXBwbGljYXRpb24gQVBJIHZlcnNpb24gZnJvbSB0aGUgaW5zdGFuY2UgYW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGRldmljZSBkcml2ZXIKKyAgICB1aW50MzJfdCBlZmZlY3RpdmVfYXBpX3ZlcnNpb24gPSBzdGQ6Om1pbihkZXZpY2VfcHJvcGVydGllcy5hcGlWZXJzaW9uLCBpbnN0YW5jZV9pbnRlcmNlcHRvci0+YXBpX3ZlcnNpb24pOworCisgICAgRGV2aWNlRXh0ZW5zaW9ucyBkZXZpY2VfZXh0ZW5zaW9ucyA9IHt9OworICAgIGRldmljZV9leHRlbnNpb25zLkluaXRGcm9tRGV2aWNlQ3JlYXRlSW5mbygmaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmluc3RhbmNlX2V4dGVuc2lvbnMsIGVmZmVjdGl2ZV9hcGlfdmVyc2lvbiwgcENyZWF0ZUluZm8pOworICAgIGZvciAoYXV0byBpdGVtIDogaW5zdGFuY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBpdGVtLT5kZXZpY2VfZXh0ZW5zaW9ucyA9IGRldmljZV9leHRlbnNpb25zOworICAgIH0KKworICAgIHNhZmVfVmtEZXZpY2VDcmVhdGVJbmZvIG1vZGlmaWVkX2NyZWF0ZV9pbmZvKHBDcmVhdGVJbmZvKTsKKworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBpbnN0YW5jZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVEZXZpY2UoZ3B1LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogaW5zdGFuY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKGdwdSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXZpY2UsICZtb2RpZmllZF9jcmVhdGVfaW5mbyk7CisgICAgfQorCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZnBDcmVhdGVEZXZpY2UoZ3B1LCByZWludGVycHJldF9jYXN0PFZrRGV2aWNlQ3JlYXRlSW5mbyAqPigmbW9kaWZpZWRfY3JlYXRlX2luZm8pLCBwQWxsb2NhdG9yLCBwRGV2aWNlKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBhdXRvIGRldmljZV9pbnRlcmNlcHRvciA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KCpwRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGRldmljZV9pbnRlcmNlcHRvci0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVEZXZpY2U7CisKKyAgICAvLyBTYXZlIGxvY2FsIGluZm8gaW4gZGV2aWNlIG9iamVjdAorICAgIGRldmljZV9pbnRlcmNlcHRvci0+cGh5c19kZXZfcHJvcGVydGllcy5wcm9wZXJ0aWVzID0gZGV2aWNlX3Byb3BlcnRpZXM7CisgICAgZGV2aWNlX2ludGVyY2VwdG9yLT5hcGlfdmVyc2lvbiA9IGRldmljZV9pbnRlcmNlcHRvci0+ZGV2aWNlX2V4dGVuc2lvbnMuSW5pdEZyb21EZXZpY2VDcmVhdGVJbmZvKAorICAgICAgICAmaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmluc3RhbmNlX2V4dGVuc2lvbnMsIGVmZmVjdGl2ZV9hcGlfdmVyc2lvbiwgcENyZWF0ZUluZm8pOworICAgIGRldmljZV9pbnRlcmNlcHRvci0+ZGV2aWNlX2V4dGVuc2lvbnMgPSBkZXZpY2VfZXh0ZW5zaW9uczsKKworICAgIGxheWVyX2luaXRfZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKCpwRGV2aWNlLCAmZGV2aWNlX2ludGVyY2VwdG9yLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUsIGZwR2V0RGV2aWNlUHJvY0FkZHIpOworCisgICAgZGV2aWNlX2ludGVyY2VwdG9yLT5kZXZpY2UgPSAqcERldmljZTsKKyAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPnBoeXNpY2FsX2RldmljZSA9IGdwdTsKKyAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPmluc3RhbmNlID0gaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmluc3RhbmNlOworICAgIGRldmljZV9pbnRlcmNlcHRvci0+cmVwb3J0X2RhdGEgPSBpbnN0YW5jZV9pbnRlcmNlcHRvci0+cmVwb3J0X2RhdGE7CisKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBkZWZpbmVzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgbGF5ZXIgdmFsaWRhdGlvbiBvYmplY3RzIGFyZSBjYWxsZWQKKyAgICBhdXRvIHRocmVhZF9zYWZldHkgPSBuZXcgVGhyZWFkU2FmZXR5KHJlaW50ZXJwcmV0X2Nhc3Q8VGhyZWFkU2FmZXR5ICo+KGluc3RhbmNlX2ludGVyY2VwdG9yLT5HZXRWYWxpZGF0aW9uT2JqZWN0KGluc3RhbmNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2gsIExheWVyT2JqZWN0VHlwZVRocmVhZGluZykpKTsKKyAgICB0aHJlYWRfc2FmZXR5LT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZVRocmVhZGluZzsKKyAgICBpZiAoIWluc3RhbmNlX2ludGVyY2VwdG9yLT5kaXNhYmxlZC50aHJlYWRfc2FmZXR5KSB7CisgICAgICAgIGRldmljZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayh0aHJlYWRfc2FmZXR5KTsKKyAgICB9CisgICAgYXV0byBzdGF0ZWxlc3NfdmFsaWRhdGlvbiA9IG5ldyBTdGF0ZWxlc3NWYWxpZGF0aW9uOworICAgIHN0YXRlbGVzc192YWxpZGF0aW9uLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZVBhcmFtZXRlclZhbGlkYXRpb247CisgICAgaWYgKCFpbnN0YW5jZV9pbnRlcmNlcHRvci0+ZGlzYWJsZWQuc3RhdGVsZXNzX2NoZWNrcykgeworICAgICAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaC5lbXBsYWNlX2JhY2soc3RhdGVsZXNzX3ZhbGlkYXRpb24pOworICAgIH0KKyAgICBhdXRvIG9iamVjdF90cmFja2VyID0gbmV3IE9iamVjdExpZmV0aW1lczsKKyAgICBvYmplY3RfdHJhY2tlci0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVPYmplY3RUcmFja2VyOworICAgIGlmICghaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmRpc2FibGVkLm9iamVjdF90cmFja2luZykgeworICAgICAgICBkZXZpY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaC5lbXBsYWNlX2JhY2sob2JqZWN0X3RyYWNrZXIpOworICAgIH0KKyAgICBhdXRvIGNvcmVfY2hlY2tzID0gbmV3IENvcmVDaGVja3M7CisgICAgY29yZV9jaGVja3MtPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlQ29yZVZhbGlkYXRpb247CisgICAgY29yZV9jaGVja3MtPmluc3RhbmNlX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxDb3JlQ2hlY2tzICo+KAorICAgICAgICBjb3JlX2NoZWNrcy0+R2V0VmFsaWRhdGlvbk9iamVjdChpbnN0YW5jZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVDb3JlVmFsaWRhdGlvbikpOworICAgIGlmICghaW5zdGFuY2VfaW50ZXJjZXB0b3ItPmRpc2FibGVkLmNvcmVfY2hlY2tzKSB7CisgICAgICAgIC8vIE9ubHkgZW5hYmxlIHRoZSBjb21tYW5kIGNvdW50ZXJzIHdoZW4gbmVlZGVkLgorICAgICAgICBpZiAoZGV2aWNlX2V4dGVuc2lvbnMudmtfa2hyX3BlcmZvcm1hbmNlX3F1ZXJ5KSB7CisgICAgICAgICAgICBhdXRvIGNvbW1hbmRfY291bnRlciA9IG5ldyBDb21tYW5kQ291bnRlcihjb3JlX2NoZWNrcyk7CisgICAgICAgICAgICBjb21tYW5kX2NvdW50ZXItPmNvbnRhaW5lcl90eXBlID0gTGF5ZXJPYmplY3RUeXBlRGV2aWNlOworICAgICAgICAgICAgZGV2aWNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2guZW1wbGFjZV9iYWNrKGNvbW1hbmRfY291bnRlcik7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2guZW1wbGFjZV9iYWNrKGNvcmVfY2hlY2tzKTsKKyAgICB9CisgICAgYXV0byBiZXN0X3ByYWN0aWNlcyA9IG5ldyBCZXN0UHJhY3RpY2VzOworICAgIGJlc3RfcHJhY3RpY2VzLT5jb250YWluZXJfdHlwZSA9IExheWVyT2JqZWN0VHlwZUJlc3RQcmFjdGljZXM7CisgICAgYmVzdF9wcmFjdGljZXMtPmluc3RhbmNlX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxCZXN0UHJhY3RpY2VzICo+KAorICAgICAgICBiZXN0X3ByYWN0aWNlcy0+R2V0VmFsaWRhdGlvbk9iamVjdChpbnN0YW5jZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLCBMYXllck9iamVjdFR5cGVCZXN0UHJhY3RpY2VzKSk7CisgICAgaWYgKGluc3RhbmNlX2ludGVyY2VwdG9yLT5lbmFibGVkLmJlc3RfcHJhY3RpY2VzKSB7CisgICAgICAgIGRldmljZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhiZXN0X3ByYWN0aWNlcyk7CisgICAgfQorICAgIGF1dG8gZ3B1X2Fzc2lzdGVkID0gbmV3IEdwdUFzc2lzdGVkOworICAgIGdwdV9hc3Npc3RlZC0+Y29udGFpbmVyX3R5cGUgPSBMYXllck9iamVjdFR5cGVHcHVBc3Npc3RlZDsKKyAgICBncHVfYXNzaXN0ZWQtPmluc3RhbmNlX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxHcHVBc3Npc3RlZCAqPigKKyAgICAgICAgZ3B1X2Fzc2lzdGVkLT5HZXRWYWxpZGF0aW9uT2JqZWN0KGluc3RhbmNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2gsIExheWVyT2JqZWN0VHlwZUdwdUFzc2lzdGVkKSk7CisgICAgaWYgKGluc3RhbmNlX2ludGVyY2VwdG9yLT5lbmFibGVkLmdwdV92YWxpZGF0aW9uKSB7CisgICAgICAgIGRldmljZV9pbnRlcmNlcHRvci0+b2JqZWN0X2Rpc3BhdGNoLmVtcGxhY2VfYmFjayhncHVfYXNzaXN0ZWQpOworICAgIH0KKworICAgIC8vIFNldCBwZXItaW50ZXJjZXB0IGNvbW1vbiBkYXRhIGl0ZW1zCisgICAgZm9yIChhdXRvIGRldl9pbnRlcmNlcHQgOiBkZXZpY2VfaW50ZXJjZXB0b3ItPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBkZXZfaW50ZXJjZXB0LT5kZXZpY2UgPSAqcERldmljZTsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+cGh5c2ljYWxfZGV2aWNlID0gZ3B1OworICAgICAgICBkZXZfaW50ZXJjZXB0LT5pbnN0YW5jZSA9IGluc3RhbmNlX2ludGVyY2VwdG9yLT5pbnN0YW5jZTsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+cmVwb3J0X2RhdGEgPSBkZXZpY2VfaW50ZXJjZXB0b3ItPnJlcG9ydF9kYXRhOworICAgICAgICBkZXZfaW50ZXJjZXB0LT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUgPSBkZXZpY2VfaW50ZXJjZXB0b3ItPmRldmljZV9kaXNwYXRjaF90YWJsZTsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+YXBpX3ZlcnNpb24gPSBkZXZpY2VfaW50ZXJjZXB0b3ItPmFwaV92ZXJzaW9uOworICAgICAgICBkZXZfaW50ZXJjZXB0LT5kaXNhYmxlZCA9IGluc3RhbmNlX2ludGVyY2VwdG9yLT5kaXNhYmxlZDsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+ZW5hYmxlZCA9IGluc3RhbmNlX2ludGVyY2VwdG9yLT5lbmFibGVkOworICAgICAgICBkZXZfaW50ZXJjZXB0LT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZSA9IGluc3RhbmNlX2ludGVyY2VwdG9yLT5pbnN0YW5jZV9kaXNwYXRjaF90YWJsZTsKKyAgICAgICAgZGV2X2ludGVyY2VwdC0+aW5zdGFuY2VfZXh0ZW5zaW9ucyA9IGluc3RhbmNlX2ludGVyY2VwdG9yLT5pbnN0YW5jZV9leHRlbnNpb25zOworICAgICAgICBkZXZfaW50ZXJjZXB0LT5kZXZpY2VfZXh0ZW5zaW9ucyA9IGRldmljZV9pbnRlcmNlcHRvci0+ZGV2aWNlX2V4dGVuc2lvbnM7CisgICAgfQorCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGluc3RhbmNlX2ludGVyY2VwdG9yLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVEZXZpY2UoZ3B1LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBEZXZpY2VFeHRlbnNpb25XaGl0ZWxpc3QoZGV2aWNlX2ludGVyY2VwdG9yLCBwQ3JlYXRlSW5mbywgKnBEZXZpY2UpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveURldmljZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSk7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGtleSwgbGF5ZXJfZGF0YV9tYXApOworICAgICIiIiArIHByZWNhbGx2YWxpZGF0ZV9sb29wICsgIiIiCisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlRGVzdHJveURldmljZShkZXZpY2UsIHBBbGxvY2F0b3IpOworICAgIH0KKyAgICAiIiIgKyBwcmVjYWxscmVjb3JkX2xvb3AgKyAiIiIKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXZpY2UoZGV2aWNlLCBwQWxsb2NhdG9yKTsKKyAgICB9CisKKyAgICBsYXllcl9kYXRhLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGUuRGVzdHJveURldmljZShkZXZpY2UsIHBBbGxvY2F0b3IpOworCisgICAgIiIiICsgcG9zdGNhbGxyZWNvcmRfbG9vcCArICIiIgorICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZERlc3Ryb3lEZXZpY2UoZGV2aWNlLCBwQWxsb2NhdG9yKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gaXRlbSA9IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaC5iZWdpbigpOyBpdGVtICE9IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaC5lbmQoKTsgaXRlbSsrKSB7CisgICAgICAgIGRlbGV0ZSAqaXRlbTsKKyAgICB9CisgICAgRnJlZUxheWVyRGF0YVB0cihrZXksIGxheWVyX2RhdGFfbWFwKTsKK30KKworCisvLyBTcGVjaWFsLWNhc2UgQVBJcyBmb3Igd2hpY2ggY29yZV92YWxpZGF0aW9uIG5lZWRzIGN1c3RvbSBwYXJhbWV0ZXIgbGlzdHMgYW5kL29yIG1vZGlmaWVzIHBhcmFtZXRlcnMKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICAgIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgY3JlYXRlX2dyYXBoaWNzX3BpcGVsaW5lX2FwaV9zdGF0ZSBjZ3BsX3N0YXRlW0xheWVyT2JqZWN0VHlwZU1heEVudW1de307CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGNncGxfc3RhdGVbaW50ZXJjZXB0LT5jb250YWluZXJfdHlwZV0ucENyZWF0ZUluZm9zID0gcENyZWF0ZUluZm9zOworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgJihjZ3BsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdKSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzLCAmKGNncGxfc3RhdGVbaW50ZXJjZXB0LT5jb250YWluZXJfdHlwZV0pKTsKKyAgICB9CisKKyAgICBhdXRvIHVzZXBDcmVhdGVJbmZvcyA9ICghY2dwbF9zdGF0ZVtMYXllck9iamVjdFR5cGVHcHVBc3Npc3RlZF0ucENyZWF0ZUluZm9zKSA/IHBDcmVhdGVJbmZvcyA6IGNncGxfc3RhdGVbTGF5ZXJPYmplY3RUeXBlR3B1QXNzaXN0ZWRdLnBDcmVhdGVJbmZvczsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHVzZXBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyk7CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgcmVzdWx0LCAmKGNncGxfc3RhdGVbaW50ZXJjZXB0LT5jb250YWluZXJfdHlwZV0pKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVGhpcyBBUEkgc2F2ZXMgc29tZSBjb3JlX3ZhbGlkYXRpb24gcGlwZWxpbmUgc3RhdGUgc3RhdGUgb24gdGhlIHN0YWNrIGZvciBwZXJmb3JtYW5jZSBwdXJwb3NlcworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm9zLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZXMpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBjcmVhdGVfY29tcHV0ZV9waXBlbGluZV9hcGlfc3RhdGUgY2NwbF9zdGF0ZVtMYXllck9iamVjdFR5cGVNYXhFbnVtXXt9OworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBjY3BsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdLnBDcmVhdGVJbmZvcyA9IHBDcmVhdGVJbmZvczsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgJihjY3BsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdKSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsICYoY2NwbF9zdGF0ZVtpbnRlcmNlcHQtPmNvbnRhaW5lcl90eXBlXSkpOworICAgIH0KKworICAgIGF1dG8gdXNlcENyZWF0ZUluZm9zID0gKCFjY3BsX3N0YXRlW0xheWVyT2JqZWN0VHlwZUdwdUFzc2lzdGVkXS5wQ3JlYXRlSW5mb3MpID8gcENyZWF0ZUluZm9zIDogY2NwbF9zdGF0ZVtMYXllck9iamVjdFR5cGVHcHVBc3Npc3RlZF0ucENyZWF0ZUluZm9zOworCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCB1c2VwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworCisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgcmVzdWx0LCAmKGNjcGxfc3RhdGVbaW50ZXJjZXB0LT5jb250YWluZXJfdHlwZV0pKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmZvQ291bnQsCisgICAgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNyZWF0ZV9yYXlfdHJhY2luZ19waXBlbGluZV9hcGlfc3RhdGUgY3J0cGxfc3RhdGVbTGF5ZXJPYmplY3RUeXBlTWF4RW51bV17fTsKKworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgY3J0cGxfc3RhdGVbaW50ZXJjZXB0LT5jb250YWluZXJfdHlwZV0ucENyZWF0ZUluZm9zID0gcENyZWF0ZUluZm9zOworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOworICAgICAgICBza2lwIHw9IChjb25zdF9jYXN0PGNvbnN0IFZhbGlkYXRpb25PYmplY3QqPihpbnRlcmNlcHQpKS0+UHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgJihjcnRwbF9zdGF0ZVtpbnRlcmNlcHQtPmNvbnRhaW5lcl90eXBlXSkpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVzLCAmKGNydHBsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdKSk7CisgICAgfQorCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyk7CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlBvc3RDYWxsUmVjb3JkQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcywgcmVzdWx0LCAmKGNydHBsX3N0YXRlW2ludGVyY2VwdC0+Y29udGFpbmVyX3R5cGVdKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgQVBJIG5lZWRzIHRoZSBhYmlsaXR5IHRvIG1vZGlmeSBhIGRvd24tY2hhaW4gcGFyYW1ldGVyCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisKKyAgICBjcmVhdGVfcGlwZWxpbmVfbGF5b3V0X2FwaV9zdGF0ZSBjcGxfc3RhdGV7fTsKKyAgICBjcGxfc3RhdGUubW9kaWZpZWRfY3JlYXRlX2luZm8gPSAqcENyZWF0ZUluZm87CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVQaXBlbGluZUxheW91dChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVMYXlvdXQpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVMYXlvdXQoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFBpcGVsaW5lTGF5b3V0LCAmY3BsX3N0YXRlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVQaXBlbGluZUxheW91dChkZXZpY2UsICZjcGxfc3RhdGUubW9kaWZpZWRfY3JlYXRlX2luZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUxheW91dCk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZENyZWF0ZVBpcGVsaW5lTGF5b3V0KGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUxheW91dCwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVGhpcyBBUEkgbmVlZHMgc29tZSBsb2NhbCBzdGFjayBkYXRhIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIGFuZCBhbHNvIG1heSBtb2RpZnkgYSBwYXJhbWV0ZXIKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVTaGFkZXJNb2R1bGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTaGFkZXJNb2R1bGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGVyTW9kdWxlKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgY3JlYXRlX3NoYWRlcl9tb2R1bGVfYXBpX3N0YXRlIGNzbV9zdGF0ZXt9OworICAgIGNzbV9zdGF0ZS5pbnN0cnVtZW50ZWRfY3JlYXRlX2luZm8gPSAqcENyZWF0ZUluZm87CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVTaGFkZXJNb2R1bGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNoYWRlck1vZHVsZSwgJmNzbV9zdGF0ZSk7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVTaGFkZXJNb2R1bGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNoYWRlck1vZHVsZSwgJmNzbV9zdGF0ZSk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgJmNzbV9zdGF0ZS5pbnN0cnVtZW50ZWRfY3JlYXRlX2luZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVTaGFkZXJNb2R1bGUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFNoYWRlck1vZHVsZSwgcmVzdWx0LCAmY3NtX3N0YXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEFsbG9jYXRlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiAgICAgICAgICBwQWxsb2NhdGVJbmZvLAorICAgIFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKSB7CisgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworCisgICAgY3ZkZXNjcmlwdG9yc2V0OjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzRGF0YSBhZHNfc3RhdGUocEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50KTsKKworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT5yZWFkX2xvY2soKTsKKyAgICAgICAgc2tpcCB8PSAoY29uc3RfY2FzdDxjb25zdCBWYWxpZGF0aW9uT2JqZWN0Kj4oaW50ZXJjZXB0KSktPlByZUNhbGxWYWxpZGF0ZUFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMsICZhZHNfc3RhdGUpOworICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5QcmVDYWxsUmVjb3JkQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBEZXNjcmlwdG9yU2V0cyk7CisgICAgfQorICAgIFZrUmVzdWx0IHJlc3VsdCA9IERpc3BhdGNoQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBEZXNjcmlwdG9yU2V0cyk7CisgICAgZm9yIChhdXRvIGludGVyY2VwdCA6IGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCkgeworICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPndyaXRlX2xvY2soKTsKKyAgICAgICAgaW50ZXJjZXB0LT5Qb3N0Q2FsbFJlY29yZEFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMsIHJlc3VsdCwgJmFkc19zdGF0ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgQVBJIG5lZWRzIHRoZSBhYmlsaXR5IHRvIG1vZGlmeSBhIGRvd24tY2hhaW4gcGFyYW1ldGVyCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKworICAgIGNyZWF0ZV9idWZmZXJfYXBpX3N0YXRlIGNiX3N0YXRle307CisgICAgY2Jfc3RhdGUubW9kaWZpZWRfY3JlYXRlX2luZm8gPSAqcENyZWF0ZUluZm87CisKKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+cmVhZF9sb2NrKCk7CisgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGVDcmVhdGVCdWZmZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEJ1ZmZlcik7CisgICAgICAgIGlmIChza2lwKSByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKyAgICBmb3IgKGF1dG8gaW50ZXJjZXB0IDogbGF5ZXJfZGF0YS0+b2JqZWN0X2Rpc3BhdGNoKSB7CisgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOworICAgICAgICBpbnRlcmNlcHQtPlByZUNhbGxSZWNvcmRDcmVhdGVCdWZmZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEJ1ZmZlciwgJmNiX3N0YXRlKTsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gRGlzcGF0Y2hDcmVhdGVCdWZmZXIoZGV2aWNlLCAmY2Jfc3RhdGUubW9kaWZpZWRfY3JlYXRlX2luZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIpOworICAgIGZvciAoYXV0byBpbnRlcmNlcHQgOiBsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gpIHsKKyAgICAgICAgYXV0byBsb2NrID0gaW50ZXJjZXB0LT53cml0ZV9sb2NrKCk7CisgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmRDcmVhdGVCdWZmZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEJ1ZmZlciwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisKKy8vIFZhbGlkYXRpb25DYWNoZSBBUElzIGRvIG5vdCBkaXNwYXRjaAorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgICAgICAgcFZhbGlkYXRpb25DYWNoZSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBWS19TVUNDRVNTOworCisgICAgVmFsaWRhdGlvbk9iamVjdCAqdmFsaWRhdGlvbl9kYXRhID0gbGF5ZXJfZGF0YS0+R2V0VmFsaWRhdGlvbk9iamVjdChsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gsIExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uKTsKKyAgICBpZiAodmFsaWRhdGlvbl9kYXRhKSB7CisgICAgICAgIGF1dG8gbG9jayA9IHZhbGlkYXRpb25fZGF0YS0+d3JpdGVfbG9jaygpOworICAgICAgICByZXN1bHQgPSB2YWxpZGF0aW9uX2RhdGEtPkNvcmVMYXllckNyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwVmFsaWRhdGlvbkNhY2hlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1ZhbGlkYXRpb25DYWNoZUVYVCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBhdXRvIGxheWVyX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7CisKKyAgICBWYWxpZGF0aW9uT2JqZWN0ICp2YWxpZGF0aW9uX2RhdGEgPSBsYXllcl9kYXRhLT5HZXRWYWxpZGF0aW9uT2JqZWN0KGxheWVyX2RhdGEtPm9iamVjdF9kaXNwYXRjaCwgTGF5ZXJPYmplY3RUeXBlQ29yZVZhbGlkYXRpb24pOworICAgIGlmICh2YWxpZGF0aW9uX2RhdGEpIHsKKyAgICAgICAgYXV0byBsb2NrID0gdmFsaWRhdGlvbl9kYXRhLT53cml0ZV9sb2NrKCk7CisgICAgICAgIHZhbGlkYXRpb25fZGF0YS0+Q29yZUxheWVyRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVChkZXZpY2UsIHZhbGlkYXRpb25DYWNoZSwgcEFsbG9jYXRvcik7CisgICAgfQorfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2FjaGUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNDYWNoZUNvdW50LAorICAgIGNvbnN0IFZrVmFsaWRhdGlvbkNhY2hlRVhUKiAgICAgICAgICAgICAgICAgcFNyY0NhY2hlcykgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBWS19TVUNDRVNTOworCisgICAgVmFsaWRhdGlvbk9iamVjdCAqdmFsaWRhdGlvbl9kYXRhID0gbGF5ZXJfZGF0YS0+R2V0VmFsaWRhdGlvbk9iamVjdChsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gsIExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uKTsKKyAgICBpZiAodmFsaWRhdGlvbl9kYXRhKSB7CisgICAgICAgIGF1dG8gbG9jayA9IHZhbGlkYXRpb25fZGF0YS0+d3JpdGVfbG9jaygpOworICAgICAgICByZXN1bHQgPSB2YWxpZGF0aW9uX2RhdGEtPkNvcmVMYXllck1lcmdlVmFsaWRhdGlvbkNhY2hlc0VYVChkZXZpY2UsIGRzdENhY2hlLCBzcmNDYWNoZUNvdW50LCBwU3JjQ2FjaGVzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtWYWxpZGF0aW9uQ2FjaGVFWFQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkgeworICAgIGF1dG8gbGF5ZXJfZGF0YSA9IEdldExheWVyRGF0YVB0cihnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSksIGxheWVyX2RhdGFfbWFwKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBWS19TVUNDRVNTOworCisgICAgVmFsaWRhdGlvbk9iamVjdCAqdmFsaWRhdGlvbl9kYXRhID0gbGF5ZXJfZGF0YS0+R2V0VmFsaWRhdGlvbk9iamVjdChsYXllcl9kYXRhLT5vYmplY3RfZGlzcGF0Y2gsIExheWVyT2JqZWN0VHlwZUNvcmVWYWxpZGF0aW9uKTsKKyAgICBpZiAodmFsaWRhdGlvbl9kYXRhKSB7CisgICAgICAgIGF1dG8gbG9jayA9IHZhbGlkYXRpb25fZGF0YS0+d3JpdGVfbG9jaygpOworICAgICAgICByZXN1bHQgPSB2YWxpZGF0aW9uX2RhdGEtPkNvcmVMYXllckdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoZGV2aWNlLCB2YWxpZGF0aW9uQ2FjaGUsIHBEYXRhU2l6ZSwgcERhdGEpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworCit9IiIiCisKKyAgICBpbmxpbmVfY3VzdG9tX3ZhbGlkYXRpb25fY2xhc3NfZGVmaW5pdGlvbnMgPSAiIiIKKyAgICAgICAgdmlydHVhbCBWa1Jlc3VsdCBDb3JlTGF5ZXJDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1ZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm9FWFQqIHBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrVmFsaWRhdGlvbkNhY2hlRVhUKiBwVmFsaWRhdGlvbkNhY2hlKSB7IHJldHVybiBWS19TVUNDRVNTOyB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgQ29yZUxheWVyRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVChWa0RldmljZSBkZXZpY2UsIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKSB7fTsKKyAgICAgICAgdmlydHVhbCBWa1Jlc3VsdCBDb3JlTGF5ZXJNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCBkc3RDYWNoZSwgdWludDMyX3Qgc3JjQ2FjaGVDb3VudCwgY29uc3QgVmtWYWxpZGF0aW9uQ2FjaGVFWFQqIHBTcmNDYWNoZXMpICB7IHJldHVybiBWS19TVUNDRVNTOyB9OworICAgICAgICB2aXJ0dWFsIFZrUmVzdWx0IENvcmVMYXllckdldFZhbGlkYXRpb25DYWNoZURhdGFFWFQoVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25DYWNoZUVYVCB2YWxpZGF0aW9uQ2FjaGUsIHNpemVfdCogcERhdGFTaXplLCB2b2lkKiBwRGF0YSkgIHsgcmV0dXJuIFZLX1NVQ0NFU1M7IH07CisKKyAgICAgICAgLy8gQWxsb3cgYWRkaXRpb25hbCBzdGF0ZSBwYXJhbWV0ZXIgZm9yIENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzCisgICAgICAgIHZpcnR1YWwgYm9vbCBQcmVDYWxsVmFsaWRhdGVDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCB2b2lkKiBjZ3BsX3N0YXRlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyk7CisgICAgICAgIH07CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywgdm9pZCogY2dwbF9zdGF0ZSkgeworICAgICAgICAgICAgUHJlQ2FsbFJlY29yZENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCBWa1Jlc3VsdCByZXN1bHQsIHZvaWQqIGNncGxfc3RhdGUpIHsKKyAgICAgICAgICAgIFBvc3RDYWxsUmVjb3JkQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcywgcmVzdWx0KTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBBbGxvdyBhZGRpdGlvbmFsIHN0YXRlIHBhcmFtZXRlciBmb3IgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsIHZvaWQqIHBpcGVfc3RhdGUpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBQcmVDYWxsVmFsaWRhdGVDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUNvbXB1dGVQaXBlbGluZXMoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCB2b2lkKiBjY3BsX3N0YXRlKSB7CisgICAgICAgICAgICBQcmVDYWxsUmVjb3JkQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICAgICAgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMsIFZrUmVzdWx0IHJlc3VsdCwgdm9pZCogcGlwZV9zdGF0ZSkgeworICAgICAgICAgICAgUG9zdENhbGxSZWNvcmRDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIHJlc3VsdCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWxsb3cgYWRkaXRpb25hbCBzdGF0ZSBwYXJhbWV0ZXIgZm9yIENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCB2b2lkKiBwaXBlX3N0YXRlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihWa0RldmljZSBkZXZpY2UsIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLCB1aW50MzJfdCBjcmVhdGVJbmZvQ291bnQsIGNvbnN0IFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WKiBwQ3JlYXRlSW5mb3MsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZSogcFBpcGVsaW5lcywgdm9pZCogY2NwbF9zdGF0ZSkgeworICAgICAgICAgICAgUHJlQ2FsbFJlY29yZENyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNyZWF0ZUluZm9Db3VudCwgcENyZWF0ZUluZm9zLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVzKTsKKyAgICAgICAgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwgY29uc3QgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYqIHBDcmVhdGVJbmZvcywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1BpcGVsaW5lKiBwUGlwZWxpbmVzLCBWa1Jlc3VsdCByZXN1bHQsIHZvaWQqIHBpcGVfc3RhdGUpIHsKKyAgICAgICAgICAgIFBvc3RDYWxsUmVjb3JkQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMsIHJlc3VsdCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWxsb3cgbW9kaWZpY2F0aW9uIG9mIGEgZG93bi1jaGFpbiBwYXJhbWV0ZXIgZm9yIENyZWF0ZVBpcGVsaW5lTGF5b3V0CisgICAgICAgIHZpcnR1YWwgdm9pZCBQcmVDYWxsUmVjb3JkQ3JlYXRlUGlwZWxpbmVMYXlvdXQoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtQaXBlbGluZUxheW91dCogcFBpcGVsaW5lTGF5b3V0LCB2b2lkICpjcGxfc3RhdGUpIHsKKyAgICAgICAgICAgIFByZUNhbGxSZWNvcmRDcmVhdGVQaXBlbGluZUxheW91dChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwUGlwZWxpbmVMYXlvdXQpOworICAgICAgICB9OworCisgICAgICAgIC8vIEVuYWJsZSB0aGUgQ3JlYXRlU2hhZGVyTW9kdWxlIEFQSSB0byB0YWtlIGFuIGV4dHJhIGFyZ3VtZW50IGZvciBzdGF0ZSBwcmVzZXJ2YXRpb24gYW5kIHBhcmFtdGVyIG1vZGlmaWNhdGlvbgorICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhZGVyTW9kdWxlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSwgdm9pZCogY3NtX3N0YXRlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtTaGFkZXJNb2R1bGUqIHBTaGFkZXJNb2R1bGUsIHZvaWQqIGNzbV9zdGF0ZSkgeworICAgICAgICAgICAgUHJlQ2FsbFJlY29yZENyZWF0ZVNoYWRlck1vZHVsZShkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2hhZGVyTW9kdWxlKTsKKyAgICAgICAgfTsKKyAgICAgICAgdmlydHVhbCB2b2lkIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2hhZGVyTW9kdWxlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1NoYWRlck1vZHVsZSogcFNoYWRlck1vZHVsZSwgVmtSZXN1bHQgcmVzdWx0LCB2b2lkKiBjc21fc3RhdGUpIHsKKyAgICAgICAgICAgIFBvc3RDYWxsUmVjb3JkQ3JlYXRlU2hhZGVyTW9kdWxlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTaGFkZXJNb2R1bGUsIHJlc3VsdCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWxsb3cgQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyB0byB1c2Ugc29tZSBsb2NhbCBzdGFjayBzdG9yYWdlIGZvciBwZXJmb3JtYW5jZSBwdXJwb3NlcworICAgICAgICB2aXJ0dWFsIGJvb2wgUHJlQ2FsbFZhbGlkYXRlQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIHZvaWQqIGFkc19zdGF0ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFByZUNhbGxWYWxpZGF0ZUFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMpOworICAgICAgICB9OworICAgICAgICB2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmRBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cywgVmtSZXN1bHQgcmVzdWx0LCB2b2lkKiBhZHNfc3RhdGUpICB7CisgICAgICAgICAgICBQb3N0Q2FsbFJlY29yZEFsbG9jYXRlRGVzY3JpcHRvclNldHMoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwRGVzY3JpcHRvclNldHMsIHJlc3VsdCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWxsb3cgbW9kaWZpY2F0aW9uIG9mIGEgZG93bi1jaGFpbiBwYXJhbWV0ZXIgZm9yIENyZWF0ZUJ1ZmZlcgorICAgICAgICB2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZENyZWF0ZUJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwgVmtCdWZmZXIqIHBCdWZmZXIsIHZvaWQgKmNiX3N0YXRlKSB7CisgICAgICAgICAgICBQcmVDYWxsUmVjb3JkQ3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBCdWZmZXIpOworICAgICAgICB9OworCisgICAgICAgIC8vIE1vZGlmeSBhIHBhcmFtZXRlciB0byBDcmVhdGVEZXZpY2UKKyAgICAgICAgdmlydHVhbCB2b2lkIFByZUNhbGxSZWNvcmRDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa0RldmljZSogcERldmljZSwgc2FmZV9Wa0RldmljZUNyZWF0ZUluZm8gKm1vZGlmaWVkX2NyZWF0ZV9pbmZvKSB7CisgICAgICAgICAgICBQcmVDYWxsUmVjb3JkQ3JlYXRlRGV2aWNlKHBoeXNpY2FsRGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSk7CisgICAgICAgIH07CisiIiIKKworICAgIGlubGluZV9jdXN0b21fc291cmNlX3Bvc3RhbWJsZSA9ICIiIgorLy8gbG9hZGVyLWxheWVyIGludGVyZmFjZSB2MCwganVzdCB3cmFwcGVycyBzaW5jZSB0aGVyZSBpcyBvbmx5IGEgbGF5ZXIKKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgcmV0dXJuIHZ1bGthbl9sYXllcl9jaGFzc2lzOjpFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMocExheWVyTmFtZSwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiB2dWxrYW5fbGF5ZXJfY2hhc3Npczo6RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMocENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgLy8gdGhlIGxheWVyIGNvbW1hbmQgaGFuZGxlcyBWS19OVUxMX0hBTkRMRSBqdXN0IGZpbmUgaW50ZXJuYWxseQorICAgIGFzc2VydChwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSk7CisgICAgcmV0dXJuIHZ1bGthbl9sYXllcl9jaGFzc2lzOjpFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVktfTlVMTF9IQU5ETEUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICAvLyB0aGUgbGF5ZXIgY29tbWFuZCBoYW5kbGVzIFZLX05VTExfSEFORExFIGp1c3QgZmluZSBpbnRlcm5hbGx5CisgICAgYXNzZXJ0KHBoeXNpY2FsRGV2aWNlID09IFZLX05VTExfSEFORExFKTsKKyAgICByZXR1cm4gdnVsa2FuX2xheWVyX2NoYXNzaXM6OkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoVktfTlVMTF9IQU5ETEUsIHBMYXllck5hbWUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldERldmljZVByb2NBZGRyKFZrRGV2aWNlIGRldiwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gdnVsa2FuX2xheWVyX2NoYXNzaXM6OkdldERldmljZVByb2NBZGRyKGRldiwgZnVuY05hbWUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gdnVsa2FuX2xheWVyX2NoYXNzaXM6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbihWa05lZ290aWF0ZUxheWVySW50ZXJmYWNlICpwVmVyc2lvblN0cnVjdCkgeworICAgIGFzc2VydChwVmVyc2lvblN0cnVjdCAhPSBOVUxMKTsKKyAgICBhc3NlcnQocFZlcnNpb25TdHJ1Y3QtPnNUeXBlID09IExBWUVSX05FR09USUFURV9JTlRFUkZBQ0VfU1RSVUNUKTsKKworICAgIC8vIEZpbGwgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGlmIG91ciB2ZXJzaW9uIGlzIGF0IGxlYXN0IGNhcGFibGUgb2YgaGF2aW5nIHRoZSBzdHJ1Y3R1cmUgY29udGFpbiB0aGVtLgorICAgIGlmIChwVmVyc2lvblN0cnVjdC0+bG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uID49IDIpIHsKKyAgICAgICAgcFZlcnNpb25TdHJ1Y3QtPnBmbkdldEluc3RhbmNlUHJvY0FkZHIgPSB2a0dldEluc3RhbmNlUHJvY0FkZHI7CisgICAgICAgIHBWZXJzaW9uU3RydWN0LT5wZm5HZXREZXZpY2VQcm9jQWRkciA9IHZrR2V0RGV2aWNlUHJvY0FkZHI7CisgICAgICAgIHBWZXJzaW9uU3RydWN0LT5wZm5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30iIiIKKworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGVyckZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICB3YXJuRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIGRpYWdGaWxlID0gc3lzLnN0ZG91dCk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5fX2luaXRfXyhzZWxmLCBlcnJGaWxlLCB3YXJuRmlsZSwgZGlhZ0ZpbGUpCisgICAgICAgICMgSW50ZXJuYWwgc3RhdGUgLSBhY2N1bXVsYXRvcnMgZm9yIGRpZmZlcmVudCBpbm5lciBibG9jayB0ZXh0CisgICAgICAgIHNlbGYuc2VjdGlvbnMgPSBkaWN0KFsoc2VjdGlvbiwgW10pIGZvciBzZWN0aW9uIGluIHNlbGYuQUxMX1NFQ1RJT05TXSkKKyAgICAgICAgc2VsZi5pbnRlcmNlcHRzID0gW10KKyAgICAgICAgc2VsZi5sYXllcl9mYWN0b3J5ID0gJycgICAgICAgICAgICAgICAgICAgICAjIFN0cmluZyBjb250YWluaW5nIGJhc2UgbGF5ZXIgZmFjdG9yeSBjbGFzcyBkZWZpbml0aW9uCisKKyAgICAjIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheQorICAgIGRlZiBwYXJhbUlzQXJyYXkoc2VsZiwgcGFyYW0pOgorICAgICAgICByZXR1cm4gcGFyYW0uYXR0cmliLmdldCgnbGVuJykgaXMgbm90IE5vbmUKKworICAgICMgQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBwYXNzZWQgaW4gaXMgYSBwb2ludGVyCisgICAgZGVmIHBhcmFtSXNQb2ludGVyKHNlbGYsIHBhcmFtKToKKyAgICAgICAgaXNwb2ludGVyID0gRmFsc2UKKyAgICAgICAgZm9yIGVsZW0gaW4gcGFyYW06CisgICAgICAgICAgICBpZiBlbGVtLnRhZyA9PSAndHlwZScgYW5kIGVsZW0udGFpbCBpcyBub3QgTm9uZSBhbmQgJyonIGluIGVsZW0udGFpbDoKKyAgICAgICAgICAgICAgICBpc3BvaW50ZXIgPSBUcnVlCisgICAgICAgIHJldHVybiBpc3BvaW50ZXIKKworICAgICMKKyAgICAjCisgICAgZGVmIGJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKQorICAgICAgICAjIE91dHB1dCBDb3B5cmlnaHQKKyAgICAgICAgd3JpdGUoc2VsZi5pbmxpbmVfY29weXJpZ2h0X21lc3NhZ2UsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAjIE11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0aW9uCisgICAgICAgIHNlbGYuaGVhZGVyID0gRmFsc2UKKyAgICAgICAgaWYgKHNlbGYuZ2VuT3B0cy5maWxlbmFtZSBhbmQgJ2gnID09IHNlbGYuZ2VuT3B0cy5maWxlbmFtZVstMV0pOgorICAgICAgICAgICAgc2VsZi5oZWFkZXIgPSBUcnVlCisgICAgICAgICAgICB3cml0ZSgnI3ByYWdtYSBvbmNlJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICBpZiBzZWxmLmhlYWRlcjoKKyAgICAgICAgICAgIHdyaXRlKHNlbGYuaW5saW5lX2N1c3RvbV9oZWFkZXJfcHJlYW1ibGUsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd3JpdGUoc2VsZi5pbmxpbmVfY3VzdG9tX3NvdXJjZV9wcmVhbWJsZSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIHNlbGYubGF5ZXJfZmFjdG9yeSArPSBzZWxmLmlubGluZV9jdXN0b21faGVhZGVyX2NsYXNzX2RlZmluaXRpb24KKyAgICAjCisgICAgIworICAgIGRlZiBlbmRGaWxlKHNlbGYpOgorICAgICAgICAjIEZpbmlzaCBDKysgbmFtZXNwYWNlIGFuZCBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbgorICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXI6CisgICAgICAgICAgICAjIFJlY29yZCBpbnRlcmNlcHRlZCBwcm9jZWR1cmVzCisgICAgICAgICAgICB3cml0ZSgnLy8gTWFwIG9mIGludGVyY2VwdGVkIEFwaU5hbWUgdG8gaXRzIGFzc29jaWF0ZWQgZnVuY3Rpb24gZGF0YScsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJyNpZmRlZiBfTVNDX1ZFUicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgd3JpdGUoJyNwcmFnbWEgd2FybmluZyggc3VwcHJlc3M6IDYyNjIgKSAvLyBWUyBhbmFseXNpczogdGhpcyB1c2VzIG1vcmUgdGhhbiAxNiBraUIsIHdoaWNoIGlzIGZpbmUgaGVyZSBhdCBnbG9iYWwgc2NvcGUnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCcjZW5kaWYnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHdyaXRlKCdjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGZ1bmN0aW9uX2RhdGE+IG5hbWVfdG9fZnVuY3B0cl9tYXAgPSB7JywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnXG4nLmpvaW4oc2VsZi5pbnRlcmNlcHRzKSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnfTtcbicsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgIHdyaXRlKCd9IC8vIG5hbWVzcGFjZSB2dWxrYW5fbGF5ZXJfY2hhc3NpcycsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICBpZiBzZWxmLmhlYWRlcjoKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICAjIE91dHB1dCBMYXllciBGYWN0b3J5IENsYXNzIERlZmluaXRpb25zCisgICAgICAgICAgICBzZWxmLmxheWVyX2ZhY3RvcnkgKz0gc2VsZi5pbmxpbmVfY3VzdG9tX3ZhbGlkYXRpb25fY2xhc3NfZGVmaW5pdGlvbnMKKyAgICAgICAgICAgIHNlbGYubGF5ZXJfZmFjdG9yeSArPSAnfTtcblxuJworICAgICAgICAgICAgc2VsZi5sYXllcl9mYWN0b3J5ICs9ICdleHRlcm4gc21hbGxfdW5vcmRlcmVkX21hcDx2b2lkKiwgVmFsaWRhdGlvbk9iamVjdCosIDI+IGxheWVyX2RhdGFfbWFwOycKKyAgICAgICAgICAgIHdyaXRlKHNlbGYubGF5ZXJfZmFjdG9yeSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3cml0ZShzZWxmLmlubGluZV9jdXN0b21fc291cmNlX3Bvc3RhbWJsZSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorCisgICAgZGVmIGJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpOgorICAgICAgICAjIFN0YXJ0IHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCkKKyAgICAgICAgIyBHZXQgZmVhdHVyZSBleHRyYSBwcm90ZWN0CisgICAgICAgIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCA9IEdldEZlYXR1cmVQcm90ZWN0KGludGVyZmFjZSkKKyAgICAgICAgIyBBY2N1bXVsYXRlIGluY2x1ZGVzLCBkZWZpbmVzLCB0eXBlcywgZW51bXMsIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMsIGVuZCBmdW5jdGlvbiBwcm90b3R5cGVzIHNlcGFyYXRlbHkgZm9yIHRoaXMKKyAgICAgICAgIyBmZWF0dXJlLiBUaGV5J3JlIG9ubHkgcHJpbnRlZCBpbiBlbmRGZWF0dXJlKCkuCisgICAgICAgIHNlbGYuc2VjdGlvbnMgPSBkaWN0KFsoc2VjdGlvbiwgW10pIGZvciBzZWN0aW9uIGluIHNlbGYuQUxMX1NFQ1RJT05TXSkKKworICAgIGRlZiBlbmRGZWF0dXJlKHNlbGYpOgorICAgICAgICAjIEFjdHVhbGx5IHdyaXRlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIG91dHB1dCBmaWxlLgorICAgICAgICBpZiAoc2VsZi5lbWl0KToKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICAjIElmIHR5cGUgZGVjbGFyYXRpb25zIGFyZSBuZWVkZWQgYnkgb3RoZXIgZmVhdHVyZXMgYmFzZWQgb24gdGhpcyBvbmUsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gc3VwcHJlc3MgdGhlIEV4dHJhUHJvdGVjdCwKKyAgICAgICAgICAgICMgb3IgbW92ZSBpdCBiZWxvdyB0aGUgJ2ZvciBzZWN0aW9uLi4uJyBsb29wLgorICAgICAgICAgICAgaWYgKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCAhPSBOb25lKToKKyAgICAgICAgICAgICAgICB3cml0ZSgnI2lmZGVmJywgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuVFlQRV9TRUNUSU9OUzoKKyAgICAgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYuc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgICAgICAgICBpZiBjb250ZW50czoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoJ1xuJy5qb2luKGNvbnRlbnRzKSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICBpZiAoc2VsZi5zZWN0aW9uc1snY29tbWFuZCddKToKKyAgICAgICAgICAgICAgICB3cml0ZSgnXG4nLmpvaW4oc2VsZi5zZWN0aW9uc1snY29tbWFuZCddKSwgZW5kPXUnJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgIGlmIChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgIT0gTm9uZSk6CisgICAgICAgICAgICAgICAgd3JpdGUoJyNlbmRpZiAvLycsIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmVhdHVyZShzZWxmKQorICAgICMKKyAgICAjIEFwcGVuZCBhIGRlZmluaXRpb24gdG8gdGhlIHNwZWNpZmllZCBzZWN0aW9uCisgICAgZGVmIGFwcGVuZFNlY3Rpb24oc2VsZiwgc2VjdGlvbiwgdGV4dCk6CisgICAgICAgIHNlbGYuc2VjdGlvbnNbc2VjdGlvbl0uYXBwZW5kKHRleHQpCisgICAgIworICAgICMgVHlwZSBnZW5lcmF0aW9uCisgICAgZGVmIGdlblR5cGUoc2VsZiwgdHlwZWluZm8sIG5hbWUsIGFsaWFzKToKKyAgICAgICAgcGFzcworICAgICMKKyAgICAjIFN0cnVjdCAoZS5nLiBDICJzdHJ1Y3QiIHR5cGUpIGdlbmVyYXRpb24uIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIDx0eXBlPiB0YWcgd2hlcmUgdGhlIGNvbnRlbnRzIGFyZQorICAgICMgaW50ZXJwcmV0ZWQgYXMgYSBzZXQgb2YgPG1lbWJlcj4gdGFncyBpbnN0ZWFkIG9mIGZyZWVmb3JtIEMgdHlwZSBkZWNsYXJhdGlvbnMuIFRoZSA8bWVtYmVyPiB0YWdzIGFyZSBqdXN0IGxpa2UgPHBhcmFtPgorICAgICMgdGFncyAtIHRoZXkgYXJlIGEgZGVjbGFyYXRpb24gb2YgYSBzdHJ1Y3Qgb3IgdW5pb24gbWVtYmVyLiBPbmx5IHNpbXBsZSBtZW1iZXIgZGVjbGFyYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vIG5lc3RlZAorICAgICMgc3RydWN0cyBldGMuKQorICAgIGRlZiBnZW5TdHJ1Y3Qoc2VsZiwgdHlwZWluZm8sIHR5cGVOYW1lKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlblN0cnVjdChzZWxmLCB0eXBlaW5mbywgdHlwZU5hbWUpCisgICAgICAgIGJvZHkgPSAndHlwZWRlZiAnICsgdHlwZWluZm8uZWxlbS5nZXQoJ2NhdGVnb3J5JykgKyAnICcgKyB0eXBlTmFtZSArICcge1xuJworICAgICAgICAjIHBhcmFtZGVjbCA9IHNlbGYubWFrZUNQYXJhbURlY2wodHlwZWluZm8uZWxlbSwgc2VsZi5nZW5PcHRzLmFsaWduRnVuY1BhcmFtKQorICAgICAgICBmb3IgbWVtYmVyIGluIHR5cGVpbmZvLmVsZW0uZmluZGFsbCgnLi8vbWVtYmVyJyk6CisgICAgICAgICAgICBib2R5ICs9IHNlbGYubWFrZUNQYXJhbURlY2wobWVtYmVyLCBzZWxmLmdlbk9wdHMuYWxpZ25GdW5jUGFyYW0pCisgICAgICAgICAgICBib2R5ICs9ICc7XG4nCisgICAgICAgIGJvZHkgKz0gJ30gJyArIHR5cGVOYW1lICsgJztcbicKKyAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdzdHJ1Y3QnLCBib2R5KQorICAgICMKKyAgICAjIEdyb3VwIChlLmcuIEMgImVudW0iIHR5cGUpIGdlbmVyYXRpb24uIFRoZXNlIGFyZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgd2l0aCBvdGhlciB0eXBlcy4KKyAgICBkZWYgZ2VuR3JvdXAoc2VsZiwgZ3JvdXBpbmZvLCBncm91cE5hbWUsIGFsaWFzKToKKyAgICAgICAgcGFzcworICAgICMgRW51bWVyYW50IGdlbmVyYXRpb24KKyAgICAjIDxlbnVtPiB0YWdzIG1heSBzcGVjaWZ5IHRoZWlyIHZhbHVlcyBpbiBzZXZlcmFsIHdheXMsIGJ1dCBhcmUgdXN1YWxseSBqdXN0IGludGVnZXJzLgorICAgIGRlZiBnZW5FbnVtKHNlbGYsIGVudW1pbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgIHBhc3MKKyAgICAjCisgICAgIyBDdXN0b21pemUgQ2RlY2wgZm9yIGxheWVyIGZhY3RvcnkgYmFzZSBjbGFzcworICAgIGRlZiBCYXNlQ2xhc3NDZGVjbChzZWxmLCBlbGVtLCBuYW1lKToKKyAgICAgICAgcmF3ID0gc2VsZi5tYWtlQ0RlY2xzKGVsZW0pWzFdCisKKyAgICAgICAgIyBUb3NzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSB1bmRlY29yYXRlZCBuYW1lCisgICAgICAgIHByb3RvdHlwZSA9IHJhdy5zcGxpdCgiVktBUElfUFRSICpQRk5fdmsiKVsxXQorICAgICAgICBwcm90b3R5cGUgPSBwcm90b3R5cGUucmVwbGFjZSgiKSIsICIiLCAxKQorICAgICAgICBwcm90b3R5cGUgPSBwcm90b3R5cGUucmVwbGFjZSgiOyIsICIge307IikKKworICAgICAgICAjIEJ1aWxkIHVwIHByZS9wb3N0IGNhbGwgdmlydHVhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAgICAgICAgcHJlX2NhbGxfdmFsaWRhdGUgPSAndmlydHVhbCBib29sIFByZUNhbGxWYWxpZGF0ZScgKyBwcm90b3R5cGUKKyAgICAgICAgcHJlX2NhbGxfdmFsaWRhdGUgPSBwcmVfY2FsbF92YWxpZGF0ZS5yZXBsYWNlKCJ7fSIsICJjb25zdCB7IHJldHVybiBmYWxzZTsgfSIpCisgICAgICAgIHByZV9jYWxsX3JlY29yZCA9ICd2aXJ0dWFsIHZvaWQgUHJlQ2FsbFJlY29yZCcgKyBwcm90b3R5cGUKKyAgICAgICAgcG9zdF9jYWxsX3JlY29yZCA9ICd2aXJ0dWFsIHZvaWQgUG9zdENhbGxSZWNvcmQnICsgcHJvdG90eXBlCisgICAgICAgIHJlc3VsdHR5cGUgPSBlbGVtLmZpbmQoJ3Byb3RvL3R5cGUnKQorICAgICAgICBpZiByZXN1bHR0eXBlLnRleHQgPT0gJ1ZrUmVzdWx0JzoKKyAgICAgICAgICAgIHBvc3RfY2FsbF9yZWNvcmQgPSBwb3N0X2NhbGxfcmVjb3JkLnJlcGxhY2UoJyknLCAnLCBWa1Jlc3VsdCByZXN1bHQpJykKKyAgICAgICAgZWxpZiByZXN1bHR0eXBlLnRleHQgPT0gJ1ZrRGV2aWNlQWRkcmVzcyc6CisgICAgICAgICAgICBwb3N0X2NhbGxfcmVjb3JkID0gcG9zdF9jYWxsX3JlY29yZC5yZXBsYWNlKCcpJywgJywgVmtEZXZpY2VBZGRyZXNzIHJlc3VsdCknKQorICAgICAgICByZXR1cm4gJyAgICAgICAgJXNcbiAgICAgICAgJXNcbiAgICAgICAgJXNcbicgJSAocHJlX2NhbGxfdmFsaWRhdGUsIHByZV9jYWxsX3JlY29yZCwgcG9zdF9jYWxsX3JlY29yZCkKKyAgICAjCisgICAgIyBDb21tYW5kIGdlbmVyYXRpb24KKyAgICBkZWYgZ2VuQ21kKHNlbGYsIGNtZGluZm8sIG5hbWUsIGFsaWFzKToKKyAgICAgICAgaWdub3JlX2Z1bmN0aW9ucyA9IFsKKyAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uJywKKyAgICAgICAgXQorCisgICAgICAgIGlmIG5hbWUgaW4gaWdub3JlX2Z1bmN0aW9uczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYuaGVhZGVyOiAjIEluIHRoZSBoZWFkZXIgZGVjbGFyZSBhbGwgaW50ZXJjZXB0cworICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJycpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCBzZWxmLm1ha2VDRGVjbHMoY21kaW5mby5lbGVtKVswXSkKKyAgICAgICAgICAgIGlmIChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgIT0gTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5sYXllcl9mYWN0b3J5ICs9ICcjaWZkZWYgJXNcbicgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QKKyAgICAgICAgICAgICMgVXBkYXRlIGJhc2UgY2xhc3Mgd2l0aCB2aXJ0dWFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICAgICAgICAgICAgaWYgJ1ZhbGlkYXRpb25DYWNoZScgbm90IGluIG5hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5sYXllcl9mYWN0b3J5ICs9IHNlbGYuQmFzZUNsYXNzQ2RlY2woY21kaW5mby5lbGVtLCBuYW1lKQorICAgICAgICAgICAgaWYgKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCAhPSBOb25lKToKKyAgICAgICAgICAgICAgICBzZWxmLmxheWVyX2ZhY3RvcnkgKz0gJyNlbmRpZlxuJworICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaXNfaW5zdGFuY2UgPSAnZmFsc2UnCisgICAgICAgIGRpc3BhdGNoYWJsZV90eXBlID0gY21kaW5mby5lbGVtLmZpbmQoJ3BhcmFtL3R5cGUnKS50ZXh0CisgICAgICAgIGlmIGRpc3BhdGNoYWJsZV90eXBlIGluIFsiVmtQaHlzaWNhbERldmljZSIsICJWa0luc3RhbmNlIl0gb3IgbmFtZSA9PSAndmtDcmVhdGVJbnN0YW5jZSc6CisgICAgICAgICAgICBpc19pbnN0YW5jZSA9ICd0cnVlJworCisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5tYW51YWxfZnVuY3Rpb25zOgorICAgICAgICAgICAgc2VsZi5pbnRlcmNlcHRzICs9IFsgJyAgICB7IiVzIiwgeyVzLCAodm9pZCopJXN9fSwnICUgKG5hbWUsIGlzX2luc3RhbmNlLCBuYW1lWzI6XSkgXQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgUmVjb3JkIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgaW50ZXJjZXB0ZWQKKyAgICAgICAgaWYgKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCAhPSBOb25lKToKKyAgICAgICAgICAgIHNlbGYuaW50ZXJjZXB0cyArPSBbICcjaWZkZWYgJXMnICUgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IF0KKyAgICAgICAgc2VsZi5pbnRlcmNlcHRzICs9IFsgJyAgICB7IiVzIiwgeyVzLCAodm9pZCopJXN9fSwnICUgKG5hbWUsIGlzX2luc3RhbmNlLCBuYW1lWzI6XSkgXQorICAgICAgICBpZiAoc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0ICE9IE5vbmUpOgorICAgICAgICAgICAgc2VsZi5pbnRlcmNlcHRzICs9IFsgJyNlbmRpZicgXQorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuQ21kKHNlbGYsIGNtZGluZm8sIG5hbWUsIGFsaWFzKQorICAgICAgICAjCisgICAgICAgIGRlY2xzID0gc2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSkKKyAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJycpCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICclcyB7JyAlIGRlY2xzWzBdWzotMV0pCisgICAgICAgICMgU2V0dXAgY29tbW9uIHRvIGNhbGwgd3JhcHBlcnMuIEZpcnN0IHBhcmFtZXRlciBpcyBhbHdheXMgZGlzcGF0Y2hhYmxlCisgICAgICAgIGRpc3BhdGNoYWJsZV9uYW1lID0gY21kaW5mby5lbGVtLmZpbmQoJ3BhcmFtL25hbWUnKS50ZXh0CisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgYXV0byBsYXllcl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGdldF9kaXNwYXRjaF9rZXkoJXMpLCBsYXllcl9kYXRhX21hcCk7JyAlIChkaXNwYXRjaGFibGVfbmFtZSkpCisgICAgICAgIGFwaV9mdW5jdGlvbl9uYW1lID0gY21kaW5mby5lbGVtLmF0dHJpYi5nZXQoJ25hbWUnKQorICAgICAgICBwYXJhbXMgPSBjbWRpbmZvLmVsZW0uZmluZGFsbCgncGFyYW0vbmFtZScpCisgICAgICAgIHBhcmFtc3RleHQgPSAnLCAnLmpvaW4oW3N0cihwYXJhbS50ZXh0KSBmb3IgcGFyYW0gaW4gcGFyYW1zXSkKKyAgICAgICAgQVBJID0gYXBpX2Z1bmN0aW9uX25hbWUucmVwbGFjZSgndmsnLCdEaXNwYXRjaCcpICsgJygnCisKKyAgICAgICAgIyBEZWNsYXJlIHJlc3VsdCB2YXJpYWJsZSwgaWYgYW55LgorICAgICAgICByZXR1cm5fbWFwID0geworICAgICAgICAgICAgJ1BGTl92a1ZvaWRGdW5jdGlvbic6ICdyZXR1cm4gbnVsbHB0cjsnLAorICAgICAgICAgICAgJ1ZrQm9vbDMyJzogJ3JldHVybiBWS19GQUxTRTsnLAorICAgICAgICAgICAgJ1ZrRGV2aWNlQWRkcmVzcyc6ICdyZXR1cm4gMDsnLAorICAgICAgICAgICAgJ1ZrUmVzdWx0JzogJ3JldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7JywKKyAgICAgICAgICAgICd2b2lkJzogJ3JldHVybjsnLAorICAgICAgICAgICAgJ3VpbnQzMl90JzogJ3JldHVybiAwOycsCisgICAgICAgICAgICAndWludDY0X3QnOiAncmV0dXJuIDA7JworICAgICAgICAgICAgfQorICAgICAgICByZXN1bHR0eXBlID0gY21kaW5mby5lbGVtLmZpbmQoJ3Byb3RvL3R5cGUnKQorICAgICAgICBhc3NpZ25yZXN1bHQgPSAnJworICAgICAgICBpZiAocmVzdWx0dHlwZS50ZXh0ICE9ICd2b2lkJyk6CisgICAgICAgICAgICBhc3NpZ25yZXN1bHQgPSByZXN1bHR0eXBlLnRleHQgKyAnIHJlc3VsdCA9ICcKKworICAgICAgICAjIFNldCB1cCBza2lwIGFuZCBsb2NraW5nCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgYm9vbCBza2lwID0gZmFsc2U7JykKKworICAgICAgICAjIEdlbmVyYXRlIHByZS1jYWxsIHZhbGlkYXRpb24gc291cmNlIGNvZGUKKyAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJyAgICAlcycgJSBzZWxmLnByZWNhbGx2YWxpZGF0ZV9sb29wKQorICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnICAgICAgICBhdXRvIGxvY2sgPSBpbnRlcmNlcHQtPnJlYWRfbG9jaygpOycpCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgICAgIHNraXAgfD0gKGNvbnN0X2Nhc3Q8Y29uc3QgVmFsaWRhdGlvbk9iamVjdCo+KGludGVyY2VwdCkpLT5QcmVDYWxsVmFsaWRhdGUlcyglcyk7JyAlIChhcGlfZnVuY3Rpb25fbmFtZVsyOl0sIHBhcmFtc3RleHQpKQorICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnICAgICAgICBpZiAoc2tpcCkgJXMnICUgcmV0dXJuX21hcFtyZXN1bHR0eXBlLnRleHRdKQorICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnICAgIH0nKQorCisgICAgICAgICMgR2VuZXJhdGUgcHJlLWNhbGwgc3RhdGUgcmVjb3JkaW5nIHNvdXJjZSBjb2RlCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgJXMnICUgc2VsZi5wcmVjYWxscmVjb3JkX2xvb3ApCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOycpCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgICAgIGludGVyY2VwdC0+UHJlQ2FsbFJlY29yZCVzKCVzKTsnICUgKGFwaV9mdW5jdGlvbl9uYW1lWzI6XSwgcGFyYW1zdGV4dCkpCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgfScpCisKKyAgICAgICAgIyBJbnNlcnQgcHJlLWRpc3BhdGNoIGRlYnVnIHV0aWxzIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnByZV9kaXNwYXRjaF9kZWJ1Z191dGlsc19mdW5jdGlvbnM6CisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnICAgICVzJyAlIHNlbGYucHJlX2Rpc3BhdGNoX2RlYnVnX3V0aWxzX2Z1bmN0aW9uc1tuYW1lXSkKKworICAgICAgICAjIE91dHB1dCBkaXNwYXRjaCAoZG93bi1jaGFpbikgZnVuY3Rpb24gY2FsbAorICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnICAgICcgKyBhc3NpZ25yZXN1bHQgKyBBUEkgKyBwYXJhbXN0ZXh0ICsgJyk7JykKKworICAgICAgICAjIEluc2VydCBwb3N0LWRpc3BhdGNoIGRlYnVnIHV0aWxzIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnBvc3RfZGlzcGF0Y2hfZGVidWdfdXRpbHNfZnVuY3Rpb25zOgorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJyAgICAlcycgJSBzZWxmLnBvc3RfZGlzcGF0Y2hfZGVidWdfdXRpbHNfZnVuY3Rpb25zW25hbWVdKQorCisgICAgICAgICMgR2VuZXJhdGUgcG9zdC1jYWxsIG9iamVjdCBwcm9jZXNzaW5nIHNvdXJjZSBjb2RlCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgJXMnICUgc2VsZi5wb3N0Y2FsbHJlY29yZF9sb29wKQorICAgICAgICByZXR1cm5wYXJhbSA9ICcnCisgICAgICAgIGlmIChyZXN1bHR0eXBlLnRleHQgPT0gJ1ZrUmVzdWx0JyBvciByZXN1bHR0eXBlLnRleHQgPT0gJ1ZrRGV2aWNlQWRkcmVzcycpOgorICAgICAgICAgICAgcmV0dXJucGFyYW0gPSAnLCByZXN1bHQnCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgICAgIGF1dG8gbG9jayA9IGludGVyY2VwdC0+d3JpdGVfbG9jaygpOycpCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgICAgIGludGVyY2VwdC0+UG9zdENhbGxSZWNvcmQlcyglcyVzKTsnICUgKGFwaV9mdW5jdGlvbl9uYW1lWzI6XSwgcGFyYW1zdGV4dCwgcmV0dXJucGFyYW0pKQorICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnICAgIH0nKQorICAgICAgICAjIFJldHVybiByZXN1bHQgdmFyaWFibGUsIGlmIGFueS4KKyAgICAgICAgaWYgKHJlc3VsdHR5cGUudGV4dCAhPSAndm9pZCcpOgorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJyAgICByZXR1cm4gcmVzdWx0OycpCisgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICd9JykKKyAgICAjCisgICAgIyBPdmVycmlkZSBtYWtlUHJvdG9OYW1lIHRvIGRyb3AgdGhlICJ2ayIgcHJlZml4CisgICAgZGVmIG1ha2VQcm90b05hbWUoc2VsZiwgbmFtZSwgdGFpbCk6CisgICAgICAgIHJldHVybiBzZWxmLmdlbk9wdHMuYXBpZW50cnkgKyBuYW1lWzI6XSArIHRhaWwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbGF5ZXJfZGlzcGF0Y2hfdGFibGVfZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9sYXllcl9kaXNwYXRjaF90YWJsZV9nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViOWNkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbGF5ZXJfZGlzcGF0Y2hfdGFibGVfZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMzcwIEBACisjIS91c3IvYmluL3B5dGhvbjMgLWkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBNYXJrIFlvdW5nIDxtYXJreUBsdW5hcmcuY29tPgorIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKworaW1wb3J0IG9zLHJlLHN5cworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBldHJlZQorZnJvbSBnZW5lcmF0b3IgaW1wb3J0ICoKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKK2Zyb20gY29tbW9uX2NvZGVnZW4gaW1wb3J0ICoKKworQUREX0lOU1RfQ01EUyA9IFsndmtDcmVhdGVJbnN0YW5jZScsCisgICAgICAgICAgICAgICAgICd2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsCisgICAgICAgICAgICAgICAgICd2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uJ10KKworIworIyBMYXllckRpc3BhdGNoVGFibGVHZW5lcmF0b3JPcHRpb25zIC0gc3ViY2xhc3Mgb2YgR2VuZXJhdG9yT3B0aW9ucy4KK2NsYXNzIExheWVyRGlzcGF0Y2hUYWJsZUdlbmVyYXRvck9wdGlvbnMoR2VuZXJhdG9yT3B0aW9ucyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBOb25lLAorICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgPSAnLicsCisgICAgICAgICAgICAgICAgIGFwaW5hbWUgPSBOb25lLAorICAgICAgICAgICAgICAgICBwcm9maWxlID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgdmVyc2lvbnMgPSAnLionLAorICAgICAgICAgICAgICAgICBlbWl0dmVyc2lvbnMgPSAnLionLAorICAgICAgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBzb3J0UHJvY2VkdXJlID0gcmVnU29ydEZlYXR1cmVzLAorICAgICAgICAgICAgICAgICBwcmVmaXhUZXh0ID0gIiIsCisgICAgICAgICAgICAgICAgIGdlbkZ1bmNQb2ludGVycyA9IFRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGaWxlID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdEZlYXR1cmUgPSBUcnVlLAorICAgICAgICAgICAgICAgICBhcGljYWxsID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5ID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5cCA9ICcnLAorICAgICAgICAgICAgICAgICBpbmRlbnRGdW5jUHJvdG8gPSBUcnVlLAorICAgICAgICAgICAgICAgICBpbmRlbnRGdW5jUG9pbnRlciA9IEZhbHNlLAorICAgICAgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgPSBUcnVlKToKKyAgICAgICAgR2VuZXJhdG9yT3B0aW9ucy5fX2luaXRfXyhzZWxmLCBjb252ZW50aW9ucywgZmlsZW5hbWUsIGRpcmVjdG9yeSwgYXBpbmFtZSwgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucywgZW1pdHZlcnNpb25zLCBkZWZhdWx0RXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zLCByZW1vdmVFeHRlbnNpb25zLCBlbWl0RXh0ZW5zaW9ucywgc29ydFByb2NlZHVyZSkKKyAgICAgICAgc2VsZi5wcmVmaXhUZXh0ICAgICAgPSBwcmVmaXhUZXh0CisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gTm9uZQorICAgICAgICBzZWxmLmFwaWNhbGwgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgPSBhcGllbnRyeQorICAgICAgICBzZWxmLmFwaWVudHJ5cCAgICAgICA9IGFwaWVudHJ5cAorICAgICAgICBzZWxmLmFsaWduRnVuY1BhcmFtICA9IGFsaWduRnVuY1BhcmFtCisgICAgICAgIHNlbGYuZXhwYW5kRW51bWVyYW50cyA9IGV4cGFuZEVudW1lcmFudHMKKworIworIyBMYXllckRpc3BhdGNoVGFibGVPdXRwdXRHZW5lcmF0b3IgLSBzdWJjbGFzcyBvZiBPdXRwdXRHZW5lcmF0b3IuCisjIEdlbmVyYXRlcyBkaXNwYXRjaCB0YWJsZSBoZWxwZXIgaGVhZGVyIGZpbGVzIGZvciBMVkwKK2NsYXNzIExheWVyRGlzcGF0Y2hUYWJsZU91dHB1dEdlbmVyYXRvcihPdXRwdXRHZW5lcmF0b3IpOgorICAgICIiIkdlbmVyYXRlIGRpc3BhdGNoIHRhYmxlcyBoZWFkZXIgYmFzZWQgb24gWE1MIGVsZW1lbnQgYXR0cmlidXRlcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBlcnJGaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgd2FybkZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICBkaWFnRmlsZSA9IHN5cy5zdGRvdXQpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuX19pbml0X18oc2VsZiwgZXJyRmlsZSwgd2FybkZpbGUsIGRpYWdGaWxlKQorCisgICAgICAgICMgSW50ZXJuYWwgc3RhdGUgLSBhY2N1bXVsYXRvcnMgZm9yIGRpZmZlcmVudCBpbm5lciBibG9jayB0ZXh0CisgICAgICAgIHNlbGYuZXh0X2luc3RhbmNlX2Rpc3BhdGNoX2xpc3QgPSBbXSAgIyBMaXN0IG9mIGV4dGVuc2lvbiBlbnRyaWVzIGZvciBpbnN0YW5jZSBkaXNwYXRjaCBsaXN0CisgICAgICAgIHNlbGYuZXh0X2RldmljZV9kaXNwYXRjaF9saXN0ID0gW10gICAgIyBMaXN0IG9mIGV4dGVuc2lvbiBlbnRyaWVzIGZvciBkZXZpY2UgZGlzcGF0Y2ggbGlzdAorICAgICAgICBzZWxmLmNvcmVfY29tbWFuZHMgPSBbXSAgICAgICAgICAgICAgICMgTGlzdCBvZiBDb21tYW5kRGF0YSByZWNvcmRzIGZvciBjb3JlIFZ1bGthbiBjb21tYW5kcworICAgICAgICBzZWxmLmV4dF9jb21tYW5kcyA9IFtdICAgICAgICAgICAgICAgICMgTGlzdCBvZiBDb21tYW5kRGF0YSByZWNvcmRzIGZvciBleHRlbnNpb24gVnVsa2FuIGNvbW1hbmRzCisgICAgICAgIHNlbGYuQ29tbWFuZFBhcmFtID0gbmFtZWR0dXBsZSgnQ29tbWFuZFBhcmFtJywgWyd0eXBlJywgJ25hbWUnLCAnY2RlY2wnXSkKKyAgICAgICAgc2VsZi5Db21tYW5kRGF0YSA9IG5hbWVkdHVwbGUoJ0NvbW1hbmREYXRhJywgWyduYW1lJywgJ2V4dF9uYW1lJywgJ2V4dF90eXBlJywgJ3Byb3RlY3QnLCAncmV0dXJuX3R5cGUnLCAnaGFuZGxlX3R5cGUnLCAncGFyYW1zJywgJ2NkZWNsJ10pCisKKyAgICAjCisgICAgIyBDYWxsZWQgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnVuCisgICAgZGVmIGJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKQorCisgICAgICAgICMgSW5pdGlhbGl6ZSBtZW1iZXJzIHRoYXQgcmVxdWlyZSB0aGUgdHJlZQorICAgICAgICBzZWxmLmhhbmRsZV90eXBlcyA9IEdldEhhbmRsZVR5cGVzKHNlbGYucmVnaXN0cnkudHJlZSkKKworICAgICAgICAjIFVzZXItc3VwcGxpZWQgcHJlZml4IHRleHQsIGlmIGFueSAobGlzdCBvZiBzdHJpbmdzKQorICAgICAgICBpZiAoZ2VuT3B0cy5wcmVmaXhUZXh0KToKKyAgICAgICAgICAgIGZvciBzIGluIGdlbk9wdHMucHJlZml4VGV4dDoKKyAgICAgICAgICAgICAgICB3cml0ZShzLCBmaWxlPXNlbGYub3V0RmlsZSkKKworICAgICAgICAjIEZpbGUgQ29tbWVudAorICAgICAgICBmaWxlX2NvbW1lbnQgPSAnLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKipcbicKKyAgICAgICAgZmlsZV9jb21tZW50ICs9ICcvLyBTZWUgbGF5ZXJfZGlzcGF0Y2hfdGFibGVfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zXG4nCisgICAgICAgIHdyaXRlKGZpbGVfY29tbWVudCwgZmlsZT1zZWxmLm91dEZpbGUpCisKKyAgICAgICAgIyBDb3B5cmlnaHQgTm90aWNlCisgICAgICAgIGNvcHlyaWdodCA9ICAnLypcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb25cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpO1xuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogTWFyayBZb3VuZyA8bWFya3lAbHVuYXJnLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKi9cbicKKworICAgICAgICBwcmVhbWJsZSA9ICcnCisgICAgICAgIGlmIHNlbGYuZ2VuT3B0cy5maWxlbmFtZSA9PSAndmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCc6CisgICAgICAgICAgICBwcmVhbWJsZSArPSAnI3ByYWdtYSBvbmNlXG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAnXG4nCisgICAgICAgICAgICBwcmVhbWJsZSArPSAndHlwZWRlZiBQRk5fdmtWb2lkRnVuY3Rpb24gKFZLQVBJX1BUUiAqUEZOX0dldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBOYW1lKTtcbicKKworICAgICAgICB3cml0ZShjb3B5cmlnaHQsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICB3cml0ZShwcmVhbWJsZSwgZmlsZT1zZWxmLm91dEZpbGUpCisKKyAgICAjCisgICAgIyBXcml0ZSBnZW5lcmF0ZSBhbmQgd3JpdGUgZGlzcGF0Y2ggdGFibGVzIHRvIG91dHB1dCBmaWxlCisgICAgZGVmIGVuZEZpbGUoc2VsZik6CisgICAgICAgIGZpbGVfZGF0YSA9ICcnCisgICAgICAgIGlmIHNlbGYuZ2VuT3B0cy5maWxlbmFtZSA9PSAndmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCc6CisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSgpCisgICAgICAgICAgICBmaWxlX2RhdGEgKz0gc2VsZi5PdXRwdXRMYXllckRldmljZURpc3BhdGNoVGFibGUoKQorCisgICAgICAgIHdyaXRlKGZpbGVfZGF0YSwgZmlsZT1zZWxmLm91dEZpbGUpOworCisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorCisgICAgZGVmIGJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpOgorICAgICAgICAjIFN0YXJ0IHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCkKKyAgICAgICAgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0ID0gR2V0RmVhdHVyZVByb3RlY3QoaW50ZXJmYWNlKQorCisgICAgICAgIGVudW1zID0gaW50ZXJmYWNlWzBdLmZpbmRhbGwoJ2VudW0nKQorICAgICAgICBzZWxmLmN1cnJlbnRFeHRlbnNpb24gPSAnJworCisgICAgICAgIHNlbGYudHlwZSA9IGludGVyZmFjZS5nZXQoJ3R5cGUnKQorICAgICAgICBzZWxmLm51bV9jb21tYW5kcyA9IDAKKyAgICAgICAgbmFtZSA9IGludGVyZmFjZS5nZXQoJ25hbWUnKQorICAgICAgICBzZWxmLmN1cnJlbnRFeHRlbnNpb24gPSBuYW1lCisKKyAgICAjCisgICAgIyBQcm9jZXNzIGNvbW1hbmRzLCBhZGRpbmcgdG8gYXBwcm9wcmlhdGUgZGlzcGF0Y2ggdGFibGVzCisgICAgZGVmIGdlbkNtZChzZWxmLCBjbWRpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpCisKKyAgICAgICAgIyBHZXQgZmlyc3QgcGFyYW0gdHlwZQorICAgICAgICBwYXJhbXMgPSBjbWRpbmZvLmVsZW0uZmluZGFsbCgncGFyYW0nKQorICAgICAgICBpbmZvID0gc2VsZi5nZXRUeXBlTmFtZVR1cGxlKHBhcmFtc1swXSkKKworICAgICAgICBzZWxmLm51bV9jb21tYW5kcyArPSAxCisKKyAgICAgICAgaWYgJ2FuZHJvaWQnIG5vdCBpbiBuYW1lOgorICAgICAgICAgICAgc2VsZi5BZGRDb21tYW5kVG9EaXNwYXRjaExpc3Qoc2VsZi5jdXJyZW50RXh0ZW5zaW9uLCBzZWxmLnR5cGUsIG5hbWUsIGNtZGluZm8sIGluZm9bMF0pCisKKyAgICBkZWYgZW5kRmVhdHVyZShzZWxmKToKKyAgICAgICAgIyBGaW5pc2ggcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5lbmRGZWF0dXJlKHNlbGYpCisKKyAgICAjCisgICAgIyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIGxlbiB0YWcKKyAgICBkZWYgZ2V0TGVuKHNlbGYsIHBhcmFtKToKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICBsZW4gPSBwYXJhbS5hdHRyaWIuZ2V0KCdsZW4nKQorICAgICAgICBpZiBsZW4gYW5kIGxlbiAhPSAnbnVsbC10ZXJtaW5hdGVkJzoKKyAgICAgICAgICAgICMgRm9yIHN0cmluZyBhcnJheXMsICdsZW4nIGNhbiBsb29rIGxpa2UgJ2NvdW50LG51bGwtdGVybWluYXRlZCcsCisgICAgICAgICAgICAjIGluZGljYXRpbmcgdGhhdCB3ZSBoYXZlIGEgbnVsbCB0ZXJtaW5hdGVkIGFycmF5IG9mIHN0cmluZ3MuICBXZQorICAgICAgICAgICAgIyBzdHJpcCB0aGUgbnVsbC10ZXJtaW5hdGVkIGZyb20gdGhlICdsZW4nIGZpZWxkIGFuZCBvbmx5IHJldHVybgorICAgICAgICAgICAgIyB0aGUgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIHN0cmluZyBjb3VudAorICAgICAgICAgICAgaWYgJ251bGwtdGVybWluYXRlZCcgaW4gbGVuOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxlbi5zcGxpdCgnLCcpWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxlbgorICAgICAgICAgICAgcmVzdWx0ID0gc3RyKHJlc3VsdCkucmVwbGFjZSgnOjonLCAnLT4nKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAjCisgICAgIyBEZXRlcm1pbmUgaWYgdGhpcyBBUEkgc2hvdWxkIGJlIGlnbm9yZWQgb3IgYWRkZWQgdG8gdGhlIGluc3RhbmNlIG9yIGRldmljZSBkaXNwYXRjaCB0YWJsZQorICAgIGRlZiBBZGRDb21tYW5kVG9EaXNwYXRjaExpc3Qoc2VsZiwgZXh0ZW5zaW9uX25hbWUsIGV4dGVuc2lvbl90eXBlLCBuYW1lLCBjbWRpbmZvLCBoYW5kbGVfdHlwZSk6CisgICAgICAgIHJldHVybl90eXBlID0gIGNtZGluZm8uZWxlbS5maW5kKCdwcm90by90eXBlJykKKyAgICAgICAgaWYgKHJldHVybl90eXBlIGlzIG5vdCBOb25lIGFuZCByZXR1cm5fdHlwZS50ZXh0ID09ICd2b2lkJyk6CisgICAgICAgICAgIHJldHVybl90eXBlID0gTm9uZQorCisgICAgICAgIGNtZF9wYXJhbXMgPSBbXQorCisgICAgICAgICMgR2VuZXJhdGUgYSBsaXN0IG9mIGNvbW1hbmRzIGZvciB1c2UgaW4gcHJpbnRpbmcgdGhlIG5lY2Vzc2FyeQorICAgICAgICAjIGNvcmUgaW5zdGFuY2UgdGVybWluYXRvciBwcm90b3R5cGVzCisgICAgICAgIHBhcmFtcyA9IGNtZGluZm8uZWxlbS5maW5kYWxsKCdwYXJhbScpCisgICAgICAgIGxlbnMgPSBzZXQoKQorICAgICAgICBmb3IgcGFyYW0gaW4gcGFyYW1zOgorICAgICAgICAgICAgbGVuID0gc2VsZi5nZXRMZW4ocGFyYW0pCisgICAgICAgICAgICBpZiBsZW46CisgICAgICAgICAgICAgICAgbGVucy5hZGQobGVuKQorICAgICAgICBwYXJhbXNJbmZvID0gW10KKyAgICAgICAgZm9yIHBhcmFtIGluIHBhcmFtczoKKyAgICAgICAgICAgIHBhcmFtSW5mbyA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShwYXJhbSkKKyAgICAgICAgICAgIHBhcmFtX3R5cGUgPSBwYXJhbUluZm9bMF0KKyAgICAgICAgICAgIHBhcmFtX25hbWUgPSBwYXJhbUluZm9bMV0KKyAgICAgICAgICAgIHBhcmFtX2NkZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbChwYXJhbSwgMCkKKyAgICAgICAgICAgIGNtZF9wYXJhbXMuYXBwZW5kKHNlbGYuQ29tbWFuZFBhcmFtKHR5cGU9cGFyYW1fdHlwZSwgbmFtZT1wYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9cGFyYW1fY2RlY2wpKQorCisgICAgICAgIGlmIGhhbmRsZV90eXBlIGluIHNlbGYuaGFuZGxlX3R5cGVzIGFuZCBoYW5kbGVfdHlwZSAhPSAnVmtJbnN0YW5jZScgYW5kIGhhbmRsZV90eXBlICE9ICdWa1BoeXNpY2FsRGV2aWNlJzoKKyAgICAgICAgICAgICMgVGhlIENvcmUgVnVsa2FuIGNvZGUgd2lsbCBiZSB3cmFwcGVkIGluIGEgZmVhdHVyZSBjYWxsZWQgVktfVkVSU0lPTl8jXyMKKyAgICAgICAgICAgICMgRm9yIGV4YW1wbGU6IFZLX1ZFUlNJT05fMV8wIHdyYXBzIHRoZSBjb3JlIDEuMCBWdWxrYW4gZnVuY3Rpb25hbGl0eQorICAgICAgICAgICAgaWYgJ1ZLX1ZFUlNJT05fJyBpbiBleHRlbnNpb25fbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLmNvcmVfY29tbWFuZHMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICBzZWxmLkNvbW1hbmREYXRhKG5hbWU9bmFtZSwgZXh0X25hbWU9ZXh0ZW5zaW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X3R5cGU9J2RldmljZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdD1zZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfdHlwZSA9IGhhbmRsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGNtZF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9c2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSlbMF0pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmV4dF9kZXZpY2VfZGlzcGF0Y2hfbGlzdC5hcHBlbmQoKG5hbWUsIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCkpCisgICAgICAgICAgICAgICAgc2VsZi5leHRfY29tbWFuZHMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICBzZWxmLkNvbW1hbmREYXRhKG5hbWU9bmFtZSwgZXh0X25hbWU9ZXh0ZW5zaW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X3R5cGU9ZXh0ZW5zaW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdD1zZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfdHlwZSA9IGhhbmRsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGNtZF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9c2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSlbMF0pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGUgQ29yZSBWdWxrYW4gY29kZSB3aWxsIGJlIHdyYXBwZWQgaW4gYSBmZWF0dXJlIGNhbGxlZCBWS19WRVJTSU9OXyNfIworICAgICAgICAgICAgIyBGb3IgZXhhbXBsZTogVktfVkVSU0lPTl8xXzAgd3JhcHMgdGhlIGNvcmUgMS4wIFZ1bGthbiBmdW5jdGlvbmFsaXR5CisgICAgICAgICAgICBpZiAnVktfVkVSU0lPTl8nIGluIGV4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuY29yZV9jb21tYW5kcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuQ29tbWFuZERhdGEobmFtZT1uYW1lLCBleHRfbmFtZT1leHRlbnNpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfdHlwZT0naW5zdGFuY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3Q9c2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl90eXBlID0gcmV0dXJuX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3R5cGUgPSBoYW5kbGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBjbWRfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkZWNsPXNlbGYubWFrZUNEZWNscyhjbWRpbmZvLmVsZW0pWzBdKSkKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmV4dF9pbnN0YW5jZV9kaXNwYXRjaF9saXN0LmFwcGVuZCgobmFtZSwgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmV4dF9jb21tYW5kcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuQ29tbWFuZERhdGEobmFtZT1uYW1lLCBleHRfbmFtZT1leHRlbnNpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfdHlwZT1leHRlbnNpb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0PXNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fdHlwZSA9IHJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90eXBlID0gaGFuZGxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gY21kX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGVjbD1zZWxmLm1ha2VDRGVjbHMoY21kaW5mby5lbGVtKVswXSkpCisKKyAgICAjCisgICAgIyBSZXRyaWV2ZSB0aGUgdHlwZSBhbmQgbmFtZSBmb3IgYSBwYXJhbWV0ZXIKKyAgICBkZWYgZ2V0VHlwZU5hbWVUdXBsZShzZWxmLCBwYXJhbSk6CisgICAgICAgIHR5cGUgPSAnJworICAgICAgICBuYW1lID0gJycKKyAgICAgICAgZm9yIGVsZW0gaW4gcGFyYW06CisgICAgICAgICAgICBpZiBlbGVtLnRhZyA9PSAndHlwZSc6CisgICAgICAgICAgICAgICAgdHlwZSA9IG5vbmVTdHIoZWxlbS50ZXh0KQorICAgICAgICAgICAgZWxpZiBlbGVtLnRhZyA9PSAnbmFtZSc6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5vbmVTdHIoZWxlbS50ZXh0KQorICAgICAgICByZXR1cm4gKHR5cGUsIG5hbWUpCisKKyAgICAjCisgICAgIyBDcmVhdGUgYSBsYXllciBpbnN0YW5jZSBkaXNwYXRjaCB0YWJsZSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcKKyAgICBkZWYgT3V0cHV0TGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUoc2VsZik6CisgICAgICAgIGNvbW1hbmRzID0gW10KKyAgICAgICAgdGFibGUgPSAnJworICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSAnJworCisgICAgICAgIHRhYmxlICs9ICcvLyBJbnN0YW5jZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIHRhYmxlXG4nCisgICAgICAgIHRhYmxlICs9ICd0eXBlZGVmIHN0cnVjdCBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlXyB7XG4nCisKKyAgICAgICAgIyBGaXJzdCBhZGQgaW4gYW4gZW50cnkgZm9yIEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIuICBUaGlzIHdpbGwgbm90CisgICAgICAgICMgZXZlciBzaG93IHVwIGluIHRoZSBYTUwgb3IgaGVhZGVyLCBzbyB3ZSBoYXZlIHRvIG1hbnVhbGx5IGFkZCBpdC4KKyAgICAgICAgdGFibGUgKz0gJyAgICAvLyBNYW51YWxseSBhZGQgaW4gR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciBlbnRyeVxuJworICAgICAgICB0YWJsZSArPSAnICAgIFBGTl9HZXRQaHlzaWNhbERldmljZVByb2NBZGRyIEdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHI7XG4nCisKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMCwgMik6CisgICAgICAgICAgICBpZiB4ID09IDA6CisgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmNvcmVfY29tbWFuZHMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmV4dF9jb21tYW5kcworCisgICAgICAgICAgICBmb3IgY3VyX2NtZCBpbiBjb21tYW5kczoKKyAgICAgICAgICAgICAgICBpc19pbnN0X2hhbmRsZV90eXBlID0gY3VyX2NtZC5uYW1lIGluIEFERF9JTlNUX0NNRFMgb3IgY3VyX2NtZC5oYW5kbGVfdHlwZSA9PSAnVmtJbnN0YW5jZScgb3IgY3VyX2NtZC5oYW5kbGVfdHlwZSA9PSAnVmtQaHlzaWNhbERldmljZScKKyAgICAgICAgICAgICAgICBpZiBpc19pbnN0X2hhbmRsZV90eXBlOgorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQuZXh0X25hbWUgIT0gY3VyX2V4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ1ZLX1ZFUlNJT05fJyBpbiBjdXJfY21kLmV4dF9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICdcbiAgICAvLyAtLS0tIENvcmUgJXMgY29tbWFuZHNcbicgJSBjdXJfY21kLmV4dF9uYW1lWzExOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJ1xuICAgIC8vIC0tLS0gJXMgZXh0ZW5zaW9uIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gY3VyX2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9IGN1cl9jbWQubmFtZVsyOl0KKworICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJyAgICBQRk5fJXMgJXM7XG4nICUgKGN1cl9jbWQubmFtZSwgYmFzZV9uYW1lKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBjdXJfY21kLnByb3RlY3QKKworICAgICAgICB0YWJsZSArPSAnfSBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlO1xuXG4nCisgICAgICAgIHJldHVybiB0YWJsZQorCisgICAgIworICAgICMgQ3JlYXRlIGEgbGF5ZXIgZGV2aWNlIGRpc3BhdGNoIHRhYmxlIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxpc3QgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZworICAgIGRlZiBPdXRwdXRMYXllckRldmljZURpc3BhdGNoVGFibGUoc2VsZik6CisgICAgICAgIGNvbW1hbmRzID0gW10KKyAgICAgICAgdGFibGUgPSAnJworICAgICAgICBjdXJfZXh0ZW5zaW9uX25hbWUgPSAnJworCisgICAgICAgIHRhYmxlICs9ICcvLyBEZXZpY2UgZnVuY3Rpb24gcG9pbnRlciBkaXNwYXRjaCB0YWJsZVxuJworICAgICAgICB0YWJsZSArPSAndHlwZWRlZiBzdHJ1Y3QgVmtMYXllckRpc3BhdGNoVGFibGVfIHtcbicKKworICAgICAgICBmb3IgeCBpbiByYW5nZSgwLCAyKToKKyAgICAgICAgICAgIGlmIHggPT0gMDoKKyAgICAgICAgICAgICAgICBjb21tYW5kcyA9IHNlbGYuY29yZV9jb21tYW5kcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb21tYW5kcyA9IHNlbGYuZXh0X2NvbW1hbmRzCisKKyAgICAgICAgICAgIGZvciBjdXJfY21kIGluIGNvbW1hbmRzOgorICAgICAgICAgICAgICAgIGlzX2luc3RfaGFuZGxlX3R5cGUgPSBjdXJfY21kLm5hbWUgaW4gQUREX0lOU1RfQ01EUyBvciBjdXJfY21kLmhhbmRsZV90eXBlID09ICdWa0luc3RhbmNlJyBvciBjdXJfY21kLmhhbmRsZV90eXBlID09ICdWa1BoeXNpY2FsRGV2aWNlJworICAgICAgICAgICAgICAgIGlmIG5vdCBpc19pbnN0X2hhbmRsZV90eXBlOgorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQuZXh0X25hbWUgIT0gY3VyX2V4dGVuc2lvbl9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ1ZLX1ZFUlNJT05fJyBpbiBjdXJfY21kLmV4dF9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICdcbiAgICAvLyAtLS0tIENvcmUgJXMgY29tbWFuZHNcbicgJSBjdXJfY21kLmV4dF9uYW1lWzExOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJ1xuICAgIC8vIC0tLS0gJXMgZXh0ZW5zaW9uIGNvbW1hbmRzXG4nICUgY3VyX2NtZC5leHRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2V4dGVuc2lvbl9uYW1lID0gY3VyX2NtZC5leHRfbmFtZQorCisgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICAgICAgICAgIGJhc2VfbmFtZSA9IGN1cl9jbWQubmFtZVsyOl0KKworICAgICAgICAgICAgICAgICAgICBpZiBjdXJfY21kLnByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgY3VyX2NtZC5wcm90ZWN0CisKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgKz0gJyAgICBQRk5fJXMgJXM7XG4nICUgKGN1cl9jbWQubmFtZSwgYmFzZV9uYW1lKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN1cl9jbWQucHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBjdXJfY21kLnByb3RlY3QKKworICAgICAgICB0YWJsZSArPSAnfSBWa0xheWVyRGlzcGF0Y2hUYWJsZTtcblxuJworICAgICAgICByZXR1cm4gdGFibGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbHZsX2dlbnZrLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9sdmxfZ2VudmsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlYWM0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbHZsX2dlbnZrLnB5CkBAIC0wLDAgKzEsODIyIEBACisjIS91c3IvYmluL3B5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UsIGNQcm9maWxlLCBwZGIsIHN0cmluZywgc3lzLCB0aW1lLCBvcworCisjIFNpbXBsZSB0aW1lciBmdW5jdGlvbnMKK3N0YXJ0VGltZSA9IE5vbmUKKworZGVmIHN0YXJ0VGltZXIodGltZWl0KToKKyAgICBnbG9iYWwgc3RhcnRUaW1lCisgICAgaWYgdGltZWl0OgorICAgICAgICBzdGFydFRpbWUgPSB0aW1lLnByb2Nlc3NfdGltZSgpCisKK2RlZiBlbmRUaW1lcih0aW1laXQsIG1zZyk6CisgICAgZ2xvYmFsIHN0YXJ0VGltZQorICAgIGlmIHRpbWVpdDoKKyAgICAgICAgZW5kVGltZSA9IHRpbWUucHJvY2Vzc190aW1lKCkKKyAgICAgICAgd3JpdGUobXNnLCBlbmRUaW1lIC0gc3RhcnRUaW1lLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHN0YXJ0VGltZSA9IE5vbmUKKworIyBUdXJuIGEgbGlzdCBvZiBzdHJpbmdzIGludG8gYSByZWdleHAgc3RyaW5nIG1hdGNoaW5nIGV4YWN0bHkgdGhvc2Ugc3RyaW5ncworZGVmIG1ha2VSRXN0cmluZyhsaXN0LCBkZWZhdWx0ID0gTm9uZSk6CisgICAgaWYgbGVuKGxpc3QpID4gMCBvciBkZWZhdWx0IGlzIE5vbmU6CisgICAgICAgIHJldHVybiAnXignICsgJ3wnLmpvaW4obGlzdCkgKyAnKSQnCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworIyBSZXR1cm5zIGEgZGlyZWN0b3J5IG9mIFsgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBnZW5lcmF0b3Igb3B0aW9ucyBdIGluZGV4ZWQKKyMgYnkgc3BlY2lmaWVkIHNob3J0IG5hbWVzLiBUaGUgZ2VuZXJhdG9yIG9wdGlvbnMgaW5jb3Jwb3JhdGUgdGhlIGZvbGxvd2luZworIyBwYXJhbWV0ZXJzOgorIworIyBhcmdzIGlzIGFuIHBhcnNlZCBhcmd1bWVudCBvYmplY3Q7IHNlZSBiZWxvdyBmb3IgdGhlIGZpZWxkcyB0aGF0IGFyZSB1c2VkLgorZGVmIG1ha2VHZW5PcHRzKGFyZ3MpOgorICAgIGdsb2JhbCBnZW5PcHRzCisgICAgZ2VuT3B0cyA9IHt9CisKKyAgICAjIERlZmF1bHQgY2xhc3Mgb2YgZXh0ZW5zaW9ucyB0byBpbmNsdWRlLCBvciBOb25lCisgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBhcmdzLmRlZmF1bHRFeHRlbnNpb25zCisKKyAgICAjIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyB0byBpbmNsdWRlIChsaXN0IG9mIGV4dGVuc2lvbnMpCisgICAgZXh0ZW5zaW9ucyA9IGFyZ3MuZXh0ZW5zaW9uCisKKyAgICAjIEV4dGVuc2lvbnMgdG8gcmVtb3ZlIChsaXN0IG9mIGV4dGVuc2lvbnMpCisgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IGFyZ3MucmVtb3ZlRXh0ZW5zaW9ucworCisgICAgIyBFeHRlbnNpb25zIHRvIGVtaXQgKGxpc3Qgb2YgZXh0ZW5zaW9ucykKKyAgICBlbWl0RXh0ZW5zaW9ucyA9IGFyZ3MuZW1pdEV4dGVuc2lvbnMKKworICAgICMgRmVhdHVyZXMgdG8gaW5jbHVkZSAobGlzdCBvZiBmZWF0dXJlcykKKyAgICBmZWF0dXJlcyA9IGFyZ3MuZmVhdHVyZQorCisgICAgIyBXaGV0aGVyIHRvIGRpc2FibGUgaW5jbHVzaW9uIHByb3RlY3QgaW4gaGVhZGVycworICAgIHByb3RlY3QgPSBhcmdzLnByb3RlY3QKKworICAgICMgT3V0cHV0IHRhcmdldCBkaXJlY3RvcnkKKyAgICBkaXJlY3RvcnkgPSBhcmdzLmRpcmVjdG9yeQorCisgICAgIyBEZXNjcmlwdGl2ZSBuYW1lcyBmb3IgdmFyaW91cyByZWdleHAgcGF0dGVybnMgdXNlZCB0byBzZWxlY3QKKyAgICAjIHZlcnNpb25zIGFuZCBleHRlbnNpb25zCisgICAgYWxsRmVhdHVyZXMgICAgID0gYWxsRXh0ZW5zaW9ucyA9ICcuKicKKyAgICBub0ZlYXR1cmVzICAgICAgPSBub0V4dGVuc2lvbnMgPSBOb25lCisKKyAgICAjIFR1cm4gbGlzdHMgb2YgbmFtZXMvcGF0dGVybnMgaW50byBtYXRjaGluZyByZWd1bGFyIGV4cHJlc3Npb25zCisgICAgYWRkRXh0ZW5zaW9uc1BhdCAgICAgPSBtYWtlUkVzdHJpbmcoZXh0ZW5zaW9ucywgTm9uZSkKKyAgICByZW1vdmVFeHRlbnNpb25zUGF0ICA9IG1ha2VSRXN0cmluZyhyZW1vdmVFeHRlbnNpb25zLCBOb25lKQorICAgIGVtaXRFeHRlbnNpb25zUGF0ICAgID0gbWFrZVJFc3RyaW5nKGVtaXRFeHRlbnNpb25zLCBhbGxFeHRlbnNpb25zKQorICAgIGZlYXR1cmVzUGF0ICAgICAgICAgID0gbWFrZVJFc3RyaW5nKGZlYXR1cmVzLCBhbGxGZWF0dXJlcykKKworICAgICMgQ29weXJpZ2h0IHRleHQgcHJlZml4aW5nIGFsbCBoZWFkZXJzIChsaXN0IG9mIHN0cmluZ3MpLgorICAgIHByZWZpeFN0cmluZ3MgPSBbCisgICAgICAgICcvKicsCisgICAgICAgICcqKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuJywKKyAgICAgICAgJyoqJywKKyAgICAgICAgJyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOycsCisgICAgICAgICcqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuJywKKyAgICAgICAgJyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCcsCisgICAgICAgICcqKicsCisgICAgICAgICcqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJywKKyAgICAgICAgJyoqJywKKyAgICAgICAgJyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUnLAorICAgICAgICAnKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywnLAorICAgICAgICAnKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuJywKKyAgICAgICAgJyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQnLAorICAgICAgICAnKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuJywKKyAgICAgICAgJyovJywKKyAgICAgICAgJycKKyAgICBdCisKKyAgICAjIFRleHQgc3BlY2lmaWMgdG8gVnVsa2FuIGhlYWRlcnMKKyAgICB2a1ByZWZpeFN0cmluZ3MgPSBbCisgICAgICAgICcvKicsCisgICAgICAgICcqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBWdWxrYW4gWE1MIEFQSSBSZWdpc3RyeS4nLAorICAgICAgICAnKionLAorICAgICAgICAnKi8nLAorICAgICAgICAnJworICAgIF0KKworICAgICMgRGVmYXVsdHMgZm9yIGdlbmVyYXRpbmcgcmUtaW5jbHVzaW9uIHByb3RlY3Rpb24gd3JhcHBlcnMgKG9yIG5vdCkKKyAgICBwcm90ZWN0RmVhdHVyZSA9IHByb3RlY3QKKworICAgICMgQW4gQVBJIHN0eWxlIGNvbnZlbnRpb24gb2JqZWN0CisgICAgY29udmVudGlvbnMgPSBWdWxrYW5Db252ZW50aW9ucygpCisKKyAgICAjIFZhbGlkYXRpb25MYXllciBHZW5lcmF0b3JzCisgICAgIyBPcHRpb25zIGZvciB0aHJlYWQgc2FmZXR5IGhlYWRlciBjb2RlLWdlbmVyYXRpb24KKyAgICBnZW5PcHRzWyd0aHJlYWRfc2FmZXR5LmgnXSA9IFsKKyAgICAgICAgICBUaHJlYWRPdXRwdXRHZW5lcmF0b3IsCisgICAgICAgICAgVGhyZWFkR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICd0aHJlYWRfc2FmZXR5LmgnLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlICAgID0gRmFsc2UsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIHRocmVhZCBzYWZldHkgc291cmNlIGNvZGUtZ2VuZXJhdGlvbgorICAgIGdlbk9wdHNbJ3RocmVhZF9zYWZldHkuY3BwJ10gPSBbCisgICAgICAgICAgVGhyZWFkT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIFRocmVhZEdlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSAndGhyZWFkX3NhZmV0eS5jcHAnLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlICAgID0gRmFsc2UsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIHN0YXRlbGVzcyB2YWxpZGF0aW9uIHNvdXJjZSBmaWxlCisgICAgZ2VuT3B0c1sncGFyYW1ldGVyX3ZhbGlkYXRpb24uY3BwJ10gPSBbCisgICAgICAgICAgUGFyYW1ldGVyVmFsaWRhdGlvbk91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBQYXJhbWV0ZXJWYWxpZGF0aW9uR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICdwYXJhbWV0ZXJfdmFsaWRhdGlvbi5jcHAnLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIGFwaWNhbGwgICAgICAgICAgID0gJ1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5ICAgICAgICAgID0gJ1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJ1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtICAgID0gNDgsCisgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzICA9IEZhbHNlLAorICAgICAgICAgICAgdmFsaWRfdXNhZ2VfcGF0aCAgPSBhcmdzLnNjcmlwdHMpCisgICAgICAgICAgXQorCisgICAgIyBPcHRpb25zIGZvciBzdGF0ZWxlc3MgdmFsaWRhdGlvbiBzb3VyY2UgZmlsZQorICAgIGdlbk9wdHNbJ3BhcmFtZXRlcl92YWxpZGF0aW9uLmgnXSA9IFsKKyAgICAgICAgICBQYXJhbWV0ZXJWYWxpZGF0aW9uT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIFBhcmFtZXRlclZhbGlkYXRpb25HZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3BhcmFtZXRlcl92YWxpZGF0aW9uLmgnLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIGFwaWNhbGwgICAgICAgICAgID0gJ1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5ICAgICAgICAgID0gJ1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJ1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtICAgID0gNDgsCisgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzICA9IEZhbHNlLAorICAgICAgICAgICAgdmFsaWRfdXNhZ2VfcGF0aCAgPSBhcmdzLnNjcmlwdHMpCisgICAgICAgICAgXQorCisgICAgIyBPcHRpb25zIGZvciBvYmplY3RfdHJhY2tlciBjb2RlLWdlbmVyYXRlZCB2YWxpZGF0aW9uIHJvdXRpbmVzCisgICAgZ2VuT3B0c1snb2JqZWN0X3RyYWNrZXIuY3BwJ10gPSBbCisgICAgICAgICAgT2JqZWN0VHJhY2tlck91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBPYmplY3RUcmFja2VyR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICdvYmplY3RfdHJhY2tlci5jcHAnLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlICAgID0gRmFsc2UsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyAgPSBGYWxzZSwKKyAgICAgICAgICAgIHZhbGlkX3VzYWdlX3BhdGggID0gYXJncy5zY3JpcHRzKQorICAgICAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIG9iamVjdF90cmFja2VyIGNvZGUtZ2VuZXJhdGVkIHByb3RvdHlwZXMKKyAgICBnZW5PcHRzWydvYmplY3RfdHJhY2tlci5oJ10gPSBbCisgICAgICAgICAgT2JqZWN0VHJhY2tlck91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBPYmplY3RUcmFja2VyR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICdvYmplY3RfdHJhY2tlci5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBwcm90ZWN0RmVhdHVyZSAgICA9IEZhbHNlLAorICAgICAgICAgICAgYXBpY2FsbCAgICAgICAgICAgPSAnVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnVktBUElfQ0FMTCAnLAorICAgICAgICAgICAgYXBpZW50cnlwICAgICAgICAgPSAnVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gICAgPSA0OCwKKyAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgID0gRmFsc2UsCisgICAgICAgICAgICB2YWxpZF91c2FnZV9wYXRoICA9IGFyZ3Muc2NyaXB0cykKKyAgICAgICAgXQorCisgICAgIyBPcHRpb25zIGZvciBkaXNwYXRjaCB0YWJsZSBoZWxwZXIgZ2VuZXJhdG9yCisgICAgZ2VuT3B0c1sndmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgnXSA9IFsKKyAgICAgICAgICBEaXNwYXRjaFRhYmxlSGVscGVyT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIERpc3BhdGNoVGFibGVIZWxwZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3ZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIGx2dF9maWxlIGdlbmVyYXRvciBvcHRpb25zIGZvciBsdnRfZnVuY3Rpb25fcG9pbnRlcnMuaAorICAgIGdlbk9wdHNbJ2x2dF9mdW5jdGlvbl9wb2ludGVycy5oJ10gPSBbCisgICAgICAgICAgTHZ0RmlsZU91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBMdnRGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICdsdnRfZnVuY3Rpb25fcG9pbnRlcnMuaCcsCisgICAgICAgICAgICBkaXJlY3RvcnkgICAgICAgICA9IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWUgICAgICAgICAgID0gJ3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlICAgICAgICAgICA9IE5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucyAgICAgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gJ3Z1bGthbicsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IGFkZEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IHJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBwcmVmaXhTdHJpbmdzICsgdmtQcmVmaXhTdHJpbmdzLAorICAgICAgICAgICAgYXBpY2FsbCAgICAgICAgICAgPSAnVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnVktBUElfQ0FMTCAnLAorICAgICAgICAgICAgYXBpZW50cnlwICAgICAgICAgPSAnVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gICAgPSA0OCwKKyAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgPSBGYWxzZSwKKyAgICAgICAgICAgIGx2dF9maWxlX3R5cGUgID0gJ2Z1bmN0aW9uX3BvaW50ZXJfaGVhZGVyJykKKyAgICAgICAgXQorCisgICAgIyBsdnRfZmlsZSBnZW5lcmF0b3Igb3B0aW9ucyBmb3IgbHZ0X2Z1bmN0aW9uX3BvaW50ZXJzLmNwcAorICAgIGdlbk9wdHNbJ2x2dF9mdW5jdGlvbl9wb2ludGVycy5jcHAnXSA9IFsKKyAgICAgICAgICBMdnRGaWxlT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIEx2dEZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ2x2dF9mdW5jdGlvbl9wb2ludGVycy5jcHAnLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIGFwaWNhbGwgICAgICAgICAgID0gJ1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5ICAgICAgICAgID0gJ1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJ1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtICAgID0gNDgsCisgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gRmFsc2UsCisgICAgICAgICAgICBsdnRfZmlsZV90eXBlICA9ICdmdW5jdGlvbl9wb2ludGVyX3NvdXJjZScpCisgICAgICAgIF0KKworICAgICMgT3B0aW9ucyBmb3IgTGF5ZXIgZGlzcGF0Y2ggdGFibGUgZ2VuZXJhdG9yCisgICAgZ2VuT3B0c1sndmtfbGF5ZXJfZGlzcGF0Y2hfdGFibGUuaCddID0gWworICAgICAgICAgIExheWVyRGlzcGF0Y2hUYWJsZU91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBMYXllckRpc3BhdGNoVGFibGVHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3ZrX2xheWVyX2Rpc3BhdGNoX3RhYmxlLmgnLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIGFwaWNhbGwgICAgICAgICAgID0gJ1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5ICAgICAgICAgID0gJ1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJ1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtICAgID0gNDgsCisgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gRmFsc2UpCisgICAgICAgIF0KKworICAgICMgSGVscGVyIGZpbGUgZ2VuZXJhdG9yIG9wdGlvbnMgZm9yIHZrX2VudW1fc3RyaW5nX2hlbHBlci5oCisgICAgZ2VuT3B0c1sndmtfZW51bV9zdHJpbmdfaGVscGVyLmgnXSA9IFsKKyAgICAgICAgICBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3ZrX2VudW1fc3RyaW5nX2hlbHBlci5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyAgPSBGYWxzZSwKKyAgICAgICAgICAgIGhlbHBlcl9maWxlX3R5cGUgID0gJ2VudW1fc3RyaW5nX2hlYWRlcicpCisgICAgICAgIF0KKworICAgICMgSGVscGVyIGZpbGUgZ2VuZXJhdG9yIG9wdGlvbnMgZm9yIHZrX3NhZmVfc3RydWN0LmgKKyAgICBnZW5PcHRzWyd2a19zYWZlX3N0cnVjdC5oJ10gPSBbCisgICAgICAgICAgSGVscGVyRmlsZU91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICd2a19zYWZlX3N0cnVjdC5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyAgPSBGYWxzZSwKKyAgICAgICAgICAgIGhlbHBlcl9maWxlX3R5cGUgID0gJ3NhZmVfc3RydWN0X2hlYWRlcicpCisgICAgICAgIF0KKworICAgICMgSGVscGVyIGZpbGUgZ2VuZXJhdG9yIG9wdGlvbnMgZm9yIHZrX3NhZmVfc3RydWN0LmNwcAorICAgIGdlbk9wdHNbJ3ZrX3NhZmVfc3RydWN0LmNwcCddID0gWworICAgICAgICAgIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3IsCisgICAgICAgICAgSGVscGVyRmlsZU91dHB1dEdlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSAndmtfc2FmZV9zdHJ1Y3QuY3BwJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyAgPSBGYWxzZSwKKyAgICAgICAgICAgIGhlbHBlcl9maWxlX3R5cGUgID0gJ3NhZmVfc3RydWN0X3NvdXJjZScpCisgICAgICAgIF0KKworICAgICMgSGVscGVyIGZpbGUgZ2VuZXJhdG9yIG9wdGlvbnMgZm9yIHZrX29iamVjdF90eXBlcy5oCisgICAgZ2VuT3B0c1sndmtfb2JqZWN0X3R5cGVzLmgnXSA9IFsKKyAgICAgICAgICBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3ZrX29iamVjdF90eXBlcy5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyAgPSBGYWxzZSwKKyAgICAgICAgICAgIGhlbHBlcl9maWxlX3R5cGUgID0gJ29iamVjdF90eXBlc19oZWFkZXInKQorICAgICAgICBdCisKKyAgICAjIEhlbHBlciBmaWxlIGdlbmVyYXRvciBvcHRpb25zIGZvciBleHRlbnNpb25faGVscGVyLmgKKyAgICBnZW5PcHRzWyd2a19leHRlbnNpb25faGVscGVyLmgnXSA9IFsKKyAgICAgICAgICBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIEhlbHBlckZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ3ZrX2V4dGVuc2lvbl9oZWxwZXIuaCcsCisgICAgICAgICAgICBkaXJlY3RvcnkgICAgICAgICA9IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWUgICAgICAgICAgID0gJ3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlICAgICAgICAgICA9IE5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucyAgICAgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gJ3Z1bGthbicsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IGFkZEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IHJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBwcmVmaXhTdHJpbmdzICsgdmtQcmVmaXhTdHJpbmdzLAorICAgICAgICAgICAgYXBpY2FsbCAgICAgICAgICAgPSAnVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnVktBUElfQ0FMTCAnLAorICAgICAgICAgICAgYXBpZW50cnlwICAgICAgICAgPSAnVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gICAgPSA0OCwKKyAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgID0gRmFsc2UsCisgICAgICAgICAgICBoZWxwZXJfZmlsZV90eXBlICA9ICdleHRlbnNpb25faGVscGVyX2hlYWRlcicpCisgICAgICAgIF0KKworICAgICMgSGVscGVyIGZpbGUgZ2VuZXJhdG9yIG9wdGlvbnMgZm9yIHR5cGVtYXBfaGVscGVyLmgKKyAgICBnZW5PcHRzWyd2a190eXBlbWFwX2hlbHBlci5oJ10gPSBbCisgICAgICAgICAgSGVscGVyRmlsZU91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICd2a190eXBlbWFwX2hlbHBlci5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBwcm90ZWN0RmVhdHVyZSAgICA9IEZhbHNlLAorICAgICAgICAgICAgYXBpY2FsbCAgICAgICAgICAgPSAnVktBUElfQVRUUiAnLAorICAgICAgICAgICAgYXBpZW50cnkgICAgICAgICAgPSAnVktBUElfQ0FMTCAnLAorICAgICAgICAgICAgYXBpZW50cnlwICAgICAgICAgPSAnVktBUElfUFRSIConLAorICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gICAgPSA0OCwKKyAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgID0gRmFsc2UsCisgICAgICAgICAgICBoZWxwZXJfZmlsZV90eXBlICA9ICd0eXBlbWFwX2hlbHBlcl9oZWFkZXInKQorICAgICAgICBdCisKKyAgICAjIExheWVyIGNoYXNzaXMgcmVsYXRlZCBnZW5lcmF0aW9uIHN0cnVjdHMKKyAgICAjIE9wdGlvbnMgZm9yIGxheWVyIGNoYXNzaXMgaGVhZGVyCisgICAgZ2VuT3B0c1snY2hhc3Npcy5oJ10gPSBbCisgICAgICAgICAgTGF5ZXJDaGFzc2lzT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIExheWVyQ2hhc3Npc0dlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSAnY2hhc3Npcy5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgaGVscGVyX2ZpbGVfdHlwZSAgPSAnbGF5ZXJfY2hhc3Npc19oZWFkZXInLAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIGxheWVyIGNoYXNzaXMgc291cmNlIGZpbGUKKyAgICBnZW5PcHRzWydjaGFzc2lzLmNwcCddID0gWworICAgICAgICAgIExheWVyQ2hhc3Npc091dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBMYXllckNoYXNzaXNHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ2NoYXNzaXMuY3BwJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgaGVscGVyX2ZpbGVfdHlwZSAgPSAnbGF5ZXJfY2hhc3Npc19zb3VyY2UnLAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIE9wdGlvbnMgZm9yIGxheWVyIGNoYXNzaXMgZGlzcGF0Y2ggc291cmNlIGZpbGUKKyAgICBnZW5PcHRzWydsYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmNwcCddID0gWworICAgICAgICAgIExheWVyQ2hhc3Npc0Rpc3BhdGNoT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIExheWVyQ2hhc3Npc0Rpc3BhdGNoR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICdsYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmNwcCcsCisgICAgICAgICAgICBkaXJlY3RvcnkgICAgICAgICA9IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIGFwaW5hbWUgICAgICAgICAgID0gJ3Z1bGthbicsCisgICAgICAgICAgICBwcm9maWxlICAgICAgICAgICA9IE5vbmUsCisgICAgICAgICAgICB2ZXJzaW9ucyAgICAgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZW1pdHZlcnNpb25zICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gJ3Z1bGthbicsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zICAgICA9IGFkZEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zICA9IHJlbW92ZUV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyAgICA9IGVtaXRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBwcmVmaXhTdHJpbmdzICsgdmtQcmVmaXhTdHJpbmdzLAorICAgICAgICAgICAgcHJvdGVjdEZlYXR1cmUgICAgPSBGYWxzZSwKKyAgICAgICAgICAgIGFwaWNhbGwgICAgICAgICAgID0gJ1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5ICAgICAgICAgID0gJ1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJ1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtICAgID0gNDgsCisgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gRmFsc2UpCisgICAgICAgIF0KKworICAgICMgT3B0aW9ucyBmb3IgbGF5ZXIgY2hhc3NpcyBkaXNwYXRjaCBoZWFkZXIgZmlsZQorICAgIGdlbk9wdHNbJ2xheWVyX2NoYXNzaXNfZGlzcGF0Y2guaCddID0gWworICAgICAgICAgIExheWVyQ2hhc3Npc0Rpc3BhdGNoT3V0cHV0R2VuZXJhdG9yLAorICAgICAgICAgIExheWVyQ2hhc3Npc0Rpc3BhdGNoR2VuZXJhdG9yT3B0aW9ucygKKyAgICAgICAgICAgIGNvbnZlbnRpb25zICAgICAgID0gY29udmVudGlvbnMsCisgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgICA9ICdsYXllcl9jaGFzc2lzX2Rpc3BhdGNoLmgnLAorICAgICAgICAgICAgZGlyZWN0b3J5ICAgICAgICAgPSBkaXJlY3RvcnksCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBmZWF0dXJlc1BhdCwKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBhZGRFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSByZW1vdmVFeHRlbnNpb25zUGF0LAorICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgICAgPSBlbWl0RXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHByZWZpeFRleHQgICAgICAgID0gcHJlZml4U3RyaW5ncyArIHZrUHJlZml4U3RyaW5ncywKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlICAgID0gRmFsc2UsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlKQorICAgICAgICBdCisKKyAgICAjIGdlbmVyYXRvciBmb3IgY29tbWFuZF9jb3VudGVyLmgKKyAgICBnZW5PcHRzWydjb21tYW5kX2NvdW50ZXJfaGVscGVyLmgnXSA9IFsKKyAgICAgICAgICBDb21tYW5kQ291bnRlck91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgICBDb21tYW5kQ291bnRlck91dHB1dEdlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBjb252ZW50aW9ucyAgICAgICA9IGNvbnZlbnRpb25zLAorICAgICAgICAgICAgZmlsZW5hbWUgICAgICAgICAgPSAnY29tbWFuZF9jb3VudGVyX2hlbHBlci5oJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlLAorICAgICAgICAgICAgbHZ0X2ZpbGVfdHlwZSAgPSAnZnVuY3Rpb25fcG9pbnRlcl9oZWFkZXInKQorICAgICAgICBdCisKKyAgICAjIGdlbmVyYXRvciBmb3IgY29tbWFuZF9jb3VudGVyLmNwcAorICAgIGdlbk9wdHNbJ2NvbW1hbmRfY291bnRlcl9oZWxwZXIuY3BwJ10gPSBbCisgICAgICAgICAgQ29tbWFuZENvdW50ZXJPdXRwdXRHZW5lcmF0b3IsCisgICAgICAgICAgQ29tbWFuZENvdW50ZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgY29udmVudGlvbnMgICAgICAgPSBjb252ZW50aW9ucywKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ2NvbW1hbmRfY291bnRlcl9oZWxwZXIuY3BwJywKKyAgICAgICAgICAgIGRpcmVjdG9yeSAgICAgICAgID0gZGlyZWN0b3J5LAorICAgICAgICAgICAgYXBpbmFtZSAgICAgICAgICAgPSAndnVsa2FuJywKKyAgICAgICAgICAgIHByb2ZpbGUgICAgICAgICAgID0gTm9uZSwKKyAgICAgICAgICAgIHZlcnNpb25zICAgICAgICAgID0gZmVhdHVyZXNQYXQsCisgICAgICAgICAgICBlbWl0dmVyc2lvbnMgICAgICA9IGZlYXR1cmVzUGF0LAorICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSAndnVsa2FuJywKKyAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgICAgID0gYWRkRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgID0gcmVtb3ZlRXh0ZW5zaW9uc1BhdCwKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zICAgID0gZW1pdEV4dGVuc2lvbnNQYXQsCisgICAgICAgICAgICBwcmVmaXhUZXh0ICAgICAgICA9IHByZWZpeFN0cmluZ3MgKyB2a1ByZWZpeFN0cmluZ3MsCisgICAgICAgICAgICBhcGljYWxsICAgICAgICAgICA9ICdWS0FQSV9BVFRSICcsCisgICAgICAgICAgICBhcGllbnRyeSAgICAgICAgICA9ICdWS0FQSV9DQUxMICcsCisgICAgICAgICAgICBhcGllbnRyeXAgICAgICAgICA9ICdWS0FQSV9QVFIgKicsCisgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSAgICA9IDQ4LAorICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IEZhbHNlLAorICAgICAgICAgICAgbHZ0X2ZpbGVfdHlwZSAgPSAnZnVuY3Rpb25fcG9pbnRlcl9zb3VyY2UnKQorICAgICAgICBdCisKKworIyBHZW5lcmF0ZSBhIHRhcmdldCBiYXNlZCBvbiB0aGUgb3B0aW9ucyBpbiB0aGUgbWF0Y2hpbmcgZ2VuT3B0c3t9IG9iamVjdC4KKyMgVGhpcyBpcyBlbmNhcHN1bGF0ZWQgaW4gYSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgcHJvZmlsZWQgYW5kL29yIHRpbWVkLgorIyBUaGUgYXJncyBwYXJhbWV0ZXIgaXMgYW4gcGFyc2VkIGFyZ3VtZW50IG9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcKKyMgZmllbGRzIHRoYXQgYXJlIHVzZWQ6CisjICAgdGFyZ2V0IC0gdGFyZ2V0IHRvIGdlbmVyYXRlCisjICAgZGlyZWN0b3J5IC0gZGlyZWN0b3J5IHRvIGdlbmVyYXRlIGl0IGluCisjICAgcHJvdGVjdCAtIFRydWUgaWYgcmUtaW5jbHVzaW9uIHdyYXBwZXJzIHNob3VsZCBiZSBjcmVhdGVkCisjICAgZXh0ZW5zaW9ucyAtIGxpc3Qgb2YgYWRkaXRpb25hbCBleHRlbnNpb25zIHRvIGluY2x1ZGUgaW4gZ2VuZXJhdGVkCisjICAgaW50ZXJmYWNlcworZGVmIGdlblRhcmdldChhcmdzKToKKyAgICBnbG9iYWwgZ2VuT3B0cworCisgICAgIyBDcmVhdGUgZ2VuZXJhdG9yIG9wdGlvbnMgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgIG1ha2VHZW5PcHRzKGFyZ3MpCisKKyAgICBpZiAoYXJncy50YXJnZXQgaW4gZ2VuT3B0cy5rZXlzKCkpOgorICAgICAgICBjcmVhdGVHZW5lcmF0b3IgPSBnZW5PcHRzW2FyZ3MudGFyZ2V0XVswXQorICAgICAgICBvcHRpb25zID0gZ2VuT3B0c1thcmdzLnRhcmdldF1bMV0KKworICAgICAgICBpZiBub3QgYXJncy5xdWlldDoKKyAgICAgICAgICAgIHdyaXRlKCcqIEJ1aWxkaW5nJywgb3B0aW9ucy5maWxlbmFtZSwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy52ZXJzaW9ucyAgICAgICAgICA9Jywgb3B0aW9ucy52ZXJzaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5lbWl0dmVyc2lvbnMgICAgICA9Jywgb3B0aW9ucy5lbWl0dmVyc2lvbnMsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHdyaXRlKCcqIG9wdGlvbnMuZGVmYXVsdEV4dGVuc2lvbnMgPScsIG9wdGlvbnMuZGVmYXVsdEV4dGVuc2lvbnMsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHdyaXRlKCcqIG9wdGlvbnMuYWRkRXh0ZW5zaW9ucyAgICAgPScsIG9wdGlvbnMuYWRkRXh0ZW5zaW9ucywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgd3JpdGUoJyogb3B0aW9ucy5yZW1vdmVFeHRlbnNpb25zICA9Jywgb3B0aW9ucy5yZW1vdmVFeHRlbnNpb25zLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICB3cml0ZSgnKiBvcHRpb25zLmVtaXRFeHRlbnNpb25zICAgID0nLCBvcHRpb25zLmVtaXRFeHRlbnNpb25zLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICAgICAgc3RhcnRUaW1lcihhcmdzLnRpbWUpCisgICAgICAgIGdlbiA9IGNyZWF0ZUdlbmVyYXRvcihlcnJGaWxlPWVycldhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuRmlsZT1lcnJXYXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ0ZpbGU9ZGlhZykKKyAgICAgICAgcmVnLnNldEdlbmVyYXRvcihnZW4pCisgICAgICAgIHJlZy5hcGlHZW4ob3B0aW9ucykKKworICAgICAgICBpZiBub3QgYXJncy5xdWlldDoKKyAgICAgICAgICAgIHdyaXRlKCcqIEdlbmVyYXRlZCcsIG9wdGlvbnMuZmlsZW5hbWUsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgZW5kVGltZXIoYXJncy50aW1lLCAnKiBUaW1lIHRvIGdlbmVyYXRlICcgKyBvcHRpb25zLmZpbGVuYW1lICsgJyA9JykKKyAgICBlbHNlOgorICAgICAgICB3cml0ZSgnTm8gZ2VuZXJhdG9yIG9wdGlvbnMgZm9yIHVua25vd24gdGFyZ2V0OicsCisgICAgICAgICAgICAgIGFyZ3MudGFyZ2V0LCBmaWxlPXN5cy5zdGRlcnIpCisKKyMgLWZlYXR1cmUgbmFtZQorIyAtZXh0ZW5zaW9uIG5hbWUKKyMgRm9yIGJvdGgsICJuYW1lIiBtYXkgYmUgYSBzaW5nbGUgbmFtZSwgb3IgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdAorIyBvZiBuYW1lcywgb3IgYSByZWd1bGFyIGV4cHJlc3Npb24uCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kZWZhdWx0RXh0ZW5zaW9ucycsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ndnVsa2FuJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYSBzaW5nbGUgY2xhc3Mgb2YgZXh0ZW5zaW9ucyB0byBhZGQgdG8gdGFyZ2V0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWV4dGVuc2lvbicsIGFjdGlvbj0nYXBwZW5kJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGFuIGV4dGVuc2lvbiBvciBleHRlbnNpb25zIHRvIGFkZCB0byB0YXJnZXRzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcmVtb3ZlRXh0ZW5zaW9ucycsIGFjdGlvbj0nYXBwZW5kJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGFuIGV4dGVuc2lvbiBvciBleHRlbnNpb25zIHRvIHJlbW92ZSBmcm9tIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1lbWl0RXh0ZW5zaW9ucycsIGFjdGlvbj0nYXBwZW5kJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGFuIGV4dGVuc2lvbiBvciBleHRlbnNpb25zIHRvIGVtaXQgaW4gdGFyZ2V0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWZlYXR1cmUnLCBhY3Rpb249J2FwcGVuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhIGNvcmUgQVBJIGZlYXR1cmUgbmFtZSBvciBuYW1lcyB0byBhZGQgdG8gdGFyZ2V0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0VuYWJsZSBkZWJ1Z2dpbmcnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kdW1wJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0VuYWJsZSBkdW1wIHRvIHN0ZGVycicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWRpYWdmaWxlJywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdXcml0ZSBkaWFnbm9zdGljcyB0byBzcGVjaWZpZWQgZmlsZScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWVycmZpbGUnLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1dyaXRlIGVycm9ycyBhbmQgd2FybmluZ3MgdG8gc3BlY2lmaWVkIGZpbGUgaW5zdGVhZCBvZiBzdGRlcnInKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1ub3Byb3RlY3QnLCBkZXN0PSdwcm90ZWN0JywgYWN0aW9uPSdzdG9yZV9mYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdEaXNhYmxlIGluY2x1c2lvbiBwcm90ZWN0aW9uIGluIG91dHB1dCBoZWFkZXJzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcHJvZmlsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgcHJvZmlsaW5nJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcmVnaXN0cnknLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J3ZrLnhtbCcsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdVc2Ugc3BlY2lmaWVkIHJlZ2lzdHJ5IGZpbGUgaW5zdGVhZCBvZiB2ay54bWwnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy10aW1lJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0VuYWJsZSB0aW1pbmcnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy12YWxpZGF0ZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgZ3JvdXAgdmFsaWRhdGlvbicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLW8nLCBhY3Rpb249J3N0b3JlJywgZGVzdD0nZGlyZWN0b3J5JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Jy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nQ3JlYXRlIHRhcmdldCBhbmQgcmVsYXRlZCBmaWxlcyBpbiBzcGVjaWZpZWQgZGlyZWN0b3J5JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd0YXJnZXQnLCBtZXRhdmFyPSd0YXJnZXQnLCBuYXJncz0nPycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IHRhcmdldCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXF1aWV0JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3VwcHJlc3Mgc2NyaXB0IG91dHB1dCBkdXJpbmcgbm9ybWFsIGV4ZWN1dGlvbi4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV9mYWxzZScsIGRlc3Q9J3F1aWV0JywgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIHNjcmlwdCBvdXRwdXQgZHVyaW5nIG5vcm1hbCBleGVjdXRpb24uJykKKworICAgICMgVGhpcyBhcmd1bWVudCB0ZWxscyB1cyB3aGVyZSB0byBsb2FkIHRoZSBzY3JpcHQgZnJvbSB0aGUgVnVsa2FuLUhlYWRlcnMgcmVnaXN0cnkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctc2NyaXB0cycsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRmluZCBhZGRpdGlvbmFsIHNjcmlwdHMgaW4gdGhpcyBkaXJlY3RvcnknKQorCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgICMgZGVmYXVsdCBzY3JpcHRzIHBhdGggdG8gYmUgc2FtZSBhcyByZWdpc3RyeQorICAgIGlmIG5vdCBhcmdzLnNjcmlwdHM6CisgICAgICAgIGFyZ3Muc2NyaXB0cyA9IG9zLnBhdGguZGlybmFtZShhcmdzLnJlZ2lzdHJ5KQorCisgICAgc2NyaXB0c19kaXJlY3RvcnlfcGF0aCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQorICAgIHJlZ2lzdHJ5X2hlYWRlcnNfcGF0aCA9IG9zLnBhdGguam9pbihzY3JpcHRzX2RpcmVjdG9yeV9wYXRoLCBhcmdzLnNjcmlwdHMpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHJlZ2lzdHJ5X2hlYWRlcnNfcGF0aCkKKworICAgIGZyb20gcmVnIGltcG9ydCAqCisgICAgZnJvbSBnZW5lcmF0b3IgaW1wb3J0IHdyaXRlCisgICAgZnJvbSBjZ2VuZXJhdG9yIGltcG9ydCBDR2VuZXJhdG9yT3B0aW9ucywgQ091dHB1dEdlbmVyYXRvcgorCisgICAgIyBWYWxpZGF0aW9uTGF5ZXIgR2VuZXJhdG9yIE1vZGlmaWNhdGlvbnMKKyAgICBmcm9tIHRocmVhZF9zYWZldHlfZ2VuZXJhdG9yIGltcG9ydCAgVGhyZWFkR2VuZXJhdG9yT3B0aW9ucywgVGhyZWFkT3V0cHV0R2VuZXJhdG9yCisgICAgZnJvbSBwYXJhbWV0ZXJfdmFsaWRhdGlvbl9nZW5lcmF0b3IgaW1wb3J0IFBhcmFtZXRlclZhbGlkYXRpb25HZW5lcmF0b3JPcHRpb25zLCBQYXJhbWV0ZXJWYWxpZGF0aW9uT3V0cHV0R2VuZXJhdG9yCisgICAgZnJvbSBvYmplY3RfdHJhY2tlcl9nZW5lcmF0b3IgaW1wb3J0IE9iamVjdFRyYWNrZXJHZW5lcmF0b3JPcHRpb25zLCBPYmplY3RUcmFja2VyT3V0cHV0R2VuZXJhdG9yCisgICAgZnJvbSBkaXNwYXRjaF90YWJsZV9oZWxwZXJfZ2VuZXJhdG9yIGltcG9ydCBEaXNwYXRjaFRhYmxlSGVscGVyT3V0cHV0R2VuZXJhdG9yLCBEaXNwYXRjaFRhYmxlSGVscGVyT3V0cHV0R2VuZXJhdG9yT3B0aW9ucworICAgIGZyb20gaGVscGVyX2ZpbGVfZ2VuZXJhdG9yIGltcG9ydCBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yLCBIZWxwZXJGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucworICAgIGZyb20gbGF5ZXJfZGlzcGF0Y2hfdGFibGVfZ2VuZXJhdG9yIGltcG9ydCBMYXllckRpc3BhdGNoVGFibGVPdXRwdXRHZW5lcmF0b3IsIExheWVyRGlzcGF0Y2hUYWJsZUdlbmVyYXRvck9wdGlvbnMKKyAgICBmcm9tIGxheWVyX2NoYXNzaXNfZ2VuZXJhdG9yIGltcG9ydCBMYXllckNoYXNzaXNPdXRwdXRHZW5lcmF0b3IsIExheWVyQ2hhc3Npc0dlbmVyYXRvck9wdGlvbnMKKyAgICBmcm9tIGxheWVyX2NoYXNzaXNfZGlzcGF0Y2hfZ2VuZXJhdG9yIGltcG9ydCBMYXllckNoYXNzaXNEaXNwYXRjaE91dHB1dEdlbmVyYXRvciwgTGF5ZXJDaGFzc2lzRGlzcGF0Y2hHZW5lcmF0b3JPcHRpb25zCisgICAgZnJvbSBsdnRfZmlsZV9nZW5lcmF0b3IgaW1wb3J0IEx2dEZpbGVPdXRwdXRHZW5lcmF0b3IsIEx2dEZpbGVPdXRwdXRHZW5lcmF0b3JPcHRpb25zCisgICAgZnJvbSBjb21tYW5kX2NvdW50ZXJfZ2VuZXJhdG9yIGltcG9ydCBDb21tYW5kQ291bnRlck91dHB1dEdlbmVyYXRvciwgQ29tbWFuZENvdW50ZXJPdXRwdXRHZW5lcmF0b3JPcHRpb25zCisKKyAgICAjIFRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciB2a2NvbnZlbnRpb25zIHB5dGhvbjIgY29tcGF0aWJpbGl0eQorICAgIGltcG9ydCBhYmM7IGFiYy5BQkMgPSBhYmMuQUJDTWV0YSgnQUJDJywgKG9iamVjdCwpLCB7fSkKKyAgICBmcm9tIHZrY29udmVudGlvbnMgaW1wb3J0IFZ1bGthbkNvbnZlbnRpb25zCisKKyAgICAjIFRoaXMgc3BsaXRzIGFyZ3VtZW50cyB3aGljaCBhcmUgc3BhY2Utc2VwYXJhdGVkIGxpc3RzCisgICAgYXJncy5mZWF0dXJlID0gW25hbWUgZm9yIGFyZyBpbiBhcmdzLmZlYXR1cmUgZm9yIG5hbWUgaW4gYXJnLnNwbGl0KCldCisgICAgYXJncy5leHRlbnNpb24gPSBbbmFtZSBmb3IgYXJnIGluIGFyZ3MuZXh0ZW5zaW9uIGZvciBuYW1lIGluIGFyZy5zcGxpdCgpXQorCisgICAgIyBMb2FkICYgcGFyc2UgcmVnaXN0cnkKKyAgICByZWcgPSBSZWdpc3RyeSgpCisKKyAgICBzdGFydFRpbWVyKGFyZ3MudGltZSkKKyAgICB0cmVlID0gZXRyZWUucGFyc2UoYXJncy5yZWdpc3RyeSkKKyAgICBlbmRUaW1lcihhcmdzLnRpbWUsICcqIFRpbWUgdG8gbWFrZSBFbGVtZW50VHJlZSA9JykKKworICAgIGlmIGFyZ3MuZGVidWc6CisgICAgICAgIHBkYi5ydW4oJ3JlZy5sb2FkRWxlbWVudFRyZWUodHJlZSknKQorICAgIGVsc2U6CisgICAgICAgIHN0YXJ0VGltZXIoYXJncy50aW1lKQorICAgICAgICByZWcubG9hZEVsZW1lbnRUcmVlKHRyZWUpCisgICAgICAgIGVuZFRpbWVyKGFyZ3MudGltZSwgJyogVGltZSB0byBwYXJzZSBFbGVtZW50VHJlZSA9JykKKworICAgIGlmIChhcmdzLnZhbGlkYXRlKToKKyAgICAgICAgcmVnLnZhbGlkYXRlR3JvdXBzKCkKKworICAgIGlmIChhcmdzLmR1bXApOgorICAgICAgICB3cml0ZSgnKiBEdW1waW5nIHJlZ2lzdHJ5IHRvIHJlZ2R1bXAudHh0JywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZWcuZHVtcFJlZyhmaWxlaGFuZGxlID0gb3BlbigncmVnZHVtcC50eHQnLCAndycsIGVuY29kaW5nPSd1dGYtOCcpKQorCisgICAgIyBjcmVhdGUgZXJyb3Ivd2FybmluZyAmIGRpYWdub3N0aWMgZmlsZXMKKyAgICBpZiAoYXJncy5lcnJmaWxlKToKKyAgICAgICAgZXJyV2FybiA9IG9wZW4oYXJncy5lcnJmaWxlLCAndycsIGVuY29kaW5nPSd1dGYtOCcpCisgICAgZWxzZToKKyAgICAgICAgZXJyV2FybiA9IHN5cy5zdGRlcnIKKworICAgIGlmIChhcmdzLmRpYWdmaWxlKToKKyAgICAgICAgZGlhZyA9IG9wZW4oYXJncy5kaWFnZmlsZSwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKQorICAgIGVsc2U6CisgICAgICAgIGRpYWcgPSBOb25lCisKKyAgICBpZiAoYXJncy5kZWJ1Zyk6CisgICAgICAgIHBkYi5ydW4oJ2dlblRhcmdldChhcmdzKScpCisgICAgZWxpZiAoYXJncy5wcm9maWxlKToKKyAgICAgICAgaW1wb3J0IGNQcm9maWxlLCBwc3RhdHMKKyAgICAgICAgY1Byb2ZpbGUucnVuKCdnZW5UYXJnZXQoYXJncyknLCAncHJvZmlsZS50eHQnKQorICAgICAgICBwID0gcHN0YXRzLlN0YXRzKCdwcm9maWxlLnR4dCcpCisgICAgICAgIHAuc3RyaXBfZGlycygpLnNvcnRfc3RhdHMoJ3RpbWUnKS5wcmludF9zdGF0cyg1MCkKKyAgICBlbHNlOgorICAgICAgICBnZW5UYXJnZXQoYXJncykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbHZ0X2ZpbGVfZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9sdnRfZmlsZV9nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1NGY4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvbHZ0X2ZpbGVfZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMjU4IEBACisjIS91c3IvYmluL3B5dGhvbjMgLWkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisKK2ltcG9ydCBvcyxyZSxzeXMKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgZXRyZWUKK2Zyb20gZ2VuZXJhdG9yIGltcG9ydCAqCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCitmcm9tIGNvbW1vbl9jb2RlZ2VuIGltcG9ydCAqCisKK2Z1bmNwdHJfc291cmNlX3ByZWFtYmxlID0gJycnCisjaW5jbHVkZSAibHZ0X2Z1bmN0aW9uX3BvaW50ZXJzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIHZrIHsKKworJycnCisKK2Z1bmNwdHJfaGVhZGVyX3ByZWFtYmxlID0gJycnCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorI2luY2x1ZGUgInZrX2xvYWRlcl9wbGF0Zm9ybS5oIgorCituYW1lc3BhY2UgdmsgeworCisnJycKKworIworIyBMdnRGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucyAtIHN1YmNsYXNzIG9mIEdlbmVyYXRvck9wdGlvbnMuCitjbGFzcyBMdnRGaWxlT3V0cHV0R2VuZXJhdG9yT3B0aW9ucyhHZW5lcmF0b3JPcHRpb25zKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgY29udmVudGlvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9ICcuJywKKyAgICAgICAgICAgICAgICAgYXBpbmFtZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBOb25lLAorICAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyA9ICcuKicsCisgICAgICAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHJlbW92ZUV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHNvcnRQcm9jZWR1cmUgPSByZWdTb3J0RmVhdHVyZXMsCisgICAgICAgICAgICAgICAgIHByZWZpeFRleHQgPSAiIiwKKyAgICAgICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgYXBpY2FsbCA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeSA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeXAgPSAnJywKKyAgICAgICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgbHZ0X2ZpbGVfdHlwZSA9ICcnKToKKyAgICAgICAgR2VuZXJhdG9yT3B0aW9ucy5fX2luaXRfXyhzZWxmLCBjb252ZW50aW9ucywgZmlsZW5hbWUsIGRpcmVjdG9yeSwgYXBpbmFtZSwgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucywgZW1pdHZlcnNpb25zLCBkZWZhdWx0RXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zLCByZW1vdmVFeHRlbnNpb25zLCBlbWl0RXh0ZW5zaW9ucywgc29ydFByb2NlZHVyZSkKKyAgICAgICAgc2VsZi5wcmVmaXhUZXh0ICAgICAgPSBwcmVmaXhUZXh0CisgICAgICAgIHNlbGYuZ2VuRnVuY1BvaW50ZXJzID0gZ2VuRnVuY1BvaW50ZXJzCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gTm9uZQorICAgICAgICBzZWxmLmFwaWNhbGwgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgPSBhcGllbnRyeQorICAgICAgICBzZWxmLmFwaWVudHJ5cCAgICAgICA9IGFwaWVudHJ5cAorICAgICAgICBzZWxmLmFsaWduRnVuY1BhcmFtICA9IGFsaWduRnVuY1BhcmFtCisgICAgICAgIHNlbGYubHZ0X2ZpbGVfdHlwZSAgID0gbHZ0X2ZpbGVfdHlwZQorIworIyBMdnRGaWxlT3V0cHV0R2VuZXJhdG9yIC0gc3ViY2xhc3Mgb2YgT3V0cHV0R2VuZXJhdG9yLgorIyBHZW5lcmF0ZXMgZmlsZXMgbmVlZGVkIGJ5IHRoZSBsYXllciB2YWxpZGF0aW9uIHRlc3RzCitjbGFzcyBMdnRGaWxlT3V0cHV0R2VuZXJhdG9yKE91dHB1dEdlbmVyYXRvcik6CisgICAgIiIiR2VuZXJhdGUgTFZUIHN1cHBvcnQgZmlsZXMgYmFzZWQgb24gWE1MIGVsZW1lbnQgYXR0cmlidXRlcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBlcnJGaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgd2FybkZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICBkaWFnRmlsZSA9IHN5cy5zdGRvdXQpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuX19pbml0X18oc2VsZiwgZXJyRmlsZSwgd2FybkZpbGUsIGRpYWdGaWxlKQorICAgICAgICAjIEludGVybmFsIHN0YXRlIC0gYWNjdW11bGF0b3JzIGZvciBkaWZmZXJlbnQgaW5uZXIgYmxvY2sgdGV4dAorICAgICAgICBzZWxmLmRpc3BhdGNoX2xpc3QgPSBbXSAgICAgICAgICAgICAgICMgTGlzdCBvZiBlbnRyaWVzIGZvciBkaXNwYXRjaCBsaXN0CisgICAgIworICAgICMgQ2FsbGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bgorICAgIGRlZiBiZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cykKKworICAgICAgICAjIEluaXRpYWxpemUgbWVtYmVycyB0aGF0IHJlcXVpcmUgdGhlIHRyZWUKKyAgICAgICAgc2VsZi5oYW5kbGVfdHlwZXMgPSBHZXRIYW5kbGVUeXBlcyhzZWxmLnJlZ2lzdHJ5LnRyZWUpCisgICAgICAgIHNlbGYubHZ0X2ZpbGVfdHlwZSA9IGdlbk9wdHMubHZ0X2ZpbGVfdHlwZQorCisgICAgICAgIGlmIGdlbk9wdHMubHZ0X2ZpbGVfdHlwZSA9PSAnZnVuY3Rpb25fcG9pbnRlcl9oZWFkZXInOgorICAgICAgICAgICAgd3JpdGUoIiNwcmFnbWEgb25jZSIsIGZpbGU9c2VsZi5vdXRGaWxlKQorCisgICAgICAgICMgVXNlci1zdXBwbGllZCBwcmVmaXggdGV4dCwgaWYgYW55IChsaXN0IG9mIHN0cmluZ3MpCisgICAgICAgIGlmIChnZW5PcHRzLnByZWZpeFRleHQpOgorICAgICAgICAgICAgZm9yIHMgaW4gZ2VuT3B0cy5wcmVmaXhUZXh0OgorICAgICAgICAgICAgICAgIHdyaXRlKHMsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAjIEZpbGUgQ29tbWVudAorICAgICAgICBmaWxlX2NvbW1lbnQgPSAnLy8gKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCAqKipcbicKKyAgICAgICAgZmlsZV9jb21tZW50ICs9ICcvLyBTZWUgbHZ0X2ZpbGVfZ2VuZXJhdG9yLnB5IGZvciBtb2RpZmljYXRpb25zXG4nCisgICAgICAgIHdyaXRlKGZpbGVfY29tbWVudCwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICMgQ29weXJpZ2h0IE5vdGljZQorICAgICAgICBjb3B5cmlnaHQgPSAgJy8qXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTtcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUyxcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKi9cbicKKyAgICAgICAgd3JpdGUoY29weXJpZ2h0LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAjCisgICAgIyBXcml0ZSBjb21wbGV0ZWQgc291cmNlIGNvZGUgdG8gb3V0cHV0IGZpbGUKKyAgICBkZWYgZW5kRmlsZShzZWxmKToKKyAgICAgICAgZGVzdF9maWxlID0gJycKKyAgICAgICAgZGVzdF9maWxlICs9IHNlbGYuT3V0cHV0RGVzdEZpbGUoKQorICAgICAgICAjIFJlbW92ZSBibGFuayBsaW5lcyBhdCBFT0YKKyAgICAgICAgaWYgZGVzdF9maWxlLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgZGVzdF9maWxlID0gZGVzdF9maWxlWzotMV0KKyAgICAgICAgd3JpdGUoZGVzdF9maWxlLCBmaWxlPXNlbGYub3V0RmlsZSk7CisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorICAgICMKKyAgICAjIFByb2Nlc3NpbmcgYXQgYmVnaW5uaW5nIG9mIGVhY2ggZmVhdHVyZSBvciBleHRlbnNpb24KKyAgICBkZWYgYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KQorICAgICAgICBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgPSBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpCisKKyAgICAjCisgICAgIyBQcm9jZXNzIGNvbW1hbmRzLCBhZGRpbmcgdG8gZGlzcGF0Y2ggbGlzdAorICAgIGRlZiBnZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuQ21kKHNlbGYsIGNtZGluZm8sIG5hbWUsIGFsaWFzKQorICAgICAgICAjIEdldCBmaXJzdCBwYXJhbSB0eXBlCisgICAgICAgIHBhcmFtcyA9IGNtZGluZm8uZWxlbS5maW5kYWxsKCdwYXJhbScpCisgICAgICAgIGluZm8gPSBzZWxmLmdldFR5cGVOYW1lVHVwbGUocGFyYW1zWzBdKQorICAgICAgICBzZWxmLkFkZENvbW1hbmRUb0Rpc3BhdGNoTGlzdChuYW1lLCBpbmZvWzBdLCBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsIGNtZGluZm8pCisKKyAgICAjCisgICAgIyBEZXRlcm1pbmUgaWYgdGhpcyBBUEkgc2hvdWxkIGJlIGlnbm9yZWQgb3IgYWRkZWQgdG8gdGhlIGZ1bmNwdHIgbGlzdAorICAgIGRlZiBBZGRDb21tYW5kVG9EaXNwYXRjaExpc3Qoc2VsZiwgbmFtZSwgaGFuZGxlX3R5cGUsIHByb3RlY3QsIGNtZGluZm8pOgorICAgICAgICBXU0lfbWFuZGF0b3J5X2V4dGVuc2lvbnMgPSBbCisgICAgICAgICAgICAnVktfS0hSX3dpbjMyX3N1cmZhY2UnLAorICAgICAgICAgICAgJ1ZLX0tIUl94Y2Jfc3VyZmFjZScsCisgICAgICAgICAgICAnVktfS0hSX3hsaWJfc3VyZmFjZScsCisgICAgICAgICAgICAnVktfS0hSX3dheWxhbmRfc3VyZmFjZScsCisgICAgICAgICAgICAnVktfTVZLX21hY29zX3N1cmZhY2UnLAorICAgICAgICAgICAgJ1ZLX0tIUl9zdXJmYWNlJywKKyAgICAgICAgICAgICdWS19LSFJfc3dhcGNoYWluJywKKyAgICAgICAgICAgICdWS19LSFJfZGlzcGxheScsCisgICAgICAgICAgICAnVktfS0hSX2FuZHJvaWRfc3VyZmFjZScsCisgICAgICAgICAgICBdCisgICAgICAgIGlmICdWS19WRVJTSU9OJyBpbiBzZWxmLmZlYXR1cmVOYW1lIG9yIHNlbGYuZmVhdHVyZU5hbWUgaW4gV1NJX21hbmRhdG9yeV9leHRlbnNpb25zOgorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaF9saXN0LmFwcGVuZCgobmFtZSwgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0KSkKKyAgICAgICAgcmV0dXJuCisgICAgIworICAgICMgUmV0cmlldmUgdGhlIHR5cGUgYW5kIG5hbWUgZm9yIGEgcGFyYW1ldGVyCisgICAgZGVmIGdldFR5cGVOYW1lVHVwbGUoc2VsZiwgcGFyYW0pOgorICAgICAgICB0eXBlID0gJycKKyAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZvciBlbGVtIGluIHBhcmFtOgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gJ3R5cGUnOgorICAgICAgICAgICAgICAgIHR5cGUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgICAgIGVsaWYgZWxlbS50YWcgPT0gJ25hbWUnOgorICAgICAgICAgICAgICAgIG5hbWUgPSBub25lU3RyKGVsZW0udGV4dCkKKyAgICAgICAgcmV0dXJuICh0eXBlLCBuYW1lKQorICAgICMKKyAgICAjIENyZWF0ZSB0aGUgdGVzdCBmdW5jdGlvbiBwb2ludGVyIHNvdXJjZSBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nCisgICAgZGVmIEdlbmVyYXRlRnVuY3Rpb25Qb2ludGVyU291cmNlKHNlbGYpOgorICAgICAgICBlbnRyaWVzID0gW10KKyAgICAgICAgdGFibGUgPSBmdW5jcHRyX3NvdXJjZV9wcmVhbWJsZQorICAgICAgICBlbnRyaWVzID0gc2VsZi5kaXNwYXRjaF9saXN0CisKKyAgICAgICAgZm9yIGl0ZW0gaW4gZW50cmllczoKKyAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICBiYXNlX25hbWUgPSBpdGVtWzBdWzI6XQorICAgICAgICAgICAgaWYgaXRlbVsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2lmZGVmICVzXG4nICUgaXRlbVsxXQorICAgICAgICAgICAgdGFibGUgKz0gJ1BGTl8lcyAlcztcbicgJSAoaXRlbVswXSwgYmFzZV9uYW1lKQorICAgICAgICAgICAgaWYgaXRlbVsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2VuZGlmIC8vICVzXG4nICUgaXRlbVsxXQorCisgICAgICAgIHRhYmxlICs9ICdcblxuJworICAgICAgICB0YWJsZSArPSAndm9pZCBJbml0RGlzcGF0Y2hUYWJsZSgpIHtcbicKKyAgICAgICAgdGFibGUgKz0gJ1xuJworICAgICAgICB0YWJsZSArPSAnI2lmKFdJTjMyKVxuJworICAgICAgICB0YWJsZSArPSAnICAgIGNvbnN0IGNoYXIgZmlsZW5hbWVbXSA9ICJ2dWxrYW4tMS5kbGwiO1xuJworICAgICAgICB0YWJsZSArPSAnI2VsaWYoX19BUFBMRV9fKVxuJworICAgICAgICB0YWJsZSArPSAnICAgIGNvbnN0IGNoYXIgZmlsZW5hbWVbXSA9ICJsaWJ2dWxrYW4uZHlsaWIiO1xuJworICAgICAgICB0YWJsZSArPSAnI2Vsc2VcbicKKyAgICAgICAgdGFibGUgKz0gJyAgICBjb25zdCBjaGFyIGZpbGVuYW1lW10gPSAibGlidnVsa2FuLnNvIjtcbicKKyAgICAgICAgdGFibGUgKz0gJyNlbmRpZlxuJworICAgICAgICB0YWJsZSArPSAnXG4nCisgICAgICAgIHRhYmxlICs9ICcgICAgYXV0byBsb2FkZXJfaGFuZGxlID0gbG9hZGVyX3BsYXRmb3JtX29wZW5fbGlicmFyeShmaWxlbmFtZSk7XG4nCisgICAgICAgIHRhYmxlICs9ICdcbicKKyAgICAgICAgdGFibGUgKz0gJyAgICBpZiAobG9hZGVyX2hhbmRsZSA9PSBudWxscHRyKSB7XG4nCisgICAgICAgIHRhYmxlICs9ICcgICAgICAgIHByaW50ZigiJXNcXG4iLCBsb2FkZXJfcGxhdGZvcm1fb3Blbl9saWJyYXJ5X2Vycm9yKGZpbGVuYW1lKSk7XG4nCisgICAgICAgIHRhYmxlICs9ICcgICAgICAgIGV4aXQoMSk7XG4nCisgICAgICAgIHRhYmxlICs9ICcgICAgfVxuXG4nCisKKyAgICAgICAgZm9yIGl0ZW0gaW4gZW50cmllczoKKyAgICAgICAgICAgICMgUmVtb3ZlICd2aycgZnJvbSBwcm90byBuYW1lCisgICAgICAgICAgICBiYXNlX25hbWUgPSBpdGVtWzBdWzI6XQorCisgICAgICAgICAgICBpZiBpdGVtWzFdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjaWZkZWYgJXNcbicgJSBpdGVtWzFdCisgICAgICAgICAgICB0YWJsZSArPSAnICAgICVzID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fJXM+KGxvYWRlcl9wbGF0Zm9ybV9nZXRfcHJvY19hZGRyZXNzKGxvYWRlcl9oYW5kbGUsICIlcyIpKTtcbicgJSAoYmFzZV9uYW1lLCBpdGVtWzBdLCBpdGVtWzBdKQorICAgICAgICAgICAgaWYgaXRlbVsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2VuZGlmIC8vICVzXG4nICUgaXRlbVsxXQorICAgICAgICB0YWJsZSArPSAnfVxuXG4nCisgICAgICAgIHRhYmxlICs9ICd9IC8vIG5hbWVzcGFjZSB2aycKKyAgICAgICAgcmV0dXJuIHRhYmxlCisgICAgIworICAgICMgQ3JlYXRlIHRoZSB0ZXN0IGZ1bmN0aW9uIHBvaW50ZXIgc291cmNlIGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcKKyAgICBkZWYgR2VuZXJhdGVGdW5jdGlvblBvaW50ZXJIZWFkZXIoc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBbXQorICAgICAgICB0YWJsZSA9IGZ1bmNwdHJfaGVhZGVyX3ByZWFtYmxlCisgICAgICAgIGVudHJpZXMgPSBzZWxmLmRpc3BhdGNoX2xpc3QKKworICAgICAgICBmb3IgaXRlbSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgIyBSZW1vdmUgJ3ZrJyBmcm9tIHByb3RvIG5hbWUKKyAgICAgICAgICAgIGJhc2VfbmFtZSA9IGl0ZW1bMF1bMjpdCisgICAgICAgICAgICBpZiBpdGVtWzFdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRhYmxlICs9ICcjaWZkZWYgJXNcbicgJSBpdGVtWzFdCisgICAgICAgICAgICB0YWJsZSArPSAnZXh0ZXJuIFBGTl8lcyAlcztcbicgJSAoaXRlbVswXSwgYmFzZV9uYW1lKQorICAgICAgICAgICAgaWYgaXRlbVsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0YWJsZSArPSAnI2VuZGlmIC8vICVzXG4nICUgaXRlbVsxXQorICAgICAgICB0YWJsZSArPSAnXG4nCisgICAgICAgIHRhYmxlICs9ICd2b2lkIEluaXREaXNwYXRjaFRhYmxlKCk7XG5cbicKKyAgICAgICAgdGFibGUgKz0gJ30gLy8gbmFtZXNwYWNlIHZrJworICAgICAgICByZXR1cm4gdGFibGUKKworICAgICMgQ3JlYXRlIGEgaGVscGVyIGZpbGUgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZworICAgIGRlZiBPdXRwdXREZXN0RmlsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5sdnRfZmlsZV90eXBlID09ICdmdW5jdGlvbl9wb2ludGVyX2hlYWRlcic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5HZW5lcmF0ZUZ1bmN0aW9uUG9pbnRlckhlYWRlcigpCisgICAgICAgIGVsaWYgc2VsZi5sdnRfZmlsZV90eXBlID09ICdmdW5jdGlvbl9wb2ludGVyX3NvdXJjZSc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5HZW5lcmF0ZUZ1bmN0aW9uUG9pbnRlclNvdXJjZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ0JhZCBMVlQgRmlsZSBHZW5lcmF0b3IgT3B0aW9uICVzJyAlIHNlbGYubHZ0X2ZpbGVfdHlwZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9vYmplY3RfdHJhY2tlcl9nZW5lcmF0b3IucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL29iamVjdF90cmFja2VyX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY0ZGJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9vYmplY3RfdHJhY2tlcl9nZW5lcmF0b3IucHkKQEAgLTAsMCArMSwxMDIxIEBACisjIS91c3IvYmluL3B5dGhvbjMgLWkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisjIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorCitpbXBvcnQgb3MscmUsc3lzLHN0cmluZyxqc29uCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIGV0cmVlCitmcm9tIGdlbmVyYXRvciBpbXBvcnQgKgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorZnJvbSBjb21tb25fY29kZWdlbiBpbXBvcnQgKgorCisjIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIHVzZSBhIFB5dGhvbiAyLjcgYW5kIDMueCBjb21wYXRpYmxlIHN5bnRheC4KK2Zyb20gaW8gaW1wb3J0IG9wZW4KKworIyBPYmplY3RUcmFja2VyR2VuZXJhdG9yT3B0aW9ucyAtIHN1YmNsYXNzIG9mIEdlbmVyYXRvck9wdGlvbnMuCisjCisjIEFkZHMgb3B0aW9ucyB1c2VkIGJ5IE9iamVjdFRyYWNrZXJPdXRwdXRHZW5lcmF0b3Igb2JqZWN0cyBkdXJpbmcKKyMgb2JqZWN0X3RyYWNrZXIgbGF5ZXIgZ2VuZXJhdGlvbi4KKyMKKyMgQWRkaXRpb25hbCBtZW1iZXJzCisjICAgcHJlZml4VGV4dCAtIGxpc3Qgb2Ygc3RyaW5ncyB0byBwcmVmaXggZ2VuZXJhdGVkIGhlYWRlciB3aXRoCisjICAgICAodXN1YWxseSBhIGNvcHlyaWdodCBzdGF0ZW1lbnQgKyBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm9zKS4KKyMgICBwcm90ZWN0RmlsZSAtIFRydWUgaWYgbXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gc2hvdWxkIGJlCisjICAgICBnZW5lcmF0ZWQgKGJhc2VkIG9uIHRoZSBmaWxlbmFtZSkgYXJvdW5kIHRoZSBlbnRpcmUgaGVhZGVyLgorIyAgIHByb3RlY3RGZWF0dXJlIC0gVHJ1ZSBpZiAjaWZuZGVmLi4jZW5kaWYgcHJvdGVjdGlvbiBzaG91bGQgYmUKKyMgICAgIGdlbmVyYXRlZCBhcm91bmQgYSBmZWF0dXJlIGludGVyZmFjZSBpbiB0aGUgaGVhZGVyIGZpbGUuCisjICAgZ2VuRnVuY1BvaW50ZXJzIC0gVHJ1ZSBpZiBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzIHNob3VsZCBiZQorIyAgICAgZ2VuZXJhdGVkCisjICAgcHJvdGVjdFByb3RvIC0gSWYgY29uZGl0aW9uYWwgcHJvdGVjdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkCisjICAgICBhcm91bmQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgc2V0IHRvIGVpdGhlciAnI2lmZGVmJworIyAgICAgdG8gcmVxdWlyZSBvcHQtaW4gKCNpZmRlZiBwcm90ZWN0UHJvdG9TdHIpIG9yICcjaWZuZGVmJworIyAgICAgdG8gcmVxdWlyZSBvcHQtb3V0ICgjaWZuZGVmIHByb3RlY3RQcm90b1N0cikuIE90aGVyd2lzZQorIyAgICAgc2V0IHRvIE5vbmUuCisjICAgcHJvdGVjdFByb3RvU3RyIC0gI2lmZGVmLyNpZm5kZWYgc3ltYm9sIHRvIHVzZSBhcm91bmQgcHJvdG90eXBlCisjICAgICBkZWNsYXJhdGlvbnMsIGlmIHByb3RlY3RQcm90byBpcyBzZXQKKyMgICBhcGljYWxsIC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHByZWZpeCwKKyMgICAgIHN1Y2ggYXMgQVBJQ0FMTCBvbiBXaW5kb3dzLgorIyAgIGFwaWVudHJ5IC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGNhbGxpbmcgY29udmVudGlvbiBtYWNybywKKyMgICAgIGluIHR5cGVkZWZzLCBzdWNoIGFzIEFQSUVOVFJZLgorIyAgIGFwaWVudHJ5cCAtIHN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8KKyMgICAgIGluIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMsIHN1Y2ggYXMgQVBJRU5UUllQLgorIyAgIGluZGVudEZ1bmNQcm90byAtIFRydWUgaWYgcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBzaG91bGQgcHV0IGVhY2gKKyMgICAgIHBhcmFtZXRlciBvbiBhIHNlcGFyYXRlIGxpbmUKKyMgICBpbmRlbnRGdW5jUG9pbnRlciAtIFRydWUgaWYgdHlwZWRlZmVkIGZ1bmN0aW9uIHBvaW50ZXJzIHNob3VsZCBwdXQgZWFjaAorIyAgICAgcGFyYW1ldGVyIG9uIGEgc2VwYXJhdGUgbGluZQorIyAgIGFsaWduRnVuY1BhcmFtIC0gaWYgbm9uemVybyBhbmQgcGFyYW1ldGVycyBhcmUgYmVpbmcgcHV0IG9uIGEKKyMgICAgIHNlcGFyYXRlIGxpbmUsIGFsaWduIHBhcmFtZXRlciBuYW1lcyBhdCB0aGUgc3BlY2lmaWVkIGNvbHVtbgorY2xhc3MgT2JqZWN0VHJhY2tlckdlbmVyYXRvck9wdGlvbnMoR2VuZXJhdG9yT3B0aW9ucyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBOb25lLAorICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgPSAnLicsCisgICAgICAgICAgICAgICAgIGFwaW5hbWUgPSBOb25lLAorICAgICAgICAgICAgICAgICBwcm9maWxlID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgdmVyc2lvbnMgPSAnLionLAorICAgICAgICAgICAgICAgICBlbWl0dmVyc2lvbnMgPSAnLionLAorICAgICAgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBzb3J0UHJvY2VkdXJlID0gcmVnU29ydEZlYXR1cmVzLAorICAgICAgICAgICAgICAgICBwcmVmaXhUZXh0ID0gIiIsCisgICAgICAgICAgICAgICAgIGdlbkZ1bmNQb2ludGVycyA9IFRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGaWxlID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdEZlYXR1cmUgPSBUcnVlLAorICAgICAgICAgICAgICAgICBhcGljYWxsID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5ID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5cCA9ICcnLAorICAgICAgICAgICAgICAgICBpbmRlbnRGdW5jUHJvdG8gPSBUcnVlLAorICAgICAgICAgICAgICAgICBpbmRlbnRGdW5jUG9pbnRlciA9IEZhbHNlLAorICAgICAgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgIGV4cGFuZEVudW1lcmFudHMgPSBUcnVlLAorICAgICAgICAgICAgICAgICB2YWxpZF91c2FnZV9wYXRoID0gJycpOgorICAgICAgICBHZW5lcmF0b3JPcHRpb25zLl9faW5pdF9fKHNlbGYsIGNvbnZlbnRpb25zLCBmaWxlbmFtZSwgZGlyZWN0b3J5LCBhcGluYW1lLCBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zLCBlbWl0dmVyc2lvbnMsIGRlZmF1bHRFeHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMsIHJlbW92ZUV4dGVuc2lvbnMsIGVtaXRFeHRlbnNpb25zLCBzb3J0UHJvY2VkdXJlKQorICAgICAgICBzZWxmLnByZWZpeFRleHQgICAgICA9IHByZWZpeFRleHQKKyAgICAgICAgc2VsZi5nZW5GdW5jUG9pbnRlcnMgPSBnZW5GdW5jUG9pbnRlcnMKKyAgICAgICAgc2VsZi5wcm90ZWN0RmlsZSAgICAgPSBwcm90ZWN0RmlsZQorICAgICAgICBzZWxmLnByb3RlY3RGZWF0dXJlICA9IHByb3RlY3RGZWF0dXJlCisgICAgICAgIHNlbGYuYXBpY2FsbCAgICAgICAgID0gYXBpY2FsbAorICAgICAgICBzZWxmLmFwaWVudHJ5ICAgICAgICA9IGFwaWVudHJ5CisgICAgICAgIHNlbGYuYXBpZW50cnlwICAgICAgID0gYXBpZW50cnlwCisgICAgICAgIHNlbGYuaW5kZW50RnVuY1Byb3RvID0gaW5kZW50RnVuY1Byb3RvCisgICAgICAgIHNlbGYuaW5kZW50RnVuY1BvaW50ZXIgPSBpbmRlbnRGdW5jUG9pbnRlcgorICAgICAgICBzZWxmLmFsaWduRnVuY1BhcmFtICA9IGFsaWduRnVuY1BhcmFtCisgICAgICAgIHNlbGYuZXhwYW5kRW51bWVyYW50cyA9IGV4cGFuZEVudW1lcmFudHMKKyAgICAgICAgc2VsZi52YWxpZF91c2FnZV9wYXRoID0gdmFsaWRfdXNhZ2VfcGF0aAorCisKKyMgT2JqZWN0VHJhY2tlck91dHB1dEdlbmVyYXRvciAtIHN1YmNsYXNzIG9mIE91dHB1dEdlbmVyYXRvci4KKyMgR2VuZXJhdGVzIG9iamVjdF90cmFja2VyIGxheWVyIG9iamVjdCB2YWxpZGF0aW9uIGNvZGUKKyMKKyMgLS0tLSBtZXRob2RzIC0tLS0KKyMgT2JqZWN0VHJhY2tlck91dHB1dEdlbmVyYXRvcihlcnJGaWxlLCB3YXJuRmlsZSwgZGlhZ0ZpbGUpIC0gYXJncyBhcyBmb3IgT3V0cHV0R2VuZXJhdG9yLiBEZWZpbmVzIGFkZGl0aW9uYWwgaW50ZXJuYWwgc3RhdGUuCisjIC0tLS0gbWV0aG9kcyBvdmVycmlkaW5nIGJhc2UgY2xhc3MgLS0tLQorIyBiZWdpbkZpbGUoZ2VuT3B0cykKKyMgZW5kRmlsZSgpCisjIGJlZ2luRmVhdHVyZShpbnRlcmZhY2UsIGVtaXQpCisjIGVuZEZlYXR1cmUoKQorIyBnZW5DbWQoY21kaW5mbykKKyMgZ2VuU3RydWN0KCkKKyMgZ2VuVHlwZSgpCitjbGFzcyBPYmplY3RUcmFja2VyT3V0cHV0R2VuZXJhdG9yKE91dHB1dEdlbmVyYXRvcik6CisgICAgIiIiR2VuZXJhdGUgT2JqZWN0VHJhY2tlciBjb2RlIGJhc2VkIG9uIFhNTCBlbGVtZW50IGF0dHJpYnV0ZXMiIiIKKyAgICAjIFRoaXMgaXMgYW4gb3JkZXJlZCBsaXN0IG9mIHNlY3Rpb25zIGluIHRoZSBoZWFkZXIgZmlsZS4KKyAgICBBTExfU0VDVElPTlMgPSBbJ2NvbW1hbmQnXQorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBlcnJGaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgd2FybkZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICBkaWFnRmlsZSA9IHN5cy5zdGRvdXQpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuX19pbml0X18oc2VsZiwgZXJyRmlsZSwgd2FybkZpbGUsIGRpYWdGaWxlKQorICAgICAgICBzZWxmLklOREVOVF9TUEFDRVMgPSA0CisgICAgICAgIHNlbGYucHJvdG90eXBlcyA9IFtdCisgICAgICAgIHNlbGYuaW5zdGFuY2VfZXh0ZW5zaW9ucyA9IFtdCisgICAgICAgIHNlbGYuZGV2aWNlX2V4dGVuc2lvbnMgPSBbXQorICAgICAgICAjIENvbW1hbmRzIHdoaWNoIGFyZSBub3QgYXV0b2dlbmVyYXRlZCBidXQgc3RpbGwgaW50ZXJjZXB0ZWQKKyAgICAgICAgc2VsZi5ub19hdXRvZ2VuX2xpc3QgPSBbCisgICAgICAgICAgICAndmtEZXN0cm95SW5zdGFuY2UnLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlSW5zdGFuY2UnLAorICAgICAgICAgICAgJ3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzJywKKyAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMicsCisgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgJ3ZrR2V0RGV2aWNlUXVldWUnLAorICAgICAgICAgICAgJ3ZrR2V0RGV2aWNlUXVldWUyJywKKyAgICAgICAgICAgICd2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQnLAorICAgICAgICAgICAgJ3ZrRGVzdHJveURlc2NyaXB0b3JQb29sJywKKyAgICAgICAgICAgICd2a0Rlc3Ryb3lDb21tYW5kUG9vbCcsCisgICAgICAgICAgICAndmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzJywKKyAgICAgICAgICAgICd2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMnLAorICAgICAgICAgICAgJ3ZrRnJlZURlc2NyaXB0b3JTZXRzJywKKyAgICAgICAgICAgICd2a0ZyZWVDb21tYW5kQnVmZmVycycsCisgICAgICAgICAgICAndmtVcGRhdGVEZXNjcmlwdG9yU2V0cycsCisgICAgICAgICAgICAndmtCZWdpbkNvbW1hbmRCdWZmZXInLAorICAgICAgICAgICAgJ3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnQnLAorICAgICAgICAgICAgJ3ZrR2V0RGVzY3JpcHRvclNldExheW91dFN1cHBvcnRLSFInLAorICAgICAgICAgICAgJ3ZrRGVzdHJveVN3YXBjaGFpbktIUicsCisgICAgICAgICAgICAndmtHZXRTd2FwY2hhaW5JbWFnZXNLSFInLAorICAgICAgICAgICAgJ3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFInLAorICAgICAgICAgICAgJ3ZrRGVzdHJveURldmljZScsCisgICAgICAgICAgICAndmtSZXNldERlc2NyaXB0b3JQb29sJywKKyAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFInLAorICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgJ3ZrR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSJywKKyAgICAgICAgICAgICd2a0dldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFInLAorICAgICAgICAgICAgJ3ZrQWNxdWlyZVBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMJywKKyAgICAgICAgICAgICd2a1JlbGVhc2VQZXJmb3JtYW5jZUNvbmZpZ3VyYXRpb25JTlRFTCcsCisgICAgICAgICAgICAndmtRdWV1ZVNldFBlcmZvcm1hbmNlQ29uZmlndXJhdGlvbklOVEVMJywKKyAgICAgICAgICAgICd2a0NyZWF0ZUZyYW1lYnVmZmVyJywKKyAgICAgICAgICAgICd2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUJywKKyAgICAgICAgICAgICd2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQnLAorICAgICAgICAgICAgXQorICAgICAgICAjIFRoZXNlIFZVSURTIGFyZSBub3QgaW1wbGljaXQsIGJ1dCBhcmUgYmVzdCBoYW5kbGVkIGluIHRoaXMgbGF5ZXIuIENvZGVnZW4gZm9yIHZrRGVzdHJveSBjYWxscyB3aWxsIGdlbmVyYXRlIGEga2V5CisgICAgICAgICMgd2hpY2ggaXMgdHJhbnNsYXRlZCBoZXJlIGludG8gYSBnb29kIFZVLiAgU2F2ZXMgfjQwIGNoZWNrcy4KKyAgICAgICAgc2VsZi5tYW51YWxfdnVpZHMgPSBkaWN0KCkKKyAgICAgICAgc2VsZi5tYW51YWxfdnVpZHMgPSB7CisgICAgICAgICAgICAiZmVuY2UtY29tcGF0YWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveUZlbmNlLWZlbmNlLTAxMTIxXCIiLAorICAgICAgICAgICAgImZlbmNlLW51bGxhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95RmVuY2UtZmVuY2UtMDExMjJcIiIsCisgICAgICAgICAgICAiZXZlbnQtY29tcGF0YWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LTAxMTQ2XCIiLAorICAgICAgICAgICAgImV2ZW50LW51bGxhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95RXZlbnQtZXZlbnQtMDExNDdcIiIsCisgICAgICAgICAgICAiYnVmZmVyLWNvbXBhdGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lCdWZmZXItYnVmZmVyLTAwOTIzXCIiLAorICAgICAgICAgICAgImJ1ZmZlci1udWxsYWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveUJ1ZmZlci1idWZmZXItMDA5MjRcIiIsCisgICAgICAgICAgICAiaW1hZ2UtY29tcGF0YWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveUltYWdlLWltYWdlLTAxMDAxXCIiLAorICAgICAgICAgICAgImltYWdlLW51bGxhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95SW1hZ2UtaW1hZ2UtMDEwMDJcIiIsCisgICAgICAgICAgICAic2hhZGVyTW9kdWxlLWNvbXBhdGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lTaGFkZXJNb2R1bGUtc2hhZGVyTW9kdWxlLTAxMDkyXCIiLAorICAgICAgICAgICAgInNoYWRlck1vZHVsZS1udWxsYWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveVNoYWRlck1vZHVsZS1zaGFkZXJNb2R1bGUtMDEwOTNcIiIsCisgICAgICAgICAgICAicGlwZWxpbmUtY29tcGF0YWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLTAwNzY2XCIiLAorICAgICAgICAgICAgInBpcGVsaW5lLW51bGxhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95UGlwZWxpbmUtcGlwZWxpbmUtMDA3NjdcIiIsCisgICAgICAgICAgICAic2FtcGxlci1jb21wYXRhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95U2FtcGxlci1zYW1wbGVyLTAxMDgzXCIiLAorICAgICAgICAgICAgInNhbXBsZXItbnVsbGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lTYW1wbGVyLXNhbXBsZXItMDEwODRcIiIsCisgICAgICAgICAgICAicmVuZGVyUGFzcy1jb21wYXRhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLTAwODc0XCIiLAorICAgICAgICAgICAgInJlbmRlclBhc3MtbnVsbGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lSZW5kZXJQYXNzLXJlbmRlclBhc3MtMDA4NzVcIiIsCisgICAgICAgICAgICAiZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWNvbXBhdGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGVzY3JpcHRvclNldExheW91dC0wMDM1NlwiIiwKKyAgICAgICAgICAgICJkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtbnVsbGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGVzY3JpcHRvclNldExheW91dC0wMDM1N1wiIiwKKyAgICAgICAgICAgICJpbWFnZVZpZXctY29tcGF0YWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveUltYWdlVmlldy1pbWFnZVZpZXctMDEwMjdcIiIsCisgICAgICAgICAgICAiaW1hZ2VWaWV3LW51bGxhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95SW1hZ2VWaWV3LWltYWdlVmlldy0wMTAyOFwiIiwKKyAgICAgICAgICAgICJwaXBlbGluZUNhY2hlLWNvbXBhdGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUNhY2hlLXBpcGVsaW5lQ2FjaGUtMDA3NzFcIiIsCisgICAgICAgICAgICAicGlwZWxpbmVDYWNoZS1udWxsYWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveVBpcGVsaW5lQ2FjaGUtcGlwZWxpbmVDYWNoZS0wMDc3MlwiIiwKKyAgICAgICAgICAgICJwaXBlbGluZUxheW91dC1jb21wYXRhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQtcGlwZWxpbmVMYXlvdXQtMDAyOTlcIiIsCisgICAgICAgICAgICAicGlwZWxpbmVMYXlvdXQtbnVsbGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lQaXBlbGluZUxheW91dC1waXBlbGluZUxheW91dC0wMDMwMFwiIiwKKyAgICAgICAgICAgICJkZXNjcmlwdG9yU2V0TGF5b3V0LWNvbXBhdGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0LWRlc2NyaXB0b3JTZXRMYXlvdXQtMDAyODRcIiIsCisgICAgICAgICAgICAiZGVzY3JpcHRvclNldExheW91dC1udWxsYWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQtZGVzY3JpcHRvclNldExheW91dC0wMDI4NVwiIiwKKyAgICAgICAgICAgICJzZW1hcGhvcmUtY29tcGF0YWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveVNlbWFwaG9yZS1zZW1hcGhvcmUtMDExMzhcIiIsCisgICAgICAgICAgICAic2VtYXBob3JlLW51bGxhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS0wMTEzOVwiIiwKKyAgICAgICAgICAgICJxdWVyeVBvb2wtY29tcGF0YWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveVF1ZXJ5UG9vbC1xdWVyeVBvb2wtMDA3OTRcIiIsCisgICAgICAgICAgICAicXVlcnlQb29sLW51bGxhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC0wMDc5NVwiIiwKKyAgICAgICAgICAgICJidWZmZXJWaWV3LWNvbXBhdGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lCdWZmZXJWaWV3LWJ1ZmZlclZpZXctMDA5MzdcIiIsCisgICAgICAgICAgICAiYnVmZmVyVmlldy1udWxsYWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveUJ1ZmZlclZpZXctYnVmZmVyVmlldy0wMDkzOFwiIiwKKyAgICAgICAgICAgICJzdXJmYWNlLWNvbXBhdGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lTdXJmYWNlS0hSLXN1cmZhY2UtMDEyNjdcIiIsCisgICAgICAgICAgICAic3VyZmFjZS1udWxsYWxsb2MiOiAiXCJWVUlELXZrRGVzdHJveVN1cmZhY2VLSFItc3VyZmFjZS0wMTI2OFwiIiwKKyAgICAgICAgICAgICJmcmFtZWJ1ZmZlci1jb21wYXRhbGxvYyI6ICJcIlZVSUQtdmtEZXN0cm95RnJhbWVidWZmZXItZnJhbWVidWZmZXItMDA4OTNcIiIsCisgICAgICAgICAgICAiZnJhbWVidWZmZXItbnVsbGFsbG9jIjogIlwiVlVJRC12a0Rlc3Ryb3lGcmFtZWJ1ZmZlci1mcmFtZWJ1ZmZlci0wMDg5NFwiIiwKKyAgICAgICAgICAgICJWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWJhc2VQaXBlbGluZUhhbmRsZSI6ICJcIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyMlwiIiwKKyAgICAgICAgICAgICJWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tYmFzZVBpcGVsaW5lSGFuZGxlIjogIlwiVlVJRC1Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8tZmxhZ3MtMDA2OTdcIiIsCisgICAgICAgICAgICAiVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtYmFzZVBpcGVsaW5lSGFuZGxlIjogIlwiVlVJRC1Wa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OVi1mbGFncy0wMjQwNFwiIiwKKyAgICAgICAgICAgfQorCisgICAgICAgICMgQ29tbWFuZHMgc2hhZG93ZWQgYnkgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhbmQgYXJlIG5vdCBpbXBsZW1lbnRlZAorICAgICAgICBzZWxmLmludGVyZmFjZV9mdW5jdGlvbnMgPSBbCisgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuaGVhZGVyVmVyc2lvbiA9IE5vbmUKKyAgICAgICAgIyBJbnRlcm5hbCBzdGF0ZSAtIGFjY3VtdWxhdG9ycyBmb3IgZGlmZmVyZW50IGlubmVyIGJsb2NrIHRleHQKKyAgICAgICAgc2VsZi5zZWN0aW9ucyA9IGRpY3QoWyhzZWN0aW9uLCBbXSkgZm9yIHNlY3Rpb24gaW4gc2VsZi5BTExfU0VDVElPTlNdKQorICAgICAgICBzZWxmLmNtZF9saXN0ID0gW10gICAgICAgICAgICAgIyBsaXN0IG9mIGNvbW1hbmRzIHByb2Nlc3NlZCB0byBtYWludGFpbiBvcmRlcmluZworICAgICAgICBzZWxmLmNtZF9pbmZvX2RpY3QgPSB7fSAgICAgICAgIyBQZXIgZW50cnktcG9pbnQgZGF0YSBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCB2YWxpZGF0aW9uCisgICAgICAgIHNlbGYuc3RydWN0TWVtYmVycyA9IFtdICAgICAgICAjIExpc3Qgb2YgU3RydWN0TWVtYmVyRGF0YSByZWNvcmRzIGZvciBhbGwgVnVsa2FuIHN0cnVjdHMKKyAgICAgICAgc2VsZi5leHRlbnNpb25fc3RydWN0cyA9IFtdICAgICMgTGlzdCBvZiBhbGwgc3RydWN0cyBvciBzaXN0ZXItc3RydWN0cyBjb250YWluaW5nIGhhbmRsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQSBzaXN0ZXItc3RydWN0IG1heSBjb250YWluIG5vIGhhbmRsZXMgYnV0IHNoYXJlcyA8dmFsaWRleHRlbnNpb25zdHJ1Y3RzPiB3aXRoIG9uZSB0aGF0IGRvZXMKKyAgICAgICAgc2VsZi5zdHJ1Y3RUeXBlcyA9IGRpY3QoKSAgICAgICMgTWFwIG9mIFZ1bGthbiBzdHJ1Y3QgdHlwZW5hbWUgdG8gcmVxdWlyZWQgVmtTdHJ1Y3R1cmVUeXBlCisgICAgICAgIHNlbGYuc3RydWN0X21lbWJlcl9kaWN0ID0gZGljdCgpCisgICAgICAgICMgTmFtZWQgdHVwbGVzIHRvIHN0b3JlIHN0cnVjdCBhbmQgY29tbWFuZCBkYXRhCisgICAgICAgIHNlbGYuU3RydWN0VHlwZSA9IG5hbWVkdHVwbGUoJ1N0cnVjdFR5cGUnLCBbJ25hbWUnLCAndmFsdWUnXSkKKyAgICAgICAgc2VsZi5DbWRJbmZvRGF0YSA9IG5hbWVkdHVwbGUoJ0NtZEluZm9EYXRhJywgWyduYW1lJywgJ2NtZGluZm8nLCAnbWVtYmVycycsICdleHRyYV9wcm90ZWN0JywgJ2FsaWFzJywgJ2lzY3JlYXRlJywgJ2lzZGVzdHJveScsICdhbGxvY2F0b3InXSkKKyAgICAgICAgc2VsZi5Db21tYW5kUGFyYW0gPSBuYW1lZHR1cGxlKCdDb21tYW5kUGFyYW0nLCBbJ3R5cGUnLCAnbmFtZScsICdpc2NvbnN0JywgJ2lzb3B0aW9uYWwnLCAnaXNjb3VudCcsICdpc2NyZWF0ZScsICdsZW4nLCAnZXh0c3RydWN0cycsICdjZGVjbCcsICdpc2xvY2FsJ10pCisgICAgICAgIHNlbGYuU3RydWN0TWVtYmVyRGF0YSA9IG5hbWVkdHVwbGUoJ1N0cnVjdE1lbWJlckRhdGEnLCBbJ25hbWUnLCAnbWVtYmVycyddKQorICAgICAgICBzZWxmLm9iamVjdF90eXBlcyA9IFtdICAgICAgICAgIyBMaXN0IG9mIGFsbCBoYW5kbGUgdHlwZXMKKyAgICAgICAgc2VsZi52YWxpZF92dWlkcyA9IHNldCgpICAgICAgICMgU2V0IG9mIGFsbCB2YWxpZCBWVUlEcworICAgICAgICBzZWxmLnZ1aWRfZGljdCA9IGRpY3QoKSAgICAgICAgIyBWVUlEIGRpY3Rpb25hcnkgKGZyb20gSlNPTikKKyAgICAjCisgICAgIyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBvcHRpb25hbAorICAgIGRlZiBwYXJhbUlzT3B0aW9uYWwoc2VsZiwgcGFyYW0pOgorICAgICAgICAjIFNlZSBpZiB0aGUgaGFuZGxlIGlzIG9wdGlvbmFsCisgICAgICAgIGlzb3B0aW9uYWwgPSBGYWxzZQorICAgICAgICAjIFNpbXBsZSwgaWYgaXQncyBvcHRpb25hbCwgcmV0dXJuIHRydWUKKyAgICAgICAgb3B0U3RyaW5nID0gcGFyYW0uYXR0cmliLmdldCgnb3B0aW9uYWwnKQorICAgICAgICBpZiBvcHRTdHJpbmc6CisgICAgICAgICAgICBpZiBvcHRTdHJpbmcgPT0gJ3RydWUnOgorICAgICAgICAgICAgICAgIGlzb3B0aW9uYWwgPSBUcnVlCisgICAgICAgICAgICBlbGlmICcsJyBpbiBvcHRTdHJpbmc6CisgICAgICAgICAgICAgICAgb3B0cyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIG9wdCBpbiBvcHRTdHJpbmcuc3BsaXQoJywnKToKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gb3B0LnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsID09ICd0cnVlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuYXBwZW5kKFRydWUpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgdmFsID09ICdmYWxzZSc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmFwcGVuZChGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdVbnJlY29nbml6ZWQgbGVuIGF0dHJpYnV0ZSB2YWx1ZScsdmFsKQorICAgICAgICAgICAgICAgIGlzb3B0aW9uYWwgPSBvcHRzCisgICAgICAgIGlmIG5vdCBpc29wdGlvbmFsOgorICAgICAgICAgICAgIyBNYXRjaGluZyBsb2dpYyBpbiBwYXJhbWV0ZXIgdmFsaWRhdGlvbiBhbmQgVmFsaWRpdHlPdXRwdXRHZW5lcmF0b3IuaXNIYW5kbGVPcHRpb25hbAorICAgICAgICAgICAgb3B0U3RyaW5nID0gcGFyYW0uYXR0cmliLmdldCgnbm9hdXRvdmFsaWRpdHknKQorICAgICAgICAgICAgaWYgb3B0U3RyaW5nIGFuZCBvcHRTdHJpbmcgPT0gJ3RydWUnOgorICAgICAgICAgICAgICAgIGlzb3B0aW9uYWwgPSBUcnVlOworICAgICAgICByZXR1cm4gaXNvcHRpb25hbAorICAgICMKKyAgICAjIEdldCBWVUlEIGlkZW50aWZpZXIgZnJvbSBpbXBsaWNpdCBWVUlEIHRhZworICAgIGRlZiBHZXRWdWlkKHNlbGYsIHBhcmVudCwgc3VmZml4KToKKyAgICAgICAgdnVpZF9zdHJpbmcgPSAnVlVJRC0lcy0lcycgJSAocGFyZW50LCBzdWZmaXgpCisgICAgICAgIHZ1aWQgPSAia1ZVSURVbmRlZmluZWQiCisgICAgICAgIGlmICctPicgaW4gdnVpZF9zdHJpbmc6CisgICAgICAgICAgIHJldHVybiB2dWlkCisgICAgICAgIGlmIHZ1aWRfc3RyaW5nIGluIHNlbGYudmFsaWRfdnVpZHM6CisgICAgICAgICAgICB2dWlkID0gIlwiJXNcIiIgJSB2dWlkX3N0cmluZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWxpYXMgPSAgc2VsZi5jbWRfaW5mb19kaWN0W3BhcmVudF0uYWxpYXMgaWYgcGFyZW50IGluIHNlbGYuY21kX2luZm9fZGljdCBlbHNlIE5vbmUKKyAgICAgICAgICAgIGlmIGFsaWFzOgorICAgICAgICAgICAgICAgIGFsaWFzX3N0cmluZyA9ICdWVUlELSVzLSVzJyAlIChhbGlhcywgc3VmZml4KQorICAgICAgICAgICAgICAgIGlmIGFsaWFzX3N0cmluZyBpbiBzZWxmLnZhbGlkX3Z1aWRzOgorICAgICAgICAgICAgICAgICAgICB2dWlkID0gIlwiJXNcIiIgJSBhbGlhc19zdHJpbmcKKyAgICAgICAgcmV0dXJuIHZ1aWQKKyAgICAjCisgICAgIyBJbmNyZWFzZXMgaW5kZW50IGJ5IDQgc3BhY2VzIGFuZCB0cmFja3MgaXQgZ2xvYmFsbHkKKyAgICBkZWYgaW5jSW5kZW50KHNlbGYsIGluZGVudCk6CisgICAgICAgIGluYyA9ICcgJyAqIHNlbGYuSU5ERU5UX1NQQUNFUworICAgICAgICBpZiBpbmRlbnQ6CisgICAgICAgICAgICByZXR1cm4gaW5kZW50ICsgaW5jCisgICAgICAgIHJldHVybiBpbmMKKyAgICAjCisgICAgIyBEZWNyZWFzZXMgaW5kZW50IGJ5IDQgc3BhY2VzIGFuZCB0cmFja3MgaXQgZ2xvYmFsbHkKKyAgICBkZWYgZGVjSW5kZW50KHNlbGYsIGluZGVudCk6CisgICAgICAgIGlmIGluZGVudCBhbmQgKGxlbihpbmRlbnQpID4gc2VsZi5JTkRFTlRfU1BBQ0VTKToKKyAgICAgICAgICAgIHJldHVybiBpbmRlbnRbOi1zZWxmLklOREVOVF9TUEFDRVNdCisgICAgICAgIHJldHVybiAnJworICAgICMKKyAgICAjIE92ZXJyaWRlIG1ha2VQcm90b05hbWUgdG8gZHJvcCB0aGUgInZrIiBwcmVmaXgKKyAgICBkZWYgbWFrZVByb3RvTmFtZShzZWxmLCBuYW1lLCB0YWlsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2VuT3B0cy5hcGllbnRyeSArIG5hbWVbMjpdICsgdGFpbAorICAgICMKKyAgICAjIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheQorICAgIGRlZiBwYXJhbUlzQXJyYXkoc2VsZiwgcGFyYW0pOgorICAgICAgICByZXR1cm4gcGFyYW0uYXR0cmliLmdldCgnbGVuJykgaXMgbm90IE5vbmUKKworICAgICMKKyAgICAjIEdlbmVyYXRlIHRoZSBvYmplY3QgdHJhY2tlciB1bmRlc3Ryb3llZCBvYmplY3QgdmFsaWRhdGlvbiBmdW5jdGlvbgorICAgIGRlZiBHZW5SZXBvcnRGdW5jKHNlbGYpOgorICAgICAgICBvdXRwdXRfZnVuYyA9ICcnCisgICAgICAgIGZvciBvYmp0eXBlIGluIFsnaW5zdGFuY2UnLCAnZGV2aWNlJ106CisgICAgICAgICAgICB1cHBlcl9vYmp0eXBlID0gb2JqdHlwZS5jYXBpdGFsaXplKCk7CisgICAgICAgICAgICBvdXRwdXRfZnVuYyArPSAnYm9vbCBPYmplY3RMaWZldGltZXM6OlJlcG9ydFVuZGVzdHJveWVkJXNPYmplY3RzKFZrJXMgJXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9jb2RlKSBjb25zdCB7XG4nICUgKHVwcGVyX29ianR5cGUsIHVwcGVyX29ianR5cGUsIG9ianR5cGUpCisgICAgICAgICAgICBvdXRwdXRfZnVuYyArPSAnICAgIGJvb2wgc2tpcCA9IGZhbHNlO1xuJworICAgICAgICAgICAgaWYgb2JqdHlwZSA9PSAnZGV2aWNlJzoKKyAgICAgICAgICAgICAgICBvdXRwdXRfZnVuYyArPSAnICAgIHNraXAgfD0gUmVwb3J0TGVha2VkJXNPYmplY3RzKCVzLCBrVnVsa2FuT2JqZWN0VHlwZUNvbW1hbmRCdWZmZXIsIGVycm9yX2NvZGUpO1xuJyAlICh1cHBlcl9vYmp0eXBlLCBvYmp0eXBlKQorICAgICAgICAgICAgZm9yIGhhbmRsZSBpbiBzZWxmLm9iamVjdF90eXBlczoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmhhbmRsZV90eXBlcy5Jc05vbkRpc3BhdGNoYWJsZShoYW5kbGUpOgorICAgICAgICAgICAgICAgICAgICBpZiAob2JqdHlwZSA9PSAnZGV2aWNlJyBhbmQgc2VsZi5oYW5kbGVfcGFyZW50cy5Jc1BhcmVudERldmljZShoYW5kbGUpKSBvciAob2JqdHlwZSA9PSAnaW5zdGFuY2UnIGFuZCBub3Qgc2VsZi5oYW5kbGVfcGFyZW50cy5Jc1BhcmVudERldmljZShoYW5kbGUpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mdW5jICs9ICcgICAgc2tpcCB8PSBSZXBvcnRMZWFrZWQlc09iamVjdHMoJXMsICVzLCBlcnJvcl9jb2RlKTtcbicgJSAodXBwZXJfb2JqdHlwZSwgb2JqdHlwZSwgc2VsZi5HZXRWdWxrYW5PYmpUeXBlKGhhbmRsZSkpCisgICAgICAgICAgICBvdXRwdXRfZnVuYyArPSAnICAgIHJldHVybiBza2lwO1xuJworICAgICAgICAgICAgb3V0cHV0X2Z1bmMgKz0gJ31cbicKKyAgICAgICAgcmV0dXJuIG91dHB1dF9mdW5jCisKKyAgICAjCisgICAgIyBHZW5lcmF0ZSB0aGUgb2JqZWN0IHRyYWNrZXIgdW5kZXN0cm95ZWQgb2JqZWN0IGRlc3RydWN0aW9uIGZ1bmN0aW9uCisgICAgZGVmIEdlbkRlc3Ryb3lGdW5jKHNlbGYpOgorICAgICAgICBvdXRwdXRfZnVuYyA9ICcnCisgICAgICAgIGZvciBvYmp0eXBlIGluIFsnaW5zdGFuY2UnLCAnZGV2aWNlJ106CisgICAgICAgICAgICB1cHBlcl9vYmp0eXBlID0gb2JqdHlwZS5jYXBpdGFsaXplKCk7CisgICAgICAgICAgICBvdXRwdXRfZnVuYyArPSAndm9pZCBPYmplY3RMaWZldGltZXM6OkRlc3Ryb3lMZWFrZWQlc09iamVjdHMoKSB7XG4nICUgdXBwZXJfb2JqdHlwZQorICAgICAgICAgICAgaWYgb2JqdHlwZSA9PSAnZGV2aWNlJzoKKyAgICAgICAgICAgICAgICBvdXRwdXRfZnVuYyArPSAnICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoa1Z1bGthbk9iamVjdFR5cGVDb21tYW5kQnVmZmVyKTtcbicKKyAgICAgICAgICAgIGZvciBoYW5kbGUgaW4gc2VsZi5vYmplY3RfdHlwZXM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5oYW5kbGVfdHlwZXMuSXNOb25EaXNwYXRjaGFibGUoaGFuZGxlKToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9ianR5cGUgPT0gJ2RldmljZScgYW5kIHNlbGYuaGFuZGxlX3BhcmVudHMuSXNQYXJlbnREZXZpY2UoaGFuZGxlKSkgb3IgKG9ianR5cGUgPT0gJ2luc3RhbmNlJyBhbmQgbm90IHNlbGYuaGFuZGxlX3BhcmVudHMuSXNQYXJlbnREZXZpY2UoaGFuZGxlKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZnVuYyArPSAnICAgIERlc3Ryb3lVbmRlc3Ryb3llZE9iamVjdHMoJXMpO1xuJyAlIHNlbGYuR2V0VnVsa2FuT2JqVHlwZShoYW5kbGUpCisgICAgICAgICAgICBvdXRwdXRfZnVuYyArPSAnfVxuJworCisgICAgICAgIHJldHVybiBvdXRwdXRfZnVuYworCisgICAgIworICAgICMgV2FsayB0aGUgSlNPTi1kZXJpdmVkIGRpY3QgYW5kIGZpbmQgYWxsICJ2dWlkIiBrZXkgdmFsdWVzCisgICAgZGVmIEV4dHJhY3RWVUlEcyhzZWxmLCBkKToKKyAgICAgICAgaWYgaGFzYXR0cihkLCAnaXRlbXMnKToKKyAgICAgICAgICAgIGZvciBrLCB2IGluIGQuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBrID09ICJ2dWlkIjoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgdgorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBkaWN0KToKKyAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5FeHRyYWN0VlVJRHModik6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlICh2LCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGwgaW4gdjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIHNlbGYuRXh0cmFjdFZVSURzKGwpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHMKKyAgICAjCisgICAgIyBTZXBhcmF0ZSBjb250ZW50IGZvciB2YWxpZGF0aW9uIHNvdXJjZSBhbmQgaGVhZGVyIGZpbGVzCisgICAgZGVmIG90d3JpdGUoc2VsZiwgZGVzdCwgZm9ybWF0c3RyaW5nKToKKyAgICAgICAgaWYgJ29iamVjdF90cmFja2VyLmgnIGluIHNlbGYuZ2VuT3B0cy5maWxlbmFtZSBhbmQgKGRlc3QgPT0gJ2hkcicgb3IgZGVzdCA9PSAnYm90aCcpOgorICAgICAgICAgICAgd3JpdGUoZm9ybWF0c3RyaW5nLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgZWxpZiAnb2JqZWN0X3RyYWNrZXIuY3BwJyBpbiBzZWxmLmdlbk9wdHMuZmlsZW5hbWUgYW5kIChkZXN0ID09ICdjcHAnIG9yIGRlc3QgPT0gJ2JvdGgnKToKKyAgICAgICAgICAgIHdyaXRlKGZvcm1hdHN0cmluZywgZmlsZT1zZWxmLm91dEZpbGUpCisKKyAgICAjCisgICAgIyBDYWxsZWQgYXQgYmVnaW5uaW5nIG9mIHByb2Nlc3NpbmcgYXMgZmlsZSBpcyBvcGVuZWQKKyAgICBkZWYgYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpCisKKyAgICAgICAgIyBJbml0aWFsaXplIG1lbWJlcnMgdGhhdCByZXF1aXJlIHRoZSB0cmVlCisgICAgICAgIHNlbGYuaGFuZGxlX3R5cGVzID0gR2V0SGFuZGxlVHlwZXMoc2VsZi5yZWdpc3RyeS50cmVlKQorICAgICAgICBzZWxmLmhhbmRsZV9wYXJlbnRzID0gR2V0SGFuZGxlUGFyZW50cyhzZWxmLnJlZ2lzdHJ5LnRyZWUpCisgICAgICAgIHNlbGYudHlwZV9jYXRlZ29yaWVzID0gR2V0VHlwZUNhdGVnb3JpZXMoc2VsZi5yZWdpc3RyeS50cmVlKQorCisgICAgICAgIGhlYWRlcl9maWxlID0gKGdlbk9wdHMuZmlsZW5hbWUgPT0gJ29iamVjdF90cmFja2VyLmgnKQorICAgICAgICBzb3VyY2VfZmlsZSA9IChnZW5PcHRzLmZpbGVuYW1lID09ICdvYmplY3RfdHJhY2tlci5jcHAnKQorCisgICAgICAgIGlmIG5vdCBoZWFkZXJfZmlsZSBhbmQgbm90IHNvdXJjZV9maWxlOgorICAgICAgICAgICAgcHJpbnQoIkVycm9yOiBPdXRwdXQgRmlsZW5hbWVzIGhhdmUgY2hhbmdlZCwgdXBkYXRlIGdlbmVyYXRvciBzb3VyY2UuXG4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgICAgICBzZWxmLnZhbGlkX3VzYWdlX3BhdGggPSBnZW5PcHRzLnZhbGlkX3VzYWdlX3BhdGgKKyAgICAgICAgdnVfanNvbl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLnZhbGlkX3VzYWdlX3BhdGggKyBvcy5zZXAsICd2YWxpZHVzYWdlLmpzb24nKQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSh2dV9qc29uX2ZpbGVuYW1lKToKKyAgICAgICAgICAgIGpzb25fZmlsZSA9IG9wZW4odnVfanNvbl9maWxlbmFtZSwgJ3InKQorICAgICAgICAgICAgc2VsZi52dWlkX2RpY3QgPSBqc29uLmxvYWQoanNvbl9maWxlKQorICAgICAgICAgICAganNvbl9maWxlLmNsb3NlKCkKKyAgICAgICAgaWYgbGVuKHNlbGYudnVpZF9kaWN0KSA9PSAwOgorICAgICAgICAgICAgcHJpbnQoIkVycm9yOiBDb3VsZCBub3QgZmluZCwgb3IgZXJyb3IgbG9hZGluZyAlcy92YWxpZHVzYWdlLmpzb25cbiIsIHZ1X2pzb25fZmlsZW5hbWUpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgICMgQnVpbGQgYSBzZXQgb2YgYWxsIHZ1aWQgdGV4dCBzdHJpbmdzIGZvdW5kIGluIHZhbGlkdXNhZ2UuanNvbgorICAgICAgICBmb3IganNvbl92dWlkX3N0cmluZyBpbiBzZWxmLkV4dHJhY3RWVUlEcyhzZWxmLnZ1aWRfZGljdCk6CisgICAgICAgICAgICBzZWxmLnZhbGlkX3Z1aWRzLmFkZChqc29uX3Z1aWRfc3RyaW5nKQorCisgICAgICAgICMgRmlsZSBDb21tZW50CisgICAgICAgIGZpbGVfY29tbWVudCA9ICcvLyAqKiogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBFRElUICoqKlxuJworICAgICAgICBmaWxlX2NvbW1lbnQgKz0gJy8vIFNlZSBvYmplY3RfdHJhY2tlcl9nZW5lcmF0b3IucHkgZm9yIG1vZGlmaWNhdGlvbnNcbicKKyAgICAgICAgc2VsZi5vdHdyaXRlKCdib3RoJywgZmlsZV9jb21tZW50KQorICAgICAgICAjIENvcHlyaWdodCBTdGF0ZW1lbnQKKyAgICAgICAgY29weXJpZ2h0ID0gJycKKyAgICAgICAgY29weXJpZ2h0ICs9ICdcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb25cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+XG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbicKKyAgICAgICAgc2VsZi5vdHdyaXRlKCdib3RoJywgY29weXJpZ2h0KQorICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICBzZWxmLm90d3JpdGUoJ2NwcCcsICcjaW5jbHVkZSAiY2hhc3Npcy5oIicpCisgICAgICAgIHNlbGYub3R3cml0ZSgnY3BwJywgJyNpbmNsdWRlICJvYmplY3RfbGlmZXRpbWVfdmFsaWRhdGlvbi5oIicpCisKKyAgICAjCisgICAgIyBOb3cgdGhhdCB0aGUgZGF0YSBpcyBhbGwgY29sbGVjdGVkIGFuZCBjb21wbGV0ZSwgZ2VuZXJhdGUgYW5kIG91dHB1dCB0aGUgb2JqZWN0IHZhbGlkYXRpb24gcm91dGluZXMKKyAgICBkZWYgZW5kRmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5zdHJ1Y3RfbWVtYmVyX2RpY3QgPSBkaWN0KHNlbGYuc3RydWN0TWVtYmVycykKKyAgICAgICAgIyBHZW5lcmF0ZSB0aGUgbGlzdCBvZiBBUElzIHRoYXQgbWlnaHQgbmVlZCB0byBoYW5kbGUgd3JhcHBlZCBleHRlbnNpb24gc3RydWN0cworICAgICAgICAjIHNlbGYuR2VuZXJhdGVDb21tYW5kV3JhcEV4dGVuc2lvbkxpc3QoKQorICAgICAgICBzZWxmLldyYXBDb21tYW5kcygpCisgICAgICAgICMgQnVpbGQgdW5kZXN0cm95ZWQgb2JqZWN0cyByZXBvcnRpbmcgZnVuY3Rpb24KKyAgICAgICAgcmVwb3J0X2Z1bmMgPSBzZWxmLkdlblJlcG9ydEZ1bmMoKQorICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAjIEJ1aWxkIHVuZGVzdHJveWVkIG9iamVjdHMgZGVzdHJ1Y3Rpb24gZnVuY3Rpb24KKyAgICAgICAgZGVzdHJveV9mdW5jID0gc2VsZi5HZW5EZXN0cm95RnVuYygpCisgICAgICAgIHNlbGYub3R3cml0ZSgnY3BwJywgJ1xuJykKKyAgICAgICAgc2VsZi5vdHdyaXRlKCdjcHAnLCAnLy8gT2JqZWN0VHJhY2tlciB1bmRlc3Ryb3llZCBvYmplY3RzIHZhbGlkYXRpb24gZnVuY3Rpb24nKQorICAgICAgICBzZWxmLm90d3JpdGUoJ2NwcCcsICclcycgJSByZXBvcnRfZnVuYykKKyAgICAgICAgc2VsZi5vdHdyaXRlKCdjcHAnLCAnJXMnICUgZGVzdHJveV9mdW5jKQorICAgICAgICAjIEFjdHVhbGx5IHdyaXRlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIG91dHB1dCBmaWxlLgorICAgICAgICBpZiAoc2VsZi5lbWl0KToKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICBpZiBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcHJvdCA9ICcjaWZkZWYgJXMnICUgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0CisgICAgICAgICAgICAgICAgc2VsZi5vdHdyaXRlKCdib3RoJywgJyVzJyAlIHByb3QpCisgICAgICAgICAgICAjIFdyaXRlIHRoZSBvYmplY3RfdHJhY2tlciBjb2RlIHRvIHRoZSAgZmlsZQorICAgICAgICAgICAgaWYgc2VsZi5zZWN0aW9uc1snY29tbWFuZCddOgorICAgICAgICAgICAgICAgIHNvdXJjZSA9ICgnXG4nLmpvaW4oc2VsZi5zZWN0aW9uc1snY29tbWFuZCddKSkKKyAgICAgICAgICAgICAgICBzZWxmLm90d3JpdGUoJ2JvdGgnLCAnJXMnICUgc291cmNlKQorICAgICAgICAgICAgaWYgKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgcHJvdCA9ICdcbiNlbmRpZiAvLyAlcycsIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdAorICAgICAgICAgICAgICAgIHNlbGYub3R3cml0ZSgnYm90aCcsIHByb3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYub3R3cml0ZSgnYm90aCcsICdcbicpCisKKworICAgICAgICBzZWxmLm90d3JpdGUoJ2hkcicsICd2b2lkIFBvc3RDYWxsUmVjb3JkRGVzdHJveUluc3RhbmNlKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcik7JykKKyAgICAgICAgc2VsZi5vdHdyaXRlKCdoZHInLCAndm9pZCBQcmVDYWxsUmVjb3JkUmVzZXREZXNjcmlwdG9yUG9vbChWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzIGZsYWdzKTsnKQorICAgICAgICBzZWxmLm90d3JpdGUoJ2hkcicsICd2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzICpwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsnKQorICAgICAgICBzZWxmLm90d3JpdGUoJ2hkcicsICd2b2lkIFByZUNhbGxSZWNvcmRGcmVlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCB1aW50MzJfdCBjb21tYW5kQnVmZmVyQ291bnQsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzKTsnKQorICAgICAgICBzZWxmLm90d3JpdGUoJ2hkcicsICd2b2lkIFByZUNhbGxSZWNvcmRGcmVlRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBkZXNjcmlwdG9yU2V0Q291bnQsIGNvbnN0IFZrRGVzY3JpcHRvclNldCAqcERlc2NyaXB0b3JTZXRzKTsnKQorICAgICAgICBzZWxmLm90d3JpdGUoJ2hkcicsICd2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50LCBWa1F1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIgKnBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOycpCisgICAgICAgIHNlbGYub3R3cml0ZSgnaGRyJywgJ3ZvaWQgUG9zdENhbGxSZWNvcmRHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzMktIUiAqcFF1ZXVlRmFtaWx5UHJvcGVydGllcyk7JykKKyAgICAgICAgc2VsZi5vdHdyaXRlKCdoZHInLCAndm9pZCBQb3N0Q2FsbFJlY29yZEdldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KTsnKQorICAgICAgICBzZWxmLm90d3JpdGUoJ2hkcicsICd2b2lkIFBvc3RDYWxsUmVjb3JkR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRGlzcGxheUtIUiBkaXNwbGF5LCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsIFZrRGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSICpwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KTsnKQorICAgICAgICBzZWxmLm90d3JpdGUoJ2hkcicsICd2b2lkIFBvc3RDYWxsUmVjb3JkR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa0Rpc3BsYXlQcm9wZXJ0aWVzMktIUiAqcFByb3BlcnRpZXMsIFZrUmVzdWx0IHJlc3VsdCk7JykKKyAgICAgICAgc2VsZi5vdHdyaXRlKCdoZHInLCAndm9pZCBQb3N0Q2FsbFJlY29yZEdldERpc3BsYXlNb2RlUHJvcGVydGllczJLSFIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtEaXNwbGF5S0hSIGRpc3BsYXksIHVpbnQzMl90ICpwUHJvcGVydHlDb3VudCwgVmtEaXNwbGF5TW9kZVByb3BlcnRpZXMyS0hSICpwUHJvcGVydGllcywgVmtSZXN1bHQgcmVzdWx0KTsnKQorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorICAgICMKKyAgICAjIFByb2Nlc3NpbmcgcG9pbnQgYXQgYmVnaW5uaW5nIG9mIGVhY2ggZXh0ZW5zaW9uIGRlZmluaXRpb24KKyAgICBkZWYgYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCk6CisgICAgICAgICMgU3RhcnQgcHJvY2Vzc2luZyBpbiBzdXBlcmNsYXNzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KQorICAgICAgICBzZWxmLmhlYWRlclZlcnNpb24gPSBOb25lCisgICAgICAgIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCA9IEdldEZlYXR1cmVQcm90ZWN0KGludGVyZmFjZSkKKworICAgICAgICBpZiBzZWxmLmZlYXR1cmVOYW1lICE9ICdWS19WRVJTSU9OXzFfMCcgYW5kIHNlbGYuZmVhdHVyZU5hbWUgIT0gJ1ZLX1ZFUlNJT05fMV8xJzoKKyAgICAgICAgICAgIHdoaXRlX2xpc3RfZW50cnkgPSBbXQorICAgICAgICAgICAgaWYgKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgd2hpdGVfbGlzdF9lbnRyeSArPSBbICcjaWZkZWYgJXMnICUgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IF0KKyAgICAgICAgICAgIHdoaXRlX2xpc3RfZW50cnkgKz0gWyAnIiVzIicgJSBzZWxmLmZlYXR1cmVOYW1lIF0KKyAgICAgICAgICAgIGlmIChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgICAgIHdoaXRlX2xpc3RfZW50cnkgKz0gWyAnI2VuZGlmJyBdCisgICAgICAgICAgICBmZWF0dXJlVHlwZSA9IGludGVyZmFjZS5nZXQoJ3R5cGUnKQorICAgICAgICAgICAgaWYgZmVhdHVyZVR5cGUgPT0gJ2luc3RhbmNlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmluc3RhbmNlX2V4dGVuc2lvbnMgKz0gd2hpdGVfbGlzdF9lbnRyeQorICAgICAgICAgICAgZWxpZiBmZWF0dXJlVHlwZSA9PSAnZGV2aWNlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmRldmljZV9leHRlbnNpb25zICs9IHdoaXRlX2xpc3RfZW50cnkKKyAgICAjCisgICAgIyBQcm9jZXNzaW5nIHBvaW50IGF0IGVuZCBvZiBlYWNoIGV4dGVuc2lvbiBkZWZpbml0aW9uCisgICAgZGVmIGVuZEZlYXR1cmUoc2VsZik6CisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmVhdHVyZShzZWxmKQorICAgICMKKyAgICAjIFByb2Nlc3MgZW51bXMsIHN0cnVjdHMsIGV0Yy4KKyAgICBkZWYgZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuVHlwZShzZWxmLCB0eXBlaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgIHR5cGVFbGVtID0gdHlwZWluZm8uZWxlbQorICAgICAgICAjIElmIHRoZSB0eXBlIGlzIGEgc3RydWN0IHR5cGUsIHRyYXZlcnNlIHRoZSBpbWJlZGRlZCA8bWVtYmVyPiB0YWdzIGdlbmVyYXRpbmcgYSBzdHJ1Y3R1cmUuCisgICAgICAgICMgT3RoZXJ3aXNlLCBlbWl0IHRoZSB0YWcgdGV4dC4KKyAgICAgICAgY2F0ZWdvcnkgPSB0eXBlRWxlbS5nZXQoJ2NhdGVnb3J5JykKKyAgICAgICAgaWYgKGNhdGVnb3J5ID09ICdzdHJ1Y3QnIG9yIGNhdGVnb3J5ID09ICd1bmlvbicpOgorICAgICAgICAgICAgc2VsZi5nZW5TdHJ1Y3QodHlwZWluZm8sIG5hbWUsIGFsaWFzKQorICAgICAgICBpZiBjYXRlZ29yeSA9PSAnaGFuZGxlJzoKKyAgICAgICAgICAgIHNlbGYub2JqZWN0X3R5cGVzLmFwcGVuZChuYW1lKQorICAgICMKKyAgICAjIEFwcGVuZCBhIGRlZmluaXRpb24gdG8gdGhlIHNwZWNpZmllZCBzZWN0aW9uCisgICAgZGVmIGFwcGVuZFNlY3Rpb24oc2VsZiwgc2VjdGlvbiwgdGV4dCk6CisgICAgICAgICMgc2VsZi5zZWN0aW9uc1tzZWN0aW9uXS5hcHBlbmQoJ1NFQ1RJT046ICcgKyBzZWN0aW9uICsgJ1xuJykKKyAgICAgICAgc2VsZi5zZWN0aW9uc1tzZWN0aW9uXS5hcHBlbmQodGV4dCkKKyAgICAjCisgICAgIyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBhIHBvaW50ZXIKKyAgICBkZWYgcGFyYW1Jc1BvaW50ZXIoc2VsZiwgcGFyYW0pOgorICAgICAgICBpc3BvaW50ZXIgPSBGYWxzZQorICAgICAgICBmb3IgZWxlbSBpbiBwYXJhbToKKyAgICAgICAgICAgIGlmIGVsZW0udGFnID09ICd0eXBlJyBhbmQgZWxlbS50YWlsIGlzIG5vdCBOb25lIGFuZCAnKicgaW4gZWxlbS50YWlsOgorICAgICAgICAgICAgICAgIGlzcG9pbnRlciA9IFRydWUKKyAgICAgICAgcmV0dXJuIGlzcG9pbnRlcgorICAgICMKKyAgICAjIFJldHJpZXZlIHRoZSB0eXBlIGFuZCBuYW1lIGZvciBhIHBhcmFtZXRlcgorICAgIGRlZiBnZXRUeXBlTmFtZVR1cGxlKHNlbGYsIHBhcmFtKToKKyAgICAgICAgdHlwZSA9ICcnCisgICAgICAgIG5hbWUgPSAnJworICAgICAgICBmb3IgZWxlbSBpbiBwYXJhbToKKyAgICAgICAgICAgIGlmIGVsZW0udGFnID09ICd0eXBlJzoKKyAgICAgICAgICAgICAgICB0eXBlID0gbm9uZVN0cihlbGVtLnRleHQpCisgICAgICAgICAgICBlbGlmIGVsZW0udGFnID09ICduYW1lJzoKKyAgICAgICAgICAgICAgICBuYW1lID0gbm9uZVN0cihlbGVtLnRleHQpCisgICAgICAgIHJldHVybiAodHlwZSwgbmFtZSkKKyAgICAjCisgICAgIyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIGxlbiB0YWcKKyAgICBkZWYgZ2V0TGVuKHNlbGYsIHBhcmFtKToKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICBsZW4gPSBwYXJhbS5hdHRyaWIuZ2V0KCdsZW4nKQorICAgICAgICBpZiBsZW4gYW5kIGxlbiAhPSAnbnVsbC10ZXJtaW5hdGVkJzoKKyAgICAgICAgICAgICMgRm9yIHN0cmluZyBhcnJheXMsICdsZW4nIGNhbiBsb29rIGxpa2UgJ2NvdW50LG51bGwtdGVybWluYXRlZCcsIGluZGljYXRpbmcgdGhhdCB3ZQorICAgICAgICAgICAgIyBoYXZlIGEgbnVsbCB0ZXJtaW5hdGVkIGFycmF5IG9mIHN0cmluZ3MuICBXZSBzdHJpcCB0aGUgbnVsbC10ZXJtaW5hdGVkIGZyb20gdGhlCisgICAgICAgICAgICAjICdsZW4nIGZpZWxkIGFuZCBvbmx5IHJldHVybiB0aGUgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIHN0cmluZyBjb3VudAorICAgICAgICAgICAgaWYgJ251bGwtdGVybWluYXRlZCcgaW4gbGVuOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxlbi5zcGxpdCgnLCcpWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxlbgorICAgICAgICAgICAgIyBTcGVjIGhhcyBub3cgbm90YXRpb24gZm9yIGxlbiBhdHRyaWJ1dGVzLCB1c2luZyA6OiBpbnN0ZWFkIG9mIHBsYXRmb3JtIHNwZWNpZmljIHBvaW50ZXIgc3ltYm9sCisgICAgICAgICAgICByZXN1bHQgPSBzdHIocmVzdWx0KS5yZXBsYWNlKCc6OicsICctPicpCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAjCisgICAgIyBHZW5lcmF0ZSBhIFZrU3RydWN0dXJlVHlwZSBiYXNlZCBvbiBhIHN0cnVjdHVyZSB0eXBlbmFtZQorICAgIGRlZiBnZW5Wa1N0cnVjdHVyZVR5cGUoc2VsZiwgdHlwZW5hbWUpOgorICAgICAgICAjIEFkZCB1bmRlcnNjb3JlIGJldHdlZW4gbG93ZXJjYXNlIHRoZW4gdXBwZXJjYXNlCisgICAgICAgIHZhbHVlID0gcmUuc3ViKCcoW2EtejAtOV0pKFtBLVpdKScsIHInXDFfXDInLCB0eXBlbmFtZSkKKyAgICAgICAgIyBDaGFuZ2UgdG8gdXBwZXJjYXNlCisgICAgICAgIHZhbHVlID0gdmFsdWUudXBwZXIoKQorICAgICAgICAjIEFkZCBTVFJVQ1RVUkVfVFlQRV8KKyAgICAgICAgcmV0dXJuIHJlLnN1YignVktfJywgJ1ZLX1NUUlVDVFVSRV9UWVBFXycsIHZhbHVlKQorICAgICMKKyAgICAjIFN0cnVjdCBwYXJhbWV0ZXIgY2hlY2sgZ2VuZXJhdGlvbi4KKyAgICAjIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIDx0eXBlPiB0YWcgd2hlcmUgdGhlIGNvbnRlbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhIHNldCBvZgorICAgICMgPG1lbWJlcj4gdGFncyBpbnN0ZWFkIG9mIGZyZWVmb3JtIEMgdHlwZSBkZWNsYXJhdGlvbnMuIFRoZSA8bWVtYmVyPiB0YWdzIGFyZSBqdXN0IGxpa2UKKyAgICAjIDxwYXJhbT4gdGFncyAtIHRoZXkgYXJlIGEgZGVjbGFyYXRpb24gb2YgYSBzdHJ1Y3Qgb3IgdW5pb24gbWVtYmVyLiBPbmx5IHNpbXBsZSBtZW1iZXIKKyAgICAjIGRlY2xhcmF0aW9ucyBhcmUgc3VwcG9ydGVkIChubyBuZXN0ZWQgc3RydWN0cyBldGMuKQorICAgIGRlZiBnZW5TdHJ1Y3Qoc2VsZiwgdHlwZWluZm8sIHR5cGVOYW1lLCBhbGlhcyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5TdHJ1Y3Qoc2VsZiwgdHlwZWluZm8sIHR5cGVOYW1lLCBhbGlhcykKKyAgICAgICAgbWVtYmVycyA9IHR5cGVpbmZvLmVsZW0uZmluZGFsbCgnLi8vbWVtYmVyJykKKyAgICAgICAgIyBJdGVyYXRlIG92ZXIgbWVtYmVycyBvbmNlIHRvIGdldCBsZW5ndGggcGFyYW1ldGVycyBmb3IgYXJyYXlzCisgICAgICAgIGxlbnMgPSBzZXQoKQorICAgICAgICBmb3IgbWVtYmVyIGluIG1lbWJlcnM6CisgICAgICAgICAgICBsZW4gPSBzZWxmLmdldExlbihtZW1iZXIpCisgICAgICAgICAgICBpZiBsZW46CisgICAgICAgICAgICAgICAgbGVucy5hZGQobGVuKQorICAgICAgICAjIEdlbmVyYXRlIG1lbWJlciBpbmZvCisgICAgICAgIG1lbWJlcnNJbmZvID0gW10KKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgIyBHZXQgdGhlIG1lbWJlcidzIHR5cGUgYW5kIG5hbWUKKyAgICAgICAgICAgIGluZm8gPSBzZWxmLmdldFR5cGVOYW1lVHVwbGUobWVtYmVyKQorICAgICAgICAgICAgdHlwZSA9IGluZm9bMF0KKyAgICAgICAgICAgIG5hbWUgPSBpbmZvWzFdCisgICAgICAgICAgICBjZGVjbCA9IHNlbGYubWFrZUNQYXJhbURlY2wobWVtYmVyLCAwKQorICAgICAgICAgICAgIyBQcm9jZXNzIFZrU3RydWN0dXJlVHlwZQorICAgICAgICAgICAgaWYgdHlwZSA9PSAnVmtTdHJ1Y3R1cmVUeXBlJzoKKyAgICAgICAgICAgICAgICAjIEV4dHJhY3QgdGhlIHJlcXVpcmVkIHN0cnVjdCB0eXBlIHZhbHVlIGZyb20gdGhlIGNvbW1lbnRzCisgICAgICAgICAgICAgICAgIyBlbWJlZGRlZCBpbiB0aGUgb3JpZ2luYWwgdGV4dCBkZWZpbmluZyB0aGUgJ3R5cGVpbmZvJyBlbGVtZW50CisgICAgICAgICAgICAgICAgcmF3WG1sID0gZXRyZWUudG9zdHJpbmcodHlwZWluZm8uZWxlbSkuZGVjb2RlKCdhc2NpaScpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmUuc2VhcmNoKHInVktfU1RSVUNUVVJFX1RZUEVfXHcrJywgcmF3WG1sKQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQuZ3JvdXAoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2VuVmtTdHJ1Y3R1cmVUeXBlKHR5cGVOYW1lKQorICAgICAgICAgICAgICAgICMgU3RvcmUgdGhlIHJlcXVpcmVkIHR5cGUgdmFsdWUKKyAgICAgICAgICAgICAgICBzZWxmLnN0cnVjdFR5cGVzW3R5cGVOYW1lXSA9IHNlbGYuU3RydWN0VHlwZShuYW1lPW5hbWUsIHZhbHVlPXZhbHVlKQorICAgICAgICAgICAgIyBTdG9yZSBwb2ludGVyL2FycmF5L3N0cmluZyBpbmZvCisgICAgICAgICAgICBleHRzdHJ1Y3RzID0gbWVtYmVyLmF0dHJpYi5nZXQoJ3ZhbGlkZXh0ZW5zaW9uc3RydWN0cycpIGlmIG5hbWUgPT0gJ3BOZXh0JyBlbHNlIE5vbmUKKyAgICAgICAgICAgIG1lbWJlcnNJbmZvLmFwcGVuZChzZWxmLkNvbW1hbmRQYXJhbSh0eXBlPXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY29uc3Q9VHJ1ZSBpZiAnY29uc3QnIGluIGNkZWNsIGVsc2UgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvcHRpb25hbD1zZWxmLnBhcmFtSXNPcHRpb25hbChtZW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY291bnQ9VHJ1ZSBpZiBuYW1lIGluIGxlbnMgZWxzZSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW49c2VsZi5nZXRMZW4obWVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRzdHJ1Y3RzPWV4dHN0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RlY2w9Y2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNsb2NhbD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2NyZWF0ZT1GYWxzZSkpCisgICAgICAgIHNlbGYuc3RydWN0TWVtYmVycy5hcHBlbmQoc2VsZi5TdHJ1Y3RNZW1iZXJEYXRhKG5hbWU9dHlwZU5hbWUsIG1lbWJlcnM9bWVtYmVyc0luZm8pKQorICAgICMKKyAgICAjIEluc2VydCBhIGxvY2tfZ3VhcmQgbGluZQorICAgIGRlZiBsb2NrX2d1YXJkKHNlbGYsIGluZGVudCk6CisgICAgICAgIHJldHVybiAnJXNzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnbG9iYWxfbG9jayk7XG4nICUgaW5kZW50CisgICAgIworICAgICMgRGV0ZXJtaW5lIGlmIGEgc3RydWN0IGhhcyBhbiBvYmplY3QgYXMgYSBtZW1iZXIgb3IgYW4gZW1iZWRkZWQgbWVtYmVyCisgICAgZGVmIHN0cnVjdF9jb250YWluc19vYmplY3Qoc2VsZiwgc3RydWN0X2l0ZW0pOgorICAgICAgICBzdHJ1Y3RfbWVtYmVyX2RpY3QgPSBkaWN0KHNlbGYuc3RydWN0TWVtYmVycykKKyAgICAgICAgc3RydWN0X21lbWJlcnMgPSBzdHJ1Y3RfbWVtYmVyX2RpY3Rbc3RydWN0X2l0ZW1dCisKKyAgICAgICAgZm9yIG1lbWJlciBpbiBzdHJ1Y3RfbWVtYmVyczoKKyAgICAgICAgICAgIGlmIG1lbWJlci50eXBlIGluIHNlbGYuaGFuZGxlX3R5cGVzOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAjIHJlY3Vyc2UgZm9yIG1lbWJlciBzdHJ1Y3RzLCBndWFyZCBhZ2FpbnN0IGluZmluaXRlIHJlY3Vyc2lvbgorICAgICAgICAgICAgZWxpZiBtZW1iZXIudHlwZSBpbiBzdHJ1Y3RfbWVtYmVyX2RpY3QgYW5kIG1lbWJlci50eXBlICE9IHN0cnVjdF9pdGVtOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RydWN0X2NvbnRhaW5zX29iamVjdChtZW1iZXIudHlwZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgICMKKyAgICAjIFJldHVybiBsaXN0IG9mIHN0cnVjdCBtZW1iZXJzIHdoaWNoIGNvbnRhaW4sIG9yIHdob3NlIHN1Yi1zdHJ1Y3R1cmVzIGNvbnRhaW4gYW4gb2JqIGluIGEgZ2l2ZW4gbGlzdCBvZiBwYXJhbWV0ZXJzIG9yIG1lbWJlcnMKKyAgICBkZWYgZ2V0UGFybWV0ZXJTdHJ1Y3RzV2l0aE9iamVjdHMoc2VsZiwgaXRlbV9saXN0KToKKyAgICAgICAgc3RydWN0X2xpc3QgPSBzZXQoKQorICAgICAgICBmb3IgaXRlbSBpbiBpdGVtX2xpc3Q6CisgICAgICAgICAgICBwYXJhbXR5cGUgPSBpdGVtLmZpbmQoJ3R5cGUnKQorICAgICAgICAgICAgdHlwZWNhdGVnb3J5ID0gc2VsZi50eXBlX2NhdGVnb3JpZXNbcGFyYW10eXBlLnRleHRdCisgICAgICAgICAgICBpZiB0eXBlY2F0ZWdvcnkgPT0gJ3N0cnVjdCc6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdHJ1Y3RfY29udGFpbnNfb2JqZWN0KHBhcmFtdHlwZS50ZXh0KSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfbGlzdC5hZGQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN0cnVjdF9saXN0CisgICAgIworICAgICMgUmV0dXJuIGxpc3Qgb2Ygb2JqZWN0cyBmcm9tIGEgZ2l2ZW4gbGlzdCBvZiBwYXJhbWV0ZXJzIG9yIG1lbWJlcnMKKyAgICBkZWYgZ2V0T2JqZWN0c0luUGFyYW1ldGVyTGlzdChzZWxmLCBpdGVtX2xpc3QsIGNyZWF0ZV9mdW5jKToKKyAgICAgICAgb2JqZWN0X2xpc3QgPSBzZXQoKQorICAgICAgICBpZiBjcmVhdGVfZnVuYyA9PSBUcnVlOgorICAgICAgICAgICAgbWVtYmVyX2xpc3QgPSBpdGVtX2xpc3RbMDotMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1lbWJlcl9saXN0ID0gaXRlbV9saXN0CisgICAgICAgIGZvciBpdGVtIGluIG1lbWJlcl9saXN0OgorICAgICAgICAgICAgaWYgcGFyYW10eXBlLnRleHQgaW4gc2VsZi5oYW5kbGVfdHlwZXM6CisgICAgICAgICAgICAgICAgb2JqZWN0X2xpc3QuYWRkKGl0ZW0pCisgICAgICAgIHJldHVybiBvYmplY3RfbGlzdAorICAgICMKKyAgICAjIENvbnN0cnVjdCBsaXN0IG9mIGV4dGVuc2lvbiBzdHJ1Y3RzIGNvbnRhaW5pbmcgaGFuZGxlcywgb3IgZXh0ZW5zaW9uIHN0cnVjdHMgdGhhdCBzaGFyZSBhIDx2YWxpZGV4dGVuc2lvbnN0cnVjdHM+CisgICAgIyB0YWcgV0lUSCBhbiBleHRlbnNpb24gc3RydWN0IGNvbnRhaW5pbmcgaGFuZGxlcy4KKyAgICBkZWYgR2VuZXJhdGVDb21tYW5kV3JhcEV4dGVuc2lvbkxpc3Qoc2VsZik6CisgICAgICAgIGZvciBzdHJ1Y3QgaW4gc2VsZi5zdHJ1Y3RNZW1iZXJzOgorICAgICAgICAgICAgaWYgKGxlbihzdHJ1Y3QubWVtYmVycykgPiAxKSBhbmQgc3RydWN0Lm1lbWJlcnNbMV0uZXh0c3RydWN0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlOworICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHN0cnVjdC5tZW1iZXJzWzFdLmV4dHN0cnVjdHMuc3BsaXQoJywnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXRlbSAhPSAnJyBhbmQgc2VsZi5zdHJ1Y3RfY29udGFpbnNfb2JqZWN0KGl0ZW0pID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBmb3VuZCA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBzdHJ1Y3QubWVtYmVyc1sxXS5leHRzdHJ1Y3RzLnNwbGl0KCcsJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdGVtICE9ICcnIGFuZCBpdGVtIG5vdCBpbiBzZWxmLmV4dGVuc2lvbl9zdHJ1Y3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXh0ZW5zaW9uX3N0cnVjdHMuYXBwZW5kKGl0ZW0pCisgICAgIworICAgICMgUmV0dXJucyBUcnVlIGlmIGEgc3RydWN0IG1heSBoYXZlIGEgcE5leHQgY2hhaW4gY29udGFpbmluZyBhbiBvYmplY3QKKyAgICBkZWYgU3RydWN0V2l0aEV4dGVuc2lvbnMoc2VsZiwgc3RydWN0X3R5cGUpOgorICAgICAgICBpZiBzdHJ1Y3RfdHlwZSBpbiBzZWxmLnN0cnVjdF9tZW1iZXJfZGljdDoKKyAgICAgICAgICAgIHBhcmFtX2luZm8gPSBzZWxmLnN0cnVjdF9tZW1iZXJfZGljdFtzdHJ1Y3RfdHlwZV0KKyAgICAgICAgICAgIGlmIChsZW4ocGFyYW1faW5mbykgPiAxKSBhbmQgcGFyYW1faW5mb1sxXS5leHRzdHJ1Y3RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHBhcmFtX2luZm9bMV0uZXh0c3RydWN0cy5zcGxpdCgnLCcpOgorICAgICAgICAgICAgICAgICAgICBpZiBpdGVtIGluIHNlbGYuZXh0ZW5zaW9uX3N0cnVjdHM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAjCisgICAgIyBHZW5lcmF0ZSBWdWxrYW5PYmplY3RUeXBlIGZyb20gb2JqZWN0IHR5cGUKKyAgICBkZWYgR2V0VnVsa2FuT2JqVHlwZShzZWxmLCB0eXBlKToKKyAgICAgICAgcmV0dXJuICdrVnVsa2FuT2JqZWN0VHlwZSVzJyAlIHR5cGVbMjpdCisgICAgIworICAgICMgUmV0dXJuIGNvcnJlY3QgZGlzcGF0Y2ggdGFibGUgdHlwZSAtLSBpbnN0YW5jZSBvciBkZXZpY2UKKyAgICBkZWYgR2V0RGlzcFR5cGUoc2VsZiwgdHlwZSk6CisgICAgICAgIHJldHVybiAnaW5zdGFuY2UnIGlmIHR5cGUgaW4gWydWa0luc3RhbmNlJywgJ1ZrUGh5c2ljYWxEZXZpY2UnXSBlbHNlICdkZXZpY2UnCisgICAgIworICAgICMgR2VuZXJhdGUgc291cmNlIGZvciBjcmVhdGluZyBhIFZ1bGthbiBvYmplY3QKKyAgICBkZWYgZ2VuZXJhdGVfY3JlYXRlX29iamVjdF9jb2RlKHNlbGYsIGluZGVudCwgcHJvdG8sIHBhcmFtcywgY21kX2luZm8sIGFsbG9jYXRvcik6CisgICAgICAgIGNyZWF0ZV9vYmpfY29kZSA9ICcnCisgICAgICAgIGhhbmRsZV90eXBlID0gcGFyYW1zWy0xXS5maW5kKCd0eXBlJykKKyAgICAgICAgaXNfY3JlYXRlX3BpcGVsaW5lcyA9IEZhbHNlCisKKyAgICAgICAgaWYgaGFuZGxlX3R5cGUudGV4dCBpbiBzZWxmLmhhbmRsZV90eXBlczoKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIHNwZWNpYWwgY2FzZSB3aGVyZSBtdWx0aXBsZSBoYW5kbGVzIGFyZSByZXR1cm5lZAorICAgICAgICAgICAgb2JqZWN0X2FycmF5ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIGNtZF9pbmZvWy0xXS5sZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgb2JqZWN0X2FycmF5ID0gVHJ1ZTsKKyAgICAgICAgICAgIGhhbmRsZV9uYW1lID0gcGFyYW1zWy0xXS5maW5kKCduYW1lJykKKyAgICAgICAgICAgIG9iamVjdF9kZXN0ID0gJyolcycgJSBoYW5kbGVfbmFtZS50ZXh0CisgICAgICAgICAgICBpZiBvYmplY3RfYXJyYXkgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICBpZiAnQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMnIGluIHByb3RvLnRleHQgb3IgJ0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMnIGluIHByb3RvLnRleHQgb3IgJ0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXMnIGluIHByb3RvLnRleHQ6CisgICAgICAgICAgICAgICAgICAgIGlzX2NyZWF0ZV9waXBlbGluZXMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9vYmpfY29kZSArPSAnJXNpZiAoVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUID09IHJlc3VsdCkgcmV0dXJuO1xuJyAlIGluZGVudAorICAgICAgICAgICAgICAgIGNyZWF0ZV9vYmpfY29kZSArPSAnJXNpZiAoJXMpIHtcbicgJSAoaW5kZW50LCBoYW5kbGVfbmFtZS50ZXh0KQorICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5jSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICBjb3VudGlzcG9pbnRlciA9ICcnCisgICAgICAgICAgICAgICAgaWYgJ3VpbnQzMl90KicgaW4gY21kX2luZm9bLTJdLmNkZWNsOgorICAgICAgICAgICAgICAgICAgICBjb3VudGlzcG9pbnRlciA9ICcqJworICAgICAgICAgICAgICAgIGNyZWF0ZV9vYmpfY29kZSArPSAnJXNmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCAlcyVzOyBpbmRleCsrKSB7XG4nICUgKGluZGVudCwgY291bnRpc3BvaW50ZXIsIGNtZF9pbmZvWy0xXS5sZW4pCisgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgIG9iamVjdF9kZXN0ID0gJyVzW2luZGV4XScgJSBjbWRfaW5mb1stMV0ubmFtZQorCisgICAgICAgICAgICBkaXNwb2JqID0gcGFyYW1zWzBdLmZpbmQoJ3R5cGUnKS50ZXh0CisgICAgICAgICAgICBpZiBpc19jcmVhdGVfcGlwZWxpbmVzOgorICAgICAgICAgICAgICAgIGNyZWF0ZV9vYmpfY29kZSArPSAnJXNpZiAoIXBQaXBlbGluZXNbaW5kZXhdKSBjb250aW51ZTtcbicgJSBpbmRlbnQKKyAgICAgICAgICAgIGNyZWF0ZV9vYmpfY29kZSArPSAnJXNDcmVhdGVPYmplY3QoJXMsICVzLCAlcyk7XG4nICUgKGluZGVudCwgb2JqZWN0X2Rlc3QsIHNlbGYuR2V0VnVsa2FuT2JqVHlwZShjbWRfaW5mb1stMV0udHlwZSksIGFsbG9jYXRvcikKKyAgICAgICAgICAgIGlmIG9iamVjdF9hcnJheSA9PSBUcnVlOgorICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuZGVjSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICBjcmVhdGVfb2JqX2NvZGUgKz0gJyVzfVxuJyAlIGluZGVudAorICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuZGVjSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgICAgICBjcmVhdGVfb2JqX2NvZGUgKz0gJyVzfVxuJyAlIGluZGVudAorICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KQorCisgICAgICAgIHJldHVybiBjcmVhdGVfb2JqX2NvZGUKKyAgICAjCisgICAgIyBHZW5lcmF0ZSBzb3VyY2UgZm9yIGRlc3Ryb3lpbmcgYSBub24tZGlzcGF0Y2hhYmxlIG9iamVjdAorICAgIGRlZiBnZW5lcmF0ZV9kZXN0cm95X29iamVjdF9jb2RlKHNlbGYsIGluZGVudCwgcHJvdG8sIGNtZF9pbmZvKToKKyAgICAgICAgdmFsaWRhdGVfY29kZSA9ICcnCisgICAgICAgIHJlY29yZF9jb2RlID0gJycKKyAgICAgICAgb2JqZWN0X2FycmF5ID0gRmFsc2UKKyAgICAgICAgaWYgVHJ1ZSBpbiBbZGVzdHJveV90eHQgaW4gcHJvdG8udGV4dCBmb3IgZGVzdHJveV90eHQgaW4gWydEZXN0cm95JywgJ0ZyZWUnXV06CisgICAgICAgICAgICAjIENoZWNrIGZvciBzcGVjaWFsIGNhc2Ugd2hlcmUgbXVsdGlwbGUgaGFuZGxlcyBhcmUgcmV0dXJuZWQKKyAgICAgICAgICAgIGlmIGNtZF9pbmZvWy0xXS5sZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgb2JqZWN0X2FycmF5ID0gVHJ1ZTsKKyAgICAgICAgICAgICAgICBwYXJhbSA9IC0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhcmFtID0gLTIKKyAgICAgICAgICAgIGNvbXBhdGFsbG9jX3Z1aWRfc3RyaW5nID0gJyVzLWNvbXBhdGFsbG9jJyAlIGNtZF9pbmZvW3BhcmFtXS5uYW1lCisgICAgICAgICAgICBudWxsYWxsb2NfdnVpZF9zdHJpbmcgPSAnJXMtbnVsbGFsbG9jJyAlIGNtZF9pbmZvW3BhcmFtXS5uYW1lCisgICAgICAgICAgICBjb21wYXRhbGxvY192dWlkID0gc2VsZi5tYW51YWxfdnVpZHMuZ2V0KGNvbXBhdGFsbG9jX3Z1aWRfc3RyaW5nLCAia1ZVSURVbmRlZmluZWQiKQorICAgICAgICAgICAgbnVsbGFsbG9jX3Z1aWQgPSBzZWxmLm1hbnVhbF92dWlkcy5nZXQobnVsbGFsbG9jX3Z1aWRfc3RyaW5nLCAia1ZVSURVbmRlZmluZWQiKQorICAgICAgICAgICAgaWYgY21kX2luZm9bcGFyYW1dLnR5cGUgaW4gc2VsZi5oYW5kbGVfdHlwZXM6CisgICAgICAgICAgICAgICAgaWYgb2JqZWN0X2FycmF5ID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBBUEkgaXMgZnJlZWluZyBhbiBhcnJheSBvZiBoYW5kbGVzIC0tIGFkZCBsb29wIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfY29kZSArPSAnSEVZLCBORUVEIFRPIERFU1RST1kgQU4gQVJSQVlcbicKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkaXNwb2JqID0gY21kX2luZm9bMF0udHlwZQorICAgICAgICAgICAgICAgICAgICAjIENhbGwgRGVzdHJveSBhIHNpbmdsZSB0aW1lCisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX2NvZGUgKz0gJyVzc2tpcCB8PSBWYWxpZGF0ZURlc3Ryb3lPYmplY3QoJXMsICVzLCBwQWxsb2NhdG9yLCAlcywgJXMpO1xuJyAlIChpbmRlbnQsIGNtZF9pbmZvW3BhcmFtXS5uYW1lLCBzZWxmLkdldFZ1bGthbk9ialR5cGUoY21kX2luZm9bcGFyYW1dLnR5cGUpLCBjb21wYXRhbGxvY192dWlkLCBudWxsYWxsb2NfdnVpZCkKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkX2NvZGUgKz0gJyVzUmVjb3JkRGVzdHJveU9iamVjdCglcywgJXMpO1xuJyAlIChpbmRlbnQsIGNtZF9pbmZvW3BhcmFtXS5uYW1lLCBzZWxmLkdldFZ1bGthbk9ialR5cGUoY21kX2luZm9bcGFyYW1dLnR5cGUpKQorICAgICAgICByZXR1cm4gb2JqZWN0X2FycmF5LCB2YWxpZGF0ZV9jb2RlLCByZWNvcmRfY29kZQorICAgICMKKyAgICAjIE91dHB1dCB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBvYmplY3QgKG9ial9jb3VudCBpcyBOVUxMKSBvciBhIGNvdW50ZWQgbGlzdCBvZiBvYmplY3RzCisgICAgZGVmIG91dHB1dE9iamVjdHMoc2VsZiwgb2JqX3R5cGUsIG9ial9uYW1lLCBvYmpfY291bnQsIHByZWZpeCwgaW5kZXgsIGluZGVudCwgZGlzcF9uYW1lLCBwYXJlbnRfbmFtZSwgbnVsbF9hbGxvd2VkLCB0b3BfbGV2ZWwpOgorICAgICAgICBwcmVfY2FsbF9jb2RlID0gJycKKyAgICAgICAgcGFyYW1fc3VmZml4ID0gJyVzLXBhcmFtZXRlcicgJSAob2JqX25hbWUpCisgICAgICAgIHBhcmVudF9zdWZmaXggPSAnJXMtcGFyZW50JyAlIChvYmpfbmFtZSkKKyAgICAgICAgcGFyYW1fdnVpZCA9IHNlbGYuR2V0VnVpZChwYXJlbnRfbmFtZSwgcGFyYW1fc3VmZml4KQorICAgICAgICBwYXJlbnRfdnVpZCA9IHNlbGYuR2V0VnVpZChwYXJlbnRfbmFtZSwgcGFyZW50X3N1ZmZpeCkKKworICAgICAgICAjIElmIG5vIHBhcmVudCBWVUlEIGZvciB0aGlzIG1lbWJlciwgbG9vayBmb3IgYSBjb21tb25wYXJlbnQgVlVJRAorICAgICAgICBpZiBwYXJlbnRfdnVpZCA9PSAna1ZVSURVbmRlZmluZWQnOgorICAgICAgICAgICAgcGFyZW50X3Z1aWQgPSBzZWxmLkdldFZ1aWQocGFyZW50X25hbWUsICdjb21tb25wYXJlbnQnKQorICAgICAgICBpZiBvYmpfY291bnQgaXMgbm90IE5vbmU6CisKKyAgICAgICAgICAgIHByZV9jYWxsX2NvZGUgKz0gJyVzaWYgKCVzJXMpIHtcbicgJSAoaW5kZW50LCBwcmVmaXgsIG9ial9uYW1lKQorICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgcHJlX2NhbGxfY29kZSArPSAnJXNmb3IgKHVpbnQzMl90ICVzID0gMDsgJXMgPCAlczsgKyslcykge1xuJyAlIChpbmRlbnQsIGluZGV4LCBpbmRleCwgb2JqX2NvdW50LCBpbmRleCkKKyAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5jSW5kZW50KGluZGVudCkKKyAgICAgICAgICAgIHByZV9jYWxsX2NvZGUgKz0gJyVzc2tpcCB8PSBWYWxpZGF0ZU9iamVjdCglcyVzWyVzXSwgJXMsICVzLCAlcywgJXMpO1xuJyAlIChpbmRlbnQsIHByZWZpeCwgb2JqX25hbWUsIGluZGV4LCBzZWxmLkdldFZ1bGthbk9ialR5cGUob2JqX3R5cGUpLCBudWxsX2FsbG93ZWQsIHBhcmFtX3Z1aWQsIHBhcmVudF92dWlkKQorICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgcHJlX2NhbGxfY29kZSArPSAnJXN9XG4nICUgaW5kZW50CisgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmRlY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICBwcmVfY2FsbF9jb2RlICs9ICclc31cbicgJSBpbmRlbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJvbnVzX2luZGVudCA9ICcnCisgICAgICAgICAgICBpZiAnYmFzZVBpcGVsaW5lSGFuZGxlJyBpbiBvYmpfbmFtZToKKyAgICAgICAgICAgICAgICBwcmVfY2FsbF9jb2RlICs9ICclc2lmICgoJXNmbGFncyAmIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCkgJiYgKCVzYmFzZVBpcGVsaW5lSW5kZXggPT0gLTEpKVxuJyAlIChpbmRlbnQsIHByZWZpeCwgcHJlZml4KQorICAgICAgICAgICAgICAgIGJvbnVzX2luZGVudCA9ICcgICAgJworICAgICAgICAgICAgICAgIG51bGxfYWxsb3dlZCA9ICdmYWxzZScKKyAgICAgICAgICAgICAgICBtYW51YWxfdnVpZF9pbmRleCA9IHBhcmVudF9uYW1lICsgJy0nICsgb2JqX25hbWUKKyAgICAgICAgICAgICAgICBwYXJhbV92dWlkID0gc2VsZi5tYW51YWxfdnVpZHMuZ2V0KG1hbnVhbF92dWlkX2luZGV4LCAia1ZVSURVbmRlZmluZWQiKQorICAgICAgICAgICAgcHJlX2NhbGxfY29kZSArPSAnJXMlc3NraXAgfD0gVmFsaWRhdGVPYmplY3QoJXMlcywgJXMsICVzLCAlcywgJXMpO1xuJyAlIChib251c19pbmRlbnQsIGluZGVudCwgcHJlZml4LCBvYmpfbmFtZSwgc2VsZi5HZXRWdWxrYW5PYmpUeXBlKG9ial90eXBlKSwgbnVsbF9hbGxvd2VkLCBwYXJhbV92dWlkLCBwYXJlbnRfdnVpZCkKKyAgICAgICAgcmV0dXJuIHByZV9jYWxsX2NvZGUKKyAgICAjCisgICAgIyBmaXJzdF9sZXZlbF9wYXJhbSBpbmRpY2F0ZXMgaWYgZWxlbWVudHMgYXJlIHBhc3NlZCBkaXJlY3RseSBpbnRvIHRoZSBmdW5jdGlvbiBlbHNlIHRoZXkncmUgYmVsb3cgYSBwdHIvc3RydWN0CisgICAgZGVmIHZhbGlkYXRlX29iamVjdHMoc2VsZiwgbWVtYmVycywgaW5kZW50LCBwcmVmaXgsIGFycmF5X2luZGV4LCBkaXNwX25hbWUsIHBhcmVudF9uYW1lLCBmaXJzdF9sZXZlbF9wYXJhbSk6CisgICAgICAgIHByZV9jb2RlID0gJycKKyAgICAgICAgaW5kZXggPSAnaW5kZXglcycgJSBzdHIoYXJyYXlfaW5kZXgpCisgICAgICAgIGFycmF5X2luZGV4ICs9IDEKKyAgICAgICAgIyBQcm9jZXNzIGFueSBvYmplY3RzIGluIHRoaXMgc3RydWN0dXJlIGFuZCByZWN1cnNlIGZvciBhbnkgc3ViLXN0cnVjdHMgaW4gdGhpcyBzdHJ1Y3QKKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgIyBIYW5kbGUgb2JqZWN0cworICAgICAgICAgICAgaWYgbWVtYmVyLmlzY3JlYXRlIGFuZCBmaXJzdF9sZXZlbF9wYXJhbSBhbmQgbWVtYmVyID09IG1lbWJlcnNbLTFdOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBtZW1iZXIudHlwZSBpbiBzZWxmLmhhbmRsZV90eXBlczoKKyAgICAgICAgICAgICAgICBjb3VudF9uYW1lID0gbWVtYmVyLmxlbgorICAgICAgICAgICAgICAgIGlmIChjb3VudF9uYW1lIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgY291bnRfbmFtZSA9ICclcyVzJyAlIChwcmVmaXgsIG1lbWJlci5sZW4pCisgICAgICAgICAgICAgICAgbnVsbF9hbGxvd2VkID0gbWVtYmVyLmlzb3B0aW9uYWwKKyAgICAgICAgICAgICAgICB0bXBfcHJlID0gc2VsZi5vdXRwdXRPYmplY3RzKG1lbWJlci50eXBlLCBtZW1iZXIubmFtZSwgY291bnRfbmFtZSwgcHJlZml4LCBpbmRleCwgaW5kZW50LCBkaXNwX25hbWUsIHBhcmVudF9uYW1lLCBzdHIobnVsbF9hbGxvd2VkKS5sb3dlcigpLCBmaXJzdF9sZXZlbF9wYXJhbSkKKyAgICAgICAgICAgICAgICBwcmVfY29kZSArPSB0bXBfcHJlCisgICAgICAgICAgICAjIEhhbmRsZSBTdHJ1Y3RzIHRoYXQgY29udGFpbiBvYmplY3RzIGF0IHNvbWUgbGV2ZWwKKyAgICAgICAgICAgIGVsaWYgbWVtYmVyLnR5cGUgaW4gc2VsZi5zdHJ1Y3RfbWVtYmVyX2RpY3Q6CisgICAgICAgICAgICAgICAgIyBTdHJ1Y3RzIGF0IGZpcnN0IGxldmVsIHdpbGwgaGF2ZSBhbiBvYmplY3QKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cnVjdF9jb250YWluc19vYmplY3QobWVtYmVyLnR5cGUpID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9pbmZvID0gc2VsZi5zdHJ1Y3RfbWVtYmVyX2RpY3RbbWVtYmVyLnR5cGVdCisgICAgICAgICAgICAgICAgICAgICMgVE9ETyAoamJvbHopOiBDYW4gdGhpcyB1c2UgcGFyYW1Jc1BvaW50ZXI/CisgICAgICAgICAgICAgICAgICAgIGlzcG9pbnRlciA9ICcqJyBpbiBtZW1iZXIuY2RlY2w7CisgICAgICAgICAgICAgICAgICAgICMgU3RydWN0IEFycmF5CisgICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlci5sZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFVwZGF0ZSBzdHJ1Y3QgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcHJlZml4ID0gJyVzJXMnICUgKHByZWZpeCwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXNpZiAoJXMlcykge1xuJyAlIChpbmRlbnQsIHByZWZpeCwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXNmb3IgKHVpbnQzMl90ICVzID0gMDsgJXMgPCAlcyVzOyArKyVzKSB7XG4nICUgKGluZGVudCwgaW5kZXgsIGluZGV4LCBwcmVmaXgsIG1lbWJlci5sZW4sIGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcHJlZml4ID0gJyVzWyVzXS4nICUgKG5ld19wcmVmaXgsIGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIHN1Yi1zdHJ1Y3RzIGluIHRoaXMgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBfcHJlID0gc2VsZi52YWxpZGF0ZV9vYmplY3RzKHN0cnVjdF9pbmZvLCBpbmRlbnQsIGxvY2FsX3ByZWZpeCwgYXJyYXlfaW5kZXgsIGRpc3BfbmFtZSwgbWVtYmVyLnR5cGUsIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gdG1wX3ByZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gJyVzfVxuJyAlIGluZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gJyVzfVxuJyAlIGluZGVudAorICAgICAgICAgICAgICAgICAgICAjIFNpbmdsZSBTdHJ1Y3QgUG9pbnRlcgorICAgICAgICAgICAgICAgICAgICBlbGlmIGlzcG9pbnRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVXBkYXRlIHN0cnVjdCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19wcmVmaXggPSAnJXMlcy0+JyAlIChwcmVmaXgsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWNsYXJlIHNhZmVfVmFyVHlwZSBmb3Igc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVfY29kZSArPSAnJXNpZiAoJXMlcykge1xuJyAlIChpbmRlbnQsIHByZWZpeCwgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAjIFByb2Nlc3Mgc3ViLXN0cnVjdHMgaW4gdGhpcyBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9wcmUgPSBzZWxmLnZhbGlkYXRlX29iamVjdHMoc3RydWN0X2luZm8sIGluZGVudCwgbmV3X3ByZWZpeCwgYXJyYXlfaW5kZXgsIGRpc3BfbmFtZSwgbWVtYmVyLnR5cGUsIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gdG1wX3ByZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvZGUgKz0gJyVzfVxuJyAlIGluZGVudAorICAgICAgICAgICAgICAgICAgICAjIFNpbmdsZSBOZXN0ZWQgU3RydWN0CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFVwZGF0ZSBzdHJ1Y3QgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcHJlZml4ID0gJyVzJXMuJyAlIChwcmVmaXgsIG1lbWJlci5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIHN1Yi1zdHJ1Y3RzCisgICAgICAgICAgICAgICAgICAgICAgICB0bXBfcHJlID0gc2VsZi52YWxpZGF0ZV9vYmplY3RzKHN0cnVjdF9pbmZvLCBpbmRlbnQsIG5ld19wcmVmaXgsIGFycmF5X2luZGV4LCBkaXNwX25hbWUsIG1lbWJlci50eXBlLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZV9jb2RlICs9IHRtcF9wcmUKKyAgICAgICAgcmV0dXJuIHByZV9jb2RlCisgICAgIworICAgICMgRm9yIGEgcGFydGljdWxhciBBUEksIGdlbmVyYXRlIHRoZSBvYmplY3QgaGFuZGxpbmcgY29kZQorICAgIGRlZiBnZW5lcmF0ZV93cmFwcGluZ19jb2RlKHNlbGYsIGNtZCk6CisgICAgICAgIGluZGVudCA9ICcgICAgJworICAgICAgICBwcmVfY2FsbF92YWxpZGF0ZSA9ICcnCisgICAgICAgIHByZV9jYWxsX3JlY29yZCA9ICcnCisgICAgICAgIHBvc3RfY2FsbF9yZWNvcmQgPSAnJworCisgICAgICAgIGRlc3Ryb3lfYXJyYXkgPSBGYWxzZQorICAgICAgICB2YWxpZGF0ZV9kZXN0cm95X2NvZGUgPSAnJworICAgICAgICByZWNvcmRfZGVzdHJveV9jb2RlID0gJycKKworICAgICAgICBwcm90byA9IGNtZC5maW5kKCdwcm90by9uYW1lJykKKyAgICAgICAgcGFyYW1zID0gY21kLmZpbmRhbGwoJ3BhcmFtJykKKyAgICAgICAgaWYgcHJvdG8udGV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNtZGRhdGEgPSBzZWxmLmNtZF9pbmZvX2RpY3RbcHJvdG8udGV4dF0KKyAgICAgICAgICAgIGNtZF9pbmZvID0gY21kZGF0YS5tZW1iZXJzCisgICAgICAgICAgICBkaXNwX25hbWUgPSBjbWRfaW5mb1swXS5uYW1lCisgICAgICAgICAgICAjIEhhbmRsZSBvYmplY3QgY3JlYXRlIG9wZXJhdGlvbnMgaWYgbGFzdCBwYXJhbWV0ZXIgaXMgY3JlYXRlZCBieSB0aGlzIGNhbGwKKyAgICAgICAgICAgIGlmIGNtZGRhdGEuaXNjcmVhdGU6CisgICAgICAgICAgICAgICAgcG9zdF9jYWxsX3JlY29yZCArPSBzZWxmLmdlbmVyYXRlX2NyZWF0ZV9vYmplY3RfY29kZShpbmRlbnQsIHByb3RvLCBwYXJhbXMsIGNtZF9pbmZvLCBjbWRkYXRhLmFsbG9jYXRvcikKKyAgICAgICAgICAgICMgSGFuZGxlIG9iamVjdCBkZXN0cm95IG9wZXJhdGlvbnMKKyAgICAgICAgICAgIGlmIGNtZGRhdGEuaXNkZXN0cm95OgorICAgICAgICAgICAgICAgIChkZXN0cm95X2FycmF5LCB2YWxpZGF0ZV9kZXN0cm95X2NvZGUsIHJlY29yZF9kZXN0cm95X2NvZGUpID0gc2VsZi5nZW5lcmF0ZV9kZXN0cm95X29iamVjdF9jb2RlKGluZGVudCwgcHJvdG8sIGNtZF9pbmZvKQorCisgICAgICAgICAgICBwcmVfY2FsbF9yZWNvcmQgKz0gcmVjb3JkX2Rlc3Ryb3lfY29kZQorICAgICAgICAgICAgcHJlX2NhbGxfdmFsaWRhdGUgKz0gc2VsZi52YWxpZGF0ZV9vYmplY3RzKGNtZF9pbmZvLCBpbmRlbnQsICcnLCAwLCBkaXNwX25hbWUsIHByb3RvLnRleHQsIFRydWUpCisgICAgICAgICAgICBwcmVfY2FsbF92YWxpZGF0ZSArPSB2YWxpZGF0ZV9kZXN0cm95X2NvZGUKKworICAgICAgICByZXR1cm4gcHJlX2NhbGxfdmFsaWRhdGUsIHByZV9jYWxsX3JlY29yZCwgcG9zdF9jYWxsX3JlY29yZAorICAgICMKKyAgICAjIENhcHR1cmUgY29tbWFuZCBwYXJhbWV0ZXIgaW5mbyBuZWVkZWQgdG8gY3JlYXRlLCBkZXN0cm95LCBhbmQgdmFsaWRhdGUgb2JqZWN0cworICAgIGRlZiBnZW5DbWQoc2VsZiwgY21kaW5mbywgY21kbmFtZSwgYWxpYXMpOgorICAgICAgICAjIEFkZCBzdHJ1Y3QtbWVtYmVyIHR5cGUgaW5mb3JtYXRpb24gdG8gY29tbWFuZCBwYXJhbWV0ZXIgaW5mb3JtYXRpb24KKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlbkNtZChzZWxmLCBjbWRpbmZvLCBjbWRuYW1lLCBhbGlhcykKKyAgICAgICAgbWVtYmVycyA9IGNtZGluZm8uZWxlbS5maW5kYWxsKCcuLy9wYXJhbScpCisgICAgICAgICMgSXRlcmF0ZSBvdmVyIG1lbWJlcnMgb25jZSB0byBnZXQgbGVuZ3RoIHBhcmFtZXRlcnMgZm9yIGFycmF5cworICAgICAgICBsZW5zID0gc2V0KCkKKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5nZXRMZW4obWVtYmVyKQorICAgICAgICAgICAgaWYgbGVuZ3RoOgorICAgICAgICAgICAgICAgIGxlbnMuYWRkKGxlbmd0aCkKKyAgICAgICAgc3RydWN0X21lbWJlcl9kaWN0ID0gZGljdChzZWxmLnN0cnVjdE1lbWJlcnMpCisKKyAgICAgICAgIyBTZXQgY29tbWFuZCBpbnZhcmlhbnQgaW5mb3JtYXRpb24gbmVlZGVkIGF0IGEgcGVyIG1lbWJlciBsZXZlbCBpbiB2YWxpZGF0ZS4uLgorICAgICAgICBpc19jcmVhdGVfY29tbWFuZCA9IGFueShmaWx0ZXIobGFtYmRhIHBhdDogcGF0IGluIGNtZG5hbWUsICgnQ3JlYXRlJywgJ0FsbG9jYXRlJywgJ0VudW1lcmF0ZScsICdSZWdpc3RlckRldmljZUV2ZW50JywgJ1JlZ2lzdGVyRGlzcGxheUV2ZW50JykpKQorICAgICAgICBsYXN0X21lbWJlcl9pc19wb2ludGVyID0gbGVuKG1lbWJlcnMpIGFuZCBzZWxmLnBhcmFtSXNQb2ludGVyKG1lbWJlcnNbLTFdKQorICAgICAgICBpc2NyZWF0ZSA9IGlzX2NyZWF0ZV9jb21tYW5kIG9yICgndmtHZXQnIGluIGNtZG5hbWUgYW5kIGxhc3RfbWVtYmVyX2lzX3BvaW50ZXIpCisgICAgICAgIGlzZGVzdHJveSA9IGFueShbZGVzdHJveV90eHQgaW4gY21kbmFtZSBmb3IgZGVzdHJveV90eHQgaW4gWydEZXN0cm95JywgJ0ZyZWUnXV0pCisKKyAgICAgICAgIyBHZW5lcmF0ZSBtZW1iZXIgaW5mbworICAgICAgICBtZW1iZXJzSW5mbyA9IFtdCisgICAgICAgIGFsbG9jYXRvciA9ICdudWxscHRyJworICAgICAgICBmb3IgbWVtYmVyIGluIG1lbWJlcnM6CisgICAgICAgICAgICAjIEdldCB0eXBlIGFuZCBuYW1lIG9mIG1lbWJlcgorICAgICAgICAgICAgaW5mbyA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShtZW1iZXIpCisgICAgICAgICAgICB0eXBlID0gaW5mb1swXQorICAgICAgICAgICAgbmFtZSA9IGluZm9bMV0KKyAgICAgICAgICAgIGNkZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbChtZW1iZXIsIDApCisgICAgICAgICAgICAjIENoZWNrIGZvciBwYXJhbWV0ZXIgbmFtZSBpbiBsZW5zIHNldAorICAgICAgICAgICAgaXNjb3VudCA9IFRydWUgaWYgbmFtZSBpbiBsZW5zIGVsc2UgRmFsc2UKKyAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYuZ2V0TGVuKG1lbWJlcikKKyAgICAgICAgICAgIGlzY29uc3QgPSBUcnVlIGlmICdjb25zdCcgaW4gY2RlY2wgZWxzZSBGYWxzZQorICAgICAgICAgICAgIyBNYXJrIHBhcmFtIGFzIGxvY2FsIGlmIGl0IGlzIGFuIGFycmF5IG9mIG9iamVjdHMKKyAgICAgICAgICAgIGlzbG9jYWwgPSBGYWxzZTsKKyAgICAgICAgICAgIGlmIHR5cGUgaW4gc2VsZi5oYW5kbGVfdHlwZXM6CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCBpcyBub3QgTm9uZSkgYW5kIChpc2NvbnN0ID09IFRydWUpOgorICAgICAgICAgICAgICAgICAgICBpc2xvY2FsID0gVHJ1ZQorICAgICAgICAgICAgIyBPciBpZiBpdCdzIGEgc3RydWN0IHRoYXQgY29udGFpbnMgYW4gb2JqZWN0CisgICAgICAgICAgICBlbGlmIHR5cGUgaW4gc3RydWN0X21lbWJlcl9kaWN0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RydWN0X2NvbnRhaW5zX29iamVjdCh0eXBlKSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBpc2xvY2FsID0gVHJ1ZQorICAgICAgICAgICAgaWYgdHlwZSA9PSAnVmtBbGxvY2F0aW9uQ2FsbGJhY2tzJzoKKyAgICAgICAgICAgICAgICBhbGxvY2F0b3IgPSBuYW1lCisgICAgICAgICAgICBleHRzdHJ1Y3RzID0gbWVtYmVyLmF0dHJpYi5nZXQoJ3ZhbGlkZXh0ZW5zaW9uc3RydWN0cycpIGlmIG5hbWUgPT0gJ3BOZXh0JyBlbHNlIE5vbmUKKyAgICAgICAgICAgIG1lbWJlcnNJbmZvLmFwcGVuZChzZWxmLkNvbW1hbmRQYXJhbSh0eXBlPXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY29uc3Q9aXNjb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29wdGlvbmFsPXNlbGYucGFyYW1Jc09wdGlvbmFsKG1lbWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNjb3VudD1pc2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbj1sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0c3RydWN0cz1leHRzdHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkZWNsPWNkZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzbG9jYWw9aXNsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2NyZWF0ZT1pc2NyZWF0ZSkpCisKKyAgICAgICAgc2VsZi5jbWRfbGlzdC5hcHBlbmQoY21kbmFtZSkKKyAgICAgICAgc2VsZi5jbWRfaW5mb19kaWN0W2NtZG5hbWVdID1zZWxmLkNtZEluZm9EYXRhKG5hbWU9Y21kbmFtZSwgY21kaW5mbz1jbWRpbmZvLCBtZW1iZXJzPW1lbWJlcnNJbmZvLCBpc2NyZWF0ZT1pc2NyZWF0ZSwgaXNkZXN0cm95PWlzZGVzdHJveSwgYWxsb2NhdG9yPWFsbG9jYXRvciwgZXh0cmFfcHJvdGVjdD1zZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QsIGFsaWFzPWFsaWFzKQorICAgICMKKyAgICAjIENyZWF0ZSBjb2RlIENyZWF0ZSwgRGVzdHJveSwgYW5kIHZhbGlkYXRlIFZ1bGthbiBvYmplY3RzCisgICAgZGVmIFdyYXBDb21tYW5kcyhzZWxmKToKKyAgICAgICAgZm9yIGNtZG5hbWUgaW4gc2VsZi5jbWRfbGlzdDoKKyAgICAgICAgICAgIGNtZGRhdGEgPSBzZWxmLmNtZF9pbmZvX2RpY3RbY21kbmFtZV0KKyAgICAgICAgICAgIGNtZGluZm8gPSBjbWRkYXRhLmNtZGluZm8KKyAgICAgICAgICAgIGlmIGNtZG5hbWUgaW4gc2VsZi5pbnRlcmZhY2VfZnVuY3Rpb25zOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtYW51YWwgPSBGYWxzZQorICAgICAgICAgICAgaWYgY21kbmFtZSBpbiBzZWxmLm5vX2F1dG9nZW5fbGlzdDoKKyAgICAgICAgICAgICAgICBtYW51YWwgPSBUcnVlCisKKyAgICAgICAgICAgICMgR2VuZXJhdGUgb2JqZWN0IGhhbmRsaW5nIGNvZGUKKyAgICAgICAgICAgIChwcmVfY2FsbF92YWxpZGF0ZSwgcHJlX2NhbGxfcmVjb3JkLCBwb3N0X2NhbGxfcmVjb3JkKSA9IHNlbGYuZ2VuZXJhdGVfd3JhcHBpbmdfY29kZShjbWRpbmZvLmVsZW0pCisKKyAgICAgICAgICAgIGZlYXR1cmVfZXh0cmFfcHJvdGVjdCA9IGNtZGRhdGEuZXh0cmFfcHJvdGVjdAorICAgICAgICAgICAgaWYgKGZlYXR1cmVfZXh0cmFfcHJvdGVjdCBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJycpCisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJyNpZmRlZiAnKyBmZWF0dXJlX2V4dHJhX3Byb3RlY3QpCisgICAgICAgICAgICAgICAgc2VsZi5wcm90b3R5cGVzICs9IFsgJyNpZmRlZiAlcycgJSBmZWF0dXJlX2V4dHJhX3Byb3RlY3QgXQorCisgICAgICAgICAgICAjIEFkZCBpbnRlcmNlcHQgdG8gcHJvY21hcAorICAgICAgICAgICAgc2VsZi5wcm90b3R5cGVzICs9IFsgJyAgICB7IiVzIiwgKHZvaWQqKSVzfSwnICUgKGNtZG5hbWUsY21kbmFtZVsyOl0pIF0KKworICAgICAgICAgICAgZGVjbHMgPSBzZWxmLm1ha2VDRGVjbHMoY21kaW5mby5lbGVtKQorCisgICAgICAgICAgICAjIEdhdGhlciB0aGUgcGFyYW1ldGVyIGl0ZW1zCisgICAgICAgICAgICBwYXJhbXMgPSBjbWRpbmZvLmVsZW0uZmluZGFsbCgncGFyYW0vbmFtZScpCisgICAgICAgICAgICAjIFB1bGwgb3V0IHRoZSB0ZXh0IGZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXJzLCBzZXBhcmF0ZSB0aGVtIGJ5IGNvbW1hcyBpbiBhIGxpc3QKKyAgICAgICAgICAgIHBhcmFtc3RleHQgPSAnLCAnLmpvaW4oW3N0cihwYXJhbS50ZXh0KSBmb3IgcGFyYW0gaW4gcGFyYW1zXSkKKyAgICAgICAgICAgICMgR2VuZXJhdGUgdGhlIEFQSSBjYWxsIHRlbXBsYXRlCisgICAgICAgICAgICBmY25fY2FsbCA9IGNtZGluZm8uZWxlbS5hdHRyaWIuZ2V0KCduYW1lJykucmVwbGFjZSgndmsnLCAnVE9LRU4nLCAxKSArICcoJyArIHBhcmFtc3RleHQgKyAnKTsnCisKKyAgICAgICAgICAgIGZ1bmNfZGVjbF90ZW1wbGF0ZSA9IGRlY2xzWzBdWzotMV0uc3BsaXQoJ1ZLQVBJX0NBTEwgJykKKyAgICAgICAgICAgIGZ1bmNfZGVjbF90ZW1wbGF0ZSA9IGZ1bmNfZGVjbF90ZW1wbGF0ZVsxXQorCisgICAgICAgICAgICByZXN1bHRfdHlwZSA9IGNtZGluZm8uZWxlbS5maW5kKCdwcm90by90eXBlJykKKworICAgICAgICAgICAgaWYgJ29iamVjdF90cmFja2VyLmgnIGluIHNlbGYuZ2VuT3B0cy5maWxlbmFtZToKKyAgICAgICAgICAgICAgICAjIE91dHB1dCBQcmVDYWxsVmFsaWRhdGVBUEkgcHJvdG90eXBlIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmIHByZV9jYWxsX3ZhbGlkYXRlOgorICAgICAgICAgICAgICAgICAgICBwcmVfY3ZfZnVuY19kZWNsID0gJ2Jvb2wgUHJlQ2FsbFZhbGlkYXRlJyArIGZ1bmNfZGVjbF90ZW1wbGF0ZSArICcgY29uc3Q7JworICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCBwcmVfY3ZfZnVuY19kZWNsKQorCisgICAgICAgICAgICAgICAgIyBPdXRwdXQgUHJlQ2FsbFJlY29yZEFQSSBwcm90b3R5cGUgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgaWYgcHJlX2NhbGxfcmVjb3JkOgorICAgICAgICAgICAgICAgICAgICBwcmVfY3JfZnVuY19kZWNsID0gJ3ZvaWQgUHJlQ2FsbFJlY29yZCcgKyBmdW5jX2RlY2xfdGVtcGxhdGUgKyAnOycKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgcHJlX2NyX2Z1bmNfZGVjbCkKKworICAgICAgICAgICAgICAgICMgT3V0cHV0IFBvc0NhbGxSZWNvcmRBUEkgcHJvdG90eXBlIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmIHBvc3RfY2FsbF9yZWNvcmQ6CisgICAgICAgICAgICAgICAgICAgIHBvc3RfY3JfZnVuY19kZWNsID0gJ3ZvaWQgUG9zdENhbGxSZWNvcmQnICsgZnVuY19kZWNsX3RlbXBsYXRlICsgJzsnCisgICAgICAgICAgICAgICAgICAgIGlmIHJlc3VsdF90eXBlLnRleHQgPT0gJ1ZrUmVzdWx0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfY3JfZnVuY19kZWNsID0gcG9zdF9jcl9mdW5jX2RlY2wucmVwbGFjZSgnKScsICcsXG4gICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpJykKKyAgICAgICAgICAgICAgICAgICAgZWxpZiByZXN1bHRfdHlwZS50ZXh0ID09ICdWa0RldmljZUFkZHJlc3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9jcl9mdW5jX2RlY2wgPSBwb3N0X2NyX2Z1bmNfZGVjbC5yZXBsYWNlKCcpJywgJyxcbiAgICBWa0RldmljZUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCknKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCBwb3N0X2NyX2Z1bmNfZGVjbCkKKworICAgICAgICAgICAgaWYgJ29iamVjdF90cmFja2VyLmNwcCcgaW4gc2VsZi5nZW5PcHRzLmZpbGVuYW1lOgorICAgICAgICAgICAgICAgICMgT3V0cHV0IFByZUNhbGxWYWxpZGF0ZUFQSSBmdW5jdGlvbiBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICBpZiBwcmVfY2FsbF92YWxpZGF0ZSBhbmQgbm90IG1hbnVhbDoKKyAgICAgICAgICAgICAgICAgICAgcHJlX2N2X2Z1bmNfZGVjbCA9ICdib29sIE9iamVjdExpZmV0aW1lczo6UHJlQ2FsbFZhbGlkYXRlJyArIGZ1bmNfZGVjbF90ZW1wbGF0ZSArICcgY29uc3QgeycKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJycpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsIHByZV9jdl9mdW5jX2RlY2wpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgYm9vbCBza2lwID0gZmFsc2U7JykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgcHJlX2NhbGxfdmFsaWRhdGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcgICAgcmV0dXJuIHNraXA7JykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJ30nKQorCisgICAgICAgICAgICAgICAgIyBPdXRwdXQgUHJlQ2FsbFJlY29yZEFQSSBmdW5jdGlvbiBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICBpZiBwcmVfY2FsbF9yZWNvcmQgYW5kIG5vdCBtYW51YWw6CisgICAgICAgICAgICAgICAgICAgIHByZV9jcl9mdW5jX2RlY2wgPSAndm9pZCBPYmplY3RMaWZldGltZXM6OlByZUNhbGxSZWNvcmQnICsgZnVuY19kZWNsX3RlbXBsYXRlICsgJyB7JworICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgcHJlX2NyX2Z1bmNfZGVjbCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgcHJlX2NhbGxfcmVjb3JkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnfScpCisKKyAgICAgICAgICAgICAgICAjIE91dHB1dCBQb3NDYWxsUmVjb3JkQVBJIGZ1bmN0aW9uIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmIHBvc3RfY2FsbF9yZWNvcmQgYW5kIG5vdCBtYW51YWw6CisgICAgICAgICAgICAgICAgICAgIHBvc3RfY3JfZnVuY19kZWNsID0gJ3ZvaWQgT2JqZWN0TGlmZXRpbWVzOjpQb3N0Q2FsbFJlY29yZCcgKyBmdW5jX2RlY2xfdGVtcGxhdGUgKyAnIHsnCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcnKQorCisgICAgICAgICAgICAgICAgICAgIGlmIHJlc3VsdF90eXBlLnRleHQgPT0gJ1ZrUmVzdWx0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfY3JfZnVuY19kZWNsID0gcG9zdF9jcl9mdW5jX2RlY2wucmVwbGFjZSgnKScsICcsXG4gICAgVmtSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpJykKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHR3byBjcmVhdGVwaXBlbGluZXMgQVBJcyBtYXkgY3JlYXRlIG9uIGZhaWx1cmUgLS0gc2tpcCB0aGUgc3VjY2VzcyByZXN1bHQgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICdDcmVhdGVHcmFwaGljc1BpcGVsaW5lcycgbm90IGluIGNtZG5hbWUgYW5kICdDcmVhdGVDb21wdXRlUGlwZWxpbmVzJyBub3QgaW4gY21kbmFtZSBhbmQgJ0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXMnIG5vdCBpbiBjbWRuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfY3JfZnVuY19kZWNsID0gcG9zdF9jcl9mdW5jX2RlY2wucmVwbGFjZSgneycsICd7XG4gICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm47JykKKyAgICAgICAgICAgICAgICAgICAgZWxpZiByZXN1bHRfdHlwZS50ZXh0ID09ICdWa0RldmljZUFkZHJlc3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9jcl9mdW5jX2RlY2wgPSBwb3N0X2NyX2Z1bmNfZGVjbC5yZXBsYWNlKCcpJywgJyxcbiAgICBWa0RldmljZUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCknKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCBwb3N0X2NyX2Z1bmNfZGVjbCkKKworICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCBwb3N0X2NhbGxfcmVjb3JkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnfScpCisKKyAgICAgICAgICAgIGlmIChmZWF0dXJlX2V4dHJhX3Byb3RlY3QgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcjZW5kaWYgLy8gJysgZmVhdHVyZV9leHRyYV9wcm90ZWN0KQorICAgICAgICAgICAgICAgIHNlbGYucHJvdG90eXBlcyArPSBbICcjZW5kaWYnIF0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvcGFyYW1ldGVyX3ZhbGlkYXRpb25fZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9wYXJhbWV0ZXJfdmFsaWRhdGlvbl9nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODE2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvcGFyYW1ldGVyX3ZhbGlkYXRpb25fZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMTMwOCBAQAorIyEvdXNyL2Jpbi9weXRob24zIC1pCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogRHVzdGluIEdyYXZlcyA8ZHVzdGluQGx1bmFyZy5jb20+CisjIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorIyBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKworaW1wb3J0IG9zLHJlLHN5cyxzdHJpbmcsanNvbgoraW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBldHJlZQorZnJvbSBnZW5lcmF0b3IgaW1wb3J0ICoKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKK2Zyb20gY29tbW9uX2NvZGVnZW4gaW1wb3J0ICoKKworIyBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byB1c2UgYSBQeXRob24gMi43IGFuZCAzLnggY29tcGF0aWJsZSBzeW50YXguCitmcm9tIGlvIGltcG9ydCBvcGVuCisKKyMgUGFyYW1ldGVyVmFsaWRhdGlvbkdlbmVyYXRvck9wdGlvbnMgLSBzdWJjbGFzcyBvZiBHZW5lcmF0b3JPcHRpb25zLgorIworIyBBZGRzIG9wdGlvbnMgdXNlZCBieSBQYXJhbWV0ZXJWYWxpZGF0aW9uT3V0cHV0R2VuZXJhdG9yIG9iamVjdCBkdXJpbmcgUGFyYW1ldGVyIHZhbGlkYXRpb24gbGF5ZXIgZ2VuZXJhdGlvbi4KKyMKKyMgQWRkaXRpb25hbCBtZW1iZXJzCisjICAgcHJlZml4VGV4dCAtIGxpc3Qgb2Ygc3RyaW5ncyB0byBwcmVmaXggZ2VuZXJhdGVkIGhlYWRlciB3aXRoCisjICAgICAodXN1YWxseSBhIGNvcHlyaWdodCBzdGF0ZW1lbnQgKyBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm9zKS4KKyMgICBwcm90ZWN0RmlsZSAtIFRydWUgaWYgbXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gc2hvdWxkIGJlCisjICAgICBnZW5lcmF0ZWQgKGJhc2VkIG9uIHRoZSBmaWxlbmFtZSkgYXJvdW5kIHRoZSBlbnRpcmUgaGVhZGVyLgorIyAgIHByb3RlY3RGZWF0dXJlIC0gVHJ1ZSBpZiAjaWZuZGVmLi4jZW5kaWYgcHJvdGVjdGlvbiBzaG91bGQgYmUKKyMgICAgIGdlbmVyYXRlZCBhcm91bmQgYSBmZWF0dXJlIGludGVyZmFjZSBpbiB0aGUgaGVhZGVyIGZpbGUuCisjICAgZ2VuRnVuY1BvaW50ZXJzIC0gVHJ1ZSBpZiBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzIHNob3VsZCBiZQorIyAgICAgZ2VuZXJhdGVkCisjICAgcHJvdGVjdFByb3RvIC0gSWYgY29uZGl0aW9uYWwgcHJvdGVjdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkCisjICAgICBhcm91bmQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgc2V0IHRvIGVpdGhlciAnI2lmZGVmJworIyAgICAgdG8gcmVxdWlyZSBvcHQtaW4gKCNpZmRlZiBwcm90ZWN0UHJvdG9TdHIpIG9yICcjaWZuZGVmJworIyAgICAgdG8gcmVxdWlyZSBvcHQtb3V0ICgjaWZuZGVmIHByb3RlY3RQcm90b1N0cikuIE90aGVyd2lzZQorIyAgICAgc2V0IHRvIE5vbmUuCisjICAgcHJvdGVjdFByb3RvU3RyIC0gI2lmZGVmLyNpZm5kZWYgc3ltYm9sIHRvIHVzZSBhcm91bmQgcHJvdG90eXBlCisjICAgICBkZWNsYXJhdGlvbnMsIGlmIHByb3RlY3RQcm90byBpcyBzZXQKKyMgICBhcGljYWxsIC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHByZWZpeCwKKyMgICAgIHN1Y2ggYXMgQVBJQ0FMTCBvbiBXaW5kb3dzLgorIyAgIGFwaWVudHJ5IC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGNhbGxpbmcgY29udmVudGlvbiBtYWNybywKKyMgICAgIGluIHR5cGVkZWZzLCBzdWNoIGFzIEFQSUVOVFJZLgorIyAgIGFwaWVudHJ5cCAtIHN0cmluZyB0byB1c2UgZm9yIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbWFjcm8KKyMgICAgIGluIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMsIHN1Y2ggYXMgQVBJRU5UUllQLgorIyAgIGluZGVudEZ1bmNQcm90byAtIFRydWUgaWYgcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBzaG91bGQgcHV0IGVhY2gKKyMgICAgIHBhcmFtZXRlciBvbiBhIHNlcGFyYXRlIGxpbmUKKyMgICBpbmRlbnRGdW5jUG9pbnRlciAtIFRydWUgaWYgdHlwZWRlZmVkIGZ1bmN0aW9uIHBvaW50ZXJzIHNob3VsZCBwdXQgZWFjaAorIyAgICAgcGFyYW1ldGVyIG9uIGEgc2VwYXJhdGUgbGluZQorIyAgIGFsaWduRnVuY1BhcmFtIC0gaWYgbm9uemVybyBhbmQgcGFyYW1ldGVycyBhcmUgYmVpbmcgcHV0IG9uIGEKKyMgICAgIHNlcGFyYXRlIGxpbmUsIGFsaWduIHBhcmFtZXRlciBuYW1lcyBhdCB0aGUgc3BlY2lmaWVkIGNvbHVtbgorY2xhc3MgUGFyYW1ldGVyVmFsaWRhdGlvbkdlbmVyYXRvck9wdGlvbnMoR2VuZXJhdG9yT3B0aW9ucyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBOb25lLAorICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgPSAnLicsCisgICAgICAgICAgICAgICAgIGFwaW5hbWUgPSBOb25lLAorICAgICAgICAgICAgICAgICBwcm9maWxlID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgdmVyc2lvbnMgPSAnLionLAorICAgICAgICAgICAgICAgICBlbWl0dmVyc2lvbnMgPSAnLionLAorICAgICAgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICByZW1vdmVFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZW1pdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBzb3J0UHJvY2VkdXJlID0gcmVnU29ydEZlYXR1cmVzLAorICAgICAgICAgICAgICAgICBwcmVmaXhUZXh0ID0gIiIsCisgICAgICAgICAgICAgICAgIGFwaWNhbGwgPSAnJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnkgPSAnJywKKyAgICAgICAgICAgICAgICAgYXBpZW50cnlwID0gJycsCisgICAgICAgICAgICAgICAgIGluZGVudEZ1bmNQcm90byA9IFRydWUsCisgICAgICAgICAgICAgICAgIGluZGVudEZ1bmNQb2ludGVyID0gRmFsc2UsCisgICAgICAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICAgZXhwYW5kRW51bWVyYW50cyA9IFRydWUsCisgICAgICAgICAgICAgICAgIHZhbGlkX3VzYWdlX3BhdGggPSAnJyk6CisgICAgICAgIEdlbmVyYXRvck9wdGlvbnMuX19pbml0X18oc2VsZiwgY29udmVudGlvbnMsIGZpbGVuYW1lLCBkaXJlY3RvcnksIGFwaW5hbWUsIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMsIGVtaXR2ZXJzaW9ucywgZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucywgcmVtb3ZlRXh0ZW5zaW9ucywgZW1pdEV4dGVuc2lvbnMsIHNvcnRQcm9jZWR1cmUpCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gcHJlZml4VGV4dAorICAgICAgICBzZWxmLmFwaWNhbGwgICAgICAgICA9IGFwaWNhbGwKKyAgICAgICAgc2VsZi5hcGllbnRyeSAgICAgICAgPSBhcGllbnRyeQorICAgICAgICBzZWxmLmFwaWVudHJ5cCAgICAgICA9IGFwaWVudHJ5cAorICAgICAgICBzZWxmLmluZGVudEZ1bmNQcm90byA9IGluZGVudEZ1bmNQcm90bworICAgICAgICBzZWxmLmluZGVudEZ1bmNQb2ludGVyID0gaW5kZW50RnVuY1BvaW50ZXIKKyAgICAgICAgc2VsZi5hbGlnbkZ1bmNQYXJhbSAgPSBhbGlnbkZ1bmNQYXJhbQorICAgICAgICBzZWxmLmV4cGFuZEVudW1lcmFudHMgPSBleHBhbmRFbnVtZXJhbnRzCisgICAgICAgIHNlbGYudmFsaWRfdXNhZ2VfcGF0aCA9IHZhbGlkX3VzYWdlX3BhdGgKKworIyBQYXJhbWV0ZXJWYWxpZGF0aW9uT3V0cHV0R2VuZXJhdG9yIC0gc3ViY2xhc3Mgb2YgT3V0cHV0R2VuZXJhdG9yLgorIyBHZW5lcmF0ZXMgcGFyYW0gY2hlY2tlciBsYXllciBjb2RlLgorIworIyAtLS0tIG1ldGhvZHMgLS0tLQorIyBQYXJhbUNoZWNrZXJPdXRwdXRHZW5lcmF0b3IoZXJyRmlsZSwgd2FybkZpbGUsIGRpYWdGaWxlKSAtIGFyZ3MgYXMgZm9yCisjICAgT3V0cHV0R2VuZXJhdG9yLiBEZWZpbmVzIGFkZGl0aW9uYWwgaW50ZXJuYWwgc3RhdGUuCisjIC0tLS0gbWV0aG9kcyBvdmVycmlkaW5nIGJhc2UgY2xhc3MgLS0tLQorIyBiZWdpbkZpbGUoZ2VuT3B0cykKKyMgZW5kRmlsZSgpCisjIGJlZ2luRmVhdHVyZShpbnRlcmZhY2UsIGVtaXQpCisjIGVuZEZlYXR1cmUoKQorIyBnZW5UeXBlKHR5cGVpbmZvLG5hbWUpCisjIGdlblN0cnVjdCh0eXBlaW5mbyxuYW1lKQorIyBnZW5Hcm91cChncm91cGluZm8sbmFtZSkKKyMgZ2VuRW51bShlbnVtaW5mbywgbmFtZSkKKyMgZ2VuQ21kKGNtZGluZm8pCitjbGFzcyBQYXJhbWV0ZXJWYWxpZGF0aW9uT3V0cHV0R2VuZXJhdG9yKE91dHB1dEdlbmVyYXRvcik6CisgICAgIiIiR2VuZXJhdGUgUGFyYW1ldGVyIFZhbGlkYXRpb24gY29kZSBiYXNlZCBvbiBYTUwgZWxlbWVudCBhdHRyaWJ1dGVzIiIiCisgICAgIyBUaGlzIGlzIGFuIG9yZGVyZWQgbGlzdCBvZiBzZWN0aW9ucyBpbiB0aGUgaGVhZGVyIGZpbGUuCisgICAgQUxMX1NFQ1RJT05TID0gWydjb21tYW5kJ10KKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgZXJyRmlsZSA9IHN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgIHdhcm5GaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgZGlhZ0ZpbGUgPSBzeXMuc3Rkb3V0KToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkKKyAgICAgICAgc2VsZi5JTkRFTlRfU1BBQ0VTID0gNAorICAgICAgICBzZWxmLmRlY2xhcmF0aW9ucyA9IFtdCisKKyAgICAgICAgaW5saW5lX2N1c3RvbV9zb3VyY2VfcHJlYW1ibGUgPSAiIiIKKyIiIgorCisgICAgICAgICMgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYWRkaXRpb25hbCwgY3VzdG9tLXdyaXR0ZW4gY2hlY2tzIGluIHRoZSB1dGlscyBjcHAgZmlsZS4gQ29kZUdlbiB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIGEgY2FsbAorICAgICAgICAjIHRvIHRob3NlIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybSAnYm9vbCBtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQVBJTmFtZScsIHdoZXJlIHRoZSAndmsnIGlzIGRyb3BwZWQuCisgICAgICAgICMgc2VlICdtYW51YWxfUHJlQ2FsbFZhbGlkYXRlQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMnIGFzIGFuIGV4YW1wbGUuCisgICAgICAgIHNlbGYuZnVuY3Rpb25zX3dpdGhfbWFudWFsX2NoZWNrcyA9IFsKKyAgICAgICAgICAgICd2a0NyZWF0ZUluc3RhbmNlJywKKyAgICAgICAgICAgICd2a0NyZWF0ZURldmljZScsCisgICAgICAgICAgICAndmtDcmVhdGVRdWVyeVBvb2wnLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlUmVuZGVyUGFzcycsCisgICAgICAgICAgICAndmtDcmVhdGVSZW5kZXJQYXNzMktIUicsCisgICAgICAgICAgICAndmtDcmVhdGVCdWZmZXInLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlSW1hZ2UnLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMnLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcycsCisgICAgICAgICAgICAndmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYnLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlU2FtcGxlcicsCisgICAgICAgICAgICAndmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0JywKKyAgICAgICAgICAgICd2a0ZyZWVEZXNjcmlwdG9yU2V0cycsCisgICAgICAgICAgICAndmtVcGRhdGVEZXNjcmlwdG9yU2V0cycsCisgICAgICAgICAgICAndmtCZWdpbkNvbW1hbmRCdWZmZXInLAorICAgICAgICAgICAgJ3ZrQ21kU2V0Vmlld3BvcnQnLAorICAgICAgICAgICAgJ3ZrQ21kU2V0U2Npc3NvcicsCisgICAgICAgICAgICAndmtDbWRTZXRMaW5lV2lkdGgnLAorICAgICAgICAgICAgJ3ZrQ21kRHJhdycsCisgICAgICAgICAgICAndmtDbWREcmF3SW5kaXJlY3QnLAorICAgICAgICAgICAgJ3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCcsCisgICAgICAgICAgICAndmtDbWRDbGVhckF0dGFjaG1lbnRzJywKKyAgICAgICAgICAgICd2a0NtZENvcHlJbWFnZScsCisgICAgICAgICAgICAndmtDbWRCaW5kSW5kZXhCdWZmZXInLAorICAgICAgICAgICAgJ3ZrQ21kQmxpdEltYWdlJywKKyAgICAgICAgICAgICd2a0NtZENvcHlCdWZmZXJUb0ltYWdlJywKKyAgICAgICAgICAgICd2a0NtZENvcHlJbWFnZVRvQnVmZmVyJywKKyAgICAgICAgICAgICd2a0NtZFVwZGF0ZUJ1ZmZlcicsCisgICAgICAgICAgICAndmtDbWRGaWxsQnVmZmVyJywKKyAgICAgICAgICAgICd2a0NyZWF0ZVN3YXBjaGFpbktIUicsCisgICAgICAgICAgICAndmtRdWV1ZVByZXNlbnRLSFInLAorICAgICAgICAgICAgJ3ZrQ3JlYXRlRGVzY3JpcHRvclBvb2wnLAorICAgICAgICAgICAgJ3ZrQ21kRGlzcGF0Y2gnLAorICAgICAgICAgICAgJ3ZrQ21kRGlzcGF0Y2hJbmRpcmVjdCcsCisgICAgICAgICAgICAndmtDbWREaXNwYXRjaEJhc2VLSFInLAorICAgICAgICAgICAgJ3ZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WJywKKyAgICAgICAgICAgICd2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYnLAorICAgICAgICAgICAgJ3ZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVicsCisgICAgICAgICAgICAndmtDbWREcmF3TWVzaFRhc2tzTlYnLAorICAgICAgICAgICAgJ3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYnLAorICAgICAgICAgICAgJ3ZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0Q291bnROVicsCisgICAgICAgICAgICAndmtBbGxvY2F0ZU1lbW9yeScsCisgICAgICAgICAgICAndmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVicsCisgICAgICAgICAgICAndmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVicsCisgICAgICAgICAgICAndmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WJywKKyAgICAgICAgICAgICd2a0NyZWF0ZUZyYW1lYnVmZmVyJywKKyAgICAgICAgICAgICd2a0NtZFNldExpbmVTdGlwcGxlRVhUJywKKyAgICAgICAgICAgICd2a1NldERlYnVnVXRpbHNPYmplY3ROYW1lRVhUJywKKyAgICAgICAgICAgICd2a1NldERlYnVnVXRpbHNPYmplY3RUYWdFWFQnLAorICAgICAgICAgICAgJ3ZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WJywKKyAgICAgICAgICAgICd2a0FjcXVpcmVOZXh0SW1hZ2VLSFInLAorICAgICAgICAgICAgJ3ZrQWNxdWlyZU5leHRJbWFnZTJLSFInLAorICAgICAgICAgICAgXQorCisgICAgICAgICMgQ29tbWFuZHMgdG8gaWdub3JlCisgICAgICAgIHNlbGYuYmxhY2tsaXN0ID0gWworICAgICAgICAgICAgJ3ZrR2V0SW5zdGFuY2VQcm9jQWRkcicsCisgICAgICAgICAgICAndmtHZXREZXZpY2VQcm9jQWRkcicsCisgICAgICAgICAgICAndmtFbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24nLAorICAgICAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnLAorICAgICAgICAgICAgJ3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICd2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcycsCisgICAgICAgICAgICAndmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICd2a0dldERldmljZUdyb3VwU3VyZmFjZVByZXNlbnRNb2RlczJFWFQnCisgICAgICAgICAgICBdCisKKyAgICAgICAgIyBTdHJ1Y3R1cmUgZmllbGRzIHRvIGlnbm9yZQorICAgICAgICBzZWxmLnN0cnVjdE1lbWJlckJsYWNrbGlzdCA9IHsgJ1ZrV3JpdGVEZXNjcmlwdG9yU2V0JyA6IFsnZHN0U2V0J10gfQorICAgICAgICAjIFZhbGlkYXRpb24gY29uZGl0aW9ucyBmb3Igc29tZSBzcGVjaWFsIGNhc2Ugc3RydWN0IG1lbWJlcnMgdGhhdCBhcmUgY29uZGl0aW9uYWxseSB2YWxpZGF0ZWQKKyAgICAgICAgc2VsZi5zdHJ1Y3RNZW1iZXJWYWxpZGF0aW9uQ29uZGl0aW9ucyA9IHsgJ1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvJyA6IHsgJ2xvZ2ljT3AnIDogJ3t9bG9naWNPcEVuYWJsZSA9PSBWS19UUlVFJyB9IH0KKyAgICAgICAgIyBIZWFkZXIgdmVyc2lvbgorICAgICAgICBzZWxmLmhlYWRlclZlcnNpb24gPSBOb25lCisgICAgICAgICMgSW50ZXJuYWwgc3RhdGUgLSBhY2N1bXVsYXRvcnMgZm9yIGRpZmZlcmVudCBpbm5lciBibG9jayB0ZXh0CisgICAgICAgIHNlbGYudmFsaWRhdGlvbiA9IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUZXh0IGNvbXByaXNpbmcgdGhlIG1haW4gcGVyLWFwaSBwYXJhbWV0ZXIgdmFsaWRhdGlvbiByb3V0aW5lcworICAgICAgICBzZWxmLnN0eXBlcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVmFsdWVzIGZyb20gdGhlIFZrU3RydWN0dXJlVHlwZSBlbnVtZXJhdGlvbgorICAgICAgICBzZWxmLnN0cnVjdFR5cGVzID0gZGljdCgpICAgICAgICAgICAgICAgICAgICAgICAgICMgTWFwIG9mIFZ1bGthbiBzdHJ1Y3QgdHlwZW5hbWUgdG8gcmVxdWlyZWQgVmtTdHJ1Y3R1cmVUeXBlCisgICAgICAgIHNlbGYuaGFuZGxlVHlwZXMgPSBzZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTZXQgb2YgaGFuZGxlIHR5cGUgbmFtZXMKKyAgICAgICAgc2VsZi5jb21tYW5kcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIExpc3Qgb2YgQ29tbWFuZERhdGEgcmVjb3JkcyBmb3IgYWxsIFZ1bGthbiBjb21tYW5kcworICAgICAgICBzZWxmLnN0cnVjdE1lbWJlcnMgPSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTGlzdCBvZiBTdHJ1Y3RNZW1iZXJEYXRhIHJlY29yZHMgZm9yIGFsbCBWdWxrYW4gc3RydWN0cworICAgICAgICBzZWxmLnZhbGlkYXRlZFN0cnVjdHMgPSBkaWN0KCkgICAgICAgICAgICAgICAgICAgICMgTWFwIG9mIHN0cnVjdHMgdHlwZSBuYW1lcyB0byBnZW5lcmF0ZWQgdmFsaWRhdGlvbiBjb2RlIGZvciB0aGF0IHN0cnVjdCB0eXBlCisgICAgICAgIHNlbGYuZW51bVJhbmdlcyA9IGRpY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNYXAgb2YgZW51bSBuYW1lIHRvIEJFR0lOL0VORCByYW5nZSB2YWx1ZXMKKyAgICAgICAgc2VsZi5lbnVtVmFsdWVMaXN0cyA9ICcnICAgICAgICAgICAgICAgICAgICAgICAgICAjIFN0cmluZyBjb250YWluaW5nIGVudW1lcmF0ZWQgdHlwZSBtYXAgZGVmaW5pdGlvbnMKKyAgICAgICAgc2VsZi5mbGFncyA9IHNldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hcCBvZiBmbGFncyB0eXBlbmFtZXMKKyAgICAgICAgc2VsZi5mbGFnQml0cyA9IGRpY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hcCBvZiBmbGFnIGJpdHMgdHlwZW5hbWUgdG8gbGlzdCBvZiB2YWx1ZXMKKyAgICAgICAgc2VsZi5uZXdGbGFncyA9IHNldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hcCBvZiBmbGFncyB0eXBlbmFtZXMgL2RlZmluZWQgaW4gdGhlIGN1cnJlbnQgZmVhdHVyZS8KKyAgICAgICAgc2VsZi5yZXF1aXJlZF9leHRlbnNpb25zID0gZGljdCgpICAgICAgICAgICAgICAgICAjIERpY3Rpb25hcnkgb2YgcmVxdWlyZWQgZXh0ZW5zaW9ucyBmb3IgZWFjaCBpdGVtIGluIHRoZSBjdXJyZW50IGV4dGVuc2lvbgorICAgICAgICBzZWxmLmV4dGVuc2lvbl90eXBlID0gJycgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHlwZSBvZiBhY3RpdmUgZmVhdHVyZSAoZXh0ZW5zaW9uKSwgZGV2aWNlIG9yIGluc3RhbmNlCisgICAgICAgIHNlbGYuZXh0ZW5zaW9uX25hbWVzID0gZGljdCgpICAgICAgICAgICAgICAgICAgICAgIyBEaWN0aW9uYXJ5IG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gbmFtZSBkZWZpbmVzCisgICAgICAgIHNlbGYuc3RydWN0ZXh0ZW5kc19saXN0ID0gW10gICAgICAgICAgICAgICAgICAgICAgIyBMaXN0IG9mIGV4dGVuc2lvbnMgd2hpY2ggZXh0ZW5kIGFub3RoZXIgc3RydWN0CisgICAgICAgIHNlbGYuc3RydWN0X2ZlYXR1cmVfcHJvdGVjdCA9IGRpY3QoKSAgICAgICAgICAgICAgIyBEaWN0aW9uYXJ5IG9mIHN0cnVjdG5hbWVzIGFuZCBGZWF0dXJlRXh0cmFQcm90ZWN0IHN0cmluZ3MKKyAgICAgICAgc2VsZi52YWxpZF92dWlkcyA9IHNldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCBvZiBhbGwgdmFsaWQgVlVJRHMKKyAgICAgICAgc2VsZi52dWlkX2RpY3QgPSBkaWN0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFZVSUQgZGljdGlvbmFyeSAoZnJvbSBKU09OKQorICAgICAgICBzZWxmLmFsaWFzX2RpY3QgPSBkaWN0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICMgRGljdCBvZiBjbWR8c3RydWN0IGFsaWFzZXMKKyAgICAgICAgc2VsZi5oZWFkZXJfZmlsZSA9IEZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAjIEhlYWRlciBmaWxlIGdlbmVyYXRpb24gZmxhZworICAgICAgICBzZWxmLnNvdXJjZV9maWxlID0gRmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICMgU291cmNlIGZpbGUgZ2VuZXJhdGlvbiBmbGFnCisgICAgICAgIHNlbGYucmV0dXJuZWRvbmx5X3N0cnVjdHMgPSBbXQorICAgICAgICAjIE5hbWVkIHR1cGxlcyB0byBzdG9yZSBzdHJ1Y3QgYW5kIGNvbW1hbmQgZGF0YQorICAgICAgICBzZWxmLkNvbW1hbmRQYXJhbSA9IG5hbWVkdHVwbGUoJ0NvbW1hbmRQYXJhbScsIFsndHlwZScsICduYW1lJywgJ2lzcG9pbnRlcicsICdpc3N0YXRpY2FycmF5JywgJ2lzYm9vbCcsICdpc3JhbmdlZGVudW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNjb25zdCcsICdpc29wdGlvbmFsJywgJ2lzY291bnQnLCAnbm9hdXRvdmFsaWRpdHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVuJywgJ2V4dHN0cnVjdHMnLCAnY29uZGl0aW9uJywgJ2NkZWNsJ10pCisgICAgICAgIHNlbGYuQ29tbWFuZERhdGEgPSBuYW1lZHR1cGxlKCdDb21tYW5kRGF0YScsIFsnbmFtZScsICdwYXJhbXMnLCAnY2RlY2wnLCAnZXh0ZW5zaW9uX3R5cGUnLCAncmVzdWx0J10pCisgICAgICAgIHNlbGYuU3RydWN0TWVtYmVyRGF0YSA9IG5hbWVkdHVwbGUoJ1N0cnVjdE1lbWJlckRhdGEnLCBbJ25hbWUnLCAnbWVtYmVycyddKQorCisgICAgIworICAgICMgR2VuZXJhdGUgQ29weXJpZ2h0IGNvbW1lbnQgYmxvY2sgZm9yIGZpbGUKKyAgICBkZWYgR2VuZXJhdGVDb3B5cmlnaHQoc2VsZik6CisgICAgICAgIGNvcHlyaWdodCAgPSAnLyogKioqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCEgKioqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogU2VlIHBhcmFtZXRlcl92YWxpZGF0aW9uX2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9uc1xuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE5IEdvb2dsZSBJbmMuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICpcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTtcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4nCisgICAgICAgIGNvcHlyaWdodCArPSAnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgVmFsdmUgQ29ycG9yYXRpb25cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLFxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbicKKyAgICAgICAgY29weXJpZ2h0ICs9ICcgKlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BMdW5hckcuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBMdW5hckcuY29tPlxuJworICAgICAgICBjb3B5cmlnaHQgKz0gJyAqL1xuXG4nCisgICAgICAgIHJldHVybiBjb3B5cmlnaHQKKyAgICAjCisgICAgIyBJbmNyZWFzZXMgdGhlIGdsb2JhbCBpbmRlbnQgdmFyaWFibGUKKyAgICBkZWYgaW5jSW5kZW50KHNlbGYsIGluZGVudCk6CisgICAgICAgIGluYyA9ICcgJyAqIHNlbGYuSU5ERU5UX1NQQUNFUworICAgICAgICBpZiBpbmRlbnQ6CisgICAgICAgICAgICByZXR1cm4gaW5kZW50ICsgaW5jCisgICAgICAgIHJldHVybiBpbmMKKyAgICAjCisgICAgIyBEZWNyZWFzZXMgdGhlIGdsb2JhbCBpbmRlbnQgdmFyaWFibGUKKyAgICBkZWYgZGVjSW5kZW50KHNlbGYsIGluZGVudCk6CisgICAgICAgIGlmIGluZGVudCBhbmQgKGxlbihpbmRlbnQpID4gc2VsZi5JTkRFTlRfU1BBQ0VTKToKKyAgICAgICAgICAgIHJldHVybiBpbmRlbnRbOi1zZWxmLklOREVOVF9TUEFDRVNdCisgICAgICAgIHJldHVybiAnJworICAgICMKKyAgICAjIFdhbGsgdGhlIEpTT04tZGVyaXZlZCBkaWN0IGFuZCBmaW5kIGFsbCAidnVpZCIga2V5IHZhbHVlcworICAgIGRlZiBFeHRyYWN0VlVJRHMoc2VsZiwgZCk6CisgICAgICAgIGlmIGhhc2F0dHIoZCwgJ2l0ZW1zJyk6CisgICAgICAgICAgICBmb3IgaywgdiBpbiBkLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgayA9PSAidnVpZCI6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHYKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodiwgZGljdCk6CisgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIHNlbGYuRXh0cmFjdFZVSURzKHYpOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcworICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSAodiwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIGZvciBsIGluIHY6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBzZWxmLkV4dHJhY3RWVUlEcyhsKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzCisgICAgIworICAgICMgQ2FsbGVkIGF0IGZpbGUgY3JlYXRpb24gdGltZQorICAgIGRlZiBiZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cykKKyAgICAgICAgc2VsZi5oZWFkZXJfZmlsZSA9IChnZW5PcHRzLmZpbGVuYW1lID09ICdwYXJhbWV0ZXJfdmFsaWRhdGlvbi5oJykKKyAgICAgICAgc2VsZi5zb3VyY2VfZmlsZSA9IChnZW5PcHRzLmZpbGVuYW1lID09ICdwYXJhbWV0ZXJfdmFsaWRhdGlvbi5jcHAnKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmhlYWRlcl9maWxlIGFuZCBub3Qgc2VsZi5zb3VyY2VfZmlsZToKKyAgICAgICAgICAgIHByaW50KCJFcnJvcjogT3V0cHV0IEZpbGVuYW1lcyBoYXZlIGNoYW5nZWQsIHVwZGF0ZSBnZW5lcmF0b3Igc291cmNlLlxuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICAgICAgaWYgc2VsZi5zb3VyY2VfZmlsZSBvciBzZWxmLmhlYWRlcl9maWxlOgorICAgICAgICAgICAgIyBPdXRwdXQgQ29weXJpZ2h0IHRleHQKKyAgICAgICAgICAgIHMgPSBzZWxmLkdlbmVyYXRlQ29weXJpZ2h0KCkKKyAgICAgICAgICAgIHdyaXRlKHMsIGZpbGU9c2VsZi5vdXRGaWxlKQorCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2ZpbGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEJ1aWxkIG1hcCBvZiBzdHJ1Y3R1cmUgdHlwZSBuYW1lcyB0byBWa1N0cnVjdHVyZVR5cGUgZW51bSB2YWx1ZXMKKyAgICAgICAgIyBGaW5kIGFsbCB0eXBlcyBvZiBjYXRlZ29yeSAic3RydWN0IgorICAgICAgICBmb3Igc3RydWN0IGluIHNlbGYucmVnaXN0cnkudHJlZS5pdGVyZmluZCgndHlwZXMvdHlwZVtAY2F0ZWdvcnk9InN0cnVjdCJdJyk6CisgICAgICAgICAgICAjIENoZWNrIGlmIHN0cnVjdCBoYXMgbWVtYmVyIG5hbWVkICJzVHlwZSIgb2YgdHlwZSAiVmtTdHJ1Y3R1cmVUeXBlIiB3aGljaCBoYXMgdmFsdWVzIGRlZmluZWQKKyAgICAgICAgICAgIHN0eXBlID0gc3RydWN0LmZpbmQoJ21lbWJlcltuYW1lPSJzVHlwZSJdW3R5cGU9IlZrU3RydWN0dXJlVHlwZSJdW0B2YWx1ZXNdJykKKyAgICAgICAgICAgIGlmIHN0eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgU3RvcmUgVmtTdHJ1Y3R1cmVUeXBlIHZhbHVlIGZvciB0aGlzIHR5cGUKKyAgICAgICAgICAgICAgICBzZWxmLnN0cnVjdFR5cGVzW3N0cnVjdC5nZXQoJ25hbWUnKV0gPSBzdHlwZS5nZXQoJ3ZhbHVlcycpCisKKyAgICAgICAgc2VsZi52YWxpZF91c2FnZV9wYXRoID0gZ2VuT3B0cy52YWxpZF91c2FnZV9wYXRoCisgICAgICAgIHZ1X2pzb25fZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi52YWxpZF91c2FnZV9wYXRoICsgb3Muc2VwLCAndmFsaWR1c2FnZS5qc29uJykKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUodnVfanNvbl9maWxlbmFtZSk6CisgICAgICAgICAgICBqc29uX2ZpbGUgPSBvcGVuKHZ1X2pzb25fZmlsZW5hbWUsICdyJykKKyAgICAgICAgICAgIHNlbGYudnVpZF9kaWN0ID0ganNvbi5sb2FkKGpzb25fZmlsZSkKKyAgICAgICAgICAgIGpzb25fZmlsZS5jbG9zZSgpCisgICAgICAgIGlmIGxlbihzZWxmLnZ1aWRfZGljdCkgPT0gMDoKKyAgICAgICAgICAgIHByaW50KCJFcnJvcjogQ291bGQgbm90IGZpbmQsIG9yIGVycm9yIGxvYWRpbmcgJXMvdmFsaWR1c2FnZS5qc29uXG4iLCB2dV9qc29uX2ZpbGVuYW1lKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgIworICAgICAgICAjIEJ1aWxkIGEgc2V0IG9mIGFsbCB2dWlkIHRleHQgc3RyaW5ncyBmb3VuZCBpbiB2YWxpZHVzYWdlLmpzb24KKyAgICAgICAgZm9yIGpzb25fdnVpZF9zdHJpbmcgaW4gc2VsZi5FeHRyYWN0VlVJRHMoc2VsZi52dWlkX2RpY3QpOgorICAgICAgICAgICAgc2VsZi52YWxpZF92dWlkcy5hZGQoanNvbl92dWlkX3N0cmluZykKKyAgICAgICAgIworICAgICAgICAjIEhlYWRlcnMKKyAgICAgICAgd3JpdGUoJyNpbmNsdWRlICJjaGFzc2lzLmgiJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgIHdyaXRlKCcjaW5jbHVkZSAic3RhdGVsZXNzX3ZhbGlkYXRpb24uaCInLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAjCisgICAgIyBDYWxsZWQgYXQgZW5kLXRpbWUgZm9yIGZpbmFsIGNvbnRlbnQgb3V0cHV0CisgICAgZGVmIGVuZEZpbGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc291cmNlX2ZpbGU6CisgICAgICAgICAgICAjIEMtc3BlY2lmaWMKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICB3cml0ZShzZWxmLmVudW1WYWx1ZUxpc3RzLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisKKyAgICAgICAgICAgIHBuZXh0X2hhbmRsZXIgID0gJ2Jvb2wgU3RhdGVsZXNzVmFsaWRhdGlvbjo6VmFsaWRhdGVQbmV4dFN0cnVjdENvbnRlbnRzKGNvbnN0IGNoYXIgKmFwaV9uYW1lLCBjb25zdCBQYXJhbWV0ZXJOYW1lICZwYXJhbWV0ZXJfbmFtZSwgY29uc3QgVmtCYXNlT3V0U3RydWN0dXJlKiBoZWFkZXIpIGNvbnN0IHtcbicKKyAgICAgICAgICAgIHBuZXh0X2hhbmRsZXIgKz0gJyAgICBib29sIHNraXAgPSBmYWxzZTtcbicKKyAgICAgICAgICAgIHBuZXh0X2hhbmRsZXIgKz0gJyAgICBzd2l0Y2goaGVhZGVyLT5zVHlwZSkge1xuJworCisgICAgICAgICAgICAjIERvIHNvbWUgcHJvY2Vzc2luZyBoZXJlIHRvIGV4dHJhY3QgZGF0YSBmcm9tIHZhbGlkYXRlZHN0cnVjdHMuLi4KKyAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuc3RydWN0ZXh0ZW5kc19saXN0OgorICAgICAgICAgICAgICAgIHBvc3RQcm9jU3BlYyA9IHt9CisgICAgICAgICAgICAgICAgcG9zdFByb2NTcGVjWydwcHAnXSA9ICcnIGlmIG5vdCBpdGVtIGVsc2UgJ3twb3N0UHJvY1ByZWZpeH0nCisgICAgICAgICAgICAgICAgcG9zdFByb2NTcGVjWydwcHMnXSA9ICcnIGlmIG5vdCBpdGVtIGVsc2UgJ3twb3N0UHJvY1N1ZmZpeH0nCisgICAgICAgICAgICAgICAgcG9zdFByb2NTcGVjWydwcGknXSA9ICcnIGlmIG5vdCBpdGVtIGVsc2UgJ3twb3N0UHJvY0luc2VydH0nCisKKyAgICAgICAgICAgICAgICBwbmV4dF9jYXNlID0gJ1xuJworICAgICAgICAgICAgICAgIHByb3RlY3QgPSAnJworICAgICAgICAgICAgICAgICMgR3VhcmQgc3RydWN0IGNhc2VzIHdpdGggZmVhdHVyZSBpZmRlZnMsIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmIGl0ZW0gaW4gc2VsZi5zdHJ1Y3RfZmVhdHVyZV9wcm90ZWN0LmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdCA9IHNlbGYuc3RydWN0X2ZlYXR1cmVfcHJvdGVjdFtpdGVtXQorICAgICAgICAgICAgICAgICAgICBwbmV4dF9jYXNlICs9ICcjaWZkZWYgJXNcbicgJSBwcm90ZWN0CisgICAgICAgICAgICAgICAgcG5leHRfY2FzZSArPSAnICAgICAgICAvLyBWYWxpZGF0aW9uIGNvZGUgZm9yICVzIHN0cnVjdHVyZSBtZW1iZXJzXG4nICUgaXRlbQorICAgICAgICAgICAgICAgIHBuZXh0X2Nhc2UgKz0gJyAgICAgICAgY2FzZSAlczoge1xuJyAlIHNlbGYuc3RydWN0VHlwZXNbaXRlbV0KKyAgICAgICAgICAgICAgICBwbmV4dF9jYXNlICs9ICcgICAgICAgICAgICAlcyAqc3RydWN0dXJlID0gKCVzICopIGhlYWRlcjtcbicgJSAoaXRlbSwgaXRlbSkKKyAgICAgICAgICAgICAgICBleHByID0gc2VsZi5leHBhbmRTdHJ1Y3RDb2RlKGl0ZW0sIGl0ZW0sICdzdHJ1Y3R1cmUtPicsICcnLCAnICAgICAgICAgICAgJywgW10sIHBvc3RQcm9jU3BlYykKKyAgICAgICAgICAgICAgICBzdHJ1Y3RfdmFsaWRhdGlvbl9zb3VyY2UgPSBzZWxmLlNjcnViU3RydWN0Q29kZShleHByKQorICAgICAgICAgICAgICAgIHBuZXh0X2Nhc2UgKz0gJyVzJyAlIHN0cnVjdF92YWxpZGF0aW9uX3NvdXJjZQorICAgICAgICAgICAgICAgIHBuZXh0X2Nhc2UgKz0gJyAgICAgICAgfSBicmVhaztcbicKKyAgICAgICAgICAgICAgICBpZiBwcm90ZWN0OgorICAgICAgICAgICAgICAgICAgICBwbmV4dF9jYXNlICs9ICcjZW5kaWYgLy8gJXNcbicgJSBwcm90ZWN0CisgICAgICAgICAgICAgICAgIyBTa2lwIGZ1bmN0aW9ucyBjb250YWluaW5nIG5vIHZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICBpZiBzdHJ1Y3RfdmFsaWRhdGlvbl9zb3VyY2U6CisgICAgICAgICAgICAgICAgICAgIHBuZXh0X2hhbmRsZXIgKz0gcG5leHRfY2FzZTsKKyAgICAgICAgICAgIHBuZXh0X2hhbmRsZXIgKz0gJyAgICAgICAgZGVmYXVsdDpcbicKKyAgICAgICAgICAgIHBuZXh0X2hhbmRsZXIgKz0gJyAgICAgICAgICAgIHNraXAgPSBmYWxzZTtcbicKKyAgICAgICAgICAgIHBuZXh0X2hhbmRsZXIgKz0gJyAgICB9XG4nCisgICAgICAgICAgICBwbmV4dF9oYW5kbGVyICs9ICcgICAgcmV0dXJuIHNraXA7XG4nCisgICAgICAgICAgICBwbmV4dF9oYW5kbGVyICs9ICd9XG4nCisgICAgICAgICAgICB3cml0ZShwbmV4dF9oYW5kbGVyLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisKKyAgICAgICAgICAgIGV4dF90ZW1wbGF0ZSAgPSAnYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpPdXRwdXRFeHRlbnNpb25FcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmYXBpX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nICZleHRlbnNpb25fbmFtZSkgY29uc3Qge1xuJworICAgICAgICAgICAgZXh0X3RlbXBsYXRlICs9ICcgICAgcmV0dXJuIGxvZ19tc2cocmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQsIDAsXG4nCisgICAgICAgICAgICBleHRfdGVtcGxhdGUgKz0gJyAgICAgICAgICAgICAgICAgICBrVlVJRF9QVkVycm9yX0V4dGVuc2lvbk5vdEVuYWJsZWQsICJBdHRlbXBlZCB0byBjYWxsICVzKCkgYnV0IGl0cyByZXF1aXJlZCBleHRlbnNpb24gJXMgaGFzIG5vdCBiZWVuIGVuYWJsZWRcXG4iLFxuJworICAgICAgICAgICAgZXh0X3RlbXBsYXRlICs9ICcgICAgICAgICAgICAgICAgICAgYXBpX25hbWUuY19zdHIoKSwgZXh0ZW5zaW9uX25hbWUuY19zdHIoKSk7XG4nCisgICAgICAgICAgICBleHRfdGVtcGxhdGUgKz0gJ31cbicKKyAgICAgICAgICAgIHdyaXRlKGV4dF90ZW1wbGF0ZSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgY29tbWFuZHNfdGV4dCA9ICdcbicuam9pbihzZWxmLnZhbGlkYXRpb24pCisgICAgICAgICAgICB3cml0ZShjb21tYW5kc190ZXh0LCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2ZpbGU6CisgICAgICAgICAgICAjIE91dHB1dCBkZWNsYXJhdGlvbnMgYW5kIHJlY29yZCBpbnRlcmNlcHRlZCBwcm9jZWR1cmVzCisgICAgICAgICAgICB3cml0ZSgnXG4nLmpvaW4oc2VsZi5kZWNsYXJhdGlvbnMpLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmVuZEZpbGUoc2VsZikKKyAgICAjCisgICAgIyBQcm9jZXNzaW5nIGF0IGJlZ2lubmluZyBvZiBlYWNoIGZlYXR1cmUgb3IgZXh0ZW5zaW9uCisgICAgZGVmIGJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpOgorICAgICAgICAjIFN0YXJ0IHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuYmVnaW5GZWF0dXJlKHNlbGYsIGludGVyZmFjZSwgZW1pdCkKKyAgICAgICAgIyBDLXNwZWNpZmljCisgICAgICAgICMgQWNjdW11bGF0ZSBpbmNsdWRlcywgZGVmaW5lcywgdHlwZXMsIGVudW1zLCBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzLCBlbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBzZXBhcmF0ZWx5IGZvciB0aGlzCisgICAgICAgICMgZmVhdHVyZS4gVGhleSdyZSBvbmx5IHByaW50ZWQgaW4gZW5kRmVhdHVyZSgpLgorICAgICAgICBzZWxmLmhlYWRlclZlcnNpb24gPSBOb25lCisgICAgICAgIHNlbGYuc3R5cGVzID0gW10KKyAgICAgICAgc2VsZi5jb21tYW5kcyA9IFtdCisgICAgICAgIHNlbGYuc3RydWN0TWVtYmVycyA9IFtdCisgICAgICAgIHNlbGYubmV3RmxhZ3MgPSBzZXQoKQorICAgICAgICBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgPSBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpCisgICAgICAgICMgR2V0IGJhc2UgbGlzdCBvZiBleHRlbnNpb24gZGVwZW5kZW5jaWVzIGZvciBhbGwgaXRlbXMgaW4gdGhpcyBleHRlbnNpb24KKyAgICAgICAgYmFzZV9yZXF1aXJlZF9leHRlbnNpb25zID0gW10KKyAgICAgICAgaWYgIlZLX1ZFUlNJT05fMSIgbm90IGluIHNlbGYuZmVhdHVyZU5hbWU6CisgICAgICAgICAgICAjIFNhdmUgTmFtZSBEZWZpbmUgdG8gZ2V0IGNvcnJlY3QgZW5hYmxlIG5hbWUgbGF0ZXIKKyAgICAgICAgICAgIG5hbWVFbGVtID0gaW50ZXJmYWNlWzBdWzFdCisgICAgICAgICAgICBuYW1lID0gbmFtZUVsZW0uZ2V0KCduYW1lJykKKyAgICAgICAgICAgIHNlbGYuZXh0ZW5zaW9uX25hbWVzW3NlbGYuZmVhdHVyZU5hbWVdID0gbmFtZQorICAgICAgICAgICAgIyBUaGlzIGV4dGVuc2lvbiBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21tYW5kCisgICAgICAgICAgICBiYXNlX3JlcXVpcmVkX2V4dGVuc2lvbnMuYXBwZW5kKHNlbGYuZmVhdHVyZU5hbWUpCisgICAgICAgICMgQWRkIGFueSBkZWZpbmVkIGV4dGVuc2lvbiBkZXBlbmRlbmNpZXMgdG8gdGhlIGJhc2UgZGVwZW5kZW5jeSBsaXN0IGZvciB0aGlzIGV4dGVuc2lvbgorICAgICAgICByZXF1aXJlcyA9IGludGVyZmFjZS5nZXQoJ3JlcXVpcmVzJykKKyAgICAgICAgaWYgcmVxdWlyZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBiYXNlX3JlcXVpcmVkX2V4dGVuc2lvbnMuZXh0ZW5kKHJlcXVpcmVzLnNwbGl0KCcsJykpCisgICAgICAgICMgQnVpbGQgZGljdGlvbmFyeSBvZiBleHRlbnNpb24gZGVwZW5kZW5jaWVzIGZvciBlYWNoIGl0ZW0gaW4gdGhpcyBleHRlbnNpb24KKyAgICAgICAgc2VsZi5yZXF1aXJlZF9leHRlbnNpb25zID0gZGljdCgpCisgICAgICAgIGZvciByZXF1aXJlX2VsZW1lbnQgaW4gaW50ZXJmYWNlLmZpbmRhbGwoJ3JlcXVpcmUnKToKKyAgICAgICAgICAgICMgQ29weSBiYXNlIGV4dGVuc2lvbiBkZXBlbmRlbmN5IGxpc3QKKyAgICAgICAgICAgIHJlcXVpcmVkX2V4dGVuc2lvbnMgPSBsaXN0KGJhc2VfcmVxdWlyZWRfZXh0ZW5zaW9ucykKKyAgICAgICAgICAgICMgQWRkIGFueSBhZGRpdGlvbmFsIGV4dGVuc2lvbiBkZXBlbmRlbmNpZXMgc3BlY2lmaWVkIGluIHRoaXMgcmVxdWlyZSBibG9jaworICAgICAgICAgICAgYWRkaXRpb25hbF9leHRlbnNpb25zID0gcmVxdWlyZV9lbGVtZW50LmdldCgnZXh0ZW5zaW9uJykKKyAgICAgICAgICAgIGlmIGFkZGl0aW9uYWxfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICByZXF1aXJlZF9leHRlbnNpb25zLmV4dGVuZChhZGRpdGlvbmFsX2V4dGVuc2lvbnMuc3BsaXQoJywnKSkKKyAgICAgICAgICAgICMgU2F2ZSBmdWxsIGV4dGVuc2lvbiBsaXN0IGZvciBhbGwgbmFtZWQgaXRlbXMKKyAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHJlcXVpcmVfZWxlbWVudC5maW5kYWxsKCcqW0BuYW1lXScpOgorICAgICAgICAgICAgICAgIHNlbGYucmVxdWlyZWRfZXh0ZW5zaW9uc1tlbGVtZW50LmdldCgnbmFtZScpXSA9IHJlcXVpcmVkX2V4dGVuc2lvbnMKKworICAgICAgICAjIEFuZCBub3RlIGlmIHRoaXMgaXMgYW4gSW5zdGFuY2Ugb3IgRGV2aWNlIGV4dGVuc2lvbgorICAgICAgICBzZWxmLmV4dGVuc2lvbl90eXBlID0gaW50ZXJmYWNlLmdldCgndHlwZScpCisgICAgIworICAgICMgQ2FsbGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBleHRlbnNpb24gKGZlYXR1cmUpCisgICAgZGVmIGVuZEZlYXR1cmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2ZpbGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBDLXNwZWNpZmljCisgICAgICAgICMgQWN0dWFsbHkgd3JpdGUgdGhlIGludGVyZmFjZSB0byB0aGUgb3V0cHV0IGZpbGUuCisgICAgICAgIGlmIChzZWxmLmVtaXQpOgorICAgICAgICAgICAgIyBJZiB0eXBlIGRlY2xhcmF0aW9ucyBhcmUgbmVlZGVkIGJ5IG90aGVyIGZlYXR1cmVzIGJhc2VkIG9uIHRoaXMgb25lLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHN1cHByZXNzIHRoZSBFeHRyYVByb3RlY3QsCisgICAgICAgICAgICAjIG9yIG1vdmUgaXQgYmVsb3cgdGhlICdmb3Igc2VjdGlvbi4uLicgbG9vcC4KKyAgICAgICAgICAgIGlmZGVmID0gJycKKyAgICAgICAgICAgIGlmIChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgICAgIGlmZGVmID0gJyNpZmRlZiAlc1xuJyAlIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdAorICAgICAgICAgICAgICAgIHNlbGYudmFsaWRhdGlvbi5hcHBlbmQoaWZkZWYpCisgICAgICAgICAgICAjIEdlbmVyYXRlIHRoZSBzdHJ1Y3QgbWVtYmVyIGNoZWNraW5nIGNvZGUgZnJvbSB0aGUgY2FwdHVyZWQgZGF0YQorICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RydWN0TWVtYmVyRGF0YSgpCisgICAgICAgICAgICAjIEdlbmVyYXRlIHRoZSBjb21tYW5kIHBhcmFtZXRlciBjaGVja2luZyBjb2RlIGZyb20gdGhlIGNhcHR1cmVkIGRhdGEKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc0NtZERhdGEoKQorICAgICAgICAgICAgIyBXcml0ZSB0aGUgZGVjbGFyYXRpb24gZm9yIHRoZSBIZWFkZXJWZXJzaW9uCisgICAgICAgICAgICBpZiBzZWxmLmhlYWRlclZlcnNpb246CisgICAgICAgICAgICAgICAgd3JpdGUoJ2NvbnN0IHVpbnQzMl90IEdlbmVyYXRlZFZ1bGthbkhlYWRlclZlcnNpb24gPSB7fTsnLmZvcm1hdChzZWxmLmhlYWRlclZlcnNpb24pLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgIyBXcml0ZSB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgVmtGbGFncyB2YWx1ZXMgY29tYmluaW5nIGFsbCBmbGFnIGJpdHMKKyAgICAgICAgICAgIGZvciBmbGFnIGluIHNvcnRlZChzZWxmLm5ld0ZsYWdzKToKKyAgICAgICAgICAgICAgICBmbGFnQml0cyA9IGZsYWcucmVwbGFjZSgnRmxhZ3MnLCAnRmxhZ0JpdHMnKQorICAgICAgICAgICAgICAgIGlmIGZsYWdCaXRzIGluIHNlbGYuZmxhZ0JpdHM6CisgICAgICAgICAgICAgICAgICAgIGJpdHMgPSBzZWxmLmZsYWdCaXRzW2ZsYWdCaXRzXQorICAgICAgICAgICAgICAgICAgICBkZWNsID0gJ2NvbnN0IHt9IEFsbHt9ID0ge30nLmZvcm1hdChmbGFnLCBmbGFnQml0cywgYml0c1swXSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGJpdCBpbiBiaXRzWzE6XToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKz0gJ3wnICsgYml0CisgICAgICAgICAgICAgICAgICAgIGRlY2wgKz0gJzsnCisgICAgICAgICAgICAgICAgICAgIHdyaXRlKGRlY2wsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgZW5kaWYgPSAnXG4nCisgICAgICAgICAgICBpZiAoc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICBlbmRpZiA9ICcjZW5kaWYgLy8gJXNcbicgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QKKyAgICAgICAgICAgIHNlbGYudmFsaWRhdGlvbi5hcHBlbmQoZW5kaWYpCisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmVhdHVyZShzZWxmKQorICAgICMKKyAgICAjIFR5cGUgZ2VuZXJhdGlvbgorICAgIGRlZiBnZW5UeXBlKHNlbGYsIHR5cGVpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgICMgcmVjb3JkIHRoZSBuYW1lL2FsaWFzIHBhaXIKKyAgICAgICAgaWYgYWxpYXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFsaWFzX2RpY3RbbmFtZV09YWxpYXMKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlblR5cGUoc2VsZiwgdHlwZWluZm8sIG5hbWUsIGFsaWFzKQorICAgICAgICB0eXBlRWxlbSA9IHR5cGVpbmZvLmVsZW0KKyAgICAgICAgIyBJZiB0aGUgdHlwZSBpcyBhIHN0cnVjdCB0eXBlLCB0cmF2ZXJzZSB0aGUgZW1iZWRkZWQgPG1lbWJlcj4gdGFncyBnZW5lcmF0aW5nIGEgc3RydWN0dXJlLiBPdGhlcndpc2UsIGVtaXQgdGhlIHRhZyB0ZXh0LgorICAgICAgICBjYXRlZ29yeSA9IHR5cGVFbGVtLmdldCgnY2F0ZWdvcnknKQorICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gJ3N0cnVjdCcgb3IgY2F0ZWdvcnkgPT0gJ3VuaW9uJyk6CisgICAgICAgICAgICBzZWxmLmdlblN0cnVjdCh0eXBlaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgIGVsaWYgKGNhdGVnb3J5ID09ICdoYW5kbGUnKToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlVHlwZXMuYWRkKG5hbWUpCisgICAgICAgIGVsaWYgKGNhdGVnb3J5ID09ICdiaXRtYXNrJyk6CisgICAgICAgICAgICBzZWxmLmZsYWdzLmFkZChuYW1lKQorICAgICAgICAgICAgc2VsZi5uZXdGbGFncy5hZGQobmFtZSkKKyAgICAgICAgZWxpZiAoY2F0ZWdvcnkgPT0gJ2RlZmluZScpOgorICAgICAgICAgICAgaWYgbmFtZSA9PSAnVktfSEVBREVSX1ZFUlNJT04nOgorICAgICAgICAgICAgICAgIG5hbWVFbGVtID0gdHlwZUVsZW0uZmluZCgnbmFtZScpCisgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJWZXJzaW9uID0gbm9uZVN0cihuYW1lRWxlbS50YWlsKS5zdHJpcCgpCisgICAgIworICAgICMgU3RydWN0IHBhcmFtZXRlciBjaGVjayBnZW5lcmF0aW9uLgorICAgICMgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgPHR5cGU+IHRhZyB3aGVyZSB0aGUgY29udGVudHMgYXJlIGludGVycHJldGVkIGFzIGEgc2V0IG9mIDxtZW1iZXI+IHRhZ3MgaW5zdGVhZCBvZiBmcmVlZm9ybSBDCisgICAgIyB0eXBlIGRlY2xhcmF0aW9ucy4gVGhlIDxtZW1iZXI+IHRhZ3MgYXJlIGp1c3QgbGlrZSA8cGFyYW0+IHRhZ3MgLSB0aGV5IGFyZSBhIGRlY2xhcmF0aW9uIG9mIGEgc3RydWN0IG9yIHVuaW9uIG1lbWJlci4KKyAgICAjIE9ubHkgc2ltcGxlIG1lbWJlciBkZWNsYXJhdGlvbnMgYXJlIHN1cHBvcnRlZCAobm8gbmVzdGVkIHN0cnVjdHMgZXRjLikKKyAgICBkZWYgZ2VuU3RydWN0KHNlbGYsIHR5cGVpbmZvLCB0eXBlTmFtZSwgYWxpYXMpOgorICAgICAgICBpZiBub3Qgc2VsZi5zb3VyY2VfZmlsZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIGFsaWFzIGhhcyBhbHJlYWR5IGJlZW4gcmVjb3JkZWQgaW4gZ2VuVHlwZSwgYWJvdmUKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlblN0cnVjdChzZWxmLCB0eXBlaW5mbywgdHlwZU5hbWUsIGFsaWFzKQorICAgICAgICBjb25kaXRpb25zID0gc2VsZi5zdHJ1Y3RNZW1iZXJWYWxpZGF0aW9uQ29uZGl0aW9uc1t0eXBlTmFtZV0gaWYgdHlwZU5hbWUgaW4gc2VsZi5zdHJ1Y3RNZW1iZXJWYWxpZGF0aW9uQ29uZGl0aW9ucyBlbHNlIE5vbmUKKyAgICAgICAgbWVtYmVycyA9IHR5cGVpbmZvLmVsZW0uZmluZGFsbCgnLi8vbWVtYmVyJykKKyAgICAgICAgaWYgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3RfZmVhdHVyZV9wcm90ZWN0W3R5cGVOYW1lXSA9IHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdAorICAgICAgICAjCisgICAgICAgICMgSXRlcmF0ZSBvdmVyIG1lbWJlcnMgb25jZSB0byBnZXQgbGVuZ3RoIHBhcmFtZXRlcnMgZm9yIGFycmF5cworICAgICAgICBsZW5zID0gc2V0KCkKKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgbGVuID0gc2VsZi5nZXRMZW4obWVtYmVyKQorICAgICAgICAgICAgaWYgbGVuOgorICAgICAgICAgICAgICAgIGxlbnMuYWRkKGxlbikKKyAgICAgICAgIworICAgICAgICAjIEdlbmVyYXRlIG1lbWJlciBpbmZvCisgICAgICAgIG1lbWJlcnNJbmZvID0gW10KKyAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgIyBHZXQgdGhlIG1lbWJlcidzIHR5cGUgYW5kIG5hbWUKKyAgICAgICAgICAgIGluZm8gPSBzZWxmLmdldFR5cGVOYW1lVHVwbGUobWVtYmVyKQorICAgICAgICAgICAgdHlwZSA9IGluZm9bMF0KKyAgICAgICAgICAgIG5hbWUgPSBpbmZvWzFdCisgICAgICAgICAgICBzdHlwZVZhbHVlID0gJycKKyAgICAgICAgICAgIGNkZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbChtZW1iZXIsIDApCisKKyAgICAgICAgICAgICMgU3RvcmUgcG9pbnRlci9hcnJheS9zdHJpbmcgaW5mbyAtLSBDaGVjayBmb3IgcGFyYW1ldGVyIG5hbWUgaW4gbGVucyBzZXQKKyAgICAgICAgICAgIGlzY291bnQgPSBGYWxzZQorICAgICAgICAgICAgaWYgbmFtZSBpbiBsZW5zOgorICAgICAgICAgICAgICAgIGlzY291bnQgPSBUcnVlCisgICAgICAgICAgICAjIFRoZSBwTmV4dCBtZW1iZXJzIGFyZSBub3QgdGFnZ2VkIGFzIG9wdGlvbmFsLCBidXQgYXJlIHRyZWF0ZWQgYXMgb3B0aW9uYWwgZm9yIHBhcmFtZXRlciBOVUxMIGNoZWNrcy4gIFN0YXRpYyBhcnJheQorICAgICAgICAgICAgIyBtZW1iZXJzIGFyZSBhbHNvIHRyZWF0ZWQgYXMgb3B0aW9uYWwgdG8gc2tpcCBOVUxMIHBvaW50ZXIgdmFsaWRhdGlvbiwgYXMgdGhleSB3b24ndCBiZSBOVUxMLgorICAgICAgICAgICAgaXNzdGF0aWNhcnJheSA9IHNlbGYucGFyYW1Jc1N0YXRpY0FycmF5KG1lbWJlcikKKyAgICAgICAgICAgIGlzb3B0aW9uYWwgPSBGYWxzZQorICAgICAgICAgICAgaWYgc2VsZi5wYXJhbUlzT3B0aW9uYWwobWVtYmVyKSBvciAobmFtZSA9PSAncE5leHQnKSBvciAoaXNzdGF0aWNhcnJheSk6CisgICAgICAgICAgICAgICAgaXNvcHRpb25hbCA9IFRydWUKKyAgICAgICAgICAgICMgRGV0ZXJtaW5lIGlmIHZhbHVlIHNob3VsZCBiZSBpZ25vcmVkIGJ5IGNvZGUgZ2VuZXJhdGlvbi4KKyAgICAgICAgICAgIG5vYXV0b3ZhbGlkaXR5ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIChtZW1iZXIuYXR0cmliLmdldCgnbm9hdXRvdmFsaWRpdHknKSBpcyBub3QgTm9uZSkgb3IgKCh0eXBlTmFtZSBpbiBzZWxmLnN0cnVjdE1lbWJlckJsYWNrbGlzdCkgYW5kIChuYW1lIGluIHNlbGYuc3RydWN0TWVtYmVyQmxhY2tsaXN0W3R5cGVOYW1lXSkpOgorICAgICAgICAgICAgICAgIG5vYXV0b3ZhbGlkaXR5ID0gVHJ1ZQorICAgICAgICAgICAgc3RydWN0ZXh0ZW5kcyA9IEZhbHNlCisgICAgICAgICAgICBtZW1iZXJzSW5mby5hcHBlbmQoc2VsZi5Db21tYW5kUGFyYW0odHlwZT10eXBlLCBuYW1lPW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3BvaW50ZXI9c2VsZi5wYXJhbUlzUG9pbnRlcihtZW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdGF0aWNhcnJheT1pc3N0YXRpY2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNib29sPVRydWUgaWYgdHlwZSA9PSAnVmtCb29sMzInIGVsc2UgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3JhbmdlZGVudW09VHJ1ZSBpZiB0eXBlIGluIHNlbGYuZW51bVJhbmdlcyBlbHNlIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNjb25zdD1UcnVlIGlmICdjb25zdCcgaW4gY2RlY2wgZWxzZSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb3B0aW9uYWw9aXNvcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY291bnQ9aXNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vYXV0b3ZhbGlkaXR5PW5vYXV0b3ZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuPXNlbGYuZ2V0TGVuKG1lbWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRzdHJ1Y3RzPXNlbGYucmVnaXN0cnkudmFsaWRleHRlbnNpb25zdHJ1Y3RzW3R5cGVOYW1lXSBpZiBuYW1lID09ICdwTmV4dCcgZWxzZSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uPWNvbmRpdGlvbnNbbmFtZV0gaWYgY29uZGl0aW9ucyBhbmQgbmFtZSBpbiBjb25kaXRpb25zIGVsc2UgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkZWNsPWNkZWNsKSkKKyAgICAgICAgIyBJZiB0aGlzIHN0cnVjdCBleHRlbmRzIGFub3RoZXIsIGtlZXAgaXRzIG5hbWUgaW4gbGlzdCBmb3IgZnVydGhlciBwcm9jZXNzaW5nCisgICAgICAgIGlmIHR5cGVpbmZvLmVsZW0uYXR0cmliLmdldCgnc3RydWN0ZXh0ZW5kcycpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3RleHRlbmRzX2xpc3QuYXBwZW5kKHR5cGVOYW1lKQorICAgICAgICAjIFJldHVybmVkb25seSBzdHJ1Y3RzIHNob3VsZCBoYXZlIG1vc3Qgb2YgdGhlaXIgbWVtYmVycyBpZ25vcmVkIC0tIG9uIGVudHJ5LCB3ZSBvbmx5IGNhcmUgYWJvdXQgdmFsaWRhdGluZyB0aGUgc1R5cGUgYW5kCisgICAgICAgICMgcE5leHQgbWVtYmVycy4gRXZlcnl0aGluZyBlbHNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNhbGxlZS4KKyAgICAgICAgaWYgdHlwZWluZm8uZWxlbS5hdHRyaWIuZ2V0KCdyZXR1cm5lZG9ubHknKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucmV0dXJuZWRvbmx5X3N0cnVjdHMuYXBwZW5kKHR5cGVOYW1lKQorICAgICAgICAgICAgbWVtYmVyc0luZm8gPSBbbSBmb3IgbSBpbiBtZW1iZXJzSW5mbyBpZiBtLm5hbWUgaW4gKCdzVHlwZScsICdwTmV4dCcpXQorICAgICAgICBzZWxmLnN0cnVjdE1lbWJlcnMuYXBwZW5kKHNlbGYuU3RydWN0TWVtYmVyRGF0YShuYW1lPXR5cGVOYW1lLCBtZW1iZXJzPW1lbWJlcnNJbmZvKSkKKyAgICAjCisgICAgIyBDYXB0dXJlIGdyb3VwIChlLmcuIEMgImVudW0iIHR5cGUpIGluZm8gdG8gYmUgdXNlZCBmb3IgcGFyYW0gY2hlY2sgY29kZSBnZW5lcmF0aW9uLgorICAgICMgVGhlc2UgYXJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciB3aXRoIG90aGVyIHR5cGVzLgorICAgIGRlZiBnZW5Hcm91cChzZWxmLCBncm91cGluZm8sIGdyb3VwTmFtZSwgYWxpYXMpOgorICAgICAgICBpZiBub3Qgc2VsZi5zb3VyY2VfZmlsZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIHJlY29yZCB0aGUgbmFtZS9hbGlhcyBwYWlyCisgICAgICAgIGlmIGFsaWFzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hbGlhc19kaWN0W2dyb3VwTmFtZV09YWxpYXMKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlbkdyb3VwKHNlbGYsIGdyb3VwaW5mbywgZ3JvdXBOYW1lLCBhbGlhcykKKyAgICAgICAgZ3JvdXBFbGVtID0gZ3JvdXBpbmZvLmVsZW0KKyAgICAgICAgIyBTdG9yZSB0aGUgc1R5cGUgdmFsdWVzCisgICAgICAgIGlmIGdyb3VwTmFtZSA9PSAnVmtTdHJ1Y3R1cmVUeXBlJzoKKyAgICAgICAgICAgIGZvciBlbGVtIGluIGdyb3VwRWxlbS5maW5kYWxsKCdlbnVtJyk6CisgICAgICAgICAgICAgICAgc2VsZi5zdHlwZXMuYXBwZW5kKGVsZW0uZ2V0KCduYW1lJykpCisgICAgICAgIGVsaWYgJ0ZsYWdCaXRzJyBpbiBncm91cE5hbWU6CisgICAgICAgICAgICBiaXRzID0gW10KKyAgICAgICAgICAgIGZvciBlbGVtIGluIGdyb3VwRWxlbS5maW5kYWxsKCdlbnVtJyk6CisgICAgICAgICAgICAgICAgaWYgZWxlbS5nZXQoJ3N1cHBvcnRlZCcpICE9ICdkaXNhYmxlZCc6CisgICAgICAgICAgICAgICAgICAgIGJpdHMuYXBwZW5kKGVsZW0uZ2V0KCduYW1lJykpCisgICAgICAgICAgICBpZiBiaXRzOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZ0JpdHNbZ3JvdXBOYW1lXSA9IGJpdHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgRGV0ZXJtaW5lIGlmIGJlZ2luL2VuZCByYW5nZXMgYXJlIG5lZWRlZCAod2UgZG9uJ3QgZG8gdGhpcyBmb3IgVmtTdHJ1Y3R1cmVUeXBlLCB3aGljaCBoYXMgYSBtb3JlIGZpbmVseSBncmFpbmVkIGNoZWNrKQorICAgICAgICAgICAgZXhwYW5kTmFtZSA9IHJlLnN1YihyJyhbMC05YS16X10pKFtBLVowLTldW15BLVowLTldPyknLHInXDFfXDInLGdyb3VwTmFtZSkudXBwZXIoKQorICAgICAgICAgICAgZXhwYW5kUHJlZml4ID0gZXhwYW5kTmFtZQorICAgICAgICAgICAgZXhwYW5kU3VmZml4ID0gJycKKyAgICAgICAgICAgIGV4cGFuZFN1ZmZpeE1hdGNoID0gcmUuc2VhcmNoKHInW0EtWl1bQS1aXSskJyxncm91cE5hbWUpCisgICAgICAgICAgICBpZiBleHBhbmRTdWZmaXhNYXRjaDoKKyAgICAgICAgICAgICAgICBleHBhbmRTdWZmaXggPSAnXycgKyBleHBhbmRTdWZmaXhNYXRjaC5ncm91cCgpCisgICAgICAgICAgICAgICAgIyBTdHJpcCBvZmYgdGhlIHN1ZmZpeCBmcm9tIHRoZSBwcmVmaXgKKyAgICAgICAgICAgICAgICBleHBhbmRQcmVmaXggPSBleHBhbmROYW1lLnJzcGxpdChleHBhbmRTdWZmaXgsIDEpWzBdCisgICAgICAgICAgICBpc0VudW0gPSAoJ0ZMQUdfQklUUycgbm90IGluIGV4cGFuZFByZWZpeCkKKyAgICAgICAgICAgIGlmIGlzRW51bToKKyAgICAgICAgICAgICAgICBzZWxmLmVudW1SYW5nZXNbZ3JvdXBOYW1lXSA9IChleHBhbmRQcmVmaXggKyAnX0JFR0lOX1JBTkdFJyArIGV4cGFuZFN1ZmZpeCwgZXhwYW5kUHJlZml4ICsgJ19FTkRfUkFOR0UnICsgZXhwYW5kU3VmZml4KQorICAgICAgICAgICAgICAgICMgQ3JlYXRlIGRlZmluaXRpb24gZm9yIGEgbGlzdCBjb250YWluaW5nIHZhbGlkIGVudW0gdmFsdWVzIGZvciB0aGlzIGVudW1lcmF0ZWQgdHlwZQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZW51bV9lbnRyeSA9ICdcbiNpZmRlZiAlc1xuJyAlIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVudW1fZW50cnkgPSAnJworICAgICAgICAgICAgICAgIGVudW1fZW50cnkgKz0gJ2NvbnN0IHN0ZDo6dmVjdG9yPCVzPiBBbGwlc0VudW1zID0geycgJSAoZ3JvdXBOYW1lLCBncm91cE5hbWUpCisgICAgICAgICAgICAgICAgZm9yIGVudW0gaW4gZ3JvdXBFbGVtOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gZW51bS5nZXQoJ25hbWUnKQorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lIGFuZCBlbnVtLmdldCgnc3VwcG9ydGVkJykgIT0gJ2Rpc2FibGVkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fZW50cnkgKz0gJyVzLCAnICUgbmFtZQorICAgICAgICAgICAgICAgIGVudW1fZW50cnkgKz0gJ307XG4nCisgICAgICAgICAgICAgICAgaWYgc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBlbnVtX2VudHJ5ICs9ICcjZW5kaWYgLy8gJXNcbicgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QKKyAgICAgICAgICAgICAgICBzZWxmLmVudW1WYWx1ZUxpc3RzICs9IGVudW1fZW50cnkKKyAgICAjCisgICAgIyBDYXB0dXJlIGNvbW1hbmQgcGFyYW1ldGVyIGluZm8gdG8gYmUgdXNlZCBmb3IgcGFyYW0gY2hlY2sgY29kZSBnZW5lcmF0aW9uLgorICAgIGRlZiBnZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICAjIHJlY29yZCB0aGUgbmFtZS9hbGlhcyBwYWlyCisgICAgICAgIGlmIGFsaWFzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hbGlhc19kaWN0W25hbWVdPWFsaWFzCisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5DbWQoc2VsZiwgY21kaW5mbywgbmFtZSwgYWxpYXMpCisgICAgICAgIGRlY2xzID0gc2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSkKKyAgICAgICAgdHlwZWRlZiA9IGRlY2xzWzFdCisgICAgICAgIHR5cGVkZWYgPSB0eXBlZGVmLnNwbGl0KCcpJywxKVsxXQorICAgICAgICBpZiBzZWxmLmhlYWRlcl9maWxlOgorICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5ibGFja2xpc3Q6CisgICAgICAgICAgICAgICAgaWYgKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVjbGFyYXRpb25zICs9IFsgJyNpZmRlZiAlcycgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgXQorICAgICAgICAgICAgICAgICMgU3RyaXAgb2ZmICd2aycgZnJvbSBBUEkgbmFtZQorICAgICAgICAgICAgICAgIGRlY2wgPSAnJXMlcycgJSAoJ2Jvb2wgUHJlQ2FsbFZhbGlkYXRlJywgZGVjbHNbMF0uc3BsaXQoIlZLQVBJX0NBTEwgdmsiKVsxXSkKKyAgICAgICAgICAgICAgICBkZWNsID0gc3RyKGRlY2wpLnJlcGxhY2UoJzsnLCAnIGNvbnN0OycpCisgICAgICAgICAgICAgICAgc2VsZi5kZWNsYXJhdGlvbnMgKz0gWyBkZWNsIF0KKyAgICAgICAgICAgICAgICBpZiAoc2VsZi5mZWF0dXJlRXh0cmFQcm90ZWN0IGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWNsYXJhdGlvbnMgKz0gWyAnI2VuZGlmJyBdCisgICAgICAgIGlmIHNlbGYuc291cmNlX2ZpbGU6CisgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmJsYWNrbGlzdDoKKyAgICAgICAgICAgICAgICBwYXJhbXMgPSBjbWRpbmZvLmVsZW0uZmluZGFsbCgncGFyYW0nKQorICAgICAgICAgICAgICAgICMgR2V0IGxpc3Qgb2YgYXJyYXkgbGVuZ3RocworICAgICAgICAgICAgICAgIGxlbnMgPSBzZXQoKQorICAgICAgICAgICAgICAgIGZvciBwYXJhbSBpbiBwYXJhbXM6CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNlbGYuZ2V0TGVuKHBhcmFtKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW46CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5zLmFkZChsZW4pCisgICAgICAgICAgICAgICAgIyBHZXQgcGFyYW0gaW5mbworICAgICAgICAgICAgICAgIHBhcmFtc0luZm8gPSBbXQorICAgICAgICAgICAgICAgIGZvciBwYXJhbSBpbiBwYXJhbXM6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtSW5mbyA9IHNlbGYuZ2V0VHlwZU5hbWVUdXBsZShwYXJhbSkKKyAgICAgICAgICAgICAgICAgICAgY2RlY2wgPSBzZWxmLm1ha2VDUGFyYW1EZWNsKHBhcmFtLCAwKQorICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBwYXJhbWV0ZXIgbmFtZSBpbiBsZW5zIHNldAorICAgICAgICAgICAgICAgICAgICBpc2NvdW50ID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFyYW1JbmZvWzFdIGluIGxlbnM6CisgICAgICAgICAgICAgICAgICAgICAgICBpc2NvdW50ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBwYXJhbXNJbmZvLmFwcGVuZChzZWxmLkNvbW1hbmRQYXJhbSh0eXBlPXBhcmFtSW5mb1swXSwgbmFtZT1wYXJhbUluZm9bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcG9pbnRlcj1zZWxmLnBhcmFtSXNQb2ludGVyKHBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdGF0aWNhcnJheT1zZWxmLnBhcmFtSXNTdGF0aWNBcnJheShwYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzYm9vbD1UcnVlIGlmIHBhcmFtSW5mb1swXSA9PSAnVmtCb29sMzInIGVsc2UgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcmFuZ2VkZW51bT1UcnVlIGlmIHBhcmFtSW5mb1swXSBpbiBzZWxmLmVudW1SYW5nZXMgZWxzZSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNjb25zdD1UcnVlIGlmICdjb25zdCcgaW4gY2RlY2wgZWxzZSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvcHRpb25hbD1zZWxmLnBhcmFtSXNPcHRpb25hbChwYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY291bnQ9aXNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9hdXRvdmFsaWRpdHk9VHJ1ZSBpZiBwYXJhbS5hdHRyaWIuZ2V0KCdub2F1dG92YWxpZGl0eScpIGlzIG5vdCBOb25lIGVsc2UgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbj1zZWxmLmdldExlbihwYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHN0cnVjdHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkZWNsPWNkZWNsKSkKKyAgICAgICAgICAgICAgICAjIFNhdmUgcmV0dXJuIHZhbHVlIGluZm9ybWF0aW9uLCBpZiBhbnkKKyAgICAgICAgICAgICAgICByZXN1bHRfdHlwZSA9ICcnCisgICAgICAgICAgICAgICAgcmVzdWx0aW5mbyA9IGNtZGluZm8uZWxlbS5maW5kKCdwcm90by90eXBlJykKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0aW5mbyBpcyBub3QgTm9uZSBhbmQgcmVzdWx0aW5mby50ZXh0ICE9ICd2b2lkJyk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdF90eXBlID0gcmVzdWx0aW5mby50ZXh0CisgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kcy5hcHBlbmQoc2VsZi5Db21tYW5kRGF0YShuYW1lPW5hbWUsIHBhcmFtcz1wYXJhbXNJbmZvLCBjZGVjbD1zZWxmLm1ha2VDRGVjbHMoY21kaW5mby5lbGVtKVswXSwgZXh0ZW5zaW9uX3R5cGU9c2VsZi5leHRlbnNpb25fdHlwZSwgcmVzdWx0PXJlc3VsdF90eXBlKSkKKyAgICAjCisgICAgIyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBhIHBvaW50ZXIKKyAgICBkZWYgcGFyYW1Jc1BvaW50ZXIoc2VsZiwgcGFyYW0pOgorICAgICAgICBpc3BvaW50ZXIgPSAwCisgICAgICAgIHBhcmFtdHlwZSA9IHBhcmFtLmZpbmQoJ3R5cGUnKQorICAgICAgICBpZiAocGFyYW10eXBlLnRhaWwgaXMgbm90IE5vbmUpIGFuZCAoJyonIGluIHBhcmFtdHlwZS50YWlsKToKKyAgICAgICAgICAgIGlzcG9pbnRlciA9IHBhcmFtdHlwZS50YWlsLmNvdW50KCcqJykKKyAgICAgICAgZWxpZiBwYXJhbXR5cGUudGV4dFs6NF0gPT0gJ1BGTl8nOgorICAgICAgICAgICAgIyBUcmVhdCBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzIGFzIGEgcG9pbnRlciB0byBhIHNpbmdsZSB2YWx1ZQorICAgICAgICAgICAgaXNwb2ludGVyID0gMQorICAgICAgICByZXR1cm4gaXNwb2ludGVyCisgICAgIworICAgICMgQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBwYXNzZWQgaW4gaXMgYSBzdGF0aWMgYXJyYXkKKyAgICBkZWYgcGFyYW1Jc1N0YXRpY0FycmF5KHNlbGYsIHBhcmFtKToKKyAgICAgICAgaXNzdGF0aWNhcnJheSA9IDAKKyAgICAgICAgcGFyYW1uYW1lID0gcGFyYW0uZmluZCgnbmFtZScpCisgICAgICAgIGlmIChwYXJhbW5hbWUudGFpbCBpcyBub3QgTm9uZSkgYW5kICgnWycgaW4gcGFyYW1uYW1lLnRhaWwpOgorICAgICAgICAgICAgaXNzdGF0aWNhcnJheSA9IHBhcmFtbmFtZS50YWlsLmNvdW50KCdbJykKKyAgICAgICAgcmV0dXJuIGlzc3RhdGljYXJyYXkKKyAgICAjCisgICAgIyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBvcHRpb25hbAorICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgQm9vbGVhbiB2YWx1ZXMgZm9yIGNvbW1hIHNlcGFyYXRlZCBsZW4gYXR0cmlidXRlcyAobGVuPSdmYWxzZSx0cnVlJykKKyAgICBkZWYgcGFyYW1Jc09wdGlvbmFsKHNlbGYsIHBhcmFtKToKKyAgICAgICAgIyBTZWUgaWYgdGhlIGhhbmRsZSBpcyBvcHRpb25hbAorICAgICAgICBpc29wdGlvbmFsID0gRmFsc2UKKyAgICAgICAgIyBTaW1wbGUsIGlmIGl0J3Mgb3B0aW9uYWwsIHJldHVybiB0cnVlCisgICAgICAgIG9wdFN0cmluZyA9IHBhcmFtLmF0dHJpYi5nZXQoJ29wdGlvbmFsJykKKyAgICAgICAgaWYgb3B0U3RyaW5nOgorICAgICAgICAgICAgaWYgb3B0U3RyaW5nID09ICd0cnVlJzoKKyAgICAgICAgICAgICAgICBpc29wdGlvbmFsID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiAnLCcgaW4gb3B0U3RyaW5nOgorICAgICAgICAgICAgICAgIG9wdHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBvcHQgaW4gb3B0U3RyaW5nLnNwbGl0KCcsJyk6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IG9wdC5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIHZhbCA9PSAndHJ1ZSc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmFwcGVuZChUcnVlKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbCA9PSAnZmFsc2UnOgorICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5hcHBlbmQoRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnVW5yZWNvZ25pemVkIGxlbiBhdHRyaWJ1dGUgdmFsdWUnLHZhbCkKKyAgICAgICAgICAgICAgICBpc29wdGlvbmFsID0gb3B0cworICAgICAgICByZXR1cm4gaXNvcHRpb25hbAorICAgICMKKyAgICAjIENoZWNrIGlmIHRoZSBoYW5kbGUgcGFzc2VkIGluIGlzIG9wdGlvbmFsCisgICAgIyBVc2VzIHRoZSBzYW1lIGxvZ2ljIGFzIFZhbGlkaXR5T3V0cHV0R2VuZXJhdG9yLmlzSGFuZGxlT3B0aW9uYWwKKyAgICBkZWYgaXNIYW5kbGVPcHRpb25hbChzZWxmLCBwYXJhbSwgbGVuUGFyYW0pOgorICAgICAgICAjIFNpbXBsZSwgaWYgaXQncyBvcHRpb25hbCwgcmV0dXJuIHRydWUKKyAgICAgICAgaWYgcGFyYW0uaXNvcHRpb25hbDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgSWYgbm8gdmFsaWRpdHkgaXMgYmVpbmcgZ2VuZXJhdGVkLCBpdCB1c3VhbGx5IG1lYW5zIHRoYXQgdmFsaWRpdHkgaXMgY29tcGxleCBhbmQgbm90IGFic29sdXRlLCBzbyBsZXQncyBzYXkgeWVzLgorICAgICAgICBpZiBwYXJhbS5ub2F1dG92YWxpZGl0eToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgSWYgdGhlIHBhcmFtZXRlciBpcyBhbiBhcnJheSBhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5IHJldHVybmVkLCBmaW5kIG91dCBpZiBhbnkgb2YgdGhlIGxlbiBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbAorICAgICAgICBpZiBsZW5QYXJhbSBhbmQgbGVuUGFyYW0uaXNvcHRpb25hbDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgICMKKyAgICAjIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgbGVuIHRhZworICAgIGRlZiBnZXRMZW4oc2VsZiwgcGFyYW0pOgorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIGxlbiA9IHBhcmFtLmF0dHJpYi5nZXQoJ2xlbicpCisgICAgICAgIGlmIGxlbiBhbmQgbGVuICE9ICdudWxsLXRlcm1pbmF0ZWQnOgorICAgICAgICAgICAgIyBGb3Igc3RyaW5nIGFycmF5cywgJ2xlbicgY2FuIGxvb2sgbGlrZSAnY291bnQsbnVsbC10ZXJtaW5hdGVkJywgaW5kaWNhdGluZyB0aGF0IHdlIGhhdmUgYSBudWxsIHRlcm1pbmF0ZWQgYXJyYXkgb2YKKyAgICAgICAgICAgICMgc3RyaW5ncy4gIFdlIHN0cmlwIHRoZSBudWxsLXRlcm1pbmF0ZWQgZnJvbSB0aGUgJ2xlbicgZmllbGQgYW5kIG9ubHkgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgc3RyaW5nIGNvdW50CisgICAgICAgICAgICBpZiAnbnVsbC10ZXJtaW5hdGVkJyBpbiBsZW46CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuLnNwbGl0KCcsJylbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuCisgICAgICAgICAgICByZXN1bHQgPSBzdHIocmVzdWx0KS5yZXBsYWNlKCc6OicsICctPicpCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAjCisgICAgIyBSZXRyaWV2ZSB0aGUgdHlwZSBhbmQgbmFtZSBmb3IgYSBwYXJhbWV0ZXIKKyAgICBkZWYgZ2V0VHlwZU5hbWVUdXBsZShzZWxmLCBwYXJhbSk6CisgICAgICAgIHR5cGUgPSAnJworICAgICAgICBuYW1lID0gJycKKyAgICAgICAgZm9yIGVsZW0gaW4gcGFyYW06CisgICAgICAgICAgICBpZiBlbGVtLnRhZyA9PSAndHlwZSc6CisgICAgICAgICAgICAgICAgdHlwZSA9IG5vbmVTdHIoZWxlbS50ZXh0KQorICAgICAgICAgICAgZWxpZiBlbGVtLnRhZyA9PSAnbmFtZSc6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5vbmVTdHIoZWxlbS50ZXh0KQorICAgICAgICByZXR1cm4gKHR5cGUsIG5hbWUpCisgICAgIworICAgICMgRmluZCBhIG5hbWVkIHBhcmFtZXRlciBpbiBhIHBhcmFtZXRlciBsaXN0CisgICAgZGVmIGdldFBhcmFtQnlOYW1lKHNlbGYsIHBhcmFtcywgbmFtZSk6CisgICAgICAgIGZvciBwYXJhbSBpbiBwYXJhbXM6CisgICAgICAgICAgICBpZiBwYXJhbS5uYW1lID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtCisgICAgICAgIHJldHVybiBOb25lCisgICAgIworICAgICMgRXh0cmFjdCBsZW5ndGggdmFsdWVzIGZyb20gbGF0ZXhtYXRoLiAgQ3VycmVudGx5IGFuIGluZmxleGlibGUgc29sdXRpb24gdGhhdCBsb29rcyBmb3Igc3BlY2lmaWMKKyAgICAjIHBhdHRlcm5zIHRoYXQgYXJlIGZvdW5kIGluIHZrLnhtbC4gIFdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIHdoZW4gbmV3IHBhdHRlcm5zIGFyZSBpbnRyb2R1Y2VkLgorICAgIGRlZiBwYXJzZUxhdGVYTWF0aChzZWxmLCBzb3VyY2UpOgorICAgICAgICBuYW1lID0gJ0VSUk9SJworICAgICAgICBkZWNvcmF0ZWROYW1lID0gJ0VSUk9SJworICAgICAgICBpZiAnbWF0aGl0JyBpbiBzb3VyY2U6CisgICAgICAgICAgICAjIE1hdGNoZXMgZXhwcmVzc2lvbnMgc2ltaWxhciB0byAnbGF0ZXhtYXRoOltcbGNlaWx7XG1hdGhpdHtyYXN0ZXJpemF0aW9uU2FtcGxlc30gXG92ZXIgMzJ9XHJjZWlsXScKKyAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gocidsYXRleG1hdGhccypcOlxzKlxbXHMqXFxsKFx3Kylccypce1xzKlxcbWF0aGl0XHMqXHtccyooXHcrKVxzKlx9XHMqXFxvdmVyXHMqKFxkKylccypcfVxzKlxccihcdyspXHMqXF0nLCBzb3VyY2UpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2ggb3IgbWF0Y2guZ3JvdXAoMSkgIT0gbWF0Y2guZ3JvdXAoNCk6CisgICAgICAgICAgICAgICAgcmFpc2UgJ1VucmVjb2duaXplZCBsYXRleG1hdGggZXhwcmVzc2lvbicKKyAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgZGVjb3JhdGVkTmFtZSA9ICd7fSh7fS97fSknLmZvcm1hdCgqbWF0Y2guZ3JvdXAoMSwgMiwgMykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE1hdGNoZXMgZXhwcmVzc2lvbnMgc2ltaWxhciB0byAnbGF0ZXhtYXRoIDogW2RhdGFTaXplIFxvdmVyIDRdJworICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyJ2xhdGV4bWF0aFxzKlw6XHMqXFtccyooXFx0ZXh0cm1ceyk/KFx3KylcfT9ccypcXG92ZXJccyooXGQrKVxzKlxdJywgc291cmNlKQorICAgICAgICAgICAgbmFtZSA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBkZWNvcmF0ZWROYW1lID0gJ3t9L3t9Jy5mb3JtYXQoKm1hdGNoLmdyb3VwKDIsIDMpKQorICAgICAgICByZXR1cm4gbmFtZSwgZGVjb3JhdGVkTmFtZQorICAgICMKKyAgICAjIEdldCB0aGUgbGVuZ3RoIHBhcmFtYXRlciByZWNvcmQgZm9yIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIG5hbWUKKyAgICBkZWYgZ2V0TGVuUGFyYW0oc2VsZiwgcGFyYW1zLCBuYW1lKToKKyAgICAgICAgbGVuUGFyYW0gPSBOb25lCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBpZiAnLT4nIGluIG5hbWU6CisgICAgICAgICAgICAgICAgIyBUaGUgY291bnQgaXMgb2J0YWluZWQgYnkgZGVyZWZlcmVuY2luZyBhIG1lbWJlciBvZiBhIHN0cnVjdCBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBsZW5QYXJhbSA9IHNlbGYuQ29tbWFuZFBhcmFtKG5hbWU9bmFtZSwgaXNjb3VudD1UcnVlLCBpc3BvaW50ZXI9RmFsc2UsIGlzYm9vbD1GYWxzZSwgaXNyYW5nZWRlbnVtPUZhbHNlLCBpc2NvbnN0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdGF0aWNhcnJheT1Ob25lLCBpc29wdGlvbmFsPUZhbHNlLCB0eXBlPU5vbmUsIG5vYXV0b3ZhbGlkaXR5PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuPU5vbmUsIGV4dHN0cnVjdHM9Tm9uZSwgY29uZGl0aW9uPU5vbmUsIGNkZWNsPU5vbmUpCisgICAgICAgICAgICBlbGlmICdsYXRleG1hdGgnIGluIG5hbWU6CisgICAgICAgICAgICAgICAgbGVuTmFtZSwgZGVjb3JhdGVkTmFtZSA9IHNlbGYucGFyc2VMYXRlWE1hdGgobmFtZSkKKyAgICAgICAgICAgICAgICBsZW5QYXJhbSA9IHNlbGYuZ2V0UGFyYW1CeU5hbWUocGFyYW1zLCBsZW5OYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsZW5QYXJhbSA9IHNlbGYuZ2V0UGFyYW1CeU5hbWUocGFyYW1zLCBuYW1lKQorICAgICAgICByZXR1cm4gbGVuUGFyYW0KKyAgICAjCisgICAgIyBDb252ZXJ0IGEgdnVsa2FuLmggY29tbWFuZCBkZWNsYXJhdGlvbiBpbnRvIGEgcGFyYW1ldGVyX3ZhbGlkYXRpb24uaCBkZWZpbml0aW9uCisgICAgZGVmIGdldENtZERlZihzZWxmLCBjbWQpOgorICAgICAgICAjIFN0cmlwIHRoZSB0cmFpbGluZyAnOycgYW5kIHNwbGl0IGludG8gaW5kaXZpZHVhbCBsaW5lcworICAgICAgICBsaW5lcyA9IGNtZC5jZGVjbFs6LTFdLnNwbGl0KCdcbicpCisgICAgICAgIGNtZF9oZHIgPSAnXG4nLmpvaW4obGluZXMpCisgICAgICAgIHJldHVybiBjbWRfaGRyCisgICAgIworICAgICMgR2VuZXJhdGUgdGhlIGNvZGUgdG8gY2hlY2sgZm9yIGEgTlVMTCBkZXJlZmVyZW5jZSBiZWZvcmUgY2FsbGluZyB0aGUKKyAgICAjIHZhbGlkYXRpb24gZnVuY3Rpb24KKyAgICBkZWYgZ2VuQ2hlY2tlZExlbmd0aENhbGwoc2VsZiwgbmFtZSwgZXhwcnMpOgorICAgICAgICBjb3VudCA9IG5hbWUuY291bnQoJy0+JykKKyAgICAgICAgaWYgY291bnQ6CisgICAgICAgICAgICBjaGVja2VkRXhwciA9IFtdCisgICAgICAgICAgICBsb2NhbEluZGVudCA9ICcnCisgICAgICAgICAgICBlbGVtZW50cyA9IG5hbWUuc3BsaXQoJy0+JykKKyAgICAgICAgICAgICMgT3BlbiB0aGUgaWYgZXhwcmVzc2lvbiBibG9ja3MKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGNvdW50KToKKyAgICAgICAgICAgICAgICBjaGVja2VkRXhwci5hcHBlbmQobG9jYWxJbmRlbnQgKyAnaWYgKHt9ICE9IE5VTEwpIHt7XG4nLmZvcm1hdCgnLT4nLmpvaW4oZWxlbWVudHNbMDppKzFdKSkpCisgICAgICAgICAgICAgICAgbG9jYWxJbmRlbnQgPSBzZWxmLmluY0luZGVudChsb2NhbEluZGVudCkKKyAgICAgICAgICAgICMgQWRkIHRoZSB2YWxpZGF0aW9uIGV4cHJlc3Npb24KKyAgICAgICAgICAgIGZvciBleHByIGluIGV4cHJzOgorICAgICAgICAgICAgICAgIGNoZWNrZWRFeHByLmFwcGVuZChsb2NhbEluZGVudCArIGV4cHIpCisgICAgICAgICAgICAjIENsb3NlIHRoZSBpZiBibG9ja3MKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGNvdW50KToKKyAgICAgICAgICAgICAgICBsb2NhbEluZGVudCA9IHNlbGYuZGVjSW5kZW50KGxvY2FsSW5kZW50KQorICAgICAgICAgICAgICAgIGNoZWNrZWRFeHByLmFwcGVuZChsb2NhbEluZGVudCArICd9XG4nKQorICAgICAgICAgICAgcmV0dXJuIFtjaGVja2VkRXhwcl0KKyAgICAgICAgIyBObyBpZiBzdGF0ZW1lbnRzIHdlcmUgcmVxdWlyZWQKKyAgICAgICAgcmV0dXJuIGV4cHJzCisgICAgIworICAgICMgR2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgYSBzcGVjaWZpYyBjb25kaXRpb24gYmVmb3JlIGV4ZWN1dGluZyB2YWxpZGF0aW9uIGNvZGUKKyAgICBkZWYgZ2VuQ29uZGl0aW9uYWxDYWxsKHNlbGYsIHByZWZpeCwgY29uZGl0aW9uLCBleHBycyk6CisgICAgICAgIGNoZWNrZWRFeHByID0gW10KKyAgICAgICAgbG9jYWxJbmRlbnQgPSAnJworICAgICAgICBmb3JtYXR0ZWRDb25kaXRpb24gPSBjb25kaXRpb24uZm9ybWF0KHByZWZpeCkKKyAgICAgICAgY2hlY2tlZEV4cHIuYXBwZW5kKGxvY2FsSW5kZW50ICsgJ2lmICh7fSlcbicuZm9ybWF0KGZvcm1hdHRlZENvbmRpdGlvbikpCisgICAgICAgIGNoZWNrZWRFeHByLmFwcGVuZChsb2NhbEluZGVudCArICd7XG4nKQorICAgICAgICBsb2NhbEluZGVudCA9IHNlbGYuaW5jSW5kZW50KGxvY2FsSW5kZW50KQorICAgICAgICBmb3IgZXhwciBpbiBleHByczoKKyAgICAgICAgICAgIGNoZWNrZWRFeHByLmFwcGVuZChsb2NhbEluZGVudCArIGV4cHIpCisgICAgICAgIGxvY2FsSW5kZW50ID0gc2VsZi5kZWNJbmRlbnQobG9jYWxJbmRlbnQpCisgICAgICAgIGNoZWNrZWRFeHByLmFwcGVuZChsb2NhbEluZGVudCArICd9XG4nKQorICAgICAgICByZXR1cm4gW2NoZWNrZWRFeHByXQorICAgICMKKyAgICAjIEdldCBWVUlEIGlkZW50aWZpZXIgZnJvbSBpbXBsaWNpdCBWVUlEIHRhZworICAgIGRlZiBHZXRWdWlkKHNlbGYsIG5hbWUsIHN1ZmZpeCk6CisgICAgICAgIHZ1aWRfc3RyaW5nID0gJ1ZVSUQtJXMtJXMnICUgKG5hbWUsIHN1ZmZpeCkKKyAgICAgICAgdnVpZCA9ICJrVlVJRFVuZGVmaW5lZCIKKyAgICAgICAgaWYgJy0+JyBpbiB2dWlkX3N0cmluZzoKKyAgICAgICAgICAgcmV0dXJuIHZ1aWQKKyAgICAgICAgaWYgdnVpZF9zdHJpbmcgaW4gc2VsZi52YWxpZF92dWlkczoKKyAgICAgICAgICAgIHZ1aWQgPSAiXCIlc1wiIiAlIHZ1aWRfc3RyaW5nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYuYWxpYXNfZGljdDoKKyAgICAgICAgICAgICAgICBhbGlhc19zdHJpbmcgPSAnVlVJRC0lcy0lcycgJSAoc2VsZi5hbGlhc19kaWN0W25hbWVdLCBzdWZmaXgpCisgICAgICAgICAgICAgICAgaWYgYWxpYXNfc3RyaW5nIGluIHNlbGYudmFsaWRfdnVpZHM6CisgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSAiXCIlc1wiIiAlIGFsaWFzX3N0cmluZworICAgICAgICByZXR1cm4gdnVpZAorICAgICMKKyAgICAjIEdlbmVyYXRlIHRoZSBzVHlwZSBjaGVjayBzdHJpbmcKKyAgICBkZWYgbWFrZVN0cnVjdFR5cGVDaGVjayhzZWxmLCBwcmVmaXgsIHZhbHVlLCBsZW5WYWx1ZSwgdmFsdWVSZXF1aXJlZCwgbGVuVmFsdWVSZXF1aXJlZCwgbGVuUHRyUmVxdWlyZWQsIGZ1bmNQcmludE5hbWUsIGxlblByaW50TmFtZSwgdmFsdWVQcmludE5hbWUsIHBvc3RQcm9jU3BlYywgc3RydWN0X3R5cGVfbmFtZSk6CisgICAgICAgIGNoZWNrRXhwciA9IFtdCisgICAgICAgIHN0eXBlID0gc2VsZi5zdHJ1Y3RUeXBlc1t2YWx1ZS50eXBlXQorICAgICAgICB2dWlkX25hbWUgPSBzdHJ1Y3RfdHlwZV9uYW1lIGlmIHN0cnVjdF90eXBlX25hbWUgaXMgbm90IE5vbmUgZWxzZSBmdW5jUHJpbnROYW1lCisgICAgICAgIHN0eXBlX3Z1aWQgPSBzZWxmLkdldFZ1aWQodmFsdWUudHlwZSwgInNUeXBlLXNUeXBlIikKKyAgICAgICAgcGFyYW1fdnVpZCA9IHNlbGYuR2V0VnVpZCh2dWlkX25hbWUsICIlcy1wYXJhbWV0ZXIiICUgdmFsdWUubmFtZSkKKworICAgICAgICBpZiBsZW5WYWx1ZToKKyAgICAgICAgICAgIGNvdW50X3JlcXVpcmVkX3Z1aWQgPSBzZWxmLkdldFZ1aWQodnVpZF9uYW1lLCAiJXMtYXJyYXlsZW5ndGgiICUgbGVuVmFsdWUubmFtZSkKKworICAgICAgICAgICAgIyBUaGlzIGlzIGFuIGFycmF5IHdpdGggYSBwb2ludGVyIHRvIGEgY291bnQgdmFsdWUKKyAgICAgICAgICAgIGlmIGxlblZhbHVlLmlzcG9pbnRlcjoKKyAgICAgICAgICAgICAgICAjIFdoZW4gdGhlIGxlbmd0aCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyLCB0aGVyZSBpcyBhbiBleHRyYSBCb29sZWFuIHBhcmFtZXRlciBpbiB0aGUgZnVuY3Rpb24gY2FsbCB0byBpbmRpY2F0ZSBpZiBpdCBpcyByZXF1aXJlZAorICAgICAgICAgICAgICAgIGNoZWNrRXhwci5hcHBlbmQoJ3NraXAgfD0gdmFsaWRhdGVfc3RydWN0X3R5cGVfYXJyYXkoInt9Iiwge3BwcH0ie2xkbn0ie3Bwc30sIHtwcHB9Intkbn0ie3Bwc30sICJ7c3Z9Iiwge3BmfXtsbn0sIHtwZn17dm59LCB7c3Z9LCB7fSwge30sIHt9LCB7fSwge30sIHt9KTtcbicuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBmdW5jUHJpbnROYW1lLCBsZW5QdHJSZXF1aXJlZCwgbGVuVmFsdWVSZXF1aXJlZCwgdmFsdWVSZXF1aXJlZCwgc3R5cGVfdnVpZCwgcGFyYW1fdnVpZCwgY291bnRfcmVxdWlyZWRfdnVpZCwgbG49bGVuVmFsdWUubmFtZSwgbGRuPWxlblByaW50TmFtZSwgZG49dmFsdWVQcmludE5hbWUsIHZuPXZhbHVlLm5hbWUsIHN2PXN0eXBlLCBwZj1wcmVmaXgsICoqcG9zdFByb2NTcGVjKSkKKyAgICAgICAgICAgICMgVGhpcyBpcyBhbiBhcnJheSB3aXRoIGFuIGludGVnZXIgY291bnQgdmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2hlY2tFeHByLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZV9hcnJheSgie30iLCB7cHBwfSJ7bGRufSJ7cHBzfSwge3BwcH0ie2RufSJ7cHBzfSwgIntzdn0iLCB7cGZ9e2xufSwge3BmfXt2bn0sIHtzdn0sIHt9LCB7fSwge30sIHt9LCB7fSk7XG4nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgZnVuY1ByaW50TmFtZSwgbGVuVmFsdWVSZXF1aXJlZCwgdmFsdWVSZXF1aXJlZCwgc3R5cGVfdnVpZCwgcGFyYW1fdnVpZCwgY291bnRfcmVxdWlyZWRfdnVpZCwgbG49bGVuVmFsdWUubmFtZSwgbGRuPWxlblByaW50TmFtZSwgZG49dmFsdWVQcmludE5hbWUsIHZuPXZhbHVlLm5hbWUsIHN2PXN0eXBlLCBwZj1wcmVmaXgsICoqcG9zdFByb2NTcGVjKSkKKyAgICAgICAgIyBUaGlzIGlzIGFuIGluZGl2aWR1YWwgc3RydWN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjaGVja0V4cHIuYXBwZW5kKCdza2lwIHw9IHZhbGlkYXRlX3N0cnVjdF90eXBlKCJ7fSIsIHtwcHB9Int9IntwcHN9LCAie3N2fSIsIHt9e3ZufSwge3N2fSwge30sIHt9LCB7fSk7XG4nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBmdW5jUHJpbnROYW1lLCB2YWx1ZVByaW50TmFtZSwgcHJlZml4LCB2YWx1ZVJlcXVpcmVkLCBwYXJhbV92dWlkLCBzdHlwZV92dWlkLCB2bj12YWx1ZS5uYW1lLCBzdj1zdHlwZSwgdnQ9dmFsdWUudHlwZSwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICByZXR1cm4gY2hlY2tFeHByCisgICAgIworICAgICMgR2VuZXJhdGUgdGhlIGhhbmRsZSBjaGVjayBzdHJpbmcKKyAgICBkZWYgbWFrZUhhbmRsZUNoZWNrKHNlbGYsIHByZWZpeCwgdmFsdWUsIGxlblZhbHVlLCB2YWx1ZVJlcXVpcmVkLCBsZW5WYWx1ZVJlcXVpcmVkLCBmdW5jUHJpbnROYW1lLCBsZW5QcmludE5hbWUsIHZhbHVlUHJpbnROYW1lLCBwb3N0UHJvY1NwZWMpOgorICAgICAgICBjaGVja0V4cHIgPSBbXQorICAgICAgICBpZiBsZW5WYWx1ZToKKyAgICAgICAgICAgIGlmIGxlblZhbHVlLmlzcG9pbnRlcjoKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBvdXRwdXQgYXJyYXkgd2l0aCBhIHBvaW50ZXIgdG8gYSBjb3VudCB2YWx1ZQorICAgICAgICAgICAgICAgIHJhaXNlKCdVbnN1cHBvcnRlZCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiBjYXNlOiBPdXRwdXQgaGFuZGxlIGFycmF5IGVsZW1lbnRzIGFyZSBub3QgTlVMTCBjaGVja2VkJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIGFycmF5IHdpdGggYW4gaW50ZWdlciBjb3VudCB2YWx1ZQorICAgICAgICAgICAgICAgIGNoZWNrRXhwci5hcHBlbmQoJ3NraXAgfD0gdmFsaWRhdGVfaGFuZGxlX2FycmF5KCJ7fSIsIHtwcHB9IntsZG59IntwcHN9LCB7cHBwfSJ7ZG59IntwcHN9LCB7cGZ9e2xufSwge3BmfXt2bn0sIHt9LCB7fSk7XG4nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgZnVuY1ByaW50TmFtZSwgbGVuVmFsdWVSZXF1aXJlZCwgdmFsdWVSZXF1aXJlZCwgbG49bGVuVmFsdWUubmFtZSwgbGRuPWxlblByaW50TmFtZSwgZG49dmFsdWVQcmludE5hbWUsIHZuPXZhbHVlLm5hbWUsIHBmPXByZWZpeCwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3V0cHV0IGhhbmRsZSBwb2ludGVyCisgICAgICAgICAgICByYWlzZSgnVW5zdXBwb3J0ZWQgcGFyYW1ldGVyIHZhbGlkYXRpb24gY2FzZTogT3V0cHV0IGhhbmRsZXMgYXJlIG5vdCBOVUxMIGNoZWNrZWQnKQorICAgICAgICByZXR1cm4gY2hlY2tFeHByCisgICAgIworICAgICMgR2VuZXJhdGUgY2hlY2sgc3RyaW5nIGZvciBhbiBhcnJheSBvZiBWa0ZsYWdzIHZhbHVlcworICAgIGRlZiBtYWtlRmxhZ3NBcnJheUNoZWNrKHNlbGYsIHByZWZpeCwgdmFsdWUsIGxlblZhbHVlLCB2YWx1ZVJlcXVpcmVkLCBsZW5WYWx1ZVJlcXVpcmVkLCBmdW5jUHJpbnROYW1lLCBsZW5QcmludE5hbWUsIHZhbHVlUHJpbnROYW1lLCBwb3N0UHJvY1NwZWMpOgorICAgICAgICBjaGVja0V4cHIgPSBbXQorICAgICAgICBmbGFnQml0c05hbWUgPSB2YWx1ZS50eXBlLnJlcGxhY2UoJ0ZsYWdzJywgJ0ZsYWdCaXRzJykKKyAgICAgICAgaWYgbm90IGZsYWdCaXRzTmFtZSBpbiBzZWxmLmZsYWdCaXRzOgorICAgICAgICAgICAgcmFpc2UoJ1Vuc3VwcG9ydGVkIHBhcmFtZXRlciB2YWxpZGF0aW9uIGNhc2U6IGFycmF5IG9mIHJlc2VydmVkIFZrRmxhZ3MnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWxsRmxhZ3MgPSAnQWxsJyArIGZsYWdCaXRzTmFtZQorICAgICAgICAgICAgY2hlY2tFeHByLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9mbGFnc19hcnJheSgie30iLCB7cHBwfSJ7fSJ7cHBzfSwge3BwcH0ie30ie3Bwc30sICJ7fSIsIHt9LCB7cGZ9e30sIHtwZn17fSwge30sIHt9KTtcbicuZm9ybWF0KGZ1bmNQcmludE5hbWUsIGxlblByaW50TmFtZSwgdmFsdWVQcmludE5hbWUsIGZsYWdCaXRzTmFtZSwgYWxsRmxhZ3MsIGxlblZhbHVlLm5hbWUsIHZhbHVlLm5hbWUsIGxlblZhbHVlUmVxdWlyZWQsIHZhbHVlUmVxdWlyZWQsIHBmPXByZWZpeCwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICByZXR1cm4gY2hlY2tFeHByCisgICAgIworICAgICMgR2VuZXJhdGUgcE5leHQgY2hlY2sgc3RyaW5nCisgICAgZGVmIG1ha2VTdHJ1Y3ROZXh0Q2hlY2soc2VsZiwgcHJlZml4LCB2YWx1ZSwgZnVuY1ByaW50TmFtZSwgdmFsdWVQcmludE5hbWUsIHBvc3RQcm9jU3BlYywgc3RydWN0X3R5cGVfbmFtZSk6CisgICAgICAgIGNoZWNrRXhwciA9IFtdCisgICAgICAgICMgR2VuZXJhdGUgYW4gYXJyYXkgb2YgYWNjZXB0YWJsZSBWa1N0cnVjdHVyZVR5cGUgdmFsdWVzIGZvciBwTmV4dAorICAgICAgICBleHRTdHJ1Y3RDb3VudCA9IDAKKyAgICAgICAgZXh0U3RydWN0VmFyID0gJ05VTEwnCisgICAgICAgIGV4dFN0cnVjdE5hbWVzID0gJ05VTEwnCisgICAgICAgIHZ1aWQgPSBzZWxmLkdldFZ1aWQoc3RydWN0X3R5cGVfbmFtZSwgInBOZXh0LXBOZXh0IikKKyAgICAgICAgaWYgdmFsdWUuZXh0c3RydWN0czoKKyAgICAgICAgICAgIGV4dFN0cnVjdFZhciA9ICdhbGxvd2VkX3N0cnVjdHNfe30nLmZvcm1hdChzdHJ1Y3RfdHlwZV9uYW1lKQorICAgICAgICAgICAgZXh0U3RydWN0Q291bnQgPSAnQVJSQVlfU0laRSh7fSknLmZvcm1hdChleHRTdHJ1Y3RWYXIpCisgICAgICAgICAgICBleHRTdHJ1Y3ROYW1lcyA9ICciJyArICcsICcuam9pbih2YWx1ZS5leHRzdHJ1Y3RzKSArICciJworICAgICAgICAgICAgY2hlY2tFeHByLmFwcGVuZCgnY29uc3QgVmtTdHJ1Y3R1cmVUeXBlIHt9W10gPSB7eyB7fSB9fTtcbicuZm9ybWF0KGV4dFN0cnVjdFZhciwgJywgJy5qb2luKFtzZWxmLnN0cnVjdFR5cGVzW3NdIGZvciBzIGluIHZhbHVlLmV4dHN0cnVjdHNdKSkpCisgICAgICAgIGNoZWNrRXhwci5hcHBlbmQoJ3NraXAgfD0gdmFsaWRhdGVfc3RydWN0X3BuZXh0KCJ7fSIsIHtwcHB9Int9IntwcHN9LCB7fSwge317fSwge30sIHt9LCBHZW5lcmF0ZWRWdWxrYW5IZWFkZXJWZXJzaW9uLCB7fSk7XG4nLmZvcm1hdCgKKyAgICAgICAgICAgIGZ1bmNQcmludE5hbWUsIHZhbHVlUHJpbnROYW1lLCBleHRTdHJ1Y3ROYW1lcywgcHJlZml4LCB2YWx1ZS5uYW1lLCBleHRTdHJ1Y3RDb3VudCwgZXh0U3RydWN0VmFyLCB2dWlkLCAqKnBvc3RQcm9jU3BlYykpCisgICAgICAgIHJldHVybiBjaGVja0V4cHIKKyAgICAjCisgICAgIyBHZW5lcmF0ZSB0aGUgcG9pbnRlciBjaGVjayBzdHJpbmcKKyAgICBkZWYgbWFrZVBvaW50ZXJDaGVjayhzZWxmLCBwcmVmaXgsIHZhbHVlLCBsZW5WYWx1ZSwgdmFsdWVSZXF1aXJlZCwgbGVuVmFsdWVSZXF1aXJlZCwgbGVuUHRyUmVxdWlyZWQsIGZ1bmNQcmludE5hbWUsIGxlblByaW50TmFtZSwgdmFsdWVQcmludE5hbWUsIHBvc3RQcm9jU3BlYywgc3RydWN0X3R5cGVfbmFtZSk6CisgICAgICAgIGNoZWNrRXhwciA9IFtdCisgICAgICAgIHZ1aWRfdGFnX25hbWUgPSBzdHJ1Y3RfdHlwZV9uYW1lIGlmIHN0cnVjdF90eXBlX25hbWUgaXMgbm90IE5vbmUgZWxzZSBmdW5jUHJpbnROYW1lCisgICAgICAgIGlmIGxlblZhbHVlOgorICAgICAgICAgICAgY291bnRfcmVxdWlyZWRfdnVpZCA9IHNlbGYuR2V0VnVpZCh2dWlkX3RhZ19uYW1lLCAiJXMtYXJyYXlsZW5ndGgiICUgKGxlblZhbHVlLm5hbWUpKQorICAgICAgICAgICAgYXJyYXlfcmVxdWlyZWRfdnVpZCA9IHNlbGYuR2V0VnVpZCh2dWlkX3RhZ19uYW1lLCAiJXMtcGFyYW1ldGVyIiAlICh2YWx1ZS5uYW1lKSkKKyAgICAgICAgICAgICMgVE9ETzogUmVtb3ZlIHdvcmthcm91bmQgZm9yIG1pc3Npbmcgb3B0aW9uYWwgdGFnIGluIHZrLnhtbAorICAgICAgICAgICAgaWYgYXJyYXlfcmVxdWlyZWRfdnVpZCA9PSAnIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLXBhcmFtZXRlciInOgorICAgICAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICAgICAgIyBUaGlzIGlzIGFuIGFycmF5IHdpdGggYSBwb2ludGVyIHRvIGEgY291bnQgdmFsdWUKKyAgICAgICAgICAgIGlmIGxlblZhbHVlLmlzcG9pbnRlcjoKKyAgICAgICAgICAgICAgICAjIElmIGNvdW50IGFuZCBhcnJheSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCwgdGhlcmUgd2lsbCBiZSBubyB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgaWYgdmFsdWVSZXF1aXJlZCA9PSAndHJ1ZScgb3IgbGVuUHRyUmVxdWlyZWQgPT0gJ3RydWUnIG9yIGxlblZhbHVlUmVxdWlyZWQgPT0gJ3RydWUnOgorICAgICAgICAgICAgICAgICAgICAjIFdoZW4gdGhlIGxlbmd0aCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyLCB0aGVyZSBpcyBhbiBleHRyYSBCb29sZWFuIHBhcmFtZXRlciBpbiB0aGUgZnVuY3Rpb24gY2FsbCB0byBpbmRpY2F0ZSBpZiBpdCBpcyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICBjaGVja0V4cHIuYXBwZW5kKCdza2lwIHw9IHZhbGlkYXRlX2FycmF5KCJ7fSIsIHtwcHB9IntsZG59IntwcHN9LCB7cHBwfSJ7ZG59IntwcHN9LCB7cGZ9e2xufSwgJntwZn17dm59LCB7fSwge30sIHt9LCB7fSwge30pO1xuJy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jUHJpbnROYW1lLCBsZW5QdHJSZXF1aXJlZCwgbGVuVmFsdWVSZXF1aXJlZCwgdmFsdWVSZXF1aXJlZCwgY291bnRfcmVxdWlyZWRfdnVpZCwgYXJyYXlfcmVxdWlyZWRfdnVpZCwgbG49bGVuVmFsdWUubmFtZSwgbGRuPWxlblByaW50TmFtZSwgZG49dmFsdWVQcmludE5hbWUsIHZuPXZhbHVlLm5hbWUsIHBmPXByZWZpeCwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICAgICAgIyBUaGlzIGlzIGFuIGFycmF5IHdpdGggYW4gaW50ZWdlciBjb3VudCB2YWx1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIElmIGNvdW50IGFuZCBhcnJheSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCwgdGhlcmUgd2lsbCBiZSBubyB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgaWYgdmFsdWVSZXF1aXJlZCA9PSAndHJ1ZScgb3IgbGVuVmFsdWVSZXF1aXJlZCA9PSAndHJ1ZSc6CisgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlLnR5cGUgIT0gJ2NoYXInOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tFeHByLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9hcnJheSgie30iLCB7cHBwfSJ7bGRufSJ7cHBzfSwge3BwcH0ie2RufSJ7cHBzfSwge3BmfXtsbn0sICZ7cGZ9e3ZufSwge30sIHt9LCB7fSwge30pO1xuJy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY1ByaW50TmFtZSwgbGVuVmFsdWVSZXF1aXJlZCwgdmFsdWVSZXF1aXJlZCwgY291bnRfcmVxdWlyZWRfdnVpZCwgYXJyYXlfcmVxdWlyZWRfdnVpZCwgbG49bGVuVmFsdWUubmFtZSwgbGRuPWxlblByaW50TmFtZSwgZG49dmFsdWVQcmludE5hbWUsIHZuPXZhbHVlLm5hbWUsIHBmPXByZWZpeCwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBBcnJheXMgb2Ygc3RyaW5ncyByZWNlaXZlIHNwZWNpYWwgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tFeHByLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9zdHJpbmdfYXJyYXkoInt9Iiwge3BwcH0ie2xkbn0ie3Bwc30sIHtwcHB9Intkbn0ie3Bwc30sIHtwZn17bG59LCB7cGZ9e3ZufSwge30sIHt9LCB7fSwge30pO1xuJy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY1ByaW50TmFtZSwgbGVuVmFsdWVSZXF1aXJlZCwgdmFsdWVSZXF1aXJlZCwgY291bnRfcmVxdWlyZWRfdnVpZCwgYXJyYXlfcmVxdWlyZWRfdnVpZCwgbG49bGVuVmFsdWUubmFtZSwgbGRuPWxlblByaW50TmFtZSwgZG49dmFsdWVQcmludE5hbWUsIHZuPXZhbHVlLm5hbWUsIHBmPXByZWZpeCwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICAgICAgaWYgY2hlY2tFeHByOgorICAgICAgICAgICAgICAgIGlmIGxlblZhbHVlIGFuZCAoJy0+JyBpbiBsZW5WYWx1ZS5uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgIyBBZGQgY2hlY2tzIHRvIGVuc3VyZSB0aGUgdmFsaWRhdGlvbiBjYWxsIGRvZXMgbm90IGRlcmVmZXJlbmNlIGEgTlVMTCBwb2ludGVyIHRvIG9idGFpbiB0aGUgY291bnQKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tFeHByID0gc2VsZi5nZW5DaGVja2VkTGVuZ3RoQ2FsbChsZW5WYWx1ZS5uYW1lLCBjaGVja0V4cHIpCisgICAgICAgICMgVGhpcyBpcyBhbiBpbmRpdmlkdWFsIHN0cnVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIE5VTEwKKyAgICAgICAgZWxpZiBub3QgdmFsdWUuaXNvcHRpb25hbDoKKyAgICAgICAgICAgICMgRnVuY3Rpb24gcG9pbnRlcnMgbmVlZCBhIHJlaW50ZXJwcmV0X2Nhc3QgdG8gdm9pZCoKKyAgICAgICAgICAgIHB0cl9yZXF1aXJlZF92dWlkID0gc2VsZi5HZXRWdWlkKHZ1aWRfdGFnX25hbWUsICIlcy1wYXJhbWV0ZXIiICUgKHZhbHVlLm5hbWUpKQorICAgICAgICAgICAgaWYgdmFsdWUudHlwZVs6NF0gPT0gJ1BGTl8nOgorICAgICAgICAgICAgICAgIGFsbG9jYXRvcl9kaWN0ID0geydwZm5BbGxvY2F0aW9uJzogJyJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5BbGxvY2F0aW9uLTAwNjMyIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BmblJlYWxsb2NhdGlvbic6ICciVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuUmVhbGxvY2F0aW9uLTAwNjMzIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BmbkZyZWUnOiAnIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2dWlkID0gYWxsb2NhdG9yX2RpY3QuZ2V0KHZhbHVlLm5hbWUpCisgICAgICAgICAgICAgICAgaWYgdnVpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHRyX3JlcXVpcmVkX3Z1aWQgPSB2dWlkCisgICAgICAgICAgICAgICAgY2hlY2tFeHByLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ7fSIsIHtwcHB9Int9IntwcHN9LCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPih7fXt9KSwge30pO1xuJy5mb3JtYXQoZnVuY1ByaW50TmFtZSwgdmFsdWVQcmludE5hbWUsIHByZWZpeCwgdmFsdWUubmFtZSwgcHRyX3JlcXVpcmVkX3Z1aWQsICoqcG9zdFByb2NTcGVjKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2hlY2tFeHByLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyKCJ7fSIsIHtwcHB9Int9IntwcHN9LCB7fXt9LCB7fSk7XG4nLmZvcm1hdChmdW5jUHJpbnROYW1lLCB2YWx1ZVByaW50TmFtZSwgcHJlZml4LCB2YWx1ZS5uYW1lLCBwdHJfcmVxdWlyZWRfdnVpZCwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIG9wdGlvbmFsIGludGVybmFsIGFsbG9jYXRpb24gZnVuY3Rpb24gcG9pbnRlcnMuCisgICAgICAgICAgICBpZiAodmFsdWUudHlwZSwgdmFsdWUubmFtZSkgPT0gKCdQRk5fdmtJbnRlcm5hbEFsbG9jYXRpb25Ob3RpZmljYXRpb24nLCAncGZuSW50ZXJuYWxBbGxvY2F0aW9uJyk6CisgICAgICAgICAgICAgICAgY2hlY2tFeHByLmV4dGVuZChzZWxmLmludGVybmFsQWxsb2NhdGlvbkNoZWNrKGZ1bmNQcmludE5hbWUsIHByZWZpeCwgdmFsdWUubmFtZSwgJ3BmbkludGVybmFsRnJlZScsIHBvc3RQcm9jU3BlYykpCisgICAgICAgICAgICBlbGlmICh2YWx1ZS50eXBlLCB2YWx1ZS5uYW1lKSA9PSAoJ1BGTl92a0ludGVybmFsRnJlZU5vdGlmaWNhdGlvbicsICdwZm5JbnRlcm5hbEZyZWUnKToKKyAgICAgICAgICAgICAgICBjaGVja0V4cHIuZXh0ZW5kKHNlbGYuaW50ZXJuYWxBbGxvY2F0aW9uQ2hlY2soZnVuY1ByaW50TmFtZSwgcHJlZml4LCB2YWx1ZS5uYW1lLCAncGZuSW50ZXJuYWxBbGxvY2F0aW9uJywgcG9zdFByb2NTcGVjKSkKKyAgICAgICAgcmV0dXJuIGNoZWNrRXhwcgorCisgICAgIworICAgICMgR2VuZXJhdGUgaW50ZXJuYWwgYWxsb2NhdGlvbiBmdW5jdGlvbiBwb2ludGVyIGNoZWNrLgorICAgIGRlZiBpbnRlcm5hbEFsbG9jYXRpb25DaGVjayhzZWxmLCBmdW5jUHJpbnROYW1lLCBwcmVmaXgsIG5hbWUsIGNvbXBsZW1lbnRhcnlOYW1lLCBwb3N0UHJvY1NwZWMpOgorICAgICAgICBjaGVja0V4cHIgPSBbXQorICAgICAgICB2dWlkID0gJyJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiJworICAgICAgICBjaGVja0V4cHIuYXBwZW5kKCdpZiAoe317fSAhPSBOVUxMKScuZm9ybWF0KHByZWZpeCwgbmFtZSkpCisgICAgICAgIGNoZWNrRXhwci5hcHBlbmQoJ3snKQorICAgICAgICBsb2NhbF9pbmRlbnQgPSBzZWxmLmluY0luZGVudCgnJykKKyAgICAgICAgIyBGdW5jdGlvbiBwb2ludGVycyBuZWVkIGEgcmVpbnRlcnByZXRfY2FzdCB0byB2b2lkKgorICAgICAgICBjaGVja0V4cHIuYXBwZW5kKGxvY2FsX2luZGVudCArICdza2lwIHw9IHZhbGlkYXRlX3JlcXVpcmVkX3BvaW50ZXIoInt9Iiwge3BwcH0ie317fSJ7cHBzfSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oe317fSksIHt9KTtcbicuZm9ybWF0KGZ1bmNQcmludE5hbWUsIHByZWZpeCwgY29tcGxlbWVudGFyeU5hbWUsIHByZWZpeCwgY29tcGxlbWVudGFyeU5hbWUsIHZ1aWQsICoqcG9zdFByb2NTcGVjKSkKKyAgICAgICAgY2hlY2tFeHByLmFwcGVuZCgnfVxuJykKKyAgICAgICAgcmV0dXJuIGNoZWNrRXhwcgorCisgICAgIworICAgICMgUHJvY2VzcyBzdHJ1Y3QgbWVtYmVyIHZhbGlkYXRpb24gY29kZSwgcGVyZm9ybWluZyBuYW1lIHN1YnN0aXR1dGlvbiBpZiByZXF1aXJlZAorICAgIGRlZiBwcm9jZXNzU3RydWN0TWVtYmVyQ29kZShzZWxmLCBsaW5lLCBmdW5jTmFtZSwgbWVtYmVyTmFtZVByZWZpeCwgbWVtYmVyRGlzcGxheU5hbWVQcmVmaXgsIHBvc3RQcm9jU3BlYyk6CisgICAgICAgICMgQnVpbGQgZm9ybWF0IHNwZWNpZmllciBsaXN0CisgICAgICAgIGt3YXJncyA9IHt9CisgICAgICAgIGlmICd7cG9zdFByb2NQcmVmaXh9JyBpbiBsaW5lOgorICAgICAgICAgICAgIyBJZiB3ZSBoYXZlIGEgdHVwbGUgdGhhdCBpbmNsdWRlcyBhIGZvcm1hdCBzdHJpbmcgYW5kIGZvcm1hdCBwYXJhbWV0ZXJzLCBuZWVkIHRvIHVzZSBQYXJhbWV0ZXJOYW1lIGNsYXNzCisgICAgICAgICAgICBpZiB0eXBlKG1lbWJlckRpc3BsYXlOYW1lUHJlZml4KSBpcyB0dXBsZToKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ3Bvc3RQcm9jUHJlZml4J10gPSAnUGFyYW1ldGVyTmFtZSgnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGt3YXJnc1sncG9zdFByb2NQcmVmaXgnXSA9IHBvc3RQcm9jU3BlY1sncHBwJ10KKyAgICAgICAgaWYgJ3twb3N0UHJvY1N1ZmZpeH0nIGluIGxpbmU6CisgICAgICAgICAgICAjIElmIHdlIGhhdmUgYSB0dXBsZSB0aGF0IGluY2x1ZGVzIGEgZm9ybWF0IHN0cmluZyBhbmQgZm9ybWF0IHBhcmFtZXRlcnMsIG5lZWQgdG8gdXNlIFBhcmFtZXRlck5hbWUgY2xhc3MKKyAgICAgICAgICAgIGlmIHR5cGUobWVtYmVyRGlzcGxheU5hbWVQcmVmaXgpIGlzIHR1cGxlOgorICAgICAgICAgICAgICAgIGt3YXJnc1sncG9zdFByb2NTdWZmaXgnXSA9ICcsIFBhcmFtZXRlck5hbWU6OkluZGV4VmVjdG9ye3sge317fSB9fSknLmZvcm1hdChwb3N0UHJvY1NwZWNbJ3BwaSddLCBtZW1iZXJEaXNwbGF5TmFtZVByZWZpeFsxXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAga3dhcmdzWydwb3N0UHJvY1N1ZmZpeCddID0gcG9zdFByb2NTcGVjWydwcHMnXQorICAgICAgICBpZiAne3Bvc3RQcm9jSW5zZXJ0fScgaW4gbGluZToKKyAgICAgICAgICAgICMgSWYgd2UgaGF2ZSBhIHR1cGxlIHRoYXQgaW5jbHVkZXMgYSBmb3JtYXQgc3RyaW5nIGFuZCBmb3JtYXQgcGFyYW1ldGVycywgbmVlZCB0byB1c2UgUGFyYW1ldGVyTmFtZSBjbGFzcworICAgICAgICAgICAgaWYgdHlwZShtZW1iZXJEaXNwbGF5TmFtZVByZWZpeCkgaXMgdHVwbGU6CisgICAgICAgICAgICAgICAga3dhcmdzWydwb3N0UHJvY0luc2VydCddID0gJ3t9e30sICcuZm9ybWF0KHBvc3RQcm9jU3BlY1sncHBpJ10sIG1lbWJlckRpc3BsYXlOYW1lUHJlZml4WzFdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ3Bvc3RQcm9jSW5zZXJ0J10gPSBwb3N0UHJvY1NwZWNbJ3BwaSddCisgICAgICAgIGlmICd7ZnVuY05hbWV9JyBpbiBsaW5lOgorICAgICAgICAgICAga3dhcmdzWydmdW5jTmFtZSddID0gZnVuY05hbWUKKyAgICAgICAgaWYgJ3t2YWx1ZVByZWZpeH0nIGluIGxpbmU6CisgICAgICAgICAgICBrd2FyZ3NbJ3ZhbHVlUHJlZml4J10gPSBtZW1iZXJOYW1lUHJlZml4CisgICAgICAgIGlmICd7ZGlzcGxheU5hbWVQcmVmaXh9JyBpbiBsaW5lOgorICAgICAgICAgICAgIyBDaGVjayBmb3IgYSB0dXBsZSB0aGF0IGluY2x1ZGVzIGEgZm9ybWF0IHN0cmluZyBhbmQgZm9ybWF0IHBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHRoZSBQYXJhbWV0ZXJOYW1lIGNsYXNzCisgICAgICAgICAgICBpZiB0eXBlKG1lbWJlckRpc3BsYXlOYW1lUHJlZml4KSBpcyB0dXBsZToKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2Rpc3BsYXlOYW1lUHJlZml4J10gPSBtZW1iZXJEaXNwbGF5TmFtZVByZWZpeFswXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2Rpc3BsYXlOYW1lUHJlZml4J10gPSBtZW1iZXJEaXNwbGF5TmFtZVByZWZpeAorCisgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgICMgTmVlZCB0byBlc2NhcGUgdGhlIEMrKyBjdXJseSBicmFjZXMKKyAgICAgICAgICAgIGlmICdJbmRleFZlY3RvcicgaW4gbGluZToKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdJbmRleFZlY3RvcnsgJywgJ0luZGV4VmVjdG9ye3sgJykKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCcgfSksJywgJyB9fSksJykKKyAgICAgICAgICAgIHJldHVybiBsaW5lLmZvcm1hdCgqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAjCisgICAgIyBQcm9jZXNzIHN0cnVjdCBtZW1iZXIgdmFsaWRhdGlvbiBjb2RlLCBzdHJpcHBpbmcgbWV0YWRhdGEKKyAgICBkZWYgU2NydWJTdHJ1Y3RDb2RlKHNlbGYsIGNvZGUpOgorICAgICAgICBzY3J1YmJlZF9saW5lcyA9ICcnCisgICAgICAgIGZvciBsaW5lIGluIGNvZGU6CisgICAgICAgICAgICBpZiAndmFsaWRhdGVfc3RydWN0X3BuZXh0JyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiAnYWxsb3dlZF9zdHJ1Y3RzJyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiAneG1sLWRyaXZlbiB2YWxpZGF0aW9uJyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCd7cG9zdFByb2NQcmVmaXh9JywgJycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCd7cG9zdFByb2NTdWZmaXh9JywgJycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCd7cG9zdFByb2NJbnNlcnR9JywgJycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCd7ZnVuY05hbWV9JywgJycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCd7dmFsdWVQcmVmaXh9JywgJycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCd7ZGlzcGxheU5hbWVQcmVmaXh9JywgJycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCd7SW5kZXhWZWN0b3J9JywgJycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdsb2NhbF9kYXRhLT4nLCAnJykKKyAgICAgICAgICAgIHNjcnViYmVkX2xpbmVzICs9IGxpbmUKKyAgICAgICAgcmV0dXJuIHNjcnViYmVkX2xpbmVzCisgICAgIworICAgICMgUHJvY2VzcyBzdHJ1Y3QgdmFsaWRhdGlvbiBjb2RlIGZvciBpbmNsdXNpb24gaW4gZnVuY3Rpb24gb3IgcGFyZW50IHN0cnVjdCB2YWxpZGF0aW9uIGNvZGUKKyAgICBkZWYgZXhwYW5kU3RydWN0Q29kZShzZWxmLCBpdGVtX3R5cGUsIGZ1bmNOYW1lLCBtZW1iZXJOYW1lUHJlZml4LCBtZW1iZXJEaXNwbGF5TmFtZVByZWZpeCwgaW5kZW50LCBvdXRwdXQsIHBvc3RQcm9jU3BlYyk6CisgICAgICAgIGxpbmVzID0gc2VsZi52YWxpZGF0ZWRTdHJ1Y3RzW2l0ZW1fdHlwZV0KKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBpZiBvdXRwdXQ6CisgICAgICAgICAgICAgICAgb3V0cHV0Wy0xXSArPSAnXG4nCisgICAgICAgICAgICBpZiB0eXBlKGxpbmUpIGlzIGxpc3Q6CisgICAgICAgICAgICAgICAgZm9yIHN1YiBpbiBsaW5lOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHNlbGYucHJvY2Vzc1N0cnVjdE1lbWJlckNvZGUoaW5kZW50ICsgc3ViLCBmdW5jTmFtZSwgbWVtYmVyTmFtZVByZWZpeCwgbWVtYmVyRGlzcGxheU5hbWVQcmVmaXgsIHBvc3RQcm9jU3BlYykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoc2VsZi5wcm9jZXNzU3RydWN0TWVtYmVyQ29kZShpbmRlbnQgKyBsaW5lLCBmdW5jTmFtZSwgbWVtYmVyTmFtZVByZWZpeCwgbWVtYmVyRGlzcGxheU5hbWVQcmVmaXgsIHBvc3RQcm9jU3BlYykpCisgICAgICAgIHJldHVybiBvdXRwdXQKKyAgICAjCisgICAgIyBQcm9jZXNzIHN0cnVjdCBwb2ludGVyL2FycmF5IHZhbGlkYXRpb24gY29kZSwgcGVyZm9ybWluZyBuYW1lIHN1YnN0aXR1dGlvbiBpZiByZXF1aXJlZAorICAgIGRlZiBleHBhbmRTdHJ1Y3RQb2ludGVyQ29kZShzZWxmLCBwcmVmaXgsIHZhbHVlLCBsZW5WYWx1ZSwgZnVuY05hbWUsIHZhbHVlRGlzcGxheU5hbWUsIHBvc3RQcm9jU3BlYyk6CisgICAgICAgIGV4cHIgPSBbXQorICAgICAgICBleHByLmFwcGVuZCgnaWYgKHt9e30gIT0gTlVMTClcbicuZm9ybWF0KHByZWZpeCwgdmFsdWUubmFtZSkpCisgICAgICAgIGV4cHIuYXBwZW5kKCd7JykKKyAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoTm9uZSkKKyAgICAgICAgaWYgbGVuVmFsdWU6CisgICAgICAgICAgICAjIE5lZWQgdG8gcHJvY2VzcyBhbGwgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgICAgICAgICAgICBpbmRleE5hbWUgPSBsZW5WYWx1ZS5uYW1lLnJlcGxhY2UoJ0NvdW50JywgJ0luZGV4JykKKyAgICAgICAgICAgIGV4cHJbLTFdICs9ICdcbicKKyAgICAgICAgICAgIGlmIGxlblZhbHVlLmlzcG9pbnRlcjoKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBsZW5ndGggdmFsdWUgaXMgYSBwb2ludGVyLCBkZS1yZWZlcmVuY2UgaXQgZm9yIHRoZSBjb3VudC4KKyAgICAgICAgICAgICAgICBleHByLmFwcGVuZChpbmRlbnQgKyAnZm9yICh1aW50MzJfdCB7aW5hbWV9ID0gMDsge2luYW1lfSA8ICp7fXt9OyArK3tpbmFtZX0pXG4nLmZvcm1hdChwcmVmaXgsIGxlblZhbHVlLm5hbWUsIGluYW1lPWluZGV4TmFtZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4cHIuYXBwZW5kKGluZGVudCArICdmb3IgKHVpbnQzMl90IHtpbmFtZX0gPSAwOyB7aW5hbWV9IDwge317fTsgKyt7aW5hbWV9KVxuJy5mb3JtYXQocHJlZml4LCBsZW5WYWx1ZS5uYW1lLCBpbmFtZT1pbmRleE5hbWUpKQorICAgICAgICAgICAgZXhwci5hcHBlbmQoaW5kZW50ICsgJ3snKQorICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbmNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgIyBQcmVmaXggZm9yIHZhbHVlIG5hbWUgdG8gZGlzcGxheSBpbiBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICBpZiB2YWx1ZS5pc3BvaW50ZXIgPT0gMjoKKyAgICAgICAgICAgICAgICBtZW1iZXJOYW1lUHJlZml4ID0gJ3t9e31be31dLT4nLmZvcm1hdChwcmVmaXgsIHZhbHVlLm5hbWUsIGluZGV4TmFtZSkKKyAgICAgICAgICAgICAgICBtZW1iZXJEaXNwbGF5TmFtZVByZWZpeCA9ICgne31bJWldLT4nLmZvcm1hdCh2YWx1ZURpc3BsYXlOYW1lKSwgaW5kZXhOYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZW1iZXJOYW1lUHJlZml4ID0gJ3t9e31be31dLicuZm9ybWF0KHByZWZpeCwgdmFsdWUubmFtZSwgaW5kZXhOYW1lKQorICAgICAgICAgICAgICAgIG1lbWJlckRpc3BsYXlOYW1lUHJlZml4ID0gKCd7fVslaV0uJy5mb3JtYXQodmFsdWVEaXNwbGF5TmFtZSksIGluZGV4TmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1lbWJlck5hbWVQcmVmaXggPSAne317fS0+Jy5mb3JtYXQocHJlZml4LCB2YWx1ZS5uYW1lKQorICAgICAgICAgICAgbWVtYmVyRGlzcGxheU5hbWVQcmVmaXggPSAne30tPicuZm9ybWF0KHZhbHVlRGlzcGxheU5hbWUpCisgICAgICAgICMgRXhwYW5kIHRoZSBzdHJ1Y3QgdmFsaWRhdGlvbiBsaW5lcworICAgICAgICBleHByID0gc2VsZi5leHBhbmRTdHJ1Y3RDb2RlKHZhbHVlLnR5cGUsIGZ1bmNOYW1lLCBtZW1iZXJOYW1lUHJlZml4LCBtZW1iZXJEaXNwbGF5TmFtZVByZWZpeCwgaW5kZW50LCBleHByLCBwb3N0UHJvY1NwZWMpCisgICAgICAgIGlmIGxlblZhbHVlOgorICAgICAgICAgICAgIyBDbG9zZSBpZiBhbmQgZm9yIHNjb3BlcworICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5kZWNJbmRlbnQoaW5kZW50KQorICAgICAgICAgICAgZXhwci5hcHBlbmQoaW5kZW50ICsgJ31cbicpCisgICAgICAgIGV4cHIuYXBwZW5kKCd9XG4nKQorICAgICAgICByZXR1cm4gZXhwcgorICAgICMKKyAgICAjIEdlbmVyYXRlIHRoZSBwYXJhbWV0ZXIgY2hlY2tpbmcgY29kZQorICAgIGRlZiBnZW5GdW5jQm9keShzZWxmLCBmdW5jTmFtZSwgdmFsdWVzLCB2YWx1ZVByZWZpeCwgZGlzcGxheU5hbWVQcmVmaXgsIHN0cnVjdFR5cGVOYW1lKToKKyAgICAgICAgbGluZXMgPSBbXSAgICAjIEdlbmVyYXRlZCBsaW5lcyBvZiBjb2RlCisgICAgICAgIHVudXNlZCA9IFtdICAgIyBVbnVzZWQgdmFyaWFibGUgbmFtZXMKKyAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKKyAgICAgICAgICAgIHVzZWRMaW5lcyA9IFtdCisgICAgICAgICAgICBsZW5QYXJhbSA9IE5vbmUKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgUHJlZml4IGFuZCBzdWZmaXggZm9yIHBvc3QgcHJvY2Vzc2luZyBvZiBwYXJhbWV0ZXIgbmFtZXMgZm9yIHN0cnVjdCBtZW1iZXJzLiAgQXJyYXlzIG9mIHN0cnVjdHVyZXMgbmVlZCBzcGVjaWFsIHByb2Nlc3NpbmcgdG8gaW5jbHVkZSB0aGUgYXJyYXkgaW5kZXggaW4gdGhlIGZ1bGwgcGFyYW1ldGVyIG5hbWUuCisgICAgICAgICAgICBwb3N0UHJvY1NwZWMgPSB7fQorICAgICAgICAgICAgcG9zdFByb2NTcGVjWydwcHAnXSA9ICcnIGlmIG5vdCBzdHJ1Y3RUeXBlTmFtZSBlbHNlICd7cG9zdFByb2NQcmVmaXh9JworICAgICAgICAgICAgcG9zdFByb2NTcGVjWydwcHMnXSA9ICcnIGlmIG5vdCBzdHJ1Y3RUeXBlTmFtZSBlbHNlICd7cG9zdFByb2NTdWZmaXh9JworICAgICAgICAgICAgcG9zdFByb2NTcGVjWydwcGknXSA9ICcnIGlmIG5vdCBzdHJ1Y3RUeXBlTmFtZSBlbHNlICd7cG9zdFByb2NJbnNlcnR9JworICAgICAgICAgICAgIworICAgICAgICAgICAgIyBHZW5lcmF0ZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSB2YWx1ZSwgd2hpY2ggd2lsbCBiZSBwcmludGVkIGluIHRoZSBlcnJvciBtZXNzYWdlLCBieSBhZGRpbmcgdGhlIHZhcmlhYmxlIHByZWZpeCB0byB0aGUgdmFsdWUgbmFtZQorICAgICAgICAgICAgdmFsdWVEaXNwbGF5TmFtZSA9ICd7fXt9Jy5mb3JtYXQoZGlzcGxheU5hbWVQcmVmaXgsIHZhbHVlLm5hbWUpCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzLCBpZ25vcmUgdGhlIGluLW91dCBjb3VudCBwYXJhbWV0ZXJzIHRoYXQKKyAgICAgICAgICAgICMgd2lsbCBiZSB2YWxpZGF0ZWQgd2l0aCB0aGVpciBhc3NvY2lhdGVkIGFycmF5CisgICAgICAgICAgICBpZiAodmFsdWUuaXNwb2ludGVyIG9yIHZhbHVlLmlzc3RhdGljYXJyYXkpIGFuZCBub3QgdmFsdWUuaXNjb3VudDoKKyAgICAgICAgICAgICAgICAjIFBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50IGdlbmVyYXRpb24KKyAgICAgICAgICAgICAgICByZXEgPSAndHJ1ZScgICAgIyBQYXJhbWV0ZXIgY2Fubm90IGJlIE5VTEwKKyAgICAgICAgICAgICAgICBjcFJlcSA9ICd0cnVlJyAgIyBDb3VudCBwb2ludGVyIGNhbm5vdCBiZSBOVUxMCisgICAgICAgICAgICAgICAgY3ZSZXEgPSAndHJ1ZScgICMgQ291bnQgdmFsdWUgY2Fubm90IGJlIDAKKyAgICAgICAgICAgICAgICBsZW5EaXNwbGF5TmFtZSA9IE5vbmUgIyBOYW1lIG9mIGxlbmd0aCBwYXJhbWV0ZXIgdG8gcHJpbnQgd2l0aCB2YWxpZGF0aW9uIG1lc3NhZ2VzOyBwYXJhbWV0ZXIgbmFtZSB3aXRoIHByZWZpeCBhcHBsaWVkCisgICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSByZXF1aXJlZC9vcHRpb25hbCBwYXJhbWV0ZXIgc3RyaW5ncyBmb3IgdGhlIHBvaW50ZXIgYW5kIGNvdW50IHZhbHVlcworICAgICAgICAgICAgICAgIGlmIHZhbHVlLmlzb3B0aW9uYWw6CisgICAgICAgICAgICAgICAgICAgIHJlcSA9ICdmYWxzZScKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZS5sZW46CisgICAgICAgICAgICAgICAgICAgICMgVGhlIHBhcmFtZXRlciBpcyBhbiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGNvdW50IHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICBsZW5QYXJhbSA9IHNlbGYuZ2V0TGVuUGFyYW0odmFsdWVzLCB2YWx1ZS5sZW4pCisgICAgICAgICAgICAgICAgICAgIGxlbkRpc3BsYXlOYW1lID0gJ3t9e30nLmZvcm1hdChkaXNwbGF5TmFtZVByZWZpeCwgbGVuUGFyYW0ubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuUGFyYW0uaXNwb2ludGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBDb3VudCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBvaW50ZXJzIGFyZSBpbm91dAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShsZW5QYXJhbS5pc29wdGlvbmFsKSBpcyBsaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlblBhcmFtLmlzb3B0aW9uYWxbMF06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwUmVxID0gJ2ZhbHNlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlblBhcmFtLmlzb3B0aW9uYWxbMV06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2UmVxID0gJ2ZhbHNlJworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW5QYXJhbS5pc29wdGlvbmFsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcFJlcSA9ICdmYWxzZScKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlblBhcmFtLmlzb3B0aW9uYWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZSZXEgPSAnZmFsc2UnCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgVGhlIHBhcmFtZXRlciB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgd2hlbiB0YWdnZWQgYXMgJ25vYXV0b3ZhbGlkaXR5JworICAgICAgICAgICAgICAgICMgRm9yIHRoZSBwb2ludGVyIHRvIHN0cnVjdCBjYXNlLCB0aGUgc3RydWN0IHBvaW50ZXIgd2lsbCBub3QgYmUgdmFsaWRhdGVkLCBidXQgYW55CisgICAgICAgICAgICAgICAgIyBtZW1iZXJzIG5vdCB0YWdnZWQgYXMgJ25vYXV0b3ZhbGlkaXR5JyB3aWxsIGJlIHZhbGlkYXRlZAorICAgICAgICAgICAgICAgICMgV2Ugc3BlY2lhbC1jYXNlIHRoZSBjdXN0b20gYWxsb2NhdG9yIGNoZWNrcywgYXMgdGhleSBhcmUgZXhwbGljaXQgYnV0IGNhbiBiZSBhdXRvLWdlbmVyYXRlZC4KKyAgICAgICAgICAgICAgICBBbGxvY2F0b3JGdW5jdGlvbnMgPSBbJ1BGTl92a0FsbG9jYXRpb25GdW5jdGlvbicsICdQRk5fdmtSZWFsbG9jYXRpb25GdW5jdGlvbicsICdQRk5fdmtGcmVlRnVuY3Rpb24nLCAnUEZOX3ZrSW50ZXJuYWxBbGxvY2F0aW9uTm90aWZpY2F0aW9uJywgJ1BGTl92a0ludGVybmFsRnJlZU5vdGlmaWNhdGlvbiddCisgICAgICAgICAgICAgICAgaWYgdmFsdWUubm9hdXRvdmFsaWRpdHkgYW5kIHZhbHVlLnR5cGUgbm90IGluIEFsbG9jYXRvckZ1bmN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgIyBMb2cgYSBkaWFnbm9zdGljIG1lc3NhZ2Ugd2hlbiB2YWxpZGF0aW9uIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBhbmQgbXVzdCBiZSBpbXBsZW1lbnRlZCBtYW51YWxseQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ01zZygnZGlhZycsICdQYXJhbWV0ZXJWYWxpZGF0aW9uOiBObyB2YWxpZGF0aW9uIGZvciB7fSB7fScuZm9ybWF0KHN0cnVjdFR5cGVOYW1lIGlmIHN0cnVjdFR5cGVOYW1lIGVsc2UgZnVuY05hbWUsIHZhbHVlLm5hbWUpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlLnR5cGUgaW4gc2VsZi5zdHJ1Y3RUeXBlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgdGhpcyBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3Qgd2l0aCBhbiBzVHlwZSBmaWVsZCwgdmVyaWZ5IHRoZSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkTGluZXMgKz0gc2VsZi5tYWtlU3RydWN0VHlwZUNoZWNrKHZhbHVlUHJlZml4LCB2YWx1ZSwgbGVuUGFyYW0sIHJlcSwgY3ZSZXEsIGNwUmVxLCBmdW5jTmFtZSwgbGVuRGlzcGxheU5hbWUsIHZhbHVlRGlzcGxheU5hbWUsIHBvc3RQcm9jU3BlYywgc3RydWN0VHlwZU5hbWUpCisgICAgICAgICAgICAgICAgICAgICMgSWYgdGhpcyBpcyBhbiBpbnB1dCBoYW5kbGUgYXJyYXkgdGhhdCBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIE5VTEwgaGFuZGxlcywgdmVyaWZ5IHRoYXQgbm9uZSBvZiB0aGUgaGFuZGxlcyBhcmUgVktfTlVMTF9IQU5ETEUKKyAgICAgICAgICAgICAgICAgICAgZWxpZiB2YWx1ZS50eXBlIGluIHNlbGYuaGFuZGxlVHlwZXMgYW5kIHZhbHVlLmlzY29uc3QgYW5kIG5vdCBzZWxmLmlzSGFuZGxlT3B0aW9uYWwodmFsdWUsIGxlblBhcmFtKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRMaW5lcyArPSBzZWxmLm1ha2VIYW5kbGVDaGVjayh2YWx1ZVByZWZpeCwgdmFsdWUsIGxlblBhcmFtLCByZXEsIGN2UmVxLCBmdW5jTmFtZSwgbGVuRGlzcGxheU5hbWUsIHZhbHVlRGlzcGxheU5hbWUsIHBvc3RQcm9jU3BlYykKKyAgICAgICAgICAgICAgICAgICAgZWxpZiB2YWx1ZS50eXBlIGluIHNlbGYuZmxhZ3MgYW5kIHZhbHVlLmlzY29uc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkTGluZXMgKz0gc2VsZi5tYWtlRmxhZ3NBcnJheUNoZWNrKHZhbHVlUHJlZml4LCB2YWx1ZSwgbGVuUGFyYW0sIHJlcSwgY3ZSZXEsIGZ1bmNOYW1lLCBsZW5EaXNwbGF5TmFtZSwgdmFsdWVEaXNwbGF5TmFtZSwgcG9zdFByb2NTcGVjKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlLmlzYm9vbCBhbmQgdmFsdWUuaXNjb25zdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRMaW5lcy5hcHBlbmQoJ3NraXAgfD0gdmFsaWRhdGVfYm9vbDMyX2FycmF5KCJ7fSIsIHtwcHB9Int9IntwcHN9LCB7cHBwfSJ7fSJ7cHBzfSwge3BmfXt9LCB7cGZ9e30sIHt9LCB7fSk7XG4nLmZvcm1hdChmdW5jTmFtZSwgbGVuRGlzcGxheU5hbWUsIHZhbHVlRGlzcGxheU5hbWUsIGxlblBhcmFtLm5hbWUsIHZhbHVlLm5hbWUsIGN2UmVxLCByZXEsIHBmPXZhbHVlUHJlZml4LCAqKnBvc3RQcm9jU3BlYykpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgdmFsdWUuaXNyYW5nZWRlbnVtIGFuZCB2YWx1ZS5pc2NvbnN0OgorICAgICAgICAgICAgICAgICAgICAgICAgZW51bV92YWx1ZV9saXN0ID0gJ0FsbCVzRW51bXMnICUgdmFsdWUudHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgdXNlZExpbmVzLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9yYW5nZWRfZW51bV9hcnJheSgie30iLCB7cHBwfSJ7fSJ7cHBzfSwge3BwcH0ie30ie3Bwc30sICJ7fSIsIHt9LCB7cGZ9e30sIHtwZn17fSwge30sIHt9KTtcbicuZm9ybWF0KGZ1bmNOYW1lLCBsZW5EaXNwbGF5TmFtZSwgdmFsdWVEaXNwbGF5TmFtZSwgdmFsdWUudHlwZSwgZW51bV92YWx1ZV9saXN0LCBsZW5QYXJhbS5uYW1lLCB2YWx1ZS5uYW1lLCBjdlJlcSwgcmVxLCBwZj12YWx1ZVByZWZpeCwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlLm5hbWUgPT0gJ3BOZXh0JyBhbmQgdmFsdWUuaXNjb25zdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRMaW5lcyArPSBzZWxmLm1ha2VTdHJ1Y3ROZXh0Q2hlY2sodmFsdWVQcmVmaXgsIHZhbHVlLCBmdW5jTmFtZSwgdmFsdWVEaXNwbGF5TmFtZSwgcG9zdFByb2NTcGVjLCBzdHJ1Y3RUeXBlTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRMaW5lcyArPSBzZWxmLm1ha2VQb2ludGVyQ2hlY2sodmFsdWVQcmVmaXgsIHZhbHVlLCBsZW5QYXJhbSwgcmVxLCBjdlJlcSwgY3BSZXEsIGZ1bmNOYW1lLCBsZW5EaXNwbGF5TmFtZSwgdmFsdWVEaXNwbGF5TmFtZSwgcG9zdFByb2NTcGVjLCBzdHJ1Y3RUeXBlTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCAoaW5wdXQpLCBzZWUgaWYgaXQgY29udGFpbnMgbWVtYmVycyB0aGF0IG5lZWQgdG8gYmUgY2hlY2tlZAorICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZS50eXBlIGluIHNlbGYudmFsaWRhdGVkU3RydWN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlLmlzY29uc3Q6ICMgb3IgdmFsdWUudHlwZSBpbiBzZWxmLnJldHVybmVkb25seV9zdHJ1Y3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRMaW5lcy5hcHBlbmQoc2VsZi5leHBhbmRTdHJ1Y3RQb2ludGVyQ29kZSh2YWx1ZVByZWZpeCwgdmFsdWUsIGxlblBhcmFtLCBmdW5jTmFtZSwgdmFsdWVEaXNwbGF5TmFtZSwgcG9zdFByb2NTcGVjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdmFsdWUudHlwZSBpbiBzZWxmLnJldHVybmVkb25seV9zdHJ1Y3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRMaW5lcy5hcHBlbmQoc2VsZi5leHBhbmRTdHJ1Y3RQb2ludGVyQ29kZSh2YWx1ZVByZWZpeCwgdmFsdWUsIGxlblBhcmFtLCBmdW5jTmFtZSwgdmFsdWVEaXNwbGF5TmFtZSwgcG9zdFByb2NTcGVjKSkKKyAgICAgICAgICAgICMgTm9uLXBvaW50ZXIgdHlwZXMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGUgcGFyYW1ldGVyIHdpbGwgbm90IGJlIHByb2Nlc3NlcyB3aGVuIHRhZ2dlZCBhcyAnbm9hdXRvdmFsaWRpdHknCisgICAgICAgICAgICAgICAgIyBGb3IgdGhlIHN0cnVjdCBjYXNlLCB0aGUgc3RydWN0IHR5cGUgd2lsbCBub3QgYmUgdmFsaWRhdGVkLCBidXQgYW55CisgICAgICAgICAgICAgICAgIyBtZW1iZXJzIG5vdCB0YWdnZWQgYXMgJ25vYXV0b3ZhbGlkaXR5JyB3aWxsIGJlIHZhbGlkYXRlZAorICAgICAgICAgICAgICAgIGlmIHZhbHVlLm5vYXV0b3ZhbGlkaXR5OgorICAgICAgICAgICAgICAgICAgICAjIExvZyBhIGRpYWdub3N0aWMgbWVzc2FnZSB3aGVuIHZhbGlkYXRpb24gY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGFuZCBtdXN0IGJlIGltcGxlbWVudGVkIG1hbnVhbGx5CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nTXNnKCdkaWFnJywgJ1BhcmFtZXRlclZhbGlkYXRpb246IE5vIHZhbGlkYXRpb24gZm9yIHt9IHt9Jy5mb3JtYXQoc3RydWN0VHlwZU5hbWUgaWYgc3RydWN0VHlwZU5hbWUgZWxzZSBmdW5jTmFtZSwgdmFsdWUubmFtZSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdnVpZF9uYW1lX3RhZyA9IHN0cnVjdFR5cGVOYW1lIGlmIHN0cnVjdFR5cGVOYW1lIGlzIG5vdCBOb25lIGVsc2UgZnVuY05hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUudHlwZSBpbiBzZWxmLnN0cnVjdFR5cGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5cGUgPSBzZWxmLnN0cnVjdFR5cGVzW3ZhbHVlLnR5cGVdCisgICAgICAgICAgICAgICAgICAgICAgICB2dWlkID0gc2VsZi5HZXRWdWlkKHZhbHVlLnR5cGUsICJzVHlwZS1zVHlwZSIpCisgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWRfdnVpZCA9ICcia1ZVSURVbmRlZmluZWQiJworICAgICAgICAgICAgICAgICAgICAgICAgdXNlZExpbmVzLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9zdHJ1Y3RfdHlwZSgie30iLCB7cHBwfSJ7fSJ7cHBzfSwgIntzdn0iLCAmKHt9e3ZufSksIHtzdn0sIGZhbHNlLCBrVlVJRFVuZGVmaW5lZCwge30pO1xuJy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY05hbWUsIHZhbHVlRGlzcGxheU5hbWUsIHZhbHVlUHJlZml4LCB2dWlkLCB2bj12YWx1ZS5uYW1lLCBzdj1zdHlwZSwgdnQ9dmFsdWUudHlwZSwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlLnR5cGUgaW4gc2VsZi5oYW5kbGVUeXBlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzSGFuZGxlT3B0aW9uYWwodmFsdWUsIE5vbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRMaW5lcy5hcHBlbmQoJ3NraXAgfD0gdmFsaWRhdGVfcmVxdWlyZWRfaGFuZGxlKCJ7fSIsIHtwcHB9Int9IntwcHN9LCB7fXt9KTtcbicuZm9ybWF0KGZ1bmNOYW1lLCB2YWx1ZURpc3BsYXlOYW1lLCB2YWx1ZVByZWZpeCwgdmFsdWUubmFtZSwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlLnR5cGUgaW4gc2VsZi5mbGFncyBhbmQgdmFsdWUudHlwZS5yZXBsYWNlKCdGbGFncycsICdGbGFnQml0cycpIG5vdCBpbiBzZWxmLmZsYWdCaXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgdnVpZCA9IHNlbGYuR2V0VnVpZCh2dWlkX25hbWVfdGFnLCAiJXMtemVyb2JpdG1hc2siICUgKHZhbHVlLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgdXNlZExpbmVzLmFwcGVuZCgnc2tpcCB8PSB2YWxpZGF0ZV9yZXNlcnZlZF9mbGFncygie30iLCB7cHBwfSJ7fSJ7cHBzfSwge3BmfXt9LCB7fSk7XG4nLmZvcm1hdChmdW5jTmFtZSwgdmFsdWVEaXNwbGF5TmFtZSwgdmFsdWUubmFtZSwgdnVpZCwgcGY9dmFsdWVQcmVmaXgsICoqcG9zdFByb2NTcGVjKSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiB2YWx1ZS50eXBlIGluIHNlbGYuZmxhZ3Mgb3IgdmFsdWUudHlwZSBpbiBzZWxmLmZsYWdCaXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUudHlwZSBpbiBzZWxmLmZsYWdzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdCaXRzTmFtZSA9IHZhbHVlLnR5cGUucmVwbGFjZSgnRmxhZ3MnLCAnRmxhZ0JpdHMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzVHlwZSA9ICdrT3B0aW9uYWxGbGFncycgaWYgdmFsdWUuaXNvcHRpb25hbCBlbHNlICdrUmVxdWlyZWRGbGFncycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVnVpZCA9IHNlbGYuR2V0VnVpZCh2dWlkX25hbWVfdGFnLCAiJXMtcGFyYW1ldGVyIiAlICh2YWx1ZS5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvVnVpZCA9IHNlbGYuR2V0VnVpZCh2dWlkX25hbWVfdGFnLCAiJXMtcmVxdWlyZWRiaXRtYXNrIiAlICh2YWx1ZS5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdmFsdWUudHlwZSBpbiBzZWxmLmZsYWdCaXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdCaXRzTmFtZSA9IHZhbHVlLnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc1R5cGUgPSAna09wdGlvbmFsU2luZ2xlQml0JyBpZiB2YWx1ZS5pc29wdGlvbmFsIGVsc2UgJ2tSZXF1aXJlZFNpbmdsZUJpdCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVnVpZCA9IHNlbGYuR2V0VnVpZCh2dWlkX25hbWVfdGFnLCAiJXMtcGFyYW1ldGVyIiAlICh2YWx1ZS5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvVnVpZCA9IGludmFsaWRWdWlkCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxGbGFnc05hbWUgPSAnQWxsJyArIGZsYWdCaXRzTmFtZQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkX3Z1aWQgPSBzZWxmLkdldFZ1aWQodnVpZF9uYW1lX3RhZywgIiVzLXBhcmFtZXRlciIgJSAodmFsdWUubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxGbGFnc05hbWUgPSAnQWxsJyArIGZsYWdCaXRzTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgemVyb1Z1aWRBcmcgPSAnJyBpZiB2YWx1ZS5pc29wdGlvbmFsIGVsc2UgJywgJyArIHplcm9WdWlkCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkTGluZXMuYXBwZW5kKCdza2lwIHw9IHZhbGlkYXRlX2ZsYWdzKCJ7fSIsIHtwcHB9Int9IntwcHN9LCAie30iLCB7fSwge3BmfXt9LCB7fSwge317fSk7XG4nLmZvcm1hdChmdW5jTmFtZSwgdmFsdWVEaXNwbGF5TmFtZSwgZmxhZ0JpdHNOYW1lLCBhbGxGbGFnc05hbWUsIHZhbHVlLm5hbWUsIGZsYWdzVHlwZSwgaW52YWxpZFZ1aWQsIHplcm9WdWlkQXJnLCBwZj12YWx1ZVByZWZpeCwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlLmlzYm9vbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRMaW5lcy5hcHBlbmQoJ3NraXAgfD0gdmFsaWRhdGVfYm9vbDMyKCJ7fSIsIHtwcHB9Int9IntwcHN9LCB7fXt9KTtcbicuZm9ybWF0KGZ1bmNOYW1lLCB2YWx1ZURpc3BsYXlOYW1lLCB2YWx1ZVByZWZpeCwgdmFsdWUubmFtZSwgKipwb3N0UHJvY1NwZWMpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlLmlzcmFuZ2VkZW51bToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ1aWQgPSBzZWxmLkdldFZ1aWQodnVpZF9uYW1lX3RhZywgIiVzLXBhcmFtZXRlciIgJSAodmFsdWUubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX3ZhbHVlX2xpc3QgPSAnQWxsJXNFbnVtcycgJSB2YWx1ZS50eXBlCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkTGluZXMuYXBwZW5kKCdza2lwIHw9IHZhbGlkYXRlX3JhbmdlZF9lbnVtKCJ7fSIsIHtwcHB9Int9IntwcHN9LCAie30iLCB7fSwge317fSwge30pO1xuJy5mb3JtYXQoZnVuY05hbWUsIHZhbHVlRGlzcGxheU5hbWUsIHZhbHVlLnR5cGUsIGVudW1fdmFsdWVfbGlzdCwgdmFsdWVQcmVmaXgsIHZhbHVlLm5hbWUsIHZ1aWQsICoqcG9zdFByb2NTcGVjKSkKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGEgc3RydWN0LCBzZWUgaWYgaXQgY29udGFpbnMgbWVtYmVycyB0aGF0IG5lZWQgdG8gYmUgY2hlY2tlZAorICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZS50eXBlIGluIHNlbGYudmFsaWRhdGVkU3RydWN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlck5hbWVQcmVmaXggPSAne317fS4nLmZvcm1hdCh2YWx1ZVByZWZpeCwgdmFsdWUubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlckRpc3BsYXlOYW1lUHJlZml4ID0gJ3t9LicuZm9ybWF0KHZhbHVlRGlzcGxheU5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkTGluZXMuYXBwZW5kKHNlbGYuZXhwYW5kU3RydWN0Q29kZSh2YWx1ZS50eXBlLCBmdW5jTmFtZSwgbWVtYmVyTmFtZVByZWZpeCwgbWVtYmVyRGlzcGxheU5hbWVQcmVmaXgsICcnLCBbXSwgcG9zdFByb2NTcGVjKSkKKyAgICAgICAgICAgICMgQXBwZW5kIHRoZSBwYXJhbWV0ZXIgY2hlY2sgdG8gdGhlIGZ1bmN0aW9uIGJvZHkgZm9yIHRoZSBjdXJyZW50IGNvbW1hbmQKKyAgICAgICAgICAgIGlmIHVzZWRMaW5lczoKKyAgICAgICAgICAgICAgICAjIEFwcGx5IHNwZWNpYWwgY29uZGl0aW9uYWwgY2hlY2tzCisgICAgICAgICAgICAgICAgaWYgdmFsdWUuY29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICB1c2VkTGluZXMgPSBzZWxmLmdlbkNvbmRpdGlvbmFsQ2FsbCh2YWx1ZVByZWZpeCwgdmFsdWUuY29uZGl0aW9uLCB1c2VkTGluZXMpCisgICAgICAgICAgICAgICAgbGluZXMgKz0gdXNlZExpbmVzCisgICAgICAgICAgICBlbGlmIG5vdCB2YWx1ZS5pc2NvdW50OgorICAgICAgICAgICAgICAgICMgSWYgbm8gZXhwcmVzc2lvbiB3YXMgZ2VuZXJhdGVkIGZvciB0aGlzIHZhbHVlLCBpdCBpcyB1bnJlZmVyZW5jZWQgYnkgdGhlIHZhbGlkYXRpb24gZnVuY3Rpb24sIHVubGVzcworICAgICAgICAgICAgICAgICMgaXQgaXMgYW4gYXJyYXkgY291bnQsIHdoaWNoIGlzIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBmb3IgYXJyYXkgdmFsaWFkYXRpb24uCisgICAgICAgICAgICAgICAgdW51c2VkLmFwcGVuZCh2YWx1ZS5uYW1lKQorICAgICAgICBpZiBub3QgbGluZXM6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJy8vIE5vIHhtbC1kcml2ZW4gdmFsaWRhdGlvblxuJykKKyAgICAgICAgcmV0dXJuIGxpbmVzLCB1bnVzZWQKKyAgICAjCisgICAgIyBHZW5lcmF0ZSB0aGUgc3RydWN0IG1lbWJlciBjaGVjayBjb2RlIGZyb20gdGhlIGNhcHR1cmVkIGRhdGEKKyAgICBkZWYgcHJvY2Vzc1N0cnVjdE1lbWJlckRhdGEoc2VsZik6CisgICAgICAgIGluZGVudCA9IHNlbGYuaW5jSW5kZW50KE5vbmUpCisgICAgICAgIGZvciBzdHJ1Y3QgaW4gc2VsZi5zdHJ1Y3RNZW1iZXJzOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IGdlbkZ1bmNCb2R5IHdpbGwgYmUgbmVzdGVkIGluIGFuIGlmIGNoZWNrIGZvciBhIE5VTEwgcG9pbnRlciwgc28gbmVlZHMgaXRzIGluZGVudCBpbmNyZW1lbnRlZAorICAgICAgICAgICAgbGluZXMsIHVudXNlZCA9IHNlbGYuZ2VuRnVuY0JvZHkoJ3tmdW5jTmFtZX0nLCBzdHJ1Y3QubWVtYmVycywgJ3t2YWx1ZVByZWZpeH0nLCAne2Rpc3BsYXlOYW1lUHJlZml4fScsIHN0cnVjdC5uYW1lKQorICAgICAgICAgICAgaWYgbGluZXM6CisgICAgICAgICAgICAgICAgc2VsZi52YWxpZGF0ZWRTdHJ1Y3RzW3N0cnVjdC5uYW1lXSA9IGxpbmVzCisgICAgIworICAgICMgR2VuZXJhdGUgdGhlIGNvbW1hbmQgcGFyYW0gY2hlY2sgY29kZSBmcm9tIHRoZSBjYXB0dXJlZCBkYXRhCisgICAgZGVmIHByb2Nlc3NDbWREYXRhKHNlbGYpOgorICAgICAgICBpbmRlbnQgPSBzZWxmLmluY0luZGVudChOb25lKQorICAgICAgICBmb3IgY29tbWFuZCBpbiBzZWxmLmNvbW1hbmRzOgorICAgICAgICAgICAgIyBTa2lwIGZpcnN0IHBhcmFtZXRlciBpZiBpdCBpcyBhIGRpc3BhdGNoIGhhbmRsZSAoZXZlcnl0aGluZyBleGNlcHQgdmtDcmVhdGVJbnN0YW5jZSkKKyAgICAgICAgICAgIHN0YXJ0SW5kZXggPSAwIGlmIGNvbW1hbmQubmFtZSA9PSAndmtDcmVhdGVJbnN0YW5jZScgZWxzZSAxCisgICAgICAgICAgICBsaW5lcywgdW51c2VkID0gc2VsZi5nZW5GdW5jQm9keShjb21tYW5kLm5hbWUsIGNvbW1hbmQucGFyYW1zW3N0YXJ0SW5kZXg6XSwgJycsICcnLCBOb25lKQorICAgICAgICAgICAgIyBDYW5ub3QgdmFsaWRhdGUgZXh0ZW5zaW9uIGRlcGVuZGVuY2llcyBmb3IgZGV2aWNlIGV4dGVuc2lvbiBBUElzIGhhdmluZyBhIHBoeXNpY2FsIGRldmljZSBhcyB0aGVpciBkaXNwYXRjaGFibGUgb2JqZWN0CisgICAgICAgICAgICBpZiAoY29tbWFuZC5uYW1lIGluIHNlbGYucmVxdWlyZWRfZXh0ZW5zaW9ucykgYW5kIChzZWxmLmV4dGVuc2lvbl90eXBlICE9ICdkZXZpY2UnIG9yIGNvbW1hbmQucGFyYW1zWzBdLnR5cGUgIT0gJ1ZrUGh5c2ljYWxEZXZpY2UnKToKKyAgICAgICAgICAgICAgICBleHRfdGVzdCA9ICcnCisgICAgICAgICAgICAgICAgaWYgY29tbWFuZC5wYXJhbXNbMF0udHlwZSBpbiBbIlZrSW5zdGFuY2UiLCAiVmtQaHlzaWNhbERldmljZSJdIG9yIGNvbW1hbmQubmFtZSA9PSAndmtDcmVhdGVJbnN0YW5jZSc6CisgICAgICAgICAgICAgICAgICAgIGV4dF90YWJsZV90eXBlID0gJ2luc3RhbmNlJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGV4dF90YWJsZV90eXBlID0gJ2RldmljZScKKyAgICAgICAgICAgICAgICBmb3IgZXh0IGluIHNlbGYucmVxdWlyZWRfZXh0ZW5zaW9uc1tjb21tYW5kLm5hbWVdOgorICAgICAgICAgICAgICAgICAgICBleHRfbmFtZV9kZWZpbmUgPSAnJworICAgICAgICAgICAgICAgICAgICBleHRfZW5hYmxlX25hbWUgPSAnJworICAgICAgICAgICAgICAgICAgICBmb3IgZXh0ZW5zaW9uIGluIHNlbGYucmVnaXN0cnkuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4dGVuc2lvbi5hdHRyaWJbJ25hbWUnXSA9PSBleHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X25hbWVfZGVmaW5lID0gZXh0ZW5zaW9uWzBdWzFdLmdldCgnbmFtZScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X2VuYWJsZV9uYW1lID0gZXh0X25hbWVfZGVmaW5lLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfZW5hYmxlX25hbWUgPSByZS5zdWIoJ19leHRlbnNpb25fbmFtZScsICcnLCBleHRfZW5hYmxlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZXh0X3Rlc3QgPSAnaWYgKCElc19leHRlbnNpb25zLiVzKSBza2lwIHw9IE91dHB1dEV4dGVuc2lvbkVycm9yKCIlcyIsICVzKTtcbicgJSAoZXh0X3RhYmxlX3R5cGUsIGV4dF9lbmFibGVfbmFtZSwgY29tbWFuZC5uYW1lLCBleHRfbmFtZV9kZWZpbmUpCisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmluc2VydCgwLCBleHRfdGVzdCkKKyAgICAgICAgICAgIGlmIGxpbmVzOgorICAgICAgICAgICAgICAgIGZ1bmNfc2lnID0gc2VsZi5nZXRDbWREZWYoY29tbWFuZCkgKyAnIGNvbnN0IHtcbicKKyAgICAgICAgICAgICAgICBmdW5jX3NpZyA9IGZ1bmNfc2lnLnNwbGl0KCdWS0FQSV9DQUxMIHZrJylbMV0KKyAgICAgICAgICAgICAgICBjbWREZWYgPSAnYm9vbCBTdGF0ZWxlc3NWYWxpZGF0aW9uOjpQcmVDYWxsVmFsaWRhdGUnICsgZnVuY19zaWcKKyAgICAgICAgICAgICAgICBjbWREZWYgKz0gJyVzYm9vbCBza2lwID0gZmFsc2U7XG4nICUgaW5kZW50CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHR5cGUobGluZSkgaXMgbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzdWIgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWREZWYgKz0gaW5kZW50ICsgc3ViCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjbWREZWYgKz0gaW5kZW50ICsgbGluZQorICAgICAgICAgICAgICAgICMgSW5zZXJ0IGNhbGwgdG8gY3VzdG9tLXdyaXR0ZW4gZnVuY3Rpb24gaWYgcHJlc2VudAorICAgICAgICAgICAgICAgIGlmIGNvbW1hbmQubmFtZSBpbiBzZWxmLmZ1bmN0aW9uc193aXRoX21hbnVhbF9jaGVja3M6CisgICAgICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgcGFyYW1ldGVyIGxpc3QgZm9yIG1hbnVhbCBmY24gYW5kIGRvd24tY2hhaW4gY2FsbHMKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zX3RleHQgPSAnJworICAgICAgICAgICAgICAgICAgICBmb3IgcGFyYW0gaW4gY29tbWFuZC5wYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfdGV4dCArPSAnJXMsICcgJSBwYXJhbS5uYW1lCisgICAgICAgICAgICAgICAgICAgIHBhcmFtc190ZXh0ID0gcGFyYW1zX3RleHRbOi0yXSArICcpO1xuJworICAgICAgICAgICAgICAgICAgICBjbWREZWYgKz0gJyAgICBpZiAoIXNraXApIHNraXAgfD0gbWFudWFsX1ByZUNhbGxWYWxpZGF0ZScrIGNvbW1hbmQubmFtZVsyOl0gKyAnKCcgKyBwYXJhbXNfdGV4dAorICAgICAgICAgICAgICAgIGNtZERlZiArPSAnJXNyZXR1cm4gc2tpcDtcbicgJSBpbmRlbnQKKyAgICAgICAgICAgICAgICBjbWREZWYgKz0gJ31cbicKKyAgICAgICAgICAgICAgICBzZWxmLnZhbGlkYXRpb24uYXBwZW5kKGNtZERlZikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvcGFyc2VfdGVzdF9yZXN1bHRzLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy9wYXJzZV90ZXN0X3Jlc3VsdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3MWQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvcGFyc2VfdGVzdF9yZXN1bHRzLnB5CkBAIC0wLDAgKzEsMTczIEBACisjIS91c3IvYmluL3B5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE4IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogV2lsbGlhbSBIZW5uaW5nIDx3aGVubmluZ0Bnb29nbGUuY29tPgorIworIyBUaGlzIHNjcmlwdCBwYXJzZXMgdGhlIHZhbGlkYXRpb24gbGF5ZXJzIHRlc3QgY29udGludW91cyBpbnRlZ3JhdGlvbiBvdXB1dAorIyBhbmQgcmVwb3J0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgcGFzc2VkLCBmYWlsdXJlZCwgb3VwdXQgdW5leHBlY3RlZCBlcnJvcnMsCisjIG9yIHdlcmUgc2tpcHBlZC4gQXMgc3VjaCwgdGhlIHNjcmlwdCBpcyBvbmx5IGRlc2lnbmVkIHRvIHBhcnNlIHRoZSBvdXB1dAorIyBnZW5lcmF0ZWQgYnkgdGhlIGV4aXN0aW5nIENJIGltcGxlbWVudGF0aW9uLgorIworIyB1c2FnZToKKyMgICAgICAgZm9yIHByb2ZpbGUgaW4gdGVzdHMvZGV2aWNlX3Byb2ZpbGVzLyouanNvbjsgZG8gZWNobyBUZXN0aW5nIHdpdGgKKyMgICAgICAgcHJvZmlsZSAkcHJvZmlsZTsgVktfTEFZRVJfUEFUSD1ERVZTSU1fQU5EX1ZBTElEQVRJT05fUEFUSFMKKyMgICAgICAgVktfREVWU0lNX0ZJTEU9JHByb2ZpbGUgVktfSUNEX0ZJTEVOQU1FUz1NT0NLX0lDRF9QQVRICisjICAgICAgIC4vYnVpbGQvdGVzdHMvdmtfbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cyAtLWRldnNpbTsgZG9uZQorIyAgICAgICB8IHB5dGhvbjMgcGFyc2VfdGVzdF9yZXN1bHRzLnB5IFstLWZhaWxfb25fc2tpcF0gWy0tZmFpbF9vbl91bmV4cGVjdGVkXQorIworIyAgICAgICAtLWZhaWxfb25fc2tpcCBjYXVzZXMgdGhlIHNjcmlwdCB0byBleGl0IHdpdGggYSBub24temVybyBleGl0IGNvZGUgaWYgYSB0ZXN0CisjICAgICAgIGRpZG4ndCBydW4gb24gYW55IGRldmljZSBwcm9maWxlCisjCisjICAgICAgIC0tZmFpbF9vbl91bmV4cGVjdGVkIGNhdXNlcyB0aGUgc2NyaXB0IHRvIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBpZgorIyAgICAgICBhIHRlc3QgcHJpbnRlZCB1bmV4cGVjdGVkIGVycm9ycworIworCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCByZQoraW1wb3J0IHN5cworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKKworY2xhc3MgT3V0cHV0U3RhdHMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY3VycmVudF9wcm9maWxlID0gIiIKKyAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSAiIgorICAgICAgICBzZWxmLmN1cnJlbnRfdGVzdF9vdXRwdXQgPSAiIgorICAgICAgICBzZWxmLnRlc3RfcmVzdWx0cyA9IGRlZmF1bHRkaWN0KGRlZmF1bHRkaWN0KQorICAgICAgICBzZWxmLnVuZXhwZWN0ZWRfZXJyb3JzID0gZGVmYXVsdGRpY3QoZGVmYXVsdGRpY3QpCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbGluZSk6CisgICAgICAgIHNlbGYubmV3X3Byb2ZpbGVfbWF0Y2gobGluZSkKKyAgICAgICAgc2VsZi50ZXN0X3N1aXRlX2VuZF9tYXRjaChsaW5lKQorICAgICAgICBzZWxmLnN0YXJ0X3Rlc3RfbWF0Y2gobGluZSkKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3Rlc3QgIT0gIiI6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfdGVzdF9vdXRwdXQgKz0gbGluZQorICAgICAgICBzZWxmLnNraXBfdGVzdF9tYXRjaChsaW5lKQorICAgICAgICBzZWxmLnBhc3NfdGVzdF9tYXRjaChsaW5lKQorICAgICAgICBzZWxmLmZhaWxfdGVzdF9tYXRjaChsaW5lKQorICAgICAgICBzZWxmLnVuZXhwZWN0ZWRfZXJyb3JfbWF0Y2gobGluZSkKKworICAgIGRlZiBwcmludF9zdW1tYXJ5KHNlbGYsIHNraXBfaXNfZmFpbHVyZSwgdW5leHBlY3RlZF9pc19mYWlsdXJlKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3Rlc3QgIT0gIiI6CisgICAgICAgICAgICBzZWxmLnRlc3RfZGllZCgpCisKKyAgICAgICAgcGFzc2VkX3Rlc3RzID0gMAorICAgICAgICBza2lwcGVkX3Rlc3RzID0gMAorICAgICAgICBmYWlsZWRfdGVzdHMgPSAwCisgICAgICAgIHVuZXhwZWN0ZWRfZXJyb3JfdGVzdHMgPSAwCisgICAgICAgIGRpZF9mYWlsID0gRmFsc2UKKworICAgICAgICBmb3IgdGVzdF9uYW1lLCByZXN1bHRzIGluIHNlbGYudGVzdF9yZXN1bHRzLml0ZW1zKCk6CisgICAgICAgICAgICBza2lwcGVkX3Byb2ZpbGVzID0gMAorICAgICAgICAgICAgcGFzc2VkX3Byb2ZpbGVzID0gMAorICAgICAgICAgICAgZmFpbGVkX3Byb2ZpbGVzID0gMAorICAgICAgICAgICAgYWJvcnRlZF9wcm9maWxlcyA9IDAKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRfZXJyb3JfcHJvZmlsZXMgPSAwCisgICAgICAgICAgICBmb3IgcHJvZmlsZSwgcmVzdWx0IGluIHJlc3VsdHMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgPT0gInBhc3MiOgorICAgICAgICAgICAgICAgICAgICBwYXNzZWRfcHJvZmlsZXMgKz0gMQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCA9PSAiZmFpbCI6CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZF9wcm9maWxlcyArPSAxCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0ID09ICJza2lwIjoKKyAgICAgICAgICAgICAgICAgICAgc2tpcHBlZF9wcm9maWxlcyArPSAxCisgICAgICAgICAgICAgICAgaWYgc2VsZi51bmV4cGVjdGVkX2Vycm9ycy5nZXQodGVzdF9uYW1lLCB7fSkuZ2V0KHByb2ZpbGUsICIiKSA9PSAidHJ1ZSI6CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRfZXJyb3JfcHJvZmlsZXMgKz0gMQorICAgICAgICAgICAgaWYgZmFpbGVkX3Byb2ZpbGVzICE9IDA6CisgICAgICAgICAgICAgICAgcHJpbnQoIlRFU1QgRkFJTEVEOiIsIHRlc3RfbmFtZSkKKyAgICAgICAgICAgICAgICBmYWlsZWRfdGVzdHMgKz0gMQorICAgICAgICAgICAgZWxpZiBza2lwcGVkX3Byb2ZpbGVzID09IGxlbihyZXN1bHRzKToKKyAgICAgICAgICAgICAgICBwcmludCgiVEVTVCBTS0lQUEVEIEFMTCBERVZJQ0VTOiIsIHRlc3RfbmFtZSkKKyAgICAgICAgICAgICAgICBza2lwcGVkX3Rlc3RzICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzc2VkX3Rlc3RzICs9IDEKKyAgICAgICAgICAgIGlmIHVuZXhwZWN0ZWRfZXJyb3JfcHJvZmlsZXMgIT0gMDoKKyAgICAgICAgICAgICAgICBwcmludCgiVU5FWFBFQ1RFRCBFUlJPUlM6IiwgdGVzdF9uYW1lKQorICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRfZXJyb3JfdGVzdHMgKz0gMQorICAgICAgICBudW1fdGVzdHMgPSBsZW4oc2VsZi50ZXN0X3Jlc3VsdHMpCisgICAgICAgIHByaW50KCJQQVNTRUQ6ICIsIHBhc3NlZF90ZXN0cywgIi8iLCBudW1fdGVzdHMsICIgdGVzdHMiKQorICAgICAgICBpZiBza2lwcGVkX3Rlc3RzICE9IDA6CisgICAgICAgICAgICBkaWRfZmFpbCB8PSBza2lwX2lzX2ZhaWx1cmUKKyAgICAgICAgICAgIHByaW50KCJORVZFUiBSQU46ICIsIHNraXBwZWRfdGVzdHMsICIvIiwgbnVtX3Rlc3RzLCAiIHRlc3RzIikKKyAgICAgICAgaWYgZmFpbGVkX3Rlc3RzICE9IDA6CisgICAgICAgICAgICBkaWRfZmFpbCA9IFRydWUKKyAgICAgICAgICAgIHByaW50KCJGQUlMRUQ6ICIsIGZhaWxlZF90ZXN0cywgIi8iLCBudW1fdGVzdHMsICJ0ZXN0cyIpCisgICAgICAgIGlmIHVuZXhwZWN0ZWRfZXJyb3JfdGVzdHMgIT0gMDoKKyAgICAgICAgICAgIGRpZF9mYWlsIHw9IHVuZXhwZWN0ZWRfaXNfZmFpbHVyZQorICAgICAgICAgICAgcHJpbnQoIlVORVhQRUNURUQgT1VQVVQ6ICIsIHVuZXhwZWN0ZWRfZXJyb3JfdGVzdHMsICIvIiwgbnVtX3Rlc3RzLCAidGVzdHMiKQorICAgICAgICByZXR1cm4gZGlkX2ZhaWwKKworICAgIGRlZiBuZXdfcHJvZmlsZV9tYXRjaChzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgcmUuc2VhcmNoKHInVGVzdGluZyB3aXRoIHByb2ZpbGUgLiovKC4qKScsIGxpbmUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Byb2ZpbGUgPSByZS5zZWFyY2gocidUZXN0aW5nIHdpdGggcHJvZmlsZSAuKi8oLiopJywgbGluZSkuZ3JvdXAoMSkKKworICAgIGRlZiB0ZXN0X3N1aXRlX2VuZF9tYXRjaChzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgcmUuc2VhcmNoKHInXFstKlxdJywgbGluZSkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmN1cnJlbnRfdGVzdCAhPSAiIjoKKyAgICAgICAgICAgICAgICAjIEhlcmUgd2Ugc2VlIGEgbWVzc2FnZSB0aGF0IHN0YXJ0cyBbLS0tLS0tLS0tLV0gYmVmb3JlIGFub3RoZXIgdGVzdAorICAgICAgICAgICAgICAgICMgZmluaXNoZWQgcnVubmluZy4gVGhpcyBzaG91bGQgbWVhbiB0aGF0IHRoYXQgb3RoZXIgdGVzdCBkaWVkLgorICAgICAgICAgICAgICAgIHNlbGYudGVzdF9kaWVkKCkKKworICAgIGRlZiBzdGFydF90ZXN0X21hdGNoKHNlbGYsIGxpbmUpOgorICAgICAgICBpZiByZS5zZWFyY2gocidcWyBSVU5ccypcXScsIGxpbmUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBUaGlzIHBhcnNlciBkb2Vzbid0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvbmUgdGVzdCdzIHN0YXJ0IGNvbWVzIGJldHdlZW4gYW5vdGhlcgorICAgICAgICAgICAgIyB0ZXN0J3Mgc3RhcnQgYW5kIHJlc3VsdC4KKyAgICAgICAgICAgIGFzc2VydCBzZWxmLmN1cnJlbnRfdGVzdCA9PSAiIgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSByZS5zZWFyY2gociddICguKiknLCBsaW5lKS5ncm91cCgxKQorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3Rfb3V0cHV0ID0gIiIKKworICAgIGRlZiBza2lwX3Rlc3RfbWF0Y2goc2VsZiwgbGluZSk6CisgICAgICAgIGlmIHJlLnNlYXJjaChyJ1RFU1QgU0tJUFBFRCcsIGxpbmUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50ZXN0X3Jlc3VsdHNbc2VsZi5jdXJyZW50X3Rlc3RdW3NlbGYuY3VycmVudF9wcm9maWxlXSA9ICJza2lwIgorCisgICAgZGVmIHBhc3NfdGVzdF9tYXRjaChzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgcmUuc2VhcmNoKHInXFtccypPSyBcXScsIGxpbmUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBJZiBndGVzdCBzYXlzIHRoZSB0ZXN0IHBhc3NlZCwgY2hlY2sgaWYgaXQgd2FzIHNraXBwZWQgYmVmb3JlIG1hcmtpbmcgaXQgcGFzc2VkCisgICAgICAgICAgICBpZiBzZWxmLnRlc3RfcmVzdWx0cy5nZXQoc2VsZi5jdXJyZW50X3Rlc3QsIHt9KS5nZXQoc2VsZi5jdXJyZW50X3Byb2ZpbGUsICIiKSAhPSAic2tpcCI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdF9yZXN1bHRzW3NlbGYuY3VycmVudF90ZXN0XVtzZWxmLmN1cnJlbnRfcHJvZmlsZV0gPSAicGFzcyIKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF90ZXN0ID0gIiIKKworICAgIGRlZiBmYWlsX3Rlc3RfbWF0Y2goc2VsZiwgbGluZSk6CisgICAgICAgIGlmIHJlLnNlYXJjaChyJ1xbXHMqRkFJTEVEXHMqXF0nLCBsaW5lKSBpcyBub3QgTm9uZSBhbmQgc2VsZi5jdXJyZW50X3Rlc3QgIT0gIiI6CisgICAgICAgICAgICBzZWxmLnRlc3RfcmVzdWx0c1tzZWxmLmN1cnJlbnRfdGVzdF1bc2VsZi5jdXJyZW50X3Byb2ZpbGVdID0gImZhaWwiCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfdGVzdCA9ICIiCisKKyAgICBkZWYgdW5leHBlY3RlZF9lcnJvcl9tYXRjaChzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgcmUuc2VhcmNoKHInXlVuZXhwZWN0ZWQ6ICcsIGxpbmUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51bmV4cGVjdGVkX2Vycm9yc1tzZWxmLmN1cnJlbnRfdGVzdF1bc2VsZi5jdXJyZW50X3Byb2ZpbGVdID0gInRydWUiCisKKyAgICBkZWYgdGVzdF9kaWVkKHNlbGYpOgorICAgICAgICBwcmludCgiQSB0ZXN0IGxpa2VseSBjcmFzaGVkLiBUZXN0aW5nIGlzIGJlaW5nIGFib3J0ZWQuIikKKyAgICAgICAgcHJpbnQoIkZpbmFsIHRlc3Qgb3V0cHV0OiAiKQorICAgICAgICBwcmludChzZWxmLmN1cnJlbnRfdGVzdF9vdXRwdXQpCisgICAgICAgIHN5cy5leGl0KDEpCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J1BhcnNlIHRoZSBvdXRwdXQgZnJvbSB2YWxpZGF0aW9uIGxheWVyIHRlc3RzLicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mYWlsX29uX3NraXAnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSJNYWtlcyB0aGUgc2NyaXB0IGV4aXQgd2l0aCBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJub24temVybyBleGl0IGNvZGUgaWYgYSB0ZXN0IGRpZG4ndCBydW4gb24gYW55IGRldmljZSBwcm9maWxlLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mYWlsX29uX3VuZXhwZWN0ZWQnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSJNYWtlcyB0aGUgc2NyaXB0IGV4aXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggYSBub24temVybyBleGl0IGNvZGUgaWYgYSB0ZXN0IGNhdXNlcyB1bmV4cGVjdGVkIGVycm9ycy4iKQorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBzdGF0cyA9IE91dHB1dFN0YXRzKCkKKyAgICBmb3IgbGluZSBpbiBzeXMuc3RkaW46CisgICAgICAgIHN0YXRzLm1hdGNoKGxpbmUpCisgICAgZmFpbGVkID0gc3RhdHMucHJpbnRfc3VtbWFyeShhcmdzLmZhaWxfb25fc2tpcCwgYXJncy5mYWlsX29uX3VuZXhwZWN0ZWQpCisgICAgaWYgZmFpbGVkID09IFRydWU6CisgICAgICAgIHByaW50KCJcbkZBSUxFRCBDSSIpCisgICAgICAgIHN5cy5leGl0KDEpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL3RocmVhZF9zYWZldHlfZ2VuZXJhdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy90aHJlYWRfc2FmZXR5X2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ0NThlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy90aHJlYWRfc2FmZXR5X2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDE1NjcgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMyAtaQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8c3Ryb3lhbkBnb29nbGUuY29tPgorIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKworaW1wb3J0IG9zLHJlLHN5cworZnJvbSBnZW5lcmF0b3IgaW1wb3J0ICoKK2Zyb20gY29tbW9uX2NvZGVnZW4gaW1wb3J0ICoKKworIyBUaHJlYWRHZW5lcmF0b3JPcHRpb25zIC0gc3ViY2xhc3Mgb2YgR2VuZXJhdG9yT3B0aW9ucy4KKyMKKyMgQWRkcyBvcHRpb25zIHVzZWQgYnkgVGhyZWFkT3V0cHV0R2VuZXJhdG9yIG9iamVjdHMgZHVyaW5nIHRocmVhZGluZworIyBsYXllciBnZW5lcmF0aW9uLgorIworIyBBZGRpdGlvbmFsIG1lbWJlcnMKKyMgICBwcmVmaXhUZXh0IC0gbGlzdCBvZiBzdHJpbmdzIHRvIHByZWZpeCBnZW5lcmF0ZWQgaGVhZGVyIHdpdGgKKyMgICAgICh1c3VhbGx5IGEgY29weXJpZ2h0IHN0YXRlbWVudCArIGNhbGxpbmcgY29udmVudGlvbiBtYWNyb3MpLgorIyAgIHByb3RlY3RGaWxlIC0gVHJ1ZSBpZiBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbiBzaG91bGQgYmUKKyMgICAgIGdlbmVyYXRlZCAoYmFzZWQgb24gdGhlIGZpbGVuYW1lKSBhcm91bmQgdGhlIGVudGlyZSBoZWFkZXIuCisjICAgcHJvdGVjdEZlYXR1cmUgLSBUcnVlIGlmICNpZm5kZWYuLiNlbmRpZiBwcm90ZWN0aW9uIHNob3VsZCBiZQorIyAgICAgZ2VuZXJhdGVkIGFyb3VuZCBhIGZlYXR1cmUgaW50ZXJmYWNlIGluIHRoZSBoZWFkZXIgZmlsZS4KKyMgICBnZW5GdW5jUG9pbnRlcnMgLSBUcnVlIGlmIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMgc2hvdWxkIGJlCisjICAgICBnZW5lcmF0ZWQKKyMgICBwcm90ZWN0UHJvdG8gLSBJZiBjb25kaXRpb25hbCBwcm90ZWN0aW9uIHNob3VsZCBiZSBnZW5lcmF0ZWQKKyMgICAgIGFyb3VuZCBwcm90b3R5cGUgZGVjbGFyYXRpb25zLCBzZXQgdG8gZWl0aGVyICcjaWZkZWYnCisjICAgICB0byByZXF1aXJlIG9wdC1pbiAoI2lmZGVmIHByb3RlY3RQcm90b1N0cikgb3IgJyNpZm5kZWYnCisjICAgICB0byByZXF1aXJlIG9wdC1vdXQgKCNpZm5kZWYgcHJvdGVjdFByb3RvU3RyKS4gT3RoZXJ3aXNlCisjICAgICBzZXQgdG8gTm9uZS4KKyMgICBwcm90ZWN0UHJvdG9TdHIgLSAjaWZkZWYvI2lmbmRlZiBzeW1ib2wgdG8gdXNlIGFyb3VuZCBwcm90b3R5cGUKKyMgICAgIGRlY2xhcmF0aW9ucywgaWYgcHJvdGVjdFByb3RvIGlzIHNldAorIyAgIGFwaWNhbGwgLSBzdHJpbmcgdG8gdXNlIGZvciB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gcHJlZml4LAorIyAgICAgc3VjaCBhcyBBUElDQUxMIG9uIFdpbmRvd3MuCisjICAgYXBpZW50cnkgLSBzdHJpbmcgdG8gdXNlIGZvciB0aGUgY2FsbGluZyBjb252ZW50aW9uIG1hY3JvLAorIyAgICAgaW4gdHlwZWRlZnMsIHN1Y2ggYXMgQVBJRU5UUlkuCisjICAgYXBpZW50cnlwIC0gc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGNhbGxpbmcgY29udmVudGlvbiBtYWNybworIyAgICAgaW4gZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmcywgc3VjaCBhcyBBUElFTlRSWVAuCisjICAgaW5kZW50RnVuY1Byb3RvIC0gVHJ1ZSBpZiBwcm90b3R5cGUgZGVjbGFyYXRpb25zIHNob3VsZCBwdXQgZWFjaAorIyAgICAgcGFyYW1ldGVyIG9uIGEgc2VwYXJhdGUgbGluZQorIyAgIGluZGVudEZ1bmNQb2ludGVyIC0gVHJ1ZSBpZiB0eXBlZGVmZWQgZnVuY3Rpb24gcG9pbnRlcnMgc2hvdWxkIHB1dCBlYWNoCisjICAgICBwYXJhbWV0ZXIgb24gYSBzZXBhcmF0ZSBsaW5lCisjICAgYWxpZ25GdW5jUGFyYW0gLSBpZiBub256ZXJvIGFuZCBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwdXQgb24gYQorIyAgICAgc2VwYXJhdGUgbGluZSwgYWxpZ24gcGFyYW1ldGVyIG5hbWVzIGF0IHRoZSBzcGVjaWZpZWQgY29sdW1uCitjbGFzcyBUaHJlYWRHZW5lcmF0b3JPcHRpb25zKEdlbmVyYXRvck9wdGlvbnMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBjb252ZW50aW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gJy4nLAorICAgICAgICAgICAgICAgICBhcGluYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZW1pdHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGVtaXRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgc29ydFByb2NlZHVyZSA9IHJlZ1NvcnRGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgcHJlZml4VGV4dCA9ICIiLAorICAgICAgICAgICAgICAgICBnZW5GdW5jUG9pbnRlcnMgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0RmlsZSA9IFRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgYXBpY2FsbCA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeSA9ICcnLAorICAgICAgICAgICAgICAgICBhcGllbnRyeXAgPSAnJywKKyAgICAgICAgICAgICAgICAgaW5kZW50RnVuY1Byb3RvID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgaW5kZW50RnVuY1BvaW50ZXIgPSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgYWxpZ25GdW5jUGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICBleHBhbmRFbnVtZXJhbnRzID0gVHJ1ZSk6CisgICAgICAgIEdlbmVyYXRvck9wdGlvbnMuX19pbml0X18oc2VsZiwgY29udmVudGlvbnMsIGZpbGVuYW1lLCBkaXJlY3RvcnksIGFwaW5hbWUsIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMsIGVtaXR2ZXJzaW9ucywgZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucywgcmVtb3ZlRXh0ZW5zaW9ucywgZW1pdEV4dGVuc2lvbnMsIHNvcnRQcm9jZWR1cmUpCisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gcHJlZml4VGV4dAorICAgICAgICBzZWxmLmdlbkZ1bmNQb2ludGVycyA9IGdlbkZ1bmNQb2ludGVycworICAgICAgICBzZWxmLnByb3RlY3RGaWxlICAgICA9IHByb3RlY3RGaWxlCisgICAgICAgIHNlbGYucHJvdGVjdEZlYXR1cmUgID0gcHJvdGVjdEZlYXR1cmUKKyAgICAgICAgc2VsZi5hcGljYWxsICAgICAgICAgPSBhcGljYWxsCisgICAgICAgIHNlbGYuYXBpZW50cnkgICAgICAgID0gYXBpZW50cnkKKyAgICAgICAgc2VsZi5hcGllbnRyeXAgICAgICAgPSBhcGllbnRyeXAKKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUHJvdG8gPSBpbmRlbnRGdW5jUHJvdG8KKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUG9pbnRlciA9IGluZGVudEZ1bmNQb2ludGVyCisgICAgICAgIHNlbGYuYWxpZ25GdW5jUGFyYW0gID0gYWxpZ25GdW5jUGFyYW0KKyAgICAgICAgc2VsZi5leHBhbmRFbnVtZXJhbnRzID0gZXhwYW5kRW51bWVyYW50cworCisKKyMgVGhyZWFkT3V0cHV0R2VuZXJhdG9yIC0gc3ViY2xhc3Mgb2YgT3V0cHV0R2VuZXJhdG9yLgorIyBHZW5lcmF0ZXMgVGhyZWFkIGNoZWNraW5nIGZyYW1ld29yaworIworIyAtLS0tIG1ldGhvZHMgLS0tLQorIyBUaHJlYWRPdXRwdXRHZW5lcmF0b3IoZXJyRmlsZSwgd2FybkZpbGUsIGRpYWdGaWxlKSAtIGFyZ3MgYXMgZm9yCisjICAgT3V0cHV0R2VuZXJhdG9yLiBEZWZpbmVzIGFkZGl0aW9uYWwgaW50ZXJuYWwgc3RhdGUuCisjIC0tLS0gbWV0aG9kcyBvdmVycmlkaW5nIGJhc2UgY2xhc3MgLS0tLQorIyBiZWdpbkZpbGUoZ2VuT3B0cykKKyMgZW5kRmlsZSgpCisjIGJlZ2luRmVhdHVyZShpbnRlcmZhY2UsIGVtaXQpCisjIGVuZEZlYXR1cmUoKQorIyBnZW5UeXBlKHR5cGVpbmZvLG5hbWUpCisjIGdlblN0cnVjdCh0eXBlaW5mbyxuYW1lKQorIyBnZW5Hcm91cChncm91cGluZm8sbmFtZSkKKyMgZ2VuRW51bShlbnVtaW5mbywgbmFtZSkKKyMgZ2VuQ21kKGNtZGluZm8pCitjbGFzcyBUaHJlYWRPdXRwdXRHZW5lcmF0b3IoT3V0cHV0R2VuZXJhdG9yKToKKyAgICAiIiJHZW5lcmF0ZSBzcGVjaWZpZWQgQVBJIGludGVyZmFjZXMgaW4gYSBzcGVjaWZpYyBzdHlsZSwgc3VjaCBhcyBhIEMgaGVhZGVyIiIiCisKKyAgICBpbmxpbmVfY29weXJpZ2h0X21lc3NhZ2UgPSAiIiIKKy8vIFRoaXMgZmlsZSBpcyAqKipHRU5FUkFURUQqKiouICBEbyBOb3QgRWRpdC4KKy8vIFNlZSB0aHJlYWRfc2FmZXR5X2dlbmVyYXRvci5weSBmb3IgbW9kaWZpY2F0aW9ucy4KKworLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqLyIiIgorCisgIyBOb3RlIHRoYXQgdGhlIGlubGluZV9jdXN0b21faGVhZGVyX3ByZWFtYmxlIHRlbXBsYXRlIGJlbG93IGNvbnRhaW5zIHRocmVlIGVtYmVkZGVkIHRlbXBsYXRlIGV4cGFuc2lvbiBpZGVudGlmaWVycy4KKyAjIFRoZXNlIGdldCByZXBsYWNlZCB3aXRoIGdlbmVyYXRlZCBjb2RlIHNlY3Rpb25zLCBhbmQgYXJlIGxhYmVsZWQ6CisgIyAgbyBDT1VOVEVSX0NMQVNTX0RFRklOSVRJT05TX1RFTVBMQVRFCisgIyAgbyBDT1VOVEVSX0NMQVNTX0lOU1RBTkNFU19URU1QTEFURQorICMgIG8gQ09VTlRFUl9DTEFTU19CT0RJRVNfVEVNUExBVEUKKyAgICBpbmxpbmVfY3VzdG9tX2hlYWRlcl9wcmVhbWJsZSA9ICIiIgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRShESVNUSU5DVF9OT05ESVNQQVRDSEFCTEVfUEhPTllfSEFORExFKQorLy8gVGhlIGZvbGxvd2luZyBsaW5lIG11c3QgbWF0Y2ggdGhlIHZ1bGthbl9jb3JlLmggY29uZGl0aW9uIGd1YXJkaW5nIFZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRQorI2lmIGRlZmluZWQoX19MUDY0X18pIHx8IGRlZmluZWQoX1dJTjY0KSB8fCAoZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChfX0lMUDMyX18pKSB8fCBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX2lhNjQpIHx8IFwKKyAgICBkZWZpbmVkKF9NX0lBNjQpIHx8IGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoX19wb3dlcnBjNjRfXykKKy8vIElmIHBvaW50ZXJzIGFyZSA2NC1iaXQsIHRoZW4gdGhlcmUgY2FuIGJlIHNlcGFyYXRlIGNvdW50ZXJzIGZvciBlYWNoCisvLyBOT05ESVNQQVRDSEFCTEVfSEFORExFIHR5cGUuICBPdGhlcndpc2UgdGhleSBhcmUgYWxsIHR5cGVkZWYgdWludDY0X3QuCisjZGVmaW5lIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisvLyBNYWtlIHN1cmUgd2UgY2F0Y2ggYW55IGRpc2FncmVlbWVudCBiZXR3ZWVuIHVzIGFuZCB0aGUgdnVsa2FuIGRlZmluaXRpb24KK3N0YXRpY19hc3NlcnQoc3RkOjppc19wb2ludGVyPERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9QSE9OWV9IQU5ETEU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIk1pc21hdGNoZWQgbm9uLWRpc3BhdGNoYWJsZSBoYW5kbGUgaGFuZGxlLCBleHBlY3RlZCBwb2ludGVyIHR5cGUuIik7CisjZWxzZQorLy8gTWFrZSBzdXJlIHdlIGNhdGNoIGFueSBkaXNhZ3JlZW1lbnQgYmV0d2VlbiB1cyBhbmQgdGhlIHZ1bGthbiBkZWZpbml0aW9uCitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTx1aW50NjRfdCwgRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX1BIT05ZX0hBTkRMRT46OnZhbHVlLAorICAgICAgICAgICAgICAiTWlzbWF0Y2hlZCBub24tZGlzcGF0Y2hhYmxlIGhhbmRsZSBoYW5kbGUsIGV4cGVjdGVkIHVpbnQ2NF90LiIpOworI2VuZGlmCisKKy8vIFN1cHByZXNzIHVudXNlZCB3YXJuaW5nIG9uIExpbnV4CisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgREVDT1JBVEVfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBERUNPUkFURV9VTlVTRUQKKyNlbmRpZgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX1RocmVhZGluZ19JbmZvID0gIlVOQVNTSUdORUQtVGhyZWFkaW5nLUluZm8iOworc3RhdGljIGNvbnN0IGNoYXIgREVDT1JBVEVfVU5VU0VEICprVlVJRF9UaHJlYWRpbmdfTXVsdGlwbGVUaHJlYWRzID0gIlVOQVNTSUdORUQtVGhyZWFkaW5nLU11bHRpcGxlVGhyZWFkcyI7CitzdGF0aWMgY29uc3QgY2hhciBERUNPUkFURV9VTlVTRUQgKmtWVUlEX1RocmVhZGluZ19TaW5nbGVUaHJlYWRSZXVzZSA9ICJVTkFTU0lHTkVELVRocmVhZGluZy1TaW5nbGVUaHJlYWRSZXVzZSI7CisvLyBjbGFuZy1mb3JtYXQgb24KKworI3VuZGVmIERFQ09SQVRFX1VOVVNFRAorCitjbGFzcyBPYmplY3RVc2VEYXRhCit7CitwdWJsaWM6CisgICAgY2xhc3MgV3JpdGVSZWFkQ291bnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBXcml0ZVJlYWRDb3VudChpbnQ2NF90IHYpIDogY291bnQodikge30KKworICAgICAgICBpbnQzMl90IEdldFJlYWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIChpbnQzMl90KShjb3VudCAmIDB4RkZGRkZGRkYpOyB9CisgICAgICAgIGludDMyX3QgR2V0V3JpdGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIChpbnQzMl90KShjb3VudCA+PiAzMik7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGludDY0X3QgY291bnQ7CisgICAgfTsKKworICAgIE9iamVjdFVzZURhdGEoKSA6IHRocmVhZCgwKSwgd3JpdGVyX3JlYWRlcl9jb3VudCgwKSB7CisgICAgICAgIC8vIHNpbGVuY2UgLVd1bnVzZWQtcHJpdmF0ZS1maWVsZCB3YXJuaW5nCisgICAgICAgIHBhZGRpbmdbMF0gPSAwOworICAgIH0KKworICAgIFdyaXRlUmVhZENvdW50IEFkZFdyaXRlcigpIHsKKyAgICAgICAgaW50NjRfdCBwcmV2ID0gd3JpdGVyX3JlYWRlcl9jb3VudC5mZXRjaF9hZGQoMVVMTCA8PCAzMik7CisgICAgICAgIHJldHVybiBXcml0ZVJlYWRDb3VudChwcmV2KTsKKyAgICB9CisgICAgV3JpdGVSZWFkQ291bnQgQWRkUmVhZGVyKCkgeworICAgICAgICBpbnQ2NF90IHByZXYgPSB3cml0ZXJfcmVhZGVyX2NvdW50LmZldGNoX2FkZCgxVUxMKTsKKyAgICAgICAgcmV0dXJuIFdyaXRlUmVhZENvdW50KHByZXYpOworICAgIH0KKyAgICBXcml0ZVJlYWRDb3VudCBSZW1vdmVXcml0ZXIoKSB7CisgICAgICAgIGludDY0X3QgcHJldiA9IHdyaXRlcl9yZWFkZXJfY291bnQuZmV0Y2hfYWRkKC0oMUxMIDw8IDMyKSk7CisgICAgICAgIHJldHVybiBXcml0ZVJlYWRDb3VudChwcmV2KTsKKyAgICB9CisgICAgV3JpdGVSZWFkQ291bnQgUmVtb3ZlUmVhZGVyKCkgeworICAgICAgICBpbnQ2NF90IHByZXYgPSB3cml0ZXJfcmVhZGVyX2NvdW50LmZldGNoX2FkZCgtMUxMKTsKKyAgICAgICAgcmV0dXJuIFdyaXRlUmVhZENvdW50KHByZXYpOworICAgIH0KKyAgICBXcml0ZVJlYWRDb3VudCBHZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIFdyaXRlUmVhZENvdW50KHdyaXRlcl9yZWFkZXJfY291bnQpOworICAgIH0KKworICAgIHZvaWQgV2FpdEZvck9iamVjdElkbGUoYm9vbCBpc193cml0ZXIpICB7CisgICAgICAgIC8vIFdhaXQgZm9yIHRocmVhZC1zYWZlIGFjY2VzcyB0byBvYmplY3QgaW5zdGVhZCBvZiBza2lwcGluZyBjYWxsLgorICAgICAgICB3aGlsZSAoR2V0Q291bnQoKS5HZXRSZWFkQ291bnQoKSA+IChpbnQpKCFpc193cml0ZXIpIHx8IEdldENvdW50KCkuR2V0V3JpdGVDb3VudCgpID4gKGludClpc193cml0ZXIpIHsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKDEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6YXRvbWljPGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaWQ+IHRocmVhZDsKKworcHJpdmF0ZToKKyAgICAvLyBuZWVkIHRvIHVwZGF0ZSB3cml0ZSBhbmQgcmVhZCBjb3VudHMgYXRvbWljYWxseS4gV3JpdGVyIGluIGhpZ2gKKyAgICAvLyAzMiBiaXRzLCByZWFkZXIgaW4gbG93IDMyIGJpdHMuCisgICAgc3RkOjphdG9taWM8aW50NjRfdD4gd3JpdGVyX3JlYWRlcl9jb3VudDsKKworICAgIC8vIFB1dCBlYWNoIGxvY2sgb24gaXRzIG93biBjYWNoZSBsaW5lIHRvIGF2b2lkIGZhbHNlIGNhY2hlIGxpbmUgc2hhcmluZy4KKyAgICBjaGFyIHBhZGRpbmdbKC1pbnQoc2l6ZW9mKHN0ZDo6YXRvbWljPGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaWQ+KSArIHNpemVvZihzdGQ6OmF0b21pYzxpbnQ2NF90PikpKSAmIDYzXTsKK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBjb3VudGVyIHsKK3B1YmxpYzoKKyAgICBjb25zdCBjaGFyICp0eXBlTmFtZTsKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlOworICAgIGRlYnVnX3JlcG9ydF9kYXRhICoqcmVwb3J0X2RhdGE7CisKKyAgICB2bF9jb25jdXJyZW50X3Vub3JkZXJlZF9tYXA8VCwgc3RkOjpzaGFyZWRfcHRyPE9iamVjdFVzZURhdGE+LCA2PiBvYmplY3RfdGFibGU7CisKKyAgICB2b2lkIENyZWF0ZU9iamVjdChUIG9iamVjdCkgeworICAgICAgICBvYmplY3RfdGFibGUuaW5zZXJ0X29yX2Fzc2lnbihvYmplY3QsIHN0ZDo6bWFrZV9zaGFyZWQ8T2JqZWN0VXNlRGF0YT4oKSk7CisgICAgfQorCisgICAgdm9pZCBEZXN0cm95T2JqZWN0KFQgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QpIHsKKyAgICAgICAgICAgIG9iamVjdF90YWJsZS5lcmFzZShvYmplY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPE9iamVjdFVzZURhdGE+IEZpbmRPYmplY3QoVCBvYmplY3QpIHsKKyAgICAgICAgYXNzZXJ0KG9iamVjdF90YWJsZS5jb250YWlucyhvYmplY3QpKTsKKyAgICAgICAgYXV0byBpdGVyID0gc3RkOjptb3ZlKG9iamVjdF90YWJsZS5maW5kKG9iamVjdCkpOworICAgICAgICBpZiAoaXRlciAhPSBvYmplY3RfdGFibGUuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoaXRlci0+c2Vjb25kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZ19tc2coKnJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0VHlwZSwgKHVpbnQ2NF90KShvYmplY3QpLCBrVlVJRF9UaHJlYWRpbmdfSW5mbywKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgJXMgT2JqZWN0IDB4JSIgUFJJeExFQVNUNjQKKyAgICAgICAgICAgICAgICAgICAgIi4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBhbmQgbWF5IGluZGljYXRlIGEgYnVnIGluIHRoZSBhcHBsaWNhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3RyaW5nW29iamVjdFR5cGVdLCAodWludDY0X3QpKG9iamVjdCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFN0YXJ0V3JpdGUoVCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2lkIHRpZCA9IGxvYWRlcl9wbGF0Zm9ybV9nZXRfdGhyZWFkX2lkKCk7CisKKyAgICAgICAgYXV0byB1c2VfZGF0YSA9IEZpbmRPYmplY3Qob2JqZWN0KTsKKyAgICAgICAgaWYgKCF1c2VfZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnN0IE9iamVjdFVzZURhdGE6OldyaXRlUmVhZENvdW50IHByZXZDb3VudCA9IHVzZV9kYXRhLT5BZGRXcml0ZXIoKTsKKworICAgICAgICBpZiAocHJldkNvdW50LkdldFJlYWRDb3VudCgpID09IDAgJiYgcHJldkNvdW50LkdldFdyaXRlQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBjdXJyZW50IHVzZSBvZiB0aGUgb2JqZWN0LiAgUmVjb3JkIHdyaXRlciB0aHJlYWQuCisgICAgICAgICAgICB1c2VfZGF0YS0+dGhyZWFkID0gdGlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHByZXZDb3VudC5HZXRSZWFkQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHByZXZDb3VudC5HZXRXcml0ZUNvdW50KCkgIT0gMCk7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG5vIHJlYWRlcnMuICBUd28gd3JpdGVycyBqdXN0IGNvbGxpZGVkLgorICAgICAgICAgICAgICAgIGlmICh1c2VfZGF0YS0+dGhyZWFkICE9IHRpZCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coKnJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0VHlwZSwgKHVpbnQ2NF90KShvYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfVGhyZWFkaW5nX011bHRpcGxlVGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJUSFJFQURJTkcgRVJST1IgOiBvYmplY3Qgb2YgdHlwZSAlcyBpcyBzaW11bHRhbmVvdXNseSB1c2VkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQgMHglIiBQUkl4NjQgIiBhbmQgdGhyZWFkIDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUsICh1aW50NjRfdCl1c2VfZGF0YS0+dGhyZWFkLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCksICh1aW50NjRfdCl0aWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhyZWFkLXNhZmUgYWNjZXNzIHRvIG9iamVjdCBpbnN0ZWFkIG9mIHNraXBwaW5nIGNhbGwuCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZGF0YS0+V2FpdEZvck9iamVjdElkbGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBub3cgbm8gY3VycmVudCB1c2Ugb2YgdGhlIG9iamVjdC4gIFJlY29yZCB3cml0ZXIgdGhyZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2RhdGEtPnRocmVhZCA9IHRpZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vdyBubyBjdXJyZW50IHVzZSBvZiB0aGUgb2JqZWN0LiAgUmVjb3JkIHdyaXRlciB0aHJlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZGF0YS0+dGhyZWFkID0gdGlkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBlaXRoZXIgc2FmZSBtdWx0aXBsZSB1c2UgaW4gb25lIGNhbGwsIG9yIHJlY3Vyc2l2ZSB1c2UuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBtYWtlIHJlY3Vyc2lvbiBzYWZlLiAgSnVzdCBmb3JnZSBhaGVhZC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSByZWFkZXJzLiAgVGhpcyB3cml0ZXIgY29sbGlkZWQgd2l0aCB0aGVtLgorICAgICAgICAgICAgICAgIGlmICh1c2VfZGF0YS0+dGhyZWFkICE9IHRpZCkgeworICAgICAgICAgICAgICAgICAgICBza2lwIHw9IGxvZ19tc2coKnJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgb2JqZWN0VHlwZSwgKHVpbnQ2NF90KShvYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAga1ZVSURfVGhyZWFkaW5nX011bHRpcGxlVGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJUSFJFQURJTkcgRVJST1IgOiBvYmplY3Qgb2YgdHlwZSAlcyBpcyBzaW11bHRhbmVvdXNseSB1c2VkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQgMHglIiBQUkl4NjQgIiBhbmQgdGhyZWFkIDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUsICh1aW50NjRfdCl1c2VfZGF0YS0+dGhyZWFkLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCksICh1aW50NjRfdCl0aWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhyZWFkLXNhZmUgYWNjZXNzIHRvIG9iamVjdCBpbnN0ZWFkIG9mIHNraXBwaW5nIGNhbGwuCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZGF0YS0+V2FpdEZvck9iamVjdElkbGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBub3cgbm8gY3VycmVudCB1c2Ugb2YgdGhlIG9iamVjdC4gIFJlY29yZCB3cml0ZXIgdGhyZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2RhdGEtPnRocmVhZCA9IHRpZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggYW4gdW5zYWZlIHVzZSBvZiB0aGUgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2RhdGEtPnRocmVhZCA9IHRpZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZWl0aGVyIHNhZmUgbXVsdGlwbGUgdXNlIGluIG9uZSBjYWxsLCBvciByZWN1cnNpdmUgdXNlLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gbWFrZSByZWN1cnNpb24gc2FmZS4gIEp1c3QgZm9yZ2UgYWhlYWQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBGaW5pc2hXcml0ZShUIG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gT2JqZWN0IGlzIG5vIGxvbmdlciBpbiB1c2UKKyAgICAgICAgYXV0byB1c2VfZGF0YSA9IEZpbmRPYmplY3Qob2JqZWN0KTsKKyAgICAgICAgaWYgKCF1c2VfZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHVzZV9kYXRhLT5SZW1vdmVXcml0ZXIoKTsKKyAgICB9CisKKyAgICB2b2lkIFN0YXJ0UmVhZChUIG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaWQgdGlkID0gbG9hZGVyX3BsYXRmb3JtX2dldF90aHJlYWRfaWQoKTsKKworICAgICAgICBhdXRvIHVzZV9kYXRhID0gRmluZE9iamVjdChvYmplY3QpOworICAgICAgICBpZiAoIXVzZV9kYXRhKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgT2JqZWN0VXNlRGF0YTo6V3JpdGVSZWFkQ291bnQgcHJldkNvdW50ID0gdXNlX2RhdGEtPkFkZFJlYWRlcigpOworCisgICAgICAgIGlmIChwcmV2Q291bnQuR2V0UmVhZENvdW50KCkgPT0gMCAmJiBwcmV2Q291bnQuR2V0V3JpdGVDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGN1cnJlbnQgdXNlIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAgICB1c2VfZGF0YS0+dGhyZWFkID0gdGlkOworICAgICAgICB9IGVsc2UgaWYgKHByZXZDb3VudC5HZXRXcml0ZUNvdW50KCkgPiAwICYmIHVzZV9kYXRhLT50aHJlYWQgIT0gdGlkKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIHdyaXRlciBvZiB0aGUgb2JqZWN0LgorICAgICAgICAgICAgc2tpcCB8PSBsb2dfbXNnKCpyZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9iamVjdFR5cGUsICh1aW50NjRfdCkob2JqZWN0KSwKKyAgICAgICAgICAgICAgICBrVlVJRF9UaHJlYWRpbmdfTXVsdGlwbGVUaHJlYWRzLAorICAgICAgICAgICAgICAgICJUSFJFQURJTkcgRVJST1IgOiBvYmplY3Qgb2YgdHlwZSAlcyBpcyBzaW11bHRhbmVvdXNseSB1c2VkIGluICIKKyAgICAgICAgICAgICAgICAidGhyZWFkIDB4JSIgUFJJeDY0ICIgYW5kIHRocmVhZCAweCUiIFBSSXg2NCwKKyAgICAgICAgICAgICAgICB0eXBlTmFtZSwgKHVpbnQ2NF90KXVzZV9kYXRhLT50aHJlYWQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSwgKHVpbnQ2NF90KXRpZCk7CisgICAgICAgICAgICBpZiAoc2tpcCkgeworICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRocmVhZC1zYWZlIGFjY2VzcyB0byBvYmplY3QgaW5zdGVhZCBvZiBza2lwcGluZyBjYWxsLgorICAgICAgICAgICAgICAgIHVzZV9kYXRhLT5XYWl0Rm9yT2JqZWN0SWRsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgdXNlX2RhdGEtPnRocmVhZCA9IHRpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBvdGhlciByZWFkZXJzIG9mIHRoZSBvYmplY3QuCisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBGaW5pc2hSZWFkKFQgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gdXNlX2RhdGEgPSBGaW5kT2JqZWN0KG9iamVjdCk7CisgICAgICAgIGlmICghdXNlX2RhdGEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB1c2VfZGF0YS0+UmVtb3ZlUmVhZGVyKCk7CisgICAgfQorICAgIGNvdW50ZXIoY29uc3QgY2hhciAqbmFtZSA9ICIiLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB0eXBlID0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCBkZWJ1Z19yZXBvcnRfZGF0YSAqKnJlcF9kYXRhID0gbnVsbHB0cikgeworICAgICAgICB0eXBlTmFtZSA9IG5hbWU7CisgICAgICAgIG9iamVjdFR5cGUgPSB0eXBlOworICAgICAgICByZXBvcnRfZGF0YSA9IHJlcF9kYXRhOworICAgIH0KKworcHJpdmF0ZToKK307CisKK2NsYXNzIFRocmVhZFNhZmV0eSA6IHB1YmxpYyBWYWxpZGF0aW9uT2JqZWN0IHsKK3B1YmxpYzoKKworICAgIFJlYWRXcml0ZUxvY2sgdGhyZWFkX3NhZmV0eV9sb2NrOworCisgICAgLy8gT3ZlcnJpZGUgY2hhc3NpcyByZWFkL3dyaXRlIGxvY2tzIGZvciB0aGlzIHZhbGlkYXRpb24gb2JqZWN0CisgICAgLy8gVGhpcyBvdmVycmlkZSB0YWtlcyBhIGRlZmVycmVkIGxvY2suIGkuZS4gaXQgaXMgbm90IGFjcXVpcmVkLgorICAgIHZpcnR1YWwgcmVhZF9sb2NrX2d1YXJkX3QgcmVhZF9sb2NrKCkgeworICAgICAgICByZXR1cm4gcmVhZF9sb2NrX2d1YXJkX3QodmFsaWRhdGlvbl9vYmplY3RfbXV0ZXgsIHN0ZDo6ZGVmZXJfbG9jayk7CisgICAgfQorICAgIHZpcnR1YWwgd3JpdGVfbG9ja19ndWFyZF90IHdyaXRlX2xvY2soKSB7CisgICAgICAgIHJldHVybiB3cml0ZV9sb2NrX2d1YXJkX3QodmFsaWRhdGlvbl9vYmplY3RfbXV0ZXgsIHN0ZDo6ZGVmZXJfbG9jayk7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBUaHJlYWRTYWZldHkgaXMgZm9yIGEgVmtEZXZpY2UsIHRoZW4gcGFyZW50X2luc3RhbmNlIHBvaW50cyB0byB0aGUKKyAgICAvLyBUaHJlYWRTYWZldHkgb2JqZWN0IG9mIGl0cyBwYXJlbnQgVmtJbnN0YW5jZS4gVGhpcyBpcyB1c2VkIHRvIGdldCB0byB0aGUgY291bnRlcnMKKyAgICAvLyBmb3Igb2JqZWN0cyBjcmVhdGVkIHdpdGggdGhlIGluc3RhbmNlIGFzIHBhcmVudC4KKyAgICBUaHJlYWRTYWZldHkgKnBhcmVudF9pbnN0YW5jZTsKKworICAgIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcDxWa0NvbW1hbmRCdWZmZXIsIFZrQ29tbWFuZFBvb2wsIDY+IGNvbW1hbmRfcG9vbF9tYXA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZrQ29tbWFuZFBvb2wsIHN0ZDo6dW5vcmRlcmVkX3NldDxWa0NvbW1hbmRCdWZmZXI+PiBwb29sX2NvbW1hbmRfYnVmZmVyc19tYXA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZrRGV2aWNlLCBzdGQ6OnVub3JkZXJlZF9zZXQ8VmtRdWV1ZT4+IGRldmljZV9xdWV1ZXNfbWFwOworCisgICAgLy8gVHJhY2sgcGVyLWRlc2NyaXB0b3JzZXRsYXlvdXQgYW5kIHBlci1kZXNjcmlwdG9yc2V0IHdoZXRoZXIgVVBEQVRFX0FGVEVSX0JJTkQgaXMgdXNlZC4KKyAgICAvLyBUaGlzIGlzIHVzZWQgdG8gKHNsb3BwaWx5KSBpbXBsZW1lbnQgdGhlIHJlbGF4ZWQgZXh0ZXJuc3luYyBydWxlcyBmb3IgVVBEQVRFX0FGVEVSX0JJTkQKKyAgICAvLyBkZXNjcmlwdG9ycy4gV2UgbW9kZWwgdXBkYXRlcyBvZiBVUERBVEVfQUZURVJfQklORCBkZXNjcmlwdG9ycyBhcyBpZiB0aGV5IHdlcmUgcmVhZHMKKyAgICAvLyByYXRoZXIgdGhhbiB3cml0ZXMsIGJlY2F1c2UgdGhleSBvbmx5IGNvbmZsaWN0IHdpdGggdGhlIHNldCBiZWluZyBmcmVlZCBvciByZXNldC4KKyAgICAvLworICAgIC8vIFdlIGRvbid0IHRyYWNrIHRoZSBVUERBVEVfQUZURVJfQklORCBzdGF0ZSBwZXItYmluZGluZyBmb3IgYSBjb3VwbGUgcmVhc29uczoKKyAgICAvLyAoMSkgV2Ugb25seSBoYXZlIG9uZSBjb3VudGVyIHBlciBvYmplY3QsIGFuZCBpZiB3ZSB0cmVhdGVkIG5vbi1VQUIgYXMgd3JpdGVzCisgICAgLy8gICAgIGFuZCBVQUIgYXMgcmVhZHMgdGhlbiB0aGV5J2QgYXBwZWFyIHRvIGNvbmZsaWN0IHdpdGggZWFjaCBvdGhlci4KKyAgICAvLyAoMikgQXZvaWQgYWRkaXRpb25hbCB0cmFja2luZyBvZiBkZXNjcmlwdG9yIGJpbmRpbmcgc3RhdGUgaW4gdGhlIGRlc2NyaXB0b3Igc2V0CisgICAgLy8gICAgIGxheW91dCwgYW5kIHRyYWNraW5nIG9mIHdoaWNoIGJpbmRpbmdzIGFyZSBhY2Nlc3NlZCBieSBhIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLgorICAgIHZsX2NvbmN1cnJlbnRfdW5vcmRlcmVkX21hcDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXQsIGJvb2wsIDQ+IGRzbF91cGRhdGVfYWZ0ZXJfYmluZF9tYXA7CisgICAgdmxfY29uY3VycmVudF91bm9yZGVyZWRfbWFwPFZrRGVzY3JpcHRvclNldCwgYm9vbCwgNj4gZHNfdXBkYXRlX2FmdGVyX2JpbmRfbWFwOworICAgIGJvb2wgRHNVcGRhdGVBZnRlckJpbmQoVmtEZXNjcmlwdG9yU2V0KSBjb25zdDsKKworICAgIGNvdW50ZXI8VmtDb21tYW5kQnVmZmVyPiBjX1ZrQ29tbWFuZEJ1ZmZlcjsKKyAgICBjb3VudGVyPFZrRGV2aWNlPiBjX1ZrRGV2aWNlOworICAgIGNvdW50ZXI8VmtJbnN0YW5jZT4gY19Wa0luc3RhbmNlOworICAgIGNvdW50ZXI8VmtRdWV1ZT4gY19Wa1F1ZXVlOworI2lmZGVmIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisKKyAgICAvLyBTcGVjaWFsIGVudHJ5IHRvIGFsbG93IHRyYWNraW5nIG9mIGNvbW1hbmQgcG9vbCBSZXNldCBhbmQgRGVzdHJveQorICAgIGNvdW50ZXI8VmtDb21tYW5kUG9vbD4gY19Wa0NvbW1hbmRQb29sQ29udGVudHM7CitDT1VOVEVSX0NMQVNTX0RFRklOSVRJT05TX1RFTVBMQVRFCisKKyNlbHNlICAgLy8gRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKKyAgICAvLyBTcGVjaWFsIGVudHJ5IHRvIGFsbG93IHRyYWNraW5nIG9mIGNvbW1hbmQgcG9vbCBSZXNldCBhbmQgRGVzdHJveQorICAgIGNvdW50ZXI8dWludDY0X3Q+IGNfVmtDb21tYW5kUG9vbENvbnRlbnRzOworCisgICAgY291bnRlcjx1aW50NjRfdD4gY191aW50NjRfdDsKKyNlbmRpZiAgLy8gRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKKworICAgIFRocmVhZFNhZmV0eShUaHJlYWRTYWZldHkgKnBhcmVudCkKKyAgICAgICAgOiBwYXJlbnRfaW5zdGFuY2UocGFyZW50KSwKKyAgICAgICAgICBjX1ZrQ29tbWFuZEJ1ZmZlcigiVmtDb21tYW5kQnVmZmVyIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrRGV2aWNlKCJWa0RldmljZSIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhULCAmcmVwb3J0X2RhdGEpLAorICAgICAgICAgIGNfVmtJbnN0YW5jZSgiVmtJbnN0YW5jZSIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTlNUQU5DRV9FWFQsICZyZXBvcnRfZGF0YSksCisgICAgICAgICAgY19Wa1F1ZXVlKCJWa1F1ZXVlIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVCwgJnJlcG9ydF9kYXRhKSwKKyAgICAgICAgICBjX1ZrQ29tbWFuZFBvb2xDb250ZW50cygiVmtDb21tYW5kUG9vbCIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0xfRVhULCAmcmVwb3J0X2RhdGEpLAorCisjaWZkZWYgRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKK0NPVU5URVJfQ0xBU1NfSU5TVEFOQ0VTX1RFTVBMQVRFCisKKworI2Vsc2UgICAvLyBESVNUSU5DVF9OT05ESVNQQVRDSEFCTEVfSEFORExFUworICAgICAgICAgIGNfdWludDY0X3QoIk5PTl9ESVNQQVRDSEFCTEVfSEFORExFIiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV05fRVhULCAmcmVwb3J0X2RhdGEpCisjZW5kaWYgIC8vIERJU1RJTkNUX05PTkRJU1BBVENIQUJMRV9IQU5ETEVTCisgICAgICAgICAgICAgIHt9OworCisjZGVmaW5lIFdSQVBQRVIodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgIHZvaWQgU3RhcnRXcml0ZU9iamVjdCh0eXBlIG9iamVjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgY18jI3R5cGUuU3RhcnRXcml0ZShvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgIHZvaWQgRmluaXNoV3JpdGVPYmplY3QodHlwZSBvYmplY3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgY18jI3R5cGUuRmluaXNoV3JpdGUob2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgIHZvaWQgU3RhcnRSZWFkT2JqZWN0KHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgY18jI3R5cGUuU3RhcnRSZWFkKG9iamVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgIHZvaWQgRmluaXNoUmVhZE9iamVjdCh0eXBlIG9iamVjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgY18jI3R5cGUuRmluaXNoUmVhZChvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgIHZvaWQgQ3JlYXRlT2JqZWN0KHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgY18jI3R5cGUuQ3JlYXRlT2JqZWN0KG9iamVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgIHZvaWQgRGVzdHJveU9iamVjdCh0eXBlIG9iamVjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgY18jI3R5cGUuRGVzdHJveU9iamVjdChvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgfQorCisjZGVmaW5lIFdSQVBQRVJfUEFSRU5UX0lOU1RBTkNFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICB2b2lkIFN0YXJ0V3JpdGVPYmplY3RQYXJlbnRJbnN0YW5jZSh0eXBlIG9iamVjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAocGFyZW50X2luc3RhbmNlID8gcGFyZW50X2luc3RhbmNlIDogdGhpcyktPmNfIyN0eXBlLlN0YXJ0V3JpdGUob2JqZWN0KTsgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICB2b2lkIEZpbmlzaFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UodHlwZSBvYmplY3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAocGFyZW50X2luc3RhbmNlID8gcGFyZW50X2luc3RhbmNlIDogdGhpcyktPmNfIyN0eXBlLkZpbmlzaFdyaXRlKG9iamVjdCk7ICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICB2b2lkIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAocGFyZW50X2luc3RhbmNlID8gcGFyZW50X2luc3RhbmNlIDogdGhpcyktPmNfIyN0eXBlLlN0YXJ0UmVhZChvYmplY3QpOyAgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICB2b2lkIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZSh0eXBlIG9iamVjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAocGFyZW50X2luc3RhbmNlID8gcGFyZW50X2luc3RhbmNlIDogdGhpcyktPmNfIyN0eXBlLkZpbmlzaFJlYWQob2JqZWN0KTsgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICB2b2lkIENyZWF0ZU9iamVjdFBhcmVudEluc3RhbmNlKHR5cGUgb2JqZWN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAocGFyZW50X2luc3RhbmNlID8gcGFyZW50X2luc3RhbmNlIDogdGhpcyktPmNfIyN0eXBlLkNyZWF0ZU9iamVjdChvYmplY3QpOyAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICB2b2lkIERlc3Ryb3lPYmplY3RQYXJlbnRJbnN0YW5jZSh0eXBlIG9iamVjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAocGFyZW50X2luc3RhbmNlID8gcGFyZW50X2luc3RhbmNlIDogdGhpcyktPmNfIyN0eXBlLkRlc3Ryb3lPYmplY3Qob2JqZWN0KTsgICAgIFxcCisgICAgfQorCitXUkFQUEVSX1BBUkVOVF9JTlNUQU5DRShWa0RldmljZSkKK1dSQVBQRVJfUEFSRU5UX0lOU1RBTkNFKFZrSW5zdGFuY2UpCitXUkFQUEVSKFZrUXVldWUpCisjaWZkZWYgRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKK0NPVU5URVJfQ0xBU1NfQk9ESUVTX1RFTVBMQVRFCisKKyNlbHNlICAgLy8gRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKK1dSQVBQRVIodWludDY0X3QpCitXUkFQUEVSX1BBUkVOVF9JTlNUQU5DRSh1aW50NjRfdCkKKyNlbmRpZiAgLy8gRElTVElOQ1RfTk9ORElTUEFUQ0hBQkxFX0hBTkRMRVMKKworICAgIHZvaWQgQ3JlYXRlT2JqZWN0KFZrQ29tbWFuZEJ1ZmZlciBvYmplY3QpIHsKKyAgICAgICAgY19Wa0NvbW1hbmRCdWZmZXIuQ3JlYXRlT2JqZWN0KG9iamVjdCk7CisgICAgfQorICAgIHZvaWQgRGVzdHJveU9iamVjdChWa0NvbW1hbmRCdWZmZXIgb2JqZWN0KSB7CisgICAgICAgIGNfVmtDb21tYW5kQnVmZmVyLkRlc3Ryb3lPYmplY3Qob2JqZWN0KTsKKyAgICB9CisKKyAgICAvLyBWa0NvbW1hbmRCdWZmZXIgbmVlZHMgY2hlY2sgZm9yIGltcGxpY2l0IHVzZSBvZiBjb21tYW5kIHBvb2wKKyAgICB2b2lkIFN0YXJ0V3JpdGVPYmplY3QoVmtDb21tYW5kQnVmZmVyIG9iamVjdCwgYm9vbCBsb2NrUG9vbCA9IHRydWUpIHsKKyAgICAgICAgaWYgKGxvY2tQb29sKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBjb21tYW5kX3Bvb2xfbWFwLmZpbmQob2JqZWN0KTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IGNvbW1hbmRfcG9vbF9tYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBWa0NvbW1hbmRQb29sIHBvb2wgPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgU3RhcnRXcml0ZU9iamVjdChwb29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjX1ZrQ29tbWFuZEJ1ZmZlci5TdGFydFdyaXRlKG9iamVjdCk7CisgICAgfQorICAgIHZvaWQgRmluaXNoV3JpdGVPYmplY3QoVmtDb21tYW5kQnVmZmVyIG9iamVjdCwgYm9vbCBsb2NrUG9vbCA9IHRydWUpIHsKKyAgICAgICAgY19Wa0NvbW1hbmRCdWZmZXIuRmluaXNoV3JpdGUob2JqZWN0KTsKKyAgICAgICAgaWYgKGxvY2tQb29sKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBjb21tYW5kX3Bvb2xfbWFwLmZpbmQob2JqZWN0KTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IGNvbW1hbmRfcG9vbF9tYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBWa0NvbW1hbmRQb29sIHBvb2wgPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QocG9vbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBTdGFydFJlYWRPYmplY3QoVmtDb21tYW5kQnVmZmVyIG9iamVjdCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBjb21tYW5kX3Bvb2xfbWFwLmZpbmQob2JqZWN0KTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gY29tbWFuZF9wb29sX21hcC5lbmQoKSkgeworICAgICAgICAgICAgVmtDb21tYW5kUG9vbCBwb29sID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgLy8gV2Ugc2V0IHVwIGEgcmVhZCBndWFyZCBhZ2FpbnN0IHRoZSAiQ29udGVudHMiIGNvdW50ZXIgdG8gY2F0Y2ggY29uZmxpY3QgdnMuIHZrUmVzZXRDb21tYW5kUG9vbCBhbmQgdmtEZXN0cm95Q29tbWFuZFBvb2wKKyAgICAgICAgICAgIC8vIHdoaWxlICpub3QqIGVzdGFibGlzaGluZyBhIHJlYWQgZ3VhcmQgYWdhaW5zdCB0aGUgY29tbWFuZCBwb29sIGNvdW50ZXIgaXRzZWxmIHRvIGF2b2lkIGZhbHNlIHBvc3RpdmVzIGZvcgorICAgICAgICAgICAgLy8gbm9uLWV4dGVybmFsbHkgc3luYydkIGNvbW1hbmQgYnVmZmVycworICAgICAgICAgICAgY19Wa0NvbW1hbmRQb29sQ29udGVudHMuU3RhcnRSZWFkKHBvb2wpOworICAgICAgICB9CisgICAgICAgIGNfVmtDb21tYW5kQnVmZmVyLlN0YXJ0UmVhZChvYmplY3QpOworICAgIH0KKyAgICB2b2lkIEZpbmlzaFJlYWRPYmplY3QoVmtDb21tYW5kQnVmZmVyIG9iamVjdCkgeworICAgICAgICBjX1ZrQ29tbWFuZEJ1ZmZlci5GaW5pc2hSZWFkKG9iamVjdCk7CisgICAgICAgIGF1dG8gaXRlciA9IGNvbW1hbmRfcG9vbF9tYXAuZmluZChvYmplY3QpOworICAgICAgICBpZiAoaXRlciAhPSBjb21tYW5kX3Bvb2xfbWFwLmVuZCgpKSB7CisgICAgICAgICAgICBWa0NvbW1hbmRQb29sIHBvb2wgPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICBjX1ZrQ29tbWFuZFBvb2xDb250ZW50cy5GaW5pc2hSZWFkKHBvb2wpOworICAgICAgICB9CisgICAgfSAiIiIKKworCisgICAgaW5saW5lX2N1c3RvbV9zb3VyY2VfcHJlYW1ibGUgPSAiIiIKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQWxsb2NhdGVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChwQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gKnBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChwQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbCk7CisKKyAgICAvLyBSZWNvcmQgbWFwcGluZyBmcm9tIGNvbW1hbmQgYnVmZmVyIHRvIGNvbW1hbmQgcG9vbAorICAgIGlmKHBDb21tYW5kQnVmZmVycykgeworICAgICAgICBhdXRvIGxvY2sgPSB3cml0ZV9sb2NrX2d1YXJkX3QodGhyZWFkX3NhZmV0eV9sb2NrKTsKKyAgICAgICAgYXV0byAmcG9vbF9jb21tYW5kX2J1ZmZlcnMgPSBwb29sX2NvbW1hbmRfYnVmZmVyc19tYXBbcEFsbG9jYXRlSW5mby0+Y29tbWFuZFBvb2xdOworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBwQWxsb2NhdGVJbmZvLT5jb21tYW5kQnVmZmVyQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGNvbW1hbmRfcG9vbF9tYXAuaW5zZXJ0X29yX2Fzc2lnbihwQ29tbWFuZEJ1ZmZlcnNbaW5kZXhdLCBwQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbCk7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgICAgICBwb29sX2NvbW1hbmRfYnVmZmVycy5pbnNlcnQocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCogICAgICAgICAgICAgICAgICAgICAgcFNldExheW91dCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiAgICAgICAgICAgICAgICAgICAgICBwU2V0TGF5b3V0LAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcFNldExheW91dCk7CisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgYmluZGluZyB1c2VzIFVQREFURV9BRlRFUl9CSU5ECisgICAgICAgIGJvb2wgdXBkYXRlX2FmdGVyX2JpbmQgPSBmYWxzZTsKKyAgICAgICAgY29uc3QgYXV0byAqZmxhZ3NfY3JlYXRlX2luZm8gPSBsdmxfZmluZF9pbl9jaGFpbjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUPihwQ3JlYXRlSW5mby0+cE5leHQpOworICAgICAgICBpZiAoZmxhZ3NfY3JlYXRlX2luZm8pIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmbGFnc19jcmVhdGVfaW5mby0+YmluZGluZ0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3NfY3JlYXRlX2luZm8tPnBCaW5kaW5nRmxhZ3NbaV0gJiBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVCkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVfYWZ0ZXJfYmluZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc2xfdXBkYXRlX2FmdGVyX2JpbmRfbWFwLmluc2VydF9vcl9hc3NpZ24oKnBTZXRMYXlvdXQsIHVwZGF0ZV9hZnRlcl9iaW5kKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyAqcEFsbG9jYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcEFsbG9jYXRlSW5mbzo6ZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvICpwQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgKnBEZXNjcmlwdG9yU2V0cywgVmtSZXN1bHQgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QocEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHBBbGxvY2F0ZUluZm86OmRlc2NyaXB0b3JQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSByZXN1bHQpIHsKKyAgICAgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgICAgIGF1dG8gJnBvb2xfZGVzY3JpcHRvcl9zZXRzID0gcG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwW3BBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sXTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleDAgPSAwOyBpbmRleDAgPCBwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQ7IGluZGV4MCsrKSB7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4MF0pOworICAgICAgICAgICAgcG9vbF9kZXNjcmlwdG9yX3NldHMuaW5zZXJ0KHBEZXNjcmlwdG9yU2V0c1tpbmRleDBdKTsKKworICAgICAgICAgICAgYXV0byBpdGVyID0gZHNsX3VwZGF0ZV9hZnRlcl9iaW5kX21hcC5maW5kKHBBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzW2luZGV4MF0pOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZHNsX3VwZGF0ZV9hZnRlcl9iaW5kX21hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGRzX3VwZGF0ZV9hZnRlcl9iaW5kX21hcC5pbnNlcnRfb3JfYXNzaWduKHBEZXNjcmlwdG9yU2V0c1tpbmRleDBdLCBpdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCAmJiAiZGVzY3JpcHRvciBzZXQgbGF5b3V0IG5vdCBmb3VuZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzKSB7CisgICAgU3RhcnRSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBTdGFydFdyaXRlT2JqZWN0KGRlc2NyaXB0b3JQb29sKTsKKyAgICBpZiAocERlc2NyaXB0b3JTZXRzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXg9MDsgaW5kZXggPCBkZXNjcmlwdG9yU2V0Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGVhY2ggbWVtYmVyIG9mIHBEZXNjcmlwdG9yU2V0cyBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEZyZWVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvclBvb2wpOworICAgIGlmIChwRGVzY3JpcHRvclNldHMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGRlc2NyaXB0b3JTZXRDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGVhY2ggbWVtYmVyIG9mIHBEZXNjcmlwdG9yU2V0cyBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcEFsbG9jYXRlSW5mbzo6ZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICBhdXRvIGxvY2sgPSB3cml0ZV9sb2NrX2d1YXJkX3QodGhyZWFkX3NhZmV0eV9sb2NrKTsKKyAgICAgICAgYXV0byAmcG9vbF9kZXNjcmlwdG9yX3NldHMgPSBwb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXBbZGVzY3JpcHRvclBvb2xdOworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4MCA9IDA7IGluZGV4MCA8IGRlc2NyaXB0b3JTZXRDb3VudDsgaW5kZXgwKyspIHsKKyAgICAgICAgICAgIERlc3Ryb3lPYmplY3QocERlc2NyaXB0b3JTZXRzW2luZGV4MF0pOworICAgICAgICAgICAgcG9vbF9kZXNjcmlwdG9yX3NldHMuZXJhc2UocERlc2NyaXB0b3JTZXRzW2luZGV4MF0pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZERlc3Ryb3lEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIGF1dG8gbG9jayA9IHJlYWRfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgYXV0byBpdGVyYXRvciA9IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcC5maW5kKGRlc2NyaXB0b3JQb29sKTsKKyAgICAvLyBQb3NzaWJsZSB0byBoYXZlIG5vIGRlc2NyaXB0b3Igc2V0cyBhbGxvY2F0ZWQgZnJvbSBwb29sCisgICAgaWYgKGl0ZXJhdG9yICE9IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcC5lbmQoKSkgeworICAgICAgICBmb3IoYXV0byBkZXNjcmlwdG9yX3NldCA6IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtkZXNjcmlwdG9yUG9vbF0pIHsKKyAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95RGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChkZXNjcmlwdG9yUG9vbCk7CisgICAgRGVzdHJveU9iamVjdChkZXNjcmlwdG9yUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIHsKKyAgICAgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGltcGxpY2l0bHkgZnJlZWQgZGVzY3JpcHRvciBzZXRzCisgICAgICAgIGZvcihhdXRvIGRlc2NyaXB0b3Jfc2V0IDogcG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwW2Rlc2NyaXB0b3JQb29sXSkgeworICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICAgICAgRGVzdHJveU9iamVjdChkZXNjcmlwdG9yX3NldCk7CisgICAgICAgIH0KKyAgICAgICAgcG9vbF9kZXNjcmlwdG9yX3NldHNfbWFwW2Rlc2NyaXB0b3JQb29sXS5jbGVhcigpOworICAgICAgICBwb29sX2Rlc2NyaXB0b3Jfc2V0c19tYXAuZXJhc2UoZGVzY3JpcHRvclBvb2wpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRSZXNldERlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICBmbGFncykgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yUG9vbCk7CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclBvb2wgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIC8vIGFueSBzbmFtZTpWa0Rlc2NyaXB0b3JTZXQgb2JqZWN0cyBhbGxvY2F0ZWQgZnJvbSBwbmFtZTpkZXNjcmlwdG9yUG9vbCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkIGJldHdlZW4gaG9zdCBhY2Nlc3NlcworICAgIGF1dG8gbG9jayA9IHJlYWRfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgYXV0byBpdGVyYXRvciA9IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcC5maW5kKGRlc2NyaXB0b3JQb29sKTsKKyAgICAvLyBQb3NzaWJsZSB0byBoYXZlIG5vIGRlc2NyaXB0b3Igc2V0cyBhbGxvY2F0ZWQgZnJvbSBwb29sCisgICAgaWYgKGl0ZXJhdG9yICE9IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcC5lbmQoKSkgeworICAgICAgICBmb3IoYXV0byBkZXNjcmlwdG9yX3NldCA6IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtkZXNjcmlwdG9yUG9vbF0pIHsKKyAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRSZXNldERlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGRlc2NyaXB0b3JQb29sKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBkZXNjcmlwdG9yUG9vbCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gYW55IHNuYW1lOlZrRGVzY3JpcHRvclNldCBvYmplY3RzIGFsbG9jYXRlZCBmcm9tIHBuYW1lOmRlc2NyaXB0b3JQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiBob3N0IGFjY2Vzc2VzCisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGltcGxpY2l0bHkgZnJlZWQgZGVzY3JpcHRvciBzZXRzCisgICAgICAgIGF1dG8gbG9jayA9IHdyaXRlX2xvY2tfZ3VhcmRfdCh0aHJlYWRfc2FmZXR5X2xvY2spOworICAgICAgICBmb3IoYXV0byBkZXNjcmlwdG9yX3NldCA6IHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtkZXNjcmlwdG9yUG9vbF0pIHsKKyAgICAgICAgICAgIEZpbmlzaFdyaXRlT2JqZWN0KGRlc2NyaXB0b3Jfc2V0KTsKKyAgICAgICAgICAgIERlc3Ryb3lPYmplY3QoZGVzY3JpcHRvcl9zZXQpOworICAgICAgICB9CisgICAgICAgIHBvb2xfZGVzY3JpcHRvcl9zZXRzX21hcFtkZXNjcmlwdG9yUG9vbF0uY2xlYXIoKTsKKyAgICB9Cit9CisKK2Jvb2wgVGhyZWFkU2FmZXR5OjpEc1VwZGF0ZUFmdGVyQmluZChWa0Rlc2NyaXB0b3JTZXQgc2V0KSBjb25zdAoreworICAgIGF1dG8gaXRlciA9IGRzX3VwZGF0ZV9hZnRlcl9iaW5kX21hcC5maW5kKHNldCk7CisgICAgaWYgKGl0ZXIgIT0gZHNfdXBkYXRlX2FmdGVyX2JpbmRfbWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIGlmIChwRGVzY3JpcHRvcldyaXRlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4PTA7IGluZGV4IDwgZGVzY3JpcHRvcldyaXRlQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGF1dG8gZHN0U2V0ID0gcERlc2NyaXB0b3JXcml0ZXNbaW5kZXhdLmRzdFNldDsKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlX2FmdGVyX2JpbmQgPSBEc1VwZGF0ZUFmdGVyQmluZChkc3RTZXQpOworICAgICAgICAgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgICAgICAgICAgU3RhcnRSZWFkT2JqZWN0KGRzdFNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QoZHN0U2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGRlc2NyaXB0b3JDb3B5Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGF1dG8gZHN0U2V0ID0gcERlc2NyaXB0b3JDb3BpZXNbaW5kZXhdLmRzdFNldDsKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlX2FmdGVyX2JpbmQgPSBEc1VwZGF0ZUFmdGVyQmluZChkc3RTZXQpOworICAgICAgICAgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgICAgICAgICAgU3RhcnRSZWFkT2JqZWN0KGRzdFNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0YXJ0V3JpdGVPYmplY3QoZHN0U2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXJ0UmVhZE9iamVjdChwRGVzY3JpcHRvckNvcGllc1tpbmRleF0uc3JjU2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIb3N0IGFjY2VzcyB0byBwRGVzY3JpcHRvcldyaXRlc1tdLmRzdFNldCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcERlc2NyaXB0b3JDb3BpZXNbXS5kc3RTZXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRVcGRhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JXcml0ZUNvdW50LAorICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgIGNvbnN0IFZrQ29weURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBpZiAocERlc2NyaXB0b3JXcml0ZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGRlc2NyaXB0b3JXcml0ZUNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBhdXRvIGRzdFNldCA9IHBEZXNjcmlwdG9yV3JpdGVzW2luZGV4XS5kc3RTZXQ7CisgICAgICAgICAgICBib29sIHVwZGF0ZV9hZnRlcl9iaW5kID0gRHNVcGRhdGVBZnRlckJpbmQoZHN0U2V0KTsKKyAgICAgICAgICAgIGlmICh1cGRhdGVfYWZ0ZXJfYmluZCkgeworICAgICAgICAgICAgICAgIEZpbmlzaFJlYWRPYmplY3QoZHN0U2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoZHN0U2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocERlc2NyaXB0b3JDb3BpZXMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8IGRlc2NyaXB0b3JDb3B5Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGF1dG8gZHN0U2V0ID0gcERlc2NyaXB0b3JDb3BpZXNbaW5kZXhdLmRzdFNldDsKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlX2FmdGVyX2JpbmQgPSBEc1VwZGF0ZUFmdGVyQmluZChkc3RTZXQpOworICAgICAgICAgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgICAgICAgICAgRmluaXNoUmVhZE9iamVjdChkc3RTZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGaW5pc2hXcml0ZU9iamVjdChkc3RTZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmluaXNoUmVhZE9iamVjdChwRGVzY3JpcHRvckNvcGllc1tpbmRleF0uc3JjU2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIb3N0IGFjY2VzcyB0byBwRGVzY3JpcHRvcldyaXRlc1tdLmRzdFNldCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gcERlc2NyaXB0b3JDb3BpZXNbXS5kc3RTZXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCisgICAgYm9vbCB1cGRhdGVfYWZ0ZXJfYmluZCA9IERzVXBkYXRlQWZ0ZXJCaW5kKGRlc2NyaXB0b3JTZXQpOworICAgIGlmICh1cGRhdGVfYWZ0ZXJfYmluZCkgeworICAgICAgICBTdGFydFJlYWRPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yU2V0KTsKKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclNldCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKKyAgICBib29sIHVwZGF0ZV9hZnRlcl9iaW5kID0gRHNVcGRhdGVBZnRlckJpbmQoZGVzY3JpcHRvclNldCk7CisgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgIEZpbmlzaFJlYWRPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRlc2NyaXB0b3JTZXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChkZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpOworCisgICAgYm9vbCB1cGRhdGVfYWZ0ZXJfYmluZCA9IERzVXBkYXRlQWZ0ZXJCaW5kKGRlc2NyaXB0b3JTZXQpOworICAgIGlmICh1cGRhdGVfYWZ0ZXJfYmluZCkgeworICAgICAgICBTdGFydFJlYWRPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU3RhcnRXcml0ZU9iamVjdChkZXNjcmlwdG9yU2V0KTsKKyAgICB9CisgICAgLy8gSG9zdCBhY2Nlc3MgdG8gZGVzY3JpcHRvclNldCBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZFVwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0LAorICAgIFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KGRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSk7CisKKyAgICBib29sIHVwZGF0ZV9hZnRlcl9iaW5kID0gRHNVcGRhdGVBZnRlckJpbmQoZGVzY3JpcHRvclNldCk7CisgICAgaWYgKHVwZGF0ZV9hZnRlcl9iaW5kKSB7CisgICAgICAgIEZpbmlzaFJlYWRPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoZGVzY3JpcHRvclNldCk7CisgICAgfQorICAgIC8vIEhvc3QgYWNjZXNzIHRvIGRlc2NyaXB0b3JTZXQgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZEZyZWVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciAqcENvbW1hbmRCdWZmZXJzKSB7CisgICAgY29uc3QgYm9vbCBsb2NrQ29tbWFuZFBvb2wgPSBmYWxzZTsgIC8vIHBvb2wgaXMgYWxyZWFkeSBkaXJlY3RseSBsb2NrZWQKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIGlmKHBDb21tYW5kQnVmZmVycykgeworICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSdyZSBpbW1lZGlhdGVseSAiZmluaXNoaW5nIiBiZWxvdywgd2Ugc3RpbGwgYXJlIHRlc3RpbmcgZm9yIGNvbmN1cnJlbmN5IHdpdGggYW55IGNhbGwgaW4gcHJvY2VzcworICAgICAgICAvLyBzbyB0aGlzIGlzbid0IGEgbm8tb3AKKyAgICAgICAgLy8gVGhlIGRyaXZlciBtYXkgaW1tZWRpYXRlbHkgcmV1c2UgY29tbWFuZCBidWZmZXJzIGluIGFub3RoZXIgdGhyZWFkLgorICAgICAgICAvLyBUaGVzZSB1cGRhdGVzIG5lZWQgdG8gYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBkb3duIHRvIHRoZSBkcml2ZXIuCisgICAgICAgIGF1dG8gbG9jayA9IHdyaXRlX2xvY2tfZ3VhcmRfdCh0aHJlYWRfc2FmZXR5X2xvY2spOworICAgICAgICBhdXRvICZwb29sX2NvbW1hbmRfYnVmZmVycyA9IHBvb2xfY29tbWFuZF9idWZmZXJzX21hcFtjb21tYW5kUG9vbF07CisgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvbW1hbmRCdWZmZXJDb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgU3RhcnRXcml0ZU9iamVjdChwQ29tbWFuZEJ1ZmZlcnNbaW5kZXhdLCBsb2NrQ29tbWFuZFBvb2wpOworICAgICAgICAgICAgRmluaXNoV3JpdGVPYmplY3QocENvbW1hbmRCdWZmZXJzW2luZGV4XSwgbG9ja0NvbW1hbmRQb29sKTsKKyAgICAgICAgICAgIERlc3Ryb3lPYmplY3QocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgICAgICBwb29sX2NvbW1hbmRfYnVmZmVycy5lcmFzZShwQ29tbWFuZEJ1ZmZlcnNbaW5kZXhdKTsKKyAgICAgICAgICAgIGNvbW1hbmRfcG9vbF9tYXAuZXJhc2UocENvbW1hbmRCdWZmZXJzW2luZGV4XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEZyZWVDb21tYW5kQnVmZmVycyhWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIgKnBDb21tYW5kQnVmZmVycykgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KGNvbW1hbmRQb29sKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kUG9vbCkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZENyZWF0ZUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQ29tbWFuZFBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRQb29sLAorICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIENyZWF0ZU9iamVjdCgqcENvbW1hbmRQb29sKTsKKyAgICAgICAgY19Wa0NvbW1hbmRQb29sQ29udGVudHMuQ3JlYXRlT2JqZWN0KCpwQ29tbWFuZFBvb2wpOworICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRSZXNldENvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgVmtDb21tYW5kUG9vbFJlc2V0RmxhZ3MgZmxhZ3MpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIC8vIENoZWNrIGZvciBhbnkgdXNlcyBvZiBub24tZXh0ZXJuYWxseSBzeW5jJ2QgY29tbWFuZCBidWZmZXJzIChmb3IgZXhhbXBsZSBmcm9tIHZrQ21kRXhlY3V0ZUNvbW1hbmRzKQorICAgIGNfVmtDb21tYW5kUG9vbENvbnRlbnRzLlN0YXJ0V3JpdGUoY29tbWFuZFBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkUmVzZXRDb21tYW5kUG9vbChWa0RldmljZSBkZXZpY2UsIFZrQ29tbWFuZFBvb2wgY29tbWFuZFBvb2wsIFZrQ29tbWFuZFBvb2xSZXNldEZsYWdzIGZsYWdzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hXcml0ZU9iamVjdChjb21tYW5kUG9vbCk7CisgICAgY19Wa0NvbW1hbmRQb29sQ29udGVudHMuRmluaXNoV3JpdGUoY29tbWFuZFBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95Q29tbWFuZFBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0V3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIC8vIENoZWNrIGZvciBhbnkgdXNlcyBvZiBub24tZXh0ZXJuYWxseSBzeW5jJ2QgY29tbWFuZCBidWZmZXJzIChmb3IgZXhhbXBsZSBmcm9tIHZrQ21kRXhlY3V0ZUNvbW1hbmRzKQorICAgIGNfVmtDb21tYW5kUG9vbENvbnRlbnRzLlN0YXJ0V3JpdGUoY29tbWFuZFBvb2wpOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIGNvbW1hbmRQb29sIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQKKworICAgIGF1dG8gbG9jayA9IHdyaXRlX2xvY2tfZ3VhcmRfdCh0aHJlYWRfc2FmZXR5X2xvY2spOworICAgIC8vIFRoZSBkcml2ZXIgbWF5IGltbWVkaWF0ZWx5IHJldXNlIGNvbW1hbmQgYnVmZmVycyBpbiBhbm90aGVyIHRocmVhZC4KKyAgICAvLyBUaGVzZSB1cGRhdGVzIG5lZWQgdG8gYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBkb3duIHRvIHRoZSBkcml2ZXIuCisgICAgLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gaW1wbGljaXRseSBmcmVlZCBjb21tYW5kIHBvb2xzCisgICAgZm9yKGF1dG8gY29tbWFuZF9idWZmZXIgOiBwb29sX2NvbW1hbmRfYnVmZmVyc19tYXBbY29tbWFuZFBvb2xdKSB7CisgICAgICAgIERlc3Ryb3lPYmplY3QoY29tbWFuZF9idWZmZXIpOworICAgIH0KKyAgICBwb29sX2NvbW1hbmRfYnVmZmVyc19tYXBbY29tbWFuZFBvb2xdLmNsZWFyKCk7CisgICAgcG9vbF9jb21tYW5kX2J1ZmZlcnNfbWFwLmVyYXNlKGNvbW1hbmRQb29sKTsKK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlBvc3RDYWxsUmVjb3JkRGVzdHJveUNvbW1hbmRQb29sKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbCwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgRmluaXNoUmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgRmluaXNoV3JpdGVPYmplY3QoY29tbWFuZFBvb2wpOworICAgIERlc3Ryb3lPYmplY3QoY29tbWFuZFBvb2wpOworICAgIGNfVmtDb21tYW5kUG9vbENvbnRlbnRzLkZpbmlzaFdyaXRlKGNvbW1hbmRQb29sKTsKKyAgICBjX1ZrQ29tbWFuZFBvb2xDb250ZW50cy5EZXN0cm95T2JqZWN0KGNvbW1hbmRQb29sKTsKK30KKworLy8gR2V0U3dhcGNoYWluSW1hZ2VzIGNhbiByZXR1cm4gYSBub24temVybyBjb3VudCB3aXRoIGEgTlVMTCBwU3dhcGNoYWluSW1hZ2VzIHBvaW50ZXIuICBMZXQncyBhdm9pZCBjcmFzaGVzIGJ5IGlnbm9yaW5nCisvLyBwU3dhcGNoYWluSW1hZ2VzLgordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90ICpwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2UgKnBTd2FwY2hhaW5JbWFnZXMpIHsKKyAgICBTdGFydFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIFN0YXJ0UmVhZE9iamVjdChzd2FwY2hhaW4pOworfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmRHZXRTd2FwY2hhaW5JbWFnZXNLSFIoVmtEZXZpY2UgZGV2aWNlLCBWa1N3YXBjaGFpbktIUiBzd2FwY2hhaW4sIHVpbnQzMl90ICpwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlICpwU3dhcGNoYWluSW1hZ2VzLCBWa1Jlc3VsdCByZXN1bHQpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBGaW5pc2hSZWFkT2JqZWN0KHN3YXBjaGFpbik7CisgICAgaWYgKHBTd2FwY2hhaW5JbWFnZXMgIT0gTlVMTCkgeworICAgICAgICBhdXRvIGxvY2sgPSB3cml0ZV9sb2NrX2d1YXJkX3QodGhyZWFkX3NhZmV0eV9sb2NrKTsKKyAgICAgICAgYXV0byAmd3JhcHBlZF9zd2FwY2hhaW5faW1hZ2VfaGFuZGxlcyA9IHN3YXBjaGFpbl93cmFwcGVkX2ltYWdlX2hhbmRsZV9tYXBbc3dhcGNoYWluXTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdyYXBwZWRfc3dhcGNoYWluX2ltYWdlX2hhbmRsZXMuc2l6ZSgpKTsgaSA8ICpwU3dhcGNoYWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBDcmVhdGVPYmplY3QocFN3YXBjaGFpbkltYWdlc1tpXSk7CisgICAgICAgICAgICB3cmFwcGVkX3N3YXBjaGFpbl9pbWFnZV9oYW5kbGVzLmVtcGxhY2VfYmFjayhwU3dhcGNoYWluSW1hZ2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUaHJlYWRTYWZldHk6OlByZUNhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7CisgICAgU3RhcnRXcml0ZU9iamVjdChzd2FwY2hhaW4pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN3YXBjaGFpbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgYXV0byBsb2NrID0gcmVhZF9sb2NrX2d1YXJkX3QodGhyZWFkX3NhZmV0eV9sb2NrKTsKKyAgICBmb3IgKGF1dG8gJmltYWdlX2hhbmRsZSA6IHN3YXBjaGFpbl93cmFwcGVkX2ltYWdlX2hhbmRsZV9tYXBbc3dhcGNoYWluXSkgeworICAgICAgICBTdGFydFdyaXRlT2JqZWN0KGltYWdlX2hhbmRsZSk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95U3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFJlYWRPYmplY3RQYXJlbnRJbnN0YW5jZShkZXZpY2UpOworICAgIEZpbmlzaFdyaXRlT2JqZWN0KHN3YXBjaGFpbik7CisgICAgRGVzdHJveU9iamVjdChzd2FwY2hhaW4pOworICAgIC8vIEhvc3QgYWNjZXNzIHRvIHN3YXBjaGFpbiBtdXN0IGJlIGV4dGVybmFsbHkgc3luY2hyb25pemVkCisgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgZm9yIChhdXRvICZpbWFnZV9oYW5kbGUgOiBzd2FwY2hhaW5fd3JhcHBlZF9pbWFnZV9oYW5kbGVfbWFwW3N3YXBjaGFpbl0pIHsKKyAgICAgICAgRmluaXNoV3JpdGVPYmplY3QoaW1hZ2VfaGFuZGxlKTsKKyAgICAgICAgRGVzdHJveU9iamVjdChpbWFnZV9oYW5kbGUpOworICAgIH0KKyAgICBzd2FwY2hhaW5fd3JhcHBlZF9pbWFnZV9oYW5kbGVfbWFwLmVyYXNlKHN3YXBjaGFpbik7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpIHsKKyAgICBTdGFydFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBkZXZpY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorfQorCit2b2lkIFRocmVhZFNhZmV0eTo6UG9zdENhbGxSZWNvcmREZXN0cm95RGV2aWNlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvcikgeworICAgIEZpbmlzaFdyaXRlT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBEZXN0cm95T2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICAvLyBIb3N0IGFjY2VzcyB0byBkZXZpY2UgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZAorICAgIGF1dG8gbG9jayA9IHdyaXRlX2xvY2tfZ3VhcmRfdCh0aHJlYWRfc2FmZXR5X2xvY2spOworICAgIGZvciAoYXV0byAmcXVldWUgOiBkZXZpY2VfcXVldWVzX21hcFtkZXZpY2VdKSB7CisgICAgICAgIERlc3Ryb3lPYmplY3QocXVldWUpOworICAgIH0KKyAgICBkZXZpY2VfcXVldWVzX21hcFtkZXZpY2VdLmNsZWFyKCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVJbmRleCwKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXgsCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBDcmVhdGVPYmplY3QoKnBRdWV1ZSk7CisgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgZGV2aWNlX3F1ZXVlc19tYXBbZGV2aWNlXS5pbnNlcnQoKnBRdWV1ZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQcmVDYWxsUmVjb3JkR2V0RGV2aWNlUXVldWUyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVJbmZvMiogICAgICAgICAgICAgICAgICAgcFF1ZXVlSW5mbywKKyAgICBWa1F1ZXVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkgeworICAgIFN0YXJ0UmVhZE9iamVjdFBhcmVudEluc3RhbmNlKGRldmljZSk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZXR5OjpQb3N0Q2FsbFJlY29yZEdldERldmljZVF1ZXVlMigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0RldmljZVF1ZXVlSW5mbzIqICAgICAgICAgICAgICAgICAgIHBRdWV1ZUluZm8sCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVldWUpIHsKKyAgICBGaW5pc2hSZWFkT2JqZWN0UGFyZW50SW5zdGFuY2UoZGV2aWNlKTsKKyAgICBDcmVhdGVPYmplY3QoKnBRdWV1ZSk7CisgICAgYXV0byBsb2NrID0gd3JpdGVfbG9ja19ndWFyZF90KHRocmVhZF9zYWZldHlfbG9jayk7CisgICAgZGV2aWNlX3F1ZXVlc19tYXBbZGV2aWNlXS5pbnNlcnQoKnBRdWV1ZSk7Cit9CisKKyIiIgorCisKKyAgICAjIFRoaXMgaXMgYW4gb3JkZXJlZCBsaXN0IG9mIHNlY3Rpb25zIGluIHRoZSBoZWFkZXIgZmlsZS4KKyAgICBBTExfU0VDVElPTlMgPSBbJ2NvbW1hbmQnXQorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBlcnJGaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgd2FybkZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICBkaWFnRmlsZSA9IHN5cy5zdGRvdXQpOgorICAgICAgICBPdXRwdXRHZW5lcmF0b3IuX19pbml0X18oc2VsZiwgZXJyRmlsZSwgd2FybkZpbGUsIGRpYWdGaWxlKQorICAgICAgICAjIEludGVybmFsIHN0YXRlIC0gYWNjdW11bGF0b3JzIGZvciBkaWZmZXJlbnQgaW5uZXIgYmxvY2sgdGV4dAorICAgICAgICBzZWxmLnNlY3Rpb25zID0gZGljdChbKHNlY3Rpb24sIFtdKSBmb3Igc2VjdGlvbiBpbiBzZWxmLkFMTF9TRUNUSU9OU10pCisgICAgICAgIHNlbGYubm9uX2Rpc3BhdGNoYWJsZV90eXBlcyA9IHNldCgpCisgICAgICAgIHNlbGYub2JqZWN0X3RvX2RlYnVnX3JlcG9ydF90eXBlID0geworICAgICAgICAgICAgJ1ZrSW5zdGFuY2UnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTlNUQU5DRV9FWFQnLAorICAgICAgICAgICAgJ1ZrUGh5c2ljYWxEZXZpY2UnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhUJywKKyAgICAgICAgICAgICdWa0RldmljZScgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQnLAorICAgICAgICAgICAgJ1ZrUXVldWUnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQnLAorICAgICAgICAgICAgJ1ZrU2VtYXBob3JlJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0VNQVBIT1JFX0VYVCcsCisgICAgICAgICAgICAnVmtDb21tYW5kQnVmZmVyJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUJywKKyAgICAgICAgICAgICdWa0ZlbmNlJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhUJywKKyAgICAgICAgICAgICdWa0RldmljZU1lbW9yeScgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhUJywKKyAgICAgICAgICAgICdWa0J1ZmZlcicgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQnLAorICAgICAgICAgICAgJ1ZrSW1hZ2UnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQnLAorICAgICAgICAgICAgJ1ZrRXZlbnQnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQnLAorICAgICAgICAgICAgJ1ZrUXVlcnlQb29sJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQnLAorICAgICAgICAgICAgJ1ZrQnVmZmVyVmlldycgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVCcsCisgICAgICAgICAgICAnVmtJbWFnZVZpZXcnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVCcsCisgICAgICAgICAgICAnVmtTaGFkZXJNb2R1bGUnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TSEFERVJfTU9EVUxFX0VYVCcsCisgICAgICAgICAgICAnVmtQaXBlbGluZUNhY2hlJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfQ0FDSEVfRVhUJywKKyAgICAgICAgICAgICdWa1BpcGVsaW5lTGF5b3V0JyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUX0VYVCcsCisgICAgICAgICAgICAnVmtSZW5kZXJQYXNzJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhUJywKKyAgICAgICAgICAgICdWa1BpcGVsaW5lJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhUJywKKyAgICAgICAgICAgICdWa0Rlc2NyaXB0b3JTZXRMYXlvdXQnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhUJywKKyAgICAgICAgICAgICdWa1NhbXBsZXInIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVCcsCisgICAgICAgICAgICAnVmtEZXNjcmlwdG9yUG9vbCcgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQnLAorICAgICAgICAgICAgJ1ZrRGVzY3JpcHRvclNldCcgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCcsCisgICAgICAgICAgICAnVmtGcmFtZWJ1ZmZlcicgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSX0VYVCcsCisgICAgICAgICAgICAnVmtDb21tYW5kUG9vbCcgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfUE9PTF9FWFQnLAorICAgICAgICAgICAgJ1ZrU3VyZmFjZUtIUicgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSX0VYVCcsCisgICAgICAgICAgICAnVmtTd2FwY2hhaW5LSFInIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCcsCisgICAgICAgICAgICAnVmtEaXNwbGF5S0hSJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9LSFJfRVhUJywKKyAgICAgICAgICAgICdWa0Rpc3BsYXlNb2RlS0hSJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRElTUExBWV9NT0RFX0tIUl9FWFQnLAorICAgICAgICAgICAgJ1ZrT2JqZWN0VGFibGVOVlgnIDogJ1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9PQkpFQ1RfVEFCTEVfTlZYX0VYVCcsCisgICAgICAgICAgICAnVmtJbmRpcmVjdENvbW1hbmRzTGF5b3V0TlZYJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5ESVJFQ1RfQ09NTUFORFNfTEFZT1VUX05WWF9FWFQnLAorICAgICAgICAgICAgJ1ZrU2FtcGxlclljYmNyQ29udmVyc2lvbicgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFQnLAorICAgICAgICAgICAgJ1ZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhUJywKKyAgICAgICAgICAgICdWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVl9FWFQnLAorICAgICAgICAgICAgJ1ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCcgOiAnVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFQlVHX1JFUE9SVF9FWFQnLAorICAgICAgICAgICAgJ1ZrVmFsaWRhdGlvbkNhY2hlRVhUJyA6ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVkFMSURBVElPTl9DQUNIRV9FWFQnIH0KKworICAgICMgQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBwYXNzZWQgaW4gaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5CisgICAgZGVmIHBhcmFtSXNBcnJheShzZWxmLCBwYXJhbSk6CisgICAgICAgIHJldHVybiBwYXJhbS5hdHRyaWIuZ2V0KCdsZW4nKSBpcyBub3QgTm9uZQorCisgICAgIyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBhIHBvaW50ZXIKKyAgICBkZWYgcGFyYW1Jc1BvaW50ZXIoc2VsZiwgcGFyYW0pOgorICAgICAgICBpc3BvaW50ZXIgPSBGYWxzZQorICAgICAgICBmb3IgZWxlbSBpbiBwYXJhbToKKyAgICAgICAgICAgIGlmIGVsZW0udGFnID09ICd0eXBlJyBhbmQgZWxlbS50YWlsIGlzIG5vdCBOb25lIGFuZCAnKicgaW4gZWxlbS50YWlsOgorICAgICAgICAgICAgICAgIGlzcG9pbnRlciA9IFRydWUKKyAgICAgICAgcmV0dXJuIGlzcG9pbnRlcgorCisgICAgIyBNYXAgcGFyYW10eXBlIHRvIGEgdGhyZWFkIHNhZmV0eSBzdWZmaXgsIGVpdGhlciAnUGFyZW50SW5zdGFuY2UnIG9yICcnCisgICAgZGVmIHBhcmFtU3VmZml4KHNlbGYsIHBhcmFtdHlwZSk6CisgICAgICAgIGlmIHBhcmFtdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhcmFtdHlwZSA9IHBhcmFtdHlwZS50ZXh0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJhbXR5cGUgPSAnTm9uZScKKworICAgICAgICAjIFVzZSAnaW4nIHRvIGNoZWNrIHRoZSB0eXBlcywgdG8gaGFuZGxlIHN1ZmZpeGVzIGFuZCBwb2ludGVycywgZXhjZXB0IGZvciBWa0RldmljZQorICAgICAgICAjIHdoaWNoIGNhbiBiZSBjb25mdXNlZCB3aXRoIFZrRGV2aWNlTWVtb3J5CisgICAgICAgIHN1ZmZpeCA9ICcnCisgICAgICAgIGlmICdWa1N1cmZhY2UnIGluIHBhcmFtdHlwZSBvciAnVmtEZWJ1Z1JlcG9ydENhbGxiYWNrJyBpbiBwYXJhbXR5cGUgb3IgJ1ZrRGVidWdVdGlsc01lc3NlbmdlcicgaW4gcGFyYW10eXBlIG9yICdWa0RldmljZScgPT0gcGFyYW10eXBlIG9yICdWa0RldmljZSonID09IHBhcmFtdHlwZSBvciAnVmtJbnN0YW5jZScgaW4gcGFyYW10eXBlOgorICAgICAgICAgICAgc3VmZml4ID0gJ1BhcmVudEluc3RhbmNlJworICAgICAgICByZXR1cm4gc3VmZml4CisKKyAgICBkZWYgbWFrZVRocmVhZFVzZUJsb2NrKHNlbGYsIGNtZCwgbmFtZSwgZnVuY3Rpb25wcmVmaXgpOgorICAgICAgICAiIiJHZW5lcmF0ZSBDIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZiBmb3IgPGNvbW1hbmQ+IEVsZW1lbnQiIiIKKyAgICAgICAgcGFyYW1kZWNsID0gJycKKyAgICAgICAgIyBGaW5kIGFuZCBhZGQgYW55IHBhcmFtZXRlcnMgdGhhdCBhcmUgdGhyZWFkIHVuc2FmZQorICAgICAgICBwYXJhbXMgPSBjbWQuZmluZGFsbCgncGFyYW0nKQorICAgICAgICBmb3IgcGFyYW0gaW4gcGFyYW1zOgorICAgICAgICAgICAgcGFyYW1uYW1lID0gcGFyYW0uZmluZCgnbmFtZScpCisgICAgICAgICAgICBpZiBGYWxzZTogIyBzZWxmLnBhcmFtSXNQb2ludGVyKHBhcmFtKToKKyAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gJyAgICAvLyBub3Qgd2F0Y2hpbmcgdXNlIG9mIHBvaW50ZXIgJyArIHBhcmFtbmFtZS50ZXh0ICsgJ1xuJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleHRlcm5zeW5jID0gcGFyYW0uYXR0cmliLmdldCgnZXh0ZXJuc3luYycpCisgICAgICAgICAgICAgICAgaWYgZXh0ZXJuc3luYyA9PSAndHJ1ZSc6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGFyYW1Jc0FycmF5KHBhcmFtKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnaWYgKCcgKyBwYXJhbW5hbWUudGV4dCArICcpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnICAgIGZvciAodWludDMyX3QgaW5kZXg9MDsgaW5kZXggPCAnICsgcGFyYW0uYXR0cmliLmdldCgnbGVuJykgKyAnOyBpbmRleCsrKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gJyAgICAgICAgJyArIGZ1bmN0aW9ucHJlZml4ICsgJ1dyaXRlT2JqZWN0JyArIHNlbGYucGFyYW1TdWZmaXgocGFyYW0uZmluZCgndHlwZScpKSArICcoJyArIHBhcmFtbmFtZS50ZXh0ICsgJ1tpbmRleF0pO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICd9XG4nCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gZnVuY3Rpb25wcmVmaXggKyAnV3JpdGVPYmplY3QnICsgc2VsZi5wYXJhbVN1ZmZpeChwYXJhbS5maW5kKCd0eXBlJykpICsgJygnICsgcGFyYW1uYW1lLnRleHQgKyAnKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnRGVzdHJveScgaW4gbmFtZSBvciAnRnJlZScgaW4gbmFtZSkgYW5kIGZ1bmN0aW9ucHJlZml4ID09ICdGaW5pc2gnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnRGVzdHJveU9iamVjdCcgKyBzZWxmLnBhcmFtU3VmZml4KHBhcmFtLmZpbmQoJ3R5cGUnKSkgKyAnKCcgKyBwYXJhbW5hbWUudGV4dCArICcpO1xuJworICAgICAgICAgICAgICAgIGVsaWYgKHBhcmFtLmF0dHJpYi5nZXQoJ2V4dGVybnN5bmMnKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGFyYW1Jc0FycmF5KHBhcmFtKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRXh0ZXJuc3luYyBjYW4gbGlzdCBwb2ludGVycyB0byBhcnJheXMgb2YgbWVtYmVycyB0byBzeW5jaHJvbml6ZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICdpZiAoJyArIHBhcmFtbmFtZS50ZXh0ICsgJykge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcgICAgZm9yICh1aW50MzJfdCBpbmRleD0wOyBpbmRleCA8ICcgKyBwYXJhbS5hdHRyaWIuZ2V0KCdsZW4nKSArICc7IGluZGV4KyspIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9pbmRlbnQgPSAnICAgICcKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gZXh0ZXJuc3luYy5zcGxpdCgiLCIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUmVwbGFjZSBmaXJzdCBlbXB0eSBbXSBpbiBtZW1iZXIgbmFtZSB3aXRoIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG1lbWJlci5yZXBsYWNlKCdbXScsJ1tpbmRleF0nLDEpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBUT0RPOiBDYW4gd2UgZG8gYmV0dGVyIHRvIGxvb2t1cCB0eXBlcyBvZiBleHRlcm5zeW5jIG1lbWJlcnM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAnc3VyZmFjZScgaW4gbWVtYmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAnUGFyZW50SW5zdGFuY2UnCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAnW10nIGluIGVsZW1lbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVE9ETzogVGhlc2UgbnVsbCBjaGVja3MgY2FuIGJlIHJlbW92ZWQgaWYgdGhyZWFkaW5nIGVuZHMgdXAgYmVoaW5kIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgIHZhbGlkYXRpb24gaW4gbGF5ZXIgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9wdHIgPSBlbGVtZW50LnNwbGl0KCdbXScpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnICAgICAgICBpZiAoJyArIGVsZW1lbnRfcHRyICsgJykge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlcGxhY2UgYW55IHNlY29uZCBlbXB0eSBbXSBpbiBlbGVtZW50IG5hbWUgd2l0aCBpbm5lciBhcnJheSBpbmRleCBiYXNlZCBvbiBtYXBwaW5nIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmFtZXMgbGlrZSAicFNvbWVUaGluZ3NbXSIgdG8gInNvbWVUaGluZ0NvdW50IiBhcnJheSBzaXplLiBUaGlzIGNvdWxkIGJlIG1vcmUgcm9idXN0IGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWFwcGluZyBhIHBhcmFtIG1lbWJlciBuYW1lIHRvIGEgc3RydWN0IHR5cGUgYW5kICJsZW4iIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBlbGVtZW50WzA6ZWxlbWVudC5maW5kKCdzW10nKV0gKyAnQ291bnQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdHAgPSBsaW1pdC5yZmluZCgnLnAnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGxpbWl0WzA6ZG90cCsxXSArIGxpbWl0W2RvdHArMjpkb3RwKzNdLmxvd2VyKCkgKyBsaW1pdFtkb3RwKzM6XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gJyAgICAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXgyPTA7IGluZGV4MiA8ICcrbGltaXQrJzsgaW5kZXgyKyspIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucmVwbGFjZSgnW10nLCdbaW5kZXgyXScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9pbmRlbnQgPSAnICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnICAgICAgICAnICsgc2Vjb25kX2luZGVudCArIGZ1bmN0aW9ucHJlZml4ICsgJ1dyaXRlT2JqZWN0JyArIHN1ZmZpeCArICcoJyArIGVsZW1lbnQgKyAnKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcgICAgJyArIHNlY29uZF9pbmRlbnQgKyBmdW5jdGlvbnByZWZpeCArICdXcml0ZU9iamVjdCcgKyBzdWZmaXggKyAnKCcgKyBlbGVtZW50ICsgJyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gJyAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gJ31cbicKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0ZXJuc3luYyBjYW4gbGlzdCBtZW1iZXJzIHRvIHN5bmNocm9uaXplCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbWVtYmVyIGluIGV4dGVybnN5bmMuc3BsaXQoIiwiKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIgPSBzdHIobWVtYmVyKS5yZXBsYWNlKCI6OiIsICItPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyID0gc3RyKG1lbWJlcikucmVwbGFjZSgiLiIsICItPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggVE9ETzogQ2FuIHdlIGRvIGJldHRlciB0byBsb29rdXAgdHlwZXMgb2YgZXh0ZXJuc3luYyBtZW1iZXJzPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3N1cmZhY2UnIGluIG1lbWJlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gJ1BhcmVudEluc3RhbmNlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnICAgICcgKyBmdW5jdGlvbnByZWZpeCArICdXcml0ZU9iamVjdCcgKyBzdWZmaXggKyAnKCcgKyBtZW1iZXIgKyAnKTtcbicKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYucGFyYW1Jc1BvaW50ZXIocGFyYW0pIGFuZCAoJ0NyZWF0ZScgaW4gbmFtZSBvciAnQWxsb2NhdGUnIGluIG5hbWUpIGFuZCBmdW5jdGlvbnByZWZpeCA9PSAnRmluaXNoJzoKKyAgICAgICAgICAgICAgICAgICAgcGFyYW10eXBlID0gcGFyYW0uZmluZCgndHlwZScpCisgICAgICAgICAgICAgICAgICAgIGlmIHBhcmFtdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtdHlwZSA9IHBhcmFtdHlwZS50ZXh0CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXR5cGUgPSAnTm9uZScKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFyYW10eXBlIGluIHNlbGYuaGFuZGxlX3R5cGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9waXBlbGluZXNfY2FsbCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIENyZWF0ZVh4eFBpcGVsaW5lcyBBUElzIGNhbiByZXR1cm4gYSBsaXN0IG9mIHBhcnRseSBjcmVhdGVkIHBpcGVsaW5lcyB1cG9uIGZhaWx1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoJ0NyZWF0ZScgaW4gbmFtZSBhbmQgJ1BpcGVsaW5lcycgaW4gbmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICdpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVfcGlwZWxpbmVzX2NhbGwgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9ICcgICAgJworICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wYXJhbUlzQXJyYXkocGFyYW0pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIHBvaW50ZXIgZGVyZWZlcmVuY2UgZm9yIGFycmF5IGNvdW50cyB0aGF0IGFyZSBwb2ludGVyIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNlID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2FuZGlkYXRlIGluIHBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGFyYW0uYXR0cmliLmdldCgnbGVuJykgPT0gY2FuZGlkYXRlLmZpbmQoJ25hbWUnKS50ZXh0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wYXJhbUlzUG9pbnRlcihjYW5kaWRhdGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNlID0gJyonCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fbGVuID0gc3RyKHBhcmFtLmF0dHJpYi5nZXQoJ2xlbicpKS5yZXBsYWNlKCI6OiIsICItPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9IGluZGVudCArICdpZiAoJyArIHBhcmFtbmFtZS50ZXh0ICsgJykge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSBpbmRlbnQgKyAnICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8ICcgKyBkZXJlZmVyZW5jZSArIHBhcmFtX2xlbiArICc7IGluZGV4KyspIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjcmVhdGVfcGlwZWxpbmVzX2NhbGw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSBpbmRlbnQgKyAnICAgICAgICBpZiAoIXBQaXBlbGluZXNbaW5kZXhdKSBjb250aW51ZTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gaW5kZW50ICsgJyAgICAgICAgQ3JlYXRlT2JqZWN0JyArIHNlbGYucGFyYW1TdWZmaXgocGFyYW0uZmluZCgndHlwZScpKSArICcoJyArIHBhcmFtbmFtZS50ZXh0ICsgJ1tpbmRleF0pO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSBpbmRlbnQgKyAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gaW5kZW50ICsgJ31cbicKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcgICAgQ3JlYXRlT2JqZWN0JyArIHNlbGYucGFyYW1TdWZmaXgocGFyYW0uZmluZCgndHlwZScpKSArICcoKicgKyBwYXJhbW5hbWUudGV4dCArICcpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNyZWF0ZV9waXBlbGluZXNfY2FsbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gJ31cbicKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwYXJhbXR5cGUgPSBwYXJhbS5maW5kKCd0eXBlJykKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFyYW10eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW10eXBlID0gcGFyYW10eXBlLnRleHQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtdHlwZSA9ICdOb25lJworICAgICAgICAgICAgICAgICAgICBpZiBwYXJhbXR5cGUgaW4gc2VsZi5oYW5kbGVfdHlwZXMgYW5kIHBhcmFtdHlwZSAhPSAnVmtQaHlzaWNhbERldmljZSc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBhcmFtSXNBcnJheShwYXJhbSkgYW5kICgncFBpcGVsaW5lcycgIT0gcGFyYW1uYW1lLnRleHQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIHBvaW50ZXIgZGVyZWZlcmVuY2UgZm9yIGFycmF5IGNvdW50cyB0aGF0IGFyZSBwb2ludGVyIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNlID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2FuZGlkYXRlIGluIHBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGFyYW0uYXR0cmliLmdldCgnbGVuJykgPT0gY2FuZGlkYXRlLmZpbmQoJ25hbWUnKS50ZXh0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wYXJhbUlzUG9pbnRlcihjYW5kaWRhdGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNlID0gJyonCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fbGVuID0gc3RyKHBhcmFtLmF0dHJpYi5nZXQoJ2xlbicpKS5yZXBsYWNlKCI6OiIsICItPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICdpZiAoJyArIHBhcmFtbmFtZS50ZXh0ICsgJykge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8ICcgKyBkZXJlZmVyZW5jZSArIHBhcmFtX2xlbiArICc7IGluZGV4KyspIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gJyAgICAgICAgJyArIGZ1bmN0aW9ucHJlZml4ICsgJ1JlYWRPYmplY3QnICsgc2VsZi5wYXJhbVN1ZmZpeChwYXJhbS5maW5kKCd0eXBlJykpICsgJygnICsgcGFyYW1uYW1lLnRleHQgKyAnW2luZGV4XSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5wYXJhbUlzUG9pbnRlcihwYXJhbSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQb2ludGVyIHBhcmFtcyBhcmUgb2Z0ZW4gYmVpbmcgY3JlYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZXkgYXJlIG5vdCBiZWluZyByZWFkIGZyb20uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9IGZ1bmN0aW9ucHJlZml4ICsgJ1JlYWRPYmplY3QnICsgc2VsZi5wYXJhbVN1ZmZpeChwYXJhbS5maW5kKCd0eXBlJykpICsgJygnICsgcGFyYW1uYW1lLnRleHQgKyAnKTtcbicKKyAgICAgICAgZXhwbGljaXRleHRlcm5zeW5jcGFyYW1zID0gY21kLmZpbmRhbGwoInBhcmFtW0BleHRlcm5zeW5jXSIpCisgICAgICAgIGlmIChleHBsaWNpdGV4dGVybnN5bmNwYXJhbXMgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgZm9yIHBhcmFtIGluIGV4cGxpY2l0ZXh0ZXJuc3luY3BhcmFtczoKKyAgICAgICAgICAgICAgICBleHRlcm5zeW5jYXR0cmliID0gcGFyYW0uYXR0cmliLmdldCgnZXh0ZXJuc3luYycpCisgICAgICAgICAgICAgICAgcGFyYW1uYW1lID0gcGFyYW0uZmluZCgnbmFtZScpCisgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcvLyBIb3N0IGFjY2VzcyB0byAnCisgICAgICAgICAgICAgICAgaWYgZXh0ZXJuc3luY2F0dHJpYiA9PSAndHJ1ZSc6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGFyYW1Jc0FycmF5KHBhcmFtKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnZWFjaCBtZW1iZXIgb2YgJyArIHBhcmFtbmFtZS50ZXh0CisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wYXJhbUlzUG9pbnRlcihwYXJhbSk6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWRlY2wgKz0gJ3RoZSBvYmplY3QgcmVmZXJlbmNlZCBieSAnICsgcGFyYW1uYW1lLnRleHQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSBwYXJhbW5hbWUudGV4dAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSBleHRlcm5zeW5jYXR0cmliCisgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZFxuJworCisgICAgICAgICMgRmluZCBhbmQgYWRkIGFueSAiaW1wbGljaXQiIHBhcmFtZXRlcnMgdGhhdCBhcmUgdGhyZWFkIHVuc2FmZQorICAgICAgICBpbXBsaWNpdGV4dGVybnN5bmNwYXJhbXMgPSBjbWQuZmluZCgnaW1wbGljaXRleHRlcm5zeW5jcGFyYW1zJykKKyAgICAgICAgaWYgKGltcGxpY2l0ZXh0ZXJuc3luY3BhcmFtcyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBmb3IgZWxlbSBpbiBpbXBsaWNpdGV4dGVybnN5bmNwYXJhbXM6CisgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9ICcvLyAnCisgICAgICAgICAgICAgICAgcGFyYW1kZWNsICs9IGVsZW0udGV4dAorICAgICAgICAgICAgICAgIHBhcmFtZGVjbCArPSAnIG11c3QgYmUgZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiBob3N0IGFjY2Vzc2VzXG4nCisKKyAgICAgICAgaWYgKHBhcmFtZGVjbCA9PSAnJyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHBhcmFtZGVjbAorICAgIGRlZiBiZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5iZWdpbkZpbGUoc2VsZiwgZ2VuT3B0cykKKyAgICAgICAgCisgICAgICAgICMgSW5pdGlhbGl6ZSBtZW1iZXJzIHRoYXQgcmVxdWlyZSB0aGUgdHJlZQorICAgICAgICBzZWxmLmhhbmRsZV90eXBlcyA9IEdldEhhbmRsZVR5cGVzKHNlbGYucmVnaXN0cnkudHJlZSkKKworICAgICAgICAjIFRPRE86IExVR01BTCAtLSByZW1vdmUgdGhpcyBhbmQgYWRkIG91ciBjb3B5cmlnaHQKKyAgICAgICAgIyBVc2VyLXN1cHBsaWVkIHByZWZpeCB0ZXh0LCBpZiBhbnkgKGxpc3Qgb2Ygc3RyaW5ncykKKyAgICAgICAgd3JpdGUoc2VsZi5pbmxpbmVfY29weXJpZ2h0X21lc3NhZ2UsIGZpbGU9c2VsZi5vdXRGaWxlKQorCisgICAgICAgIHNlbGYuaGVhZGVyX2ZpbGUgPSAoZ2VuT3B0cy5maWxlbmFtZSA9PSAndGhyZWFkX3NhZmV0eS5oJykKKyAgICAgICAgc2VsZi5zb3VyY2VfZmlsZSA9IChnZW5PcHRzLmZpbGVuYW1lID09ICd0aHJlYWRfc2FmZXR5LmNwcCcpCisKKyAgICAgICAgaWYgbm90IHNlbGYuaGVhZGVyX2ZpbGUgYW5kIG5vdCBzZWxmLnNvdXJjZV9maWxlOgorICAgICAgICAgICAgcHJpbnQoIkVycm9yOiBPdXRwdXQgRmlsZW5hbWVzIGhhdmUgY2hhbmdlZCwgdXBkYXRlIGdlbmVyYXRvciBzb3VyY2UuXG4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgICAgICBpZiBzZWxmLnNvdXJjZV9maWxlOgorICAgICAgICAgICAgd3JpdGUoJyNpbmNsdWRlICJjaGFzc2lzLmgiJywgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICB3cml0ZSgnI2luY2x1ZGUgInRocmVhZF9zYWZldHkuaCInLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICB3cml0ZShzZWxmLmlubGluZV9jdXN0b21fc291cmNlX3ByZWFtYmxlLCBmaWxlPXNlbGYub3V0RmlsZSkKKworCisgICAgZGVmIGVuZEZpbGUoc2VsZik6CisKKyAgICAgICAgIyBDcmVhdGUgY2xhc3MgZGVmaW5pdGlvbnMKKyAgICAgICAgY291bnRlcl9jbGFzc19kZWZzID0gJycKKyAgICAgICAgY291bnRlcl9jbGFzc19pbnN0YW5jZXMgPSAnJworICAgICAgICBjb3VudGVyX2NsYXNzX2JvZGllcyA9ICcnCisKKyAgICAgICAgZm9yIG9iaiBpbiBzb3J0ZWQoc2VsZi5ub25fZGlzcGF0Y2hhYmxlX3R5cGVzKToKKyAgICAgICAgICAgIGNvdW50ZXJfY2xhc3NfZGVmcyArPSAnICAgIGNvdW50ZXI8JXM+IGNfJXM7XG4nICUgKG9iaiwgb2JqKQorICAgICAgICAgICAgaWYgb2JqIGluIHNlbGYub2JqZWN0X3RvX2RlYnVnX3JlcG9ydF90eXBlOgorICAgICAgICAgICAgICAgIG9ial90eXBlID0gc2VsZi5vYmplY3RfdG9fZGVidWdfcmVwb3J0X3R5cGVbb2JqXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvYmpfdHlwZSA9ICdWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfVU5LTk9XTl9FWFQnCisgICAgICAgICAgICBjb3VudGVyX2NsYXNzX2luc3RhbmNlcyArPSAnICAgICAgICAgIGNfJXMoIiVzIiwgJXMsICZyZXBvcnRfZGF0YSksXG4nICUgKG9iaiwgb2JqLCBvYmpfdHlwZSkKKyAgICAgICAgICAgIGlmICdWa1N1cmZhY2UnIGluIG9iaiBvciAnVmtEZWJ1Z1JlcG9ydENhbGxiYWNrJyBpbiBvYmogb3IgJ1ZrRGVidWdVdGlsc01lc3NlbmdlcicgaW4gb2JqOgorICAgICAgICAgICAgICAgIGNvdW50ZXJfY2xhc3NfYm9kaWVzICs9ICdXUkFQUEVSX1BBUkVOVF9JTlNUQU5DRSglcylcbicgJSBvYmoKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY291bnRlcl9jbGFzc19ib2RpZXMgKz0gJ1dSQVBQRVIoJXMpXG4nICUgb2JqCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2ZpbGU6CisgICAgICAgICAgICBjbGFzc19kZWYgPSBzZWxmLmlubGluZV9jdXN0b21faGVhZGVyX3ByZWFtYmxlLnJlcGxhY2UoJ0NPVU5URVJfQ0xBU1NfREVGSU5JVElPTlNfVEVNUExBVEUnLCBjb3VudGVyX2NsYXNzX2RlZnMpCisgICAgICAgICAgICBjbGFzc19kZWYgPSBjbGFzc19kZWYucmVwbGFjZSgnQ09VTlRFUl9DTEFTU19JTlNUQU5DRVNfVEVNUExBVEUnLCBjb3VudGVyX2NsYXNzX2luc3RhbmNlc1s6LTJdKSAjIEtpbGwgbGFzdCBjb21tYQorICAgICAgICAgICAgY2xhc3NfZGVmID0gY2xhc3NfZGVmLnJlcGxhY2UoJ0NPVU5URVJfQ0xBU1NfQk9ESUVTX1RFTVBMQVRFJywgY291bnRlcl9jbGFzc19ib2RpZXMpCisgICAgICAgICAgICB3cml0ZShjbGFzc19kZWYsIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICB3cml0ZSgnXG4nLmpvaW4oc2VsZi5zZWN0aW9uc1snY29tbWFuZCddKSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2ZpbGU6CisgICAgICAgICAgICB3cml0ZSgnfTsnLCBmaWxlPXNlbGYub3V0RmlsZSkKKworICAgICAgICAjIEZpbmlzaCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmVuZEZpbGUoc2VsZikKKworICAgIGRlZiBiZWdpbkZlYXR1cmUoc2VsZiwgaW50ZXJmYWNlLCBlbWl0KToKKyAgICAgICAgI3dyaXRlKCcvLyBzdGFydGluZyBiZWdpbkZlYXR1cmUnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgIyBTdGFydCBwcm9jZXNzaW5nIGluIHN1cGVyY2xhc3MKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmJlZ2luRmVhdHVyZShzZWxmLCBpbnRlcmZhY2UsIGVtaXQpCisgICAgICAgICMgQy1zcGVjaWZpYworICAgICAgICAjIEFjY3VtdWxhdGUgaW5jbHVkZXMsIGRlZmluZXMsIHR5cGVzLCBlbnVtcywgZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmcywKKyAgICAgICAgIyBlbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBzZXBhcmF0ZWx5IGZvciB0aGlzIGZlYXR1cmUuIFRoZXkncmUgb25seQorICAgICAgICAjIHByaW50ZWQgaW4gZW5kRmVhdHVyZSgpLgorICAgICAgICBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgPSBHZXRGZWF0dXJlUHJvdGVjdChpbnRlcmZhY2UpCisgICAgICAgIGlmIChzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJ1xuI2lmZGVmICVzJyAlIHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCkKKworICAgICAgICAjd3JpdGUoJy8vIGVuZGluZyBiZWdpbkZlYXR1cmUnLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICBkZWYgZW5kRmVhdHVyZShzZWxmKToKKyAgICAgICAgIyBDLXNwZWNpZmljCisgICAgICAgIGlmIChzZWxmLmVtaXQpOgorICAgICAgICAgICAgaWYgKHNlbGYuZmVhdHVyZUV4dHJhUHJvdGVjdCBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJyNlbmRpZiAvLyAlcycgJSBzZWxmLmZlYXR1cmVFeHRyYVByb3RlY3QpCisgICAgICAgICMgRmluaXNoIHByb2Nlc3NpbmcgaW4gc3VwZXJjbGFzcworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZW5kRmVhdHVyZShzZWxmKQorICAgICMKKyAgICAjIEFwcGVuZCBhIGRlZmluaXRpb24gdG8gdGhlIHNwZWNpZmllZCBzZWN0aW9uCisgICAgZGVmIGFwcGVuZFNlY3Rpb24oc2VsZiwgc2VjdGlvbiwgdGV4dCk6CisgICAgICAgIHNlbGYuc2VjdGlvbnNbc2VjdGlvbl0uYXBwZW5kKHRleHQpCisgICAgIworICAgICMgVHlwZSBnZW5lcmF0aW9uCisgICAgZGVmIGdlblR5cGUoc2VsZiwgdHlwZWluZm8sIG5hbWUsIGFsaWFzKToKKyAgICAgICAgT3V0cHV0R2VuZXJhdG9yLmdlblR5cGUoc2VsZiwgdHlwZWluZm8sIG5hbWUsIGFsaWFzKQorICAgICAgICBpZiBzZWxmLmhhbmRsZV90eXBlcy5Jc05vbkRpc3BhdGNoYWJsZShuYW1lKToKKyAgICAgICAgICAgIHNlbGYubm9uX2Rpc3BhdGNoYWJsZV90eXBlcy5hZGQobmFtZSkKKyAgICAjCisgICAgIyBTdHJ1Y3QgKGUuZy4gQyAic3RydWN0IiB0eXBlKSBnZW5lcmF0aW9uLgorICAgICMgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgPHR5cGU+IHRhZyB3aGVyZSB0aGUgY29udGVudHMgYXJlCisgICAgIyBpbnRlcnByZXRlZCBhcyBhIHNldCBvZiA8bWVtYmVyPiB0YWdzIGluc3RlYWQgb2YgZnJlZWZvcm0gQworICAgICMgQyB0eXBlIGRlY2xhcmF0aW9ucy4gVGhlIDxtZW1iZXI+IHRhZ3MgYXJlIGp1c3QgbGlrZSA8cGFyYW0+CisgICAgIyB0YWdzIC0gdGhleSBhcmUgYSBkZWNsYXJhdGlvbiBvZiBhIHN0cnVjdCBvciB1bmlvbiBtZW1iZXIuCisgICAgIyBPbmx5IHNpbXBsZSBtZW1iZXIgZGVjbGFyYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vIG5lc3RlZAorICAgICMgc3RydWN0cyBldGMuKQorICAgIGRlZiBnZW5TdHJ1Y3Qoc2VsZiwgdHlwZWluZm8sIHR5cGVOYW1lLCBhbGlhcyk6CisgICAgICAgIE91dHB1dEdlbmVyYXRvci5nZW5TdHJ1Y3Qoc2VsZiwgdHlwZWluZm8sIHR5cGVOYW1lLCBhbGlhcykKKyAgICAgICAgYm9keSA9ICd0eXBlZGVmICcgKyB0eXBlaW5mby5lbGVtLmdldCgnY2F0ZWdvcnknKSArICcgJyArIHR5cGVOYW1lICsgJyB7XG4nCisgICAgICAgICMgcGFyYW1kZWNsID0gc2VsZi5tYWtlQ1BhcmFtRGVjbCh0eXBlaW5mby5lbGVtLCBzZWxmLmdlbk9wdHMuYWxpZ25GdW5jUGFyYW0pCisgICAgICAgIGZvciBtZW1iZXIgaW4gdHlwZWluZm8uZWxlbS5maW5kYWxsKCcuLy9tZW1iZXInKToKKyAgICAgICAgICAgIGJvZHkgKz0gc2VsZi5tYWtlQ1BhcmFtRGVjbChtZW1iZXIsIHNlbGYuZ2VuT3B0cy5hbGlnbkZ1bmNQYXJhbSkKKyAgICAgICAgICAgIGJvZHkgKz0gJztcbicKKyAgICAgICAgYm9keSArPSAnfSAnICsgdHlwZU5hbWUgKyAnO1xuJworICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ3N0cnVjdCcsIGJvZHkpCisgICAgIworICAgICMgR3JvdXAgKGUuZy4gQyAiZW51bSIgdHlwZSkgZ2VuZXJhdGlvbi4KKyAgICAjIFRoZXNlIGFyZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgd2l0aCBvdGhlciB0eXBlcy4KKyAgICBkZWYgZ2VuR3JvdXAoc2VsZiwgZ3JvdXBpbmZvLCBncm91cE5hbWUsIGFsaWFzKToKKyAgICAgICAgcGFzcworICAgICMgRW51bWVyYW50IGdlbmVyYXRpb24KKyAgICAjIDxlbnVtPiB0YWdzIG1heSBzcGVjaWZ5IHRoZWlyIHZhbHVlcyBpbiBzZXZlcmFsIHdheXMsIGJ1dCBhcmUgdXN1YWxseQorICAgICMganVzdCBpbnRlZ2Vycy4KKyAgICBkZWYgZ2VuRW51bShzZWxmLCBlbnVtaW5mbywgbmFtZSwgYWxpYXMpOgorICAgICAgICBwYXNzCisgICAgIworICAgICMgQ29tbWFuZCBnZW5lcmF0aW9uCisgICAgZGVmIGdlbkNtZChzZWxmLCBjbWRpbmZvLCBuYW1lLCBhbGlhcyk6CisgICAgICAgICMgQ29tbWFuZHMgc2hhZG93ZWQgYnkgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhbmQgYXJlIG5vdCBpbXBsZW1lbnRlZAorICAgICAgICBzcGVjaWFsX2Z1bmN0aW9ucyA9IFsKKyAgICAgICAgICAgICd2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMnLAorICAgICAgICAgICAgJ3ZrRnJlZUNvbW1hbmRCdWZmZXJzJywKKyAgICAgICAgICAgICd2a0NyZWF0ZUNvbW1hbmRQb29sJywKKyAgICAgICAgICAgICd2a1Jlc2V0Q29tbWFuZFBvb2wnLAorICAgICAgICAgICAgJ3ZrRGVzdHJveUNvbW1hbmRQb29sJywKKyAgICAgICAgICAgICd2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMnLAorICAgICAgICAgICAgJ3ZrRnJlZURlc2NyaXB0b3JTZXRzJywKKyAgICAgICAgICAgICd2a1Jlc2V0RGVzY3JpcHRvclBvb2wnLAorICAgICAgICAgICAgJ3ZrRGVzdHJveURlc2NyaXB0b3JQb29sJywKKyAgICAgICAgICAgICd2a1F1ZXVlUHJlc2VudEtIUicsCisgICAgICAgICAgICAndmtHZXRTd2FwY2hhaW5JbWFnZXNLSFInLAorICAgICAgICAgICAgJ3ZrRGVzdHJveVN3YXBjaGFpbktIUicsCisgICAgICAgICAgICAndmtEZXN0cm95RGV2aWNlJywKKyAgICAgICAgICAgICd2a0dldERldmljZVF1ZXVlJywKKyAgICAgICAgICAgICd2a0dldERldmljZVF1ZXVlMicsCisgICAgICAgICAgICAndmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0JywKKyAgICAgICAgICAgICd2a1VwZGF0ZURlc2NyaXB0b3JTZXRzJywKKyAgICAgICAgICAgICd2a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUnLAorICAgICAgICAgICAgJ3ZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUicsCisgICAgICAgIF0KKyAgICAgICAgaWYgbmFtZSA9PSAndmtRdWV1ZVByZXNlbnRLSFInIG9yIChuYW1lIGluIHNwZWNpYWxfZnVuY3Rpb25zIGFuZCBzZWxmLnNvdXJjZV9maWxlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmICgoIkRlYnVnTWFya2VyIiBpbiBuYW1lIG9yICJEZWJ1Z1V0aWxzT2JqZWN0IiBpbiBuYW1lKSBhbmQgIkVYVCIgaW4gbmFtZSk6CisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnLy8gVE9ETyAtIG5vdCB3cmFwcGluZyBFWFQgZnVuY3Rpb24gJyArIG5hbWUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIERldGVybWluZSBmaXJzdCBpZiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGludGVyY2VwdGVkCisgICAgICAgIHN0YXJ0dGhyZWFkc2FmZXR5ID0gc2VsZi5tYWtlVGhyZWFkVXNlQmxvY2soY21kaW5mby5lbGVtLCBuYW1lLCAnU3RhcnQnKQorICAgICAgICBmaW5pc2h0aHJlYWRzYWZldHkgPSBzZWxmLm1ha2VUaHJlYWRVc2VCbG9jayhjbWRpbmZvLmVsZW0sIG5hbWUsICdGaW5pc2gnKQorICAgICAgICBpZiBzdGFydHRocmVhZHNhZmV0eSBpcyBOb25lIGFuZCBmaW5pc2h0aHJlYWRzYWZldHkgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHN0YXJ0dGhyZWFkc2FmZXR5IGlzIE5vbmU6CisgICAgICAgICAgICBzdGFydHRocmVhZHNhZmV0eSA9ICcnCisgICAgICAgIGlmIGZpbmlzaHRocmVhZHNhZmV0eSBpcyBOb25lOgorICAgICAgICAgICAgZmluaXNodGhyZWFkc2FmZXR5ID0gJycKKworICAgICAgICBPdXRwdXRHZW5lcmF0b3IuZ2VuQ21kKHNlbGYsIGNtZGluZm8sIG5hbWUsIGFsaWFzKQorCisgICAgICAgICMgc2V0dXAgY29tbW9uIHRvIGNhbGwgd3JhcHBlcnMKKyAgICAgICAgIyBmaXJzdCBwYXJhbWV0ZXIgaXMgYWx3YXlzIGRpc3BhdGNoYWJsZQorICAgICAgICBkaXNwYXRjaGFibGVfdHlwZSA9IGNtZGluZm8uZWxlbS5maW5kKCdwYXJhbS90eXBlJykudGV4dAorICAgICAgICBkaXNwYXRjaGFibGVfbmFtZSA9IGNtZGluZm8uZWxlbS5maW5kKCdwYXJhbS9uYW1lJykudGV4dAorCisgICAgICAgIGRlY2xzID0gc2VsZi5tYWtlQ0RlY2xzKGNtZGluZm8uZWxlbSkKKworICAgICAgICByZXN1bHRfdHlwZSA9IGNtZGluZm8uZWxlbS5maW5kKCdwcm90by90eXBlJykKKworICAgICAgICBpZiBzZWxmLnNvdXJjZV9maWxlOgorICAgICAgICAgICAgcHJlX2RlY2wgPSBkZWNsc1swXVs6LTFdCisgICAgICAgICAgICBwcmVfZGVjbCA9IHByZV9kZWNsLnNwbGl0KCJWS0FQSV9DQUxMICIpWzFdCisgICAgICAgICAgICBwcmVfZGVjbCA9ICd2b2lkIFRocmVhZFNhZmV0eTo6UHJlQ2FsbFJlY29yZCcgKyBwcmVfZGVjbCArICcgeycKKworICAgICAgICAgICAgIyBQcmVDYWxsUmVjb3JkCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsIHByZV9kZWNsKQorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgIiAgICAiICsgIlxuICAgICIuam9pbihzdHIoc3RhcnR0aHJlYWRzYWZldHkpLnJzdHJpcCgpLnNwbGl0KCJcbiIpKSkKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICd9JykKKworICAgICAgICAgICAgIyBQb3N0Q2FsbFJlY29yZAorICAgICAgICAgICAgcG9zdF9kZWNsID0gcHJlX2RlY2wucmVwbGFjZSgnUHJlQ2FsbFJlY29yZCcsICdQb3N0Q2FsbFJlY29yZCcpCisgICAgICAgICAgICBpZiByZXN1bHRfdHlwZS50ZXh0ID09ICdWa1Jlc3VsdCc6CisgICAgICAgICAgICAgICAgcG9zdF9kZWNsID0gcG9zdF9kZWNsLnJlcGxhY2UoJyknLCAnLFxuICAgIFZrUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KScpCisgICAgICAgICAgICBlbGlmIHJlc3VsdF90eXBlLnRleHQgPT0gJ1ZrRGV2aWNlQWRkcmVzcyc6CisgICAgICAgICAgICAgICAgcG9zdF9kZWNsID0gcG9zdF9kZWNsLnJlcGxhY2UoJyknLCAnLFxuICAgIFZrRGV2aWNlQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KScpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsIHBvc3RfZGVjbCkKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICIgICAgIiArICJcbiAgICAiLmpvaW4oc3RyKGZpbmlzaHRocmVhZHNhZmV0eSkucnN0cmlwKCkuc3BsaXQoIlxuIikpKQorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJ30nKQorCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2ZpbGU6CisgICAgICAgICAgICBwcmVfZGVjbCA9IGRlY2xzWzBdWzotMV0KKyAgICAgICAgICAgIHByZV9kZWNsID0gcHJlX2RlY2wuc3BsaXQoIlZLQVBJX0NBTEwgIilbMV0KKyAgICAgICAgICAgIHByZV9kZWNsID0gJ3ZvaWQgUHJlQ2FsbFJlY29yZCcgKyBwcmVfZGVjbCArICc7JworCisgICAgICAgICAgICAjIFByZUNhbGxSZWNvcmQKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kU2VjdGlvbignY29tbWFuZCcsICcnKQorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgcHJlX2RlY2wpCisKKyAgICAgICAgICAgICMgUG9zdENhbGxSZWNvcmQKKyAgICAgICAgICAgIHBvc3RfZGVjbCA9IHByZV9kZWNsLnJlcGxhY2UoJ1ByZUNhbGxSZWNvcmQnLCAnUG9zdENhbGxSZWNvcmQnKQorICAgICAgICAgICAgaWYgcmVzdWx0X3R5cGUudGV4dCA9PSAnVmtSZXN1bHQnOgorICAgICAgICAgICAgICAgIHBvc3RfZGVjbCA9IHBvc3RfZGVjbC5yZXBsYWNlKCcpJywgJyxcbiAgICBWa1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCknKQorICAgICAgICAgICAgZWxpZiByZXN1bHRfdHlwZS50ZXh0ID09ICdWa0RldmljZUFkZHJlc3MnOgorICAgICAgICAgICAgICAgIHBvc3RfZGVjbCA9IHBvc3RfZGVjbC5yZXBsYWNlKCcpJywgJyxcbiAgICBWa0RldmljZUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCknKQorICAgICAgICAgICAgc2VsZi5hcHBlbmRTZWN0aW9uKCdjb21tYW5kJywgJycpCisgICAgICAgICAgICBzZWxmLmFwcGVuZFNlY3Rpb24oJ2NvbW1hbmQnLCBwb3N0X2RlY2wpCisKKyAgICAjCisgICAgIyBvdmVycmlkZSBtYWtlUHJvdG9OYW1lIHRvIGRyb3AgdGhlICJ2ayIgcHJlZml4CisgICAgZGVmIG1ha2VQcm90b05hbWUoc2VsZiwgbmFtZSwgdGFpbCk6CisgICAgICAgIHJldHVybiBzZWxmLmdlbk9wdHMuYXBpZW50cnkgKyBuYW1lWzI6XSArIHRhaWwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3NjcmlwdHMvdXBkYXRlX2RlcHMucHkgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL3VwZGF0ZV9kZXBzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxZmUzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL3VwZGF0ZV9kZXBzLnB5CkBAIC0wLDAgKzEsNjc5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyBDb3B5cmlnaHQgMjAxNyBUaGUgR2xzbGFuZyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgc2NyaXB0IHdhcyBoZWF2aWx5IGxldmVyYWdlZCBmcm9tIEtocm9ub3NHcm91cC9nbHNsYW5nCisjIHVwZGF0ZV9nbHNsYW5nX3NvdXJjZXMucHkuCisiIiJ1cGRhdGVfZGVwcy5weQorCitHZXQgYW5kIGJ1aWxkIGRlcGVuZGVudCByZXBvc2l0b3JpZXMgdXNpbmcga25vd24tZ29vZCBjb21taXRzLgorCitQdXJwb3NlCistLS0tLS0tCisKK1RoaXMgcHJvZ3JhbSBpcyBpbnRlbmRlZCB0byBhc3Npc3QgYSBkZXZlbG9wZXIgb2YgdGhpcyByZXBvc2l0b3J5CisodGhlICJob21lIiByZXBvc2l0b3J5KSBieSBnYXRoZXJpbmcgYW5kIGJ1aWxkaW5nIHRoZSByZXBvc2l0b3JpZXMgdGhhdAordGhpcyBob21lIHJlcG9zaXRvcnkgZGVwZW5kIG9uLiAgSXQgYWxzbyBjaGVja3Mgb3V0IGVhY2ggZGVwZW5kZW50CityZXBvc2l0b3J5IGF0IGEgImtub3duLWdvb2QiIGNvbW1pdCBpbiBvcmRlciB0byBwcm92aWRlIHN0YWJpbGl0eSBpbgordGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMuCisKK1B5dGhvbiBDb21wYXRpYmlsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgd2l0aCBQeXRob24gMi43IGFuZCBQeXRob24gMy4KKworS25vd24tR29vZCBKU09OIERhdGFiYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBwcm9ncmFtIGV4cGVjdHMgdG8gZmluZCBhIGZpbGUgbmFtZWQgImtub3duLWdvb2QuanNvbiIgaW4gdGhlCitzYW1lIGRpcmVjdG9yeSBhcyB0aGUgcHJvZ3JhbSBmaWxlLiAgVGhpcyBKU09OIGZpbGUgaXMgdGFpbG9yZWQgZm9yCit0aGUgbmVlZHMgb2YgdGhlIGhvbWUgcmVwb3NpdG9yeSBieSBpbmNsdWRpbmcgaXRzIGRlcGVuZGVudCByZXBvc2l0b3JpZXMuCisKK1Byb2dyYW0gT3B0aW9ucworLS0tLS0tLS0tLS0tLS0tCisKK1NlZSB0aGUgaGVscCB0ZXh0ICh1cGRhdGVfZGVwcy5weSAtLWhlbHApIGZvciBhIGNvbXBsZXRlIGxpc3Qgb2Ygb3B0aW9ucy4KKworUHJvZ3JhbSBPcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBwcm9ncmFtIHVzZXMgdGhlIHVzZXIncyBjdXJyZW50IGRpcmVjdG9yeSBhdCB0aGUgdGltZSBvZiBwcm9ncmFtCitpbnZvY2F0aW9uIGFzIHRoZSBsb2NhdGlvbiBmb3IgZmV0Y2hpbmcgYW5kIGJ1aWxkaW5nIHRoZSBkZXBlbmRlbnQKK3JlcG9zaXRvcmllcy4gIFRoZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIGJ5IHVzaW5nIHRoZSAiLS1kaXIiIG9wdGlvbi4KKworRm9yIGV4YW1wbGUsIGEgZGlyZWN0b3J5IG5hbWVkICJidWlsZCIgaW4gdGhlIHJlcG9zaXRvcnkncyByb290IGRpcmVjdG9yeQoraXMgYSBnb29kIHBsYWNlIHRvIHB1dCB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcyBiZWNhdXNlIHRoYXQgZGlyZWN0b3J5CitpcyBub3QgdHJhY2tlZCBieSBHaXQuIChTZWUgdGhlIC5naXRpZ25vcmUgZmlsZS4pICBUaGUgImV4dGVybmFsIiBkaXJlY3RvcnkKK21heSBhbHNvIGJlIGEgc3VpdGFibGUgbG9jYXRpb24uCitBIHVzZXIgY2FuIGlzc3VlOgorCiskIGNkIE15LVJlcG8KKyQgbWtkaXIgYnVpbGQKKyQgY2QgYnVpbGQKKyQgLi4vc2NyaXB0cy91cGRhdGVfZGVwcy5weQorCitvciwgdG8gZG8gdGhlIHNhbWUgdGhpbmcsIGJ1dCB1c2luZyB0aGUgLS1kaXIgb3B0aW9uOgorCiskIGNkIE15LVJlcG8KKyQgbWtkaXIgYnVpbGQKKyQgc2NyaXB0cy91cGRhdGVfZGVwcy5weSAtLWRpcj1idWlsZAorCitXaXRoIHRoZXNlIGNvbW1hbmRzLCB0aGUgImJ1aWxkIiBkaXJlY3RvcnkgaXMgY29uc2lkZXJlZCB0aGUgInRvcCIKK2RpcmVjdG9yeSB3aGVyZSB0aGUgcHJvZ3JhbSBjbG9uZXMgdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMuICBUaGUKK0pTT04gZmlsZSBjb25maWd1cmVzIHRoZSBidWlsZCBhbmQgaW5zdGFsbCB3b3JraW5nIGRpcmVjdG9yaWVzIHRvIGJlCit3aXRoaW4gdGhpcyAidG9wIiBkaXJlY3RvcnkuCisKK05vdGUgdGhhdCB0aGUgImRpciIgb3B0aW9uIGNhbiBhbHNvIHNwZWNpZnkgYW4gYWJzb2x1dGUgcGF0aDoKKworJCBjZCBNeS1SZXBvCiskIHNjcmlwdHMvdXBkYXRlX2RlcHMucHkgLS1kaXI9L3RtcC9kZXBzCisKK1RoZSAidG9wIiBkaXIgaXMgdGhlbiAvdG1wL2RlcHMgKExpbnV4IGZpbGVzeXN0ZW0gZXhhbXBsZSkgYW5kIGlzCit3aGVyZSB0aGlzIHByb2dyYW0gd2lsbCBjbG9uZSBhbmQgYnVpbGQgdGhlIGRlcGVuZGVudCByZXBvc2l0b3JpZXMuCisKK0hlbHBlciBDTWFrZSBDb25maWcgRmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gdGhlIHByb2dyYW0gZmluaXNoZXMgYnVpbGRpbmcgdGhlIGRlcGVuZGVuY2llcywgaXQgd3JpdGVzIGEgZmlsZQorbmFtZWQgImhlbHBlci5jbWFrZSIgdG8gdGhlICJ0b3AiIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIENNYWtlIGNvbW1hbmRzCitmb3Igc2V0dGluZyBDTWFrZSB2YXJpYWJsZXMgZm9yIGxvY2F0aW5nIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzLgorVGhpcyBoZWxwZXIgZmlsZSBjYW4gYmUgdXNlZCB0byBzZXQgdXAgdGhlIENNYWtlIGJ1aWxkIGZpbGVzIGZvciB0aGlzCisiaG9tZSIgcmVwb3NpdG9yeS4KKworQSBjb21wbGV0ZSBzZXF1ZW5jZSBtaWdodCBsb29rIGxpa2U6CisKKyQgZ2l0IGNsb25lIGdpdEBnaXRodWIuY29tOk15LUdyb3VwL015LVJlcG8uZ2l0CiskIGNkIE15LVJlcG8KKyQgbWtkaXIgYnVpbGQKKyQgY2QgYnVpbGQKKyQgLi4vc2NyaXB0cy91cGRhdGVfZGVwcy5weQorJCBjbWFrZSAtQyBoZWxwZXIuY21ha2UgLi4KKyQgY21ha2UgLS1idWlsZCAuCisKK0pTT04gRmlsZSBTY2hlbWEKKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUncyBubyBmb3JtYWwgc2NoZW1hIGZvciB0aGUgImtub3duLWdvb2QiIEpTT04gZmlsZSwgYnV0IGhlcmUgaXMKK2EgZGVzY3JpcHRpb24gb2YgaXRzIGVsZW1lbnRzLiAgQWxsIGVsZW1lbnRzIGFyZSByZXF1aXJlZCBleGNlcHQgdGhvc2UKK21hcmtlZCBhcyBvcHRpb25hbC4gIFBsZWFzZSBzZWUgdGhlICJrbm93bl9nb29kLmpzb24iIGZpbGUgZm9yCitleGFtcGxlcyBvZiBhbGwgb2YgdGhlc2UgZWxlbWVudHMuCisKKy0gbmFtZQorCitUaGUgbmFtZSBvZiB0aGUgZGVwZW5kZW50IHJlcG9zaXRvcnkuICBUaGlzIGZpZWxkIGNhbiBiZSByZWZlcmVuY2VkCitieSB0aGUgImRlcHMucmVwb19uYW1lIiBzdHJ1Y3R1cmUgdG8gcmVjb3JkIGEgZGVwZW5kZW5jeS4KKworLSB1cmwKKworU3BlY2lmaWVzIHRoZSBVUkwgb2YgdGhlIHJlcG9zaXRvcnkuCitFeGFtcGxlOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Mb2FkZXIuZ2l0CisKKy0gc3ViX2RpcgorCitUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBwcm9ncmFtIGNsb25lcyB0aGUgcmVwb3NpdG9yeSwgcmVsYXRpdmUgdG8KK3RoZSAidG9wIiBkaXJlY3RvcnkuCisKKy0gYnVpbGRfZGlyCisKK1RoZSBkaXJlY3RvcnkgdXNlZCB0byBidWlsZCB0aGUgcmVwb3NpdG9yeSwgcmVsYXRpdmUgdG8gdGhlICJ0b3AiCitkaXJlY3RvcnkuCisKKy0gaW5zdGFsbF9kaXIKKworVGhlIGRpcmVjdG9yeSB1c2VkIHRvIHN0b3JlIHRoZSBpbnN0YWxsZWQgYnVpbGQgYXJ0aWZhY3RzLCByZWxhdGl2ZQordG8gdGhlICJ0b3AiIGRpcmVjdG9yeS4KKworLSBjb21taXQKKworVGhlIGNvbW1pdCB1c2VkIHRvIGNoZWNrb3V0IHRoZSByZXBvc2l0b3J5LiAgVGhpcyBjYW4gYmUgYSBTSEEtMQorb2JqZWN0IG5hbWUgb3IgYSByZWZuYW1lIHVzZWQgd2l0aCB0aGUgcmVtb3RlIG5hbWUgIm9yaWdpbiIuCitGb3IgZXhhbXBsZSwgdGhpcyBmaWVsZCBjYW4gYmUgc2V0IHRvICJvcmlnaW4vc2RrLTEuMS43NyIgdG8KK3NlbGVjdCB0aGUgZW5kIG9mIHRoZSBzZGstMS4xLjc3IGJyYW5jaC4KKworLSBkZXBzIChvcHRpb25hbCkKKworQW4gYXJyYXkgb2YgcGFpcnMgY29uc2lzdGluZyBvZiBhIENNYWtlIHZhcmlhYmxlIG5hbWUgYW5kIGEKK3JlcG9zaXRvcnkgbmFtZSB0byBzcGVjaWZ5IGEgZGVwZW5kZW50IHJlcG8gYW5kIGEgImxpbmsiIHRvCit0aGF0IHJlcG8ncyBpbnN0YWxsIGFydGlmYWN0cy4gIEZvciBleGFtcGxlOgorCisiZGVwcyIgOiBbCisgICAgeworICAgICAgICAidmFyX25hbWUiIDogIlZVTEtBTl9IRUFERVJTX0lOU1RBTExfRElSIiwKKyAgICAgICAgInJlcG9fbmFtZSIgOiAiVnVsa2FuLUhlYWRlcnMiCisgICAgfQorXQorCit3aGljaCByZXByZXNlbnRzIHRoYXQgdGhpcyByZXBvc2l0b3J5IGRlcGVuZHMgb24gdGhlIFZ1bGthbi1IZWFkZXJzCityZXBvc2l0b3J5IGFuZCB1c2VzIHRoZSBWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUiBDTWFrZSB2YXJpYWJsZSB0bworc3BlY2lmeSB0aGUgbG9jYXRpb24gd2hlcmUgaXQgZXhwZWN0cyB0byBmaW5kIHRoZSBWdWxrYW4tSGVhZGVycyBpbnN0YWxsCitkaXJlY3RvcnkuCitOb3RlIHRoYXQgdGhlICJyZXBvX25hbWUiIGVsZW1lbnQgbXVzdCBtYXRjaCB0aGUgIm5hbWUiIGVsZW1lbnQgb2Ygc29tZQorb3RoZXIgcmVwb3NpdG9yeSBpbiB0aGUgSlNPTiBmaWxlLgorCistIHByZWJ1aWxkIChvcHRpb25hbCkKKy0gcHJlYnVpbGRfbGludXggKG9wdGlvbmFsKSAgKEZvciBMaW51eCBhbmQgTWFjT1MpCistIHByZWJ1aWxkX3dpbmRvd3MgKG9wdGlvbmFsKQorCitBIGxpc3Qgb2YgY29tbWFuZHMgdG8gZXhlY3V0ZSBiZWZvcmUgYnVpbGRpbmcgYSBkZXBlbmRlbnQgcmVwb3NpdG9yeS4KK1RoaXMgaXMgdXNlZnVsIGZvciByZXBvc2l0b3JpZXMgdGhhdCByZXF1aXJlIHRoZSBleGVjdXRpb24gb2Ygc29tZQorc29ydCBvZiAidXBkYXRlIiBzY3JpcHQgb3IgbmVlZCB0byBjbG9uZSBhbiBhdXhpbGxhcnkgcmVwb3NpdG9yeSBsaWtlCitnb29nbGV0ZXN0LgorCitUaGUgY29tbWFuZHMgbGlzdGVkIGluICJwcmVidWlsZCIgYXJlIGV4ZWN1dGVkIGZpcnN0LCBhbmQgdGhlbiB0aGUKK2NvbW1hbmRzIGZvciB0aGUgc3BlY2lmaWMgcGxhdGZvcm0gYXJlIGV4ZWN1dGVkLgorCistIGN1c3RvbV9idWlsZCAob3B0aW9uYWwpCisKK0EgbGlzdCBvZiBjb21tYW5kcyB0byBleGVjdXRlIGFzIGEgY3VzdG9tIGJ1aWxkIGluc3RlYWQgb2YgdXNpbmcKK3RoZSBidWlsdCBpbiBDTWFrZSB3YXkgb2YgYnVpbGRpbmcuIFJlcXVpcmVzICJidWlsZF9zdGVwIiB0byBiZQorc2V0IHRvICJjdXN0b20iCisKK1lvdSBjYW4gaW5zZXJ0IHRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW50byB0aGUgY29tbWFuZHMgbGlzdGVkIGluCisiY3VzdG9tX2J1aWxkIiBpZiB0aGV5IHJlcXVpcmUgcnVudGltZSBpbmZvcm1hdGlvbiAobGlrZSB3aGV0aGVyIHRoZQorYnVpbGQgY29uZmlnIGlzICJEZWJ1ZyIgb3IgIlJlbGVhc2UiKS4KKworS2V5d29yZHM6Cit7MH0gcmVmZXJlbmNlIHRvIGEgZGljdGlvbmFyeSBvZiByZXBvcyBhbmQgdGhlaXIgYXR0cmlidXRlcworezF9IHJlZmVyZW5jZSB0byB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzZXQgYmVmb3JlIHN0YXJ0Cit7Mn0gcmVmZXJlbmNlIHRvIHRoZSBDT05GSUdfTUFQIHZhbHVlIG9mIGNvbmZpZy4KKworRXhhbXBsZToKK3syfSByZXR1cm5zIHRoZSBDT05GSUdfTUFQIHZhbHVlIG9mIGNvbmZpZyBlLmcuIGRlYnVnIC0+IERlYnVnCit7MX0uY29uZmlnIHJldHVybnMgdGhlIGNvbmZpZyB2YXJpYWJsZSBzZXQgd2hlbiB5b3UgcmFuIHVwZGF0ZV9kZXAucHkKK3swfVtWdWxrYW4tSGVhZGVyc11bcmVwb19yb290XSByZXR1cm5zIHRoZSByZXBvX3Jvb3QgdmFyaWFibGUgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgVnVsa2FuLUhlYWRlcnMgR29vZFJlcG8gb2JqZWN0LgorCistIGNtYWtlX29wdGlvbnMgKG9wdGlvbmFsKQorCitBIGxpc3Qgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIENNYWtlIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBwaGFzZS4KKworLSBjaV9vbmx5IChvcHRpb25hbCkKKworQSBsaXN0IG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aGVyZSBvbmUgbXVzdCBiZSBzZXQgdG8gInRydWUiCisoY2FzZS1pbnNlbnNpdGl2ZSkgaW4gb3JkZXIgZm9yIHRoaXMgcmVwbyB0byBiZSBmZXRjaGVkIGFuZCBidWlsdC4KK1RoaXMgbGlzdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHJlcG9zIHRoYXQgc2hvdWxkIGJlIGJ1aWx0IG9ubHkgaW4gQ0kuCitUeXBpY2FsbHksIHRoaXMgbGlzdCBtaWdodCBjb250YWluICJUUkFWSVMiIGFuZC9vciAiQVBQVkVZT1IiIGJlY2F1c2UKK2VhY2ggb2YgdGhlc2UgQ0kgc3lzdGVtcyBzZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggaXRzIG93bgorbmFtZSB0byAidHJ1ZSIuICBOb3RlIHRoYXQgdGhpcyBjb3VsZCBhbHNvIGJlIChhYil1c2VkIHRvIGNvbnRyb2wKK3RoZSBwcm9jZXNzaW5nIG9mIHRoZSByZXBvIHdpdGggYW55IGVudmlyb25tZW50IHZhcmlhYmxlLiAgVGhlIGRlZmF1bHQKK2lzIGFuIGVtcHR5IGxpc3QsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlcG8gaXMgYWx3YXlzIHByb2Nlc3NlZC4KKworLSBidWlsZF9zdGVwIChvcHRpb25hbCkKKworU3BlY2lmaWVzIGlmIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yeSBzaG91bGQgYmUgYnVpbHQgb3Igbm90LiBUaGlzIGNhbgoraGF2ZSBhIHZhbHVlIG9mICdidWlsZCcsICdjdXN0b20nLCAgb3IgJ3NraXAnLiBUaGUgZGVwZW5kZW50IHJlcG9zaXRvcmllcyBhcmUKK2J1aWx0IGJ5IGRlZmF1bHQuCisKKy0gYnVpbGRfcGxhdGZvcm1zIChvcHRpb25hbCkKKworQSBsaXN0IG9mIHBsYXRmb3JtcyB0aGUgcmVwb3NpdG9yeSB3aWxsIGJlIGJ1aWx0IG9uLgorTGVnYWwgb3B0aW9ucyBpbmNsdWRlOgorIndpbmRvd3MiCisibGludXgiCisiZGFyd2luIgorCitCdWlsZHMgb24gYWxsIHBsYXRmb3JtcyBieSBkZWZhdWx0LgorCitOb3RlCistLS0tCisKK1RoZSAic3ViX2RpciIsICJidWlsZF9kaXIiLCBhbmQgImluc3RhbGxfZGlyIiBlbGVtZW50cyBhcmUgYWxsIHJlbGF0aXZlCit0byB0aGUgZWZmZWN0aXZlICJ0b3AiIGRpcmVjdG9yeS4gIFNwZWNpZnlpbmcgYWJzb2x1dGUgcGF0aHMgaXMgbm90CitzdXBwb3J0ZWQuICBIb3dldmVyLCB0aGUgInRvcCIgZGlyZWN0b3J5IHNwZWNpZmllZCB3aXRoIHRoZSAiLS1kaXIiCitvcHRpb24gY2FuIGJlIGEgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aC4KKworIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQganNvbgoraW1wb3J0IGRpc3R1dGlscy5kaXJfdXRpbAoraW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBzaGxleAoraW1wb3J0IHNodXRpbAorCitLTk9XTl9HT09EX0ZJTEVfTkFNRSA9ICdrbm93bl9nb29kLmpzb24nCisKK0NPTkZJR19NQVAgPSB7CisgICAgJ2RlYnVnJzogJ0RlYnVnJywKKyAgICAncmVsZWFzZSc6ICdSZWxlYXNlJywKKyAgICAncmVsd2l0aGRlYmluZm8nOiAnUmVsV2l0aERlYkluZm8nLAorICAgICdtaW5zaXplcmVsJzogJ01pblNpemVSZWwnCit9CisKK1ZFUkJPU0UgPSBGYWxzZQorCitERVZOVUxMID0gb3Blbihvcy5kZXZudWxsLCAnd2InKQorCisKK2RlZiBjb21tYW5kX291dHB1dChjbWQsIGRpcmVjdG9yeSwgZmFpbF9vaz1GYWxzZSk6CisgICAgIiIiUnVucyBhIGNvbW1hbmQgaW4gYSBkaXJlY3RvcnkgYW5kIHJldHVybnMgaXRzIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0uCisKKyAgICBDYXB0dXJlcyB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIGFuZCBwcmludHMgaXQgaWYgZXJyb3IuCisKKyAgICBSYWlzZXMgYSBSdW50aW1lRXJyb3IgaWYgdGhlIGNvbW1hbmQgZmFpbHMgdG8gbGF1bmNoIG9yIG90aGVyd2lzZSBmYWlscy4KKyAgICAiIiIKKyAgICBpZiBWRVJCT1NFOgorICAgICAgICBwcmludCgnSW4ge2R9OiB7Y21kfScuZm9ybWF0KGQ9ZGlyZWN0b3J5LCBjbWQ9Y21kKSkKKyAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigKKyAgICAgICAgY21kLCBjd2Q9ZGlyZWN0b3J5LCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgIChzdGRvdXQsIHN0ZGVycikgPSBwLmNvbW11bmljYXRlKCkKKyAgICBpZiBwLnJldHVybmNvZGUgIT0gMDoKKyAgICAgICAgcHJpbnQoJyoqKiBFcnJvciAqKipcbnN0ZGVyciBjb250ZW50czpcbnt9Jy5mb3JtYXQoc3RkZXJyKSkKKyAgICAgICAgaWYgbm90IGZhaWxfb2s6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0ZhaWxlZCB0byBydW4ge30gaW4ge30nLmZvcm1hdChjbWQsIGRpcmVjdG9yeSkpCisgICAgaWYgVkVSQk9TRToKKyAgICAgICAgcHJpbnQoc3Rkb3V0KQorICAgIHJldHVybiBzdGRvdXQKKworY2xhc3MgR29vZFJlcG8ob2JqZWN0KToKKyAgICAiIiJSZXByZXNlbnRzIGEgcmVwb3NpdG9yeSBhdCBhIGtub3duLWdvb2QgY29tbWl0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGpzb24sIGFyZ3MpOgorICAgICAgICAiIiJJbml0aWFsaXplcyB0aGlzIGdvb2QgcmVwbyBvYmplY3QuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgJ2pzb24nOiAgQSBmdWxseSBwb3B1bGF0ZWQgSlNPTiBvYmplY3QgZGVzY3JpYmluZyB0aGUgcmVwby4KKyAgICAgICAgJ2FyZ3MnOiAgUmVzdWx0cyBmcm9tIEFyZ3VtZW50UGFyc2VyCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9qc29uID0ganNvbgorICAgICAgICBzZWxmLl9hcmdzID0gYXJncworICAgICAgICAjIFJlcXVpcmVkIEpTT04gZWxlbWVudHMKKyAgICAgICAgc2VsZi5uYW1lID0ganNvblsnbmFtZSddCisgICAgICAgIHNlbGYudXJsID0ganNvblsndXJsJ10KKyAgICAgICAgc2VsZi5zdWJfZGlyID0ganNvblsnc3ViX2RpciddCisgICAgICAgIHNlbGYuY29tbWl0ID0ganNvblsnY29tbWl0J10KKyAgICAgICAgIyBPcHRpb25hbCBKU09OIGVsZW1lbnRzCisgICAgICAgIHNlbGYuYnVpbGRfZGlyID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQorICAgICAgICBpZiBqc29uLmdldCgnYnVpbGRfZGlyJyk6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX2RpciA9IG9zLnBhdGgubm9ybXBhdGgoanNvblsnYnVpbGRfZGlyJ10pCisgICAgICAgIGlmIGpzb24uZ2V0KCdpbnN0YWxsX2RpcicpOgorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IG9zLnBhdGgubm9ybXBhdGgoanNvblsnaW5zdGFsbF9kaXInXSkKKyAgICAgICAgc2VsZi5kZXBzID0ganNvblsnZGVwcyddIGlmICgnZGVwcycgaW4ganNvbikgZWxzZSBbXQorICAgICAgICBzZWxmLnByZWJ1aWxkID0ganNvblsncHJlYnVpbGQnXSBpZiAoJ3ByZWJ1aWxkJyBpbiBqc29uKSBlbHNlIFtdCisgICAgICAgIHNlbGYucHJlYnVpbGRfbGludXggPSBqc29uWydwcmVidWlsZF9saW51eCddIGlmICgKKyAgICAgICAgICAgICdwcmVidWlsZF9saW51eCcgaW4ganNvbikgZWxzZSBbXQorICAgICAgICBzZWxmLnByZWJ1aWxkX3dpbmRvd3MgPSBqc29uWydwcmVidWlsZF93aW5kb3dzJ10gaWYgKAorICAgICAgICAgICAgJ3ByZWJ1aWxkX3dpbmRvd3MnIGluIGpzb24pIGVsc2UgW10KKyAgICAgICAgc2VsZi5jdXN0b21fYnVpbGQgPSBqc29uWydjdXN0b21fYnVpbGQnXSBpZiAoJ2N1c3RvbV9idWlsZCcgaW4ganNvbikgZWxzZSBbXQorICAgICAgICBzZWxmLmNtYWtlX29wdGlvbnMgPSBqc29uWydjbWFrZV9vcHRpb25zJ10gaWYgKAorICAgICAgICAgICAgJ2NtYWtlX29wdGlvbnMnIGluIGpzb24pIGVsc2UgW10KKyAgICAgICAgc2VsZi5jaV9vbmx5ID0ganNvblsnY2lfb25seSddIGlmICgnY2lfb25seScgaW4ganNvbikgZWxzZSBbXQorICAgICAgICBzZWxmLmJ1aWxkX3N0ZXAgPSBqc29uWydidWlsZF9zdGVwJ10gaWYgKCdidWlsZF9zdGVwJyBpbiBqc29uKSBlbHNlICdidWlsZCcKKyAgICAgICAgc2VsZi5idWlsZF9wbGF0Zm9ybXMgPSBqc29uWydidWlsZF9wbGF0Zm9ybXMnXSBpZiAoJ2J1aWxkX3BsYXRmb3JtcycgaW4ganNvbikgZWxzZSBbXQorICAgICAgICAjIEFic29sdXRlIHBhdGhzIGZvciBhIHJlcG8ncyBkaXJlY3RvcmllcworICAgICAgICBkaXJfdG9wID0gb3MucGF0aC5hYnNwYXRoKGFyZ3MuZGlyKQorICAgICAgICBzZWxmLnJlcG9fZGlyID0gb3MucGF0aC5qb2luKGRpcl90b3AsIHNlbGYuc3ViX2RpcikKKyAgICAgICAgaWYgc2VsZi5idWlsZF9kaXI6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX2RpciA9IG9zLnBhdGguam9pbihkaXJfdG9wLCBzZWxmLmJ1aWxkX2RpcikKKyAgICAgICAgaWYgc2VsZi5pbnN0YWxsX2RpcjoKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBvcy5wYXRoLmpvaW4oZGlyX3RvcCwgc2VsZi5pbnN0YWxsX2RpcikKKwkgICAgIyBDaGVjayBpZiBwbGF0Zm9ybSBpcyBvbmUgdG8gYnVpbGQgb24KKyAgICAgICAgc2VsZi5vbl9idWlsZF9wbGF0Zm9ybSA9IEZhbHNlCisgICAgICAgIGlmIHNlbGYuYnVpbGRfcGxhdGZvcm1zID09IFtdIG9yIHBsYXRmb3JtLnN5c3RlbSgpLmxvd2VyKCkgaW4gc2VsZi5idWlsZF9wbGF0Zm9ybXM6CisgICAgICAgICAgICBzZWxmLm9uX2J1aWxkX3BsYXRmb3JtID0gVHJ1ZQorCisgICAgZGVmIENsb25lKHNlbGYpOgorICAgICAgICBkaXN0dXRpbHMuZGlyX3V0aWwubWtwYXRoKHNlbGYucmVwb19kaXIpCisgICAgICAgIGNvbW1hbmRfb3V0cHV0KFsnZ2l0JywgJ2Nsb25lJywgc2VsZi51cmwsICcuJ10sIHNlbGYucmVwb19kaXIpCisKKyAgICBkZWYgRmV0Y2goc2VsZik6CisgICAgICAgIGNvbW1hbmRfb3V0cHV0KFsnZ2l0JywgJ2ZldGNoJywgJ29yaWdpbiddLCBzZWxmLnJlcG9fZGlyKQorCisgICAgZGVmIENoZWNrb3V0KHNlbGYpOgorICAgICAgICBwcmludCgnQ2hlY2tpbmcgb3V0IHtufSBpbiB7ZH0nLmZvcm1hdChuPXNlbGYubmFtZSwgZD1zZWxmLnJlcG9fZGlyKSkKKyAgICAgICAgaWYgc2VsZi5fYXJncy5kb19jbGVhbl9yZXBvOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnJlcG9fZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5yZXBvX2RpciwgJy5naXQnKSk6CisgICAgICAgICAgICBzZWxmLkNsb25lKCkKKyAgICAgICAgc2VsZi5GZXRjaCgpCisgICAgICAgIGlmIGxlbihzZWxmLl9hcmdzLnJlZik6CisgICAgICAgICAgICBjb21tYW5kX291dHB1dChbJ2dpdCcsICdjaGVja291dCcsIHNlbGYuX2FyZ3MucmVmXSwgc2VsZi5yZXBvX2RpcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbW1hbmRfb3V0cHV0KFsnZ2l0JywgJ2NoZWNrb3V0Jywgc2VsZi5jb21taXRdLCBzZWxmLnJlcG9fZGlyKQorICAgICAgICBwcmludChjb21tYW5kX291dHB1dChbJ2dpdCcsICdzdGF0dXMnXSwgc2VsZi5yZXBvX2RpcikpCisKKyAgICBkZWYgQ3VzdG9tUHJlUHJvY2VzcyhzZWxmLCBjbWRfc3RyLCByZXBvX2RpY3QpOgorICAgICAgICByZXR1cm4gY21kX3N0ci5mb3JtYXQocmVwb19kaWN0LCBzZWxmLl9hcmdzLCBDT05GSUdfTUFQW3NlbGYuX2FyZ3MuY29uZmlnXSkKKworICAgIGRlZiBQcmVCdWlsZChzZWxmKToKKyAgICAgICAgIiIiRXhlY3V0ZSBhbnkgcHJlYnVpbGQgc3RlcHMgZnJvbSB0aGUgcmVwbyByb290IiIiCisgICAgICAgIGZvciBwIGluIHNlbGYucHJlYnVpbGQ6CisgICAgICAgICAgICBjb21tYW5kX291dHB1dChzaGxleC5zcGxpdChwKSwgc2VsZi5yZXBvX2RpcikKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0xpbnV4JyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnRGFyd2luJzoKKyAgICAgICAgICAgIGZvciBwIGluIHNlbGYucHJlYnVpbGRfbGludXg6CisgICAgICAgICAgICAgICAgY29tbWFuZF9vdXRwdXQoc2hsZXguc3BsaXQocCksIHNlbGYucmVwb19kaXIpCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIGZvciBwIGluIHNlbGYucHJlYnVpbGRfd2luZG93czoKKyAgICAgICAgICAgICAgICBjb21tYW5kX291dHB1dChzaGxleC5zcGxpdChwKSwgc2VsZi5yZXBvX2RpcikKKworICAgIGRlZiBDdXN0b21CdWlsZChzZWxmLCByZXBvX2RpY3QpOgorICAgICAgICAiIiJFeGVjdXRlIGFueSBjdXN0b21fYnVpbGQgc3RlcHMgZnJvbSB0aGUgcmVwbyByb290IiIiCisgICAgICAgIGZvciBwIGluIHNlbGYuY3VzdG9tX2J1aWxkOgorICAgICAgICAgICAgY21kID0gc2VsZi5DdXN0b21QcmVQcm9jZXNzKHAsIHJlcG9fZGljdCkKKyAgICAgICAgICAgIGNvbW1hbmRfb3V0cHV0KHNobGV4LnNwbGl0KGNtZCksIHNlbGYucmVwb19kaXIpCisKKyAgICBkZWYgQ01ha2VDb25maWcoc2VsZiwgcmVwb3MpOgorICAgICAgICAiIiJCdWlsZCBDTWFrZSBjb21tYW5kIGZvciB0aGUgY29uZmlndXJhdGlvbiBwaGFzZSBhbmQgZXhlY3V0ZSBpdCIiIgorICAgICAgICBpZiBzZWxmLl9hcmdzLmRvX2NsZWFuX2J1aWxkOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmJ1aWxkX2RpcikKKyAgICAgICAgaWYgc2VsZi5fYXJncy5kb19jbGVhbl9pbnN0YWxsOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmluc3RhbGxfZGlyKQorCisgICAgICAgICMgQ3JlYXRlIGFuZCBjaGFuZ2UgdG8gYnVpbGQgZGlyZWN0b3J5CisgICAgICAgIGRpc3R1dGlscy5kaXJfdXRpbC5ta3BhdGgoc2VsZi5idWlsZF9kaXIpCisgICAgICAgIG9zLmNoZGlyKHNlbGYuYnVpbGRfZGlyKQorCisgICAgICAgIGNtYWtlX2NtZCA9IFsKKyAgICAgICAgICAgICdjbWFrZScsIHNlbGYucmVwb19kaXIsCisgICAgICAgICAgICAnLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0nICsgc2VsZi5pbnN0YWxsX2RpcgorICAgICAgICBdCisKKyAgICAgICAgIyBGb3IgZWFjaCByZXBvIHRoaXMgcmVwbyBkZXBlbmRzIG9uLCBnZW5lcmF0ZSBhIENNYWtlIHZhcmlhYmxlCisgICAgICAgICMgZGVmaW5pdGlvbnMgZm9yICIuLi5JTlNUQUxMX0RJUiIgdGhhdCBwb2ludHMgdG8gdGhhdCBkZXBlbmRlbnQKKyAgICAgICAgIyByZXBvJ3MgaW5zdGFsbCBkaXIuCisgICAgICAgIGZvciBkIGluIHNlbGYuZGVwczoKKyAgICAgICAgICAgIGRlcF9jb21taXQgPSBbciBmb3IgciBpbiByZXBvcyBpZiByLm5hbWUgPT0gZFsncmVwb19uYW1lJ11dCisgICAgICAgICAgICBpZiBsZW4oZGVwX2NvbW1pdCk6CisgICAgICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnLUR7dmFyX25hbWV9PXtpbnN0YWxsX2Rpcn0nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgdmFyX25hbWU9ZFsndmFyX25hbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9kaXI9ZGVwX2NvbW1pdFswXS5pbnN0YWxsX2RpcikpCisKKyAgICAgICAgIyBBZGQgYW55IENNYWtlIG9wdGlvbnMKKyAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLmNtYWtlX29wdGlvbnM6CisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKG9wdGlvbikKKworICAgICAgICAjIFNldCBidWlsZCBjb25maWcgZm9yIHNpbmdsZS1jb25maWd1cmF0aW9uIGdlbmVyYXRvcnMKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0xpbnV4JyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnRGFyd2luJzoKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy1EQ01BS0VfQlVJTERfVFlQRT17Y29uZmlnfScuZm9ybWF0KAorICAgICAgICAgICAgICAgIGNvbmZpZz1DT05GSUdfTUFQW3NlbGYuX2FyZ3MuY29uZmlnXSkpCisKKyAgICAgICAgIyBVc2UgdGhlIENNYWtlIC1BIG9wdGlvbiB0byBzZWxlY3QgdGhlIHBsYXRmb3JtIGFyY2hpdGVjdHVyZQorICAgICAgICAjIHdpdGhvdXQgbmVlZGluZyBhIFZpc3VhbCBTdHVkaW8gZ2VuZXJhdG9yLgorICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgICAgICBpZiBzZWxmLl9hcmdzLmFyY2ggPT0gJzY0JyBvciBzZWxmLl9hcmdzLmFyY2ggPT0gJ3g2NCcgb3Igc2VsZi5fYXJncy5hcmNoID09ICd3aW42NCc6CisgICAgICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnLUEnKQorICAgICAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJ3g2NCcpCisKKyAgICAgICAgIyBBcHBseSBhIGdlbmVyYXRvciwgaWYgb25lIGlzIHNwZWNpZmllZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3VwcGx5CisgICAgICAgICMgYSBzcGVjaWZpYyBnZW5lcmF0b3IgZm9yIHRoZSBkZXBlbmRlbnQgcmVwb3NpdG9yaWVzIHRvIG1hdGNoCisgICAgICAgICMgdGhhdCBvZiB0aGUgbWFpbiByZXBvc2l0b3J5LgorICAgICAgICBpZiBzZWxmLl9hcmdzLmdlbmVyYXRvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNtYWtlX2NtZC5leHRlbmQoWyctRycsIHNlbGYuX2FyZ3MuZ2VuZXJhdG9yXSkKKworICAgICAgICBpZiBWRVJCT1NFOgorICAgICAgICAgICAgcHJpbnQoIkNNYWtlIGNvbW1hbmQ6ICIgKyAiICIuam9pbihjbWFrZV9jbWQpKQorCisgICAgICAgIHJldF9jb2RlID0gc3VicHJvY2Vzcy5jYWxsKGNtYWtlX2NtZCkKKyAgICAgICAgaWYgcmV0X2NvZGUgIT0gMDoKKyAgICAgICAgICAgIHN5cy5leGl0KHJldF9jb2RlKQorCisgICAgZGVmIENNYWtlQnVpbGQoc2VsZik6CisgICAgICAgICIiIkJ1aWxkIENNYWtlIGNvbW1hbmQgZm9yIHRoZSBidWlsZCBwaGFzZSBhbmQgZXhlY3V0ZSBpdCIiIgorICAgICAgICBjbWFrZV9jbWQgPSBbJ2NtYWtlJywgJy0tYnVpbGQnLCBzZWxmLmJ1aWxkX2RpciwgJy0tdGFyZ2V0JywgJ2luc3RhbGwnXQorICAgICAgICBpZiBzZWxmLl9hcmdzLmRvX2NsZWFuOgorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnLS1jbGVhbi1maXJzdCcpCisKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZCgnLS1jb25maWcnKQorICAgICAgICAgICAgY21ha2VfY21kLmFwcGVuZChDT05GSUdfTUFQW3NlbGYuX2FyZ3MuY29uZmlnXSkKKworICAgICAgICAjIFNwZWVkIHVwIHRoZSBidWlsZC4KKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0xpbnV4JyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnRGFyd2luJzoKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy0tJykKKyAgICAgICAgICAgIG51bV9tYWtlX2pvYnMgPSBtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCkKKyAgICAgICAgICAgIGVudl9tYWtlX2pvYnMgPSBvcy5lbnZpcm9uLmdldCgnTUFLRV9KT0JTJywgTm9uZSkKKyAgICAgICAgICAgIGlmIGVudl9tYWtlX2pvYnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBudW1fbWFrZV9qb2JzID0gbWluKG51bV9tYWtlX2pvYnMsIGludChlbnZfbWFrZV9qb2JzKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ3dhcm5pbmc6IGVudmlyb25tZW50IHZhcmlhYmxlIE1BS0VfSk9CUyBoYXMgbm9uLW51bWVyaWMgdmFsdWUgInt9Ii4gICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VzaW5nIHt9IChDUFUgY291bnQpIGluc3RlYWQuJy5mb3JtYXQoZW52X21ha2Vfam9icywgbnVtX21ha2Vfam9icykpCisgICAgICAgICAgICBjbWFrZV9jbWQuYXBwZW5kKCctant9Jy5mb3JtYXQobnVtX21ha2Vfam9icykpCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy0tJykKKyAgICAgICAgICAgIGNtYWtlX2NtZC5hcHBlbmQoJy9tYXhjcHVjb3VudCcpCisKKyAgICAgICAgaWYgVkVSQk9TRToKKyAgICAgICAgICAgIHByaW50KCJDTWFrZSBjb21tYW5kOiAiICsgIiAiLmpvaW4oY21ha2VfY21kKSkKKworICAgICAgICByZXRfY29kZSA9IHN1YnByb2Nlc3MuY2FsbChjbWFrZV9jbWQpCisgICAgICAgIGlmIHJldF9jb2RlICE9IDA6CisgICAgICAgICAgICBzeXMuZXhpdChyZXRfY29kZSkKKworICAgIGRlZiBCdWlsZChzZWxmLCByZXBvcywgcmVwb19kaWN0KToKKyAgICAgICAgIiIiQnVpbGQgdGhlIGRlcGVuZGVudCByZXBvIiIiCisgICAgICAgIHByaW50KCdCdWlsZGluZyB7bn0gaW4ge2R9Jy5mb3JtYXQobj1zZWxmLm5hbWUsIGQ9c2VsZi5yZXBvX2RpcikpCisgICAgICAgIHByaW50KCdCdWlsZCBkaXIgPSB7Yn0nLmZvcm1hdChiPXNlbGYuYnVpbGRfZGlyKSkKKyAgICAgICAgcHJpbnQoJ0luc3RhbGwgZGlyID0ge2l9XG4nLmZvcm1hdChpPXNlbGYuaW5zdGFsbF9kaXIpKQorCisgICAgICAgICMgUnVuIGFueSBwcmVidWlsZCBjb21tYW5kcworICAgICAgICBzZWxmLlByZUJ1aWxkKCkKKworICAgICAgICBpZiBzZWxmLmJ1aWxkX3N0ZXAgPT0gJ2N1c3RvbSc6CisgICAgICAgICAgICBzZWxmLkN1c3RvbUJ1aWxkKHJlcG9fZGljdCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQnVpbGQgYW5kIGV4ZWN1dGUgQ01ha2UgY29tbWFuZCBmb3IgY3JlYXRpbmcgYnVpbGQgZmlsZXMKKyAgICAgICAgc2VsZi5DTWFrZUNvbmZpZyhyZXBvcykKKworICAgICAgICAjIEJ1aWxkIGFuZCBleGVjdXRlIENNYWtlIGNvbW1hbmQgZm9yIHRoZSBidWlsZAorICAgICAgICBzZWxmLkNNYWtlQnVpbGQoKQorCisKK2RlZiBHZXRHb29kUmVwb3MoYXJncyk6CisgICAgIiIiUmV0dXJucyB0aGUgbGF0ZXN0IGxpc3Qgb2YgR29vZFJlcG8gb2JqZWN0cy4KKworICAgIFRoZSBrbm93bi1nb29kIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIHNhbWUKKyAgICBkaXJlY3RvcnkgYXMgdGhpcyBzY3JpcHQgdW5sZXNzIG92ZXJyaWRkZW4gYnkgdGhlICdrbm93bl9nb29kX2RpcicKKyAgICBwYXJhbWV0ZXIuCisgICAgIiIiCisgICAgaWYgYXJncy5rbm93bl9nb29kX2RpcjoKKyAgICAgICAga25vd25fZ29vZF9maWxlID0gb3MucGF0aC5qb2luKCBvcy5wYXRoLmFic3BhdGgoYXJncy5rbm93bl9nb29kX2RpciksCisgICAgICAgICAgICBLTk9XTl9HT09EX0ZJTEVfTkFNRSkKKyAgICBlbHNlOgorICAgICAgICBrbm93bl9nb29kX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksIEtOT1dOX0dPT0RfRklMRV9OQU1FKQorICAgIHdpdGggb3Blbihrbm93bl9nb29kX2ZpbGUpIGFzIGtub3duX2dvb2Q6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICBHb29kUmVwbyhyZXBvLCBhcmdzKQorICAgICAgICAgICAgZm9yIHJlcG8gaW4ganNvbi5sb2Fkcyhrbm93bl9nb29kLnJlYWQoKSlbJ3JlcG9zJ10KKyAgICAgICAgXQorCisKK2RlZiBHZXRJbnN0YWxsTmFtZXMoYXJncyk6CisgICAgIiIiUmV0dXJucyB0aGUgaW5zdGFsbCBuYW1lcyBsaXN0LgorCisgICAgVGhlIGtub3duLWdvb2QgZmlsZSBpcyBleHBlY3RlZCB0byBiZSBpbiB0aGUgc2FtZQorICAgIGRpcmVjdG9yeSBhcyB0aGlzIHNjcmlwdCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSB0aGUgJ2tub3duX2dvb2RfZGlyJworICAgIHBhcmFtZXRlci4KKyAgICAiIiIKKyAgICBpZiBhcmdzLmtub3duX2dvb2RfZGlyOgorICAgICAgICBrbm93bl9nb29kX2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKGFyZ3Mua25vd25fZ29vZF9kaXIpLAorICAgICAgICAgICAgS05PV05fR09PRF9GSUxFX05BTUUpCisgICAgZWxzZToKKyAgICAgICAga25vd25fZ29vZF9maWxlID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCBLTk9XTl9HT09EX0ZJTEVfTkFNRSkKKyAgICB3aXRoIG9wZW4oa25vd25fZ29vZF9maWxlKSBhcyBrbm93bl9nb29kOgorICAgICAgICBpbnN0YWxsX2luZm8gPSBqc29uLmxvYWRzKGtub3duX2dvb2QucmVhZCgpKQorICAgICAgICBpZiBpbnN0YWxsX2luZm8uZ2V0KCdpbnN0YWxsX25hbWVzJyk6CisgICAgICAgICAgICByZXR1cm4gaW5zdGFsbF9pbmZvWydpbnN0YWxsX25hbWVzJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKworZGVmIENyZWF0ZUhlbHBlcihhcmdzLCByZXBvcywgZmlsZW5hbWUpOgorICAgICIiIkNyZWF0ZSBhIENNYWtlIGNvbmZpZyBoZWxwZXIgZmlsZS4KKworICAgIFRoZSBoZWxwZXIgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggJ2NtYWtlIC1DIDxmaWxlPicKKyAgICB0byBidWlsZCB0aGlzIGhvbWUgcmVwbyB1c2luZyB0aGUgZGVwZW5kZW5jaWVzIGJ1aWx0IGJ5IHRoaXMgc2NyaXB0LgorCisgICAgVGhlIGluc3RhbGxfbmFtZXMgZGljdGlvbmFyeSByZXByZXNlbnRzIHRoZSBDTWFrZSB2YXJpYWJsZXMgdXNlZCBieSB0aGUKKyAgICBob21lIHJlcG8gdG8gbG9jYXRlIHRoZSBpbnN0YWxsIGRpcnMgb2YgdGhlIGRlcGVuZGVudCByZXBvcy4KKyAgICBUaGlzIGluZm9ybWF0aW9uIGlzIGJha2VkIGludG8gdGhlIENNYWtlIGZpbGVzIG9mIHRoZSBob21lIHJlcG8gYW5kIHNvCisgICAgdGhpcyBkaWN0aW9uYXJ5IGlzIGtlcHQgd2l0aCB0aGUgcmVwbyB2aWEgdGhlIGpzb24gZmlsZS4KKyAgICAiIiIKKyAgICBkZWYgZXNjYXBlKHBhdGgpOgorICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKCdcXCcsICdcXFxcJykKKyAgICBpbnN0YWxsX25hbWVzID0gR2V0SW5zdGFsbE5hbWVzKGFyZ3MpCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGhlbHBlcl9maWxlOgorICAgICAgICBmb3IgcmVwbyBpbiByZXBvczoKKyAgICAgICAgICAgIGlmIGluc3RhbGxfbmFtZXMgYW5kIHJlcG8ubmFtZSBpbiBpbnN0YWxsX25hbWVzIGFuZCByZXBvLm9uX2J1aWxkX3BsYXRmb3JtOgorICAgICAgICAgICAgICAgIGhlbHBlcl9maWxlLndyaXRlKCdzZXQoe3Zhcn0gIntkaXJ9IiBDQUNIRSBTVFJJTkcgIiIgRk9SQ0UpXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyPWluc3RhbGxfbmFtZXNbcmVwby5uYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPWVzY2FwZShyZXBvLmluc3RhbGxfZGlyKSkpCisKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgICAgZGVzY3JpcHRpb249J0dldCBhbmQgYnVpbGQgZGVwZW5kZW50IHJlcG9zIGF0IGtub3duLWdvb2QgY29tbWl0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0ta25vd25fZ29vZF9kaXInLAorICAgICAgICBkZXN0PSdrbm93bl9nb29kX2RpcicsCisgICAgICAgIGhlbHA9IlNwZWNpZnkgZGlyZWN0b3J5IGZvciBrbm93bl9nb29kLmpzb24gZmlsZS4iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWRpcicsCisgICAgICAgIGRlc3Q9J2RpcicsCisgICAgICAgIGRlZmF1bHQ9Jy4nLAorICAgICAgICBoZWxwPSJTZXQgdGFyZ2V0IGRpcmVjdG9yeSBmb3IgcmVwb3NpdG9yeSByb290cy4gRGVmYXVsdCBpcyBcJy5cJy4iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLXJlZicsCisgICAgICAgIGRlc3Q9J3JlZicsCisgICAgICAgIGRlZmF1bHQ9JycsCisgICAgICAgIGhlbHA9Ik92ZXJyaWRlICdjb21taXQnIHdpdGggZ2l0IHJlZmVyZW5jZS4gRS5nLiwgJ29yaWdpbi9tYXN0ZXInIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1uby1idWlsZCcsCisgICAgICAgIGRlc3Q9J2RvX2J1aWxkJywKKyAgICAgICAgYWN0aW9uPSdzdG9yZV9mYWxzZScsCisgICAgICAgIGhlbHA9CisgICAgICAgICJDbG9uZS91cGRhdGUgcmVwb3NpdG9yaWVzIGFuZCBnZW5lcmF0ZSBidWlsZCBmaWxlcyB3aXRob3V0IHBlcmZvcm1pbmcgY29tcGlsYXRpb24iLAorICAgICAgICBkZWZhdWx0PVRydWUpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tY2xlYW4nLAorICAgICAgICBkZXN0PSdkb19jbGVhbicsCisgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgIGhlbHA9IkNsZWFuIGZpbGVzIGdlbmVyYXRlZCBieSBjb21waWxlciBhbmQgbGlua2VyIGJlZm9yZSBidWlsZGluZyIsCisgICAgICAgIGRlZmF1bHQ9RmFsc2UpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tY2xlYW4tcmVwbycsCisgICAgICAgIGRlc3Q9J2RvX2NsZWFuX3JlcG8nLAorICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICBoZWxwPSJEZWxldGUgcmVwb3NpdG9yeSBkaXJlY3RvcnkgYmVmb3JlIGJ1aWxkaW5nIiwKKyAgICAgICAgZGVmYXVsdD1GYWxzZSkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1jbGVhbi1idWlsZCcsCisgICAgICAgIGRlc3Q9J2RvX2NsZWFuX2J1aWxkJywKKyAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgaGVscD0iRGVsZXRlIGJ1aWxkIGRpcmVjdG9yeSBiZWZvcmUgYnVpbGRpbmciLAorICAgICAgICBkZWZhdWx0PUZhbHNlKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLWNsZWFuLWluc3RhbGwnLAorICAgICAgICBkZXN0PSdkb19jbGVhbl9pbnN0YWxsJywKKyAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgaGVscD0iRGVsZXRlIGluc3RhbGwgZGlyZWN0b3J5IGJlZm9yZSBidWlsZGluZyIsCisgICAgICAgIGRlZmF1bHQ9RmFsc2UpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tYXJjaCcsCisgICAgICAgIGRlc3Q9J2FyY2gnLAorICAgICAgICBjaG9pY2VzPVsnMzInLCAnNjQnLCAneDg2JywgJ3g2NCcsICd3aW4zMicsICd3aW42NCddLAorICAgICAgICB0eXBlPXN0ci5sb3dlciwKKyAgICAgICAgaGVscD0iU2V0IGJ1aWxkIGZpbGVzIGFyY2hpdGVjdHVyZSAoV2luZG93cykiLAorICAgICAgICBkZWZhdWx0PSc2NCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tY29uZmlnJywKKyAgICAgICAgZGVzdD0nY29uZmlnJywKKyAgICAgICAgY2hvaWNlcz1bJ2RlYnVnJywgJ3JlbGVhc2UnLCAncmVsd2l0aGRlYmluZm8nLCAnbWluc2l6ZXJlbCddLAorICAgICAgICB0eXBlPXN0ci5sb3dlciwKKyAgICAgICAgaGVscD0iU2V0IGJ1aWxkIGZpbGVzIGNvbmZpZ3VyYXRpb24iLAorICAgICAgICBkZWZhdWx0PSdkZWJ1ZycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tZ2VuZXJhdG9yJywKKyAgICAgICAgZGVzdD0nZ2VuZXJhdG9yJywKKyAgICAgICAgaGVscD0iU2V0IHRoZSBDTWFrZSBnZW5lcmF0b3IiLAorICAgICAgICBkZWZhdWx0PU5vbmUpCisKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIHNhdmVfY3dkID0gb3MuZ2V0Y3dkKCkKKworICAgICMgQ3JlYXRlIHdvcmtpbmcgInRvcCIgZGlyZWN0b3J5IGlmIG5lZWRlZAorICAgIGRpc3R1dGlscy5kaXJfdXRpbC5ta3BhdGgoYXJncy5kaXIpCisgICAgYWJzX3RvcF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoYXJncy5kaXIpCisKKyAgICByZXBvcyA9IEdldEdvb2RSZXBvcyhhcmdzKQorICAgIHJlcG9fZGljdCA9IHt9CisKKyAgICBwcmludCgnU3RhcnRpbmcgYnVpbGRzIGluIHtkfScuZm9ybWF0KGQ9YWJzX3RvcF9kaXIpKQorICAgIGZvciByZXBvIGluIHJlcG9zOgorICAgICAgICAjIElmIHRoZSByZXBvIGhhcyBhIHBsYXRmb3JtIHdoaXRlbGlzdCwgc2tpcCB0aGUgcmVwbworICAgICAgICAjIHVubGVzcyB3ZSBhcmUgYnVpbGRpbmcgb24gYSB3aGl0ZWxpc3RlZCBwbGF0Zm9ybS4KKyAgICAgICAgaWYgbm90IHJlcG8ub25fYnVpbGRfcGxhdGZvcm06CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGZpZWxkX2xpc3QgPSAoJ3VybCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3N1Yl9kaXInLAorICAgICAgICAgICAgICAgICAgICAgICdjb21taXQnLAorICAgICAgICAgICAgICAgICAgICAgICdidWlsZF9kaXInLAorICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsX2RpcicsCisgICAgICAgICAgICAgICAgICAgICAgJ2RlcHMnLAorICAgICAgICAgICAgICAgICAgICAgICdwcmVidWlsZCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3ByZWJ1aWxkX2xpbnV4JywKKyAgICAgICAgICAgICAgICAgICAgICAncHJlYnVpbGRfd2luZG93cycsCisgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbV9idWlsZCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2NtYWtlX29wdGlvbnMnLAorICAgICAgICAgICAgICAgICAgICAgICdjaV9vbmx5JywKKyAgICAgICAgICAgICAgICAgICAgICAnYnVpbGRfc3RlcCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX3BsYXRmb3JtcycsCisgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9fZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAnb25fYnVpbGRfcGxhdGZvcm0nKQorICAgICAgICByZXBvX2RpY3RbcmVwby5uYW1lXSA9IHtmaWVsZDogZ2V0YXR0cihyZXBvLCBmaWVsZCkgZm9yIGZpZWxkIGluIGZpZWxkX2xpc3R9CisKKyAgICAgICAgIyBJZiB0aGUgcmVwbyBoYXMgYSBDSSB3aGl0ZWxpc3QsIHNraXAgdGhlIHJlcG8gdW5sZXNzCisgICAgICAgICMgb25lIG9mIHRoZSBDSSdzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byB0cnVlLgorICAgICAgICBpZiBsZW4ocmVwby5jaV9vbmx5KToKKyAgICAgICAgICAgIGRvX2J1aWxkID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBlbnYgaW4gcmVwby5jaV9vbmx5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBlbnYgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBvcy5lbnZpcm9uW2Vudl0ubG93ZXIoKSA9PSAndHJ1ZSc6CisgICAgICAgICAgICAgICAgICAgIGRvX2J1aWxkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm90IGRvX2J1aWxkOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgIyBDbG9uZS91cGRhdGUgdGhlIHJlcG9zaXRvcnkKKyAgICAgICAgcmVwby5DaGVja291dCgpCisKKyAgICAgICAgIyBCdWlsZCB0aGUgcmVwb3NpdG9yeQorICAgICAgICBpZiBhcmdzLmRvX2J1aWxkIGFuZCByZXBvLmJ1aWxkX3N0ZXAgIT0gJ3NraXAnOgorICAgICAgICAgICAgcmVwby5CdWlsZChyZXBvcywgcmVwb19kaWN0KQorCisgICAgIyBOZWVkIHRvIHJlc3RvcmUgb3JpZ2luYWwgY3dkIGluIG9yZGVyIGZvciBDcmVhdGVIZWxwZXIgdG8gZmluZCBqc29uIGZpbGUKKyAgICBvcy5jaGRpcihzYXZlX2N3ZCkKKyAgICBDcmVhdGVIZWxwZXIoYXJncywgcmVwb3MsIG9zLnBhdGguam9pbihhYnNfdG9wX2RpciwgJ2hlbHBlci5jbWFrZScpKQorCisgICAgc3lzLmV4aXQoMCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy92a192YWxpZGF0aW9uX3N0YXRzLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvc2NyaXB0cy92a192YWxpZGF0aW9uX3N0YXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3MDdkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy9zY3JpcHRzL3ZrX3ZhbGlkYXRpb25fc3RhdHMucHkKQEAgLTAsMCArMSw4MTkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisjIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorIyBBdXRob3I6IFNoYW5ub24gTWNQaGVyc29uIDxzaGFubm9uQGx1bmFyZy5jb20+CisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGNvbW1vbl9jb2RlZ2VuCitpbXBvcnQgY3N2CitpbXBvcnQgZ2xvYgoraW1wb3J0IGh0bWwKK2ltcG9ydCBqc29uCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAorCit2ZXJib3NlX21vZGUgPSBGYWxzZQordHh0X2RiID0gRmFsc2UKK2Nzdl9kYiA9IEZhbHNlCitodG1sX2RiID0gRmFsc2UKK3R4dF9maWxlbmFtZSA9ICJ2YWxpZGF0aW9uX2Vycm9yX2RhdGFiYXNlLnR4dCIKK2Nzdl9maWxlbmFtZSA9ICJ2YWxpZGF0aW9uX2Vycm9yX2RhdGFiYXNlLmNzdiIKK2h0bWxfZmlsZW5hbWUgPSAidmFsaWRhdGlvbl9lcnJvcl9kYXRhYmFzZS5odG1sIgoraGVhZGVyX2ZpbGVuYW1lID0gInZrX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZXMuaCIKK3Z1aWRfcHJlZml4ZXMgPSBbJ1ZVSUQtJywgJ1VOQVNTSUdORUQtJ10KKworIyBIYXJkLWNvZGVkIGZsYWdzIHRoYXQgY291bGQgYmUgY29tbWFuZCBsaW5lIGFyZ3MsIGlmIHdlIGRlY2lkZSB0aGF0J3MgdXNlZnVsCisjIHJlcGxhY2UgS0hSIHZ1aWRzIHdpdGggbm9uLUtIUiBkdXJpbmcgY29uc2lzdGVuY3kgY2hlY2tpbmcKK2RlYWxpYXNfa2hyID0gVHJ1ZQoraWdub3JlX3VuYXNzaWduZWQgPSBUcnVlICMgVGhlc2UgYXJlIG5vdCBmb3VuZCBpbiBsYXllciBjb2RlIHVubGVzcyB0aGV5IGFwcGVhciBleHBsaWNpdGx5IChtb3N0IGRvbid0KSwgc28gcHJvZHVjZSBmYWxzZSBwb3NpdGl2ZXMKKworbGF5ZXJfc291cmNlX2ZpbGVzID0gW2NvbW1vbl9jb2RlZ2VuLnJlcG9fcmVsYXRpdmUocGF0aCkgZm9yIHBhdGggaW4gWworICAgICdsYXllcnMvYnVmZmVyX3ZhbGlkYXRpb24uY3BwJywKKyAgICAnbGF5ZXJzL2NvcmVfdmFsaWRhdGlvbi5jcHAnLAorICAgICdsYXllcnMvZGVzY3JpcHRvcl9zZXRzLmNwcCcsCisgICAgJ2xheWVycy9kcmF3ZGlzcGF0Y2guY3BwJywKKyAgICAnbGF5ZXJzL3BhcmFtZXRlcl92YWxpZGF0aW9uX3V0aWxzLmNwcCcsCisgICAgJ2xheWVycy9vYmplY3RfdHJhY2tlcl91dGlscy5jcHAnLAorICAgICdsYXllcnMvc2hhZGVyX3ZhbGlkYXRpb24uY3BwJywKKyAgICAnbGF5ZXJzL3N0YXRlbGVzc192YWxpZGF0aW9uLmgnLAorICAgICdsYXllcnMvZ2VuZXJhdGVkL3BhcmFtZXRlcl92YWxpZGF0aW9uLmNwcCcsCisgICAgJ2xheWVycy9nZW5lcmF0ZWQvb2JqZWN0X3RyYWNrZXIuY3BwJywKK11dCisKK3Rlc3Rfc291cmNlX2ZpbGVzID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihjb21tb25fY29kZWdlbi5yZXBvX3JlbGF0aXZlKCd0ZXN0cycpLCAnKi5jcHAnKSkKKworIyBUaGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYXMgbmV3IGV4dGVuc2lvbnMgcm9sbCBpbgora2hyX2FsaWFzZXMgPSB7CisgICAgJ1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5MktIUi1kZXZpY2UtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItZGV2aWNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5MktIUi1wQmluZEluZm9zLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrQmluZEJ1ZmZlck1lbW9yeTItcEJpbmRJbmZvcy1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrQmluZEltYWdlTWVtb3J5MktIUi1kZXZpY2UtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0JpbmRJbWFnZU1lbW9yeTItZGV2aWNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtCaW5kSW1hZ2VNZW1vcnkyS0hSLXBCaW5kSW5mb3MtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrQmluZEltYWdlTWVtb3J5Mi1wQmluZEluZm9zLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtDbWREaXNwYXRjaEJhc2VLSFItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0NtZFNldERldmljZU1hc2tLSFItY29tbWFuZEJ1ZmZlci1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWNvbW1hbmRCdWZmZXItcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUi1kZXZpY2UtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFItcERlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJhbWV0ZXInICAgICAgICA6ICdWVUlELXZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFItZGV2aWNlLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLWRldmljZS1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUi1wWWNiY3JDb252ZXJzaW9uLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24tcFljYmNyQ29udmVyc2lvbi1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUi1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyJyAgICAgICAgOiAnVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJlbnQnICAgICAgICAgICA6ICdWVUlELXZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyZW50JywKKyAgICAnVlVJRC12a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFItZGV2aWNlLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLWRldmljZS1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFItZGV2aWNlLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLWRldmljZS1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIteWNiY3JDb252ZXJzaW9uLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXljYmNyQ29udmVyc2lvbi1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIteWNiY3JDb252ZXJzaW9uLXBhcmVudCcgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXljYmNyQ29udmVyc2lvbi1wYXJlbnQnLAorICAgICdWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHNLSFItaW5zdGFuY2UtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzLWluc3RhbmNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3Vwc0tIUi1wUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXMtcGFyYW1ldGVyJyAgICA6ICdWVUlELXZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMtcFBoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSLWRldmljZS1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMi1kZXZpY2UtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0S0hSLWRldmljZS1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydC1kZXZpY2UtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSLWRldmljZS1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1kZXZpY2UtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldERldmljZUdyb3VwUGVlck1lbW9yeUZlYXR1cmVzS0hSLXBQZWVyTWVtb3J5RmVhdHVyZXMtcGFyYW1ldGVyJyAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXREZXZpY2VHcm91cFBlZXJNZW1vcnlGZWF0dXJlcy1wUGVlck1lbW9yeUZlYXR1cmVzLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFItZGV2aWNlLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyLWRldmljZS1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSLWRldmljZS1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMi1kZXZpY2UtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzMktIUi1wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlcicgICAgIDogJ1ZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czItcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyJyAgICAgICAgOiAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcicgICAgICAgICA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1waHlzaWNhbERldmljZS1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyJyAgICAgOiAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFItZm9ybWF0LXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMyLWZvcm1hdC1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXInICAgICAgICAgICAgICAgOiAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXInICAgICAgICAgIDogJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyJyAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMi1waHlzaWNhbERldmljZS1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMyS0hSLXBRdWV1ZUZhbWlseVByb3BlcnRpZXMtcGFyYW1ldGVyJyAgOiAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzMi1wUXVldWVGYW1pbHlQcm9wZXJ0aWVzLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFItcFByb3BlcnRpZXMtcGFyYW1ldGVyJyAgICAgICA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFItcGh5c2ljYWxEZXZpY2UtcGFyYW1ldGVyJyAgICA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBoeXNpY2FsRGV2aWNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtUcmltQ29tbWFuZFBvb2xLSFItY29tbWFuZFBvb2wtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrVHJpbUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtUcmltQ29tbWFuZFBvb2xLSFItY29tbWFuZFBvb2wtcGFyZW50JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrVHJpbUNvbW1hbmRQb29sLWNvbW1hbmRQb29sLXBhcmVudCcsCisgICAgJ1ZVSUQtdmtUcmltQ29tbWFuZFBvb2xLSFItZGV2aWNlLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrVHJpbUNvbW1hbmRQb29sLWRldmljZS1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrVHJpbUNvbW1hbmRQb29sS0hSLWZsYWdzLXplcm9iaXRtYXNrJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a1RyaW1Db21tYW5kUG9vbC1mbGFncy16ZXJvYml0bWFzaycsCisgICAgJ1ZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWRlc2NyaXB0b3JTZXQtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXNjcmlwdG9yU2V0LXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJhbWV0ZXInICAgICAgICA6ICdWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZS1kZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFItZGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlLXBhcmVudCcgICAgICAgICAgIDogJ1ZVSUQtdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlLWRlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wYXJlbnQnLAorICAgICdWVUlELXZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUi1kZXZpY2UtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGUtZGV2aWNlLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFItcENyZWF0ZUluZm8tcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZS1wQ3JlYXRlSW5mby1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uLXBDcmVhdGVJbmZvLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSLXBJbmZvLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czItcEluZm8tcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFItcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMi1wTWVtb3J5UmVxdWlyZW1lbnRzLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUi1wQ3JlYXRlSW5mby1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXBDcmVhdGVJbmZvLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXREZXNjcmlwdG9yU2V0TGF5b3V0U3VwcG9ydEtIUi1wU3VwcG9ydC1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0dldERlc2NyaXB0b3JTZXRMYXlvdXRTdXBwb3J0LXBTdXBwb3J0LXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFItcEluZm8tcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMi1wSW5mby1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSLXBNZW1vcnlSZXF1aXJlbWVudHMtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czItcE1lbW9yeVJlcXVpcmVtZW50cy1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSLXBJbmZvLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50czItcEluZm8tcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzS0hSLXBFeHRlcm5hbEJ1ZmZlckluZm8tcGFyYW1ldGVyJyAgICAgICAgICAgICA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXMtcEV4dGVybmFsQnVmZmVySW5mby1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFItcEV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1wYXJhbWV0ZXInICAgICAgIDogJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllcy1wRXh0ZXJuYWxCdWZmZXJQcm9wZXJ0aWVzLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSLXBFeHRlcm5hbEZlbmNlSW5mby1wYXJhbWV0ZXInICAgICAgICAgICAgICAgOiAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcEV4dGVybmFsRmVuY2VJbmZvLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSLXBFeHRlcm5hbEZlbmNlUHJvcGVydGllcy1wYXJhbWV0ZXInICAgICAgICAgOiAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMtcEV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUi1wRXh0ZXJuYWxTZW1hcGhvcmVJbmZvLXBhcmFtZXRlcicgICAgICAgOiAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzLXBFeHRlcm5hbFNlbWFwaG9yZUluZm8tcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSLXBFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcGFyYW1ldGVyJyA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMtcEV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcy1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFItcEZlYXR1cmVzLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMi1wRmVhdHVyZXMtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczJLSFItcEZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgICAgICA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzMi1wRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSLXBJbWFnZUZvcm1hdEluZm8tcGFyYW1ldGVyJyAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcEltYWdlRm9ybWF0SW5mby1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSLXBJbWFnZUZvcm1hdFByb3BlcnRpZXMtcGFyYW1ldGVyJyAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcEltYWdlRm9ybWF0UHJvcGVydGllcy1wYXJhbWV0ZXInLAorICAgICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMktIUi1wTWVtb3J5UHJvcGVydGllcy1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICAgICAgIDogJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyLXBNZW1vcnlQcm9wZXJ0aWVzLXBhcmFtZXRlcicsCisgICAgJ1ZVSUQtdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSLXBQcm9wZXJ0aWVzLXBhcmFtZXRlcicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczItcFByb3BlcnRpZXMtcGFyYW1ldGVyJywKKyAgICAnVlVJRC12a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUi1wRm9ybWF0SW5mby1wYXJhbWV0ZXInICAgICAgICAgICAgICAgICA6ICdWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBGb3JtYXRJbmZvLXBhcmFtZXRlcicgfQorCitkZWYgcHJpbnRIZWxwKCk6CisgICAgcHJpbnQgKCJVc2FnZToiKQorICAgIHByaW50ICgiICBweXRob24gdmtfdmFsaWRhdGlvbl9zdGF0cy5weSA8anNvbl9maWxlPiIpCisgICAgcHJpbnQgKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgLWMgXSIpCisgICAgcHJpbnQgKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgLXRvZG8gXSIpCisgICAgcHJpbnQgKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgLXZ1aWQgPHZ1aWRfbmFtZT4gXSIpCisgICAgcHJpbnQgKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgLXRleHQgWyA8dGV4dF9vdXRfZmlsZW5hbWU+XSBdIikKKyAgICBwcmludCAoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAtY3N2ICBbIDxjc3Zfb3V0X2ZpbGVuYW1lPl0gIF0iKQorICAgIHByaW50ICgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIC1odG1sIFsgPGh0bWxfb3V0X2ZpbGVuYW1lPl0gXSIpCisgICAgcHJpbnQgKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgLWV4cG9ydF9oZWFkZXIgXSIpCisgICAgcHJpbnQgKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgLXN1bW1hcnkgXSIpCisgICAgcHJpbnQgKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgLXZlcmJvc2UgXSIpCisgICAgcHJpbnQgKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgLWhlbHAgXSIpCisgICAgcHJpbnQgKCJcbiAgVGhlIHZrX3ZhbGlkYXRpb25fc3RhdHMgc2NyaXB0IHBhcnNlcyB2YWxpZGF0aW9uIGxheWVyIHNvdXJjZSBmaWxlcyB0byIpCisgICAgcHJpbnQgKCIgIGRldGVybWluZSB0aGUgc2V0IG9mIHZhbGlkIHVzYWdlIGNoZWNrcyBhbmQgdGVzdHMgY3VycmVudGx5IGltcGxlbWVudGVkLCIpCisgICAgcHJpbnQgKCIgIGFuZCBnZW5lcmF0ZXMgY292ZXJhZ2UgdmFsdWVzIGJ5IGNvbXBhcmluZyBhZ2FpbnN0IHRoZSBmdWxsIHNldCBvZiB2YWxpZCIpCisgICAgcHJpbnQgKCIgIHVzYWdlIGlkZW50aWZpZXJzIGluIHRoZSBWdWxrYW4tSGVhZGVycyByZWdpc3RyeSBmaWxlICd2YWxpZHVzYWdlLmpzb24nIikKKyAgICBwcmludCAoIlxuQXJndW1lbnRzOiAiKQorICAgIHByaW50ICgiIDxqc29uLWZpbGU+ICAgICAgIChyZXF1aXJlZCkgcmVnaXN0cnkgZmlsZSAndmFsaWR1c2FnZS5qc29uJyIpCisgICAgcHJpbnQgKCIgLWMgICAgICAgICAgICAgICAgcmVwb3J0IGNvbnNpc3RlbmN5IHdhcm5pbmdzIikKKyAgICBwcmludCAoIiAtdG9kbyAgICAgICAgICAgICByZXBvcnQgdW5pbXBsZW1lbnRlZCBWVUlEcyIpCisgICAgcHJpbnQgKCIgLXZ1aWQgPHZ1aWRfbmFtZT4gcmVwb3J0IHN0YXR1cyBvZiBpbmRpdmlkdWFsIFZVSUQgPHZ1aWRfbmFtZT4iKQorICAgIHByaW50ICgiIC10ZXh0IFtmaWxlbmFtZV0gIG91dHB1dCB0aGUgZXJyb3IgZGF0YWJhc2UgdGV4dCB0byA8dGV4dF9kYXRhYmFzZV9maWxlbmFtZT4sIikKKyAgICBwcmludCAoIiAgICAgICAgICAgICAgICAgICBkZWZhdWx0cyB0byAndmFsaWRhdGlvbl9lcnJvcl9kYXRhYmFzZS50eHQnIikKKyAgICBwcmludCAoIiAtY3N2IFtmaWxlbmFtZV0gICBvdXRwdXQgdGhlIGVycm9yIGRhdGFiYXNlIGluIGNzdiB0byA8Y3N2X2RhdGFiYXNlX2ZpbGVuYW1lPiwiKQorICAgIHByaW50ICgiICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvICd2YWxpZGF0aW9uX2Vycm9yX2RhdGFiYXNlLmNzdiciKQorICAgIHByaW50ICgiIC1odG1sIFtmaWxlbmFtZV0gIG91dHB1dCB0aGUgZXJyb3IgZGF0YWJhc2UgaW4gaHRtbCB0byA8aHRtbF9kYXRhYmFzZV9maWxlbmFtZT4sIikKKyAgICBwcmludCAoIiAgICAgICAgICAgICAgICAgICBkZWZhdWx0cyB0byAndmFsaWRhdGlvbl9lcnJvcl9kYXRhYmFzZS5odG1sJyIpCisgICAgcHJpbnQgKCIgLWV4cG9ydF9oZWFkZXIgICAgZXhwb3J0IGEgbmV3IFZVSUQgZXJyb3IgdGV4dCBoZWFkZXIgZmlsZSB0byA8JXM+IiAlIGhlYWRlcl9maWxlbmFtZSkKKyAgICBwcmludCAoIiAtc3VtbWFyeSAgICAgICAgICBvdXRwdXQgc3VtbWFyeSBvZiBWVUlEIGNvdmVyYWdlIikKKyAgICBwcmludCAoIiAtdmVyYm9zZSAgICAgICAgICBzaG93IHlvdXIgd29yayAodG8gc3Rkb3V0KSIpCisKK2NsYXNzIFZhbGlkYXRpb25KU09OOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmV4cGxpY2l0X3Z1aWRzID0gc2V0KCkKKyAgICAgICAgc2VsZi5pbXBsaWNpdF92dWlkcyA9IHNldCgpCisgICAgICAgIHNlbGYuYWxsX3Z1aWRzID0gc2V0KCkKKyAgICAgICAgc2VsZi52dWlkX2RiID0gZGVmYXVsdGRpY3QobGlzdCkgIyBNYXBzIFZVSUQgc3RyaW5nIHRvIGxpc3Qgb2YganNvbi1kYXRhIGRpY3RzCisgICAgICAgIHNlbGYuYXBpdmVyc2lvbiA9ICIiCisgICAgICAgIHNlbGYuZHVwbGljYXRlX3Z1aWRzID0gc2V0KCkKKworICAgICAgICAjIEEgc2V0IG9mIHNwZWNpZmljIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJzdGl0dXRpb25zIG5lZWRlZCB0byBjbGVhbiB1cCBWVUlEIHRleHQKKyAgICAgICAgc2VsZi5yZWdleF9kaWN0ID0ge30KKyAgICAgICAgc2VsZi5yZWdleF9kaWN0W3JlLmNvbXBpbGUoJzwuKj8+fCYoYW1wOykrbHQ7fCYoYW1wOykrZ3Q7JyldID0gIiIKKyAgICAgICAgc2VsZi5yZWdleF9kaWN0W3JlLmNvbXBpbGUocidcXFwoY29kZVNpemUgXFxvdmVyIDRcXFwpJyldID0gIihjb2RlU2l6ZS80KSIKKyAgICAgICAgc2VsZi5yZWdleF9kaWN0W3JlLmNvbXBpbGUocidcXFwoXFxsY2VpbHtcXGZyYWN7aGVpZ2h0fXttYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemVfe2hlaWdodH19fVxccmNlaWxcXFwpJyldID0gInRoZSBjZWlsaW5nIG9mIGhlaWdodC9tYXhGcmFnbWVudERlbnNpdHlUZXhlbFNpemUuaGVpZ2h0IgorICAgICAgICBzZWxmLnJlZ2V4X2RpY3RbcmUuY29tcGlsZShyJ1xcXChcXGxjZWlse1xcZnJhY3t3aWR0aH17bWF4RnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplX3t3aWR0aH19fVxccmNlaWxcXFwpJyldID0gInRoZSBjZWlsaW5nIG9mIHdpZHRoL21heEZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZS53aWR0aCIKKyAgICAgICAgc2VsZi5yZWdleF9kaWN0W3JlLmNvbXBpbGUocidcXFwoXFxsY2VpbHtcXGZyYWN7bWF4RnJhbWVidWZmZXJIZWlnaHR9e21pbkZyYWdtZW50RGVuc2l0eVRleGVsU2l6ZV97aGVpZ2h0fX19XFxyY2VpbFxcXCknKV0gPSAidGhlIGNlaWxpbmcgb2YgbWF4RnJhbWVidWZmZXJIZWlnaHQvbWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplLmhlaWdodCIKKyAgICAgICAgc2VsZi5yZWdleF9kaWN0W3JlLmNvbXBpbGUocidcXFwoXFxsY2VpbHtcXGZyYWN7bWF4RnJhbWVidWZmZXJXaWR0aH17bWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplX3t3aWR0aH19fVxccmNlaWxcXFwpJyldID0gInRoZSBjZWlsaW5nIG9mIG1heEZyYW1lYnVmZmVyV2lkdGgvbWluRnJhZ21lbnREZW5zaXR5VGV4ZWxTaXplLndpZHRoIgorICAgICAgICBzZWxmLnJlZ2V4X2RpY3RbcmUuY29tcGlsZShyJ1xcXChcXGxjZWlsXHtcXG1hdGhpdFx7cmFzdGVyaXphdGlvblNhbXBsZXN9IFxcb3ZlciAzMn1cXHJjZWlsXFxcKScpXSA9ICIocmFzdGVyaXphdGlvblNhbXBsZXMvMzIpIgorICAgICAgICBzZWxmLnJlZ2V4X2RpY3RbcmUuY29tcGlsZShyJ1xcXChcXHRleHRybVx7Y29kZVNpemV9IFxcb3ZlciA0XFxcKScpXSA9ICIoY29kZVNpemUvNCkiCisgICAgICAgICMgU29tZSBmYW5jeSBwdW5jdHVhdGlvbiBjaGFycyB0aGF0IGJyZWFrIHRoZSBBbmRyb2lkIGJ1aWxkLi4uCisgICAgICAgIHNlbGYucmVnZXhfZGljdFtyZS5jb21waWxlKCcmIzg1OTQ7JyldID0gIi0+IiAgICAgICAjIEFycm93IGNoYXIKKyAgICAgICAgc2VsZi5yZWdleF9kaWN0W3JlLmNvbXBpbGUoJyYjODIxNzsnKV0gPSAiJyIgICAgICAgICMgTGVmdC1zbGFudGluZyBhcG9zdHJvcGhlIHRvIGFwb3N0cm9waGUKKyAgICAgICAgc2VsZi5yZWdleF9kaWN0W3JlLmNvbXBpbGUoJyYjODIyKDB8MSk7JyldID0gIiciICAgICMgTC9SLXNsYW50aW5nIHF1b3RlcyB0byBhcG9zdHJvcGhlCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5qc29uX2RpY3QgPSB7fQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLmZpbGVuYW1lKToKKyAgICAgICAgICAgIGpzb25fZmlsZSA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKQorICAgICAgICAgICAgc2VsZi5qc29uX2RpY3QgPSBqc29uLmxvYWQoanNvbl9maWxlKQorICAgICAgICAgICAganNvbl9maWxlLmNsb3NlKCkKKyAgICAgICAgaWYgbGVuKHNlbGYuanNvbl9kaWN0KSA9PSAwOgorICAgICAgICAgICAgcHJpbnQoIkVycm9yOiBFcnJvciBsb2FkaW5nIHZhbGlkdXNhZ2UuanNvbiBmaWxlIDwlcz4iICUgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgICAgIHN5cy5leGl0KC0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi5qc29uX2RpY3RbJ3ZlcnNpb24gaW5mbyddCisgICAgICAgICAgICB2YWxpZGF0aW9uID0gc2VsZi5qc29uX2RpY3RbJ3ZhbGlkYXRpb24nXQorICAgICAgICAgICAgc2VsZi5hcGl2ZXJzaW9uID0gdmVyc2lvblsnYXBpIHZlcnNpb24nXQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwcmludCgiRXJyb3I6IEZhaWx1cmUgcGFyc2luZyB2YWxpZHVzYWdlLmpzb24gb2JqZWN0IikKKyAgICAgICAgICAgIHN5cy5leGl0KC0xKQorCisgICAgICAgICMgUGFyc2UgdnVpZCBmcm9tIGpzb24gaW50byBsb2NhbCBkYXRhYmFzZXMKKyAgICAgICAgZm9yIGFwaW5hbWUgaW4gdmFsaWRhdGlvbi5rZXlzKCk6CisgICAgICAgICAgICAjIHByaW50KCJlbnRyeXBvaW50OiVzIiVhcGluYW1lKQorICAgICAgICAgICAgYXBpZGljdCA9IHZhbGlkYXRpb25bYXBpbmFtZV0KKyAgICAgICAgICAgIGZvciBleHQgaW4gYXBpZGljdC5rZXlzKCk6CisgICAgICAgICAgICAgICAgdmxpc3QgPSBhcGlkaWN0W2V4dF0KKyAgICAgICAgICAgICAgICBmb3IgdmVudHJ5IGluIHZsaXN0OgorICAgICAgICAgICAgICAgICAgICB2dWlkX3N0cmluZyA9IHZlbnRyeVsndnVpZCddCisgICAgICAgICAgICAgICAgICAgIGlmICh2dWlkX3N0cmluZ1stNTotMV0uaXNkZWNpbWFsKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBsaWNpdF92dWlkcy5hZGQodnVpZF9zdHJpbmcpICAgICMgZXhwbGljaXQgZW5kIGluIDUgbnVtZXJpYyBjaGFycworICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSAnZXhwbGljaXQnCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltcGxpY2l0X3Z1aWRzLmFkZCh2dWlkX3N0cmluZykgICAgIyBvdGhlcndpc2UsIGltcGxpY2l0CisgICAgICAgICAgICAgICAgICAgICAgICB2dHlwZSA9ICdpbXBsaWNpdCcKKyAgICAgICAgICAgICAgICAgICAgdnVpZF90ZXh0ID0gdmVudHJ5Wyd0ZXh0J10KKyAgICAgICAgICAgICAgICAgICAgZm9yIHJlZ2V4LCByZXBsYWNlbWVudCBpbiBzZWxmLnJlZ2V4X2RpY3QuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ1aWRfdGV4dCA9IHJlLnN1YihyZWdleCwgcmVwbGFjZW1lbnQsIHZ1aWRfdGV4dCkgICAjIGRvIHJlZ2V4IHN1YnN0aXR1dGlvbgorICAgICAgICAgICAgICAgICAgICB2dWlkX3RleHQgPSBodG1sLnVuZXNjYXBlKHZ1aWRfdGV4dCkgICAgICAgICAgICAgICAgICAgICMgYW55dGhpbmcgbWlzc2VkIGJ5IHRoZSByZWdleAorICAgICAgICAgICAgICAgICAgICBzZWxmLnZ1aWRfZGJbdnVpZF9zdHJpbmddLmFwcGVuZCh7J2FwaSc6YXBpbmFtZSwgJ2V4dCc6ZXh0LCAndHlwZSc6dnR5cGUsICd0ZXh0Jzp2dWlkX3RleHR9KQorICAgICAgICBzZWxmLmFsbF92dWlkcyA9IHNlbGYuZXhwbGljaXRfdnVpZHMgfCBzZWxmLmltcGxpY2l0X3Z1aWRzCisgICAgICAgIHNlbGYuZHVwbGljYXRlX3Z1aWRzID0gc2V0KHt2IGZvciB2IGluIHNlbGYudnVpZF9kYiBpZiBsZW4oc2VsZi52dWlkX2RiW3ZdKSA+IDF9KQorICAgICAgICBpZiBsZW4oc2VsZi5kdXBsaWNhdGVfdnVpZHMpID4gMDoKKyAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBkdXBsaWNhdGUgVlVJRHMgZm91bmQgaW4gdmFsaWR1c2FnZS5qc29uIikKKworCitjbGFzcyBWYWxpZGF0aW9uU291cmNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2VfZmlsZV9saXN0KToKKyAgICAgICAgc2VsZi5zb3VyY2VfZmlsZXMgPSBzb3VyY2VfZmlsZV9saXN0CisgICAgICAgIHNlbGYudnVpZF9jb3VudF9kaWN0ID0ge30gIyBkaWN0IG9mIHZ1aWQgdmFsdWVzIHRvIHRoZSBjb3VudCBvZiBob3cgbXVjaCB0aGV5J3JlIHVzZWQsIGFuZCBsb2NhdGlvbiBvZiB3aGVyZSB0aGV5J3JlIHVzZWQKKyAgICAgICAgc2VsZi5kdXBsaWNhdGVkX2NoZWNrcyA9IDAKKyAgICAgICAgc2VsZi5leHBsaWNpdF92dWlkcyA9IHNldCgpCisgICAgICAgIHNlbGYuaW1wbGljaXRfdnVpZHMgPSBzZXQoKQorICAgICAgICBzZWxmLnVuYXNzaWduZWRfdnVpZHMgPSBzZXQoKQorICAgICAgICBzZWxmLmFsbF92dWlkcyA9IHNldCgpCisKKyAgICBkZWYgcGFyc2Uoc2VsZik6CisgICAgICAgIHByZXBlbmQgPSBOb25lCisgICAgICAgIGZvciBzZiBpbiBzZWxmLnNvdXJjZV9maWxlczoKKyAgICAgICAgICAgIGxpbmVfbnVtID0gMAorICAgICAgICAgICAgd2l0aCBvcGVuKHNmKSBhcyBmOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtID0gbGluZV9udW0gKyAxCisgICAgICAgICAgICAgICAgICAgIGlmIFRydWUgaW4gW2xpbmUuc3RyaXAoKS5zdGFydHN3aXRoKGNvbW1lbnQpIGZvciBjb21tZW50IGluIFsnLy8nLCAnLyonXV06CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAjIEZpbmQgdnVpZCBzdHJpbmdzCisgICAgICAgICAgICAgICAgICAgIGlmIHByZXBlbmQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gcHJlcGVuZFs6LTJdICsgbGluZS5sc3RyaXAoKS5sc3RyaXAoJyInKSAjIGpvaW4gbGluZXMgc2tpcHBpbmcgQ1IsIHdoaXRlc3BhY2UgYW5kIHRyYWlsaW5nL2xlYWRpbmcgcXVvdGUgY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgYW55KHByZWZpeCBpbiBsaW5lIGZvciBwcmVmaXggaW4gdnVpZF9wcmVmaXhlcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFJlcGxhY2UgdGhlICcoJyBvZiBsaW5lcyBjb250YWluaW5nIHZhbGlkYXRpb24gaGVscGVyIGZ1bmN0aW9ucyB3aXRoICcgJyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIHBhcnNlCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCIoIiwgIiAiKQorICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9saXN0ID0gbGluZS5zcGxpdCgpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQSBWVUlEIHN0cmluZyB0aGF0IGhhcyBiZWVuIGJyb2tlbiBieSBjbGFuZyB3aWxsIHN0YXJ0IHdpdGggYSB2dWlkIHByZWZpeCBhbmQgZW5kIHdpdGggLSwgYW5kIHdpbGwgYmUgbGFzdCBpbiB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuX3Z1aWQgPSBsaW5lX2xpc3RbLTFdLnN0cmlwKCciJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFueShicm9rZW5fdnVpZC5zdGFydHN3aXRoKHByZWZpeCkgZm9yIHByZWZpeCBpbiB2dWlkX3ByZWZpeGVzKSBhbmQgYnJva2VuX3Z1aWQuZW5kc3dpdGgoJy0nKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kID0gbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ1aWRfbGlzdCA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3RyIGluIGxpbmVfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhbnkocHJlZml4IGluIHN0ciBmb3IgcHJlZml4IGluIHZ1aWRfcHJlZml4ZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dWlkX2xpc3QuYXBwZW5kKHN0ci5zdHJpcCgnLCk7e30iJykpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdnVpZCBpbiB2dWlkX2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdnVpZCBub3QgaW4gc2VsZi52dWlkX2NvdW50X2RpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnVpZF9jb3VudF9kaWN0W3Z1aWRdID0ge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52dWlkX2NvdW50X2RpY3RbdnVpZF1bJ2NvdW50J10gPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnVpZF9jb3VudF9kaWN0W3Z1aWRdWydmaWxlX2xpbmUnXSA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52dWlkX2NvdW50X2RpY3RbdnVpZF1bJ2NvdW50J10gPT0gMTogICAgIyBvbmx5IGNvdW50IGZpcnN0IHRpbWUgZHVwbGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kdXBsaWNhdGVkX2NoZWNrcyA9IHNlbGYuZHVwbGljYXRlZF9jaGVja3MgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnVpZF9jb3VudF9kaWN0W3Z1aWRdWydjb3VudCddID0gc2VsZi52dWlkX2NvdW50X2RpY3RbdnVpZF1bJ2NvdW50J10gKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52dWlkX2NvdW50X2RpY3RbdnVpZF1bJ2ZpbGVfbGluZSddLmFwcGVuZCgnJXMsJWQnICUgKHNmLCBsaW5lX251bSkpCisgICAgICAgICMgU29ydCB2dWlkcyBieSB0eXBlCisgICAgICAgIGZvciB2dWlkIGluIHNlbGYudnVpZF9jb3VudF9kaWN0LmtleXMoKToKKyAgICAgICAgICAgIGlmICh2dWlkLnN0YXJ0c3dpdGgoJ1ZVSUQtJykpOgorICAgICAgICAgICAgICAgIGlmICh2dWlkWy01Oi0xXS5pc2RlY2ltYWwoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwbGljaXRfdnVpZHMuYWRkKHZ1aWQpICAgICMgZXhwbGljaXQgZW5kIGluIDUgbnVtZXJpYyBjaGFycworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW1wbGljaXRfdnVpZHMuYWRkKHZ1aWQpCisgICAgICAgICAgICBlbGlmICh2dWlkLnN0YXJ0c3dpdGgoJ1VOQVNTSUdORUQtJykpOgorICAgICAgICAgICAgICAgIHNlbGYudW5hc3NpZ25lZF92dWlkcy5hZGQodnVpZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoIlVuYWJsZSB0byBjYXRlZ29yaXplIFZVSUQ6ICVzIiAlIHZ1aWQpCisgICAgICAgICAgICAgICAgcHJpbnQoIkNvbmZ1c2VkIHdoaWxlIHBhcnNpbmcgVlVJRHMgaW4gbGF5ZXIgc291cmNlIGNvZGUgLSBjYW5ub3QgcHJvY2VlZC4gKEZJWE1FKSIpCisgICAgICAgICAgICAgICAgZXhpdCgtMSkKKyAgICAgICAgc2VsZi5hbGxfdnVpZHMgPSBzZWxmLmV4cGxpY2l0X3Z1aWRzIHwgc2VsZi5pbXBsaWNpdF92dWlkcyB8IHNlbGYudW5hc3NpZ25lZF92dWlkcworCisjIENsYXNzIHRvIHBhcnNlIHRoZSB2YWxpZGF0aW9uIGxheWVyIHRlc3Qgc291cmNlIGFuZCBzdG9yZSB0ZXN0bmFtZXMKK2NsYXNzIFZhbGlkYXRpb25UZXN0czoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9maWxlX2xpc3QsIHRlc3RfZ3JvdXBfbmFtZT1bJ1ZrTGF5ZXJUZXN0JywgJ1ZrUG9zaXRpdmVMYXllclRlc3QnLCAnVmtXc2lFbmFibGVkTGF5ZXJUZXN0J10pOgorICAgICAgICBzZWxmLnRlc3RfZmlsZXMgPSB0ZXN0X2ZpbGVfbGlzdAorICAgICAgICBzZWxmLnRlc3RfdHJpZ2dlcl90eHRfbGlzdCA9IFtdCisgICAgICAgIGZvciB0ZyBpbiB0ZXN0X2dyb3VwX25hbWU6CisgICAgICAgICAgICBzZWxmLnRlc3RfdHJpZ2dlcl90eHRfbGlzdC5hcHBlbmQoJ1RFU1RfRiglcycgJSB0ZykKKyAgICAgICAgc2VsZi5leHBsaWNpdF92dWlkcyA9IHNldCgpCisgICAgICAgIHNlbGYuaW1wbGljaXRfdnVpZHMgPSBzZXQoKQorICAgICAgICBzZWxmLnVuYXNzaWduZWRfdnVpZHMgPSBzZXQoKQorICAgICAgICBzZWxmLmFsbF92dWlkcyA9IHNldCgpCisgICAgICAgICNzZWxmLnRlc3RfdG9fdnVpZHMgPSB7fSAjIE1hcCB0ZXN0IG5hbWUgdG8gVlVJRHMgdGVzdGVkCisgICAgICAgIHNlbGYudnVpZF90b190ZXN0cyA9IGRlZmF1bHRkaWN0KHNldCkgIyBNYXAgVlVJRHMgdG8gc2V0IG9mIHRlc3QgbmFtZXMgd2hlcmUgaW1wbGVtZW50ZWQKKworICAgICMgUGFyc2UgdGVzdCBmaWxlcyBpbnRvIGludGVybmFsIGRhdGEgc3RydWN0CisgICAgZGVmIHBhcnNlKHNlbGYpOgorICAgICAgICAjIEZvciBlYWNoIHRlc3QgZmlsZSwgcGFyc2UgdGVzdCBuYW1lcyBpbnRvIHNldAorICAgICAgICBncmFiX25leHRfbGluZSA9IEZhbHNlICMgaGFuZGxlIHRlc3RuYW1lIG9uIHNlcGFyYXRlIGxpbmUgdGhhbiB3aWxkY2FyZAorICAgICAgICB0ZXN0bmFtZSA9ICcnCisgICAgICAgIHByZXBlbmQgPSBOb25lCisgICAgICAgIGZvciB0ZXN0X2ZpbGUgaW4gc2VsZi50ZXN0X2ZpbGVzOgorICAgICAgICAgICAgd2l0aCBvcGVuKHRlc3RfZmlsZSkgYXMgdGY6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gdGY6CisgICAgICAgICAgICAgICAgICAgIGlmIFRydWUgaW4gW2xpbmUuc3RyaXAoKS5zdGFydHN3aXRoKGNvbW1lbnQpIGZvciBjb21tZW50IGluIFsnLy8nLCAnLyonXV06CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgICMgaWYgbGluZSBlbmRzIGluIGEgYnJva2VuIFZVSUQgc3RyaW5nLCBmaXggdGhhdCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAgICAgICAgICAgICBpZiBwcmVwZW5kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByZXBlbmRbOi0yXSArIGxpbmUubHN0cmlwKCkubHN0cmlwKCciJykgIyBqb2luIGxpbmVzIHNraXBwaW5nIENSLCB3aGl0ZXNwYWNlIGFuZCB0cmFpbGluZy9sZWFkaW5nIHF1b3RlIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGlmIGFueShwcmVmaXggaW4gbGluZSBmb3IgcHJlZml4IGluIHZ1aWRfcHJlZml4ZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9saXN0ID0gbGluZS5zcGxpdCgpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQSBWVUlEIHN0cmluZyB0aGF0IGhhcyBiZWVuIGJyb2tlbiBieSBjbGFuZyB3aWxsIHN0YXJ0IHdpdGggYSB2dWlkIHByZWZpeCBhbmQgZW5kIHdpdGggLSwgYW5kIHdpbGwgYmUgbGFzdCBpbiB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuX3Z1aWQgPSBsaW5lX2xpc3RbLTFdLnN0cmlwKCciJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFueShicm9rZW5fdnVpZC5zdGFydHN3aXRoKHByZWZpeCkgZm9yIHByZWZpeCBpbiB2dWlkX3ByZWZpeGVzKSBhbmQgYnJva2VuX3Z1aWQuZW5kc3dpdGgoJy0nKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kID0gbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgYW55KHR0dCBpbiBsaW5lIGZvciB0dHQgaW4gc2VsZi50ZXN0X3RyaWdnZXJfdHh0X2xpc3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdG5hbWUgPSBsaW5lLnNwbGl0KCcsJylbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0bmFtZSA9IHRlc3RuYW1lLnN0cmlwKCkuc3RyaXAoJyB7KScpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJycgPT0gdGVzdG5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWJfbmV4dF9saW5lID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZi50ZXN0X3RvX3Z1aWRzW3Rlc3RuYW1lXSA9IFtdCisgICAgICAgICAgICAgICAgICAgIGlmIGdyYWJfbmV4dF9saW5lOiAjIHRlc3QgbmFtZSBvbiBpdHMgb3duIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWJfbmV4dF9saW5lID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RuYW1lID0gdGVzdG5hbWUuc3RyaXAoKS5zdHJpcCgnIHspJykKKyAgICAgICAgICAgICAgICAgICAgICAgICNzZWxmLnRlc3RfdG9fdnVpZHNbdGVzdG5hbWVdID0gW10KKyAgICAgICAgICAgICAgICAgICAgaWYgYW55KHByZWZpeCBpbiBsaW5lIGZvciBwcmVmaXggaW4gdnVpZF9wcmVmaXhlcyk6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2xpc3QgPSByZS5zcGxpdCgnW1xze31bXF0oKSJdKycsbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzdWJfc3RyIGluIGxpbmVfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhbnkocHJlZml4IGluIHN1Yl9zdHIgZm9yIHByZWZpeCBpbiB2dWlkX3ByZWZpeGVzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnVpZF9zdHIgPSBzdWJfc3RyLnN0cmlwKCcsKTs6IicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnVpZF90b190ZXN0c1t2dWlkX3N0cl0uYWRkKHRlc3RuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZi50ZXN0X3RvX3Z1aWRzW3Rlc3RuYW1lXS5hcHBlbmQodnVpZF9zdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2dWlkX3N0ci5zdGFydHN3aXRoKCdWVUlELScpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2dWlkX3N0clstNTotMV0uaXNkZWNpbWFsKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwbGljaXRfdnVpZHMuYWRkKHZ1aWRfc3RyKSAgICAjIGV4cGxpY2l0IGVuZCBpbiA1IG51bWVyaWMgY2hhcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbXBsaWNpdF92dWlkcy5hZGQodnVpZF9zdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgKHZ1aWRfc3RyLnN0YXJ0c3dpdGgoJ1VOQVNTSUdORUQtJykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51bmFzc2lnbmVkX3Z1aWRzLmFkZCh2dWlkX3N0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJVbmFibGUgdG8gY2F0ZWdvcml6ZSBWVUlEOiAlcyIgJSB2dWlkX3N0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJDb25mdXNlZCB3aGlsZSBwYXJzaW5nIFZVSURzIGluIHRlc3QgY29kZSAtIGNhbm5vdCBwcm9jZWVkLiAoRklYTUUpIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoLTEpCisgICAgICAgIHNlbGYuYWxsX3Z1aWRzID0gc2VsZi5leHBsaWNpdF92dWlkcyB8IHNlbGYuaW1wbGljaXRfdnVpZHMgfCBzZWxmLnVuYXNzaWduZWRfdnVpZHMKKworIyBDbGFzcyB0byBkbyBjb25zaXN0ZW5jeSBjaGVja2luZworIworY2xhc3MgQ29uc2lzdGVuY3k6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFsbF9qc29uLCBhbGxfY2hlY2tzLCBhbGxfdGVzdHMpOgorICAgICAgICBzZWxmLnZhbGlkID0gYWxsX2pzb24KKyAgICAgICAgc2VsZi5jaGVja3MgPSBhbGxfY2hlY2tzCisgICAgICAgIHNlbGYudGVzdHMgPSBhbGxfdGVzdHMKKworICAgICAgICBpZiAoZGVhbGlhc19raHIpOgorICAgICAgICAgICAgZGsgPSBzZXQoKQorICAgICAgICAgICAgZm9yIHZ1aWQgaW4gc2VsZi5jaGVja3M6CisgICAgICAgICAgICAgICAgaWYgdnVpZCBpbiBraHJfYWxpYXNlczoKKyAgICAgICAgICAgICAgICAgICAgZGsuYWRkKGtocl9hbGlhc2VzW3Z1aWRdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRrLmFkZCh2dWlkKQorICAgICAgICAgICAgc2VsZi5jaGVja3MgPSBkaworCisgICAgICAgICAgICBkayA9IHNldCgpCisgICAgICAgICAgICBmb3IgdnVpZCBpbiBzZWxmLnRlc3RzOgorICAgICAgICAgICAgICAgIGlmIHZ1aWQgaW4ga2hyX2FsaWFzZXM6CisgICAgICAgICAgICAgICAgICAgIGRrLmFkZChraHJfYWxpYXNlc1t2dWlkXSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkay5hZGQodnVpZCkKKyAgICAgICAgICAgIHNlbGYudGVzdHMgPSBkaworCisgICAgIyBSZXBvcnQgdW5kZWZpbmVkIFZVSURzIGluIHNvdXJjZSBjb2RlCisgICAgZGVmIHVuZGVmX3Z1aWRzX2luX2xheWVyX2NvZGUoc2VsZik6CisgICAgICAgIHVuZGVmX3NldCA9IHNlbGYuY2hlY2tzIC0gc2VsZi52YWxpZAorICAgICAgICB1bmRlZl9zZXQuZGlzY2FyZCgnVlVJRC1VbmRlZmluZWQnKSAjIGRvbid0IHJlcG9ydCBVbmRlZmluZWQKKyAgICAgICAgaWYgaWdub3JlX3VuYXNzaWduZWQ6CisgICAgICAgICAgICB1bmFzc2lnbmVkID0gc2V0KHt1diBmb3IgdXYgaW4gdW5kZWZfc2V0IGlmIHV2LnN0YXJ0c3dpdGgoJ1VOQVNTSUdORUQtJyl9KQorICAgICAgICAgICAgdW5kZWZfc2V0ID0gdW5kZWZfc2V0IC0gdW5hc3NpZ25lZAorICAgICAgICBpZiAobGVuKHVuZGVmX3NldCkgPiAwKToKKyAgICAgICAgICAgIHByaW50KCJcbkZvbGxvd2luZyBWVUlEcyBmb3VuZCBpbiBsYXllciBjb2RlIGFyZSBub3QgZGVmaW5lZCBpbiB2YWxpZHVzYWdlLmpzb24gKCVkKToiICUgbGVuKHVuZGVmX3NldCkpCisgICAgICAgICAgICB1bmRlZiA9IGxpc3QodW5kZWZfc2V0KQorICAgICAgICAgICAgdW5kZWYuc29ydCgpCisgICAgICAgICAgICBmb3IgdnVpZCBpbiB1bmRlZjoKKyAgICAgICAgICAgICAgICBwcmludCgiICAgICVzIiAlIHZ1aWQpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgICMgUmVwb3J0IHVuZGVmaW5lZCBWVUlEcyBpbiB0ZXN0cworICAgIGRlZiB1bmRlZl92dWlkc19pbl90ZXN0cyhzZWxmKToKKyAgICAgICAgdW5kZWZfc2V0ID0gc2VsZi50ZXN0cyAtIHNlbGYudmFsaWQKKyAgICAgICAgdW5kZWZfc2V0LmRpc2NhcmQoJ1ZVSUQtVW5kZWZpbmVkJykgIyBkb24ndCByZXBvcnQgVW5kZWZpbmVkCisgICAgICAgIGlmIGlnbm9yZV91bmFzc2lnbmVkOgorICAgICAgICAgICAgdW5hc3NpZ25lZCA9IHNldCh7dXYgZm9yIHV2IGluIHVuZGVmX3NldCBpZiB1di5zdGFydHN3aXRoKCdVTkFTU0lHTkVELScpfSkKKyAgICAgICAgICAgIHVuZGVmX3NldCA9IHVuZGVmX3NldCAtIHVuYXNzaWduZWQKKyAgICAgICAgaWYgKGxlbih1bmRlZl9zZXQpID4gMCk6CisgICAgICAgICAgICBvayA9IEZhbHNlCisgICAgICAgICAgICBwcmludCgiXG5Gb2xsb3dpbmcgVlVJRHMgZm91bmQgaW4gbGF5ZXIgdGVzdHMgYXJlIG5vdCBkZWZpbmVkIGluIHZhbGlkdXNhZ2UuanNvbiAoJWQpOiIgJSBsZW4odW5kZWZfc2V0KSkKKyAgICAgICAgICAgIHVuZGVmID0gbGlzdCh1bmRlZl9zZXQpCisgICAgICAgICAgICB1bmRlZi5zb3J0KCkKKyAgICAgICAgICAgIGZvciB2dWlkIGluIHVuZGVmOgorICAgICAgICAgICAgICAgIHByaW50KCIgICAgJXMiICUgdnVpZCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyBSZXBvcnQgdnVpZHMgaW4gdGVzdHMgdGhhdCBhcmUgbm90IGluIHNvdXJjZQorICAgIGRlZiB2dWlkc190ZXN0ZWRfbm90X2NoZWNrZWQoc2VsZik6CisgICAgICAgIHVuZGVmX3NldCA9IHNlbGYudGVzdHMgLSBzZWxmLmNoZWNrcworICAgICAgICB1bmRlZl9zZXQuZGlzY2FyZCgnVlVJRC1VbmRlZmluZWQnKSAjIGRvbid0IHJlcG9ydCBVbmRlZmluZWQKKyAgICAgICAgaWYgaWdub3JlX3VuYXNzaWduZWQ6CisgICAgICAgICAgICB1bmFzc2lnbmVkID0gc2V0KCkKKyAgICAgICAgICAgIGZvciB2dWlkIGluIHVuZGVmX3NldDoKKyAgICAgICAgICAgICAgICBpZiB2dWlkLnN0YXJ0c3dpdGgoJ1VOQVNTSUdORUQtJyk6CisgICAgICAgICAgICAgICAgICAgIHVuYXNzaWduZWQuYWRkKHZ1aWQpCisgICAgICAgICAgICB1bmRlZl9zZXQgPSB1bmRlZl9zZXQgLSB1bmFzc2lnbmVkCisgICAgICAgIGlmIChsZW4odW5kZWZfc2V0KSA+IDApOgorICAgICAgICAgICAgb2sgPSBGYWxzZQorICAgICAgICAgICAgcHJpbnQoIlxuRm9sbG93aW5nIFZVSURzIGZvdW5kIGluIHRlc3RzIGJ1dCBhcmUgbm90IGNoZWNrZWQgaW4gbGF5ZXIgY29kZSAoJWQpOiIgJSBsZW4odW5kZWZfc2V0KSkKKyAgICAgICAgICAgIHVuZGVmID0gbGlzdCh1bmRlZl9zZXQpCisgICAgICAgICAgICB1bmRlZi5zb3J0KCkKKyAgICAgICAgICAgIGZvciB2dWlkIGluIHVuZGVmOgorICAgICAgICAgICAgICAgIHByaW50KCIgICAgJXMiICUgdnVpZCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyBUT0RPOiBFeHBsaWNpdCBjaGVja2VkIFZVSURzIHdoaWNoIGhhdmUgbm8gdGVzdAorICAgICMgZGVmIGV4cGxpY2l0X3Z1aWRzX2NoZWNrZWRfbm90X3Rlc3RlZChzZWxmKToKKworCisjIENsYXNzIHRvIG91dHB1dCBkYXRhYmFzZSBpbiB2YXJpb3VzIGZsYXZvcnMKKyMKK2NsYXNzIE91dHB1dERhdGFiYXNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWxfanNvbiwgdmFsX3NvdXJjZSwgdmFsX3Rlc3RzKToKKyAgICAgICAgc2VsZi52aiA9IHZhbF9qc29uCisgICAgICAgIHNlbGYudnMgPSB2YWxfc291cmNlCisgICAgICAgIHNlbGYudnQgPSB2YWxfdGVzdHMKKyAgICAgICAgc2VsZi5oZWFkZXJfdmVyc2lvbiA9ICIvKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQgKHNjcmlwdHMvdmtfdmFsaWRhdGlvbl9zdGF0cy5weSkgKi8iCisgICAgICAgIHNlbGYuaGVhZGVyX3ZlcnNpb24gKz0gIlxuLyogVnVsa2FuIHNwZWNpZmljYXRpb24gdmVyc2lvbjogJXMgKi8iICUgdmFsX2pzb24uYXBpdmVyc2lvbgorICAgICAgICBzZWxmLmhlYWRlcl9wcmVhbWJsZSA9ICIiIgorLyoKKyAqIFZ1bGthbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE5IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCisvLyBEaXNhYmxlIGF1dG8tZm9ybWF0dGluZyBmb3IgZ2VuZXJhdGVkIGZpbGUKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gTWFwcGluZyBmcm9tIFZVSUQgc3RyaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNwZWMgdGV4dAordHlwZWRlZiBzdHJ1Y3QgX3Z1aWRfc3BlY190ZXh0X3BhaXIgeworICAgIGNvbnN0IGNoYXIgKiB2dWlkOworICAgIGNvbnN0IGNoYXIgKiBzcGVjX3RleHQ7Cit9IHZ1aWRfc3BlY190ZXh0X3BhaXI7CisKK3N0YXRpYyBjb25zdCB2dWlkX3NwZWNfdGV4dF9wYWlyIHZ1aWRfc3BlY190ZXh0W10gPSB7CisiIiIKKyAgICAgICAgc2VsZi5oZWFkZXJfcG9zdGFtYmxlID0gIiIifTsKKyIiIgorICAgICAgICBzZWxmLnNwZWNfdXJsID0gImh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3Z1bGthbi9zcGVjcy8xLjEtZXh0ZW5zaW9ucy9odG1sL3Zrc3BlYy5odG1sIgorCisgICAgZGVmIGR1bXBfdHh0KHNlbGYsIG9ubHlfdW5pbXBsZW1lbnRlZCA9IEZhbHNlKToKKyAgICAgICAgcHJpbnQoIlxuIER1bXBpbmcgZGF0YWJhc2UgdG8gdGV4dCBmaWxlOiAlcyIgJSB0eHRfZmlsZW5hbWUpCisgICAgICAgIHdpdGggb3BlbiAodHh0X2ZpbGVuYW1lLCAndycpIGFzIHR4dDoKKyAgICAgICAgICAgIHR4dC53cml0ZSgiIyMgVlVJRCBEYXRhYmFzZVxuIikKKyAgICAgICAgICAgIHR4dC53cml0ZSgiIyMgRm9ybWF0OiBWVUlEX05BTUUgfCBDSEVDS0VEIHwgVEVTVCB8IFRZUEUgfCBBUEkvU1RSVUNUIHwgRVhURU5TSU9OIHwgVlVJRF9URVhUXG4jI1xuIikKKyAgICAgICAgICAgIHZ1aWRfbGlzdCA9IGxpc3Qoc2VsZi52ai5hbGxfdnVpZHMpCisgICAgICAgICAgICB2dWlkX2xpc3Quc29ydCgpCisgICAgICAgICAgICBmb3IgdnVpZCBpbiB2dWlkX2xpc3Q6CisgICAgICAgICAgICAgICAgZGJfbGlzdCA9IHNlbGYudmoudnVpZF9kYlt2dWlkXQorICAgICAgICAgICAgICAgIGRiX2xpc3Quc29ydChrZXk9b3BlcmF0b3IuaXRlbWdldHRlcignZXh0JykpICMgc29ydCBsaXN0IHRvIGVhc2UgZGlmZnMgb2Ygb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICBmb3IgZGJfZW50cnkgaW4gZGJfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9ICdOJworICAgICAgICAgICAgICAgICAgICBpZiB2dWlkIGluIHNlbGYudnMuYWxsX3Z1aWRzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb25seV91bmltcGxlbWVudGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgPSAnWScKKyAgICAgICAgICAgICAgICAgICAgdGVzdCA9ICdOb25lJworICAgICAgICAgICAgICAgICAgICBpZiB2dWlkIGluIHNlbGYudnQudnVpZF90b190ZXN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbGlzdCA9IGxpc3Qoc2VsZi52dC52dWlkX3RvX3Rlc3RzW3Z1aWRdKQorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9saXN0LnNvcnQoKSAgICMgc29ydCB0ZXN0cywgZm9yIGRpZmYtYWJpbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gJywgJworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IHNlcC5qb2luKHRlc3RfbGlzdCkKKworICAgICAgICAgICAgICAgICAgICB0eHQud3JpdGUoIiVzIHwgJXMgfCAlcyB8ICVzIHwgJXMgfCAlcyB8ICVzXG4iICUgKHZ1aWQsIGNoZWNrZWQsIHRlc3QsIGRiX2VudHJ5Wyd0eXBlJ10sIGRiX2VudHJ5WydhcGknXSwgZGJfZW50cnlbJ2V4dCddLCBkYl9lbnRyeVsndGV4dCddKSkKKworICAgIGRlZiBkdW1wX2NzdihzZWxmLCBvbmx5X3VuaW1wbGVtZW50ZWQgPSBGYWxzZSk6CisgICAgICAgIHByaW50KCJcbiBEdW1waW5nIGRhdGFiYXNlIHRvIGNzdiBmaWxlOiAlcyIgJSBjc3ZfZmlsZW5hbWUpCisgICAgICAgIHdpdGggb3BlbiAoY3N2X2ZpbGVuYW1lLCAndycsIG5ld2xpbmU9JycpIGFzIGNzdmZpbGU6CisgICAgICAgICAgICBjdyA9IGNzdi53cml0ZXIoY3N2ZmlsZSkKKyAgICAgICAgICAgIGN3LndyaXRlcm93KFsnVlVJRF9OQU1FJywnQ0hFQ0tFRCcsJ1RFU1QnLCdUWVBFJywnQVBJL1NUUlVDVCcsJ0VYVEVOU0lPTicsJ1ZVSURfVEVYVCddKQorICAgICAgICAgICAgdnVpZF9saXN0ID0gbGlzdChzZWxmLnZqLmFsbF92dWlkcykKKyAgICAgICAgICAgIHZ1aWRfbGlzdC5zb3J0KCkKKyAgICAgICAgICAgIGZvciB2dWlkIGluIHZ1aWRfbGlzdDoKKyAgICAgICAgICAgICAgICBmb3IgZGJfZW50cnkgaW4gc2VsZi52ai52dWlkX2RiW3Z1aWRdOgorICAgICAgICAgICAgICAgICAgICByb3cgPSBbdnVpZF0KKyAgICAgICAgICAgICAgICAgICAgaWYgdnVpZCBpbiBzZWxmLnZzLmFsbF92dWlkczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9ubHlfdW5pbXBsZW1lbnRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuYXBwZW5kKCdZJykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5hcHBlbmQoJ04nKQorICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gJ05vbmUnCisgICAgICAgICAgICAgICAgICAgIGlmIHZ1aWQgaW4gc2VsZi52dC52dWlkX3RvX3Rlc3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gJywgJworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IHNlcC5qb2luKHNlbGYudnQudnVpZF90b190ZXN0c1t2dWlkXSkKKyAgICAgICAgICAgICAgICAgICAgcm93LmFwcGVuZCh0ZXN0KQorICAgICAgICAgICAgICAgICAgICByb3cuYXBwZW5kKGRiX2VudHJ5Wyd0eXBlJ10pCisgICAgICAgICAgICAgICAgICAgIHJvdy5hcHBlbmQoZGJfZW50cnlbJ2FwaSddKQorICAgICAgICAgICAgICAgICAgICByb3cuYXBwZW5kKGRiX2VudHJ5WydleHQnXSkKKyAgICAgICAgICAgICAgICAgICAgcm93LmFwcGVuZChkYl9lbnRyeVsndGV4dCddKQorICAgICAgICAgICAgICAgICAgICBjdy53cml0ZXJvdyhyb3cpCisKKyAgICBkZWYgZHVtcF9odG1sKHNlbGYsIG9ubHlfdW5pbXBsZW1lbnRlZCA9IEZhbHNlKToKKyAgICAgICAgcHJpbnQoIlxuIER1bXBpbmcgZGF0YWJhc2UgdG8gaHRtbCBmaWxlOiAlcyIgJSBodG1sX2ZpbGVuYW1lKQorICAgICAgICBwcmVhbWJsZSA9ICc8IURPQ1RZUEUgaHRtbD5cbjxodG1sPlxuPGhlYWQ+XG48c3R5bGU+XG50YWJsZSwgdGgsIHRkIHtcbiBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBcbn1cbjwvc3R5bGU+XG48Ym9keT5cbjxoMj5WYWxpZCBVc2FnZSBEYXRhYmFzZTwvaDI+XG48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCI+XG48dGFibGUgc3R5bGU9IndpZHRoOjEwMCUiPlxuJworICAgICAgICBoZWFkZXJzID0gJzx0cj48dGg+VlVJRCBOQU1FPC90aD48dGg+Q0hFQ0tFRDwvdGg+PHRoPlRFU1Q8L3RoPjx0aD5UWVBFPC90aD48dGg+QVBJL1NUUlVDVDwvdGg+PHRoPkVYVEVOU0lPTjwvdGg+PHRoPlZVSUQgVEVYVDwvdGg+PC90cj5cbicKKyAgICAgICAgd2l0aCBvcGVuIChodG1sX2ZpbGVuYW1lLCAndycpIGFzIGhmaWxlOgorICAgICAgICAgICAgaGZpbGUud3JpdGUocHJlYW1ibGUpCisgICAgICAgICAgICBoZmlsZS53cml0ZShoZWFkZXJzKQorICAgICAgICAgICAgdnVpZF9saXN0ID0gbGlzdChzZWxmLnZqLmFsbF92dWlkcykKKyAgICAgICAgICAgIHZ1aWRfbGlzdC5zb3J0KCkKKyAgICAgICAgICAgIGZvciB2dWlkIGluIHZ1aWRfbGlzdDoKKyAgICAgICAgICAgICAgICBmb3IgZGJfZW50cnkgaW4gc2VsZi52ai52dWlkX2RiW3Z1aWRdOgorICAgICAgICAgICAgICAgICAgICBjaGVja2VkID0gJzxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5OPC9zcGFuPicKKyAgICAgICAgICAgICAgICAgICAgaWYgdnVpZCBpbiBzZWxmLnZzLmFsbF92dWlkczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9ubHlfdW5pbXBsZW1lbnRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkID0gJzxzcGFuIHN0eWxlPSJjb2xvcjpsaW1lZ3JlZW47Ij5ZPC9zcGFuPicKKyAgICAgICAgICAgICAgICAgICAgaGZpbGUud3JpdGUoJzx0cj48dGg+JXM8L3RoPicgJSB2dWlkKQorICAgICAgICAgICAgICAgICAgICBoZmlsZS53cml0ZSgnPHRoPiVzPC90aD4nICUgY2hlY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgdGVzdCA9ICdOb25lJworICAgICAgICAgICAgICAgICAgICBpZiB2dWlkIGluIHNlbGYudnQudnVpZF90b190ZXN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICcsICcKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgPSBzZXAuam9pbihzZWxmLnZ0LnZ1aWRfdG9fdGVzdHNbdnVpZF0pCisgICAgICAgICAgICAgICAgICAgIGhmaWxlLndyaXRlKCc8dGg+JXM8L3RoPicgJSB0ZXN0KQorICAgICAgICAgICAgICAgICAgICBoZmlsZS53cml0ZSgnPHRoPiVzPC90aD4nICUgZGJfZW50cnlbJ3R5cGUnXSkKKyAgICAgICAgICAgICAgICAgICAgaGZpbGUud3JpdGUoJzx0aD4lczwvdGg+JyAlIGRiX2VudHJ5WydhcGknXSkKKyAgICAgICAgICAgICAgICAgICAgaGZpbGUud3JpdGUoJzx0aD4lczwvdGg+JyAlIGRiX2VudHJ5WydleHQnXSkKKyAgICAgICAgICAgICAgICAgICAgaGZpbGUud3JpdGUoJzx0aD4lczwvdGg+PC90cj5cbicgJSBkYl9lbnRyeVsndGV4dCddKQorICAgICAgICAgICAgaGZpbGUud3JpdGUoJzwvdGFibGU+XG48L2JvZHk+XG48L2h0bWw+XG4nKQorCisgICAgZGVmIGV4cG9ydF9oZWFkZXIoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2VfbW9kZToKKyAgICAgICAgICAgIHByaW50KCJcbiBFeHBvcnRpbmcgaGVhZGVyIGZpbGUgdG86ICVzIiAlIGhlYWRlcl9maWxlbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuIChoZWFkZXJfZmlsZW5hbWUsICd3JykgYXMgaGZpbGU6CisgICAgICAgICAgICBoZmlsZS53cml0ZShzZWxmLmhlYWRlcl92ZXJzaW9uKQorICAgICAgICAgICAgaGZpbGUud3JpdGUoc2VsZi5oZWFkZXJfcHJlYW1ibGUpCisgICAgICAgICAgICB2dWlkX2xpc3QgPSBsaXN0KHNlbGYudmouYWxsX3Z1aWRzKQorICAgICAgICAgICAgdnVpZF9saXN0LnNvcnQoKQorICAgICAgICAgICAgY21kX2RpY3QgPSB7fQorICAgICAgICAgICAgZm9yIHZ1aWQgaW4gdnVpZF9saXN0OgorICAgICAgICAgICAgICAgIGRiX2VudHJ5ID0gc2VsZi52ai52dWlkX2RiW3Z1aWRdWzBdCisgICAgICAgICAgICAgICAgZGJfdGV4dCA9IGRiX2VudHJ5Wyd0ZXh0J10uc3RyaXAoJyAnKQorICAgICAgICAgICAgICAgIGhmaWxlLndyaXRlKCcgICAgeyIlcyIsICIlcyAoJXMjJXMpIn0sXG4nICUgKHZ1aWQsIGRiX3RleHQsIHNlbGYuc3BlY191cmwsIHZ1aWQpKQorICAgICAgICAgICAgICAgICMgRm9yIG11bHRpcGx5LWRlZmluZWQgVlVJRHMsIGluY2x1ZGUgdmVyc2lvbnMgd2l0aCBleHRlbnNpb24gYXBwZW5kZWQKKyAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi52ai52dWlkX2RiW3Z1aWRdKSA+IDE6CisgICAgICAgICAgICAgICAgICAgIGZvciBkYl9lbnRyeSBpbiBzZWxmLnZqLnZ1aWRfZGJbdnVpZF06CisgICAgICAgICAgICAgICAgICAgICAgICBoZmlsZS53cml0ZSgnICAgIHsiJXNbJXNdIiwgIiVzICglcyMlcykifSxcbicgJSAodnVpZCwgZGJfZW50cnlbJ2V4dCddLnN0cmlwKCcgJyksIGRiX3RleHQsIHNlbGYuc3BlY191cmwsIHZ1aWQpKQorICAgICAgICAgICAgICAgIGlmICdjb21tYW5kQnVmZmVyIG11c3QgYmUgaW4gdGhlIHJlY29yZGluZyBzdGF0ZScgaW4gZGJfdGV4dDoKKyAgICAgICAgICAgICAgICAgICAgY21kX2RpY3RbdnVpZF0gPSBkYl90ZXh0IAorICAgICAgICAgICAgaGZpbGUud3JpdGUoc2VsZi5oZWFkZXJfcG9zdGFtYmxlKQorCisgICAgICAgICAgICAjIEdlbmVyYXRlIHRoZSBpbmZvcm1hdGlvbiBmb3IgdmFsaWRhdGluZyByZWNvcmRpbmcgc3RhdGUgVlVJRCdzIAorICAgICAgICAgICAgY21kX3ByZWZpeCA9ICdwcmVmaXgjIycKKyAgICAgICAgICAgIGNtZF9yZWdleCA9IHJlLmNvbXBpbGUocidWVUlELXZrKENtZHxFbmQpKFx3KyknKQorICAgICAgICAgICAgY21kX3Z1aWRfdmVjdG9yID0gWycgICAgIlZVSURfVW5kZWZpbmVkIiddCisgICAgICAgICAgICBjbWRfbmFtZV92ZWN0b3IgPSBbICcgICAgIkNvbW1hbmRfVW5kZWZpbmVkIicgXQorICAgICAgICAgICAgY21kX2VudW0gPSBbJyAgICAnICsgY21kX3ByZWZpeCArICdOT05FID0gMCddCisKKyAgICAgICAgICAgIGNtZF9vcmRpbmFsID0gMQorICAgICAgICAgICAgZm9yIHZ1aWQsIGRiX3RleHQgaW4gc29ydGVkKGNtZF9kaWN0Lml0ZW1zKCkpOgorICAgICAgICAgICAgICAgIGNtZF9tYXRjaCA9IGNtZF9yZWdleC5tYXRjaCh2dWlkKQorICAgICAgICAgICAgICAgIGlmIGNtZF9tYXRjaC5ncm91cCgxKSA9PSAiRW5kIjoKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gIkVORCIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlbmQgPSAiIgorICAgICAgICAgICAgICAgIGNtZF9uYW1lX3ZlY3Rvci5hcHBlbmQoJyAgICAidmsnKyBjbWRfbWF0Y2guZ3JvdXAoMSkgKyBjbWRfbWF0Y2guZ3JvdXAoMikgKyAnIicpCisgICAgICAgICAgICAgICAgY21kX25hbWUgPSBjbWRfcHJlZml4ICsgZW5kICsgY21kX21hdGNoLmdyb3VwKDIpLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBjbWRfZW51bS5hcHBlbmQoJyAgICB7fSA9IHt9Jy5mb3JtYXQoY21kX25hbWUsIGNtZF9vcmRpbmFsKSkKKyAgICAgICAgICAgICAgICBjbWRfb3JkaW5hbCArPSAxCisgICAgICAgICAgICAgICAgY21kX3Z1aWRfdmVjdG9yLmFwcGVuZCgnICAgICJ7fSInLmZvcm1hdCh2dWlkKSkKKworICAgICAgICAgICAgaGZpbGUud3JpdGUoJ1xuLy8gRGVmaW5lcyB0byBhbGxvdyBjcmVhdGluZyAibXVzdCBiZSByZWNvcmRpbmciIG1ldGEgZGF0YVxuJykKKyAgICAgICAgICAgIGNtZF9lbnVtLmFwcGVuZCgnICAgIHt9UkFOR0VfU0laRSA9IHt9Jy5mb3JtYXQoY21kX3ByZWZpeCwgY21kX29yZGluYWwpKQorICAgICAgICAgICAgY21kX2VudW1fc3RyaW5nID0gJyNkZWZpbmUgVlVJRF9DTURfRU5VTV9MSVNUKHByZWZpeClcXFxuJyArICcsXFxcbicuam9pbihjbWRfZW51bSkgKyAnXG5cbicKKyAgICAgICAgICAgIGhmaWxlLndyaXRlKGNtZF9lbnVtX3N0cmluZykKKyAgICAgICAgICAgIGNtZF9uYW1lX2xpc3Rfc3RyaW5nID0gJyNkZWZpbmUgVlVJRF9DTURfTkFNRV9MSVNUXFxcbicgKyAnLFxcXG4nLmpvaW4oY21kX25hbWVfdmVjdG9yKSArICdcblxuJworICAgICAgICAgICAgaGZpbGUud3JpdGUoY21kX25hbWVfbGlzdF9zdHJpbmcpCisgICAgICAgICAgICB2dWlkX3ZlY3Rvcl9zdHJpbmcgPSAnI2RlZmluZSBWVUlEX01VU1RfQkVfUkVDT1JESU5HX0xJU1RcXFxuJyArICcsXFxcbicuam9pbihjbWRfdnVpZF92ZWN0b3IpICsgJ1xuJworICAgICAgICAgICAgaGZpbGUud3JpdGUodnVpZF92ZWN0b3Jfc3RyaW5nKQorCitkZWYgbWFpbihhcmd2KToKKyAgICBnbG9iYWwgdmVyYm9zZV9tb2RlCisgICAgZ2xvYmFsIHR4dF9maWxlbmFtZQorICAgIGdsb2JhbCBjc3ZfZmlsZW5hbWUKKyAgICBnbG9iYWwgaHRtbF9maWxlbmFtZQorCisgICAgcnVuX2NvbnNpc3RlbmN5ID0gRmFsc2UKKyAgICByZXBvcnRfdW5pbXBsZW1lbnRlZCA9IEZhbHNlCisgICAgZ2V0X3Z1aWRfc3RhdHVzID0gJycKKyAgICB0eHRfb3V0ID0gRmFsc2UKKyAgICBjc3Zfb3V0ID0gRmFsc2UKKyAgICBodG1sX291dCA9IEZhbHNlCisgICAgaGVhZGVyX291dCA9IEZhbHNlCisgICAgc2hvd19zdW1tYXJ5ID0gRmFsc2UKKworICAgIGlmICgxID4gbGVuKGFyZ3YpKToKKyAgICAgICAgcHJpbnRIZWxwKCkKKyAgICAgICAgc3lzLmV4aXQoKQorCisgICAgIyBQYXJzZSBzY3JpcHQgYXJncworICAgIGpzb25fZmlsZW5hbWUgPSBhcmd2WzBdCisgICAgaSA9IDEKKyAgICB3aGlsZSAoaSA8IGxlbihhcmd2KSk6CisgICAgICAgIGFyZyA9IGFyZ3ZbaV0KKyAgICAgICAgaSA9IGkgKyAxCisgICAgICAgIGlmIChhcmcgPT0gJy1jJyk6CisgICAgICAgICAgICBydW5fY29uc2lzdGVuY3kgPSBUcnVlCisgICAgICAgIGVsaWYgKGFyZyA9PSAnLXZ1aWQnKToKKyAgICAgICAgICAgIGdldF92dWlkX3N0YXR1cyA9IGFyZ3ZbaV0KKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBlbGlmIChhcmcgPT0gJy10b2RvJyk6CisgICAgICAgICAgICByZXBvcnRfdW5pbXBsZW1lbnRlZCA9IFRydWUKKyAgICAgICAgZWxpZiAoYXJnID09ICctdGV4dCcpOgorICAgICAgICAgICAgdHh0X291dCA9IFRydWUKKyAgICAgICAgICAgICMgU2V0IGZpbGVuYW1lIGlmIHN1cHBsaWVkLCBlbHNlIHVzZSBkZWZhdWx0CisgICAgICAgICAgICBpZiBpIDwgbGVuKGFyZ3YpIGFuZCBub3QgYXJndltpXS5zdGFydHN3aXRoKCctJyk6CisgICAgICAgICAgICAgICAgdHh0X2ZpbGVuYW1lID0gYXJndltpXQorICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBlbGlmIChhcmcgPT0gJy1jc3YnKToKKyAgICAgICAgICAgIGNzdl9vdXQgPSBUcnVlCisgICAgICAgICAgICAjIFNldCBmaWxlbmFtZSBpZiBzdXBwbGllZCwgZWxzZSB1c2UgZGVmYXVsdAorICAgICAgICAgICAgaWYgaSA8IGxlbihhcmd2KSBhbmQgbm90IGFyZ3ZbaV0uc3RhcnRzd2l0aCgnLScpOgorICAgICAgICAgICAgICAgIGNzdl9maWxlbmFtZSA9IGFyZ3ZbaV0KKyAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgZWxpZiAoYXJnID09ICctaHRtbCcpOgorICAgICAgICAgICAgaHRtbF9vdXQgPSBUcnVlCisgICAgICAgICAgICAjIFNldCBmaWxlbmFtZSBpZiBzdXBwbGllZCwgZWxzZSB1c2UgZGVmYXVsdAorICAgICAgICAgICAgaWYgaSA8IGxlbihhcmd2KSBhbmQgbm90IGFyZ3ZbaV0uc3RhcnRzd2l0aCgnLScpOgorICAgICAgICAgICAgICAgIGh0bWxfZmlsZW5hbWUgPSBhcmd2W2ldCisgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgIGVsaWYgKGFyZyA9PSAnLWV4cG9ydF9oZWFkZXInKToKKyAgICAgICAgICAgIGhlYWRlcl9vdXQgPSBUcnVlCisgICAgICAgIGVsaWYgKGFyZyBpbiBbJy12ZXJib3NlJ10pOgorICAgICAgICAgICAgdmVyYm9zZV9tb2RlID0gVHJ1ZQorICAgICAgICBlbGlmIChhcmcgaW4gWyctc3VtbWFyeSddKToKKyAgICAgICAgICAgIHNob3dfc3VtbWFyeSA9IFRydWUKKyAgICAgICAgZWxpZiAoYXJnIGluIFsnLWhlbHAnLCAnLWgnXSk6CisgICAgICAgICAgICBwcmludEhlbHAoKQorICAgICAgICAgICAgc3lzLmV4aXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoIlVucmVjb2duaXplZCBhcmd1bWVudDogJXNcbiIgJSBhcmcpCisgICAgICAgICAgICBwcmludEhlbHAoKQorICAgICAgICAgICAgc3lzLmV4aXQoKQorCisgICAgcmVzdWx0ID0gMCAjIE5vbi16ZXJvIHJlc3VsdCBpbmRpY2F0ZXMgYW4gZXJyb3IgY2FzZQorCisgICAgIyBQYXJzZSB2YWxpZHVzYWdlIGpzb24KKyAgICB2YWxfanNvbiA9IFZhbGlkYXRpb25KU09OKGpzb25fZmlsZW5hbWUpCisgICAgdmFsX2pzb24ucmVhZCgpCisgICAgZXhwX2pzb24gPSBsZW4odmFsX2pzb24uZXhwbGljaXRfdnVpZHMpCisgICAgaW1wX2pzb24gPSBsZW4odmFsX2pzb24uaW1wbGljaXRfdnVpZHMpCisgICAgYWxsX2pzb24gPSBsZW4odmFsX2pzb24uYWxsX3Z1aWRzKQorICAgIGlmIHZlcmJvc2VfbW9kZToKKyAgICAgICAgcHJpbnQoIkZvdW5kICVkIHVuaXF1ZSBlcnJvciB2dWlkcyBpbiB2YWxpZHVzYWdlLmpzb24gZmlsZS4iICUgYWxsX2pzb24pCisgICAgICAgIHByaW50KCIgICVkIGV4cGxpY2l0IiAlIGV4cF9qc29uKQorICAgICAgICBwcmludCgiICAlZCBpbXBsaWNpdCIgJSBpbXBfanNvbikKKyAgICAgICAgaWYgbGVuKHZhbF9qc29uLmR1cGxpY2F0ZV92dWlkcykgPiAwOgorICAgICAgICAgICAgcHJpbnQoIiVkIFZVSURzIGFwcGVhciBpbiB2YWxpZHVzYWdlLmpzb24gbW9yZSB0aGFuIG9uY2UuIiAlIGxlbih2YWxfanNvbi5kdXBsaWNhdGVfdnVpZHMpKQorICAgICAgICAgICAgZm9yIHZ1aWQgaW4gdmFsX2pzb24uZHVwbGljYXRlX3Z1aWRzOgorICAgICAgICAgICAgICAgIHByaW50KCIgICVzIiAlIHZ1aWQpCisgICAgICAgICAgICAgICAgZm9yIGV4dCBpbiB2YWxfanNvbi52dWlkX2RiW3Z1aWRdOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiICAgIHdpdGggZXh0ZW5zaW9uOiAlcyIgJSBleHRbJ2V4dCddKQorCisgICAgIyBQYXJzZSBsYXllciBzb3VyY2UgZmlsZXMKKyAgICB2YWxfc291cmNlID0gVmFsaWRhdGlvblNvdXJjZShsYXllcl9zb3VyY2VfZmlsZXMpCisgICAgdmFsX3NvdXJjZS5wYXJzZSgpCisgICAgZXhwX2NoZWNrcyA9IGxlbih2YWxfc291cmNlLmV4cGxpY2l0X3Z1aWRzKQorICAgIGltcF9jaGVja3MgPSBsZW4odmFsX3NvdXJjZS5pbXBsaWNpdF92dWlkcykKKyAgICBhbGxfY2hlY2tzID0gbGVuKHZhbF9zb3VyY2UudnVpZF9jb3VudF9kaWN0LmtleXMoKSkKKyAgICBpZiB2ZXJib3NlX21vZGU6CisgICAgICAgIHByaW50KCJGb3VuZCAlZCB1bmlxdWUgdnVpZCBjaGVja3MgaW4gbGF5ZXIgc291cmNlIGNvZGUuIiAlIGFsbF9jaGVja3MpCisgICAgICAgIHByaW50KCIgICVkIGV4cGxpY2l0IiAlIGV4cF9jaGVja3MpCisgICAgICAgIHByaW50KCIgICVkIGltcGxpY2l0IiAlIGltcF9jaGVja3MpCisgICAgICAgIHByaW50KCIgICVkIHVuYXNzaWduZWQiICUgbGVuKHZhbF9zb3VyY2UudW5hc3NpZ25lZF92dWlkcykpCisgICAgICAgIHByaW50KCIgICVkIGNoZWNrcyBhcmUgaW1wbGVtZW50ZWQgbW9yZSB0aGF0IG9uY2UiICUgdmFsX3NvdXJjZS5kdXBsaWNhdGVkX2NoZWNrcykKKworICAgICMgUGFyc2UgdGVzdCBmaWxlcworICAgIHZhbF90ZXN0cyA9IFZhbGlkYXRpb25UZXN0cyh0ZXN0X3NvdXJjZV9maWxlcykKKyAgICB2YWxfdGVzdHMucGFyc2UoKQorICAgIGV4cF90ZXN0cyA9IGxlbih2YWxfdGVzdHMuZXhwbGljaXRfdnVpZHMpCisgICAgaW1wX3Rlc3RzID0gbGVuKHZhbF90ZXN0cy5pbXBsaWNpdF92dWlkcykKKyAgICBhbGxfdGVzdHMgPSBsZW4odmFsX3Rlc3RzLmFsbF92dWlkcykKKyAgICBpZiB2ZXJib3NlX21vZGU6CisgICAgICAgIHByaW50KCJGb3VuZCAlZCB1bmlxdWUgZXJyb3IgdnVpZHMgaW4gdGVzdCBzb3VyY2UgY29kZS4iICUgYWxsX3Rlc3RzKQorICAgICAgICBwcmludCgiICAlZCBleHBsaWNpdCIgJSBleHBfdGVzdHMpCisgICAgICAgIHByaW50KCIgICVkIGltcGxpY2l0IiAlIGltcF90ZXN0cykKKyAgICAgICAgcHJpbnQoIiAgJWQgdW5hc3NpZ25lZCIgJSBsZW4odmFsX3Rlc3RzLnVuYXNzaWduZWRfdnVpZHMpKQorCisgICAgIyBQcm9jZXNzIHN0YXRzCisgICAgaWYgc2hvd19zdW1tYXJ5OgorICAgICAgICBwcmludCgiXG5WYWxpZGF0aW9uIFN0YXRpc3RpY3MgKHVzaW5nIHZhbGlkdXNhZ2UuanNvbiB2ZXJzaW9uICVzKSIgJSB2YWxfanNvbi5hcGl2ZXJzaW9uKQorICAgICAgICBwcmludCgiICBWVUlEcyBkZWZpbmVkIGluIEpTT04gZmlsZTogICUwNGQgZXhwbGljaXQsICUwNGQgaW1wbGljaXQsICUwNGQgdG90YWwuIiAlIChleHBfanNvbiwgaW1wX2pzb24sIGFsbF9qc29uKSkKKyAgICAgICAgcHJpbnQoIiAgVlVJRHMgY2hlY2tlZCBpbiBsYXllciBjb2RlOiAlMDRkIGV4cGxpY2l0LCAlMDRkIGltcGxpY2l0LCAlMDRkIHRvdGFsLiIgJSAoZXhwX2NoZWNrcywgaW1wX2NoZWNrcywgYWxsX2NoZWNrcykpCisgICAgICAgIHByaW50KCIgIFZVSURzIHRlc3RlZCBpbiBsYXllciB0ZXN0czogJTA0ZCBleHBsaWNpdCwgJTA0ZCBpbXBsaWNpdCwgJTA0ZCB0b3RhbC4iICUgKGV4cF90ZXN0cywgaW1wX3Rlc3RzLCBhbGxfdGVzdHMpKQorCisgICAgICAgIHByaW50KCJcblZVSUQgY2hlY2sgY292ZXJhZ2UiKQorICAgICAgICBwcmludCgiICBFeHBsaWNpdCBWVUlEcyBjaGVja2VkOiAlLjFmJSUgKCVkIGNoZWNrZWQgdnMgJWQgZGVmaW5lZCkiICUgKCgxMDAuMCAqIGV4cF9jaGVja3MgLyBleHBfanNvbiksIGV4cF9jaGVja3MsIGV4cF9qc29uKSkKKyAgICAgICAgcHJpbnQoIiAgSW1wbGljaXQgVlVJRHMgY2hlY2tlZDogJS4xZiUlICglZCBjaGVja2VkIHZzICVkIGRlZmluZWQpIiAlICgoMTAwLjAgKiBpbXBfY2hlY2tzIC8gaW1wX2pzb24pLCBpbXBfY2hlY2tzLCBpbXBfanNvbikpCisgICAgICAgIHByaW50KCIgIE92ZXJhbGwgVlVJRHMgY2hlY2tlZDogICUuMWYlJSAoJWQgY2hlY2tlZCB2cyAlZCBkZWZpbmVkKSIgJSAoKDEwMC4wICogYWxsX2NoZWNrcyAvIGFsbF9qc29uKSwgYWxsX2NoZWNrcywgYWxsX2pzb24pKQorCisgICAgICAgIHByaW50KCJcblZVSUQgdGVzdCBjb3ZlcmFnZSIpCisgICAgICAgIHByaW50KCIgIEV4cGxpY2l0IFZVSURzIHRlc3RlZDogJS4xZiUlICglZCB0ZXN0ZWQgdnMgJWQgY2hlY2tzKSIgJSAoKDEwMC4wICogZXhwX3Rlc3RzIC8gZXhwX2NoZWNrcyksIGV4cF90ZXN0cywgZXhwX2NoZWNrcykpCisgICAgICAgIHByaW50KCIgIEltcGxpY2l0IFZVSURzIHRlc3RlZDogJS4xZiUlICglZCB0ZXN0ZWQgdnMgJWQgY2hlY2tzKSIgJSAoKDEwMC4wICogaW1wX3Rlc3RzIC8gaW1wX2NoZWNrcyksIGltcF90ZXN0cywgaW1wX2NoZWNrcykpCisgICAgICAgIHByaW50KCIgIE92ZXJhbGwgVlVJRHMgdGVzdGVkOiAgJS4xZiUlICglZCB0ZXN0ZWQgdnMgJWQgY2hlY2tzKSIgJSAoKDEwMC4wICogYWxsX3Rlc3RzIC8gYWxsX2NoZWNrcyksIGFsbF90ZXN0cywgYWxsX2NoZWNrcykpCisKKyAgICAjIFJlcG9ydCBzdGF0dXMgb2YgYSBzaW5nbGUgVlVJRAorICAgIGlmIGxlbihnZXRfdnVpZF9zdGF0dXMpID4gMToKKyAgICAgICAgcHJpbnQoIlxuXG5DaGVja2luZyBzdGF0dXMgb2YgPCVzPiIgJSBnZXRfdnVpZF9zdGF0dXMpOworICAgICAgICBpZiBnZXRfdnVpZF9zdGF0dXMgbm90IGluIHZhbF9qc29uLmFsbF92dWlkczoKKyAgICAgICAgICAgIHByaW50KCcgIE5vdCBhIHZhbGlkIFZVSUQgc3RyaW5nLicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBnZXRfdnVpZF9zdGF0dXMgaW4gdmFsX3NvdXJjZS5leHBsaWNpdF92dWlkczoKKyAgICAgICAgICAgICAgICBwcmludCgnICBJbXBsZW1lbnRlZCEnKQorICAgICAgICAgICAgICAgIGxpbmVfbGlzdCA9IHZhbF9zb3VyY2UudnVpZF9jb3VudF9kaWN0W2dldF92dWlkX3N0YXR1c11bJ2ZpbGVfbGluZSddCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZV9saXN0OgorICAgICAgICAgICAgICAgICAgICBwcmludCgnICAgID0+ICVzJyAlIGxpbmUpCisgICAgICAgICAgICBlbGlmIGdldF92dWlkX3N0YXR1cyBpbiB2YWxfc291cmNlLmltcGxpY2l0X3Z1aWRzOgorICAgICAgICAgICAgICAgIHByaW50KCcgIEltcGxlbWVudGVkISAoSW1wbGljaXQpJykKKyAgICAgICAgICAgICAgICBsaW5lX2xpc3QgPSB2YWxfc291cmNlLnZ1aWRfY291bnRfZGljdFtnZXRfdnVpZF9zdGF0dXNdWydmaWxlX2xpbmUnXQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJyAgICA9PiAlcycgJSBsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCgnICBOb3QgaW1wbGVtZW50ZWQuJykKKyAgICAgICAgICAgIGlmIGdldF92dWlkX3N0YXR1cyBpbiB2YWxfdGVzdHMuYWxsX3Z1aWRzOgorICAgICAgICAgICAgICAgIHByaW50KCcgIEhhcyBhIHRlc3QhJykKKyAgICAgICAgICAgICAgICB0ZXN0X2xpc3QgPSB2YWxfdGVzdHMudnVpZF90b190ZXN0c1tnZXRfdnVpZF9zdGF0dXNdCisgICAgICAgICAgICAgICAgZm9yIHRlc3QgaW4gdGVzdF9saXN0OgorICAgICAgICAgICAgICAgICAgICBwcmludCgnICAgID0+ICVzJyAlIHRlc3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCcgIE5vdCB0ZXN0ZWQuJykKKworICAgICMgUmVwb3J0IHVuaW1wbGVtZW50ZWQgZXhwbGljaXQgVlVJRHMKKyAgICBpZiByZXBvcnRfdW5pbXBsZW1lbnRlZDoKKyAgICAgICAgdW5pbV9leHBsaWNpdCA9IHZhbF9qc29uLmV4cGxpY2l0X3Z1aWRzIC0gdmFsX3NvdXJjZS5leHBsaWNpdF92dWlkcworICAgICAgICBwcmludCgiXG5cbiVkIGV4cGxpY2l0IFZVSUQgY2hlY2tzIHJlbWFpbiB1bmltcGxlbWVudGVkOiIgJSBsZW4odW5pbV9leHBsaWNpdCkpCisgICAgICAgIHVsaXN0ID0gbGlzdCh1bmltX2V4cGxpY2l0KQorICAgICAgICB1bGlzdC5zb3J0KCkKKyAgICAgICAgZm9yIHZ1aWQgaW4gdWxpc3Q6CisgICAgICAgICAgICBwcmludCgiICA9PiAlcyIgJSB2dWlkKQorCisgICAgIyBDb25zaXN0ZW5jeSB0ZXN0cworICAgIGlmIHJ1bl9jb25zaXN0ZW5jeToKKyAgICAgICAgcHJpbnQoIlxuXG5SdW5uaW5nIGNvbnNpc3RlbmN5IHRlc3RzLi4uIikKKyAgICAgICAgY29uID0gQ29uc2lzdGVuY3kodmFsX2pzb24uYWxsX3Z1aWRzLCB2YWxfc291cmNlLmFsbF92dWlkcywgdmFsX3Rlc3RzLmFsbF92dWlkcykKKyAgICAgICAgb2sgPSBjb24udW5kZWZfdnVpZHNfaW5fbGF5ZXJfY29kZSgpCisgICAgICAgIG9rICY9IGNvbi51bmRlZl92dWlkc19pbl90ZXN0cygpCisgICAgICAgIG9rICY9IGNvbi52dWlkc190ZXN0ZWRfbm90X2NoZWNrZWQoKQorCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgcHJpbnQoIiAgT0shIE5vIGluY29uc2lzdGVuY2llcyBmb3VuZC4iKQorCisgICAgIyBPdXRwdXQgZGF0YWJhc2UgaW4gcmVxdWVzdGVkIGZvcm1hdChzKQorICAgIGRiX291dCA9IE91dHB1dERhdGFiYXNlKHZhbF9qc29uLCB2YWxfc291cmNlLCB2YWxfdGVzdHMpCisgICAgaWYgdHh0X291dDoKKyAgICAgICAgZGJfb3V0LmR1bXBfdHh0KHJlcG9ydF91bmltcGxlbWVudGVkKQorICAgIGlmIGNzdl9vdXQ6CisgICAgICAgIGRiX291dC5kdW1wX2NzdihyZXBvcnRfdW5pbXBsZW1lbnRlZCkKKyAgICBpZiBodG1sX291dDoKKyAgICAgICAgZGJfb3V0LmR1bXBfaHRtbChyZXBvcnRfdW5pbXBsZW1lbnRlZCkKKyAgICBpZiBoZWFkZXJfb3V0OgorICAgICAgICBkYl9vdXQuZXhwb3J0X2hlYWRlcigpCisgICAgcmV0dXJuIHJlc3VsdAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvQ01ha2VMaXN0cy50eHQgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWMwMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNTUgQEAKKyMgfn5+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNC0yMDE5IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyB+fn4KKworIyBOZWVkZWQgdG8gbWFrZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgbWF0Y2ggd2l0aCBnbHNsYW5nIGxpYnJhcmllcworYWRkX2RlZmluaXRpb25zKC1ETlZfRVhURU5TSU9OUyAtREFNRF9FWFRFTlNJT05TKQorCitpZihXSU4zMikKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSIC1EV0lOMzJfTEVBTl9BTkRfTUVBTikKKyAgICAjIFdvcmthcm91bmQgZm9yIFRSMSBkZXByZWNhdGlvbiBpbiBWaXN1YWwgU3R1ZGlvIDE1LjUgdW50aWwgR29vZ2xlIFRlc3QgaXMgdXBkYXRlZAorICAgIGFkZF9kZWZpbml0aW9ucygtRF9TSUxFTkNFX1RSMV9OQU1FU1BBQ0VfREVQUkVDQVRJT05fV0FSTklORykKKyAgICAjIEFsbG93IFdpbmRvd3MgdG8gdXNlIG11bHRpcHJvY2Vzc29yIGNvbXBpbGF0aW9uCisgICAgYWRkX2NvbXBpbGVfb3B0aW9ucygvTVApCitlbHNlaWYoQU5EUk9JRCkKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIpCitlbHNlaWYoQVBQTEUpCisgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX01BQ09TX01WSykKK2Vsc2VpZihVTklYIEFORCBOT1QgQVBQTEUpICMgaS5lLiBMaW51eAorICAgIGlmKEJVSUxEX1dTSV9YQ0JfU1VQUE9SVCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisgICAgZW5kaWYoKQorCisgICAgaWYoQlVJTERfV1NJX1hMSUJfU1VQUE9SVCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQorICAgIGVuZGlmKCkKKworICAgIGlmKEJVSUxEX1dTSV9XQVlMQU5EX1NVUFBPUlQpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRFZLX1VTRV9QTEFURk9STV9XQVlMQU5EX0tIUikKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJVbnN1cHBvcnRlZCBQbGF0Zm9ybSEiKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgICBmaWxlKENPUFkgdmtfbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy52Y3hwcm9qLnVzZXIgREVTVElOQVRJT04gJHtDTUFLRV9CSU5BUllfRElSfS90ZXN0cykKK2VuZGlmKCkKKworaWYoV0lOMzIpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgLURfVVNFX01BVEhfREVGSU5FUyIpCisKKyAgICAjIElmIE1TVkMsIGRpc2FibGUgc29tZSBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2ggd2FybmluZ3MuCisgICAgaWYoTVNWQykKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC93ZDQyNjciKQorICAgIGVuZGlmKCkKKworZWxzZSgpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1zdGQ9YysrMTEiKQorZW5kaWYoKQorCitzZXQoTElCR0xNX0lOQ0xVREVfRElSICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWJzKQorCitzZXQoQ09NTU9OX0NQUAorICAgIHZrbGF5ZXJ0ZXN0c19waXBlbGluZV9zaGFkZXIuY3BwCisgICAgdmtsYXllcnRlc3RzX2J1ZmZlcl9pbWFnZV9tZW1vcnlfc2FtcGxlci5jcHAKKyAgICB2a2xheWVydGVzdHNfb3RoZXJzLmNwcAorICAgIHZrbGF5ZXJ0ZXN0c19iZXN0X3ByYWN0aWNlcy5jcHAKKyAgICB2a2xheWVydGVzdHNfZGVzY3JpcHRvcl9yZW5kZXJwYXNzX2ZyYW1lYnVmZmVyLmNwcAorICAgIHZrbGF5ZXJ0ZXN0c19jb21tYW5kLmNwcAorICAgIHZrbGF5ZXJ0ZXN0c19pbWFnZWxlc3NfZnJhbWVidWZmZXIuY3BwCisgICAgdmtwb3NpdGl2ZWxheWVydGVzdHMuY3BwCisgICAgdmtyZW5kZXJmcmFtZXdvcmsuY3BwCisgICAgdmt0ZXN0YmluZGluZy5jcHAKKyAgICB2a3Rlc3RmcmFtZXdvcmsuY3BwCisgICAgdGVzdF9lbnZpcm9ubWVudC5jcHApCisKK2lmKE5PVCBUQVJHRVQgdnVsa2FuKQorICAgIHNldCgKKyAgICAgICAgQ01BS0VfUFJFRklYX1BBVEgKKyAgICAgICAgJHtDTUFLRV9QUkVGSVhfUEFUSH07JHtWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUn07JEVOVntWVUxLQU5fSEVBREVSU19JTlNUQUxMX0RJUn0KKyAgICAgICAgKQorZW5kaWYoKQorCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L3ZrX3NhZmVfc3RydWN0LmNwcCBQUk9QRVJUSUVTIEdFTkVSQVRFRCBUUlVFKQorYWRkX2V4ZWN1dGFibGUodmtfbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cworICAgICAgICAgICAgICAgbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5jcHAKKyAgICAgICAgICAgICAgIC4uL2xheWVycy92a19mb3JtYXRfdXRpbHMuY3BwCisgICAgICAgICAgICAgICAuLi9sYXllcnMvY29udmVydF90b19yZW5kZXJwYXNzMi5jcHAKKyAgICAgICAgICAgICAgIC4uL2xheWVycy9nZW5lcmF0ZWQvdmtfc2FmZV9zdHJ1Y3QuY3BwCisgICAgICAgICAgICAgICAuLi9sYXllcnMvZ2VuZXJhdGVkL2x2dF9mdW5jdGlvbl9wb2ludGVycy5jcHAKKyAgICAgICAgICAgICAgICR7Q09NTU9OX0NQUH0pCithZGRfdGVzdChOQU1FIHZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHMgQ09NTUFORCB2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzKQorYWRkX2RlcGVuZGVuY2llcyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzIFZrTGF5ZXJfa2hyb25vc192YWxpZGF0aW9uIFZrTGF5ZXJfa2hyb25vc192YWxpZGF0aW9uLWpzb24pCitpZihOT1QgR1RFU1RfSVNfU1RBVElDX0xJQikKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXModmtfbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cyBQUk9QRVJUSUVTIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWT0xIikKK2VuZGlmKCkKKyMgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gYWRkIEdURVNUIGRpcmVjdG9yaWVzIGhlcmUgZHVlIHRvIGdvb2dsZXRlc3QgZXhwb3J0aW5nIHRoZW0gdmlhIHRoZSBndGVzdCB0YXJnZXQuCit0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllcyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQVUJMSUMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xheWVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9sYXllcnMvZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtHTFNMQU5HX1NQSVJWX0lOQ0xVREVfRElSfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7U1BJUlZfVE9PTFNfSU5DTFVERV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7VnVsa2FuSGVhZGVyc19JTkNMVURFX0RJUn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke1BST0pFQ1RfQklOQVJZX0RJUn0vbGF5ZXJzKQorYWRkX2RlcGVuZGVuY2llcyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzCisgICAgICAgICAgICAgICAgIFZrTGF5ZXJfdXRpbHMpCisKKyMgU3BlY2lmeSB0YXJnZXRfbGlua19saWJyYXJpZXMKK2lmKFdJTjMyKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhndGVzdCBQUk9QRVJUSUVTIEZPTERFUiAke0xBWUVSU19IRUxQRVJfRk9MREVSfSkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ3Rlc3RfbWFpbiBQUk9QRVJUSUVTIEZPTERFUiAke0xBWUVSU19IRUxQRVJfRk9MREVSfSkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModmtfbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cworICAgICAgICAgICAgICAgICAgICAgICAgICBQUklWQVRFIGd0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7R0xTTEFOR19MSUJSQVJJRVN9KQorZWxzZSgpCisgICAgdGFyZ2V0X2NvbXBpbGVfb3B0aW9ucyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzIFBSSVZBVEUgIi1Xbm8tc2lnbi1jb21wYXJlIikKKyAgICBpZihCVUlMRF9XU0lfWENCX1NVUFBPUlQgT1IgQlVJTERfV1NJX1hMSUJfU1VQUE9SVCkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSVZBVEUgJHtYQ0JfTElCUkFSSUVTfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke1gxMV9MSUJSQVJJRVN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtHTFNMQU5HX0xJQlJBUklFU30pCisgICAgZWxzZSgpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklWQVRFIGd0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtHTFNMQU5HX0xJQlJBUklFU30pCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgICAjIEZvciBXaW5kb3dzLCBjb3B5IG5lY2Vzc2FyeSBndGVzdCBETExzIHRvIHRoZSByaWdodCBzcG90IGZvciB0aGUgdmtfbGF5ZXJfdGVzdHMuLi4KKyAgICBpZihOT1QgR1RFU1RfSVNfU1RBVElDX0xJQikKKyAgICAgICAgZmlsZShUT19OQVRJVkVfUEFUSCAke1BST0pFQ1RfQklOQVJZX0RJUn0vZXh0ZXJuYWwvZ29vZ2xldGVzdC9nb29nbGV0ZXN0LyQ8Q09ORklHPi8qLmRsbCBTUkNfR1RFU1RfRExMUykKKyAgICAgICAgZmlsZShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJDxDT05GSUc+IERTVF9HVEVTVF9ETExTKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIHZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHMgUE9TVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCB4Y29weSAvWSAvSSAke1NSQ19HVEVTVF9ETExTfSAke0RTVF9HVEVTVF9ETExTfSkKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2lmKElOU1RBTExfVEVTVFMpCisgICAgaW5zdGFsbChUQVJHRVRTIHZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHMgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0JJTkRJUn0pCitlbmRpZigpCisKK2FkZF9zdWJkaXJlY3RvcnkobGF5ZXJzKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvZGV2aWNlX3Byb2ZpbGVzL2FkcmVub181NDAuanNvbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9hZHJlbm9fNTQwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmNDk1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9hZHJlbm9fNTQwLmpzb24KQEAgLTAsMCArMSwxNTE4IEBACit7CisgICAgIiRzY2hlbWEiOiAiaHR0cHM6Ly9zY2hlbWEua2hyb25vcy5vcmcvdnVsa2FuL2RldnNpbV8xXzBfMC5qc29uIyIsCisgICAgImNvbW1lbnRzIjogeworICAgICAgICAiaW5mbyI6ICJWdWxrYW4gSGFyZHdhcmUgUmVwb3J0IGdlbmVyYXRlZCB2aWEgaHR0cHM6Ly92dWxrYW4uZ3B1aW5mby5vcmciLAorICAgICAgICAiZGVzYyI6ICJodHRwczovL3Z1bGthbi5ncHVpbmZvLm9yZy9kaXNwbGF5cmVwb3J0LnBocD9pZD0yMTE0IgorICAgIH0sCisgICAgImVudmlyb25tZW50IjogeworICAgICAgICAiYXJjaGl0ZWN0dXJlIjogImFybSIsCisgICAgICAgICJjb21tZW50IjogIiIsCisgICAgICAgICJuYW1lIjogImFuZHJvaWQiLAorICAgICAgICAicmVwb3J0dmVyc2lvbiI6ICIxLjQiLAorICAgICAgICAic3VibWl0dGVyIjogIiIsCisgICAgICAgICJ2ZXJzaW9uIjogIjguMC4wIgorICAgIH0sCisgICAgImV4dGVuZGVkIjogeworICAgICAgICAiZGV2aWNlZmVhdHVyZXMyIjogW10sCisgICAgICAgICJkZXZpY2Vwcm9wZXJ0aWVzMiI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heFB1c2hEZXNjcmlwdG9ycyIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjMyIgorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfSwKKyAgICAicGxhdGZvcm1kZXRhaWxzIjogeworICAgICAgICAiYW5kcm9pZC5CdWlsZElEIjogIjQ3LjEuQS41LjUxIiwKKyAgICAgICAgImFuZHJvaWQuQnVpbGRWZXJzaW9uSW5jcmVtZW50YWwiOiAiMzc0MjM4NDA3MiIsCisgICAgICAgICJhbmRyb2lkLlByb2R1Y3RNYW51ZmFjdHVyZXIiOiAiU29ueSIsCisgICAgICAgICJhbmRyb2lkLlByb2R1Y3RNb2RlbCI6ICJHODE0MiIKKyAgICB9LAorICAgICJzdXJmYWNlY2FwYWJpbGl0ZXMiOiB7CisgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMSwKKyAgICAgICAgIm1heEltYWdlQ291bnQiOiAzLAorICAgICAgICAibWF4SW1hZ2VFeHRlbnQiOiB7CisgICAgICAgICAgICAiaGVpZ2h0IjogNDA5NiwKKyAgICAgICAgICAgICJ3aWR0aCI6IDQwOTYKKyAgICAgICAgfSwKKyAgICAgICAgIm1pbkltYWdlQ291bnQiOiAyLAorICAgICAgICAibWluSW1hZ2VFeHRlbnQiOiB7CisgICAgICAgICAgICAiaGVpZ2h0IjogMSwKKyAgICAgICAgICAgICJ3aWR0aCI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgInByZXNlbnRtb2RlcyI6IFsKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgMTAwMDExMTAwMCwKKyAgICAgICAgICAgIDEwMDAxMTEwMDEKKyAgICAgICAgXSwKKyAgICAgICAgInN1cHBvcnRlZENvbXBvc2l0ZUFscGhhIjogOCwKKyAgICAgICAgInN1cHBvcnRlZFRyYW5zZm9ybXMiOiAyNzEsCisgICAgICAgICJzdXBwb3J0ZWRVc2FnZUZsYWdzIjogMTU5LAorICAgICAgICAic3VyZmFjZUV4dGVuc2lvbiI6ICJWS19LSFJfYW5kcm9pZF9zdXJmYWNlIiwKKyAgICAgICAgInN1cmZhY2Vmb3JtYXRzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb2xvclNwYWNlIjogMCwKKyAgICAgICAgICAgICAgICAiZm9ybWF0IjogMzcKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImNvbG9yU3BhY2UiOiAwLAorICAgICAgICAgICAgICAgICJmb3JtYXQiOiA0MworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY29sb3JTcGFjZSI6IDAsCisgICAgICAgICAgICAgICAgImZvcm1hdCI6IDQKKyAgICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgInZhbGlkU3VyZmFjZSI6IHRydWUKKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMiOiB7CisgICAgICAgICJhbHBoYVRvT25lIjogMSwKKyAgICAgICAgImRlcHRoQmlhc0NsYW1wIjogMSwKKyAgICAgICAgImRlcHRoQm91bmRzIjogMCwKKyAgICAgICAgImRlcHRoQ2xhbXAiOiAxLAorICAgICAgICAiZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSI6IDAsCisgICAgICAgICJkdWFsU3JjQmxlbmQiOiAwLAorICAgICAgICAiZmlsbE1vZGVOb25Tb2xpZCI6IDEsCisgICAgICAgICJmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MiOiAxLAorICAgICAgICAiZnVsbERyYXdJbmRleFVpbnQzMiI6IDEsCisgICAgICAgICJnZW9tZXRyeVNoYWRlciI6IDAsCisgICAgICAgICJpbWFnZUN1YmVBcnJheSI6IDEsCisgICAgICAgICJpbmRlcGVuZGVudEJsZW5kIjogMSwKKyAgICAgICAgImluaGVyaXRlZFF1ZXJpZXMiOiAxLAorICAgICAgICAibGFyZ2VQb2ludHMiOiAxLAorICAgICAgICAibG9naWNPcCI6IDAsCisgICAgICAgICJtdWx0aURyYXdJbmRpcmVjdCI6IDEsCisgICAgICAgICJtdWx0aVZpZXdwb3J0IjogMCwKKyAgICAgICAgIm9jY2x1c2lvblF1ZXJ5UHJlY2lzZSI6IDAsCisgICAgICAgICJwaXBlbGluZVN0YXRpc3RpY3NRdWVyeSI6IDAsCisgICAgICAgICJyb2J1c3RCdWZmZXJBY2Nlc3MiOiAxLAorICAgICAgICAic2FtcGxlUmF0ZVNoYWRpbmciOiAxLAorICAgICAgICAic2FtcGxlckFuaXNvdHJvcHkiOiAxLAorICAgICAgICAic2hhZGVyQ2xpcERpc3RhbmNlIjogMSwKKyAgICAgICAgInNoYWRlckN1bGxEaXN0YW5jZSI6IDEsCisgICAgICAgICJzaGFkZXJGbG9hdDY0IjogMCwKKyAgICAgICAgInNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQiOiAxLAorICAgICAgICAic2hhZGVySW50MTYiOiAwLAorICAgICAgICAic2hhZGVySW50NjQiOiAwLAorICAgICAgICAic2hhZGVyUmVzb3VyY2VNaW5Mb2QiOiAwLAorICAgICAgICAic2hhZGVyUmVzb3VyY2VSZXNpZGVuY3kiOiAwLAorICAgICAgICAic2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIjogMCwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nIjogMCwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0cyI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZSI6IDAsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdCI6IDAsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXQiOiAxLAorICAgICAgICAic2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUiOiAwLAorICAgICAgICAic2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIjogMSwKKyAgICAgICAgInNwYXJzZUJpbmRpbmciOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeTRTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeThTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUFsaWFzZWQiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5QnVmZmVyIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUltYWdlMkQiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5SW1hZ2UzRCI6IDAsCisgICAgICAgICJ0ZXNzZWxsYXRpb25TaGFkZXIiOiAwLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIiOiAxLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uQkMiOiAwLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uRVRDMiI6IDEsCisgICAgICAgICJ2YXJpYWJsZU11bHRpc2FtcGxlUmF0ZSI6IDAsCisgICAgICAgICJ2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3MiOiAwLAorICAgICAgICAid2lkZUxpbmVzIjogMAorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIjogeworICAgICAgICAiYXBpVmVyc2lvbiI6IDQxOTQzNTMsCisgICAgICAgICJkZXZpY2VJRCI6IDg0MTQ4MjI1LAorICAgICAgICAiZGV2aWNlTmFtZSI6ICJBZHJlbm8gKFRNKSA1NDAiLAorICAgICAgICAiZGV2aWNlVHlwZSI6IDEsCisgICAgICAgICJkcml2ZXJWZXJzaW9uIjogNjAxMTE1MzcsCisgICAgICAgICJsaW1pdHMiOiB7CisgICAgICAgICAgICAiYnVmZmVySW1hZ2VHcmFudWxhcml0eSI6IDEsCisgICAgICAgICAgICAiZGlzY3JldGVRdWV1ZVByaW9yaXRpZXMiOiAzLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgImZyYW1lYnVmZmVyRGVwdGhTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgImZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50cyI6IDcsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzIjogNywKKyAgICAgICAgICAgICJsaW5lV2lkdGhHcmFudWxhcml0eSI6IDAsCisgICAgICAgICAgICAibGluZVdpZHRoUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAxCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heEJvdW5kRGVzY3JpcHRvclNldHMiOiA0LAorICAgICAgICAgICAgIm1heENsaXBEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heENvbG9yQXR0YWNobWVudHMiOiA4LAorICAgICAgICAgICAgIm1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heENvbXB1dGVTaGFyZWRNZW1vcnlTaXplIjogMzI3NjgsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cENvdW50IjogWworICAgICAgICAgICAgICAgIDY1NTM1LAorICAgICAgICAgICAgICAgIDY1NTM1LAorICAgICAgICAgICAgICAgIDY1NTM1CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyI6IDEwMjQsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cFNpemUiOiBbCisgICAgICAgICAgICAgICAgMTAyNCwKKyAgICAgICAgICAgICAgICAxMDI0LAorICAgICAgICAgICAgICAgIDY0CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heEN1bGxEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRJbnB1dEF0dGFjaG1lbnRzIjogOCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlcyI6IDc2OCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMiOiA5NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnMiOiAyNCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljIjogNCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlcyI6IDI0LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVycyI6IDg0LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMiOiA4LAorICAgICAgICAgICAgIm1heERyYXdJbmRleGVkSW5kZXhWYWx1ZSI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4RHJhd0luZGlyZWN0Q291bnQiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heEZyYWdtZW50Q29tYmluZWRPdXRwdXRSZXNvdXJjZXMiOiA3MiwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudER1YWxTcmNBdHRhY2htZW50cyI6IDAsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50cyI6IDgsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJIZWlnaHQiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlckxheWVycyI6IDIwNDgsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJXaWR0aCI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzIjogMCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMiOiAwLAorICAgICAgICAgICAgIm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMiOiAwLAorICAgICAgICAgICAgIm1heEdlb21ldHJ5U2hhZGVySW52b2NhdGlvbnMiOiAwLAorICAgICAgICAgICAgIm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzIjogMCwKKyAgICAgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjFEIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb24yRCI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uM0QiOiAyMDQ4LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uQ3ViZSI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEludGVycG9sYXRpb25PZmZzZXQiOiAwLjQzNzUsCisgICAgICAgICAgICAibWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50IjogNDA5NiwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzIjogOCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVkSW1hZ2VzIjogMTI4LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzIjogMTYsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMiOiAyNCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzIjogNCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyI6IDE0LAorICAgICAgICAgICAgIm1heFBlclN0YWdlUmVzb3VyY2VzIjogMTU4LAorICAgICAgICAgICAgIm1heFB1c2hDb25zdGFudHNTaXplIjogMTI4LAorICAgICAgICAgICAgIm1heFNhbXBsZU1hc2tXb3JkcyI6IDEsCisgICAgICAgICAgICAibWF4U2FtcGxlckFsbG9jYXRpb25Db3VudCI6IDQwMDAsCisgICAgICAgICAgICAibWF4U2FtcGxlckFuaXNvdHJvcHkiOiAxNiwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyTG9kQmlhcyI6IDE1Ljk5NjA5Mzc1LAorICAgICAgICAgICAgIm1heFN0b3JhZ2VCdWZmZXJSYW5nZSI6IDIxNDc0ODM2NDcsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclBhdGNoT3V0cHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleElucHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xUb3RhbE91dHB1dENvbXBvbmVudHMiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dENvbXBvbmVudHMiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzIjogMCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25HZW5lcmF0aW9uTGV2ZWwiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvblBhdGNoU2l6ZSI6IDAsCisgICAgICAgICAgICAibWF4VGV4ZWxCdWZmZXJFbGVtZW50cyI6IDY1NTM2LAorICAgICAgICAgICAgIm1heFRleGVsR2F0aGVyT2Zmc2V0IjogMzEsCisgICAgICAgICAgICAibWF4VGV4ZWxPZmZzZXQiOiA3LAorICAgICAgICAgICAgIm1heFVuaWZvcm1CdWZmZXJSYW5nZSI6IDY1NTM2LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0IjogNDA5NiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUiOiAyMDQ4LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ3MiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFZpZXdwb3J0RGltZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICAgICAxNjM4NCwKKyAgICAgICAgICAgICAgICAxNjM4NAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhWaWV3cG9ydHMiOiAxLAorICAgICAgICAgICAgIm1pbkludGVycG9sYXRpb25PZmZzZXQiOiAtMC41LAorICAgICAgICAgICAgIm1pbk1lbW9yeU1hcEFsaWdubWVudCI6IDY0LAorICAgICAgICAgICAgIm1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiA2NCwKKyAgICAgICAgICAgICJtaW5UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudCI6IDY0LAorICAgICAgICAgICAgIm1pblRleGVsR2F0aGVyT2Zmc2V0IjogLTMyLAorICAgICAgICAgICAgIm1pblRleGVsT2Zmc2V0IjogLTgsCisgICAgICAgICAgICAibWluVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudCI6IDY0LAorICAgICAgICAgICAgIm1pcG1hcFByZWNpc2lvbkJpdHMiOiA4LAorICAgICAgICAgICAgIm5vbkNvaGVyZW50QXRvbVNpemUiOiAxLAorICAgICAgICAgICAgIm9wdGltYWxCdWZmZXJDb3B5T2Zmc2V0QWxpZ25tZW50IjogNjQsCisgICAgICAgICAgICAib3B0aW1hbEJ1ZmZlckNvcHlSb3dQaXRjaEFsaWdubWVudCI6IDY0LAorICAgICAgICAgICAgInBvaW50U2l6ZUdyYW51bGFyaXR5IjogMC4wNjI1LAorICAgICAgICAgICAgInBvaW50U2l6ZVJhbmdlIjogWworICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgMTAyMworICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyI6IDcsCisgICAgICAgICAgICAic2FtcGxlZEltYWdlRGVwdGhTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZUludGVnZXJTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgInNwYXJzZUFkZHJlc3NTcGFjZVNpemUiOiAwLAorICAgICAgICAgICAgInN0YW5kYXJkU2FtcGxlTG9jYXRpb25zIjogMSwKKyAgICAgICAgICAgICJzdG9yYWdlSW1hZ2VTYW1wbGVDb3VudHMiOiAxLAorICAgICAgICAgICAgInN0cmljdExpbmVzIjogMSwKKyAgICAgICAgICAgICJzdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzIjogNCwKKyAgICAgICAgICAgICJzdWJQaXhlbFByZWNpc2lvbkJpdHMiOiA0LAorICAgICAgICAgICAgInN1YlRleGVsUHJlY2lzaW9uQml0cyI6IDgsCisgICAgICAgICAgICAidGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzIjogMSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBQZXJpb2QiOiA1Mi4wODMzMzIwNjE4LAorICAgICAgICAgICAgInZpZXdwb3J0Qm91bmRzUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgLTMyNzY4LAorICAgICAgICAgICAgICAgIDMyNzY3CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInZpZXdwb3J0U3ViUGl4ZWxCaXRzIjogMAorICAgICAgICB9LAorICAgICAgICAicGlwZWxpbmVDYWNoZVVVSUQiOiBbCisgICAgICAgICAgICAxNzcsCisgICAgICAgICAgICA1OCwKKyAgICAgICAgICAgIDE0OSwKKyAgICAgICAgICAgIDMsCisgICAgICAgICAgICA2NywKKyAgICAgICAgICAgIDgxLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgNCwKKyAgICAgICAgICAgIDUsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMAorICAgICAgICBdLAorICAgICAgICAic3BhcnNlUHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJyZXNpZGVuY3lBbGlnbmVkTWlwU2l6ZSI6IDAsCisgICAgICAgICAgICAicmVzaWRlbmN5Tm9uUmVzaWRlbnRTdHJpY3QiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkMkRCbG9ja1NoYXBlIjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lTdGFuZGFyZDJETXVsdGlzYW1wbGVCbG9ja1NoYXBlIjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lTdGFuZGFyZDNEQmxvY2tTaGFwZSI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgInZlbmRvcklEIjogMjA4MDMKKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyI6IHsKKyAgICAgICAgIm1lbW9yeUhlYXBzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJmbGFncyI6IDEsCisgICAgICAgICAgICAgICAgInNpemUiOiAzOTEyMDk3NzkyCisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJtZW1vcnlUeXBlcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMCwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDAsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAxMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMCwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDE1CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAwLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMCwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDcKKyAgICAgICAgICAgIH0KKyAgICAgICAgXQorICAgIH0sCisgICAgIkFycmF5T2ZWa0V4dGVuc2lvblByb3BlcnRpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9pbmNyZW1lbnRhbF9wcmVzZW50IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NoYXJlZF9wcmVzZW50YWJsZV9pbWFnZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0dPT0dMRV9kaXNwbGF5X3RpbWluZyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zd2FwY2hhaW4iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNjgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX21haW50ZW5hbmNlMSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl92YXJpYWJsZV9wb2ludGVycyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zdG9yYWdlX2J1ZmZlcl9zdG9yYWdlX2NsYXNzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3JlbGF4ZWRfYmxvY2tfbGF5b3V0IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9tZW1vcnkiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X2ZkIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfZmQiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfZmVuY2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfZmVuY2VfZmQiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfYmluZF9tZW1vcnkyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfcHVzaF9kZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa0xheWVyUHJvcGVydGllcyI6IFtdLAorICAgICJBcnJheU9mVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJtaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkiOiB7CisgICAgICAgICAgICAgICAgImRlcHRoIjogMSwKKyAgICAgICAgICAgICAgICAiaGVpZ2h0IjogMSwKKyAgICAgICAgICAgICAgICAid2lkdGgiOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInF1ZXVlQ291bnQiOiAzLAorICAgICAgICAgICAgInF1ZXVlRmxhZ3MiOiAzLAorICAgICAgICAgICAgInRpbWVzdGFtcFZhbGlkQml0cyI6IDQ4CisgICAgICAgIH0KKyAgICBdLAorICAgICJBcnJheU9mVmtGb3JtYXRQcm9wZXJ0aWVzIjogWworICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzUzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDQ0OTkyMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA0NDk5MjMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0Mjc1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0Mjc1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNDQ5OTIzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDQ0OTkyMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDczLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzUzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzUzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUwNjg5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0Nzg1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQ3ODUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTg0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0KKyAgICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvZGV2aWNlX3Byb2ZpbGVzL2FtZF9yYWRlb25fcnhfNDgwLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvYW1kX3JhZGVvbl9yeF80ODAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWFhOTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvZGV2aWNlX3Byb2ZpbGVzL2FtZF9yYWRlb25fcnhfNDgwLmpzb24KQEAgLTAsMCArMSwxODIyIEBACit7CisgICAgIiRzY2hlbWEiOiAiaHR0cHM6Ly9zY2hlbWEua2hyb25vcy5vcmcvdnVsa2FuL2RldnNpbV8xXzBfMC5qc29uIyIsCisgICAgImNvbW1lbnRzIjogeworICAgICAgICAiaW5mbyI6ICJWdWxrYW4gSGFyZHdhcmUgUmVwb3J0IGdlbmVyYXRlZCB2aWEgaHR0cHM6Ly92dWxrYW4uZ3B1aW5mby5vcmciLAorICAgICAgICAiZGVzYyI6ICJodHRwczovL3Z1bGthbi5ncHVpbmZvLm9yZy9kaXNwbGF5cmVwb3J0LnBocD9pZD0zMDc3IgorICAgIH0sCisgICAgImVudmlyb25tZW50IjogeworICAgICAgICAiYXJjaGl0ZWN0dXJlIjogIng4Nl82NCIsCisgICAgICAgICJjb21tZW50IjogIiIsCisgICAgICAgICJuYW1lIjogImFyY2giLAorICAgICAgICAicmVwb3J0dmVyc2lvbiI6ICIxLjUiLAorICAgICAgICAic3VibWl0dGVyIjogIiIsCisgICAgICAgICJ2ZXJzaW9uIjogInVua25vd24iCisgICAgfSwKKyAgICAiZXh0ZW5kZWQiOiB7CisgICAgICAgICJkZXZpY2VmZWF0dXJlczIiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfbXVsdGl2aWV3IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtdWx0aXZpZXciLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX211bHRpdmlldyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiBmYWxzZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl9tdWx0aXZpZXciLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm11bHRpdmlld1Rlc3NlbGxhdGlvblNoYWRlciIsCisgICAgICAgICAgICAgICAgInN1cHBvcnRlZCI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfMTZiaXRfc3RvcmFnZSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAic3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzIiwKKyAgICAgICAgICAgICAgICAic3VwcG9ydGVkIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl8xNmJpdF9zdG9yYWdlIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJ1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzIiwKKyAgICAgICAgICAgICAgICAic3VwcG9ydGVkIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl8xNmJpdF9zdG9yYWdlIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJzdG9yYWdlUHVzaENvbnN0YW50MTYiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiBmYWxzZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl8xNmJpdF9zdG9yYWdlIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJzdG9yYWdlSW5wdXRPdXRwdXQxNiIsCisgICAgICAgICAgICAgICAgInN1cHBvcnRlZCI6IGZhbHNlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInNoYWRlckRyYXdQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAic3VwcG9ydGVkIjogZmFsc2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgImRldmljZXByb3BlcnRpZXMyIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX211bHRpdmlldyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibWF4TXVsdGl2aWV3Vmlld0NvdW50IiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiNiIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfbXVsdGl2aWV3IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4IiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiNDI5NDk2NzI5NSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJmaWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJmaWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmciLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJmYWxzZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAic2FtcGxlTG9jYXRpb25TYW1wbGVDb3VudHMiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIxNSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZS53aWR0aCIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjIiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heFNhbXBsZUxvY2F0aW9uR3JpZFNpemUuaGVpZ2h0IiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiMiIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAic2FtcGxlTG9jYXRpb25Db29yZGluYXRlUmFuZ2VbMF0iLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIwIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJzYW1wbGVMb2NhdGlvbkNvb3JkaW5hdGVSYW5nZVsxXSIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjEiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInNhbXBsZUxvY2F0aW9uU3ViUGl4ZWxCaXRzIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiNCIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAidmFyaWFibGVTYW1wbGVMb2NhdGlvbnMiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJ0cnVlIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl9tYWludGVuYW5jZTMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heFBlclNldERlc2NyaXB0b3JzIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiNDI5NDk2NzI5NSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfbWFpbnRlbmFuY2UzIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtYXhNZW1vcnlBbGxvY2F0aW9uU2l6ZSIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjIxNDc0ODM2NDgiCisgICAgICAgICAgICB9CisgICAgICAgIF0KKyAgICB9LAorICAgICJpbnN0YW5jZSI6IHsKKyAgICAgICAgImV4dGVuc2lvbnMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3N1cmZhY2UiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDI1CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl94Y2Jfc3VyZmFjZSIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfeGxpYl9zdXJmYWNlIiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiA2CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl93YXlsYW5kX3N1cmZhY2UiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDYKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbiIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2NhcGFiaWxpdGllcyIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9kZWJ1Z19yZXBvcnQiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfRVhUX2RlYnVnX3V0aWxzIiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJsYXllcnMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN0ZWFtIE92ZXJsYXkgTGF5ZXIiLAorICAgICAgICAgICAgICAgICJleHRlbnNpb25zIjogW10sCisgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uVmVyc2lvbiI6IDEsCisgICAgICAgICAgICAgICAgImxheWVyTmFtZSI6ICJWS19MQVlFUl9WQUxWRV9zdGVhbV9vdmVybGF5XzY0IiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiA0MTk0MzA3CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTdGVhbSBPdmVybGF5IExheWVyIiwKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9ucyI6IFtdLAorICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvblZlcnNpb24iOiAxLAorICAgICAgICAgICAgICAgICJsYXllck5hbWUiOiAiVktfTEFZRVJfVkFMVkVfc3RlYW1fb3ZlcmxheV8zMiIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNDE5NDMwNworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTHVuYXJHIFN0YW5kYXJkIFZhbGlkYXRpb24gTGF5ZXIiLAorICAgICAgICAgICAgICAgICJleHRlbnNpb25zIjogW10sCisgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uVmVyc2lvbiI6IDEsCisgICAgICAgICAgICAgICAgImxheWVyTmFtZSI6ICJWS19MQVlFUl9MVU5BUkdfc3RhbmRhcmRfdmFsaWRhdGlvbiIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNDE5NDM3NAorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfSwKKyAgICAicGxhdGZvcm1kZXRhaWxzIjogW10sCisgICAgInN1cmZhY2VjYXBhYmlsaXRlcyI6IHsKKyAgICAgICAgIm1heEltYWdlQXJyYXlMYXllcnMiOiAxLAorICAgICAgICAibWF4SW1hZ2VDb3VudCI6IDE2LAorICAgICAgICAibWF4SW1hZ2VFeHRlbnQiOiB7CisgICAgICAgICAgICAiaGVpZ2h0IjogNzU1LAorICAgICAgICAgICAgIndpZHRoIjogOTI3CisgICAgICAgIH0sCisgICAgICAgICJtaW5JbWFnZUNvdW50IjogMiwKKyAgICAgICAgIm1pbkltYWdlRXh0ZW50IjogeworICAgICAgICAgICAgImhlaWdodCI6IDc1NSwKKyAgICAgICAgICAgICJ3aWR0aCI6IDkyNworICAgICAgICB9LAorICAgICAgICAicHJlc2VudG1vZGVzIjogWworICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAyCisgICAgICAgIF0sCisgICAgICAgICJzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSI6IDEsCisgICAgICAgICJzdXBwb3J0ZWRUcmFuc2Zvcm1zIjogMSwKKyAgICAgICAgInN1cHBvcnRlZFVzYWdlRmxhZ3MiOiAxNTksCisgICAgICAgICJzdXJmYWNlRXh0ZW5zaW9uIjogIlZLX0tIUl94Y2Jfc3VyZmFjZSIsCisgICAgICAgICJzdXJmYWNlZm9ybWF0cyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY29sb3JTcGFjZSI6IDAsCisgICAgICAgICAgICAgICAgImZvcm1hdCI6IDQ0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb2xvclNwYWNlIjogMCwKKyAgICAgICAgICAgICAgICAiZm9ybWF0IjogNTAKKyAgICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgInZhbGlkU3VyZmFjZSI6IHRydWUKKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMiOiB7CisgICAgICAgICJhbHBoYVRvT25lIjogMCwKKyAgICAgICAgImRlcHRoQmlhc0NsYW1wIjogMSwKKyAgICAgICAgImRlcHRoQm91bmRzIjogMSwKKyAgICAgICAgImRlcHRoQ2xhbXAiOiAxLAorICAgICAgICAiZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSI6IDEsCisgICAgICAgICJkdWFsU3JjQmxlbmQiOiAxLAorICAgICAgICAiZmlsbE1vZGVOb25Tb2xpZCI6IDEsCisgICAgICAgICJmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MiOiAxLAorICAgICAgICAiZnVsbERyYXdJbmRleFVpbnQzMiI6IDEsCisgICAgICAgICJnZW9tZXRyeVNoYWRlciI6IDEsCisgICAgICAgICJpbWFnZUN1YmVBcnJheSI6IDEsCisgICAgICAgICJpbmRlcGVuZGVudEJsZW5kIjogMSwKKyAgICAgICAgImluaGVyaXRlZFF1ZXJpZXMiOiAxLAorICAgICAgICAibGFyZ2VQb2ludHMiOiAxLAorICAgICAgICAibG9naWNPcCI6IDEsCisgICAgICAgICJtdWx0aURyYXdJbmRpcmVjdCI6IDEsCisgICAgICAgICJtdWx0aVZpZXdwb3J0IjogMSwKKyAgICAgICAgIm9jY2x1c2lvblF1ZXJ5UHJlY2lzZSI6IDEsCisgICAgICAgICJwaXBlbGluZVN0YXRpc3RpY3NRdWVyeSI6IDEsCisgICAgICAgICJyb2J1c3RCdWZmZXJBY2Nlc3MiOiAxLAorICAgICAgICAic2FtcGxlUmF0ZVNoYWRpbmciOiAxLAorICAgICAgICAic2FtcGxlckFuaXNvdHJvcHkiOiAxLAorICAgICAgICAic2hhZGVyQ2xpcERpc3RhbmNlIjogMSwKKyAgICAgICAgInNoYWRlckN1bGxEaXN0YW5jZSI6IDEsCisgICAgICAgICJzaGFkZXJGbG9hdDY0IjogMSwKKyAgICAgICAgInNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQiOiAxLAorICAgICAgICAic2hhZGVySW50MTYiOiAwLAorICAgICAgICAic2hhZGVySW50NjQiOiAxLAorICAgICAgICAic2hhZGVyUmVzb3VyY2VNaW5Mb2QiOiAwLAorICAgICAgICAic2hhZGVyUmVzb3VyY2VSZXNpZGVuY3kiOiAwLAorICAgICAgICAic2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0cyI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZSI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdCI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXQiOiAxLAorICAgICAgICAic2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUiOiAxLAorICAgICAgICAic2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIjogMSwKKyAgICAgICAgInNwYXJzZUJpbmRpbmciOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeTRTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeThTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUFsaWFzZWQiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5QnVmZmVyIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUltYWdlMkQiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5SW1hZ2UzRCI6IDAsCisgICAgICAgICJ0ZXNzZWxsYXRpb25TaGFkZXIiOiAxLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIiOiAwLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uQkMiOiAxLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uRVRDMiI6IDAsCisgICAgICAgICJ2YXJpYWJsZU11bHRpc2FtcGxlUmF0ZSI6IDEsCisgICAgICAgICJ2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3MiOiAxLAorICAgICAgICAid2lkZUxpbmVzIjogMQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIjogeworICAgICAgICAiYXBpVmVyc2lvbiI6IDQxOTg0NzAsCisgICAgICAgICJkZXZpY2VJRCI6IDI2NTkxLAorICAgICAgICAiZGV2aWNlTmFtZSI6ICJBTUQgUmFkZW9uIChUTSkgUlggNDgwIEdyYXBoaWNzIiwKKyAgICAgICAgImRldmljZVR5cGUiOiAyLAorICAgICAgICAiZHJpdmVyVmVyc2lvbiI6IDgzODg2MzUsCisgICAgICAgICJsaW1pdHMiOiB7CisgICAgICAgICAgICAiYnVmZmVySW1hZ2VHcmFudWxhcml0eSI6IDEsCisgICAgICAgICAgICAiZGlzY3JldGVRdWV1ZVByaW9yaXRpZXMiOiAyLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHMiOiAxNSwKKyAgICAgICAgICAgICJmcmFtZWJ1ZmZlckRlcHRoU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAibGluZVdpZHRoR3JhbnVsYXJpdHkiOiAwLjEyNSwKKyAgICAgICAgICAgICJsaW5lV2lkdGhSYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDgxOTEuODc1CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heEJvdW5kRGVzY3JpcHRvclNldHMiOiAzMiwKKyAgICAgICAgICAgICJtYXhDbGlwRGlzdGFuY2VzIjogOCwKKyAgICAgICAgICAgICJtYXhDb2xvckF0dGFjaG1lbnRzIjogOCwKKyAgICAgICAgICAgICJtYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzIjogOCwKKyAgICAgICAgICAgICJtYXhDb21wdXRlU2hhcmVkTWVtb3J5U2l6ZSI6IDMyNzY4LAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBDb3VudCI6IFsKKyAgICAgICAgICAgICAgICA2NTUzNSwKKyAgICAgICAgICAgICAgICA2NTUzNSwKKyAgICAgICAgICAgICAgICA2NTUzNQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMiOiAxMDI0LAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBTaXplIjogWworICAgICAgICAgICAgICAgIDEwMjQsCisgICAgICAgICAgICAgICAgMTAyNCwKKyAgICAgICAgICAgICAgICAxMDI0CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heEN1bGxEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRJbnB1dEF0dGFjaG1lbnRzIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlcyI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFNhbXBsZXJzIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnMiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWMiOiA4LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMiOiA4LAorICAgICAgICAgICAgIm1heERyYXdJbmRleGVkSW5kZXhWYWx1ZSI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4RHJhd0luZGlyZWN0Q291bnQiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heEZyYWdtZW50Q29tYmluZWRPdXRwdXRSZXNvdXJjZXMiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heEZyYWdtZW50RHVhbFNyY0F0dGFjaG1lbnRzIjogMSwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudE91dHB1dEF0dGFjaG1lbnRzIjogOCwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlckhlaWdodCI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVyTGF5ZXJzIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlcldpZHRoIjogMTYzODQsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMiOiAxMDI0LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5U2hhZGVySW52b2NhdGlvbnMiOiAxMjcsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHMiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjFEIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb24yRCI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uM0QiOiAyMDQ4LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uQ3ViZSI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEludGVycG9sYXRpb25PZmZzZXQiOiAyLAorICAgICAgICAgICAgIm1heE1lbW9yeUFsbG9jYXRpb25Db3VudCI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5wdXRBdHRhY2htZW50cyI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnMiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VCdWZmZXJzIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VSZXNvdXJjZXMiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heFB1c2hDb25zdGFudHNTaXplIjogMTI4LAorICAgICAgICAgICAgIm1heFNhbXBsZU1hc2tXb3JkcyI6IDEsCisgICAgICAgICAgICAibWF4U2FtcGxlckFsbG9jYXRpb25Db3VudCI6IDEwNDg1NzYsCisgICAgICAgICAgICAibWF4U2FtcGxlckFuaXNvdHJvcHkiOiAxNiwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyTG9kQmlhcyI6IDE1Ljk5NjA5Mzc1LAorICAgICAgICAgICAgIm1heFN0b3JhZ2VCdWZmZXJSYW5nZSI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclBhdGNoT3V0cHV0Q29tcG9uZW50cyI6IDEyMCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xUb3RhbE91dHB1dENvbXBvbmVudHMiOiA0MDk2LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsIjogNjQsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplIjogMzIsCisgICAgICAgICAgICAibWF4VGV4ZWxCdWZmZXJFbGVtZW50cyI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4VGV4ZWxHYXRoZXJPZmZzZXQiOiAzMSwKKyAgICAgICAgICAgICJtYXhUZXhlbE9mZnNldCI6IDYzLAorICAgICAgICAgICAgIm1heFVuaWZvcm1CdWZmZXJSYW5nZSI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QXR0cmlidXRlcyI6IDY0LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSI6IDE2MzgzLAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ3MiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFZpZXdwb3J0RGltZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICAgICAxNjM4NCwKKyAgICAgICAgICAgICAgICAxNjM4NAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhWaWV3cG9ydHMiOiAxNiwKKyAgICAgICAgICAgICJtaW5JbnRlcnBvbGF0aW9uT2Zmc2V0IjogLTIsCisgICAgICAgICAgICAibWluTWVtb3J5TWFwQWxpZ25tZW50IjogNjQsCisgICAgICAgICAgICAibWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCI6IDQsCisgICAgICAgICAgICAibWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAxLAorICAgICAgICAgICAgIm1pblRleGVsR2F0aGVyT2Zmc2V0IjogLTMyLAorICAgICAgICAgICAgIm1pblRleGVsT2Zmc2V0IjogLTY0LAorICAgICAgICAgICAgIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAxNiwKKyAgICAgICAgICAgICJtaXBtYXBQcmVjaXNpb25CaXRzIjogOCwKKyAgICAgICAgICAgICJub25Db2hlcmVudEF0b21TaXplIjogMTI4LAorICAgICAgICAgICAgIm9wdGltYWxCdWZmZXJDb3B5T2Zmc2V0QWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJwb2ludFNpemVHcmFudWxhcml0eSI6IDAuMTI1LAorICAgICAgICAgICAgInBvaW50U2l6ZVJhbmdlIjogWworICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgODE5MS44NzUKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAic2FtcGxlZEltYWdlQ29sb3JTYW1wbGVDb3VudHMiOiAxNSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VEZXB0aFNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZUludGVnZXJTYW1wbGVDb3VudHMiOiAxNSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VTdGVuY2lsU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAic3BhcnNlQWRkcmVzc1NwYWNlU2l6ZSI6IDY0NDI0NTA5NDQwLAorICAgICAgICAgICAgInN0YW5kYXJkU2FtcGxlTG9jYXRpb25zIjogMSwKKyAgICAgICAgICAgICJzdG9yYWdlSW1hZ2VTYW1wbGVDb3VudHMiOiAxNSwKKyAgICAgICAgICAgICJzdHJpY3RMaW5lcyI6IDAsCisgICAgICAgICAgICAic3ViUGl4ZWxJbnRlcnBvbGF0aW9uT2Zmc2V0Qml0cyI6IDgsCisgICAgICAgICAgICAic3ViUGl4ZWxQcmVjaXNpb25CaXRzIjogOCwKKyAgICAgICAgICAgICJzdWJUZXhlbFByZWNpc2lvbkJpdHMiOiA4LAorICAgICAgICAgICAgInRpbWVzdGFtcENvbXB1dGVBbmRHcmFwaGljcyI6IDEsCisgICAgICAgICAgICAidGltZXN0YW1wUGVyaW9kIjogNDAsCisgICAgICAgICAgICAidmlld3BvcnRCb3VuZHNSYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAtMzI3NjgsCisgICAgICAgICAgICAgICAgMzI3NjcKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidmlld3BvcnRTdWJQaXhlbEJpdHMiOiA4CisgICAgICAgIH0sCisgICAgICAgICJwaXBlbGluZUNhY2hlVVVJRCI6IFsKKyAgICAgICAgICAgIDIsCisgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMjIzLAorICAgICAgICAgICAgMTAzLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAxNDQsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwCisgICAgICAgIF0sCisgICAgICAgICJzcGFyc2VQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInJlc2lkZW5jeUFsaWduZWRNaXBTaXplIjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdCI6IDEsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGUiOiAxLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGUiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkM0RCbG9ja1NoYXBlIjogMAorICAgICAgICB9LAorICAgICAgICAic3ViZ3JvdXBQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInF1YWRPcGVyYXRpb25zSW5BbGxTdGFnZXMiOiB0cnVlLAorICAgICAgICAgICAgInN1Ymdyb3VwU2l6ZSI6IDY0LAorICAgICAgICAgICAgInN1cHBvcnRlZE9wZXJhdGlvbnMiOiAxMzksCisgICAgICAgICAgICAic3VwcG9ydGVkU3RhZ2VzIjogNjMKKyAgICAgICAgfSwKKyAgICAgICAgInZlbmRvcklEIjogNDA5OAorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIjogeworICAgICAgICAibWVtb3J5SGVhcHMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImZsYWdzIjogMywKKyAgICAgICAgICAgICAgICAic2l6ZSI6IDQwMjY1MzE4NDAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImZsYWdzIjogMCwKKyAgICAgICAgICAgICAgICAic2l6ZSI6IDQyOTQ5NjcyOTYKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImZsYWdzIjogMywKKyAgICAgICAgICAgICAgICAic2l6ZSI6IDI2ODQzNTQ1NgorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAibWVtb3J5VHlwZXMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDAsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAxLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogNgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMiwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDcKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAxNAorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfSwKKyAgICAiQXJyYXlPZlZrRXh0ZW5zaW9uUHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc2hhZGVyX2RyYXdfcGFyYW1ldGVycyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zd2FwY2hhaW4iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNzAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX21haW50ZW5hbmNlMSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9tYWludGVuYW5jZTIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfbWFpbnRlbmFuY2UzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3JlbGF4ZWRfYmxvY2tfbGF5b3V0IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDMKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2V4dGVybmFsX21lbW9yeSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZGV2aWNlX2dyb3VwIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDMKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hYX2RldmljZV9ncm91cCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9iaW5kX21lbW9yeTIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZV9mZCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0FNRF9yYXN0ZXJpemF0aW9uX29yZGVyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfQU1EX3NoYWRlcl90cmluYXJ5X21pbm1heCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0FNRF9zaGFkZXJfZXhwbGljaXRfdmVydGV4X3BhcmFtZXRlciIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0FNRF9nY25fc2hhZGVyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfQU1EX2RyYXdfaW5kaXJlY3RfY291bnQiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19BTURfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfQU1EX3NoYWRlcl9pbmZvIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfRVhUX3NhbXBsZXJfZmlsdGVyX21pbm1heCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0FNRF9zaGFkZXJfZnJhZ21lbnRfbWFzayIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0FNRF90ZXh0dXJlX2dhdGhlcl9iaWFzX2xvZCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0FNRF9taXhlZF9hdHRhY2htZW50X3NhbXBsZXMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfdm90ZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl8xNmJpdF9zdG9yYWdlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3N0b3JhZ2VfYnVmZmVyX3N0b3JhZ2VfY2xhc3MiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19BTURfZ3BhX2ludGVyZmFjZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfYmFsbG90IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfRVhUX3NoYWRlcl9zdGVuY2lsX2V4cG9ydCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9zaGFkZXJfdmlld3BvcnRfaW5kZXhfbGF5ZXIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2ltYWdlX2Zvcm1hdF9saXN0IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX211bHRpdmlldyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9mZW5jZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9mZW5jZV9mZCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9nbG9iYWxfcHJpb3JpdHkiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19BTURfYnVmZmVyX21hcmtlciIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0FNRF9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9sb2QiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfZXh0ZXJuYWxfbWVtb3J5X2hvc3QiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfQU1EX3NoYWRlcl9jb3JlX3Byb3BlcnRpZXMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfcXVldWVfZmFtaWx5X2ZvcmVpZ24iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9CisgICAgXSwKKyAgICAiQXJyYXlPZlZrTGF5ZXJQcm9wZXJ0aWVzIjogW10sCisgICAgIkFycmF5T2ZWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSI6IHsKKyAgICAgICAgICAgICAgICAiZGVwdGgiOiAxLAorICAgICAgICAgICAgICAgICJoZWlnaHQiOiAxLAorICAgICAgICAgICAgICAgICJ3aWR0aCI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicXVldWVDb3VudCI6IDEsCisgICAgICAgICAgICAicXVldWVGbGFncyI6IDE1LAorICAgICAgICAgICAgInRpbWVzdGFtcFZhbGlkQml0cyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJtaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkiOiB7CisgICAgICAgICAgICAgICAgImRlcHRoIjogMSwKKyAgICAgICAgICAgICAgICAiaGVpZ2h0IjogMSwKKyAgICAgICAgICAgICAgICAid2lkdGgiOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInF1ZXVlQ291bnQiOiA4LAorICAgICAgICAgICAgInF1ZXVlRmxhZ3MiOiAxNCwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5IjogeworICAgICAgICAgICAgICAgICJkZXB0aCI6IDgsCisgICAgICAgICAgICAgICAgImhlaWdodCI6IDgsCisgICAgICAgICAgICAgICAgIndpZHRoIjogOAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJxdWV1ZUNvdW50IjogMiwKKyAgICAgICAgICAgICJxdWV1ZUZsYWdzIjogMTIsCisgICAgICAgICAgICAidGltZXN0YW1wVmFsaWRCaXRzIjogNjQKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa0Zvcm1hdFByb3BlcnRpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTA0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTA0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAzMgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTA0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTA0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAzMgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTA0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTA0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA5NgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjQsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEwNAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjQsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEwNAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDczLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTA0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyNCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTA0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjQsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMDQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTI0LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjQsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMDQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEyMjI0NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODEzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgxMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjc1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDI0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTIyMjQ3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjc1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDU2CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyODY3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjAzMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjAzMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDQ5MTUyLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA0OTE1MiwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNDkxNTIsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDQ5MTUyLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA0OTE1MiwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNDkxNTIsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDQ5MTUyLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA0OTE1MiwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNDkxNTIsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDQ5MTUyLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA0OTE1MiwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNDkxNTIsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDQ5MTUyLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA0OTE1MiwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNDkxNTIsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDQ5MTUyLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTczLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfQorICAgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvYW1kX3JhZHZfcG9sYXJpczEwLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvYW1kX3JhZHZfcG9sYXJpczEwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlM2NlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9hbWRfcmFkdl9wb2xhcmlzMTAuanNvbgpAQCAtMCwwICsxLDE1MDYgQEAKK3sKKyAgICAiJHNjaGVtYSI6ICJodHRwczovL3NjaGVtYS5raHJvbm9zLm9yZy92dWxrYW4vZGV2c2ltXzFfMF8wLmpzb24jIiwKKyAgICAiY29tbWVudHMiOiB7CisgICAgICAgICJpbmZvIjogIlZ1bGthbiBIYXJkd2FyZSBSZXBvcnQgZ2VuZXJhdGVkIHZpYSBodHRwczovL3Z1bGthbi5ncHVpbmZvLm9yZyIsCisgICAgICAgICJkZXNjIjogImh0dHBzOi8vdnVsa2FuLmdwdWluZm8ub3JnL2Rpc3BsYXlyZXBvcnQucGhwP2lkPTIxMTciCisgICAgfSwKKyAgICAiZW52aXJvbm1lbnQiOiB7CisgICAgICAgICJhcmNoaXRlY3R1cmUiOiAieDg2XzY0IiwKKyAgICAgICAgImNvbW1lbnQiOiAiIiwKKyAgICAgICAgIm5hbWUiOiAiYXJjaCIsCisgICAgICAgICJyZXBvcnR2ZXJzaW9uIjogIjEuNCIsCisgICAgICAgICJzdWJtaXR0ZXIiOiAiIiwKKyAgICAgICAgInZlcnNpb24iOiAidW5rbm93biIKKyAgICB9LAorICAgICJleHRlbmRlZCI6IHsKKyAgICAgICAgImRldmljZWZlYXR1cmVzMiI6IFtdLAorICAgICAgICAiZGV2aWNlcHJvcGVydGllczIiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfcHVzaF9kZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtYXhQdXNoRGVzY3JpcHRvcnMiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIzMiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgXQorICAgIH0sCisgICAgInBsYXRmb3JtZGV0YWlscyI6IFtdLAorICAgICJzdXJmYWNlY2FwYWJpbGl0ZXMiOiB7CisgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMSwKKyAgICAgICAgIm1heEltYWdlQ291bnQiOiAwLAorICAgICAgICAibWF4SW1hZ2VFeHRlbnQiOiB7CisgICAgICAgICAgICAiaGVpZ2h0IjogNzU1LAorICAgICAgICAgICAgIndpZHRoIjogOTI3CisgICAgICAgIH0sCisgICAgICAgICJtaW5JbWFnZUNvdW50IjogMiwKKyAgICAgICAgIm1pbkltYWdlRXh0ZW50IjogeworICAgICAgICAgICAgImhlaWdodCI6IDc1NSwKKyAgICAgICAgICAgICJ3aWR0aCI6IDkyNworICAgICAgICB9LAorICAgICAgICAicHJlc2VudG1vZGVzIjogWworICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAyCisgICAgICAgIF0sCisgICAgICAgICJzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSI6IDksCisgICAgICAgICJzdXBwb3J0ZWRUcmFuc2Zvcm1zIjogMSwKKyAgICAgICAgInN1cHBvcnRlZFVzYWdlRmxhZ3MiOiAyMywKKyAgICAgICAgInN1cmZhY2VFeHRlbnNpb24iOiAiVktfS0hSX3hjYl9zdXJmYWNlIiwKKyAgICAgICAgInN1cmZhY2Vmb3JtYXRzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb2xvclNwYWNlIjogMCwKKyAgICAgICAgICAgICAgICAiZm9ybWF0IjogNTAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImNvbG9yU3BhY2UiOiAwLAorICAgICAgICAgICAgICAgICJmb3JtYXQiOiA0NAorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAidmFsaWRTdXJmYWNlIjogdHJ1ZQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyI6IHsKKyAgICAgICAgImFscGhhVG9PbmUiOiAxLAorICAgICAgICAiZGVwdGhCaWFzQ2xhbXAiOiAxLAorICAgICAgICAiZGVwdGhCb3VuZHMiOiAxLAorICAgICAgICAiZGVwdGhDbGFtcCI6IDEsCisgICAgICAgICJkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIjogMSwKKyAgICAgICAgImR1YWxTcmNCbGVuZCI6IDEsCisgICAgICAgICJmaWxsTW9kZU5vblNvbGlkIjogMSwKKyAgICAgICAgImZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyI6IDEsCisgICAgICAgICJmdWxsRHJhd0luZGV4VWludDMyIjogMSwKKyAgICAgICAgImdlb21ldHJ5U2hhZGVyIjogMSwKKyAgICAgICAgImltYWdlQ3ViZUFycmF5IjogMSwKKyAgICAgICAgImluZGVwZW5kZW50QmxlbmQiOiAxLAorICAgICAgICAiaW5oZXJpdGVkUXVlcmllcyI6IDEsCisgICAgICAgICJsYXJnZVBvaW50cyI6IDEsCisgICAgICAgICJsb2dpY09wIjogMSwKKyAgICAgICAgIm11bHRpRHJhd0luZGlyZWN0IjogMSwKKyAgICAgICAgIm11bHRpVmlld3BvcnQiOiAxLAorICAgICAgICAib2NjbHVzaW9uUXVlcnlQcmVjaXNlIjogMSwKKyAgICAgICAgInBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5IjogMSwKKyAgICAgICAgInJvYnVzdEJ1ZmZlckFjY2VzcyI6IDEsCisgICAgICAgICJzYW1wbGVSYXRlU2hhZGluZyI6IDEsCisgICAgICAgICJzYW1wbGVyQW5pc290cm9weSI6IDEsCisgICAgICAgICJzaGFkZXJDbGlwRGlzdGFuY2UiOiAxLAorICAgICAgICAic2hhZGVyQ3VsbERpc3RhbmNlIjogMSwKKyAgICAgICAgInNoYWRlckZsb2F0NjQiOiAxLAorICAgICAgICAic2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCI6IDEsCisgICAgICAgICJzaGFkZXJJbnQxNiI6IDAsCisgICAgICAgICJzaGFkZXJJbnQ2NCI6IDEsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZU1pbkxvZCI6IDAsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSI6IDAsCisgICAgICAgICJzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlIjogMCwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0IjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdCI6IDEsCisgICAgICAgICJzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSI6IDEsCisgICAgICAgICJzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic3BhcnNlQmluZGluZyI6IDEsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MlNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5QWxpYXNlZCI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lCdWZmZXIiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lJbWFnZTNEIjogMCwKKyAgICAgICAgInRlc3NlbGxhdGlvblNoYWRlciI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUiI6IDAsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25CQyI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25FVEMyIjogMCwKKyAgICAgICAgInZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlIjogMSwKKyAgICAgICAgInZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyI6IDEsCisgICAgICAgICJ3aWRlTGluZXMiOiAxCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMiOiB7CisgICAgICAgICJhcGlWZXJzaW9uIjogNDE5NDM0NiwKKyAgICAgICAgImRldmljZUlEIjogMjY1OTEsCisgICAgICAgICJkZXZpY2VOYW1lIjogIkFNRCBSQURWIFBPTEFSSVMxMCIsCisgICAgICAgICJkZXZpY2VUeXBlIjogMiwKKyAgICAgICAgImRyaXZlclZlcnNpb24iOiA3MTMxMTM2NSwKKyAgICAgICAgImxpbWl0cyI6IHsKKyAgICAgICAgICAgICJidWZmZXJJbWFnZUdyYW51bGFyaXR5IjogNjQsCisgICAgICAgICAgICAiZGlzY3JldGVRdWV1ZVByaW9yaXRpZXMiOiAxLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHMiOiAxNSwKKyAgICAgICAgICAgICJmcmFtZWJ1ZmZlckRlcHRoU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAibGluZVdpZHRoR3JhbnVsYXJpdHkiOiAwLjAwNzgxMjUsCisgICAgICAgICAgICAibGluZVdpZHRoUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICA3Ljk5MjE4NzUKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Qm91bmREZXNjcmlwdG9yU2V0cyI6IDMyLAorICAgICAgICAgICAgIm1heENsaXBEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heENvbG9yQXR0YWNobWVudHMiOiA4LAorICAgICAgICAgICAgIm1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heENvbXB1dGVTaGFyZWRNZW1vcnlTaXplIjogMzI3NjgsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cENvdW50IjogWworICAgICAgICAgICAgICAgIDY1NTM1LAorICAgICAgICAgICAgICAgIDY1NTM1LAorICAgICAgICAgICAgICAgIDY1NTM1CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyI6IDIwNDgsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cFNpemUiOiBbCisgICAgICAgICAgICAgICAgMjA0OCwKKyAgICAgICAgICAgICAgICAyMDQ4LAorICAgICAgICAgICAgICAgIDIwNDgKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Q3VsbERpc3RhbmNlcyI6IDgsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHMiOiA5NTg2OTc5LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzIjogOTU4Njk3OSwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMiOiA5NTg2OTc5LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyI6IDk1ODY5NzksCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYyI6IDgsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFN0b3JhZ2VJbWFnZXMiOiA5NTg2OTc5LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVycyI6IDk1ODY5NzksCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzRHluYW1pYyI6IDgsCisgICAgICAgICAgICAibWF4RHJhd0luZGV4ZWRJbmRleFZhbHVlIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhEcmF3SW5kaXJlY3RDb3VudCI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlcyI6IDgsCisgICAgICAgICAgICAibWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHMiOiAxLAorICAgICAgICAgICAgIm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEZyYWdtZW50T3V0cHV0QXR0YWNobWVudHMiOiA4LAorICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVySGVpZ2h0IjogMTYzODQsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJMYXllcnMiOiAxMDI0LAorICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVyV2lkdGgiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyI6IDY0LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzIjogMjU2LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5U2hhZGVySW52b2NhdGlvbnMiOiAxMjcsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHMiOiAxMDI0LAorICAgICAgICAgICAgIm1heEltYWdlQXJyYXlMYXllcnMiOiAyMDQ4LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uMUQiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjJEIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb24zRCI6IDIwNDgsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb25DdWJlIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW50ZXJwb2xhdGlvbk9mZnNldCI6IDIsCisgICAgICAgICAgICAibWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50IjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzIjogOTU4Njk3OSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVkSW1hZ2VzIjogOTU4Njk3OSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVycyI6IDk1ODY5NzksCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMiOiA5NTg2OTc5LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXMiOiA5NTg2OTc5LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzIjogOTU4Njk3OSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZVJlc291cmNlcyI6IDk1ODY5NzksCisgICAgICAgICAgICAibWF4UHVzaENvbnN0YW50c1NpemUiOiAxMjgsCisgICAgICAgICAgICAibWF4U2FtcGxlTWFza1dvcmRzIjogMSwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50IjogNjU1MzYsCisgICAgICAgICAgICAibWF4U2FtcGxlckFuaXNvdHJvcHkiOiAxNiwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyTG9kQmlhcyI6IDE2LAorICAgICAgICAgICAgIm1heFN0b3JhZ2VCdWZmZXJSYW5nZSI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclBhdGNoT3V0cHV0Q29tcG9uZW50cyI6IDEyMCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xUb3RhbE91dHB1dENvbXBvbmVudHMiOiA0MDk2LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uR2VuZXJhdGlvbkxldmVsIjogNjQsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplIjogMzIsCisgICAgICAgICAgICAibWF4VGV4ZWxCdWZmZXJFbGVtZW50cyI6IDEzNDIxNzcyOCwKKyAgICAgICAgICAgICJtYXhUZXhlbEdhdGhlck9mZnNldCI6IDMxLAorICAgICAgICAgICAgIm1heFRleGVsT2Zmc2V0IjogMzEsCisgICAgICAgICAgICAibWF4VW5pZm9ybUJ1ZmZlclJhbmdlIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldCI6IDIwNDcsCisgICAgICAgICAgICAibWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzIjogMzIsCisgICAgICAgICAgICAibWF4VmVydGV4SW5wdXRCaW5kaW5nU3RyaWRlIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzIjogMzIsCisgICAgICAgICAgICAibWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhWaWV3cG9ydERpbWVuc2lvbnMiOiBbCisgICAgICAgICAgICAgICAgMTYzODQsCisgICAgICAgICAgICAgICAgMTYzODQKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Vmlld3BvcnRzIjogMTYsCisgICAgICAgICAgICAibWluSW50ZXJwb2xhdGlvbk9mZnNldCI6IC0yLAorICAgICAgICAgICAgIm1pbk1lbW9yeU1hcEFsaWdubWVudCI6IDQwOTYsCisgICAgICAgICAgICAibWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCI6IDQsCisgICAgICAgICAgICAibWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAxLAorICAgICAgICAgICAgIm1pblRleGVsR2F0aGVyT2Zmc2V0IjogLTMyLAorICAgICAgICAgICAgIm1pblRleGVsT2Zmc2V0IjogLTMyLAorICAgICAgICAgICAgIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiA0LAorICAgICAgICAgICAgIm1pcG1hcFByZWNpc2lvbkJpdHMiOiA0LAorICAgICAgICAgICAgIm5vbkNvaGVyZW50QXRvbVNpemUiOiA2NCwKKyAgICAgICAgICAgICJvcHRpbWFsQnVmZmVyQ29weU9mZnNldEFsaWdubWVudCI6IDEyOCwKKyAgICAgICAgICAgICJvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50IjogMTI4LAorICAgICAgICAgICAgInBvaW50U2l6ZUdyYW51bGFyaXR5IjogMC4xMjUsCisgICAgICAgICAgICAicG9pbnRTaXplUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgMC4xMjUsCisgICAgICAgICAgICAgICAgMjU1Ljg3NQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZURlcHRoU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAic2FtcGxlZEltYWdlSW50ZWdlclNhbXBsZUNvdW50cyI6IDEsCisgICAgICAgICAgICAic2FtcGxlZEltYWdlU3RlbmNpbFNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNwYXJzZUFkZHJlc3NTcGFjZVNpemUiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgInN0YW5kYXJkU2FtcGxlTG9jYXRpb25zIjogMSwKKyAgICAgICAgICAgICJzdG9yYWdlSW1hZ2VTYW1wbGVDb3VudHMiOiAxLAorICAgICAgICAgICAgInN0cmljdExpbmVzIjogMCwKKyAgICAgICAgICAgICJzdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzIjogOCwKKyAgICAgICAgICAgICJzdWJQaXhlbFByZWNpc2lvbkJpdHMiOiA0LAorICAgICAgICAgICAgInN1YlRleGVsUHJlY2lzaW9uQml0cyI6IDQsCisgICAgICAgICAgICAidGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzIjogMSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBQZXJpb2QiOiA0MCwKKyAgICAgICAgICAgICJ2aWV3cG9ydEJvdW5kc1JhbmdlIjogWworICAgICAgICAgICAgICAgIC0zMjc2OCwKKyAgICAgICAgICAgICAgICAzMjc2NworICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ2aWV3cG9ydFN1YlBpeGVsQml0cyI6IDEzCisgICAgICAgIH0sCisgICAgICAgICJwaXBlbGluZUNhY2hlVVVJRCI6IFsKKyAgICAgICAgICAgIDQ5LAorICAgICAgICAgICAgNzYsCisgICAgICAgICAgICA3LAorICAgICAgICAgICAgOTAsCisgICAgICAgICAgICAyNTIsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMTc4LAorICAgICAgICAgICAgODksCisgICAgICAgICAgICA2NCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAxMTQsCisgICAgICAgICAgICA5NywKKyAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgIDExOCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwCisgICAgICAgIF0sCisgICAgICAgICJzcGFyc2VQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInJlc2lkZW5jeUFsaWduZWRNaXBTaXplIjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdCI6IDAsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGUiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGUiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkM0RCbG9ja1NoYXBlIjogMAorICAgICAgICB9LAorICAgICAgICAidmVuZG9ySUQiOiA0MDk4CisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiOiB7CisgICAgICAgICJtZW1vcnlIZWFwcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZmxhZ3MiOiAxLAorICAgICAgICAgICAgICAgICJzaXplIjogODMwNTc3MDQ5NgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZmxhZ3MiOiAxLAorICAgICAgICAgICAgICAgICJzaXplIjogMjMzMjQ2NzIwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJmbGFncyI6IDAsCisgICAgICAgICAgICAgICAgInNpemUiOiA4NTg4MDc1MDA4CisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJtZW1vcnlUeXBlcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMCwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDIsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiA2CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAxLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogNworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMiwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDE0CisgICAgICAgICAgICB9CisgICAgICAgIF0KKyAgICB9LAorICAgICJBcnJheU9mVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIjogWworICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfaW5jcmVtZW50YWxfcHJlc2VudCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9tYWludGVuYW5jZTEiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfcHVzaF9kZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc3dhcGNoYWluIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDY4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0FNRF9kcmF3X2luZGlyZWN0X2NvdW50IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2V4dGVybmFsX21lbW9yeSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl92YXJpYWJsZV9wb2ludGVycyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmUiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfc2VtYXBob3JlX2ZkIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa0xheWVyUHJvcGVydGllcyI6IFtdLAorICAgICJBcnJheU9mVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJtaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkiOiB7CisgICAgICAgICAgICAgICAgImRlcHRoIjogMSwKKyAgICAgICAgICAgICAgICAiaGVpZ2h0IjogMSwKKyAgICAgICAgICAgICAgICAid2lkdGgiOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInF1ZXVlQ291bnQiOiAxLAorICAgICAgICAgICAgInF1ZXVlRmxhZ3MiOiAxNSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5IjogeworICAgICAgICAgICAgICAgICJkZXB0aCI6IDEsCisgICAgICAgICAgICAgICAgImhlaWdodCI6IDEsCisgICAgICAgICAgICAgICAgIndpZHRoIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJxdWV1ZUNvdW50IjogOCwKKyAgICAgICAgICAgICJxdWV1ZUZsYWdzIjogMTQsCisgICAgICAgICAgICAidGltZXN0YW1wVmFsaWRCaXRzIjogNjQKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa0Zvcm1hdFByb3BlcnRpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0Mjc1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0Mjc1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTE1ODQsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTE1ODQsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxNTg0LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxNTg0LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTE1ODQsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTE1ODQsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNDkxNTQsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTI3MzksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDQ5MTU0LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyNzM5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNDkxNTQsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTI3MzksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyNzM3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTI3MzcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTczLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfQorICAgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvZ2Vmb3JjZV8xMDgwX3RpLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvZ2Vmb3JjZV8xMDgwX3RpLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmYzU2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9nZWZvcmNlXzEwODBfdGkuanNvbgpAQCAtMCwwICsxLDIxODQgQEAKK3sKKyAgICAiJHNjaGVtYSI6ICJodHRwczovL3NjaGVtYS5raHJvbm9zLm9yZy92dWxrYW4vZGV2c2ltXzFfMF8wLmpzb24jIiwKKyAgICAiY29tbWVudHMiOiB7CisgICAgICAgICJpbmZvIjogIk1vZGlmaWVkIHZlcnNpb24gb2YgVnVsa2FuIEhhcmR3YXJlIFJlcG9ydCBnZW5lcmF0ZWQgdmlhIGh0dHBzOi8vdnVsa2FuLmdwdWluZm8ub3JnIiwKKyAgICAgICAgImRlc2MiOiAiUmVtb3ZlZCBzdWJncm91cCBwcm9wZXJ0aWVzIGZyb20gaHR0cHM6Ly92dWxrYW4uZ3B1aW5mby5vcmcvZGlzcGxheXJlcG9ydC5waHA/aWQ9MzI5MiIKKyAgICB9LAorICAgICJlbnZpcm9ubWVudCI6IHsKKyAgICAgICAgImFyY2hpdGVjdHVyZSI6ICJ4ODZfNjQiLAorICAgICAgICAiY29tbWVudCI6ICIiLAorICAgICAgICAibmFtZSI6ICJ3aW5kb3dzIiwKKyAgICAgICAgInJlcG9ydHZlcnNpb24iOiAiMS42IiwKKyAgICAgICAgInN1Ym1pdHRlciI6ICJlbG9qIiwKKyAgICAgICAgInZlcnNpb24iOiAiMTAiCisgICAgfSwKKyAgICAiZXh0ZW5kZWQiOiB7CisgICAgICAgICJkZXZpY2VmZWF0dXJlczIiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfbXVsdGl2aWV3IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtdWx0aXZpZXciLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX211bHRpdmlldyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX211bHRpdmlldyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyIiwKKyAgICAgICAgICAgICAgICAic3VwcG9ydGVkIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl92YXJpYWJsZV9wb2ludGVycyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAidmFyaWFibGVQb2ludGVyc1N0b3JhZ2VCdWZmZXIiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX3ZhcmlhYmxlX3BvaW50ZXJzIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJ2YXJpYWJsZVBvaW50ZXJzIiwKKyAgICAgICAgICAgICAgICAic3VwcG9ydGVkIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl8xNmJpdF9zdG9yYWdlIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJzdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSXzE2Yml0X3N0b3JhZ2UiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInVuaWZvcm1BbmRTdG9yYWdlQnVmZmVyMTZCaXRBY2Nlc3MiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSXzE2Yml0X3N0b3JhZ2UiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInN0b3JhZ2VQdXNoQ29uc3RhbnQxNiIsCisgICAgICAgICAgICAgICAgInN1cHBvcnRlZCI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfMTZiaXRfc3RvcmFnZSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAic3RvcmFnZUlucHV0T3V0cHV0MTYiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiBmYWxzZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9ibGVuZF9vcGVyYXRpb25fYWR2YW5jZWQiLAorICAgICAgICAgICAgICAgICJuYW1lIjogImFkdmFuY2VkQmxlbmRDb2hlcmVudE9wZXJhdGlvbnMiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX3NhbXBsZXJfeWNiY3JfY29udmVyc2lvbiIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAic2FtcGxlclljYmNyQ29udmVyc2lvbiIsCisgICAgICAgICAgICAgICAgInN1cHBvcnRlZCI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfc2hhZGVyX2RyYXdfcGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAic2hhZGVyRHJhd1BhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJkZXZpY2Vwcm9wZXJ0aWVzMiI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl9tdWx0aXZpZXciLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heE11bHRpdmlld1ZpZXdDb3VudCIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjMyIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl9tdWx0aXZpZXciLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heE11bHRpdmlld0luc3RhbmNlSW5kZXgiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIxMzQyMTc3MjciCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX3B1c2hfZGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibWF4UHVzaERlc2NyaXB0b3JzIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiMzIiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfRVhUX2Rpc2NhcmRfcmVjdGFuZ2xlcyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibWF4RGlzY2FyZFJlY3RhbmdsZXMiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICI4IgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX05WWF9tdWx0aXZpZXdfcGVyX3ZpZXdfYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAicGVyVmlld1Bvc2l0aW9uQWxsQ29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogImZhbHNlIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9jb25zZXJ2YXRpdmVfcmFzdGVyaXphdGlvbiIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAicHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiMCIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24iLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heEV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiMC43NSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24iLAorICAgICAgICAgICAgICAgICJuYW1lIjogImV4dHJhUHJpbWl0aXZlT3ZlcmVzdGltYXRpb25TaXplR3JhbnVsYXJpdHkiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIwLjI1IgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9jb25zZXJ2YXRpdmVfcmFzdGVyaXphdGlvbiIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAicHJpbWl0aXZlVW5kZXJlc3RpbWF0aW9uIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiZmFsc2UiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfRVhUX2NvbnNlcnZhdGl2ZV9yYXN0ZXJpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJjb25zZXJ2YXRpdmVQb2ludEFuZExpbmVSYXN0ZXJpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24iLAorICAgICAgICAgICAgICAgICJuYW1lIjogImRlZ2VuZXJhdGVUcmlhbmdsZXNSYXN0ZXJpemVkIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24iLAorICAgICAgICAgICAgICAgICJuYW1lIjogImRlZ2VuZXJhdGVMaW5lc1Jhc3Rlcml6ZWQiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJmYWxzZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24iLAorICAgICAgICAgICAgICAgICJuYW1lIjogImZ1bGx5Q292ZXJlZEZyYWdtZW50U2hhZGVySW5wdXRWYXJpYWJsZSIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogImZhbHNlIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9jb25zZXJ2YXRpdmVfcmFzdGVyaXphdGlvbiIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29uc2VydmF0aXZlUmFzdGVyaXphdGlvblBvc3REZXB0aENvdmVyYWdlIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJmaWx0ZXJNaW5tYXhTaW5nbGVDb21wb25lbnRGb3JtYXRzIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJmaWx0ZXJNaW5tYXhJbWFnZUNvbXBvbmVudE1hcHBpbmciLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJ0cnVlIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJzYW1wbGVMb2NhdGlvblNhbXBsZUNvdW50cyIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjMxIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtYXhTYW1wbGVMb2NhdGlvbkdyaWRTaXplLndpZHRoIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiMSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfc2FtcGxlX2xvY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibWF4U2FtcGxlTG9jYXRpb25HcmlkU2l6ZS5oZWlnaHQiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIxIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJzYW1wbGVMb2NhdGlvbkNvb3JkaW5hdGVSYW5nZVswXSIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjAiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInNhbXBsZUxvY2F0aW9uQ29vcmRpbmF0ZVJhbmdlWzFdIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiMC45Mzc1IgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJzYW1wbGVMb2NhdGlvblN1YlBpeGVsQml0cyIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjQiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInZhcmlhYmxlU2FtcGxlTG9jYXRpb25zIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJhZHZhbmNlZEJsZW5kTWF4Q29sb3JBdHRhY2htZW50cyIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjgiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfRVhUX2JsZW5kX29wZXJhdGlvbl9hZHZhbmNlZCIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiYWR2YW5jZWRCbGVuZEluZGVwZW5kZW50QmxlbmQiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJmYWxzZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZFNyY0NvbG9yIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJhZHZhbmNlZEJsZW5kTm9uUHJlbXVsdGlwbGllZERzdENvbG9yIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJhZHZhbmNlZEJsZW5kQ29ycmVsYXRlZE92ZXJsYXAiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJ0cnVlIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9ibGVuZF9vcGVyYXRpb25fYWR2YW5jZWQiLAorICAgICAgICAgICAgICAgICJuYW1lIjogImFkdmFuY2VkQmxlbmRBbGxPcGVyYXRpb25zIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJjb21iaW5lZEltYWdlU2FtcGxlckRlc2NyaXB0b3JDb3VudCIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjAiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hSX21haW50ZW5hbmNlMyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibWF4UGVyU2V0RGVzY3JpcHRvcnMiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICI0Mjk0OTY3Mjk1IgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl9tYWludGVuYW5jZTMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heE1lbW9yeUFsbG9jYXRpb25TaXplIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiNDI5Mjg3MDE0NCIKKyAgICAgICAgICAgIH0KKyAgICAgICAgXQorICAgIH0sCisgICAgImluc3RhbmNlIjogeworICAgICAgICAiZXh0ZW5zaW9ucyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfZGVidWdfcmVwb3J0IiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiA5CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9kaXNwbGF5X3N1cmZhY2VfY291bnRlciIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzMiIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc3VyZmFjZSIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMjUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3dpbjMyX3N1cmZhY2UiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDYKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2RldmljZV9ncm91cF9jcmVhdGlvbiIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfZmVuY2VfY2FwYWJpbGl0aWVzIiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfY2FwYWJpbGl0aWVzIiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfY2FwYWJpbGl0aWVzIiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WX2V4dGVybmFsX21lbW9yeV9jYXBhYmlsaXRpZXMiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfRVhUX2RlYnVnX3V0aWxzIiwKKyAgICAgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJsYXllcnMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5WSURJQSBPcHRpbXVzIGxheWVyIiwKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9ucyI6IFtdLAorICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvblZlcnNpb24iOiAxLAorICAgICAgICAgICAgICAgICJsYXllck5hbWUiOiAiVktfTEFZRVJfTlZfb3B0aW11cyIsCisgICAgICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNDE5ODQ3MAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3RlYW0gT3ZlcmxheSBMYXllciIsCisgICAgICAgICAgICAgICAgImV4dGVuc2lvbnMiOiBbXSwKKyAgICAgICAgICAgICAgICAiaW1wbGVtZW50YXRpb25WZXJzaW9uIjogMSwKKyAgICAgICAgICAgICAgICAibGF5ZXJOYW1lIjogIlZLX0xBWUVSX1ZBTFZFX3N0ZWFtX292ZXJsYXkiLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDQxOTQzMDcKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBTdGFuZGFyZCBWYWxpZGF0aW9uIExheWVyIiwKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9ucyI6IFtdLAorICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvblZlcnNpb24iOiAxLAorICAgICAgICAgICAgICAgICJsYXllck5hbWUiOiAiVktfTEFZRVJfTFVOQVJHX3N0YW5kYXJkX3ZhbGlkYXRpb24iLAorICAgICAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDQxOTQzNzcKKyAgICAgICAgICAgIH0KKyAgICAgICAgXQorICAgIH0sCisgICAgInBsYXRmb3JtZGV0YWlscyI6IFtdLAorICAgICJzdXJmYWNlY2FwYWJpbGl0ZXMiOiB7CisgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMSwKKyAgICAgICAgIm1heEltYWdlQ291bnQiOiA4LAorICAgICAgICAibWF4SW1hZ2VFeHRlbnQiOiB7CisgICAgICAgICAgICAiaGVpZ2h0IjogNzU1LAorICAgICAgICAgICAgIndpZHRoIjogOTI3CisgICAgICAgIH0sCisgICAgICAgICJtaW5JbWFnZUNvdW50IjogMiwKKyAgICAgICAgIm1pbkltYWdlRXh0ZW50IjogeworICAgICAgICAgICAgImhlaWdodCI6IDc1NSwKKyAgICAgICAgICAgICJ3aWR0aCI6IDkyNworICAgICAgICB9LAorICAgICAgICAicHJlc2VudG1vZGVzIjogWworICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIDMsCisgICAgICAgICAgICAxCisgICAgICAgIF0sCisgICAgICAgICJzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSI6IDEsCisgICAgICAgICJzdXBwb3J0ZWRUcmFuc2Zvcm1zIjogMSwKKyAgICAgICAgInN1cHBvcnRlZFVzYWdlRmxhZ3MiOiAxNTksCisgICAgICAgICJzdXJmYWNlRXh0ZW5zaW9uIjogIlZLX0tIUl93aW4zMl9zdXJmYWNlIiwKKyAgICAgICAgInN1cmZhY2Vmb3JtYXRzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb2xvclNwYWNlIjogMCwKKyAgICAgICAgICAgICAgICAiZm9ybWF0IjogNDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImNvbG9yU3BhY2UiOiAwLAorICAgICAgICAgICAgICAgICJmb3JtYXQiOiA1MAorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAidmFsaWRTdXJmYWNlIjogdHJ1ZQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyI6IHsKKyAgICAgICAgImFscGhhVG9PbmUiOiAxLAorICAgICAgICAiZGVwdGhCaWFzQ2xhbXAiOiAxLAorICAgICAgICAiZGVwdGhCb3VuZHMiOiAxLAorICAgICAgICAiZGVwdGhDbGFtcCI6IDEsCisgICAgICAgICJkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIjogMSwKKyAgICAgICAgImR1YWxTcmNCbGVuZCI6IDEsCisgICAgICAgICJmaWxsTW9kZU5vblNvbGlkIjogMSwKKyAgICAgICAgImZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyI6IDEsCisgICAgICAgICJmdWxsRHJhd0luZGV4VWludDMyIjogMSwKKyAgICAgICAgImdlb21ldHJ5U2hhZGVyIjogMSwKKyAgICAgICAgImltYWdlQ3ViZUFycmF5IjogMSwKKyAgICAgICAgImluZGVwZW5kZW50QmxlbmQiOiAxLAorICAgICAgICAiaW5oZXJpdGVkUXVlcmllcyI6IDEsCisgICAgICAgICJsYXJnZVBvaW50cyI6IDEsCisgICAgICAgICJsb2dpY09wIjogMSwKKyAgICAgICAgIm11bHRpRHJhd0luZGlyZWN0IjogMSwKKyAgICAgICAgIm11bHRpVmlld3BvcnQiOiAxLAorICAgICAgICAib2NjbHVzaW9uUXVlcnlQcmVjaXNlIjogMSwKKyAgICAgICAgInBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5IjogMSwKKyAgICAgICAgInJvYnVzdEJ1ZmZlckFjY2VzcyI6IDEsCisgICAgICAgICJzYW1wbGVSYXRlU2hhZGluZyI6IDEsCisgICAgICAgICJzYW1wbGVyQW5pc290cm9weSI6IDEsCisgICAgICAgICJzaGFkZXJDbGlwRGlzdGFuY2UiOiAxLAorICAgICAgICAic2hhZGVyQ3VsbERpc3RhbmNlIjogMSwKKyAgICAgICAgInNoYWRlckZsb2F0NjQiOiAxLAorICAgICAgICAic2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCI6IDEsCisgICAgICAgICJzaGFkZXJJbnQxNiI6IDEsCisgICAgICAgICJzaGFkZXJJbnQ2NCI6IDEsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZU1pbkxvZCI6IDEsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSI6IDEsCisgICAgICAgICJzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0IjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdCI6IDEsCisgICAgICAgICJzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSI6IDEsCisgICAgICAgICJzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic3BhcnNlQmluZGluZyI6IDEsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MlNhbXBsZXMiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5QWxpYXNlZCI6IDEsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lCdWZmZXIiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCI6IDEsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lJbWFnZTNEIjogMSwKKyAgICAgICAgInRlc3NlbGxhdGlvblNoYWRlciI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUiI6IDAsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25CQyI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25FVEMyIjogMCwKKyAgICAgICAgInZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlIjogMSwKKyAgICAgICAgInZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyI6IDEsCisgICAgICAgICJ3aWRlTGluZXMiOiAxCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMiOiB7CisgICAgICAgICJhcGlWZXJzaW9uIjogNDE5ODQ3MCwKKyAgICAgICAgImRldmljZUlEIjogNjkxOCwKKyAgICAgICAgImRldmljZU5hbWUiOiAiR2VGb3JjZSBHVFggMTA4MCBUaSIsCisgICAgICAgICJkZXZpY2VUeXBlIjogMiwKKyAgICAgICAgImRyaXZlclZlcnNpb24iOiAxNjY2NjYyNDAwLAorICAgICAgICAibGltaXRzIjogeworICAgICAgICAgICAgImJ1ZmZlckltYWdlR3JhbnVsYXJpdHkiOiAxMDI0LAorICAgICAgICAgICAgImRpc2NyZXRlUXVldWVQcmlvcml0aWVzIjogMiwKKyAgICAgICAgICAgICJmcmFtZWJ1ZmZlckNvbG9yU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJEZXB0aFNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgImZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50cyI6IDMxLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyU3RlbmNpbFNhbXBsZUNvdW50cyI6IDMxLAorICAgICAgICAgICAgImxpbmVXaWR0aEdyYW51bGFyaXR5IjogMC4xMjUsCisgICAgICAgICAgICAibGluZVdpZHRoUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgMC41LAorICAgICAgICAgICAgICAgIDEwCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heEJvdW5kRGVzY3JpcHRvclNldHMiOiA4LAorICAgICAgICAgICAgIm1heENsaXBEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heENvbG9yQXR0YWNobWVudHMiOiA4LAorICAgICAgICAgICAgIm1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heENvbXB1dGVTaGFyZWRNZW1vcnlTaXplIjogNDkxNTIsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cENvdW50IjogWworICAgICAgICAgICAgICAgIDIxNDc0ODM2NDcsCisgICAgICAgICAgICAgICAgNjU1MzUsCisgICAgICAgICAgICAgICAgNjU1MzUKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zIjogMTUzNiwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwU2l6ZSI6IFsKKyAgICAgICAgICAgICAgICAxNTM2LAorICAgICAgICAgICAgICAgIDEwMjQsCisgICAgICAgICAgICAgICAgNjQKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Q3VsbERpc3RhbmNlcyI6IDgsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHMiOiAxMDQ4NTc2LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzIjogMTA0ODU3NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMiOiAxMDQ4NTc2LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyI6IDEwNDg1NzYsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYyI6IDE2LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzIjogMTA0ODU3NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMiOiA5MCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljIjogMTUsCisgICAgICAgICAgICAibWF4RHJhd0luZGV4ZWRJbmRleFZhbHVlIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhEcmF3SW5kaXJlY3RDb3VudCI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlcyI6IDE2LAorICAgICAgICAgICAgIm1heEZyYWdtZW50RHVhbFNyY0F0dGFjaG1lbnRzIjogMSwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudE91dHB1dEF0dGFjaG1lbnRzIjogOCwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlckhlaWdodCI6IDMyNzY4LAorICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVyTGF5ZXJzIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlcldpZHRoIjogMzI3NjgsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMiOiAxMDI0LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5U2hhZGVySW52b2NhdGlvbnMiOiAzMiwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cyI6IDEwMjQsCisgICAgICAgICAgICAibWF4SW1hZ2VBcnJheUxheWVycyI6IDIwNDgsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb24xRCI6IDMyNzY4LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uMkQiOiAzMjc2OCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjNEIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb25DdWJlIjogMzI3NjgsCisgICAgICAgICAgICAibWF4SW50ZXJwb2xhdGlvbk9mZnNldCI6IDAuNDM3NSwKKyAgICAgICAgICAgICJtYXhNZW1vcnlBbGxvY2F0aW9uQ291bnQiOiA0MDk2LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMiOiAxMDQ4NTc2LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZWRJbWFnZXMiOiAxMDQ4NTc2LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzIjogMTA0ODU3NiwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVycyI6IDEwNDg1NzYsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUltYWdlcyI6IDEwNDg1NzYsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yVW5pZm9ybUJ1ZmZlcnMiOiAxNSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZVJlc291cmNlcyI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4UHVzaENvbnN0YW50c1NpemUiOiAyNTYsCisgICAgICAgICAgICAibWF4U2FtcGxlTWFza1dvcmRzIjogMSwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50IjogNDAwMCwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyQW5pc290cm9weSI6IDE2LAorICAgICAgICAgICAgIm1heFNhbXBsZXJMb2RCaWFzIjogMTUsCisgICAgICAgICAgICAibWF4U3RvcmFnZUJ1ZmZlclJhbmdlIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzIjogMTIwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyI6IDQyMTYsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25HZW5lcmF0aW9uTGV2ZWwiOiA2NCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25QYXRjaFNpemUiOiAzMiwKKyAgICAgICAgICAgICJtYXhUZXhlbEJ1ZmZlckVsZW1lbnRzIjogMTM0MjE3NzI4LAorICAgICAgICAgICAgIm1heFRleGVsR2F0aGVyT2Zmc2V0IjogMzEsCisgICAgICAgICAgICAibWF4VGV4ZWxPZmZzZXQiOiA3LAorICAgICAgICAgICAgIm1heFVuaWZvcm1CdWZmZXJSYW5nZSI6IDY1NTM2LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0IjogMjA0NywKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUiOiAyMDQ4LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ3MiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFZpZXdwb3J0RGltZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICAgICAzMjc2OCwKKyAgICAgICAgICAgICAgICAzMjc2OAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhWaWV3cG9ydHMiOiAxNiwKKyAgICAgICAgICAgICJtaW5JbnRlcnBvbGF0aW9uT2Zmc2V0IjogLTAuNSwKKyAgICAgICAgICAgICJtaW5NZW1vcnlNYXBBbGlnbm1lbnQiOiA2NCwKKyAgICAgICAgICAgICJtaW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50IjogMzIsCisgICAgICAgICAgICAibWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAxNiwKKyAgICAgICAgICAgICJtaW5UZXhlbEdhdGhlck9mZnNldCI6IC0zMiwKKyAgICAgICAgICAgICJtaW5UZXhlbE9mZnNldCI6IC04LAorICAgICAgICAgICAgIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAyNTYsCisgICAgICAgICAgICAibWlwbWFwUHJlY2lzaW9uQml0cyI6IDgsCisgICAgICAgICAgICAibm9uQ29oZXJlbnRBdG9tU2l6ZSI6IDY0LAorICAgICAgICAgICAgIm9wdGltYWxCdWZmZXJDb3B5T2Zmc2V0QWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJwb2ludFNpemVHcmFudWxhcml0eSI6IDAuMTI1LAorICAgICAgICAgICAgInBvaW50U2l6ZVJhbmdlIjogWworICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgMTg5Ljg3NQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZURlcHRoU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAic2FtcGxlZEltYWdlSW50ZWdlclNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiOiAzMSwKKyAgICAgICAgICAgICJzcGFyc2VBZGRyZXNzU3BhY2VTaXplIjogLTEsCisgICAgICAgICAgICAic3RhbmRhcmRTYW1wbGVMb2NhdGlvbnMiOiAxLAorICAgICAgICAgICAgInN0b3JhZ2VJbWFnZVNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInN0cmljdExpbmVzIjogMSwKKyAgICAgICAgICAgICJzdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzIjogNCwKKyAgICAgICAgICAgICJzdWJQaXhlbFByZWNpc2lvbkJpdHMiOiA4LAorICAgICAgICAgICAgInN1YlRleGVsUHJlY2lzaW9uQml0cyI6IDgsCisgICAgICAgICAgICAidGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzIjogMSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBQZXJpb2QiOiAxLAorICAgICAgICAgICAgInZpZXdwb3J0Qm91bmRzUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgLTY1NTM2LAorICAgICAgICAgICAgICAgIDY1NTM2CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInZpZXdwb3J0U3ViUGl4ZWxCaXRzIjogOAorICAgICAgICB9LAorICAgICAgICAicGlwZWxpbmVDYWNoZVVVSUQiOiBbCisgICAgICAgICAgICAxMjAsCisgICAgICAgICAgICAxMzIsCisgICAgICAgICAgICAyMzUsCisgICAgICAgICAgICA1MCwKKyAgICAgICAgICAgIDI0LAorICAgICAgICAgICAgMTY2LAorICAgICAgICAgICAgNzksCisgICAgICAgICAgICAzNSwKKyAgICAgICAgICAgIDE2MSwKKyAgICAgICAgICAgIDE0NCwKKyAgICAgICAgICAgIDIxOCwKKyAgICAgICAgICAgIDExMSwKKyAgICAgICAgICAgIDIxNywKKyAgICAgICAgICAgIDEzMiwKKyAgICAgICAgICAgIDI1MiwKKyAgICAgICAgICAgIDk2CisgICAgICAgIF0sCisgICAgICAgICJzcGFyc2VQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInJlc2lkZW5jeUFsaWduZWRNaXBTaXplIjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdCI6IDEsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGUiOiAxLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGUiOiAxLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkM0RCbG9ja1NoYXBlIjogMQorICAgICAgICB9LAorICAgICAgICAidmVuZG9ySUQiOiA0MzE4CisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiOiB7CisgICAgICAgICJtZW1vcnlIZWFwcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZmxhZ3MiOiAxLAorICAgICAgICAgICAgICAgICJzaXplIjogMTE2Njc1MDUxNTIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImZsYWdzIjogMCwKKyAgICAgICAgICAgICAgICAic2l6ZSI6IDY4NjU2NTYyMTc2CisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJtZW1vcnlUeXBlcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMSwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAxLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMSwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAxLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMSwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDAsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAwLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMSwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDYKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAxNAorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfSwKKyAgICAiQXJyYXlPZlZrRXh0ZW5zaW9uUHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3N3YXBjaGFpbiIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiA3MAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfMTZiaXRfc3RvcmFnZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9iaW5kX21lbW9yeTIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZGVkaWNhdGVkX2FsbG9jYXRpb24iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMworICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZGVzY3JpcHRvcl91cGRhdGVfdGVtcGxhdGUiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZGV2aWNlX2dyb3VwIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDMKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9pbWFnZV9mb3JtYXRfbGlzdCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9tYWludGVuYW5jZTEiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfbWFpbnRlbmFuY2UyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX21haW50ZW5hbmNlMyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9tdWx0aXZpZXciLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfcHVzaF9kZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3JlbGF4ZWRfYmxvY2tfbGF5b3V0IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9tZW1vcnkiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfd2luMzJfa2V5ZWRfbXV0ZXgiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfZmVuY2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfdmFyaWFibGVfcG9pbnRlcnMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFhfZGV2aWNlX2dyb3VwIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hYX211bHRpdmlldyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9ibGVuZF9vcGVyYXRpb25fYWR2YW5jZWQiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfY29uc2VydmF0aXZlX3Jhc3Rlcml6YXRpb24iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfZGVwdGhfcmFuZ2VfdW5yZXN0cmljdGVkIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfRVhUX2Rpc2NhcmRfcmVjdGFuZ2xlcyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9wb3N0X2RlcHRoX2NvdmVyYWdlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfRVhUX3NhbXBsZV9sb2NhdGlvbnMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfc2FtcGxlcl9maWx0ZXJfbWlubWF4IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfRVhUX3NoYWRlcl9zdWJncm91cF9iYWxsb3QiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfc2hhZGVyX3N1Ymdyb3VwX3ZvdGUiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfc2hhZGVyX3ZpZXdwb3J0X2luZGV4X2xheWVyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19OVl9leHRlcm5hbF9tZW1vcnkiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19OVl9leHRlcm5hbF9tZW1vcnlfd2luMzIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19OVl9maWxsX3JlY3RhbmdsZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WX2ZyYWdtZW50X2NvdmVyYWdlX3RvX2NvbG9yIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlcyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WX2dsc2xfc2hhZGVyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfd2luMzJfa2V5ZWRfbXV0ZXgiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19OVl9jbGlwX3NwYWNlX3dfc2NhbGluZyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WX3NhbXBsZV9tYXNrX292ZXJyaWRlX2NvdmVyYWdlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfdmlld3BvcnRfYXJyYXkyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfdmlld3BvcnRfc3dpenpsZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WX2dlb21ldHJ5X3NoYWRlcl9wYXNzdGhyb3VnaCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDMKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZYX211bHRpdmlld19wZXJfdmlld19hdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa0xheWVyUHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5WSURJQSBPcHRpbXVzIGxheWVyIiwKKyAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvblZlcnNpb24iOiAxLAorICAgICAgICAgICAgImxheWVyTmFtZSI6ICJWS19MQVlFUl9OVl9vcHRpbXVzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDQxOTg0NzAKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSI6IHsKKyAgICAgICAgICAgICAgICAiZGVwdGgiOiAxLAorICAgICAgICAgICAgICAgICJoZWlnaHQiOiAxLAorICAgICAgICAgICAgICAgICJ3aWR0aCI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicXVldWVDb3VudCI6IDE2LAorICAgICAgICAgICAgInF1ZXVlRmxhZ3MiOiAxNSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5IjogeworICAgICAgICAgICAgICAgICJkZXB0aCI6IDEsCisgICAgICAgICAgICAgICAgImhlaWdodCI6IDEsCisgICAgICAgICAgICAgICAgIndpZHRoIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJxdWV1ZUNvdW50IjogMSwKKyAgICAgICAgICAgICJxdWV1ZUZsYWdzIjogNCwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5IjogeworICAgICAgICAgICAgICAgICJkZXB0aCI6IDEsCisgICAgICAgICAgICAgICAgImhlaWdodCI6IDEsCisgICAgICAgICAgICAgICAgIndpZHRoIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJxdWV1ZUNvdW50IjogOCwKKyAgICAgICAgICAgICJxdWV1ZUZsYWdzIjogMiwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiA2NAorICAgICAgICB9CisgICAgXSwKKyAgICAiQXJyYXlPZlZrRm9ybWF0UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE3ODkxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE3ODkxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE1NzEzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE1NzEzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE3ODkxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE3ODkxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE1NzEzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExNzg5MSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE1NzEzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExNzg5MSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE1NzEzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExNzg5MSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE3ODk1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjIyNDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE1NzEzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExNzg5MSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE1NzEzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTU3MTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE1NzEzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExNzg5MSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTc4OTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTIyMjQzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMjI0MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTk4MDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjAzMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjAzMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMjAzMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDExNTcxMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTYyMjUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMDMyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEyMDMyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTE5ODA5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExOTgwOSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMDAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA5NDI0ODk3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDk0MjQ4OTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMDEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA5NDI0ODk3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDk0MjQ4OTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAwMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAwNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzA1OTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzMDU5MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAwNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMzYyODksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAzNjI4OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAwOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMzYyODksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAzNjI4OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAwOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMzYyODksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAzNjI4OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAxMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDk0MjQ4OTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogOTQyNDg5NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAxMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDk0MjQ4OTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogOTQyNDg5NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAxMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAxNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzMDU5MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjMwNTkzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAzNjI4OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDM2Mjg5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAzNjI4OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDM2Mjg5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDE5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAzNjI4OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDM2Mjg5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDIwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogOTQyNDg5NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA5NDI0ODk3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDIxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogOTQyNDg5NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA5NDI0ODk3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAyNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDI1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjMwNTkzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzA1OTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMjcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA5NDI0ODk3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDk0MjQ4OTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA5NDI0ODk3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDk0MjQ4OTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwMDE1NjAzMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEzNjE5MjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDMxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTM2MTkyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMDAxNTYwMzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMzYxOTIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfQorICAgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvZ2Vmb3JjZV85NDBtLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvZ2Vmb3JjZV85NDBtLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxODM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9nZWZvcmNlXzk0MG0uanNvbgpAQCAtMCwwICsxLDE2ODcgQEAKK3sKKyAgICAiJHNjaGVtYSI6ICJodHRwczovL3NjaGVtYS5raHJvbm9zLm9yZy92dWxrYW4vZGV2c2ltXzFfMF8wLmpzb24jIiwKKyAgICAiY29tbWVudHMiOiB7CisgICAgICAgICJpbmZvIjogIlZ1bGthbiBIYXJkd2FyZSBSZXBvcnQgZ2VuZXJhdGVkIHZpYSBodHRwczovL3Z1bGthbi5ncHVpbmZvLm9yZyIsCisgICAgICAgICJkZXNjIjogImh0dHBzOi8vdnVsa2FuLmdwdWluZm8ub3JnL2Rpc3BsYXlyZXBvcnQucGhwP2lkPTIxMTAiCisgICAgfSwKKyAgICAiZW52aXJvbm1lbnQiOiB7CisgICAgICAgICJhcmNoaXRlY3R1cmUiOiAieDg2XzY0IiwKKyAgICAgICAgImNvbW1lbnQiOiAiIiwKKyAgICAgICAgIm5hbWUiOiAid2luZG93cyIsCisgICAgICAgICJyZXBvcnR2ZXJzaW9uIjogIjEuNCIsCisgICAgICAgICJzdWJtaXR0ZXIiOiAiIiwKKyAgICAgICAgInZlcnNpb24iOiAiMTAiCisgICAgfSwKKyAgICAiZXh0ZW5kZWQiOiB7CisgICAgICAgICJkZXZpY2VmZWF0dXJlczIiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFhfbXVsdGl2aWV3IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtdWx0aXZpZXciLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hYX211bHRpdmlldyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIiLAorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJleHRlbnNpb24iOiAiVktfS0hYX211bHRpdmlldyIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibXVsdGl2aWV3VGVzc2VsbGF0aW9uU2hhZGVyIiwKKyAgICAgICAgICAgICAgICAic3VwcG9ydGVkIjogdHJ1ZQorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAiZGV2aWNlcHJvcGVydGllczIiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFhfbXVsdGl2aWV3IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtYXhNdWx0aXZpZXdWaWV3Q291bnQiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIzMiIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFhfbXVsdGl2aWV3IiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtYXhNdWx0aXZpZXdJbnN0YW5jZUluZGV4IiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiMTM0MjE3NzI3IgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0tIUl9wdXNoX2Rlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heFB1c2hEZXNjcmlwdG9ycyIsCisgICAgICAgICAgICAgICAgInZhbHVlIjogIjMyIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIjogIlZLX0VYVF9kaXNjYXJkX3JlY3RhbmdsZXMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1heERpc2NhcmRSZWN0YW5nbGVzIiwKKyAgICAgICAgICAgICAgICAidmFsdWUiOiAiOCIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19OVlhfbXVsdGl2aWV3X3Blcl92aWV3X2F0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInBlclZpZXdQb3NpdGlvbkFsbENvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICI4IgorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfSwKKyAgICAicGxhdGZvcm1kZXRhaWxzIjogW10sCisgICAgInN1cmZhY2VjYXBhYmlsaXRlcyI6IHsKKyAgICAgICAgIm1heEltYWdlQXJyYXlMYXllcnMiOiAxLAorICAgICAgICAibWF4SW1hZ2VDb3VudCI6IDgsCisgICAgICAgICJtYXhJbWFnZUV4dGVudCI6IHsKKyAgICAgICAgICAgICJoZWlnaHQiOiA3NDksCisgICAgICAgICAgICAid2lkdGgiOiA5MjcKKyAgICAgICAgfSwKKyAgICAgICAgIm1pbkltYWdlQ291bnQiOiAyLAorICAgICAgICAibWluSW1hZ2VFeHRlbnQiOiB7CisgICAgICAgICAgICAiaGVpZ2h0IjogNzQ5LAorICAgICAgICAgICAgIndpZHRoIjogOTI3CisgICAgICAgIH0sCisgICAgICAgICJwcmVzZW50bW9kZXMiOiBbCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgMywKKyAgICAgICAgICAgIDEKKyAgICAgICAgXSwKKyAgICAgICAgInN1cHBvcnRlZENvbXBvc2l0ZUFscGhhIjogMSwKKyAgICAgICAgInN1cHBvcnRlZFRyYW5zZm9ybXMiOiAxLAorICAgICAgICAic3VwcG9ydGVkVXNhZ2VGbGFncyI6IDE1OSwKKyAgICAgICAgInN1cmZhY2VFeHRlbnNpb24iOiAiVktfS0hSX3dpbjMyX3N1cmZhY2UiLAorICAgICAgICAic3VyZmFjZWZvcm1hdHMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImNvbG9yU3BhY2UiOiAwLAorICAgICAgICAgICAgICAgICJmb3JtYXQiOiA0NAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY29sb3JTcGFjZSI6IDAsCisgICAgICAgICAgICAgICAgImZvcm1hdCI6IDUwCisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJ2YWxpZFN1cmZhY2UiOiB0cnVlCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIjogeworICAgICAgICAiYWxwaGFUb09uZSI6IDEsCisgICAgICAgICJkZXB0aEJpYXNDbGFtcCI6IDEsCisgICAgICAgICJkZXB0aEJvdW5kcyI6IDEsCisgICAgICAgICJkZXB0aENsYW1wIjogMSwKKyAgICAgICAgImRyYXdJbmRpcmVjdEZpcnN0SW5zdGFuY2UiOiAxLAorICAgICAgICAiZHVhbFNyY0JsZW5kIjogMSwKKyAgICAgICAgImZpbGxNb2RlTm9uU29saWQiOiAxLAorICAgICAgICAiZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzIjogMSwKKyAgICAgICAgImZ1bGxEcmF3SW5kZXhVaW50MzIiOiAxLAorICAgICAgICAiZ2VvbWV0cnlTaGFkZXIiOiAxLAorICAgICAgICAiaW1hZ2VDdWJlQXJyYXkiOiAxLAorICAgICAgICAiaW5kZXBlbmRlbnRCbGVuZCI6IDEsCisgICAgICAgICJpbmhlcml0ZWRRdWVyaWVzIjogMSwKKyAgICAgICAgImxhcmdlUG9pbnRzIjogMSwKKyAgICAgICAgImxvZ2ljT3AiOiAxLAorICAgICAgICAibXVsdGlEcmF3SW5kaXJlY3QiOiAxLAorICAgICAgICAibXVsdGlWaWV3cG9ydCI6IDEsCisgICAgICAgICJvY2NsdXNpb25RdWVyeVByZWNpc2UiOiAxLAorICAgICAgICAicGlwZWxpbmVTdGF0aXN0aWNzUXVlcnkiOiAxLAorICAgICAgICAicm9idXN0QnVmZmVyQWNjZXNzIjogMSwKKyAgICAgICAgInNhbXBsZVJhdGVTaGFkaW5nIjogMSwKKyAgICAgICAgInNhbXBsZXJBbmlzb3Ryb3B5IjogMSwKKyAgICAgICAgInNoYWRlckNsaXBEaXN0YW5jZSI6IDEsCisgICAgICAgICJzaGFkZXJDdWxsRGlzdGFuY2UiOiAxLAorICAgICAgICAic2hhZGVyRmxvYXQ2NCI6IDEsCisgICAgICAgICJzaGFkZXJJbWFnZUdhdGhlckV4dGVuZGVkIjogMSwKKyAgICAgICAgInNoYWRlckludDE2IjogMCwKKyAgICAgICAgInNoYWRlckludDY0IjogMSwKKyAgICAgICAgInNoYWRlclJlc291cmNlTWluTG9kIjogMCwKKyAgICAgICAgInNoYWRlclJlc291cmNlUmVzaWRlbmN5IjogMCwKKyAgICAgICAgInNoYWRlclNhbXBsZWRJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VCdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VFeHRlbmRlZEZvcm1hdHMiOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlTXVsdGlzYW1wbGUiOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlUmVhZFdpdGhvdXRGb3JtYXQiOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlV3JpdGVXaXRob3V0Rm9ybWF0IjogMSwKKyAgICAgICAgInNoYWRlclRlc3NlbGxhdGlvbkFuZEdlb21ldHJ5UG9pbnRTaXplIjogMSwKKyAgICAgICAgInNoYWRlclVuaWZvcm1CdWZmZXJBcnJheUR5bmFtaWNJbmRleGluZyI6IDEsCisgICAgICAgICJzcGFyc2VCaW5kaW5nIjogMSwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeTE2U2FtcGxlcyI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3kyU2FtcGxlcyI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3k0U2FtcGxlcyI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3k4U2FtcGxlcyI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lBbGlhc2VkIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUJ1ZmZlciI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lJbWFnZTJEIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUltYWdlM0QiOiAwLAorICAgICAgICAidGVzc2VsbGF0aW9uU2hhZGVyIjogMSwKKyAgICAgICAgInRleHR1cmVDb21wcmVzc2lvbkFTVENfTERSIjogMCwKKyAgICAgICAgInRleHR1cmVDb21wcmVzc2lvbkJDIjogMSwKKyAgICAgICAgInRleHR1cmVDb21wcmVzc2lvbkVUQzIiOiAwLAorICAgICAgICAidmFyaWFibGVNdWx0aXNhbXBsZVJhdGUiOiAxLAorICAgICAgICAidmVydGV4UGlwZWxpbmVTdG9yZXNBbmRBdG9taWNzIjogMSwKKyAgICAgICAgIndpZGVMaW5lcyI6IDEKKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyI6IHsKKyAgICAgICAgImFwaVZlcnNpb24iOiA0MTk0MzYwLAorICAgICAgICAiZGV2aWNlSUQiOiA0OTM1LAorICAgICAgICAiZGV2aWNlTmFtZSI6ICJHZUZvcmNlIDk0ME0iLAorICAgICAgICAiZGV2aWNlVHlwZSI6IDIsCisgICAgICAgICJkcml2ZXJWZXJzaW9uIjogMTYyNzYwMjk0NCwKKyAgICAgICAgImxpbWl0cyI6IHsKKyAgICAgICAgICAgICJidWZmZXJJbWFnZUdyYW51bGFyaXR5IjogNjU1MzYsCisgICAgICAgICAgICAiZGlzY3JldGVRdWV1ZVByaW9yaXRpZXMiOiAyLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHMiOiAxNSwKKyAgICAgICAgICAgICJmcmFtZWJ1ZmZlckRlcHRoU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAibGluZVdpZHRoR3JhbnVsYXJpdHkiOiAwLjEyNSwKKyAgICAgICAgICAgICJsaW5lV2lkdGhSYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAwLjUsCisgICAgICAgICAgICAgICAgMTAKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Qm91bmREZXNjcmlwdG9yU2V0cyI6IDgsCisgICAgICAgICAgICAibWF4Q2xpcERpc3RhbmNlcyI6IDgsCisgICAgICAgICAgICAibWF4Q29sb3JBdHRhY2htZW50cyI6IDgsCisgICAgICAgICAgICAibWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlcyI6IDgsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemUiOiA0OTE1MiwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwQ291bnQiOiBbCisgICAgICAgICAgICAgICAgMjE0NzQ4MzY0NywKKyAgICAgICAgICAgICAgICA2NTUzNSwKKyAgICAgICAgICAgICAgICA2NTUzNQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMiOiAxNTM2LAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBTaXplIjogWworICAgICAgICAgICAgICAgIDE1MzYsCisgICAgICAgICAgICAgICAgMTAyNCwKKyAgICAgICAgICAgICAgICA2NAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhDdWxsRGlzdGFuY2VzIjogOCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cyI6IDgsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMiOiA5ODMwNCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMiOiA0MDAwLAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyI6IDQwOTYsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYyI6IDE2LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzIjogOTgzMDQsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzIjogNzIsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzRHluYW1pYyI6IDcyLAorICAgICAgICAgICAgIm1heERyYXdJbmRleGVkSW5kZXhWYWx1ZSI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4RHJhd0luZGlyZWN0Q291bnQiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heEZyYWdtZW50Q29tYmluZWRPdXRwdXRSZXNvdXJjZXMiOiAxNiwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudER1YWxTcmNBdHRhY2htZW50cyI6IDEsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50cyI6IDgsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJIZWlnaHQiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlckxheWVycyI6IDIwNDgsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJXaWR0aCI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzIjogMTAyNCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zIjogMzIsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHMiOiAxMDI0LAorICAgICAgICAgICAgIm1heEltYWdlQXJyYXlMYXllcnMiOiAyMDQ4LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uMUQiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjJEIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb24zRCI6IDIwNDgsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb25DdWJlIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW50ZXJwb2xhdGlvbk9mZnNldCI6IDAuNDM3NSwKKyAgICAgICAgICAgICJtYXhNZW1vcnlBbGxvY2F0aW9uQ291bnQiOiA0MDk2LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMiOiA4LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZWRJbWFnZXMiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVycyI6IDQwMDAsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMiOiA0MDk2LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXMiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyI6IDEyLAorICAgICAgICAgICAgIm1heFBlclN0YWdlUmVzb3VyY2VzIjogNTMyNjgsCisgICAgICAgICAgICAibWF4UHVzaENvbnN0YW50c1NpemUiOiAyNTYsCisgICAgICAgICAgICAibWF4U2FtcGxlTWFza1dvcmRzIjogMSwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50IjogNDAwMCwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyQW5pc290cm9weSI6IDE2LAorICAgICAgICAgICAgIm1heFNhbXBsZXJMb2RCaWFzIjogMTUsCisgICAgICAgICAgICAibWF4U3RvcmFnZUJ1ZmZlclJhbmdlIjogMjE0NzQ4MzY0NywKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzIjogMTIwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyI6IDQyMTYsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25HZW5lcmF0aW9uTGV2ZWwiOiA2NCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25QYXRjaFNpemUiOiAzMiwKKyAgICAgICAgICAgICJtYXhUZXhlbEJ1ZmZlckVsZW1lbnRzIjogMTM0MjE3NzI4LAorICAgICAgICAgICAgIm1heFRleGVsR2F0aGVyT2Zmc2V0IjogMzEsCisgICAgICAgICAgICAibWF4VGV4ZWxPZmZzZXQiOiA3LAorICAgICAgICAgICAgIm1heFVuaWZvcm1CdWZmZXJSYW5nZSI6IDY1NTM2LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0IjogMjA0NywKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUiOiAyMDQ4LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ3MiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFZpZXdwb3J0RGltZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICAgICAxNjM4NCwKKyAgICAgICAgICAgICAgICAxNjM4NAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhWaWV3cG9ydHMiOiAxNiwKKyAgICAgICAgICAgICJtaW5JbnRlcnBvbGF0aW9uT2Zmc2V0IjogLTAuNSwKKyAgICAgICAgICAgICJtaW5NZW1vcnlNYXBBbGlnbm1lbnQiOiA2NCwKKyAgICAgICAgICAgICJtaW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50IjogMzIsCisgICAgICAgICAgICAibWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAxNiwKKyAgICAgICAgICAgICJtaW5UZXhlbEdhdGhlck9mZnNldCI6IC0zMiwKKyAgICAgICAgICAgICJtaW5UZXhlbE9mZnNldCI6IC04LAorICAgICAgICAgICAgIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAyNTYsCisgICAgICAgICAgICAibWlwbWFwUHJlY2lzaW9uQml0cyI6IDgsCisgICAgICAgICAgICAibm9uQ29oZXJlbnRBdG9tU2l6ZSI6IDY0LAorICAgICAgICAgICAgIm9wdGltYWxCdWZmZXJDb3B5T2Zmc2V0QWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJwb2ludFNpemVHcmFudWxhcml0eSI6IDAuMTI1LAorICAgICAgICAgICAgInBvaW50U2l6ZVJhbmdlIjogWworICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgMTg5Ljg3NQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZURlcHRoU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAic2FtcGxlZEltYWdlSW50ZWdlclNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiOiAxNSwKKyAgICAgICAgICAgICJzcGFyc2VBZGRyZXNzU3BhY2VTaXplIjogLTEsCisgICAgICAgICAgICAic3RhbmRhcmRTYW1wbGVMb2NhdGlvbnMiOiAxLAorICAgICAgICAgICAgInN0b3JhZ2VJbWFnZVNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInN0cmljdExpbmVzIjogMSwKKyAgICAgICAgICAgICJzdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzIjogNCwKKyAgICAgICAgICAgICJzdWJQaXhlbFByZWNpc2lvbkJpdHMiOiA4LAorICAgICAgICAgICAgInN1YlRleGVsUHJlY2lzaW9uQml0cyI6IDgsCisgICAgICAgICAgICAidGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzIjogMSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBQZXJpb2QiOiAxLAorICAgICAgICAgICAgInZpZXdwb3J0Qm91bmRzUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgLTMyNzY4LAorICAgICAgICAgICAgICAgIDMyNzY4CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInZpZXdwb3J0U3ViUGl4ZWxCaXRzIjogOAorICAgICAgICB9LAorICAgICAgICAicGlwZWxpbmVDYWNoZVVVSUQiOiBbCisgICAgICAgICAgICA1LAorICAgICAgICAgICAgMjQ1LAorICAgICAgICAgICAgNDYsCisgICAgICAgICAgICAxOTYsCisgICAgICAgICAgICAxNTMsCisgICAgICAgICAgICA4MCwKKyAgICAgICAgICAgIDY3LAorICAgICAgICAgICAgMTE0LAorICAgICAgICAgICAgMTk1LAorICAgICAgICAgICAgMTgwLAorICAgICAgICAgICAgMjE0LAorICAgICAgICAgICAgOTcsCisgICAgICAgICAgICAxOTEsCisgICAgICAgICAgICAyNywKKyAgICAgICAgICAgIDk0LAorICAgICAgICAgICAgMTE1CisgICAgICAgIF0sCisgICAgICAgICJzcGFyc2VQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInJlc2lkZW5jeUFsaWduZWRNaXBTaXplIjogMSwKKyAgICAgICAgICAgICJyZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdCI6IDAsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGUiOiAxLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGUiOiAxLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkM0RCbG9ja1NoYXBlIjogMQorICAgICAgICB9LAorICAgICAgICAidmVuZG9ySUQiOiA0MzE4CisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiOiB7CisgICAgICAgICJtZW1vcnlIZWFwcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZmxhZ3MiOiAxLAorICAgICAgICAgICAgICAgICJzaXplIjogMjExOTA0MTAyNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZmxhZ3MiOiAwLAorICAgICAgICAgICAgICAgICJzaXplIjogODUwMDgwNTYzMgorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAibWVtb3J5VHlwZXMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAxLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMSwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAxLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMSwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAwLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMCwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiA2CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAxLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMTQKKyAgICAgICAgICAgIH0KKyAgICAgICAgXQorICAgIH0sCisgICAgIkFycmF5T2ZWa0V4dGVuc2lvblByb3BlcnRpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zd2FwY2hhaW4iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNjgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSXzE2Yml0X3N0b3JhZ2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfYmluZF9tZW1vcnkyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2ltYWdlX2Zvcm1hdF9saXN0IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX21haW50ZW5hbmNlMSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9tYWludGVuYW5jZTIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfcHVzaF9kZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3JlbGF4ZWRfYmxvY2tfbGF5b3V0IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9tZW1vcnkiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2V4dGVybmFsX3NlbWFwaG9yZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9zZW1hcGhvcmVfd2luMzIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfd2luMzJfa2V5ZWRfbXV0ZXgiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfZmVuY2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZXh0ZXJuYWxfZmVuY2Vfd2luMzIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfdmFyaWFibGVfcG9pbnRlcnMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFhfZGV2aWNlX2dyb3VwIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hYX2V4dGVybmFsX21lbW9yeSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIWF9leHRlcm5hbF9tZW1vcnlfd2luMzIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFhfZXh0ZXJuYWxfc2VtYXBob3JlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hYX2V4dGVybmFsX3NlbWFwaG9yZV93aW4zMiIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIWF9tdWx0aXZpZXciLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFhfd2luMzJfa2V5ZWRfbXV0ZXgiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfYmxlbmRfb3BlcmF0aW9uX2FkdmFuY2VkIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfRVhUX2RlcHRoX3JhbmdlX3VucmVzdHJpY3RlZCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9kaXNjYXJkX3JlY3RhbmdsZXMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfc2hhZGVyX3N1Ymdyb3VwX2JhbGxvdCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfdm90ZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfZXh0ZXJuYWxfbWVtb3J5IiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfZXh0ZXJuYWxfbWVtb3J5X3dpbjMyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfZ2xzbF9zaGFkZXIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19OVl93aW4zMl9rZXllZF9tdXRleCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WWF9kZXZpY2VfZ2VuZXJhdGVkX2NvbW1hbmRzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZYX211bHRpdmlld19wZXJfdmlld19hdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa0xheWVyUHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5WSURJQSBPcHRpbXVzIGxheWVyIiwKKyAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvblZlcnNpb24iOiAxLAorICAgICAgICAgICAgImxheWVyTmFtZSI6ICJWS19MQVlFUl9OVl9vcHRpbXVzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDQxOTQzNjAKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSI6IHsKKyAgICAgICAgICAgICAgICAiZGVwdGgiOiAxLAorICAgICAgICAgICAgICAgICJoZWlnaHQiOiAxLAorICAgICAgICAgICAgICAgICJ3aWR0aCI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicXVldWVDb3VudCI6IDE2LAorICAgICAgICAgICAgInF1ZXVlRmxhZ3MiOiAxNSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5IjogeworICAgICAgICAgICAgICAgICJkZXB0aCI6IDEsCisgICAgICAgICAgICAgICAgImhlaWdodCI6IDEsCisgICAgICAgICAgICAgICAgIndpZHRoIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJxdWV1ZUNvdW50IjogMSwKKyAgICAgICAgICAgICJxdWV1ZUZsYWdzIjogNCwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiA2NAorICAgICAgICB9CisgICAgXSwKKyAgICAiQXJyYXlPZlZrRm9ybWF0UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDczLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQ3ODUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0Nzg1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDc4NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0Nzg1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDc4NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTg0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDAwMTU2MDAyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMQorICAgICAgICB9CisgICAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9pbnRlbF9oZF9ncmFwaGljc181MjBfc2t5bGFrZV9ndDIuanNvbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9pbnRlbF9oZF9ncmFwaGljc181MjBfc2t5bGFrZV9ndDIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRiZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvZGV2aWNlX3Byb2ZpbGVzL2ludGVsX2hkX2dyYXBoaWNzXzUyMF9za3lsYWtlX2d0Mi5qc29uCkBAIC0wLDAgKzEsMTQ3MiBAQAoreworICAgICIkc2NoZW1hIjogImh0dHBzOi8vc2NoZW1hLmtocm9ub3Mub3JnL3Z1bGthbi9kZXZzaW1fMV8wXzAuanNvbiMiLAorICAgICJjb21tZW50cyI6IHsKKyAgICAgICAgImluZm8iOiAiVnVsa2FuIEhhcmR3YXJlIFJlcG9ydCBnZW5lcmF0ZWQgdmlhIGh0dHBzOi8vdnVsa2FuLmdwdWluZm8ub3JnIiwKKyAgICAgICAgImRlc2MiOiAiaHR0cHM6Ly92dWxrYW4uZ3B1aW5mby5vcmcvZGlzcGxheXJlcG9ydC5waHA/aWQ9MjA5OCIKKyAgICB9LAorICAgICJlbnZpcm9ubWVudCI6IHsKKyAgICAgICAgImFyY2hpdGVjdHVyZSI6ICJ4ODZfNjQiLAorICAgICAgICAiY29tbWVudCI6ICIiLAorICAgICAgICAibmFtZSI6ICJhcmNoIiwKKyAgICAgICAgInJlcG9ydHZlcnNpb24iOiAiMS40IiwKKyAgICAgICAgInN1Ym1pdHRlciI6ICJDYWlvIFNpbHZhIiwKKyAgICAgICAgInZlcnNpb24iOiAidW5rbm93biIKKyAgICB9LAorICAgICJleHRlbmRlZCI6IHsKKyAgICAgICAgImRldmljZWZlYXR1cmVzMiI6IFtdLAorICAgICAgICAiZGV2aWNlcHJvcGVydGllczIiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiI6ICJWS19LSFJfcHVzaF9kZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJtYXhQdXNoRGVzY3JpcHRvcnMiLAorICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIzMiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgXQorICAgIH0sCisgICAgInBsYXRmb3JtZGV0YWlscyI6IFtdLAorICAgICJzdXJmYWNlY2FwYWJpbGl0ZXMiOiB7CisgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMSwKKyAgICAgICAgIm1heEltYWdlQ291bnQiOiAwLAorICAgICAgICAibWF4SW1hZ2VFeHRlbnQiOiB7CisgICAgICAgICAgICAiaGVpZ2h0IjogNzU1LAorICAgICAgICAgICAgIndpZHRoIjogOTI3CisgICAgICAgIH0sCisgICAgICAgICJtaW5JbWFnZUNvdW50IjogMiwKKyAgICAgICAgIm1pbkltYWdlRXh0ZW50IjogeworICAgICAgICAgICAgImhlaWdodCI6IDc1NSwKKyAgICAgICAgICAgICJ3aWR0aCI6IDkyNworICAgICAgICB9LAorICAgICAgICAicHJlc2VudG1vZGVzIjogWworICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAyCisgICAgICAgIF0sCisgICAgICAgICJzdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSI6IDksCisgICAgICAgICJzdXBwb3J0ZWRUcmFuc2Zvcm1zIjogMSwKKyAgICAgICAgInN1cHBvcnRlZFVzYWdlRmxhZ3MiOiAyMywKKyAgICAgICAgInN1cmZhY2VFeHRlbnNpb24iOiAiVktfS0hSX3hjYl9zdXJmYWNlIiwKKyAgICAgICAgInN1cmZhY2Vmb3JtYXRzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb2xvclNwYWNlIjogMCwKKyAgICAgICAgICAgICAgICAiZm9ybWF0IjogNTAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImNvbG9yU3BhY2UiOiAwLAorICAgICAgICAgICAgICAgICJmb3JtYXQiOiA0NAorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAidmFsaWRTdXJmYWNlIjogdHJ1ZQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyI6IHsKKyAgICAgICAgImFscGhhVG9PbmUiOiAxLAorICAgICAgICAiZGVwdGhCaWFzQ2xhbXAiOiAxLAorICAgICAgICAiZGVwdGhCb3VuZHMiOiAwLAorICAgICAgICAiZGVwdGhDbGFtcCI6IDEsCisgICAgICAgICJkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIjogMSwKKyAgICAgICAgImR1YWxTcmNCbGVuZCI6IDEsCisgICAgICAgICJmaWxsTW9kZU5vblNvbGlkIjogMSwKKyAgICAgICAgImZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyI6IDEsCisgICAgICAgICJmdWxsRHJhd0luZGV4VWludDMyIjogMSwKKyAgICAgICAgImdlb21ldHJ5U2hhZGVyIjogMSwKKyAgICAgICAgImltYWdlQ3ViZUFycmF5IjogMSwKKyAgICAgICAgImluZGVwZW5kZW50QmxlbmQiOiAxLAorICAgICAgICAiaW5oZXJpdGVkUXVlcmllcyI6IDEsCisgICAgICAgICJsYXJnZVBvaW50cyI6IDEsCisgICAgICAgICJsb2dpY09wIjogMSwKKyAgICAgICAgIm11bHRpRHJhd0luZGlyZWN0IjogMSwKKyAgICAgICAgIm11bHRpVmlld3BvcnQiOiAxLAorICAgICAgICAib2NjbHVzaW9uUXVlcnlQcmVjaXNlIjogMSwKKyAgICAgICAgInBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5IjogMSwKKyAgICAgICAgInJvYnVzdEJ1ZmZlckFjY2VzcyI6IDEsCisgICAgICAgICJzYW1wbGVSYXRlU2hhZGluZyI6IDEsCisgICAgICAgICJzYW1wbGVyQW5pc290cm9weSI6IDEsCisgICAgICAgICJzaGFkZXJDbGlwRGlzdGFuY2UiOiAxLAorICAgICAgICAic2hhZGVyQ3VsbERpc3RhbmNlIjogMSwKKyAgICAgICAgInNoYWRlckZsb2F0NjQiOiAxLAorICAgICAgICAic2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCI6IDEsCisgICAgICAgICJzaGFkZXJJbnQxNiI6IDAsCisgICAgICAgICJzaGFkZXJJbnQ2NCI6IDEsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZU1pbkxvZCI6IDAsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSI6IDAsCisgICAgICAgICJzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlIjogMCwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0IjogMCwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdCI6IDEsCisgICAgICAgICJzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSI6IDEsCisgICAgICAgICJzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic3BhcnNlQmluZGluZyI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MlNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5QWxpYXNlZCI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lCdWZmZXIiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lJbWFnZTNEIjogMCwKKyAgICAgICAgInRlc3NlbGxhdGlvblNoYWRlciI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUiI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25CQyI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25FVEMyIjogMSwKKyAgICAgICAgInZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlIjogMCwKKyAgICAgICAgInZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyI6IDEsCisgICAgICAgICJ3aWRlTGluZXMiOiAxCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMiOiB7CisgICAgICAgICJhcGlWZXJzaW9uIjogNDE5NDM1OCwKKyAgICAgICAgImRldmljZUlEIjogNjQyMiwKKyAgICAgICAgImRldmljZU5hbWUiOiAiSW50ZWwoUikgSEQgR3JhcGhpY3MgNTIwIChTa3lsYWtlIEdUMikiLAorICAgICAgICAiZGV2aWNlVHlwZSI6IDEsCisgICAgICAgICJkcml2ZXJWZXJzaW9uIjogNzEzMTEzNjQsCisgICAgICAgICJsaW1pdHMiOiB7CisgICAgICAgICAgICAiYnVmZmVySW1hZ2VHcmFudWxhcml0eSI6IDY0LAorICAgICAgICAgICAgImRpc2NyZXRlUXVldWVQcmlvcml0aWVzIjogMSwKKyAgICAgICAgICAgICJmcmFtZWJ1ZmZlckNvbG9yU2FtcGxlQ291bnRzIjogMzEsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJEZXB0aFNhbXBsZUNvdW50cyI6IDMxLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50cyI6IDMxLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyU3RlbmNpbFNhbXBsZUNvdW50cyI6IDMxLAorICAgICAgICAgICAgImxpbmVXaWR0aEdyYW51bGFyaXR5IjogMC4wMDc4MTI1LAorICAgICAgICAgICAgImxpbmVXaWR0aFJhbmdlIjogWworICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgNy45OTIxODc1CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heEJvdW5kRGVzY3JpcHRvclNldHMiOiA4LAorICAgICAgICAgICAgIm1heENsaXBEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heENvbG9yQXR0YWNobWVudHMiOiA4LAorICAgICAgICAgICAgIm1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXMiOiA4LAorICAgICAgICAgICAgIm1heENvbXB1dGVTaGFyZWRNZW1vcnlTaXplIjogMzI3NjgsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cENvdW50IjogWworICAgICAgICAgICAgICAgIDY1NTM1LAorICAgICAgICAgICAgICAgIDY1NTM1LAorICAgICAgICAgICAgICAgIDY1NTM1CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyI6IDg5NiwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwU2l6ZSI6IFsKKyAgICAgICAgICAgICAgICA4OTYsCisgICAgICAgICAgICAgICAgODk2LAorICAgICAgICAgICAgICAgIDg5NgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhDdWxsRGlzdGFuY2VzIjogOCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cyI6IDI1NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlcyI6IDI1NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMiOiAyNTYsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzIjogMjU2LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWMiOiA4LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzIjogMjU2LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVycyI6IDI1NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljIjogOCwKKyAgICAgICAgICAgICJtYXhEcmF3SW5kZXhlZEluZGV4VmFsdWUiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heERyYXdJbmRpcmVjdENvdW50IjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudENvbWJpbmVkT3V0cHV0UmVzb3VyY2VzIjogOCwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudER1YWxTcmNBdHRhY2htZW50cyI6IDEsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRPdXRwdXRBdHRhY2htZW50cyI6IDgsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJIZWlnaHQiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlckxheWVycyI6IDIwNDgsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJXaWR0aCI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzIjogNjQsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMiOiAyNTYsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucyI6IDMyLAorICAgICAgICAgICAgIm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzIjogMTAyNCwKKyAgICAgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjFEIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb24yRCI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uM0QiOiAyMDQ4LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uQ3ViZSI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEludGVycG9sYXRpb25PZmZzZXQiOiAwLjQzNzUsCisgICAgICAgICAgICAibWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50IjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzIjogNjQsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVycyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVycyI6IDY0LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXMiOiA2NCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyI6IDY0LAorICAgICAgICAgICAgIm1heFBlclN0YWdlUmVzb3VyY2VzIjogMjUwLAorICAgICAgICAgICAgIm1heFB1c2hDb25zdGFudHNTaXplIjogMTI4LAorICAgICAgICAgICAgIm1heFNhbXBsZU1hc2tXb3JkcyI6IDEsCisgICAgICAgICAgICAibWF4U2FtcGxlckFsbG9jYXRpb25Db3VudCI6IDY1NTM2LAorICAgICAgICAgICAgIm1heFNhbXBsZXJBbmlzb3Ryb3B5IjogMTYsCisgICAgICAgICAgICAibWF4U2FtcGxlckxvZEJpYXMiOiAxNiwKKyAgICAgICAgICAgICJtYXhTdG9yYWdlQnVmZmVyUmFuZ2UiOiAxMDczNzQxODI0LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJQYXRjaE91dHB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleElucHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4T3V0cHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sVG90YWxPdXRwdXRDb21wb25lbnRzIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkdlbmVyYXRpb25MZXZlbCI6IDY0LAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvblBhdGNoU2l6ZSI6IDMyLAorICAgICAgICAgICAgIm1heFRleGVsQnVmZmVyRWxlbWVudHMiOiAxMzQyMTc3MjgsCisgICAgICAgICAgICAibWF4VGV4ZWxHYXRoZXJPZmZzZXQiOiAzMSwKKyAgICAgICAgICAgICJtYXhUZXhlbE9mZnNldCI6IDcsCisgICAgICAgICAgICAibWF4VW5pZm9ybUJ1ZmZlclJhbmdlIjogMTM0MjE3NzI4LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0IjogMjA0NywKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMiOiAyOCwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUiOiAyMDQ4LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ3MiOiAyOCwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFZpZXdwb3J0RGltZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICAgICAxNjM4NCwKKyAgICAgICAgICAgICAgICAxNjM4NAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhWaWV3cG9ydHMiOiAxNiwKKyAgICAgICAgICAgICJtaW5JbnRlcnBvbGF0aW9uT2Zmc2V0IjogLTAuNSwKKyAgICAgICAgICAgICJtaW5NZW1vcnlNYXBBbGlnbm1lbnQiOiA0MDk2LAorICAgICAgICAgICAgIm1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiA0LAorICAgICAgICAgICAgIm1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJtaW5UZXhlbEdhdGhlck9mZnNldCI6IC0zMiwKKyAgICAgICAgICAgICJtaW5UZXhlbE9mZnNldCI6IC04LAorICAgICAgICAgICAgIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAxNiwKKyAgICAgICAgICAgICJtaXBtYXBQcmVjaXNpb25CaXRzIjogNCwKKyAgICAgICAgICAgICJub25Db2hlcmVudEF0b21TaXplIjogNjQsCisgICAgICAgICAgICAib3B0aW1hbEJ1ZmZlckNvcHlPZmZzZXRBbGlnbm1lbnQiOiAxMjgsCisgICAgICAgICAgICAib3B0aW1hbEJ1ZmZlckNvcHlSb3dQaXRjaEFsaWdubWVudCI6IDEyOCwKKyAgICAgICAgICAgICJwb2ludFNpemVHcmFudWxhcml0eSI6IDAuMTI1LAorICAgICAgICAgICAgInBvaW50U2l6ZVJhbmdlIjogWworICAgICAgICAgICAgICAgIDAuMTI1LAorICAgICAgICAgICAgICAgIDI1NS44NzUKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAic2FtcGxlZEltYWdlQ29sb3JTYW1wbGVDb3VudHMiOiAzMSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VEZXB0aFNhbXBsZUNvdW50cyI6IDMxLAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZUludGVnZXJTYW1wbGVDb3VudHMiOiAxLAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiOiAzMSwKKyAgICAgICAgICAgICJzcGFyc2VBZGRyZXNzU3BhY2VTaXplIjogMCwKKyAgICAgICAgICAgICJzdGFuZGFyZFNhbXBsZUxvY2F0aW9ucyI6IDEsCisgICAgICAgICAgICAic3RvcmFnZUltYWdlU2FtcGxlQ291bnRzIjogMSwKKyAgICAgICAgICAgICJzdHJpY3RMaW5lcyI6IDAsCisgICAgICAgICAgICAic3ViUGl4ZWxJbnRlcnBvbGF0aW9uT2Zmc2V0Qml0cyI6IDQsCisgICAgICAgICAgICAic3ViUGl4ZWxQcmVjaXNpb25CaXRzIjogNCwKKyAgICAgICAgICAgICJzdWJUZXhlbFByZWNpc2lvbkJpdHMiOiA0LAorICAgICAgICAgICAgInRpbWVzdGFtcENvbXB1dGVBbmRHcmFwaGljcyI6IDAsCisgICAgICAgICAgICAidGltZXN0YW1wUGVyaW9kIjogODMuMzMzMzM1ODc2NSwKKyAgICAgICAgICAgICJ2aWV3cG9ydEJvdW5kc1JhbmdlIjogWworICAgICAgICAgICAgICAgIC0zMjc2OCwKKyAgICAgICAgICAgICAgICAzMjc2NworICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ2aWV3cG9ydFN1YlBpeGVsQml0cyI6IDEzCisgICAgICAgIH0sCisgICAgICAgICJwaXBlbGluZUNhY2hlVVVJRCI6IFsKKyAgICAgICAgICAgIDU1LAorICAgICAgICAgICAgMTA2LAorICAgICAgICAgICAgMjIxLAorICAgICAgICAgICAgMTE2LAorICAgICAgICAgICAgMjE2LAorICAgICAgICAgICAgMjQ0LAorICAgICAgICAgICAgMTQsCisgICAgICAgICAgICAxMjYsCisgICAgICAgICAgICAyMTAsCisgICAgICAgICAgICAzMCwKKyAgICAgICAgICAgIDE0NSwKKyAgICAgICAgICAgIDc0LAorICAgICAgICAgICAgOTgsCisgICAgICAgICAgICAzOSwKKyAgICAgICAgICAgIDUyLAorICAgICAgICAgICAgODkKKyAgICAgICAgXSwKKyAgICAgICAgInNwYXJzZVByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAicmVzaWRlbmN5QWxpZ25lZE1pcFNpemUiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeU5vblJlc2lkZW50U3RyaWN0IjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lTdGFuZGFyZDJEQmxvY2tTaGFwZSI6IDAsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQyRE11bHRpc2FtcGxlQmxvY2tTaGFwZSI6IDAsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQzREJsb2NrU2hhcGUiOiAwCisgICAgICAgIH0sCisgICAgICAgICJ2ZW5kb3JJRCI6IDMyOTAyCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiOiB7CisgICAgICAgICJtZW1vcnlIZWFwcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZmxhZ3MiOiAxLAorICAgICAgICAgICAgICAgICJzaXplIjogMTEyODkyMTE5MDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImZsYWdzIjogMSwKKyAgICAgICAgICAgICAgICAic2l6ZSI6IDEwNzM3NDE4MjQKKyAgICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgIm1lbW9yeVR5cGVzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAwLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMTUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDEsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAxNQorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfSwKKyAgICAiQXJyYXlPZlZrRXh0ZW5zaW9uUHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2RlZGljYXRlZF9hbGxvY2F0aW9uIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2Rlc2NyaXB0b3JfdXBkYXRlX3RlbXBsYXRlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2V4dGVybmFsX21lbW9yeSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9leHRlcm5hbF9tZW1vcnlfZmQiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX2luY3JlbWVudGFsX3ByZXNlbnQiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfbWFpbnRlbmFuY2UxIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3B1c2hfZGVzY3JpcHRvciIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zYW1wbGVyX21pcnJvcl9jbGFtcF90b19lZGdlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NoYWRlcl9kcmF3X3BhcmFtZXRlcnMiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfc3RvcmFnZV9idWZmZXJfc3RvcmFnZV9jbGFzcyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zd2FwY2hhaW4iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNjgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3ZhcmlhYmxlX3BvaW50ZXJzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa0xheWVyUHJvcGVydGllcyI6IFtdLAorICAgICJBcnJheU9mVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJtaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkiOiB7CisgICAgICAgICAgICAgICAgImRlcHRoIjogMSwKKyAgICAgICAgICAgICAgICAiaGVpZ2h0IjogMSwKKyAgICAgICAgICAgICAgICAid2lkdGgiOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInF1ZXVlQ291bnQiOiAxLAorICAgICAgICAgICAgInF1ZXVlRmxhZ3MiOiA3LAorICAgICAgICAgICAgInRpbWVzdGFtcFZhbGlkQml0cyI6IDM2CisgICAgICAgIH0KKyAgICBdLAorICAgICJBcnJheU9mVmtGb3JtYXRQcm9wZXJ0aWVzIjogWworICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY0NDksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY0NDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjQ0OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjQ0OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDczLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDEyMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjczNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjczNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjczNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjczNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyNzM3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyNzM3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0KKyAgICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvZGV2aWNlX3Byb2ZpbGVzL21vYmlsZV9jaGlwLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvbW9iaWxlX2NoaXAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjRjZDJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvZGV2aWNlX3Byb2ZpbGVzL21vYmlsZV9jaGlwLmpzb24KQEAgLTAsMCArMSwxNDM2IEBACit7CisgICAgIiRzY2hlbWEiOiAiaHR0cHM6Ly9zY2hlbWEua2hyb25vcy5vcmcvdnVsa2FuL2RldnNpbV8xXzBfMC5qc29uIyIsCisgICAgImNvbW1lbnRzIjogeworICAgICAgICAiaW5mbyI6ICJWdWxrYW4gSGFyZHdhcmUgUmVwb3J0IGdlbmVyYXRlZCB2aWEgaHR0cHM6Ly92dWxrYW4uZ3B1aW5mby5vcmciLAorICAgICAgICAiZGVzYyI6ICIiCisgICAgfSwKKyAgICAiZW52aXJvbm1lbnQiOiB7CisgICAgICAgICJhcmNoaXRlY3R1cmUiOiAiIiwKKyAgICAgICAgImNvbW1lbnQiOiAiIiwKKyAgICAgICAgIm5hbWUiOiAiIiwKKyAgICAgICAgInJlcG9ydHZlcnNpb24iOiAiMS40IiwKKyAgICAgICAgInN1Ym1pdHRlciI6ICIiLAorICAgICAgICAidmVyc2lvbiI6ICIiCisgICAgfSwKKyAgICAiZXh0ZW5kZWQiOiB7CisgICAgICAgICJkZXZpY2VmZWF0dXJlczIiOiBbXSwKKyAgICAgICAgImRldmljZXByb3BlcnRpZXMyIjogW10KKyAgICB9LAorICAgICJwbGF0Zm9ybWRldGFpbHMiOiB7CisgICAgICAgICJhbmRyb2lkLkJ1aWxkSUQiOiAiIiwKKyAgICAgICAgImFuZHJvaWQuQnVpbGRWZXJzaW9uSW5jcmVtZW50YWwiOiAiIiwKKyAgICAgICAgImFuZHJvaWQuUHJvZHVjdE1hbnVmYWN0dXJlciI6ICIiLAorICAgICAgICAiYW5kcm9pZC5Qcm9kdWN0TW9kZWwiOiAiIgorICAgIH0sCisgICAgInN1cmZhY2VjYXBhYmlsaXRlcyI6IHsKKyAgICAgICAgIm1heEltYWdlQXJyYXlMYXllcnMiOiAxLAorICAgICAgICAibWF4SW1hZ2VDb3VudCI6IDMsCisgICAgICAgICJtYXhJbWFnZUV4dGVudCI6IHsKKyAgICAgICAgICAgICJoZWlnaHQiOiA0MDk2LAorICAgICAgICAgICAgIndpZHRoIjogNDA5NgorICAgICAgICB9LAorICAgICAgICAibWluSW1hZ2VDb3VudCI6IDIsCisgICAgICAgICJtaW5JbWFnZUV4dGVudCI6IHsKKyAgICAgICAgICAgICJoZWlnaHQiOiAxLAorICAgICAgICAgICAgIndpZHRoIjogMQorICAgICAgICB9LAorICAgICAgICAicHJlc2VudG1vZGVzIjogWworICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIDIKKyAgICAgICAgXSwKKyAgICAgICAgInN1cHBvcnRlZENvbXBvc2l0ZUFscGhhIjogOCwKKyAgICAgICAgInN1cHBvcnRlZFRyYW5zZm9ybXMiOiAyNzEsCisgICAgICAgICJzdXBwb3J0ZWRVc2FnZUZsYWdzIjogMTU5LAorICAgICAgICAic3VyZmFjZUV4dGVuc2lvbiI6ICJWS19LSFJfYW5kcm9pZF9zdXJmYWNlIiwKKyAgICAgICAgInN1cmZhY2Vmb3JtYXRzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb2xvclNwYWNlIjogMCwKKyAgICAgICAgICAgICAgICAiZm9ybWF0IjogMzcKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImNvbG9yU3BhY2UiOiAwLAorICAgICAgICAgICAgICAgICJmb3JtYXQiOiA0MworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY29sb3JTcGFjZSI6IDAsCisgICAgICAgICAgICAgICAgImZvcm1hdCI6IDQKKyAgICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgInZhbGlkU3VyZmFjZSI6IHRydWUKKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMiOiB7CisgICAgICAgICJhbHBoYVRvT25lIjogMCwKKyAgICAgICAgImRlcHRoQmlhc0NsYW1wIjogMSwKKyAgICAgICAgImRlcHRoQm91bmRzIjogMCwKKyAgICAgICAgImRlcHRoQ2xhbXAiOiAwLAorICAgICAgICAiZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSI6IDEsCisgICAgICAgICJkdWFsU3JjQmxlbmQiOiAwLAorICAgICAgICAiZmlsbE1vZGVOb25Tb2xpZCI6IDAsCisgICAgICAgICJmcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MiOiAxLAorICAgICAgICAiZnVsbERyYXdJbmRleFVpbnQzMiI6IDEsCisgICAgICAgICJnZW9tZXRyeVNoYWRlciI6IDAsCisgICAgICAgICJpbWFnZUN1YmVBcnJheSI6IDAsCisgICAgICAgICJpbmRlcGVuZGVudEJsZW5kIjogMSwKKyAgICAgICAgImluaGVyaXRlZFF1ZXJpZXMiOiAwLAorICAgICAgICAibGFyZ2VQb2ludHMiOiAxLAorICAgICAgICAibG9naWNPcCI6IDAsCisgICAgICAgICJtdWx0aURyYXdJbmRpcmVjdCI6IDAsCisgICAgICAgICJtdWx0aVZpZXdwb3J0IjogMCwKKyAgICAgICAgIm9jY2x1c2lvblF1ZXJ5UHJlY2lzZSI6IDAsCisgICAgICAgICJwaXBlbGluZVN0YXRpc3RpY3NRdWVyeSI6IDAsCisgICAgICAgICJyb2J1c3RCdWZmZXJBY2Nlc3MiOiAxLAorICAgICAgICAic2FtcGxlUmF0ZVNoYWRpbmciOiAwLAorICAgICAgICAic2FtcGxlckFuaXNvdHJvcHkiOiAwLAorICAgICAgICAic2hhZGVyQ2xpcERpc3RhbmNlIjogMCwKKyAgICAgICAgInNoYWRlckN1bGxEaXN0YW5jZSI6IDAsCisgICAgICAgICJzaGFkZXJGbG9hdDY0IjogMCwKKyAgICAgICAgInNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQiOiAxLAorICAgICAgICAic2hhZGVySW50MTYiOiAwLAorICAgICAgICAic2hhZGVySW50NjQiOiAwLAorICAgICAgICAic2hhZGVyUmVzb3VyY2VNaW5Mb2QiOiAwLAorICAgICAgICAic2hhZGVyUmVzb3VyY2VSZXNpZGVuY3kiOiAwLAorICAgICAgICAic2hhZGVyU2FtcGxlZEltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZUFycmF5RHluYW1pY0luZGV4aW5nIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZUV4dGVuZGVkRm9ybWF0cyI6IDAsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VNdWx0aXNhbXBsZSI6IDAsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VSZWFkV2l0aG91dEZvcm1hdCI6IDAsCisgICAgICAgICJzaGFkZXJTdG9yYWdlSW1hZ2VXcml0ZVdpdGhvdXRGb3JtYXQiOiAwLAorICAgICAgICAic2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUiOiAwLAorICAgICAgICAic2hhZGVyVW5pZm9ybUJ1ZmZlckFycmF5RHluYW1pY0luZGV4aW5nIjogMSwKKyAgICAgICAgInNwYXJzZUJpbmRpbmciOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MTZTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeTJTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeTRTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeThTYW1wbGVzIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUFsaWFzZWQiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5QnVmZmVyIjogMCwKKyAgICAgICAgInNwYXJzZVJlc2lkZW5jeUltYWdlMkQiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5SW1hZ2UzRCI6IDAsCisgICAgICAgICJ0ZXNzZWxsYXRpb25TaGFkZXIiOiAwLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uQVNUQ19MRFIiOiAxLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uQkMiOiAwLAorICAgICAgICAidGV4dHVyZUNvbXByZXNzaW9uRVRDMiI6IDEsCisgICAgICAgICJ2YXJpYWJsZU11bHRpc2FtcGxlUmF0ZSI6IDAsCisgICAgICAgICJ2ZXJ0ZXhQaXBlbGluZVN0b3Jlc0FuZEF0b21pY3MiOiAwLAorICAgICAgICAid2lkZUxpbmVzIjogMAorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIjogeworICAgICAgICAiYXBpVmVyc2lvbiI6IDQxOTQzMjIsCisgICAgICAgICJkZXZpY2VJRCI6IDEyMjY4MzM5MywKKyAgICAgICAgImRldmljZU5hbWUiOiAiTWFsaS1UNzYwIiwKKyAgICAgICAgImRldmljZVR5cGUiOiAxLAorICAgICAgICAiZHJpdmVyVmVyc2lvbiI6IDI3MzQwNzAxNzQsCisgICAgICAgICJsaW1pdHMiOiB7CisgICAgICAgICAgICAiYnVmZmVySW1hZ2VHcmFudWxhcml0eSI6IDQwOTYsCisgICAgICAgICAgICAiZGlzY3JldGVRdWV1ZVByaW9yaXRpZXMiOiAyLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHMiOiA1LAorICAgICAgICAgICAgImZyYW1lYnVmZmVyRGVwdGhTYW1wbGVDb3VudHMiOiA1LAorICAgICAgICAgICAgImZyYW1lYnVmZmVyTm9BdHRhY2htZW50c1NhbXBsZUNvdW50cyI6IDUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzIjogNSwKKyAgICAgICAgICAgICJsaW5lV2lkdGhHcmFudWxhcml0eSI6IDAsCisgICAgICAgICAgICAibGluZVdpZHRoUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAxCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heEJvdW5kRGVzY3JpcHRvclNldHMiOiA0LAorICAgICAgICAgICAgIm1heENsaXBEaXN0YW5jZXMiOiAwLAorICAgICAgICAgICAgIm1heENvbG9yQXR0YWNobWVudHMiOiA0LAorICAgICAgICAgICAgIm1heENvbWJpbmVkQ2xpcEFuZEN1bGxEaXN0YW5jZXMiOiAwLAorICAgICAgICAgICAgIm1heENvbXB1dGVTaGFyZWRNZW1vcnlTaXplIjogMzI3NjgsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cENvdW50IjogWworICAgICAgICAgICAgICAgIDY1NTM2LAorICAgICAgICAgICAgICAgIDY1NTM2LAorICAgICAgICAgICAgICAgIDY1NTM2CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucyI6IDI1NiwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwU2l6ZSI6IFsKKyAgICAgICAgICAgICAgICAyNTYsCisgICAgICAgICAgICAgICAgMjU2LAorICAgICAgICAgICAgICAgIDI1NgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhDdWxsRGlzdGFuY2VzIjogMCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cyI6IDQsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMiOiA5NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMiOiA3NjgsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzIjogMjQsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYyI6IDQsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFN0b3JhZ2VJbWFnZXMiOiAyNCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMiOiA3MiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnNEeW5hbWljIjogOCwKKyAgICAgICAgICAgICJtYXhEcmF3SW5kZXhlZEluZGV4VmFsdWUiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heERyYXdJbmRpcmVjdENvdW50IjogMSwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudENvbWJpbmVkT3V0cHV0UmVzb3VyY2VzIjogMTIsCisgICAgICAgICAgICAibWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHMiOiAwLAorICAgICAgICAgICAgIm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEZyYWdtZW50T3V0cHV0QXR0YWNobWVudHMiOiA0LAorICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVySGVpZ2h0IjogODE5MiwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlckxheWVycyI6IDI1NiwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlcldpZHRoIjogODE5MiwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIjogMCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzIjogMCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zIjogMCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4SW1hZ2VBcnJheUxheWVycyI6IDI1NiwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjFEIjogODE5MiwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjJEIjogODE5MiwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjNEIjogNDA5NiwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbkN1YmUiOiA4MTkyLAorICAgICAgICAgICAgIm1heEludGVycG9sYXRpb25PZmZzZXQiOiAwLAorICAgICAgICAgICAgIm1heE1lbW9yeUFsbG9jYXRpb25Db3VudCI6IDQyOTQ5NjcyOTUsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5wdXRBdHRhY2htZW50cyI6IDQsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyI6IDE2LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzIjogMTI4LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VCdWZmZXJzIjogNCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzIjogNCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyI6IDEyLAorICAgICAgICAgICAgIm1heFBlclN0YWdlUmVzb3VyY2VzIjogNDQsCisgICAgICAgICAgICAibWF4UHVzaENvbnN0YW50c1NpemUiOiAxMjgsCisgICAgICAgICAgICAibWF4U2FtcGxlTWFza1dvcmRzIjogMSwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50IjogMTYzODQsCisgICAgICAgICAgICAibWF4U2FtcGxlckFuaXNvdHJvcHkiOiAxLAorICAgICAgICAgICAgIm1heFNhbXBsZXJMb2RCaWFzIjogMiwKKyAgICAgICAgICAgICJtYXhTdG9yYWdlQnVmZmVyUmFuZ2UiOiAxMzQyMTc3MjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclBhdGNoT3V0cHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleElucHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xUb3RhbE91dHB1dENvbXBvbmVudHMiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dENvbXBvbmVudHMiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzIjogMCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25HZW5lcmF0aW9uTGV2ZWwiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvblBhdGNoU2l6ZSI6IDAsCisgICAgICAgICAgICAibWF4VGV4ZWxCdWZmZXJFbGVtZW50cyI6IDY1NTM2LAorICAgICAgICAgICAgIm1heFRleGVsR2F0aGVyT2Zmc2V0IjogNywKKyAgICAgICAgICAgICJtYXhUZXhlbE9mZnNldCI6IDcsCisgICAgICAgICAgICAibWF4VW5pZm9ybUJ1ZmZlclJhbmdlIjogMTYzODQsCisgICAgICAgICAgICAibWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQiOiAyMDQ3LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QXR0cmlidXRlcyI6IDE2LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSI6IDIwNDgsCisgICAgICAgICAgICAibWF4VmVydGV4SW5wdXRCaW5kaW5ncyI6IDE2LAorICAgICAgICAgICAgIm1heFZlcnRleE91dHB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4Vmlld3BvcnREaW1lbnNpb25zIjogWworICAgICAgICAgICAgICAgIDgxOTIsCisgICAgICAgICAgICAgICAgODE5MgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhWaWV3cG9ydHMiOiAxLAorICAgICAgICAgICAgIm1pbkludGVycG9sYXRpb25PZmZzZXQiOiAwLAorICAgICAgICAgICAgIm1pbk1lbW9yeU1hcEFsaWdubWVudCI6IDY0LAorICAgICAgICAgICAgIm1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAyNTYsCisgICAgICAgICAgICAibWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAyNTYsCisgICAgICAgICAgICAibWluVGV4ZWxHYXRoZXJPZmZzZXQiOiAtOCwKKyAgICAgICAgICAgICJtaW5UZXhlbE9mZnNldCI6IC04LAorICAgICAgICAgICAgIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAxNiwKKyAgICAgICAgICAgICJtaXBtYXBQcmVjaXNpb25CaXRzIjogNCwKKyAgICAgICAgICAgICJub25Db2hlcmVudEF0b21TaXplIjogNjQsCisgICAgICAgICAgICAib3B0aW1hbEJ1ZmZlckNvcHlPZmZzZXRBbGlnbm1lbnQiOiA2NCwKKyAgICAgICAgICAgICJvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50IjogNjQsCisgICAgICAgICAgICAicG9pbnRTaXplR3JhbnVsYXJpdHkiOiAwLjA2MjUsCisgICAgICAgICAgICAicG9pbnRTaXplUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICA2NAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyI6IDUsCisgICAgICAgICAgICAic2FtcGxlZEltYWdlRGVwdGhTYW1wbGVDb3VudHMiOiA1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZUludGVnZXJTYW1wbGVDb3VudHMiOiAxLAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiOiA1LAorICAgICAgICAgICAgInNwYXJzZUFkZHJlc3NTcGFjZVNpemUiOiAwLAorICAgICAgICAgICAgInN0YW5kYXJkU2FtcGxlTG9jYXRpb25zIjogMSwKKyAgICAgICAgICAgICJzdG9yYWdlSW1hZ2VTYW1wbGVDb3VudHMiOiAxLAorICAgICAgICAgICAgInN0cmljdExpbmVzIjogMSwKKyAgICAgICAgICAgICJzdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzIjogMCwKKyAgICAgICAgICAgICJzdWJQaXhlbFByZWNpc2lvbkJpdHMiOiA0LAorICAgICAgICAgICAgInN1YlRleGVsUHJlY2lzaW9uQml0cyI6IDQsCisgICAgICAgICAgICAidGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzIjogMCwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBQZXJpb2QiOiAwLAorICAgICAgICAgICAgInZpZXdwb3J0Qm91bmRzUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgLTE2Mzg0LAorICAgICAgICAgICAgICAgIDE2MzgzCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInZpZXdwb3J0U3ViUGl4ZWxCaXRzIjogMAorICAgICAgICB9LAorICAgICAgICAicGlwZWxpbmVDYWNoZVVVSUQiOiBbCisgICAgICAgICAgICA4OCwKKyAgICAgICAgICAgIDUsCisgICAgICAgICAgICA0OSwKKyAgICAgICAgICAgIDY4LAorICAgICAgICAgICAgNjMsCisgICAgICAgICAgICAyMzQsCisgICAgICAgICAgICAxNSwKKyAgICAgICAgICAgIDc5LAorICAgICAgICAgICAgMTA1LAorICAgICAgICAgICAgMTA5LAorICAgICAgICAgICAgMTc3LAorICAgICAgICAgICAgMTQ5LAorICAgICAgICAgICAgMTIzLAorICAgICAgICAgICAgMjI2LAorICAgICAgICAgICAgMjM2LAorICAgICAgICAgICAgMTc5CisgICAgICAgIF0sCisgICAgICAgICJzcGFyc2VQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInJlc2lkZW5jeUFsaWduZWRNaXBTaXplIjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lOb25SZXNpZGVudFN0cmljdCI6IDAsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQyREJsb2NrU2hhcGUiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkMkRNdWx0aXNhbXBsZUJsb2NrU2hhcGUiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkM0RCbG9ja1NoYXBlIjogMAorICAgICAgICB9LAorICAgICAgICAidmVuZG9ySUQiOiA1MDQ1CisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMiOiB7CisgICAgICAgICJtZW1vcnlIZWFwcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZmxhZ3MiOiAxLAorICAgICAgICAgICAgICAgICJzaXplIjogMjEwODg3NDc1MgorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAibWVtb3J5VHlwZXMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDAsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiA3CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAwLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogMTEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDAsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAxNworICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfSwKKyAgICAiQXJyYXlPZlZrRXh0ZW5zaW9uUHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3N3YXBjaGFpbiIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiA2OAorICAgICAgICB9CisgICAgXSwKKyAgICAiQXJyYXlPZlZrTGF5ZXJQcm9wZXJ0aWVzIjogW10sCisgICAgIkFycmF5T2ZWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSI6IHsKKyAgICAgICAgICAgICAgICAiZGVwdGgiOiAxLAorICAgICAgICAgICAgICAgICJoZWlnaHQiOiAxLAorICAgICAgICAgICAgICAgICJ3aWR0aCI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicXVldWVDb3VudCI6IDIsCisgICAgICAgICAgICAicXVldWVGbGFncyI6IDcsCisgICAgICAgICAgICAidGltZXN0YW1wVmFsaWRCaXRzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5IjogeworICAgICAgICAgICAgICAgICJkZXB0aCI6IDEsCisgICAgICAgICAgICAgICAgImhlaWdodCI6IDEsCisgICAgICAgICAgICAgICAgIndpZHRoIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJxdWV1ZUNvdW50IjogMiwKKyAgICAgICAgICAgICJxdWV1ZUZsYWdzIjogMSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiAwCisgICAgICAgIH0KKyAgICBdLAorICAgICJBcnJheU9mVmtGb3JtYXRQcm9wZXJ0aWVzIjogWworICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDc1NTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDc1NTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDc1NTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDc1NTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDc1NTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA3NTU1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDc1NTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDc1NTMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDc1NTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDc1NTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDc1NTMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDc1NTUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwNywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDcyOTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzI5OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDcyOTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzI5OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDcyOTksCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzI5OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDcyOTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzI5NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NjMzLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2MzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU2MzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTYzMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTYzMywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjMzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTEyMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUxMjEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0KKyAgICBdCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvbnZpZGlhX3RlZ3JhX3gxLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9kZXZpY2VfcHJvZmlsZXMvbnZpZGlhX3RlZ3JhX3gxLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMjk3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9udmlkaWFfdGVncmFfeDEuanNvbgpAQCAtMCwwICsxLDE0NjIgQEAKK3sKKyAgICAiJHNjaGVtYSI6ICJodHRwczovL3NjaGVtYS5raHJvbm9zLm9yZy92dWxrYW4vZGV2c2ltXzFfMF8wLmpzb24jIiwKKyAgICAiY29tbWVudHMiOiB7CisgICAgICAgICJpbmZvIjogIlZ1bGthbiBIYXJkd2FyZSBSZXBvcnQgZ2VuZXJhdGVkIHZpYSBodHRwczovL3Z1bGthbi5ncHVpbmZvLm9yZyIsCisgICAgICAgICJkZXNjIjogImh0dHBzOi8vdnVsa2FuLmdwdWluZm8ub3JnL2Rpc3BsYXlyZXBvcnQucGhwP2lkPTIxMTUiCisgICAgfSwKKyAgICAiZW52aXJvbm1lbnQiOiB7CisgICAgICAgICJhcmNoaXRlY3R1cmUiOiAiYXJtIiwKKyAgICAgICAgImNvbW1lbnQiOiAiIiwKKyAgICAgICAgIm5hbWUiOiAiYW5kcm9pZCIsCisgICAgICAgICJyZXBvcnR2ZXJzaW9uIjogIjEuNCIsCisgICAgICAgICJzdWJtaXR0ZXIiOiAiZG9jb2ZrdWx0IiwKKyAgICAgICAgInZlcnNpb24iOiAiOC4xLjAiCisgICAgfSwKKyAgICAiZXh0ZW5kZWQiOiB7CisgICAgICAgICJkZXZpY2VmZWF0dXJlczIiOiBbXSwKKyAgICAgICAgImRldmljZXByb3BlcnRpZXMyIjogW10KKyAgICB9LAorICAgICJwbGF0Zm9ybWRldGFpbHMiOiB7CisgICAgICAgICJhbmRyb2lkLkJ1aWxkSUQiOiAiT1BQNS4xNzA5MjEuMDA1IiwKKyAgICAgICAgImFuZHJvaWQuQnVpbGRWZXJzaW9uSW5jcmVtZW50YWwiOiAiNDM3MzQ0OSIsCisgICAgICAgICJhbmRyb2lkLlByb2R1Y3RNYW51ZmFjdHVyZXIiOiAiR29vZ2xlIiwKKyAgICAgICAgImFuZHJvaWQuUHJvZHVjdE1vZGVsIjogIlBpeGVsIEMiCisgICAgfSwKKyAgICAic3VyZmFjZWNhcGFiaWxpdGVzIjogeworICAgICAgICAibWF4SW1hZ2VBcnJheUxheWVycyI6IDEsCisgICAgICAgICJtYXhJbWFnZUNvdW50IjogMywKKyAgICAgICAgIm1heEltYWdlRXh0ZW50IjogeworICAgICAgICAgICAgImhlaWdodCI6IDQwOTYsCisgICAgICAgICAgICAid2lkdGgiOiA0MDk2CisgICAgICAgIH0sCisgICAgICAgICJtaW5JbWFnZUNvdW50IjogMiwKKyAgICAgICAgIm1pbkltYWdlRXh0ZW50IjogeworICAgICAgICAgICAgImhlaWdodCI6IDEsCisgICAgICAgICAgICAid2lkdGgiOiAxCisgICAgICAgIH0sCisgICAgICAgICJwcmVzZW50bW9kZXMiOiBbCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMgorICAgICAgICBdLAorICAgICAgICAic3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEiOiA4LAorICAgICAgICAic3VwcG9ydGVkVHJhbnNmb3JtcyI6IDI3MSwKKyAgICAgICAgInN1cHBvcnRlZFVzYWdlRmxhZ3MiOiAxNTksCisgICAgICAgICJzdXJmYWNlRXh0ZW5zaW9uIjogIlZLX0tIUl9hbmRyb2lkX3N1cmZhY2UiLAorICAgICAgICAic3VyZmFjZWZvcm1hdHMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImNvbG9yU3BhY2UiOiAwLAorICAgICAgICAgICAgICAgICJmb3JtYXQiOiAzNworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY29sb3JTcGFjZSI6IDAsCisgICAgICAgICAgICAgICAgImZvcm1hdCI6IDQzCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb2xvclNwYWNlIjogMCwKKyAgICAgICAgICAgICAgICAiZm9ybWF0IjogNAorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAidmFsaWRTdXJmYWNlIjogdHJ1ZQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyI6IHsKKyAgICAgICAgImFscGhhVG9PbmUiOiAxLAorICAgICAgICAiZGVwdGhCaWFzQ2xhbXAiOiAxLAorICAgICAgICAiZGVwdGhCb3VuZHMiOiAxLAorICAgICAgICAiZGVwdGhDbGFtcCI6IDEsCisgICAgICAgICJkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIjogMSwKKyAgICAgICAgImR1YWxTcmNCbGVuZCI6IDEsCisgICAgICAgICJmaWxsTW9kZU5vblNvbGlkIjogMSwKKyAgICAgICAgImZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyI6IDEsCisgICAgICAgICJmdWxsRHJhd0luZGV4VWludDMyIjogMSwKKyAgICAgICAgImdlb21ldHJ5U2hhZGVyIjogMSwKKyAgICAgICAgImltYWdlQ3ViZUFycmF5IjogMSwKKyAgICAgICAgImluZGVwZW5kZW50QmxlbmQiOiAxLAorICAgICAgICAiaW5oZXJpdGVkUXVlcmllcyI6IDEsCisgICAgICAgICJsYXJnZVBvaW50cyI6IDEsCisgICAgICAgICJsb2dpY09wIjogMSwKKyAgICAgICAgIm11bHRpRHJhd0luZGlyZWN0IjogMSwKKyAgICAgICAgIm11bHRpVmlld3BvcnQiOiAxLAorICAgICAgICAib2NjbHVzaW9uUXVlcnlQcmVjaXNlIjogMSwKKyAgICAgICAgInBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5IjogMSwKKyAgICAgICAgInJvYnVzdEJ1ZmZlckFjY2VzcyI6IDEsCisgICAgICAgICJzYW1wbGVSYXRlU2hhZGluZyI6IDEsCisgICAgICAgICJzYW1wbGVyQW5pc290cm9weSI6IDEsCisgICAgICAgICJzaGFkZXJDbGlwRGlzdGFuY2UiOiAxLAorICAgICAgICAic2hhZGVyQ3VsbERpc3RhbmNlIjogMSwKKyAgICAgICAgInNoYWRlckZsb2F0NjQiOiAxLAorICAgICAgICAic2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCI6IDEsCisgICAgICAgICJzaGFkZXJJbnQxNiI6IDAsCisgICAgICAgICJzaGFkZXJJbnQ2NCI6IDEsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZU1pbkxvZCI6IDEsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSI6IDEsCisgICAgICAgICJzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyI6IDEsCisgICAgICAgICJzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlIjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0IjogMSwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdCI6IDEsCisgICAgICAgICJzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSI6IDEsCisgICAgICAgICJzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic3BhcnNlQmluZGluZyI6IDEsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MlNhbXBsZXMiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5QWxpYXNlZCI6IDEsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lCdWZmZXIiOiAxLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCI6IDEsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lJbWFnZTNEIjogMSwKKyAgICAgICAgInRlc3NlbGxhdGlvblNoYWRlciI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUiI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25CQyI6IDEsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25FVEMyIjogMSwKKyAgICAgICAgInZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlIjogMSwKKyAgICAgICAgInZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyI6IDEsCisgICAgICAgICJ3aWRlTGluZXMiOiAxCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMiOiB7CisgICAgICAgICJhcGlWZXJzaW9uIjogNDE5NDM0MSwKKyAgICAgICAgImRldmljZUlEIjogMjQ2MTY2NDIxNSwKKyAgICAgICAgImRldmljZU5hbWUiOiAiTlZJRElBIFRlZ3JhIFgxIiwKKyAgICAgICAgImRldmljZVR5cGUiOiAxLAorICAgICAgICAiZHJpdmVyVmVyc2lvbiI6IDE1MTQxNDM3NDQsCisgICAgICAgICJsaW1pdHMiOiB7CisgICAgICAgICAgICAiYnVmZmVySW1hZ2VHcmFudWxhcml0eSI6IDEwMjQsCisgICAgICAgICAgICAiZGlzY3JldGVRdWV1ZVByaW9yaXRpZXMiOiAyLAorICAgICAgICAgICAgImZyYW1lYnVmZmVyQ29sb3JTYW1wbGVDb3VudHMiOiAxNSwKKyAgICAgICAgICAgICJmcmFtZWJ1ZmZlckRlcHRoU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJTdGVuY2lsU2FtcGxlQ291bnRzIjogMzEsCisgICAgICAgICAgICAibGluZVdpZHRoR3JhbnVsYXJpdHkiOiAwLjEyNSwKKyAgICAgICAgICAgICJsaW5lV2lkdGhSYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAwLjUsCisgICAgICAgICAgICAgICAgMTAKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Qm91bmREZXNjcmlwdG9yU2V0cyI6IDgsCisgICAgICAgICAgICAibWF4Q2xpcERpc3RhbmNlcyI6IDgsCisgICAgICAgICAgICAibWF4Q29sb3JBdHRhY2htZW50cyI6IDgsCisgICAgICAgICAgICAibWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlcyI6IDgsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemUiOiA0OTE1MiwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwQ291bnQiOiBbCisgICAgICAgICAgICAgICAgMjE0NzQ4MzY0NywKKyAgICAgICAgICAgICAgICA2NTUzNSwKKyAgICAgICAgICAgICAgICA2NTUzNQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMiOiAxNTM2LAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBTaXplIjogWworICAgICAgICAgICAgICAgIDE1MzYsCisgICAgICAgICAgICAgICAgMTAyNCwKKyAgICAgICAgICAgICAgICA2NAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhDdWxsRGlzdGFuY2VzIjogOCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50cyI6IDgsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMiOiA0OTE1MiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnMiOiA0MDAwLAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyI6IDk2LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWMiOiA5NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlcyI6IDQ5MTUyLAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVycyI6IDcyLAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWMiOiA3MiwKKyAgICAgICAgICAgICJtYXhEcmF3SW5kZXhlZEluZGV4VmFsdWUiOiA0Mjk0OTY3Mjk1LAorICAgICAgICAgICAgIm1heERyYXdJbmRpcmVjdENvdW50IjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhGcmFnbWVudENvbWJpbmVkT3V0cHV0UmVzb3VyY2VzIjogMTYsCisgICAgICAgICAgICAibWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHMiOiAxLAorICAgICAgICAgICAgIm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEZyYWdtZW50T3V0cHV0QXR0YWNobWVudHMiOiA4LAorICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVySGVpZ2h0IjogMTYzODQsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJMYXllcnMiOiAyMDQ4LAorICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVyV2lkdGgiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyI6IDEwMjQsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucyI6IDMyLAorICAgICAgICAgICAgIm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzIjogMTAyNCwKKyAgICAgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjFEIjogMTYzODQsCisgICAgICAgICAgICAibWF4SW1hZ2VEaW1lbnNpb24yRCI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uM0QiOiAyMDQ4LAorICAgICAgICAgICAgIm1heEltYWdlRGltZW5zaW9uQ3ViZSI6IDE2Mzg0LAorICAgICAgICAgICAgIm1heEludGVycG9sYXRpb25PZmZzZXQiOiAwLjQzNzUsCisgICAgICAgICAgICAibWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50IjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JJbnB1dEF0dGFjaG1lbnRzIjogOCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVkSW1hZ2VzIjogODE5MiwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVycyI6IDQwMDAsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU3RvcmFnZUJ1ZmZlcnMiOiAxNiwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzIjogODE5MiwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyI6IDEyLAorICAgICAgICAgICAgIm1heFBlclN0YWdlUmVzb3VyY2VzIjogMjQ2MTIsCisgICAgICAgICAgICAibWF4UHVzaENvbnN0YW50c1NpemUiOiAyNTYsCisgICAgICAgICAgICAibWF4U2FtcGxlTWFza1dvcmRzIjogMSwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyQWxsb2NhdGlvbkNvdW50IjogNDAwMCwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyQW5pc290cm9weSI6IDE2LAorICAgICAgICAgICAgIm1heFNhbXBsZXJMb2RCaWFzIjogMTUsCisgICAgICAgICAgICAibWF4U3RvcmFnZUJ1ZmZlclJhbmdlIjogMjE0NzQ4MzY0NywKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzIjogMTIwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyI6IDQyMTYsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25HZW5lcmF0aW9uTGV2ZWwiOiA2NCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25QYXRjaFNpemUiOiAzMiwKKyAgICAgICAgICAgICJtYXhUZXhlbEJ1ZmZlckVsZW1lbnRzIjogMTM0MjE3NzI4LAorICAgICAgICAgICAgIm1heFRleGVsR2F0aGVyT2Zmc2V0IjogMzEsCisgICAgICAgICAgICAibWF4VGV4ZWxPZmZzZXQiOiA3LAorICAgICAgICAgICAgIm1heFVuaWZvcm1CdWZmZXJSYW5nZSI6IDY1NTM2LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0IjogMjA0NywKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUiOiAyMDQ4LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ3MiOiAzMiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFZpZXdwb3J0RGltZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICAgICAxNjM4NCwKKyAgICAgICAgICAgICAgICAxNjM4NAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJtYXhWaWV3cG9ydHMiOiAxNiwKKyAgICAgICAgICAgICJtaW5JbnRlcnBvbGF0aW9uT2Zmc2V0IjogLTAuNSwKKyAgICAgICAgICAgICJtaW5NZW1vcnlNYXBBbGlnbm1lbnQiOiA2NCwKKyAgICAgICAgICAgICJtaW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50IjogMzIsCisgICAgICAgICAgICAibWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAxNiwKKyAgICAgICAgICAgICJtaW5UZXhlbEdhdGhlck9mZnNldCI6IC0zMiwKKyAgICAgICAgICAgICJtaW5UZXhlbE9mZnNldCI6IC04LAorICAgICAgICAgICAgIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiAyNTYsCisgICAgICAgICAgICAibWlwbWFwUHJlY2lzaW9uQml0cyI6IDgsCisgICAgICAgICAgICAibm9uQ29oZXJlbnRBdG9tU2l6ZSI6IDY0LAorICAgICAgICAgICAgIm9wdGltYWxCdWZmZXJDb3B5T2Zmc2V0QWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJvcHRpbWFsQnVmZmVyQ29weVJvd1BpdGNoQWxpZ25tZW50IjogMSwKKyAgICAgICAgICAgICJwb2ludFNpemVHcmFudWxhcml0eSI6IDAuMTI1LAorICAgICAgICAgICAgInBvaW50U2l6ZVJhbmdlIjogWworICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgMTg5Ljg3NQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZURlcHRoU2FtcGxlQ291bnRzIjogMTUsCisgICAgICAgICAgICAic2FtcGxlZEltYWdlSW50ZWdlclNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiOiAzMSwKKyAgICAgICAgICAgICJzcGFyc2VBZGRyZXNzU3BhY2VTaXplIjogLTEsCisgICAgICAgICAgICAic3RhbmRhcmRTYW1wbGVMb2NhdGlvbnMiOiAxLAorICAgICAgICAgICAgInN0b3JhZ2VJbWFnZVNhbXBsZUNvdW50cyI6IDE1LAorICAgICAgICAgICAgInN0cmljdExpbmVzIjogMSwKKyAgICAgICAgICAgICJzdWJQaXhlbEludGVycG9sYXRpb25PZmZzZXRCaXRzIjogNCwKKyAgICAgICAgICAgICJzdWJQaXhlbFByZWNpc2lvbkJpdHMiOiA4LAorICAgICAgICAgICAgInN1YlRleGVsUHJlY2lzaW9uQml0cyI6IDgsCisgICAgICAgICAgICAidGltZXN0YW1wQ29tcHV0ZUFuZEdyYXBoaWNzIjogMSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBQZXJpb2QiOiAxLAorICAgICAgICAgICAgInZpZXdwb3J0Qm91bmRzUmFuZ2UiOiBbCisgICAgICAgICAgICAgICAgLTMyNzY4LAorICAgICAgICAgICAgICAgIDMyNzY4CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInZpZXdwb3J0U3ViUGl4ZWxCaXRzIjogOAorICAgICAgICB9LAorICAgICAgICAicGlwZWxpbmVDYWNoZVVVSUQiOiBbCisgICAgICAgICAgICAzLAorICAgICAgICAgICAgOTcsCisgICAgICAgICAgICA2NCwKKyAgICAgICAgICAgIDMyLAorICAgICAgICAgICAgOTAsCisgICAgICAgICAgICA1OCwKKyAgICAgICAgICAgIDEzMywKKyAgICAgICAgICAgIDE3OCwKKyAgICAgICAgICAgIDE5NCwKKyAgICAgICAgICAgIDIyLAorICAgICAgICAgICAgMTk0LAorICAgICAgICAgICAgMzQsCisgICAgICAgICAgICAyNDgsCisgICAgICAgICAgICA0NiwKKyAgICAgICAgICAgIDEzNywKKyAgICAgICAgICAgIDgKKyAgICAgICAgXSwKKyAgICAgICAgInNwYXJzZVByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAicmVzaWRlbmN5QWxpZ25lZE1pcFNpemUiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeU5vblJlc2lkZW50U3RyaWN0IjogMSwKKyAgICAgICAgICAgICJyZXNpZGVuY3lTdGFuZGFyZDJEQmxvY2tTaGFwZSI6IDEsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQyRE11bHRpc2FtcGxlQmxvY2tTaGFwZSI6IDEsCisgICAgICAgICAgICAicmVzaWRlbmN5U3RhbmRhcmQzREJsb2NrU2hhcGUiOiAxCisgICAgICAgIH0sCisgICAgICAgICJ2ZW5kb3JJRCI6IDQzMTgKKyAgICB9LAorICAgICJWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyI6IHsKKyAgICAgICAgIm1lbW9yeUhlYXBzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJmbGFncyI6IDEsCisgICAgICAgICAgICAgICAgInNpemUiOiAxNjEwNjEyNzM2CisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJtZW1vcnlUeXBlcyI6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMCwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhlYXBJbmRleCI6IDAsCisgICAgICAgICAgICAgICAgInByb3BlcnR5RmxhZ3MiOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAwLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogNworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaGVhcEluZGV4IjogMCwKKyAgICAgICAgICAgICAgICAicHJvcGVydHlGbGFncyI6IDExCisgICAgICAgICAgICB9CisgICAgICAgIF0KKyAgICB9LAorICAgICJBcnJheU9mVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIjogWworICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19LSFJfaW5jcmVtZW50YWxfcHJlc2VudCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zd2FwY2hhaW4iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNjgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX21haW50ZW5hbmNlMSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zaGFkZXJfZHJhd19wYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfS0hSX3NhbXBsZXJfbWlycm9yX2NsYW1wX3RvX2VkZ2UiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXh0ZW5zaW9uTmFtZSI6ICJWS19FWFRfc2hhZGVyX3N1Ymdyb3VwX2JhbGxvdCIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0VYVF9zaGFkZXJfc3ViZ3JvdXBfdm90ZSIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX05WX2RlZGljYXRlZF9hbGxvY2F0aW9uIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfTlZfZ2xzbF9zaGFkZXIiLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogMQorICAgICAgICB9CisgICAgXSwKKyAgICAiQXJyYXlPZlZrTGF5ZXJQcm9wZXJ0aWVzIjogW10sCisgICAgIkFycmF5T2ZWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSI6IHsKKyAgICAgICAgICAgICAgICAiZGVwdGgiOiAxLAorICAgICAgICAgICAgICAgICJoZWlnaHQiOiAxLAorICAgICAgICAgICAgICAgICJ3aWR0aCI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicXVldWVDb3VudCI6IDE2LAorICAgICAgICAgICAgInF1ZXVlRmxhZ3MiOiAxNSwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBWYWxpZEJpdHMiOiA2NAorICAgICAgICB9CisgICAgXSwKKyAgICAiQXJyYXlPZlZrRm9ybWF0UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogOAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDczLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NjcwNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDUyMzU5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MTEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAxMjAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDUwMTc3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTIzNTUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1MDE3NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MjM1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU2NzA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTY3MDcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQ3ODUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0Nzg1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDc4NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTAxNzcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTA2ODksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQ3ODUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0Nzg1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1NDI3MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNTQyNzMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDU0MjczLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9CisgICAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9wb3dlcnZyX3JvZ3VlX2dlODMwMC5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvZGV2aWNlX3Byb2ZpbGVzL3Bvd2VydnJfcm9ndWVfZ2U4MzAwLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4OGM5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2RldmljZV9wcm9maWxlcy9wb3dlcnZyX3JvZ3VlX2dlODMwMC5qc29uCkBAIC0wLDAgKzEsMTQ0MCBAQAoreworICAgICIkc2NoZW1hIjogImh0dHBzOi8vc2NoZW1hLmtocm9ub3Mub3JnL3Z1bGthbi9kZXZzaW1fMV8wXzAuanNvbiMiLAorICAgICJjb21tZW50cyI6IHsKKyAgICAgICAgImluZm8iOiAiVnVsa2FuIEhhcmR3YXJlIFJlcG9ydCBnZW5lcmF0ZWQgdmlhIGh0dHBzOi8vdnVsa2FuLmdwdWluZm8ub3JnIiwKKyAgICAgICAgImRlc2MiOiAiaHR0cHM6Ly92dWxrYW4uZ3B1aW5mby5vcmcvZGlzcGxheXJlcG9ydC5waHA/aWQ9MTk5OSIKKyAgICB9LAorICAgICJlbnZpcm9ubWVudCI6IHsKKyAgICAgICAgImFyY2hpdGVjdHVyZSI6ICJhcm0iLAorICAgICAgICAiY29tbWVudCI6ICIiLAorICAgICAgICAibmFtZSI6ICJhbmRyb2lkIiwKKyAgICAgICAgInJlcG9ydHZlcnNpb24iOiAiMS40IiwKKyAgICAgICAgInN1Ym1pdHRlciI6ICIiLAorICAgICAgICAidmVyc2lvbiI6ICI3LjAiCisgICAgfSwKKyAgICAiZXh0ZW5kZWQiOiB7CisgICAgICAgICJkZXZpY2VmZWF0dXJlczIiOiBbXSwKKyAgICAgICAgImRldmljZXByb3BlcnRpZXMyIjogW10KKyAgICB9LAorICAgICJwbGF0Zm9ybWRldGFpbHMiOiB7CisgICAgICAgICJhbmRyb2lkLkJ1aWxkSUQiOiAiTlJEOTBNIiwKKyAgICAgICAgImFuZHJvaWQuQnVpbGRWZXJzaW9uSW5jcmVtZW50YWwiOiAiMTQ5NjMyNTM1OCIsCisgICAgICAgICJhbmRyb2lkLlByb2R1Y3RNYW51ZmFjdHVyZXIiOiAiQWNlciIsCisgICAgICAgICJhbmRyb2lkLlByb2R1Y3RNb2RlbCI6ICJCMy1BNDAiCisgICAgfSwKKyAgICAic3VyZmFjZWNhcGFiaWxpdGVzIjogeworICAgICAgICAibWF4SW1hZ2VBcnJheUxheWVycyI6IDEsCisgICAgICAgICJtYXhJbWFnZUNvdW50IjogMywKKyAgICAgICAgIm1heEltYWdlRXh0ZW50IjogeworICAgICAgICAgICAgImhlaWdodCI6IDQwOTYsCisgICAgICAgICAgICAid2lkdGgiOiA0MDk2CisgICAgICAgIH0sCisgICAgICAgICJtaW5JbWFnZUNvdW50IjogMiwKKyAgICAgICAgIm1pbkltYWdlRXh0ZW50IjogeworICAgICAgICAgICAgImhlaWdodCI6IDEsCisgICAgICAgICAgICAid2lkdGgiOiAxCisgICAgICAgIH0sCisgICAgICAgICJwcmVzZW50bW9kZXMiOiBbCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMgorICAgICAgICBdLAorICAgICAgICAic3VwcG9ydGVkQ29tcG9zaXRlQWxwaGEiOiA4LAorICAgICAgICAic3VwcG9ydGVkVHJhbnNmb3JtcyI6IDI3MSwKKyAgICAgICAgInN1cHBvcnRlZFVzYWdlRmxhZ3MiOiAxNTksCisgICAgICAgICJzdXJmYWNlRXh0ZW5zaW9uIjogIlZLX0tIUl9hbmRyb2lkX3N1cmZhY2UiLAorICAgICAgICAic3VyZmFjZWZvcm1hdHMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImNvbG9yU3BhY2UiOiAwLAorICAgICAgICAgICAgICAgICJmb3JtYXQiOiAzNworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY29sb3JTcGFjZSI6IDAsCisgICAgICAgICAgICAgICAgImZvcm1hdCI6IDQzCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb2xvclNwYWNlIjogMCwKKyAgICAgICAgICAgICAgICAiZm9ybWF0IjogNAorICAgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAidmFsaWRTdXJmYWNlIjogdHJ1ZQorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyI6IHsKKyAgICAgICAgImFscGhhVG9PbmUiOiAxLAorICAgICAgICAiZGVwdGhCaWFzQ2xhbXAiOiAxLAorICAgICAgICAiZGVwdGhCb3VuZHMiOiAwLAorICAgICAgICAiZGVwdGhDbGFtcCI6IDAsCisgICAgICAgICJkcmF3SW5kaXJlY3RGaXJzdEluc3RhbmNlIjogMCwKKyAgICAgICAgImR1YWxTcmNCbGVuZCI6IDAsCisgICAgICAgICJmaWxsTW9kZU5vblNvbGlkIjogMCwKKyAgICAgICAgImZyYWdtZW50U3RvcmVzQW5kQXRvbWljcyI6IDAsCisgICAgICAgICJmdWxsRHJhd0luZGV4VWludDMyIjogMSwKKyAgICAgICAgImdlb21ldHJ5U2hhZGVyIjogMCwKKyAgICAgICAgImltYWdlQ3ViZUFycmF5IjogMSwKKyAgICAgICAgImluZGVwZW5kZW50QmxlbmQiOiAxLAorICAgICAgICAiaW5oZXJpdGVkUXVlcmllcyI6IDAsCisgICAgICAgICJsYXJnZVBvaW50cyI6IDEsCisgICAgICAgICJsb2dpY09wIjogMSwKKyAgICAgICAgIm11bHRpRHJhd0luZGlyZWN0IjogMSwKKyAgICAgICAgIm11bHRpVmlld3BvcnQiOiAwLAorICAgICAgICAib2NjbHVzaW9uUXVlcnlQcmVjaXNlIjogMSwKKyAgICAgICAgInBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5IjogMCwKKyAgICAgICAgInJvYnVzdEJ1ZmZlckFjY2VzcyI6IDEsCisgICAgICAgICJzYW1wbGVSYXRlU2hhZGluZyI6IDEsCisgICAgICAgICJzYW1wbGVyQW5pc290cm9weSI6IDEsCisgICAgICAgICJzaGFkZXJDbGlwRGlzdGFuY2UiOiAwLAorICAgICAgICAic2hhZGVyQ3VsbERpc3RhbmNlIjogMCwKKyAgICAgICAgInNoYWRlckZsb2F0NjQiOiAwLAorICAgICAgICAic2hhZGVySW1hZ2VHYXRoZXJFeHRlbmRlZCI6IDAsCisgICAgICAgICJzaGFkZXJJbnQxNiI6IDAsCisgICAgICAgICJzaGFkZXJJbnQ2NCI6IDAsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZU1pbkxvZCI6IDAsCisgICAgICAgICJzaGFkZXJSZXNvdXJjZVJlc2lkZW5jeSI6IDAsCisgICAgICAgICJzaGFkZXJTYW1wbGVkSW1hZ2VBcnJheUR5bmFtaWNJbmRleGluZyI6IDAsCisgICAgICAgICJzaGFkZXJTdG9yYWdlQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAwLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlQXJyYXlEeW5hbWljSW5kZXhpbmciOiAwLAorICAgICAgICAic2hhZGVyU3RvcmFnZUltYWdlRXh0ZW5kZWRGb3JtYXRzIjogMCwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZU11bHRpc2FtcGxlIjogMCwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVJlYWRXaXRob3V0Rm9ybWF0IjogMCwKKyAgICAgICAgInNoYWRlclN0b3JhZ2VJbWFnZVdyaXRlV2l0aG91dEZvcm1hdCI6IDAsCisgICAgICAgICJzaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSI6IDAsCisgICAgICAgICJzaGFkZXJVbmlmb3JtQnVmZmVyQXJyYXlEeW5hbWljSW5kZXhpbmciOiAxLAorICAgICAgICAic3BhcnNlQmluZGluZyI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5MlNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5NFNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5OFNhbXBsZXMiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5QWxpYXNlZCI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lCdWZmZXIiOiAwLAorICAgICAgICAic3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCI6IDAsCisgICAgICAgICJzcGFyc2VSZXNpZGVuY3lJbWFnZTNEIjogMCwKKyAgICAgICAgInRlc3NlbGxhdGlvblNoYWRlciI6IDAsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUiI6IDAsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25CQyI6IDAsCisgICAgICAgICJ0ZXh0dXJlQ29tcHJlc3Npb25FVEMyIjogMSwKKyAgICAgICAgInZhcmlhYmxlTXVsdGlzYW1wbGVSYXRlIjogMCwKKyAgICAgICAgInZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyI6IDAsCisgICAgICAgICJ3aWRlTGluZXMiOiAwCisgICAgfSwKKyAgICAiVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMiOiB7CisgICAgICAgICJhcGlWZXJzaW9uIjogNDE5NDMwNywKKyAgICAgICAgImRldmljZUlEIjogMTQ1NTY0NiwKKyAgICAgICAgImRldmljZU5hbWUiOiAiUG93ZXJWUiBSb2d1ZSBHRTgzMDAiLAorICAgICAgICAiZGV2aWNlVHlwZSI6IDIsCisgICAgICAgICJkcml2ZXJWZXJzaW9uIjogNDQ5MDQ2OSwKKyAgICAgICAgImxpbWl0cyI6IHsKKyAgICAgICAgICAgICJidWZmZXJJbWFnZUdyYW51bGFyaXR5IjogMSwKKyAgICAgICAgICAgICJkaXNjcmV0ZVF1ZXVlUHJpb3JpdGllcyI6IDMsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJDb2xvclNhbXBsZUNvdW50cyI6IDcsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJEZXB0aFNhbXBsZUNvdW50cyI6IDcsCisgICAgICAgICAgICAiZnJhbWVidWZmZXJOb0F0dGFjaG1lbnRzU2FtcGxlQ291bnRzIjogNywKKyAgICAgICAgICAgICJmcmFtZWJ1ZmZlclN0ZW5jaWxTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgImxpbmVXaWR0aEdyYW51bGFyaXR5IjogMCwKKyAgICAgICAgICAgICJsaW5lV2lkdGhSYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Qm91bmREZXNjcmlwdG9yU2V0cyI6IDQsCisgICAgICAgICAgICAibWF4Q2xpcERpc3RhbmNlcyI6IDAsCisgICAgICAgICAgICAibWF4Q29sb3JBdHRhY2htZW50cyI6IDgsCisgICAgICAgICAgICAibWF4Q29tYmluZWRDbGlwQW5kQ3VsbERpc3RhbmNlcyI6IDAsCisgICAgICAgICAgICAibWF4Q29tcHV0ZVNoYXJlZE1lbW9yeVNpemUiOiAxNjM4NCwKKyAgICAgICAgICAgICJtYXhDb21wdXRlV29ya0dyb3VwQ291bnQiOiBbCisgICAgICAgICAgICAgICAgNjU1MzYsCisgICAgICAgICAgICAgICAgNjU1MzYsCisgICAgICAgICAgICAgICAgNjU1MzYKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zIjogNTEyLAorICAgICAgICAgICAgIm1heENvbXB1dGVXb3JrR3JvdXBTaXplIjogWworICAgICAgICAgICAgICAgIDUxMiwKKyAgICAgICAgICAgICAgICA1MTIsCisgICAgICAgICAgICAgICAgNjQKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Q3VsbERpc3RhbmNlcyI6IDAsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHMiOiAyNTYsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFNhbXBsZWRJbWFnZXMiOiAyNTYsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFNhbXBsZXJzIjogMjU2LAorICAgICAgICAgICAgIm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVycyI6IDI1NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUJ1ZmZlcnNEeW5hbWljIjogOCwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlcyI6IDI1NiwKKyAgICAgICAgICAgICJtYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMiOiAyNTYsCisgICAgICAgICAgICAibWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzRHluYW1pYyI6IDgsCisgICAgICAgICAgICAibWF4RHJhd0luZGV4ZWRJbmRleFZhbHVlIjogNDI5NDk2NzI5NSwKKyAgICAgICAgICAgICJtYXhEcmF3SW5kaXJlY3RDb3VudCI6IDIxNDc0ODM2NDgsCisgICAgICAgICAgICAibWF4RnJhZ21lbnRDb21iaW5lZE91dHB1dFJlc291cmNlcyI6IDgsCisgICAgICAgICAgICAibWF4RnJhZ21lbnREdWFsU3JjQXR0YWNobWVudHMiOiAwLAorICAgICAgICAgICAgIm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEZyYWdtZW50T3V0cHV0QXR0YWNobWVudHMiOiA4LAorICAgICAgICAgICAgIm1heEZyYW1lYnVmZmVySGVpZ2h0IjogODE5MiwKKyAgICAgICAgICAgICJtYXhGcmFtZWJ1ZmZlckxheWVycyI6IDIwNDgsCisgICAgICAgICAgICAibWF4RnJhbWVidWZmZXJXaWR0aCI6IDgxOTIsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMiOiAyNTYsCisgICAgICAgICAgICAibWF4R2VvbWV0cnlTaGFkZXJJbnZvY2F0aW9ucyI6IDMyLAorICAgICAgICAgICAgIm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzIjogMTAyNCwKKyAgICAgICAgICAgICJtYXhJbWFnZUFycmF5TGF5ZXJzIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjFEIjogODE5MiwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjJEIjogODE5MiwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbjNEIjogMjA0OCwKKyAgICAgICAgICAgICJtYXhJbWFnZURpbWVuc2lvbkN1YmUiOiA4MTkyLAorICAgICAgICAgICAgIm1heEludGVycG9sYXRpb25PZmZzZXQiOiAwLjQ5OTk5OTk3MDE5OCwKKyAgICAgICAgICAgICJtYXhNZW1vcnlBbGxvY2F0aW9uQ291bnQiOiA5OTk5LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHMiOiAxMjgsCisgICAgICAgICAgICAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVycyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVycyI6IDEyOCwKKyAgICAgICAgICAgICJtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlSW1hZ2VzIjogMTI4LAorICAgICAgICAgICAgIm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzIjogMTI4LAorICAgICAgICAgICAgIm1heFBlclN0YWdlUmVzb3VyY2VzIjogMTI4LAorICAgICAgICAgICAgIm1heFB1c2hDb25zdGFudHNTaXplIjogMTI4LAorICAgICAgICAgICAgIm1heFNhbXBsZU1hc2tXb3JkcyI6IDEsCisgICAgICAgICAgICAibWF4U2FtcGxlckFsbG9jYXRpb25Db3VudCI6IDk5OTksCisgICAgICAgICAgICAibWF4U2FtcGxlckFuaXNvdHJvcHkiOiAxNiwKKyAgICAgICAgICAgICJtYXhTYW1wbGVyTG9kQmlhcyI6IDE1LAorICAgICAgICAgICAgIm1heFN0b3JhZ2VCdWZmZXJSYW5nZSI6IDEzNDIxNzcyOCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyUGF0Y2hPdXRwdXRDb21wb25lbnRzIjogMCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzIjogMCwKKyAgICAgICAgICAgICJtYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4T3V0cHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyI6IDAsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMiOiAwLAorICAgICAgICAgICAgIm1heFRlc3NlbGxhdGlvbkdlbmVyYXRpb25MZXZlbCI6IDAsCisgICAgICAgICAgICAibWF4VGVzc2VsbGF0aW9uUGF0Y2hTaXplIjogMCwKKyAgICAgICAgICAgICJtYXhUZXhlbEJ1ZmZlckVsZW1lbnRzIjogNjU1MzYsCisgICAgICAgICAgICAibWF4VGV4ZWxHYXRoZXJPZmZzZXQiOiAwLAorICAgICAgICAgICAgIm1heFRleGVsT2Zmc2V0IjogNywKKyAgICAgICAgICAgICJtYXhVbmlmb3JtQnVmZmVyUmFuZ2UiOiAxMzQyMTc3MjgsCisgICAgICAgICAgICAibWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQiOiA2NTUzNSwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMiOiAxNiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUiOiAyMTQ3NDgzNjQ4LAorICAgICAgICAgICAgIm1heFZlcnRleElucHV0QmluZGluZ3MiOiAxNiwKKyAgICAgICAgICAgICJtYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIjogMTI4LAorICAgICAgICAgICAgIm1heFZpZXdwb3J0RGltZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICAgICA4MTkyLAorICAgICAgICAgICAgICAgIDgxOTIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibWF4Vmlld3BvcnRzIjogMTYsCisgICAgICAgICAgICAibWluSW50ZXJwb2xhdGlvbk9mZnNldCI6IC0wLjUsCisgICAgICAgICAgICAibWluTWVtb3J5TWFwQWxpZ25tZW50IjogNjQsCisgICAgICAgICAgICAibWluU3RvcmFnZUJ1ZmZlck9mZnNldEFsaWdubWVudCI6IDQsCisgICAgICAgICAgICAibWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiA0LAorICAgICAgICAgICAgIm1pblRleGVsR2F0aGVyT2Zmc2V0IjogMCwKKyAgICAgICAgICAgICJtaW5UZXhlbE9mZnNldCI6IC04LAorICAgICAgICAgICAgIm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQiOiA0LAorICAgICAgICAgICAgIm1pcG1hcFByZWNpc2lvbkJpdHMiOiA0LAorICAgICAgICAgICAgIm5vbkNvaGVyZW50QXRvbVNpemUiOiAxMjgsCisgICAgICAgICAgICAib3B0aW1hbEJ1ZmZlckNvcHlPZmZzZXRBbGlnbm1lbnQiOiA0LAorICAgICAgICAgICAgIm9wdGltYWxCdWZmZXJDb3B5Um93UGl0Y2hBbGlnbm1lbnQiOiA0LAorICAgICAgICAgICAgInBvaW50U2l6ZUdyYW51bGFyaXR5IjogMCwKKyAgICAgICAgICAgICJwb2ludFNpemVSYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgIDUxMQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzYW1wbGVkSW1hZ2VDb2xvclNhbXBsZUNvdW50cyI6IDcsCisgICAgICAgICAgICAic2FtcGxlZEltYWdlRGVwdGhTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZUludGVnZXJTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiOiA3LAorICAgICAgICAgICAgInNwYXJzZUFkZHJlc3NTcGFjZVNpemUiOiAyNzQ4Nzc5MDY5NDQsCisgICAgICAgICAgICAic3RhbmRhcmRTYW1wbGVMb2NhdGlvbnMiOiAxLAorICAgICAgICAgICAgInN0b3JhZ2VJbWFnZVNhbXBsZUNvdW50cyI6IDcsCisgICAgICAgICAgICAic3RyaWN0TGluZXMiOiAwLAorICAgICAgICAgICAgInN1YlBpeGVsSW50ZXJwb2xhdGlvbk9mZnNldEJpdHMiOiA0LAorICAgICAgICAgICAgInN1YlBpeGVsUHJlY2lzaW9uQml0cyI6IDgsCisgICAgICAgICAgICAic3ViVGV4ZWxQcmVjaXNpb25CaXRzIjogOCwKKyAgICAgICAgICAgICJ0aW1lc3RhbXBDb21wdXRlQW5kR3JhcGhpY3MiOiAwLAorICAgICAgICAgICAgInRpbWVzdGFtcFBlcmlvZCI6IDAsCisgICAgICAgICAgICAidmlld3BvcnRCb3VuZHNSYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAtMTYzODQsCisgICAgICAgICAgICAgICAgMTYzODMKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidmlld3BvcnRTdWJQaXhlbEJpdHMiOiAwCisgICAgICAgIH0sCisgICAgICAgICJwaXBlbGluZUNhY2hlVVVJRCI6IFsKKyAgICAgICAgICAgIDUwLAorICAgICAgICAgICAgNTAsCisgICAgICAgICAgICAzMiwKKyAgICAgICAgICAgIDUyLAorICAgICAgICAgICAgNDgsCisgICAgICAgICAgICAzMiwKKyAgICAgICAgICAgIDUzLAorICAgICAgICAgICAgNTIsCisgICAgICAgICAgICAzMiwKKyAgICAgICAgICAgIDUxLAorICAgICAgICAgICAgNDgsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMAorICAgICAgICBdLAorICAgICAgICAic3BhcnNlUHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJyZXNpZGVuY3lBbGlnbmVkTWlwU2l6ZSI6IDAsCisgICAgICAgICAgICAicmVzaWRlbmN5Tm9uUmVzaWRlbnRTdHJpY3QiOiAwLAorICAgICAgICAgICAgInJlc2lkZW5jeVN0YW5kYXJkMkRCbG9ja1NoYXBlIjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lTdGFuZGFyZDJETXVsdGlzYW1wbGVCbG9ja1NoYXBlIjogMCwKKyAgICAgICAgICAgICJyZXNpZGVuY3lTdGFuZGFyZDNEQmxvY2tTaGFwZSI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgInZlbmRvcklEIjogNDExMgorICAgIH0sCisgICAgIlZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIjogeworICAgICAgICAibWVtb3J5SGVhcHMiOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImZsYWdzIjogMSwKKyAgICAgICAgICAgICAgICAic2l6ZSI6IDEwNzM3NDE4MjQKKyAgICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgIm1lbW9yeVR5cGVzIjogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJoZWFwSW5kZXgiOiAwLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eUZsYWdzIjogNworICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfSwKKyAgICAiQXJyYXlPZlZrRXh0ZW5zaW9uUHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfSU1HX2ZpbHRlcl9jdWJpYyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zYW1wbGVyX21pcnJvcl9jbGFtcF90b19lZGdlIiwKKyAgICAgICAgICAgICJzcGVjVmVyc2lvbiI6IDEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImV4dGVuc2lvbk5hbWUiOiAiVktfSU1HX2Zvcm1hdF9wdnJ0YyIsCisgICAgICAgICAgICAic3BlY1ZlcnNpb24iOiAxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleHRlbnNpb25OYW1lIjogIlZLX0tIUl9zd2FwY2hhaW4iLAorICAgICAgICAgICAgInNwZWNWZXJzaW9uIjogNjgKKyAgICAgICAgfQorICAgIF0sCisgICAgIkFycmF5T2ZWa0xheWVyUHJvcGVydGllcyI6IFtdLAorICAgICJBcnJheU9mVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJtaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkiOiB7CisgICAgICAgICAgICAgICAgImRlcHRoIjogMSwKKyAgICAgICAgICAgICAgICAiaGVpZ2h0IjogMSwKKyAgICAgICAgICAgICAgICAid2lkdGgiOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInF1ZXVlQ291bnQiOiAyLAorICAgICAgICAgICAgInF1ZXVlRmxhZ3MiOiA3LAorICAgICAgICAgICAgInRpbWVzdGFtcFZhbGlkQml0cyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgIm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSI6IHsKKyAgICAgICAgICAgICAgICAiZGVwdGgiOiAwLAorICAgICAgICAgICAgICAgICJoZWlnaHQiOiAwLAorICAgICAgICAgICAgICAgICJ3aWR0aCI6IDAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicXVldWVDb3VudCI6IDAsCisgICAgICAgICAgICAicXVldWVGbGFncyI6IDAsCisgICAgICAgICAgICAidGltZXN0YW1wVmFsaWRCaXRzIjogMAorICAgICAgICB9CisgICAgXSwKKyAgICAiQXJyYXlPZlZrRm9ybWF0UHJvcGVydGllcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE2NDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDE1NzQ1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxNTc0NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE2NDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExNjQ5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTY0OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTU3NDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDE1NzQ1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDE1NzQ1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTE2NDksCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxNTc0NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxNTc0NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDIxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDExNjQ5LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDI3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMjgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAyOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDMxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDM0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAzNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDE1NzQ3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDE1NzQ3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTU3NDUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxNTc0NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA0OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNDksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxNTc0NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDE1NzQ1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDE1NzQ1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTM5MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMTM5MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDU3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxNTc0NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA1OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA2OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDY5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDc3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogNzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDgzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA3NTUzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogODcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA4OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDg5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNjQKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDcyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDkyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzNDU3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogNzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA2NAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjAzLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogODgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogOTYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzMjAxLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDMyMDMsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiA4OAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiA5NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1NSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDk5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzMjA3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMTIwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1NywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDMyMDEsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzIwMywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEwOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMzQ1OSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDg4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTExLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExMywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExNiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTE3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMTgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDExOSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyMiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDM0NTcsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogNzU1MywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDgKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTIzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA1MTIxLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNTg1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM1ODUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyNSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzU4NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzNTg1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMjcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAzNTg1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDM1ODUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEyOCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTI5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMzU4NSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAzNTg1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzMSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTMyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDEzNywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTM4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxMzksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTQ3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA5MjE3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNDgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDkyMTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE0OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogOTIxNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiA5MjE3LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDkyMTcsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogOTIxNywKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTUzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1NSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDEwMjUsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU2LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMTAyNSwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAxMDI1LAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNTcsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE1OCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTU5LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjAsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2MSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTYyLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjMsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY1LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjYsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE2NywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTY4LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNjksCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MCwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTcxLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzIsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3MywKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc0LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzUsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3NiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTc3LAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxNzgsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE3OSwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgwLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODEsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmb3JtYXRJRCI6IDE4MiwKKyAgICAgICAgICAgICJsaW5lYXJUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAib3B0aW1hbFRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJidWZmZXJGZWF0dXJlcyI6IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZvcm1hdElEIjogMTgzLAorICAgICAgICAgICAgImxpbmVhclRpbGluZ0ZlYXR1cmVzIjogMCwKKyAgICAgICAgICAgICJvcHRpbWFsVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgImJ1ZmZlckZlYXR1cmVzIjogMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZm9ybWF0SUQiOiAxODQsCisgICAgICAgICAgICAibGluZWFyVGlsaW5nRmVhdHVyZXMiOiAwLAorICAgICAgICAgICAgIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI6IDAsCisgICAgICAgICAgICAiYnVmZmVyRmVhdHVyZXMiOiAwCisgICAgICAgIH0KKyAgICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvaWNkLXNwdi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvaWNkLXNwdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTkyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9pY2Qtc3B2LmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNvZHlAbHVuYXJnLmNvbT4KKyAqLworCisjaWZuZGVmIElDRF9TUFZfSAorI2RlZmluZSBJQ0RfU1BWX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIElDRF9TUFZfTUFHSUMgMHgwNzIzMDIwMworI2RlZmluZSBJQ0RfU1BWX1ZFUlNJT04gOTkKKworc3RydWN0IGljZF9zcHZfaGVhZGVyIHsKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgIHVpbnQzMl90IGdlbl9tYWdpYzsgIC8vIEdlbmVyYXRvcidzIG1hZ2ljIG51bWJlcgorfTsKKworI2VuZGlmIC8qIElDRF9TUFZfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9sYXllcl92YWxpZGF0aW9uX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM0MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5jcHAKQEAgLTAsMCArMSwyMDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZkBpancuY28ubno+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWlrZSBTdHJveWFuIDxtaWtlQEx1bmFyRy5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNub3J0aHJvcEBnb29nbGUuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEplcmVteSBLbmlhZ2VyIDxqZXJlbXlrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFNoYW5ub24gTWNQaGVyc29uIDxzaGFubm9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvaG4gWnVsYXVmIDxqenVsYXVmQGx1bmFyZy5jb20+CisgKi8KKyNpbmNsdWRlICJjYXN0X3V0aWxzLmgiCisjaW5jbHVkZSAibGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5oIgorCitWa0Zvcm1hdCBGaW5kU3VwcG9ydGVkRGVwdGhPbmx5Rm9ybWF0KFZrUGh5c2ljYWxEZXZpY2UgcGh5KSB7CisgICAgY29uc3QgVmtGb3JtYXQgZHNfZm9ybWF0c1tdID0ge1ZLX0ZPUk1BVF9EMTZfVU5PUk0sIFZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyLCBWS19GT1JNQVRfRDMyX1NGTE9BVH07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNpemUoZHNfZm9ybWF0cyk7ICsraSkgeworICAgICAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BzOworICAgICAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHBoeSwgZHNfZm9ybWF0c1tpXSwgJmZvcm1hdF9wcm9wcyk7CisKKyAgICAgICAgaWYgKGZvcm1hdF9wcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKSB7CisgICAgICAgICAgICByZXR1cm4gZHNfZm9ybWF0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVktfRk9STUFUX1VOREVGSU5FRDsKK30KKworVmtGb3JtYXQgRmluZFN1cHBvcnRlZFN0ZW5jaWxPbmx5Rm9ybWF0KFZrUGh5c2ljYWxEZXZpY2UgcGh5KSB7CisgICAgY29uc3QgVmtGb3JtYXQgZHNfZm9ybWF0c1tdID0ge1ZLX0ZPUk1BVF9TOF9VSU5UfTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZShkc19mb3JtYXRzKTsgKytpKSB7CisgICAgICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcHM7CisgICAgICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMocGh5LCBkc19mb3JtYXRzW2ldLCAmZm9ybWF0X3Byb3BzKTsKKworICAgICAgICBpZiAoZm9ybWF0X3Byb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQpIHsKKyAgICAgICAgICAgIHJldHVybiBkc19mb3JtYXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWS19GT1JNQVRfVU5ERUZJTkVEOworfQorCitWa0Zvcm1hdCBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KFZrUGh5c2ljYWxEZXZpY2UgcGh5KSB7CisgICAgY29uc3QgVmtGb3JtYXQgZHNfZm9ybWF0c1tdID0ge1ZLX0ZPUk1BVF9EMTZfVU5PUk1fUzhfVUlOVCwgVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5ULCBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UfTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZShkc19mb3JtYXRzKTsgKytpKSB7CisgICAgICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcHM7CisgICAgICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMocGh5LCBkc19mb3JtYXRzW2ldLCAmZm9ybWF0X3Byb3BzKTsKKworICAgICAgICBpZiAoZm9ybWF0X3Byb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQpIHsKKyAgICAgICAgICAgIHJldHVybiBkc19mb3JtYXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWS19GT1JNQVRfVU5ERUZJTkVEOworfQorCitib29sIEltYWdlRm9ybWF0SXNTdXBwb3J0ZWQoVmtQaHlzaWNhbERldmljZSBwaHksIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrRm9ybWF0RmVhdHVyZUZsYWdzIGZlYXR1cmVzKSB7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wczsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHBoeSwgZm9ybWF0LCAmZm9ybWF0X3Byb3BzKTsKKyAgICBWa0Zvcm1hdEZlYXR1cmVGbGFncyBwaHlfZmVhdHVyZXMgPQorICAgICAgICAoVktfSU1BR0VfVElMSU5HX09QVElNQUwgPT0gdGlsaW5nID8gZm9ybWF0X3Byb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyA6IGZvcm1hdF9wcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcyk7CisgICAgcmV0dXJuICgwICE9IChwaHlfZmVhdHVyZXMgJiBmZWF0dXJlcykpOworfQorCitib29sIEltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoVmtQaHlzaWNhbERldmljZSBwaHksIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVRpbGluZyB0aWxpbmcsIFZrRm9ybWF0RmVhdHVyZUZsYWdzIGZlYXR1cmVzKSB7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wczsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHBoeSwgZm9ybWF0LCAmZm9ybWF0X3Byb3BzKTsKKyAgICBWa0Zvcm1hdEZlYXR1cmVGbGFncyBwaHlfZmVhdHVyZXMgPQorICAgICAgICAoVktfSU1BR0VfVElMSU5HX09QVElNQUwgPT0gdGlsaW5nID8gZm9ybWF0X3Byb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyA6IGZvcm1hdF9wcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcyk7CisgICAgcmV0dXJuIChmZWF0dXJlcyA9PSAocGh5X2ZlYXR1cmVzICYgZmVhdHVyZXMpKTsKK30KKworYm9vbCBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGNvbnN0IFZrSW5zdGFuY2UgaW5zdCwgY29uc3QgVmtQaHlzaWNhbERldmljZSBwaHksIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZmVhdHVyZXMpIHsKKyAgICAvLyBWZXJpZnkgcGh5c2ljYWwgZGV2aWNlIHN1cHBvcnQgb2YgZm9ybWF0IGZlYXR1cmVzCisgICAgaWYgKCFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKHBoeSwgaW5mby5mb3JtYXQsIGluZm8udGlsaW5nLCBmZWF0dXJlcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFZlcmlmeSB0aGF0IFBoeXNEZXZJbWFnZUZvcm1hdFByb3AoKSBhbHNvIGNsYWltcyBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWMgdXNhZ2UKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyBwcm9wczsKKyAgICBWa1Jlc3VsdCBlcnIgPQorICAgICAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMocGh5LCBpbmZvLmZvcm1hdCwgaW5mby5pbWFnZVR5cGUsIGluZm8udGlsaW5nLCBpbmZvLnVzYWdlLCBpbmZvLmZsYWdzLCAmcHJvcHMpOworICAgIGlmIChWS19TVUNDRVNTICE9IGVycikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgMCAgLy8gQ29udmluY2VkIHRoaXMgY2h1bmsgZG9lc24ndCBjdXJyZW50bHkgYWRkIGFueSBhZGRpdGlvbmFsIGluZm8sIGJ1dCBsZWF2aW5nIGluIHBsYWNlIGJlY2F1c2UgaXQgbWF5IGJlCisgICAgICAgLy8gbmVjZXNzYXJ5IHdpdGggZnV0dXJlIGV4dGVuc2lvbnMKKworICAgIC8vIFZlcmlmeSBhZ2FpbiB1c2luZyB2ZXJzaW9uIDIsIGlmIHN1cHBvcnRlZCwgd2hpY2ggKmNhbiogcmV0dXJuIG1vcmUgcHJvcGVydHkgZGF0YSB0aGFuIHRoZSBvcmlnaW5hbC4uLgorICAgIC8vIChJdCdzIG5vdCBjbGVhciB0aGF0IHRoaXMgaXMgYW55IG1vcmUgZGVmaW5pdGl2ZSB0aGFuIHVzaW5nIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIC0gYnV0IG5vIGhhcm0pCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIHBfR2V0UERJRlAyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczJLSFIiKTsKKyAgICBpZiAoTlVMTCAhPSBwX0dldFBESUZQMktIUikgeworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRJbmZvMktIUiBmbXRfaW5mb3t9OworICAgICAgICBmbXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9JTUFHRV9GT1JNQVRfSU5GT18yX0tIUjsKKyAgICAgICAgZm10X2luZm8ucE5leHQgPSBudWxscHRyOworICAgICAgICBmbXRfaW5mby5mb3JtYXQgPSBpbmZvLmZvcm1hdDsKKyAgICAgICAgZm10X2luZm8udHlwZSA9IGluZm8uaW1hZ2VUeXBlOworICAgICAgICBmbXRfaW5mby50aWxpbmcgPSBpbmZvLnRpbGluZzsKKyAgICAgICAgZm10X2luZm8udXNhZ2UgPSBpbmZvLnVzYWdlOworICAgICAgICBmbXRfaW5mby5mbGFncyA9IGluZm8uZmxhZ3M7CisKKyAgICAgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMyS0hSIGZtdF9wcm9wcyA9IHt9OworICAgICAgICBmbXRfcHJvcHMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yX0tIUjsKKyAgICAgICAgZXJyID0gcF9HZXRQRElGUDJLSFIocGh5LCAmZm10X2luZm8sICZmbXRfcHJvcHMpOworICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSBlcnIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1ZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBteURiZ0Z1bmMoVmtGbGFncyBtc2dGbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqVHlwZSwgdWludDY0X3Qgc3JjT2JqZWN0LCBzaXplX3QgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXNnQ29kZSwgY29uc3QgY2hhciAqcExheWVyUHJlZml4LCBjb25zdCBjaGFyICpwTXNnLCB2b2lkICpwVXNlckRhdGEpIHsKKyAgICBFcnJvck1vbml0b3IgKmVyck1vbml0b3IgPSAoRXJyb3JNb25pdG9yICopcFVzZXJEYXRhOworICAgIGlmIChtc2dGbGFncyAmIGVyck1vbml0b3ItPkdldE1lc3NhZ2VGbGFncygpKSB7CisgICAgICAgIHJldHVybiBlcnJNb25pdG9yLT5DaGVja0ZvckRlc2lyZWRNc2cocE1zZyk7CisgICAgfQorICAgIHJldHVybiBWS19GQUxTRTsKK30KKworVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiBHZXRQdXNoRGVzY3JpcHRvclByb3BlcnRpZXMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtQaHlzaWNhbERldmljZSBncHUpIHsKKyAgICAvLyBGaW5kIGFkZHJlc3Mgb2YgZXh0ZW5zaW9uIGNhbGwgYW5kIG1ha2UgdGhlIGNhbGwgLS0gYXNzdW1lcyBuZWVkZWQgZXh0ZW5zaW9ucyBhcmUgZW5hYmxlZC4KKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIik7CisgICAgYXNzZXJ0KHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiAhPSBudWxscHRyKTsKKworICAgIC8vIEdldCB0aGUgcHVzaCBkZXNjcmlwdG9yIGxpbWl0cworICAgIGF1dG8gcHVzaF9kZXNjcmlwdG9yX3Byb3AgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUj4oKTsKKyAgICBhdXRvIHByb3AyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUj4oJnB1c2hfZGVzY3JpcHRvcl9wcm9wKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoZ3B1LCAmcHJvcDIpOworICAgIHJldHVybiBwdXNoX2Rlc2NyaXB0b3JfcHJvcDsKK30KKworVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyBHZXRTdWJncm91cFByb3BlcnRpZXMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtQaHlzaWNhbERldmljZSBncHUpIHsKKyAgICBhdXRvIHN1Ymdyb3VwX3Byb3AgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcz4oKTsKKworICAgIGF1dG8gcHJvcDIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyPigmc3ViZ3JvdXBfcHJvcCk7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoZ3B1LCAmcHJvcDIpOworICAgIHJldHVybiBzdWJncm91cF9wcm9wOworfQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgJnJocywgY29uc3QgVmtEZWJ1Z1V0aWxzTGFiZWxFWFQgJmxocykgeworICAgIGJvb2wgaXNfZXF1YWwgPSAocmhzLmNvbG9yWzBdID09IGxocy5jb2xvclswXSkgJiYgKHJocy5jb2xvclsxXSA9PSBsaHMuY29sb3JbMV0pICYmIChyaHMuY29sb3JbMl0gPT0gbGhzLmNvbG9yWzJdKSAmJgorICAgICAgICAgICAgICAgICAgICAocmhzLmNvbG9yWzNdID09IGxocy5jb2xvclszXSk7CisgICAgaWYgKGlzX2VxdWFsKSB7CisgICAgICAgIGlmIChyaHMucExhYmVsTmFtZSAmJiBsaHMucExhYmVsTmFtZSkgeworICAgICAgICAgICAgaXNfZXF1YWwgPSAoMCA9PSBzdHJjbXAocmhzLnBMYWJlbE5hbWUsIGxocy5wTGFiZWxOYW1lKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpc19lcXVhbCA9IChyaHMucExhYmVsTmFtZSA9PSBudWxscHRyKSAmJiAobGhzLnBMYWJlbE5hbWUgPT0gbnVsbHB0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlzX2VxdWFsOworfQorCitWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgRGVidWdVdGlsc0NhbGxiYWNrKFZrRGVidWdVdGlsc01lc3NhZ2VTZXZlcml0eUZsYWdCaXRzRVhUIG1lc3NhZ2VTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1V0aWxzTWVzc2FnZVR5cGVGbGFnc0VYVCBtZXNzYWdlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAqcENhbGxiYWNrRGF0YSwgdm9pZCAqcFVzZXJEYXRhKSB7CisgICAgYXV0byAqZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGVidWdVdGlsc0xhYmVsQ2hlY2tEYXRhICo+KHBVc2VyRGF0YSk7CisgICAgZGF0YS0+Y2FsbGJhY2socENhbGxiYWNrRGF0YSwgZGF0YSk7CisgICAgcmV0dXJuIFZLX0ZBTFNFOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorZXh0ZXJuICJDIiB2b2lkICpBZGRUb0NvbW1hbmRCdWZmZXIodm9pZCAqYXJnKSB7CisgICAgc3RydWN0IHRocmVhZF9kYXRhX3N0cnVjdCAqZGF0YSA9IChzdHJ1Y3QgdGhyZWFkX2RhdGFfc3RydWN0ICopYXJnOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4MDAwMDsgaSsrKSB7CisgICAgICAgIHZrOjpDbWRTZXRFdmVudChkYXRhLT5jb21tYW5kQnVmZmVyLCBkYXRhLT5ldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCk7CisgICAgICAgIGlmICgqZGF0YS0+YmFpbG91dCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2V4dGVybiAiQyIgdm9pZCAqVXBkYXRlRGVzY3JpcHRvcih2b2lkICphcmcpIHsKKyAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfc3RydWN0ICpkYXRhID0gKHN0cnVjdCB0aHJlYWRfZGF0YV9zdHJ1Y3QgKilhcmc7CisKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZlcl9pbmZvID0ge307CisgICAgYnVmZmVyX2luZm8uYnVmZmVyID0gZGF0YS0+YnVmZmVyOworICAgIGJ1ZmZlcl9pbmZvLm9mZnNldCA9IDA7CisgICAgYnVmZmVyX2luZm8ucmFuZ2UgPSAxOworCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZTsKKyAgICBtZW1zZXQoJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIHNpemVvZihkZXNjcmlwdG9yX3dyaXRlKSk7CisgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGF0YS0+ZGVzY3JpcHRvclNldDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSBkYXRhLT5iaW5kaW5nOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSAmYnVmZmVyX2luZm87CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDgwMDAwOyBpKyspIHsKKyAgICAgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKGRhdGEtPmRldmljZSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIE5VTEwpOworICAgICAgICBpZiAoKmRhdGEtPmJhaWxvdXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworZXh0ZXJuICJDIiB2b2lkICpSZWxlYXNlTnVsbEZlbmNlKHZvaWQgKmFyZykgeworICAgIHN0cnVjdCB0aHJlYWRfZGF0YV9zdHJ1Y3QgKmRhdGEgPSAoc3RydWN0IHRocmVhZF9kYXRhX3N0cnVjdCAqKWFyZzsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDAwMDA7IGkrKykgeworICAgICAgICB2azo6RGVzdHJveUZlbmNlKGRhdGEtPmRldmljZSwgVktfTlVMTF9IQU5ETEUsIE5VTEwpOworICAgICAgICBpZiAoKmRhdGEtPmJhaWxvdXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKEVycm9yTW9uaXRvciAqZXJyb3JfbW9uaXRvciwgY29uc3QgVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBycDJfc3VwcG9ydGVkLCBjb25zdCBjaGFyICpycDFfdnVpZCwgY29uc3QgY2hhciAqcnAyX3Z1aWQpIHsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyX3Bhc3MgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBpZiAocnAxX3Z1aWQpIHsKKyAgICAgICAgZXJyb3JfbW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHJwMV92dWlkKTsKKyAgICAgICAgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MoZGV2aWNlLCBjcmVhdGVfaW5mbywgbnVsbHB0ciwgJnJlbmRlcl9wYXNzKTsKKyAgICAgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB2azo6RGVzdHJveVJlbmRlclBhc3MoZGV2aWNlLCByZW5kZXJfcGFzcywgbnVsbHB0cik7CisgICAgICAgIGVycm9yX21vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgaWYgKHJwMl9zdXBwb3J0ZWQgJiYgcnAyX3Z1aWQpIHsKKyAgICAgICAgUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzczJLSFIgdmtDcmVhdGVSZW5kZXJQYXNzMktIUiA9CisgICAgICAgICAgICAoUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzczJLSFIpdms6OkdldERldmljZVByb2NBZGRyKGRldmljZSwgInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiKTsKKyAgICAgICAgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiBjcmVhdGVfaW5mbzI7CisgICAgICAgIENvbnZlcnRWa1JlbmRlclBhc3NDcmVhdGVJbmZvVG9WMktIUigqY3JlYXRlX2luZm8sICZjcmVhdGVfaW5mbzIpOworCisgICAgICAgIGVycm9yX21vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBycDJfdnVpZCk7CisgICAgICAgIGVyciA9IHZrQ3JlYXRlUmVuZGVyUGFzczJLSFIoZGV2aWNlLCBjcmVhdGVfaW5mbzIucHRyKCksIG51bGxwdHIsICZyZW5kZXJfcGFzcyk7CisgICAgICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKGRldmljZSwgcmVuZGVyX3Bhc3MsIG51bGxwdHIpOworICAgICAgICBlcnJvcl9tb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KK30KKwordm9pZCBQb3NpdGl2ZVRlc3RSZW5kZXJQYXNzQ3JlYXRlKEVycm9yTW9uaXRvciAqZXJyb3JfbW9uaXRvciwgY29uc3QgVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJwMl9zdXBwb3J0ZWQpIHsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyX3Bhc3MgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBlcnJvcl9tb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MoZGV2aWNlLCBjcmVhdGVfaW5mbywgbnVsbHB0ciwgJnJlbmRlcl9wYXNzKTsKKyAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhkZXZpY2UsIHJlbmRlcl9wYXNzLCBudWxscHRyKTsKKyAgICBlcnJvcl9tb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgaWYgKHJwMl9zdXBwb3J0ZWQpIHsKKyAgICAgICAgUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzczJLSFIgdmtDcmVhdGVSZW5kZXJQYXNzMktIUiA9CisgICAgICAgICAgICAoUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzczJLSFIpdms6OkdldERldmljZVByb2NBZGRyKGRldmljZSwgInZrQ3JlYXRlUmVuZGVyUGFzczJLSFIiKTsKKyAgICAgICAgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiBjcmVhdGVfaW5mbzI7CisgICAgICAgIENvbnZlcnRWa1JlbmRlclBhc3NDcmVhdGVJbmZvVG9WMktIUigqY3JlYXRlX2luZm8sICZjcmVhdGVfaW5mbzIpOworCisgICAgICAgIGVycm9yX21vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICAgICAgZXJyID0gdmtDcmVhdGVSZW5kZXJQYXNzMktIUihkZXZpY2UsIGNyZWF0ZV9pbmZvMi5wdHIoKSwgbnVsbHB0ciwgJnJlbmRlcl9wYXNzKTsKKyAgICAgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB2azo6RGVzdHJveVJlbmRlclBhc3MoZGV2aWNlLCByZW5kZXJfcGFzcywgbnVsbHB0cik7CisgICAgICAgIGVycm9yX21vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgfQorfQorCit2b2lkIFRlc3RSZW5kZXJQYXNzMktIUkNyZWF0ZShFcnJvck1vbml0b3IgKmVycm9yX21vbml0b3IsIGNvbnN0IFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgKmNyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcnAyX3Z1aWQpIHsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyX3Bhc3MgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgUEZOX3ZrQ3JlYXRlUmVuZGVyUGFzczJLSFIgdmtDcmVhdGVSZW5kZXJQYXNzMktIUiA9CisgICAgICAgIChQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlLCAidmtDcmVhdGVSZW5kZXJQYXNzMktIUiIpOworCisgICAgZXJyb3JfbW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHJwMl92dWlkKTsKKyAgICBlcnIgPSB2a0NyZWF0ZVJlbmRlclBhc3MyS0hSKGRldmljZSwgY3JlYXRlX2luZm8sIG51bGxwdHIsICZyZW5kZXJfcGFzcyk7CisgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB2azo6RGVzdHJveVJlbmRlclBhc3MoZGV2aWNlLCByZW5kZXJfcGFzcywgbnVsbHB0cik7CisgICAgZXJyb3JfbW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKwordm9pZCBUZXN0UmVuZGVyUGFzc0JlZ2luKEVycm9yTW9uaXRvciAqZXJyb3JfbW9uaXRvciwgY29uc3QgVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvICpiZWdpbl9pbmZvLCBib29sIHJwMlN1cHBvcnRlZCwgY29uc3QgY2hhciAqcnAxX3Z1aWQsIGNvbnN0IGNoYXIgKnJwMl92dWlkKSB7CisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNtZF9iZWdpbl9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQsIG51bGxwdHJ9OworCisgICAgaWYgKHJwMV92dWlkKSB7CisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXIsICZjbWRfYmVnaW5faW5mbyk7CisgICAgICAgIGVycm9yX21vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBycDFfdnVpZCk7CisgICAgICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZF9idWZmZXIsIGJlZ2luX2luZm8sIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKyAgICAgICAgZXJyb3JfbW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgdms6OlJlc2V0Q29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlciwgMCk7CisgICAgfQorICAgIGlmIChycDJTdXBwb3J0ZWQgJiYgcnAyX3Z1aWQpIHsKKyAgICAgICAgUEZOX3ZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiB2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIgPQorICAgICAgICAgICAgKFBGTl92a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIpdms6OkdldERldmljZVByb2NBZGRyKGRldmljZSwgInZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiIpOworICAgICAgICBWa1N1YnBhc3NCZWdpbkluZm9LSFIgc3VicGFzc19iZWdpbl9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFIsIG51bGxwdHIsIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FfTsKKyAgICAgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlciwgJmNtZF9iZWdpbl9pbmZvKTsKKyAgICAgICAgZXJyb3JfbW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHJwMl92dWlkKTsKKyAgICAgICAgdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKGNvbW1hbmRfYnVmZmVyLCBiZWdpbl9pbmZvLCAmc3VicGFzc19iZWdpbl9pbmZvKTsKKyAgICAgICAgZXJyb3JfbW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgdms6OlJlc2V0Q29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlciwgMCk7CisgICAgfQorfQorCit2b2lkIFZhbGlkT3duZXJzaGlwVHJhbnNmZXJPcChFcnJvck1vbml0b3IgKm1vbml0b3IsIFZrQ29tbWFuZEJ1ZmZlck9iaiAqY2IsIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY19zdGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3Rfc3RhZ2VzLCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKmJ1Zl9iYXJyaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKmltZ19iYXJyaWVyKSB7CisgICAgbW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIGNiLT5iZWdpbigpOworICAgIHVpbnQzMl90IG51bV9idWZfYmFycmllciA9IChidWZfYmFycmllcikgPyAxIDogMDsKKyAgICB1aW50MzJfdCBudW1faW1nX2JhcnJpZXIgPSAoaW1nX2JhcnJpZXIpID8gMSA6IDA7CisgICAgY2ItPlBpcGVsaW5lQmFycmllcihzcmNfc3RhZ2VzLCBkc3Rfc3RhZ2VzLCAwLCAwLCBudWxscHRyLCBudW1fYnVmX2JhcnJpZXIsIGJ1Zl9iYXJyaWVyLCBudW1faW1nX2JhcnJpZXIsIGltZ19iYXJyaWVyKTsKKyAgICBjYi0+ZW5kKCk7CisgICAgY2ItPlF1ZXVlQ29tbWFuZEJ1ZmZlcigpOyAgLy8gSW1wbGljaXRseSB3YWl0cworICAgIG1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK3ZvaWQgVmFsaWRPd25lcnNoaXBUcmFuc2ZlcihFcnJvck1vbml0b3IgKm1vbml0b3IsIFZrQ29tbWFuZEJ1ZmZlck9iaiAqY2JfZnJvbSwgVmtDb21tYW5kQnVmZmVyT2JqICpjYl90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNfc3RhZ2VzLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3Rfc3RhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqYnVmX2JhcnJpZXIsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICppbWdfYmFycmllcikgeworICAgIFZhbGlkT3duZXJzaGlwVHJhbnNmZXJPcChtb25pdG9yLCBjYl9mcm9tLCBzcmNfc3RhZ2VzLCBkc3Rfc3RhZ2VzLCBidWZfYmFycmllciwgaW1nX2JhcnJpZXIpOworICAgIFZhbGlkT3duZXJzaGlwVHJhbnNmZXJPcChtb25pdG9yLCBjYl90bywgc3JjX3N0YWdlcywgZHN0X3N0YWdlcywgYnVmX2JhcnJpZXIsIGltZ19iYXJyaWVyKTsKK30KKworVmtSZXN1bHQgR1BESUZQSGVscGVyKFZrUGh5c2ljYWxEZXZpY2UgZGV2LCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqY2ksIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzICpsaW1pdHMpIHsKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyB0bXBfbGltaXRzOworICAgIGxpbWl0cyA9IGxpbWl0cyA/IGxpbWl0cyA6ICZ0bXBfbGltaXRzOworICAgIHJldHVybiB2azo6R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoZGV2LCBjaS0+Zm9ybWF0LCBjaS0+aW1hZ2VUeXBlLCBjaS0+dGlsaW5nLCBjaS0+dXNhZ2UsIGNpLT5mbGFncywgbGltaXRzKTsKK30KKworVmtGb3JtYXQgRmluZEZvcm1hdExpbmVhcldpdGhvdXRNaXBzKFZrUGh5c2ljYWxEZXZpY2UgZ3B1LCBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jaSkgeworICAgIGltYWdlX2NpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVI7CisKKyAgICBjb25zdCBWa0Zvcm1hdCBmaXJzdF92a19mb3JtYXQgPSBzdGF0aWNfY2FzdDxWa0Zvcm1hdD4oMSk7CisgICAgY29uc3QgVmtGb3JtYXQgbGFzdF92a19mb3JtYXQgPSBzdGF0aWNfY2FzdDxWa0Zvcm1hdD4oMTMwKTsgIC8vIGF2b2lkIGNvbXByZXNzZWQvZmVhdHVyZSBwcm90ZWN0ZWQsIG90aGVyd2lzZSAxODQKKworICAgIGZvciAoVmtGb3JtYXQgZm9ybWF0ID0gZmlyc3RfdmtfZm9ybWF0OyBmb3JtYXQgPD0gbGFzdF92a19mb3JtYXQ7IGZvcm1hdCA9IHN0YXRpY19jYXN0PFZrRm9ybWF0Pihmb3JtYXQgKyAxKSkgeworICAgICAgICBpbWFnZV9jaS5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgICAgICAgLy8gV09SS0FST1VORCBmb3IgZGV2X3NpbSBhbmQgbW9ja19pY2Qgbm90IGNvbnRhaW5pbmcgdmFsaWQgZm9ybWF0IGxpbWl0cyB5ZXQKKyAgICAgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wczsKKyAgICAgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhncHUsIGZvcm1hdCwgJmZvcm1hdF9wcm9wcyk7CisgICAgICAgIGNvbnN0IFZrRm9ybWF0RmVhdHVyZUZsYWdzIGNvcmVfZmlsdGVyID0gMHgxRkZGOworICAgICAgICBjb25zdCBhdXRvIGZlYXR1cmVzID0gKGltYWdlX2NpLnRpbGluZyA9PSBWS19JTUFHRV9USUxJTkdfTElORUFSKSA/IGZvcm1hdF9wcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcyAmIGNvcmVfZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybWF0X3Byb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIGNvcmVfZmlsdGVyOworICAgICAgICBpZiAoIShmZWF0dXJlcyAmIGNvcmVfZmlsdGVyKSkgY29udGludWU7CisKKyAgICAgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgaW1nX2xpbWl0czsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgPT0gR1BESUZQSGVscGVyKGdwdSwgJmltYWdlX2NpLCAmaW1nX2xpbWl0cykgJiYgaW1nX2xpbWl0cy5tYXhNaXBMZXZlbHMgPT0gMSkgcmV0dXJuIGZvcm1hdDsKKyAgICB9CisKKyAgICByZXR1cm4gVktfRk9STUFUX1VOREVGSU5FRDsKK30KKworYm9vbCBGaW5kRm9ybWF0V2l0aG91dFNhbXBsZXMoVmtQaHlzaWNhbERldmljZSBncHUsIFZrSW1hZ2VDcmVhdGVJbmZvICZpbWFnZV9jaSkgeworICAgIGNvbnN0IFZrRm9ybWF0IGZpcnN0X3ZrX2Zvcm1hdCA9IHN0YXRpY19jYXN0PFZrRm9ybWF0PigxKTsKKyAgICBjb25zdCBWa0Zvcm1hdCBsYXN0X3ZrX2Zvcm1hdCA9IHN0YXRpY19jYXN0PFZrRm9ybWF0PigxMzApOyAgLy8gYXZvaWQgY29tcHJlc3NlZC9mZWF0dXJlIHByb3RlY3RlZCwgb3RoZXJ3aXNlIDE4NAorCisgICAgZm9yIChWa0Zvcm1hdCBmb3JtYXQgPSBmaXJzdF92a19mb3JtYXQ7IGZvcm1hdCA8PSBsYXN0X3ZrX2Zvcm1hdDsgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KGZvcm1hdCArIDEpKSB7CisgICAgICAgIGltYWdlX2NpLmZvcm1hdCA9IGZvcm1hdDsKKworICAgICAgICAvLyBXT1JLQVJPVU5EIGZvciBkZXZfc2ltIGFuZCBtb2NrX2ljZCBub3QgY29udGFpbmluZyB2YWxpZCBmb3JtYXQgbGltaXRzIHlldAorICAgICAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BzOworICAgICAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKGdwdSwgZm9ybWF0LCAmZm9ybWF0X3Byb3BzKTsKKyAgICAgICAgY29uc3QgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgY29yZV9maWx0ZXIgPSAweDFGRkY7CisgICAgICAgIGNvbnN0IGF1dG8gZmVhdHVyZXMgPSAoaW1hZ2VfY2kudGlsaW5nID09IFZLX0lNQUdFX1RJTElOR19MSU5FQVIpID8gZm9ybWF0X3Byb3BzLmxpbmVhclRpbGluZ0ZlYXR1cmVzICYgY29yZV9maWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgY29yZV9maWx0ZXI7CisgICAgICAgIGlmICghKGZlYXR1cmVzICYgY29yZV9maWx0ZXIpKSBjb250aW51ZTsKKworICAgICAgICBmb3IgKFZrU2FtcGxlQ291bnRGbGFnQml0cyBzYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzY0X0JJVDsgc2FtcGxlcyA+IDA7CisgICAgICAgICAgICAgc2FtcGxlcyA9IHN0YXRpY19jYXN0PFZrU2FtcGxlQ291bnRGbGFnQml0cz4oc2FtcGxlcyA+PiAxKSkgeworICAgICAgICAgICAgaW1hZ2VfY2kuc2FtcGxlcyA9IHNhbXBsZXM7CisgICAgICAgICAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyBpbWdfbGltaXRzOworICAgICAgICAgICAgaWYgKFZLX1NVQ0NFU1MgPT0gR1BESUZQSGVscGVyKGdwdSwgJmltYWdlX2NpLCAmaW1nX2xpbWl0cykgJiYgIShpbWdfbGltaXRzLnNhbXBsZUNvdW50cyAmIHNhbXBsZXMpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBGaW5kVW5zdXBwb3J0ZWRJbWFnZShWa1BoeXNpY2FsRGV2aWNlIGdwdSwgVmtJbWFnZUNyZWF0ZUluZm8gJmltYWdlX2NpKSB7CisgICAgY29uc3QgVmtGb3JtYXQgZmlyc3RfdmtfZm9ybWF0ID0gc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KDEpOworICAgIGNvbnN0IFZrRm9ybWF0IGxhc3RfdmtfZm9ybWF0ID0gc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KDEzMCk7ICAvLyBhdm9pZCBjb21wcmVzc2VkL2ZlYXR1cmUgcHJvdGVjdGVkLCBvdGhlcndpc2UgMTg0CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa0ltYWdlVGlsaW5nPiB0aWxpbmdzID0ge1ZLX0lNQUdFX1RJTElOR19MSU5FQVIsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gdGlsaW5nIDogdGlsaW5ncykgeworICAgICAgICBpbWFnZV9jaS50aWxpbmcgPSB0aWxpbmc7CisKKyAgICAgICAgZm9yIChWa0Zvcm1hdCBmb3JtYXQgPSBmaXJzdF92a19mb3JtYXQ7IGZvcm1hdCA8PSBsYXN0X3ZrX2Zvcm1hdDsgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KGZvcm1hdCArIDEpKSB7CisgICAgICAgICAgICBpbWFnZV9jaS5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgICAgICAgICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcHM7CisgICAgICAgICAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKGdwdSwgZm9ybWF0LCAmZm9ybWF0X3Byb3BzKTsKKworICAgICAgICAgICAgY29uc3QgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgY29yZV9maWx0ZXIgPSAweDFGRkY7CisgICAgICAgICAgICBjb25zdCBhdXRvIGZlYXR1cmVzID0gKHRpbGluZyA9PSBWS19JTUFHRV9USUxJTkdfTElORUFSKSA/IGZvcm1hdF9wcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcyAmIGNvcmVfZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1hdF9wcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgJiBjb3JlX2ZpbHRlcjsKKyAgICAgICAgICAgIGlmICghKGZlYXR1cmVzICYgY29yZV9maWx0ZXIpKSBjb250aW51ZTsgIC8vIFdlIHdhbmQgc3VwcG9ydGVkIGJ5IGZlYXR1cmVzLCBidXQgbm90IGJ5IEltYWdlRm9ybWF0UHJvcGVydGllcworCisgICAgICAgICAgICAvLyBnZXQgYXMgbWFueSB1c2FnZSBmbGFncyBhcyBwb3NzaWJsZQorICAgICAgICAgICAgaW1hZ2VfY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUKSBpbWFnZV9jaS51c2FnZSB8PSBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklUKSBpbWFnZV9jaS51c2FnZSB8PSBWS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVDsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUKSBpbWFnZV9jaS51c2FnZSB8PSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQpCisgICAgICAgICAgICAgICAgaW1hZ2VfY2kudXNhZ2UgfD0gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDsKKworICAgICAgICAgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgaW1nX2xpbWl0czsKKyAgICAgICAgICAgIGlmIChWS19FUlJPUl9GT1JNQVRfTk9UX1NVUFBPUlRFRCA9PSBHUERJRlBIZWxwZXIoZ3B1LCAmaW1hZ2VfY2ksICZpbWdfbGltaXRzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitWa0Zvcm1hdCBGaW5kRm9ybWF0V2l0aG91dEZlYXR1cmVzKFZrUGh5c2ljYWxEZXZpY2UgZ3B1LCBWa0ltYWdlVGlsaW5nIHRpbGluZywgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgdW5kZXNpcmVkX2ZlYXR1cmVzKSB7CisgICAgY29uc3QgVmtGb3JtYXQgZmlyc3RfdmtfZm9ybWF0ID0gc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KDEpOworICAgIGNvbnN0IFZrRm9ybWF0IGxhc3RfdmtfZm9ybWF0ID0gc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KDEzMCk7ICAvLyBhdm9pZCBjb21wcmVzc2VkL2ZlYXR1cmUgcHJvdGVjdGVkLCBvdGhlcndpc2UgMTg0CisKKyAgICBmb3IgKFZrRm9ybWF0IGZvcm1hdCA9IGZpcnN0X3ZrX2Zvcm1hdDsgZm9ybWF0IDw9IGxhc3RfdmtfZm9ybWF0OyBmb3JtYXQgPSBzdGF0aWNfY2FzdDxWa0Zvcm1hdD4oZm9ybWF0ICsgMSkpIHsKKyAgICAgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wczsKKyAgICAgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhncHUsIGZvcm1hdCwgJmZvcm1hdF9wcm9wcyk7CisKKyAgICAgICAgY29uc3QgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgY29yZV9maWx0ZXIgPSAweDFGRkY7CisgICAgICAgIGNvbnN0IGF1dG8gZmVhdHVyZXMgPSAodGlsaW5nID09IFZLX0lNQUdFX1RJTElOR19MSU5FQVIpID8gZm9ybWF0X3Byb3BzLmxpbmVhclRpbGluZ0ZlYXR1cmVzICYgY29yZV9maWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgY29yZV9maWx0ZXI7CisKKyAgICAgICAgY29uc3QgYXV0byB2YWxpZF9mZWF0dXJlcyA9IGZlYXR1cmVzICYgY29yZV9maWx0ZXI7CisgICAgICAgIGlmICh1bmRlc2lyZWRfZmVhdHVyZXMgPT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgaWYgKCF2YWxpZF9mZWF0dXJlcykgcmV0dXJuIGZvcm1hdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh2YWxpZF9mZWF0dXJlcyAmJiAhKHZhbGlkX2ZlYXR1cmVzICYgdW5kZXNpcmVkX2ZlYXR1cmVzKSkgcmV0dXJuIGZvcm1hdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBWS19GT1JNQVRfVU5ERUZJTkVEOworfQorCit2b2lkIE5lZ0hlaWdodFZpZXdwb3J0VGVzdHMoVmtEZXZpY2VPYmogKm1fZGV2aWNlLCBWa0NvbW1hbmRCdWZmZXJPYmogKm1fY29tbWFuZEJ1ZmZlciwgRXJyb3JNb25pdG9yICptX2Vycm9yTW9uaXRvcikgeworICAgIGNvbnN0IGF1dG8gJmxpbWl0cyA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHM7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICB1c2luZyBzdGQ6OnZlY3RvcjsKKyAgICBzdHJ1Y3QgVGVzdENhc2UgeworICAgICAgICBWa1ZpZXdwb3J0IHZwOworICAgICAgICB2ZWN0b3I8c3RkOjpzdHJpbmc+IHZ1aWRzOworICAgIH07CisKKyAgICAvLyBub3QgbmVjZXNzYXJpbHkgYm91bmRhcnkgdmFsdWVzICh1bnNwZWNpZmllZCBjYXN0IHJvdW5kaW5nKSwgYnV0IGd1YXJhbnRlZWQgdG8gYmUgb3ZlciBsaW1pdAorICAgIGNvbnN0IGF1dG8gb25lX2JlZm9yZV9taW5faCA9IE5lYXJlc3RTbWFsbGVyKC1zdGF0aWNfY2FzdDxmbG9hdD4obGltaXRzLm1heFZpZXdwb3J0RGltZW5zaW9uc1sxXSkpOworICAgIGNvbnN0IGF1dG8gb25lX3Bhc3RfbWF4X2ggPSBOZWFyZXN0R3JlYXRlcihzdGF0aWNfY2FzdDxmbG9hdD4obGltaXRzLm1heFZpZXdwb3J0RGltZW5zaW9uc1sxXSkpOworCisgICAgY29uc3QgYXV0byBtaW5fYm91bmQgPSBsaW1pdHMudmlld3BvcnRCb3VuZHNSYW5nZVswXTsKKyAgICBjb25zdCBhdXRvIG1heF9ib3VuZCA9IGxpbWl0cy52aWV3cG9ydEJvdW5kc1JhbmdlWzFdOworICAgIGNvbnN0IGF1dG8gb25lX2JlZm9yZV9taW5fYm91bmQgPSBOZWFyZXN0U21hbGxlcihtaW5fYm91bmQpOworICAgIGNvbnN0IGF1dG8gb25lX3Bhc3RfbWF4X2JvdW5kID0gTmVhcmVzdEdyZWF0ZXIobWF4X2JvdW5kKTsKKworICAgIGNvbnN0IHZlY3RvcjxUZXN0Q2FzZT4gdGVzdF9jYXNlcyA9IHt7ezAuMCwgMC4wLCA2NC4wLCBvbmVfYmVmb3JlX21pbl9oLCAwLjAsIDEuMH0sIHsiVlVJRC1Wa1ZpZXdwb3J0LWhlaWdodC0wMTc3MyJ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3swLjAsIDAuMCwgNjQuMCwgb25lX3Bhc3RfbWF4X2gsIDAuMCwgMS4wfSwgeyJWVUlELVZrVmlld3BvcnQtaGVpZ2h0LTAxNzczIn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezAuMCwgMC4wLCA2NC4wLCBOQU4sIDAuMCwgMS4wfSwgeyJWVUlELVZrVmlld3BvcnQtaGVpZ2h0LTAxNzczIn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezAuMCwgb25lX2JlZm9yZV9taW5fYm91bmQsIDY0LjAsIDEuMCwgMC4wLCAxLjB9LCB7IlZVSUQtVmtWaWV3cG9ydC15LTAxNzc1In19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezAuMCwgb25lX3Bhc3RfbWF4X2JvdW5kLCA2NC4wLCAtMS4wLCAwLjAsIDEuMH0sIHsiVlVJRC1Wa1ZpZXdwb3J0LXktMDE3NzYifX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MC4wLCBtaW5fYm91bmQsIDY0LjAsIC0xLjAsIDAuMCwgMS4wfSwgeyJWVUlELVZrVmlld3BvcnQteS0wMTc3NyJ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3swLjAsIG1heF9ib3VuZCwgNjQuMCwgMS4wLCAwLjAsIDEuMH0sIHsiVlVJRC1Wa1ZpZXdwb3J0LXktMDEyMzMifX19OworCisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0X2Nhc2UgOiB0ZXN0X2Nhc2VzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byB2dWlkIDogdGVzdF9jYXNlLnZ1aWRzKSB7CisgICAgICAgICAgICBpZiAodnVpZCA9PSAiVlVJRC1VbmRlZmluZWQiKQorICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIGxlc3MgdGhhbiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjp2aWV3cG9ydEJvdW5kc1JhbmdlWzBdIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB2dWlkKTsKKyAgICAgICAgfQorICAgICAgICB2azo6Q21kU2V0Vmlld3BvcnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnRlc3RfY2FzZS52cCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KK30KKwordm9pZCBDcmVhdGVTYW1wbGVyVGVzdChWa0xheWVyVGVzdCAmdGVzdCwgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIHN0ZDo6c3RyaW5nIGNvZGUpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgVmtTYW1wbGVyIHNhbXBsZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBpZiAoY29kZS5sZW5ndGgoKSkKKyAgICAgICAgdGVzdC5Nb25pdG9yKCktPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUIHwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgY29kZSk7CisgICAgZWxzZQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+RXhwZWN0U3VjY2VzcygpOworCisgICAgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIodGVzdC5kZXZpY2UoKSwgcENyZWF0ZUluZm8sIE5VTEwsICZzYW1wbGVyKTsKKyAgICBpZiAoY29kZS5sZW5ndGgoKSkKKyAgICAgICAgdGVzdC5Nb25pdG9yKCktPlZlcmlmeUZvdW5kKCk7CisgICAgZWxzZQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIGlmIChWS19TVUNDRVNTID09IGVycikgeworICAgICAgICB2azo6RGVzdHJveVNhbXBsZXIodGVzdC5kZXZpY2UoKSwgc2FtcGxlciwgTlVMTCk7CisgICAgfQorfQorCit2b2lkIENyZWF0ZUJ1ZmZlclRlc3QoVmtMYXllclRlc3QgJnRlc3QsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIHN0ZDo6c3RyaW5nIGNvZGUpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgVmtCdWZmZXIgYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgICAgaWYgKGNvZGUubGVuZ3RoKCkpCisgICAgICAgIHRlc3QuTW9uaXRvcigpLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgY29kZSk7CisgICAgZWxzZQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+RXhwZWN0U3VjY2VzcygpOworCisgICAgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcih0ZXN0LmRldmljZSgpLCBwQ3JlYXRlSW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgaWYgKGNvZGUubGVuZ3RoKCkpCisgICAgICAgIHRlc3QuTW9uaXRvcigpLT5WZXJpZnlGb3VuZCgpOworICAgIGVsc2UKKyAgICAgICAgdGVzdC5Nb25pdG9yKCktPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSBlcnIpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lCdWZmZXIodGVzdC5kZXZpY2UoKSwgYnVmZmVyLCBOVUxMKTsKKyAgICB9Cit9CisKK3ZvaWQgQ3JlYXRlSW1hZ2VUZXN0KFZrTGF5ZXJUZXN0ICZ0ZXN0LCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIHN0ZDo6c3RyaW5nIGNvZGUpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgVmtJbWFnZSBpbWFnZSA9IFZLX05VTExfSEFORExFOworICAgIGlmIChjb2RlLmxlbmd0aCgpKQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGNvZGUpOworICAgIGVsc2UKKyAgICAgICAgdGVzdC5Nb25pdG9yKCktPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZSh0ZXN0LmRldmljZSgpLCBwQ3JlYXRlSW5mbywgTlVMTCwgJmltYWdlKTsKKyAgICBpZiAoY29kZS5sZW5ndGgoKSkKKyAgICAgICAgdGVzdC5Nb25pdG9yKCktPlZlcmlmeUZvdW5kKCk7CisgICAgZWxzZQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIGlmIChWS19TVUNDRVNTID09IGVycikgeworICAgICAgICB2azo6RGVzdHJveUltYWdlKHRlc3QuZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKKyAgICB9Cit9CisKK3ZvaWQgQ3JlYXRlQnVmZmVyVmlld1Rlc3QoVmtMYXllclRlc3QgJnRlc3QsIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmNvZGVzKSB7CisgICAgVmtSZXN1bHQgZXJyOworICAgIFZrQnVmZmVyVmlldyB2aWV3ID0gVktfTlVMTF9IQU5ETEU7CisgICAgaWYgKGNvZGVzLnNpemUoKSkKKyAgICAgICAgc3RkOjpmb3JfZWFjaChjb2Rlcy5iZWdpbigpLCBjb2Rlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBbJl0oY29uc3Qgc3RkOjpzdHJpbmcgJnMpIHsgdGVzdC5Nb25pdG9yKCktPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBzKTsgfSk7CisgICAgZWxzZQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+RXhwZWN0U3VjY2VzcygpOworCisgICAgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlclZpZXcodGVzdC5kZXZpY2UoKSwgcENyZWF0ZUluZm8sIE5VTEwsICZ2aWV3KTsKKyAgICBpZiAoY29kZXMuc2l6ZSgpKQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+VmVyaWZ5Rm91bmQoKTsKKyAgICBlbHNlCisgICAgICAgIHRlc3QuTW9uaXRvcigpLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gZXJyKSB7CisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyVmlldyh0ZXN0LmRldmljZSgpLCB2aWV3LCBOVUxMKTsKKyAgICB9Cit9CisKK3ZvaWQgQ3JlYXRlSW1hZ2VWaWV3VGVzdChWa0xheWVyVGVzdCAmdGVzdCwgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywgc3RkOjpzdHJpbmcgY29kZSkgeworICAgIFZrUmVzdWx0IGVycjsKKyAgICBWa0ltYWdlVmlldyB2aWV3ID0gVktfTlVMTF9IQU5ETEU7CisgICAgaWYgKGNvZGUubGVuZ3RoKCkpCisgICAgICAgIHRlc3QuTW9uaXRvcigpLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgY29kZSk7CisgICAgZWxzZQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+RXhwZWN0U3VjY2VzcygpOworCisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlVmlldyh0ZXN0LmRldmljZSgpLCBwQ3JlYXRlSW5mbywgTlVMTCwgJnZpZXcpOworICAgIGlmIChjb2RlLmxlbmd0aCgpKQorICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+VmVyaWZ5Rm91bmQoKTsKKyAgICBlbHNlCisgICAgICAgIHRlc3QuTW9uaXRvcigpLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gZXJyKSB7CisgICAgICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KHRlc3QuZGV2aWNlKCksIHZpZXcsIE5VTEwpOworICAgIH0KK30KKworVmtTYW1wbGVyQ3JlYXRlSW5mbyBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCkgeworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9jcmVhdGVfaW5mbyA9IHt9OworICAgIHNhbXBsZXJfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX0NSRUFURV9JTkZPOworICAgIHNhbXBsZXJfY3JlYXRlX2luZm8ucE5leHQgPSBudWxscHRyOworICAgIHNhbXBsZXJfY3JlYXRlX2luZm8ubWFnRmlsdGVyID0gVktfRklMVEVSX05FQVJFU1Q7CisgICAgc2FtcGxlcl9jcmVhdGVfaW5mby5taW5GaWx0ZXIgPSBWS19GSUxURVJfTkVBUkVTVDsKKyAgICBzYW1wbGVyX2NyZWF0ZV9pbmZvLm1pcG1hcE1vZGUgPSBWS19TQU1QTEVSX01JUE1BUF9NT0RFX05FQVJFU1Q7CisgICAgc2FtcGxlcl9jcmVhdGVfaW5mby5hZGRyZXNzTW9kZVUgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFOworICAgIHNhbXBsZXJfY3JlYXRlX2luZm8uYWRkcmVzc01vZGVWID0gVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTsKKyAgICBzYW1wbGVyX2NyZWF0ZV9pbmZvLmFkZHJlc3NNb2RlVyA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0U7CisgICAgc2FtcGxlcl9jcmVhdGVfaW5mby5taXBMb2RCaWFzID0gMC4wOworICAgIHNhbXBsZXJfY3JlYXRlX2luZm8uYW5pc290cm9weUVuYWJsZSA9IFZLX0ZBTFNFOworICAgIHNhbXBsZXJfY3JlYXRlX2luZm8ubWF4QW5pc290cm9weSA9IDEuMDsKKyAgICBzYW1wbGVyX2NyZWF0ZV9pbmZvLmNvbXBhcmVFbmFibGUgPSBWS19GQUxTRTsKKyAgICBzYW1wbGVyX2NyZWF0ZV9pbmZvLmNvbXBhcmVPcCA9IFZLX0NPTVBBUkVfT1BfTkVWRVI7CisgICAgc2FtcGxlcl9jcmVhdGVfaW5mby5taW5Mb2QgPSAwLjA7CisgICAgc2FtcGxlcl9jcmVhdGVfaW5mby5tYXhMb2QgPSAxNi4wOworICAgIHNhbXBsZXJfY3JlYXRlX2luZm8uYm9yZGVyQ29sb3IgPSBWS19CT1JERVJfQ09MT1JfRkxPQVRfT1BBUVVFX1dISVRFOworICAgIHNhbXBsZXJfY3JlYXRlX2luZm8udW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgPSBWS19GQUxTRTsKKworICAgIHJldHVybiBzYW1wbGVyX2NyZWF0ZV9pbmZvOworfQorCitWa0ltYWdlVmlld0NyZWF0ZUluZm8gU2FmZVNhbmVJbWFnZVZpZXdDcmVhdGVJbmZvKFZrSW1hZ2UgaW1hZ2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdF9tYXNrKSB7CisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLmltYWdlID0gaW1hZ2U7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gYXNwZWN0X21hc2s7CisKKyAgICByZXR1cm4gaW1hZ2Vfdmlld19jcmVhdGVfaW5mbzsKK30KKworVmtJbWFnZVZpZXdDcmVhdGVJbmZvIFNhZmVTYW5lSW1hZ2VWaWV3Q3JlYXRlSW5mbyhjb25zdCBWa0ltYWdlT2JqICZpbWFnZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0X21hc2spIHsKKyAgICByZXR1cm4gU2FmZVNhbmVJbWFnZVZpZXdDcmVhdGVJbmZvKGltYWdlLmhhbmRsZSgpLCBmb3JtYXQsIGFzcGVjdF9tYXNrKTsKK30KKworYm9vbCBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydChWa1JlbmRlckZyYW1ld29yayAqcmVuZGVyRnJhbWV3b3JrLCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+ICZkZXZpY2VfZXh0ZW5zaW9uX25hbWVzKSB7CisgICAgaWYgKHJlbmRlckZyYW1ld29yay0+RGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKHJlbmRlckZyYW1ld29yay0+Z3B1KCksIG51bGxwdHIsIFZLX0tIUl9DUkVBVEVfUkVOREVSUEFTU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBkZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIGRldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9DUkVBVEVfUkVOREVSUEFTU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDaGVja0Rlc2NyaXB0b3JJbmRleGluZ1N1cHBvcnRBbmRJbml0RnJhbWV3b3JrKFZrUmVuZGVyRnJhbWV3b3JrICpyZW5kZXJGcmFtZXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiAmaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJmRldmljZV9leHRlbnNpb25fbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgKmZlYXR1cmVzLCB2b2lkICp1c2VyRGF0YSkgeworICAgIGJvb2wgZGVzY3JpcHRvcl9pbmRleGluZyA9IHJlbmRlckZyYW1ld29yay0+SW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoZGVzY3JpcHRvcl9pbmRleGluZykgeworICAgICAgICBpbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorICAgIHJlbmRlckZyYW1ld29yay0+SW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIHVzZXJEYXRhLCBmZWF0dXJlcyk7CisgICAgZGVzY3JpcHRvcl9pbmRleGluZyA9IGRlc2NyaXB0b3JfaW5kZXhpbmcgJiYgcmVuZGVyRnJhbWV3b3JrLT5EZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQocmVuZGVyRnJhbWV3b3JrLT5ncHUoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfTUFJTlRFTkFOQ0UzX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBkZXNjcmlwdG9yX2luZGV4aW5nID0gZGVzY3JpcHRvcl9pbmRleGluZyAmJiByZW5kZXJGcmFtZXdvcmstPkRldmljZUV4dGVuc2lvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRnJhbWV3b3JrLT5ncHUoKSwgbnVsbHB0ciwgVktfRVhUX0RFU0NSSVBUT1JfSU5ERVhJTkdfRVhURU5TSU9OX05BTUUpOworICAgIGlmIChkZXNjcmlwdG9yX2luZGV4aW5nKSB7CisgICAgICAgIGRldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUpOworICAgICAgICBkZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfREVTQ1JJUFRPUl9JTkRFWElOR19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVmtMYXllclRlc3Q6OlZLVHJpYW5nbGVUZXN0KEJzb0ZhaWxTZWxlY3QgZmFpbENhc2UpIHsKKyAgICBBU1NFUlRfVFJVRShtX2RldmljZSAmJiBtX2RldmljZS0+aW5pdGlhbGl6ZWQoKSk7ICAvLyBWS1RyaWFuZ2xlVGVzdCBhc3N1bWVzIEluaXQoKSBoYXMgZmluaXNoZWQKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIHBzKG1fZGV2aWNlLCBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGVsaW5lb2JqKG1fZGV2aWNlKTsKKyAgICBwaXBlbGluZW9iai5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZWxpbmVvYmouQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZWxpbmVvYmouQWRkU2hhZGVyKCZwcyk7CisKKyAgICBib29sIGZhaWxjYXNlX25lZWRzX2RlcHRoID0gZmFsc2U7ICAvLyB0byBtYXJrIGNhc2VzIHRoYXQgbmVlZCBkZXB0aCBhdHRhY2htZW50CisKKyAgICBWa0J1ZmZlck9iaiBpbmRleF9idWZmZXI7CisKKyAgICBzd2l0Y2ggKGZhaWxDYXNlKSB7CisgICAgICAgIGNhc2UgQnNvRmFpbExpbmVXaWR0aDogeworICAgICAgICAgICAgcGlwZWxpbmVvYmouTWFrZUR5bmFtaWMoVktfRFlOQU1JQ19TVEFURV9MSU5FX1dJRFRIKTsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlhX3N0YXRlID0ge307CisgICAgICAgICAgICBpYV9zdGF0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPOworICAgICAgICAgICAgaWFfc3RhdGUudG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9MSVNUOworICAgICAgICAgICAgcGlwZWxpbmVvYmouU2V0SW5wdXRBc3NlbWJseSgmaWFfc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCc29GYWlsTGluZVN0aXBwbGU6IHsKKyAgICAgICAgICAgIHBpcGVsaW5lb2JqLk1ha2VEeW5hbWljKFZLX0RZTkFNSUNfU1RBVEVfTElORV9TVElQUExFX0VYVCk7CisgICAgICAgICAgICBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyBpYV9zdGF0ZSA9IHt9OworICAgICAgICAgICAgaWFfc3RhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIGlhX3N0YXRlLnRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVDsKKyAgICAgICAgICAgIHBpcGVsaW5lb2JqLlNldElucHV0QXNzZW1ibHkoJmlhX3N0YXRlKTsKKworICAgICAgICAgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIGxpbmVfc3RhdGUgPSB7fTsKKyAgICAgICAgICAgIGxpbmVfc3RhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0xJTkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworICAgICAgICAgICAgbGluZV9zdGF0ZS5saW5lUmFzdGVyaXphdGlvbk1vZGUgPSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9CUkVTRU5IQU1fRVhUOworICAgICAgICAgICAgbGluZV9zdGF0ZS5zdGlwcGxlZExpbmVFbmFibGUgPSBWS19UUlVFOworICAgICAgICAgICAgbGluZV9zdGF0ZS5saW5lU3RpcHBsZUZhY3RvciA9IDA7CisgICAgICAgICAgICBsaW5lX3N0YXRlLmxpbmVTdGlwcGxlUGF0dGVybiA9IDA7CisgICAgICAgICAgICBwaXBlbGluZW9iai5TZXRMaW5lU3RhdGUoJmxpbmVfc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCc29GYWlsRGVwdGhCaWFzOiB7CisgICAgICAgICAgICBwaXBlbGluZW9iai5NYWtlRHluYW1pYyhWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JJQVMpOworICAgICAgICAgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gcnNfc3RhdGUgPSB7fTsKKyAgICAgICAgICAgIHJzX3N0YXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIHJzX3N0YXRlLmRlcHRoQmlhc0VuYWJsZSA9IFZLX1RSVUU7CisgICAgICAgICAgICByc19zdGF0ZS5saW5lV2lkdGggPSAxLjBmOworICAgICAgICAgICAgcGlwZWxpbmVvYmouU2V0UmFzdGVyaXphdGlvbigmcnNfc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCc29GYWlsVmlld3BvcnQ6IHsKKyAgICAgICAgICAgIHBpcGVsaW5lb2JqLk1ha2VEeW5hbWljKFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCc29GYWlsU2Npc3NvcjogeworICAgICAgICAgICAgcGlwZWxpbmVvYmouTWFrZUR5bmFtaWMoVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQnNvRmFpbEJsZW5kOiB7CisgICAgICAgICAgICBwaXBlbGluZW9iai5NYWtlRHluYW1pYyhWS19EWU5BTUlDX1NUQVRFX0JMRU5EX0NPTlNUQU5UUyk7CisgICAgICAgICAgICBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBhdHRfc3RhdGUgPSB7fTsKKyAgICAgICAgICAgIGF0dF9zdGF0ZS5kc3RBbHBoYUJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0NPTE9SOworICAgICAgICAgICAgYXR0X3N0YXRlLmJsZW5kRW5hYmxlID0gVktfVFJVRTsKKyAgICAgICAgICAgIHBpcGVsaW5lb2JqLkFkZENvbG9yQXR0YWNobWVudCgwLCBhdHRfc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCc29GYWlsRGVwdGhCb3VuZHM6IHsKKyAgICAgICAgICAgIGZhaWxjYXNlX25lZWRzX2RlcHRoID0gdHJ1ZTsKKyAgICAgICAgICAgIHBpcGVsaW5lb2JqLk1ha2VEeW5hbWljKFZLX0RZTkFNSUNfU1RBVEVfREVQVEhfQk9VTkRTKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQnNvRmFpbFN0ZW5jaWxSZWFkTWFzazogeworICAgICAgICAgICAgZmFpbGNhc2VfbmVlZHNfZGVwdGggPSB0cnVlOworICAgICAgICAgICAgcGlwZWxpbmVvYmouTWFrZUR5bmFtaWMoVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX0NPTVBBUkVfTUFTSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEJzb0ZhaWxTdGVuY2lsV3JpdGVNYXNrOiB7CisgICAgICAgICAgICBmYWlsY2FzZV9uZWVkc19kZXB0aCA9IHRydWU7CisgICAgICAgICAgICBwaXBlbGluZW9iai5NYWtlRHluYW1pYyhWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfV1JJVEVfTUFTSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEJzb0ZhaWxTdGVuY2lsUmVmZXJlbmNlOiB7CisgICAgICAgICAgICBmYWlsY2FzZV9uZWVkc19kZXB0aCA9IHRydWU7CisgICAgICAgICAgICBwaXBlbGluZW9iai5NYWtlRHluYW1pYyhWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfUkVGRVJFTkNFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCc29GYWlsSW5kZXhCdWZmZXI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCc29GYWlsSW5kZXhCdWZmZXJCYWRTaXplOgorICAgICAgICBjYXNlIEJzb0ZhaWxJbmRleEJ1ZmZlckJhZE9mZnNldDoKKyAgICAgICAgY2FzZSBCc29GYWlsSW5kZXhCdWZmZXJCYWRNYXBTaXplOgorICAgICAgICBjYXNlIEJzb0ZhaWxJbmRleEJ1ZmZlckJhZE1hcE9mZnNldDogeworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGluZGV4IGJ1ZmZlciBmb3IgdGhlc2UgdGVzdHMuCisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHBvcHVsYXRlIGl0IGJlY2F1c2Ugd2Ugc2hvdWxkIGJhaWwgYmVmb3JlIHRyeWluZyB0byBkcmF3LgorICAgICAgICAgICAgdWludDMyX3QgY29uc3QgaW5kaWNlc1tdID0gezB9OworICAgICAgICAgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9pbmZvID0ge307CisgICAgICAgICAgICBidWZmZXJfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIGJ1ZmZlcl9pbmZvLnNpemUgPSAxMDI0OworICAgICAgICAgICAgYnVmZmVyX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVDsKKyAgICAgICAgICAgIGJ1ZmZlcl9pbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgICAgICAgICBidWZmZXJfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gaW5kaWNlczsKKyAgICAgICAgICAgIGluZGV4X2J1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZmVyX2luZm8sIChWa01lbW9yeVByb3BlcnR5RmxhZ3MpVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEJzb0ZhaWxDbWRDbGVhckF0dGFjaG1lbnRzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQnNvRmFpbE5vbmU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIFZrRGVzY3JpcHRvclNldE9iaiBkZXNjcmlwdG9yU2V0KG1fZGV2aWNlKTsKKworICAgIFZrSW1hZ2VWaWV3ICpkZXB0aF9hdHRhY2htZW50ID0gbnVsbHB0cjsKKyAgICBpZiAoZmFpbGNhc2VfbmVlZHNfZGVwdGgpIHsKKyAgICAgICAgbV9kZXB0aF9zdGVuY2lsX2ZtdCA9IEZpbmRTdXBwb3J0ZWREZXB0aFN0ZW5jaWxGb3JtYXQoZ3B1KCkpOworICAgICAgICBBU1NFUlRfVFJVRShtX2RlcHRoX3N0ZW5jaWxfZm10ICE9IFZLX0ZPUk1BVF9VTkRFRklORUQpOworCisgICAgICAgIG1fZGVwdGhTdGVuY2lsLT5Jbml0KG1fZGV2aWNlLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4obV93aWR0aCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihtX2hlaWdodCksIG1fZGVwdGhfc3RlbmNpbF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKTsKKyAgICAgICAgZGVwdGhfYXR0YWNobWVudCA9IG1fZGVwdGhTdGVuY2lsLT5CaW5kSW5mbygpOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoMSwgZGVwdGhfYXR0YWNobWVudCkpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIEdlbmVyaWNEcmF3UHJlcGFyYXRpb24obV9jb21tYW5kQnVmZmVyLCBwaXBlbGluZW9iaiwgZGVzY3JpcHRvclNldCwgZmFpbENhc2UpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgIC8vIHJlbmRlciB0cmlhbmdsZQorICAgIGlmIChmYWlsQ2FzZSA9PSBCc29GYWlsSW5kZXhCdWZmZXIpIHsKKyAgICAgICAgLy8gVXNlIERyYXdJbmRleGVkIHcvbyBhbiBpbmRleCBidWZmZXIgYm91bmQKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3SW5kZXhlZCgzLCAxLCAwLCAwLCAwKTsKKyAgICB9IGVsc2UgaWYgKGZhaWxDYXNlID09IEJzb0ZhaWxJbmRleEJ1ZmZlckJhZFNpemUpIHsKKyAgICAgICAgLy8gQmluZCB0aGUgaW5kZXggYnVmZmVyIGFuZCBkcmF3IG9uZSB0b28gbWFueSBpbmRpY2VzCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+QmluZEluZGV4QnVmZmVyKCZpbmRleF9idWZmZXIsIDAsIFZLX0lOREVYX1RZUEVfVUlOVDE2KTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3SW5kZXhlZCg1MTMsIDEsIDAsIDAsIDApOworICAgIH0gZWxzZSBpZiAoZmFpbENhc2UgPT0gQnNvRmFpbEluZGV4QnVmZmVyQmFkT2Zmc2V0KSB7CisgICAgICAgIC8vIEJpbmQgdGhlIGluZGV4IGJ1ZmZlciBhbmQgZHJhdyBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdXNpbmcgdGhlIG9mZnNldAorICAgICAgICBtX2NvbW1hbmRCdWZmZXItPkJpbmRJbmRleEJ1ZmZlcigmaW5kZXhfYnVmZmVyLCAwLCBWS19JTkRFWF9UWVBFX1VJTlQxNik7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhd0luZGV4ZWQoNTEyLCAxLCAxLCAwLCAwKTsKKyAgICB9IGVsc2UgaWYgKGZhaWxDYXNlID09IEJzb0ZhaWxJbmRleEJ1ZmZlckJhZE1hcFNpemUpIHsKKyAgICAgICAgLy8gQmluZCB0aGUgaW5kZXggYnVmZmVyIGF0IHRoZSBtaWRkbGUgcG9pbnQgYW5kIGRyYXcgb25lIHRvbyBtYW55IGluZGljZXMKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5CaW5kSW5kZXhCdWZmZXIoJmluZGV4X2J1ZmZlciwgNTEyLCBWS19JTkRFWF9UWVBFX1VJTlQxNik7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhd0luZGV4ZWQoMjU3LCAxLCAwLCAwLCAwKTsKKyAgICB9IGVsc2UgaWYgKGZhaWxDYXNlID09IEJzb0ZhaWxJbmRleEJ1ZmZlckJhZE1hcE9mZnNldCkgeworICAgICAgICAvLyBCaW5kIHRoZSBpbmRleCBidWZmZXIgYXQgdGhlIG1pZGRsZSBwb2ludCBhbmQgZHJhdyBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5CaW5kSW5kZXhCdWZmZXIoJmluZGV4X2J1ZmZlciwgNTEyLCBWS19JTkRFWF9UWVBFX1VJTlQxNik7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhd0luZGV4ZWQoMjU2LCAxLCAxLCAwLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPkRyYXcoMywgMSwgMCwgMCk7CisgICAgfQorCisgICAgaWYgKGZhaWxDYXNlID09IEJzb0ZhaWxDbWRDbGVhckF0dGFjaG1lbnRzKSB7CisgICAgICAgIFZrQ2xlYXJBdHRhY2htZW50IGNvbG9yX2F0dGFjaG1lbnQgPSB7fTsKKyAgICAgICAgY29sb3JfYXR0YWNobWVudC5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICAgICAgY29sb3JfYXR0YWNobWVudC5jb2xvckF0dGFjaG1lbnQgPSAyMDAwMDAwMDAwOyAgLy8gU29tZW9uZSB3aG8ga25ldyB3aGF0IHRoZXkgd2VyZSBkb2luZyB3b3VsZCB1c2UgMCBmb3IgdGhlIGluZGV4OworICAgICAgICBWa0NsZWFyUmVjdCBjbGVhcl9yZWN0ID0ge3t7MCwgMH0sIHtzdGF0aWNfY2FzdDx1aW50MzJfdD4obV93aWR0aCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihtX2hlaWdodCl9fSwgMCwgMX07CisKKyAgICAgICAgdms6OkNtZENsZWFyQXR0YWNobWVudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJmNvbG9yX2F0dGFjaG1lbnQsIDEsICZjbGVhcl9yZWN0KTsKKyAgICB9CisKKyAgICAvLyBmaW5hbGl6ZSByZWNvcmRpbmcgb2YgdGhlIGNvbW1hbmQgYnVmZmVyCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPlF1ZXVlQ29tbWFuZEJ1ZmZlcih0cnVlKTsKKyAgICBEZXN0cm95UmVuZGVyVGFyZ2V0KCk7Cit9CisKK3ZvaWQgVmtMYXllclRlc3Q6OkdlbmVyaWNEcmF3UHJlcGFyYXRpb24oVmtDb21tYW5kQnVmZmVyT2JqICpjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lT2JqICZwaXBlbGluZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yU2V0T2JqICZkZXNjcmlwdG9yU2V0LCBCc29GYWlsU2VsZWN0IGZhaWxDYXNlKSB7CisgICAgY29tbWFuZEJ1ZmZlci0+Q2xlYXJBbGxCdWZmZXJzKG1fcmVuZGVyVGFyZ2V0cywgbV9jbGVhcl9jb2xvciwgbV9kZXB0aFN0ZW5jaWwsIG1fZGVwdGhfY2xlYXJfY29sb3IsIG1fc3RlbmNpbF9jbGVhcl9jb2xvcik7CisKKyAgICBjb21tYW5kQnVmZmVyLT5QcmVwYXJlQXR0YWNobWVudHMobV9yZW5kZXJUYXJnZXRzLCBtX2RlcHRoU3RlbmNpbCk7CisgICAgLy8gTWFrZSBzdXJlIGRlcHRoV3JpdGVFbmFibGUgaXMgc2V0IHNvIHRoYXQgRGVwdGggZmFpbCB0ZXN0IHdpbGwgd29yaworICAgIC8vIGNvcnJlY3RseQorICAgIC8vIE1ha2Ugc3VyZSBzdGVuY2lsVGVzdEVuYWJsZSBpcyBzZXQgc28gdGhhdCBTdGVuY2lsIGZhaWwgdGVzdCB3aWxsIHdvcmsKKyAgICAvLyBjb3JyZWN0bHkKKyAgICBWa1N0ZW5jaWxPcFN0YXRlIHN0ZW5jaWwgPSB7fTsKKyAgICBzdGVuY2lsLmZhaWxPcCA9IFZLX1NURU5DSUxfT1BfS0VFUDsKKyAgICBzdGVuY2lsLnBhc3NPcCA9IFZLX1NURU5DSUxfT1BfS0VFUDsKKyAgICBzdGVuY2lsLmRlcHRoRmFpbE9wID0gVktfU1RFTkNJTF9PUF9LRUVQOworICAgIHN0ZW5jaWwuY29tcGFyZU9wID0gVktfQ09NUEFSRV9PUF9ORVZFUjsKKworICAgIFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gZHNfY2kgPSB7fTsKKyAgICBkc19jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZHNfY2kucE5leHQgPSBOVUxMOworICAgIGRzX2NpLmRlcHRoVGVzdEVuYWJsZSA9IFZLX0ZBTFNFOworICAgIGRzX2NpLmRlcHRoV3JpdGVFbmFibGUgPSBWS19UUlVFOworICAgIGRzX2NpLmRlcHRoQ29tcGFyZU9wID0gVktfQ09NUEFSRV9PUF9ORVZFUjsKKyAgICBkc19jaS5kZXB0aEJvdW5kc1Rlc3RFbmFibGUgPSBWS19GQUxTRTsKKyAgICBpZiAoZmFpbENhc2UgPT0gQnNvRmFpbERlcHRoQm91bmRzKSB7CisgICAgICAgIGRzX2NpLmRlcHRoQm91bmRzVGVzdEVuYWJsZSA9IFZLX1RSVUU7CisgICAgICAgIGRzX2NpLm1heERlcHRoQm91bmRzID0gMC4wZjsKKyAgICAgICAgZHNfY2kubWluRGVwdGhCb3VuZHMgPSAwLjBmOworICAgIH0KKyAgICBkc19jaS5zdGVuY2lsVGVzdEVuYWJsZSA9IFZLX1RSVUU7CisgICAgZHNfY2kuZnJvbnQgPSBzdGVuY2lsOworICAgIGRzX2NpLmJhY2sgPSBzdGVuY2lsOworCisgICAgcGlwZWxpbmVvYmouU2V0RGVwdGhTdGVuY2lsKCZkc19jaSk7CisgICAgcGlwZWxpbmVvYmouU2V0Vmlld3BvcnQobV92aWV3cG9ydHMpOworICAgIHBpcGVsaW5lb2JqLlNldFNjaXNzb3IobV9zY2lzc29ycyk7CisgICAgZGVzY3JpcHRvclNldC5DcmVhdGVWS0Rlc2NyaXB0b3JTZXQoY29tbWFuZEJ1ZmZlcik7CisgICAgVmtSZXN1bHQgZXJyID0gcGlwZWxpbmVvYmouQ3JlYXRlVktQaXBlbGluZShkZXNjcmlwdG9yU2V0LkdldFBpcGVsaW5lTGF5b3V0KCksIHJlbmRlclBhc3MoKSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKGNvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZW9iai5oYW5kbGUoKSk7CisgICAgY29tbWFuZEJ1ZmZlci0+QmluZERlc2NyaXB0b3JTZXQoZGVzY3JpcHRvclNldCk7Cit9CisKK3ZvaWQgVmtMYXllclRlc3Q6OkluaXQoVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpmZWF0dXJlcywgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiAqZmVhdHVyZXMyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgZmxhZ3MsIHZvaWQgKmluc3RhbmNlX3BuZXh0KSB7CisgICAgSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yLCBpbnN0YW5jZV9wbmV4dCk7CisgICAgSW5pdFN0YXRlKGZlYXR1cmVzLCBmZWF0dXJlczIsIGZsYWdzKTsKK30KKworVmtDb21tYW5kQnVmZmVyT2JqICpWa0xheWVyVGVzdDo6Q29tbWFuZEJ1ZmZlcigpIHsgcmV0dXJuIG1fY29tbWFuZEJ1ZmZlcjsgfQorCitWa0xheWVyVGVzdDo6VmtMYXllclRlc3QoKSB7CisgICAgbV9lbmFibGVXU0kgPSBmYWxzZTsKKworICAgIG1faW5zdGFuY2VfbGF5ZXJfbmFtZXMuY2xlYXIoKTsKKyAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5jbGVhcigpOworICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5jbGVhcigpOworCisgICAgLy8gQWRkIGRlZmF1bHQgaW5zdGFuY2UgZXh0ZW5zaW9ucyB0byB0aGUgbGlzdAorICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FKTsKKworICAgIG1faW5zdGFuY2VfbGF5ZXJfbmFtZXMucHVzaF9iYWNrKCJWS19MQVlFUl9LSFJPTk9TX3ZhbGlkYXRpb24iKTsKKworICAgIGlmIChWa1Rlc3RGcmFtZXdvcms6Om1fZGV2c2ltX2xheWVyKSB7CisgICAgICAgIGlmIChJbnN0YW5jZUxheWVyU3VwcG9ydGVkKCJWS19MQVlFUl9MVU5BUkdfZGV2aWNlX3NpbXVsYXRpb24iKSkgeworICAgICAgICAgICAgbV9pbnN0YW5jZV9sYXllcl9uYW1lcy5wdXNoX2JhY2soIlZLX0xBWUVSX0xVTkFSR19kZXZpY2Vfc2ltdWxhdGlvbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVmtUZXN0RnJhbWV3b3JrOjptX2RldnNpbV9sYXllciA9IGZhbHNlOworICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgICAgRGlkIG5vdCBmaW5kIFZLX0xBWUVSX0xVTkFSR19kZXZpY2Vfc2ltdWxhdGlvbiBsYXllciBzbyBpdCB3aWxsIG5vdCBiZSBlbmFibGVkLlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLT5hcHBfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk87CisgICAgdGhpcy0+YXBwX2luZm8ucE5leHQgPSBOVUxMOworICAgIHRoaXMtPmFwcF9pbmZvLnBBcHBsaWNhdGlvbk5hbWUgPSAibGF5ZXJfdGVzdHMiOworICAgIHRoaXMtPmFwcF9pbmZvLmFwcGxpY2F0aW9uVmVyc2lvbiA9IDE7CisgICAgdGhpcy0+YXBwX2luZm8ucEVuZ2luZU5hbWUgPSAidW5pdHRlc3QiOworICAgIHRoaXMtPmFwcF9pbmZvLmVuZ2luZVZlcnNpb24gPSAxOworICAgIHRoaXMtPmFwcF9pbmZvLmFwaVZlcnNpb24gPSBWS19BUElfVkVSU0lPTl8xXzA7CisKKyAgICAvLyBGaW5kIG91dCB3aGF0IHZlcnNpb24gdGhlIGluc3RhbmNlIHN1cHBvcnRzIGFuZCByZWNvcmQgdGhlIGRlZmF1bHQgdGFyZ2V0IGluc3RhbmNlCisgICAgYXV0byBlbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24gPSAoUEZOX3ZrRW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKG51bGxwdHIsICJ2a0VudW1lcmF0ZUluc3RhbmNlVmVyc2lvbiIpOworICAgIGlmIChlbnVtZXJhdGVJbnN0YW5jZVZlcnNpb24pIHsKKyAgICAgICAgZW51bWVyYXRlSW5zdGFuY2VWZXJzaW9uKCZtX2luc3RhbmNlX2FwaV92ZXJzaW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2luc3RhbmNlX2FwaV92ZXJzaW9uID0gVktfQVBJX1ZFUlNJT05fMV8wOworICAgIH0KKyAgICBtX3RhcmdldF9hcGlfdmVyc2lvbiA9IGFwcF9pbmZvLmFwaVZlcnNpb247Cit9CisKK2Jvb2wgVmtMYXllclRlc3Q6OkFkZFN1cmZhY2VJbnN0YW5jZUV4dGVuc2lvbigpIHsKKyAgICBtX2VuYWJsZVdTSSA9IHRydWU7CisgICAgaWYgKCFJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBleHRlbnNpb24gbm90IHN1cHBvcnRlZFxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworCisgICAgYm9vbCBiU3VwcG9ydCA9IGZhbHNlOworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUikKKyAgICBpZiAoIUluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9XSU4zMl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzICVzIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX1dJTjMyX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfV0lOMzJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgYlN1cHBvcnQgPSB0cnVlOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUikgJiYgZGVmaW5lZChWQUxJREFUSU9OX0FQSykKKyAgICBpZiAoIUluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9BTkRST0lEX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWRcbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfQU5EUk9JRF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0FORFJPSURfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgYlN1cHBvcnQgPSB0cnVlOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9YTElCX0tIUikKKyAgICBpZiAoIUluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9YTElCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWRcbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfWExJQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoWE9wZW5EaXNwbGF5KE5VTEwpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfWExJQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgYlN1cHBvcnQgPSB0cnVlOworICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKKyAgICBpZiAoIUluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBleHRlbnNpb24gbm90IHN1cHBvcnRlZFxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFiU3VwcG9ydCAmJiB4Y2JfY29ubmVjdChOVUxMLCBOVUxMKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1hDQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgYlN1cHBvcnQgPSB0cnVlOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGJTdXBwb3J0KSByZXR1cm4gdHJ1ZTsKKyAgICBwcmludGYoIiVzIE5vIHBsYXRmb3JtJ3Mgc3VyZmFjZSBleHRlbnNpb24gc3VwcG9ydGVkXG4iLCBrU2tpcFByZWZpeCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFZrTGF5ZXJUZXN0OjpBZGRTd2FwY2hhaW5EZXZpY2VFeHRlbnNpb24oKSB7CisgICAgaWYgKCFEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWRcbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfU1dBUENIQUlOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworICAgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBWa0xheWVyVGVzdDo6U2V0VGFyZ2V0QXBpVmVyc2lvbih1aW50MzJfdCB0YXJnZXRfYXBpX3ZlcnNpb24pIHsKKyAgICBpZiAodGFyZ2V0X2FwaV92ZXJzaW9uID09IDApIHRhcmdldF9hcGlfdmVyc2lvbiA9IFZLX0FQSV9WRVJTSU9OXzFfMDsKKyAgICBpZiAodGFyZ2V0X2FwaV92ZXJzaW9uIDw9IG1faW5zdGFuY2VfYXBpX3ZlcnNpb24pIHsKKyAgICAgICAgbV90YXJnZXRfYXBpX3ZlcnNpb24gPSB0YXJnZXRfYXBpX3ZlcnNpb247CisgICAgICAgIGFwcF9pbmZvLmFwaVZlcnNpb24gPSBtX3RhcmdldF9hcGlfdmVyc2lvbjsKKyAgICB9CisgICAgcmV0dXJuIG1fdGFyZ2V0X2FwaV92ZXJzaW9uOworfQordWludDMyX3QgVmtMYXllclRlc3Q6OkRldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgeworICAgIC8vIFRoZSB2YWxpZGF0aW9uIGxheWVycywgYXNzdW1lIHRoZSB2ZXJzaW9uIHdlIGFyZSB2YWxpZGF0aW5nIHRvIGlzIHRoZSBhcGlWZXJzaW9uIHVubGVzcyB0aGUgZGV2aWNlIGFwaVZlcnNpb24gaXMgbG93ZXIKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBwcm9wczsKKyAgICBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoJnByb3BzKTsKKyAgICByZXR1cm4gc3RkOjptaW4obV90YXJnZXRfYXBpX3ZlcnNpb24sIHByb3BzLmFwaVZlcnNpb24pOworfQorCitib29sIFZrTGF5ZXJUZXN0OjpMb2FkRGV2aWNlUHJvZmlsZUxheWVyKAorICAgIFBGTl92a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCAmZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCwKKyAgICBQRk5fdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCAmZnB2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKSB7CisgICAgLy8gTG9hZCByZXF1aXJlZCBmdW5jdGlvbnMKKyAgICBmcHZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUID0KKyAgICAgICAgKFBGTl92a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCl2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQiKTsKKyAgICBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgPSAoUEZOX3ZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoCisgICAgICAgIGluc3RhbmNlKCksICJ2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUIik7CisKKyAgICBpZiAoIShmcHZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKSB8fCAhKGZwdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBDYW4ndCBmaW5kIGRldmljZV9wcm9maWxlX2FwaSBmdW5jdGlvbnM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitib29sIFZrQnVmZmVyVGVzdDo6R2V0VGVzdENvbmRpdGlvblZhbGlkKFZrRGV2aWNlT2JqICphVnVsa2FuRGV2aWNlLCBlVGVzdEVuRmxhZ3MgYVRlc3RGbGFnLCBWa0J1ZmZlclVzYWdlRmxhZ3MgYUJ1ZmZlclVzYWdlKSB7CisgICAgaWYgKGVJbnZhbGlkRGV2aWNlT2Zmc2V0ICE9IGFUZXN0RmxhZyAmJiBlSW52YWxpZE1lbW9yeU9mZnNldCAhPSBhVGVzdEZsYWcpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXRfbGltaXQgPSAwOworICAgIGlmIChlSW52YWxpZE1lbW9yeU9mZnNldCA9PSBhVGVzdEZsYWcpIHsKKyAgICAgICAgVmtCdWZmZXIgdnVsa2FuQnVmZmVyOworICAgICAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNpemUgPSAzMjsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gYUJ1ZmZlclVzYWdlOworCisgICAgICAgIHZrOjpDcmVhdGVCdWZmZXIoYVZ1bGthbkRldmljZS0+ZGV2aWNlKCksICZidWZmZXJfY3JlYXRlX2luZm8sIG51bGxwdHIsICZ2dWxrYW5CdWZmZXIpOworICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1vcnlfcmVxcyA9IHt9OworCisgICAgICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoYVZ1bGthbkRldmljZS0+ZGV2aWNlKCksIHZ1bGthbkJ1ZmZlciwgJm1lbW9yeV9yZXFzKTsKKyAgICAgICAgdms6OkRlc3Ryb3lCdWZmZXIoYVZ1bGthbkRldmljZS0+ZGV2aWNlKCksIHZ1bGthbkJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgIG9mZnNldF9saW1pdCA9IG1lbW9yeV9yZXFzLmFsaWdubWVudDsKKyAgICB9IGVsc2UgaWYgKChWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUIHwgVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCkgJiBhQnVmZmVyVXNhZ2UpIHsKKyAgICAgICAgb2Zmc2V0X2xpbWl0ID0gYVZ1bGthbkRldmljZS0+cHJvcHMubGltaXRzLm1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIH0gZWxzZSBpZiAoVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVCAmIGFCdWZmZXJVc2FnZSkgeworICAgICAgICBvZmZzZXRfbGltaXQgPSBhVnVsa2FuRGV2aWNlLT5wcm9wcy5saW1pdHMubWluVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudDsKKyAgICB9IGVsc2UgaWYgKFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQgJiBhQnVmZmVyVXNhZ2UpIHsKKyAgICAgICAgb2Zmc2V0X2xpbWl0ID0gYVZ1bGthbkRldmljZS0+cHJvcHMubGltaXRzLm1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgfQorICAgIHJldHVybiBlT2Zmc2V0QWxpZ25tZW50IDwgb2Zmc2V0X2xpbWl0OworfQorCitWa0J1ZmZlclRlc3Q6OlZrQnVmZmVyVGVzdChWa0RldmljZU9iaiAqYVZ1bGthbkRldmljZSwgVmtCdWZmZXJVc2FnZUZsYWdzIGFCdWZmZXJVc2FnZSwgZVRlc3RFbkZsYWdzIGFUZXN0RmxhZykKKyAgICA6IEFsbG9jYXRlQ3VycmVudCh0cnVlKSwKKyAgICAgIEJvdW5kQ3VycmVudChmYWxzZSksCisgICAgICBDcmVhdGVDdXJyZW50KGZhbHNlKSwKKyAgICAgIEludmFsaWREZWxldGVFbihmYWxzZSksCisgICAgICBWdWxrYW5EZXZpY2UoYVZ1bGthbkRldmljZS0+ZGV2aWNlKCkpIHsKKyAgICBpZiAoZUJpbmROdWxsQnVmZmVyID09IGFUZXN0RmxhZyB8fCBlQmluZEZha2VCdWZmZXIgPT0gYVRlc3RGbGFnKSB7CisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbW9yeV9hbGxvY2F0ZV9pbmZvID0ge307CisgICAgICAgIG1lbW9yeV9hbGxvY2F0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgICAgIG1lbW9yeV9hbGxvY2F0ZV9pbmZvLmFsbG9jYXRpb25TaXplID0gMTsgICAvLyBmYWtlIHNpemUgLS0gc2hvdWxkbid0IG1hdHRlciBmb3IgdGhlIHRlc3QKKyAgICAgICAgbWVtb3J5X2FsbG9jYXRlX2luZm8ubWVtb3J5VHlwZUluZGV4ID0gMDsgIC8vIGZha2UgdHlwZSAtLSBzaG91bGRuJ3QgbWF0dGVyIGZvciB0aGUgdGVzdAorICAgICAgICB2azo6QWxsb2NhdGVNZW1vcnkoVnVsa2FuRGV2aWNlLCAmbWVtb3J5X2FsbG9jYXRlX2luZm8sIG51bGxwdHIsICZWdWxrYW5NZW1vcnkpOworCisgICAgICAgIFZ1bGthbkJ1ZmZlciA9IChhVGVzdEZsYWcgPT0gZUJpbmROdWxsQnVmZmVyKSA/IFZLX05VTExfSEFORExFIDogKFZrQnVmZmVyKTB4Q0RDRENEQ0RDRENEQ0RDRDsKKworICAgICAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShWdWxrYW5EZXZpY2UsIFZ1bGthbkJ1ZmZlciwgVnVsa2FuTWVtb3J5LCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNpemUgPSAzMjsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gYUJ1ZmZlclVzYWdlOworCisgICAgICAgIHZrOjpDcmVhdGVCdWZmZXIoVnVsa2FuRGV2aWNlLCAmYnVmZmVyX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmVnVsa2FuQnVmZmVyKTsKKworICAgICAgICBDcmVhdGVDdXJyZW50ID0gdHJ1ZTsKKworICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1vcnlfcmVxdWlyZW1lbnRzOworICAgICAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKFZ1bGthbkRldmljZSwgVnVsa2FuQnVmZmVyLCAmbWVtb3J5X3JlcXVpcmVtZW50cyk7CisKKyAgICAgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtb3J5X2FsbG9jYXRlX2luZm8gPSB7fTsKKyAgICAgICAgbWVtb3J5X2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgbWVtb3J5X2FsbG9jYXRlX2luZm8uYWxsb2NhdGlvblNpemUgPSBtZW1vcnlfcmVxdWlyZW1lbnRzLnNpemUgKyBlT2Zmc2V0QWxpZ25tZW50OworICAgICAgICBib29sIHBhc3MgPSBhVnVsa2FuRGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUobWVtb3J5X3JlcXVpcmVtZW50cy5tZW1vcnlUeXBlQml0cywgJm1lbW9yeV9hbGxvY2F0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQpOworICAgICAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgICAgIENyZWF0ZUN1cnJlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKFZ1bGthbkRldmljZSwgVnVsa2FuQnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShWdWxrYW5EZXZpY2UsICZtZW1vcnlfYWxsb2NhdGVfaW5mbywgTlVMTCwgJlZ1bGthbk1lbW9yeSk7CisgICAgICAgIC8vIE5COiAxIGlzIGludGVudGlvbmFsbHkgYW4gaW52YWxpZCBvZmZzZXQgdmFsdWUKKyAgICAgICAgY29uc3QgYm9vbCBvZmZzZXRfZW4gPSBlSW52YWxpZERldmljZU9mZnNldCA9PSBhVGVzdEZsYWcgfHwgZUludmFsaWRNZW1vcnlPZmZzZXQgPT0gYVRlc3RGbGFnOworICAgICAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShWdWxrYW5EZXZpY2UsIFZ1bGthbkJ1ZmZlciwgVnVsa2FuTWVtb3J5LCBvZmZzZXRfZW4gPyBlT2Zmc2V0QWxpZ25tZW50IDogMCk7CisgICAgICAgIEJvdW5kQ3VycmVudCA9IHRydWU7CisKKyAgICAgICAgSW52YWxpZERlbGV0ZUVuID0gKGVGcmVlSW52YWxpZEhhbmRsZSA9PSBhVGVzdEZsYWcpOworICAgIH0KK30KKworVmtCdWZmZXJUZXN0Ojp+VmtCdWZmZXJUZXN0KCkgeworICAgIGlmIChDcmVhdGVDdXJyZW50KSB7CisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKFZ1bGthbkRldmljZSwgVnVsa2FuQnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgaWYgKEFsbG9jYXRlQ3VycmVudCkgeworICAgICAgICBpZiAoSW52YWxpZERlbGV0ZUVuKSB7CisgICAgICAgICAgICBhdXRvIGJhZF9tZW1vcnkgPSBDYXN0RnJvbVVpbnQ2NDxWa0RldmljZU1lbW9yeT4oQ2FzdFRvVWludDY0KFZ1bGthbk1lbW9yeSkgKyAxKTsKKyAgICAgICAgICAgIHZrOjpGcmVlTWVtb3J5KFZ1bGthbkRldmljZSwgYmFkX21lbW9yeSwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgdms6OkZyZWVNZW1vcnkoVnVsa2FuRGV2aWNlLCBWdWxrYW5NZW1vcnksIG51bGxwdHIpOworICAgIH0KK30KKworYm9vbCBWa0J1ZmZlclRlc3Q6OkdldEJ1ZmZlckN1cnJlbnQoKSB7IHJldHVybiBBbGxvY2F0ZUN1cnJlbnQgJiYgQm91bmRDdXJyZW50ICYmIENyZWF0ZUN1cnJlbnQ7IH0KKworY29uc3QgVmtCdWZmZXIgJlZrQnVmZmVyVGVzdDo6R2V0QnVmZmVyKCkgeyByZXR1cm4gVnVsa2FuQnVmZmVyOyB9CisKK3ZvaWQgVmtCdWZmZXJUZXN0OjpUZXN0RG91YmxlRGVzdHJveSgpIHsKKyAgICAvLyBEZXN0cm95IHRoZSBidWZmZXIgYnV0IGxlYXZlIHRoZSBmbGFnIHNldCwgd2hpY2ggd2lsbCBjYXVzZQorICAgIC8vIHRoZSBidWZmZXIgdG8gYmUgZGVzdHJveWVkIGFnYWluIGluIHRoZSBkZXN0cnVjdG9yLgorICAgIHZrOjpEZXN0cm95QnVmZmVyKFZ1bGthbkRldmljZSwgVnVsa2FuQnVmZmVyLCBudWxscHRyKTsKK30KKwordWludDMyX3QgVmtWZXJ0aWNlc09iajo6QmluZElkR2VuZXJhdG9yOworCitWa1ZlcnRpY2VzT2JqOjpWa1ZlcnRpY2VzT2JqKFZrRGV2aWNlT2JqICphVnVsa2FuRGV2aWNlLCB1bnNpZ25lZCBhQXR0cmlidXRlQ291bnQsIHVuc2lnbmVkIGFCaW5kaW5nQ291bnQsIHVuc2lnbmVkIGFCeXRlU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgYVZlcnRleENvdW50LCBjb25zdCBmbG9hdCAqYVZlcnRpY2llcykKKyAgICA6IEJvdW5kQ3VycmVudChmYWxzZSksCisgICAgICBBdHRyaWJ1dGVDb3VudChhQXR0cmlidXRlQ291bnQpLAorICAgICAgQmluZGluZ0NvdW50KGFCaW5kaW5nQ291bnQpLAorICAgICAgQmluZElkKEJpbmRJZEdlbmVyYXRvciksCisgICAgICBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKCksCisgICAgICBWdWxrYW5NZW1vcnlCdWZmZXIoYVZ1bGthbkRldmljZSwgc3RhdGljX2Nhc3Q8aW50PihhQnl0ZVN0cmlkZSAqIGFWZXJ0ZXhDb3VudCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCAqPihhVmVydGljaWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQpIHsKKyAgICBCaW5kSWRHZW5lcmF0b3IrKzsgIC8vIE5COiBUaGlzIGNhbiB3cmFwIHcvbWlzdXNlCisKKyAgICBWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uID0gbmV3IFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbltBdHRyaWJ1dGVDb3VudF07CisgICAgVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gPSBuZXcgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbltCaW5kaW5nQ291bnRdOworCisgICAgUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbjsKKyAgICBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSBBdHRyaWJ1dGVDb3VudDsKKyAgICBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb247CisgICAgUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IEJpbmRpbmdDb3VudDsKKyAgICBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX1NUQVRFX0NSRUFURV9JTkZPOworCisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgZG8geworICAgICAgICBWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uW2ldLmJpbmRpbmcgPSBCaW5kSWQ7CisgICAgICAgIFZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb25baV0ubG9jYXRpb24gPSBpOworICAgICAgICBWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uW2ldLmZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUOworICAgICAgICBWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uW2ldLm9mZnNldCA9IHNpemVvZihmbG9hdCkgKiBhQnl0ZVN0cmlkZTsKKyAgICAgICAgaSsrOworICAgIH0gd2hpbGUgKEF0dHJpYnV0ZUNvdW50IDwgaSk7CisKKyAgICBpID0gMDsKKyAgICBkbyB7CisgICAgICAgIFZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uW2ldLmJpbmRpbmcgPSBCaW5kSWQ7CisgICAgICAgIFZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uW2ldLnN0cmlkZSA9IGFCeXRlU3RyaWRlOworICAgICAgICBWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbltpXS5pbnB1dFJhdGUgPSBWS19WRVJURVhfSU5QVVRfUkFURV9WRVJURVg7CisgICAgICAgIGkrKzsKKyAgICB9IHdoaWxlIChCaW5kaW5nQ291bnQgPCBpKTsKK30KKworVmtWZXJ0aWNlc09iajo6flZrVmVydGljZXNPYmooKSB7CisgICAgaWYgKFZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24pIHsKKyAgICAgICAgZGVsZXRlW10gVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbjsKKyAgICB9CisgICAgaWYgKFZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uKSB7CisgICAgICAgIGRlbGV0ZVtdIFZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uOworICAgIH0KK30KKworYm9vbCBWa1ZlcnRpY2VzT2JqOjpBZGRWZXJ0ZXhJbnB1dFRvUGlwZShWa1BpcGVsaW5lT2JqICZhUGlwZWxpbmVPYmopIHsKKyAgICBhUGlwZWxpbmVPYmouQWRkVmVydGV4SW5wdXRBdHRyaWJzKFZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24sIEF0dHJpYnV0ZUNvdW50KTsKKyAgICBhUGlwZWxpbmVPYmouQWRkVmVydGV4SW5wdXRCaW5kaW5ncyhWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiwgQmluZGluZ0NvdW50KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWa1ZlcnRpY2VzT2JqOjpBZGRWZXJ0ZXhJbnB1dFRvUGlwZUhlbHByKENyZWF0ZVBpcGVsaW5lSGVscGVyICpwaXBlbGluZUhlbHBlcikgeworICAgIHBpcGVsaW5lSGVscGVyLT52aV9jaV8ucFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgPSBWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbjsKKyAgICBwaXBlbGluZUhlbHBlci0+dmlfY2lfLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gQmluZGluZ0NvdW50OworICAgIHBpcGVsaW5lSGVscGVyLT52aV9jaV8ucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9IFZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb247CisgICAgcGlwZWxpbmVIZWxwZXItPnZpX2NpXy52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gQXR0cmlidXRlQ291bnQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVmtWZXJ0aWNlc09iajo6QmluZFZlcnRleEJ1ZmZlcnMoVmtDb21tYW5kQnVmZmVyIGFDb21tYW5kQnVmZmVyLCB1bnNpZ25lZCBhT2Zmc2V0Q291bnQsIFZrRGV2aWNlU2l6ZSAqYU9mZnNldExpc3QpIHsKKyAgICBWa0RldmljZVNpemUgKm9mZnNldExpc3Q7CisgICAgdW5zaWduZWQgb2Zmc2V0Q291bnQ7CisKKyAgICBpZiAoYU9mZnNldENvdW50KSB7CisgICAgICAgIG9mZnNldExpc3QgPSBhT2Zmc2V0TGlzdDsKKyAgICAgICAgb2Zmc2V0Q291bnQgPSBhT2Zmc2V0Q291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb2Zmc2V0TGlzdCA9IG5ldyBWa0RldmljZVNpemVbMV0oKTsKKyAgICAgICAgb2Zmc2V0Q291bnQgPSAxOworICAgIH0KKworICAgIHZrOjpDbWRCaW5kVmVydGV4QnVmZmVycyhhQ29tbWFuZEJ1ZmZlciwgQmluZElkLCBvZmZzZXRDb3VudCwgJlZ1bGthbk1lbW9yeUJ1ZmZlci5oYW5kbGUoKSwgb2Zmc2V0TGlzdCk7CisgICAgQm91bmRDdXJyZW50ID0gdHJ1ZTsKKworICAgIGlmICghYU9mZnNldENvdW50KSB7CisgICAgICAgIGRlbGV0ZVtdIG9mZnNldExpc3Q7CisgICAgfQorfQorCitPbmVPZmZEZXNjcmlwdG9yU2V0OjpPbmVPZmZEZXNjcmlwdG9yU2V0KFZrRGV2aWNlT2JqICpkZXZpY2UsIGNvbnN0IEJpbmRpbmdzICZiaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlRmxhZ3MgbGF5b3V0X2ZsYWdzLCB2b2lkICpsYXlvdXRfcG5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncyBwb29sRmxhZ3MsIHZvaWQgKmFsbG9jYXRlX3BuZXh0KQorICAgIDogZGV2aWNlX3tkZXZpY2V9LCBwb29sX3t9LCBsYXlvdXRfKGRldmljZSwgYmluZGluZ3MsIGxheW91dF9mbGFncywgbGF5b3V0X3BuZXh0KSwgc2V0X3t9IHsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JQb29sU2l6ZT4gc2l6ZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZiIDogYmluZGluZ3MpIHNpemVzLnB1c2hfYmFjayh7Yi5kZXNjcmlwdG9yVHlwZSwgc3RkOjptYXgoMXUsIGIuZGVzY3JpcHRvckNvdW50KX0pOworCisgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gZHNwY2kgPSB7CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTywgbnVsbHB0ciwgcG9vbEZsYWdzLCAxLCB1aW50MzJfdChzaXplcy5zaXplKCkpLCBzaXplcy5kYXRhKCl9OworICAgIGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yUG9vbChkZXZpY2VfLT5oYW5kbGUoKSwgJmRzcGNpLCBudWxscHRyLCAmcG9vbF8pOworICAgIGlmIChlcnIgIT0gVktfU1VDQ0VTUykgcmV0dXJuOworCisgICAgaWYgKChsYXlvdXRfZmxhZ3MgJiBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSKSA9PSAwKSB7CisgICAgICAgIFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyBhbGxvY19pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk8sIGFsbG9jYXRlX3BuZXh0LCBwb29sXywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxheW91dF8uaGFuZGxlKCl9OworICAgICAgICBlcnIgPSB2azo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhkZXZpY2VfLT5oYW5kbGUoKSwgJmFsbG9jX2luZm8sICZzZXRfKTsKKyAgICB9Cit9CisKK09uZU9mZkRlc2NyaXB0b3JTZXQ6On5PbmVPZmZEZXNjcmlwdG9yU2V0KCkgeworICAgIC8vIE5vIG5lZWQgdG8gZGVzdHJveSBzZXQtLSBpdCdzIGdvaW5nIGF3YXkgd2l0aCB0aGUgcG9vbC4KKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKGRldmljZV8tPmhhbmRsZSgpLCBwb29sXywgbnVsbHB0cik7Cit9CisKK2Jvb2wgT25lT2ZmRGVzY3JpcHRvclNldDo6SW5pdGlhbGl6ZWQoKSB7IHJldHVybiBwb29sXyAhPSBWS19OVUxMX0hBTkRMRSAmJiBsYXlvdXRfLmluaXRpYWxpemVkKCkgJiYgc2V0XyAhPSBWS19OVUxMX0hBTkRMRTsgfQorCit2b2lkIE9uZU9mZkRlc2NyaXB0b3JTZXQ6OldyaXRlRGVzY3JpcHRvckJ1ZmZlckluZm8oaW50IGJsaW5kaW5nLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGUpIHsKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZlcl9pbmZvID0ge307CisgICAgYnVmZmVyX2luZm8uYnVmZmVyID0gYnVmZmVyOworICAgIGJ1ZmZlcl9pbmZvLm9mZnNldCA9IDA7CisgICAgYnVmZmVyX2luZm8ucmFuZ2UgPSBzaXplOworICAgIGJ1ZmZlcl9pbmZvcy5lbXBsYWNlX2JhY2soYnVmZmVyX2luZm8pOworICAgIHNpemVfdCBpbmRleCA9IGJ1ZmZlcl9pbmZvcy5zaXplKCkgLSAxOworCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZTsKKyAgICBtZW1zZXQoJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIHNpemVvZihkZXNjcmlwdG9yX3dyaXRlKSk7CisgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gc2V0XzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSBibGluZGluZzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yVHlwZSA9IGRlc2NyaXB0b3JUeXBlOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSAmYnVmZmVyX2luZm9zW2luZGV4XTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBJbWFnZUluZm8gPSBudWxscHRyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucFRleGVsQnVmZmVyVmlldyA9IG51bGxwdHI7CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlcy5lbXBsYWNlX2JhY2soZGVzY3JpcHRvcl93cml0ZSk7Cit9CisKK3ZvaWQgT25lT2ZmRGVzY3JpcHRvclNldDo6V3JpdGVEZXNjcmlwdG9yQnVmZmVyVmlldyhpbnQgYmxpbmRpbmcsIFZrQnVmZmVyVmlldyAmYnVmZmVyX3ZpZXcsIFZrRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGUpIHsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlOworICAgIG1lbXNldCgmZGVzY3JpcHRvcl93cml0ZSwgMCwgc2l6ZW9mKGRlc2NyaXB0b3Jfd3JpdGUpKTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RTZXQgPSBzZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0QmluZGluZyA9IGJsaW5kaW5nOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gZGVzY3JpcHRvclR5cGU7CisgICAgZGVzY3JpcHRvcl93cml0ZS5wVGV4ZWxCdWZmZXJWaWV3ID0gJmJ1ZmZlcl92aWV3OworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9IG51bGxwdHI7CisgICAgZGVzY3JpcHRvcl93cml0ZS5wQnVmZmVySW5mbyA9IG51bGxwdHI7CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlcy5lbXBsYWNlX2JhY2soZGVzY3JpcHRvcl93cml0ZSk7Cit9CisKK3ZvaWQgT25lT2ZmRGVzY3JpcHRvclNldDo6V3JpdGVEZXNjcmlwdG9ySW1hZ2VJbmZvKGludCBibGluZGluZywgVmtJbWFnZVZpZXcgaW1hZ2VfdmlldywgVmtTYW1wbGVyIHNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3JUeXBlKSB7CisgICAgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvIGltYWdlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9pbmZvLmltYWdlVmlldyA9IGltYWdlX3ZpZXc7CisgICAgaW1hZ2VfaW5mby5zYW1wbGVyID0gc2FtcGxlcjsKKyAgICBpbWFnZV9pbmZvLmltYWdlTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDsKKyAgICBpbWFnZV9pbmZvcy5lbXBsYWNlX2JhY2soaW1hZ2VfaW5mbyk7CisgICAgc2l6ZV90IGluZGV4ID0gaW1hZ2VfaW5mb3Muc2l6ZSgpIC0gMTsKKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGU7CisgICAgbWVtc2V0KCZkZXNjcmlwdG9yX3dyaXRlLCAwLCBzaXplb2YoZGVzY3JpcHRvcl93cml0ZSkpOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IHNldF87CisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gYmxpbmRpbmc7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvclR5cGUgPSBkZXNjcmlwdG9yVHlwZTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBJbWFnZUluZm8gPSAmaW1hZ2VfaW5mb3NbaW5kZXhdOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSBudWxscHRyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucFRleGVsQnVmZmVyVmlldyA9IG51bGxwdHI7CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlcy5lbXBsYWNlX2JhY2soZGVzY3JpcHRvcl93cml0ZSk7Cit9CisKK3ZvaWQgT25lT2ZmRGVzY3JpcHRvclNldDo6VXBkYXRlRGVzY3JpcHRvclNldHMoKSB7CisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKGRldmljZV8tPmhhbmRsZSgpLCBkZXNjcmlwdG9yX3dyaXRlcy5zaXplKCksIGRlc2NyaXB0b3Jfd3JpdGVzLmRhdGEoKSwgMCwgTlVMTCk7Cit9CisKK0NyZWF0ZVBpcGVsaW5lSGVscGVyOjpDcmVhdGVQaXBlbGluZUhlbHBlcihWa0xheWVyVGVzdCAmdGVzdCkgOiBsYXllcl90ZXN0Xyh0ZXN0KSB7fQorCitDcmVhdGVQaXBlbGluZUhlbHBlcjo6fkNyZWF0ZVBpcGVsaW5lSGVscGVyKCkgeworICAgIFZrRGV2aWNlIGRldmljZSA9IGxheWVyX3Rlc3RfLmRldmljZSgpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmVDYWNoZShkZXZpY2UsIHBpcGVsaW5lX2NhY2hlXywgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZShkZXZpY2UsIHBpcGVsaW5lXywgbnVsbHB0cik7Cit9CisKK3ZvaWQgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6OkluaXREZXNjcmlwdG9yU2V0SW5mbygpIHsKKyAgICBkc2xfYmluZGluZ3NfID0ge3swLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9fTsKK30KKwordm9pZCBDcmVhdGVQaXBlbGluZUhlbHBlcjo6SW5pdElucHV0QW5kVmVydGV4SW5mbygpIHsKKyAgICB2aV9jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk87CisKKyAgICBpYV9jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBpYV9jaV8udG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfU1RSSVA7Cit9CisKK3ZvaWQgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6OkluaXRNdWx0aXNhbXBsZUluZm8oKSB7CisgICAgcGlwZV9tc19zdGF0ZV9jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBwaXBlX21zX3N0YXRlX2NpXy5wTmV4dCA9IG51bGxwdHI7CisgICAgcGlwZV9tc19zdGF0ZV9jaV8ucmFzdGVyaXphdGlvblNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgcGlwZV9tc19zdGF0ZV9jaV8uc2FtcGxlU2hhZGluZ0VuYWJsZSA9IFZLX0ZBTFNFOworICAgIHBpcGVfbXNfc3RhdGVfY2lfLm1pblNhbXBsZVNoYWRpbmcgPSAxLjA7CisgICAgcGlwZV9tc19zdGF0ZV9jaV8ucFNhbXBsZU1hc2sgPSBOVUxMOworfQorCit2b2lkIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpJbml0UGlwZWxpbmVMYXlvdXRJbmZvKCkgeworICAgIHBpcGVsaW5lX2xheW91dF9jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk87CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpXy5zZXRMYXlvdXRDb3VudCA9IDE7ICAgICAvLyBOb3QgcmVhbGx5IGNoYW5nZWFibGUgYmVjYXVzZSBJbml0U3RhdGUoKSBzZXRzIGV4YWN0bHkgb25lIHBTZXRMYXlvdXQKKyAgICBwaXBlbGluZV9sYXlvdXRfY2lfLnBTZXRMYXlvdXRzID0gbnVsbHB0cjsgIC8vIG11c3QgYm91bmQgYWZ0ZXIgaXQgaXMgY3JlYXRlZAorfQorCit2b2lkIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpJbml0Vmlld3BvcnRJbmZvKCkgeworICAgIHZpZXdwb3J0XyA9IHswLjBmLCAwLjBmLCA2NC4wZiwgNjQuMGYsIDAuMGYsIDEuMGZ9OworICAgIHNjaXNzb3JfID0ge3swLCAwfSwgezY0LCA2NH19OworCisgICAgdnBfc3RhdGVfY2lfLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgdnBfc3RhdGVfY2lfLnBOZXh0ID0gbnVsbHB0cjsKKyAgICB2cF9zdGF0ZV9jaV8udmlld3BvcnRDb3VudCA9IDE7CisgICAgdnBfc3RhdGVfY2lfLnBWaWV3cG9ydHMgPSAmdmlld3BvcnRfOyAgLy8gaWdub3JlZCBpZiBkeW5hbWljCisgICAgdnBfc3RhdGVfY2lfLnNjaXNzb3JDb3VudCA9IDE7CisgICAgdnBfc3RhdGVfY2lfLnBTY2lzc29ycyA9ICZzY2lzc29yXzsgIC8vIGlnbm9yZWQgaWYgZHluYW1pYworfQorCit2b2lkIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpJbml0RHluYW1pY1N0YXRlSW5mbygpIHsKKyAgICAvLyBVc2UgYSAidmFsaWRpdHkiIGNoZWNrIG9uIHRoZSB7fSBpbml0aWFsaXplZCBzdHJ1Y3R1cmUgdG8gZGV0ZWN0IGluaXRpYWxpemF0aW9uCisgICAgLy8gZHVyaW5nIGxhdGUgYmluZAorfQorCit2b2lkIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpJbml0U2hhZGVySW5mbygpIHsKKyAgICB2c18ucmVzZXQobmV3IFZrU2hhZGVyT2JqKGxheWVyX3Rlc3RfLkRldmljZU9iaigpLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsICZsYXllcl90ZXN0XykpOworICAgIGZzXy5yZXNldChuZXcgVmtTaGFkZXJPYmoobGF5ZXJfdGVzdF8uRGV2aWNlT2JqKCksIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCAmbGF5ZXJfdGVzdF8pKTsKKyAgICAvLyBXZSBzaG91bGRuJ3QgbmVlZCBhIGZyYWdtZW50IHNoYWRlciBidXQgYWRkIGl0IHRvIGJlIGFibGUgdG8gcnVuIG9uIG1vcmUgZGV2aWNlcworICAgIHNoYWRlcl9zdGFnZXNfID0ge3ZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworfQorCit2b2lkIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpJbml0UmFzdGVyaXphdGlvbkluZm8oKSB7CisgICAgcnNfc3RhdGVfY2lfLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICByc19zdGF0ZV9jaV8ucE5leHQgPSAmbGluZV9zdGF0ZV9jaV87CisgICAgcnNfc3RhdGVfY2lfLmZsYWdzID0gMDsKKyAgICByc19zdGF0ZV9jaV8uZGVwdGhDbGFtcEVuYWJsZSA9IFZLX0ZBTFNFOworICAgIHJzX3N0YXRlX2NpXy5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA9IFZLX0ZBTFNFOworICAgIHJzX3N0YXRlX2NpXy5wb2x5Z29uTW9kZSA9IFZLX1BPTFlHT05fTU9ERV9GSUxMOworICAgIHJzX3N0YXRlX2NpXy5jdWxsTW9kZSA9IFZLX0NVTExfTU9ERV9CQUNLX0JJVDsKKyAgICByc19zdGF0ZV9jaV8uZnJvbnRGYWNlID0gVktfRlJPTlRfRkFDRV9DT1VOVEVSX0NMT0NLV0lTRTsKKyAgICByc19zdGF0ZV9jaV8uZGVwdGhCaWFzRW5hYmxlID0gVktfRkFMU0U7CisgICAgcnNfc3RhdGVfY2lfLmxpbmVXaWR0aCA9IDEuMEY7Cit9CisKK3ZvaWQgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6OkluaXRMaW5lUmFzdGVyaXphdGlvbkluZm8oKSB7CisgICAgbGluZV9zdGF0ZV9jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX0xJTkVfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworICAgIGxpbmVfc3RhdGVfY2lfLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBsaW5lX3N0YXRlX2NpXy5saW5lUmFzdGVyaXphdGlvbk1vZGUgPSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVDsKKyAgICBsaW5lX3N0YXRlX2NpXy5zdGlwcGxlZExpbmVFbmFibGUgPSBWS19GQUxTRTsKKyAgICBsaW5lX3N0YXRlX2NpXy5saW5lU3RpcHBsZUZhY3RvciA9IDA7CisgICAgbGluZV9zdGF0ZV9jaV8ubGluZVN0aXBwbGVQYXR0ZXJuID0gMDsKK30KKwordm9pZCBDcmVhdGVQaXBlbGluZUhlbHBlcjo6SW5pdEJsZW5kU3RhdGVJbmZvKCkgeworICAgIGNiX2NpXy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX1NUQVRFX0NSRUFURV9JTkZPOworICAgIGNiX2NpXy5sb2dpY09wRW5hYmxlID0gVktfRkFMU0U7CisgICAgY2JfY2lfLmxvZ2ljT3AgPSBWS19MT0dJQ19PUF9DT1BZOyAgLy8gaWdub3JlZCBpZiBlbmFibGUgaXMgVktfRkFMU0UgYWJvdmUKKyAgICBjYl9jaV8uYXR0YWNobWVudENvdW50ID0gbGF5ZXJfdGVzdF8uUmVuZGVyUGFzc0luZm8oKS5zdWJwYXNzQ291bnQ7CisgICAgQVNTRVJUX1RSVUUoSXNWYWxpZFZrU3RydWN0KGxheWVyX3Rlc3RfLlJlbmRlclBhc3NJbmZvKCkpKTsKKyAgICBjYl9jaV8ucEF0dGFjaG1lbnRzID0gJmNiX2F0dGFjaG1lbnRzXzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBjYl9jaV8uYmxlbmRDb25zdGFudHNbMF0gPSAxLjBGOworICAgIH0KK30KKwordm9pZCBDcmVhdGVQaXBlbGluZUhlbHBlcjo6SW5pdEdyYXBoaWNzUGlwZWxpbmVJbmZvKCkgeworICAgIC8vIENvbG9yLW9ubHkgcmVuZGVyaW5nIGluIGEgc3VicGFzcyB3aXRoIG5vIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudAorICAgIC8vIEFjdGl2ZSBQaXBlbGluZSBTaGFkZXIgU3RhZ2VzCisgICAgLy8gICAgVmVydGV4IFNoYWRlcgorICAgIC8vICAgIEZyYWdtZW50IFNoYWRlcgorICAgIC8vIFJlcXVpcmVkOiBGaXhlZC1GdW5jdGlvbiBQaXBlbGluZSBTdGFnZXMKKyAgICAvLyAgICBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8KKyAgICAvLyAgICBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbworICAgIC8vICAgIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbworICAgIC8vICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvCisgICAgLy8gICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvCisgICAgLy8gICAgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8KKyAgICBncF9jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTzsKKyAgICBncF9jaV8ucE5leHQgPSBudWxscHRyOworICAgIGdwX2NpXy5mbGFncyA9IFZLX1BJUEVMSU5FX0NSRUFURV9ESVNBQkxFX09QVElNSVpBVElPTl9CSVQ7CisgICAgZ3BfY2lfLnBWZXJ0ZXhJbnB1dFN0YXRlID0gJnZpX2NpXzsKKyAgICBncF9jaV8ucElucHV0QXNzZW1ibHlTdGF0ZSA9ICZpYV9jaV87CisgICAgZ3BfY2lfLnBUZXNzZWxsYXRpb25TdGF0ZSA9IG51bGxwdHI7CisgICAgZ3BfY2lfLnBWaWV3cG9ydFN0YXRlID0gJnZwX3N0YXRlX2NpXzsKKyAgICBncF9jaV8ucFJhc3Rlcml6YXRpb25TdGF0ZSA9ICZyc19zdGF0ZV9jaV87CisgICAgZ3BfY2lfLnBNdWx0aXNhbXBsZVN0YXRlID0gJnBpcGVfbXNfc3RhdGVfY2lfOworICAgIGdwX2NpXy5wRGVwdGhTdGVuY2lsU3RhdGUgPSBudWxscHRyOworICAgIGdwX2NpXy5wQ29sb3JCbGVuZFN0YXRlID0gJmNiX2NpXzsKKyAgICBncF9jaV8ucER5bmFtaWNTdGF0ZSA9IG51bGxwdHI7CisgICAgZ3BfY2lfLnJlbmRlclBhc3MgPSBsYXllcl90ZXN0Xy5yZW5kZXJQYXNzKCk7Cit9CisKK3ZvaWQgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6OkluaXRQaXBlbGluZUNhY2hlSW5mbygpIHsKKyAgICBwY19jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTzsKKyAgICBwY19jaV8ucE5leHQgPSBudWxscHRyOworICAgIHBjX2NpXy5mbGFncyA9IDA7CisgICAgcGNfY2lfLmluaXRpYWxEYXRhU2l6ZSA9IDA7CisgICAgcGNfY2lfLnBJbml0aWFsRGF0YSA9IG51bGxwdHI7Cit9CisKK3ZvaWQgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6OkluaXRUZXNzZWxhdGlvblN0YXRlKCkgeworICAgIC8vIFRCRCAtLSBhZGQgc2hhZGVycyBhbmQgY3JlYXRlX2luZm8KK30KKwordm9pZCBDcmVhdGVQaXBlbGluZUhlbHBlcjo6SW5pdEluZm8oKSB7CisgICAgSW5pdERlc2NyaXB0b3JTZXRJbmZvKCk7CisgICAgSW5pdElucHV0QW5kVmVydGV4SW5mbygpOworICAgIEluaXRNdWx0aXNhbXBsZUluZm8oKTsKKyAgICBJbml0UGlwZWxpbmVMYXlvdXRJbmZvKCk7CisgICAgSW5pdFZpZXdwb3J0SW5mbygpOworICAgIEluaXREeW5hbWljU3RhdGVJbmZvKCk7CisgICAgSW5pdFNoYWRlckluZm8oKTsKKyAgICBJbml0UmFzdGVyaXphdGlvbkluZm8oKTsKKyAgICBJbml0TGluZVJhc3Rlcml6YXRpb25JbmZvKCk7CisgICAgSW5pdEJsZW5kU3RhdGVJbmZvKCk7CisgICAgSW5pdEdyYXBoaWNzUGlwZWxpbmVJbmZvKCk7CisgICAgSW5pdFBpcGVsaW5lQ2FjaGVJbmZvKCk7Cit9CisKK3ZvaWQgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6OkluaXRTdGF0ZSgpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgZGVzY3JpcHRvcl9zZXRfLnJlc2V0KG5ldyBPbmVPZmZEZXNjcmlwdG9yU2V0KGxheWVyX3Rlc3RfLkRldmljZU9iaigpLCBkc2xfYmluZGluZ3NfKSk7CisgICAgQVNTRVJUX1RSVUUoZGVzY3JpcHRvcl9zZXRfLT5Jbml0aWFsaXplZCgpKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFZrUHVzaENvbnN0YW50UmFuZ2U+IHB1c2hfcmFuZ2VzKAorICAgICAgICBwaXBlbGluZV9sYXlvdXRfY2lfLnBQdXNoQ29uc3RhbnRSYW5nZXMsCisgICAgICAgIHBpcGVsaW5lX2xheW91dF9jaV8ucFB1c2hDb25zdGFudFJhbmdlcyArIHBpcGVsaW5lX2xheW91dF9jaV8ucHVzaENvbnN0YW50UmFuZ2VDb3VudCk7CisgICAgcGlwZWxpbmVfbGF5b3V0XyA9IFZrUGlwZWxpbmVMYXlvdXRPYmoobGF5ZXJfdGVzdF8uRGV2aWNlT2JqKCksIHsmZGVzY3JpcHRvcl9zZXRfLT5sYXlvdXRffSwgcHVzaF9yYW5nZXMpOworCisgICAgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lQ2FjaGUobGF5ZXJfdGVzdF8uZGV2aWNlKCksICZwY19jaV8sIE5VTEwsICZwaXBlbGluZV9jYWNoZV8pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7Cit9CisKK3ZvaWQgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6OkxhdGVCaW5kUGlwZWxpbmVJbmZvKCkgeworICAgIC8vIEJ5IHZhbHVlIG9yIGR5bmFtaWNhbGx5IGxvY2F0ZWQgaXRlbXMgbXVzdCBiZSBsYXRlIGJvdW5kCisgICAgZ3BfY2lfLmxheW91dCA9IHBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCk7CisgICAgZ3BfY2lfLnN0YWdlQ291bnQgPSBzaGFkZXJfc3RhZ2VzXy5zaXplKCk7CisgICAgZ3BfY2lfLnBTdGFnZXMgPSBzaGFkZXJfc3RhZ2VzXy5kYXRhKCk7CisgICAgaWYgKChncF9jaV8ucFRlc3NlbGxhdGlvblN0YXRlID09IG51bGxwdHIpICYmIElzVmFsaWRWa1N0cnVjdCh0ZXNzX2NpXykpIHsKKyAgICAgICAgZ3BfY2lfLnBUZXNzZWxsYXRpb25TdGF0ZSA9ICZ0ZXNzX2NpXzsKKyAgICB9CisgICAgaWYgKChncF9jaV8ucER5bmFtaWNTdGF0ZSA9PSBudWxscHRyKSAmJiBJc1ZhbGlkVmtTdHJ1Y3QoZHluX3N0YXRlX2NpXykpIHsKKyAgICAgICAgZ3BfY2lfLnBEeW5hbWljU3RhdGUgPSAmZHluX3N0YXRlX2NpXzsKKyAgICB9Cit9CisKK1ZrUmVzdWx0IENyZWF0ZVBpcGVsaW5lSGVscGVyOjpDcmVhdGVHcmFwaGljc1BpcGVsaW5lKGJvb2wgaW1wbGljaXRfZGVzdHJveSwgYm9vbCBkb19sYXRlX2JpbmQpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgaWYgKGRvX2xhdGVfYmluZCkgeworICAgICAgICBMYXRlQmluZFBpcGVsaW5lSW5mbygpOworICAgIH0KKyAgICBpZiAoaW1wbGljaXRfZGVzdHJveSAmJiAocGlwZWxpbmVfICE9IFZLX05VTExfSEFORExFKSkgeworICAgICAgICB2azo6RGVzdHJveVBpcGVsaW5lKGxheWVyX3Rlc3RfLmRldmljZSgpLCBwaXBlbGluZV8sIG51bGxwdHIpOworICAgICAgICBwaXBlbGluZV8gPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisgICAgZXJyID0gdms6OkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKGxheWVyX3Rlc3RfLmRldmljZSgpLCBwaXBlbGluZV9jYWNoZV8sIDEsICZncF9jaV8sIE5VTEwsICZwaXBlbGluZV8pOworICAgIHJldHVybiBlcnI7Cit9CisKK0NyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlcjo6Q3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyKFZrTGF5ZXJUZXN0ICZ0ZXN0KSA6IGxheWVyX3Rlc3RfKHRlc3QpIHt9CisKK0NyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlcjo6fkNyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlcigpIHsKKyAgICBWa0RldmljZSBkZXZpY2UgPSBsYXllcl90ZXN0Xy5kZXZpY2UoKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lQ2FjaGUoZGV2aWNlLCBwaXBlbGluZV9jYWNoZV8sIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmUoZGV2aWNlLCBwaXBlbGluZV8sIG51bGxwdHIpOworfQorCit2b2lkIENyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlcjo6SW5pdERlc2NyaXB0b3JTZXRJbmZvKCkgeworICAgIGRzbF9iaW5kaW5nc18gPSB7ezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn19OworfQorCit2b2lkIENyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlcjo6SW5pdFBpcGVsaW5lTGF5b3V0SW5mbygpIHsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2lfLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lX2xheW91dF9jaV8uc2V0TGF5b3V0Q291bnQgPSAxOyAgICAgLy8gTm90IHJlYWxseSBjaGFuZ2VhYmxlIGJlY2F1c2UgSW5pdFN0YXRlKCkgc2V0cyBleGFjdGx5IG9uZSBwU2V0TGF5b3V0CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpXy5wU2V0TGF5b3V0cyA9IG51bGxwdHI7ICAvLyBtdXN0IGJvdW5kIGFmdGVyIGl0IGlzIGNyZWF0ZWQKK30KKwordm9pZCBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXI6OkluaXRTaGFkZXJJbmZvKCkgeworICAgIGNzXy5yZXNldChuZXcgVmtTaGFkZXJPYmoobGF5ZXJfdGVzdF8uRGV2aWNlT2JqKCksIGJpbmRTdGF0ZU1pbmltYWxTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsICZsYXllcl90ZXN0XykpOworICAgIC8vIFdlIHNob3VsZG4ndCBuZWVkIGEgZnJhZ21lbnQgc2hhZGVyIGJ1dCBhZGQgaXQgdG8gYmUgYWJsZSB0byBydW4gb24gbW9yZSBkZXZpY2VzCit9CisKK3ZvaWQgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyOjpJbml0Q29tcHV0ZVBpcGVsaW5lSW5mbygpIHsKKyAgICBjcF9jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01QVVRFX1BJUEVMSU5FX0NSRUFURV9JTkZPOworICAgIGNwX2NpXy5wTmV4dCA9IG51bGxwdHI7CisgICAgY3BfY2lfLmZsYWdzID0gMDsKK30KKwordm9pZCBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXI6OkluaXRQaXBlbGluZUNhY2hlSW5mbygpIHsKKyAgICBwY19jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTzsKKyAgICBwY19jaV8ucE5leHQgPSBudWxscHRyOworICAgIHBjX2NpXy5mbGFncyA9IDA7CisgICAgcGNfY2lfLmluaXRpYWxEYXRhU2l6ZSA9IDA7CisgICAgcGNfY2lfLnBJbml0aWFsRGF0YSA9IG51bGxwdHI7Cit9CisKK3ZvaWQgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyOjpJbml0SW5mbygpIHsKKyAgICBJbml0RGVzY3JpcHRvclNldEluZm8oKTsKKyAgICBJbml0UGlwZWxpbmVMYXlvdXRJbmZvKCk7CisgICAgSW5pdFNoYWRlckluZm8oKTsKKyAgICBJbml0Q29tcHV0ZVBpcGVsaW5lSW5mbygpOworICAgIEluaXRQaXBlbGluZUNhY2hlSW5mbygpOworfQorCit2b2lkIENyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlcjo6SW5pdFN0YXRlKCkgeworICAgIFZrUmVzdWx0IGVycjsKKyAgICBkZXNjcmlwdG9yX3NldF8ucmVzZXQobmV3IE9uZU9mZkRlc2NyaXB0b3JTZXQobGF5ZXJfdGVzdF8uRGV2aWNlT2JqKCksIGRzbF9iaW5kaW5nc18pKTsKKyAgICBBU1NFUlRfVFJVRShkZXNjcmlwdG9yX3NldF8tPkluaXRpYWxpemVkKCkpOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtQdXNoQ29uc3RhbnRSYW5nZT4gcHVzaF9yYW5nZXMoCisgICAgICAgIHBpcGVsaW5lX2xheW91dF9jaV8ucFB1c2hDb25zdGFudFJhbmdlcywKKyAgICAgICAgcGlwZWxpbmVfbGF5b3V0X2NpXy5wUHVzaENvbnN0YW50UmFuZ2VzICsgcGlwZWxpbmVfbGF5b3V0X2NpXy5wdXNoQ29uc3RhbnRSYW5nZUNvdW50KTsKKyAgICBwaXBlbGluZV9sYXlvdXRfID0gVmtQaXBlbGluZUxheW91dE9iaihsYXllcl90ZXN0Xy5EZXZpY2VPYmooKSwgeyZkZXNjcmlwdG9yX3NldF8tPmxheW91dF99LCBwdXNoX3Jhbmdlcyk7CisKKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVDYWNoZShsYXllcl90ZXN0Xy5kZXZpY2UoKSwgJnBjX2NpXywgTlVMTCwgJnBpcGVsaW5lX2NhY2hlXyk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKK30KKwordm9pZCBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXI6OkxhdGVCaW5kUGlwZWxpbmVJbmZvKCkgeworICAgIC8vIEJ5IHZhbHVlIG9yIGR5bmFtaWNhbGx5IGxvY2F0ZWQgaXRlbXMgbXVzdCBiZSBsYXRlIGJvdW5kCisgICAgY3BfY2lfLmxheW91dCA9IHBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCk7CisgICAgY3BfY2lfLnN0YWdlID0gY3NfLmdldCgpLT5HZXRTdGFnZUNyZWF0ZUluZm8oKTsKK30KKworVmtSZXN1bHQgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyOjpDcmVhdGVDb21wdXRlUGlwZWxpbmUoYm9vbCBpbXBsaWNpdF9kZXN0cm95LCBib29sIGRvX2xhdGVfYmluZCkgeworICAgIFZrUmVzdWx0IGVycjsKKyAgICBpZiAoZG9fbGF0ZV9iaW5kKSB7CisgICAgICAgIExhdGVCaW5kUGlwZWxpbmVJbmZvKCk7CisgICAgfQorICAgIGlmIChpbXBsaWNpdF9kZXN0cm95ICYmIChwaXBlbGluZV8gIT0gVktfTlVMTF9IQU5ETEUpKSB7CisgICAgICAgIHZrOjpEZXN0cm95UGlwZWxpbmUobGF5ZXJfdGVzdF8uZGV2aWNlKCksIHBpcGVsaW5lXywgbnVsbHB0cik7CisgICAgICAgIHBpcGVsaW5lXyA9IFZLX05VTExfSEFORExFOworICAgIH0KKyAgICBlcnIgPSB2azo6Q3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhsYXllcl90ZXN0Xy5kZXZpY2UoKSwgcGlwZWxpbmVfY2FjaGVfLCAxLCAmY3BfY2lfLCBOVUxMLCAmcGlwZWxpbmVfKTsKKyAgICByZXR1cm4gZXJyOworfQorCitDcmVhdGVOVlJheVRyYWNpbmdQaXBlbGluZUhlbHBlcjo6Q3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXIoVmtMYXllclRlc3QgJnRlc3QpIDogbGF5ZXJfdGVzdF8odGVzdCkge30KK0NyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyOjp+Q3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXIoKSB7CisgICAgVmtEZXZpY2UgZGV2aWNlID0gbGF5ZXJfdGVzdF8uZGV2aWNlKCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUNhY2hlKGRldmljZSwgcGlwZWxpbmVfY2FjaGVfLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lKGRldmljZSwgcGlwZWxpbmVfLCBudWxscHRyKTsKK30KKworYm9vbCBDcmVhdGVOVlJheVRyYWNpbmdQaXBlbGluZUhlbHBlcjo6SW5pdEluc3RhbmNlRXh0ZW5zaW9ucyhWa0xheWVyVGVzdCAmdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiAmaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzKSB7CisgICAgaWYgKHRlc3QuSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBpbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgaW5zdGFuY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyOjpJbml0RGV2aWNlRXh0ZW5zaW9ucyhWa0xheWVyVGVzdCAmdGVzdCwgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiAmZGV2aWNlX2V4dGVuc2lvbl9uYW1lcykgeworICAgIHN0ZDo6YXJyYXk8Y29uc3QgY2hhciAqLCAyPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHsKKyAgICAgICAge1ZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRX19OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKHRlc3QuRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKHRlc3QuZ3B1KCksIG51bGxwdHIsIGRldmljZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgICBkZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkluaXRTaGFkZXJHcm91cHMoKSB7CisgICAgeworICAgICAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBncm91cCA9IHt9OworICAgICAgICBncm91cC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OVjsKKyAgICAgICAgZ3JvdXAudHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwLmdlbmVyYWxTaGFkZXIgPSAwOworICAgICAgICBncm91cC5jbG9zZXN0SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXAuYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXAuaW50ZXJzZWN0aW9uU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBzXy5wdXNoX2JhY2soZ3JvdXApOworICAgIH0KKyAgICB7CisgICAgICAgIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGdyb3VwID0ge307CisgICAgICAgIGdyb3VwLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cC50eXBlID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OVjsKKyAgICAgICAgZ3JvdXAuZ2VuZXJhbFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwLmNsb3Nlc3RIaXRTaGFkZXIgPSAxOworICAgICAgICBncm91cC5hbnlIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cC5pbnRlcnNlY3Rpb25TaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cHNfLnB1c2hfYmFjayhncm91cCk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgZ3JvdXAgPSB7fTsKKyAgICAgICAgZ3JvdXAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIGdyb3VwLnR5cGUgPSBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WOworICAgICAgICBncm91cC5nZW5lcmFsU2hhZGVyID0gMjsKKyAgICAgICAgZ3JvdXAuY2xvc2VzdEhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwLmFueUhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3Vwc18ucHVzaF9iYWNrKGdyb3VwKTsKKyAgICB9Cit9CisKK3ZvaWQgQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkluaXREZXNjcmlwdG9yU2V0SW5mbygpIHsKKyAgICBkc2xfYmluZGluZ3NfID0geworICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UsIDEsIFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WLCBudWxscHRyfSwKKyAgICAgICAgezEsIFZLX0RFU0NSSVBUT1JfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WLCAxLCBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OViwgbnVsbHB0cn0sCisgICAgfTsKK30KKwordm9pZCBDcmVhdGVOVlJheVRyYWNpbmdQaXBlbGluZUhlbHBlcjo6SW5pdFBpcGVsaW5lTGF5b3V0SW5mbygpIHsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2lfLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lX2xheW91dF9jaV8uc2V0TGF5b3V0Q291bnQgPSAxOyAgICAgLy8gTm90IHJlYWxseSBjaGFuZ2VhYmxlIGJlY2F1c2UgSW5pdFN0YXRlKCkgc2V0cyBleGFjdGx5IG9uZSBwU2V0TGF5b3V0CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpXy5wU2V0TGF5b3V0cyA9IG51bGxwdHI7ICAvLyBtdXN0IGJvdW5kIGFmdGVyIGl0IGlzIGNyZWF0ZWQKK30KKwordm9pZCBDcmVhdGVOVlJheVRyYWNpbmdQaXBlbGluZUhlbHBlcjo6SW5pdFNoYWRlckluZm8oKSB7ICAvLyBET05FCisgICAgc3RhdGljIGNvbnN0IGNoYXIgcmF5R2VuU2hhZGVyVGV4dFtdID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ2MCBjb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIjZXh0ZW5zaW9uIEdMX05WX3JheV90cmFjaW5nIDogcmVxdWlyZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAwLCByZ2JhOCkgdW5pZm9ybSBpbWFnZTJEIGltYWdlOyAgICAgICBcbiIKKyAgICAgICAgImxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMSkgdW5pZm9ybSBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBhczsgXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uID0gMCkgcmF5UGF5bG9hZE5WIGZsb2F0IHBheWxvYWQ7ICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAieyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgIHZlYzQgY29sID0gdmVjNCgwLCAwLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICAgdmVjMyBvcmlnaW4gPSB2ZWMzKGZsb2F0KGdsX0xhdW5jaElETlYueCkvZmxvYXQoZ2xfTGF1bmNoU2l6ZU5WLngpLCAiCisgICAgICAgICJmbG9hdChnbF9MYXVuY2hJRE5WLnkpL2Zsb2F0KGdsX0xhdW5jaFNpemVOVi55KSwgIgorICAgICAgICAiMS4wKTsgXG4iCisgICAgICAgICIgICB2ZWMzIGRpciA9IHZlYzMoMC4wLCAwLjAsIC0xLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgIHBheWxvYWQgPSAwLjU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgICB0cmFjZU5WKGFzLCBnbF9SYXlGbGFnc0N1bGxCYWNrRmFjaW5nVHJpYW5nbGVzTlYsIDB4ZmYsIDAsIDEsIDAsIG9yaWdpbiwgMC4wLCBkaXIsIDEwMDAuMCwgMCk7IFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgIGNvbC55ID0gcGF5bG9hZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICAgaW1hZ2VTdG9yZShpbWFnZSwgaXZlYzIoZ2xfTGF1bmNoSUROVi54eSksIGNvbCk7ICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBzdGF0aWMgY2hhciBjb25zdCBjbG9zZXN0SGl0U2hhZGVyVGV4dFtdID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ2MCBjb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIjZXh0ZW5zaW9uIEdMX05WX3JheV90cmFjaW5nIDogcmVxdWlyZSAgICAgICAgIFxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uID0gMCkgcmF5UGF5bG9hZEluTlYgZmxvYXQgaGl0VmFsdWU7ICAgICAgICAgICAgIFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgICAgaGl0VmFsdWUgPSAxLjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiI7CisKKyAgICBzdGF0aWMgY2hhciBjb25zdCBtaXNzU2hhZGVyVGV4dFtdID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ2MCBjb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIjZXh0ZW5zaW9uIEdMX05WX3JheV90cmFjaW5nIDogcmVxdWlyZSAgICAgICAgIFxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uID0gMCkgcmF5UGF5bG9hZEluTlYgZmxvYXQgaGl0VmFsdWU7IFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgICAgaGl0VmFsdWUgPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiI7CisKKyAgICByZ3NfLnJlc2V0KG5ldyBWa1NoYWRlck9iaihsYXllcl90ZXN0Xy5EZXZpY2VPYmooKSwgcmF5R2VuU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlYsICZsYXllcl90ZXN0XykpOworICAgIGNoc18ucmVzZXQobmV3IFZrU2hhZGVyT2JqKGxheWVyX3Rlc3RfLkRldmljZU9iaigpLCBjbG9zZXN0SGl0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0NMT1NFU1RfSElUX0JJVF9OViwgJmxheWVyX3Rlc3RfKSk7CisgICAgbWlzXy5yZXNldChuZXcgVmtTaGFkZXJPYmoobGF5ZXJfdGVzdF8uRGV2aWNlT2JqKCksIG1pc3NTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfTUlTU19CSVRfTlYsICZsYXllcl90ZXN0XykpOworCisgICAgc2hhZGVyX3N0YWdlc18gPSB7cmdzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGNoc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBtaXNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKX07Cit9CisKK3ZvaWQgQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkluaXROVlJheVRyYWNpbmdQaXBlbGluZUluZm8oKSB7CisgICAgcnBfY2lfLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY7CisgICAgcnBfY2lfLm1heFJlY3Vyc2lvbkRlcHRoID0gMDsKKyAgICBycF9jaV8uc3RhZ2VDb3VudCA9IHNoYWRlcl9zdGFnZXNfLnNpemUoKTsKKyAgICBycF9jaV8ucFN0YWdlcyA9IHNoYWRlcl9zdGFnZXNfLmRhdGEoKTsKKyAgICBycF9jaV8uZ3JvdXBDb3VudCA9IGdyb3Vwc18uc2l6ZSgpOworICAgIHJwX2NpXy5wR3JvdXBzID0gZ3JvdXBzXy5kYXRhKCk7Cit9CisKK3ZvaWQgQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkluaXRQaXBlbGluZUNhY2hlSW5mbygpIHsKKyAgICBwY19jaV8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTzsKKyAgICBwY19jaV8ucE5leHQgPSBudWxscHRyOworICAgIHBjX2NpXy5mbGFncyA9IDA7CisgICAgcGNfY2lfLmluaXRpYWxEYXRhU2l6ZSA9IDA7CisgICAgcGNfY2lfLnBJbml0aWFsRGF0YSA9IG51bGxwdHI7Cit9CisKK3ZvaWQgQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkluaXRJbmZvKCkgeworICAgIEluaXRTaGFkZXJHcm91cHMoKTsKKyAgICBJbml0RGVzY3JpcHRvclNldEluZm8oKTsKKyAgICBJbml0UGlwZWxpbmVMYXlvdXRJbmZvKCk7CisgICAgSW5pdFNoYWRlckluZm8oKTsKKyAgICBJbml0TlZSYXlUcmFjaW5nUGlwZWxpbmVJbmZvKCk7CisgICAgSW5pdFBpcGVsaW5lQ2FjaGVJbmZvKCk7Cit9CisKK3ZvaWQgQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkluaXRTdGF0ZSgpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgZGVzY3JpcHRvcl9zZXRfLnJlc2V0KG5ldyBPbmVPZmZEZXNjcmlwdG9yU2V0KGxheWVyX3Rlc3RfLkRldmljZU9iaigpLCBkc2xfYmluZGluZ3NfKSk7CisgICAgQVNTRVJUX1RSVUUoZGVzY3JpcHRvcl9zZXRfLT5Jbml0aWFsaXplZCgpKTsKKworICAgIHBpcGVsaW5lX2xheW91dF8gPSBWa1BpcGVsaW5lTGF5b3V0T2JqKGxheWVyX3Rlc3RfLkRldmljZU9iaigpLCB7JmRlc2NyaXB0b3Jfc2V0Xy0+bGF5b3V0X30pOworCisgICAgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lQ2FjaGUobGF5ZXJfdGVzdF8uZGV2aWNlKCksICZwY19jaV8sIE5VTEwsICZwaXBlbGluZV9jYWNoZV8pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7Cit9CisKK3ZvaWQgQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkxhdGVCaW5kUGlwZWxpbmVJbmZvKCkgeworICAgIC8vIEJ5IHZhbHVlIG9yIGR5bmFtaWNhbGx5IGxvY2F0ZWQgaXRlbXMgbXVzdCBiZSBsYXRlIGJvdW5kCisgICAgcnBfY2lfLmxheW91dCA9IHBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCk7CisgICAgcnBfY2lfLnN0YWdlQ291bnQgPSBzaGFkZXJfc3RhZ2VzXy5zaXplKCk7CisgICAgcnBfY2lfLnBTdGFnZXMgPSBzaGFkZXJfc3RhZ2VzXy5kYXRhKCk7Cit9CisKK1ZrUmVzdWx0IENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyOjpDcmVhdGVOVlJheVRyYWNpbmdQaXBlbGluZShib29sIGltcGxpY2l0X2Rlc3Ryb3ksIGJvb2wgZG9fbGF0ZV9iaW5kKSB7CisgICAgVmtSZXN1bHQgZXJyOworICAgIGlmIChkb19sYXRlX2JpbmQpIHsKKyAgICAgICAgTGF0ZUJpbmRQaXBlbGluZUluZm8oKTsKKyAgICB9CisgICAgaWYgKGltcGxpY2l0X2Rlc3Ryb3kgJiYgKHBpcGVsaW5lXyAhPSBWS19OVUxMX0hBTkRMRSkpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lQaXBlbGluZShsYXllcl90ZXN0Xy5kZXZpY2UoKSwgcGlwZWxpbmVfLCBudWxscHRyKTsKKyAgICAgICAgcGlwZWxpbmVfID0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorCisgICAgUEZOX3ZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIHZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WID0KKyAgICAgICAgKFBGTl92a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihsYXllcl90ZXN0Xy5pbnN0YW5jZSgpLCAidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiKTsKKyAgICBlcnIgPSB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihsYXllcl90ZXN0Xy5kZXZpY2UoKSwgcGlwZWxpbmVfY2FjaGVfLCAxLCAmcnBfY2lfLCBudWxscHRyLCAmcGlwZWxpbmVfKTsKKyAgICByZXR1cm4gZXJyOworfQorCituYW1lc3BhY2UgY2hhaW5fdXRpbCB7Citjb25zdCB2b2lkICpFeHRlbnNpb25DaGFpbjo6SGVhZCgpIGNvbnN0IHsgcmV0dXJuIGhlYWRfOyB9Cit9ICAvLyBuYW1lc3BhY2UgY2hhaW5fdXRpbAorCitCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyOjpRdWV1ZUZhbWlseU9ianM6On5RdWV1ZUZhbWlseU9ianMoKSB7CisgICAgZGVsZXRlIGNvbW1hbmRfYnVmZmVyMjsKKyAgICBkZWxldGUgY29tbWFuZF9idWZmZXI7CisgICAgZGVsZXRlIGNvbW1hbmRfcG9vbDsKKyAgICBkZWxldGUgcXVldWU7Cit9CisKK3ZvaWQgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlcjo6UXVldWVGYW1pbHlPYmpzOjpJbml0KFZrRGV2aWNlT2JqICpkZXZpY2UsIHVpbnQzMl90IHFmX2luZGV4LCBWa1F1ZXVlIHFmX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIGNwX2ZsYWdzKSB7CisgICAgaW5kZXggPSBxZl9pbmRleDsKKyAgICBxdWV1ZSA9IG5ldyBWa1F1ZXVlT2JqKHFmX3F1ZXVlLCBxZl9pbmRleCk7CisgICAgY29tbWFuZF9wb29sID0gbmV3IFZrQ29tbWFuZFBvb2xPYmooZGV2aWNlLCBxZl9pbmRleCwgY3BfZmxhZ3MpOworICAgIGNvbW1hbmRfYnVmZmVyID0gbmV3IFZrQ29tbWFuZEJ1ZmZlck9iaihkZXZpY2UsIGNvbW1hbmRfcG9vbCwgVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSwgcXVldWUpOworICAgIGNvbW1hbmRfYnVmZmVyMiA9IG5ldyBWa0NvbW1hbmRCdWZmZXJPYmooZGV2aWNlLCBjb21tYW5kX3Bvb2wsIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlksIHF1ZXVlKTsKK307CisKK0JhcnJpZXJRdWV1ZUZhbWlseVRlc3RIZWxwZXI6OkNvbnRleHQ6OkNvbnRleHQoVmtMYXllclRlc3QgKnRlc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAmcXVldWVfZmFtaWx5X2luZGljZXMpCisgICAgOiBsYXllcl90ZXN0KHRlc3QpIHsKKyAgICBpZiAoMCA9PSBxdWV1ZV9mYW1pbHlfaW5kaWNlcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gVGhpcyBpcyBpbnZhbGlkCisgICAgfQorICAgIFZrRGV2aWNlT2JqICpkZXZpY2Vfb2JqID0gbGF5ZXJfdGVzdC0+RGV2aWNlT2JqKCk7CisgICAgcXVldWVfZmFtaWxpZXMucmVzZXJ2ZShxdWV1ZV9mYW1pbHlfaW5kaWNlcy5zaXplKCkpOworICAgIGRlZmF1bHRfaW5kZXggPSBxdWV1ZV9mYW1pbHlfaW5kaWNlc1swXTsKKyAgICBmb3IgKGF1dG8gcWZpIDogcXVldWVfZmFtaWx5X2luZGljZXMpIHsKKyAgICAgICAgVmtRdWV1ZSBxdWV1ZSA9IGRldmljZV9vYmotPnF1ZXVlX2ZhbWlseV9xdWV1ZXMocWZpKVswXS0+aGFuZGxlKCk7CisgICAgICAgIHF1ZXVlX2ZhbWlsaWVzLmVtcGxhY2Uoc3RkOjptYWtlX3BhaXIocWZpLCBRdWV1ZUZhbWlseU9ianMoKSkpOworICAgICAgICBxdWV1ZV9mYW1pbGllc1txZmldLkluaXQoZGV2aWNlX29iaiwgcWZpLCBxdWV1ZSwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpOworICAgIH0KKyAgICBSZXNldCgpOworfQorCit2b2lkIEJhcnJpZXJRdWV1ZUZhbWlseVRlc3RIZWxwZXI6OkNvbnRleHQ6OlJlc2V0KCkgeworICAgIGxheWVyX3Rlc3QtPkRldmljZU9iaigpLT53YWl0KCk7CisgICAgZm9yIChhdXRvICZxZiA6IHF1ZXVlX2ZhbWlsaWVzKSB7CisgICAgICAgIHZrOjpSZXNldENvbW1hbmRQb29sKGxheWVyX3Rlc3QtPmRldmljZSgpLCBxZi5zZWNvbmQuY29tbWFuZF9wb29sLT5oYW5kbGUoKSwgMCk7CisgICAgfQorfQorCitCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyOjpCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyKENvbnRleHQgKmNvbnRleHQpCisgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwgaW1hZ2VfKGNvbnRleHQtPmxheWVyX3Rlc3QtPkRldmljZU9iaigpKSB7fQorCit2b2lkIEJhcnJpZXJRdWV1ZUZhbWlseVRlc3RIZWxwZXI6OkluaXQoc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICpmYW1pbGllcywgYm9vbCBpbWFnZV9tZW1vcnksIGJvb2wgYnVmZmVyX21lbW9yeSkgeworICAgIFZrRGV2aWNlT2JqICpkZXZpY2Vfb2JqID0gY29udGV4dF8tPmxheWVyX3Rlc3QtPkRldmljZU9iaigpOworCisgICAgaW1hZ2VfLkluaXQoMzIsIDMyLCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCwgZmFtaWxpZXMsCisgICAgICAgICAgICAgICAgaW1hZ2VfbWVtb3J5KTsKKworICAgIEFTU0VSVF9UUlVFKGltYWdlXy5pbml0aWFsaXplZCgpKTsKKworICAgIGltYWdlX2JhcnJpZXJfID0gaW1hZ2VfLmltYWdlX21lbW9yeV9iYXJyaWVyKFZLX0FDQ0VTU19UUkFOU0ZFUl9SRUFEX0JJVCwgVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklULCBpbWFnZV8uTGF5b3V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfLkxheW91dCgpLCBpbWFnZV8uc3VicmVzb3VyY2VfcmFuZ2UoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMSkpOworCisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbV9wcm9wID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUOworICAgIGJ1ZmZlcl8uaW5pdF9hc19zcmNfYW5kX2RzdCgqZGV2aWNlX29iaiwgMjU2LCBtZW1fcHJvcCwgZmFtaWxpZXMsIGJ1ZmZlcl9tZW1vcnkpOworICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcl8uaW5pdGlhbGl6ZWQoKSk7CisgICAgYnVmZmVyX2JhcnJpZXJfID0gYnVmZmVyXy5idWZmZXJfbWVtb3J5X2JhcnJpZXIoVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklULCBWS19BQ0NFU1NfVFJBTlNGRVJfUkVBRF9CSVQsIDAsIFZLX1dIT0xFX1NJWkUpOworfQorCitCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyOjpRdWV1ZUZhbWlseU9ianMgKkJhcnJpZXJRdWV1ZUZhbWlseVRlc3RIZWxwZXI6OkdldFF1ZXVlRmFtaWx5SW5mbyhDb250ZXh0ICpjb250ZXh0LCB1aW50MzJfdCBxZmkpIHsKKyAgICBRdWV1ZUZhbWlseU9ianMgKnFmOworCisgICAgYXV0byBxZl9pdCA9IGNvbnRleHQtPnF1ZXVlX2ZhbWlsaWVzLmZpbmQocWZpKTsKKyAgICBpZiAocWZfaXQgIT0gY29udGV4dC0+cXVldWVfZmFtaWxpZXMuZW5kKCkpIHsKKyAgICAgICAgcWYgPSAmKHFmX2l0LT5zZWNvbmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHFmID0gJihjb250ZXh0LT5xdWV1ZV9mYW1pbGllc1tjb250ZXh0LT5kZWZhdWx0X2luZGV4XSk7CisgICAgfQorICAgIHJldHVybiBxZjsKK30KKwordm9pZCBCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyOjpvcGVyYXRvcigpKHN0ZDo6c3RyaW5nIGltZ19lcnIsIHN0ZDo6c3RyaW5nIGJ1Zl9lcnIsIHVpbnQzMl90IHNyYywgdWludDMyX3QgZHN0LCBib29sIHBvc2l0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleCwgTW9kaWZpZXIgbW9kKSB7CisgICAgYXV0byBtb25pdG9yID0gY29udGV4dF8tPmxheWVyX3Rlc3QtPk1vbml0b3IoKTsKKyAgICBpZiAoaW1nX2Vyci5sZW5ndGgoKSkgbW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQgfCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBpbWdfZXJyKTsKKyAgICBpZiAoYnVmX2Vyci5sZW5ndGgoKSkgbW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQgfCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCBidWZfZXJyKTsKKworICAgIGltYWdlX2JhcnJpZXJfLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBzcmM7CisgICAgaW1hZ2VfYmFycmllcl8uZHN0UXVldWVGYW1pbHlJbmRleCA9IGRzdDsKKyAgICBidWZmZXJfYmFycmllcl8uc3JjUXVldWVGYW1pbHlJbmRleCA9IHNyYzsKKyAgICBidWZmZXJfYmFycmllcl8uZHN0UXVldWVGYW1pbHlJbmRleCA9IGRzdDsKKworICAgIFF1ZXVlRmFtaWx5T2JqcyAqcWYgPSBHZXRRdWV1ZUZhbWlseUluZm8oY29udGV4dF8sIHF1ZXVlX2ZhbWlseV9pbmRleCk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogKmNvbW1hbmRfYnVmZmVyID0gcWYtPmNvbW1hbmRfYnVmZmVyOworICAgIGZvciAoaW50IGNiX3JlcGVhdCA9IDA7IGNiX3JlcGVhdCA8IChtb2QgPT0gTW9kaWZpZXI6OkRPVUJMRV9DT01NQU5EX0JVRkZFUiA/IDIgOiAxKTsgY2JfcmVwZWF0KyspIHsKKyAgICAgICAgY29tbWFuZF9idWZmZXItPmJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IHJlcGVhdCA9IDA7IHJlcGVhdCA8IChtb2QgPT0gTW9kaWZpZXI6OkRPVUJMRV9SRUNPUkQgPyAyIDogMSk7IHJlcGVhdCsrKSB7CisgICAgICAgICAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRfYnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklULCBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMSwgJmJ1ZmZlcl9iYXJyaWVyXywgMSwgJmltYWdlX2JhcnJpZXJfKTsKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kX2J1ZmZlci0+ZW5kKCk7CisgICAgICAgIGNvbW1hbmRfYnVmZmVyID0gcWYtPmNvbW1hbmRfYnVmZmVyMjsgIC8vIFNlY29uZCBwYXNzIChpZiBhbnkpIGdvZXMgdG8gdGhlIHNlY29uZGFyeSBjb21tYW5kX2J1ZmZlci4KKyAgICB9CisKKyAgICBpZiAocXVldWVfZmFtaWx5X2luZGV4ICE9IGtJbnZhbGlkUXVldWVGYW1pbHkpIHsKKyAgICAgICAgaWYgKG1vZCA9PSBNb2RpZmllcjo6RE9VQkxFX0NPTU1BTkRfQlVGRkVSKSB7CisgICAgICAgICAgICAvLyB0aGUgRmVuY2UgcmVzb2x2ZXMgdG8gVktfTlVMTF9IQU5MRS4uLiBpLmUuIG5vIGZlbmNlCisgICAgICAgICAgICBxZi0+cXVldWUtPnN1Ym1pdCh7e3FmLT5jb21tYW5kX2J1ZmZlciwgcWYtPmNvbW1hbmRfYnVmZmVyMn19LCB2a190ZXN0aW5nOjpGZW5jZSgpLCBwb3NpdGl2ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBxZi0+Y29tbWFuZF9idWZmZXItPlF1ZXVlQ29tbWFuZEJ1ZmZlcihwb3NpdGl2ZSk7ICAvLyBDaGVjayBmb3Igc3VjY2VzcyBvbiBwb3NpdGl2ZSB0ZXN0cyBvbmx5CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocG9zaXRpdmUpIHsKKyAgICAgICAgbW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKyAgICBjb250ZXh0Xy0+UmVzZXQoKTsKK307CisKK3ZvaWQgcHJpbnRfYW5kcm9pZChjb25zdCBjaGFyICpjKSB7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMiLCAiJXMiLCBjKTsKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCit9CisKKyNpZiBkZWZpbmVkKEFORFJPSUQpICYmIGRlZmluZWQoVkFMSURBVElPTl9BUEspCitjb25zdCBjaGFyICphcHBUYWcgPSAiVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMiOworc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKK3N0YXRpYyBib29sIGFjdGl2ZSA9IGZhbHNlOworCisvLyBDb252ZXJ0IEludGVudHMgdG8gYXJndgorLy8gUG9ydGVkIGZyb20gSG9sb2dyYW0gc2FtcGxlLCBvbmx5IGRpZmZlcmVuY2UgaXMgZmxleGlibGUga2V5CitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0X2FyZ3MoYW5kcm9pZF9hcHAgJmFwcCwgY29uc3QgY2hhciAqaW50ZW50X2V4dHJhX2RhdGFfa2V5KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3M7CisgICAgSmF2YVZNICZ2bSA9ICphcHAuYWN0aXZpdHktPnZtOworICAgIEpOSUVudiAqcF9lbnY7CisgICAgaWYgKHZtLkF0dGFjaEN1cnJlbnRUaHJlYWQoJnBfZW52LCBudWxscHRyKSAhPSBKTklfT0spIHJldHVybiBhcmdzOworCisgICAgSk5JRW52ICZlbnYgPSAqcF9lbnY7CisgICAgam9iamVjdCBhY3Rpdml0eSA9IGFwcC5hY3Rpdml0eS0+Y2xheno7CisgICAgam1ldGhvZElEIGdldF9pbnRlbnRfbWV0aG9kID0gZW52LkdldE1ldGhvZElEKGVudi5HZXRPYmplY3RDbGFzcyhhY3Rpdml0eSksICJnZXRJbnRlbnQiLCAiKClMYW5kcm9pZC9jb250ZW50L0ludGVudDsiKTsKKyAgICBqb2JqZWN0IGludGVudCA9IGVudi5DYWxsT2JqZWN0TWV0aG9kKGFjdGl2aXR5LCBnZXRfaW50ZW50X21ldGhvZCk7CisgICAgam1ldGhvZElEIGdldF9zdHJpbmdfZXh0cmFfbWV0aG9kID0KKyAgICAgICAgZW52LkdldE1ldGhvZElEKGVudi5HZXRPYmplY3RDbGFzcyhpbnRlbnQpLCAiZ2V0U3RyaW5nRXh0cmEiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICBqdmFsdWUgZ2V0X3N0cmluZ19leHRyYV9hcmdzOworICAgIGdldF9zdHJpbmdfZXh0cmFfYXJncy5sID0gZW52Lk5ld1N0cmluZ1VURihpbnRlbnRfZXh0cmFfZGF0YV9rZXkpOworICAgIGpzdHJpbmcgZXh0cmFfc3RyID0gc3RhdGljX2Nhc3Q8anN0cmluZz4oZW52LkNhbGxPYmplY3RNZXRob2RBKGludGVudCwgZ2V0X3N0cmluZ19leHRyYV9tZXRob2QsICZnZXRfc3RyaW5nX2V4dHJhX2FyZ3MpKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3Nfc3RyOworICAgIGlmIChleHRyYV9zdHIpIHsKKyAgICAgICAgY29uc3QgY2hhciAqZXh0cmFfdXRmID0gZW52LkdldFN0cmluZ1VURkNoYXJzKGV4dHJhX3N0ciwgbnVsbHB0cik7CisgICAgICAgIGFyZ3Nfc3RyID0gZXh0cmFfdXRmOworICAgICAgICBlbnYuUmVsZWFzZVN0cmluZ1VURkNoYXJzKGV4dHJhX3N0ciwgZXh0cmFfdXRmKTsKKyAgICAgICAgZW52LkRlbGV0ZUxvY2FsUmVmKGV4dHJhX3N0cik7CisgICAgfQorCisgICAgZW52LkRlbGV0ZUxvY2FsUmVmKGdldF9zdHJpbmdfZXh0cmFfYXJncy5sKTsKKyAgICBlbnYuRGVsZXRlTG9jYWxSZWYoaW50ZW50KTsKKyAgICB2bS5EZXRhY2hDdXJyZW50VGhyZWFkKCk7CisKKyAgICAvLyBzcGxpdCBhcmdzX3N0cgorICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKGFyZ3Nfc3RyKTsKKyAgICBzdGQ6OnN0cmluZyBhcmc7CisgICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShzcywgYXJnLCAnICcpKSB7CisgICAgICAgIGlmICghYXJnLmVtcHR5KCkpIGFyZ3MucHVzaF9iYWNrKGFyZyk7CisgICAgfQorCisgICAgcmV0dXJuIGFyZ3M7Cit9CisKK3ZvaWQgYWRkRnVsbFRlc3RDb21tZW50SWZQcmVzZW50KGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8gJnRlc3RfaW5mbywgc3RkOjpzdHJpbmcgJmVycm9yX21lc3NhZ2UpIHsKKyAgICBjb25zdCBjaGFyICpjb25zdCB0eXBlX3BhcmFtID0gdGVzdF9pbmZvLnR5cGVfcGFyYW0oKTsKKyAgICBjb25zdCBjaGFyICpjb25zdCB2YWx1ZV9wYXJhbSA9IHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpOworCisgICAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCB8fCB2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICAgIGVycm9yX21lc3NhZ2UuYXBwZW5kKCIsIHdoZXJlICIpOworICAgICAgICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlLmFwcGVuZCgiVHlwZVBhcmFtID0gIikuYXBwZW5kKHR5cGVfcGFyYW0pOworICAgICAgICAgICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpIGVycm9yX21lc3NhZ2UuYXBwZW5kKCIgYW5kICIpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlLmFwcGVuZCgiR2V0UGFyYW0oKSA9ICIpLmFwcGVuZCh2YWx1ZV9wYXJhbSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xldGVzdC9ibG9iL21hc3Rlci9nb29nbGV0ZXN0L2RvY3MvQWR2YW5jZWRHdWlkZS5tZAorY2xhc3MgTG9nY2F0UHJpbnRlciA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworICAgIC8vIENhbGxlZCBiZWZvcmUgYSB0ZXN0IHN0YXJ0cy4KKyAgICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyAmdGVzdF9pbmZvKSB7CisgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgYXBwVGFnLCAiWyBSVU4gICAgICBdICVzLiVzIiwgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgIH0KKworICAgIC8vIENhbGxlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0ICZyZXN1bHQpIHsKKyAgICAgICAgLy8gSWYgdGhlIHRlc3QgcGFydCBzdWNjZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCisgICAgICAgIGlmIChyZXN1bHQudHlwZSgpID09IDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKSByZXR1cm47CisKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBhcHBUYWcsICIlcyBpbiAlczolZCAlcyIsIHJlc3VsdC5mYWlsZWQoKSA/ICIqKiogRmFpbHVyZSIgOiAiU3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVfbmFtZSgpLCByZXN1bHQubGluZV9udW1iZXIoKSwgcmVzdWx0LnN1bW1hcnkoKSk7CisgICAgfQorCisgICAgLy8gQ2FsbGVkIGFmdGVyIGEgdGVzdCBlbmRzLgorICAgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyAmaW5mbykgeworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICAgIGlmIChpbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiWyAgICAgICBPSyBdIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJbICBGQUlMRUQgIF0iKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKGluZm8udGVzdF9jYXNlX25hbWUoKSkuYXBwZW5kKCIuIikuYXBwZW5kKGluZm8ubmFtZSgpKTsKKyAgICAgICAgaWYgKGluZm8ucmVzdWx0KCktPkZhaWxlZCgpKSBhZGRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQoaW5mbywgcmVzdWx0KTsKKworICAgICAgICBpZiAoOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgICAgICBvcyA8PCBpbmZvLnJlc3VsdCgpLT5lbGFwc2VkX3RpbWUoKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAoIikuYXBwZW5kKG9zLnN0cigpKS5hcHBlbmQoIiBtcykiKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgYXBwVGFnLCAiJXMiLCByZXN1bHQuY19zdHIoKSk7CisgICAgfTsKK307CisKK3N0YXRpYyBpbnQzMl90IHByb2Nlc3NJbnB1dChzdHJ1Y3QgYW5kcm9pZF9hcHAgKmFwcCwgQUlucHV0RXZlbnQgKmV2ZW50KSB7IHJldHVybiAwOyB9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NDb21tYW5kKHN0cnVjdCBhbmRyb2lkX2FwcCAqYXBwLCBpbnQzMl90IGNtZCkgeworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgQVBQX0NNRF9JTklUX1dJTkRPVzogeworICAgICAgICAgICAgaWYgKGFwcC0+d2luZG93KSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIFZrVGVzdEZyYW1ld29yazo6d2luZG93ID0gYXBwLT53aW5kb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFQUF9DTURfR0FJTkVEX0ZPQ1VTOiB7CisgICAgICAgICAgICBhY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBUFBfQ01EX0xPU1RfRk9DVVM6IHsKKyAgICAgICAgICAgIGFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgYW5kcm9pZF9tYWluKHN0cnVjdCBhbmRyb2lkX2FwcCAqYXBwKSB7CisgICAgaW50IHZ1bGthblN1cHBvcnQgPSBJbml0VnVsa2FuKCk7CisgICAgaWYgKHZ1bGthblN1cHBvcnQgPT0gMCkgeworICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIGFwcFRhZywgIj09PT0gRkFJTEVEID09PT0gTm8gVnVsa2FuIHN1cHBvcnQgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFwcC0+b25BcHBDbWQgPSBwcm9jZXNzQ29tbWFuZDsKKyAgICBhcHAtPm9uSW5wdXRFdmVudCA9IHByb2Nlc3NJbnB1dDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBldmVudHM7CisgICAgICAgIHN0cnVjdCBhbmRyb2lkX3BvbGxfc291cmNlICpzb3VyY2U7CisgICAgICAgIHdoaWxlIChBTG9vcGVyX3BvbGxBbGwoYWN0aXZlID8gMCA6IC0xLCBOVUxMLCAmZXZlbnRzLCAodm9pZCAqKikmc291cmNlKSA+PSAwKSB7CisgICAgICAgICAgICBpZiAoc291cmNlKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5wcm9jZXNzKGFwcCwgc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFwcC0+ZGVzdHJveVJlcXVlc3RlZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgVmtUZXN0RnJhbWV3b3JrOjpGaW5pc2goKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5pdGlhbGl6ZWQgJiYgYWN0aXZlKSB7CisgICAgICAgICAgICAvLyBVc2UgdGhlIGZvbGxvd2luZyBrZXkgdG8gc2VuZCBhcmd1bWVudHMgdG8gZ3Rlc3QsIGkuZS4KKyAgICAgICAgICAgIC8vIC0tZXMgYXJncyAiLS1ndGVzdF9maWx0ZXI9LVZrTGF5ZXJUZXN0LmZvbyIKKyAgICAgICAgICAgIGNvbnN0IGNoYXIga2V5W10gPSAiYXJncyI7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJncyA9IGdldF9hcmdzKCphcHAsIGtleSk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbHRlciA9ICIiOworICAgICAgICAgICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgYXBwVGFnLCAiSW50ZW50IGFyZ3MgPSAlcyIsIGFyZ3NbMF0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZmlsdGVyICs9IGFyZ3NbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgYXBwVGFnLCAiTm8gSW50ZW50IGFyZ3MgZGV0ZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFyZ2MgPSAyOworICAgICAgICAgICAgY2hhciAqYXJndltdID0geyhjaGFyICopImZvbyIsIChjaGFyICopZmlsdGVyLmNfc3RyKCl9OworICAgICAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19ERUJVRywgYXBwVGFnLCAiZmlsdGVyID0gJXMiLCBhcmd2WzFdKTsKKworICAgICAgICAgICAgLy8gUm91dGUgb3V0cHV0IHRvIGZpbGVzIHVudGlsIHdlIGNhbiBvdmVycmlkZSB0aGUgZ3Rlc3Qgb3V0cHV0CisgICAgICAgICAgICBmcmVvcGVuKCIvc2RjYXJkL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5WdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cy9maWxlcy9vdXQudHh0IiwgInciLCBzdGRvdXQpOworICAgICAgICAgICAgZnJlb3BlbigiL3NkY2FyZC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMvZmlsZXMvZXJyLnR4dCIsICJ3Iiwgc3RkZXJyKTsKKworICAgICAgICAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgICAgICAgICAgIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzICZsaXN0ZW5lcnMgPSA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGxpc3RlbmVycy5BcHBlbmQobmV3IExvZ2NhdFByaW50ZXIpOworCisgICAgICAgICAgICBWa1Rlc3RGcmFtZXdvcms6OkluaXRBcmdzKCZhcmdjLCBhcmd2KTsKKyAgICAgICAgICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBUZXN0RW52aXJvbm1lbnQpOworCisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gUlVOX0FMTF9URVNUUygpOworCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIGFwcFRhZywgIj09PT0gVGVzdHMgRkFJTEVEID09PT0iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBhcHBUYWcsICI9PT09IFRlc3RzIFBBU1NFRCA9PT09Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZrVGVzdEZyYW1ld29yazo6RmluaXNoKCk7CisKKyAgICAgICAgICAgIGZjbG9zZShzdGRvdXQpOworICAgICAgICAgICAgZmNsb3NlKHN0ZGVycik7CisKKyAgICAgICAgICAgIEFOYXRpdmVBY3Rpdml0eV9maW5pc2goYXBwLT5hY3Rpdml0eSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChOREVCVUcpCisjaW5jbHVkZSA8Y3J0ZGJnLmg+CisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgaW50IHJlc3VsdDsKKworI2lmZGVmIEFORFJPSUQKKyAgICBpbnQgdnVsa2FuU3VwcG9ydCA9IEluaXRWdWxrYW4oKTsKKyAgICBpZiAodnVsa2FuU3VwcG9ydCA9PSAwKSByZXR1cm4gMTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKE5ERUJVRykKKyAgICBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX1dBUk4sIF9DUlREQkdfTU9ERV9GSUxFKTsKKyAgICBfQ3J0U2V0UmVwb3J0RmlsZShfQ1JUX0FTU0VSVCwgX0NSVERCR19GSUxFX1NUREVSUik7CisjZW5kaWYKKworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIFZrVGVzdEZyYW1ld29yazo6SW5pdEFyZ3MoJmFyZ2MsIGFyZ3YpOworCisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IFRlc3RFbnZpcm9ubWVudCk7CisKKyAgICByZXN1bHQgPSBSVU5fQUxMX1RFU1RTKCk7CisKKyAgICBWa1Rlc3RGcmFtZXdvcms6OkZpbmlzaCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9sYXllcl92YWxpZGF0aW9uX3Rlc3RzLmggYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9sYXllcl92YWxpZGF0aW9uX3Rlc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3MWQxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVyX3ZhbGlkYXRpb25fdGVzdHMuaApAQCAtMCwwICsxLDcyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjbm9ydGhyb3BAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKZXJlbXkgS25pYWdlciA8amVyZW15a0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBTaGFubm9uIE1jUGhlcnNvbiA8c2hhbm5vbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorICovCisKKyNpZm5kZWYgVktMQVlFUlRFU1RfSAorI2RlZmluZSBWS0xBWUVSVEVTVF9ICisKKyNpZmRlZiBBTkRST0lECisjaW5jbHVkZSAidnVsa2FuX3dyYXBwZXIuaCIKKyNlbHNlCisjZGVmaW5lIE5PTUlOTUFYCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsYXllcnMvdmtfZGV2aWNlX3Byb2ZpbGVfYXBpX2xheWVyLmgiCisKKyNpZiBkZWZpbmVkKEFORFJPSUQpCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpZiBkZWZpbmVkKFZBTElEQVRJT05fQVBLKQorI2luY2x1ZGUgPGFuZHJvaWRfbmF0aXZlX2FwcF9nbHVlLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiaWNkLXNwdi5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfY29uZmlnLmgiCisjaW5jbHVkZSAidmtfZm9ybWF0X3V0aWxzLmgiCisjaW5jbHVkZSAidmtyZW5kZXJmcmFtZXdvcmsuaCIKKyNpbmNsdWRlICJ2a190eXBlbWFwX2hlbHBlci5oIgorI2luY2x1ZGUgImNvbnZlcnRfdG9fcmVuZGVycGFzczIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVzaCBhbmQgVmVydGV4Rm9ybWF0IERhdGEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IGNoYXIga1NraXBQcmVmaXhbXSA9ICIgICAgICAgICAgICAgVEVTVCBTS0lQUEVEOiI7CisKK2VudW0gQnNvRmFpbFNlbGVjdCB7CisgICAgQnNvRmFpbE5vbmUsCisgICAgQnNvRmFpbExpbmVXaWR0aCwKKyAgICBCc29GYWlsRGVwdGhCaWFzLAorICAgIEJzb0ZhaWxWaWV3cG9ydCwKKyAgICBCc29GYWlsU2Npc3NvciwKKyAgICBCc29GYWlsQmxlbmQsCisgICAgQnNvRmFpbERlcHRoQm91bmRzLAorICAgIEJzb0ZhaWxTdGVuY2lsUmVhZE1hc2ssCisgICAgQnNvRmFpbFN0ZW5jaWxXcml0ZU1hc2ssCisgICAgQnNvRmFpbFN0ZW5jaWxSZWZlcmVuY2UsCisgICAgQnNvRmFpbENtZENsZWFyQXR0YWNobWVudHMsCisgICAgQnNvRmFpbEluZGV4QnVmZmVyLAorICAgIEJzb0ZhaWxJbmRleEJ1ZmZlckJhZFNpemUsCisgICAgQnNvRmFpbEluZGV4QnVmZmVyQmFkT2Zmc2V0LAorICAgIEJzb0ZhaWxJbmRleEJ1ZmZlckJhZE1hcFNpemUsCisgICAgQnNvRmFpbEluZGV4QnVmZmVyQmFkTWFwT2Zmc2V0LAorICAgIEJzb0ZhaWxMaW5lU3RpcHBsZSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGJpbmRTdGF0ZU1pbmltYWxTaGFkZXJUZXh0W10gPSAiI3ZlcnNpb24gNDUwXG52b2lkIG1haW4oKSB7fVxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgYmluZFN0YXRlVmVydFNoYWRlclRleHRbXSA9CisgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCgxKTtcbiIKKyAgICAifVxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgYmluZFN0YXRlVmVydFBvaW50U2l6ZVNoYWRlclRleHRbXSA9CisgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICJvdXQgZ2xfUGVyVmVydGV4IHtcbiIKKyAgICAiICAgIHZlYzQgZ2xfUG9zaXRpb247XG4iCisgICAgIiAgICBmbG9hdCBnbF9Qb2ludFNpemU7XG4iCisgICAgIn07XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgxKTtcbiIKKyAgICAiICAgIGdsX1BvaW50U2l6ZSA9IDEuMDtcbiIKKyAgICAifVxuIjsKKworc3RhdGljIGNoYXIgY29uc3QgYmluZFN0YXRlR2VvbVNoYWRlclRleHRbXSA9CisgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICJsYXlvdXQodHJpYW5nbGVzKSBpbjtcbiIKKyAgICAibGF5b3V0KHRyaWFuZ2xlX3N0cmlwLCBtYXhfdmVydGljZXM9Mykgb3V0O1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCgxKTtcbiIKKyAgICAiICAgRW1pdFZlcnRleCgpO1xuIgorICAgICJ9XG4iOworCitzdGF0aWMgY2hhciBjb25zdCBiaW5kU3RhdGVHZW9tUG9pbnRTaXplU2hhZGVyVGV4dFtdID0KKyAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgImxheW91dCAocG9pbnRzKSBpbjtcbiIKKyAgICAibGF5b3V0IChwb2ludHMpIG91dDtcbiIKKyAgICAibGF5b3V0IChtYXhfdmVydGljZXMgPSAxKSBvdXQ7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDEpO1xuIgorICAgICIgICBnbF9Qb2ludFNpemUgPSAxLjA7XG4iCisgICAgIiAgIEVtaXRWZXJ0ZXgoKTtcbiIKKyAgICAifVxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgYmluZFN0YXRlVHNjU2hhZGVyVGV4dFtdID0KKyAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgImxheW91dCh2ZXJ0aWNlcz0zKSBvdXQ7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICAgZ2xfVGVzc0xldmVsT3V0ZXJbMF0gPSBnbF9UZXNzTGV2ZWxPdXRlclsxXSA9IGdsX1Rlc3NMZXZlbE91dGVyWzJdID0gMTtcbiIKKyAgICAiICAgZ2xfVGVzc0xldmVsSW5uZXJbMF0gPSAxO1xuIgorICAgICJ9XG4iOworCitzdGF0aWMgY29uc3QgY2hhciBiaW5kU3RhdGVUZXNoYWRlclRleHRbXSA9CisgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICJsYXlvdXQodHJpYW5nbGVzLCBlcXVhbF9zcGFjaW5nLCBjdykgaW47XG4iCisgICAgInZvaWQgbWFpbigpIHsgZ2xfUG9zaXRpb24gPSB2ZWM0KDEpOyB9XG4iOworCitzdGF0aWMgY29uc3QgY2hhciBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dFtdID0KKyAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgImxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IHVGcmFnQ29sb3I7XG4iCisgICAgInZvaWQgbWFpbigpe1xuIgorICAgICIgICB1RnJhZ0NvbG9yID0gdmVjNCgwLDEsMCwxKTtcbiIKKyAgICAifVxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgYmluZFN0YXRlRnJhZ1NhbXBsZXJTaGFkZXJUZXh0W10gPQorICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTApIHVuaWZvcm0gc2FtcGxlcjJEIHM7XG4iCisgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAiICAgeCA9IHRleHR1cmUocywgdmVjMigxKSk7XG4iCisgICAgIn1cbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGJpbmRTdGF0ZUZyYWdVbmlmb3JtU2hhZGVyVGV4dFtdID0KKyAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgImxheW91dChzZXQ9MCkgbGF5b3V0KGJpbmRpbmc9MCkgdW5pZm9ybSBmb28geyBpbnQgeDsgaW50IHk7IH0gYmFyO1xuIgorICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgeDtcbiIKKyAgICAidm9pZCBtYWluKCl7XG4iCisgICAgIiAgIHggPSB2ZWM0KGJhci55KTtcbiIKKyAgICAifVxuIjsKKworLy8gU3RhdGljIGFycmF5cyBoZWxwZXIKK3RlbXBsYXRlIDxjbGFzcyBFbGVtZW50VCwgc2l6ZV90IGFycmF5X3NpemU+CitzaXplX3Qgc2l6ZShFbGVtZW50VCAoJilbYXJyYXlfc2l6ZV0pIHsKKyAgICByZXR1cm4gYXJyYXlfc2l6ZTsKK30KKworLy8gRm9ybWF0IHNlYXJjaCBoZWxwZXIKK1ZrRm9ybWF0IEZpbmRTdXBwb3J0ZWREZXB0aE9ubHlGb3JtYXQoVmtQaHlzaWNhbERldmljZSBwaHkpOworVmtGb3JtYXQgRmluZFN1cHBvcnRlZFN0ZW5jaWxPbmx5Rm9ybWF0KFZrUGh5c2ljYWxEZXZpY2UgcGh5KTsKK1ZrRm9ybWF0IEZpbmRTdXBwb3J0ZWREZXB0aFN0ZW5jaWxGb3JtYXQoVmtQaHlzaWNhbERldmljZSBwaHkpOworCisvLyBSZXR1cm5zIHRydWUgaWYgKmFueSogcmVxdWVzdGVkIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUuCisvLyBBc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGZyYW1ld29yayBjYW4gc3VjY2Vzc2Z1bGx5IGNyZWF0ZSBhbiBpbWFnZSBhcworLy8gbG9uZyBhcyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZlYXR1cmUgYml0cyBpcyBwcmVzZW50IChleGNlcHRpbmcgVlRYX0JVRikuCitib29sIEltYWdlRm9ybWF0SXNTdXBwb3J0ZWQoVmtQaHlzaWNhbERldmljZSBwaHksIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVRpbGluZyB0aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdEZlYXR1cmVGbGFncyBmZWF0dXJlcyA9IH5WS19GT1JNQVRfRkVBVFVSRV9WRVJURVhfQlVGRkVSX0JJVCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBmb3JtYXQgYW5kICphbGwqIHJlcXVlc3RlZCBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLgorYm9vbCBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKFZrUGh5c2ljYWxEZXZpY2UgcGh5LCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VUaWxpbmcgdGlsaW5nLCBWa0Zvcm1hdEZlYXR1cmVGbGFncyBmZWF0dXJlcyk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBmb3JtYXQgYW5kICphbGwqIHJlcXVlc3RlZCBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLgorYm9vbCBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGNvbnN0IFZrSW5zdGFuY2UgaW5zdCwgY29uc3QgVmtQaHlzaWNhbERldmljZSBwaHksIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZmVhdHVyZXMpOworCisvLyBWYWxpZGF0aW9uIHJlcG9ydCBjYWxsYmFjayBwcm90b3R5cGUKK1ZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBteURiZ0Z1bmMoVmtGbGFncyBtc2dGbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqVHlwZSwgdWludDY0X3Qgc3JjT2JqZWN0LCBzaXplX3QgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXNnQ29kZSwgY29uc3QgY2hhciAqcExheWVyUHJlZml4LCBjb25zdCBjaGFyICpwTXNnLCB2b2lkICpwVXNlckRhdGEpOworCisvLyBTaW1wbGUgc2FuZSBTYW1wbGVyQ3JlYXRlSW5mbyBib2lsZXJwbGF0ZQorVmtTYW1wbGVyQ3JlYXRlSW5mbyBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisKK1ZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBTYWZlU2FuZUltYWdlVmlld0NyZWF0ZUluZm8oVmtJbWFnZSBpbWFnZSwgVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0X21hc2spOworCitWa0ltYWdlVmlld0NyZWF0ZUluZm8gU2FmZVNhbmVJbWFnZVZpZXdDcmVhdGVJbmZvKGNvbnN0IFZrSW1hZ2VPYmogJmltYWdlLCBWa0Zvcm1hdCBmb3JtYXQsIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RfbWFzayk7CisKKy8vIEhlbHBlciBmb3IgY2hlY2tpbmcgY3JlYXRlUmVuZGVyUGFzczIgc3VwcG9ydCBhbmQgYWRkaW5nIHJlbGF0ZWQgZXh0ZW5zaW9ucy4KK2Jvb2wgQ2hlY2tDcmVhdGVSZW5kZXJQYXNzMlN1cHBvcnQoVmtSZW5kZXJGcmFtZXdvcmsgKnJlbmRlckZyYW1ld29yaywgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiAmZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisKKy8vIEhlbHBlciBmb3IgY2hlY2tpbmcgZGVzY3JpcHRvcl9pbmRleGluZyBzdXBwb3J0IGFuZCBhZGRpbmcgcmVsYXRlZCBleHRlbnNpb25zLgorYm9vbCBDaGVja0Rlc2NyaXB0b3JJbmRleGluZ1N1cHBvcnRBbmRJbml0RnJhbWV3b3JrKFZrUmVuZGVyRnJhbWV3b3JrICpyZW5kZXJGcmFtZXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiAmaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJmRldmljZV9leHRlbnNpb25fbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgKmZlYXR1cmVzLCB2b2lkICp1c2VyRGF0YSk7CisKKy8vIERlcGVuZGVudCAiZmFsc2UiIHR5cGUgZm9yIHRoZSBzdGF0aWMgYXNzZXJ0LCBhcyBHQ0Mgd2lsbCBldmFsdWF0ZQorLy8gbm9uLWRlcGVuZGVudCBzdGF0aWNfYXNzZXJ0cyBldmVuIGZvciBub24taW5zdGFudGlhdGVkIHRlbXBsYXRlcwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWx3YXlzRmFsc2UgOiBzdGQ6OmZhbHNlX3R5cGUge307CisKKy8vIEhlbHBlcnMgdG8gZ2V0IG5lYXJlc3QgZ3JlYXRlciBvciBzbWFsbGVyIHZhbHVlIChvZiBmbG9hdCkgLS0gdXNlZnVsIGZvciB0ZXN0aW5nIHRoZSBib3VuZGFyeSBjYXNlcyBvZiBWdWxrYW4gbGltaXRzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgTmVhcmVzdEdyZWF0ZXIoY29uc3QgVCBmcm9tKSB7CisgICAgdXNpbmcgTGltID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjsKKyAgICBjb25zdCBhdXRvIHBvc2l0aXZlX2RpcmVjdGlvbiA9IExpbTo6aGFzX2luZmluaXR5ID8gTGltOjppbmZpbml0eSgpIDogTGltOjptYXgoKTsKKworICAgIHJldHVybiBzdGQ6Om5leHRhZnRlcihmcm9tLCBwb3NpdGl2ZV9kaXJlY3Rpb24pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgTmVhcmVzdFNtYWxsZXIoY29uc3QgVCBmcm9tKSB7CisgICAgdXNpbmcgTGltID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjsKKyAgICBjb25zdCBhdXRvIG5lZ2F0aXZlX2RpcmVjdGlvbiA9IExpbTo6aGFzX2luZmluaXR5ID8gLUxpbTo6aW5maW5pdHkoKSA6IExpbTo6bG93ZXN0KCk7CisKKyAgICByZXR1cm4gc3RkOjpuZXh0YWZ0ZXIoZnJvbSwgbmVnYXRpdmVfZGlyZWN0aW9uKTsKK30KKworY2xhc3MgVmtMYXllclRlc3QgOiBwdWJsaWMgVmtSZW5kZXJGcmFtZXdvcmsgeworICBwdWJsaWM6CisgICAgdm9pZCBWS1RyaWFuZ2xlVGVzdChCc29GYWlsU2VsZWN0IGZhaWxDYXNlKTsKKworICAgIHZvaWQgR2VuZXJpY0RyYXdQcmVwYXJhdGlvbihWa0NvbW1hbmRCdWZmZXJPYmogKmNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVPYmogJnBpcGVsaW5lb2JqLCBWa0Rlc2NyaXB0b3JTZXRPYmogJmRlc2NyaXB0b3JTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzb0ZhaWxTZWxlY3QgZmFpbENhc2UpOworCisgICAgdm9pZCBJbml0KFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAqZmVhdHVyZXMgPSBudWxscHRyLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyICpmZWF0dXJlczIgPSBudWxscHRyLAorICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgZmxhZ3MgPSAwLCB2b2lkICppbnN0YW5jZV9wbmV4dCA9IG51bGxwdHIpOworICAgIGJvb2wgQWRkU3VyZmFjZUluc3RhbmNlRXh0ZW5zaW9uKCk7CisgICAgYm9vbCBBZGRTd2FwY2hhaW5EZXZpY2VFeHRlbnNpb24oKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogKkNvbW1hbmRCdWZmZXIoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdWludDMyX3QgbV9pbnN0YW5jZV9hcGlfdmVyc2lvbiA9IDA7CisgICAgdWludDMyX3QgbV90YXJnZXRfYXBpX3ZlcnNpb24gPSAwOworICAgIGJvb2wgbV9lbmFibGVXU0k7CisKKyAgICB1aW50MzJfdCBTZXRUYXJnZXRBcGlWZXJzaW9uKHVpbnQzMl90IHRhcmdldF9hcGlfdmVyc2lvbik7CisgICAgdWludDMyX3QgRGV2aWNlVmFsaWRhdGlvblZlcnNpb24oKTsKKyAgICBib29sIExvYWREZXZpY2VQcm9maWxlTGF5ZXIoCisgICAgICAgIFBGTl92a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCAmZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCwKKyAgICAgICAgUEZOX3ZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgJmZwdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCk7CisKKyAgICBWa0xheWVyVGVzdCgpOworfTsKKworY2xhc3MgVmtQb3NpdGl2ZUxheWVyVGVzdCA6IHB1YmxpYyBWa0xheWVyVGVzdCB7CisgIHB1YmxpYzoKKyAgcHJvdGVjdGVkOgorfTsKKworY2xhc3MgVmtCZXN0UHJhY3RpY2VzTGF5ZXJUZXN0IDogcHVibGljIFZrTGF5ZXJUZXN0IHsKKyAgcHVibGljOgorICAgIHZvaWQgSW5pdEJlc3RQcmFjdGljZXNGcmFtZXdvcmsoKTsKKworICBwcm90ZWN0ZWQ6Cit9OworCitjbGFzcyBWa1dzaUVuYWJsZWRMYXllclRlc3QgOiBwdWJsaWMgVmtMYXllclRlc3QgeworICBwdWJsaWM6CisgIHByb3RlY3RlZDoKKyAgICBWa1dzaUVuYWJsZWRMYXllclRlc3QoKSB7IG1fZW5hYmxlV1NJID0gdHJ1ZTsgfQorfTsKKworY2xhc3MgVmtCdWZmZXJUZXN0IHsKKyAgcHVibGljOgorICAgIGVudW0gZVRlc3RFbkZsYWdzIHsKKyAgICAgICAgZURvdWJsZURlbGV0ZSwKKyAgICAgICAgZUludmFsaWREZXZpY2VPZmZzZXQsCisgICAgICAgIGVJbnZhbGlkTWVtb3J5T2Zmc2V0LAorICAgICAgICBlQmluZE51bGxCdWZmZXIsCisgICAgICAgIGVCaW5kRmFrZUJ1ZmZlciwKKyAgICAgICAgZUZyZWVJbnZhbGlkSGFuZGxlLAorICAgICAgICBlTm9uZSwKKyAgICB9OworCisgICAgZW51bSBlVGVzdENvbmRpdGlvbnMgeyBlT2Zmc2V0QWxpZ25tZW50ID0gMSB9OworCisgICAgc3RhdGljIGJvb2wgR2V0VGVzdENvbmRpdGlvblZhbGlkKFZrRGV2aWNlT2JqICphVnVsa2FuRGV2aWNlLCBlVGVzdEVuRmxhZ3MgYVRlc3RGbGFnLCBWa0J1ZmZlclVzYWdlRmxhZ3MgYUJ1ZmZlclVzYWdlID0gMCk7CisgICAgLy8gQSBjb25zdHJ1Y3RvciB3aGljaCBwZXJmb3JtcyB2YWxpZGF0aW9uIHRlc3RzIHdpdGhpbiBjb25zdHJ1Y3Rpb24uCisgICAgVmtCdWZmZXJUZXN0KFZrRGV2aWNlT2JqICphVnVsa2FuRGV2aWNlLCBWa0J1ZmZlclVzYWdlRmxhZ3MgYUJ1ZmZlclVzYWdlLCBlVGVzdEVuRmxhZ3MgYVRlc3RGbGFnID0gZU5vbmUpOworICAgIH5Wa0J1ZmZlclRlc3QoKTsKKyAgICBib29sIEdldEJ1ZmZlckN1cnJlbnQoKTsKKyAgICBjb25zdCBWa0J1ZmZlciAmR2V0QnVmZmVyKCk7CisgICAgdm9pZCBUZXN0RG91YmxlRGVzdHJveSgpOworCisgIHByb3RlY3RlZDoKKyAgICBib29sIEFsbG9jYXRlQ3VycmVudDsKKyAgICBib29sIEJvdW5kQ3VycmVudDsKKyAgICBib29sIENyZWF0ZUN1cnJlbnQ7CisgICAgYm9vbCBJbnZhbGlkRGVsZXRlRW47CisKKyAgICBWa0J1ZmZlciBWdWxrYW5CdWZmZXI7CisgICAgVmtEZXZpY2UgVnVsa2FuRGV2aWNlOworICAgIFZrRGV2aWNlTWVtb3J5IFZ1bGthbk1lbW9yeTsKK307CisKK3N0cnVjdCBDcmVhdGVQaXBlbGluZUhlbHBlcjsKK2NsYXNzIFZrVmVydGljZXNPYmogeworICBwdWJsaWM6CisgICAgVmtWZXJ0aWNlc09iaihWa0RldmljZU9iaiAqYVZ1bGthbkRldmljZSwgdW5zaWduZWQgYUF0dHJpYnV0ZUNvdW50LCB1bnNpZ25lZCBhQmluZGluZ0NvdW50LCB1bnNpZ25lZCBhQnl0ZVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBhVmVydGV4Q291bnQsIGNvbnN0IGZsb2F0ICphVmVydGljaWVzKTsKKyAgICB+VmtWZXJ0aWNlc09iaigpOworICAgIGJvb2wgQWRkVmVydGV4SW5wdXRUb1BpcGUoVmtQaXBlbGluZU9iaiAmYVBpcGVsaW5lT2JqKTsKKyAgICBib29sIEFkZFZlcnRleElucHV0VG9QaXBlSGVscHIoQ3JlYXRlUGlwZWxpbmVIZWxwZXIgKnBpcGVsaW5lSGVscGVyKTsKKyAgICB2b2lkIEJpbmRWZXJ0ZXhCdWZmZXJzKFZrQ29tbWFuZEJ1ZmZlciBhQ29tbWFuZEJ1ZmZlciwgdW5zaWduZWQgYU9mZnNldENvdW50ID0gMCwgVmtEZXZpY2VTaXplICphT2Zmc2V0TGlzdCA9IG51bGxwdHIpOworCisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdWludDMyX3QgQmluZElkR2VuZXJhdG9yOworCisgICAgYm9vbCBCb3VuZEN1cnJlbnQ7CisgICAgdW5zaWduZWQgQXR0cmlidXRlQ291bnQ7CisgICAgdW5zaWduZWQgQmluZGluZ0NvdW50OworICAgIHVpbnQzMl90IEJpbmRJZDsKKworICAgIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvOworICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiAqVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbjsKKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uICpWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbjsKKyAgICBWa0NvbnN0YW50QnVmZmVyT2JqIFZ1bGthbk1lbW9yeUJ1ZmZlcjsKK307CisKK3N0cnVjdCBPbmVPZmZEZXNjcmlwdG9yU2V0IHsKKyAgICBWa0RldmljZU9iaiAqZGV2aWNlXzsKKyAgICBWa0Rlc2NyaXB0b3JQb29sIHBvb2xfOworICAgIFZrRGVzY3JpcHRvclNldExheW91dE9iaiBsYXlvdXRfOworICAgIFZrRGVzY3JpcHRvclNldCBzZXRfOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZz4gQmluZGluZ3M7CisgICAgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yQnVmZmVySW5mbz4gYnVmZmVyX2luZm9zOworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvckltYWdlSW5mbz4gaW1hZ2VfaW5mb3M7CisgICAgc3RkOjp2ZWN0b3I8VmtXcml0ZURlc2NyaXB0b3JTZXQ+IGRlc2NyaXB0b3Jfd3JpdGVzOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldChWa0RldmljZU9iaiAqZGV2aWNlLCBjb25zdCBCaW5kaW5ncyAmYmluZGluZ3MsIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzIGxheW91dF9mbGFncyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsYXlvdXRfcG5leHQgPSBOVUxMLCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ3MgcG9vbEZsYWdzID0gMCwgdm9pZCAqYWxsb2NhdGVfcG5leHQgPSBOVUxMKTsKKyAgICB+T25lT2ZmRGVzY3JpcHRvclNldCgpOworICAgIGJvb2wgSW5pdGlhbGl6ZWQoKTsKKyAgICB2b2lkIFdyaXRlRGVzY3JpcHRvckJ1ZmZlckluZm8oaW50IGJpbmRpbmcsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIpOworICAgIHZvaWQgV3JpdGVEZXNjcmlwdG9yQnVmZmVyVmlldyhpbnQgYmluZGluZywgVmtCdWZmZXJWaWV3ICZidWZmZXJfdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUik7CisgICAgdm9pZCBXcml0ZURlc2NyaXB0b3JJbWFnZUluZm8oaW50IGJpbmRpbmcsIFZrSW1hZ2VWaWV3IGltYWdlX3ZpZXcsIFZrU2FtcGxlciBzYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUik7CisgICAgdm9pZCBVcGRhdGVEZXNjcmlwdG9yU2V0cygpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIElzVmFsaWRWa1N0cnVjdChjb25zdCBUICZzKSB7CisgICAgcmV0dXJuIEx2bFR5cGVNYXA8VD46OmtTVHlwZSA9PSBzLnNUeXBlOworfQorCisvLyBIZWxwZXIgY2xhc3MgZm9yIHRlcnNlbHkgY3JlYXRpbmcgY3JlYXRlIHBpcGVsaW5lIHRlc3RzCisvLworLy8gRGVzaWduZWQgd2l0aCBtaW5pbWFsIGVycm9yIGNoZWNraW5nIHRvIGVuc3VyZSBlYXN5IGVycm9yIHN0YXRlIGNyZWF0aW9uCisvLyBTZWUgT25lc2hvdFRlc3QgZm9yIHR5cGljYWwgdXNhZ2UKK3N0cnVjdCBDcmVhdGVQaXBlbGluZUhlbHBlciB7CisgIHB1YmxpYzoKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiBkc2xfYmluZGluZ3NfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxPbmVPZmZEZXNjcmlwdG9yU2V0PiBkZXNjcmlwdG9yX3NldF87CisgICAgc3RkOjp2ZWN0b3I8VmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbz4gc2hhZGVyX3N0YWdlc187CisgICAgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvIHZpX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlhX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gdGVzc19jaV8gPSB7fTsKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0XyA9IHt9OworICAgIFZrUmVjdDJEIHNjaXNzb3JfID0ge307CisgICAgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvIHZwX3N0YXRlX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyBwaXBlX21zX3N0YXRlX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHBpcGVsaW5lX2xheW91dF9jaV8gPSB7fTsKKyAgICBWa1BpcGVsaW5lTGF5b3V0T2JqIHBpcGVsaW5lX2xheW91dF87CisgICAgVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gZHluX3N0YXRlX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIHJzX3N0YXRlX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCBsaW5lX3N0YXRlX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlIGNiX2F0dGFjaG1lbnRzXyA9IHt9OworICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIGNiX2NpXyA9IHt9OworICAgIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gZ3BfY2lfID0ge307CisgICAgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBwY19jaV8gPSB7fTsKKyAgICBWa1BpcGVsaW5lIHBpcGVsaW5lXyA9IFZLX05VTExfSEFORExFOworICAgIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZV9jYWNoZV8gPSBWS19OVUxMX0hBTkRMRTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtTaGFkZXJPYmo+IHZzXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtTaGFkZXJPYmo+IGZzXzsKKyAgICBWa0xheWVyVGVzdCAmbGF5ZXJfdGVzdF87CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIoVmtMYXllclRlc3QgJnRlc3QpOworICAgIH5DcmVhdGVQaXBlbGluZUhlbHBlcigpOworCisgICAgdm9pZCBJbml0RGVzY3JpcHRvclNldEluZm8oKTsKKyAgICB2b2lkIEluaXRJbnB1dEFuZFZlcnRleEluZm8oKTsKKyAgICB2b2lkIEluaXRNdWx0aXNhbXBsZUluZm8oKTsKKyAgICB2b2lkIEluaXRQaXBlbGluZUxheW91dEluZm8oKTsKKyAgICB2b2lkIEluaXRWaWV3cG9ydEluZm8oKTsKKyAgICB2b2lkIEluaXREeW5hbWljU3RhdGVJbmZvKCk7CisgICAgdm9pZCBJbml0U2hhZGVySW5mbygpOworICAgIHZvaWQgSW5pdFJhc3Rlcml6YXRpb25JbmZvKCk7CisgICAgdm9pZCBJbml0TGluZVJhc3Rlcml6YXRpb25JbmZvKCk7CisgICAgdm9pZCBJbml0QmxlbmRTdGF0ZUluZm8oKTsKKyAgICB2b2lkIEluaXRHcmFwaGljc1BpcGVsaW5lSW5mbygpOworICAgIHZvaWQgSW5pdFBpcGVsaW5lQ2FjaGVJbmZvKCk7CisKKyAgICAvLyBOb3QgY2FsbGVkIGJ5IGRlZmF1bHQgZHVyaW5nIGluaXRfaW5mbworICAgIHZvaWQgSW5pdFRlc3NlbGF0aW9uU3RhdGUoKTsKKworICAgIC8vIFREQiAtLSBhZGQgY29udHJvbCBmb3Igb3B0aW9uYWwgYW5kL29yIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24KKyAgICB2b2lkIEluaXRJbmZvKCk7CisgICAgdm9pZCBJbml0U3RhdGUoKTsKKyAgICB2b2lkIExhdGVCaW5kUGlwZWxpbmVJbmZvKCk7CisgICAgVmtSZXN1bHQgQ3JlYXRlR3JhcGhpY3NQaXBlbGluZShib29sIGltcGxpY2l0X2Rlc3Ryb3kgPSB0cnVlLCBib29sIGRvX2xhdGVfYmluZCA9IHRydWUpOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHNpbXBsZSB0ZXN0IGNhc2UgKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKQorICAgIC8vCisgICAgLy8gaW5mb19vdmVycmlkZSBjYW4gYmUgYW55IGNhbGxhYmxlIHRoYXQgdGFrZXMgYSBDcmVhdGVQaXBlbGluZUhlcGVyICYKKyAgICAvLyBmbGFncywgZXJyb3IgY2FuIGJlIGFueSBhcmdzIGFjY2VwdGVkIGJ5ICJTZXREZXNpcmVkRmFpbHVyZSIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRlc3QsIHR5cGVuYW1lIE92ZXJyaWRlRnVuYywgdHlwZW5hbWUgRXJyb3I+CisgICAgc3RhdGljIHZvaWQgT25lc2hvdFRlc3QoVGVzdCAmdGVzdCwgY29uc3QgT3ZlcnJpZGVGdW5jICZpbmZvX292ZXJyaWRlLCBjb25zdCBWa0ZsYWdzIGZsYWdzLCBjb25zdCBzdGQ6OnZlY3RvcjxFcnJvcj4gJmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvc2l0aXZlX3Rlc3QgPSBmYWxzZSkgeworICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBoZWxwZXIodGVzdCk7CisgICAgICAgIGhlbHBlci5Jbml0SW5mbygpOworICAgICAgICBpbmZvX292ZXJyaWRlKGhlbHBlcik7CisgICAgICAgIGhlbHBlci5Jbml0U3RhdGUoKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmVycm9yIDogZXJyb3JzKSB0ZXN0Lk1vbml0b3IoKS0+U2V0RGVzaXJlZEZhaWx1cmVNc2coZmxhZ3MsIGVycm9yKTsKKyAgICAgICAgaGVscGVyLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKworICAgICAgICBpZiAocG9zaXRpdmVfdGVzdCkgeworICAgICAgICAgICAgdGVzdC5Nb25pdG9yKCktPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUZXN0LCB0eXBlbmFtZSBPdmVycmlkZUZ1bmMsIHR5cGVuYW1lIEVycm9yPgorICAgIHN0YXRpYyB2b2lkIE9uZXNob3RUZXN0KFRlc3QgJnRlc3QsIGNvbnN0IE92ZXJyaWRlRnVuYyAmaW5mb19vdmVycmlkZSwgY29uc3QgVmtGbGFncyBmbGFncywgRXJyb3IgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb3NpdGl2ZV90ZXN0ID0gZmFsc2UpIHsKKyAgICAgICAgT25lc2hvdFRlc3QodGVzdCwgaW5mb19vdmVycmlkZSwgZmxhZ3MsIHN0ZDo6dmVjdG9yPEVycm9yPigxLCBlcnJvciksIHBvc2l0aXZlX3Rlc3QpOworICAgIH0KK307CisKK3N0cnVjdCBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXIgeworICBwdWJsaWM6CisgICAgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZz4gZHNsX2JpbmRpbmdzXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8T25lT2ZmRGVzY3JpcHRvclNldD4gZGVzY3JpcHRvcl9zZXRfOworICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHBpcGVsaW5lX2xheW91dF9jaV8gPSB7fTsKKyAgICBWa1BpcGVsaW5lTGF5b3V0T2JqIHBpcGVsaW5lX2xheW91dF87CisgICAgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvIGNwX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gcGNfY2lfID0ge307CisgICAgVmtQaXBlbGluZSBwaXBlbGluZV8gPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVfY2FjaGVfID0gVktfTlVMTF9IQU5ETEU7CisgICAgc3RkOjp1bmlxdWVfcHRyPFZrU2hhZGVyT2JqPiBjc187CisgICAgVmtMYXllclRlc3QgJmxheWVyX3Rlc3RfOworICAgIENyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlcihWa0xheWVyVGVzdCAmdGVzdCk7CisgICAgfkNyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlcigpOworCisgICAgdm9pZCBJbml0RGVzY3JpcHRvclNldEluZm8oKTsKKyAgICB2b2lkIEluaXRQaXBlbGluZUxheW91dEluZm8oKTsKKyAgICB2b2lkIEluaXRTaGFkZXJJbmZvKCk7CisgICAgdm9pZCBJbml0Q29tcHV0ZVBpcGVsaW5lSW5mbygpOworICAgIHZvaWQgSW5pdFBpcGVsaW5lQ2FjaGVJbmZvKCk7CisKKyAgICAvLyBUREIgLS0gYWRkIGNvbnRyb2wgZm9yIG9wdGlvbmFsIGFuZC9vciBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uCisgICAgdm9pZCBJbml0SW5mbygpOworICAgIHZvaWQgSW5pdFN0YXRlKCk7CisgICAgdm9pZCBMYXRlQmluZFBpcGVsaW5lSW5mbygpOworICAgIFZrUmVzdWx0IENyZWF0ZUNvbXB1dGVQaXBlbGluZShib29sIGltcGxpY2l0X2Rlc3Ryb3kgPSB0cnVlLCBib29sIGRvX2xhdGVfYmluZCA9IHRydWUpOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHNpbXBsZSB0ZXN0IGNhc2UgKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKQorICAgIC8vCisgICAgLy8gaW5mb19vdmVycmlkZSBjYW4gYmUgYW55IGNhbGxhYmxlIHRoYXQgdGFrZXMgYSBDcmVhdGVQaXBlbGluZUhlcGVyICYKKyAgICAvLyBmbGFncywgZXJyb3IgY2FuIGJlIGFueSBhcmdzIGFjY2VwdGVkIGJ5ICJTZXREZXNpcmVkRmFpbHVyZSIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRlc3QsIHR5cGVuYW1lIE92ZXJyaWRlRnVuYywgdHlwZW5hbWUgRXJyb3I+CisgICAgc3RhdGljIHZvaWQgT25lc2hvdFRlc3QoVGVzdCAmdGVzdCwgY29uc3QgT3ZlcnJpZGVGdW5jICZpbmZvX292ZXJyaWRlLCBjb25zdCBWa0ZsYWdzIGZsYWdzLCBjb25zdCBzdGQ6OnZlY3RvcjxFcnJvcj4gJmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvc2l0aXZlX3Rlc3QgPSBmYWxzZSkgeworICAgICAgICBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXIgaGVscGVyKHRlc3QpOworICAgICAgICBoZWxwZXIuSW5pdEluZm8oKTsKKyAgICAgICAgaW5mb19vdmVycmlkZShoZWxwZXIpOworICAgICAgICBoZWxwZXIuSW5pdFN0YXRlKCk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZlcnJvciA6IGVycm9ycykgdGVzdC5Nb25pdG9yKCktPlNldERlc2lyZWRGYWlsdXJlTXNnKGZsYWdzLCBlcnJvcik7CisgICAgICAgIGhlbHBlci5DcmVhdGVDb21wdXRlUGlwZWxpbmUoKTsKKworICAgICAgICBpZiAocG9zaXRpdmVfdGVzdCkgeworICAgICAgICAgICAgdGVzdC5Nb25pdG9yKCktPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUZXN0LCB0eXBlbmFtZSBPdmVycmlkZUZ1bmMsIHR5cGVuYW1lIEVycm9yPgorICAgIHN0YXRpYyB2b2lkIE9uZXNob3RUZXN0KFRlc3QgJnRlc3QsIGNvbnN0IE92ZXJyaWRlRnVuYyAmaW5mb19vdmVycmlkZSwgY29uc3QgVmtGbGFncyBmbGFncywgRXJyb3IgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb3NpdGl2ZV90ZXN0ID0gZmFsc2UpIHsKKyAgICAgICAgT25lc2hvdFRlc3QodGVzdCwgaW5mb19vdmVycmlkZSwgZmxhZ3MsIHN0ZDo6dmVjdG9yPEVycm9yPigxLCBlcnJvciksIHBvc2l0aXZlX3Rlc3QpOworICAgIH0KK307CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgdGVyc2VseSBjcmVhdGluZyBjcmVhdGUgcmF5IHRyYWNpbmcgcGlwZWxpbmUgdGVzdHMKKy8vCisvLyBEZXNpZ25lZCB3aXRoIG1pbmltYWwgZXJyb3IgY2hlY2tpbmcgdG8gZW5zdXJlIGVhc3kgZXJyb3Igc3RhdGUgY3JlYXRpb24KKy8vIFNlZSBPbmVzaG90VGVzdCBmb3IgdHlwaWNhbCB1c2FnZQorc3RydWN0IENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyIHsKKyAgcHVibGljOgorICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc+IGRzbF9iaW5kaW5nc187CisgICAgc3RkOjp1bmlxdWVfcHRyPE9uZU9mZkRlc2NyaXB0b3JTZXQ+IGRlc2NyaXB0b3Jfc2V0XzsKKyAgICBzdGQ6OnZlY3RvcjxWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvPiBzaGFkZXJfc3RhZ2VzXzsKKyAgICBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBwaXBlbGluZV9sYXlvdXRfY2lfID0ge307CisgICAgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXRfOworICAgIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIHJwX2NpXyA9IHt9OworICAgIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gcGNfY2lfID0ge307CisgICAgVmtQaXBlbGluZSBwaXBlbGluZV8gPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVfY2FjaGVfID0gVktfTlVMTF9IQU5ETEU7CisgICAgc3RkOjp2ZWN0b3I8VmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlY+IGdyb3Vwc187CisgICAgc3RkOjp1bmlxdWVfcHRyPFZrU2hhZGVyT2JqPiByZ3NfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1NoYWRlck9iaj4gY2hzXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtTaGFkZXJPYmo+IG1pc187CisgICAgVmtMYXllclRlc3QgJmxheWVyX3Rlc3RfOworICAgIENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyKFZrTGF5ZXJUZXN0ICZ0ZXN0KTsKKyAgICB+Q3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXIoKTsKKworICAgIHN0YXRpYyBib29sIEluaXRJbnN0YW5jZUV4dGVuc2lvbnMoVmtMYXllclRlc3QgJnRlc3QsIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJmluc3RhbmNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgc3RhdGljIGJvb2wgSW5pdERldmljZUV4dGVuc2lvbnMoVmtMYXllclRlc3QgJnRlc3QsIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJmRldmljZV9leHRlbnNpb25fbmFtZXMpOworICAgIHZvaWQgSW5pdFNoYWRlckdyb3VwcygpOworICAgIHZvaWQgSW5pdERlc2NyaXB0b3JTZXRJbmZvKCk7CisgICAgdm9pZCBJbml0UGlwZWxpbmVMYXlvdXRJbmZvKCk7CisgICAgdm9pZCBJbml0U2hhZGVySW5mbygpOworICAgIHZvaWQgSW5pdE5WUmF5VHJhY2luZ1BpcGVsaW5lSW5mbygpOworICAgIHZvaWQgSW5pdFBpcGVsaW5lQ2FjaGVJbmZvKCk7CisgICAgdm9pZCBJbml0SW5mbygpOworICAgIHZvaWQgSW5pdFN0YXRlKCk7CisgICAgdm9pZCBMYXRlQmluZFBpcGVsaW5lSW5mbygpOworICAgIFZrUmVzdWx0IENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lKGJvb2wgaW1wbGljaXRfZGVzdHJveSA9IHRydWUsIGJvb2wgZG9fbGF0ZV9iaW5kID0gdHJ1ZSk7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgc2ltcGxlIHRlc3QgY2FzZSAocG9zaXRpdmUgb3IgbmVnYXRpdmUpCisgICAgLy8KKyAgICAvLyBpbmZvX292ZXJyaWRlIGNhbiBiZSBhbnkgY2FsbGFibGUgdGhhdCB0YWtlcyBhIENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyICYKKyAgICAvLyBmbGFncywgZXJyb3IgY2FuIGJlIGFueSBhcmdzIGFjY2VwdGVkIGJ5ICJTZXREZXNpcmVkRmFpbHVyZSIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRlc3QsIHR5cGVuYW1lIE92ZXJyaWRlRnVuYywgdHlwZW5hbWUgRXJyb3I+CisgICAgc3RhdGljIHZvaWQgT25lc2hvdFRlc3QoVGVzdCAmdGVzdCwgY29uc3QgT3ZlcnJpZGVGdW5jICZpbmZvX292ZXJyaWRlLCBjb25zdCBzdGQ6OnZlY3RvcjxFcnJvcj4gJmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ZsYWdzIGZsYWdzID0gVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQpIHsKKyAgICAgICAgQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXIgaGVscGVyKHRlc3QpOworICAgICAgICBoZWxwZXIuSW5pdEluZm8oKTsKKyAgICAgICAgaW5mb19vdmVycmlkZShoZWxwZXIpOworICAgICAgICBoZWxwZXIuSW5pdFN0YXRlKCk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZlcnJvciA6IGVycm9ycykgdGVzdC5Nb25pdG9yKCktPlNldERlc2lyZWRGYWlsdXJlTXNnKGZsYWdzLCBlcnJvcik7CisgICAgICAgIGhlbHBlci5DcmVhdGVOVlJheVRyYWNpbmdQaXBlbGluZSgpOworICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVzdCwgdHlwZW5hbWUgT3ZlcnJpZGVGdW5jLCB0eXBlbmFtZSBFcnJvcj4KKyAgICBzdGF0aWMgdm9pZCBPbmVzaG90VGVzdChUZXN0ICZ0ZXN0LCBjb25zdCBPdmVycmlkZUZ1bmMgJmluZm9fb3ZlcnJpZGUsIEVycm9yIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRmxhZ3MgZmxhZ3MgPSBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCkgeworICAgICAgICBPbmVzaG90VGVzdCh0ZXN0LCBpbmZvX292ZXJyaWRlLCBzdGQ6OnZlY3RvcjxFcnJvcj4oMSwgZXJyb3IpLCBmbGFncyk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRlc3QsIHR5cGVuYW1lIE92ZXJyaWRlRnVuYz4KKyAgICBzdGF0aWMgdm9pZCBPbmVzaG90UG9zaXRpdmVUZXN0KFRlc3QgJnRlc3QsIGNvbnN0IE92ZXJyaWRlRnVuYyAmaW5mb19vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVidWdSZXBvcnRGbGFnc0VYVCBtZXNzYWdlX2ZsYWdfbWFzayA9IFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUKSB7CisgICAgICAgIENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyIGhlbHBlcih0ZXN0KTsKKyAgICAgICAgaGVscGVyLkluaXRJbmZvKCk7CisgICAgICAgIGluZm9fb3ZlcnJpZGUoaGVscGVyKTsKKyAgICAgICAgaGVscGVyLkluaXRTdGF0ZSgpOworCisgICAgICAgIHRlc3QuTW9uaXRvcigpLT5FeHBlY3RTdWNjZXNzKG1lc3NhZ2VfZmxhZ19tYXNrKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoaGVscGVyLkNyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lKCkpOworICAgICAgICB0ZXN0Lk1vbml0b3IoKS0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICB9Cit9OworCituYW1lc3BhY2UgY2hhaW5fdXRpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgSW5pdChjb25zdCB2b2lkICpwbmV4dF9pbiA9IG51bGxwdHIpIHsKKyAgICBUIHBuZXh0X29iaiA9IHt9OworICAgIHBuZXh0X29iai5zVHlwZSA9IEx2bFR5cGVNYXA8VD46OmtTVHlwZTsKKyAgICBwbmV4dF9vYmoucE5leHQgPSBwbmV4dF9pbjsKKyAgICByZXR1cm4gcG5leHRfb2JqOworfQorCitjbGFzcyBFeHRlbnNpb25DaGFpbiB7CisgICAgY29uc3Qgdm9pZCAqaGVhZF8gPSBudWxscHRyOworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IGNoYXIgKik+IEFkZElmRnVuY3Rpb247CisgICAgQWRkSWZGdW5jdGlvbiBhZGRfaWZfOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBMaXN0OworICAgIExpc3QgKmxpc3RfOworCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgICBFeHRlbnNpb25DaGFpbihGICZhZGRfaWYsIExpc3QgKmxpc3QpIDogYWRkX2lmXyhhZGRfaWYpLCBsaXN0XyhsaXN0KSB7fQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBBZGQoY29uc3QgY2hhciAqbmFtZSwgVCAmb2JqKSB7CisgICAgICAgIGlmIChhZGRfaWZfKG5hbWUpKSB7CisgICAgICAgICAgICBpZiAobGlzdF8pIHsKKyAgICAgICAgICAgICAgICBsaXN0Xy0+cHVzaF9iYWNrKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqLnBOZXh0ID0gaGVhZF87CisgICAgICAgICAgICBoZWFkXyA9ICZvYmo7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCB2b2lkICpIZWFkKCkgY29uc3Q7Cit9OworfSAgLy8gbmFtZXNwYWNlIGNoYWluX3V0aWwKKworLy8gUHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzIGhlbHBlcgorVmtQaHlzaWNhbERldmljZVB1c2hEZXNjcmlwdG9yUHJvcGVydGllc0tIUiBHZXRQdXNoRGVzY3JpcHRvclByb3BlcnRpZXMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtQaHlzaWNhbERldmljZSBncHUpOworCisvLyBTdWJncm91cCBwcm9wZXJ0aWVzIGhlbHBlcgorVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyBHZXRTdWJncm91cFByb3BlcnRpZXMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtQaHlzaWNhbERldmljZSBncHUpOworCitjbGFzcyBCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyIHsKKyAgcHVibGljOgorICAgIHN0cnVjdCBRdWV1ZUZhbWlseU9ianMgeworICAgICAgICB1aW50MzJfdCBpbmRleDsKKyAgICAgICAgLy8gV2Ugd291bGQgdXNlIHN0ZDo6dW5pcXVlX3B0ciwgYnV0IHRoaXMgdHJpZ2dlcnMgYSBjb21waWxlciBlcnJvciBvbiBvbGRlciBjb21waWxlcnMKKyAgICAgICAgVmtRdWV1ZU9iaiAqcXVldWUgPSBudWxscHRyOworICAgICAgICBWa0NvbW1hbmRQb29sT2JqICpjb21tYW5kX3Bvb2wgPSBudWxscHRyOworICAgICAgICBWa0NvbW1hbmRCdWZmZXJPYmogKmNvbW1hbmRfYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyT2JqICpjb21tYW5kX2J1ZmZlcjIgPSBudWxscHRyOworICAgICAgICB+UXVldWVGYW1pbHlPYmpzKCk7CisgICAgICAgIHZvaWQgSW5pdChWa0RldmljZU9iaiAqZGV2aWNlLCB1aW50MzJfdCBxZl9pbmRleCwgVmtRdWV1ZSBxZl9xdWV1ZSwgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIGNwX2ZsYWdzKTsKKyAgICB9OworCisgICAgc3RydWN0IENvbnRleHQgeworICAgICAgICBWa0xheWVyVGVzdCAqbGF5ZXJfdGVzdDsKKyAgICAgICAgdWludDMyX3QgZGVmYXVsdF9pbmRleDsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBRdWV1ZUZhbWlseU9ianM+IHF1ZXVlX2ZhbWlsaWVzOworICAgICAgICBDb250ZXh0KFZrTGF5ZXJUZXN0ICp0ZXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gJnF1ZXVlX2ZhbWlseV9pbmRpY2VzKTsKKyAgICAgICAgdm9pZCBSZXNldCgpOworICAgIH07CisKKyAgICBCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyKENvbnRleHQgKmNvbnRleHQpOworICAgIC8vIEluaXQgd2l0aCBxdWV1ZSBmYW1pbGllcyBub24tbnVsbCBmb3IgQ09OQ1VSUkVOVCBzaGFyaW5nIG1vZGUgKHdoaWNoIHJlcXVpcmVzIHRoZW0pCisgICAgdm9pZCBJbml0KHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqZmFtaWxpZXMsIGJvb2wgaW1hZ2VfbWVtb3J5ID0gdHJ1ZSwgYm9vbCBidWZmZXJfbWVtb3J5ID0gdHJ1ZSk7CisKKyAgICBRdWV1ZUZhbWlseU9ianMgKkdldFF1ZXVlRmFtaWx5SW5mbyhDb250ZXh0ICpjb250ZXh0LCB1aW50MzJfdCBxZmkpOworCisgICAgZW51bSBNb2RpZmllciB7CisgICAgICAgIE5PTkUsCisgICAgICAgIERPVUJMRV9SRUNPUkQsCisgICAgICAgIERPVUJMRV9DT01NQU5EX0JVRkZFUiwKKyAgICB9OworCisgICAgdm9pZCBvcGVyYXRvcigpKHN0ZDo6c3RyaW5nIGltZ19lcnIsIHN0ZDo6c3RyaW5nIGJ1Zl9lcnIgPSAiIiwgdWludDMyX3Qgc3JjID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELCBib29sIHBvc2l0aXZlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleCA9IGtJbnZhbGlkUXVldWVGYW1pbHksIE1vZGlmaWVyIG1vZCA9IE1vZGlmaWVyOjpOT05FKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSW52YWxpZFF1ZXVlRmFtaWx5ID0gVUlOVDMyX01BWDsKKyAgICBDb250ZXh0ICpjb250ZXh0XzsKKyAgICBWa0ltYWdlT2JqIGltYWdlXzsKKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWFnZV9iYXJyaWVyXzsKKyAgICBWa0J1ZmZlck9iaiBidWZmZXJfOworICAgIFZrQnVmZmVyTWVtb3J5QmFycmllciBidWZmZXJfYmFycmllcl87Cit9OworCitzdHJ1Y3QgRGVidWdVdGlsc0xhYmVsQ2hlY2tEYXRhIHsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyQ2FsbGJhY2tEYXRhRVhUICpwQ2FsbGJhY2tEYXRhLCBEZWJ1Z1V0aWxzTGFiZWxDaGVja0RhdGEgKik+IGNhbGxiYWNrOworICAgIHNpemVfdCBjb3VudDsKK307CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAmcmhzLCBjb25zdCBWa0RlYnVnVXRpbHNMYWJlbEVYVCAmbGhzKTsKKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIERlYnVnVXRpbHNDYWxsYmFjayhWa0RlYnVnVXRpbHNNZXNzYWdlU2V2ZXJpdHlGbGFnQml0c0VYVCBtZXNzYWdlU2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVidWdVdGlsc01lc3NhZ2VUeXBlRmxhZ3NFWFQgbWVzc2FnZVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgKnBDYWxsYmFja0RhdGEsIHZvaWQgKnBVc2VyRGF0YSk7CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCitzdHJ1Y3QgdGhyZWFkX2RhdGFfc3RydWN0IHsKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcjsKKyAgICBWa0RldmljZSBkZXZpY2U7CisgICAgVmtFdmVudCBldmVudDsKKyAgICBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldDsKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgdWludDMyX3QgYmluZGluZzsKKyAgICBib29sICpiYWlsb3V0OworfTsKKworZXh0ZXJuICJDIiB2b2lkICpBZGRUb0NvbW1hbmRCdWZmZXIodm9pZCAqYXJnKTsKK2V4dGVybiAiQyIgdm9pZCAqVXBkYXRlRGVzY3JpcHRvcih2b2lkICphcmcpOworI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKK2V4dGVybiAiQyIgdm9pZCAqUmVsZWFzZU51bGxGZW5jZSh2b2lkICphcmcpOworCit2b2lkIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKEVycm9yTW9uaXRvciAqZXJyb3JfbW9uaXRvciwgY29uc3QgVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBycDJfc3VwcG9ydGVkLCBjb25zdCBjaGFyICpycDFfdnVpZCwgY29uc3QgY2hhciAqcnAyX3Z1aWQpOwordm9pZCBQb3NpdGl2ZVRlc3RSZW5kZXJQYXNzQ3JlYXRlKEVycm9yTW9uaXRvciAqZXJyb3JfbW9uaXRvciwgY29uc3QgVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJwMl9zdXBwb3J0ZWQpOwordm9pZCBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUoRXJyb3JNb25pdG9yICplcnJvcl9tb25pdG9yLCBjb25zdCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJwMl92dWlkKTsKK3ZvaWQgVGVzdFJlbmRlclBhc3NCZWdpbihFcnJvck1vbml0b3IgKmVycm9yX21vbml0b3IsIGNvbnN0IFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyAqYmVnaW5faW5mbywgYm9vbCBycDJTdXBwb3J0ZWQsIGNvbnN0IGNoYXIgKnJwMV92dWlkLCBjb25zdCBjaGFyICpycDJfdnVpZCk7CisKKy8vIEhlbHBlcnMgZm9yIHRoZSB0ZXN0cyBiZWxvdwordm9pZCBWYWxpZE93bmVyc2hpcFRyYW5zZmVyT3AoRXJyb3JNb25pdG9yICptb25pdG9yLCBWa0NvbW1hbmRCdWZmZXJPYmogKmNiLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNfc3RhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0X3N0YWdlcywgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyICpidWZfYmFycmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICppbWdfYmFycmllcik7CisKK3ZvaWQgVmFsaWRPd25lcnNoaXBUcmFuc2ZlcihFcnJvck1vbml0b3IgKm1vbml0b3IsIFZrQ29tbWFuZEJ1ZmZlck9iaiAqY2JfZnJvbSwgVmtDb21tYW5kQnVmZmVyT2JqICpjYl90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNfc3RhZ2VzLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3Rfc3RhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciAqYnVmX2JhcnJpZXIsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICppbWdfYmFycmllcik7CisKK1ZrUmVzdWx0IEdQRElGUEhlbHBlcihWa1BoeXNpY2FsRGV2aWNlIGRldiwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmNpLCBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyAqbGltaXRzID0gbnVsbHB0cik7CisKK1ZrRm9ybWF0IEZpbmRGb3JtYXRMaW5lYXJXaXRob3V0TWlwcyhWa1BoeXNpY2FsRGV2aWNlIGdwdSwgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY2kpOworCitib29sIEZpbmRGb3JtYXRXaXRob3V0U2FtcGxlcyhWa1BoeXNpY2FsRGV2aWNlIGdwdSwgVmtJbWFnZUNyZWF0ZUluZm8gJmltYWdlX2NpKTsKKworYm9vbCBGaW5kVW5zdXBwb3J0ZWRJbWFnZShWa1BoeXNpY2FsRGV2aWNlIGdwdSwgVmtJbWFnZUNyZWF0ZUluZm8gJmltYWdlX2NpKTsKKworVmtGb3JtYXQgRmluZEZvcm1hdFdpdGhvdXRGZWF0dXJlcyhWa1BoeXNpY2FsRGV2aWNlIGdwdSwgVmtJbWFnZVRpbGluZyB0aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0RmVhdHVyZUZsYWdzIHVuZGVzaXJlZF9mZWF0dXJlcyA9IFVJTlQzMl9NQVgpOworCit2b2lkIE5lZ0hlaWdodFZpZXdwb3J0VGVzdHMoVmtEZXZpY2VPYmogKm1fZGV2aWNlLCBWa0NvbW1hbmRCdWZmZXJPYmogKm1fY29tbWFuZEJ1ZmZlciwgRXJyb3JNb25pdG9yICptX2Vycm9yTW9uaXRvcik7CisKK3ZvaWQgQ3JlYXRlU2FtcGxlclRlc3QoVmtMYXllclRlc3QgJnRlc3QsIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBzdGQ6OnN0cmluZyBjb2RlID0gIiIpOworCit2b2lkIENyZWF0ZUJ1ZmZlclRlc3QoVmtMYXllclRlc3QgJnRlc3QsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIHN0ZDo6c3RyaW5nIGNvZGUgPSAiIik7CisKK3ZvaWQgQ3JlYXRlSW1hZ2VUZXN0KFZrTGF5ZXJUZXN0ICZ0ZXN0LCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIHN0ZDo6c3RyaW5nIGNvZGUgPSAiIik7CisKK3ZvaWQgQ3JlYXRlQnVmZmVyVmlld1Rlc3QoVmtMYXllclRlc3QgJnRlc3QsIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmNvZGVzKTsKKwordm9pZCBDcmVhdGVJbWFnZVZpZXdUZXN0KFZrTGF5ZXJUZXN0ICZ0ZXN0LCBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBzdGQ6OnN0cmluZyBjb2RlID0gIiIpOworCit2b2lkIHByaW50X2FuZHJvaWQoY29uc3QgY2hhciAqYyk7CisjZW5kaWYgIC8vIFZLTEFZRVJURVNUX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhhNzFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTQzIEBACisjIH5+fgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBMdW5hckcsIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgfn5+CisKK3NldChURVNUX0xBWUVSX05BTUUgVmtMYXllcl9kZXZpY2VfcHJvZmlsZV9hcGkpCisKK3NldChWS19MQVlFUl9SUEFUSCAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251L3Z1bGthbi9sYXllcjovdXNyL2xpYi9pMzg2LWxpbnV4LWdudS92dWxrYW4vbGF5ZXIpCitzZXQoQ01BS0VfSU5TVEFMTF9SUEFUSCAke1ZLX0xBWUVSX1JQQVRIfSkKKworaWYoV0lOMzIpCisgICAgaWYoTk9UIChDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVIgU1RSRVFVQUwgQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSKSkKKyAgICAgICAgZmlsZShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vd2luZG93cy8ke1RFU1RfTEFZRVJfTkFNRX0uanNvbiBzcmNfanNvbikKKyAgICAgICAgaWYoQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIl5WaXN1YWwgU3R1ZGlvLioiKQorICAgICAgICAgICAgZmlsZShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJDxDT05GSUc+LyR7VEVTVF9MQVlFUl9OQU1FfS5qc29uIGRzdF9qc29uKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7VEVTVF9MQVlFUl9OQU1FfS5qc29uIGRzdF9qc29uKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7VEVTVF9MQVlFUl9OQU1FfS1qc29uIEFMTCBDT01NQU5EIGNvcHkgJHtzcmNfanNvbn0gJHtkc3RfanNvbn0gVkVSQkFUSU0pCisgICAgICAgIGFkZF9kZXBlbmRlbmNpZXMoJHtURVNUX0xBWUVSX05BTUV9LWpzb24gJHtURVNUX0xBWUVSX05BTUV9KQorICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtURVNUX0xBWUVSX05BTUV9LWpzb24gUFJPUEVSVElFUyBGT0xERVIgJHtMQVlFUlNfSEVMUEVSX0ZPTERFUn0pCisgICAgZW5kaWYoKQorZWxzZWlmKEFQUExFKQorICAgICMgZXh0cmEgc2V0dXAgZm9yIG91dC1vZi10cmVlIGJ1aWxkcworICAgIGlmKE5PVCAoQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIFNUUkVRVUFMIENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUikpCisgICAgICAgIGlmKENNQUtFX0dFTkVSQVRPUiBNQVRDSEVTICJeWGNvZGUuKiIpCisgICAgICAgICAgICBhZGRfY3VzdG9tX3RhcmdldChta190ZXN0X2xheWVyX2NvbmZpZ19kaXIgQUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyQ8Q09ORklHPikKKyAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7VEVTVF9MQVlFUl9OQU1FfS1qc29uIEFMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVQRU5EUyBta190ZXN0X2xheWVyX2NvbmZpZ19kaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgbG4gLXNmICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYWNvcy8ke1RFU1RfTEFZRVJfTkFNRX0uanNvbiAkPENPTkZJRz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkJBVElNKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7VEVTVF9MQVlFUl9OQU1FfS1qc29uIEFMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCBsbiAtc2YgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hY29zLyR7VEVTVF9MQVlFUl9OQU1FfS5qc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJCQVRJTSkKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgICMgZXh0cmEgc2V0dXAgZm9yIG91dC1vZi10cmVlIGJ1aWxkcworICAgIGlmKE5PVCAoQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIFNUUkVRVUFMIENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUikpCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7VEVTVF9MQVlFUl9OQU1FfS1qc29uIEFMTAorICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EIGxuIC1zZiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGludXgvJHtURVNUX0xBWUVSX05BTUV9Lmpzb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0pCisgICAgZW5kaWYoKQorZW5kaWYoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgU3lzdGVtLXNwZWNpZmljIG1hY3JvcyB0byBjcmVhdGUgYSBsaWJyYXJ5IHRhcmdldC4KK2lmKFdJTjMyKQorICAgIG1hY3JvKEFkZFZrTGF5ZXIgdGFyZ2V0KQorICAgICAgICBmaWxlKFRPX05BVElWRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9Wa0xheWVyXyR7dGFyZ2V0fS5kZWYgREVGX0ZJTEUpCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KGNvcHktJHt0YXJnZXR9LWRlZi1maWxlIEFMTAorICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgJHtERUZfRklMRX0gVmtMYXllcl8ke3RhcmdldH0uZGVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkJBVElNKQorICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoY29weS0ke3RhcmdldH0tZGVmLWZpbGUgUFJPUEVSVElFUyBGT0xERVIgJHtMQVlFUlNfSEVMUEVSX0ZPTERFUn0pCisKKyAgICAgICAgYWRkX2xpYnJhcnkoVmtMYXllcl8ke3RhcmdldH0gU0hBUkVEICR7QVJHTn0gVmtMYXllcl8ke3RhcmdldH0uZGVmKQorICAgICAgICBhZGRfZGVwZW5kZW5jaWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFZrTGF5ZXJfdXRpbHMpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhWa0xheWVyXyR7dGFyZ2V0fSBQUklWQVRFIFZrTGF5ZXJfdXRpbHMpCisgICAgICAgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKFZrTGF5ZXJfJHt0YXJnZXR9IFBSSVZBVEUgIl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIikKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfb3B0aW9ucyhWa0xheWVyXyR7dGFyZ2V0fSBQUklWQVRFICQ8JDxDT05GSUc6RGVidWc+Oi9iaWdvYmo+KQorICAgIGVuZG1hY3JvKCkKK2Vsc2VpZihBUFBMRSkKKyAgICBtYWNybyhBZGRWa0xheWVyIHRhcmdldCkKKyAgICAgICAgYWRkX2xpYnJhcnkoVmtMYXllcl8ke3RhcmdldH0gU0hBUkVEICR7QVJHTn0pCisgICAgICAgIGFkZF9kZXBlbmRlbmNpZXMoVmtMYXllcl8ke3RhcmdldH0gVmtMYXllcl91dGlscykKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFBST1BFUlRJRVMgTElOS19GTEFHUyAiLVdsIikKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFBSSVZBVEUgVmtMYXllcl91dGlscykKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfb3B0aW9ucyhWa0xheWVyXyR7dGFyZ2V0fSBQUklWQVRFICItV3BvaW50ZXItYXJpdGgiICItV25vLXVudXNlZC1mdW5jdGlvbiIpCisgICAgZW5kbWFjcm8oKQorZWxzZShVTklYIEFORCBOT1QgQVBQTEUpICMgaS5lLjogTGludXgKKyAgICBtYWNybyhBZGRWa0xheWVyIHRhcmdldCkKKyAgICAgICAgYWRkX2xpYnJhcnkoVmtMYXllcl8ke3RhcmdldH0gU0hBUkVEICR7QVJHTn0pCisgICAgICAgIGFkZF9kZXBlbmRlbmNpZXMoVmtMYXllcl8ke3RhcmdldH0gVmtMYXllcl91dGlscykKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFBST1BFUlRJRVMgTElOS19GTEFHUyAiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYlZrTGF5ZXJfJHt0YXJnZXR9Lm1hcCwtQnN5bWJvbGljIikKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFBSSVZBVEUgVmtMYXllcl91dGlscykKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfb3B0aW9ucyhWa0xheWVyXyR7dGFyZ2V0fSBQUklWQVRFICItV3BvaW50ZXItYXJpdGgiICItV25vLXVudXNlZC1mdW5jdGlvbiIpCisgICAgZW5kbWFjcm8oKQorZW5kaWYoKQorCitBZGRWa0xheWVyKGRldmljZV9wcm9maWxlX2FwaSBkZXZpY2VfcHJvZmlsZV9hcGkuY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9sYXllcnMvdmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmNwcCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllcygke1RFU1RfTEFZRVJfTkFNRX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSVZBVEUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9sYXllcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7UFJPSkVDVF9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke1BST0pFQ1RfQklOQVJZX0RJUn0vbGF5ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtWdWxrYW5IZWFkZXJzX0lOQ0xVREVfRElSfSkKKworaWYoV0lOMzIpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7VEVTVF9MQVlFUl9OQU1FfSBQUk9QRVJUSUVTIEZPTERFUiAke0xBWUVSU19IRUxQRVJfRk9MREVSfSkKKyAgICAjIEZvciBXaW5kb3dzLCBjb3B5IG5lY2Vzc2FyeSBkZXZpY2VfcHJvZmlsZV9hcGkgbGF5ZXIgZmlsZXMgZm9yIHRoZSBsYXllcl90ZXN0cworICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3dpbmRvd3MvJHtURVNUX0xBWUVSX05BTUV9Lmpzb24gU1JDX0pTT04pCisgICAgZmlsZShUT19OQVRJVkVfUEFUSCAke1BST0pFQ1RfQklOQVJZX0RJUn0vbGF5ZXJzLyQ8Q09ORklHPi8ke1RFU1RfTEFZRVJfTkFNRX0uanNvbiBEU1RfSlNPTikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUICR7VEVTVF9MQVlFUl9OQU1FfSBQT1NUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7U1JDX0pTT059ICR7RFNUX0pTT059KQorICAgIFNFVChERVZJQ0VfUFJPRklMRV9MQVlFUl9GSUxFUworICAgICAgICBWa0xheWVyX2RldmljZV9wcm9maWxlX2FwaS5kbGwKKyAgICAgICAgVmtMYXllcl9kZXZpY2VfcHJvZmlsZV9hcGkuZXhwCisgICAgICAgIFZrTGF5ZXJfZGV2aWNlX3Byb2ZpbGVfYXBpLmxpYikKKyAgICBmaWxlKFRPX05BVElWRV9QQVRIICR7UFJPSkVDVF9CSU5BUllfRElSfS9sYXllcnMvJDxDT05GSUc+IERTVF9MQVlFUikKKyAgICBmb3JlYWNoKERFVl9QUk9GX0ZJTEUgJHtERVZJQ0VfUFJPRklMRV9MQVlFUl9GSUxFU30pCisgICAgICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyQ8Q09ORklHPi8ke0RFVl9QUk9GX0ZJTEV9IFNSQ19MQVlFUikKKyAgICAgICAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCAke1RFU1RfTEFZRVJfTkFNRX0gUE9TVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICR7U1JDX0xBWUVSfSAke0RTVF9MQVlFUn0pCisgICAgZW5kZm9yZWFjaCgpCitlbHNlaWYoQVBQTEUpCisgICAgaWYoQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIl5YY29kZS4qIikKKyAgICAgICAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCAke1RFU1RfTEFZRVJfTkFNRX0gUE9TVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCBsbiAtc2YgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7VEVTVF9MQVlFUl9OQU1FfS5qc29uICR7Q01BS0VfQklOQVJZX0RJUn0vbGF5ZXJzLyQ8Q09ORklHPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCBsbiAtc2YgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYiR7VEVTVF9MQVlFUl9OQU1FfS5keWxpYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9L2xheWVycy8kPENPTkZJRz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkJBVElNKQorICAgIGVsc2UoKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUICR7VEVTVF9MQVlFUl9OQU1FfSBQT1NUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EIGxuIC1zZiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtURVNUX0xBWUVSX05BTUV9Lmpzb24gJHtDTUFLRV9CSU5BUllfRElSfS9sYXllcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgbG4gLXNmICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWIke1RFU1RfTEFZRVJfTkFNRX0uZHlsaWIgJHtDTUFLRV9CSU5BUllfRElSfS9sYXllcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkJBVElNKQorICAgIGVuZGlmKCkKK2Vsc2UoVU5JWCBBTkQgTk9UIEFQUExFKSAjIGkuZS46IExpbnV4CisgICAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCAke1RFU1RfTEFZRVJfTkFNRX0gUE9TVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EIGxuIC1zZiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtURVNUX0xBWUVSX05BTUV9Lmpzb24gJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2xheWVycworICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EIGxuIC1zZiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGliJHtURVNUX0xBWUVSX05BTUV9LnNvICR7UFJPSkVDVF9CSU5BUllfRElSfS9sYXllcnMKKyAgICAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0pCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9sYXllcnMvVmtMYXllcl9kZXZpY2VfcHJvZmlsZV9hcGkuZGVmIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL1ZrTGF5ZXJfZGV2aWNlX3Byb2ZpbGVfYXBpLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2I4MDQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL1ZrTGF5ZXJfZGV2aWNlX3Byb2ZpbGVfYXBpLmRlZgpAQCAtMCwwICsxLDI3IEBACis7Ozs7IEJlZ2luIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OworOworOyBDb3B5cmlnaHQgKGMpIDIwMTcgVmFsdmUgQ29ycG9yYXRpb24KKzsgQ29weXJpZ2h0IChjKSAyMDE3IEx1bmFyRywgSW5jLgorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOworOyAgQXV0aG9yOiBBcmRhIENvc2t1bnNlcyA8YXJkYUBsdW5hcmcuY29tPgorOworOzs7OyAgRW5kIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKworTElCUkFSWSBWa0xheWVyX2RldmljZV9wcm9maWxlX2FwaQorRVhQT1JUUwordmtHZXRJbnN0YW5jZVByb2NBZGRyCit2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzCit2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcwordmtOZWdvdGlhdGVMb2FkZXJMYXllckludGVyZmFjZVZlcnNpb24KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9kZXZpY2VfcHJvZmlsZV9hcGkuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL2RldmljZV9wcm9maWxlX2FwaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3OTVlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9kZXZpY2VfcHJvZmlsZV9hcGkuY3BwCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEFyZGEgQ29za3Vuc2VzIDxhcmRhQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidmtfbGF5ZXJfZGF0YS5oIgorI2luY2x1ZGUgInZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oIgorI2luY2x1ZGUgInZrX2xheWVyX3V0aWxzLmgiCisjaW5jbHVkZSAidmtfbHVuYXJnX2RldmljZV9wcm9maWxlX2FwaV9sYXllci5oIgorI2luY2x1ZGUgInZrX2RldmljZV9wcm9maWxlX2FwaV9sYXllci5oIgorCituYW1lc3BhY2UgZGV2aWNlX3Byb2ZpbGVfYXBpIHsKKworc3RhdGljIHN0ZDo6bXV0ZXggZ2xvYmFsX2xvY2s7CisKK3N0YXRpYyB1aW50MzJfdCBsb2FkZXJfbGF5ZXJfaWZfdmVyc2lvbiA9IENVUlJFTlRfTE9BREVSX0xBWUVSX0lOVEVSRkFDRV9WRVJTSU9OOworCitzdHJ1Y3QgbGF5ZXJfZGF0YSB7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBwaHlfZGV2aWNlX3Byb3BzOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa0Zvcm1hdCwgVmtGb3JtYXRQcm9wZXJ0aWVzLCBzdGQ6Omhhc2g8aW50PiA+IGZvcm1hdF9wcm9wZXJ0aWVzX21hcDsKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlIGRpc3BhdGNoX3RhYmxlOworfTsKKworc3RhdGljIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIGxheWVyX2RhdGEgKj4gZGV2aWNlX3Byb2ZpbGVfYXBpX2Rldl9kYXRhX21hcDsKKworLy8gZGV2aWNlX3Byb2ZpbGVfYXBpIExheWVyIEVYVCBBUElzCit0eXBlZGVmIHZvaWQoVktBUElfUFRSICpQRk5fdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaHlzaWNhbERldmljZUxpbWl0cyAqbGltaXRzKTsKK3R5cGVkZWYgdm9pZChWS0FQSV9QVFIgKlBGTl92a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICpuZXdMaW1pdHMpOwordHlwZWRlZiB2b2lkKFZLQVBJX1BUUiAqUEZOX3ZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Zvcm1hdFByb3BlcnRpZXMgKnByb3BlcnRpZXMpOwordHlwZWRlZiB2b2lkKFZLQVBJX1BUUiAqUEZOX3ZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRm9ybWF0UHJvcGVydGllcyBuZXdQcm9wZXJ0aWVzKTsKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUxpbWl0c0VYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICpvcmdMaW1pdHMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnbG9iYWxfbG9jayk7CisgICAgbGF5ZXJfZGF0YSAqcGh5X2Rldl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKHBoeXNpY2FsRGV2aWNlLCBkZXZpY2VfcHJvZmlsZV9hcGlfZGV2X2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhICppbnN0YW5jZV9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKHBoeV9kZXZfZGF0YS0+aW5zdGFuY2UsIGRldmljZV9wcm9maWxlX2FwaV9kZXZfZGF0YV9tYXApOworICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIHByb3BzOworICAgIGluc3RhbmNlX2RhdGEtPmRpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgJnByb3BzKTsKKyAgICBtZW1jcHkob3JnTGltaXRzLCAmcHJvcHMubGltaXRzLCBzaXplb2YoVmtQaHlzaWNhbERldmljZUxpbWl0cykpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICpuZXdMaW1pdHMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnbG9iYWxfbG9jayk7CisgICAgbGF5ZXJfZGF0YSAqcGh5X2Rldl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKHBoeXNpY2FsRGV2aWNlLCBkZXZpY2VfcHJvZmlsZV9hcGlfZGV2X2RhdGFfbWFwKTsKKyAgICBtZW1jcHkoJihwaHlfZGV2X2RhdGEtPnBoeV9kZXZpY2VfcHJvcHMubGltaXRzKSwgbmV3TGltaXRzLCBzaXplb2YoVmtQaHlzaWNhbERldmljZUxpbWl0cykpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVChWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdFByb3BlcnRpZXMgKnByb3BlcnRpZXMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnbG9iYWxfbG9jayk7CisgICAgbGF5ZXJfZGF0YSAqcGh5X2Rldl9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKHBoeXNpY2FsRGV2aWNlLCBkZXZpY2VfcHJvZmlsZV9hcGlfZGV2X2RhdGFfbWFwKTsKKyAgICBsYXllcl9kYXRhICppbnN0YW5jZV9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKHBoeV9kZXZfZGF0YS0+aW5zdGFuY2UsIGRldmljZV9wcm9maWxlX2FwaV9kZXZfZGF0YV9tYXApOworICAgIGluc3RhbmNlX2RhdGEtPmRpc3BhdGNoX3RhYmxlLkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgZm9ybWF0LCBwcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Zvcm1hdFByb3BlcnRpZXMgbmV3UHJvcGVydGllcykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdsb2JhbF9sb2NrKTsKKyAgICBsYXllcl9kYXRhICpwaHlfZGV2X2RhdGEgPSBHZXRMYXllckRhdGFQdHIocGh5c2ljYWxEZXZpY2UsIGRldmljZV9wcm9maWxlX2FwaV9kZXZfZGF0YV9tYXApOworCisgICAgbWVtY3B5KCYocGh5X2Rldl9kYXRhLT5mb3JtYXRfcHJvcGVydGllc19tYXBbZm9ybWF0XSksICZuZXdQcm9wZXJ0aWVzLCBzaXplb2YoVmtGb3JtYXRQcm9wZXJ0aWVzKSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luc3RhbmNlICpwSW5zdGFuY2UpIHsKKyAgICBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ2xvYmFsX2xvY2spOworCisgICAgYXNzZXJ0KGNoYWluX2luZm8tPnUucExheWVySW5mbyk7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcF9nZXRfaW5zdGFuY2VfcHJvY19hZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBmcF9jcmVhdGVfaW5zdGFuY2UgPSAoUEZOX3ZrQ3JlYXRlSW5zdGFuY2UpZnBfZ2V0X2luc3RhbmNlX3Byb2NfYWRkcihOVUxMLCAidmtDcmVhdGVJbnN0YW5jZSIpOworICAgIGlmIChmcF9jcmVhdGVfaW5zdGFuY2UgPT0gTlVMTCkgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKworICAgIC8vIEFkdmFuY2UgdGhlIGxpbmsgaW5mbyBmb3IgdGhlIG5leHQgZWxlbWVudCBvbiB0aGUgY2hhaW4KKyAgICBjaGFpbl9pbmZvLT51LnBMYXllckluZm8gPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBOZXh0OworCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZnBfY3JlYXRlX2luc3RhbmNlKHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgcmV0dXJuIHJlc3VsdDsKKworICAgIGxheWVyX2RhdGEgKmluc3RhbmNlX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoKnBJbnN0YW5jZSwgZGV2aWNlX3Byb2ZpbGVfYXBpX2Rldl9kYXRhX21hcCk7CisgICAgaW5zdGFuY2VfZGF0YS0+aW5zdGFuY2UgPSAqcEluc3RhbmNlOworICAgIGxheWVyX2luaXRfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoKnBJbnN0YW5jZSwgJmluc3RhbmNlX2RhdGEtPmRpc3BhdGNoX3RhYmxlLCBmcF9nZXRfaW5zdGFuY2VfcHJvY19hZGRyKTsKKyAgICBpbnN0YW5jZV9kYXRhLT5kaXNwYXRjaF90YWJsZS5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyID0KKyAgICAgICAgKFBGTl9HZXRQaHlzaWNhbERldmljZVByb2NBZGRyKWZwX2dldF9pbnN0YW5jZV9wcm9jX2FkZHIoKnBJbnN0YW5jZSwgInZrX2xheWVyR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkciIpOworCisgICAgdWludDMyX3QgcGh5c2ljYWxfZGV2aWNlX2NvdW50ID0gMDsKKyAgICBpbnN0YW5jZV9kYXRhLT5kaXNwYXRjaF90YWJsZS5FbnVtZXJhdGVQaHlzaWNhbERldmljZXMoKnBJbnN0YW5jZSwgJnBoeXNpY2FsX2RldmljZV9jb3VudCwgTlVMTCk7CisKKyAgICBzdGQ6OnZlY3RvcjxWa1BoeXNpY2FsRGV2aWNlPiBwaHlzaWNhbF9kZXZpY2VzKHBoeXNpY2FsX2RldmljZV9jb3VudCk7CisgICAgcmVzdWx0ID0gaW5zdGFuY2VfZGF0YS0+ZGlzcGF0Y2hfdGFibGUuRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCpwSW5zdGFuY2UsICZwaHlzaWNhbF9kZXZpY2VfY291bnQsIHBoeXNpY2FsX2RldmljZXMuZGF0YSgpKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybiByZXN1bHQ7CisKKyAgICBmb3IgKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxfZGV2aWNlIDogcGh5c2ljYWxfZGV2aWNlcykgeworICAgICAgICBsYXllcl9kYXRhICpwaHlfZGV2X2RhdGEgPSBHZXRMYXllckRhdGFQdHIocGh5c2ljYWxfZGV2aWNlLCBkZXZpY2VfcHJvZmlsZV9hcGlfZGV2X2RhdGFfbWFwKTsKKyAgICAgICAgaW5zdGFuY2VfZGF0YS0+ZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKHBoeXNpY2FsX2RldmljZSwgJnBoeV9kZXZfZGF0YS0+cGh5X2RldmljZV9wcm9wcyk7CisgICAgICAgIHBoeV9kZXZfZGF0YS0+aW5zdGFuY2UgPSAqcEluc3RhbmNlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ2xvYmFsX2xvY2spOworICAgIGxheWVyX2RhdGEgKnBoeV9kZXZfZGF0YSA9IEdldExheWVyRGF0YVB0cihwaHlzaWNhbERldmljZSwgZGV2aWNlX3Byb2ZpbGVfYXBpX2Rldl9kYXRhX21hcCk7CisgICAgbWVtY3B5KHBQcm9wZXJ0aWVzLCAmcGh5X2Rldl9kYXRhLT5waHlfZGV2aWNlX3Byb3BzLCBzaXplb2YoVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMpKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ2xvYmFsX2xvY2spOworICAgIGxheWVyX2RhdGEgKnBoeV9kZXZfZGF0YSA9IEdldExheWVyRGF0YVB0cihwaHlzaWNhbERldmljZSwgZGV2aWNlX3Byb2ZpbGVfYXBpX2Rldl9kYXRhX21hcCk7CisgICAgbGF5ZXJfZGF0YSAqaW5zdGFuY2VfZGF0YSA9IEdldExheWVyRGF0YVB0cihwaHlfZGV2X2RhdGEtPmluc3RhbmNlLCBkZXZpY2VfcHJvZmlsZV9hcGlfZGV2X2RhdGFfbWFwKTsKKyAgICBhdXRvIGRldmljZV9mb3JtYXRfbWFwX2l0ID0gcGh5X2Rldl9kYXRhLT5mb3JtYXRfcHJvcGVydGllc19tYXAuZmluZChmb3JtYXQpOworICAgIGlmIChkZXZpY2VfZm9ybWF0X21hcF9pdCAhPSBwaHlfZGV2X2RhdGEtPmZvcm1hdF9wcm9wZXJ0aWVzX21hcC5lbmQoKSkgeworICAgICAgICBtZW1jcHkocFByb3BlcnRpZXMsICZwaHlfZGV2X2RhdGEtPmZvcm1hdF9wcm9wZXJ0aWVzX21hcFtmb3JtYXRdLCBzaXplb2YoVmtGb3JtYXRQcm9wZXJ0aWVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5zdGFuY2VfZGF0YS0+ZGlzcGF0Y2hfdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBmb3JtYXQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBWa0xheWVyUHJvcGVydGllcyBkZXZpY2VfcHJvZmlsZV9hcGlfTGF5ZXJQcm9wcyA9IHsKKyAgICAiVktfTEFZRVJfTFVOQVJHX2RldmljZV9wcm9maWxlX2FwaSIsCisgICAgVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSwgIC8vIHNwZWNWZXJzaW9uCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uVmVyc2lvbgorICAgICJMdW5hckcgZGV2aWNlIHByb2ZpbGUgYXBpIExheWVyIiwKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVmtSZXN1bHQgRW51bWVyYXRlUHJvcGVydGllcyh1aW50MzJfdCBzcmNfY291bnQsIGNvbnN0IFQgKnNyY19wcm9wcywgdWludDMyX3QgKmRzdF9jb3VudCwgVCAqZHN0X3Byb3BzKSB7CisgICAgaWYgKCFkc3RfcHJvcHMgfHwgIXNyY19wcm9wcykgeworICAgICAgICAqZHN0X2NvdW50ID0gc3JjX2NvdW50OworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3B5X2NvdW50ID0gKCpkc3RfY291bnQgPCBzcmNfY291bnQpID8gKmRzdF9jb3VudCA6IHNyY19jb3VudDsKKyAgICBtZW1jcHkoZHN0X3Byb3BzLCBzcmNfcHJvcHMsIHNpemVvZihUKSAqIGNvcHlfY291bnQpOworICAgICpkc3RfY291bnQgPSBjb3B5X2NvdW50OworCisgICAgcmV0dXJuIChjb3B5X2NvdW50ID09IHNyY19jb3VudCkgPyBWS19TVUNDRVNTIDogVktfSU5DT01QTEVURTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKHVpbnQzMl90ICpwQ291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKDEsICZkZXZpY2VfcHJvZmlsZV9hcGlfTGF5ZXJQcm9wcywgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIGlmIChwTGF5ZXJOYW1lICYmICFzdHJjbXAocExheWVyTmFtZSwgZGV2aWNlX3Byb2ZpbGVfYXBpX0xheWVyUHJvcHMubGF5ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXM8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPigwLCBOVUxMLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiBWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVDsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBHZXRQaHlzaWNhbERldmljZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidmtTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVCIpKSByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbilTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIikpIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKUdldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgInZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUIikpIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKVNldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbilHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVDsKKyAgICBsYXllcl9kYXRhICppbnN0YW5jZV9kYXRhID0gR2V0TGF5ZXJEYXRhUHRyKGluc3RhbmNlLCBkZXZpY2VfcHJvZmlsZV9hcGlfZGV2X2RhdGFfbWFwKTsKKyAgICBhdXRvICZ0YWJsZSA9IGluc3RhbmNlX2RhdGEtPmRpc3BhdGNoX3RhYmxlOworICAgIGlmICghdGFibGUuR2V0UGh5c2ljYWxEZXZpY2VQcm9jQWRkcikgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIHRhYmxlLkdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIoaW5zdGFuY2UsIG5hbWUpOworfQorCitWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIEdldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSkgeworICAgIGlmICghc3RyY21wKG5hbWUsICJ2a0NyZWF0ZUluc3RhbmNlIikpIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKUNyZWF0ZUluc3RhbmNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJ2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyIpKSByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbilHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzIikpIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKUdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidmtHZXRJbnN0YW5jZVByb2NBZGRyIikpIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKUdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIikpIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKUVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIpKSByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbilFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidmtTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVCIpKSByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbilTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIikpIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKUdldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgInZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUIikpIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKVNldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbilHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVDsKKyAgICBhc3NlcnQoaW5zdGFuY2UpOworICAgIGxheWVyX2RhdGEgKmluc3RhbmNlX2RhdGEgPSBHZXRMYXllckRhdGFQdHIoaW5zdGFuY2UsIGRldmljZV9wcm9maWxlX2FwaV9kZXZfZGF0YV9tYXApOworICAgIGF1dG8gJnRhYmxlID0gaW5zdGFuY2VfZGF0YS0+ZGlzcGF0Y2hfdGFibGU7CisgICAgaWYgKCF0YWJsZS5HZXRJbnN0YW5jZVByb2NBZGRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gdGFibGUuR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgbmFtZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBkZXZpY2VfcHJvZmlsZV9hcGkKKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgcmV0dXJuIGRldmljZV9wcm9maWxlX2FwaTo6RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMocENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiBkZXZpY2VfcHJvZmlsZV9hcGk6OkVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhwTGF5ZXJOYW1lLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKSB7CisgICAgcmV0dXJuIGRldmljZV9wcm9maWxlX2FwaTo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a19sYXllckdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIHJldHVybiBkZXZpY2VfcHJvZmlsZV9hcGk6OkdldFBoeXNpY2FsRGV2aWNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbihWa05lZ290aWF0ZUxheWVySW50ZXJmYWNlICpwVmVyc2lvblN0cnVjdCkgeworICAgIGFzc2VydChwVmVyc2lvblN0cnVjdCAhPSBOVUxMKTsKKyAgICBhc3NlcnQocFZlcnNpb25TdHJ1Y3QtPnNUeXBlID09IExBWUVSX05FR09USUFURV9JTlRFUkZBQ0VfU1RSVUNUKTsKKworICAgIC8vIEZpbGwgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGlmIG91ciB2ZXJzaW9uIGlzIGF0IGxlYXN0IGNhcGFibGUgb2YgaGF2aW5nIHRoZSBzdHJ1Y3R1cmUgY29udGFpbiB0aGVtLgorICAgIGlmIChwVmVyc2lvblN0cnVjdC0+bG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uID49IDIpIHsKKyAgICAgICAgcFZlcnNpb25TdHJ1Y3QtPnBmbkdldEluc3RhbmNlUHJvY0FkZHIgPSB2a0dldEluc3RhbmNlUHJvY0FkZHI7CisgICAgICAgIHBWZXJzaW9uU3RydWN0LT5wZm5HZXREZXZpY2VQcm9jQWRkciA9IG51bGxwdHI7CisgICAgICAgIHBWZXJzaW9uU3RydWN0LT5wZm5HZXRQaHlzaWNhbERldmljZVByb2NBZGRyID0gdmtfbGF5ZXJHZXRQaHlzaWNhbERldmljZVByb2NBZGRyOworICAgIH0KKworICAgIGlmIChwVmVyc2lvblN0cnVjdC0+bG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uIDwgQ1VSUkVOVF9MT0FERVJfTEFZRVJfSU5URVJGQUNFX1ZFUlNJT04pIHsKKyAgICAgICAgZGV2aWNlX3Byb2ZpbGVfYXBpOjpsb2FkZXJfbGF5ZXJfaWZfdmVyc2lvbiA9IHBWZXJzaW9uU3RydWN0LT5sb2FkZXJMYXllckludGVyZmFjZVZlcnNpb247CisgICAgfSBlbHNlIGlmIChwVmVyc2lvblN0cnVjdC0+bG9hZGVyTGF5ZXJJbnRlcmZhY2VWZXJzaW9uID4gQ1VSUkVOVF9MT0FERVJfTEFZRVJfSU5URVJGQUNFX1ZFUlNJT04pIHsKKyAgICAgICAgcFZlcnNpb25TdHJ1Y3QtPmxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbiA9IENVUlJFTlRfTE9BREVSX0xBWUVSX0lOVEVSRkFDRV9WRVJTSU9OOworICAgIH0KKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL2xpYlZrTGF5ZXJfZGV2aWNlX3Byb2ZpbGVfYXBpLm1hcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9saWJWa0xheWVyX2RldmljZV9wcm9maWxlX2FwaS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5NzA2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9saWJWa0xheWVyX2RldmljZV9wcm9maWxlX2FwaS5tYXAKQEAgLTAsMCArMSw5IEBACit7CisgIGdsb2JhbDoKKyAgICB2a0dldEluc3RhbmNlUHJvY0FkZHI7CisgICAgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllczsKKyAgICB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllczsKKyAgICB2a05lZ290aWF0ZUxvYWRlckxheWVySW50ZXJmYWNlVmVyc2lvbjsKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9sYXllcnMvbGludXgvVmtMYXllcl9kZXZpY2VfcHJvZmlsZV9hcGkuanNvbiBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9saW51eC9Wa0xheWVyX2RldmljZV9wcm9maWxlX2FwaS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODM3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9sYXllcnMvbGludXgvVmtMYXllcl9kZXZpY2VfcHJvZmlsZV9hcGkuanNvbgpAQCAtMCwwICsxLDE4IEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMS4wIiwKKyAgICAibGF5ZXIiIDogeworICAgICAgICAibmFtZSI6ICJWS19MQVlFUl9MVU5BUkdfZGV2aWNlX3Byb2ZpbGVfYXBpIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuL2xpYlZrTGF5ZXJfZGV2aWNlX3Byb2ZpbGVfYXBpLnNvIiwKKyAgICAgICAgImFwaV92ZXJzaW9uIjogIjEuMS4xMDEiLAorICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIyIiwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBEZXZpY2UgUHJvZmlsZSBBcGkgTGF5ZXIiLAorICAgICAgICAiZGV2aWNlX2V4dGVuc2lvbnMiOiBbCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAibmFtZSI6ICJWS19MVU5BUkdfTGF5ZXJEZXZpY2VQcm9maWxlQXBpRVhUIiwKKyAgICAgICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIwIiwKKyAgICAgICAgICAgICAgICAgImVudHJ5cG9pbnRzIjogWyJ2a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIiwgInZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUxpbWl0c0VYVCJdCisgICAgICAgICAgICAgfQorICAgICAgICAgXQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9tYWNvcy9Wa0xheWVyX2RldmljZV9wcm9maWxlX2FwaS5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL21hY29zL1ZrTGF5ZXJfZGV2aWNlX3Byb2ZpbGVfYXBpLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMDg0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy9tYWNvcy9Wa0xheWVyX2RldmljZV9wcm9maWxlX2FwaS5qc29uCkBAIC0wLDAgKzEsMTggQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4xLjAiLAorICAgICJsYXllciIgOiB7CisgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19kZXZpY2VfcHJvZmlsZV9hcGkiLAorICAgICAgICAidHlwZSI6ICJHTE9CQUwiLAorICAgICAgICAibGlicmFyeV9wYXRoIjogIi4vbGliVmtMYXllcl9kZXZpY2VfcHJvZmlsZV9hcGkuZHlsaWIiLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjEwMSIsCisgICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogIjIiLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiTHVuYXJHIERldmljZSBQcm9maWxlIEFwaSBMYXllciIsCisgICAgICAgICJkZXZpY2VfZXh0ZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICJuYW1lIjogIlZLX0xVTkFSR19MYXllckRldmljZVByb2ZpbGVBcGlFWFQiLAorICAgICAgICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjAiLAorICAgICAgICAgICAgICAgICAiZW50cnlwb2ludHMiOiBbInZrU2V0UGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQiLCAidmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIl0KKyAgICAgICAgICAgICB9CisgICAgICAgICBdCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2RldmljZV9wcm9maWxlX2FwaV9sYXllci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2RldmljZV9wcm9maWxlX2FwaV9sYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzFhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9sYXllcnMvdmtfZGV2aWNlX3Byb2ZpbGVfYXBpX2xheWVyLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBBcmRhIENvc2t1bnNlcyA8YXJkYUBsdW5hcmcuY29tPgorICoKKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInZrX2x1bmFyZ19kZXZpY2VfcHJvZmlsZV9hcGlfbGF5ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVmtMYXllckRldmljZVByb2ZpbGVBcGlEaXNwYXRjaFRhYmxlXyB7CisgICAgUEZOX3ZrU2V0UGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQgdmtTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVDsKKyAgICBQRk5fdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUxpbWl0c0VYVDsKK30gVmtMYXllckRldmljZVByb2ZpbGVBcGlEaXNwYXRjaFRhYmxlOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL3ZrX2x1bmFyZ19kZXZpY2VfcHJvZmlsZV9hcGlfbGF5ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy92a19sdW5hcmdfZGV2aWNlX3Byb2ZpbGVfYXBpX2xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlNmM4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL2xheWVycy92a19sdW5hcmdfZGV2aWNlX3Byb2ZpbGVfYXBpX2xheWVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNyBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBBcmRhIENvc2t1bnNlcyA8YXJkYUBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9fVktfREVWSUNFX1BST0ZJTEVfQVBJX0hfXworI2RlZmluZSBfX1ZLX0RFVklDRV9QUk9GSUxFX0FQSV9IX18KKworI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKy8vIERldmljZSBQcm9maWxlIEFwaSBWdWxrYW4gRXh0ZW5zaW9uIEFQSQorCisjZGVmaW5lIERFVklDRV9QUk9GSUxFX0FQSV9FWFRFTlNJT05fTkFNRSAiVktfTFVOQVJHX0RFVklDRV9QUk9GSUxFIgorCisvLyBBUEkgZnVuY3Rpb25zCisKK3R5cGVkZWYgdm9pZChWS0FQSV9QVFIgKlBGTl92a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCBjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICpuZXdMaW1pdHMpOwordHlwZWRlZiB2b2lkKFZLQVBJX1BUUiAqUEZOX3ZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUxpbWl0c0VYVCkoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgKm9yZ0xpbWl0cyk7Cit0eXBlZGVmIHZvaWQoVktBUElfUFRSICpQRk5fdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCkoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgVmtGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRm9ybWF0UHJvcGVydGllcyAqcHJvcGVydGllcyk7Cit0eXBlZGVmIHZvaWQoVktBUElfUFRSICpQRk5fdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtGb3JtYXRQcm9wZXJ0aWVzIG5ld1Byb3BlcnRpZXMpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAgLy8gX19WS19ERVZJQ0VfUFJPRklMRV9BUElfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy9sYXllcnMvd2luZG93cy9Wa0xheWVyX2RldmljZV9wcm9maWxlX2FwaS5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL3dpbmRvd3MvVmtMYXllcl9kZXZpY2VfcHJvZmlsZV9hcGkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTg5MGMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvbGF5ZXJzL3dpbmRvd3MvVmtMYXllcl9kZXZpY2VfcHJvZmlsZV9hcGkuanNvbgpAQCAtMCwwICsxLDE4IEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMS4wIiwKKyAgICAibGF5ZXIiIDogeworICAgICAgICAibmFtZSI6ICJWS19MQVlFUl9MVU5BUkdfZGV2aWNlX3Byb2ZpbGVfYXBpIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuXFxWa0xheWVyX2RldmljZV9wcm9maWxlX2FwaS5kbGwiLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4xLjEwMSIsCisgICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogIjIiLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiTHVuYXJHIERldmljZSBQcm9maWxlIEFwaSBMYXllciIsCisgICAgICAgICJkZXZpY2VfZXh0ZW5zaW9ucyI6IFsKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICJuYW1lIjogIlZLX0xVTkFSR19MYXllckRldmljZVByb2ZpbGVBcGlFWFQiLAorICAgICAgICAgICAgICAgICAic3BlY192ZXJzaW9uIjogIjAiLAorICAgICAgICAgICAgICAgICAiZW50cnlwb2ludHMiOiBbInZrU2V0UGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQiLCAidmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIl0KKyAgICAgICAgICAgICB9CisgICAgICAgICBdCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdGVzdF9jb21tb24uaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhYWYyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZkBpancuY28ubno+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWlrZSBTdHJveWFuIDxtaWtlQEx1bmFyRy5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKi8KKworI2lmbmRlZiBURVNUX0NPTU1PTl9ICisjZGVmaW5lIFRFU1RfQ09NTU9OX0gKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIE5PTUlOTUFYCisvLyBXaW5Tb2NrMi5oIG11c3QgYmUgaW5jbHVkZWQgKkJFRk9SRSogd2luZG93cy5oCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dnVsa2FuL3ZrX3Nka19wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKworI2lmZGVmIF9XSU4zMgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisvKgorICAgIHdhcm5pbmdzIDQyNTEgYW5kIDQyNzUgaGF2ZSB0byBkbyB3aXRoIHBvdGVudGlhbCBkbGwtaW50ZXJmYWNlIG1pc21hdGNoCisgICAgYmV0d2VlbiBsaWJyYXJ5IChndGVzdCkgYW5kIHVzZXJzLiBTaW5jZSB3ZSBidWlsZCB0aGUgZ3Rlc3QgbGlicmFyeQorICAgIGFzIHBhcnQgb2YgdGhlIHRlc3QgYnVpbGQgd2Uga25vdyB0aGF0IHRoZSBkbGwtaW50ZXJmYWNlIHdpbGwgbWF0Y2ggYW5kCisgICAgY2FuIGRpc2FibGUgdGhlc2Ugd2FybmluZ3MuCisgKi8KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDI1MSkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDI3NSkKKyNlbmRpZgorCisvLyBHVGVzdCBhbmQgWGxpYiBjb2xsaWRlIGR1ZSB0byByZWRlZmluaXRpb25zIG9mICJOb25lIiBhbmQgIkJvb2wiCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisjcHJhZ21hIHB1c2hfbWFjcm8oIk5vbmUiKQorI3ByYWdtYSBwdXNoX21hY3JvKCJCb29sIikKKyN1bmRlZiBOb25lCisjdW5kZWYgQm9vbAorI2VuZGlmCisKKy8vIFVzZSB0aGUgTkRLJ3MgaGVhZGVyIG9uIEFuZHJvaWQKKyNpZm5kZWYgX19BTkRST0lEX18KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2Vsc2UKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2VuZGlmCisKKy8vIFJlZGVmaW5lIFhsaWIgZGVmaW5pdGlvbnMKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyNwcmFnbWEgcG9wX21hY3JvKCJCb29sIikKKyNwcmFnbWEgcG9wX21hY3JvKCJOb25lIikKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisjaW5jbHVkZSAidmt0ZXN0YmluZGluZy5oIgorCisjZGVmaW5lIEFTU0VSVF9WS19TVUNDRVNTKGVycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgVmtSZXN1bHQgcmVzb2x2ZWRfZXJyID0gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFTU0VSVF9FUShWS19TVUNDRVNTLCByZXNvbHZlZF9lcnIpIDw8IHZrX3Jlc3VsdF9zdHJpbmcocmVzb2x2ZWRfZXJyKTsgXAorICAgIH0KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp2a19yZXN1bHRfc3RyaW5nKFZrUmVzdWx0IGVycikgeworICAgIHN3aXRjaCAoZXJyKSB7CisjZGVmaW5lIFNUUihyKSBcCisgICAgY2FzZSByOiAgICBcCisgICAgICAgIHJldHVybiAjcgorICAgICAgICBTVFIoVktfU1VDQ0VTUyk7CisgICAgICAgIFNUUihWS19OT1RfUkVBRFkpOworICAgICAgICBTVFIoVktfVElNRU9VVCk7CisgICAgICAgIFNUUihWS19FVkVOVF9TRVQpOworICAgICAgICBTVFIoVktfRVZFTlRfUkVTRVQpOworICAgICAgICBTVFIoVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEKTsKKyAgICAgICAgU1RSKFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSk7CisgICAgICAgIFNUUihWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWSk7CisgICAgICAgIFNUUihWS19FUlJPUl9ERVZJQ0VfTE9TVCk7CisgICAgICAgIFNUUihWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQpOworICAgICAgICBTVFIoVktfRVJST1JfTEFZRVJfTk9UX1BSRVNFTlQpOworICAgICAgICBTVFIoVktfRVJST1JfTUVNT1JZX01BUF9GQUlMRUQpOworICAgICAgICBTVFIoVktfRVJST1JfSU5DT01QQVRJQkxFX0RSSVZFUik7CisjdW5kZWYgU1RSCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVOS05PV05fUkVTVUxUIjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZXN0X2Vycm9yX2NhbGxiYWNrKGNvbnN0IGNoYXIgKmV4cHIsIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbikgeworICAgIEFERF9GQUlMVVJFX0FUKGZpbGUsIGxpbmUpIDw8ICJBc3NlcnRpb246IGAiIDw8IGV4cHIgPDwgIiciOworfQorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorLyogTGludXgtc3BlY2lmaWMgY29tbW9uIGNvZGU6ICovCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8vIFRocmVhZHM6Cit0eXBlZGVmIHB0aHJlYWRfdCB0ZXN0X3BsYXRmb3JtX3RocmVhZDsKKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY3JlYXRlKHRlc3RfcGxhdGZvcm1fdGhyZWFkICp0aHJlYWQsIHZvaWQgKigqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSkgeworICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWRfYXR0cik7CisgICAgcmV0dXJuIHB0aHJlYWRfY3JlYXRlKHRocmVhZCwgJnRocmVhZF9hdHRyLCBmdW5jLCBkYXRhKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfcGxhdGZvcm1fdGhyZWFkX2pvaW4odGVzdF9wbGF0Zm9ybV90aHJlYWQgdGhyZWFkLCB2b2lkICoqcmV0dmFsKSB7IHJldHVybiBwdGhyZWFkX2pvaW4odGhyZWFkLCByZXR2YWwpOyB9CisKKy8vIFRocmVhZCBJRHM6Cit0eXBlZGVmIHB0aHJlYWRfdCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9pZDsKK3N0YXRpYyBpbmxpbmUgdGVzdF9wbGF0Zm9ybV90aHJlYWRfaWQgdGVzdF9wbGF0Zm9ybV9nZXRfdGhyZWFkX2lkKCkgeyByZXR1cm4gcHRocmVhZF9zZWxmKCk7IH0KKworLy8gVGhyZWFkIG11dGV4OgordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgdGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXg7CitzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY3JlYXRlX211dGV4KHRlc3RfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgcHRocmVhZF9tdXRleF9pbml0KHBNdXRleCwgTlVMTCk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KHRlc3RfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgcHRocmVhZF9tdXRleF9sb2NrKHBNdXRleCk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZXN0X3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgodGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeyBwdGhyZWFkX211dGV4X3VubG9jayhwTXV0ZXgpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfZGVsZXRlX211dGV4KHRlc3RfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpwTXV0ZXgpIHsgcHRocmVhZF9tdXRleF9kZXN0cm95KHBNdXRleCk7IH0KK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZDsKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9pbml0X2NvbmQodGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZCAqcENvbmQpIHsgcHRocmVhZF9jb25kX2luaXQocENvbmQsIE5VTEwpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZF93YWl0KHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NvbmQgKnBDb25kLCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7CisgICAgcHRocmVhZF9jb25kX3dhaXQocENvbmQsIHBNdXRleCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZF9icm9hZGNhc3QodGVzdF9wbGF0Zm9ybV90aHJlYWRfY29uZCAqcENvbmQpIHsgcHRocmVhZF9jb25kX2Jyb2FkY2FzdChwQ29uZCk7IH0KKworI2VsaWYgZGVmaW5lZChfV0lOMzIpICAvLyBkZWZpbmVkKF9fbGludXhfXykKKy8vIFRocmVhZHM6Cit0eXBlZGVmIEhBTkRMRSB0ZXN0X3BsYXRmb3JtX3RocmVhZDsKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZSh0ZXN0X3BsYXRmb3JtX3RocmVhZCAqdGhyZWFkLCB2b2lkICooKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEpIHsKKyAgICBEV09SRCB0aHJlYWRJRDsKKyAgICAqdGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsICAvLyBkZWZhdWx0IHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAvLyB1c2UgZGVmYXVsdCBzdGFjayBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSlmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgICAgICAgIC8vIHRocmVhZCBmdW5jdGlvbiBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IGNyZWF0aW9uIGZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkSUQpOyAgLy8gcmV0dXJucyB0aHJlYWQgaWRlbnRpZmllcgorICAgIHJldHVybiAoKnRocmVhZCAhPSBOVUxMKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfcGxhdGZvcm1fdGhyZWFkX2pvaW4odGVzdF9wbGF0Zm9ybV90aHJlYWQgdGhyZWFkLCB2b2lkICoqcmV0dmFsKSB7CisgICAgcmV0dXJuIFdhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkLCBJTkZJTklURSk7Cit9CisKKy8vIFRocmVhZCBJRHM6Cit0eXBlZGVmIERXT1JEIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2lkOworc3RhdGljIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2lkIHRlc3RfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpIHsgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOyB9CisKKy8vIFRocmVhZCBtdXRleDoKK3R5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiB0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleDsKK3N0YXRpYyB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZV9tdXRleCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24ocE11dGV4KTsgfQorc3RhdGljIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IEVudGVyQ3JpdGljYWxTZWN0aW9uKHBNdXRleCk7IH0KK3N0YXRpYyB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IExlYXZlQ3JpdGljYWxTZWN0aW9uKHBNdXRleCk7IH0KK3N0YXRpYyB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2RlbGV0ZV9tdXRleCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9tdXRleCAqcE11dGV4KSB7IERlbGV0ZUNyaXRpY2FsU2VjdGlvbihwTXV0ZXgpOyB9Cit0eXBlZGVmIENPTkRJVElPTl9WQVJJQUJMRSB0ZXN0X3BsYXRmb3JtX3RocmVhZF9jb25kOworc3RhdGljIHZvaWQgdGVzdF9wbGF0Zm9ybV90aHJlYWRfaW5pdF9jb25kKHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NvbmQgKnBDb25kKSB7IEluaXRpYWxpemVDb25kaXRpb25WYXJpYWJsZShwQ29uZCk7IH0KK3N0YXRpYyB2b2lkIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NvbmRfd2FpdCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCwgdGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggKnBNdXRleCkgeworICAgIFNsZWVwQ29uZGl0aW9uVmFyaWFibGVDUyhwQ29uZCwgcE11dGV4LCBJTkZJTklURSk7Cit9CitzdGF0aWMgdm9pZCB0ZXN0X3BsYXRmb3JtX3RocmVhZF9jb25kX2Jyb2FkY2FzdCh0ZXN0X3BsYXRmb3JtX3RocmVhZF9jb25kICpwQ29uZCkgeyBXYWtlQWxsQ29uZGl0aW9uVmFyaWFibGUocENvbmQpOyB9CisjZWxzZSAgICAgICAgICAgICAgICAgIC8vIGRlZmluZWQoX1dJTjMyKQorCisjZXJyb3IgVGhlICJ0ZXN0X2NvbW1vbi5oIiBmaWxlIG11c3QgYmUgbW9kaWZpZWQgZm9yIHRoaXMgT1MuCisKKy8vIE5PVEU6IEluIG9yZGVyIHRvIHN1cHBvcnQgYW5vdGhlciBPUywgYW4gI2VsaWYgbmVlZHMgdG8gYmUgYWRkZWQgKGFib3ZlIHRoZQorLy8gIiNlbHNlIC8vIGRlZmluZWQoX1dJTjMyKSIpIGZvciB0aGF0IE9TLCBhbmQgT1Mtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlCisvLyBjb250ZW50cyBvZiB0aGlzIGZpbGUgbXVzdCBiZSBjcmVhdGVkLgorCisvLyBOT1RFOiBPdGhlciBPUy1zcGVjaWZpYyBjaGFuZ2VzIGFyZSBhbHNvIG5lZWRlZCBmb3IgdGhpcyBPUy4gIFNlYXJjaCBmb3IKKy8vIGZpbGVzIHdpdGggIldJTjMyIiBpbiBpdCwgYXMgYSBxdWljayB3YXkgdG8gZmluZCBmaWxlcyB0aGF0IG11c3QgYmUgY2hhbmdlZC4KKworI2VuZGlmICAvLyBkZWZpbmVkKF9XSU4zMikKKworI2VuZGlmICAvLyBURVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy90ZXN0X2Vudmlyb25tZW50LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3Rlc3RfZW52aXJvbm1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYWQ4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy90ZXN0X2Vudmlyb25tZW50LmNwcApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBNaWtlIFN0cm95YW4gPG1pa2VATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqLworCisjaW5jbHVkZSAidGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJsdnRfZnVuY3Rpb25fcG9pbnRlcnMuaCIKKyNpbmNsdWRlICJ0ZXN0X2Vudmlyb25tZW50LmgiCisKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorCituYW1lc3BhY2UgdmtfdGVzdGluZyB7CisKK0Vudmlyb25tZW50OjpFbnZpcm9ubWVudCgpIDogZGVmYXVsdF9kZXZfKDApIHsKKyAgICBhcHBfLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVBQTElDQVRJT05fSU5GTzsKKyAgICBhcHBfLnBBcHBsaWNhdGlvbk5hbWUgPSAidmtfdGVzdGluZyI7CisgICAgYXBwXy5hcHBsaWNhdGlvblZlcnNpb24gPSAxOworICAgIGFwcF8ucEVuZ2luZU5hbWUgPSAidmtfdGVzdGluZyI7CisgICAgYXBwXy5lbmdpbmVWZXJzaW9uID0gMTsKKyAgICBhcHBfLmFwaVZlcnNpb24gPSBWS19BUElfVkVSU0lPTl8xXzA7CisgICAgYXBwXy5wTmV4dCA9IE5VTEw7Cit9CisKK2Jvb2wgRW52aXJvbm1lbnQ6OnBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisjZGVmaW5lIEFSRyhuYW1lKSAoc3RyY21wKGFyZ3ZbaV0sIG5hbWUpID09IDApCisjZGVmaW5lIEFSR19QKG5hbWUpIChpIDwgYXJnYyAtIDEgJiYgQVJHKG5hbWUpKQorICAgICAgICBpZiAoQVJHX1AoIi0tZ3B1IikpIHsKKyAgICAgICAgICAgIGRlZmF1bHRfZGV2XyA9IGF0b2koYXJndlsrK2ldKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjdW5kZWYgQVJHCisjdW5kZWYgQVJHX1AKKyAgICB9CisKKyAgICBpZiAoaSA8IGFyZ2MpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJpbnZhbGlkIGFyZ3VtZW50OiAiIDw8IGFyZ3ZbaV0gPDwgIlxuXG4iCisgICAgICAgICAgICAgICAgICA8PCAiVXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIDxvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgICA8PCAiT3B0aW9uczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIC0tZ3B1IDxuPiAgVXNlIEdQVTxuPiBhcyB0aGUgZGVmYXVsdCBHUFVcbiI7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEVudmlyb25tZW50OjpTZXRVcCgpIHsKKyAgICBzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IGluc3RhbmNlX2V4dGVuc2lvbnM7CisgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBkZXZpY2VfZXh0ZW5zaW9uczsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gZGV2aWNlX2V4dGVuc2lvbl9uYW1lczsKKworICAgIGluc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgIGRldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpOworI2lmZGVmIF9XSU4zMgorICAgIGluc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1dJTjMyX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICBpbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisjZW5kaWYKKworICAgIFZrQm9vbDMyIGV4dEZvdW5kOworCisgICAgaW5zdGFuY2VfZXh0ZW5zaW9ucyA9IHZrX3Rlc3Rpbmc6OkdldEdsb2JhbEV4dGVuc2lvbnMoKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnN0YW5jZV9leHRlbnNpb25fbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZXh0Rm91bmQgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgaW5zdGFuY2VfZXh0ZW5zaW9ucy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzW2ldLCBpbnN0YW5jZV9leHRlbnNpb25zW2pdLmV4dGVuc2lvbk5hbWUpKSB7CisgICAgICAgICAgICAgICAgZXh0Rm91bmQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUShleHRGb3VuZCwgMSkgPDwgIkVSUk9SOiBDYW5ub3QgZmluZCBleHRlbnNpb24gbmFtZWQgIiA8PCBpbnN0YW5jZV9leHRlbnNpb25fbmFtZXNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBwYXNzIHRoaXMgdGVzdCI7CisgICAgfQorICAgIFZrSW5zdGFuY2VDcmVhdGVJbmZvIGluc3RfaW5mbyA9IHt9OworICAgIGluc3RfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPOworICAgIGluc3RfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgaW5zdF9pbmZvLnBBcHBsaWNhdGlvbkluZm8gPSAmYXBwXzsKKyAgICBpbnN0X2luZm8uZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnNpemUoKTsKKyAgICBpbnN0X2luZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSAoaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnNpemUoKSkgPyAmaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzWzBdIDogTlVMTDsKKyAgICBpbnN0X2luZm8uZW5hYmxlZExheWVyQ291bnQgPSAwOworICAgIGluc3RfaW5mby5wcEVuYWJsZWRMYXllck5hbWVzID0gTlVMTDsKKworICAgIFZrUmVzdWx0IGVycjsKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlSW5zdGFuY2UoJmluc3RfaW5mbywgTlVMTCwgJmluc3QpOworICAgIEFTU0VSVF9FUShWS19TVUNDRVNTLCBlcnIpOworICAgIGVyciA9IHZrOjpFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdCwgJmNvdW50LCBOVUxMKTsKKyAgICBBU1NFUlRfRVEoVktfU1VDQ0VTUywgZXJyKTsKKyAgICBBU1NFUlRfTEUoY291bnQsIEFSUkFZX1NJWkUoZ3B1cykpOworICAgIGVyciA9IHZrOjpFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdCwgJmNvdW50LCBncHVzKTsKKyAgICBBU1NFUlRfRVEoVktfU1VDQ0VTUywgZXJyKTsKKyAgICBBU1NFUlRfR1QoY291bnQsIGRlZmF1bHRfZGV2Xyk7CisKKyAgICB2a190ZXN0aW5nOjpQaHlzaWNhbERldmljZSBwaHlzX2RldihncHVzWzBdKTsKKyAgICBkZXZpY2VfZXh0ZW5zaW9ucyA9IHBoeXNfZGV2LmV4dGVuc2lvbnMoKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGV4dEZvdW5kID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGRldmljZV9leHRlbnNpb25zLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChkZXZpY2VfZXh0ZW5zaW9uX25hbWVzW2ldLCBkZXZpY2VfZXh0ZW5zaW9uc1tqXS5leHRlbnNpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIGV4dEZvdW5kID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfRVEoZXh0Rm91bmQsIDEpIDw8ICJFUlJPUjogQ2Fubm90IGZpbmQgZXh0ZW5zaW9uIG5hbWVkICIgPDwgZGV2aWNlX2V4dGVuc2lvbl9uYW1lc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIHBhc3MgdGhpcyB0ZXN0IjsKKyAgICB9CisKKyAgICBkZXZzXy5yZXNlcnZlKGNvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBkZXZzXy5wdXNoX2JhY2sobmV3IERldmljZShncHVzW2ldKSk7CisgICAgICAgIGlmIChpID09IGRlZmF1bHRfZGV2XykgeworICAgICAgICAgICAgZGV2c19baV0tPmluaXQoZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgICAgICAgICBBU1NFUlRfTkUodHJ1ZSwgZGV2c19baV0tPmdyYXBoaWNzX3F1ZXVlcygpLmVtcHR5KCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVudmlyb25tZW50OjpUZWFyRG93bigpIHsKKyAgICAvLyBkZXN0cm95IGRldmljZXMgZmlyc3QKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPERldmljZSAqPjo6aXRlcmF0b3IgaXQgPSBkZXZzXy5iZWdpbigpOyBpdCAhPSBkZXZzXy5lbmQoKTsgaXQrKykgZGVsZXRlICppdDsKKyAgICBkZXZzXy5jbGVhcigpOworCisgICAgaWYgKGluc3QpIHZrOjpEZXN0cm95SW5zdGFuY2UoaW5zdCwgTlVMTCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdmtfdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdGVzdF9lbnZpcm9ubWVudC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdGVzdF9lbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTdiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy90ZXN0X2Vudmlyb25tZW50LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBNaWtlIFN0cm95YW4gPG1pa2VATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqLworCisjaWZuZGVmIFRFU1RfRU5WSVJPTk1FTlRfSAorI2RlZmluZSBURVNUX0VOVklST05NRU5UX0gKKworI2luY2x1ZGUgInZrdGVzdGJpbmRpbmcuaCIKKworbmFtZXNwYWNlIHZrX3Rlc3RpbmcgeworY2xhc3MgRW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBFbnZpcm9ubWVudCgpOworCisgICAgYm9vbCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPERldmljZSAqPiAmZGV2aWNlcygpIHsgcmV0dXJuIGRldnNfOyB9CisgICAgRGV2aWNlICZkZWZhdWx0X2RldmljZSgpIHsgcmV0dXJuICooZGV2c19bZGVmYXVsdF9kZXZfXSk7IH0KKyAgICBWa0luc3RhbmNlIGdldF9pbnN0YW5jZSgpIHsgcmV0dXJuIGluc3Q7IH0KKyAgICBWa1BoeXNpY2FsRGV2aWNlIGdwdXNbMTZdOworCisgIHByaXZhdGU6CisgICAgVmtBcHBsaWNhdGlvbkluZm8gYXBwXzsKKyAgICB1aW50MzJfdCBkZWZhdWx0X2Rldl87CisgICAgVmtJbnN0YW5jZSBpbnN0OworCisgICAgc3RkOjp2ZWN0b3I8RGV2aWNlICo+IGRldnNfOworfTsKK30gIC8vIG5hbWVzcGFjZSB2a190ZXN0aW5nCisjZW5kaWYgIC8vIFRFU1RfRU5WSVJPTk1FTlRfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtfbGF5ZXJfc2V0dGluZ3MudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtfbGF5ZXJfc2V0dGluZ3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOGRhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a19sYXllcl9zZXR0aW5ncy50eHQKQEAgLTAsMCArMSw4IEBACitsdW5hcmdfY29yZV92YWxpZGF0aW9uLnJlcG9ydF9mbGFncyA9IGVycm9yCitsdW5hcmdfY29yZV92YWxpZGF0aW9uLmRlYnVnX2FjdGlvbiA9IFZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TRworbHVuYXJnX29iamVjdF90cmFja2VyLnJlcG9ydF9mbGFncyA9IGVycm9yCitsdW5hcmdfb2JqZWN0X3RyYWNrZXIuZGVidWdfYWN0aW9uID0gVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHCitsdW5hcmdfcGFyYW1ldGVyX3ZhbGlkYXRpb24ucmVwb3J0X2ZsYWdzID0gZXJyb3IKK2x1bmFyZ19wYXJhbWV0ZXJfdmFsaWRhdGlvbi5kZWJ1Z19hY3Rpb24gPSBWS19EQkdfTEFZRVJfQUNUSU9OX0xPR19NU0cKK2dvb2dsZV90aHJlYWRpbmcucmVwb3J0X2ZsYWdzID0gZXJyb3IKK2dvb2dsZV90aHJlYWRpbmcuZGVidWdfYWN0aW9uID0gVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzLnZjeHByb2oudXNlciBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHMudmN4cHJvai51c2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlM2Y3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzLnZjeHByb2oudXNlcgpAQCAtMCwwICsxLDM1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxMi4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxXaXRoRGViSW5mb3x4NjQnIj4KKyAgICA8TG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PlZLX0xBWUVSX1BBVEg9JChTb2x1dGlvbkRpcilcbGF5ZXJzXCQoQ29uZmlndXJhdGlvbik8L0xvY2FsRGVidWdnZXJFbnZpcm9ubWVudD4KKyAgICA8RGVidWdnZXJGbGF2b3I+V2luZG93c0xvY2FsRGVidWdnZXI8L0RlYnVnZ2VyRmxhdm9yPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPExvY2FsRGVidWdnZXJFbnZpcm9ubWVudD5WS19MQVlFUl9QQVRIPSQoU29sdXRpb25EaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPExvY2FsRGVidWdnZXJFbnZpcm9ubWVudD5WS19MQVlFUl9QQVRIPSQoU29sdXRpb25EaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J01pblNpemVSZWx8eDY0JyI+CisgICAgPExvY2FsRGVidWdnZXJFbnZpcm9ubWVudD5WS19MQVlFUl9QQVRIPSQoU29sdXRpb25EaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbFdpdGhEZWJJbmZvfFdpbjMyJyI+CisgICAgPExvY2FsRGVidWdnZXJFbnZpcm9ubWVudD5WS19MQVlFUl9QQVRIPSQoU29sdXRpb25EaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExvY2FsRGVidWdnZXJFbnZpcm9ubWVudD5WS19MQVlFUl9QQVRIPSQoU29sdXRpb25EaXIpXGxheWVyc1wkKENvbmZpZ3VyYXRpb24pPC9Mb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+CisgICAgPERlYnVnZ2VyRmxhdm9yPldpbmRvd3NMb2NhbERlYnVnZ2VyPC9EZWJ1Z2dlckZsYXZvcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J01pblNpemVSZWx8V2luMzInIj4KKyAgICA8TG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PlZLX0xBWUVSX1BBVEg9JChTb2x1dGlvbkRpcilcbGF5ZXJzXCQoQ29uZmlndXJhdGlvbik8L0xvY2FsRGVidWdnZXJFbnZpcm9ubWVudD4KKyAgICA8RGVidWdnZXJGbGF2b3I+V2luZG93c0xvY2FsRGVidWdnZXI8L0RlYnVnZ2VyRmxhdm9yPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxMb2NhbERlYnVnZ2VyRW52aXJvbm1lbnQ+VktfTEFZRVJfUEFUSD0kKFNvbHV0aW9uRGlyKVxsYXllcnNcJChDb25maWd1cmF0aW9uKTwvTG9jYWxEZWJ1Z2dlckVudmlyb25tZW50PgorICAgIDxEZWJ1Z2dlckZsYXZvcj5XaW5kb3dzTG9jYWxEZWJ1Z2dlcjwvRGVidWdnZXJGbGF2b3I+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a2xheWVydGVzdHNfYmVzdF9wcmFjdGljZXMuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtsYXllcnRlc3RzX2Jlc3RfcHJhY3RpY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDFkZGIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtsYXllcnRlc3RzX2Jlc3RfcHJhY3RpY2VzLmNwcApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogQXV0aG9yOiBDYW1kZW4gU3RvY2tlciA8Y2FtZGVuQGx1bmFyZy5jb20+CisgKi8KKworI2luY2x1ZGUgImNhc3RfdXRpbHMuaCIKKyNpbmNsdWRlICJsYXllcl92YWxpZGF0aW9uX3Rlc3RzLmgiCisKK3ZvaWQgVmtCZXN0UHJhY3RpY2VzTGF5ZXJUZXN0OjpJbml0QmVzdFByYWN0aWNlc0ZyYW1ld29yaygpIHsKKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIGVuYWJsZXNbXSA9IHtWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0JFU1RfUFJBQ1RJQ0VTX0VYVH07CisgICAgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgZmVhdHVyZXMgPSB7fTsKKyAgICBmZWF0dXJlcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUOworICAgIGZlYXR1cmVzLmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID0gMTsKKyAgICBmZWF0dXJlcy5wRW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlcyA9IGVuYWJsZXM7CisKKyAgICBJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IsICZmZWF0dXJlcyk7Cit9CisKK1RFU1RfRihWa0Jlc3RQcmFjdGljZXNMYXllclRlc3QsIENtZENsZWFyQXR0YWNobWVudFRlc3QpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IGZvciB2YWxpZGF0aW5nIHVzYWdlIG9mIHZrQ21kQ2xlYXJBdHRhY2htZW50cyIpOworCisgICAgSW5pdEJlc3RQcmFjdGljZXNGcmFtZXdvcmsoKTsKKyAgICBJbml0U3RhdGUoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisKKyAgICAvLyBNYWluIHRoaW5nIHdlIGNhcmUgYWJvdXQgZm9yIHRoaXMgdGVzdCBpcyB0aGF0IHRoZSBWa0ltYWdlIG9iaiB3ZSdyZQorICAgIC8vIGNsZWFyaW5nIG1hdGNoZXMgQ29sb3IgQXR0YWNobWVudCBvZiBGQgorICAgIC8vICBBbHNvIHBhc3MgZG93biBvdGhlciBkdW1teSBwYXJhbXMgdG8ga2VlcCBkcml2ZXIgYW5kIHBhcmFtY2hlY2tlciBoYXBweQorICAgIFZrQ2xlYXJBdHRhY2htZW50IGNvbG9yX2F0dGFjaG1lbnQ7CisgICAgY29sb3JfYXR0YWNobWVudC5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlswXSA9IDEuMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlsxXSA9IDEuMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlsyXSA9IDEuMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlszXSA9IDEuMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNvbG9yQXR0YWNobWVudCA9IDA7CisgICAgVmtDbGVhclJlY3QgY2xlYXJfcmVjdCA9IHt7ezAsIDB9LCB7KHVpbnQzMl90KW1fd2lkdGgsICh1aW50MzJfdCltX2hlaWdodH19LCAwLCAxfTsKKworICAgIC8vIENhbGwgZm9yIGZ1bGwtc2l6ZWQgRkIgQ29sb3IgYXR0YWNobWVudCBwcmlvciB0byBpc3N1aW5nIGEgRHJhdworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtQ2xlYXJDbWRCZWZvcmVEcmF3Iik7CisgICAgdms6OkNtZENsZWFyQXR0YWNobWVudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJmNvbG9yX2F0dGFjaG1lbnQsIDEsICZjbGVhcl9yZWN0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19idWZmZXJfaW1hZ2VfbWVtb3J5X3NhbXBsZXIuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtsYXllcnRlc3RzX2J1ZmZlcl9pbWFnZV9tZW1vcnlfc2FtcGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwMzkyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19idWZmZXJfaW1hZ2VfbWVtb3J5X3NhbXBsZXIuY3BwCkBAIC0wLDAgKzEsNzY0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjbm9ydGhyb3BAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKZXJlbXkgS25pYWdlciA8amVyZW15a0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBTaGFubm9uIE1jUGhlcnNvbiA8c2hhbm5vbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlICJjYXN0X3V0aWxzLmgiCisjaW5jbHVkZSAibGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5oIgorCitURVNUX0YoVmtMYXllclRlc3QsIEJ1ZmZlckV4dGVudHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJQZXJmb3JtIGNvcGllcyBhY3Jvc3MgYSBidWZmZXIsIHByb3Zva2luZyBvdXQtb2YtcmFuZ2UgZXJyb3JzLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgY29uc3QgVmtEZXZpY2VTaXplIGJ1ZmZlcl9zaXplID0gMjA0ODsKKworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcl9vbmU7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyX3R3bzsKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IDA7CisgICAgYnVmZmVyX29uZS5pbml0X2FzX3NyY19hbmRfZHN0KCptX2RldmljZSwgYnVmZmVyX3NpemUsIHJlcXMpOworICAgIGJ1ZmZlcl90d28uaW5pdF9hc19zcmNfYW5kX2RzdCgqbV9kZXZpY2UsIGJ1ZmZlcl9zaXplLCByZXFzKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNyY09mZnNldC0wMDExMyIpOworICAgIFZrQnVmZmVyQ29weSBjb3B5X2luZm8gPSB7NDA5NiwgMjU2LCAyNTZ9OworICAgIHZrOjpDbWRDb3B5QnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl9vbmUuaGFuZGxlKCksIGJ1ZmZlcl90d28uaGFuZGxlKCksIDEsICZjb3B5X2luZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlCdWZmZXItZHN0T2Zmc2V0LTAwMTE0Iik7CisgICAgY29weV9pbmZvID0gezI1NiwgNDA5NiwgMjU2fTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfb25lLmhhbmRsZSgpLCBidWZmZXJfdHdvLmhhbmRsZSgpLCAxLCAmY29weV9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNpemUtMDAxMTUiKTsKKyAgICBjb3B5X2luZm8gPSB7MTAyNCwgMjU2LCAxMjgwfTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfb25lLmhhbmRsZSgpLCBidWZmZXJfdHdvLmhhbmRsZSgpLCAxLCAmY29weV9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXNpemUtMDAxMTYiKTsKKyAgICBjb3B5X2luZm8gPSB7MjU2LCAxMDI0LCAxMjgwfTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfb25lLmhhbmRsZSgpLCBidWZmZXJfdHdvLmhhbmRsZSgpLCAxLCAmY29weV9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyLXBSZWdpb25zLTAwMTE3Iik7CisgICAgY29weV9pbmZvID0gezI1NiwgNTEyLCA1MTJ9OworICAgIHZrOjpDbWRDb3B5QnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl90d28uaGFuZGxlKCksIGJ1ZmZlcl90d28uaGFuZGxlKCksIDEsICZjb3B5X2luZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNaXJyb3JDbGFtcFRvRWRnZU5vdEVuYWJsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWYWxpZGF0aW9uIHNob3VsZCBjYXRjaCB1c2luZyBDTEFNUF9UT19FREdFIGFkZHJlc3NpbmcgbW9kZSBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBlbmFibGVkLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby1hZGRyZXNzTW9kZVUtMDEwNzkiKTsKKyAgICBWa1NhbXBsZXIgc2FtcGxlciA9IFZLX05VTExfSEFORExFOworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9pbmZvID0gU2FmZVNhbmVTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgIC8vIFNldCB0aGUgbW9kZXMgdG8gY2F1c2UgdGhlIGVycm9yCisgICAgc2FtcGxlcl9pbmZvLmFkZHJlc3NNb2RlVSA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFOworICAgIHNhbXBsZXJfaW5mby5hZGRyZXNzTW9kZVYgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRTsKKyAgICBzYW1wbGVyX2luZm8uYWRkcmVzc01vZGVXID0gVktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SX0NMQU1QX1RPX0VER0U7CisKKyAgICB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2luZm8sIE5VTEwsICZzYW1wbGVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBBbmlzb3Ryb3B5RmVhdHVyZURpc2FibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmFsaWRhdGlvbiBzaG91bGQgY2hlY2sgYW5pc290cm9weSBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0IHdpdGggc2FtcGxlckFuaXNvdHJvcHkgZGlzYWJsZWQuIik7CisKKyAgICAvLyBEZXRlcm1pbmUgaWYgcmVxdWlyZWQgZGV2aWNlIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZGV2aWNlX2ZlYXR1cmVzID0ge307CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcygmZGV2aWNlX2ZlYXR1cmVzKSk7CisgICAgZGV2aWNlX2ZlYXR1cmVzLnNhbXBsZXJBbmlzb3Ryb3B5ID0gVktfRkFMU0U7ICAvLyBmb3JjZSBhbmlzb3Ryb3B5IG9mZgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgmZGV2aWNlX2ZlYXR1cmVzKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYW5pc290cm9weUVuYWJsZS0wMTA3MCIpOworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9pbmZvID0gU2FmZVNhbmVTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgIC8vIFdpdGggdGhlIHNhbXBsZXJBbmlzb3Ryb3B5IGRpc2FibGUsIHRoZSBzYW1wbGVyIG11c3Qgbm90IGVuYWJsZSBpdC4KKyAgICBzYW1wbGVyX2luZm8uYW5pc290cm9weUVuYWJsZSA9IFZLX1RSVUU7CisgICAgVmtTYW1wbGVyIHNhbXBsZXIgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIFZrUmVzdWx0IGVycjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2luZm8sIE5VTEwsICZzYW1wbGVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoVktfU1VDQ0VTUyA9PSBlcnIpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FtcGxlciwgTlVMTCk7CisgICAgfQorICAgIHNhbXBsZXIgPSBWS19OVUxMX0hBTkRMRTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBBbmlzb3Ryb3B5RmVhdHVyZUVuYWJsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWYWxpZGF0aW9uIG11c3QgY2hlY2sgc2V2ZXJhbCBjb25kaXRpb25zIHRoYXQgYXBwbHkgb25seSB3aGVuIEFuaXNvdHJvcHkgaXMgZW5hYmxlZC4iKTsKKworICAgIC8vIERldGVybWluZSBpZiByZXF1aXJlZCBkZXZpY2UgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZQorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBkZXZpY2VfZmVhdHVyZXMgPSB7fTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKCZkZXZpY2VfZmVhdHVyZXMpKTsKKworICAgIC8vIFRoZXNlIHRlc3RzIHJlcXVpcmUgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnQgYW5pc290cm9waWMgZmlsdGVyaW5nCisgICAgaWYgKFZLX1RSVUUgIT0gZGV2aWNlX2ZlYXR1cmVzLnNhbXBsZXJBbmlzb3Ryb3B5KSB7CisgICAgICAgIHByaW50ZigiJXMgVGVzdCByZXF1aXJlcyB1bnN1cHBvcnRlZCBzYW1wbGVyQW5pc290cm9weSBmZWF0dXJlLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBjdWJpY19zdXBwb3J0ID0gZmFsc2U7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgIlZLX0lNR19maWx0ZXJfY3ViaWMiKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKCJWS19JTUdfZmlsdGVyX2N1YmljIik7CisgICAgICAgIGN1YmljX3N1cHBvcnQgPSB0cnVlOworICAgIH0KKworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9pbmZvX3JlZiA9IFNhZmVTYW5lU2FtcGxlckNyZWF0ZUluZm8oKTsKKyAgICBzYW1wbGVyX2luZm9fcmVmLmFuaXNvdHJvcHlFbmFibGUgPSBWS19UUlVFOworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9pbmZvID0gc2FtcGxlcl9pbmZvX3JlZjsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICAvLyBtYXhBbmlzb3Ryb3B5IG91dC1vZi1ib3VuZHMgbG93LgorICAgIHNhbXBsZXJfaW5mby5tYXhBbmlzb3Ryb3B5ID0gTmVhcmVzdFNtYWxsZXIoMS4wRik7CisgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYW5pc290cm9weUVuYWJsZS0wMTA3MSIpOworICAgIHNhbXBsZXJfaW5mby5tYXhBbmlzb3Ryb3B5ID0gc2FtcGxlcl9pbmZvX3JlZi5tYXhBbmlzb3Ryb3B5OworCisgICAgLy8gbWF4QW5pc290cm9weSBvdXQtb2YtYm91bmRzIGhpZ2guCisgICAgc2FtcGxlcl9pbmZvLm1heEFuaXNvdHJvcHkgPSBOZWFyZXN0R3JlYXRlcihtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhTYW1wbGVyQW5pc290cm9weSk7CisgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tYW5pc290cm9weUVuYWJsZS0wMTA3MSIpOworICAgIHNhbXBsZXJfaW5mby5tYXhBbmlzb3Ryb3B5ID0gc2FtcGxlcl9pbmZvX3JlZi5tYXhBbmlzb3Ryb3B5OworCisgICAgLy8gQm90aCBhbmlzb3Ryb3B5IGFuZCB1bm5vcm1hbGl6ZWQgY29vcmRzIGVuYWJsZWQKKyAgICBzYW1wbGVyX2luZm8udW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgPSBWS19UUlVFOworICAgIC8vIElmIHVubm9ybWFsaXplZENvb3JkaW5hdGVzIGlzIFZLX1RSVUUsIG1pbkxvZCBhbmQgbWF4TG9kIG11c3QgYmUgemVybworICAgIHNhbXBsZXJfaW5mby5taW5Mb2QgPSAwOworICAgIHNhbXBsZXJfaW5mby5tYXhMb2QgPSAwOworICAgIENyZWF0ZVNhbXBsZXJUZXN0KCp0aGlzLCAmc2FtcGxlcl9pbmZvLCAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDc2Iik7CisgICAgc2FtcGxlcl9pbmZvLnVubm9ybWFsaXplZENvb3JkaW5hdGVzID0gc2FtcGxlcl9pbmZvX3JlZi51bm5vcm1hbGl6ZWRDb29yZGluYXRlczsKKworICAgIC8vIEJvdGggYW5pc290cm9weSBhbmQgY3ViaWMgZmlsdGVyaW5nIGVuYWJsZWQKKyAgICBpZiAoY3ViaWNfc3VwcG9ydCkgeworICAgICAgICBzYW1wbGVyX2luZm8ubWluRmlsdGVyID0gVktfRklMVEVSX0NVQklDX0lNRzsKKyAgICAgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWFnRmlsdGVyLTAxMDgxIik7CisgICAgICAgIHNhbXBsZXJfaW5mby5taW5GaWx0ZXIgPSBzYW1wbGVyX2luZm9fcmVmLm1pbkZpbHRlcjsKKworICAgICAgICBzYW1wbGVyX2luZm8ubWFnRmlsdGVyID0gVktfRklMVEVSX0NVQklDX0lNRzsKKyAgICAgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tbWFnRmlsdGVyLTAxMDgxIik7CisgICAgICAgIHNhbXBsZXJfaW5mby5tYWdGaWx0ZXIgPSBzYW1wbGVyX2luZm9fcmVmLm1hZ0ZpbHRlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFRlc3QgcmVxdWlyZXMgdW5zdXBwb3J0ZWQgZXh0ZW5zaW9uIFwiVktfSU1HX2ZpbHRlcl9jdWJpY1wiLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBVbm5vcm1hbGl6ZWRDb29yZGluYXRlc0VuYWJsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWYWxpZGF0ZSByZXN0cmljdGlvbnMgb24gc2FtcGxlciBwYXJhbWV0ZXJzIHdoZW4gdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMgaXMgdHJ1ZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9pbmZvX3JlZiA9IFNhZmVTYW5lU2FtcGxlckNyZWF0ZUluZm8oKTsKKyAgICBzYW1wbGVyX2luZm9fcmVmLnVubm9ybWFsaXplZENvb3JkaW5hdGVzID0gVktfVFJVRTsKKyAgICBzYW1wbGVyX2luZm9fcmVmLm1pbkxvZCA9IDAuMGY7CisgICAgc2FtcGxlcl9pbmZvX3JlZi5tYXhMb2QgPSAwLjBmOworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9pbmZvID0gc2FtcGxlcl9pbmZvX3JlZjsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICAvLyBtaW4gYW5kIG1hZyBmaWx0ZXJzIG11c3QgYmUgdGhlIHNhbWUKKyAgICBzYW1wbGVyX2luZm8ubWluRmlsdGVyID0gVktfRklMVEVSX05FQVJFU1Q7CisgICAgc2FtcGxlcl9pbmZvLm1hZ0ZpbHRlciA9IFZLX0ZJTFRFUl9MSU5FQVI7CisgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzIiKTsKKyAgICBzdGQ6OnN3YXAoc2FtcGxlcl9pbmZvLm1pbkZpbHRlciwgc2FtcGxlcl9pbmZvLm1hZ0ZpbHRlcik7CisgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzIiKTsKKyAgICBzYW1wbGVyX2luZm8gPSBzYW1wbGVyX2luZm9fcmVmOworCisgICAgLy8gbWlwbWFwTW9kZSBtdXN0IGJlIE5FQVJFU1QKKyAgICBzYW1wbGVyX2luZm8ubWlwbWFwTW9kZSA9IFZLX1NBTVBMRVJfTUlQTUFQX01PREVfTElORUFSOworICAgIENyZWF0ZVNhbXBsZXJUZXN0KCp0aGlzLCAmc2FtcGxlcl9pbmZvLCAiVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDczIik7CisgICAgc2FtcGxlcl9pbmZvID0gc2FtcGxlcl9pbmZvX3JlZjsKKworICAgIC8vIG1pbmxvZCBhbmQgbWF4bG9kIG11c3QgYmUgemVybworICAgIHNhbXBsZXJfaW5mby5tYXhMb2QgPSAzLjE0MTU5ZjsKKyAgICBDcmVhdGVTYW1wbGVyVGVzdCgqdGhpcywgJnNhbXBsZXJfaW5mbywgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3NCIpOworICAgIHNhbXBsZXJfaW5mby5taW5Mb2QgPSAyLjcxODI4ZjsKKyAgICBDcmVhdGVTYW1wbGVyVGVzdCgqdGhpcywgJnNhbXBsZXJfaW5mbywgIlZVSUQtVmtTYW1wbGVyQ3JlYXRlSW5mby11bm5vcm1hbGl6ZWRDb29yZGluYXRlcy0wMTA3NCIpOworICAgIHNhbXBsZXJfaW5mbyA9IHNhbXBsZXJfaW5mb19yZWY7CisKKyAgICAvLyBhZGRyZXNzTW9kZVUgYW5kIGFkZHJlc3NNb2RlViBtdXN0IGJvdGggYmUgQ0xBTVBfVE9fRURHRSBvciBDTEFNUF9UT19CT1JERVIKKyAgICAvLyBjaGVja3MgYWxsIDEyIGludmFsaWQgY29tYmluYXRpb25zIG91dCBvZiAxNiB0b3RhbCBjb21iaW5hdGlvbnMKKyAgICBjb25zdCBzdGQ6OmFycmF5PFZrU2FtcGxlckFkZHJlc3NNb2RlLCA0PiBrQWRkcmVzc01vZGVzID0ge3sKKyAgICAgICAgVktfU0FNUExFUl9BRERSRVNTX01PREVfUkVQRUFULAorICAgICAgICBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JFRF9SRVBFQVQsCisgICAgICAgIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UsCisgICAgICAgIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0JPUkRFUiwKKyAgICB9fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gdW1vZGUgOiBrQWRkcmVzc01vZGVzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byB2bW9kZSA6IGtBZGRyZXNzTW9kZXMpIHsKKyAgICAgICAgICAgIGlmICgodW1vZGUgIT0gVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRSAmJiB1bW9kZSAhPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19CT1JERVIpIHx8CisgICAgICAgICAgICAgICAgKHZtb2RlICE9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UgJiYgdm1vZGUgIT0gVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fQk9SREVSKSkgeworICAgICAgICAgICAgICAgIHNhbXBsZXJfaW5mby5hZGRyZXNzTW9kZVUgPSB1bW9kZTsKKyAgICAgICAgICAgICAgICBzYW1wbGVyX2luZm8uYWRkcmVzc01vZGVWID0gdm1vZGU7CisgICAgICAgICAgICAgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzYW1wbGVyX2luZm8gPSBzYW1wbGVyX2luZm9fcmVmOworCisgICAgLy8gVlVJRC1Wa1NhbXBsZXJDcmVhdGVJbmZvLXVubm9ybWFsaXplZENvb3JkaW5hdGVzLTAxMDc2IGlzIHRlc3RlZCBpbiBBbmlzb3Ryb3B5RmVhdHVyZUVuYWJsZWQgYWJvdmUKKyAgICAvLyBTaW5jZSBpdCByZXF1aXJlcyBjaGVja2luZy9lbmFibGluZyB0aGUgYW5pc290cm9waWMgZmlsdGVyaW5nIGZlYXR1cmUsIGl0J3MgZWFzaWVyIHRvIGRvIGl0CisgICAgLy8gd2l0aCB0aGUgb3RoZXIgYW5pc290cm9waWMgdGVzdHMuCisKKyAgICAvLyBjb21wYXJlRW5hYmxlIG11c3QgYmUgVktfRkFMU0UKKyAgICBzYW1wbGVyX2luZm8uY29tcGFyZUVuYWJsZSA9IFZLX1RSVUU7CisgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJWVUlELVZrU2FtcGxlckNyZWF0ZUluZm8tdW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMtMDEwNzciKTsKKyAgICBzYW1wbGVyX2luZm8gPSBzYW1wbGVyX2luZm9fcmVmOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFVwZGF0ZUJ1ZmZlckFsaWdubWVudCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNoZWNrIGFsaWdubWVudCBwYXJhbWV0ZXJzIGZvciB2a0NtZFVwZGF0ZUJ1ZmZlciIpOworICAgIHVpbnQzMl90IHVwZGF0ZURhdGFbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUOworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBidWZmZXIuaW5pdF9hc19kc3QoKm1fZGV2aWNlLCAoVmtEZXZpY2VTaXplKTIwLCByZXFzKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSB1c2luZyBkc3RPZmZzZXQgdGhhdCBpcyBub3QgbXVsdGlwbGUgb2YgNAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5VcGRhdGVCdWZmZXIoYnVmZmVyLmhhbmRsZSgpLCAxLCA0LCB1cGRhdGVEYXRhKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEludHJvZHVjZSBmYWlsdXJlIGJ5IHVzaW5nIGRhdGFTaXplIHRoYXQgaXMgbm90IG11bHRpcGxlIG9mIDQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+VXBkYXRlQnVmZmVyKGJ1ZmZlci5oYW5kbGUoKSwgMCwgNiwgdXBkYXRlRGF0YSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSB1c2luZyBkYXRhU2l6ZSB0aGF0IGlzIDwgMAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byA2NTUzNiIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+VXBkYXRlQnVmZmVyKGJ1ZmZlci5oYW5kbGUoKSwgMCwgKFZrRGV2aWNlU2l6ZSktNDQsIHVwZGF0ZURhdGEpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gSW50cm9kdWNlIGZhaWx1cmUgYnkgdXNpbmcgZGF0YVNpemUgdGhhdCBpcyA+IDY1NTM2CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDY1NTM2Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5VcGRhdGVCdWZmZXIoYnVmZmVyLmhhbmRsZSgpLCAwLCAoVmtEZXZpY2VTaXplKTgwMDAwLCB1cGRhdGVEYXRhKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRmlsbEJ1ZmZlckFsaWdubWVudEFuZFNpemUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDaGVjayBhbGlnbm1lbnQgYW5kIHNpemUgcGFyYW1ldGVycyBmb3IgdmtDbWRGaWxsQnVmZmVyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIHJlcXMgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVDsKKyAgICBWa0J1ZmZlck9iaiBidWZmZXI7CisgICAgYnVmZmVyLmluaXRfYXNfZHN0KCptX2RldmljZSwgKFZrRGV2aWNlU2l6ZSkyMCwgcmVxcyk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSB1c2luZyBkc3RPZmZzZXQgZ3JlYXRlciB0aGFuIGJ1ZmZlclNpemUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRmlsbEJ1ZmZlci1kc3RPZmZzZXQtMDAwMjQiKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkZpbGxCdWZmZXIoYnVmZmVyLmhhbmRsZSgpLCA0MCwgNCwgMHgxMTExMTExMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSB1c2luZyBzaXplIDw9IGJ1ZmZlcnNpemUgbWludXMgZHN0b2Zmc2V0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEZpbGxCdWZmZXItc2l6ZS0wMDAyNyIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RmlsbEJ1ZmZlcihidWZmZXIuaGFuZGxlKCksIDE2LCAxMiwgMHgxMTExMTExMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSB1c2luZyBkc3RPZmZzZXQgdGhhdCBpcyBub3QgbXVsdGlwbGUgb2YgNAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5GaWxsQnVmZmVyKGJ1ZmZlci5oYW5kbGUoKSwgMSwgNCwgMHgxMTExMTExMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSB1c2luZyBzaXplIHRoYXQgaXMgbm90IG11bHRpcGxlIG9mIDQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RmlsbEJ1ZmZlcihidWZmZXIuaGFuZGxlKCksIDAsIDYsIDB4MTExMTExMTEpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gSW50cm9kdWNlIGZhaWx1cmUgYnkgdXNpbmcgc2l6ZSB0aGF0IGlzIHplcm8KKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5GaWxsQnVmZmVyKGJ1ZmZlci5oYW5kbGUoKSwgMCwgMCwgMHgxMTExMTExMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFNwYXJzZUJpbmRpbmdJbWFnZUJ1ZmZlckNyZWF0ZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBidWZmZXIvaW1hZ2Ugd2l0aCBzcGFyc2UgYXR0cmlidXRlcyBidXQgd2l0aG91dCB0aGUgc3BhcnNlX2JpbmRpbmcgYml0IHNldCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZfaW5mbyA9IHt9OworICAgIGJ1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1Zl9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBidWZfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgIGJ1Zl9pbmZvLnNpemUgPSAyMDQ4OworICAgIGJ1Zl9pbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDA7CisgICAgYnVmX2luZm8ucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IE5VTEw7CisgICAgYnVmX2luZm8uc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworCisgICAgaWYgKG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnNwYXJzZVJlc2lkZW5jeUJ1ZmZlcikgeworICAgICAgICBidWZfaW5mby5mbGFncyA9IFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQ7CisgICAgICAgIENyZWF0ZUJ1ZmZlclRlc3QoKnRoaXMsICZidWZfaW5mbywgIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAwOTE4Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IHJlcXVpcmVzIHVuc3VwcG9ydGVkIHNwYXJzZVJlc2lkZW5jeUJ1ZmZlciBmZWF0dXJlLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnNwYXJzZVJlc2lkZW5jeUFsaWFzZWQpIHsKKyAgICAgICAgYnVmX2luZm8uZmxhZ3MgPSBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9BTElBU0VEX0JJVDsKKyAgICAgICAgQ3JlYXRlQnVmZmVyVGVzdCgqdGhpcywgJmJ1Zl9pbmZvLCAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDA5MTgiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFRlc3QgcmVxdWlyZXMgdW5zdXBwb3J0ZWQgc3BhcnNlUmVzaWRlbmN5QWxpYXNlZCBmZWF0dXJlLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSA1MTI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDY0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKworICAgIGlmIChtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKS5zcGFyc2VSZXNpZGVuY3lJbWFnZTJEKSB7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzID0gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUOworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDA5ODciKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFRlc3QgcmVxdWlyZXMgdW5zdXBwb3J0ZWQgc3BhcnNlUmVzaWRlbmN5SW1hZ2UyRCBmZWF0dXJlLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnNwYXJzZVJlc2lkZW5jeUFsaWFzZWQpIHsKKyAgICAgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUOworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDA5ODciKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFRlc3QgcmVxdWlyZXMgdW5zdXBwb3J0ZWQgc3BhcnNlUmVzaWRlbmN5QWxpYXNlZCBmZWF0dXJlLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFNwYXJzZVJlc2lkZW5jeUltYWdlQ3JlYXRlVW5zdXBwb3J0ZWRUeXBlcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBpbWFnZXMgd2l0aCBzcGFyc2UgcmVzaWRlbmN5IHdpdGggdW5zdXBwb3J0ZWQgdHlwZXMiKTsKKworICAgIC8vIERldGVybWluZSB3aGljaCBkZXZpY2UgZmVhdHVyZSBhcmUgYXZhaWxhYmxlCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGRldmljZV9mZWF0dXJlcyA9IHt9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoJmRldmljZV9mZWF0dXJlcykpOworCisgICAgLy8gTWFzayBvdXQgZGV2aWNlIGZlYXR1cmVzIHdlIGRvbid0IHdhbnQgYW5kIGluaXRpYWxpemUgZGV2aWNlIHN0YXRlCisgICAgZGV2aWNlX2ZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeUltYWdlMkQgPSBWS19GQUxTRTsKKyAgICBkZXZpY2VfZmVhdHVyZXMuc3BhcnNlUmVzaWRlbmN5SW1hZ2UzRCA9IFZLX0ZBTFNFOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgmZGV2aWNlX2ZlYXR1cmVzKSk7CisKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnNwYXJzZUJpbmRpbmcpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IHJlcXVpcmVzIHVuc3VwcG9ydGVkIHNwYXJzZUJpbmRpbmcgZmVhdHVyZS4gU2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8xRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gNTEyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVCB8IFZLX0JVRkZFUl9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUOworCisgICAgLy8gMUQgaW1hZ2Ugdy8gc3BhcnNlIHJlc2lkZW5jeSBpcyBhbiBlcnJvcgorICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NyZWF0ZV9pbmZvLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzAiKTsKKworICAgIC8vIDJEIGltYWdlIHcvIHNwYXJzZSByZXNpZGVuY3kgd2hlbiBmZWF0dXJlIGlzbid0IGF2YWlsYWJsZQorICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDY0OworICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NyZWF0ZV9pbmZvLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzEiKTsKKworICAgIC8vIDNEIGltYWdlIHcvIHNwYXJzZSByZXNpZGVuY3kgd2hlbiBmZWF0dXJlIGlzbid0IGF2YWlsYWJsZQorICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfM0Q7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gODsKKyAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTcyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU3BhcnNlUmVzaWRlbmN5SW1hZ2VDcmVhdGVVbnN1cHBvcnRlZFNhbXBsZXMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgaW1hZ2VzIHdpdGggc3BhcnNlIHJlc2lkZW5jeSB3aXRoIHVuc3VwcG9ydGVkIHRpbGluZyBvciBzYW1wbGUgY291bnRzIik7CisKKyAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGV2aWNlIGZlYXR1cmUgYXJlIGF2YWlsYWJsZQorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBkZXZpY2VfZmVhdHVyZXMgPSB7fTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKCZkZXZpY2VfZmVhdHVyZXMpKTsKKworICAgIC8vIFRoZXNlIHRlc3RzIHJlcXVpcmUgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnQgc3BhcnNlIHJlc2lkZW5jeSBmb3IgMkQgaW1hZ2VzCisgICAgaWYgKFZLX1RSVUUgIT0gZGV2aWNlX2ZlYXR1cmVzLnNwYXJzZVJlc2lkZW5jeUltYWdlMkQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IHJlcXVpcmVzIHVuc3VwcG9ydGVkIFNwYXJzZVJlc2lkZW5jeUltYWdlMkQgZmVhdHVyZS4gU2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE1hc2sgb3V0IGRldmljZSBmZWF0dXJlcyB3ZSBkb24ndCB3YW50IGFuZCBpbml0aWFsaXplIGRldmljZSBzdGF0ZQorICAgIGRldmljZV9mZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3kyU2FtcGxlcyA9IFZLX0ZBTFNFOworICAgIGRldmljZV9mZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3k0U2FtcGxlcyA9IFZLX0ZBTFNFOworICAgIGRldmljZV9mZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3k4U2FtcGxlcyA9IFZLX0ZBTFNFOworICAgIGRldmljZV9mZWF0dXJlcy5zcGFyc2VSZXNpZGVuY3kxNlNhbXBsZXMgPSBWS19GQUxTRTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoJmRldmljZV9mZWF0dXJlcykpOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSA2NDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID0gMDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQgfCBWS19CVUZGRVJfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVDsKKworICAgIC8vIDJEIGltYWdlIHcvIHNwYXJzZSByZXNpZGVuY3kgYW5kIGxpbmVhciB0aWxpbmcgaXMgYW4gZXJyb3IKKyAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgIlZLX0lNQUdFX0NSRUFURV9TUEFSU0VfUkVTSURFTkNZX0JJVCB0aGVuIGltYWdlIHRpbGluZyBvZiBWS19JTUFHRV9USUxJTkdfTElORUFSIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKworICAgIC8vIE11bHRpLXNhbXBsZSBpbWFnZSB3LyBzcGFyc2UgcmVzaWRlbmN5IHdoZW4gZmVhdHVyZSBpc24ndCBhdmFpbGFibGUgKDQgZmxhdm9ycykKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzJfQklUOworICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NyZWF0ZV9pbmZvLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NzMiKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY3JlYXRlX2luZm8sICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk3NCIpOworCisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF84X0JJVDsKKyAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTc1Iik7CisKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzE2X0JJVDsKKyAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTc2Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZE1lbW9yeU1hcHBpbmcpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIG1hcCBtZW1vcnkgaW4gYSBudW1iZXIgb2YgaW5jb3JyZWN0IHdheXMiKTsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgYm9vbCBwYXNzOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworCisgICAgY29uc3QgVmtEZXZpY2VTaXplIGF0b21fc2l6ZSA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubm9uQ29oZXJlbnRBdG9tU2l6ZTsKKworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZfaW5mbyA9IHt9OworICAgIGJ1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1Zl9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBidWZfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQ7CisgICAgYnVmX2luZm8uc2l6ZSA9IDI1NjsKKyAgICBidWZfaW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGJ1Zl9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGJ1Zl9pbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBidWZfaW5mby5mbGFncyA9IDA7CisgICAgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZidWZfaW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsICZtZW1fcmVxcyk7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgIGFsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICBhbGxvY19pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBhbGxvY19pbmZvLm1lbW9yeVR5cGVJbmRleCA9IDA7CisKKyAgICAvLyBFbnN1cmUgbWVtb3J5IGlzIGJpZyBlbm91Z2ggZm9yIGJvdGggYmluZGluZ3MKKyAgICBzdGF0aWMgY29uc3QgVmtEZXZpY2VTaXplIGFsbG9jYXRpb25fc2l6ZSA9IDB4MTAwMDA7CisgICAgYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IGFsbG9jYXRpb25fc2l6ZTsKKyAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJmFsbG9jX2luZm8sIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUKTsKKyAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBGYWlsZWQgdG8gc2V0IG1lbW9yeSB0eXBlLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZtZW0pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICB1aW50OF90ICpwRGF0YTsKKyAgICAvLyBBdHRlbXB0IHRvIG1hcCBtZW1vcnkgc2l6ZSAwIGlzIGludmFsaWQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWa01hcE1lbW9yeTogQXR0ZW1wdGluZyB0byBtYXAgbWVtb3J5IHJhbmdlIG9mIHNpemUgemVybyIpOworICAgIGVyciA9IHZrOjpNYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIDAsIDAsIDAsICh2b2lkICoqKSZwRGF0YSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gTWFwIG1lbW9yeSB0d2ljZQorICAgIGVyciA9IHZrOjpNYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIDAsIG1lbV9yZXFzLnNpemUsIDAsICh2b2lkICoqKSZwRGF0YSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLU1lbVRyYWNrLUludmFsaWRNYXAiKTsKKyAgICBlcnIgPSB2azo6TWFwTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtLCAwLCBtZW1fcmVxcy5zaXplLCAwLCAodm9pZCAqKikmcERhdGEpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gVW5tYXAgdGhlIG1lbW9yeSB0byBhdm9pZCByZS1tYXAgZXJyb3IKKyAgICB2azo6VW5tYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0pOworICAgIC8vIG92ZXJzdGVwIGFsbG9jYXRpb24gd2l0aCBWS19XSE9MRV9TSVpFCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggc2l6ZSBvZiBWS19XSE9MRV9TSVpFIG92ZXJzdGVwcyB0b3RhbCBhcnJheSBzaXplIDB4Iik7CisgICAgZXJyID0gdms6Ok1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgYWxsb2NhdGlvbl9zaXplICsgMSwgVktfV0hPTEVfU0laRSwgMCwgKHZvaWQgKiopJnBEYXRhKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBvdmVyc3RlcCBhbGxvY2F0aW9uIHcvbyBWS19XSE9MRV9TSVpFCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiIG92ZXJzdGVwcyB0b3RhbCBhcnJheSBzaXplIDB4Iik7CisgICAgZXJyID0gdms6Ok1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgMSwgYWxsb2NhdGlvbl9zaXplLCAwLCAodm9pZCAqKikmcERhdGEpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIE5vdyBlcnJvciBkdWUgdG8gdW5tYXBwaW5nIG1lbW9yeSB0aGF0J3Mgbm90IG1hcHBlZAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlVubWFwcGluZyBNZW1vcnkgd2l0aG91dCBtZW1vcnkgYmVpbmcgbWFwcGVkOiAiKTsKKyAgICB2azo6VW5tYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gTm93IG1hcCBtZW1vcnkgYW5kIGNhdXNlIGVycm9ycyBkdWUgdG8gZmx1c2hpbmcgaW52YWxpZCByYW5nZXMKKyAgICBlcnIgPSB2azo6TWFwTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtLCA0ICogYXRvbV9zaXplLCBWS19XSE9MRV9TSVpFLCAwLCAodm9pZCAqKikmcERhdGEpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgVmtNYXBwZWRNZW1vcnlSYW5nZSBtbXIgPSB7fTsKKyAgICBtbXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFOworICAgIG1tci5tZW1vcnkgPSBtZW07CisgICAgbW1yLm9mZnNldCA9IGF0b21fc2l6ZTsgIC8vIEVycm9yIGIvYyBvZmZzZXQgbGVzcyB0aGFuIG9mZnNldCBvZiBtYXBwZWQgbWVtCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLXNpemUtMDA2ODUiKTsKKyAgICB2azo6Rmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmbW1yKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIE5vdyBmbHVzaCByYW5nZSB0aGF0IG92ZXJzdGVwcyBtYXBwZWQgcmFuZ2UKKyAgICB2azo6VW5tYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0pOworICAgIGVyciA9IHZrOjpNYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIDAsIDQgKiBhdG9tX3NpemUsIDAsICh2b2lkICoqKSZwRGF0YSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBtbXIub2Zmc2V0ID0gYXRvbV9zaXplOworICAgIG1tci5zaXplID0gNCAqIGF0b21fc2l6ZTsgIC8vIEZsdXNoaW5nIGJvdW5kcyBleGNlZWQgbWFwcGVkIGJvdW5kcworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zaXplLTAwNjg1Iik7CisgICAgdms6OkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJm1tcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBOb3cgZmx1c2ggcmFuZ2Ugd2l0aCBWS19XSE9MRV9TSVpFIHRoYXQgb3ZlcnN0ZXBzIG9mZnNldAorICAgIHZrOjpVbm1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSk7CisgICAgZXJyID0gdms6Ok1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgMiAqIGF0b21fc2l6ZSwgNCAqIGF0b21fc2l6ZSwgMCwgKHZvaWQgKiopJnBEYXRhKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIG1tci5vZmZzZXQgPSBhdG9tX3NpemU7CisgICAgbW1yLnNpemUgPSBWS19XSE9MRV9TSVpFOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1zaXplLTAwNjg2Iik7CisgICAgdms6OkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJm1tcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBTb21lIHBsYXRmb3JtcyBoYXZlIGFuIGF0b21zaXplIG9mIDEgd2hpY2ggbWFrZXMgdGhlIHRlc3QgbWVhbmluZ2xlc3MKKyAgICBpZiAoYXRvbV9zaXplID4gMykgeworICAgICAgICAvLyBOb3cgd2l0aCBhbiBvZmZzZXQgTk9UIGEgbXVsdGlwbGUgb2YgdGhlIGRldmljZSBsaW1pdAorICAgICAgICB2azo6VW5tYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0pOworICAgICAgICBlcnIgPSB2azo6TWFwTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtLCAwLCA0ICogYXRvbV9zaXplLCAwLCAodm9pZCAqKikmcERhdGEpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICBtbXIub2Zmc2V0ID0gMzsgIC8vIE5vdCBhIG11bHRpcGxlIG9mIGF0b21fc2l6ZQorICAgICAgICBtbXIuc2l6ZSA9IFZLX1dIT0xFX1NJWkU7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtNYXBwZWRNZW1vcnlSYW5nZS1vZmZzZXQtMDA2ODciKTsKKyAgICAgICAgdms6OkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJm1tcik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIC8vIE5vdyB3aXRoIGEgc2l6ZSBOT1QgYSBtdWx0aXBsZSBvZiB0aGUgZGV2aWNlIGxpbWl0CisgICAgICAgIHZrOjpVbm1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSk7CisgICAgICAgIGVyciA9IHZrOjpNYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIDAsIDQgKiBhdG9tX3NpemUsIDAsICh2b2lkICoqKSZwRGF0YSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIG1tci5vZmZzZXQgPSBhdG9tX3NpemU7CisgICAgICAgIG1tci5zaXplID0gMiAqIGF0b21fc2l6ZSArIDE7ICAvLyBOb3QgYSBtdWx0aXBsZSBvZiBhdG9tX3NpemUKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa01hcHBlZE1lbW9yeVJhbmdlLXNpemUtMDEzOTAiKTsKKyAgICAgICAgdms6OkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJm1tcik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmYWxsb2NfaW5mbywgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUKTsKKyAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBGYWlsZWQgdG8gc2V0IG1lbW9yeSB0eXBlLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgTlVMTCk7CisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBUT0RPIDogSWYgd2UgY2FuIGdldCBIT1NUX1ZJU0lCTEUgdy9vIEhPU1RfQ09IRVJFTlQgd2UgY2FuIHRlc3QgY2FzZXMgb2YKKyAgICAvLyAga1ZVSURfQ29yZV9NZW1UcmFja19JbnZhbGlkTWFwIGluIHZhbGlkYXRlQW5kQ29weU5vbmNvaGVyZW50TWVtb3J5VG9Ecml2ZXIoKQorCisgICAgdms6OkRlc3Ryb3lCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsIE5VTEwpOworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNYXBNZW1XaXRob3V0SG9zdFZpc2libGVCaXQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBbGxvY2F0ZSBtZW1vcnkgdGhhdCBpcyBub3QgbWFwcGFibGUgYW5kIHRoZW4gYXR0ZW1wdCB0byBtYXAgaXQuIik7CisgICAgVmtSZXN1bHQgZXJyOworICAgIGJvb2wgcGFzczsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtNYXBNZW1vcnktbWVtb3J5LTAwNjgyIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgIG1lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gMTAyNDsKKworICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKDB4RkZGRkZGRkYsICZtZW1fYWxsb2MsIDAsIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUKTsKKyAgICBpZiAoIXBhc3MpIHsgIC8vIElmIHdlIGNhbid0IGZpbmQgYW55IHVubWFwcGFibGUgbWVtb3J5IHRoaXMgdGVzdCBkb2Vzbid0CisgICAgICAgICAgICAgICAgICAvLyBtYWtlIHNlbnNlCisgICAgICAgIHByaW50ZigiJXMgTm8gdW5tYXBwYWJsZSBtZW1vcnkgdHlwZXMgZm91bmQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrRGV2aWNlTWVtb3J5IG1lbTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtX2FsbG9jLCBOVUxMLCAmbWVtKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgdm9pZCAqbWFwcGVkQWRkcmVzcyA9IE5VTEw7CisgICAgZXJyID0gdms6Ok1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgMCwgVktfV0hPTEVfU0laRSwgMCwgJm1hcHBlZEFkZHJlc3MpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlYmluZE1lbW9yeSkgeworICAgIFZrUmVzdWx0IGVycjsKKyAgICBib29sIHBhc3M7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLTAxMDQ0Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQ3JlYXRlIGFuIGltYWdlLCBhbGxvY2F0ZSBtZW1vcnksIGZyZWUgaXQsIGFuZCB0aGVuIHRyeSB0byBiaW5kIGl0CisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBWa0RldmljZU1lbW9yeSBtZW0xOworICAgIFZrRGV2aWNlTWVtb3J5IG1lbTI7CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisKKyAgICBjb25zdCBWa0Zvcm1hdCB0ZXhfZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGNvbnN0IGludDMyX3QgdGV4X3dpZHRoID0gMzI7CisgICAgY29uc3QgaW50MzJfdCB0ZXhfaGVpZ2h0ID0gMzI7CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gdGV4X2Zvcm1hdDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSB0ZXhfd2lkdGg7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IHRleF9oZWlnaHQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtX2FsbG9jID0ge307CisgICAgbWVtX2FsbG9jLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtX2FsbG9jLnBOZXh0ID0gTlVMTDsKKyAgICBtZW1fYWxsb2MuYWxsb2NhdGlvblNpemUgPSAwOworICAgIG1lbV9hbGxvYy5tZW1vcnlUeXBlSW5kZXggPSAwOworCisgICAgLy8gSW50cm9kdWNlIGZhaWx1cmUsIGRvIE5PVCBzZXQgbWVtUHJvcHMgdG8KKyAgICAvLyBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVAorICAgIG1lbV9hbGxvYy5tZW1vcnlUeXBlSW5kZXggPSAxOworICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJmltYWdlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsICZtZW1fcmVxcyk7CisKKyAgICBtZW1fYWxsb2MuYWxsb2NhdGlvblNpemUgPSBtZW1fcmVxcy5zaXplOworICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmbWVtX2FsbG9jLCAwKTsKKyAgICBBU1NFUlRfVFJVRShwYXNzKTsKKworICAgIC8vIGFsbG9jYXRlIDIgbWVtb3J5IG9iamVjdHMKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtX2FsbG9jLCBOVUxMLCAmbWVtMSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtX2FsbG9jLCBOVUxMLCAmbWVtMik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEJpbmQgZmlyc3QgbWVtb3J5IG9iamVjdCB0byBJbWFnZSBvYmplY3QKKyAgICBlcnIgPSB2azo6QmluZEltYWdlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsIG1lbTEsIDApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBJbnRyb2R1Y2UgdmFsaWRhdGlvbiBmYWlsdXJlLCB0cnkgdG8gYmluZCBhIGRpZmZlcmVudCBtZW1vcnkgb2JqZWN0IHRvCisgICAgLy8gdGhlIHNhbWUgaW1hZ2Ugb2JqZWN0CisgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCBtZW0yLCAwKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKKyAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbTEsIE5VTEwpOworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtMiwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUXVlcnlNZW1vcnlDb21taXRtZW50V2l0aG91dExhenlQcm9wZXJ0eSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gcXVlcnkgbWVtb3J5IGNvbW1pdG1lbnQgb24gbWVtb3J5IHdpdGhvdXQgbGF6eSBhbGxvY2F0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGF1dG8gaW1hZ2VfY2kgPSB2a190ZXN0aW5nOjpJbWFnZTo6Y3JlYXRlX2luZm8oKTsKKyAgICBpbWFnZV9jaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NpLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWFnZV9jaS5leHRlbnQud2lkdGggPSAzMjsKKyAgICBpbWFnZV9jaS5leHRlbnQuaGVpZ2h0ID0gMzI7CisgICAgaW1hZ2VfY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDsKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5pbml0X25vX21lbSgqbV9kZXZpY2UsIGltYWdlX2NpKTsKKworICAgIGF1dG8gbWVtX3JlcXMgPSBpbWFnZS5tZW1vcnlfcmVxdWlyZW1lbnRzKCk7CisgICAgLy8gbWVtb3J5X3R5cGVfaW5kZXggaXMgc2V0IHRvIDAgaGVyZSwgYnV0IGlzIHNldCBwcm9wZXJseSBiZWxvdworICAgIGF1dG8gaW1hZ2VfYWxsb2NfaW5mbyA9IHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeTo6YWxsb2NfaW5mbyhtZW1fcmVxcy5zaXplLCAwKTsKKworICAgIGJvb2wgcGFzczsKKyAgICAvLyB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgImZvcmJpZCIgYXJndW1lbnQgZm9yIHNldF9tZW1vcnlfdHlwZSwgZGlzYWxsb3dpbmcKKyAgICAvLyB0aGF0IHBhcnRpY3VsYXIgbWVtb3J5IHR5cGUgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIGl0CisgICAgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUobWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsICZpbWFnZV9hbGxvY19pbmZvLCAwLCBWS19NRU1PUllfUFJPUEVSVFlfTEFaSUxZX0FMTE9DQVRFRF9CSVQpOworICAgIGlmICghcGFzcykgeworICAgICAgICBwcmludGYoIiVzIEZhaWxlZCB0byBzZXQgbWVtb3J5IHR5cGUuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmtfdGVzdGluZzo6RGV2aWNlTWVtb3J5IG1lbTsKKyAgICBtZW0uaW5pdCgqbV9kZXZpY2UsIGltYWdlX2FsbG9jX2luZm8pOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQtbWVtb3J5LTAwNjkwIik7CisgICAgVmtEZXZpY2VTaXplIHNpemU7CisgICAgdms6OkdldERldmljZU1lbW9yeUNvbW1pdG1lbnQobV9kZXZpY2UtPmRldmljZSgpLCBtZW0uaGFuZGxlKCksICZzaXplKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkVXNhZ2VCaXRzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlNwZWNpZnkgd3JvbmcgdXNhZ2UgZm9yIGltYWdlIHRoZW4gY3JlYXRlIGNvbmZsaWN0aW5nIHZpZXcgb2YgaW1hZ2UgSW5pdGlhbGl6ZSBidWZmZXIgd2l0aCB3cm9uZyB1c2FnZSB0aGVuIHBlcmZvcm0gY29weSAiCisgICAgICAgICJleHBlY3RpbmcgZXJyb3JzIGZyb20gYm90aCB0aGUgaW1hZ2UgYW5kIHRoZSBidWZmZXIgKDIgY2FsbHMpIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIGF1dG8gZm9ybWF0ID0gRmluZFN1cHBvcnRlZERlcHRoU3RlbmNpbEZvcm1hdChncHUoKSk7CisgICAgaWYgKCFmb3JtYXQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBObyBEZXB0aCArIFN0ZW5jaWwgZm9ybWF0IGZvdW5kLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgLy8gSW5pdGlhbGl6ZSBpbWFnZSB3aXRoIHRyYW5zZmVyIHNvdXJjZSB1c2FnZQorICAgIGltYWdlLkluaXQoMTI4LCAxMjgsIDEsIGZvcm1hdCwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXcgZHN2OworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBkc3ZjaSA9IHt9OworICAgIGRzdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBkc3ZjaS5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgIGRzdmNpLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgIGRzdmNpLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBkc3ZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGRzdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBkc3ZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGRzdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisKKyAgICAvLyBDcmVhdGUgYSB2aWV3IHdpdGggZGVwdGggLyBzdGVuY2lsIGFzcGVjdCBmb3IgaW1hZ2Ugd2l0aCBkaWZmZXJlbnQgdXNhZ2UKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLU1lbVRyYWNrLUludmFsaWRVc2FnZUZsYWciKTsKKyAgICB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzdmNpLCBOVUxMLCAmZHN2KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEluaXRpYWxpemUgYnVmZmVyIHdpdGggVFJBTlNGRVJfRFNUIHVzYWdlCisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyByZXFzID0gMDsKKyAgICBidWZmZXIuaW5pdF9hc19kc3QoKm1fZGV2aWNlLCAxMjggKiAxMjgsIHJlcXMpOworICAgIFZrQnVmZmVySW1hZ2VDb3B5IHJlZ2lvbiA9IHt9OworICAgIHJlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSAxMjg7CisgICAgcmVnaW9uLmJ1ZmZlckltYWdlSGVpZ2h0ID0gMTI4OworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC5oZWlnaHQgPSAxNjsKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQud2lkdGggPSAxNjsKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQuZGVwdGggPSAxOworCisgICAgLy8gQnVmZmVyIHVzYWdlIG5vdCBzZXQgdG8gVFJBTlNGRVJfU1JDIGFuZCBpbWFnZSB1c2FnZSBub3Qgc2V0IHRvIFRSQU5TRkVSX0RTVAorICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIC8vIHR3byBzZXBhcmF0ZSBlcnJvcnMgZnJvbSB0aGlzIGNhbGw6CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlLTAwMTc3Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXNyY0J1ZmZlci0wMDE3NCIpOworCisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ29weUJ1ZmZlclRvQ29tcHJlc3NlZEltYWdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ29weSBidWZmZXIgdG8gY29tcHJlc3NlZCBpbWFnZSB3aGVuIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiBpbWFnZS4iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gVmVyaWZ5IGZvcm1hdCBzdXBwb3J0CisgICAgaWYgKCFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBWS19GT1JNQVRfQkMxX1JHQkFfU1JHQl9CTE9DSywgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVRfS0hSKSkgeworICAgICAgICBwcmludGYoIiVzIFJlcXVpcmVkIGZvcm1hdHMvZmVhdHVyZXMgbm90IHN1cHBvcnRlZCAtIENvcHlCdWZmZXJUb0NvbXByZXNzZWRJbWFnZSBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtJbWFnZU9iaiB3aWR0aF9pbWFnZShtX2RldmljZSk7CisgICAgVmtJbWFnZU9iaiBoZWlnaHRfaW1hZ2UobV9kZXZpY2UpOworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IDA7CisgICAgYnVmZmVyLmluaXRfYXNfc3JjKCptX2RldmljZSwgOCAqIDQgKiAyLCByZXFzKTsKKyAgICBWa0J1ZmZlckltYWdlQ29weSByZWdpb24gPSB7fTsKKyAgICByZWdpb24uYnVmZmVyUm93TGVuZ3RoID0gMDsKKyAgICByZWdpb24uYnVmZmVySW1hZ2VIZWlnaHQgPSAwOworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC53aWR0aCA9IDg7CisgICAgcmVnaW9uLmltYWdlRXh0ZW50LmhlaWdodCA9IDQ7CisgICAgcmVnaW9uLmltYWdlRXh0ZW50LmRlcHRoID0gMTsKKworICAgIHdpZHRoX2ltYWdlLkluaXQoNSwgNCwgMSwgVktfRk9STUFUX0JDMV9SR0JBX1NSR0JfQkxPQ0ssIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICBoZWlnaHRfaW1hZ2UuSW5pdCg4LCAzLCAxLCBWS19GT1JNQVRfQkMxX1JHQkFfU1JHQl9CTE9DSywgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworICAgIGlmICghd2lkdGhfaW1hZ2UuaW5pdGlhbGl6ZWQoKSB8fCAoIWhlaWdodF9pbWFnZS5pbml0aWFsaXplZCgpKSkgeworICAgICAgICBwcmludGYoIiVzIFVuYWJsZSB0byBpbml0aWFsaXplIHN1cmZhY2VzIC0gVW5jb21wcmVzc2VkVG9Db21wcmVzc2VkSW1hZ2VDb3B5IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDE5NyIpOworICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIHdpZHRoX2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMjAwIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXBSZWdpb25zLTAwMTcyIik7CisKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgVmtJbWFnZUNyZWF0ZUluZm8gZGVwdGhfaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBkZXB0aF9pbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGRlcHRoX2ltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBkZXB0aF9pbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzNEOworICAgIGRlcHRoX2ltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9CQzFfUkdCQV9TUkdCX0JMT0NLOworICAgIGRlcHRoX2ltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDg7CisgICAgZGVwdGhfaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDQ7CisgICAgZGVwdGhfaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBkZXB0aF9pbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGRlcHRoX2ltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBkZXB0aF9pbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGRlcHRoX2ltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGRlcHRoX2ltYWdlX2NyZWF0ZV9pbmZvLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ7CisgICAgZGVwdGhfaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGRlcHRoX2ltYWdlX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDA7CisgICAgZGVwdGhfaW1hZ2VfY3JlYXRlX2luZm8ucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IE5VTEw7CisKKyAgICBWa0ltYWdlIGRlcHRoX2ltYWdlID0gVktfTlVMTF9IQU5ETEU7CisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmRlcHRoX2ltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmZGVwdGhfaW1hZ2UpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0RldmljZU1lbW9yeSBtZW0xOworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworICAgIG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQ7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtX2FsbG9jID0ge307CisgICAgbWVtX2FsbG9jLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtX2FsbG9jLnBOZXh0ID0gTlVMTDsKKyAgICBtZW1fYWxsb2MuYWxsb2NhdGlvblNpemUgPSAwOworICAgIG1lbV9hbGxvYy5tZW1vcnlUeXBlSW5kZXggPSAwOworICAgIG1lbV9hbGxvYy5tZW1vcnlUeXBlSW5kZXggPSAxOworICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIGRlcHRoX2ltYWdlLCAmbWVtX3JlcXMpOworICAgIG1lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IG1lbV9yZXFzLnNpemU7CisgICAgYm9vbCBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJm1lbV9hbGxvYywgMCk7CisgICAgQVNTRVJUX1RSVUUocGFzcyk7CisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1lbV9hbGxvYywgTlVMTCwgJm1lbTEpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGRlcHRoX2ltYWdlLCBtZW0xLCAwKTsKKworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC5kZXB0aCA9IDI7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgZGVwdGhfaW1hZ2UsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBkZXB0aF9pbWFnZSwgTlVMTCk7CisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0xLCBOVUxMKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVVua25vd25PYmplY3QpIHsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMtaW1hZ2UtcGFyYW1ldGVyIik7CisKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJQYXNzIGFuIGludmFsaWQgaW1hZ2Ugb2JqZWN0IGhhbmRsZSBpbnRvIGEgVnVsa2FuIEFQSSBjYWxsLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIFBhc3MgYm9ndXMgaGFuZGxlIGludG8gR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1fcmVxczsKKyAgICB1aW50NjRfdCBmYWtlSW1hZ2VIYW5kbGUgPSAweENBREVDQURFOworICAgIFZrSW1hZ2UgZmF1eEltYWdlID0gcmVpbnRlcnByZXRfY2FzdDxWa0ltYWdlICY+KGZha2VJbWFnZUhhbmRsZSk7CisKKyAgICB2azo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMobV9kZXZpY2UtPmRldmljZSgpLCBmYXV4SW1hZ2UsICZtZW1fcmVxcyk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBCaW5kSW1hZ2VJbnZhbGlkTWVtb3J5VHlwZSkgeworICAgIFZrUmVzdWx0IGVycjsKKworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdmFsaWRhdGlvbiBjaGVjayBmb3IgYW4gaW52YWxpZCBtZW1vcnkgdHlwZSBpbmRleCBkdXJpbmcgYmluZFtCdWZmZXJ8SW1hZ2VdTWVtb3J5IHRpbWUiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW1hZ2UsIGFsbG9jYXRlIG1lbW9yeSwgc2V0IGEgYmFkIHR5cGVJbmRleCBhbmQgdGhlbiB0cnkgdG8KKyAgICAvLyBiaW5kIGl0CisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBWa0RldmljZU1lbW9yeSBtZW07CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisgICAgY29uc3QgVmtGb3JtYXQgdGV4X2Zvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBjb25zdCBpbnQzMl90IHRleF93aWR0aCA9IDMyOworICAgIGNvbnN0IGludDMyX3QgdGV4X2hlaWdodCA9IDMyOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IHRleF9mb3JtYXQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gdGV4X3dpZHRoOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSB0ZXhfaGVpZ2h0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgIG1lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gMDsKKyAgICBtZW1fYWxsb2MubWVtb3J5VHlwZUluZGV4ID0gMDsKKworICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJmltYWdlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsICZtZW1fcmVxcyk7CisgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gbWVtX3JlcXMuc2l6ZTsKKworICAgIC8vIEludHJvZHVjZSBGYWlsdXJlLCBzZWxlY3QgaW52YWxpZCBUeXBlSW5kZXgKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlfaW5mbzsKKworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoZ3B1KCksICZtZW1vcnlfaW5mbyk7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1lbW9yeV9pbmZvLm1lbW9yeVR5cGVDb3VudDsgaSsrKSB7CisgICAgICAgIGlmICgobWVtX3JlcXMubWVtb3J5VHlwZUJpdHMgJiAoMSA8PCBpKSkgPT0gMCkgeworICAgICAgICAgICAgbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA+PSBtZW1vcnlfaW5mby5tZW1vcnlUeXBlQ291bnQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBObyBpbnZhbGlkIG1lbW9yeSB0eXBlIGluZGV4IGNvdWxkIGJlIGZvdW5kOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsIE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiZm9yIHRoaXMgb2JqZWN0IHR5cGUgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG1lbW9yeSIpOworCisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1lbV9hbGxvYywgTlVMTCwgJm1lbSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGVyciA9IHZrOjpCaW5kSW1hZ2VNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZSwgbWVtLCAwKTsKKyAgICAodm9pZCllcnI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZSwgTlVMTCk7CisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEJpbmRJbnZhbGlkTWVtb3J5KSB7CisgICAgVmtSZXN1bHQgZXJyOworICAgIGJvb2wgcGFzczsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBjb25zdCBWa0Zvcm1hdCB0ZXhfZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIGNvbnN0IGludDMyX3QgdGV4X3dpZHRoID0gMjU2OworICAgIGNvbnN0IGludDMyX3QgdGV4X2hlaWdodCA9IDI1NjsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSB0ZXhfZm9ybWF0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IHRleF93aWR0aDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gdGV4X2hlaWdodDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge307CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8uc2l6ZSA9IDQgKiAxMDI0ICogMTAyNDsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQ7CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKworICAgIC8vIENyZWF0ZSBhbiBpbWFnZS9idWZmZXIsIGFsbG9jYXRlIG1lbW9yeSwgZnJlZSBpdCwgYW5kIHRoZW4gdHJ5IHRvIGJpbmQgaXQKKyAgICB7CisgICAgICAgIFZrSW1hZ2UgaW1hZ2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgVmtCdWZmZXIgYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZShkZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmaW1hZ2UpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlQnVmZmVyKGRldmljZSgpLCAmYnVmZmVyX2NyZWF0ZV9pbmZvLCBOVUxMLCAmYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgaW1hZ2VfbWVtX3JlcXMgPSB7fSwgYnVmZmVyX21lbV9yZXFzID0ge307CisgICAgICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UoKSwgaW1hZ2UsICZpbWFnZV9tZW1fcmVxcyk7CisgICAgICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlKCksIGJ1ZmZlciwgJmJ1ZmZlcl9tZW1fcmVxcyk7CisKKyAgICAgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gaW1hZ2VfbWVtX2FsbG9jID0ge30sIGJ1ZmZlcl9tZW1fYWxsb2MgPSB7fTsKKyAgICAgICAgaW1hZ2VfbWVtX2FsbG9jLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgICAgIGltYWdlX21lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IGltYWdlX21lbV9yZXFzLnNpemU7CisgICAgICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKGltYWdlX21lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmaW1hZ2VfbWVtX2FsbG9jLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocGFzcyk7CisgICAgICAgIGJ1ZmZlcl9tZW1fYWxsb2Muc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgYnVmZmVyX21lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IGJ1ZmZlcl9tZW1fcmVxcy5zaXplOworICAgICAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShidWZmZXJfbWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsICZidWZmZXJfbWVtX2FsbG9jLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocGFzcyk7CisKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgaW1hZ2VfbWVtID0gVktfTlVMTF9IQU5ETEUsIGJ1ZmZlcl9tZW0gPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmaW1hZ2VfbWVtX2FsbG9jLCBOVUxMLCAmaW1hZ2VfbWVtKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmYnVmZmVyX21lbV9hbGxvYywgTlVMTCwgJmJ1ZmZlcl9tZW0pOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBpbWFnZV9tZW0sIE5VTEwpOworICAgICAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgYnVmZmVyX21lbSwgTlVMTCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktcGFyYW1ldGVyIik7CisgICAgICAgIGVyciA9IHZrOjpCaW5kSW1hZ2VNZW1vcnkoZGV2aWNlKCksIGltYWdlLCBpbWFnZV9tZW0sIDApOworICAgICAgICAodm9pZCllcnI7ICAvLyBUaGlzIG1heSB2ZXJ5IHdlbGwgcmV0dXJuIGFuIGVycm9yLgorICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnktcGFyYW1ldGVyIik7CisgICAgICAgIGVyciA9IHZrOjpCaW5kQnVmZmVyTWVtb3J5KGRldmljZSgpLCBidWZmZXIsIGJ1ZmZlcl9tZW0sIDApOworICAgICAgICAodm9pZCllcnI7ICAvLyBUaGlzIG1heSB2ZXJ5IHdlbGwgcmV0dXJuIGFuIGVycm9yLgorICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsIE5VTEwpOworICAgICAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisgICAgfQorCisgICAgLy8gVHJ5IHRvIGJpbmQgbWVtb3J5IHRvIGFuIG9iamVjdCB0aGF0IGFscmVhZHkgaGFzIGEgbWVtb3J5IGJpbmRpbmcKKyAgICB7CisgICAgICAgIFZrSW1hZ2UgaW1hZ2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlKGRldmljZSgpLCAmaW1hZ2VfY3JlYXRlX2luZm8sIE5VTEwsICZpbWFnZSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIFZrQnVmZmVyIGJ1ZmZlciA9IFZLX05VTExfSEFORExFOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlQnVmZmVyKGRldmljZSgpLCAmYnVmZmVyX2NyZWF0ZV9pbmZvLCBOVUxMLCAmYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgaW1hZ2VfbWVtX3JlcXMgPSB7fSwgYnVmZmVyX21lbV9yZXFzID0ge307CisgICAgICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UoKSwgaW1hZ2UsICZpbWFnZV9tZW1fcmVxcyk7CisgICAgICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlKCksIGJ1ZmZlciwgJmJ1ZmZlcl9tZW1fcmVxcyk7CisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGltYWdlX2FsbG9jX2luZm8gPSB7fSwgYnVmZmVyX2FsbG9jX2luZm8gPSB7fTsKKyAgICAgICAgaW1hZ2VfYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgICAgICBpbWFnZV9hbGxvY19pbmZvLmFsbG9jYXRpb25TaXplID0gaW1hZ2VfbWVtX3JlcXMuc2l6ZTsKKyAgICAgICAgYnVmZmVyX2FsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgYnVmZmVyX2FsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgPSBidWZmZXJfbWVtX3JlcXMuc2l6ZTsKKyAgICAgICAgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUoaW1hZ2VfbWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsICZpbWFnZV9hbGxvY19pbmZvLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocGFzcyk7CisgICAgICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKGJ1ZmZlcl9tZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJmJ1ZmZlcl9hbGxvY19pbmZvLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocGFzcyk7CisgICAgICAgIFZrRGV2aWNlTWVtb3J5IGltYWdlX21lbSwgYnVmZmVyX21lbTsKKyAgICAgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmaW1hZ2VfYWxsb2NfaW5mbywgTlVMTCwgJmltYWdlX21lbSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmJ1ZmZlcl9hbGxvY19pbmZvLCBOVUxMLCAmYnVmZmVyX21lbSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShkZXZpY2UoKSwgaW1hZ2UsIGltYWdlX21lbSwgMCk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtMDEwNDQiKTsKKyAgICAgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShkZXZpY2UoKSwgaW1hZ2UsIGltYWdlX21lbSwgMCk7CisgICAgICAgICh2b2lkKWVycjsgIC8vIFRoaXMgbWF5IHZlcnkgd2VsbCByZXR1cm4gYW4gZXJyb3IuCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIGVyciA9IHZrOjpCaW5kQnVmZmVyTWVtb3J5KGRldmljZSgpLCBidWZmZXIsIGJ1ZmZlcl9tZW0sIDApOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItMDEwMjkiKTsKKyAgICAgICAgZXJyID0gdms6OkJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlKCksIGJ1ZmZlciwgYnVmZmVyX21lbSwgMCk7CisgICAgICAgICh2b2lkKWVycjsgIC8vIFRoaXMgbWF5IHZlcnkgd2VsbCByZXR1cm4gYW4gZXJyb3IuCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBpbWFnZV9tZW0sIE5VTEwpOworICAgICAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgYnVmZmVyX21lbSwgTlVMTCk7CisgICAgICAgIHZrOjpEZXN0cm95SW1hZ2UoZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKKyAgICAgICAgdms6OkRlc3Ryb3lCdWZmZXIoZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisgICAgfQorCisgICAgLy8gVHJ5IHRvIGJpbmQgbWVtb3J5IHRvIGFuIG9iamVjdCB3aXRoIGFuIGludmFsaWQgbWVtb3J5T2Zmc2V0CisgICAgeworICAgICAgICBWa0ltYWdlIGltYWdlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZShkZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmaW1hZ2UpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICBWa0J1ZmZlciBidWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihkZXZpY2UoKSwgJmJ1ZmZlcl9jcmVhdGVfaW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIGltYWdlX21lbV9yZXFzID0ge30sIGJ1ZmZlcl9tZW1fcmVxcyA9IHt9OworICAgICAgICB2azo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlKCksIGltYWdlLCAmaW1hZ2VfbWVtX3JlcXMpOworICAgICAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSgpLCBidWZmZXIsICZidWZmZXJfbWVtX3JlcXMpOworICAgICAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBpbWFnZV9hbGxvY19pbmZvID0ge30sIGJ1ZmZlcl9hbGxvY19pbmZvID0ge307CisgICAgICAgIGltYWdlX2FsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgLy8gTGVhdmUgc29tZSBleHRyYSBzcGFjZSBmb3IgYWxpZ25tZW50IHdpZ2dsZSByb29tCisgICAgICAgIGltYWdlX2FsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgPSBpbWFnZV9tZW1fcmVxcy5zaXplICsgaW1hZ2VfbWVtX3JlcXMuYWxpZ25tZW50OworICAgICAgICBidWZmZXJfYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgICAgICBidWZmZXJfYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IGJ1ZmZlcl9tZW1fcmVxcy5zaXplICsgYnVmZmVyX21lbV9yZXFzLmFsaWdubWVudDsKKyAgICAgICAgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUoaW1hZ2VfbWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsICZpbWFnZV9hbGxvY19pbmZvLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocGFzcyk7CisgICAgICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKGJ1ZmZlcl9tZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJmJ1ZmZlcl9hbGxvY19pbmZvLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocGFzcyk7CisgICAgICAgIFZrRGV2aWNlTWVtb3J5IGltYWdlX21lbSwgYnVmZmVyX21lbTsKKyAgICAgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmaW1hZ2VfYWxsb2NfaW5mbywgTlVMTCwgJmltYWdlX21lbSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmJ1ZmZlcl9hbGxvY19pbmZvLCBOVUxMLCAmYnVmZmVyX21lbSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgLy8gVGVzdCB1bmFsaWduZWQgbWVtb3J5IG9mZnNldAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW1hZ2VfbWVtX3JlcXMuYWxpZ25tZW50ID4gMSkgeworICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBpbWFnZV9vZmZzZXQgPSAxOworICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDQ4Iik7CisgICAgICAgICAgICAgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShkZXZpY2UoKSwgaW1hZ2UsIGltYWdlX21lbSwgaW1hZ2Vfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAodm9pZCllcnI7ICAvLyBUaGlzIG1heSB2ZXJ5IHdlbGwgcmV0dXJuIGFuIGVycm9yLgorICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVmZmVyX21lbV9yZXFzLmFsaWdubWVudCA+IDEpIHsKKyAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgYnVmZmVyX29mZnNldCA9IDE7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDM2Iik7CisgICAgICAgICAgICAgICAgZXJyID0gdms6OkJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlKCksIGJ1ZmZlciwgYnVmZmVyX21lbSwgYnVmZmVyX29mZnNldCk7CisgICAgICAgICAgICAgICAgKHZvaWQpZXJyOyAgLy8gVGhpcyBtYXkgdmVyeSB3ZWxsIHJldHVybiBhbiBlcnJvci4KKyAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlc3QgbWVtb3J5IG9mZnNldHMgb3V0c2lkZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgVmtEZXZpY2VTaXplIGltYWdlX29mZnNldCA9CisgICAgICAgICAgICAgICAgKGltYWdlX2FsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgKyBpbWFnZV9tZW1fcmVxcy5hbGlnbm1lbnQpICYgfihpbWFnZV9tZW1fcmVxcy5hbGlnbm1lbnQgLSAxKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5T2Zmc2V0LTAxMDQ2Iik7CisgICAgICAgICAgICBlcnIgPSB2azo6QmluZEltYWdlTWVtb3J5KGRldmljZSgpLCBpbWFnZSwgaW1hZ2VfbWVtLCBpbWFnZV9vZmZzZXQpOworICAgICAgICAgICAgKHZvaWQpZXJyOyAgLy8gVGhpcyBtYXkgdmVyeSB3ZWxsIHJldHVybiBhbiBlcnJvci4KKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgICAgICBWa0RldmljZVNpemUgYnVmZmVyX29mZnNldCA9CisgICAgICAgICAgICAgICAgKGJ1ZmZlcl9hbGxvY19pbmZvLmFsbG9jYXRpb25TaXplICsgYnVmZmVyX21lbV9yZXFzLmFsaWdubWVudCkgJiB+KGJ1ZmZlcl9tZW1fcmVxcy5hbGlnbm1lbnQgLSAxKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeU9mZnNldC0wMTAzMSIpOworICAgICAgICAgICAgZXJyID0gdms6OkJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlKCksIGJ1ZmZlciwgYnVmZmVyX21lbSwgYnVmZmVyX29mZnNldCk7CisgICAgICAgICAgICAodm9pZCllcnI7ICAvLyBUaGlzIG1heSB2ZXJ5IHdlbGwgcmV0dXJuIGFuIGVycm9yLgorICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IG1lbW9yeSBvZmZzZXRzIHdpdGhpbiB0aGUgbWVtb3J5IGFsbG9jYXRpb24sIGJ1dCB3aGljaCBsZWF2ZSB0b28gbGl0dGxlIG1lbW9yeSBmb3IKKyAgICAgICAgLy8gdGhlIHJlc291cmNlLgorICAgICAgICB7CisgICAgICAgICAgICBWa0RldmljZVNpemUgaW1hZ2Vfb2Zmc2V0ID0gKGltYWdlX21lbV9yZXFzLnNpemUgLSAxKSAmIH4oaW1hZ2VfbWVtX3JlcXMuYWxpZ25tZW50IC0gMSk7CisgICAgICAgICAgICBpZiAoKGltYWdlX29mZnNldCA+IDApICYmIChpbWFnZV9tZW1fcmVxcy5zaXplIDwgKGltYWdlX2FsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgLSBpbWFnZV9tZW1fcmVxcy5hbGlnbm1lbnQpKSkgeworICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktc2l6ZS0wMTA0OSIpOworICAgICAgICAgICAgICAgIGVyciA9IHZrOjpCaW5kSW1hZ2VNZW1vcnkoZGV2aWNlKCksIGltYWdlLCBpbWFnZV9tZW0sIGltYWdlX29mZnNldCk7CisgICAgICAgICAgICAgICAgKHZvaWQpZXJyOyAgLy8gVGhpcyBtYXkgdmVyeSB3ZWxsIHJldHVybiBhbiBlcnJvci4KKyAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmtEZXZpY2VTaXplIGJ1ZmZlcl9vZmZzZXQgPSAoYnVmZmVyX21lbV9yZXFzLnNpemUgLSAxKSAmIH4oYnVmZmVyX21lbV9yZXFzLmFsaWdubWVudCAtIDEpOworICAgICAgICAgICAgaWYgKGJ1ZmZlcl9vZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktc2l6ZS0wMTAzNyIpOworICAgICAgICAgICAgICAgIGVyciA9IHZrOjpCaW5kQnVmZmVyTWVtb3J5KGRldmljZSgpLCBidWZmZXIsIGJ1ZmZlcl9tZW0sIGJ1ZmZlcl9vZmZzZXQpOworICAgICAgICAgICAgICAgICh2b2lkKWVycjsgIC8vIFRoaXMgbWF5IHZlcnkgd2VsbCByZXR1cm4gYW4gZXJyb3IuCisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgaW1hZ2VfbWVtLCBOVUxMKTsKKyAgICAgICAgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIGJ1ZmZlcl9tZW0sIE5VTEwpOworICAgICAgICB2azo6RGVzdHJveUltYWdlKGRldmljZSgpLCBpbWFnZSwgTlVMTCk7CisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKGRldmljZSgpLCBidWZmZXIsIE5VTEwpOworICAgIH0KKworICAgIC8vIFRyeSB0byBiaW5kIG1lbW9yeSB0byBhbiBvYmplY3Qgd2l0aCBhbiBpbnZhbGlkIG1lbW9yeSB0eXBlCisgICAgeworICAgICAgICBWa0ltYWdlIGltYWdlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZShkZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmaW1hZ2UpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICBWa0J1ZmZlciBidWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihkZXZpY2UoKSwgJmJ1ZmZlcl9jcmVhdGVfaW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIGltYWdlX21lbV9yZXFzID0ge30sIGJ1ZmZlcl9tZW1fcmVxcyA9IHt9OworICAgICAgICB2azo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlKCksIGltYWdlLCAmaW1hZ2VfbWVtX3JlcXMpOworICAgICAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSgpLCBidWZmZXIsICZidWZmZXJfbWVtX3JlcXMpOworICAgICAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBpbWFnZV9hbGxvY19pbmZvID0ge30sIGJ1ZmZlcl9hbGxvY19pbmZvID0ge307CisgICAgICAgIGltYWdlX2FsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgaW1hZ2VfYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IGltYWdlX21lbV9yZXFzLnNpemU7CisgICAgICAgIGJ1ZmZlcl9hbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgICAgIGJ1ZmZlcl9hbGxvY19pbmZvLmFsbG9jYXRpb25TaXplID0gYnVmZmVyX21lbV9yZXFzLnNpemU7CisgICAgICAgIC8vIENyZWF0ZSBhIG1hc2sgb2YgYXZhaWxhYmxlIG1lbW9yeSB0eXBlcyAqbm90KiBzdXBwb3J0ZWQgYnkgdGhlc2UgcmVzb3VyY2VzLAorICAgICAgICAvLyBhbmQgdHJ5IHRvIHVzZSBvbmUgb2YgdGhlbS4KKyAgICAgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgbWVtb3J5X3Byb3BlcnRpZXMgPSB7fTsKKyAgICAgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksICZtZW1vcnlfcHJvcGVydGllcyk7CisgICAgICAgIFZrRGV2aWNlTWVtb3J5IGltYWdlX21lbSwgYnVmZmVyX21lbTsKKworICAgICAgICB1aW50MzJfdCBpbWFnZV91bnN1cHBvcnRlZF9tZW1fdHlwZV9iaXRzID0gKCgxIDw8IG1lbW9yeV9wcm9wZXJ0aWVzLm1lbW9yeVR5cGVDb3VudCkgLSAxKSAmIH5pbWFnZV9tZW1fcmVxcy5tZW1vcnlUeXBlQml0czsKKyAgICAgICAgaWYgKGltYWdlX3Vuc3VwcG9ydGVkX21lbV90eXBlX2JpdHMgIT0gMCkgeworICAgICAgICAgICAgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUoaW1hZ2VfdW5zdXBwb3J0ZWRfbWVtX3R5cGVfYml0cywgJmltYWdlX2FsbG9jX2luZm8sIDApOworICAgICAgICAgICAgQVNTRVJUX1RSVUUocGFzcyk7CisgICAgICAgICAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkoZGV2aWNlKCksICZpbWFnZV9hbGxvY19pbmZvLCBOVUxMLCAmaW1hZ2VfbWVtKTsKKyAgICAgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS0wMTA0NyIpOworICAgICAgICAgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShkZXZpY2UoKSwgaW1hZ2UsIGltYWdlX21lbSwgMCk7CisgICAgICAgICAgICAodm9pZCllcnI7ICAvLyBUaGlzIG1heSB2ZXJ5IHdlbGwgcmV0dXJuIGFuIGVycm9yLgorICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgICAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgaW1hZ2VfbWVtLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGJ1ZmZlcl91bnN1cHBvcnRlZF9tZW1fdHlwZV9iaXRzID0KKyAgICAgICAgICAgICgoMSA8PCBtZW1vcnlfcHJvcGVydGllcy5tZW1vcnlUeXBlQ291bnQpIC0gMSkgJiB+YnVmZmVyX21lbV9yZXFzLm1lbW9yeVR5cGVCaXRzOworICAgICAgICBpZiAoYnVmZmVyX3Vuc3VwcG9ydGVkX21lbV90eXBlX2JpdHMgIT0gMCkgeworICAgICAgICAgICAgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUoYnVmZmVyX3Vuc3VwcG9ydGVkX21lbV90eXBlX2JpdHMsICZidWZmZXJfYWxsb2NfaW5mbywgMCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShwYXNzKTsKKyAgICAgICAgICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmJ1ZmZlcl9hbGxvY19pbmZvLCBOVUxMLCAmYnVmZmVyX21lbSk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktbWVtb3J5LTAxMDM1Iik7CisgICAgICAgICAgICBlcnIgPSB2azo6QmluZEJ1ZmZlck1lbW9yeShkZXZpY2UoKSwgYnVmZmVyLCBidWZmZXJfbWVtLCAwKTsKKyAgICAgICAgICAgICh2b2lkKWVycjsgIC8vIFRoaXMgbWF5IHZlcnkgd2VsbCByZXR1cm4gYW4gZXJyb3IuCisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBidWZmZXJfbWVtLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIHZrOjpEZXN0cm95SW1hZ2UoZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKKyAgICAgICAgdms6OkRlc3Ryb3lCdWZmZXIoZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisgICAgfQorCisgICAgLy8gVHJ5IHRvIGJpbmQgbWVtb3J5IHRvIGFuIGltYWdlIGNyZWF0ZWQgd2l0aCBzcGFyc2UgbWVtb3J5IGZsYWdzCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBzcGFyc2VfaW1hZ2VfY3JlYXRlX2luZm8gPSBpbWFnZV9jcmVhdGVfaW5mbzsKKyAgICAgICAgc3BhcnNlX2ltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzIHw9IFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQ7CisgICAgICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGltYWdlX2Zvcm1hdF9wcm9wZXJ0aWVzID0ge307CisgICAgICAgIGVyciA9IHZrOjpHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIHNwYXJzZV9pbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFyc2VfaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlLCBzcGFyc2VfaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhcnNlX2ltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlLCBzcGFyc2VfaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VfZm9ybWF0X3Byb3BlcnRpZXMpOworICAgICAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnNwYXJzZVJlc2lkZW5jeUltYWdlMkQgfHwgZXJyID09IFZLX0VSUk9SX0ZPUk1BVF9OT1RfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBtZWFucyBzcGFyc2UgZm9ybWF0cyBhcmVuJ3Qgc3VwcG9ydGVkIGhlcmU7IHNraXAgdGhpcyB0ZXN0LgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAgICAgICAgIGlmIChpbWFnZV9mb3JtYXRfcHJvcGVydGllcy5tYXhFeHRlbnQud2lkdGggPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgU3BhcnNlIGltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVmtJbWFnZSBzcGFyc2VfaW1hZ2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgICAgICAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCAmc3BhcnNlX2ltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmc3BhcnNlX2ltYWdlKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIHNwYXJzZV9tZW1fcmVxcyA9IHt9OworICAgICAgICAgICAgICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIHNwYXJzZV9pbWFnZSwgJnNwYXJzZV9tZW1fcmVxcyk7CisgICAgICAgICAgICAgICAgaWYgKHNwYXJzZV9tZW1fcmVxcy5tZW1vcnlUeXBlQml0cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIHNwYXJzZV9tZW1fYWxsb2MgPSB7fTsKKyAgICAgICAgICAgICAgICAgICAgc3BhcnNlX21lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgICAgICAgICAgICAgICAgICBzcGFyc2VfbWVtX2FsbG9jLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgc3BhcnNlX21lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IHNwYXJzZV9tZW1fcmVxcy5zaXplOworICAgICAgICAgICAgICAgICAgICBzcGFyc2VfbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKHNwYXJzZV9tZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJnNwYXJzZV9tZW1fYWxsb2MsIDApOworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VNZW1vcnkgc3BhcnNlX21lbSA9IFZLX05VTExfSEFORExFOworICAgICAgICAgICAgICAgICAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmc3BhcnNlX21lbV9hbGxvYywgTlVMTCwgJnNwYXJzZV9tZW0pOworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEltYWdlTWVtb3J5LWltYWdlLTAxMDQ1Iik7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHZrOjpCaW5kSW1hZ2VNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBzcGFyc2VfaW1hZ2UsIHNwYXJzZV9tZW0sIDApOworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSB2ZXJ5IHdlbGwgcmV0dXJuIGFuIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAodm9pZCllcnI7CisgICAgICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICAgICAgICAgICAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIHNwYXJzZV9tZW0sIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc3BhcnNlX2ltYWdlLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRyeSB0byBiaW5kIG1lbW9yeSB0byBhIGJ1ZmZlciBjcmVhdGVkIHdpdGggc3BhcnNlIG1lbW9yeSBmbGFncworICAgIHsKKyAgICAgICAgVmtCdWZmZXJDcmVhdGVJbmZvIHNwYXJzZV9idWZmZXJfY3JlYXRlX2luZm8gPSBidWZmZXJfY3JlYXRlX2luZm87CisgICAgICAgIHNwYXJzZV9idWZmZXJfY3JlYXRlX2luZm8uZmxhZ3MgfD0gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVDsKKyAgICAgICAgaWYgKCFtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKS5zcGFyc2VSZXNpZGVuY3lCdWZmZXIpIHsKKyAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IG1lYW5zIHNwYXJzZSBmb3JtYXRzIGFyZW4ndCBzdXBwb3J0ZWQgaGVyZTsgc2tpcCB0aGlzIHRlc3QuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWa0J1ZmZlciBzcGFyc2VfYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICBlcnIgPSB2azo6Q3JlYXRlQnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNwYXJzZV9idWZmZXJfY3JlYXRlX2luZm8sIE5VTEwsICZzcGFyc2VfYnVmZmVyKTsKKyAgICAgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBzcGFyc2VfbWVtX3JlcXMgPSB7fTsKKyAgICAgICAgICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMobV9kZXZpY2UtPmRldmljZSgpLCBzcGFyc2VfYnVmZmVyLCAmc3BhcnNlX21lbV9yZXFzKTsKKyAgICAgICAgICAgIGlmIChzcGFyc2VfbWVtX3JlcXMubWVtb3J5VHlwZUJpdHMgIT0gMCkgeworICAgICAgICAgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIHNwYXJzZV9tZW1fYWxsb2MgPSB7fTsKKyAgICAgICAgICAgICAgICBzcGFyc2VfbWVtX2FsbG9jLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgICAgICAgICAgICAgc3BhcnNlX21lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3BhcnNlX21lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IHNwYXJzZV9tZW1fcmVxcy5zaXplOworICAgICAgICAgICAgICAgIHNwYXJzZV9tZW1fYWxsb2MubWVtb3J5VHlwZUluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShzcGFyc2VfbWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsICZzcGFyc2VfbWVtX2FsbG9jLCAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwYXNzKTsKKyAgICAgICAgICAgICAgICBWa0RldmljZU1lbW9yeSBzcGFyc2VfbWVtID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICAgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNwYXJzZV9tZW1fYWxsb2MsIE5VTEwsICZzcGFyc2VfbWVtKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LWJ1ZmZlci0wMTAzMCIpOworICAgICAgICAgICAgICAgIGVyciA9IHZrOjpCaW5kQnVmZmVyTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgc3BhcnNlX2J1ZmZlciwgc3BhcnNlX21lbSwgMCk7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgdmVyeSB3ZWxsIHJldHVybiBhbiBlcnJvci4KKyAgICAgICAgICAgICAgICAodm9pZCllcnI7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgICAgICAgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBzcGFyc2VfbWVtLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc3BhcnNlX2J1ZmZlciwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQmluZE1lbW9yeVRvRGVzdHJveWVkT2JqZWN0KSB7CisgICAgVmtSZXN1bHQgZXJyOworICAgIGJvb2wgcGFzczsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktaW1hZ2UtcGFyYW1ldGVyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQ3JlYXRlIGFuIGltYWdlIG9iamVjdCwgYWxsb2NhdGUgbWVtb3J5LCBkZXN0cm95IHRoZSBvYmplY3QgYW5kIHRoZW4gdHJ5CisgICAgLy8gdG8gYmluZCBpdAorICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworCisgICAgY29uc3QgVmtGb3JtYXQgdGV4X2Zvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBjb25zdCBpbnQzMl90IHRleF93aWR0aCA9IDMyOworICAgIGNvbnN0IGludDMyX3QgdGV4X2hlaWdodCA9IDMyOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IHRleF9mb3JtYXQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gdGV4X3dpZHRoOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSB0ZXhfaGVpZ2h0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgIG1lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gMDsKKyAgICBtZW1fYWxsb2MubWVtb3J5VHlwZUluZGV4ID0gMDsKKworICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJmltYWdlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsICZtZW1fcmVxcyk7CisKKyAgICBtZW1fYWxsb2MuYWxsb2NhdGlvblNpemUgPSBtZW1fcmVxcy5zaXplOworICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmbWVtX2FsbG9jLCAwKTsKKyAgICBBU1NFUlRfVFJVRShwYXNzKTsKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeQorICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksICZtZW1fYWxsb2MsIE5VTEwsICZtZW0pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBJbnRyb2R1Y2UgdmFsaWRhdGlvbiBmYWlsdXJlLCBkZXN0cm95IEltYWdlIG9iamVjdCBiZWZvcmUgYmluZGluZworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZSwgTlVMTCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIE5vdyBUcnkgdG8gYmluZCBtZW1vcnkgdG8gdGhpcyBkZXN0cm95ZWQgb2JqZWN0CisgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCBtZW0sIDApOworICAgIC8vIFRoaXMgbWF5IHZlcnkgd2VsbCByZXR1cm4gYW4gZXJyb3IuCisgICAgKHZvaWQpZXJyOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRXhjZWVkTWVtb3J5QWxsb2NhdGlvbkNvdW50KSB7CisgICAgVmtSZXN1bHQgZXJyID0gVktfU1VDQ0VTUzsKKyAgICBjb25zdCBpbnQgbWF4X21lbXMgPSAzMjsKKyAgICBWa0RldmljZU1lbW9yeSBtZW1zW21heF9tZW1zICsgMV07CisKKyAgICBpZiAoIUVuYWJsZURldmljZVByb2ZpbGVMYXllcigpKSB7CisgICAgICAgIHByaW50ZigiJXMgRmFpbGVkIHRvIGVuYWJsZSBkZXZpY2UgcHJvZmlsZSBsYXllci5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgUEZOX3ZrU2V0UGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQgZnB2a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUID0KKyAgICAgICAgKFBGTl92a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIik7CisgICAgUEZOX3ZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUxpbWl0c0VYVCBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUxpbWl0c0VYVCA9CisgICAgICAgIChQRk5fdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQiKTsKKworICAgIGlmICghKGZwdmtTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVCkgfHwgIShmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUxpbWl0c0VYVCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBDYW4ndCBmaW5kIGRldmljZV9wcm9maWxlX2FwaSBmdW5jdGlvbnM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgcHJvcHM7CisgICAgZnB2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQoZ3B1KCksICZwcm9wcy5saW1pdHMpOworICAgIGlmIChwcm9wcy5saW1pdHMubWF4TWVtb3J5QWxsb2NhdGlvbkNvdW50ID4gbWF4X21lbXMpIHsKKyAgICAgICAgcHJvcHMubGltaXRzLm1heE1lbW9yeUFsbG9jYXRpb25Db3VudCA9IG1heF9tZW1zOworICAgICAgICBmcHZrU2V0UGh5c2ljYWxEZXZpY2VMaW1pdHNFWFQoZ3B1KCksICZwcm9wcy5saW1pdHMpOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIGN1cnJlbnRseSB2YWxpZCBtZW1vcnkgb2JqZWN0cyBpcyBub3QgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIGFsbG93ZWQiKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgIG1lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IDA7CisgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gNDsKKworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4X21lbXM7IGkrKykgeworICAgICAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtX2FsbG9jLCBOVUxMLCAmbWVtc1tpXSk7CisgICAgICAgIGlmIChlcnIgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbXNbal0sIE5VTEwpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZVNhbXBsZUNvdW50cykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlVzZSBiYWQgc2FtcGxlIGNvdW50cyBpbiBpbWFnZSB0cmFuc2ZlciBjYWxscyB0byB0cmlnZ2VyIHZhbGlkYXRpb24gZXJyb3JzLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyByZXFzID0gMDsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDI1NjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gMjU2OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworCisgICAgVmtJbWFnZUJsaXQgYmxpdF9yZWdpb24gPSB7fTsKKyAgICBibGl0X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBibGl0X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgYmxpdF9yZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgYmxpdF9yZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGJsaXRfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGJsaXRfcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBibGl0X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBibGl0X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgYmxpdF9yZWdpb24uc3JjT2Zmc2V0c1swXSA9IHswLCAwLCAwfTsKKyAgICBibGl0X3JlZ2lvbi5zcmNPZmZzZXRzWzFdID0gezI1NiwgMjU2LCAxfTsKKyAgICBibGl0X3JlZ2lvbi5kc3RPZmZzZXRzWzBdID0gezAsIDAsIDB9OworICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMV0gPSB7MTI4LCAxMjgsIDF9OworCisgICAgLy8gQ3JlYXRlIHR3byBpbWFnZXMsIHRoZSBzb3VyY2Ugd2l0aCBzYW1wbGVDb3VudCA9IDQsIGFuZCBhdHRlbXB0IHRvIGJsaXQKKyAgICAvLyBiZXR3ZWVuIHRoZW0KKyAgICB7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgICAgICBWa0ltYWdlT2JqIHNyY19pbWFnZShtX2RldmljZSk7CisgICAgICAgIHNyY19pbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisgICAgICAgIHNyY19pbWFnZS5TZXRMYXlvdXQoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMKTsKKyAgICAgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICAgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgICAgIFZrSW1hZ2VPYmogZHN0X2ltYWdlKG1fZGV2aWNlKTsKKyAgICAgICAgZHN0X2ltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICAgICAgZHN0X2ltYWdlLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgIC8vIFRPRE86IFRoZXNlIDIgVlVzIGFyZSByZWR1bmRhbnQgLSBleHBlY3Qgb25lIG9mIHRoZW0gdG8gZ28gYXdheQorICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjMzIik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMjgiKTsKKyAgICAgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBzcmNfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwgZHN0X2ltYWdlLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwgJmJsaXRfcmVnaW9uLCBWS19GSUxURVJfTkVBUkVTVCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSB0d28gaW1hZ2VzLCB0aGUgZGVzdCB3aXRoIHNhbXBsZUNvdW50ID0gNCwgYW5kIGF0dGVtcHQgdG8gYmxpdAorICAgIC8vIGJldHdlZW4gdGhlbQorICAgIHsKKyAgICAgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICAgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisgICAgICAgIFZrSW1hZ2VPYmogc3JjX2ltYWdlKG1fZGV2aWNlKTsKKyAgICAgICAgc3JjX2ltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICAgICAgc3JjX2ltYWdlLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwpOworICAgICAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzRfQklUOworICAgICAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICAgICAgVmtJbWFnZU9iaiBkc3RfaW1hZ2UobV9kZXZpY2UpOworICAgICAgICBkc3RfaW1hZ2UuaW5pdCgmaW1hZ2VfY3JlYXRlX2luZm8pOworICAgICAgICBkc3RfaW1hZ2UuU2V0TGF5b3V0KFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCk7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAgICAgLy8gVE9ETzogVGhlc2UgMiBWVXMgYXJlIHJlZHVuZGFudCAtIGV4cGVjdCBvbmUgb2YgdGhlbSB0byBnbyBhd2F5CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDAyMzQiKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIyOCIpOworICAgICAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHNyY19pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLCBkc3RfaW1hZ2UuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLCAmYmxpdF9yZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgfQorCisgICAgVmtCdWZmZXJJbWFnZUNvcHkgY29weV9yZWdpb24gPSB7fTsKKyAgICBjb3B5X3JlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSAxMjg7CisgICAgY29weV9yZWdpb24uYnVmZmVySW1hZ2VIZWlnaHQgPSAxMjg7CisgICAgY29weV9yZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLmltYWdlRXh0ZW50LmhlaWdodCA9IDY0OworICAgIGNvcHlfcmVnaW9uLmltYWdlRXh0ZW50LndpZHRoID0gNjQ7CisgICAgY29weV9yZWdpb24uaW1hZ2VFeHRlbnQuZGVwdGggPSAxOworCisgICAgLy8gQ3JlYXRlIHNyYyBidWZmZXIgYW5kIGRzdCBpbWFnZSB3aXRoIHNhbXBsZUNvdW50ID0gNCBhbmQgYXR0ZW1wdCB0byBjb3B5CisgICAgLy8gYnVmZmVyIHRvIGltYWdlCisgICAgeworICAgICAgICBWa0J1ZmZlck9iaiBzcmNfYnVmZmVyOworICAgICAgICBzcmNfYnVmZmVyLmluaXRfYXNfc3JjKCptX2RldmljZSwgMTI4ICogMTI4ICogNCwgcmVxcyk7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgICAgICBWa0ltYWdlT2JqIGRzdF9pbWFnZShtX2RldmljZSk7CisgICAgICAgIGRzdF9pbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisgICAgICAgIGRzdF9pbWFnZS5TZXRMYXlvdXQoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICJ3YXMgY3JlYXRlZCB3aXRoIGEgc2FtcGxlIGNvdW50IG9mIFZLX1NBTVBMRV9DT1VOVF80X0JJVCBidXQgbXVzdCBiZSBWS19TQU1QTEVfQ09VTlRfMV9CSVQiKTsKKyAgICAgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHNyY19idWZmZXIuaGFuZGxlKCksIGRzdF9pbWFnZS5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwgJmNvcHlfcmVnaW9uKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGRzdCBidWZmZXIgYW5kIHNyYyBpbWFnZSB3aXRoIHNhbXBsZUNvdW50ID0gNCBhbmQgYXR0ZW1wdCB0byBjb3B5CisgICAgLy8gaW1hZ2UgdG8gYnVmZmVyCisgICAgeworICAgICAgICBWa0J1ZmZlck9iaiBkc3RfYnVmZmVyOworICAgICAgICBkc3RfYnVmZmVyLmluaXRfYXNfZHN0KCptX2RldmljZSwgMTI4ICogMTI4ICogNCwgcmVxcyk7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgICAgICB2a190ZXN0aW5nOjpJbWFnZSBzcmNfaW1hZ2U7CisgICAgICAgIHNyY19pbWFnZS5pbml0KCptX2RldmljZSwgKGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICYpaW1hZ2VfY3JlYXRlX2luZm8sIHJlcXMpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgIndhcyBjcmVhdGVkIHdpdGggYSBzYW1wbGUgY291bnQgb2YgVktfU0FNUExFX0NPVU5UXzRfQklUIGJ1dCBtdXN0IGJlIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCIpOworICAgICAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgc3JjX2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmZmVyLmhhbmRsZSgpLCAxLCAmY29weV9yZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQmxpdEltYWdlRm9ybWF0VHlwZXMpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtGb3JtYXQgZl91bnNpZ25lZCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VSU5UOworICAgIFZrRm9ybWF0IGZfc2lnbmVkID0gVktfRk9STUFUX1I4RzhCOEE4X1NJTlQ7CisgICAgVmtGb3JtYXQgZl9mbG9hdCA9IFZLX0ZPUk1BVF9SMzJfU0ZMT0FUOworICAgIFZrRm9ybWF0IGZfZGVwdGggPSBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UOworICAgIFZrRm9ybWF0IGZfZGVwdGgyID0gVktfRk9STUFUX0QzMl9TRkxPQVQ7CisKKyAgICBpZiAoIUltYWdlRm9ybWF0SXNTdXBwb3J0ZWQoZ3B1KCksIGZfdW5zaWduZWQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKSB8fAorICAgICAgICAhSW1hZ2VGb3JtYXRJc1N1cHBvcnRlZChncHUoKSwgZl9zaWduZWQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKSB8fAorICAgICAgICAhSW1hZ2VGb3JtYXRJc1N1cHBvcnRlZChncHUoKSwgZl9mbG9hdCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpIHx8CisgICAgICAgICFJbWFnZUZvcm1hdElzU3VwcG9ydGVkKGdwdSgpLCBmX2RlcHRoLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCkgfHwKKyAgICAgICAgIUltYWdlRm9ybWF0SXNTdXBwb3J0ZWQoZ3B1KCksIGZfZGVwdGgyLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBSZXF1ZXN0ZWQgZm9ybWF0cyBub3Qgc3VwcG9ydGVkIC0gQmxpdEltYWdlRm9ybWF0VHlwZXMgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vdGUgYW55IG1pc3NpbmcgZmVhdHVyZSBiaXRzCisgICAgYm9vbCB1c3JjID0gIUltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoZ3B1KCksIGZfdW5zaWduZWQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCBWS19GT1JNQVRfRkVBVFVSRV9CTElUX1NSQ19CSVQpOworICAgIGJvb2wgdWRzdCA9ICFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBmX3Vuc2lnbmVkLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUKTsKKyAgICBib29sIHNzcmMgPSAhSW1hZ2VGb3JtYXRBbmRGZWF0dXJlc1N1cHBvcnRlZChncHUoKSwgZl9zaWduZWQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCBWS19GT1JNQVRfRkVBVFVSRV9CTElUX1NSQ19CSVQpOworICAgIGJvb2wgc2RzdCA9ICFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBmX3NpZ25lZCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIFZLX0ZPUk1BVF9GRUFUVVJFX0JMSVRfRFNUX0JJVCk7CisgICAgYm9vbCBmc3JjID0gIUltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoZ3B1KCksIGZfZmxvYXQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCBWS19GT1JNQVRfRkVBVFVSRV9CTElUX1NSQ19CSVQpOworICAgIGJvb2wgZmRzdCA9ICFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBmX2Zsb2F0LCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUKTsKKyAgICBib29sIGQxZHN0ID0gIUltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoZ3B1KCksIGZfZGVwdGgsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCBWS19GT1JNQVRfRkVBVFVSRV9CTElUX0RTVF9CSVQpOworICAgIGJvb2wgZDJzcmMgPSAhSW1hZ2VGb3JtYXRBbmRGZWF0dXJlc1N1cHBvcnRlZChncHUoKSwgZl9kZXB0aDIsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCBWS19GT1JNQVRfRkVBVFVSRV9CTElUX1NSQ19CSVQpOworCisgICAgVmtJbWFnZU9iaiB1bnNpZ25lZF9pbWFnZShtX2RldmljZSk7CisgICAgdW5zaWduZWRfaW1hZ2UuSW5pdCg2NCwgNjQsIDEsIGZfdW5zaWduZWQsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKHVuc2lnbmVkX2ltYWdlLmluaXRpYWxpemVkKCkpOworICAgIHVuc2lnbmVkX2ltYWdlLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCk7CisKKyAgICBWa0ltYWdlT2JqIHNpZ25lZF9pbWFnZShtX2RldmljZSk7CisgICAgc2lnbmVkX2ltYWdlLkluaXQoNjQsIDY0LCAxLCBmX3NpZ25lZCwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKHNpZ25lZF9pbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBzaWduZWRfaW1hZ2UuU2V0TGF5b3V0KFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMKTsKKworICAgIFZrSW1hZ2VPYmogZmxvYXRfaW1hZ2UobV9kZXZpY2UpOworICAgIGZsb2F0X2ltYWdlLkluaXQoNjQsIDY0LCAxLCBmX2Zsb2F0LCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBBU1NFUlRfVFJVRShmbG9hdF9pbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBmbG9hdF9pbWFnZS5TZXRMYXlvdXQoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwpOworCisgICAgVmtJbWFnZU9iaiBkZXB0aF9pbWFnZShtX2RldmljZSk7CisgICAgZGVwdGhfaW1hZ2UuSW5pdCg2NCwgNjQsIDEsIGZfZGVwdGgsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgIDApOworICAgIEFTU0VSVF9UUlVFKGRlcHRoX2ltYWdlLmluaXRpYWxpemVkKCkpOworICAgIGRlcHRoX2ltYWdlLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklULCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCk7CisKKyAgICBWa0ltYWdlT2JqIGRlcHRoX2ltYWdlMihtX2RldmljZSk7CisgICAgZGVwdGhfaW1hZ2UyLkluaXQoNjQsIDY0LCAxLCBmX2RlcHRoMiwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGRlcHRoX2ltYWdlMi5pbml0aWFsaXplZCgpKTsKKyAgICBkZXB0aF9pbWFnZTIuU2V0TGF5b3V0KFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMKTsKKworICAgIFZrSW1hZ2VCbGl0IGJsaXRSZWdpb24gPSB7fTsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBibGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBibGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGJsaXRSZWdpb24uc3JjT2Zmc2V0c1swXSA9IHswLCAwLCAwfTsKKyAgICBibGl0UmVnaW9uLnNyY09mZnNldHNbMV0gPSB7NjQsIDY0LCAxfTsKKyAgICBibGl0UmVnaW9uLmRzdE9mZnNldHNbMF0gPSB7MCwgMCwgMH07CisgICAgYmxpdFJlZ2lvbi5kc3RPZmZzZXRzWzFdID0gezMyLCAzMiwgMX07CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBVbnNpZ25lZCBpbnQgdnMgbm90IGFuIGludAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMzAiKTsKKyAgICBpZiAodXNyYykgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMTk5OSIpOworICAgIGlmIChmZHN0KSBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAyMDAwIik7CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCB1bnNpZ25lZF9pbWFnZS5pbWFnZSgpLCB1bnNpZ25lZF9pbWFnZS5MYXlvdXQoKSwgZmxvYXRfaW1hZ2UuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0X2ltYWdlLkxheW91dCgpLCAxLCAmYmxpdFJlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMzAiKTsKKyAgICBpZiAoZnNyYykgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMTk5OSIpOworICAgIGlmICh1ZHN0KSBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAyMDAwIik7CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBmbG9hdF9pbWFnZS5pbWFnZSgpLCBmbG9hdF9pbWFnZS5MYXlvdXQoKSwgdW5zaWduZWRfaW1hZ2UuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkX2ltYWdlLkxheW91dCgpLCAxLCAmYmxpdFJlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gU2lnbmVkIGludCB2cyBub3QgYW4gaW50LAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMjkiKTsKKyAgICBpZiAoc3NyYykgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMTk5OSIpOworICAgIGlmIChmZHN0KSBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAyMDAwIik7CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBzaWduZWRfaW1hZ2UuaW1hZ2UoKSwgc2lnbmVkX2ltYWdlLkxheW91dCgpLCBmbG9hdF9pbWFnZS5pbWFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXRfaW1hZ2UuTGF5b3V0KCksIDEsICZibGl0UmVnaW9uLCBWS19GSUxURVJfTkVBUkVTVCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIyOSIpOworICAgIGlmIChmc3JjKSBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAxOTk5Iik7CisgICAgaWYgKHNkc3QpIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDIwMDAiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGZsb2F0X2ltYWdlLmltYWdlKCksIGZsb2F0X2ltYWdlLkxheW91dCgpLCBzaWduZWRfaW1hZ2UuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIHNpZ25lZF9pbWFnZS5MYXlvdXQoKSwgMSwgJmJsaXRSZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFNpZ25lZCB2cyBVbnNpZ25lZCBpbnQgLSBnZW5lcmF0ZXMgYm90aCBWVXMKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjI5Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMCIpOworICAgIGlmIChzc3JjKSBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAxOTk5Iik7CisgICAgaWYgKHVkc3QpIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDIwMDAiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHNpZ25lZF9pbWFnZS5pbWFnZSgpLCBzaWduZWRfaW1hZ2UuTGF5b3V0KCksIHVuc2lnbmVkX2ltYWdlLmltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZF9pbWFnZS5MYXlvdXQoKSwgMSwgJmJsaXRSZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAwMjI5Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIzMCIpOworICAgIGlmICh1c3JjKSBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAxOTk5Iik7CisgICAgaWYgKHNkc3QpIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDIwMDAiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHVuc2lnbmVkX2ltYWdlLmltYWdlKCksIHVuc2lnbmVkX2ltYWdlLkxheW91dCgpLCBzaWduZWRfaW1hZ2UuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIHNpZ25lZF9pbWFnZS5MYXlvdXQoKSwgMSwgJmJsaXRSZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIERlcHRoIHZzIGFueSBub24taWRlbnRpY2FsIGRlcHRoIGZvcm1hdAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMzEiKTsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIGJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgaWYgKGQyc3JjKSBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXNyY0ltYWdlLTAxOTk5Iik7CisgICAgaWYgKGQxZHN0KSBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAyMDAwIik7CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkZXB0aF9pbWFnZTIuaW1hZ2UoKSwgZGVwdGhfaW1hZ2UyLkxheW91dCgpLCBkZXB0aF9pbWFnZS5pbWFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgZGVwdGhfaW1hZ2UuTGF5b3V0KCksIDEsICZibGl0UmVnaW9uLCBWS19GSUxURVJfTkVBUkVTVCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEJsaXRJbWFnZUZpbHRlcnMpIHsKKyAgICBib29sIGN1YmljX3N1cHBvcnQgPSBmYWxzZTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCAiVktfSU1HX2ZpbHRlcl9jdWJpYyIpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soIlZLX0lNR19maWx0ZXJfY3ViaWMiKTsKKyAgICAgICAgY3ViaWNfc3VwcG9ydCA9IHRydWU7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFZrRm9ybWF0IGZtdCA9IFZLX0ZPUk1BVF9SOF9VSU5UOworICAgIGlmICghSW1hZ2VGb3JtYXRJc1N1cHBvcnRlZChncHUoKSwgZm10LCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBObyBSOF9VSU5UIGZvcm1hdCBzdXBwb3J0IC0gQmxpdEltYWdlRmlsdGVycyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ3JlYXRlIDJEIGltYWdlcworICAgIFZrSW1hZ2VPYmogc3JjMkQobV9kZXZpY2UpOworICAgIFZrSW1hZ2VPYmogZHN0MkQobV9kZXZpY2UpOworICAgIHNyYzJELkluaXQoNjQsIDY0LCAxLCBmbXQsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBkc3QyRC5Jbml0KDY0LCA2NCwgMSwgZm10LCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoc3JjMkQuaW5pdGlhbGl6ZWQoKSk7CisgICAgQVNTRVJUX1RSVUUoZHN0MkQuaW5pdGlhbGl6ZWQoKSk7CisgICAgc3JjMkQuU2V0TGF5b3V0KFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMKTsKKyAgICBkc3QyRC5TZXRMYXlvdXQoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwpOworCisgICAgLy8gQ3JlYXRlIDNEIGltYWdlCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gY2k7CisgICAgY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBjaS5wTmV4dCA9IE5VTEw7CisgICAgY2kuZmxhZ3MgPSAwOworICAgIGNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfM0Q7CisgICAgY2kuZm9ybWF0ID0gZm10OworICAgIGNpLmV4dGVudCA9IHs2NCwgNjQsIDR9OworICAgIGNpLm1pcExldmVscyA9IDE7CisgICAgY2kuYXJyYXlMYXllcnMgPSAxOworICAgIGNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgIGNpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBjaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGNpLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGNpLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworCisgICAgVmtJbWFnZU9iaiBzcmMzRChtX2RldmljZSk7CisgICAgc3JjM0QuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKHNyYzNELmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZUJsaXQgYmxpdFJlZ2lvbiA9IHt9OworICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBibGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgYmxpdFJlZ2lvbi5zcmNPZmZzZXRzWzBdID0gezAsIDAsIDB9OworICAgIGJsaXRSZWdpb24uc3JjT2Zmc2V0c1sxXSA9IHs0OCwgNDgsIDF9OworICAgIGJsaXRSZWdpb24uZHN0T2Zmc2V0c1swXSA9IHswLCAwLCAwfTsKKyAgICBibGl0UmVnaW9uLmRzdE9mZnNldHNbMV0gPSB7NjQsIDY0LCAxfTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIC8vIFVJTlQgZm9ybWF0IHNob3VsZCBub3Qgc3VwcG9ydCBsaW5lYXIgZmlsdGVyaW5nLCBidXQgY2hlY2sgdG8gYmUgc3VyZQorICAgIGlmICghSW1hZ2VGb3JtYXRBbmRGZWF0dXJlc1N1cHBvcnRlZChncHUoKSwgZm10LCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVCkpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItMDIwMDEiKTsKKyAgICAgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBzcmMyRC5pbWFnZSgpLCBzcmMyRC5MYXlvdXQoKSwgZHN0MkQuaW1hZ2UoKSwgZHN0MkQuTGF5b3V0KCksIDEsICZibGl0UmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZJTFRFUl9MSU5FQVIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICBpZiAoY3ViaWNfc3VwcG9ydCAmJiAhSW1hZ2VGb3JtYXRBbmRGZWF0dXJlc1N1cHBvcnRlZChncHUoKSwgZm10LCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfSU1HKSkgeworICAgICAgICAvLyBJbnZhbGlkIGZpbHRlciBDVUJJQ19JTUcKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1maWx0ZXItMDIwMDIiKTsKKyAgICAgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBzcmMzRC5pbWFnZSgpLCBzcmMzRC5MYXlvdXQoKSwgZHN0MkQuaW1hZ2UoKSwgZHN0MkQuTGF5b3V0KCksIDEsICZibGl0UmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZJTFRFUl9DVUJJQ19JTUcpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICAvLyBJbnZhbGlkIGZpbHRlciBDVUJJQ19JTUcgKyBpbnZhbGlkIDJEIHNvdXJjZSBpbWFnZQorICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLWZpbHRlci0wMjAwMiIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLWZpbHRlci0wMDIzNyIpOworICAgICAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHNyYzJELmltYWdlKCksIHNyYzJELkxheW91dCgpLCBkc3QyRC5pbWFnZSgpLCBkc3QyRC5MYXlvdXQoKSwgMSwgJmJsaXRSZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgVktfRklMVEVSX0NVQklDX0lNRyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQmxpdEltYWdlTGF5b3V0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiSW5jb3JyZWN0IHZrQ21kQmxpdEltYWdlIGxheW91dHMiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIFZrUmVzdWx0IGVycjsKKyAgICBWa0Zvcm1hdCBmbXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisKKyAgICAvLyBDcmVhdGUgaW1hZ2VzCisgICAgVmtJbWFnZU9iaiBpbWdfc3JjX3RyYW5zZmVyKG1fZGV2aWNlKTsKKyAgICBWa0ltYWdlT2JqIGltZ19kc3RfdHJhbnNmZXIobV9kZXZpY2UpOworICAgIFZrSW1hZ2VPYmogaW1nX2dlbmVyYWwobV9kZXZpY2UpOworICAgIFZrSW1hZ2VPYmogaW1nX2NvbG9yKG1fZGV2aWNlKTsKKworICAgIGltZ19zcmNfdHJhbnNmZXIuSW5pdE5vTGF5b3V0KDY0LCA2NCwgMSwgZm10LCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgaW1nX2RzdF90cmFuc2Zlci5Jbml0Tm9MYXlvdXQoNjQsIDY0LCAxLCBmbXQsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBpbWdfZ2VuZXJhbC5Jbml0Tm9MYXlvdXQoNjQsIDY0LCAxLCBmbXQsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgaW1nX2NvbG9yLkluaXROb0xheW91dCg2NCwgNjQsIDEsIGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisKKyAgICBBU1NFUlRfVFJVRShpbWdfc3JjX3RyYW5zZmVyLmluaXRpYWxpemVkKCkpOworICAgIEFTU0VSVF9UUlVFKGltZ19kc3RfdHJhbnNmZXIuaW5pdGlhbGl6ZWQoKSk7CisgICAgQVNTRVJUX1RSVUUoaW1nX2dlbmVyYWwuaW5pdGlhbGl6ZWQoKSk7CisgICAgQVNTRVJUX1RSVUUoaW1nX2NvbG9yLmluaXRpYWxpemVkKCkpOworCisgICAgaW1nX3NyY190cmFuc2Zlci5TZXRMYXlvdXQoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMKTsKKyAgICBpbWdfZHN0X3RyYW5zZmVyLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwpOworICAgIGltZ19nZW5lcmFsLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCk7CisgICAgaW1nX2NvbG9yLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMKTsKKworICAgIFZrSW1hZ2VCbGl0IGJsaXRfcmVnaW9uID0ge307CisgICAgYmxpdF9yZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgYmxpdF9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGJsaXRfcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGJsaXRfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBibGl0X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBibGl0X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgYmxpdF9yZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgYmxpdF9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGJsaXRfcmVnaW9uLnNyY09mZnNldHNbMF0gPSB7MCwgMCwgMH07CisgICAgYmxpdF9yZWdpb24uc3JjT2Zmc2V0c1sxXSA9IHs0OCwgNDgsIDF9OworICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMF0gPSB7MCwgMCwgMH07CisgICAgYmxpdF9yZWdpb24uZHN0T2Zmc2V0c1sxXSA9IHs2NCwgNjQsIDF9OworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gSWxsZWdhbCBzcmNJbWFnZUxheW91dAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2VMYXlvdXQtMDAyMjIiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltZ19zcmNfdHJhbnNmZXIuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgIGltZ19kc3RfdHJhbnNmZXIuaW1hZ2UoKSwgaW1nX2RzdF90cmFuc2Zlci5MYXlvdXQoKSwgMSwgJmJsaXRfcmVnaW9uLCBWS19GSUxURVJfTElORUFSKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIElsbGVnYWwgZGVzdEltYWdlTGF5b3V0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZUxheW91dC0wMDIyNyIpOworICAgIHZrOjpDbWRCbGl0SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1nX3NyY190cmFuc2Zlci5pbWFnZSgpLCBpbWdfc3JjX3RyYW5zZmVyLkxheW91dCgpLCBpbWdfZHN0X3RyYW5zZmVyLmltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLCAxLCAmYmxpdF9yZWdpb24sIFZLX0ZJTFRFUl9MSU5FQVIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgZXJyID0gdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPnJlc2V0KDApOworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIC8vIFNvdXJjZSBpbWFnZSBpbiBpbnZhbGlkIGxheW91dCBhdCBzdGFydCBvZiB0aGUgQ0IKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2VMYXlvdXQiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltZ19zcmNfdHJhbnNmZXIuaW1hZ2UoKSwgaW1nX3NyY190cmFuc2Zlci5MYXlvdXQoKSwgaW1nX2NvbG9yLmltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJmJsaXRfcmVnaW9uLCBWS19GSUxURVJfTElORUFSKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBlcnIgPSB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+cmVzZXQoMCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gRGVzdGluYXRpb24gaW1hZ2UgaW4gaW52YWxpZCBsYXlvdXQgYXQgc3RhcnQgb2YgdGhlIENCCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEltYWdlTGF5b3V0Iik7CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWdfY29sb3IuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltZ19kc3RfdHJhbnNmZXIuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIGltZ19kc3RfdHJhbnNmZXIuTGF5b3V0KCksIDEsICZibGl0X3JlZ2lvbiwgVktfRklMVEVSX0xJTkVBUik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgZXJyID0gdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBTb3VyY2UgaW1hZ2UgaW4gaW52YWxpZCBsYXlvdXQgaW4gdGhlIG1pZGRsZSBvZiBDQgorICAgIG1fY29tbWFuZEJ1ZmZlci0+cmVzZXQoMCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIgPSB7fTsKKyAgICBpbWdfYmFycmllci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSOworICAgIGltZ19iYXJyaWVyLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBpbWdfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gMDsKKyAgICBpbWdfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gMDsKKyAgICBpbWdfYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBpbWdfYmFycmllci5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXIuaW1hZ2UgPSBpbWdfZ2VuZXJhbC5oYW5kbGUoKTsKKyAgICBpbWdfYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZUxheW91dC0wMDIyMSIpOworICAgIHZrOjpDbWRCbGl0SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1nX2dlbmVyYWwuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltZ19kc3RfdHJhbnNmZXIuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIGltZ19kc3RfdHJhbnNmZXIuTGF5b3V0KCksIDEsICZibGl0X3JlZ2lvbiwgVktfRklMVEVSX0xJTkVBUik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgZXJyID0gdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBEZXN0aW5hdGlvbiBpbWFnZSBpbiBpbnZhbGlkIGxheW91dCBpbiB0aGUgbWlkZGxlIG9mIENCCisgICAgbV9jb21tYW5kQnVmZmVyLT5yZXNldCgwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICBpbWdfYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMOworICAgIGltZ19iYXJyaWVyLmltYWdlID0gaW1nX2RzdF90cmFuc2Zlci5oYW5kbGUoKTsKKworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1kc3RJbWFnZUxheW91dC0wMDIyNiIpOworICAgIHZrOjpDbWRCbGl0SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1nX3NyY190cmFuc2Zlci5pbWFnZSgpLCBpbWdfc3JjX3RyYW5zZmVyLkxheW91dCgpLCBpbWdfZHN0X3RyYW5zZmVyLmltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsIDEsICZibGl0X3JlZ2lvbiwgVktfRklMVEVSX0xJTkVBUik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgZXJyID0gdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQmxpdEltYWdlT2Zmc2V0cykgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa0Zvcm1hdCBmbXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgaWYgKCFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBmbXQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfRkVBVFVSRV9CTElUX1NSQ19CSVQgfCBWS19GT1JNQVRfRkVBVFVSRV9CTElUX0RTVF9CSVQpKSB7CisgICAgICAgIHByaW50ZigiJXMgTm8gYmxpdCBmZWF0dXJlIGJpdHMgLSBCbGl0SW1hZ2VPZmZzZXRzIHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBjaTsKKyAgICBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGNpLnBOZXh0ID0gTlVMTDsKKyAgICBjaS5mbGFncyA9IDA7CisgICAgY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8xRDsKKyAgICBjaS5mb3JtYXQgPSBmbXQ7CisgICAgY2kuZXh0ZW50ID0gezY0LCAxLCAxfTsKKyAgICBjaS5taXBMZXZlbHMgPSAxOworICAgIGNpLmFycmF5TGF5ZXJzID0gMTsKKyAgICBjaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGNpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGNpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgY2kuc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgIGNpLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDA7CisgICAgY2kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IE5VTEw7CisgICAgY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlXzFEKG1fZGV2aWNlKTsKKyAgICBpbWFnZV8xRC5pbml0KCZjaSk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2VfMUQuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmV4dGVudCA9IHs2NCwgNjQsIDF9OworICAgIFZrSW1hZ2VPYmogaW1hZ2VfMkQobV9kZXZpY2UpOworICAgIGltYWdlXzJELmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV8yRC5pbml0aWFsaXplZCgpKTsKKworICAgIGNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfM0Q7CisgICAgY2kuZXh0ZW50ID0gezY0LCA2NCwgNjR9OworICAgIFZrSW1hZ2VPYmogaW1hZ2VfM0QobV9kZXZpY2UpOworICAgIGltYWdlXzNELmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV8zRC5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VCbGl0IGJsaXRfcmVnaW9uID0ge307CisgICAgYmxpdF9yZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgYmxpdF9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGJsaXRfcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGJsaXRfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBibGl0X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBibGl0X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgYmxpdF9yZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgYmxpdF9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gMUQsIHdpdGggc3JjL2Rlc3QgeSBvZmZzZXRzIG90aGVyIHRoYW4gKDAsMSkKKyAgICBibGl0X3JlZ2lvbi5zcmNPZmZzZXRzWzBdID0gezAsIDEsIDB9OworICAgIGJsaXRfcmVnaW9uLnNyY09mZnNldHNbMV0gPSB7MzAsIDEsIDF9OworICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMF0gPSB7MzIsIDAsIDB9OworICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMV0gPSB7NjQsIDEsIDF9OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUJsaXQtc3JjSW1hZ2UtMDAyNDUiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzFELmltYWdlKCksIGltYWdlXzFELkxheW91dCgpLCBpbWFnZV8xRC5pbWFnZSgpLCBpbWFnZV8xRC5MYXlvdXQoKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICZibGl0X3JlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgYmxpdF9yZWdpb24uc3JjT2Zmc2V0c1swXSA9IHswLCAwLCAwfTsKKyAgICBibGl0X3JlZ2lvbi5kc3RPZmZzZXRzWzBdID0gezMyLCAxLCAwfTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VCbGl0LWRzdEltYWdlLTAwMjUwIik7CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8xRC5pbWFnZSgpLCBpbWFnZV8xRC5MYXlvdXQoKSwgaW1hZ2VfMUQuaW1hZ2UoKSwgaW1hZ2VfMUQuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdF9yZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIDJELCB3aXRoIHNyYy9kZXN0IHogb2Zmc2V0cyBvdGhlciB0aGFuICgwLDEpCisgICAgYmxpdF9yZWdpb24uc3JjT2Zmc2V0c1swXSA9IHswLCAwLCAxfTsKKyAgICBibGl0X3JlZ2lvbi5zcmNPZmZzZXRzWzFdID0gezI0LCAzMSwgMX07CisgICAgYmxpdF9yZWdpb24uZHN0T2Zmc2V0c1swXSA9IHszMiwgMzIsIDB9OworICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMV0gPSB7NjQsIDY0LCAxfTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VCbGl0LXNyY0ltYWdlLTAwMjQ3Iik7CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8yRC5pbWFnZSgpLCBpbWFnZV8yRC5MYXlvdXQoKSwgaW1hZ2VfMkQuaW1hZ2UoKSwgaW1hZ2VfMkQuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdF9yZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGJsaXRfcmVnaW9uLnNyY09mZnNldHNbMF0gPSB7MCwgMCwgMH07CisgICAgYmxpdF9yZWdpb24uZHN0T2Zmc2V0c1swXSA9IHszMiwgMzIsIDF9OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUJsaXQtZHN0SW1hZ2UtMDAyNTIiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzJELmltYWdlKCksIGltYWdlXzJELkxheW91dCgpLCBpbWFnZV8yRC5pbWFnZSgpLCBpbWFnZV8yRC5MYXlvdXQoKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICZibGl0X3JlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gU291cmNlIG9mZnNldHMgZXhjZWVkaW5nIHNvdXJjZSBpbWFnZSBkaW1lbnNpb25zCisgICAgYmxpdF9yZWdpb24uc3JjT2Zmc2V0c1swXSA9IHswLCAwLCAwfTsKKyAgICBibGl0X3JlZ2lvbi5zcmNPZmZzZXRzWzFdID0gezY1LCA2NCwgMX07ICAvLyBzcmMgeAorICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMF0gPSB7MCwgMCwgMH07CisgICAgYmxpdF9yZWdpb24uZHN0T2Zmc2V0c1sxXSA9IHs2NCwgNjQsIDF9OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUJsaXQtc3JjT2Zmc2V0LTAwMjQzIik7ICAgIC8vIHgKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXBSZWdpb25zLTAwMjE1Iik7ICAvLyBzcmMgcmVnaW9uCisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8zRC5pbWFnZSgpLCBpbWFnZV8zRC5MYXlvdXQoKSwgaW1hZ2VfMkQuaW1hZ2UoKSwgaW1hZ2VfMkQuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdF9yZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGJsaXRfcmVnaW9uLnNyY09mZnNldHNbMV0gPSB7NjQsIDY1LCAxfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYyB5CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQmxpdC1zcmNPZmZzZXQtMDAyNDQiKTsgICAgLy8geQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtcFJlZ2lvbnMtMDAyMTUiKTsgIC8vIHNyYyByZWdpb24KKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzNELmltYWdlKCksIGltYWdlXzNELkxheW91dCgpLCBpbWFnZV8yRC5pbWFnZSgpLCBpbWFnZV8yRC5MYXlvdXQoKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICZibGl0X3JlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgYmxpdF9yZWdpb24uc3JjT2Zmc2V0c1swXSA9IHswLCAwLCA2NX07ICAvLyBzcmMgegorICAgIGJsaXRfcmVnaW9uLnNyY09mZnNldHNbMV0gPSB7NjQsIDY0LCA2NH07CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQmxpdC1zcmNPZmZzZXQtMDAyNDYiKTsgICAgLy8gegorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtcFJlZ2lvbnMtMDAyMTUiKTsgIC8vIHNyYyByZWdpb24KKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzNELmltYWdlKCksIGltYWdlXzNELkxheW91dCgpLCBpbWFnZV8yRC5pbWFnZSgpLCBpbWFnZV8yRC5MYXlvdXQoKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICZibGl0X3JlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gRGVzdCBvZmZzZXRzIGV4Y2VlZGluZyBzb3VyY2UgaW1hZ2UgZGltZW5zaW9ucworICAgIGJsaXRfcmVnaW9uLnNyY09mZnNldHNbMF0gPSB7MCwgMCwgMH07CisgICAgYmxpdF9yZWdpb24uc3JjT2Zmc2V0c1sxXSA9IHs2NCwgNjQsIDF9OworICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMF0gPSB7OTYsIDY0LCAzMn07ICAvLyBkc3QgeAorICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMV0gPSB7NjQsIDAsIDMzfTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VCbGl0LWRzdE9mZnNldC0wMDI0OCIpOyAgICAvLyB4CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy0wMDIxNiIpOyAgLy8gZHN0IHJlZ2lvbgorICAgIHZrOjpDbWRCbGl0SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2VfMkQuaW1hZ2UoKSwgaW1hZ2VfMkQuTGF5b3V0KCksIGltYWdlXzNELmltYWdlKCksIGltYWdlXzNELkxheW91dCgpLCAxLAorICAgICAgICAgICAgICAgICAgICAgJmJsaXRfcmVnaW9uLCBWS19GSUxURVJfTkVBUkVTVCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBibGl0X3JlZ2lvbi5kc3RPZmZzZXRzWzBdID0gezAsIDY1LCAzMn07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkc3QgeQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUJsaXQtZHN0T2Zmc2V0LTAwMjQ5Iik7ICAgIC8vIHkKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXBSZWdpb25zLTAwMjE2Iik7ICAvLyBkc3QgcmVnaW9uCisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8yRC5pbWFnZSgpLCBpbWFnZV8yRC5MYXlvdXQoKSwgaW1hZ2VfM0QuaW1hZ2UoKSwgaW1hZ2VfM0QuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdF9yZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGJsaXRfcmVnaW9uLmRzdE9mZnNldHNbMF0gPSB7MCwgNjQsIDY1fTsgIC8vIGRzdCB6CisgICAgYmxpdF9yZWdpb24uZHN0T2Zmc2V0c1sxXSA9IHs2NCwgMCwgNjR9OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUJsaXQtZHN0T2Zmc2V0LTAwMjUxIik7ICAgIC8vIHoKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLXBSZWdpb25zLTAwMjE2Iik7ICAvLyBkc3QgcmVnaW9uCisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8yRC5pbWFnZSgpLCBpbWFnZV8yRC5MYXlvdXQoKSwgaW1hZ2VfM0QuaW1hZ2UoKSwgaW1hZ2VfM0QuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdF9yZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgTWlzY0JsaXRJbWFnZVRlc3RzKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrRm9ybWF0IGZfY29sb3IgPSBWS19GT1JNQVRfUjMyX1NGTE9BVDsgIC8vIE5lZWQgZmVhdHVyZXMgLi5CTElUX1NSQ19CSVQgJiAuLkJMSVRfRFNUX0JJVAorCisgICAgaWYgKCFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBmX2NvbG9yLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9TUkNfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUKSkgeworICAgICAgICBwcmludGYoIiVzIFJlcXVlc3RlZCBmb3JtYXQgZmVhdHVyZXMgdW5hdmFpbGFibGUgLSBNaXNjQmxpdEltYWdlVGVzdHMgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGNpOworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IGZfY29sb3I7CisgICAgY2kuZXh0ZW50ID0gezY0LCA2NCwgMX07CisgICAgY2kubWlwTGV2ZWxzID0gMTsKKyAgICBjaS5hcnJheUxheWVycyA9IDE7CisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBjaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGNpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBjaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGNpLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGNpLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworCisgICAgLy8gMkQgY29sb3IgaW1hZ2UKKyAgICBWa0ltYWdlT2JqIGNvbG9yX2ltZyhtX2RldmljZSk7CisgICAgY29sb3JfaW1nLmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShjb2xvcl9pbWcuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyAyRCBtdWx0aS1zYW1wbGUgaW1hZ2UKKyAgICBjaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzRfQklUOworICAgIFZrSW1hZ2VPYmogbXNfaW1nKG1fZGV2aWNlKTsKKyAgICBtc19pbWcuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKG1zX2ltZy5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIDNEIGNvbG9yIGltYWdlCisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzNEOworICAgIGNpLmV4dGVudCA9IHs2NCwgNjQsIDh9OworICAgIFZrSW1hZ2VPYmogY29sb3JfM0RfaW1nKG1fZGV2aWNlKTsKKyAgICBjb2xvcl8zRF9pbWcuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKGNvbG9yXzNEX2ltZy5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VCbGl0IGJsaXRSZWdpb24gPSB7fTsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBibGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBibGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGJsaXRSZWdpb24uc3JjT2Zmc2V0c1swXSA9IHswLCAwLCAwfTsKKyAgICBibGl0UmVnaW9uLnNyY09mZnNldHNbMV0gPSB7MTYsIDE2LCAxfTsKKyAgICBibGl0UmVnaW9uLmRzdE9mZnNldHNbMF0gPSB7MzIsIDMyLCAwfTsKKyAgICBibGl0UmVnaW9uLmRzdE9mZnNldHNbMV0gPSB7NjQsIDY0LCAxfTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIC8vIEJsaXQgd2l0aCBhc3BlY3RNYXNrIGVycm9ycworICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VCbGl0LWFzcGVjdE1hc2stMDAyNDEiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VCbGl0LWFzcGVjdE1hc2stMDAyNDIiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGNvbG9yX2ltZy5pbWFnZSgpLCBjb2xvcl9pbWcuTGF5b3V0KCksIGNvbG9yX2ltZy5pbWFnZSgpLCBjb2xvcl9pbWcuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdFJlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQmxpdCB3aXRoIGludmFsaWQgc3JjIG1pcCBsZXZlbAorICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gY2kubWlwTGV2ZWxzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjU3VicmVzb3VyY2UtMDE3MDUiKTsgIC8vIGludmFsaWQgc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwKKyAgICAvLyBSZWR1bmRhbnQgdW5hdm9pZGFibGUgZXJyb3JzCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQmxpdC1zcmNPZmZzZXQtMDAyNDMiKTsgIC8vIG91dC1vZi1ib3VuZHMgc3JjT2Zmc2V0LngKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VCbGl0LXNyY09mZnNldC0wMDI0NCIpOyAgLy8gb3V0LW9mLWJvdW5kcyBzcmNPZmZzZXQueQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUJsaXQtc3JjT2Zmc2V0LTAwMjQ2Iik7ICAvLyBvdXQtb2YtYm91bmRzIHNyY09mZnNldC56CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJsaXRJbWFnZS1wUmVnaW9ucy0wMDIxNSIpOyAgLy8gcmVnaW9uIG5vdCBjb250YWluZWQgd2l0aGluIHNyYyBpbWFnZQorICAgIHZrOjpDbWRCbGl0SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgY29sb3JfaW1nLmltYWdlKCksIGNvbG9yX2ltZy5MYXlvdXQoKSwgY29sb3JfaW1nLmltYWdlKCksIGNvbG9yX2ltZy5MYXlvdXQoKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICZibGl0UmVnaW9uLCBWS19GSUxURVJfTkVBUkVTVCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBCbGl0IHdpdGggaW52YWxpZCBkc3QgbWlwIGxldmVsCisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IGNpLm1pcExldmVsczsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdFN1YnJlc291cmNlLTAxNzA2Iik7ICAvLyBpbnZhbGlkIGRzdFN1YnJlc291cmNlLm1pcExldmVsCisgICAgLy8gUmVkdW5kYW50IHVuYXZvaWRhYmxlIGVycm9ycworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUJsaXQtZHN0T2Zmc2V0LTAwMjQ4Iik7ICAvLyBvdXQtb2YtYm91bmRzIGRzdE9mZnNldC54CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQmxpdC1kc3RPZmZzZXQtMDAyNDkiKTsgIC8vIG91dC1vZi1ib3VuZHMgZHN0T2Zmc2V0LnkKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VCbGl0LWRzdE9mZnNldC0wMDI1MSIpOyAgLy8gb3V0LW9mLWJvdW5kcyBkc3RPZmZzZXQuegorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtcFJlZ2lvbnMtMDAyMTYiKTsgIC8vIHJlZ2lvbiBub3QgY29udGFpbmVkIHdpdGhpbiBkc3QgaW1hZ2UKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGNvbG9yX2ltZy5pbWFnZSgpLCBjb2xvcl9pbWcuTGF5b3V0KCksIGNvbG9yX2ltZy5pbWFnZSgpLCBjb2xvcl9pbWcuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdFJlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQmxpdCB3aXRoIGludmFsaWQgc3JjIGFycmF5IGxheWVyCisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IGNpLmFycmF5TGF5ZXJzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjU3VicmVzb3VyY2UtMDE3MDciKTsgIC8vIGludmFsaWQgc3JjU3VicmVzb3VyY2UgbGF5ZXIgcmFuZ2UKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGNvbG9yX2ltZy5pbWFnZSgpLCBjb2xvcl9pbWcuTGF5b3V0KCksIGNvbG9yX2ltZy5pbWFnZSgpLCBjb2xvcl9pbWcuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdFJlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQmxpdCB3aXRoIGludmFsaWQgZHN0IGFycmF5IGxheWVyCisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IGNpLmFycmF5TGF5ZXJzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE3MDgiKTsgIC8vIGludmFsaWQgZHN0U3VicmVzb3VyY2UgbGF5ZXIgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZHVuZGFudCB1bmF2b2lkYWJsZSBlcnJvcnMKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGNvbG9yX2ltZy5pbWFnZSgpLCBjb2xvcl9pbWcuTGF5b3V0KCksIGNvbG9yX2ltZy5pbWFnZSgpLCBjb2xvcl9pbWcuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdFJlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisKKyAgICAvLyBCbGl0IG11bHRpLXNhbXBsZSBpbWFnZQorICAgIC8vIFRPRE86IHJlZHVuZGFudCBWVXMsIG9uZSAoMWM4KSBvciB0d28gKDFkMiAmIDFkNCkgc2hvdWxkIGJlIGVsaW1pbmF0ZWQuCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNJbWFnZS0wMDIyOCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2Utc3JjSW1hZ2UtMDAyMzMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmxpdEltYWdlLWRzdEltYWdlLTAwMjM0Iik7CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBtc19pbWcuaW1hZ2UoKSwgbXNfaW1nLkxheW91dCgpLCBtc19pbWcuaW1hZ2UoKSwgbXNfaW1nLkxheW91dCgpLCAxLCAmYmxpdFJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEJsaXQgM0Qgd2l0aCBiYXNlQXJyYXlMYXllciAhPSAwIG9yIGxheWVyQ291bnQgIT0gMQorICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VCbGl0LXNyY0ltYWdlLTAwMjQwIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZEJsaXRJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTcwNyIpOyAgLy8gYmFzZStjb3VudCA+IHRvdGFsIGxheWVyIGNvdW50CisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBjb2xvcl8zRF9pbWcuaW1hZ2UoKSwgY29sb3JfM0RfaW1nLkxheW91dCgpLCBjb2xvcl8zRF9pbWcuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbG9yXzNEX2ltZy5MYXlvdXQoKSwgMSwgJmJsaXRSZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAwOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUJsaXQtc3JjSW1hZ2UtMDAyNDAiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1sYXllckNvdW50LTAxNzAwIik7ICAvLyBsYXllciBjb3VudCA9PSAwIChzcmMpCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQmxpdC1sYXllckNvdW50LTAwMjM5Iik7ICAvLyBzcmMvZHN0IGxheWVyIGNvdW50IG1pc21hdGNoCisgICAgdms6OkNtZEJsaXRJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBjb2xvcl8zRF9pbWcuaW1hZ2UoKSwgY29sb3JfM0RfaW1nLkxheW91dCgpLCBjb2xvcl8zRF9pbWcuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbG9yXzNEX2ltZy5MYXlvdXQoKSwgMSwgJmJsaXRSZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQmxpdFRvRGVwdGhJbWFnZVRlc3RzKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIE5lZWQgZmVhdHVyZSAuLkJMSVRfU1JDX0JJVCBidXQgbm90IC4uQkxJVF9EU1RfQklUCisgICAgLy8gVE9ETzogcHJvdmlkZSBtb3JlIGNob2ljZXMgaGVyZTsgc3VwcG9ydGluZyBEMzJfU0ZMT0FUIGFzIEJMSVRfRFNUIGlzbid0IHVuaGVhcmQgb2YuCisgICAgVmtGb3JtYXQgZl9kZXB0aCA9IFZLX0ZPUk1BVF9EMzJfU0ZMT0FUOworCisgICAgaWYgKCFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBmX2RlcHRoLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9TUkNfQklUKSB8fAorICAgICAgICBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBmX2RlcHRoLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUKSkgeworICAgICAgICBwcmludGYoIiVzIFJlcXVlc3RlZCBmb3JtYXQgZmVhdHVyZXMgdW5hdmFpbGFibGUgLSBCbGl0VG9EZXB0aEltYWdlVGVzdHMgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGNpOworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IGZfZGVwdGg7CisgICAgY2kuZXh0ZW50ID0gezY0LCA2NCwgMX07CisgICAgY2kubWlwTGV2ZWxzID0gMTsKKyAgICBjaS5hcnJheUxheWVycyA9IDE7CisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBjaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGNpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBjaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGNpLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGNpLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworCisgICAgLy8gMkQgZGVwdGggaW1hZ2UKKyAgICBWa0ltYWdlT2JqIGRlcHRoX2ltZyhtX2RldmljZSk7CisgICAgZGVwdGhfaW1nLmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShkZXB0aF9pbWcuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0ltYWdlQmxpdCBibGl0UmVnaW9uID0ge307CisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBibGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBibGl0UmVnaW9uLnNyY09mZnNldHNbMF0gPSB7MCwgMCwgMH07CisgICAgYmxpdFJlZ2lvbi5zcmNPZmZzZXRzWzFdID0gezE2LCAxNiwgMX07CisgICAgYmxpdFJlZ2lvbi5kc3RPZmZzZXRzWzBdID0gezMyLCAzMiwgMH07CisgICAgYmxpdFJlZ2lvbi5kc3RPZmZzZXRzWzFdID0gezY0LCA2NCwgMX07CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBCbGl0IGRlcHRoIGltYWdlIC0gaGFzIFNSQ19CSVQgYnV0IG5vdCBEU1RfQklUCisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsKKyAgICBibGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCbGl0SW1hZ2UtZHN0SW1hZ2UtMDIwMDAiKTsKKyAgICB2azo6Q21kQmxpdEltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRlcHRoX2ltZy5pbWFnZSgpLCBkZXB0aF9pbWcuTGF5b3V0KCksIGRlcHRoX2ltZy5pbWFnZSgpLCBkZXB0aF9pbWcuTGF5b3V0KCksIDEsCisgICAgICAgICAgICAgICAgICAgICAmYmxpdFJlZ2lvbiwgVktfRklMVEVSX05FQVJFU1QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNaW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0cyBmb3IgdmFsaWRhdGlvbiBvZiBRdWV1ZSBGYW1pbHkgcHJvcGVydHkgbWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5LiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBhdXRvIHF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzID0gbV9kZXZpY2UtPnBoeSgpLnF1ZXVlX3Byb3BlcnRpZXMoKTsKKyAgICBhdXRvIGxhcmdlX2dyYW51bGFyaXR5X2ZhbWlseSA9CisgICAgICAgIHN0ZDo6ZmluZF9pZihxdWV1ZV9mYW1pbHlfcHJvcGVydGllcy5iZWdpbigpLCBxdWV1ZV9mYW1pbHlfcHJvcGVydGllcy5lbmQoKSwgW10oVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMgZmFtaWx5X3Byb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIFZrRXh0ZW50M0QgZmFtaWx5X2dyYW51bGFyaXR5ID0gZmFtaWx5X3Byb3BlcnRpZXMubWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5OworICAgICAgICAgICAgLy8gV2UgbmVlZCBhIHF1ZXVlIGZhbWlseSB0aGF0IHN1cHBvcnRzIGNvcHkgb3BlcmF0aW9ucyBhbmQgaGFzIGEgbGFyZ2UgZW5vdWdoIG1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eSBmb3IgdGhlIHRlc3RzCisgICAgICAgICAgICAvLyBiZWxvdyB0byBtYWtlIHNlbnNlLgorICAgICAgICAgICAgcmV0dXJuIChmYW1pbHlfcHJvcGVydGllcy5xdWV1ZUZsYWdzICYgVktfUVVFVUVfVFJBTlNGRVJfQklUIHx8IGZhbWlseV9wcm9wZXJ0aWVzLnF1ZXVlRmxhZ3MgJiBWS19RVUVVRV9HUkFQSElDU19CSVQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmFtaWx5X3Byb3BlcnRpZXMucXVldWVGbGFncyAmIFZLX1FVRVVFX0NPTVBVVEVfQklUKSAmJgorICAgICAgICAgICAgICAgICAgIGZhbWlseV9ncmFudWxhcml0eS5kZXB0aCA+PSA0ICYmIGZhbWlseV9ncmFudWxhcml0eS53aWR0aCA+PSA0ICYmIGZhbWlseV9ncmFudWxhcml0eS5oZWlnaHQgPj0gNDsKKyAgICAgICAgfSk7CisKKyAgICBpZiAobGFyZ2VfZ3JhbnVsYXJpdHlfZmFtaWx5ID09IHF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzLmVuZCgpKSB7CisgICAgICAgIHByaW50ZigiJXMgTm8gcXVldWUgZmFtaWx5IGhhcyBhIGxhcmdlIGVub3VnaCBncmFudWxhcml0eSBmb3IgdGhpcyB0ZXN0IHRvIGJlIG1lYW5pbmdmdWwsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgcXVldWVfZmFtaWx5X2luZGV4ID0gc3RkOjpkaXN0YW5jZShxdWV1ZV9mYW1pbHlfcHJvcGVydGllcy5iZWdpbigpLCBsYXJnZV9ncmFudWxhcml0eV9mYW1pbHkpOworICAgIFZrRXh0ZW50M0QgZ3JhbnVsYXJpdHkgPSBxdWV1ZV9mYW1pbHlfcHJvcGVydGllc1txdWV1ZV9mYW1pbHlfaW5kZXhdLm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eTsKKyAgICBWa0NvbW1hbmRQb29sT2JqIGNvbW1hbmRfcG9vbChtX2RldmljZSwgcXVldWVfZmFtaWx5X2luZGV4LCAwKTsKKworICAgIC8vIENyZWF0ZSB0d28gaW1hZ2VzIG9mIGRpZmZlcmVudCB0eXBlcyBhbmQgdHJ5IHRvIGNvcHkgYmV0d2VlbiB0aGVtCisgICAgVmtJbWFnZSBzcmNJbWFnZTsKKyAgICBWa0ltYWdlIGRzdEltYWdlOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzNEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSBncmFudWxhcml0eS53aWR0aCAqIDI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IGdyYW51bGFyaXR5LmhlaWdodCAqIDI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gZ3JhbnVsYXJpdHkuZGVwdGggKiAyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworCisgICAgVmtJbWFnZU9iaiBzcmNfaW1hZ2Vfb2JqKG1fZGV2aWNlKTsKKyAgICBzcmNfaW1hZ2Vfb2JqLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICBBU1NFUlRfVFJVRShzcmNfaW1hZ2Vfb2JqLmluaXRpYWxpemVkKCkpOworICAgIHNyY0ltYWdlID0gc3JjX2ltYWdlX29iai5oYW5kbGUoKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworCisgICAgVmtJbWFnZU9iaiBkc3RfaW1hZ2Vfb2JqKG1fZGV2aWNlKTsKKyAgICBkc3RfaW1hZ2Vfb2JqLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICBBU1NFUlRfVFJVRShkc3RfaW1hZ2Vfb2JqLmluaXRpYWxpemVkKCkpOworICAgIGRzdEltYWdlID0gZHN0X2ltYWdlX29iai5oYW5kbGUoKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjb21tYW5kX2J1ZmZlcihtX2RldmljZSwgJmNvbW1hbmRfcG9vbCk7CisgICAgQVNTRVJUX1RSVUUoY29tbWFuZF9idWZmZXIuaW5pdGlhbGl6ZWQoKSk7CisgICAgY29tbWFuZF9idWZmZXIuYmVnaW4oKTsKKworICAgIFZrSW1hZ2VDb3B5IGNvcHlSZWdpb247CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnggPSAwOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnkgPSAwOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnogPSAwOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC54ID0gMDsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC55ID0gMDsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC56ID0gMDsKKyAgICBjb3B5UmVnaW9uLmV4dGVudC53aWR0aCA9IGdyYW51bGFyaXR5LndpZHRoOworICAgIGNvcHlSZWdpb24uZXh0ZW50LmhlaWdodCA9IGdyYW51bGFyaXR5LmhlaWdodDsKKyAgICBjb3B5UmVnaW9uLmV4dGVudC5kZXB0aCA9IGdyYW51bGFyaXR5LmRlcHRoOworCisgICAgLy8gSW50cm9kdWNlIGZhaWx1cmUgYnkgc2V0dGluZyBzcmNPZmZzZXQgdG8gYSBiYWQgZ3JhbnVsYXJpdHkgdmFsdWUKKyAgICBjb3B5UmVnaW9uLnNyY09mZnNldC55ID0gMzsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLXNyY09mZnNldC0wMTc4MyIpOyAgLy8gc3JjT2Zmc2V0IGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5CisgICAgY29tbWFuZF9idWZmZXIuQ29weUltYWdlKHNyY0ltYWdlLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZHN0SW1hZ2UsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmY29weVJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSBzZXR0aW5nIGV4dGVudCB0byBhIGdyYW51bGFyaXR5IHZhbHVlIHRoYXQgaXMgYmFkCisgICAgLy8gZm9yIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gaW1hZ2UuCisgICAgY29weVJlZ2lvbi5zcmNPZmZzZXQueSA9IDA7CisgICAgY29weVJlZ2lvbi5leHRlbnQud2lkdGggPSAzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjT2Zmc2V0LTAxNzgzIik7ICAvLyBzcmMgZXh0ZW50IGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RPZmZzZXQtMDE3ODQiKTsgIC8vIGRzdCBleHRlbnQgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkKKyAgICBjb21tYW5kX2J1ZmZlci5Db3B5SW1hZ2Uoc3JjSW1hZ2UsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBkc3RJbWFnZSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5UmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIE5vdyBkbyBzb21lIGJ1ZmZlci9pbWFnZSBjb3BpZXMKKyAgICBWa0J1ZmZlck9iaiBidWZmZXI7CisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIHJlcXMgPSAwOworICAgIGJ1ZmZlci5pbml0X2FzX3NyY19hbmRfZHN0KCptX2RldmljZSwgOCAqIGdyYW51bGFyaXR5LmhlaWdodCAqIGdyYW51bGFyaXR5LndpZHRoICogZ3JhbnVsYXJpdHkuZGVwdGgsIHJlcXMpOworICAgIFZrQnVmZmVySW1hZ2VDb3B5IHJlZ2lvbiA9IHt9OworICAgIHJlZ2lvbi5idWZmZXJPZmZzZXQgPSAwOworICAgIHJlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSAwOworICAgIHJlZ2lvbi5idWZmZXJJbWFnZUhlaWdodCA9IDA7CisgICAgcmVnaW9uLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgcmVnaW9uLmltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgcmVnaW9uLmltYWdlRXh0ZW50LmhlaWdodCA9IGdyYW51bGFyaXR5LmhlaWdodDsKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQud2lkdGggPSBncmFudWxhcml0eS53aWR0aDsKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQuZGVwdGggPSBncmFudWxhcml0eS5kZXB0aDsKKyAgICByZWdpb24uaW1hZ2VPZmZzZXQueCA9IDA7CisgICAgcmVnaW9uLmltYWdlT2Zmc2V0LnkgPSAwOworICAgIHJlZ2lvbi5pbWFnZU9mZnNldC56ID0gMDsKKworICAgIC8vIEludHJvZHVjZSBmYWlsdXJlIGJ5IHNldHRpbmcgaW1hZ2VFeHRlbnQgdG8gYSBiYWQgZ3JhbnVsYXJpdHkgdmFsdWUKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQud2lkdGggPSAzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1pbWFnZU9mZnNldC0wMTc5NCIpOyAgLy8gaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkKKyAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIoY29tbWFuZF9idWZmZXIuaGFuZGxlKCksIHNyY0ltYWdlLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsIGJ1ZmZlci5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgcmVnaW9uLmltYWdlRXh0ZW50LndpZHRoID0gZ3JhbnVsYXJpdHkud2lkdGg7CisKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSBzZXR0aW5nIGltYWdlT2Zmc2V0IHRvIGEgYmFkIGdyYW51bGFyaXR5IHZhbHVlCisgICAgcmVnaW9uLmltYWdlT2Zmc2V0LnogPSAzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1pbWFnZU9mZnNldC0wMTc5MyIpOyAgLy8gaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UoY29tbWFuZF9idWZmZXIuaGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgZHN0SW1hZ2UsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBjb21tYW5kX2J1ZmZlci5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZUJhcnJpZXJTdWJwYXNzQ29uZmxpY3RzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQWRkIGEgcGlwZWxpbmUgYmFycmllciB3aXRoaW4gYSBzdWJwYXNzIHRoYXQgaGFzIGNvbmZsaWN0aW5nIHN0YXRlIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIEEgcmVuZGVycGFzcyB3aXRoIGEgc2luZ2xlIHN1YnBhc3MgdGhhdCBkZWNsYXJlZCBhIHNlbGYtZGVwZW5kZW5jeQorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaFtdID0geworICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICB9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSByZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCAmcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICB9OworICAgIFZrU3VicGFzc0RlcGVuZGVuY3kgZGVwID0gezAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUfTsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDEsIGF0dGFjaCwgMSwgc3VicGFzc2VzLCAxLCAmZGVwfTsKKyAgICBWa1JlbmRlclBhc3MgcnA7CisgICAgVmtSZW5kZXJQYXNzIHJwX25vc2VsZmRlcDsKKworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIG51bGxwdHIsICZycCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBycGNpLmRlcGVuZGVuY3lDb3VudCA9IDA7CisgICAgcnBjaS5wRGVwZW5kZW5jaWVzID0gbnVsbHB0cjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnBfbm9zZWxmZGVwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdE5vTGF5b3V0KDMyLCAzMiwgMSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIFZrSW1hZ2VWaWV3IGltYWdlVmlldyA9IGltYWdlLnRhcmdldFZpZXcoVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNKTsKKworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZiY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIHJwLCAxLCAmaW1hZ2VWaWV3LCAzMiwgMzIsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZiY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gcnBiaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfbm9zZWxmZGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMyLCAzMn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycGJpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgVmtNZW1vcnlCYXJyaWVyIG1lbV9iYXJyaWVyID0ge307CisgICAgbWVtX2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQkFSUklFUjsKKyAgICBtZW1fYmFycmllci5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2JhcnJpZXIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19IT1NUX1dSSVRFX0JJVDsKKyAgICBtZW1fYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1NIQURFUl9SRUFEX0JJVDsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW1fYmFycmllciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisKKyAgICBycGJpLnJlbmRlclBhc3MgPSBycDsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycGJpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIgPSB7fTsKKyAgICBpbWdfYmFycmllci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSOworICAgIGltZ19iYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQ7CisgICAgaW1nX2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVDsKKyAgICBpbWdfYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXIuaW1hZ2UgPSBpbWFnZS5oYW5kbGUoKTsKKyAgICBpbWdfYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICAvLyBNaXMtbWF0Y2ggc3JjIHN0YWdlIG1hc2sKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBEZXBlbmRlbmNpZXMtMDIyODUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBEZXBlbmRlbmNpZXMtMDIyODUiKTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbWdfYmFycmllcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gTm93IG1pcy1tYXRjaCBkc3Qgc3RhZ2UgbWFzaworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULCBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltZ19iYXJyaWVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBTZXQgc3JjUXVldWVGYW1pbHlJbmRleCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBJR05PUkVECisgICAgaW1nX2JhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IDA7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNRdWV1ZUZhbWlseUluZGV4LTAxMTgyIik7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWdfYmFycmllcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaW1nX2JhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIC8vIE1pcy1tYXRjaCBtZW0gYmFycmllciBzcmMgYWNjZXNzIG1hc2sKKyAgICBtZW1fYmFycmllciA9IHt9OworICAgIG1lbV9iYXJyaWVyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVI7CisgICAgbWVtX2JhcnJpZXIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQ7CisgICAgbWVtX2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBEZXBlbmRlbmNpZXMtMDIyODUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXBEZXBlbmRlbmNpZXMtMDIyODUiKTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklULCAxLCAmbWVtX2JhcnJpZXIsIDAsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBNaXMtbWF0Y2ggbWVtIGJhcnJpZXIgZHN0IGFjY2VzcyBtYXNrLiBBbHNvIHNldCBzcmNBY2Nlc3NNYXNrIHRvIDAgd2hpY2ggc2hvdWxkIG5vdCBjYXVzZSBhbiBlcnJvcgorICAgIG1lbV9iYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSAwOworICAgIG1lbV9iYXJyaWVyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfSE9TVF9XUklURV9CSVQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wRGVwZW5kZW5jaWVzLTAyMjg1Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wRGVwZW5kZW5jaWVzLTAyMjg1Iik7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMSwgJm1lbV9iYXJyaWVyLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gTWlzLW1hdGNoIGltYWdlIGJhcnJpZXIgc3JjIGFjY2VzcyBtYXNrCisgICAgaW1nX2JhcnJpZXIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wRGVwZW5kZW5jaWVzLTAyMjg1Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1wRGVwZW5kZW5jaWVzLTAyMjg1Iik7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWdfYmFycmllcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gTWlzLW1hdGNoIGltYWdlIGJhcnJpZXIgZHN0IGFjY2VzcyBtYXNrCisgICAgaW1nX2JhcnJpZXIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVDsKKyAgICBpbWdfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULCBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1nX2JhcnJpZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIE1pcy1tYXRjaCBkZXBlbmRlbmN5RmxhZ3MKKyAgICBpbWdfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItcERlcGVuZGVuY2llcy0wMjI4NSIpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULCAwIC8qIHdyb25nICovLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIFNlbmQgbm9uLXplcm8gYnVmZmVyTWVtb3J5QmFycmllckNvdW50CisgICAgLy8gQ29uc3RydWN0IGEgdmFsaWQgQnVmZmVyTWVtb3J5QmFycmllciB0byBhdm9pZCBhbnkgcGFyYW1ldGVyIGVycm9ycworICAgIC8vIEZpcnN0IHdlIG5lZWQgYSB2YWxpZCBidWZmZXIgdG8gcmVmZXJlbmNlCisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fcmVxcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUOworICAgIGJ1ZmZlci5pbml0X2FzX3NyY19hbmRfZHN0KCptX2RldmljZSwgMjU2LCBtZW1fcmVxcyk7CisgICAgVmtCdWZmZXJNZW1vcnlCYXJyaWVyIGJtYiA9IHt9OworICAgIGJtYi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUjsKKyAgICBibWIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19IT1NUX1dSSVRFX0JJVDsKKyAgICBibWIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQ7CisgICAgYm1iLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBibWIuZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGJtYi5idWZmZXIgPSBidWZmZXIuaGFuZGxlKCk7CisgICAgYm1iLm9mZnNldCA9IDA7CisgICAgYm1iLnNpemUgPSBWS19XSE9MRV9TSVpFOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItYnVmZmVyTWVtb3J5QmFycmllckNvdW50LTAxMTc4Iik7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMSwgJmJtYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIEFkZCBpbWFnZSBiYXJyaWVyIHcvIGltYWdlIGhhbmRsZSB0aGF0J3Mgbm90IGluIGZyYW1lYnVmZmVyCisgICAgVmtJbWFnZU9iaiBsb25lX2ltYWdlKG1fZGV2aWNlKTsKKyAgICBsb25lX2ltYWdlLkluaXROb0xheW91dCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBpbWdfYmFycmllci5pbWFnZSA9IGxvbmVfaW1hZ2UuaGFuZGxlKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1pbWFnZS0wMjYzNSIpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULCBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1nX2JhcnJpZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIEhhdmUgaW1hZ2UgYmFycmllciB3aXRoIG1pcy1tYXRjaGVkIGxheW91dHMKKyAgICBpbWdfYmFycmllci5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgIGltZ19iYXJyaWVyLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1vbGRMYXlvdXQtMDExODEiKTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklULCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltZ19iYXJyaWVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGltZ19iYXJyaWVyLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItb2xkTGF5b3V0LTAyNjM2Iik7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWdfYmFycmllcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycF9ub3NlbGZkZXAsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRDbWRCdWZmZXJCdWZmZXJEZXN0cm95ZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIGRyYXcgd2l0aCBhIGNvbW1hbmQgYnVmZmVyIHRoYXQgaXMgaW52YWxpZCBkdWUgdG8gYSBidWZmZXIgZGVwZW5kZW5jeSBiZWluZyBkZXN0cm95ZWQuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICBWa0RldmljZU1lbW9yeSBtZW07CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmX2luZm8gPSB7fTsKKyAgICBidWZfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGJ1Zl9pbmZvLnNpemUgPSAyNTY7CisgICAgYnVmX2luZm8uc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmYnVmX2luZm8sIE5VTEwsICZidWZmZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCAmbWVtX3JlcXMpOworCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgIGFsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICBhbGxvY19pbmZvLmFsbG9jYXRpb25TaXplID0gbWVtX3JlcXMuc2l6ZTsKKyAgICBib29sIHBhc3MgPSBmYWxzZTsKKyAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJmFsbG9jX2luZm8sIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUKTsKKyAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBGYWlsZWQgdG8gc2V0IG1lbW9yeSB0eXBlLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZtZW0pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBlcnIgPSB2azo6QmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgbWVtLCAwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRGaWxsQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlciwgMCwgVktfV0hPTEVfU0laRSwgMCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyLVZrQnVmZmVyIik7CisgICAgLy8gRGVzdHJveSBidWZmZXIgZGVwZW5kZW5jeSBwcmlvciB0byBzdWJtaXQgdG8gY2F1c2UgRVJST1IKKyAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+aGFuZGxlKCksIG1lbSwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZENtZEJ1ZmZlckJ1ZmZlclZpZXdEZXN0cm95ZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJEZWxldGUgYnVmZmVyVmlldyBib3VuZCB0byBjbWQgYnVmZmVyLCB0aGVuIGF0dGVtcHQgdG8gc3VibWl0IGNtZCBidWZmZXIuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHt9OworICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gYnZjaSA9IHt9OworICAgIFZrQnVmZmVyVmlldyB2aWV3OworCisgICAgeworICAgICAgICB1aW50MzJfdCBxdWV1ZV9mYW1pbHlfaW5kZXggPSAwOworICAgICAgICBidWZmZXJfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gMTAyNDsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVDsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnF1ZXVlX2ZhbWlseV9pbmRleDsKKyAgICAgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgICAgICBidWZmZXIuaW5pdCgqbV9kZXZpY2UsIGJ1ZmZlcl9jcmVhdGVfaW5mbyk7CisKKyAgICAgICAgYnZjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9WSUVXX0NSRUFURV9JTkZPOworICAgICAgICBidmNpLmJ1ZmZlciA9IGJ1ZmZlci5oYW5kbGUoKTsKKyAgICAgICAgYnZjaS5mb3JtYXQgPSBWS19GT1JNQVRfUjMyX1NGTE9BVDsKKyAgICAgICAgYnZjaS5yYW5nZSA9IFZLX1dIT0xFX1NJWkU7CisKKyAgICAgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlclZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmYnZjaSwgTlVMTCwgJnZpZXcpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgICAgIGRlc2NyaXB0b3Jfc2V0LldyaXRlRGVzY3JpcHRvckJ1ZmZlclZpZXcoMCwgdmlldyk7CisgICAgICAgIGRlc2NyaXB0b3Jfc2V0LlVwZGF0ZURlc2NyaXB0b3JTZXRzKCk7CisKKyAgICAgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0wLCByMzJmKSB1bmlmb3JtIHJlYWRvbmx5IGltYWdlQnVmZmVyIHM7XG4iCisgICAgICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCB2ZWM0IHg7XG4iCisgICAgICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICAgICAiICAgeCA9IGltYWdlTG9hZChzLCAwKTtcbiIKKyAgICAgICAgICAgICJ9XG4iOworICAgICAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICAgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgICAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICAgICAgcGlwZS5waXBlbGluZV9sYXlvdXRfID0gVmtQaXBlbGluZUxheW91dE9iaihtX2RldmljZSwgeyZkZXNjcmlwdG9yX3NldC5sYXlvdXRffSk7CisgICAgICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAsIDAsIDE2LCAxNiwgMCwgMX07CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgICAgICBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwgezE2LCAxNn19OworICAgICAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmc2Npc3Nvcik7CisgICAgICAgIC8vIEJpbmQgcGlwZWxpbmUgdG8gY21kIGJ1ZmZlciAtIFRoaXMgY2F1c2VzIGNyYXNoIG9uIE1hbGkKKyAgICAgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lXyk7CisgICAgICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV9sYXlvdXRfLmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldC5zZXRfLCAwLCBudWxscHRyKTsKKyAgICB9CisgICAgLy8gYnVmZmVyIGlzIHJlbGVhc2VkLgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIkRlc2NyaXB0b3IgaW4gYmluZGluZyAjMCBpbmRleCAwIGlzIHVzaW5nIGJ1ZmZlciIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95QnVmZmVyVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXcsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIkRlc2NyaXB0b3IgaW4gYmluZGluZyAjMCBpbmRleCAwIGlzIHVzaW5nIGJ1ZmZlclZpZXciKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkRyYXcoMSwgMCwgMCwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBWa0J1ZmZlck9iaiBidWZmZXI7CisgICAgYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBidWZmZXJfY3JlYXRlX2luZm8pOworCisgICAgYnZjaS5idWZmZXIgPSBidWZmZXIuaGFuZGxlKCk7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlclZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmYnZjaSwgTlVMTCwgJnZpZXcpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgZGVzY3JpcHRvcl9zZXQuZGVzY3JpcHRvcl93cml0ZXMuY2xlYXIoKTsKKyAgICBkZXNjcmlwdG9yX3NldC5Xcml0ZURlc2NyaXB0b3JCdWZmZXJWaWV3KDAsIHZpZXcpOworICAgIGRlc2NyaXB0b3Jfc2V0LlVwZGF0ZURlc2NyaXB0b3JTZXRzKCk7CisKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUucGlwZWxpbmVfbGF5b3V0Xy5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldC5zZXRfLCAwLCBudWxscHRyKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkRyYXcoMSwgMCwgMCwgMCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIC8vIERlbGV0ZSBCdWZmZXJWaWV3IGluIG9yZGVyIHRvIGludmFsaWRhdGUgY21kIGJ1ZmZlcgorICAgIHZrOjpEZXN0cm95QnVmZmVyVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXcsIE5VTEwpOworICAgIC8vIE5vdyBhdHRlbXB0IHN1Ym1pdCBvZiBjbWQgYnVmZmVyCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyLVZrQnVmZmVyVmlldyIpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZENtZEJ1ZmZlckltYWdlRGVzdHJveWVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byBkcmF3IHdpdGggYSBjb21tYW5kIGJ1ZmZlciB0aGF0IGlzIGludmFsaWQgZHVlIHRvIGFuIGltYWdlIGRlcGVuZGVuY3kgYmVpbmcgZGVzdHJveWVkLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgeworICAgICAgICBjb25zdCBWa0Zvcm1hdCB0ZXhfZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgICAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgICAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IHRleF9mb3JtYXQ7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDMyOworICAgICAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gMzI7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICAgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICAgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgICAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisgICAgICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgICAgICBpbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgICAgICBWa0NsZWFyQ29sb3JWYWx1ZSBjY3Y7CisgICAgICAgIGNjdi5mbG9hdDMyWzBdID0gMS4wZjsKKyAgICAgICAgY2N2LmZsb2F0MzJbMV0gPSAxLjBmOworICAgICAgICBjY3YuZmxvYXQzMlsyXSA9IDEuMGY7CisgICAgICAgIGNjdi5mbG9hdDMyWzNdID0gMS4wZjsKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgaXNyID0ge307CisgICAgICAgIGlzci5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICAgICAgaXNyLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICAgICAgaXNyLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgICAgIGlzci5sYXllckNvdW50ID0gMTsKKyAgICAgICAgaXNyLmxldmVsQ291bnQgPSAxOworICAgICAgICB2azo6Q21kQ2xlYXJDb2xvckltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgJmNjdiwgMSwgJmlzcik7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgfQorICAgIC8vIERlc3Ryb3kgaW1hZ2UgZGVwZW5kZW5jeSBwcmlvciB0byBzdWJtaXQgdG8gY2F1c2UgRVJST1IKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQ29tbWFuZEJ1ZmZlci1Wa0ltYWdlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtEZXZpY2VNZW1vcnkiKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZENtZEJ1ZmZlckZyYW1lYnVmZmVySW1hZ2VEZXN0cm95ZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQXR0ZW1wdCB0byBkcmF3IHdpdGggYSBjb21tYW5kIGJ1ZmZlciB0aGF0IGlzIGludmFsaWQgZHVlIHRvIGEgZnJhbWVidWZmZXIgaW1hZ2UgZGVwZW5kZW5jeSBiZWluZyBkZXN0cm95ZWQuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BlcnRpZXM7CisgICAgVmtSZXN1bHQgZXJyID0gVktfU1VDQ0VTUzsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKGdwdSgpLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sICZmb3JtYXRfcHJvcGVydGllcyk7CisgICAgaWYgKCEoZm9ybWF0X3Byb3BlcnRpZXMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQpKSB7CisgICAgICAgIHByaW50ZigiJXMgSW1hZ2UgZm9ybWF0IGRvZXNuJ3Qgc3VwcG9ydCByZXF1aXJlZCBmZWF0dXJlcy5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBWa0ZyYW1lYnVmZmVyIGZiOworICAgIFZrSW1hZ2VWaWV3IHZpZXc7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIHsKKyAgICAgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY2kgPSB7fTsKKyAgICAgICAgaW1hZ2VfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgaW1hZ2VfY2kucE5leHQgPSBOVUxMOworICAgICAgICBpbWFnZV9jaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgICAgICBpbWFnZV9jaS5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgICAgIGltYWdlX2NpLmV4dGVudC53aWR0aCA9IDMyOworICAgICAgICBpbWFnZV9jaS5leHRlbnQuaGVpZ2h0ID0gMzI7CisgICAgICAgIGltYWdlX2NpLmV4dGVudC5kZXB0aCA9IDE7CisgICAgICAgIGltYWdlX2NpLm1pcExldmVscyA9IDE7CisgICAgICAgIGltYWdlX2NpLmFycmF5TGF5ZXJzID0gMTsKKyAgICAgICAgaW1hZ2VfY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICAgICAgaW1hZ2VfY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgICAgIGltYWdlX2NpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDsKKyAgICAgICAgaW1hZ2VfY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgICAgIGltYWdlX2NpLmZsYWdzID0gMDsKKyAgICAgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgICAgIGltYWdlLmluaXQoJmltYWdlX2NpKTsKKworICAgICAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHsKKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIGltYWdlLmhhbmRsZSgpLAorICAgICAgICAgICAgVktfSU1BR0VfVklFV19UWVBFXzJELAorICAgICAgICAgICAgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLAorICAgICAgICAgICAge1ZLX0NPTVBPTkVOVF9TV0laWkxFX1IsIFZLX0NPTVBPTkVOVF9TV0laWkxFX0csIFZLX0NPTVBPTkVOVF9TV0laWkxFX0IsIFZLX0NPTVBPTkVOVF9TV0laWkxFX0F9LAorICAgICAgICAgICAge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDEsIDAsIDF9LAorICAgICAgICB9OworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJml2Y2ksIG51bGxwdHIsICZ2aWV3KTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIG1fcmVuZGVyUGFzcywgMSwgJnZpZXcsIDMyLCAzMiwgMX07CisgICAgICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmY2ksIG51bGxwdHIsICZmYik7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgLy8gSnVzdCB1c2UgZGVmYXVsdCByZW5kZXJwYXNzIHdpdGggb3VyIGZyYW1lYnVmZmVyCisgICAgICAgIG1fcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZiOworICAgICAgICBtX3JlbmRlclBhc3NCZWdpbkluZm8ucmVuZGVyQXJlYS5leHRlbnQud2lkdGggPSAzMjsKKyAgICAgICAgbV9yZW5kZXJQYXNzQmVnaW5JbmZvLnJlbmRlckFyZWEuZXh0ZW50LmhlaWdodCA9IDMyOworICAgICAgICAvLyBDcmVhdGUgTnVsbCBjbWQgYnVmZmVyIGZvciBzdWJtaXQKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICB9CisgICAgLy8gRGVzdHJveSBpbWFnZSBhdHRhY2hlZCB0byBmcmFtZWJ1ZmZlciB0byBpbnZhbGlkYXRlIGNtZCBidWZmZXIKKyAgICAvLyBOb3cgYXR0ZW1wdCB0byBzdWJtaXQgY21kIGJ1ZmZlciBhbmQgdmVyaWZ5IGVycm9yCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtJbWFnZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyLVZrRGV2aWNlTWVtb3J5Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5RdWV1ZUNvbW1hbmRCdWZmZXIoZmFsc2UpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXcsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEltYWdlTWVtb3J5Tm90Qm91bmQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIGRyYXcgd2l0aCBhbiBpbWFnZSB3aGljaCBoYXMgbm90IGhhZCBtZW1vcnkgYm91bmQgdG8gaXQuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgY29uc3QgVmtGb3JtYXQgdGV4X2Zvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gdGV4X2Zvcm1hdDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSAzMjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gMzI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlSW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCAmaW1hZ2VfY3JlYXRlX2luZm8sIE5VTEwsICZpbWFnZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAvLyBIYXZlIHRvIGJpbmQgbWVtb3J5IHRvIGltYWdlIGJlZm9yZSByZWNvcmRpbmcgY21kIGluIGNtZCBidWZmZXIgdXNpbmcgaXQKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1fcmVxczsKKyAgICBWa0RldmljZU1lbW9yeSBpbWFnZV9tZW07CisgICAgYm9vbCBwYXNzOworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgIG1lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IDA7CisgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsICZtZW1fcmVxcyk7CisgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gbWVtX3JlcXMuc2l6ZTsKKyAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJm1lbV9hbGxvYywgMCk7CisgICAgQVNTRVJUX1RSVUUocGFzcyk7CisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1lbV9hbGxvYywgTlVMTCwgJmltYWdlX21lbSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEludHJvZHVjZSBlcnJvciwgZG8gbm90IGNhbGwgdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCBpbWFnZV9tZW0sIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB1c2VkIHdpdGggbm8gbWVtb3J5IGJvdW5kLiBNZW1vcnkgc2hvdWxkIGJlIGJvdW5kIGJ5IGNhbGxpbmcgdmtCaW5kSW1hZ2VNZW1vcnkoKS4iKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBWa0NsZWFyQ29sb3JWYWx1ZSBjY3Y7CisgICAgY2N2LmZsb2F0MzJbMF0gPSAxLjBmOworICAgIGNjdi5mbG9hdDMyWzFdID0gMS4wZjsKKyAgICBjY3YuZmxvYXQzMlsyXSA9IDEuMGY7CisgICAgY2N2LmZsb2F0MzJbM10gPSAxLjBmOworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIGlzciA9IHt9OworICAgIGlzci5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBpc3IuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGlzci5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGlzci5sYXllckNvdW50ID0gMTsKKyAgICBpc3IubGV2ZWxDb3VudCA9IDE7CisgICAgdms6OkNtZENsZWFyQ29sb3JJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsICZjY3YsIDEsICZpc3IpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsIE5VTEwpOworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2VfbWVtLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBCdWZmZXJNZW1vcnlOb3RCb3VuZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gY29weSBmcm9tIGEgYnVmZmVyIHdoaWNoIGhhcyBub3QgaGFkIG1lbW9yeSBib3VuZCB0byBpdC4iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsCisgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1Zl9pbmZvID0ge307CisgICAgYnVmX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgYnVmX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKyAgICBidWZfaW5mby5zaXplID0gMTAyNDsKKyAgICBidWZfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZidWZfaW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsICZtZW1fcmVxcyk7CisKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBhbGxvY19pbmZvID0ge307CisgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIGFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgPSAxMDI0OworICAgIGJvb2wgcGFzcyA9IGZhbHNlOworICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmYWxsb2NfaW5mbywgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQpOworICAgIGlmICghcGFzcykgeworICAgICAgICBwcmludGYoIiVzIEZhaWxlZCB0byBzZXQgbWVtb3J5IHR5cGUuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmYWxsb2NfaW5mbywgTlVMTCwgJm1lbSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEludHJvZHVjZSBmYWlsdXJlIGJ5IG5vdCBjYWxsaW5nIHZrQmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgbWVtLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdXNlZCB3aXRoIG5vIG1lbW9yeSBib3VuZC4gTWVtb3J5IHNob3VsZCBiZSBib3VuZCBieSBjYWxsaW5nIHZrQmluZEJ1ZmZlck1lbW9yeSgpLiIpOworICAgIFZrQnVmZmVySW1hZ2VDb3B5IHJlZ2lvbiA9IHt9OworICAgIHJlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSAxNjsKKyAgICByZWdpb24uYnVmZmVySW1hZ2VIZWlnaHQgPSAxNjsKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC5oZWlnaHQgPSA0OworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC53aWR0aCA9IDQ7CisgICAgcmVnaW9uLmltYWdlRXh0ZW50LmRlcHRoID0gMTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlciwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwgJnJlZ2lvbik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsIE5VTEwpOworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5oYW5kbGUoKSwgbWVtLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNdWx0aXBsYW5lSW1hZ2VMYXlvdXRCYWRBc3BlY3RGbGFncykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlF1ZXJ5IGxheW91dCBvZiBhIG11bHRpcGxhbmUgaW1hZ2UgdXNpbmcgaWxsZWdhbCBhc3BlY3QgZmxhZyBtYXNrcyIpOworCisgICAgLy8gRW5hYmxlIEtIUiBtdWx0aXBsYW5lIHJlcSdkIGV4dGVuc2lvbnMKKyAgICBib29sIG1wX2V4dGVuc2lvbnMgPSBJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfU1BFQ19WRVJTSU9OKTsKKyAgICBpZiAobXBfZXh0ZW5zaW9ucykgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgIGlmIChtcF9leHRlbnNpb25zKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIHRlc3QgcmVxdWlyZXMgS0hSIG11bHRpcGxhbmUgZXh0ZW5zaW9ucywgbm90IGF2YWlsYWJsZS4gIFNraXBwaW5nLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGNpID0ge307CisgICAgY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBjaS5wTmV4dCA9IE5VTEw7CisgICAgY2kuZmxhZ3MgPSAwOworICAgIGNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgY2kuZm9ybWF0ID0gVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMF9VTk9STV9LSFI7CisgICAgY2kuZXh0ZW50ID0gezEyOCwgMTI4LCAxfTsKKyAgICBjaS5taXBMZXZlbHMgPSAxOworICAgIGNpLmFycmF5TGF5ZXJzID0gMTsKKyAgICBjaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGNpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVI7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgIGNpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBjaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKworICAgIC8vIFZlcmlmeSBmb3JtYXRzCisgICAgYm9vbCBzdXBwb3J0ZWQgPSBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGluc3RhbmNlKCksIGdwdSgpLCBjaSwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCk7CisgICAgY2kuZm9ybWF0ID0gVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk1fS0hSOworICAgIHN1cHBvcnRlZCA9IHN1cHBvcnRlZCAmJiBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGluc3RhbmNlKCksIGdwdSgpLCBjaSwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCk7CisgICAgaWYgKCFzdXBwb3J0ZWQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBNdWx0aXBsYW5lIGltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiAgU2tpcHBpbmcgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOyAgLy8gQXNzdW1lIHRoZXJlJ3MgbG93IFJPSSBvbiBzZWFyY2hpbmcgZm9yIGRpZmZlcmVudCBtcCBmb3JtYXRzCisgICAgfQorCisgICAgVmtJbWFnZSBpbWFnZV8ycGxhbmUsIGltYWdlXzNwbGFuZTsKKyAgICBjaS5mb3JtYXQgPSBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIwX1VOT1JNX0tIUjsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlSW1hZ2UoZGV2aWNlKCksICZjaSwgTlVMTCwgJmltYWdlXzJwbGFuZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNX0tIUjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2UoZGV2aWNlKCksICZjaSwgTlVMTCwgJmltYWdlXzNwbGFuZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIFF1ZXJ5IGxheW91dCBvZiAzcmQgcGxhbmUsIGZvciBhIDItcGxhbmUgaW1hZ2UKKyAgICBWa0ltYWdlU3VicmVzb3VyY2Ugc3VicmVzID0ge307CisgICAgc3VicmVzLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSOworICAgIHN1YnJlcy5taXBMZXZlbCA9IDA7CisgICAgc3VicmVzLmFycmF5TGF5ZXIgPSAwOworICAgIFZrU3VicmVzb3VyY2VMYXlvdXQgbGF5b3V0ID0ge307CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1mb3JtYXQtMDE1ODEiKTsKKyAgICB2azo6R2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChkZXZpY2UoKSwgaW1hZ2VfMnBsYW5lLCAmc3VicmVzLCAmbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFF1ZXJ5IGxheW91dCB1c2luZyBjb2xvciBhc3BlY3QsIGZvciBhIDMtcGxhbmUgaW1hZ2UKKyAgICBzdWJyZXMuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQtZm9ybWF0LTAxNTgyIik7CisgICAgdms6OkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoZGV2aWNlKCksIGltYWdlXzNwbGFuZSwgJnN1YnJlcywgJmxheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDbGVhbiB1cAorICAgIHZrOjpEZXN0cm95SW1hZ2UoZGV2aWNlKCksIGltYWdlXzJwbGFuZSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lJbWFnZShkZXZpY2UoKSwgaW1hZ2VfM3BsYW5lLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkQnVmZmVyVmlld09iamVjdCkgeworICAgIC8vIENyZWF0ZSBhIHNpbmdsZSBURVhFTF9CVUZGRVIgZGVzY3JpcHRvciBhbmQgc2VuZCBpdCBhbiBpbnZhbGlkIGJ1ZmZlclZpZXcKKyAgICAvLyBGaXJzdCwgY2F1c2UgdGhlIGJ1ZmZlclZpZXcgdG8gYmUgaW52YWxpZCBkdWUgdG8gdW5kZXJseWluZyBidWZmZXIgYmVpbmcgZGVzdHJveWVkCisgICAgLy8gVGhlbiBkZXN0cm95IHZpZXcgaXRzZWxmIGFuZCB2ZXJpZnkgdGhhdCBzYW1lIGVycm9yIGlzIGhpdAorICAgIFZrUmVzdWx0IGVycjsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjMiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBWa0J1ZmZlclZpZXcgdmlldzsKKyAgICB7CisgICAgICAgIC8vIENyZWF0ZSBhIHZhbGlkIGJ1ZmZlclZpZXcgdG8gc3RhcnQgd2l0aAorICAgICAgICB1aW50MzJfdCBxdWV1ZV9mYW1pbHlfaW5kZXggPSAwOworICAgICAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNpemUgPSAxMDI0OworICAgICAgICBidWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUOworICAgICAgICBidWZmZXJfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSAmcXVldWVfZmFtaWx5X2luZGV4OworICAgICAgICBWa0J1ZmZlck9iaiBidWZmZXI7CisgICAgICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZmVyX2NyZWF0ZV9pbmZvKTsKKworICAgICAgICBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIGJ2Y2kgPSB7fTsKKyAgICAgICAgYnZjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9WSUVXX0NSRUFURV9JTkZPOworICAgICAgICBidmNpLmJ1ZmZlciA9IGJ1ZmZlci5oYW5kbGUoKTsKKyAgICAgICAgYnZjaS5mb3JtYXQgPSBWS19GT1JNQVRfUjMyX1NGTE9BVDsKKyAgICAgICAgYnZjaS5yYW5nZSA9IFZLX1dIT0xFX1NJWkU7CisKKyAgICAgICAgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlclZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmYnZjaSwgTlVMTCwgJnZpZXcpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIH0KKyAgICAvLyBGaXJzdCBEZXN0cm95IGJ1ZmZlciB1bmRlcmx5aW5nIHZpZXcgd2hpY2ggc2hvdWxkIGhpdCBlcnJvciBpbiBDVgorCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZTsKKyAgICBtZW1zZXQoJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIHNpemVvZihkZXNjcmlwdG9yX3dyaXRlKSk7CisgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucFRleGVsQnVmZmVyVmlldyA9ICZ2aWV3OworCisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gTm93IGRlc3Ryb3kgdmlldyBpdHNlbGYgYW5kIHZlcmlmeSBzYW1lIGVycm9yLCB3aGljaCBpcyBoaXQgaW4gUFYgdGhpcyB0aW1lCisgICAgdms6OkRlc3Ryb3lCdWZmZXJWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldywgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyMyIpOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVCdWZmZXJWaWV3Tm9NZW1vcnlCb3VuZFRvQnVmZmVyKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byBjcmVhdGUgYSBidWZmZXIgdmlldyB3aXRoIGEgYnVmZmVyIHRoYXQgaGFzIG5vIG1lbW9yeSBib3VuZCB0byBpdC4iKTsKKworICAgIFZrUmVzdWx0IGVycjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdXNlZCB3aXRoIG5vIG1lbW9yeSBib3VuZC4gTWVtb3J5IHNob3VsZCBiZSBib3VuZCBieSBjYWxsaW5nIHZrQmluZEJ1ZmZlck1lbW9yeSgpLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIENyZWF0ZSBhIGJ1ZmZlciB3aXRoIG5vIGJvdW5kIG1lbW9yeSBhbmQgdGhlbiBhdHRlbXB0IHRvIGNyZWF0ZQorICAgIC8vIGEgYnVmZmVyIHZpZXcuCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZfY2kgPSB7fTsKKyAgICBidWZmX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1ZmZfY2kudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUOworICAgIGJ1ZmZfY2kuc2l6ZSA9IDI1NjsKKyAgICBidWZmX2NpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZidWZmX2NpLCBOVUxMLCAmYnVmZmVyKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyBidWZmX3ZpZXdfY2kgPSB7fTsKKyAgICBidWZmX3ZpZXdfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTzsKKyAgICBidWZmX3ZpZXdfY2kuYnVmZmVyID0gYnVmZmVyOworICAgIGJ1ZmZfdmlld19jaS5mb3JtYXQgPSBWS19GT1JNQVRfUjhfVU5PUk07CisgICAgYnVmZl92aWV3X2NpLnJhbmdlID0gVktfV0hPTEVfU0laRTsKKyAgICBWa0J1ZmZlclZpZXcgYnVmZl92aWV3OworICAgIGVyciA9IHZrOjpDcmVhdGVCdWZmZXJWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJ1ZmZfdmlld19jaSwgTlVMTCwgJmJ1ZmZfdmlldyk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisgICAgLy8gSWYgbGFzdCBlcnJvciBpcyBzdWNjZXNzLCBpdCBzdGlsbCBjcmVhdGVkIHRoZSB2aWV3LCBzbyBkZWxldGUgaXQuCisgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZfdmlldywgTlVMTCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRCdWZmZXJWaWV3Q3JlYXRlSW5mb0VudHJpZXMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIGNyZWF0ZSBhIGJ1ZmZlciB2aWV3IHdpdGggaW52YWxpZCBjcmVhdGUgaW5mby4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICZkZXZfbGltaXRzID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0czsKKyAgICBjb25zdCBWa0RldmljZVNpemUgbWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQgPSBkZXZfbGltaXRzLm1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIGlmIChtaW5UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudCA9PSAxKSB7CisgICAgICAgIHByaW50ZigiJXMgVGVzdCByZXF1aXJlcyBtaW5UZXhlbE9mZnNldEFsaWdubWVudCB0byBub3QgYmUgZXF1YWwgdG8gMS4gXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBWa0Zvcm1hdCBmb3JtYXRfd2l0aF91bmlmb3JtX3RleGVsX3N1cHBvcnQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgY29uc3QgY2hhciAqZm9ybWF0X3dpdGhfdW5pZm9ybV90ZXhlbF9zdXBwb3J0X3N0cmluZyA9ICJWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0iOworICAgIGNvbnN0IFZrRm9ybWF0IGZvcm1hdF93aXRob3V0X3RleGVsX3N1cHBvcnQgPSBWS19GT1JNQVRfUjhHOEI4X1VOT1JNOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdF93aXRob3V0X3RleGVsX3N1cHBvcnRfc3RyaW5nID0gIlZLX0ZPUk1BVF9SOEc4QjhfVU5PUk0iOworICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcGVydGllczsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKGdwdSgpLCBmb3JtYXRfd2l0aF91bmlmb3JtX3RleGVsX3N1cHBvcnQsICZmb3JtYXRfcHJvcGVydGllcyk7CisgICAgaWYgKCEoZm9ybWF0X3Byb3BlcnRpZXMuYnVmZmVyRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQpKSB7CisgICAgICAgIHByaW50ZigiJXMgVGVzdCByZXF1aXJlcyAlcyB0byBzdXBwb3J0IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVRcbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgZm9ybWF0X3dpdGhfdW5pZm9ybV90ZXhlbF9zdXBwb3J0X3N0cmluZyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhncHUoKSwgZm9ybWF0X3dpdGhvdXRfdGV4ZWxfc3VwcG9ydCwgJmZvcm1hdF9wcm9wZXJ0aWVzKTsKKyAgICBpZiAoKGZvcm1hdF9wcm9wZXJ0aWVzLmJ1ZmZlckZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUKSB8fAorICAgICAgICAoZm9ybWF0X3Byb3BlcnRpZXMuYnVmZmVyRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQpKSB7CisgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICIlcyBUZXN0IHJlcXVpcmVzICVzIHRvIG5vdCBzdXBwb3J0IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQgbm9yICIKKyAgICAgICAgICAgICJWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUXG4iLAorICAgICAgICAgICAga1NraXBQcmVmaXgsIGZvcm1hdF93aXRob3V0X3RleGVsX3N1cHBvcnRfc3RyaW5nKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIHRlc3QgYnVmZmVyLS1idWZmZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUIG9yCisgICAgLy8gVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCwgc28gdXNlIGEgZGlmZmVyZW50IHVzYWdlIHZhbHVlIGluc3RlYWQgdG8gY2F1c2UgYW4gZXJyb3IKKyAgICBjb25zdCBWa0RldmljZVNpemUgcmVzb3VyY2Vfc2l6ZSA9IDEwMjQ7CisgICAgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvIGJhZF9idWZmZXJfaW5mbyA9IFZrQnVmZmVyT2JqOjpjcmVhdGVfaW5mbyhyZXNvdXJjZV9zaXplLCBWS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVCk7CisgICAgVmtCdWZmZXJPYmogYmFkX2J1ZmZlcjsKKyAgICBiYWRfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBiYWRfYnVmZmVyX2luZm8sIChWa01lbW9yeVByb3BlcnR5RmxhZ3MpVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQpOworCisgICAgLy8gQ3JlYXRlIGEgdGVzdCBidWZmZXIgdmlldworICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gYnVmZl92aWV3X2NpID0ge307CisgICAgYnVmZl92aWV3X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgYnVmZl92aWV3X2NpLmJ1ZmZlciA9IGJhZF9idWZmZXIuaGFuZGxlKCk7CisgICAgYnVmZl92aWV3X2NpLmZvcm1hdCA9IGZvcm1hdF93aXRoX3VuaWZvcm1fdGV4ZWxfc3VwcG9ydDsKKyAgICBidWZmX3ZpZXdfY2kucmFuZ2UgPSBWS19XSE9MRV9TSVpFOworICAgIENyZWF0ZUJ1ZmZlclZpZXdUZXN0KCp0aGlzLCAmYnVmZl92aWV3X2NpLCB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItMDA5MzIifSk7CisKKyAgICAvLyBDcmVhdGUgYSBiZXR0ZXIgdGVzdCBidWZmZXIKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2luZm8gPSBWa0J1ZmZlck9iajo6Y3JlYXRlX2luZm8ocmVzb3VyY2Vfc2l6ZSwgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCk7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZmVyX2luZm8sIChWa01lbW9yeVByb3BlcnR5RmxhZ3MpVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQpOworCisgICAgLy8gT2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIHNvIHNldCBpdCBlcXVhbCB0byB0aGUgYnVmZmVyIHNpemUgdG8gY2F1c2UgYW4gZXJyb3IKKyAgICBidWZmX3ZpZXdfY2kuYnVmZmVyID0gYnVmZmVyLmhhbmRsZSgpOworICAgIGJ1ZmZfdmlld19jaS5vZmZzZXQgPSBidWZmZXIuY3JlYXRlX2luZm8oKS5zaXplOworICAgIENyZWF0ZUJ1ZmZlclZpZXdUZXN0KCp0aGlzLCAmYnVmZl92aWV3X2NpLCB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1vZmZzZXQtMDA5MjUifSk7CisKKyAgICAvLyBPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50IHNvIGFkZCAxIHRvIGVuc3VyZSBpdCBpcyBub3QKKyAgICBidWZmX3ZpZXdfY2kub2Zmc2V0ID0gbWluVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnQgKyAxOworICAgIENyZWF0ZUJ1ZmZlclZpZXdUZXN0KCp0aGlzLCAmYnVmZl92aWV3X2NpLCB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1vZmZzZXQtMDI3NDkifSk7CisKKyAgICAvLyBTZXQgb2Zmc2V0IHRvIGFjY2VwdGFibGUgdmFsdWUgZm9yIHJhbmdlIHRlc3RzCisgICAgYnVmZl92aWV3X2NpLm9mZnNldCA9IG1pblRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50OworICAgIC8vIFNldHRpbmcgcmFuZ2UgZXF1YWwgdG8gMCB3aWxsIGNhdXNlIGFuIGVycm9yIHRvIG9jY3VyCisgICAgYnVmZl92aWV3X2NpLnJhbmdlID0gMDsKKyAgICBDcmVhdGVCdWZmZXJWaWV3VGVzdCgqdGhpcywgJmJ1ZmZfdmlld19jaSwgeyJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tcmFuZ2UtMDA5MjgifSk7CisKKyAgICB1aW50MzJfdCBmb3JtYXRfc2l6ZSA9IEZvcm1hdEVsZW1lbnRTaXplKGJ1ZmZfdmlld19jaS5mb3JtYXQpOworICAgIC8vIFJhbmdlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZWxlbWVudCBzaXplIG9mIGZvcm1hdCwgc28gYWRkIG9uZSB0byBlbnN1cmUgaXQgaXMgbm90CisgICAgYnVmZl92aWV3X2NpLnJhbmdlID0gZm9ybWF0X3NpemUgKyAxOworICAgIENyZWF0ZUJ1ZmZlclZpZXdUZXN0KCp0aGlzLCAmYnVmZl92aWV3X2NpLCB7IlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1yYW5nZS0wMDkyOSJ9KTsKKworICAgIC8vIFR3aWNlIHRoZSBlbGVtZW50IHNpemUgb2YgZm9ybWF0IG11bHRpcGxpZWQgYnkgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGV4ZWxCdWZmZXJFbGVtZW50cyBndWFyYW50ZWVzIHJhbmdlIGRpdmlkZWQgYnkgdGhlCisgICAgLy8gZWxlbWVudCBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXhUZXhlbEJ1ZmZlckVsZW1lbnRzLCBjYXVzaW5nIGZhaWx1cmUKKyAgICBidWZmX3ZpZXdfY2kucmFuZ2UgPSAyICogc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPihmb3JtYXRfc2l6ZSkgKiBzdGF0aWNfY2FzdDxWa0RldmljZVNpemU+KGRldl9saW1pdHMubWF4VGV4ZWxCdWZmZXJFbGVtZW50cyk7CisgICAgQ3JlYXRlQnVmZmVyVmlld1Rlc3QoKnRoaXMsICZidWZmX3ZpZXdfY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgeyJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tcmFuZ2UtMDA5MzAiLCAiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLW9mZnNldC0wMDkzMSJ9KTsKKworICAgIC8vIFNldCByYWdlIHRvIGFjY2VwdGFibGUgdmFsdWUgZm9yIGJ1ZmZlciB0ZXN0cworICAgIGJ1ZmZfdmlld19jaS5mb3JtYXQgPSBmb3JtYXRfd2l0aG91dF90ZXhlbF9zdXBwb3J0OworICAgIGJ1ZmZfdmlld19jaS5yYW5nZSA9IFZLX1dIT0xFX1NJWkU7CisKKyAgICAvLyBgYnVmZmVyYCB3YXMgY3JlYXRlZCB1c2luZyBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUIHNvIHdlIGNhbiB1c2UgdGhhdCBmb3IgdGhlIGZpcnN0IGJ1ZmZlciB0ZXN0CisgICAgQ3JlYXRlQnVmZmVyVmlld1Rlc3QoKnRoaXMsICZidWZmX3ZpZXdfY2ksIHsiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMDkzMyJ9KTsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBidWZmZXIgdXNpbmcgVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVAorICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyBzdG9yYWdlX2J1ZmZlcl9pbmZvID0KKyAgICAgICAgVmtCdWZmZXJPYmo6OmNyZWF0ZV9pbmZvKHJlc291cmNlX3NpemUsIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQpOworICAgIFZrQnVmZmVyT2JqIHN0b3JhZ2VfYnVmZmVyOworICAgIHN0b3JhZ2VfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBzdG9yYWdlX2J1ZmZlcl9pbmZvLCAoVmtNZW1vcnlQcm9wZXJ0eUZsYWdzKVZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUKTsKKworICAgIGJ1ZmZfdmlld19jaS5idWZmZXIgPSBzdG9yYWdlX2J1ZmZlci5oYW5kbGUoKTsKKyAgICBDcmVhdGVCdWZmZXJWaWV3VGVzdCgqdGhpcywgJmJ1ZmZfdmlld19jaSwgeyJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAwOTM0In0pOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRUZXhlbEJ1ZmZlckFsaWdubWVudCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgVktfRVhUX3RleGVsX2J1ZmZlcl9hbGlnbm1lbnQuIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBzdGQ6OmFycmF5PGNvbnN0IGNoYXIgKiwgMT4gcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMgPSB7e1ZLX0VYVF9URVhFTF9CVUZGRVJfQUxJR05NRU5UX0VYVEVOU0lPTl9OQU1FfX07CisgICAgZm9yIChhdXRvIGRldmljZV9leHRlbnNpb24gOiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucykgeworICAgICAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBkZXZpY2VfZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRGV2aWNlSXNNb2NrSUNEKCkgfHwgRGV2aWNlU2ltdWxhdGlvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgTW9ja0lDRCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgLy8gQ3JlYXRlIGEgZGV2aWNlIHRoYXQgZW5hYmxlcyB0ZXhlbF9idWZmZXJfYWxpZ25tZW50CisgICAgYXV0byB0ZXhlbF9idWZmZXJfYWxpZ25tZW50X2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudEZlYXR1cmVzRVhUPigpOworICAgIGF1dG8gZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KCZ0ZXhlbF9idWZmZXJfYWxpZ25tZW50X2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKyAgICB0ZXhlbF9idWZmZXJfYWxpZ25tZW50X2ZlYXR1cmVzLnRleGVsQnVmZmVyQWxpZ25tZW50ID0gVktfVFJVRTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VUZXhlbEJ1ZmZlckFsaWdubWVudFByb3BlcnRpZXNFWFQgYWxpZ25fcHJvcHMgPSB7fTsKKyAgICBhbGlnbl9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9URVhFTF9CVUZGRVJfQUxJR05NRU5UX1BST1BFUlRJRVNfRVhUOworICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMiBwZF9wcm9wczIgPSB7fTsKKyAgICBwZF9wcm9wczIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yOworICAgIHBkX3Byb3BzMi5wTmV4dCA9ICZhbGlnbl9wcm9wczsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMihncHUoKSwgJnBkX3Byb3BzMik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCBWa0Zvcm1hdCBmb3JtYXRfd2l0aF91bmlmb3JtX3RleGVsX3N1cHBvcnQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisKKyAgICBjb25zdCBWa0RldmljZVNpemUgcmVzb3VyY2Vfc2l6ZSA9IDEwMjQ7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9pbmZvID0gVmtCdWZmZXJPYmo6OmNyZWF0ZV9pbmZvKAorICAgICAgICByZXNvdXJjZV9zaXplLCBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUIHwgVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCk7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZmVyX2luZm8sIChWa01lbW9yeVByb3BlcnR5RmxhZ3MpVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQpOworCisgICAgLy8gQ3JlYXRlIGEgdGVzdCBidWZmZXIgdmlldworICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gYnVmZl92aWV3X2NpID0ge307CisgICAgYnVmZl92aWV3X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgYnVmZl92aWV3X2NpLmJ1ZmZlciA9IGJ1ZmZlci5oYW5kbGUoKTsKKyAgICBidWZmX3ZpZXdfY2kuZm9ybWF0ID0gZm9ybWF0X3dpdGhfdW5pZm9ybV90ZXhlbF9zdXBwb3J0OworICAgIGJ1ZmZfdmlld19jaS5yYW5nZSA9IFZLX1dIT0xFX1NJWkU7CisKKyAgICBidWZmX3ZpZXdfY2kub2Zmc2V0ID0gMTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXhwZWN0ZWRFcnJvcnM7CisgICAgaWYgKGJ1ZmZfdmlld19jaS5vZmZzZXQgPCBhbGlnbl9wcm9wcy5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcykgeworICAgICAgICBleHBlY3RlZEVycm9ycy5wdXNoX2JhY2soIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItMDI3NTAiKTsKKyAgICB9CisgICAgaWYgKGJ1ZmZfdmlld19jaS5vZmZzZXQgPCBhbGlnbl9wcm9wcy51bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcykgeworICAgICAgICBleHBlY3RlZEVycm9ycy5wdXNoX2JhY2soIlZVSUQtVmtCdWZmZXJWaWV3Q3JlYXRlSW5mby1idWZmZXItMDI3NTEiKTsKKyAgICB9CisgICAgQ3JlYXRlQnVmZmVyVmlld1Rlc3QoKnRoaXMsICZidWZmX3ZpZXdfY2ksIGV4cGVjdGVkRXJyb3JzKTsKKyAgICBleHBlY3RlZEVycm9ycy5jbGVhcigpOworCisgICAgYnVmZl92aWV3X2NpLm9mZnNldCA9IDQ7CisgICAgaWYgKGJ1ZmZfdmlld19jaS5vZmZzZXQgPCBhbGlnbl9wcm9wcy5zdG9yYWdlVGV4ZWxCdWZmZXJPZmZzZXRBbGlnbm1lbnRCeXRlcyAmJgorICAgICAgICAhYWxpZ25fcHJvcHMuc3RvcmFnZVRleGVsQnVmZmVyT2Zmc2V0U2luZ2xlVGV4ZWxBbGlnbm1lbnQpIHsKKyAgICAgICAgZXhwZWN0ZWRFcnJvcnMucHVzaF9iYWNrKCJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAyNzUwIik7CisgICAgfQorICAgIGlmIChidWZmX3ZpZXdfY2kub2Zmc2V0IDwgYWxpZ25fcHJvcHMudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgJiYKKyAgICAgICAgIWFsaWduX3Byb3BzLnVuaWZvcm1UZXhlbEJ1ZmZlck9mZnNldFNpbmdsZVRleGVsQWxpZ25tZW50KSB7CisgICAgICAgIGV4cGVjdGVkRXJyb3JzLnB1c2hfYmFjaygiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMjc1MSIpOworICAgIH0KKyAgICBDcmVhdGVCdWZmZXJWaWV3VGVzdCgqdGhpcywgJmJ1ZmZfdmlld19jaSwgZXhwZWN0ZWRFcnJvcnMpOworICAgIGV4cGVjdGVkRXJyb3JzLmNsZWFyKCk7CisKKyAgICAvLyBUZXN0IGEgMy1jb21wb25lbnQgZm9ybWF0CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wZXJ0aWVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoZ3B1KCksIFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FULCAmZm9ybWF0X3Byb3BlcnRpZXMpOworICAgIGlmIChmb3JtYXRfcHJvcGVydGllcy5idWZmZXJGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCkgeworICAgICAgICBidWZmZXJfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQ7CisgICAgICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjI7CisgICAgICAgIGJ1ZmZlcjIuaW5pdCgqbV9kZXZpY2UsIGJ1ZmZlcl9pbmZvLCAoVmtNZW1vcnlQcm9wZXJ0eUZsYWdzKVZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUKTsKKworICAgICAgICAvLyBDcmVhdGUgYSB0ZXN0IGJ1ZmZlciB2aWV3CisgICAgICAgIGJ1ZmZfdmlld19jaS5idWZmZXIgPSBidWZmZXIyLmhhbmRsZSgpOworCisgICAgICAgIGJ1ZmZfdmlld19jaS5mb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVDsKKyAgICAgICAgYnVmZl92aWV3X2NpLm9mZnNldCA9IDE7CisgICAgICAgIGlmIChidWZmX3ZpZXdfY2kub2Zmc2V0IDwgYWxpZ25fcHJvcHMudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkRXJyb3JzLnB1c2hfYmFjaygiVlVJRC1Wa0J1ZmZlclZpZXdDcmVhdGVJbmZvLWJ1ZmZlci0wMjc1MSIpOworICAgICAgICB9CisgICAgICAgIENyZWF0ZUJ1ZmZlclZpZXdUZXN0KCp0aGlzLCAmYnVmZl92aWV3X2NpLCBleHBlY3RlZEVycm9ycyk7CisgICAgICAgIGV4cGVjdGVkRXJyb3JzLmNsZWFyKCk7CisKKyAgICAgICAgYnVmZl92aWV3X2NpLm9mZnNldCA9IDQ7CisgICAgICAgIGlmIChidWZmX3ZpZXdfY2kub2Zmc2V0IDwgYWxpZ25fcHJvcHMudW5pZm9ybVRleGVsQnVmZmVyT2Zmc2V0QWxpZ25tZW50Qnl0ZXMgJiYKKyAgICAgICAgICAgICFhbGlnbl9wcm9wcy51bmlmb3JtVGV4ZWxCdWZmZXJPZmZzZXRTaW5nbGVUZXhlbEFsaWdubWVudCkgeworICAgICAgICAgICAgZXhwZWN0ZWRFcnJvcnMucHVzaF9iYWNrKCJWVUlELVZrQnVmZmVyVmlld0NyZWF0ZUluZm8tYnVmZmVyLTAyNzUxIik7CisgICAgICAgIH0KKyAgICAgICAgQ3JlYXRlQnVmZmVyVmlld1Rlc3QoKnRoaXMsICZidWZmX3ZpZXdfY2ksIGV4cGVjdGVkRXJyb3JzKTsKKyAgICAgICAgZXhwZWN0ZWRFcnJvcnMuY2xlYXIoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRmlsbEJ1ZmZlcldpdGhpblJlbmRlclBhc3MpIHsKKyAgICAvLyBDYWxsIENtZEZpbGxCdWZmZXIgd2l0aGluIGFuIGFjdGl2ZSByZW5kZXJwYXNzCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEZpbGxCdWZmZXItcmVuZGVycGFzcyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUOworICAgIFZrQnVmZmVyT2JqIGRzdEJ1ZmZlcjsKKyAgICBkc3RCdWZmZXIuaW5pdF9hc19kc3QoKm1fZGV2aWNlLCAoVmtEZXZpY2VTaXplKTEwMjQsIHJlcXMpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5GaWxsQnVmZmVyKGRzdEJ1ZmZlci5oYW5kbGUoKSwgMCwgNCwgMHgxMTExMTExMSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVXBkYXRlQnVmZmVyV2l0aGluUmVuZGVyUGFzcykgeworICAgIC8vIENhbGwgQ21kVXBkYXRlQnVmZmVyIHdpdGhpbiBhbiBhY3RpdmUgcmVuZGVycGFzcworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRVcGRhdGVCdWZmZXItcmVuZGVycGFzcyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUOworICAgIFZrQnVmZmVyT2JqIGRzdEJ1ZmZlcjsKKyAgICBkc3RCdWZmZXIuaW5pdF9hc19kc3QoKm1fZGV2aWNlLCAoVmtEZXZpY2VTaXplKTEwMjQsIHJlcXMpOworCisgICAgVmtEZXZpY2VTaXplIGRzdE9mZnNldCA9IDA7CisgICAgdWludDMyX3QgRGF0YVtdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9OworICAgIFZrRGV2aWNlU2l6ZSBkYXRhU2l6ZSA9IHNpemVvZihEYXRhKSAvIHNpemVvZih1aW50MzJfdCk7CisgICAgdms6OkNtZFVwZGF0ZUJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc3RCdWZmZXIuaGFuZGxlKCksIGRzdE9mZnNldCwgZGF0YVNpemUsICZEYXRhKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDbGVhckNvbG9ySW1hZ2VXaXRoQmFkUmFuZ2UpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJSZWNvcmQgY2xlYXIgY29sb3Igd2l0aCBhbiBpbnZhbGlkIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuY3JlYXRlX2luZm8oKS5hcnJheUxheWVycyA9PSAxKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBpbWFnZS5TZXRMYXlvdXQoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMKTsKKworICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlIGNsZWFyX2NvbG9yID0ge3swLjBmLCAwLjBmLCAwLjBmLCAxLjBmfX07CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgY29uc3QgYXV0byBjYl9oYW5kbGUgPSBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworCisgICAgLy8gVHJ5IGJhc2VNaXBMZXZlbCA+PSBpbWFnZS5taXBMZXZlbHMgd2l0aCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1iYXNlTWlwTGV2ZWwtMDE0NzAiKTsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMSwgVktfUkVNQUlOSU5HX01JUF9MRVZFTFMsIDAsIDF9OworICAgICAgICB2azo6Q21kQ2xlYXJDb2xvckltYWdlKGNiX2hhbmRsZSwgaW1hZ2UuaGFuZGxlKCksIGltYWdlLkxheW91dCgpLCAmY2xlYXJfY29sb3IsIDEsICZyYW5nZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIFRyeSBiYXNlTWlwTGV2ZWwgPj0gaW1hZ2UubWlwTGV2ZWxzIHdpdGhvdXQgVktfUkVNQUlOSU5HX01JUF9MRVZFTFMKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtYmFzZU1pcExldmVsLTAxNDcwIik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcFJhbmdlcy0wMTY5MiIpOworICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAxLCAxLCAwLCAxfTsKKyAgICAgICAgdms6OkNtZENsZWFyQ29sb3JJbWFnZShjYl9oYW5kbGUsIGltYWdlLmhhbmRsZSgpLCBpbWFnZS5MYXlvdXQoKSwgJmNsZWFyX2NvbG9yLCAxLCAmcmFuZ2UpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBUcnkgbGV2ZWxDb3VudCA9IDAKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtcFJhbmdlcy0wMTY5MiIpOworICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAwLCAwLCAxfTsKKyAgICAgICAgdms6OkNtZENsZWFyQ29sb3JJbWFnZShjYl9oYW5kbGUsIGltYWdlLmhhbmRsZSgpLCBpbWFnZS5MYXlvdXQoKSwgJmNsZWFyX2NvbG9yLCAxLCAmcmFuZ2UpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBUcnkgYmFzZU1pcExldmVsICsgbGV2ZWxDb3VudCA+IGltYWdlLm1pcExldmVscworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1wUmFuZ2VzLTAxNjkyIik7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDIsIDAsIDF9OworICAgICAgICB2azo6Q21kQ2xlYXJDb2xvckltYWdlKGNiX2hhbmRsZSwgaW1hZ2UuaGFuZGxlKCksIGltYWdlLkxheW91dCgpLCAmY2xlYXJfY29sb3IsIDEsICZyYW5nZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIFRyeSBiYXNlQXJyYXlMYXllciA+PSBpbWFnZS5hcnJheUxheWVycyB3aXRoIFZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlMKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtYmFzZUFycmF5TGF5ZXItMDE0NzIiKTsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMSwgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSU307CisgICAgICAgIHZrOjpDbWRDbGVhckNvbG9ySW1hZ2UoY2JfaGFuZGxlLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2UuTGF5b3V0KCksICZjbGVhcl9jb2xvciwgMSwgJnJhbmdlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gVHJ5IGJhc2VBcnJheUxheWVyID49IGltYWdlLmFycmF5TGF5ZXJzIHdpdGhvdXQgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1iYXNlQXJyYXlMYXllci0wMTQ3MiIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBSYW5nZXMtMDE2OTMiKTsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMSwgMX07CisgICAgICAgIHZrOjpDbWRDbGVhckNvbG9ySW1hZ2UoY2JfaGFuZGxlLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2UuTGF5b3V0KCksICZjbGVhcl9jb2xvciwgMSwgJnJhbmdlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gVHJ5IGxheWVyQ291bnQgPSAwCisgICAgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBSYW5nZXMtMDE2OTMiKTsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMH07CisgICAgICAgIHZrOjpDbWRDbGVhckNvbG9ySW1hZ2UoY2JfaGFuZGxlLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2UuTGF5b3V0KCksICZjbGVhcl9jb2xvciwgMSwgJnJhbmdlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gVHJ5IGJhc2VBcnJheUxheWVyICsgbGF5ZXJDb3VudCA+IGltYWdlLmFycmF5TGF5ZXJzCisgICAgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXBSYW5nZXMtMDE2OTMiKTsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMn07CisgICAgICAgIHZrOjpDbWRDbGVhckNvbG9ySW1hZ2UoY2JfaGFuZGxlLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2UuTGF5b3V0KCksICZjbGVhcl9jb2xvciwgMSwgJnJhbmdlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIENsZWFyRGVwdGhTdGVuY2lsV2l0aEJhZFJhbmdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUmVjb3JkIGNsZWFyIGRlcHRoIHdpdGggYW4gaW52YWxpZCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY29uc3QgYXV0byBkZXB0aF9mb3JtYXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBpZiAoIWRlcHRoX2Zvcm1hdCkgeworICAgICAgICBwcmludGYoIiVzIE5vIERlcHRoICsgU3RlbmNpbCBmb3JtYXQgZm91bmQuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgZGVwdGhfZm9ybWF0LCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuY3JlYXRlX2luZm8oKS5hcnJheUxheWVycyA9PSAxKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBjb25zdCBWa0ltYWdlQXNwZWN0RmxhZ3MgZHNfYXNwZWN0ID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKyAgICBpbWFnZS5TZXRMYXlvdXQoZHNfYXNwZWN0LCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwpOworCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGNsZWFyX3ZhbHVlID0ge307CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgY29uc3QgYXV0byBjYl9oYW5kbGUgPSBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworCisgICAgLy8gVHJ5IGJhc2VNaXBMZXZlbCA+PSBpbWFnZS5taXBMZXZlbHMgd2l0aCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtYmFzZU1pcExldmVsLTAxNDc0Iik7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge2RzX2FzcGVjdCwgMSwgVktfUkVNQUlOSU5HX01JUF9MRVZFTFMsIDAsIDF9OworICAgICAgICB2azo6Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShjYl9oYW5kbGUsIGltYWdlLmhhbmRsZSgpLCBpbWFnZS5MYXlvdXQoKSwgJmNsZWFyX3ZhbHVlLCAxLCAmcmFuZ2UpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBUcnkgYmFzZU1pcExldmVsID49IGltYWdlLm1pcExldmVscyB3aXRob3V0IFZLX1JFTUFJTklOR19NSVBfTEVWRUxTCisgICAgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1iYXNlTWlwTGV2ZWwtMDE0NzQiKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMTY5NCIpOworICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZSA9IHtkc19hc3BlY3QsIDEsIDEsIDAsIDF9OworICAgICAgICB2azo6Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShjYl9oYW5kbGUsIGltYWdlLmhhbmRsZSgpLCBpbWFnZS5MYXlvdXQoKSwgJmNsZWFyX3ZhbHVlLCAxLCAmcmFuZ2UpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBUcnkgbGV2ZWxDb3VudCA9IDAKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtMDE2OTQiKTsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7ZHNfYXNwZWN0LCAwLCAwLCAwLCAxfTsKKyAgICAgICAgdms6OkNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoY2JfaGFuZGxlLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2UuTGF5b3V0KCksICZjbGVhcl92YWx1ZSwgMSwgJnJhbmdlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gVHJ5IGJhc2VNaXBMZXZlbCArIGxldmVsQ291bnQgPiBpbWFnZS5taXBMZXZlbHMKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtMDE2OTQiKTsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7ZHNfYXNwZWN0LCAwLCAyLCAwLCAxfTsKKyAgICAgICAgdms6OkNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoY2JfaGFuZGxlLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2UuTGF5b3V0KCksICZjbGVhcl92YWx1ZSwgMSwgJnJhbmdlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gVHJ5IGJhc2VBcnJheUxheWVyID49IGltYWdlLmFycmF5TGF5ZXJzIHdpdGggVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLWJhc2VBcnJheUxheWVyLTAxNDc2Iik7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge2RzX2FzcGVjdCwgMCwgMSwgMSwgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSU307CisgICAgICAgIHZrOjpDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKGNiX2hhbmRsZSwgaW1hZ2UuaGFuZGxlKCksIGltYWdlLkxheW91dCgpLCAmY2xlYXJfdmFsdWUsIDEsICZyYW5nZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIFRyeSBiYXNlQXJyYXlMYXllciA+PSBpbWFnZS5hcnJheUxheWVycyB3aXRob3V0IFZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlMKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1iYXNlQXJyYXlMYXllci0wMTQ3NiIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1wUmFuZ2VzLTAxNjk1Iik7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge2RzX2FzcGVjdCwgMCwgMSwgMSwgMX07CisgICAgICAgIHZrOjpDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKGNiX2hhbmRsZSwgaW1hZ2UuaGFuZGxlKCksIGltYWdlLkxheW91dCgpLCAmY2xlYXJfdmFsdWUsIDEsICZyYW5nZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIFRyeSBsYXllckNvdW50ID0gMAorICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtcFJhbmdlcy0wMTY5NSIpOworICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZSA9IHtkc19hc3BlY3QsIDAsIDEsIDAsIDB9OworICAgICAgICB2azo6Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShjYl9oYW5kbGUsIGltYWdlLmhhbmRsZSgpLCBpbWFnZS5MYXlvdXQoKSwgJmNsZWFyX3ZhbHVlLCAxLCAmcmFuZ2UpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBUcnkgYmFzZUFycmF5TGF5ZXIgKyBsYXllckNvdW50ID4gaW1hZ2UuYXJyYXlMYXllcnMKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlLXBSYW5nZXMtMDE2OTUiKTsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7ZHNfYXNwZWN0LCAwLCAxLCAwLCAyfTsKKyAgICAgICAgdms6OkNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoY2JfaGFuZGxlLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2UuTGF5b3V0KCksICZjbGVhcl92YWx1ZSwgMSwgJnJhbmdlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIENsZWFyQ29sb3JJbWFnZVdpdGhpblJlbmRlclBhc3MpIHsKKyAgICAvLyBDYWxsIENtZENsZWFyQ29sb3JJbWFnZSB3aXRoaW4gYW4gYWN0aXZlIFJlbmRlclBhc3MKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJDb2xvckltYWdlLXJlbmRlcnBhc3MiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgVmtDbGVhckNvbG9yVmFsdWUgY2xlYXJfY29sb3I7CisgICAgbWVtc2V0KGNsZWFyX2NvbG9yLnVpbnQzMiwgMCwgc2l6ZW9mKHVpbnQzMl90KSAqIDQpOworICAgIGNvbnN0IFZrRm9ybWF0IHRleF9mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgY29uc3QgaW50MzJfdCB0ZXhfd2lkdGggPSAzMjsKKyAgICBjb25zdCBpbnQzMl90IHRleF9oZWlnaHQgPSAzMjsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gdGV4X2Zvcm1hdDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSB0ZXhfd2lkdGg7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IHRleF9oZWlnaHQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworCisgICAgVmtJbWFnZU9iaiBkc3RJbWFnZShtX2RldmljZSk7CisgICAgZHN0SW1hZ2UuaW5pdCgmaW1hZ2VfY3JlYXRlX2luZm8pOworCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSBWa0ltYWdlT2JqOjpzdWJyZXNvdXJjZV9yYW5nZShpbWFnZV9jcmVhdGVfaW5mbywgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCk7CisKKyAgICB2azo6Q21kQ2xlYXJDb2xvckltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRzdEltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgJmNsZWFyX2NvbG9yLCAxLCAmcmFuZ2UpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENsZWFyRGVwdGhTdGVuY2lsSW1hZ2VFcnJvcnMpIHsKKyAgICAvLyBIaXQgZXJyb3JzIHJlbGF0ZWQgdG8gdms6OkNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoKQorICAgIC8vIDEuIFVzZSBhbiBpbWFnZSB0aGF0IGRvZXNuJ3QgaGF2ZSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHNldAorICAgIC8vIDIuIENhbGwgQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSB3aXRoaW4gYW4gYWN0aXZlIFJlbmRlclBhc3MKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGF1dG8gZGVwdGhfZm9ybWF0ID0gRmluZFN1cHBvcnRlZERlcHRoU3RlbmNpbEZvcm1hdChncHUoKSk7CisgICAgaWYgKCFkZXB0aF9mb3JtYXQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBObyBEZXB0aCArIFN0ZW5jaWwgZm9ybWF0IGZvdW5kLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGNsZWFyX3ZhbHVlID0gezB9OworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0gVmtJbWFnZU9iajo6Y3JlYXRlX2luZm8oKTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IGRlcHRoX2Zvcm1hdDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSA2NDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgLy8gRXJyb3IgaGVyZSBpcyB0aGF0IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgaXMgZXhjbHVkZWQgZm9yIERTIGltYWdlIHRoYXQgd2UnbGwgY2FsbCBDbGVhciBvbiBiZWxvdworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDsKKworICAgIFZrSW1hZ2VPYmogZHN0X2ltYWdlX2JhZF91c2FnZShtX2RldmljZSk7CisgICAgZHN0X2ltYWdlX2JhZF91c2FnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSBWa0ltYWdlT2JqOjpzdWJyZXNvdXJjZV9yYW5nZShpbWFnZV9jcmVhdGVfaW5mbywgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtaW1hZ2UtMDAwMDkiKTsKKyAgICB2azo6Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc3RfaW1hZ2VfYmFkX3VzYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgJmNsZWFyX3ZhbHVlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBGaXggdXNhZ2UgZm9yIG5leHQgdGVzdCBjYXNlCisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBWa0ltYWdlT2JqIGRzdF9pbWFnZShtX2RldmljZSk7CisgICAgZHN0X2ltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1yZW5kZXJwYXNzIik7CisgICAgdms6OkNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZHN0X2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgJmNsZWFyX3ZhbHVlLCAxLCAmcmFuZ2UpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBCdWZmZXJNZW1vcnlCYXJyaWVyTm9CdWZmZXIpIHsKKyAgICAvLyBUcnkgdG8gYWRkIGEgYnVmZmVyIG1lbW9yeSBiYXJyaWVyIHdpdGggbm8gYnVmZmVyLgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIHBhcmFtZXRlciBwQnVmZmVyTWVtb3J5QmFycmllcnNbMF0uYnVmZmVyIHNwZWNpZmllZCBhcyBWS19OVUxMX0hBTkRMRSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgYnVmX2JhcnJpZXIgPSB7fTsKKyAgICBidWZfYmFycmllci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUjsKKyAgICBidWZfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUOworICAgIGJ1Zl9iYXJyaWVyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUOworICAgIGJ1Zl9iYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBidWZfYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgYnVmX2JhcnJpZXIuYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgICAgYnVmX2JhcnJpZXIub2Zmc2V0ID0gMDsKKyAgICBidWZfYmFycmllci5zaXplID0gVktfV0hPTEVfU0laRTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDEsICZidWZfYmFycmllciwgMCwgbnVsbHB0cik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkQmFycmllcnMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBIHZhcmlldHkgb2Ygd2F5cyB0byBnZXQgVktfSU5WQUxJRF9CQVJSSUVSICIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9TRVBBUkFURV9ERVBUSF9TVEVOQ0lMX0xBWU9VVFNfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19FWFRFTlNJT05fTkFNRSk7CisgICAgfQorICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBhdXRvIHNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlU2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzRmVhdHVyZXNLSFI+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJnNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlcyk7CisgICAgaWYgKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpIHsKKyAgICAgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzLnNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cyA9IFZLX0ZBTFNFOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpID8gJmZlYXR1cmVzMiA6IG51bGxwdHIpKTsKKworICAgIGF1dG8gZGVwdGhfZm9ybWF0ID0gRmluZFN1cHBvcnRlZERlcHRoU3RlbmNpbEZvcm1hdChncHUoKSk7CisgICAgaWYgKCFkZXB0aF9mb3JtYXQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBObyBEZXB0aCArIFN0ZW5jaWwgZm9ybWF0IGZvdW5kLiBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEFkZCBhIHRva2VuIHNlbGYtZGVwZW5kZW5jeSBmb3IgdGhpcyB0ZXN0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZXJyb3JzCisgICAgbV9hZGRSZW5kZXJQYXNzU2VsZkRlcGVuZGVuY3kgPSB0cnVlOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCB1aW50MzJfdCBzdWJtaXRfZmFtaWx5ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIGNvbnN0IHVpbnQzMl90IGludmFsaWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obV9kZXZpY2UtPnF1ZXVlX3Byb3BzLnNpemUoKSk7CisgICAgY29uc3QgdWludDMyX3Qgb3RoZXJfZmFtaWx5ID0gc3VibWl0X2ZhbWlseSAhPSAwID8gMCA6IDE7CisgICAgY29uc3QgYm9vbCBvbmx5X29uZV9mYW1pbHkgPSAoaW52YWxpZCA9PSAxKSB8fCAobV9kZXZpY2UtPnF1ZXVlX3Byb3BzW290aGVyX2ZhbWlseV0ucXVldWVDb3VudCA9PSAwKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcWZfaW5kaWNlc3t7c3VibWl0X2ZhbWlseSwgb3RoZXJfZmFtaWx5fX07CisgICAgaWYgKG9ubHlfb25lX2ZhbWlseSkgeworICAgICAgICBxZl9pbmRpY2VzLnJlc2l6ZSgxKTsKKyAgICB9CisgICAgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlcjo6Q29udGV4dCB0ZXN0X2NvbnRleHQodGhpcywgcWZfaW5kaWNlcyk7CisKKyAgICAvLyBVc2UgaW1hZ2UgdW5ib3VuZCB0byBtZW1vcnkgaW4gYmFycmllcgorICAgIC8vIFVzZSBidWZmZXIgdW5ib3VuZCB0byBtZW1vcnkgaW4gYmFycmllcgorICAgIEJhcnJpZXJRdWV1ZUZhbWlseVRlc3RIZWxwZXIgY29uY190ZXN0KCZ0ZXN0X2NvbnRleHQpOworICAgIGNvbmNfdGVzdC5Jbml0KG51bGxwdHIsIGZhbHNlLCBmYWxzZSk7CisKKyAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8ubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBjb25jX3Rlc3QoIiB1c2VkIHdpdGggbm8gbWVtb3J5IGJvdW5kLiBNZW1vcnkgc2hvdWxkIGJlIGJvdW5kIGJ5IGNhbGxpbmcgdmtCaW5kSW1hZ2VNZW1vcnkoKSIsCisgICAgICAgICAgICAgICIgdXNlZCB3aXRoIG5vIG1lbW9yeSBib3VuZC4gTWVtb3J5IHNob3VsZCBiZSBib3VuZCBieSBjYWxsaW5nIHZrQmluZEJ1ZmZlck1lbW9yeSgpIik7CisKKyAgICBWa0J1ZmZlck9iaiBidWZmZXI7CisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbV9yZXFzID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQ7CisgICAgYnVmZmVyLmluaXRfYXNfc3JjX2FuZF9kc3QoKm1fZGV2aWNlLCAyNTYsIG1lbV9yZXFzKTsKKyAgICBjb25jX3Rlc3QuYnVmZmVyX2JhcnJpZXJfLmJ1ZmZlciA9IGJ1ZmZlci5oYW5kbGUoKTsKKworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uaW1hZ2UgPSBpbWFnZS5oYW5kbGUoKTsKKworICAgIC8vIE5ldyBsYXlvdXQgY2FuJ3QgYmUgVU5ERUZJTkVECisgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW5ld0xheW91dC0wMTE5OCIsICIiKTsKKworICAgIC8vIFRyYW5zaXRpb24gaW1hZ2UgdG8gY29sb3IgYXR0YWNobWVudCBvcHRpbWFsCisgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgY29uY190ZXN0KCIiKTsKKworICAgIC8vIFRPRE86IHRoaXMgbG9va3MgdmVzdGlnYWwgb3IgaW5jb21wbGV0ZS4uLgorICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgLy8gQ2FuJ3Qgc2VuZCBidWZmZXIgbWVtb3J5IGJhcnJpZXIgZHVyaW5nIGEgcmVuZGVyIHBhc3MKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKworICAgIC8vIER1cGxpY2F0ZSBiYXJyaWVycyB0aGF0IGNoYW5nZSBsYXlvdXQKKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWdfYmFycmllciA9IHt9OworICAgIGltZ19iYXJyaWVyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI7CisgICAgaW1nX2JhcnJpZXIucE5leHQgPSBOVUxMOworICAgIGltZ19iYXJyaWVyLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaW1nX2JhcnJpZXIub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBpbWdfYmFycmllci5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBpbWdfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUOworICAgIGltZ19iYXJyaWVyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUOworICAgIGltZ19iYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbWdfYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltZ19iYXJyaWVyc1syXSA9IHtpbWdfYmFycmllciwgaW1nX2JhcnJpZXJ9OworCisgICAgLy8gVHJhbnNpdGlvbnMgZnJvbSBVTkRFRklORUQgIGFyZSB2YWxpZCwgZXZlbiBpZiBkdXBsaWNhdGVkCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ19iYXJyaWVycyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAvLyBEdXBsaWNhdGlvbiBvZiBsYXlvdXQgdHJhbnNpdGlvbnMgKG5vdCBmcm9tIHVuZGVmaW5lZCkgYXJlIG5vdCB2YWxpZAorICAgIGltZ19iYXJyaWVyc1swXS5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBpbWdfYmFycmllcnNbMF0ubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBpbWdfYmFycmllcnNbMV0ub2xkTGF5b3V0ID0gaW1nX2JhcnJpZXJzWzBdLm9sZExheW91dDsKKyAgICBpbWdfYmFycmllcnNbMV0ubmV3TGF5b3V0ID0gaW1nX2JhcnJpZXJzWzBdLm5ld0xheW91dDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTE5NyIpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCwgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklULCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nX2JhcnJpZXJzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEV4Y2VlZCB0aGUgYnVmZmVyIHNpemUKKyAgICBjb25jX3Rlc3QuYnVmZmVyX2JhcnJpZXJfLm9mZnNldCA9IGNvbmNfdGVzdC5idWZmZXJfLmNyZWF0ZV9pbmZvKCkuc2l6ZSArIDE7CisgICAgY29uY190ZXN0KCIiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItb2Zmc2V0LTAxMTg3Iik7CisKKyAgICBjb25jX3Rlc3QuYnVmZmVyX2JhcnJpZXJfLm9mZnNldCA9IDA7CisgICAgY29uY190ZXN0LmJ1ZmZlcl9iYXJyaWVyXy5zaXplID0gY29uY190ZXN0LmJ1ZmZlcl8uY3JlYXRlX2luZm8oKS5zaXplICsgMTsKKyAgICAvLyBTaXplIGdyZWF0ZXIgdGhhbiB0b3RhbCBzaXplCisgICAgY29uY190ZXN0KCIiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItc2l6ZS0wMTE4OSIpOworCisgICAgY29uY190ZXN0LmJ1ZmZlcl9iYXJyaWVyXy5zaXplID0gVktfV0hPTEVfU0laRTsKKworICAgIC8vIE5vdyBleGVyY2lzZSBiYXJyaWVyIGFzcGVjdCBiaXQgZXJyb3JzLCBmaXJzdCBEUworICAgIFZrRGVwdGhTdGVuY2lsT2JqIGRzX2ltYWdlKG1fZGV2aWNlKTsKKyAgICBkc19pbWFnZS5Jbml0KG1fZGV2aWNlLCAxMjgsIDEyOCwgZGVwdGhfZm9ybWF0KTsKKyAgICBBU1NFUlRfVFJVRShkc19pbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5pbWFnZSA9IGRzX2ltYWdlLmhhbmRsZSgpOworCisgICAgLy8gTm90IGhhdmluZyBERVBUSCBvciBTVEVOQ0lMIHNldCBpcyBhbiBlcnJvcgorICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEltYWdlQXNwZWN0Iik7CisgICAgaWYgKHNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlcy5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMpIHsKKyAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAzMzE5Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAzMzIwIik7CisKKyAgICAgICAgLy8gSGF2aW5nIG9ubHkgb25lIG9mIGRlcHRoIG9yIHN0ZW5jaWwgc2V0IGZvciBEUyBpbWFnZSBpcyBhbiBlcnJvcgorICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworICAgICAgICBjb25jX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDMzMjAiKTsKKyAgICB9CisKKyAgICAvLyBIYXZpbmcgYW55dGhpbmcgb3RoZXIgdGhhbiBERVBUSCBhbmQgU1RFTkNJTCBpcyBhbiBlcnJvcgorICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPQorICAgICAgICBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUIHwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb25jX3Rlc3QoIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRJbWFnZUFzcGVjdCIpOworCisgICAgLy8gTm93IHRlc3QgZGVwdGgtb25seQorICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcHM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIFZLX0ZPUk1BVF9EMTZfVU5PUk0sICZmb3JtYXRfcHJvcHMpOworICAgIGlmIChmb3JtYXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCkgeworICAgICAgICBWa0RlcHRoU3RlbmNpbE9iaiBkX2ltYWdlKG1fZGV2aWNlKTsKKyAgICAgICAgZF9pbWFnZS5Jbml0KG1fZGV2aWNlLCAxMjgsIDEyOCwgVktfRk9STUFUX0QxNl9VTk9STSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGRfaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uaW1hZ2UgPSBkX2ltYWdlLmhhbmRsZSgpOworCisgICAgICAgIC8vIERFUFRIIGJpdCBtdXN0IGJlIHNldAorICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVDsKKyAgICAgICAgY29uY190ZXN0KCJEZXB0aC1vbmx5IGltYWdlIGZvcm1hdHMgbXVzdCBoYXZlIHRoZSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHNldC4iKTsKKworICAgICAgICAvLyBObyBiaXRzIG90aGVyIHRoYW4gREVQVEggbWF5IGJlIHNldAorICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIGNvbmNfdGVzdCgiRGVwdGgtb25seSBpbWFnZSBmb3JtYXRzIGNhbiBoYXZlIG9ubHkgdGhlIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgc2V0LiIpOworICAgIH0KKworICAgIC8vIE5vdyB0ZXN0IHN0ZW5jaWwtb25seQorICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBWS19GT1JNQVRfUzhfVUlOVCwgJmZvcm1hdF9wcm9wcyk7CisgICAgaWYgKGZvcm1hdF9wcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKSB7CisgICAgICAgIFZrRGVwdGhTdGVuY2lsT2JqIHNfaW1hZ2UobV9kZXZpY2UpOworICAgICAgICBzX2ltYWdlLkluaXQobV9kZXZpY2UsIDEyOCwgMTI4LCBWS19GT1JNQVRfUzhfVUlOVCk7CisgICAgICAgIEFTU0VSVF9UUlVFKHNfaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uaW1hZ2UgPSBzX2ltYWdlLmhhbmRsZSgpOworCisgICAgICAgIC8vIFVzZSBvZiBDT0xPUiBhc3BlY3Qgb24gZGVwdGggaW1hZ2UgaXMgZXJyb3IKKyAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIGNvbmNfdGVzdCgiU3RlbmNpbC1vbmx5IGltYWdlIGZvcm1hdHMgbXVzdCBoYXZlIHRoZSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgc2V0LiIpOworICAgIH0KKworICAgIC8vIEZpbmFsbHkgdGVzdCBjb2xvcgorICAgIFZrSW1hZ2VPYmogY19pbWFnZShtX2RldmljZSk7CisgICAgY19pbWFnZS5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoY19pbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8ub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8ubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLmltYWdlID0gY19pbWFnZS5oYW5kbGUoKTsKKworICAgIC8vIENPTE9SIGJpdCBtdXN0IGJlIHNldAorICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUOworICAgIGNvbmNfdGVzdCgiQ29sb3IgaW1hZ2UgZm9ybWF0cyBtdXN0IGhhdmUgdGhlIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgc2V0LiIpOworCisgICAgLy8gTm8gYml0cyBvdGhlciB0aGFuIENPTE9SIG1heSBiZSBzZXQKKyAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgY29uY190ZXN0KCJDb2xvciBpbWFnZSBmb3JtYXRzIG11c3QgaGF2ZSBPTkxZIHRoZSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIHNldC4iKTsKKworICAgIC8vIEEgYmFycmllcidzIG5ldyBhbmQgb2xkIFZrSW1hZ2VMYXlvdXQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggYW4gaW1hZ2UncyBWa0ltYWdlVXNhZ2VGbGFncy4KKyAgICB7CisgICAgICAgIFZrSW1hZ2VPYmogaW1nX2NvbG9yKG1fZGV2aWNlKTsKKyAgICAgICAgaW1nX2NvbG9yLkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW1nX2NvbG9yLmluaXRpYWxpemVkKCkpOworCisgICAgICAgIFZrSW1hZ2VPYmogaW1nX2RzKG1fZGV2aWNlKTsKKyAgICAgICAgaW1nX2RzLkluaXQoMTI4LCAxMjgsIDEsIGRlcHRoX2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworICAgICAgICBBU1NFUlRfVFJVRShpbWdfZHMuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgVmtJbWFnZU9iaiBpbWdfeGZlcl9zcmMobV9kZXZpY2UpOworICAgICAgICBpbWdfeGZlcl9zcmMuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltZ194ZmVyX3NyYy5pbml0aWFsaXplZCgpKTsKKworICAgICAgICBWa0ltYWdlT2JqIGltZ194ZmVyX2RzdChtX2RldmljZSk7CisgICAgICAgIGltZ194ZmVyX2RzdC5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW1nX3hmZXJfZHN0LmluaXRpYWxpemVkKCkpOworCisgICAgICAgIFZrSW1hZ2VPYmogaW1nX3NhbXBsZWQobV9kZXZpY2UpOworICAgICAgICBpbWdfc2FtcGxlZC5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworICAgICAgICBBU1NFUlRfVFJVRShpbWdfc2FtcGxlZC5pbml0aWFsaXplZCgpKTsKKworICAgICAgICBWa0ltYWdlT2JqIGltZ19pbnB1dChtX2RldmljZSk7CisgICAgICAgIGltZ19pbnB1dC5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltZ19pbnB1dC5pbml0aWFsaXplZCgpKTsKKworICAgICAgICBjb25zdCBzdHJ1Y3QgeworICAgICAgICAgICAgVmtJbWFnZU9iaiAmaW1hZ2Vfb2JqOworICAgICAgICAgICAgVmtJbWFnZUxheW91dCBiYWRfbGF5b3V0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnX2NvZGU7CisgICAgICAgIH0gYmFkX2J1ZmZlcl9sYXlvdXRzW10gPSB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgICAgICAgICAvLyBpbWFnZXMgX3dpdGhvdXRfIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUCisgICAgICAgICAgICB7aW1nX2RzLCAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLCAgICAgICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIwOCJ9LAorICAgICAgICAgICAge2ltZ194ZmVyX3NyYywgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwgICAgICAgICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMDgifSwKKyAgICAgICAgICAgIHtpbWdfeGZlcl9kc3QsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsICAgICAgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjA4In0sCisgICAgICAgICAgICB7aW1nX3NhbXBsZWQsICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLCAgICAgICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIwOCJ9LAorICAgICAgICAgICAge2ltZ19pbnB1dCwgICAgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwgICAgICAgICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMDgifSwKKyAgICAgICAgICAgIC8vIGltYWdlcyBfd2l0aG91dF8gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVAorICAgICAgICAgICAge2ltZ19jb2xvciwgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMDkifSwKKyAgICAgICAgICAgIHtpbWdfeGZlcl9zcmMsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjA5In0sCisgICAgICAgICAgICB7aW1nX3hmZXJfZHN0LCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIwOSJ9LAorICAgICAgICAgICAge2ltZ19zYW1wbGVkLCAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMDkifSwKKyAgICAgICAgICAgIHtpbWdfaW5wdXQsICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjA5In0sCisgICAgICAgICAgICB7aW1nX2NvbG9yLCAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMCJ9LAorICAgICAgICAgICAge2ltZ194ZmVyX3NyYywgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTAifSwKKyAgICAgICAgICAgIHtpbWdfeGZlcl9kc3QsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLCAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEwIn0sCisgICAgICAgICAgICB7aW1nX3NhbXBsZWQsICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMCJ9LAorICAgICAgICAgICAge2ltZ19pbnB1dCwgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTAifSwKKyAgICAgICAgICAgIC8vIGltYWdlcyBfd2l0aG91dF8gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgb3IgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQKKyAgICAgICAgICAgIHtpbWdfY29sb3IsICAgIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwsICAgICAgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjExIn0sCisgICAgICAgICAgICB7aW1nX2RzLCAgICAgICBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMLCAgICAgICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMSJ9LAorICAgICAgICAgICAge2ltZ194ZmVyX3NyYywgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCwgICAgICAgICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTEifSwKKyAgICAgICAgICAgIHtpbWdfeGZlcl9kc3QsIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwsICAgICAgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjExIn0sCisgICAgICAgICAgICAvLyBpbWFnZXMgX3dpdGhvdXRfIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQKKyAgICAgICAgICAgIHtpbWdfY29sb3IsICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEyIn0sCisgICAgICAgICAgICB7aW1nX2RzLCAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMiJ9LAorICAgICAgICAgICAge2ltZ194ZmVyX2RzdCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLCAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTIifSwKKyAgICAgICAgICAgIHtpbWdfc2FtcGxlZCwgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEyIn0sCisgICAgICAgICAgICB7aW1nX2lucHV0LCAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMiJ9LAorICAgICAgICAgICAgLy8gaW1hZ2VzIF93aXRob3V0XyBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUCisgICAgICAgICAgICB7aW1nX2NvbG9yLCAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMyJ9LAorICAgICAgICAgICAge2ltZ19kcywgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTMifSwKKyAgICAgICAgICAgIHtpbWdfeGZlcl9zcmMsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMjEzIn0sCisgICAgICAgICAgICB7aW1nX3NhbXBsZWQsICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMTIxMyJ9LAorICAgICAgICAgICAge2ltZ19pbnB1dCwgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTMifSwKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICB9OworICAgICAgICBjb25zdCB1aW50MzJfdCBsYXlvdXRfY291bnQgPSBzaXplb2YoYmFkX2J1ZmZlcl9sYXlvdXRzKSAvIHNpemVvZihiYWRfYnVmZmVyX2xheW91dHNbMF0pOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXlvdXRfY291bnQ7ICsraSkgeworICAgICAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLmltYWdlID0gYmFkX2J1ZmZlcl9sYXlvdXRzW2ldLmltYWdlX29iai5oYW5kbGUoKTsKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlID0gYmFkX2J1ZmZlcl9sYXlvdXRzW2ldLmltYWdlX29iai51c2FnZSgpOworICAgICAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9ICh1c2FnZSA9PSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisKKyAgICAgICAgICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5vbGRMYXlvdXQgPSBiYWRfYnVmZmVyX2xheW91dHNbaV0uYmFkX2xheW91dDsKKyAgICAgICAgICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICAgICAgICAgIGNvbmNfdGVzdChiYWRfYnVmZmVyX2xheW91dHNbaV0ubXNnX2NvZGUpOworCisgICAgICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8ub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8ubmV3TGF5b3V0ID0gYmFkX2J1ZmZlcl9sYXlvdXRzW2ldLmJhZF9sYXlvdXQ7CisgICAgICAgICAgICBjb25jX3Rlc3QoYmFkX2J1ZmZlcl9sYXlvdXRzW2ldLm1zZ19jb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uaW1hZ2UgPSBpbWFnZS5oYW5kbGUoKTsKKyAgICB9CisKKyAgICAvLyBBdHRlbXB0IGJhcnJpZXIgd2hlcmUgc3JjQWNjZXNzTWFzayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHNyY1N0YWdlTWFzaworICAgIC8vIEhhdmUgbG93ZXItb3JkZXIgYml0IHRoYXQncyBzdXBwb3J0ZWQgKHNoYWRlciB3cml0ZSksIGJ1dCBoaWdoZXItb3JkZXIgYml0IG5vdCBzdXBwb3J0ZWQgdG8gdmVyaWZ5IG11bHRpLWJpdCB2YWxpZGF0aW9uCisgICAgY29uY190ZXN0LmJ1ZmZlcl9iYXJyaWVyXy5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUIHwgVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQ7CisgICAgY29uY190ZXN0LmJ1ZmZlcl9iYXJyaWVyXy5vZmZzZXQgPSAwOworICAgIGNvbmNfdGVzdC5idWZmZXJfYmFycmllcl8uc2l6ZSA9IFZLX1dIT0xFX1NJWkU7CisgICAgY29uY190ZXN0KCIiLCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNBY2Nlc3NNYXNrLTAyODE1Iik7CisKKyAgICAvLyBBdHRlbXB0IGJhcnJpZXIgd2hlcmUgZHN0QWNjZXNzTWFzayBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRzdFN0YWdlTWFzaworICAgIGNvbmNfdGVzdC5idWZmZXJfYmFycmllcl8uc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19UUkFOU0ZFUl9SRUFEX0JJVDsKKyAgICBjb25jX3Rlc3QuYnVmZmVyX2JhcnJpZXJfLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQ7CisgICAgY29uY190ZXN0KCIiLCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1kc3RBY2Nlc3NNYXNrLTAyODE2Iik7CisKKyAgICAvLyBBdHRlbXB0IHRvIG1pc21hdGNoIGJhcnJpZXJzL3dhaXRFdmVudHMgY2FsbHMgd2l0aCBpbmNvbXBhdGlibGUgcXVldWVzCisgICAgLy8gQ3JlYXRlIGNvbW1hbmQgcG9vbCB3aXRoIGluY29tcGF0aWJsZSBxdWV1ZWZsYWdzCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM+IHF1ZXVlX3Byb3BzID0gbV9kZXZpY2UtPnF1ZXVlX3Byb3BzOworICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleCA9IG1fZGV2aWNlLT5RdWV1ZUZhbWlseU1hdGNoaW5nKFZLX1FVRVVFX0dSQVBISUNTX0JJVCwgVktfUVVFVUVfQ09NUFVURV9CSVQpOworICAgIGlmIChxdWV1ZV9mYW1pbHlfaW5kZXggPT0gVUlOVDMyX01BWCkgeworICAgICAgICBwcmludGYoIiVzIE5vIG5vbi1jb21wdXRlIHF1ZXVlIHN1cHBvcnRpbmcgZ3JhcGhpY3MgZm91bmQ7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsgIC8vIE5PVEU6IHRoaXMgZXhpdHMgdGhlIHRlc3QgZnVuY3Rpb24hCisgICAgfQorCisgICAgVmtCdWZmZXJNZW1vcnlCYXJyaWVyIGJ1Zl9iYXJyaWVyID0ge307CisgICAgYnVmX2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX0JBUlJJRVI7CisgICAgYnVmX2JhcnJpZXIucE5leHQgPSBOVUxMOworICAgIGJ1Zl9iYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQ7CisgICAgYnVmX2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQ7CisgICAgYnVmX2JhcnJpZXIuYnVmZmVyID0gYnVmZmVyLmhhbmRsZSgpOworICAgIGJ1Zl9iYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBidWZfYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgYnVmX2JhcnJpZXIub2Zmc2V0ID0gMDsKKyAgICBidWZfYmFycmllci5zaXplID0gVktfV0hPTEVfU0laRTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItc3JjU3RhZ2VNYXNrLTAxMTgzIik7CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIGNvbW1hbmRfcG9vbChtX2RldmljZSwgcXVldWVfZmFtaWx5X2luZGV4LCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGJhZF9jb21tYW5kX2J1ZmZlcihtX2RldmljZSwgJmNvbW1hbmRfcG9vbCk7CisKKyAgICBiYWRfY29tbWFuZF9idWZmZXIuYmVnaW4oKTsKKyAgICBidWZfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQ7CisgICAgLy8gU2V0IHR3byBiaXRzIHRoYXQgc2hvdWxkIGJvdGggYmUgc3VwcG9ydGVkIGFzIGEgYm9udXMgcG9zaXRpdmUgY2hlY2sKKyAgICBidWZfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCB8IFZLX0FDQ0VTU19UUkFOU0ZFUl9SRUFEX0JJVDsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKGJhZF9jb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklULCBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQsIDAsIG51bGxwdHIsIDEsICZidWZfYmFycmllciwgMCwgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDaGVjayBmb3IgZXJyb3IgZm9yIHRyeWluZyB0byB3YWl0IG9uIHBpcGVsaW5lIHN0YWdlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBxdWV1ZS4gU3BlY2lmaWNhbGx5IHNpbmNlIG91ciBxdWV1ZSBpcyBub3QgYQorICAgIC8vIGNvbXB1dGUgcXVldWUsIHZrOjpDbWRXYWl0RXZlbnRzIGNhbm5vdCBoYXZlIGl0J3Mgc291cmNlIHN0YWdlIG1hc2sgYmUgVktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklUCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLTAxMTY0Iik7CisgICAgVmtFdmVudCBldmVudDsKKyAgICBWa0V2ZW50Q3JlYXRlSW5mbyBldmVudF9jcmVhdGVfaW5mb3t9OworICAgIGV2ZW50X2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisgICAgdms6OkNyZWF0ZUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmV2ZW50X2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmZXZlbnQpOworICAgIHZrOjpDbWRXYWl0RXZlbnRzKGJhZF9jb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgMSwgJmV2ZW50LCAvKnNvdXJjZSBzdGFnZSBtYXNrKi8gVktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklULAorICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9TSEFERVJfQklULCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBiYWRfY29tbWFuZF9idWZmZXIuZW5kKCk7CisKKyAgICB2azo6RGVzdHJveUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgZXZlbnQsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRCYXJyaWVyUXVldWVGYW1pbHkpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYW5kIHN1Ym1pdCBiYXJyaWVycyB3aXRoIGludmFsaWQgcXVldWUgZmFtaWxpZXMiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KG51bGxwdHIsIG51bGxwdHIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisKKyAgICAvLyBGaW5kIHF1ZXVlcyBvZiB0d28gZmFtaWxpZXMKKyAgICBjb25zdCB1aW50MzJfdCBzdWJtaXRfZmFtaWx5ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIGNvbnN0IHVpbnQzMl90IGludmFsaWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obV9kZXZpY2UtPnF1ZXVlX3Byb3BzLnNpemUoKSk7CisgICAgY29uc3QgdWludDMyX3Qgb3RoZXJfZmFtaWx5ID0gc3VibWl0X2ZhbWlseSAhPSAwID8gMCA6IDE7CisgICAgY29uc3QgYm9vbCBvbmx5X29uZV9mYW1pbHkgPSAoaW52YWxpZCA9PSAxKSB8fCAobV9kZXZpY2UtPnF1ZXVlX3Byb3BzW290aGVyX2ZhbWlseV0ucXVldWVDb3VudCA9PSAwKTsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBxZl9pbmRpY2Vze3tzdWJtaXRfZmFtaWx5LCBvdGhlcl9mYW1pbHl9fTsKKyAgICBpZiAob25seV9vbmVfZmFtaWx5KSB7CisgICAgICAgIHFmX2luZGljZXMucmVzaXplKDEpOworICAgIH0KKyAgICBCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyOjpDb250ZXh0IHRlc3RfY29udGV4dCh0aGlzLCBxZl9pbmRpY2VzKTsKKworICAgIGlmIChtX2RldmljZS0+cHJvcHMuYXBpVmVyc2lvbiA+PSBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgIiVzIERldmljZSBoYXMgYXBpVmVyc2lvbiBncmVhdGVyIHRoYW4gMS4wIC0tIHNraXBwaW5nIHRlc3QgY2FzZXMgdGhhdCByZXF1aXJlIGV4dGVybmFsIG1lbW9yeSAiCisgICAgICAgICAgICAidG8gYmUgIgorICAgICAgICAgICAgImRpc2FibGVkLlxuIiwKKyAgICAgICAgICAgIGtTa2lwUHJlZml4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAob25seV9vbmVfZmFtaWx5KSB7CisgICAgICAgICAgICBwcmludGYoIiVzIFNpbmdsZSBxdWV1ZSBmYW1pbHkgZm91bmQgLS0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQgdGVzdGNhc2VzIHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gZmFtaWxpZXMgPSB7c3VibWl0X2ZhbWlseSwgb3RoZXJfZmFtaWx5fTsKKyAgICAgICAgICAgIEJhcnJpZXJRdWV1ZUZhbWlseVRlc3RIZWxwZXIgY29uY190ZXN0KCZ0ZXN0X2NvbnRleHQpOworICAgICAgICAgICAgY29uY190ZXN0LkluaXQoJmZhbWlsaWVzKTsKKyAgICAgICAgICAgIC8vIGNvcmVfdmFsaWRhdGlvbjo6YmFycmllcl9xdWV1ZV9mYW1pbGllczo6a1NyY0FuZERlc3RNdXN0QmVJZ25vcmUKKyAgICAgICAgICAgIGNvbmNfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTE5OSIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTAiLCBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwKKyAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRfZmFtaWx5KTsKKyAgICAgICAgICAgIGNvbmNfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTE5OSIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTAiLCBzdWJtaXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEKTsKKyAgICAgICAgICAgIGNvbmNfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTE5OSIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTAiLCBzdWJtaXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdF9mYW1pbHkpOworICAgICAgICAgICAgLy8gdHJ1ZSAtPiBwb3NpdGl2ZSB0ZXN0CisgICAgICAgICAgICBjb25jX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDExOTkiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTkwIiwgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICAgICAgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlciBleGNsX3Rlc3QoJnRlc3RfY29udGV4dCk7CisgICAgICAgIGV4Y2xfdGVzdC5Jbml0KG51bGxwdHIpOyAgLy8gbm8gcXVldWUgZmFtaWxpZXMgbWVhbnMgKmV4Y2x1c2l2ZSogc2hhcmluZyBtb2RlLgorCisgICAgICAgIC8vIGNvcmVfdmFsaWRhdGlvbjo6YmFycmllcl9xdWV1ZV9mYW1pbGllczo6a0JvdGhJZ25vcmVPckJvdGhWYWxpZAorICAgICAgICBleGNsX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEyMDAiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTkyIiwgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICBzdWJtaXRfZmFtaWx5KTsKKyAgICAgICAgZXhjbF90ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjAwIiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MiIsIHN1Ym1pdF9mYW1pbHksCisgICAgICAgICAgICAgICAgICBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCk7CisgICAgICAgIC8vIHRydWUgLT4gcG9zaXRpdmUgdGVzdAorICAgICAgICBleGNsX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEyMDAiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTkyIiwgc3VibWl0X2ZhbWlseSwgc3VibWl0X2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBleGNsX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEyMDAiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTkyIiwgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwgdHJ1ZSk7CisgICAgfQorCisgICAgaWYgKG9ubHlfb25lX2ZhbWlseSkgeworICAgICAgICBwcmludGYoIiVzIFNpbmdsZSBxdWV1ZSBmYW1pbHkgZm91bmQgLS0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSBzdWJtaXQgdGVzdGNhc2VzIHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlciBleGNsX3Rlc3QoJnRlc3RfY29udGV4dCk7CisgICAgICAgIGV4Y2xfdGVzdC5Jbml0KG51bGxwdHIpOworCisgICAgICAgIC8vIGNvcmVfdmFsaWRhdGlvbjo6YmFycmllcl9xdWV1ZV9mYW1pbGllczo6a1N1Ym1pdFF1ZXVlTXVzdE1hdGNoU3JjT3JEc3QKKyAgICAgICAgZXhjbF90ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjA1IiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5NiIsIG90aGVyX2ZhbWlseSwgb3RoZXJfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgZmFsc2UsIHN1Ym1pdF9mYW1pbHkpOworCisgICAgICAgIC8vIHRydWUgLT4gcG9zaXRpdmUgdGVzdCAodGVzdGluZyBib3RoIHRoZSBpbmRleCBsb2dpYyBhbmQgdGhlIFFGTyB0cmFuc2ZlciB0cmFja2luZy4KKyAgICAgICAgZXhjbF90ZXN0KCJQT1NJVElWRV9URVNUIiwgIlBPU0lUSVZFX1RFU1QiLCBzdWJtaXRfZmFtaWx5LCBvdGhlcl9mYW1pbHksIHRydWUsIHN1Ym1pdF9mYW1pbHkpOworICAgICAgICBleGNsX3Rlc3QoIlBPU0lUSVZFX1RFU1QiLCAiUE9TSVRJVkVfVEVTVCIsIHN1Ym1pdF9mYW1pbHksIG90aGVyX2ZhbWlseSwgdHJ1ZSwgb3RoZXJfZmFtaWx5KTsKKyAgICAgICAgZXhjbF90ZXN0KCJQT1NJVElWRV9URVNUIiwgIlBPU0lUSVZFX1RFU1QiLCBvdGhlcl9mYW1pbHksIHN1Ym1pdF9mYW1pbHksIHRydWUsIG90aGVyX2ZhbWlseSk7CisgICAgICAgIGV4Y2xfdGVzdCgiUE9TSVRJVkVfVEVTVCIsICJQT1NJVElWRV9URVNUIiwgb3RoZXJfZmFtaWx5LCBzdWJtaXRfZmFtaWx5LCB0cnVlLCBzdWJtaXRfZmFtaWx5KTsKKworICAgICAgICAvLyBuZWdhdGl2ZSB0ZXN0aW5nIGZvciBRRk8gdHJhbnNmZXIgdHJhY2tpbmcKKyAgICAgICAgLy8gRHVwbGljYXRlIHJlbGVhc2UgaW4gb25lIENCCisgICAgICAgIGV4Y2xfdGVzdCgiVU5BU1NJR05FRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMDAwMSIsICJVTkFTU0lHTkVELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDAwMDEiLCBzdWJtaXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgb3RoZXJfZmFtaWx5LCBmYWxzZSwgc3VibWl0X2ZhbWlseSwgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlcjo6RE9VQkxFX1JFQ09SRCk7CisgICAgICAgIC8vIER1cGxpY2F0ZSBwZW5kaW5nIHJlbGVhc2UKKyAgICAgICAgZXhjbF90ZXN0KCJVTkFTU0lHTkVELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAwMDAzIiwgIlVOQVNTSUdORUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMDAwMyIsIHN1Ym1pdF9mYW1pbHksCisgICAgICAgICAgICAgICAgICBvdGhlcl9mYW1pbHksIGZhbHNlLCBzdWJtaXRfZmFtaWx5KTsKKyAgICAgICAgLy8gRHVwbGljYXRlIGFjcXVpcmUgaW4gb25lIENCCisgICAgICAgIGV4Y2xfdGVzdCgiVU5BU1NJR05FRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMDAwMSIsICJVTkFTU0lHTkVELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDAwMDEiLCBzdWJtaXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgb3RoZXJfZmFtaWx5LCBmYWxzZSwgb3RoZXJfZmFtaWx5LCBCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyOjpET1VCTEVfUkVDT1JEKTsKKyAgICAgICAgLy8gTm8gcGVuZGluZyByZWxlYXNlCisgICAgICAgIGV4Y2xfdGVzdCgiVU5BU1NJR05FRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMDAwNCIsICJVTkFTU0lHTkVELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDAwMDQiLCBzdWJtaXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgb3RoZXJfZmFtaWx5LCBmYWxzZSwgb3RoZXJfZmFtaWx5KTsKKyAgICAgICAgLy8gRHVwbGljYXRlIHJlbGVhc2UgaW4gdHdvIENCCisgICAgICAgIGV4Y2xfdGVzdCgiVU5BU1NJR05FRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMDAwMiIsICJVTkFTU0lHTkVELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDAwMDIiLCBzdWJtaXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgb3RoZXJfZmFtaWx5LCBmYWxzZSwgc3VibWl0X2ZhbWlseSwgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlcjo6RE9VQkxFX0NPTU1BTkRfQlVGRkVSKTsKKyAgICAgICAgLy8gRHVwbGljYXRlIGFjcXVpcmUgaW4gdHdvIENCCisgICAgICAgIGV4Y2xfdGVzdCgiUE9TSVRJVkVfVEVTVCIsICJQT1NJVElWRV9URVNUIiwgc3VibWl0X2ZhbWlseSwgb3RoZXJfZmFtaWx5LCB0cnVlLCBzdWJtaXRfZmFtaWx5KTsgIC8vIG5lZWQgYSBzdWNjZXNmdWwgcmVsZWFzZQorICAgICAgICBleGNsX3Rlc3QoIlVOQVNTSUdORUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDAwMDIiLCAiVU5BU1NJR05FRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAwMDAyIiwgc3VibWl0X2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgIG90aGVyX2ZhbWlseSwgZmFsc2UsIG90aGVyX2ZhbWlseSwgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlcjo6RE9VQkxFX0NPTU1BTkRfQlVGRkVSKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZEJhcnJpZXJRdWV1ZUZhbWlseVdpdGhNZW1FeHQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYW5kIHN1Ym1pdCBiYXJyaWVycyB3aXRoIGludmFsaWQgcXVldWUgZmFtaWxpZXMgd2hlbiBtZW1vcnkgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgIik7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiByZXFkX2luc3RhbmNlX2V4dGVuc2lvbnMgPSB7CisgICAgICAgIHtWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUsIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FfX07CisgICAgZm9yIChhdXRvIGV4dGVuc2lvbl9uYW1lIDogcmVxZF9pbnN0YW5jZV9leHRlbnNpb25zKSB7CisgICAgICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChleHRlbnNpb25fbmFtZSkpIHsKKyAgICAgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhleHRlbnNpb25fbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzIFJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCwgZXh0ZW5zaW9uX25hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgLy8gQ2hlY2sgZm9yIGV4dGVybmFsIG1lbW9yeSBkZXZpY2UgZXh0ZW5zaW9ucworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlcm5hbCBtZW1vcnkgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCBudWxscHRyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworCisgICAgLy8gRmluZCBxdWV1ZXMgb2YgdHdvIGZhbWlsaWVzCisgICAgY29uc3QgdWludDMyX3Qgc3VibWl0X2ZhbWlseSA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBjb25zdCB1aW50MzJfdCBpbnZhbGlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1fZGV2aWNlLT5xdWV1ZV9wcm9wcy5zaXplKCkpOworICAgIGNvbnN0IHVpbnQzMl90IG90aGVyX2ZhbWlseSA9IHN1Ym1pdF9mYW1pbHkgIT0gMCA/IDAgOiAxOworICAgIGNvbnN0IGJvb2wgb25seV9vbmVfZmFtaWx5ID0gKGludmFsaWQgPT0gMSkgfHwgKG1fZGV2aWNlLT5xdWV1ZV9wcm9wc1tvdGhlcl9mYW1pbHldLnF1ZXVlQ291bnQgPT0gMCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcWZfaW5kaWNlc3t7c3VibWl0X2ZhbWlseSwgb3RoZXJfZmFtaWx5fX07CisgICAgaWYgKG9ubHlfb25lX2ZhbWlseSkgeworICAgICAgICBxZl9pbmRpY2VzLnJlc2l6ZSgxKTsKKyAgICB9CisgICAgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlcjo6Q29udGV4dCB0ZXN0X2NvbnRleHQodGhpcywgcWZfaW5kaWNlcyk7CisKKyAgICBpZiAob25seV9vbmVfZmFtaWx5KSB7CisgICAgICAgIHByaW50ZigiJXMgU2luZ2xlIHF1ZXVlIGZhbWlseSBmb3VuZCAtLSBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCB0ZXN0Y2FzZXMgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gZmFtaWxpZXMgPSB7c3VibWl0X2ZhbWlseSwgb3RoZXJfZmFtaWx5fTsKKyAgICAgICAgQmFycmllclF1ZXVlRmFtaWx5VGVzdEhlbHBlciBjb25jX3Rlc3QoJnRlc3RfY29udGV4dCk7CisKKyAgICAgICAgLy8gY29yZV92YWxpZGF0aW9uOjpiYXJyaWVyX3F1ZXVlX2ZhbWlsaWVzOjprU3JjT3JEc3RNdXN0QmVJZ25vcmUKKyAgICAgICAgY29uY190ZXN0LkluaXQoJmZhbWlsaWVzKTsKKyAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMzgxIiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MSIsIHN1Ym1pdF9mYW1pbHksIHN1Ym1pdF9mYW1pbHkpOworICAgICAgICAvLyB0cnVlIC0+IHBvc2l0aXZlIHRlc3QKKyAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMzgxIiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MSIsIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELAorICAgICAgICAgICAgICAgICAgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIHRydWUpOworICAgICAgICBjb25jX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEzODEiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTkxIiwgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICBWS19RVUVVRV9GQU1JTFlfRVhURVJOQUxfS0hSLCB0cnVlKTsKKyAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMzgxIiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MSIsIFZLX1FVRVVFX0ZBTUlMWV9FWFRFUk5BTF9LSFIsCisgICAgICAgICAgICAgICAgICBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29yZV92YWxpZGF0aW9uOjpiYXJyaWVyX3F1ZXVlX2ZhbWlsaWVzOjprU3BlY2lhbE9ySWdub3JlT25seQorICAgICAgICBjb25jX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE3NjYiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzYzIiwgc3VibWl0X2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEKTsKKyAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxNzY2IiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTc2MyIsIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELAorICAgICAgICAgICAgICAgICAgc3VibWl0X2ZhbWlseSk7CisgICAgICAgIC8vIFRoaXMgaXMgdG8gZmxhZyB0aGUgZXJyb3JzIHRoYXQgd291bGQgYmUgY29uc2lkZXJlZCBvbmx5ICJ1bmV4cGVjdGVkIiBpbiB0aGUgcGFyYWxsZWwgY2FzZSBhYm92ZQorICAgICAgICAvLyB0cnVlIC0+IHBvc2l0aXZlIHRlc3QKKyAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxNzY2IiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTc2MyIsIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELAorICAgICAgICAgICAgICAgICAgVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMX0tIUiwgdHJ1ZSk7CisgICAgICAgIGNvbmNfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2NiIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjMiLCBWS19RVUVVRV9GQU1JTFlfRVhURVJOQUxfS0hSLAorICAgICAgICAgICAgICAgICAgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIHRydWUpOworICAgIH0KKworICAgIEJhcnJpZXJRdWV1ZUZhbWlseVRlc3RIZWxwZXIgZXhjbF90ZXN0KCZ0ZXN0X2NvbnRleHQpOworICAgIGV4Y2xfdGVzdC5Jbml0KG51bGxwdHIpOyAgLy8gbm8gcXVldWUgZmFtaWxpZXMgbWVhbnMgKmV4Y2x1c2l2ZSogc2hhcmluZyBtb2RlLgorCisgICAgLy8gY29yZV92YWxpZGF0aW9uOjpiYXJyaWVyX3F1ZXVlX2ZhbWlsaWVzOjprU3JjSWdub3JlUmVxdWlyZXNEc3RJZ25vcmUKKyAgICBleGNsX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDEyMDEiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxMTkzIiwgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgIHN1Ym1pdF9mYW1pbHkpOworICAgIGV4Y2xfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTIwMSIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDExOTMiLCBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwKKyAgICAgICAgICAgICAgVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMX0tIUik7CisgICAgLy8gdHJ1ZSAtPiBwb3NpdGl2ZSB0ZXN0CisgICAgZXhjbF90ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxMjAxIiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTE5MyIsIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELAorICAgICAgICAgICAgICBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwgdHJ1ZSk7CisKKyAgICAvLyBjb3JlX3ZhbGlkYXRpb246OmJhcnJpZXJfcXVldWVfZmFtaWxpZXM6OmtEc3RWYWxpZE9yU3BlY2lhbElmTm90SWdub3JlCisgICAgZXhjbF90ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxNzY4IiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTc2NSIsIHN1Ym1pdF9mYW1pbHksIGludmFsaWQpOworICAgIC8vIHRydWUgLT4gcG9zaXRpdmUgdGVzdAorICAgIGV4Y2xfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2OCIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjUiLCBzdWJtaXRfZmFtaWx5LCBzdWJtaXRfZmFtaWx5LAorICAgICAgICAgICAgICB0cnVlKTsKKyAgICBleGNsX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE3NjgiLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzY1Iiwgc3VibWl0X2ZhbWlseSwKKyAgICAgICAgICAgICAgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIHRydWUpOworICAgIGV4Y2xfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2OCIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjUiLCBzdWJtaXRfZmFtaWx5LAorICAgICAgICAgICAgICBWS19RVUVVRV9GQU1JTFlfRVhURVJOQUxfS0hSLCB0cnVlKTsKKworICAgIC8vIGNvcmVfdmFsaWRhdGlvbjo6YmFycmllcl9xdWV1ZV9mYW1pbGllczo6a1NyY1ZhbGlkT3JTcGVjaWFsSWZOb3RJZ25vcmUKKyAgICBleGNsX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItaW1hZ2UtMDE3NjciLCAiVlVJRC1Wa0J1ZmZlck1lbW9yeUJhcnJpZXItYnVmZmVyLTAxNzY0IiwgaW52YWxpZCwgc3VibWl0X2ZhbWlseSk7CisgICAgLy8gdHJ1ZSAtPiBwb3NpdGl2ZSB0ZXN0CisgICAgZXhjbF90ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLWltYWdlLTAxNzY3IiwgIlZVSUQtVmtCdWZmZXJNZW1vcnlCYXJyaWVyLWJ1ZmZlci0wMTc2NCIsIHN1Ym1pdF9mYW1pbHksIHN1Ym1pdF9mYW1pbHksCisgICAgICAgICAgICAgIHRydWUpOworICAgIGV4Y2xfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2NyIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjQiLCBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwKKyAgICAgICAgICAgICAgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsIHRydWUpOworICAgIGV4Y2xfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1pbWFnZS0wMTc2NyIsICJWVUlELVZrQnVmZmVyTWVtb3J5QmFycmllci1idWZmZXItMDE3NjQiLCBWS19RVUVVRV9GQU1JTFlfRVhURVJOQUxfS0hSLAorICAgICAgICAgICAgICBzdWJtaXRfZmFtaWx5LCB0cnVlKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZUJhcnJpZXJXaXRoQmFkUmFuZ2UpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWa0ltYWdlTWVtb3J5QmFycmllciB3aXRoIGFuIGludmFsaWQgc3VicmVzb3VyY2VSYW5nZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXJfdGVtcGxhdGUgPSB7fTsKKyAgICBpbWdfYmFycmllcl90ZW1wbGF0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSOworICAgIGltZ19iYXJyaWVyX3RlbXBsYXRlLnBOZXh0ID0gTlVMTDsKKyAgICBpbWdfYmFycmllcl90ZW1wbGF0ZS5zcmNBY2Nlc3NNYXNrID0gMDsKKyAgICBpbWdfYmFycmllcl90ZW1wbGF0ZS5kc3RBY2Nlc3NNYXNrID0gMDsKKyAgICBpbWdfYmFycmllcl90ZW1wbGF0ZS5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGltZ19iYXJyaWVyX3RlbXBsYXRlLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXJfdGVtcGxhdGUuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyX3RlbXBsYXRlLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICAvLyBzdWJyZXNvdXJjZVJhbmdlIHRvIGJlIHNldCBsYXRlciBmb3IgdGhlIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyB0ZXN0CisgICAgaW1nX2JhcnJpZXJfdGVtcGxhdGUuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBpbWdfYmFycmllcl90ZW1wbGF0ZS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBpbWdfYmFycmllcl90ZW1wbGF0ZS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1nX2JhcnJpZXJfdGVtcGxhdGUuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMDsKKyAgICBpbWdfYmFycmllcl90ZW1wbGF0ZS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAwOworCisgICAgY29uc3QgdWludDMyX3Qgc3VibWl0X2ZhbWlseSA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBjb25zdCB1aW50MzJfdCBpbnZhbGlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1fZGV2aWNlLT5xdWV1ZV9wcm9wcy5zaXplKCkpOworICAgIGNvbnN0IHVpbnQzMl90IG90aGVyX2ZhbWlseSA9IHN1Ym1pdF9mYW1pbHkgIT0gMCA/IDAgOiAxOworICAgIGNvbnN0IGJvb2wgb25seV9vbmVfZmFtaWx5ID0gKGludmFsaWQgPT0gMSkgfHwgKG1fZGV2aWNlLT5xdWV1ZV9wcm9wc1tvdGhlcl9mYW1pbHldLnF1ZXVlQ291bnQgPT0gMCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHFmX2luZGljZXN7e3N1Ym1pdF9mYW1pbHksIG90aGVyX2ZhbWlseX19OworICAgIGlmIChvbmx5X29uZV9mYW1pbHkpIHsKKyAgICAgICAgcWZfaW5kaWNlcy5yZXNpemUoMSk7CisgICAgfQorICAgIEJhcnJpZXJRdWV1ZUZhbWlseVRlc3RIZWxwZXI6OkNvbnRleHQgdGVzdF9jb250ZXh0KHRoaXMsIHFmX2luZGljZXMpOworCisgICAgLy8gVXNlIGltYWdlIHVuYm91bmQgdG8gbWVtb3J5IGluIGJhcnJpZXIKKyAgICAvLyBVc2UgYnVmZmVyIHVuYm91bmQgdG8gbWVtb3J5IGluIGJhcnJpZXIKKyAgICBCYXJyaWVyUXVldWVGYW1pbHlUZXN0SGVscGVyIGNvbmNfdGVzdCgmdGVzdF9jb250ZXh0KTsKKyAgICBjb25jX3Rlc3QuSW5pdChudWxscHRyKTsKKyAgICBpbWdfYmFycmllcl90ZW1wbGF0ZS5pbWFnZSA9IGNvbmNfdGVzdC5pbWFnZV8uaGFuZGxlKCk7CisgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfID0gaW1nX2JhcnJpZXJfdGVtcGxhdGU7CisgICAgLy8gTmVzdGVkIHNjb3BlIGhlcmUgY29uZnVzZXMgY2xhbmctZm9ybWF0LCBzb21laG93CisgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorCisgICAgLy8gdHJ5IGZvciB2azo6Q21kUGlwZWxpbmVCYXJyaWVyCisgICAgeworICAgICAgICAvLyBUcnkgYmFzZU1pcExldmVsID49IGltYWdlLm1pcExldmVscyB3aXRoIFZLX1JFTUFJTklOR19NSVBfTEVWRUxTCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5zdWJyZXNvdXJjZVJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDEsIFZLX1JFTUFJTklOR19NSVBfTEVWRUxTLCAwLCAxfTsKKyAgICAgICAgICAgIGNvbmNfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNDg2Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgYmFzZU1pcExldmVsID49IGltYWdlLm1pcExldmVscyB3aXRob3V0IFZLX1JFTUFJTklOR19NSVBfTEVWRUxTCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5zdWJyZXNvdXJjZVJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDEsIDEsIDAsIDF9OworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNzI0Iik7CisgICAgICAgICAgICBjb25jX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTQ4NiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ5IGxldmVsQ291bnQgPSAwCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5zdWJyZXNvdXJjZVJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDAsIDAsIDF9OworICAgICAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE3MjQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSBiYXNlTWlwTGV2ZWwgKyBsZXZlbENvdW50ID4gaW1hZ2UubWlwTGV2ZWxzCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmNfdGVzdC5pbWFnZV9iYXJyaWVyXy5zdWJyZXNvdXJjZVJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDIsIDAsIDF9OworICAgICAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE3MjQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSBiYXNlQXJyYXlMYXllciA+PSBpbWFnZS5hcnJheUxheWVycyB3aXRoIFZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlMKKyAgICAgICAgeworICAgICAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLnN1YnJlc291cmNlUmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMSwgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSU307CisgICAgICAgICAgICBjb25jX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTQ4OCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ5IGJhc2VBcnJheUxheWVyID49IGltYWdlLmFycmF5TGF5ZXJzIHdpdGhvdXQgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUworICAgICAgICB7CisgICAgICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uc3VicmVzb3VyY2VSYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAxLCAxfTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTcyNSIpOworICAgICAgICAgICAgY29uY190ZXN0KCJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE0ODgiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSBsYXllckNvdW50ID0gMAorICAgICAgICB7CisgICAgICAgICAgICBjb25jX3Rlc3QuaW1hZ2VfYmFycmllcl8uc3VicmVzb3VyY2VSYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAwfTsKKyAgICAgICAgICAgIGNvbmNfdGVzdCgiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNzI1Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgYmFzZUFycmF5TGF5ZXIgKyBsYXllckNvdW50ID4gaW1hZ2UuYXJyYXlMYXllcnMKKyAgICAgICAgeworICAgICAgICAgICAgY29uY190ZXN0LmltYWdlX2JhcnJpZXJfLnN1YnJlc291cmNlUmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMn07CisgICAgICAgICAgICBjb25jX3Rlc3QoIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTcyNSIpOworICAgICAgICB9CisgICAgfQorCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIC8vIHRyeSBmb3Igdms6OkNtZFdhaXRFdmVudHMKKyAgICB7CisgICAgICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgICAgIFZrRXZlbnRDcmVhdGVJbmZvIGVjaXtWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTywgTlVMTCwgMH07CisgICAgICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVFdmVudChtX2RldmljZS0+aGFuZGxlKCksICZlY2ksIG51bGxwdHIsICZldmVudCk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgLy8gVHJ5IGJhc2VNaXBMZXZlbCA+PSBpbWFnZS5taXBMZXZlbHMgd2l0aCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUworICAgICAgICB7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE0ODYiKTsKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDEsIFZLX1JFTUFJTklOR19NSVBfTEVWRUxTLCAwLCAxfTsKKyAgICAgICAgICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltZ19iYXJyaWVyID0gaW1nX2JhcnJpZXJfdGVtcGxhdGU7CisgICAgICAgICAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlID0gcmFuZ2U7CisgICAgICAgICAgICB2azo6Q21kV2FpdEV2ZW50cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltZ19iYXJyaWVyKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ5IGJhc2VNaXBMZXZlbCA+PSBpbWFnZS5taXBMZXZlbHMgd2l0aG91dCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUworICAgICAgICB7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE0ODYiKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTcyNCIpOworICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMSwgMSwgMCwgMX07CisgICAgICAgICAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWdfYmFycmllciA9IGltZ19iYXJyaWVyX3RlbXBsYXRlOworICAgICAgICAgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgdms6OkNtZFdhaXRFdmVudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJmV2ZW50LCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbWdfYmFycmllcik7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSBsZXZlbENvdW50ID0gMAorICAgICAgICB7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE3MjQiKTsKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDAsIDAsIDF9OworICAgICAgICAgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIgPSBpbWdfYmFycmllcl90ZW1wbGF0ZTsKKyAgICAgICAgICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UgPSByYW5nZTsKKyAgICAgICAgICAgIHZrOjpDbWRXYWl0RXZlbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgYmFzZU1pcExldmVsICsgbGV2ZWxDb3VudCA+IGltYWdlLm1pcExldmVscworICAgICAgICB7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE3MjQiKTsKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDIsIDAsIDF9OworICAgICAgICAgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIgPSBpbWdfYmFycmllcl90ZW1wbGF0ZTsKKyAgICAgICAgICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UgPSByYW5nZTsKKyAgICAgICAgICAgIHZrOjpDbWRXYWl0RXZlbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgYmFzZUFycmF5TGF5ZXIgPj0gaW1hZ2UuYXJyYXlMYXllcnMgd2l0aCBWS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTQ4OCIpOworICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMSwgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSU307CisgICAgICAgICAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWdfYmFycmllciA9IGltZ19iYXJyaWVyX3RlbXBsYXRlOworICAgICAgICAgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgdms6OkNtZFdhaXRFdmVudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJmV2ZW50LCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbWdfYmFycmllcik7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSBiYXNlQXJyYXlMYXllciA+PSBpbWFnZS5hcnJheUxheWVycyB3aXRob3V0IFZLX1JFTUFJTklOR19BUlJBWV9MQVlFUlMKKyAgICAgICAgeworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNDg4Iik7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLXN1YnJlc291cmNlUmFuZ2UtMDE3MjUiKTsKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDEsIDEsIDF9OworICAgICAgICAgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIgPSBpbWdfYmFycmllcl90ZW1wbGF0ZTsKKyAgICAgICAgICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UgPSByYW5nZTsKKyAgICAgICAgICAgIHZrOjpDbWRXYWl0RXZlbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgbGF5ZXJDb3VudCA9IDAKKyAgICAgICAgeworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1zdWJyZXNvdXJjZVJhbmdlLTAxNzI1Iik7CisgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAwfTsKKyAgICAgICAgICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltZ19iYXJyaWVyID0gaW1nX2JhcnJpZXJfdGVtcGxhdGU7CisgICAgICAgICAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlID0gcmFuZ2U7CisgICAgICAgICAgICB2azo6Q21kV2FpdEV2ZW50cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltZ19iYXJyaWVyKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ5IGJhc2VBcnJheUxheWVyICsgbGF5ZXJDb3VudCA+IGltYWdlLmFycmF5TGF5ZXJzCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItc3VicmVzb3VyY2VSYW5nZS0wMTcyNSIpOworICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMn07CisgICAgICAgICAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWdfYmFycmllciA9IGltZ19iYXJyaWVyX3RlbXBsYXRlOworICAgICAgICAgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgdms6OkNtZFdhaXRFdmVudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJmV2ZW50LCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbWdfYmFycmllcik7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZrOjpEZXN0cm95RXZlbnQobV9kZXZpY2UtPmhhbmRsZSgpLCBldmVudCwgbnVsbHB0cik7CisgICAgfQorICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorfQorCitURVNUX0YoVmtMYXllclRlc3QsIElkeEJ1ZmZlckFsaWdubWVudEVycm9yKSB7CisgICAgLy8gQmluZCBhIEJlZ2luUmVuZGVyUGFzcyB3aXRoaW4gYW4gYWN0aXZlIFJlbmRlclBhc3MKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICB1aW50MzJfdCBjb25zdCBpbmRpY2VzW10gPSB7MH07CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1Zl9pbmZvID0ge307CisgICAgYnVmX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgYnVmX2luZm8uc2l6ZSA9IDEwMjQ7CisgICAgYnVmX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVDsKKyAgICBidWZfaW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAxOworICAgIGJ1Zl9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSBpbmRpY2VzOworCisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmX2luZm8pOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLAorICAgIC8vIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUuaGFuZGxlKCkpOworICAgIC8vIFNob3VsZCBlcnJvciBiZWZvcmUgY2FsbGluZyB0byBkcml2ZXIgc28gZG9uJ3QgY2FyZSBhYm91dCBhY3R1YWwgZGF0YQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgInZrQ21kQmluZEluZGV4QnVmZmVyKCkgb2Zmc2V0ICgweDcpIGRvZXMgbm90IGZhbGwgb24gIik7CisgICAgdms6OkNtZEJpbmRJbmRleEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIDcsIFZLX0lOREVYX1RZUEVfVUlOVDE2KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBCYWQyREFycmF5SW1hZ2VUeXBlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGFuIGltYWdlIHdpdGggYSBmbGFnIHNwZWNpZnlpbmcgMkRfQVJSQVlfQ09NUEFUSUJMRSBidXQgbm90IG9mIGltYWdlVHlwZSAzRC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBpcyBub3Qgc3VwcG9ydGVkOyBza2lwcGluZ1xuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIC8vIFRyaWdnZXIgY2hlY2sgYnkgc2V0dGluZyBpbWFnZWNyZWF0ZWZsYWdzIHRvIDJkX2FycmF5X2NvbXBhdCBhbmQgaW1hZ2VUeXBlIHRvIDJECisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaWNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9UWVBFXzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMiwgMzIsIDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRH07CisgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaWNpLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMDk1MCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFZlcnRleEJ1ZmZlckludmFsaWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiU3VibWl0IGEgY29tbWFuZCBidWZmZXIgdXNpbmcgZGVsZXRlZCB2ZXJ0ZXggYnVmZmVyLCBkZWxldGUgYSBidWZmZXIgdHdpY2UsIHVzZSBhbiBpbnZhbGlkIG9mZnNldCBmb3IgZWFjaCBidWZmZXIgdHlwZSwgIgorICAgICAgICAiYW5kIGF0dGVtcHQgdG8gYmluZCBhIG51bGwgYnVmZmVyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUucGlwZWxpbmVfKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJDb3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtCdWZmZXIiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtEZXZpY2VNZW1vcnkiKTsKKworICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBiaW5kIGEgdmVydGV4IGJ1ZmZlciBpbiBhIHJlZHVjZWQgc2NvcGUsIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gYmUgZGVsZXRlZCB1cG9uIGxlYXZpbmcgdGhpcyBzY29wZQorICAgICAgICBjb25zdCBmbG9hdCB2Ym9fZGF0YVszXSA9IHsxLmYsIDAuZiwgMS5mfTsKKyAgICAgICAgVmtWZXJ0aWNlc09iaiBkcmF3X3ZlcnRpY2llcyhtX2RldmljZSwgMSwgMSwgc2l6ZW9mKHZib19kYXRhWzBdKSwgc2l6ZW9mKHZib19kYXRhKSAvIHNpemVvZih2Ym9fZGF0YVswXSksIHZib19kYXRhKTsKKyAgICAgICAgZHJhd192ZXJ0aWNpZXMuQmluZFZlcnRleEJ1ZmZlcnMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgICAgIGRyYXdfdmVydGljaWVzLkFkZFZlcnRleElucHV0VG9QaXBlSGVscHIoJnBpcGUpOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICB9CisKKyAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBiaW5kIGEgdmVydGV4IGJ1ZmZlciBpbiBhIHJlZHVjZWQgc2NvcGUsIGFuZCBkZWxldGUgaXQKKyAgICAgICAgLy8gdHdpY2UsIHRoZSBzZWNvbmQgdGhyb3VnaCB0aGUgZGVzdHJ1Y3RvcgorICAgICAgICBWa0J1ZmZlclRlc3QgYnVmZmVyX3Rlc3QobV9kZXZpY2UsIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQsIFZrQnVmZmVyVGVzdDo6ZURvdWJsZURlbGV0ZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtEZXN0cm95QnVmZmVyLWJ1ZmZlci1wYXJhbWV0ZXIiKTsKKyAgICAgICAgYnVmZmVyX3Rlc3QuVGVzdERvdWJsZURlc3Ryb3koKTsKKyAgICB9CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJ2YWx1ZSBvZiBwQ3JlYXRlSW5mby0+dXNhZ2UgbXVzdCBub3QgYmUgMCIpOworICAgIGlmIChWa0J1ZmZlclRlc3Q6OkdldFRlc3RDb25kaXRpb25WYWxpZChtX2RldmljZSwgVmtCdWZmZXJUZXN0OjplSW52YWxpZE1lbW9yeU9mZnNldCkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBiaW5kIGEgbWVtb3J5IGJ1ZmZlciB3aXRoIGFuIGludmFsaWQgb2Zmc2V0LgorICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnlPZmZzZXQtMDEwMzYiKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigKKyAgICAgICAgICAgICJJZiBidWZmZXIgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCBvciBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklULCAiCisgICAgICAgICAgICAibWVtb3J5T2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptaW5UZXhlbEJ1ZmZlck9mZnNldEFsaWdubWVudCIpOworICAgICAgICBWa0J1ZmZlclRlc3QgYnVmZmVyX3Rlc3QobV9kZXZpY2UsIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQsIFZrQnVmZmVyVGVzdDo6ZUludmFsaWRNZW1vcnlPZmZzZXQpOworICAgICAgICAodm9pZClidWZmZXJfdGVzdDsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgeworICAgICAgICAvLyBBdHRlbXB0IHRvIGJpbmQgYSBudWxsIGJ1ZmZlci4KKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQmluZEJ1ZmZlck1lbW9yeTogcmVxdWlyZWQgcGFyYW1ldGVyIGJ1ZmZlciBzcGVjaWZpZWQgYXMgVktfTlVMTF9IQU5ETEUiKTsKKyAgICAgICAgVmtCdWZmZXJUZXN0IGJ1ZmZlcl90ZXN0KG1fZGV2aWNlLCAwLCBWa0J1ZmZlclRlc3Q6OmVCaW5kTnVsbEJ1ZmZlcik7CisgICAgICAgICh2b2lkKWJ1ZmZlcl90ZXN0OworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIEF0dGVtcHQgdG8gYmluZCBhIGZha2UgYnVmZmVyLgorICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1idWZmZXItcGFyYW1ldGVyIik7CisgICAgICAgIFZrQnVmZmVyVGVzdCBidWZmZXJfdGVzdChtX2RldmljZSwgMCwgVmtCdWZmZXJUZXN0OjplQmluZEZha2VCdWZmZXIpOworICAgICAgICAodm9pZClidWZmZXJfdGVzdDsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgeworICAgICAgICAvLyBBdHRlbXB0IHRvIHVzZSBhbiBpbnZhbGlkIGhhbmRsZSB0byBkZWxldGUgYSBidWZmZXIuCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtGcmVlTWVtb3J5LW1lbW9yeS1wYXJhbWV0ZXIiKTsKKyAgICAgICAgVmtCdWZmZXJUZXN0IGJ1ZmZlcl90ZXN0KG1fZGV2aWNlLCBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklULCBWa0J1ZmZlclRlc3Q6OmVGcmVlSW52YWxpZEhhbmRsZSk7CisgICAgICAgICh2b2lkKWJ1ZmZlcl90ZXN0OworICAgIH0KKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBCYWRWZXJ0ZXhCdWZmZXJPZmZzZXQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJTdWJtaXQgYW4gb2Zmc2V0IHBhc3QgdGhlIGVuZCBvZiBhIHZlcnRleCBidWZmZXIiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdmJvX2RhdGFbM10gPSB7MS5mLCAwLmYsIDEuZn07CisgICAgVmtDb25zdGFudEJ1ZmZlck9iaiB2Ym8obV9kZXZpY2UsIHNpemVvZih2Ym9fZGF0YSksIChjb25zdCB2b2lkICopJnZib19kYXRhLCBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCaW5kVmVydGV4QnVmZmVycy1wT2Zmc2V0cy0wMDYyNiIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmluZFZlcnRleEJ1ZmZlcigmdmJvLCAoVmtEZXZpY2VTaXplKSgzICogc2l6ZW9mKGZsb2F0KSksIDEpOyAgLy8gT2Zmc2V0IGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworLy8gSU5WQUxJRF9JTUFHRV9MQVlPVVQgdGVzdHMgKG9uZSBvdGhlciBjYXNlIGlzIGhpdCBieSBNYXBNZW1XaXRob3V0SG9zdFZpc2libGVCaXQgYW5kIG5vdCBoZXJlKQorVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkSW1hZ2VMYXlvdXQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiSGl0IGFsbCBwb3NzaWJsZSB2YWxpZGF0aW9uIGNoZWNrcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRJbWFnZUxheW91dCBlcnJvci4gIgorICAgICAgICAiR2VuZXJhbGx5IHRoZXNlIGludm9sdmUgaGF2aW5nIGltYWdlcyBpbiB0aGUgd3JvbmcgbGF5b3V0IHdoZW4gdGhleSdyZSBjb3BpZWQgb3IgdHJhbnNpdGlvbmVkLiIpOworICAgIC8vIDMgaW4gVmFsaWRhdGVDbWRCdWZJbWFnZUxheW91dHMKKyAgICAvLyAqICAtMSBBdHRlbXB0IHRvIHN1Ym1pdCBjbWQgYnVmIHcvIGRlbGV0ZWQgaW1hZ2UKKyAgICAvLyAqICAtMiBDbWQgYnVmIHN1Ym1pdCBvZiBpbWFnZSB3LyBsYXlvdXQgbm90IG1hdGNoaW5nIGZpcnN0IHVzZSB3LyBzdWJyZXNvdXJjZQorICAgIC8vICogIC0zIENtZCBidWYgc3VibWl0IG9mIGltYWdlIHcvIGxheW91dCBub3QgbWF0Y2hpbmcgZmlyc3QgdXNlIHcvbyBzdWJyZXNvdXJjZQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBhdXRvIGRlcHRoX2Zvcm1hdCA9IEZpbmRTdXBwb3J0ZWREZXB0aFN0ZW5jaWxGb3JtYXQoZ3B1KCkpOworICAgIGlmICghZGVwdGhfZm9ybWF0KSB7CisgICAgICAgIHByaW50ZigiJXMgTm8gRGVwdGggKyBTdGVuY2lsIGZvcm1hdCBmb3VuZC4gU2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBDcmVhdGUgc3JjICYgZHN0IGltYWdlcyB0byB1c2UgZm9yIGNvcHkgb3BlcmF0aW9ucworICAgIFZrSW1hZ2VPYmogc3JjX2ltYWdlKG1fZGV2aWNlKTsKKyAgICBWa0ltYWdlT2JqIGRzdF9pbWFnZShtX2RldmljZSk7CisgICAgVmtJbWFnZU9iaiBkZXB0aF9pbWFnZShtX2RldmljZSk7CisKKyAgICBjb25zdCBWa0Zvcm1hdCB0ZXhfZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGNvbnN0IGludDMyX3QgdGV4X3dpZHRoID0gMzI7CisgICAgY29uc3QgaW50MzJfdCB0ZXhfaGVpZ2h0ID0gMzI7CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gdGV4X2Zvcm1hdDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSB0ZXhfd2lkdGg7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IHRleF9oZWlnaHQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gNDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisKKyAgICBzcmNfaW1hZ2UuaW5pdCgmaW1hZ2VfY3JlYXRlX2luZm8pOworCisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGRzdF9pbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfRDE2X1VOT1JNOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlIHw9IFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ7CisgICAgZGVwdGhfaW1hZ2UuaW5pdCgmaW1hZ2VfY3JlYXRlX2luZm8pOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIFZrSW1hZ2VDb3B5IGNvcHlfcmVnaW9uOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0LnggPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY09mZnNldC55ID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQueiA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQueCA9IDA7CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0LnkgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldC56ID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQud2lkdGggPSAxOworICAgIGNvcHlfcmVnaW9uLmV4dGVudC5oZWlnaHQgPSAxOworICAgIGNvcHlfcmVnaW9uLmV4dGVudC5kZXB0aCA9IDE7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxheW91dCBzaG91bGQgYmUgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMIGluc3RlYWQgb2YgR0VORVJBTC4iKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJsYXlvdXQgc2hvdWxkIGJlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCBpbnN0ZWFkIG9mIEdFTkVSQUwuIik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShzcmNfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBkc3RfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gVGhlIGZpcnN0IGNhbGwgaGl0cyB0aGUgZXhwZWN0ZWQgV0FSTklORyBhbmQgc2tpcHMgdGhlIGNhbGwgZG93biB0aGUgY2hhaW4sIHNvIGNhbGwgYSBzZWNvbmQgdGltZSB0byBjYWxsIGRvd24gY2hhaW4gYW5kCisgICAgLy8gdXBkYXRlIGxheWVyIHN0YXRlCisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigibGF5b3V0IHNob3VsZCBiZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwgaW5zdGVhZCBvZiBHRU5FUkFMLiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoImxheW91dCBzaG91bGQgYmUgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIGluc3RlYWQgb2YgR0VORVJBTC4iKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShzcmNfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBkc3RfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgLy8gTm93IGNhdXNlIGVycm9yIGR1ZSB0byBzcmMgaW1hZ2UgbGF5b3V0IGNoYW5naW5nCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZUxheW91dC0wMDEyOCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoImlzIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgYnV0IGNhbiBvbmx5IGJlIFZLX0lNQUdFX0xBWU9VVCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKHNyY19pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgZHN0X2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIEZpbmFsIHNyYyBlcnJvciBpcyBkdWUgdG8gYmFkIGxheW91dCB0eXBlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZUxheW91dC0wMDEyOSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoCisgICAgICAgICJ3aXRoIHNwZWNpZmljIGxheW91dCBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUgcHJldmlvdXNseSB1c2VkIGxheW91dCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTC4iKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShzcmNfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsIGRzdF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBOb3cgdmVyaWZ5IHNhbWUgY2hlY2tzIGZvciBkc3QKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxheW91dCBzaG91bGQgYmUgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIGluc3RlYWQgb2YgR0VORVJBTC4iKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJsYXlvdXQgc2hvdWxkIGJlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCBpbnN0ZWFkIG9mIEdFTkVSQUwuIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2Uoc3JjX2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZHN0X2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIE5vdyBjYXVzZSBlcnJvciBkdWUgdG8gc3JjIGltYWdlIGxheW91dCBjaGFuZ2luZworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxMzMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKAorICAgICAgICAiaXMgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCBidXQgY2FuIG9ubHkgYmUgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMIG9yIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLiIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKHNyY19pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRzdF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0SW1hZ2VMYXlvdXQtMDAxMzQiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKAorICAgICAgICAid2l0aCBzcGVjaWZpYyBsYXlvdXQgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIHByZXZpb3VzbHkgdXNlZCBsYXlvdXQgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwuIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2Uoc3JjX2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZHN0X2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDb252ZXJ0IGRzdCBhbmQgZGVwdGggaW1hZ2VzIHRvIFRSQU5TRkVSX0RTVCBmb3Igc3Vic2VxdWVudCB0ZXN0cworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIHRyYW5zZmVyX2RzdF9pbWFnZV9iYXJyaWVyWzFdID0ge307CisgICAgdHJhbnNmZXJfZHN0X2ltYWdlX2JhcnJpZXJbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUjsKKyAgICB0cmFuc2Zlcl9kc3RfaW1hZ2VfYmFycmllclswXS5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIHRyYW5zZmVyX2RzdF9pbWFnZV9iYXJyaWVyWzBdLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDsKKyAgICB0cmFuc2Zlcl9kc3RfaW1hZ2VfYmFycmllclswXS5zcmNBY2Nlc3NNYXNrID0gMDsKKyAgICB0cmFuc2Zlcl9kc3RfaW1hZ2VfYmFycmllclswXS5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVDsKKyAgICB0cmFuc2Zlcl9kc3RfaW1hZ2VfYmFycmllclswXS5pbWFnZSA9IGRzdF9pbWFnZS5oYW5kbGUoKTsKKyAgICB0cmFuc2Zlcl9kc3RfaW1hZ2VfYmFycmllclswXS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVyczsKKyAgICB0cmFuc2Zlcl9kc3RfaW1hZ2VfYmFycmllclswXS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHM7CisgICAgdHJhbnNmZXJfZHN0X2ltYWdlX2JhcnJpZXJbMF0uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCAxLCB0cmFuc2Zlcl9kc3RfaW1hZ2VfYmFycmllcik7CisgICAgdHJhbnNmZXJfZHN0X2ltYWdlX2JhcnJpZXJbMF0uaW1hZ2UgPSBkZXB0aF9pbWFnZS5oYW5kbGUoKTsKKyAgICB0cmFuc2Zlcl9kc3RfaW1hZ2VfYmFycmllclswXS5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIDEsIHRyYW5zZmVyX2RzdF9pbWFnZV9iYXJyaWVyKTsKKworICAgIC8vIENhdXNlIGVycm9ycyBkdWUgdG8gY2xlYXJpbmcgd2l0aCBpbnZhbGlkIGltYWdlIGxheW91dHMKKyAgICBWa0NsZWFyQ29sb3JWYWx1ZSBjb2xvcl9jbGVhcl92YWx1ZSA9IHt9OworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIGNsZWFyX3JhbmdlOworICAgIGNsZWFyX3JhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNsZWFyX3JhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgY2xlYXJfcmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNsZWFyX3JhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGNsZWFyX3JhbmdlLmxldmVsQ291bnQgPSAxOworCisgICAgLy8gRmFpbCBkdWUgdG8gZXhwbGljaXRseSBwcm9oaWJpdGVkIGxheW91dCBmb3IgY29sb3IgY2xlYXIgKG9ubHkgR0VORVJBTCBhbmQgVFJBTlNGRVJfRFNUIGFyZSBwZXJtaXR0ZWQpLgorICAgIC8vIFNpbmNlIHRoZSBpbWFnZSBpcyBjdXJyZW50bHkgbm90IGluIFVOREVGSU5FRCBsYXlvdXQsIHRoaXMgd2lsbCBlbWl0IHR3byBlcnJvcnMuCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZUxheW91dC0wMDAwNSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckNvbG9ySW1hZ2UtaW1hZ2VMYXlvdXQtMDAwMDQiKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNsZWFyQ29sb3JJbWFnZShkc3RfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsICZjb2xvcl9jbGVhcl92YWx1ZSwgMSwgJmNsZWFyX3JhbmdlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBGYWlsIGR1ZSB0byBwcm92aWRlZCBsYXlvdXQgbm90IG1hdGNoaW5nIGFjdHVhbCBjdXJyZW50IGxheW91dCBmb3IgY29sb3IgY2xlYXIuCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyQ29sb3JJbWFnZS1pbWFnZUxheW91dC0wMDAwNCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q2xlYXJDb2xvckltYWdlKGRzdF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsICZjb2xvcl9jbGVhcl92YWx1ZSwgMSwgJmNsZWFyX3JhbmdlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSBkZXB0aF9jbGVhcl92YWx1ZSA9IHt9OworICAgIGNsZWFyX3JhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworCisgICAgLy8gRmFpbCBkdWUgdG8gZXhwbGljaXRseSBwcm9oaWJpdGVkIGxheW91dCBmb3IgZGVwdGggY2xlYXIgKG9ubHkgR0VORVJBTCBhbmQgVFJBTlNGRVJfRFNUIGFyZSBwZXJtaXR0ZWQpLgorICAgIC8vIFNpbmNlIHRoZSBpbWFnZSBpcyBjdXJyZW50bHkgbm90IGluIFVOREVGSU5FRCBsYXlvdXQsIHRoaXMgd2lsbCBlbWl0IHR3byBlcnJvcnMuCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UtaW1hZ2VMYXlvdXQtMDAwMTIiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZUxheW91dC0wMDAxMSIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShkZXB0aF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgJmRlcHRoX2NsZWFyX3ZhbHVlLCAxLCAmY2xlYXJfcmFuZ2UpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIEZhaWwgZHVlIHRvIHByb3ZpZGVkIGxheW91dCBub3QgbWF0Y2hpbmcgYWN0dWFsIGN1cnJlbnQgbGF5b3V0IGZvciBkZXB0aCBjbGVhci4KKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZS1pbWFnZUxheW91dC0wMDAxMSIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShkZXB0aF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsICZkZXB0aF9jbGVhcl92YWx1ZSwgMSwgJmNsZWFyX3JhbmdlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIE5vdyBjYXVzZSBlcnJvciBkdWUgdG8gYmFkIGltYWdlIGxheW91dCB0cmFuc2l0aW9uIGluIFBpcGVsaW5lQmFycmllcgorICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltYWdlX2JhcnJpZXJbMV0gPSB7fTsKKyAgICBpbWFnZV9iYXJyaWVyWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI7CisgICAgaW1hZ2VfYmFycmllclswXS5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDsKKyAgICBpbWFnZV9iYXJyaWVyWzBdLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTDsKKyAgICBpbWFnZV9iYXJyaWVyWzBdLmltYWdlID0gc3JjX2ltYWdlLmhhbmRsZSgpOworICAgIGltYWdlX2JhcnJpZXJbMF0uc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnM7CisgICAgaW1hZ2VfYmFycmllclswXS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHM7CisgICAgaW1hZ2VfYmFycmllclswXS5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZU1lbW9yeUJhcnJpZXItb2xkTGF5b3V0LTAxMTk3Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlTWVtb3J5QmFycmllci1vbGRMYXlvdXQtMDEyMTAiKTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCAxLCBpbWFnZV9iYXJyaWVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEZpbmFsbHkgc29tZSBsYXlvdXQgZXJyb3JzIGF0IFJlbmRlclBhc3MgY3JlYXRlIHRpbWUKKyAgICAvLyBKdXN0IGhhY2tpbmcgaW4gc3BlY2lmaWMgc3RhdGUgdG8gZ2V0IHRvIHRoZSBlcnJvcnMgd2Ugd2FudCBzbyBkb24ndCBjb3B5IHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgorICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRhY2ggPSB7fTsKKyAgICAvLyBwZXJmIHdhcm5pbmcgZm9yIEdFTkVSQUwgbGF5b3V0IHcvIG5vbi1EUyBpbnB1dCBhdHRhY2htZW50CisgICAgYXR0YWNoLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7fTsKKyAgICBzdWJwYXNzLmlucHV0QXR0YWNobWVudENvdW50ID0gMTsKKyAgICBzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzID0gJmF0dGFjaDsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7fTsKKyAgICBycGNpLnN1YnBhc3NDb3VudCA9IDE7CisgICAgcnBjaS5wU3VicGFzc2VzID0gJnN1YnBhc3M7CisgICAgcnBjaS5hdHRhY2htZW50Q291bnQgPSAxOworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaF9kZXNjID0ge307CisgICAgYXR0YWNoX2Rlc2MuZm9ybWF0ID0gVktfRk9STUFUX1VOREVGSU5FRDsKKyAgICBhdHRhY2hfZGVzYy5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgcnBjaS5wQXR0YWNobWVudHMgPSAmYXR0YWNoX2Rlc2M7CisgICAgcnBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxheW91dCBmb3IgaW5wdXQgYXR0YWNobWVudCBpcyBHRU5FUkFMIGJ1dCBzaG91bGQgYmUgUkVBRF9PTkxZX09QVElNQUwuIik7CisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBlcnJvciB3LyBub24tZ2VuZXJhbCBsYXlvdXQKKyAgICBhdHRhY2gubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIkxheW91dCBmb3IgaW5wdXQgYXR0YWNobWVudCBpcyBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwgYnV0IGNhbiBvbmx5IGJlIFJFQURfT05MWV9PUFRJTUFMIG9yIEdFTkVSQUwuIik7CisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBzdWJwYXNzLmlucHV0QXR0YWNobWVudENvdW50ID0gMDsKKyAgICBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50ID0gMTsKKyAgICBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzID0gJmF0dGFjaDsKKyAgICBhdHRhY2gubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgLy8gcGVyZiB3YXJuaW5nIGZvciBHRU5FUkFMIGxheW91dCBvbiBjb2xvciBhdHRhY2htZW50CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXlvdXQgZm9yIGNvbG9yIGF0dGFjaG1lbnQgaXMgR0VORVJBTCBidXQgc2hvdWxkIGJlIENPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTC4iKTsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIGVycm9yIHcvIG5vbi1jb2xvciBvcHQgb3IgR0VORVJBTCBsYXlvdXQgZm9yIGNvbG9yIGF0dGFjaG1lbnQKKyAgICBhdHRhY2gubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJMYXlvdXQgZm9yIGNvbG9yIGF0dGFjaG1lbnQgaXMgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMIGJ1dCBjYW4gb25seSBiZSBDT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwgb3IgR0VORVJBTC4iKTsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSAwOworICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSAmYXR0YWNoOworICAgIGF0dGFjaC5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICAvLyBwZXJmIHdhcm5pbmcgZm9yIEdFTkVSQUwgbGF5b3V0IG9uIERTIGF0dGFjaG1lbnQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdFTkVSQUwgbGF5b3V0IGZvciBkZXB0aCBhdHRhY2htZW50IG1heSBub3QgZ2l2ZSBvcHRpbWFsIHBlcmZvcm1hbmNlLiIpOworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIE5VTEwsICZycCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gZXJyb3Igdy8gbm9uLWRzIG9wdCBvciBHRU5FUkFMIGxheW91dCBmb3IgY29sb3IgYXR0YWNobWVudAorICAgIGF0dGFjaC5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5b3V0IGZvciBkZXB0aCBhdHRhY2htZW50IGlzIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCBidXQgY2FuIG9ubHkgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsIERFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgb3IgR0VORVJBTC4iKTsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIEZvciB0aGlzIGVycm9yIHdlIG5lZWQgYSB2YWxpZCByZW5kZXJwYXNzIHNvIGNyZWF0ZSBkZWZhdWx0IG9uZQorICAgIGF0dGFjaC5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDsKKyAgICBhdHRhY2guYXR0YWNobWVudCA9IDA7CisgICAgYXR0YWNoX2Rlc2MuZm9ybWF0ID0gZGVwdGhfZm9ybWF0OworICAgIGF0dGFjaF9kZXNjLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgYXR0YWNoX2Rlc2Muc3RvcmVPcCA9IFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkU7CisgICAgYXR0YWNoX2Rlc2Muc3RlbmNpbExvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkU7CisgICAgYXR0YWNoX2Rlc2Muc3RlbmNpbFN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRTsKKyAgICAvLyBDYW4ndCBkbyBhIENMRUFSIGxvYWQgb24gUkVBRF9PTkxZIGluaXRpYWxMYXlvdXQKKyAgICBhdHRhY2hfZGVzYy5sb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI7CisgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOworICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGludmFsaWQgZmlyc3QgbGF5b3V0IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMIik7CisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkU3RvcmFnZUltYWdlTGF5b3V0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byB1cGRhdGUgYSBTVE9SQUdFX0lNQUdFIGRlc2NyaXB0b3Igdy9vIEdFTkVSQUwgbGF5b3V0LiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGNvbnN0IFZrRm9ybWF0IHRleF9mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgVmtJbWFnZVRpbGluZyB0aWxpbmc7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wZXJ0aWVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoZ3B1KCksIHRleF9mb3JtYXQsICZmb3JtYXRfcHJvcGVydGllcyk7CisgICAgaWYgKGZvcm1hdF9wcm9wZXJ0aWVzLmxpbmVhclRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9CSVQpIHsKKyAgICAgICAgdGlsaW5nID0gVktfSU1BR0VfVElMSU5HX0xJTkVBUjsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdF9wcm9wZXJ0aWVzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklUKSB7CisgICAgICAgIHRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9CSVQ7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLkluaXQoMzIsIDMyLCAxLCB0ZXhfZm9ybWF0LCBWS19JTUFHRV9VU0FHRV9TVE9SQUdFX0JJVCwgdGlsaW5nLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBWa0ltYWdlVmlldyB2aWV3ID0gaW1hZ2UudGFyZ2V0Vmlldyh0ZXhfZm9ybWF0KTsKKworICAgIGRlc2NyaXB0b3Jfc2V0LldyaXRlRGVzY3JpcHRvckltYWdlSW5mbygwLCB2aWV3LCBWS19OVUxMX0hBTkRMRSwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFIHR5cGUgaXMgYmVpbmcgdXBkYXRlZCB3aXRoIGxheW91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMIGJ1dCBhY2NvcmRpbmcgdG8gc3BlYyAiKTsKKyAgICBkZXNjcmlwdG9yX3NldC5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZUltYWdlVmlld0JyZWFrc1BhcmFtZXRlckNvbXBhdGliaWxpdHlSZXF1aXJlbWVudHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQXR0ZW1wdHMgdG8gY3JlYXRlIGFuIEltYWdlIFZpZXcgd2l0aCBhIHZpZXcgdHlwZSB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBpbWFnZSB0eXBlIGl0IGlzIGJlaW5nIGNyZWF0ZWQgZnJvbS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIG1lbVByb3BzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCAmbWVtUHJvcHMpOworCisgICAgLy8gVGVzdCBtaXNtYXRjaCBkZXRlY3Rpb24gZm9yIGltYWdlIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8xRAorICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltZ0luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RZUEVfMUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgMSwgMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEfTsKKyAgICBWa0ltYWdlT2JqIGltYWdlMUQobV9kZXZpY2UpOworICAgIGltYWdlMUQuaW5pdCgmaW1nSW5mbyk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UxRC5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIEluaXRpYWxpemUgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIHdpdGggbWlzbWF0Y2hlZCB2aWV3VHlwZQorICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpdmNpID0ge307CisgICAgaXZjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgaXZjaS5pbWFnZSA9IGltYWdlMUQuaGFuZGxlKCk7CisgICAgaXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworCisgICAgLy8gVGVzdCBmb3IgZXJyb3IgbWVzc2FnZQorICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpdmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgInZrQ3JlYXRlSW1hZ2VWaWV3KCk6IHBDcmVhdGVJbmZvLT52aWV3VHlwZSBWS19JTUFHRV9WSUVXX1RZUEVfMkQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBpbWFnZSIpOworCisgICAgLy8gVGVzdCBtaXNtYXRjaCBkZXRlY3Rpb24gZm9yIGltYWdlIG9mIHR5cGUgVktfSU1BR0VfVFlQRV8yRAorICAgIGltZ0luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCwKKyAgICAgICAgICAgICAgIFZLX0lNQUdFX1RZUEVfMkQsCisgICAgICAgICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgICAgICAgICAgICB7MSwgMSwgMX0sCisgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgNiwKKyAgICAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLAorICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsCisgICAgICAgICAgICAgICBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEfTsKKyAgICBWa0ltYWdlT2JqIGltYWdlMkQobV9kZXZpY2UpOworICAgIGltYWdlMkQuaW5pdCgmaW1nSW5mbyk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UyRC5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIEluaXRpYWxpemUgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIHdpdGggbWlzbWF0Y2hlZCB2aWV3VHlwZQorICAgIGl2Y2kgPSB7fTsKKyAgICBpdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpdmNpLmltYWdlID0gaW1hZ2UyRC5oYW5kbGUoKTsKKyAgICBpdmNpLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzNEOworICAgIGl2Y2kuZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisKKyAgICAvLyBUZXN0IGZvciBlcnJvciBtZXNzYWdlCisgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJml2Y2ksCisgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbWFnZVZpZXcoKTogcENyZWF0ZUluZm8tPnZpZXdUeXBlIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGltYWdlIik7CisKKyAgICAvLyBDaGFuZ2UgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIHRvIGRpZmZlcmVudCBtaXNtYXRjaGVkIHZpZXdUeXBlCisgICAgaXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gNjsKKworICAgIC8vIFRlc3QgZm9yIGVycm9yIG1lc3NhZ2UKKyAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaXZjaSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDAzIik7CisKKyAgICAvLyBUZXN0IG1pc21hdGNoIGRldGVjdGlvbiBmb3IgaW1hZ2Ugb2YgdHlwZSBWS19JTUFHRV9UWVBFXzNECisgICAgaW1nSW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklULAorICAgICAgICAgICAgICAgVktfSU1BR0VfVFlQRV8zRCwKKyAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwKKyAgICAgICAgICAgICAgIHsxLCAxLCAxfSwKKyAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwKKyAgICAgICAgICAgICAgIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUR9OworICAgIFZrSW1hZ2VPYmogaW1hZ2UzRChtX2RldmljZSk7CisgICAgaW1hZ2UzRC5pbml0KCZpbWdJbmZvKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZTNELmluaXRpYWxpemVkKCkpOworCisgICAgLy8gSW5pdGlhbGl6ZSBWa0ltYWdlVmlld0NyZWF0ZUluZm8gd2l0aCBtaXNtYXRjaGVkIHZpZXdUeXBlCisgICAgaXZjaSA9IHt9OworICAgIGl2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGl2Y2kuaW1hZ2UgPSBpbWFnZTNELmhhbmRsZSgpOworICAgIGl2Y2kudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMUQ7CisgICAgaXZjaS5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKworICAgIC8vIFRlc3QgZm9yIGVycm9yIG1lc3NhZ2UKKyAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaXZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZUltYWdlVmlldygpOiBwQ3JlYXRlSW5mby0+dmlld1R5cGUgVktfSU1BR0VfVklFV19UWVBFXzFEIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggaW1hZ2UiKTsKKworICAgIC8vIENoYW5nZSBWa0ltYWdlVmlld0NyZWF0ZUluZm8gdG8gZGlmZmVyZW50IG1pc21hdGNoZWQgdmlld1R5cGUKKyAgICBpdmNpLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworCisgICAgLy8gVGVzdCBmb3IgZXJyb3IgbWVzc2FnZQorICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpdmNpLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDEwMDUiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaXZjaSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YlJlc291cmNlUmFuZ2UtMDEwMjEiKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGUgZGV2aWNlIGNhbiBtYWtlIHRoZSBpbWFnZSByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0IGNhc2UuCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgZm9ybVByb3BzID0ge3swLCAwLCAwfSwgMCwgMCwgMCwgMH07CisgICAgVmtSZXN1bHQgcmVzID0gdms6OkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgICAgICBtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVFlQRV8zRCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULAorICAgICAgICBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUIHwgVktfSU1BR0VfQ1JFQVRFXzJEX0FSUkFZX0NPTVBBVElCTEVfQklUX0tIUiB8IFZLX0lNQUdFX0NSRUFURV9TUEFSU0VfQklORElOR19CSVQsCisgICAgICAgICZmb3JtUHJvcHMpOworCisgICAgLy8gSWYgbm90LCBza2lwIHRoaXMgcGFydCBvZiB0aGUgdGVzdC4KKyAgICBpZiAocmVzIHx8ICFtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKS5zcGFyc2VCaW5kaW5nIHx8CisgICAgICAgICFEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgVmtJbWFnZUNyZWF0ZUluZm8gd2l0aCBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSIGFuZCBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUIHdoaWNoCisgICAgLy8gYXJlIGluY29tcGF0aWJsZSBjcmVhdGUgZmxhZ3MuCisgICAgaW1nSW5mbyA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgICAgIG51bGxwdHIsCisgICAgICAgIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQgfCBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSIHwgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVCwKKyAgICAgICAgVktfSU1BR0VfVFlQRV8zRCwKKyAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLAorICAgICAgICB7MSwgMSwgMX0sCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULAorICAgICAgICBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAwLAorICAgICAgICBudWxscHRyLAorICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEfTsKKyAgICBWa0ltYWdlIGltYWdlU3BhcnNlOworCisgICAgLy8gQ3JlYXRpbmcgYSBzcGFyc2UgaW1hZ2UgbWVhbnMgd2Ugc2hvdWxkIG5vdCBiaW5kIG1lbW9yeSB0byBpdC4KKyAgICByZXMgPSB2azo6Q3JlYXRlSW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCAmaW1nSW5mbywgTlVMTCwgJmltYWdlU3BhcnNlKTsKKyAgICBBU1NFUlRfRkFMU0UocmVzKTsKKworICAgIC8vIEluaXRpYWxpemUgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIHRvIGNyZWF0ZSBhIHZpZXcgdGhhdCB3aWxsIGF0dGVtcHQgdG8gdXRpbGl6ZSBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSLgorICAgIGl2Y2kgPSB7fTsKKyAgICBpdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpdmNpLmltYWdlID0gaW1hZ2VTcGFyc2U7CisgICAgaXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworCisgICAgLy8gVGVzdCBmb3IgZXJyb3IgbWVzc2FnZQorICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpdmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGVuIHRoZSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklULCBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX1JFU0lERU5DWV9CSVQsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0FMSUFTRURfQklUIGZsYWdzIGFyZSBlbmFibGVkLiIpOworCisgICAgLy8gQ2xlYW4gdXAKKyAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2VTcGFyc2UsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZUltYWdlVmlld0Zvcm1hdEZlYXR1cmVNaXNtYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSB2aWV3IHdpdGggYSBmb3JtYXQgdGhhdCBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIGZlYXR1cmVzIGFzIHRoZSBpbWFnZSBmb3JtYXQuIik7CisKKyAgICBpZiAoIUVuYWJsZURldmljZVByb2ZpbGVMYXllcigpKSB7CisgICAgICAgIHByaW50ZigiJXMgRmFpbGVkIHRvIGVuYWJsZSBkZXZpY2UgcHJvZmlsZSBsYXllci5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFBGTl92a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCBmcHZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUID0gbnVsbHB0cjsKKyAgICBQRk5fdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgPSBudWxscHRyOworCisgICAgLy8gTG9hZCByZXF1aXJlZCBmdW5jdGlvbnMKKyAgICBpZiAoIUxvYWREZXZpY2VQcm9maWxlTGF5ZXIoZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCwgZnB2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKSkgeworICAgICAgICBwcmludGYoIiVzIEZhaWxlZCB0byBkZXZpY2UgcHJvZmlsZSBsYXllci5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgdGVzdGVkCisgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ0JpdHMgZmVhdHVyZXNbXSA9IHtWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0JJVCwgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVH07CisgICAgdWludDMyX3QgZmVhdHVyZV9jb3VudCA9IDQ7CisgICAgLy8gTGlzdCBvZiB1c2FnZSBjYXNlcyBmb3IgZWFjaCBmZWF0dXJlIHRlc3QKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyB1c2FnZXNbXSA9IHtWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCwgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQsIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVR9OworICAgIC8vIExpc3Qgb2YgZXJyb3JzIHRoYXQgd2lsbCBiZSB0aHJvd24gaW4gb3JkZXIgb2YgdGVzdHMgcnVuCisgICAgc3RkOjpzdHJpbmcgb3B0aW1hbF9lcnJvcl9jb2Rlc1tdID0geworICAgICAgICAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzQiLAorICAgICAgICAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzUiLAorICAgICAgICAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzYiLAorICAgICAgICAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tdXNhZ2UtMDIyNzciLAorICAgIH07CisKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0UHJvcHM7CisKKyAgICAvLyBGaXJzdCB0aHJlZSB0ZXN0cworICAgIHVpbnQzMl90IGkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAoZmVhdHVyZV9jb3VudCAtIDEpOyBpKyspIHsKKyAgICAgICAgLy8gTW9kaWZ5IGZvcm1hdHMgdG8gaGF2ZSBtaXNtYXRjaGVkIGZlYXR1cmVzCisKKyAgICAgICAgLy8gRm9ybWF0IGZvciBpbWFnZQorICAgICAgICBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQoZ3B1KCksIFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVCwgJmZvcm1hdFByb3BzKTsKKyAgICAgICAgZm9ybWF0UHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzIHw9IGZlYXR1cmVzW2ldOworICAgICAgICBmcHZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKGdwdSgpLCBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQsIGZvcm1hdFByb3BzKTsKKworICAgICAgICBtZW1zZXQoJmZvcm1hdFByb3BzLCAwLCBzaXplb2YoZm9ybWF0UHJvcHMpKTsKKworICAgICAgICAvLyBGb3JtYXQgZm9yIHZpZXcKKyAgICAgICAgZnB2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKGdwdSgpLCBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlQsICZmb3JtYXRQcm9wcyk7CisgICAgICAgIGZvcm1hdFByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyA9IGZlYXR1cmVzWyhpICsgMSkgJSBmZWF0dXJlX2NvdW50XTsKKyAgICAgICAgZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVChncHUoKSwgVktfRk9STUFUX1IzMkczMkIzMkEzMl9TSU5ULCBmb3JtYXRQcm9wcyk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGltYWdlIHdpdGggbW9kaWZpZWQgZm9ybWF0CisgICAgICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltZ0luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RZUEVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCAxLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEfTsKKyAgICAgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgICAgIGltYWdlLmluaXQoJmltZ0luZm8pOworICAgICAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyB3aXRoIG1vZGlmaWVkIGZvcm1hdAorICAgICAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHt9OworICAgICAgICBpdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICAgICAgaXZjaS5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgICAgICBpdmNpLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgICAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVDsKKyAgICAgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgICAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICAgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgICAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgICAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisKKyAgICAgICAgLy8gVGVzdCBmb3IgZXJyb3IgbWVzc2FnZQorICAgICAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaXZjaSwgb3B0aW1hbF9lcnJvcl9jb2Rlc1tpXSk7CisgICAgfQorCisgICAgLy8gVGVzdCBmb3IgVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVC4gIE5lZWRzIHNwZWNpYWwgZm9ybWF0cworCisgICAgLy8gT25seSBydW4gdGhpcyB0ZXN0IGlmIGZvcm1hdCBzdXBwb3J0ZWQKKyAgICBpZiAoIUltYWdlRm9ybWF0SXNTdXBwb3J0ZWQoZ3B1KCksIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpKSB7CisgICAgICAgIHByaW50ZigiJXMgVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5UIGZvcm1hdCBub3Qgc3VwcG9ydGVkIC0gc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBNb2RpZnkgZm9ybWF0cyB0byBoYXZlIG1pc21hdGNoZWQgZmVhdHVyZXMKKworICAgIC8vIEZvcm1hdCBmb3IgaW1hZ2UKKyAgICBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQoZ3B1KCksIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVCwgJmZvcm1hdFByb3BzKTsKKyAgICBmb3JtYXRQcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgfD0gZmVhdHVyZXNbaV07CisgICAgZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVChncHUoKSwgVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5ULCBmb3JtYXRQcm9wcyk7CisKKyAgICBtZW1zZXQoJmZvcm1hdFByb3BzLCAwLCBzaXplb2YoZm9ybWF0UHJvcHMpKTsKKworICAgIC8vIEZvcm1hdCBmb3IgdmlldworICAgIGZwdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVChncHUoKSwgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVCwgJmZvcm1hdFByb3BzKTsKKyAgICBmb3JtYXRQcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgPSBmZWF0dXJlc1soaSArIDEpICUgZmVhdHVyZV9jb3VudF07CisgICAgZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVChncHUoKSwgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVCwgZm9ybWF0UHJvcHMpOworCisgICAgLy8gQ3JlYXRlIGltYWdlIHdpdGggbW9kaWZpZWQgZm9ybWF0CisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1nSW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVFlQRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCAxLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEfTsKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5pbml0KCZpbWdJbmZvKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIEluaXRpYWxpemUgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIHdpdGggbW9kaWZpZWQgZm9ybWF0CisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGl2Y2kgPSB7fTsKKyAgICBpdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpdmNpLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQ7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworCisgICAgLy8gVGVzdCBmb3IgZXJyb3IgbWVzc2FnZQorICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpdmNpLCBvcHRpbWFsX2Vycm9yX2NvZGVzW2ldKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVXNhZ2UgbW9kaWZpY2F0aW9uIHZpYSBhIGNoYWluZWQgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gc3RydWN0Iik7CisKKyAgICBpZiAoIUVuYWJsZURldmljZVByb2ZpbGVMYXllcigpKSB7CisgICAgICAgIHByaW50ZigiJXMgVGVzdCByZXF1aXJlcyBEZXZpY2VQcm9maWxlTGF5ZXIsIHVuYXZhaWxhYmxlIC0gc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmICghRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIFRlc3QgcmVxdWlyZXMgQVBJID49IDEuMSBvciBLSFJfTUFJTlRFTkFOQ0UyIGV4dGVuc2lvbiwgdW5hdmFpbGFibGUgLSBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgUEZOX3ZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUIGZwdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgPSBudWxscHRyOworICAgIFBGTl92a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUIGZwdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCA9IG51bGxwdHI7CisKKyAgICAvLyBMb2FkIHJlcXVpcmVkIGZ1bmN0aW9ucworICAgIGlmICghTG9hZERldmljZVByb2ZpbGVMYXllcihmcHZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhULCBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQpKSB7CisgICAgICAgIHByaW50ZigiJXMgUmVxdWlyZWQgZXh0ZW5zaW9ucyBhcmUgbm90IGF2YWlhYmxlLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdFByb3BzOworCisgICAgLy8gRW5zdXJlIGltYWdlIGZvcm1hdCBjbGFpbXMgc3VwcG9ydCBmb3Igc2FtcGxlZCBhbmQgc3RvcmFnZSwgZXhjbHVkZXMgY29sb3IgYXR0YWNobWVudAorICAgIG1lbXNldCgmZm9ybWF0UHJvcHMsIDAsIHNpemVvZihmb3JtYXRQcm9wcykpOworICAgIGZwdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVChncHUoKSwgVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5ULCAmZm9ybWF0UHJvcHMpOworICAgIGZvcm1hdFByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyB8PSAoVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQgfCBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0JJVCk7CisgICAgZm9ybWF0UHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzID0gZm9ybWF0UHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgflZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGZwdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQoZ3B1KCksIFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVCwgZm9ybWF0UHJvcHMpOworCisgICAgLy8gQ3JlYXRlIGltYWdlIHdpdGggc2FtcGxlZCBhbmQgc3RvcmFnZSB1c2FnZXMKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWdJbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9UWVBFXzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIDEsIDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUIHwgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEfTsKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5pbml0KCZpbWdJbmZvKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIEZvcmNlIHRoZSBpbWFnZXZpZXcgZm9ybWF0IHRvIGV4Y2x1ZGUgc3RvcmFnZSBmZWF0dXJlLCBpbmNsdWRlIGNvbG9yIGF0dGFjaG1lbnQKKyAgICBtZW1zZXQoJmZvcm1hdFByb3BzLCAwLCBzaXplb2YoZm9ybWF0UHJvcHMpKTsKKyAgICBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQoZ3B1KCksIFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVCwgJmZvcm1hdFByb3BzKTsKKyAgICBmb3JtYXRQcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgfD0gVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgZm9ybWF0UHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzID0gKGZvcm1hdFByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIH5WS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0JJVCk7CisgICAgZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVChncHUoKSwgVktfRk9STUFUX1IzMkczMkIzMkEzMl9TSU5ULCBmb3JtYXRQcm9wcyk7CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHt9OworICAgIGl2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGl2Y2kuaW1hZ2UgPSBpbWFnZS5oYW5kbGUoKTsKKyAgICBpdmNpLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgIGl2Y2kuZm9ybWF0ID0gVktfRk9STUFUX1IzMkczMkIzMkEzMl9TSU5UOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisKKyAgICAvLyBJbWFnZVZpZXcgY3JlYXRpb24gc2hvdWxkIGZhaWwgYmVjYXVzZSB2aWV3IGZvcm1hdCBkb2Vzbid0IHN1cHBvcnQgYWxsIHRoZSB1bmRlcmx5aW5nIGltYWdlJ3MgdXNhZ2VzCisgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJml2Y2ksICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby11c2FnZS0wMjI3NSIpOworCisgICAgLy8gQWRkIGEgY2hhaW5lZCBWa0ltYWdlVmlld1VzYWdlQ3JlYXRlSW5mbyB0byBvdmVycmlkZSBvcmlnaW5hbCBpbWFnZSB1c2FnZSBiaXRzLCByZW1vdmluZyBzdG9yYWdlCisgICAgVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8gdXNhZ2VfY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19VU0FHRV9DUkVBVEVfSU5GTywgbnVsbHB0ciwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVR9OworICAgIC8vIExpbmsgdGhlIFZrSW1hZ2VWaWV3VXNhZ2VDcmVhdGVJbmZvIHN0cnVjdCBpbnRvIHRoZSB2aWV3J3MgY3JlYXRlIGluZm8gcE5leHQgY2hhaW4KKyAgICBpdmNpLnBOZXh0ID0gJnVzYWdlX2NpOworCisgICAgLy8gSW1hZ2VWaWV3IHNob3VsZCBub3cgc3VjY2VlZCB3aXRob3V0IGVycm9yCisgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJml2Y2kpOworCisgICAgLy8gVHJ5IGEgemVybyB1c2FnZSBmaWVsZAorICAgIHVzYWdlX2NpLnVzYWdlID0gMDsKKyAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaXZjaSwgIlZVSUQtVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8tdXNhZ2UtcmVxdWlyZWRiaXRtYXNrIik7CisKKyAgICAvLyBUcnkgYW4gaWxsZWdhbCBiaXQgaW4gdXNhZ2UgZmllbGQKKyAgICB1c2FnZV9jaS51c2FnZSA9IDB4MTAwMDAwMDAgfCBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDsKKyAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaXZjaSwgIlZVSUQtVmtJbWFnZVZpZXdVc2FnZUNyZWF0ZUluZm8tdXNhZ2UtcGFyYW1ldGVyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlSW1hZ2VWaWV3Tm9NZW1vcnlCb3VuZFRvSW1hZ2UpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQ3JlYXRlIGFuIGltYWdlIGFuZCB0cnkgdG8gY3JlYXRlIGEgdmlldyB3aXRoIG5vIG1lbW9yeSBiYWNraW5nIHRoZSBpbWFnZQorICAgIFZrSW1hZ2UgaW1hZ2U7CisKKyAgICBjb25zdCBWa0Zvcm1hdCB0ZXhfZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGNvbnN0IGludDMyX3QgdGV4X3dpZHRoID0gMzI7CisgICAgY29uc3QgaW50MzJfdCB0ZXhfaGVpZ2h0ID0gMzI7CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gdGV4X2Zvcm1hdDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSB0ZXhfd2lkdGg7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IHRleF9oZWlnaHQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworCisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmaW1hZ2UpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaW1hZ2Vfdmlld19jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uaW1hZ2UgPSBpbWFnZTsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uZm9ybWF0ID0gdGV4X2Zvcm1hdDsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKworICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIiB1c2VkIHdpdGggbm8gbWVtb3J5IGJvdW5kLiBNZW1vcnkgc2hvdWxkIGJlIGJvdW5kIGJ5IGNhbGxpbmcgdmtCaW5kSW1hZ2VNZW1vcnkoKS4iKTsKKyAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRJbWFnZVZpZXdBc3BlY3QpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYW4gaW1hZ2UgYW5kIHRyeSB0byBjcmVhdGUgYSB2aWV3IHdpdGggYW4gaW52YWxpZCBhc3BlY3RNYXNrIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgY29uc3QgVmtGb3JtYXQgdGV4X2Zvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgdGV4X2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsIFZLX0lNQUdFX1RJTElOR19MSU5FQVIsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLmZvcm1hdCA9IHRleF9mb3JtYXQ7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICAvLyBDYXVzZSBhbiBlcnJvciBieSBzZXR0aW5nIGFuIGludmFsaWQgaW1hZ2UgYXNwZWN0CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUOworCisgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJmltYWdlX3ZpZXdfY3JlYXRlX2luZm8sICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2VBc3BlY3QiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBFeGVyY2lzZUdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgpIHZhbGlkIHVzYWdlcyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0IHN1YnJlc19sYXlvdXQgPSB7fTsKKworICAgIC8vIFZVIDAwNzMyOiBpbWFnZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGlsaW5nIGVxdWFsIHRvIFZLX0lNQUdFX1RJTElOR19MSU5FQVIKKyAgICB7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VUaWxpbmcgdGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7ICAvLyBFUlJPUjogdmlvbGF0ZXMgVlUgMDA3MzIKKyAgICAgICAgVmtJbWFnZU9iaiBpbWcobV9kZXZpY2UpOworICAgICAgICBpbWcuSW5pdE5vTGF5b3V0KDMyLCAzMiwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULCB0aWxpbmcpOworICAgICAgICBBU1NFUlRfVFJVRShpbWcuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlcyA9IHt9OworICAgICAgICBzdWJyZXMuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIHN1YnJlcy5taXBMZXZlbCA9IDA7CisgICAgICAgIHN1YnJlcy5hcnJheUxheWVyID0gMDsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dC1pbWFnZS0wMDk5NiIpOworICAgICAgICB2azo6R2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGltZy5pbWFnZSgpLCAmc3VicmVzLCAmc3VicmVzX2xheW91dCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIFZVIDAwNzMzOiBUaGUgYXNwZWN0TWFzayBtZW1iZXIgb2YgcFN1YnJlc291cmNlIG11c3Qgb25seSBoYXZlIGEgc2luZ2xlIGJpdCBzZXQKKyAgICB7CisgICAgICAgIFZrSW1hZ2VPYmogaW1nKG1fZGV2aWNlKTsKKyAgICAgICAgaW1nLkluaXROb0xheW91dCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltZy5pbml0aWFsaXplZCgpKTsKKworICAgICAgICBWa0ltYWdlU3VicmVzb3VyY2Ugc3VicmVzID0ge307CisgICAgICAgIHN1YnJlcy5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9NRVRBREFUQV9CSVQ7ICAvLyBFUlJPUjogdHJpZ2dlcnMgVlUgMDA3MzMKKyAgICAgICAgc3VicmVzLm1pcExldmVsID0gMDsKKyAgICAgICAgc3VicmVzLmFycmF5TGF5ZXIgPSAwOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWFzcGVjdE1hc2stMDA5OTciKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRJbWFnZUFzcGVjdCIpOworICAgICAgICB2azo6R2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGltZy5pbWFnZSgpLCAmc3VicmVzLCAmc3VicmVzX2xheW91dCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIDAwNzM5IG1pcExldmVsIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBtaXBMZXZlbHMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gdGhlIGltYWdlIHdhcyBjcmVhdGVkCisgICAgeworICAgICAgICBWa0ltYWdlT2JqIGltZyhtX2RldmljZSk7CisgICAgICAgIGltZy5Jbml0Tm9MYXlvdXQoMzIsIDMyLCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQpOworICAgICAgICBBU1NFUlRfVFJVRShpbWcuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlcyA9IHt9OworICAgICAgICBzdWJyZXMuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIHN1YnJlcy5taXBMZXZlbCA9IDE7ICAvLyBFUlJPUjogdHJpZ2dlcnMgVlUgMDA3MzkKKyAgICAgICAgc3VicmVzLmFycmF5TGF5ZXIgPSAwOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LW1pcExldmVsLTAxNzE2Iik7CisgICAgICAgIHZrOjpHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1nLmltYWdlKCksICZzdWJyZXMsICZzdWJyZXNfbGF5b3V0KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gMDA3NDAgYXJyYXlMYXllciBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXJyYXlMYXllcnMgc3BlY2lmaWVkIGluIFZrSW1hZ2VDcmVhdGVJbmZvIHdoZW4gdGhlIGltYWdlIHdhcyBjcmVhdGVkCisgICAgeworICAgICAgICBWa0ltYWdlT2JqIGltZyhtX2RldmljZSk7CisgICAgICAgIGltZy5Jbml0Tm9MYXlvdXQoMzIsIDMyLCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQpOworICAgICAgICBBU1NFUlRfVFJVRShpbWcuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlcyA9IHt9OworICAgICAgICBzdWJyZXMuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIHN1YnJlcy5taXBMZXZlbCA9IDA7CisgICAgICAgIHN1YnJlcy5hcnJheUxheWVyID0gMTsgIC8vIEVSUk9SOiB0cmlnZ2VycyBWVSAwMDc0MAorCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWFycmF5TGF5ZXItMDE3MTciKTsKKyAgICAgICAgdms6OkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBpbWcuaW1hZ2UoKSwgJnN1YnJlcywgJnN1YnJlc19sYXlvdXQpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW1hZ2VMYXllclVuc3VwcG9ydGVkRm9ybWF0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRpbmcgaW1hZ2VzIHdpdGggdW5zdXBwb3J0ZWQgZm9ybWF0cyAiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIENyZWF0ZSBpbWFnZSB3aXRoIHVuc3VwcG9ydGVkIGZvcm1hdCAtIEV4cGVjdCBGT1JNQVRfVU5TVVBQT1JURUQKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDMyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAzMjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworCisgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY3JlYXRlX2luZm8sICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMDk0MyIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZUltYWdlVmlld0Zvcm1hdE1pc21hdGNoVW5yZWxhdGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGFuIGltYWdlIHdpdGggYSBjb2xvciBmb3JtYXQsIHRoZW4gdHJ5IHRvIGNyZWF0ZSBhIGRlcHRoIHZpZXcgb2YgaXQiKTsKKworICAgIGlmICghRW5hYmxlRGV2aWNlUHJvZmlsZUxheWVyKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBGYWlsZWQgdG8gZW5hYmxlIGRldmljZSBwcm9maWxlIGxheWVyLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgLy8gTG9hZCByZXF1aXJlZCBmdW5jdGlvbnMKKyAgICBQRk5fdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCA9CisgICAgICAgIChQRk5fdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUIik7CisgICAgUEZOX3ZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgZnB2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUID0KKyAgICAgICAgKFBGTl92a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKAorICAgICAgICAgICAgaW5zdGFuY2UoKSwgInZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQiKTsKKworICAgIGlmICghKGZwdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQpIHx8ICEoZnB2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKSkgeworICAgICAgICBwcmludGYoIiVzIENhbid0IGZpbmQgZGV2aWNlX3Byb2ZpbGVfYXBpIGZ1bmN0aW9uczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZGVwdGhfZm9ybWF0ID0gRmluZFN1cHBvcnRlZERlcHRoU3RlbmNpbEZvcm1hdChncHUoKSk7CisgICAgaWYgKCFkZXB0aF9mb3JtYXQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBDb3VsZG4ndCBmaW5kIGRlcHRoIHN0ZW5jaWwgaW1hZ2UgZm9ybWF0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdFByb3BzOworCisgICAgZnB2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKGdwdSgpLCBkZXB0aF9mb3JtYXQsICZmb3JtYXRQcm9wcyk7CisgICAgZm9ybWF0UHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzIHw9IFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGZwdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQoZ3B1KCksIGRlcHRoX2Zvcm1hdCwgZm9ybWF0UHJvcHMpOworCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltZ1ZpZXdJbmZvID0ge307CisgICAgaW1nVmlld0luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGltZ1ZpZXdJbmZvLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaW1nVmlld0luZm8udmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgaW1nVmlld0luZm8uZm9ybWF0ID0gZGVwdGhfZm9ybWF0OworICAgIGltZ1ZpZXdJbmZvLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1nVmlld0luZm8uc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGltZ1ZpZXdJbmZvLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgaW1nVmlld0luZm8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKworICAgIC8vIENhbid0IHVzZSBkZXB0aCBmb3JtYXQgZm9yIHZpZXcgaW50byBjb2xvciBpbWFnZSAtIEV4cGVjdCBJTlZBTElEX0ZPUk1BVAorICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpbWdWaWV3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXRzIE1VU1QgYmUgSURFTlRJQ0FMIHVubGVzcyBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVQgQklUIHdhcyBzZXQgb24gaW1hZ2UgY3JlYXRpb24uIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlSW1hZ2VWaWV3Tm9NdXRhYmxlRm9ybWF0Qml0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGFuIGltYWdlIHZpZXcgd2l0aCBhIGRpZmZlcmVudCBmb3JtYXQsIHdoZW4gdGhlIGltYWdlIGRvZXMgbm90IGhhdmUgTVVUQUJMRV9GT1JNQVQgYml0Iik7CisKKyAgICBpZiAoIUVuYWJsZURldmljZVByb2ZpbGVMYXllcigpKSB7CisgICAgICAgIHByaW50ZigiJXMgQ291bGRuJ3QgZW5hYmxlIGRldmljZSBwcm9maWxlIGxheWVyLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgUEZOX3ZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUIGZwdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgPSBudWxscHRyOworICAgIFBGTl92a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUIGZwdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCA9IG51bGxwdHI7CisKKyAgICAvLyBMb2FkIHJlcXVpcmVkIGZ1bmN0aW9ucworICAgIGlmICghTG9hZERldmljZVByb2ZpbGVMYXllcihmcHZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhULCBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQpKSB7CisgICAgICAgIHByaW50ZigiJXMgUmVxdWlyZWQgZXh0ZW5zaW9ucyBhcmUgbm90IHByZXNlbnQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0UHJvcHM7CisKKyAgICBmcHZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQoZ3B1KCksIFZLX0ZPUk1BVF9COEc4UjhBOF9VSU5ULCAmZm9ybWF0UHJvcHMpOworICAgIGZvcm1hdFByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyB8PSBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDsKKyAgICBmcHZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKGdwdSgpLCBWS19GT1JNQVRfQjhHOFI4QThfVUlOVCwgZm9ybWF0UHJvcHMpOworCisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltZ1ZpZXdJbmZvID0ge307CisgICAgaW1nVmlld0luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGltZ1ZpZXdJbmZvLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaW1nVmlld0luZm8udmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgaW1nVmlld0luZm8uZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VJTlQ7CisgICAgaW1nVmlld0luZm8uc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpbWdWaWV3SW5mby5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1nVmlld0luZm8uc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpbWdWaWV3SW5mby5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworCisgICAgLy8gU2FtZSBjb21wYXRpYmlsaXR5IGNsYXNzIGJ1dCBubyBNVVRBQkxFX0ZPUk1BVCBiaXQgLSBFeHBlY3QKKyAgICAvLyBWSUVXX0NSRUFURV9FUlJPUgorICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpbWdWaWV3SW5mbywgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDE5Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlSW1hZ2VWaWV3RGlmZmVyZW50Q2xhc3MpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJQYXNzaW5nIGJhZCBwYXJhbWV0ZXJzIHRvIENyZWF0ZUltYWdlVmlldyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGlmICghKG1fZGV2aWNlLT5mb3JtYXRfcHJvcGVydGllcyhWS19GT1JNQVRfUjhfVUlOVCkub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQpKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgUjhfVUlOVCBhcyBjb2xvciBhdHRhY2htZW50OyBza2lwcGVkIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gbXV0SW1nSW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVFlQRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9SOF9VSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEyOCwgMTI4LCAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUR9OworICAgIFZrSW1hZ2VPYmogbXV0SW1hZ2UobV9kZXZpY2UpOworICAgIG11dEltYWdlLmluaXQoJm11dEltZ0luZm8pOworICAgIEFTU0VSVF9UUlVFKG11dEltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltZ1ZpZXdJbmZvID0ge307CisgICAgaW1nVmlld0luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGltZ1ZpZXdJbmZvLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgIGltZ1ZpZXdJbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWdWaWV3SW5mby5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGltZ1ZpZXdJbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWdWaWV3SW5mby5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGltZ1ZpZXdJbmZvLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgaW1nVmlld0luZm8uaW1hZ2UgPSBtdXRJbWFnZS5oYW5kbGUoKTsKKworICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpbWdWaWV3SW5mbywgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDE4Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgTXVsdGlwbGFuZUluY29tcGF0aWJsZVZpZXdGb3JtYXQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJQb3N0aXZlL25lZ2F0aXZlIHRlc3RzIG9mIG11bHRpcGxhbmUgaW1hZ2V2aWV3IGZvcm1hdCBjb21wYXRpYmlsaXR5Iik7CisKKyAgICAvLyBFbmFibGUgS0hSIG11bHRpcGxhbmUgcmVxJ2QgZXh0ZW5zaW9ucworICAgIGJvb2wgbXBfZXh0ZW5zaW9ucyA9IEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9TUEVDX1ZFUlNJT04pOworICAgIGlmIChtcF9leHRlbnNpb25zKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKG1wX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgdGVzdCByZXF1aXJlcyBLSFIgbXVsdGlwbGFuZSBleHRlbnNpb25zLCBub3QgYXZhaWxhYmxlLiAgU2tpcHBpbmcuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gY2kgPSB7fTsKKyAgICBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGNpLnBOZXh0ID0gTlVMTDsKKyAgICBjaS5mbGFncyA9IFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQ7CisgICAgY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBjaS5mb3JtYXQgPSBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STTsKKyAgICBjaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBjaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgIGNpLmV4dGVudCA9IHsxMjgsIDEyOCwgMX07CisgICAgY2kubWlwTGV2ZWxzID0gMTsKKyAgICBjaS5hcnJheUxheWVycyA9IDE7CisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisKKyAgICAvLyBWZXJpZnkgZm9ybWF0CisgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZmVhdHVyZXMgPSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0JJVDsKKyAgICBib29sIHN1cHBvcnRlZCA9IEltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoaW5zdGFuY2UoKSwgZ3B1KCksIGNpLCBmZWF0dXJlcyk7CisgICAgaWYgKCFzdXBwb3J0ZWQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBNdWx0aXBsYW5lIGltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiAgU2tpcHBpbmcgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrSW1hZ2VPYmogaW1hZ2Vfb2JqKG1fZGV2aWNlKTsKKyAgICBpbWFnZV9vYmouaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKGltYWdlX29iai5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpdmNpID0ge307CisgICAgaXZjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgaXZjaS5pbWFnZSA9IGltYWdlX29iai5pbWFnZSgpOworICAgIGl2Y2kudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgaXZjaS5mb3JtYXQgPSBWS19GT1JNQVRfUjhfU05PUk07ICAvLyBDb21wYXQgaXMgVktfRk9STUFUX1I4X1VOT1JNCisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVDsKKworICAgIC8vIEluY29tcGF0aWJsZSBmb3JtYXQgZXJyb3IKKyAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaXZjaSwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxNTg2Iik7CisKKyAgICAvLyBDb3JyZWN0IGZvcm1hdCBzdWNjZWVkcworICAgIGl2Y2kuZm9ybWF0ID0gVktfRk9STUFUX1I4X1VOT1JNOworICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpdmNpKTsKKworICAgIC8vIFRyeSBhIG11bHRpcGxhbmUgaW1hZ2V2aWV3CisgICAgaXZjaS5mb3JtYXQgPSBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJml2Y2kpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZUltYWdlVmlld0ludmFsaWRTdWJyZXNvdXJjZVJhbmdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUGFzc2luZyBiYWQgaW1hZ2Ugc3VicmFuZ2UgdG8gQ3JlYXRlSW1hZ2VWaWV3Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5jcmVhdGVfaW5mbygpLmFycmF5TGF5ZXJzID09IDEpOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltZ192aWV3X2luZm9fdGVtcGxhdGUgPSB7fTsKKyAgICBpbWdfdmlld19pbmZvX3RlbXBsYXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpbWdfdmlld19pbmZvX3RlbXBsYXRlLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaW1nX3ZpZXdfaW5mb190ZW1wbGF0ZS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTsKKyAgICBpbWdfdmlld19pbmZvX3RlbXBsYXRlLmZvcm1hdCA9IGltYWdlLmZvcm1hdCgpOworICAgIC8vIHN1YnJlc291cmNlUmFuZ2UgdG8gYmUgZmlsbGVkIGxhdGVyIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyB0ZXN0CisgICAgaW1nX3ZpZXdfaW5mb190ZW1wbGF0ZS5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGltZ192aWV3X2luZm9fdGVtcGxhdGUuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGltZ192aWV3X2luZm9fdGVtcGxhdGUuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMDsKKyAgICBpbWdfdmlld19pbmZvX3RlbXBsYXRlLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGltZ192aWV3X2luZm9fdGVtcGxhdGUuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMDsKKworICAgIC8vIFRyeSBiYXNlTWlwTGV2ZWwgPj0gaW1hZ2UubWlwTGV2ZWxzIHdpdGggVktfUkVNQUlOSU5HX01JUF9MRVZFTFMKKyAgICB7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDEsIFZLX1JFTUFJTklOR19NSVBfTEVWRUxTLCAwLCAxfTsKKyAgICAgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltZ192aWV3X2luZm8gPSBpbWdfdmlld19pbmZvX3RlbXBsYXRlOworICAgICAgICBpbWdfdmlld19pbmZvLnN1YnJlc291cmNlUmFuZ2UgPSByYW5nZTsKKyAgICAgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJmltZ192aWV3X2luZm8sICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNDc4Iik7CisgICAgfQorCisgICAgLy8gVHJ5IGJhc2VNaXBMZXZlbCA+PSBpbWFnZS5taXBMZXZlbHMgd2l0aG91dCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUworICAgIHsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMSwgMSwgMCwgMX07CisgICAgICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpbWdfdmlld19pbmZvID0gaW1nX3ZpZXdfaW5mb190ZW1wbGF0ZTsKKyAgICAgICAgaW1nX3ZpZXdfaW5mby5zdWJyZXNvdXJjZVJhbmdlID0gcmFuZ2U7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE3MTgiKTsKKyAgICAgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJmltZ192aWV3X2luZm8sICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNDc4Iik7CisgICAgfQorCisgICAgLy8gVHJ5IGxldmVsQ291bnQgPSAwCisgICAgeworICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAwLCAwLCAxfTsKKyAgICAgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltZ192aWV3X2luZm8gPSBpbWdfdmlld19pbmZvX3RlbXBsYXRlOworICAgICAgICBpbWdfdmlld19pbmZvLnN1YnJlc291cmNlUmFuZ2UgPSByYW5nZTsKKyAgICAgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJmltZ192aWV3X2luZm8sICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNzE4Iik7CisgICAgfQorCisgICAgLy8gVHJ5IGJhc2VNaXBMZXZlbCArIGxldmVsQ291bnQgPiBpbWFnZS5taXBMZXZlbHMKKyAgICB7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDIsIDAsIDF9OworICAgICAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaW1nX3ZpZXdfaW5mbyA9IGltZ192aWV3X2luZm9fdGVtcGxhdGU7CisgICAgICAgIGltZ192aWV3X2luZm8uc3VicmVzb3VyY2VSYW5nZSA9IHJhbmdlOworICAgICAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaW1nX3ZpZXdfaW5mbywgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE3MTgiKTsKKyAgICB9CisKKyAgICAvLyBUaGVzZSB0ZXN0cyByZWx5IG9uIGhhdmluZyB0aGUgTWFpbnRlbmFuY2UxIGV4dGVuc2lvbiBub3QgYmVpbmcgZW5hYmxlZCwgYW5kIGFyZSBpbnZhbGlkIG9uIGFsbCBidXQgdmVyc2lvbiAxLjAKKyAgICBpZiAobV9kZXZpY2UtPnByb3BzLmFwaVZlcnNpb24gPCBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgLy8gVHJ5IGJhc2VBcnJheUxheWVyID49IGltYWdlLmFycmF5TGF5ZXJzIHdpdGggVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAxLCBWS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTfTsKKyAgICAgICAgICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpbWdfdmlld19pbmZvID0gaW1nX3ZpZXdfaW5mb190ZW1wbGF0ZTsKKyAgICAgICAgICAgIGltZ192aWV3X2luZm8uc3VicmVzb3VyY2VSYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJmltZ192aWV3X2luZm8sICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNDgwIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgYmFzZUFycmF5TGF5ZXIgPj0gaW1hZ2UuYXJyYXlMYXllcnMgd2l0aG91dCBWS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDEsIDEsIDF9OworICAgICAgICAgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltZ192aWV3X2luZm8gPSBpbWdfdmlld19pbmZvX3RlbXBsYXRlOworICAgICAgICAgICAgaW1nX3ZpZXdfaW5mby5zdWJyZXNvdXJjZVJhbmdlID0gcmFuZ2U7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE3MTkiKTsKKyAgICAgICAgICAgIENyZWF0ZUltYWdlVmlld1Rlc3QoKnRoaXMsICZpbWdfdmlld19pbmZvLCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8tc3VicmVzb3VyY2VSYW5nZS0wMTQ4MCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ5IGxheWVyQ291bnQgPSAwCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDEsIDAsIDB9OworICAgICAgICAgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltZ192aWV3X2luZm8gPSBpbWdfdmlld19pbmZvX3RlbXBsYXRlOworICAgICAgICAgICAgaW1nX3ZpZXdfaW5mby5zdWJyZXNvdXJjZVJhbmdlID0gcmFuZ2U7CisgICAgICAgICAgICBDcmVhdGVJbWFnZVZpZXdUZXN0KCp0aGlzLCAmaW1nX3ZpZXdfaW5mbywgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLXN1YnJlc291cmNlUmFuZ2UtMDE3MTkiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSBiYXNlQXJyYXlMYXllciArIGxheWVyQ291bnQgPiBpbWFnZS5hcnJheUxheWVycworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAyfTsKKyAgICAgICAgICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpbWdfdmlld19pbmZvID0gaW1nX3ZpZXdfaW5mb190ZW1wbGF0ZTsKKyAgICAgICAgICAgIGltZ192aWV3X2luZm8uc3VicmVzb3VyY2VSYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgQ3JlYXRlSW1hZ2VWaWV3VGVzdCgqdGhpcywgJmltZ192aWV3X2luZm8sICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1zdWJyZXNvdXJjZVJhbmdlLTAxNzE5Iik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlSW1hZ2VNaXNjRXJyb3JzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiTWlzYyBsZWZ0b3ZlciB2YWxpZCB1c2FnZSBlcnJvcnMgaW4gVmtJbWFnZUNyZWF0ZUluZm8gc3RydWN0Iik7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdHVyZXN7fTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCZmZWF0dXJlcykpOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gdG1wX2ltZ19jaSA9IHt9OworICAgIHRtcF9pbWdfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICB0bXBfaW1nX2NpLmZsYWdzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtYWJseSBhbnkgaXMgc3VwcG9ydGVkCisgICAgdG1wX2ltZ19jaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOyAgICAgICAvLyBhbnkgaXMgc3VwcG9ydGVkCisgICAgdG1wX2ltZ19jaS5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07ICAvLyBoYXMgbWFuZGF0b3J5IHN1cHBvcnQgZm9yIGFsbCB1c2FnZXMKKyAgICB0bXBfaW1nX2NpLmV4dGVudCA9IHs2NCwgNjQsIDF9OyAgICAgICAgICAgICAgIC8vIGxpbWl0IGlzIDI1NiBmb3IgM0QsIG9yIDQwOTYKKyAgICB0bXBfaW1nX2NpLm1pcExldmVscyA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBpcyBzdXBwb3J0ZWQKKyAgICB0bXBfaW1nX2NpLmFycmF5TGF5ZXJzID0gMTsgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IGlzIDI1NgorICAgIHRtcF9pbWdfY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsgICAgLy8gbmVlZHMgdG8gYmUgMSBpZiBUSUxJTkdfTElORUFSCisgICAgLy8gaWYgVktfSU1BR0VfVElMSU5HX0xJTkVBUiBpbWFnZVR5cGUgbXVzdCBiZSAyRCwgdXNhZ2UgbXVzdCBiZSBUUkFOU0ZFUiwgYW5kIGxldmVscyBsYXllcnMgc2FtcGxlcnMgYWxsIDEKKyAgICB0bXBfaW1nX2NpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIHRtcF9pbWdfY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOyAgLy8gZGVwZW5kcyBvbiBmb3JtYXQKKyAgICB0bXBfaW1nX2NpLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvIHNhZmVfaW1hZ2VfY2kgPSB0bXBfaW1nX2NpOworCisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoR1BESUZQSGVscGVyKGdwdSgpLCAmc2FmZV9pbWFnZV9jaSkpOworCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQ7CisgICAgICAgIGltYWdlX2NpLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDI7CisgICAgICAgIGltYWdlX2NpLnBRdWV1ZUZhbWlseUluZGljZXMgPSBudWxscHRyOworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2hhcmluZ01vZGUtMDA5NDEiKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NpID0gc2FmZV9pbWFnZV9jaTsKKyAgICAgICAgaW1hZ2VfY2kuc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVDsKKyAgICAgICAgaW1hZ2VfY2kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcXVldWVfZmFtaWx5ID0gMDsKKyAgICAgICAgaW1hZ2VfY2kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9ICZxdWV1ZV9mYW1pbHk7CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NpLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zaGFyaW5nTW9kZS0wMDk0MiIpOworICAgIH0KKworICAgIHsKKyAgICAgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBpbWFnZV9jaS5mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAwOTQzIik7CisgICAgfQorCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLmZsYWdzID0gVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQ7CisgICAgICAgIGltYWdlX2NpLmFycmF5TGF5ZXJzID0gNjsKKyAgICAgICAgaW1hZ2VfY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8xRDsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NTQiKTsKKyAgICAgICAgaW1hZ2VfY2kuZXh0ZW50ID0gezY0LCAxLCAxfTsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAwOTQ5Iik7CisKKyAgICAgICAgaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBpbWFnZV9jaS5mbGFncyA9IFZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklUOworICAgICAgICBpbWFnZV9jaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzNEOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk1NCIpOworICAgICAgICBpbWFnZV9jaS5leHRlbnQgPSB7NCwgNCwgNH07CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NpLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMDk0OSIpOworCisgICAgICAgIGltYWdlX2NpID0gc2FmZV9pbWFnZV9jaTsKKyAgICAgICAgaW1hZ2VfY2kuZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVDsKKyAgICAgICAgaW1hZ2VfY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICAgICAgaW1hZ2VfY2kuZXh0ZW50ID0gezgsIDYsIDF9OworICAgICAgICBpbWFnZV9jaS5hcnJheUxheWVycyA9IDY7CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NpLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NTQiKTsKKworICAgICAgICBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLmZsYWdzID0gVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQ7CisgICAgICAgIGltYWdlX2NpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgICAgIGltYWdlX2NpLmV4dGVudCA9IHs4LCA4LCAxfTsKKyAgICAgICAgaW1hZ2VfY2kuYXJyYXlMYXllcnMgPSA0OworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTU0Iik7CisgICAgfQorCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7ICAvLyBhbHdheXMgaGFzIDQgc2FtcGxlcyBzdXBwb3J0CisgICAgICAgIGltYWdlX2NpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgICAgIGltYWdlX2NpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfM0Q7CisgICAgICAgIGltYWdlX2NpLmV4dGVudCA9IHs0LCA0LCA0fTsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtMDIyNTciKTsKKworICAgICAgICBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7ICAvLyBhbHdheXMgaGFzIDQgc2FtcGxlcyBzdXBwb3J0CisgICAgICAgIGltYWdlX2NpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgICAgIGltYWdlX2NpLmZsYWdzID0gVktfSU1BR0VfQ1JFQVRFX0NVQkVfQ09NUEFUSUJMRV9CSVQ7CisgICAgICAgIGltYWdlX2NpLmFycmF5TGF5ZXJzID0gNjsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXNhbXBsZXMtMDIyNTciKTsKKworICAgICAgICBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7ICAvLyBhbHdheXMgaGFzIDQgc2FtcGxlcyBzdXBwb3J0CisgICAgICAgIGltYWdlX2NpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgICAgIGltYWdlX2NpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVI7CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NpLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1zYW1wbGVzLTAyMjU3Iik7CisKKyAgICAgICAgaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBpbWFnZV9jaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOyAgLy8gYWx3YXlzIGhhcyA0IHNhbXBsZXMgc3VwcG9ydAorICAgICAgICBpbWFnZV9jaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzRfQklUOworICAgICAgICBpbWFnZV9jaS5taXBMZXZlbHMgPSAyOworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2FtcGxlcy0wMjI1NyIpOworICAgIH0KKworICAgIHsKKyAgICAgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBpbWFnZV9jaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgICAgICBpbWFnZV9jaS51c2FnZSB8PSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjMiKTsKKworICAgICAgICBpbWFnZV9jaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TSUVOVF9BVFRBQ0hNRU5UX0JJVDsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTY2Iik7CisKKyAgICAgICAgaW1hZ2VfY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0lFTlRfQVRUQUNITUVOVF9CSVQ7CisgICAgICAgIGltYWdlX2NpLnVzYWdlIHw9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjMiKTsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAwOTY2Iik7CisgICAgfQorCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLmZsYWdzID0gVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9CSU5ESU5HX0JJVDsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAwOTY5Iik7CisgICAgfQorCisgICAgLy8gSW5pdGlhbExheW91dCBub3QgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCBvciBWS19JTUFHRV9MQVlPVVRfUFJFREVGSU5FRAorICAgIHsKKyAgICAgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBpbWFnZV9jaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWluaXRpYWxMYXlvdXQtMDA5OTMiKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlSW1hZ2VNaW5MaW1pdHNWaW9sYXRpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgaW52YWxpZCBpbWFnZSB3aXRoIGludmFsaWQgcGFyYW1ldGVycyB2aW9sYXRpb24gbWluaW11bSBsaW1pdCwgc3VjaCBhcyBiZWluZyB6ZXJvLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrSW1hZ2UgbnVsbF9pbWFnZTsgIC8vIHRocm93YXdheSB0YXJnZXQgZm9yIGFsbCB0aGUgdms6OkNyZWF0ZUltYWdlCisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyB0bXBfaW1nX2NpID0ge307CisgICAgdG1wX2ltZ19jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIHRtcF9pbWdfY2kuZmxhZ3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1hYmx5IGFueSBpcyBzdXBwb3J0ZWQKKyAgICB0bXBfaW1nX2NpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7ICAgICAgIC8vIGFueSBpcyBzdXBwb3J0ZWQKKyAgICB0bXBfaW1nX2NpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsgIC8vIGhhcyBtYW5kYXRvcnkgc3VwcG9ydCBmb3IgYWxsIHVzYWdlcworICAgIHRtcF9pbWdfY2kuZXh0ZW50ID0gezEsIDEsIDF9OyAgICAgICAgICAgICAgICAgLy8gbGltaXQgaXMgMjU2IGZvciAzRCwgb3IgNDA5NgorICAgIHRtcF9pbWdfY2kubWlwTGV2ZWxzID0gMTsgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGlzIHN1cHBvcnRlZAorICAgIHRtcF9pbWdfY2kuYXJyYXlMYXllcnMgPSAxOyAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgaXMgMjU2CisgICAgdG1wX2ltZ19jaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOyAgICAvLyBuZWVkcyB0byBiZSAxIGlmIFRJTElOR19MSU5FQVIKKyAgICAvLyBpZiBWS19JTUFHRV9USUxJTkdfTElORUFSIGltYWdlVHlwZSBtdXN0IGJlIDJELCB1c2FnZSBtdXN0IGJlIFRSQU5TRkVSLCBhbmQgbGV2ZWxzIGxheWVycyBzYW1wbGVycyBhbGwgMQorICAgIHRtcF9pbWdfY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgdG1wX2ltZ19jaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7ICAvLyBkZXBlbmRzIG9uIGZvcm1hdAorICAgIHRtcF9pbWdfY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gc2FmZV9pbWFnZV9jaSA9IHRtcF9pbWdfY2k7CisKKyAgICBlbnVtIERpbWVuc2lvbiB7IGtXaWR0aCA9IDB4MSwga0hlaWdodCA9IDB4Miwga0RlcHRoID0gMHg0IH07CisKKyAgICBmb3IgKHVuZGVybHlpbmdfdHlwZTxEaW1lbnNpb24+Ojp0eXBlIGJhZF9kaW1lbnNpb25zID0gMHgxOyBiYWRfZGltZW5zaW9ucyA8IDB4ODsgKytiYWRfZGltZW5zaW9ucykgeworICAgICAgICBWa0V4dGVudDNEIGV4dGVudCA9IHsxLCAxLCAxfTsKKworICAgICAgICBpZiAoYmFkX2RpbWVuc2lvbnMgJiBrV2lkdGgpIHsKKyAgICAgICAgICAgIGV4dGVudC53aWR0aCA9IDA7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWV4dGVudC0wMDk0NCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhZF9kaW1lbnNpb25zICYga0hlaWdodCkgeworICAgICAgICAgICAgZXh0ZW50LmhlaWdodCA9IDA7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWV4dGVudC0wMDk0NSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhZF9kaW1lbnNpb25zICYga0RlcHRoKSB7CisgICAgICAgICAgICBleHRlbnQuZGVwdGggPSAwOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1leHRlbnQtMDA5NDYiKTsKKyAgICAgICAgfQorCisgICAgICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGJhZF9pbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGJhZF9pbWFnZV9jaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzNEOyAgLy8gaGFzIHRvIGJlIDNEIG90aGVyd2lzZSBpdCBtaWdodCB0cmlnZ2VyIHRoZSBub24tMSBlcnJvciBpbnN0ZWFkCisgICAgICAgIGJhZF9pbWFnZV9jaS5leHRlbnQgPSBleHRlbnQ7CisKKyAgICAgICAgdms6OkNyZWF0ZUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJhZF9pbWFnZV9jaSwgTlVMTCwgJm51bGxfaW1hZ2UpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIHsKKyAgICAgICAgVmtJbWFnZUNyZWF0ZUluZm8gYmFkX2ltYWdlX2NpID0gc2FmZV9pbWFnZV9jaTsKKyAgICAgICAgYmFkX2ltYWdlX2NpLm1pcExldmVscyA9IDA7CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmJhZF9pbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tbWlwTGV2ZWxzLTAwOTQ3Iik7CisgICAgfQorCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBiYWRfaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBiYWRfaW1hZ2VfY2kuYXJyYXlMYXllcnMgPSAwOworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZiYWRfaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWFycmF5TGF5ZXJzLTAwOTQ4Iik7CisgICAgfQorCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBiYWRfaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBiYWRfaW1hZ2VfY2kuZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfQ1VCRV9DT01QQVRJQkxFX0JJVDsKKyAgICAgICAgYmFkX2ltYWdlX2NpLmFycmF5TGF5ZXJzID0gNTsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmYmFkX2ltYWdlX2NpLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NTQiKTsKKworICAgICAgICBiYWRfaW1hZ2VfY2kuYXJyYXlMYXllcnMgPSA2OworICAgICAgICBiYWRfaW1hZ2VfY2kuZXh0ZW50ID0gezY0LCA2MywgMX07CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmJhZF9pbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTU0Iik7CisgICAgfQorCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBiYWRfaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBiYWRfaW1hZ2VfY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8xRDsKKyAgICAgICAgYmFkX2ltYWdlX2NpLmV4dGVudCA9IHs2NCwgMiwgMX07CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmJhZF9pbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTU2Iik7CisKKyAgICAgICAgYmFkX2ltYWdlX2NpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMUQ7CisgICAgICAgIGJhZF9pbWFnZV9jaS5leHRlbnQgPSB7NjQsIDEsIDJ9OworICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZiYWRfaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWltYWdlVHlwZS0wMDk1NiIpOworCisgICAgICAgIGJhZF9pbWFnZV9jaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgICAgICBiYWRfaW1hZ2VfY2kuZXh0ZW50ID0gezY0LCA2NCwgMn07CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmJhZF9pbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTU3Iik7CisKKyAgICAgICAgYmFkX2ltYWdlX2NpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgICAgIGJhZF9pbWFnZV9jaS5mbGFncyA9IFZLX0lNQUdFX0NSRUFURV9DVUJFX0NPTVBBVElCTEVfQklUOworICAgICAgICBiYWRfaW1hZ2VfY2kuYXJyYXlMYXllcnMgPSA2OworICAgICAgICBiYWRfaW1hZ2VfY2kuZXh0ZW50ID0gezY0LCA2NCwgMn07CisgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmJhZF9pbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAwOTU3Iik7CisgICAgfQorCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBiYWRfaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBiYWRfaW1hZ2VfY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8zRDsKKyAgICAgICAgYmFkX2ltYWdlX2NpLmFycmF5TGF5ZXJzID0gMjsKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmYmFkX2ltYWdlX2NpLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1pbWFnZVR5cGUtMDA5NjEiKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlSW1hZ2VNYXhMaW1pdHNWaW9sYXRpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgaW52YWxpZCBpbWFnZSB3aXRoIGludmFsaWQgcGFyYW1ldGVycyBleGNlZWRpbmcgcGh5c2ljYWwgZGV2aWNlIGxpbWl0cy4iKTsKKworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGJvb2wgcHVzaF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yX3N1cHBvcnQgPQorICAgICAgICBJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmIChwdXNoX3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzJfc3VwcG9ydCkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGJvb2wgcHVzaF9mcmFnbWVudF9kZW5zaXR5X3N1cHBvcnQgPSBmYWxzZTsKKworICAgIGlmIChwdXNoX3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzJfc3VwcG9ydCkgeworICAgICAgICBwdXNoX2ZyYWdtZW50X2RlbnNpdHlfc3VwcG9ydCA9IERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgaWYgKHB1c2hfZnJhZ21lbnRfZGVuc2l0eV9zdXBwb3J0KSBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsIG51bGxwdHIsIDApKTsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIHRtcF9pbWdfY2kgPSB7fTsKKyAgICB0bXBfaW1nX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgdG1wX2ltZ19jaS5mbGFncyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWFibHkgYW55IGlzIHN1cHBvcnRlZAorICAgIHRtcF9pbWdfY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsgICAgICAgLy8gYW55IGlzIHN1cHBvcnRlZAorICAgIHRtcF9pbWdfY2kuZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOyAgLy8gaGFzIG1hbmRhdG9yeSBzdXBwb3J0IGZvciBhbGwgdXNhZ2VzCisgICAgdG1wX2ltZ19jaS5leHRlbnQgPSB7MSwgMSwgMX07ICAgICAgICAgICAgICAgICAvLyBsaW1pdCBpcyAyNTYgZm9yIDNELCBvciA0MDk2CisgICAgdG1wX2ltZ19jaS5taXBMZXZlbHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgaXMgc3VwcG9ydGVkCisgICAgdG1wX2ltZ19jaS5hcnJheUxheWVycyA9IDE7ICAgICAgICAgICAgICAgICAgICAvLyBsaW1pdCBpcyAyNTYKKyAgICB0bXBfaW1nX2NpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7ICAgIC8vIG5lZWRzIHRvIGJlIDEgaWYgVElMSU5HX0xJTkVBUgorICAgIC8vIGlmIFZLX0lNQUdFX1RJTElOR19MSU5FQVIgaW1hZ2VUeXBlIG11c3QgYmUgMkQsIHVzYWdlIG11c3QgYmUgVFJBTlNGRVIsIGFuZCBsZXZlbHMgbGF5ZXJzIHNhbXBsZXJzIGFsbCAxCisgICAgdG1wX2ltZ19jaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICB0bXBfaW1nX2NpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsgIC8vIGRlcGVuZHMgb24gZm9ybWF0CisgICAgdG1wX2ltZ19jaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyBzYWZlX2ltYWdlX2NpID0gdG1wX2ltZ19jaTsKKworICAgIEFTU0VSVF9WS19TVUNDRVNTKEdQRElGUEhlbHBlcihncHUoKSwgJnNhZmVfaW1hZ2VfY2kpKTsKKworICAgIGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgJmRldl9saW1pdHMgPSBtX2RldmljZS0+cHJvcHMubGltaXRzOworCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLmV4dGVudCA9IHs4LCA4LCAxfTsKKyAgICAgICAgaW1hZ2VfY2kubWlwTGV2ZWxzID0gNCArIDE7ICAvLyA0ID0gbG9nMig4KSArIDEKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMDk1OCIpOworCisgICAgICAgIGltYWdlX2NpLmV4dGVudCA9IHs4LCAxNSwgMX07CisgICAgICAgIGltYWdlX2NpLm1pcExldmVscyA9IDQgKyAxOyAgLy8gNCA9IGZsb29yKGxvZzIoMTUpKSArIDEKKyAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLW1pcExldmVscy0wMDk1OCIpOworICAgIH0KKworICAgIHsKKyAgICAgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBpbWFnZV9jaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfTElORUFSOworICAgICAgICBpbWFnZV9jaS5leHRlbnQgPSB7NjQsIDY0LCAxfTsKKyAgICAgICAgaW1hZ2VfY2kuZm9ybWF0ID0gRmluZEZvcm1hdExpbmVhcldpdGhvdXRNaXBzKGdwdSgpLCBpbWFnZV9jaSk7CisgICAgICAgIGltYWdlX2NpLm1pcExldmVscyA9IDI7CisKKyAgICAgICAgaWYgKGltYWdlX2NpLmZvcm1hdCAhPSBWS19GT1JNQVRfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tbWlwTGV2ZWxzLTAyMjU1Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzIENhbm5vdCBmaW5kIGEgZm9ybWF0IHRvIHRlc3QgbWF4TWlwTGV2ZWxzIGxpbWl0OyBza2lwcGluZyBwYXJ0IG9mIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NpID0gc2FmZV9pbWFnZV9jaTsKKworICAgICAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyBpbWdfbGltaXRzOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhHUERJRlBIZWxwZXIoZ3B1KCksICZpbWFnZV9jaSwgJmltZ19saW1pdHMpKTsKKworICAgICAgICBpZiAoaW1nX2xpbWl0cy5tYXhBcnJheUxheWVycyAhPSBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBpbWFnZV9jaS5hcnJheUxheWVycyA9IGltZ19saW1pdHMubWF4QXJyYXlMYXllcnMgKyAxOworICAgICAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWFycmF5TGF5ZXJzLTAyMjU2Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOjptYXhBcnJheUxheWVycyBpcyBhbHJlYWR5IFVJTlQzMl9NQVg7IHNraXBwaW5nIHBhcnQgb2YgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICBib29sIGZvdW5kID0gRmluZEZvcm1hdFdpdGhvdXRTYW1wbGVzKGdwdSgpLCBpbWFnZV9jaSk7CisKKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2FtcGxlcy0wMjI1OCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyBDb3VsZCBub3QgZmluZCBhIGZvcm1hdCB3aXRoIHNvbWUgdW5zdXBwb3J0ZWQgc2FtcGxlczsgc2tpcHBpbmcgcGFydCBvZiB0ZXN0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jaSA9IHNhZmVfaW1hZ2VfY2k7CisgICAgICAgIGltYWdlX2NpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7ICAvLyAoYW55IGF0dGFjaG1lbnQgYml0KQorCisgICAgICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGltZ19saW1pdHM7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKEdQRElGUEhlbHBlcihncHUoKSwgJmltYWdlX2NpLCAmaW1nX2xpbWl0cykpOworCisgICAgICAgIGlmIChkZXZfbGltaXRzLm1heEZyYW1lYnVmZmVyV2lkdGggIT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgaW1hZ2VfY2kuZXh0ZW50ID0ge2Rldl9saW1pdHMubWF4RnJhbWVidWZmZXJXaWR0aCArIDEsIDY0LCAxfTsKKyAgICAgICAgICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NpLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby11c2FnZS0wMDk2NCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhGcmFtZWJ1ZmZlcldpZHRoIGlzIGFscmVhZHkgVUlOVDMyX01BWDsgc2tpcHBpbmcgcGFydCBvZiB0ZXN0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRldl9saW1pdHMubWF4RnJhbWVidWZmZXJIZWlnaHQgIT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgaW1hZ2VfY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVDsgIC8vIHRyeSBkaWZmZXJlbnQgb25lIHRvbworICAgICAgICAgICAgaW1hZ2VfY2kuZXh0ZW50ID0gezY0LCBkZXZfbGltaXRzLm1heEZyYW1lYnVmZmVySGVpZ2h0ICsgMSwgMX07CisgICAgICAgICAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jaSwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tdXNhZ2UtMDA5NjUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RnJhbWVidWZmZXJIZWlnaHQgaXMgYWxyZWFkeSBVSU5UMzJfTUFYOyBza2lwcGluZyBwYXJ0IG9mIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIGlmICghcHVzaF9mcmFnbWVudF9kZW5zaXR5X3N1cHBvcnQpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY2kgPSBzYWZlX2ltYWdlX2NpOworICAgICAgICAgICAgaW1hZ2VfY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhUOworICAgICAgICAgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgaW1nX2xpbWl0czsKKyAgICAgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKEdQRElGUEhlbHBlcihncHUoKSwgJmltYWdlX2NpLCAmaW1nX2xpbWl0cykpOworCisgICAgICAgICAgICBpbWFnZV9jaS5leHRlbnQgPSB7ZGV2X2xpbWl0cy5tYXhGcmFtZWJ1ZmZlcldpZHRoICsgMSwgNjQsIDF9OworICAgICAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAyNTU5Iik7CisKKyAgICAgICAgICAgIGltYWdlX2NpLmV4dGVudCA9IHs2NCwgZGV2X2xpbWl0cy5tYXhGcmFtZWJ1ZmZlckhlaWdodCArIDEsIDF9OworICAgICAgICAgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY2ksICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXVzYWdlLTAyNTYwIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgTXVsdGlwbGFuZUltYWdlU2FtcGxlckNvbnZlcnNpb25NaXNtYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJDcmVhdGUgc2FtcGxlciB3aXRoIHljYmNyIGNvbnZlcnNpb24gYW5kIHVzZSB3aXRoIGFuIGltYWdlIGNyZWF0ZWQgd2l0aG91dCB5Y3JjYiBjb252ZXJzaW9uIG9yIGltbXV0YWJsZSBzYW1wbGVyIik7CisKKyAgICAvLyBFbmFibGUgS0hSIG11bHRpcGxhbmUgcmVxJ2QgZXh0ZW5zaW9ucworICAgIGJvb2wgbXBfZXh0ZW5zaW9ucyA9IEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfU1BFQ19WRVJTSU9OKTsKKyAgICBpZiAobXBfZXh0ZW5zaW9ucykgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAobXBfZXh0ZW5zaW9ucykgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyB0ZXN0IHJlcXVpcmVzIEtIUiBtdWx0aXBsYW5lIGV4dGVuc2lvbnMsIG5vdCBhdmFpbGFibGUuICBTa2lwcGluZy5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEVuYWJsZSBZY2JjciBDb252ZXJzaW9uIEZlYXR1cmVzCisgICAgVmtQaHlzaWNhbERldmljZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GZWF0dXJlcyB5Y2Jjcl9mZWF0dXJlcyA9IHt9OworICAgIHljYmNyX2ZlYXR1cmVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUzsKKyAgICB5Y2Jjcl9mZWF0dXJlcy5zYW1wbGVyWWNiY3JDb252ZXJzaW9uID0gVktfVFJVRTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnljYmNyX2ZlYXR1cmVzKSk7CisKKyAgICBQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkZ1bmN0aW9uID0gbnVsbHB0cjsKKyAgICBQRk5fdmtEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbktIUiB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uRnVuY3Rpb24gPSBudWxscHRyOworCisgICAgaWYgKERldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgPj0gVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkZ1bmN0aW9uID0gdms6OkNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb247CisgICAgICAgIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25GdW5jdGlvbiA9IHZrOjpEZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICB9IGVsc2UgeworICAgICAgICB2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GdW5jdGlvbiA9CisgICAgICAgICAgICAoUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIik7CisgICAgICAgIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25GdW5jdGlvbiA9CisgICAgICAgICAgICAoUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5oYW5kbGUoKSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKTsKKyAgICB9CisKKyAgICBpZiAoIXZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkZ1bmN0aW9uIHx8ICF2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uRnVuY3Rpb24pIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgZGV2aWNlIGV4dGVuc2lvbiAlczsgdGVzdCBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RZUEVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMF9VTk9STV9LSFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEyOCwgMTI4LCAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19MSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEfTsKKworICAgIC8vIFZlcmlmeSBmb3JtYXRzCisgICAgYm9vbCBzdXBwb3J0ZWQgPSBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGluc3RhbmNlKCksIGdwdSgpLCBjaSwgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQpOworICAgIGlmICghc3VwcG9ydGVkKSB7CisgICAgICAgIHByaW50ZigiJXMgTXVsdGlwbGFuZSBpbWFnZSBmb3JtYXQgbm90IHN1cHBvcnRlZC4gIFNraXBwaW5nIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgWWNiY3IgY29udmVyc2lvbgorICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8geWNiY3JfY3JlYXRlX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk1fS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1JHQl9JREVOVElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NBTVBMRVJfWUNCQ1JfUkFOR0VfSVRVX0ZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLCBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19DSFJPTUFfTE9DQVRJT05fQ09TSVRFRF9FVkVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZJTFRFUl9ORUFSRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2V9OworICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiBjb252ZXJzaW9uc1syXTsKKyAgICB2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GdW5jdGlvbihtX2RldmljZS0+aGFuZGxlKCksICZ5Y2Jjcl9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmNvbnZlcnNpb25zWzBdKTsKKyAgICB5Y2Jjcl9jcmVhdGVfaW5mby5jb21wb25lbnRzLnIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9aRVJPOyAgLy8gSnVzdCBhbnl0aGluZyBkaWZmZXJlbnQgdGhhbiBhYm92ZQorICAgIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkZ1bmN0aW9uKG1fZGV2aWNlLT5oYW5kbGUoKSwgJnljYmNyX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY29udmVyc2lvbnNbMV0pOworCisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyB5Y2Jjcl9pbmZvID0ge307CisgICAgeWNiY3JfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9JTkZPOworICAgIHljYmNyX2luZm8uY29udmVyc2lvbiA9IGNvbnZlcnNpb25zWzBdOworCisgICAgLy8gQ3JlYXRlIGEgc2FtcGxlciB1c2luZyBjb252ZXJzaW9uCisgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgc2NpLnBOZXh0ID0gJnljYmNyX2luZm87CisgICAgLy8gQ3JlYXRlIHR3byBzYW1wbGVycyB3aXRoIHR3byBkaWZmZXJlbnQgY29udmVyc2lvbnMsIHN1Y2ggdGhhdCBvbmUgd2lsbCBtaXNtYXRjaAorICAgIC8vIEl0IHdpbGwgbWFrZSB0aGUgc2Vjb25kIHNhbXBsZXIgZmFpbCB0byBzZWUgaWYgdGhlIGxvZyBwcmludHMgdGhlIHNlY29uZCBzYW1wbGVyIG9yIHRoZSBmaXJzdCBzYW1wbGVyLgorICAgIFZrU2FtcGxlciBzYW1wbGVyc1syXTsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzY2ksIE5VTEwsICZzYW1wbGVyc1swXSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB5Y2Jjcl9pbmZvLmNvbnZlcnNpb24gPSBjb252ZXJzaW9uc1sxXTsgIC8vIE5lZWQgdHdvIHNhbXBsZXJzIHdpdGggZGlmZmVyZW50IGNvbnZlcnNpb25zCisgICAgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2NpLCBOVUxMLCAmc2FtcGxlcnNbMV0pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBDcmVhdGUgYW4gaW1hZ2Ugd2l0aG91dCBhIFljYmNyIGNvbnZlcnNpb24KKyAgICBWa0ltYWdlT2JqIG1waW1hZ2UobV9kZXZpY2UpOworICAgIG1waW1hZ2UuaW5pdCgmY2kpOworCisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHt9OworICAgIGl2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIHljYmNyX2luZm8uY29udmVyc2lvbiA9IGNvbnZlcnNpb25zWzBdOyAgLy8gTmVlZCB0d28gc2FtcGxlcnMgd2l0aCBkaWZmZXJlbnQgY29udmVyc2lvbnMKKyAgICBpdmNpLnBOZXh0ID0gJnljYmNyX2luZm87CisgICAgaXZjaS5pbWFnZSA9IG1waW1hZ2UuaGFuZGxlKCk7CisgICAgaXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk1fS0hSOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaXZjaSwgbnVsbHB0ciwgJnZpZXcpOworCisgICAgLy8gVXNlIHRoZSBpbWFnZSBhbmQgc2FtcGxlciB0b2dldGhlciBpbiBhIGRlc2NyaXB0b3Igc2V0CisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIDIsIFZLX1NIQURFUl9TVEFHRV9BTEwsIHNhbXBsZXJzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgLy8gVXNlIHRoZSBzYW1lIGltYWdlIHZpZXcgdHdpY2UsIHVzaW5nIHRoZSBzYW1lIHNhbXBsZXIsIHdpdGggdGhlICpzZWNvbmQqIG1pc21hdGNoZWQgd2l0aCB0aGUgKnNlY29uZCogaW1tdXRhYmxlIHNhbXBsZXIKKyAgICBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gaW1hZ2VfaW5mb3NbMl07CisgICAgaW1hZ2VfaW5mb3NbMF0gPSB7fTsKKyAgICBpbWFnZV9pbmZvc1swXS5pbWFnZUxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw7CisgICAgaW1hZ2VfaW5mb3NbMF0uaW1hZ2VWaWV3ID0gdmlldzsKKyAgICBpbWFnZV9pbmZvc1swXS5zYW1wbGVyID0gc2FtcGxlcnNbMF07CisgICAgaW1hZ2VfaW5mb3NbMV0gPSBpbWFnZV9pbmZvc1swXTsKKworICAgIC8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRvciBzZXQgZXhwZWN0aW5nIHRvIGdldCBhbiBlcnJvcgorICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGUgPSB7fTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RTZXQgPSBkZXNjcmlwdG9yX3NldC5zZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0QmluZGluZyA9IDA7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBJbWFnZUluZm8gPSBpbWFnZV9pbmZvczsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDE5NDgiKTsKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBwSW1tdXRhYmxlU2FtcGxlcnMgPSBudWxscHRyIGNhdXNlcyBhbiBlcnJvciAsIFZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDI3MzguCisgICAgLy8gQmVjYXVzZSBpZiBwTmV4dCBjaGFpbnMgYSBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25JbmZvLCB0aGUgc2FtcGxlciBoYXMgdG8gYmUgYSBpbW11dGFibGUgc2FtcGxlci4KKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0XzE5NDcobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXRfMTk0Ny5zZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBJbWFnZUluZm8gPSAmaW1hZ2VfaW5mb3NbMF07CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMjczOCIpOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25GdW5jdGlvbihtX2RldmljZS0+ZGV2aWNlKCksIGNvbnZlcnNpb25zWzBdLCBudWxscHRyKTsKKyAgICB2a0Rlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uRnVuY3Rpb24obV9kZXZpY2UtPmRldmljZSgpLCBjb252ZXJzaW9uc1sxXSwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCB2aWV3LCBOVUxMKTsKKyAgICB2azo6RGVzdHJveVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCBzYW1wbGVyc1swXSwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FtcGxlcnNbMV0sIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIERlcHRoU3RlbmNpbEltYWdlVmlld1dpdGhDb2xvckFzcGVjdEJpdEVycm9yKSB7CisgICAgLy8gQ3JlYXRlIGEgc2luZ2xlIEltYWdlIGRlc2NyaXB0b3IgYW5kIGNhdXNlIGl0IHRvIGZpcnN0IGhpdCBhbiBlcnJvciBkdWUKKyAgICAvLyAgdG8gdXNpbmcgYSBEUyBmb3JtYXQsIHRoZW4gY2F1c2UgaXQgdG8gaGl0IGVycm9yIGR1ZSB0byBDT0xPUl9CSVQgbm90CisgICAgLy8gIHNldCBpbiBhc3BlY3QKKyAgICAvLyBUaGUgaW1hZ2UgZm9ybWF0IGNoZWNrIGNvbWVzIDJuZCBpbiB2YWxpZGF0aW9uIHNvIHdlIHRyaWdnZXIgaXQgZmlyc3QsCisgICAgLy8gIHRoZW4gd2hlbiB3ZSBjYXVzZSBhc3BlY3QgZmFpbCBuZXh0LCBiYWQgZm9ybWF0IGNoZWNrIHdpbGwgYmUgcHJlZW1wdGVkCisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21iaW5hdGlvbiBkZXB0aC9zdGVuY2lsIGltYWdlIGZvcm1hdHMgY2FuIGhhdmUgb25seSB0aGUgIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIGF1dG8gZGVwdGhfZm9ybWF0ID0gRmluZFN1cHBvcnRlZERlcHRoU3RlbmNpbEZvcm1hdChncHUoKSk7CisgICAgaWYgKCFkZXB0aF9mb3JtYXQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBDb3VsZG4ndCBmaW5kIGRlcHRoIHN0ZW5jaWwgZm9ybWF0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtJbWFnZU9iaiBpbWFnZV9iYWQobV9kZXZpY2UpOworICAgIFZrSW1hZ2VPYmogaW1hZ2VfZ29vZChtX2RldmljZSk7CisgICAgLy8gT25lIGJhZCBmb3JtYXQgYW5kIG9uZSBnb29kIGZvcm1hdCBmb3IgQ29sb3IgYXR0YWNobWVudAorICAgIGNvbnN0IFZrRm9ybWF0IHRleF9mb3JtYXRfYmFkID0gZGVwdGhfZm9ybWF0OworICAgIGNvbnN0IFZrRm9ybWF0IHRleF9mb3JtYXRfZ29vZCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBjb25zdCBpbnQzMl90IHRleF93aWR0aCA9IDMyOworICAgIGNvbnN0IGludDMyX3QgdGV4X2hlaWdodCA9IDMyOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IHRleF9mb3JtYXRfYmFkOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IHRleF93aWR0aDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gdGV4X2hlaWdodDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworCisgICAgaW1hZ2VfYmFkLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IHRleF9mb3JtYXRfZ29vZDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUIHwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgaW1hZ2VfZ29vZC5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaW1hZ2Vfdmlld19jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uaW1hZ2UgPSBpbWFnZV9iYWQuaGFuZGxlKCk7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLmZvcm1hdCA9IHRleF9mb3JtYXRfYmFkOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworCisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmltYWdlX3ZpZXdfY3JlYXRlX2luZm8sIE5VTEwsICZ2aWV3KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBFeHRlbnNpb25Ob3RFbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmFsaWRhdGUgdGhhdCB1c2luZyBhbiBBUEkgZnJvbSBhbiB1bmVuYWJsZWQgZXh0ZW5zaW9uIHJldHVybnMgYW4gZXJyb3IiKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIC8vIFJlcXVpcmVkIGV4dGVuc2lvbnMgZXhjZXB0IFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yIC0tIHRvIGNyZWF0ZSB0aGUgbmVlZGVkIGVycm9yCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHtWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FLCBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUV9OworICAgIGZvciAoYXV0byBkZXZfZXh0IDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2X2V4dCkpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2X2V4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBkZXZpY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsIGRldl9leHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIGlnbm9yZSB0aGlzIGVycm9yIHRvIGdldCB0byB0aGUgb25lIHdlJ3JlIHRlc3RpbmcKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJWVUlELXZrQ3JlYXRlRGV2aWNlLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAxMzg3Iik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgLy8gRmluZCBhZGRyZXNzIG9mIGV4dGVuc2lvbiBBUEkKKyAgICBhdXRvIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUiA9CisgICAgICAgIChQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+aGFuZGxlKCksICJ2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKTsKKyAgICBpZiAodmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBWS19LSFJfc2FtcGxlcl95Y2Jjcl9jb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlVOQVNTSUdORUQtR2VuZXJhbFBhcmFtZXRlckVycm9yLUV4dGVuc2lvbk5vdEVuYWJsZWQiKTsKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvIHljYmNyX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfVU5ERUZJTkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ0hST01BX0xPQ0FUSU9OX0NPU0lURURfRVZFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRklMVEVSX05FQVJFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlfTsKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24gY29udmVyc2lvbjsKKyAgICB2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIobV9kZXZpY2UtPmhhbmRsZSgpLCAmeWNiY3JfaW5mbywgbnVsbHB0ciwgJmNvbnZlcnNpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRDcmVhdGVCdWZmZXJTaXplKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byBjcmVhdGUgVmtCdWZmZXIgd2l0aCBzaXplIG9mIHplcm8iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gaW5mbyA9IHt9OworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgIGluZm8uc2l6ZSA9IDA7CisgICAgQ3JlYXRlQnVmZmVyVGVzdCgqdGhpcywgJmluZm8sICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1zaXplLTAwOTEyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRHVwbGljYXRlVmFsaWRQTmV4dFN0cnVjdHVyZXMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYSBwTmV4dCBjaGFpbiBjb250YWluaW5nIHZhbGlkIHN0cnVjdHVyZXMsIGJ1dCB3aXRoIGEgZHVwbGljYXRlIHN0cnVjdHVyZSB0eXBlIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBWS19OVl9kZWRpY2F0ZWRfYWxsb2NhdGlvbiBleHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIC8vIENyZWF0ZSB0d28gcE5leHQgc3RydWN0dXJlcyB3aGljaCBieSB0aGVtc2VsdmVzIHdvdWxkIGJlIHZhbGlkCisgICAgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uQnVmZmVyQ3JlYXRlSW5mb05WIGRlZGljYXRlZF9idWZmZXJfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgZGVkaWNhdGVkX2J1ZmZlcl9jcmVhdGVfaW5mb18yID0ge307CisgICAgZGVkaWNhdGVkX2J1ZmZlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFRElDQVRFRF9BTExPQ0FUSU9OX0JVRkZFUl9DUkVBVEVfSU5GT19OVjsKKyAgICBkZWRpY2F0ZWRfYnVmZmVyX2NyZWF0ZV9pbmZvLnBOZXh0ID0gJmRlZGljYXRlZF9idWZmZXJfY3JlYXRlX2luZm9fMjsKKyAgICBkZWRpY2F0ZWRfYnVmZmVyX2NyZWF0ZV9pbmZvLmRlZGljYXRlZEFsbG9jYXRpb24gPSBWS19UUlVFOworCisgICAgZGVkaWNhdGVkX2J1ZmZlcl9jcmVhdGVfaW5mb18yLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fQlVGRkVSX0NSRUFURV9JTkZPX05WOworICAgIGRlZGljYXRlZF9idWZmZXJfY3JlYXRlX2luZm9fMi5wTmV4dCA9IG51bGxwdHI7CisgICAgZGVkaWNhdGVkX2J1ZmZlcl9jcmVhdGVfaW5mb18yLmRlZGljYXRlZEFsbG9jYXRpb24gPSBWS19UUlVFOworCisgICAgdWludDMyX3QgcXVldWVfZmFtaWx5X2luZGV4ID0gMDsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge307CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5wTmV4dCA9ICZkZWRpY2F0ZWRfYnVmZmVyX2NyZWF0ZV9pbmZvOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gMTAyNDsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAxOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnF1ZXVlX2ZhbWlseV9pbmRleDsKKworICAgIENyZWF0ZUJ1ZmZlclRlc3QoKnRoaXMsICZidWZmZXJfY3JlYXRlX2luZm8sICJjaGFpbiBjb250YWlucyBkdXBsaWNhdGUgc3RydWN0dXJlIHR5cGVzIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRGVkaWNhdGVkQWxsb2NhdGlvbikgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfREVESUNBVEVEX0FMTE9DQVRJT05fRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERlZGljYXRlZCBhbGxvY2F0aW9uIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbV9mbGFncyA9IDA7CisgICAgY29uc3QgVmtEZXZpY2VTaXplIHJlc291cmNlX3NpemUgPSAxMDI0OworICAgIGF1dG8gYnVmZmVyX2luZm8gPSBWa0J1ZmZlck9iajo6Y3JlYXRlX2luZm8ocmVzb3VyY2Vfc2l6ZSwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQpOworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBidWZmZXIuaW5pdF9ub19tZW0oKm1fZGV2aWNlLCBidWZmZXJfaW5mbyk7CisgICAgYXV0byBidWZmZXJfYWxsb2NfaW5mbyA9IHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeTo6Z2V0X3Jlc291cmNlX2FsbG9jX2luZm8oKm1fZGV2aWNlLCBidWZmZXIubWVtb3J5X3JlcXVpcmVtZW50cygpLCBtZW1fZmxhZ3MpOworICAgIGF1dG8gYnVmZmVyX2RlZGljYXRlZF9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvS0hSPigpOworICAgIGJ1ZmZlcl9kZWRpY2F0ZWRfaW5mby5idWZmZXIgPSBidWZmZXIuaGFuZGxlKCk7CisgICAgYnVmZmVyX2FsbG9jX2luZm8ucE5leHQgPSAmYnVmZmVyX2RlZGljYXRlZF9pbmZvOworICAgIHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeSBkZWRpY2F0ZWRfYnVmZmVyX21lbW9yeTsKKyAgICBkZWRpY2F0ZWRfYnVmZmVyX21lbW9yeS5pbml0KCptX2RldmljZSwgYnVmZmVyX2FsbG9jX2luZm8pOworCisgICAgVmtCdWZmZXJPYmogd3JvbmdfYnVmZmVyOworICAgIHdyb25nX2J1ZmZlci5pbml0X25vX21lbSgqbV9kZXZpY2UsIGJ1ZmZlcl9pbmZvKTsKKworICAgIC8vIEJpbmQgd2l0aCB3cm9uZyBidWZmZXIKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEJ1ZmZlck1lbW9yeS1tZW1vcnktMDE1MDgiKTsKKyAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+aGFuZGxlKCksIHdyb25nX2J1ZmZlci5oYW5kbGUoKSwgZGVkaWNhdGVkX2J1ZmZlcl9tZW1vcnkuaGFuZGxlKCksIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQmluZCB3aXRoIG5vbi16ZXJvIG9mZnNldCAoc2FtZSBWVUlEKQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LW1lbW9yeS0wMTUwOCIpOyAgLy8gb2Zmc2V0IG11c3QgYmUgemVybworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtCaW5kQnVmZmVyTWVtb3J5LXNpemUtMDEwMzciKTsgIC8vIG9mZnNldCBwdXNoZXMgdXMgcGFzdCBzaXplCisgICAgYXV0byBvZmZzZXQgPSBidWZmZXIubWVtb3J5X3JlcXVpcmVtZW50cygpLmFsaWdubWVudDsKKyAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+aGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgZGVkaWNhdGVkX2J1ZmZlcl9tZW1vcnkuaGFuZGxlKCksIG9mZnNldCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBCaW5kIGNvcnJlY3RseSAoZGVwZW5kcyBvbiB0aGUgInNraXAiIGFib3ZlKQorICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OkJpbmRCdWZmZXJNZW1vcnkobV9kZXZpY2UtPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIGRlZGljYXRlZF9idWZmZXJfbWVtb3J5LmhhbmRsZSgpLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIEFuZCBmb3IgaW1hZ2VzLi4uCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgVmtJbWFnZU9iaiB3cm9uZ19pbWFnZShtX2RldmljZSk7CisgICAgYXV0byBpbWFnZV9pbmZvID0gVmtJbWFnZU9iajo6Y3JlYXRlX2luZm8oKTsKKyAgICBpbWFnZV9pbmZvLmV4dGVudC53aWR0aCA9IHJlc291cmNlX3NpemU7CisgICAgaW1hZ2VfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgaW1hZ2VfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgaW1hZ2UuaW5pdF9ub19tZW0oKm1fZGV2aWNlLCBpbWFnZV9pbmZvKTsKKyAgICB3cm9uZ19pbWFnZS5pbml0X25vX21lbSgqbV9kZXZpY2UsIGltYWdlX2luZm8pOworCisgICAgYXV0byBpbWFnZV9kZWRpY2F0ZWRfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb0tIUj4oKTsKKyAgICBpbWFnZV9kZWRpY2F0ZWRfaW5mby5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgIGF1dG8gaW1hZ2VfYWxsb2NfaW5mbyA9IHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeTo6Z2V0X3Jlc291cmNlX2FsbG9jX2luZm8oKm1fZGV2aWNlLCBpbWFnZS5tZW1vcnlfcmVxdWlyZW1lbnRzKCksIG1lbV9mbGFncyk7CisgICAgaW1hZ2VfYWxsb2NfaW5mby5wTmV4dCA9ICZpbWFnZV9kZWRpY2F0ZWRfaW5mbzsKKyAgICB2a190ZXN0aW5nOjpEZXZpY2VNZW1vcnkgZGVkaWNhdGVkX2ltYWdlX21lbW9yeTsKKyAgICBkZWRpY2F0ZWRfaW1hZ2VfbWVtb3J5LmluaXQoKm1fZGV2aWNlLCBpbWFnZV9hbGxvY19pbmZvKTsKKworICAgIC8vIEJpbmQgd2l0aCB3cm9uZyBpbWFnZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktbWVtb3J5LTAxNTA5Iik7CisgICAgdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+aGFuZGxlKCksIHdyb25nX2ltYWdlLmhhbmRsZSgpLCBkZWRpY2F0ZWRfaW1hZ2VfbWVtb3J5LmhhbmRsZSgpLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEJpbmQgd2l0aCBub24temVybyBvZmZzZXQgKHNhbWUgVlVJRCkKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS0wMTUwOSIpOyAgLy8gb2Zmc2V0IG11c3QgYmUgemVybworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtCaW5kSW1hZ2VNZW1vcnktc2l6ZS0wMTA0OSIpOyAgLy8gb2Zmc2V0IHB1c2hlcyB1cyBwYXN0IHNpemUKKyAgICBhdXRvIGltYWdlX29mZnNldCA9IGltYWdlLm1lbW9yeV9yZXF1aXJlbWVudHMoKS5hbGlnbm1lbnQ7CisgICAgdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+aGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBkZWRpY2F0ZWRfaW1hZ2VfbWVtb3J5LmhhbmRsZSgpLCBpbWFnZV9vZmZzZXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQmluZCBjb3JyZWN0bHkgKGRlcGVuZHMgb24gdGhlICJza2lwIiBhYm92ZSkKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpCaW5kSW1hZ2VNZW1vcnkobV9kZXZpY2UtPmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgZGVkaWNhdGVkX2ltYWdlX21lbW9yeS5oYW5kbGUoKSwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmcpIHsKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfREVESUNBVEVEX0FMTE9DQVRJT05fRVhURU5TSU9OX05BTUUpICYmCisgICAgICAgIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfTlZfREVESUNBVEVEX0FMTE9DQVRJT05fSU1BR0VfQUxJQVNJTkdfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0RFRElDQVRFRF9BTExPQ0FUSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9JTUFHRV9BTElBU0lOR19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGVkaWNhdGVkIGFsbG9jYXRpb24gZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgYXV0byBhbGlhc2luZ19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmdGZWF0dXJlc05WPigpOworICAgIGF1dG8gZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KCZhbGlhc2luZ19mZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisgICAgYWxpYXNpbmdfZmVhdHVyZXMuZGVkaWNhdGVkQWxsb2NhdGlvbkltYWdlQWxpYXNpbmcgPSBWS19UUlVFOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZmZWF0dXJlczIpKTsKKworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fZmxhZ3MgPSAwOworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSByZXNvdXJjZV9zaXplID0gMTAyNDsKKworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIFZrSW1hZ2VPYmogaWRlbnRpY2FsX2ltYWdlKG1fZGV2aWNlKTsKKyAgICBhdXRvIGltYWdlX2luZm8gPSBWa0ltYWdlT2JqOjpjcmVhdGVfaW5mbygpOworICAgIGltYWdlX2luZm8uZXh0ZW50LndpZHRoID0gcmVzb3VyY2Vfc2l6ZTsKKyAgICBpbWFnZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBpbWFnZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbWFnZS5pbml0X25vX21lbSgqbV9kZXZpY2UsIGltYWdlX2luZm8pOworICAgIGlkZW50aWNhbF9pbWFnZS5pbml0X25vX21lbSgqbV9kZXZpY2UsIGltYWdlX2luZm8pOworCisgICAgYXV0byBpbWFnZV9kZWRpY2F0ZWRfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa01lbW9yeURlZGljYXRlZEFsbG9jYXRlSW5mb0tIUj4oKTsKKyAgICBpbWFnZV9kZWRpY2F0ZWRfaW5mby5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgIGF1dG8gaW1hZ2VfYWxsb2NfaW5mbyA9IHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeTo6Z2V0X3Jlc291cmNlX2FsbG9jX2luZm8oKm1fZGV2aWNlLCBpbWFnZS5tZW1vcnlfcmVxdWlyZW1lbnRzKCksIG1lbV9mbGFncyk7CisgICAgaW1hZ2VfYWxsb2NfaW5mby5wTmV4dCA9ICZpbWFnZV9kZWRpY2F0ZWRfaW5mbzsKKyAgICB2a190ZXN0aW5nOjpEZXZpY2VNZW1vcnkgZGVkaWNhdGVkX2ltYWdlX21lbW9yeTsKKyAgICBkZWRpY2F0ZWRfaW1hZ2VfbWVtb3J5LmluaXQoKm1fZGV2aWNlLCBpbWFnZV9hbGxvY19pbmZvKTsKKworICAgIC8vIEJpbmQgd2l0aCBkaWZmZXJlbnQgYnV0IGlkZW50aWNhbCBpbWFnZQorICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+aGFuZGxlKCksIGlkZW50aWNhbF9pbWFnZS5oYW5kbGUoKSwgZGVkaWNhdGVkX2ltYWdlX21lbW9yeS5oYW5kbGUoKSwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBWa0ltYWdlT2JqIHNtYWxsZXJfaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlX2luZm8gPSBWa0ltYWdlT2JqOjpjcmVhdGVfaW5mbygpOworICAgIGltYWdlX2luZm8uZXh0ZW50LndpZHRoID0gcmVzb3VyY2Vfc2l6ZSAtIDE7CisgICAgaW1hZ2VfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgaW1hZ2VfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgc21hbGxlcl9pbWFnZS5pbml0X25vX21lbSgqbV9kZXZpY2UsIGltYWdlX2luZm8pOworCisgICAgLy8gQmluZCB3aXRoIGEgc21hbGxlciBpbWFnZQorICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+aGFuZGxlKCksIHNtYWxsZXJfaW1hZ2UuaGFuZGxlKCksIGRlZGljYXRlZF9pbWFnZV9tZW1vcnkuaGFuZGxlKCksIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgVmtJbWFnZU9iaiBsYXJnZXJfaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlX2luZm8gPSBWa0ltYWdlT2JqOjpjcmVhdGVfaW5mbygpOworICAgIGltYWdlX2luZm8uZXh0ZW50LndpZHRoID0gcmVzb3VyY2Vfc2l6ZSArIDE7CisgICAgaW1hZ2VfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgaW1hZ2VfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgbGFyZ2VyX2ltYWdlLmluaXRfbm9fbWVtKCptX2RldmljZSwgaW1hZ2VfaW5mbyk7CisKKyAgICAvLyBCaW5kIHdpdGggYSBsYXJnZXIgaW1hZ2UgKG5vdCBzdXBwb3J0ZWQsIGFuZCBub3QgZW5vdWdoIG1lbW9yeSkKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEltYWdlTWVtb3J5LW1lbW9yeS0wMjYyOSIpOworICAgIGlmIChsYXJnZXJfaW1hZ2UubWVtb3J5X3JlcXVpcmVtZW50cygpLnNpemUgPiBpbWFnZS5tZW1vcnlfcmVxdWlyZW1lbnRzKCkuc2l6ZSkgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQmluZEltYWdlTWVtb3J5LXNpemUtMDEwNDkiKTsKKyAgICB9CisgICAgdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+aGFuZGxlKCksIGxhcmdlcl9pbWFnZS5oYW5kbGUoKSwgZGVkaWNhdGVkX2ltYWdlX21lbW9yeS5oYW5kbGUoKSwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBCaW5kIHdpdGggbm9uLXplcm8gb2Zmc2V0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0JpbmRJbWFnZU1lbW9yeS1tZW1vcnktMDI2MjkiKTsgIC8vIG9mZnNldCBtdXN0IGJlIHplcm8KKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQmluZEltYWdlTWVtb3J5LXNpemUtMDEwNDkiKTsgIC8vIG9mZnNldCBwdXNoZXMgdXMgcGFzdCBzaXplCisgICAgYXV0byBpbWFnZV9vZmZzZXQgPSBpbWFnZS5tZW1vcnlfcmVxdWlyZW1lbnRzKCkuYWxpZ25tZW50OworICAgIHZrOjpCaW5kSW1hZ2VNZW1vcnkobV9kZXZpY2UtPmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgZGVkaWNhdGVkX2ltYWdlX21lbW9yeS5oYW5kbGUoKSwgaW1hZ2Vfb2Zmc2V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEJpbmQgY29ycmVjdGx5IChkZXBlbmRzIG9uIHRoZSAic2tpcCIgYWJvdmUpCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6QmluZEltYWdlTWVtb3J5KG1fZGV2aWNlLT5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIGRlZGljYXRlZF9pbWFnZV9tZW1vcnkuaGFuZGxlKCksIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvcm5lclNhbXBsZWRJbWFnZU5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBWS19OVl9jb3JuZXJfc2FtcGxlZF9pbWFnZS4iKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBzdGQ6OmFycmF5PGNvbnN0IGNoYXIgKiwgMT4gcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMgPSB7e1ZLX05WX0NPUk5FUl9TQU1QTEVEX0lNQUdFX0VYVEVOU0lPTl9OQU1FfX07CisgICAgZm9yIChhdXRvIGRldmljZV9leHRlbnNpb24gOiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucykgeworICAgICAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBkZXZpY2VfZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGRldmljZSB0aGF0IGVuYWJsZXMgZXhjbHVzaXZlIHNjaXNzb3IgYnV0IGRpc2FibGVzIG11bHRpVmlld3BvcnQKKyAgICBhdXRvIGNvcm5lcl9zYW1wbGVkX2ltYWdlX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VDb3JuZXJTYW1wbGVkSW1hZ2VGZWF0dXJlc05WPigpOworICAgIGF1dG8gZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KCZjb3JuZXJfc2FtcGxlZF9pbWFnZV9mZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMikpOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzFEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSAyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID0gMDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfQ09STkVSX1NBTVBMRURfQklUX05WOworCisgICAgLy8gaW1hZ2UgdHlwZSBtdXN0IGJlIDJEIG9yIDNECisgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY3JlYXRlX2luZm8sICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMDUwIik7CisKKyAgICAvLyBjdWJlL2RlcHRoIG5vdCBzdXBwb3J0ZWQKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDsKKyAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZmxhZ3MtMDIwNTEiKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKworICAgIC8vIDJEIHdpZHRoL2hlaWdodCBtdXN0IGJlID4gMQorICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDE7CisgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY3JlYXRlX2luZm8sICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZsYWdzLTAyMDUyIik7CisKKyAgICAvLyAzRCB3aWR0aC9oZWlnaHQvZGVwdGggbXVzdCBiZSA+IDEKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzNEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAyOworICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NyZWF0ZV9pbmZvLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1mbGFncy0wMjA1MyIpOworCisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKworICAgIC8vIFZhbGlkICMgb2YgbWlwIGxldmVscworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudCA9IHs3LCA3LCAxfTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAzOyAgLy8gMyA9IGNlaWwobG9nMig3KSkKKyAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQgPSB7OCwgOCwgMX07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMzsgIC8vIDMgPSBjZWlsKGxvZzIoOCkpCisgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY3JlYXRlX2luZm8pOworCisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50ID0gezksIDksIDF9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDM7ICAvLyA0ID0gY2VpbChsb2cyKDkpKQorICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NyZWF0ZV9pbmZvKTsKKworICAgIC8vIEludmFsaWQgIyBvZiBtaXAgbGV2ZWxzCisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50ID0gezgsIDgsIDF9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDQ7ICAvLyAzID0gY2VpbChsb2cyKDgpKQorICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NyZWF0ZV9pbmZvLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1taXBMZXZlbHMtMDA5NTgiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVZQ2JDclNhbXBsZXIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWZXJpZnkgWUNiQ3Igc2FtcGxlciBjcmVhdGlvbi4iKTsKKworICAgIC8vIFRlc3QgcmVxdWlyZXMgQVBJIDEuMSBvciAoQVBJIDEuMCArIFNhbXBsZXJZQ2JDciBleHRlbnNpb24pLiBSZXF1ZXN0IEFQSSAxLjEKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICAvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgQVBJIDEuMSssIHRyeSBlbmFibGluZyB0aGUgZXh0ZW5zaW9uIGRpcmVjdGx5IChhbmQgaXQncyBkZXBlbmRlbmNpZXMpCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBWa0RldmljZSBkZXYgPSBtX2RldmljZS0+ZGV2aWNlKCk7CisKKyAgICBQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkZ1bmN0aW9uID0gbnVsbHB0cjsKKyAgICBpZiAoRGV2aWNlVmFsaWRhdGlvblZlcnNpb24oKSA+PSBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uRnVuY3Rpb24gPSB2azo6Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbjsKKyAgICB9IGVsc2UgeworICAgICAgICB2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GdW5jdGlvbiA9CisgICAgICAgICAgICAoUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIik7CisgICAgfQorCisgICAgaWYgKCF2a0NyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb25GdW5jdGlvbikgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBkZXZpY2Ugc3VwcG9ydCBmb3IgWWNiY3JTYW1wbGVyQ29udmVyc2lvbjsgdGVzdCBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmVyaWZ5IHdlIGhhdmUgdGhlIHJlcXVlc3RlZCBzdXBwb3J0CisgICAgYm9vbCB5Y2Jjcl9zdXBwb3J0ID0gKERldmljZUV4dGVuc2lvbkVuYWJsZWQoVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgPj0gVktfQVBJX1ZFUlNJT05fMV8xKSk7CisgICAgaWYgKCF5Y2Jjcl9zdXBwb3J0KSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGRldmljZSBleHRlbnNpb24gJXM7IHRlc3Qgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JfY29udiA9IFZLX05VTExfSEFORExFOworICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gc3ljY2kgPSB7fTsKKyAgICBzeWNjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTzsKKyAgICBzeWNjaS5mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgIHN5Y2NpLnljYmNyTW9kZWwgPSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZOworICAgIHN5Y2NpLnljYmNyUmFuZ2UgPSBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC0wMTY0OSIpOworICAgIHZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbkZ1bmN0aW9uKGRldiwgJnN5Y2NpLCBOVUxMLCAmeWNiY3JfY29udik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQnVmZmVyRGV2aWNlQWRkcmVzc0VYVCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgVktfRVhUX2J1ZmZlcl9kZXZpY2VfYWRkcmVzcy4iKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBzdGQ6OmFycmF5PGNvbnN0IGNoYXIgKiwgMT4gcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMgPSB7e1ZLX0VYVF9CVUZGRVJfREVWSUNFX0FERFJFU1NfRVhURU5TSU9OX05BTUV9fTsKKyAgICBmb3IgKGF1dG8gZGV2aWNlX2V4dGVuc2lvbiA6IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zKSB7CisgICAgICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIGRldmljZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKGRldmljZV9leHRlbnNpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChEZXZpY2VJc01vY2tJQ0QoKSB8fCBEZXZpY2VTaW11bGF0aW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBNb2NrSUNEIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisKKyAgICAvLyBDcmVhdGUgYSBkZXZpY2UgdGhhdCBlbmFibGVzIGJ1ZmZlcl9kZXZpY2VfYWRkcmVzcworICAgIGF1dG8gYnVmZmVyX2RldmljZV9hZGRyZXNzX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJBZGRyZXNzRmVhdHVyZXNFWFQ+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmJ1ZmZlcl9kZXZpY2VfYWRkcmVzc19mZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisgICAgYnVmZmVyX2RldmljZV9hZGRyZXNzX2ZlYXR1cmVzLmJ1ZmZlckRldmljZUFkZHJlc3NDYXB0dXJlUmVwbGF5ID0gVktfRkFMU0U7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIHZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCA9CisgICAgICAgIChQRk5fdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKXZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXZpY2UoKSwgInZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCIpOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk99OworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9FWFQ7CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLmZsYWdzID0gVktfQlVGRkVSX0NSRUFURV9ERVZJQ0VfQUREUkVTU19DQVBUVVJFX1JFUExBWV9CSVRfRVhUOworICAgIENyZWF0ZUJ1ZmZlclRlc3QoKnRoaXMsICZidWZmZXJfY3JlYXRlX2luZm8sICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzMzOCIpOworCisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKyAgICBWa0J1ZmZlckRldmljZUFkZHJlc3NDcmVhdGVJbmZvRVhUIGFkZHJfY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0NSRUFURV9JTkZPX0VYVH07CisgICAgYWRkcl9jaS5kZXZpY2VBZGRyZXNzID0gMTsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8ucE5leHQgPSAmYWRkcl9jaTsKKyAgICBDcmVhdGVCdWZmZXJUZXN0KCp0aGlzLCAmYnVmZmVyX2NyZWF0ZV9pbmZvLCAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZGV2aWNlQWRkcmVzcy0wMjYwNCIpOworCisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZidWZmZXJfY3JlYXRlX2luZm8sIE5VTEwsICZidWZmZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvRVhUIGluZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fRVhUfTsKKyAgICBpbmZvLmJ1ZmZlciA9IGJ1ZmZlcjsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1idWZmZXItMDI2MDAiKTsKKyAgICB2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQobV9kZXZpY2UtPmRldmljZSgpLCAmaW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQnVmZmVyRGV2aWNlQWRkcmVzc0VYVERpc2FibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBWS19FWFRfYnVmZmVyX2RldmljZV9hZGRyZXNzLiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgaW5zdGFuY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIHN0ZDo6YXJyYXk8Y29uc3QgY2hhciAqLCAxPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHt7VktfRVhUX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19FWFRFTlNJT05fTkFNRX19OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2aWNlX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIGRldmljZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKERldmljZUlzTW9ja0lDRCgpIHx8IERldmljZVNpbXVsYXRpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIE1vY2tJQ0QgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGRldmljZSB0aGF0IGRpc2FibGVzIGJ1ZmZlcl9kZXZpY2VfYWRkcmVzcworICAgIGF1dG8gYnVmZmVyX2RldmljZV9hZGRyZXNzX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJBZGRyZXNzRmVhdHVyZXNFWFQ+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmJ1ZmZlcl9kZXZpY2VfYWRkcmVzc19mZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisgICAgYnVmZmVyX2RldmljZV9hZGRyZXNzX2ZlYXR1cmVzLmJ1ZmZlckRldmljZUFkZHJlc3MgPSBWS19GQUxTRTsKKyAgICBidWZmZXJfZGV2aWNlX2FkZHJlc3NfZmVhdHVyZXMuYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkgPSBWS19GQUxTRTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAmZmVhdHVyZXMyKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUID0KKyAgICAgICAgKFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQpdms6OkdldERldmljZVByb2NBZGRyKGRldmljZSgpLCAidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIik7CisKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GT307CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9JTkRFWF9CVUZGRVJfQklUOworICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlQnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJ1ZmZlcl9jcmVhdGVfaW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9FWFQgaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19FWFR9OworICAgIGluZm8uYnVmZmVyID0gYnVmZmVyOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFItYnVmZmVyRGV2aWNlQWRkcmVzcy0wMzMyNCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1idWZmZXItMDI2MDEiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItYnVmZmVyLTAyNjAwIik7CisgICAgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmluZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEJ1ZmZlckRldmljZUFkZHJlc3NLSFIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IFZLX0tIUl9idWZmZXJfZGV2aWNlX2FkZHJlc3MuIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgc3RkOjphcnJheTxjb25zdCBjaGFyICosIDE+IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zID0ge3tWS19LSFJfQlVGRkVSX0RFVklDRV9BRERSRVNTX0VYVEVOU0lPTl9OQU1FfX07CisgICAgZm9yIChhdXRvIGRldmljZV9leHRlbnNpb24gOiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucykgeworICAgICAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBkZXZpY2VfZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRGV2aWNlSXNNb2NrSUNEKCkgfHwgRGV2aWNlU2ltdWxhdGlvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgTW9ja0lDRCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgLy8gQ3JlYXRlIGEgZGV2aWNlIHRoYXQgZW5hYmxlcyBidWZmZXJfZGV2aWNlX2FkZHJlc3MKKyAgICBhdXRvIGJ1ZmZlcl9kZXZpY2VfYWRkcmVzc19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzS0hSPigpOworICAgIGF1dG8gZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KCZidWZmZXJfZGV2aWNlX2FkZHJlc3NfZmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoZ3B1KCksICZmZWF0dXJlczIpOworICAgIGJ1ZmZlcl9kZXZpY2VfYWRkcmVzc19mZWF0dXJlcy5idWZmZXJEZXZpY2VBZGRyZXNzQ2FwdHVyZVJlcGxheSA9IFZLX0ZBTFNFOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZmZWF0dXJlczIpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgUEZOX3ZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUiB2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0tIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlKCksICJ2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIiKTsKKyAgICBQRk5fdmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiB2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSID0KKyAgICAgICAgKFBGTl92a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXZpY2UoKSwgInZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIiKTsKKworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmZXJfY3JlYXRlX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPfTsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8uc2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1NIQURFUl9ERVZJQ0VfQUREUkVTU19CSVRfS0hSOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0JVRkZFUl9DUkVBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUjsKKyAgICBDcmVhdGVCdWZmZXJUZXN0KCp0aGlzLCAmYnVmZmVyX2NyZWF0ZV9pbmZvLCAiVlVJRC1Wa0J1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMzMzgiKTsKKworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisgICAgVmtCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0NyZWF0ZUluZm9LSFIgYWRkcl9jaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfT1BBUVVFX0NBUFRVUkVfQUREUkVTU19DUkVBVEVfSU5GT19LSFJ9OworICAgIGFkZHJfY2kub3BhcXVlQ2FwdHVyZUFkZHJlc3MgPSAxOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5wTmV4dCA9ICZhZGRyX2NpOworICAgIENyZWF0ZUJ1ZmZlclRlc3QoKnRoaXMsICZidWZmZXJfY3JlYXRlX2luZm8sICJWVUlELVZrQnVmZmVyQ3JlYXRlSW5mby1vcGFxdWVDYXB0dXJlQWRkcmVzcy0wMzMzNyIpOworCisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZidWZmZXJfY3JlYXRlX2luZm8sIE5VTEwsICZidWZmZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0J1ZmZlckRldmljZUFkZHJlc3NJbmZvS0hSIGluZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fS0hSfTsKKyAgICBpbmZvLmJ1ZmZlciA9IGJ1ZmZlcjsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1idWZmZXItMDI2MDAiKTsKKyAgICB2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmaW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBidWZmZXJfbWVtX3JlcXMgPSB7fTsKKyAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSgpLCBidWZmZXIsICZidWZmZXJfbWVtX3JlcXMpOworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGJ1ZmZlcl9hbGxvY19pbmZvID0ge307CisgICAgYnVmZmVyX2FsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICBidWZmZXJfYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IGJ1ZmZlcl9tZW1fcmVxcy5zaXplOworICAgIG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUoYnVmZmVyX21lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmYnVmZmVyX2FsbG9jX2luZm8sIDApOworICAgIFZrRGV2aWNlTWVtb3J5IGJ1ZmZlcl9tZW07CisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmYnVmZmVyX2FsbG9jX2luZm8sIE5VTEwsICZidWZmZXJfbWVtKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0JpbmRCdWZmZXJNZW1vcnktYnVmZmVyRGV2aWNlQWRkcmVzcy0wMzMzOSIpOworICAgIHZrOjpCaW5kQnVmZmVyTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBidWZmZXJfbWVtLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSIG1lbV9vcGFxdWVfYWRkcl9pbmZvID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFJ9OworICAgIG1lbV9vcGFxdWVfYWRkcl9pbmZvLm1lbW9yeSA9IGJ1ZmZlcl9tZW07CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzSW5mb0tIUi1tZW1vcnktMDMzMzYiKTsKKyAgICB2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1lbV9vcGFxdWVfYWRkcl9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyX21lbSwgTlVMTCk7CisKKyAgICBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvIGFsbG9jX2ZsYWdzID0ge1ZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9GTEFHU19JTkZPfTsKKyAgICBhbGxvY19mbGFncy5mbGFncyA9IFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfQUREUkVTU19CSVRfS0hSOworICAgIGJ1ZmZlcl9hbGxvY19pbmZvLnBOZXh0ID0gJmFsbG9jX2ZsYWdzOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmJ1ZmZlcl9hbGxvY19pbmZvLCBOVUxMLCAmYnVmZmVyX21lbSk7CisKKyAgICBtZW1fb3BhcXVlX2FkZHJfaW5mby5tZW1vcnkgPSBidWZmZXJfbWVtOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUihtX2RldmljZS0+ZGV2aWNlKCksICZtZW1fb3BhcXVlX2FkZHJfaW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpCaW5kQnVmZmVyTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBidWZmZXJfbWVtLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmluZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXJfbWVtLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQnVmZmVyRGV2aWNlQWRkcmVzc0tIUkRpc2FibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBWS19LSFJfYnVmZmVyX2RldmljZV9hZGRyZXNzLiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgaW5zdGFuY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIHN0ZDo6YXJyYXk8Y29uc3QgY2hhciAqLCAxPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHt7VktfS0hSX0JVRkZFUl9ERVZJQ0VfQUREUkVTU19FWFRFTlNJT05fTkFNRX19OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2aWNlX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIGRldmljZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKERldmljZUlzTW9ja0lDRCgpIHx8IERldmljZVNpbXVsYXRpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIE1vY2tJQ0QgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGRldmljZSB0aGF0IGRpc2FibGVzIGJ1ZmZlcl9kZXZpY2VfYWRkcmVzcworICAgIGF1dG8gYnVmZmVyX2RldmljZV9hZGRyZXNzX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VCdWZmZXJEZXZpY2VBZGRyZXNzRmVhdHVyZXNLSFI+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmJ1ZmZlcl9kZXZpY2VfYWRkcmVzc19mZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisgICAgYnVmZmVyX2RldmljZV9hZGRyZXNzX2ZlYXR1cmVzLmJ1ZmZlckRldmljZUFkZHJlc3MgPSBWS19GQUxTRTsKKyAgICBidWZmZXJfZGV2aWNlX2FkZHJlc3NfZmVhdHVyZXMuYnVmZmVyRGV2aWNlQWRkcmVzc0NhcHR1cmVSZXBsYXkgPSBWS19GQUxTRTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAmZmVhdHVyZXMyKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSID0KKyAgICAgICAgKFBGTl92a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFIpdms6OkdldERldmljZVByb2NBZGRyKGRldmljZSgpLCAidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSIik7CisgICAgUEZOX3ZrR2V0QnVmZmVyT3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiA9CisgICAgICAgIChQRk5fdmtHZXRCdWZmZXJPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlKCksICJ2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIik7CisgICAgUEZOX3ZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIgdmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUiA9CisgICAgICAgIChQRk5fdmtHZXREZXZpY2VNZW1vcnlPcGFxdWVDYXB0dXJlQWRkcmVzc0tIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlKCksICJ2a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSIik7CisKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GT307CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9JTkRFWF9CVUZGRVJfQklUOworICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlQnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJ1ZmZlcl9jcmVhdGVfaW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFIgaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfREVWSUNFX0FERFJFU1NfSU5GT19LSFJ9OworICAgIGluZm8uYnVmZmVyID0gYnVmZmVyOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldEJ1ZmZlckRldmljZUFkZHJlc3NLSFItYnVmZmVyRGV2aWNlQWRkcmVzcy0wMzMyNCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0tIUi1idWZmZXItMDI2MDEiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQnVmZmVyRGV2aWNlQWRkcmVzc0luZm9LSFItYnVmZmVyLTAyNjAwIik7CisgICAgdmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmluZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLU5vbmUtMDMzMjYiKTsKKyAgICB2a0dldEJ1ZmZlck9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmluZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgYnVmZmVyX21lbV9yZXFzID0ge307CisgICAgdms6OkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UoKSwgYnVmZmVyLCAmYnVmZmVyX21lbV9yZXFzKTsKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBidWZmZXJfYWxsb2NfaW5mbyA9IHt9OworICAgIGJ1ZmZlcl9hbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgYnVmZmVyX2FsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgPSBidWZmZXJfbWVtX3JlcXMuc2l6ZTsKKyAgICBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKGJ1ZmZlcl9tZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJmJ1ZmZlcl9hbGxvY19pbmZvLCAwKTsKKyAgICBWa0RldmljZU1lbW9yeSBidWZmZXJfbWVtOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmJ1ZmZlcl9hbGxvY19pbmZvLCBOVUxMLCAmYnVmZmVyX21lbSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSIG1lbV9vcGFxdWVfYWRkcl9pbmZvID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfTUVNT1JZX09QQVFVRV9DQVBUVVJFX0FERFJFU1NfSU5GT19LSFJ9OworICAgIG1lbV9vcGFxdWVfYWRkcl9pbmZvLm1lbW9yeSA9IGJ1ZmZlcl9tZW07CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0dldERldmljZU1lbW9yeU9wYXF1ZUNhcHR1cmVBZGRyZXNzS0hSLU5vbmUtMDMzMzQiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NJbmZvS0hSLW1lbW9yeS0wMzMzNiIpOworICAgIHZrR2V0RGV2aWNlTWVtb3J5T3BhcXVlQ2FwdHVyZUFkZHJlc3NLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtX29wYXF1ZV9hZGRyX2luZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXJfbWVtLCBOVUxMKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8gYWxsb2NfZmxhZ3MgPSB7VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk99OworICAgIGFsbG9jX2ZsYWdzLmZsYWdzID0gVktfTUVNT1JZX0FMTE9DQVRFX0RFVklDRV9BRERSRVNTX0JJVF9LSFIgfCBWS19NRU1PUllfQUxMT0NBVEVfREVWSUNFX0FERFJFU1NfQ0FQVFVSRV9SRVBMQVlfQklUX0tIUjsKKyAgICBidWZmZXJfYWxsb2NfaW5mby5wTmV4dCA9ICZhbGxvY19mbGFnczsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tZmxhZ3MtMDMzMzAiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWZsYWdzLTAzMzMxIik7CisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmYnVmZmVyX2FsbG9jX2luZm8sIE5VTEwsICZidWZmZXJfbWVtKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVJbWFnZVljYmNyQXJyYXlMYXllcnMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGluZyBpbWFnZXMgd2l0aCBvdXQtb2YtcmFuZ2UgYXJyYXlMYXllcnMgIik7CisKKyAgICAvLyBFbmFibGUgS0hSIG11bHRpcGxhbmUgcmVxJ2QgZXh0ZW5zaW9ucworICAgIGJvb2wgbXBfZXh0ZW5zaW9ucyA9IEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfU1BFQ19WRVJTSU9OKTsKKyAgICBpZiAobXBfZXh0ZW5zaW9ucykgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgIGlmIChtcF9leHRlbnNpb25zKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIHRlc3QgcmVxdWlyZXMgS0hSIG11bHRpcGxhbmUgZXh0ZW5zaW9ucywgbm90IGF2YWlsYWJsZS4gIFNraXBwaW5nLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBDcmVhdGUgeWNiY3IgaW1hZ2Ugd2l0aCB1bnN1cHBvcnRlZCBhcnJheUxheWVycworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDMyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAzMjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisKKyAgICBib29sIHN1cHBvcnRlZCA9IEltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoaW5zdGFuY2UoKSwgZ3B1KCksIGltYWdlX2NyZWF0ZV9pbmZvLCBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUKTsKKyAgICBpZiAoIXN1cHBvcnRlZCkgeworICAgICAgICBwcmludGYoIiVzIE11bHRpcGxhbmUgaW1hZ2UgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuICBTa2lwcGluZyB0ZXN0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgaW1nX2xpbWl0czsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhHUERJRlBIZWxwZXIoZ3B1KCksICZpbWFnZV9jcmVhdGVfaW5mbywgJmltZ19saW1pdHMpKTsKKyAgICBpZiAoaW1nX2xpbWl0cy5tYXhBcnJheUxheWVycyA9PSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSBpbWdfbGltaXRzLm1heEFycmF5TGF5ZXJzOworCisgICAgQ3JlYXRlSW1hZ2VUZXN0KCp0aGlzLCAmaW1hZ2VfY3JlYXRlX2luZm8sICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLWZvcm1hdC0wMjY1MyIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tZm9ybWF0LTAyNjUzIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQmluZEltYWdlTWVtb3J5U3dhcGNoYWluKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiSW52YWxpZCBiaW5kIGltYWdlIHdpdGggYSBzd2FwY2hhaW4iKTsKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisKKyAgICBpZiAoIUFkZFN1cmZhY2VJbnN0YW5jZUV4dGVuc2lvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgc3VyZmFjZSBleHRlbnNpb25zIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIEJpbmRTd2FwY2hhaW5JbWFnZU1lbW9yeSB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmICghQWRkU3dhcGNoYWluRGV2aWNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzd2FwY2hhaW4gZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyBCaW5kU3dhcGNoYWluSW1hZ2VNZW1vcnkgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKERldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgPCBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBWa0JpbmRJbWFnZU1lbW9yeUluZm8gcmVxdWlyZXMgVnVsa2FuIDEuMSssIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIGlmICghSW5pdFN3YXBjaGFpbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgQ2Fubm90IGNyZWF0ZSBzdXJmYWNlIG9yIHN3YXBjaGFpbiwgc2tpcHBpbmcgQmluZFN3YXBjaGFpbkltYWdlTWVtb3J5IHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gaW1hZ2VfY3JlYXRlX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtJbWFnZUNyZWF0ZUluZm8+KCk7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDY0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisKKyAgICBhdXRvIGltYWdlX3N3YXBjaGFpbl9jcmVhdGVfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUj4oKTsKKyAgICBpbWFnZV9zd2FwY2hhaW5fY3JlYXRlX2luZm8uc3dhcGNoYWluID0gbV9zd2FwY2hhaW47CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSAmaW1hZ2Vfc3dhcGNoYWluX2NyZWF0ZV9pbmZvOworCisgICAgVmtJbWFnZSBpbWFnZV9mcm9tX3N3YXBjaGFpbjsKKyAgICB2azo6Q3JlYXRlSW1hZ2UoZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJmltYWdlX2Zyb21fc3dhcGNoYWluKTsKKworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzID0ge307CisgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSgpLCBpbWFnZV9mcm9tX3N3YXBjaGFpbiwgJm1lbV9yZXFzKTsKKworICAgIGF1dG8gYWxsb2NfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa01lbW9yeUFsbG9jYXRlSW5mbz4oKTsKKyAgICBhbGxvY19pbmZvLm1lbW9yeVR5cGVJbmRleCA9IDA7CisgICAgYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IG1lbV9yZXFzLnNpemU7CisKKyAgICBib29sIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmYWxsb2NfaW5mbywgMCk7CisgICAgQVNTRVJUX1RSVUUocGFzcyk7CisKKyAgICBWa0RldmljZU1lbW9yeSBtZW07CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZtZW0pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBhdXRvIGJpbmRfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0JpbmRJbWFnZU1lbW9yeUluZm8+KCk7CisgICAgYmluZF9pbmZvLmltYWdlID0gaW1hZ2VfZnJvbV9zd2FwY2hhaW47CisgICAgYmluZF9pbmZvLm1lbW9yeSA9IFZLX05VTExfSEFORExFOworICAgIGJpbmRfaW5mby5tZW1vcnlPZmZzZXQgPSAwOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8taW1hZ2UtMDE2MzAiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQmluZEltYWdlTWVtb3J5SW5mby1wTmV4dC0wMTYzMiIpOworICAgIHZrOjpCaW5kSW1hZ2VNZW1vcnkyKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmJpbmRfaW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBhdXRvIGJpbmRfc3dhcGNoYWluX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtCaW5kSW1hZ2VNZW1vcnlTd2FwY2hhaW5JbmZvS0hSPigpOworICAgIGJpbmRfc3dhcGNoYWluX2luZm8uc3dhcGNoYWluID0gVktfTlVMTF9IQU5ETEU7CisgICAgYmluZF9zd2FwY2hhaW5faW5mby5pbWFnZUluZGV4ID0gMDsKKyAgICBiaW5kX2luZm8ucE5leHQgPSAmYmluZF9zd2FwY2hhaW5faW5mbzsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlVOQVNTSUdORUQtR2VuZXJhbFBhcmFtZXRlckVycm9yLVJlcXVpcmVkUGFyYW1ldGVyIik7CisgICAgdms6OkJpbmRJbWFnZU1lbW9yeTIobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmYmluZF9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGJpbmRfaW5mby5tZW1vcnkgPSBtZW07CisgICAgYmluZF9zd2FwY2hhaW5faW5mby5zd2FwY2hhaW4gPSBtX3N3YXBjaGFpbjsKKyAgICBiaW5kX3N3YXBjaGFpbl9pbmZvLmltYWdlSW5kZXggPSBVSU5UMzJfTUFYOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0JpbmRJbWFnZU1lbW9yeUluZm8tcE5leHQtMDE2MzEiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUi1pbWFnZUluZGV4LTAxNjQ0Iik7CisgICAgdms6OkJpbmRJbWFnZU1lbW9yeTIobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmYmluZF9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZV9mcm9tX3N3YXBjaGFpbiwgTlVMTCk7CisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIE5VTEwpOworICAgIERlc3Ryb3lTd2FwY2hhaW4oKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBUcmFuc2ZlckltYWdlVG9Td2FwY2hhaW5XaXRoSW52YWxpZExheW91dERldmljZUdyb3VwKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVHJhbnNmZXIgYW4gaW1hZ2UgdG8gYSBzd2FwY2hhaW4ncyBpbWFnZSB3aXRoIGEgaW52YWxpZCBsYXlvdXQgYmV0d2VlbiBkZXZpY2UgZ3JvdXAiKTsKKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKQorICAgIHByaW50ZigKKyAgICAgICAgIiVzIEFjY29yZGluZyB0byB2YWxpZCB1c2FnZSwgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeSBzaG91bGQgYmUgTlVMTC4gQnV0IEFuZHJvaWQgd2lsbCBjcmFzaCBpZiBtZW1vcnkgaXMgTlVMTCwgIgorICAgICAgICAic2tpcHBpbmcgdGVzdFxuIiwKKyAgICAgICAga1NraXBQcmVmaXgpOworICAgIHJldHVybjsKKyNlbmRpZgorCisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworCisgICAgaWYgKCFBZGRTdXJmYWNlSW5zdGFuY2VFeHRlbnNpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIHN1cmZhY2UgZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmICghQWRkU3dhcGNoYWluRGV2aWNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzd2FwY2hhaW4gZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoRGV2aWNlVmFsaWRhdGlvblZlcnNpb24oKSA8IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICBwcmludGYoIiVzIFZrQmluZEltYWdlTWVtb3J5SW5mbyByZXF1aXJlcyBWdWxrYW4gMS4xKywgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQzMl90IHBoeXNpY2FsX2RldmljZV9ncm91cF9jb3VudCA9IDA7CisgICAgdms6OkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKGluc3RhbmNlKCksICZwaHlzaWNhbF9kZXZpY2VfZ3JvdXBfY291bnQsIG51bGxwdHIpOworCisgICAgaWYgKHBoeXNpY2FsX2RldmljZV9ncm91cF9jb3VudCA9PSAwKSB7CisgICAgICAgIHByaW50ZigiJXMgcGh5c2ljYWxfZGV2aWNlX2dyb3VwX2NvdW50IGlzIDAsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM+IHBoeXNpY2FsX2RldmljZV9ncm91cChwaHlzaWNhbF9kZXZpY2VfZ3JvdXBfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfR1JPVVBfUFJPUEVSVElFU30pOworICAgIHZrOjpFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyhpbnN0YW5jZSgpLCAmcGh5c2ljYWxfZGV2aWNlX2dyb3VwX2NvdW50LCBwaHlzaWNhbF9kZXZpY2VfZ3JvdXAuZGF0YSgpKTsKKyAgICBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBjcmVhdGVfZGV2aWNlX3BuZXh0ID0ge307CisgICAgY3JlYXRlX2RldmljZV9wbmV4dC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk87CisgICAgY3JlYXRlX2RldmljZV9wbmV4dC5waHlzaWNhbERldmljZUNvdW50ID0gcGh5c2ljYWxfZGV2aWNlX2dyb3VwWzBdLnBoeXNpY2FsRGV2aWNlQ291bnQ7CisgICAgY3JlYXRlX2RldmljZV9wbmV4dC5wUGh5c2ljYWxEZXZpY2VzID0gcGh5c2ljYWxfZGV2aWNlX2dyb3VwWzBdLnBoeXNpY2FsRGV2aWNlczsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmNyZWF0ZV9kZXZpY2VfcG5leHQpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIGlmICghSW5pdFN3YXBjaGFpbihWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKSkgeworICAgICAgICBwcmludGYoIiVzIENhbm5vdCBjcmVhdGUgc3VyZmFjZSBvciBzd2FwY2hhaW4sIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gaW1hZ2VfY3JlYXRlX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtJbWFnZUNyZWF0ZUluZm8+KCk7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDY0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisKKyAgICBWa0ltYWdlT2JqIHNyY19JbWFnZShtX2RldmljZSk7CisgICAgc3JjX0ltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0lNQUdFX0NSRUFURV9BTElBU19CSVQ7CisKKyAgICBhdXRvIGltYWdlX3N3YXBjaGFpbl9jcmVhdGVfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUj4oKTsKKyAgICBpbWFnZV9zd2FwY2hhaW5fY3JlYXRlX2luZm8uc3dhcGNoYWluID0gbV9zd2FwY2hhaW47CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSAmaW1hZ2Vfc3dhcGNoYWluX2NyZWF0ZV9pbmZvOworCisgICAgVmtJbWFnZSBwZWVyX2ltYWdlOworICAgIHZrOjpDcmVhdGVJbWFnZShkZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmcGVlcl9pbWFnZSk7CisKKyAgICBhdXRvIGJpbmRfZGV2aWNlZ3JvdXBfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbz4oKTsKKyAgICBiaW5kX2RldmljZWdyb3VwX2luZm8uZGV2aWNlSW5kZXhDb3VudCA9IDI7CisgICAgc3RkOjphcnJheTx1aW50MzJfdCwgMj4gZGV2aWNlSW5kaWNlcyA9IHswLCAwfTsKKyAgICBiaW5kX2RldmljZWdyb3VwX2luZm8ucERldmljZUluZGljZXMgPSBkZXZpY2VJbmRpY2VzLmRhdGEoKTsKKyAgICBiaW5kX2RldmljZWdyb3VwX2luZm8uc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCA9IDA7CisgICAgYmluZF9kZXZpY2Vncm91cF9pbmZvLnBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMgPSBudWxscHRyOworCisgICAgYXV0byBiaW5kX3N3YXBjaGFpbl9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUj4oJmJpbmRfZGV2aWNlZ3JvdXBfaW5mbyk7CisgICAgYmluZF9zd2FwY2hhaW5faW5mby5zd2FwY2hhaW4gPSBtX3N3YXBjaGFpbjsKKyAgICBiaW5kX3N3YXBjaGFpbl9pbmZvLmltYWdlSW5kZXggPSAwOworCisgICAgYXV0byBiaW5kX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtCaW5kSW1hZ2VNZW1vcnlJbmZvPigmYmluZF9zd2FwY2hhaW5faW5mbyk7CisgICAgYmluZF9pbmZvLmltYWdlID0gcGVlcl9pbWFnZTsKKyAgICBiaW5kX2luZm8ubWVtb3J5ID0gVktfTlVMTF9IQU5ETEU7CisgICAgYmluZF9pbmZvLm1lbW9yeU9mZnNldCA9IDA7CisKKyAgICB2azo6QmluZEltYWdlTWVtb3J5MihtX2RldmljZS0+ZGV2aWNlKCksIDEsICZiaW5kX2luZm8pOworCisgICAgdWludDMyX3Qgc3dhcGNoYWluX2ltYWdlc19jb3VudCA9IDA7CisgICAgdms6OkdldFN3YXBjaGFpbkltYWdlc0tIUihkZXZpY2UoKSwgbV9zd2FwY2hhaW4sICZzd2FwY2hhaW5faW1hZ2VzX2NvdW50LCBudWxscHRyKTsKKyAgICBzdGQ6OnZlY3RvcjxWa0ltYWdlPiBzd2FwY2hhaW5faW1hZ2VzOworICAgIHN3YXBjaGFpbl9pbWFnZXMucmVzaXplKHN3YXBjaGFpbl9pbWFnZXNfY291bnQpOworICAgIHZrOjpHZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlKCksIG1fc3dhcGNoYWluLCAmc3dhcGNoYWluX2ltYWdlc19jb3VudCwgc3dhcGNoYWluX2ltYWdlcy5kYXRhKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgVmtJbWFnZUNvcHkgY29weV9yZWdpb24gPSB7fTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0ID0gezAsIDAsIDB9OworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldCA9IHswLCAwLCAwfTsKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQgPSB7MTAsIDEwLCAxfTsKKyAgICB2azo6Q21kQ29weUltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHNyY19JbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIHBlZXJfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsIDEsICZjb3B5X3JlZ2lvbik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEltYWdlTGF5b3V0Iik7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBwZWVyX2ltYWdlLCBOVUxMKTsKKyAgICBEZXN0cm95U3dhcGNoYWluKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZE1lbW9yeVR5cGUpIHsKKyAgICAvLyBBdHRlbXB0cyB0byBhbGxvY2F0ZSBmcm9tIGEgbWVtb3J5IHR5cGUgdGhhdCBkb2Vzbid0IGV4aXN0CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlfaW5mbzsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKGdwdSgpLCAmbWVtb3J5X2luZm8pOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0FsbG9jYXRlTWVtb3J5LXBBbGxvY2F0ZUluZm8tMDE3MTQiKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgIG1lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IG1lbW9yeV9pbmZvLm1lbW9yeVR5cGVDb3VudDsKKyAgICBtZW1fYWxsb2MuYWxsb2NhdGlvblNpemUgPSA0OworCisgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksICZtZW1fYWxsb2MsIE5VTEwsICZtZW0pOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQWxsb2NhdGlvbkJleW9uZEhlYXBTaXplKSB7CisgICAgLy8gQXR0ZW1wdHMgdG8gYWxsb2NhdGUgYSBzaW5nbGUgcGllY2Ugb2YgbWVtb3J5IHRoYXQncyBsYXJnZXIgdGhhbiB0aGUgaGVhcCBzaXplCisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlfaW5mbzsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKGdwdSgpLCAmbWVtb3J5X2luZm8pOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0FsbG9jYXRlTWVtb3J5LXBBbGxvY2F0ZUluZm8tMDE3MTMiKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgIG1lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IDA7CisgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gbWVtb3J5X2luZm8ubWVtb3J5SGVhcHNbbWVtb3J5X2luZm8ubWVtb3J5VHlwZXNbMF0uaGVhcEluZGV4XS5zaXplICsgMTsKKworICAgIFZrRGV2aWNlTWVtb3J5IG1lbTsKKyAgICB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtX2FsbG9jLCBOVUxMLCAmbWVtKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIERldmljZUNvaGVyZW50TWVtb3J5RGlzYWJsZWRBTUQpIHsKKyAgICAvLyBBdHRlbXB0cyB0byBhbGxvY2F0ZSBkZXZpY2UgY29oZXJlbnQgbWVtb3J5IHdpdGhvdXQgZW5hYmxpbmcgdGhlIGV4dGVuc2lvbi9mZWF0dXJlCisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBpZiAoRGV2aWNlSXNNb2NrSUNEKCkgfHwgRGV2aWNlU2ltdWxhdGlvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgTW9ja0lDRCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBuZWNlc3NhcnkgbWVtb3J5IHR5cGUsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENoZWNrIGV4dGVuc2lvbiBzdXBwb3J0IGJ1dCBkbyBub3QgZW5hYmxlIGl0CisgICAgaWYgKCFEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0FNRF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIFZLX0FNRF9ERVZJQ0VfQ09IRVJFTlRfTUVNT1JZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZpbmQgYSBtZW1vcnkgdHlwZSB0aGF0IGluY2x1ZGVzIHRoZSBkZXZpY2UgY29oZXJlbnQgbWVtb3J5IHByb3BlcnR5CisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgbWVtb3J5X2luZm87CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhncHUoKSwgJm1lbW9yeV9pbmZvKTsKKyAgICB1aW50MzJfdCBkZXZpY2VDb2hlcmVudE1lbW9yeVR5cGVJbmRleCA9IG1lbW9yeV9pbmZvLm1lbW9yeVR5cGVDb3VudDsgIC8vIFNldCB0byBhbiBpbnZhbGlkIHZhbHVlIGp1c3QgaW4gY2FzZQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1lbW9yeV9pbmZvLm1lbW9yeVR5cGVDb3VudDsgKytpKSB7CisgICAgICAgIGlmICgobWVtb3J5X2luZm8ubWVtb3J5VHlwZXNbaV0ucHJvcGVydHlGbGFncyAmIFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfQ09IRVJFTlRfQklUX0FNRCkgIT0gMCkgeworICAgICAgICAgICAgZGV2aWNlQ29oZXJlbnRNZW1vcnlUeXBlSW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQWxsb2NhdGVNZW1vcnktZGV2aWNlQ29oZXJlbnRNZW1vcnktMDI3OTAiKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgIG1lbV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9hbGxvYy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2FsbG9jLm1lbW9yeVR5cGVJbmRleCA9IGRldmljZUNvaGVyZW50TWVtb3J5VHlwZUluZGV4OworICAgIG1lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IDQ7CisKKyAgICBWa0RldmljZU1lbW9yeSBtZW07CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1lbV9hbGxvYywgTlVMTCwgJm1lbSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19jb21tYW5kLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19jb21tYW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzNkMDhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtsYXllcnRlc3RzX2NvbW1hbmQuY3BwCkBAIC0wLDAgKzEsNTIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjbm9ydGhyb3BAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKZXJlbXkgS25pYWdlciA8amVyZW15a0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBTaGFubm9uIE1jUGhlcnNvbiA8c2hhbm5vbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlICJjYXN0X3V0aWxzLmgiCisjaW5jbHVkZSAibGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5oIgorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRDb21tYW5kUG9vbENvbnNpc3RlbmN5KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQWxsb2NhdGUgY29tbWFuZCBidWZmZXJzIGZyb20gb25lIGNvbW1hbmQgcG9vbCBhbmQgYXR0ZW1wdCB0byBkZWxldGUgdGhlbSBmcm9tIGFub3RoZXIuIik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRnJlZUNvbW1hbmRCdWZmZXJzLXBDb21tYW5kQnVmZmVycy1wYXJlbnQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtDb21tYW5kUG9vbCBjb21tYW5kX3Bvb2xfb25lOworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZF9wb29sX3R3bzsKKworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHBvb2xfY3JlYXRlX2luZm97fTsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPOworICAgIHBvb2xfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLmZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ7CisKKyAgICB2azo6Q3JlYXRlQ29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmNvbW1hbmRfcG9vbF9vbmUpOworCisgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb21tYW5kX3Bvb2xfdHdvKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjYjsKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mb3t9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBjb21tYW5kX3Bvb2xfb25lOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksICZjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLCAmY2IpOworCisgICAgdms6OkZyZWVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksIGNvbW1hbmRfcG9vbF90d28sIDEsICZjYik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2xfb25lLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sX3R3bywgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZFNlY29uZGFyeUNvbW1hbmRCdWZmZXJCYXJyaWVyKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQWRkIGFuIGludmFsaWQgaW1hZ2UgYmFycmllciBpbiBhIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICAvLyBBIHJlbmRlcnBhc3Mgd2l0aCBhIHNpbmdsZSBzdWJwYXNzIHRoYXQgZGVjbGFyZWQgYSBzZWxmLWRlcGVuZGVuY3kKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2hbXSA9IHsKKyAgICAgICAgezAsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfU0FNUExFX0NPVU5UXzFfQklULCBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLCBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELAorICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH0sCisgICAgfTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgcmVmID0gezAsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9OworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3Nlc1tdID0geworICAgICAgICB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMCwgbnVsbHB0ciwgMSwgJnJlZiwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0cn0sCisgICAgfTsKKyAgICBWa1N1YnBhc3NEZXBlbmRlbmN5IGRlcCA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVH07CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAxLCBhdHRhY2gsIDEsIHN1YnBhc3NlcywgMSwgJmRlcH07CisgICAgVmtSZW5kZXJQYXNzIHJwOworCisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgbnVsbHB0ciwgJnJwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBWa0ltYWdlVmlldyBpbWFnZVZpZXcgPSBpbWFnZS50YXJnZXRWaWV3KFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSk7CisgICAgLy8gU2Vjb25kIGltYWdlIHRoYXQgaW1nX2JhcnJpZXIgd2lsbCBpbmNvcnJlY3RseSB1c2UKKyAgICBWa0ltYWdlT2JqIGltYWdlMihtX2RldmljZSk7CisgICAgaW1hZ2UyLkluaXQoMzIsIDMyLCAxLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmYmNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCBycCwgMSwgJmltYWdlVmlldywgMzIsIDMyLCAxfTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZiOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmYmNpLCBudWxscHRyLCAmZmIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gcnBiaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MzIsIDMyfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyfTsKKworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfU0VDT05EQVJZX0NPTU1BTkRfQlVGRkVSUyk7CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIHBvb2wobV9kZXZpY2UsIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XywgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpOworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBzZWNvbmRhcnkobV9kZXZpY2UsICZwb29sLCBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpOworCisgICAgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIGNiaWkgPSB7VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsICAvLyBTZXQgdG8gTlVMTCBGQiBoYW5kbGUgaW50ZW50aW9uYWxseSB0byBmbGVzaCBvdXQgYW55IGVycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNiYmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUIHwgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYmlpfTsKKyAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKHNlY29uZGFyeS5oYW5kbGUoKSwgJmNiYmkpOworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltZ19iYXJyaWVyID0ge307CisgICAgaW1nX2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUjsKKyAgICBpbWdfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQ7CisgICAgaW1nX2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUOworICAgIGltZ19iYXJyaWVyLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBpbWdfYmFycmllci5pbWFnZSA9IGltYWdlMi5oYW5kbGUoKTsgIC8vIEltYWdlIG1pcy1tYXRjaGVzIHdpdGggRkIgaW1hZ2UKKyAgICBpbWdfYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKHNlY29uZGFyeS5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltZ19iYXJyaWVyKTsKKyAgICBzZWNvbmRhcnkuZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWltYWdlLTAyNjM1Iik7CisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmc2Vjb25kYXJ5LmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIER5bmFtaWNEZXB0aEJpYXNOb3RCb3VuZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJSdW4gYSBzaW1wbGUgZHJhdyBjYWxscyB0byB2YWxpZGF0ZSBmYWlsdXJlIHdoZW4gRGVwdGggQmlhcyBkeW5hbWljIHN0YXRlIGlzIHJlcXVpcmVkIGJ1dCBub3QgY29ycmVjdGx5IGJvdW5kLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICAvLyBEeW5hbWljIGRlcHRoIGJpYXMKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJEeW5hbWljIGRlcHRoIGJpYXMgc3RhdGUgbm90IHNldCBmb3IgdGhpcyBjb21tYW5kIGJ1ZmZlciIpOworICAgIFZLVHJpYW5nbGVUZXN0KEJzb0ZhaWxEZXB0aEJpYXMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIER5bmFtaWNMaW5lV2lkdGhOb3RCb3VuZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJSdW4gYSBzaW1wbGUgZHJhdyBjYWxscyB0byB2YWxpZGF0ZSBmYWlsdXJlIHdoZW4gTGluZSBXaWR0aCBkeW5hbWljIHN0YXRlIGlzIHJlcXVpcmVkIGJ1dCBub3QgY29ycmVjdGx5IGJvdW5kLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICAvLyBEeW5hbWljIGxpbmUgd2lkdGgKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJEeW5hbWljIGxpbmUgd2lkdGggc3RhdGUgbm90IHNldCBmb3IgdGhpcyBjb21tYW5kIGJ1ZmZlciIpOworICAgIFZLVHJpYW5nbGVUZXN0KEJzb0ZhaWxMaW5lV2lkdGgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIER5bmFtaWNMaW5lU3RpcHBsZU5vdEJvdW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlJ1biBhIHNpbXBsZSBkcmF3IGNhbGxzIHRvIHZhbGlkYXRlIGZhaWx1cmUgd2hlbiBMaW5lIFN0aXBwbGUgZHluYW1pYyBzdGF0ZSBpcyByZXF1aXJlZCBidXQgbm90IGNvcnJlY3RseSBib3VuZC4iKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBzdGQ6OmFycmF5PGNvbnN0IGNoYXIgKiwgMT4gcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMgPSB7e1ZLX0VYVF9MSU5FX1JBU1RFUklaQVRJT05fRVhURU5TSU9OX05BTUV9fTsKKyAgICBmb3IgKGF1dG8gZGV2aWNlX2V4dGVuc2lvbiA6IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zKSB7CisgICAgICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIGRldmljZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKGRldmljZV9leHRlbnNpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgYXV0byBsaW5lX3Jhc3Rlcml6YXRpb25fZmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUxpbmVSYXN0ZXJpemF0aW9uRmVhdHVyZXNFWFQ+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmxpbmVfcmFzdGVyaXphdGlvbl9mZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisKKyAgICBpZiAoIWxpbmVfcmFzdGVyaXphdGlvbl9mZWF0dXJlcy5zdGlwcGxlZEJyZXNlbmhhbUxpbmVzIHx8ICFsaW5lX3Jhc3Rlcml6YXRpb25fZmVhdHVyZXMuYnJlc2VuaGFtTGluZXMpIHsKKyAgICAgICAgcHJpbnRmKCIlc1N0aXBwbGUgQnJlc2VuaGFtIGxpbmVzIG5vdCBzdXBwb3J0ZWQ7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMiwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWMgbGluZSBzdGlwcGxlIHN0YXRlIG5vdCBzZXQgZm9yIHRoaXMgY29tbWFuZCBidWZmZXIiKTsKKyAgICBWS1RyaWFuZ2xlVGVzdChCc29GYWlsTGluZVN0aXBwbGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIER5bmFtaWNWaWV3cG9ydE5vdEJvdW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlJ1biBhIHNpbXBsZSBkcmF3IGNhbGxzIHRvIHZhbGlkYXRlIGZhaWx1cmUgd2hlbiBWaWV3cG9ydCBkeW5hbWljIHN0YXRlIGlzIHJlcXVpcmVkIGJ1dCBub3QgY29ycmVjdGx5IGJvdW5kLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICAvLyBEeW5hbWljIHZpZXdwb3J0IHN0YXRlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHluYW1pYyB2aWV3cG9ydChzKSAwIGFyZSB1c2VkIGJ5IHBpcGVsaW5lIHN0YXRlIG9iamVjdCwgYnV0IHdlcmUgbm90IHByb3ZpZGVkIik7CisgICAgVktUcmlhbmdsZVRlc3QoQnNvRmFpbFZpZXdwb3J0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBEeW5hbWljU2Npc3Nvck5vdEJvdW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUnVuIGEgc2ltcGxlIGRyYXcgY2FsbHMgdG8gdmFsaWRhdGUgZmFpbHVyZSB3aGVuIFNjaXNzb3IgZHluYW1pYyBzdGF0ZSBpcyByZXF1aXJlZCBidXQgbm90IGNvcnJlY3RseSBib3VuZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgLy8gRHluYW1pYyBzY2lzc29yIHN0YXRlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHluYW1pYyBzY2lzc29yKHMpIDAgYXJlIHVzZWQgYnkgcGlwZWxpbmUgc3RhdGUgb2JqZWN0LCBidXQgd2VyZSBub3QgcHJvdmlkZWQiKTsKKyAgICBWS1RyaWFuZ2xlVGVzdChCc29GYWlsU2Npc3Nvcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRHluYW1pY0JsZW5kQ29uc3RhbnRzTm90Qm91bmQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiUnVuIGEgc2ltcGxlIGRyYXcgY2FsbHMgdG8gdmFsaWRhdGUgZmFpbHVyZSB3aGVuIEJsZW5kIENvbnN0YW50cyBkeW5hbWljIHN0YXRlIGlzIHJlcXVpcmVkIGJ1dCBub3QgY29ycmVjdGx5IGJvdW5kLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICAvLyBEeW5hbWljIGJsZW5kIGNvbnN0YW50IHN0YXRlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHluYW1pYyBibGVuZCBjb25zdGFudHMgc3RhdGUgbm90IHNldCBmb3IgdGhpcyBjb21tYW5kIGJ1ZmZlciIpOworICAgIFZLVHJpYW5nbGVUZXN0KEJzb0ZhaWxCbGVuZCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRHluYW1pY0RlcHRoQm91bmRzTm90Qm91bmQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiUnVuIGEgc2ltcGxlIGRyYXcgY2FsbHMgdG8gdmFsaWRhdGUgZmFpbHVyZSB3aGVuIERlcHRoIEJvdW5kcyBkeW5hbWljIHN0YXRlIGlzIHJlcXVpcmVkIGJ1dCBub3QgY29ycmVjdGx5IGJvdW5kLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLmRlcHRoQm91bmRzKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgZGVwdGhCb3VuZHMgdGVzdDsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBEeW5hbWljIGRlcHRoIGJvdW5kcworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWMgZGVwdGggYm91bmRzIHN0YXRlIG5vdCBzZXQgZm9yIHRoaXMgY29tbWFuZCBidWZmZXIiKTsKKyAgICBWS1RyaWFuZ2xlVGVzdChCc29GYWlsRGVwdGhCb3VuZHMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIER5bmFtaWNTdGVuY2lsUmVhZE5vdEJvdW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlJ1biBhIHNpbXBsZSBkcmF3IGNhbGxzIHRvIHZhbGlkYXRlIGZhaWx1cmUgd2hlbiBTdGVuY2lsIFJlYWQgZHluYW1pYyBzdGF0ZSBpcyByZXF1aXJlZCBidXQgbm90IGNvcnJlY3RseSBib3VuZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgLy8gRHluYW1pYyBzdGVuY2lsIHJlYWQgbWFzaworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWMgc3RlbmNpbCByZWFkIG1hc2sgc3RhdGUgbm90IHNldCBmb3IgdGhpcyBjb21tYW5kIGJ1ZmZlciIpOworICAgIFZLVHJpYW5nbGVUZXN0KEJzb0ZhaWxTdGVuY2lsUmVhZE1hc2spOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIER5bmFtaWNTdGVuY2lsV3JpdGVOb3RCb3VuZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJSdW4gYSBzaW1wbGUgZHJhdyBjYWxscyB0byB2YWxpZGF0ZSBmYWlsdXJlIHdoZW4gU3RlbmNpbCBXcml0ZSBkeW5hbWljIHN0YXRlIGlzIHJlcXVpcmVkIGJ1dCBub3QgY29ycmVjdGx5IGJvdW5kLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICAvLyBEeW5hbWljIHN0ZW5jaWwgd3JpdGUgbWFzaworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWMgc3RlbmNpbCB3cml0ZSBtYXNrIHN0YXRlIG5vdCBzZXQgZm9yIHRoaXMgY29tbWFuZCBidWZmZXIiKTsKKyAgICBWS1RyaWFuZ2xlVGVzdChCc29GYWlsU3RlbmNpbFdyaXRlTWFzayk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRHluYW1pY1N0ZW5jaWxSZWZOb3RCb3VuZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJSdW4gYSBzaW1wbGUgZHJhdyBjYWxscyB0byB2YWxpZGF0ZSBmYWlsdXJlIHdoZW4gU3RlbmNpbCBSZWYgZHluYW1pYyBzdGF0ZSBpcyByZXF1aXJlZCBidXQgbm90IGNvcnJlY3RseSBib3VuZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgLy8gRHluYW1pYyBzdGVuY2lsIHJlZmVyZW5jZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR5bmFtaWMgc3RlbmNpbCByZWZlcmVuY2Ugc3RhdGUgbm90IHNldCBmb3IgdGhpcyBjb21tYW5kIGJ1ZmZlciIpOworICAgIFZLVHJpYW5nbGVUZXN0KEJzb0ZhaWxTdGVuY2lsUmVmZXJlbmNlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbmRleEJ1ZmZlck5vdEJvdW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUnVuIGFuIGluZGV4ZWQgZHJhdyBjYWxsIHdpdGhvdXQgYW4gaW5kZXggYnVmZmVyIGJvdW5kLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRleCBidWZmZXIgb2JqZWN0IG5vdCBib3VuZCB0byB0aGlzIGNvbW1hbmQgYnVmZmVyIHdoZW4gSW5kZXhlZCAiKTsKKyAgICBWS1RyaWFuZ2xlVGVzdChCc29GYWlsSW5kZXhCdWZmZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEluZGV4QnVmZmVyQmFkU2l6ZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlJ1biBpbmRleGVkIGRyYXcgY2FsbCB3aXRoIGJhZCBpbmRleCBidWZmZXIgc2l6ZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJ2a0NtZERyYXdJbmRleGVkKCkgaW5kZXggc2l6ZSAiKTsKKyAgICBWS1RyaWFuZ2xlVGVzdChCc29GYWlsSW5kZXhCdWZmZXJCYWRTaXplKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbmRleEJ1ZmZlckJhZE9mZnNldCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlJ1biBpbmRleGVkIGRyYXcgY2FsbCB3aXRoIGJhZCBpbmRleCBidWZmZXIgb2Zmc2V0LiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdChudWxscHRyLCBudWxscHRyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgInZrQ21kRHJhd0luZGV4ZWQoKSBpbmRleCBzaXplICIpOworICAgIFZLVHJpYW5nbGVUZXN0KEJzb0ZhaWxJbmRleEJ1ZmZlckJhZE9mZnNldCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW5kZXhCdWZmZXJCYWRCaW5kU2l6ZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlJ1biBiaW5kIGluZGV4IGJ1ZmZlciB3aXRoIGEgc2l6ZSBncmVhdGVyIHRoYW4gdGhlIGluZGV4IGJ1ZmZlci4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJ2a0NtZERyYXdJbmRleGVkKCkgaW5kZXggc2l6ZSAiKTsKKyAgICBWS1RyaWFuZ2xlVGVzdChCc29GYWlsSW5kZXhCdWZmZXJCYWRNYXBTaXplKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbmRleEJ1ZmZlckJhZEJpbmRPZmZzZXQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJSdW4gYmluZCBpbmRleCBidWZmZXIgd2l0aCBhbiBvZmZzZXQgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBpbmRleCBidWZmZXIuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KG51bGxwdHIsIG51bGxwdHIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAidmtDbWREcmF3SW5kZXhlZCgpIGluZGV4IHNpemUgIik7CisgICAgVktUcmlhbmdsZVRlc3QoQnNvRmFpbEluZGV4QnVmZmVyQmFkTWFwT2Zmc2V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNaXNzaW5nQ2xlYXJBdHRhY2htZW50KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUG9pbnRzIHRvIGEgd3JvbmcgY29sb3JBdHRhY2htZW50IGluZGV4IGluIGEgVmtDbGVhckF0dGFjaG1lbnQgc3RydWN0dXJlIHBhc3NlZCB0byB2a0NtZENsZWFyQXR0YWNobWVudHMiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLWFzcGVjdE1hc2stMDI1MDEiKTsKKworICAgIFZLVHJpYW5nbGVUZXN0KEJzb0ZhaWxDbWRDbGVhckF0dGFjaG1lbnRzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTZWNvbmRhcnlDb21tYW5kYnVmZmVyQXNQcmltYXJ5KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyIGFuZCBwYXNzIGl0IHRvIFF1ZXVlU3VibWl0LiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtTdWJtaXRJbmZvLXBDb21tYW5kQnVmZmVycy0wMDA3NSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBzZWNvbmRhcnkobV9kZXZpY2UsIG1fY29tbWFuZFBvb2wsIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSk7CisgICAgc2Vjb25kYXJ5LmJlZ2luKCk7CisgICAgc2Vjb25kYXJ5LkNsZWFyQWxsQnVmZmVycyhtX3JlbmRlclRhcmdldHMsIG1fY2xlYXJfY29sb3IsIG51bGxwdHIsIG1fZGVwdGhfY2xlYXJfY29sb3IsIG1fc3RlbmNpbF9jbGVhcl9jb2xvcik7CisgICAgc2Vjb25kYXJ5LmVuZCgpOworCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvOworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8ucE5leHQgPSBOVUxMOworICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gTlVMTDsKKyAgICBzdWJtaXRfaW5mby5wV2FpdERzdFN0YWdlTWFzayA9IE5VTEw7CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmc2Vjb25kYXJ5LmhhbmRsZSgpOworICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEw7CisKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvbW1hbmRCdWZmZXJUd29TdWJtaXRzKSB7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FzIGJlZ3VuIHcvIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQgc2V0LCBidXQgaGFzIGJlZW4gc3VibWl0dGVkIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gV2UgbHVjayBvdXQgYi9jIGJ5IGRlZmF1bHQgdGhlIGZyYW1ld29yayBjcmVhdGVzIENCIHcvIHRoZQorICAgIC8vIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQgc2V0CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q2xlYXJBbGxCdWZmZXJzKG1fcmVuZGVyVGFyZ2V0cywgbV9jbGVhcl9jb2xvciwgbnVsbHB0ciwgbV9kZXB0aF9jbGVhcl9jb2xvciwgbV9zdGVuY2lsX2NsZWFyX2NvbG9yKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgLy8gQnlwYXNzIGZyYW1ld29yayBzaW5jZSBpdCBkb2VzIHRoZSB3YWl0cyBhdXRvbWF0aWNhbGx5CisgICAgVmtSZXN1bHQgZXJyID0gVktfU1VDQ0VTUzsKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm87CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZXMgPSBOVUxMOworICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gTlVMTDsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEw7CisKKyAgICBlcnIgPSB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworCisgICAgLy8gQ2F1c2UgdmFsaWRhdGlvbiBlcnJvciBieSByZS1zdWJtaXR0aW5nIGNtZCBidWZmZXIgdGhhdCBzaG91bGQgb25seSBiZQorICAgIC8vIHN1Ym1pdHRlZCBvbmNlCisgICAgZXJyID0gdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkUHVzaENvbnN0YW50cykgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1BpcGVsaW5lTGF5b3V0IHBpcGVsaW5lX2xheW91dDsKKyAgICBWa1B1c2hDb25zdGFudFJhbmdlIHBjX3JhbmdlID0ge307CisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGlwZWxpbmVfbGF5b3V0X2NpID0ge307CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5wdXNoQ29uc3RhbnRSYW5nZUNvdW50ID0gMTsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2kucFB1c2hDb25zdGFudFJhbmdlcyA9ICZwY19yYW5nZTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgcHVzaCBjb25zdGFudCByYW5nZXMgaW4gcGlwZWxpbmUgbGF5b3V0cy4KKyAgICAvLworICAgIHN0cnVjdCBQaXBlbGluZUxheW91dFRlc3RDYXNlIHsKKyAgICAgICAgVmtQdXNoQ29uc3RhbnRSYW5nZSBjb25zdCByYW5nZTsKKyAgICAgICAgY2hhciBjb25zdCAqbXNnOworICAgIH07CisKKyAgICBjb25zdCB1aW50MzJfdCB0b29fYmlnID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhQdXNoQ29uc3RhbnRzU2l6ZSArIDB4NDsKKyAgICBjb25zdCBzdGQ6OmFycmF5PFBpcGVsaW5lTGF5b3V0VGVzdENhc2UsIDEwPiByYW5nZV90ZXN0cyA9IHt7CisgICAgICAgIHt7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDAsIDB9LCAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4IDAgd2l0aCBzaXplIDAuIn0sCisgICAgICAgIHt7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDAsIDF9LCAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4IDAgd2l0aCBzaXplIDEuIn0sCisgICAgICAgIHt7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDQsIDF9LCAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4IDAgd2l0aCBzaXplIDEuIn0sCisgICAgICAgIHt7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDQsIDB9LCAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4IDAgd2l0aCBzaXplIDAuIn0sCisgICAgICAgIHt7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDEsIDR9LCAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4IDAgd2l0aCBvZmZzZXQgMS4gT2Zmc2V0IG11c3QifSwKKyAgICAgICAge3tWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgMCwgdG9vX2JpZ30sICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCkgY2FsbCBoYXMgcHVzaCBjb25zdGFudHMgaW5kZXggMCB3aXRoIG9mZnNldCAifSwKKyAgICAgICAge3tWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdG9vX2JpZywgdG9vX2JpZ30sICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCkgY2FsbCBoYXMgcHVzaCBjb25zdGFudHMgaW5kZXggMCB3aXRoIG9mZnNldCAifSwKKyAgICAgICAge3tWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdG9vX2JpZywgNH0sICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCkgY2FsbCBoYXMgcHVzaCBjb25zdGFudHMgaW5kZXggMCB3aXRoIG9mZnNldCAifSwKKyAgICAgICAge3tWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgMHhGRkZGRkZGMCwgMHgwMDAwMDAyMH0sCisgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIGNhbGwgaGFzIHB1c2ggY29uc3RhbnRzIGluZGV4IDAgd2l0aCBvZmZzZXQgIn0sCisgICAgICAgIHt7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDB4MDAwMDAwMjAsIDB4RkZGRkZGRjB9LAorICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKSBjYWxsIGhhcyBwdXNoIGNvbnN0YW50cyBpbmRleCAwIHdpdGggb2Zmc2V0ICJ9LAorICAgIH19OworCisgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgb2Zmc2V0IGFuZCBzaXplCisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogcmFuZ2VfdGVzdHMpIHsKKyAgICAgICAgcGNfcmFuZ2UgPSBpdGVyLnJhbmdlOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGl0ZXIubXNnKTsKKyAgICAgICAgdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHN0YWdlIGZsYWcKKyAgICBwY19yYW5nZS5vZmZzZXQgPSAwOworICAgIHBjX3JhbmdlLnNpemUgPSAxNjsKKyAgICBwY19yYW5nZS5zdGFnZUZsYWdzID0gMDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dDogdmFsdWUgb2YgcENyZWF0ZUluZm8tPnBQdXNoQ29uc3RhbnRSYW5nZXNbMF0uc3RhZ2VGbGFncyBtdXN0IG5vdCBiZSAwIik7CisgICAgdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIHN0YWdlIGZsYWdzIGluIGEgbGlzdCBvZiBwdXNoIGNvbnN0YW50IHJhbmdlcy4KKyAgICAvLyBBIHNoYWRlciBjYW4gb25seSBoYXZlIG9uZSBwdXNoIGNvbnN0YW50IGJsb2NrIGFuZCB0aGF0IGJsb2NrIGlzIG1hcHBlZAorICAgIC8vIHRvIHRoZSBwdXNoIGNvbnN0YW50IHJhbmdlIHRoYXQgaGFzIHRoYXQgc2hhZGVyJ3Mgc3RhZ2UgZmxhZyBzZXQuCisgICAgLy8gVGhlIHNoYWRlcidzIHN0YWdlIGZsYWcgY2FuIG9ubHkgYXBwZWFyIG9uY2UgaW4gYWxsIHRoZSByYW5nZXMsIHNvIHRoZQorICAgIC8vIGltcGxlbWVudGF0aW9uIGNhbiBmaW5kIHRoZSBvbmUgYW5kIG9ubHkgcmFuZ2UgdG8gbWFwIGl0IHRvLgorICAgIGNvbnN0IHVpbnQzMl90IHJhbmdlc19wZXJfdGVzdCA9IDU7CisgICAgc3RydWN0IER1cGxpY2F0ZVN0YWdlRmxhZ3NUZXN0Q2FzZSB7CisgICAgICAgIFZrUHVzaENvbnN0YW50UmFuZ2UgY29uc3QgcmFuZ2VzW3Jhbmdlc19wZXJfdGVzdF07CisgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXIgY29uc3QgKj4gY29uc3QgbXNnOworICAgIH07CisgICAgLy8gT3ZlcmxhcHBpbmcgcmFuZ2VzIGFyZSBPSywgYnV0IGEgc3RhZ2UgZmxhZyBjYW4gYXBwZWFyIG9ubHkgb25jZS4KKyAgICBjb25zdCBzdGQ6OmFycmF5PER1cGxpY2F0ZVN0YWdlRmxhZ3NUZXN0Q2FzZSwgMz4gZHVwbGljYXRlX3N0YWdlRmxhZ3NfdGVzdHMgPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHt7e1ZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCAwLCA0fSwKKyAgICAgICAgICAgICAge1ZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCAwLCA0fSwKKyAgICAgICAgICAgICAge1ZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCAwLCA0fSwKKyAgICAgICAgICAgICAge1ZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCAwLCA0fSwKKyAgICAgICAgICAgICAge1ZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCAwLCA0fX0sCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMCBhbmQgMS4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMCBhbmQgMi4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMCBhbmQgMy4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMCBhbmQgNC4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMSBhbmQgMi4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMSBhbmQgMy4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMSBhbmQgNC4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMiBhbmQgMy4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMiBhbmQgNC4iLAorICAgICAgICAgICAgICAgICAidmtDcmVhdGVQaXBlbGluZUxheW91dCgpIER1cGxpY2F0ZSBzdGFnZSBmbGFncyBmb3VuZCBpbiByYW5nZXMgMyBhbmQgNC4iLAorICAgICAgICAgICAgIH19LAorICAgICAgICAgICAge3t7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDAsIDR9LAorICAgICAgICAgICAgICB7VktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCwgMCwgNH0sCisgICAgICAgICAgICAgIHtWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCAwLCA0fSwKKyAgICAgICAgICAgICAge1ZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCAwLCA0fSwKKyAgICAgICAgICAgICAge1ZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQsIDAsIDR9fSwKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCkgRHVwbGljYXRlIHN0YWdlIGZsYWdzIGZvdW5kIGluIHJhbmdlcyAwIGFuZCAzLiIsCisgICAgICAgICAgICAgICAgICJ2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KCkgRHVwbGljYXRlIHN0YWdlIGZsYWdzIGZvdW5kIGluIHJhbmdlcyAxIGFuZCA0LiIsCisgICAgICAgICAgICAgfX0sCisgICAgICAgICAgICB7e3tWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCAwLCA0fSwKKyAgICAgICAgICAgICAge1ZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQsIDAsIDR9LAorICAgICAgICAgICAgICB7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDAsIDR9LAorICAgICAgICAgICAgICB7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDAsIDR9LAorICAgICAgICAgICAgICB7VktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCwgMCwgNH19LAorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgInZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoKSBEdXBsaWNhdGUgc3RhZ2UgZmxhZ3MgZm91bmQgaW4gcmFuZ2VzIDIgYW5kIDMuIiwKKyAgICAgICAgICAgICB9fSwKKyAgICAgICAgfSwKKyAgICB9OworCisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogZHVwbGljYXRlX3N0YWdlRmxhZ3NfdGVzdHMpIHsKKyAgICAgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnBQdXNoQ29uc3RhbnRSYW5nZXMgPSBpdGVyLnJhbmdlczsKKyAgICAgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnB1c2hDb25zdGFudFJhbmdlQ291bnQgPSByYW5nZXNfcGVyX3Rlc3Q7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgaXRlci5tc2cuYmVnaW4oKSwgaXRlci5tc2cuZW5kKCkpOworICAgICAgICB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDbWRQdXNoQ29uc3RhbnRzIHRlc3RzCisgICAgLy8KKworICAgIC8vIFNldHVwIGEgcGlwZWxpbmUgbGF5b3V0IHdpdGggcmFuZ2VzOiBbMCwzMikgWzE2LDgwKQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFZrUHVzaENvbnN0YW50UmFuZ2U+IHBjX3JhbmdlMiA9IHt7VktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDE2LCA2NH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCAwLCAzMn19OworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0X29iaihtX2RldmljZSwge30sIHBjX3JhbmdlMik7CisKKyAgICBjb25zdCB1aW50OF90IGR1bW15X3ZhbHVlc1sxMDBdID0ge307CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHN0YWdlIGZsYWcKKyAgICAvLyBOb3RlIHRoYXQgVlUgMDA5OTYgaXNuJ3QgcmVhY2hlZCBkdWUgdG8gcGFyYW1ldGVyIHZhbGlkYXRpb24KKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJ2a0NtZFB1c2hDb25zdGFudHM6IHZhbHVlIG9mIHN0YWdlRmxhZ3MgbXVzdCBub3QgYmUgMCIpOworICAgIHZrOjpDbWRQdXNoQ29uc3RhbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHBpcGVsaW5lX2xheW91dF9vYmouaGFuZGxlKCksIDAsIDAsIDE2LCBkdW1teV92YWx1ZXMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gUG9zaXRpdmUgdGVzdHMgZm9yIHRoZSBvdmVybGFwcGluZyByYW5nZXMKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpDbWRQdXNoQ29uc3RhbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHBpcGVsaW5lX2xheW91dF9vYmouaGFuZGxlKCksIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIDAsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15X3ZhbHVlcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6Q21kUHVzaENvbnN0YW50cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBwaXBlbGluZV9sYXlvdXRfb2JqLmhhbmRsZSgpLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgMzIsIDQ4LCBkdW1teV92YWx1ZXMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OkNtZFB1c2hDb25zdGFudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcGlwZWxpbmVfbGF5b3V0X29iai5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCB8IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIDE2LCAxNiwgZHVtbXlfdmFsdWVzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIFdyb25nIGNtZCBzdGFnZXMgZm9yIGV4dGFudCByYW5nZQorICAgIC8vIE5vIHJhbmdlIGZvciBhbGwgY21kIHN0YWdlcyAtLSAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtb2Zmc2V0LTAxNzk1IiBWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTUiKTsKKyAgICAvLyBNaXNzaW5nIGNtZCBzdGFnZXMgZm9yIGZvdW5kIG92ZXJsYXBwaW5nIHJhbmdlIC0tICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTYiIFZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMTc5NgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQdXNoQ29uc3RhbnRzLW9mZnNldC0wMTc5NiIpOworICAgIHZrOjpDbWRQdXNoQ29uc3RhbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHBpcGVsaW5lX2xheW91dF9vYmouaGFuZGxlKCksIFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQsIDAsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15X3ZhbHVlcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBXcm9uZyBubyBleHRhbnQgcmFuZ2UKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUHVzaENvbnN0YW50cy1vZmZzZXQtMDE3OTUiKTsKKyAgICB2azo6Q21kUHVzaENvbnN0YW50cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBwaXBlbGluZV9sYXlvdXRfb2JqLmhhbmRsZSgpLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCA4MCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teV92YWx1ZXMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gV3Jvbmcgb3ZlcmxhcHBpbmcgZXh0ZW50CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtb2Zmc2V0LTAxNzk1Iik7CisgICAgdms6OkNtZFB1c2hDb25zdGFudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcGlwZWxpbmVfbGF5b3V0X29iai5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCB8IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIDAsIDIwLCBkdW1teV92YWx1ZXMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gV3Jvbmcgc3RhZ2UgZmxhZ3MgZm9yIHZhbGlkIG92ZXJsYXBwaW5nIHJhbmdlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFB1c2hDb25zdGFudHMtb2Zmc2V0LTAxNzk2Iik7CisgICAgdms6OkNtZFB1c2hDb25zdGFudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcGlwZWxpbmVfbGF5b3V0X29iai5oYW5kbGUoKSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIDE2LCAxNiwgZHVtbXlfdmFsdWVzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgTm9CZWdpbkNvbW1hbmRCdWZmZXIpIHsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBjYWxsIHZrQmVnaW5Db21tYW5kQnVmZmVyKCkgYmVmb3JlIHRoaXMgY2FsbCB0byAiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRCdWZmZXIobV9kZXZpY2UsIG1fY29tbWFuZFBvb2wpOworICAgIC8vIENhbGwgRW5kQ29tbWFuZEJ1ZmZlcigpIHcvbyBjYWxsaW5nIEJlZ2luQ29tbWFuZEJ1ZmZlcigpCisgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlci5oYW5kbGUoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTZWNvbmRhcnlDb21tYW5kQnVmZmVyTnVsbFJlbmRlcnBhc3MpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNiKG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sLCBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpOworCisgICAgLy8gRm9yY2UgdGhlIGZhaWx1cmUgYnkgbm90IHNldHRpbmcgdGhlIFJlbmRlcnBhc3MgYW5kIEZyYW1lYnVmZmVyIGZpZWxkcworICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBjbWRfYnVmX2hpbmZvID0ge307CisgICAgY21kX2J1Zl9oaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk87CisKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY21kX2J1Zl9pbmZvID0ge307CisgICAgY21kX2J1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICBjbWRfYnVmX2luZm8ucE5leHQgPSBOVUxMOworICAgIGNtZF9idWZfaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQgfCBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQ7CisgICAgY21kX2J1Zl9pbmZvLnBJbmhlcml0YW5jZUluZm8gPSAmY21kX2J1Zl9oaW5mbzsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvLWZsYWdzLTAwMDUzIik7CisgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihjYi5oYW5kbGUoKSwgJmNtZF9idWZfaW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU2Vjb25kYXJ5Q29tbWFuZEJ1ZmZlclJlcmVjb3JkZWRFeHBsaWNpdFJlc2V0KSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIndhcyBkZXN0cm95ZWQgb3IgcmVyZWNvcmRlZCIpOworCisgICAgLy8gQSBwb29sIHdlIGNhbiByZXNldCBpbi4KKyAgICBWa0NvbW1hbmRQb29sT2JqIHBvb2wobV9kZXZpY2UsIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XywgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpOworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBzZWNvbmRhcnkobV9kZXZpY2UsICZwb29sLCBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpOworCisgICAgc2Vjb25kYXJ5LmJlZ2luKCk7CisgICAgc2Vjb25kYXJ5LmVuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY29uZGFyeS5oYW5kbGUoKSk7CisKKyAgICAvLyByZXJlY29yZGluZyBvZiBzZWNvbmRhcnkKKyAgICBzZWNvbmRhcnkucmVzZXQoKTsgIC8vIGV4cGxpY2l0IHJlc2V0IGhlcmUuCisgICAgc2Vjb25kYXJ5LmJlZ2luKCk7CisgICAgc2Vjb25kYXJ5LmVuZCgpOworCisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmc2Vjb25kYXJ5LmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTZWNvbmRhcnlDb21tYW5kQnVmZmVyUmVyZWNvcmRlZE5vUmVzZXQpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAid2FzIGRlc3Ryb3llZCBvciByZXJlY29yZGVkIik7CisKKyAgICAvLyBBIHBvb2wgd2UgY2FuIHJlc2V0IGluLgorICAgIFZrQ29tbWFuZFBvb2xPYmogcG9vbChtX2RldmljZSwgbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIHNlY29uZGFyeShtX2RldmljZSwgJnBvb2wsIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSk7CisKKyAgICBzZWNvbmRhcnkuYmVnaW4oKTsKKyAgICBzZWNvbmRhcnkuZW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmc2Vjb25kYXJ5LmhhbmRsZSgpKTsKKworICAgIC8vIHJlcmVjb3JkaW5nIG9mIHNlY29uZGFyeQorICAgIHNlY29uZGFyeS5iZWdpbigpOyAgLy8gaW1wbGljaXQgcmVzZXQgaW4gYmVnaW4KKyAgICBzZWNvbmRhcnkuZW5kKCk7CisKKyAgICB2azo6Q21kRXhlY3V0ZUNvbW1hbmRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZzZWNvbmRhcnkuaGFuZGxlKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENhc2NhZGVkSW52YWxpZGF0aW9uKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrRXZlbnRDcmVhdGVJbmZvIGVjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMH07CisgICAgVmtFdmVudCBldmVudDsKKyAgICB2azo6Q3JlYXRlRXZlbnQobV9kZXZpY2UtPmRldmljZSgpLCAmZWNpLCBudWxscHRyLCAmZXZlbnQpOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIHNlY29uZGFyeShtX2RldmljZSwgbV9jb21tYW5kUG9vbCwgVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZKTsKKyAgICBzZWNvbmRhcnkuYmVnaW4oKTsKKyAgICB2azo6Q21kU2V0RXZlbnQoc2Vjb25kYXJ5LmhhbmRsZSgpLCBldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklUKTsKKyAgICBzZWNvbmRhcnkuZW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmc2Vjb25kYXJ5LmhhbmRsZSgpKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgLy8gZGVzdHJveWluZyB0aGUgZXZlbnQgc2hvdWxkIGludmFsaWRhdGUgYm90aCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgQ0IKKyAgICB2azo6RGVzdHJveUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgZXZlbnQsIG51bGxwdHIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtFdmVudCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UXVldWVDb21tYW5kQnVmZmVyKGZhbHNlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb21tYW5kQnVmZmVyUmVzZXRFcnJvcnMpIHsKKyAgICAvLyBDYXVzZSBlcnJvciBkdWUgdG8gQmVnaW4gd2hpbGUgcmVjb3JkaW5nIENCCisgICAgLy8gVGhlbiBjYXVzZSAyIGVycm9ycyBmb3IgYXR0ZW1wdGluZyB0byByZXNldCBDQiB3L28gaGF2aW5nCisgICAgLy8gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQgc2V0IGZvciB0aGUgcG9vbCBmcm9tCisgICAgLy8gd2hpY2ggQ0JzIHdlcmUgYWxsb2NhdGVkLiBOb3RlIHRoYXQgdGhpcyBiaXQgaXMgb2ZmIGJ5IGRlZmF1bHQuCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0JlZ2luQ29tbWFuZEJ1ZmZlci1jb21tYW5kQnVmZmVyLTAwMDQ5Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQ2FsbHMgQWxsb2NhdGVDb21tYW5kQnVmZmVycworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjb21tYW5kQnVmZmVyKG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sKTsKKworICAgIC8vIEZvcmNlIHRoZSBmYWlsdXJlIGJ5IHNldHRpbmcgdGhlIFJlbmRlcnBhc3MgYW5kIEZyYW1lYnVmZmVyIGZpZWxkcyB3aXRoIChmYWtlKSBkYXRhCisgICAgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIGNtZF9idWZfaGluZm8gPSB7fTsKKyAgICBjbWRfYnVmX2hpbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTzsKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY21kX2J1Zl9pbmZvID0ge307CisgICAgY21kX2J1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICBjbWRfYnVmX2luZm8ucE5leHQgPSBOVUxMOworICAgIGNtZF9idWZfaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQ7CisgICAgY21kX2J1Zl9pbmZvLnBJbmhlcml0YW5jZUluZm8gPSAmY21kX2J1Zl9oaW5mbzsKKworICAgIC8vIEJlZ2luIENCIHRvIHRyYW5zaXRpb24gdG8gcmVjb3JkaW5nIHN0YXRlCisgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLmhhbmRsZSgpLCAmY21kX2J1Zl9pbmZvKTsKKyAgICAvLyBDYW4ndCByZS1iZWdpbi4gVGhpcyBzaG91bGQgdHJpZ2dlciBlcnJvcgorICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlci5oYW5kbGUoKSwgJmNtZF9idWZfaW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrUmVzZXRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNDYiKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzID0gMDsgIC8vIERvbid0IGNhcmUgYWJvdXQgZmxhZ3MgZm9yIHRoaXMgdGVzdAorICAgIC8vIFJlc2V0IGF0dGVtcHQgd2lsbCB0cmlnZ2VyIGVycm9yIGR1ZSB0byBpbmNvcnJlY3QgQ29tbWFuZFBvb2wgc3RhdGUKKyAgICB2azo6UmVzZXRDb21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIuaGFuZGxlKCksIGZsYWdzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtCZWdpbkNvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA1MCIpOworICAgIC8vIFRyYW5zaXRpb24gQ0IgdG8gUkVDT1JERUQgc3RhdGUKKyAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLmhhbmRsZSgpKTsKKyAgICAvLyBOb3cgYXR0ZW1wdGluZyB0byBCZWdpbiB3aWxsIGltcGxpY2l0bHkgcmVzZXQsIHdoaWNoIHRyaWdnZXJzIGVycm9yCisgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kQnVmZmVyLmhhbmRsZSgpLCAmY21kX2J1Zl9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDbGVhckNvbG9yQXR0YWNobWVudHNPdXRzaWRlUmVuZGVyUGFzcykgeworICAgIC8vIENhbGwgQ21kQ2xlYXJBdHRhY2htZW50c3Mgb3V0c2lkZSBvZiBhbiBhY3RpdmUgUmVuZGVyUGFzcworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDbGVhckF0dGFjaG1lbnRzKCk6IFRoaXMgY2FsbCBtdXN0IGJlIGlzc3VlZCBpbnNpZGUgYW4gYWN0aXZlIHJlbmRlciBwYXNzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBTdGFydCBubyBSZW5kZXJQYXNzCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgVmtDbGVhckF0dGFjaG1lbnQgY29sb3JfYXR0YWNobWVudDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzBdID0gMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlsxXSA9IDA7CisgICAgY29sb3JfYXR0YWNobWVudC5jbGVhclZhbHVlLmNvbG9yLmZsb2F0MzJbMl0gPSAwOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzNdID0gMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNvbG9yQXR0YWNobWVudCA9IDA7CisgICAgVmtDbGVhclJlY3QgY2xlYXJfcmVjdCA9IHt7ezAsIDB9LCB7MzIsIDMyfX0sIDAsIDF9OworICAgIHZrOjpDbWRDbGVhckF0dGFjaG1lbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZjb2xvcl9hdHRhY2htZW50LCAxLCAmY2xlYXJfcmVjdCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDbGVhckNvbG9yQXR0YWNobWVudHNaZXJvTGF5ZXJjb3VudCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNhbGwgQ21kQ2xlYXJBdHRhY2htZW50cyB3aXRoIGEgcFJlY3QgaGF2aW5nIGEgbGF5ZXJDb3VudCBvZiB6ZXJvLiIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtbGF5ZXJDb3VudC0wMTkzNCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8oKSwgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworCisgICAgVmtDbGVhckF0dGFjaG1lbnQgY29sb3JfYXR0YWNobWVudDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzBdID0gMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlsxXSA9IDA7CisgICAgY29sb3JfYXR0YWNobWVudC5jbGVhclZhbHVlLmNvbG9yLmZsb2F0MzJbMl0gPSAwOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzNdID0gMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNvbG9yQXR0YWNobWVudCA9IDA7CisgICAgVmtDbGVhclJlY3QgY2xlYXJfcmVjdCA9IHt7ezAsIDB9LCB7MzIsIDMyfX19OworICAgIHZrOjpDbWRDbGVhckF0dGFjaG1lbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZjb2xvcl9hdHRhY2htZW50LCAxLCAmY2xlYXJfcmVjdCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBFeGVjdXRlQ29tbWFuZHNQcmltYXJ5Q0IpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHZrQ21kRXhlY3V0ZUNvbW1hbmRzIHdpdGggYSBwcmltYXJ5IGNvbW1hbmQgYnVmZmVyIChzaG91bGQgb25seSBiZSBzZWNvbmRhcnkpIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBBbiBlbXB0eSBwcmltYXJ5IGNvbW1hbmQgYnVmZmVyCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNiKG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sKTsKKyAgICBjYi5iZWdpbigpOworICAgIGNiLmVuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8oKSwgVktfU1VCUEFTU19DT05URU5UU19TRUNPTkRBUllfQ09NTUFORF9CVUZGRVJTKTsKKyAgICBWa0NvbW1hbmRCdWZmZXIgaGFuZGxlID0gY2IuaGFuZGxlKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA4OCIpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJmhhbmRsZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJBbGwgZWxlbWVudHMgb2YgcENvbW1hbmRCdWZmZXJzIG11c3Qgbm90IGJlIGluIHRoZSBwZW5kaW5nIHN0YXRlIik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRWZXJ0ZXhBdHRyaWJ1dGVBbGlnbm1lbnQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDaGVjayBmb3IgcHJvcGVyIGFsaWdtZW50IG9mIGF0dHJpYkFkZHJlc3Mgd2hpY2ggZGVwZW5kcyBvbiBhIGJvdW5kIHBpcGVsaW5lIGFuZCBvbiBhIGJvdW5kIHZlcnRleCBidWZmZXIiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBpcGVsaW5lX2xheW91dChtX2RldmljZSk7CisKKyAgICBzdHJ1Y3QgVmJvRW50cnkgeworICAgICAgICB1aW50MTZfdCBpbnB1dDBbMl07CisgICAgICAgIHVpbnQzMl90IGlucHV0MTsKKyAgICAgICAgZmxvYXQgaW5wdXQyWzRdOworICAgIH07CisKKyAgICBjb25zdCB1bnNpZ25lZCB2Ym9fZW50cnlfY291bnQgPSAzOworICAgIGNvbnN0IFZib0VudHJ5IHZib19kYXRhW3Zib19lbnRyeV9jb3VudF0gPSB7fTsKKworICAgIFZrQ29uc3RhbnRCdWZmZXJPYmogdmJvKG1fZGV2aWNlLCBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihWYm9FbnRyeSkgKiB2Ym9fZW50cnlfY291bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCAqPih2Ym9fZGF0YSksIFZLX0JVRkZFUl9VU0FHRV9WRVJURVhfQlVGRkVSX0JJVCk7CisKKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIGlucHV0X2JpbmRpbmc7CisgICAgaW5wdXRfYmluZGluZy5iaW5kaW5nID0gMDsKKyAgICBpbnB1dF9iaW5kaW5nLnN0cmlkZSA9IHNpemVvZihWYm9FbnRyeSk7CisgICAgaW5wdXRfYmluZGluZy5pbnB1dFJhdGUgPSBWS19WRVJURVhfSU5QVVRfUkFURV9WRVJURVg7CisKKyAgICBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gaW5wdXRfYXR0cmlic1szXTsKKworICAgIGlucHV0X2F0dHJpYnNbMF0uYmluZGluZyA9IDA7CisgICAgLy8gTG9jYXRpb24gc3dpdGNoIGJldHdlZW4gYXR0cmliWzBdIGFuZCBhdHRyaWJbMV0gaXMgaW50ZW50aW9uYWwKKyAgICBpbnB1dF9hdHRyaWJzWzBdLmxvY2F0aW9uID0gMTsKKyAgICBpbnB1dF9hdHRyaWJzWzBdLmZvcm1hdCA9IFZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzI7CisgICAgaW5wdXRfYXR0cmlic1swXS5vZmZzZXQgPSBvZmZzZXRvZihWYm9FbnRyeSwgaW5wdXQxKTsKKworICAgIGlucHV0X2F0dHJpYnNbMV0uYmluZGluZyA9IDA7CisgICAgaW5wdXRfYXR0cmlic1sxXS5sb2NhdGlvbiA9IDA7CisgICAgaW5wdXRfYXR0cmlic1sxXS5mb3JtYXQgPSBWS19GT1JNQVRfUjE2RzE2X1VOT1JNOworICAgIGlucHV0X2F0dHJpYnNbMV0ub2Zmc2V0ID0gb2Zmc2V0b2YoVmJvRW50cnksIGlucHV0MCk7CisKKyAgICBpbnB1dF9hdHRyaWJzWzJdLmJpbmRpbmcgPSAwOworICAgIGlucHV0X2F0dHJpYnNbMl0ubG9jYXRpb24gPSAyOworICAgIGlucHV0X2F0dHJpYnNbMl0uZm9ybWF0ID0gVktfRk9STUFUX1IzMkczMkIzMkEzMl9TRkxPQVQ7CisgICAgaW5wdXRfYXR0cmlic1syXS5vZmZzZXQgPSBvZmZzZXRvZihWYm9FbnRyeSwgaW5wdXQyKTsKKworICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGlucHV0MDsiCisgICAgICAgICJsYXlvdXQobG9jYXRpb24gPSAxKSBpbiB2ZWM0IGlucHV0MTsiCisgICAgICAgICJsYXlvdXQobG9jYXRpb24gPSAyKSBpbiB2ZWM0IGlucHV0MjsiCisgICAgICAgICJcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSBpbnB1dDEgKyBpbnB1dDI7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbi54eSArPSBpbnB1dDA7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZTEobV9kZXZpY2UpOworICAgIHBpcGUxLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICBwaXBlMS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlMS5BZGRTaGFkZXIoJmZzKTsKKyAgICBwaXBlMS5BZGRWZXJ0ZXhJbnB1dEJpbmRpbmdzKCZpbnB1dF9iaW5kaW5nLCAxKTsKKyAgICBwaXBlMS5BZGRWZXJ0ZXhJbnB1dEF0dHJpYnMoJmlucHV0X2F0dHJpYnNbMF0sIDMpOworICAgIHBpcGUxLlNldFZpZXdwb3J0KG1fdmlld3BvcnRzKTsKKyAgICBwaXBlMS5TZXRTY2lzc29yKG1fc2Npc3NvcnMpOworICAgIHBpcGUxLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworCisgICAgaW5wdXRfYmluZGluZy5zdHJpZGUgPSA2OworCisgICAgVmtQaXBlbGluZU9iaiBwaXBlMihtX2RldmljZSk7CisgICAgcGlwZTIuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIHBpcGUyLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUyLkFkZFNoYWRlcigmZnMpOworICAgIHBpcGUyLkFkZFZlcnRleElucHV0QmluZGluZ3MoJmlucHV0X2JpbmRpbmcsIDEpOworICAgIHBpcGUyLkFkZFZlcnRleElucHV0QXR0cmlicygmaW5wdXRfYXR0cmlic1swXSwgMyk7CisgICAgcGlwZTIuU2V0Vmlld3BvcnQobV92aWV3cG9ydHMpOworICAgIHBpcGUyLlNldFNjaXNzb3IobV9zY2lzc29ycyk7CisgICAgcGlwZTIuQ3JlYXRlVktQaXBlbGluZShwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIHJlbmRlclBhc3MoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgIC8vIFRlc3Qgd2l0aCBpbnZhbGlkIGJ1ZmZlciBvZmZzZXQKKyAgICBWa0RldmljZVNpemUgb2Zmc2V0ID0gMTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUxLmhhbmRsZSgpKTsKKyAgICB2azo6Q21kQmluZFZlcnRleEJ1ZmZlcnMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnZiby5oYW5kbGUoKSwgJm9mZnNldCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiSW52YWxpZCBhdHRyaWJBZGRyZXNzIGFsaWdubWVudCBmb3IgdmVydGV4IGF0dHJpYnV0ZSAwIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiSW52YWxpZCBhdHRyaWJBZGRyZXNzIGFsaWdubWVudCBmb3IgdmVydGV4IGF0dHJpYnV0ZSAxIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiSW52YWxpZCBhdHRyaWJBZGRyZXNzIGFsaWdubWVudCBmb3IgdmVydGV4IGF0dHJpYnV0ZSAyIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gVGVzdCB3aXRoIGludmFsaWQgYnVmZmVyIHN0cmlkZQorICAgIG9mZnNldCA9IDA7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlMi5oYW5kbGUoKSk7CisgICAgdms6OkNtZEJpbmRWZXJ0ZXhCdWZmZXJzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2Ym8uaGFuZGxlKCksICZvZmZzZXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIkludmFsaWQgYXR0cmliQWRkcmVzcyBhbGlnbm1lbnQgZm9yIHZlcnRleCBhdHRyaWJ1dGUgMCIpOworICAgIC8vIEF0dHJpYnV0ZVsxXSBpcyBhbGlnbmVkIHByb3Blcmx5IGV2ZW4gd2l0aCBhIHdyb25nIHN0cmlkZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIkludmFsaWQgYXR0cmliQWRkcmVzcyBhbGlnbm1lbnQgZm9yIHZlcnRleCBhdHRyaWJ1dGUgMiIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgTm9uU2ltdWx0YW5lb3VzU2Vjb25kYXJ5TWFya3NQcmltYXJ5KSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBjb25zdCBjaGFyICpzaW11bHRhbmVvdXNfdXNlX21lc3NhZ2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXJTaW11bHRhbmVvdXNVc2UiOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIHNlY29uZGFyeShtX2RldmljZSwgbV9jb21tYW5kUG9vbCwgVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZKTsKKworICAgIHNlY29uZGFyeS5iZWdpbigpOworICAgIHNlY29uZGFyeS5lbmQoKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjYmJpID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPLAorICAgICAgICBudWxscHRyLAorICAgICAgICBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9TSU1VTFRBTkVPVVNfVVNFX0JJVCwKKyAgICAgICAgbnVsbHB0ciwKKyAgICB9OworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigmY2JiaSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIHNpbXVsdGFuZW91c191c2VfbWVzc2FnZSk7CisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmc2Vjb25kYXJ5LmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFNpbXVsdGFuZW91c1VzZVNlY29uZGFyeVR3b0V4ZWN1dGVzKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGNvbnN0IGNoYXIgKnNpbXVsdGFuZW91c191c2VfbWVzc2FnZSA9ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5MiI7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogc2Vjb25kYXJ5KG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sLCBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpOworCisgICAgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIGluaCA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTywKKyAgICAgICAgbnVsbHB0ciwKKyAgICB9OworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjYmJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sIG51bGxwdHIsIDAsICZpbmh9OworCisgICAgc2Vjb25kYXJ5LmJlZ2luKCZjYmJpKTsKKyAgICBzZWNvbmRhcnkuZW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmc2Vjb25kYXJ5LmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHNpbXVsdGFuZW91c191c2VfbWVzc2FnZSk7CisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmc2Vjb25kYXJ5LmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFNpbXVsdGFuZW91c1VzZVNlY29uZGFyeVNpbmdsZUV4ZWN1dGUpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gdmFyaWF0aW9uIG9uIHByZXZpb3VzIHRlc3QgZXhlY3V0aW5nIHRoZSBzYW1lIENCIHR3aWNlIGluIHRoZSBzYW1lCisgICAgLy8gQ21kRXhlY3V0ZUNvbW1hbmRzIGNhbGwKKworICAgIGNvbnN0IGNoYXIgKnNpbXVsdGFuZW91c191c2VfbWVzc2FnZSA9ICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5MyI7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogc2Vjb25kYXJ5KG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sLCBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpOworCisgICAgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIGluaCA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTywKKyAgICAgICAgbnVsbHB0ciwKKyAgICB9OworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjYmJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sIG51bGxwdHIsIDAsICZpbmh9OworCisgICAgc2Vjb25kYXJ5LmJlZ2luKCZjYmJpKTsKKyAgICBzZWNvbmRhcnkuZW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgVmtDb21tYW5kQnVmZmVyIGNic1tdID0ge3NlY29uZGFyeS5oYW5kbGUoKSwgc2Vjb25kYXJ5LmhhbmRsZSgpfTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHNpbXVsdGFuZW91c191c2VfbWVzc2FnZSk7CisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAyLCBjYnMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU2ltdWx0YW5lb3VzVXNlT25lU2hvdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlN1Ym1pdCB0aGUgc2FtZSBjb21tYW5kIGJ1ZmZlciB0d2ljZSBpbiBvbmUgc3VibWl0IGxvb2tpbmcgZm9yIHNpbXVsdGFuZW91cyB1c2UgYW5kIG9uZSB0aW1lIHN1Ym1pdCBlcnJvcnMiKTsKKyAgICBjb25zdCBjaGFyICpzaW11bHRhbmVvdXNfdXNlX21lc3NhZ2UgPSAiaXMgYWxyZWFkeSBpbiB1c2UgYW5kIGlzIG5vdCBtYXJrZWQgZm9yIHNpbXVsdGFuZW91cyB1c2UiOworICAgIGNvbnN0IGNoYXIgKm9uZV9zaG90X21lc3NhZ2UgPSAiVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfT05FX1RJTUVfU1VCTUlUX0JJVCBzZXQsIGJ1dCBoYXMgYmVlbiBzdWJtaXR0ZWQiOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgY21kX2J1ZnNbMl07CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGFsbG9jX2luZm87CisgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgYWxsb2NfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgYWxsb2NfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAyOworICAgIGFsbG9jX2luZm8uY29tbWFuZFBvb2wgPSBtX2NvbW1hbmRQb29sLT5oYW5kbGUoKTsKKyAgICBhbGxvY19pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCBjbWRfYnVmcyk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY2JfYmluZm87CisgICAgY2JfYmluZm8ucE5leHQgPSBOVUxMOworICAgIGNiX2JpbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICBjYl9iaW5mby5wSW5oZXJpdGFuY2VJbmZvID0gVktfTlVMTF9IQU5ETEU7CisgICAgY2JfYmluZm8uZmxhZ3MgPSAwOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZnNbMF0sICZjYl9iaW5mbyk7CisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChjbWRfYnVmc1swXSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihjbWRfYnVmc1swXSk7CisgICAgVmtDb21tYW5kQnVmZmVyIGR1cGxpY2F0ZXNbMl0gPSB7Y21kX2J1ZnNbMF0sIGNtZF9idWZzWzBdfTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMjsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSBkdXBsaWNhdGVzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgc2ltdWx0YW5lb3VzX3VzZV9tZXNzYWdlKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIC8vIFNldCBvbmUgdGltZSB1c2UgYW5kIG5vdyBsb29rIGZvciBvbmUgdGltZSBzdWJtaXQKKyAgICBkdXBsaWNhdGVzWzBdID0gZHVwbGljYXRlc1sxXSA9IGNtZF9idWZzWzFdOworICAgIGNiX2JpbmZvLmZsYWdzID0gVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQgfCBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZnNbMV0sICZjYl9iaW5mbyk7CisgICAgdms6OkNtZFNldFZpZXdwb3J0KGNtZF9idWZzWzFdLCAwLCAxLCAmdmlld3BvcnQpOworICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNtZF9idWZzWzFdKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG9uZV9zaG90X21lc3NhZ2UpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIERyYXdUaW1lSW1hZ2VWaWV3VHlwZU1pc21hdGNoV2l0aFBpcGVsaW5lKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCB3aGVuIGFuIGltYWdlIHZpZXcgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgZGltZW5zaW9uYWxpdHkgZGVjbGFyZWQgaW4gdGhlIHNoYWRlciIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAicmVxdWlyZXMgYW4gaW1hZ2UgdmlldyBvZiB0eXBlIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0wKSB1bmlmb3JtIHNhbXBsZXIzRCBzO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCB2ZWM0IGNvbG9yO1xuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICAgY29sb3IgPSB0ZXh0dXJlKHMsIHZlYzMoMCkpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgVmtQaXBlbGluZU9iaiBwaXBlKG1fZGV2aWNlKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisKKyAgICBWa1RleHR1cmVPYmogdGV4dHVyZShtX2RldmljZSwgbnVsbHB0cik7CisgICAgVmtTYW1wbGVyT2JqIHNhbXBsZXIobV9kZXZpY2UpOworCisgICAgVmtEZXNjcmlwdG9yU2V0T2JqIGRlc2NyaXB0b3JTZXQobV9kZXZpY2UpOworICAgIGRlc2NyaXB0b3JTZXQuQXBwZW5kU2FtcGxlclRleHR1cmUoJnNhbXBsZXIsICZ0ZXh0dXJlKTsKKyAgICBkZXNjcmlwdG9yU2V0LkNyZWF0ZVZLRGVzY3JpcHRvclNldChtX2NvbW1hbmRCdWZmZXIpOworCisgICAgVmtSZXN1bHQgZXJyID0gcGlwZS5DcmVhdGVWS1BpcGVsaW5lKGRlc2NyaXB0b3JTZXQuR2V0UGlwZWxpbmVMYXlvdXQoKSwgcmVuZGVyUGFzcygpKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUuaGFuZGxlKCkpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmluZERlc2NyaXB0b3JTZXQoZGVzY3JpcHRvclNldCk7CisKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAsIDAsIDE2LCAxNiwgMCwgMX07CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgVmtSZWN0MkQgc2Npc3NvciA9IHt7MCwgMH0sIHsxNiwgMTZ9fTsKKyAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmc2Npc3Nvcik7CisKKyAgICAvLyBlcnJvciBwcm9kdWNlZCBoZXJlLgorICAgIHZrOjpDbWREcmF3KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDMsIDEsIDAsIDApOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIERyYXdUaW1lSW1hZ2VNdWx0aXNhbXBsZU1pc21hdGNoV2l0aFBpcGVsaW5lKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCB3aGVuIGEgbXVsdGlzYW1wbGVkIGltYWdlcyBhcmUgY29uc3VtZWQgdmlhIHNpbmdsZXNhbXBsZSBpbWFnZXMgdHlwZXMgaW4gdGhlIHNoYWRlciwgb3IgIgorICAgICAgICAidmljZSB2ZXJzYS4iKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgInJlcXVpcmVzIGJvdW5kIGltYWdlIHRvIGhhdmUgbXVsdGlwbGUgc2FtcGxlcyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0wKSB1bmlmb3JtIHNhbXBsZXIyRE1TIHM7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICBjb2xvciA9IHRleGVsRmV0Y2gocywgaXZlYzIoMCksIDApO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgVmtQaXBlbGluZU9iaiBwaXBlKG1fZGV2aWNlKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisKKyAgICBWa1RleHR1cmVPYmogdGV4dHVyZShtX2RldmljZSwgbnVsbHB0cik7ICAvLyBUSElTIExJTkUgQ0FVU0VTIENSQVNIIE9OIE1BTEkKKyAgICBWa1NhbXBsZXJPYmogc2FtcGxlcihtX2RldmljZSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRPYmogZGVzY3JpcHRvclNldChtX2RldmljZSk7CisgICAgZGVzY3JpcHRvclNldC5BcHBlbmRTYW1wbGVyVGV4dHVyZSgmc2FtcGxlciwgJnRleHR1cmUpOworICAgIGRlc2NyaXB0b3JTZXQuQ3JlYXRlVktEZXNjcmlwdG9yU2V0KG1fY29tbWFuZEJ1ZmZlcik7CisKKyAgICBWa1Jlc3VsdCBlcnIgPSBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUoZGVzY3JpcHRvclNldC5HZXRQaXBlbGluZUxheW91dCgpLCByZW5kZXJQYXNzKCkpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CaW5kRGVzY3JpcHRvclNldChkZXNjcmlwdG9yU2V0KTsKKworICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MCwgMCwgMTYsIDE2LCAwLCAxfTsKKyAgICB2azo6Q21kU2V0Vmlld3BvcnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwgezE2LCAxNn19OworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZzY2lzc29yKTsKKworICAgIC8vIGVycm9yIHByb2R1Y2VkIGhlcmUuCisgICAgdms6OkNtZERyYXcobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMywgMSwgMCwgMCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRHJhd1RpbWVJbWFnZUNvbXBvbmVudFR5cGVNaXNtYXRjaFdpdGhQaXBlbGluZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgYW4gZXJyb3IgaXMgcHJvZHVjZWQgd2hlbiB0aGUgY29tcG9uZW50IHR5cGUgb2YgYW4gaW1hZ2V2aWV3IGRpc2FncmVlcyB3aXRoIHRoZSB0eXBlIGluIHRoZSBzaGFkZXIuIik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJTSU5UIGNvbXBvbmVudCB0eXBlLCBidXQgYm91bmQgZGVzY3JpcHRvciIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0wKSB1bmlmb3JtIGlzYW1wbGVyMkQgcztcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgIiAgIGNvbG9yID0gdGV4ZWxGZXRjaChzLCBpdmVjMigwKSwgMCk7XG4iCisgICAgICAgICJ9XG4iOworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKyAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKworICAgIFZrVGV4dHVyZU9iaiB0ZXh0dXJlKG1fZGV2aWNlLCBudWxscHRyKTsgIC8vIFVOT1JNIHRleHR1cmUgYnkgZGVmYXVsdCwgaW5jb21wYXRpYmxlIHdpdGggaXNhbXBsZXIyRAorICAgIFZrU2FtcGxlck9iaiBzYW1wbGVyKG1fZGV2aWNlKTsKKworICAgIFZrRGVzY3JpcHRvclNldE9iaiBkZXNjcmlwdG9yU2V0KG1fZGV2aWNlKTsKKyAgICBkZXNjcmlwdG9yU2V0LkFwcGVuZFNhbXBsZXJUZXh0dXJlKCZzYW1wbGVyLCAmdGV4dHVyZSk7CisgICAgZGVzY3JpcHRvclNldC5DcmVhdGVWS0Rlc2NyaXB0b3JTZXQobV9jb21tYW5kQnVmZmVyKTsKKworICAgIFZrUmVzdWx0IGVyciA9IHBpcGUuQ3JlYXRlVktQaXBlbGluZShkZXNjcmlwdG9yU2V0LkdldFBpcGVsaW5lTGF5b3V0KCksIHJlbmRlclBhc3MoKSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLmhhbmRsZSgpKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJpbmREZXNjcmlwdG9yU2V0KGRlc2NyaXB0b3JTZXQpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworCisgICAgLy8gZXJyb3IgcHJvZHVjZWQgaGVyZS4KKyAgICB2azo6Q21kRHJhdyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAzLCAxLCAwLCAwKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb3B5SW1hZ2VMYXllckNvdW50TWlzbWF0Y2gpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVHJ5IHRvIGNvcHkgYmV0d2VlbiBpbWFnZXMgd2l0aCB0aGUgc291cmNlIHN1YnJlc291cmNlIGhhdmluZyBhIGRpZmZlcmVudCBsYXllckNvdW50IHRoYW4gdGhlIGRlc3RpbmF0aW9uIHN1YnJlc291cmNlIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIENyZWF0ZSB0d28gaW1hZ2VzIHRvIGNvcHkgYmV0d2VlbgorICAgIFZrSW1hZ2VPYmogc3JjX2ltYWdlX29iaihtX2RldmljZSk7CisgICAgVmtJbWFnZU9iaiBkc3RfaW1hZ2Vfb2JqKG1fZGV2aWNlKTsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gMzI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDMyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworCisgICAgc3JjX2ltYWdlX29iai5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisgICAgQVNTRVJUX1RSVUUoc3JjX2ltYWdlX29iai5pbml0aWFsaXplZCgpKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBkc3RfaW1hZ2Vfb2JqLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICBBU1NFUlRfVFJVRShkc3RfaW1hZ2Vfb2JqLmluaXRpYWxpemVkKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIFZrSW1hZ2VDb3B5IGNvcHlSZWdpb247CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnggPSAwOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnkgPSAwOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnogPSAwOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgLy8gSW50cm9kdWNlIGZhaWx1cmUgYnkgZm9yY2luZyB0aGUgZHN0IGxheWVyQ291bnQgdG8gZGlmZmVyIGZyb20gc3JjCisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMzsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC54ID0gMDsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC55ID0gMDsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC56ID0gMDsKKyAgICBjb3B5UmVnaW9uLmV4dGVudC53aWR0aCA9IDE7CisgICAgY29weVJlZ2lvbi5leHRlbnQuaGVpZ2h0ID0gMTsKKyAgICBjb3B5UmVnaW9uLmV4dGVudC5kZXB0aCA9IDE7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE0MCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKHNyY19pbWFnZV9vYmouaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRzdF9pbWFnZV9vYmouaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlSZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvbXByZXNzZWRJbWFnZU1pcENvcHlUZXN0cykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkltYWdlL0J1ZmZlciBjb3BpZXMgZm9yIGhpZ2hlciBtaXAgbGV2ZWxzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGRldmljZV9mZWF0dXJlcyA9IHt9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoJmRldmljZV9mZWF0dXJlcykpOworICAgIFZrRm9ybWF0IGNvbXByZXNzZWRfZm9ybWF0ID0gVktfRk9STUFUX1VOREVGSU5FRDsKKyAgICBpZiAoZGV2aWNlX2ZlYXR1cmVzLnRleHR1cmVDb21wcmVzc2lvbkJDKSB7CisgICAgICAgIGNvbXByZXNzZWRfZm9ybWF0ID0gVktfRk9STUFUX0JDM19TUkdCX0JMT0NLOworICAgIH0gZWxzZSBpZiAoZGV2aWNlX2ZlYXR1cmVzLnRleHR1cmVDb21wcmVzc2lvbkVUQzIpIHsKKyAgICAgICAgY29tcHJlc3NlZF9mb3JtYXQgPSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9VTk9STV9CTE9DSzsKKyAgICB9IGVsc2UgaWYgKGRldmljZV9mZWF0dXJlcy50ZXh0dXJlQ29tcHJlc3Npb25BU1RDX0xEUikgeworICAgICAgICBjb21wcmVzc2VkX2Zvcm1hdCA9IFZLX0ZPUk1BVF9BU1RDXzR4NF9VTk9STV9CTE9DSzsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIE5vIGNvbXByZXNzZWQgZm9ybWF0cyBzdXBwb3J0ZWQgLSBDb21wcmVzc2VkSW1hZ2VNaXBDb3B5VGVzdHMgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGNpOworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IGNvbXByZXNzZWRfZm9ybWF0OworICAgIGNpLmV4dGVudCA9IHszMiwgMzIsIDF9OworICAgIGNpLm1pcExldmVscyA9IDY7CisgICAgY2kuYXJyYXlMYXllcnMgPSAxOworICAgIGNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBjaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgY2kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMDsKKyAgICBjaS5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTDsKKyAgICBjaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VPYmogb2RkX2ltYWdlKG1fZGV2aWNlKTsKKyAgICBjaS5leHRlbnQgPSB7MzEsIDMyLCAxfTsgIC8vIE1pcHMgYXJlIFszMSwzMl0gWzE1LDE2XSBbNyw4XSBbMyw0XSwgWzEsMl0gWzEsMV0KKyAgICBvZGRfaW1hZ2UuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKG9kZF9pbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIEFsbG9jYXRlIGJ1ZmZlcnMKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IDA7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyXzEwMjQsIGJ1ZmZlcl82NCwgYnVmZmVyXzE2LCBidWZmZXJfODsKKyAgICBidWZmZXJfMTAyNC5pbml0X2FzX3NyY19hbmRfZHN0KCptX2RldmljZSwgMTAyNCwgcmVxcyk7CisgICAgYnVmZmVyXzY0LmluaXRfYXNfc3JjX2FuZF9kc3QoKm1fZGV2aWNlLCA2NCwgcmVxcyk7CisgICAgYnVmZmVyXzE2LmluaXRfYXNfc3JjX2FuZF9kc3QoKm1fZGV2aWNlLCAxNiwgcmVxcyk7CisgICAgYnVmZmVyXzguaW5pdF9hc19zcmNfYW5kX2RzdCgqbV9kZXZpY2UsIDgsIHJlcXMpOworCisgICAgVmtCdWZmZXJJbWFnZUNvcHkgcmVnaW9uID0ge307CisgICAgcmVnaW9uLmJ1ZmZlclJvd0xlbmd0aCA9IDA7CisgICAgcmVnaW9uLmJ1ZmZlckltYWdlSGVpZ2h0ID0gMDsKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICByZWdpb24uaW1hZ2VPZmZzZXQgPSB7MCwgMCwgMH07CisgICAgcmVnaW9uLmJ1ZmZlck9mZnNldCA9IDA7CisKKyAgICAvLyBzdGFydCByZWNvcmRpbmcKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBNaXAgbGV2ZWwgY29waWVzIHRoYXQgd29yayAtIDUgbGV2ZWxzCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIC8vIE1pcCAwIHNob3VsZCBmaXQgaW4gMWsgYnVmZmVyIC0gMWsgdGV4ZWxzIEAgMWIgZWFjaAorICAgIHJlZ2lvbi5pbWFnZUV4dGVudCA9IHszMiwgMzIsIDF9OworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTAyNC5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl8xMDI0LmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZyZWdpb24pOworCisgICAgLy8gTWlwIDIgc2hvdWxkIGZpdCBpbiA2NGIgYnVmZmVyIC0gNjQgdGV4ZWxzIEAgMWIgZWFjaAorICAgIHJlZ2lvbi5pbWFnZUV4dGVudCA9IHs4LCA4LCAxfTsKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDI7CisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgYnVmZmVyXzY0LmhhbmRsZSgpLCAxLCAmcmVnaW9uKTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyXzY0LmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZyZWdpb24pOworCisgICAgLy8gTWlwIDMgc2hvdWxkIGZpdCBpbiAxNmIgYnVmZmVyIC0gMTYgdGV4ZWxzIEAgMWIgZWFjaAorICAgIHJlZ2lvbi5pbWFnZUV4dGVudCA9IHs0LCA0LCAxfTsKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDM7CisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgYnVmZmVyXzE2LmhhbmRsZSgpLCAxLCAmcmVnaW9uKTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyXzE2LmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZyZWdpb24pOworCisgICAgLy8gTWlwIDQmNSBzaG91bGQgZml0IGluIDE2YiBidWZmZXIgd2l0aCBubyBjb21wbGFpbnQgLSA0ICYgMSB0ZXhlbHMgQCAxYiBlYWNoCisgICAgcmVnaW9uLmltYWdlRXh0ZW50ID0gezIsIDIsIDF9OworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLm1pcExldmVsID0gNDsKKyAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTYuaGFuZGxlKCksIDEsICZyZWdpb24pOworICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfMTYuaGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJnJlZ2lvbik7CisKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQgPSB7MSwgMSwgMX07CisgICAgcmVnaW9uLmltYWdlU3VicmVzb3VyY2UubWlwTGV2ZWwgPSA1OworICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl8xNi5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl8xNi5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIEJ1ZmZlciBtdXN0IGFjY29tbW9kYXRlIGEgZnVsbCBjb21wcmVzc2VkIGJsb2NrLCByZWdhcmRsZXNzIG9mIHRleGVsIGNvdW50CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLTAwMTgzIik7CisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgYnVmZmVyXzguaGFuZGxlKCksIDEsICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1wUmVnaW9ucy0wMDE3MSIpOworICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfOC5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIENvcHkgd2lkdGggPCBjb21wcmVzc2VkIGJsb2NrIHNpemUsIGJ1dCBub3QgdGhlIGZ1bGwgbWlwIHdpZHRoCisgICAgcmVnaW9uLmltYWdlRXh0ZW50ID0gezEsIDIsIDF9OworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLm1pcExldmVsID0gNDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZUV4dGVudC0wMDIwNyIpOyAgLy8gd2lkdGggbm90IGEgbXVsdGlwbGUgb2YgY29tcHJlc3NlZCBibG9jayB3aWR0aAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1pbWFnZU9mZnNldC0wMTc5NCIpOyAgLy8gaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkKKyAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTYuaGFuZGxlKCksIDEsICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlRXh0ZW50LTAwMjA3Iik7ICAvLyB3aWR0aCBub3QgYSBtdWx0aXBsZSBvZiBjb21wcmVzc2VkIGJsb2NrIHdpZHRoCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWltYWdlT2Zmc2V0LTAxNzkzIik7ICAvLyBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfMTYuaGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDb3B5IGhlaWdodCA8IGNvbXByZXNzZWQgYmxvY2sgc2l6ZSBidXQgbm90IHRoZSBmdWxsIG1pcCBoZWlnaHQKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQgPSB7MiwgMSwgMX07CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VFeHRlbnQtMDAyMDgiKTsgIC8vIGhlaWdodCBub3QgYSBtdWx0aXBsZSBvZiBjb21wcmVzc2VkIGJsb2NrIHdpZHRoCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWltYWdlT2Zmc2V0LTAxNzk0Iik7ICAvLyBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl8xNi5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VFeHRlbnQtMDAyMDgiKTsgIC8vIGhlaWdodCBub3QgYSBtdWx0aXBsZSBvZiBjb21wcmVzc2VkIGJsb2NrIHdpZHRoCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWltYWdlT2Zmc2V0LTAxNzkzIik7ICAvLyBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfMTYuaGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBPZmZzZXRzIG11c3QgYmUgbXVsdGlwbGUgb2YgY29tcHJlc3NlZCBibG9jayBzaXplCisgICAgcmVnaW9uLmltYWdlT2Zmc2V0ID0gezEsIDEsIDB9OworICAgIHJlZ2lvbi5pbWFnZUV4dGVudCA9IHsxLCAxLCAxfTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMjA1Iik7ICAvLyBpbWFnZU9mZnNldCBub3QgYSBtdWx0aXBsZSBvZiBibG9jayBzaXplCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWltYWdlT2Zmc2V0LTAxNzk0Iik7ICAvLyBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl8xNi5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDIwNSIpOyAgLy8gaW1hZ2VPZmZzZXQgbm90IGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1pbWFnZU9mZnNldC0wMTc5MyIpOyAgLy8gaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyXzE2LmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gT2Zmc2V0ICsgZXh0ZW50IHdpZHRoID0gbWlwIHdpZHRoIC0gc2hvdWxkIHN1Y2NlZWQKKyAgICByZWdpb24uaW1hZ2VPZmZzZXQgPSB7NCwgNCwgMH07CisgICAgcmVnaW9uLmltYWdlRXh0ZW50ID0gezMsIDQsIDF9OworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLm1pcExldmVsID0gMjsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBvZGRfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTYuaGFuZGxlKCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfMTYuaGFuZGxlKCksIG9kZF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgLy8gT2Zmc2V0ICsgZXh0ZW50IHdpZHRoIDwgbWlwIHdpZHRoIGFuZCBub3QgYSBtdWx0aXBsZSBvZiBibG9jayB3aWR0aCAtIHNob3VsZCBmYWlsCisgICAgcmVnaW9uLmltYWdlRXh0ZW50ID0gezMsIDMsIDF9OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlRXh0ZW50LTAwMjA4Iik7ICAvLyBvZmZzZXQrZXh0ZW50IG5vdCBhIG11bHRpcGxlIG9mIGJsb2NrIHdpZHRoCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWltYWdlT2Zmc2V0LTAxNzk0Iik7ICAvLyBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBvZGRfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTYuaGFuZGxlKCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlRXh0ZW50LTAwMjA4Iik7ICAvLyBvZmZzZXQrZXh0ZW50IG5vdCBhIG11bHRpcGxlIG9mIGJsb2NrIHdpZHRoCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWltYWdlT2Zmc2V0LTAxNzkzIik7ICAvLyBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfMTYuaGFuZGxlKCksIG9kZF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEltYWdlQnVmZmVyQ29weVRlc3RzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiSW1hZ2UgdG8gYnVmZmVyIGFuZCBidWZmZXIgdG8gaW1hZ2UgdGVzdHMiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQmFpbCBpZiBhbnkgZGltZW5zaW9uIG9mIHRyYW5zZmVyIGdyYW51bGFyaXR5IGlzIDAuCisgICAgYXV0byBpbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBhdXRvIHF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzID0gbV9kZXZpY2UtPnBoeSgpLnF1ZXVlX3Byb3BlcnRpZXMoKTsKKyAgICBpZiAoKHF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW2luZGV4XS5taW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkuZGVwdGggPT0gMCkgfHwKKyAgICAgICAgKHF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW2luZGV4XS5taW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkud2lkdGggPT0gMCkgfHwKKyAgICAgICAgKHF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW2luZGV4XS5taW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkuaGVpZ2h0ID09IDApKSB7CisgICAgICAgIHByaW50ZigiJXMgU3VicmVzb3VyY2UgY29waWVzIGFyZSBkaXNhbGxvd2VkIHdoZW4geGZlciBncmFudWxhcml0eSAoeHx5fHopIGlzIDAuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0ltYWdlT2JqIGltYWdlXzY0ayhtX2RldmljZSk7ICAgICAgICAvLyAxMjheMiB0ZXhlbHMsIDY0aworICAgIFZrSW1hZ2VPYmogaW1hZ2VfMTZrKG1fZGV2aWNlKTsgICAgICAgIC8vIDY0XjIgdGV4ZWxzLCAxNmsKKyAgICBWa0ltYWdlT2JqIGltYWdlXzE2a19kZXB0aChtX2RldmljZSk7ICAvLyA2NF4yIHRleGVscywgZGVwdGgsIDE2aworICAgIFZrSW1hZ2VPYmogZHNfaW1hZ2VfNERfMVMobV9kZXZpY2UpOyAgIC8vIDI1Nl4yIHRleGVscywgNTEya2IgKDI1NmsgZGVwdGgsIDY0ayBzdGVuY2lsLCAxOTJrIHBhY2spCisgICAgVmtJbWFnZU9iaiBkc19pbWFnZV8zRF8xUyhtX2RldmljZSk7ICAgLy8gMjU2XjIgdGV4ZWxzLCAyNTZrYiAoMTkyayBkZXB0aCwgNjRrIHN0ZW5jaWwpCisgICAgVmtJbWFnZU9iaiBkc19pbWFnZV8yRChtX2RldmljZSk7ICAgICAgLy8gMjU2XjIgdGV4ZWxzLCAxMjhrICgxMjhrIGRlcHRoKQorICAgIFZrSW1hZ2VPYmogZHNfaW1hZ2VfMVMobV9kZXZpY2UpOyAgICAgIC8vIDI1Nl4yIHRleGVscywgNjRrICg2NGsgc3RlbmNpbCkKKworICAgIGltYWdlXzY0ay5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfUjhHOEI4QThfVUlOVCwKKyAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULAorICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBpbWFnZV8xNmsuSW5pdCg2NCwgNjQsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VSU5ULAorICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsCisgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlXzY0ay5pbml0aWFsaXplZCgpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV8xNmsuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyBWZXJpZnkgYWxsIG5lZWRlZCBEZXB0aC9TdGVuY2lsIGZvcm1hdHMgYXJlIHN1cHBvcnRlZAorICAgIGJvb2wgbWlzc2luZ19kc19zdXBwb3J0ID0gZmFsc2U7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIHByb3BzID0gezAsIDAsIDB9OworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5ULCAmcHJvcHMpOworICAgIG1pc3NpbmdfZHNfc3VwcG9ydCB8PSAocHJvcHMuYnVmZmVyRmVhdHVyZXMgPT0gMCAmJiBwcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcyA9PSAwICYmIHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyA9PSAwKTsKKyAgICBtaXNzaW5nX2RzX3N1cHBvcnQgfD0gKHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVQpID09IDA7CisgICAgbWlzc2luZ19kc19zdXBwb3J0IHw9IChwcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUKSA9PSAwOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQsICZwcm9wcyk7CisgICAgbWlzc2luZ19kc19zdXBwb3J0IHw9IChwcm9wcy5idWZmZXJGZWF0dXJlcyA9PSAwICYmIHByb3BzLmxpbmVhclRpbGluZ0ZlYXR1cmVzID09IDAgJiYgcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzID09IDApOworICAgIG1pc3NpbmdfZHNfc3VwcG9ydCB8PSAocHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCkgPT0gMDsKKyAgICBtaXNzaW5nX2RzX3N1cHBvcnQgfD0gKHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQpID09IDA7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIFZLX0ZPUk1BVF9EMTZfVU5PUk0sICZwcm9wcyk7CisgICAgbWlzc2luZ19kc19zdXBwb3J0IHw9IChwcm9wcy5idWZmZXJGZWF0dXJlcyA9PSAwICYmIHByb3BzLmxpbmVhclRpbGluZ0ZlYXR1cmVzID09IDAgJiYgcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzID09IDApOworICAgIG1pc3NpbmdfZHNfc3VwcG9ydCB8PSAocHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCkgPT0gMDsKKyAgICBtaXNzaW5nX2RzX3N1cHBvcnQgfD0gKHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQpID09IDA7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIFZLX0ZPUk1BVF9TOF9VSU5ULCAmcHJvcHMpOworICAgIG1pc3NpbmdfZHNfc3VwcG9ydCB8PSAocHJvcHMuYnVmZmVyRmVhdHVyZXMgPT0gMCAmJiBwcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcyA9PSAwICYmIHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyA9PSAwKTsKKyAgICBtaXNzaW5nX2RzX3N1cHBvcnQgfD0gKHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVQpID09IDA7CisgICAgbWlzc2luZ19kc19zdXBwb3J0IHw9IChwcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9EU1RfQklUKSA9PSAwOworCisgICAgaWYgKCFtaXNzaW5nX2RzX3N1cHBvcnQpIHsKKyAgICAgICAgaW1hZ2VfMTZrX2RlcHRoLkluaXQoNjQsIDY0LCAxLCBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltYWdlXzE2a19kZXB0aC5pbml0aWFsaXplZCgpKTsKKworICAgICAgICBkc19pbWFnZV80RF8xUy5Jbml0KAorICAgICAgICAgICAgMjU2LCAyNTYsIDEsIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQsCisgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsCisgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGRzX2ltYWdlXzREXzFTLmluaXRpYWxpemVkKCkpOworCisgICAgICAgIGRzX2ltYWdlXzNEXzFTLkluaXQoCisgICAgICAgICAgICAyNTYsIDI1NiwgMSwgVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5ULAorICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULAorICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgICAgICBBU1NFUlRfVFJVRShkc19pbWFnZV8zRF8xUy5pbml0aWFsaXplZCgpKTsKKworICAgICAgICBkc19pbWFnZV8yRC5Jbml0KAorICAgICAgICAgICAgMjU2LCAyNTYsIDEsIFZLX0ZPUk1BVF9EMTZfVU5PUk0sCisgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsCisgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGRzX2ltYWdlXzJELmluaXRpYWxpemVkKCkpOworCisgICAgICAgIGRzX2ltYWdlXzFTLkluaXQoCisgICAgICAgICAgICAyNTYsIDI1NiwgMSwgVktfRk9STUFUX1M4X1VJTlQsCisgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsCisgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGRzX2ltYWdlXzFTLmluaXRpYWxpemVkKCkpOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGJ1ZmZlcnMKKyAgICBWa0J1ZmZlck9iaiBidWZmZXJfMjU2aywgYnVmZmVyXzEyOGssIGJ1ZmZlcl82NGssIGJ1ZmZlcl8xNms7CisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIHJlcXMgPSAwOworICAgIGJ1ZmZlcl8yNTZrLmluaXRfYXNfc3JjX2FuZF9kc3QoKm1fZGV2aWNlLCAyNjIxNDQsIHJlcXMpOyAgLy8gMjU2aworICAgIGJ1ZmZlcl8xMjhrLmluaXRfYXNfc3JjX2FuZF9kc3QoKm1fZGV2aWNlLCAxMzEwNzIsIHJlcXMpOyAgLy8gMTI4aworICAgIGJ1ZmZlcl82NGsuaW5pdF9hc19zcmNfYW5kX2RzdCgqbV9kZXZpY2UsIDY1NTM2LCByZXFzKTsgICAgLy8gNjRrCisgICAgYnVmZmVyXzE2ay5pbml0X2FzX3NyY19hbmRfZHN0KCptX2RldmljZSwgMTYzODQsIHJlcXMpOyAgICAvLyAxNmsKKworICAgIFZrQnVmZmVySW1hZ2VDb3B5IHJlZ2lvbiA9IHt9OworICAgIHJlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSAwOworICAgIHJlZ2lvbi5idWZmZXJJbWFnZUhlaWdodCA9IDA7CisgICAgcmVnaW9uLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgcmVnaW9uLmltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgcmVnaW9uLmltYWdlT2Zmc2V0ID0gezAsIDAsIDB9OworICAgIHJlZ2lvbi5pbWFnZUV4dGVudCA9IHs2NCwgNjQsIDF9OworICAgIHJlZ2lvbi5idWZmZXJPZmZzZXQgPSAwOworCisgICAgLy8gYXR0ZW1wdCBjb3BpZXMgYmVmb3JlIHB1dHRpbmcgY29tbWFuZCBidWZmZXIgaW4gcmVjb3JkaW5nIHN0YXRlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIik7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl82NGsuaGFuZGxlKCksIGltYWdlXzY0ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIik7CisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzY0ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl82NGsuaGFuZGxlKCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gc3RhcnQgcmVjb3JkaW5nCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gc3VjY2Vzc2Z1bCBjb3BpZXMKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8xNmsuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTZrLmhhbmRsZSgpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uKTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyXzE2ay5oYW5kbGUoKSwgaW1hZ2VfMTZrLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbik7CisgICAgcmVnaW9uLmltYWdlT2Zmc2V0LnggPSAxNjsgIC8vIDE2ayBjb3B5LCBvZmZzZXQgcmVxdWlyZXMgbGFyZ2VyIGltYWdlCisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzY0ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC5oZWlnaHQgPSA3ODsgIC8vID4gMTZrIGNvcHkgcmVxdWlyZXMgbGFyZ2VyIGJ1ZmZlciAmIGltYWdlCisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl82NGsuaGFuZGxlKCksIGltYWdlXzY0ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIHJlZ2lvbi5pbWFnZU9mZnNldC54ID0gMDsKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQuaGVpZ2h0ID0gNjQ7CisgICAgcmVnaW9uLmJ1ZmZlck9mZnNldCA9IDI1NjsgIC8vIDE2ayBjb3B5IHdpdGggYnVmZmVyIG9mZnNldCwgcmVxdWlyZXMgbGFyZ2VyIGJ1ZmZlcgorICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8xNmsuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfNjRrLmhhbmRsZSgpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIGltYWdlL2J1ZmZlciB0b28gc21hbGwgKGV4dGVudCB0b28gbGFyZ2UpIG9uIGNvcHkgdG8gaW1hZ2UKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQgPSB7NjUsIDY0LCAxfTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtMDAxNzEiKTsgIC8vIGJ1ZmZlciB0b28gc21hbGwKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyXzE2ay5oYW5kbGUoKSwgaW1hZ2VfNjRrLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMTk3Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXBSZWdpb25zLTAwMTcyIik7ICAvLyBpbWFnZSB0b28gc21hbGwKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyXzY0ay5oYW5kbGUoKSwgaW1hZ2VfMTZrLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBpbWFnZS9idWZmZXIgdG9vIHNtYWxsIChvZmZzZXQpIG9uIGNvcHkgdG8gaW1hZ2UKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQgPSB7NjQsIDY0LCAxfTsKKyAgICByZWdpb24uaW1hZ2VPZmZzZXQgPSB7MCwgNCwgMH07CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXBSZWdpb25zLTAwMTcxIik7ICAvLyBidWZmZXIgdG9vIHNtYWxsCisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIGltYWdlXzY0ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDE5NyIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAxOTgiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtMDAxNzIiKTsgIC8vIGltYWdlIHRvbyBzbWFsbAorICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfNjRrLmhhbmRsZSgpLCBpbWFnZV8xNmsuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIGltYWdlL2J1ZmZlciB0b28gc21hbGwgb24gY29weSB0byBidWZmZXIKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQgPSB7NjQsIDY0LCAxfTsKKyAgICByZWdpb24uaW1hZ2VPZmZzZXQgPSB7MCwgMCwgMH07CisgICAgcmVnaW9uLmJ1ZmZlck9mZnNldCA9IDQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLTAwMTgzIik7ICAvLyBidWZmZXIgdG9vIHNtYWxsCisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzY0ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgcmVnaW9uLmltYWdlRXh0ZW50ID0gezY0LCA2NSwgMX07CisgICAgcmVnaW9uLmJ1ZmZlck9mZnNldCA9IDA7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDE5OCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MiIpOyAgLy8gaW1hZ2UgdG9vIHNtYWxsCisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzE2ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl82NGsuaGFuZGxlKCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gYnVmZmVyIHNpemUgT0sgYnV0IHJvd2xlbmd0aCBjYXVzZXMgbG9vc2UgcGFja2luZworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MyIpOworICAgIHJlZ2lvbi5pbWFnZUV4dGVudCA9IHs2NCwgNjQsIDF9OworICAgIHJlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSA2ODsKKyAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2VfMTZrLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgYnVmZmVyXzE2ay5oYW5kbGUoKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBBbiBleHRlbnQgd2l0aCB6ZXJvIGFyZWEgc2hvdWxkIHByb2R1Y2UgYSB3YXJuaW5nLCBidXQgbm8gZXJyb3IKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCB8IFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAifSBoYXMgemVybyBhcmVhIik7CisgICAgcmVnaW9uLmltYWdlRXh0ZW50LndpZHRoID0gMDsKKyAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2VfMTZrLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgYnVmZmVyXzE2ay5oYW5kbGUoKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBhc3BlY3QgYml0cworICAgIHJlZ2lvbi5pbWFnZUV4dGVudCA9IHs2NCwgNjQsIDF9OworICAgIHJlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSAwOworICAgIHJlZ2lvbi5idWZmZXJJbWFnZUhlaWdodCA9IDA7CisgICAgaWYgKCFtaXNzaW5nX2RzX3N1cHBvcnQpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYXNwZWN0TWFzay0wMDIxMiIpOyAgLy8gbW9yZSB0aGFuIDEgYXNwZWN0IGJpdCBzZXQKKyAgICAgICAgcmVnaW9uLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8xNmtfZGVwdGguaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTZrLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJnJlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAyMTEiKTsgIC8vIGRpZmZlcmVudCBtaXMtbWF0Y2hlZCBhc3BlY3QKKyAgICAgICAgcmVnaW9uLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8xNmtfZGVwdGguaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTZrLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJnJlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYXNwZWN0TWFzay0wMDIxMSIpOyAgLy8gbWlzLW1hdGNoZWQgYXNwZWN0CisgICAgcmVnaW9uLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzE2ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworCisgICAgLy8gT3V0LW9mLXJhbmdlIG1pcCBsZXZlbHMgc2hvdWxkIGZhaWwKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5taXBMZXZlbCA9IGltYWdlXzE2ay5jcmVhdGVfaW5mbygpLm1pcExldmVscyArIDE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLWltYWdlU3VicmVzb3VyY2UtMDE3MDMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMTk3Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDE5OCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAyMDAiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLTAwMTgyIik7ICAvLyB1bmF2b2lkYWJsZSAicmVnaW9uIGV4Y2VlZHMgaW1hZ2UgYm91bmRzIiBmb3Igbm9uLWV4aXN0ZW50IG1pcAorICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8xNmsuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBidWZmZXJfMTZrLmhhbmRsZSgpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtaW1hZ2VTdWJyZXNvdXJjZS0wMTcwMSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktaW1hZ2VPZmZzZXQtMDAxOTciKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMTk4Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZU9mZnNldC0wMDIwMCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJWVUlELXZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UtcFJlZ2lvbnMtMDAxNzIiKTsgIC8vIHVuYXZvaWRhYmxlICJyZWdpb24gZXhjZWVkcyBpbWFnZSBib3VuZHMiIGZvciBub24tZXhpc3RlbnQgbWlwCisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIGltYWdlXzE2ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKworICAgIC8vIE91dC1vZi1yYW5nZSBhcnJheSBsYXllcnMgc2hvdWxkIGZhaWwKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IGltYWdlXzE2ay5jcmVhdGVfaW5mbygpLmFycmF5TGF5ZXJzOworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1pbWFnZVN1YnJlc291cmNlLTAxNzA0Iik7CisgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzE2ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5QnVmZmVyVG9JbWFnZS1pbWFnZVN1YnJlc291cmNlLTAxNzAyIik7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIGltYWdlXzE2ay5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKworICAgIC8vIExheW91dCBtaXNtYXRjaCBzaG91bGQgZmFpbAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1zcmNJbWFnZUxheW91dC0wMDE4OSIpOworICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV8xNmsuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzE2ay5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLWRzdEltYWdlTGF5b3V0LTAwMTgwIik7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIGltYWdlXzE2ay5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLCAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFRlc3QgRGVwdGgvU3RlbmNpbCBjb3BpZXMKKyAgICBpZiAobWlzc2luZ19kc19zdXBwb3J0KSB7CisgICAgICAgIHByaW50ZigiJXMgRGVwdGggLyBTdGVuY2lsIGZvcm1hdHMgdW5zdXBwb3J0ZWQgLSBza2lwcGluZyBEL1MgdGVzdHMuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVmtCdWZmZXJJbWFnZUNvcHkgZHNfcmVnaW9uID0ge307CisgICAgICAgIGRzX3JlZ2lvbi5idWZmZXJPZmZzZXQgPSAwOworICAgICAgICBkc19yZWdpb24uYnVmZmVyUm93TGVuZ3RoID0gMDsKKyAgICAgICAgZHNfcmVnaW9uLmJ1ZmZlckltYWdlSGVpZ2h0ID0gMDsKKyAgICAgICAgZHNfcmVnaW9uLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgICAgIGRzX3JlZ2lvbi5pbWFnZVN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICAgICAgZHNfcmVnaW9uLmltYWdlU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgICAgICBkc19yZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICAgICAgZHNfcmVnaW9uLmltYWdlT2Zmc2V0ID0gezAsIDAsIDB9OworICAgICAgICBkc19yZWdpb24uaW1hZ2VFeHRlbnQgPSB7MjU2LCAyNTYsIDF9OworCisgICAgICAgIC8vIERlcHRoIGNvcGllcyB0aGF0IHNob3VsZCBzdWNjZWVkCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7ICAvLyBFeHRyYWN0IDRiIGRlcHRoIHBlciB0ZXhlbCwgcGFjayBpbnRvIDI1NmsgYnVmZmVyCisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZV80RF8xUy5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzI1NmsuaGFuZGxlKCksIDEsICZkc19yZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOyAgLy8gRXh0cmFjdCAzYiBkZXB0aCBwZXIgdGV4ZWwsIHBhY2sgKGxvb3NlKSBpbnRvIDI1NmsgYnVmZmVyCisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZV8zRF8xUy5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzI1NmsuaGFuZGxlKCksIDEsICZkc19yZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOyAgLy8gQ29weSAyYiBkZXB0aCBwZXIgdGV4ZWwsIGludG8gMTI4ayBidWZmZXIKKyAgICAgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRzX2ltYWdlXzJELmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfMTI4ay5oYW5kbGUoKSwgMSwgJmRzX3JlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIC8vIERlcHRoIGNvcGllcyB0aGF0IHNob3VsZCBmYWlsCisgICAgICAgIGRzX3JlZ2lvbi5idWZmZXJPZmZzZXQgPSA0OworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcFJlZ2lvbnMtMDAxODMiKTsgIC8vIEV4dHJhY3QgNGIgZGVwdGggcGVyIHRleGVsLCBwYWNrIGludG8gMjU2ayBidWZmZXIKKyAgICAgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRzX2ltYWdlXzREXzFTLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfMjU2ay5oYW5kbGUoKSwgMSwgJmRzX3JlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1wUmVnaW9ucy0wMDE4MyIpOyAgLy8gRXh0cmFjdCAzYiBkZXB0aCBwZXIgdGV4ZWwsIHBhY2sgKGxvb3NlKSBpbnRvIDI1NmsgYnVmZmVyCisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZV8zRF8xUy5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzI1NmsuaGFuZGxlKCksIDEsICZkc19yZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcFJlZ2lvbnMtMDAxODMiKTsgIC8vIENvcHkgMmIgZGVwdGggcGVyIHRleGVsLCBpbnRvIDEyOGsgYnVmZmVyCisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZV8yRC5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzEyOGsuaGFuZGxlKCksIDEsICZkc19yZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICAvLyBTdGVuY2lsIGNvcGllcyB0aGF0IHNob3VsZCBzdWNjZWVkCisgICAgICAgIGRzX3JlZ2lvbi5idWZmZXJPZmZzZXQgPSAwOworICAgICAgICBkc19yZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOyAgLy8gRXh0cmFjdCAxYiBzdGVuY2lsIHBlciB0ZXhlbCwgcGFjayBpbnRvIDY0ayBidWZmZXIKKyAgICAgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRzX2ltYWdlXzREXzFTLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfNjRrLmhhbmRsZSgpLCAxLCAmZHNfcmVnaW9uKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsgIC8vIEV4dHJhY3QgMWIgc3RlbmNpbCBwZXIgdGV4ZWwsIHBhY2sgaW50byA2NGsgYnVmZmVyCisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZV8zRF8xUy5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzY0ay5oYW5kbGUoKSwgMSwgJmRzX3JlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7ICAvLyBDb3B5IDFiIGRlcHRoIHBlciB0ZXhlbCwgaW50byA2NGsgYnVmZmVyCisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZV8xUy5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzY0ay5oYW5kbGUoKSwgMSwgJmRzX3JlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIC8vIFN0ZW5jaWwgY29waWVzIHRoYXQgc2hvdWxkIGZhaWwKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLTAwMTgzIik7ICAvLyBFeHRyYWN0IDFiIHN0ZW5jaWwgcGVyIHRleGVsLCBwYWNrIGludG8gNjRrIGJ1ZmZlcgorICAgICAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZHNfaW1hZ2VfNERfMVMuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIDEsICZkc19yZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItcFJlZ2lvbnMtMDAxODMiKTsgIC8vIEV4dHJhY3QgMWIgc3RlbmNpbCBwZXIgdGV4ZWwsIHBhY2sgaW50byA2NGsgYnVmZmVyCisgICAgICAgIGRzX3JlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSAyNjA7CisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZV8zRF8xUy5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzY0ay5oYW5kbGUoKSwgMSwgJmRzX3JlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIGRzX3JlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSAwOworICAgICAgICBkc19yZWdpb24uYnVmZmVyT2Zmc2V0ID0gNDsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLTAwMTgzIik7ICAvLyBDb3B5IDFiIGRlcHRoIHBlciB0ZXhlbCwgaW50byA2NGsgYnVmZmVyCisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZV8xUy5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzY0ay5oYW5kbGUoKSwgMSwgJmRzX3JlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIFRlc3QgY29tcHJlc3NlZCBmb3JtYXRzLCBpZiBzdXBwb3J0ZWQKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZGV2aWNlX2ZlYXR1cmVzID0ge307CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcygmZGV2aWNlX2ZlYXR1cmVzKSk7CisgICAgaWYgKCEoZGV2aWNlX2ZlYXR1cmVzLnRleHR1cmVDb21wcmVzc2lvbkJDIHx8IGRldmljZV9mZWF0dXJlcy50ZXh0dXJlQ29tcHJlc3Npb25FVEMyIHx8CisgICAgICAgICAgZGV2aWNlX2ZlYXR1cmVzLnRleHR1cmVDb21wcmVzc2lvbkFTVENfTERSKSkgeworICAgICAgICBwcmludGYoIiVzIE5vIGNvbXByZXNzZWQgZm9ybWF0cyBzdXBwb3J0ZWQgLSBibG9jayBjb21wcmVzc2lvbiB0ZXN0cyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFZrSW1hZ2VPYmogaW1hZ2VfMTZrXzR4NGNvbXAobV9kZXZpY2UpOyAgIC8vIDEyOF4yIHRleGVscyBhcyAzMl4yIGNvbXByZXNzZWQgKDR4NCkgYmxvY2tzLCAxNmsKKyAgICAgICAgVmtJbWFnZU9iaiBpbWFnZV9OUE9UXzR4NGNvbXAobV9kZXZpY2UpOyAgLy8gMTMwXjIgdGV4ZWxzIGFzIDMzXjIgY29tcHJlc3NlZCAoNHg0KSBibG9ja3MKKyAgICAgICAgaWYgKGRldmljZV9mZWF0dXJlcy50ZXh0dXJlQ29tcHJlc3Npb25CQykgeworICAgICAgICAgICAgaW1hZ2VfMTZrXzR4NGNvbXAuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX0JDM19TUkdCX0JMT0NLLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBpbWFnZV9OUE9UXzR4NGNvbXAuSW5pdCgxMzAsIDEzMCwgMSwgVktfRk9STUFUX0JDM19TUkdCX0JMT0NLLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZV9mZWF0dXJlcy50ZXh0dXJlQ29tcHJlc3Npb25FVEMyKSB7CisgICAgICAgICAgICBpbWFnZV8xNmtfNHg0Y29tcC5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9VTk9STV9CTE9DSywgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgICAgICAgICAgaW1hZ2VfTlBPVF80eDRjb21wLkluaXQoMTMwLCAxMzAsIDEsIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1VOT1JNX0JMT0NLLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW1hZ2VfMTZrXzR4NGNvbXAuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgICAgICAgICBpbWFnZV9OUE9UXzR4NGNvbXAuSW5pdCgxMzAsIDEzMCwgMSwgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9UUlVFKGltYWdlXzE2a180eDRjb21wLmluaXRpYWxpemVkKCkpOworCisgICAgICAgIC8vIEp1c3QgZml0cworICAgICAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgICAgICByZWdpb24uaW1hZ2VFeHRlbnQgPSB7MTI4LCAxMjgsIDF9OworICAgICAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2VfMTZrXzR4NGNvbXAuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzE2ay5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIC8vIHdpdGggb2Zmc2V0LCB0b28gYmlnIGZvciBidWZmZXIKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZVRvQnVmZmVyLXBSZWdpb25zLTAwMTgzIik7CisgICAgICAgIHJlZ2lvbi5idWZmZXJPZmZzZXQgPSAxNjsKKyAgICAgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzE2a180eDRjb21wLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIDEsICZyZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgcmVnaW9uLmJ1ZmZlck9mZnNldCA9IDA7CisKKyAgICAgICAgLy8gZXh0ZW50cyB0aGF0IGFyZSBub3QgYSBtdWx0aXBsZSBvZiBjb21wcmVzc2VkIGJsb2NrIHNpemUKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZUV4dGVudC0wMDIwNyIpOyAgLy8gZXh0ZW50IHdpZHRoIG5vdCBhIG11bHRpcGxlIG9mIGJsb2NrIHNpemUKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlci1pbWFnZU9mZnNldC0wMTc5NCIpOyAgLy8gaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkKKyAgICAgICAgcmVnaW9uLmltYWdlRXh0ZW50LndpZHRoID0gNjY7CisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV9OUE9UXzR4NGNvbXAuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzE2ay5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICByZWdpb24uaW1hZ2VFeHRlbnQud2lkdGggPSAxMjg7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1pbWFnZUV4dGVudC0wMDIwOCIpOyAgLy8gZXh0ZW50IGhlaWdodCBub3QgYSBtdWx0aXBsZSBvZiBibG9jayBzaXplCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlVG9CdWZmZXItaW1hZ2VPZmZzZXQtMDE3OTQiKTsgIC8vIGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5CisgICAgICAgIHJlZ2lvbi5pbWFnZUV4dGVudC5oZWlnaHQgPSAyOworICAgICAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2VfTlBPVF80eDRjb21wLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIDEsICZyZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgcmVnaW9uLmltYWdlRXh0ZW50LmhlaWdodCA9IDEyODsKKworICAgICAgICAvLyBUT0RPOiBBbGwgYXZhaWxhYmxlIGNvbXByZXNzZWQgZm9ybWF0cyBhcmUgMkQsIHdpdGggYmxvY2sgZGVwdGggb2YgMS4gVW5hYmxlIHRvIHByb3Zva2UgVlVfMDEyNzcuCisKKyAgICAgICAgLy8gbm9uLW11bHRpcGxlIGV4dGVudHMgYXJlIGFsbG93ZWQgaWYgYXQgdGhlIGZhciBlZGdlIG9mIGEgbm9uLWJsb2NrLW11bHRpcGxlIGltYWdlIC0gdGhlc2Ugc2hvdWxkIHBhc3MKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICAgICAgcmVnaW9uLmltYWdlRXh0ZW50LndpZHRoID0gNjY7CisgICAgICAgIHJlZ2lvbi5pbWFnZU9mZnNldC54ID0gNjQ7CisgICAgICAgIHZrOjpDbWRDb3B5SW1hZ2VUb0J1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZV9OUE9UXzR4NGNvbXAuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzE2ay5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgICAgIHJlZ2lvbi5pbWFnZUV4dGVudC53aWR0aCA9IDE2OworICAgICAgICByZWdpb24uaW1hZ2VPZmZzZXQueCA9IDA7CisgICAgICAgIHJlZ2lvbi5pbWFnZUV4dGVudC5oZWlnaHQgPSAyOworICAgICAgICByZWdpb24uaW1hZ2VPZmZzZXQueSA9IDEyODsKKyAgICAgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlX05QT1RfNHg0Y29tcC5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfMTZrLmhhbmRsZSgpLCAxLCAmcmVnaW9uKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgICAgIHJlZ2lvbi5pbWFnZU9mZnNldCA9IHswLCAwLCAwfTsKKworICAgICAgICAvLyBidWZmZXIgb2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0ZXhlbCBibG9jayBzaXplICgxNikKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDAyMDYiKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJPZmZzZXQtMDAxOTMiKTsKKyAgICAgICAgcmVnaW9uLmltYWdlRXh0ZW50ID0gezY0LCA2NCwgMX07CisgICAgICAgIHJlZ2lvbi5idWZmZXJPZmZzZXQgPSAyNDsKKyAgICAgICAgdms6OkNtZENvcHlJbWFnZVRvQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlXzE2a180eDRjb21wLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl8xNmsuaGFuZGxlKCksIDEsICZyZWdpb24pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICAvLyByb3dsZW5ndGggbm90IGEgbXVsdGlwbGUgb2YgYmxvY2sgd2lkdGggKDQpCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVyUm93TGVuZ3RoLTAwMjAzIik7CisgICAgICAgIHJlZ2lvbi5idWZmZXJPZmZzZXQgPSAwOworICAgICAgICByZWdpb24uYnVmZmVyUm93TGVuZ3RoID0gMTMwOworICAgICAgICByZWdpb24uYnVmZmVySW1hZ2VIZWlnaHQgPSAwOworICAgICAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2VfMTZrXzR4NGNvbXAuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzY0ay5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIC8vIGltYWdlaGVpZ2h0IG5vdCBhIG11bHRpcGxlIG9mIGJsb2NrIGhlaWdodCAoNCkKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0J1ZmZlckltYWdlQ29weS1idWZmZXJJbWFnZUhlaWdodC0wMDIwNCIpOworICAgICAgICByZWdpb24uYnVmZmVyUm93TGVuZ3RoID0gMDsKKyAgICAgICAgcmVnaW9uLmJ1ZmZlckltYWdlSGVpZ2h0ID0gMTMwOworICAgICAgICB2azo6Q21kQ29weUltYWdlVG9CdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2VfMTZrXzR4NGNvbXAuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXzY0ay5oYW5kbGUoKSwgMSwgJnJlZ2lvbik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNaXNjSW1hZ2VMYXllclRlc3RzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiSW1hZ2UtcmVsYXRlZCB0ZXN0cyB0aGF0IGRvbid0IGJlbG9uZyBlbHNld2hlcmUiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICAvLyBUT0RPOiBJZGVhbGx5IHdlIHNob3VsZCBjaGVjayBpZiBhIGZvcm1hdCBpcyBzdXBwb3J0ZWQsIGJlZm9yZSB1c2luZyBpdC4KKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VJTlQsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsgIC8vIDY0YnBwCisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyByZXFzID0gMDsKKyAgICBidWZmZXIuaW5pdF9hc19zcmMoKm1fZGV2aWNlLCAxMjggKiAxMjggKiA4LCByZXFzKTsKKyAgICBWa0J1ZmZlckltYWdlQ29weSByZWdpb24gPSB7fTsKKyAgICByZWdpb24uYnVmZmVyUm93TGVuZ3RoID0gMTI4OworICAgIHJlZ2lvbi5idWZmZXJJbWFnZUhlaWdodCA9IDEyODsKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICAvLyBsYXllckNvdW50IGNhbid0IGJlIDAgLSBFeHBlY3QgTUlTTUFUQ0hFRF9JTUFHRV9BU1BFQ1QKKyAgICByZWdpb24uaW1hZ2VTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQuaGVpZ2h0ID0gNDsKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQud2lkdGggPSA0OworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC5kZXB0aCA9IDE7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlMihtX2RldmljZSk7CisgICAgaW1hZ2UyLkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9SOEc4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7ICAvLyAxNmJwcAorICAgIEFTU0VSVF9UUlVFKGltYWdlMi5pbml0aWFsaXplZCgpKTsKKyAgICBWa0J1ZmZlck9iaiBidWZmZXIyOworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyByZXFzMiA9IDA7CisgICAgYnVmZmVyMi5pbml0X2FzX3NyYygqbV9kZXZpY2UsIDEyOCAqIDEyOCAqIDIsIHJlcXMyKTsKKyAgICBWa0J1ZmZlckltYWdlQ29weSByZWdpb24yID0ge307CisgICAgcmVnaW9uMi5idWZmZXJSb3dMZW5ndGggPSAxMjg7CisgICAgcmVnaW9uMi5idWZmZXJJbWFnZUhlaWdodCA9IDEyODsKKyAgICByZWdpb24yLmltYWdlU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgLy8gbGF5ZXJDb3VudCBjYW4ndCBiZSAwIC0gRXhwZWN0IE1JU01BVENIRURfSU1BR0VfQVNQRUNUCisgICAgcmVnaW9uMi5pbWFnZVN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHJlZ2lvbjIuaW1hZ2VFeHRlbnQuaGVpZ2h0ID0gNDsKKyAgICByZWdpb24yLmltYWdlRXh0ZW50LndpZHRoID0gNDsKKyAgICByZWdpb24yLmltYWdlRXh0ZW50LmRlcHRoID0gMTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBJbWFnZSBtdXN0IGhhdmUgb2Zmc2V0Lnogb2YgMCBhbmQgZXh0ZW50LmRlcHRoIG9mIDEKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSBzZXR0aW5nIGltYWdlRXh0ZW50LmRlcHRoIHRvIDAKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQuZGVwdGggPSAwOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktc3JjSW1hZ2UtMDAyMDEiKTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC5kZXB0aCA9IDE7CisKKyAgICAvLyBJbWFnZSBtdXN0IGhhdmUgb2Zmc2V0Lnogb2YgMCBhbmQgZXh0ZW50LmRlcHRoIG9mIDEKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSBzZXR0aW5nIGltYWdlT2Zmc2V0LnogdG8gNAorICAgIC8vIE5vdGU6IEFsc28gKHVuYXZvaWRhYmx5KSB0cmlnZ2VycyAncmVnaW9uIGV4Y2VlZHMgaW1hZ2UnICMxMjI4CisgICAgcmVnaW9uLmltYWdlT2Zmc2V0LnogPSA0OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktc3JjSW1hZ2UtMDAyMDEiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWltYWdlT2Zmc2V0LTAwMjAwIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlCdWZmZXJUb0ltYWdlLXBSZWdpb25zLTAwMTcyIik7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICByZWdpb24uaW1hZ2VPZmZzZXQueiA9IDA7CisgICAgLy8gQnVmZmVyT2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY2FsbGluZyBjb21tYW5kJ3MgVmtJbWFnZSBwYXJhbWV0ZXIncyB0ZXhlbCBzaXplCisgICAgLy8gSW50cm9kdWNlIGZhaWx1cmUgYnkgc2V0dGluZyBidWZmZXJPZmZzZXQgdG8gMSBhbmQgMS8yIHRleGVscworICAgIHJlZ2lvbi5idWZmZXJPZmZzZXQgPSA0OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVyT2Zmc2V0LTAwMTkzIik7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBCdWZmZXJPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSBzZXR0aW5nIGJ1ZmZlck9mZnNldCB0byBhIHZhbHVlIG5vdCBkaXZpc2libGUgYnkgNAorICAgIHJlZ2lvbjIuYnVmZmVyT2Zmc2V0ID0gNjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlck9mZnNldC0wMDE5NCIpOworICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIyLmhhbmRsZSgpLCBpbWFnZTIuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbjIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQnVmZmVyUm93TGVuZ3RoIG11c3QgYmUgMCwgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB3aWR0aCBtZW1iZXIgb2YgaW1hZ2VFeHRlbnQKKyAgICByZWdpb24uYnVmZmVyT2Zmc2V0ID0gMDsKKyAgICByZWdpb24uaW1hZ2VFeHRlbnQuaGVpZ2h0ID0gMTI4OworICAgIHJlZ2lvbi5pbWFnZUV4dGVudC53aWR0aCA9IDEyODsKKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSBzZXR0aW5nIGJ1ZmZlclJvd0xlbmd0aCA+IDAgYnV0IGxlc3MgdGhhbiB3aWR0aAorICAgIHJlZ2lvbi5idWZmZXJSb3dMZW5ndGggPSA2NDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQnVmZmVySW1hZ2VDb3B5LWJ1ZmZlclJvd0xlbmd0aC0wMDE5NSIpOworICAgIHZrOjpDbWRDb3B5QnVmZmVyVG9JbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQnVmZmVySW1hZ2VIZWlnaHQgbXVzdCBiZSAwLCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGhlaWdodCBtZW1iZXIgb2YgaW1hZ2VFeHRlbnQKKyAgICByZWdpb24uYnVmZmVyUm93TGVuZ3RoID0gMTI4OworICAgIC8vIEludHJvZHVjZSBmYWlsdXJlIGJ5IHNldHRpbmcgYnVmZmVyUm93SGVpZ2h0ID4gMCBidXQgbGVzcyB0aGFuIGhlaWdodAorICAgIHJlZ2lvbi5idWZmZXJJbWFnZUhlaWdodCA9IDY0OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtCdWZmZXJJbWFnZUNvcHktYnVmZmVySW1hZ2VIZWlnaHQtMDAxOTYiKTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlclRvSW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLmhhbmRsZSgpLCBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHJlZ2lvbi5idWZmZXJJbWFnZUhlaWdodCA9IDEyODsKKyAgICBWa0ltYWdlT2JqIGludEltYWdlMShtX2RldmljZSk7CisgICAgaW50SW1hZ2UxLkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9SOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIGludEltYWdlMS5TZXRMYXlvdXQoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwpOworICAgIFZrSW1hZ2VPYmogaW50SW1hZ2UyKG1fZGV2aWNlKTsKKyAgICBpbnRJbWFnZTIuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX1I4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgaW50SW1hZ2UyLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCk7CisgICAgVmtJbWFnZUJsaXQgYmxpdFJlZ2lvbiA9IHt9OworICAgIGJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgYmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBibGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBibGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgYmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgYmxpdFJlZ2lvbi5zcmNPZmZzZXRzWzBdID0gezEyOCwgMCwgMH07CisgICAgYmxpdFJlZ2lvbi5zcmNPZmZzZXRzWzFdID0gezEyOCwgMTI4LCAxfTsKKyAgICBibGl0UmVnaW9uLmRzdE9mZnNldHNbMF0gPSB7MCwgMTI4LCAwfTsKKyAgICBibGl0UmVnaW9uLmRzdE9mZnNldHNbMV0gPSB7MTI4LCAxMjgsIDF9OworCisgICAgLy8gTG9vayBmb3IgTlVMTC1ibGl0IHdhcm5pbmcKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQmxpdEltYWdlKCk6IHBSZWdpb25zWzBdLnNyY09mZnNldHMgc3BlY2lmeSBhIHplcm8tdm9sdW1lIGFyZWEuIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZEJsaXRJbWFnZSgpOiBwUmVnaW9uc1swXS5kc3RPZmZzZXRzIHNwZWNpZnkgYSB6ZXJvLXZvbHVtZSBhcmVhLiIpOworICAgIHZrOjpDbWRCbGl0SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW50SW1hZ2UxLmhhbmRsZSgpLCBpbnRJbWFnZTEuTGF5b3V0KCksIGludEltYWdlMi5oYW5kbGUoKSwgaW50SW1hZ2UyLkxheW91dCgpLCAxLAorICAgICAgICAgICAgICAgICAgICAgJmJsaXRSZWdpb24sIFZLX0ZJTFRFUl9MSU5FQVIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvcHlJbWFnZVR5cGVFeHRlbnRNaXNtYXRjaCkgeworICAgIC8vIEltYWdlIGNvcHkgdGVzdHMgd2hlcmUgZm9ybWF0IHR5cGUgYW5kIGV4dGVudHMgZG9uJ3QgbWF0Y2gKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gY2k7CisgICAgY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBjaS5wTmV4dCA9IE5VTEw7CisgICAgY2kuZmxhZ3MgPSAwOworICAgIGNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMUQ7CisgICAgY2kuZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIGNpLmV4dGVudCA9IHszMiwgMSwgMX07CisgICAgY2kubWlwTGV2ZWxzID0gMTsKKyAgICBjaS5hcnJheUxheWVycyA9IDE7CisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBjaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGNpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBjaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGNpLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGNpLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworCisgICAgLy8gQ3JlYXRlIDFEIGltYWdlCisgICAgVmtJbWFnZU9iaiBpbWFnZV8xRChtX2RldmljZSk7CisgICAgaW1hZ2VfMUQuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKGltYWdlXzFELmluaXRpYWxpemVkKCkpOworCisgICAgLy8gMkQgaW1hZ2UKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmV4dGVudCA9IHszMiwgMzIsIDF9OworICAgIFZrSW1hZ2VPYmogaW1hZ2VfMkQobV9kZXZpY2UpOworICAgIGltYWdlXzJELmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV8yRC5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIDNEIGltYWdlCisgICAgY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8zRDsKKyAgICBjaS5leHRlbnQgPSB7MzIsIDMyLCA4fTsKKyAgICBWa0ltYWdlT2JqIGltYWdlXzNEKG1fZGV2aWNlKTsKKyAgICBpbWFnZV8zRC5pbml0KCZjaSk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2VfM0QuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyAyRCBpbWFnZSBhcnJheQorICAgIGNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgY2kuZXh0ZW50ID0gezMyLCAzMiwgMX07CisgICAgY2kuYXJyYXlMYXllcnMgPSA4OworICAgIFZrSW1hZ2VPYmogaW1hZ2VfMkRfYXJyYXkobV9kZXZpY2UpOworICAgIGltYWdlXzJEX2FycmF5LmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV8yRF9hcnJheS5pbml0aWFsaXplZCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIFZrSW1hZ2VDb3B5IGNvcHlfcmVnaW9uOworICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IHszMiwgMSwgMX07CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLnNyY09mZnNldCA9IHswLCAwLCAwfTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQgPSB7MCwgMCwgMH07CisKKyAgICAvLyBTYW5pdHkgY2hlY2sKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKGltYWdlXzFELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZV8yRC5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgLy8gMUQgdGV4dHVyZSB3LyBvZmZzZXQueSA+IDAuIFNvdXJjZSA9IFZVIDA5YzAwMTI0LCBkZXN0ID0gMDljMDAxMzAKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQueSA9IDE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMDE0NiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ1Iik7ICAvLyBhbHNvIHktZGltIG92ZXJydW4KKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShpbWFnZV8xRC5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgaW1hZ2VfMkQuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQueSA9IDA7CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0LnkgPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDAxNTIiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE1MSIpOyAgLy8gYWxzbyB5LWRpbSBvdmVycnVuCisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMkQuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzFELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0LnkgPSAwOworCisgICAgLy8gMUQgdGV4dHVyZSB3LyBleHRlbnQuaGVpZ2h0ID4gMS4gU291cmNlID0gVlUgMDljMDAxMjQsIGRlc3QgPSAwOWMwMDEzMAorICAgIGNvcHlfcmVnaW9uLmV4dGVudC5oZWlnaHQgPSAyOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDAxNDYiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE0NSIpOyAgLy8gYWxzbyB5LWRpbSBvdmVycnVuCisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMUQuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzJELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMDE1MiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktZHN0T2Zmc2V0LTAwMTUxIik7ICAvLyBhbHNvIHktZGltIG92ZXJydW4KKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShpbWFnZV8yRC5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgaW1hZ2VfMUQuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQuaGVpZ2h0ID0gMTsKKworICAgIC8vIDFEIHRleHR1cmUgdy8gb2Zmc2V0LnogPiAwLiBTb3VyY2UgPSBWVSAwOWMwMGRmMiwgZGVzdCA9IDA5YzAwZGY0CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0LnogPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3ODUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE0NyIpOyAgLy8gYWxzbyB6LWRpbSBvdmVycnVuCisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMUQuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzJELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0LnogPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldC56ID0gMTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzg2Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTMiKTsgIC8vIGFsc28gei1kaW0gb3ZlcnJ1bgorICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKGltYWdlXzJELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZV8xRC5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldC56ID0gMDsKKworICAgIC8vIDFEIHRleHR1cmUgdy8gZXh0ZW50LmRlcHRoID4gMS4gU291cmNlID0gVlUgMDljMDBkZjIsIGRlc3QgPSAwOWMwMGRmNAorICAgIGNvcHlfcmVnaW9uLmV4dGVudC5kZXB0aCA9IDI7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTc4NSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ3Iik7ICAvLyBhbHNvIHotZGltIG92ZXJydW4gKHNyYykKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE1MyIpOyAgLy8gYWxzbyB6LWRpbSBvdmVycnVuIChkc3QpCisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMUQuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzJELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTc4NiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ3Iik7ICAvLyBhbHNvIHotZGltIG92ZXJydW4gKHNyYykKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE1MyIpOyAgLy8gYWxzbyB6LWRpbSBvdmVycnVuIChkc3QpCisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMkQuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzFELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgY29weV9yZWdpb24uZXh0ZW50LmRlcHRoID0gMTsKKworICAgIC8vIDJEIHRleHR1cmUgdy8gb2Zmc2V0LnogPiAwLiBTb3VyY2UgPSBWVSAwOWMwMGRmNiwgZGVzdCA9IDA5YzAwZGY4CisgICAgY29weV9yZWdpb24uZXh0ZW50ID0gezE2LCAxNiwgMX07CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0LnogPSA0OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3ODciKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE0NyIpOyAgLy8gYWxzbyB6LWRpbSBvdmVycnVuIChzcmMpCisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMkQuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzNELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0LnogPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldC56ID0gMTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzg4Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTMiKTsgIC8vIGFsc28gei1kaW0gb3ZlcnJ1biAoZHN0KQorICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKGltYWdlXzNELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZV8yRC5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldC56ID0gMDsKKworICAgIC8vIDNEIHRleHR1cmUgYWNjZXNzaW5nIGFuIGFycmF5IGxheWVyIG90aGVyIHRoYW4gMC4gVlUgMDljMDAxMWEKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQgPSB7NCwgNCwgMX07CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDAxNDEiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLXNyY1N1YnJlc291cmNlLTAxNjk4Iik7ICAvLyBhbHNvICd0b28gbWFueSBsYXllcnMnCisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfM0QuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzJELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb3B5SW1hZ2VUeXBlRXh0ZW50TWlzbWF0Y2hNYWludGVuYW5jZTEpIHsKKyAgICAvLyBJbWFnZSBjb3B5IHRlc3RzIHdoZXJlIGZvcm1hdCB0eXBlIGFuZCBleHRlbnRzIGRvbid0IG1hdGNoIGFuZCB0aGUgTWFpbnRlbmFuY2UxIGV4dGVuc2lvbiBpcyBlbmFibGVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIE1haW50ZW5hbmNlMSBleHRlbnNpb24gY2Fubm90IGJlIGVuYWJsZWQsIHRlc3Qgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBWa0Zvcm1hdCBpbWFnZV9mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wczsKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBjaGVjayBpZiBvciB3aGVuIGRldnNpbSBoYW5kbGVzIGV4dGVuc2lvbnMuCisgICAgLy8gVGhlIGNob3NlbiBmb3JtYXQgaGFzIG1hbmRhdG9yeSBzdXBwb3J0IHRoZSB0cmFuc2ZlciBzcmMgYW5kIGRzdCBmb3JtYXQgZmVhdHVyZXMgd2hlbiBNYWl0ZW5hbmNlMSBpcyBlbmFibGVkLiBIb3dldmVyLCBvdXIKKyAgICAvLyB1c2Ugb2YgZGV2c2ltIGFuZCB0aGUgbW9jayBJQ0QgdmlvbGF0ZSB0aGlzIGd1YXJhbnRlZS4KKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKG1fZGV2aWNlLT5waHkoKS5oYW5kbGUoKSwgaW1hZ2VfZm9ybWF0LCAmZm9ybWF0X3Byb3BzKTsKKyAgICBpZiAoIShmb3JtYXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBNYWludGVuYW5jZTEgZXh0ZW5zaW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBjaTsKKyAgICBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGNpLnBOZXh0ID0gTlVMTDsKKyAgICBjaS5mbGFncyA9IDA7CisgICAgY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8xRDsKKyAgICBjaS5mb3JtYXQgPSBpbWFnZV9mb3JtYXQ7CisgICAgY2kuZXh0ZW50ID0gezMyLCAxLCAxfTsKKyAgICBjaS5taXBMZXZlbHMgPSAxOworICAgIGNpLmFycmF5TGF5ZXJzID0gMTsKKyAgICBjaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGNpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGNpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgY2kuc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgIGNpLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDA7CisgICAgY2kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IE5VTEw7CisgICAgY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisKKyAgICAvLyBDcmVhdGUgMUQgaW1hZ2UKKyAgICBWa0ltYWdlT2JqIGltYWdlXzFEKG1fZGV2aWNlKTsKKyAgICBpbWFnZV8xRC5pbml0KCZjaSk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2VfMUQuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyAyRCBpbWFnZQorICAgIGNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgY2kuZXh0ZW50ID0gezMyLCAzMiwgMX07CisgICAgVmtJbWFnZU9iaiBpbWFnZV8yRChtX2RldmljZSk7CisgICAgaW1hZ2VfMkQuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKGltYWdlXzJELmluaXRpYWxpemVkKCkpOworCisgICAgLy8gM0QgaW1hZ2UKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzNEOworICAgIGNpLmV4dGVudCA9IHszMiwgMzIsIDh9OworICAgIFZrSW1hZ2VPYmogaW1hZ2VfM0QobV9kZXZpY2UpOworICAgIGltYWdlXzNELmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV8zRC5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIDJEIGltYWdlIGFycmF5CisgICAgY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBjaS5leHRlbnQgPSB7MzIsIDMyLCAxfTsKKyAgICBjaS5hcnJheUxheWVycyA9IDg7CisgICAgVmtJbWFnZU9iaiBpbWFnZV8yRF9hcnJheShtX2RldmljZSk7CisgICAgaW1hZ2VfMkRfYXJyYXkuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKGltYWdlXzJEX2FycmF5LmluaXRpYWxpemVkKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgVmtJbWFnZUNvcHkgY29weV9yZWdpb247CisgICAgY29weV9yZWdpb24uZXh0ZW50ID0gezMyLCAxLCAxfTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0ID0gezAsIDAsIDB9OworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldCA9IHswLCAwLCAwfTsKKworICAgIC8vIENvcHkgZnJvbSBsYXllciBub3QgcHJlc2VudAorICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gNDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gNjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weUltYWdlLXNyY1N1YnJlc291cmNlLTAxNjk4Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMkRfYXJyYXkuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzNELmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworCisgICAgLy8gQ29weSB0byBsYXllciBub3QgcHJlc2VudAorICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gODsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weUltYWdlLWRzdFN1YnJlc291cmNlLTAxNjk5Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfM0QuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzJEX2FycmF5LmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvcHlJbWFnZUNvbXByZXNzZWRCbG9ja0FsaWdubWVudCkgeworICAgIC8vIEltYWdlIGNvcHkgdGVzdHMgb24gY29tcHJlc3NlZCBpbWFnZXMgd2l0aCBibG9jayBhbGlnbm1lbnQgZXJyb3JzCisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICAvLyBTZWxlY3QgYSBjb21wcmVzc2VkIGZvcm1hdCBhbmQgdmVyaWZ5IHN1cHBvcnQKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZGV2aWNlX2ZlYXR1cmVzID0ge307CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcygmZGV2aWNlX2ZlYXR1cmVzKSk7CisgICAgVmtGb3JtYXQgY29tcHJlc3NlZF9mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgIGlmIChkZXZpY2VfZmVhdHVyZXMudGV4dHVyZUNvbXByZXNzaW9uQkMpIHsKKyAgICAgICAgY29tcHJlc3NlZF9mb3JtYXQgPSBWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0s7CisgICAgfSBlbHNlIGlmIChkZXZpY2VfZmVhdHVyZXMudGV4dHVyZUNvbXByZXNzaW9uRVRDMikgeworICAgICAgICBjb21wcmVzc2VkX2Zvcm1hdCA9IFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1VOT1JNX0JMT0NLOworICAgIH0gZWxzZSBpZiAoZGV2aWNlX2ZlYXR1cmVzLnRleHR1cmVDb21wcmVzc2lvbkFTVENfTERSKSB7CisgICAgICAgIGNvbXByZXNzZWRfZm9ybWF0ID0gVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOworICAgIH0KKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGNpOworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IGNvbXByZXNzZWRfZm9ybWF0OworICAgIGNpLmV4dGVudCA9IHs2NCwgNjQsIDF9OworICAgIGNpLm1pcExldmVscyA9IDE7CisgICAgY2kuYXJyYXlMYXllcnMgPSAxOworICAgIGNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBjaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgY2kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMDsKKyAgICBjaS5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTDsKKyAgICBjaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKworICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGltZ19wcm9wID0ge307CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gdms6OkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKG1fZGV2aWNlLT5waHkoKS5oYW5kbGUoKSwgY2kuZm9ybWF0LCBjaS5pbWFnZVR5cGUsIGNpLnRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2kudXNhZ2UsIGNpLmZsYWdzLCAmaW1nX3Byb3ApKSB7CisgICAgICAgIHByaW50ZigiJXMgTm8gY29tcHJlc3NlZCBmb3JtYXRzIHN1cHBvcnRlZCAtIENvcHlJbWFnZUNvbXByZXNzZWRCbG9ja0FsaWdubWVudCBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGltYWdlcworICAgIFZrSW1hZ2VPYmogaW1hZ2VfMShtX2RldmljZSk7CisgICAgaW1hZ2VfMS5pbml0KCZjaSk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2VfMS5pbml0aWFsaXplZCgpKTsKKworICAgIGNpLmV4dGVudCA9IHs2MiwgNjIsIDF9OyAgLy8gc2xpZ2h0bHkgc21hbGxlciBhbmQgbm90IGRpdmlzaWJsZSBieSBibG9jayBzaXplCisgICAgVmtJbWFnZU9iaiBpbWFnZV8yKG1fZGV2aWNlKTsKKyAgICBpbWFnZV8yLmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV8yLmluaXRpYWxpemVkKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgVmtJbWFnZUNvcHkgY29weV9yZWdpb247CisgICAgY29weV9yZWdpb24uZXh0ZW50ID0gezQ4LCA0OCwgMX07CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLnNyY09mZnNldCA9IHswLCAwLCAwfTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQgPSB7MCwgMCwgMH07CisKKyAgICAvLyBTYW5pdHkgY2hlY2sKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKGltYWdlXzEuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzIuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBzdGQ6OnN0cmluZyB2dWlkOworICAgIGJvb2wgeWNiY3IgPSAoRGV2aWNlRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKSB8fAorICAgICAgICAgICAgICAgICAgKERldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgPj0gVktfQVBJX1ZFUlNJT05fMV8xKSk7CisKKyAgICAvLyBTcmMsIERlc3Qgb2Zmc2V0cyBtdXN0IGJlIG11bHRpcGxlcyBvZiBjb21wcmVzc2VkIGJsb2NrIHNpemVzIHs0LCA0LCAxfQorICAgIC8vIEltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5IGdldHMgc2V0IHRvIGNvbXByZXNzZWQgYmxvY2sgc2l6ZSwgc28gYW4gSVRHIGVycm9yIGlzIGFsc28gKHVuYXZvaWRhYmx5KSB0cmlnZ2VyZWQuCisgICAgdnVpZCA9IHljYmNyID8gIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3MjciIDogIlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTU3IjsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQgPSB7MiwgNCwgMH07ICAvLyBzb3VyY2Ugd2lkdGgKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHZ1aWQpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjT2Zmc2V0LTAxNzgzIik7ICAvLyBzcmNPZmZzZXQgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShpbWFnZV8xLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZV8yLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGNvcHlfcmVnaW9uLnNyY09mZnNldCA9IHsxMiwgMSwgMH07ICAvLyBzb3VyY2UgaGVpZ2h0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB2dWlkKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLXNyY09mZnNldC0wMTc4MyIpOyAgLy8gc3JjT2Zmc2V0IGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgaW1hZ2VfMi5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQgPSB7MCwgMCwgMH07CisKKyAgICB2dWlkID0geWNiY3IgPyAiVlVJRC1Wa0ltYWdlQ29weS1kc3RJbWFnZS0wMTczMSIgOiAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNjIiOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldCA9IHsxLCAwLCAwfTsgIC8vIGRlc3Qgd2lkdGgKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHZ1aWQpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtZHN0T2Zmc2V0LTAxNzg0Iik7ICAvLyBkc3RPZmZzZXQgaW1hZ2UgdHJhbnNmZXIgZ3JhbnVsYXJpdHkKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShpbWFnZV8xLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZV8yLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldCA9IHs0LCAxLCAwfTsgIC8vIGRlc3QgaGVpZ2h0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB2dWlkKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLWRzdE9mZnNldC0wMTc4NCIpOyAgLy8gZHN0T2Zmc2V0IGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgaW1hZ2VfMi5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQgPSB7MCwgMCwgMH07CisKKyAgICAvLyBDb3B5IGV4dGVudCBtdXN0IGJlIG11bHRpcGxlcyBvZiBjb21wcmVzc2VkIGJsb2NrIHNpemVzIHs0LCA0LCAxfSBpZiBub3QgZnVsbCB3aWR0aC9oZWlnaHQKKyAgICB2dWlkID0geWNiY3IgPyAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTcyOCIgOiAiVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNTgiOworICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IHs2MiwgNjAsIDF9OyAgLy8gc291cmNlIHdpZHRoCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB2dWlkKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLXNyY09mZnNldC0wMTc4MyIpOyAgLy8gc3JjIGV4dGVudCBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKGltYWdlXzEuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzIuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdnVpZCA9IHljYmNyID8gIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE3MjkiIDogIlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTU5IjsKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQgPSB7NjAsIDYyLCAxfTsgIC8vIHNvdXJjZSBoZWlnaHQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHZ1aWQpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjT2Zmc2V0LTAxNzgzIik7ICAvLyBzcmMgZXh0ZW50IGltYWdlIHRyYW5zZmVyIGdyYW51bGFyaXR5CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfMS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgaW1hZ2VfMi5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZ1aWQgPSB5Y2JjciA/ICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzMyIiA6ICJWVUlELVZrSW1hZ2VDb3B5LWV4dGVudC0wMDE2MyI7CisgICAgY29weV9yZWdpb24uZXh0ZW50ID0gezYyLCA2MCwgMX07ICAvLyBkZXN0IHdpZHRoCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB2dWlkKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLWRzdE9mZnNldC0wMTc4NCIpOyAgLy8gZHN0IGV4dGVudCBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKGltYWdlXzIuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzEuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdnVpZCA9IHljYmNyID8gIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzMiIDogIlZVSUQtVmtJbWFnZUNvcHktZXh0ZW50LTAwMTY0IjsKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQgPSB7NjAsIDYyLCAxfTsgIC8vIGRlc3QgaGVpZ2h0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB2dWlkKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLWRzdE9mZnNldC0wMTc4NCIpOyAgLy8gZHN0IGV4dGVudCBpbWFnZSB0cmFuc2ZlciBncmFudWxhcml0eQorICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKGltYWdlXzIuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlXzEuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBOb3RlOiAiVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNjAiLCAiVlVJRC1Wa0ltYWdlQ29weS1leHRlbnQtMDAxNjUiLCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTczMCIsCisgICAgLy8gIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE3MzQiCisgICAgLy8gICAgICAgVGhlcmUgYXJlIGN1cnJlbnRseSBubyBzdXBwb3J0ZWQgY29tcHJlc3NlZCBmb3JtYXRzIHdpdGggYSBibG9jayBkZXB0aCBvdGhlciB0aGFuIDEsCisgICAgLy8gICAgICAgc28gaW1wb3NzaWJsZSB0byBjcmVhdGUgYSAnbm90IGEgbXVsdGlwbGUnIGNvbmRpdGlvbiBmb3IgZGVwdGguCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb3B5SW1hZ2VTaW5nbGVQbGFuZTQyMkFsaWdubWVudCkgeworICAgIC8vIEltYWdlIGNvcHkgdGVzdHMgb24gc2luZ2xlLXBsYW5lIF80MjIgZm9ybWF0cyB3aXRoIGJsb2NrIGFsaWdubWVudCBlcnJvcnMKKworICAgIC8vIEVuYWJsZSBLSFIgbXVsdGlwbGFuZSByZXEnZCBleHRlbnNpb25zCisgICAgYm9vbCBtcF9leHRlbnNpb25zID0gSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX1NQRUNfVkVSU0lPTik7CisgICAgaWYgKG1wX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAobXBfZXh0ZW5zaW9ucykgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyB0ZXN0IHJlcXVpcmVzIEtIUiBtdWx0aXBsYW5lIGV4dGVuc2lvbnMsIG5vdCBhdmFpbGFibGUuICBTa2lwcGluZy5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICAvLyBTZWxlY3QgYSBfNDIyIGZvcm1hdCBhbmQgdmVyaWZ5IHN1cHBvcnQKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBjaSA9IHt9OworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk1fS0hSOworICAgIGNpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGNpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgY2kubWlwTGV2ZWxzID0gMTsKKyAgICBjaS5hcnJheUxheWVycyA9IDE7CisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgY2kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMDsKKyAgICBjaS5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTDsKKyAgICBjaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKworICAgIC8vIFZlcmlmeSBmb3JtYXRzCisgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZmVhdHVyZXMgPSBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBib29sIHN1cHBvcnRlZCA9IEltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoaW5zdGFuY2UoKSwgZ3B1KCksIGNpLCBmZWF0dXJlcyk7CisgICAgaWYgKCFzdXBwb3J0ZWQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBTaW5nbGUtcGxhbmUgXzQyMiBpbWFnZSBmb3JtYXQgbm90IHN1cHBvcnRlZC4gIFNraXBwaW5nIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsgIC8vIEFzc3VtZSB0aGVyZSdzIGxvdyBST0kgb24gc2VhcmNoaW5nIGZvciBkaWZmZXJlbnQgbXAgZm9ybWF0cworICAgIH0KKworICAgIC8vIENyZWF0ZSBpbWFnZXMKKyAgICBjaS5leHRlbnQgPSB7NjQsIDY0LCAxfTsKKyAgICBWa0ltYWdlT2JqIGltYWdlXzQyMihtX2RldmljZSk7CisgICAgaW1hZ2VfNDIyLmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV80MjIuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBjaS5leHRlbnQgPSB7NjQsIDY0LCAxfTsKKyAgICBjaS5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgVmtJbWFnZU9iaiBpbWFnZV91Y21wKG1fZGV2aWNlKTsKKyAgICBpbWFnZV91Y21wLmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV91Y21wLmluaXRpYWxpemVkKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgVmtJbWFnZUNvcHkgY29weV9yZWdpb247CisgICAgY29weV9yZWdpb24uZXh0ZW50ID0gezQ4LCA0OCwgMX07CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLnNyY09mZnNldCA9IHswLCAwLCAwfTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQgPSB7MCwgMCwgMH07CisKKyAgICAvLyBTcmMgb2Zmc2V0cyBtdXN0IGJlIG11bHRpcGxlcyBvZiBjb21wcmVzc2VkIGJsb2NrIHNpemVzCisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0ID0gezMsIDQsIDB9OyAgLy8gc291cmNlIG9mZnNldCB4CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNJbWFnZS0wMTcyNyIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjT2Zmc2V0LTAxNzgzIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfNDIyLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZV91Y21wLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0ID0gezAsIDAsIDB9OworCisgICAgLy8gRHN0IG9mZnNldHMgbXVzdCBiZSBtdWx0aXBsZXMgb2YgY29tcHJlc3NlZCBibG9jayBzaXplcworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldCA9IHsxLCAwLCAwfTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNzMxIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZS1kc3RPZmZzZXQtMDE3ODQiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTIzIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTAiKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShpbWFnZV91Y21wLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZV80MjIuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQgPSB7MCwgMCwgMH07CisKKyAgICAvLyBDb3B5IGV4dGVudCBtdXN0IGJlIG11bHRpcGxlcyBvZiBjb21wcmVzc2VkIGJsb2NrIHNpemVzIGlmIG5vdCBmdWxsIHdpZHRoL2hlaWdodAorICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IHszMSwgNjAsIDF9OyAgLy8gNDIyIHNvdXJjZSwgZXh0ZW50LngKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNzI4Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNPZmZzZXQtMDE3ODMiKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShpbWFnZV80MjIuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlX3VjbXAuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIDQyMiBkZXN0CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2VfdWNtcC5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgaW1hZ2VfNDIyLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0ID0gezAsIDAsIDB9OworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb3B5SW1hZ2VNdWx0aXBsYW5lQXNwZWN0Qml0cykgeworICAgIC8vIEltYWdlIGNvcHkgdGVzdHMgb24gbXVsdGlwbGFuZSBpbWFnZXMgd2l0aCBhc3BlY3QgZXJyb3JzCisKKyAgICAvLyBFbmFibGUgS0hSIG11bHRpcGxhbmUgcmVxJ2QgZXh0ZW5zaW9ucworICAgIGJvb2wgbXBfZXh0ZW5zaW9ucyA9IEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9TUEVDX1ZFUlNJT04pOworICAgIGlmIChtcF9leHRlbnNpb25zKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKG1wX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgdGVzdCByZXF1aXJlcyBLSFIgbXVsdGlwbGFuZSBleHRlbnNpb25zLCBub3QgYXZhaWxhYmxlLiAgU2tpcHBpbmcuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgLy8gU2VsZWN0IG11bHRpLXBsYW5lIGZvcm1hdHMgYW5kIHZlcmlmeSBzdXBwb3J0CisgICAgVmtGb3JtYXQgbXAzX2Zvcm1hdCA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNX0tIUjsKKyAgICBWa0Zvcm1hdCBtcDJfZm9ybWF0ID0gVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STV9LSFI7CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBjaSA9IHt9OworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IG1wMl9mb3JtYXQ7CisgICAgY2kuZXh0ZW50ID0gezI1NiwgMjU2LCAxfTsKKyAgICBjaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBjaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGNpLm1pcExldmVscyA9IDE7CisgICAgY2kuYXJyYXlMYXllcnMgPSAxOworICAgIGNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgY2kuc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgIGNpLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDA7CisgICAgY2kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IE5VTEw7CisgICAgY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisKKyAgICAvLyBWZXJpZnkgZm9ybWF0cworICAgIFZrRm9ybWF0RmVhdHVyZUZsYWdzIGZlYXR1cmVzID0gVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgYm9vbCBzdXBwb3J0ZWQgPSBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGluc3RhbmNlKCksIGdwdSgpLCBjaSwgZmVhdHVyZXMpOworICAgIGNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDsKKyAgICBzdXBwb3J0ZWQgPSBzdXBwb3J0ZWQgJiYgSW1hZ2VGb3JtYXRBbmRGZWF0dXJlc1N1cHBvcnRlZChpbnN0YW5jZSgpLCBncHUoKSwgY2ksIGZlYXR1cmVzKTsKKyAgICBjaS5mb3JtYXQgPSBtcDNfZm9ybWF0OworICAgIHN1cHBvcnRlZCA9IHN1cHBvcnRlZCAmJiBJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGluc3RhbmNlKCksIGdwdSgpLCBjaSwgZmVhdHVyZXMpOworICAgIGlmICghc3VwcG9ydGVkKSB7CisgICAgICAgIHByaW50ZigiJXMgTXVsdGlwbGFuZSBpbWFnZSBmb3JtYXRzIG9yIG9wdGltYWxseSB0aWxlZCBkZXB0aC1zdGVuY2lsIGJ1ZmZlcnMgbm90IHN1cHBvcnRlZC4gIFNraXBwaW5nIHRlc3QuXG4iLAorICAgICAgICAgICAgICAga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47ICAvLyBBc3N1bWUgdGhlcmUncyBsb3cgUk9JIG9uIHNlYXJjaGluZyBmb3IgZGlmZmVyZW50IG1wIGZvcm1hdHMKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgaW1hZ2VzCisgICAgVmtJbWFnZU9iaiBtcDNfaW1hZ2UobV9kZXZpY2UpOworICAgIG1wM19pbWFnZS5pbml0KCZjaSk7CisgICAgQVNTRVJUX1RSVUUobXAzX2ltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgY2kuZm9ybWF0ID0gbXAyX2Zvcm1hdDsKKyAgICBWa0ltYWdlT2JqIG1wMl9pbWFnZShtX2RldmljZSk7CisgICAgbXAyX2ltYWdlLmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShtcDJfaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBjaS5mb3JtYXQgPSBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQ7CisgICAgVmtJbWFnZU9iaiBzcF9pbWFnZShtX2RldmljZSk7CisgICAgc3BfaW1hZ2UuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKHNwX2ltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgVmtJbWFnZUNvcHkgY29weV9yZWdpb247CisgICAgY29weV9yZWdpb24uZXh0ZW50ID0gezEyOCwgMTI4LCAxfTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUX0tIUjsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUX0tIUjsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0ID0gezAsIDAsIDB9OworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldCA9IHswLCAwLCAwfTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMzUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNTUyIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UobXAyX2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBtcDNfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMzUiKTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LXNyY0ltYWdlLTAxNTUzIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UobXAzX2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBtcDJfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVRfS0hSOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMzUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNTU0Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UobXAzX2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBtcDJfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMzUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWRzdEltYWdlLTAxNTU1Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UobXAyX2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBtcDNfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE1NTYiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJkZXN0IGltYWdlIGRlcHRoL3N0ZW5jaWwgZm9ybWF0cyIpOyAgLy8gYWxzbworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKG1wMl9pbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgc3BfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVRfS0hSOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktZHN0SW1hZ2UtMDE1NTciKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJkZXN0IGltYWdlIGRlcHRoL3N0ZW5jaWwgZm9ybWF0cyIpOyAgLy8gYWxzbworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKHNwX2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBtcDNfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ29weUltYWdlU3JjU2l6ZUV4Y2VlZGVkKSB7CisgICAgLy8gSW1hZ2UgY29weSB3aXRoIHNvdXJjZSByZWdpb24gc3BlY2lmaWVkIGdyZWF0ZXIgdGhhbiBzcmMgaW1hZ2Ugc2l6ZQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICAvLyBDcmVhdGUgaW1hZ2VzIHdpdGggZnVsbCBtaXAgY2hhaW4KKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBjaTsKKyAgICBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGNpLnBOZXh0ID0gTlVMTDsKKyAgICBjaS5mbGFncyA9IDA7CisgICAgY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8zRDsKKyAgICBjaS5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgY2kuZXh0ZW50ID0gezMyLCAzMiwgOH07CisgICAgY2kubWlwTGV2ZWxzID0gNjsKKyAgICBjaS5hcnJheUxheWVycyA9IDE7CisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBjaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisgICAgY2kuc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgIGNpLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDA7CisgICAgY2kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IE5VTEw7CisgICAgY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisKKyAgICBWa0ltYWdlT2JqIHNyY19pbWFnZShtX2RldmljZSk7CisgICAgc3JjX2ltYWdlLmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShzcmNfaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyBEZXN0IGltYWdlIHdpdGggb25lIG1vcmUgbWlwIGxldmVsCisgICAgY2kuZXh0ZW50ID0gezY0LCA2NCwgMTZ9OworICAgIGNpLm1pcExldmVscyA9IDc7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIFZrSW1hZ2VPYmogZHN0X2ltYWdlKG1fZGV2aWNlKTsKKyAgICBkc3RfaW1hZ2UuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKGRzdF9pbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIFZrSW1hZ2VDb3B5IGNvcHlfcmVnaW9uOworICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IHszMiwgMzIsIDh9OworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQgPSB7MCwgMCwgMH07CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0ID0gezAsIDAsIDB9OworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShzcmNfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRzdF9pbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgLy8gU291cmNlIGV4Y2VlZGVkIGluIHgtZGltLCBWVSAwMTIwMgorICAgIGNvcHlfcmVnaW9uLnNyY09mZnNldC54ID0gNDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTIyIik7ICAvLyBHZW5lcmFsICJjb250YWluZWQgd2l0aGluIiBWVQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktc3JjT2Zmc2V0LTAwMTQ0Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2Uoc3JjX2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBkc3RfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFNvdXJjZSBleGNlZWRlZCBpbiB5LWRpbSwgVlUgMDEyMDMKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQueCA9IDA7CisgICAgY29weV9yZWdpb24uZXh0ZW50LmhlaWdodCA9IDQ4OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2UtcFJlZ2lvbnMtMDAxMjIiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LXNyY09mZnNldC0wMDE0NSIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKHNyY19pbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZHN0X2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBTb3VyY2UgZXhjZWVkZWQgaW4gei1kaW0sIFZVIDAxMjA0CisgICAgY29weV9yZWdpb24uZXh0ZW50ID0gezQsIDQsIDR9OworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTIyIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1zcmNPZmZzZXQtMDAxNDciKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShzcmNfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRzdF9pbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb3B5SW1hZ2VEc3RTaXplRXhjZWVkZWQpIHsKKyAgICAvLyBJbWFnZSBjb3B5IHdpdGggZGVzdCByZWdpb24gc3BlY2lmaWVkIGdyZWF0ZXIgdGhhbiBkZXN0IGltYWdlIHNpemUKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQ3JlYXRlIGltYWdlcyB3aXRoIGZ1bGwgbWlwIGNoYWluCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gY2k7CisgICAgY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBjaS5wTmV4dCA9IE5VTEw7CisgICAgY2kuZmxhZ3MgPSAwOworICAgIGNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfM0Q7CisgICAgY2kuZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIGNpLmV4dGVudCA9IHszMiwgMzIsIDh9OworICAgIGNpLm1pcExldmVscyA9IDY7CisgICAgY2kuYXJyYXlMYXllcnMgPSAxOworICAgIGNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGNpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBjaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGNpLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGNpLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworCisgICAgVmtJbWFnZU9iaiBkc3RfaW1hZ2UobV9kZXZpY2UpOworICAgIGRzdF9pbWFnZS5pbml0KCZjaSk7CisgICAgQVNTRVJUX1RSVUUoZHN0X2ltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgLy8gU3JjIGltYWdlIHdpdGggb25lIG1vcmUgbWlwIGxldmVsCisgICAgY2kuZXh0ZW50ID0gezY0LCA2NCwgMTZ9OworICAgIGNpLm1pcExldmVscyA9IDc7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgIFZrSW1hZ2VPYmogc3JjX2ltYWdlKG1fZGV2aWNlKTsKKyAgICBzcmNfaW1hZ2UuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKHNyY19pbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIFZrSW1hZ2VDb3B5IGNvcHlfcmVnaW9uOworICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IHszMiwgMzIsIDh9OworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQgPSB7MCwgMCwgMH07CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0ID0gezAsIDAsIDB9OworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShzcmNfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRzdF9pbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgLy8gRGVzdCBleGNlZWRlZCBpbiB4LWRpbSwgVlUgMDEyMDUKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQueCA9IDQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZENvcHlJbWFnZS1wUmVnaW9ucy0wMDEyMyIpOyAgLy8gR2VuZXJhbCAiY29udGFpbmVkIHdpdGhpbiIgVlUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWRzdE9mZnNldC0wMDE1MCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKHNyY19pbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZHN0X2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBEZXN0IGV4Y2VlZGVkIGluIHktZGltLCBWVSAwMTIwNgorICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldC54ID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQuaGVpZ2h0ID0gNDg7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZS1wUmVnaW9ucy0wMDEyMyIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktZHN0T2Zmc2V0LTAwMTUxIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2Uoc3JjX2ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBkc3RfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHlfcmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIERlc3QgZXhjZWVkZWQgaW4gei1kaW0sIFZVIDAxMjA3CisgICAgY29weV9yZWdpb24uZXh0ZW50ID0gezQsIDQsIDR9OworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weUltYWdlLXBSZWdpb25zLTAwMTIzIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ29weS1kc3RPZmZzZXQtMDAxNTMiKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkNvcHlJbWFnZShzcmNfaW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRzdF9pbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb3B5SW1hZ2VGb3JtYXRTaXplTWlzbWF0Y2gpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgYm9vbCBwYXNzOworCisgICAgLy8gQ3JlYXRlIGNvbG9yIGltYWdlcyB3aXRoIGRpZmZlcmVudCBmb3JtYXQgc2l6ZXMgYW5kIHRyeSB0byBjb3B5IGJldHdlZW4gdGhlbQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMzUiKTsKKworICAgIFNldFRhcmdldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8xKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KG51bGxwdHIsIG51bGxwdHIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisKKyAgICAvLyBDcmVhdGUgdHdvIGltYWdlcyBvZiBkaWZmZXJlbnQgdHlwZXMgYW5kIHRyeSB0byBjb3B5IGJldHdlZW4gdGhlbQorICAgIFZrSW1hZ2Ugc3JjSW1hZ2U7CisgICAgVmtJbWFnZSBkc3RJbWFnZTsKKyAgICBWa0RldmljZU1lbW9yeSBzcmNNZW07CisgICAgVmtEZXZpY2VNZW1vcnkgZGVzdE1lbTsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1SZXFzOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSAzMjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gMzI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKworICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJnNyY0ltYWdlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIC8vIEludHJvZHVjZSBmYWlsdXJlIGJ5IGNyZWF0aW5nIHNlY29uZCBpbWFnZSB3aXRoIGEgZGlmZmVyZW50LXNpemVkIGZvcm1hdC4KKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfUjVHNUI1QTFfVU5PUk1fUEFDSzE2OworICAgIFZrRm9ybWF0UHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQsICZwcm9wZXJ0aWVzKTsKKyAgICBpZiAocHJvcGVydGllcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgPT0gMCkgeworICAgICAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc3JjSW1hZ2UsIE5VTEwpOworICAgICAgICBwcmludGYoIiVzIEltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmZHN0SW1hZ2UpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBBbGxvY2F0ZSBtZW1vcnkKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1BbGxvYyA9IHt9OworICAgIG1lbUFsbG9jLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtQWxsb2MucE5leHQgPSBOVUxMOworICAgIG1lbUFsbG9jLmFsbG9jYXRpb25TaXplID0gMDsKKyAgICBtZW1BbGxvYy5tZW1vcnlUeXBlSW5kZXggPSAwOworCisgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgc3JjSW1hZ2UsICZtZW1SZXFzKTsKKyAgICBtZW1BbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IG1lbVJlcXMuc2l6ZTsKKyAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1SZXFzLm1lbW9yeVR5cGVCaXRzLCAmbWVtQWxsb2MsIDApOworICAgIEFTU0VSVF9UUlVFKHBhc3MpOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksICZtZW1BbGxvYywgTlVMTCwgJnNyY01lbSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIGRzdEltYWdlLCAmbWVtUmVxcyk7CisgICAgbWVtQWxsb2MuYWxsb2NhdGlvblNpemUgPSBtZW1SZXFzLnNpemU7CisgICAgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUobWVtUmVxcy5tZW1vcnlUeXBlQml0cywgJm1lbUFsbG9jLCAwKTsKKyAgICBBU1NFUlRfVFJVRShwYXNzKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtQWxsb2MsIE5VTEwsICZkZXN0TWVtKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIHNyY0ltYWdlLCBzcmNNZW0sIDApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGRzdEltYWdlLCBkZXN0TWVtLCAwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIFZrSW1hZ2VDb3B5IGNvcHlSZWdpb247CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnggPSAwOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnkgPSAwOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0LnogPSAwOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC54ID0gMDsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC55ID0gMDsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldC56ID0gMDsKKyAgICBjb3B5UmVnaW9uLmV4dGVudC53aWR0aCA9IDE7CisgICAgY29weVJlZ2lvbi5leHRlbnQuaGVpZ2h0ID0gMTsKKyAgICBjb3B5UmVnaW9uLmV4dGVudC5kZXB0aCA9IDE7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2Uoc3JjSW1hZ2UsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBkc3RJbWFnZSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5UmVnaW9uKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHN0SW1hZ2UsIE5VTEwpOworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgZGVzdE1lbSwgTlVMTCk7CisKKyAgICAvLyBDb3B5IHRvIG11bHRpcGxhbmUgaW1hZ2Ugd2l0aCBtaXNtYXRjaGVkIHNpemVzCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlJbWFnZS1zcmNJbWFnZS0wMDEzNSIpOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gY2k7CisgICAgY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBjaS5wTmV4dCA9IE5VTEw7CisgICAgY2kuZmxhZ3MgPSAwOworICAgIGNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgY2kuZm9ybWF0ID0gVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjBfVU5PUk07CisgICAgY2kuZXh0ZW50ID0gezMyLCAzMiwgMX07CisgICAgY2kubWlwTGV2ZWxzID0gMTsKKyAgICBjaS5hcnJheUxheWVycyA9IDE7CisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfTElORUFSOworICAgIGNpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBjaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgY2kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMDsKKyAgICBjaS5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTDsKKyAgICBjaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKworICAgIFZrRm9ybWF0RmVhdHVyZUZsYWdzIGZlYXR1cmVzID0gVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBib29sIHN1cHBvcnRlZCA9IEltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoaW5zdGFuY2UoKSwgZ3B1KCksIGNpLCBmZWF0dXJlcyk7CisgICAgYm9vbCB5Y2JjciA9IChEZXZpY2VFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpIHx8CisgICAgICAgICAgICAgICAgICAoRGV2aWNlVmFsaWRhdGlvblZlcnNpb24oKSA+PSBWS19BUElfVkVSU0lPTl8xXzEpKTsKKyAgICBpZiAoIXN1cHBvcnRlZCB8fCAheWNiY3IpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBJbWFnZSBmb3JtYXQgbm90IHN1cHBvcnRlZDsgc2tpcHBlZCBtdWx0aXBsYW5hciBjb3B5IHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBzcmNJbWFnZSwgTlVMTCk7CisgICAgICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgc3JjTWVtLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrSW1hZ2VPYmogbXBJbWFnZShtX2RldmljZSk7CisgICAgbXBJbWFnZS5pbml0KCZjaSk7CisgICAgQVNTRVJUX1RSVUUobXBJbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBjb3B5UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQ7CisgICAgdms6OlJlc2V0Q29tbWFuZEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2Uoc3JjSW1hZ2UsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBtcEltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJmNvcHlSZWdpb24pOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBzcmNJbWFnZSwgTlVMTCk7CisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBzcmNNZW0sIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvcHlJbWFnZURlcHRoU3RlbmNpbEZvcm1hdE1pc21hdGNoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBhdXRvIGRlcHRoX2Zvcm1hdCA9IEZpbmRTdXBwb3J0ZWREZXB0aFN0ZW5jaWxGb3JtYXQoZ3B1KCkpOworICAgIGlmICghZGVwdGhfZm9ybWF0KSB7CisgICAgICAgIHByaW50ZigiJXMgQ291bGRuJ3QgZGVwdGggc3RlbmNpbCBpbWFnZSBmb3JtYXQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgcHJvcGVydGllczsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKG1fZGV2aWNlLT5waHkoKS5oYW5kbGUoKSwgVktfRk9STUFUX0QzMl9TRkxPQVQsICZwcm9wZXJ0aWVzKTsKKyAgICBpZiAocHJvcGVydGllcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMgPT0gMCkgeworICAgICAgICBwcmludGYoIiVzIEltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtJbWFnZU9iaiBzcmNJbWFnZShtX2RldmljZSk7CisgICAgc3JjSW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9EMzJfU0ZMT0FULCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgQVNTRVJUX1RSVUUoc3JjSW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisgICAgVmtJbWFnZU9iaiBkc3RJbWFnZShtX2RldmljZSk7CisgICAgZHN0SW1hZ2UuSW5pdCgzMiwgMzIsIDEsIGRlcHRoX2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworICAgIEFTU0VSVF9UUlVFKGRzdEltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgLy8gQ3JlYXRlIHR3byBpbWFnZXMgb2YgZGlmZmVyZW50IHR5cGVzIGFuZCB0cnkgdG8gY29weSBiZXR3ZWVuIHRoZW0KKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBWa0ltYWdlQ29weSBjb3B5UmVnaW9uOworICAgIGNvcHlSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5UmVnaW9uLnNyY09mZnNldC54ID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY09mZnNldC55ID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY09mZnNldC56ID0gMDsKKyAgICBjb3B5UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weVJlZ2lvbi5kc3RPZmZzZXQueCA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RPZmZzZXQueSA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RPZmZzZXQueiA9IDA7CisgICAgY29weVJlZ2lvbi5leHRlbnQud2lkdGggPSAxOworICAgIGNvcHlSZWdpb24uZXh0ZW50LmhlaWdodCA9IDE7CisgICAgY29weVJlZ2lvbi5leHRlbnQuZGVwdGggPSAxOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDb3B5SW1hZ2UgY2FsbGVkIHdpdGggdW5tYXRjaGVkIHNvdXJjZSBhbmQgZGVzdCBpbWFnZSBkZXB0aCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q29weUltYWdlKHNyY0ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZHN0SW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5UmVnaW9uKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ29weUltYWdlU2FtcGxlQ291bnRNaXNtYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkltYWdlIGNvcGllcyB3aXRoIHNhbXBsZSBjb3VudCBtaXMtbWF0Y2hlcyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIGltYWdlX2Zvcm1hdF9wcm9wZXJ0aWVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhncHUoKSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19JTUFHRV9UWVBFXzJELCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZV9mb3JtYXRfcHJvcGVydGllcyk7CisKKyAgICBpZiAoKDAgPT0gKFZLX1NBTVBMRV9DT1VOVF8yX0JJVCAmIGltYWdlX2Zvcm1hdF9wcm9wZXJ0aWVzLnNhbXBsZUNvdW50cykpIHx8CisgICAgICAgICgwID09IChWS19TQU1QTEVfQ09VTlRfNF9CSVQgJiBpbWFnZV9mb3JtYXRfcHJvcGVydGllcy5zYW1wbGVDb3VudHMpKSkgeworICAgICAgICBwcmludGYoIiVzIEltYWdlIG11bHRpLXNhbXBsZSBzdXBwb3J0IG5vdCBmb3VuZDsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGNpOworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBjaS5leHRlbnQgPSB7MTI4LCAxMjgsIDF9OworICAgIGNpLm1pcExldmVscyA9IDE7CisgICAgY2kuYXJyYXlMYXllcnMgPSAxOworICAgIGNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBjaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgY2kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMDsKKyAgICBjaS5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTDsKKyAgICBjaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKworICAgIFZrSW1hZ2VPYmogaW1hZ2UxKG1fZGV2aWNlKTsKKyAgICBpbWFnZTEuaW5pdCgmY2kpOworICAgIEFTU0VSVF9UUlVFKGltYWdlMS5pbml0aWFsaXplZCgpKTsKKworICAgIGNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMl9CSVQ7CisgICAgVmtJbWFnZU9iaiBpbWFnZTIobV9kZXZpY2UpOworICAgIGltYWdlMi5pbml0KCZjaSk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UyLmluaXRpYWxpemVkKCkpOworCisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKyAgICBWa0ltYWdlT2JqIGltYWdlNChtX2RldmljZSk7CisgICAgaW1hZ2U0LmluaXQoJmNpKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZTQuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICBWa0ltYWdlQ29weSBjb3B5UmVnaW9uOworICAgIGNvcHlSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5UmVnaW9uLnNyY09mZnNldCA9IHswLCAwLCAwfTsKKyAgICBjb3B5UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weVJlZ2lvbi5kc3RPZmZzZXQgPSB7MCwgMCwgMH07CisgICAgY29weVJlZ2lvbi5leHRlbnQgPSB7MTI4LCAxMjgsIDF9OworCisgICAgLy8gQ29weSBhIHNpbmdsZSBzYW1wbGUgaW1hZ2UgdG8vZnJvbSBhIG11bHRpLXNhbXBsZSBpbWFnZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMzYiKTsKKyAgICB2azo6Q21kQ29weUltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlMS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlNC5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsCisgICAgICAgICAgICAgICAgICAgICAxLCAmY29weVJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAwMTM2Iik7CisgICAgdms6OkNtZENvcHlJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZTIuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZTEuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICAgICAgICAgICAgICAgMSwgJmNvcHlSZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQ29weSBiZXR3ZWVuIG11bHRpLXNhbXBsZSBpbWFnZXMgd2l0aCBkaWZmZXJlbnQgc2FtcGxlIGNvdW50cworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5SW1hZ2Utc3JjSW1hZ2UtMDAxMzYiKTsKKyAgICB2azo6Q21kQ29weUltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlMi5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlNC5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsCisgICAgICAgICAgICAgICAgICAgICAxLCAmY29weVJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weUltYWdlLXNyY0ltYWdlLTAwMTM2Iik7CisgICAgdms6OkNtZENvcHlJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbWFnZTQuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZTIuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICAgICAgICAgICAgICAgMSwgJmNvcHlSZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb3B5SW1hZ2VBc3BlY3RNaXNtYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkltYWdlIGNvcGllcyB3aXRoIGFzcGVjdCBtYXNrIGVycm9ycyIpOworICAgIFNldFRhcmdldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8xKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIGF1dG8gZHNfZm9ybWF0ID0gRmluZFN1cHBvcnRlZERlcHRoU3RlbmNpbEZvcm1hdChncHUoKSk7CisgICAgaWYgKCFkc19mb3JtYXQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBDb3VsZG4ndCBmaW5kIGRlcHRoIHN0ZW5jaWwgZm9ybWF0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIFZLX0ZPUk1BVF9EMzJfU0ZMT0FULCAmcHJvcGVydGllcyk7CisgICAgaWYgKHByb3BlcnRpZXMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzID09IDApIHsKKyAgICAgICAgcHJpbnRmKCIlcyBJbWFnZSBmb3JtYXQgVktfRk9STUFUX0QzMl9TRkxPQVQgbm90IHN1cHBvcnRlZDsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBWa0ltYWdlT2JqIGNvbG9yX2ltYWdlKG1fZGV2aWNlKSwgZHNfaW1hZ2UobV9kZXZpY2UpLCBkZXB0aF9pbWFnZShtX2RldmljZSk7CisgICAgY29sb3JfaW1hZ2UuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX1IzMl9TRkxPQVQsIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKTsKKyAgICBkZXB0aF9pbWFnZS5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfRDMyX1NGTE9BVCwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgZHNfaW1hZ2UuSW5pdCgxMjgsIDEyOCwgMSwgZHNfZm9ybWF0LCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwKKyAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShjb2xvcl9pbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBBU1NFUlRfVFJVRShkZXB0aF9pbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBBU1NFUlRfVFJVRShkc19pbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VDb3B5IGNvcHlSZWdpb247CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0ID0gezAsIDAsIDB9OworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldCA9IHs2NCwgMCwgMH07CisgICAgY29weVJlZ2lvbi5leHRlbnQgPSB7NjQsIDEyOCwgMX07CisKKyAgICAvLyBTdWJtaXR0aW5nIGNvbW1hbmQgYmVmb3JlIGNvbW1hbmQgYnVmZmVyIGlzIGluIHJlY29yZGluZyBzdGF0ZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IGNhbGwgdmtCZWdpbkNvbW1hbmRCdWZmZXIiKTsgIC8vICJWVUlELXZrQ21kQ29weUltYWdlLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIik7CisgICAgdms6OkNtZENvcHlJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkZXB0aF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRlcHRoX2ltYWdlLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5UmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIC8vIFNyYyBhbmQgZGVzdCBhc3BlY3QgbWFza3MgZG9uJ3QgbWF0Y2gKKyAgICBjb3B5UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgYm9vbCB5Y2JjciA9IChEZXZpY2VFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpIHx8CisgICAgICAgICAgICAgICAgICAoRGV2aWNlVmFsaWRhdGlvblZlcnNpb24oKSA+PSBWS19BUElfVkVSU0lPTl8xXzEpKTsKKyAgICBzdGQ6OnN0cmluZyB2dWlkID0gKHljYmNyID8gIlZVSUQtVmtJbWFnZUNvcHktc3JjSW1hZ2UtMDE1NTEiIDogIlZVSUQtVmtJbWFnZUNvcHktYXNwZWN0TWFzay0wMDEzNyIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgdnVpZCk7CisgICAgdms6OkNtZENvcHlJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRzX2ltYWdlLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5UmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBjb3B5UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworCisgICAgLy8gSWxsZWdhbCBjb21iaW5hdGlvbnMgb2YgYXNwZWN0IGJpdHMKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIHwgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsgIC8vIGNvbG9yIG11c3QgYmUgYWxvbmUKKyAgICBjb3B5UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzLWFzcGVjdE1hc2stMDAxNjciKTsKKyAgICAvLyBUaGVzZSBhc3BlY3QvZm9ybWF0IG1pc21hdGNoZXMgYXJlIHJlZHVuZGFudCBidXQgdW5hdm9pZGFibGUgaGVyZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNvcHktYXNwZWN0TWFzay0wMDE0MiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgdnVpZCk7CisgICAgdms6OkNtZENvcHlJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBjb2xvcl9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGNvbG9yX2ltYWdlLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5UmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBzYW1lIHRlc3QgZm9yIGRzdFN1YnJlc291cmNlCisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5UmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUIHwgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsgIC8vIGNvbG9yIG11c3QgYmUgYWxvbmUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAwMTY3Iik7CisgICAgLy8gVGhlc2UgYXNwZWN0L2Zvcm1hdCBtaXNtYXRjaGVzIGFyZSByZWR1bmRhbnQgYnV0IHVuYXZvaWRhYmxlIGhlcmUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxNDMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHZ1aWQpOworICAgIHZrOjpDbWRDb3B5SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgY29sb3JfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBjb2xvcl9pbWFnZS5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmY29weVJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBNZXRhZGF0YSBhc3BlY3QgaXMgaWxsZWdhbAorICAgIGNvcHlSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9NRVRBREFUQV9CSVQ7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAwMTY4Iik7CisgICAgLy8gVGhlc2UgYXNwZWN0L2Zvcm1hdCBtaXNtYXRjaGVzIGFyZSByZWR1bmRhbnQgYnV0IHVuYXZvaWRhYmxlIGhlcmUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHZ1aWQpOworICAgIHZrOjpDbWRDb3B5SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgY29sb3JfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBjb2xvcl9pbWFnZS5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmY29weVJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gc2FtZSB0ZXN0IGZvciBkc3RTdWJyZXNvdXJjZQorICAgIGNvcHlSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX01FVEFEQVRBX0JJVDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VTdWJyZXNvdXJjZUxheWVycy1hc3BlY3RNYXNrLTAwMTY4Iik7CisgICAgLy8gVGhlc2UgYXNwZWN0L2Zvcm1hdCBtaXNtYXRjaGVzIGFyZSByZWR1bmRhbnQgYnV0IHVuYXZvaWRhYmxlIGhlcmUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHZ1aWQpOworICAgIHZrOjpDbWRDb3B5SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgY29sb3JfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBjb2xvcl9pbWFnZS5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLCAmY29weVJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisKKyAgICAvLyBBc3BlY3QgbWFzayBkb2Vzbid0IG1hdGNoIHNvdXJjZSBpbWFnZSBmb3JtYXQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxNDIiKTsKKyAgICAvLyBBZ2FpbiByZWR1bmRhbnQgYnV0IHVuYXZvaWRhYmxlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAidW5tYXRjaGVkIHNvdXJjZSBhbmQgZGVzdCBpbWFnZSBkZXB0aC9zdGVuY2lsIGZvcm1hdHMiKTsKKyAgICB2azo6Q21kQ29weUltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGNvbG9yX2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZGVwdGhfaW1hZ2UuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJmNvcHlSZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQXNwZWN0IG1hc2sgZG9lc24ndCBtYXRjaCBkZXN0IGltYWdlIGZvcm1hdAorICAgIGNvcHlSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDb3B5LWFzcGVjdE1hc2stMDAxNDMiKTsKKyAgICAvLyBBZ2FpbiByZWR1bmRhbnQgYnV0IHVuYXZvaWRhYmxlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAidW5tYXRjaGVkIHNvdXJjZSBhbmQgZGVzdCBpbWFnZSBkZXB0aC9zdGVuY2lsIGZvcm1hdHMiKTsKKyAgICB2azo6Q21kQ29weUltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGNvbG9yX2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZGVwdGhfaW1hZ2UuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwgJmNvcHlSZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZXNvbHZlSW1hZ2VMb3dTYW1wbGVDb3VudCkgeworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kUmVzb2x2ZUltYWdlIGNhbGxlZCB3aXRoIHNvdXJjZSBzYW1wbGUgY291bnQgbGVzcyB0aGFuIDIuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQ3JlYXRlIHR3byBpbWFnZXMgb2Ygc2FtcGxlIGNvdW50IDEgYW5kIHRyeSB0byBSZXNvbHZlIGJldHdlZW4gdGhlbQorCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSAzMjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisKKyAgICBWa0ltYWdlT2JqIHNyY0ltYWdlKG1fZGV2aWNlKTsKKyAgICBzcmNJbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisgICAgQVNTRVJUX1RSVUUoc3JjSW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0ltYWdlT2JqIGRzdEltYWdlKG1fZGV2aWNlKTsKKyAgICBkc3RJbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisgICAgQVNTRVJUX1RSVUUoZHN0SW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgVmtJbWFnZVJlc29sdmUgcmVzb2x2ZVJlZ2lvbjsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNPZmZzZXQueCA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNPZmZzZXQueSA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNPZmZzZXQueiA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHJlc29sdmVSZWdpb24uZHN0T2Zmc2V0LnggPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0T2Zmc2V0LnkgPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0T2Zmc2V0LnogPSAwOworICAgIHJlc29sdmVSZWdpb24uZXh0ZW50LndpZHRoID0gMTsKKyAgICByZXNvbHZlUmVnaW9uLmV4dGVudC5oZWlnaHQgPSAxOworICAgIHJlc29sdmVSZWdpb24uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPlJlc29sdmVJbWFnZShzcmNJbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGRzdEltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZVJlZ2lvbik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlc29sdmVJbWFnZUhpZ2hTYW1wbGVDb3VudCkgeworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kUmVzb2x2ZUltYWdlIGNhbGxlZCB3aXRoIGRlc3Qgc2FtcGxlIGNvdW50IGdyZWF0ZXIgdGhhbiAxLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIENyZWF0ZSB0d28gaW1hZ2VzIG9mIHNhbXBsZSBjb3VudCA0IGFuZCB0cnkgdG8gUmVzb2x2ZSBiZXR3ZWVuIHRoZW0KKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gMzI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzRfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIC8vIE5vdGU6IFNvbWUgaW1wbGVtZW50YXRpb25zIGV4cGVjdCBjb2xvciBhdHRhY2htZW50IHVzYWdlIGZvciBhbnkKKyAgICAvLyBtdWx0aXNhbXBsZSBzdXJmYWNlCisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPQorICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKworICAgIFZrSW1hZ2VPYmogc3JjSW1hZ2UobV9kZXZpY2UpOworICAgIHNyY0ltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICBBU1NFUlRfVFJVRShzcmNJbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VPYmogZHN0SW1hZ2UobV9kZXZpY2UpOworICAgIGRzdEltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICBBU1NFUlRfVFJVRShkc3RJbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAvLyBOZWVkIG1lbW9yeSBiYXJyaWVyIHRvIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMIGZvciBzb3VyY2UgYW5kIGRlc3Q/CisgICAgLy8gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCA9IDAsCisgICAgLy8gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgPSAxLAorICAgIFZrSW1hZ2VSZXNvbHZlIHJlc29sdmVSZWdpb247CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHJlc29sdmVSZWdpb24uc3JjT2Zmc2V0LnggPSAwOworICAgIHJlc29sdmVSZWdpb24uc3JjT2Zmc2V0LnkgPSAwOworICAgIHJlc29sdmVSZWdpb24uc3JjT2Zmc2V0LnogPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICByZXNvbHZlUmVnaW9uLmRzdE9mZnNldC54ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdE9mZnNldC55ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdE9mZnNldC56ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmV4dGVudC53aWR0aCA9IDE7CisgICAgcmVzb2x2ZVJlZ2lvbi5leHRlbnQuaGVpZ2h0ID0gMTsKKyAgICByZXNvbHZlUmVnaW9uLmV4dGVudC5kZXB0aCA9IDE7CisgICAgbV9jb21tYW5kQnVmZmVyLT5SZXNvbHZlSW1hZ2Uoc3JjSW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBkc3RJbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVSZWdpb24pOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZXNvbHZlSW1hZ2VGb3JtYXRNaXNtYXRjaCkgeworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRSZXNvbHZlSW1hZ2UgY2FsbGVkIHdpdGggdW5tYXRjaGVkIHNvdXJjZSBhbmQgZGVzdCBmb3JtYXRzLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIENyZWF0ZSB0d28gaW1hZ2VzIG9mIGRpZmZlcmVudCB0eXBlcyBhbmQgdHJ5IHRvIGNvcHkgYmV0d2VlbiB0aGVtCisgICAgVmtJbWFnZU9iaiBzcmNJbWFnZShtX2RldmljZSk7CisgICAgVmtJbWFnZU9iaiBkc3RJbWFnZShtX2RldmljZSk7CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDMyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8yX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICAvLyBOb3RlOiBTb21lIGltcGxlbWVudGF0aW9ucyBleHBlY3QgY29sb3IgYXR0YWNobWVudCB1c2FnZSBmb3IgYW55CisgICAgLy8gbXVsdGlzYW1wbGUgc3VyZmFjZQorICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKyAgICBzcmNJbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICAvLyBTZXQgZm9ybWF0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHNvdXJjZSBpbWFnZQorICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJfU0ZMT0FUOworICAgIC8vIE5vdGU6IFNvbWUgaW1wbGVtZW50YXRpb25zIGV4cGVjdCBjb2xvciBhdHRhY2htZW50IHVzYWdlIGZvciBhbnkKKyAgICAvLyBtdWx0aXNhbXBsZSBzdXJmYWNlCisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBkc3RJbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgLy8gTmVlZCBtZW1vcnkgYmFycmllciB0byBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCBmb3Igc291cmNlIGFuZCBkZXN0PworICAgIC8vIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgPSAwLAorICAgIC8vIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMID0gMSwKKyAgICBWa0ltYWdlUmVzb2x2ZSByZXNvbHZlUmVnaW9uOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICByZXNvbHZlUmVnaW9uLnNyY09mZnNldC54ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY09mZnNldC55ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY09mZnNldC56ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIHJlc29sdmVSZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RPZmZzZXQueCA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RPZmZzZXQueSA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RPZmZzZXQueiA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5leHRlbnQud2lkdGggPSAxOworICAgIHJlc29sdmVSZWdpb24uZXh0ZW50LmhlaWdodCA9IDE7CisgICAgcmVzb2x2ZVJlZ2lvbi5leHRlbnQuZGVwdGggPSAxOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UmVzb2x2ZUltYWdlKHNyY0ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZHN0SW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlUmVnaW9uKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUmVzb2x2ZUltYWdlVHlwZU1pc21hdGNoKSB7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFJlc29sdmVJbWFnZSBjYWxsZWQgd2l0aCB1bm1hdGNoZWQgc291cmNlIGFuZCBkZXN0IGltYWdlIHR5cGVzLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIENyZWF0ZSB0d28gaW1hZ2VzIG9mIGRpZmZlcmVudCB0eXBlcyBhbmQgdHJ5IHRvIGNvcHkgYmV0d2VlbiB0aGVtCisgICAgVmtJbWFnZU9iaiBzcmNJbWFnZShtX2RldmljZSk7CisgICAgVmtJbWFnZU9iaiBkc3RJbWFnZShtX2RldmljZSk7CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDMyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8yX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICAvLyBOb3RlOiBTb21lIGltcGxlbWVudGF0aW9ucyBleHBlY3QgY29sb3IgYXR0YWNobWVudCB1c2FnZSBmb3IgYW55CisgICAgLy8gbXVsdGlzYW1wbGUgc3VyZmFjZQorICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKyAgICBzcmNJbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzFEOworICAgIC8vIE5vdGU6IFNvbWUgaW1wbGVtZW50YXRpb25zIGV4cGVjdCBjb2xvciBhdHRhY2htZW50IHVzYWdlIGZvciBhbnkKKyAgICAvLyBtdWx0aXNhbXBsZSBzdXJmYWNlCisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBkc3RJbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgLy8gTmVlZCBtZW1vcnkgYmFycmllciB0byBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCBmb3Igc291cmNlIGFuZCBkZXN0PworICAgIC8vIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgPSAwLAorICAgIC8vIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMID0gMSwKKyAgICBWa0ltYWdlUmVzb2x2ZSByZXNvbHZlUmVnaW9uOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICByZXNvbHZlUmVnaW9uLnNyY09mZnNldC54ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY09mZnNldC55ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY09mZnNldC56ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIHJlc29sdmVSZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0U3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RPZmZzZXQueCA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RPZmZzZXQueSA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RPZmZzZXQueiA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5leHRlbnQud2lkdGggPSAxOworICAgIHJlc29sdmVSZWdpb24uZXh0ZW50LmhlaWdodCA9IDE7CisgICAgcmVzb2x2ZVJlZ2lvbi5leHRlbnQuZGVwdGggPSAxOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UmVzb2x2ZUltYWdlKHNyY0ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgZHN0SW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlUmVnaW9uKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUmVzb2x2ZUltYWdlTGF5b3V0TWlzbWF0Y2gpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQ3JlYXRlIHR3byBpbWFnZXMgb2YgZGlmZmVyZW50IHR5cGVzIGFuZCB0cnkgdG8gY29weSBiZXR3ZWVuIHRoZW0KKyAgICBWa0ltYWdlT2JqIHNyY0ltYWdlKG1fZGV2aWNlKTsKKyAgICBWa0ltYWdlT2JqIGRzdEltYWdlKG1fZGV2aWNlKTsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gMzI7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDMyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8yX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9CisgICAgICAgIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgLy8gTm90ZTogU29tZSBpbXBsZW1lbnRhdGlvbnMgZXhwZWN0IGNvbG9yIGF0dGFjaG1lbnQgdXNhZ2UgZm9yIGFueQorICAgIC8vIG11bHRpc2FtcGxlIHN1cmZhY2UKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisgICAgc3JjSW1hZ2UuaW5pdCgmaW1hZ2VfY3JlYXRlX2luZm8pOworICAgIEFTU0VSVF9UUlVFKHNyY0ltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgLy8gTm90ZTogU29tZSBpbXBsZW1lbnRhdGlvbnMgZXhwZWN0IGNvbG9yIGF0dGFjaG1lbnQgdXNhZ2UgZm9yIGFueQorICAgIC8vIG11bHRpc2FtcGxlIHN1cmZhY2UKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGRzdEltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICBBU1NFUlRfVFJVRShkc3RJbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAvLyBzb3VyY2UgaW1hZ2UgbXVzdCBoYXZlIHZhbGlkIGNvbnRlbnRzIGJlZm9yZSByZXNvbHZlCisgICAgVmtDbGVhckNvbG9yVmFsdWUgY2xlYXJfY29sb3IgPSB7ezAsIDAsIDAsIDB9fTsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBzdWJyZXNvdXJjZSA9IHt9OworICAgIHN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIHN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHN1YnJlc291cmNlLmxldmVsQ291bnQgPSAxOworICAgIHNyY0ltYWdlLlNldExheW91dChtX2NvbW1hbmRCdWZmZXIsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5DbGVhckNvbG9ySW1hZ2Uoc3JjSW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAmY2xlYXJfY29sb3IsIDEsICZzdWJyZXNvdXJjZSk7CisgICAgc3JjSW1hZ2UuU2V0TGF5b3V0KG1fY29tbWFuZEJ1ZmZlciwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMKTsKKyAgICBkc3RJbWFnZS5TZXRMYXlvdXQobV9jb21tYW5kQnVmZmVyLCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwpOworCisgICAgVmtJbWFnZVJlc29sdmUgcmVzb2x2ZVJlZ2lvbjsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNPZmZzZXQueCA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNPZmZzZXQueSA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNPZmZzZXQueiA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHJlc29sdmVSZWdpb24uZHN0T2Zmc2V0LnggPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0T2Zmc2V0LnkgPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0T2Zmc2V0LnogPSAwOworICAgIHJlc29sdmVSZWdpb24uZXh0ZW50LndpZHRoID0gMTsKKyAgICByZXNvbHZlUmVnaW9uLmV4dGVudC5oZWlnaHQgPSAxOworICAgIHJlc29sdmVSZWdpb24uZXh0ZW50LmRlcHRoID0gMTsKKyAgICAvLyBzb3VyY2UgaW1hZ2UgbGF5b3V0IG1pc21hdGNoCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNJbWFnZUxheW91dC0wMDI2MCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UmVzb2x2ZUltYWdlKHNyY0ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBkc3RJbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJnJlc29sdmVSZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIGRzdCBpbWFnZSBsYXlvdXQgbWlzbWF0Y2gKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLWRzdEltYWdlTGF5b3V0LTAwMjYyIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5SZXNvbHZlSW1hZ2Uoc3JjSW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLCBkc3RJbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmcmVzb2x2ZVJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZXNvbHZlSW52YWxpZFN1YnJlc291cmNlKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIENyZWF0ZSB0d28gaW1hZ2VzIG9mIGRpZmZlcmVudCB0eXBlcyBhbmQgdHJ5IHRvIGNvcHkgYmV0d2VlbiB0aGVtCisgICAgVmtJbWFnZU9iaiBzcmNJbWFnZShtX2RldmljZSk7CisgICAgVmtJbWFnZU9iaiBkc3RJbWFnZShtX2RldmljZSk7CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDMyOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5oZWlnaHQgPSAzMjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMl9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPQorICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIC8vIE5vdGU6IFNvbWUgaW1wbGVtZW50YXRpb25zIGV4cGVjdCBjb2xvciBhdHRhY2htZW50IHVzYWdlIGZvciBhbnkKKyAgICAvLyBtdWx0aXNhbXBsZSBzdXJmYWNlCisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworICAgIHNyY0ltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICBBU1NFUlRfVFJVRShzcmNJbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIE5vdGU6IFNvbWUgaW1wbGVtZW50YXRpb25zIGV4cGVjdCBjb2xvciBhdHRhY2htZW50IHVzYWdlIGZvciBhbnkKKyAgICAvLyBtdWx0aXNhbXBsZSBzdXJmYWNlCisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBkc3RJbWFnZS5pbml0KCZpbWFnZV9jcmVhdGVfaW5mbyk7CisgICAgQVNTRVJUX1RSVUUoZHN0SW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgLy8gc291cmNlIGltYWdlIG11c3QgaGF2ZSB2YWxpZCBjb250ZW50cyBiZWZvcmUgcmVzb2x2ZQorICAgIFZrQ2xlYXJDb2xvclZhbHVlIGNsZWFyX2NvbG9yID0ge3swLCAwLCAwLCAwfX07CisgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3VicmVzb3VyY2UgPSB7fTsKKyAgICBzdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBzdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBzdWJyZXNvdXJjZS5sZXZlbENvdW50ID0gMTsKKyAgICBzcmNJbWFnZS5TZXRMYXlvdXQobV9jb21tYW5kQnVmZmVyLCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+Q2xlYXJDb2xvckltYWdlKHNyY0ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgJmNsZWFyX2NvbG9yLCAxLCAmc3VicmVzb3VyY2UpOworICAgIHNyY0ltYWdlLlNldExheW91dChtX2NvbW1hbmRCdWZmZXIsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCk7CisgICAgZHN0SW1hZ2UuU2V0TGF5b3V0KG1fY29tbWFuZEJ1ZmZlciwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMKTsKKworICAgIFZrSW1hZ2VSZXNvbHZlIHJlc29sdmVSZWdpb247CisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIHJlc29sdmVSZWdpb24uc3JjT2Zmc2V0LnggPSAwOworICAgIHJlc29sdmVSZWdpb24uc3JjT2Zmc2V0LnkgPSAwOworICAgIHJlc29sdmVSZWdpb24uc3JjT2Zmc2V0LnogPSAwOworICAgIHJlc29sdmVSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICByZXNvbHZlUmVnaW9uLmRzdE9mZnNldC54ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdE9mZnNldC55ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmRzdE9mZnNldC56ID0gMDsKKyAgICByZXNvbHZlUmVnaW9uLmV4dGVudC53aWR0aCA9IDE7CisgICAgcmVzb2x2ZVJlZ2lvbi5leHRlbnQuaGVpZ2h0ID0gMTsKKyAgICByZXNvbHZlUmVnaW9uLmV4dGVudC5kZXB0aCA9IDE7CisgICAgLy8gaW52YWxpZCBzb3VyY2UgbWlwIGxldmVsCisgICAgcmVzb2x2ZVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVsczsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUmVzb2x2ZUltYWdlLXNyY1N1YnJlc291cmNlLTAxNzA5Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5SZXNvbHZlSW1hZ2Uoc3JjSW1hZ2UuaW1hZ2UoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLCBkc3RJbWFnZS5pbWFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwgJnJlc29sdmVSZWdpb24pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlc29sdmVSZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIC8vIGludmFsaWQgZGVzdCBtaXAgbGV2ZWwKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRSZXNvbHZlSW1hZ2UtZHN0U3VicmVzb3VyY2UtMDE3MTAiKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPlJlc29sdmVJbWFnZShzcmNJbWFnZS5pbWFnZSgpLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsIGRzdEltYWdlLmltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLCAmcmVzb2x2ZVJlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgcmVzb2x2ZVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgLy8gaW52YWxpZCBzb3VyY2UgYXJyYXkgbGF5ZXIgcmFuZ2UKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnM7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1zcmNTdWJyZXNvdXJjZS0wMTcxMSIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UmVzb2x2ZUltYWdlKHNyY0ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwgZHN0SW1hZ2UuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsIDEsICZyZXNvbHZlUmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICByZXNvbHZlUmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICAvLyBpbnZhbGlkIGRlc3QgYXJyYXkgbGF5ZXIgcmFuZ2UKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnM7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFJlc29sdmVJbWFnZS1kc3RTdWJyZXNvdXJjZS0wMTcxMiIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UmVzb2x2ZUltYWdlKHNyY0ltYWdlLmltYWdlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwgZHN0SW1hZ2UuaW1hZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsIDEsICZyZXNvbHZlUmVnaW9uKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICByZXNvbHZlUmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ2xlYXJJbWFnZUVycm9ycykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNhbGwgQ2xlYXJDb2xvckltYWdlIHcvIGEgZGVwdGh8c3RlbmNpbCBpbWFnZSBhbmQgQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSB3aXRoIGEgY29sb3IgaW1hZ2UuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBDb2xvciBpbWFnZQorICAgIFZrQ2xlYXJDb2xvclZhbHVlIGNsZWFyX2NvbG9yOworICAgIG1lbXNldChjbGVhcl9jb2xvci51aW50MzIsIDAsIHNpemVvZih1aW50MzJfdCkgKiA0KTsKKyAgICBjb25zdCBWa0Zvcm1hdCBjb2xvcl9mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgY29uc3QgaW50MzJfdCBpbWdfd2lkdGggPSAzMjsKKyAgICBjb25zdCBpbnQzMl90IGltZ19oZWlnaHQgPSAzMjsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gY29sb3JfZm9ybWF0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IGltZ193aWR0aDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gaW1nX2hlaWdodDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgIHZrX3Rlc3Rpbmc6OkltYWdlIGNvbG9yX2ltYWdlX25vX3RyYW5zZmVyOworICAgIGNvbG9yX2ltYWdlX25vX3RyYW5zZmVyLmluaXQoKm1fZGV2aWNlLCBpbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICB2a190ZXN0aW5nOjpJbWFnZSBjb2xvcl9pbWFnZTsKKyAgICBjb2xvcl9pbWFnZS5pbml0KCptX2RldmljZSwgaW1hZ2VfY3JlYXRlX2luZm8pOworCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgY29sb3JfcmFuZ2UgPSB2a190ZXN0aW5nOjpJbWFnZTo6c3VicmVzb3VyY2VfcmFuZ2UoaW1hZ2VfY3JlYXRlX2luZm8sIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQpOworCisgICAgLy8gRGVwdGgvU3RlbmNpbCBpbWFnZQorICAgIFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSBjbGVhcl92YWx1ZSA9IHswfTsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBkc19pbWFnZV9jcmVhdGVfaW5mbyA9IHZrX3Rlc3Rpbmc6OkltYWdlOjpjcmVhdGVfaW5mbygpOworICAgIGRzX2ltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgZHNfaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gVktfRk9STUFUX0QxNl9VTk9STTsKKyAgICBkc19pbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSA2NDsKKyAgICBkc19pbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gNjQ7CisgICAgZHNfaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgZHNfaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKworICAgIHZrX3Rlc3Rpbmc6OkltYWdlIGRzX2ltYWdlOworICAgIGRzX2ltYWdlLmluaXQoKm1fZGV2aWNlLCBkc19pbWFnZV9jcmVhdGVfaW5mbyk7CisKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBkc19yYW5nZSA9IHZrX3Rlc3Rpbmc6OkltYWdlOjpzdWJyZXNvdXJjZV9yYW5nZShkc19pbWFnZV9jcmVhdGVfaW5mbywgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJ2a0NtZENsZWFyQ29sb3JJbWFnZSBjYWxsZWQgd2l0aCBkZXB0aC9zdGVuY2lsIGltYWdlLiIpOworCisgICAgdms6OkNtZENsZWFyQ29sb3JJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc19pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsICZjbGVhcl9jb2xvciwgMSwgJmNvbG9yX3JhbmdlKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRDbGVhckNvbG9ySW1hZ2UgY2FsbGVkIHdpdGggaW1hZ2UgY3JlYXRlZCB3aXRob3V0IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQiKTsKKworICAgIHZrOjpDbWRDbGVhckNvbG9ySW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgY29sb3JfaW1hZ2Vfbm9fdHJhbnNmZXIuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAmY2xlYXJfY29sb3IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JfcmFuZ2UpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDYWxsIENtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2Ugd2l0aCBjb2xvciBpbWFnZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSBjYWxsZWQgd2l0aG91dCBhIGRlcHRoL3N0ZW5jaWwgaW1hZ2UuIik7CisKKyAgICB2azo6Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBjb2xvcl9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGVhcl92YWx1ZSwgMSwgJmRzX3JhbmdlKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvbW1hbmRRdWV1ZUZsYWdzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkFsbG9jYXRlIGEgY29tbWFuZCBidWZmZXIgb24gYSBxdWV1ZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgZ3JhcGhpY3MgYW5kIHRyeSB0byBpc3N1ZSBhIGdyYXBoaWNzLW9ubHkgY29tbWFuZCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXggPSBtX2RldmljZS0+UXVldWVGYW1pbHlXaXRob3V0Q2FwYWJpbGl0aWVzKFZLX1FVRVVFX0dSQVBISUNTX0JJVCk7CisgICAgaWYgKHF1ZXVlRmFtaWx5SW5kZXggPT0gVUlOVDMyX01BWCkgeworICAgICAgICBwcmludGYoIiVzIE5vbi1ncmFwaGljcyBxdWV1ZSBmYW1pbHkgbm90IGZvdW5kOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ3JlYXRlIGNvbW1hbmQgcG9vbCBvbiBhIG5vbi1ncmFwaGljcyBxdWV1ZQorICAgICAgICBWa0NvbW1hbmRQb29sT2JqIGNvbW1hbmRfcG9vbChtX2RldmljZSwgcXVldWVGYW1pbHlJbmRleCk7CisKKyAgICAgICAgLy8gU2V0dXAgY29tbWFuZCBidWZmZXIgb24gcG9vbAorICAgICAgICBWa0NvbW1hbmRCdWZmZXJPYmogY29tbWFuZF9idWZmZXIobV9kZXZpY2UsICZjb21tYW5kX3Bvb2wpOworICAgICAgICBjb21tYW5kX2J1ZmZlci5iZWdpbigpOworCisgICAgICAgIC8vIElzc3VlIGEgZ3JhcGhpY3Mgb25seSBjb21tYW5kCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1jb21tYW5kQnVmZmVyLWNtZHBvb2wiKTsKKyAgICAgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgICAgICBjb21tYW5kX2J1ZmZlci5TZXRWaWV3cG9ydCgwLCAxLCAmdmlld3BvcnQpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRXhlY3V0ZVVucmVjb3JkZWRTZWNvbmRhcnlDQikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdmtDbWRFeGVjdXRlQ29tbWFuZHMgd2l0aCBhIENCIGluIHRoZSBpbml0aWFsIHN0YXRlIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogc2Vjb25kYXJ5KG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sLCBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpOworICAgIC8vIG5ldmVyIHJlY29yZCBzZWNvbmRhcnkKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRFeGVjdXRlQ29tbWFuZHMtcENvbW1hbmRCdWZmZXJzLTAwMDg5Iik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY29uZGFyeS5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBFeGVjdXRlU2Vjb25kYXJ5Q0JXaXRoTGF5b3V0TWlzbWF0Y2gpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHZrQ21kRXhlY3V0ZUNvbW1hbmRzIHdpdGggYSBDQiB3aXRoIGluY29ycmVjdCBpbml0aWFsIGxheW91dC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCBudWxscHRyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSAzMjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisKKyAgICBWa0ltYWdlU3VicmVzb3VyY2UgaW1hZ2Vfc3ViID0gVmtJbWFnZU9iajo6c3VicmVzb3VyY2UoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMCk7CisgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgaW1hZ2Vfc3ViX3JhbmdlID0gVmtJbWFnZU9iajo6c3VicmVzb3VyY2VfcmFuZ2UoaW1hZ2Vfc3ViKTsKKworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWFnZV9iYXJyaWVyID0KKyAgICAgICAgaW1hZ2UuaW1hZ2VfbWVtb3J5X2JhcnJpZXIoMCwgMCwgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlX3N1Yl9yYW5nZSk7CisKKyAgICBhdXRvIHBpcGVsaW5lID0gWyZpbWFnZV9iYXJyaWVyXShjb25zdCBWa0NvbW1hbmRCdWZmZXJPYmogJmNiLCBWa0ltYWdlTGF5b3V0IG9sZF9sYXlvdXQsIFZrSW1hZ2VMYXlvdXQgbmV3X2xheW91dCkgeworICAgICAgICBpbWFnZV9iYXJyaWVyLm9sZExheW91dCA9IG9sZF9sYXlvdXQ7CisgICAgICAgIGltYWdlX2JhcnJpZXIubmV3TGF5b3V0ID0gbmV3X2xheW91dDsKKyAgICAgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihjYi5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgMCwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBudWxscHRyLCAxLCAmaW1hZ2VfYmFycmllcik7CisgICAgfTsKKworICAgIC8vIFZhbGlkYXRlIHRoYXQgbWlzbWF0Y2hlZCB1c2Ugb2YgaW1hZ2UgbGF5b3V0IGluIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciBpcyBjYXVnaHQgYXQgcmVjb3JkIHRpbWUKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogc2Vjb25kYXJ5KG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sLCBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpOworICAgIHNlY29uZGFyeS5iZWdpbigpOworICAgIHBpcGVsaW5lKHNlY29uZGFyeSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCk7CisgICAgc2Vjb25kYXJ5LmVuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVU5BU1NJR05FRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1jb21tYW5kQnVmZmVyLTAwMDAxIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHBpcGVsaW5lKCptX2NvbW1hbmRCdWZmZXIsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY29uZGFyeS5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IHdlJ3ZlIHRyYWNrZWQgdGhlIGNoYW5nZXMgZnJvbSB0aGUgc2Vjb25kYXJ5IENCIGNvcnJlY3RseQorICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgcGlwZWxpbmUoKm1fY29tbWFuZEJ1ZmZlciwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+cmVzZXQoKTsKKyAgICBzZWNvbmRhcnkucmVzZXQoKTsKKworICAgIC8vIFZhbGlkYXRlIHRoYXQgVU5ERUZJTkVEIGRvZXNuJ3QgZmFsc2UgcG9zaXRpdmUgb24gdXMKKyAgICBzZWNvbmRhcnkuYmVnaW4oKTsKKyAgICBwaXBlbGluZShzZWNvbmRhcnksIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCk7CisgICAgc2Vjb25kYXJ5LmVuZCgpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBwaXBlbGluZSgqbV9jb21tYW5kQnVmZmVyLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY29uZGFyeS5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTZXREeW5WaWV3cG9ydFBhcmFtVGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHBhcmFtZXRlcnMgb2YgdmtDbWRTZXRWaWV3cG9ydCB3aXRob3V0IG11bHRpVmlld3BvcnQgZmVhdHVyZSIpOworCisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBmZWF0dXJlc3t9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoJmZlYXR1cmVzKSk7CisKKyAgICBjb25zdCBWa1ZpZXdwb3J0IHZwID0gezAuMCwgMC4wLCA2NC4wLCA2NC4wLCAwLjAsIDEuMH07CisgICAgY29uc3QgVmtWaWV3cG9ydCB2aWV3cG9ydHNbXSA9IHt2cCwgdnB9OworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gYXJyYXkgdGVzdHMKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtZmlyc3RWaWV3cG9ydC0wMTIyNCIpOworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAxLCB2aWV3cG9ydHMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFZpZXdwb3J0LXZpZXdwb3J0Q291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICB2azo6Q21kU2V0Vmlld3BvcnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMCwgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtdmlld3BvcnRDb3VudC0wMTIyNSIpOworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAyLCB2aWV3cG9ydHMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFZpZXdwb3J0LWZpcnN0Vmlld3BvcnQtMDEyMjQiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtdmlld3BvcnRDb3VudC0wMTIyNSIpOworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAyLCB2aWV3cG9ydHMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFZpZXdwb3J0LXBWaWV3cG9ydHMtcGFyYW1ldGVyIik7CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gY29yZSB2aWV3cG9ydCB0ZXN0cworICAgIHVzaW5nIHN0ZDo6dmVjdG9yOworICAgIHN0cnVjdCBUZXN0Q2FzZSB7CisgICAgICAgIFZrVmlld3BvcnQgdnA7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZlaWQ7CisgICAgfTsKKworICAgIC8vIG5vdCBuZWNlc3NhcmlseSBib3VuZGFyeSB2YWx1ZXMgKHVuc3BlY2lmaWVkIGNhc3Qgcm91bmRpbmcpLCBidXQgZ3VhcmFudGVlZCB0byBiZSBvdmVyIGxpbWl0CisgICAgY29uc3QgYXV0byBvbmVfcGFzdF9tYXhfdyA9IE5lYXJlc3RHcmVhdGVyKHN0YXRpY19jYXN0PGZsb2F0PihtX2RldmljZS0+cHJvcHMubGltaXRzLm1heFZpZXdwb3J0RGltZW5zaW9uc1swXSkpOworICAgIGNvbnN0IGF1dG8gb25lX3Bhc3RfbWF4X2ggPSBOZWFyZXN0R3JlYXRlcihzdGF0aWNfY2FzdDxmbG9hdD4obV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhWaWV3cG9ydERpbWVuc2lvbnNbMV0pKTsKKworICAgIGNvbnN0IGF1dG8gbWluX2JvdW5kID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy52aWV3cG9ydEJvdW5kc1JhbmdlWzBdOworICAgIGNvbnN0IGF1dG8gbWF4X2JvdW5kID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy52aWV3cG9ydEJvdW5kc1JhbmdlWzFdOworICAgIGNvbnN0IGF1dG8gb25lX2JlZm9yZV9taW5fYm91bmRzID0gTmVhcmVzdFNtYWxsZXIobWluX2JvdW5kKTsKKyAgICBjb25zdCBhdXRvIG9uZV9wYXN0X21heF9ib3VuZHMgPSBOZWFyZXN0R3JlYXRlcihtYXhfYm91bmQpOworCisgICAgY29uc3QgYXV0byBiZWxvd196ZXJvID0gTmVhcmVzdFNtYWxsZXIoMC4wZik7CisgICAgY29uc3QgYXV0byBwYXN0X29uZSA9IE5lYXJlc3RHcmVhdGVyKDEuMGYpOworCisgICAgdmVjdG9yPFRlc3RDYXNlPiB0ZXN0X2Nhc2VzID0geworICAgICAgICB7ezAuMCwgMC4wLCAwLjAsIDY0LjAsIDAuMCwgMS4wfSwgIlZVSUQtVmtWaWV3cG9ydC13aWR0aC0wMTc3MCJ9LAorICAgICAgICB7ezAuMCwgMC4wLCBvbmVfcGFzdF9tYXhfdywgNjQuMCwgMC4wLCAxLjB9LCAiVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcxIn0sCisgICAgICAgIHt7MC4wLCAwLjAsIE5BTiwgNjQuMCwgMC4wLCAxLjB9LCAiVlVJRC1Wa1ZpZXdwb3J0LXdpZHRoLTAxNzcwIn0sCisgICAgICAgIHt7MC4wLCAwLjAsIDY0LjAsIG9uZV9wYXN0X21heF9oLCAwLjAsIDEuMH0sICJWVUlELVZrVmlld3BvcnQtaGVpZ2h0LTAxNzczIn0sCisgICAgICAgIHt7b25lX2JlZm9yZV9taW5fYm91bmRzLCAwLjAsIDY0LjAsIDY0LjAsIDAuMCwgMS4wfSwgIlZVSUQtVmtWaWV3cG9ydC14LTAxNzc0In0sCisgICAgICAgIHt7b25lX3Bhc3RfbWF4X2JvdW5kcywgMC4wLCA2NC4wLCA2NC4wLCAwLjAsIDEuMH0sICJWVUlELVZrVmlld3BvcnQteC0wMTIzMiJ9LAorICAgICAgICB7e05BTiwgMC4wLCA2NC4wLCA2NC4wLCAwLjAsIDEuMH0sICJWVUlELVZrVmlld3BvcnQteC0wMTc3NCJ9LAorICAgICAgICB7ezAuMCwgb25lX2JlZm9yZV9taW5fYm91bmRzLCA2NC4wLCA2NC4wLCAwLjAsIDEuMH0sICJWVUlELVZrVmlld3BvcnQteS0wMTc3NSJ9LAorICAgICAgICB7ezAuMCwgTkFOLCA2NC4wLCA2NC4wLCAwLjAsIDEuMH0sICJWVUlELVZrVmlld3BvcnQteS0wMTc3NSJ9LAorICAgICAgICB7e21heF9ib3VuZCwgMC4wLCAxLjAsIDY0LjAsIDAuMCwgMS4wfSwgIlZVSUQtVmtWaWV3cG9ydC14LTAxMjMyIn0sCisgICAgICAgIHt7MC4wLCBtYXhfYm91bmQsIDY0LjAsIDEuMCwgMC4wLCAxLjB9LCAiVlVJRC1Wa1ZpZXdwb3J0LXktMDEyMzMifSwKKyAgICAgICAge3swLjAsIDAuMCwgNjQuMCwgNjQuMCwgYmVsb3dfemVybywgMS4wfSwgIlZVSUQtVmtWaWV3cG9ydC1taW5EZXB0aC0wMTIzNCJ9LAorICAgICAgICB7ezAuMCwgMC4wLCA2NC4wLCA2NC4wLCBwYXN0X29uZSwgMS4wfSwgIlZVSUQtVmtWaWV3cG9ydC1taW5EZXB0aC0wMTIzNCJ9LAorICAgICAgICB7ezAuMCwgMC4wLCA2NC4wLCA2NC4wLCBOQU4sIDEuMH0sICJWVUlELVZrVmlld3BvcnQtbWluRGVwdGgtMDEyMzQifSwKKyAgICAgICAge3swLjAsIDAuMCwgNjQuMCwgNjQuMCwgMC4wLCBiZWxvd196ZXJvfSwgIlZVSUQtVmtWaWV3cG9ydC1tYXhEZXB0aC0wMTIzNSJ9LAorICAgICAgICB7ezAuMCwgMC4wLCA2NC4wLCA2NC4wLCAwLjAsIHBhc3Rfb25lfSwgIlZVSUQtVmtWaWV3cG9ydC1tYXhEZXB0aC0wMTIzNSJ9LAorICAgICAgICB7ezAuMCwgMC4wLCA2NC4wLCA2NC4wLCAwLjAsIE5BTn0sICJWVUlELVZrVmlld3BvcnQtbWF4RGVwdGgtMDEyMzUifSwKKyAgICB9OworCisgICAgaWYgKERldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgPCBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgdGVzdF9jYXNlcy5wdXNoX2JhY2soe3swLjAsIDAuMCwgNjQuMCwgMC4wLCAwLjAsIDEuMH0sICJWVUlELVZrVmlld3BvcnQtaGVpZ2h0LTAxNzcyIn0pOworICAgICAgICB0ZXN0X2Nhc2VzLnB1c2hfYmFjayh7ezAuMCwgMC4wLCA2NC4wLCBOQU4sIDAuMCwgMS4wfSwgIlZVSUQtVmtWaWV3cG9ydC1oZWlnaHQtMDE3NzIifSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVzdF9jYXNlcy5wdXNoX2JhY2soe3swLjAsIDAuMCwgNjQuMCwgTkFOLCAwLjAsIDEuMH0sICJWVUlELVZrVmlld3BvcnQtaGVpZ2h0LTAxNzczIn0pOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdF9jYXNlIDogdGVzdF9jYXNlcykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHRlc3RfY2FzZS52ZWlkKTsKKyAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ0ZXN0X2Nhc2UudnApOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU2V0RHluVmlld3BvcnRQYXJhbU1haW50ZW5hbmNlMVRlc3RzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IGVycm9ycyBhcmUgZGV0ZWN0ZWQgb24gbWlzdXNlIG9mIFNldFZpZXdwb3J0IHdpdGggYSBuZWdhdGl2ZSB2aWV3cG9ydCBleHRlbnNpb24gZW5hYmxlZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFZLX0tIUl9tYWludGVuYW5jZTEgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQgLS0gc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIE5lZ0hlaWdodFZpZXdwb3J0VGVzdHMobV9kZXZpY2UsIG1fY29tbWFuZEJ1ZmZlciwgbV9lcnJvck1vbml0b3IpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFNldER5blZpZXdwb3J0UGFyYW1NdWx0aXZpZXdwb3J0VGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHBhcmFtZXRlcnMgb2YgdmtDbWRTZXRWaWV3cG9ydCB3aXRoIG11bHRpVmlld3BvcnQgZmVhdHVyZSBlbmFibGVkIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgaWYgKCFtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKS5tdWx0aVZpZXdwb3J0KSB7CisgICAgICAgIHByaW50ZigiJXMgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjptdWx0aVZpZXdwb3J0IGlzIG5vdCBzdXBwb3J0ZWQgLS0gc2tpcHBpbmcgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIik7CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDAsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgY29uc3QgYXV0byBtYXhfdmlld3BvcnRzID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhWaWV3cG9ydHM7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtcFZpZXdwb3J0cy1wYXJhbWV0ZXIiKTsKKyAgICB2azo6Q21kU2V0Vmlld3BvcnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgbWF4X3ZpZXdwb3J0cywgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBjb25zdCB1aW50MzJfdCB0b29fYmlnX21heF92aWV3cG9ydHMgPSA2NTUzNiArIDE7ICAvLyBsZXQncyBzYXkgdGhpcyBpcyB0b28gbXVjaCB0byBhbGxvY2F0ZQorICAgIGlmIChtYXhfdmlld3BvcnRzID49IHRvb19iaWdfbWF4X3ZpZXdwb3J0cykgeworICAgICAgICBwcmludGYoIiVzIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cyBpcyB0b28gbGFyZ2UgdG8gcHJhY3RpY2FsbHkgdGVzdCBhZ2FpbnN0IC0tIHNraXBwaW5nIHBhcnQgb2YgdGVzdC5cbiIsCisgICAgICAgICAgICAgICBrU2tpcFByZWZpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgVmtWaWV3cG9ydCB2cCA9IHswLjAsIDAuMCwgNjQuMCwgNjQuMCwgMC4wLCAxLjB9OworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa1ZpZXdwb3J0PiB2aWV3cG9ydHMobWF4X3ZpZXdwb3J0cyArIDEsIHZwKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtZmlyc3RWaWV3cG9ydC0wMTIyMyIpOworICAgICAgICB2azo6Q21kU2V0Vmlld3BvcnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgbWF4X3ZpZXdwb3J0cyArIDEsIHZpZXdwb3J0cy5kYXRhKCkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0Vmlld3BvcnQtZmlyc3RWaWV3cG9ydC0wMTIyMyIpOworICAgICAgICB2azo6Q21kU2V0Vmlld3BvcnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgbWF4X3ZpZXdwb3J0cywgMSwgdmlld3BvcnRzLmRhdGEoKSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1maXJzdFZpZXdwb3J0LTAxMjIzIik7CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCBtYXhfdmlld3BvcnRzLCB2aWV3cG9ydHMuZGF0YSgpKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFZpZXdwb3J0LXZpZXdwb3J0Q291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsIDAsIHZpZXdwb3J0cy5kYXRhKCkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQmFkUmVuZGVyUGFzc1Njb3BlU2Vjb25kYXJ5Q21kQnVmZmVyKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3Qgc2Vjb25kYXJ5IGJ1ZmZlcnMgZXhlY3V0ZWQgaW4gd3JvbmcgcmVuZGVyIHBhc3Mgc2NvcGUgd3J0IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIHNlY19jbWRidWZmX2luc2lkZV9ycChtX2RldmljZSwgbV9jb21tYW5kUG9vbCwgVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogc2VjX2NtZGJ1ZmZfb3V0c2lkZV9ycChtX2RldmljZSwgbV9jb21tYW5kUG9vbCwgVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZKTsKKworICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBjbWRidWZmX2lpID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPLAorICAgICAgICBudWxscHRyLCAgLy8gcE5leHQKKyAgICAgICAgbV9yZW5kZXJQYXNzLAorICAgICAgICAwLCAgLy8gc3VicGFzcworICAgICAgICBtX2ZyYW1lYnVmZmVyLAorICAgIH07CisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNtZGJ1ZmZfYmlfdG1wbCA9IHtWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBOZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklULCAmY21kYnVmZl9paX07CisKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY21kYnVmZl9pbnNpZGVfcnBfYmkgPSBjbWRidWZmX2JpX3RtcGw7CisgICAgY21kYnVmZl9pbnNpZGVfcnBfYmkuZmxhZ3MgfD0gVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUOworICAgIHNlY19jbWRidWZmX2luc2lkZV9ycC5iZWdpbigmY21kYnVmZl9pbnNpZGVfcnBfYmkpOworICAgIHNlY19jbWRidWZmX2luc2lkZV9ycC5lbmQoKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjbWRidWZmX291dHNpZGVfcnBfYmkgPSBjbWRidWZmX2JpX3RtcGw7CisgICAgY21kYnVmZl9vdXRzaWRlX3JwX2JpLmZsYWdzICY9IH5WS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQ7CisgICAgc2VjX2NtZGJ1ZmZfb3V0c2lkZV9ycC5iZWdpbigmY21kYnVmZl9vdXRzaWRlX3JwX2JpKTsKKyAgICBzZWNfY21kYnVmZl9vdXRzaWRlX3JwLmVuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEV4ZWN1dGVDb21tYW5kcy1wQ29tbWFuZEJ1ZmZlcnMtMDAxMDAiKTsKKyAgICB2azo6Q21kRXhlY3V0ZUNvbW1hbmRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZzZWNfY21kYnVmZl9pbnNpZGVfcnAuaGFuZGxlKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJwX2Jpe1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyBwTmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JlbmRlclBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MCwgMH0sIHszMiwgMzJ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1fcmVuZGVyUGFzc0NsZWFyVmFsdWVzLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcmVuZGVyUGFzc0NsZWFyVmFsdWVzLmRhdGEoKX07CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcnBfYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfU0VDT05EQVJZX0NPTU1BTkRfQlVGRkVSUyk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5NiIpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY19jbWRidWZmX291dHNpZGVfcnAuaGFuZGxlKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFNlY29uZGFyeUNvbW1hbmRCdWZmZXJDbGVhckNvbG9yQXR0YWNobWVudHNSZW5kZXJBcmVhKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkNyZWF0ZSBhIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciB3aXRoIENtZENsZWFyQXR0YWNobWVudHMgY2FsbCB0aGF0IGhhcyBhIHJlY3Qgb3V0c2lkZSBvZiByZW5kZXJQYXNzIHJlbmRlckFyZWEiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbyA9IHt9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBtX2NvbW1hbmRQb29sLT5oYW5kbGUoKTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBzZWNvbmRhcnlfY29tbWFuZF9idWZmZXI7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCAmY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbywgJnNlY29uZGFyeV9jb21tYW5kX2J1ZmZlcikpOworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjb21tYW5kX2J1ZmZlcl9iZWdpbl9pbmZvID0ge307CisgICAgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvIGNvbW1hbmRfYnVmZmVyX2luaGVyaXRhbmNlX2luZm8gPSB7fTsKKyAgICBjb21tYW5kX2J1ZmZlcl9pbmhlcml0YW5jZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTzsKKyAgICBjb21tYW5kX2J1ZmZlcl9pbmhlcml0YW5jZV9pbmZvLnJlbmRlclBhc3MgPSBtX3JlbmRlclBhc3M7CisgICAgY29tbWFuZF9idWZmZXJfaW5oZXJpdGFuY2VfaW5mby5mcmFtZWJ1ZmZlciA9IG1fZnJhbWVidWZmZXI7CisKKyAgICBjb21tYW5kX2J1ZmZlcl9iZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICBjb21tYW5kX2J1ZmZlcl9iZWdpbl9pbmZvLmZsYWdzID0KKyAgICAgICAgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfT05FX1RJTUVfU1VCTUlUX0JJVCB8IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1JFTkRFUl9QQVNTX0NPTlRJTlVFX0JJVDsKKyAgICBjb21tYW5kX2J1ZmZlcl9iZWdpbl9pbmZvLnBJbmhlcml0YW5jZUluZm8gPSAmY29tbWFuZF9idWZmZXJfaW5oZXJpdGFuY2VfaW5mbzsKKworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoc2Vjb25kYXJ5X2NvbW1hbmRfYnVmZmVyLCAmY29tbWFuZF9idWZmZXJfYmVnaW5faW5mbyk7CisgICAgVmtDbGVhckF0dGFjaG1lbnQgY29sb3JfYXR0YWNobWVudDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzBdID0gMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlsxXSA9IDA7CisgICAgY29sb3JfYXR0YWNobWVudC5jbGVhclZhbHVlLmNvbG9yLmZsb2F0MzJbMl0gPSAwOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzNdID0gMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNvbG9yQXR0YWNobWVudCA9IDA7CisgICAgLy8geCBleHRlbnQgb2YgMjU3IGV4Y2VlZHMgcmVuZGVyIGFyZWEgb2YgMjU2CisgICAgVmtDbGVhclJlY3QgY2xlYXJfcmVjdCA9IHt7ezAsIDB9LCB7MjU3LCAzMn19LCAwLCAxfTsKKyAgICB2azo6Q21kQ2xlYXJBdHRhY2htZW50cyhzZWNvbmRhcnlfY29tbWFuZF9idWZmZXIsIDEsICZjb2xvcl9hdHRhY2htZW50LCAxLCAmY2xlYXJfcmVjdCk7CisgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoc2Vjb25kYXJ5X2NvbW1hbmRfYnVmZmVyKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmbV9yZW5kZXJQYXNzQmVnaW5JbmZvLCBWS19TVUJQQVNTX0NPTlRFTlRTX1NFQ09OREFSWV9DT01NQU5EX0JVRkZFUlMpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcFJlY3RzLTAwMDE2Iik7CisgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmc2Vjb25kYXJ5X2NvbW1hbmRfYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpDbWRFbmRSZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUHVzaERlc2NyaXB0b3JTZXRDbWRQdXNoQmFkQXJncykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gcHVzaCBhIHB1c2ggZGVzY3JpcHRvciBzZXQgd2l0aCBpbmNvcnJlY3QgYXJndW1lbnRzLiIpOworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgYXV0byBwdXNoX2Rlc2NyaXB0b3JfcHJvcCA9IEdldFB1c2hEZXNjcmlwdG9yUHJvcGVydGllcyhpbnN0YW5jZSgpLCBncHUoKSk7CisgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9wcm9wLm1heFB1c2hEZXNjcmlwdG9ycyA8IDEpIHsKKyAgICAgICAgLy8gU29tZSBpbXBsZW1lbnRhdGlvbnMgcmVwb3J0IGFuIGludmFsaWQgbWF4UHVzaERlc2NyaXB0b3JzIG9mIDAKKyAgICAgICAgcHJpbnRmKCIlcyBtYXhQdXNoRGVzY3JpcHRvcnMgaXMgemVybywgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENyZWF0ZSBvcmRpbmFyeSBhbmQgcHVzaCBkZXNjcmlwdG9yIHNldCBsYXlvdXQKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGJpbmRpbmcgPSB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBudWxscHRyfTsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogZHNfbGF5b3V0KG1fZGV2aWNlLCB7YmluZGluZ30pOworICAgIEFTU0VSVF9UUlVFKGRzX2xheW91dC5pbml0aWFsaXplZCgpKTsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogcHVzaF9kc19sYXlvdXQobV9kZXZpY2UsIHtiaW5kaW5nfSwgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUik7CisgICAgQVNTRVJUX1RSVUUocHVzaF9kc19sYXlvdXQuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyBOb3cgdXNlIHRoZSBkZXNjcmlwdG9yIHNldCBsYXlvdXRzIHRvIGNyZWF0ZSBhIHBpcGVsaW5lIGxheW91dAorICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JnB1c2hfZHNfbGF5b3V0LCAmZHNfbGF5b3V0fSk7CisgICAgQVNTRVJUX1RSVUUocGlwZWxpbmVfbGF5b3V0LmluaXRpYWxpemVkKCkpOworCisgICAgLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciB0byBwdXNoCisgICAgY29uc3QgdWludDMyX3QgYnVmZmVyX2RhdGFbNF0gPSB7NCwgNSwgNiwgN307CisgICAgVmtDb25zdGFudEJ1ZmZlck9iaiBidWZmZXJfb2JqKG1fZGV2aWNlLCBzaXplb2YoYnVmZmVyX2RhdGEpLCAmYnVmZmVyX2RhdGEpOworICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcl9vYmouaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyBDcmVhdGUgYSAid3JpdGUiIHN0cnVjdCwgbm90aW5nIHRoYXQgdGhlIGJ1ZmZlcl9pbmZvIGNhbm5vdCBiZSBhIHRlbXBvcmFyeSBhcmcgKHRoZSByZXR1cm4gZnJvbSB3cml0ZV9kZXNjcmlwdG9yX3NldAorICAgIC8vIHJlZmVyZW5jZXMgaXRzIGRhdGEpLCBhbmQgdGhlIERlc2NyaXB0b3JTZXQoKSBjYW4gYmUgdGVtcG9yYXJ5LCBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBpZ25vcmVkCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmZXJfaW5mbyA9IHtidWZmZXJfb2JqLmhhbmRsZSgpLCAwLCBWS19XSE9MRV9TSVpFfTsKKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGUgPSB2a190ZXN0aW5nOjpEZXZpY2U6OndyaXRlX2Rlc2NyaXB0b3Jfc2V0KAorICAgICAgICB2a190ZXN0aW5nOjpEZXNjcmlwdG9yU2V0KCksIDAsIDAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgJmJ1ZmZlcl9pbmZvKTsKKworICAgIC8vIEZpbmQgYWRkcmVzcyBvZiBleHRlbnNpb24gY2FsbCBhbmQgbWFrZSB0aGUgY2FsbAorICAgIFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgPQorICAgICAgICAoUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSICE9IG51bGxwdHIpOworCisgICAgLy8gU2VjdGlvbiAxOiBRdWV1ZSBmYW1pbHkgbWF0Y2hpbmcvY2FwYWJpbGl0aWVzLgorICAgIC8vIENyZWF0ZSBjb21tYW5kIHBvb2wgb24gYSBub24tZ3JhcGhpY3MgcXVldWUKKyAgICBjb25zdCB1aW50MzJfdCBub19nZnhfcWZpID0gbV9kZXZpY2UtPlF1ZXVlRmFtaWx5TWF0Y2hpbmcoVktfUVVFVUVfQ09NUFVURV9CSVQsIFZLX1FVRVVFX0dSQVBISUNTX0JJVCk7CisgICAgY29uc3QgdWludDMyX3QgdHJhbnNmZXJfb25seV9xZmkgPQorICAgICAgICBtX2RldmljZS0+UXVldWVGYW1pbHlNYXRjaGluZyhWS19RVUVVRV9UUkFOU0ZFUl9CSVQsIChWS19RVUVVRV9DT01QVVRFX0JJVCB8IFZLX1FVRVVFX0dSQVBISUNTX0JJVCkpOworICAgIGlmICgoVUlOVDMyX01BWCA9PSB0cmFuc2Zlcl9vbmx5X3FmaSkgJiYgKFVJTlQzMl9NQVggPT0gbm9fZ2Z4X3FmaSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBObyBjb21wdXRlIG9yIHRyYW5zZmVyIG9ubHkgcXVldWUgZmFtaWx5LCBza2lwcGluZyBiaW5kcG9pbnQgYW5kIHF1ZXVlIHRlc3RzLlxuIiwga1NraXBQcmVmaXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGVycl9xZmkgPSAoVUlOVDMyX01BWCA9PSBub19nZnhfcWZpKSA/IHRyYW5zZmVyX29ubHlfcWZpIDogbm9fZ2Z4X3FmaTsKKworICAgICAgICBWa0NvbW1hbmRQb29sT2JqIGNvbW1hbmRfcG9vbChtX2RldmljZSwgZXJyX3FmaSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGNvbW1hbmRfcG9vbC5pbml0aWFsaXplZCgpKTsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRfYnVmZmVyKG1fZGV2aWNlLCAmY29tbWFuZF9wb29sKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoY29tbWFuZF9idWZmZXIuaW5pdGlhbGl6ZWQoKSk7CisgICAgICAgIGNvbW1hbmRfYnVmZmVyLmJlZ2luKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1waXBlbGluZUJpbmRQb2ludC0wMDM2MyIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMwIik7CisgICAgICAgIGlmIChlcnJfcWZpID09IHRyYW5zZmVyX29ubHlfcWZpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGFzIHRoaXMgcXVldWUgbmVpdGhlciBzdXBwb3J0cyB0aGUgZ2Z4IG9yIGNvbXB1dGUgYmluZHBvaW50cywgd2UnbGwgZ2V0IHR3byBlcnJvcnMKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgICAgICB9CisgICAgICAgIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoY29tbWFuZF9idWZmZXIuaGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvcl93cml0ZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICBjb21tYW5kX2J1ZmZlci5lbmQoKTsKKworICAgICAgICAvLyBJZiB3ZSBzdWNjZWVkIGluIHRlc3Rpbmcgb25seSBvbmUgY29uZGl0aW9uIGFib3ZlLCB3ZSBuZWVkIHRvIHRlc3QgdGhlIG90aGVyIGJlbG93LgorICAgICAgICBpZiAoKFVJTlQzMl9NQVggIT0gdHJhbnNmZXJfb25seV9xZmkpICYmIChlcnJfcWZpICE9IHRyYW5zZmVyX29ubHlfcWZpKSkgeworICAgICAgICAgICAgLy8gTmVlZCB0byB0ZXN0IHRoZSBuZWl0aGVyIGNvbXB1dGUvZ2Z4IHN1cHBvcnRlZCBjYXNlIHNlcGFyYXRlbHkuCisgICAgICAgICAgICBWa0NvbW1hbmRQb29sT2JqIHRyYW5fY29tbWFuZF9wb29sKG1fZGV2aWNlLCB0cmFuc2Zlcl9vbmx5X3FmaSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRSh0cmFuX2NvbW1hbmRfcG9vbC5pbml0aWFsaXplZCgpKTsKKyAgICAgICAgICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiB0cmFuX2NvbW1hbmRfYnVmZmVyKG1fZGV2aWNlLCAmdHJhbl9jb21tYW5kX3Bvb2wpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUodHJhbl9jb21tYW5kX2J1ZmZlci5pbml0aWFsaXplZCgpKTsKKyAgICAgICAgICAgIHRyYW5fY29tbWFuZF9idWZmZXIuYmVnaW4oKTsKKworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgYXZvaWQgZ2V0dGluZyAqYm90aCogZXJyb3JzIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFItcGlwZWxpbmVCaW5kUG9pbnQtMDAzNjMiKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzAiKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLWNvbW1hbmRCdWZmZXItY21kcG9vbCIpOworICAgICAgICAgICAgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUih0cmFuX2NvbW1hbmRfYnVmZmVyLmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3dyaXRlKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICAgICAgdHJhbl9jb21tYW5kX2J1ZmZlci5lbmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFB1c2ggdG8gdGhlIG5vbi1wdXNoIGJpbmRpbmcKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLXNldC0wMDM2NSIpOworICAgIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfd3JpdGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gU3BlY2lmeSBzZXQgb3V0IG9mIGJvdW5kcworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1zZXQtMDAzNjQiKTsKKyAgICB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3dyaXRlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgLy8gVGhpcyBpcyBhIHRlc3QgZm9yIFZVSUQtdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUi1jb21tYW5kQnVmZmVyLXJlY29yZGluZworICAgIC8vIFRPRE86IEFkZCBWQUxJREFUSU9OX0VSUk9SXyBjb2RlIHN1cHBvcnQgdG8gY29yZV92YWxpZGF0aW9uOjpWYWxpZGF0ZUNtZAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IGNhbGwgdmtCZWdpbkNvbW1hbmRCdWZmZXIoKSBiZWZvcmUgdGhpcyBjYWxsIHRvIHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIoKSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzAiKTsKKyAgICB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3dyaXRlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTZXREeW5TY2lzc29yUGFyYW1UZXN0cykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgcGFyYW1ldGVycyBvZiB2a0NtZFNldFNjaXNzb3Igd2l0aG91dCBtdWx0aVZpZXdwb3J0IGZlYXR1cmUiKTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBmZWF0dXJlc3t9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoJmZlYXR1cmVzKSk7CisKKyAgICBjb25zdCBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwgezE2LCAxNn19OworICAgIGNvbnN0IFZrUmVjdDJEIHNjaXNzb3JzW10gPSB7c2Npc3Nvciwgc2Npc3Nvcn07CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBhcnJheSB0ZXN0cworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLWZpcnN0U2Npc3Nvci0wMDU5MyIpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsIDEsIHNjaXNzb3JzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLXNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCIpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDAsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFNjaXNzb3Itc2Npc3NvckNvdW50LTAwNTk0Iik7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMiwgc2Npc3NvcnMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFNjaXNzb3ItZmlyc3RTY2lzc29yLTAwNTkzIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFNjaXNzb3Itc2Npc3NvckNvdW50LTAwNTk0Iik7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgMiwgc2Npc3NvcnMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFNjaXNzb3ItcFNjaXNzb3JzLXBhcmFtZXRlciIpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgc3RydWN0IFRlc3RDYXNlIHsKKyAgICAgICAgVmtSZWN0MkQgc2Npc3NvcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgdnVpZDsKKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHRlc3RfY2FzZXMgPSB7e3t7LTEsIDB9LCB7MTYsIDE2fX0sICJWVUlELXZrQ21kU2V0U2Npc3Nvci14LTAwNTk1In0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MCwgLTF9LCB7MTYsIDE2fX0sICJWVUlELXZrQ21kU2V0U2Npc3Nvci14LTAwNTk1In0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MSwgMH0sIHtJTlQzMl9NQVgsIDE2fX0sICJWVUlELXZrQ21kU2V0U2Npc3Nvci1vZmZzZXQtMDA1OTYifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3tJTlQzMl9NQVgsIDB9LCB7MSwgMTZ9fSwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLW9mZnNldC0wMDU5NiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ezAsIDB9LCB7dWludDMyX3R7SU5UMzJfTUFYfSArIDEsIDE2fX0sICJWVUlELXZrQ21kU2V0U2Npc3Nvci1vZmZzZXQtMDA1OTYifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3swLCAxfSwgezE2LCBJTlQzMl9NQVh9fSwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLW9mZnNldC0wMDU5NyJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ezAsIElOVDMyX01BWH0sIHsxNiwgMX19LCAiVlVJRC12a0NtZFNldFNjaXNzb3Itb2Zmc2V0LTAwNTk3In0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MCwgMH0sIHsxNiwgdWludDMyX3R7SU5UMzJfTUFYfSArIDF9fSwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLW9mZnNldC0wMDU5NyJ9fTsKKworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdF9jYXNlIDogdGVzdF9jYXNlcykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHRlc3RfY2FzZS52dWlkKTsKKyAgICAgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnRlc3RfY2FzZS5zY2lzc29yKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTZXREeW5TY2lzc29yUGFyYW1NdWx0aXZpZXdwb3J0VGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHBhcmFtZXRlcnMgb2YgdmtDbWRTZXRTY2lzc29yIHdpdGggbXVsdGlWaWV3cG9ydCBmZWF0dXJlIGVuYWJsZWQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLm11bHRpVmlld3BvcnQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXM6Om11bHRpVmlld3BvcnQgaXMgbm90IHN1cHBvcnRlZCAtLSBza2lwcGluZyB0ZXN0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFNjaXNzb3Itc2Npc3NvckNvdW50LWFycmF5bGVuZ3RoIik7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMCwgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBjb25zdCBhdXRvIG1heF9zY2lzc29ycyA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4Vmlld3BvcnRzOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldFNjaXNzb3ItcFNjaXNzb3JzLXBhcmFtZXRlciIpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIG1heF9zY2lzc29ycywgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBjb25zdCB1aW50MzJfdCB0b29fYmlnX21heF9zY2lzc29ycyA9IDY1NTM2ICsgMTsgIC8vIGxldCdzIHNheSB0aGlzIGlzIHRvbyBtdWNoIHRvIGFsbG9jYXRlCisgICAgaWYgKG1heF9zY2lzc29ycyA+PSB0b29fYmlnX21heF9zY2lzc29ycykgeworICAgICAgICBwcmludGYoIiVzIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZpZXdwb3J0cyBpcyB0b28gbGFyZ2UgdG8gcHJhY3RpY2FsbHkgdGVzdCBhZ2FpbnN0IC0tIHNraXBwaW5nIHBhcnQgb2YgdGVzdC5cbiIsCisgICAgICAgICAgICAgICBrU2tpcFByZWZpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgVmtSZWN0MkQgc2Npc3NvciA9IHt7MCwgMH0sIHsxNiwgMTZ9fTsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtSZWN0MkQ+IHNjaXNzb3JzKG1heF9zY2lzc29ycyArIDEsIHNjaXNzb3IpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRTY2lzc29yLWZpcnN0U2Npc3Nvci0wMDU5MiIpOworICAgICAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCBtYXhfc2Npc3NvcnMgKyAxLCBzY2lzc29ycy5kYXRhKCkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0U2Npc3Nvci1maXJzdFNjaXNzb3ItMDA1OTIiKTsKKyAgICAgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgbWF4X3NjaXNzb3JzLCAxLCBzY2lzc29ycy5kYXRhKCkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0U2Npc3Nvci1maXJzdFNjaXNzb3ItMDA1OTIiKTsKKyAgICAgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgbWF4X3NjaXNzb3JzLCBzY2lzc29ycy5kYXRhKCkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0U2Npc3Nvci1zY2lzc29yQ291bnQtYXJyYXlsZW5ndGgiKTsKKyAgICAgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgMCwgc2Npc3NvcnMuZGF0YSgpKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIERyYXdJbmRpcmVjdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgY292ZXJlZCB2YWxpZCB1c2FnZSBmb3IgdmtDbWREcmF3SW5kaXJlY3QiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBjb25zdCBWa0R5bmFtaWNTdGF0ZSBkeW5fc3RhdGVzW10gPSB7VktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCwgVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SfTsKKyAgICBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyBkeW5fc3RhdGVfY2kgPSB7fTsKKyAgICBkeW5fc3RhdGVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPOworICAgIGR5bl9zdGF0ZV9jaS5keW5hbWljU3RhdGVDb3VudCA9IHNpemUoZHluX3N0YXRlcyk7CisgICAgZHluX3N0YXRlX2NpLnBEeW5hbWljU3RhdGVzID0gZHluX3N0YXRlczsKKyAgICBwaXBlLmR5bl9zdGF0ZV9jaV8gPSBkeW5fc3RhdGVfY2k7CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lXyk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZS5kZXNjcmlwdG9yX3NldF8tPnNldF8sIDAsIE5VTEwpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk99OworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9WRVJURVhfQlVGRkVSX0JJVDsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8uc2l6ZSA9IHNpemVvZihWa0RyYXdJbmRpcmVjdENvbW1hbmQpOworICAgIFZrQnVmZmVyT2JqIGRyYXdfYnVmZmVyOworICAgIGRyYXdfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBidWZmZXJfY3JlYXRlX2luZm8pOworCisgICAgLy8gVlVJRC12a0NtZERyYXdJbmRpcmVjdC1idWZmZXItMDI3MDkKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0LWJ1ZmZlci0wMjcwOSIpOworICAgIHZrOjpDbWREcmF3SW5kaXJlY3QobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZHJhd19idWZmZXIuaGFuZGxlKCksIDAsIDEsIHNpemVvZihWa0RyYXdJbmRpcmVjdENvbW1hbmQpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRHJhd0luZGlyZWN0Q291bnRLSFIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IGNvdmVyZWQgdmFsaWQgdXNhZ2UgZm9yIHZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9EUkFXX0lORElSRUNUX0NPVU5UX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9EUkFXX0lORElSRUNUX0NPVU5UX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAgICAgICAgICAgICBWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1vcnlfcmVxdWlyZW1lbnRzOworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbW9yeV9hbGxvY2F0ZV9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPfTsKKworICAgIGF1dG8gdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiA9CisgICAgICAgIChQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiIpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bl9zdGF0ZXNbXSA9IHtWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1J9OworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGR5bl9zdGF0ZV9jaSA9IHt9OworICAgIGR5bl9zdGF0ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZHluX3N0YXRlX2NpLmR5bmFtaWNTdGF0ZUNvdW50ID0gc2l6ZShkeW5fc3RhdGVzKTsKKyAgICBkeW5fc3RhdGVfY2kucER5bmFtaWNTdGF0ZXMgPSBkeW5fc3RhdGVzOworICAgIHBpcGUuZHluX3N0YXRlX2NpXyA9IGR5bl9zdGF0ZV9jaTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUucGlwZWxpbmVfKTsKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUucGlwZWxpbmVfbGF5b3V0Xy5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXBlLmRlc2NyaXB0b3Jfc2V0Xy0+c2V0XywgMCwgTlVMTCk7CisKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAsIDAsIDE2LCAxNiwgMCwgMX07CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgVmtSZWN0MkQgc2Npc3NvciA9IHt7MCwgMH0sIHsxNiwgMTZ9fTsKKyAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmc2Npc3Nvcik7CisKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GT307CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNpemUgPSBzaXplb2YoVmtEcmF3SW5kaXJlY3RDb21tYW5kKTsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVDsKKyAgICBWa0J1ZmZlciBkcmF3X2J1ZmZlcjsKKyAgICB2azo6Q3JlYXRlQnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJ1ZmZlcl9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmRyYXdfYnVmZmVyKTsKKworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBjb3VudF9idWZmZXJfY3JlYXRlX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPfTsKKyAgICBjb3VudF9idWZmZXJfY3JlYXRlX2luZm8uc2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgY291bnRfYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQ7CisgICAgVmtCdWZmZXJPYmogY291bnRfYnVmZmVyOworICAgIGNvdW50X2J1ZmZlci5pbml0KCptX2RldmljZSwgY291bnRfYnVmZmVyX2NyZWF0ZV9pbmZvKTsKKworICAgIC8vIFZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1idWZmZXItMDI3MDgKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA4Iik7CisgICAgdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkcmF3X2J1ZmZlciwgMCwgY291bnRfYnVmZmVyLmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZrRHJhd0luZGlyZWN0Q29tbWFuZCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIGRyYXdfYnVmZmVyLCAmbWVtb3J5X3JlcXVpcmVtZW50cyk7CisgICAgbWVtb3J5X2FsbG9jYXRlX2luZm8uYWxsb2NhdGlvblNpemUgPSBtZW1vcnlfcmVxdWlyZW1lbnRzLnNpemU7CisgICAgbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1vcnlfcmVxdWlyZW1lbnRzLm1lbW9yeVR5cGVCaXRzLCAmbWVtb3J5X2FsbG9jYXRlX2luZm8sIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUKTsKKyAgICBWa0RldmljZU1lbW9yeSBkcmF3X2J1ZmZlcl9tZW1vcnk7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1lbW9yeV9hbGxvY2F0ZV9pbmZvLCBOVUxMLCAmZHJhd19idWZmZXJfbWVtb3J5KTsKKyAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGRyYXdfYnVmZmVyLCBkcmF3X2J1ZmZlcl9tZW1vcnksIDApOworCisgICAgVmtCdWZmZXIgY291bnRfYnVmZmVyX3VuYm91bmQ7CisgICAgdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZjb3VudF9idWZmZXJfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb3VudF9idWZmZXJfdW5ib3VuZCk7CisKKyAgICAvLyBWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTQiKTsKKyAgICB2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRyYXdfYnVmZmVyLCAwLCBjb3VudF9idWZmZXJfdW5ib3VuZCwgMCwgMSwgc2l6ZW9mKFZrRHJhd0luZGlyZWN0Q29tbWFuZCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLW9mZnNldC0wMjcxMAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUi1vZmZzZXQtMDI3MTAiKTsKKyAgICB2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRyYXdfYnVmZmVyLCAxLCBjb3VudF9idWZmZXIuaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVmtEcmF3SW5kaXJlY3RDb21tYW5kKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXJPZmZzZXQtMDI3MTYKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXJPZmZzZXQtMDI3MTYiKTsKKyAgICB2a0NtZERyYXdJbmRpcmVjdENvdW50S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRyYXdfYnVmZmVyLCAwLCBjb3VudF9idWZmZXIuaGFuZGxlKCksIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVmtEcmF3SW5kaXJlY3RDb21tYW5kKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItc3RyaWRlLTAzMTEwCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLXN0cmlkZS0wMzExMCIpOworICAgIHZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZHJhd19idWZmZXIsIDAsIGNvdW50X2J1ZmZlci5oYW5kbGUoKSwgMCwgMSwgMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBUT0RPOiBUaGVzZSBjb3ZlcmVkIFZVSURzIGFyZW4ndCB0ZXN0ZWQuIFRoZXJlIGlzIGFsc28gbm8gdGVzdCBjb3ZlcmFnZSBmb3IgdGhlIGNvcmUgVnVsa2FuIDEuMCB2azo6Q21kRHJhdyogZXF1aXZhbGVudCBvZgorICAgIC8vIHRoZXNlOgorICAgIC8vICAgICBWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItcmVuZGVyUGFzcy0wMjY4NAorICAgIC8vICAgICBWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItc3VicGFzcy0wMjY4NQorICAgIC8vICAgICBWVUlELXZrQ21kRHJhd0luZGlyZWN0Q291bnRLSFItY29tbWFuZEJ1ZmZlci0wMjcwMQorCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHJhd19idWZmZXIsIDApOworICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgY291bnRfYnVmZmVyX3VuYm91bmQsIDApOworCisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBkcmF3X2J1ZmZlcl9tZW1vcnksIDApOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgY292ZXJlZCB2YWxpZCB1c2FnZSBmb3IgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9EUkFXX0lORElSRUNUX0NPVU5UX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9EUkFXX0lORElSRUNUX0NPVU5UX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAgICAgICAgICAgICBWS19LSFJfZHJhd19pbmRpcmVjdF9jb3VudCBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBhdXRvIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSID0KKyAgICAgICAgKFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBjb25zdCBWa0R5bmFtaWNTdGF0ZSBkeW5fc3RhdGVzW10gPSB7VktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCwgVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SfTsKKyAgICBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyBkeW5fc3RhdGVfY2kgPSB7fTsKKyAgICBkeW5fc3RhdGVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPOworICAgIGR5bl9zdGF0ZV9jaS5keW5hbWljU3RhdGVDb3VudCA9IHNpemUoZHluX3N0YXRlcyk7CisgICAgZHluX3N0YXRlX2NpLnBEeW5hbWljU3RhdGVzID0gZHluX3N0YXRlczsKKyAgICBwaXBlLmR5bl9zdGF0ZV9jaV8gPSBkeW5fc3RhdGVfY2k7CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lXyk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZS5kZXNjcmlwdG9yX3NldF8tPnNldF8sIDAsIE5VTEwpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk99OworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gc2l6ZW9mKFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQpOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUOworICAgIFZrQnVmZmVyT2JqIGRyYXdfYnVmZmVyOworICAgIGRyYXdfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBidWZmZXJfY3JlYXRlX2luZm8pOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGNvdW50X2J1ZmZlcl9jcmVhdGVfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk99OworICAgIGNvdW50X2J1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBjb3VudF9idWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfSU5ESVJFQ1RfQlVGRkVSX0JJVDsKKyAgICBWa0J1ZmZlck9iaiBjb3VudF9idWZmZXI7CisgICAgY291bnRfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBjb3VudF9idWZmZXJfY3JlYXRlX2luZm8pOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGluZGV4X2J1ZmZlcl9jcmVhdGVfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk99OworICAgIGluZGV4X2J1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBpbmRleF9idWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVDsKKyAgICBWa0J1ZmZlck9iaiBpbmRleF9idWZmZXI7CisgICAgaW5kZXhfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBpbmRleF9idWZmZXJfY3JlYXRlX2luZm8pOworCisgICAgLy8gVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzAxIChwYXJ0aWFsIC0gb25seSB0ZXN0cyB3aGV0aGVyIHRoZSBpbmRleCBidWZmZXIgaXMgYm91bmQpCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzAxIik7CisgICAgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZHJhd19idWZmZXIuaGFuZGxlKCksIDAsIGNvdW50X2J1ZmZlci5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVmtEcmF3SW5kZXhlZEluZGlyZWN0Q29tbWFuZCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkNtZEJpbmRJbmRleEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpbmRleF9idWZmZXIuaGFuZGxlKCksIDAsIFZLX0lOREVYX1RZUEVfVUlOVDMyKTsKKworICAgIFZrQnVmZmVyIGRyYXdfYnVmZmVyX3VuYm91bmQ7CisgICAgdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZjb3VudF9idWZmZXJfY3JlYXRlX2luZm8sIG51bGxwdHIsICZkcmF3X2J1ZmZlcl91bmJvdW5kKTsKKworICAgIC8vIFZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItYnVmZmVyLTAyNzA4CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1idWZmZXItMDI3MDgiKTsKKyAgICB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkcmF3X2J1ZmZlcl91bmJvdW5kLCAwLCBjb3VudF9idWZmZXIuaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIFZrQnVmZmVyIGNvdW50X2J1ZmZlcl91bmJvdW5kOworICAgIHZrOjpDcmVhdGVCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmY291bnRfYnVmZmVyX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY291bnRfYnVmZmVyX3VuYm91bmQpOworCisgICAgLy8gVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlci0wMjcxNAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItY291bnRCdWZmZXItMDI3MTQiKTsKKyAgICB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkcmF3X2J1ZmZlci5oYW5kbGUoKSwgMCwgY291bnRfYnVmZmVyX3VuYm91bmQsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItb2Zmc2V0LTAyNzEwCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1vZmZzZXQtMDI3MTAiKTsKKyAgICB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkcmF3X2J1ZmZlci5oYW5kbGUoKSwgMSwgY291bnRfYnVmZmVyLmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWa0RyYXdJbmRleGVkSW5kaXJlY3RDb21tYW5kKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLWNvdW50QnVmZmVyT2Zmc2V0LTAyNzE2CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb3VudEJ1ZmZlck9mZnNldC0wMjcxNiIpOworICAgIHZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGRyYXdfYnVmZmVyLmhhbmRsZSgpLCAwLCBjb3VudF9idWZmZXIuaGFuZGxlKCksIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItc3RyaWRlLTAzMTQyCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1zdHJpZGUtMDMxNDIiKTsKKyAgICB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkcmF3X2J1ZmZlci5oYW5kbGUoKSwgMCwgY291bnRfYnVmZmVyLmhhbmRsZSgpLCAwLCAxLCAxKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFRPRE86IFRoZXNlIGNvdmVyZWQgVlVJRHMgYXJlbid0IHRlc3RlZC4gVGhlcmUgaXMgYWxzbyBubyB0ZXN0IGNvdmVyYWdlIGZvciB0aGUgY29yZSBWdWxrYW4gMS4wIHZrOjpDbWREcmF3KiBlcXVpdmFsZW50IG9mCisgICAgLy8gdGhlc2U6CisgICAgLy8gICAgIFZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFItcmVuZGVyUGFzcy0wMjY4NAorICAgIC8vICAgICBWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLXN1YnBhc3MtMDI2ODUKKyAgICAvLyAgICAgVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1jb21tYW5kQnVmZmVyLTAyNzAxIChwYXJ0aWFsKQorCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHJhd19idWZmZXJfdW5ib3VuZCwgMCk7CisgICAgdms6OkRlc3Ryb3lCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBjb3VudF9idWZmZXJfdW5ib3VuZCwgMCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRXhjbHVzaXZlU2Npc3Nvck5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBWS19OVl9zY2lzc29yX2V4Y2x1c2l2ZSB3aXRoIG11bHRpVmlld3BvcnQgZGlzYWJsZWQuIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgc3RkOjphcnJheTxjb25zdCBjaGFyICosIDE+IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zID0ge3tWS19OVl9TQ0lTU09SX0VYQ0xVU0lWRV9FWFRFTlNJT05fTkFNRX19OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2aWNlX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIGRldmljZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisKKyAgICAvLyBDcmVhdGUgYSBkZXZpY2UgdGhhdCBlbmFibGVzIGV4Y2x1c2l2ZSBzY2lzc29yIGJ1dCBkaXNhYmxlcyBtdWx0aVZpZXdwb3J0CisgICAgYXV0byBleGNsdXNpdmVfc2Npc3Nvcl9mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRXhjbHVzaXZlU2Npc3NvckZlYXR1cmVzTlY+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmV4Y2x1c2l2ZV9zY2lzc29yX2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgIGZlYXR1cmVzMi5mZWF0dXJlcy5tdWx0aVZpZXdwb3J0ID0gVktfRkFMU0U7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBpZiAobV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4Vmlld3BvcnRzKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVjZXNzYXJ5IG51bWJlciBvZiB2aWV3cG9ydHMsIHNraXBwaW5nIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBCYXNlZCBvbiBQU09WaWV3cG9ydFN0YXRlVGVzdHMKKyAgICB7CisgICAgICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MC4wZiwgMC4wZiwgNjQuMGYsIDY0LjBmLCAwLjBmLCAxLjBmfTsKKyAgICAgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHNbXSA9IHt2aWV3cG9ydCwgdmlld3BvcnR9OworICAgICAgICBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwgezY0LCA2NH19OworICAgICAgICBWa1JlY3QyRCBzY2lzc29yc1sxMDBdID0ge3NjaXNzb3IsIHNjaXNzb3J9OworCisgICAgICAgIHVzaW5nIHN0ZDo6dmVjdG9yOworICAgICAgICBzdHJ1Y3QgVGVzdENhc2UgeworICAgICAgICAgICAgdWludDMyX3Qgdmlld3BvcnRfY291bnQ7CisgICAgICAgICAgICBWa1ZpZXdwb3J0ICp2aWV3cG9ydHM7CisgICAgICAgICAgICB1aW50MzJfdCBzY2lzc29yX2NvdW50OworICAgICAgICAgICAgVmtSZWN0MkQgKnNjaXNzb3JzOworICAgICAgICAgICAgdWludDMyX3QgZXhjbHVzaXZlX3NjaXNzb3JfY291bnQ7CisgICAgICAgICAgICBWa1JlY3QyRCAqZXhjbHVzaXZlX3NjaXNzb3JzOworCisgICAgICAgICAgICB2ZWN0b3I8c3RkOjpzdHJpbmc+IHZ1aWRzOworICAgICAgICB9OworCisgICAgICAgIHZlY3RvcjxUZXN0Q2FzZT4gdGVzdF9jYXNlcyA9IHsKKyAgICAgICAgICAgIHsxLAorICAgICAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgICAgICAxLAorICAgICAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1leGNsdXNpdmVTY2lzc29yQ291bnQtMDIwMjciLAorICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDI5In19LAorICAgICAgICAgICAgezEsCisgICAgICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICAgICAgMTAwLAorICAgICAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRFeGNsdXNpdmVTY2lzc29yU3RhdGVDcmVhdGVJbmZvTlYtZXhjbHVzaXZlU2Npc3NvckNvdW50LTAyMDI3IiwKKyAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0RXhjbHVzaXZlU2Npc3NvclN0YXRlQ3JlYXRlSW5mb05WLWV4Y2x1c2l2ZVNjaXNzb3JDb3VudC0wMjAyOCIsCisgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1leGNsdXNpdmVTY2lzc29yQ291bnQtMDIwMjkifX0sCisgICAgICAgICAgICB7MSwKKyAgICAgICAgICAgICB2aWV3cG9ydHMsCisgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgICAgICAxLAorICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OVi1wRHluYW1pY1N0YXRlcy0wMjAzMCJ9fSwKKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRlc3RfY2FzZSA6IHRlc3RfY2FzZXMpIHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVWaWV3cG9ydEV4Y2x1c2l2ZVNjaXNzb3JTdGF0ZUNyZWF0ZUluZm9OViBleGMgPSB7CisgICAgICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfRVhDTFVTSVZFX1NDSVNTT1JfU1RBVEVfQ1JFQVRFX0lORk9fTlZ9OworCisgICAgICAgICAgICBjb25zdCBhdXRvIGJyZWFrX3ZwID0gWyZ0ZXN0X2Nhc2UsICZleGNdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnZpZXdwb3J0Q291bnQgPSB0ZXN0X2Nhc2Uudmlld3BvcnRfY291bnQ7CisgICAgICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5wVmlld3BvcnRzID0gdGVzdF9jYXNlLnZpZXdwb3J0czsKKyAgICAgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnNjaXNzb3JDb3VudCA9IHRlc3RfY2FzZS5zY2lzc29yX2NvdW50OworICAgICAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8ucFNjaXNzb3JzID0gdGVzdF9jYXNlLnNjaXNzb3JzOworICAgICAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8ucE5leHQgPSAmZXhjOworCisgICAgICAgICAgICAgICAgZXhjLmV4Y2x1c2l2ZVNjaXNzb3JDb3VudCA9IHRlc3RfY2FzZS5leGNsdXNpdmVfc2Npc3Nvcl9jb3VudDsKKyAgICAgICAgICAgICAgICBleGMucEV4Y2x1c2l2ZVNjaXNzb3JzID0gdGVzdF9jYXNlLmV4Y2x1c2l2ZV9zY2lzc29yczsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGJyZWFrX3ZwLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgdGVzdF9jYXNlLnZ1aWRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEJhc2VkIG9uIFNldER5blNjaXNzb3JQYXJhbVRlc3RzCisgICAgeworICAgICAgICBhdXRvIHZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WID0KKyAgICAgICAgICAgIChQRk5fdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WIik7CisKKyAgICAgICAgY29uc3QgVmtSZWN0MkQgc2Npc3NvciA9IHt7MCwgMH0sIHsxNiwgMTZ9fTsKKyAgICAgICAgY29uc3QgVmtSZWN0MkQgc2Npc3NvcnNbXSA9IHtzY2lzc29yLCBzY2lzc29yfTsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtZmlyc3RFeGNsdXNpdmVTY2lzc29yLTAyMDM1Iik7CisgICAgICAgIHZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsIDEsIHNjaXNzb3JzKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WOiBwYXJhbWV0ZXIgZXhjbHVzaXZlU2Npc3NvckNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiKTsKKyAgICAgICAgdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMCwgbnVsbHB0cik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWV4Y2x1c2l2ZVNjaXNzb3JDb3VudC0wMjAzNiIpOworICAgICAgICB2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAyLCBzY2lzc29ycyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVjogcGFyYW1ldGVyIGV4Y2x1c2l2ZVNjaXNzb3JDb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWZpcnN0RXhjbHVzaXZlU2Npc3Nvci0wMjAzNSIpOworICAgICAgICB2a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAwLCBzY2lzc29ycyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLWZpcnN0RXhjbHVzaXZlU2Npc3Nvci0wMjAzNSIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1leGNsdXNpdmVTY2lzc29yQ291bnQtMDIwMzYiKTsKKyAgICAgICAgdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgMiwgc2Npc3NvcnMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlY6IHJlcXVpcmVkIHBhcmFtZXRlciBwRXhjbHVzaXZlU2Npc3NvcnMgc3BlY2lmaWVkIGFzIE5VTEwiKTsKKyAgICAgICAgdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgbnVsbHB0cik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIHN0cnVjdCBUZXN0Q2FzZSB7CisgICAgICAgICAgICBWa1JlY3QyRCBzY2lzc29yOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdnVpZDsKKyAgICAgICAgfTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gdGVzdF9jYXNlcyA9IHsKKyAgICAgICAgICAgIHt7ey0xLCAwfSwgezE2LCAxNn19LCAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi14LTAyMDM3In0sCisgICAgICAgICAgICB7e3swLCAtMX0sIHsxNiwgMTZ9fSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYteC0wMjAzNyJ9LAorICAgICAgICAgICAge3t7MSwgMH0sIHtJTlQzMl9NQVgsIDE2fX0sICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLW9mZnNldC0wMjAzOCJ9LAorICAgICAgICAgICAge3t7SU5UMzJfTUFYLCAwfSwgezEsIDE2fX0sICJWVUlELXZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WLW9mZnNldC0wMjAzOCJ9LAorICAgICAgICAgICAge3t7MCwgMH0sIHt1aW50MzJfdHtJTlQzMl9NQVh9ICsgMSwgMTZ9fSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtb2Zmc2V0LTAyMDM4In0sCisgICAgICAgICAgICB7e3swLCAxfSwgezE2LCBJTlQzMl9NQVh9fSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtb2Zmc2V0LTAyMDM5In0sCisgICAgICAgICAgICB7e3swLCBJTlQzMl9NQVh9LCB7MTYsIDF9fSwgIlZVSUQtdmtDbWRTZXRFeGNsdXNpdmVTY2lzc29yTlYtb2Zmc2V0LTAyMDM5In0sCisgICAgICAgICAgICB7e3swLCAwfSwgezE2LCB1aW50MzJfdHtJTlQzMl9NQVh9ICsgMX19LCAiVlVJRC12a0NtZFNldEV4Y2x1c2l2ZVNjaXNzb3JOVi1vZmZzZXQtMDIwMzkifX07CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0X2Nhc2UgOiB0ZXN0X2Nhc2VzKSB7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHRlc3RfY2FzZS52dWlkKTsKKyAgICAgICAgICAgIHZrQ21kU2V0RXhjbHVzaXZlU2Npc3Nvck5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ0ZXN0X2Nhc2Uuc2Npc3Nvcik7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIE1lc2hTaGFkZXJOVikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgVktfTlZfbWVzaF9zaGFkZXIuIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgc3RkOjphcnJheTxjb25zdCBjaGFyICosIDE+IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zID0ge3tWS19OVl9NRVNIX1NIQURFUl9FWFRFTlNJT05fTkFNRX19OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2aWNlX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIGRldmljZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKERldmljZUlzTW9ja0lDRCgpIHx8IERldmljZVNpbXVsYXRpb24oKSkgeworICAgICAgICBwcmludGYoIiVzTm90IHN1cHBvcmVkIGJ5IE1vY2tJQ0QsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGRldmljZSB0aGF0IGVuYWJsZXMgbWVzaF9zaGFkZXIKKyAgICBhdXRvIG1lc2hfc2hhZGVyX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VNZXNoU2hhZGVyRmVhdHVyZXNOVj4oKTsKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmbWVzaF9zaGFkZXJfZmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoZ3B1KCksICZmZWF0dXJlczIpOworICAgIGZlYXR1cmVzMi5mZWF0dXJlcy5tdWx0aURyYXdJbmRpcmVjdCA9IFZLX0ZBTFNFOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZmZWF0dXJlczIpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgdmVydFNoYWRlclRleHRbXSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgInZlYzIgdmVydGljZXNbM107XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICAgICB2ZXJ0aWNlc1swXSA9IHZlYzIoLTEuMCwgLTEuMCk7XG4iCisgICAgICAgICIgICAgICB2ZXJ0aWNlc1sxXSA9IHZlYzIoIDEuMCwgLTEuMCk7XG4iCisgICAgICAgICIgICAgICB2ZXJ0aWNlc1syXSA9IHZlYzIoIDAuMCwgIDEuMCk7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IHZlYzQodmVydGljZXNbZ2xfVmVydGV4SW5kZXggJSAzXSwgMC4wLCAxLjApO1xuIgorICAgICAgICAiICAgZ2xfUG9pbnRTaXplID0gMS4wZjtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtZXNoU2hhZGVyVGV4dFtdID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9OVl9tZXNoX3NoYWRlciA6IHJlcXVpcmVcbiIKKyAgICAgICAgImxheW91dChsb2NhbF9zaXplX3ggPSAxKSBpbjtcbiIKKyAgICAgICAgImxheW91dChtYXhfdmVydGljZXMgPSAzKSBvdXQ7XG4iCisgICAgICAgICJsYXlvdXQobWF4X3ByaW1pdGl2ZXMgPSAxKSBvdXQ7XG4iCisgICAgICAgICJsYXlvdXQodHJpYW5nbGVzKSBvdXQ7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICAgICBnbF9NZXNoVmVydGljZXNOVlswXS5nbF9Qb3NpdGlvbiA9IHZlYzQoLTEuMCwgLTEuMCwgMCwgMSk7XG4iCisgICAgICAgICIgICAgICBnbF9NZXNoVmVydGljZXNOVlsxXS5nbF9Qb3NpdGlvbiA9IHZlYzQoIDEuMCwgLTEuMCwgMCwgMSk7XG4iCisgICAgICAgICIgICAgICBnbF9NZXNoVmVydGljZXNOVlsyXS5nbF9Qb3NpdGlvbiA9IHZlYzQoIDAuMCwgIDEuMCwgMCwgMSk7XG4iCisgICAgICAgICIgICAgICBnbF9QcmltaXRpdmVJbmRpY2VzTlZbMF0gPSAwO1xuIgorICAgICAgICAiICAgICAgZ2xfUHJpbWl0aXZlSW5kaWNlc05WWzFdID0gMTtcbiIKKyAgICAgICAgIiAgICAgIGdsX1ByaW1pdGl2ZUluZGljZXNOVlsyXSA9IDI7XG4iCisgICAgICAgICIgICAgICBnbF9QcmltaXRpdmVDb3VudE5WID0gMTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBtcyhtX2RldmljZSwgbWVzaFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9NRVNIX0JJVF9OViwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIC8vIFRlc3QgcGlwZWxpbmUgY3JlYXRpb24KKyAgICB7CisgICAgICAgIC8vIGNhbid0IG1peCBtZXNoIHdpdGggdmVydGV4CisgICAgICAgIGNvbnN0IGF1dG8gYnJlYWtfdnAgPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgbXMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICB9OworICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGJyZWFrX3ZwLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdGQ6OnN0cmluZz4oeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMjA5NSJ9KSk7CisKKyAgICAgICAgLy8gdmVydGV4IG9yIG1lc2ggbXVzdCBiZSBwcmVzZW50CisgICAgICAgIGNvbnN0IGF1dG8gYnJlYWtfdnAyID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge2ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsgfTsKKyAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBicmVha192cDIsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0ZDo6c3RyaW5nPih7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGFnZS0wMjA5NiJ9KSk7CisKKyAgICAgICAgLy8gdmVydGV4aW5wdXQgYW5kIGlucHV0YXNzZW1ibHkgbXVzdCBiZSB2YWxpZCB3aGVuIHZlcnRleCBzdGFnZSBpcyBwcmVzZW50CisgICAgICAgIGNvbnN0IGF1dG8gYnJlYWtfdnAzID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICAgICAgaGVscGVyLmdwX2NpXy5wVmVydGV4SW5wdXRTdGF0ZSA9IG51bGxwdHI7CisgICAgICAgICAgICBoZWxwZXIuZ3BfY2lfLnBJbnB1dEFzc2VtYmx5U3RhdGUgPSBudWxscHRyOworICAgICAgICB9OworICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGJyZWFrX3ZwMywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RkOjpzdHJpbmc+KHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBTdGFnZXMtMDIwOTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAyMDk4In0pKTsKKyAgICB9CisKKyAgICBQRk5fdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROViB2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WID0KKyAgICAgICAgKFBGTl92a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0NtZERyYXdNZXNoVGFza3NJbmRpcmVjdE5WIik7CisKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GT307CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUOworICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2azo6Q3JlYXRlQnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJ1ZmZlcl9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MocmVzdWx0KTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVi1kcmF3Q291bnQtMDIxNDYiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRHJhd01lc2hUYXNrc0luZGlyZWN0TlYtZHJhd0NvdW50LTAyNzE4Iik7CisgICAgdmtDbWREcmF3TWVzaFRhc2tzSW5kaXJlY3ROVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIsIDAsIDIsIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCAwKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNZXNoU2hhZGVyRGlzYWJsZWROVikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgVktfTlZfbWVzaF9zaGFkZXIgVlVzIHdpdGggTlZfbWVzaF9zaGFkZXIgZGlzYWJsZWQuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtFdmVudCBldmVudDsKKyAgICBWa0V2ZW50Q3JlYXRlSW5mbyBldmVudF9jcmVhdGVfaW5mb3t9OworICAgIGV2ZW50X2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisgICAgdms6OkNyZWF0ZUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmV2ZW50X2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmZXZlbnQpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldEV2ZW50LXN0YWdlTWFzay0wMjEwNyIpOworICAgIHZrOjpDbWRTZXRFdmVudChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBldmVudCwgVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDIxMDgiKTsKKyAgICB2azo6Q21kU2V0RXZlbnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OVik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUmVzZXRFdmVudC1zdGFnZU1hc2stMDIxMDkiKTsKKyAgICB2azo6Q21kUmVzZXRFdmVudChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBldmVudCwgVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRSZXNldEV2ZW50LXN0YWdlTWFzay0wMjExMCIpOworICAgIHZrOjpDbWRSZXNldEV2ZW50KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGV2ZW50LCBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLTAyMTExIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFdhaXRFdmVudHMtZHN0U3RhZ2VNYXNrLTAyMTEzIik7CisgICAgdms6OkNtZFdhaXRFdmVudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJmV2ZW50LCBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYsCisgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfTUVTSF9TSEFERVJfQklUX05WLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay0wMjExMiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLWRzdFN0YWdlTWFzay0wMjExNCIpOworICAgIHZrOjpDbWRXYWl0RXZlbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZldmVudCwgVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WLAorICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RBU0tfU0hBREVSX0JJVF9OViwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMjExNSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRQaXBlbGluZUJhcnJpZXItZHN0U3RhZ2VNYXNrLTAyMTE3Iik7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYsIFZLX1BJUEVMSU5FX1NUQUdFX01FU0hfU0hBREVSX0JJVF9OViwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stMDIxMTYiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWRzdFN0YWdlTWFzay0wMjExOCIpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfVEFTS19TSEFERVJfQklUX05WLCBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2VtYXBob3JlX2NyZWF0ZV9pbmZvID0ge307CisgICAgc2VtYXBob3JlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZSkpOworCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VfZmxhZ3MgPSBWS19QSVBFTElORV9TVEFHRV9NRVNIX1NIQURFUl9CSVRfTlYgfCBWS19QSVBFTElORV9TVEFHRV9UQVNLX1NIQURFUl9CSVRfTlY7CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisKKyAgICAvLyBTaWduYWwgdGhlIHNlbWFwaG9yZSBzbyB0aGUgbmV4dCB0ZXN0IGNhbiB3YWl0IG9uIGl0LgorICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSBudWxscHRyOworICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKyAgICBzdWJtaXRfaW5mby5wV2FpdERzdFN0YWdlTWFzayA9ICZzdGFnZV9mbGFnczsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0RHN0U3RhZ2VNYXNrLTAyMDg5Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXREc3RTdGFnZU1hc2stMDIwOTAiKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBtZXNoU3RhZ2UgPSB7VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPfTsKKyAgICBtZXNoU3RhZ2UgPSB2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKTsKKyAgICBtZXNoU3RhZ2Uuc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfTUVTSF9CSVRfTlY7CisgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyB0YXNrU3RhZ2UgPSB7VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPfTsKKyAgICB0YXNrU3RhZ2UgPSB2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKTsKKyAgICB0YXNrU3RhZ2Uuc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfVEFTS19CSVRfTlY7CisKKyAgICAvLyBtZXNoIGFuZCB0YXNrIHNoYWRlcnMgbm90IHN1cHBvcnRlZAorICAgIGNvbnN0IGF1dG8gYnJlYWtfdnAgPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7bWVzaFN0YWdlLCB0YXNrU3RhZ2UsIHZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgKKyAgICAgICAgKnRoaXMsIGJyZWFrX3ZwLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgdmVjdG9yPHN0ZDo6c3RyaW5nPih7IlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1wTmFtZS0wMDcwNyIsICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tcE5hbWUtMDA3MDciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvLXN0YWdlLTAyMDkxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1zdGFnZS0wMjA5MiJ9KSk7CisKKyAgICB2azo6RGVzdHJveUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgZXZlbnQsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWaWV3cG9ydFdTY2FsaW5nTlYpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWZXJpZnkgVktfTlZfY2xpcF9zcGFjZV93X3NjYWxpbmciKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGRldmljZV9mZWF0dXJlcyA9IHt9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoJmRldmljZV9mZWF0dXJlcykpOworCisgICAgaWYgKCFkZXZpY2VfZmVhdHVyZXMubXVsdGlWaWV3cG9ydCkgeworICAgICAgICBwcmludGYoIiVzIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6bXVsdGlWaWV3cG9ydCBpcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfTlZfQ0xJUF9TUEFDRV9XX1NDQUxJTkdfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfTlZfQ0xJUF9TUEFDRV9XX1NDQUxJTkdfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgVktfTlZfQ0xJUF9TUEFDRV9XX1NDQUxJTkdfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCZkZXZpY2VfZmVhdHVyZXMpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgYXV0byB2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOViA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WPih2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYiKSk7CisKKyAgICBjb25zdCBjaGFyIHZzX3NyY1tdID0gUiIoCisgICAgICAgICN2ZXJzaW9uIDQ1MAorICAgICAgICBjb25zdCB2ZWMyIHBvc2l0aW9uc1tdID0geyB2ZWMyKC0xLjBmLCAgMS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoIDEuMGYsICAxLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigtMS4wZiwgLTEuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCAxLjBmLCAtMS4wZikgfTsKKyAgICAgICAgb3V0IGdsX1BlclZlcnRleCB7CisgICAgICAgICAgICB2ZWM0IGdsX1Bvc2l0aW9uOworICAgICAgICB9OworCisgICAgICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbnNbZ2xfVmVydGV4SW5kZXggJSA0XSwgMC4wZiwgMS4wZik7CisgICAgICAgIH0pIjsKKworICAgIGNvbnN0IGNoYXIgZnNfc3JjW10gPSBSIigKKyAgICAgICAgI3ZlcnNpb24gNDUwCisgICAgICAgIGxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IG91dENvbG9yOworCisgICAgICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgICAgIG91dENvbG9yID0gdmVjNCgwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKTsKKyAgICAgICAgfSkiOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtWaWV3cG9ydD4gdnAgPSB7CisgICAgICAgIHswLjBmLCAwLjBmLCA2NC4wZiwgNjQuMGZ9LCB7MC4wZiwgMC4wZiwgNjQuMGYsIDY0LjBmfSwgezAuMGYsIDAuMGYsIDY0LjBmLCA2NC4wZn0sIHswLjBmLCAwLjBmLCA2NC4wZiwgNjQuMGZ9fTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa1JlY3QyRD4gc2MgPSB7e3swLCAwfSwgezMyLCAzMn19LCB7ezMyLCAwfSwgezMyLCAzMn19LCB7ezAsIDMyfSwgezMyLCAzMn19LCB7ezMyLCAzMn0sIHszMiwgMzJ9fX07CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtWaWV3cG9ydFdTY2FsaW5nTlY+IHNjYWxlID0ge3stMC4yZiwgLTAuMmZ9LCB7MC4yZiwgLTAuMmZ9LCB7LTAuMmYsIDAuMmZ9LCB7MC4yZiwgMC4yZn19OworCisgICAgY29uc3QgdWludDMyX3QgdnBfY291bnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odnAuc2l6ZSgpKTsKKworICAgIFZrUGlwZWxpbmVWaWV3cG9ydFdTY2FsaW5nU3RhdGVDcmVhdGVJbmZvTlYgdnBzaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9XX1NDQUxJTkdfU1RBVEVfQ1JFQVRFX0lORk9fTlZ9OworICAgIHZwc2kudmlld3BvcnRXU2NhbGluZ0VuYWJsZSA9IFZLX1RSVUU7CisgICAgdnBzaS52aWV3cG9ydENvdW50ID0gdnBfY291bnQ7CisgICAgdnBzaS5wVmlld3BvcnRXU2NhbGluZ3MgPSBzY2FsZS5kYXRhKCk7CisKKyAgICBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gdnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TVEFURV9DUkVBVEVfSU5GT307CisgICAgdnBjaS52aWV3cG9ydENvdW50ID0gdnBfY291bnQ7CisgICAgdnBjaS5wVmlld3BvcnRzID0gdnAuZGF0YSgpOworICAgIHZwY2kuc2Npc3NvckNvdW50ID0gdnBfY291bnQ7CisgICAgdnBjaS5wU2Npc3NvcnMgPSBzYy5kYXRhKCk7CisgICAgdnBjaS5wTmV4dCA9ICZ2cHNpOworCisgICAgY29uc3QgYXV0byBzZXRfdnBjaSA9IFsmdnBjaV0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeyBoZWxwZXIudnBfc3RhdGVfY2lfID0gdnBjaTsgfTsKKworICAgIC8vIE1ha2Ugc3VyZSBubyBlcnJvcnMgc2hvdyB1cCB3aGVuIGNyZWF0aW5nIHRoZSBwaXBlbGluZSB3aXRoIHctc2NhbGluZyBlbmFibGVkCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfdnBjaSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHZlY3RvcjxzdGQ6OnN0cmluZz4oKSwgdHJ1ZSk7CisKKyAgICAvLyBDcmVhdGUgcGlwZWxpbmUgd2l0aCB3LXNjYWxpbmcgZW5hYmxlZCBidXQgd2l0aG91dCBhIHZhbGlkIHNjYWxpbmcgYXJyYXkKKyAgICB2cHNpLnBWaWV3cG9ydFdTY2FsaW5ncyA9IG51bGxwdHI7CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfdnBjaSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdGQ6OnN0cmluZz4oeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDE3MTUifSkpOworCisgICAgdnBzaS5wVmlld3BvcnRXU2NhbGluZ3MgPSBzY2FsZS5kYXRhKCk7CisKKyAgICAvLyBDcmVhdGUgcGlwZWxpbmUgd2l0aCB3LXNjYWxpbmcgZW5hYmxlZCBidXQgd2l0aG91dCBtYXRjaGluZyB2aWV3cG9ydCBjb3VudHMKKyAgICB2cHNpLnZpZXdwb3J0Q291bnQgPSAxOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X3ZwY2ksIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RkOjpzdHJpbmc+KHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRXU2NhbGluZ0VuYWJsZS0wMTcyNiJ9KSk7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBsKG1fZGV2aWNlKTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCB2c19zcmMsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNfc3JjLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworICAgIHBpcGUuU2V0Vmlld3BvcnQodnApOworICAgIHBpcGUuU2V0U2Npc3NvcihzYyk7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBsLmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworCisgICAgVmtQaXBlbGluZU9iaiBwaXBlRHluV1NjYWxlKG1fZGV2aWNlKTsKKyAgICBwaXBlRHluV1NjYWxlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICBwaXBlRHluV1NjYWxlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGVEeW5XU2NhbGUuQWRkU2hhZGVyKCZmcyk7CisgICAgcGlwZUR5bldTY2FsZS5TZXRWaWV3cG9ydCh2cCk7CisgICAgcGlwZUR5bldTY2FsZS5TZXRTY2lzc29yKHNjKTsKKyAgICBwaXBlRHluV1NjYWxlLk1ha2VEeW5hbWljKFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlRfV19TQ0FMSU5HX05WKTsKKyAgICBwaXBlRHluV1NjYWxlLkNyZWF0ZVZLUGlwZWxpbmUocGwuaGFuZGxlKCksIHJlbmRlclBhc3MoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBCaW5kIHBpcGVsaW5lIHdpdGhvdXQgZHluYW1pYyB3IHNjYWxpbmcgZW5hYmxlZAorICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtTm9uZS0wMTMyMiIpOworICAgIHZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIHZwX2NvdW50LCBzY2FsZS5kYXRhKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQmluZCBwaXBlbGluZSB0aGF0IGhhcyBkeW5hbWljIHctc2NhbGluZyBlbmFibGVkCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVEeW5XU2NhbGUuaGFuZGxlKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgY29uc3QgYXV0byBtYXhfdnBzID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhWaWV3cG9ydHM7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WLWZpcnN0Vmlld3BvcnQtMDEzMjMiKTsKKyAgICB2a0NtZFNldFZpZXdwb3J0V1NjYWxpbmdOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBtYXhfdnBzLCB2cF9jb3VudCwgc2NhbGUuZGF0YSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFdTY2FsaW5nTlYtZmlyc3RWaWV3cG9ydC0wMTMyNCIpOworICAgIHZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsIG1heF92cHMsIHNjYWxlLmRhdGEoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrQ21kU2V0Vmlld3BvcnRXU2NhbGluZ05WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIHZwX2NvdW50LCBzY2FsZS5kYXRhKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19kZXNjcmlwdG9yX3JlbmRlcnBhc3NfZnJhbWVidWZmZXIuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtsYXllcnRlc3RzX2Rlc2NyaXB0b3JfcmVuZGVycGFzc19mcmFtZWJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3NGViNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19kZXNjcmlwdG9yX3JlbmRlcnBhc3NfZnJhbWVidWZmZXIuY3BwCkBAIC0wLDAgKzEsNzg2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjbm9ydGhyb3BAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKZXJlbXkgS25pYWdlciA8amVyZW15a0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBTaGFubm9uIE1jUGhlcnNvbiA8c2hhbm5vbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlICJjYXN0X3V0aWxzLmgiCisjaW5jbHVkZSAibGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5oIgorCitURVNUX0YoVmtMYXllclRlc3QsIEdwdVZhbGlkYXRpb25BcnJheU9PQkdyYXBoaWNzU2hhZGVycykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJHUFUgdmFsaWRhdGlvbjogVmVyaWZ5IGRldGVjdGlvbiBvZiBvdXQtb2YtYm91bmRzIGRlc2NyaXB0b3IgYXJyYXkgaW5kZXhpbmcgYW5kIHVzZSBvZiB1bmluaXRpYWxpemVkIGRlc2NyaXB0b3JzLiIpOworCisgICAgVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCBlbmFibGVzW10gPSB7VktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfRVhUfTsKKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBmZWF0dXJlcyA9IHt9OworICAgIGZlYXR1cmVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GRUFUVVJFU19FWFQ7CisgICAgZmVhdHVyZXMuZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgPSAxOworICAgIGZlYXR1cmVzLnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gZW5hYmxlczsKKyAgICBib29sIGRlc2NyaXB0b3JfaW5kZXhpbmcgPSBDaGVja0Rlc2NyaXB0b3JJbmRleGluZ1N1cHBvcnRBbmRJbml0RnJhbWV3b3JrKHRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLCAmZmVhdHVyZXMsIG1fZXJyb3JNb25pdG9yKTsKKyAgICBpZiAoRGV2aWNlSXNNb2NrSUNEKCkgfHwgRGV2aWNlU2ltdWxhdGlvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgR1BVLUFzc2lzdGVkIHZhbGlkYXRpb24gdGVzdCByZXF1aXJlcyBhIGRyaXZlciB0aGF0IGNhbiBkcmF3LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBmZWF0dXJlczIgPSB7fTsKKyAgICBhdXRvIGluZGV4aW5nX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVD4oKTsKKyAgICBpZiAoZGVzY3JpcHRvcl9pbmRleGluZykgeworICAgICAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgICAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgICAgIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmaW5kZXhpbmdfZmVhdHVyZXMpOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgICAgICBpZiAoIWluZGV4aW5nX2ZlYXR1cmVzLnJ1bnRpbWVEZXNjcmlwdG9yQXJyYXkgfHwgIWluZGV4aW5nX2ZlYXR1cmVzLmRlc2NyaXB0b3JCaW5kaW5nU2FtcGxlZEltYWdlVXBkYXRlQWZ0ZXJCaW5kIHx8CisgICAgICAgICAgICAhaW5kZXhpbmdfZmVhdHVyZXMuZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZCB8fCAhaW5kZXhpbmdfZmVhdHVyZXMuZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudCB8fAorICAgICAgICAgICAgIWluZGV4aW5nX2ZlYXR1cmVzLnNoYWRlclNhbXBsZWRJbWFnZUFycmF5Tm9uVW5pZm9ybUluZGV4aW5nIHx8CisgICAgICAgICAgICAhaW5kZXhpbmdfZmVhdHVyZXMuc2hhZGVyU3RvcmFnZUJ1ZmZlckFycmF5Tm9uVW5pZm9ybUluZGV4aW5nKSB7CisgICAgICAgICAgICBwcmludGYoIk5vdCBhbGwgZGVzY3JpcHRvciBpbmRleGluZyBmZWF0dXJlcyBzdXBwb3J0ZWQsIHNraXBwaW5nIGRlc2NyaXB0b3IgaW5kZXhpbmcgdGVzdHNcbiIpOworICAgICAgICAgICAgZGVzY3JpcHRvcl9pbmRleGluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIHBvb2xfZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMiwgcG9vbF9mbGFncykpOworICAgIGlmIChtX2RldmljZS0+cHJvcHMuYXBpVmVyc2lvbiA8IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICBwcmludGYoIiVzIEdQVS1Bc3Npc3RlZCB2YWxpZGF0aW9uIHRlc3QgcmVxdWlyZXMgVnVsa2FuIDEuMSsuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBNYWtlIGEgdW5pZm9ybSBidWZmZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSBzaGFkZXIgdGhhdCBjb250YWlucyB0aGUgaW52YWxpZCBhcnJheSBpbmRleC4KKyAgICB1aW50MzJfdCBxZmkgPSAwOworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBiY2kgPSB7fTsKKyAgICBiY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgYmNpLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICBiY2kuc2l6ZSA9IDEwMjQ7CisgICAgYmNpLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgYmNpLnBRdWV1ZUZhbWlseUluZGljZXMgPSAmcWZpOworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjA7CisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbV9wcm9wcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUOworICAgIGJ1ZmZlcjAuaW5pdCgqbV9kZXZpY2UsIGJjaSwgbWVtX3Byb3BzKTsKKworICAgIGJjaS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQ7CisgICAgLy8gTWFrZSBhbm90aGVyIGJ1ZmZlciB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGFycmF5IHRvIGJlIGluZGV4ZWQKKyAgICBWa0J1ZmZlck9iaiBidWZmZXIxOworICAgIGJ1ZmZlcjEuaW5pdCgqbV9kZXZpY2UsIGJjaSwgbWVtX3Byb3BzKTsKKworICAgIHZvaWQgKmxheW91dF9wbmV4dCA9IG51bGxwdHI7CisgICAgdm9pZCAqYWxsb2NhdGVfcG5leHQgPSBudWxscHRyOworICAgIGF1dG8gcG9vbF9jcmVhdGVfZmxhZ3MgPSAwOworICAgIGF1dG8gbGF5b3V0X2NyZWF0ZV9mbGFncyA9IDA7CisgICAgVmtEZXNjcmlwdG9yQmluZGluZ0ZsYWdzRVhUIGRzX2JpbmRpbmdfZmxhZ3NbMl0gPSB7fTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUIGxheW91dF9jcmVhdGVpbmZvX2JpbmRpbmdfZmxhZ3NbMV0gPSB7fTsKKyAgICBpZiAoZGVzY3JpcHRvcl9pbmRleGluZykgeworICAgICAgICBkc19iaW5kaW5nX2ZsYWdzWzBdID0gMDsKKyAgICAgICAgZHNfYmluZGluZ19mbGFnc1sxXSA9IFZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVCB8IFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUOworCisgICAgICAgIGxheW91dF9jcmVhdGVpbmZvX2JpbmRpbmdfZmxhZ3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQ7CisgICAgICAgIGxheW91dF9jcmVhdGVpbmZvX2JpbmRpbmdfZmxhZ3NbMF0ucE5leHQgPSBOVUxMOworICAgICAgICBsYXlvdXRfY3JlYXRlaW5mb19iaW5kaW5nX2ZsYWdzWzBdLmJpbmRpbmdDb3VudCA9IDI7CisgICAgICAgIGxheW91dF9jcmVhdGVpbmZvX2JpbmRpbmdfZmxhZ3NbMF0ucEJpbmRpbmdGbGFncyA9IGRzX2JpbmRpbmdfZmxhZ3M7CisgICAgICAgIGxheW91dF9jcmVhdGVfZmxhZ3MgPSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDsKKyAgICAgICAgcG9vbF9jcmVhdGVfZmxhZ3MgPSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDsKKyAgICAgICAgbGF5b3V0X3BuZXh0ID0gbGF5b3V0X2NyZWF0ZWluZm9fYmluZGluZ19mbGFnczsKKyAgICB9CisKKyAgICAvLyBQcmVwYXJlIGRlc2NyaXB0b3JzCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIDYsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dF9jcmVhdGVfZmxhZ3MsIGxheW91dF9wbmV4dCwgcG9vbF9jcmVhdGVfZmxhZ3MpOworCisgICAgVmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQgdmFyaWFibGVfY291bnQgPSB7fTsKKyAgICB1aW50MzJfdCBkZXNjX2NvdW50czsKKyAgICBpZiAoZGVzY3JpcHRvcl9pbmRleGluZykgeworICAgICAgICBsYXlvdXRfY3JlYXRlX2ZsYWdzID0gMDsKKyAgICAgICAgcG9vbF9jcmVhdGVfZmxhZ3MgPSAwOworICAgICAgICBkc19iaW5kaW5nX2ZsYWdzWzFdID0KKyAgICAgICAgICAgIFZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVCB8IFZLX0RFU0NSSVBUT1JfQklORElOR19WQVJJQUJMRV9ERVNDUklQVE9SX0NPVU5UX0JJVF9FWFQ7CisgICAgICAgIGRlc2NfY291bnRzID0gNjsgIC8vIFdlJ2xsIHJlc2VydmUgOCBzcGFjZXMgaW4gdGhlIGxheW91dCwgYnV0IHRoZSBkZXNjcmlwdG9yIHdpbGwgb25seSB1c2UgNgorICAgICAgICB2YXJpYWJsZV9jb3VudC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQUxMT0NBVEVfSU5GT19FWFQ7CisgICAgICAgIHZhcmlhYmxlX2NvdW50LmRlc2NyaXB0b3JTZXRDb3VudCA9IDE7CisgICAgICAgIHZhcmlhYmxlX2NvdW50LnBEZXNjcmlwdG9yQ291bnRzID0gJmRlc2NfY291bnRzOworICAgICAgICBhbGxvY2F0ZV9wbmV4dCA9ICZ2YXJpYWJsZV9jb3VudDsKKyAgICB9CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0X3ZhcmlhYmxlKG1fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgOCwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X2NyZWF0ZV9mbGFncywgbGF5b3V0X3BuZXh0LCBwb29sX2NyZWF0ZV9mbGFncywgYWxsb2NhdGVfcG5leHQpOworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQobV9kZXZpY2UsIHsmZGVzY3JpcHRvcl9zZXQubGF5b3V0X30pOworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0X3ZhcmlhYmxlKG1fZGV2aWNlLCB7JmRlc2NyaXB0b3Jfc2V0X3ZhcmlhYmxlLmxheW91dF99KTsKKyAgICBWa1RleHR1cmVPYmogdGV4dHVyZShtX2RldmljZSwgbnVsbHB0cik7CisgICAgVmtTYW1wbGVyT2JqIHNhbXBsZXIobV9kZXZpY2UpOworCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmZXJfaW5mb1sxXSA9IHt9OworICAgIGJ1ZmZlcl9pbmZvWzBdLmJ1ZmZlciA9IGJ1ZmZlcjAuaGFuZGxlKCk7CisgICAgYnVmZmVyX2luZm9bMF0ub2Zmc2V0ID0gMDsKKyAgICBidWZmZXJfaW5mb1swXS5yYW5nZSA9IHNpemVvZih1aW50MzJfdCk7CisKKyAgICBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gaW1hZ2VfaW5mb1s2XSA9IHt9OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGltYWdlX2luZm9baV0gPSB0ZXh0dXJlLkRlc2NyaXB0b3JJbWFnZUluZm8oKTsKKyAgICAgICAgaW1hZ2VfaW5mb1tpXS5zYW1wbGVyID0gc2FtcGxlci5oYW5kbGUoKTsKKyAgICAgICAgaW1hZ2VfaW5mb1tpXS5pbWFnZUxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw7CisgICAgfQorCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZXNbMl0gPSB7fTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRzdFNldCA9IGRlc2NyaXB0b3Jfc2V0LnNldF87ICAvLyBkZXNjcmlwdG9yX3NldDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5kc3RCaW5kaW5nID0gMDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLnBCdWZmZXJJbmZvID0gYnVmZmVyX2luZm87CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1sxXS5kc3RTZXQgPSBkZXNjcmlwdG9yX3NldC5zZXRfOyAgLy8gZGVzY3JpcHRvcl9zZXQ7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZHN0QmluZGluZyA9IDE7CisgICAgaWYgKGRlc2NyaXB0b3JfaW5kZXhpbmcpCisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLmRlc2NyaXB0b3JDb3VudCA9IDU7ICAvLyBJbnRlbnRpb25hbGx5IGRvbid0IHdyaXRlIGluZGV4IDUKKyAgICBlbHNlCisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLmRlc2NyaXB0b3JDb3VudCA9IDY7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1sxXS5wSW1hZ2VJbmZvID0gaW1hZ2VfaW5mbzsKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAyLCBkZXNjcmlwdG9yX3dyaXRlcywgMCwgTlVMTCk7CisgICAgaWYgKGRlc2NyaXB0b3JfaW5kZXhpbmcpIHsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0uZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXRfdmFyaWFibGUuc2V0XzsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXRfdmFyaWFibGUuc2V0XzsKKyAgICAgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMiwgZGVzY3JpcHRvcl93cml0ZXMsIDAsIE5VTEwpOworICAgIH0KKworICAgIGRzX2JpbmRpbmdfZmxhZ3NbMF0gPSAwOworICAgIGRzX2JpbmRpbmdfZmxhZ3NbMV0gPSBWS19ERVNDUklQVE9SX0JJTkRJTkdfUEFSVElBTExZX0JPVU5EX0JJVF9FWFQ7CisKKyAgICAvLyBSZXNvdXJjZXMgZm9yIGJ1ZmZlciB0ZXN0cworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXRfYnVmZmVyKG1fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsIDYsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbGF5b3V0X3BuZXh0LCAwKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0X2J1ZmZlcihtX2RldmljZSwgeyZkZXNjcmlwdG9yX3NldF9idWZmZXIubGF5b3V0X30pOworCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmZXJfdGVzdF9idWZmZXJfaW5mb1s3XSA9IHt9OworICAgIGJ1ZmZlcl90ZXN0X2J1ZmZlcl9pbmZvWzBdLmJ1ZmZlciA9IGJ1ZmZlcjAuaGFuZGxlKCk7CisgICAgYnVmZmVyX3Rlc3RfYnVmZmVyX2luZm9bMF0ub2Zmc2V0ID0gMDsKKyAgICBidWZmZXJfdGVzdF9idWZmZXJfaW5mb1swXS5yYW5nZSA9IHNpemVvZih1aW50MzJfdCk7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IDc7IGkrKykgeworICAgICAgICBidWZmZXJfdGVzdF9idWZmZXJfaW5mb1tpXS5idWZmZXIgPSBidWZmZXIxLmhhbmRsZSgpOworICAgICAgICBidWZmZXJfdGVzdF9idWZmZXJfaW5mb1tpXS5vZmZzZXQgPSAwOworICAgICAgICBidWZmZXJfdGVzdF9idWZmZXJfaW5mb1tpXS5yYW5nZSA9IDQgKiBzaXplb2YoZmxvYXQpOworICAgIH0KKworICAgIGlmIChkZXNjcmlwdG9yX2luZGV4aW5nKSB7CisgICAgICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGJ1ZmZlcl9kZXNjcmlwdG9yX3dyaXRlc1syXSA9IHt9OworICAgICAgICBidWZmZXJfZGVzY3JpcHRvcl93cml0ZXNbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICAgICAgYnVmZmVyX2Rlc2NyaXB0b3Jfd3JpdGVzWzBdLmRzdFNldCA9IGRlc2NyaXB0b3Jfc2V0X2J1ZmZlci5zZXRfOyAgLy8gZGVzY3JpcHRvcl9zZXQ7CisgICAgICAgIGJ1ZmZlcl9kZXNjcmlwdG9yX3dyaXRlc1swXS5kc3RCaW5kaW5nID0gMDsKKyAgICAgICAgYnVmZmVyX2Rlc2NyaXB0b3Jfd3JpdGVzWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgICAgIGJ1ZmZlcl9kZXNjcmlwdG9yX3dyaXRlc1swXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjsKKyAgICAgICAgYnVmZmVyX2Rlc2NyaXB0b3Jfd3JpdGVzWzBdLnBCdWZmZXJJbmZvID0gYnVmZmVyX3Rlc3RfYnVmZmVyX2luZm87CisgICAgICAgIGJ1ZmZlcl9kZXNjcmlwdG9yX3dyaXRlc1sxXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgICAgICBidWZmZXJfZGVzY3JpcHRvcl93cml0ZXNbMV0uZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXRfYnVmZmVyLnNldF87ICAvLyBkZXNjcmlwdG9yX3NldDsKKyAgICAgICAgYnVmZmVyX2Rlc2NyaXB0b3Jfd3JpdGVzWzFdLmRzdEJpbmRpbmcgPSAxOworICAgICAgICBidWZmZXJfZGVzY3JpcHRvcl93cml0ZXNbMV0uZGVzY3JpcHRvckNvdW50ID0gNTsgIC8vIEludGVudGlvbmFsbHkgZG9uJ3Qgd3JpdGUgaW5kZXggNQorICAgICAgICBidWZmZXJfZGVzY3JpcHRvcl93cml0ZXNbMV0uZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI7CisgICAgICAgIGJ1ZmZlcl9kZXNjcmlwdG9yX3dyaXRlc1sxXS5wQnVmZmVySW5mbyA9ICZidWZmZXJfdGVzdF9idWZmZXJfaW5mb1sxXTsKKyAgICAgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMiwgYnVmZmVyX2Rlc2NyaXB0b3Jfd3JpdGVzLCAwLCBOVUxMKTsKKyAgICB9CisKKyAgICAvLyBTaGFkZXIgcHJvZ3JhbXMgZm9yIGFycmF5IE9PQiB0ZXN0IGluIHZlcnRleCBzdGFnZToKKyAgICAvLyAtIFRoZSB2ZXJ0ZXggc2hhZGVyIGZldGNoZXMgdGhlIGludmFsaWQgaW5kZXggZnJvbSB0aGUgdW5pZm9ybSBidWZmZXIgYW5kIHVzZXMgaXQgdG8gbWFrZSBhbiBpbnZhbGlkIGluZGV4IGludG8gYW5vdGhlcgorICAgIC8vIGFycmF5LgorICAgIGNoYXIgY29uc3QgKnZzU291cmNlX3ZlcnQgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChzdGQxNDAsIHNldCA9IDAsIGJpbmRpbmcgPSAwKSB1bmlmb3JtIGZvbyB7IHVpbnQgdGV4X2luZGV4WzFdOyB9IHVuaWZvcm1faW5kZXhfYnVmZmVyO1xuIgorICAgICAgICAibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxKSB1bmlmb3JtIHNhbXBsZXIyRCB0ZXhbNl07XG4iCisgICAgICAgICJ2ZWMyIHZlcnRpY2VzWzNdO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICAgICB2ZXJ0aWNlc1swXSA9IHZlYzIoLTEuMCwgLTEuMCk7XG4iCisgICAgICAgICIgICAgICB2ZXJ0aWNlc1sxXSA9IHZlYzIoIDEuMCwgLTEuMCk7XG4iCisgICAgICAgICIgICAgICB2ZXJ0aWNlc1syXSA9IHZlYzIoIDAuMCwgIDEuMCk7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IHZlYzQodmVydGljZXNbZ2xfVmVydGV4SW5kZXggJSAzXSwgMC4wLCAxLjApO1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gKz0gMWUtMzAgKiB0ZXh0dXJlKHRleFt1bmlmb3JtX2luZGV4X2J1ZmZlci50ZXhfaW5kZXhbMF1dLCB2ZWMyKDAsIDApKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgY2hhciBjb25zdCAqZnNTb3VyY2VfdmVydCA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxKSB1bmlmb3JtIHNhbXBsZXIyRCB0ZXhbNl07XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB1RnJhZ0NvbG9yO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB1RnJhZ0NvbG9yID0gdGV4dHVyZSh0ZXhbMF0sIHZlYzIoMCwgMCkpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIC8vIFNoYWRlciBwcm9ncmFtcyBmb3IgYXJyYXkgT09CIHRlc3QgaW4gZnJhZ21lbnQgc3RhZ2U6CisgICAgLy8gLSBUaGUgdmVydGV4IHNoYWRlciBmZXRjaGVzIHRoZSBpbnZhbGlkIGluZGV4IGZyb20gdGhlIHVuaWZvcm0gYnVmZmVyIGFuZCBwYXNzZXMgaXQgdG8gdGhlIGZyYWdtZW50IHNoYWRlci4KKyAgICAvLyAtIFRoZSBmcmFnbWVudCBzaGFkZXIgbWFrZXMgdGhlIGludmFsaWQgYXJyYXkgYWNjZXNzLgorICAgIGNoYXIgY29uc3QgKnZzU291cmNlX2ZyYWcgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChzdGQxNDAsIGJpbmRpbmcgPSAwKSB1bmlmb3JtIGZvbyB7IHVpbnQgdGV4X2luZGV4WzFdOyB9IHVuaWZvcm1faW5kZXhfYnVmZmVyO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IGZsYXQgdWludCBpbmRleDtcbiIKKyAgICAgICAgInZlYzIgdmVydGljZXNbM107XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgICAgIHZlcnRpY2VzWzBdID0gdmVjMigtMS4wLCAtMS4wKTtcbiIKKyAgICAgICAgIiAgICAgIHZlcnRpY2VzWzFdID0gdmVjMiggMS4wLCAtMS4wKTtcbiIKKyAgICAgICAgIiAgICAgIHZlcnRpY2VzWzJdID0gdmVjMiggMC4wLCAgMS4wKTtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCh2ZXJ0aWNlc1tnbF9WZXJ0ZXhJbmRleCAlIDNdLCAwLjAsIDEuMCk7XG4iCisgICAgICAgICIgICBpbmRleCA9IHVuaWZvcm1faW5kZXhfYnVmZmVyLnRleF9pbmRleFswXTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgY2hhciBjb25zdCAqZnNTb3VyY2VfZnJhZyA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxKSB1bmlmb3JtIHNhbXBsZXIyRCB0ZXhbNl07XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB1RnJhZ0NvbG9yO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uID0gMCkgaW4gZmxhdCB1aW50IGluZGV4O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB1RnJhZ0NvbG9yID0gdGV4dHVyZSh0ZXhbaW5kZXhdLCB2ZWMyKDAsIDApKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgY2hhciBjb25zdCAqZnNTb3VyY2VfZnJhZ19ydW50aW1lID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9FWFRfbm9udW5pZm9ybV9xdWFsaWZpZXIgOiBlbmFibGVcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxKSB1bmlmb3JtIHNhbXBsZXIyRCB0ZXhbXTtcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IHVGcmFnQ29sb3I7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb24gPSAwKSBpbiBmbGF0IHVpbnQgaW5kZXg7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIHVGcmFnQ29sb3IgPSB0ZXh0dXJlKHRleFtpbmRleF0sIHZlYzIoMCwgMCkpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZV9idWZmZXIgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICIjZXh0ZW5zaW9uIEdMX0VYVF9ub251bmlmb3JtX3F1YWxpZmllciA6IGVuYWJsZVxuICIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxKSBidWZmZXIgZm9vIHsgdmVjNCB2YWw7IH0gY29sb3JzW107XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB1RnJhZ0NvbG9yO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uID0gMCkgaW4gZmxhdCB1aW50IGluZGV4O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB1RnJhZ0NvbG9yID0gY29sb3JzW2luZGV4XS52YWw7XG4iCisgICAgICAgICJ9XG4iOworICAgIGNoYXIgY29uc3QgKmdzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9FWFRfbm9udW5pZm9ybV9xdWFsaWZpZXIgOiBlbmFibGVcbiAiCisgICAgICAgICJsYXlvdXQodHJpYW5nbGVzKSBpbjtcbiIKKyAgICAgICAgImxheW91dCh0cmlhbmdsZV9zdHJpcCwgbWF4X3ZlcnRpY2VzPTMpIG91dDtcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBpbiBWZXJ0ZXhEYXRhIHsgdmVjNCB4OyB9IGdzX2luW107XG4iCisgICAgICAgICJsYXlvdXQoc3RkMTQwLCBzZXQgPSAwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSB1Zm9vIHsgdWludCBpbmRleDsgfSB1bmlmb3JtX2luZGV4X2J1ZmZlcjtcbiIKKyAgICAgICAgImxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMSkgYnVmZmVyIGJmb28geyB2ZWM0IHZhbDsgfSBhZGRzW107XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IGdzX2luWzBdLnggKyBhZGRzW3VuaWZvcm1faW5kZXhfYnVmZmVyLmluZGV4XS52YWwueDtcbiIKKyAgICAgICAgIiAgIEVtaXRWZXJ0ZXgoKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnRlc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIiNleHRlbnNpb24gR0xfRVhUX25vbnVuaWZvcm1fcXVhbGlmaWVyIDogZW5hYmxlXG4gIgorICAgICAgICAibGF5b3V0KHN0ZDE0MCwgc2V0ID0gMCwgYmluZGluZyA9IDApIHVuaWZvcm0gdWZvbyB7IHVpbnQgaW5kZXg7IH0gdW5pZm9ybV9pbmRleF9idWZmZXI7XG4iCisgICAgICAgICJsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDEpIGJ1ZmZlciBiZm9vIHsgdmVjNCB2YWw7IH0gYWRkc1tdO1xuIgorICAgICAgICAibGF5b3V0KHRyaWFuZ2xlcywgZXF1YWxfc3BhY2luZywgY3cpIGluO1xuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICAgIGdsX1Bvc2l0aW9uID0gYWRkc1t1bmlmb3JtX2luZGV4X2J1ZmZlci5pbmRleF0udmFsO1xuIgorICAgICAgICAifVxuIjsKKworICAgIHN0cnVjdCBUZXN0Q2FzZSB7CisgICAgICAgIGNoYXIgY29uc3QgKnZlcnRleF9zb3VyY2U7CisgICAgICAgIGNoYXIgY29uc3QgKmZyYWdtZW50X3NvdXJjZTsKKyAgICAgICAgY2hhciBjb25zdCAqZ2VvbWV0cnlfc291cmNlOworICAgICAgICBjaGFyIGNvbnN0ICp0ZXNzX2N0cmxfc291cmNlOworICAgICAgICBjaGFyIGNvbnN0ICp0ZXNzX2V2YWxfc291cmNlOworICAgICAgICBib29sIGRlYnVnOworICAgICAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqICpwaXBlbGluZV9sYXlvdXQ7CisgICAgICAgIGNvbnN0IE9uZU9mZkRlc2NyaXB0b3JTZXQgKmRlc2NyaXB0b3Jfc2V0OworICAgICAgICB1aW50MzJfdCBpbmRleDsKKyAgICAgICAgY2hhciBjb25zdCAqZXhwZWN0ZWRfZXJyb3I7CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiB0ZXN0czsKKyAgICB0ZXN0cy5wdXNoX2JhY2soe3ZzU291cmNlX3ZlcnQsIGZzU291cmNlX3ZlcnQsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIGZhbHNlLCAmcGlwZWxpbmVfbGF5b3V0LCAmZGVzY3JpcHRvcl9zZXQsIDI1LAorICAgICAgICAgICAgICAgICAgICAgIkluZGV4IG9mIDI1IHVzZWQgdG8gaW5kZXggZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggNi4ifSk7CisgICAgdGVzdHMucHVzaF9iYWNrKHt2c1NvdXJjZV9mcmFnLCBmc1NvdXJjZV9mcmFnLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBmYWxzZSwgJnBpcGVsaW5lX2xheW91dCwgJmRlc2NyaXB0b3Jfc2V0LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICJJbmRleCBvZiAyNSB1c2VkIHRvIGluZGV4IGRlc2NyaXB0b3IgYXJyYXkgb2YgbGVuZ3RoIDYuIn0pOworI2lmICFkZWZpbmVkKEFORFJPSUQpCisgICAgLy8gVGhlIEFuZHJvaWQgdGVzdCBmcmFtZXdvcmsgdXNlcyBzaGFkZXJjIGZvciBvbmxpbmUgY29tcGlsYXRpb25zLiAgRXZlbiB3aGVuIGNvbmZpZ3VyZWQgdG8gY29tcGlsZSB3aXRoIGRlYnVnIGluZm8sCisgICAgLy8gc2hhZGVyYyBzZWVtcyB0byBkcm9wIHRoZSBPcExpbmUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIHNoYWRlciBiaW5hcnkuICBUaGlzIGNhdXNlcyB0aGUgZm9sbG93aW5nIHR3byB0ZXN0cyB0byBmYWlsCisgICAgLy8gb24gQW5kcm9pZCBwbGF0Zm9ybXMuICBTa2lwIHRoZXNlIHRlc3RzIHVudGlsIHRoZSBzaGFkZXJjIGlzc3VlIGlzIHVuZGVyc3Rvb2QvcmVzb2x2ZWQuCisgICAgdGVzdHMucHVzaF9iYWNrKHt2c1NvdXJjZV92ZXJ0LCBmc1NvdXJjZV92ZXJ0LCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCB0cnVlLCAmcGlwZWxpbmVfbGF5b3V0LCAmZGVzY3JpcHRvcl9zZXQsIDI1LAorICAgICAgICAgICAgICAgICAgICAgImdsX1Bvc2l0aW9uICs9IDFlLTMwICogdGV4dHVyZSh0ZXhbdW5pZm9ybV9pbmRleF9idWZmZXIudGV4X2luZGV4WzBdXSwgdmVjMigwLCAwKSk7In0pOworICAgIHRlc3RzLnB1c2hfYmFjayh7dnNTb3VyY2VfZnJhZywgZnNTb3VyY2VfZnJhZywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgdHJ1ZSwgJnBpcGVsaW5lX2xheW91dCwgJmRlc2NyaXB0b3Jfc2V0LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICJ1RnJhZ0NvbG9yID0gdGV4dHVyZSh0ZXhbaW5kZXhdLCB2ZWMyKDAsIDApKTsifSk7CisjZW5kaWYKKyAgICBpZiAoZGVzY3JpcHRvcl9pbmRleGluZykgeworICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe3ZzU291cmNlX2ZyYWcsIGZzU291cmNlX2ZyYWdfcnVudGltZSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgZmFsc2UsICZwaXBlbGluZV9sYXlvdXQsICZkZXNjcmlwdG9yX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAyNSwgIkluZGV4IG9mIDI1IHVzZWQgdG8gaW5kZXggZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggNi4ifSk7CisgICAgICAgIHRlc3RzLnB1c2hfYmFjayh7dnNTb3VyY2VfZnJhZywgZnNTb3VyY2VfZnJhZ19ydW50aW1lLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBmYWxzZSwgJnBpcGVsaW5lX2xheW91dCwgJmRlc2NyaXB0b3Jfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDUsICJEZXNjcmlwdG9yIGluZGV4IDUgaXMgdW5pbml0aWFsaXplZCJ9KTsKKyAgICAgICAgLy8gUGljayA2IGJlbG93IGJlY2F1c2UgaXQgaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHNwZWNpZmllZCwgYnV0IG1vcmUgdGhhbiB0aGUgYWN0dWFsIHNwZWNpZmllZAorICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe3ZzU291cmNlX2ZyYWcsIGZzU291cmNlX2ZyYWdfcnVudGltZSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgZmFsc2UsICZwaXBlbGluZV9sYXlvdXRfdmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfc2V0X3ZhcmlhYmxlLCA2LCAiSW5kZXggb2YgNiB1c2VkIHRvIGluZGV4IGRlc2NyaXB0b3IgYXJyYXkgb2YgbGVuZ3RoIDYuIn0pOworICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe3ZzU291cmNlX2ZyYWcsIGZzU291cmNlX2ZyYWdfcnVudGltZSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgZmFsc2UsICZwaXBlbGluZV9sYXlvdXRfdmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfc2V0X3ZhcmlhYmxlLCA1LCAiRGVzY3JpcHRvciBpbmRleCA1IGlzIHVuaW5pdGlhbGl6ZWQifSk7CisgICAgICAgIHRlc3RzLnB1c2hfYmFjayh7dnNTb3VyY2VfZnJhZywgZnNTb3VyY2VfYnVmZmVyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBmYWxzZSwgJnBpcGVsaW5lX2xheW91dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfc2V0X2J1ZmZlciwgMjUsICJJbmRleCBvZiAyNSB1c2VkIHRvIGluZGV4IGRlc2NyaXB0b3IgYXJyYXkgb2YgbGVuZ3RoIDYuIn0pOworICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe3ZzU291cmNlX2ZyYWcsIGZzU291cmNlX2J1ZmZlciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgZmFsc2UsICZwaXBlbGluZV9sYXlvdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldF9idWZmZXIsIDUsICJEZXNjcmlwdG9yIGluZGV4IDUgaXMgdW5pbml0aWFsaXplZCJ9KTsKKyAgICAgICAgaWYgKG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLmdlb21ldHJ5U2hhZGVyKSB7CisgICAgICAgICAgICAvLyBPT0IgR2VvbWV0cnkKKyAgICAgICAgICAgIHRlc3RzLnB1c2hfYmFjayh7YmluZFN0YXRlVmVydFNoYWRlclRleHQsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBnc1NvdXJjZSwgbnVsbHB0ciwgbnVsbHB0ciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXBlbGluZV9sYXlvdXRfYnVmZmVyLCAmZGVzY3JpcHRvcl9zZXRfYnVmZmVyLCAyNSwgIlN0YWdlID0gR2VvbWV0cnkifSk7CisgICAgICAgICAgICAvLyBVbmluaXRpYWxpemVkIEdlb21ldHJ5CisgICAgICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe2JpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dCwgZ3NTb3VyY2UsIG51bGxwdHIsIG51bGxwdHIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZWxpbmVfbGF5b3V0X2J1ZmZlciwgJmRlc2NyaXB0b3Jfc2V0X2J1ZmZlciwgNSwgIlN0YWdlID0gR2VvbWV0cnkifSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnRlc3NlbGxhdGlvblNoYWRlcikgeworICAgICAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgYmluZFN0YXRlRnJhZ1NoYWRlclRleHQsIG51bGxwdHIsIGJpbmRTdGF0ZVRzY1NoYWRlclRleHQsIHRlc1NvdXJjZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXBlbGluZV9sYXlvdXRfYnVmZmVyLCAmZGVzY3JpcHRvcl9zZXRfYnVmZmVyLCAyNSwgIlN0YWdlID0gVGVzc2VsbGF0aW9uIEV2YWwifSk7CisgICAgICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe2JpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dCwgbnVsbHB0ciwgYmluZFN0YXRlVHNjU2hhZGVyVGV4dCwgdGVzU291cmNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGVsaW5lX2xheW91dF9idWZmZXIsICZkZXNjcmlwdG9yX3NldF9idWZmZXIsIDUsICJTdGFnZSA9IFRlc3NlbGxhdGlvbiBFdmFsIn0pOworICAgICAgICB9CisgICAgfQorCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IG1fdmlld3BvcnRzWzBdOworICAgIFZrUmVjdDJEIHNjaXNzb3JzID0gbV9zY2lzc29yc1swXTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IHRlc3RzKSB7CisgICAgICAgIFZrUmVzdWx0IGVycjsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBpdGVyLmV4cGVjdGVkX2Vycm9yKTsKKyAgICAgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGl0ZXIudmVydGV4X3NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMsICJtYWluIiwgaXRlci5kZWJ1Zyk7CisgICAgICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBpdGVyLmZyYWdtZW50X3NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcywgIm1haW4iLCBpdGVyLmRlYnVnKTsKKyAgICAgICAgVmtTaGFkZXJPYmogKmdzID0gbnVsbHB0cjsKKyAgICAgICAgVmtTaGFkZXJPYmogKnRjcyA9IG51bGxwdHI7CisgICAgICAgIFZrU2hhZGVyT2JqICp0ZXMgPSBudWxscHRyOworICAgICAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgICAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgICAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworICAgICAgICBpZiAoaXRlci5nZW9tZXRyeV9zb3VyY2UpIHsKKyAgICAgICAgICAgIGdzID0gbmV3IFZrU2hhZGVyT2JqKG1fZGV2aWNlLCBpdGVyLmdlb21ldHJ5X3NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCwgdGhpcywgIm1haW4iLCBpdGVyLmRlYnVnKTsKKyAgICAgICAgICAgIHBpcGUuQWRkU2hhZGVyKGdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlci50ZXNzX2N0cmxfc291cmNlICYmIGl0ZXIudGVzc19ldmFsX3NvdXJjZSkgeworICAgICAgICAgICAgdGNzID0gbmV3IFZrU2hhZGVyT2JqKG1fZGV2aWNlLCBpdGVyLnRlc3NfY3RybF9zb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQsIHRoaXMsICJtYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLmRlYnVnKTsKKyAgICAgICAgICAgIHRlcyA9IG5ldyBWa1NoYWRlck9iaihtX2RldmljZSwgaXRlci50ZXNzX2V2YWxfc291cmNlLCBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklULCB0aGlzLCAibWFpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5kZWJ1Zyk7CisgICAgICAgICAgICBwaXBlLkFkZFNoYWRlcih0Y3MpOworICAgICAgICAgICAgcGlwZS5BZGRTaGFkZXIodGVzKTsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlhc2Npe1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QsIFZLX0ZBTFNFfTsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUNyZWF0ZUluZm8gdGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVJbmZvID0geworICAgICAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9ET01BSU5fT1JJR0lOX1NUQVRFX0NSRUFURV9JTkZPLCBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZUfTsKKworICAgICAgICAgICAgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyB0c2Npe1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9TVEFURV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVJbmZvLCAwLCAzfTsKKyAgICAgICAgICAgIHBpcGUuU2V0VGVzc2VsbGF0aW9uKCZ0c2NpKTsKKyAgICAgICAgICAgIHBpcGUuU2V0SW5wdXRBc3NlbWJseSgmaWFzY2kpOworICAgICAgICB9CisgICAgICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgICAgICBlcnIgPSBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUoaXRlci5waXBlbGluZV9sYXlvdXQtPmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisgICAgICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgaXRlci5waXBlbGluZV9sYXlvdXQtPmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyLmRlc2NyaXB0b3Jfc2V0LT5zZXRfLCAwLCBudWxscHRyKTsKKyAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZzY2lzc29ycyk7CisgICAgICAgIHZrOjpDbWREcmF3KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDMsIDEsIDAsIDApOworICAgICAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICAgICAgdWludDMyX3QgKmRhdGEgPSAodWludDMyX3QgKilidWZmZXIwLm1lbW9yeSgpLm1hcCgpOworICAgICAgICBkYXRhWzBdID0gaXRlci5pbmRleDsKKyAgICAgICAgYnVmZmVyMC5tZW1vcnkoKS51bm1hcCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLURlc2NyaXB0b3JTZXROb3RVcGRhdGVkIik7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIGlmIChncykgeworICAgICAgICAgICAgZGVsZXRlIGdzOworICAgICAgICB9CisgICAgICAgIGlmICh0Y3MgJiYgdGVzKSB7CisgICAgICAgICAgICBkZWxldGUgdGNzOworICAgICAgICAgICAgZGVsZXRlIHRlczsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdXRvIGNfcXVldWUgPSBtX2RldmljZS0+R2V0RGVmYXVsdENvbXB1dGVRdWV1ZSgpOworICAgIGlmIChjX3F1ZXVlICYmIGRlc2NyaXB0b3JfaW5kZXhpbmcpIHsKKyAgICAgICAgY2hhciBjb25zdCAqY3NTb3VyY2UgPQorICAgICAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAgICAgIiNleHRlbnNpb24gR0xfRVhUX25vbnVuaWZvcm1fcXVhbGlmaWVyIDogZW5hYmxlXG4gIgorICAgICAgICAgICAgImxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSB1Zm9vIHsgdWludCBpbmRleDsgfSB1X2luZGV4OyIKKyAgICAgICAgICAgICJsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDEpIGJ1ZmZlciBTdG9yYWdlQnVmZmVyIHtcbiIKKyAgICAgICAgICAgICIgICAgdWludCBkYXRhO1xuIgorICAgICAgICAgICAgIn0gRGF0YVtdO1xuIgorICAgICAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgICAgICIgICBEYXRhWyh1X2luZGV4LmluZGV4IC0gMSldLmRhdGEgPSBEYXRhW3VfaW5kZXguaW5kZXhdLmRhdGE7XG4iCisgICAgICAgICAgICAifVxuIjsKKworICAgICAgICBhdXRvIHNoYWRlcl9tb2R1bGUgPSBuZXcgVmtTaGFkZXJPYmoobV9kZXZpY2UsIGNzU291cmNlLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIHRoaXMpOworCisgICAgICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc3RhZ2U7CisgICAgICAgIHN0YWdlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZS5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgIHN0YWdlLmZsYWdzID0gMDsKKyAgICAgICAgc3RhZ2Uuc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQ7CisgICAgICAgIHN0YWdlLm1vZHVsZSA9IHNoYWRlcl9tb2R1bGUtPmhhbmRsZSgpOworICAgICAgICBzdGFnZS5wTmFtZSA9ICJtYWluIjsKKyAgICAgICAgc3RhZ2UucFNwZWNpYWxpemF0aW9uSW5mbyA9IG51bGxwdHI7CisKKyAgICAgICAgLy8gQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcworICAgICAgICBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gcGlwZWxpbmVfaW5mbyA9IHt9OworICAgICAgICBwaXBlbGluZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NUFVURV9QSVBFTElORV9DUkVBVEVfSU5GTzsKKyAgICAgICAgcGlwZWxpbmVfaW5mby5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgIHBpcGVsaW5lX2luZm8uZmxhZ3MgPSAwOworICAgICAgICBwaXBlbGluZV9pbmZvLmxheW91dCA9IHBpcGVsaW5lX2xheW91dF9idWZmZXIuaGFuZGxlKCk7CisgICAgICAgIHBpcGVsaW5lX2luZm8uYmFzZVBpcGVsaW5lSGFuZGxlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIHBpcGVsaW5lX2luZm8uYmFzZVBpcGVsaW5lSW5kZXggPSAtMTsKKyAgICAgICAgcGlwZWxpbmVfaW5mby5zdGFnZSA9IHN0YWdlOworCisgICAgICAgIFZrUGlwZWxpbmUgY19waXBlbGluZTsKKyAgICAgICAgdms6OkNyZWF0ZUNvbXB1dGVQaXBlbGluZXMoZGV2aWNlKCksIFZLX05VTExfSEFORExFLCAxLCAmcGlwZWxpbmVfaW5mbywgbnVsbHB0ciwgJmNfcGlwZWxpbmUpOworICAgICAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5faW5mbyA9IHt9OworICAgICAgICBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gaGluZm8gPSB7fTsKKyAgICAgICAgaGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPOworICAgICAgICBiZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICAgICAgYmVnaW5faW5mby5wSW5oZXJpdGFuY2VJbmZvID0gJmhpbmZvOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oJmJlZ2luX2luZm8pOworICAgICAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgY19waXBlbGluZSk7CisgICAgICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLCBwaXBlbGluZV9sYXlvdXRfYnVmZmVyLmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldF9idWZmZXIuc2V0XywgMCwgbnVsbHB0cik7CisgICAgICAgIHZrOjpDbWREaXNwYXRjaChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAxLCAxKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgICAgICAvLyBVbmluaXRpYWxpemVkCisgICAgICAgIHVpbnQzMl90ICpkYXRhID0gKHVpbnQzMl90ICopYnVmZmVyMC5tZW1vcnkoKS5tYXAoKTsKKyAgICAgICAgZGF0YVswXSA9IDU7CisgICAgICAgIGJ1ZmZlcjAubWVtb3J5KCkudW5tYXAoKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiU3RhZ2UgPSBDb21wdXRlIik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLURlc2NyaXB0b3JTZXROb3RVcGRhdGVkIik7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChjX3F1ZXVlLT5oYW5kbGUoKSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIC8vIE91dCBvZiBCb3VuZHMKKyAgICAgICAgZGF0YSA9ICh1aW50MzJfdCAqKWJ1ZmZlcjAubWVtb3J5KCkubWFwKCk7CisgICAgICAgIGRhdGFbMF0gPSAyNTsKKyAgICAgICAgYnVmZmVyMC5tZW1vcnkoKS51bm1hcCgpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJTdGFnZSA9IENvbXB1dGUiKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtRGVzY3JpcHRvclNldE5vdFVwZGF0ZWQiKTsKKyAgICAgICAgdms6OlF1ZXVlU3VibWl0KGNfcXVldWUtPmhhbmRsZSgpLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICAgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgdms6OkRlc3Ryb3lQaXBlbGluZShtX2RldmljZS0+aGFuZGxlKCksIGNfcGlwZWxpbmUsIE5VTEwpOworICAgICAgICB2azo6RGVzdHJveVNoYWRlck1vZHVsZShtX2RldmljZS0+aGFuZGxlKCksIHNoYWRlcl9tb2R1bGUtPmhhbmRsZSgpLCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEdwdUJ1ZmZlckRldmljZUFkZHJlc3NPT0IpIHsKKyAgICBib29sIHN1cHBvcnRlZCA9IEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisKKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIGVuYWJsZXNbXSA9IHtWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9FWFR9OworICAgIFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUIGZlYXR1cmVzID0ge307CisgICAgZmVhdHVyZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVDsKKyAgICBmZWF0dXJlcy5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCA9IDE7CisgICAgZmVhdHVyZXMucEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBlbmFibGVzOworICAgIEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvciwgJmZlYXR1cmVzKTsKKworICAgIGlmIChEZXZpY2VJc01vY2tJQ0QoKSB8fCBEZXZpY2VTaW11bGF0aW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBHUFUtQXNzaXN0ZWQgdmFsaWRhdGlvbiB0ZXN0IHJlcXVpcmVzIGEgZHJpdmVyIHRoYXQgY2FuIGRyYXcuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdXBwb3J0ZWQgPSBzdXBwb3J0ZWQgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfQlVGRkVSX0RFVklDRV9BRERSRVNTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9CVUZGRVJfREVWSUNFX0FERFJFU1NfRVhURU5TSU9OX05BTUUpOworCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBmZWF0dXJlczIgPSB7fTsKKyAgICBhdXRvIGJkYV9mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlQnVmZmVyRGV2aWNlQWRkcmVzc0ZlYXR1cmVzRVhUPigpOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KCZiZGFfZmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoZ3B1KCksICZmZWF0dXJlczIpOworICAgIHN1cHBvcnRlZCA9IHN1cHBvcnRlZCAmJiBiZGFfZmVhdHVyZXMuYnVmZmVyRGV2aWNlQWRkcmVzczsKKworICAgIGlmICghc3VwcG9ydGVkKSB7CisgICAgICAgIHByaW50ZigiQnVmZmVyIERldmljZSBBZGRyZXNzIGZlYXR1cmUgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIHBvb2xfZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMiwgcG9vbF9mbGFncykpOworICAgIGlmIChtX2RldmljZS0+cHJvcHMuYXBpVmVyc2lvbiA8IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICBwcmludGYoIiVzIEdQVS1Bc3Npc3RlZCB2YWxpZGF0aW9uIHRlc3QgcmVxdWlyZXMgVnVsa2FuIDEuMSsuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBNYWtlIGEgdW5pZm9ybSBidWZmZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSBzaGFkZXIgdGhhdCBjb250YWlucyB0aGUgcG9pbnRlciBhbmQgd3JpdGUgY291bnQKKyAgICB1aW50MzJfdCBxZmkgPSAwOworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBiY2kgPSB7fTsKKyAgICBiY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgYmNpLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICBiY2kuc2l6ZSA9IDg7CisgICAgYmNpLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgYmNpLnBRdWV1ZUZhbWlseUluZGljZXMgPSAmcWZpOworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjA7CisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbV9wcm9wcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUOworICAgIGJ1ZmZlcjAuaW5pdCgqbV9kZXZpY2UsIGJjaSwgbWVtX3Byb3BzKTsKKworICAgIC8vIE1ha2UgYW5vdGhlciBidWZmZXIgdG8gd3JpdGUgdG8KKyAgICBiY2kudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfU0hBREVSX0RFVklDRV9BRERSRVNTX0JJVF9FWFQ7CisgICAgYmNpLnNpemUgPSA2NDsgIC8vIEJ1ZmZlciBzaG91bGQgYmUgMTYqNCA9IDY0IGJ5dGVzCisgICAgVmtCdWZmZXJPYmogYnVmZmVyMTsKKyAgICBidWZmZXIxLmluaXQoKm1fZGV2aWNlLCBiY2ksIG1lbV9wcm9wcyk7CisKKyAgICAvLyBHZXQgZGV2aWNlIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHdyaXRlIHRvCisgICAgVmtCdWZmZXJEZXZpY2VBZGRyZXNzSW5mb0VYVCBiZGFfaW5mbyA9IHt9OworICAgIGJkYV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0RFVklDRV9BRERSRVNTX0lORk9fRVhUOworICAgIGJkYV9pbmZvLmJ1ZmZlciA9IGJ1ZmZlcjEuaGFuZGxlKCk7CisgICAgYXV0byB2a0dldEJ1ZmZlckRldmljZUFkZHJlc3NFWFQgPQorICAgICAgICAoUEZOX3ZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVCl2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRCdWZmZXJEZXZpY2VBZGRyZXNzRVhUICE9IG51bGxwdHIpOworICAgIGF1dG8gcEJ1ZmZlciA9IHZrR2V0QnVmZmVyRGV2aWNlQWRkcmVzc0VYVChtX2RldmljZS0+ZGV2aWNlKCksICZiZGFfaW5mbyk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLCB7ezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn19KTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRlc2NyaXB0b3Jfc2V0LmxheW91dF99KTsKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZlcl90ZXN0X2J1ZmZlcl9pbmZvWzJdID0ge307CisgICAgYnVmZmVyX3Rlc3RfYnVmZmVyX2luZm9bMF0uYnVmZmVyID0gYnVmZmVyMC5oYW5kbGUoKTsKKyAgICBidWZmZXJfdGVzdF9idWZmZXJfaW5mb1swXS5vZmZzZXQgPSAwOworICAgIGJ1ZmZlcl90ZXN0X2J1ZmZlcl9pbmZvWzBdLnJhbmdlID0gc2l6ZW9mKHVpbnQzMl90KTsKKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGVzWzFdID0ge307CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5kc3RTZXQgPSBkZXNjcmlwdG9yX3NldC5zZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0uZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0ucEJ1ZmZlckluZm8gPSBidWZmZXJfdGVzdF9idWZmZXJfaW5mbzsKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCBkZXNjcmlwdG9yX3dyaXRlcywgMCwgTlVMTCk7CisKKyAgICBjaGFyIGNvbnN0ICpzaGFkZXJfc291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9FWFRfYnVmZmVyX3JlZmVyZW5jZSA6IGVuYWJsZVxuICIKKyAgICAgICAgImxheW91dChidWZmZXJfcmVmZXJlbmNlLCBidWZmZXJfcmVmZXJlbmNlX2FsaWduID0gMTYpIGJ1ZmZlciBidWZTdHJ1Y3Q7XG4iCisgICAgICAgICJsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDApIHVuaWZvcm0gdWZvbyB7XG4iCisgICAgICAgICIgICAgYnVmU3RydWN0IGRhdGE7XG4iCisgICAgICAgICIgICAgaW50IG5Xcml0ZXM7XG4iCisgICAgICAgICJ9IHVfaW5mbztcbiIKKyAgICAgICAgImxheW91dChidWZmZXJfcmVmZXJlbmNlLCBzdGQxNDApIGJ1ZmZlciBidWZTdHJ1Y3Qge1xuIgorICAgICAgICAiICAgIGludCBhWzRdO1xuIgorICAgICAgICAifTtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgIiAgICBmb3IgKGludCBpPTA7IGkgPCB1X2luZm8ubldyaXRlczsgKytpKSB7XG4iCisgICAgICAgICIgICAgICAgIHVfaW5mby5kYXRhLmFbaV0gPSAweGRlYWRjYTcxO1xuIgorICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgIn1cbiI7CisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHNoYWRlcl9zb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzLCAibWFpbiIsIHRydWUpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IG1fdmlld3BvcnRzWzBdOworICAgIFZrUmVjdDJEIHNjaXNzb3JzID0gbV9zY2lzc29yc1swXTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICBWa1Jlc3VsdCBlcnIgPSBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5faW5mbyA9IHt9OworICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBoaW5mbyA9IHt9OworICAgIGhpbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTzsKKyAgICBiZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICBiZWdpbl9pbmZvLnBJbmhlcml0YW5jZUluZm8gPSAmaGluZm87CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCZiZWdpbl9pbmZvKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvcl9zZXQuc2V0XywgMCwgbnVsbHB0cik7CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3JzKTsKKyAgICB2azo6Q21kRHJhdyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAzLCAxLCAwLCAwKTsKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgLy8gU3RhcnRpbmcgYWRkcmVzcyB0b28gbG93CisgICAgVmtEZXZpY2VBZGRyZXNzICpkYXRhID0gKFZrRGV2aWNlQWRkcmVzcyAqKWJ1ZmZlcjAubWVtb3J5KCkubWFwKCk7CisgICAgZGF0YVswXSA9IHBCdWZmZXIgLSAxNjsKKyAgICBkYXRhWzFdID0gNDsKKyAgICBidWZmZXIwLm1lbW9yeSgpLnVubWFwKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiYWNjZXNzIG91dCBvZiBib3VuZHMiKTsKKyAgICBlcnIgPSB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgZXJyID0gdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBSdW4gcGFzdCB0aGUgZW5kCisgICAgZGF0YSA9IChWa0RldmljZUFkZHJlc3MgKilidWZmZXIwLm1lbW9yeSgpLm1hcCgpOworICAgIGRhdGFbMF0gPSBwQnVmZmVyOworICAgIGRhdGFbMV0gPSA1OworICAgIGJ1ZmZlcjAubWVtb3J5KCkudW5tYXAoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJhY2Nlc3Mgb3V0IG9mIGJvdW5kcyIpOworICAgIGVyciA9IHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBlcnIgPSB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFBvc2l0aXZlIHRlc3QgLSBzdGF5IGluc2lkZSBidWZmZXIKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIGRhdGEgPSAoVmtEZXZpY2VBZGRyZXNzICopYnVmZmVyMC5tZW1vcnkoKS5tYXAoKTsKKyAgICBkYXRhWzBdID0gcEJ1ZmZlcjsKKyAgICBkYXRhWzFdID0gNDsKKyAgICBidWZmZXIwLm1lbW9yeSgpLnVubWFwKCk7CisgICAgZXJyID0gdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIGVyciA9IHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEdwdVZhbGlkYXRpb25BcnJheU9PQlJheVRyYWNpbmdTaGFkZXJzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkdQVSB2YWxpZGF0aW9uOiBWZXJpZnkgZGV0ZWN0aW9uIG9mIG91dC1vZi1ib3VuZHMgZGVzY3JpcHRvciBhcnJheSBpbmRleGluZyBhbmQgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgZGVzY3JpcHRvcnMgZm9yICIKKyAgICAgICAgInJheSB0cmFjaW5nIHNoYWRlcnMuIik7CisKKyAgICBzdGQ6OmFycmF5PGNvbnN0IGNoYXIgKiwgMT4gcmVxdWlyZWRfaW5zdGFuY2VfZXh0ZW5zaW9ucyA9IHtWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUV9OworICAgIGZvciAoYXV0byBpbnN0YW5jZV9leHRlbnNpb24gOiByZXF1aXJlZF9pbnN0YW5jZV9leHRlbnNpb25zKSB7CisgICAgICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChpbnN0YW5jZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soaW5zdGFuY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LCBpbnN0YW5jZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgVmtWYWxpZGF0aW9uRmVhdHVyZUVuYWJsZUVYVCB2YWxpZGF0aW9uX2ZlYXR1cmVfZW5hYmxlc1tdID0ge1ZLX1ZBTElEQVRJT05fRkVBVFVSRV9FTkFCTEVfR1BVX0FTU0lTVEVEX0VYVH07CisgICAgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgdmFsaWRhdGlvbl9mZWF0dXJlcyA9IHt9OworICAgIHZhbGlkYXRpb25fZmVhdHVyZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVDsKKyAgICB2YWxpZGF0aW9uX2ZlYXR1cmVzLmVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZUNvdW50ID0gMTsKKyAgICB2YWxpZGF0aW9uX2ZlYXR1cmVzLnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gdmFsaWRhdGlvbl9mZWF0dXJlX2VuYWJsZXM7CisgICAgYm9vbCBkZXNjcmlwdG9yX2luZGV4aW5nID0gQ2hlY2tEZXNjcmlwdG9ySW5kZXhpbmdTdXBwb3J0QW5kSW5pdEZyYW1ld29yaygKKyAgICAgICAgdGhpcywgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgJnZhbGlkYXRpb25fZmVhdHVyZXMsIG1fZXJyb3JNb25pdG9yKTsKKworICAgIGlmIChEZXZpY2VJc01vY2tJQ0QoKSB8fCBEZXZpY2VTaW11bGF0aW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IG5vdCBzdXBwb3J0ZWQgYnkgTW9ja0lDRCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6YXJyYXk8Y29uc3QgY2hhciAqLCAyPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHtWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlZfUkFZX1RSQUNJTkdfRVhURU5TSU9OX05BTUV9OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2aWNlX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIGRldmljZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBmZWF0dXJlczIgPSB7fTsKKyAgICBhdXRvIGluZGV4aW5nX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVD4oKTsKKyAgICBpZiAoZGVzY3JpcHRvcl9pbmRleGluZykgeworICAgICAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgICAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgICAgIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmaW5kZXhpbmdfZmVhdHVyZXMpOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgICAgICBpZiAoIWluZGV4aW5nX2ZlYXR1cmVzLnJ1bnRpbWVEZXNjcmlwdG9yQXJyYXkgfHwgIWluZGV4aW5nX2ZlYXR1cmVzLmRlc2NyaXB0b3JCaW5kaW5nUGFydGlhbGx5Qm91bmQgfHwKKyAgICAgICAgICAgICFpbmRleGluZ19mZWF0dXJlcy5kZXNjcmlwdG9yQmluZGluZ1NhbXBsZWRJbWFnZVVwZGF0ZUFmdGVyQmluZCB8fAorICAgICAgICAgICAgIWluZGV4aW5nX2ZlYXR1cmVzLmRlc2NyaXB0b3JCaW5kaW5nVmFyaWFibGVEZXNjcmlwdG9yQ291bnQpIHsKKyAgICAgICAgICAgIHByaW50ZigiTm90IGFsbCBkZXNjcmlwdG9yIGluZGV4aW5nIGZlYXR1cmVzIHN1cHBvcnRlZCwgc2tpcHBpbmcgZGVzY3JpcHRvciBpbmRleGluZyB0ZXN0c1xuIik7CisgICAgICAgICAgICBkZXNjcmlwdG9yX2luZGV4aW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIHBvb2xfZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMiwgcG9vbF9mbGFncykpOworCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgYXV0byByYXlfdHJhY2luZ19wcm9wZXJ0aWVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VSYXlUcmFjaW5nUHJvcGVydGllc05WPigpOworICAgIGF1dG8gcHJvcGVydGllczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSPigmcmF5X3RyYWNpbmdfcHJvcGVydGllcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKGdwdSgpLCAmcHJvcGVydGllczIpOworICAgIGlmIChyYXlfdHJhY2luZ19wcm9wZXJ0aWVzLm1heFRyaWFuZ2xlQ291bnQgPT0gMCkgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCByYXkgdHJhY2luZyBwcm9wZXJ0aWVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtRdWV1ZSByYXlfdHJhY2luZ19xdWV1ZSA9IG1fZGV2aWNlLT5tX3F1ZXVlOworICAgIHVpbnQzMl90IHJheV90cmFjaW5nX3F1ZXVlX2ZhbWlseV9pbmRleCA9IDA7CisKKyAgICAvLyBJZiBzdXBwb3J0ZWQsIHJ1biBvbiB0aGUgY29tcHV0ZSBvbmx5IHF1ZXVlLgorICAgIHVpbnQzMl90IGNvbXB1dGVfb25seV9xdWV1ZV9mYW1pbHlfaW5kZXggPSBtX2RldmljZS0+UXVldWVGYW1pbHlNYXRjaGluZyhWS19RVUVVRV9DT01QVVRFX0JJVCwgVktfUVVFVUVfR1JBUEhJQ1NfQklUKTsKKyAgICBpZiAoY29tcHV0ZV9vbmx5X3F1ZXVlX2ZhbWlseV9pbmRleCAhPSBVSU5UMzJfTUFYKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJmNvbXB1dGVfb25seV9xdWV1ZXMgPSBtX2RldmljZS0+cXVldWVfZmFtaWx5X3F1ZXVlcyhjb21wdXRlX29ubHlfcXVldWVfZmFtaWx5X2luZGV4KTsKKyAgICAgICAgaWYgKCFjb21wdXRlX29ubHlfcXVldWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJheV90cmFjaW5nX3F1ZXVlID0gY29tcHV0ZV9vbmx5X3F1ZXVlc1swXS0+aGFuZGxlKCk7CisgICAgICAgICAgICByYXlfdHJhY2luZ19xdWV1ZV9mYW1pbHlfaW5kZXggPSBjb21wdXRlX29ubHlfcXVldWVfZmFtaWx5X2luZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgVmtDb21tYW5kUG9vbE9iaiByYXlfdHJhY2luZ19jb21tYW5kX3Bvb2wobV9kZXZpY2UsIHJheV90cmFjaW5nX3F1ZXVlX2ZhbWlseV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIHJheV90cmFjaW5nX2NvbW1hbmRfYnVmZmVyKG1fZGV2aWNlLCAmcmF5X3RyYWNpbmdfY29tbWFuZF9wb29sKTsKKworICAgIHN0cnVjdCBBQUJCIHsKKyAgICAgICAgZmxvYXQgbWluX3g7CisgICAgICAgIGZsb2F0IG1pbl95OworICAgICAgICBmbG9hdCBtaW5fejsKKyAgICAgICAgZmxvYXQgbWF4X3g7CisgICAgICAgIGZsb2F0IG1heF95OworICAgICAgICBmbG9hdCBtYXhfejsKKyAgICB9OworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QUFCQj4gYWFiYnMgPSB7ey0xLjBmLCAtMS4wZiwgLTEuMGYsICsxLjBmLCArMS4wZiwgKzEuMGZ9fTsKKworICAgIHN0cnVjdCBWa0dlb21ldHJ5SW5zdGFuY2VOViB7CisgICAgICAgIGZsb2F0IHRyYW5zZm9ybVsxMl07CisgICAgICAgIHVpbnQzMl90IGluc3RhbmNlQ3VzdG9tSW5kZXggOiAyNDsKKyAgICAgICAgdWludDMyX3QgbWFzayA6IDg7CisgICAgICAgIHVpbnQzMl90IGluc3RhbmNlT2Zmc2V0IDogMjQ7CisgICAgICAgIHVpbnQzMl90IGZsYWdzIDogODsKKyAgICAgICAgdWludDY0X3QgYWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlOworICAgIH07CisKKyAgICBWa0RldmljZVNpemUgYWFiYl9idWZmZXJfc2l6ZSA9IHNpemVvZihBQUJCKSAqIGFhYmJzLnNpemUoKTsKKyAgICBWa0J1ZmZlck9iaiBhYWJiX2J1ZmZlcjsKKyAgICBhYWJiX2J1ZmZlci5pbml0KCptX2RldmljZSwgYWFiYl9idWZmZXJfc2l6ZSwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WLCB7cmF5X3RyYWNpbmdfcXVldWVfZmFtaWx5X2luZGV4fSk7CisKKyAgICB1aW50OF90ICptYXBwZWRfYWFiYl9idWZmZXJfZGF0YSA9ICh1aW50OF90ICopYWFiYl9idWZmZXIubWVtb3J5KCkubWFwKCk7CisgICAgc3RkOjptZW1jcHkobWFwcGVkX2FhYmJfYnVmZmVyX2RhdGEsICh1aW50OF90ICopYWFiYnMuZGF0YSgpLCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oYWFiYl9idWZmZXJfc2l6ZSkpOworICAgIGFhYmJfYnVmZmVyLm1lbW9yeSgpLnVubWFwKCk7CisKKyAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnkgPSB7fTsKKyAgICBnZW9tZXRyeS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5VHlwZSA9IFZLX0dFT01FVFJZX1RZUEVfQUFCQlNfTlY7CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzID0ge307CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LmFhYmJzID0ge307CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LmFhYmJzLmFhYmJEYXRhID0gYWFiYl9idWZmZXIuaGFuZGxlKCk7CisgICAgZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMubnVtQUFCQnMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWFiYnMuc2l6ZSgpKTsKKyAgICBnZW9tZXRyeS5nZW9tZXRyeS5hYWJicy5vZmZzZXQgPSAwOworICAgIGdlb21ldHJ5Lmdlb21ldHJ5LmFhYmJzLnN0cmlkZSA9IHN0YXRpY19jYXN0PFZrRGV2aWNlU2l6ZT4oc2l6ZW9mKEFBQkIpKTsKKyAgICBnZW9tZXRyeS5mbGFncyA9IDA7CisKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OViBib3RfbGV2ZWxfYXNfaW5mbyA9IHt9OworICAgIGJvdF9sZXZlbF9hc19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9JTkZPX05WOworICAgIGJvdF9sZXZlbF9hc19pbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WOworICAgIGJvdF9sZXZlbF9hc19pbmZvLmluc3RhbmNlQ291bnQgPSAwOworICAgIGJvdF9sZXZlbF9hc19pbmZvLmdlb21ldHJ5Q291bnQgPSAxOworICAgIGJvdF9sZXZlbF9hc19pbmZvLnBHZW9tZXRyaWVzID0gJmdlb21ldHJ5OworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvID0ge307CisgICAgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVjsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mbyA9IGJvdF9sZXZlbF9hc19pbmZvOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogYm90X2xldmVsX2FzKCptX2RldmljZSwgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFZrR2VvbWV0cnlJbnN0YW5jZU5WPiBpbnN0YW5jZXMgPSB7CisgICAgICAgIFZrR2VvbWV0cnlJbnN0YW5jZU5WeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMHhGRiwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBWS19HRU9NRVRSWV9JTlNUQU5DRV9UUklBTkdMRV9DVUxMX0RJU0FCTEVfQklUX05WLAorICAgICAgICAgICAgYm90X2xldmVsX2FzLm9wYXF1ZV9oYW5kbGUoKSwKKyAgICAgICAgfSwKKyAgICB9OworCisgICAgVmtEZXZpY2VTaXplIGluc3RhbmNlX2J1ZmZlcl9zaXplID0gc2l6ZW9mKFZrR2VvbWV0cnlJbnN0YW5jZU5WKSAqIGluc3RhbmNlcy5zaXplKCk7CisgICAgVmtCdWZmZXJPYmogaW5zdGFuY2VfYnVmZmVyOworICAgIGluc3RhbmNlX2J1ZmZlci5pbml0KCptX2RldmljZSwgaW5zdGFuY2VfYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OViwge3JheV90cmFjaW5nX3F1ZXVlX2ZhbWlseV9pbmRleH0pOworCisgICAgdWludDhfdCAqbWFwcGVkX2luc3RhbmNlX2J1ZmZlcl9kYXRhID0gKHVpbnQ4X3QgKilpbnN0YW5jZV9idWZmZXIubWVtb3J5KCkubWFwKCk7CisgICAgc3RkOjptZW1jcHkobWFwcGVkX2luc3RhbmNlX2J1ZmZlcl9kYXRhLCAodWludDhfdCAqKWluc3RhbmNlcy5kYXRhKCksIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihpbnN0YW5jZV9idWZmZXJfc2l6ZSkpOworICAgIGluc3RhbmNlX2J1ZmZlci5tZW1vcnkoKS51bm1hcCgpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgdG9wX2xldmVsX2FzX2luZm8gPSB7fTsKKyAgICB0b3BfbGV2ZWxfYXNfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OVjsKKyAgICB0b3BfbGV2ZWxfYXNfaW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX1RPUF9MRVZFTF9OVjsKKyAgICB0b3BfbGV2ZWxfYXNfaW5mby5pbnN0YW5jZUNvdW50ID0gMTsKKyAgICB0b3BfbGV2ZWxfYXNfaW5mby5nZW9tZXRyeUNvdW50ID0gMDsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mbyA9IHt9OworICAgIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8gPSB0b3BfbGV2ZWxfYXNfaW5mbzsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlT2JqIHRvcF9sZXZlbF9hcygqbV9kZXZpY2UsIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mbyk7CisKKyAgICBWa0RldmljZVNpemUgc2NyYXRjaF9idWZmZXJfc2l6ZSA9IHN0ZDo6bWF4KGJvdF9sZXZlbF9hcy5idWlsZF9zY3JhdGNoX21lbW9yeV9yZXF1aXJlbWVudHMoKS5tZW1vcnlSZXF1aXJlbWVudHMuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbF9hcy5idWlsZF9zY3JhdGNoX21lbW9yeV9yZXF1aXJlbWVudHMoKS5tZW1vcnlSZXF1aXJlbWVudHMuc2l6ZSk7CisgICAgVmtCdWZmZXJPYmogc2NyYXRjaF9idWZmZXI7CisgICAgc2NyYXRjaF9idWZmZXIuaW5pdCgqbV9kZXZpY2UsIHNjcmF0Y2hfYnVmZmVyX3NpemUsIFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklULCBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WKTsKKworICAgIHJheV90cmFjaW5nX2NvbW1hbmRfYnVmZmVyLmJlZ2luKCk7CisKKyAgICAvLyBCdWlsZCBib3QgbGV2ZWwgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZQorICAgIHJheV90cmFjaW5nX2NvbW1hbmRfYnVmZmVyLkJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlKCZib3RfbGV2ZWxfYXMsIHNjcmF0Y2hfYnVmZmVyLmhhbmRsZSgpKTsKKworICAgIC8vIEJhcnJpZXIgdG8gcHJldmVudCB1c2luZyBzY3JhdGNoIGJ1ZmZlciBmb3IgdG9wIGxldmVsIGJ1aWxkIGJlZm9yZSBib3R0b20gbGV2ZWwgYnVpbGQgZmluaXNoZXMKKyAgICBWa01lbW9yeUJhcnJpZXIgbWVtb3J5X2JhcnJpZXIgPSB7fTsKKyAgICBtZW1vcnlfYmFycmllci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9CQVJSSUVSOworICAgIG1lbW9yeV9iYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9SRUFEX0JJVF9OViB8IFZLX0FDQ0VTU19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1dSSVRFX0JJVF9OVjsKKyAgICBtZW1vcnlfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfUkVBRF9CSVRfTlYgfCBWS19BQ0NFU1NfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9XUklURV9CSVRfTlY7CisgICAgcmF5X3RyYWNpbmdfY29tbWFuZF9idWZmZXIuUGlwZWxpbmVCYXJyaWVyKFZLX1BJUEVMSU5FX1NUQUdFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQlVJTERfQklUX05WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0JVSUxEX0JJVF9OViwgMCwgMSwgJm1lbW9yeV9iYXJyaWVyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyKTsKKworICAgIC8vIEJ1aWxkIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlCisgICAgcmF5X3RyYWNpbmdfY29tbWFuZF9idWZmZXIuQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmUoJnRvcF9sZXZlbF9hcywgc2NyYXRjaF9idWZmZXIuaGFuZGxlKCksIGluc3RhbmNlX2J1ZmZlci5oYW5kbGUoKSk7CisKKyAgICByYXlfdHJhY2luZ19jb21tYW5kX2J1ZmZlci5lbmQoKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmcmF5X3RyYWNpbmdfY29tbWFuZF9idWZmZXIuaGFuZGxlKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KHJheV90cmFjaW5nX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICB2azo6UXVldWVXYWl0SWRsZShyYXlfdHJhY2luZ19xdWV1ZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBWa1RleHR1cmVPYmogdGV4dHVyZShtX2RldmljZSwgbnVsbHB0cik7CisgICAgVmtTYW1wbGVyT2JqIHNhbXBsZXIobV9kZXZpY2UpOworCisgICAgVmtEZXZpY2VTaXplIHN0b3JhZ2VfYnVmZmVyX3NpemUgPSAxMDI0OworICAgIFZrQnVmZmVyT2JqIHN0b3JhZ2VfYnVmZmVyOworICAgIHN0b3JhZ2VfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBzdG9yYWdlX2J1ZmZlcl9zaXplLCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQsIHtyYXlfdHJhY2luZ19xdWV1ZV9mYW1pbHlfaW5kZXh9KTsKKworICAgIFZrRGV2aWNlU2l6ZSBzaGFkZXJfYmluZGluZ190YWJsZV9idWZmZXJfc2l6ZSA9IHJheV90cmFjaW5nX3Byb3BlcnRpZXMuc2hhZGVyR3JvdXBIYW5kbGVTaXplICogNHVsbDsKKyAgICBWa0J1ZmZlck9iaiBzaGFkZXJfYmluZGluZ190YWJsZV9idWZmZXI7CisgICAgc2hhZGVyX2JpbmRpbmdfdGFibGVfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBzaGFkZXJfYmluZGluZ190YWJsZV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WLCB7cmF5X3RyYWNpbmdfcXVldWVfZmFtaWx5X2luZGV4fSk7CisKKyAgICAvLyBTZXR1cCBkZXNjcmlwdG9ycyEKKyAgICBjb25zdCBWa1NoYWRlclN0YWdlRmxhZ3Mga0FsbFJheVRyYWNpbmdTdGFnZXMgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OViB8IFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OViB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0hBREVSX1NUQUdFX0NMT1NFU1RfSElUX0JJVF9OViB8IFZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OViB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0hBREVSX1NUQUdFX0lOVEVSU0VDVElPTl9CSVRfTlYgfCBWS19TSEFERVJfU1RBR0VfQ0FMTEFCTEVfQklUX05WOworCisgICAgdm9pZCAqbGF5b3V0X3BuZXh0ID0gbnVsbHB0cjsKKyAgICB2b2lkICphbGxvY2F0ZV9wbmV4dCA9IG51bGxwdHI7CisgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUZsYWdzIHBvb2xfY3JlYXRlX2ZsYWdzID0gMDsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFncyBsYXlvdXRfY3JlYXRlX2ZsYWdzID0gMDsKKyAgICBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQgZHNfYmluZGluZ19mbGFnc1szXSA9IHt9OworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQgbGF5b3V0X2NyZWF0ZWluZm9fYmluZGluZ19mbGFnc1sxXSA9IHt9OworICAgIGlmIChkZXNjcmlwdG9yX2luZGV4aW5nKSB7CisgICAgICAgIGRzX2JpbmRpbmdfZmxhZ3NbMF0gPSAwOworICAgICAgICBkc19iaW5kaW5nX2ZsYWdzWzFdID0gMDsKKyAgICAgICAgZHNfYmluZGluZ19mbGFnc1syXSA9IFZLX0RFU0NSSVBUT1JfQklORElOR19QQVJUSUFMTFlfQk9VTkRfQklUX0VYVCB8IFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUOworCisgICAgICAgIGxheW91dF9jcmVhdGVpbmZvX2JpbmRpbmdfZmxhZ3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQklORElOR19GTEFHU19DUkVBVEVfSU5GT19FWFQ7CisgICAgICAgIGxheW91dF9jcmVhdGVpbmZvX2JpbmRpbmdfZmxhZ3NbMF0ucE5leHQgPSBOVUxMOworICAgICAgICBsYXlvdXRfY3JlYXRlaW5mb19iaW5kaW5nX2ZsYWdzWzBdLmJpbmRpbmdDb3VudCA9IDM7CisgICAgICAgIGxheW91dF9jcmVhdGVpbmZvX2JpbmRpbmdfZmxhZ3NbMF0ucEJpbmRpbmdGbGFncyA9IGRzX2JpbmRpbmdfZmxhZ3M7CisgICAgICAgIGxheW91dF9jcmVhdGVfZmxhZ3MgPSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDsKKyAgICAgICAgcG9vbF9jcmVhdGVfZmxhZ3MgPSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX1BPT0xfQklUX0VYVDsKKyAgICAgICAgbGF5b3V0X3BuZXh0ID0gbGF5b3V0X2NyZWF0ZWluZm9fYmluZGluZ19mbGFnczsKKyAgICB9CisKKyAgICAvLyBQcmVwYXJlIGRlc2NyaXB0b3JzCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkcyhtX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlYsIDEsIGtBbGxSYXlUcmFjaW5nU3RhZ2VzLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBrQWxsUmF5VHJhY2luZ1N0YWdlcywgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCA2LCBrQWxsUmF5VHJhY2luZ1N0YWdlcywgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X2NyZWF0ZV9mbGFncywgbGF5b3V0X3BuZXh0LCBwb29sX2NyZWF0ZV9mbGFncyk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRWYXJpYWJsZURlc2NyaXB0b3JDb3VudEFsbG9jYXRlSW5mb0VYVCB2YXJpYWJsZV9jb3VudCA9IHt9OworICAgIHVpbnQzMl90IGRlc2NfY291bnRzOworICAgIGlmIChkZXNjcmlwdG9yX2luZGV4aW5nKSB7CisgICAgICAgIGxheW91dF9jcmVhdGVfZmxhZ3MgPSAwOworICAgICAgICBwb29sX2NyZWF0ZV9mbGFncyA9IDA7CisgICAgICAgIGRzX2JpbmRpbmdfZmxhZ3NbMl0gPQorICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1BBUlRJQUxMWV9CT1VORF9CSVRfRVhUIHwgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1ZBUklBQkxFX0RFU0NSSVBUT1JfQ09VTlRfQklUX0VYVDsKKyAgICAgICAgZGVzY19jb3VudHMgPSA2OyAgLy8gV2UnbGwgcmVzZXJ2ZSA4IHNwYWNlcyBpbiB0aGUgbGF5b3V0LCBidXQgdGhlIGRlc2NyaXB0b3Igd2lsbCBvbmx5IHVzZSA2CisgICAgICAgIHZhcmlhYmxlX2NvdW50LnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9BTExPQ0FURV9JTkZPX0VYVDsKKyAgICAgICAgdmFyaWFibGVfY291bnQuZGVzY3JpcHRvclNldENvdW50ID0gMTsKKyAgICAgICAgdmFyaWFibGVfY291bnQucERlc2NyaXB0b3JDb3VudHMgPSAmZGVzY19jb3VudHM7CisgICAgICAgIGFsbG9jYXRlX3BuZXh0ID0gJnZhcmlhYmxlX2NvdW50OworICAgIH0KKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZHNfdmFyaWFibGUobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX05WLCAxLCBrQWxsUmF5VHJhY2luZ1N0YWdlcywgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgMSwga0FsbFJheVRyYWNpbmdTdGFnZXMsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgOCwga0FsbFJheVRyYWNpbmdTdGFnZXMsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dF9jcmVhdGVfZmxhZ3MsIGxheW91dF9wbmV4dCwgcG9vbF9jcmVhdGVfZmxhZ3MsIGFsbG9jYXRlX3BuZXh0KTsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgdG9wX2xldmVsX2FzX2hhbmRsZSA9IHRvcF9sZXZlbF9hcy5oYW5kbGUoKTsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHdyaXRlX2Rlc2NyaXB0X3NldF9hcyA9IHt9OworICAgIHdyaXRlX2Rlc2NyaXB0X3NldF9hcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTlY7CisgICAgd3JpdGVfZGVzY3JpcHRfc2V0X2FzLmFjY2VsZXJhdGlvblN0cnVjdHVyZUNvdW50ID0gMTsKKyAgICB3cml0ZV9kZXNjcmlwdF9zZXRfYXMucEFjY2VsZXJhdGlvblN0cnVjdHVyZXMgPSAmdG9wX2xldmVsX2FzX2hhbmRsZTsKKworICAgIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gZGVzY3JpcHRvcl9idWZmZXJfaW5mbyA9IHt9OworICAgIGRlc2NyaXB0b3JfYnVmZmVyX2luZm8uYnVmZmVyID0gc3RvcmFnZV9idWZmZXIuaGFuZGxlKCk7CisgICAgZGVzY3JpcHRvcl9idWZmZXJfaW5mby5vZmZzZXQgPSAwOworICAgIGRlc2NyaXB0b3JfYnVmZmVyX2luZm8ucmFuZ2UgPSBzdG9yYWdlX2J1ZmZlcl9zaXplOworCisgICAgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvIGRlc2NyaXB0b3JfaW1hZ2VfaW5mb3NbNl0gPSB7fTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBkZXNjcmlwdG9yX2ltYWdlX2luZm9zW2ldID0gdGV4dHVyZS5EZXNjcmlwdG9ySW1hZ2VJbmZvKCk7CisgICAgICAgIGRlc2NyaXB0b3JfaW1hZ2VfaW5mb3NbaV0uc2FtcGxlciA9IHNhbXBsZXIuaGFuZGxlKCk7CisgICAgICAgIGRlc2NyaXB0b3JfaW1hZ2VfaW5mb3NbaV0uaW1hZ2VMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMOworICAgIH0KKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGVzWzNdID0ge307CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5kc3RTZXQgPSBkcy5zZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0uZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9OVjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5wTmV4dCA9ICZ3cml0ZV9kZXNjcmlwdF9zZXRfYXM7CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1sxXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLmRzdFNldCA9IGRzLnNldF87CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZHN0QmluZGluZyA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1sxXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1sxXS5wQnVmZmVySW5mbyA9ICZkZXNjcmlwdG9yX2J1ZmZlcl9pbmZvOworCisgICAgZGVzY3JpcHRvcl93cml0ZXNbMl0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1syXS5kc3RTZXQgPSBkcy5zZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzJdLmRzdEJpbmRpbmcgPSAyOworICAgIGlmIChkZXNjcmlwdG9yX2luZGV4aW5nKSB7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzJdLmRlc2NyaXB0b3JDb3VudCA9IDU7ICAvLyBJbnRlbnRpb25hbGx5IGRvbid0IHdyaXRlIGluZGV4IDUKKyAgICB9IGVsc2UgeworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlc1syXS5kZXNjcmlwdG9yQ291bnQgPSA2OworICAgIH0KKyAgICBkZXNjcmlwdG9yX3dyaXRlc1syXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzJdLnBJbWFnZUluZm8gPSBkZXNjcmlwdG9yX2ltYWdlX2luZm9zOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDMsIGRlc2NyaXB0b3Jfd3JpdGVzLCAwLCBOVUxMKTsKKyAgICBpZiAoZGVzY3JpcHRvcl9pbmRleGluZykgeworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5kc3RTZXQgPSBkc192YXJpYWJsZS5zZXRfOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlc1sxXS5kc3RTZXQgPSBkc192YXJpYWJsZS5zZXRfOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlc1syXS5kc3RTZXQgPSBkc192YXJpYWJsZS5zZXRfOworICAgICAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAzLCBkZXNjcmlwdG9yX3dyaXRlcywgMCwgTlVMTCk7CisgICAgfQorCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQobV9kZXZpY2UsIHsmZHMubGF5b3V0X30pOworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0X3ZhcmlhYmxlKG1fZGV2aWNlLCB7JmRzX3ZhcmlhYmxlLmxheW91dF99KTsKKworICAgIGNvbnN0IGF1dG8gU2V0SW1hZ2VzQXJyYXlMZW5ndGggPSBbXShjb25zdCBzdGQ6OnN0cmluZyAmc2hhZGVyX3RlbXBsYXRlLCBjb25zdCBzdGQ6OnN0cmluZyAmbGVuZ3RoX3N0cikgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB0b19yZXBsYWNlID0gIklNQUdFU19BUlJBWV9MRU5HVEgiOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHNoYWRlcl90ZW1wbGF0ZTsKKyAgICAgICAgYXV0byBwb3NpdGlvbiA9IHJlc3VsdC5maW5kKHRvX3JlcGxhY2UpOworICAgICAgICBhc3NlcnQocG9zaXRpb24gIT0gc3RkOjpzdHJpbmc6Om5wb3MpOworICAgICAgICByZXN1bHQucmVwbGFjZShwb3NpdGlvbiwgdG9fcmVwbGFjZS5sZW5ndGgoKSwgbGVuZ3RoX3N0cik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJnZW5fc291cmNlX3RlbXBsYXRlID0gUiIoI3ZlcnNpb24gNDYwCisgICAgICAgICNleHRlbnNpb24gR0xfRVhUX25vbnVuaWZvcm1fcXVhbGlmaWVyIDogcmVxdWlyZQorICAgICAgICAjZXh0ZW5zaW9uIEdMX0VYVF9zYW1wbGVybGVzc190ZXh0dXJlX2Z1bmN0aW9ucyA6IHJlcXVpcmUKKyAgICAgICAgI2V4dGVuc2lvbiBHTF9OVl9yYXlfdHJhY2luZyA6IHJlcXVpcmUKKworICAgICAgICBsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDApIHVuaWZvcm0gYWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgdG9wTGV2ZWxBUzsKKyAgICAgICAgbGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxLCBzdGQ0MzApIGJ1ZmZlciBSYXlUcmFjaW5nU2JvIHsKKwkgICAgICAgIHVpbnQgcmdlbl9pbmRleDsKKwkgICAgICAgIHVpbnQgYWhpdF9pbmRleDsKKwkgICAgICAgIHVpbnQgY2hpdF9pbmRleDsKKwkgICAgICAgIHVpbnQgbWlzc19pbmRleDsKKwkgICAgICAgIHVpbnQgaW50cl9pbmRleDsKKwkgICAgICAgIHVpbnQgY2FsbF9pbmRleDsKKworCSAgICAgICAgdWludCByZ2VuX3JhbjsKKwkgICAgICAgIHVpbnQgYWhpdF9yYW47CisJICAgICAgICB1aW50IGNoaXRfcmFuOworCSAgICAgICAgdWludCBtaXNzX3JhbjsKKwkgICAgICAgIHVpbnQgaW50cl9yYW47CisJICAgICAgICB1aW50IGNhbGxfcmFuOworCisJICAgICAgICBmbG9hdCByZXN1bHQxOworCSAgICAgICAgZmxvYXQgcmVzdWx0MjsKKwkgICAgICAgIGZsb2F0IHJlc3VsdDM7CisgICAgICAgIH0gc2JvOworICAgICAgICBsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDIpIHVuaWZvcm0gdGV4dHVyZTJEIHRleHR1cmVzW0lNQUdFU19BUlJBWV9MRU5HVEhdOworCisgICAgICAgIGxheW91dChsb2NhdGlvbiA9IDApIHJheVBheWxvYWROViB2ZWMzIHBheWxvYWQ7CisgICAgICAgIGxheW91dChsb2NhdGlvbiA9IDMpIGNhbGxhYmxlRGF0YU5WIHZlYzMgY2FsbGFibGVEYXRhOworCisgICAgICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgICAgIHNiby5yZ2VuX3JhbiA9IDE7CisKKwkgICAgICAgIGV4ZWN1dGVDYWxsYWJsZU5WKDAsIDMpOworCSAgICAgICAgc2JvLnJlc3VsdDEgPSBjYWxsYWJsZURhdGEueDsKKworCSAgICAgICAgdmVjMyBvcmlnaW4gPSB2ZWMzKDAuMGYsIDAuMGYsIC0yLjBmKTsKKwkgICAgICAgIHZlYzMgZGlyZWN0aW9uID0gdmVjMygwLjBmLCAwLjBmLCAxLjBmKTsKKworCSAgICAgICAgdHJhY2VOVih0b3BMZXZlbEFTLCBnbF9SYXlGbGFnc05vbmVOViwgMHhGRiwgMCwgMSwgMCwgb3JpZ2luLCAwLjAwMSwgZGlyZWN0aW9uLCAxMDAwMC4wLCAwKTsKKwkgICAgICAgIHNiby5yZXN1bHQyID0gcGF5bG9hZC54OworCisJICAgICAgICB0cmFjZU5WKHRvcExldmVsQVMsIGdsX1JheUZsYWdzTm9uZU5WLCAweEZGLCAwLCAxLCAwLCBvcmlnaW4sIDAuMDAxLCAtZGlyZWN0aW9uLCAxMDAwMC4wLCAwKTsKKwkgICAgICAgIHNiby5yZXN1bHQzID0gcGF5bG9hZC54OworCisgICAgICAgICAgICBpZiAoc2JvLnJnZW5faW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gT09CIGhlcmU6CisgICAgICAgICAgICAgICAgc2JvLnJlc3VsdDMgPSB0ZXhlbEZldGNoKHRleHR1cmVzW3Niby5yZ2VuX2luZGV4XSwgaXZlYzIoMCwgMCksIDApLng7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKSI7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyByZ2VuX3NvdXJjZSA9IFNldEltYWdlc0FycmF5TGVuZ3RoKHJnZW5fc291cmNlX3RlbXBsYXRlLCAiNiIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJnZW5fc291cmNlX3J1bnRpbWUgPSBTZXRJbWFnZXNBcnJheUxlbmd0aChyZ2VuX3NvdXJjZV90ZW1wbGF0ZSwgIiIpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgYWhpdF9zb3VyY2VfdGVtcGxhdGUgPSBSIigjdmVyc2lvbiA0NjAKKyAgICAgICAgI2V4dGVuc2lvbiBHTF9FWFRfbm9udW5pZm9ybV9xdWFsaWZpZXIgOiByZXF1aXJlCisgICAgICAgICNleHRlbnNpb24gR0xfRVhUX3NhbXBsZXJsZXNzX3RleHR1cmVfZnVuY3Rpb25zIDogcmVxdWlyZQorICAgICAgICAjZXh0ZW5zaW9uIEdMX05WX3JheV90cmFjaW5nIDogcmVxdWlyZQorCisgICAgICAgIGxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMSwgc3RkNDMwKSBidWZmZXIgU3RvcmFnZUJ1ZmZlciB7CisJICAgICAgICB1aW50IHJnZW5faW5kZXg7CisJICAgICAgICB1aW50IGFoaXRfaW5kZXg7CisJICAgICAgICB1aW50IGNoaXRfaW5kZXg7CisJICAgICAgICB1aW50IG1pc3NfaW5kZXg7CisJICAgICAgICB1aW50IGludHJfaW5kZXg7CisJICAgICAgICB1aW50IGNhbGxfaW5kZXg7CisKKwkgICAgICAgIHVpbnQgcmdlbl9yYW47CisJICAgICAgICB1aW50IGFoaXRfcmFuOworCSAgICAgICAgdWludCBjaGl0X3JhbjsKKwkgICAgICAgIHVpbnQgbWlzc19yYW47CisJICAgICAgICB1aW50IGludHJfcmFuOworCSAgICAgICAgdWludCBjYWxsX3JhbjsKKworCSAgICAgICAgZmxvYXQgcmVzdWx0MTsKKwkgICAgICAgIGZsb2F0IHJlc3VsdDI7CisJICAgICAgICBmbG9hdCByZXN1bHQzOworICAgICAgICB9IHNibzsKKyAgICAgICAgbGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAyKSB1bmlmb3JtIHRleHR1cmUyRCB0ZXh0dXJlc1tJTUFHRVNfQVJSQVlfTEVOR1RIXTsKKworICAgICAgICBoaXRBdHRyaWJ1dGVOViB2ZWMzIGhpdFZhbHVlOworCisgICAgICAgIGxheW91dChsb2NhdGlvbiA9IDApIHJheVBheWxvYWRJbk5WIHZlYzMgcGF5bG9hZDsKKworICAgICAgICB2b2lkIG1haW4oKSB7CisJICAgICAgICBzYm8uYWhpdF9yYW4gPSAyOworCisJICAgICAgICBwYXlsb2FkID0gdmVjMygwLjEyMzRmKTsKKworICAgICAgICAgICAgaWYgKHNiby5haGl0X2luZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIE9PQiBoZXJlOgorICAgICAgICAgICAgICAgIHBheWxvYWQueCA9IHRleGVsRmV0Y2godGV4dHVyZXNbc2JvLmFoaXRfaW5kZXhdLCBpdmVjMigwLCAwKSwgMCkueDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICkiOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFoaXRfc291cmNlID0gU2V0SW1hZ2VzQXJyYXlMZW5ndGgoYWhpdF9zb3VyY2VfdGVtcGxhdGUsICI2Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgYWhpdF9zb3VyY2VfcnVudGltZSA9IFNldEltYWdlc0FycmF5TGVuZ3RoKGFoaXRfc291cmNlX3RlbXBsYXRlLCAiIik7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBjaGl0X3NvdXJjZV90ZW1wbGF0ZSA9IFIiKCN2ZXJzaW9uIDQ2MAorICAgICAgICAjZXh0ZW5zaW9uIEdMX0VYVF9ub251bmlmb3JtX3F1YWxpZmllciA6IHJlcXVpcmUKKyAgICAgICAgI2V4dGVuc2lvbiBHTF9FWFRfc2FtcGxlcmxlc3NfdGV4dHVyZV9mdW5jdGlvbnMgOiByZXF1aXJlCisgICAgICAgICNleHRlbnNpb24gR0xfTlZfcmF5X3RyYWNpbmcgOiByZXF1aXJlCisKKyAgICAgICAgbGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxLCBzdGQ0MzApIGJ1ZmZlciBSYXlUcmFjaW5nU2JvIHsKKwkgICAgICAgIHVpbnQgcmdlbl9pbmRleDsKKwkgICAgICAgIHVpbnQgYWhpdF9pbmRleDsKKwkgICAgICAgIHVpbnQgY2hpdF9pbmRleDsKKwkgICAgICAgIHVpbnQgbWlzc19pbmRleDsKKwkgICAgICAgIHVpbnQgaW50cl9pbmRleDsKKwkgICAgICAgIHVpbnQgY2FsbF9pbmRleDsKKworCSAgICAgICAgdWludCByZ2VuX3JhbjsKKwkgICAgICAgIHVpbnQgYWhpdF9yYW47CisJICAgICAgICB1aW50IGNoaXRfcmFuOworCSAgICAgICAgdWludCBtaXNzX3JhbjsKKwkgICAgICAgIHVpbnQgaW50cl9yYW47CisJICAgICAgICB1aW50IGNhbGxfcmFuOworCisJICAgICAgICBmbG9hdCByZXN1bHQxOworCSAgICAgICAgZmxvYXQgcmVzdWx0MjsKKwkgICAgICAgIGZsb2F0IHJlc3VsdDM7CisgICAgICAgIH0gc2JvOworICAgICAgICBsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDIpIHVuaWZvcm0gdGV4dHVyZTJEIHRleHR1cmVzW0lNQUdFU19BUlJBWV9MRU5HVEhdOworCisgICAgICAgIGxheW91dChsb2NhdGlvbiA9IDApIHJheVBheWxvYWRJbk5WIHZlYzMgcGF5bG9hZDsKKworICAgICAgICBoaXRBdHRyaWJ1dGVOViB2ZWMzIGF0dHJpYnM7CisKKyAgICAgICAgdm9pZCBtYWluKCkgeworICAgICAgICAgICAgc2JvLmNoaXRfcmFuID0gMzsKKworICAgICAgICAgICAgcGF5bG9hZCA9IGF0dHJpYnM7CisgICAgICAgICAgICBpZiAoc2JvLmNoaXRfaW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gT09CIGhlcmU6CisgICAgICAgICAgICAgICAgcGF5bG9hZC54ID0gdGV4ZWxGZXRjaCh0ZXh0dXJlc1tzYm8uY2hpdF9pbmRleF0sIGl2ZWMyKDAsIDApLCAwKS54OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICkiOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNoaXRfc291cmNlID0gU2V0SW1hZ2VzQXJyYXlMZW5ndGgoY2hpdF9zb3VyY2VfdGVtcGxhdGUsICI2Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2hpdF9zb3VyY2VfcnVudGltZSA9IFNldEltYWdlc0FycmF5TGVuZ3RoKGNoaXRfc291cmNlX3RlbXBsYXRlLCAiIik7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtaXNzX3NvdXJjZV90ZW1wbGF0ZSA9IFIiKCN2ZXJzaW9uIDQ2MAorICAgICAgICAjZXh0ZW5zaW9uIEdMX0VYVF9ub251bmlmb3JtX3F1YWxpZmllciA6IGVuYWJsZQorICAgICAgICAjZXh0ZW5zaW9uIEdMX0VYVF9zYW1wbGVybGVzc190ZXh0dXJlX2Z1bmN0aW9ucyA6IHJlcXVpcmUKKyAgICAgICAgI2V4dGVuc2lvbiBHTF9OVl9yYXlfdHJhY2luZyA6IHJlcXVpcmUKKworICAgICAgICBsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDEsIHN0ZDQzMCkgYnVmZmVyIFJheVRyYWNpbmdTYm8geworCSAgICAgICAgdWludCByZ2VuX2luZGV4OworCSAgICAgICAgdWludCBhaGl0X2luZGV4OworCSAgICAgICAgdWludCBjaGl0X2luZGV4OworCSAgICAgICAgdWludCBtaXNzX2luZGV4OworCSAgICAgICAgdWludCBpbnRyX2luZGV4OworCSAgICAgICAgdWludCBjYWxsX2luZGV4OworCisJICAgICAgICB1aW50IHJnZW5fcmFuOworCSAgICAgICAgdWludCBhaGl0X3JhbjsKKwkgICAgICAgIHVpbnQgY2hpdF9yYW47CisJICAgICAgICB1aW50IG1pc3NfcmFuOworCSAgICAgICAgdWludCBpbnRyX3JhbjsKKwkgICAgICAgIHVpbnQgY2FsbF9yYW47CisKKwkgICAgICAgIGZsb2F0IHJlc3VsdDE7CisJICAgICAgICBmbG9hdCByZXN1bHQyOworCSAgICAgICAgZmxvYXQgcmVzdWx0MzsKKyAgICAgICAgfSBzYm87CisgICAgICAgIGxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMikgdW5pZm9ybSB0ZXh0dXJlMkQgdGV4dHVyZXNbSU1BR0VTX0FSUkFZX0xFTkdUSF07CisKKyAgICAgICAgbGF5b3V0KGxvY2F0aW9uID0gMCkgcmF5UGF5bG9hZEluTlYgdmVjMyBwYXlsb2FkOworCisgICAgICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgICAgIHNiby5taXNzX3JhbiA9IDQ7CisKKyAgICAgICAgICAgIHBheWxvYWQgPSB2ZWMzKDEuMCwgMC4wLCAwLjApOworCisgICAgICAgICAgICBpZiAoc2JvLm1pc3NfaW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gT09CIGhlcmU6CisgICAgICAgICAgICAgICAgcGF5bG9hZC54ID0gdGV4ZWxGZXRjaCh0ZXh0dXJlc1tzYm8ubWlzc19pbmRleF0sIGl2ZWMyKDAsIDApLCAwKS54OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgKSI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbWlzc19zb3VyY2UgPSBTZXRJbWFnZXNBcnJheUxlbmd0aChtaXNzX3NvdXJjZV90ZW1wbGF0ZSwgIjYiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtaXNzX3NvdXJjZV9ydW50aW1lID0gU2V0SW1hZ2VzQXJyYXlMZW5ndGgobWlzc19zb3VyY2VfdGVtcGxhdGUsICIiKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGludHJfc291cmNlX3RlbXBsYXRlID0gUiIoI3ZlcnNpb24gNDYwCisgICAgICAgICNleHRlbnNpb24gR0xfRVhUX25vbnVuaWZvcm1fcXVhbGlmaWVyIDogcmVxdWlyZQorICAgICAgICAjZXh0ZW5zaW9uIEdMX0VYVF9zYW1wbGVybGVzc190ZXh0dXJlX2Z1bmN0aW9ucyA6IHJlcXVpcmUKKyAgICAgICAgI2V4dGVuc2lvbiBHTF9OVl9yYXlfdHJhY2luZyA6IHJlcXVpcmUKKworICAgICAgICBsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDEsIHN0ZDQzMCkgYnVmZmVyIFN0b3JhZ2VCdWZmZXIgeworCSAgICAgICAgdWludCByZ2VuX2luZGV4OworCSAgICAgICAgdWludCBhaGl0X2luZGV4OworCSAgICAgICAgdWludCBjaGl0X2luZGV4OworCSAgICAgICAgdWludCBtaXNzX2luZGV4OworCSAgICAgICAgdWludCBpbnRyX2luZGV4OworCSAgICAgICAgdWludCBjYWxsX2luZGV4OworCisJICAgICAgICB1aW50IHJnZW5fcmFuOworCSAgICAgICAgdWludCBhaGl0X3JhbjsKKwkgICAgICAgIHVpbnQgY2hpdF9yYW47CisJICAgICAgICB1aW50IG1pc3NfcmFuOworCSAgICAgICAgdWludCBpbnRyX3JhbjsKKwkgICAgICAgIHVpbnQgY2FsbF9yYW47CisKKwkgICAgICAgIGZsb2F0IHJlc3VsdDE7CisJICAgICAgICBmbG9hdCByZXN1bHQyOworCSAgICAgICAgZmxvYXQgcmVzdWx0MzsKKyAgICAgICAgfSBzYm87CisgICAgICAgIGxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMikgdW5pZm9ybSB0ZXh0dXJlMkQgdGV4dHVyZXNbSU1BR0VTX0FSUkFZX0xFTkdUSF07CisKKyAgICAgICAgaGl0QXR0cmlidXRlTlYgdmVjMyBoaXRWYWx1ZTsKKworICAgICAgICB2b2lkIG1haW4oKSB7CisJICAgICAgICBzYm8uaW50cl9yYW4gPSA1OworCisJICAgICAgICBoaXRWYWx1ZSA9IHZlYzMoMC4wZiwgMC41ZiwgMC4wZik7CisKKwkgICAgICAgIHJlcG9ydEludGVyc2VjdGlvbk5WKDEuMGYsIDApOworCisgICAgICAgICAgICBpZiAoc2JvLmludHJfaW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gT09CIGhlcmU6CisgICAgICAgICAgICAgICAgaGl0VmFsdWUueCA9IHRleGVsRmV0Y2godGV4dHVyZXNbc2JvLmludHJfaW5kZXhdLCBpdmVjMigwLCAwKSwgMCkueDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICkiOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGludHJfc291cmNlID0gU2V0SW1hZ2VzQXJyYXlMZW5ndGgoaW50cl9zb3VyY2VfdGVtcGxhdGUsICI2Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgaW50cl9zb3VyY2VfcnVudGltZSA9IFNldEltYWdlc0FycmF5TGVuZ3RoKGludHJfc291cmNlX3RlbXBsYXRlLCAiIik7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBjYWxsX3NvdXJjZV90ZW1wbGF0ZSA9IFIiKCN2ZXJzaW9uIDQ2MAorICAgICAgICAjZXh0ZW5zaW9uIEdMX0VYVF9ub251bmlmb3JtX3F1YWxpZmllciA6IHJlcXVpcmUKKyAgICAgICAgI2V4dGVuc2lvbiBHTF9FWFRfc2FtcGxlcmxlc3NfdGV4dHVyZV9mdW5jdGlvbnMgOiByZXF1aXJlCisgICAgICAgICNleHRlbnNpb24gR0xfTlZfcmF5X3RyYWNpbmcgOiByZXF1aXJlCisKKyAgICAgICAgbGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxLCBzdGQ0MzApIGJ1ZmZlciBTdG9yYWdlQnVmZmVyIHsKKwkgICAgICAgIHVpbnQgcmdlbl9pbmRleDsKKwkgICAgICAgIHVpbnQgYWhpdF9pbmRleDsKKwkgICAgICAgIHVpbnQgY2hpdF9pbmRleDsKKwkgICAgICAgIHVpbnQgbWlzc19pbmRleDsKKwkgICAgICAgIHVpbnQgaW50cl9pbmRleDsKKwkgICAgICAgIHVpbnQgY2FsbF9pbmRleDsKKworCSAgICAgICAgdWludCByZ2VuX3JhbjsKKwkgICAgICAgIHVpbnQgYWhpdF9yYW47CisJICAgICAgICB1aW50IGNoaXRfcmFuOworCSAgICAgICAgdWludCBtaXNzX3JhbjsKKwkgICAgICAgIHVpbnQgaW50cl9yYW47CisJICAgICAgICB1aW50IGNhbGxfcmFuOworCisJICAgICAgICBmbG9hdCByZXN1bHQxOworCSAgICAgICAgZmxvYXQgcmVzdWx0MjsKKwkgICAgICAgIGZsb2F0IHJlc3VsdDM7CisgICAgICAgIH0gc2JvOworICAgICAgICBsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDIpIHVuaWZvcm0gdGV4dHVyZTJEIHRleHR1cmVzW0lNQUdFU19BUlJBWV9MRU5HVEhdOworCisgICAgICAgIGxheW91dChsb2NhdGlvbiA9IDMpIGNhbGxhYmxlRGF0YUluTlYgdmVjMyBjYWxsYWJsZURhdGE7CisKKyAgICAgICAgdm9pZCBtYWluKCkgeworCSAgICAgICAgc2JvLmNhbGxfcmFuID0gNjsKKworCSAgICAgICAgY2FsbGFibGVEYXRhID0gdmVjMygwLjEyMzRmKTsKKworICAgICAgICAgICAgaWYgKHNiby5jYWxsX2luZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIE9PQiBoZXJlOgorICAgICAgICAgICAgICAgIGNhbGxhYmxlRGF0YS54ID0gdGV4ZWxGZXRjaCh0ZXh0dXJlc1tzYm8uY2FsbF9pbmRleF0sIGl2ZWMyKDAsIDApLCAwKS54OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgKSI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2FsbF9zb3VyY2UgPSBTZXRJbWFnZXNBcnJheUxlbmd0aChjYWxsX3NvdXJjZV90ZW1wbGF0ZSwgIjYiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBjYWxsX3NvdXJjZV9ydW50aW1lID0gU2V0SW1hZ2VzQXJyYXlMZW5ndGgoY2FsbF9zb3VyY2VfdGVtcGxhdGUsICIiKTsKKworICAgIHN0cnVjdCBUZXN0Q2FzZSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZyZ2VuX3NoYWRlcl9zb3VyY2U7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhaGl0X3NoYWRlcl9zb3VyY2U7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjaGl0X3NoYWRlcl9zb3VyY2U7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZtaXNzX3NoYWRlcl9zb3VyY2U7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpbnRyX3NoYWRlcl9zb3VyY2U7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYWxsX3NoYWRlcl9zb3VyY2U7CisgICAgICAgIGJvb2wgdmFyaWFibGVfbGVuZ3RoOworICAgICAgICB1aW50MzJfdCByZ2VuX2luZGV4OworICAgICAgICB1aW50MzJfdCBhaGl0X2luZGV4OworICAgICAgICB1aW50MzJfdCBjaGl0X2luZGV4OworICAgICAgICB1aW50MzJfdCBtaXNzX2luZGV4OworICAgICAgICB1aW50MzJfdCBpbnRyX2luZGV4OworICAgICAgICB1aW50MzJfdCBjYWxsX2luZGV4OworICAgICAgICBjb25zdCBjaGFyICpleHBlY3RlZF9lcnJvcjsKKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHRlc3RzOworICAgIHRlc3RzLnB1c2hfYmFjayh7cmdlbl9zb3VyY2UsIGFoaXRfc291cmNlLCBjaGl0X3NvdXJjZSwgbWlzc19zb3VyY2UsIGludHJfc291cmNlLCBjYWxsX3NvdXJjZSwgZmFsc2UsIDI1LCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgIkluZGV4IG9mIDI1IHVzZWQgdG8gaW5kZXggZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggNi4ifSk7CisgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZSwgYWhpdF9zb3VyY2UsIGNoaXRfc291cmNlLCBtaXNzX3NvdXJjZSwgaW50cl9zb3VyY2UsIGNhbGxfc291cmNlLCBmYWxzZSwgMCwgMjUsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAiSW5kZXggb2YgMjUgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKyAgICB0ZXN0cy5wdXNoX2JhY2soe3JnZW5fc291cmNlLCBhaGl0X3NvdXJjZSwgY2hpdF9zb3VyY2UsIG1pc3Nfc291cmNlLCBpbnRyX3NvdXJjZSwgY2FsbF9zb3VyY2UsIGZhbHNlLCAwLCAwLCAyNSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICJJbmRleCBvZiAyNSB1c2VkIHRvIGluZGV4IGRlc2NyaXB0b3IgYXJyYXkgb2YgbGVuZ3RoIDYuIn0pOworICAgIHRlc3RzLnB1c2hfYmFjayh7cmdlbl9zb3VyY2UsIGFoaXRfc291cmNlLCBjaGl0X3NvdXJjZSwgbWlzc19zb3VyY2UsIGludHJfc291cmNlLCBjYWxsX3NvdXJjZSwgZmFsc2UsIDAsIDAsIDAsIDI1LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgIkluZGV4IG9mIDI1IHVzZWQgdG8gaW5kZXggZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggNi4ifSk7CisgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZSwgYWhpdF9zb3VyY2UsIGNoaXRfc291cmNlLCBtaXNzX3NvdXJjZSwgaW50cl9zb3VyY2UsIGNhbGxfc291cmNlLCBmYWxzZSwgMCwgMCwgMCwgMCwgMjUsIDAsCisgICAgICAgICAgICAgICAgICAgICAiSW5kZXggb2YgMjUgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKyAgICB0ZXN0cy5wdXNoX2JhY2soe3JnZW5fc291cmNlLCBhaGl0X3NvdXJjZSwgY2hpdF9zb3VyY2UsIG1pc3Nfc291cmNlLCBpbnRyX3NvdXJjZSwgY2FsbF9zb3VyY2UsIGZhbHNlLCAwLCAwLCAwLCAwLCAwLCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICJJbmRleCBvZiAyNSB1c2VkIHRvIGluZGV4IGRlc2NyaXB0b3IgYXJyYXkgb2YgbGVuZ3RoIDYuIn0pOworCisgICAgaWYgKGRlc2NyaXB0b3JfaW5kZXhpbmcpIHsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDI1LCAwLCAwLCAwLCAwLCAwLCAiSW5kZXggb2YgMjUgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDAsIDI1LCAwLCAwLCAwLCAwLCAiSW5kZXggb2YgMjUgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDAsIDAsIDI1LCAwLCAwLCAwLCAiSW5kZXggb2YgMjUgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDAsIDAsIDAsIDI1LCAwLCAwLCAiSW5kZXggb2YgMjUgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDAsIDAsIDAsIDAsIDI1LCAwLCAiSW5kZXggb2YgMjUgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDAsIDAsIDAsIDAsIDAsIDI1LCAiSW5kZXggb2YgMjUgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKworICAgICAgICAvLyBGb3IgdGhpcyBncm91cCwgNiBpcyBsZXNzIHRoYW4gbWF4IHNwZWNpZmllZCAobWF4IHNwZWNpZmllZCBpcyA4KSBidXQgbW9yZSB0aGFuIGFjdHVhbCBzcGVjaWZpZWQgKGFjdHVhbCBzcGVjaWZpZWQgaXMgNSkKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDYsIDAsIDAsIDAsIDAsIDAsICJJbmRleCBvZiA2IHVzZWQgdG8gaW5kZXggZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggNi4ifSk7CisgICAgICAgIHRlc3RzLnB1c2hfYmFjayh7cmdlbl9zb3VyY2VfcnVudGltZSwgYWhpdF9zb3VyY2VfcnVudGltZSwgY2hpdF9zb3VyY2VfcnVudGltZSwgbWlzc19zb3VyY2VfcnVudGltZSwgaW50cl9zb3VyY2VfcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3NvdXJjZV9ydW50aW1lLCB0cnVlLCAwLCA2LCAwLCAwLCAwLCAwLCAiSW5kZXggb2YgNiB1c2VkIHRvIGluZGV4IGRlc2NyaXB0b3IgYXJyYXkgb2YgbGVuZ3RoIDYuIn0pOworICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe3JnZW5fc291cmNlX3J1bnRpbWUsIGFoaXRfc291cmNlX3J1bnRpbWUsIGNoaXRfc291cmNlX3J1bnRpbWUsIG1pc3Nfc291cmNlX3J1bnRpbWUsIGludHJfc291cmNlX3J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9zb3VyY2VfcnVudGltZSwgdHJ1ZSwgMCwgMCwgNiwgMCwgMCwgMCwgIkluZGV4IG9mIDYgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDAsIDAsIDAsIDYsIDAsIDAsICJJbmRleCBvZiA2IHVzZWQgdG8gaW5kZXggZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggNi4ifSk7CisgICAgICAgIHRlc3RzLnB1c2hfYmFjayh7cmdlbl9zb3VyY2VfcnVudGltZSwgYWhpdF9zb3VyY2VfcnVudGltZSwgY2hpdF9zb3VyY2VfcnVudGltZSwgbWlzc19zb3VyY2VfcnVudGltZSwgaW50cl9zb3VyY2VfcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3NvdXJjZV9ydW50aW1lLCB0cnVlLCAwLCAwLCAwLCAwLCA2LCAwLCAiSW5kZXggb2YgNiB1c2VkIHRvIGluZGV4IGRlc2NyaXB0b3IgYXJyYXkgb2YgbGVuZ3RoIDYuIn0pOworICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe3JnZW5fc291cmNlX3J1bnRpbWUsIGFoaXRfc291cmNlX3J1bnRpbWUsIGNoaXRfc291cmNlX3J1bnRpbWUsIG1pc3Nfc291cmNlX3J1bnRpbWUsIGludHJfc291cmNlX3J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9zb3VyY2VfcnVudGltZSwgdHJ1ZSwgMCwgMCwgMCwgMCwgMCwgNiwgIkluZGV4IG9mIDYgdXNlZCB0byBpbmRleCBkZXNjcmlwdG9yIGFycmF5IG9mIGxlbmd0aCA2LiJ9KTsKKworICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe3JnZW5fc291cmNlX3J1bnRpbWUsIGFoaXRfc291cmNlX3J1bnRpbWUsIGNoaXRfc291cmNlX3J1bnRpbWUsIG1pc3Nfc291cmNlX3J1bnRpbWUsIGludHJfc291cmNlX3J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9zb3VyY2VfcnVudGltZSwgdHJ1ZSwgNSwgMCwgMCwgMCwgMCwgMCwgIkRlc2NyaXB0b3IgaW5kZXggNSBpcyB1bmluaXRpYWxpemVkLiJ9KTsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDAsIDUsIDAsIDAsIDAsIDAsICJEZXNjcmlwdG9yIGluZGV4IDUgaXMgdW5pbml0aWFsaXplZC4ifSk7CisgICAgICAgIHRlc3RzLnB1c2hfYmFjayh7cmdlbl9zb3VyY2VfcnVudGltZSwgYWhpdF9zb3VyY2VfcnVudGltZSwgY2hpdF9zb3VyY2VfcnVudGltZSwgbWlzc19zb3VyY2VfcnVudGltZSwgaW50cl9zb3VyY2VfcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3NvdXJjZV9ydW50aW1lLCB0cnVlLCAwLCAwLCA1LCAwLCAwLCAwLCAiRGVzY3JpcHRvciBpbmRleCA1IGlzIHVuaW5pdGlhbGl6ZWQuIn0pOworICAgICAgICB0ZXN0cy5wdXNoX2JhY2soe3JnZW5fc291cmNlX3J1bnRpbWUsIGFoaXRfc291cmNlX3J1bnRpbWUsIGNoaXRfc291cmNlX3J1bnRpbWUsIG1pc3Nfc291cmNlX3J1bnRpbWUsIGludHJfc291cmNlX3J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9zb3VyY2VfcnVudGltZSwgdHJ1ZSwgMCwgMCwgMCwgNSwgMCwgMCwgIkRlc2NyaXB0b3IgaW5kZXggNSBpcyB1bmluaXRpYWxpemVkLiJ9KTsKKyAgICAgICAgdGVzdHMucHVzaF9iYWNrKHtyZ2VuX3NvdXJjZV9ydW50aW1lLCBhaGl0X3NvdXJjZV9ydW50aW1lLCBjaGl0X3NvdXJjZV9ydW50aW1lLCBtaXNzX3NvdXJjZV9ydW50aW1lLCBpbnRyX3NvdXJjZV9ydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc291cmNlX3J1bnRpbWUsIHRydWUsIDAsIDAsIDAsIDAsIDUsIDAsICJEZXNjcmlwdG9yIGluZGV4IDUgaXMgdW5pbml0aWFsaXplZC4ifSk7CisgICAgICAgIHRlc3RzLnB1c2hfYmFjayh7cmdlbl9zb3VyY2VfcnVudGltZSwgYWhpdF9zb3VyY2VfcnVudGltZSwgY2hpdF9zb3VyY2VfcnVudGltZSwgbWlzc19zb3VyY2VfcnVudGltZSwgaW50cl9zb3VyY2VfcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3NvdXJjZV9ydW50aW1lLCB0cnVlLCAwLCAwLCAwLCAwLCAwLCA1LCAiRGVzY3JpcHRvciBpbmRleCA1IGlzIHVuaW5pdGlhbGl6ZWQuIn0pOworICAgIH0KKworICAgIFBGTl92a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WPigKKyAgICAgICAgdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5oYW5kbGUoKSwgInZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WIikpOworICAgIEFTU0VSVF9UUlVFKHZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WICE9IG51bGxwdHIpOworCisgICAgUEZOX3ZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIHZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlY+KAorICAgICAgICAgICAgdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5oYW5kbGUoKSwgInZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WIikpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UmF5VHJhY2luZ1NoYWRlckdyb3VwSGFuZGxlc05WICE9IG51bGxwdHIpOworCisgICAgUEZOX3ZrQ21kVHJhY2VSYXlzTlYgdmtDbWRUcmFjZVJheXNOViA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kVHJhY2VSYXlzTlY+KHZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+aGFuZGxlKCksICJ2a0NtZFRyYWNlUmF5c05WIikpOworICAgIEFTU0VSVF9UUlVFKHZrQ21kVHJhY2VSYXlzTlYgIT0gbnVsbHB0cik7CisKKyAgICAvLyBJdGVyYXRpb24gMCB0ZXN0cyB3aXRoIG5vIGRlc2NyaXB0b3Igc2V0IGJvdW5kICh0byBzYW5pdHkgdGVzdCAiZHJhdyIgdmFsaWRhdGlvbikuIEl0ZXJhdGlvbiAxCisgICAgLy8gdGVzdHMgd2hhdCdzIGluIHRoZSB0ZXN0IGNhc2UgdmVjdG9yLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmdGVzdCA6IHRlc3RzKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB0ZXN0LmV4cGVjdGVkX2Vycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmtTaGFkZXJPYmogcmdlbl9zaGFkZXIobV9kZXZpY2UsIHRlc3Qucmdlbl9zaGFkZXJfc291cmNlLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WLCB0aGlzLCAibWFpbiIpOworICAgICAgICAgICAgVmtTaGFkZXJPYmogYWhpdF9zaGFkZXIobV9kZXZpY2UsIHRlc3QuYWhpdF9zaGFkZXJfc291cmNlLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OViwgdGhpcywgIm1haW4iKTsKKyAgICAgICAgICAgIFZrU2hhZGVyT2JqIGNoaXRfc2hhZGVyKG1fZGV2aWNlLCB0ZXN0LmNoaXRfc2hhZGVyX3NvdXJjZS5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WLCB0aGlzLCAibWFpbiIpOworICAgICAgICAgICAgVmtTaGFkZXJPYmogbWlzc19zaGFkZXIobV9kZXZpY2UsIHRlc3QubWlzc19zaGFkZXJfc291cmNlLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OViwgdGhpcywgIm1haW4iKTsKKyAgICAgICAgICAgIFZrU2hhZGVyT2JqIGludHJfc2hhZGVyKG1fZGV2aWNlLCB0ZXN0LmludHJfc2hhZGVyX3NvdXJjZS5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OViwgdGhpcywgIm1haW4iKTsKKyAgICAgICAgICAgIFZrU2hhZGVyT2JqIGNhbGxfc2hhZGVyKG1fZGV2aWNlLCB0ZXN0LmNhbGxfc2hhZGVyX3NvdXJjZS5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfQ0FMTEFCTEVfQklUX05WLCB0aGlzLCAibWFpbiIpOworCisgICAgICAgICAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHN0YWdlX2NyZWF0ZV9pbmZvc1s2XSA9IHt9OworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLnN0YWdlID0gVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlY7CisgICAgICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ubW9kdWxlID0gcmdlbl9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OVjsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5tb2R1bGUgPSBhaGl0X3NoYWRlci5oYW5kbGUoKTsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzJdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzJdLnN0YWdlID0gVktfU0hBREVSX1NUQUdFX0NMT1NFU1RfSElUX0JJVF9OVjsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1syXS5tb2R1bGUgPSBjaGl0X3NoYWRlci5oYW5kbGUoKTsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1syXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzNdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzNdLnN0YWdlID0gVktfU0hBREVSX1NUQUdFX01JU1NfQklUX05WOworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzNdLm1vZHVsZSA9IG1pc3Nfc2hhZGVyLmhhbmRsZSgpOworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzNdLnBOYW1lID0gIm1haW4iOworCisgICAgICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbNF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbNF0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OVjsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1s0XS5tb2R1bGUgPSBpbnRyX3NoYWRlci5oYW5kbGUoKTsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1s0XS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzVdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzVdLnN0YWdlID0gVktfU0hBREVSX1NUQUdFX0NBTExBQkxFX0JJVF9OVjsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1s1XS5tb2R1bGUgPSBjYWxsX3NoYWRlci5oYW5kbGUoKTsKKyAgICAgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1s1XS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICAgICAgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgZ3JvdXBfY3JlYXRlX2luZm9zWzRdID0ge307CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uZ2VuZXJhbFNoYWRlciA9IDA7ICAvLyByZ2VuCisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uY2xvc2VzdEhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5pbnRlcnNlY3Rpb25TaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworCisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uZ2VuZXJhbFNoYWRlciA9IDM7ICAvLyBtaXNzCisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uY2xvc2VzdEhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5pbnRlcnNlY3Rpb25TaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworCisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMl0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMl0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1BST0NFRFVSQUxfSElUX0dST1VQX05WOworICAgICAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzJdLmdlbmVyYWxTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzJdLmNsb3Nlc3RIaXRTaGFkZXIgPSAyOworICAgICAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzJdLmFueUhpdFNoYWRlciA9IDE7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMl0uaW50ZXJzZWN0aW9uU2hhZGVyID0gNDsKKworICAgICAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzNdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzNdLnR5cGUgPSBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WOworICAgICAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzNdLmdlbmVyYWxTaGFkZXIgPSA1OyAgLy8gY2FsbAorICAgICAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzNdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzNdLmFueUhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbM10uaW50ZXJzZWN0aW9uU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKworICAgICAgICAgICAgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgcGlwZWxpbmVfY2kgPSB7fTsKKyAgICAgICAgICAgIHBpcGVsaW5lX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgICAgICBwaXBlbGluZV9jaS5zdGFnZUNvdW50ID0gNjsKKyAgICAgICAgICAgIHBpcGVsaW5lX2NpLnBTdGFnZXMgPSBzdGFnZV9jcmVhdGVfaW5mb3M7CisgICAgICAgICAgICBwaXBlbGluZV9jaS5ncm91cENvdW50ID0gNDsKKyAgICAgICAgICAgIHBpcGVsaW5lX2NpLnBHcm91cHMgPSBncm91cF9jcmVhdGVfaW5mb3M7CisgICAgICAgICAgICBwaXBlbGluZV9jaS5tYXhSZWN1cnNpb25EZXB0aCA9IDI7CisgICAgICAgICAgICBwaXBlbGluZV9jaS5sYXlvdXQgPSB0ZXN0LnZhcmlhYmxlX2xlbmd0aCA/IHBpcGVsaW5lX2xheW91dF92YXJpYWJsZS5oYW5kbGUoKSA6IHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKTsKKworICAgICAgICAgICAgVmtQaXBlbGluZSBwaXBlbGluZSA9IFZLX05VTExfSEFORExFOworICAgICAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoCisgICAgICAgICAgICAgICAgdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYobV9kZXZpY2UtPmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2NpLCBudWxscHRyLCAmcGlwZWxpbmUpKTsKKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hhZGVyX2JpbmRpbmdfdGFibGVfZGF0YTsKKyAgICAgICAgICAgIHNoYWRlcl9iaW5kaW5nX3RhYmxlX2RhdGEucmVzaXplKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzaGFkZXJfYmluZGluZ190YWJsZV9idWZmZXJfc2l6ZSksIDApOworICAgICAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1ModmtHZXRSYXlUcmFjaW5nU2hhZGVyR3JvdXBIYW5kbGVzTlYobV9kZXZpY2UtPmhhbmRsZSgpLCBwaXBlbGluZSwgMCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzaGFkZXJfYmluZGluZ190YWJsZV9idWZmZXJfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJfYmluZGluZ190YWJsZV9kYXRhLmRhdGEoKSkpOworCisgICAgICAgICAgICB1aW50OF90ICptYXBwZWRfc2hhZGVyX2JpbmRpbmdfdGFibGVfZGF0YSA9ICh1aW50OF90ICopc2hhZGVyX2JpbmRpbmdfdGFibGVfYnVmZmVyLm1lbW9yeSgpLm1hcCgpOworICAgICAgICAgICAgc3RkOjptZW1jcHkobWFwcGVkX3NoYWRlcl9iaW5kaW5nX3RhYmxlX2RhdGEsIHNoYWRlcl9iaW5kaW5nX3RhYmxlX2RhdGEuZGF0YSgpLCBzaGFkZXJfYmluZGluZ190YWJsZV9kYXRhLnNpemUoKSk7CisgICAgICAgICAgICBzaGFkZXJfYmluZGluZ190YWJsZV9idWZmZXIubWVtb3J5KCkudW5tYXAoKTsKKworICAgICAgICAgICAgcmF5X3RyYWNpbmdfY29tbWFuZF9idWZmZXIuYmVnaW4oKTsKKworICAgICAgICAgICAgdms6OkNtZEJpbmRQaXBlbGluZShyYXlfdHJhY2luZ19jb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OViwgcGlwZWxpbmUpOworCisgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhyYXlfdHJhY2luZ19jb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9SQVlfVFJBQ0lOR19OViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QudmFyaWFibGVfbGVuZ3RoID8gcGlwZWxpbmVfbGF5b3V0X3ZhcmlhYmxlLmhhbmRsZSgpIDogcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC52YXJpYWJsZV9sZW5ndGggPyAmZHNfdmFyaWFibGUuc2V0XyA6ICZkcy5zZXRfLCAwLCBudWxscHRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFRyYWNlUmF5c05WLU5vbmUtMDI2OTciKTsKKyAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1EZXNjcmlwdG9yU2V0Tm90Qm91bmQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmtDbWRUcmFjZVJheXNOVihyYXlfdHJhY2luZ19jb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgc2hhZGVyX2JpbmRpbmdfdGFibGVfYnVmZmVyLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXlfdHJhY2luZ19wcm9wZXJ0aWVzLnNoYWRlckdyb3VwSGFuZGxlU2l6ZSAqIDB1bGwsIHNoYWRlcl9iaW5kaW5nX3RhYmxlX2J1ZmZlci5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF5X3RyYWNpbmdfcHJvcGVydGllcy5zaGFkZXJHcm91cEhhbmRsZVNpemUgKiAxdWxsLCByYXlfdHJhY2luZ19wcm9wZXJ0aWVzLnNoYWRlckdyb3VwSGFuZGxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyX2JpbmRpbmdfdGFibGVfYnVmZmVyLmhhbmRsZSgpLCByYXlfdHJhY2luZ19wcm9wZXJ0aWVzLnNoYWRlckdyb3VwSGFuZGxlU2l6ZSAqIDJ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheV90cmFjaW5nX3Byb3BlcnRpZXMuc2hhZGVyR3JvdXBIYW5kbGVTaXplLCBzaGFkZXJfYmluZGluZ190YWJsZV9idWZmZXIuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheV90cmFjaW5nX3Byb3BlcnRpZXMuc2hhZGVyR3JvdXBIYW5kbGVTaXplICogM3VsbCwgcmF5X3RyYWNpbmdfcHJvcGVydGllcy5zaGFkZXJHcm91cEhhbmRsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2lkdGg9Ki8xLCAvKmhlaWdodD0qLzEsIC8qZGVwdGg9Ki8xKTsKKworICAgICAgICAgICAgcmF5X3RyYWNpbmdfY29tbWFuZF9idWZmZXIuZW5kKCk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaW5kZXggb2YgdGhlIHRleHR1cmUgdGhhdCB0aGUgc2hhZGVycyBzaG91bGQgcmVhZAorICAgICAgICAgICAgdWludDMyX3QgKm1hcHBlZF9zdG9yYWdlX2J1ZmZlcl9kYXRhID0gKHVpbnQzMl90ICopc3RvcmFnZV9idWZmZXIubWVtb3J5KCkubWFwKCk7CisgICAgICAgICAgICBtYXBwZWRfc3RvcmFnZV9idWZmZXJfZGF0YVswXSA9IHRlc3Qucmdlbl9pbmRleDsKKyAgICAgICAgICAgIG1hcHBlZF9zdG9yYWdlX2J1ZmZlcl9kYXRhWzFdID0gdGVzdC5haGl0X2luZGV4OworICAgICAgICAgICAgbWFwcGVkX3N0b3JhZ2VfYnVmZmVyX2RhdGFbMl0gPSB0ZXN0LmNoaXRfaW5kZXg7CisgICAgICAgICAgICBtYXBwZWRfc3RvcmFnZV9idWZmZXJfZGF0YVszXSA9IHRlc3QubWlzc19pbmRleDsKKyAgICAgICAgICAgIG1hcHBlZF9zdG9yYWdlX2J1ZmZlcl9kYXRhWzRdID0gdGVzdC5pbnRyX2luZGV4OworICAgICAgICAgICAgbWFwcGVkX3N0b3JhZ2VfYnVmZmVyX2RhdGFbNV0gPSB0ZXN0LmNhbGxfaW5kZXg7CisgICAgICAgICAgICBtYXBwZWRfc3RvcmFnZV9idWZmZXJfZGF0YVs2XSA9IDA7CisgICAgICAgICAgICBtYXBwZWRfc3RvcmFnZV9idWZmZXJfZGF0YVs3XSA9IDA7CisgICAgICAgICAgICBtYXBwZWRfc3RvcmFnZV9idWZmZXJfZGF0YVs4XSA9IDA7CisgICAgICAgICAgICBtYXBwZWRfc3RvcmFnZV9idWZmZXJfZGF0YVs5XSA9IDA7CisgICAgICAgICAgICBtYXBwZWRfc3RvcmFnZV9idWZmZXJfZGF0YVsxMF0gPSAwOworICAgICAgICAgICAgbWFwcGVkX3N0b3JhZ2VfYnVmZmVyX2RhdGFbMTFdID0gMDsKKyAgICAgICAgICAgIHN0b3JhZ2VfYnVmZmVyLm1lbW9yeSgpLnVubWFwKCk7CisKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLURlc2NyaXB0b3JTZXROb3RVcGRhdGVkIik7CisgICAgICAgICAgICB2azo6UXVldWVTdWJtaXQocmF5X3RyYWNpbmdfcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgICAgICAgICAgdms6OlF1ZXVlV2FpdElkbGUocmF5X3RyYWNpbmdfcXVldWUpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgICAgIG1hcHBlZF9zdG9yYWdlX2J1ZmZlcl9kYXRhID0gKHVpbnQzMl90ICopc3RvcmFnZV9idWZmZXIubWVtb3J5KCkubWFwKCk7CisgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUobWFwcGVkX3N0b3JhZ2VfYnVmZmVyX2RhdGFbNl0gPT0gMSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUobWFwcGVkX3N0b3JhZ2VfYnVmZmVyX2RhdGFbN10gPT0gMik7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUobWFwcGVkX3N0b3JhZ2VfYnVmZmVyX2RhdGFbOF0gPT0gMyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUobWFwcGVkX3N0b3JhZ2VfYnVmZmVyX2RhdGFbOV0gPT0gNCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUobWFwcGVkX3N0b3JhZ2VfYnVmZmVyX2RhdGFbMTBdID09IDUpOworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG1hcHBlZF9zdG9yYWdlX2J1ZmZlcl9kYXRhWzExXSA9PSA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3JhZ2VfYnVmZmVyLm1lbW9yeSgpLnVubWFwKCk7CisKKyAgICAgICAgICAgIHZrOjpEZXN0cm95UGlwZWxpbmUobV9kZXZpY2UtPmhhbmRsZSgpLCBwaXBlbGluZSwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZERlc2NyaXB0b3JQb29sQ29uc2lzdGVuY3kpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBbGxvY2F0ZSBkZXNjcmlwdG9yIHNldHMgZnJvbSBvbmUgRFMgcG9vbCBhbmQgYXR0ZW1wdCB0byBkZWxldGUgdGhlbSBmcm9tIGFub3RoZXIuIik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy1wYXJlbnQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrRGVzY3JpcHRvclBvb2xTaXplIGRzX3R5cGVfY291bnQgPSB7fTsKKyAgICBkc190eXBlX2NvdW50LnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjsKKyAgICBkc190eXBlX2NvdW50LmRlc2NyaXB0b3JDb3VudCA9IDE7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBkc19wb29sX2NpID0ge307CisgICAgZHNfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBkc19wb29sX2NpLnBOZXh0ID0gTlVMTDsKKyAgICBkc19wb29sX2NpLmZsYWdzID0gMDsKKyAgICBkc19wb29sX2NpLm1heFNldHMgPSAxOworICAgIGRzX3Bvb2xfY2kucG9vbFNpemVDb3VudCA9IDE7CisgICAgZHNfcG9vbF9jaS5wUG9vbFNpemVzID0gJmRzX3R5cGVfY291bnQ7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sIGJhZF9wb29sOworICAgIGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yUG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZkc19wb29sX2NpLCBOVUxMLCAmYmFkX3Bvb2wpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBlcnIgPSB2azo6RnJlZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgYmFkX3Bvb2wsIDEsICZkZXNjcmlwdG9yX3NldC5zZXRfKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yUG9vbChtX2RldmljZS0+ZGV2aWNlKCksIGJhZF9wb29sLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBEcmF3V2l0aFBpcGVsaW5lSW5jb21wYXRpYmxlV2l0aFN1YnBhc3MpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJVc2UgYSBwaXBlbGluZSBmb3IgdGhlIHdyb25nIHN1YnBhc3MgaW4gYSByZW5kZXIgcGFzcyBpbnN0YW5jZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIEEgcmVuZGVycGFzcyB3aXRoIHR3byBzdWJwYXNzZXMsIGJvdGggd3JpdGluZyB0aGUgc2FtZSBhdHRhY2htZW50LgorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaFtdID0geworICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICB9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSByZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCAmcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICAgICAgezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDEsICZyZWYsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgIH07CisgICAgVmtTdWJwYXNzRGVwZW5kZW5jeSBkZXAgPSB7MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVR9OworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMSwgYXR0YWNoLCAyLCBzdWJwYXNzZXMsIDEsICZkZXB9OworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0Tm9MYXlvdXQoMzIsIDMyLCAxLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3ID0gaW1hZ2UudGFyZ2V0VmlldyhWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0pOworCisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmJjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIDEsICZpbWFnZVZpZXcsIDMyLCAzMiwgMX07CisgICAgVmtGcmFtZWJ1ZmZlciBmYjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZmJjaSwgbnVsbHB0ciwgJmZiKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAuMGYsIDAuMGYsIDY0LjBmLCA2NC4wZiwgMC4wZiwgMS4wZn07CisgICAgbV92aWV3cG9ydHMucHVzaF9iYWNrKHZpZXdwb3J0KTsKKyAgICBwaXBlLlNldFZpZXdwb3J0KG1fdmlld3BvcnRzKTsKKyAgICBWa1JlY3QyRCByZWN0ID0ge307CisgICAgbV9zY2lzc29ycy5wdXNoX2JhY2socmVjdCk7CisgICAgcGlwZS5TZXRTY2lzc29yKG1fc2Npc3NvcnMpOworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwbChtX2RldmljZSk7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBsLmhhbmRsZSgpLCBycCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gcnBiaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MzIsIDMyfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyfTsKKworICAgIC8vIHN1YnRlc3QgMTogYmluZCBpbiB0aGUgd3Jvbmcgc3VicGFzcworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKyAgICB2azo6Q21kTmV4dFN1YnBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgImJ1aWx0IGZvciBzdWJwYXNzIDAgYnV0IHVzZWQgaW4gc3VicGFzcyAxIik7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLmhhbmRsZSgpKTsKKyAgICB2azo6Q21kRHJhdyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAzLCAxLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpDbWRFbmRSZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworCisgICAgLy8gc3VidGVzdCAyOiBiaW5kIGluIGNvcnJlY3Qgc3VicGFzcywgdGhlbiB0cmFuc2l0aW9uIHRvIG5leHQgc3VicGFzcworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUuaGFuZGxlKCkpOworICAgIHZrOjpDbWROZXh0U3VicGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiYnVpbHQgZm9yIHN1YnBhc3MgMCBidXQgdXNlZCBpbiBzdWJwYXNzIDEiKTsKKyAgICB2azo6Q21kRHJhdyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAzLCAxLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpDbWRFbmRSZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEltYWdlQmFycmllclN1YnBhc3NDb25mbGljdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNoZWNrIGNhc2Ugd2hlcmUgc3VicGFzcyBpbmRleCByZWZlcmVuY2VzIGRpZmZlcmVudCBpbWFnZSBmcm9tIGltYWdlIGJhcnJpZXIiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gQ3JlYXRlIFJQL0ZCIGNvbWJvIHdoZXJlIHN1YnBhc3MgaGFzIGluY29ycmVjdCBpbmRleCBhdHRhY2htZW50LCB0aGlzIGlzIDJuZCBoYWxmIG9mICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWltYWdlLTAyNjM1IgorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaFtdID0geworICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICAgICAgezAsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfU0FNUExFX0NPVU5UXzFfQklULCBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLCBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELAorICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH0sCisgICAgfTsKKyAgICAvLyByZWYgYXR0YWNobWVudCBwb2ludHMgdG8gd3JvbmcgYXR0YWNobWVudCBpbmRleCBjb21wYXJlZCB0byBpbWdfYmFycmllciBiZWxvdworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSByZWYgPSB7MSwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCAmcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICB9OworICAgIFZrU3VicGFzc0RlcGVuZGVuY3kgZGVwID0gezAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMiwgYXR0YWNoLCAxLCBzdWJwYXNzZXMsIDEsICZkZXB9OworICAgIFZrUmVuZGVyUGFzcyBycDsKKworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIG51bGxwdHIsICZycCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLkluaXROb0xheW91dCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBWa0ltYWdlVmlldyBpbWFnZVZpZXcgPSBpbWFnZS50YXJnZXRWaWV3KFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSk7CisgICAgVmtJbWFnZU9iaiBpbWFnZTIobV9kZXZpY2UpOworICAgIGltYWdlMi5Jbml0Tm9MYXlvdXQoMzIsIDMyLCAxLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3MiA9IGltYWdlMi50YXJnZXRWaWV3KFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSk7CisgICAgLy8gcmUtdXNlIGltYWdlVmlldyBmcm9tIHN0YXJ0IG9mIHRlc3QKKyAgICBWa0ltYWdlVmlldyBpdl9hcnJheVsyXSA9IHtpbWFnZVZpZXcsIGltYWdlVmlldzJ9OworCisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmJjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIDIsIGl2X2FycmF5LCAzMiwgMzIsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZiY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBycGJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMiwgMzJ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHJ9OworCisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIgPSB7fTsKKyAgICBpbWdfYmFycmllci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSOworICAgIGltZ19iYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQ7CisgICAgaW1nX2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVDsKKyAgICBpbWdfYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXIuaW1hZ2UgPSBpbWFnZS5oYW5kbGUoKTsgLyogYmFycmllciByZWZlcmVuY2VzIGltYWdlIGZyb20gYXR0YWNobWVudCBpbmRleCAwICovCisgICAgaW1nX2JhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLWltYWdlLTAyNjM1Iik7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWdfYmFycmllcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZW5kZXJQYXNzQ3JlYXRlQXR0YWNobWVudEluZGV4T3V0T2ZSYW5nZSkgeworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGJvb2wgcnAyU3VwcG9ydGVkID0gQ2hlY2tDcmVhdGVSZW5kZXJQYXNzMlN1cHBvcnQodGhpcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICAvLyBUaGVyZSBhcmUgbm8gYXR0YWNobWVudHMsIGJ1dCByZWZlciB0byBhdHRhY2htZW50IDAuCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIHJlZiA9IHswLCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfTsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzZXNbXSA9IHsKKyAgICAgICAgezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDEsICZyZWYsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgIH07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIDEsIHN1YnBhc3NlcywgMCwgbnVsbHB0cn07CisKKyAgICAvLyAiLi4uIG11c3QgYmUgbGVzcyB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgYXR0YWNobWVudHMgLi4uIgorICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tYXR0YWNobWVudC0wMDgzNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItYXR0YWNobWVudC0wMzA1MSIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVBdHRhY2htZW50UmVhZE9ubHlCdXRDbGVhcmVkKSB7CisgICAgLy8gQ2hlY2sgZm9yIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgYm9vbCBtYWludGVuYW5jZTJTdXBwb3J0ZWQgPSBycDJTdXBwb3J0ZWQ7CisKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX21haW50ZW5hbmNlMgorICAgIGlmICghcnAyU3VwcG9ydGVkICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbWFpbnRlbmFuY2UyU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBpZiAobV9kZXZpY2UtPnByb3BzLmFwaVZlcnNpb24gPCBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgbWFpbnRlbmFuY2UyU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9OworCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGRlcHRoX3N0ZW5jaWxfcmVmID0gezAsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMfTsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7MCwgICAgICBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyLCAmZGVwdGhfc3RlbmNpbF9yZWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMSwgJmRlc2NyaXB0aW9uLCAxLCAmc3VicGFzcywgMCwgbnVsbHB0cn07CisKKyAgICAvLyBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCBidXQgZGVwdGggY2xlYXJlZAorICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODM2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wQXR0YWNobWVudHMtMDI1MjIiKTsKKworICAgIGlmIChtYWludGVuYW5jZTJTdXBwb3J0ZWQpIHsKKyAgICAgICAgLy8gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCBidXQgZGVwdGggY2xlYXJlZAorICAgICAgICBkZXB0aF9zdGVuY2lsX3JlZi5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOworCisgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAxNTY2IiwgbnVsbHB0cik7CisKKyAgICAgICAgLy8gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCBidXQgZGVwdGggY2xlYXJlZAorICAgICAgICBkZXB0aF9zdGVuY2lsX3JlZi5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOworCisgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAxNTY3IiwgbnVsbHB0cik7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVBdHRhY2htZW50TWlzbWF0Y2hpbmdMYXlvdXRzQ29sb3IpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRhY2htZW50IGlzIHVzZWQgc2ltdWx0YW5lb3VzbHkgYXMgdHdvIGNvbG9yIGF0dGFjaG1lbnRzIHdpdGggZGlmZmVyZW50IGxheW91dHMuIik7CisKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNoW10gPSB7CisgICAgICAgIHswLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgIH07CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIHJlZnNbXSA9IHsKKyAgICAgICAgezAsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgICAgICB7MCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9LAorICAgIH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAyLCByZWZzLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICB9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAxLCBhdHRhY2gsIDEsIHN1YnBhc3NlcywgMCwgbnVsbHB0cn07CisKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJwYXNzIDAgYWxyZWFkeSB1c2VzIGF0dGFjaG1lbnQgMCB3aXRoIGEgZGlmZmVyZW50IGltYWdlIGxheW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN1YnBhc3MgMCBhbHJlYWR5IHVzZXMgYXR0YWNobWVudCAwIHdpdGggYSBkaWZmZXJlbnQgaW1hZ2UgbGF5b3V0Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUmVuZGVyUGFzc0NyZWF0ZUF0dGFjaG1lbnREZXNjcmlwdGlvbkludmFsaWRGaW5hbExheW91dCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZrQXR0YWNobWVudERlc2NyaXB0aW9uJ3MgZmluYWxMYXlvdXQgbXVzdCBub3QgYmUgVU5ERUZJTkVEIG9yIFBSRUlOSVRJQUxJWkVEIik7CisKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU0VQQVJBVEVfREVQVEhfU1RFTkNJTF9MQVlPVVRTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIGF1dG8gc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUj4oKTsKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzKTsKKyAgICBpZiAodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUikgeworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHNfZmVhdHVyZXMuc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzID0gVktfRkFMU0U7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUikgPyAmZmVhdHVyZXMyIDogbnVsbHB0cikpOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNoX2Rlc2MgPSB7fTsKKyAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgYXR0YWNoX2Rlc2Muc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2hfZGVzYy5sb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI7CisgICAgYXR0YWNoX2Rlc2Muc3RvcmVPcCA9IFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkU7CisgICAgYXR0YWNoX2Rlc2Muc3RlbmNpbExvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkU7CisgICAgYXR0YWNoX2Rlc2Muc3RlbmNpbFN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRTsKKyAgICBhdHRhY2hfZGVzYy5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGF0dGFjaF9yZWYgPSB7fTsKKyAgICBhdHRhY2hfcmVmLmF0dGFjaG1lbnQgPSAwOworICAgIGF0dGFjaF9yZWYubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0ge307CisgICAgc3VicGFzcy5waXBlbGluZUJpbmRQb2ludCA9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M7CisgICAgc3VicGFzcy5jb2xvckF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50cyA9ICZhdHRhY2hfcmVmOworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHt9OworICAgIHJwY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBycGNpLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgcnBjaS5wQXR0YWNobWVudHMgPSAmYXR0YWNoX2Rlc2M7CisgICAgcnBjaS5zdWJwYXNzQ291bnQgPSAxOworICAgIHJwY2kucFN1YnBhc3NlcyA9ICZzdWJwYXNzOworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZmluYWxMYXlvdXQtMDA4NDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1maW5hbExheW91dC0wMzA2MSIpOworCisgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ7CisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZmluYWxMYXlvdXQtMDA4NDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1maW5hbExheW91dC0wMzA2MSIpOworCisgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKworICAgIGF1dG8gZGVwdGhfZm9ybWF0ID0gRmluZFN1cHBvcnRlZERlcHRoT25seUZvcm1hdChncHUoKSk7CisgICAgYXV0byBzdGVuY2lsX2Zvcm1hdCA9IEZpbmRTdXBwb3J0ZWRTdGVuY2lsT25seUZvcm1hdChncHUoKSk7CisgICAgYXV0byBkZXB0aF9zdGVuY2lsX2Zvcm1hdCA9IEZpbmRTdXBwb3J0ZWREZXB0aFN0ZW5jaWxGb3JtYXQoZ3B1KCkpOworCisgICAgaWYgKHNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlcy5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMpIHsKKyAgICAgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAwIik7CisgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAwIik7CisgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAwIik7CisgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDAiKTsKKworICAgICAgICBhdHRhY2hfZGVzYy5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisKKyAgICAgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKyAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMSIpOworICAgICAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDEiKTsKKyAgICAgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAxIik7CisgICAgICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAxIik7CisKKyAgICAgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKworICAgICAgICBpZiAoZGVwdGhfc3RlbmNpbF9mb3JtYXQpIHsKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmZvcm1hdCA9IGRlcHRoX3N0ZW5jaWxfZm9ybWF0OworCisgICAgICAgICAgICBpZiAocnAyU3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiBycGNpMjsKKworICAgICAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgICAgICBDb252ZXJ0VmtSZW5kZXJQYXNzQ3JlYXRlSW5mb1RvVjJLSFIocnBjaSwgJnJwY2kyKTsKKyAgICAgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDIiKTsKKyAgICAgICAgICAgICAgICBhdHRhY2hfZGVzYy5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgICAgICBDb252ZXJ0VmtSZW5kZXJQYXNzQ3JlYXRlSW5mb1RvVjJLSFIocnBjaSwgJnJwY2kyKTsKKyAgICAgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg4IiwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMiIpOworICAgICAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg4IiwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMiIpOworICAgICAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg4IiwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMiIpOworICAgICAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODgiLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKworICAgICAgICAgICAgaWYgKHJwMlN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgIHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgcnBjaTI7CisKKyAgICAgICAgICAgICAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgICAgIENvbnZlcnRWa1JlbmRlclBhc3NDcmVhdGVJbmZvVG9WMktIUihycGNpLCAmcnBjaTIpOworICAgICAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzMktIUkNyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBycGNpMi5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMyIpOworICAgICAgICAgICAgICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgICAgICBDb252ZXJ0VmtSZW5kZXJQYXNzQ3JlYXRlSW5mb1RvVjJLSFIocnBjaSwgJnJwY2kyKTsKKyAgICAgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI4OSIsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDMiKTsKKyAgICAgICAgICAgICAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyODkiLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzAzIik7CisgICAgICAgICAgICAgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg5IiwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMyIpOworICAgICAgICAgICAgICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjg5IiwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwMyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlcHRoX2Zvcm1hdCkgeworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuZm9ybWF0ID0gZGVwdGhfZm9ybWF0OworCisgICAgICAgICAgICBhdHRhY2hfZGVzYy5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyOTAiLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA0Iik7CisgICAgICAgICAgICBhdHRhY2hfZGVzYy5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI5MCIsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDQiKTsKKworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgICAgICAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjkxIiwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwNSIpOworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tZm9ybWF0LTAzMjkxIiwgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLWZvcm1hdC0wMzMwNSIpOworCisgICAgICAgICAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ZW5jaWxfZm9ybWF0KSB7CisgICAgICAgICAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBzdGVuY2lsX2Zvcm1hdDsKKworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI5MiIsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDYiKTsKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI5MiIsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDYiKTsKKworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgICAgICAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLWZvcm1hdC0wMzI5MyIsICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1mb3JtYXQtMDMzMDciKTsKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1mb3JtYXQtMDMyOTMiLCAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItZm9ybWF0LTAzMzA3Iik7CisKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocnAyU3VwcG9ydGVkICYmIGRlcHRoX3N0ZW5jaWxfZm9ybWF0KSB7CisgICAgICAgICAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBkZXB0aF9zdGVuY2lsX2Zvcm1hdDsKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKworICAgICAgICAgICAgYXV0byBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0ID0gbHZsX2luaXRfc3RydWN0PFZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUj4oKTsKKyAgICAgICAgICAgIGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQuc3RlbmNpbEluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICAgICAgICAgIGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQuc3RlbmNpbEZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgICAgICAgICBzYWZlX1ZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSIHJwY2kyOworICAgICAgICAgICAgQ29udmVydFZrUmVuZGVyUGFzc0NyZWF0ZUluZm9Ub1YyS0hSKHJwY2ksICZycGNpMik7CisgICAgICAgICAgICBycGNpMi5wQXR0YWNobWVudHNbMF0ucE5leHQgPSAmYXR0YWNobWVudF9kZXNjcmlwdGlvbl9zdGVuY2lsX2xheW91dDsKKworICAgICAgICAgICAgVmtJbWFnZUxheW91dCBmb3JiaWRkZW5fbGF5b3V0c1tdID0geworICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFIsCisgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUiwKKyAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsCisgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGF1dG8gZm9yYmlkZGVuX2xheW91dHNfYXJyYXlfc2l6ZSA9IHNpemVvZihmb3JiaWRkZW5fbGF5b3V0cykgLyBzaXplb2YoZm9yYmlkZGVuX2xheW91dHNbMF0pOworCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcmJpZGRlbl9sYXlvdXRzX2FycmF5X3NpemU7ICsraSkgeworICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQuc3RlbmNpbEluaXRpYWxMYXlvdXQgPSBmb3JiaWRkZW5fbGF5b3V0c1tpXTsKKyAgICAgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uU3RlbmNpbExheW91dEtIUi1zdGVuY2lsSW5pdGlhbExheW91dC0wMzMwOCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0YWNobWVudF9kZXNjcmlwdGlvbl9zdGVuY2lsX2xheW91dC5zdGVuY2lsSW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcmJpZGRlbl9sYXlvdXRzX2FycmF5X3NpemU7ICsraSkgeworICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfZGVzY3JpcHRpb25fc3RlbmNpbF9sYXlvdXQuc3RlbmNpbEZpbmFsTGF5b3V0ID0gZm9yYmlkZGVuX2xheW91dHNbaV07CisgICAgICAgICAgICAgICAgVGVzdFJlbmRlclBhc3MyS0hSQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIHJwY2kyLnB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvblN0ZW5jaWxMYXlvdXRLSFItc3RlbmNpbEZpbmFsTGF5b3V0LTAzMzA5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRhY2htZW50X2Rlc2NyaXB0aW9uX3N0ZW5jaWxfbGF5b3V0LnN0ZW5jaWxGaW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxGaW5hbExheW91dC0wMzMxMCIpOworICAgICAgICAgICAgYXR0YWNobWVudF9kZXNjcmlwdGlvbl9zdGVuY2lsX2xheW91dC5zdGVuY2lsRmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb25TdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxGaW5hbExheW91dC0wMzMxMCIpOworCisgICAgICAgICAgICBycGNpMi5wQXR0YWNobWVudHNbMF0ucE5leHQgPSBudWxscHRyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlcHRoX2Zvcm1hdCkgeworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuZm9ybWF0ID0gZGVwdGhfZm9ybWF0OworCisgICAgICAgICAgICBhdHRhY2hfZGVzYy5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjg0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyOTgiKTsKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI4NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjk4Iik7CisKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyODUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI5OSIpOworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjk5Iik7CisKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZW5jaWxfZm9ybWF0KSB7CisgICAgICAgICAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBzdGVuY2lsX2Zvcm1hdDsKKworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjg0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyOTgiKTsKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjg0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyOTgiKTsKKworICAgICAgICAgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgICAgICAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50RGVzY3JpcHRpb24tc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjg1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMyOTkiKTsKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudERlc2NyaXB0aW9uLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzI4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnREZXNjcmlwdGlvbjJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMjk5Iik7CisKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUmVuZGVyUGFzc0NyZWF0ZUF0dGFjaG1lbnRzTWlzYykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJFbnN1cmUgdGhhdCBDcmVhdGVSZW5kZXJQYXNzIHByb2R1Y2VzIHRoZSBleHBlY3RlZCB2YWxpZGF0aW9uIGVycm9ycyB3aGVuIGEgc3VicGFzcydzIGF0dGFjaG1lbnRzIHZpb2xhdGUgdGhlIHZhbGlkIHVzYWdlICIKKyAgICAgICAgImNvbmRpdGlvbnMuIik7CisKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgc3RkOjp2ZWN0b3I8VmtBdHRhY2htZW50RGVzY3JpcHRpb24+IGF0dGFjaG1lbnRzID0geworICAgICAgICAvLyBpbnB1dCBhdHRhY2htZW50cworICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfNF9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTH0sCisgICAgICAgIC8vIGNvbG9yIGF0dGFjaG1lbnRzCisgICAgICAgIHswLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX1NBTVBMRV9DT1VOVF80X0JJVCwgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfNF9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICAgICAgLy8gZGVwdGggYXR0YWNobWVudAorICAgICAgICB7MCwgVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5ULCBWS19TQU1QTEVfQ09VTlRfNF9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTH0sCisgICAgICAgIC8vIHJlc29sdmUgYXR0YWNobWVudAorICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICAgICAgLy8gcHJlc2VydmUgYXR0YWNobWVudHMKKyAgICAgICAgezAsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfU0FNUExFX0NPVU5UXzRfQklULCBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH0sCisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPFZrQXR0YWNobWVudFJlZmVyZW5jZT4gaW5wdXQgPSB7CisgICAgICAgIHswLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTH0sCisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxWa0F0dGFjaG1lbnRSZWZlcmVuY2U+IGNvbG9yID0geworICAgICAgICB7MSwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH0sCisgICAgICAgIHsyLCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICB9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBkZXB0aCA9IHszLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUx9OworICAgIHN0ZDo6dmVjdG9yPFZrQXR0YWNobWVudFJlZmVyZW5jZT4gcmVzb2x2ZSA9IHsKKyAgICAgICAgezQsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgICAgICB7VktfQVRUQUNITUVOVF9VTlVTRUQsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgIH07CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHByZXNlcnZlID0gezV9OworCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClpbnB1dC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpY29sb3Iuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcHJlc2VydmUuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmUuZGF0YSgpfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWF0dGFjaG1lbnRzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VicGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisKKyAgICAvLyBUZXN0IHRvbyBtYW55IGNvbG9yIGF0dGFjaG1lbnRzCisgICAgY29uc3QgdWludDMyX3QgbWF4X2NvbG9yX2F0dGFjaG1lbnRzID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhDb2xvckF0dGFjaG1lbnRzOworICAgIGNvbnN0IHVpbnQzMl90IHRvb19iaWdfbWF4X2F0dGFjaG1lbnRzID0gNjU1MzYgKyAxOyAgLy8gbGV0J3Mgc2F5IHRoaXMgaXMgdG9vIG11Y2ggdG8gYWxsb2NhdGUKKyAgICBpZiAobWF4X2NvbG9yX2F0dGFjaG1lbnRzID49IHRvb19iaWdfbWF4X2F0dGFjaG1lbnRzKSB7CisgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICIlcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhDb2xvckF0dGFjaG1lbnRzIGlzIHRvbyBsYXJnZSB0byBwcmFjdGljYWxseSB0ZXN0IGFnYWluc3QgLS0gc2tpcHBpbmcgcGFydCBvZiB0ZXN0LlxuIiwKKyAgICAgICAgICAgIGtTa2lwUHJlZml4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnZlY3RvcjxWa0F0dGFjaG1lbnRSZWZlcmVuY2U+IHRvb19tYW55X2NvbG9ycyhtYXhfY29sb3JfYXR0YWNobWVudHMgKyAxLCBjb2xvclswXSk7CisgICAgICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHRlc3Rfc3VicGFzcyA9IHN1YnBhc3M7CisgICAgICAgIHRlc3Rfc3VicGFzcy5jb2xvckF0dGFjaG1lbnRDb3VudCA9ICh1aW50MzJfdCl0b29fbWFueV9jb2xvcnMuc2l6ZSgpOworICAgICAgICB0ZXN0X3N1YnBhc3MucENvbG9yQXR0YWNobWVudHMgPSB0b29fbWFueV9jb2xvcnMuZGF0YSgpOworICAgICAgICB0ZXN0X3N1YnBhc3MucFJlc29sdmVBdHRhY2htZW50cyA9IE5VTEw7CisgICAgICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gdGVzdF9ycGNpID0gcnBjaTsKKyAgICAgICAgdGVzdF9ycGNpLnBTdWJwYXNzZXMgPSAmdGVzdF9zdWJwYXNzOworCisgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZ0ZXN0X3JwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tY29sb3JBdHRhY2htZW50Q291bnQtMDA4NDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItY29sb3JBdHRhY2htZW50Q291bnQtMDMwNjMiKTsKKyAgICB9CisKKyAgICAvLyBUZXN0IHNhbXBsZSBjb3VudCBtaXNtYXRjaCBiZXR3ZWVuIGNvbG9yIGJ1ZmZlcnMKKyAgICBhdHRhY2htZW50c1tzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzWzFdLmF0dGFjaG1lbnRdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfOF9CSVQ7CisgICAgZGVwdGguYXR0YWNobWVudCA9IFZLX0FUVEFDSE1FTlRfVU5VU0VEOyAgLy8gQXZvaWRzIHRyaWdnZXJpbmcgMDE0MTgKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcENvbG9yQXR0YWNobWVudHMtMDE0MTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1wQ29sb3JBdHRhY2htZW50cy0wMzA2OSIpOworCisgICAgZGVwdGguYXR0YWNobWVudCA9IDM7CisgICAgYXR0YWNobWVudHNbc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1sxXS5hdHRhY2htZW50XS5zYW1wbGVzID0gYXR0YWNobWVudHNbc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1swXS5hdHRhY2htZW50XS5zYW1wbGVzOworCisgICAgLy8gVGVzdCBzYW1wbGUgY291bnQgbWlzbWF0Y2ggYmV0d2VlbiBjb2xvciBidWZmZXJzIGFuZCBkZXB0aCBidWZmZXIKKyAgICBhdHRhY2htZW50c1tzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50XS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzhfQklUOworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSAxOworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0wMTQxOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LTAzMDcxIik7CisKKyAgICBhdHRhY2htZW50c1tzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LT5hdHRhY2htZW50XS5zYW1wbGVzID0gYXR0YWNobWVudHNbc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1swXS5hdHRhY2htZW50XS5zYW1wbGVzOworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSAodWludDMyX3QpY29sb3Iuc2l6ZSgpOworCisgICAgLy8gVGVzdCByZXNvbHZlIGF0dGFjaG1lbnQgd2l0aCBVTlVTRUQgY29sb3IgYXR0YWNobWVudAorICAgIGNvbG9yWzBdLmF0dGFjaG1lbnQgPSBWS19BVFRBQ0hNRU5UX1VOVVNFRDsKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy0wMDg0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBSZXNvbHZlQXR0YWNobWVudHMtMDMwNjUiKTsKKworICAgIGNvbG9yWzBdLmF0dGFjaG1lbnQgPSAxOworCisgICAgLy8gVGVzdCByZXNvbHZlIGZyb20gYSBzaW5nbGUtc2FtcGxlZCBjb2xvciBhdHRhY2htZW50CisgICAgYXR0YWNobWVudHNbc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1swXS5hdHRhY2htZW50XS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSAxOyAgICAgICAgICAgLy8gYXZvaWQgbWlzbWF0Y2ggKDAwMzM3KSwgYW5kIGF2b2lkIGRvdWJsZSByZXBvcnQKKyAgICBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbnVsbHB0cjsgIC8vIGF2b2lkIG1pc21hdGNoICgwMTQxOCkKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy0wMDg0OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBSZXNvbHZlQXR0YWNobWVudHMtMDMwNjYiKTsKKworICAgIGF0dGFjaG1lbnRzW3N1YnBhc3MucENvbG9yQXR0YWNobWVudHNbMF0uYXR0YWNobWVudF0uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKyAgICBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50ID0gKHVpbnQzMl90KWNvbG9yLnNpemUoKTsKKyAgICBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gJmRlcHRoOworCisgICAgLy8gVGVzdCByZXNvbHZlIHRvIGEgbXVsdGktc2FtcGxlZCByZXNvbHZlIGF0dGFjaG1lbnQKKyAgICBhdHRhY2htZW50c1tzdWJwYXNzLnBSZXNvbHZlQXR0YWNobWVudHNbMF0uYXR0YWNobWVudF0uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy0wMDg0OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBSZXNvbHZlQXR0YWNobWVudHMtMDMwNjciKTsKKworICAgIGF0dGFjaG1lbnRzW3N1YnBhc3MucFJlc29sdmVBdHRhY2htZW50c1swXS5hdHRhY2htZW50XS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworCisgICAgLy8gVGVzdCB3aXRoIGNvbG9yL3Jlc29sdmUgZm9ybWF0IG1pc21hdGNoCisgICAgYXR0YWNobWVudHNbc3VicGFzcy5wQ29sb3JBdHRhY2htZW50c1swXS5hdHRhY2htZW50XS5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfU1JHQjsKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcFJlc29sdmVBdHRhY2htZW50cy0wMDg1MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBSZXNvbHZlQXR0YWNobWVudHMtMDMwNjgiKTsKKworICAgIGF0dGFjaG1lbnRzW3N1YnBhc3MucENvbG9yQXR0YWNobWVudHNbMF0uYXR0YWNobWVudF0uZm9ybWF0ID0gYXR0YWNobWVudHNbc3VicGFzcy5wUmVzb2x2ZUF0dGFjaG1lbnRzWzBdLmF0dGFjaG1lbnRdLmZvcm1hdDsKKworICAgIC8vIFRlc3QgZm9yIFVOVVNFRCBwcmVzZXJ2ZSBhdHRhY2htZW50cworICAgIHByZXNlcnZlWzBdID0gVktfQVRUQUNITUVOVF9VTlVTRUQ7CisKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1hdHRhY2htZW50LTAwODUzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItYXR0YWNobWVudC0wMzA3MyIpOworCisgICAgcHJlc2VydmVbMF0gPSA1OworICAgIC8vIFRlc3QgZm9yIHByZXNlcnZlIGF0dGFjaG1lbnRzIHVzZWQgZWxzZXdoZXJlIGluIHRoZSBzdWJwYXNzCisgICAgY29sb3JbMF0uYXR0YWNobWVudCA9IHByZXNlcnZlWzBdOworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1wUHJlc2VydmVBdHRhY2htZW50cy0wMDg1NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBQcmVzZXJ2ZUF0dGFjaG1lbnRzLTAzMDc0Iik7CisKKyAgICBjb2xvclswXS5hdHRhY2htZW50ID0gMTsKKyAgICBpbnB1dFswXS5hdHRhY2htZW50ID0gMDsKKyAgICBpbnB1dFswXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKworICAgIC8vIFRlc3QgZm9yIGF0dGFjaG1lbnQgdXNlZCBmaXJzdCBhcyBpbnB1dCB3aXRoIGxvYWRPcD1DTEVBUgorICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VmtTdWJwYXNzRGVzY3JpcHRpb24+IHN1YnBhc3NlcyA9IHtzdWJwYXNzLCBzdWJwYXNzLCBzdWJwYXNzfTsKKyAgICAgICAgc3VicGFzc2VzWzBdLmlucHV0QXR0YWNobWVudENvdW50ID0gMDsKKyAgICAgICAgc3VicGFzc2VzWzFdLmlucHV0QXR0YWNobWVudENvdW50ID0gMDsKKyAgICAgICAgYXR0YWNobWVudHNbaW5wdXRbMF0uYXR0YWNobWVudF0ubG9hZE9wID0gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSOworICAgICAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2lfbXVsdGlwYXNzID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpYXR0YWNobWVudHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc3VicGFzc2VzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXNzZXMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisKKyAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2lfbXVsdGlwYXNzLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLWxvYWRPcC0wMDg0NiIsICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUi1sb2FkT3AtMDMwNjQiKTsKKworICAgICAgICBhdHRhY2htZW50c1tpbnB1dFswXS5hdHRhY2htZW50XS5sb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZW5kZXJQYXNzQ3JlYXRlQXR0YWNobWVudFJlZmVyZW5jZUludmFsaWRMYXlvdXQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRhY2htZW50IHJlZmVyZW5jZSB1c2VzIFBSRUlOSVRJQUxJWkVEIG9yIFVOREVGSU5FRCBsYXlvdXRzIik7CisKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1NFUEFSQVRFX0RFUFRIX1NURU5DSUxfTEFZT1VUU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU0VQQVJBVEVfREVQVEhfU1RFTkNJTF9MQVlPVVRTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIGF1dG8gc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VTZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHNGZWF0dXJlc0tIUj4oKTsKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmc2VwYXJhdGVfZGVwdGhfc3RlbmNpbF9sYXlvdXRzX2ZlYXR1cmVzKTsKKyAgICBpZiAodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUikgeworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXBhcmF0ZV9kZXB0aF9zdGVuY2lsX2xheW91dHNfZmVhdHVyZXMuc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzID0gVktfRkFMU0U7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUikgPyAmZmVhdHVyZXMyIDogbnVsbHB0cikpOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNoW10gPSB7CisgICAgICAgIHswLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgIH07CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIHJlZnNbXSA9IHsKKyAgICAgICAgezAsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUR9LAorICAgIH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCByZWZzLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICB9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAxLCBhdHRhY2gsIDEsIHN1YnBhc3NlcywgMCwgbnVsbHB0cn07CisKKyAgICAvLyBVc2UgVU5ERUZJTkVEIGxheW91dAorICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJTdXBwb3J0ZWQsICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZS1sYXlvdXQtMDA4NTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItbGF5b3V0LTAzMDc3Iik7CisKKyAgICAvLyBVc2UgUFJFSU5JVElBTElaRUQgbGF5b3V0CisgICAgcmVmc1swXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ7CisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlLWxheW91dC0wMDg1NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1sYXlvdXQtMDMwNzciKTsKKworICAgIGlmIChycDJTdXBwb3J0ZWQpIHsKKyAgICAgICAgc2FmZV9Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUiBycGNpMjsKKyAgICAgICAgQ29udmVydFZrUmVuZGVyUGFzc0NyZWF0ZUluZm9Ub1YyS0hSKHJwY2ksICZycGNpMik7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlX2RlcHRoX3N0ZW5jaWxfbGF5b3V0c19mZWF0dXJlcy5zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMpIHsKKyAgICAgICAgICAgIHJwY2kyLnBTdWJwYXNzZXNbMF0ucENvbG9yQXR0YWNobWVudHNbMF0uYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisKKyAgICAgICAgICAgIHJwY2kyLnBTdWJwYXNzZXNbMF0ucENvbG9yQXR0YWNobWVudHNbMF0ubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE0Iik7CisgICAgICAgICAgICBycGNpMi5wU3VicGFzc2VzWzBdLnBDb2xvckF0dGFjaG1lbnRzWzBdLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE0Iik7CisgICAgICAgICAgICBycGNpMi5wU3VicGFzc2VzWzBdLnBDb2xvckF0dGFjaG1lbnRzWzBdLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE0Iik7CisgICAgICAgICAgICBycGNpMi5wU3VicGFzc2VzWzBdLnBDb2xvckF0dGFjaG1lbnRzWzBdLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzMktIUkNyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBycGNpMi5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTQiKTsKKworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzMktIUkNyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBycGNpMi5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTUiKTsKKyAgICAgICAgICAgIHJwY2kyLnBTdWJwYXNzZXNbMF0ucENvbG9yQXR0YWNobWVudHNbMF0ubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzMktIUkNyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBycGNpMi5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTUiKTsKKworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsKKworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3MyS0hSQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIHJwY2kyLnB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItYXR0YWNobWVudC0wMzMxNSIpOworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1hdHRhY2htZW50LTAzMzE1Iik7CisKKyAgICAgICAgICAgIHJwY2kyLnBTdWJwYXNzZXNbMF0ucENvbG9yQXR0YWNobWVudHNbMF0uYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzMktIUkNyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBycGNpMi5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTciKTsKKyAgICAgICAgICAgIHJwY2kyLnBTdWJwYXNzZXNbMF0ucENvbG9yQXR0YWNobWVudHNbMF0ubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzMktIUkNyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBycGNpMi5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLWF0dGFjaG1lbnQtMDMzMTciKTsKKworICAgICAgICAgICAgYXV0byBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dCA9IGx2bF9pbml0X3N0cnVjdDxWa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSPigpOworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5wTmV4dCA9ICZhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dDsKKworICAgICAgICAgICAgVmtJbWFnZUxheW91dCBmb3JiaWRkZW5fbGF5b3V0c1tdID0ge1ZLX0lNQUdFX0xBWU9VVF9QUkVJTklUSUFMSVpFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSfTsKKyAgICAgICAgICAgIHJwY2kyLnBTdWJwYXNzZXNbMF0ucENvbG9yQXR0YWNobWVudHNbMF0uYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgICAgICAgICBycGNpMi5wU3VicGFzc2VzWzBdLnBDb2xvckF0dGFjaG1lbnRzWzBdLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoc2l6ZW9mKGZvcmJpZGRlbl9sYXlvdXRzKSAvIHNpemVvZihmb3JiaWRkZW5fbGF5b3V0c1swXSkpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhdHRhY2htZW50X3JlZmVyZW5jZV9zdGVuY2lsX2xheW91dC5zdGVuY2lsTGF5b3V0ID0gZm9yYmlkZGVuX2xheW91dHNbaV07CisgICAgICAgICAgICAgICAgVGVzdFJlbmRlclBhc3MyS0hSQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIHJwY2kyLnB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2VTdGVuY2lsTGF5b3V0S0hSLXN0ZW5jaWxMYXlvdXQtMDMzMTgiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBycGNpMi5wU3VicGFzc2VzWzBdLnBDb2xvckF0dGFjaG1lbnRzWzBdLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX09QVElNQUxfS0hSOworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3MyS0hSQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIHJwY2kyLnB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFItc2VwYXJhdGVEZXB0aFN0ZW5jaWxMYXlvdXRzLTAzMzEzIik7CisgICAgICAgICAgICBycGNpMi5wU3VicGFzc2VzWzBdLnBDb2xvckF0dGFjaG1lbnRzWzBdLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMzMTMiKTsKKyAgICAgICAgICAgIHJwY2kyLnBTdWJwYXNzZXNbMF0ucENvbG9yQXR0YWNobWVudHNbMF0ubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMX0tIUjsKKyAgICAgICAgICAgIFRlc3RSZW5kZXJQYXNzMktIUkNyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBycGNpMi5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSLXNlcGFyYXRlRGVwdGhTdGVuY2lsTGF5b3V0cy0wMzMxMyIpOworICAgICAgICAgICAgcnBjaTIucFN1YnBhc3Nlc1swXS5wQ29sb3JBdHRhY2htZW50c1swXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTF9LSFI7CisgICAgICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBjaTIucHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUi1zZXBhcmF0ZURlcHRoU3RlbmNpbExheW91dHMtMDMzMTMiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZW5kZXJQYXNzQ3JlYXRlT3ZlcmxhcHBpbmdDb3JyZWxhdGlvbk1hc2tzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgc3VicGFzcyB3aXRoIG92ZXJsYXBwaW5nIGNvcnJlbGF0aW9uIG1hc2tzIik7CisKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisKKyAgICBpZiAoIXJwMlN1cHBvcnRlZCkgeworICAgICAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0gezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9OworICAgIHVpbnQzMl90IHZpZXdNYXNrc1tdID0gezB4M3V9OworICAgIHVpbnQzMl90IGNvcnJlbGF0aW9uTWFza3NbXSA9IHsweDF1LCAweDN1fTsKKyAgICBWa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvIHJwbXZjaSA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfTVVMVElWSUVXX0NSRUFURV9JTkZPLCBudWxscHRyLCAxLCB2aWV3TWFza3MsIDAsIG51bGxwdHIsIDIsIGNvcnJlbGF0aW9uTWFza3N9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCAmcnBtdmNpLCAwLCAwLCBudWxscHRyLCAxLCAmc3VicGFzcywgMCwgbnVsbHB0cn07CisKKyAgICAvLyBDb3JyZWxhdGlvbiBtYXNrcyBtdXN0IG5vdCBvdmVybGFwCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvLXBDb3JyZWxhdGlvbk1hc2tzLTAwODQxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wQ29ycmVsYXRlZFZpZXdNYXNrcy0wMzA1NiIpOworCisgICAgLy8gQ2hlY2sgZm9yIG1vcmUgc3BlY2lmaWMgImRvbid0IHNldCBhbnkgY29ycmVsYXRpb24gbWFza3Mgd2hlbiBtdWx0aXZpZXcgaXMgbm90IGVuYWJsZWQiCisgICAgaWYgKHJwMlN1cHBvcnRlZCkgeworICAgICAgICB2aWV3TWFza3NbMF0gPSAwOworICAgICAgICBjb3JyZWxhdGlvbk1hc2tzWzBdID0gMDsKKyAgICAgICAgY29ycmVsYXRpb25NYXNrc1sxXSA9IDA7CisgICAgICAgIHNhZmVfVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgc2FmZV9ycGNpMjsKKyAgICAgICAgQ29udmVydFZrUmVuZGVyUGFzc0NyZWF0ZUluZm9Ub1YyS0hSKHJwY2ksICZzYWZlX3JwY2kyKTsKKworICAgICAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FmZV9ycGNpMi5wdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXZpZXdNYXNrLTAzMDU3Iik7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVJbnZhbGlkVmlld01hc2tzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgc3VicGFzcyB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgdmlldyBtYXNrcywgb3IgaW5jb25zaXN0ZW50IHNldHRpbmcgb2YgdmlldyBtYXNrcyIpOworCisgICAgLy8gQ2hlY2sgZm9yIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgYm9vbCBycDJTdXBwb3J0ZWQgPSBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydCh0aGlzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworCisgICAgaWYgKCFycDJTdXBwb3J0ZWQpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9NVUxUSVZJRVdfRVhURU5TSU9OX05BTUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICAgICAgezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgIH07CisgICAgdWludDMyX3Qgdmlld01hc2tzW10gPSB7MHgzdSwgMHV9OworICAgIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gcnBtdmNpID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19NVUxUSVZJRVdfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDEsIHZpZXdNYXNrcywgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sICZycG12Y2ksIDAsIDAsIG51bGxwdHIsIDIsIHN1YnBhc3NlcywgMCwgbnVsbHB0cn07CisKKyAgICAvLyBOb3QgZW5vdWdoIHZpZXcgbWFza3MKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAxOTI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi12aWV3TWFzay0wMzA1OCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVJbnZhbGlkSW5wdXRBdHRhY2htZW50UmVmZXJlbmNlcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHN1YnBhc3Mgd2l0aCB0aGUgbWV0YSBkYXRhIGFzcGVjdCBtYXNrIHNldCBmb3IgYW4gaW5wdXQgYXR0YWNobWVudCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2ggPSB7MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTH07CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIHJlZiA9IHswLCBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMfTsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMSwgJnJlZiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisgICAgVmtJbnB1dEF0dGFjaG1lbnRBc3BlY3RSZWZlcmVuY2UgaWFhciA9IHswLCAwLCBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUfTsKKyAgICBWa1JlbmRlclBhc3NJbnB1dEF0dGFjaG1lbnRBc3BlY3RDcmVhdGVJbmZvIHJwaWFhY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfSU5QVVRfQVRUQUNITUVOVF9BU1BFQ1RfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDEsICZpYWFyfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgJnJwaWFhY2ksIDAsIDEsICZhdHRhY2gsIDEsICZzdWJwYXNzLCAwLCBudWxscHRyfTsKKworICAgIC8vIEludmFsaWQgbWV0YSBkYXRhIGFzcGVjdAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5NjMiKTsgIC8vIENhbm5vdC9zaG91bGQgbm90IGF2b2lkIGdldHRpbmcgdGhpcyBvbmUgdG9vCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIGZhbHNlLCAiVlVJRC1Wa0lucHV0QXR0YWNobWVudEFzcGVjdFJlZmVyZW5jZS1hc3BlY3RNYXNrLTAxOTY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKworICAgIC8vIEFzcGVjdCBub3QgcHJlc2VudAorICAgIGlhYXIuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIGZhbHNlLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAxOTYzIiwgbnVsbHB0cik7CisKKyAgICAvLyBJbnZhbGlkIHN1YnBhc3MgaW5kZXgKKyAgICBpYWFyLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGlhYXIuc3VicGFzcyA9IDE7CisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIGZhbHNlLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBOZXh0LTAxOTI2IiwgbnVsbHB0cik7CisgICAgaWFhci5zdWJwYXNzID0gMDsKKworICAgIC8vIEludmFsaWQgaW5wdXQgYXR0YWNobWVudCBpbmRleAorICAgIGlhYXIuaW5wdXRBdHRhY2htZW50SW5kZXggPSAxOworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBmYWxzZSwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkyNyIsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVJbnZhbGlkRnJhZ21lbnREZW5zaXR5TWFwUmVmZXJlbmNlcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHN1YnBhc3Mgd2l0aCB0aGUgd3JvbmcgYXR0YWNobWVudCBpbmZvcm1hdGlvbiBmb3IgYSBmcmFnbWVudCBkZW5zaXR5IG1hcCAiKTsKKworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfRVhUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfRlJBR01FTlRfREVOU0lUWV9NQVBfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNoID0gezAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9SOEc4X1VOT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVH07CisgICAgLy8gU2V0IDEgaW5zdGVhZCBvZiAwCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIHJlZiA9IHsxLCBWS19JTUFHRV9MQVlPVVRfRlJBR01FTlRfREVOU0lUWV9NQVBfT1BUSU1BTF9FWFR9OworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMSwgJnJlZiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisgICAgVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVCBycGZkbWkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfRlJBR01FTlRfREVOU0lUWV9NQVBfQ1JFQVRFX0lORk9fRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHJlZn07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sICZycGZkbWksIDAsIDEsICZhdHRhY2gsIDEsICZzdWJwYXNzLCAwLCBudWxscHRyfTsKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NGcmFnbWVudERlbnNpdHlNYXBDcmVhdGVJbmZvRVhULWZyYWdtZW50RGVuc2l0eU1hcEF0dGFjaG1lbnQtMDI1NDciLCBudWxscHRyKTsKKworICAgIC8vIFNldCB3cm9uZyBWa0ltYWdlTGF5b3V0CisgICAgcmVmID0gezAsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9OworICAgIHN1YnBhc3MgPSB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMSwgJnJlZiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisgICAgcnBmZG1pID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0NSRUFURV9JTkZPX0VYVCwgbnVsbHB0ciwgcmVmfTsKKyAgICBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCAmcnBmZG1pLCAwLCAxLCAmYXR0YWNoLCAxLCAmc3VicGFzcywgMCwgbnVsbHB0cn07CisKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzRnJhZ21lbnREZW5zaXR5TWFwQ3JlYXRlSW5mb0VYVC1mcmFnbWVudERlbnNpdHlNYXBBdHRhY2htZW50LTAyNTQ5IiwgbnVsbHB0cik7CisKKyAgICAvLyBTZXQgd3JvbmcgbG9hZCBvcGVyYXRpb24KKyAgICBhdHRhY2ggPSB7MCwKKyAgICAgICAgICAgICAgVktfRk9STUFUX1I4RzhfVU5PUk0sCisgICAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSLAorICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVH07CisKKyAgICByZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX09QVElNQUxfRVhUfTsKKyAgICBzdWJwYXNzID0gezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDEsICZyZWYsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9OworICAgIHJwZmRtaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19GUkFHTUVOVF9ERU5TSVRZX01BUF9DUkVBVEVfSU5GT19FWFQsIG51bGxwdHIsIHJlZn07CisgICAgcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgJnJwZmRtaSwgMCwgMSwgJmF0dGFjaCwgMSwgJnN1YnBhc3MsIDAsIG51bGxwdHJ9OworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC0wMjU1MCIsIG51bGxwdHIpOworCisgICAgLy8gU2V0IHdyb25nIHN0b3JlIG9wZXJhdGlvbgorICAgIGF0dGFjaCA9IHswLAorICAgICAgICAgICAgICBWS19GT1JNQVRfUjhHOF9VTk9STSwKKyAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCwKKyAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSwKKyAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVH07CisKKyAgICByZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX09QVElNQUxfRVhUfTsKKyAgICBzdWJwYXNzID0gezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDEsICZyZWYsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9OworICAgIHJwZmRtaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19GUkFHTUVOVF9ERU5TSVRZX01BUF9DUkVBVEVfSU5GT19FWFQsIG51bGxwdHIsIHJlZn07CisgICAgcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgJnJwZmRtaSwgMCwgMSwgJmF0dGFjaCwgMSwgJnN1YnBhc3MsIDAsIG51bGxwdHJ9OworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0ZyYWdtZW50RGVuc2l0eU1hcENyZWF0ZUluZm9FWFQtZnJhZ21lbnREZW5zaXR5TWFwQXR0YWNobWVudC0wMjU1MSIsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVTdWJwYXNzTm9uR3JhcGhpY3NQaXBlbGluZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHN1YnBhc3Mgd2l0aCB0aGUgY29tcHV0ZSBwaXBlbGluZSBiaW5kIHBvaW50Iik7CisgICAgLy8gQ2hlY2sgZm9yIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgYm9vbCBycDJTdXBwb3J0ZWQgPSBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydCh0aGlzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3Nlc1tdID0geworICAgICAgICB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICB9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCAxLCBzdWJwYXNzZXMsIDAsIG51bGxwdHJ9OworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1waXBlbGluZUJpbmRQb2ludC0wMDg0NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLXBpcGVsaW5lQmluZFBvaW50LTAzMDYyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUmVuZGVyUGFzc0NyZWF0ZVN1YnBhc3NNaXNzaW5nQXR0cmlidXRlc0JpdE11bHRpdmlld05WWCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHN1YnBhc3Mgd2l0aCB0aGUgVktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19BVFRSSUJVVEVTX0JJVF9OVlggZmxhZyBtaXNzaW5nIik7CisKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX05WWF9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX05WWF9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19FWFRFTlNJT05fTkFNRSkgJiYKKyAgICAgICAgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX05WWF9NVUxUSVZJRVdfUEVSX1ZJRVdfQVRUUklCVVRFU19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19OVlhfTVVMVElWSUVXX1BFUl9WSUVXX0FUVFJJQlVURVNfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBycDJTdXBwb3J0ZWQgPSBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydCh0aGlzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3Nlc1tdID0geworICAgICAgICB7VktfU1VCUEFTU19ERVNDUklQVElPTl9QRVJfVklFV19QT1NJVElPTl9YX09OTFlfQklUX05WWCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgIH07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIDEsIHN1YnBhc3NlcywgMCwgbnVsbHB0cn07CisKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbi1mbGFncy0wMDg1NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24yS0hSLWZsYWdzLTAzMDc2Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUmVuZGVyUGFzc0NyZWF0ZTJTdWJwYXNzSW52YWxpZElucHV0QXR0YWNobWVudFBhcmFtZXRlcnMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYSBzdWJwYXNzIHdpdGggcGFyYW1ldGVycyBpbiB0aGUgaW5wdXQgYXR0YWNobWVudCByZWYgd2hpY2ggYXJlIGludmFsaWQiKTsKKworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX0NSRUFURV9SRU5ERVJQQVNTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisKKyAgICBpZiAoIXJwMlN1cHBvcnRlZCkgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9DUkVBVEVfUkVOREVSUEFTU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uMktIUiBhdHRhY2hfZGVzYyA9IHt9OworICAgIGF0dGFjaF9kZXNjLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl8yX0tIUjsKKyAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgIGF0dGFjaF9kZXNjLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZTJLSFIgcmVmZXJlbmNlID0ge307CisgICAgcmVmZXJlbmNlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9SRUZFUkVOQ0VfMl9LSFI7CisgICAgcmVmZXJlbmNlLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIHJlZmVyZW5jZS5hc3BlY3RNYXNrID0gMDsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uMktIUiBzdWJwYXNzID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfREVTQ1JJUFRJT05fMl9LSFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHJ9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgcnBjaTIgPSB7CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPXzJfS0hSLCBudWxscHRyLCAwLCAxLCAmYXR0YWNoX2Rlc2MsIDEsICZzdWJwYXNzLCAwLCBudWxscHRyLCAwLCBudWxscHRyfTsKKworICAgIC8vIFRlc3QgZm9yIGFzcGVjdCBtYXNrIG9mIDAKKyAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2kyLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItYXR0YWNobWVudC0wMjgwMCIpOworCisgICAgLy8gVGVzdCBmb3IgaW52YWxpZCBhc3BlY3QgbWFzayBiaXRzCisgICAgcmVmZXJlbmNlLmFzcGVjdE1hc2sgPSAweDQwMDAwMDAwOyAgLy8gaW52YWxpZCBWa0ltYWdlQXNwZWN0RmxhZ0JpdHMgdmFsdWUKKyAgICBUZXN0UmVuZGVyUGFzczJLSFJDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2kyLCAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItYXR0YWNobWVudC0wMjc5OSIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVJbnZhbGlkU3VicGFzc0RlcGVuZGVuY2llcykgeworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgYm9vbCBycDJfc3VwcG9ydGVkID0gQ2hlY2tDcmVhdGVSZW5kZXJQYXNzMlN1cHBvcnQodGhpcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzKTsKKyAgICBib29sIG11bHRpdmlld1N1cHBvcnRlZCA9IHJwMl9zdXBwb3J0ZWQ7CisKKyAgICBpZiAoIXJwMl9zdXBwb3J0ZWQgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NVUxUSVZJRVdfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtdWx0aXZpZXdTdXBwb3J0ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIEFkZCBhIGRldmljZSBmZWF0dXJlcyBzdHJ1Y3QgZW5hYmxpbmcgTk8gZmVhdHVyZXMKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdHVyZXMgPSB7MH07CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCZmZWF0dXJlcykpOworCisgICAgaWYgKG1fZGV2aWNlLT5wcm9wcy5hcGlWZXJzaW9uID49IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICBtdWx0aXZpZXdTdXBwb3J0ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIENyZWF0ZSB0d28gZHVtbXkgc3VicGFzc2VzCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICAgICAgezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgIH07CisKKyAgICBWa1N1YnBhc3NEZXBlbmRlbmN5IGRlcGVuZGVuY3k7CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCAyLCBzdWJwYXNzZXMsIDEsICZkZXBlbmRlbmN5fTsKKworICAgIC8vIE5vbiBncmFwaGljcyBzdGFnZXMgaW4gc3VicGFzcyBkZXBlbmRlbmN5CisgICAgZGVwZW5kZW5jeSA9IHswLCAxLCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZFUl9CSVQsCisgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVR9OworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJfc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcERlcGVuZGVuY2llcy0wMDgzNyIsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBEZXBlbmRlbmNpZXMtMDMwNTQiKTsKKworICAgIGRlcGVuZGVuY3kgPSB7MCwgMSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULCAwLCAwLCAwfTsKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzciLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLTAzMDU0Iik7CisKKyAgICBkZXBlbmRlbmN5ID0gezAsIDEsIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsIDAsIDAsIDB9OworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJfc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcERlcGVuZGVuY2llcy0wMDgzNyIsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8yS0hSLXBEZXBlbmRlbmNpZXMtMDMwNTQiKTsKKworICAgIGRlcGVuZGVuY3kgPSB7MCwgMSwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULAorICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVH07CisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMl9zdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wRGVwZW5kZW5jaWVzLTAwODM4IiwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcERlcGVuZGVuY2llcy0wMzA1NSIpOworCisgICAgZGVwZW5kZW5jeSA9IHswLCAxLCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCAwLCAwLCAwfTsKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzgiLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLTAzMDU1Iik7CisKKyAgICBkZXBlbmRlbmN5ID0gezAsIFZLX1NVQlBBU1NfRVhURVJOQUwsIFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklULCAwLCAwLCAwfTsKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzciLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLTAzMDU0Iik7CisKKyAgICBkZXBlbmRlbmN5ID0ge1ZLX1NVQlBBU1NfRVhURVJOQUwsIDAsIFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQ09NUFVURV9TSEFERVJfQklULCAwLCAwLCAwfTsKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzgiLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLTAzMDU1Iik7CisKKyAgICBkZXBlbmRlbmN5ID0gezAsIDAsIFZLX1BJUEVMSU5FX1NUQUdFX0NPTVBVVEVfU0hBREVSX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULCAwLCAwLCAwfTsKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvLXBEZXBlbmRlbmNpZXMtMDA4MzciLCAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi1wRGVwZW5kZW5jaWVzLTAzMDU0Iik7CisKKyAgICAvLyBHZW9tZXRyeSBzaGFkZXJzIG5vdCBlbmFibGVkIHNvdXJjZQorICAgIGRlcGVuZGVuY3kgPSB7MCwgMSwgVktfUElQRUxJTkVfU1RBR0VfR0VPTUVUUllfU0hBREVSX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULCAwLCAwLCAwfTsKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJfc3VwcG9ydGVkLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY1N0YWdlTWFzay0wMDg2MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3RhZ2VNYXNrLTAzMDgwIik7CisKKyAgICAvLyBHZW9tZXRyeSBzaGFkZXJzIG5vdCBlbmFibGVkIGRlc3RpbmF0aW9uCisgICAgZGVwZW5kZW5jeSA9IHswLCAxLCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQsIDAsIDAsIDB9OworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMl9zdXBwb3J0ZWQsICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLTAwODYxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDMwODEiKTsKKworICAgIC8vIFRlc3NlbGxhdGlvbiBub3QgZW5hYmxlZCBzb3VyY2UKKyAgICBkZXBlbmRlbmN5ID0gezAsIDEsIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCwgMCwgMCwgMH07CisKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdGFnZU1hc2stMDA4NjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY1N0YWdlTWFzay0wMzA4MiIpOworCisgICAgLy8gVGVzc2VsbGF0aW9uIG5vdCBlbmFibGVkIGRlc3RpbmF0aW9uCisgICAgZGVwZW5kZW5jeSA9IHswLCAxLCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX1NIQURFUl9CSVQsIDAsIDAsIDB9OworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMl9zdXBwb3J0ZWQsICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZHN0U3RhZ2VNYXNrLTAwODYzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kc3RTdGFnZU1hc2stMDMwODMiKTsKKworICAgIC8vIFBvdGVudGlhbCBjeWNsaWNhbCBkZXBlbmRlbmN5CisgICAgZGVwZW5kZW5jeSA9IHsxLCAwLCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCwgMCwgMCwgMH07CisKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAzMDg0Iik7CisKKyAgICAvLyBFWFRFUk5BTCB0byBFWFRFUk5BTCBkZXBlbmRlbmN5CisgICAgZGVwZW5kZW5jeSA9IHsKKyAgICAgICAgVktfU1VCUEFTU19FWFRFUk5BTCwgVktfU1VCUEFTU19FWFRFUk5BTCwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsIDAsIDAsIDB9OworCisgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMl9zdXBwb3J0ZWQsICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktc3JjU3VicGFzcy0wMDg2NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItc3JjU3VicGFzcy0wMzA4NSIpOworCisgICAgLy8gTG9naWNhbGx5IGxhdGVyIHNvdXJjZSBzdGFnZXMgaW4gc2VsZiBkZXBlbmRlbmN5CisgICAgZGVwZW5kZW5jeSA9IHswLCAwLCBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX0lOUFVUX0JJVCwgMCwgMCwgMH07CisKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODY3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1zcmNTdWJwYXNzLTAzMDg3Iik7CisKKyAgICAvLyBTb3VyY2UgYWNjZXNzIG1hc2sgbWlzbWF0Y2ggd2l0aCBzb3VyY2Ugc3RhZ2UgbWFzaworICAgIGRlcGVuZGVuY3kgPSB7MCwgMSwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsIFZLX0FDQ0VTU19VTklGT1JNX1JFQURfQklULCAwLCAwfTsKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJfc3VwcG9ydGVkLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LXNyY0FjY2Vzc01hc2stMDA4NjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLXNyY0FjY2Vzc01hc2stMDMwODgiKTsKKworICAgIC8vIERlc3RpbmF0aW9uIGFjY2VzcyBtYXNrIG1pc21hdGNoIHdpdGggZGVzdGluYXRpb24gc3RhZ2UgbWFzaworICAgIGRlcGVuZGVuY3kgPSB7CisgICAgICAgIDAsIDEsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCwgMCwgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklULCAwfTsKKworICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJfc3VwcG9ydGVkLCAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5LWRzdEFjY2Vzc01hc2stMDA4NjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3kyS0hSLWRzdEFjY2Vzc01hc2stMDMwODkiKTsKKworICAgIGlmIChtdWx0aXZpZXdTdXBwb3J0ZWQpIHsKKyAgICAgICAgLy8gVklFV19MT0NBTF9CSVQgYnV0IG11bHRpdmlldyBpcyBub3QgZW5hYmxlZAorICAgICAgICBkZXBlbmRlbmN5ID0gezAsIDEsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULAorICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVR9OworCisgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJfc3VwcG9ydGVkLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NDcmVhdGVJbmZvMktIUi12aWV3TWFzay0wMzA1OSIpOworCisgICAgICAgIC8vIEVuYWJsZSBtdWx0aXZpZXcKKyAgICAgICAgdWludDMyX3QgcFZpZXdNYXNrc1syXSA9IHsweDN1LCAweDN1fTsKKyAgICAgICAgaW50MzJfdCBwVmlld09mZnNldHNbMl0gPSB7MCwgMH07CisgICAgICAgIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gcnBtdmNpID0geworICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfTVVMVElWSUVXX0NSRUFURV9JTkZPLCBudWxscHRyLCAyLCBwVmlld01hc2tzLCAwLCBudWxscHRyLCAwLCBudWxscHRyfTsKKyAgICAgICAgcnBjaS5wTmV4dCA9ICZycG12Y2k7CisKKyAgICAgICAgLy8gRXhjZXNzaXZlIHZpZXcgb2Zmc2V0cworICAgICAgICBkZXBlbmRlbmN5ID0gezAsIDEsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULAorICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIFZLX0RFUEVOREVOQ1lfVklFV19MT0NBTF9CSVR9OworICAgICAgICBycG12Y2kucFZpZXdPZmZzZXRzID0gcFZpZXdPZmZzZXRzOworICAgICAgICBycG12Y2kuZGVwZW5kZW5jeUNvdW50ID0gMjsKKworICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgZmFsc2UsICJWVUlELVZrUmVuZGVyUGFzc0NyZWF0ZUluZm8tcE5leHQtMDE5MjkiLCBudWxscHRyKTsKKworICAgICAgICBycG12Y2kuZGVwZW5kZW5jeUNvdW50ID0gMDsKKworICAgICAgICAvLyBWaWV3IG9mZnNldCB3aXRoIHN1YnBhc3Mgc2VsZiBkZXBlbmRlbmN5CisgICAgICAgIGRlcGVuZGVuY3kgPSB7MCwgMCwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgVktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVH07CisgICAgICAgIHJwbXZjaS5wVmlld09mZnNldHMgPSBwVmlld09mZnNldHM7CisgICAgICAgIHBWaWV3T2Zmc2V0c1swXSA9IDE7CisgICAgICAgIHJwbXZjaS5kZXBlbmRlbmN5Q291bnQgPSAxOworCisgICAgICAgIFRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBmYWxzZSwgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mby1wTmV4dC0wMTkzMCIsIG51bGxwdHIpOworCisgICAgICAgIHJwbXZjaS5kZXBlbmRlbmN5Q291bnQgPSAwOworCisgICAgICAgIC8vIFZpZXcgb2Zmc2V0IHdpdGggbm8gdmlldyBsb2NhbCBiaXQKKyAgICAgICAgaWYgKHJwMl9zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGRlcGVuZGVuY3kgPSB7MCwgVktfU1VCUEFTU19FWFRFUk5BTCwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsIDAsIDAsIDB9OworICAgICAgICAgICAgcnBtdmNpLnBWaWV3T2Zmc2V0cyA9IHBWaWV3T2Zmc2V0czsKKyAgICAgICAgICAgIHBWaWV3T2Zmc2V0c1swXSA9IDE7CisgICAgICAgICAgICBycG12Y2kuZGVwZW5kZW5jeUNvdW50ID0gMTsKKworICAgICAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMl9zdXBwb3J0ZWQsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXBlbmRlbmN5MktIUi1kZXBlbmRlbmN5RmxhZ3MtMDMwOTIiKTsKKworICAgICAgICAgICAgcnBtdmNpLmRlcGVuZGVuY3lDb3VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBFWFRFUk5BTCBzdWJwYXNzIHdpdGggVklFV19MT0NBTF9CSVQgLSBzb3VyY2Ugc3VicGFzcworICAgICAgICBkZXBlbmRlbmN5ID0ge1ZLX1NVQlBBU1NfRVhURVJOQUwsICAgICAgICAgMSwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgVktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVH07CisKKyAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMl9zdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZGVwZW5kZW5jeUZsYWdzLTAyNTIwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZGVwZW5kZW5jeUZsYWdzLTAzMDkwIik7CisKKyAgICAgICAgLy8gRVhURVJOQUwgc3VicGFzcyB3aXRoIFZJRVdfTE9DQUxfQklUIC0gZGVzdGluYXRpb24gc3VicGFzcworICAgICAgICBkZXBlbmRlbmN5ID0gezAsIFZLX1NVQlBBU1NfRVhURVJOQUwsICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgMCwgVktfREVQRU5ERU5DWV9WSUVXX0xPQ0FMX0JJVH07CisKKyAgICAgICAgVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMl9zdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0RlcGVuZGVuY3ktZGVwZW5kZW5jeUZsYWdzLTAyNTIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeTJLSFItZGVwZW5kZW5jeUZsYWdzLTAzMDkxIik7CisKKyAgICAgICAgLy8gTXVsdGlwbGUgdmlld3MgYnV0IG5vIHZpZXcgbG9jYWwgYml0IGluIHNlbGYtZGVwZW5kZW5jeQorICAgICAgICBkZXBlbmRlbmN5ID0gezAsIDAsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULCAwLCAwLCAwfTsKKworICAgICAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCwgIlZVSUQtVmtTdWJwYXNzRGVwZW5kZW5jeS1zcmNTdWJwYXNzLTAwODcyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFItcERlcGVuZGVuY2llcy0wMzA2MCIpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZW5kZXJQYXNzQ3JlYXRlSW52YWxpZE1peGVkQXR0YWNobWVudFNhbXBsZXNBTUQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWZXJpZnkgZXJyb3IgbWVzc2FnZXMgZm9yIHN1cHBvcnRlZCBhbmQgdW5zdXBwb3J0ZWQgc2FtcGxlIGNvdW50cyBpbiByZW5kZXIgcGFzcyBhdHRhY2htZW50cy4iKTsKKworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfQU1EX01JWEVEX0FUVEFDSE1FTlRfU0FNUExFU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19BTURfTUlYRURfQVRUQUNITUVOVF9TQU1QTEVTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0FNRF9NSVhFRF9BVFRBQ0hNRU5UX1NBTVBMRVNfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBycDJTdXBwb3J0ZWQgPSBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydCh0aGlzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgc3RkOjp2ZWN0b3I8VmtBdHRhY2htZW50RGVzY3JpcHRpb24+IGF0dGFjaG1lbnRzOworCisgICAgeworICAgICAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHQgPSB7fTsKKyAgICAgICAgYXR0LmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICAgICAgYXR0LnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgICAgIGF0dC5sb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI7CisgICAgICAgIGF0dC5zdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRTsKKyAgICAgICAgYXR0LnN0ZW5jaWxMb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFOworICAgICAgICBhdHQuc3RlbmNpbFN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRTsKKyAgICAgICAgYXR0LmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgICAgICBhdHQuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworCisgICAgICAgIGF0dGFjaG1lbnRzLnB1c2hfYmFjayhhdHQpOworCisgICAgICAgIGF0dC5mb3JtYXQgPSBWS19GT1JNQVRfRDE2X1VOT1JNOworICAgICAgICBhdHQuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKyAgICAgICAgYXR0LmxvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUjsKKyAgICAgICAgYXR0LnN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFOworICAgICAgICBhdHQuc3RlbmNpbExvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUjsKKyAgICAgICAgYXR0LnN0ZW5jaWxTdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRTsKKyAgICAgICAgYXR0LmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgICAgICBhdHQuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw7CisKKyAgICAgICAgYXR0YWNobWVudHMucHVzaF9iYWNrKGF0dCk7CisgICAgfQorCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGNvbG9yX3JlZiA9IHt9OworICAgIGNvbG9yX3JlZi5hdHRhY2htZW50ID0gMDsKKyAgICBjb2xvcl9yZWYubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBkZXB0aF9yZWYgPSB7fTsKKyAgICBkZXB0aF9yZWYuYXR0YWNobWVudCA9IDE7CisgICAgZGVwdGhfcmVmLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7fTsKKyAgICBzdWJwYXNzLnBpcGVsaW5lQmluZFBvaW50ID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzsKKyAgICBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50ID0gMTsKKyAgICBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzID0gJmNvbG9yX3JlZjsKKyAgICBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gJmRlcHRoX3JlZjsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHt9OworICAgIHJwY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBycGNpLmF0dGFjaG1lbnRDb3VudCA9IGF0dGFjaG1lbnRzLnNpemUoKTsKKyAgICBycGNpLnBBdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzLmRhdGEoKTsKKyAgICBycGNpLnN1YnBhc3NDb3VudCA9IDE7CisgICAgcnBjaS5wU3VicGFzc2VzID0gJnN1YnBhc3M7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIFZrUmVzdWx0IGVycjsKKworICAgIGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKGRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKKworICAgIC8vIEV4cGVjdCBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIHNhbXBsZSBjb3VudHMKKyAgICBhdHRhY2htZW50c1swXS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzRfQklUOworICAgIGF0dGFjaG1lbnRzWzFdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisKKyAgICBUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBDb2xvckF0dGFjaG1lbnRzLTAxNTA2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFItcENvbG9yQXR0YWNobWVudHMtMDMwNzAiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZW5kZXJQYXNzQmVnaW5JbnZhbGlkUmVuZGVyQXJlYSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkdlbmVyYXRlIElOVkFMSURfUkVOREVSX0FSRUEgZXJyb3IgYnkgYmVnaW5uaW5nIHJlbmRlcnBhc3Mgd2l0aCBleHRlbnQgb3V0c2lkZSBvZiBmcmFtZWJ1ZmZlciIpOworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGJvb2wgcnAyU3VwcG9ydGVkID0gQ2hlY2tDcmVhdGVSZW5kZXJQYXNzMlN1cHBvcnQodGhpcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBGcmFtZWJ1ZmZlciBmb3IgcmVuZGVyIHRhcmdldCBpcyAyNTZ4MjU2LCBleGNlZWQgdGhhdCBmb3IgSU5WQUxJRF9SRU5ERVJfQVJFQQorICAgIG1fcmVuZGVyUGFzc0JlZ2luSW5mby5yZW5kZXJBcmVhLmV4dGVudC53aWR0aCA9IDI1NzsKKyAgICBtX3JlbmRlclBhc3NCZWdpbkluZm8ucmVuZGVyQXJlYS5leHRlbnQuaGVpZ2h0ID0gMjU3OworCisgICAgVGVzdFJlbmRlclBhc3NCZWdpbihtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmbV9yZW5kZXJQYXNzQmVnaW5JbmZvLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGV4ZWN1dGUgYSByZW5kZXIgcGFzcyB3aXRoIHJlbmRlckFyZWEgbm90IHdpdGhpbiB0aGUgYm91bmQgb2YgdGhlIGZyYW1lYnVmZmVyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGV4ZWN1dGUgYSByZW5kZXIgcGFzcyB3aXRoIHJlbmRlckFyZWEgbm90IHdpdGhpbiB0aGUgYm91bmQgb2YgdGhlIGZyYW1lYnVmZmVyLiIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NCZWdpbldpdGhpblJlbmRlclBhc3MpIHsKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSIHZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUiA9IG51bGxwdHI7CisgICAgYm9vbCBycDJTdXBwb3J0ZWQgPSBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydCh0aGlzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIGlmIChycDJTdXBwb3J0ZWQpIHsKKyAgICAgICAgdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSID0KKyAgICAgICAgICAgIChQRk5fdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0NtZEJlZ2luUmVuZGVyUGFzczJLSFIiKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gQmluZCBhIEJlZ2luUmVuZGVyUGFzcyB3aXRoaW4gYW4gYWN0aXZlIFJlbmRlclBhc3MKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgIC8vIEp1c3QgdXNlIGEgZHVtbXkgUmVuZGVycGFzcworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtcmVuZGVycGFzcyIpOworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJm1fcmVuZGVyUGFzc0JlZ2luSW5mbywgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBpZiAocnAyU3VwcG9ydGVkKSB7CisgICAgICAgIFZrU3VicGFzc0JlZ2luSW5mb0tIUiBzdWJwYXNzQmVnaW5JbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1NVQlBBU1NfQkVHSU5fSU5GT19LSFIsIG51bGxwdHIsIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FfTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1yZW5kZXJwYXNzIik7CisgICAgICAgIHZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmbV9yZW5kZXJQYXNzQmVnaW5JbmZvLCAmc3VicGFzc0JlZ2luSW5mbyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZW5kZXJQYXNzQmVnaW5JbmNvbXBhdGlibGVGcmFtZWJ1ZmZlclJlbmRlclBhc3MpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHRoYXQgcmVuZGVycGFzcyBiZWdpbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGZyYW1lYnVmZmVyIHJlbmRlcnBhc3MgIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KG51bGxwdHIsIG51bGxwdHIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisKKyAgICAvLyBDcmVhdGUgYSBkZXB0aCBzdGVuY2lsIGltYWdlIHZpZXcKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKworICAgIGltYWdlLkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9EMTZfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VWaWV3IGRzdjsKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gZHN2Y2kgPSB7fTsKKyAgICBkc3ZjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgZHN2Y2kucE5leHQgPSBudWxscHRyOworICAgIGRzdmNpLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgZHN2Y2kudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgZHN2Y2kuZm9ybWF0ID0gVktfRk9STUFUX0QxNl9VTk9STTsKKyAgICBkc3ZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGRzdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBkc3ZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGRzdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZkc3ZjaSwgTlVMTCwgJmRzdik7CisKKyAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHdpdGggYSBzaW5nbGUgYXR0YWNobWVudCB0aGF0IHVzZXMgbG9hZE9wIENMRUFSCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB7MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfRDE2X1VOT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9OworCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGRlcHRoX3N0ZW5jaWxfcmVmID0gezAsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTH07CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0gezAsICAgICAgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgJmRlcHRoX3N0ZW5jaWxfcmVmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDEsICZkZXNjcmlwdGlvbiwgMSwgJnN1YnBhc3MsIDAsIG51bGxwdHJ9OworICAgIFZrUmVuZGVyUGFzcyBycDEsIHJwMjsKKworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIE5VTEwsICZycDEpOworICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxscHRyOworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIE5VTEwsICZycDIpOworCisgICAgLy8gQ3JlYXRlIGEgZnJhbWVidWZmZXIKKworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZiY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIHJwMSwgMSwgJmRzdiwgMTI4LCAxMjgsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmI7CisKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmhhbmRsZSgpLCAmZmJjaSwgbnVsbHB0ciwgJmZiKTsKKworICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBycF9iZWdpbiA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLCBudWxscHRyLCBycDIsIGZiLCB7ezAsIDB9LCB7MTI4LCAxMjh9fSwgMCwgbnVsbHB0cn07CisKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycF9iZWdpbiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tcmVuZGVyUGFzcy0wMDkwNCIsIG51bGxwdHIpOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAxLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycDIsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCBkc3YsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NCZWdpbkxheW91dHNGcmFtZWJ1ZmZlckltYWdlVXNhZ2VNaXNtYXRjaGVzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCByZW5kZXJwYXNzIGluaXRpYWwvZmluYWwgbGF5b3V0cyBtYXRjaCB1cCB3aXRoIHRoZSB1c2FnZSBiaXRzIHNldCBmb3IgZWFjaCBhdHRhY2htZW50IG9mIHRoZSBmcmFtZWJ1ZmZlciIpOworCisgICAgLy8gQ2hlY2sgZm9yIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgYm9vbCBycDJTdXBwb3J0ZWQgPSBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydCh0aGlzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworICAgIGJvb2wgbWFpbnRlbmFuY2UyU3VwcG9ydGVkID0gcnAyU3VwcG9ydGVkOworCisgICAgLy8gQ2hlY2sgZm9yIFZLX0tIUl9tYWludGVuYW5jZTIKKyAgICBpZiAoIXJwMlN1cHBvcnRlZCAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1haW50ZW5hbmNlMlN1cHBvcnRlZCA9IHRydWU7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsIG51bGxwdHIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisKKyAgICBpZiAobV9kZXZpY2UtPnByb3BzLmFwaVZlcnNpb24gPj0gVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIG1haW50ZW5hbmNlMlN1cHBvcnRlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGFuIGlucHV0IGF0dGFjaG1lbnQgdmlldworICAgIFZrSW1hZ2VPYmogaWFpKG1fZGV2aWNlKTsKKworICAgIGlhaS5Jbml0Tm9MYXlvdXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICBBU1NFUlRfVFJVRShpYWkuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0ltYWdlVmlldyBpYXY7CisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGlhdmNpID0ge307CisgICAgaWF2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGlhdmNpLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBpYXZjaS5pbWFnZSA9IGlhaS5oYW5kbGUoKTsKKyAgICBpYXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpYXZjaS5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgaWF2Y2kuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpYXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaWF2Y2kuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpYXZjaS5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaWF2Y2ksIE5VTEwsICZpYXYpOworCisgICAgLy8gQ3JlYXRlIGEgY29sb3IgYXR0YWNobWVudCB2aWV3CisgICAgVmtJbWFnZU9iaiBjYWkobV9kZXZpY2UpOworCisgICAgY2FpLkluaXROb0xheW91dCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworICAgIEFTU0VSVF9UUlVFKGNhaS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VWaWV3IGNhdjsKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gY2F2Y2kgPSB7fTsKKyAgICBjYXZjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgY2F2Y2kucE5leHQgPSBudWxscHRyOworICAgIGNhdmNpLmltYWdlID0gY2FpLmhhbmRsZSgpOworICAgIGNhdmNpLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgIGNhdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBjYXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGNhdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBjYXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGNhdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZjYXZjaSwgTlVMTCwgJmNhdik7CisKKyAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHdpdGggdGhvc2UgYXR0YWNobWVudHMKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbnNbXSA9IHsKKyAgICAgICAgezAsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfU0FNUExFX0NPVU5UXzFfQklULCBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTH0sCisgICAgICAgIHsxLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9fTsKKworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBpbnB1dF9yZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBjb2xvcl9yZWYgPSB7MSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9OworCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAxLCAmaW5wdXRfcmVmLCAxLCAmY29sb3JfcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMiwgZGVzY3JpcHRpb25zLCAxLCAmc3VicGFzcywgMCwgbnVsbHB0cn07CisKKyAgICBWa1JlbmRlclBhc3MgcnA7CisKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworCisgICAgLy8gQ3JlYXRlIGEgZnJhbWVidWZmZXIKKworICAgIFZrSW1hZ2VWaWV3IHZpZXdzW10gPSB7aWF2LCBjYXZ9OworCisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmJjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIDIsIHZpZXdzLCAxMjgsIDEyOCwgMX07CisgICAgVmtGcmFtZWJ1ZmZlciBmYjsKKworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+aGFuZGxlKCksICZmYmNpLCBudWxscHRyLCAmZmIpOworCisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJwX2JlZ2luID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sIG51bGxwdHIsIHJwLCBmYiwge3swLCAwfSwgezEyOCwgMTI4fX0sIDAsIG51bGxwdHJ9OworCisgICAgVmtSZW5kZXJQYXNzIHJwX2ludmFsaWQ7CisKKyAgICAvLyBJbml0aWFsIGxheW91dCBpcyBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMIGJ1dCBhdHRhY2htZW50IGRvZXNuJ3Qgc3VwcG9ydCBJTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVAorICAgIGRlc2NyaXB0aW9uc1swXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnBfaW52YWxpZCk7CisgICAgcnBfYmVnaW4ucmVuZGVyUGFzcyA9IHJwX2ludmFsaWQ7CisgICAgVGVzdFJlbmRlclBhc3NCZWdpbihtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcnBfYmVnaW4sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA4OTUiLCAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5NCIpOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5oYW5kbGUoKSwgcnBfaW52YWxpZCwgbnVsbHB0cik7CisKKyAgICAvLyBJbml0aWFsIGxheW91dCBpcyBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMIGJ1dCBhdHRhY2htZW50IGRvZXNuJ3Qgc3VwcG9ydCBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVAorICAgIC8vIC8gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQKKyAgICBkZXNjcmlwdGlvbnNbMF0uaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGRlc2NyaXB0aW9uc1sxXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnBfaW52YWxpZCk7CisgICAgcnBfYmVnaW4ucmVuZGVyUGFzcyA9IHJwX2ludmFsaWQ7CisKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycF9iZWdpbiwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtaW5pdGlhbExheW91dC0wMDg5NyIsICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk3Iik7CisKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmhhbmRsZSgpLCBycF9pbnZhbGlkLCBudWxscHRyKTsKKyAgICBkZXNjcmlwdGlvbnNbMV0uaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgLy8gSW5pdGlhbCBsYXlvdXQgaXMgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMIGJ1dCBhdHRhY2htZW50IGRvZXNuJ3Qgc3VwcG9ydCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUCisgICAgZGVzY3JpcHRpb25zWzBdLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw7CisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwX2ludmFsaWQpOworICAgIHJwX2JlZ2luLnJlbmRlclBhc3MgPSBycF9pbnZhbGlkOworCisgICAgVGVzdFJlbmRlclBhc3NCZWdpbihtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcnBfYmVnaW4sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDA4OTgiLCAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5OCIpOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5oYW5kbGUoKSwgcnBfaW52YWxpZCwgbnVsbHB0cik7CisKKyAgICAvLyBJbml0aWFsIGxheW91dCBpcyBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwgYnV0IGF0dGFjaG1lbnQgZG9lc24ndCBzdXBwb3J0IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQKKyAgICBkZXNjcmlwdGlvbnNbMF0uaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnBfaW52YWxpZCk7CisgICAgcnBfYmVnaW4ucmVuZGVyUGFzcyA9IHJwX2ludmFsaWQ7CisKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycF9iZWdpbiwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtaW5pdGlhbExheW91dC0wMDg5OSIsICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk5Iik7CisKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmhhbmRsZSgpLCBycF9pbnZhbGlkLCBudWxscHRyKTsKKworICAgIC8vIEluaXRpYWwgbGF5b3V0IGlzIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCBidXQgYXR0YWNobWVudCBkb2Vzbid0IHN1cHBvcnQKKyAgICAvLyBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUCisgICAgZGVzY3JpcHRpb25zWzBdLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwX2ludmFsaWQpOworICAgIHJwX2JlZ2luLnJlbmRlclBhc3MgPSBycF9pbnZhbGlkOworICAgIGNvbnN0IGNoYXIgKmluaXRpYWxfbGF5b3V0X3Z1aWRfcnAxID0KKyAgICAgICAgbWFpbnRlbmFuY2UyU3VwcG9ydGVkID8gIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtaW5pdGlhbExheW91dC0wMTc1OCIgOiAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzcy1pbml0aWFsTGF5b3V0LTAwODk2IjsKKworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwX2JlZ2luLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2xheW91dF92dWlkX3JwMSwgIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MyS0hSLWluaXRpYWxMYXlvdXQtMDMwOTYiKTsKKworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+aGFuZGxlKCksIHJwX2ludmFsaWQsIG51bGxwdHIpOworCisgICAgLy8gSW5pdGlhbCBsYXlvdXQgaXMgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgYnV0IGF0dGFjaG1lbnQgZG9lc24ndCBzdXBwb3J0CisgICAgLy8gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVAorICAgIGRlc2NyaXB0aW9uc1swXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw7CisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwX2ludmFsaWQpOworICAgIHJwX2JlZ2luLnJlbmRlclBhc3MgPSBycF9pbnZhbGlkOworCisgICAgVGVzdFJlbmRlclBhc3NCZWdpbihtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcnBfYmVnaW4sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfbGF5b3V0X3Z1aWRfcnAxLCAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5NiIpOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5oYW5kbGUoKSwgcnBfaW52YWxpZCwgbnVsbHB0cik7CisKKyAgICBpZiAobWFpbnRlbmFuY2UyU3VwcG9ydGVkIHx8IHJwMlN1cHBvcnRlZCkgeworICAgICAgICAvLyBJbml0aWFsIGxheW91dCBpcyBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMIGJ1dCBhdHRhY2htZW50IGRvZXNuJ3Qgc3VwcG9ydAorICAgICAgICAvLyBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUCisgICAgICAgIGRlc2NyaXB0aW9uc1swXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1JFQURfT05MWV9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICAgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwX2ludmFsaWQpOworICAgICAgICBycF9iZWdpbi5yZW5kZXJQYXNzID0gcnBfaW52YWxpZDsKKworICAgICAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycF9iZWdpbiwgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzLWluaXRpYWxMYXlvdXQtMDE3NTgiLCAiVlVJRC12a0NtZEJlZ2luUmVuZGVyUGFzczJLSFItaW5pdGlhbExheW91dC0wMzA5NiIpOworCisgICAgICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+aGFuZGxlKCksIHJwX2ludmFsaWQsIG51bGxwdHIpOworCisgICAgICAgIC8vIEluaXRpYWwgbGF5b3V0IGlzIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUwgYnV0IGF0dGFjaG1lbnQgZG9lc24ndCBzdXBwb3J0CisgICAgICAgIC8vIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQKKyAgICAgICAgZGVzY3JpcHRpb25zWzBdLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfQVRUQUNITUVOVF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOworICAgICAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnBfaW52YWxpZCk7CisgICAgICAgIHJwX2JlZ2luLnJlbmRlclBhc3MgPSBycF9pbnZhbGlkOworCisgICAgICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwX2JlZ2luLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCZWdpblJlbmRlclBhc3MtaW5pdGlhbExheW91dC0wMTc1OCIsICJWVUlELXZrQ21kQmVnaW5SZW5kZXJQYXNzMktIUi1pbml0aWFsTGF5b3V0LTAzMDk2Iik7CisKKyAgICAgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5oYW5kbGUoKSwgcnBfaW52YWxpZCwgbnVsbHB0cik7CisgICAgfQorCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCBpYXYsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgY2F2LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZW5kZXJQYXNzQmVnaW5DbGVhck9wTWlzbWF0Y2gpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQmVnaW4gYSByZW5kZXJQYXNzIHdoZXJlIGNsZWFyVmFsdWVDb3VudCBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiByZW5kZXJQYXNzIGF0dGFjaG1lbnRzIHRoYXQgdXNlICIKKyAgICAgICAgImxvYWRPcCBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIuIik7CisKKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsIG51bGxwdHIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gQ3JlYXRlIGEgcmVuZGVyUGFzcyB3aXRoIGEgc2luZ2xlIGF0dGFjaG1lbnQgdGhhdCB1c2VzIGxvYWRPcCBDTEVBUgorICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRhY2ggPSB7fTsKKyAgICBhdHRhY2gubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHt9OworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSAxOworICAgIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHMgPSAmYXR0YWNoOworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHt9OworICAgIHJwY2kuc3VicGFzc0NvdW50ID0gMTsKKyAgICBycGNpLnBTdWJwYXNzZXMgPSAmc3VicGFzczsKKyAgICBycGNpLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNoX2Rlc2MgPSB7fTsKKyAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgLy8gU2V0IGxvYWRPcCB0byBDTEVBUgorICAgIGF0dGFjaF9kZXNjLmxvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUjsKKyAgICBhdHRhY2hfZGVzYy5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgcnBjaS5wQXR0YWNobWVudHMgPSAmYXR0YWNoX2Rlc2M7CisgICAgcnBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworCisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJwX2JlZ2luID0ge307CisgICAgcnBfYmVnaW4uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPOworICAgIHJwX2JlZ2luLnBOZXh0ID0gTlVMTDsKKyAgICBycF9iZWdpbi5yZW5kZXJQYXNzID0gcmVuZGVyUGFzcygpOworICAgIHJwX2JlZ2luLmZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXIoKTsKKyAgICBycF9iZWdpbi5jbGVhclZhbHVlQ291bnQgPSAwOyAgLy8gU2hvdWxkIGJlIDEKKworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwX2JlZ2luLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tY2xlYXJWYWx1ZUNvdW50LTAwOTAyIiwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWNsZWFyVmFsdWVDb3VudC0wMDkwMiIpOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NCZWdpblNhbXBsZUxvY2F0aW9uc0ludmFsaWRJbmRpY2VzRVhUKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IGF0dGFjaG1lbnQgaW5kaWNlcyBhbmQgc3VicGFzcyBpbmRpY2VzIHNwZWNpZmVkIGJ5IHNhbXBsZSBsb2NhdGlvbnMgc3RydWN0dXJlcyBhcmUgdmFsaWQiKTsKKworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfU0FNUExFX0xPQ0FUSU9OU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfU0FNUExFX0xPQ0FUSU9OU19FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfU0FNUExFX0xPQ0FUSU9OU19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIC8vIENyZWF0ZSBhIGRlcHRoIHN0ZW5jaWwgaW1hZ2UgdmlldworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworCisgICAgaW1hZ2UuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX0QxNl9VTk9STSwgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXcgZHN2OworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBkc3ZjaSA9IHt9OworICAgIGRzdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBkc3ZjaS5wTmV4dCA9IG51bGxwdHI7CisgICAgZHN2Y2kuaW1hZ2UgPSBpbWFnZS5oYW5kbGUoKTsKKyAgICBkc3ZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBkc3ZjaS5mb3JtYXQgPSBWS19GT1JNQVRfRDE2X1VOT1JNOworICAgIGRzdmNpLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgZHN2Y2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGRzdmNpLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgZHN2Y2kuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsKKyAgICB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzdmNpLCBOVUxMLCAmZHN2KTsKKworICAgIC8vIENyZWF0ZSBhIHJlbmRlclBhc3Mgd2l0aCBhIHNpbmdsZSBhdHRhY2htZW50IHRoYXQgdXNlcyBsb2FkT3AgQ0xFQVIKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9EMTZfVU5PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfR0VORVJBTH07CisKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgZGVwdGhfc3RlbmNpbF9yZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMfTsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7MCwgICAgICBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyLCAmZGVwdGhfc3RlbmNpbF9yZWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMSwgJmRlc2NyaXB0aW9uLCAxLCAmc3VicGFzcywgMCwgbnVsbHB0cn07CisgICAgVmtSZW5kZXJQYXNzIHJwOworCisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwKTsKKworICAgIC8vIENyZWF0ZSBhIGZyYW1lYnVmZmVyCisKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmYmNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCBycCwgMSwgJmRzdiwgMTI4LCAxMjgsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmI7CisKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmhhbmRsZSgpLCAmZmJjaSwgbnVsbHB0ciwgJmZiKTsKKworICAgIFZrU2FtcGxlTG9jYXRpb25FWFQgc2FtcGxlX2xvY2F0aW9uID0gezAuNSwgMC41fTsKKworICAgIFZrU2FtcGxlTG9jYXRpb25zSW5mb0VYVCBzYW1wbGVfbG9jYXRpb25zX2luZm8gPSB7CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRV9MT0NBVElPTlNfSU5GT19FWFQsIG51bGxwdHIsIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgezEsIDF9LCAxLCAmc2FtcGxlX2xvY2F0aW9ufTsKKworICAgIFZrQXR0YWNobWVudFNhbXBsZUxvY2F0aW9uc0VYVCBhdHRhY2htZW50X3NhbXBsZV9sb2NhdGlvbnMgPSB7MCwgc2FtcGxlX2xvY2F0aW9uc19pbmZvfTsKKyAgICBWa1N1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQgc3VicGFzc19zYW1wbGVfbG9jYXRpb25zID0gezAsIHNhbXBsZV9sb2NhdGlvbnNfaW5mb307CisKKyAgICBWa1JlbmRlclBhc3NTYW1wbGVMb2NhdGlvbnNCZWdpbkluZm9FWFQgcnBfc2xfYmVnaW4gPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfU0FNUExFX0xPQ0FUSU9OU19CRUdJTl9JTkZPX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dGFjaG1lbnRfc2FtcGxlX2xvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YnBhc3Nfc2FtcGxlX2xvY2F0aW9uc307CisKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gcnBfYmVnaW4gPSB7CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sICZycF9zbF9iZWdpbiwgcnAsIGZiLCB7ezAsIDB9LCB7MTI4LCAxMjh9fSwgMCwgbnVsbHB0cn07CisKKyAgICBhdHRhY2htZW50X3NhbXBsZV9sb2NhdGlvbnMuYXR0YWNobWVudEluZGV4ID0gMTsKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycF9iZWdpbiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0F0dGFjaG1lbnRTYW1wbGVMb2NhdGlvbnNFWFQtYXR0YWNobWVudEluZGV4LTAxNTMxIiwgbnVsbHB0cik7CisgICAgYXR0YWNobWVudF9zYW1wbGVfbG9jYXRpb25zLmF0dGFjaG1lbnRJbmRleCA9IDA7CisKKyAgICBzdWJwYXNzX3NhbXBsZV9sb2NhdGlvbnMuc3VicGFzc0luZGV4ID0gMTsKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycF9iZWdpbiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1N1YnBhc3NTYW1wbGVMb2NhdGlvbnNFWFQtc3VicGFzc0luZGV4LTAxNTMyIiwgbnVsbHB0cik7CisgICAgc3VicGFzc19zYW1wbGVfbG9jYXRpb25zLnN1YnBhc3NJbmRleCA9IDA7CisKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIGRzdiwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUmVuZGVyUGFzc05leHRTdWJwYXNzRXhjZXNzaXZlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIHdoZW4gQ21kTmV4dFN1YnBhc3MgaXMgY2FsbGVkIHRvbyBtYW55IHRpbWVzIGluIGEgcmVuZGVycGFzcyBpbnN0YW5jZSIpOworCisgICAgLy8gQ2hlY2sgZm9yIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgUEZOX3ZrQ21kTmV4dFN1YnBhc3MyS0hSIHZrQ21kTmV4dFN1YnBhc3MyS0hSID0gbnVsbHB0cjsKKyAgICBib29sIHJwMlN1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgaWYgKHJwMlN1cHBvcnRlZCkgeworICAgICAgICB2a0NtZE5leHRTdWJwYXNzMktIUiA9IChQRk5fdmtDbWROZXh0U3VicGFzczJLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrQ21kTmV4dFN1YnBhc3MyS0hSIik7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZE5leHRTdWJwYXNzLU5vbmUtMDA5MDkiKTsKKyAgICB2azo6Q21kTmV4dFN1YnBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgaWYgKHJwMlN1cHBvcnRlZCkgeworICAgICAgICBWa1N1YnBhc3NCZWdpbkluZm9LSFIgc3VicGFzc0JlZ2luSW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0JFR0lOX0lORk9fS0hSLCBudWxscHRyLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORX07CisgICAgICAgIFZrU3VicGFzc0VuZEluZm9LSFIgc3VicGFzc0VuZEluZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19FTkRfSU5GT19LSFIsIG51bGxwdHJ9OworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWROZXh0U3VicGFzczJLSFItTm9uZS0wMzEwMiIpOworCisgICAgICAgIHZrQ21kTmV4dFN1YnBhc3MyS0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZzdWJwYXNzQmVnaW5JbmZvLCAmc3VicGFzc0VuZEluZm8pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NFbmRCZWZvcmVGaW5hbFN1YnBhc3MpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHRoYXQgYW4gZXJyb3IgaXMgcHJvZHVjZWQgd2hlbiBDbWRFbmRSZW5kZXJQYXNzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpbmFsIHN1YnBhc3MgaGFzIGJlZW4gcmVhY2hlZCIpOworCisgICAgLy8gQ2hlY2sgZm9yIFZLX0tIUl9nZXRfcGh5c2ljYWxfZGV2aWNlX3Byb3BlcnRpZXMyCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgUEZOX3ZrQ21kRW5kUmVuZGVyUGFzczJLSFIgdmtDbWRFbmRSZW5kZXJQYXNzMktIUiA9IG51bGxwdHI7CisgICAgYm9vbCBycDJTdXBwb3J0ZWQgPSBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydCh0aGlzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCBudWxscHRyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworCisgICAgaWYgKHJwMlN1cHBvcnRlZCkgeworICAgICAgICB2a0NtZEVuZFJlbmRlclBhc3MyS0hSID0gKFBGTl92a0NtZEVuZFJlbmRlclBhc3MyS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0NtZEVuZFJlbmRlclBhc3MyS0hSIik7CisgICAgfQorCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc2RbMl0gPSB7ezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfX07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJjcGkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIDIsIHNkLCAwLCBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZyY3BpLCBudWxscHRyLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmYmNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCBycCwgMCwgbnVsbHB0ciwgMTYsIDE2LCAxfTsKKworICAgIFZrRnJhbWVidWZmZXIgZmI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZiY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBycGJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sIG51bGxwdHIsIHJwLCBmYiwge3swLCAwfSwgezE2LCAxNn19LCAwLCBudWxscHRyfTsKKworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRFbmRSZW5kZXJQYXNzLU5vbmUtMDA5MTAiKTsKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGlmIChycDJTdXBwb3J0ZWQpIHsKKyAgICAgICAgVmtTdWJwYXNzRW5kSW5mb0tIUiBzdWJwYXNzRW5kSW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0VORF9JTkZPX0tIUiwgbnVsbHB0cn07CisKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5yZXNldCgpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRW5kUmVuZGVyUGFzczJLSFItTm9uZS0wMzEwMyIpOworICAgICAgICB2a0NtZEVuZFJlbmRlclBhc3MyS0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZzdWJwYXNzRW5kSW5mbyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIENsZWFuIHVwLgorICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NEZXN0cm95V2hpbGVJblVzZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkRlbGV0ZSBpbi11c2UgcmVuZGVyUGFzcy4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIENyZWF0ZSBzaW1wbGUgcmVuZGVycGFzcworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRhY2ggPSB7fTsKKyAgICBhdHRhY2gubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHt9OworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSAxOworICAgIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHMgPSAmYXR0YWNoOworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHt9OworICAgIHJwY2kuc3VicGFzc0NvdW50ID0gMTsKKyAgICBycGNpLnBTdWJwYXNzZXMgPSAmc3VicGFzczsKKyAgICBycGNpLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNoX2Rlc2MgPSB7fTsKKyAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgYXR0YWNoX2Rlc2Muc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIHJwY2kucEF0dGFjaG1lbnRzID0gJmF0dGFjaF9kZXNjOworICAgIHJwY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBWa1JlbmRlclBhc3MgcnA7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gcnBiaSA9IHt9OworICAgIHJwYmkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPOworICAgIHJwYmkuZnJhbWVidWZmZXIgPSBtX2ZyYW1lYnVmZmVyOworICAgIHJwYmkucmVuZGVyUGFzcyA9IHJwOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKHJwYmkpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtEZXN0cm95UmVuZGVyUGFzcy1yZW5kZXJQYXNzLTAwODczIik7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gV2FpdCBmb3IgcXVldWUgdG8gY29tcGxldGUgc28gd2UgY2FuIHNhZmVseSBkZXN0cm95IHJwCisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIklmIHJlbmRlclBhc3MgaXMgbm90IFZLX05VTExfSEFORExFLCByZW5kZXJQYXNzIG11c3QgYmUgYSB2YWxpZCBWa1JlbmRlclBhc3MgaGFuZGxlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiV2FzIGl0IGNyZWF0ZWQ/IEhhcyBpdCBhbHJlYWR5IGJlZW4gZGVzdHJveWVkPyIpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBGcmFtZWJ1ZmZlckNyZWF0ZUVycm9ycykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJIaXQgZXJyb3JzIHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgYSBmcmFtZWJ1ZmZlciA6XG4iCisgICAgICAgICIgMS4gTWlzbWF0Y2ggYmV0d2VlbiBmcmFtZWJ1ZmZlciAmIHJlbmRlclBhc3MgYXR0YWNobWVudENvdW50XG4iCisgICAgICAgICIgMi4gVXNlIGEgY29sb3IgaW1hZ2UgYXMgZGVwdGhTdGVuY2lsIGF0dGFjaG1lbnRcbiIKKyAgICAgICAgIiAzLiBNaXNtYXRjaCBmcmFtZWJ1ZmZlciAmIHJlbmRlclBhc3MgYXR0YWNobWVudCBmb3JtYXRzXG4iCisgICAgICAgICIgNC4gTWlzbWF0Y2ggZnJhbWVidWZmZXIgJiByZW5kZXJQYXNzIGF0dGFjaG1lbnQgI3NhbXBsZXNcbiIKKyAgICAgICAgIiA1LiBGcmFtZWJ1ZmZlciBhdHRhY2htZW50IHcvIG5vbi0xIG1pcC1sZXZlbHNcbiIKKyAgICAgICAgIiA2LiBGcmFtZWJ1ZmZlciBhdHRhY2htZW50IHdoZXJlIGRpbWVuc2lvbnMgZG9uJ3QgbWF0Y2hcbiIKKyAgICAgICAgIiA3LiBGcmFtZWJ1ZmZlciBhdHRhY2htZW50IHdoZXJlIGRpbWVuc2lvbnMgZG9uJ3QgbWF0Y2hcbiIKKyAgICAgICAgIiA4LiBGcmFtZWJ1ZmZlciBhdHRhY2htZW50IHcvbyBpZGVudGl0eSBzd2l6emxlXG4iCisgICAgICAgICIgOS4gZnJhbWVidWZmZXIgZGltZW5zaW9ucyBleGNlZWQgcGh5c2ljYWwgZGV2aWNlIGxpbWl0c1xuIgorICAgICAgICAiMTAuIG51bGwgcEF0dGFjaG1lbnRzXG4iKTsKKworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMgorICAgIGJvb2wgcHVzaF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllc18yX3N1cHBvcnQgPQorICAgICAgICBJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmIChwdXNoX3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzJfc3VwcG9ydCkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGJvb2wgcHVzaF9mcmFnbWVudF9kZW5zaXR5X3N1cHBvcnQgPSBmYWxzZTsKKworICAgIGlmIChwdXNoX3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzXzJfc3VwcG9ydCkgeworICAgICAgICBwdXNoX2ZyYWdtZW50X2RlbnNpdHlfc3VwcG9ydCA9IERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX0ZSQUdNRU5UX0RFTlNJVFlfTUFQX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgaWYgKHB1c2hfZnJhZ21lbnRfZGVuc2l0eV9zdXBwb3J0KSBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsIG51bGxwdHIsIDApKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1hdHRhY2htZW50Q291bnQtMDA4NzYiKTsKKworICAgIC8vIENyZWF0ZSBhIHJlbmRlclBhc3Mgd2l0aCBhIHNpbmdsZSBjb2xvciBhdHRhY2htZW50CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGF0dGFjaCA9IHt9OworICAgIGF0dGFjaC5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0ge307CisgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50cyA9ICZhdHRhY2g7CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge307CisgICAgcnBjaS5zdWJwYXNzQ291bnQgPSAxOworICAgIHJwY2kucFN1YnBhc3NlcyA9ICZzdWJwYXNzOworICAgIHJwY2kuYXR0YWNobWVudENvdW50ID0gMTsKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2hfZGVzYyA9IHt9OworICAgIGF0dGFjaF9kZXNjLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBhdHRhY2hfZGVzYy5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgcnBjaS5wQXR0YWNobWVudHMgPSAmYXR0YWNoX2Rlc2M7CisgICAgcnBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ltYWdlVmlldyBpdnNbMl07CisgICAgaXZzWzBdID0gbV9yZW5kZXJUYXJnZXRzWzBdLT50YXJnZXRWaWV3KFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSk7CisgICAgaXZzWzFdID0gbV9yZW5kZXJUYXJnZXRzWzBdLT50YXJnZXRWaWV3KFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSk7CisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmJfaW5mbyA9IHt9OworICAgIGZiX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBmYl9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBmYl9pbmZvLnJlbmRlclBhc3MgPSBycDsKKyAgICAvLyBTZXQgbWlzLW1hdGNoaW5nIGF0dGFjaG1lbnRDb3VudAorICAgIGZiX2luZm8uYXR0YWNobWVudENvdW50ID0gMjsKKyAgICBmYl9pbmZvLnBBdHRhY2htZW50cyA9IGl2czsKKyAgICBmYl9pbmZvLndpZHRoID0gMTAwOworICAgIGZiX2luZm8uaGVpZ2h0ID0gMTAwOworICAgIGZiX2luZm8ubGF5ZXJzID0gMTsKKworICAgIFZrRnJhbWVidWZmZXIgZmI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKGRldmljZSgpLCAmZmJfaW5mbywgTlVMTCwgJmZiKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworICAgIH0KKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgTlVMTCk7CisKKyAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHdpdGggYSBkZXB0aC1zdGVuY2lsIGF0dGFjaG1lbnQgY3JlYXRlZCB3aXRoCisgICAgLy8gSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVAorICAgIC8vIEFkZCBvdXIgY29sb3IgYXR0YWNobWVudCB0byBwRGVwdGhTdGVuY2lsQXR0YWNobWVudAorICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSAmYXR0YWNoOworICAgIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHMgPSBOVUxMOworICAgIFZrUmVuZGVyUGFzcyBycF9kczsKKyAgICBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnBfZHMpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgLy8gU2V0IGNvcnJlY3QgYXR0YWNobWVudCBjb3VudCwgYnV0IGF0dGFjaG1lbnQgaGFzIENPTE9SIHVzYWdlIGJpdCBzZXQKKyAgICBmYl9pbmZvLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgZmJfaW5mby5yZW5kZXJQYXNzID0gcnBfZHM7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjYzMyIpOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UoKSwgJmZiX2luZm8sIE5VTEwsICZmYik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBOVUxMKTsKKyAgICB9CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnBfZHMsIE5VTEwpOworCisgICAgLy8gQ3JlYXRlIG5ldyByZW5kZXJwYXNzIHdpdGggYWx0ZXJuYXRlIGF0dGFjaG1lbnQgZm9ybWF0IGZyb20gZmIKKyAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgc3VicGFzcy5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IE5VTEw7CisgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50cyA9ICZhdHRhY2g7CisgICAgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gQ2F1c2UgZXJyb3IgZHVlIHRvIG1pcy1tYXRjaGVkIGZvcm1hdHMgYmV0d2VlbiBycCAmIGZiCisgICAgLy8gIHJwIGF0dGFjaG1lbnQgMCBub3cgaGFzIFJHQkE4IGJ1dCBjb3JyZXNwb25kaW5nIGZiIGF0dGFjaCBpcyBCR1JBOAorICAgIGZiX2luZm8ucmVuZGVyUGFzcyA9IHJwOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODgwIik7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKGRldmljZSgpLCAmZmJfaW5mbywgTlVMTCwgJmZiKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworICAgIH0KKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgTlVMTCk7CisKKyAgICAvLyBDcmVhdGUgbmV3IHJlbmRlcnBhc3Mgd2l0aCBhbHRlcm5hdGUgc2FtcGxlIGNvdW50IGZyb20gZmIKKyAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgYXR0YWNoX2Rlc2Muc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBDYXVzZSBlcnJvciBkdWUgdG8gbWlzLW1hdGNoZWQgc2FtcGxlIGNvdW50IGJldHdlZW4gcnAgJiBmYgorICAgIGZiX2luZm8ucmVuZGVyUGFzcyA9IHJwOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAwODgxIik7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKGRldmljZSgpLCAmZmJfaW5mbywgTlVMTCwgJmZiKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworICAgIH0KKworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBOVUxMKTsKKworICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGltYWdlIHdpdGggMiBtaXAgbGV2ZWxzLgorICAgICAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICAgICAgaW1hZ2UuSW5pdCgxMjgsIDEyOCwgMiwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgICAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBpbWFnZSB2aWV3IHdpdGggdHdvIG1pcCBsZXZlbHMuCisgICAgICAgIFZrSW1hZ2VWaWV3IHZpZXc7CisgICAgICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpdmNpID0ge307CisgICAgICAgIGl2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgICAgICBpdmNpLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgICAgIGl2Y2kudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgICAgIGl2Y2kuZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgICAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgICAgICAvLyBTZXQgbGV2ZWwgY291bnQgdG8gMiAob25seSAxIGlzIGFsbG93ZWQgZm9yIEZCIGF0dGFjaG1lbnQpCisgICAgICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMjsKKyAgICAgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJml2Y2ksIE5VTEwsICZ2aWV3KTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICAvLyBSZS1jcmVhdGUgcmVuZGVycGFzcyB0byBoYXZlIG1hdGNoaW5nIHNhbXBsZSBjb3VudAorICAgICAgICBhdHRhY2hfZGVzYy5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgICAgIGZiX2luZm8ucmVuZGVyUGFzcyA9IHJwOworICAgICAgICBmYl9pbmZvLnBBdHRhY2htZW50cyA9ICZ2aWV3OworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4MyIpOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlKCksICZmYl9pbmZvLCBOVUxMLCAmZmIpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCB2aWV3LCBOVUxMKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdmlldyB0byBvcmlnaW5hbCBjb2xvciBidWZmZXIgYW5kIGdyb3cgRkIgZGltZW5zaW9ucyB0b28gYmlnCisgICAgZmJfaW5mby5wQXR0YWNobWVudHMgPSBpdnM7CisgICAgZmJfaW5mby5oZWlnaHQgPSAxMDI0OworICAgIGZiX2luZm8ud2lkdGggPSAxMDI0OworICAgIGZiX2luZm8ubGF5ZXJzID0gMjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4MiIpOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UoKSwgJmZiX2luZm8sIE5VTEwsICZmYik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBOVUxMKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGlmICghcHVzaF9mcmFnbWVudF9kZW5zaXR5X3N1cHBvcnQpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgVktfRVhUX2ZyYWdtZW50X2RlbnNpdHlfbWFwIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgYXR0YWNobWVudF93aWR0aCA9IDUxMjsKKyAgICAgICAgICAgIHVpbnQzMl90IGF0dGFjaG1lbnRfaGVpZ2h0ID0gNTEyOworICAgICAgICAgICAgVmtGb3JtYXQgYXR0YWNobWVudF9mb3JtYXQgPSBWS19GT1JNQVRfUjhHOF9VTk9STTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX3dpZHRoID0gNTEyOworICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaGVpZ2h0ID0gNTEyOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHdpdGggYSBzaW5nbGUgY29sb3IgYXR0YWNobWVudCBmb3IgZnJhZ21lbnQgZGVuc2l0eSBtYXAKKyAgICAgICAgICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRhY2hfZnJhZ21lbnRfZGVuc2l0eV9tYXAgPSB7fTsKKyAgICAgICAgICAgIGF0dGFjaF9mcmFnbWVudF9kZW5zaXR5X21hcC5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICAgICAgICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3NfZnJhZ21lbnRfZGVuc2l0eV9tYXAgPSB7fTsKKyAgICAgICAgICAgIHN1YnBhc3NfZnJhZ21lbnRfZGVuc2l0eV9tYXAucENvbG9yQXR0YWNobWVudHMgPSAmYXR0YWNoX2ZyYWdtZW50X2RlbnNpdHlfbWFwOworICAgICAgICAgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpX2ZyYWdtZW50X2RlbnNpdHlfbWFwID0ge307CisgICAgICAgICAgICBycGNpX2ZyYWdtZW50X2RlbnNpdHlfbWFwLnN1YnBhc3NDb3VudCA9IDE7CisgICAgICAgICAgICBycGNpX2ZyYWdtZW50X2RlbnNpdHlfbWFwLnBTdWJwYXNzZXMgPSAmc3VicGFzc19mcmFnbWVudF9kZW5zaXR5X21hcDsKKyAgICAgICAgICAgIHJwY2lfZnJhZ21lbnRfZGVuc2l0eV9tYXAuYXR0YWNobWVudENvdW50ID0gMTsKKyAgICAgICAgICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaF9kZXNjX2ZyYWdtZW50X2RlbnNpdHlfbWFwID0ge307CisgICAgICAgICAgICBhdHRhY2hfZGVzY19mcmFnbWVudF9kZW5zaXR5X21hcC5mb3JtYXQgPSBhdHRhY2htZW50X2Zvcm1hdDsKKyAgICAgICAgICAgIGF0dGFjaF9kZXNjX2ZyYWdtZW50X2RlbnNpdHlfbWFwLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgICAgICAgICBhdHRhY2hfZGVzY19mcmFnbWVudF9kZW5zaXR5X21hcC5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9GUkFHTUVOVF9ERU5TSVRZX01BUF9PUFRJTUFMX0VYVDsKKyAgICAgICAgICAgIHJwY2lfZnJhZ21lbnRfZGVuc2l0eV9tYXAucEF0dGFjaG1lbnRzID0gJmF0dGFjaF9kZXNjX2ZyYWdtZW50X2RlbnNpdHlfbWFwOworICAgICAgICAgICAgcnBjaV9mcmFnbWVudF9kZW5zaXR5X21hcC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOworICAgICAgICAgICAgVmtSZW5kZXJQYXNzIHJwX2ZyYWdtZW50X2RlbnNpdHlfbWFwOworCisgICAgICAgICAgICBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpX2ZyYWdtZW50X2RlbnNpdHlfbWFwLCBOVUxMLCAmcnBfZnJhZ21lbnRfZGVuc2l0eV9tYXApOworICAgICAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIHZpZXcgYXR0YWNobWVudAorICAgICAgICAgICAgVmtJbWFnZVZpZXcgdmlld19mcmFnbWVudF9kZW5zaXR5X21hcDsKKyAgICAgICAgICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpdmNpID0ge307CisgICAgICAgICAgICBpdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIGl2Y2kudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgICAgICAgICBpdmNpLmZvcm1hdCA9IGF0dGFjaG1lbnRfZm9ybWF0OworICAgICAgICAgICAgaXZjaS5mbGFncyA9IDA7CisgICAgICAgICAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgICAgICAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICAgICAgICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICAgICAgICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKworICAgICAgICAgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgZmJfZmRtID0ge307CisgICAgICAgICAgICBmYl9mZG0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0lNQUdFX0lORk9fS0hSOworICAgICAgICAgICAgZmJfZmRtLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVDsKKyAgICAgICAgICAgIGZiX2ZkbS53aWR0aCA9IGZyYW1lX3dpZHRoOworICAgICAgICAgICAgZmJfZmRtLmhlaWdodCA9IGZyYW1lX2hlaWdodDsKKyAgICAgICAgICAgIGZiX2ZkbS5sYXllckNvdW50ID0gMTsKKyAgICAgICAgICAgIGZiX2ZkbS52aWV3Rm9ybWF0Q291bnQgPSAxOworICAgICAgICAgICAgZmJfZmRtLnBWaWV3Rm9ybWF0cyA9ICZhdHRhY2htZW50X2Zvcm1hdDsKKyAgICAgICAgICAgIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgZmJfYWNpX2ZkbSA9IHt9OworICAgICAgICAgICAgZmJfYWNpX2ZkbS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRTX0NSRUFURV9JTkZPX0tIUjsKKyAgICAgICAgICAgIGZiX2FjaV9mZG0uYXR0YWNobWVudEltYWdlSW5mb0NvdW50ID0gMTsKKyAgICAgICAgICAgIGZiX2FjaV9mZG0ucEF0dGFjaG1lbnRJbWFnZUluZm9zID0gJmZiX2ZkbTsKKworICAgICAgICAgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmJjaSA9IHt9OworICAgICAgICAgICAgZmJjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPOworICAgICAgICAgICAgZmJjaS5wTmV4dCA9ICZmYl9hY2lfZmRtOworICAgICAgICAgICAgZmJjaS5mbGFncyA9IDA7CisgICAgICAgICAgICBmYmNpLndpZHRoID0gZnJhbWVfd2lkdGg7CisgICAgICAgICAgICBmYmNpLmhlaWdodCA9IGZyYW1lX2hlaWdodDsKKyAgICAgICAgICAgIGZiY2kubGF5ZXJzID0gMTsKKyAgICAgICAgICAgIGZiY2kucmVuZGVyUGFzcyA9IHJwX2ZyYWdtZW50X2RlbnNpdHlfbWFwOworICAgICAgICAgICAgZmJjaS5hdHRhY2htZW50Q291bnQgPSAxOworICAgICAgICAgICAgZmJjaS5wQXR0YWNobWVudHMgPSAmdmlld19mcmFnbWVudF9kZW5zaXR5X21hcDsKKworICAgICAgICAgICAgLy8gU2V0IHNtYWxsIHdpZHRoCisgICAgICAgICAgICBWa0ltYWdlT2JqIGltYWdlMihtX2RldmljZSk7CisgICAgICAgICAgICBpbWFnZTIuSW5pdCgxNiwgYXR0YWNobWVudF9oZWlnaHQsIDEsIGF0dGFjaG1lbnRfZm9ybWF0LCBWS19JTUFHRV9VU0FHRV9GUkFHTUVOVF9ERU5TSVRZX01BUF9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX0xJTkVBUiwgMCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpbWFnZTIuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgICAgIGl2Y2kuaW1hZ2UgPSBpbWFnZTIuaGFuZGxlKCk7CisgICAgICAgICAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJml2Y2ksIE5VTEwsICZ2aWV3X2ZyYWdtZW50X2RlbnNpdHlfbWFwKTsKKyAgICAgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgICAgIGZiY2kucEF0dGFjaG1lbnRzID0gJnZpZXdfZnJhZ21lbnRfZGVuc2l0eV9tYXA7CisKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcEF0dGFjaG1lbnRzLTAyNTU1Iik7CisgICAgICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlKCksICZmYmNpLCBOVUxMLCAmZmIpOworCisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgTlVMTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlld19mcmFnbWVudF9kZW5zaXR5X21hcCwgTlVMTCk7CisKKyAgICAgICAgICAgIC8vIFNldCBzbWFsbCBoZWlnaHQKKyAgICAgICAgICAgIFZrSW1hZ2VPYmogaW1hZ2UzKG1fZGV2aWNlKTsKKyAgICAgICAgICAgIGltYWdlMy5Jbml0KGF0dGFjaG1lbnRfd2lkdGgsIDE2LCAxLCBhdHRhY2htZW50X2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfRlJBR01FTlRfREVOU0lUWV9NQVBfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19MSU5FQVIsIDApOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaW1hZ2UzLmluaXRpYWxpemVkKCkpOworCisgICAgICAgICAgICBpdmNpLmltYWdlID0gaW1hZ2UzLmhhbmRsZSgpOworICAgICAgICAgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZpdmNpLCBOVUxMLCAmdmlld19mcmFnbWVudF9kZW5zaXR5X21hcCk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgICAgICAgICBmYmNpLnBBdHRhY2htZW50cyA9ICZ2aWV3X2ZyYWdtZW50X2RlbnNpdHlfbWFwOworCisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMjU1NiIpOworICAgICAgICAgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKGRldmljZSgpLCAmZmJjaSwgTlVMTCwgJmZiKTsKKworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgICAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXdfZnJhZ21lbnRfZGVuc2l0eV9tYXAsIE5VTEwpOworCisgICAgICAgICAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycF9mcmFnbWVudF9kZW5zaXR5X21hcCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIENyZWF0ZSBhbiBpbWFnZSB3aXRoIG9uZSBtaXAgbGV2ZWwuCisgICAgICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgICAgICBpbWFnZS5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgICAgIC8vIENyZWF0ZSB2aWV3IGF0dGFjaG1lbnQgd2l0aCBub24taWRlbnRpdHkgc3dpenpsZQorICAgICAgICBWa0ltYWdlVmlldyB2aWV3OworICAgICAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHt9OworICAgICAgICBpdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICAgICAgaXZjaS5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgICAgICBpdmNpLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgICAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICAgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgICAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICAgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgICAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIGl2Y2kuY29tcG9uZW50cy5yID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfRzsKKyAgICAgICAgaXZjaS5jb21wb25lbnRzLmcgPSBWS19DT01QT05FTlRfU1dJWlpMRV9SOworICAgICAgICBpdmNpLmNvbXBvbmVudHMuYiA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0E7CisgICAgICAgIGl2Y2kuY29tcG9uZW50cy5hID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQjsKKyAgICAgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZpdmNpLCBOVUxMLCAmdmlldyk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgZmJfaW5mby5wQXR0YWNobWVudHMgPSAmdmlldzsKKyAgICAgICAgZmJfaW5mby5oZWlnaHQgPSAxMDA7CisgICAgICAgIGZiX2luZm8ud2lkdGggPSAxMDA7CisgICAgICAgIGZiX2luZm8ubGF5ZXJzID0gMTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4NCIpOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlKCksICZmYl9pbmZvLCBOVUxMLCAmZmIpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCB2aWV3LCBOVUxMKTsKKyAgICB9CisKKyAgICAvLyByZXNldCBhdHRhY2htZW50IHRvIGNvbG9yIGF0dGFjaG1lbnQKKyAgICBmYl9pbmZvLnBBdHRhY2htZW50cyA9IGl2czsKKworICAgIC8vIFJlcXVlc3QgZmIgdGhhdCBleGNlZWRzIG1heCB3aWR0aAorICAgIGZiX2luZm8ud2lkdGggPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heEZyYW1lYnVmZmVyV2lkdGggKyAxOworICAgIGZiX2luZm8uaGVpZ2h0ID0gMTAwOworICAgIGZiX2luZm8ubGF5ZXJzID0gMTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXdpZHRoLTAwODg2Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODIiKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlKCksICZmYl9pbmZvLCBOVUxMLCAmZmIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworICAgIH0KKyAgICAvLyBhbmQgd2lkdGg9MAorICAgIGZiX2luZm8ud2lkdGggPSAwOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8td2lkdGgtMDA4ODUiKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlKCksICZmYl9pbmZvLCBOVUxMLCAmZmIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworICAgIH0KKworICAgIC8vIFJlcXVlc3QgZmIgdGhhdCBleGNlZWRzIG1heCBoZWlnaHQKKyAgICBmYl9pbmZvLndpZHRoID0gMTAwOworICAgIGZiX2luZm8uaGVpZ2h0ID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhGcmFtZWJ1ZmZlckhlaWdodCArIDE7CisgICAgZmJfaW5mby5sYXllcnMgPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8taGVpZ2h0LTAwODg4Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1wQXR0YWNobWVudHMtMDA4ODIiKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlKCksICZmYl9pbmZvLCBOVUxMLCAmZmIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworICAgIH0KKyAgICAvLyBhbmQgaGVpZ2h0PTAKKyAgICBmYl9pbmZvLmhlaWdodCA9IDA7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1oZWlnaHQtMDA4ODciKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlKCksICZmYl9pbmZvLCBOVUxMLCAmZmIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChlcnIgPT0gVktfU1VDQ0VTUykgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworICAgIH0KKworICAgIC8vIFJlcXVlc3QgZmIgdGhhdCBleGNlZWRzIG1heCBsYXllcnMKKyAgICBmYl9pbmZvLndpZHRoID0gMTAwOworICAgIGZiX2luZm8uaGVpZ2h0ID0gMTAwOworICAgIGZiX2luZm8ubGF5ZXJzID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhGcmFtZWJ1ZmZlckxheWVycyArIDE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1sYXllcnMtMDA4OTAiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXBBdHRhY2htZW50cy0wMDg4MiIpOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UoKSwgJmZiX2luZm8sIE5VTEwsICZmYik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgTlVMTCk7CisgICAgfQorICAgIC8vIGFuZCBsYXllcnM9MAorICAgIGZiX2luZm8ubGF5ZXJzID0gMDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWxheWVycy0wMDg4OSIpOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UoKSwgJmZiX2luZm8sIE5VTEwsICZmYik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgTlVMTCk7CisgICAgfQorCisgICAgLy8gVHJ5IHRvIGNyZWF0ZSB3aXRoIHBBdHRhY2htZW50cyA9IE5VTEwKKyAgICBmYl9pbmZvLmxheWVycyA9IDE7CisgICAgZmJfaW5mby5wQXR0YWNobWVudHMgPSBOVUxMOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSURfVW5kZWZpbmVkIik7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKGRldmljZSgpLCAmZmJfaW5mbywgTlVMTCwgJmZiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBOVUxMKTsKKyAgICB9CisKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQWxsb2NEZXNjcmlwdG9yRnJvbUVtcHR5UG9vbCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gYWxsb2NhdGUgbW9yZSBzZXRzIGFuZCBkZXNjcmlwdG9ycyB0aGFuIGRlc2NyaXB0b3IgcG9vbCBoYXMgYXZhaWxhYmxlLiIpOworICAgIFZrUmVzdWx0IGVycjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIFRoaXMgdGVzdCBpcyB2YWxpZCBmb3IgVnVsa2FuIDEuMCBvbmx5IC0tIHNraXAgaWYgZGV2aWNlIGhhcyBhbiBBUEkgdmVyc2lvbiBncmVhdGVyIHRoYW4gMS4wLgorICAgIGlmIChtX2RldmljZS0+cHJvcHMuYXBpVmVyc2lvbiA+PSBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEZXZpY2UgaGFzIGFwaVZlcnNpb24gZ3JlYXRlciB0aGFuIDEuMCAtLSBza2lwcGluZyBEZXNjcmlwdG9yIFNldCBjaGVja3MuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgUG9vbCB3LyAxIFNhbXBsZXIgZGVzY3JpcHRvciwgYnV0IHRyeSB0byBhbGxvYyBVbmlmb3JtIEJ1ZmZlcgorICAgIC8vIGRlc2NyaXB0b3IgZnJvbSBpdAorICAgIFZrRGVzY3JpcHRvclBvb2xTaXplIGRzX3R5cGVfY291bnQgPSB7fTsKKyAgICBkc190eXBlX2NvdW50LnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjsKKyAgICBkc190eXBlX2NvdW50LmRlc2NyaXB0b3JDb3VudCA9IDI7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBkc19wb29sX2NpID0ge307CisgICAgZHNfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBkc19wb29sX2NpLnBOZXh0ID0gTlVMTDsKKyAgICBkc19wb29sX2NpLmZsYWdzID0gMDsKKyAgICBkc19wb29sX2NpLm1heFNldHMgPSAxOworICAgIGRzX3Bvb2xfY2kucG9vbFNpemVDb3VudCA9IDE7CisgICAgZHNfcG9vbF9jaS5wUG9vbFNpemVzID0gJmRzX3R5cGVfY291bnQ7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sIGRzX3Bvb2w7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzX3Bvb2xfY2ksIE5VTEwsICZkc19wb29sKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkc2xfYmluZGluZ19zYW1wID0ge307CisgICAgZHNsX2JpbmRpbmdfc2FtcC5iaW5kaW5nID0gMDsKKyAgICBkc2xfYmluZGluZ19zYW1wLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI7CisgICAgZHNsX2JpbmRpbmdfc2FtcC5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRzbF9iaW5kaW5nX3NhbXAuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9BTEw7CisgICAgZHNsX2JpbmRpbmdfc2FtcC5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzX2xheW91dF9zYW1wKG1fZGV2aWNlLCB7ZHNsX2JpbmRpbmdfc2FtcH0pOworCisgICAgLy8gVHJ5IHRvIGFsbG9jYXRlIDIgc2V0cyB3aGVuIHBvb2wgb25seSBoYXMgMSBzZXQKKyAgICBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXRzWzJdOworICAgIFZrRGVzY3JpcHRvclNldExheW91dCBzZXRfbGF5b3V0c1syXSA9IHtkc19sYXlvdXRfc2FtcC5oYW5kbGUoKSwgZHNfbGF5b3V0X3NhbXAuaGFuZGxlKCl9OworICAgIFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyBhbGxvY19pbmZvID0ge307CisgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0FMTE9DQVRFX0lORk87CisgICAgYWxsb2NfaW5mby5kZXNjcmlwdG9yU2V0Q291bnQgPSAyOworICAgIGFsbG9jX2luZm8uZGVzY3JpcHRvclBvb2wgPSBkc19wb29sOworICAgIGFsbG9jX2luZm8ucFNldExheW91dHMgPSBzZXRfbGF5b3V0czsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1kZXNjcmlwdG9yU2V0Q291bnQtMDAzMDYiKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCBkZXNjcmlwdG9yX3NldHMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgYWxsb2NfaW5mby5kZXNjcmlwdG9yU2V0Q291bnQgPSAxOworICAgIC8vIENyZWF0ZSBsYXlvdXQgdy8gZGVzY3JpcHRvciB0eXBlIG5vdCBhdmFpbGFibGUgaW4gcG9vbAorICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZHNsX2JpbmRpbmcgPSB7fTsKKyAgICBkc2xfYmluZGluZy5iaW5kaW5nID0gMDsKKyAgICBkc2xfYmluZGluZy5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjsKKyAgICBkc2xfYmluZGluZy5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRzbF9iaW5kaW5nLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfQUxMOworICAgIGRzbF9iaW5kaW5nLnBJbW11dGFibGVTYW1wbGVycyA9IE5VTEw7CisKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogZHNfbGF5b3V0X3ViKG1fZGV2aWNlLCB7ZHNsX2JpbmRpbmd9KTsKKworICAgIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKKyAgICBhbGxvY19pbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA9IDE7CisgICAgYWxsb2NfaW5mby5wU2V0TGF5b3V0cyA9ICZkc19sYXlvdXRfdWIuaGFuZGxlKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tZGVzY3JpcHRvclBvb2wtMDAzMDciKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCAmZGVzY3JpcHRvcl9zZXQpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfcG9vbCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRnJlZURlc2NyaXB0b3JGcm9tT25lU2hvdFBvb2wpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLWRlc2NyaXB0b3JQb29sLTAwMzEyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sU2l6ZSBkc190eXBlX2NvdW50ID0ge307CisgICAgZHNfdHlwZV9jb3VudC50eXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRzX3R5cGVfY291bnQuZGVzY3JpcHRvckNvdW50ID0gMTsKKworICAgIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIGRzX3Bvb2xfY2kgPSB7fTsKKyAgICBkc19wb29sX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9JTkZPOworICAgIGRzX3Bvb2xfY2kucE5leHQgPSBOVUxMOworICAgIGRzX3Bvb2xfY2kubWF4U2V0cyA9IDE7CisgICAgZHNfcG9vbF9jaS5wb29sU2l6ZUNvdW50ID0gMTsKKyAgICBkc19wb29sX2NpLmZsYWdzID0gMDsKKyAgICAvLyBOb3Qgc3BlY2lmeWluZyBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0ZSRUVfREVTQ1JJUFRPUl9TRVRfQklUIG1lYW5zCisgICAgLy8gYXBwIGNhbiBvbmx5IGNhbGwgdms6OlJlc2V0RGVzY3JpcHRvclBvb2wgb24gdGhpcyBwb29sLjsKKyAgICBkc19wb29sX2NpLnBQb29sU2l6ZXMgPSAmZHNfdHlwZV9jb3VudDsKKworICAgIFZrRGVzY3JpcHRvclBvb2wgZHNfcG9vbDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfcG9vbF9jaSwgTlVMTCwgJmRzX3Bvb2wpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGRzbF9iaW5kaW5nID0ge307CisgICAgZHNsX2JpbmRpbmcuYmluZGluZyA9IDA7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkc2xfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0FMTDsKKyAgICBkc2xfYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzX2xheW91dChtX2RldmljZSwge2RzbF9iaW5kaW5nfSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldDsKKyAgICBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgIGFsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPOworICAgIGFsbG9jX2luZm8uZGVzY3JpcHRvclNldENvdW50ID0gMTsKKyAgICBhbGxvY19pbmZvLmRlc2NyaXB0b3JQb29sID0gZHNfcG9vbDsKKyAgICBhbGxvY19pbmZvLnBTZXRMYXlvdXRzID0gJmRzX2xheW91dC5oYW5kbGUoKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCAmZGVzY3JpcHRvclNldCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGVyciA9IHZrOjpGcmVlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCBkc19wb29sLCAxLCAmZGVzY3JpcHRvclNldCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfcG9vbCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZERlc2NyaXB0b3JQb29sKSB7CisgICAgLy8gQXR0ZW1wdCB0byBjbGVhciBEZXNjcmlwdG9yIFBvb2wgd2l0aCBiYWQgb2JqZWN0LgorICAgIC8vIE9iamVjdFRyYWNrZXIgc2hvdWxkIGNhdGNoIHRoaXMuCisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtSZXNldERlc2NyaXB0b3JQb29sLWRlc2NyaXB0b3JQb29sLXBhcmFtZXRlciIpOworICAgIHVpbnQ2NF90IGZha2VfcG9vbF9oYW5kbGUgPSAweGJhYWQ2MDAxOworICAgIFZrRGVzY3JpcHRvclBvb2wgYmFkX3Bvb2wgPSByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclBvb2wgJj4oZmFrZV9wb29sX2hhbmRsZSk7CisgICAgdms6OlJlc2V0RGVzY3JpcHRvclBvb2woZGV2aWNlKCksIGJhZF9wb29sLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkRGVzY3JpcHRvclNldCkgeworICAgIC8vIEF0dGVtcHQgdG8gYmluZCBhbiBpbnZhbGlkIERlc2NyaXB0b3IgU2V0IHRvIGEgdmFsaWQgQ29tbWFuZCBCdWZmZXIKKyAgICAvLyBPYmplY3RUcmFja2VyIHNob3VsZCBjYXRjaCB0aGlzLgorICAgIC8vIENyZWF0ZSBhIHZhbGlkIGNtZCBidWZmZXIKKyAgICAvLyBjYWxsIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMgdy8gZmFsc2UgRGVzY3JpcHRvciBTZXQKKworICAgIHVpbnQ2NF90IGZha2Vfc2V0X2hhbmRsZSA9IDB4YmFhZDYwMDE7CisgICAgVmtEZXNjcmlwdG9yU2V0IGJhZF9zZXQgPSByZWludGVycHJldF9jYXN0PFZrRGVzY3JpcHRvclNldCAmPihmYWtlX3NldF9oYW5kbGUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJpbmREZXNjcmlwdG9yU2V0cy1wRGVzY3JpcHRvclNldHMtcGFyYW1ldGVyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBsYXlvdXRfYmluZGluZyA9IHt9OworICAgIGxheW91dF9iaW5kaW5nLmJpbmRpbmcgPSAwOworICAgIGxheW91dF9iaW5kaW5nLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGxheW91dF9iaW5kaW5nLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgbGF5b3V0X2JpbmRpbmcuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOworICAgIGxheW91dF9iaW5kaW5nLnBJbW11dGFibGVTYW1wbGVycyA9IE5VTEw7CisKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogZGVzY3JpcHRvcl9zZXRfbGF5b3V0KG1fZGV2aWNlLCB7bGF5b3V0X2JpbmRpbmd9KTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KERldmljZU9iaigpLCB7JmRlc2NyaXB0b3Jfc2V0X2xheW91dH0pOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLCAmYmFkX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZERlc2NyaXB0b3JTZXRMYXlvdXQpIHsKKyAgICAvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhIFBpcGVsaW5lIExheW91dCB3aXRoIGFuIGludmFsaWQgRGVzY3JpcHRvciBTZXQgTGF5b3V0LgorICAgIC8vIE9iamVjdFRyYWNrZXIgc2hvdWxkIGNhdGNoIHRoaXMuCisgICAgdWludDY0X3QgZmFrZV9sYXlvdXRfaGFuZGxlID0gMHhiYWFkNjAwMTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgYmFkX2xheW91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0ICY+KGZha2VfbGF5b3V0X2hhbmRsZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy1wYXJhbWV0ZXIiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVfbGF5b3V0OworICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHBsY2kgPSB7fTsKKyAgICBwbGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBsY2kucE5leHQgPSBOVUxMOworICAgIHBsY2kuc2V0TGF5b3V0Q291bnQgPSAxOworICAgIHBsY2kucFNldExheW91dHMgPSAmYmFkX2xheW91dDsKKyAgICB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQoZGV2aWNlKCksICZwbGNpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFdyaXRlRGVzY3JpcHRvclNldEludGVncml0eUNoZWNrKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRoaXMgdGVzdCB2ZXJpZmllcyBzb21lIHJlcXVpcmVtZW50cyBvZiBjaGFwdGVyIDEzLjIuMyBvZiB0aGUgVnVsa2FuIFNwZWMgIgorICAgICAgICAiMSkgQSB1bmlmb3JtIGJ1ZmZlciB1cGRhdGUgbXVzdCBoYXZlIGEgdmFsaWQgYnVmZmVyIGluZGV4LiAiCisgICAgICAgICIyKSBXaGVuIHVzaW5nIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JzIGluIGEgc2luZ2xlIFdyaXRlRGVzY3JpcHRvciwgdGhlIGRlc2NyaXB0b3IgdHlwZXMgYW5kIHN0YWdlZmxhZ3MgIgorICAgICAgICAibXVzdCBhbGwgYmUgdGhlIHNhbWUuICIKKyAgICAgICAgIjMpIEltbXV0YWJsZSBTYW1wbGVyIHN0YXRlIG11c3QgbWF0Y2ggYWNyb3NzIGRlc2NyaXB0b3JzLiAiCisgICAgICAgICI0KSBUaGF0IHNhbXBsZWQgaW1hZ2UgZGVzY3JpcHRvcnMgaGF2ZSByZXF1aXJlZCBsYXlvdXRzLiAiKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgTlVMTCwgJnNhbXBsZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0OjpCaW5kaW5ncyBiaW5kaW5ncyA9IHsKKyAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgTlVMTH0sCisgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgTlVMTH0sCisgICAgICAgIHsyLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgc3RhdGljX2Nhc3Q8VmtTYW1wbGVyICo+KCZzYW1wbGVyKX0sCisgICAgICAgIHszLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgTlVMTH19OworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIGJpbmRpbmdzKTsKKyAgICBBU1NFUlRfVFJVRShkZXNjcmlwdG9yX3NldC5Jbml0aWFsaXplZCgpKTsKKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGUgPSB7fTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RTZXQgPSBkZXNjcmlwdG9yX3NldC5zZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0QmluZGluZyA9IDA7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisKKyAgICAvLyAxKSBUaGUgdW5pZm9ybSBidWZmZXIgaXMgaW50ZW50aW9uYWxseSBpbnZhbGlkIGhlcmUKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDcmVhdGUgYSBidWZmZXIgdG8gdXBkYXRlIHRoZSBkZXNjcmlwdG9yIHdpdGgKKyAgICB1aW50MzJfdCBxZmkgPSAwOworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmQ0kgPSB7fTsKKyAgICBidWZmQ0kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgYnVmZkNJLnNpemUgPSAxMDI0OworICAgIGJ1ZmZDSS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQ7CisgICAgYnVmZkNJLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgYnVmZkNJLnBRdWV1ZUZhbWlseUluZGljZXMgPSAmcWZpOworCisgICAgVmtCdWZmZXJPYmogZHluYW1pY191bmlmb3JtX2J1ZmZlcjsKKyAgICBkeW5hbWljX3VuaWZvcm1fYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBidWZmQ0kpOworCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmSW5mb1syXSA9IHt9OworICAgIGJ1ZmZJbmZvWzBdLmJ1ZmZlciA9IGR5bmFtaWNfdW5pZm9ybV9idWZmZXIuaGFuZGxlKCk7CisgICAgYnVmZkluZm9bMF0ub2Zmc2V0ID0gMDsKKyAgICBidWZmSW5mb1swXS5yYW5nZSA9IDEwMjQ7CisgICAgYnVmZkluZm9bMV0uYnVmZmVyID0gZHluYW1pY191bmlmb3JtX2J1ZmZlci5oYW5kbGUoKTsKKyAgICBidWZmSW5mb1sxXS5vZmZzZXQgPSAwOworICAgIGJ1ZmZJbmZvWzFdLnJhbmdlID0gMTAyNDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBCdWZmZXJJbmZvID0gYnVmZkluZm87CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAyOworCisgICAgLy8gMikgVGhlIHN0YXRlRmxhZ3MgZG9uJ3QgbWF0Y2ggYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBkZXNjcmlwdG9yCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kc3RBcnJheUVsZW1lbnQtMDAzMjEiKTsKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyAzKSBUaGUgc2Vjb25kIGRlc2NyaXB0b3IgaGFzIGEgbnVsbF9wdHIgcEltbXV0YWJsZVNhbXBsZXJzIGFuZAorICAgIC8vIHRoZSB0aGlyZCBkZXNjcmlwdG9yIGNvbnRhaW5zIGFuIGltbXV0YWJsZSBzYW1wbGVyCisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI7CisKKyAgICAvLyBNYWtlIHBJbWFnZUluZm8gaW5kZXggbm9uLW51bGwgdG8gYXZvaWQgY29tcGxhaW50cyBvZiBpdCBtaXNzaW5nCisgICAgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvIGltYWdlSW5mbyA9IHt9OworICAgIGltYWdlSW5mby5pbWFnZUxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw7CisgICAgZGVzY3JpcHRvcl93cml0ZS5wSW1hZ2VJbmZvID0gJmltYWdlSW5mbzsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRzdEFycmF5RWxlbWVudC0wMDMyMSIpOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIDQpIFRoYXQgc2FtcGxlZCBpbWFnZSBkZXNjcmlwdG9ycyBoYXZlIHJlcXVpcmVkIGxheW91dHMKKyAgICAvLyBDcmVhdGUgaW1hZ2VzIHRvIHVwZGF0ZSB0aGUgZGVzY3JpcHRvciB3aXRoCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgY29uc3QgVmtGb3JtYXQgdGV4X2Zvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgdGV4X2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIEF0dG1lcHQgd3JpdGUgd2l0aCBpbmNvcnJlY3QgbGF5b3V0IGZvciBzYW1wbGVkIGRlc2NyaXB0b3IKKyAgICBpbWFnZUluZm8uc2FtcGxlciA9IFZLX05VTExfSEFORExFOworICAgIGltYWdlSW5mby5pbWFnZVZpZXcgPSBpbWFnZS50YXJnZXRWaWV3KHRleF9mb3JtYXQpOworICAgIGltYWdlSW5mby5pbWFnZUxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAzOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMTQwMyIpOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFdyaXRlRGVzY3JpcHRvclNldENvbnNlY3V0aXZlVXBkYXRlcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJWZXJpZmllcyB0aGF0IHVwZGF0ZXMgcm9sbGluZyBvdmVyIHRvIG5leHQgZGVzY3JpcHRvciB3b3JrIGNvcnJlY3RseSBieSBkZXN0cm95aW5nIGJ1ZmZlciBmcm9tIGNvbnNlY3V0aXZlIHVwZGF0ZSBrbm93biAiCisgICAgICAgICJ0byBiZSB1c2VkIGluIGRlc2NyaXB0b3Igc2V0IGFuZCB2ZXJpZnlpbmcgdGhhdCBlcnJvciBpcyBmbGFnZ2VkLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMiwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgdWludDMyX3QgcWZpID0gMDsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYmNpID0ge307CisgICAgYmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJjaS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQ7CisgICAgYmNpLnNpemUgPSAyMDQ4OworICAgIGJjaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAxOworICAgIGJjaS5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKyAgICBWa0J1ZmZlck9iaiBidWZmZXIwOworICAgIGJ1ZmZlcjAuaW5pdCgqbV9kZXZpY2UsIGJjaSk7CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgeyAgLy8gU2NvcGUgMm5kIGJ1ZmZlciB0byBjYXVzZSBlYXJseSBkZXN0cnVjdGlvbgorICAgICAgICBWa0J1ZmZlck9iaiBidWZmZXIxOworICAgICAgICBiY2kuc2l6ZSA9IDEwMjQ7CisgICAgICAgIGJ1ZmZlcjEuaW5pdCgqbV9kZXZpY2UsIGJjaSk7CisKKyAgICAgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmZXJfaW5mb1szXSA9IHt9OworICAgICAgICBidWZmZXJfaW5mb1swXS5idWZmZXIgPSBidWZmZXIwLmhhbmRsZSgpOworICAgICAgICBidWZmZXJfaW5mb1swXS5vZmZzZXQgPSAwOworICAgICAgICBidWZmZXJfaW5mb1swXS5yYW5nZSA9IDEwMjQ7CisgICAgICAgIGJ1ZmZlcl9pbmZvWzFdLmJ1ZmZlciA9IGJ1ZmZlcjAuaGFuZGxlKCk7CisgICAgICAgIGJ1ZmZlcl9pbmZvWzFdLm9mZnNldCA9IDEwMjQ7CisgICAgICAgIGJ1ZmZlcl9pbmZvWzFdLnJhbmdlID0gMTAyNDsKKyAgICAgICAgYnVmZmVyX2luZm9bMl0uYnVmZmVyID0gYnVmZmVyMS5oYW5kbGUoKTsKKyAgICAgICAgYnVmZmVyX2luZm9bMl0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmZmVyX2luZm9bMl0ucmFuZ2UgPSAxMDI0OworCisgICAgICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGUgPSB7fTsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IGRlc2NyaXB0b3Jfc2V0LnNldF87ICAvLyBkZXNjcmlwdG9yX3NldDsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAzOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLnBCdWZmZXJJbmZvID0gYnVmZmVyX2luZm87CisKKyAgICAgICAgLy8gVXBkYXRlIGRlc2NyaXB0b3IKKyAgICAgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIE5VTEwpOworCisgICAgICAgIC8vIENyZWF0ZSBQU08gdGhhdCB1c2VzIHRoZSB1bmlmb3JtIGJ1ZmZlcnMKKyAgICAgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAgICAgImxheW91dChzZXQ9MCkgbGF5b3V0KGJpbmRpbmc9MCkgdW5pZm9ybSBmb28geyBpbnQgeDsgaW50IHk7IH0gYmFyO1xuIgorICAgICAgICAgICAgImxheW91dChzZXQ9MCkgbGF5b3V0KGJpbmRpbmc9MSkgdW5pZm9ybSBibGFoIHsgaW50IHg7IH0gZHVoO1xuIgorICAgICAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAgICAgIiAgIHggPSB2ZWM0KGR1aC54LCBiYXIueSwgYmFyLngsIDEpO1xuIgorICAgICAgICAgICAgIn1cbiI7CisgICAgICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICAgICAgcGlwZS5Jbml0SW5mbygpOworICAgICAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3BpcGUudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICBjb25zdCBWa0R5bmFtaWNTdGF0ZSBkeW5fc3RhdGVzW10gPSB7VktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVCwgVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SfTsKKyAgICAgICAgVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gZHluX3N0YXRlX2NpID0ge307CisgICAgICAgIGR5bl9zdGF0ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgICAgIGR5bl9zdGF0ZV9jaS5keW5hbWljU3RhdGVDb3VudCA9IHNpemUoZHluX3N0YXRlcyk7CisgICAgICAgIGR5bl9zdGF0ZV9jaS5wRHluYW1pY1N0YXRlcyA9IGR5bl9zdGF0ZXM7CisgICAgICAgIHBpcGUuZHluX3N0YXRlX2NpXyA9IGR5bl9zdGF0ZV9jaTsKKyAgICAgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICAgICAgcGlwZS5waXBlbGluZV9sYXlvdXRfID0gVmtQaXBlbGluZUxheW91dE9iaihtX2RldmljZSwgeyZkZXNjcmlwdG9yX3NldC5sYXlvdXRffSk7CisgICAgICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgICAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUucGlwZWxpbmVfKTsKKyAgICAgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfc2V0LnNldF8sIDAsIG51bGxwdHIpOworCisgICAgICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MCwgMCwgMTYsIDE2LCAwLCAxfTsKKyAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZzY2lzc29yKTsKKyAgICAgICAgdms6OkNtZERyYXcobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMywgMSwgMCwgMCk7CisgICAgICAgIHZrOjpDbWRFbmRSZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIH0KKyAgICAvLyBidWZmZXIyIGp1c3Qgd2VudCBvdXQgb2Ygc2NvcGUgYW5kIHdhcyBkZXN0cm95ZWQgYWxvbmcgd2l0aCBpdHMgbWVtb3J5CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtCdWZmZXIiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQ29tbWFuZEJ1ZmZlci1Wa0RldmljZU1lbW9yeSIpOworCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZENtZEJ1ZmZlckRlc2NyaXB0b3JTZXRCdWZmZXJEZXN0cm95ZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQXR0ZW1wdCB0byBkcmF3IHdpdGggYSBjb21tYW5kIGJ1ZmZlciB0aGF0IGlzIGludmFsaWQgZHVlIHRvIGEgYm91bmQgZGVzY3JpcHRvciBzZXQgd2l0aCBhIGJ1ZmZlciBkZXBlbmRlbmN5IGJlaW5nICIKKyAgICAgICAgImRlc3Ryb3llZC4iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgeworICAgICAgICAvLyBDcmVhdGUgYSBidWZmZXIgdG8gdXBkYXRlIHRoZSBkZXNjcmlwdG9yIHdpdGgKKyAgICAgICAgdWludDMyX3QgcWZpID0gMDsKKyAgICAgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZDSSA9IHt9OworICAgICAgICBidWZmQ0kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgICAgIGJ1ZmZDSS5zaXplID0gMTAyNDsKKyAgICAgICAgYnVmZkNJLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICAgICAgYnVmZkNJLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgICAgIGJ1ZmZDSS5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKworICAgICAgICBWa0J1ZmZlck9iaiBidWZmZXI7CisgICAgICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZkNJKTsKKworICAgICAgICAvLyBDcmVhdGUgUFNPIHRvIGJlIHVzZWQgZm9yIGRyYXctdGltZSBlcnJvcnMgYmVsb3cKKyAgICAgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAgICAgImxheW91dChzZXQ9MCkgbGF5b3V0KGJpbmRpbmc9MCkgdW5pZm9ybSBmb28geyBpbnQgeDsgaW50IHk7IH0gYmFyO1xuIgorICAgICAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAgICAgIiAgIHggPSB2ZWM0KGJhci55KTtcbiIKKyAgICAgICAgICAgICJ9XG4iOworICAgICAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworICAgICAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7cGlwZS52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bl9zdGF0ZXNbXSA9IHtWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1J9OworICAgICAgICBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyBkeW5fc3RhdGVfY2kgPSB7fTsKKyAgICAgICAgZHluX3N0YXRlX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRFlOQU1JQ19TVEFURV9DUkVBVEVfSU5GTzsKKyAgICAgICAgZHluX3N0YXRlX2NpLmR5bmFtaWNTdGF0ZUNvdW50ID0gc2l6ZShkeW5fc3RhdGVzKTsKKyAgICAgICAgZHluX3N0YXRlX2NpLnBEeW5hbWljU3RhdGVzID0gZHluX3N0YXRlczsKKyAgICAgICAgcGlwZS5keW5fc3RhdGVfY2lfID0gZHluX3N0YXRlX2NpOworICAgICAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgICAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKworICAgICAgICAvLyBDb3JyZWN0bHkgdXBkYXRlIGRlc2NyaXB0b3IgdG8gYXZvaWQgIk5PVF9VUERBVEVEIiBlcnJvcgorICAgICAgICBwaXBlLmRlc2NyaXB0b3Jfc2V0Xy0+V3JpdGVEZXNjcmlwdG9yQnVmZmVySW5mbygwLCBidWZmZXIuaGFuZGxlKCksIDEwMjQpOworICAgICAgICBwaXBlLmRlc2NyaXB0b3Jfc2V0Xy0+VXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV8pOworICAgICAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUucGlwZWxpbmVfbGF5b3V0Xy5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZS5kZXNjcmlwdG9yX3NldF8tPnNldF8sIDAsIE5VTEwpOworCisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmbV92aWV3cG9ydHNbMF0pOworICAgICAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmbV9zY2lzc29yc1swXSk7CisKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICB9CisgICAgLy8gRGVzdHJveSBidWZmZXIgc2hvdWxkIGludmFsaWRhdGUgdGhlIGNtZCBidWZmZXIsIGNhdXNpbmcgZXJyb3Igb24gc3VibWl0CisKKyAgICAvLyBBdHRlbXB0IHRvIHN1Ym1pdCBjbWQgYnVmZmVyCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIC8vIEludmFsaWQgVmtCdWZmZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmUiKTsKKyAgICAvLyBJbnZhbGlkIFZrRGV2aWNlTWVtb3J5CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiIHRoYXQgaXMgaW52YWxpZCBiZWNhdXNlIGJvdW5kICIpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZENtZEJ1ZmZlckRlc2NyaXB0b3JTZXRJbWFnZVNhbXBsZXJEZXN0cm95ZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQXR0ZW1wdCB0byBkcmF3IHdpdGggYSBjb21tYW5kIGJ1ZmZlciB0aGF0IGlzIGludmFsaWQgZHVlIHRvIGEgYm91bmQgZGVzY3JpcHRvciBzZXRzIHdpdGggYSBjb21iaW5lZCBpbWFnZSBzYW1wbGVyIGhhdmluZyAiCisgICAgICAgICJ0aGVpciBpbWFnZSwgc2FtcGxlciwgYW5kIGRlc2NyaXB0b3Igc2V0IGVhY2ggcmVzcGVjdGl2ZWx5IGRlc3Ryb3llZCBhbmQgdGhlbiBhdHRlbXB0aW5nIHRvIHN1Ym1pdCBhc3NvY2lhdGVkIGNtZCAiCisgICAgICAgICJidWZmZXJzLiBBdHRlbXB0IHRvIGRlc3Ryb3kgYSBEZXNjcmlwdG9yU2V0IHRoYXQgaXMgaW4gdXNlLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrRGVzY3JpcHRvclBvb2xTaXplIGRzX3R5cGVfY291bnQgPSB7fTsKKyAgICBkc190eXBlX2NvdW50LnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjsKKyAgICBkc190eXBlX2NvdW50LmRlc2NyaXB0b3JDb3VudCA9IDE7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBkc19wb29sX2NpID0ge307CisgICAgZHNfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBkc19wb29sX2NpLnBOZXh0ID0gTlVMTDsKKyAgICBkc19wb29sX2NpLmZsYWdzID0gVktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9GUkVFX0RFU0NSSVBUT1JfU0VUX0JJVDsKKyAgICBkc19wb29sX2NpLm1heFNldHMgPSAxOworICAgIGRzX3Bvb2xfY2kucG9vbFNpemVDb3VudCA9IDE7CisgICAgZHNfcG9vbF9jaS5wUG9vbFNpemVzID0gJmRzX3R5cGVfY291bnQ7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sIGRzX3Bvb2w7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzX3Bvb2xfY2ksIE5VTEwsICZkc19wb29sKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkc2xfYmluZGluZyA9IHt9OworICAgIGRzbF9iaW5kaW5nLmJpbmRpbmcgPSAwOworICAgIGRzbF9iaW5kaW5nLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkc2xfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0FMTDsKKyAgICBkc2xfYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzX2xheW91dChtX2RldmljZSwge2RzbF9iaW5kaW5nfSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvclNldDsKKyAgICBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgIGFsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPOworICAgIGFsbG9jX2luZm8uZGVzY3JpcHRvclNldENvdW50ID0gMTsKKyAgICBhbGxvY19pbmZvLmRlc2NyaXB0b3JQb29sID0gZHNfcG9vbDsKKyAgICBhbGxvY19pbmZvLnBTZXRMYXlvdXRzID0gJmRzX2xheW91dC5oYW5kbGUoKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCAmZGVzY3JpcHRvclNldCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRzX2xheW91dH0pOworCisgICAgLy8gQ3JlYXRlIGltYWdlcyB0byB1cGRhdGUgdGhlIGRlc2NyaXB0b3Igd2l0aAorICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgVmtJbWFnZSBpbWFnZTI7CisgICAgY29uc3QgVmtGb3JtYXQgdGV4X2Zvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBjb25zdCBpbnQzMl90IHRleF93aWR0aCA9IDMyOworICAgIGNvbnN0IGludDMyX3QgdGV4X2hlaWdodCA9IDMyOworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSB0ZXhfZm9ybWF0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IHRleF93aWR0aDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gdGV4X2hlaWdodDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLm1pcExldmVscyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmaW1hZ2UpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmaW1hZ2UyKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtb3J5X3JlcXM7CisgICAgVmtEZXZpY2VNZW1vcnkgaW1hZ2VfbWVtb3J5OworICAgIGJvb2wgcGFzczsKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1vcnlfaW5mbyA9IHt9OworICAgIG1lbW9yeV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtb3J5X2luZm8ucE5leHQgPSBOVUxMOworICAgIG1lbW9yeV9pbmZvLmFsbG9jYXRpb25TaXplID0gMDsKKyAgICBtZW1vcnlfaW5mby5tZW1vcnlUeXBlSW5kZXggPSAwOworICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCAmbWVtb3J5X3JlcXMpOworICAgIC8vIEFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIGJvdGggaW1hZ2VzCisgICAgVmtEZXZpY2VTaXplIGFsaWduX21vZCA9IG1lbW9yeV9yZXFzLnNpemUgJSBtZW1vcnlfcmVxcy5hbGlnbm1lbnQ7CisgICAgVmtEZXZpY2VTaXplIGFsaWduZWRfc2l6ZSA9ICgoYWxpZ25fbW9kID09IDApID8gbWVtb3J5X3JlcXMuc2l6ZSA6IChtZW1vcnlfcmVxcy5zaXplICsgbWVtb3J5X3JlcXMuYWxpZ25tZW50IC0gYWxpZ25fbW9kKSk7CisgICAgbWVtb3J5X2luZm8uYWxsb2NhdGlvblNpemUgPSBhbGlnbmVkX3NpemUgKiAyOworICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKG1lbW9yeV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmbWVtb3J5X2luZm8sIDApOworICAgIEFTU0VSVF9UUlVFKHBhc3MpOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksICZtZW1vcnlfaW5mbywgTlVMTCwgJmltYWdlX21lbW9yeSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBlcnIgPSB2azo6QmluZEltYWdlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsIGltYWdlX21lbW9yeSwgMCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAvLyBCaW5kIHNlY29uZCBpbWFnZSB0byBtZW1vcnkgcmlnaHQgYWZ0ZXIgZmlyc3QgaW1hZ2UKKyAgICBlcnIgPSB2azo6QmluZEltYWdlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UyLCBpbWFnZV9tZW1vcnksIGFsaWduZWRfc2l6ZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5pbWFnZSA9IGltYWdlOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8udmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5mb3JtYXQgPSB0ZXhfZm9ybWF0OworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworCisgICAgVmtJbWFnZVZpZXcgdG1wX3ZpZXc7ICAvLyBGaXJzdCB0ZXN0IGRlbGV0ZXMgdGhpcyB2aWV3CisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICBWa0ltYWdlVmlldyB2aWV3MjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmltYWdlX3ZpZXdfY3JlYXRlX2luZm8sIE5VTEwsICZ0bXBfdmlldyk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmltYWdlX3ZpZXdfY3JlYXRlX2luZm8sIE5VTEwsICZ2aWV3KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uaW1hZ2UgPSBpbWFnZTI7CisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLCBOVUxMLCAmdmlldzIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgLy8gQ3JlYXRlIFNhbXBsZXJzCisgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzYW1wbGVyX2NpID0gU2FmZVNhbmVTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgIFZrU2FtcGxlciBzYW1wbGVyOworICAgIFZrU2FtcGxlciBzYW1wbGVyMjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2NpLCBOVUxMLCAmc2FtcGxlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2NpLCBOVUxMLCAmc2FtcGxlcjIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgLy8gVXBkYXRlIGRlc2NyaXB0b3Igd2l0aCBpbWFnZSBhbmQgc2FtcGxlcgorICAgIFZrRGVzY3JpcHRvckltYWdlSW5mbyBpbWdfaW5mbyA9IHt9OworICAgIGltZ19pbmZvLnNhbXBsZXIgPSBzYW1wbGVyOworICAgIGltZ19pbmZvLmltYWdlVmlldyA9IHRtcF92aWV3OworICAgIGltZ19pbmZvLmltYWdlTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDsKKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGU7CisgICAgbWVtc2V0KCZkZXNjcmlwdG9yX3dyaXRlLCAwLCBzaXplb2YoZGVzY3JpcHRvcl93cml0ZSkpOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IGRlc2NyaXB0b3JTZXQ7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9ICZpbWdfaW5mbzsKKworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKworICAgIC8vIENyZWF0ZSBQU08gdG8gYmUgdXNlZCBmb3IgZHJhdy10aW1lIGVycm9ycyBiZWxvdworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQoc2V0PTAsIGJpbmRpbmc9MCkgdW5pZm9ybSBzYW1wbGVyMkQgcztcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB4ID0gdGV4dHVyZShzLCB2ZWMyKDEpKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKyAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworCisgICAgLy8gRmlyc3QgZXJyb3IgY2FzZSBpcyBkZXN0cm95aW5nIHNhbXBsZXIgcHJpb3IgdG8gY21kIGJ1ZmZlciBzdWJtaXNzaW9uCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gVHJhbnNpdCBpbWFnZSBsYXlvdXQgZnJvbSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEIGludG8gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTAorICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGJhcnJpZXIgPSB7fTsKKyAgICBiYXJyaWVyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI7CisgICAgYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGJhcnJpZXIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDsKKyAgICBiYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBiYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBiYXJyaWVyLmltYWdlID0gaW1hZ2U7CisgICAgYmFycmllci5zcmNBY2Nlc3NNYXNrID0gMDsKKyAgICBiYXJyaWVyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUOworICAgIGJhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBiYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBiYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBiYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmJhcnJpZXIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUuaGFuZGxlKCkpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3JTZXQsIDAsIE5VTEwpOworICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MCwgMCwgMTYsIDE2LCAwLCAxfTsKKyAgICBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwgezE2LCAxNn19OworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZzY2lzc29yKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkRyYXcoMSwgMCwgMCwgMCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgLy8gVGhpcyBmaXJzdCBzdWJtaXQgc2hvdWxkIGJlIHN1Y2Nlc3NmdWwKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIC8vIE5vdyBkZXN0cm95IGltYWdldmlldyBhbmQgcmVzZXQgY21kQnVmZmVyCisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCB0bXBfdmlldywgTlVMTCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5yZXNldCgwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUuaGFuZGxlKCkpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3JTZXQsIDAsIE5VTEwpOworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZzY2lzc29yKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIgdGhhdCBpcyBpbnZhbGlkIG9yIGhhcyBiZWVuIGRlc3Ryb3llZC4iKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkRyYXcoMSwgMCwgMCwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIC8vIFJlLXVwZGF0ZSBkZXNjcmlwdG9yIHdpdGggbmV3IHZpZXcKKyAgICBpbWdfaW5mby5pbWFnZVZpZXcgPSB2aWV3OworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICAvLyBOb3cgdGVzdCBkZXN0cm95aW5nIHNhbXBsZXIgcHJpb3IgdG8gY21kIGJ1ZmZlciBzdWJtaXNzaW9uCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLmhhbmRsZSgpKTsKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yU2V0LCAwLCBOVUxMKTsKKyAgICB2azo6Q21kU2V0Vmlld3BvcnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmc2Npc3Nvcik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgLy8gRGVzdHJveSBzYW1wbGVyIGludmFsaWRhdGVzIHRoZSBjbWQgYnVmZmVyLCBjYXVzaW5nIGVycm9yIG9uIHN1Ym1pdAorICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIsIE5VTEwpOworICAgIC8vIEF0dGVtcHQgdG8gc3VibWl0IGNtZCBidWZmZXIKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQ29tbWFuZEJ1ZmZlci1Wa1NhbXBsZXIiKTsKKyAgICBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gTm93IHJlLXVwZGF0ZSBkZXNjcmlwdG9yIHdpdGggdmFsaWQgc2FtcGxlciBhbmQgZGVsZXRlIGltYWdlCisgICAgaW1nX2luZm8uc2FtcGxlciA9IHNhbXBsZXIyOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBpbmZvID0ge307CisgICAgaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyLVZrSW1hZ2UiKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCZpbmZvKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvclNldCwgMCwgTlVMTCk7CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIC8vIERlc3Ryb3kgaW1hZ2UgaW52YWxpZGF0ZXMgdGhlIGNtZCBidWZmZXIsIGNhdXNpbmcgZXJyb3Igb24gc3VibWl0CisgICAgdms6OkRlc3Ryb3lJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKKyAgICAvLyBBdHRlbXB0IHRvIHN1Ym1pdCBjbWQgYnVmZmVyCisgICAgc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBOb3cgdXBkYXRlIGRlc2NyaXB0b3IgdG8gYmUgdmFsaWQsIGJ1dCB0aGVuIGZyZWUgZGVzY3JpcHRvcgorICAgIGltZ19pbmZvLmltYWdlVmlldyA9IHZpZXcyOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCZpbmZvKTsKKworICAgIC8vIFRyYW5zaXQgaW1hZ2UyIGxheW91dCBmcm9tIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgaW50byBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMCisgICAgYmFycmllci5pbWFnZSA9IGltYWdlMjsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmYmFycmllcik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvclNldCwgMCwgTlVMTCk7CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisKKyAgICAvLyBJbW1lZGlhdGVseSB0cnkgdG8gZGVzdHJveSB0aGUgZGVzY3JpcHRvciBzZXQgaW4gdGhlIGFjdGl2ZSBjb21tYW5kIGJ1ZmZlciAtIGZhaWx1cmUgZXhwZWN0ZWQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRnJlZURlc2NyaXB0b3JTZXRzLXBEZXNjcmlwdG9yU2V0cy0wMDMwOSIpOworICAgIHZrOjpGcmVlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCBkc19wb29sLCAxLCAmZGVzY3JpcHRvclNldCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBUcnkgYWdhaW4gb25jZSB0aGUgcXVldWUgaXMgaWRsZSAtIHNob3VsZCBzdWNjZWVkIHcvbyBlcnJvcgorICAgIC8vIFRPRE8gLSB0aG91Z2ggdGhlIHBhcnRpY3VsYXIgZXJyb3IgYWJvdmUgZG9lc24ndCByZS1vY2N1ciwgdGhlcmUgYXJlIG90aGVyICd1bmV4cGVjdGVkcycgc3RpbGwgdG8gY2xlYW4gdXAKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigKKyAgICAgICAgInBEZXNjcmlwdG9yU2V0cyBtdXN0IGJlIGEgdmFsaWQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkZXNjcmlwdG9yU2V0Q291bnQgVmtEZXNjcmlwdG9yU2V0IGhhbmRsZXMsIGVhY2ggZWxlbWVudCBvZiB3aGljaCAiCisgICAgICAgICJtdXN0IGVpdGhlciBiZSBhIHZhbGlkIGhhbmRsZSBvciBWS19OVUxMX0hBTkRMRSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVuYWJsZSB0byByZW1vdmUgRGVzY3JpcHRvclNldCBvYmoiKTsKKyAgICB2azo6RnJlZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfcG9vbCwgMSwgJmRlc2NyaXB0b3JTZXQpOworCisgICAgLy8gQXR0ZW1wdCB0byBzdWJtaXQgY21kIGJ1ZmZlciBjb250YWluaW5nIHRoZSBmcmVlZCBkZXNjcmlwdG9yIHNldAorICAgIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyLVZrRGVzY3JpcHRvclNldCIpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDbGVhbnVwCisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZV9tZW1vcnksIE5VTEwpOworICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIyLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UyLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXcsIE5VTEwpOworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldzIsIE5VTEwpOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBkc19wb29sLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkRGVzY3JpcHRvclNldFNhbXBsZXJEZXN0cm95ZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIGRyYXcgd2l0aCBhIGJvdW5kIGRlc2NyaXB0b3Igc2V0cyB3aXRoIGEgY29tYmluZWQgaW1hZ2Ugc2FtcGxlciB3aGVyZSBzYW1wbGVyIGhhcyBiZWVuIGRlbGV0ZWQuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdChudWxscHRyLCBudWxscHRyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRlc2NyaXB0b3Jfc2V0LmxheW91dF99KTsKKyAgICAvLyBDcmVhdGUgaW1hZ2VzIHRvIHVwZGF0ZSB0aGUgZGVzY3JpcHRvciB3aXRoCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgY29uc3QgVmtGb3JtYXQgdGV4X2Zvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgdGV4X2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8udmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5mb3JtYXQgPSB0ZXhfZm9ybWF0OworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworCisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmltYWdlX3ZpZXdfY3JlYXRlX2luZm8sIE5VTEwsICZ2aWV3KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIC8vIENyZWF0ZSBTYW1wbGVycworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9jaSA9IFNhZmVTYW5lU2FtcGxlckNyZWF0ZUluZm8oKTsKKyAgICBWa1NhbXBsZXIgc2FtcGxlcjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2NpLCBOVUxMLCAmc2FtcGxlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBWa1NhbXBsZXIgc2FtcGxlcjE7CisgICAgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgTlVMTCwgJnNhbXBsZXIxKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIC8vIFVwZGF0ZSBkZXNjcmlwdG9yIHdpdGggaW1hZ2UgYW5kIHNhbXBsZXIKKyAgICBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gaW1nX2luZm8gPSB7fTsKKyAgICBpbWdfaW5mby5zYW1wbGVyID0gc2FtcGxlcjsKKyAgICBpbWdfaW5mby5pbWFnZVZpZXcgPSB2aWV3OworICAgIGltZ19pbmZvLmltYWdlTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDsKKworICAgIFZrRGVzY3JpcHRvckltYWdlSW5mbyBpbWdfaW5mbzEgPSBpbWdfaW5mbzsKKyAgICBpbWdfaW5mbzEuc2FtcGxlciA9IHNhbXBsZXIxOworCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZTsKKyAgICBtZW1zZXQoJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIHNpemVvZihkZXNjcmlwdG9yX3dyaXRlKSk7CisgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI7CisgICAgZGVzY3JpcHRvcl93cml0ZS5wSW1hZ2VJbmZvID0gJmltZ19pbmZvOworCisgICAgc3RkOjphcnJheTxWa1dyaXRlRGVzY3JpcHRvclNldCwgMj4gZGVzY3JpcHRvcl93cml0ZXMgPSB7ZGVzY3JpcHRvcl93cml0ZSwgZGVzY3JpcHRvcl93cml0ZX07CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZHN0QmluZGluZyA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0ucEltYWdlSW5mbyA9ICZpbWdfaW5mbzE7CisKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAyLCBkZXNjcmlwdG9yX3dyaXRlcy5kYXRhKCksIDAsIE5VTEwpOworCisgICAgLy8gRGVzdHJveSB0aGUgc2FtcGxlciBiZWZvcmUgaXQncyBib3VuZCB0byB0aGUgY21kIGJ1ZmZlcgorICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIxLCBOVUxMKTsKKworICAgIC8vIENyZWF0ZSBQU08gdG8gYmUgdXNlZCBmb3IgZHJhdy10aW1lIGVycm9ycyBiZWxvdworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQoc2V0PTAsIGJpbmRpbmc9MCkgdW5pZm9ybSBzYW1wbGVyMkQgcztcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0xKSB1bmlmb3JtIHNhbXBsZXIyRCBzMTtcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB4ID0gdGV4dHVyZShzLCB2ZWMyKDEpKTtcbiIKKyAgICAgICAgIiAgIHggPSB0ZXh0dXJlKHMxLCB2ZWMyKDEpKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKyAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworCisgICAgLy8gRmlyc3QgZXJyb3IgY2FzZSBpcyBkZXN0cm95aW5nIHNhbXBsZXIgcHJpb3IgdG8gY21kIGJ1ZmZlciBzdWJtaXNzaW9uCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLmhhbmRsZSgpKTsKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldC5zZXRfLCAwLCBOVUxMKTsKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAsIDAsIDE2LCAxNiwgMCwgMX07CisgICAgVmtSZWN0MkQgc2Npc3NvciA9IHt7MCwgMH0sIHsxNiwgMTZ9fTsKKyAgICB2azo6Q21kU2V0Vmlld3BvcnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmc2Npc3Nvcik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiIERlc2NyaXB0b3IgaW4gYmluZGluZyAjMSBpbmRleCAwIGlzIHVzaW5nIHNhbXBsZXIgIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIsIE5VTEwpOworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldywgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW1hZ2VEZXNjcmlwdG9yTGF5b3V0TWlzbWF0Y2gpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYW4gaW1hZ2Ugc2FtcGxlciBsYXlvdXQtPmltYWdlIGxheW91dCBtaXNtYXRjaCB3aXRoaW4vd2l0aG91dCBhIGNvbW1hbmQgYnVmZmVyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBib29sIG1haW50Ml9zdXBwb3J0ID0gRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAobWFpbnQyX3N1cHBvcnQpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFJlbGF4ZWQgbGF5b3V0IG1hdGNoaW5nIHN1YnRlc3QgcmVxdWlyZXMgQVBJID49IDEuMSBvciBLSFJfTUFJTlRFTkFOQ0UyIGV4dGVuc2lvbiwgdW5hdmFpbGFibGUgLSBza2lwcGVkLlxuIiwKKyAgICAgICAgICAgICAgIGtTa2lwUHJlZml4KTsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsIG51bGxwdHIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRlc2NyaXB0b3Jfc2V0LmxheW91dF99KTsKKworICAgIC8vIENyZWF0ZSBpbWFnZSwgdmlldywgYW5kIHNhbXBsZXIKKyAgICBjb25zdCBWa0Zvcm1hdCBmb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIGZvcm1hdCwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgfCBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgdmtfdGVzdGluZzo6SW1hZ2VWaWV3IHZpZXc7CisgICAgYXV0byBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvID0gU2FmZVNhbmVJbWFnZVZpZXdDcmVhdGVJbmZvKGltYWdlLCBmb3JtYXQsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQpOworICAgIHZpZXcuaW5pdCgqbV9kZXZpY2UsIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8pOworICAgIEFTU0VSVF9UUlVFKHZpZXcuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyBDcmVhdGUgU2FtcGxlcgorICAgIHZrX3Rlc3Rpbmc6OlNhbXBsZXIgc2FtcGxlcjsKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgc2FtcGxlci5pbml0KCptX2RldmljZSwgc2FtcGxlcl9jaSk7CisgICAgQVNTRVJUX1RSVUUoc2FtcGxlci5pbml0aWFsaXplZCgpKTsKKworICAgIC8vIFNldHVwIHN0cnVjdHVyZSBmb3IgZGVzY3JpcHRvciB1cGRhdGUgd2l0aCBzYW1wbGVyLCBmb3IgdXBkYXRlIGluIGRvX3Rlc3QgYmVsb3cKKyAgICBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gaW1nX2luZm8gPSB7fTsKKyAgICBpbWdfaW5mby5zYW1wbGVyID0gc2FtcGxlci5oYW5kbGUoKTsKKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGU7CisgICAgbWVtc2V0KCZkZXNjcmlwdG9yX3dyaXRlLCAwLCBzaXplb2YoZGVzY3JpcHRvcl93cml0ZSkpOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IGRlc2NyaXB0b3JTZXQ7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9ICZpbWdfaW5mbzsKKworICAgIC8vIENyZWF0ZSBQU08gdG8gYmUgdXNlZCBmb3IgZHJhdy10aW1lIGVycm9ycyBiZWxvdworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBiaW5kU3RhdGVGcmFnU2FtcGxlclNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIHJlbmRlclBhc3MoKSk7CisKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAsIDAsIDE2LCAxNiwgMCwgMX07CisgICAgVmtSZWN0MkQgc2Npc3NvciA9IHt7MCwgMH0sIHsxNiwgMTZ9fTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjbWRfYnVmKG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY21kX2J1Zi5oYW5kbGUoKTsKKworICAgIGVudW0gVGVzdFR5cGUgeworICAgICAgICBrSW50ZXJuYWwsICAvLyBJbWFnZSBsYXlvdXQgbWlzbWF0Y2ggaXMgKndpdGhpbiogYSBnaXZlbiBjb21tYW5kIGJ1ZmZlcgorICAgICAgICBrRXh0ZXJuYWwgICAvLyBJbWFnZSBsYXlvdXQgbWlzbWF0Y2ggaXMgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW1hZ2UsIGZvdW5kIGF0IFF1ZXVlU3VibWl0CisgICAgfTsKKyAgICBzdGQ6OmFycmF5PFRlc3RUeXBlLCAyPiB0ZXN0X2xpc3QgPSB7a0ludGVybmFsLCBrRXh0ZXJuYWx9OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbnRlcm5hbF9lcnJvcnMgPSB7IlZVSUQtVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLWltYWdlTGF5b3V0LTAwMzQ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1EZXNjcmlwdG9yU2V0Tm90VXBkYXRlZCJ9OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBleHRlcm5hbF9lcnJvcnMgPSB7IlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRJbWFnZUxheW91dCJ9OworCisgICAgLy8gQ29tbW9uIHN0ZXBzIHRvIGNyZWF0ZSB0aGUgdHdvIGNsYXNzZXMgb2YgZXJyb3JzIChvciB0d28gY2xhc3NlcyBvZiBwb3NpdGl2ZXMpCisgICAgYXV0byBkb190ZXN0ID0gWyZdKFZrSW1hZ2VPYmogKmltYWdlLCB2a190ZXN0aW5nOjpJbWFnZVZpZXcgKnZpZXcsIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RfbWFzaywgVmtJbWFnZUxheW91dCBpbWFnZV9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgZGVzY3JpcHRvcl9sYXlvdXQsIGNvbnN0IGJvb2wgcG9zaXRpdmVfdGVzdCkgeworICAgICAgICAvLyBTZXQgdXAgdGhlIGRlc2NyaXB0b3IKKyAgICAgICAgaW1nX2luZm8uaW1hZ2VWaWV3ID0gdmlldy0+aGFuZGxlKCk7CisgICAgICAgIGltZ19pbmZvLmltYWdlTGF5b3V0ID0gZGVzY3JpcHRvcl9sYXlvdXQ7CisgICAgICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKworICAgICAgICBmb3IgKFRlc3RUeXBlIHRlc3RfdHlwZSA6IHRlc3RfbGlzdCkgeworICAgICAgICAgICAgY21kX2J1Zi5iZWdpbigpOworICAgICAgICAgICAgLy8gcmVjb3JkIGxheW91dCBkaWZmZXJlbnQgdGhhbiBhY3R1YWwgZGVzY3JpcHRvciBsYXlvdXQuCisgICAgICAgICAgICBjb25zdCBWa0ZsYWdzIHJlYWRfd3JpdGUgPSBWS19BQ0NFU1NfTUVNT1JZX1JFQURfQklUIHwgVktfQUNDRVNTX01FTU9SWV9XUklURV9CSVQ7CisgICAgICAgICAgICBhdXRvIGltYWdlX2JhcnJpZXIgPSBpbWFnZS0+aW1hZ2VfbWVtb3J5X2JhcnJpZXIocmVhZF93cml0ZSwgcmVhZF93cml0ZSwgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwgaW1hZ2VfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5zdWJyZXNvdXJjZV9yYW5nZShhc3BlY3RfbWFzaykpOworICAgICAgICAgICAgY21kX2J1Zi5QaXBlbGluZUJhcnJpZXIoVktfUElQRUxJTkVfU1RBR0VfQUxMX0dSQVBISUNTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0dSQVBISUNTX0JJVCwgMCwgMCwgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDEsICZpbWFnZV9iYXJyaWVyKTsKKworICAgICAgICAgICAgaWYgKHRlc3RfdHlwZSA9PSBrRXh0ZXJuYWwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaW1hZ2UgbGF5b3V0IGlzIGV4dGVybmFsIHRvIHRoZSBjb21tYW5kIGJ1ZmZlciB3ZSBhcmUgcmVjb3JkaW5nIHRvIHRlc3QuICBTdWJtaXQgdG8gcHVzaCB0byBpbnN0YW5jZSBzY29wZS4KKyAgICAgICAgICAgICAgICBjbWRfYnVmLmVuZCgpOworICAgICAgICAgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgICAgICAgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgICAgICAgICAgICAgIGNtZF9idWYuYmVnaW4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY21kX2J1Zi5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKyAgICAgICAgICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUoY21kX2J1Zi5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisgICAgICAgICAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKGNtZF9idWYuaGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3JTZXQsIDAsIE5VTEwpOworICAgICAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KGNtZF9idWYuaGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgICAgICAgICB2azo6Q21kU2V0U2Npc3NvcihjbWRfYnVmLmhhbmRsZSgpLCAwLCAxLCAmc2Npc3Nvcik7CisKKyAgICAgICAgICAgIC8vIEF0IGRyYXcgdGltZSB0aGUgdXBkYXRlIGxheW91dCB3aWxsIG1pcy1tYXRjaCB0aGUgYWN0dWFsIGxheW91dAorICAgICAgICAgICAgaWYgKHBvc2l0aXZlX3Rlc3QgfHwgKHRlc3RfdHlwZSA9PSBrRXh0ZXJuYWwpKSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZlcnIgOiBpbnRlcm5hbF9lcnJvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBlcnIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY21kX2J1Zi5EcmF3KDEsIDAsIDAsIDApOworICAgICAgICAgICAgaWYgKHBvc2l0aXZlX3Rlc3QgfHwgKHRlc3RfdHlwZSA9PSBrRXh0ZXJuYWwpKSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgICAgICAgICAgY21kX2J1Zi5FbmRSZW5kZXJQYXNzKCk7CisgICAgICAgICAgICBjbWRfYnVmLmVuZCgpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgICAgIC8vIFN1Ym1pdCBjbWQgYnVmZmVyCisgICAgICAgICAgICBpZiAocG9zaXRpdmVfdGVzdCB8fCAodGVzdF90eXBlID09IGtJbnRlcm5hbCkpIHsKKyAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmVyciA6IGV4dGVybmFsX2Vycm9ycykgeworICAgICAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGVyci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgICAgICAgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgICAgICAgICAgaWYgKHBvc2l0aXZlX3Rlc3QgfHwgKHRlc3RfdHlwZSA9PSBrSW50ZXJuYWwpKSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBkb190ZXN0KCZpbWFnZSwgJnZpZXcsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwKKyAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwsIC8qIHBvc2l0aXZlICovIGZhbHNlKTsKKworICAgIC8vIENyZWF0ZSBkZXB0aCBzdGVuY2lsIGltYWdlIGFuZCB2aWV3cworICAgIGNvbnN0IFZrRm9ybWF0IGZvcm1hdF9kcyA9IG1fZGVwdGhfc3RlbmNpbF9mbXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBib29sIGRzX3Rlc3Rfc3VwcG9ydCA9IG1haW50Ml9zdXBwb3J0ICYmIChmb3JtYXRfZHMgIT0gVktfRk9STUFUX1VOREVGSU5FRCk7CisgICAgVmtJbWFnZU9iaiBpbWFnZV9kcyhtX2RldmljZSk7CisgICAgdmtfdGVzdGluZzo6SW1hZ2VWaWV3IHN0ZW5jaWxfdmlldzsKKyAgICB2a190ZXN0aW5nOjpJbWFnZVZpZXcgZGVwdGhfdmlldzsKKyAgICBjb25zdCBWa0ltYWdlTGF5b3V0IGRzX2ltYWdlX2xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOworICAgIGNvbnN0IFZrSW1hZ2VMYXlvdXQgZGVwdGhfZGVzY3JpcHRvcl9sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfUkVBRF9PTkxZX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIGNvbnN0IFZrSW1hZ2VMYXlvdXQgc3RlbmNpbF9kZXNjcmlwdG9yX2xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9BVFRBQ0hNRU5UX1NURU5DSUxfUkVBRF9PTkxZX09QVElNQUw7CisgICAgY29uc3QgVmtJbWFnZUFzcGVjdEZsYWdzIGRlcHRoX3N0ZW5jaWwgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworICAgIGlmIChkc190ZXN0X3N1cHBvcnQpIHsKKyAgICAgICAgaW1hZ2VfZHMuSW5pdCgzMiwgMzIsIDEsIGZvcm1hdF9kcywgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgfCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW1hZ2VfZHMuaW5pdGlhbGl6ZWQoKSk7CisgICAgICAgIGF1dG8gZHNfdmlld19jaSA9IFNhZmVTYW5lSW1hZ2VWaWV3Q3JlYXRlSW5mbyhpbWFnZV9kcywgZm9ybWF0X2RzLCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUKTsKKyAgICAgICAgZGVwdGhfdmlldy5pbml0KCptX2RldmljZSwgZHNfdmlld19jaSk7CisgICAgICAgIGRzX3ZpZXdfY2kuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworICAgICAgICBzdGVuY2lsX3ZpZXcuaW5pdCgqbV9kZXZpY2UsIGRzX3ZpZXdfY2kpOworICAgICAgICBkb190ZXN0KCZpbWFnZV9kcywgJmRlcHRoX3ZpZXcsIGRlcHRoX3N0ZW5jaWwsIGRzX2ltYWdlX2xheW91dCwgZGVwdGhfZGVzY3JpcHRvcl9sYXlvdXQsIC8qIHBvc2l0aXZlICovIHRydWUpOworICAgICAgICBkb190ZXN0KCZpbWFnZV9kcywgJmRlcHRoX3ZpZXcsIGRlcHRoX3N0ZW5jaWwsIGRzX2ltYWdlX2xheW91dCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIC8qIHBvc2l0aXZlICovIGZhbHNlKTsKKyAgICAgICAgZG9fdGVzdCgmaW1hZ2VfZHMsICZzdGVuY2lsX3ZpZXcsIGRlcHRoX3N0ZW5jaWwsIGRzX2ltYWdlX2xheW91dCwgc3RlbmNpbF9kZXNjcmlwdG9yX2xheW91dCwgLyogcG9zaXRpdmUgKi8gdHJ1ZSk7CisgICAgICAgIGRvX3Rlc3QoJmltYWdlX2RzLCAmc3RlbmNpbF92aWV3LCBkZXB0aF9zdGVuY2lsLCBkc19pbWFnZV9sYXlvdXQsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAvKiBwb3NpdGl2ZSAqLyBmYWxzZSk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIERlc2NyaXB0b3JQb29sSW5Vc2VSZXNldFNpZ25hbGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUmVzZXQgYSBEZXNjcmlwdG9yUG9vbCB3aXRoIGEgRGVzY3JpcHRvclNldCB0aGF0IGlzIGluIHVzZS4iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBpcGVsaW5lX2xheW91dChtX2RldmljZSwgeyZkZXNjcmlwdG9yX3NldC5sYXlvdXRffSk7CisKKyAgICAvLyBDcmVhdGUgaW1hZ2UgdG8gdXBkYXRlIHRoZSBkZXNjcmlwdG9yIHdpdGgKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXcgdmlldyA9IGltYWdlLnRhcmdldFZpZXcoVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNKTsKKyAgICAvLyBDcmVhdGUgU2FtcGxlcgorICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9jaSA9IFNhZmVTYW5lU2FtcGxlckNyZWF0ZUluZm8oKTsKKyAgICBWa1NhbXBsZXIgc2FtcGxlcjsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2NpLCBudWxscHRyLCAmc2FtcGxlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAvLyBVcGRhdGUgZGVzY3JpcHRvciB3aXRoIGltYWdlIGFuZCBzYW1wbGVyCisgICAgZGVzY3JpcHRvcl9zZXQuV3JpdGVEZXNjcmlwdG9ySW1hZ2VJbmZvKDAsIHZpZXcsIHNhbXBsZXIpOworICAgIGRlc2NyaXB0b3Jfc2V0LlVwZGF0ZURlc2NyaXB0b3JTZXRzKCk7CisKKyAgICAvLyBDcmVhdGUgUFNPIHRvIGJlIHVzZWQgZm9yIGRyYXctdGltZSBlcnJvcnMgYmVsb3cKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NhbXBsZXJTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKyAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLmhhbmRsZSgpKTsKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldC5zZXRfLCAwLCBudWxscHRyKTsKKworICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MCwgMCwgMTYsIDE2LCAwLCAxfTsKKyAgICBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwgezE2LCAxNn19OworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZzY2lzc29yKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIC8vIFN1Ym1pdCBjbWQgYnVmZmVyIHRvIHB1dCBwb29sIGluLWZsaWdodAorICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIC8vIFJlc2V0IHBvb2wgd2hpbGUgaW4tZmxpZ2h0LCBjYXVzaW5nIGVycm9yCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a1Jlc2V0RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtMDAzMTMiKTsKKyAgICB2azo6UmVzZXREZXNjcmlwdG9yUG9vbChtX2RldmljZS0+ZGV2aWNlKCksIGRlc2NyaXB0b3Jfc2V0LnBvb2xfLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgLy8gQ2xlYW51cAorICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoCisgICAgICAgICJJZiBkZXNjcmlwdG9yUG9vbCBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGRlc2NyaXB0b3JQb29sIG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JQb29sIGhhbmRsZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVuYWJsZSB0byByZW1vdmUgRGVzY3JpcHRvclBvb2wgb2JqIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRGVzY3JpcHRvckltYWdlVXBkYXRlTm9NZW1vcnlCb3VuZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgYW4gaW1hZ2UgZGVzY3JpcHRvciBzZXQgdXBkYXRlIHdoZXJlIGltYWdlJ3MgYm91bmQgbWVtb3J5IGhhcyBiZWVuIGZyZWVkLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIC8vIENyZWF0ZSBpbWFnZXMgdG8gdXBkYXRlIHRoZSBkZXNjcmlwdG9yIHdpdGgKKyAgICBWa0ltYWdlIGltYWdlOworICAgIGNvbnN0IFZrRm9ybWF0IHRleF9mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgY29uc3QgaW50MzJfdCB0ZXhfd2lkdGggPSAzMjsKKyAgICBjb25zdCBpbnQzMl90IHRleF9oZWlnaHQgPSAzMjsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZm9ybWF0ID0gdGV4X2Zvcm1hdDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSB0ZXhfd2lkdGg7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IHRleF9oZWlnaHQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJmltYWdlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIC8vIEluaXRpYWxseSBiaW5kIG1lbW9yeSB0byBhdm9pZCBlcnJvciBhdCBiaW5kIHZpZXcgdGltZS4gV2UnbGwgYnJlYWsgYmluZGluZyBiZWZvcmUgdXBkYXRlLgorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbW9yeV9yZXFzOworICAgIFZrRGV2aWNlTWVtb3J5IGltYWdlX21lbW9yeTsKKyAgICBib29sIHBhc3M7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtb3J5X2luZm8gPSB7fTsKKyAgICBtZW1vcnlfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbW9yeV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBtZW1vcnlfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IDA7CisgICAgbWVtb3J5X2luZm8ubWVtb3J5VHlwZUluZGV4ID0gMDsKKyAgICB2azo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZSwgJm1lbW9yeV9yZXFzKTsKKyAgICAvLyBBbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciBpbWFnZQorICAgIG1lbW9yeV9pbmZvLmFsbG9jYXRpb25TaXplID0gbWVtb3J5X3JlcXMuc2l6ZTsKKyAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1vcnlfcmVxcy5tZW1vcnlUeXBlQml0cywgJm1lbW9yeV9pbmZvLCAwKTsKKyAgICBBU1NFUlRfVFJVRShwYXNzKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtb3J5X2luZm8sIE5VTEwsICZpbWFnZV9tZW1vcnkpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgZXJyID0gdms6OkJpbmRJbWFnZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCBpbWFnZV9tZW1vcnksIDApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaW1hZ2Vfdmlld19jcmVhdGVfaW5mbyA9IHt9OworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uaW1hZ2UgPSBpbWFnZTsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uZm9ybWF0ID0gdGV4X2Zvcm1hdDsKKyAgICBpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1hZ2Vfdmlld19jcmVhdGVfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGltYWdlX3ZpZXdfY3JlYXRlX2luZm8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKworICAgIFZrSW1hZ2VWaWV3IHZpZXc7CisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV92aWV3X2NyZWF0ZV9pbmZvLCBOVUxMLCAmdmlldyk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAvLyBDcmVhdGUgU2FtcGxlcnMKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisgICAgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgTlVMTCwgJnNhbXBsZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgLy8gVXBkYXRlIGRlc2NyaXB0b3Igd2l0aCBpbWFnZSBhbmQgc2FtcGxlcgorICAgIGRlc2NyaXB0b3Jfc2V0LldyaXRlRGVzY3JpcHRvckltYWdlSW5mbygwLCB2aWV3LCBzYW1wbGVyKTsKKyAgICAvLyBCcmVhayBtZW1vcnkgYmluZGluZyBhbmQgYXR0ZW1wdCB1cGRhdGUKKyAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlX21lbW9yeSwgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHByZXZpb3VzbHkgYm91bmQgbWVtb3J5IHdhcyBmcmVlZC4gTWVtb3J5IG11c3Qgbm90IGJlIGZyZWVkIHByaW9yIHRvIHRoaXMgb3BlcmF0aW9uLiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrVXBkYXRlRGVzY3JpcHRvclNldHMoKSBmYWlsZWQgd3JpdGUgdXBkYXRlIHZhbGlkYXRpb24gZm9yICIpOworICAgIGRlc2NyaXB0b3Jfc2V0LlVwZGF0ZURlc2NyaXB0b3JTZXRzKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gQ2xlYW51cAorICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FtcGxlciwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCB2aWV3LCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkRHluYW1pY09mZnNldENhc2VzKSB7CisgICAgLy8gQ3JlYXRlIGEgZGVzY3JpcHRvclNldCB3LyBkeW5hbWljIGRlc2NyaXB0b3IgYW5kIHRoZW4gaGl0IDMgb2Zmc2V0IGVycm9yCisgICAgLy8gY2FzZXM6CisgICAgLy8gMS4gTm8gZHluYW1pY09mZnNldCBzdXBwbGllZAorICAgIC8vIDIuIFRvbyBtYW55IGR5bmFtaWNPZmZzZXRzIHN1cHBsaWVkCisgICAgLy8gMy4gRHluYW1pYyBvZmZzZXQgb3ZlcnN0ZXBzIGJ1ZmZlciBiZWluZyB1cGRhdGVkCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlcXVpcmVzIDEgZHluYW1pY09mZnNldHMsIGJ1dCBvbmx5IDAgZHluYW1pY09mZnNldHMgYXJlIGxlZnQgaW4gcER5bmFtaWNPZmZzZXRzICIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQobV9kZXZpY2UsIHsmZGVzY3JpcHRvcl9zZXQubGF5b3V0X30pOworCisgICAgLy8gQ3JlYXRlIGEgYnVmZmVyIHRvIHVwZGF0ZSB0aGUgZGVzY3JpcHRvciB3aXRoCisgICAgdWludDMyX3QgcWZpID0gMDsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZkNJID0ge307CisgICAgYnVmZkNJLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1ZmZDSS5zaXplID0gMTAyNDsKKyAgICBidWZmQ0kudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUOworICAgIGJ1ZmZDSS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAxOworICAgIGJ1ZmZDSS5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKworICAgIFZrQnVmZmVyT2JqIGR5bmFtaWNfdW5pZm9ybV9idWZmZXI7CisgICAgZHluYW1pY191bmlmb3JtX2J1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZkNJKTsKKworICAgIC8vIENvcnJlY3RseSB1cGRhdGUgZGVzY3JpcHRvciB0byBhdm9pZCAiTk9UX1VQREFURUQiIGVycm9yCisgICAgZGVzY3JpcHRvcl9zZXQuV3JpdGVEZXNjcmlwdG9yQnVmZmVySW5mbygwLCBkeW5hbWljX3VuaWZvcm1fYnVmZmVyLmhhbmRsZSgpLCAxMDI0LCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyk7CisgICAgZGVzY3JpcHRvcl9zZXQuVXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfc2V0LnNldF8sIDAsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHVpbnQzMl90IHBEeW5PZmZbMl0gPSB7NTEyLCA3NTZ9OworICAgIC8vIE5vdyBjYXVzZSBlcnJvciBiL2MgdG9vIG1hbnkgZHluT2Zmc2V0cyBpbiBhcnJheSBmb3IgIyBvZiBkeW4gZGVzY3JpcHRvcnMKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGJpbmQgMSBkZXNjcmlwdG9yU2V0cyB3aXRoIDEgZHluYW1pYyBkZXNjcmlwdG9ycywgYnV0ICIpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfc2V0LnNldF8sIDIsIHBEeW5PZmYpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIC8vIEZpbmFsbHkgY2F1c2UgZXJyb3IgZHVlIHRvIGR5bmFtaWNPZmZzZXQgYmVpbmcgdG9vIGJpZworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICIgZHluYW1pYyBvZmZzZXQgNTEyIGNvbWJpbmVkIHdpdGggb2Zmc2V0IDAgYW5kIHJhbmdlIDEwMjQgdGhhdCBvdmVyc3RlcHMgdGhlIGJ1ZmZlciBzaXplIG9mIDEwMjQiKTsKKyAgICAvLyBDcmVhdGUgUFNPIHRvIGJlIHVzZWQgZm9yIGRyYXctdGltZSBlcnJvcnMgYmVsb3cKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1VuaWZvcm1TaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKyAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworCisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLmhhbmRsZSgpKTsKKyAgICAvLyBUaGlzIHVwZGF0ZSBzaG91bGQgc3VjY2VlZCwgYnV0IG9mZnNldCBzaXplIG9mIDUxMiB3aWxsIG92ZXJzdGVwIGJ1ZmZlcgorICAgIC8vIC93IHJhbmdlIDEwMjQgJiBzaXplIDEwMjQKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldC5zZXRfLCAxLCBwRHluT2ZmKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkRyYXcoMSwgMCwgMCwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIERlc2NyaXB0b3JCdWZmZXJVcGRhdGVOb01lbW9yeUJvdW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byB1cGRhdGUgYSBkZXNjcmlwdG9yIHdpdGggYSBub24tc3BhcnNlIGJ1ZmZlciB0aGF0IGRvZXNuJ3QgaGF2ZSBtZW1vcnkgYm91bmQiKTsKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHVzZWQgd2l0aCBubyBtZW1vcnkgYm91bmQuIE1lbW9yeSBzaG91bGQgYmUgYm91bmQgYnkgY2FsbGluZyB2a0JpbmRCdWZmZXJNZW1vcnkoKS4iKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCkgZmFpbGVkIHdyaXRlIHVwZGF0ZSB2YWxpZGF0aW9uIGZvciAiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQywgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIC8vIENyZWF0ZSBhIGJ1ZmZlciB0byB1cGRhdGUgdGhlIGRlc2NyaXB0b3Igd2l0aAorICAgIHVpbnQzMl90IHFmaSA9IDA7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZDSSA9IHt9OworICAgIGJ1ZmZDSS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZmQ0kuc2l6ZSA9IDEwMjQ7CisgICAgYnVmZkNJLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICBidWZmQ0kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICBidWZmQ0kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9ICZxZmk7CisKKyAgICBWa0J1ZmZlciBkeW5hbWljX3VuaWZvcm1fYnVmZmVyOworICAgIGVyciA9IHZrOjpDcmVhdGVCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmYnVmZkNJLCBOVUxMLCAmZHluYW1pY191bmlmb3JtX2J1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEF0dGVtcHQgdG8gdXBkYXRlIGRlc2NyaXB0b3Igd2l0aG91dCBiaW5kaW5nIG1lbW9yeSB0byBpdAorICAgIGRlc2NyaXB0b3Jfc2V0LldyaXRlRGVzY3JpcHRvckJ1ZmZlckluZm8oMCwgZHluYW1pY191bmlmb3JtX2J1ZmZlciwgMTAyNCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMpOworICAgIGRlc2NyaXB0b3Jfc2V0LlVwZGF0ZURlc2NyaXB0b3JTZXRzKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBkeW5hbWljX3VuaWZvcm1fYnVmZmVyLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBEZXNjcmlwdG9yU2V0Q29tcGF0aWJpbGl0eSkgeworICAgIC8vIFRlc3QgdmFyaW91cyBkZXNyaXB0b3JTZXQgZXJyb3JzIHdpdGggYmFkIGJpbmRpbmcgY29tYmluYXRpb25zCisgICAgdXNpbmcgc3RkOjp2ZWN0b3I7CisgICAgVmtSZXN1bHQgZXJyOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBOVU1fREVTQ1JJUFRPUl9UWVBFUyA9IDU7CisgICAgVmtEZXNjcmlwdG9yUG9vbFNpemUgZHNfdHlwZV9jb3VudFtOVU1fREVTQ1JJUFRPUl9UWVBFU10gPSB7fTsKKyAgICBkc190eXBlX2NvdW50WzBdLnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgZHNfdHlwZV9jb3VudFswXS5kZXNjcmlwdG9yQ291bnQgPSAxMDsKKyAgICBkc190eXBlX2NvdW50WzFdLnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTsKKyAgICBkc190eXBlX2NvdW50WzFdLmRlc2NyaXB0b3JDb3VudCA9IDI7CisgICAgZHNfdHlwZV9jb3VudFsyXS50eXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0U7CisgICAgZHNfdHlwZV9jb3VudFsyXS5kZXNjcmlwdG9yQ291bnQgPSAyOworICAgIGRzX3R5cGVfY291bnRbM10udHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOworICAgIGRzX3R5cGVfY291bnRbM10uZGVzY3JpcHRvckNvdW50ID0gNTsKKyAgICAvLyBUT0RPIDogTHVuYXJHIElMTyBkcml2ZXIgY3VycmVudGx5IGFzc2VydHMgaW4gZGVzYy5jIHcvIElOUFVUX0FUVEFDSE1FTlQKKyAgICAvLyB0eXBlCisgICAgLy8gZHNfdHlwZV9jb3VudFs0XS50eXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ7CisgICAgZHNfdHlwZV9jb3VudFs0XS50eXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSOworICAgIGRzX3R5cGVfY291bnRbNF0uZGVzY3JpcHRvckNvdW50ID0gMjsKKworICAgIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIGRzX3Bvb2xfY2kgPSB7fTsKKyAgICBkc19wb29sX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9JTkZPOworICAgIGRzX3Bvb2xfY2kucE5leHQgPSBOVUxMOworICAgIGRzX3Bvb2xfY2kubWF4U2V0cyA9IDU7CisgICAgZHNfcG9vbF9jaS5wb29sU2l6ZUNvdW50ID0gTlVNX0RFU0NSSVBUT1JfVFlQRVM7CisgICAgZHNfcG9vbF9jaS5wUG9vbFNpemVzID0gZHNfdHlwZV9jb3VudDsKKworICAgIFZrRGVzY3JpcHRvclBvb2wgZHNfcG9vbDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfcG9vbF9jaSwgTlVMTCwgJmRzX3Bvb2wpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0RTX1RZUEVTX0lOX0xBWU9VVCA9IDI7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkc2xfYmluZGluZ1tNQVhfRFNfVFlQRVNfSU5fTEFZT1VUXSA9IHt9OworICAgIGRzbF9iaW5kaW5nWzBdLmJpbmRpbmcgPSAwOworICAgIGRzbF9iaW5kaW5nWzBdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRzbF9iaW5kaW5nWzBdLmRlc2NyaXB0b3JDb3VudCA9IDU7CisgICAgZHNsX2JpbmRpbmdbMF0uc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9BTEw7CisgICAgZHNsX2JpbmRpbmdbMF0ucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKworICAgIC8vIENyZWF0ZSBsYXlvdXQgaWRlbnRpY2FsIHRvIHNldDAgbGF5b3V0IGJ1dCB3LyBkaWZmZXJlbnQgc3RhZ2VGbGFncworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZHNsX2ZzX3N0YWdlX29ubHkgPSB7fTsKKyAgICBkc2xfZnNfc3RhZ2Vfb25seS5iaW5kaW5nID0gMDsKKyAgICBkc2xfZnNfc3RhZ2Vfb25seS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjsKKyAgICBkc2xfZnNfc3RhZ2Vfb25seS5kZXNjcmlwdG9yQ291bnQgPSA1OworICAgIGRzbF9mc19zdGFnZV9vbmx5LnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOyAgLy8gRGlmZmVyZW50IHN0YWdlRmxhZ3MgdG8gY2F1c2UgZXJyb3IgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbmQgdGltZQorICAgIGRzbF9mc19zdGFnZV9vbmx5LnBJbW11dGFibGVTYW1wbGVycyA9IE5VTEw7CisKKyAgICB2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqPiBkc19sYXlvdXRzOworICAgIC8vIENyZWF0ZSA0IHVuaXF1ZSBsYXlvdXRzIGZvciBmdWxsIHBpcGVsaW5lTGF5b3V0LCBhbmQgMSBzcGVjaWFsIGZzLW9ubHkKKyAgICAvLyBsYXlvdXQgZm9yIGVycm9yIGNhc2UKKyAgICBkc19sYXlvdXRzLmVtcGxhY2VfYmFjayhtX2RldmljZSwgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZz4oMSwgZHNsX2JpbmRpbmdbMF0pKTsKKworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dE9iaiBkc19sYXlvdXRfZnNfb25seShtX2RldmljZSwge2RzbF9mc19zdGFnZV9vbmx5fSk7CisKKyAgICBkc2xfYmluZGluZ1swXS5iaW5kaW5nID0gMDsKKyAgICBkc2xfYmluZGluZ1swXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOworICAgIGRzbF9iaW5kaW5nWzBdLmRlc2NyaXB0b3JDb3VudCA9IDI7CisgICAgZHNsX2JpbmRpbmdbMV0uYmluZGluZyA9IDE7CisgICAgZHNsX2JpbmRpbmdbMV0uZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTsKKyAgICBkc2xfYmluZGluZ1sxXS5kZXNjcmlwdG9yQ291bnQgPSAyOworICAgIGRzbF9iaW5kaW5nWzFdLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfQUxMOworICAgIGRzbF9iaW5kaW5nWzFdLnBJbW11dGFibGVTYW1wbGVycyA9IE5VTEw7CisgICAgZHNfbGF5b3V0cy5lbXBsYWNlX2JhY2sobV9kZXZpY2UsIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc+KHtkc2xfYmluZGluZ1swXSwgZHNsX2JpbmRpbmdbMV19KSk7CisKKyAgICBkc2xfYmluZGluZ1swXS5iaW5kaW5nID0gMDsKKyAgICBkc2xfYmluZGluZ1swXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOworICAgIGRzbF9iaW5kaW5nWzBdLmRlc2NyaXB0b3JDb3VudCA9IDU7CisgICAgZHNfbGF5b3V0cy5lbXBsYWNlX2JhY2sobV9kZXZpY2UsIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc+KDEsIGRzbF9iaW5kaW5nWzBdKSk7CisKKyAgICBkc2xfYmluZGluZ1swXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjsKKyAgICBkc2xfYmluZGluZ1swXS5kZXNjcmlwdG9yQ291bnQgPSAyOworICAgIGRzX2xheW91dHMuZW1wbGFjZV9iYWNrKG1fZGV2aWNlLCBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPigxLCBkc2xfYmluZGluZ1swXSkpOworCisgICAgY29uc3QgYXV0byAmZHNfdmtfbGF5b3V0cyA9IE1ha2VWa0hhbmRsZXM8VmtEZXNjcmlwdG9yU2V0TGF5b3V0Pihkc19sYXlvdXRzKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBOVU1fU0VUUyA9IDQ7CisgICAgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXRbTlVNX1NFVFNdID0ge307CisgICAgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGFsbG9jX2luZm8gPSB7fTsKKyAgICBhbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTzsKKyAgICBhbGxvY19pbmZvLmRlc2NyaXB0b3JQb29sID0gZHNfcG9vbDsKKyAgICBhbGxvY19pbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA9IGRzX3ZrX2xheW91dHMuc2l6ZSgpOworICAgIGFsbG9jX2luZm8ucFNldExheW91dHMgPSBkc192a19sYXlvdXRzLmRhdGEoKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCBkZXNjcmlwdG9yU2V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIFZrRGVzY3JpcHRvclNldCBkczBfZnNfb25seSA9IHt9OworICAgIGFsbG9jX2luZm8uZGVzY3JpcHRvclNldENvdW50ID0gMTsKKyAgICBhbGxvY19pbmZvLnBTZXRMYXlvdXRzID0gJmRzX2xheW91dF9mc19vbmx5LmhhbmRsZSgpOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFsbG9jX2luZm8sICZkczBfZnNfb25seSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRzX2xheW91dHNbMF0sICZkc19sYXlvdXRzWzFdfSk7CisgICAgLy8gQ3JlYXRlIHBpcGVsaW5lTGF5b3V0IHdpdGggb25seSBvbmUgc2V0TGF5b3V0CisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBzaW5nbGVfcGlwZV9sYXlvdXQobV9kZXZpY2UsIHsmZHNfbGF5b3V0c1swXX0pOworICAgIC8vIENyZWF0ZSBwaXBlbGluZUxheW91dCB3aXRoIDIgZGVzY3JpcHRvciBzZXRMYXlvdXQgYXQgaW5kZXggMAorICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZV9sYXlvdXRfb25lX2Rlc2MobV9kZXZpY2UsIHsmZHNfbGF5b3V0c1szXX0pOworICAgIC8vIENyZWF0ZSBwaXBlbGluZUxheW91dCB3aXRoIDUgU0FNUExFUiBkZXNjcmlwdG9yIHNldExheW91dCBhdCBpbmRleCAwCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlX2xheW91dF9maXZlX3NhbXAobV9kZXZpY2UsIHsmZHNfbGF5b3V0c1syXX0pOworICAgIC8vIENyZWF0ZSBwaXBlbGluZUxheW91dCB3aXRoIFVCIHR5cGUsIGJ1dCBzdGFnZUZsYWdzIGZvciBGUyBvbmx5CisgICAgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlX2xheW91dF9mc19vbmx5KG1fZGV2aWNlLCB7JmRzX2xheW91dF9mc19vbmx5fSk7CisgICAgLy8gQ3JlYXRlIHBpcGVsaW5lTGF5b3V0IHcvIGluY29tcGF0aWJsZSBzZXQwIGxheW91dCwgYnV0IHNldDEgaXMgZmluZQorICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZV9sYXlvdXRfYmFkX3NldDAobV9kZXZpY2UsIHsmZHNfbGF5b3V0X2ZzX29ubHksICZkc19sYXlvdXRzWzFdfSk7CisKKyAgICAvLyBBZGQgYnVmZmVyIGJpbmRpbmcgZm9yIFVCTworICAgIHVpbnQzMl90IHFmaSA9IDA7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJjaSA9IHt9OworICAgIGJjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBiY2kudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUOworICAgIGJjaS5zaXplID0gODsKKyAgICBiY2kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICBiY2kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9ICZxZmk7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYmNpKTsKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZlcl9pbmZvOworICAgIGJ1ZmZlcl9pbmZvLmJ1ZmZlciA9IGJ1ZmZlci5oYW5kbGUoKTsKKyAgICBidWZmZXJfaW5mby5vZmZzZXQgPSAwOworICAgIGJ1ZmZlcl9pbmZvLnJhbmdlID0gVktfV0hPTEVfU0laRTsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlID0ge307CisgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvclNldFswXTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSAmYnVmZmVyX2luZm87CisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIE5VTEwpOworCisgICAgLy8gQ3JlYXRlIFBTTyB0byBiZSB1c2VkIGZvciBkcmF3LXRpbWUgZXJyb3JzIGJlbG93CisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdVbmlmb3JtU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisgICAgVmtQaXBlbGluZU9iaiBwaXBlKG1fZGV2aWNlKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBpcGVfbGF5b3V0X2ZzX29ubHkuaGFuZGxlKCksIHJlbmRlclBhc3MoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisgICAgLy8gVE9ETyA6IFdhbnQgdG8gY2F1c2UgdmFyaW91cyBiaW5kaW5nIGluY29tcGF0aWJpbGl0eSBpc3N1ZXMgaGVyZSB0byB0ZXN0CisgICAgLy8gRHJhd1N0YXRlCisgICAgLy8gIEZpcnN0IGNhdXNlIHZhcmlvdXMgdmVyaWZ5X2xheW91dF9jb21wYXRpYmlsaXR5KCkgZmFpbHMKKyAgICAvLyAgU2Vjb25kIGRpc3R1cmIgZWFybHkgYW5kIGxhdGUgc2V0cyBhbmQgdmVyaWZ5IElORk8gbXNncworICAgIC8vIFZlcmlmeVNldExheW91dENvbXBhdGliaWxpdHkgZmFpbCBjYXNlczoKKyAgICAvLyAxLiBpbnZhbGlkIFZrUGlwZWxpbmVMYXlvdXQgKGxheW91dCkgcGFzc2VkIGludG8gdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCaW5kRGVzY3JpcHRvclNldHMtbGF5b3V0LXBhcmFtZXRlciIpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RUb0hhbmRsZTxWa1BpcGVsaW5lTGF5b3V0LCB1aW50cHRyX3Q+KDB4YmFhZGIxYmUpLCAwLCAxLCAmZGVzY3JpcHRvclNldFswXSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyAyLiBsYXlvdXRJbmRleCBleGNlZWRzICMgb2YgbGF5b3V0cyBpbiBsYXlvdXQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIgYXR0ZW1wdGluZyB0byBiaW5kIHNldCB0byBpbmRleCAxIik7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBzaW5nbGVfcGlwZV9sYXlvdXQuaGFuZGxlKCksIDAsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvclNldFswXSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyAzLiBQaXBlbGluZSBzZXRMYXlvdXRbMF0gaGFzIDIgZGVzY3JpcHRvcnMsIGJ1dCBzZXQgYmVpbmcgYm91bmQgaGFzIDUKKyAgICAvLyBkZXNjcmlwdG9ycworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiBoYXMgMiB0b3RhbCBkZXNjcmlwdG9ycywgYnV0ICIpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZV9sYXlvdXRfb25lX2Rlc2MuaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvclNldFswXSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyA0LiBzYW1lICMgb2YgZGVzY3JpcHRvcnMgYnV0IG1pc21hdGNoIGluIHR5cGUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIgaXMgdHlwZSAnVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVInIGJ1dCBiaW5kaW5nICIpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZV9sYXlvdXRfZml2ZV9zYW1wLmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3JTZXRbMF0sIDAsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gNS4gc2FtZSAjIG9mIGRlc2NyaXB0b3JzIGJ1dCBtaXNtYXRjaCBpbiBzdGFnZUZsYWdzCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGhhcyBzdGFnZUZsYWdzIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQgYnV0IGJpbmRpbmcgMCBmb3IgIik7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlX2xheW91dF9mc19vbmx5LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3JTZXRbMF0sIDAsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gTm93IHRoYXQgd2UncmUgZG9uZSBhY3RpdmVseSB1c2luZyB0aGUgcGlwZWxpbmVMYXlvdXQgdGhhdCBnZnggcGlwZWxpbmUKKyAgICAvLyAgd2FzIGNyZWF0ZWQgd2l0aCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVsZXRlIGl0LiBEbyB0aGF0IG5vdyB0byB2ZXJpZnkKKyAgICAvLyAgdGhhdCB2YWxpZGF0aW9uIG9iZXlzIHBpcGVsaW5lTGF5b3V0IGxpZmV0aW1lCisgICAgcGlwZV9sYXlvdXRfZnNfb25seS5SZXNldCgpOworCisgICAgLy8gQ2F1c2UgZHJhdy10aW1lIGVycm9ycyBkdWUgdG8gUFNPIGluY29tcGF0aWJpbGl0aWVzCisgICAgLy8gMS4gRXJyb3IgZHVlIHRvIG5vdCBiaW5kaW5nIHJlcXVpcmVkIHNldCAod2UgYWN0dWFsbHkgdXNlIHNhbWUgY29kZSBhcworICAgIC8vIGFib3ZlIHRvIGRpc3R1cmIgc2V0MCkKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yU2V0WzBdLCAwLCBOVUxMKTsKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVfbGF5b3V0X2JhZF9zZXQwLmhhbmRsZSgpLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3JTZXRbMV0sIDAsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiB1c2VzIHNldCAjMCBidXQgdGhhdCBzZXQgaXMgbm90IGJvdW5kLiIpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gMi4gRXJyb3IgZHVlIHRvIGJvdW5kIHNldCBub3QgYmVpbmcgY29tcGF0aWJsZSB3aXRoIFBTTydzCisgICAgLy8gVmtQaXBlbGluZUxheW91dCAoZGlmZiBzdGFnZUZsYWdzIGluIHRoaXMgY2FzZSkKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yU2V0WzBdLCAwLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIgYm91bmQgYXMgc2V0ICMwIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXctTm9uZS0wMjY5NyIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFJlbWFpbmluZyBjbGVhbi11cAorICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfcG9vbCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgTnVsbFJlbmRlclBhc3MpIHsKKyAgICAvLyBCaW5kIGEgTlVMTCBSZW5kZXJQYXNzCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDbWRCZWdpblJlbmRlclBhc3M6IHJlcXVpcmVkIHBhcmFtZXRlciBwUmVuZGVyUGFzc0JlZ2luIHNwZWNpZmllZCBhcyBOVUxMIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgLy8gRG9uJ3QgY2FyZSBhYm91dCBSZW5kZXJQYXNzIGhhbmRsZSBiL2MgZXJyb3Igc2hvdWxkIGJlIGZsYWdnZWQgYmVmb3JlCisgICAgLy8gdGhhdAorICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgTlVMTCwgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEVuZENvbW1hbmRCdWZmZXJXaXRoaW5SZW5kZXJQYXNzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiRW5kIGEgY29tbWFuZCBidWZmZXIgd2l0aCBhbiBhY3RpdmUgcmVuZGVyIHBhc3MiKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtFbmRDb21tYW5kQnVmZmVyLWNvbW1hbmRCdWZmZXItMDAwNjAiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBFbmQgY29tbWFuZCBidWZmZXIgcHJvcGVybHkgdG8gYXZvaWQgZHJpdmVyIGlzc3Vlcy4gVGhpcyBpcyBzYWZlIC0tIHRoZQorICAgIC8vIHByZXZpb3VzIHZrOjpFbmRDb21tYW5kQnVmZmVyIHNob3VsZCBub3QgaGF2ZSByZWFjaGVkIHRoZSBkcml2ZXIuCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIC8vIFRPRE86IEFkZCB0ZXN0IGZvciBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkKKyAgICAvLyBUT0RPOiBBZGQgdGVzdCBmb3IgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUCit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRFNVc2FnZUJpdHNFcnJvcnMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIHVwZGF0ZSBkZXNjcmlwdG9yIHNldHMgZm9yIGltYWdlcyBhbmQgYnVmZmVycyB0aGF0IGRvIG5vdCBoYXZlIGNvcnJlY3QgdXNhZ2UgYml0cyBzZXRzLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGNvbnN0IFZrRm9ybWF0IGJ1ZmZlcl9mb3JtYXQgPSBWS19GT1JNQVRfUjhfVU5PUk07CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wZXJ0aWVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoZ3B1KCksIGJ1ZmZlcl9mb3JtYXQsICZmb3JtYXRfcHJvcGVydGllcyk7CisgICAgaWYgKCEoZm9ybWF0X3Byb3BlcnRpZXMuYnVmZmVyRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQpKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUIGZvciB0aGlzIGZvcm1hdDsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6YXJyYXk8VmtEZXNjcmlwdG9yUG9vbFNpemUsIFZLX0RFU0NSSVBUT1JfVFlQRV9SQU5HRV9TSVpFPiBkc190eXBlX2NvdW50OworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBkc190eXBlX2NvdW50LnNpemUoKTsgKytpKSB7CisgICAgICAgIGRzX3R5cGVfY291bnRbaV0udHlwZSA9IFZrRGVzY3JpcHRvclR5cGUoaSk7CisgICAgICAgIGRzX3R5cGVfY291bnRbaV0uZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICB9CisKKyAgICB2a190ZXN0aW5nOjpEZXNjcmlwdG9yUG9vbCBkc19wb29sOworICAgIGRzX3Bvb2wuaW5pdCgqbV9kZXZpY2UsIHZrX3Rlc3Rpbmc6OkRlc2NyaXB0b3JQb29sOjpjcmVhdGVfaW5mbygwLCBWS19ERVNDUklQVE9SX1RZUEVfUkFOR0VfU0laRSwgZHNfdHlwZV9jb3VudCkpOworICAgIEFTU0VSVF9UUlVFKGRzX3Bvb2wuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiBkc2xfYmluZGluZ3MoMSk7CisgICAgZHNsX2JpbmRpbmdzWzBdLmJpbmRpbmcgPSAwOworICAgIGRzbF9iaW5kaW5nc1swXS5kZXNjcmlwdG9yVHlwZSA9IFZrRGVzY3JpcHRvclR5cGUoMCk7CisgICAgZHNsX2JpbmRpbmdzWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZHNsX2JpbmRpbmdzWzBdLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfQUxMOworICAgIGRzbF9iaW5kaW5nc1swXS5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgLy8gQ3JlYXRlIGFycmF5cyBvZiBsYXlvdXQgYW5kIGRlc2NyaXB0b3Igb2JqZWN0cworICAgIHVzaW5nIFVwRGVzY3JpcHRvclNldCA9IHN0ZDo6dW5pcXVlX3B0cjx2a190ZXN0aW5nOjpEZXNjcmlwdG9yU2V0PjsKKyAgICBzdGQ6OnZlY3RvcjxVcERlc2NyaXB0b3JTZXQ+IGRlc2NyaXB0b3Jfc2V0czsKKyAgICB1c2luZyBVcERlc2NyaXB0b3JTZXRMYXlvdXQgPSBzdGQ6OnVuaXF1ZV9wdHI8VmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqPjsKKyAgICBzdGQ6OnZlY3RvcjxVcERlc2NyaXB0b3JTZXRMYXlvdXQ+IGRzX2xheW91dHM7CisgICAgZGVzY3JpcHRvcl9zZXRzLnJlc2VydmUoVktfREVTQ1JJUFRPUl9UWVBFX1JBTkdFX1NJWkUpOworICAgIGRzX2xheW91dHMucmVzZXJ2ZShWS19ERVNDUklQVE9SX1RZUEVfUkFOR0VfU0laRSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFZLX0RFU0NSSVBUT1JfVFlQRV9SQU5HRV9TSVpFOyArK2kpIHsKKyAgICAgICAgZHNsX2JpbmRpbmdzWzBdLmRlc2NyaXB0b3JUeXBlID0gVmtEZXNjcmlwdG9yVHlwZShpKTsKKyAgICAgICAgZHNfbGF5b3V0cy5wdXNoX2JhY2soVXBEZXNjcmlwdG9yU2V0TGF5b3V0KG5ldyBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmoobV9kZXZpY2UsIGRzbF9iaW5kaW5ncykpKTsKKyAgICAgICAgZGVzY3JpcHRvcl9zZXRzLnB1c2hfYmFjayhVcERlc2NyaXB0b3JTZXQoZHNfcG9vbC5hbGxvY19zZXRzKCptX2RldmljZSwgKmRzX2xheW91dHMuYmFjaygpKSkpOworICAgICAgICBBU1NFUlRfVFJVRShkZXNjcmlwdG9yX3NldHMuYmFjaygpLT5pbml0aWFsaXplZCgpKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBidWZmZXIgJiBidWZmZXJWaWV3IHRvIGJlIHVzZWQgZm9yIGludmFsaWQgdXBkYXRlcworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBidWZmZXJfc2l6ZSA9IDI1NjsKKyAgICB1aW50OF90IGRhdGFbYnVmZmVyX3NpemVdOworICAgIFZrQ29uc3RhbnRCdWZmZXJPYmogYnVmZmVyKG1fZGV2aWNlLCBidWZmZXJfc2l6ZSwgZGF0YSwgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCk7CisgICAgVmtDb25zdGFudEJ1ZmZlck9iaiBzdG9yYWdlX3RleGVsX2J1ZmZlcihtX2RldmljZSwgYnVmZmVyX3NpemUsIGRhdGEsIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQpOworICAgIEFTU0VSVF9UUlVFKGJ1ZmZlci5pbml0aWFsaXplZCgpICYmIHN0b3JhZ2VfdGV4ZWxfYnVmZmVyLmluaXRpYWxpemVkKCkpOworCisgICAgYXV0byBidWZmX3ZpZXdfY2kgPSB2a190ZXN0aW5nOjpCdWZmZXJWaWV3OjpjcmVhdGVJbmZvKGJ1ZmZlci5oYW5kbGUoKSwgVktfRk9STUFUX1I4X1VOT1JNKTsKKyAgICB2a190ZXN0aW5nOjpCdWZmZXJWaWV3IGJ1ZmZlcl92aWV3X29iaiwgc3RvcmFnZV90ZXhlbF9idWZmZXJfdmlld19vYmo7CisgICAgYnVmZmVyX3ZpZXdfb2JqLmluaXQoKm1fZGV2aWNlLCBidWZmX3ZpZXdfY2kpOworICAgIGJ1ZmZfdmlld19jaS5idWZmZXIgPSBzdG9yYWdlX3RleGVsX2J1ZmZlci5oYW5kbGUoKTsKKyAgICBzdG9yYWdlX3RleGVsX2J1ZmZlcl92aWV3X29iai5pbml0KCptX2RldmljZSwgYnVmZl92aWV3X2NpKTsKKyAgICBBU1NFUlRfVFJVRShidWZmZXJfdmlld19vYmouaW5pdGlhbGl6ZWQoKSAmJiBzdG9yYWdlX3RleGVsX2J1ZmZlcl92aWV3X29iai5pbml0aWFsaXplZCgpKTsKKyAgICBWa0J1ZmZlclZpZXcgYnVmZmVyX3ZpZXcgPSBidWZmZXJfdmlld19vYmouaGFuZGxlKCk7CisgICAgVmtCdWZmZXJWaWV3IHN0b3JhZ2VfdGV4ZWxfYnVmZmVyX3ZpZXcgPSBzdG9yYWdlX3RleGVsX2J1ZmZlcl92aWV3X29iai5oYW5kbGUoKTsKKworICAgIC8vIENyZWF0ZSBhbiBpbWFnZSB0byBiZSB1c2VkIGZvciBpbnZhbGlkIHVwZGF0ZXMKKyAgICBWa0ltYWdlT2JqIGltYWdlX29iaihtX2RldmljZSk7CisgICAgaW1hZ2Vfb2JqLkluaXROb0xheW91dCg2NCwgNjQsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV9vYmouaW5pdGlhbGl6ZWQoKSk7CisgICAgVmtJbWFnZVZpZXcgaW1hZ2VfdmlldyA9IGltYWdlX29iai50YXJnZXRWaWV3KFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSk7CisKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZfaW5mbyA9IHt9OworICAgIGJ1ZmZfaW5mby5idWZmZXIgPSBidWZmZXIuaGFuZGxlKCk7CisgICAgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvIGltZ19pbmZvID0ge307CisgICAgaW1nX2luZm8uaW1hZ2VWaWV3ID0gaW1hZ2VfdmlldzsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlID0ge307CisgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0QmluZGluZyA9IDA7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucFRleGVsQnVmZmVyVmlldyA9ICZidWZmZXJfdmlldzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBCdWZmZXJJbmZvID0gJmJ1ZmZfaW5mbzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBJbWFnZUluZm8gPSAmaW1nX2luZm87CisKKyAgICAvLyBUaGVzZSBlcnJvciBtZXNzYWdlcyBhbGlnbiB3aXRoIFZrRGVzY3JpcHRvclR5cGUgc3RydWN0CisgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZXNbXSA9IHsKKyAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRJbWFnZVZpZXciLCAgLy8gcGxhY2Vob2xkZXIsIG5vIGVycm9yIGZvciBTQU1QTEVSIGRlc2NyaXB0b3IKKyAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRJbWFnZVZpZXciLCAgLy8gQ09NQklORURfSU1BR0VfU0FNUExFUgorICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZEltYWdlVmlldyIsICAvLyBTQU1QTEVEX0lNQUdFCisgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2VWaWV3IiwgIC8vIFNUT1JBR0VfSU1BR0UKKyAgICAgICAgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzQiLCAgICAgICAgLy8gVU5JRk9STV9URVhFTF9CVUZGRVIKKyAgICAgICAgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzUiLCAgICAgICAgLy8gU1RPUkFHRV9URVhFTF9CVUZGRVIKKyAgICAgICAgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzAiLCAgICAgICAgLy8gVU5JRk9STV9CVUZGRVIKKyAgICAgICAgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzEiLCAgICAgICAgLy8gU1RPUkFHRV9CVUZGRVIKKyAgICAgICAgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMzAiLCAgICAgICAgLy8gVU5JRk9STV9CVUZGRVJfRFlOQU1JQworICAgICAgICAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzMSIsICAgICAgICAvLyBTVE9SQUdFX0JVRkZFUl9EWU5BTUlDCisgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkSW1hZ2VWaWV3IiAgIC8vIElOUFVUX0FUVEFDSE1FTlQKKyAgICB9OworICAgIC8vIFN0YXJ0IGxvb3AgYXQgMSBhcyBTQU1QTEVSIGRlc2MgdHlwZSBoYXMgbm8gdXNhZ2UgYml0IGVycm9yCisgICAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IFZLX0RFU0NSSVBUT1JfVFlQRV9SQU5HRV9TSVpFOyArK2kpIHsKKyAgICAgICAgaWYgKFZrRGVzY3JpcHRvclR5cGUoaSkgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSKSB7CisgICAgICAgICAgICAvLyBOb3cgY2hlY2sgZm9yIFVOSUZPUk1fVEVYRUxfQlVGRkVSIHVzaW5nIHN0b3JhZ2VfdGV4ZWxfYnVmZmVyX3ZpZXcKKyAgICAgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUucFRleGVsQnVmZmVyVmlldyA9ICZzdG9yYWdlX3RleGVsX2J1ZmZlcl92aWV3OworICAgICAgICB9CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvclR5cGUgPSBWa0Rlc2NyaXB0b3JUeXBlKGkpOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IGRlc2NyaXB0b3Jfc2V0c1tpXS0+aGFuZGxlKCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZXJyb3JfY29kZXNbaV0pOworCisgICAgICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgaWYgKFZrRGVzY3JpcHRvclR5cGUoaSkgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSKSB7CisgICAgICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLnBUZXhlbEJ1ZmZlclZpZXcgPSAmYnVmZmVyX3ZpZXc7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRFNCdWZmZXJJbmZvRXJyb3JzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkF0dGVtcHQgdG8gdXBkYXRlIGJ1ZmZlciBkZXNjcmlwdG9yIHNldCB0aGF0IGhhcyBpbmNvcnJlY3QgcGFyYW1ldGVycyBpbiBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIHN0cnVjdC4gVGhpcyBpbmNsdWRlczpcbiIKKyAgICAgICAgIjEuIG9mZnNldCB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYnVmZmVyIHNpemVcbiIKKyAgICAgICAgIjIuIHJhbmdlIHZhbHVlIG9mIDBcbiIKKyAgICAgICAgIjMuIHJhbmdlIHZhbHVlIGdyZWF0ZXIgdGhhbiBidWZmZXIgKHNpemUgLSBvZmZzZXQpIik7CisKKyAgICAvLyBHUEREUDIgbmVlZGVkIGZvciBwdXNoIGRlc2NyaXB0b3JzIHN1cHBvcnQgYmVsb3cKKyAgICBib29sIGdwZHAyX3N1cHBvcnQgPSBJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX1NQRUNfVkVSU0lPTik7CisgICAgaWYgKGdwZHAyX3N1cHBvcnQpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGJvb2wgdXBkYXRlX3RlbXBsYXRlX3N1cHBvcnQgPSBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKHVwZGF0ZV90ZW1wbGF0ZV9zdXBwb3J0KSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERlc2NyaXB0b3IgVXBkYXRlIFRlbXBsYXRlIEV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgdGVtcGxhdGUgY2FzZXMgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICB9CisKKyAgICAvLyBOb3RlOiBJbmNsdWRlcyB3b3JrYXJvdW5kIGZvciBzb21lIGltcGxlbWVudGF0aW9ucyB3aGljaCBpbmNvcnJlY3RseSByZXR1cm4gMCBtYXhQdXNoRGVzY3JpcHRvcnMKKyAgICBib29sIHB1c2hfZGVzY3JpcHRvcl9zdXBwb3J0ID0gZ3BkcDJfc3VwcG9ydCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHZXRQdXNoRGVzY3JpcHRvclByb3BlcnRpZXMoaW5zdGFuY2UoKSwgZ3B1KCkpLm1heFB1c2hEZXNjcmlwdG9ycyA+IDApOworICAgIGlmIChwdXNoX2Rlc2NyaXB0b3Jfc3VwcG9ydCkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgUHVzaCBEZXNjcmlwdG9yIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBwdXNoIGRlc2NyaXB0b3IgY2FzZXMgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc+IGRzX2JpbmRpbmdzID0geworICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfX07CisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwgZHNfYmluZGluZ3MpOworCisgICAgLy8gQ3JlYXRlIGEgYnVmZmVyIHRvIGJlIHVzZWQgZm9yIGludmFsaWQgdXBkYXRlcworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmX2NpID0ge307CisgICAgYnVmZl9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZmX2NpLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICBidWZmX2NpLnNpemUgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1pblVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAgYnVmZl9jaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZl9jaSk7CisKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZfaW5mbyA9IHt9OworICAgIGJ1ZmZfaW5mby5idWZmZXIgPSBidWZmZXIuaGFuZGxlKCk7CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZSA9IHt9OworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBUZXhlbEJ1ZmZlclZpZXcgPSBudWxscHRyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSAmYnVmZl9pbmZvOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9IG51bGxwdHI7CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKworICAgIC8vIFJlbHlpbmcgb24gdGhlICJyZXR1cm4gbnVsbHB0ciBmb3Igbm9uLWVuYWJsZWQgZXh0ZW5zaW9ucworICAgIGF1dG8gdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPQorICAgICAgICAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIpOworICAgIGF1dG8gdmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSID0KKyAgICAgICAgKFBGTl92a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIpOworICAgIGF1dG8gdmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSID0KKyAgICAgICAgKFBGTl92a1VwZGF0ZURlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiIpOworCisgICAgaWYgKHVwZGF0ZV90ZW1wbGF0ZV9zdXBwb3J0KSB7CisgICAgICAgIEFTU0VSVF9ORSh2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiwgbnVsbHB0cik7CisgICAgICAgIEFTU0VSVF9ORSh2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIsIG51bGxwdHIpOworICAgICAgICBBU1NFUlRfTkUodmtVcGRhdGVEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSLCBudWxscHRyKTsKKyAgICB9CisKKyAgICAvLyBTZXR1cCBmb3IgdXBkYXRlIHcvIHRlbXBsYXRlIHRlc3RzCisgICAgLy8gQ3JlYXRlIGEgdGVtcGxhdGUgb2YgZGVzY3JpcHRvciBzZXQgdXBkYXRlcworICAgIHN0cnVjdCBTaW1wbGVUZW1wbGF0ZURhdGEgeworICAgICAgICB1aW50OF90IHBhZGRpbmdbN107CisgICAgICAgIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gYnVmZl9pbmZvOworICAgICAgICB1aW50MzJfdCBvdGhlcl9wYWRkaW5nWzRdOworICAgIH07CisgICAgU2ltcGxlVGVtcGxhdGVEYXRhIHVwZGF0ZV90ZW1wbGF0ZV9kYXRhID0ge307CisKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5IHVwZGF0ZV90ZW1wbGF0ZV9lbnRyeSA9IHt9OworICAgIHVwZGF0ZV90ZW1wbGF0ZV9lbnRyeS5kc3RCaW5kaW5nID0gMDsKKyAgICB1cGRhdGVfdGVtcGxhdGVfZW50cnkuZHN0QXJyYXlFbGVtZW50ID0gMDsKKyAgICB1cGRhdGVfdGVtcGxhdGVfZW50cnkuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICB1cGRhdGVfdGVtcGxhdGVfZW50cnkuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgdXBkYXRlX3RlbXBsYXRlX2VudHJ5Lm9mZnNldCA9IG9mZnNldG9mKFNpbXBsZVRlbXBsYXRlRGF0YSwgYnVmZl9pbmZvKTsKKyAgICB1cGRhdGVfdGVtcGxhdGVfZW50cnkuc3RyaWRlID0gc2l6ZW9mKFNpbXBsZVRlbXBsYXRlRGF0YSk7CisKKyAgICBhdXRvIHVwZGF0ZV90ZW1wbGF0ZV9jaSA9IGx2bF9pbml0X3N0cnVjdDxWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm9LSFI+KCk7CisgICAgdXBkYXRlX3RlbXBsYXRlX2NpLmRlc2NyaXB0b3JVcGRhdGVFbnRyeUNvdW50ID0gMTsKKyAgICB1cGRhdGVfdGVtcGxhdGVfY2kucERlc2NyaXB0b3JVcGRhdGVFbnRyaWVzID0gJnVwZGF0ZV90ZW1wbGF0ZV9lbnRyeTsKKyAgICB1cGRhdGVfdGVtcGxhdGVfY2kudGVtcGxhdGVUeXBlID0gVktfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfVFlQRV9ERVNDUklQVE9SX1NFVDsKKyAgICB1cGRhdGVfdGVtcGxhdGVfY2kuZGVzY3JpcHRvclNldExheW91dCA9IGRlc2NyaXB0b3Jfc2V0LmxheW91dF8uaGFuZGxlKCk7CisKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSB1cGRhdGVfdGVtcGxhdGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBpZiAodXBkYXRlX3RlbXBsYXRlX3N1cHBvcnQpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihtX2RldmljZS0+ZGV2aWNlKCksICZ1cGRhdGVfdGVtcGxhdGVfY2ksIG51bGxwdHIsICZ1cGRhdGVfdGVtcGxhdGUpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhyZXN1bHQpOworICAgIH0KKworICAgIC8vIFZLX0tIUl9wdXNoX2Rlc2NyaXB0b3Igc3VwcG9ydAorICAgIGF1dG8gdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiA9CisgICAgICAgIChQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIpOworICAgIGF1dG8gdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUiA9IChQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIoCisgICAgICAgIG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIiKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmo+IHB1c2hfZHNsID0gbnVsbHB0cjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtQaXBlbGluZUxheW91dE9iaj4gcGlwZWxpbmVfbGF5b3V0ID0gbnVsbHB0cjsKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZSBwdXNoX3RlbXBsYXRlID0gVktfTlVMTF9IQU5ETEU7CisgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9zdXBwb3J0KSB7CisgICAgICAgIEFTU0VSVF9ORSh2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSLCBudWxscHRyKTsKKyAgICAgICAgcHVzaF9kc2wucmVzZXQoCisgICAgICAgICAgICBuZXcgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqKG1fZGV2aWNlLCBkc19iaW5kaW5ncywgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUikpOworICAgICAgICBwaXBlbGluZV9sYXlvdXQucmVzZXQobmV3IFZrUGlwZWxpbmVMYXlvdXRPYmoobV9kZXZpY2UsIHtwdXNoX2RzbC5nZXQoKX0pKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocHVzaF9kc2wtPmluaXRpYWxpemVkKCkpOworCisgICAgICAgIGlmICh1cGRhdGVfdGVtcGxhdGVfc3VwcG9ydCkgeworICAgICAgICAgICAgQVNTRVJUX05FKHZrQ21kUHVzaERlc2NyaXB0b3JTZXRXaXRoVGVtcGxhdGVLSFIsIG51bGxwdHIpOworICAgICAgICAgICAgYXV0byBwdXNoX3RlbXBsYXRlX2NpID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mb0tIUj4oKTsKKyAgICAgICAgICAgIHB1c2hfdGVtcGxhdGVfY2kuZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQgPSAxOworICAgICAgICAgICAgcHVzaF90ZW1wbGF0ZV9jaS5wRGVzY3JpcHRvclVwZGF0ZUVudHJpZXMgPSAmdXBkYXRlX3RlbXBsYXRlX2VudHJ5OworICAgICAgICAgICAgcHVzaF90ZW1wbGF0ZV9jaS50ZW1wbGF0ZVR5cGUgPSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSOworICAgICAgICAgICAgcHVzaF90ZW1wbGF0ZV9jaS5kZXNjcmlwdG9yU2V0TGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICBwdXNoX3RlbXBsYXRlX2NpLnBpcGVsaW5lQmluZFBvaW50ID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzsKKyAgICAgICAgICAgIHB1c2hfdGVtcGxhdGVfY2kucGlwZWxpbmVMYXlvdXQgPSBwaXBlbGluZV9sYXlvdXQtPmhhbmRsZSgpOworICAgICAgICAgICAgcHVzaF90ZW1wbGF0ZV9jaS5zZXQgPSAwOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihtX2RldmljZS0+ZGV2aWNlKCksICZwdXNoX3RlbXBsYXRlX2NpLCBudWxscHRyLCAmcHVzaF90ZW1wbGF0ZSk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBkb190ZXN0ID0gWyZdKGNvbnN0IGNoYXIgKmRlc2lyZWRfZmFpbHVyZSkgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGRlc2lyZWRfZmFpbHVyZSk7CisgICAgICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9zdXBwb3J0KSB7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGRlc2lyZWRfZmFpbHVyZSk7CisgICAgICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgICAgICB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC0+aGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3dyaXRlKTsKKyAgICAgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cGRhdGVfdGVtcGxhdGVfc3VwcG9ydCkgeworICAgICAgICAgICAgdXBkYXRlX3RlbXBsYXRlX2RhdGEuYnVmZl9pbmZvID0gYnVmZl9pbmZvOyAgLy8gY29weSB0aGUgdGVzdCBjYXNlIGluZm9ybWF0aW9uIGludG8gb3VyICJwRGF0YSIKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZGVzaXJlZF9mYWlsdXJlKTsKKyAgICAgICAgICAgIHZrVXBkYXRlRGVzY3JpcHRvclNldFdpdGhUZW1wbGF0ZUtIUihtX2RldmljZS0+ZGV2aWNlKCksIGRlc2NyaXB0b3Jfc2V0LnNldF8sIHVwZGF0ZV90ZW1wbGF0ZSwgJnVwZGF0ZV90ZW1wbGF0ZV9kYXRhKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICAgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9zdXBwb3J0KSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBkZXNpcmVkX2ZhaWx1cmUpOworICAgICAgICAgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAgICAgICAgICAgICB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0V2l0aFRlbXBsYXRlS0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHB1c2hfdGVtcGxhdGUsIHBpcGVsaW5lX2xheW91dC0+aGFuZGxlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlX3RlbXBsYXRlX2RhdGEpOworICAgICAgICAgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gQ2F1c2UgZXJyb3IgZHVlIHRvIG9mZnNldCBvdXQgb2YgcmFuZ2UKKyAgICBidWZmX2luZm8ub2Zmc2V0ID0gYnVmZl9jaS5zaXplOworICAgIGJ1ZmZfaW5mby5yYW5nZSA9IFZLX1dIT0xFX1NJWkU7CisgICAgZG9fdGVzdCgiVlVJRC1Wa0Rlc2NyaXB0b3JCdWZmZXJJbmZvLW9mZnNldC0wMDM0MCIpOworCisgICAgLy8gTm93IGNhdXNlIGVycm9yIGR1ZSB0byByYW5nZSBvZiAwCisgICAgYnVmZl9pbmZvLm9mZnNldCA9IDA7CisgICAgYnVmZl9pbmZvLnJhbmdlID0gMDsKKyAgICBkb190ZXN0KCJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tcmFuZ2UtMDAzNDEiKTsKKworICAgIC8vIE5vdyBjYXVzZSBlcnJvciBkdWUgdG8gcmFuZ2UgZXhjZWVkaW5nIGJ1ZmZlciBzaXplIC0gb2Zmc2V0CisgICAgYnVmZl9pbmZvLm9mZnNldCA9IDA7CisgICAgYnVmZl9pbmZvLnJhbmdlID0gYnVmZl9jaS5zaXplICsgMTsKKyAgICBkb190ZXN0KCJWVUlELVZrRGVzY3JpcHRvckJ1ZmZlckluZm8tcmFuZ2UtMDAzNDIiKTsKKworICAgIGlmICh1cGRhdGVfdGVtcGxhdGVfc3VwcG9ydCkgeworICAgICAgICB2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIobV9kZXZpY2UtPmRldmljZSgpLCB1cGRhdGVfdGVtcGxhdGUsIG51bGxwdHIpOworICAgICAgICBpZiAocHVzaF9kZXNjcmlwdG9yX3N1cHBvcnQpIHsKKyAgICAgICAgICAgIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihtX2RldmljZS0+ZGV2aWNlKCksIHB1c2hfdGVtcGxhdGUsIG51bGxwdHIpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIERTQnVmZmVyTGltaXRFcnJvcnMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQXR0ZW1wdCB0byB1cGRhdGUgYnVmZmVyIGRlc2NyaXB0b3Igc2V0IHRoYXQgaGFzIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gdmFsdWVzIHRoYXQgdmlvbGF0ZSBkZXZpY2UgbGltaXRzLlxuIgorICAgICAgICAiVGVzdCBjYXNlcyBpbmNsdWRlOlxuIgorICAgICAgICAiMS4gcmFuZ2Ugb2YgdW5pZm9ybSBidWZmZXIgdXBkYXRlIGV4Y2VlZHMgbWF4VW5pZm9ybUJ1ZmZlclJhbmdlXG4iCisgICAgICAgICIyLiBvZmZzZXQgb2YgdW5pZm9ybSBidWZmZXIgdXBkYXRlIGlzIG5vdCBtdWx0aXBsZSBvZiBtaW5Vbmlmb3JtQnVmZmVyT2Zmc2V0QWxpZ25tZW50XG4iCisgICAgICAgICIzLiB1c2luZyBWS19XSE9MRV9TSVpFIHdpdGggdW5pZm9ybSBidWZmZXIgc2l6ZSBleGNlZWRpbmcgbWF4VW5pZm9ybUJ1ZmZlclJhbmdlXG4iCisgICAgICAgICI0LiByYW5nZSBvZiBzdG9yYWdlIGJ1ZmZlciB1cGRhdGUgZXhjZWVkcyBtYXhTdG9yYWdlQnVmZmVyUmFuZ2VcbiIKKyAgICAgICAgIjUuIG9mZnNldCBvZiBzdG9yYWdlIGJ1ZmZlciB1cGRhdGUgaXMgbm90IG11bHRpcGxlIG9mIG1pblN0b3JhZ2VCdWZmZXJPZmZzZXRBbGlnbm1lbnRcbiIKKyAgICAgICAgIjYuIHVzaW5nIFZLX1dIT0xFX1NJWkUgd2l0aCBzdG9yYWdlIGJ1ZmZlciBzaXplIGV4Y2VlZGluZyBtYXhTdG9yYWdlQnVmZmVyUmFuZ2UiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBzdHJ1Y3QgVGVzdENhc2UgeworICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3JfdHlwZTsKKyAgICAgICAgVmtCdWZmZXJVc2FnZUZsYWdCaXRzIGJ1ZmZlcl91c2FnZTsKKyAgICAgICAgVmtEZXZpY2VTaXplIG1heF9yYW5nZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWF4X3JhbmdlX3Z1OworICAgICAgICBWa0RldmljZVNpemUgbWluX2FsaWduOworICAgICAgICBzdGQ6OnN0cmluZyBtaW5fYWxpZ25fdnU7CisgICAgfTsKKworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdF9jYXNlIDogeworICAgICAgICAgICAgIFRlc3RDYXNlKHtWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4VW5pZm9ybUJ1ZmZlclJhbmdlLCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMzMiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWluVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDAzMjcifSksCisgICAgICAgICAgICAgVGVzdENhc2Uoe1ZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfQlVGRkVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhTdG9yYWdlQnVmZmVyUmFuZ2UsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzMzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5taW5TdG9yYWdlQnVmZmVyT2Zmc2V0QWxpZ25tZW50LCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kZXNjcmlwdG9yVHlwZS0wMDMyOCJ9KSwKKyAgICAgICAgIH0pIHsKKyAgICAgICAgLy8gQ3JlYXRlIGxheW91dCB3aXRoIHNpbmdsZSBidWZmZXIKKyAgICAgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIHRlc3RfY2FzZS5kZXNjcmlwdG9yX3R5cGUsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyBDcmVhdGUgYSBidWZmZXIgdG8gYmUgdXNlZCBmb3IgaW52YWxpZCB1cGRhdGVzCisgICAgICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBiY2kgPSB7fTsKKyAgICAgICAgYmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgICAgICBiY2kudXNhZ2UgPSB0ZXN0X2Nhc2UuYnVmZmVyX3VzYWdlOworICAgICAgICBiY2kuc2l6ZSA9IHRlc3RfY2FzZS5tYXhfcmFuZ2UgKyB0ZXN0X2Nhc2UubWluX2FsaWduOyAgLy8gTWFrZSBidWZmZXIgYmlnZ2VyIHRoYW4gcmFuZ2UgbGltaXQKKyAgICAgICAgYmNpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICAgICAgVmtCdWZmZXIgYnVmZmVyOworICAgICAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlQnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJjaSwgTlVMTCwgJmJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgLy8gSGF2ZSB0byBiaW5kIG1lbW9yeSB0byBidWZmZXIgYmVmb3JlIGRlc2NyaXB0b3IgdXBkYXRlCisgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworICAgICAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCAmbWVtX3JlcXMpOworCisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbV9hbGxvYyA9IHt9OworICAgICAgICBtZW1fYWxsb2Muc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgbWVtX2FsbG9jLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gbWVtX3JlcXMuc2l6ZTsKKyAgICAgICAgYm9vbCBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJm1lbV9hbGxvYywgMCk7CisgICAgICAgIGlmICghcGFzcykgeworICAgICAgICAgICAgcHJpbnRmKCIlcyBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGluIERTQnVmZmVyTGltaXRFcnJvcnM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgICAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFZrRGV2aWNlTWVtb3J5IG1lbTsKKyAgICAgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1lbV9hbGxvYywgTlVMTCwgJm1lbSk7CisgICAgICAgIGlmIChWS19TVUNDRVNTICE9IGVycikgeworICAgICAgICAgICAgcHJpbnRmKCIlcyBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGluIERTQnVmZmVyTGltaXRFcnJvcnM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgICAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgTlVMTCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSB2azo6QmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgbWVtLCAwKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZfaW5mbyA9IHt9OworICAgICAgICBidWZmX2luZm8uYnVmZmVyID0gYnVmZmVyOworICAgICAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlID0ge307CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLnBUZXhlbEJ1ZmZlclZpZXcgPSBudWxscHRyOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLnBCdWZmZXJJbmZvID0gJmJ1ZmZfaW5mbzsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5wSW1hZ2VJbmZvID0gbnVsbHB0cjsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yVHlwZSA9IHRlc3RfY2FzZS5kZXNjcmlwdG9yX3R5cGU7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKworICAgICAgICAvLyBFeGNlZWQgcmFuZ2UgbGltaXQKKyAgICAgICAgaWYgKHRlc3RfY2FzZS5tYXhfcmFuZ2UgIT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgYnVmZl9pbmZvLnJhbmdlID0gdGVzdF9jYXNlLm1heF9yYW5nZSArIDE7CisgICAgICAgICAgICBidWZmX2luZm8ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgdGVzdF9jYXNlLm1heF9yYW5nZV92dSk7CisgICAgICAgICAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZSwgMCwgTlVMTCk7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlZHVjZSBzaXplIG9mIHJhbmdlIHRvIGFjY2VwdGFibGUgbGltaXQgYW5kIGNhdXNlIG9mZnNldCBlcnJvcgorICAgICAgICBpZiAodGVzdF9jYXNlLm1pbl9hbGlnbiA+IDEpIHsKKyAgICAgICAgICAgIGJ1ZmZfaW5mby5yYW5nZSA9IHRlc3RfY2FzZS5tYXhfcmFuZ2U7CisgICAgICAgICAgICBidWZmX2luZm8ub2Zmc2V0ID0gdGVzdF9jYXNlLm1pbl9hbGlnbiAtIDE7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHRlc3RfY2FzZS5taW5fYWxpZ25fdnUpOworICAgICAgICAgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIE5VTEwpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeGNlZWQgZWZmZWN0aXZlIHJhbmdlIGxpbWl0IGJ5IHVzaW5nIFZLX1dIT0xFX1NJWkUKKyAgICAgICAgYnVmZl9pbmZvLnJhbmdlID0gVktfV0hPTEVfU0laRTsKKyAgICAgICAgYnVmZl9pbmZvLm9mZnNldCA9IDA7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgdGVzdF9jYXNlLm1heF9yYW5nZV92dSk7CisgICAgICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgLy8gQ2xlYW51cAorICAgICAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgTlVMTCk7CisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBOVUxMKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRFNBc3BlY3RCaXRzRXJyb3JzKSB7CisgICAgLy8gVE9ETyA6IEluaXRpYWxseSBvbmx5IGNhdGNoaW5nIGNhc2Ugd2hlcmUgREVQVEggJiBTVEVOQ0lMIGFzcGVjdCBiaXRzCisgICAgLy8gIGFyZSBzZXQsIGJ1dCBjb3VsZCBleHBhbmQgdGhpcyB0ZXN0IHRvIGhpdCBtb3JlIGNhc2VzLgorICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gdXBkYXRlIGRlc2NyaXB0b3Igc2V0cyBmb3IgaW1hZ2VzIHRoYXQgZG8gbm90IGhhdmUgY29ycmVjdCBhc3BlY3QgYml0cyBzZXRzLiIpOworICAgIFZrUmVzdWx0IGVycjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgYXV0byBkZXB0aF9mb3JtYXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBpZiAoIWRlcHRoX2Zvcm1hdCkgeworICAgICAgICBwcmludGYoIiVzIE5vIERlcHRoICsgU3RlbmNpbCBmb3JtYXQgZm91bmQuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVCwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW1hZ2UgdG8gYmUgdXNlZCBmb3IgaW52YWxpZCB1cGRhdGVzCisgICAgVmtJbWFnZU9iaiBpbWFnZV9vYmoobV9kZXZpY2UpOworICAgIFZrRm9ybWF0UHJvcGVydGllcyBmbXRfcHJvcHM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIGRlcHRoX2Zvcm1hdCwgJmZtdF9wcm9wcyk7CisgICAgaWYgKCFpbWFnZV9vYmouSXNDb21wYXRpYmxlKFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULCBmbXRfcHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMpICYmCisgICAgICAgICFpbWFnZV9vYmouSXNDb21wYXRpYmxlKFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULCBmbXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzKSkgeworICAgICAgICBwcmludGYoIiVzIERlcHRoICsgU3RlbmNpbCBmb3JtYXQgY2Fubm90IGJlIHNhbXBsZWQuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW1hZ2Vfb2JqLkluaXQoNjQsIDY0LCAxLCBkZXB0aF9mb3JtYXQsIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZV9vYmouaW5pdGlhbGl6ZWQoKSk7CisgICAgVmtJbWFnZSBpbWFnZSA9IGltYWdlX29iai5pbWFnZSgpOworCisgICAgLy8gTm93IGNyZWF0ZSB2aWV3IGZvciBpbWFnZQorICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpbWFnZV92aWV3X2NpID0ge307CisgICAgaW1hZ2Vfdmlld19jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgaW1hZ2Vfdmlld19jaS5pbWFnZSA9IGltYWdlOworICAgIGltYWdlX3ZpZXdfY2kuZm9ybWF0ID0gZGVwdGhfZm9ybWF0OworICAgIGltYWdlX3ZpZXdfY2kudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgaW1hZ2Vfdmlld19jaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGltYWdlX3ZpZXdfY2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaW1hZ2Vfdmlld19jaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIC8vIFNldHRpbmcgYm90aCBkZXB0aCAmIHN0ZW5jaWwgYXNwZWN0IGJpdHMgaXMgaWxsZWdhbCBmb3IgYW4gaW1hZ2VWaWV3IHVzZWQKKyAgICAvLyB0byBwb3B1bGF0ZSBhIGRlc2NyaXB0b3Igc2V0LgorICAgIGltYWdlX3ZpZXdfY2kuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKworICAgIFZrSW1hZ2VWaWV3IGltYWdlX3ZpZXc7CisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV92aWV3X2NpLCBOVUxMLCAmaW1hZ2Vfdmlldyk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBkZXNjcmlwdG9yX3NldC5Xcml0ZURlc2NyaXB0b3JJbWFnZUluZm8oMCwgaW1hZ2VfdmlldywgVktfTlVMTF9IQU5ETEUsIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UKTsKKworICAgIGNvbnN0IGNoYXIgKmVycm9yX21zZyA9ICJWVUlELVZrRGVzY3JpcHRvckltYWdlSW5mby1pbWFnZVZpZXctMDE5NzYiOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZXJyb3JfbXNnKTsKKyAgICBkZXNjcmlwdG9yX3NldC5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2VfdmlldywgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRFNUeXBlTWlzbWF0Y2gpIHsKKyAgICAvLyBDcmVhdGUgRFMgdy8gbGF5b3V0IG9mIG9uZSB0eXBlIGFuZCBhdHRlbXB0IFVwZGF0ZSB3LyBtaXMtbWF0Y2hlZCB0eXBlCisgICAgVmtSZXN1bHQgZXJyOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIiBiaW5kaW5nICMwIHdpdGggdHlwZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIgYnV0IHVwZGF0ZSB0eXBlIGlzIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisgICAgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgTlVMTCwgJnNhbXBsZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBkZXNjcmlwdG9yX3NldC5Xcml0ZURlc2NyaXB0b3JJbWFnZUluZm8oMCwgVktfTlVMTF9IQU5ETEUsIHNhbXBsZXIsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSKTsKKyAgICBkZXNjcmlwdG9yX3NldC5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCBzYW1wbGVyLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBEU1VwZGF0ZU91dE9mQm91bmRzKSB7CisgICAgLy8gRm9yIG92ZXJsYXBwaW5nIFVwZGF0ZSwgaGF2ZSBhcnJheUluZGV4IGV4Y2VlZCB0aGF0IG9mIGxheW91dAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QXJyYXlFbGVtZW50LTAwMzIxIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBWa0J1ZmZlclRlc3QgYnVmZmVyX3Rlc3QobV9kZXZpY2UsIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQpOworICAgIGlmICghYnVmZmVyX3Rlc3QuR2V0QnVmZmVyQ3VycmVudCgpKSB7CisgICAgICAgIC8vIFNvbWV0aGluZyBwcmV2ZW50ZWQgY3JlYXRpb24gb2YgYnVmZmVyIHNvIGFib3J0CisgICAgICAgIHByaW50ZigiJXMgQnVmZmVyIGNyZWF0aW9uIGZhaWxlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ29ycmVjdGx5IHVwZGF0ZSBkZXNjcmlwdG9yIHRvIGF2b2lkICJOT1RfVVBEQVRFRCIgZXJyb3IKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZfaW5mbyA9IHt9OworICAgIGJ1ZmZfaW5mby5idWZmZXIgPSBidWZmZXJfdGVzdC5HZXRCdWZmZXIoKTsKKyAgICBidWZmX2luZm8ub2Zmc2V0ID0gMDsKKyAgICBidWZmX2luZm8ucmFuZ2UgPSAxMDI0OworCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZTsKKyAgICBtZW1zZXQoJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIHNpemVvZihkZXNjcmlwdG9yX3dyaXRlKSk7CisgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEFycmF5RWxlbWVudCA9IDE7IC8qIFRoaXMgaW5kZXggb3V0IG9mIGJvdW5kcyBmb3IgdGhlIHVwZGF0ZSAqLworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSAmYnVmZl9pbmZvOworCisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZERTVXBkYXRlSW5kZXgpIHsKKyAgICAvLyBDcmVhdGUgbGF5b3V0IHcvIGNvdW50IG9mIDEgYW5kIGF0dGVtcHQgdXBkYXRlIHRvIHRoYXQgbGF5b3V0IHcvIGJpbmRpbmcgaW5kZXggMgorICAgIFZrUmVzdWx0IGVycjsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZHN0QmluZGluZy0wMDMxNSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzYW1wbGVyX2NpID0gU2FmZVNhbmVTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgIFZrU2FtcGxlciBzYW1wbGVyOworICAgIGVyciA9IHZrOjpDcmVhdGVTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNhbXBsZXJfY2ksIE5VTEwsICZzYW1wbGVyKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gVGhpcyBpcyB0aGUgd3JvbmcgdHlwZSwgYnV0IG91dCBvZiBib3VuZHMgd2lsbCBiZSBmbGFnZ2VkIGZpcnN0CisgICAgZGVzY3JpcHRvcl9zZXQuV3JpdGVEZXNjcmlwdG9ySW1hZ2VJbmZvKDIsIFZLX05VTExfSEFORExFLCBzYW1wbGVyLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUik7CisgICAgZGVzY3JpcHRvcl9zZXQuVXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIERTVXBkYXRlRW1wdHlCaW5kaW5nKSB7CisgICAgLy8gQ3JlYXRlIGxheW91dCB3LyBlbXB0eSBiaW5kaW5nIGFuZCBhdHRlbXB0IHRvIHVwZGF0ZSBpdAorICAgIFZrUmVzdWx0IGVycjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUiwgMCAvKiAhISAqLywgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisgICAgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgTlVMTCwgJnNhbXBsZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JDb3VudCA9IDEsIExpZSBoZXJlIHRvIGF2b2lkIHBhcmFtZXRlcl92YWxpZGF0aW9uIGVycm9yCisgICAgLy8gVGhpcyBpcyB0aGUgd3JvbmcgdHlwZSwgYnV0IGVtcHR5IGJpbmRpbmcgZXJyb3Igd2lsbCBiZSBmbGFnZ2VkIGZpcnN0CisgICAgZGVzY3JpcHRvcl9zZXQuV3JpdGVEZXNjcmlwdG9ySW1hZ2VJbmZvKDAsIFZLX05VTExfSEFORExFLCBzYW1wbGVyLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRzdEJpbmRpbmctMDAzMTYiKTsKKyAgICBkZXNjcmlwdG9yX3NldC5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FtcGxlciwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZERTVXBkYXRlU3RydWN0KSB7CisgICAgLy8gQ2FsbCBVcGRhdGVEUyB3LyBzdHJ1Y3QgdHlwZSBvdGhlciB0aGFuIHZhbGlkIFZLX1NUUlVDVFVSX1RZUEVfVVBEQVRFXyoKKyAgICAvLyB0eXBlcworICAgIFZrUmVzdWx0IGVycjsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIi5zVHlwZSBtdXN0IGJlIFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9jaSA9IFNhZmVTYW5lU2FtcGxlckNyZWF0ZUluZm8oKTsKKyAgICBWa1NhbXBsZXIgc2FtcGxlcjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2NpLCBOVUxMLCAmc2FtcGxlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrRGVzY3JpcHRvckltYWdlSW5mbyBpbmZvID0ge307CisgICAgaW5mby5zYW1wbGVyID0gc2FtcGxlcjsKKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGU7CisgICAgbWVtc2V0KCZkZXNjcmlwdG9yX3dyaXRlLCAwLCBzaXplb2YoZGVzY3JpcHRvcl93cml0ZSkpOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsgLyogSW50ZW50aW9uYWxseSBicm9rZW4gc3RydWN0IHR5cGUgKi8KKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IGRlc2NyaXB0b3Jfc2V0LnNldF87CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIC8vIFRoaXMgaXMgdGhlIHdyb25nIHR5cGUsIGJ1dCBvdXQgb2YgYm91bmRzIHdpbGwgYmUgZmxhZ2dlZCBmaXJzdAorICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBJbWFnZUluZm8gPSAmaW5mbzsKKworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FtcGxlciwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU2FtcGxlRGVzY3JpcHRvclVwZGF0ZUVycm9yKSB7CisgICAgLy8gQ3JlYXRlIGEgc2luZ2xlIFNhbXBsZXIgZGVzY3JpcHRvciBhbmQgc2VuZCBpdCBhbiBpbnZhbGlkIFNhbXBsZXIKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI1Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIFZrU2FtcGxlciBzYW1wbGVyID0gQ2FzdFRvSGFuZGxlPFZrU2FtcGxlciwgdWludHB0cl90PigweGJhYWRiZWVmKTsgIC8vIFNhbXBsZXIgd2l0aCBpbnZhbGlkIGhhbmRsZQorCisgICAgZGVzY3JpcHRvcl9zZXQuV3JpdGVEZXNjcmlwdG9ySW1hZ2VJbmZvKDAsIFZLX05VTExfSEFORExFLCBzYW1wbGVyLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUik7CisgICAgZGVzY3JpcHRvcl9zZXQuVXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZVZpZXdEZXNjcmlwdG9yVXBkYXRlRXJyb3IpIHsKKyAgICAvLyBDcmVhdGUgYSBzaW5nbGUgY29tYmluZWQgSW1hZ2UvU2FtcGxlciBkZXNjcmlwdG9yIGFuZCBzZW5kIGl0IGFuIGludmFsaWQKKyAgICAvLyBpbWFnZVZpZXcKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAwMzI2Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzYW1wbGVyX2NpID0gU2FmZVNhbmVTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgIFZrU2FtcGxlciBzYW1wbGVyOworICAgIGVyciA9IHZrOjpDcmVhdGVTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNhbXBsZXJfY2ksIE5VTEwsICZzYW1wbGVyKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtJbWFnZVZpZXcgdmlldyA9IENhc3RUb0hhbmRsZTxWa0ltYWdlVmlldywgdWludHB0cl90PigweGJhYWRiZWVmKTsgIC8vIGludmFsaWQgaW1hZ2VWaWV3IG9iamVjdAorCisgICAgZGVzY3JpcHRvcl9zZXQuV3JpdGVEZXNjcmlwdG9ySW1hZ2VJbmZvKDAsIHZpZXcsIHNhbXBsZXIsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSKTsKKyAgICBkZXNjcmlwdG9yX3NldC5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FtcGxlciwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ29weURlc2NyaXB0b3JVcGRhdGVFcnJvcnMpIHsKKyAgICAvLyBDcmVhdGUgRFMgdy8gbGF5b3V0IG9mIDIgdHlwZXMsIHdyaXRlIHVwZGF0ZSAxIGFuZCBhdHRlbXB0IHRvIGNvcHktdXBkYXRlCisgICAgLy8gaW50byB0aGUgb3RoZXIKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmluZGluZyAjMSB3aXRoIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIuIFR5cGVzIGRvIG5vdCBtYXRjaC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9jaSA9IFNhZmVTYW5lU2FtcGxlckNyZWF0ZUluZm8oKTsKKyAgICBWa1NhbXBsZXIgc2FtcGxlcjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2NpLCBOVUxMLCAmc2FtcGxlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIFNBTVBMRVIgYmluZGluZyBmcm9tIGxheW91dCBhYm92ZQorICAgIC8vIFRoaXMgd3JpdGUgdXBkYXRlIHNob3VsZCBzdWNjZWVkCisgICAgZGVzY3JpcHRvcl9zZXQuV3JpdGVEZXNjcmlwdG9ySW1hZ2VJbmZvKDEsIFZLX05VTExfSEFORExFLCBzYW1wbGVyLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUik7CisgICAgZGVzY3JpcHRvcl9zZXQuVXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKyAgICAvLyBOb3cgcGVyZm9ybSBhIGNvcHkgdXBkYXRlIHRoYXQgZmFpbHMgZHVlIHRvIHR5cGUgbWlzbWF0Y2gKKyAgICBWa0NvcHlEZXNjcmlwdG9yU2V0IGNvcHlfZHNfdXBkYXRlOworICAgIG1lbXNldCgmY29weV9kc191cGRhdGUsIDAsIHNpemVvZihWa0NvcHlEZXNjcmlwdG9yU2V0KSk7CisgICAgY29weV9kc191cGRhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT1BZX0RFU0NSSVBUT1JfU0VUOworICAgIGNvcHlfZHNfdXBkYXRlLnNyY1NldCA9IGRlc2NyaXB0b3Jfc2V0LnNldF87CisgICAgY29weV9kc191cGRhdGUuc3JjQmluZGluZyA9IDE7ICAvLyBDb3B5IGZyb20gU0FNUExFUiBiaW5kaW5nCisgICAgY29weV9kc191cGRhdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBjb3B5X2RzX3VwZGF0ZS5kc3RCaW5kaW5nID0gMDsgICAgICAgLy8gRVJST1IgOiBjb3B5IHRvIFVOSUZPUk0gYmluZGluZworICAgIGNvcHlfZHNfdXBkYXRlLmRlc2NyaXB0b3JDb3VudCA9IDE7ICAvLyBjb3B5IDEgZGVzY3JpcHRvcgorICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDAsIE5VTEwsIDEsICZjb3B5X2RzX3VwZGF0ZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBOb3cgcGVyZm9ybSBhIGNvcHkgdXBkYXRlIHRoYXQgZmFpbHMgZHVlIHRvIGJpbmRpbmcgb3V0IG9mIGJvdW5kcworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiBkb2VzIG5vdCBoYXZlIGNvcHkgdXBkYXRlIHNyYyBiaW5kaW5nIG9mIDMuIik7CisgICAgbWVtc2V0KCZjb3B5X2RzX3VwZGF0ZSwgMCwgc2l6ZW9mKFZrQ29weURlc2NyaXB0b3JTZXQpKTsKKyAgICBjb3B5X2RzX3VwZGF0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPUFlfREVTQ1JJUFRPUl9TRVQ7CisgICAgY29weV9kc191cGRhdGUuc3JjU2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBjb3B5X2RzX3VwZGF0ZS5zcmNCaW5kaW5nID0gMzsgIC8vIEVSUk9SIDogSW52YWxpZCBiaW5kaW5nIGZvciBtYXRjaGluZyBsYXlvdXQKKyAgICBjb3B5X2RzX3VwZGF0ZS5kc3RTZXQgPSBkZXNjcmlwdG9yX3NldC5zZXRfOworICAgIGNvcHlfZHNfdXBkYXRlLmRzdEJpbmRpbmcgPSAwOworICAgIGNvcHlfZHNfdXBkYXRlLmRlc2NyaXB0b3JDb3VudCA9IDE7ICAvLyBDb3B5IDEgZGVzY3JpcHRvcgorICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDAsIE5VTEwsIDEsICZjb3B5X2RzX3VwZGF0ZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIE5vdyBwZXJmb3JtIGEgY29weSB1cGRhdGUgdGhhdCBmYWlscyBkdWUgdG8gYmluZGluZyBvdXQgb2YgYm91bmRzCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJpbmRpbmcjMSB3aXRoIG9mZnNldCBpbmRleCBvZiAxIHBsdXMgdXBkYXRlIGFycmF5IG9mZnNldCBvZiAwIGFuZCB1cGRhdGUgb2YgNSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9ycyBvdmVyc3RlcHMgdG90YWwgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHNldDogMi4iKTsKKworICAgIG1lbXNldCgmY29weV9kc191cGRhdGUsIDAsIHNpemVvZihWa0NvcHlEZXNjcmlwdG9yU2V0KSk7CisgICAgY29weV9kc191cGRhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT1BZX0RFU0NSSVBUT1JfU0VUOworICAgIGNvcHlfZHNfdXBkYXRlLnNyY1NldCA9IGRlc2NyaXB0b3Jfc2V0LnNldF87CisgICAgY29weV9kc191cGRhdGUuc3JjQmluZGluZyA9IDE7CisgICAgY29weV9kc191cGRhdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBjb3B5X2RzX3VwZGF0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICBjb3B5X2RzX3VwZGF0ZS5kZXNjcmlwdG9yQ291bnQgPSA1OyAgLy8gRVJST1IgY29weSA1IGRlc2NyaXB0b3JzIChvdXQgb2YgYm91bmRzIGZvciBsYXlvdXQpCisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMCwgTlVMTCwgMSwgJmNvcHlfZHNfdXBkYXRlKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FtcGxlciwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRHJhd1dpdGhQaXBlbGluZUluY29tcGF0aWJsZVdpdGhSZW5kZXJQYXNzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkhpdCBSZW5kZXJQYXNzIGluY29tcGF0aWJsZSBjYXNlcy4gSW5pdGlhbCBjYXNlIGlzIGRyYXdpbmcgd2l0aCBhbiBhY3RpdmUgcmVuZGVycGFzcyB0aGF0J3Mgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgYm91bmQgIgorICAgICAgICAicGlwZWxpbmUgc3RhdGUgb2JqZWN0J3MgY3JlYXRpb24gcmVuZGVycGFzcyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRlc2NyaXB0b3Jfc2V0LmxheW91dF99KTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7ICAvLyBXZSBzaG91bGRuJ3QgbmVlZCBhIGZyYWdtZW50IHNoYWRlcgorICAgIC8vIGJ1dCBhZGQgaXQgdG8gYmUgYWJsZSB0byBydW4gb24gbW9yZSBkZXZpY2VzCisgICAgLy8gQ3JlYXRlIGEgcmVuZGVycGFzcyB0aGF0IHdpbGwgYmUgaW5jb21wYXRpYmxlIHdpdGggZGVmYXVsdCByZW5kZXJwYXNzCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGNvbG9yX2F0dCA9IHt9OworICAgIGNvbG9yX2F0dC5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0ge307CisgICAgc3VicGFzcy5jb2xvckF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50cyA9ICZjb2xvcl9hdHQ7CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge307CisgICAgcnBjaS5zdWJwYXNzQ291bnQgPSAxOworICAgIHJwY2kucFN1YnBhc3NlcyA9ICZzdWJwYXNzOworICAgIHJwY2kuYXR0YWNobWVudENvdW50ID0gMTsKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2hfZGVzYyA9IHt9OworICAgIGF0dGFjaF9kZXNjLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgLy8gRm9ybWF0IGluY29tcGF0aWJsZSB3aXRoIFBTTyBSUCBjb2xvciBhdHRhY2ggZm9ybWF0IEI4RzhSOEE4X1VOT1JNCisgICAgYXR0YWNoX2Rlc2MuZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIGF0dGFjaF9kZXNjLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgcnBjaS5wQXR0YWNobWVudHMgPSAmYXR0YWNoX2Rlc2M7CisgICAgcnBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MC4wZiwgMC4wZiwgNjQuMGYsIDY0LjBmLCAwLjBmLCAxLjBmfTsKKyAgICBtX3ZpZXdwb3J0cy5wdXNoX2JhY2sodmlld3BvcnQpOworICAgIHBpcGUuU2V0Vmlld3BvcnQobV92aWV3cG9ydHMpOworICAgIFZrUmVjdDJEIHJlY3QgPSB7ezAsIDB9LCB7NjQsIDY0fX07CisgICAgbV9zY2lzc29ycy5wdXNoX2JhY2socmVjdCk7CisgICAgcGlwZS5TZXRTY2lzc29yKG1fc2Npc3NvcnMpOworICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIHJwKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBjYmlpID0ge307CisgICAgY2JpaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk87CisgICAgY2JpaS5yZW5kZXJQYXNzID0gcnA7CisgICAgY2JpaS5zdWJwYXNzID0gMDsKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY2JiaSA9IHt9OworICAgIGNiYmkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIGNiYmkucEluaGVyaXRhbmNlSW5mbyA9ICZjYmlpOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJmNiYmkpOworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJm1fcmVuZGVyUGFzc0JlZ2luSW5mbywgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRHJhdy1yZW5kZXJQYXNzLTAyNjg0Iik7CisgICAgLy8gUmVuZGVyIHRyaWFuZ2xlICh0aGUgZXJyb3Igc2hvdWxkIHRyaWdnZXIgb24gdGhlIGF0dGVtcHQgdG8gZHJhdykuCisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDMsIDEsIDAsIDApOworCisgICAgLy8gRmluYWxpemUgcmVjb3JkaW5nIG9mIHRoZSBjb21tYW5kIGJ1ZmZlcgorICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNYWludDFCaW5kaW5nU2xpY2VPZjNESW1hZ2UpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQXR0ZW1wdCB0byBiaW5kIGEgc2xpY2Ugb2YgYSAzRCB0ZXh0dXJlIGluIGEgZGVzY3JpcHRvciBzZXQuIFRoaXMgaXMgZXhwbGljaXRseSBkaXNhbGxvd2VkIGJ5IEtIUl9tYWludGVuYW5jZTEgdG8ga2VlcCAiCisgICAgICAgICJ0aGluZ3Mgc2ltcGxlIGZvciBkcml2ZXJzLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBpcyBub3Qgc3VwcG9ydGVkOyBza2lwcGluZ1xuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFZrUmVzdWx0IGVycjsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaWNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9DUkVBVEVfMkRfQVJSQVlfQ09NUEFUSUJMRV9CSVRfS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9UWVBFXzNELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMiwgMzIsIDMyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUR9OworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLmluaXQoJmljaSk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTywKKyAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgMCwKKyAgICAgICAgaW1hZ2UuaGFuZGxlKCksCisgICAgICAgIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCwKKyAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLAorICAgICAgICB7VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLCBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSwKKyAgICAgICAgIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZfSwKKyAgICAgICAge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDEsIDAsIDF9LAorICAgIH07CisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJml2Y2ksIG51bGxwdHIsICZ2aWV3KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gTWVhdCBvZiB0aGUgdGVzdC4KKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRGVzY3JpcHRvckltYWdlSW5mby1pbWFnZVZpZXctMDAzNDMiKTsKKworICAgIFZrRGVzY3JpcHRvckltYWdlSW5mbyBkaWkgPSB7VktfTlVMTF9IQU5ETEUsIHZpZXcsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMfTsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCB3cml0ZSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Jfc2V0LnNldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHJ9OworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZ3cml0ZSwgMCwgbnVsbHB0cik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldywgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVXBkYXRlRGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHVwZGF0ZXMgdG8gZGVzY3JpcHRvciBzZXRzIHdpdGggZGVzdHJveWVkIGRlc2NyaXB0b3Igc2V0IGxheW91dHMiKTsKKyAgICAvLyBUT0RPOiBVcGRhdGUgdG8gbWF0Y2ggdGhlIGRlc2NyaXB0b3Igc2V0IGxheW91dCBzcGVjaWZpYyBWVUlEcy9WQUxJREFUSU9OX0VSUk9SXyogd2hlbiBwcmVzZW50CisgICAgY29uc3QgYXV0byBrV3JpdGVEZXN0cm95ZWRMYXlvdXQgPSAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kc3RTZXQtMDAzMjAiOworICAgIGNvbnN0IGF1dG8ga0NvcHlEc3REZXN0cm95ZWRMYXlvdXQgPSAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LWRzdFNldC1wYXJhbWV0ZXIiOworICAgIGNvbnN0IGF1dG8ga0NvcHlTcmNEZXN0cm95ZWRMYXlvdXQgPSAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY1NldC1wYXJhbWV0ZXIiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIFNldCB1cCB0aGUgZGVzY3JpcHRvciAocmVzb3VyY2UpIGFuZCB3cml0ZS9jb3B5IG9wZXJhdGlvbnMgdG8gdXNlLgorICAgIGZsb2F0IGRhdGFbMTZdID0ge307CisgICAgVmtDb25zdGFudEJ1ZmZlck9iaiBidWZmZXIobV9kZXZpY2UsIHNpemVvZihkYXRhKSwgZGF0YSwgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVCk7CisgICAgQVNTRVJUX1RSVUUoYnVmZmVyLmluaXRpYWxpemVkKCkpOworCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBpbmZvID0ge307CisgICAgaW5mby5idWZmZXIgPSBidWZmZXIuaGFuZGxlKCk7CisgICAgaW5mby5yYW5nZSA9IFZLX1dIT0xFX1NJWkU7CisKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCB3cml0ZV9kZXNjcmlwdG9yID0ge307CisgICAgd3JpdGVfZGVzY3JpcHRvci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIHdyaXRlX2Rlc2NyaXB0b3IuZHN0U2V0ID0gVktfTlVMTF9IQU5ETEU7ICAvLyBtdXN0IHVwZGF0ZSB0aGlzCisgICAgd3JpdGVfZGVzY3JpcHRvci5kc3RCaW5kaW5nID0gMDsKKyAgICB3cml0ZV9kZXNjcmlwdG9yLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgd3JpdGVfZGVzY3JpcHRvci5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjsKKyAgICB3cml0ZV9kZXNjcmlwdG9yLnBCdWZmZXJJbmZvID0gJmluZm87CisKKyAgICBWa0NvcHlEZXNjcmlwdG9yU2V0IGNvcHlfZGVzY3JpcHRvciA9IHt9OworICAgIGNvcHlfZGVzY3JpcHRvci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPUFlfREVTQ1JJUFRPUl9TRVQ7CisgICAgY29weV9kZXNjcmlwdG9yLnNyY1NldCA9IFZLX05VTExfSEFORExFOyAgLy8gbXVzdCB1cGRhdGUKKyAgICBjb3B5X2Rlc2NyaXB0b3Iuc3JjQmluZGluZyA9IDA7CisgICAgY29weV9kZXNjcmlwdG9yLmRzdFNldCA9IFZLX05VTExfSEFORExFOyAgLy8gbXVzdCB1cGRhdGUKKyAgICBjb3B5X2Rlc2NyaXB0b3IuZHN0QmluZGluZyA9IDA7CisgICAgY29weV9kZXNjcmlwdG9yLmRlc2NyaXB0b3JDb3VudCA9IDE7CisKKyAgICAvLyBDcmVhdGUgdmFsaWQgYW5kIGludmFsaWQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkZXNjcmlwdG9yIHNldHMKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiBvbmVfdW5pZm9ybV9idWZmZXIgPSB7CisgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgIH07CisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBnb29kX2RzdChtX2RldmljZSwgb25lX3VuaWZvcm1fYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShnb29kX2RzdC5Jbml0aWFsaXplZCgpKTsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgYmFkX2RzdChtX2RldmljZSwgb25lX3VuaWZvcm1fYnVmZmVyKTsKKyAgICAvLyBNdXN0IGFzc2VydCBiZWZvcmUgaW52YWxpZGF0aW5nIGl0IGJlbG93CisgICAgQVNTRVJUX1RSVUUoYmFkX2RzdC5Jbml0aWFsaXplZCgpKTsKKyAgICBiYWRfZHN0LmxheW91dF8gPSBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmooKTsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZ29vZF9zcmMobV9kZXZpY2UsIG9uZV91bmlmb3JtX2J1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoZ29vZF9zcmMuSW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyBQdXQgdmFsaWQgZGF0YSBpbiB0aGUgZ29vZCBhbmQgYmFkIHNvdXJjZXMsIHNpbXVsdGFuZW91c2x5IGRvaW5nIGEgcG9zaXRpdmUgdGVzdCBvbiB3cml0ZSBhbmQgY29weSBvcGVyYXRpb25zCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB3cml0ZV9kZXNjcmlwdG9yLmRzdFNldCA9IGdvb2Rfc3JjLnNldF87CisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJndyaXRlX2Rlc2NyaXB0b3IsIDAsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBiYWRfc3JjKG1fZGV2aWNlLCBvbmVfdW5pZm9ybV9idWZmZXIpOworICAgIEFTU0VSVF9UUlVFKGJhZF9zcmMuSW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyB0byBjb21wbGV0ZSBvdXIgcG9zaXRpdmUgdGVzdGluZyB1c2UgY29weSwgd2hlcmUgYWJvdmUgd2UgdXNlZCB3cml0ZS4KKyAgICBjb3B5X2Rlc2NyaXB0b3Iuc3JjU2V0ID0gZ29vZF9zcmMuc2V0XzsKKyAgICBjb3B5X2Rlc2NyaXB0b3IuZHN0U2V0ID0gYmFkX3NyYy5zZXRfOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDAsIG51bGxwdHIsIDEsICZjb3B5X2Rlc2NyaXB0b3IpOworICAgIGJhZF9zcmMubGF5b3V0XyA9IFZrRGVzY3JpcHRvclNldExheW91dE9iaigpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgLy8gVHJpZ2dlciB0aGUgdGhyZWUgaW52YWxpZCB1c2UgZXJyb3JzCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBrV3JpdGVEZXN0cm95ZWRMYXlvdXQpOworICAgIHdyaXRlX2Rlc2NyaXB0b3IuZHN0U2V0ID0gYmFkX2RzdC5zZXRfOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZ3cml0ZV9kZXNjcmlwdG9yLCAwLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwga0NvcHlEc3REZXN0cm95ZWRMYXlvdXQpOworICAgIGNvcHlfZGVzY3JpcHRvci5kc3RTZXQgPSBiYWRfZHN0LnNldF87CisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMCwgbnVsbHB0ciwgMSwgJmNvcHlfZGVzY3JpcHRvcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGtDb3B5U3JjRGVzdHJveWVkTGF5b3V0KTsKKyAgICBjb3B5X2Rlc2NyaXB0b3Iuc3JjU2V0ID0gYmFkX3NyYy5zZXRfOworICAgIGNvcHlfZGVzY3JpcHRvci5kc3RTZXQgPSBnb29kX2RzdC5zZXRfOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDAsIG51bGxwdHIsIDEsICZjb3B5X2Rlc2NyaXB0b3IpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEZyYW1lYnVmZmVySW5jb21wYXRpYmxlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkJpbmQgYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIgd2l0aCBhIGZyYW1lYnVmZmVyIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGZyYW1lYnVmZmVyIGZvciB0aGUgYWN0aXZlIHJlbmRlcnBhc3MuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gQSByZW5kZXJwYXNzIHdpdGggb25lIGNvbG9yIGF0dGFjaG1lbnQuCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudCA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH07CisKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgYXR0X3JlZiA9IHswLCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfTsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMCwgbnVsbHB0ciwgMSwgJmF0dF9yZWYsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAxLCAmYXR0YWNobWVudCwgMSwgJnN1YnBhc3MsIDAsIG51bGxwdHJ9OworCisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIG51bGxwdHIsICZycCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEEgY29tcGF0aWJsZSBmcmFtZWJ1ZmZlci4KKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGl2Y2kgPSB7CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk8sCisgICAgICAgIG51bGxwdHIsCisgICAgICAgIDAsCisgICAgICAgIGltYWdlLmhhbmRsZSgpLAorICAgICAgICBWS19JTUFHRV9WSUVXX1RZUEVfMkQsCisgICAgICAgIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwKKyAgICAgICAge1ZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLCBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSwgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksCisgICAgICAgICBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWX0sCisgICAgICAgIHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAxfSwKKyAgICB9OworICAgIFZrSW1hZ2VWaWV3IHZpZXc7CisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZpdmNpLCBudWxscHRyLCAmdmlldyk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIDEsICZ2aWV3LCAzMiwgMzIsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZjaSwgbnVsbHB0ciwgJmZiKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNiYWkgPSB7fTsKKyAgICBjYmFpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICBjYmFpLmNvbW1hbmRQb29sID0gbV9jb21tYW5kUG9vbC0+aGFuZGxlKCk7CisgICAgY2JhaS5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWTsKKyAgICBjYmFpLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgc2VjX2NiOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNiYWksICZzZWNfY2IpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNiYmkgPSB7fTsKKyAgICBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY2JpaSA9IHt9OworICAgIGNiaWkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPOworICAgIGNiaWkucmVuZGVyUGFzcyA9IHJlbmRlclBhc3MoKTsKKyAgICBjYmlpLmZyYW1lYnVmZmVyID0gZmI7CisgICAgY2JiaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgY2JiaS5wTmV4dCA9IE5VTEw7CisgICAgY2JiaS5mbGFncyA9IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQgfCBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQ7CisgICAgY2JiaS5wSW5oZXJpdGFuY2VJbmZvID0gJmNiaWk7CisgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihzZWNfY2IsICZjYmJpKTsKKyAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihzZWNfY2IpOworCisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNiYmkyID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sIG51bGxwdHIsIDAsIG51bGxwdHJ9OworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJmNiYmkyKTsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZtX3JlbmRlclBhc3NCZWdpbkluZm8sIFZLX1NVQlBBU1NfQ09OVEVOVFNfU0VDT05EQVJZX0NPTU1BTkRfQlVGRkVSUyk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRXhlY3V0ZUNvbW1hbmRzLXBDb21tYW5kQnVmZmVycy0wMDA5OSIpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY19jYik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gQ2xlYW51cAorCisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgdms6OkVuZENvbW1hbmRCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisKKyAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXcsIE5VTEwpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlbmRlclBhc3NNaXNzaW5nQXR0YWNobWVudCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkJlZ2luIHJlbmRlciBwYXNzIHdpdGggbWlzc2luZyBmcmFtZWJ1ZmZlciBhdHRhY2htZW50Iik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gQ3JlYXRlIGEgcmVuZGVyUGFzcyB3aXRoIGEgc2luZ2xlIGNvbG9yIGF0dGFjaG1lbnQKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgYXR0YWNoID0ge307CisgICAgYXR0YWNoLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7fTsKKyAgICBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzID0gJmF0dGFjaDsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7fTsKKyAgICBycGNpLnN1YnBhc3NDb3VudCA9IDE7CisgICAgcnBjaS5wU3VicGFzc2VzID0gJnN1YnBhc3M7CisgICAgcnBjaS5hdHRhY2htZW50Q291bnQgPSAxOworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaF9kZXNjID0ge307CisgICAgYXR0YWNoX2Rlc2MuZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGF0dGFjaF9kZXNjLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgYXR0YWNoX2Rlc2MuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBycGNpLnBBdHRhY2htZW50cyA9ICZhdHRhY2hfZGVzYzsKKyAgICBycGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk87CisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIE5VTEwsICZycCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGF1dG8gY3JlYXRlVmlldyA9IGx2bF9pbml0X3N0cnVjdDxWa0ltYWdlVmlld0NyZWF0ZUluZm8+KCk7CisgICAgY3JlYXRlVmlldy5pbWFnZSA9IG1fcmVuZGVyVGFyZ2V0c1swXS0+aGFuZGxlKCk7CisgICAgY3JlYXRlVmlldy52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBjcmVhdGVWaWV3LmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBjcmVhdGVWaWV3LmNvbXBvbmVudHMuciA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX1I7CisgICAgY3JlYXRlVmlldy5jb21wb25lbnRzLmcgPSBWS19DT01QT05FTlRfU1dJWlpMRV9HOworICAgIGNyZWF0ZVZpZXcuY29tcG9uZW50cy5iID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQjsKKyAgICBjcmVhdGVWaWV3LmNvbXBvbmVudHMuYSA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0E7CisgICAgY3JlYXRlVmlldy5zdWJyZXNvdXJjZVJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDEsIDAsIDF9OworICAgIGNyZWF0ZVZpZXcuZmxhZ3MgPSAwOworCisgICAgVmtJbWFnZVZpZXcgaXY7CisgICAgdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+aGFuZGxlKCksICZjcmVhdGVWaWV3LCBudWxscHRyLCAmaXYpOworCisgICAgYXV0byBmYl9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvPigpOworICAgIGZiX2luZm8ucmVuZGVyUGFzcyA9IHJwOworICAgIGZiX2luZm8uYXR0YWNobWVudENvdW50ID0gMTsKKyAgICBmYl9pbmZvLnBBdHRhY2htZW50cyA9ICZpdjsKKyAgICBmYl9pbmZvLndpZHRoID0gMTAwOworICAgIGZiX2luZm8uaGVpZ2h0ID0gMTAwOworICAgIGZiX2luZm8ubGF5ZXJzID0gMTsKKworICAgIC8vIENyZWF0ZSB0aGUgZnJhbWVidWZmZXIgdGhlbiBkZXN0b3J5IHRoZSB2aWV3IGl0IHVzZXMuCisgICAgVmtGcmFtZWJ1ZmZlciBmYjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlKCksICZmYl9pbmZvLCBOVUxMLCAmZmIpOworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KGRldmljZSgpLCBpdiwgTlVMTCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLXBhcmFtZXRlciIpOworCisgICAgYXV0byBycGJpID0gbHZsX2luaXRfc3RydWN0PFZrUmVuZGVyUGFzc0JlZ2luSW5mbz4oKTsKKyAgICBycGJpLnJlbmRlclBhc3MgPSBycDsKKyAgICBycGJpLmZyYW1lYnVmZmVyID0gZmI7CisgICAgcnBiaS5yZW5kZXJBcmVhID0ge3swLCAwfSwgezMyLCAzMn19OworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKyAgICAvLyBEb24ndCBjYWxsIHZrOjpDbWRFbmRSZW5kZXJQYXNzOyBhcyB0aGUgYmVnaW4gaGFzIGJlZW4gInNraXBwZWQiIGJhc2VkIG9uIHRoZSBlcnJvciBjb25kaXRpb24KKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQXR0YWNobWVudERlc2NyaXB0aW9uVW5kZWZpbmVkRm9ybWF0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgcmVuZGVyIHBhc3Mgd2l0aCBhbiBhdHRhY2htZW50IGRlc2NyaXB0aW9uIGZvcm1hdCBzZXQgdG8gVktfRk9STUFUX1VOREVGSU5FRCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsICJmb3JtYXQgaXMgVktfRk9STUFUX1VOREVGSU5FRCIpOworCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGNvbG9yX2F0dGFjaCA9IHt9OworICAgIGNvbG9yX2F0dGFjaC5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBjb2xvcl9hdHRhY2guYXR0YWNobWVudCA9IDA7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHt9OworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSAxOworICAgIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHMgPSAmY29sb3JfYXR0YWNoOworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge307CisgICAgcnBjaS5zdWJwYXNzQ291bnQgPSAxOworICAgIHJwY2kucFN1YnBhc3NlcyA9ICZzdWJwYXNzOworICAgIHJwY2kuYXR0YWNobWVudENvdW50ID0gMTsKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2hfZGVzYyA9IHt9OworICAgIGF0dGFjaF9kZXNjLmZvcm1hdCA9IFZLX0ZPUk1BVF9VTkRFRklORUQ7CisgICAgYXR0YWNoX2Rlc2Muc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIHJwY2kucEF0dGFjaG1lbnRzID0gJmF0dGFjaF9kZXNjOworICAgIHJwY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBWa1JlbmRlclBhc3MgcnA7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgTlVMTCwgJnJwKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBOVUxMKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZENyZWF0ZURlc2NyaXB0b3JQb29sKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byBjcmVhdGUgZGVzY3JpcHRvciBwb29sIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgY29uc3QgdWludDMyX3QgZGVmYXVsdF9kZXNjcmlwdG9yX2NvdW50ID0gMTsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sU2l6ZSBkcF9zaXplX3RlbXBsYXRle1ZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSLCBkZWZhdWx0X2Rlc2NyaXB0b3JfY291bnR9OworCisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gZHBfY2lfdGVtcGxhdGV7VktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyBwTmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAvLyBmbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAvLyBtYXhTZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgIC8vIHBvb2xTaXplQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHBfc2l6ZV90ZW1wbGF0ZX07CisKKyAgICAvLyB0cnkgbWF4U2V0cyA9IDAKKyAgICB7CisgICAgICAgIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIGludmFsaWRfZHBfY2kgPSBkcF9jaV90ZW1wbGF0ZTsKKyAgICAgICAgaW52YWxpZF9kcF9jaS5tYXhTZXRzID0gMDsgIC8vIGludmFsaWQgbWF4U2V0cyB2YWx1ZQorCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8tbWF4U2V0cy0wMDMwMSIpOworICAgICAgICB7CisgICAgICAgICAgICBWa0Rlc2NyaXB0b3JQb29sIHBvb2w7CisgICAgICAgICAgICB2azo6Q3JlYXRlRGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmaW52YWxpZF9kcF9jaSwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICB9CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIHRyeSBkZXNjcmlwdG9yQ291bnQgPSAwCisgICAgeworICAgICAgICBWa0Rlc2NyaXB0b3JQb29sU2l6ZSBpbnZhbGlkX2RwX3NpemUgPSBkcF9zaXplX3RlbXBsYXRlOworICAgICAgICBpbnZhbGlkX2RwX3NpemUuZGVzY3JpcHRvckNvdW50ID0gMDsgIC8vIGludmFsaWQgZGVzY3JpcHRvckNvdW50IHZhbHVlCisKKyAgICAgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gZHBfY2kgPSBkcF9jaV90ZW1wbGF0ZTsKKyAgICAgICAgZHBfY2kucFBvb2xTaXplcyA9ICZpbnZhbGlkX2RwX3NpemU7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS1kZXNjcmlwdG9yQ291bnQtMDAzMDIiKTsKKyAgICAgICAgeworICAgICAgICAgICAgVmtEZXNjcmlwdG9yUG9vbCBwb29sOworICAgICAgICAgICAgdms6OkNyZWF0ZURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRwX2NpLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgIH0KKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIER1cGxpY2F0ZURlc2NyaXB0b3JCaW5kaW5nKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgZGVzY3JpcHRvciBzZXQgbGF5b3V0IHdpdGggYSBkdXBsaWNhdGUgYmluZGluZyBudW1iZXIuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIC8vIENyZWF0ZSBsYXlvdXQgd2hlcmUgdHdvIGJpbmRpbmcgI3MgYXJlICIxIgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBOVU1fQklORElOR1MgPSAzOworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZHNsX2JpbmRpbmdbTlVNX0JJTkRJTkdTXSA9IHt9OworICAgIGRzbF9iaW5kaW5nWzBdLmJpbmRpbmcgPSAxOworICAgIGRzbF9iaW5kaW5nWzBdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRzbF9iaW5kaW5nWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZHNsX2JpbmRpbmdbMF0uc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgZHNsX2JpbmRpbmdbMF0ucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKyAgICBkc2xfYmluZGluZ1sxXS5iaW5kaW5nID0gMDsKKyAgICBkc2xfYmluZGluZ1sxXS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRzbF9iaW5kaW5nWzFdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRzbF9iaW5kaW5nWzFdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZHNsX2JpbmRpbmdbMV0uc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgZHNsX2JpbmRpbmdbMV0ucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKyAgICBkc2xfYmluZGluZ1syXS5iaW5kaW5nID0gMTsgIC8vIER1cGxpY2F0ZSBiaW5kaW5nIHNob3VsZCBjYXVzZSBlcnJvcgorICAgIGRzbF9iaW5kaW5nWzJdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRzbF9iaW5kaW5nWzJdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZHNsX2JpbmRpbmdbMl0uc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgZHNsX2JpbmRpbmdbMl0ucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKworICAgIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gZHNfbGF5b3V0X2NpID0ge307CisgICAgZHNfbGF5b3V0X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIGRzX2xheW91dF9jaS5wTmV4dCA9IE5VTEw7CisgICAgZHNfbGF5b3V0X2NpLmJpbmRpbmdDb3VudCA9IE5VTV9CSU5ESU5HUzsKKyAgICBkc19sYXlvdXRfY2kucEJpbmRpbmdzID0gZHNsX2JpbmRpbmc7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRzX2xheW91dDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tYmluZGluZy0wMDI3OSIpOworICAgIHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzX2xheW91dF9jaSwgTlVMTCwgJmRzX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZFB1c2hEZXNjcmlwdG9yU2V0TGF5b3V0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgcHVzaCBkZXNjcmlwdG9yIHNldCBsYXlvdXQgd2l0aCBpbnZhbGlkIGJpbmRpbmdzLiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgLy8gR2V0IHRoZSBwdXNoIGRlc2NyaXB0b3IgbGltaXRzCisgICAgYXV0byBwdXNoX2Rlc2NyaXB0b3JfcHJvcCA9IEdldFB1c2hEZXNjcmlwdG9yUHJvcGVydGllcyhpbnN0YW5jZSgpLCBncHUoKSk7CisgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9wcm9wLm1heFB1c2hEZXNjcmlwdG9ycyA8IDEpIHsKKyAgICAgICAgLy8gU29tZSBpbXBsZW1lbnRhdGlvbnMgcmVwb3J0IGFuIGludmFsaWQgbWF4UHVzaERlc2NyaXB0b3JzIG9mIDAKKyAgICAgICAgcHJpbnRmKCIlcyBtYXhQdXNoRGVzY3JpcHRvcnMgaXMgemVybywgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgYmluZGluZyA9IHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQywgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgbnVsbHB0cn07CisKKyAgICBhdXRvIGRzX2xheW91dF9jaSA9IGx2bF9pbml0X3N0cnVjdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvPigpOworICAgIGRzX2xheW91dF9jaS5mbGFncyA9IFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFI7CisgICAgZHNfbGF5b3V0X2NpLmJpbmRpbmdDb3VudCA9IDE7CisgICAgZHNfbGF5b3V0X2NpLnBCaW5kaW5ncyA9ICZiaW5kaW5nOworCisgICAgLy8gTm90ZSB0aGF0IGFzIGJpbmRpbmcgaXMgcmVmZXJlbmNlZCBpbiBkc19sYXlvdXRfY2ksIGl0IGlzIGVmZmVjdGl2ZWx5IGluIHRoZSBjbG9zdXJlIGJ5IHJlZmVyZW5jZSBhcyB3ZWxsLgorICAgIGF1dG8gdGVzdF9jcmVhdGVfZHNfbGF5b3V0ID0gWyZkc19sYXlvdXRfY2ksIHRoaXNdKHN0ZDo6c3RyaW5nIGVycm9yKSB7CisgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dCBkc19sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBlcnJvcik7CisgICAgICAgIHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgJmRzX2xheW91dF9jaSwgbnVsbHB0ciwgJmRzX2xheW91dCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCBkc19sYXlvdXQsIG51bGxwdHIpOworICAgIH07CisKKyAgICAvLyBTdGFydGluZyB3aXRoIHRoZSBpbml0aWFsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDIHR5cGUgc2V0IGFib3ZlLi4KKyAgICB0ZXN0X2NyZWF0ZV9kc19sYXlvdXQoIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy0wMDI4MCIpOworCisgICAgYmluZGluZy5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOworICAgIHRlc3RfY3JlYXRlX2RzX2xheW91dCgKKyAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy0wMDI4MCIpOyAgLy8gVGhpcyBpcyB0aGUgc2FtZSBWVUlEIGFzIGFib3ZlLCBqdXN0IGEgc2Vjb25kIGVycm9yIGNvbmRpdGlvbi4KKworICAgIGlmICghKHB1c2hfZGVzY3JpcHRvcl9wcm9wLm1heFB1c2hEZXNjcmlwdG9ycyA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7CisgICAgICAgIGJpbmRpbmcuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI7CisgICAgICAgIGJpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gcHVzaF9kZXNjcmlwdG9yX3Byb3AubWF4UHVzaERlc2NyaXB0b3JzICsgMTsKKyAgICAgICAgdGVzdF9jcmVhdGVfZHNfbGF5b3V0KCJWVUlELVZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8tZmxhZ3MtMDAyODEiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIG1heFB1c2hEZXNjcmlwdG9ycyBpcyBzZXQgdG8gbWF4aW11bSB1bml0MzJfdCB2YWx1ZSwgc2tpcHBpbmcgJ291dCBvZiByYW5nZSB0ZXN0Jy5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUHVzaERlc2NyaXB0b3JTZXRMYXlvdXRXaXRob3V0RXh0ZW5zaW9uKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgcHVzaCBkZXNjcmlwdG9yIHNldCBsYXlvdXQgd2l0aG91dCBsb2FkaW5nIHRoZSBuZWVkZWQgZXh0ZW5zaW9uLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGJpbmRpbmcgPSB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBudWxscHRyfTsKKworICAgIGF1dG8gZHNfbGF5b3V0X2NpID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8+KCk7CisgICAgZHNfbGF5b3V0X2NpLmZsYWdzID0gVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUjsKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gMTsKKyAgICBkc19sYXlvdXRfY2kucEJpbmRpbmdzID0gJmJpbmRpbmc7CisKKyAgICBzdGQ6OnN0cmluZyBlcnJvciA9ICJBdHRlbXB0ZWQgdG8gdXNlIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIgaW4gIjsKKyAgICBlcnJvciA9IGVycm9yICsgIlZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm86OmZsYWdzIGJ1dCBpdHMgcmVxdWlyZWQgZXh0ZW5zaW9uICI7CisgICAgZXJyb3IgPSBlcnJvciArIFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUU7CisgICAgZXJyb3IgPSBlcnJvciArICIgaGFzIG5vdCBiZWVuIGVuYWJsZWQuIjsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgZXJyb3IuY19zdHIoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvLWZsYWdzLTAwMjgxIik7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRzX2xheW91dCA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgJmRzX2xheW91dF9jaSwgbnVsbHB0ciwgJmRzX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgZHNfbGF5b3V0LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBEZXNjcmlwdG9ySW5kZXhpbmdTZXRMYXlvdXRXaXRob3V0RXh0ZW5zaW9uKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGFuIHVwZGF0ZV9hZnRlcl9iaW5kIHNldCBsYXlvdXQgd2l0aG91dCBsb2FkaW5nIHRoZSBuZWVkZWQgZXh0ZW5zaW9uLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBhdXRvIGRzX2xheW91dF9jaSA9IGx2bF9pbml0X3N0cnVjdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvPigpOworICAgIGRzX2xheW91dF9jaS5mbGFncyA9IFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUOworCisgICAgc3RkOjpzdHJpbmcgZXJyb3IgPSAiQXR0ZW1wZWQgdG8gdXNlIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUIGluICI7CisgICAgZXJyb3IgPSBlcnJvciArICJWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvOjpmbGFncyBidXQgaXRzIHJlcXVpcmVkIGV4dGVuc2lvbiAiOworICAgIGVycm9yID0gZXJyb3IgKyBWS19FWFRfREVTQ1JJUFRPUl9JTkRFWElOR19FWFRFTlNJT05fTkFNRTsKKyAgICBlcnJvciA9IGVycm9yICsgIiBoYXMgbm90IGJlZW4gZW5hYmxlZC4iOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBlcnJvci5jX3N0cigpKTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZHNfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCAmZHNfbGF5b3V0X2NpLCBudWxscHRyLCAmZHNfbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCBkc19sYXlvdXQsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIERlc2NyaXB0b3JJbmRleGluZ1NldExheW91dCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkV4ZXJjaXNlIHZhcmlvdXMgY3JlYXRlL2FsbG9jYXRlLXRpbWUgZXJyb3JzIHJlbGF0ZWQgdG8gVktfRVhUX2Rlc2NyaXB0b3JfaW5kZXhpbmcuIik7CisKKyAgICBpZiAoIShDaGVja0Rlc2NyaXB0b3JJbmRleGluZ1N1cHBvcnRBbmRJbml0RnJhbWV3b3JrKHRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvcikpKSB7CisgICAgICAgIHByaW50ZigiJXMgRGVzY3JpcHRvciBpbmRleGluZyBvciBvbmUgb2YgaXRzIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuLiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgLy8gQ3JlYXRlIGEgZGV2aWNlIHRoYXQgZW5hYmxlcyBhbGwgc3VwcG9ydGVkIGluZGV4aW5nIGZlYXR1cmVzIGV4Y2VwdCBkZXNjcmlwdG9yQmluZGluZ1VuaWZvcm1CdWZmZXJVcGRhdGVBZnRlckJpbmQKKyAgICBhdXRvIGluZGV4aW5nX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVD4oKTsKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmaW5kZXhpbmdfZmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoZ3B1KCksICZmZWF0dXJlczIpOworCisgICAgaW5kZXhpbmdfZmVhdHVyZXMuZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gVktfRkFMU0U7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMikpOworCisgICAgc3RkOjphcnJheTxWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQsIDI+IGZsYWdzID0ge1ZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERVNDUklQVE9SX0JJTkRJTkdfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVH07CisgICAgYXV0byBmbGFnc19jcmVhdGVfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUPigpOworICAgIGZsYWdzX2NyZWF0ZV9pbmZvLmJpbmRpbmdDb3VudCA9ICh1aW50MzJfdClmbGFncy5zaXplKCk7CisgICAgZmxhZ3NfY3JlYXRlX2luZm8ucEJpbmRpbmdGbGFncyA9IGZsYWdzLmRhdGEoKTsKKworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgYmluZGluZyA9IHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIG51bGxwdHJ9OworICAgIGF1dG8gZHNfbGF5b3V0X2NpID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8+KCZmbGFnc19jcmVhdGVfaW5mbyk7CisgICAgZHNfbGF5b3V0X2NpLmJpbmRpbmdDb3VudCA9IDE7CisgICAgZHNfbGF5b3V0X2NpLnBCaW5kaW5ncyA9ICZiaW5kaW5nOworICAgIFZrRGVzY3JpcHRvclNldExheW91dCBkc19sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIC8vIFZVIGZvciBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhUOjpiaW5kaW5nQ291bnQKKyAgICBmbGFnc19jcmVhdGVfaW5mby5iaW5kaW5nQ291bnQgPSAyOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVC1iaW5kaW5nQ291bnQtMDMwMDIiKTsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+aGFuZGxlKCksICZkc19sYXlvdXRfY2ksIG51bGxwdHIsICZkc19sYXlvdXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+aGFuZGxlKCksIGRzX2xheW91dCwgbnVsbHB0cik7CisKKyAgICBmbGFnc19jcmVhdGVfaW5mby5iaW5kaW5nQ291bnQgPSAxOworCisgICAgLy8gc2V0IGlzIG1pc3NpbmcgVVBEQVRFX0FGVEVSX0JJTkRfUE9PTCBmbGFnLgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mby1mbGFncy0wMzAwMCIpOworICAgIC8vIGJpbmRpbmcgdXNlcyBhIGZlYXR1cmUgd2UgZGlzYWJsZWQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nRmxhZ3NDcmVhdGVJbmZvRVhULWRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZC0wMzAwNSIpOworICAgIGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgJmRzX2xheW91dF9jaSwgbnVsbHB0ciwgJmRzX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgZHNfbGF5b3V0LCBudWxscHRyKTsKKworICAgIGRzX2xheW91dF9jaS5mbGFncyA9IFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfUE9PTF9CSVRfRVhUOworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSAwOworICAgIGZsYWdzX2NyZWF0ZV9pbmZvLmJpbmRpbmdDb3VudCA9IDA7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCAmZHNfbGF5b3V0X2NpLCBudWxscHRyLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtEZXNjcmlwdG9yUG9vbFNpemUgcG9vbF9zaXplID0ge2JpbmRpbmcuZGVzY3JpcHRvclR5cGUsIGJpbmRpbmcuZGVzY3JpcHRvckNvdW50fTsKKyAgICBhdXRvIGRzcGNpID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvPigpOworICAgIGRzcGNpLnBvb2xTaXplQ291bnQgPSAxOworICAgIGRzcGNpLnBQb29sU2l6ZXMgPSAmcG9vbF9zaXplOworICAgIGRzcGNpLm1heFNldHMgPSAxOworICAgIFZrRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCAmZHNwY2ksIG51bGxwdHIsICZwb29sKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgYXV0byBkc19hbGxvY19pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbz4oKTsKKyAgICBkc19hbGxvY19pbmZvLmRlc2NyaXB0b3JQb29sID0gcG9vbDsKKyAgICBkc19hbGxvY19pbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA9IDE7CisgICAgZHNfYWxsb2NfaW5mby5wU2V0TGF5b3V0cyA9ICZkc19sYXlvdXQ7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXQgZHMgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAvLyBtaXNtYXRjaCBiZXR3ZWVuIGRlc2NyaXB0b3Igc2V0IGFuZCBwb29sCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8tcFNldExheW91dHMtMDMwNDQiKTsKKyAgICB2azo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+aGFuZGxlKCksICZkc19hbGxvY19pbmZvLCAmZHMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgZHNfbGF5b3V0LCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5oYW5kbGUoKSwgcG9vbCwgbnVsbHB0cik7CisKKyAgICBpZiAoaW5kZXhpbmdfZmVhdHVyZXMuZGVzY3JpcHRvckJpbmRpbmdWYXJpYWJsZURlc2NyaXB0b3JDb3VudCkgeworICAgICAgICBkc19sYXlvdXRfY2kuZmxhZ3MgPSAwOworICAgICAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gMTsKKyAgICAgICAgZmxhZ3NfY3JlYXRlX2luZm8uYmluZGluZ0NvdW50ID0gMTsKKyAgICAgICAgZmxhZ3NbMF0gPSBWS19ERVNDUklQVE9SX0JJTkRJTkdfVkFSSUFCTEVfREVTQ1JJUFRPUl9DT1VOVF9CSVRfRVhUOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+aGFuZGxlKCksICZkc19sYXlvdXRfY2ksIG51bGxwdHIsICZkc19sYXlvdXQpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgICAgIHBvb2xfc2l6ZSA9IHtiaW5kaW5nLmRlc2NyaXB0b3JUeXBlLCBiaW5kaW5nLmRlc2NyaXB0b3JDb3VudH07CisgICAgICAgIGRzcGNpID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvPigpOworICAgICAgICBkc3BjaS5wb29sU2l6ZUNvdW50ID0gMTsKKyAgICAgICAgZHNwY2kucFBvb2xTaXplcyA9ICZwb29sX3NpemU7CisgICAgICAgIGRzcGNpLm1heFNldHMgPSAxOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCAmZHNwY2ksIG51bGxwdHIsICZwb29sKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICBhdXRvIGNvdW50X2FsbG9jX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtEZXNjcmlwdG9yU2V0VmFyaWFibGVEZXNjcmlwdG9yQ291bnRBbGxvY2F0ZUluZm9FWFQ+KCk7CisgICAgICAgIGNvdW50X2FsbG9jX2luZm8uZGVzY3JpcHRvclNldENvdW50ID0gMTsKKyAgICAgICAgLy8gU2V0IHZhcmlhYmxlIGNvdW50IGxhcmdlciB0aGFuIHdoYXQgd2FzIGluIHRoZSBkZXNjcmlwdG9yIGJpbmRpbmcKKyAgICAgICAgdWludDMyX3QgdmFyaWFibGVfY291bnQgPSAyOworICAgICAgICBjb3VudF9hbGxvY19pbmZvLnBEZXNjcmlwdG9yQ291bnRzID0gJnZhcmlhYmxlX2NvdW50OworCisgICAgICAgIGRzX2FsbG9jX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvPigmY291bnRfYWxsb2NfaW5mbyk7CisgICAgICAgIGRzX2FsbG9jX2luZm8uZGVzY3JpcHRvclBvb2wgPSBwb29sOworICAgICAgICBkc19hbGxvY19pbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA9IDE7CisgICAgICAgIGRzX2FsbG9jX2luZm8ucFNldExheW91dHMgPSAmZHNfbGF5b3V0OworCisgICAgICAgIGRzID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrRGVzY3JpcHRvclNldFZhcmlhYmxlRGVzY3JpcHRvckNvdW50QWxsb2NhdGVJbmZvRVhULXBTZXRMYXlvdXRzLTAzMDQ2Iik7CisgICAgICAgIHZrOjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmRzX2FsbG9jX2luZm8sICZkcyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+aGFuZGxlKCksIGRzX2xheW91dCwgbnVsbHB0cik7CisgICAgICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCBwb29sLCBudWxscHRyKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRGVzY3JpcHRvckluZGV4aW5nVXBkYXRlQWZ0ZXJCaW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiRXhlcmNpc2UgZXJyb3JzIGZvciB1cGRhdGluZyBhIGRlc2NyaXB0b3Igc2V0IGFmdGVyIGl0IGlzIGJvdW5kLiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9ERVNDUklQVE9SX0lOREVYSU5HX0VYVEVOU0lPTl9OQU1FKSAmJgorICAgICAgICBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX0RFU0NSSVBUT1JfSU5ERVhJTkdfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGVzY3JpcHRvciBJbmRleGluZyBvciBNYWludGVuYW5jZTMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGRldmljZSB0aGF0IGVuYWJsZXMgYWxsIHN1cHBvcnRlZCBpbmRleGluZyBmZWF0dXJlcyBleGNlcHQgZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kCisgICAgYXV0byBpbmRleGluZ19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmluZGV4aW5nX2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgIGluZGV4aW5nX2ZlYXR1cmVzLmRlc2NyaXB0b3JCaW5kaW5nVW5pZm9ybUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCA9IFZLX0ZBTFNFOworCisgICAgaWYgKFZLX0ZBTFNFID09IGluZGV4aW5nX2ZlYXR1cmVzLmRlc2NyaXB0b3JCaW5kaW5nU3RvcmFnZUJ1ZmZlclVwZGF0ZUFmdGVyQmluZCkgeworICAgICAgICBwcmludGYoIiVzIFRlc3QgcmVxdWlyZXMgKHVuc3VwcG9ydGVkKSBkZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQsIHNraXBwaW5nXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKFZLX0ZBTFNFID09IGZlYXR1cmVzMi5mZWF0dXJlcy5mcmFnbWVudFN0b3Jlc0FuZEF0b21pY3MpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IHJlcXVpcmVzICh1bnN1cHBvcnRlZCkgZnJhZ21lbnRTdG9yZXNBbmRBdG9taWNzLCBza2lwcGluZ1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZmZWF0dXJlczIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQgZmxhZ3NbM10gPSB7MCwgVktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUfTsKKyAgICBhdXRvIGZsYWdzX2NyZWF0ZV9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQ+KCk7CisgICAgZmxhZ3NfY3JlYXRlX2luZm8uYmluZGluZ0NvdW50ID0gMzsKKyAgICBmbGFnc19jcmVhdGVfaW5mby5wQmluZGluZ0ZsYWdzID0gJmZsYWdzWzBdOworCisgICAgLy8gRGVzY3JpcHRvciBzZXQgaGFzIHR3byBiaW5kaW5ncyAtIG9ubHkgdGhlIHNlY29uZCBpcyB1cGRhdGVfYWZ0ZXJfYmluZAorICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgYmluZGluZ1szXSA9IHsKKyAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgbnVsbHB0cn0sCisgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIG51bGxwdHJ9LAorICAgICAgICB7MiwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBudWxscHRyfSwKKyAgICB9OworICAgIGF1dG8gZHNfbGF5b3V0X2NpID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8+KCZmbGFnc19jcmVhdGVfaW5mbyk7CisgICAgZHNfbGF5b3V0X2NpLmZsYWdzID0gVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQ7CisgICAgZHNfbGF5b3V0X2NpLmJpbmRpbmdDb3VudCA9IDM7CisgICAgZHNfbGF5b3V0X2NpLnBCaW5kaW5ncyA9ICZiaW5kaW5nWzBdOworICAgIFZrRGVzY3JpcHRvclNldExheW91dCBkc19sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgJmRzX2xheW91dF9jaSwgbnVsbHB0ciwgJmRzX2xheW91dCk7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sU2l6ZSBwb29sX3NpemVzWzNdID0geworICAgICAgICB7YmluZGluZ1swXS5kZXNjcmlwdG9yVHlwZSwgYmluZGluZ1swXS5kZXNjcmlwdG9yQ291bnR9LAorICAgICAgICB7YmluZGluZ1sxXS5kZXNjcmlwdG9yVHlwZSwgYmluZGluZ1sxXS5kZXNjcmlwdG9yQ291bnR9LAorICAgICAgICB7YmluZGluZ1syXS5kZXNjcmlwdG9yVHlwZSwgYmluZGluZ1syXS5kZXNjcmlwdG9yQ291bnR9LAorICAgIH07CisgICAgYXV0byBkc3BjaSA9IGx2bF9pbml0X3N0cnVjdDxWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbz4oKTsKKyAgICBkc3BjaS5mbGFncyA9IFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfVVBEQVRFX0FGVEVSX0JJTkRfQklUX0VYVDsKKyAgICBkc3BjaS5wb29sU2l6ZUNvdW50ID0gMzsKKyAgICBkc3BjaS5wUG9vbFNpemVzID0gJnBvb2xfc2l6ZXNbMF07CisgICAgZHNwY2kubWF4U2V0cyA9IDE7CisgICAgVmtEZXNjcmlwdG9yUG9vbCBwb29sOworICAgIGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yUG9vbChtX2RldmljZS0+aGFuZGxlKCksICZkc3BjaSwgbnVsbHB0ciwgJnBvb2wpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBhdXRvIGRzX2FsbG9jX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvPigpOworICAgIGRzX2FsbG9jX2luZm8uZGVzY3JpcHRvclBvb2wgPSBwb29sOworICAgIGRzX2FsbG9jX2luZm8uZGVzY3JpcHRvclNldENvdW50ID0gMTsKKyAgICBkc19hbGxvY19pbmZvLnBTZXRMYXlvdXRzID0gJmRzX2xheW91dDsKKworICAgIFZrRGVzY3JpcHRvclNldCBkcyA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmRzX2FsbG9jX2luZm8sICZkcyk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmQ0kgPSB7fTsKKyAgICBidWZmQ0kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgYnVmZkNJLnNpemUgPSAxMDI0OworICAgIGJ1ZmZDSS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQgfCBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklUOworCisgICAgVmtCdWZmZXIgZHluYW1pY191bmlmb3JtX2J1ZmZlcjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlQnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJ1ZmZDSSwgTlVMTCwgJmR5bmFtaWNfdW5pZm9ybV9idWZmZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0RldmljZU1lbW9yeSBtZW07CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisgICAgdms6OkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIGR5bmFtaWNfdW5pZm9ybV9idWZmZXIsICZtZW1fcmVxcyk7CisKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1fYWxsb2NfaW5mbyA9IHt9OworICAgIG1lbV9hbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtX2FsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgPSBtZW1fcmVxcy5zaXplOworICAgIG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUobWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsICZtZW1fYWxsb2NfaW5mbywgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQpOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksICZtZW1fYWxsb2NfaW5mbywgTlVMTCwgJm1lbSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGVyciA9IHZrOjpCaW5kQnVmZmVyTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgZHluYW1pY191bmlmb3JtX2J1ZmZlciwgbWVtLCAwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmSW5mb1syXSA9IHt9OworICAgIGJ1ZmZJbmZvWzBdLmJ1ZmZlciA9IGR5bmFtaWNfdW5pZm9ybV9idWZmZXI7CisgICAgYnVmZkluZm9bMF0ub2Zmc2V0ID0gMDsKKyAgICBidWZmSW5mb1swXS5yYW5nZSA9IDEwMjQ7CisKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlWzJdID0ge307CisgICAgZGVzY3JpcHRvcl93cml0ZVswXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGVbMF0uZHN0U2V0ID0gZHM7CisgICAgZGVzY3JpcHRvcl93cml0ZVswXS5kc3RCaW5kaW5nID0gMDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZVswXS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlWzBdLnBCdWZmZXJJbmZvID0gYnVmZkluZm87CisgICAgZGVzY3JpcHRvcl93cml0ZVsxXSA9IGRlc2NyaXB0b3Jfd3JpdGVbMF07CisgICAgZGVzY3JpcHRvcl93cml0ZVsxXS5kc3RCaW5kaW5nID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlWzFdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOworCisgICAgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZV9sYXlvdXQ7CisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGlwZWxpbmVfbGF5b3V0X2NpID0ge307CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5zZXRMYXlvdXRDb3VudCA9IDE7CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnBTZXRMYXlvdXRzID0gJmRzX2xheW91dDsKKworICAgIHZrOjpDcmVhdGVQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZwaXBlbGluZV9sYXlvdXRfY2ksIE5VTEwsICZwaXBlbGluZV9sYXlvdXQpOworCisgICAgLy8gQ3JlYXRlIGEgZHVtbXkgcGlwZWxpbmUsIHNpbmNlIFZMIGluc3BlY3RzIHdoaWNoIGJpbmRpbmdzIGFyZSBhY3R1YWxseSB1c2VkIGF0IGRyYXcgdGltZQorICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7XG4iCisgICAgICAgICJsYXlvdXQoc2V0PTAsIGJpbmRpbmc9MCkgdW5pZm9ybSBmb28wIHsgZmxvYXQgeDA7IH0gYmFyMDtcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0xKSBidWZmZXIgIGZvbzEgeyBmbG9hdCB4MTsgfSBiYXIxO1xuIgorICAgICAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTIpIGJ1ZmZlciAgZm9vMiB7IGZsb2F0IHgyOyB9IGJhcjI7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGNvbG9yID0gdmVjNChiYXIwLngwICsgYmFyMS54MSArIGJhcjIueDIpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgIHBpcGUuU2V0Vmlld3BvcnQobV92aWV3cG9ydHMpOworICAgIHBpcGUuU2V0U2Npc3NvcihtX3NjaXNzb3JzKTsKKyAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBpcGVsaW5lX2xheW91dCwgbV9yZW5kZXJQYXNzKTsKKworICAgIC8vIE1ha2UgYm90aCBiaW5kaW5ncyB2YWxpZCBiZWZvcmUgYmluZGluZyB0byB0aGUgY29tbWFuZCBidWZmZXIKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAyLCAmZGVzY3JpcHRvcl93cml0ZVswXSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisKKyAgICAvLyBUd28gc3VidGVzdHMuIEZpcnN0IG9ubHkgdXBkYXRlcyB0aGUgdXBkYXRlX2FmdGVyX2JpbmQgYmluZGluZyBhbmQgZXhwZWN0cworICAgIC8vIG5vIGVycm9yLiBTZWNvbmQgdXBkYXRlcyB0aGUgb3RoZXIgYmluZGluZyBhbmQgZXhwZWN0cyBhbiBlcnJvciB3aGVuIHRoZQorICAgIC8vIGNvbW1hbmQgYnVmZmVyIGlzIGVuZGVkLgorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfbGF5b3V0LCAwLCAxLCAmZHMsIDAsIE5VTEwpOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisgICAgICAgIHZrOjpDbWREcmF3KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDAsIDAsIDApOworICAgICAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICAgICAgLy8gVmFsaWQgdG8gdXBkYXRlIGJpbmRpbmcgMSBhZnRlciBiZWluZyBib3VuZAorICAgICAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZVsxXSwgMCwgTlVMTCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdCBubyBlcnJvcnMKKyAgICAgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtRGVzY3JpcHRvclNldE5vdFVwZGF0ZWQiKTsKKyAgICAgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEludmFsaWQgdG8gdXBkYXRlIGJpbmRpbmcgMCBhZnRlciBiZWluZyBib3VuZC4gQnV0IHRoZSBlcnJvciBpcyBhY3R1YWxseQorICAgICAgICAgICAgLy8gZ2VuZXJhdGVkIGR1cmluZyB2azo6RW5kQ29tbWFuZEJ1ZmZlcgorICAgICAgICAgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGVbMF0sIDAsIE5VTEwpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtEZXNjcmlwdG9yU2V0Iik7CisKKyAgICAgICAgICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCBkc19sYXlvdXQsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCBwb29sLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUJ1ZmZlcihtX2RldmljZS0+aGFuZGxlKCksIGR5bmFtaWNfdW5pZm9ybV9idWZmZXIsIE5VTEwpOworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5oYW5kbGUoKSwgbWVtLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgcGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBBbGxvY2F0ZVB1c2hEZXNjcmlwdG9yU2V0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBhIHB1c2ggZGVzY3JpcHRvciBzZXQuIik7CisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBhdXRvIHB1c2hfZGVzY3JpcHRvcl9wcm9wID0gR2V0UHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzKGluc3RhbmNlKCksIGdwdSgpKTsKKyAgICBpZiAocHVzaF9kZXNjcmlwdG9yX3Byb3AubWF4UHVzaERlc2NyaXB0b3JzIDwgMSkgeworICAgICAgICAvLyBTb21lIGltcGxlbWVudGF0aW9ucyByZXBvcnQgYW4gaW52YWxpZCBtYXhQdXNoRGVzY3JpcHRvcnMgb2YgMAorICAgICAgICBwcmludGYoIiVzIG1heFB1c2hEZXNjcmlwdG9ycyBpcyB6ZXJvLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBiaW5kaW5nID0gezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgbnVsbHB0cn07CisgICAgYXV0byBkc19sYXlvdXRfY2kgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbz4oKTsKKyAgICBkc19sYXlvdXRfY2kuZmxhZ3MgPSBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSOworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSAxOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSAmYmluZGluZzsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZHNfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCAmZHNfbGF5b3V0X2NpLCBudWxscHRyLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtEZXNjcmlwdG9yUG9vbFNpemUgcG9vbF9zaXplID0ge2JpbmRpbmcuZGVzY3JpcHRvclR5cGUsIGJpbmRpbmcuZGVzY3JpcHRvckNvdW50fTsKKyAgICBhdXRvIGRzcGNpID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvPigpOworICAgIGRzcGNpLnBvb2xTaXplQ291bnQgPSAxOworICAgIGRzcGNpLnBQb29sU2l6ZXMgPSAmcG9vbF9zaXplOworICAgIGRzcGNpLm1heFNldHMgPSAxOworICAgIFZrRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCAmZHNwY2ksIG51bGxwdHIsICZwb29sKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgYXV0byBkc19hbGxvY19pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbz4oKTsKKyAgICBkc19hbGxvY19pbmZvLmRlc2NyaXB0b3JQb29sID0gcG9vbDsKKyAgICBkc19hbGxvY19pbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA9IDE7CisgICAgZHNfYWxsb2NfaW5mby5wU2V0TGF5b3V0cyA9ICZkc19sYXlvdXQ7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXQgZHMgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mby1wU2V0TGF5b3V0cy0wMDMwOCIpOworICAgIHZrOjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmRzX2FsbG9jX2luZm8sICZkcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5oYW5kbGUoKSwgcG9vbCwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgZHNfbGF5b3V0LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWZXJpZnkgZXJyb3IgbWVzc2FnZXMgZm9yIGludmFsaWQgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGUgY2FsbHMuIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUU7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgLy8gTm90ZTogSW5jbHVkZXMgd29ya2Fyb3VuZCBmb3Igc29tZSBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggaW5jb3JyZWN0bHkgcmV0dXJuIDAgbWF4UHVzaERlc2NyaXB0b3JzCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSkgJiYKKyAgICAgICAgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfREVTQ1JJUFRPUl9VUERBVEVfVEVNUExBVEVfRVhURU5TSU9OX05BTUUpICYmCisgICAgICAgIChHZXRQdXNoRGVzY3JpcHRvclByb3BlcnRpZXMoaW5zdGFuY2UoKSwgZ3B1KCkpLm1heFB1c2hEZXNjcmlwdG9ycyA+IDApKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFB1c2ggRGVzY3JpcHRvcnMgYW5kIERlc2NyaXB0b3IgVXBkYXRlIFRlbXBsYXRlIEV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGRzbF9iaW5kaW5nID0ge307CisgICAgZHNsX2JpbmRpbmcuYmluZGluZyA9IDA7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkc2xfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0FMTDsKKyAgICBkc2xfYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzX2xheW91dF91YihtX2RldmljZSwge2RzbF9iaW5kaW5nfSk7CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzX2xheW91dF91YjEobV9kZXZpY2UsIHtkc2xfYmluZGluZ30pOworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dE9iaiBkc19sYXlvdXRfdWJfcHVzaChtX2RldmljZSwge2RzbF9iaW5kaW5nfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUik7CisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQobV9kZXZpY2UsIHt7JmRzX2xheW91dF91YiwgJmRzX2xheW91dF91YjEsICZkc19sYXlvdXRfdWJfcHVzaH19KTsKKyAgICBQRk5fdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgdmtDcmVhdGVEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPQorICAgICAgICAoUEZOX3ZrQ3JlYXRlRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiIpOworICAgIEFTU0VSVF9ORSh2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiwgbnVsbHB0cik7CisgICAgUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiB2a0Rlc3Ryb3lEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVLSFIgPQorICAgICAgICAoUEZOX3ZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtEZXN0cm95RGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlS0hSIik7CisgICAgQVNTRVJUX05FKHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiwgbnVsbHB0cik7CisKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUVudHJ5IGVudHJpZXMgPSB7MCwgMCwgMSwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAwLCBzaXplb2YoVmtCdWZmZXIpfTsKKyAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUNyZWF0ZUluZm8gY3JlYXRlX2luZm8gPSB7fTsKKyAgICBjcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfVVBEQVRFX1RFTVBMQVRFX0NSRUFURV9JTkZPOworICAgIGNyZWF0ZV9pbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBjcmVhdGVfaW5mby5mbGFncyA9IDA7CisgICAgY3JlYXRlX2luZm8uZGVzY3JpcHRvclVwZGF0ZUVudHJ5Q291bnQgPSAxOworICAgIGNyZWF0ZV9pbmZvLnBEZXNjcmlwdG9yVXBkYXRlRW50cmllcyA9ICZlbnRyaWVzOworCisgICAgYXV0byBkb190ZXN0ID0gWyZdKHN0ZDo6c3RyaW5nIGVycikgeworICAgICAgICBWa0Rlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUiBkdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBlcnIpOworICAgICAgICBpZiAoVktfU1VDQ0VTUyA9PSB2a0NyZWF0ZURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihtX2RldmljZS0+aGFuZGxlKCksICZjcmVhdGVfaW5mbywgbnVsbHB0ciwgJmR1dCkpIHsKKyAgICAgICAgICAgIHZrRGVzdHJveURlc2NyaXB0b3JVcGRhdGVUZW1wbGF0ZUtIUihtX2RldmljZS0+aGFuZGxlKCksIGR1dCwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfTsKKworICAgIC8vIERlc2NyaXB0b3Igc2V0IHR5cGUgdGVtcGxhdGUKKyAgICBjcmVhdGVfaW5mby50ZW1wbGF0ZVR5cGUgPSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX0RFU0NSSVBUT1JfU0VUOworICAgIC8vIGRlc2NyaXB0b3JTZXRMYXlvdXQgaXMgTlVMTAorICAgIGRvX3Rlc3QoIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MCIpOworCisgICAgLy8gUHVzaCBkZXNjcmlwdG9yIHR5cGUgdGVtcGxhdGUKKyAgICBjcmVhdGVfaW5mby50ZW1wbGF0ZVR5cGUgPSBWS19ERVNDUklQVE9SX1VQREFURV9URU1QTEFURV9UWVBFX1BVU0hfREVTQ1JJUFRPUlNfS0hSOworICAgIGNyZWF0ZV9pbmZvLnBpcGVsaW5lQmluZFBvaW50ID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFOworICAgIGNyZWF0ZV9pbmZvLnBpcGVsaW5lTGF5b3V0ID0gcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpOworICAgIGNyZWF0ZV9pbmZvLnNldCA9IDI7CisKKyAgICAvLyBCYWQgYmluZHBvaW50IC0tIGZvcmNlIGZ1enogdGhlIGJpbmQgcG9pbnQKKyAgICBtZW1zZXQoJmNyZWF0ZV9pbmZvLnBpcGVsaW5lQmluZFBvaW50LCAweEZFLCBzaXplb2YoY3JlYXRlX2luZm8ucGlwZWxpbmVCaW5kUG9pbnQpKTsKKyAgICBkb190ZXN0KCJWVUlELVZrRGVzY3JpcHRvclVwZGF0ZVRlbXBsYXRlQ3JlYXRlSW5mby10ZW1wbGF0ZVR5cGUtMDAzNTEiKTsKKyAgICBjcmVhdGVfaW5mby5waXBlbGluZUJpbmRQb2ludCA9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURTsKKworICAgIC8vIEJhZCBwaXBlbGluZSBsYXlvdXQKKyAgICBjcmVhdGVfaW5mby5waXBlbGluZUxheW91dCA9IFZLX05VTExfSEFORExFOworICAgIGRvX3Rlc3QoIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MiIpOworICAgIGNyZWF0ZV9pbmZvLnBpcGVsaW5lTGF5b3V0ID0gcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpOworCisgICAgLy8gV3Jvbmcgc2V0ICMKKyAgICBjcmVhdGVfaW5mby5zZXQgPSAwOworICAgIGRvX3Rlc3QoIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MyIpOworCisgICAgLy8gSW52YWxpZCBzZXQgIworICAgIGNyZWF0ZV9pbmZvLnNldCA9IDQyOworICAgIGRvX3Rlc3QoIlZVSUQtVmtEZXNjcmlwdG9yVXBkYXRlVGVtcGxhdGVDcmVhdGVJbmZvLXRlbXBsYXRlVHlwZS0wMDM1MyIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIElubGluZVVuaWZvcm1CbG9ja0VYVCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgVktfRVhUX2lubGluZV91bmlmb3JtX2Jsb2NrLiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgaW5zdGFuY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIHN0ZDo6YXJyYXk8Y29uc3QgY2hhciAqLCAyPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHtWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19FWFRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhURU5TSU9OX05BTUV9OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2aWNlX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIGRldmljZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRW5hYmxlIGRlc2NyaXB0b3IgaW5kZXhpbmcgaWYgc3VwcG9ydGVkLCBidXQgZG9uJ3QgcmVxdWlyZSBpdC4KKyAgICBib29sIHN1cHBvcnRzRGVzY3JpcHRvckluZGV4aW5nID0gdHJ1ZTsKKyAgICByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHtWS19LSFJfTUFJTlRFTkFOQ0UzX0VYVEVOU0lPTl9OQU1FLCBWS19FWFRfREVTQ1JJUFRPUl9JTkRFWElOR19FWFRFTlNJT05fTkFNRX07CisgICAgZm9yIChhdXRvIGRldmljZV9leHRlbnNpb24gOiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucykgeworICAgICAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBkZXZpY2VfZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgICAgICBzdXBwb3J0c0Rlc2NyaXB0b3JJbmRleGluZyA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisKKyAgICBhdXRvIGRlc2NyaXB0b3JfaW5kZXhpbmdfZmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZURlc2NyaXB0b3JJbmRleGluZ0ZlYXR1cmVzRVhUPigpOworICAgIHZvaWQgKnBOZXh0ID0gc3VwcG9ydHNEZXNjcmlwdG9ySW5kZXhpbmcgPyAmZGVzY3JpcHRvcl9pbmRleGluZ19mZWF0dXJlcyA6IG51bGxwdHI7CisgICAgLy8gQ3JlYXRlIGEgZGV2aWNlIHRoYXQgZW5hYmxlcyBpbmxpbmVfdW5pZm9ybV9ibG9jaworICAgIGF1dG8gaW5saW5lX3VuaWZvcm1fYmxvY2tfZmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja0ZlYXR1cmVzRVhUPihwTmV4dCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmlubGluZV91bmlmb3JtX2Jsb2NrX2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiIpOworICAgIGFzc2VydCh2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgIT0gbnVsbHB0cik7CisKKyAgICAvLyBHZXQgdGhlIGlubGluZSB1bmlmb3JtIGJsb2NrIGxpbWl0cworICAgIGF1dG8gaW5saW5lX3VuaWZvcm1fcHJvcHMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ+KCk7CisgICAgYXV0byBwcm9wMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFI+KCZpbmxpbmVfdW5pZm9ybV9wcm9wcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSKGdwdSgpLCAmcHJvcDIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZmZWF0dXJlczIpKTsKKworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZHNsYiA9IHt9OworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc+IGRzbGJfdmVjID0ge307CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyBkc19sYXlvdXRfY2kgPSB7fTsKKyAgICBkc19sYXlvdXRfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk87CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRzX2xheW91dCA9IHt9OworCisgICAgLy8gVGVzdCB0b28gbWFueSBiaW5kaW5ncworICAgIGRzbGJfdmVjLmNsZWFyKCk7CisgICAgZHNsYi5iaW5kaW5nID0gMDsKKyAgICBkc2xiLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IDQ7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKworICAgIGlmIChpbmxpbmVfdW5pZm9ybV9wcm9wcy5tYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplIDwgZHNsYi5kZXNjcmlwdG9yQ291bnQpIHsKKyAgICAgICAgcHJpbnRmKCIlc0Rlc2NyaXB0b3JDb3VudCBleGNlZWRzIElubGluZVVuaWZvcm1CbG9ja1NpemUgbGltaXQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtYXhCbG9ja3MgPSBzdGQ6Om1heChpbmxpbmVfdW5pZm9ybV9wcm9wcy5tYXhQZXJTdGFnZURlc2NyaXB0b3JJbmxpbmVVbmlmb3JtQmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZV91bmlmb3JtX3Byb3BzLm1heERlc2NyaXB0b3JTZXRJbmxpbmVVbmlmb3JtQmxvY2tzKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMSArIG1heEJsb2NrczsgKytpKSB7CisgICAgICAgIGRzbGIuYmluZGluZyA9IGk7CisgICAgICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKyAgICB9CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjIxNCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tZGVzY3JpcHRvclR5cGUtMDIyMTYiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLWRlc2NyaXB0b3JUeXBlLTAyMjE1Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1kZXNjcmlwdG9yVHlwZS0wMjIxNyIpOworCisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGlwZWxpbmVfbGF5b3V0X2NpID0ge307CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5wTmV4dCA9IE5VTEw7CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnNldExheW91dENvdW50ID0gMTsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2kucFNldExheW91dHMgPSAmZHNfbGF5b3V0OworICAgIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgcGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsKKyAgICBwaXBlbGluZV9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc19sYXlvdXQsIG51bGxwdHIpOworICAgIGRzX2xheW91dCA9IFZLX05VTExfSEFORExFOworCisgICAgLy8gU2luZ2xlIGJpbmRpbmcgdGhhdCdzIHRvbyBsYXJnZSBhbmQgaXMgbm90IGEgbXVsdGlwbGUgb2YgNAorICAgIGRzbGIuYmluZGluZyA9IDA7CisgICAgZHNsYi5kZXNjcmlwdG9yQ291bnQgPSBpbmxpbmVfdW5pZm9ybV9wcm9wcy5tYXhJbmxpbmVVbmlmb3JtQmxvY2tTaXplICsgMTsKKworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSAxOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSAmZHNsYjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtMDIyMDkiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmctZGVzY3JpcHRvclR5cGUtMDIyMTAiKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZkc19sYXlvdXRfY2ksIE5VTEwsICZkc19sYXlvdXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGRzX2xheW91dCwgbnVsbHB0cik7CisgICAgZHNfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICAvLyBQb29sIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICBWa0Rlc2NyaXB0b3JQb29sU2l6ZSBkc190eXBlX2NvdW50ID0ge307CisgICAgZHNfdHlwZV9jb3VudC50eXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVDsKKyAgICBkc190eXBlX2NvdW50LmRlc2NyaXB0b3JDb3VudCA9IDMzOworCisgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gZHNfcG9vbF9jaSA9IHt9OworICAgIGRzX3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk87CisgICAgZHNfcG9vbF9jaS5wTmV4dCA9IE5VTEw7CisgICAgZHNfcG9vbF9jaS5mbGFncyA9IDA7CisgICAgZHNfcG9vbF9jaS5tYXhTZXRzID0gMjsKKyAgICBkc19wb29sX2NpLnBvb2xTaXplQ291bnQgPSAxOworICAgIGRzX3Bvb2xfY2kucFBvb2xTaXplcyA9ICZkc190eXBlX2NvdW50OworCisgICAgVmtEZXNjcmlwdG9yUG9vbCBkc19wb29sID0gVktfTlVMTF9IQU5ETEU7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0Rlc2NyaXB0b3JQb29sU2l6ZS10eXBlLTAyMjE4Iik7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzX3Bvb2xfY2ksIE5VTEwsICZkc19wb29sKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZHNfcG9vbCkgeworICAgICAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5oYW5kbGUoKSwgZHNfcG9vbCwgbnVsbHB0cik7CisgICAgICAgIGRzX3Bvb2wgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSB2YWxpZCBwb29sCisgICAgZHNfdHlwZV9jb3VudC5kZXNjcmlwdG9yQ291bnQgPSAzMjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfcG9vbF9jaSwgTlVMTCwgJmRzX3Bvb2wpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgLy8gQ3JlYXRlIHR3byB2YWxpZCBzZXRzIHdpdGggOCBieXRlcyBlYWNoCisgICAgZHNsYl92ZWMuY2xlYXIoKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAwOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOworICAgIGRzbGIuZGVzY3JpcHRvckNvdW50ID0gODsKKyAgICBkc2xiLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAxOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSBkc2xiX3ZlYy5zaXplKCk7CisgICAgZHNfbGF5b3V0X2NpLnBCaW5kaW5ncyA9ICZkc2xiX3ZlY1swXTsKKworICAgIGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzX2xheW91dF9jaSwgTlVMTCwgJmRzX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXRzWzJdOworICAgIFZrRGVzY3JpcHRvclNldExheW91dCBzZXRfbGF5b3V0c1syXSA9IHtkc19sYXlvdXQsIGRzX2xheW91dH07CisgICAgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGFsbG9jX2luZm8gPSB7fTsKKyAgICBhbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTzsKKyAgICBhbGxvY19pbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA9IDI7CisgICAgYWxsb2NfaW5mby5kZXNjcmlwdG9yUG9vbCA9IGRzX3Bvb2w7CisgICAgYWxsb2NfaW5mby5wU2V0TGF5b3V0cyA9IHNldF9sYXlvdXRzOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFsbG9jX2luZm8sIGRlc2NyaXB0b3Jfc2V0cyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAvLyBUZXN0IGludmFsaWQgVmtXcml0ZURlc2NyaXB0b3JTZXQgcGFyYW1ldGVycyAoYXJyYXkgZWxlbWVudCBhbmQgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDQpCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZSA9IHt9OworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IGRlc2NyaXB0b3Jfc2V0c1swXTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0QXJyYXlFbGVtZW50ID0gMDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JDb3VudCA9IDM7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQ7CisKKyAgICB1aW50MzJfdCBkdW1teURhdGFbOF0gPSB7fTsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCB3cml0ZV9pbmxpbmVfdW5pZm9ybSA9IHt9OworICAgIHdyaXRlX2lubGluZV91bmlmb3JtLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOworICAgIHdyaXRlX2lubGluZV91bmlmb3JtLmRhdGFTaXplID0gMzsKKyAgICB3cml0ZV9pbmxpbmVfdW5pZm9ybS5wRGF0YSA9ICZkdW1teURhdGFbMF07CisgICAgZGVzY3JpcHRvcl93cml0ZS5wTmV4dCA9ICZ3cml0ZV9pbmxpbmVfdW5pZm9ybTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMjAiKTsKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEFycmF5RWxlbWVudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSA0OworICAgIHdyaXRlX2lubGluZV91bmlmb3JtLmRhdGFTaXplID0gNDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRlc2NyaXB0b3JUeXBlLTAyMjE5Iik7CisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgZGVzY3JpcHRvcl93cml0ZS5wTmV4dCA9IG51bGxwdHI7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RBcnJheUVsZW1lbnQgPSAwOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtXcml0ZURlc2NyaXB0b3JTZXQtZGVzY3JpcHRvclR5cGUtMDIyMjEiKTsKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZSwgMCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBOZXh0ID0gJndyaXRlX2lubGluZV91bmlmb3JtOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIFRlc3QgaW52YWxpZCBWa0NvcHlEZXNjcmlwdG9yU2V0IHBhcmFtZXRlcnMgKGFycmF5IGVsZW1lbnQgYW5kIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiA0KQorICAgIFZrQ29weURlc2NyaXB0b3JTZXQgY29weV9kc191cGRhdGUgPSB7fTsKKyAgICBjb3B5X2RzX3VwZGF0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPUFlfREVTQ1JJUFRPUl9TRVQ7CisgICAgY29weV9kc191cGRhdGUuc3JjU2V0ID0gZGVzY3JpcHRvcl9zZXRzWzBdOworICAgIGNvcHlfZHNfdXBkYXRlLnNyY0JpbmRpbmcgPSAwOworICAgIGNvcHlfZHNfdXBkYXRlLnNyY0FycmF5RWxlbWVudCA9IDA7CisgICAgY29weV9kc191cGRhdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXRzWzFdOworICAgIGNvcHlfZHNfdXBkYXRlLmRzdEJpbmRpbmcgPSAwOworICAgIGNvcHlfZHNfdXBkYXRlLmRzdEFycmF5RWxlbWVudCA9IDA7CisgICAgY29weV9kc191cGRhdGUuZGVzY3JpcHRvckNvdW50ID0gNDsKKworICAgIGNvcHlfZHNfdXBkYXRlLnNyY0FycmF5RWxlbWVudCA9IDE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0NvcHlEZXNjcmlwdG9yU2V0LXNyY0JpbmRpbmctMDIyMjMiKTsKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAwLCBOVUxMLCAxLCAmY29weV9kc191cGRhdGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgY29weV9kc191cGRhdGUuc3JjQXJyYXlFbGVtZW50ID0gMDsKKyAgICBjb3B5X2RzX3VwZGF0ZS5kc3RBcnJheUVsZW1lbnQgPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtDb3B5RGVzY3JpcHRvclNldC1kc3RCaW5kaW5nLTAyMjI0Iik7CisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMCwgTlVMTCwgMSwgJmNvcHlfZHNfdXBkYXRlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGNvcHlfZHNfdXBkYXRlLmRzdEFycmF5RWxlbWVudCA9IDA7CisgICAgY29weV9kc191cGRhdGUuZGVzY3JpcHRvckNvdW50ID0gNTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQ29weURlc2NyaXB0b3JTZXQtc3JjQmluZGluZy0wMjIyNSIpOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDAsIE5VTEwsIDEsICZjb3B5X2RzX3VwZGF0ZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBjb3B5X2RzX3VwZGF0ZS5kZXNjcmlwdG9yQ291bnQgPSA0OworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDAsIE5VTEwsIDEsICZjb3B5X2RzX3VwZGF0ZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5oYW5kbGUoKSwgZHNfcG9vbCwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfbGF5b3V0LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBXcm9uZ2RzdEFycmF5RWxlbWVudCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVCwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLkluaXQoMzIsIDMyLCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0lOUFVUX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgVmtJbWFnZVZpZXcgdmlldyA9IGltYWdlLnRhcmdldFZpZXcoVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNKTsKKworICAgIFZrRGVzY3JpcHRvckltYWdlSW5mbyBpbWFnZV9pbmZvID0ge307CisgICAgaW1hZ2VfaW5mby5pbWFnZVZpZXcgPSB2aWV3OworICAgIGltYWdlX2luZm8uc2FtcGxlciA9IFZLX05VTExfSEFORExFOworICAgIGltYWdlX2luZm8uaW1hZ2VMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMOworICAgIGRlc2NyaXB0b3Jfc2V0LmltYWdlX2luZm9zLmVtcGxhY2VfYmFjayhpbWFnZV9pbmZvKTsKKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGU7CisgICAgbWVtc2V0KCZkZXNjcmlwdG9yX3dyaXRlLCAwLCBzaXplb2YoZGVzY3JpcHRvcl93cml0ZSkpOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IGRlc2NyaXB0b3Jfc2V0LnNldF87CisgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9IGRlc2NyaXB0b3Jfc2V0LmltYWdlX2luZm9zLmRhdGEoKTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBCdWZmZXJJbmZvID0gbnVsbHB0cjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBUZXhlbEJ1ZmZlclZpZXcgPSBudWxscHRyOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kc3RBcnJheUVsZW1lbnQtMDAzMjEiKTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEFycmF5RWxlbWVudCA9IDE7CisgICAgZGVzY3JpcHRvcl9zZXQuZGVzY3JpcHRvcl93cml0ZXMuZW1wbGFjZV9iYWNrKGRlc2NyaXB0b3Jfd3JpdGUpOworICAgIGRlc2NyaXB0b3Jfc2V0LlVwZGF0ZURlc2NyaXB0b3JTZXRzKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0MihtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5ULCAyLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIGRlc2NyaXB0b3Jfc2V0Mi5pbWFnZV9pbmZvcy5lbXBsYWNlX2JhY2soaW1hZ2VfaW5mbyk7CisgICAgZGVzY3JpcHRvcl9zZXQyLmltYWdlX2luZm9zLmVtcGxhY2VfYmFjayhpbWFnZV9pbmZvKTsKKworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQyLnNldF87CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9IGRlc2NyaXB0b3Jfc2V0Mi5pbWFnZV9pbmZvcy5kYXRhKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrV3JpdGVEZXNjcmlwdG9yU2V0LWRzdEFycmF5RWxlbWVudC0wMDMyMSIpOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0QXJyYXlFbGVtZW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3NldDIuZGVzY3JpcHRvcl93cml0ZXMuZW1wbGFjZV9iYWNrKGRlc2NyaXB0b3Jfd3JpdGUpOworICAgIGRlc2NyaXB0b3Jfc2V0Mi5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1dyaXRlRGVzY3JpcHRvclNldC1kc3RBcnJheUVsZW1lbnQtMDAzMjEiKTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEFycmF5RWxlbWVudCA9IDM7CisgICAgZGVzY3JpcHRvcl9zZXQyLmRlc2NyaXB0b3Jfd3JpdGVzLmNsZWFyKCk7CisgICAgZGVzY3JpcHRvcl9zZXQyLmRlc2NyaXB0b3Jfd3JpdGVzLmVtcGxhY2VfYmFjayhkZXNjcmlwdG9yX3dyaXRlKTsKKyAgICBkZXNjcmlwdG9yX3NldDIuVXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19pbWFnZWxlc3NfZnJhbWVidWZmZXIuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtsYXllcnRlc3RzX2ltYWdlbGVzc19mcmFtZWJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3NDllOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19pbWFnZWxlc3NfZnJhbWVidWZmZXIuY3BwCkBAIC0wLDAgKzEsMTA5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjbm9ydGhyb3BAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKZXJlbXkgS25pYWdlciA8amVyZW15a0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBTaGFubm9uIE1jUGhlcnNvbiA8c2hhbm5vbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBUb2JpYXMgSGVjdG9yIDx0b2JpYXMuaGVjdG9yQGFtZC5jb20+CisgKi8KKworI2luY2x1ZGUgImNhc3RfdXRpbHMuaCIKKyNpbmNsdWRlICJsYXllcl92YWxpZGF0aW9uX3Rlc3RzLmgiCisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW1hZ2VsZXNzRnJhbWVidWZmZXJSZW5kZXJQYXNzQmVnaW5JbWFnZVZpZXdNaXNtYXRjaFRlc3RzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkJlZ2luIGEgcmVuZGVyUGFzcyB3aGVyZSB0aGUgaW1hZ2Ugdmlld3Mgc3BlY2lmaWVkIGRvIG5vdCBtYXRjaCB0aGUgcGFyYW1ldGVycyB1c2VkIHRvIGNyZWF0ZSB0aGUgZnJhbWVidWZmZXIgYW5kIHJlbmRlciAiCisgICAgICAgICJwYXNzLiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgZGV2aWNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGJvb2wgcnAyU3VwcG9ydGVkID0gQ2hlY2tDcmVhdGVSZW5kZXJQYXNzMlN1cHBvcnQodGhpcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzKTsKKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0lNQUdFX0ZPUk1BVF9MSVNUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIHRlc3QgcmVxdWlyZXMgVktfS0hSX2ltYWdlbGVzc19mcmFtZWJ1ZmZlciwgbm90IGF2YWlsYWJsZS4gIFNraXBwaW5nLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzID0ge307CisgICAgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9GRUFUVVJFU19LSFI7CisgICAgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzLmltYWdlbGVzc0ZyYW1lYnVmZmVyID0gVktfVFJVRTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyID0ge307CisgICAgcGh5c2ljYWxEZXZpY2VGZWF0dXJlczIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjsKKyAgICBwaHlzaWNhbERldmljZUZlYXR1cmVzMi5wTmV4dCA9ICZwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXM7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworCisgICAgdWludDMyX3QgYXR0YWNobWVudFdpZHRoID0gNTEyOworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRIZWlnaHQgPSA1MTI7CisgICAgVmtGb3JtYXQgYXR0YWNobWVudEZvcm1hdHNbMl0gPSB7VktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk19OworICAgIFZrRm9ybWF0IGZyYW1lYnVmZmVyQXR0YWNobWVudEZvcm1hdHNbM10gPSB7VktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STX07CisKKyAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHdpdGggYSBzaW5nbGUgYXR0YWNobWVudAorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjcmlwdGlvbiA9IHt9OworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbi5mb3JtYXQgPSBhdHRhY2htZW50Rm9ybWF0c1swXTsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb24uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb24uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgYXR0YWNobWVudFJlZmVyZW5jZSA9IHt9OworICAgIGF0dGFjaG1lbnRSZWZlcmVuY2UubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc0Rlc2NyaXB0aW9uID0ge307CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uLmNvbG9yQXR0YWNobWVudENvdW50ID0gMTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24ucENvbG9yQXR0YWNobWVudHMgPSAmYXR0YWNobWVudFJlZmVyZW5jZTsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJlbmRlclBhc3NDcmVhdGVJbmZvID0ge307CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8uc3VicGFzc0NvdW50ID0gMTsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5wU3VicGFzc2VzID0gJnN1YnBhc3NEZXNjcmlwdGlvbjsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5hdHRhY2htZW50Q291bnQgPSAxOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnBBdHRhY2htZW50cyA9ICZhdHRhY2htZW50RGVzY3JpcHRpb247CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZyZW5kZXJQYXNzQ3JlYXRlSW5mbywgTlVMTCwgJnJlbmRlclBhc3MpOworCisgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvID0ge307CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8uZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby53aWR0aCA9IGF0dGFjaG1lbnRXaWR0aDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8uaGVpZ2h0ID0gYXR0YWNobWVudEhlaWdodDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8ubGF5ZXJDb3VudCA9IDE7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLnZpZXdGb3JtYXRDb3VudCA9IDI7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLnBWaWV3Rm9ybWF0cyA9IGZyYW1lYnVmZmVyQXR0YWNobWVudEZvcm1hdHM7CisgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mbyA9IHt9OworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVFNfQ1JFQVRFX0lORk9fS0hSOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLmF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCA9IDE7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8ucEF0dGFjaG1lbnRJbWFnZUluZm9zID0gJmZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mbzsKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8gPSB7fTsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ucE5leHQgPSAmZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm87CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLmZsYWdzID0gVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby53aWR0aCA9IGF0dGFjaG1lbnRXaWR0aDsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uaGVpZ2h0ID0gYXR0YWNobWVudEhlaWdodDsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ubGF5ZXJzID0gMTsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uYXR0YWNobWVudENvdW50ID0gMTsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ucEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ucmVuZGVyUGFzcyA9IHJlbmRlclBhc3M7CisgICAgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcjsKKworICAgIFZrSW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mb0tIUiBpbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvID0ge307CisgICAgaW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0ZPUk1BVF9MSVNUX0NSRUFURV9JTkZPX0tIUjsKKyAgICBpbWFnZUZvcm1hdExpc3RDcmVhdGVJbmZvLnZpZXdGb3JtYXRDb3VudCA9IDI7CisgICAgaW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mby5wVmlld0Zvcm1hdHMgPSBhdHRhY2htZW50Rm9ybWF0czsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZUNyZWF0ZUluZm8gPSB7fTsKKyAgICBpbWFnZUNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZUNyZWF0ZUluZm8ucE5leHQgPSAmaW1hZ2VGb3JtYXRMaXN0Q3JlYXRlSW5mbzsKKyAgICBpbWFnZUNyZWF0ZUluZm8uZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUOworICAgIGltYWdlQ3JlYXRlSW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGltYWdlQ3JlYXRlSW5mby5leHRlbnQud2lkdGggPSBhdHRhY2htZW50V2lkdGg7CisgICAgaW1hZ2VDcmVhdGVJbmZvLmV4dGVudC5oZWlnaHQgPSBhdHRhY2htZW50SGVpZ2h0OworICAgIGltYWdlQ3JlYXRlSW5mby5leHRlbnQuZGVwdGggPSAxOworICAgIGltYWdlQ3JlYXRlSW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VDcmVhdGVJbmZvLm1pcExldmVscyA9IDEwOworICAgIGltYWdlQ3JlYXRlSW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlQ3JlYXRlSW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlQ3JlYXRlSW5mby5mb3JtYXQgPSBhdHRhY2htZW50Rm9ybWF0c1swXTsKKworICAgIFZrSW1hZ2VPYmogaW1hZ2VPYmplY3QobV9kZXZpY2UpOworICAgIGltYWdlT2JqZWN0LmluaXQoJmltYWdlQ3JlYXRlSW5mbyk7CisgICAgVmtJbWFnZSBpbWFnZSA9IGltYWdlT2JqZWN0LmltYWdlKCk7CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaW1hZ2VWaWV3Q3JlYXRlSW5mbyA9IHt9OworICAgIGltYWdlVmlld0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGltYWdlVmlld0NyZWF0ZUluZm8uaW1hZ2UgPSBpbWFnZTsKKyAgICBpbWFnZVZpZXdDcmVhdGVJbmZvLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgIGltYWdlVmlld0NyZWF0ZUluZm8uZm9ybWF0ID0gYXR0YWNobWVudEZvcm1hdHNbMF07CisgICAgaW1hZ2VWaWV3Q3JlYXRlSW5mby5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGltYWdlVmlld0NyZWF0ZUluZm8uc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpbWFnZVZpZXdDcmVhdGVJbmZvLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3OworICAgIHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaW1hZ2VWaWV3Q3JlYXRlSW5mbywgTlVMTCwgJmltYWdlVmlldyk7CisKKyAgICBWa1JlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvS0hSIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvID0ge307CisgICAgcmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19BVFRBQ0hNRU5UX0JFR0lOX0lORk9fS0hSOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICByZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby5hdHRhY2htZW50Q291bnQgPSAxOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLnBBdHRhY2htZW50cyA9ICZpbWFnZVZpZXc7CisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJlbmRlclBhc3NCZWdpbkluZm8gPSB7fTsKKyAgICByZW5kZXJQYXNzQmVnaW5JbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTzsKKyAgICByZW5kZXJQYXNzQmVnaW5JbmZvLnBOZXh0ID0gJnJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvOworICAgIHJlbmRlclBhc3NCZWdpbkluZm8ucmVuZGVyUGFzcyA9IHJlbmRlclBhc3M7CisgICAgcmVuZGVyUGFzc0JlZ2luSW5mby5yZW5kZXJBcmVhLmV4dGVudC53aWR0aCA9IGF0dGFjaG1lbnRXaWR0aDsKKyAgICByZW5kZXJQYXNzQmVnaW5JbmZvLnJlbmRlckFyZWEuZXh0ZW50LmhlaWdodCA9IGF0dGFjaG1lbnRIZWlnaHQ7CisKKyAgICAvLyBQb3NpdGl2ZSB0ZXN0IGZpcnN0CisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNtZF9iZWdpbl9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQsIG51bGxwdHJ9OworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5wQXR0YWNobWVudHMgPSBudWxscHRyOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5mbGFncyA9IFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIHJlbmRlclBhc3NCZWdpbkluZm8uZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjsKKyAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZjbWRfYmVnaW5faW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZyZW5kZXJQYXNzQmVnaW5JbmZvLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgdms6OlJlc2V0Q29tbWFuZEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworCisgICAgLy8gSW1hZ2VsZXNzIGZyYW1lYnVmZmVyIGNyZWF0aW9uIGJpdCBub3QgcHJlc2VudAorICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5wQXR0YWNobWVudHMgPSAmaW1hZ2VWaWV3OworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5mbGFncyA9IDA7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICByZW5kZXJQYXNzQmVnaW5JbmZvLmZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7CisgICAgVGVzdFJlbmRlclBhc3NCZWdpbihtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcmVuZGVyUGFzc0JlZ2luSW5mbywgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA3IiwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjA3Iik7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ucEF0dGFjaG1lbnRzID0gbnVsbHB0cjsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uZmxhZ3MgPSBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI7CisKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLmF0dGFjaG1lbnRDb3VudCA9IDI7CisgICAgcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIwOCIsICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIwOCIpOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKworICAgIC8vIE1pc21hdGNoZWQgbnVtYmVyIG9mIGF0dGFjaG1lbnRzCisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICByZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby5hdHRhY2htZW50Q291bnQgPSAyOworICAgIHJlbmRlclBhc3NCZWdpbkluZm8uZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjsKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZyZW5kZXJQYXNzQmVnaW5JbmZvLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMDgiLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMDgiKTsKKyAgICByZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby5hdHRhY2htZW50Q291bnQgPSAxOworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisKKyAgICAvLyBNaXNtYXRjaGVkIGZsYWdzCisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLmZsYWdzID0gMDsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIHJlbmRlclBhc3NCZWdpbkluZm8uZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjsKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZyZW5kZXJQYXNzQmVnaW5JbmZvLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMDkiLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMDkiKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby5mbGFncyA9IFZLX0lNQUdFX0NSRUFURV9NVVRBQkxFX0ZPUk1BVF9CSVQ7CisKKyAgICAvLyBNaXNtYXRjaGVkIHVzYWdlCisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIHJlbmRlclBhc3NCZWdpbkluZm8uZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjsKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZyZW5kZXJQYXNzQmVnaW5JbmZvLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTAiLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTAiKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworCisgICAgLy8gTWlzbWF0Y2hlZCB3aWR0aAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby53aWR0aCArPSAxOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMSIsICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMSIpOworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLndpZHRoIC09IDE7CisKKyAgICAvLyBNaXNtYXRjaGVkIGhlaWdodAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby5oZWlnaHQgKz0gMTsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIHJlbmRlclBhc3NCZWdpbkluZm8uZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjsKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZyZW5kZXJQYXNzQmVnaW5JbmZvLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTIiLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTIiKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby5oZWlnaHQgLT0gMTsKKworICAgIC8vIE1pc21hdGNoZWQgbGF5ZXIgY291bnQKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8ubGF5ZXJDb3VudCArPSAxOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMyIsICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxMyIpOworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLmxheWVyQ291bnQgLT0gMTsKKworICAgIC8vIE1pc21hdGNoZWQgdmlldyBmb3JtYXQgY291bnQKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8udmlld0Zvcm1hdENvdW50ID0gMzsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIHJlbmRlclBhc3NCZWdpbkluZm8uZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjsKKyAgICBUZXN0UmVuZGVyUGFzc0JlZ2luKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZyZW5kZXJQYXNzQmVnaW5JbmZvLCBycDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTQiLCAiVlVJRC1Wa1JlbmRlclBhc3NCZWdpbkluZm8tZnJhbWVidWZmZXItMDMyMTQiKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby52aWV3Rm9ybWF0Q291bnQgPSAyOworCisgICAgLy8gTWlzbWF0Y2hlZCBmb3JtYXQgbGlzdHMKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRGb3JtYXRzWzFdID0gVktfRk9STUFUX0I4RzhSOEE4X1NSR0I7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICByZW5kZXJQYXNzQmVnaW5JbmZvLmZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7CisgICAgVGVzdFJlbmRlclBhc3NCZWdpbihtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcmVuZGVyUGFzc0JlZ2luSW5mbywgcnAyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjE1IiwgIlZVSUQtVmtSZW5kZXJQYXNzQmVnaW5JbmZvLWZyYW1lYnVmZmVyLTAzMjE1Iik7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRGb3JtYXRzWzFdID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworCisgICAgLy8gTWlzbWF0Y2hlZCBmb3JtYXRzCisgICAgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3MjsKKyAgICBpbWFnZVZpZXdDcmVhdGVJbmZvLmZvcm1hdCA9IGF0dGFjaG1lbnRGb3JtYXRzWzFdOworICAgIHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaW1hZ2VWaWV3Q3JlYXRlSW5mbywgbnVsbHB0ciwgJmltYWdlVmlldzIpOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLnBBdHRhY2htZW50cyA9ICZpbWFnZVZpZXcyOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNiIsICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNiIpOworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZVZpZXcyLCBudWxscHRyKTsKKyAgICByZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby5wQXR0YWNobWVudHMgPSAmaW1hZ2VWaWV3OworICAgIGltYWdlVmlld0NyZWF0ZUluZm8uZm9ybWF0ID0gYXR0YWNobWVudEZvcm1hdHNbMF07CisKKyAgICAvLyBNaXNtYXRjaGVkIHNhbXBsZSBjb3VudHMKKyAgICBpbWFnZUNyZWF0ZUluZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKyAgICBpbWFnZUNyZWF0ZUluZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBWa0ltYWdlT2JqIGltYWdlT2JqZWN0MihtX2RldmljZSk7CisgICAgaW1hZ2VPYmplY3QyLmluaXQoJmltYWdlQ3JlYXRlSW5mbyk7CisgICAgaW1hZ2VWaWV3Q3JlYXRlSW5mby5pbWFnZSA9IGltYWdlT2JqZWN0Mi5pbWFnZSgpOworICAgIHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaW1hZ2VWaWV3Q3JlYXRlSW5mbywgbnVsbHB0ciwgJmltYWdlVmlldzIpOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLnBBdHRhY2htZW50cyA9ICZpbWFnZVZpZXcyOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNyIsICJWVUlELVZrUmVuZGVyUGFzc0JlZ2luSW5mby1mcmFtZWJ1ZmZlci0wMzIxNyIpOworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZVZpZXcyLCBudWxscHRyKTsKKyAgICByZW5kZXJQYXNzQXR0YWNobWVudEJlZ2luSW5mby5wQXR0YWNobWVudHMgPSAmaW1hZ2VWaWV3OworICAgIGltYWdlVmlld0NyZWF0ZUluZm8uaW1hZ2UgPSBpbWFnZU9iamVjdC5pbWFnZSgpOworICAgIGltYWdlQ3JlYXRlSW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlQ3JlYXRlSW5mby5taXBMZXZlbHMgPSAxMDsKKworICAgIC8vIE1pc21hdGNoZWQgbGV2ZWwgY291bnRzCisgICAgaW1hZ2VWaWV3Q3JlYXRlSW5mby5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAyOworICAgIHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaW1hZ2VWaWV3Q3JlYXRlSW5mbywgbnVsbHB0ciwgJmltYWdlVmlldzIpOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLnBBdHRhY2htZW50cyA9ICZpbWFnZVZpZXcyOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItcEF0dGFjaG1lbnRzLTAzMjE4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItcEF0dGFjaG1lbnRzLTAzMjE4Iik7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlVmlldzIsIG51bGxwdHIpOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLnBBdHRhY2htZW50cyA9ICZpbWFnZVZpZXc7CisgICAgaW1hZ2VWaWV3Q3JlYXRlSW5mby5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworCisgICAgLy8gTm9uLWlkZW50aXR5IGNvbXBvbmVudCBzd2l6emxlCisgICAgaW1hZ2VWaWV3Q3JlYXRlSW5mby5jb21wb25lbnRzLnIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9BOworICAgIHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaW1hZ2VWaWV3Q3JlYXRlSW5mbywgbnVsbHB0ciwgJmltYWdlVmlldzIpOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLnBBdHRhY2htZW50cyA9ICZpbWFnZVZpZXcyOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworICAgIFRlc3RSZW5kZXJQYXNzQmVnaW4obV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJlbmRlclBhc3NCZWdpbkluZm8sIHJwMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItcEF0dGFjaG1lbnRzLTAzMjE5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUmVuZGVyUGFzc0F0dGFjaG1lbnRCZWdpbkluZm9LSFItcEF0dGFjaG1lbnRzLTAzMjE5Iik7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlVmlldzIsIG51bGxwdHIpOworICAgIHJlbmRlclBhc3NBdHRhY2htZW50QmVnaW5JbmZvLnBBdHRhY2htZW50cyA9ICZpbWFnZVZpZXc7CisgICAgaW1hZ2VWaWV3Q3JlYXRlSW5mby5jb21wb25lbnRzLnIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWTsKKworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJlbmRlclBhc3MsIG51bGxwdHIpOworICAgIC8vICAgIHZrRGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2VWaWV3LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVFbmFibGVUZXN0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVXNlIGltYWdlbGVzcyBmcmFtZWJ1ZmZlciBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgZW5hYmxpbmcgdGhlIGZlYXR1cmUiKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0lNQUdFX0ZPUk1BVF9MSVNUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBkZXZpY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCBudWxscHRyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRXaWR0aCA9IDUxMjsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50SGVpZ2h0ID0gNTEyOworICAgIFZrRm9ybWF0IGF0dGFjaG1lbnRGb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisKKyAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHdpdGggYSBzaW5nbGUgYXR0YWNobWVudAorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjcmlwdGlvbiA9IHt9OworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbi5mb3JtYXQgPSBhdHRhY2htZW50Rm9ybWF0OworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbi5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbi5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRhY2htZW50UmVmZXJlbmNlID0ge307CisgICAgYXR0YWNobWVudFJlZmVyZW5jZS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzRGVzY3JpcHRpb24gPSB7fTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24uY29sb3JBdHRhY2htZW50Q291bnQgPSAxOworICAgIHN1YnBhc3NEZXNjcmlwdGlvbi5wQ29sb3JBdHRhY2htZW50cyA9ICZhdHRhY2htZW50UmVmZXJlbmNlOworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcmVuZGVyUGFzc0NyZWF0ZUluZm8gPSB7fTsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5zdWJwYXNzQ291bnQgPSAxOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnBTdWJwYXNzZXMgPSAmc3VicGFzc0Rlc2NyaXB0aW9uOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8ucEF0dGFjaG1lbnRzID0gJmF0dGFjaG1lbnREZXNjcmlwdGlvbjsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOworICAgIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzOworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJlbmRlclBhc3NDcmVhdGVJbmZvLCBOVUxMLCAmcmVuZGVyUGFzcyk7CisKKyAgICBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb0tIUiBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8gPSB7fTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0lNQUdFX0lORk9fS0hSOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby53aWR0aCA9IGF0dGFjaG1lbnRXaWR0aDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8uaGVpZ2h0ID0gYXR0YWNobWVudEhlaWdodDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8ubGF5ZXJDb3VudCA9IDE7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLnZpZXdGb3JtYXRDb3VudCA9IDE7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLnBWaWV3Rm9ybWF0cyA9ICZhdHRhY2htZW50Rm9ybWF0OworICAgIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8gPSB7fTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRTX0NSRUFURV9JTkZPX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby5hdHRhY2htZW50SW1hZ2VJbmZvQ291bnQgPSAxOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLnBBdHRhY2htZW50SW1hZ2VJbmZvcyA9ICZmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm87CisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZnJhbWVidWZmZXJDcmVhdGVJbmZvID0ge307CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk87CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLnBOZXh0ID0gJmZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5mbGFncyA9IFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ud2lkdGggPSBhdHRhY2htZW50V2lkdGg7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLmhlaWdodCA9IGF0dGFjaG1lbnRIZWlnaHQ7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLmxheWVycyA9IDE7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLnJlbmRlclBhc3MgPSByZW5kZXJQYXNzOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5hdHRhY2htZW50Q291bnQgPSAxOworICAgIFZrRnJhbWVidWZmZXIgZnJhbWVidWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIC8vIEltYWdlbGVzcyBmcmFtZWJ1ZmZlciBjcmVhdGlvbiBiaXQgbm90IHByZXNlbnQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTg5Iik7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGlmIChmcmFtZWJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIH0KKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCByZW5kZXJQYXNzLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZWxlc3NGcmFtZWJ1ZmZlckNyZWF0aW9uVGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYW4gaW1hZ2VsZXNzIGZyYW1lYnVmZmVyIGluIHZhcmlvdXMgaW52YWxpZCB3YXlzIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgYm9vbCBycDJTdXBwb3J0ZWQgPSBDaGVja0NyZWF0ZVJlbmRlclBhc3MyU3VwcG9ydCh0aGlzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworCisgICAgYm9vbCBtdWx0aXZpZXdTdXBwb3J0ZWQgPSBycDJTdXBwb3J0ZWQ7CisgICAgaWYgKCFycDJTdXBwb3J0ZWQpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgICAgICBtdWx0aXZpZXdTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfSU1BR0VfRk9STUFUX0xJU1RfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGRldmljZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzID0ge307CisgICAgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9GRUFUVVJFU19LSFI7CisgICAgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzLmltYWdlbGVzc0ZyYW1lYnVmZmVyID0gVktfVFJVRTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyID0ge307CisgICAgcGh5c2ljYWxEZXZpY2VGZWF0dXJlczIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjsKKyAgICBwaHlzaWNhbERldmljZUZlYXR1cmVzMi5wTmV4dCA9ICZwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXM7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZwaHlzaWNhbERldmljZUZlYXR1cmVzMiwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICB1aW50MzJfdCBhdHRhY2htZW50V2lkdGggPSA1MTI7CisgICAgdWludDMyX3QgYXR0YWNobWVudEhlaWdodCA9IDUxMjsKKyAgICBWa0Zvcm1hdCBhdHRhY2htZW50Rm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworCisgICAgLy8gQ3JlYXRlIGEgcmVuZGVyUGFzcyB3aXRoIGEgc2luZ2xlIGF0dGFjaG1lbnQKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzY3JpcHRpb24gPSB7fTsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb24uZm9ybWF0ID0gYXR0YWNobWVudEZvcm1hdDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb24uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb24uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgYXR0YWNobWVudFJlZmVyZW5jZSA9IHt9OworICAgIGF0dGFjaG1lbnRSZWZlcmVuY2UubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc0Rlc2NyaXB0aW9uID0ge307CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uLmNvbG9yQXR0YWNobWVudENvdW50ID0gMTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24ucENvbG9yQXR0YWNobWVudHMgPSAmYXR0YWNobWVudFJlZmVyZW5jZTsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJlbmRlclBhc3NDcmVhdGVJbmZvID0ge307CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8uc3VicGFzc0NvdW50ID0gMTsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5wU3VicGFzc2VzID0gJnN1YnBhc3NEZXNjcmlwdGlvbjsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5hdHRhY2htZW50Q291bnQgPSAxOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnBBdHRhY2htZW50cyA9ICZhdHRhY2htZW50RGVzY3JpcHRpb247CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZyZW5kZXJQYXNzQ3JlYXRlSW5mbywgTlVMTCwgJnJlbmRlclBhc3MpOworCisgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvID0ge307CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8ud2lkdGggPSBhdHRhY2htZW50V2lkdGg7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLmhlaWdodCA9IGF0dGFjaG1lbnRIZWlnaHQ7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvLmxheWVyQ291bnQgPSAxOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby52aWV3Rm9ybWF0Q291bnQgPSAxOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mby5wVmlld0Zvcm1hdHMgPSAmYXR0YWNobWVudEZvcm1hdDsKKyAgICBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvID0ge307CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFI7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8uYXR0YWNobWVudEltYWdlSW5mb0NvdW50ID0gMTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby5wQXR0YWNobWVudEltYWdlSW5mb3MgPSAmZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvOworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZyYW1lYnVmZmVyQ3JlYXRlSW5mbyA9IHt9OworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5wTmV4dCA9ICZmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mbzsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uZmxhZ3MgPSBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLndpZHRoID0gYXR0YWNobWVudFdpZHRoOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5oZWlnaHQgPSBhdHRhY2htZW50SGVpZ2h0OworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5sYXllcnMgPSAxOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5yZW5kZXJQYXNzID0gcmVuZGVyUGFzczsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uYXR0YWNobWVudENvdW50ID0gMTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICAvLyBBdHRhY2htZW50cyBpbmZvIG5vdCBwcmVzZW50CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTkwIik7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZnJhbWVidWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLnBOZXh0ID0gJmZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvOworCisgICAgLy8gTWlzbWF0Y2hlZCBhdHRhY2htZW50IGNvdW50cworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLmF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCA9IDI7CisgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1syXSA9IHtmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm99OworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLnBBdHRhY2htZW50SW1hZ2VJbmZvcyA9IGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3M7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzE5MSIpOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKGZyYW1lYnVmZmVyICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgfQorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLnBBdHRhY2htZW50SW1hZ2VJbmZvcyA9ICZmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm87CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8uYXR0YWNobWVudEltYWdlSW5mb0NvdW50ID0gMTsKKworICAgIC8vIE1pc21hdGNoZWQgZm9ybWF0IGxpc3QKKyAgICBhdHRhY2htZW50Rm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDUiKTsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChmcmFtZWJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIH0KKyAgICBhdHRhY2htZW50Rm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworCisgICAgLy8gTWlzbWF0Y2hlZCBmb3JtYXQgbGlzdAorICAgIGF0dGFjaG1lbnRGb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwNSIpOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKGZyYW1lYnVmZmVyICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgfQorICAgIGF0dGFjaG1lbnRGb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisKKyAgICAvLyBNaXNtYXRjaGVkIGxheWVyIGNvdW50LCBtdWx0aXZpZXcgZGlzYWJsZWQKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ubGF5ZXJzID0gMjsKKyAgICBjb25zdCBjaGFyKiBtaXNtYXRjaGVkTGF5ZXJzTm9NdWx0aXZpZXdWdWlkID0KKyAgICAgICAgbXVsdGl2aWV3U3VwcG9ydGVkID8gIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMzE5OSIgOiAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMCI7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBtaXNtYXRjaGVkTGF5ZXJzTm9NdWx0aXZpZXdWdWlkKTsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChmcmFtZWJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIH0KKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ubGF5ZXJzID0gMTsKKworICAgIC8vIE1pc21hdGNoZWQgd2lkdGgKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ud2lkdGggKz0gMTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTkyIik7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZnJhbWVidWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLndpZHRoIC09IDE7CisKKyAgICAvLyBNaXNtYXRjaGVkIGhlaWdodAorICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5oZWlnaHQgKz0gMTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMTkzIik7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZnJhbWVidWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLmhlaWdodCAtPSAxOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcmVuZGVyUGFzcywgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW1hZ2VsZXNzRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VVc2FnZU1pc21hdGNoVGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYW4gaW1hZ2VsZXNzIGZyYW1lYnVmZmVyIHdpdGggbWlzbWF0Y2hlZCBhdHRhY2htZW50IGltYWdlIHVzYWdlIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9JTUFHRV9GT1JNQVRfTElTVF9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgZGV2aWNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXMgPSB7fTsKKyAgICBwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUjsKKyAgICBwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXMuaW1hZ2VsZXNzRnJhbWVidWZmZXIgPSBWS19UUlVFOworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgcGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPSB7fTsKKyAgICBwaHlzaWNhbERldmljZUZlYXR1cmVzMi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yOworICAgIHBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLnBOZXh0ID0gJnBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlczsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRXaWR0aCA9IDUxMjsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50SGVpZ2h0ID0gNTEyOworICAgIFZrRm9ybWF0IGNvbG9yQW5kSW5wdXRBdHRhY2htZW50Rm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIFZrRm9ybWF0IGRlcHRoU3RlbmNpbEF0dGFjaG1lbnRGb3JtYXQgPSBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2NyaXB0aW9uc1s0XSA9IHt9OworICAgIC8vIENvbG9yIGF0dGFjaG1lbnQKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzBdLmZvcm1hdCA9IGNvbG9yQW5kSW5wdXRBdHRhY2htZW50Rm9ybWF0OworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMF0uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzBdLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgLy8gQ29sb3IgcmVzb2x2ZSBhdHRhY2htZW50CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1sxXS5mb3JtYXQgPSBjb2xvckFuZElucHV0QXR0YWNobWVudEZvcm1hdDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzFdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1sxXS5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIC8vIERlcHRoIHN0ZW5jaWwgYXR0YWNobWVudAorICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMl0uZm9ybWF0ID0gZGVwdGhTdGVuY2lsQXR0YWNobWVudEZvcm1hdDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzJdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1syXS5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIC8vIElucHV0IGF0dGFjaG1lbnQKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzNdLmZvcm1hdCA9IGNvbG9yQW5kSW5wdXRBdHRhY2htZW50Rm9ybWF0OworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbM10uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzNdLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgY29sb3JBdHRhY2htZW50UmVmZXJlbmNlID0ge307CisgICAgY29sb3JBdHRhY2htZW50UmVmZXJlbmNlLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGNvbG9yQXR0YWNobWVudFJlZmVyZW5jZS5hdHRhY2htZW50ID0gMDsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgY29sb3JSZXNvbHZlQXR0YWNobWVudFJlZmVyZW5jZSA9IHt9OworICAgIGNvbG9yUmVzb2x2ZUF0dGFjaG1lbnRSZWZlcmVuY2UubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgY29sb3JSZXNvbHZlQXR0YWNobWVudFJlZmVyZW5jZS5hdHRhY2htZW50ID0gMTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgZGVwdGhTdGVuY2lsQXR0YWNobWVudFJlZmVyZW5jZSA9IHt9OworICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnRSZWZlcmVuY2UubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudFJlZmVyZW5jZS5hdHRhY2htZW50ID0gMjsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgaW5wdXRBdHRhY2htZW50UmVmZXJlbmNlID0ge307CisgICAgaW5wdXRBdHRhY2htZW50UmVmZXJlbmNlLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGlucHV0QXR0YWNobWVudFJlZmVyZW5jZS5hdHRhY2htZW50ID0gMzsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzRGVzY3JpcHRpb24gPSB7fTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24uY29sb3JBdHRhY2htZW50Q291bnQgPSAxOworICAgIHN1YnBhc3NEZXNjcmlwdGlvbi5wQ29sb3JBdHRhY2htZW50cyA9ICZjb2xvckF0dGFjaG1lbnRSZWZlcmVuY2U7CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uLnBSZXNvbHZlQXR0YWNobWVudHMgPSAmY29sb3JSZXNvbHZlQXR0YWNobWVudFJlZmVyZW5jZTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSAmZGVwdGhTdGVuY2lsQXR0YWNobWVudFJlZmVyZW5jZTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24uaW5wdXRBdHRhY2htZW50Q291bnQgPSAxOworICAgIHN1YnBhc3NEZXNjcmlwdGlvbi5wSW5wdXRBdHRhY2htZW50cyA9ICZpbnB1dEF0dGFjaG1lbnRSZWZlcmVuY2U7CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJlbmRlclBhc3NDcmVhdGVJbmZvID0ge307CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8uYXR0YWNobWVudENvdW50ID0gNDsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5zdWJwYXNzQ291bnQgPSAxOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnBTdWJwYXNzZXMgPSAmc3VicGFzc0Rlc2NyaXB0aW9uOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnBBdHRhY2htZW50cyA9IGF0dGFjaG1lbnREZXNjcmlwdGlvbnM7CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZyZW5kZXJQYXNzQ3JlYXRlSW5mbywgbnVsbHB0ciwgJnJlbmRlclBhc3MpOworCisgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1s0XSA9IHt9OworICAgIC8vIENvbG9yIGF0dGFjaG1lbnQKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzBdLndpZHRoID0gYXR0YWNobWVudFdpZHRoOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0uaGVpZ2h0ID0gYXR0YWNobWVudEhlaWdodDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzBdLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS5sYXllckNvdW50ID0gMTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzBdLnZpZXdGb3JtYXRDb3VudCA9IDE7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS5wVmlld0Zvcm1hdHMgPSAmY29sb3JBbmRJbnB1dEF0dGFjaG1lbnRGb3JtYXQ7CisgICAgLy8gQ29sb3IgcmVzb2x2ZSBhdHRhY2htZW50CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1sxXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfSU1BR0VfSU5GT19LSFI7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1sxXS53aWR0aCA9IGF0dGFjaG1lbnRXaWR0aDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLmhlaWdodCA9IGF0dGFjaG1lbnRIZWlnaHQ7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1sxXS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0ubGF5ZXJDb3VudCA9IDE7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1sxXS52aWV3Rm9ybWF0Q291bnQgPSAxOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0ucFZpZXdGb3JtYXRzID0gJmNvbG9yQW5kSW5wdXRBdHRhY2htZW50Rm9ybWF0OworICAgIC8vIERlcHRoIHN0ZW5jaWwgYXR0YWNobWVudAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0lNQUdFX0lORk9fS0hSOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0ud2lkdGggPSBhdHRhY2htZW50V2lkdGg7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1syXS5oZWlnaHQgPSBhdHRhY2htZW50SGVpZ2h0OworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0ubGF5ZXJDb3VudCA9IDE7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1syXS52aWV3Rm9ybWF0Q291bnQgPSAxOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0ucFZpZXdGb3JtYXRzID0gJmRlcHRoU3RlbmNpbEF0dGFjaG1lbnRGb3JtYXQ7CisgICAgLy8gSW5wdXQgYXR0YWNobWVudAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbM10uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0lNQUdFX0lORk9fS0hSOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbM10ud2lkdGggPSBhdHRhY2htZW50V2lkdGg7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1szXS5oZWlnaHQgPSBhdHRhY2htZW50SGVpZ2h0OworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbM10udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9JTlBVVF9BVFRBQ0hNRU5UX0JJVDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzNdLmxheWVyQ291bnQgPSAxOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbM10udmlld0Zvcm1hdENvdW50ID0gMTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzNdLnBWaWV3Rm9ybWF0cyA9ICZjb2xvckFuZElucHV0QXR0YWNobWVudEZvcm1hdDsKKyAgICBWa0ZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvS0hSIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvID0ge307CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UU19DUkVBVEVfSU5GT19LSFI7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8uYXR0YWNobWVudEltYWdlSW5mb0NvdW50ID0gNDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby5wQXR0YWNobWVudEltYWdlSW5mb3MgPSBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zOworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZyYW1lYnVmZmVyQ3JlYXRlSW5mbyA9IHt9OworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5wTmV4dCA9ICZmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mbzsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uZmxhZ3MgPSBWS19GUkFNRUJVRkZFUl9DUkVBVEVfSU1BR0VMRVNTX0JJVF9LSFI7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLndpZHRoID0gYXR0YWNobWVudFdpZHRoOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5oZWlnaHQgPSBhdHRhY2htZW50SGVpZ2h0OworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5sYXllcnMgPSAxOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5yZW5kZXJQYXNzID0gcmVuZGVyUGFzczsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uYXR0YWNobWVudENvdW50ID0gNDsKKyAgICBWa0ZyYW1lYnVmZmVyIGZyYW1lYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICAvLyBDb2xvciBhdHRhY2htZW50LCBtaXNtYXRjaGVkIHVzYWdlCisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDEiKTsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChmcmFtZWJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIH0KKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzBdLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisKKyAgICAvLyBDb2xvciByZXNvbHZlIGF0dGFjaG1lbnQsIG1pc21hdGNoZWQgdXNhZ2UKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMSIpOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKGZyYW1lYnVmZmVyICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgfQorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDsKKworICAgIC8vIERlcHRoIHN0ZW5jaWwgYXR0YWNobWVudCwgbWlzbWF0Y2hlZCB1c2FnZQorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLWZsYWdzLTAzMjAyIik7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZnJhbWVidWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1syXS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQ7CisKKyAgICAvLyBDb2xvciBhdHRhY2htZW50LCBtaXNtYXRjaGVkIHVzYWdlCisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1szXS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tZmxhZ3MtMDMyMDQiKTsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChmcmFtZWJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIH0KKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzNdLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ7CisKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCByZW5kZXJQYXNzLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZWxlc3NGcmFtZWJ1ZmZlckF0dGFjaG1lbnRNdWx0aXZpZXdJbWFnZUxheWVyQ291bnRNaXNtYXRjaFRlc3RzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGFuIGltYWdlbGVzcyBmcmFtZWJ1ZmZlciBhZ2FpbnN0IGEgbXVsdGl2aWV3LWVuYWJsZWQgcmVuZGVyIHBhc3Mgd2l0aCBtaXNtYXRjaGVkIGxheWVyIGNvdW50cyIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgaW5zdGFuY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01VTFRJVklFV19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTVVMVElWSUVXX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBkZXZpY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9NVUxUSVZJRVdfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfSU1BR0VfRk9STUFUX0xJU1RfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGRldmljZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9JTUFHRUxFU1NfRlJBTUVCVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtQaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXNLSFIgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzID0ge307CisgICAgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9GRUFUVVJFU19LSFI7CisgICAgcGh5c2ljYWxEZXZpY2VJbWFnZWxlc3NGcmFtZWJ1ZmZlckZlYXR1cmVzLmltYWdlbGVzc0ZyYW1lYnVmZmVyID0gVktfVFJVRTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyID0ge307CisgICAgcGh5c2ljYWxEZXZpY2VGZWF0dXJlczIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjsKKyAgICBwaHlzaWNhbERldmljZUZlYXR1cmVzMi5wTmV4dCA9ICZwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXM7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZwaHlzaWNhbERldmljZUZlYXR1cmVzMiwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICB1aW50MzJfdCBhdHRhY2htZW50V2lkdGggPSA1MTI7CisgICAgdWludDMyX3QgYXR0YWNobWVudEhlaWdodCA9IDUxMjsKKyAgICBWa0Zvcm1hdCBjb2xvckFuZElucHV0QXR0YWNobWVudEZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBWa0Zvcm1hdCBkZXB0aFN0ZW5jaWxBdHRhY2htZW50Rm9ybWF0ID0gVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVDsKKworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbNF0gPSB7fTsKKyAgICAvLyBDb2xvciBhdHRhY2htZW50CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1swXS5mb3JtYXQgPSBjb2xvckFuZElucHV0QXR0YWNobWVudEZvcm1hdDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzBdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ7CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1swXS5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIC8vIENvbG9yIHJlc29sdmUgYXR0YWNobWVudAorICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMV0uZm9ybWF0ID0gY29sb3JBbmRJbnB1dEF0dGFjaG1lbnRGb3JtYXQ7CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1sxXS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMV0uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICAvLyBEZXB0aCBzdGVuY2lsIGF0dGFjaG1lbnQKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzJdLmZvcm1hdCA9IGRlcHRoU3RlbmNpbEF0dGFjaG1lbnRGb3JtYXQ7CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1syXS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzRfQklUOworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMl0uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICAvLyBJbnB1dCBhdHRhY2htZW50CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1szXS5mb3JtYXQgPSBjb2xvckFuZElucHV0QXR0YWNobWVudEZvcm1hdDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzNdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1szXS5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGNvbG9yQXR0YWNobWVudFJlZmVyZW5jZSA9IHt9OworICAgIGNvbG9yQXR0YWNobWVudFJlZmVyZW5jZS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBjb2xvckF0dGFjaG1lbnRSZWZlcmVuY2UuYXR0YWNobWVudCA9IDA7CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGNvbG9yUmVzb2x2ZUF0dGFjaG1lbnRSZWZlcmVuY2UgPSB7fTsKKyAgICBjb2xvclJlc29sdmVBdHRhY2htZW50UmVmZXJlbmNlLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGNvbG9yUmVzb2x2ZUF0dGFjaG1lbnRSZWZlcmVuY2UuYXR0YWNobWVudCA9IDE7CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnRSZWZlcmVuY2UgPSB7fTsKKyAgICBkZXB0aFN0ZW5jaWxBdHRhY2htZW50UmVmZXJlbmNlLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnRSZWZlcmVuY2UuYXR0YWNobWVudCA9IDI7CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGlucHV0QXR0YWNobWVudFJlZmVyZW5jZSA9IHt9OworICAgIGlucHV0QXR0YWNobWVudFJlZmVyZW5jZS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBpbnB1dEF0dGFjaG1lbnRSZWZlcmVuY2UuYXR0YWNobWVudCA9IDM7CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc0Rlc2NyaXB0aW9uID0ge307CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uLmNvbG9yQXR0YWNobWVudENvdW50ID0gMTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24ucENvbG9yQXR0YWNobWVudHMgPSAmY29sb3JBdHRhY2htZW50UmVmZXJlbmNlOworICAgIHN1YnBhc3NEZXNjcmlwdGlvbi5wUmVzb2x2ZUF0dGFjaG1lbnRzID0gJmNvbG9yUmVzb2x2ZUF0dGFjaG1lbnRSZWZlcmVuY2U7CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gJmRlcHRoU3RlbmNpbEF0dGFjaG1lbnRSZWZlcmVuY2U7CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uLmlucHV0QXR0YWNobWVudENvdW50ID0gMTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24ucElucHV0QXR0YWNobWVudHMgPSAmaW5wdXRBdHRhY2htZW50UmVmZXJlbmNlOworCisgICAgdWludDMyX3Qgdmlld01hc2sgPSAweDN1OworICAgIFZrUmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gcmVuZGVyUGFzc011bHRpdmlld0NyZWF0ZUluZm8gPSB7fTsKKyAgICByZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX01VTFRJVklFV19DUkVBVEVfSU5GTzsKKyAgICByZW5kZXJQYXNzTXVsdGl2aWV3Q3JlYXRlSW5mby5zdWJwYXNzQ291bnQgPSAxOworICAgIHJlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvLnBWaWV3TWFza3MgPSAmdmlld01hc2s7CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyByZW5kZXJQYXNzQ3JlYXRlSW5mbyA9IHt9OworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnBOZXh0ID0gJnJlbmRlclBhc3NNdWx0aXZpZXdDcmVhdGVJbmZvOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLmF0dGFjaG1lbnRDb3VudCA9IDQ7CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8uc3VicGFzc0NvdW50ID0gMTsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5wU3VicGFzc2VzID0gJnN1YnBhc3NEZXNjcmlwdGlvbjsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5wQXR0YWNobWVudHMgPSBhdHRhY2htZW50RGVzY3JpcHRpb25zOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk87CisgICAgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3M7CisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcmVuZGVyUGFzc0NyZWF0ZUluZm8sIG51bGxwdHIsICZyZW5kZXJQYXNzKTsKKworICAgIFZrRnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvS0hSIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbNF0gPSB7fTsKKyAgICAvLyBDb2xvciBhdHRhY2htZW50CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfSU1BR0VfSU5GT19LSFI7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS53aWR0aCA9IGF0dGFjaG1lbnRXaWR0aDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzBdLmhlaWdodCA9IGF0dGFjaG1lbnRIZWlnaHQ7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0ubGF5ZXJDb3VudCA9IDI7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS52aWV3Rm9ybWF0Q291bnQgPSAxOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0ucFZpZXdGb3JtYXRzID0gJmNvbG9yQW5kSW5wdXRBdHRhY2htZW50Rm9ybWF0OworICAgIC8vIENvbG9yIHJlc29sdmUgYXR0YWNobWVudAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0lNQUdFX0lORk9fS0hSOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0ud2lkdGggPSBhdHRhY2htZW50V2lkdGg7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1sxXS5oZWlnaHQgPSBhdHRhY2htZW50SGVpZ2h0OworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLmxheWVyQ291bnQgPSAyOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0udmlld0Zvcm1hdENvdW50ID0gMTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLnBWaWV3Rm9ybWF0cyA9ICZjb2xvckFuZElucHV0QXR0YWNobWVudEZvcm1hdDsKKyAgICAvLyBEZXB0aCBzdGVuY2lsIGF0dGFjaG1lbnQKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzJdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzJdLndpZHRoID0gYXR0YWNobWVudFdpZHRoOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0uaGVpZ2h0ID0gYXR0YWNobWVudEhlaWdodDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzJdLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzJdLmxheWVyQ291bnQgPSAyOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0udmlld0Zvcm1hdENvdW50ID0gMTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzJdLnBWaWV3Rm9ybWF0cyA9ICZkZXB0aFN0ZW5jaWxBdHRhY2htZW50Rm9ybWF0OworICAgIC8vIElucHV0IGF0dGFjaG1lbnQKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzNdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzNdLndpZHRoID0gYXR0YWNobWVudFdpZHRoOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbM10uaGVpZ2h0ID0gYXR0YWNobWVudEhlaWdodDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzNdLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1szXS5sYXllckNvdW50ID0gMjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzNdLnZpZXdGb3JtYXRDb3VudCA9IDE7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1szXS5wVmlld0Zvcm1hdHMgPSAmY29sb3JBbmRJbnB1dEF0dGFjaG1lbnRGb3JtYXQ7CisgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mb0tIUiBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mbyA9IHt9OworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVFNfQ1JFQVRFX0lORk9fS0hSOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLmF0dGFjaG1lbnRJbWFnZUluZm9Db3VudCA9IDQ7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8ucEF0dGFjaG1lbnRJbWFnZUluZm9zID0gZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvczsKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8gPSB7fTsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ucE5leHQgPSAmZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm87CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLmZsYWdzID0gVktfRlJBTUVCVUZGRVJfQ1JFQVRFX0lNQUdFTEVTU19CSVRfS0hSOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby53aWR0aCA9IGF0dGFjaG1lbnRXaWR0aDsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8uaGVpZ2h0ID0gYXR0YWNobWVudEhlaWdodDsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ubGF5ZXJzID0gMTsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ucmVuZGVyUGFzcyA9IHJlbmRlclBhc3M7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLmF0dGFjaG1lbnRDb3VudCA9IDQ7CisgICAgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlciA9IFZLX05VTExfSEFORExFOworCisgICAgLy8gQ29sb3IgYXR0YWNobWVudCwgbWlzbWF0Y2hlZCBsYXllciBjb3VudAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0ubGF5ZXJDb3VudCA9IDE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAzMTk4Iik7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZnJhbWVidWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS5sYXllckNvdW50ID0gMjsKKworICAgIC8vIENvbG9yIHJlc29sdmUgYXR0YWNobWVudCwgbWlzbWF0Y2hlZCBsYXllciBjb3VudAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0ubGF5ZXJDb3VudCA9IDE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAzMTk4Iik7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZnJhbWVidWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1sxXS5sYXllckNvdW50ID0gMjsKKworICAgIC8vIERlcHRoIHN0ZW5jaWwgYXR0YWNobWVudCwgbWlzbWF0Y2hlZCBsYXllciBjb3VudAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMl0ubGF5ZXJDb3VudCA9IDE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1yZW5kZXJQYXNzLTAzMTk4Iik7CisgICAgdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZyYW1lYnVmZmVyQ3JlYXRlSW5mbywgbnVsbHB0ciwgJmZyYW1lYnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZnJhbWVidWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICB9CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1syXS5sYXllckNvdW50ID0gMjsKKworICAgIC8vIElucHV0IGF0dGFjaG1lbnQsIG1pc21hdGNoZWQgbGF5ZXIgY291bnQKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzNdLmxheWVyQ291bnQgPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMzE5OCIpOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKGZyYW1lYnVmZmVyICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgfQorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbM10ubGF5ZXJDb3VudCA9IDI7CisKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCByZW5kZXJQYXNzLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZWxlc3NGcmFtZWJ1ZmZlckRlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50VGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQ3JlYXRlIGFuIGltYWdlbGVzcyBmcmFtZWJ1ZmZlciBhZ2FpbnN0IGEgcmVuZGVyIHBhc3MgdXNpbmcgZGVwdGggc3RlbmNpbCByZXNvbHZlLCB3aXRoIG1pc21hdGNoZWQgaW5mb3JtYXRpb24iKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGJvb2wgcnAyU3VwcG9ydGVkID0gQ2hlY2tDcmVhdGVSZW5kZXJQYXNzMlN1cHBvcnQodGhpcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzKTsKKyAgICBpZiAoIXJwMlN1cHBvcnRlZCkgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBkZXZpY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9DUkVBVEVfUkVOREVSUEFTU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9ERVBUSF9TVEVOQ0lMX1JFU09MVkVfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgZGV2aWNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9JTUFHRV9GT1JNQVRfTElTVF9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgZGV2aWNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0lNQUdFTEVTU19GUkFNRUJVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlc0tIUiBwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXMgPSB7fTsKKyAgICBwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VMRVNTX0ZSQU1FQlVGRkVSX0ZFQVRVUkVTX0tIUjsKKyAgICBwaHlzaWNhbERldmljZUltYWdlbGVzc0ZyYW1lYnVmZmVyRmVhdHVyZXMuaW1hZ2VsZXNzRnJhbWVidWZmZXIgPSBWS19UUlVFOworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgcGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPSB7fTsKKyAgICBwaHlzaWNhbERldmljZUZlYXR1cmVzMi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yOworICAgIHBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLnBOZXh0ID0gJnBoeXNpY2FsRGV2aWNlSW1hZ2VsZXNzRnJhbWVidWZmZXJGZWF0dXJlczsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRXaWR0aCA9IDUxMjsKKyAgICB1aW50MzJfdCBhdHRhY2htZW50SGVpZ2h0ID0gNTEyOworICAgIFZrRm9ybWF0IGF0dGFjaG1lbnRGb3JtYXQgPSBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24yS0hSIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMl0gPSB7fTsKKyAgICAvLyBEZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQVRUQUNITUVOVF9ERVNDUklQVElPTl8yX0tIUjsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzBdLmZvcm1hdCA9IGF0dGFjaG1lbnRGb3JtYXQ7CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1swXS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzRfQklUOworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMF0uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICAvLyBEZXB0aC9zdGVuY2lsIHJlc29sdmUgYXR0YWNobWVudAorICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX0RFU0NSSVBUSU9OXzJfS0hSOworICAgIGF0dGFjaG1lbnREZXNjcmlwdGlvbnNbMV0uZm9ybWF0ID0gYXR0YWNobWVudEZvcm1hdDsKKyAgICBhdHRhY2htZW50RGVzY3JpcHRpb25zWzFdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgYXR0YWNobWVudERlc2NyaXB0aW9uc1sxXS5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlMktIUiBkZXB0aFN0ZW5jaWxBdHRhY2htZW50UmVmZXJlbmNlID0ge307CisgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudFJlZmVyZW5jZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FUVEFDSE1FTlRfUkVGRVJFTkNFXzJfS0hSOworICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnRSZWZlcmVuY2UubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudFJlZmVyZW5jZS5hdHRhY2htZW50ID0gMDsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UyS0hSIGRlcHRoU3RlbmNpbFJlc29sdmVBdHRhY2htZW50UmVmZXJlbmNlID0ge307CisgICAgZGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnRSZWZlcmVuY2Uuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BVFRBQ0hNRU5UX1JFRkVSRU5DRV8yX0tIUjsKKyAgICBkZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudFJlZmVyZW5jZS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBkZXB0aFN0ZW5jaWxSZXNvbHZlQXR0YWNobWVudFJlZmVyZW5jZS5hdHRhY2htZW50ID0gMTsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmVLSFIgc3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZSA9IHt9OworICAgIHN1YnBhc3NEZXNjcmlwdGlvbkRlcHRoU3RlbmNpbFJlc29sdmUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJQQVNTX0RFU0NSSVBUSU9OX0RFUFRIX1NURU5DSUxfUkVTT0xWRV9LSFI7CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZS5wRGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnQgPSAmZGVwdGhTdGVuY2lsUmVzb2x2ZUF0dGFjaG1lbnRSZWZlcmVuY2U7CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZS5kZXB0aFJlc29sdmVNb2RlID0gVktfUkVTT0xWRV9NT0RFX1NBTVBMRV9aRVJPX0JJVF9LSFI7CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZS5zdGVuY2lsUmVzb2x2ZU1vZGUgPSBWS19SRVNPTFZFX01PREVfU0FNUExFX1pFUk9fQklUX0tIUjsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbjJLSFIgc3VicGFzc0Rlc2NyaXB0aW9uID0ge307CisgICAgc3VicGFzc0Rlc2NyaXB0aW9uLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCUEFTU19ERVNDUklQVElPTl8yX0tIUjsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24ucE5leHQgPSAmc3VicGFzc0Rlc2NyaXB0aW9uRGVwdGhTdGVuY2lsUmVzb2x2ZTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24ucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSAmZGVwdGhTdGVuY2lsQXR0YWNobWVudFJlZmVyZW5jZTsKKyAgICBzdWJwYXNzRGVzY3JpcHRpb24udmlld01hc2sgPSAweDN1OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbzJLSFIgcmVuZGVyUGFzc0NyZWF0ZUluZm8gPSB7fTsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPXzJfS0hSOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICByZW5kZXJQYXNzQ3JlYXRlSW5mby5hdHRhY2htZW50Q291bnQgPSAyOworICAgIHJlbmRlclBhc3NDcmVhdGVJbmZvLnN1YnBhc3NDb3VudCA9IDE7CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8ucFN1YnBhc3NlcyA9ICZzdWJwYXNzRGVzY3JpcHRpb247CisgICAgcmVuZGVyUGFzc0NyZWF0ZUluZm8ucEF0dGFjaG1lbnRzID0gYXR0YWNobWVudERlc2NyaXB0aW9uczsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyUGFzczsKKyAgICBQRk5fdmtDcmVhdGVSZW5kZXJQYXNzMktIUiB2a0NyZWF0ZVJlbmRlclBhc3MyS0hSID0KKyAgICAgICAgKFBGTl92a0NyZWF0ZVJlbmRlclBhc3MyS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0NyZWF0ZVJlbmRlclBhc3MyS0hSIik7CisgICAgdmtDcmVhdGVSZW5kZXJQYXNzMktIUihtX2RldmljZS0+ZGV2aWNlKCksICZyZW5kZXJQYXNzQ3JlYXRlSW5mbywgbnVsbHB0ciwgJnJlbmRlclBhc3MpOworCisgICAgVmtGcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9LSFIgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1syXSA9IHt9OworICAgIC8vIERlcHRoL3N0ZW5jaWwgYXR0YWNobWVudAorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0lNQUdFX0lORk9fS0hSOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0ud2lkdGggPSBhdHRhY2htZW50V2lkdGg7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS5oZWlnaHQgPSBhdHRhY2htZW50SGVpZ2h0OworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0ubGF5ZXJDb3VudCA9IDI7CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1swXS52aWV3Rm9ybWF0Q291bnQgPSAxOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0ucFZpZXdGb3JtYXRzID0gJmF0dGFjaG1lbnRGb3JtYXQ7CisgICAgLy8gRGVwdGgvc3RlbmNpbCByZXNvbHZlIGF0dGFjaG1lbnQKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9JTUFHRV9JTkZPX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLndpZHRoID0gYXR0YWNobWVudFdpZHRoOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0uaGVpZ2h0ID0gYXR0YWNobWVudEhlaWdodDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLmxheWVyQ291bnQgPSAyOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0udmlld0Zvcm1hdENvdW50ID0gMTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLnBWaWV3Rm9ybWF0cyA9ICZhdHRhY2htZW50Rm9ybWF0OworICAgIFZrRnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm9LSFIgZnJhbWVidWZmZXJBdHRhY2htZW50c0NyZWF0ZUluZm8gPSB7fTsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRTX0NSRUFURV9JTkZPX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRzQ3JlYXRlSW5mby5hdHRhY2htZW50SW1hZ2VJbmZvQ291bnQgPSAyOworICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvLnBBdHRhY2htZW50SW1hZ2VJbmZvcyA9IGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3M7CisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZnJhbWVidWZmZXJDcmVhdGVJbmZvID0ge307CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk87CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLnBOZXh0ID0gJmZyYW1lYnVmZmVyQXR0YWNobWVudHNDcmVhdGVJbmZvOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5mbGFncyA9IFZLX0ZSQU1FQlVGRkVSX0NSRUFURV9JTUFHRUxFU1NfQklUX0tIUjsKKyAgICBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8ud2lkdGggPSBhdHRhY2htZW50V2lkdGg7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLmhlaWdodCA9IGF0dGFjaG1lbnRIZWlnaHQ7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLmxheWVycyA9IDE7CisgICAgZnJhbWVidWZmZXJDcmVhdGVJbmZvLnJlbmRlclBhc3MgPSByZW5kZXJQYXNzOworICAgIGZyYW1lYnVmZmVyQ3JlYXRlSW5mby5hdHRhY2htZW50Q291bnQgPSAyOworICAgIFZrRnJhbWVidWZmZXIgZnJhbWVidWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIC8vIENvbG9yIGF0dGFjaG1lbnQsIG1pc21hdGNoZWQgbGF5ZXIgY291bnQKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzBdLmxheWVyQ291bnQgPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8tcmVuZGVyUGFzcy0wMzE5OCIpOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKGZyYW1lYnVmZmVyICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgfQorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMF0ubGF5ZXJDb3VudCA9IDI7CisKKyAgICAvLyBEZXB0aCByZXNvbHZlIGF0dGFjaG1lbnQsIG1pc21hdGNoZWQgaW1hZ2UgdXNhZ2UKKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mby1mbGFncy0wMzIwMyIpOworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmcmFtZWJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsICZmcmFtZWJ1ZmZlcik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKGZyYW1lYnVmZmVyICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmcmFtZWJ1ZmZlciwgbnVsbHB0cik7CisgICAgfQorICAgIGZyYW1lYnVmZmVyQXR0YWNobWVudEltYWdlSW5mb3NbMV0udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUOworCisgICAgLy8gRGVwdGggcmVzb2x2ZSBhdHRhY2htZW50LCBtaXNtYXRjaGVkIGxheWVyIGNvdW50CisgICAgZnJhbWVidWZmZXJBdHRhY2htZW50SW1hZ2VJbmZvc1sxXS5sYXllckNvdW50ID0gMTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRnJhbWVidWZmZXJDcmVhdGVJbmZvLXJlbmRlclBhc3MtMDMxOTgiKTsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmZnJhbWVidWZmZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChmcmFtZWJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZnJhbWVidWZmZXIsIG51bGxwdHIpOworICAgIH0KKyAgICBmcmFtZWJ1ZmZlckF0dGFjaG1lbnRJbWFnZUluZm9zWzFdLmxheWVyQ291bnQgPSAyOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcmVuZGVyUGFzcywgbnVsbHB0cik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a2xheWVydGVzdHNfb3RoZXJzLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19vdGhlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzU5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a2xheWVydGVzdHNfb3RoZXJzLmNwcApAQCAtMCwwICsxLDcyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBNaWtlIFN0cm95YW4gPG1pa2VATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluZUBnb29nbGUuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y25vcnRocm9wQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IERhdmUgSG91bHRvbiA8ZGF2ZWhAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSmVyZW15IEtuaWFnZXIgPGplcmVteWtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogU2hhbm5vbiBNY1BoZXJzb24gPHNoYW5ub25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9obiBadWxhdWYgPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqLworCisjaW5jbHVkZSAiY2FzdF91dGlscy5oIgorI2luY2x1ZGUgImxheWVyX3ZhbGlkYXRpb25fdGVzdHMuaCIKKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZXF1aXJlZFBhcmFtZXRlcikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlNwZWNpZnkgVktfTlVMTF9IQU5ETEUsIE5VTEwsIGFuZCAwIGZvciByZXF1aXJlZCBoYW5kbGUsIHBvaW50ZXIsIGFycmF5LCBhbmQgYXJyYXkgY291bnQgcGFyYW1ldGVycyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgInJlcXVpcmVkIHBhcmFtZXRlciBwRmVhdHVyZXMgc3BlY2lmaWVkIGFzIE5VTEwiKTsKKyAgICAvLyBTcGVjaWZ5IE5VTEwgZm9yIGEgcG9pbnRlciB0byBhIGhhbmRsZQorICAgIC8vIEV4cGVjdGVkIHRvIHRyaWdnZXIgYW4gZXJyb3Igd2l0aAorICAgIC8vIHBhcmFtZXRlcl92YWxpZGF0aW9uOjp2YWxpZGF0ZV9yZXF1aXJlZF9wb2ludGVyCisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoZ3B1KCksIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgcGFyYW1ldGVyIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgc3BlY2lmaWVkIGFzIE5VTEwiKTsKKyAgICAvLyBTcGVjaWZ5IE5VTEwgZm9yIHBvaW50ZXIgdG8gYXJyYXkgY291bnQKKyAgICAvLyBFeHBlY3RlZCB0byB0cmlnZ2VyIGFuIGVycm9yIHdpdGggcGFyYW1ldGVyX3ZhbGlkYXRpb246OnZhbGlkYXRlX2FycmF5CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKGdwdSgpLCBOVUxMLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIik7CisgICAgLy8gU3BlY2lmeSAwIGZvciBhIHJlcXVpcmVkIGFycmF5IGNvdW50CisgICAgLy8gRXhwZWN0ZWQgdG8gdHJpZ2dlciBhbiBlcnJvciB3aXRoIHBhcmFtZXRlcl92YWxpZGF0aW9uOjp2YWxpZGF0ZV9hcnJheQorICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MC4wZiwgMC4wZiwgNjQuMGYsIDY0LjBmLCAwLjBmLCAxLjBmfTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPlNldFZpZXdwb3J0KDAsIDAsICZ2aWV3cG9ydCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ3JlYXRlSW1hZ2UtcENyZWF0ZUluZm8tcGFyYW1ldGVyIik7CisgICAgLy8gU3BlY2lmeSBhIG51bGwgcEltYWdlQ3JlYXRlSW5mbyBzdHJ1Y3QgcG9pbnRlcgorICAgIFZrSW1hZ2UgdGVzdF9pbWFnZTsKKyAgICB2azo6Q3JlYXRlSW1hZ2UoZGV2aWNlKCksIE5VTEwsIE5VTEwsICZ0ZXN0X2ltYWdlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydC1wVmlld3BvcnRzLXBhcmFtZXRlciIpOworICAgIC8vIFNwZWNpZnkgTlVMTCBmb3IgYSByZXF1aXJlZCBhcnJheQorICAgIC8vIEV4cGVjdGVkIHRvIHRyaWdnZXIgYW4gZXJyb3Igd2l0aCBwYXJhbWV0ZXJfdmFsaWRhdGlvbjo6dmFsaWRhdGVfYXJyYXkKKyAgICBtX2NvbW1hbmRCdWZmZXItPlNldFZpZXdwb3J0KDAsIDEsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAicmVxdWlyZWQgcGFyYW1ldGVyIG1lbW9yeSBzcGVjaWZpZWQgYXMgVktfTlVMTF9IQU5ETEUiKTsKKyAgICAvLyBTcGVjaWZ5IFZLX05VTExfSEFORExFIGZvciBhIHJlcXVpcmVkIGhhbmRsZQorICAgIC8vIEV4cGVjdGVkIHRvIHRyaWdnZXIgYW4gZXJyb3Igd2l0aAorICAgIC8vIHBhcmFtZXRlcl92YWxpZGF0aW9uOjp2YWxpZGF0ZV9yZXF1aXJlZF9oYW5kbGUKKyAgICB2azo6VW5tYXBNZW1vcnkoZGV2aWNlKCksIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIHBhcmFtZXRlciBwRmVuY2VzWzBdIHNwZWNpZmllZCBhcyBWS19OVUxMX0hBTkRMRSIpOworICAgIC8vIFNwZWNpZnkgVktfTlVMTF9IQU5ETEUgZm9yIGEgcmVxdWlyZWQgaGFuZGxlIGFycmF5IGVudHJ5CisgICAgLy8gRXhwZWN0ZWQgdG8gdHJpZ2dlciBhbiBlcnJvciB3aXRoCisgICAgLy8gcGFyYW1ldGVyX3ZhbGlkYXRpb246OnZhbGlkYXRlX3JlcXVpcmVkX2hhbmRsZV9hcnJheQorICAgIFZrRmVuY2UgZmVuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6UmVzZXRGZW5jZXMoZGV2aWNlKCksIDEsICZmZW5jZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJyZXF1aXJlZCBwYXJhbWV0ZXIgcEFsbG9jYXRlSW5mbyBzcGVjaWZpZWQgYXMgTlVMTCIpOworICAgIC8vIFNwZWNpZnkgTlVMTCBmb3IgYSByZXF1aXJlZCBzdHJ1Y3QgcG9pbnRlcgorICAgIC8vIEV4cGVjdGVkIHRvIHRyaWdnZXIgYW4gZXJyb3Igd2l0aAorICAgIC8vIHBhcmFtZXRlcl92YWxpZGF0aW9uOjp2YWxpZGF0ZV9zdHJ1Y3RfdHlwZQorICAgIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgTlVMTCwgTlVMTCwgJm1lbW9yeSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJ2YWx1ZSBvZiBmYWNlTWFzayBtdXN0IG5vdCBiZSAwIik7CisgICAgLy8gU3BlY2lmeSAwIGZvciBhIHJlcXVpcmVkIFZrRmxhZ3MgcGFyYW1ldGVyCisgICAgLy8gRXhwZWN0ZWQgdG8gdHJpZ2dlciBhbiBlcnJvciB3aXRoIHBhcmFtZXRlcl92YWxpZGF0aW9uOjp2YWxpZGF0ZV9mbGFncworICAgIG1fY29tbWFuZEJ1ZmZlci0+U2V0U3RlbmNpbFJlZmVyZW5jZSgwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgInZhbHVlIG9mIHBTdWJtaXRzWzBdLnBXYWl0RHN0U3RhZ2VNYXNrWzBdIG11c3Qgbm90IGJlIDAiKTsKKyAgICAvLyBTcGVjaWZ5IDAgZm9yIGEgcmVxdWlyZWQgVmtGbGFncyBhcnJheSBlbnRyeQorICAgIC8vIEV4cGVjdGVkIHRvIHRyaWdnZXIgYW4gZXJyb3Igd2l0aAorICAgIC8vIHBhcmFtZXRlcl92YWxpZGF0aW9uOjp2YWxpZGF0ZV9mbGFnc19hcnJheQorICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHN0YWdlRmxhZ3MgPSAwOworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRJbmZvID0ge307CisgICAgc3VibWl0SW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdEluZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICBzdWJtaXRJbmZvLnBXYWl0U2VtYXBob3JlcyA9ICZzZW1hcGhvcmU7CisgICAgc3VibWl0SW5mby5wV2FpdERzdFN0YWdlTWFzayA9ICZzdGFnZUZsYWdzOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdEluZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtTdWJtaXRJbmZvLXNUeXBlLXNUeXBlIik7CisgICAgc3RhZ2VGbGFncyA9IFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVDsKKyAgICAvLyBTZXQgYSBib2d1cyBzVHlwZSBhbmQgc2VlIHdoYXQgaGFwcGVucworICAgIHN1Ym1pdEluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTzsKKyAgICBzdWJtaXRJbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0SW5mby5wV2FpdFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworICAgIHN1Ym1pdEluZm8ucFdhaXREc3RTdGFnZU1hc2sgPSAmc3RhZ2VGbGFnczsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRJbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtcGFyYW1ldGVyIik7CisgICAgc3RhZ2VGbGFncyA9IFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVDsKKyAgICBzdWJtaXRJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0SW5mby53YWl0U2VtYXBob3JlQ291bnQgPSAxOworICAgIC8vIFNldCBhIG51bGwgcG9pbnRlciBmb3IgcFdhaXRTZW1hcGhvcmVzCisgICAgc3VibWl0SW5mby5wV2FpdFNlbWFwaG9yZXMgPSBOVUxMOworICAgIHN1Ym1pdEluZm8ucFdhaXREc3RTdGFnZU1hc2sgPSAmc3RhZ2VGbGFnczsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRJbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ3JlYXRlUmVuZGVyUGFzcy1wQ3JlYXRlSW5mby1wYXJhbWV0ZXIiKTsKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyX3Bhc3M7CisgICAgdms6OkNyZWF0ZVJlbmRlclBhc3MoZGV2aWNlKCksIG51bGxwdHIsIG51bGxwdHIsICZyZW5kZXJfcGFzcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUG5leHRPbmx5U3RydWN0VmFsaWRhdGlvbikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlNlZSBpZiBjaGVja3Mgb2NjdXIgb24gc3RydWN0cyBPTkxZIHVzZWQgaW4gcG5leHQgY2hhaW5zLiIpOworCisgICAgaWYgKCEoQ2hlY2tEZXNjcmlwdG9ySW5kZXhpbmdTdXBwb3J0QW5kSW5pdEZyYW1ld29yayh0aGlzLCBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3IpKSkgeworICAgICAgICBwcmludGYoIkRlc2NyaXB0b3IgaW5kZXhpbmcgb3Igb25lIG9mIGl0cyBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisKKyAgICAvLyBDcmVhdGUgYSBkZXZpY2UgcGFzc2luZyBpbiBhIGJhZCBQZGV2RmVhdHVyZXMyIHZhbHVlCisgICAgYXV0byBpbmRleGluZ19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmluZGV4aW5nX2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKyAgICAvLyBTZXQgb25lIG9mIHRoZSBmZWF0dXJlcyB2YWx1ZXMgdG8gYW4gaW52YWxpZCBib29sZWFuIHZhbHVlCisgICAgaW5kZXhpbmdfZmVhdHVyZXMuZGVzY3JpcHRvckJpbmRpbmdVbmlmb3JtQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kID0gODAwOworCisgICAgdWludDMyX3QgcXVldWVfbm9kZV9jb3VudDsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoZ3B1KCksICZxdWV1ZV9ub2RlX2NvdW50LCBOVUxMKTsKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAqcXVldWVfcHJvcHMgPSBuZXcgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXNbcXVldWVfbm9kZV9jb3VudF07CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKGdwdSgpLCAmcXVldWVfbm9kZV9jb3VudCwgcXVldWVfcHJvcHMpOworICAgIGZsb2F0IHByaW9yaXRpZXNbXSA9IHsxLjBmfTsKKyAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBxdWV1ZV9pbmZve307CisgICAgcXVldWVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTzsKKyAgICBxdWV1ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBxdWV1ZV9pbmZvLmZsYWdzID0gMDsKKyAgICBxdWV1ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSAwOworICAgIHF1ZXVlX2luZm8ucXVldWVDb3VudCA9IDE7CisgICAgcXVldWVfaW5mby5wUXVldWVQcmlvcml0aWVzID0gJnByaW9yaXRpZXNbMF07CisgICAgVmtEZXZpY2VDcmVhdGVJbmZvIGRldl9pbmZvID0ge307CisgICAgZGV2X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk87CisgICAgZGV2X2luZm8ucE5leHQgPSBOVUxMOworICAgIGRldl9pbmZvLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMTsKKyAgICBkZXZfaW5mby5wUXVldWVDcmVhdGVJbmZvcyA9ICZxdWV1ZV9pbmZvOworICAgIGRldl9pbmZvLmVuYWJsZWRMYXllckNvdW50ID0gMDsKKyAgICBkZXZfaW5mby5wcEVuYWJsZWRMYXllck5hbWVzID0gTlVMTDsKKyAgICBkZXZfaW5mby5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBtX2RldmljZV9leHRlbnNpb25fbmFtZXMuc2l6ZSgpOworICAgIGRldl9pbmZvLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLmRhdGEoKTsKKyAgICBkZXZfaW5mby5wTmV4dCA9ICZmZWF0dXJlczI7CisgICAgVmtEZXZpY2UgZGV2OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhULCAiaXMgbmVpdGhlciBWS19UUlVFIG5vciBWS19GQUxTRSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUiKTsKKyAgICB2azo6Q3JlYXRlRGV2aWNlKGdwdSgpLCAmZGV2X2luZm8sIE5VTEwsICZkZXYpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJlc2VydmVkUGFyYW1ldGVyKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiU3BlY2lmeSBhIG5vbi16ZXJvIHZhbHVlIGZvciBhIHJlc2VydmVkIHBhcmFtZXRlciIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiBtdXN0IGJlIDAiKTsKKyAgICAvLyBTcGVjaWZ5IDAgZm9yIGEgcmVzZXJ2ZWQgVmtGbGFncyBwYXJhbWV0ZXIKKyAgICAvLyBFeHBlY3RlZCB0byB0cmlnZ2VyIGFuIGVycm9yIHdpdGgKKyAgICAvLyBwYXJhbWV0ZXJfdmFsaWRhdGlvbjo6dmFsaWRhdGVfcmVzZXJ2ZWRfZmxhZ3MKKyAgICBWa0V2ZW50IGV2ZW50X2hhbmRsZSA9IFZLX05VTExfSEFORExFOworICAgIFZrRXZlbnRDcmVhdGVJbmZvIGV2ZW50X2luZm8gPSB7fTsKKyAgICBldmVudF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisgICAgZXZlbnRfaW5mby5mbGFncyA9IDE7CisgICAgdms6OkNyZWF0ZUV2ZW50KGRldmljZSgpLCAmZXZlbnRfaW5mbywgTlVMTCwgJmV2ZW50X2hhbmRsZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRGVidWdNYXJrZXJOYW1lVGVzdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkVuc3VyZSBkZWJ1ZyBtYXJrZXIgb2JqZWN0IG5hbWVzIGFyZSBwcmludGVkIGluIGRlYnVnIHJlcG9ydCBvdXRwdXQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksICJWS19MQVlFUl9MVU5BUkdfY29yZV92YWxpZGF0aW9uIiwgVktfRVhUX0RFQlVHX01BUktFUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfREVCVUdfTUFSS0VSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERlYnVnIE1hcmtlciBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIFBGTl92a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCBmcHZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUID0KKyAgICAgICAgKFBGTl92a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVCl2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQiKTsKKyAgICBpZiAoIShmcHZrRGVidWdNYXJrZXJTZXRPYmplY3ROYW1lRVhUKSkgeworICAgICAgICBwcmludGYoIiVzIENhbid0IGZpbmQgZnB2a0RlYnVnTWFya2VyU2V0T2JqZWN0TmFtZUVYVDsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChEZXZpY2VTaW11bGF0aW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlc1NraXBwaW5nIG9iamVjdCBuYW1pbmcgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnlfMSwgbWVtb3J5XzI7CisgICAgc3RkOjpzdHJpbmcgbWVtb3J5X25hbWUgPSAibWVtb3J5X25hbWUiOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHt9OworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gMTsKKworICAgIHZrOjpDcmVhdGVCdWZmZXIoZGV2aWNlKCksICZidWZmZXJfY3JlYXRlX2luZm8sIG51bGxwdHIsICZidWZmZXIpOworCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtUmVxdWlyZW1lbnRzOworICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlKCksIGJ1ZmZlciwgJm1lbVJlcXVpcmVtZW50cyk7CisKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1vcnlfYWxsb2NhdGVfaW5mbyA9IHt9OworICAgIG1lbW9yeV9hbGxvY2F0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtb3J5X2FsbG9jYXRlX2luZm8uYWxsb2NhdGlvblNpemUgPSBtZW1SZXF1aXJlbWVudHMuc2l6ZTsKKyAgICBtZW1vcnlfYWxsb2NhdGVfaW5mby5tZW1vcnlUeXBlSW5kZXggPSAwOworCisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmbWVtb3J5X2FsbG9jYXRlX2luZm8sIG51bGxwdHIsICZtZW1vcnlfMSk7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmbWVtb3J5X2FsbG9jYXRlX2luZm8sIG51bGxwdHIsICZtZW1vcnlfMik7CisKKyAgICBWa0RlYnVnTWFya2VyT2JqZWN0TmFtZUluZm9FWFQgbmFtZV9pbmZvID0ge307CisgICAgbmFtZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUFSS0VSX09CSkVDVF9OQU1FX0lORk9fRVhUOworICAgIG5hbWVfaW5mby5wTmV4dCA9IG51bGxwdHI7CisgICAgbmFtZV9pbmZvLm9iamVjdCA9ICh1aW50NjRfdCltZW1vcnlfMjsKKyAgICBuYW1lX2luZm8ub2JqZWN0VHlwZSA9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVDsKKyAgICBuYW1lX2luZm8ucE9iamVjdE5hbWUgPSBtZW1vcnlfbmFtZS5jX3N0cigpOworICAgIGZwdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoZGV2aWNlKCksICZuYW1lX2luZm8pOworCisgICAgdms6OkJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlKCksIGJ1ZmZlciwgbWVtb3J5XzEsIDApOworCisgICAgLy8gVGVzdCBjb3JlX3ZhbGlkYXRpb24gbGF5ZXIKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIG1lbW9yeV9uYW1lKTsKKyAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShkZXZpY2UoKSwgYnVmZmVyLCBtZW1vcnlfMiwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgbWVtb3J5XzEsIG51bGxwdHIpOworICAgIG1lbW9yeV8xID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIG1lbW9yeV8yLCBudWxscHRyKTsKKyAgICBtZW1vcnlfMiA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpEZXN0cm95QnVmZmVyKGRldmljZSgpLCBidWZmZXIsIG51bGxwdHIpOworICAgIGJ1ZmZlciA9IFZLX05VTExfSEFORExFOworCisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXI7CisgICAgc3RkOjpzdHJpbmcgY29tbWFuZEJ1ZmZlcl9uYW1lID0gImNvbW1hbmRfYnVmZmVyX25hbWUiOworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZHBvb2xfMTsKKyAgICBWa0NvbW1hbmRQb29sIGNvbW1hbmRwb29sXzI7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gcG9vbF9jcmVhdGVfaW5mb3t9OworICAgIHBvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk87CisgICAgcG9vbF9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIHBvb2xfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICB2azo6Q3JlYXRlQ29tbWFuZFBvb2woZGV2aWNlKCksICZwb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY29tbWFuZHBvb2xfMSk7CisgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKGRldmljZSgpLCAmcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmNvbW1hbmRwb29sXzIpOworCisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm97fTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRQb29sID0gY29tbWFuZHBvb2xfMTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlk7CisgICAgdms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoZGV2aWNlKCksICZjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLCAmY29tbWFuZEJ1ZmZlcik7CisKKyAgICBuYW1lX2luZm8ub2JqZWN0ID0gKHVpbnQ2NF90KWNvbW1hbmRCdWZmZXI7CisgICAgbmFtZV9pbmZvLm9iamVjdFR5cGUgPSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUOworICAgIG5hbWVfaW5mby5wT2JqZWN0TmFtZSA9IGNvbW1hbmRCdWZmZXJfbmFtZS5jX3N0cigpOworICAgIGZwdmtEZWJ1Z01hcmtlclNldE9iamVjdE5hbWVFWFQoZGV2aWNlKCksICZuYW1lX2luZm8pOworCisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNiX2JlZ2luX0luZm8gPSB7fTsKKyAgICBjYl9iZWdpbl9JbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICBjYl9iZWdpbl9JbmZvLmZsYWdzID0gVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfT05FX1RJTUVfU1VCTUlUX0JJVDsKKyAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIsICZjYl9iZWdpbl9JbmZvKTsKKworICAgIGNvbnN0IFZrUmVjdDJEIHNjaXNzb3IgPSB7ey0xLCAwfSwgezE2LCAxNn19OworICAgIGNvbnN0IFZrUmVjdDJEIHNjaXNzb3JzW10gPSB7c2Npc3Nvciwgc2Npc3Nvcn07CisKKyAgICAvLyBUZXN0IHBhcmFtZXRlcl92YWxpZGF0aW9uIGxheWVyCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBjb21tYW5kQnVmZmVyX25hbWUpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKGNvbW1hbmRCdWZmZXIsIDEsIDEsIHNjaXNzb3JzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFRlc3Qgb2JqZWN0X3RyYWNrZXIgbGF5ZXIKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGNvbW1hbmRCdWZmZXJfbmFtZSk7CisgICAgdms6OkZyZWVDb21tYW5kQnVmZmVycyhkZXZpY2UoKSwgY29tbWFuZHBvb2xfMiwgMSwgJmNvbW1hbmRCdWZmZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lDb21tYW5kUG9vbChkZXZpY2UoKSwgY29tbWFuZHBvb2xfMSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lDb21tYW5kUG9vbChkZXZpY2UoKSwgY29tbWFuZHBvb2xfMiwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRGVidWdVdGlsc05hbWVUZXN0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiRW5zdXJlIGRlYnVnIHV0aWxzIG9iamVjdCBuYW1lcyBhcmUgcHJpbnRlZCBpbiBkZWJ1ZyBtZXNzZW5nZXIgb3V0cHV0Iik7CisKKyAgICAvLyBTa2lwIHRlc3QgaWYgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX0RFQlVHX1VUSUxTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERlYnVnIFV0aWxzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBQRk5fdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVCBmcHZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQgPQorICAgICAgICAoUEZOX3ZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQiKTsKKyAgICBBU1NFUlRfVFJVRShmcHZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQpOyAgLy8gTXVzdCBiZSBleHRhbnQgaWYgZXh0ZW5zaW9uIGlzIGVuYWJsZWQKKyAgICBQRk5fdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIGZwdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0KKyAgICAgICAgKFBGTl92a0NyZWF0ZURlYnVnVXRpbHNNZXNzZW5nZXJFWFQpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrQ3JlYXRlRGVidWdVdGlsc01lc3NlbmdlckVYVCIpOworICAgIEFTU0VSVF9UUlVFKGZwdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKTsgIC8vIE11c3QgYmUgZXh0YW50IGlmIGV4dGVuc2lvbiBpcyBlbmFibGVkCisgICAgUEZOX3ZrRGVzdHJveURlYnVnVXRpbHNNZXNzZW5nZXJFWFQgZnB2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUID0KKyAgICAgICAgKFBGTl92a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIik7CisgICAgQVNTRVJUX1RSVUUoZnB2a0Rlc3Ryb3lEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKTsgIC8vIE11c3QgYmUgZXh0YW50IGlmIGV4dGVuc2lvbiBpcyBlbmFibGVkCisgICAgUEZOX3ZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUIGZwdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQgPQorICAgICAgICAoUEZOX3ZrQ21kSW5zZXJ0RGVidWdVdGlsc0xhYmVsRVhUKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVCIpOworICAgIEFTU0VSVF9UUlVFKGZwdmtDbWRJbnNlcnREZWJ1Z1V0aWxzTGFiZWxFWFQpOyAgLy8gTXVzdCBiZSBleHRhbnQgaWYgZXh0ZW5zaW9uIGlzIGVuYWJsZWQKKworICAgIGlmIChEZXZpY2VTaW11bGF0aW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlc1NraXBwaW5nIG9iamVjdCBuYW1pbmcgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERlYnVnVXRpbHNMYWJlbENoZWNrRGF0YSBjYWxsYmFja19kYXRhOworICAgIGF1dG8gZW1wdHlfY2FsbGJhY2sgPSBbXShjb25zdCBWa0RlYnVnVXRpbHNNZXNzZW5nZXJDYWxsYmFja0RhdGFFWFQgKnBDYWxsYmFja0RhdGEsIERlYnVnVXRpbHNMYWJlbENoZWNrRGF0YSAqZGF0YSkgeworICAgICAgICBkYXRhLT5jb3VudCsrOworICAgIH07CisgICAgY2FsbGJhY2tfZGF0YS5jb3VudCA9IDA7CisgICAgY2FsbGJhY2tfZGF0YS5jYWxsYmFjayA9IGVtcHR5X2NhbGxiYWNrOworCisgICAgYXV0byBjYWxsYmFja19jcmVhdGVfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0RlYnVnVXRpbHNNZXNzZW5nZXJDcmVhdGVJbmZvRVhUPigpOworICAgIGNhbGxiYWNrX2NyZWF0ZV9pbmZvLm1lc3NhZ2VTZXZlcml0eSA9CisgICAgICAgIFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfRVJST1JfQklUX0VYVCB8IFZLX0RFQlVHX1VUSUxTX01FU1NBR0VfU0VWRVJJVFlfV0FSTklOR19CSVRfRVhUOworICAgIGNhbGxiYWNrX2NyZWF0ZV9pbmZvLm1lc3NhZ2VUeXBlID0gVktfREVCVUdfVVRJTFNfTUVTU0FHRV9UWVBFX1ZBTElEQVRJT05fQklUX0VYVDsKKyAgICBjYWxsYmFja19jcmVhdGVfaW5mby5wZm5Vc2VyQ2FsbGJhY2sgPSBEZWJ1Z1V0aWxzQ2FsbGJhY2s7CisgICAgY2FsbGJhY2tfY3JlYXRlX2luZm8ucFVzZXJEYXRhID0gJmNhbGxiYWNrX2RhdGE7CisgICAgVmtEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUIG15X21lc3NlbmdlciA9IFZLX05VTExfSEFORExFOworICAgIGZwdmtDcmVhdGVEZWJ1Z1V0aWxzTWVzc2VuZ2VyRVhUKGluc3RhbmNlKCksICZjYWxsYmFja19jcmVhdGVfaW5mbywgbnVsbHB0ciwgJm15X21lc3Nlbmdlcik7CisKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtEZXZpY2VNZW1vcnkgbWVtb3J5XzEsIG1lbW9yeV8yOworICAgIHN0ZDo6c3RyaW5nIG1lbW9yeV9uYW1lID0gIm1lbW9yeV9uYW1lIjsKKworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmZXJfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8uc2l6ZSA9IDE7CisKKyAgICB2azo6Q3JlYXRlQnVmZmVyKGRldmljZSgpLCAmYnVmZmVyX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYnVmZmVyKTsKKworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbVJlcXVpcmVtZW50czsKKyAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSgpLCBidWZmZXIsICZtZW1SZXF1aXJlbWVudHMpOworCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtb3J5X2FsbG9jYXRlX2luZm8gPSB7fTsKKyAgICBtZW1vcnlfYWxsb2NhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbW9yeV9hbGxvY2F0ZV9pbmZvLmFsbG9jYXRpb25TaXplID0gbWVtUmVxdWlyZW1lbnRzLnNpemU7CisgICAgbWVtb3J5X2FsbG9jYXRlX2luZm8ubWVtb3J5VHlwZUluZGV4ID0gMDsKKworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJm1lbW9yeV9hbGxvY2F0ZV9pbmZvLCBudWxscHRyLCAmbWVtb3J5XzEpOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJm1lbW9yeV9hbGxvY2F0ZV9pbmZvLCBudWxscHRyLCAmbWVtb3J5XzIpOworCisgICAgVmtEZWJ1Z1V0aWxzT2JqZWN0TmFtZUluZm9FWFQgbmFtZV9pbmZvID0ge307CisgICAgbmFtZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfVVRJTFNfT0JKRUNUX05BTUVfSU5GT19FWFQ7CisgICAgbmFtZV9pbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBuYW1lX2luZm8ub2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUlk7CisgICAgbmFtZV9pbmZvLnBPYmplY3ROYW1lID0gbWVtb3J5X25hbWUuY19zdHIoKTsKKworICAgIC8vIFBhc3MgaW4gYmFkIGhhbmRsZSBtYWtlIHN1cmUgT2JqZWN0VHJhY2tlciBjYXRjaGVzIGl0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0RlYnVnVXRpbHNPYmplY3ROYW1lSW5mb0VYVC1vYmplY3RUeXBlLTAyNTkwIik7CisgICAgbmFtZV9pbmZvLm9iamVjdEhhbmRsZSA9ICh1aW50NjRfdCkweGNhZGVjYWRlOworICAgIGZwdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UoKSwgJm5hbWVfaW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBQYXNzIGluICd1bmtub3duJyBvYmplY3QgdHlwZSBhbmQgc2VlIGlmIHBhcmFtZXRlciB2YWxpZGF0aW9uIGNhdGNoZXMgaXQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrRGVidWdVdGlsc09iamVjdE5hbWVJbmZvRVhULW9iamVjdFR5cGUtMDI1ODkiKTsKKyAgICBuYW1lX2luZm8ub2JqZWN0SGFuZGxlID0gKHVpbnQ2NF90KW1lbW9yeV8yOworICAgIG5hbWVfaW5mby5vYmplY3RUeXBlID0gVktfT0JKRUNUX1RZUEVfVU5LTk9XTjsKKyAgICBmcHZrU2V0RGVidWdVdGlsc09iamVjdE5hbWVFWFQoZGV2aWNlKCksICZuYW1lX2luZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbmFtZV9pbmZvLm9iamVjdFR5cGUgPSBWS19PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZOworICAgIGZwdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UoKSwgJm5hbWVfaW5mbyk7CisKKyAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShkZXZpY2UoKSwgYnVmZmVyLCBtZW1vcnlfMSwgMCk7CisKKyAgICAvLyBUZXN0IGNvcmVfdmFsaWRhdGlvbiBsYXllcgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgbWVtb3J5X25hbWUpOworICAgIHZrOjpCaW5kQnVmZmVyTWVtb3J5KGRldmljZSgpLCBidWZmZXIsIG1lbW9yeV8yLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBtZW1vcnlfMSwgbnVsbHB0cik7CisgICAgbWVtb3J5XzEgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgbWVtb3J5XzIsIG51bGxwdHIpOworICAgIG1lbW9yeV8yID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkRlc3Ryb3lCdWZmZXIoZGV2aWNlKCksIGJ1ZmZlciwgbnVsbHB0cik7CisgICAgYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcjsKKyAgICBzdGQ6OnN0cmluZyBjb21tYW5kQnVmZmVyX25hbWUgPSAiY29tbWFuZF9idWZmZXJfbmFtZSI7CisgICAgVmtDb21tYW5kUG9vbCBjb21tYW5kcG9vbF8xOworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZHBvb2xfMjsKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZve307CisgICAgcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisgICAgcG9vbF9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbChkZXZpY2UoKSwgJnBvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb21tYW5kcG9vbF8xKTsKKyAgICB2azo6Q3JlYXRlQ29tbWFuZFBvb2woZGV2aWNlKCksICZwb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY29tbWFuZHBvb2xfMik7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mb3t9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBjb21tYW5kcG9vbF8xOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhkZXZpY2UoKSwgJmNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8sICZjb21tYW5kQnVmZmVyKTsKKworICAgIG5hbWVfaW5mby5vYmplY3RIYW5kbGUgPSAodWludDY0X3QpY29tbWFuZEJ1ZmZlcjsKKyAgICBuYW1lX2luZm8ub2JqZWN0VHlwZSA9IFZLX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSOworICAgIG5hbWVfaW5mby5wT2JqZWN0TmFtZSA9IGNvbW1hbmRCdWZmZXJfbmFtZS5jX3N0cigpOworICAgIGZwdmtTZXREZWJ1Z1V0aWxzT2JqZWN0TmFtZUVYVChkZXZpY2UoKSwgJm5hbWVfaW5mbyk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY2JfYmVnaW5fSW5mbyA9IHt9OworICAgIGNiX2JlZ2luX0luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIGNiX2JlZ2luX0luZm8uZmxhZ3MgPSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlciwgJmNiX2JlZ2luX0luZm8pOworCisgICAgY29uc3QgVmtSZWN0MkQgc2Npc3NvciA9IHt7LTEsIDB9LCB7MTYsIDE2fX07CisgICAgY29uc3QgVmtSZWN0MkQgc2Npc3NvcnNbXSA9IHtzY2lzc29yLCBzY2lzc29yfTsKKworICAgIGF1dG8gY29tbWFuZF9sYWJlbCA9IGx2bF9pbml0X3N0cnVjdDxWa0RlYnVnVXRpbHNMYWJlbEVYVD4oKTsKKyAgICBjb21tYW5kX2xhYmVsLnBMYWJlbE5hbWUgPSAiQ29tbWFuZCBMYWJlbCAwMTIzIjsKKyAgICBjb21tYW5kX2xhYmVsLmNvbG9yWzBdID0gMC47CisgICAgY29tbWFuZF9sYWJlbC5jb2xvclsxXSA9IDEuOworICAgIGNvbW1hbmRfbGFiZWwuY29sb3JbMl0gPSAyLjsKKyAgICBjb21tYW5kX2xhYmVsLmNvbG9yWzNdID0gMy4wOworICAgIGJvb2wgY29tbWFuZF9sYWJlbF90ZXN0ID0gZmFsc2U7CisgICAgYXV0byBjb21tYW5kX2xhYmVsX2NhbGxiYWNrID0gW2NvbW1hbmRfbGFiZWwsICZjb21tYW5kX2xhYmVsX3Rlc3RdKGNvbnN0IFZrRGVidWdVdGlsc01lc3NlbmdlckNhbGxiYWNrRGF0YUVYVCAqcENhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdVdGlsc0xhYmVsQ2hlY2tEYXRhICpkYXRhKSB7CisgICAgICAgIGRhdGEtPmNvdW50Kys7CisgICAgICAgIGNvbW1hbmRfbGFiZWxfdGVzdCA9IGZhbHNlOworICAgICAgICBpZiAocENhbGxiYWNrRGF0YS0+Y21kQnVmTGFiZWxDb3VudCA9PSAxKSB7CisgICAgICAgICAgICBjb21tYW5kX2xhYmVsX3Rlc3QgPSBwQ2FsbGJhY2tEYXRhLT5wQ21kQnVmTGFiZWxzWzBdID09IGNvbW1hbmRfbGFiZWw7CisgICAgICAgIH0KKyAgICB9OworICAgIGNhbGxiYWNrX2RhdGEuY2FsbGJhY2sgPSBjb21tYW5kX2xhYmVsX2NhbGxiYWNrOworCisgICAgZnB2a0NtZEluc2VydERlYnVnVXRpbHNMYWJlbEVYVChjb21tYW5kQnVmZmVyLCAmY29tbWFuZF9sYWJlbCk7CisgICAgLy8gVGVzdCBwYXJhbWV0ZXJfdmFsaWRhdGlvbiBsYXllcgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgY29tbWFuZEJ1ZmZlcl9uYW1lKTsKKyAgICB2azo6Q21kU2V0U2Npc3Nvcihjb21tYW5kQnVmZmVyLCAxLCAxLCBzY2lzc29ycyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDaGVjayB0aGUgbGFiZWwgdGVzdAorICAgIGlmICghY29tbWFuZF9sYWJlbF90ZXN0KSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkNvbW1hbmQgbGFiZWwgJyIgPDwgY29tbWFuZF9sYWJlbC5wTGFiZWxOYW1lIDw8ICInIG5vdCBwYXNzZWQgdG8gY2FsbGJhY2suIjsKKyAgICB9CisKKyAgICAvLyBUZXN0IG9iamVjdF90cmFja2VyIGxheWVyCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBjb21tYW5kQnVmZmVyX25hbWUpOworICAgIHZrOjpGcmVlQ29tbWFuZEJ1ZmZlcnMoZGV2aWNlKCksIGNvbW1hbmRwb29sXzIsIDEsICZjb21tYW5kQnVmZmVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2woZGV2aWNlKCksIGNvbW1hbmRwb29sXzEsIE5VTEwpOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2woZGV2aWNlKCksIGNvbW1hbmRwb29sXzIsIE5VTEwpOworICAgIGZwdmtEZXN0cm95RGVidWdVdGlsc01lc3NlbmdlckVYVChpbnN0YW5jZSgpLCBteV9tZXNzZW5nZXIsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRTdHJ1Y3RTVHlwZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlNwZWNpZnkgYW4gaW52YWxpZCBWa1N0cnVjdHVyZVR5cGUgZm9yIGEgVnVsa2FuIHN0cnVjdHVyZSdzIHNUeXBlIGZpZWxkIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAicGFyYW1ldGVyIHBBbGxvY2F0ZUluZm8tPnNUeXBlIG11c3QgYmUiKTsKKyAgICAvLyBaZXJvIHN0cnVjdCBtZW1vcnksIGVmZmVjdGl2ZWx5IHNldHRpbmcgc1R5cGUgdG8KKyAgICAvLyBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPCisgICAgLy8gRXhwZWN0ZWQgdG8gdHJpZ2dlciBhbiBlcnJvciB3aXRoCisgICAgLy8gcGFyYW1ldGVyX3ZhbGlkYXRpb246OnZhbGlkYXRlX3N0cnVjdF90eXBlCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZtZW1vcnkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAicGFyYW1ldGVyIHBTdWJtaXRzWzBdLnNUeXBlIG11c3QgYmUiKTsKKyAgICAvLyBaZXJvIHN0cnVjdCBtZW1vcnksIGVmZmVjdGl2ZWx5IHNldHRpbmcgc1R5cGUgdG8KKyAgICAvLyBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPCisgICAgLy8gRXhwZWN0ZWQgdG8gdHJpZ2dlciBhbiBlcnJvciB3aXRoCisgICAgLy8gcGFyYW1ldGVyX3ZhbGlkYXRpb246OnZhbGlkYXRlX3N0cnVjdF90eXBlX2FycmF5CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkU3RydWN0UE5leHQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJTcGVjaWZ5IGFuIGludmFsaWQgdmFsdWUgZm9yIGEgVnVsa2FuIHN0cnVjdHVyZSdzIHBOZXh0IGZpZWxkIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsICJ2YWx1ZSBvZiBwQ3JlYXRlSW5mby0+cE5leHQgbXVzdCBiZSBOVUxMIik7CisgICAgLy8gU2V0IFZrTWVtb3J5QWxsb2NhdGVJbmZvOjpwTmV4dCB0byBhIG5vbi1OVUxMIHZhbHVlLCB3aGVuIHBOZXh0IG11c3QgYmUgTlVMTC4KKyAgICAvLyBOZWVkIHRvIHBpY2sgYSBmdW5jdGlvbiB0aGF0IGhhcyBubyBhbGxvd2VkIHBOZXh0IHN0cnVjdHVyZSB0eXBlcy4KKyAgICAvLyBFeHBlY3RlZCB0byB0cmlnZ2VyIGFuIGVycm9yIHdpdGggcGFyYW1ldGVyX3ZhbGlkYXRpb246OnZhbGlkYXRlX3N0cnVjdF9wbmV4dAorICAgIFZrRXZlbnQgZXZlbnQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0V2ZW50Q3JlYXRlSW5mbyBldmVudF9hbGxvY19pbmZvID0ge307CisgICAgLy8gWmVyby1pbml0aWFsaXphdGlvbiB3aWxsIHByb3ZpZGUgdGhlIGNvcnJlY3Qgc1R5cGUKKyAgICBWa0FwcGxpY2F0aW9uSW5mbyBhcHBfaW5mbyA9IHt9OworICAgIGV2ZW50X2FsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTzsKKyAgICBldmVudF9hbGxvY19pbmZvLnBOZXh0ID0gJmFwcF9pbmZvOworICAgIHZrOjpDcmVhdGVFdmVudChkZXZpY2UoKSwgJmV2ZW50X2FsbG9jX2luZm8sIE5VTEwsICZldmVudCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjaGFpbiBpbmNsdWRlcyBhIHN0cnVjdHVyZSB3aXRoIHVuZXhwZWN0ZWQgVmtTdHJ1Y3R1cmVUeXBlICIpOworICAgIC8vIFNldCBWa01lbW9yeUFsbG9jYXRlSW5mbzo6cE5leHQgdG8gYSBub24tTlVMTCB2YWx1ZSwgYnV0IHVzZQorICAgIC8vIGEgZnVuY3Rpb24gdGhhdCBoYXMgYWxsb3dlZCBwTmV4dCBzdHJ1Y3R1cmUgdHlwZXMgYW5kIHNwZWNpZnkKKyAgICAvLyBhIHN0cnVjdHVyZSB0eXBlIHRoYXQgaXMgbm90IGFsbG93ZWQuCisgICAgLy8gRXhwZWN0ZWQgdG8gdHJpZ2dlciBhbiBlcnJvciB3aXRoIHBhcmFtZXRlcl92YWxpZGF0aW9uOjp2YWxpZGF0ZV9zdHJ1Y3RfcG5leHQKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnkgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1vcnlfYWxsb2NfaW5mbyA9IHt9OworICAgIG1lbW9yeV9hbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtb3J5X2FsbG9jX2luZm8ucE5leHQgPSAmYXBwX2luZm87CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmbWVtb3J5X2FsbG9jX2luZm8sIE5VTEwsICZtZW1vcnkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFVucmVjb2duaXplZFZhbHVlT3V0T2ZSYW5nZSkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2VzIG5vdCBmYWxsIHdpdGhpbiB0aGUgYmVnaW4uLmVuZCByYW5nZSBvZiB0aGUgY29yZSBWa0Zvcm1hdCBlbnVtZXJhdGlvbiB0b2tlbnMiKTsKKyAgICAvLyBTcGVjaWZ5IGFuIGludmFsaWQgVmtGb3JtYXQgdmFsdWUKKyAgICAvLyBFeHBlY3RlZCB0byB0cmlnZ2VyIGFuIGVycm9yIHdpdGgKKyAgICAvLyBwYXJhbWV0ZXJfdmFsaWRhdGlvbjo6dmFsaWRhdGVfcmFuZ2VkX2VudW0KKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BlcnRpZXM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhncHUoKSwgc3RhdGljX2Nhc3Q8VmtGb3JtYXQ+KDgwMDApLCAmZm9ybWF0X3Byb3BlcnRpZXMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFVucmVjb2duaXplZFZhbHVlQmFkTWFzaykgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJjb250YWlucyBmbGFnIGJpdHMgdGhhdCBhcmUgbm90IHJlY29nbml6ZWQgbWVtYmVycyBvZiIpOworICAgIC8vIFNwZWNpZnkgYW4gaW52YWxpZCBWa0ZsYWdzIGJpdG1hc2sgdmFsdWUKKyAgICAvLyBFeHBlY3RlZCB0byB0cmlnZ2VyIGFuIGVycm9yIHdpdGggcGFyYW1ldGVyX3ZhbGlkYXRpb246OnZhbGlkYXRlX2ZsYWdzCisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgaW1hZ2VfZm9ybWF0X3Byb3BlcnRpZXM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKGdwdSgpLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX0lNQUdFX1RZUEVfMkQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWa0ltYWdlVXNhZ2VGbGFncz4oMSA8PCAyNSksIDAsICZpbWFnZV9mb3JtYXRfcHJvcGVydGllcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVW5yZWNvZ25pemVkVmFsdWVCYWRGbGFnKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgImNvbnRhaW5zIGZsYWcgYml0cyB0aGF0IGFyZSBub3QgcmVjb2duaXplZCBtZW1iZXJzIG9mIik7CisgICAgLy8gU3BlY2lmeSBhbiBpbnZhbGlkIFZrRmxhZ3MgYXJyYXkgZW50cnkKKyAgICAvLyBFeHBlY3RlZCB0byB0cmlnZ2VyIGFuIGVycm9yIHdpdGggcGFyYW1ldGVyX3ZhbGlkYXRpb246OnZhbGlkYXRlX2ZsYWdzX2FycmF5CisgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBzZW1hcGhvcmVfY3JlYXRlX2luZm97fTsKKyAgICBzZW1hcGhvcmVfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk87CisgICAgdms6OkNyZWF0ZVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksICZzZW1hcGhvcmVfY3JlYXRlX2luZm8sIG51bGxwdHIsICZzZW1hcGhvcmUpOworICAgIC8vIGBzdGFnZV9mbGFnc2AgaXMgc2V0IHRvIGEgdmFsdWUgd2hpY2gsIGN1cnJlbnRseSwgaXMgbm90IGEgZGVmaW5lZCBzdGFnZSBmbGFnCisgICAgLy8gYFZLX0lNQUdFX0FTUEVDVF9GTEFHX0JJVFNfTUFYX0VOVU1gIHdvcmtzIHdlbGwgZm9yIHRoaXMKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZV9mbGFncyA9IFZLX0lNQUdFX0FTUEVDVF9GTEFHX0JJVFNfTUFYX0VOVU07CisgICAgLy8gYHdhaXRTZW1hcGhvcmVDb3VudGAgKm11c3QqIGJlIGdyZWF0ZXIgdGhhbiAwIHRvIHBlcmZvcm0gdGhpcyBjaGVjaworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gJnN0YWdlX2ZsYWdzOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzZW1hcGhvcmUsIG51bGxwdHIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVW5yZWNvZ25pemVkVmFsdWVCYWRCb29sKSB7CisgICAgLy8gTWFrZSBzdXJlIHVzaW5nIFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFIGRvZXNuJ3QgdHJpZ2dlciBhIGZhbHNlIHBvc2l0aXZlLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9TQU1QTEVSX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TQU1QTEVSX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFZLX0tIUl9zYW1wbGVyX21pcnJvcl9jbGFtcF90b19lZGdlIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgLy8gU3BlY2lmeSBhbiBpbnZhbGlkIFZrQm9vbDMyIHZhbHVlLCBleHBlY3RpbmcgYSB3YXJuaW5nIHdpdGggcGFyYW1ldGVyX3ZhbGlkYXRpb246OnZhbGlkYXRlX2Jvb2wzMgorICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9pbmZvID0gU2FmZVNhbmVTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgIHNhbXBsZXJfaW5mby5hZGRyZXNzTW9kZVUgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRTsKKyAgICBzYW1wbGVyX2luZm8uYWRkcmVzc01vZGVWID0gVktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SX0NMQU1QX1RPX0VER0U7CisgICAgc2FtcGxlcl9pbmZvLmFkZHJlc3NNb2RlVyA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX01JUlJPUl9DTEFNUF9UT19FREdFOworCisgICAgLy8gTm90IFZLX1RSVUUgb3IgVktfRkFMU0UKKyAgICBzYW1wbGVyX2luZm8uYW5pc290cm9weUVuYWJsZSA9IDM7CisgICAgQ3JlYXRlU2FtcGxlclRlc3QoKnRoaXMsICZzYW1wbGVyX2luZm8sICJpcyBuZWl0aGVyIFZLX1RSVUUgbm9yIFZLX0ZBTFNFIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVW5yZWNvZ25pemVkVmFsdWVNYXhFbnVtKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIFNwZWNpZnkgTUFYX0VOVU0KKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BlcnRpZXM7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiZG9lcyBub3QgZmFsbCB3aXRoaW4gdGhlIGJlZ2luLi5lbmQgcmFuZ2UiKTsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKGdwdSgpLCBWS19GT1JNQVRfTUFYX0VOVU0sICZmb3JtYXRfcHJvcGVydGllcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU3VibWl0U2lnbmFsZWRGZW5jZSkgeworICAgIHZrX3Rlc3Rpbmc6OkZlbmNlIHRlc3RGZW5jZTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Ym1pdHRlZCBpbiBTSUdOQUxFRCBzdGF0ZS4gIEZlbmNlcyBtdXN0IGJlIHJlc2V0IGJlZm9yZSBiZWluZyBzdWJtaXR0ZWQiKTsKKworICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZlbmNlSW5mbyA9IHt9OworICAgIGZlbmNlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPOworICAgIGZlbmNlSW5mby5wTmV4dCA9IE5VTEw7CisgICAgZmVuY2VJbmZvLmZsYWdzID0gVktfRkVOQ0VfQ1JFQVRFX1NJR05BTEVEX0JJVDsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5DbGVhckFsbEJ1ZmZlcnMobV9yZW5kZXJUYXJnZXRzLCBtX2NsZWFyX2NvbG9yLCBudWxscHRyLCBtX2RlcHRoX2NsZWFyX2NvbG9yLCBtX3N0ZW5jaWxfY2xlYXJfY29sb3IpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICB0ZXN0RmVuY2UuaW5pdCgqbV9kZXZpY2UsIGZlbmNlSW5mbyk7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm87CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZXMgPSBOVUxMOworICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gTlVMTDsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEw7CisKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgdGVzdEZlbmNlLmhhbmRsZSgpKTsKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBMZWFrQW5PYmplY3QpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYSBmZW5jZSBhbmQgZGVzdHJveSBpdHMgZGV2aWNlIHdpdGhvdXQgZmlyc3QgZGVzdHJveWluZyB0aGUgZmVuY2UuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIC8vIFdvcmthcm91bmQgZm9yIG92ZXJ6ZWFsb3VzIGxheWVycyBjaGVja2luZyBldmVuIHRoZSBndWFyYW50ZWVkIDB0aCBxdWV1ZSBmYW1pbHkKKyAgICBjb25zdCBhdXRvIHFfcHJvcHMgPSB2a190ZXN0aW5nOjpQaHlzaWNhbERldmljZShncHUoKSkucXVldWVfcHJvcGVydGllcygpOworICAgIEFTU0VSVF9UUlVFKHFfcHJvcHMuc2l6ZSgpID4gMCk7CisgICAgQVNTRVJUX1RSVUUocV9wcm9wc1swXS5xdWV1ZUNvdW50ID4gMCk7CisKKyAgICBjb25zdCBmbG9hdCBxX3ByaW9yaXR5W10gPSB7MS4wZn07CisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gcXVldWVfY2kgPSB7fTsKKyAgICBxdWV1ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTzsKKyAgICBxdWV1ZV9jaS5xdWV1ZUZhbWlseUluZGV4ID0gMDsKKyAgICBxdWV1ZV9jaS5xdWV1ZUNvdW50ID0gMTsKKyAgICBxdWV1ZV9jaS5wUXVldWVQcmlvcml0aWVzID0gcV9wcmlvcml0eTsKKworICAgIFZrRGV2aWNlQ3JlYXRlSW5mbyBkZXZpY2VfY2kgPSB7fTsKKyAgICBkZXZpY2VfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk87CisgICAgZGV2aWNlX2NpLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMTsKKyAgICBkZXZpY2VfY2kucFF1ZXVlQ3JlYXRlSW5mb3MgPSAmcXVldWVfY2k7CisKKyAgICBWa0RldmljZSBsZWFreV9kZXZpY2U7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkNyZWF0ZURldmljZShncHUoKSwgJmRldmljZV9jaSwgbnVsbHB0ciwgJmxlYWt5X2RldmljZSkpOworCisgICAgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8gZmVuY2VfY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk99OworICAgIFZrRmVuY2UgbGVha2VkX2ZlbmNlOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpDcmVhdGVGZW5jZShsZWFreV9kZXZpY2UsICZmZW5jZV9jaSwgbnVsbHB0ciwgJmxlYWtlZF9mZW5jZSkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0Rlc3Ryb3lEZXZpY2UtZGV2aWNlLTAwMzc4Iik7CisgICAgdms6OkRlc3Ryb3lEZXZpY2UobGVha3lfZGV2aWNlLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBVc2VPYmplY3RXaXRoV3JvbmdEZXZpY2UpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVHJ5IHRvIGRlc3Ryb3kgYSByZW5kZXIgcGFzcyBvYmplY3QgdXNpbmcgYSBkZXZpY2Ugb3RoZXIgdGhhbiB0aGUgb25lIGl0IHdhcyBjcmVhdGVkIG9uLiBUaGlzIHNob3VsZCBnZW5lcmF0ZSBhIGRpc3RpbmN0ICIKKyAgICAgICAgImVycm9yIGZyb20gdGhlIGludmFsaWQgaGFuZGxlIGVycm9yLiIpOworICAgIC8vIENyZWF0ZSBmaXJzdCBkZXZpY2UgYW5kIHJlbmRlcnBhc3MKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBDcmVhdGUgc2Vjb25kIGRldmljZQorICAgIGZsb2F0IHByaW9yaXRpZXNbXSA9IHsxLjBmfTsKKyAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBxdWV1ZV9pbmZve307CisgICAgcXVldWVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTzsKKyAgICBxdWV1ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBxdWV1ZV9pbmZvLmZsYWdzID0gMDsKKyAgICBxdWV1ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSAwOworICAgIHF1ZXVlX2luZm8ucXVldWVDb3VudCA9IDE7CisgICAgcXVldWVfaW5mby5wUXVldWVQcmlvcml0aWVzID0gJnByaW9yaXRpZXNbMF07CisKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gZGV2aWNlX2NyZWF0ZV9pbmZvID0ge307CisgICAgYXV0byBmZWF0dXJlcyA9IG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworICAgIGRldmljZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTzsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGRldmljZV9jcmVhdGVfaW5mby5xdWV1ZUNyZWF0ZUluZm9Db3VudCA9IDE7CisgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBRdWV1ZUNyZWF0ZUluZm9zID0gJnF1ZXVlX2luZm87CisgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLmVuYWJsZWRMYXllckNvdW50ID0gMDsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucHBFbmFibGVkTGF5ZXJOYW1lcyA9IE5VTEw7CisgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBFbmFibGVkRmVhdHVyZXMgPSAmZmVhdHVyZXM7CisKKyAgICBWa0RldmljZSBzZWNvbmRfZGV2aWNlOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpDcmVhdGVEZXZpY2UoZ3B1KCksICZkZXZpY2VfY3JlYXRlX2luZm8sIE5VTEwsICZzZWNvbmRfZGV2aWNlKSk7CisKKyAgICAvLyBUcnkgdG8gZGVzdHJveSB0aGUgcmVuZGVycGFzcyBmcm9tIHRoZSBmaXJzdCBkZXZpY2UgdXNpbmcgdGhlIHNlY29uZCBkZXZpY2UKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRGVzdHJveVJlbmRlclBhc3MtcmVuZGVyUGFzcy1wYXJlbnQiKTsKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3Moc2Vjb25kX2RldmljZSwgbV9yZW5kZXJQYXNzLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95RGV2aWNlKHNlY29uZF9kZXZpY2UsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRBbGxvY2F0aW9uQ2FsbGJhY2tzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB3aXRoIGludmFsaWQgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gdms6OkNyZWF0ZUluc3RhbmNlLCBhbmQgdms6OkNyZWF0ZURldmljZSB0ZW5kIHRvIGNyYXNoIGluIHRoZSBMb2FkZXIgVHJhbXBvbGluZSBBVE0sIHNvIGNob29zaW5nIHZrOjpDcmVhdGVDb21tYW5kUG9vbAorICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIGNwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlT2JqKCktPlF1ZXVlRmFtaWx5TWF0Y2hpbmcoMCwgMCwgdHJ1ZSl9OworICAgIFZrQ29tbWFuZFBvb2wgY21kUG9vbDsKKworICAgIHN0cnVjdCBBbGxvYyB7CisgICAgICAgIHN0YXRpYyBWS0FQSV9BVFRSIHZvaWQgKlZLQVBJX0NBTEwgYWxsb2Modm9pZCAqLCBzaXplX3QsIHNpemVfdCwgVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUpIHsgcmV0dXJuIG51bGxwdHI7IH07CisgICAgICAgIHN0YXRpYyBWS0FQSV9BVFRSIHZvaWQgKlZLQVBJX0NBTEwgcmVhbGxvYyh2b2lkICosIHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlKSB7IHJldHVybiBudWxscHRyOyB9OworICAgICAgICBzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZnJlZSh2b2lkICosIHZvaWQgKil7fTsKKyAgICAgICAgc3RhdGljIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIGludGVybmFsQWxsb2Modm9pZCAqLCBzaXplX3QsIFZrSW50ZXJuYWxBbGxvY2F0aW9uVHlwZSwgVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUpe307CisgICAgICAgIHN0YXRpYyBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBpbnRlcm5hbEZyZWUodm9pZCAqLCBzaXplX3QsIFZrSW50ZXJuYWxBbGxvY2F0aW9uVHlwZSwgVmtTeXN0ZW1BbGxvY2F0aW9uU2NvcGUpe307CisgICAgfTsKKworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuQWxsb2NhdGlvbi0wMDYzMiIpOworICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgYWxsb2NhdG9yID0ge251bGxwdHIsIG51bGxwdHIsIEFsbG9jOjpyZWFsbG9jLCBBbGxvYzo6ZnJlZSwgbnVsbHB0ciwgbnVsbHB0cn07CisgICAgICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbChkZXZpY2UoKSwgJmNwY2ksICZhbGxvY2F0b3IsICZjbWRQb29sKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5SZWFsbG9jYXRpb24tMDA2MzMiKTsKKyAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIGFsbG9jYXRvciA9IHtudWxscHRyLCBBbGxvYzo6YWxsb2MsIG51bGxwdHIsIEFsbG9jOjpmcmVlLCBudWxscHRyLCBudWxscHRyfTsKKyAgICAgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKGRldmljZSgpLCAmY3BjaSwgJmFsbG9jYXRvciwgJmNtZFBvb2wpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtBbGxvY2F0aW9uQ2FsbGJhY2tzLXBmbkZyZWUtMDA2MzQiKTsKKyAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIGFsbG9jYXRvciA9IHtudWxscHRyLCBBbGxvYzo6YWxsb2MsIEFsbG9jOjpyZWFsbG9jLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyfTsKKyAgICAgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKGRldmljZSgpLCAmY3BjaSwgJmFsbG9jYXRvciwgJmNtZFBvb2wpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQWxsb2NhdGlvbkNhbGxiYWNrcy1wZm5JbnRlcm5hbEFsbG9jYXRpb24tMDA2MzUiKTsKKyAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzIGFsbG9jYXRvciA9IHtudWxscHRyLCBBbGxvYzo6YWxsb2MsIEFsbG9jOjpyZWFsbG9jLCBBbGxvYzo6ZnJlZSwgbnVsbHB0ciwgQWxsb2M6OmludGVybmFsRnJlZX07CisgICAgICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbChkZXZpY2UoKSwgJmNwY2ksICZhbGxvY2F0b3IsICZjbWRQb29sKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0FsbG9jYXRpb25DYWxsYmFja3MtcGZuSW50ZXJuYWxBbGxvY2F0aW9uLTAwNjM1Iik7CisgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY2F0b3IgPSB7bnVsbHB0ciwgQWxsb2M6OmFsbG9jLCBBbGxvYzo6cmVhbGxvYywgQWxsb2M6OmZyZWUsIEFsbG9jOjppbnRlcm5hbEFsbG9jLCBudWxscHRyfTsKKyAgICAgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKGRldmljZSgpLCAmY3BjaSwgJmFsbG9jYXRvciwgJmNtZFBvb2wpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgTWlzbWF0Y2hlZFF1ZXVlRmFtaWxpZXNPblN1Ym1pdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJTdWJtaXQgY29tbWFuZCBidWZmZXIgY3JlYXRlZCB1c2luZyBvbmUgcXVldWUgZmFtaWx5IGFuZCBhdHRlbXB0IHRvIHN1Ym1pdCB0aGVtIG9uIGEgcXVldWUgY3JlYXRlZCBpbiBhIGRpZmZlcmVudCBxdWV1ZSAiCisgICAgICAgICJmYW1pbHkuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOyAgLy8gYXNzdW1lcyBpdCBpbml0aWFsaXplcyBhbGwgcXVldWUgZmFtaWxpZXMgb24gdms6OkNyZWF0ZURldmljZQorCisgICAgLy8gVGhpcyB0ZXN0IGlzIG1lYW5pbmdsZXNzIHVubGVzcyB3ZSBoYXZlIG11bHRpcGxlIHF1ZXVlIGZhbWlsaWVzCisgICAgYXV0byBxdWV1ZV9mYW1pbHlfcHJvcGVydGllcyA9IG1fZGV2aWNlLT5waHkoKS5xdWV1ZV9wcm9wZXJ0aWVzKCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHF1ZXVlX2ZhbWlsaWVzOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBxdWV1ZV9mYW1pbHlfcHJvcGVydGllcy5zaXplKCk7ICsraSkKKyAgICAgICAgaWYgKHF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzW2ldLnF1ZXVlQ291bnQgPiAwKSBxdWV1ZV9mYW1pbGllcy5wdXNoX2JhY2soaSk7CisKKyAgICBpZiAocXVldWVfZmFtaWxpZXMuc2l6ZSgpIDwgMikgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBvbmx5IGhhcyBvbmUgcXVldWUgZmFtaWx5OyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDMyX3QgcXVldWVfZmFtaWx5ID0gcXVldWVfZmFtaWxpZXNbMF07CisKKyAgICBjb25zdCB1aW50MzJfdCBvdGhlcl9xdWV1ZV9mYW1pbHkgPSBxdWV1ZV9mYW1pbGllc1sxXTsKKyAgICBWa1F1ZXVlIG90aGVyX3F1ZXVlOworICAgIHZrOjpHZXREZXZpY2VRdWV1ZShtX2RldmljZS0+ZGV2aWNlKCksIG90aGVyX3F1ZXVlX2ZhbWlseSwgMCwgJm90aGVyX3F1ZXVlKTsKKworICAgIFZrQ29tbWFuZFBvb2xPYmogY21kX3Bvb2wobV9kZXZpY2UsIHF1ZXVlX2ZhbWlseSk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNtZF9idWZmKG1fZGV2aWNlLCAmY21kX3Bvb2wpOworCisgICAgY21kX2J1ZmYuYmVnaW4oKTsKKyAgICBjbWRfYnVmZi5lbmQoKTsKKworICAgIC8vIFN1Ym1pdCBvbiB0aGUgd3JvbmcgcXVldWUKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNtZF9idWZmLmhhbmRsZSgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a1F1ZXVlU3VibWl0LXBDb21tYW5kQnVmZmVycy0wMDA3NCIpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChvdGhlcl9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVGVtcG9yYXJ5RXh0ZXJuYWxTZW1hcGhvcmUpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICBjb25zdCBhdXRvIGV4dGVuc2lvbl9uYW1lID0gVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9XSU4zMl9FWFRFTlNJT05fTkFNRTsKKyAgICBjb25zdCBhdXRvIGhhbmRsZV90eXBlID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9LTVRfQklUX0tIUjsKKyNlbHNlCisgICAgY29uc3QgYXV0byBleHRlbnNpb25fbmFtZSA9IFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRkRfRVhURU5TSU9OX05BTUU7CisgICAgY29uc3QgYXV0byBoYW5kbGVfdHlwZSA9IFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUjsKKyNlbmRpZgorICAgIC8vIENoZWNrIGZvciBleHRlcm5hbCBzZW1hcGhvcmUgaW5zdGFuY2UgZXh0ZW5zaW9ucworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlcm5hbCBzZW1hcGhvcmUgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIC8vIENoZWNrIGZvciBleHRlcm5hbCBzZW1hcGhvcmUgZGV2aWNlIGV4dGVuc2lvbnMKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBleHRlbnNpb25fbmFtZSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhleHRlbnNpb25fbmFtZSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlcm5hbCBzZW1hcGhvcmUgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICAvLyBDaGVjayBmb3IgZXh0ZXJuYWwgc2VtYXBob3JlIGltcG9ydCBhbmQgZXhwb3J0IGNhcGFiaWxpdHkKKyAgICBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVJbmZvS0hSIGVzaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfU0VNQVBIT1JFX0lORk9fS0hSLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90eXBlfTsKKyAgICBWa0V4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiBlc3AgPSB7VktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVNfS0hSLCBudWxscHRyfTsKKyAgICBhdXRvIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoCisgICAgICAgICAgICBpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiIpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXNLSFIoZ3B1KCksICZlc2ksICZlc3ApOworCisgICAgaWYgKCEoZXNwLmV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXMgJiBWS19FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9LSFIpIHx8CisgICAgICAgICEoZXNwLmV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXMgJiBWS19FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVF9LSFIpKSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZXJuYWwgc2VtYXBob3JlIGRvZXMgbm90IHN1cHBvcnQgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrUmVzdWx0IGVycjsKKworICAgIC8vIENyZWF0ZSBhIHNlbWFwaG9yZSB0byBleHBvcnQgcGF5bG9hZCBmcm9tCisgICAgVmtFeHBvcnRTZW1hcGhvcmVDcmVhdGVJbmZvS0hSIGVzY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX1NFTUFQSE9SRV9DUkVBVEVfSU5GT19LSFIsIG51bGxwdHIsIGhhbmRsZV90eXBlfTsKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2NpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTywgJmVzY2ksIDB9OworCisgICAgVmtTZW1hcGhvcmUgZXhwb3J0X3NlbWFwaG9yZTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNjaSwgbnVsbHB0ciwgJmV4cG9ydF9zZW1hcGhvcmUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBDcmVhdGUgYSBzZW1hcGhvcmUgdG8gaW1wb3J0IHBheWxvYWQgaW50bworICAgIHNjaS5wTmV4dCA9IG51bGxwdHI7CisgICAgVmtTZW1hcGhvcmUgaW1wb3J0X3NlbWFwaG9yZTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNjaSwgbnVsbHB0ciwgJmltcG9ydF9zZW1hcGhvcmUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyNpZmRlZiBfV0lOMzIKKyAgICAvLyBFeHBvcnQgc2VtYXBob3JlIHBheWxvYWQgdG8gYW4gb3BhcXVlIGhhbmRsZQorICAgIEhBTkRMRSBoYW5kbGUgPSBudWxscHRyOworICAgIFZrU2VtYXBob3JlR2V0V2luMzJIYW5kbGVJbmZvS0hSIGdoaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfR0VUX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwgbnVsbHB0ciwgZXhwb3J0X3NlbWFwaG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3R5cGV9OworICAgIGF1dG8gdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiA9CisgICAgICAgIChQRk5fdmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtHZXRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUiIpOworICAgIGVyciA9IHZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmZ2hpLCAmaGFuZGxlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gSW1wb3J0IG9wYXF1ZSBoYW5kbGUgZXhwb3J0ZWQgYWJvdmUgKnRlbXBvcmFyaWx5KgorICAgIFZrSW1wb3J0U2VtYXBob3JlV2luMzJIYW5kbGVJbmZvS0hSIGloaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3NlbWFwaG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0VNQVBIT1JFX0lNUE9SVF9URU1QT1JBUllfQklUX0tIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisgICAgYXV0byB2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSID0KKyAgICAgICAgKFBGTl92a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIik7CisgICAgZXJyID0gdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihtX2RldmljZS0+ZGV2aWNlKCksICZpaGkpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisjZWxzZQorICAgIC8vIEV4cG9ydCBzZW1hcGhvcmUgcGF5bG9hZCB0byBhbiBvcGFxdWUgaGFuZGxlCisgICAgaW50IGZkID0gMDsKKyAgICBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiBnaGkgPSB7VktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9GRF9JTkZPX0tIUiwgbnVsbHB0ciwgZXhwb3J0X3NlbWFwaG9yZSwgaGFuZGxlX3R5cGV9OworICAgIGF1dG8gdmtHZXRTZW1hcGhvcmVGZEtIUiA9IChQRk5fdmtHZXRTZW1hcGhvcmVGZEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtHZXRTZW1hcGhvcmVGZEtIUiIpOworICAgIGVyciA9IHZrR2V0U2VtYXBob3JlRmRLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmZ2hpLCAmZmQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBJbXBvcnQgb3BhcXVlIGhhbmRsZSBleHBvcnRlZCBhYm92ZSAqdGVtcG9yYXJpbHkqCisgICAgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgaWhpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9TRU1BUEhPUkVfRkRfSU5GT19LSFIsIG51bGxwdHIsICAgICBpbXBvcnRfc2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TRU1BUEhPUkVfSU1QT1JUX1RFTVBPUkFSWV9CSVRfS0hSLCAgICAgICAgICBoYW5kbGVfdHlwZSwgZmR9OworICAgIGF1dG8gdmtJbXBvcnRTZW1hcGhvcmVGZEtIUiA9IChQRk5fdmtJbXBvcnRTZW1hcGhvcmVGZEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtJbXBvcnRTZW1hcGhvcmVGZEtIUiIpOworICAgIGVyciA9IHZrSW1wb3J0U2VtYXBob3JlRmRLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmaWhpKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworI2VuZGlmCisKKyAgICAvLyBXYWl0IG9uIHRoZSBpbXBvcnRlZCBzZW1hcGhvcmUgdHdpY2UgaW4gdms6OlF1ZXVlU3VibWl0LCB0aGUgc2Vjb25kIHdhaXQgc2hvdWxkIGJlIGFuIGVycm9yCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZmxhZ3MgPSBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQ7CisgICAgVmtTdWJtaXRJbmZvIHNpW10gPSB7CisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgbnVsbHB0ciwgMCwgbnVsbHB0ciwgJmZsYWdzLCAwLCBudWxscHRyLCAxLCAmZXhwb3J0X3NlbWFwaG9yZX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgbnVsbHB0ciwgMSwgJmltcG9ydF9zZW1hcGhvcmUsICZmbGFncywgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cn0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgbnVsbHB0ciwgMCwgbnVsbHB0ciwgJmZsYWdzLCAwLCBudWxscHRyLCAxLCAmZXhwb3J0X3NlbWFwaG9yZX0sCisgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgbnVsbHB0ciwgMSwgJmltcG9ydF9zZW1hcGhvcmUsICZmbGFncywgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cn0sCisgICAgfTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJoYXMgbm8gd2F5IHRvIGJlIHNpZ25hbGVkIik7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCA0LCBzaSwgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgYXV0byBpbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBpZiAobV9kZXZpY2UtPnF1ZXVlX3Byb3BzW2luZGV4XS5xdWV1ZUZsYWdzICYgVktfUVVFVUVfU1BBUlNFX0JJTkRJTkdfQklUKSB7CisgICAgICAgIC8vIFdhaXQgb24gdGhlIGltcG9ydGVkIHNlbWFwaG9yZSB0d2ljZSBpbiB2azo6UXVldWVCaW5kU3BhcnNlLCB0aGUgc2Vjb25kIHdhaXQgc2hvdWxkIGJlIGFuIGVycm9yCisgICAgICAgIFZrQmluZFNwYXJzZUluZm8gYmlbXSA9IHsKKyAgICAgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX1NQQVJTRV9JTkZPLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmZXhwb3J0X3NlbWFwaG9yZX0sCisgICAgICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfQklORF9TUEFSU0VfSU5GTywgbnVsbHB0ciwgMSwgJmltcG9ydF9zZW1hcGhvcmUsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgICAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk8sIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZleHBvcnRfc2VtYXBob3JlfSwKKyAgICAgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX1NQQVJTRV9JTkZPLCBudWxscHRyLCAxLCAmaW1wb3J0X3NlbWFwaG9yZSwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cn0sCisgICAgICAgIH07CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgImhhcyBubyB3YXkgdG8gYmUgc2lnbmFsZWQiKTsKKyAgICAgICAgdms6OlF1ZXVlQmluZFNwYXJzZShtX2RldmljZS0+bV9xdWV1ZSwgNCwgYmksIFZLX05VTExfSEFORExFKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gQ2xlYW51cAorICAgIGVyciA9IHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgZXhwb3J0X3NlbWFwaG9yZSwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBpbXBvcnRfc2VtYXBob3JlLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBUZW1wb3JhcnlFeHRlcm5hbEZlbmNlKSB7CisjaWZkZWYgX1dJTjMyCisgICAgY29uc3QgYXV0byBleHRlbnNpb25fbmFtZSA9IFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9XSU4zMl9FWFRFTlNJT05fTkFNRTsKKyAgICBjb25zdCBhdXRvIGhhbmRsZV90eXBlID0gVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFI7CisjZWxzZQorICAgIGNvbnN0IGF1dG8gZXh0ZW5zaW9uX25hbWUgPSBWS19LSFJfRVhURVJOQUxfRkVOQ0VfRkRfRVhURU5TSU9OX05BTUU7CisgICAgY29uc3QgYXV0byBoYW5kbGVfdHlwZSA9IFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVRfS0hSOworI2VuZGlmCisgICAgLy8gQ2hlY2sgZm9yIGV4dGVybmFsIGZlbmNlIGluc3RhbmNlIGV4dGVuc2lvbnMKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVybmFsIGZlbmNlIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICAvLyBDaGVjayBmb3IgZXh0ZXJuYWwgZmVuY2UgZGV2aWNlIGV4dGVuc2lvbnMKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBleHRlbnNpb25fbmFtZSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhleHRlbnNpb25fbmFtZSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVybmFsIGZlbmNlIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgLy8gQ2hlY2sgZm9yIGV4dGVybmFsIGZlbmNlIGltcG9ydCBhbmQgZXhwb3J0IGNhcGFiaWxpdHkKKyAgICBWa1BoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZUluZm9LSFIgZWZpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9GRU5DRV9JTkZPX0tIUiwgbnVsbHB0ciwgaGFuZGxlX3R5cGV9OworICAgIFZrRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIgZWZwID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZFTkNFX1BST1BFUlRJRVNfS0hSLCBudWxscHRyfTsKKyAgICBhdXRvIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKAorICAgICAgICBpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIik7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSKGdwdSgpLCAmZWZpLCAmZWZwKTsKKworICAgIGlmICghKGVmcC5leHRlcm5hbEZlbmNlRmVhdHVyZXMgJiBWS19FWFRFUk5BTF9GRU5DRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX0tIUikgfHwKKyAgICAgICAgIShlZnAuZXh0ZXJuYWxGZW5jZUZlYXR1cmVzICYgVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9JTVBPUlRBQkxFX0JJVF9LSFIpKSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZXJuYWwgZmVuY2UgZG9lcyBub3Qgc3VwcG9ydCBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZywgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtSZXN1bHQgZXJyOworCisgICAgLy8gQ3JlYXRlIGEgZmVuY2UgdG8gZXhwb3J0IHBheWxvYWQgZnJvbQorICAgIFZrRmVuY2UgZXhwb3J0X2ZlbmNlOworICAgIHsKKyAgICAgICAgVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm9LSFIgZWZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk9fS0hSLCBudWxscHRyLCBoYW5kbGVfdHlwZX07CisgICAgICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTywgJmVmY2ksIDB9OworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCAmZmNpLCBudWxscHRyLCAmZXhwb3J0X2ZlbmNlKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBmZW5jZSB0byBpbXBvcnQgcGF5bG9hZCBpbnRvCisgICAgVmtGZW5jZSBpbXBvcnRfZmVuY2U7CisgICAgeworICAgICAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDB9OworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCAmZmNpLCBudWxscHRyLCAmaW1wb3J0X2ZlbmNlKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyNpZmRlZiBfV0lOMzIKKyAgICAvLyBFeHBvcnQgZmVuY2UgcGF5bG9hZCB0byBhbiBvcGFxdWUgaGFuZGxlCisgICAgSEFORExFIGhhbmRsZSA9IG51bGxwdHI7CisgICAgeworICAgICAgICBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSIGdoaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSLCBudWxscHRyLCBleHBvcnRfZmVuY2UsIGhhbmRsZV90eXBlfTsKKyAgICAgICAgYXV0byB2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIgPQorICAgICAgICAgICAgKFBGTl92a0dldEZlbmNlV2luMzJIYW5kbGVLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIpOworICAgICAgICBlcnIgPSB2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmZ2hpLCAmaGFuZGxlKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyAgICAvLyBJbXBvcnQgb3BhcXVlIGhhbmRsZSBleHBvcnRlZCBhYm92ZQorICAgIHsKKyAgICAgICAgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBpZmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X2ZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVF9LSFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHJ9OworICAgICAgICBhdXRvIHZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiA9CisgICAgICAgICAgICAoUEZOX3ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIik7CisgICAgICAgIGVyciA9IHZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUihtX2RldmljZS0+ZGV2aWNlKCksICZpZmkpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIH0KKyNlbHNlCisgICAgLy8gRXhwb3J0IGZlbmNlIHBheWxvYWQgdG8gYW4gb3BhcXVlIGhhbmRsZQorICAgIGludCBmZCA9IDA7CisgICAgeworICAgICAgICBWa0ZlbmNlR2V0RmRJbmZvS0hSIGdmaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFIsIG51bGxwdHIsIGV4cG9ydF9mZW5jZSwgaGFuZGxlX3R5cGV9OworICAgICAgICBhdXRvIHZrR2V0RmVuY2VGZEtIUiA9IChQRk5fdmtHZXRGZW5jZUZkS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0dldEZlbmNlRmRLSFIiKTsKKyAgICAgICAgZXJyID0gdmtHZXRGZW5jZUZkS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmdmaSwgJmZkKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyAgICAvLyBJbXBvcnQgb3BhcXVlIGhhbmRsZSBleHBvcnRlZCBhYm92ZQorICAgIHsKKyAgICAgICAgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiBpZmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSLCBudWxscHRyLCAgICAgaW1wb3J0X2ZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GRU5DRV9JTVBPUlRfVEVNUE9SQVJZX0JJVF9LSFIsICAgICAgICAgIGhhbmRsZV90eXBlLCBmZH07CisgICAgICAgIGF1dG8gdmtJbXBvcnRGZW5jZUZkS0hSID0gKFBGTl92a0ltcG9ydEZlbmNlRmRLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrSW1wb3J0RmVuY2VGZEtIUiIpOworICAgICAgICBlcnIgPSB2a0ltcG9ydEZlbmNlRmRLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmaWZpKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIFVuZG8gdGhlIHRlbXBvcmFyeSBpbXBvcnQKKyAgICB2azo6UmVzZXRGZW5jZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmaW1wb3J0X2ZlbmNlKTsKKworICAgIC8vIFNpZ25hbCB0aGUgcHJldmlvdXNseSBpbXBvcnRlZCBmZW5jZSB0d2ljZSwgdGhlIHNlY29uZCBzaWduYWwgc2hvdWxkIHByb2R1Y2UgYSB2YWxpZGF0aW9uIGVycm9yCisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAwLCBudWxscHRyLCBpbXBvcnRfZmVuY2UpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgImlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgc3VibWlzc2lvbi4iKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDAsIG51bGxwdHIsIGltcG9ydF9mZW5jZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDbGVhbnVwCisgICAgZXJyID0gdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIGV4cG9ydF9mZW5jZSwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIGltcG9ydF9mZW5jZSwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZENtZEJ1ZmZlckV2ZW50RGVzdHJveWVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byBkcmF3IHdpdGggYSBjb21tYW5kIGJ1ZmZlciB0aGF0IGlzIGludmFsaWQgZHVlIHRvIGFuIGV2ZW50IGRlcGVuZGVuY3kgYmVpbmcgZGVzdHJveWVkLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa0V2ZW50IGV2ZW50OworICAgIFZrRXZlbnRDcmVhdGVJbmZvIGV2Y2kgPSB7fTsKKyAgICBldmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdms6OkNyZWF0ZUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmV2Y2ksIE5VTEwsICZldmVudCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MocmVzdWx0KTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kU2V0RXZlbnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyLVZrRXZlbnQiKTsKKyAgICAvLyBEZXN0cm95IGV2ZW50IGRlcGVuZGVuY3kgcHJpb3IgdG8gc3VibWl0IHRvIGNhdXNlIEVSUk9SCisgICAgdms6OkRlc3Ryb3lFdmVudChtX2RldmljZS0+ZGV2aWNlKCksIGV2ZW50LCBOVUxMKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZENtZEJ1ZmZlclF1ZXJ5UG9vbERlc3Ryb3llZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gZHJhdyB3aXRoIGEgY29tbWFuZCBidWZmZXIgdGhhdCBpcyBpbnZhbGlkIGR1ZSB0byBhIHF1ZXJ5IHBvb2wgZGVwZW5kZW5jeSBiZWluZyBkZXN0cm95ZWQuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHFwY2l7fTsKKyAgICBxcGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxcGNpLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QOworICAgIHFwY2kucXVlcnlDb3VudCA9IDE7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxcGNpLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MocmVzdWx0KTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kUmVzZXRRdWVyeVBvb2wobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tRHJhd1N0YXRlLUludmFsaWRDb21tYW5kQnVmZmVyLVZrUXVlcnlQb29sIik7CisgICAgLy8gRGVzdHJveSBxdWVyeSBwb29sIGRlcGVuZGVuY3kgcHJpb3IgdG8gc3VibWl0IHRvIGNhdXNlIEVSUk9SCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBOVUxMKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRGV2aWNlRmVhdHVyZTJBbmRWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRXh0ZW5zaW9uVW5lbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdW5lbmFibGVkIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSAmICIKKyAgICAgICAgIlZLX0VYVF9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRVhURU5TSU9OX05BTUUuIik7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIHZhZGYgPSB7fTsKKyAgICB2YWRmLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9GRUFUVVJFU19FWFQ7CisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBwZF9mZWF0dXJlczIgPSB7fTsKKyAgICBwZF9mZWF0dXJlczIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjsKKyAgICBwZF9mZWF0dXJlczIucE5leHQgPSAmdmFkZjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgdmtfdGVzdGluZzo6UXVldWVDcmVhdGVJbmZvQXJyYXkgcXVldWVfaW5mbyhtX2RldmljZS0+cXVldWVfcHJvcHMpOworICAgIFZrRGV2aWNlQ3JlYXRlSW5mbyBkZXZpY2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk87CisgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gJnBkX2ZlYXR1cmVzMjsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucXVldWVDcmVhdGVJbmZvQ291bnQgPSBxdWV1ZV9pbmZvLnNpemUoKTsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucFF1ZXVlQ3JlYXRlSW5mb3MgPSBxdWV1ZV9pbmZvLmRhdGEoKTsKKyAgICBWa0RldmljZSB0ZXN0RGV2aWNlOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIgbXVzdCBiZSBlbmFibGVkIHdoZW4gaXQgY3JlYXRlcyBhbiBpbnN0YW5jZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZLX0VYVF92ZXJ0ZXhfYXR0cmlidXRlX2Rpdmlzb3IgbXVzdCBiZSBlbmFibGVkIHdoZW4gaXQgY3JlYXRlcyBhIGRldmljZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGNoYWluIik7CisgICAgdms6OkNyZWF0ZURldmljZShncHUoKSwgJmRldmljZV9jcmVhdGVfaW5mbywgTlVMTCwgJnRlc3REZXZpY2UpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEJlZ2luUXVlcnlPblRpbWVzdGFtcFBvb2wpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDYWxsIENtZEJlZ2luUXVlcnkgb24gYSBUSU1FU1RBTVAgcXVlcnkgcG9vbC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa1F1ZXJ5UG9vbCBxdWVyeV9wb29sOworICAgIFZrUXVlcnlQb29sQ3JlYXRlSW5mbyBxdWVyeV9wb29sX2NyZWF0ZV9pbmZve307CisgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk87CisgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5xdWVyeVR5cGUgPSBWS19RVUVSWV9UWVBFX1RJTUVTVEFNUDsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5Q291bnQgPSAxOworICAgIHZrOjpDcmVhdGVRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcXVlcnlfcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnF1ZXJ5X3Bvb2wpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlUeXBlLTAyODA0Iik7CisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGJlZ2luX2luZm97fTsKKyAgICBiZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJmJlZ2luX2luZm8pOworICAgIHZrOjpDbWRSZXNldFF1ZXJ5UG9vbChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAxKTsKKyAgICB2azo6Q21kQmVnaW5RdWVyeShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAwKTsKKyAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95UXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgcXVlcnlfcG9vbCwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU3dhcGNoYWluQWNxdWlyZUltYWdlTm9TeW5jKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB2a0FjcXVpcmVOZXh0SW1hZ2VLSFIgd2l0aCBWS19OVUxMX0hBTkRMRSBzZW1hcGhvcmUgYW5kIGZlbmNlIik7CisKKyAgICBpZiAoIUFkZFN1cmZhY2VJbnN0YW5jZUV4dGVuc2lvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgc3VyZmFjZSBleHRlbnNpb25zIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKCFBZGRTd2FwY2hhaW5EZXZpY2VFeHRlbnNpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIHN3YXBjaGFpbiBleHRlbnNpb25zIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShJbml0U3dhcGNoYWluKCkpOworCisgICAgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtMDE3ODAiKTsKKyAgICAgICAgdWludDMyX3QgZHVtbXk7CisgICAgICAgIHZrOjpBY3F1aXJlTmV4dEltYWdlS0hSKGRldmljZSgpLCBtX3N3YXBjaGFpbiwgVUlOVDY0X01BWCwgVktfTlVMTF9IQU5ETEUsIFZLX05VTExfSEFORExFLCAmZHVtbXkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICBEZXN0cm95U3dhcGNoYWluKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU3dhcGNoYWluQWNxdWlyZUltYWdlTm9TeW5jMktIUikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdmtBY3F1aXJlTmV4dEltYWdlMktIUiB3aXRoIFZLX05VTExfSEFORExFIHNlbWFwaG9yZSBhbmQgZmVuY2UiKTsKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisKKyAgICBib29sIGV4dGVuc2lvbl9kZXBlbmRlbmN5X3NhdGlzZmllZCA9IGZhbHNlOworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIGV4dGVuc2lvbl9kZXBlbmRlbmN5X3NhdGlzZmllZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtX2luc3RhbmNlX2FwaV92ZXJzaW9uIDwgVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIHByaW50ZigiJXMgdmtBY3F1aXJlTmV4dEltYWdlMktIUiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUFkZFN1cmZhY2VJbnN0YW5jZUV4dGVuc2lvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgc3VyZmFjZSBleHRlbnNpb25zIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKGV4dGVuc2lvbl9kZXBlbmRlbmN5X3NhdGlzZmllZCAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9ERVZJQ0VfR1JPVVBfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0RFVklDRV9HUk9VUF9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIGlmIChEZXZpY2VWYWxpZGF0aW9uVmVyc2lvbigpIDwgVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIHByaW50ZigiJXMgdmtBY3F1aXJlTmV4dEltYWdlMktIUiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUFkZFN3YXBjaGFpbkRldmljZUV4dGVuc2lvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgc3dhcGNoYWluIGV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9UUlVFKEluaXRTd2FwY2hhaW4oKSk7CisKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zZW1hcGhvcmUtMDE3ODIiKTsKKyAgICAgICAgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiBhY3F1aXJlX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9ORVhUX0lNQUdFX0lORk9fS0hSfTsKKyAgICAgICAgYWNxdWlyZV9pbmZvLnN3YXBjaGFpbiA9IG1fc3dhcGNoYWluOworICAgICAgICBhY3F1aXJlX2luZm8udGltZW91dCA9IFVJTlQ2NF9NQVg7CisgICAgICAgIGFjcXVpcmVfaW5mby5zZW1hcGhvcmUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgYWNxdWlyZV9pbmZvLmZlbmNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIGFjcXVpcmVfaW5mby5kZXZpY2VNYXNrID0gMHgxOworCisgICAgICAgIHVpbnQzMl90IGR1bW15OworICAgICAgICB2azo6QWNxdWlyZU5leHRJbWFnZTJLSFIoZGV2aWNlKCksICZhY3F1aXJlX2luZm8sICZkdW1teSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIERlc3Ryb3lTd2FwY2hhaW4oKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTd2FwY2hhaW5BY3F1aXJlSW1hZ2VOb0JpbmFyeVNlbWFwaG9yZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdmtBY3F1aXJlTmV4dEltYWdlS0hSIHdpdGggbm9uLWJpbmFyeSBzZW1hcGhvcmUiKTsKKworICAgIGlmICghQWRkU3VyZmFjZUluc3RhbmNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzdXJmYWNlIGV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoIUFkZFN3YXBjaGFpbkRldmljZUV4dGVuc2lvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgc3dhcGNoYWluIGV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9UUlVFKEluaXRTd2FwY2hhaW4oKSk7CisKKyAgICBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSIHNlbWFwaG9yZV90eXBlX2NyZWF0ZV9pbmZve307CisgICAgc2VtYXBob3JlX3R5cGVfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfVFlQRV9DUkVBVEVfSU5GT19LSFI7CisgICAgc2VtYXBob3JlX3R5cGVfY3JlYXRlX2luZm8uc2VtYXBob3JlVHlwZSA9IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUjsKKworICAgIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBzZW1hcGhvcmVfY3JlYXRlX2luZm97fTsKKyAgICBzZW1hcGhvcmVfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk87CisgICAgc2VtYXBob3JlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gJnNlbWFwaG9yZV90eXBlX2NyZWF0ZV9pbmZvOworCisgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpDcmVhdGVTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCAmc2VtYXBob3JlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmc2VtYXBob3JlKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zZW1hcGhvcmUtMDMyNjUiKTsKKyAgICB1aW50MzJfdCBpbWFnZV9pOworICAgIHZrOjpBY3F1aXJlTmV4dEltYWdlS0hSKGRldmljZSgpLCBtX3N3YXBjaGFpbiwgVUlOVDY0X01BWCwgc2VtYXBob3JlLCBWS19OVUxMX0hBTkRMRSwgJmltYWdlX2kpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzZW1hcGhvcmUsIG51bGxwdHIpOworICAgIERlc3Ryb3lTd2FwY2hhaW4oKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTd2FwY2hhaW5BY3F1aXJlSW1hZ2VOb0JpbmFyeVNlbWFwaG9yZTJLSFIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHZrQWNxdWlyZU5leHRJbWFnZTJLSFIgd2l0aCBub24tYmluYXJ5IHNlbWFwaG9yZSIpOworCisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIHdpdGggVktfTlVMTF9IQU5ETEUgc2VtYXBob3JlIGFuZCBmZW5jZSIpOworICAgIFNldFRhcmdldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8xKTsKKworICAgIGJvb2wgZXh0ZW5zaW9uX2RlcGVuZGVuY3lfc2F0aXNmaWVkID0gZmFsc2U7CisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9ERVZJQ0VfR1JPVVBfQ1JFQVRJT05fRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgZXh0ZW5zaW9uX2RlcGVuZGVuY3lfc2F0aXNmaWVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1faW5zdGFuY2VfYXBpX3ZlcnNpb24gPCBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgcHJpbnRmKCIlcyB2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghQWRkU3VyZmFjZUluc3RhbmNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzdXJmYWNlIGV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoZXh0ZW5zaW9uX2RlcGVuZGVuY3lfc2F0aXNmaWVkICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0RFVklDRV9HUk9VUF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfREVWSUNFX0dST1VQX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgaWYgKERldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgPCBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgcHJpbnRmKCIlcyB2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghQWRkU3dhcGNoYWluRGV2aWNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzd2FwY2hhaW4gZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgQVNTRVJUX1RSVUUoSW5pdFN3YXBjaGFpbigpKTsKKworICAgIFZrU2VtYXBob3JlVHlwZUNyZWF0ZUluZm9LSFIgc2VtYXBob3JlX3R5cGVfY3JlYXRlX2luZm97fTsKKyAgICBzZW1hcGhvcmVfdHlwZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9UWVBFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBzZW1hcGhvcmVfdHlwZV9jcmVhdGVfaW5mby5zZW1hcGhvcmVUeXBlID0gVktfU0VNQVBIT1JFX1RZUEVfVElNRUxJTkVfS0hSOworCisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNlbWFwaG9yZV9jcmVhdGVfaW5mb3t9OworICAgIHNlbWFwaG9yZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTzsKKyAgICBzZW1hcGhvcmVfY3JlYXRlX2luZm8ucE5leHQgPSAmc2VtYXBob3JlX3R5cGVfY3JlYXRlX2luZm87CisKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkNyZWF0ZVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksICZzZW1hcGhvcmVfY3JlYXRlX2luZm8sIG51bGxwdHIsICZzZW1hcGhvcmUpKTsKKworICAgIFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgYWNxdWlyZV9pbmZvID0ge307CisgICAgYWNxdWlyZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9ORVhUX0lNQUdFX0lORk9fS0hSOworICAgIGFjcXVpcmVfaW5mby5zd2FwY2hhaW4gPSBtX3N3YXBjaGFpbjsKKyAgICBhY3F1aXJlX2luZm8udGltZW91dCA9IFVJTlQ2NF9NQVg7CisgICAgYWNxdWlyZV9pbmZvLnNlbWFwaG9yZSA9IHNlbWFwaG9yZTsKKyAgICBhY3F1aXJlX2luZm8uZGV2aWNlTWFzayA9IDB4MTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUi1zZW1hcGhvcmUtMDMyNjYiKTsKKyAgICB1aW50MzJfdCBpbWFnZV9pOworICAgIHZrOjpBY3F1aXJlTmV4dEltYWdlMktIUihkZXZpY2UoKSwgJmFjcXVpcmVfaW5mbywgJmltYWdlX2kpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzZW1hcGhvcmUsIG51bGxwdHIpOworICAgIERlc3Ryb3lTd2FwY2hhaW4oKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTd2FwY2hhaW5BY3F1aXJlVG9vTWFueUltYWdlcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkFjcXVpcmluZyBpbnZhbGlkIGFtb3VudCBvZiBpbWFnZXMgZnJvbSB0aGUgc3dhcGNoYWluLiIpOworCisgICAgaWYgKCFBZGRTdXJmYWNlSW5zdGFuY2VFeHRlbnNpb24oKSkgcmV0dXJuOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmICghQWRkU3dhcGNoYWluRGV2aWNlRXh0ZW5zaW9uKCkpIHJldHVybjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShJbml0U3dhcGNoYWluKCkpOworICAgIHVpbnQzMl90IGltYWdlX2NvdW50OworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpHZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlKCksIG1fc3dhcGNoYWluLCAmaW1hZ2VfY291bnQsIG51bGxwdHIpKTsKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY2FwczsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKGdwdSgpLCBtX3N1cmZhY2UsICZjYXBzKSk7CisKKyAgICBjb25zdCB1aW50MzJfdCBhY3F1aXJhYmxlX2NvdW50ID0gaW1hZ2VfY291bnQgLSBjYXBzLm1pbkltYWdlQ291bnQgKyAxOworICAgIHN0ZDo6dmVjdG9yPFZrRmVuY2VPYmo+IGZlbmNlcyhhY3F1aXJhYmxlX2NvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYWNxdWlyYWJsZV9jb3VudDsgKytpKSB7CisgICAgICAgIGZlbmNlc1tpXS5pbml0KCptX2RldmljZSwgVmtGZW5jZU9iajo6Y3JlYXRlX2luZm8oKSk7CisgICAgICAgIHVpbnQzMl90IGltYWdlX2kgPSBpOyAgLy8gV09SS0FST1VORDogTW9ja0lDRCBkb2VzIG5vdCBtb2RpZnkgdGhlIHZhbHVlLCBzbyB3ZSBoYXZlIHRvIG9yIHRoZSB2YWxpZGF0b3Igc3RhdGUgZ2V0cyBjb3JydXB0ZWQKKyAgICAgICAgY29uc3QgYXV0byByZXMgPSB2azo6QWNxdWlyZU5leHRJbWFnZUtIUihkZXZpY2UoKSwgbV9zd2FwY2hhaW4sIFVJTlQ2NF9NQVgsIFZLX05VTExfSEFORExFLCBmZW5jZXNbaV0uaGFuZGxlKCksICZpbWFnZV9pKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmVzID09IFZLX1NVQ0NFU1MgfHwgcmVzID09IFZLX1NVQk9QVElNQUxfS0hSKTsKKyAgICB9CisgICAgVmtGZW5jZU9iaiBlcnJvcl9mZW5jZTsKKyAgICBlcnJvcl9mZW5jZS5pbml0KCptX2RldmljZSwgVmtGZW5jZU9iajo6Y3JlYXRlX2luZm8oKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZUtIUi1zd2FwY2hhaW4tMDE4MDIiKTsKKyAgICB1aW50MzJfdCBpbWFnZV9pOworICAgIHZrOjpBY3F1aXJlTmV4dEltYWdlS0hSKGRldmljZSgpLCBtX3N3YXBjaGFpbiwgVUlOVDY0X01BWCwgVktfTlVMTF9IQU5ETEUsIGVycm9yX2ZlbmNlLmhhbmRsZSgpLCAmaW1hZ2VfaSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBDbGVhbnVwCisgICAgdms6OldhaXRGb3JGZW5jZXMoZGV2aWNlKCksIGZlbmNlcy5zaXplKCksIE1ha2VWa0hhbmRsZXM8VmtGZW5jZT4oZmVuY2VzKS5kYXRhKCksIFZLX1RSVUUsIFVJTlQ2NF9NQVgpOworICAgIERlc3Ryb3lTd2FwY2hhaW4oKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTd2FwY2hhaW5BY3F1aXJlVG9vTWFueUltYWdlczJLSFIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBY3F1aXJpbmcgaW52YWxpZCBhbW91bnQgb2YgaW1hZ2VzIGZyb20gdGhlIHN3YXBjaGFpbiB2aWEgdmtBY3F1aXJlTmV4dEltYWdlMktIUi4iKTsKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisKKyAgICBib29sIGV4dGVuc2lvbl9kZXBlbmRlbmN5X3NhdGlzZmllZCA9IGZhbHNlOworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0RFVklDRV9HUk9VUF9DUkVBVElPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIGV4dGVuc2lvbl9kZXBlbmRlbmN5X3NhdGlzZmllZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtX2luc3RhbmNlX2FwaV92ZXJzaW9uIDwgVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIHByaW50ZigiJXMgdmtBY3F1aXJlTmV4dEltYWdlMktIUiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUFkZFN1cmZhY2VJbnN0YW5jZUV4dGVuc2lvbigpKSByZXR1cm47CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoZXh0ZW5zaW9uX2RlcGVuZGVuY3lfc2F0aXNmaWVkICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0RFVklDRV9HUk9VUF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfREVWSUNFX0dST1VQX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgaWYgKERldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgPCBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgcHJpbnRmKCIlcyB2a0FjcXVpcmVOZXh0SW1hZ2UyS0hSIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghQWRkU3dhcGNoYWluRGV2aWNlRXh0ZW5zaW9uKCkpIHJldHVybjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShJbml0U3dhcGNoYWluKCkpOworICAgIHVpbnQzMl90IGltYWdlX2NvdW50OworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpHZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlKCksIG1fc3dhcGNoYWluLCAmaW1hZ2VfY291bnQsIG51bGxwdHIpKTsKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY2FwczsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKGdwdSgpLCBtX3N1cmZhY2UsICZjYXBzKSk7CisKKyAgICBjb25zdCB1aW50MzJfdCBhY3F1aXJhYmxlX2NvdW50ID0gaW1hZ2VfY291bnQgLSBjYXBzLm1pbkltYWdlQ291bnQgKyAxOworICAgIHN0ZDo6dmVjdG9yPFZrRmVuY2VPYmo+IGZlbmNlcyhhY3F1aXJhYmxlX2NvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYWNxdWlyYWJsZV9jb3VudDsgKytpKSB7CisgICAgICAgIGZlbmNlc1tpXS5pbml0KCptX2RldmljZSwgVmtGZW5jZU9iajo6Y3JlYXRlX2luZm8oKSk7CisgICAgICAgIHVpbnQzMl90IGltYWdlX2kgPSBpOyAgLy8gV09SS0FST1VORDogTW9ja0lDRCBkb2VzIG5vdCBtb2RpZnkgdGhlIHZhbHVlLCBzbyB3ZSBoYXZlIHRvIG9yIHRoZSB2YWxpZGF0b3Igc3RhdGUgZ2V0cyBjb3JydXB0ZWQKKyAgICAgICAgY29uc3QgYXV0byByZXMgPSB2azo6QWNxdWlyZU5leHRJbWFnZUtIUihkZXZpY2UoKSwgbV9zd2FwY2hhaW4sIFVJTlQ2NF9NQVgsIFZLX05VTExfSEFORExFLCBmZW5jZXNbaV0uaGFuZGxlKCksICZpbWFnZV9pKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmVzID09IFZLX1NVQ0NFU1MgfHwgcmVzID09IFZLX1NVQk9QVElNQUxfS0hSKTsKKyAgICB9CisgICAgVmtGZW5jZU9iaiBlcnJvcl9mZW5jZTsKKyAgICBlcnJvcl9mZW5jZS5pbml0KCptX2RldmljZSwgVmtGZW5jZU9iajo6Y3JlYXRlX2luZm8oKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQWNxdWlyZU5leHRJbWFnZTJLSFItc3dhcGNoYWluLTAxODAzIik7CisgICAgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiBhY3F1aXJlX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQUNRVUlSRV9ORVhUX0lNQUdFX0lORk9fS0hSfTsKKyAgICBhY3F1aXJlX2luZm8uc3dhcGNoYWluID0gbV9zd2FwY2hhaW47CisgICAgYWNxdWlyZV9pbmZvLnRpbWVvdXQgPSBVSU5UNjRfTUFYOworICAgIGFjcXVpcmVfaW5mby5mZW5jZSA9IGVycm9yX2ZlbmNlLmhhbmRsZSgpOworICAgIGFjcXVpcmVfaW5mby5kZXZpY2VNYXNrID0gMHgxOworCisgICAgdWludDMyX3QgaW1hZ2VfaTsKKyAgICB2azo6QWNxdWlyZU5leHRJbWFnZTJLSFIoZGV2aWNlKCksICZhY3F1aXJlX2luZm8sICZpbWFnZV9pKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIENsZWFudXAKKyAgICB2azo6V2FpdEZvckZlbmNlcyhkZXZpY2UoKSwgZmVuY2VzLnNpemUoKSwgTWFrZVZrSGFuZGxlczxWa0ZlbmNlPihmZW5jZXMpLmRhdGEoKSwgVktfVFJVRSwgVUlOVDY0X01BWCk7CisgICAgRGVzdHJveVN3YXBjaGFpbigpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWREZXZpY2VNYXNrKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiSW52YWxpZCBkZXZpY2VNYXNrLiIpOworICAgIFNldFRhcmdldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8xKTsKKworICAgIGJvb2wgc3VwcG9ydF9zdXJmYWNlID0gdHJ1ZTsKKyAgICBpZiAoIUFkZFN1cmZhY2VJbnN0YW5jZUV4dGVuc2lvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgc3VyZmFjZSBleHRlbnNpb25zIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICBzdXBwb3J0X3N1cmZhY2UgPSBmYWxzZTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmIChzdXBwb3J0X3N1cmZhY2UpIHsKKyAgICAgICAgaWYgKCFBZGRTd2FwY2hhaW5EZXZpY2VFeHRlbnNpb24oKSkgeworICAgICAgICAgICAgcHJpbnRmKCIlcyBzd2FwY2hhaW4gZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyBCaW5kU3dhcGNoYWluSW1hZ2VNZW1vcnkgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICAgICAgc3VwcG9ydF9zdXJmYWNlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRGV2aWNlVmFsaWRhdGlvblZlcnNpb24oKSA8IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBHcm91cHMgcmVxdWlyZXMgVnVsa2FuIDEuMSssIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50MzJfdCBwaHlzaWNhbF9kZXZpY2VfZ3JvdXBfY291bnQgPSAwOworICAgIHZrOjpFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyhpbnN0YW5jZSgpLCAmcGh5c2ljYWxfZGV2aWNlX2dyb3VwX2NvdW50LCBudWxscHRyKTsKKworICAgIGlmIChwaHlzaWNhbF9kZXZpY2VfZ3JvdXBfY291bnQgPT0gMCkgeworICAgICAgICBwcmludGYoIiVzIHBoeXNpY2FsX2RldmljZV9ncm91cF9jb3VudCBpcyAwLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxWa1BoeXNpY2FsRGV2aWNlR3JvdXBQcm9wZXJ0aWVzPiBwaHlzaWNhbF9kZXZpY2VfZ3JvdXAocGh5c2ljYWxfZGV2aWNlX2dyb3VwX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0dST1VQX1BST1BFUlRJRVN9KTsKKyAgICB2azo6RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VHcm91cHMoaW5zdGFuY2UoKSwgJnBoeXNpY2FsX2RldmljZV9ncm91cF9jb3VudCwgcGh5c2ljYWxfZGV2aWNlX2dyb3VwLmRhdGEoKSk7CisgICAgVmtEZXZpY2VHcm91cERldmljZUNyZWF0ZUluZm8gY3JlYXRlX2RldmljZV9wbmV4dCA9IHt9OworICAgIGNyZWF0ZV9kZXZpY2VfcG5leHQuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfR1JPVVBfREVWSUNFX0NSRUFURV9JTkZPOworICAgIGNyZWF0ZV9kZXZpY2VfcG5leHQucGh5c2ljYWxEZXZpY2VDb3VudCA9IHBoeXNpY2FsX2RldmljZV9ncm91cFswXS5waHlzaWNhbERldmljZUNvdW50OworICAgIGNyZWF0ZV9kZXZpY2VfcG5leHQucFBoeXNpY2FsRGV2aWNlcyA9IHBoeXNpY2FsX2RldmljZV9ncm91cFswXS5waHlzaWNhbERldmljZXM7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZjcmVhdGVfZGV2aWNlX3BuZXh0LCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBpZiAoIUluaXRTd2FwY2hhaW4oKSkgeworICAgICAgICBwcmludGYoIiVzIENhbm5vdCBjcmVhdGUgc3VyZmFjZSBvciBzd2FwY2hhaW4sIHNraXBwaW5nIFZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFIgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICBzdXBwb3J0X3N1cmZhY2UgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUZXN0IFZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8KKyAgICBWa01lbW9yeUFsbG9jYXRlRmxhZ3NJbmZvIGFsbG9jX2ZsYWdzX2luZm8gPSB7fTsKKyAgICBhbGxvY19mbGFnc19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0ZMQUdTX0lORk87CisgICAgYWxsb2NfZmxhZ3NfaW5mby5mbGFncyA9IFZLX01FTU9SWV9BTExPQ0FURV9ERVZJQ0VfTUFTS19CSVQ7CisgICAgYWxsb2NfZmxhZ3NfaW5mby5kZXZpY2VNYXNrID0gMHhGRkZGRkZGRjsKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBhbGxvY19pbmZvID0ge307CisgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIGFsbG9jX2luZm8ucE5leHQgPSAmYWxsb2NfZmxhZ3NfaW5mbzsKKyAgICBhbGxvY19pbmZvLm1lbW9yeVR5cGVJbmRleCA9IDA7CisgICAgYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IDMyOworCisgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUZsYWdzSW5mby1kZXZpY2VNYXNrLTAwNjc1Iik7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZtZW0pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgYWxsb2NfZmxhZ3NfaW5mby5kZXZpY2VNYXNrID0gMDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVGbGFnc0luZm8tZGV2aWNlTWFzay0wMDY3NiIpOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCBOVUxMLCAmbWVtKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFRlc3QgVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8KKyAgICBWa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBkZXZfZ3JwX2NtZF9idWZfaW5mbyA9IHt9OworICAgIGRldl9ncnBfY21kX2J1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgZGV2X2dycF9jbWRfYnVmX2luZm8uZGV2aWNlTWFzayA9IDB4RkZGRkZGRkY7CisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNtZF9idWZfaW5mbyA9IHt9OworICAgIGNtZF9idWZfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgY21kX2J1Zl9pbmZvLnBOZXh0ID0gJmRldl9ncnBfY21kX2J1Zl9pbmZvOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5yZXNldCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtEZXZpY2VHcm91cENvbW1hbmRCdWZmZXJCZWdpbkluZm8tZGV2aWNlTWFzay0wMDEwNiIpOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJmNtZF9idWZfaW5mbyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBkZXZfZ3JwX2NtZF9idWZfaW5mby5kZXZpY2VNYXNrID0gMDsKKyAgICBtX2NvbW1hbmRCdWZmZXItPnJlc2V0KCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RldmljZUdyb3VwQ29tbWFuZEJ1ZmZlckJlZ2luSW5mby1kZXZpY2VNYXNrLTAwMTA3Iik7CisgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmY21kX2J1Zl9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFRlc3QgVmtEZXZpY2VHcm91cFJlbmRlclBhc3NCZWdpbkluZm8KKyAgICBkZXZfZ3JwX2NtZF9idWZfaW5mby5kZXZpY2VNYXNrID0gMHgwMDAwMDAwMTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPnJlc2V0KCk7CisgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmY21kX2J1Zl9pbmZvKTsKKworICAgIFZrRGV2aWNlR3JvdXBSZW5kZXJQYXNzQmVnaW5JbmZvIGRldl9ncnBfcnBfaW5mbyA9IHt9OworICAgIGRldl9ncnBfcnBfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9SRU5ERVJfUEFTU19CRUdJTl9JTkZPOworICAgIGRldl9ncnBfcnBfaW5mby5kZXZpY2VNYXNrID0gMHhGRkZGRkZGRjsKKyAgICBtX3JlbmRlclBhc3NCZWdpbkluZm8ucE5leHQgPSAmZGV2X2dycF9ycF9pbmZvOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA1Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA3Iik7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmbV9yZW5kZXJQYXNzQmVnaW5JbmZvLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBkZXZfZ3JwX3JwX2luZm8uZGV2aWNlTWFzayA9IDA7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VNYXNrLTAwOTA2Iik7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmbV9yZW5kZXJQYXNzQmVnaW5JbmZvLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBkZXZfZ3JwX3JwX2luZm8uZGV2aWNlTWFzayA9IDB4MDAwMDAwMDE7CisgICAgZGV2X2dycF9ycF9pbmZvLmRldmljZVJlbmRlckFyZWFDb3VudCA9IHBoeXNpY2FsX2RldmljZV9ncm91cFswXS5waHlzaWNhbERldmljZUNvdW50ICsgMTsKKyAgICBzdGQ6OnZlY3RvcjxWa1JlY3QyRD4gZGV2aWNlX3JlbmRlcl9hcmVhcyhkZXZfZ3JwX3JwX2luZm8uZGV2aWNlUmVuZGVyQXJlYUNvdW50LCBtX3JlbmRlclBhc3NCZWdpbkluZm8ucmVuZGVyQXJlYSk7CisgICAgZGV2X2dycF9ycF9pbmZvLnBEZXZpY2VSZW5kZXJBcmVhcyA9IGRldmljZV9yZW5kZXJfYXJlYXMuZGF0YSgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RldmljZUdyb3VwUmVuZGVyUGFzc0JlZ2luSW5mby1kZXZpY2VSZW5kZXJBcmVhQ291bnQtMDA5MDgiKTsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZtX3JlbmRlclBhc3NCZWdpbkluZm8sIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFRlc3Qgdms6OkNtZFNldERldmljZU1hc2soKQorICAgIHZrOjpDbWRTZXREZXZpY2VNYXNrKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDB4MDAwMDAwMDEpOworCisgICAgZGV2X2dycF9ycF9pbmZvLmRldmljZVJlbmRlckFyZWFDb3VudCA9IHBoeXNpY2FsX2RldmljZV9ncm91cFswXS5waHlzaWNhbERldmljZUNvdW50OworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJm1fcmVuZGVyUGFzc0JlZ2luSW5mbywgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXREZXZpY2VNYXNrLWRldmljZU1hc2stMDAxMDgiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0RGV2aWNlTWFzay1kZXZpY2VNYXNrLTAwMTEwIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldERldmljZU1hc2stZGV2aWNlTWFzay0wMDExMSIpOworICAgIHZrOjpDbWRTZXREZXZpY2VNYXNrKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDB4RkZGRkZGRkYpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldERldmljZU1hc2stZGV2aWNlTWFzay0wMDEwOSIpOworICAgIHZrOjpDbWRTZXREZXZpY2VNYXNrKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNlbWFwaG9yZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIHNlbWFwaG9yZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTzsKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkNyZWF0ZVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksICZzZW1hcGhvcmVfY3JlYXRlX2luZm8sIG51bGxwdHIsICZzZW1hcGhvcmUpKTsKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmUyOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpDcmVhdGVTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCAmc2VtYXBob3JlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmc2VtYXBob3JlMikpOworICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZlbmNlX2NyZWF0ZV9pbmZvID0ge307CisgICAgZmVuY2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTzsKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpDcmVhdGVGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksICZmZW5jZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmZlbmNlKSk7CisKKyAgICBpZiAoc3VwcG9ydF9zdXJmYWNlKSB7CisgICAgICAgIC8vIFRlc3QgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUgorICAgICAgICB1aW50MzJfdCBpbWFnZUluZGV4ID0gMDsKKyAgICAgICAgVmtBY3F1aXJlTmV4dEltYWdlSW5mb0tIUiBhY3F1aXJlX25leHRfaW1hZ2VfaW5mbyA9IHt9OworICAgICAgICBhY3F1aXJlX25leHRfaW1hZ2VfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfTkVYVF9JTUFHRV9JTkZPX0tIUjsKKyAgICAgICAgYWNxdWlyZV9uZXh0X2ltYWdlX2luZm8uc2VtYXBob3JlID0gc2VtYXBob3JlOworICAgICAgICBhY3F1aXJlX25leHRfaW1hZ2VfaW5mby5zd2FwY2hhaW4gPSBtX3N3YXBjaGFpbjsKKyAgICAgICAgYWNxdWlyZV9uZXh0X2ltYWdlX2luZm8uZmVuY2UgPSBmZW5jZTsKKyAgICAgICAgYWNxdWlyZV9uZXh0X2ltYWdlX2luZm8uZGV2aWNlTWFzayA9IDB4RkZGRkZGRkY7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0FjcXVpcmVOZXh0SW1hZ2VJbmZvS0hSLWRldmljZU1hc2stMDEyOTAiKTsKKyAgICAgICAgdms6OkFjcXVpcmVOZXh0SW1hZ2UyS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFjcXVpcmVfbmV4dF9pbWFnZV9pbmZvLCAmaW1hZ2VJbmRleCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIHZrOjpXYWl0Rm9yRmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmZlbmNlLCBWS19UUlVFLCBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKTsKKyAgICAgICAgdms6OlJlc2V0RmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmZlbmNlKTsKKworICAgICAgICBhY3F1aXJlX25leHRfaW1hZ2VfaW5mby5zZW1hcGhvcmUgPSBzZW1hcGhvcmUyOworICAgICAgICBhY3F1aXJlX25leHRfaW1hZ2VfaW5mby5kZXZpY2VNYXNrID0gMDsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQWNxdWlyZU5leHRJbWFnZUluZm9LSFItZGV2aWNlTWFzay0wMTI5MSIpOworICAgICAgICB2azo6QWNxdWlyZU5leHRJbWFnZTJLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmYWNxdWlyZV9uZXh0X2ltYWdlX2luZm8sICZpbWFnZUluZGV4KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIERlc3Ryb3lTd2FwY2hhaW4oKTsKKyAgICB9CisKKyAgICAvLyBUZXN0IFZrRGV2aWNlR3JvdXBTdWJtaXRJbmZvCisgICAgVmtEZXZpY2VHcm91cFN1Ym1pdEluZm8gZGV2aWNlX2dyb3VwX3N1Ym1pdF9pbmZvID0ge307CisgICAgZGV2aWNlX2dyb3VwX3N1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0dST1VQX1NVQk1JVF9JTkZPOworICAgIGRldmljZV9ncm91cF9zdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN0ZDo6YXJyYXk8dWludDMyX3QsIDE+IGNvbW1hbmRfYnVmZmVyX2RldmljZV9tYXNrcyA9IHsweEZGRkZGRkZGfTsKKyAgICBkZXZpY2VfZ3JvdXBfc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJEZXZpY2VNYXNrcyA9IGNvbW1hbmRfYnVmZmVyX2RldmljZV9tYXNrcy5kYXRhKCk7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLnBOZXh0ID0gJmRldmljZV9ncm91cF9zdWJtaXRfaW5mbzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5yZXNldCgpOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJmNtZF9idWZfaW5mbyk7CisgICAgdms6OkVuZENvbW1hbmRCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0RldmljZUdyb3VwU3VibWl0SW5mby1wQ29tbWFuZEJ1ZmZlckRldmljZU1hc2tzLTAwMDg2Iik7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisKKyAgICB2azo6V2FpdEZvckZlbmNlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZmZW5jZSwgVktfVFJVRSwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSk7CisgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIGZlbmNlLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksIHNlbWFwaG9yZSwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzZW1hcGhvcmUyLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWYWxpZGF0aW9uQ2FjaGVUZXN0QmFkTWVyZ2UpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCAiVktfTEFZRVJfTFVOQVJHX2NvcmVfdmFsaWRhdGlvbiIsIFZLX0VYVF9WQUxJREFUSU9OX0NBQ0hFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9WQUxJREFUSU9OX0NBQ0hFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzICVzIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfVkFMSURBVElPTl9DQUNIRV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgLy8gTG9hZCBleHRlbnNpb24gZnVuY3Rpb25zCisgICAgYXV0byBmcENyZWF0ZVZhbGlkYXRpb25DYWNoZSA9CisgICAgICAgIChQRk5fdmtDcmVhdGVWYWxpZGF0aW9uQ2FjaGVFWFQpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrQ3JlYXRlVmFsaWRhdGlvbkNhY2hlRVhUIik7CisgICAgYXV0byBmcERlc3Ryb3lWYWxpZGF0aW9uQ2FjaGUgPQorICAgICAgICAoUEZOX3ZrRGVzdHJveVZhbGlkYXRpb25DYWNoZUVYVCl2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtEZXN0cm95VmFsaWRhdGlvbkNhY2hlRVhUIik7CisgICAgYXV0byBmcE1lcmdlVmFsaWRhdGlvbkNhY2hlcyA9CisgICAgICAgIChQRk5fdmtNZXJnZVZhbGlkYXRpb25DYWNoZXNFWFQpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhUIik7CisgICAgaWYgKCFmcENyZWF0ZVZhbGlkYXRpb25DYWNoZSB8fCAhZnBEZXN0cm95VmFsaWRhdGlvbkNhY2hlIHx8ICFmcE1lcmdlVmFsaWRhdGlvbkNhY2hlcykgeworICAgICAgICBwcmludGYoIiVzIEZhaWxlZCB0byBsb2FkIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciAlc1xuIiwga1NraXBQcmVmaXgsIFZLX0VYVF9WQUxJREFUSU9OX0NBQ0hFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrVmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mb0VYVCB2YWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvOworICAgIHZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0NBQ0hFX0NSRUFURV9JTkZPX0VYVDsKKyAgICB2YWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvLnBOZXh0ID0gTlVMTDsKKyAgICB2YWxpZGF0aW9uQ2FjaGVDcmVhdGVJbmZvLmluaXRpYWxEYXRhU2l6ZSA9IDA7CisgICAgdmFsaWRhdGlvbkNhY2hlQ3JlYXRlSW5mby5wSW5pdGlhbERhdGEgPSBOVUxMOworICAgIHZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm8uZmxhZ3MgPSAwOworICAgIFZrVmFsaWRhdGlvbkNhY2hlRVhUIHZhbGlkYXRpb25DYWNoZSA9IFZLX05VTExfSEFORExFOworICAgIFZrUmVzdWx0IHJlcyA9IGZwQ3JlYXRlVmFsaWRhdGlvbkNhY2hlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnZhbGlkYXRpb25DYWNoZUNyZWF0ZUluZm8sIG51bGxwdHIsICZ2YWxpZGF0aW9uQ2FjaGUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHJlcyk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrTWVyZ2VWYWxpZGF0aW9uQ2FjaGVzRVhULWRzdENhY2hlLTAxNTM2Iik7CisgICAgcmVzID0gZnBNZXJnZVZhbGlkYXRpb25DYWNoZXMobV9kZXZpY2UtPmRldmljZSgpLCB2YWxpZGF0aW9uQ2FjaGUsIDEsICZ2YWxpZGF0aW9uQ2FjaGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgZnBEZXN0cm95VmFsaWRhdGlvbkNhY2hlKG1fZGV2aWNlLT5kZXZpY2UoKSwgdmFsaWRhdGlvbkNhY2hlLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkUXVldWVGYW1pbHlJbmRleCkgeworICAgIC8vIE1pc2NlbGxhbmVvdXMgcXVldWVGYW1pbHlJbmRleCB2YWxpZGF0aW9uIHRlc3RzCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmQ0kgPSB7fTsKKyAgICBidWZmQ0kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgYnVmZkNJLnNpemUgPSAxMDI0OworICAgIGJ1ZmZDSS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGJ1ZmZDSS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAyOworICAgIC8vIEludHJvZHVjZSBmYWlsdXJlIGJ5IHNwZWNpZnlpbmcgaW52YWxpZCBxdWV1ZV9mYW1pbHlfaW5kZXgKKyAgICB1aW50MzJfdCBxZmlbMl07CisgICAgcWZpWzBdID0gNzc3OworICAgIHFmaVsxXSA9IDA7CisKKyAgICBidWZmQ0kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IHFmaTsKKyAgICBidWZmQ0kuc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVDsgIC8vIHFmaSBvbmx5IG1hdHRlcnMgaW4gQ09OQ1VSUkVOVCBtb2RlCisKKyAgICAvLyBUZXN0IGZvciBxdWV1ZSBmYW1pbHkgaW5kZXggb3V0IG9mIHJhbmdlCisgICAgQ3JlYXRlQnVmZmVyVGVzdCgqdGhpcywgJmJ1ZmZDSSwgIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxNDE5Iik7CisKKyAgICAvLyBUZXN0IGZvciBub24tdW5pcXVlIFFGSSBpbiBhcnJheQorICAgIHFmaVswXSA9IDA7CisgICAgQ3JlYXRlQnVmZmVyVGVzdCgqdGhpcywgJmJ1ZmZDSSwgIlZVSUQtVmtCdWZmZXJDcmVhdGVJbmZvLXNoYXJpbmdNb2RlLTAxNDE5Iik7CisKKyAgICBpZiAobV9kZXZpY2UtPnF1ZXVlX3Byb3BzLnNpemUoKSA+IDIpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAid2hpY2ggd2FzIG5vdCBjcmVhdGVkIGFsbG93aW5nIGNvbmN1cnJlbnQiKTsKKworICAgICAgICAvLyBDcmVhdGUgYnVmZmVyIHNoYXJlZCB0byBxdWV1ZSBmYW1pbGllcyAxIGFuZCAyLCBidXQgc3VibWl0dGVkIG9uIHF1ZXVlIGZhbWlseSAwCisgICAgICAgIGJ1ZmZDSS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAyOworICAgICAgICBxZmlbMF0gPSAxOworICAgICAgICBxZmlbMV0gPSAyOworICAgICAgICBWa0J1ZmZlck9iaiBpYjsKKyAgICAgICAgaWIuaW5pdCgqbV9kZXZpY2UsIGJ1ZmZDSSk7CisKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgICAgICB2azo6Q21kRmlsbEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBpYi5oYW5kbGUoKSwgMCwgMTYsIDUpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPlF1ZXVlQ29tbWFuZEJ1ZmZlcihmYWxzZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkUXVlcnlQb29sQ3JlYXRlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byBjcmVhdGUgYSBxdWVyeSBwb29sIGZvciBQSVBFTElORV9TVEFUSVNUSUNTIHdpdGhvdXQgZW5hYmxpbmcgcGlwZWxpbmUgc3RhdHMgZm9yIHRoZSBkZXZpY2UuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgdmtfdGVzdGluZzo6UXVldWVDcmVhdGVJbmZvQXJyYXkgcXVldWVfaW5mbyhtX2RldmljZS0+cXVldWVfcHJvcHMpOworCisgICAgVmtEZXZpY2UgbG9jYWxfZGV2aWNlOworICAgIFZrRGV2aWNlQ3JlYXRlSW5mbyBkZXZpY2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBhdXRvIGZlYXR1cmVzID0gbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCk7CisgICAgLy8gSW50ZW50aW9uYWxseSBkaXNhYmxlIHBpcGVsaW5lIHN0YXRzCisgICAgZmVhdHVyZXMucGlwZWxpbmVTdGF0aXN0aWNzUXVlcnkgPSBWS19GQUxTRTsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk87CisgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucXVldWVDcmVhdGVJbmZvQ291bnQgPSBxdWV1ZV9pbmZvLnNpemUoKTsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucFF1ZXVlQ3JlYXRlSW5mb3MgPSBxdWV1ZV9pbmZvLmRhdGEoKTsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8uZW5hYmxlZExheWVyQ291bnQgPSAwOworICAgIGRldmljZV9jcmVhdGVfaW5mby5wcEVuYWJsZWRMYXllck5hbWVzID0gTlVMTDsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucEVuYWJsZWRGZWF0dXJlcyA9ICZmZWF0dXJlczsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlRGV2aWNlKGdwdSgpLCAmZGV2aWNlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmbG9jYWxfZGV2aWNlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHFwY2l7fTsKKyAgICBxcGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxcGNpLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUzsKKyAgICBxcGNpLnF1ZXJ5Q291bnQgPSAxOworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDA3OTEiKTsKKyAgICB2azo6Q3JlYXRlUXVlcnlQb29sKGxvY2FsX2RldmljZSwgJnFwY2ksIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95RGV2aWNlKGxvY2FsX2RldmljZSwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVW5jbG9zZWRRdWVyeSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkVuZCBhIGNvbW1hbmQgYnVmZmVyIHdpdGggYSBxdWVyeSBzdGlsbCBpbiBwcm9ncmVzcy4iKTsKKworICAgIGNvbnN0IGNoYXIgKmludmFsaWRfcXVlcnkgPSAiVlVJRC12a0VuZENvbW1hbmRCdWZmZXItY29tbWFuZEJ1ZmZlci0wMDA2MSI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtFdmVudCBldmVudDsKKyAgICBWa0V2ZW50Q3JlYXRlSW5mbyBldmVudF9jcmVhdGVfaW5mb3t9OworICAgIGV2ZW50X2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisgICAgdms6OkNyZWF0ZUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmV2ZW50X2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmZXZlbnQpOworCisgICAgVmtRdWV1ZSBxdWV1ZSA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpHZXREZXZpY2VRdWV1ZShtX2RldmljZS0+ZGV2aWNlKCksIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XywgMCwgJnF1ZXVlKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIGludmFsaWRfcXVlcnkpOworCisgICAgVmtRdWVyeVBvb2wgcXVlcnlfcG9vbDsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jcmVhdGVfaW5mbyA9IHt9OworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9PQ0NMVVNJT047CisgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5xdWVyeUNvdW50ID0gMTsKKyAgICB2azo6Q3JlYXRlUXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKworICAgIHZrOjpDbWRSZXNldFF1ZXJ5UG9vbChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwIC8qc3RhcnRRdWVyeSovLCAxIC8qcXVlcnlDb3VudCovKTsKKyAgICB2azo6Q21kQmVnaW5RdWVyeShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAwKTsKKworICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgZXZlbnQsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFF1ZXJ5UHJlY2lzZUJpdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNoZWNrIGZvciBjb3JyZWN0IFF1ZXJ5IFByZWNpc2UgQml0IGNpcmN1bXN0YW5jZXMuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIFRoZXNlIHRlc3RzIHJlcXVpcmUgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnQgcGlwZWxpbmUgc3RhdGlzdGljcyBxdWVyeQorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBkZXZpY2VfZmVhdHVyZXMgPSB7fTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKCZkZXZpY2VfZmVhdHVyZXMpKTsKKyAgICBpZiAoVktfVFJVRSAhPSBkZXZpY2VfZmVhdHVyZXMucGlwZWxpbmVTdGF0aXN0aWNzUXVlcnkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IHJlcXVpcmVzIHVuc3VwcG9ydGVkIHBpcGVsaW5lU3RhdGlzdGljc1F1ZXJ5IGZlYXR1cmUuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGRldmljZV9leHRlbnNpb25fbmFtZXM7CisgICAgYXV0byBmZWF0dXJlcyA9IG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworCisgICAgLy8gVGVzdCBmb3IgcHJlY2lzZSBiaXQgd2hlbiBxdWVyeSB0eXBlIGlzIG5vdCBPQ0NMVVNJT04KKyAgICBpZiAoZmVhdHVyZXMub2NjbHVzaW9uUXVlcnlQcmVjaXNlKSB7CisgICAgICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgICAgIFZrRXZlbnRDcmVhdGVJbmZvIGV2ZW50X2NyZWF0ZV9pbmZve307CisgICAgICAgIGV2ZW50X2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisgICAgICAgIHZrOjpDcmVhdGVFdmVudChtX2RldmljZS0+aGFuZGxlKCksICZldmVudF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmV2ZW50KTsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMDgwMCIpOworCisgICAgICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgICAgIFZrUXVlcnlQb29sQ3JlYXRlSW5mbyBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgICAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfUElQRUxJTkVfU1RBVElTVElDUzsKKyAgICAgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5xdWVyeUNvdW50ID0gMTsKKyAgICAgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+aGFuZGxlKCksICZxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisKKyAgICAgICAgdms6OkNtZFJlc2V0UXVlcnlQb29sKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDEpOworICAgICAgICB2azo6Q21kQmVnaW5RdWVyeShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCBWS19RVUVSWV9DT05UUk9MX1BSRUNJU0VfQklUKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICAgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCBxdWVyeV9wb29sLCBudWxscHRyKTsKKyAgICAgICAgdms6OkRlc3Ryb3lFdmVudChtX2RldmljZS0+aGFuZGxlKCksIGV2ZW50LCBudWxscHRyKTsKKyAgICB9CisKKyAgICAvLyBUZXN0IGZvciBwcmVjaXNlIGJpdCB3aGVuIHByZWNpc2UgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgZmVhdHVyZXMub2NjbHVzaW9uUXVlcnlQcmVjaXNlID0gZmFsc2U7CisgICAgVmtEZXZpY2VPYmogdGVzdF9kZXZpY2UoMCwgZ3B1KCksIGRldmljZV9leHRlbnNpb25fbmFtZXMsICZmZWF0dXJlcyk7CisKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZve307CisgICAgcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSB0ZXN0X2RldmljZS5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZF9wb29sOworICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbCh0ZXN0X2RldmljZS5oYW5kbGUoKSwgJnBvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb21tYW5kX3Bvb2wpOworCisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNtZCA9IHt9OworICAgIGNtZC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgY21kLnBOZXh0ID0gTlVMTDsKKyAgICBjbWQuY29tbWFuZFBvb2wgPSBjb21tYW5kX3Bvb2w7CisgICAgY21kLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICBjbWQuY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjbWRfYnVmZmVyOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKHRlc3RfZGV2aWNlLmhhbmRsZSgpLCAmY21kLCAmY21kX2J1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgVmtFdmVudENyZWF0ZUluZm8gZXZlbnRfY3JlYXRlX2luZm97fTsKKyAgICBldmVudF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVFdmVudCh0ZXN0X2RldmljZS5oYW5kbGUoKSwgJmV2ZW50X2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmZXZlbnQpOworCisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGJlZ2luX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklULCBudWxscHRyfTsKKworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZmZlciwgJmJlZ2luX2luZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCZWdpblF1ZXJ5LXF1ZXJ5VHlwZS0wMDgwMCIpOworCisgICAgVmtRdWVyeVBvb2wgcXVlcnlfcG9vbDsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jcmVhdGVfaW5mbyA9IHt9OworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9PQ0NMVVNJT047CisgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5xdWVyeUNvdW50ID0gMTsKKyAgICB2azo6Q3JlYXRlUXVlcnlQb29sKHRlc3RfZGV2aWNlLmhhbmRsZSgpLCAmcXVlcnlfcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnF1ZXJ5X3Bvb2wpOworCisgICAgdms6OkNtZFJlc2V0UXVlcnlQb29sKGNtZF9idWZmZXIsIHF1ZXJ5X3Bvb2wsIDAsIDEpOworICAgIHZrOjpDbWRCZWdpblF1ZXJ5KGNtZF9idWZmZXIsIHF1ZXJ5X3Bvb2wsIDAsIFZLX1FVRVJZX0NPTlRST0xfUFJFQ0lTRV9CSVQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY21kX2J1ZmZlcik7CisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wodGVzdF9kZXZpY2UuaGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95RXZlbnQodGVzdF9kZXZpY2UuaGFuZGxlKCksIGV2ZW50LCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUNvbW1hbmRQb29sKHRlc3RfZGV2aWNlLmhhbmRsZSgpLCBjb21tYW5kX3Bvb2wsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFN0YWdlTWFza0dzVHNFbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkF0dGVtcHQgdG8gdXNlIGEgc3RhZ2VNYXNrIHcvIGdlb21ldHJ5IHNoYWRlciBhbmQgdGVzc2VsYXRpb24gc2hhZGVyIGJpdHMgZW5hYmxlZCB3aGVuIHRob3NlIGZlYXR1cmVzIGFyZSBkaXNhYmxlZCBvbiB0aGUgIgorICAgICAgICAiZGV2aWNlLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBkZXZpY2VfZXh0ZW5zaW9uX25hbWVzOworICAgIGF1dG8gZmVhdHVyZXMgPSBtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKTsKKyAgICAvLyBNYWtlIHN1cmUgZ3MgJiB0cyBhcmUgZGlzYWJsZWQKKyAgICBmZWF0dXJlcy5nZW9tZXRyeVNoYWRlciA9IGZhbHNlOworICAgIGZlYXR1cmVzLnRlc3NlbGxhdGlvblNoYWRlciA9IGZhbHNlOworICAgIC8vIFRoZSBzYWNyaWZpY2lhbCBkZXZpY2Ugb2JqZWN0CisgICAgVmtEZXZpY2VPYmogdGVzdF9kZXZpY2UoMCwgZ3B1KCksIGRldmljZV9leHRlbnNpb25fbmFtZXMsICZmZWF0dXJlcyk7CisKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZve307CisgICAgcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSB0ZXN0X2RldmljZS5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZF9wb29sOworICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbCh0ZXN0X2RldmljZS5oYW5kbGUoKSwgJnBvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb21tYW5kX3Bvb2wpOworCisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNtZCA9IHt9OworICAgIGNtZC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgY21kLnBOZXh0ID0gTlVMTDsKKyAgICBjbWQuY29tbWFuZFBvb2wgPSBjb21tYW5kX3Bvb2w7CisgICAgY21kLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICBjbWQuY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjbWRfYnVmZmVyOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKHRlc3RfZGV2aWNlLmhhbmRsZSgpLCAmY21kLCAmY21kX2J1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgVmtFdmVudENyZWF0ZUluZm8gZXZjaSA9IHt9OworICAgIGV2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTzsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2azo6Q3JlYXRlRXZlbnQodGVzdF9kZXZpY2UuaGFuZGxlKCksICZldmNpLCBOVUxMLCAmZXZlbnQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHJlc3VsdCk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY2JiaSA9IHt9OworICAgIGNiYmkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZmZlciwgJmNiYmkpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRTZXRFdmVudC1zdGFnZU1hc2stMDExNTAiKTsKKyAgICB2azo6Q21kU2V0RXZlbnQoY21kX2J1ZmZlciwgZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX0dFT01FVFJZX1NIQURFUl9CSVQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldEV2ZW50LXN0YWdlTWFzay0wMTE1MSIpOworICAgIHZrOjpDbWRTZXRFdmVudChjbWRfYnVmZmVyLCBldmVudCwgVktfUElQRUxJTkVfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfU0hBREVSX0JJVCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveUV2ZW50KHRlc3RfZGV2aWNlLmhhbmRsZSgpLCBldmVudCwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lDb21tYW5kUG9vbCh0ZXN0X2RldmljZS5oYW5kbGUoKSwgY29tbWFuZF9wb29sLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBEZXNjcmlwdG9yUG9vbEluVXNlRGVzdHJveWVkU2lnbmFsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJEZWxldGUgYSBEZXNjcmlwdG9yUG9vbCB3aXRoIGEgRGVzY3JpcHRvclNldCB0aGF0IGlzIGluIHVzZS4iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gQ3JlYXRlIGltYWdlIHRvIHVwZGF0ZSB0aGUgZGVzY3JpcHRvciB3aXRoCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VWaWV3IHZpZXcgPSBpbWFnZS50YXJnZXRWaWV3KFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSk7CisgICAgLy8gQ3JlYXRlIFNhbXBsZXIKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgTlVMTCwgJnNhbXBsZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBDcmVhdGUgUFNPIHRvIGJlIHVzZWQgZm9yIGRyYXctdGltZSBlcnJvcnMgYmVsb3cKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NhbXBsZXJTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3BpcGUudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUuZHNsX2JpbmRpbmdzXyA9IHsKKyAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICB9OworICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bl9zdGF0ZXNbXSA9IHtWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1J9OworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGR5bl9zdGF0ZV9jaSA9IHt9OworICAgIGR5bl9zdGF0ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZHluX3N0YXRlX2NpLmR5bmFtaWNTdGF0ZUNvdW50ID0gc2l6ZShkeW5fc3RhdGVzKTsKKyAgICBkeW5fc3RhdGVfY2kucER5bmFtaWNTdGF0ZXMgPSBkeW5fc3RhdGVzOworICAgIHBpcGUuZHluX3N0YXRlX2NpXyA9IGR5bl9zdGF0ZV9jaTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworCisgICAgLy8gVXBkYXRlIGRlc2NyaXB0b3Igd2l0aCBpbWFnZSBhbmQgc2FtcGxlcgorICAgIHBpcGUuZGVzY3JpcHRvcl9zZXRfLT5Xcml0ZURlc2NyaXB0b3JJbWFnZUluZm8oMCwgdmlldywgc2FtcGxlciwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIpOworICAgIHBpcGUuZGVzY3JpcHRvcl9zZXRfLT5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lXyk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZS5kZXNjcmlwdG9yX3NldF8tPnNldF8sIDAsIE5VTEwpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgLy8gU3VibWl0IGNtZCBidWZmZXIgdG8gcHV0IHBvb2wgaW4tZmxpZ2h0CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgLy8gRGVzdHJveSBwb29sIHdoaWxlIGluLWZsaWdodCwgY2F1c2luZyBlcnJvcgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtEZXN0cm95RGVzY3JpcHRvclBvb2wtZGVzY3JpcHRvclBvb2wtMDAzMDMiKTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgcGlwZS5kZXNjcmlwdG9yX3NldF8tPnBvb2xfLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgLy8gQ2xlYW51cAorICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIsIE5VTEwpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoCisgICAgICAgICJJZiBkZXNjcmlwdG9yUG9vbCBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGRlc2NyaXB0b3JQb29sIG11c3QgYmUgYSB2YWxpZCBWa0Rlc2NyaXB0b3JQb29sIGhhbmRsZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVuYWJsZSB0byByZW1vdmUgRGVzY3JpcHRvclBvb2wgb2JqIik7CisgICAgLy8gVE9ETyA6IEl0IHNlZW1zIFZhbGlkYXRpb24gbGF5ZXJzIHRoaW5rIGRzX3Bvb2wgd2FzIGFscmVhZHkgZGVzdHJveWVkLCBldmVuIHRob3VnaCBpdCB3YXNuJ3Q/Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRnJhbWVidWZmZXJJblVzZURlc3Ryb3llZFNpZ25hbGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiRGVsZXRlIGluLXVzZSBmcmFtZWJ1ZmZlci4iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcGVydGllczsKKyAgICBWa1Jlc3VsdCBlcnIgPSBWS19TVUNDRVNTOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoZ3B1KCksIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgJmZvcm1hdF9wcm9wZXJ0aWVzKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDI1NiwgMjU2LCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisgICAgVmtJbWFnZVZpZXcgdmlldyA9IGltYWdlLnRhcmdldFZpZXcoVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNKTsKKworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgbV9yZW5kZXJQYXNzLCAxLCAmdmlldywgMjU2LCAyNTYsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZjaSwgbnVsbHB0ciwgJmZiKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gSnVzdCB1c2UgZGVmYXVsdCByZW5kZXJwYXNzIHdpdGggb3VyIGZyYW1lYnVmZmVyCisgICAgbV9yZW5kZXJQYXNzQmVnaW5JbmZvLmZyYW1lYnVmZmVyID0gZmI7CisgICAgLy8gQ3JlYXRlIE51bGwgY21kIGJ1ZmZlciBmb3Igc3VibWl0CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICAvLyBTdWJtaXQgY21kIGJ1ZmZlciB0byBwdXQgaXQgaW4tZmxpZ2h0CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgLy8gRGVzdHJveSBmcmFtZWJ1ZmZlciB3aGlsZSBpbi1mbGlnaHQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRGVzdHJveUZyYW1lYnVmZmVyLWZyYW1lYnVmZmVyLTAwODkyIik7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAvLyBXYWl0IGZvciBxdWV1ZSB0byBjb21wbGV0ZSBzbyB3ZSBjYW4gc2FmZWx5IGRlc3Ryb3kgZXZlcnl0aGluZworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJJZiBmcmFtZWJ1ZmZlciBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGZyYW1lYnVmZmVyIG11c3QgYmUgYSB2YWxpZCBWa0ZyYW1lYnVmZmVyIGhhbmRsZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVuYWJsZSB0byByZW1vdmUgRnJhbWVidWZmZXIgb2JqIik7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBGcmFtZWJ1ZmZlckltYWdlSW5Vc2VEZXN0cm95ZWRTaWduYWxlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkRlbGV0ZSBpbi11c2UgaW1hZ2UgdGhhdCdzIGNoaWxkIG9mIGZyYW1lYnVmZmVyLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wZXJ0aWVzOworICAgIFZrUmVzdWx0IGVyciA9IFZLX1NVQ0NFU1M7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhncHUoKSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCAmZm9ybWF0X3Byb3BlcnRpZXMpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NpID0ge307CisgICAgaW1hZ2VfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jaS5wTmV4dCA9IE5VTEw7CisgICAgaW1hZ2VfY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jaS5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgaW1hZ2VfY2kuZXh0ZW50LndpZHRoID0gMjU2OworICAgIGltYWdlX2NpLmV4dGVudC5oZWlnaHQgPSAyNTY7CisgICAgaW1hZ2VfY2kuZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jaS5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NpLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgaW1hZ2VfY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgaW1hZ2VfY2kuZmxhZ3MgPSAwOworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLmluaXQoJmltYWdlX2NpKTsKKworICAgIFZrSW1hZ2VWaWV3IHZpZXcgPSBpbWFnZS50YXJnZXRWaWV3KFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSk7CisKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIG1fcmVuZGVyUGFzcywgMSwgJnZpZXcsIDI1NiwgMjU2LCAxfTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZiOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEp1c3QgdXNlIGRlZmF1bHQgcmVuZGVycGFzcyB3aXRoIG91ciBmcmFtZWJ1ZmZlcgorICAgIG1fcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IGZiOworICAgIC8vIENyZWF0ZSBOdWxsIGNtZCBidWZmZXIgZm9yIHN1Ym1pdAorICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgLy8gU3VibWl0IGNtZCBidWZmZXIgdG8gcHV0IGl0IChhbmQgYXR0YWNoZWQgaW1hZ2VWaWV3KSBpbi1mbGlnaHQKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgLy8gU3VibWl0IGNtZCBidWZmZXIgdG8gcHV0IGZyYW1lYnVmZmVyIGFuZCBjaGlsZHJlbiBpbi1mbGlnaHQKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIC8vIERlc3Ryb3kgaW1hZ2UgYXR0YWNoZWQgdG8gZnJhbWVidWZmZXIgd2hpbGUgaW4tZmxpZ2h0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0Rlc3Ryb3lJbWFnZS1pbWFnZS0wMTAwMCIpOworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZS5oYW5kbGUoKSwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gV2FpdCBmb3IgcXVldWUgdG8gY29tcGxldGUgc28gd2UgY2FuIHNhZmVseSBkZXN0cm95IGltYWdlIGFuZCBvdGhlciBvYmplY3RzCisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIklmIGltYWdlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaW1hZ2UgbXVzdCBiZSBhIHZhbGlkIFZrSW1hZ2UgaGFuZGxlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBJbWFnZSBvYmoiKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEV2ZW50SW5Vc2VEZXN0cm95ZWRTaWduYWxlZCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgVmtFdmVudENyZWF0ZUluZm8gZXZlbnRfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBldmVudF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVFdmVudChtX2RldmljZS0+ZGV2aWNlKCksICZldmVudF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmV2ZW50KTsKKyAgICB2azo6Q21kU2V0RXZlbnQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIHZrOjpEZXN0cm95RXZlbnQobV9kZXZpY2UtPmRldmljZSgpLCBldmVudCwgbnVsbHB0cik7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAidGhhdCBpcyBpbnZhbGlkIGJlY2F1c2UgYm91bmQiKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEluVXNlRGVzdHJveWVkU2lnbmFsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVXNlIHZrQ21kRXhlY3V0ZUNvbW1hbmRzIHdpdGggaW52YWxpZCBzdGF0ZSBpbiBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXJzLiBEZWxldGUgb2JqZWN0cyB0aGF0IGFyZSBpbiB1c2UuICIKKyAgICAgICAgIkNhbGwgVmtRdWV1ZVN1Ym1pdCB3aXRoIGFuIGV2ZW50IHRoYXQgaGFzIGJlZW4gZGVsZXRlZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2VtYXBob3JlX2NyZWF0ZV9pbmZvID0ge307CisgICAgc2VtYXBob3JlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZSkpOworICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZlbmNlX2NyZWF0ZV9pbmZvID0ge307CisgICAgZmVuY2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTzsKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpDcmVhdGVGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksICZmZW5jZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmZlbmNlKSk7CisKKyAgICBWa0J1ZmZlclRlc3QgYnVmZmVyX3Rlc3QobV9kZXZpY2UsIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBwaXBlLmRlc2NyaXB0b3Jfc2V0Xy0+V3JpdGVEZXNjcmlwdG9yQnVmZmVySW5mbygwLCBidWZmZXJfdGVzdC5HZXRCdWZmZXIoKSwgMTAyNCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSKTsKKyAgICBwaXBlLmRlc2NyaXB0b3Jfc2V0Xy0+VXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKworICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgVmtFdmVudENyZWF0ZUluZm8gZXZlbnRfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBldmVudF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVFdmVudChtX2RldmljZS0+ZGV2aWNlKCksICZldmVudF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmV2ZW50KTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIHZrOjpDbWRTZXRFdmVudChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBldmVudCwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklUKTsKKworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV8pOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV9sYXlvdXRfLmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGUuZGVzY3JpcHRvcl9zZXRfLT5zZXRfLCAwLCBOVUxMKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgc3VibWl0X2luZm8uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgZmVuY2UpOworICAgIG1fZXJyb3JNb25pdG9yLT5SZXNldCgpOyAgLy8gcmVzdW1lIGxvZ21zZyBwcm9jZXNzaW5nCisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRGVzdHJveUV2ZW50LWV2ZW50LTAxMTQ1Iik7CisgICAgdms6OkRlc3Ryb3lFdmVudChtX2RldmljZS0+ZGV2aWNlKCksIGV2ZW50LCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtEZXN0cm95U2VtYXBob3JlLXNlbWFwaG9yZS0wMTEzNyIpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtEZXN0cm95RmVuY2UtZmVuY2UtMDExMjAiKTsKKyAgICB2azo6RGVzdHJveUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmVuY2UsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIklmIHNlbWFwaG9yZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHNlbWFwaG9yZSBtdXN0IGJlIGEgdmFsaWQgVmtTZW1hcGhvcmUgaGFuZGxlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBTZW1hcGhvcmUgb2JqIik7CisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzZW1hcGhvcmUsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIklmIGZlbmNlIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZmVuY2UgbXVzdCBiZSBhIHZhbGlkIFZrRmVuY2UgaGFuZGxlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBGZW5jZSBvYmoiKTsKKyAgICB2azo6RGVzdHJveUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmVuY2UsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIklmIGV2ZW50IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgZXZlbnQgbXVzdCBiZSBhIHZhbGlkIFZrRXZlbnQgaGFuZGxlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBFdmVudCBvYmoiKTsKKyAgICB2azo6RGVzdHJveUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgZXZlbnQsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEV2ZW50U3RhZ2VNYXNrT25lQ29tbWFuZEJ1ZmZlclBhc3MpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogY29tbWFuZEJ1ZmZlcjEobV9kZXZpY2UsIG1fY29tbWFuZFBvb2wpOworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjb21tYW5kQnVmZmVyMihtX2RldmljZSwgbV9jb21tYW5kUG9vbCk7CisKKyAgICBWa0V2ZW50IGV2ZW50OworICAgIFZrRXZlbnRDcmVhdGVJbmZvIGV2ZW50X2NyZWF0ZV9pbmZvID0ge307CisgICAgZXZlbnRfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTzsKKyAgICB2azo6Q3JlYXRlRXZlbnQobV9kZXZpY2UtPmRldmljZSgpLCAmZXZlbnRfY3JlYXRlX2luZm8sIG51bGxwdHIsICZldmVudCk7CisKKyAgICBjb21tYW5kQnVmZmVyMS5iZWdpbigpOworICAgIHZrOjpDbWRTZXRFdmVudChjb21tYW5kQnVmZmVyMS5oYW5kbGUoKSwgZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCk7CisgICAgdms6OkNtZFdhaXRFdmVudHMoY29tbWFuZEJ1ZmZlcjEuaGFuZGxlKCksIDEsICZldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULAorICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cik7CisgICAgY29tbWFuZEJ1ZmZlcjEuZW5kKCk7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRCdWZmZXIxLmhhbmRsZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisKKyAgICB2azo6RGVzdHJveUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgZXZlbnQsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEV2ZW50U3RhZ2VNYXNrT25lQ29tbWFuZEJ1ZmZlckZhaWwpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogY29tbWFuZEJ1ZmZlcjEobV9kZXZpY2UsIG1fY29tbWFuZFBvb2wpOworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjb21tYW5kQnVmZmVyMihtX2RldmljZSwgbV9jb21tYW5kUG9vbCk7CisKKyAgICBWa0V2ZW50IGV2ZW50OworICAgIFZrRXZlbnRDcmVhdGVJbmZvIGV2ZW50X2NyZWF0ZV9pbmZvID0ge307CisgICAgZXZlbnRfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTzsKKyAgICB2azo6Q3JlYXRlRXZlbnQobV9kZXZpY2UtPmRldmljZSgpLCAmZXZlbnRfY3JlYXRlX2luZm8sIG51bGxwdHIsICZldmVudCk7CisKKyAgICBjb21tYW5kQnVmZmVyMS5iZWdpbigpOworICAgIHZrOjpDbWRTZXRFdmVudChjb21tYW5kQnVmZmVyMS5oYW5kbGUoKSwgZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCk7CisgICAgLy8gd3Jvbmcgc3JjU3RhZ2VNYXNrCisgICAgdms6OkNtZFdhaXRFdmVudHMoY29tbWFuZEJ1ZmZlcjEuaGFuZGxlKCksIDEsICZldmVudCwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cik7CisgICAgY29tbWFuZEJ1ZmZlcjEuZW5kKCk7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRCdWZmZXIxLmhhbmRsZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRXYWl0RXZlbnRzLXNyY1N0YWdlTWFzay1wYXJhbWV0ZXIiKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIHZrOjpEZXN0cm95RXZlbnQobV9kZXZpY2UtPmRldmljZSgpLCBldmVudCwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRXZlbnRTdGFnZU1hc2tUd29Db21tYW5kQnVmZmVyUGFzcykgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjb21tYW5kQnVmZmVyMShtX2RldmljZSwgbV9jb21tYW5kUG9vbCk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRCdWZmZXIyKG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sKTsKKworICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgVmtFdmVudENyZWF0ZUluZm8gZXZlbnRfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBldmVudF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVFdmVudChtX2RldmljZS0+ZGV2aWNlKCksICZldmVudF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmV2ZW50KTsKKworICAgIGNvbW1hbmRCdWZmZXIxLmJlZ2luKCk7CisgICAgdms6OkNtZFNldEV2ZW50KGNvbW1hbmRCdWZmZXIxLmhhbmRsZSgpLCBldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklUKTsKKyAgICBjb21tYW5kQnVmZmVyMS5lbmQoKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZEJ1ZmZlcjEuaGFuZGxlKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKworICAgIGNvbW1hbmRCdWZmZXIyLmJlZ2luKCk7CisgICAgdms6OkNtZFdhaXRFdmVudHMoY29tbWFuZEJ1ZmZlcjIuaGFuZGxlKCksIDEsICZldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULAorICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cik7CisgICAgY29tbWFuZEJ1ZmZlcjIuZW5kKCk7CisKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZEJ1ZmZlcjIuaGFuZGxlKCk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIHZrOjpEZXN0cm95RXZlbnQobV9kZXZpY2UtPmRldmljZSgpLCBldmVudCwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRXZlbnRTdGFnZU1hc2tUd29Db21tYW5kQnVmZmVyRmFpbCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjb21tYW5kQnVmZmVyMShtX2RldmljZSwgbV9jb21tYW5kUG9vbCk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRCdWZmZXIyKG1fZGV2aWNlLCBtX2NvbW1hbmRQb29sKTsKKworICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgVmtFdmVudENyZWF0ZUluZm8gZXZlbnRfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBldmVudF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVFdmVudChtX2RldmljZS0+ZGV2aWNlKCksICZldmVudF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmV2ZW50KTsKKworICAgIGNvbW1hbmRCdWZmZXIxLmJlZ2luKCk7CisgICAgdms6OkNtZFNldEV2ZW50KGNvbW1hbmRCdWZmZXIxLmhhbmRsZSgpLCBldmVudCwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklUKTsKKyAgICBjb21tYW5kQnVmZmVyMS5lbmQoKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZEJ1ZmZlcjEuaGFuZGxlKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKworICAgIGNvbW1hbmRCdWZmZXIyLmJlZ2luKCk7CisgICAgLy8gd3Jvbmcgc3JjU3RhZ2VNYXNrCisgICAgdms6OkNtZFdhaXRFdmVudHMoY29tbWFuZEJ1ZmZlcjIuaGFuZGxlKCksIDEsICZldmVudCwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cik7CisgICAgY29tbWFuZEJ1ZmZlcjIuZW5kKCk7CisKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZEJ1ZmZlcjIuaGFuZGxlKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFdhaXRFdmVudHMtc3JjU3RhZ2VNYXNrLXBhcmFtZXRlciIpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworCisgICAgdms6OkRlc3Ryb3lFdmVudChtX2RldmljZS0+ZGV2aWNlKCksIGV2ZW50LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBRdWVyeVBvb2xQYXJ0aWFsVGltZXN0YW1wKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUmVxdWVzdCBwYXJ0aWFsIHJlc3VsdCBvbiB0aW1lc3RhbXAgcXVlcnkuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1F1ZXJ5UG9vbCBxdWVyeV9wb29sOworICAgIFZrUXVlcnlQb29sQ3JlYXRlSW5mbyBxdWVyeV9wb29sX2Npe307CisgICAgcXVlcnlfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk87CisgICAgcXVlcnlfcG9vbF9jaS5xdWVyeVR5cGUgPSBWS19RVUVSWV9UWVBFX1RJTUVTVEFNUDsKKyAgICBxdWVyeV9wb29sX2NpLnF1ZXJ5Q291bnQgPSAxOworICAgIHZrOjpDcmVhdGVRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcXVlcnlfcG9vbF9jaSwgbnVsbHB0ciwgJnF1ZXJ5X3Bvb2wpOworCisgICAgLy8gVXNlIHNldHVwIGFzIGEgcG9zaXRpdmUgdGVzdC4uLgorICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRSZXNldFF1ZXJ5UG9vbChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAxKTsKKyAgICB2azo6Q21kV3JpdGVUaW1lc3RhbXAobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBxdWVyeV9wb29sLCAwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgLy8gU3VibWl0IGNtZCBidWZmZXIgYW5kIHdhaXQgZm9yIGl0LgorICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIEF0dGVtcHQgdG8gb2J0YWluIHBhcnRpYWwgcmVzdWx0cy4KKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDA4MTgiKTsKKyAgICB1aW50MzJfdCBkYXRhX3NwYWNlWzE2XTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJDYW5ub3QgZ2V0IHF1ZXJ5IHJlc3VsdHMgb24gcXVlcnlQb29sIik7CisgICAgdms6OkdldFF1ZXJ5UG9vbFJlc3VsdHMobV9kZXZpY2UtPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAxLCBzaXplb2YoZGF0YV9zcGFjZSksICZkYXRhX3NwYWNlLCBzaXplb2YodWludDMyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVJZX1JFU1VMVF9QQVJUSUFMX0JJVCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBEZXN0cm95IHF1ZXJ5IHBvb2wuCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCBxdWVyeV9wb29sLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBRdWVyeVBvb2xJblVzZURlc3Ryb3llZFNpZ25hbGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiRGVsZXRlIGluLXVzZSBxdWVyeSBwb29sLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtRdWVyeVBvb2wgcXVlcnlfcG9vbDsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jaXt9OworICAgIHF1ZXJ5X3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY2kucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9USU1FU1RBTVA7CisgICAgcXVlcnlfcG9vbF9jaS5xdWVyeUNvdW50ID0gMTsKKyAgICB2azo6Q3JlYXRlUXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnF1ZXJ5X3Bvb2xfY2ksIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAvLyBVc2UgcXVlcnkgcG9vbCB0byBjcmVhdGUgYmluZGluZyB3aXRoIGNtZCBidWZmZXIKKyAgICB2azo6Q21kUmVzZXRRdWVyeVBvb2wobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMSk7CisgICAgdms6OkNtZFdyaXRlVGltZXN0YW1wKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwgcXVlcnlfcG9vbCwgMCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIC8vIFN1Ym1pdCBjbWQgYnVmZmVyIGFuZCB0aGVuIGRlc3Ryb3kgcXVlcnkgcG9vbCB3aGlsZSBpbi1mbGlnaHQKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtEZXN0cm95UXVlcnlQb29sLXF1ZXJ5UG9vbC0wMDc5MyIpOworICAgIHZrOjpEZXN0cm95UXVlcnlQb29sKG1fZGV2aWNlLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgLy8gTm93IHRoYXQgY21kIGJ1ZmZlciBkb25lIHdlIGNhbiBzYWZlbHkgZGVzdHJveSBxdWVyeV9wb29sCisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiSWYgcXVlcnlQb29sIGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgcXVlcnlQb29sIG11c3QgYmUgYSB2YWxpZCBWa1F1ZXJ5UG9vbCBoYW5kbGUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJVbmFibGUgdG8gcmVtb3ZlIFF1ZXJ5UG9vbCBvYmoiKTsKKyAgICB2azo6RGVzdHJveVF1ZXJ5UG9vbChtX2RldmljZS0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFBpcGVsaW5lSW5Vc2VEZXN0cm95ZWRTaWduYWxlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkRlbGV0ZSBpbi11c2UgcGlwZWxpbmUuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBpcGVsaW5lX2xheW91dChtX2RldmljZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRGVzdHJveVBpcGVsaW5lLXBpcGVsaW5lLTAwNzY1Iik7CisgICAgLy8gQ3JlYXRlIFBTTyB0byBiZSB1c2VkIGZvciBkcmF3LXRpbWUgZXJyb3JzIGJlbG93CisKKyAgICAvLyBTdG9yZSBwaXBlbGluZSBoYW5kbGUgc28gd2UgY2FuIGFjdHVhbGx5IGRlbGV0ZSBpdCBiZWZvcmUgdGVzdCBmaW5pc2hlcworICAgIFZrUGlwZWxpbmUgZGVsZXRlX3RoaXNfcGlwZWxpbmU7CisgICAgeyAgLy8gU2NvcGUgcGlwZWxpbmUgc28gaXQgd2lsbCBiZSBhdXRvLWRlbGV0ZWQKKyAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICAgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICAgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICAgICAgZGVsZXRlX3RoaXNfcGlwZWxpbmUgPSBwaXBlLnBpcGVsaW5lXzsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgIC8vIEJpbmQgcGlwZWxpbmUgdG8gY21kIGJ1ZmZlcgorICAgICAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUucGlwZWxpbmVfKTsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICAgICAgLy8gU3VibWl0IGNtZCBidWZmZXIgYW5kIHRoZW4gcGlwZWxpbmUgZGVzdHJveWVkIHdoaWxlIGluLWZsaWdodAorICAgICAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIH0gIC8vIFBpcGVsaW5lIGRlbGV0aW9uIHRyaWdnZXJlZCBoZXJlCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgLy8gTWFrZSBzdXJlIHF1ZXVlIGZpbmlzaGVkIGFuZCB0aGVuIGFjdHVhbGx5IGRlbGV0ZSBwaXBlbGluZQorICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJJZiBwaXBlbGluZSBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHBpcGVsaW5lIG11c3QgYmUgYSB2YWxpZCBWa1BpcGVsaW5lIGhhbmRsZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVuYWJsZSB0byByZW1vdmUgUGlwZWxpbmUgb2JqIik7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZShtX2RldmljZS0+aGFuZGxlKCksIGRlbGV0ZV90aGlzX3BpcGVsaW5lLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbWFnZVZpZXdJblVzZURlc3Ryb3llZFNpZ25hbGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiRGVsZXRlIGluLXVzZSBpbWFnZVZpZXcuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgTlVMTCwgJnNhbXBsZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0ltYWdlVmlldyB2aWV3ID0gaW1hZ2UudGFyZ2V0VmlldyhWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0pOworCisgICAgLy8gQ3JlYXRlIFBTTyB0byB1c2UgdGhlIHNhbXBsZXIKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NhbXBsZXJTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3BpcGUudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUuZHNsX2JpbmRpbmdzXyA9IHsKKyAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICB9OworICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bl9zdGF0ZXNbXSA9IHtWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1J9OworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGR5bl9zdGF0ZV9jaSA9IHt9OworICAgIGR5bl9zdGF0ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZHluX3N0YXRlX2NpLmR5bmFtaWNTdGF0ZUNvdW50ID0gc2l6ZShkeW5fc3RhdGVzKTsKKyAgICBkeW5fc3RhdGVfY2kucER5bmFtaWNTdGF0ZXMgPSBkeW5fc3RhdGVzOworICAgIHBpcGUuZHluX3N0YXRlX2NpXyA9IGR5bl9zdGF0ZV9jaTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworCisgICAgcGlwZS5kZXNjcmlwdG9yX3NldF8tPldyaXRlRGVzY3JpcHRvckltYWdlSW5mbygwLCB2aWV3LCBzYW1wbGVyLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUik7CisgICAgcGlwZS5kZXNjcmlwdG9yX3NldF8tPlVwZGF0ZURlc2NyaXB0b3JTZXRzKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRGVzdHJveUltYWdlVmlldy1pbWFnZVZpZXctMDEwMjYiKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIC8vIEJpbmQgcGlwZWxpbmUgdG8gY21kIGJ1ZmZlcgorICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV8pOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV9sYXlvdXRfLmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGUuZGVzY3JpcHRvcl9zZXRfLT5zZXRfLCAwLCBudWxscHRyKTsKKworICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MCwgMCwgMTYsIDE2LCAwLCAxfTsKKyAgICBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwgezE2LCAxNn19OworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmdmlld3BvcnQpOworICAgIHZrOjpDbWRTZXRTY2lzc29yKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZzY2lzc29yKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIC8vIFN1Ym1pdCBjbWQgYnVmZmVyIHRoZW4gZGVzdHJveSBzYW1wbGVyCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIC8vIFN1Ym1pdCBjbWQgYnVmZmVyIGFuZCB0aGVuIGRlc3Ryb3kgaW1hZ2VWaWV3IHdoaWxlIGluLWZsaWdodAorICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisKKyAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXcsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICAvLyBOb3cgd2UgY2FuIGFjdHVhbGx5IGRlc3Ryb3kgaW1hZ2VWaWV3CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiSWYgaW1hZ2VWaWV3IGlzIG5vdCBWS19OVUxMX0hBTkRMRSwgaW1hZ2VWaWV3IG11c3QgYmUgYSB2YWxpZCBWa0ltYWdlVmlldyBoYW5kbGUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJVbmFibGUgdG8gcmVtb3ZlIEltYWdlVmlldyBvYmoiKTsKKyAgICB2azo6RGVzdHJveVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCBzYW1wbGVyLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBCdWZmZXJWaWV3SW5Vc2VEZXN0cm95ZWRTaWduYWxlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkRlbGV0ZSBpbi11c2UgYnVmZmVyVmlldy4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleCA9IDA7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHt9OworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8uc2l6ZSA9IDEwMjQ7CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVDsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8ucFF1ZXVlRmFtaWx5SW5kaWNlcyA9ICZxdWV1ZV9mYW1pbHlfaW5kZXg7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZmVyX2NyZWF0ZV9pbmZvKTsKKworICAgIFZrQnVmZmVyVmlldyB2aWV3OworICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gYnZjaSA9IHt9OworICAgIGJ2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTzsKKyAgICBidmNpLmJ1ZmZlciA9IGJ1ZmZlci5oYW5kbGUoKTsKKyAgICBidmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJfU0ZMT0FUOworICAgIGJ2Y2kucmFuZ2UgPSBWS19XSE9MRV9TSVpFOworCisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlclZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmYnZjaSwgTlVMTCwgJnZpZXcpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTAsIHIzMmYpIHVuaWZvcm0gcmVhZG9ubHkgaW1hZ2VCdWZmZXIgcztcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB4ID0gaW1hZ2VMb2FkKHMsIDApO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7cGlwZS52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgcGlwZS5kc2xfYmluZGluZ3NfID0geworICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICB9OworICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bl9zdGF0ZXNbXSA9IHtWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1J9OworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGR5bl9zdGF0ZV9jaSA9IHt9OworICAgIGR5bl9zdGF0ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZHluX3N0YXRlX2NpLmR5bmFtaWNTdGF0ZUNvdW50ID0gc2l6ZShkeW5fc3RhdGVzKTsKKyAgICBkeW5fc3RhdGVfY2kucER5bmFtaWNTdGF0ZXMgPSBkeW5fc3RhdGVzOworICAgIHBpcGUuZHluX3N0YXRlX2NpXyA9IGR5bl9zdGF0ZV9jaTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworCisgICAgcGlwZS5kZXNjcmlwdG9yX3NldF8tPldyaXRlRGVzY3JpcHRvckJ1ZmZlclZpZXcoMCwgdmlldywgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSKTsKKyAgICBwaXBlLmRlc2NyaXB0b3Jfc2V0Xy0+VXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtEZXN0cm95QnVmZmVyVmlldy1idWZmZXJWaWV3LTAwOTM2Iik7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAsIDAsIDE2LCAxNiwgMCwgMX07CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgVmtSZWN0MkQgc2Npc3NvciA9IHt7MCwgMH0sIHsxNiwgMTZ9fTsKKyAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmc2Npc3Nvcik7CisgICAgLy8gQmluZCBwaXBlbGluZSB0byBjbWQgYnVmZmVyCisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lXyk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZS5kZXNjcmlwdG9yX3NldF8tPnNldF8sIDAsIG51bGxwdHIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIC8vIFN1Ym1pdCBjbWQgYnVmZmVyIGFuZCB0aGVuIGRlc3Ryb3kgYnVmZmVyVmlldyB3aGlsZSBpbi1mbGlnaHQKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworCisgICAgdms6OkRlc3Ryb3lCdWZmZXJWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldywgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIC8vIE5vdyB3ZSBjYW4gYWN0dWFsbHkgZGVzdHJveSBidWZmZXJWaWV3CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiSWYgYnVmZmVyVmlldyBpcyBub3QgVktfTlVMTF9IQU5ETEUsIGJ1ZmZlclZpZXcgbXVzdCBiZSBhIHZhbGlkIFZrQnVmZmVyVmlldyBoYW5kbGUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJVbmFibGUgdG8gcmVtb3ZlIEJ1ZmZlclZpZXcgb2JqIik7CisgICAgdms6OkRlc3Ryb3lCdWZmZXJWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldywgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU2FtcGxlckluVXNlRGVzdHJveWVkU2lnbmFsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJEZWxldGUgaW4tdXNlIHNhbXBsZXIuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgZXJyID0gdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgTlVMTCwgJnNhbXBsZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0ltYWdlVmlldyB2aWV3ID0gaW1hZ2UudGFyZ2V0VmlldyhWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0pOworCisgICAgLy8gQ3JlYXRlIFBTTyB0byB1c2UgdGhlIHNhbXBsZXIKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NhbXBsZXJTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3BpcGUudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUuZHNsX2JpbmRpbmdzXyA9IHsKKyAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICB9OworICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bl9zdGF0ZXNbXSA9IHtWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1J9OworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGR5bl9zdGF0ZV9jaSA9IHt9OworICAgIGR5bl9zdGF0ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZHluX3N0YXRlX2NpLmR5bmFtaWNTdGF0ZUNvdW50ID0gc2l6ZShkeW5fc3RhdGVzKTsKKyAgICBkeW5fc3RhdGVfY2kucER5bmFtaWNTdGF0ZXMgPSBkeW5fc3RhdGVzOworICAgIHBpcGUuZHluX3N0YXRlX2NpXyA9IGR5bl9zdGF0ZV9jaTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworCisgICAgcGlwZS5kZXNjcmlwdG9yX3NldF8tPldyaXRlRGVzY3JpcHRvckltYWdlSW5mbygwLCB2aWV3LCBzYW1wbGVyLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUik7CisgICAgcGlwZS5kZXNjcmlwdG9yX3NldF8tPlVwZGF0ZURlc2NyaXB0b3JTZXRzKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrRGVzdHJveVNhbXBsZXItc2FtcGxlci0wMTA4MiIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgLy8gQmluZCBwaXBlbGluZSB0byBjbWQgYnVmZmVyCisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lXyk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZS5kZXNjcmlwdG9yX3NldF8tPnNldF8sIDAsIG51bGxwdHIpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgLy8gU3VibWl0IGNtZCBidWZmZXIgdGhlbiBkZXN0cm95IHNhbXBsZXIKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgLy8gU3VibWl0IGNtZCBidWZmZXIgYW5kIHRoZW4gZGVzdHJveSBzYW1wbGVyIHdoaWxlIGluLWZsaWdodAorICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisKKyAgICB2azo6RGVzdHJveVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCBzYW1wbGVyLCBudWxscHRyKTsgIC8vIERlc3Ryb3llZCB0b28gc29vbgorICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIC8vIE5vdyB3ZSBjYW4gYWN0dWFsbHkgZGVzdHJveSBzYW1wbGVyCisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiSWYgc2FtcGxlciBpcyBub3QgVktfTlVMTF9IQU5ETEUsIHNhbXBsZXIgbXVzdCBiZSBhIHZhbGlkIFZrU2FtcGxlciBoYW5kbGUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJVbmFibGUgdG8gcmVtb3ZlIFNhbXBsZXIgb2JqIik7CisgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2FtcGxlciwgTlVMTCk7ICAvLyBEZXN0cm95ZWQgZm9yIHJlYWwKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBRdWV1ZUZvcndhcmRQcm9ncmVzc0ZlbmNlV2FpdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNhbGwgVmtRdWV1ZVN1Ym1pdCB3aXRoIGEgc2VtYXBob3JlIHRoYXQgaXMgYWxyZWFkeSBzaWduYWxlZCBidXQgbm90IHdhaXRlZCBvbiBieSB0aGUgcXVldWUuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCBjaGFyICpxdWV1ZV9mb3J3YXJkX3Byb2dyZXNzX21lc3NhZ2UgPSAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtUXVldWVGb3J3YXJkUHJvZ3Jlc3MiOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNiMShtX2RldmljZSwgbV9jb21tYW5kUG9vbCk7CisgICAgY2IxLmJlZ2luKCk7CisgICAgY2IxLmVuZCgpOworCisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNlbWFwaG9yZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIHNlbWFwaG9yZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTzsKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkNyZWF0ZVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksICZzZW1hcGhvcmVfY3JlYXRlX2luZm8sIG51bGxwdHIsICZzZW1hcGhvcmUpKTsKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNiMS5oYW5kbGUoKTsKKyAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHF1ZXVlX2ZvcndhcmRfcHJvZ3Jlc3NfbWVzc2FnZSk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXZpY2VXYWl0SWRsZShtX2RldmljZS0+ZGV2aWNlKCkpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlLCBudWxscHRyKTsKK30KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKK1RFU1RfRihWa0xheWVyVGVzdCwgVGhyZWFkQ29tbWFuZEJ1ZmZlckNvbGxpc2lvbikgeworICAgIHRlc3RfcGxhdGZvcm1fdGhyZWFkIHRocmVhZDsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlRIUkVBRElORyBFUlJPUiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRBbGxvd2VkRmFpbHVyZU1zZygiVEhSRUFESU5HIEVSUk9SIik7ICAvLyBJZ25vcmUgYW55IGV4dHJhIHRocmVhZGluZyBlcnJvcnMgZm91bmQgYmV5b25kIHRoZSBmaXJzdCBvbmUKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBDYWxscyBBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRCdWZmZXIobV9kZXZpY2UsIG1fY29tbWFuZFBvb2wpOworCisgICAgY29tbWFuZEJ1ZmZlci5iZWdpbigpOworCisgICAgVmtFdmVudENyZWF0ZUluZm8gZXZlbnRfaW5mbzsKKyAgICBWa0V2ZW50IGV2ZW50OworICAgIFZrUmVzdWx0IGVycjsKKworICAgIG1lbXNldCgmZXZlbnRfaW5mbywgMCwgc2l6ZW9mKGV2ZW50X2luZm8pKTsKKyAgICBldmVudF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisKKyAgICBlcnIgPSB2azo6Q3JlYXRlRXZlbnQoZGV2aWNlKCksICZldmVudF9pbmZvLCBOVUxMLCAmZXZlbnQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBlcnIgPSB2azo6UmVzZXRFdmVudChkZXZpY2UoKSwgZXZlbnQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfc3RydWN0IGRhdGE7CisgICAgZGF0YS5jb21tYW5kQnVmZmVyID0gY29tbWFuZEJ1ZmZlci5oYW5kbGUoKTsKKyAgICBkYXRhLmV2ZW50ID0gZXZlbnQ7CisgICAgYm9vbCBiYWlsb3V0ID0gZmFsc2U7CisgICAgZGF0YS5iYWlsb3V0ID0gJmJhaWxvdXQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldEJhaWxvdXQoZGF0YS5iYWlsb3V0KTsKKworICAgIC8vIEZpcnN0IGRvIHNvbWUgY29ycmVjdCBvcGVyYXRpb25zIHVzaW5nIG11bHRpcGxlIHRocmVhZHMuCisgICAgLy8gQWRkIG1hbnkgZW50cmllcyB0byBjb21tYW5kIGJ1ZmZlciBmcm9tIGFub3RoZXIgdGhyZWFkLgorICAgIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBBZGRUb0NvbW1hbmRCdWZmZXIsICh2b2lkICopJmRhdGEpOworICAgIC8vIE1ha2Ugbm9uLWNvbmZsaWN0aW5nIGNhbGxzIGZyb20gdGhpcyB0aHJlYWQgYXQgdGhlIHNhbWUgdGltZS4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDgwMDAwOyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgY291bnQ7CisgICAgICAgIHZrOjpFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UoKSwgJmNvdW50LCBOVUxMKTsKKyAgICB9CisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfam9pbih0aHJlYWQsIE5VTEwpOworCisgICAgLy8gVGhlbiBkbyBzb21lIGluY29ycmVjdCBvcGVyYXRpb25zIHVzaW5nIG11bHRpcGxlIHRocmVhZHMuCisgICAgLy8gQWRkIG1hbnkgZW50cmllcyB0byBjb21tYW5kIGJ1ZmZlciBmcm9tIGFub3RoZXIgdGhyZWFkLgorICAgIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBBZGRUb0NvbW1hbmRCdWZmZXIsICh2b2lkICopJmRhdGEpOworICAgIC8vIEFkZCBtYW55IGVudHJpZXMgdG8gY29tbWFuZCBidWZmZXIgZnJvbSB0aGlzIHRocmVhZCBhdCB0aGUgc2FtZSB0aW1lLgorICAgIEFkZFRvQ29tbWFuZEJ1ZmZlcigmZGF0YSk7CisKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF9qb2luKHRocmVhZCwgTlVMTCk7CisgICAgY29tbWFuZEJ1ZmZlci5lbmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRCYWlsb3V0KE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveUV2ZW50KGRldmljZSgpLCBldmVudCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVGhyZWFkVXBkYXRlRGVzY3JpcHRvckNvbGxpc2lvbikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlR3byB0aHJlYWRzIHVwZGF0aW5nIHRoZSBzYW1lIGRlc2NyaXB0b3Igc2V0LCBleHBlY3RlZCB0byBnZW5lcmF0ZSBhIHRocmVhZGluZyBlcnJvciIpOworICAgIHRlc3RfcGxhdGZvcm1fdGhyZWFkIHRocmVhZDsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlRIUkVBRElORyBFUlJPUiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRBbGxvd2VkRmFpbHVyZU1zZygiVEhSRUFESU5HIEVSUk9SIik7ICAvLyBJZ25vcmUgYW55IGV4dHJhIHRocmVhZGluZyBlcnJvcnMgZm91bmQgYmV5b25kIHRoZSBmaXJzdCBvbmUKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IG5vcm1hbF9kZXNjcmlwdG9yX3NldChtX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBidWZmZXIuaW5pdCgqbV9kZXZpY2UsIDI1NiwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQsIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQpOworCisgICAgc3RydWN0IHRocmVhZF9kYXRhX3N0cnVjdCBkYXRhOworICAgIGRhdGEuZGV2aWNlID0gZGV2aWNlKCk7CisgICAgZGF0YS5kZXNjcmlwdG9yU2V0ID0gbm9ybWFsX2Rlc2NyaXB0b3Jfc2V0LnNldF87CisgICAgZGF0YS5iaW5kaW5nID0gMDsKKyAgICBkYXRhLmJ1ZmZlciA9IGJ1ZmZlci5oYW5kbGUoKTsKKyAgICBib29sIGJhaWxvdXQgPSBmYWxzZTsKKyAgICBkYXRhLmJhaWxvdXQgPSAmYmFpbG91dDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0QmFpbG91dChkYXRhLmJhaWxvdXQpOworCisgICAgLy8gVXBkYXRlIGRlc2NyaXB0b3JzIGZyb20gYW5vdGhlciB0aHJlYWQuCisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIFVwZGF0ZURlc2NyaXB0b3IsICh2b2lkICopJmRhdGEpOworICAgIC8vIFVwZGF0ZSBkZXNjcmlwdG9ycyBmcm9tIHRoaXMgdGhyZWFkIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfc3RydWN0IGRhdGEyOworICAgIGRhdGEyLmRldmljZSA9IGRldmljZSgpOworICAgIGRhdGEyLmRlc2NyaXB0b3JTZXQgPSBub3JtYWxfZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBkYXRhMi5iaW5kaW5nID0gMTsKKyAgICBkYXRhMi5idWZmZXIgPSBidWZmZXIuaGFuZGxlKCk7CisgICAgZGF0YTIuYmFpbG91dCA9ICZiYWlsb3V0OworCisgICAgVXBkYXRlRGVzY3JpcHRvcigmZGF0YTIpOworCisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfam9pbih0aHJlYWQsIE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldEJhaWxvdXQoTlVMTCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBUaHJlYWRVcGRhdGVEZXNjcmlwdG9yVXBkYXRlQWZ0ZXJCaW5kTm9Db2xsaXNpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUd28gdGhyZWFkcyB1cGRhdGluZyB0aGUgc2FtZSBVQUIgZGVzY3JpcHRvciBzZXQsIGV4cGVjdGVkIG5vdCB0byBnZW5lcmF0ZSBhIHRocmVhZGluZyBlcnJvciIpOworICAgIHRlc3RfcGxhdGZvcm1fdGhyZWFkIHRocmVhZDsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9ERVNDUklQVE9SX0lOREVYSU5HX0VYVEVOU0lPTl9OQU1FKSAmJgorICAgICAgICBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX0RFU0NSSVBUT1JfSU5ERVhJTkdfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTNfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGVzY3JpcHRvciBJbmRleGluZyBvciBNYWludGVuYW5jZTMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGRldmljZSB0aGF0IGVuYWJsZXMgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kCisgICAgYXV0byBpbmRleGluZ19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRGVzY3JpcHRvckluZGV4aW5nRmVhdHVyZXNFWFQ+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmluZGV4aW5nX2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgIGlmIChWS19GQUxTRSA9PSBpbmRleGluZ19mZWF0dXJlcy5kZXNjcmlwdG9yQmluZGluZ1N0b3JhZ2VCdWZmZXJVcGRhdGVBZnRlckJpbmQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IHJlcXVpcmVzICh1bnN1cHBvcnRlZCkgZGVzY3JpcHRvckJpbmRpbmdTdG9yYWdlQnVmZmVyVXBkYXRlQWZ0ZXJCaW5kLCBza2lwcGluZ1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZmZWF0dXJlczIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBzdGQ6OmFycmF5PFZrRGVzY3JpcHRvckJpbmRpbmdGbGFnc0VYVCwgMj4gZmxhZ3MgPSB7VktfREVTQ1JJUFRPUl9CSU5ESU5HX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFU0NSSVBUT1JfQklORElOR19VUERBVEVfQUZURVJfQklORF9CSVRfRVhUfTsKKyAgICBhdXRvIGZsYWdzX2NyZWF0ZV9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmdGbGFnc0NyZWF0ZUluZm9FWFQ+KCk7CisgICAgZmxhZ3NfY3JlYXRlX2luZm8uYmluZGluZ0NvdW50ID0gKHVpbnQzMl90KWZsYWdzLnNpemUoKTsKKyAgICBmbGFnc19jcmVhdGVfaW5mby5wQmluZGluZ0ZsYWdzID0gZmxhZ3MuZGF0YSgpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBub3JtYWxfZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9VUERBVEVfQUZURVJfQklORF9QT09MX0JJVF9FWFQsICZmbGFnc19jcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX1VQREFURV9BRlRFUl9CSU5EX0JJVF9FWFQpOworCisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgMjU2LCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCwgVktfQlVGRkVSX1VTQUdFX1NUT1JBR0VfQlVGRkVSX0JJVCk7CisKKyAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfc3RydWN0IGRhdGE7CisgICAgZGF0YS5kZXZpY2UgPSBkZXZpY2UoKTsKKyAgICBkYXRhLmRlc2NyaXB0b3JTZXQgPSBub3JtYWxfZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBkYXRhLmJpbmRpbmcgPSAwOworICAgIGRhdGEuYnVmZmVyID0gYnVmZmVyLmhhbmRsZSgpOworICAgIGJvb2wgYmFpbG91dCA9IGZhbHNlOworICAgIGRhdGEuYmFpbG91dCA9ICZiYWlsb3V0OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRCYWlsb3V0KGRhdGEuYmFpbG91dCk7CisKKyAgICAvLyBVcGRhdGUgZGVzY3JpcHRvcnMgZnJvbSBhbm90aGVyIHRocmVhZC4KKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF9jcmVhdGUoJnRocmVhZCwgVXBkYXRlRGVzY3JpcHRvciwgKHZvaWQgKikmZGF0YSk7CisgICAgLy8gVXBkYXRlIGRlc2NyaXB0b3JzIGZyb20gdGhpcyB0aHJlYWQgYXQgdGhlIHNhbWUgdGltZS4KKworICAgIHN0cnVjdCB0aHJlYWRfZGF0YV9zdHJ1Y3QgZGF0YTI7CisgICAgZGF0YTIuZGV2aWNlID0gZGV2aWNlKCk7CisgICAgZGF0YTIuZGVzY3JpcHRvclNldCA9IG5vcm1hbF9kZXNjcmlwdG9yX3NldC5zZXRfOworICAgIGRhdGEyLmJpbmRpbmcgPSAxOworICAgIGRhdGEyLmJ1ZmZlciA9IGJ1ZmZlci5oYW5kbGUoKTsKKyAgICBkYXRhMi5iYWlsb3V0ID0gJmJhaWxvdXQ7CisKKyAgICBVcGRhdGVEZXNjcmlwdG9yKCZkYXRhMik7CisKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF9qb2luKHRocmVhZCwgTlVMTCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0QmFpbG91dChOVUxMKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKK1RFU1RfRihWa0xheWVyVGVzdCwgRXhlY3V0ZVVucmVjb3JkZWRQcmltYXJ5Q0IpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHZrUXVldWVTdWJtaXQgd2l0aCBhIENCIGluIHRoZSBpbml0aWFsIHN0YXRlIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICAvLyBuZXZlciByZWNvcmQgbV9jb21tYW5kQnVmZmVyCisKKyAgICBWa1N1Ym1pdEluZm8gc2kgPSB7fTsKKyAgICBzaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHNpLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc2kucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAwMDcyIik7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc2ksIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNYWludGVuYW5jZTFBbmROZWdhdGl2ZVZpZXdwb3J0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byBlbmFibGUgQU1EX25lZ2F0aXZlX3ZpZXdwb3J0X2hlaWdodCBhbmQgTWFpbnRlbmFuY2UxX0tIUiBleHRlbnNpb24gc2ltdWx0YW5lb3VzbHkiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmICghKChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKSAmJgorICAgICAgICAgIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0FNRF9ORUdBVElWRV9WSUVXUE9SVF9IRUlHSFRfRVhURU5TSU9OX05BTUUpKSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBNYWludGVuYW5jZTEgYW5kIEFNRF9uZWdhdGl2ZSB2aWV3cG9ydCBoZWlnaHQgZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgdmtfdGVzdGluZzo6UXVldWVDcmVhdGVJbmZvQXJyYXkgcXVldWVfaW5mbyhtX2RldmljZS0+cXVldWVfcHJvcHMpOworICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbl9uYW1lc1syXSA9IHsiVktfS0hSX21haW50ZW5hbmNlMSIsICJWS19BTURfbmVnYXRpdmVfdmlld3BvcnRfaGVpZ2h0In07CisgICAgVmtEZXZpY2UgdGVzdERldmljZTsKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gZGV2aWNlX2NyZWF0ZV9pbmZvID0ge307CisgICAgYXV0byBmZWF0dXJlcyA9IG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworICAgIGRldmljZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTzsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGRldmljZV9jcmVhdGVfaW5mby5xdWV1ZUNyZWF0ZUluZm9Db3VudCA9IHF1ZXVlX2luZm8uc2l6ZSgpOworICAgIGRldmljZV9jcmVhdGVfaW5mby5wUXVldWVDcmVhdGVJbmZvcyA9IHF1ZXVlX2luZm8uZGF0YSgpOworICAgIGRldmljZV9jcmVhdGVfaW5mby5lbmFibGVkTGF5ZXJDb3VudCA9IDA7CisgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBwRW5hYmxlZExheWVyTmFtZXMgPSBOVUxMOworICAgIGRldmljZV9jcmVhdGVfaW5mby5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSAyOworICAgIGRldmljZV9jcmVhdGVfaW5mby5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IChjb25zdCBjaGFyICpjb25zdCAqKWV4dGVuc2lvbl9uYW1lczsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucEVuYWJsZWRGZWF0dXJlcyA9ICZmZWF0dXJlczsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtEZXZpY2VDcmVhdGVJbmZvLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAwMzc0Iik7CisgICAgLy8gVGhlIGZvbGxvd2luZyB1bmV4cGVjdGVkIGVycm9yIGlzIGNvbWluZyBmcm9tIHRoZSBMdW5hckcgbG9hZGVyLiBEbyBub3QgbWFrZSBpdCBhIGRlc2lyZWQgbWVzc2FnZSBiZWNhdXNlIHBsYXRmb3JtcyB0aGF0IGRvCisgICAgLy8gbm90IHVzZSB0aGUgTHVuYXJHIGxvYWRlciAoZS5nLiBBbmRyb2lkKSB3aWxsIG5vdCBzZWUgdGhlIG1lc3NhZ2UgYW5kIHRoZSB0ZXN0IHdpbGwgZmFpbC4KKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGRldmljZSBjaGFpbi4iKTsKKyAgICB2azo6Q3JlYXRlRGV2aWNlKGdwdSgpLCAmZGV2aWNlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmdGVzdERldmljZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW5zdGFuY2VEZWJ1Z1JlcG9ydENhbGxiYWNrKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IGEgcE5leHQtaW5zdGFsbGVkIGRlYnVnIGNhbGxiYWNrIHdpbGwgY2F0Y2ggYSBDcmVhdGVJbnN0YW5jZS10aW1lIGVycm9yLiIpOworCisgICAgLy8gVGhpcyBpbnN0YW5jZSBleHRlbnNpb24gcmVxdWlyZXMgdGhhdCB0aGUgVktfS0hSX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllczIgYWxzbyBiZSBlbmFibGVkCisgICAgaWYgKCFJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfU1VSRkFDRV9QUk9URUNURURfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9TVVJGQUNFX1BST1RFQ1RFRF9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NyZWF0ZUluc3RhbmNlLXBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLTAxMzg4Iik7CisgICAgLy8gRW5hYmxlIHRoZSBpbnN0YW5jZSBleHRlbnNpb24sIGJ1dCBub25lIG9mIHRoZSBleHRlbnNpb25zIGl0IGRlcGVuZHMgb24KKyAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NVUkZBQ0VfUFJPVEVDVEVEX0NBUEFCSUxJVElFU19FWFRFTlNJT05fTkFNRSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSG9zdFF1ZXJ5UmVzZXROb3RFbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVXNlIHZrUmVzZXRRdWVyeVBvb2xFWFQgd2l0aG91dCBlbmFibGluZyB0aGUgZmVhdHVyZSIpOworCisgICAgaWYgKCFJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKCFEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9IT1NUX1FVRVJZX1JFU0VUX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBub3Qgc3VwcG9ydGVkIGJ5IGRldmljZTsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9IT1NUX1FVRVJZX1JFU0VUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBhdXRvIGZwdmtSZXNldFF1ZXJ5UG9vbEVYVCA9IChQRk5fdmtSZXNldFF1ZXJ5UG9vbEVYVCl2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtSZXNldFF1ZXJ5UG9vbEVYVCIpOworCisgICAgVmtRdWVyeVBvb2wgcXVlcnlfcG9vbDsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jcmVhdGVfaW5mb3t9OworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9USU1FU1RBTVA7CisgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5xdWVyeUNvdW50ID0gMTsKKyAgICB2azo6Q3JlYXRlUXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1Ob25lLTAyNjY1Iik7CisgICAgZnB2a1Jlc2V0UXVlcnlQb29sRVhUKG1fZGV2aWNlLT5kZXZpY2UoKSwgcXVlcnlfcG9vbCwgMCwgMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksIHF1ZXJ5X3Bvb2wsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEhvc3RRdWVyeVJlc2V0QmFkRmlyc3RRdWVyeSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkJhZCBmaXJzdFF1ZXJ5IGluIHZrUmVzZXRRdWVyeVBvb2xFWFQiKTsKKworICAgIGlmICghSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmICghRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgbm90IHN1cHBvcnRlZCBieSBkZXZpY2U7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfRVhUX0hPU1RfUVVFUllfUkVTRVRfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCBob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVze307CisgICAgaG9zdF9xdWVyeV9yZXNldF9mZWF0dXJlcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9IT1NUX1FVRVJZX1JFU0VUX0ZFQVRVUkVTX0VYVDsKKyAgICBob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVzLmhvc3RRdWVyeVJlc2V0ID0gVktfVFJVRTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgcGRfZmVhdHVyZXMye307CisgICAgcGRfZmVhdHVyZXMyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzI7CisgICAgcGRfZmVhdHVyZXMyLnBOZXh0ID0gJmhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXM7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBkX2ZlYXR1cmVzMikpOworCisgICAgYXV0byBmcHZrUmVzZXRRdWVyeVBvb2xFWFQgPSAoUEZOX3ZrUmVzZXRRdWVyeVBvb2xFWFQpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrUmVzZXRRdWVyeVBvb2xFWFQiKTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm97fTsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlDb3VudCA9IDE7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtZmlyc3RRdWVyeS0wMjY2NiIpOworICAgIGZwdmtSZXNldFF1ZXJ5UG9vbEVYVChtX2RldmljZS0+ZGV2aWNlKCksIHF1ZXJ5X3Bvb2wsIDEsIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBIb3N0UXVlcnlSZXNldEJhZFJhbmdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQmFkIHJhbmdlIGluIHZrUmVzZXRRdWVyeVBvb2xFWFQiKTsKKworICAgIGlmICghSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmICghRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgbm90IHN1cHBvcnRlZCBieSBkZXZpY2U7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfRVhUX0hPU1RfUVVFUllfUkVTRVRfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCBob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVze307CisgICAgaG9zdF9xdWVyeV9yZXNldF9mZWF0dXJlcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9IT1NUX1FVRVJZX1JFU0VUX0ZFQVRVUkVTX0VYVDsKKyAgICBob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVzLmhvc3RRdWVyeVJlc2V0ID0gVktfVFJVRTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgcGRfZmVhdHVyZXMye307CisgICAgcGRfZmVhdHVyZXMyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzI7CisgICAgcGRfZmVhdHVyZXMyLnBOZXh0ID0gJmhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXM7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBkX2ZlYXR1cmVzMikpOworCisgICAgYXV0byBmcHZrUmVzZXRRdWVyeVBvb2xFWFQgPSAoUEZOX3ZrUmVzZXRRdWVyeVBvb2xFWFQpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrUmVzZXRRdWVyeVBvb2xFWFQiKTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm97fTsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlDb3VudCA9IDE7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrUmVzZXRRdWVyeVBvb2xFWFQtZmlyc3RRdWVyeS0wMjY2NyIpOworICAgIGZwdmtSZXNldFF1ZXJ5UG9vbEVYVChtX2RldmljZS0+ZGV2aWNlKCksIHF1ZXJ5X3Bvb2wsIDAsIDIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBIb3N0UXVlcnlSZXNldEludmFsaWRRdWVyeVBvb2wpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJJbnZhbGlkIHF1ZXJ5UG9vbCBpbiB2a1Jlc2V0UXVlcnlQb29sRVhUIik7CisKKyAgICBpZiAoIUluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgaW5zdGFuY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoIURldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX0hPU1RfUVVFUllfUkVTRVRfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0VYVF9IT1NUX1FVRVJZX1JFU0VUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX0hPU1RfUVVFUllfUkVTRVRfRVhURU5TSU9OX05BTUUpOworCisgICAgVmtQaHlzaWNhbERldmljZUhvc3RRdWVyeVJlc2V0RmVhdHVyZXNFWFQgaG9zdF9xdWVyeV9yZXNldF9mZWF0dXJlc3t9OworICAgIGhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSE9TVF9RVUVSWV9SRVNFVF9GRUFUVVJFU19FWFQ7CisgICAgaG9zdF9xdWVyeV9yZXNldF9mZWF0dXJlcy5ob3N0UXVlcnlSZXNldCA9IFZLX1RSVUU7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHBkX2ZlYXR1cmVzMnt9OworICAgIHBkX2ZlYXR1cmVzMi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yOworICAgIHBkX2ZlYXR1cmVzMi5wTmV4dCA9ICZob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVzOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZwZF9mZWF0dXJlczIpKTsKKworICAgIGF1dG8gZnB2a1Jlc2V0UXVlcnlQb29sRVhUID0gKFBGTl92a1Jlc2V0UXVlcnlQb29sRVhUKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a1Jlc2V0UXVlcnlQb29sRVhUIik7CisKKyAgICAvLyBDcmVhdGUgYW5kIGRlc3Ryb3kgYSBxdWVyeSBwb29sLgorICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm97fTsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlDb3VudCA9IDE7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBudWxscHRyKTsKKworICAgIC8vIEF0dGVtcHQgdG8gcmV1c2UgdGhlIHF1ZXJ5IHBvb2wgaGFuZGxlLgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtSZXNldFF1ZXJ5UG9vbEVYVC1xdWVyeVBvb2wtcGFyYW1ldGVyIik7CisgICAgZnB2a1Jlc2V0UXVlcnlQb29sRVhUKG1fZGV2aWNlLT5kZXZpY2UoKSwgcXVlcnlfcG9vbCwgMCwgMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSG9zdFF1ZXJ5UmVzZXRXcm9uZ0RldmljZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkRldmljZSBub3QgbWF0Y2hpbmcgcXVlcnlQb29sIGluIHZrUmVzZXRRdWVyeVBvb2xFWFQiKTsKKworICAgIGlmICghSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmICghRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgbm90IHN1cHBvcnRlZCBieSBkZXZpY2U7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfRVhUX0hPU1RfUVVFUllfUkVTRVRfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVCBob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVze307CisgICAgaG9zdF9xdWVyeV9yZXNldF9mZWF0dXJlcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9IT1NUX1FVRVJZX1JFU0VUX0ZFQVRVUkVTX0VYVDsKKyAgICBob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVzLmhvc3RRdWVyeVJlc2V0ID0gVktfVFJVRTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgcGRfZmVhdHVyZXMye307CisgICAgcGRfZmVhdHVyZXMyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzI7CisgICAgcGRfZmVhdHVyZXMyLnBOZXh0ID0gJmhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXM7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBkX2ZlYXR1cmVzMikpOworCisgICAgYXV0byBmcHZrUmVzZXRRdWVyeVBvb2xFWFQgPSAoUEZOX3ZrUmVzZXRRdWVyeVBvb2xFWFQpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrUmVzZXRRdWVyeVBvb2xFWFQiKTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm97fTsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlDb3VudCA9IDE7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisKKyAgICAvLyBDcmVhdGUgYSBzZWNvbmQgZGV2aWNlIHdpdGggdGhlIGZlYXR1cmUgZW5hYmxlZC4KKyAgICB2a190ZXN0aW5nOjpRdWV1ZUNyZWF0ZUluZm9BcnJheSBxdWV1ZV9pbmZvKG1fZGV2aWNlLT5xdWV1ZV9wcm9wcyk7CisgICAgYXV0byBmZWF0dXJlcyA9IG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworCisgICAgVmtEZXZpY2VDcmVhdGVJbmZvIGRldmljZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIGRldmljZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTzsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucE5leHQgPSAmaG9zdF9xdWVyeV9yZXNldF9mZWF0dXJlczsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucXVldWVDcmVhdGVJbmZvQ291bnQgPSBxdWV1ZV9pbmZvLnNpemUoKTsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucFF1ZXVlQ3JlYXRlSW5mb3MgPSBxdWV1ZV9pbmZvLmRhdGEoKTsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucEVuYWJsZWRGZWF0dXJlcyA9ICZmZWF0dXJlczsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8uZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnNpemUoKTsKKyAgICBkZXZpY2VfY3JlYXRlX2luZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBtX2RldmljZV9leHRlbnNpb25fbmFtZXMuZGF0YSgpOworCisgICAgVmtEZXZpY2Ugc2Vjb25kX2RldmljZTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6Q3JlYXRlRGV2aWNlKGdwdSgpLCAmZGV2aWNlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmc2Vjb25kX2RldmljZSkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a1Jlc2V0UXVlcnlQb29sRVhULXF1ZXJ5UG9vbC1wYXJlbnQiKTsKKyAgICAvLyBSdW4gdms6OlJlc2V0UXVlcnlQb29sRXh0IG9uIHRoZSB3cm9uZyBkZXZpY2UuCisgICAgZnB2a1Jlc2V0UXVlcnlQb29sRVhUKHNlY29uZF9kZXZpY2UsIHF1ZXJ5X3Bvb2wsIDAsIDEpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveURldmljZShzZWNvbmRfZGV2aWNlLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBSZXNldEV2ZW50VGhlblNldCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlJlc2V0IGFuIGV2ZW50IHRoZW4gc2V0IGl0IGFmdGVyIHRoZSByZXNldCBoYXMgYmVlbiBzdWJtaXR0ZWQuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIFZrRXZlbnQgZXZlbnQ7CisgICAgVmtFdmVudENyZWF0ZUluZm8gZXZlbnRfY3JlYXRlX2luZm97fTsKKyAgICBldmVudF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VWRU5UX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVFdmVudChtX2RldmljZS0+ZGV2aWNlKCksICZldmVudF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmV2ZW50KTsKKworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZF9wb29sOworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHBvb2xfY3JlYXRlX2luZm97fTsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPOworICAgIHBvb2xfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLmZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ7CisgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb21tYW5kX3Bvb2wpOworCisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyOworICAgIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZve307CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kUG9vbCA9IGNvbW1hbmRfcG9vbDsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlk7CisgICAgdms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCAmY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbywgJmNvbW1hbmRfYnVmZmVyKTsKKworICAgIFZrUXVldWUgcXVldWUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6R2V0RGV2aWNlUXVldWUobV9kZXZpY2UtPmRldmljZSgpLCBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8sIDAsICZxdWV1ZSk7CisKKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgdms6OkNtZFJlc2V0RXZlbnQoY29tbWFuZF9idWZmZXIsIGV2ZW50LCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUKTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXIpOworICAgIH0KKyAgICB7CisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb3t9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZF9idWZmZXI7CisgICAgICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICAgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSBudWxscHRyOworICAgICAgICB2azo6UXVldWVTdWJtaXQocXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIH0KKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgInRoYXQgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYSBjb21tYW5kIGJ1ZmZlci4iKTsKKyAgICAgICAgdms6OlNldEV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgZXZlbnQpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICB2azo6UXVldWVXYWl0SWRsZShxdWV1ZSk7CisKKyAgICB2azo6RGVzdHJveUV2ZW50KG1fZGV2aWNlLT5kZXZpY2UoKSwgZXZlbnQsIG51bGxwdHIpOworICAgIHZrOjpGcmVlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIDEsICZjb21tYW5kX2J1ZmZlcik7CisgICAgdms6OkRlc3Ryb3lDb21tYW5kUG9vbChtX2RldmljZS0+ZGV2aWNlKCksIGNvbW1hbmRfcG9vbCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgU2hhZGluZ1JhdGVJbWFnZU5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBWS19OVl9zaGFkaW5nX3JhdGVfaW1hZ2UuIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgc3RkOjphcnJheTxjb25zdCBjaGFyICosIDE+IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zID0ge3tWS19OVl9TSEFESU5HX1JBVEVfSU1BR0VfRVhURU5TSU9OX05BTUV9fTsKKyAgICBmb3IgKGF1dG8gZGV2aWNlX2V4dGVuc2lvbiA6IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zKSB7CisgICAgICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIGRldmljZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKGRldmljZV9leHRlbnNpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChEZXZpY2VJc01vY2tJQ0QoKSB8fCBEZXZpY2VTaW11bGF0aW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IG5vdCBzdXBwb3J0ZWQgYnkgTW9ja0lDRCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgLy8gQ3JlYXRlIGEgZGV2aWNlIHRoYXQgZW5hYmxlcyBzaGFkaW5nX3JhdGVfaW1hZ2UgYnV0IGRpc2FibGVzIG11bHRpVmlld3BvcnQKKyAgICBhdXRvIHNoYWRpbmdfcmF0ZV9pbWFnZV9mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGluZ1JhdGVJbWFnZUZlYXR1cmVzTlY+KCk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJnNoYWRpbmdfcmF0ZV9pbWFnZV9mZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisKKyAgICBmZWF0dXJlczIuZmVhdHVyZXMubXVsdGlWaWV3cG9ydCA9IFZLX0ZBTFNFOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZmZWF0dXJlczIpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gVGVzdCBzaGFkaW5nIHJhdGUgaW1hZ2UgY3JlYXRpb24KKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBWS19SRVNVTFRfTUFYX0VOVU07CisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOF9VSU5UOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCA9IDQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1NIQURJTkdfUkFURV9JTUFHRV9CSVRfTlY7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID0gMDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfTVVUQUJMRV9GT1JNQVRfQklUOworCisgICAgLy8gaW1hZ2UgdHlwZSBtdXN0IGJlIDJECisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8zRDsKKyAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8taW1hZ2VUeXBlLTAyMDgyIik7CisKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworCisgICAgLy8gbXVzdCBiZSBzaW5nbGUgc2FtcGxlCisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8yX0JJVDsKKyAgICBDcmVhdGVJbWFnZVRlc3QoKnRoaXMsICZpbWFnZV9jcmVhdGVfaW5mbywgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tc2FtcGxlcy0wMjA4MyIpOworCisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKworICAgIC8vIHRpbGluZyBtdXN0IGJlIG9wdGltYWwKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfTElORUFSOworICAgIENyZWF0ZUltYWdlVGVzdCgqdGhpcywgJmltYWdlX2NyZWF0ZV9pbmZvLCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby10aWxpbmctMDIwODQiKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworCisgICAgLy8gU2hvdWxkIHN1Y2NlZWQuCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuaW5pdCgmaW1hZ2VfY3JlYXRlX2luZm8pOworCisgICAgLy8gVGVzdCBpbWFnZSB2aWV3IGNyZWF0aW9uCisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHt9OworICAgIGl2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGl2Y2kuaW1hZ2UgPSBpbWFnZS5oYW5kbGUoKTsKKyAgICBpdmNpLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgIGl2Y2kuZm9ybWF0ID0gVktfRk9STUFUX1I4X1VJTlQ7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisKKyAgICAvLyB2aWV3IHR5cGUgbXVzdCBiZSAyRCBvciAyRF9BUlJBWQorICAgIGl2Y2kudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfQ1VCRTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjA4NiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDAzIik7CisgICAgcmVzdWx0ID0gdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZpdmNpLCBudWxscHRyLCAmdmlldyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7CisgICAgICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldywgTlVMTCk7CisgICAgICAgIHZpZXcgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisgICAgaXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKworICAgIC8vIGZvcm1hdCBtdXN0IGJlIFI4X1VJTlQKKyAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOF9VTk9STTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjA4NyIpOworICAgIHJlc3VsdCA9IHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaXZjaSwgbnVsbHB0ciwgJnZpZXcpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeworICAgICAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXcsIE5VTEwpOworICAgICAgICB2aWV3ID0gVktfTlVMTF9IQU5ETEU7CisgICAgfQorICAgIGl2Y2kuZm9ybWF0ID0gVktfRk9STUFUX1I4X1VJTlQ7CisKKyAgICB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJml2Y2ksIG51bGxwdHIsICZ2aWV3KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIFRlc3QgcGlwZWxpbmUgY3JlYXRpb24KKyAgICBWa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYgdnNyaXNjaSA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU0hBRElOR19SQVRFX0lNQUdFX1NUQVRFX0NSRUFURV9JTkZPX05WfTsKKworICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MC4wZiwgMC4wZiwgNjQuMGYsIDY0LjBmLCAwLjBmLCAxLjBmfTsKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0c1syMF0gPSB7dmlld3BvcnQsIHZpZXdwb3J0fTsKKyAgICBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwgezY0LCA2NH19OworICAgIFZrUmVjdDJEIHNjaXNzb3JzWzIwXSA9IHtzY2lzc29yLCBzY2lzc29yfTsKKyAgICBWa0R5bmFtaWNTdGF0ZSBkeW5QYWxldHRlID0gVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9TSEFESU5HX1JBVEVfUEFMRVRURV9OVjsKKyAgICBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyBkeW4gPSB7VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRFlOQU1JQ19TVEFURV9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMSwgJmR5blBhbGV0dGV9OworCisgICAgLy8gdmlld3BvcnRDb3VudCBtdXN0IGJlIDAgb3IgMSB3aGVuIG11bHRpVmlld3BvcnQgaXMgZGlzYWJsZWQKKyAgICB7CisgICAgICAgIGNvbnN0IGF1dG8gYnJlYWtfdnAgPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy52aWV3cG9ydENvdW50ID0gMjsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8ucFZpZXdwb3J0cyA9IHZpZXdwb3J0czsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8uc2Npc3NvckNvdW50ID0gMjsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8ucFNjaXNzb3JzID0gc2Npc3NvcnM7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnBOZXh0ID0gJnZzcmlzY2k7CisgICAgICAgICAgICBoZWxwZXIuZHluX3N0YXRlX2NpXyA9IGR5bjsKKworICAgICAgICAgICAgdnNyaXNjaS5zaGFkaW5nUmF0ZUltYWdlRW5hYmxlID0gVktfVFJVRTsKKyAgICAgICAgICAgIHZzcmlzY2kudmlld3BvcnRDb3VudCA9IDI7CisgICAgICAgIH07CisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgKKyAgICAgICAgICAgICp0aGlzLCBicmVha192cCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICB2ZWN0b3I8c3RkOjpzdHJpbmc+KHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTaGFkaW5nUmF0ZUltYWdlU3RhdGVDcmVhdGVJbmZvTlYtdmlld3BvcnRDb3VudC0wMjA1NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC0wMTIxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjE3In0pKTsKKyAgICB9CisKKyAgICAvLyB2aWV3cG9ydENvdW50cyBtdXN0IG1hdGNoCisgICAgeworICAgICAgICBjb25zdCBhdXRvIGJyZWFrX3ZwID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8udmlld3BvcnRDb3VudCA9IDE7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnBWaWV3cG9ydHMgPSB2aWV3cG9ydHM7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnNjaXNzb3JDb3VudCA9IDE7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnBTY2lzc29ycyA9IHNjaXNzb3JzOworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5wTmV4dCA9ICZ2c3Jpc2NpOworICAgICAgICAgICAgaGVscGVyLmR5bl9zdGF0ZV9jaV8gPSBkeW47CisKKyAgICAgICAgICAgIHZzcmlzY2kuc2hhZGluZ1JhdGVJbWFnZUVuYWJsZSA9IFZLX1RSVUU7CisgICAgICAgICAgICB2c3Jpc2NpLnZpZXdwb3J0Q291bnQgPSAwOworICAgICAgICB9OworICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICAgICAqdGhpcywgYnJlYWtfdnAsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgdmVjdG9yPHN0ZDo6c3RyaW5nPih7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U2hhZGluZ1JhdGVJbWFnZVN0YXRlQ3JlYXRlSW5mb05WLXNoYWRpbmdSYXRlSW1hZ2VFbmFibGUtMDIwNTYifSkpOworICAgIH0KKworICAgIC8vIHBTaGFkaW5nUmF0ZVBhbGV0dGVzIG11c3Qgbm90IGJlIE5VTEwuCisgICAgeworICAgICAgICBjb25zdCBhdXRvIGJyZWFrX3ZwID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8udmlld3BvcnRDb3VudCA9IDE7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnBWaWV3cG9ydHMgPSB2aWV3cG9ydHM7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnNjaXNzb3JDb3VudCA9IDE7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnBTY2lzc29ycyA9IHNjaXNzb3JzOworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5wTmV4dCA9ICZ2c3Jpc2NpOworCisgICAgICAgICAgICB2c3Jpc2NpLnNoYWRpbmdSYXRlSW1hZ2VFbmFibGUgPSBWS19UUlVFOworICAgICAgICAgICAgdnNyaXNjaS52aWV3cG9ydENvdW50ID0gMTsKKyAgICAgICAgfTsKKyAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KAorICAgICAgICAgICAgKnRoaXMsIGJyZWFrX3ZwLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgIHZlY3RvcjxzdGQ6OnN0cmluZz4oeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFNoYWRpbmdSYXRlSW1hZ2VTdGF0ZUNyZWF0ZUluZm9OVi1wRHluYW1pY1N0YXRlcy0wMjA1NyJ9KSk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGFuIGltYWdlIHdpdGhvdXQgdGhlIFNSSSBiaXQKKyAgICBWa0ltYWdlT2JqIG5vblNSSWltYWdlKG1fZGV2aWNlKTsKKyAgICBub25TUklpbWFnZS5Jbml0KDI1NiwgMjU2LCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUobm9uU1JJaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisgICAgVmtJbWFnZVZpZXcgbm9uU1JJdmlldyA9IG5vblNSSWltYWdlLnRhcmdldFZpZXcoVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNKTsKKworICAgIC8vIFRlc3QgU1JJIGxheW91dCBvbiBub24tU1JJIGltYWdlCisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIgPSB7fTsKKyAgICBpbWdfYmFycmllci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSOworICAgIGltZ19iYXJyaWVyLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBpbWdfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gMDsKKyAgICBpbWdfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gMDsKKyAgICBpbWdfYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBpbWdfYmFycmllci5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU0hBRElOR19SQVRFX09QVElNQUxfTlY7CisgICAgaW1nX2JhcnJpZXIuaW1hZ2UgPSBub25TUklpbWFnZS5oYW5kbGUoKTsKKyAgICBpbWdfYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIC8vIEVycm9yIHRyeWluZyB0byBjb252ZXJ0IGl0IHRvIFNSSSBsYXlvdXQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VNZW1vcnlCYXJyaWVyLW9sZExheW91dC0wMjA4OCIpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gc3VjY2VlZCBjb252ZXJ0aW5nIGl0IHRvIEdFTkVSQUwKKyAgICBpbWdfYmFycmllci5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0JPVFRPTV9PRl9QSVBFX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltZ19iYXJyaWVyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIFRlc3Qgdms6OkNtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYgZXJyb3JzCisgICAgYXV0byB2a0NtZEJpbmRTaGFkaW5nUmF0ZUltYWdlTlYgPQorICAgICAgICAoUEZOX3ZrQ21kQmluZFNoYWRpbmdSYXRlSW1hZ2VOVil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WIik7CisKKyAgICAvLyBpZiB0aGUgdmlldyBpcyBub24tTlVMTCwgaXQgbXVzdCBiZSBSOF9VSU5ULCBVU0FHRV9TUkksIGltYWdlIGxheW91dCBtdXN0IG1hdGNoLCBsYXlvdXQgbXVzdCBiZSB2YWxpZAorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA2MCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA2MSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlVmlldy0wMjA2MiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WLWltYWdlTGF5b3V0LTAyMDYzIik7CisgICAgdmtDbWRCaW5kU2hhZGluZ1JhdGVJbWFnZU5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIG5vblNSSXZpZXcsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gVGVzdCB2azo6Q21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViBlcnJvcnMKKyAgICBhdXRvIHZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOViA9CisgICAgICAgIChQRk5fdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYiKTsKKworICAgIFZrU2hhZGluZ1JhdGVQYWxldHRlRW50cnlOViBwYWxldHRlRW50cmllc1sxMDBdID0ge307CisgICAgVmtTaGFkaW5nUmF0ZVBhbGV0dGVOViBwYWxldHRlID0gezEwMCwgcGFsZXR0ZUVudHJpZXN9OworICAgIFZrU2hhZGluZ1JhdGVQYWxldHRlTlYgcGFsZXR0ZXNbXSA9IHtwYWxldHRlLCBwYWxldHRlfTsKKworICAgIC8vIGVycm9ycyBvbiBmaXJzdFZpZXdwb3J0L3ZpZXdwb3J0Q291bnQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi1maXJzdFZpZXdwb3J0LTAyMDY2Iik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0NtZFNldFZpZXdwb3J0U2hhZGluZ1JhdGVQYWxldHRlTlYtZmlyc3RWaWV3cG9ydC0wMjA2NyIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WLWZpcnN0Vmlld3BvcnQtMDIwNjgiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVi12aWV3cG9ydENvdW50LTAyMDY5Iik7CisgICAgdmtDbWRTZXRWaWV3cG9ydFNoYWRpbmdSYXRlUGFsZXR0ZU5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDIwLCAyLCBwYWxldHRlcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBzaGFkaW5nUmF0ZVBhbGV0dGVFbnRyeUNvdW50IG11c3QgYmUgaW4gcmFuZ2UKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU2hhZGluZ1JhdGVQYWxldHRlTlYtc2hhZGluZ1JhdGVQYWxldHRlRW50cnlDb3VudC0wMjA3MSIpOworICAgIHZrQ21kU2V0Vmlld3BvcnRTaGFkaW5nUmF0ZVBhbGV0dGVOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCBwYWxldHRlcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBWa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYgbG9jYXRpb25zWzEwMF0gPSB7CisgICAgICAgIHswLCAwLCAwfSwgICAgezAsIDAsIDF9LCB7MCwgMSwgMH0sIHswLCAxLCAxfSwgezAsIDEsIDF9LCAgLy8gZHVwbGljYXRlCisgICAgICAgIHsxMDAwLCAwLCAwfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGl4ZWxYIHRvbyBsYXJnZQorICAgICAgICB7MCwgMTAwMCwgMH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVsWSB0b28gbGFyZ2UKKyAgICAgICAgezAsIDAsIDEwMDB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1wbGUgdG9vIGxhcmdlCisgICAgfTsKKworICAgIC8vIFRlc3QgY3VzdG9tIHNhbXBsZSBvcmRlcnMsIGJvdGggdmlhIHBpcGVsaW5lIHN0YXRlIGFuZCB2aWEgZHluYW1pYyBzdGF0ZQorICAgIHsKKyAgICAgICAgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WIHNhbXBPcmRCYWRTaGFkaW5nUmF0ZSA9IHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSX1BJWEVMX05WLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uc307CisgICAgICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViBzYW1wT3JkQmFkU2FtcGxlQ291bnQgPSB7VktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8xWDJfUElYRUxTX05WLCAzLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uc307CisgICAgICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViBzYW1wT3JkQmFkU2FtcGxlTG9jYXRpb25Db3VudCA9IHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzFYMl9QSVhFTFNfTlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAyLCBsb2NhdGlvbnN9OworICAgICAgICBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYgc2FtcE9yZER1cGxpY2F0ZUxvY2F0aW9ucyA9IHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzFYMl9QSVhFTFNfTlYsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKiAyICogMiwgJmxvY2F0aW9uc1sxXX07CisgICAgICAgIFZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OViBzYW1wT3JkT3V0T2ZSYW5nZUxvY2F0aW9ucyA9IHtWS19TSEFESU5HX1JBVEVfUEFMRVRURV9FTlRSWV8xX0lOVk9DQVRJT05fUEVSXzFYMl9QSVhFTFNfTlYsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICogMiAqIDIsICZsb2NhdGlvbnNbNF19OworICAgICAgICBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYgc2FtcE9yZFRvb0xhcmdlU2FtcGxlTG9jYXRpb25Db3VudCA9IHsKKyAgICAgICAgICAgIFZLX1NIQURJTkdfUkFURV9QQUxFVFRFX0VOVFJZXzFfSU5WT0NBVElPTl9QRVJfNFg0X1BJWEVMU19OViwgNCwgNjQsICZsb2NhdGlvbnNbOF19OworICAgICAgICBWa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYgc2FtcE9yZEdvb2QgPSB7VktfU0hBRElOR19SQVRFX1BBTEVUVEVfRU5UUllfMV9JTlZPQ0FUSU9OX1BFUl8xWDJfUElYRUxTX05WLCAyLCAxICogMiAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYXRpb25zWzBdfTsKKworICAgICAgICBWa1BpcGVsaW5lVmlld3BvcnRDb2Fyc2VTYW1wbGVPcmRlclN0YXRlQ3JlYXRlSW5mb05WIGNzb3NjaSA9IHsKKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX0NPQVJTRV9TQU1QTEVfT1JERVJfU1RBVEVfQ1JFQVRFX0lORk9fTlZ9OworICAgICAgICBjc29zY2kuc2FtcGxlT3JkZXJUeXBlID0gVktfQ09BUlNFX1NBTVBMRV9PUkRFUl9UWVBFX0NVU1RPTV9OVjsKKyAgICAgICAgY3Nvc2NpLmN1c3RvbVNhbXBsZU9yZGVyQ291bnQgPSAxOworCisgICAgICAgIHVzaW5nIHN0ZDo6dmVjdG9yOworICAgICAgICBzdHJ1Y3QgVGVzdENhc2UgeworICAgICAgICAgICAgY29uc3QgVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WICpvcmRlcjsKKyAgICAgICAgICAgIHZlY3RvcjxzdGQ6OnN0cmluZz4gdnVpZHM7CisgICAgICAgIH07CisKKyAgICAgICAgdmVjdG9yPFRlc3RDYXNlPiB0ZXN0X2Nhc2VzID0geworICAgICAgICAgICAgeyZzYW1wT3JkQmFkU2hhZGluZ1JhdGUsIHsiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2hhZGluZ1JhdGUtMDIwNzMifX0sCisgICAgICAgICAgICB7JnNhbXBPcmRCYWRTYW1wbGVDb3VudCwKKyAgICAgICAgICAgICB7IlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUNvdW50LTAyMDc0IiwgIlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUxvY2F0aW9uQ291bnQtMDIwNzUifX0sCisgICAgICAgICAgICB7JnNhbXBPcmRCYWRTYW1wbGVMb2NhdGlvbkNvdW50LCB7IlZVSUQtVmtDb2Fyc2VTYW1wbGVPcmRlckN1c3RvbU5WLXNhbXBsZUxvY2F0aW9uQ291bnQtMDIwNzUifX0sCisgICAgICAgICAgICB7JnNhbXBPcmREdXBsaWNhdGVMb2NhdGlvbnMsIHsiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtcFNhbXBsZUxvY2F0aW9ucy0wMjA3NyJ9fSwKKyAgICAgICAgICAgIHsmc2FtcE9yZE91dE9mUmFuZ2VMb2NhdGlvbnMsCisgICAgICAgICAgICAgeyJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1wU2FtcGxlTG9jYXRpb25zLTAyMDc3IiwgIlZVSUQtVmtDb2Fyc2VTYW1wbGVMb2NhdGlvbk5WLXBpeGVsWC0wMjA3OCIsCisgICAgICAgICAgICAgICJWVUlELVZrQ29hcnNlU2FtcGxlTG9jYXRpb25OVi1waXhlbFktMDIwNzkiLCAiVlVJRC1Wa0NvYXJzZVNhbXBsZUxvY2F0aW9uTlYtc2FtcGxlLTAyMDgwIn19LAorICAgICAgICAgICAgeyZzYW1wT3JkVG9vTGFyZ2VTYW1wbGVMb2NhdGlvbkNvdW50LAorICAgICAgICAgICAgIHsiVlVJRC1Wa0NvYXJzZVNhbXBsZU9yZGVyQ3VzdG9tTlYtc2FtcGxlTG9jYXRpb25Db3VudC0wMjA3NiIsCisgICAgICAgICAgICAgICJWVUlELVZrQ29hcnNlU2FtcGxlT3JkZXJDdXN0b21OVi1wU2FtcGxlTG9jYXRpb25zLTAyMDc3In19LAorICAgICAgICAgICAgeyZzYW1wT3JkR29vZCwge319LAorICAgICAgICB9OworCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmdGVzdF9jYXNlIDogdGVzdF9jYXNlcykgeworICAgICAgICAgICAgY29uc3QgYXV0byBicmVha192cCA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5wTmV4dCA9ICZjc29zY2k7CisgICAgICAgICAgICAgICAgY3Nvc2NpLnBDdXN0b21TYW1wbGVPcmRlcnMgPSB0ZXN0X2Nhc2Uub3JkZXI7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBicmVha192cCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHRlc3RfY2FzZS52dWlkcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IHZrOjpDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WIGVycm9ycworICAgICAgICBhdXRvIHZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOViA9CisgICAgICAgICAgICAoUEZOX3ZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WIik7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0X2Nhc2UgOiB0ZXN0X2Nhc2VzKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdGVzdF9jYXNlLnZ1aWRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB0ZXN0X2Nhc2UudnVpZHNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9DVVNUT01fTlYsIDEsIHRlc3RfY2FzZS5vcmRlcik7CisgICAgICAgICAgICBpZiAodGVzdF9jYXNlLnZ1aWRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrQ21kU2V0Q29hcnNlU2FtcGxlT3JkZXJOVi1zYW1wbGVPcmRlclR5cGUtMDIwODEiKTsKKyAgICAgICAgdmtDbWRTZXRDb2Fyc2VTYW1wbGVPcmRlck5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX0NPQVJTRV9TQU1QTEVfT1JERVJfVFlQRV9QSVhFTF9NQUpPUl9OViwgMSwgJnNhbXBPcmRHb29kKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldywgTlVMTCk7Cit9CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNpbmNsdWRlICJhbmRyb2lkX25ka190eXBlcy5oIgorCitURVNUX0YoVmtMYXllclRlc3QsIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckltYWdlQ3JlYXRlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IEFuZHJvaWRIYXJkd2FyZUJ1ZmZlciBpbWFnZSBjcmVhdGUgaW5mby4iKTsKKworICAgIFNldFRhcmdldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8xKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmICgoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSkpICYmCisgICAgICAgIC8vIEFsc28gc2tpcCBvbiBkZXZpY2VzIHRoYXQgYWR2ZXJ0aXNlIEFIQiwgYnV0IG5vdCB0aGUgcHJlLXJlcXVpc2l0ZSBmb3JlaWduX3F1ZXVlIGV4dGVuc2lvbgorICAgICAgICAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhURU5TSU9OX05BTUUpKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBleHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIFZrRGV2aWNlIGRldiA9IG1fZGV2aWNlLT5kZXZpY2UoKTsKKworICAgIFZrSW1hZ2UgaW1nID0gVktfTlVMTF9IQU5ETEU7CisgICAgYXV0byByZXNldF9pbWcgPSBbJmltZywgZGV2XSgpIHsKKyAgICAgICAgaWYgKFZLX05VTExfSEFORExFICE9IGltZykgdms6OkRlc3Ryb3lJbWFnZShkZXYsIGltZywgTlVMTCk7CisgICAgICAgIGltZyA9IFZLX05VTExfSEFORExFOworICAgIH07CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpY2kgPSB7fTsKKyAgICBpY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpY2kucE5leHQgPSBudWxscHRyOworICAgIGljaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGljaS5hcnJheUxheWVycyA9IDE7CisgICAgaWNpLmV4dGVudCA9IHs2NCwgNjQsIDF9OworICAgIGljaS5mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgIGljaS5taXBMZXZlbHMgPSAxOworICAgIGljaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBpY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaWNpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisKKyAgICAvLyB1bmRlZmluZWQgZm9ybWF0CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMTk3NSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSURfVW5kZWZpbmVkIik7CisgICAgdms6OkNyZWF0ZUltYWdlKGRldiwgJmljaSwgTlVMTCwgJmltZyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgcmVzZXRfaW1nKCk7CisKKyAgICAvLyBhbHNvIHVuZGVmaW5lZCBmb3JtYXQKKyAgICBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBlZmEgPSB7fTsKKyAgICBlZmEuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GT1JNQVRfQU5EUk9JRDsKKyAgICBlZmEuZXh0ZXJuYWxGb3JtYXQgPSAwOworICAgIGljaS5wTmV4dCA9ICZlZmE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMTk3NSIpOworICAgIHZrOjpDcmVhdGVJbWFnZShkZXYsICZpY2ksIE5VTEwsICZpbWcpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlc2V0X2ltZygpOworCisgICAgLy8gdW5kZWZpbmVkIGZvcm1hdCB3aXRoIGFuIHVua25vd24gZXh0ZXJuYWwgZm9ybWF0CisgICAgZWZhLmV4dGVybmFsRm9ybWF0ID0gMHhCQURDMERFOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQtZXh0ZXJuYWxGb3JtYXQtMDE4OTQiKTsKKyAgICB2azo6Q3JlYXRlSW1hZ2UoZGV2LCAmaWNpLCBOVUxMLCAmaW1nKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICByZXNldF9pbWcoKTsKKworICAgIEFIYXJkd2FyZUJ1ZmZlciAqYWhiOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGFoYl9kZXNjID0ge307CisgICAgYWhiX2Rlc2MuZm9ybWF0ID0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhYOF9VTk9STTsKKyAgICBhaGJfZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKKyAgICBhaGJfZGVzYy53aWR0aCA9IDY0OworICAgIGFoYl9kZXNjLmhlaWdodCA9IDY0OworICAgIGFoYl9kZXNjLmxheWVycyA9IDE7CisgICAgLy8gQWxsb2NhdGUgYW4gQUhhcmR3YXJlQnVmZmVyCisgICAgQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZhaGJfZGVzYywgJmFoYik7CisKKyAgICAvLyBSZXRyaWV2ZSBpdCdzIHByb3BlcnRpZXMgdG8gbWFrZSBpdCdzIGV4dGVybmFsIGZvcm1hdCAna25vd24nIChBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNKQorICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgYWhiX2ZtdF9wcm9wcyA9IHt9OworICAgIGFoYl9mbXRfcHJvcHMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9GT1JNQVRfUFJPUEVSVElFU19BTkRST0lEOworICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgYWhiX3Byb3BzID0ge307CisgICAgYWhiX3Byb3BzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfUFJPUEVSVElFU19BTkRST0lEOworICAgIGFoYl9wcm9wcy5wTmV4dCA9ICZhaGJfZm10X3Byb3BzOworICAgIFBGTl92a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIHBmbl9HZXRBSEJQcm9wcyA9CisgICAgICAgIChQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCl2azo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2LCAidmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCIpOworICAgIEFTU0VSVF9UUlVFKHBmbl9HZXRBSEJQcm9wcyAhPSBudWxscHRyKTsKKyAgICBwZm5fR2V0QUhCUHJvcHMoZGV2LCBhaGIsICZhaGJfcHJvcHMpOworCisgICAgLy8gYSBkZWZpbmVkIGltYWdlIGZvcm1hdCB3aXRoIGEgbm9uLXplcm8gZXh0ZXJuYWwgZm9ybWF0CisgICAgaWNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBlZmEuZXh0ZXJuYWxGb3JtYXQgPSBhaGJfZm10X3Byb3BzLmV4dGVybmFsRm9ybWF0OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZUNyZWF0ZUluZm8tcE5leHQtMDE5NzQiKTsKKyAgICB2azo6Q3JlYXRlSW1hZ2UoZGV2LCAmaWNpLCBOVUxMLCAmaW1nKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICByZXNldF9pbWcoKTsKKyAgICBpY2kuZm9ybWF0ID0gVktfRk9STUFUX1VOREVGSU5FRDsKKworICAgIC8vIGV4dGVybmFsIGZvcm1hdCB3aGlsZSBNVVRBQkxFCisgICAgaWNpLmZsYWdzID0gVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVDsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk2Iik7CisgICAgdms6OkNyZWF0ZUltYWdlKGRldiwgJmljaSwgTlVMTCwgJmltZyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgcmVzZXRfaW1nKCk7CisgICAgaWNpLmZsYWdzID0gMDsKKworICAgIC8vIGV4dGVybmFsIGZvcm1hdCB3aGlsZSB1c2FnZSBvdGhlciB0aGFuIFNBTVBMRUQKKyAgICBpY2kudXNhZ2UgfD0gVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMjM5NyIpOworICAgIHZrOjpDcmVhdGVJbWFnZShkZXYsICZpY2ksIE5VTEwsICZpbWcpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlc2V0X2ltZygpOworICAgIGljaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworCisgICAgLy8gZXh0ZXJuYWwgZm9ybWF0IHdoaWxlIHRpbGluZSBvdGhlciB0aGFuIE9QVElNQUwKKyAgICBpY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX0xJTkVBUjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk4Iik7CisgICAgdms6OkNyZWF0ZUltYWdlKGRldiwgJmljaSwgTlVMTCwgJmltZyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgcmVzZXRfaW1nKCk7CisgICAgaWNpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworCisgICAgLy8gaW1hZ2VUeXBlCisgICAgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBlbWljaSA9IHt9OworICAgIGVtaWNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfTUVNT1JZX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGVtaWNpLmhhbmRsZVR5cGVzID0gVktfRVhURVJOQUxfTUVNT1JZX0hBTkRMRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0JJVF9BTkRST0lEOworICAgIGljaS5wTmV4dCA9ICZlbWljaTsgIC8vIHJlbW92ZSBlZmEgZnJvbSBjaGFpbiwgaW5zZXJ0IGVtaWNpCisgICAgaWNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8zRDsKKyAgICBpY2kuZXh0ZW50ID0gezY0LCA2NCwgNjR9OworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlQ3JlYXRlSW5mby1wTmV4dC0wMjM5MyIpOworICAgIHZrOjpDcmVhdGVJbWFnZShkZXYsICZpY2ksIE5VTEwsICZpbWcpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlc2V0X2ltZygpOworCisgICAgLy8gd3JvbmcgbWlwTGV2ZWxzCisgICAgaWNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaWNpLmV4dGVudCA9IHs2NCwgNjQsIDF9OworICAgIGljaS5taXBMZXZlbHMgPSA2OyAgLy8gc2hvdWxkIGJlIDcKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VDcmVhdGVJbmZvLXBOZXh0LTAyMzk0Iik7CisgICAgdms6OkNyZWF0ZUltYWdlKGRldiwgJmljaSwgTlVMTCwgJmltZyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgcmVzZXRfaW1nKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQW5kcm9pZEhhcmR3YXJlQnVmZmVyRmV0Y2hVbmJvdW5kSW1hZ2VJbmZvKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IEFuZHJvaWRIYXJkd2FyZUJ1ZmZlciByZXRyZWl2ZSBpbWFnZSBwcm9wZXJ0aWVzIHdoaWxlIG1lbW9yeSB1bmJvdW5kLiIpOworCisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKSkgJiYKKyAgICAgICAgLy8gQWxzbyBza2lwIG9uIGRldmljZXMgdGhhdCBhZHZlcnRpc2UgQUhCLCBidXQgbm90IHRoZSBwcmUtcmVxdWlzaXRlIGZvcmVpZ25fcXVldWUgZXh0ZW5zaW9uCisgICAgICAgIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFRFTlNJT05fTkFNRSkpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzICVzIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgVmtEZXZpY2UgZGV2ID0gbV9kZXZpY2UtPmRldmljZSgpOworCisgICAgVmtJbWFnZSBpbWcgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBhdXRvIHJlc2V0X2ltZyA9IFsmaW1nLCBkZXZdKCkgeworICAgICAgICBpZiAoVktfTlVMTF9IQU5ETEUgIT0gaW1nKSB2azo6RGVzdHJveUltYWdlKGRldiwgaW1nLCBOVUxMKTsKKyAgICAgICAgaW1nID0gVktfTlVMTF9IQU5ETEU7CisgICAgfTsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGljaSA9IHt9OworICAgIGljaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGljaS5wTmV4dCA9IG51bGxwdHI7CisgICAgaWNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaWNpLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpY2kuZXh0ZW50ID0gezY0LCA2NCwgMX07CisgICAgaWNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpY2kubWlwTGV2ZWxzID0gMTsKKyAgICBpY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgaWNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgaWNpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVI7CisgICAgaWNpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisKKyAgICBWa0V4dGVybmFsTWVtb3J5SW1hZ2VDcmVhdGVJbmZvIGVtaWNpID0ge307CisgICAgZW1pY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgZW1pY2kuaGFuZGxlVHlwZXMgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQ7CisgICAgaWNpLnBOZXh0ID0gJmVtaWNpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6Q3JlYXRlSW1hZ2UoZGV2LCAmaWNpLCBOVUxMLCAmaW1nKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIGF0dGVtcHQgdG8gZmV0Y2ggbGF5b3V0IGZyb20gdW5ib3VuZCBpbWFnZQorICAgIFZrSW1hZ2VTdWJyZXNvdXJjZSBzdWJfcnNyYyA9IHt9OworICAgIHN1Yl9yc3JjLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIFZrU3VicmVzb3VyY2VMYXlvdXQgc3ViX2xheW91dCA9IHt9OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0LWltYWdlLTAxODk1Iik7CisgICAgdms6OkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoZGV2LCBpbWcsICZzdWJfcnNyYywgJnN1Yl9sYXlvdXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gYXR0ZW1wdCB0byBnZXQgbWVtb3J5IHJlcXMgZnJvbSB1bmJvdW5kIGltYWdlCisgICAgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIGltcmkgPSB7fTsKKyAgICBpbXJpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzI7CisgICAgaW1yaS5pbWFnZSA9IGltZzsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIgbWVtX3JlcXMgPSB7fTsKKyAgICBtZW1fcmVxcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFNfMjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMi1pbWFnZS0wMTg5NyIpOworICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czIoZGV2LCAmaW1yaSwgJm1lbV9yZXFzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHJlc2V0X2ltZygpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlck1lbW9yeUFsbG9jYXRpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWZXJpZnkgQW5kcm9pZEhhcmR3YXJlQnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uLiIpOworCisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKSkgJiYKKyAgICAgICAgLy8gQWxzbyBza2lwIG9uIGRldmljZXMgdGhhdCBhZHZlcnRpc2UgQUhCLCBidXQgbm90IHRoZSBwcmUtcmVxdWlzaXRlIGZvcmVpZ25fcXVldWUgZXh0ZW5zaW9uCisgICAgICAgIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFRFTlNJT05fTkFNRSkpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzICVzIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgVmtEZXZpY2UgZGV2ID0gbV9kZXZpY2UtPmRldmljZSgpOworCisgICAgVmtJbWFnZSBpbWcgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBhdXRvIHJlc2V0X2ltZyA9IFsmaW1nLCBkZXZdKCkgeworICAgICAgICBpZiAoVktfTlVMTF9IQU5ETEUgIT0gaW1nKSB2azo6RGVzdHJveUltYWdlKGRldiwgaW1nLCBOVUxMKTsKKyAgICAgICAgaW1nID0gVktfTlVMTF9IQU5ETEU7CisgICAgfTsKKyAgICBWa0RldmljZU1lbW9yeSBtZW1faGFuZGxlID0gVktfTlVMTF9IQU5ETEU7CisgICAgYXV0byByZXNldF9tZW0gPSBbJm1lbV9oYW5kbGUsIGRldl0oKSB7CisgICAgICAgIGlmIChWS19OVUxMX0hBTkRMRSAhPSBtZW1faGFuZGxlKSB2azo6RnJlZU1lbW9yeShkZXYsIG1lbV9oYW5kbGUsIE5VTEwpOworICAgICAgICBtZW1faGFuZGxlID0gVktfTlVMTF9IQU5ETEU7CisgICAgfTsKKworICAgIFBGTl92a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIHBmbl9HZXRBSEJQcm9wcyA9CisgICAgICAgIChQRk5fdmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCl2azo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2LCAidmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCIpOworICAgIEFTU0VSVF9UUlVFKHBmbl9HZXRBSEJQcm9wcyAhPSBudWxscHRyKTsKKworICAgIC8vIEFIQiBzdHJ1Y3RzCisgICAgQUhhcmR3YXJlQnVmZmVyICphaGIgPSBudWxscHRyOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGFoYl9kZXNjID0ge307CisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCBhaGJfZm10X3Byb3BzID0ge307CisgICAgYWhiX2ZtdF9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQ7CisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCBhaGJfcHJvcHMgPSB7fTsKKyAgICBhaGJfcHJvcHMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQ7CisgICAgYWhiX3Byb3BzLnBOZXh0ID0gJmFoYl9mbXRfcHJvcHM7CisgICAgVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBpYWhiaSA9IHt9OworICAgIGlhaGJpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRDsKKworICAgIC8vIGRlc3Ryb3kgYW5kIHJlLWFjcXVpcmUgYW4gQUhCLCBhbmQgZmV0Y2ggaXQncyBwcm9wZXJ0aWVzCisgICAgYXV0byByZWNyZWF0ZV9haGIgPSBbJmFoYiwgJmlhaGJpLCAmYWhiX2Rlc2MsICZhaGJfcHJvcHMsIGRldiwgcGZuX0dldEFIQlByb3BzXSgpIHsKKyAgICAgICAgaWYgKGFoYikgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYWhiKTsKKyAgICAgICAgYWhiID0gbnVsbHB0cjsKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZhaGJfZGVzYywgJmFoYik7CisgICAgICAgIGlmIChhaGIpIHsKKyAgICAgICAgICAgIHBmbl9HZXRBSEJQcm9wcyhkZXYsIGFoYiwgJmFoYl9wcm9wcyk7CisgICAgICAgICAgICBpYWhiaS5idWZmZXIgPSBhaGI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gQWxsb2NhdGUgYW4gQUhhcmR3YXJlQnVmZmVyCisgICAgYWhiX2Rlc2MuZm9ybWF0ID0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhYOF9VTk9STTsKKyAgICBhaGJfZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKKyAgICBhaGJfZGVzYy53aWR0aCA9IDY0OworICAgIGFoYl9kZXNjLmhlaWdodCA9IDY0OworICAgIGFoYl9kZXNjLmxheWVycyA9IDE7CisgICAgcmVjcmVhdGVfYWhiKCk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW1hZ2Ugdy8gZXh0ZXJuYWwgZm9ybWF0CisgICAgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgZWZhID0ge307CisgICAgZWZhLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQ7CisgICAgZWZhLmV4dGVybmFsRm9ybWF0ID0gYWhiX2ZtdF9wcm9wcy5leHRlcm5hbEZvcm1hdDsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGljaSA9IHt9OworICAgIGljaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGljaS5wTmV4dCA9ICZlZmE7CisgICAgaWNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaWNpLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpY2kuZXh0ZW50ID0gezY0LCA2NCwgMX07CisgICAgaWNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9VTkRFRklORUQ7CisgICAgaWNpLm1pcExldmVscyA9IDE7CisgICAgaWNpLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGljaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGljaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVDsKKyAgICBWa1Jlc3VsdCByZXMgPSB2azo6Q3JlYXRlSW1hZ2UoZGV2LCAmaWNpLCBOVUxMLCAmaW1nKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhyZXMpOworCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWFpID0ge307CisgICAgbWFpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWFpLnBOZXh0ID0gJmlhaGJpOyAgLy8gQ2hhaW5lZCBpbXBvcnQgc3RydWN0CisgICAgbWFpLmFsbG9jYXRpb25TaXplID0gYWhiX3Byb3BzLmFsbG9jYXRpb25TaXplOworICAgIG1haS5tZW1vcnlUeXBlSW5kZXggPSAzMjsKKyAgICAvLyBTZXQgaW5kZXggdG8gbWF0Y2ggb25lIG9mIHRoZSBiaXRzIGluIGFoYl9wcm9wcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICBpZiAoYWhiX3Byb3BzLm1lbW9yeVR5cGVCaXRzICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgIG1haS5tZW1vcnlUeXBlSW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKDMyLCBtYWkubWVtb3J5VHlwZUluZGV4KTsKKworICAgIC8vIEltcG9ydCB3LyBub24tZGVkaWNhdGVkIG1lbW9yeSBhbGxvY2F0aW9uCisKKyAgICAvLyBJbXBvcnQgcmVxdWlyZXMgZm9ybWF0IEFIQl9GTVRfQkxPQiBhbmQgdXNhZ2UgQUhCX1VTQUdFX0dQVV9EQVRBX0JVRkZFUgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzODQiKTsKKyAgICB2azo6QWxsb2NhdGVNZW1vcnkoZGV2LCAmbWFpLCBOVUxMLCAmbWVtX2hhbmRsZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgcmVzZXRfbWVtKCk7CisKKyAgICAvLyBBbGxvY2F0aW9uIHNpemUgbWlzbWF0Y2gKKyAgICBhaGJfZGVzYy5mb3JtYXQgPSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0JMT0I7CisgICAgYWhiX2Rlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0RBVEFfQlVGRkVSOworICAgIGFoYl9kZXNjLmhlaWdodCA9IDE7CisgICAgcmVjcmVhdGVfYWhiKCk7CisgICAgbWFpLmFsbG9jYXRpb25TaXplID0gYWhiX3Byb3BzLmFsbG9jYXRpb25TaXplICsgMTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLWFsbG9jYXRpb25TaXplLTAyMzgzIik7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldiwgJm1haSwgTlVMTCwgJm1lbV9oYW5kbGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIG1haS5hbGxvY2F0aW9uU2l6ZSA9IGFoYl9wcm9wcy5hbGxvY2F0aW9uU2l6ZTsKKyAgICByZXNldF9tZW0oKTsKKworICAgIC8vIG1lbW9yeVR5cGVJbmRleCBtaXNtYXRjaAorICAgIG1haS5tZW1vcnlUeXBlSW5kZXgrKzsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW1lbW9yeVR5cGVJbmRleC0wMjM4NSIpOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXYsICZtYWksIE5VTEwsICZtZW1faGFuZGxlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBtYWkubWVtb3J5VHlwZUluZGV4LS07CisgICAgcmVzZXRfbWVtKCk7CisKKyAgICAvLyBJbnNlcnQgZGVkaWNhdGVkIGltYWdlIG1lbW9yeSBhbGxvY2F0aW9uIHRvIG1haSBjaGFpbgorICAgIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIG1kYWkgPSB7fTsKKyAgICBtZGFpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPOworICAgIG1kYWkuaW1hZ2UgPSBpbWc7CisgICAgbWRhaS5idWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBtZGFpLnBOZXh0ID0gbWFpLnBOZXh0OworICAgIG1haS5wTmV4dCA9ICZtZGFpOworCisgICAgLy8gRGVkaWNhdGVkIGFsbG9jYXRpb24gd2l0aCB1bm1hdGNoZWQgdXNhZ2UgYml0cworICAgIGFoYl9kZXNjLmZvcm1hdCA9IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgYWhiX2Rlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVDsKKyAgICBhaGJfZGVzYy5oZWlnaHQgPSA2NDsKKyAgICByZWNyZWF0ZV9haGIoKTsKKyAgICBtYWkuYWxsb2NhdGlvblNpemUgPSBhaGJfcHJvcHMuYWxsb2NhdGlvblNpemU7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjM5MCIpOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXYsICZtYWksIE5VTEwsICZtZW1faGFuZGxlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICByZXNldF9tZW0oKTsKKworICAgIC8vIERlZGljYXRlZCBhbGxvY2F0aW9uIHdpdGggaW5jb21wbGV0ZSBtaXAgY2hhaW4KKyAgICByZXNldF9pbWcoKTsKKyAgICBpY2kubWlwTGV2ZWxzID0gMjsKKyAgICB2azo6Q3JlYXRlSW1hZ2UoZGV2LCAmaWNpLCBOVUxMLCAmaW1nKTsKKyAgICBtZGFpLmltYWdlID0gaW1nOworICAgIGFoYl9kZXNjLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFIHwgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9NSVBNQVBfQ09NUExFVEU7CisgICAgcmVjcmVhdGVfYWhiKCk7CisKKyAgICBpZiAoYWhiKSB7CisgICAgICAgIG1haS5hbGxvY2F0aW9uU2l6ZSA9IGFoYl9wcm9wcy5hbGxvY2F0aW9uU2l6ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYWhiX3Byb3BzLm1lbW9yeVR5cGVCaXRzICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICBtYWkubWVtb3J5VHlwZUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg5Iik7CisgICAgICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXYsICZtYWksIE5VTEwsICZtZW1faGFuZGxlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIHJlc2V0X21lbSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVSUk9SOiBBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGUoKSB3aXRoIE1JUE1BUF9DT01QTEVURSBmYWlscy4gSXQgcmV0dXJucyAtMTIsIE5PX01FTU9SWS4KKyAgICAgICAgLy8gVGhlIHByb2JsZW0gc2VlbXMgdG8gaGFwcGVuIGluIFBpeGVsIDIsIG5vdCBQaXhlbCAzLgorICAgICAgICBwcmludGYoIiVzIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfTUlQTUFQX0NPTVBMRVRFIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgfQorCisgICAgLy8gRGVkaWNhdGVkIGFsbG9jYXRpb24gd2l0aCBtaXMtbWF0Y2hlZCBkaW1lbnNpb24KKyAgICBhaGJfZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKKyAgICBhaGJfZGVzYy5oZWlnaHQgPSAzMjsKKyAgICBhaGJfZGVzYy53aWR0aCA9IDEyODsKKyAgICByZWNyZWF0ZV9haGIoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg4Iik7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldiwgJm1haSwgTlVMTCwgJm1lbV9oYW5kbGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlc2V0X21lbSgpOworCisgICAgLy8gRGVkaWNhdGVkIGFsbG9jYXRpb24gd2l0aCBtaXMtbWF0Y2hlZCBWa0Zvcm1hdAorICAgIGFoYl9kZXNjLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFOworICAgIGFoYl9kZXNjLmhlaWdodCA9IDY0OworICAgIGFoYl9kZXNjLndpZHRoID0gNjQ7CisgICAgcmVjcmVhdGVfYWhiKCk7CisgICAgaWNpLm1pcExldmVscyA9IDE7CisgICAgaWNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpY2kucE5leHQgPSBOVUxMOworICAgIFZrSW1hZ2UgaW1nMjsKKyAgICB2azo6Q3JlYXRlSW1hZ2UoZGV2LCAmaWNpLCBOVUxMLCAmaW1nMik7CisgICAgbWRhaS5pbWFnZSA9IGltZzI7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa01lbW9yeUFsbG9jYXRlSW5mby1wTmV4dC0wMjM4NyIpOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXYsICZtYWksIE5VTEwsICZtZW1faGFuZGxlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveUltYWdlKGRldiwgaW1nMiwgTlVMTCk7CisgICAgbWRhaS5pbWFnZSA9IGltZzsKKyAgICByZXNldF9tZW0oKTsKKworICAgIC8vIE1pc3NpbmcgcmVxdWlyZWQgYWhiIHVzYWdlCisgICAgYWhiX2Rlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUFJPVEVDVEVEX0NPTlRFTlQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC12a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELWJ1ZmZlci0wMTg4NCIpOworICAgIHJlY3JlYXRlX2FoYigpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gRGVkaWNhdGVkIGFsbG9jYXRpb24gd2l0aCBtaXNzaW5nIHVzYWdlIGJpdHMKKyAgICAvLyBTZXR0aW5nIHVwIHRoaXMgdGVzdCBhbHNvIHRyaWdnZXJzIGEgc2xldyBvZiBvdGhlcnMKKyAgICBtYWkuYWxsb2NhdGlvblNpemUgPSBhaGJfcHJvcHMuYWxsb2NhdGlvblNpemUgKyAxOworICAgIG1haS5tZW1vcnlUeXBlSW5kZXggPSAwOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tcE5leHQtMDIzOTAiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLW1lbW9yeVR5cGVJbmRleC0wMjM4NSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtNZW1vcnlBbGxvY2F0ZUluZm8tYWxsb2NhdGlvblNpemUtMDIzODMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg2Iik7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldiwgJm1haSwgTlVMTCwgJm1lbV9oYW5kbGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlc2V0X21lbSgpOworCisgICAgLy8gTm9uLWltcG9ydCBhbGxvY2F0aW9uIC0gcmVwbGFjZSBpbXBvcnQgc3RydWN0IGluIGNoYWluIHdpdGggZXhwb3J0IHN0cnVjdAorICAgIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIGVtYWkgPSB7fTsKKyAgICBlbWFpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIGVtYWkuaGFuZGxlVHlwZXMgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQ7CisgICAgbWFpLnBOZXh0ID0gJmVtYWk7CisgICAgZW1haS5wTmV4dCA9ICZtZGFpOyAgLy8gc3RpbGwgZGVkaWNhdGVkCisgICAgbWRhaS5wTmV4dCA9IG51bGxwdHI7CisKKyAgICAvLyBFeHBvcnQgd2l0aCBhbGxvY2F0aW9uIHNpemUgbm9uLXplcm8KKyAgICBhaGJfZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKKyAgICByZWNyZWF0ZV9haGIoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAxODc0Iik7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldiwgJm1haSwgTlVMTCwgJm1lbV9oYW5kbGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHJlc2V0X21lbSgpOworCisgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYWhiKTsKKyAgICByZXNldF9tZW0oKTsKKyAgICByZXNldF9pbWcoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJDcmVhdGVZQ2JDclNhbXBsZXIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWZXJpZnkgQW5kcm9pZEhhcmR3YXJlQnVmZmVyIFlDYkNyIHNhbXBsZXIgY3JlYXRpb24uIik7CisKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpKSAmJgorICAgICAgICAvLyBBbHNvIHNraXAgb24gZGV2aWNlcyB0aGF0IGFkdmVydGlzZSBBSEIsIGJ1dCBub3QgdGhlIHByZS1yZXF1aXNpdGUgZm9yZWlnbl9xdWV1ZSBleHRlbnNpb24KKyAgICAgICAgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FKSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBWa0RldmljZSBkZXYgPSBtX2RldmljZS0+ZGV2aWNlKCk7CisKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JfY29udiA9IFZLX05VTExfSEFORExFOworICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gc3ljY2kgPSB7fTsKKyAgICBzeWNjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTzsKKyAgICBzeWNjaS5mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgIHN5Y2NpLnljYmNyTW9kZWwgPSBWS19TQU1QTEVSX1lDQkNSX01PREVMX0NPTlZFUlNJT05fUkdCX0lERU5USVRZOworICAgIHN5Y2NpLnljYmNyUmFuZ2UgPSBWS19TQU1QTEVSX1lDQkNSX1JBTkdFX0lUVV9GVUxMOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC0wMTkwNCIpOworICAgIHZrOjpDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKGRldiwgJnN5Y2NpLCBOVUxMLCAmeWNiY3JfY29udik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBlZmEgPSB7fTsKKyAgICBlZmEuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GT1JNQVRfQU5EUk9JRDsKKyAgICBlZmEuZXh0ZXJuYWxGb3JtYXQgPSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNOworICAgIHN5Y2NpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBzeWNjaS5wTmV4dCA9ICZlZmE7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1NhbXBsZXJZY2JjckNvbnZlcnNpb25DcmVhdGVJbmZvLWZvcm1hdC0wMTkwNCIpOworICAgIHZrOjpDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uKGRldiwgJnN5Y2NpLCBOVUxMLCAmeWNiY3JfY29udik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQW5kcm9pZEhhcmR3YXJlQnVmZmVyUGh5c0RldkltYWdlRm9ybWF0UHJvcDIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWZXJpZnkgQW5kcm9pZEhhcmR3YXJlQnVmZmVyIEdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLiIpOworCisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKSkgJiYKKyAgICAgICAgLy8gQWxzbyBza2lwIG9uIGRldmljZXMgdGhhdCBhZHZlcnRpc2UgQUhCLCBidXQgbm90IHRoZSBwcmUtcmVxdWlzaXRlIGZvcmVpZ25fcXVldWUgZXh0ZW5zaW9uCisgICAgICAgIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFRFTlNJT05fTkFNRSkpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX01FTU9SWV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzICVzIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIGlmICgobV9pbnN0YW5jZV9hcGlfdmVyc2lvbiA8IFZLX0FQSV9WRVJTSU9OXzFfMSkgJiYKKyAgICAgICAgIUluc3RhbmNlRXh0ZW5zaW9uRW5hYmxlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMiBpZnAgPSB7fTsKKyAgICBpZnAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9GT1JNQVRfUFJPUEVSVElFU18yOworICAgIFZrUGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdEluZm8yIHBkaWZpID0ge307CisgICAgcGRpZmkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfSU1BR0VfRk9STUFUX0lORk9fMjsKKyAgICBwZGlmaS5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgcGRpZmkudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgcGRpZmkudHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgcGRpZmkudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDsKKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclVzYWdlQU5EUk9JRCBhaGJ1ID0ge307CisgICAgYWhidS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1VTQUdFX0FORFJPSUQ7CisgICAgYWhidS5hbmRyb2lkSGFyZHdhcmVCdWZmZXJVc2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKKyAgICBpZnAucE5leHQgPSAmYWhidTsKKworICAgIC8vIEFIQl91c2FnZSBjaGFpbmVkIHRvIGlucHV0IHdpdGhvdXQgYSBtYXRjaGluZyBleHRlcm5hbCBpbWFnZSBmb3JtYXQgc3RydWMgY2hhaW5lZCB0byBvdXRwdXQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyLXBOZXh0LTAxODY4Iik7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzMihtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksICZwZGlmaSwgJmlmcCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBvdXRwdXQgc3RydWN0IGNoYWluZWQsIGJ1dCBkb2VzIG5vdCBpbmNsdWRlIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCB1c2FnZQorICAgIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbEltYWdlRm9ybWF0SW5mbyBwZGVpZmkgPSB7fTsKKyAgICBwZGVpZmkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfSU1BR0VfRk9STUFUX0lORk87CisgICAgcGRlaWZpLmhhbmRsZVR5cGUgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQ7CisgICAgcGRpZmkucE5leHQgPSAmcGRlaWZpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllczItcE5leHQtMDE4NjgiKTsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMyKG1fZGV2aWNlLT5waHkoKS5oYW5kbGUoKSwgJnBkaWZpLCAmaWZwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBBbmRyb2lkSGFyZHdhcmVCdWZmZXJDcmVhdGVJbWFnZVZpZXcpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWZXJpZnkgQW5kcm9pZEhhcmR3YXJlQnVmZmVyIGltYWdlIHZpZXcgY3JlYXRpb24uIik7CisKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpKSAmJgorICAgICAgICAvLyBBbHNvIHNraXAgb24gZGV2aWNlcyB0aGF0IGFkdmVydGlzZSBBSEIsIGJ1dCBub3QgdGhlIHByZS1yZXF1aXNpdGUgZm9yZWlnbl9xdWV1ZSBleHRlbnNpb24KKyAgICAgICAgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FKSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBWa0RldmljZSBkZXYgPSBtX2RldmljZS0+ZGV2aWNlKCk7CisKKyAgICAvLyBBbGxvY2F0ZSBhbiBBSEIgYW5kIGZldGNoIGl0cyBwcm9wZXJ0aWVzCisgICAgQUhhcmR3YXJlQnVmZmVyICphaGIgPSBudWxscHRyOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGFoYl9kZXNjID0ge307CisgICAgYWhiX2Rlc2MuZm9ybWF0ID0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SNUc2QjVfVU5PUk07CisgICAgYWhiX2Rlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0U7CisgICAgYWhiX2Rlc2Mud2lkdGggPSA2NDsKKyAgICBhaGJfZGVzYy5oZWlnaHQgPSA2NDsKKyAgICBhaGJfZGVzYy5sYXllcnMgPSAxOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmYWhiX2Rlc2MsICZhaGIpOworCisgICAgLy8gUmV0cmlldmUgQUhCIHByb3BlcnRpZXMgdG8gbWFrZSBpdCdzIGV4dGVybmFsIGZvcm1hdCAna25vd24nCisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJGb3JtYXRQcm9wZXJ0aWVzQU5EUk9JRCBhaGJfZm10X3Byb3BzID0ge307CisgICAgYWhiX2ZtdF9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQ7CisgICAgVmtBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCBhaGJfcHJvcHMgPSB7fTsKKyAgICBhaGJfcHJvcHMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQ7CisgICAgYWhiX3Byb3BzLnBOZXh0ID0gJmFoYl9mbXRfcHJvcHM7CisgICAgUEZOX3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgcGZuX0dldEFIQlByb3BzID0KKyAgICAgICAgKFBGTl92a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKXZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXYsICJ2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIik7CisgICAgQVNTRVJUX1RSVUUocGZuX0dldEFIQlByb3BzICE9IG51bGxwdHIpOworICAgIHBmbl9HZXRBSEJQcm9wcyhkZXYsIGFoYiwgJmFoYl9wcm9wcyk7CisgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYWhiKTsKKworICAgIC8vIEdpdmUgaW1hZ2UgYW4gZXh0ZXJuYWwgZm9ybWF0CisgICAgVmtFeHRlcm5hbEZvcm1hdEFORFJPSUQgZWZhID0ge307CisgICAgZWZhLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQ7CisgICAgZWZhLmV4dGVybmFsRm9ybWF0ID0gYWhiX2ZtdF9wcm9wcy5leHRlcm5hbEZvcm1hdDsKKworICAgIGFoYl9kZXNjLmZvcm1hdCA9IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgYWhiX2Rlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0U7CisgICAgYWhiX2Rlc2Mud2lkdGggPSA2NDsKKyAgICBhaGJfZGVzYy5oZWlnaHQgPSAxOworICAgIGFoYl9kZXNjLmxheWVycyA9IDE7CisgICAgQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZhaGJfZGVzYywgJmFoYik7CisKKyAgICAvLyBDcmVhdGUgYW5vdGhlciBWa0V4dGVybmFsRm9ybWF0QU5EUk9JRCBmb3IgdGVzdCBWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1pbWFnZS0wMjQwMAorICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyRm9ybWF0UHJvcGVydGllc0FORFJPSUQgYWhiX2ZtdF9wcm9wc19ZY2JjciA9IHt9OworICAgIGFoYl9mbXRfcHJvcHNfWWNiY3Iuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9GT1JNQVRfUFJPUEVSVElFU19BTkRST0lEOworICAgIFZrQW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgYWhiX3Byb3BzX1ljYmNyID0ge307CisgICAgYWhiX3Byb3BzX1ljYmNyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfUFJPUEVSVElFU19BTkRST0lEOworICAgIGFoYl9wcm9wc19ZY2Jjci5wTmV4dCA9ICZhaGJfZm10X3Byb3BzX1ljYmNyOworICAgIHBmbl9HZXRBSEJQcm9wcyhkZXYsIGFoYiwgJmFoYl9wcm9wc19ZY2Jjcik7CisgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYWhiKTsKKworICAgIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIGVmYV9ZY2JjciA9IHt9OworICAgIGVmYV9ZY2Jjci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0ZPUk1BVF9BTkRST0lEOworICAgIGVmYV9ZY2Jjci5leHRlcm5hbEZvcm1hdCA9IGFoYl9mbXRfcHJvcHNfWWNiY3IuZXh0ZXJuYWxGb3JtYXQ7CisKKyAgICAvLyBDcmVhdGUgdGhlIGltYWdlCisgICAgVmtJbWFnZSBpbWcgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpY2kgPSB7fTsKKyAgICBpY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpY2kucE5leHQgPSAmZWZhOworICAgIGljaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGljaS5hcnJheUxheWVycyA9IDE7CisgICAgaWNpLmV4dGVudCA9IHs2NCwgNjQsIDF9OworICAgIGljaS5mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgIGljaS5taXBMZXZlbHMgPSAxOworICAgIGljaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBpY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaWNpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisgICAgdms6OkNyZWF0ZUltYWdlKGRldiwgJmljaSwgTlVMTCwgJmltZyk7CisKKyAgICAvLyBTZXQgdXAgbWVtb3J5IGFsbG9jYXRpb24KKyAgICBWa0RldmljZU1lbW9yeSBpbWdfbWVtID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWFpID0ge307CisgICAgbWFpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWFpLmFsbG9jYXRpb25TaXplID0gNjQgKiA2NCAqIDQ7CisgICAgbWFpLm1lbW9yeVR5cGVJbmRleCA9IDA7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldiwgJm1haSwgTlVMTCwgJmltZ19tZW0pOworCisgICAgLy8gSXQgc2hvdWxkbid0IHVzZSB2azo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgZm9yIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlci4KKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLXZrQmluZEltYWdlTWVtb3J5LWludmFsaWQtcmVxdWlyZW1lbnRzIik7CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgaW1nX21lbV9yZXFzID0ge307CisgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1nLCAmaW1nX21lbV9yZXFzKTsKKyAgICB2azo6QmluZEltYWdlTWVtb3J5KGRldiwgaW1nLCBpbWdfbWVtLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEJpbmQgaW1hZ2UgdG8gbWVtb3J5CisgICAgdms6OkRlc3Ryb3lJbWFnZShkZXYsIGltZywgTlVMTCk7CisgICAgdms6OkZyZWVNZW1vcnkoZGV2LCBpbWdfbWVtLCBOVUxMKTsKKyAgICB2azo6Q3JlYXRlSW1hZ2UoZGV2LCAmaWNpLCBOVUxMLCAmaW1nKTsKKyAgICB2azo6QWxsb2NhdGVNZW1vcnkoZGV2LCAmbWFpLCBOVUxMLCAmaW1nX21lbSk7CisgICAgdms6OkJpbmRJbWFnZU1lbW9yeShkZXYsIGltZywgaW1nX21lbSwgMCk7CisKKyAgICAvLyBDcmVhdGUgYSBZQ2JDciBjb252ZXJzaW9uLCB3aXRoIGRpZmZlcmVudCBleHRlcm5hbCBmb3JtYXQsIGNoYWluIHRvIHZpZXcKKyAgICBWa1NhbXBsZXJZY2JjckNvbnZlcnNpb24geWNiY3JfY29udiA9IFZLX05VTExfSEFORExFOworICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkNyZWF0ZUluZm8gc3ljY2kgPSB7fTsKKyAgICBzeWNjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9DUkVBVEVfSU5GTzsKKyAgICBzeWNjaS5wTmV4dCA9ICZlZmFfWWNiY3I7CisgICAgc3ljY2kuZm9ybWF0ID0gVktfRk9STUFUX1VOREVGSU5FRDsKKyAgICBzeWNjaS55Y2Jjck1vZGVsID0gVktfU0FNUExFUl9ZQ0JDUl9NT0RFTF9DT05WRVJTSU9OX1JHQl9JREVOVElUWTsKKyAgICBzeWNjaS55Y2JjclJhbmdlID0gVktfU0FNUExFUl9ZQ0JDUl9SQU5HRV9JVFVfRlVMTDsKKyAgICB2azo6Q3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihkZXYsICZzeWNjaSwgTlVMTCwgJnljYmNyX2NvbnYpOworICAgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbkluZm8gc3ljaSA9IHt9OworICAgIHN5Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU5GTzsKKyAgICBzeWNpLmNvbnZlcnNpb24gPSB5Y2Jjcl9jb252OworCisgICAgLy8gQ3JlYXRlIGEgdmlldworICAgIFZrSW1hZ2VWaWV3IGltYWdlX3ZpZXcgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHt9OworICAgIGl2Y2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGl2Y2kucE5leHQgPSAmc3ljaTsKKyAgICBpdmNpLmltYWdlID0gaW1nOworICAgIGl2Y2kudmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgaXZjaS5mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAxfTsKKworICAgIGF1dG8gcmVzZXRfdmlldyA9IFsmaW1hZ2VfdmlldywgZGV2XSgpIHsKKyAgICAgICAgaWYgKFZLX05VTExfSEFORExFICE9IGltYWdlX3ZpZXcpIHZrOjpEZXN0cm95SW1hZ2VWaWV3KGRldiwgaW1hZ2VfdmlldywgTlVMTCk7CisgICAgICAgIGltYWdlX3ZpZXcgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9OworCisgICAgLy8gVXAgdG8gdGhpcyBwb2ludCwgbm8gZXJyb3JzIGV4cGVjdGVkCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAvLyBDaGFpbmVkIHljYmNyIGNvbnZlcnNpb24gaGFzIGRpZmZlcmVudCAoZXh0ZXJuYWwpIGZvcm1hdCB0aGFuIGltYWdlCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDI0MDAiKTsKKyAgICAvLyBBbHNvIGNhdXNlcyAidW5zdXBwb3J0ZWQgZm9ybWF0IiAtIHNob3VsZCBiZSByZW1vdmVkIGluIGZ1dHVyZSBzcGVjIHVwZGF0ZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLU5vbmUtMDIyNzMiKTsKKyAgICB2azo6Q3JlYXRlSW1hZ2VWaWV3KGRldiwgJml2Y2ksIE5VTEwsICZpbWFnZV92aWV3KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHJlc2V0X3ZpZXcoKTsKKyAgICB2azo6RGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24oZGV2LCB5Y2Jjcl9jb252LCBOVUxMKTsKKyAgICBzeWNjaS5wTmV4dCA9ICZlZmE7CisgICAgdms6OkNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24oZGV2LCAmc3ljY2ksIE5VTEwsICZ5Y2Jjcl9jb252KTsKKyAgICBzeWNpLmNvbnZlcnNpb24gPSB5Y2Jjcl9jb252OworCisgICAgLy8gVmlldyBjb21wb25lbnQgc3dpenpsZSBub3QgSURFTlRJVFkKKyAgICBpdmNpLmNvbXBvbmVudHMuciA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0I7CisgICAgaXZjaS5jb21wb25lbnRzLmIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9SOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAyNDAxIik7CisgICAgLy8gQWxzbyBjYXVzZXMgInVuc3VwcG9ydGVkIGZvcm1hdCIgLSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgc3BlYyB1cGRhdGUKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrSW1hZ2VWaWV3Q3JlYXRlSW5mby1Ob25lLTAyMjczIik7CisgICAgdms6OkNyZWF0ZUltYWdlVmlldyhkZXYsICZpdmNpLCBOVUxMLCAmaW1hZ2Vfdmlldyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICByZXNldF92aWV3KCk7CisgICAgaXZjaS5jb21wb25lbnRzLnIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWTsKKyAgICBpdmNpLmNvbXBvbmVudHMuYiA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZOworCisgICAgLy8gVmlldyB3aXRoIGV4dGVybmFsIGZvcm1hdCwgd2hlbiBmb3JtYXQgaXMgbm90IFVOREVGSU5FRAorICAgIGl2Y2kuZm9ybWF0ID0gVktfRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTY7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0ltYWdlVmlld0NyZWF0ZUluZm8taW1hZ2UtMDIzOTkiKTsKKyAgICAvLyBBbHNvIGNhdXNlcyAidmlldyBmb3JtYXQgZGlmZmVyZW50IGZyb20gaW1hZ2UgZm9ybWF0IgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtJbWFnZVZpZXdDcmVhdGVJbmZvLWltYWdlLTAxMDE5Iik7CisgICAgdms6OkNyZWF0ZUltYWdlVmlldyhkZXYsICZpdmNpLCBOVUxMLCAmaW1hZ2Vfdmlldyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICByZXNldF92aWV3KCk7CisgICAgdms6OkRlc3Ryb3lTYW1wbGVyWWNiY3JDb252ZXJzaW9uKGRldiwgeWNiY3JfY29udiwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcoZGV2LCBpbWFnZV92aWV3LCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUltYWdlKGRldiwgaW1nLCBOVUxMKTsKKyAgICB2azo6RnJlZU1lbW9yeShkZXYsIGltZ19tZW0sIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckltcG9ydEJ1ZmZlcikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZlcmlmeSBBbmRyb2lkSGFyZHdhcmVCdWZmZXIgaW1wb3J0IGFzIGJ1ZmZlci4iKTsKKworICAgIFNldFRhcmdldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8xKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmICgoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSkpICYmCisgICAgICAgIC8vIEFsc28gc2tpcCBvbiBkZXZpY2VzIHRoYXQgYWR2ZXJ0aXNlIEFIQiwgYnV0IG5vdCB0aGUgcHJlLXJlcXVpc2l0ZSBmb3JlaWduX3F1ZXVlIGV4dGVuc2lvbgorICAgICAgICAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhURU5TSU9OX05BTUUpKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9RVUVVRV9GQU1JTFlfRk9SRUlHTl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBleHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIFZrRGV2aWNlIGRldiA9IG1fZGV2aWNlLT5kZXZpY2UoKTsKKworICAgIFZrRGV2aWNlTWVtb3J5IG1lbV9oYW5kbGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBhdXRvIHJlc2V0X21lbSA9IFsmbWVtX2hhbmRsZSwgZGV2XSgpIHsKKyAgICAgICAgaWYgKFZLX05VTExfSEFORExFICE9IG1lbV9oYW5kbGUpIHZrOjpGcmVlTWVtb3J5KGRldiwgbWVtX2hhbmRsZSwgTlVMTCk7CisgICAgICAgIG1lbV9oYW5kbGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9OworCisgICAgUEZOX3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQgcGZuX0dldEFIQlByb3BzID0KKyAgICAgICAgKFBGTl92a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKXZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXYsICJ2a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIik7CisgICAgQVNTRVJUX1RSVUUocGZuX0dldEFIQlByb3BzICE9IG51bGxwdHIpOworCisgICAgLy8gQUhCIHN0cnVjdHMKKyAgICBBSGFyZHdhcmVCdWZmZXIgKmFoYiA9IG51bGxwdHI7CisgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgYWhiX2Rlc2MgPSB7fTsKKyAgICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIGFoYl9wcm9wcyA9IHt9OworICAgIGFoYl9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1BST1BFUlRJRVNfQU5EUk9JRDsKKyAgICBWa0ltcG9ydEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lEIGlhaGJpID0ge307CisgICAgaWFoYmkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfSU5GT19BTkRST0lEOworCisgICAgLy8gQWxsb2NhdGUgYW4gQUhhcmR3YXJlQnVmZmVyCisgICAgYWhiX2Rlc2MuZm9ybWF0ID0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9CTE9COworICAgIGFoYl9kZXNjLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX1NFTlNPUl9ESVJFQ1RfREFUQTsKKyAgICBhaGJfZGVzYy53aWR0aCA9IDUxMjsKKyAgICBhaGJfZGVzYy5oZWlnaHQgPSAxOworICAgIGFoYl9kZXNjLmxheWVycyA9IDE7CisgICAgQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZhaGJfZGVzYywgJmFoYik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVlVJRC12a0dldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lELWJ1ZmZlci0wMTg4NCIpOworICAgIHBmbl9HZXRBSEJQcm9wcyhkZXYsIGFoYiwgJmFoYl9wcm9wcyk7CisgICAgaWFoYmkuYnVmZmVyID0gYWhiOworCisgICAgLy8gQ3JlYXRlIGV4cG9ydCBhbmQgaW1wb3J0IGJ1ZmZlcnMKKyAgICBWa0V4dGVybmFsTWVtb3J5QnVmZmVyQ3JlYXRlSW5mbyBleHRfYnVmX2luZm8gPSB7fTsKKyAgICBleHRfYnVmX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfQlVGRkVSX0NSRUFURV9JTkZPX0tIUjsKKyAgICBleHRfYnVmX2luZm8uaGFuZGxlVHlwZXMgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfSE9TVF9BTExPQ0FUSU9OX0JJVF9FWFQ7CisKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYmNpID0ge307CisgICAgYmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJjaS5wTmV4dCA9ICZleHRfYnVmX2luZm87CisgICAgYmNpLnNpemUgPSBhaGJfcHJvcHMuYWxsb2NhdGlvblNpemU7CisgICAgYmNpLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisKKyAgICBWa0J1ZmZlciBidWYgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6Q3JlYXRlQnVmZmVyKGRldiwgJmJjaSwgTlVMTCwgJmJ1Zik7CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisgICAgdms6OkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXYsIGJ1ZiwgJm1lbV9yZXFzKTsKKworICAgIC8vIEFsbG9jYXRpb24gaW5mbworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1haSA9IHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeTo6Z2V0X3Jlc291cmNlX2FsbG9jX2luZm8oKm1fZGV2aWNlLCBtZW1fcmVxcywgMCk7CisgICAgbWFpLnBOZXh0ID0gJmlhaGJpOyAgLy8gQ2hhaW5lZCBpbXBvcnQgc3RydWN0CisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgbWVtb3J5X2luZm87CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhncHUoKSwgJm1lbW9yeV9pbmZvKTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVtb3J5X2luZm8ubWVtb3J5VHlwZUNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKChhaGJfcHJvcHMubWVtb3J5VHlwZUJpdHMgJiAoMSA8PCBpKSkpIHsKKyAgICAgICAgICAgIG1haS5tZW1vcnlUeXBlSW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPj0gbWVtb3J5X2luZm8ubWVtb3J5VHlwZUNvdW50KSB7CisgICAgICAgIHByaW50ZigiJXMgTm8gaW52YWxpZCBtZW1vcnkgdHlwZSBpbmRleCBjb3VsZCBiZSBmb3VuZDsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYWhiKTsKKyAgICAgICAgcmVzZXRfbWVtKCk7CisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKGRldiwgYnVmLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEltcG9ydCBhcyBidWZmZXIgcmVxdWlyZXMgZm9ybWF0IEFIQl9GTVRfQkxPQiBhbmQgdXNhZ2UgQUhCX1VTQUdFX0dQVV9EQVRBX0JVRkZFUgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtJbXBvcnRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1idWZmZXItMDE4ODEiKTsKKyAgICAvLyBBbHNvIGNhdXNlcyAibm9uLWRlZGljYXRlZCBhbGxvY2F0aW9uIGZvcm1hdC91c2FnZSIgZXJyb3IKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrTWVtb3J5QWxsb2NhdGVJbmZvLXBOZXh0LTAyMzg0Iik7CisgICAgdms6OkFsbG9jYXRlTWVtb3J5KGRldiwgJm1haSwgTlVMTCwgJm1lbV9oYW5kbGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYWhiKTsKKyAgICByZXNldF9tZW0oKTsKKyAgICB2azo6RGVzdHJveUJ1ZmZlcihkZXYsIGJ1ZiwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQW5kcm9pZEhhcmR3YXJlQnVmZmVyRXhwb3J0dEJ1ZmZlcikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZlcmlmeSBBbmRyb2lkSGFyZHdhcmVCdWZmZXIgZXhwb3J0IG1lbW9yeSBhcyBBSEIuIik7CisKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfQU5EUk9JRF9FWFRFUk5BTF9NRU1PUllfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfRVhURU5TSU9OX05BTUUpKSAmJgorICAgICAgICAvLyBBbHNvIHNraXAgb24gZGV2aWNlcyB0aGF0IGFkdmVydGlzZSBBSEIsIGJ1dCBub3QgdGhlIHByZS1yZXF1aXNpdGUgZm9yZWlnbl9xdWV1ZSBleHRlbnNpb24KKyAgICAgICAgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX1FVRVVFX0ZBTUlMWV9GT1JFSUdOX0VYVEVOU0lPTl9OQU1FKSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19BTkRST0lEX0VYVEVSTkFMX01FTU9SWV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfRVhURVJOQUxfTUVNT1JZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfUVVFVUVfRkFNSUxZX0ZPUkVJR05fRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBWa0RldmljZSBkZXYgPSBtX2RldmljZS0+ZGV2aWNlKCk7CisKKyAgICBWa0RldmljZU1lbW9yeSBtZW1faGFuZGxlID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICAvLyBBbGxvY2F0ZSBkZXZpY2UgbWVtb3J5LCBubyBsaW5rZWQgZXhwb3J0IHN0cnVjdCBpbmRpY2F0aW5nIEFIQiBoYW5kbGUgdHlwZQorICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1haSA9IHt9OworICAgIG1haS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1haS5hbGxvY2F0aW9uU2l6ZSA9IDY1NTM2OworICAgIG1haS5tZW1vcnlUeXBlSW5kZXggPSAwOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXYsICZtYWksIE5VTEwsICZtZW1faGFuZGxlKTsKKworICAgIFBGTl92a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQgcGZuX0dldE1lbUFIQiA9CisgICAgICAgIChQRk5fdmtHZXRNZW1vcnlBbmRyb2lkSGFyZHdhcmVCdWZmZXJBTkRST0lEKXZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXYsICJ2a0dldE1lbW9yeUFuZHJvaWRIYXJkd2FyZUJ1ZmZlckFORFJPSUQiKTsKKyAgICBBU1NFUlRfVFJVRShwZm5fR2V0TWVtQUhCICE9IG51bGxwdHIpOworCisgICAgVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRCBtZ2FoYmkgPSB7fTsKKyAgICBtZ2FoYmkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfR0VUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0lORk9fQU5EUk9JRDsKKyAgICBtZ2FoYmkubWVtb3J5ID0gbWVtX2hhbmRsZTsKKyAgICBBSGFyZHdhcmVCdWZmZXIgKmFoYiA9IG51bGxwdHI7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa01lbW9yeUdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm9BTkRST0lELWhhbmRsZVR5cGVzLTAxODgyIik7CisgICAgcGZuX0dldE1lbUFIQihkZXYsICZtZ2FoYmksICZhaGIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgaWYgKGFoYikgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYWhiKTsKKyAgICBhaGIgPSBudWxscHRyOworICAgIGlmIChWS19OVUxMX0hBTkRMRSAhPSBtZW1faGFuZGxlKSB2azo6RnJlZU1lbW9yeShkZXYsIG1lbV9oYW5kbGUsIE5VTEwpOworICAgIG1lbV9oYW5kbGUgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIC8vIEFkZCBhbiBleHBvcnQgc3RydWN0IHdpdGggQUhCIGhhbmRsZSB0eXBlIHRvIGFsbG9jYXRpb24gaW5mbworICAgIFZrRXhwb3J0TWVtb3J5QWxsb2NhdGVJbmZvIGVtYWkgPSB7fTsKKyAgICBlbWFpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhQT1JUX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIGVtYWkuaGFuZGxlVHlwZXMgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfQklUX0FORFJPSUQ7CisgICAgbWFpLnBOZXh0ID0gJmVtYWk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW1hZ2UsIGRvIG5vdCBiaW5kIG1lbW9yeQorICAgIFZrSW1hZ2UgaW1nID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaWNpID0ge307CisgICAgaWNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaWNpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaWNpLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpY2kuZXh0ZW50ID0gezEyOCwgMTI4LCAxfTsKKyAgICBpY2kuZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIGljaS5taXBMZXZlbHMgPSAxOworICAgIGljaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBpY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgaWNpLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisgICAgdms6OkNyZWF0ZUltYWdlKGRldiwgJmljaSwgTlVMTCwgJmltZyk7CisgICAgQVNTRVJUX1RSVUUoVktfTlVMTF9IQU5ETEUgIT0gaW1nKTsKKworICAgIC8vIEFkZCBpbWFnZSB0byBhbGxvY2F0aW9uIGNoYWluIGFzIGRlZGljYXRlZCBpbmZvLCByZS1hbGxvY2F0ZQorICAgIFZrTWVtb3J5RGVkaWNhdGVkQWxsb2NhdGVJbmZvIG1kYWkgPSB7VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPfTsKKyAgICBtZGFpLmltYWdlID0gaW1nOworICAgIGVtYWkucE5leHQgPSAmbWRhaTsKKyAgICBtYWkuYWxsb2NhdGlvblNpemUgPSAwOworICAgIHZrOjpBbGxvY2F0ZU1lbW9yeShkZXYsICZtYWksIE5VTEwsICZtZW1faGFuZGxlKTsKKyAgICBtZ2FoYmkubWVtb3J5ID0gbWVtX2hhbmRsZTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtNZW1vcnlHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJJbmZvQU5EUk9JRC1wTmV4dC0wMTg4MyIpOworICAgIHBmbl9HZXRNZW1BSEIoZGV2LCAmbWdhaGJpLCAmYWhiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGlmIChhaGIpIEFIYXJkd2FyZUJ1ZmZlcl9yZWxlYXNlKGFoYik7CisgICAgaWYgKFZLX05VTExfSEFORExFICE9IG1lbV9oYW5kbGUpIHZrOjpGcmVlTWVtb3J5KGRldiwgbWVtX2hhbmRsZSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lJbWFnZShkZXYsIGltZywgTlVMTCk7Cit9CisKKyNlbmRpZiAgLy8gVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisKK1RFU1RfRihWa0xheWVyVGVzdCwgVmFsaWRhdGVTdHJpZGUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWYWxpZGF0ZSBTdHJpZGUuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdChudWxscHRyLCBudWxscHRyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtRdWVyeVBvb2wgcXVlcnlfcG9vbDsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jaXt9OworICAgIHF1ZXJ5X3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY2kucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9USU1FU1RBTVA7CisgICAgcXVlcnlfcG9vbF9jaS5xdWVyeUNvdW50ID0gMTsKKyAgICB2azo6Q3JlYXRlUXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnF1ZXJ5X3Bvb2xfY2ksIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kUmVzZXRRdWVyeVBvb2wobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMSk7CisgICAgdms6OkNtZFdyaXRlVGltZXN0YW1wKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwgcXVlcnlfcG9vbCwgMCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIGNoYXIgZGF0YV9zcGFjZTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1mbGFncy0wMjgyNyIpOworICAgIHZrOjpHZXRRdWVyeVBvb2xSZXN1bHRzKG1fZGV2aWNlLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMSwgc2l6ZW9mKGRhdGFfc3BhY2UpLCAmZGF0YV9zcGFjZSwgMSwgVktfUVVFUllfUkVTVUxUX1dBSVRfQklUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAwODE1Iik7CisgICAgdms6OkdldFF1ZXJ5UG9vbFJlc3VsdHMobV9kZXZpY2UtPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAxLCBzaXplb2YoZGF0YV9zcGFjZSksICZkYXRhX3NwYWNlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWS19RVUVSWV9SRVNVTFRfV0FJVF9CSVQgfCBWS19RVUVSWV9SRVNVTFRfNjRfQklUKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBjaGFyIGRhdGFfc3BhY2U0WzRdID0gIiI7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6R2V0UXVlcnlQb29sUmVzdWx0cyhtX2RldmljZS0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDEsIHNpemVvZihkYXRhX3NwYWNlNCksICZkYXRhX3NwYWNlNCwgNCwgVktfUVVFUllfUkVTVUxUX1dBSVRfQklUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIGNoYXIgZGF0YV9zcGFjZThbOF0gPSAiIjsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpHZXRRdWVyeVBvb2xSZXN1bHRzKG1fZGV2aWNlLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMSwgc2l6ZW9mKGRhdGFfc3BhY2U4KSwgJmRhdGFfc3BhY2U4LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWS19RVUVSWV9SRVNVTFRfV0FJVF9CSVQgfCBWS19RVUVSWV9SRVNVTFRfNjRfQklUKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB1aW50MzJfdCBxZmkgPSAwOworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmX2NyZWF0ZV9pbmZvID0ge307CisgICAgYnVmZl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZmX2NyZWF0ZV9pbmZvLnNpemUgPSAxMjg7CisgICAgYnVmZl9jcmVhdGVfaW5mby51c2FnZSA9CisgICAgICAgIFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfQlVGRkVSX1VTQUdFX0lORElSRUNUX0JVRkZFUl9CSVQgfCBWS19CVUZGRVJfVVNBR0VfSU5ERVhfQlVGRkVSX0JJVDsKKyAgICBidWZmX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgYnVmZl9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKyAgICBWa0J1ZmZlck9iaiBidWZmZXI7CisgICAgYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBidWZmX2NyZWF0ZV9pbmZvKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+cmVzZXQoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzLWZsYWdzLTAwODIyIik7CisgICAgdms6OkNtZENvcHlRdWVyeVBvb2xSZXN1bHRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDEsIGJ1ZmZlci5oYW5kbGUoKSwgMSwgMSwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMtZmxhZ3MtMDA4MjMiKTsKKyAgICB2azo6Q21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMSwgYnVmZmVyLmhhbmRsZSgpLCAxLCAxLCBWS19RVUVSWV9SRVNVTFRfNjRfQklUKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OkNtZENvcHlRdWVyeVBvb2xSZXN1bHRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDEsIGJ1ZmZlci5oYW5kbGUoKSwgNCwgNCwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAxLCBidWZmZXIuaGFuZGxlKCksIDgsIDgsIFZLX1FVRVJZX1JFU1VMVF82NF9CSVQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgaWYgKG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLm11bHRpRHJhd0luZGlyZWN0KSB7CisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIGhlbHBlcigqdGhpcyk7CisgICAgICAgIGhlbHBlci5Jbml0SW5mbygpOworICAgICAgICBoZWxwZXIuSW5pdFN0YXRlKCk7CisgICAgICAgIGhlbHBlci5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgaGVscGVyLnBpcGVsaW5lXyk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1kcmF3Q291bnQtMDA0NzYiKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdC1kcmF3Q291bnQtMDA0ODgiKTsKKyAgICAgICAgdms6OkNtZERyYXdJbmRpcmVjdChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIDAsIDEwMCwgMik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgICAgIHZrOjpDbWREcmF3SW5kaXJlY3QobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLmhhbmRsZSgpLCAwLCAyLCAyNCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIHZrOjpDbWRCaW5kSW5kZXhCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLmhhbmRsZSgpLCAwLCBWS19JTkRFWF9UWVBFX1VJTlQxNik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LWRyYXdDb3VudC0wMDUyOCIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdC1kcmF3Q291bnQtMDA1NDAiKTsKKyAgICAgICAgdms6OkNtZERyYXdJbmRleGVkSW5kaXJlY3QobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLmhhbmRsZSgpLCAwLCAxMDAsIDIpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgICAgICB2azo6Q21kRHJhd0luZGV4ZWRJbmRpcmVjdChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIDAsIDIsIDI0KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFRlc3QgcmVxdWlyZXMgdW5zdXBwb3J0ZWQgbXVsdGlEcmF3SW5kaXJlY3QgZmVhdHVyZS4gU2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICB9CisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCBxdWVyeV9wb29sLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBXYXJuaW5nU3dhcGNoYWluQ3JlYXRlSW5mb1ByZVRyYW5zZm9ybSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlByaW50IHdhcm5pbmcgd2hlbiBwcmVUcmFuc2Zvcm0gZG9lc24ndCBtYXRjaCBjdXJyZXRUcmFuc2Zvcm0iKTsKKworICAgIGlmICghQWRkU3VyZmFjZUluc3RhbmNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzdXJmYWNlIGV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoIUFkZFN3YXBjaGFpbkRldmljZUV4dGVuc2lvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgc3dhcGNoYWluIGV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU3dhcGNoYWluUHJlVHJhbnNmb3JtIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVlVJRC1Wa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFItcHJlVHJhbnNmb3JtLTAxMjc5Iik7CisgICAgSW5pdFN3YXBjaGFpbihWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSU5IRVJJVF9CSVRfS0hSKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBEZXN0cm95U3dhcGNoYWluKCk7Cit9CisKK2Jvb2wgSW5pdEZyYW1ld29ya0ZvclJheVRyYWNpbmdUZXN0KFZrUmVuZGVyRnJhbWV3b3JrICpyZW5kZXJGcmFtZXdvcmssIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJmluc3RhbmNlX2V4dGVuc2lvbl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJmRldmljZV9leHRlbnNpb25fbmFtZXMsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZF9ncHVfdmFsaWRhdGlvbiA9IGZhbHNlLCBib29sIG5lZWRfcHVzaF9kZXNjcmlwdG9ycyA9IGZhbHNlKSB7CisgICAgY29uc3Qgc3RkOjphcnJheTxjb25zdCBjaGFyICosIDE+IHJlcXVpcmVkX2luc3RhbmNlX2V4dGVuc2lvbnMgPSB7VktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FfTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgKnJlcXVpcmVkX2luc3RhbmNlX2V4dGVuc2lvbiA6IHJlcXVpcmVkX2luc3RhbmNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKHJlbmRlckZyYW1ld29yay0+SW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQocmVxdWlyZWRfaW5zdGFuY2VfZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhyZXF1aXJlZF9pbnN0YW5jZV9leHRlbnNpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyAlcyBpbnN0YW5jZSBleHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgsIHJlcXVpcmVkX2luc3RhbmNlX2V4dGVuc2lvbik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIGVuYWJsZXNbXSA9IHtWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9FWFR9OworICAgIFZrVmFsaWRhdGlvbkZlYXR1cmVzRVhUIGZlYXR1cmVzID0ge307CisgICAgZmVhdHVyZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9WQUxJREFUSU9OX0ZFQVRVUkVTX0VYVDsKKyAgICBmZWF0dXJlcy5lbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCA9IDE7CisgICAgZmVhdHVyZXMucEVuYWJsZWRWYWxpZGF0aW9uRmVhdHVyZXMgPSBlbmFibGVzOworCisgICAgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgKmVuYWJsZWRfZmVhdHVyZXMgPSBuZWVkX2dwdV92YWxpZGF0aW9uID8gJmZlYXR1cmVzIDogbnVsbHB0cjsKKworICAgIHJlbmRlckZyYW1ld29yay0+SW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIHVzZXJfZGF0YSwgZW5hYmxlZF9mZWF0dXJlcyk7CisKKyAgICBpZiAocmVuZGVyRnJhbWV3b3JrLT5EZXZpY2VJc01vY2tJQ0QoKSB8fCByZW5kZXJGcmFtZXdvcmstPkRldmljZVNpbXVsYXRpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIFRlc3Qgbm90IHN1cHBvcnRlZCBieSBNb2NrSUNELCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHsKKyAgICAgICAgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUsCisgICAgICAgIFZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FLAorICAgIH07CisgICAgaWYgKG5lZWRfcHVzaF9kZXNjcmlwdG9ycykgeworICAgICAgICByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucy5wdXNoX2JhY2soVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBjaGFyICpyZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKHJlbmRlckZyYW1ld29yay0+RGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKHJlbmRlckZyYW1ld29yay0+Z3B1KCksIG51bGxwdHIsIHJlcXVpcmVkX2RldmljZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgICBkZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhyZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgJXMgZGV2aWNlIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCwgcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVuZGVyRnJhbWV3b3JrLT5Jbml0U3RhdGUoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWYWxpZGF0ZUdlb21ldHJ5TlYpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWYWxpZGF0ZSBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGdlb21ldHJpZXMuIik7CisgICAgaWYgKCFJbml0RnJhbWV3b3JrRm9yUmF5VHJhY2luZ1Rlc3QodGhpcywgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgbV9lcnJvck1vbml0b3IpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0J1ZmZlck9iaiB2Ym87CisgICAgdmJvLmluaXQoKm1fZGV2aWNlLCAxMDI0LCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WKTsKKworICAgIFZrQnVmZmVyT2JqIGlibzsKKyAgICBpYm8uaW5pdCgqbV9kZXZpY2UsIDEwMjQsIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklULAorICAgICAgICAgICAgIFZLX0JVRkZFUl9VU0FHRV9SQVlfVFJBQ0lOR19CSVRfTlYpOworCisgICAgVmtCdWZmZXJPYmogdGJvOworICAgIHRiby5pbml0KCptX2RldmljZSwgMTAyNCwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQsCisgICAgICAgICAgICAgVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OVik7CisKKyAgICBWa0J1ZmZlck9iaiBhYWJiYm87CisgICAgYWFiYmJvLmluaXQoKm1fZGV2aWNlLCAxMDI0LCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WKTsKKworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyB1bmJvdW5kX2J1ZmZlcl9jaSA9IHt9OworICAgIHVuYm91bmRfYnVmZmVyX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIHVuYm91bmRfYnVmZmVyX2NpLnNpemUgPSAxMDI0OworICAgIHVuYm91bmRfYnVmZmVyX2NpLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OVjsKKyAgICBWa0J1ZmZlck9iaiB1bmJvdW5kX2J1ZmZlcjsKKyAgICB1bmJvdW5kX2J1ZmZlci5pbml0X25vX21lbSgqbV9kZXZpY2UsIHVuYm91bmRfYnVmZmVyX2NpKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiB2ZXJ0aWNlcyA9IHsxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAtMS4wZiwgMC4wZiwgMC4wZn07CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluZGljaWVzID0gezAsIDEsIDJ9OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiBhYWJicyA9IHswLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAxLjBmLCAxLjBmfTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gdHJhbnNmb3JtcyA9IHsxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmfTsKKworICAgIHVpbnQ4X3QgKm1hcHBlZF92Ym9fYnVmZmVyX2RhdGEgPSAodWludDhfdCAqKXZiby5tZW1vcnkoKS5tYXAoKTsKKyAgICBzdGQ6Om1lbWNweShtYXBwZWRfdmJvX2J1ZmZlcl9kYXRhLCAodWludDhfdCAqKXZlcnRpY2VzLmRhdGEoKSwgc2l6ZW9mKGZsb2F0KSAqIHZlcnRpY2VzLnNpemUoKSk7CisgICAgdmJvLm1lbW9yeSgpLnVubWFwKCk7CisKKyAgICB1aW50OF90ICptYXBwZWRfaWJvX2J1ZmZlcl9kYXRhID0gKHVpbnQ4X3QgKilpYm8ubWVtb3J5KCkubWFwKCk7CisgICAgc3RkOjptZW1jcHkobWFwcGVkX2lib19idWZmZXJfZGF0YSwgKHVpbnQ4X3QgKilpbmRpY2llcy5kYXRhKCksIHNpemVvZih1aW50MzJfdCkgKiBpbmRpY2llcy5zaXplKCkpOworICAgIGliby5tZW1vcnkoKS51bm1hcCgpOworCisgICAgdWludDhfdCAqbWFwcGVkX3Rib19idWZmZXJfZGF0YSA9ICh1aW50OF90ICopdGJvLm1lbW9yeSgpLm1hcCgpOworICAgIHN0ZDo6bWVtY3B5KG1hcHBlZF90Ym9fYnVmZmVyX2RhdGEsICh1aW50OF90ICopdHJhbnNmb3Jtcy5kYXRhKCksIHNpemVvZihmbG9hdCkgKiB0cmFuc2Zvcm1zLnNpemUoKSk7CisgICAgdGJvLm1lbW9yeSgpLnVubWFwKCk7CisKKyAgICB1aW50OF90ICptYXBwZWRfYWFiYmJvX2J1ZmZlcl9kYXRhID0gKHVpbnQ4X3QgKilhYWJiYm8ubWVtb3J5KCkubWFwKCk7CisgICAgc3RkOjptZW1jcHkobWFwcGVkX2FhYmJib19idWZmZXJfZGF0YSwgKHVpbnQ4X3QgKilhYWJicy5kYXRhKCksIHNpemVvZihmbG9hdCkgKiBhYWJicy5zaXplKCkpOworICAgIGFhYmJiby5tZW1vcnkoKS51bm1hcCgpOworCisgICAgVmtHZW9tZXRyeU5WIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcyA9IHt9OworICAgIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WOworICAgIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcy5nZW9tZXRyeVR5cGUgPSBWS19HRU9NRVRSWV9UWVBFX1RSSUFOR0xFU19OVjsKKyAgICB2YWxpZF9nZW9tZXRyeV90cmlhbmdsZXMuZ2VvbWV0cnkudHJpYW5nbGVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WOworICAgIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcy5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4RGF0YSA9IHZiby5oYW5kbGUoKTsKKyAgICB2YWxpZF9nZW9tZXRyeV90cmlhbmdsZXMuZ2VvbWV0cnkudHJpYW5nbGVzLnZlcnRleE9mZnNldCA9IDA7CisgICAgdmFsaWRfZ2VvbWV0cnlfdHJpYW5nbGVzLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhDb3VudCA9IDM7CisgICAgdmFsaWRfZ2VvbWV0cnlfdHJpYW5nbGVzLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhTdHJpZGUgPSAxMjsKKyAgICB2YWxpZF9nZW9tZXRyeV90cmlhbmdsZXMuZ2VvbWV0cnkudHJpYW5nbGVzLnZlcnRleEZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUOworICAgIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcy5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhEYXRhID0gaWJvLmhhbmRsZSgpOworICAgIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcy5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhPZmZzZXQgPSAwOworICAgIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcy5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhDb3VudCA9IDM7CisgICAgdmFsaWRfZ2VvbWV0cnlfdHJpYW5nbGVzLmdlb21ldHJ5LnRyaWFuZ2xlcy5pbmRleFR5cGUgPSBWS19JTkRFWF9UWVBFX1VJTlQzMjsKKyAgICB2YWxpZF9nZW9tZXRyeV90cmlhbmdsZXMuZ2VvbWV0cnkudHJpYW5nbGVzLnRyYW5zZm9ybURhdGEgPSB0Ym8uaGFuZGxlKCk7CisgICAgdmFsaWRfZ2VvbWV0cnlfdHJpYW5nbGVzLmdlb21ldHJ5LnRyaWFuZ2xlcy50cmFuc2Zvcm1PZmZzZXQgPSAwOworICAgIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcy5nZW9tZXRyeS5hYWJicyA9IHt9OworICAgIHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlcy5nZW9tZXRyeS5hYWJicy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX0FBQkJfTlY7CisKKyAgICBWa0dlb21ldHJ5TlYgdmFsaWRfZ2VvbWV0cnlfYWFiYnMgPSB7fTsKKyAgICB2YWxpZF9nZW9tZXRyeV9hYWJicy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WOworICAgIHZhbGlkX2dlb21ldHJ5X2FhYmJzLmdlb21ldHJ5VHlwZSA9IFZLX0dFT01FVFJZX1RZUEVfQUFCQlNfTlY7CisgICAgdmFsaWRfZ2VvbWV0cnlfYWFiYnMuZ2VvbWV0cnkudHJpYW5nbGVzID0ge307CisgICAgdmFsaWRfZ2VvbWV0cnlfYWFiYnMuZ2VvbWV0cnkudHJpYW5nbGVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WOworICAgIHZhbGlkX2dlb21ldHJ5X2FhYmJzLmdlb21ldHJ5LmFhYmJzID0ge307CisgICAgdmFsaWRfZ2VvbWV0cnlfYWFiYnMuZ2VvbWV0cnkuYWFiYnMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WOworICAgIHZhbGlkX2dlb21ldHJ5X2FhYmJzLmdlb21ldHJ5LmFhYmJzLmFhYmJEYXRhID0gYWFiYmJvLmhhbmRsZSgpOworICAgIHZhbGlkX2dlb21ldHJ5X2FhYmJzLmdlb21ldHJ5LmFhYmJzLm51bUFBQkJzID0gMTsKKyAgICB2YWxpZF9nZW9tZXRyeV9hYWJicy5nZW9tZXRyeS5hYWJicy5vZmZzZXQgPSAwOworICAgIHZhbGlkX2dlb21ldHJ5X2FhYmJzLmdlb21ldHJ5LmFhYmJzLnN0cmlkZSA9IDI0OworCisgICAgUEZOX3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+KAorICAgICAgICB2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpKTsKKyAgICBhc3NlcnQodmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAhPSBudWxscHRyKTsKKworICAgIGNvbnN0IGF1dG8gR2V0Q3JlYXRlSW5mbyA9IFtdKGNvbnN0IFZrR2VvbWV0cnlOViAmZ2VvbWV0cnkpIHsKKyAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYXNfY3JlYXRlX2luZm8gPSB7fTsKKyAgICAgICAgYXNfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NSRUFURV9JTkZPX05WOworICAgICAgICBhc19jcmVhdGVfaW5mby5pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9JTkZPX05WOworICAgICAgICBhc19jcmVhdGVfaW5mby5pbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WOworICAgICAgICBhc19jcmVhdGVfaW5mby5pbmZvLmluc3RhbmNlQ291bnQgPSAwOworICAgICAgICBhc19jcmVhdGVfaW5mby5pbmZvLmdlb21ldHJ5Q291bnQgPSAxOworICAgICAgICBhc19jcmVhdGVfaW5mby5pbmZvLnBHZW9tZXRyaWVzID0gJmdlb21ldHJ5OworICAgICAgICByZXR1cm4gYXNfY3JlYXRlX2luZm87CisgICAgfTsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYXM7CisKKyAgICAvLyBJbnZhbGlkIHZlcnRleCBmb3JtYXQuCisgICAgeworICAgICAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnkgPSB2YWxpZF9nZW9tZXRyeV90cmlhbmdsZXM7CisgICAgICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQgPSBWS19GT1JNQVRfUjY0X1VJTlQ7CisKKyAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYXNfY3JlYXRlX2luZm8gPSBHZXRDcmVhdGVJbmZvKGdlb21ldHJ5KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtdmVydGV4Rm9ybWF0LTAyNDMwIik7CisgICAgICAgIHZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYobV9kZXZpY2UtPmhhbmRsZSgpLCAmYXNfY3JlYXRlX2luZm8sIG51bGxwdHIsICZhcyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKyAgICAvLyBJbnZhbGlkIHZlcnRleCBvZmZzZXQgLSBub3QgbXVsdGlwbGUgb2YgY29tcG9uZW50IHNpemUuCisgICAgeworICAgICAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnkgPSB2YWxpZF9nZW9tZXRyeV90cmlhbmdsZXM7CisgICAgICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhPZmZzZXQgPSAxOworCisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGFzX2NyZWF0ZV9pbmZvID0gR2V0Q3JlYXRlSW5mbyhnZW9tZXRyeSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleE9mZnNldC0wMjQyOSIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisgICAgLy8gSW52YWxpZCB2ZXJ0ZXggb2Zmc2V0IC0gYmlnZ2VyIHRoYW4gYnVmZmVyLgorICAgIHsKKyAgICAgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5ID0gdmFsaWRfZ2VvbWV0cnlfdHJpYW5nbGVzOworICAgICAgICBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4T2Zmc2V0ID0gMTIgKiAxMDI0OworCisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGFzX2NyZWF0ZV9pbmZvID0gR2V0Q3JlYXRlSW5mbyhnZW9tZXRyeSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleE9mZnNldC0wMjQyOCIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisgICAgLy8gSW52YWxpZCB2ZXJ0ZXggYnVmZmVyIC0gbm8gc3VjaCBidWZmZXIuCisgICAgeworICAgICAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnkgPSB2YWxpZF9nZW9tZXRyeV90cmlhbmdsZXM7CisgICAgICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhEYXRhID0gVmtCdWZmZXIoMTIzNDU2Nzg5KTsKKworICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBhc19jcmVhdGVfaW5mbyA9IEdldENyZWF0ZUluZm8oZ2VvbWV0cnkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi12ZXJ0ZXhEYXRhLXBhcmFtZXRlciIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisgICAgLy8gSW52YWxpZCB2ZXJ0ZXggYnVmZmVyIC0gbm8gbWVtb3J5IGJvdW5kLgorICAgIHsKKyAgICAgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5ID0gdmFsaWRfZ2VvbWV0cnlfdHJpYW5nbGVzOworICAgICAgICBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4RGF0YSA9IHVuYm91bmRfYnVmZmVyLmhhbmRsZSgpOworCisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGFzX2NyZWF0ZV9pbmZvID0gR2V0Q3JlYXRlSW5mbyhnZW9tZXRyeSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXZlcnRleE9mZnNldC0wMjQyOCIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBJbnZhbGlkIGluZGV4IG9mZnNldCAtIG5vdCBtdWx0aXBsZSBvZiBpbmRleCBzaXplLgorICAgIHsKKyAgICAgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5ID0gdmFsaWRfZ2VvbWV0cnlfdHJpYW5nbGVzOworICAgICAgICBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhPZmZzZXQgPSAxOworCisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGFzX2NyZWF0ZV9pbmZvID0gR2V0Q3JlYXRlSW5mbyhnZW9tZXRyeSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4T2Zmc2V0LTAyNDMyIik7CisgICAgICAgIHZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYobV9kZXZpY2UtPmhhbmRsZSgpLCAmYXNfY3JlYXRlX2luZm8sIG51bGxwdHIsICZhcyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKyAgICAvLyBJbnZhbGlkIGluZGV4IG9mZnNldCAtIGJpZ2dlciB0aGFuIGJ1ZmZlci4KKyAgICB7CisgICAgICAgIFZrR2VvbWV0cnlOViBnZW9tZXRyeSA9IHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlczsKKyAgICAgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4T2Zmc2V0ID0gMjA0ODsKKworICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBhc19jcmVhdGVfaW5mbyA9IEdldENyZWF0ZUluZm8oZ2VvbWV0cnkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi1pbmRleE9mZnNldC0wMjQzMSIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisgICAgLy8gSW52YWxpZCBpbmRleCBjb3VudCAtIG11c3QgYmUgMCBpZiB0eXBlIGlzIFZLX0lOREVYX1RZUEVfTk9ORV9OVi4KKyAgICB7CisgICAgICAgIFZrR2VvbWV0cnlOViBnZW9tZXRyeSA9IHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlczsKKyAgICAgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4VHlwZSA9IFZLX0lOREVYX1RZUEVfTk9ORV9OVjsKKyAgICAgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4RGF0YSA9IFZLX05VTExfSEFORExFOworICAgICAgICBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMuaW5kZXhDb3VudCA9IDE7CisKKyAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYXNfY3JlYXRlX2luZm8gPSBHZXRDcmVhdGVJbmZvKGdlb21ldHJ5KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0dlb21ldHJ5VHJpYW5nbGVzTlYtaW5kZXhDb3VudC0wMjQzNiIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisgICAgLy8gSW52YWxpZCBpbmRleCBkYXRhIC0gbXVzdCBiZSBWS19OVUxMX0hBTkRMRSBpZiB0eXBlIGlzIFZLX0lOREVYX1RZUEVfTk9ORV9OVi4KKyAgICB7CisgICAgICAgIFZrR2VvbWV0cnlOViBnZW9tZXRyeSA9IHZhbGlkX2dlb21ldHJ5X3RyaWFuZ2xlczsKKyAgICAgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4VHlwZSA9IFZLX0lOREVYX1RZUEVfTk9ORV9OVjsKKyAgICAgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4RGF0YSA9IGliby5oYW5kbGUoKTsKKyAgICAgICAgZ2VvbWV0cnkuZ2VvbWV0cnkudHJpYW5nbGVzLmluZGV4Q291bnQgPSAwOworCisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGFzX2NyZWF0ZV9pbmZvID0gR2V0Q3JlYXRlSW5mbyhnZW9tZXRyeSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLWluZGV4RGF0YS0wMjQzNCIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBJbnZhbGlkIHRyYW5zZm9ybSBvZmZzZXQgLSBub3QgbXVsdGlwbGUgb2YgMTYuCisgICAgeworICAgICAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnkgPSB2YWxpZF9nZW9tZXRyeV90cmlhbmdsZXM7CisgICAgICAgIGdlb21ldHJ5Lmdlb21ldHJ5LnRyaWFuZ2xlcy50cmFuc2Zvcm1PZmZzZXQgPSAxOworCisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGFzX2NyZWF0ZV9pbmZvID0gR2V0Q3JlYXRlSW5mbyhnZW9tZXRyeSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtHZW9tZXRyeVRyaWFuZ2xlc05WLXRyYW5zZm9ybU9mZnNldC0wMjQzOCIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisgICAgLy8gSW52YWxpZCB0cmFuc2Zvcm0gb2Zmc2V0IC0gYmlnZ2VyIHRoYW4gYnVmZmVyLgorICAgIHsKKyAgICAgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5ID0gdmFsaWRfZ2VvbWV0cnlfdHJpYW5nbGVzOworICAgICAgICBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMudHJhbnNmb3JtT2Zmc2V0ID0gMjA0ODsKKworICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBhc19jcmVhdGVfaW5mbyA9IEdldENyZWF0ZUluZm8oZ2VvbWV0cnkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrR2VvbWV0cnlUcmlhbmdsZXNOVi10cmFuc2Zvcm1PZmZzZXQtMDI0MzciKTsKKyAgICAgICAgdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2RldmljZS0+aGFuZGxlKCksICZhc19jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmFzKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gSW52YWxpZCBhYWJiIG9mZnNldCAtIG5vdCBtdWx0aXBsZSBvZiA4LgorICAgIHsKKyAgICAgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5ID0gdmFsaWRfZ2VvbWV0cnlfYWFiYnM7CisgICAgICAgIGdlb21ldHJ5Lmdlb21ldHJ5LmFhYmJzLm9mZnNldCA9IDE7CisKKyAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYXNfY3JlYXRlX2luZm8gPSBHZXRDcmVhdGVJbmZvKGdlb21ldHJ5KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0dlb21ldHJ5QUFCQk5WLW9mZnNldC0wMjQ0MCIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmFzX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisgICAgLy8gSW52YWxpZCBhYWJiIG9mZnNldCAtIGJpZ2dlciB0aGFuIGJ1ZmZlci4KKyAgICB7CisgICAgICAgIFZrR2VvbWV0cnlOViBnZW9tZXRyeSA9IHZhbGlkX2dlb21ldHJ5X2FhYmJzOworICAgICAgICBnZW9tZXRyeS5nZW9tZXRyeS5hYWJicy5vZmZzZXQgPSA4ICogMTAyNDsKKworICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBhc19jcmVhdGVfaW5mbyA9IEdldENyZWF0ZUluZm8oZ2VvbWV0cnkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrR2VvbWV0cnlBQUJCTlYtb2Zmc2V0LTAyNDM5Iik7CisgICAgICAgIHZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYobV9kZXZpY2UtPmhhbmRsZSgpLCAmYXNfY3JlYXRlX2luZm8sIG51bGxwdHIsICZhcyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKyAgICAvLyBJbnZhbGlkIGFhYmIgc3RyaWRlIC0gbm90IG11bHRpcGxlIG9mIDguCisgICAgeworICAgICAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnkgPSB2YWxpZF9nZW9tZXRyeV9hYWJiczsKKyAgICAgICAgZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMuc3RyaWRlID0gMTsKKworICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBhc19jcmVhdGVfaW5mbyA9IEdldENyZWF0ZUluZm8oZ2VvbWV0cnkpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrR2VvbWV0cnlBQUJCTlYtc3RyaWRlLTAyNDQxIik7CisgICAgICAgIHZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYobV9kZXZpY2UtPmhhbmRsZSgpLCAmYXNfY3JlYXRlX2luZm8sIG51bGxwdHIsICZhcyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KK30KKwordm9pZCBHZXRTaW1wbGVHZW9tZXRyeUZvckFjY2VsZXJhdGlvblN0cnVjdHVyZVRlc3RzKGNvbnN0IFZrRGV2aWNlT2JqICZkZXZpY2UsIFZrQnVmZmVyT2JqICp2Ym8sIFZrQnVmZmVyT2JqICppYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtHZW9tZXRyeU5WICpnZW9tZXRyeSkgeworICAgIHZiby0+aW5pdChkZXZpY2UsIDEwMjQsIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklULAorICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WKTsKKyAgICBpYm8tPmluaXQoZGV2aWNlLCAxMDI0LCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgVktfQlVGRkVSX1VTQUdFX1JBWV9UUkFDSU5HX0JJVF9OVik7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gdmVydGljZXMgPSB7MS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgLTEuMGYsIDAuMGYsIDAuMGZ9OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBpbmRpY2llcyA9IHswLCAxLCAyfTsKKworICAgIHVpbnQ4X3QgKm1hcHBlZF92Ym9fYnVmZmVyX2RhdGEgPSAodWludDhfdCAqKXZiby0+bWVtb3J5KCkubWFwKCk7CisgICAgc3RkOjptZW1jcHkobWFwcGVkX3Zib19idWZmZXJfZGF0YSwgKHVpbnQ4X3QgKil2ZXJ0aWNlcy5kYXRhKCksIHNpemVvZihmbG9hdCkgKiB2ZXJ0aWNlcy5zaXplKCkpOworICAgIHZiby0+bWVtb3J5KCkudW5tYXAoKTsKKworICAgIHVpbnQ4X3QgKm1hcHBlZF9pYm9fYnVmZmVyX2RhdGEgPSAodWludDhfdCAqKWliby0+bWVtb3J5KCkubWFwKCk7CisgICAgc3RkOjptZW1jcHkobWFwcGVkX2lib19idWZmZXJfZGF0YSwgKHVpbnQ4X3QgKilpbmRpY2llcy5kYXRhKCksIHNpemVvZih1aW50MzJfdCkgKiBpbmRpY2llcy5zaXplKCkpOworICAgIGliby0+bWVtb3J5KCkudW5tYXAoKTsKKworICAgICpnZW9tZXRyeSA9IHt9OworICAgIGdlb21ldHJ5LT5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX05WOworICAgIGdlb21ldHJ5LT5nZW9tZXRyeVR5cGUgPSBWS19HRU9NRVRSWV9UWVBFX1RSSUFOR0xFU19OVjsKKyAgICBnZW9tZXRyeS0+Z2VvbWV0cnkudHJpYW5nbGVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfVFJJQU5HTEVTX05WOworICAgIGdlb21ldHJ5LT5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4RGF0YSA9IHZiby0+aGFuZGxlKCk7CisgICAgZ2VvbWV0cnktPmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhPZmZzZXQgPSAwOworICAgIGdlb21ldHJ5LT5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4Q291bnQgPSAzOworICAgIGdlb21ldHJ5LT5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4U3RyaWRlID0gMTI7CisgICAgZ2VvbWV0cnktPmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhGb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVDsKKyAgICBnZW9tZXRyeS0+Z2VvbWV0cnkudHJpYW5nbGVzLmluZGV4RGF0YSA9IGliby0+aGFuZGxlKCk7CisgICAgZ2VvbWV0cnktPmdlb21ldHJ5LnRyaWFuZ2xlcy5pbmRleE9mZnNldCA9IDA7CisgICAgZ2VvbWV0cnktPmdlb21ldHJ5LnRyaWFuZ2xlcy5pbmRleENvdW50ID0gMzsKKyAgICBnZW9tZXRyeS0+Z2VvbWV0cnkudHJpYW5nbGVzLmluZGV4VHlwZSA9IFZLX0lOREVYX1RZUEVfVUlOVDMyOworICAgIGdlb21ldHJ5LT5nZW9tZXRyeS50cmlhbmdsZXMudHJhbnNmb3JtRGF0YSA9IFZLX05VTExfSEFORExFOworICAgIGdlb21ldHJ5LT5nZW9tZXRyeS50cmlhbmdsZXMudHJhbnNmb3JtT2Zmc2V0ID0gMDsKKyAgICBnZW9tZXRyeS0+Z2VvbWV0cnkuYWFiYnMgPSB7fTsKKyAgICBnZW9tZXRyeS0+Z2VvbWV0cnkuYWFiYnMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9BQUJCX05WOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFZhbGlkYXRlQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWYWxpZGF0ZSBhY2NlbGVyYXRpb24gc3RydWN0dXJlIGNyZWF0aW9uLiIpOworICAgIGlmICghSW5pdEZyYW1ld29ya0ZvclJheVRyYWNpbmdUZXN0KHRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMsIG1fZXJyb3JNb25pdG9yKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEZOX3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+KAorICAgICAgICB2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpKTsKKyAgICBhc3NlcnQodmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAhPSBudWxscHRyKTsKKworICAgIFZrQnVmZmVyT2JqIHZibzsKKyAgICBWa0J1ZmZlck9iaiBpYm87CisgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5OworICAgIEdldFNpbXBsZUdlb21ldHJ5Rm9yQWNjZWxlcmF0aW9uU3RydWN0dXJlVGVzdHMoKm1fZGV2aWNlLCAmdmJvLCAmaWJvLCAmZ2VvbWV0cnkpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYXNfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBhc19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7CisgICAgYXNfY3JlYXRlX2luZm8uaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OVjsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgYXMgPSBWS19OVUxMX0hBTkRMRTsKKworICAgIC8vIFRvcCBsZXZlbCBjYW4gbm90IGhhdmUgZ2VvbWV0cnkKKyAgICB7CisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGJhZF90b3BfbGV2ZWxfY3JlYXRlX2luZm8gPSBhc19jcmVhdGVfaW5mbzsKKyAgICAgICAgYmFkX3RvcF9sZXZlbF9jcmVhdGVfaW5mby5pbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfVE9QX0xFVkVMX05WOworICAgICAgICBiYWRfdG9wX2xldmVsX2NyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCA9IDA7CisgICAgICAgIGJhZF90b3BfbGV2ZWxfY3JlYXRlX2luZm8uaW5mby5nZW9tZXRyeUNvdW50ID0gMTsKKyAgICAgICAgYmFkX3RvcF9sZXZlbF9jcmVhdGVfaW5mby5pbmZvLnBHZW9tZXRyaWVzID0gJmdlb21ldHJ5OworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXR5cGUtMDI0MjUiKTsKKyAgICAgICAgdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2RldmljZS0+aGFuZGxlKCksICZiYWRfdG9wX2xldmVsX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBCb3QgbGV2ZWwgY2FuIG5vdCBoYXZlIGluc3RhbmNlcworICAgIHsKKyAgICAgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYmFkX2JvdF9sZXZlbF9jcmVhdGVfaW5mbyA9IGFzX2NyZWF0ZV9pbmZvOworICAgICAgICBiYWRfYm90X2xldmVsX2NyZWF0ZV9pbmZvLmluZm8udHlwZSA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlY7CisgICAgICAgIGJhZF9ib3RfbGV2ZWxfY3JlYXRlX2luZm8uaW5mby5pbnN0YW5jZUNvdW50ID0gMTsKKyAgICAgICAgYmFkX2JvdF9sZXZlbF9jcmVhdGVfaW5mby5pbmZvLmdlb21ldHJ5Q291bnQgPSAwOworICAgICAgICBiYWRfYm90X2xldmVsX2NyZWF0ZV9pbmZvLmluZm8ucEdlb21ldHJpZXMgPSBudWxscHRyOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WLXR5cGUtMDI0MjYiKTsKKyAgICAgICAgdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2RldmljZS0+aGFuZGxlKCksICZiYWRfYm90X2xldmVsX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmYXMpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBDYW4gbm90IHByZWZlciBib3RoIGZhc3QgdHJhY2UgYW5kIGZhc3QgYnVpbGQKKyAgICB7CisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGJhZF9mbGFnc19sZXZlbF9jcmVhdGVfaW5mbyA9IGFzX2NyZWF0ZV9pbmZvOworICAgICAgICBiYWRfZmxhZ3NfbGV2ZWxfY3JlYXRlX2luZm8uaW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX0JPVFRPTV9MRVZFTF9OVjsKKyAgICAgICAgYmFkX2ZsYWdzX2xldmVsX2NyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCA9IDA7CisgICAgICAgIGJhZF9mbGFnc19sZXZlbF9jcmVhdGVfaW5mby5pbmZvLmdlb21ldHJ5Q291bnQgPSAxOworICAgICAgICBiYWRfZmxhZ3NfbGV2ZWxfY3JlYXRlX2luZm8uaW5mby5wR2VvbWV0cmllcyA9ICZnZW9tZXRyeTsKKyAgICAgICAgYmFkX2ZsYWdzX2xldmVsX2NyZWF0ZV9pbmZvLmluZm8uZmxhZ3MgPQorICAgICAgICAgICAgVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9QUkVGRVJfRkFTVF9UUkFDRV9CSVRfTlYgfCBWS19CVUlMRF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1BSRUZFUl9GQVNUX0JVSUxEX0JJVF9OVjsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZUluZm9OVi1mbGFncy0wMjU5MiIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJmJhZF9mbGFnc19sZXZlbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmFzKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gQ2FuIG5vdCBoYXZlIGdlb21ldHJ5IG9yIGluc3RhbmNlIGZvciBjb21wYWN0aW5nCisgICAgeworICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBiYWRfY29tcGFjdGluZ19hc19jcmVhdGVfaW5mbyA9IGFzX2NyZWF0ZV9pbmZvOworICAgICAgICBiYWRfY29tcGFjdGluZ19hc19jcmVhdGVfaW5mby5pbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WOworICAgICAgICBiYWRfY29tcGFjdGluZ19hc19jcmVhdGVfaW5mby5pbmZvLmluc3RhbmNlQ291bnQgPSAwOworICAgICAgICBiYWRfY29tcGFjdGluZ19hc19jcmVhdGVfaW5mby5pbmZvLmdlb21ldHJ5Q291bnQgPSAxOworICAgICAgICBiYWRfY29tcGFjdGluZ19hc19jcmVhdGVfaW5mby5pbmZvLnBHZW9tZXRyaWVzID0gJmdlb21ldHJ5OworICAgICAgICBiYWRfY29tcGFjdGluZ19hc19jcmVhdGVfaW5mby5pbmZvLmZsYWdzID0gMDsKKyAgICAgICAgYmFkX2NvbXBhY3RpbmdfYXNfY3JlYXRlX2luZm8uY29tcGFjdGVkU2l6ZSA9IDEwMjQ7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WLWNvbXBhY3RlZFNpemUtMDI0MjEiKTsKKyAgICAgICAgdmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2RldmljZS0+aGFuZGxlKCksICZiYWRfY29tcGFjdGluZ19hc19jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmFzKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gQ2FuIG5vdCBtaXggZGlmZmVyZW50IGdlb21ldHJ5IHR5cGVzIGludG8gc2luZ2xlIGJvdHRvbSBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlCisgICAgeworICAgICAgICBWa0dlb21ldHJ5TlYgYWFiYl9nZW9tZXRyeSA9IHt9OworICAgICAgICBhYWJiX2dlb21ldHJ5LnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfR0VPTUVUUllfTlY7CisgICAgICAgIGFhYmJfZ2VvbWV0cnkuZ2VvbWV0cnlUeXBlID0gVktfR0VPTUVUUllfVFlQRV9BQUJCU19OVjsKKyAgICAgICAgYWFiYl9nZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9HRU9NRVRSWV9UUklBTkdMRVNfTlY7CisgICAgICAgIGFhYmJfZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMgPSB7fTsKKyAgICAgICAgYWFiYl9nZW9tZXRyeS5nZW9tZXRyeS5hYWJicy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dFT01FVFJZX0FBQkJfTlY7CisgICAgICAgIC8vIEJ1ZmZlciBjb250ZW50cyBkbyBub3QgbWF0dGVyIGZvciB0aGlzIHRlc3QuCisgICAgICAgIGFhYmJfZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMuYWFiYkRhdGEgPSBnZW9tZXRyeS5nZW9tZXRyeS50cmlhbmdsZXMudmVydGV4RGF0YTsKKyAgICAgICAgYWFiYl9nZW9tZXRyeS5nZW9tZXRyeS5hYWJicy5udW1BQUJCcyA9IDE7CisgICAgICAgIGFhYmJfZ2VvbWV0cnkuZ2VvbWV0cnkuYWFiYnMub2Zmc2V0ID0gMDsKKyAgICAgICAgYWFiYl9nZW9tZXRyeS5nZW9tZXRyeS5hYWJicy5zdHJpZGUgPSAyNDsKKworICAgICAgICBzdGQ6OnZlY3RvcjxWa0dlb21ldHJ5TlY+IGdlb21ldHJpZXMgPSB7Z2VvbWV0cnksIGFhYmJfZ2VvbWV0cnl9OworCisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIG1peF9nZW9tZXRyeV90eXBlc19hc19jcmVhdGVfaW5mbyA9IGFzX2NyZWF0ZV9pbmZvOworICAgICAgICBtaXhfZ2VvbWV0cnlfdHlwZXNfYXNfY3JlYXRlX2luZm8uaW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX0JPVFRPTV9MRVZFTF9OVjsKKyAgICAgICAgbWl4X2dlb21ldHJ5X3R5cGVzX2FzX2NyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCA9IDA7CisgICAgICAgIG1peF9nZW9tZXRyeV90eXBlc19hc19jcmVhdGVfaW5mby5pbmZvLmdlb21ldHJ5Q291bnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZ2VvbWV0cmllcy5zaXplKCkpOworICAgICAgICBtaXhfZ2VvbWV0cnlfdHlwZXNfYXNfY3JlYXRlX2luZm8uaW5mby5wR2VvbWV0cmllcyA9IGdlb21ldHJpZXMuZGF0YSgpOworICAgICAgICBtaXhfZ2VvbWV0cnlfdHlwZXNfYXNfY3JlYXRlX2luZm8uaW5mby5mbGFncyA9IDA7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYtcEdlb21ldHJpZXMtWFhYWCIpOworICAgICAgICB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgJm1peF9nZW9tZXRyeV90eXBlc19hc19jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmFzKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFZhbGlkYXRlQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmFsaWRhdGUgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBiaW5kaW5nLiIpOworICAgIGlmICghSW5pdEZyYW1ld29ya0ZvclJheVRyYWNpbmdUZXN0KHRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMsIG1fZXJyb3JNb25pdG9yKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEZOX3ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIHZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlY+KAorICAgICAgICAgICAgdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5oYW5kbGUoKSwgInZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WIikpOworICAgIGFzc2VydCh2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViAhPSBudWxscHRyKTsKKworICAgIFZrQnVmZmVyT2JqIHZibzsKKyAgICBWa0J1ZmZlck9iaiBpYm87CisgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5OworICAgIEdldFNpbXBsZUdlb21ldHJ5Rm9yQWNjZWxlcmF0aW9uU3RydWN0dXJlVGVzdHMoKm1fZGV2aWNlLCAmdmJvLCAmaWJvLCAmZ2VvbWV0cnkpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYXNfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBhc19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7CisgICAgYXNfY3JlYXRlX2luZm8uaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OVjsKKyAgICBhc19jcmVhdGVfaW5mby5pbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WOworICAgIGFzX2NyZWF0ZV9pbmZvLmluZm8uZ2VvbWV0cnlDb3VudCA9IDE7CisgICAgYXNfY3JlYXRlX2luZm8uaW5mby5wR2VvbWV0cmllcyA9ICZnZW9tZXRyeTsKKyAgICBhc19jcmVhdGVfaW5mby5pbmZvLmluc3RhbmNlQ291bnQgPSAwOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogYXMoKm1fZGV2aWNlLCBhc19jcmVhdGVfaW5mbywgZmFsc2UpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgYXNfbWVtb3J5X3JlcXVpcmVtZW50cyA9IGFzLm1lbW9yeV9yZXF1aXJlbWVudHMoKS5tZW1vcnlSZXF1aXJlbWVudHM7CisKKyAgICBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgYXNfYmluZF9pbmZvID0ge307CisgICAgYXNfYmluZF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9JTkZPX05WOworICAgIGFzX2JpbmRfaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBhcy5oYW5kbGUoKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGFzX21lbW9yeV9hbGxvYyA9IHt9OworICAgIGFzX21lbW9yeV9hbGxvYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIGFzX21lbW9yeV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IGFzX21lbW9yeV9yZXF1aXJlbWVudHMuc2l6ZTsKKyAgICBBU1NFUlRfVFJVRShtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKGFzX21lbW9yeV9yZXF1aXJlbWVudHMubWVtb3J5VHlwZUJpdHMsICZhc19tZW1vcnlfYWxsb2MsIDApKTsKKworICAgIC8vIENhbiBub3QgYmluZCBhbHJlYWR5IGZyZWVkIG1lbW9yeQorICAgIHsKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgYXNfbWVtb3J5X2ZyZWVkID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmFzX21lbW9yeV9hbGxvYywgTlVMTCwgJmFzX21lbW9yeV9mcmVlZCkpOworICAgICAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgYXNfbWVtb3J5X2ZyZWVkLCBOVUxMKTsKKworICAgICAgICBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgYXNfYmluZF9pbmZvX2ZyZWVkID0gYXNfYmluZF9pbmZvOworICAgICAgICBhc19iaW5kX2luZm9fZnJlZWQubWVtb3J5ID0gYXNfbWVtb3J5X2ZyZWVkOworICAgICAgICBhc19iaW5kX2luZm9fZnJlZWQubWVtb3J5T2Zmc2V0ID0gMDsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtbWVtb3J5LXBhcmFtZXRlciIpOworICAgICAgICAodm9pZCl2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXZpY2UoKSwgMSwgJmFzX2JpbmRfaW5mb19mcmVlZCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIENhbiBub3QgYmluZCB3aXRoIGJhZCBhbGlnbm1lbnQKKyAgICBpZiAoYXNfbWVtb3J5X3JlcXVpcmVtZW50cy5hbGlnbm1lbnQgPiAxKSB7CisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGFzX21lbW9yeV9hbGxvY19iYWRfYWxpZ25tZW50ID0gYXNfbWVtb3J5X2FsbG9jOworICAgICAgICBhc19tZW1vcnlfYWxsb2NfYmFkX2FsaWdubWVudC5hbGxvY2F0aW9uU2l6ZSArPSAxOworCisgICAgICAgIFZrRGV2aWNlTWVtb3J5IGFzX21lbW9yeV9iYWRfYWxpZ25tZW50ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmFzX21lbW9yeV9hbGxvY19iYWRfYWxpZ25tZW50LCBOVUxMLCAmYXNfbWVtb3J5X2JhZF9hbGlnbm1lbnQpKTsKKworICAgICAgICBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgYXNfYmluZF9pbmZvX2JhZF9hbGlnbm1lbnQgPSBhc19iaW5kX2luZm87CisgICAgICAgIGFzX2JpbmRfaW5mb19iYWRfYWxpZ25tZW50Lm1lbW9yeSA9IGFzX21lbW9yeV9iYWRfYWxpZ25tZW50OworICAgICAgICBhc19iaW5kX2luZm9fYmFkX2FsaWdubWVudC5tZW1vcnlPZmZzZXQgPSAxOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1tZW1vcnlPZmZzZXQtMDI1OTQiKTsKKyAgICAgICAgKHZvaWQpdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoZGV2aWNlKCksIDEsICZhc19iaW5kX2luZm9fYmFkX2FsaWdubWVudCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBhc19tZW1vcnlfYmFkX2FsaWdubWVudCwgTlVMTCk7CisgICAgfQorCisgICAgLy8gQ2FuIG5vdCBiaW5kIHdpdGggb2Zmc2V0IG91dHNpZGUgdGhlIGFsbG9jYXRpb24KKyAgICB7CisgICAgICAgIFZrRGV2aWNlTWVtb3J5IGFzX21lbW9yeV9iYWRfb2Zmc2V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmFzX21lbW9yeV9hbGxvYywgTlVMTCwgJmFzX21lbW9yeV9iYWRfb2Zmc2V0KSk7CisKKyAgICAgICAgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIGFzX2JpbmRfaW5mb19iYWRfb2Zmc2V0ID0gYXNfYmluZF9pbmZvOworICAgICAgICBhc19iaW5kX2luZm9fYmFkX29mZnNldC5tZW1vcnkgPSBhc19tZW1vcnlfYmFkX29mZnNldDsKKyAgICAgICAgYXNfYmluZF9pbmZvX2JhZF9vZmZzZXQubWVtb3J5T2Zmc2V0ID0KKyAgICAgICAgICAgIChhc19tZW1vcnlfYWxsb2MuYWxsb2NhdGlvblNpemUgKyBhc19tZW1vcnlfcmVxdWlyZW1lbnRzLmFsaWdubWVudCkgJiB+KGFzX21lbW9yeV9yZXF1aXJlbWVudHMuYWxpZ25tZW50IC0gMSk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WLW1lbW9yeU9mZnNldC0wMjQ1MSIpOworICAgICAgICAodm9pZCl2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXZpY2UoKSwgMSwgJmFzX2JpbmRfaW5mb19iYWRfb2Zmc2V0KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIGFzX21lbW9yeV9iYWRfb2Zmc2V0LCBOVUxMKTsKKyAgICB9CisKKyAgICAvLyBDYW4gbm90IGJpbmQgd2l0aCBvZmZzZXQgdGhhdCBkb2Vzbid0IGxlYXZlIGVub3VnaCBzaXplCisgICAgeworICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0ID0gKGFzX21lbW9yeV9yZXF1aXJlbWVudHMuc2l6ZSAtIDEpICYgfihhc19tZW1vcnlfcmVxdWlyZW1lbnRzLmFsaWdubWVudCAtIDEpOworICAgICAgICBpZiAob2Zmc2V0ID4gMCAmJiAoYXNfbWVtb3J5X3JlcXVpcmVtZW50cy5zaXplIDwgKGFzX21lbW9yeV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSAtIGFzX21lbW9yeV9yZXF1aXJlbWVudHMuYWxpZ25tZW50KSkpIHsKKyAgICAgICAgICAgIFZrRGV2aWNlTWVtb3J5IGFzX21lbW9yeV9iYWRfb2Zmc2V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6QWxsb2NhdGVNZW1vcnkoZGV2aWNlKCksICZhc19tZW1vcnlfYWxsb2MsIE5VTEwsICZhc19tZW1vcnlfYmFkX29mZnNldCkpOworCisgICAgICAgICAgICBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgYXNfYmluZF9pbmZvX2JhZF9vZmZzZXQgPSBhc19iaW5kX2luZm87CisgICAgICAgICAgICBhc19iaW5kX2luZm9fYmFkX29mZnNldC5tZW1vcnkgPSBhc19tZW1vcnlfYmFkX29mZnNldDsKKyAgICAgICAgICAgIGFzX2JpbmRfaW5mb19iYWRfb2Zmc2V0Lm1lbW9yeU9mZnNldCA9IG9mZnNldDsKKworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1zaXplLTAyNTk1Iik7CisgICAgICAgICAgICAodm9pZCl2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXZpY2UoKSwgMSwgJmFzX2JpbmRfaW5mb19iYWRfb2Zmc2V0KTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgICAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgYXNfbWVtb3J5X2JhZF9vZmZzZXQsIE5VTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FuIG5vdCBiaW5kIHdpdGggbWVtb3J5IHRoYXQgaGFzIHVuc3VwcG9ydGVkIG1lbW9yeSB0eXBlCisgICAgeworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlfcHJvcGVydGllcyA9IHt9OworICAgICAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKG1fZGV2aWNlLT5waHkoKS5oYW5kbGUoKSwgJm1lbW9yeV9wcm9wZXJ0aWVzKTsKKworICAgICAgICB1aW50MzJfdCBzdXBwb3J0ZWRfbWVtb3J5X3R5cGVfYml0cyA9IGFzX21lbW9yeV9yZXF1aXJlbWVudHMubWVtb3J5VHlwZUJpdHM7CisgICAgICAgIHVpbnQzMl90IHVuc3VwcG9ydGVkX21lbV90eXBlX2JpdHMgPSAoKDEgPDwgbWVtb3J5X3Byb3BlcnRpZXMubWVtb3J5VHlwZUNvdW50KSAtIDEpICYgfnN1cHBvcnRlZF9tZW1vcnlfdHlwZV9iaXRzOworICAgICAgICBpZiAodW5zdXBwb3J0ZWRfbWVtX3R5cGVfYml0cyAhPSAwKSB7CisgICAgICAgICAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBhc19tZW1vcnlfYWxsb2NfYmFkX3R5cGUgPSBhc19tZW1vcnlfYWxsb2M7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKHVuc3VwcG9ydGVkX21lbV90eXBlX2JpdHMsICZhc19tZW1vcnlfYWxsb2NfYmFkX3R5cGUsIDApKTsKKworICAgICAgICAgICAgVmtEZXZpY2VNZW1vcnkgYXNfbWVtb3J5X2JhZF90eXBlID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6QWxsb2NhdGVNZW1vcnkoZGV2aWNlKCksICZhc19tZW1vcnlfYWxsb2NfYmFkX3R5cGUsIE5VTEwsICZhc19tZW1vcnlfYmFkX3R5cGUpKTsKKworICAgICAgICAgICAgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIGFzX2JpbmRfaW5mb19iYWRfdHlwZSA9IGFzX2JpbmRfaW5mbzsKKyAgICAgICAgICAgIGFzX2JpbmRfaW5mb19iYWRfdHlwZS5tZW1vcnkgPSBhc19tZW1vcnlfYmFkX3R5cGU7CisKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYtbWVtb3J5LTAyNTkzIik7CisgICAgICAgICAgICAodm9pZCl2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXZpY2UoKSwgMSwgJmFzX2JpbmRfaW5mb19iYWRfdHlwZSk7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICAgICAgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIGFzX21lbW9yeV9iYWRfdHlwZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDYW4gbm90IGJpbmQgbWVtb3J5IHR3aWNlCisgICAgeworICAgICAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU9iaiBhc190d2ljZSgqbV9kZXZpY2UsIGFzX2NyZWF0ZV9pbmZvLCBmYWxzZSk7CisKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgYXNfbWVtb3J5X3R3aWNlXzEgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgYXNfbWVtb3J5X3R3aWNlXzIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmYXNfbWVtb3J5X2FsbG9jLCBOVUxMLCAmYXNfbWVtb3J5X3R3aWNlXzEpKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmYXNfbWVtb3J5X2FsbG9jLCBOVUxMLCAmYXNfbWVtb3J5X3R3aWNlXzIpKTsKKyAgICAgICAgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIGFzX2JpbmRfaW5mb190d2ljZV8xID0gYXNfYmluZF9pbmZvOworICAgICAgICBWa0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlJbmZvTlYgYXNfYmluZF9pbmZvX3R3aWNlXzIgPSBhc19iaW5kX2luZm87CisgICAgICAgIGFzX2JpbmRfaW5mb190d2ljZV8xLmFjY2VsZXJhdGlvblN0cnVjdHVyZSA9IGFzX3R3aWNlLmhhbmRsZSgpOworICAgICAgICBhc19iaW5kX2luZm9fdHdpY2VfMi5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBhc190d2ljZS5oYW5kbGUoKTsKKyAgICAgICAgYXNfYmluZF9pbmZvX3R3aWNlXzEubWVtb3J5ID0gYXNfbWVtb3J5X3R3aWNlXzE7CisgICAgICAgIGFzX2JpbmRfaW5mb190d2ljZV8yLm1lbW9yeSA9IGFzX21lbW9yeV90d2ljZV8yOworCisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKGRldmljZSgpLCAxLCAmYXNfYmluZF9pbmZvX3R3aWNlXzEpKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeUluZm9OVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtMDI0NTAiKTsKKyAgICAgICAgKHZvaWQpdmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYoZGV2aWNlKCksIDEsICZhc19iaW5kX2luZm9fdHdpY2VfMik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBhc19tZW1vcnlfdHdpY2VfMSwgTlVMTCk7CisgICAgICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBhc19tZW1vcnlfdHdpY2VfMiwgTlVMTCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFZhbGlkYXRlQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZhbGlkYXRlIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgYnVpbGRpbmcuIik7CisgICAgaWYgKCFJbml0RnJhbWV3b3JrRm9yUmF5VHJhY2luZ1Rlc3QodGhpcywgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgbV9lcnJvck1vbml0b3IpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4oCisgICAgICAgICAgICB2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIikpOworICAgIGFzc2VydCh2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgIT0gbnVsbHB0cik7CisKKyAgICBWa0J1ZmZlck9iaiB2Ym87CisgICAgVmtCdWZmZXJPYmogaWJvOworICAgIFZrR2VvbWV0cnlOViBnZW9tZXRyeTsKKyAgICBHZXRTaW1wbGVHZW9tZXRyeUZvckFjY2VsZXJhdGlvblN0cnVjdHVyZVRlc3RzKCptX2RldmljZSwgJnZibywgJmlibywgJmdlb21ldHJ5KTsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mbyA9IHt9OworICAgIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7CisgICAgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlY7CisgICAgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8udHlwZSA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlY7CisgICAgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCA9IDA7CisgICAgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uZ2VvbWV0cnlDb3VudCA9IDE7CisgICAgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8ucEdlb21ldHJpZXMgPSAmZ2VvbWV0cnk7CisKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU9iaiBib3RfbGV2ZWxfYXMoKm1fZGV2aWNlLCBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgVmtCdWZmZXJPYmogYm90X2xldmVsX2FzX3NjcmF0Y2g7CisgICAgYm90X2xldmVsX2FzLmNyZWF0ZV9zY3JhdGNoX2J1ZmZlcigqbV9kZXZpY2UsICZib3RfbGV2ZWxfYXNfc2NyYXRjaCk7CisKKyAgICAvLyBDb21tYW5kIGJ1ZmZlciBtdXN0IGJlIGluIHJlY29yZGluZyBzdGF0ZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWNvbW1hbmRCdWZmZXItcmVjb3JkaW5nIik7CisgICAgdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mbywgVktfTlVMTF9IQU5ETEUsIDAsIFZLX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RfbGV2ZWxfYXMuaGFuZGxlKCksIFZLX05VTExfSEFORExFLCBib3RfbGV2ZWxfYXNfc2NyYXRjaC5oYW5kbGUoKSwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBJbmNvbXBhdGlibGUgdHlwZQorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIGFzX2J1aWxkX2luZm9fd2l0aF9pbmNvbXBhdGlibGVfdHlwZSA9IGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvOworICAgIGFzX2J1aWxkX2luZm9fd2l0aF9pbmNvbXBhdGlibGVfdHlwZS50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX1RPUF9MRVZFTF9OVjsKKyAgICBhc19idWlsZF9pbmZvX3dpdGhfaW5jb21wYXRpYmxlX3R5cGUuaW5zdGFuY2VDb3VudCA9IDE7CisgICAgYXNfYnVpbGRfaW5mb193aXRoX2luY29tcGF0aWJsZV90eXBlLmdlb21ldHJ5Q291bnQgPSAwOworCisgICAgLy8gVGhpcyBpcyBkdXBsaWNhdGVkIHNpbmNlIGl0IHRyaWdnZXJzIG9uZSBlcnJvciBmb3IgZGlmZmVyZW50IHR5cGVzIGFuZCBvbmUgZXJyb3IgZm9yIGxvd2VyIGluc3RhbmNlIGNvdW50IC0gdGhlCisgICAgLy8gYnVpbGQgaW5mbyBpcyBpbmNvbXBhdGlibGUgYnV0IHN0aWxsIG5lZWRzIHRvIGJlIHZhbGlkIHRvIGdldCBwYXN0IHRoZSBzdGF0ZWxlc3MgY2hlY2tzLgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRzdC0wMjQ4OCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRzdC0wMjQ4OCIpOworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmYXNfYnVpbGRfaW5mb193aXRoX2luY29tcGF0aWJsZV90eXBlLCBWS19OVUxMX0hBTkRMRSwgMCwgVktfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdF9sZXZlbF9hcy5oYW5kbGUoKSwgVktfTlVMTF9IQU5ETEUsIGJvdF9sZXZlbF9hc19zY3JhdGNoLmhhbmRsZSgpLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIEluY29tcGF0aWJsZSBmbGFncworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIGFzX2J1aWxkX2luZm9fd2l0aF9pbmNvbXBhdGlibGVfZmxhZ3MgPSBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mbzsKKyAgICBhc19idWlsZF9pbmZvX3dpdGhfaW5jb21wYXRpYmxlX2ZsYWdzLmZsYWdzID0gVktfQlVJTERfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9MT1dfTUVNT1JZX0JJVF9OVjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVi1kc3QtMDI0ODgiKTsKKyAgICB2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJmFzX2J1aWxkX2luZm9fd2l0aF9pbmNvbXBhdGlibGVfZmxhZ3MsIFZLX05VTExfSEFORExFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GQUxTRSwgYm90X2xldmVsX2FzLmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgYm90X2xldmVsX2FzX3NjcmF0Y2guaGFuZGxlKCksIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gSW5jb21wYXRpYmxlIGJ1aWxkIHNpemUKKyAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnlfd2l0aF9tb3JlX3ZlcnRpY2VzID0gZ2VvbWV0cnk7CisgICAgZ2VvbWV0cnlfd2l0aF9tb3JlX3ZlcnRpY2VzLmdlb21ldHJ5LnRyaWFuZ2xlcy52ZXJ0ZXhDb3VudCArPSAxOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVJbmZvTlYgYXNfYnVpbGRfaW5mb193aXRoX2luY29tcGF0aWJsZV9nZW9tZXRyeSA9IGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvOworICAgIGFzX2J1aWxkX2luZm9fd2l0aF9pbmNvbXBhdGlibGVfZ2VvbWV0cnkucEdlb21ldHJpZXMgPSAmZ2VvbWV0cnlfd2l0aF9tb3JlX3ZlcnRpY2VzOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLWRzdC0wMjQ4OCIpOworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmYXNfYnVpbGRfaW5mb193aXRoX2luY29tcGF0aWJsZV9nZW9tZXRyeSwgVktfTlVMTF9IQU5ETEUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZBTFNFLCBib3RfbGV2ZWxfYXMuaGFuZGxlKCksIFZLX05VTExfSEFORExFLCBib3RfbGV2ZWxfYXNfc2NyYXRjaC5oYW5kbGUoKSwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBTY3JhdGNoIGJ1ZmZlciB0b28gc21hbGwKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gdG9vX3NtYWxsX3NjcmF0Y2hfYnVmZmVyX2luZm8gPSB7fTsKKyAgICB0b29fc21hbGxfc2NyYXRjaF9idWZmZXJfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICB0b29fc21hbGxfc2NyYXRjaF9idWZmZXJfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9SQVlfVFJBQ0lOR19CSVRfTlY7CisgICAgdG9vX3NtYWxsX3NjcmF0Y2hfYnVmZmVyX2luZm8uc2l6ZSA9IDE7CisgICAgVmtCdWZmZXJPYmogdG9vX3NtYWxsX3NjcmF0Y2hfYnVmZmVyKCptX2RldmljZSwgdG9vX3NtYWxsX3NjcmF0Y2hfYnVmZmVyX2luZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ5MSIpOworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8sIFZLX05VTExfSEFORExFLCAwLCBWS19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90X2xldmVsX2FzLmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgdG9vX3NtYWxsX3NjcmF0Y2hfYnVmZmVyLmhhbmRsZSgpLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFNjcmF0Y2ggYnVmZmVyIHdpdGggb2Zmc2V0IHRvbyBzbWFsbAorICAgIFZrRGV2aWNlU2l6ZSBzY3JhdGNoX2J1ZmZlcl9vZmZzZXQgPSA1OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ5MSIpOworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8sIFZLX05VTExfSEFORExFLCAwLCBWS19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90X2xldmVsX2FzLmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgYm90X2xldmVsX2FzX3NjcmF0Y2guaGFuZGxlKCksIHNjcmF0Y2hfYnVmZmVyX29mZnNldCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBTcmMgbXVzdCBoYXZlIGJlZW4gYnVpbHQgYmVmb3JlCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogYm90X2xldmVsX2FzX3VwZGF0ZWQoKm1fZGV2aWNlLCBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8pOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WLXVwZGF0ZS0wMjQ4OSIpOworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8sIFZLX05VTExfSEFORExFLCAwLCBWS19UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RfbGV2ZWxfYXNfdXBkYXRlZC5oYW5kbGUoKSwgYm90X2xldmVsX2FzLmhhbmRsZSgpLCBib3RfbGV2ZWxfYXNfc2NyYXRjaC5oYW5kbGUoKSwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBTcmMgbXVzdCBoYXZlIGJlZW4gYnVpbHQgYmVmb3JlIHdpdGggdGhlIFZLX0JVSUxEX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQUxMT1dfVVBEQVRFX0JJVF9OViBmbGFnCisgICAgdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mbywgVktfTlVMTF9IQU5ETEUsIDAsIFZLX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RfbGV2ZWxfYXMuaGFuZGxlKCksIFZLX05VTExfSEFORExFLCBib3RfbGV2ZWxfYXNfc2NyYXRjaC5oYW5kbGUoKSwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtdXBkYXRlLTAyNDg5Iik7CisgICAgdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mbywgVktfTlVMTF9IQU5ETEUsIDAsIFZLX1RSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdF9sZXZlbF9hc191cGRhdGVkLmhhbmRsZSgpLCBib3RfbGV2ZWxfYXMuaGFuZGxlKCksIGJvdF9sZXZlbF9hc19zY3JhdGNoLmhhbmRsZSgpLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWYWxpZGF0ZUdldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmFsaWRhdGUgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBoYW5kbGUgcXVlcnlpbmcuIik7CisgICAgaWYgKCFJbml0RnJhbWV3b3JrRm9yUmF5VHJhY2luZ1Rlc3QodGhpcywgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgbV9lcnJvck1vbml0b3IpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVj4oCisgICAgICAgICAgICB2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViIpKTsKKyAgICBhc3NlcnQodmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOViAhPSBudWxscHRyKTsKKworICAgIFZrQnVmZmVyT2JqIHZibzsKKyAgICBWa0J1ZmZlck9iaiBpYm87CisgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5OworICAgIEdldFNpbXBsZUdlb21ldHJ5Rm9yQWNjZWxlcmF0aW9uU3RydWN0dXJlVGVzdHMoKm1fZGV2aWNlLCAmdmJvLCAmaWJvLCAmZ2VvbWV0cnkpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvID0ge307CisgICAgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVjsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OVjsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX0JPVFRPTV9MRVZFTF9OVjsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5pbnN0YW5jZUNvdW50ID0gMDsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5nZW9tZXRyeUNvdW50ID0gMTsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5wR2VvbWV0cmllcyA9ICZnZW9tZXRyeTsKKworICAgIC8vIE5vdCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBoYW5kbGUKKyAgICB7CisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlT2JqIGJvdF9sZXZlbF9hcygqbV9kZXZpY2UsIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mbyk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIHVpbnQ2NF90IGhhbmRsZSA9IDA7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELXZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYtZGF0YVNpemUtMDIyNDAiKTsKKyAgICAgICAgdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVihtX2RldmljZS0+aGFuZGxlKCksIGJvdF9sZXZlbF9hcy5oYW5kbGUoKSwgc2l6ZW9mKHVpbnQ4X3QpLCAmaGFuZGxlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gTm8gbWVtb3J5IGJvdW5kIHRvIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUKKyAgICB7CisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlT2JqIGJvdF9sZXZlbF9hcygqbV9kZXZpY2UsIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mbywgLyppbml0X21lbW9yeT0qL2ZhbHNlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgdWludDY0X3QgaGFuZGxlID0gMDsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOQVNTSUdORUQtdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVi1hY2NlbGVyYXRpb25TdHJ1Y3R1cmUtWFhYWCIpOworICAgICAgICB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKG1fZGV2aWNlLT5oYW5kbGUoKSwgYm90X2xldmVsX2FzLmhhbmRsZSgpLCBzaXplb2YodWludDY0X3QpLCAmaGFuZGxlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFZhbGlkYXRlQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmFsaWRhdGUgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBjb3B5aW5nLiIpOworICAgIGlmICghSW5pdEZyYW1ld29ya0ZvclJheVRyYWNpbmdUZXN0KHRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMsIG1fZXJyb3JNb25pdG9yKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEZOX3ZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+KAorICAgICAgICB2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKSk7CisgICAgYXNzZXJ0KHZrQ21kQ29weUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WICE9IG51bGxwdHIpOworCisgICAgVmtCdWZmZXJPYmogdmJvOworICAgIFZrQnVmZmVyT2JqIGlibzsKKyAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnk7CisgICAgR2V0U2ltcGxlR2VvbWV0cnlGb3JBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUZXN0cygqbV9kZXZpY2UsICZ2Ym8sICZpYm8sICZnZW9tZXRyeSk7CisKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBhc19jcmVhdGVfaW5mbyA9IHt9OworICAgIGFzX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVjsKKyAgICBhc19jcmVhdGVfaW5mby5pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9JTkZPX05WOworICAgIGFzX2NyZWF0ZV9pbmZvLmluZm8udHlwZSA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9CT1RUT01fTEVWRUxfTlY7CisgICAgYXNfY3JlYXRlX2luZm8uaW5mby5pbnN0YW5jZUNvdW50ID0gMDsKKyAgICBhc19jcmVhdGVfaW5mby5pbmZvLmdlb21ldHJ5Q291bnQgPSAxOworICAgIGFzX2NyZWF0ZV9pbmZvLmluZm8ucEdlb21ldHJpZXMgPSAmZ2VvbWV0cnk7CisKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU9iaiBzcmNfYXMoKm1fZGV2aWNlLCBhc19jcmVhdGVfaW5mbyk7CisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogZHN0X2FzKCptX2RldmljZSwgYXNfY3JlYXRlX2luZm8pOworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlT2JqIGRzdF9hc193aXRob3V0X21lbSgqbV9kZXZpY2UsIGFzX2NyZWF0ZV9pbmZvLCBmYWxzZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAvLyBDb21tYW5kIGJ1ZmZlciBtdXN0IGJlIGluIHJlY29yZGluZyBzdGF0ZQorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtY29tbWFuZEJ1ZmZlci1yZWNvcmRpbmciKTsKKyAgICB2a0NtZENvcHlBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBkc3RfYXMuaGFuZGxlKCksIHNyY19hcy5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19DT1BZX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTU9ERV9DTE9ORV9OVik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBTcmMgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGFsbG93IGNvbXBhY3Rpb24gZmxhZworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYtc3JjLTAyNDk3Iik7CisgICAgdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZHN0X2FzLmhhbmRsZSgpLCBzcmNfYXMuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09QWV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01PREVfQ09NUEFDVF9OVik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBEc3QgbXVzdCBoYXZlIGJlZW4gYm91bmQgd2l0aCBtZW1vcnkKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1JbnZhbGlkQ29tbWFuZEJ1ZmZlci1Wa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WIik7CisgICAgdmtDbWRDb3B5QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgZHN0X2FzX3dpdGhvdXRfbWVtLmhhbmRsZSgpLCBzcmNfYXMuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09QWV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01PREVfQ0xPTkVfTlYpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEdwdUJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlVmFsaWRhdGlvbkludmFsaWRIYW5kbGUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBncHUgdmFsaWRhdGlvbiBzaG91bGQgcmVwb3J0IGFuIGludmFsaWQgaGFuZGxlIHdoZW4gdHJ5aW5nIHRvIGJ1aWxkIGEgdG9wIGxldmVsICIKKyAgICAgICAgImFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgd2l0aCBhbiBpbnZhbGlkIGhhbmRsZSBmb3IgYSBib3R0b20gbGV2ZWwgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZS4iKTsKKworICAgIGlmICghSW5pdEZyYW1ld29ya0ZvclJheVRyYWNpbmdUZXN0KHRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLCBtX2RldmljZV9leHRlbnNpb25fbmFtZXMsIG1fZXJyb3JNb25pdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmVlZF9ncHVfdmFsaWRhdGlvbj0qL3RydWUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4oCisgICAgICAgICAgICB2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIikpOworICAgIGFzc2VydCh2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgIT0gbnVsbHB0cik7CisKKyAgICBWa0J1ZmZlck9iaiB2Ym87CisgICAgVmtCdWZmZXJPYmogaWJvOworICAgIFZrR2VvbWV0cnlOViBnZW9tZXRyeTsKKyAgICBHZXRTaW1wbGVHZW9tZXRyeUZvckFjY2VsZXJhdGlvblN0cnVjdHVyZVRlc3RzKCptX2RldmljZSwgJnZibywgJmlibywgJmdlb21ldHJ5KTsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mbyA9IHt9OworICAgIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8udHlwZSA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9UT1BfTEVWRUxfTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCA9IDE7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uZ2VvbWV0cnlDb3VudCA9IDA7CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIGNvbW1hbmRfcG9vbChtX2RldmljZSwgMCwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpOworCisgICAgc3RydWN0IFZrR2VvbWV0cnlJbnN0YW5jZU5WIHsKKyAgICAgICAgZmxvYXQgdHJhbnNmb3JtWzEyXTsKKyAgICAgICAgdWludDMyX3QgaW5zdGFuY2VDdXN0b21JbmRleCA6IDI0OworICAgICAgICB1aW50MzJfdCBtYXNrIDogODsKKyAgICAgICAgdWludDMyX3QgaW5zdGFuY2VPZmZzZXQgOiAyNDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgOiA4OworICAgICAgICB1aW50NjRfdCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGU7CisgICAgfTsKKworICAgIFZrR2VvbWV0cnlJbnN0YW5jZU5WIGluc3RhbmNlID0geworICAgICAgICB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsCisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgICAgICAgfSwKKyAgICAgICAgMCwKKyAgICAgICAgMHhGRiwKKyAgICAgICAgMCwKKyAgICAgICAgVktfR0VPTUVUUllfSU5TVEFOQ0VfVFJJQU5HTEVfQ1VMTF9ESVNBQkxFX0JJVF9OViwKKyAgICAgICAgMTIzNDU2Nzg5MCwgIC8vIGludmFsaWQKKyAgICB9OworCisgICAgVmtEZXZpY2VTaXplIGluc3RhbmNlX2J1ZmZlcl9zaXplID0gc2l6ZW9mKFZrR2VvbWV0cnlJbnN0YW5jZU5WKTsKKyAgICBWa0J1ZmZlck9iaiBpbnN0YW5jZV9idWZmZXI7CisgICAgaW5zdGFuY2VfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBpbnN0YW5jZV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WKTsKKworICAgIHVpbnQ4X3QgKm1hcHBlZF9pbnN0YW5jZV9idWZmZXJfZGF0YSA9ICh1aW50OF90ICopaW5zdGFuY2VfYnVmZmVyLm1lbW9yeSgpLm1hcCgpOworICAgIHN0ZDo6bWVtY3B5KG1hcHBlZF9pbnN0YW5jZV9idWZmZXJfZGF0YSwgKHVpbnQ4X3QgKikmaW5zdGFuY2UsIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihpbnN0YW5jZV9idWZmZXJfc2l6ZSkpOworICAgIGluc3RhbmNlX2J1ZmZlci5tZW1vcnkoKS51bm1hcCgpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogdG9wX2xldmVsX2FzKCptX2RldmljZSwgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIFZrQnVmZmVyT2JqIHRvcF9sZXZlbF9hc19zY3JhdGNoOworICAgIHRvcF9sZXZlbF9hcy5jcmVhdGVfc2NyYXRjaF9idWZmZXIoKm1fZGV2aWNlLCAmdG9wX2xldmVsX2FzX3NjcmF0Y2gpOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRfYnVmZmVyKG1fZGV2aWNlLCAmY29tbWFuZF9wb29sKTsKKyAgICBjb21tYW5kX2J1ZmZlci5iZWdpbigpOworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgJnRvcF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvLCBpbnN0YW5jZV9idWZmZXIuaGFuZGxlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZBTFNFLCB0b3BfbGV2ZWxfYXMuaGFuZGxlKCksIFZLX05VTExfSEFORExFLCB0b3BfbGV2ZWxfYXNfc2NyYXRjaC5oYW5kbGUoKSwgMCk7CisgICAgY29tbWFuZF9idWZmZXIuZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiQXR0ZW1wdGVkIHRvIGJ1aWxkIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIHVzaW5nIGludmFsaWQgYm90dG9tIGxldmVsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaGFuZGxlIik7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEdwdUJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlVmFsaWRhdGlvbkJvdHRvbUxldmVsTm90WWV0QnVpbHQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQWNjZWxlcmF0aW9uIHN0cnVjdHVyZSBncHUgdmFsaWRhdGlvbiBzaG91bGQgcmVwb3J0IGFuIGludmFsaWQgaGFuZGxlIHdoZW4gdHJ5aW5nIHRvIGJ1aWxkIGEgdG9wIGxldmVsICIKKyAgICAgICAgImFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgd2l0aCBhIGhhbmRsZSBmb3IgYSBib3R0b20gbGV2ZWwgYWNjZWxlcmF0aW9uIHN0cnVjdHVyZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYnVpbHQuIik7CisKKyAgICBpZiAoIUluaXRGcmFtZXdvcmtGb3JSYXlUcmFjaW5nVGVzdCh0aGlzLCBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLCBtX2Vycm9yTW9uaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5lZWRfZ3B1X3ZhbGlkYXRpb249Ki90cnVlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViB2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlY+KAorICAgICAgICAgICAgdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5oYW5kbGUoKSwgInZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpKTsKKyAgICBhc3NlcnQodmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WICE9IG51bGxwdHIpOworCisgICAgVmtCdWZmZXJPYmogdmJvOworICAgIFZrQnVmZmVyT2JqIGlibzsKKyAgICBWa0dlb21ldHJ5TlYgZ2VvbWV0cnk7CisgICAgR2V0U2ltcGxlR2VvbWV0cnlGb3JBY2NlbGVyYXRpb25TdHJ1Y3R1cmVUZXN0cygqbV9kZXZpY2UsICZ2Ym8sICZpYm8sICZnZW9tZXRyeSk7CisKKyAgICBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0NSRUFURV9JTkZPX05WOworICAgIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9JTkZPX05WOworICAgIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX1RZUEVfQk9UVE9NX0xFVkVMX05WOworICAgIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvLmluc3RhbmNlQ291bnQgPSAwOworICAgIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvLmdlb21ldHJ5Q291bnQgPSAxOworICAgIGJvdF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvLnBHZW9tZXRyaWVzID0gJmdlb21ldHJ5OworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvID0ge307CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVjsKKyAgICB0b3BfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OVjsKKyAgICB0b3BfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX1RPUF9MRVZFTF9OVjsKKyAgICB0b3BfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5pbnN0YW5jZUNvdW50ID0gMTsKKyAgICB0b3BfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5nZW9tZXRyeUNvdW50ID0gMDsKKworICAgIFZrQ29tbWFuZFBvb2xPYmogY29tbWFuZF9wb29sKG1fZGV2aWNlLCAwLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCk7CisKKyAgICBzdHJ1Y3QgVmtHZW9tZXRyeUluc3RhbmNlTlYgeworICAgICAgICBmbG9hdCB0cmFuc2Zvcm1bMTJdOworICAgICAgICB1aW50MzJfdCBpbnN0YW5jZUN1c3RvbUluZGV4IDogMjQ7CisgICAgICAgIHVpbnQzMl90IG1hc2sgOiA4OworICAgICAgICB1aW50MzJfdCBpbnN0YW5jZU9mZnNldCA6IDI0OworICAgICAgICB1aW50MzJfdCBmbGFncyA6IDg7CisgICAgICAgIHVpbnQ2NF90IGFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZTsKKyAgICB9OworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogYm90X2xldmVsX2FzX25ldmVyX2J1aWx0KCptX2RldmljZSwgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIFZrR2VvbWV0cnlJbnN0YW5jZU5WIGluc3RhbmNlID0geworICAgICAgICB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsCisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgICAgICAgfSwKKyAgICAgICAgMCwKKyAgICAgICAgMHhGRiwKKyAgICAgICAgMCwKKyAgICAgICAgVktfR0VPTUVUUllfSU5TVEFOQ0VfVFJJQU5HTEVfQ1VMTF9ESVNBQkxFX0JJVF9OViwKKyAgICAgICAgYm90X2xldmVsX2FzX25ldmVyX2J1aWx0Lm9wYXF1ZV9oYW5kbGUoKSwKKyAgICB9OworCisgICAgVmtEZXZpY2VTaXplIGluc3RhbmNlX2J1ZmZlcl9zaXplID0gc2l6ZW9mKFZrR2VvbWV0cnlJbnN0YW5jZU5WKTsKKyAgICBWa0J1ZmZlck9iaiBpbnN0YW5jZV9idWZmZXI7CisgICAgaW5zdGFuY2VfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBpbnN0YW5jZV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WKTsKKworICAgIHVpbnQ4X3QgKm1hcHBlZF9pbnN0YW5jZV9idWZmZXJfZGF0YSA9ICh1aW50OF90ICopaW5zdGFuY2VfYnVmZmVyLm1lbW9yeSgpLm1hcCgpOworICAgIHN0ZDo6bWVtY3B5KG1hcHBlZF9pbnN0YW5jZV9idWZmZXJfZGF0YSwgKHVpbnQ4X3QgKikmaW5zdGFuY2UsIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihpbnN0YW5jZV9idWZmZXJfc2l6ZSkpOworICAgIGluc3RhbmNlX2J1ZmZlci5tZW1vcnkoKS51bm1hcCgpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogdG9wX2xldmVsX2FzKCptX2RldmljZSwgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIFZrQnVmZmVyT2JqIHRvcF9sZXZlbF9hc19zY3JhdGNoOworICAgIHRvcF9sZXZlbF9hcy5jcmVhdGVfc2NyYXRjaF9idWZmZXIoKm1fZGV2aWNlLCAmdG9wX2xldmVsX2FzX3NjcmF0Y2gpOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRfYnVmZmVyKG1fZGV2aWNlLCAmY29tbWFuZF9wb29sKTsKKyAgICBjb21tYW5kX2J1ZmZlci5iZWdpbigpOworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgJnRvcF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvLCBpbnN0YW5jZV9idWZmZXIuaGFuZGxlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZBTFNFLCB0b3BfbGV2ZWxfYXMuaGFuZGxlKCksIFZLX05VTExfSEFORExFLCB0b3BfbGV2ZWxfYXNfc2NyYXRjaC5oYW5kbGUoKSwgMCk7CisgICAgY29tbWFuZF9idWZmZXIuZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiQXR0ZW1wdGVkIHRvIGJ1aWxkIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIHVzaW5nIGludmFsaWQgYm90dG9tIGxldmVsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaGFuZGxlIik7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEdwdUJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlVmFsaWRhdGlvbkJvdHRvbUxldmVsRGVzdHJveWVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgZ3B1IHZhbGlkYXRpb24gc2hvdWxkIHJlcG9ydCBhbiBpbnZhbGlkIGhhbmRsZSB3aGVuIHRyeWluZyB0byBidWlsZCBhIHRvcCBsZXZlbCAiCisgICAgICAgICJhY2NlbGVyYXRpb24gc3RydWN0dXJlIHdpdGggYSBoYW5kbGUgZm9yIGEgZGVzdHJveWVkIGJvdHRvbSBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlLiIpOworCisgICAgaWYgKCFJbml0RnJhbWV3b3JrRm9yUmF5VHJhY2luZ1Rlc3QodGhpcywgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgbV9lcnJvck1vbml0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuZWVkX2dwdV92YWxpZGF0aW9uPSovdHJ1ZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WPigKKyAgICAgICAgICAgIHZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+aGFuZGxlKCksICJ2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKSk7CisgICAgYXNzZXJ0KHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAhPSBudWxscHRyKTsKKworICAgIFZrQnVmZmVyT2JqIHZibzsKKyAgICBWa0J1ZmZlck9iaiBpYm87CisgICAgVmtHZW9tZXRyeU5WIGdlb21ldHJ5OworICAgIEdldFNpbXBsZUdlb21ldHJ5Rm9yQWNjZWxlcmF0aW9uU3RydWN0dXJlVGVzdHMoKm1fZGV2aWNlLCAmdmJvLCAmaWJvLCAmZ2VvbWV0cnkpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVDcmVhdGVJbmZvTlYgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvID0ge307CisgICAgYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9DUkVBVEVfSU5GT19OVjsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfSU5GT19OVjsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9UWVBFX0JPVFRPTV9MRVZFTF9OVjsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5pbnN0YW5jZUNvdW50ID0gMDsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5nZW9tZXRyeUNvdW50ID0gMTsKKyAgICBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8uaW5mby5wR2VvbWV0cmllcyA9ICZnZW9tZXRyeTsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mbyA9IHt9OworICAgIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8udHlwZSA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9UT1BfTEVWRUxfTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCA9IDE7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uZ2VvbWV0cnlDb3VudCA9IDA7CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIGNvbW1hbmRfcG9vbChtX2RldmljZSwgMCwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpOworCisgICAgc3RydWN0IFZrR2VvbWV0cnlJbnN0YW5jZU5WIHsKKyAgICAgICAgZmxvYXQgdHJhbnNmb3JtWzEyXTsKKyAgICAgICAgdWludDMyX3QgaW5zdGFuY2VDdXN0b21JbmRleCA6IDI0OworICAgICAgICB1aW50MzJfdCBtYXNrIDogODsKKyAgICAgICAgdWludDMyX3QgaW5zdGFuY2VPZmZzZXQgOiAyNDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgOiA4OworICAgICAgICB1aW50NjRfdCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGU7CisgICAgfTsKKworICAgIHVpbnQ2NF90IGRlc3Ryb3llZF9ib3RfbGV2ZWxfYXNfaGFuZGxlID0gMDsKKyAgICB7CisgICAgICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlT2JqIGRlc3Ryb3llZF9ib3RfbGV2ZWxfYXMoKm1fZGV2aWNlLCBib3RfbGV2ZWxfYXNfY3JlYXRlX2luZm8pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgICAgICBkZXN0cm95ZWRfYm90X2xldmVsX2FzX2hhbmRsZSA9IGRlc3Ryb3llZF9ib3RfbGV2ZWxfYXMub3BhcXVlX2hhbmRsZSgpOworCisgICAgICAgIFZrQnVmZmVyT2JqIGJvdF9sZXZlbF9hc19zY3JhdGNoOworICAgICAgICBkZXN0cm95ZWRfYm90X2xldmVsX2FzLmNyZWF0ZV9zY3JhdGNoX2J1ZmZlcigqbV9kZXZpY2UsICZib3RfbGV2ZWxfYXNfc2NyYXRjaCk7CisKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRfYnVmZmVyKG1fZGV2aWNlLCAmY29tbWFuZF9wb29sKTsKKyAgICAgICAgY29tbWFuZF9idWZmZXIuYmVnaW4oKTsKKyAgICAgICAgdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpLCAmYm90X2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8sIFZLX05VTExfSEFORExFLCAwLCBWS19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3llZF9ib3RfbGV2ZWxfYXMuaGFuZGxlKCksIFZLX05VTExfSEFORExFLCBib3RfbGV2ZWxfYXNfc2NyYXRjaC5oYW5kbGUoKSwgMCk7CisgICAgICAgIGNvbW1hbmRfYnVmZmVyLmVuZCgpOworCisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZF9idWZmZXIuaGFuZGxlKCk7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgLy8gdms6OkRlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViBjYWxsZWQgb24gZGVzdHJveWVkX2JvdF9sZXZlbF9hcyBkdXJpbmcgZGVzdHJ1Y3Rpb24uCisgICAgfQorCisgICAgVmtHZW9tZXRyeUluc3RhbmNlTlYgaW5zdGFuY2UgPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgICAgICAgIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICB9LAorICAgICAgICAwLAorICAgICAgICAweEZGLAorICAgICAgICAwLAorICAgICAgICBWS19HRU9NRVRSWV9JTlNUQU5DRV9UUklBTkdMRV9DVUxMX0RJU0FCTEVfQklUX05WLAorICAgICAgICBkZXN0cm95ZWRfYm90X2xldmVsX2FzX2hhbmRsZSwKKyAgICB9OworCisgICAgVmtEZXZpY2VTaXplIGluc3RhbmNlX2J1ZmZlcl9zaXplID0gc2l6ZW9mKFZrR2VvbWV0cnlJbnN0YW5jZU5WKTsKKyAgICBWa0J1ZmZlck9iaiBpbnN0YW5jZV9idWZmZXI7CisgICAgaW5zdGFuY2VfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBpbnN0YW5jZV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WKTsKKworICAgIHVpbnQ4X3QgKm1hcHBlZF9pbnN0YW5jZV9idWZmZXJfZGF0YSA9ICh1aW50OF90ICopaW5zdGFuY2VfYnVmZmVyLm1lbW9yeSgpLm1hcCgpOworICAgIHN0ZDo6bWVtY3B5KG1hcHBlZF9pbnN0YW5jZV9idWZmZXJfZGF0YSwgKHVpbnQ4X3QgKikmaW5zdGFuY2UsIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihpbnN0YW5jZV9idWZmZXJfc2l6ZSkpOworICAgIGluc3RhbmNlX2J1ZmZlci5tZW1vcnkoKS51bm1hcCgpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogdG9wX2xldmVsX2FzKCptX2RldmljZSwgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIFZrQnVmZmVyT2JqIHRvcF9sZXZlbF9hc19zY3JhdGNoOworICAgIHRvcF9sZXZlbF9hcy5jcmVhdGVfc2NyYXRjaF9idWZmZXIoKm1fZGV2aWNlLCAmdG9wX2xldmVsX2FzX3NjcmF0Y2gpOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRfYnVmZmVyKG1fZGV2aWNlLCAmY29tbWFuZF9wb29sKTsKKyAgICBjb21tYW5kX2J1ZmZlci5iZWdpbigpOworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihjb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgJnRvcF9sZXZlbF9hc19jcmVhdGVfaW5mby5pbmZvLCBpbnN0YW5jZV9idWZmZXIuaGFuZGxlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZBTFNFLCB0b3BfbGV2ZWxfYXMuaGFuZGxlKCksIFZLX05VTExfSEFORExFLCB0b3BfbGV2ZWxfYXNfc2NyYXRjaC5oYW5kbGUoKSwgMCk7CisgICAgY29tbWFuZF9idWZmZXIuZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiQXR0ZW1wdGVkIHRvIGJ1aWxkIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIHVzaW5nIGludmFsaWQgYm90dG9tIGxldmVsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaGFuZGxlIik7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEdwdUJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlVmFsaWRhdGlvblJlc3RvcmVzU3RhdGUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWYWxpZGF0ZSB0aGF0IGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgZ3B1IHZhbGlkYXRpb24gY29ycmVjdGx5IHJlc3RvcmVzIGNvbXB1dGUgc3RhdGUuIik7CisKKyAgICBpZiAoIUluaXRGcmFtZXdvcmtGb3JSYXlUcmFjaW5nVGVzdCh0aGlzLCBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLCBtX2Vycm9yTW9uaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5lZWRfZ3B1X3ZhbGlkYXRpb249Ki90cnVlLCAvKm5lZWRfcHVzaF9kZXNjcmlwdG9ycz0qL3RydWUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVj4oCisgICAgICAgICAgICB2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIikpOworICAgIGFzc2VydCh2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgIT0gbnVsbHB0cik7CisKKyAgICBQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSID0KKyAgICAgICAgKFBGTl92a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+aGFuZGxlKCksICJ2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIik7CisgICAgYXNzZXJ0KHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgIT0gbnVsbHB0cik7CisKKyAgICBWa0J1ZmZlck9iaiB2Ym87CisgICAgVmtCdWZmZXJPYmogaWJvOworICAgIFZrR2VvbWV0cnlOViBnZW9tZXRyeTsKKyAgICBHZXRTaW1wbGVHZW9tZXRyeUZvckFjY2VsZXJhdGlvblN0cnVjdHVyZVRlc3RzKCptX2RldmljZSwgJnZibywgJmlibywgJmdlb21ldHJ5KTsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mbyA9IHt9OworICAgIHRvcF9sZXZlbF9hc19jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfQ1JFQVRFX0lORk9fTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX0lORk9fTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8udHlwZSA9IFZLX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfVFlQRV9UT1BfTEVWRUxfTlY7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uaW5zdGFuY2VDb3VudCA9IDE7CisgICAgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8uZ2VvbWV0cnlDb3VudCA9IDA7CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIGNvbW1hbmRfcG9vbChtX2RldmljZSwgMCwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpOworCisgICAgc3RydWN0IFZrR2VvbWV0cnlJbnN0YW5jZU5WIHsKKyAgICAgICAgZmxvYXQgdHJhbnNmb3JtWzEyXTsKKyAgICAgICAgdWludDMyX3QgaW5zdGFuY2VDdXN0b21JbmRleCA6IDI0OworICAgICAgICB1aW50MzJfdCBtYXNrIDogODsKKyAgICAgICAgdWludDMyX3QgaW5zdGFuY2VPZmZzZXQgOiAyNDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgOiA4OworICAgICAgICB1aW50NjRfdCBhY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGU7CisgICAgfTsKKworICAgIFZrR2VvbWV0cnlJbnN0YW5jZU5WIGluc3RhbmNlID0geworICAgICAgICB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsCisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgICAgICAgfSwKKyAgICAgICAgMCwKKyAgICAgICAgMHhGRiwKKyAgICAgICAgMCwKKyAgICAgICAgVktfR0VPTUVUUllfSU5TVEFOQ0VfVFJJQU5HTEVfQ1VMTF9ESVNBQkxFX0JJVF9OViwKKyAgICAgICAgMTIzNDU2NywKKyAgICB9OworCisgICAgVmtEZXZpY2VTaXplIGluc3RhbmNlX2J1ZmZlcl9zaXplID0gc2l6ZW9mKFZrR2VvbWV0cnlJbnN0YW5jZU5WKTsKKyAgICBWa0J1ZmZlck9iaiBpbnN0YW5jZV9idWZmZXI7CisgICAgaW5zdGFuY2VfYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBpbnN0YW5jZV9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfUkFZX1RSQUNJTkdfQklUX05WKTsKKworICAgIHVpbnQ4X3QgKm1hcHBlZF9pbnN0YW5jZV9idWZmZXJfZGF0YSA9ICh1aW50OF90ICopaW5zdGFuY2VfYnVmZmVyLm1lbW9yeSgpLm1hcCgpOworICAgIHN0ZDo6bWVtY3B5KG1hcHBlZF9pbnN0YW5jZV9idWZmZXJfZGF0YSwgKHVpbnQ4X3QgKikmaW5zdGFuY2UsIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihpbnN0YW5jZV9idWZmZXJfc2l6ZSkpOworICAgIGluc3RhbmNlX2J1ZmZlci5tZW1vcnkoKS51bm1hcCgpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogdG9wX2xldmVsX2FzKCptX2RldmljZSwgdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIFZrQnVmZmVyT2JqIHRvcF9sZXZlbF9hc19zY3JhdGNoOworICAgIHRvcF9sZXZlbF9hcy5jcmVhdGVfc2NyYXRjaF9idWZmZXIoKm1fZGV2aWNlLCAmdG9wX2xldmVsX2FzX3NjcmF0Y2gpOworCisgICAgc3RydWN0IENvbXB1dGVPdXRwdXQgeworICAgICAgICB1aW50MzJfdCBwdXNoX2NvbnN0YW50X3ZhbHVlOworICAgICAgICB1aW50MzJfdCBwdXNoX2Rlc2NyaXB0b3JfdmFsdWU7CisgICAgICAgIHVpbnQzMl90IG5vcm1hbF9kZXNjcmlwdG9yX3ZhbHVlOworICAgIH07CisKKyAgICBWa0J1ZmZlck9iaiBwdXNoX2Rlc2NyaXB0b3JfYnVmZmVyOworICAgIHB1c2hfZGVzY3JpcHRvcl9idWZmZXIuaW5pdCgqbV9kZXZpY2UsIDQsIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklUKTsKKworICAgIFZrQnVmZmVyT2JqIG5vcm1hbF9kZXNjcmlwdG9yX2J1ZmZlcjsKKyAgICBub3JtYWxfZGVzY3JpcHRvcl9idWZmZXIuaW5pdCgqbV9kZXZpY2UsIDQsIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQpOworCisgICAgVmtEZXZpY2VTaXplIG91dHB1dF9kZXNjcmlwdG9yX2J1ZmZlcl9zaXplID0gc3RhdGljX2Nhc3Q8VmtEZXZpY2VTaXplPihzaXplb2YoQ29tcHV0ZU91dHB1dCkpOworICAgIFZrQnVmZmVyT2JqIG91dHB1dF9kZXNjcmlwdG9yX2J1ZmZlcjsKKyAgICBvdXRwdXRfZGVzY3JpcHRvcl9idWZmZXIuaW5pdCgqbV9kZXZpY2UsIG91dHB1dF9kZXNjcmlwdG9yX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY3Nfc291cmNlID0gUiJnbHNsKCN2ZXJzaW9uIDQ1MAorICAgICAgICBsYXlvdXQobG9jYWxfc2l6ZV94ID0gMSwgbG9jYWxfc2l6ZV95ID0gMSwgbG9jYWxfc2l6ZV96ID0gMSkgaW47CisKKyAgICAgICAgbGF5b3V0KHB1c2hfY29uc3RhbnQpIHVuaWZvcm0gUHVzaENvbnN0YW50cyB7IHVpbnQgdmFsdWU7IH0gcHVzaF9jb25zdGFudDsKKyAgICAgICAgbGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAwLCBzdGQ0MzApIGJ1ZmZlciBQdXNoRGVzY3JpcHRvckJ1ZmZlciB7IHVpbnQgdmFsdWU7IH0gcHVzaF9kZXNjcmlwdG9yOworICAgICAgICBsYXlvdXQoc2V0ID0gMSwgYmluZGluZyA9IDAsIHN0ZDQzMCkgYnVmZmVyIE5vcm1hbERlc2NyaXB0b3JCdWZmZXIgeyB1aW50IHZhbHVlOyB9IG5vcm1hbF9kZXNjcmlwdG9yOworCisgICAgICAgIGxheW91dChzZXQgPSAyLCBiaW5kaW5nID0gMCwgc3RkNDMwKSBidWZmZXIgQ29tcHV0ZU91dHB1dEJ1ZmZlciB7CisgICAgICAgICAgICB1aW50IHB1c2hfY29uc3RhbnRfdmFsdWU7CisgICAgICAgICAgICB1aW50IHB1c2hfZGVzY3JpcHRvcl92YWx1ZTsKKyAgICAgICAgICAgIHVpbnQgbm9ybWFsX2Rlc2NyaXB0b3JfdmFsdWU7CisgICAgICAgIH0gY29tcHV0ZV9vdXRwdXQ7CisKKyAgICAgICAgdm9pZCBtYWluKCkgeworICAgICAgICAgICAgY29tcHV0ZV9vdXRwdXQucHVzaF9jb25zdGFudF92YWx1ZSA9IHB1c2hfY29uc3RhbnQudmFsdWU7CisgICAgICAgICAgICBjb21wdXRlX291dHB1dC5wdXNoX2Rlc2NyaXB0b3JfdmFsdWUgPSBwdXNoX2Rlc2NyaXB0b3IudmFsdWU7CisgICAgICAgICAgICBjb21wdXRlX291dHB1dC5ub3JtYWxfZGVzY3JpcHRvcl92YWx1ZSA9IG5vcm1hbF9kZXNjcmlwdG9yLnZhbHVlOworICAgICAgICB9CisgICAgKWdsc2wiOworICAgIFZrU2hhZGVyT2JqIGNzKG1fZGV2aWNlLCBjc19zb3VyY2UuY19zdHIoKSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCB0aGlzKTsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgcHVzaF9kZXNjcmlwdG9yX3NldChtX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUik7CisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBub3JtYWxfZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgb3V0cHV0X2Rlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIFZrUHVzaENvbnN0YW50UmFuZ2UgcHVzaF9jb25zdGFudF9yYW5nZSA9IHt9OworICAgIHB1c2hfY29uc3RhbnRfcmFuZ2Uuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVDsKKyAgICBwdXNoX2NvbnN0YW50X3JhbmdlLnNpemUgPSA0OworICAgIHB1c2hfY29uc3RhbnRfcmFuZ2Uub2Zmc2V0ID0gMDsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogY29tcHV0ZV9waXBlbGluZV9sYXlvdXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1c2hfZGVzY3JpcHRvcl9zZXQubGF5b3V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9ybWFsX2Rlc2NyaXB0b3Jfc2V0LmxheW91dF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dF9kZXNjcmlwdG9yX3NldC5sYXlvdXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwdXNoX2NvbnN0YW50X3JhbmdlfSk7CisKKyAgICBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gY29tcHV0ZV9waXBlbGluZV9jaSA9IHt9OworICAgIGNvbXB1dGVfcGlwZWxpbmVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01QVVRFX1BJUEVMSU5FX0NSRUFURV9JTkZPOworICAgIGNvbXB1dGVfcGlwZWxpbmVfY2kubGF5b3V0ID0gY29tcHV0ZV9waXBlbGluZV9sYXlvdXQuaGFuZGxlKCk7CisgICAgY29tcHV0ZV9waXBlbGluZV9jaS5zdGFnZSA9IGNzLkdldFN0YWdlQ3JlYXRlSW5mbygpOworCisgICAgVmtQaXBlbGluZSBjb21wdXRlX3BpcGVsaW5lOworICAgIEFTU0VSVF9WS19TVUNDRVNTKAorICAgICAgICB2azo6Q3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhtX2RldmljZS0+ZGV2aWNlKCksIFZLX05VTExfSEFORExFLCAxLCAmY29tcHV0ZV9waXBlbGluZV9jaSwgbnVsbHB0ciwgJmNvbXB1dGVfcGlwZWxpbmUpKTsKKworICAgIG5vcm1hbF9kZXNjcmlwdG9yX3NldC5Xcml0ZURlc2NyaXB0b3JCdWZmZXJJbmZvKDAsIG5vcm1hbF9kZXNjcmlwdG9yX2J1ZmZlci5oYW5kbGUoKSwgNCwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSKTsKKyAgICBub3JtYWxfZGVzY3JpcHRvcl9zZXQuVXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKworICAgIG91dHB1dF9kZXNjcmlwdG9yX3NldC5Xcml0ZURlc2NyaXB0b3JCdWZmZXJJbmZvKDAsIG91dHB1dF9kZXNjcmlwdG9yX2J1ZmZlci5oYW5kbGUoKSwgb3V0cHV0X2Rlc2NyaXB0b3JfYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSKTsKKyAgICBvdXRwdXRfZGVzY3JpcHRvcl9zZXQuVXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKworICAgIC8vIFNldCBpbnB1dCBkYXRhCisgICAgY29uc3QgdWludDMyX3QgcHVzaF9jb25zdGFudF92YWx1ZSA9IDEyMzQ1Njc4OTA7CisgICAgY29uc3QgdWludDMyX3QgcHVzaF9kZXNjcmlwdG9yX3ZhbHVlID0gOTg3NjU0MzI7CisgICAgY29uc3QgdWludDMyX3Qgbm9ybWFsX2Rlc2NyaXB0b3JfdmFsdWUgPSAxMTExMTExOworCisgICAgdWludDMyX3QgKm1hcHBlZF9wdXNoX2Rlc2NyaXB0b3JfYnVmZmVyX2RhdGEgPSAodWludDMyX3QgKilwdXNoX2Rlc2NyaXB0b3JfYnVmZmVyLm1lbW9yeSgpLm1hcCgpOworICAgICptYXBwZWRfcHVzaF9kZXNjcmlwdG9yX2J1ZmZlcl9kYXRhID0gcHVzaF9kZXNjcmlwdG9yX3ZhbHVlOworICAgIHB1c2hfZGVzY3JpcHRvcl9idWZmZXIubWVtb3J5KCkudW5tYXAoKTsKKworICAgIHVpbnQzMl90ICptYXBwZWRfbm9ybWFsX2Rlc2NyaXB0b3JfYnVmZmVyX2RhdGEgPSAodWludDMyX3QgKilub3JtYWxfZGVzY3JpcHRvcl9idWZmZXIubWVtb3J5KCkubWFwKCk7CisgICAgKm1hcHBlZF9ub3JtYWxfZGVzY3JpcHRvcl9idWZmZXJfZGF0YSA9IG5vcm1hbF9kZXNjcmlwdG9yX3ZhbHVlOworICAgIG5vcm1hbF9kZXNjcmlwdG9yX2J1ZmZlci5tZW1vcnkoKS51bm1hcCgpOworCisgICAgQ29tcHV0ZU91dHB1dCAqbWFwcGVkX291dHB1dF9idWZmZXJfZGF0YSA9IChDb21wdXRlT3V0cHV0ICopb3V0cHV0X2Rlc2NyaXB0b3JfYnVmZmVyLm1lbW9yeSgpLm1hcCgpOworICAgIG1hcHBlZF9vdXRwdXRfYnVmZmVyX2RhdGEtPnB1c2hfY29uc3RhbnRfdmFsdWUgPSAwOworICAgIG1hcHBlZF9vdXRwdXRfYnVmZmVyX2RhdGEtPnB1c2hfZGVzY3JpcHRvcl92YWx1ZSA9IDA7CisgICAgbWFwcGVkX291dHB1dF9idWZmZXJfZGF0YS0+bm9ybWFsX2Rlc2NyaXB0b3JfdmFsdWUgPSAwOworICAgIG91dHB1dF9kZXNjcmlwdG9yX2J1ZmZlci5tZW1vcnkoKS51bm1hcCgpOworCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBwdXNoX2Rlc2NyaXB0b3JfYnVmZmVyX2luZm8gPSB7fTsKKyAgICBwdXNoX2Rlc2NyaXB0b3JfYnVmZmVyX2luZm8uYnVmZmVyID0gcHVzaF9kZXNjcmlwdG9yX2J1ZmZlci5oYW5kbGUoKTsKKyAgICBwdXNoX2Rlc2NyaXB0b3JfYnVmZmVyX2luZm8ub2Zmc2V0ID0gMDsKKyAgICBwdXNoX2Rlc2NyaXB0b3JfYnVmZmVyX2luZm8ucmFuZ2UgPSA0OworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0IHB1c2hfZGVzY3JpcHRvcl9zZXRfd3JpdGUgPSB7fTsKKyAgICBwdXNoX2Rlc2NyaXB0b3Jfc2V0X3dyaXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgcHVzaF9kZXNjcmlwdG9yX3NldF93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIHB1c2hfZGVzY3JpcHRvcl9zZXRfd3JpdGUuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI7CisgICAgcHVzaF9kZXNjcmlwdG9yX3NldF93cml0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICBwdXNoX2Rlc2NyaXB0b3Jfc2V0X3dyaXRlLnBCdWZmZXJJbmZvID0gJnB1c2hfZGVzY3JpcHRvcl9idWZmZXJfaW5mbzsKKworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjb21tYW5kX2J1ZmZlcihtX2RldmljZSwgJmNvbW1hbmRfcG9vbCk7CisgICAgY29tbWFuZF9idWZmZXIuYmVnaW4oKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKGNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsIGNvbXB1dGVfcGlwZWxpbmUpOworICAgIHZrOjpDbWRQdXNoQ29uc3RhbnRzKGNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpLCBjb21wdXRlX3BpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCAwLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICZwdXNoX2NvbnN0YW50X3ZhbHVlKTsKKyAgICB2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSKGNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsIGNvbXB1dGVfcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1c2hfZGVzY3JpcHRvcl9zZXRfd3JpdGUpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMoY29tbWFuZF9idWZmZXIuaGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgY29tcHV0ZV9waXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9ybWFsX2Rlc2NyaXB0b3Jfc2V0LnNldF8sIDAsIG51bGxwdHIpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMoY29tbWFuZF9idWZmZXIuaGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgY29tcHV0ZV9waXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIDIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0X2Rlc2NyaXB0b3Jfc2V0LnNldF8sIDAsIG51bGxwdHIpOworCisgICAgdmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WKGNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpLCAmdG9wX2xldmVsX2FzX2NyZWF0ZV9pbmZvLmluZm8sIGluc3RhbmNlX2J1ZmZlci5oYW5kbGUoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRkFMU0UsIHRvcF9sZXZlbF9hcy5oYW5kbGUoKSwgVktfTlVMTF9IQU5ETEUsIHRvcF9sZXZlbF9hc19zY3JhdGNoLmhhbmRsZSgpLCAwKTsKKworICAgIHZrOjpDbWREaXNwYXRjaChjb21tYW5kX2J1ZmZlci5oYW5kbGUoKSwgMSwgMSwgMSk7CisgICAgY29tbWFuZF9idWZmZXIuZW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiQXR0ZW1wdGVkIHRvIGJ1aWxkIHRvcCBsZXZlbCBhY2NlbGVyYXRpb24gc3RydWN0dXJlIHVzaW5nIGludmFsaWQgYm90dG9tIGxldmVsIGFjY2VsZXJhdGlvbiBzdHJ1Y3R1cmUgaGFuZGxlIik7CisKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyLmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtYXBwZWRfb3V0cHV0X2J1ZmZlcl9kYXRhID0gKENvbXB1dGVPdXRwdXQgKilvdXRwdXRfZGVzY3JpcHRvcl9idWZmZXIubWVtb3J5KCkubWFwKCk7CisgICAgRVhQRUNUX0VRKG1hcHBlZF9vdXRwdXRfYnVmZmVyX2RhdGEtPnB1c2hfY29uc3RhbnRfdmFsdWUsIHB1c2hfY29uc3RhbnRfdmFsdWUpOworICAgIEVYUEVDVF9FUShtYXBwZWRfb3V0cHV0X2J1ZmZlcl9kYXRhLT5wdXNoX2Rlc2NyaXB0b3JfdmFsdWUsIHB1c2hfZGVzY3JpcHRvcl92YWx1ZSk7CisgICAgRVhQRUNUX0VRKG1hcHBlZF9vdXRwdXRfYnVmZmVyX2RhdGEtPm5vcm1hbF9kZXNjcmlwdG9yX3ZhbHVlLCBub3JtYWxfZGVzY3JpcHRvcl92YWx1ZSk7CisgICAgb3V0cHV0X2Rlc2NyaXB0b3JfYnVmZmVyLm1lbW9yeSgpLnVubWFwKCk7CisKKyAgICAvLyBDbGVhbiB1cAorICAgIHZrOjpEZXN0cm95UGlwZWxpbmUobV9kZXZpY2UtPmRldmljZSgpLCBjb21wdXRlX3BpcGVsaW5lLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBRdWVyeVBlcmZvcm1hbmNlQ3JlYXRpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgcGVyZm9ybWFuY2UgcXVlcnkgd2l0aG91dCBzdXBwb3J0Iik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIGZlYXR1cmVzMiA9IHt9OworICAgIGF1dG8gcGVyZm9ybWFuY2VfZmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUj4oKTsKKyAgICBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJnBlcmZvcm1hbmNlX2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKyAgICBpZiAoIXBlcmZvcm1hbmNlX2ZlYXR1cmVzLnBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBQZXJmb3JtYW5jZSBxdWVyeSBwb29scyBhcmUgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAmcGVyZm9ybWFuY2VfZmVhdHVyZXMpKTsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSCisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiA9CisgICAgICAgICAgICAoUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSgpLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSICE9IG51bGxwdHIpOworCisgICAgYXV0byBxdWV1ZUZhbWlseVByb3BlcnRpZXMgPSBtX2RldmljZS0+cGh5KCkucXVldWVfcHJvcGVydGllcygpOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseVByb3BlcnRpZXMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSPiBjb3VudGVyczsKKworICAgIGZvciAodWludDMyX3QgaWR4ID0gMDsgaWR4IDwgcXVldWVGYW1pbHlQcm9wZXJ0aWVzLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgdWludDMyX3QgbkNvdW50ZXJzOworCisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUihncHUoKSwgaWR4LCAmbkNvdW50ZXJzLCBudWxscHRyLCBudWxscHRyKTsKKyAgICAgICAgaWYgKG5Db3VudGVycyA9PSAwKSBjb250aW51ZTsKKworICAgICAgICBjb3VudGVycy5yZXNpemUobkNvdW50ZXJzKTsKKyAgICAgICAgZm9yIChhdXRvICZjIDogY291bnRlcnMpIHsKKyAgICAgICAgICAgIGMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUjsKKyAgICAgICAgICAgIGMucE5leHQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUihncHUoKSwgaWR4LCAmbkNvdW50ZXJzLCAmY291bnRlcnNbMF0sIG51bGxwdHIpOworICAgICAgICBxdWV1ZUZhbWlseUluZGV4ID0gaWR4OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoY291bnRlcnMuZW1wdHkoKSkgeworICAgICAgICBwcmludGYoIiVzIE5vIHF1ZXVlIHJlcG9ydGVkIGFueSBwZXJmb3JtYW5jZSBjb3VudGVyLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgcGVyZl9xdWVyeV9wb29sX2Npe307CisgICAgcGVyZl9xdWVyeV9wb29sX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9QRVJGT1JNQU5DRV9DUkVBVEVfSU5GT19LSFI7CisgICAgcGVyZl9xdWVyeV9wb29sX2NpLnF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseUluZGV4OworICAgIHBlcmZfcXVlcnlfcG9vbF9jaS5jb3VudGVySW5kZXhDb3VudCA9IGNvdW50ZXJzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY291bnRlckluZGljZXM7CisgICAgZm9yICh1aW50MzJfdCBjID0gMDsgYyA8IGNvdW50ZXJzLnNpemUoKTsgYysrKSBjb3VudGVySW5kaWNlcy5wdXNoX2JhY2soYyk7CisgICAgcGVyZl9xdWVyeV9wb29sX2NpLnBDb3VudGVySW5kaWNlcyA9ICZjb3VudGVySW5kaWNlc1swXTsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jaXt9OworICAgIHF1ZXJ5X3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY2kucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI7CisgICAgcXVlcnlfcG9vbF9jaS5xdWVyeUNvdW50ID0gMTsKKworICAgIC8vIE1pc3NpbmcgcE5leHQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUXVlcnlQb29sQ3JlYXRlSW5mby1xdWVyeVR5cGUtMDMyMjIiKTsKKyAgICBWa1F1ZXJ5UG9vbCBxdWVyeV9wb29sOworICAgIHZrOjpDcmVhdGVRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcXVlcnlfcG9vbF9jaSwgbnVsbHB0ciwgJnF1ZXJ5X3Bvb2wpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgcXVlcnlfcG9vbF9jaS5wTmV4dCA9ICZwZXJmX3F1ZXJ5X3Bvb2xfY2k7CisKKyAgICAvLyBJbnZhbGlkIGNvdW50ZXIgaW5kaWNlcworICAgIGNvdW50ZXJJbmRpY2VzLnB1c2hfYmFjayhjb3VudGVycy5zaXplKCkpOworICAgIHBlcmZfcXVlcnlfcG9vbF9jaS5jb3VudGVySW5kZXhDb3VudCsrOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFItcENvdW50ZXJJbmRpY2VzLTAzMzIxIik7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxdWVyeV9wb29sX2NpLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgcGVyZl9xdWVyeV9wb29sX2NpLmNvdW50ZXJJbmRleENvdW50LS07CisgICAgY291bnRlckluZGljZXMucG9wX2JhY2soKTsKKworICAgIC8vIFN1Y2Nlc3MKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCk7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxdWVyeV9wb29sX2NpLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBNaXNzaW5nIGFjcXVpcmUgbG9jaworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAzMjIzIik7CisgICAgICAgIHZrOjpDbWRCZWdpblF1ZXJ5KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDApOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBRdWVyeVBlcmZvcm1hbmNlQ291bnRlckNvbW1hbmRidWZmZXJTY29wZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkluc2VydCBhIHBlcmZvcm1hbmNlIHF1ZXJ5IGJlZ2luL2VuZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbW1hbmQgYnVmZmVyIGNvdW50ZXIgc2NvcGUiKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgZmVhdHVyZXMyID0ge307CisgICAgYXV0byBwZXJmb3JtYW5jZUZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZVF1ZXJ5RmVhdHVyZXNLSFI+KCk7CisgICAgZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KCZwZXJmb3JtYW5jZUZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKyAgICBpZiAoIXBlcmZvcm1hbmNlRmVhdHVyZXMucGVyZm9ybWFuY2VDb3VudGVyUXVlcnlQb29scykgeworICAgICAgICBwcmludGYoIiVzIFBlcmZvcm1hbmNlIHF1ZXJ5IHBvb2xzIGFyZSBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIHBvb2xfZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBlcmZvcm1hbmNlRmVhdHVyZXMsIHBvb2xfZmxhZ3MpKTsKKyAgICBQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSCisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiA9CisgICAgICAgICAgICAoUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSgpLCAidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSICE9IG51bGxwdHIpOworCisgICAgYXV0byBxdWV1ZUZhbWlseVByb3BlcnRpZXMgPSBtX2RldmljZS0+cGh5KCkucXVldWVfcHJvcGVydGllcygpOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseVByb3BlcnRpZXMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSPiBjb3VudGVyczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY291bnRlckluZGljZXM7CisKKyAgICAvLyBGaW5kIGEgc2luZ2xlIGNvdW50ZXIgd2l0aCBWS19RVUVSWV9TQ09QRV9DT01NQU5EX0JVRkZFUl9LSFIgc2NvcGUuCisgICAgZm9yICh1aW50MzJfdCBpZHggPSAwOyBpZHggPCBxdWV1ZUZhbWlseVByb3BlcnRpZXMuc2l6ZSgpOyBpZHgrKykgeworICAgICAgICB1aW50MzJfdCBuQ291bnRlcnM7CisKKyAgICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKGdwdSgpLCBpZHgsICZuQ291bnRlcnMsIG51bGxwdHIsIG51bGxwdHIpOworICAgICAgICBpZiAobkNvdW50ZXJzID09IDApIGNvbnRpbnVlOworCisgICAgICAgIGNvdW50ZXJzLnJlc2l6ZShuQ291bnRlcnMpOworICAgICAgICBmb3IgKGF1dG8gJmMgOiBjb3VudGVycykgeworICAgICAgICAgICAgYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfS0hSOworICAgICAgICAgICAgYy5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKGdwdSgpLCBpZHgsICZuQ291bnRlcnMsICZjb3VudGVyc1swXSwgbnVsbHB0cik7CisgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXggPSBpZHg7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBjb3VudGVySWR4ID0gMDsgY291bnRlcklkeCA8IGNvdW50ZXJzLnNpemUoKTsgY291bnRlcklkeCsrKSB7CisgICAgICAgICAgICBpZiAoY291bnRlcnNbY291bnRlcklkeF0uc2NvcGUgPT0gVktfUVVFUllfU0NPUEVfQ09NTUFORF9CVUZGRVJfS0hSKSB7CisgICAgICAgICAgICAgICAgY291bnRlckluZGljZXMucHVzaF9iYWNrKGNvdW50ZXJJZHgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvdW50ZXJJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvdW50ZXJzLmNsZWFyKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoY291bnRlckluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBwcmludGYoIiVzIE5vIHF1ZXVlIHJlcG9ydGVkIGFueSBwZXJmb3JtYW5jZSBjb3VudGVyIHdpdGggY29tbWFuZCBidWZmZXIgc2NvcGUuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiBwZXJmX3F1ZXJ5X3Bvb2xfY2l7fTsKKyAgICBwZXJmX3F1ZXJ5X3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBwZXJmX3F1ZXJ5X3Bvb2xfY2kucXVldWVGYW1pbHlJbmRleCA9IHF1ZXVlRmFtaWx5SW5kZXg7CisgICAgcGVyZl9xdWVyeV9wb29sX2NpLmNvdW50ZXJJbmRleENvdW50ID0gY291bnRlckluZGljZXMuc2l6ZSgpOworICAgIHBlcmZfcXVlcnlfcG9vbF9jaS5wQ291bnRlckluZGljZXMgPSAmY291bnRlckluZGljZXNbMF07CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfY2l7fTsKKyAgICBxdWVyeV9wb29sX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxdWVyeV9wb29sX2NpLnBOZXh0ID0gJnBlcmZfcXVlcnlfcG9vbF9jaTsKKyAgICBxdWVyeV9wb29sX2NpLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSOworICAgIHF1ZXJ5X3Bvb2xfY2kucXVlcnlDb3VudCA9IDE7CisKKyAgICBWa1F1ZXJ5UG9vbCBxdWVyeV9wb29sOworICAgIHZrOjpDcmVhdGVRdWVyeVBvb2woZGV2aWNlKCksICZxdWVyeV9wb29sX2NpLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisKKyAgICBWa1F1ZXVlIHF1ZXVlID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkdldERldmljZVF1ZXVlKGRldmljZSgpLCBxdWV1ZUZhbWlseUluZGV4LCAwLCAmcXVldWUpOworCisgICAgUEZOX3ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiA9CisgICAgICAgIChQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgIT0gbnVsbHB0cik7CisgICAgUEZOX3ZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIgdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiA9CisgICAgICAgIChQRk5fdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIgIT0gbnVsbHB0cik7CisKKyAgICB7CisgICAgICAgIFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSIGxvY2tfaW5mb3t9OworICAgICAgICBsb2NrX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX1BST0ZJTElOR19MT0NLX0lORk9fS0hSOworICAgICAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKGRldmljZSgpLCAmbG9ja19pbmZvKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmVzdWx0ID09IFZLX1NVQ0NFU1MpOworICAgIH0KKworICAgIC8vIE5vdCB0aGUgZmlyc3QgY29tbWFuZC4KKyAgICB7CisgICAgICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZfaW5mbyA9IHt9OworICAgICAgICBidWZfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICAgICAgYnVmX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICAgICAgYnVmX2luZm8uc2l6ZSA9IDQwOTY7CisgICAgICAgIGJ1Zl9pbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICAgICAgVmtCdWZmZXIgYnVmZmVyOworICAgICAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlQnVmZmVyKGRldmljZSgpLCAmYnVmX2luZm8sIE5VTEwsICZidWZmZXIpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworICAgICAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSgpLCBidWZmZXIsICZtZW1fcmVxcyk7CisKKyAgICAgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgICAgICBhbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgICAgIGFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgPSA0MDk2OworICAgICAgICBWa0RldmljZU1lbW9yeSBtZW07CisgICAgICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZtZW0pOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShkZXZpY2UoKSwgYnVmZmVyLCBtZW0sIDApOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAgICAgdms6OkNtZEZpbGxCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLCAwLCA0MDk2LCAwKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmVnaW5RdWVyeS1xdWVyeVBvb2wtMDMyMjQiKTsKKyAgICAgICAgdms6OkNtZEJlZ2luUXVlcnkobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvOworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0U2VtYXBob3JlcyA9IE5VTEw7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gTlVMTDsKKyAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJm1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICAgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSBOVUxMOworICAgICAgICB2azo6UXVldWVTdWJtaXQocXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgICAgICB2azo6UXVldWVXYWl0SWRsZShxdWV1ZSk7CisKKyAgICAgICAgdms6OkRlc3Ryb3lCdWZmZXIoZGV2aWNlKCksIGJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBtZW0sIE5VTEwpOworICAgIH0KKworICAgIC8vIEZpcnN0IGNvbW1hbmQ6IHN1Y2Nlc3MuCisgICAgeworICAgICAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmX2luZm8gPSB7fTsKKyAgICAgICAgYnVmX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgICAgIGJ1Zl9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgICAgIGJ1Zl9pbmZvLnNpemUgPSA0MDk2OworICAgICAgICBidWZfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihkZXZpY2UoKSwgJmJ1Zl9pbmZvLCBOVUxMLCAmYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1fcmVxczsKKyAgICAgICAgdms6OkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UoKSwgYnVmZmVyLCAmbWVtX3JlcXMpOworCisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGFsbG9jX2luZm8gPSB7fTsKKyAgICAgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgICAgICBhbGxvY19pbmZvLmFsbG9jYXRpb25TaXplID0gNDA5NjsKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgICAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkoZGV2aWNlKCksICZhbGxvY19pbmZvLCBOVUxMLCAmbWVtKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAgICAgdms6OkJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlKCksIGJ1ZmZlciwgbWVtLCAwKTsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQpOworICAgICAgICB2azo6Q21kQmVnaW5RdWVyeShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAwKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgdms6OkNtZEZpbGxCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLCAwLCA0MDk2LCAwKTsKKworICAgICAgICB2azo6Q21kRW5kUXVlcnkobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCk7CisKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm87CisgICAgICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgIHN1Ym1pdF9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICAgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gTlVMTDsKKyAgICAgICAgc3VibWl0X2luZm8ucFdhaXREc3RTdGFnZU1hc2sgPSBOVUxMOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICAgICAgc3VibWl0X2luZm8uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAwOworICAgICAgICBzdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEw7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChxdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIHZrOjpRdWV1ZVdhaXRJZGxlKHF1ZXVlKTsKKworICAgICAgICB2azo6RGVzdHJveUJ1ZmZlcihkZXZpY2UoKSwgYnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIG1lbSwgTlVMTCk7CisgICAgfQorCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBOVUxMKTsKKworICAgIHZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoZGV2aWNlKCkpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyUmVuZGVyUGFzc1Njb3BlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiSW5zZXJ0IGEgcGVyZm9ybWFuY2UgcXVlcnkgYmVnaW4vZW5kIHdpdGggcmVzcGVjdCB0byB0aGUgcmVuZGVyIHBhc3MgY291bnRlciBzY29wZSIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBmZWF0dXJlczIgPSB7fTsKKyAgICBhdXRvIHBlcmZvcm1hbmNlRmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUj4oKTsKKyAgICBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJnBlcmZvcm1hbmNlRmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoZ3B1KCksICZmZWF0dXJlczIpOworICAgIGlmICghcGVyZm9ybWFuY2VGZWF0dXJlcy5wZXJmb3JtYW5jZUNvdW50ZXJRdWVyeVBvb2xzKSB7CisgICAgICAgIHByaW50ZigiJXMgUGVyZm9ybWFuY2UgcXVlcnkgcG9vbHMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgcG9vbF9mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCBudWxscHRyLCBwb29sX2ZsYWdzKSk7CisgICAgUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUgorICAgICAgICB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIgPQorICAgICAgICAgICAgKFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoCisgICAgICAgICAgICAgICAgaW5zdGFuY2UoKSwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiAhPSBudWxscHRyKTsKKworICAgIGF1dG8gcXVldWVGYW1pbHlQcm9wZXJ0aWVzID0gbV9kZXZpY2UtPnBoeSgpLnF1ZXVlX3Byb3BlcnRpZXMoKTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlQcm9wZXJ0aWVzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxWa1BlcmZvcm1hbmNlQ291bnRlcktIUj4gY291bnRlcnM7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGNvdW50ZXJJbmRpY2VzOworCisgICAgLy8gRmluZCBhIHNpbmdsZSBjb3VudGVyIHdpdGggVktfUVVFUllfU0NPUEVfUkVOREVSX1BBU1NfS0hSIHNjb3BlLgorICAgIGZvciAodWludDMyX3QgaWR4ID0gMDsgaWR4IDwgcXVldWVGYW1pbHlQcm9wZXJ0aWVzLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgdWludDMyX3QgbkNvdW50ZXJzOworCisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUihncHUoKSwgaWR4LCAmbkNvdW50ZXJzLCBudWxscHRyLCBudWxscHRyKTsKKyAgICAgICAgaWYgKG5Db3VudGVycyA9PSAwKSBjb250aW51ZTsKKworICAgICAgICBjb3VudGVycy5yZXNpemUobkNvdW50ZXJzKTsKKyAgICAgICAgZm9yIChhdXRvICZjIDogY291bnRlcnMpIHsKKyAgICAgICAgICAgIGMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUjsKKyAgICAgICAgICAgIGMucE5leHQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUihncHUoKSwgaWR4LCAmbkNvdW50ZXJzLCAmY291bnRlcnNbMF0sIG51bGxwdHIpOworICAgICAgICBxdWV1ZUZhbWlseUluZGV4ID0gaWR4OworCisgICAgICAgIGZvciAodWludDMyX3QgY291bnRlcklkeCA9IDA7IGNvdW50ZXJJZHggPCBjb3VudGVycy5zaXplKCk7IGNvdW50ZXJJZHgrKykgeworICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2NvdW50ZXJJZHhdLnNjb3BlID09IFZLX1FVRVJZX1NDT1BFX1JFTkRFUl9QQVNTX0tIUikgeworICAgICAgICAgICAgICAgIGNvdW50ZXJJbmRpY2VzLnB1c2hfYmFjayhjb3VudGVySWR4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3VudGVySW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb3VudGVycy5jbGVhcigpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGNvdW50ZXJJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBObyBxdWV1ZSByZXBvcnRlZCBhbnkgcGVyZm9ybWFuY2UgY291bnRlciB3aXRoIHJlbmRlciBwYXNzIHNjb3BlLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSIHBlcmZfcXVlcnlfcG9vbF9jaXt9OworICAgIHBlcmZfcXVlcnlfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIHBlcmZfcXVlcnlfcG9vbF9jaS5xdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlJbmRleDsKKyAgICBwZXJmX3F1ZXJ5X3Bvb2xfY2kuY291bnRlckluZGV4Q291bnQgPSBjb3VudGVySW5kaWNlcy5zaXplKCk7CisgICAgcGVyZl9xdWVyeV9wb29sX2NpLnBDb3VudGVySW5kaWNlcyA9ICZjb3VudGVySW5kaWNlc1swXTsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jaXt9OworICAgIHF1ZXJ5X3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY2kucE5leHQgPSAmcGVyZl9xdWVyeV9wb29sX2NpOworICAgIHF1ZXJ5X3Bvb2xfY2kucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI7CisgICAgcXVlcnlfcG9vbF9jaS5xdWVyeUNvdW50ID0gMTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChkZXZpY2UoKSwgJnF1ZXJ5X3Bvb2xfY2ksIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKworICAgIFZrUXVldWUgcXVldWUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6R2V0RGV2aWNlUXVldWUoZGV2aWNlKCksIHF1ZXVlRmFtaWx5SW5kZXgsIDAsICZxdWV1ZSk7CisKKyAgICBQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiB2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSID0KKyAgICAgICAgKFBGTl92a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiAhPSBudWxscHRyKTsKKyAgICBQRk5fdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiB2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSID0KKyAgICAgICAgKFBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiAhPSBudWxscHRyKTsKKworICAgIHsKKyAgICAgICAgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgbG9ja19pbmZve307CisgICAgICAgIGxvY2tfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfUFJPRklMSU5HX0xPQ0tfSU5GT19LSFI7CisgICAgICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoZGV2aWNlKCksICZsb2NrX2luZm8pOworICAgICAgICBBU1NFUlRfVFJVRShyZXN1bHQgPT0gVktfU1VDQ0VTUyk7CisgICAgfQorCisgICAgLy8gSW5zaWRlIGEgcmVuZGVyIHBhc3MuCisgICAgeworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJlZ2luUXVlcnktcXVlcnlQb29sLTAzMjI1Iik7CisgICAgICAgIHZrOjpDbWRCZWdpblF1ZXJ5KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDApOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPkVuZFJlbmRlclBhc3MoKTsKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm87CisgICAgICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgIHN1Ym1pdF9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICAgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gTlVMTDsKKyAgICAgICAgc3VibWl0X2luZm8ucFdhaXREc3RTdGFnZU1hc2sgPSBOVUxMOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICAgICAgc3VibWl0X2luZm8uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAwOworICAgICAgICBzdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEw7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChxdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIHZrOjpRdWV1ZVdhaXRJZGxlKHF1ZXVlKTsKKyAgICB9CisKKyAgICB2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKGRldmljZSgpKTsKKworICAgIHZrOjpEZXN0cm95UXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgcXVlcnlfcG9vbCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUXVlcnlQZXJmb3JtYW5jZVJlbGVhc2VQcm9maWxlTG9ja0JlZm9yZVN1Ym1pdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZlcmlmeSB0aGF0IHdlIGdldCBhbiBlcnJvciBpZiB3ZSByZWxlYXNlIHRoZSBwcm9maWxpbmcgbG9jayBkdXJpbmcgdGhlIHJlY29yZGluZyBvZiBwZXJmb3JtYW5jZSBxdWVyaWVzIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIGZlYXR1cmVzMiA9IHt9OworICAgIGF1dG8gcGVyZm9ybWFuY2VGZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlUGVyZm9ybWFuY2VRdWVyeUZlYXR1cmVzS0hSPigpOworICAgIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmcGVyZm9ybWFuY2VGZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisgICAgaWYgKCFwZXJmb3JtYW5jZUZlYXR1cmVzLnBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBQZXJmb3JtYW5jZSBxdWVyeSBwb29scyBhcmUgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVGbGFncyBwb29sX2ZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZwZXJmb3JtYW5jZUZlYXR1cmVzLCBwb29sX2ZsYWdzKSk7CisgICAgUEZOX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUgorICAgICAgICB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIgPQorICAgICAgICAgICAgKFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoCisgICAgICAgICAgICAgICAgaW5zdGFuY2UoKSwgInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUiAhPSBudWxscHRyKTsKKworICAgIGF1dG8gcXVldWVGYW1pbHlQcm9wZXJ0aWVzID0gbV9kZXZpY2UtPnBoeSgpLnF1ZXVlX3Byb3BlcnRpZXMoKTsKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlQcm9wZXJ0aWVzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxWa1BlcmZvcm1hbmNlQ291bnRlcktIUj4gY291bnRlcnM7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGNvdW50ZXJJbmRpY2VzOworCisgICAgLy8gRmluZCBhIHNpbmdsZSBjb3VudGVyIHdpdGggVktfUVVFUllfU0NPUEVfUkVOREVSX1BBU1NfS0hSIHNjb3BlLgorICAgIGZvciAodWludDMyX3QgaWR4ID0gMDsgaWR4IDwgcXVldWVGYW1pbHlQcm9wZXJ0aWVzLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgdWludDMyX3QgbkNvdW50ZXJzOworCisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUihncHUoKSwgaWR4LCAmbkNvdW50ZXJzLCBudWxscHRyLCBudWxscHRyKTsKKyAgICAgICAgaWYgKG5Db3VudGVycyA9PSAwKSBjb250aW51ZTsKKworICAgICAgICBjb3VudGVycy5yZXNpemUobkNvdW50ZXJzKTsKKyAgICAgICAgZm9yIChhdXRvICZjIDogY291bnRlcnMpIHsKKyAgICAgICAgICAgIGMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9DT1VOVEVSX0tIUjsKKyAgICAgICAgICAgIGMucE5leHQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlDb3VudGVyc0tIUihncHUoKSwgaWR4LCAmbkNvdW50ZXJzLCAmY291bnRlcnNbMF0sIG51bGxwdHIpOworICAgICAgICBxdWV1ZUZhbWlseUluZGV4ID0gaWR4OworCisgICAgICAgIGZvciAodWludDMyX3QgY291bnRlcklkeCA9IDA7IGNvdW50ZXJJZHggPCBjb3VudGVycy5zaXplKCk7IGNvdW50ZXJJZHgrKykgeworICAgICAgICAgICAgY291bnRlckluZGljZXMucHVzaF9iYWNrKGNvdW50ZXJJZHgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY291bnRlckluZGljZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgY291bnRlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChjb3VudGVySW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgIHByaW50ZigiJXMgTm8gcXVldWUgcmVwb3J0ZWQgYW55IHBlcmZvcm1hbmNlIGNvdW50ZXIgd2l0aCByZW5kZXIgcGFzcyBzY29wZS5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1F1ZXJ5UG9vbFBlcmZvcm1hbmNlQ3JlYXRlSW5mb0tIUiBwZXJmX3F1ZXJ5X3Bvb2xfY2l7fTsKKyAgICBwZXJmX3F1ZXJ5X3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBwZXJmX3F1ZXJ5X3Bvb2xfY2kucXVldWVGYW1pbHlJbmRleCA9IHF1ZXVlRmFtaWx5SW5kZXg7CisgICAgcGVyZl9xdWVyeV9wb29sX2NpLmNvdW50ZXJJbmRleENvdW50ID0gY291bnRlckluZGljZXMuc2l6ZSgpOworICAgIHBlcmZfcXVlcnlfcG9vbF9jaS5wQ291bnRlckluZGljZXMgPSAmY291bnRlckluZGljZXNbMF07CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfY2l7fTsKKyAgICBxdWVyeV9wb29sX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxdWVyeV9wb29sX2NpLnBOZXh0ID0gJnBlcmZfcXVlcnlfcG9vbF9jaTsKKyAgICBxdWVyeV9wb29sX2NpLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfS0hSOworICAgIHF1ZXJ5X3Bvb2xfY2kucXVlcnlDb3VudCA9IDE7CisKKyAgICBWa1F1ZXJ5UG9vbCBxdWVyeV9wb29sOworICAgIHZrOjpDcmVhdGVRdWVyeVBvb2woZGV2aWNlKCksICZxdWVyeV9wb29sX2NpLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisKKyAgICBWa1F1ZXVlIHF1ZXVlID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkdldERldmljZVF1ZXVlKGRldmljZSgpLCBxdWV1ZUZhbWlseUluZGV4LCAwLCAmcXVldWUpOworCisgICAgUEZOX3ZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiA9CisgICAgICAgIChQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIgIT0gbnVsbHB0cik7CisgICAgUEZOX3ZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIgdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiA9CisgICAgICAgIChQRk5fdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIgIT0gbnVsbHB0cik7CisKKyAgICB7CisgICAgICAgIFZrQWNxdWlyZVByb2ZpbGluZ0xvY2tJbmZvS0hSIGxvY2tfaW5mb3t9OworICAgICAgICBsb2NrX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ1FVSVJFX1BST0ZJTElOR19MT0NLX0lORk9fS0hSOworICAgICAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKGRldmljZSgpLCAmbG9ja19pbmZvKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmVzdWx0ID09IFZLX1NVQ0NFU1MpOworICAgIH0KKworICAgIHsKKyAgICAgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1Zl9pbmZvID0ge307CisgICAgICAgIGJ1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgICAgICBidWZfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgICAgICBidWZfaW5mby5zaXplID0gNDA5NjsKKyAgICAgICAgYnVmX2luZm8uc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgICAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVCdWZmZXIoZGV2aWNlKCksICZidWZfaW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtX3JlcXM7CisgICAgICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlKCksIGJ1ZmZlciwgJm1lbV9yZXFzKTsKKworICAgICAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBhbGxvY19pbmZvID0ge307CisgICAgICAgIGFsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IDQwOTY7CisgICAgICAgIFZrRGV2aWNlTWVtb3J5IG1lbTsKKyAgICAgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmYWxsb2NfaW5mbywgTlVMTCwgJm1lbSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIHZrOjpCaW5kQnVmZmVyTWVtb3J5KGRldmljZSgpLCBidWZmZXIsIG1lbSwgMCk7CisKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgICAgIHZrOjpDbWRCZWdpblF1ZXJ5KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDApOworCisgICAgICAgIC8vIFJlbGFzZSB3aGlsZSByZWNvcmRpbmcuCisgICAgICAgIHZrUmVsZWFzZVByb2ZpbGluZ0xvY2tLSFIoZGV2aWNlKCkpOworICAgICAgICB7CisgICAgICAgICAgICBWa0FjcXVpcmVQcm9maWxpbmdMb2NrSW5mb0tIUiBsb2NrX2luZm97fTsKKyAgICAgICAgICAgIGxvY2tfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfUFJPRklMSU5HX0xPQ0tfSU5GT19LSFI7CisgICAgICAgICAgICBWa1Jlc3VsdCByZXN1bHQgPSB2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKGRldmljZSgpLCAmbG9ja19pbmZvKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKHJlc3VsdCA9PSBWS19TVUNDRVNTKTsKKyAgICAgICAgfQorCisgICAgICAgIHZrOjpDbWRFbmRRdWVyeShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwKTsKKworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbzsKKyAgICAgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgc3VibWl0X2luZm8ucE5leHQgPSBOVUxMOworICAgICAgICBzdWJtaXRfaW5mby53YWl0U2VtYXBob3JlQ291bnQgPSAwOworICAgICAgICBzdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZXMgPSBOVUxMOworICAgICAgICBzdWJtaXRfaW5mby5wV2FpdERzdFN0YWdlTWFzayA9IE5VTEw7CisgICAgICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgICAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gTlVMTDsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrUXVldWVTdWJtaXQtcENvbW1hbmRCdWZmZXJzLTAzMjIwIik7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChxdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIHZrOjpRdWV1ZVdhaXRJZGxlKHF1ZXVlKTsKKworICAgICAgICB2azo6RGVzdHJveUJ1ZmZlcihkZXZpY2UoKSwgYnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIG1lbSwgTlVMTCk7CisgICAgfQorCisgICAgdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUihkZXZpY2UoKSk7CisKKyAgICB2azo6RGVzdHJveVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksIHF1ZXJ5X3Bvb2wsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFF1ZXJ5UGVyZm9ybWFuY2VJbmNvbXBsZXRlUGFzc2VzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IHRoYXQgd2UgZ2V0IGFuIGVycm9yIGlmIHdlIGRvbid0IHN1Ym1pdCBhIGNvbW1hbmQgYnVmZmVyIGZvciBlYWNoIHBhc3NlcyBiZWZvcmUgZ2V0dGluZyB0aGUgcmVzdWx0cy4iKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9QRVJGT1JNQU5DRV9RVUVSWV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfUEVSRk9STUFOQ0VfUVVFUllfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX1BFUkZPUk1BTkNFX1FVRVJZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIGZlYXR1cmVzMiA9IHt9OworICAgIGF1dG8gaG9zdFF1ZXJ5UmVzZXRGZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlSG9zdFF1ZXJ5UmVzZXRGZWF0dXJlc0VYVD4oKTsKKyAgICBhdXRvIHBlcmZvcm1hbmNlRmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVBlcmZvcm1hbmNlUXVlcnlGZWF0dXJlc0tIUj4oJmhvc3RRdWVyeVJlc2V0RmVhdHVyZXMpOworICAgIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmcGVyZm9ybWFuY2VGZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisgICAgaWYgKCFwZXJmb3JtYW5jZUZlYXR1cmVzLnBlcmZvcm1hbmNlQ291bnRlclF1ZXJ5UG9vbHMpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBQZXJmb3JtYW5jZSBxdWVyeSBwb29scyBhcmUgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWhvc3RRdWVyeVJlc2V0RmVhdHVyZXMuaG9zdFF1ZXJ5UmVzZXQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBNaXNzaW5nIGhvc3QgcXVlcnkgcmVzZXQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgcG9vbF9mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAmcGVyZm9ybWFuY2VGZWF0dXJlcywgcG9vbF9mbGFncykpOworICAgIFBGTl92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIKKyAgICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSID0KKyAgICAgICAgICAgIChQRk5fdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKAorICAgICAgICAgICAgICAgIGluc3RhbmNlKCksICJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5Q291bnRlcnNLSFIgIT0gbnVsbHB0cik7CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeVBhc3Nlc0tIUiB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKAorICAgICAgICAgICAgaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVBlcmZvcm1hbmNlUXVlcnlQYXNzZXNLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSICE9IG51bGxwdHIpOworCisgICAgYXV0byBxdWV1ZUZhbWlseVByb3BlcnRpZXMgPSBtX2RldmljZS0+cGh5KCkucXVldWVfcHJvcGVydGllcygpOworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseVByb3BlcnRpZXMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPFZrUGVyZm9ybWFuY2VDb3VudGVyS0hSPiBjb3VudGVyczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY291bnRlckluZGljZXM7CisgICAgdWludDMyX3QgblBhc3NlcyA9IDA7CisKKyAgICAvLyBGaW5kIGEgc2luZ2xlIGNvdW50ZXIgd2l0aCBWS19RVUVSWV9TQ09QRV9SRU5ERVJfUEFTU19LSFIgc2NvcGUuCisgICAgZm9yICh1aW50MzJfdCBpZHggPSAwOyBpZHggPCBxdWV1ZUZhbWlseVByb3BlcnRpZXMuc2l6ZSgpOyBpZHgrKykgeworICAgICAgICB1aW50MzJfdCBuQ291bnRlcnM7CisKKyAgICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKGdwdSgpLCBpZHgsICZuQ291bnRlcnMsIG51bGxwdHIsIG51bGxwdHIpOworICAgICAgICBpZiAobkNvdW50ZXJzID09IDApIGNvbnRpbnVlOworCisgICAgICAgIGNvdW50ZXJzLnJlc2l6ZShuQ291bnRlcnMpOworICAgICAgICBmb3IgKGF1dG8gJmMgOiBjb3VudGVycykgeworICAgICAgICAgICAgYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX0NPVU5URVJfS0hSOworICAgICAgICAgICAgYy5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UGVyZm9ybWFuY2VRdWVyeUNvdW50ZXJzS0hSKGdwdSgpLCBpZHgsICZuQ291bnRlcnMsICZjb3VudGVyc1swXSwgbnVsbHB0cik7CisgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXggPSBpZHg7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBjb3VudGVySWR4ID0gMDsgY291bnRlcklkeCA8IGNvdW50ZXJzLnNpemUoKTsgY291bnRlcklkeCsrKSBjb3VudGVySW5kaWNlcy5wdXNoX2JhY2soY291bnRlcklkeCk7CisKKyAgICAgICAgVmtRdWVyeVBvb2xQZXJmb3JtYW5jZUNyZWF0ZUluZm9LSFIgY3JlYXRlX2luZm97fTsKKyAgICAgICAgY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX1BFUkZPUk1BTkNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICAgICAgY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleCA9IGlkeDsKKyAgICAgICAgY3JlYXRlX2luZm8uY291bnRlckluZGV4Q291bnQgPSBjb3VudGVySW5kaWNlcy5zaXplKCk7CisgICAgICAgIGNyZWF0ZV9pbmZvLnBDb3VudGVySW5kaWNlcyA9ICZjb3VudGVySW5kaWNlc1swXTsKKworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQZXJmb3JtYW5jZVF1ZXJ5UGFzc2VzS0hSKGdwdSgpLCAmY3JlYXRlX2luZm8sICZuUGFzc2VzKTsKKworICAgICAgICBpZiAoblBhc3NlcyA8IDIpIHsKKyAgICAgICAgICAgIGNvdW50ZXJzLmNsZWFyKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoY291bnRlckluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBwcmludGYoIiVzIE5vIHF1ZXVlIHJlcG9ydGVkIGEgc2V0IG9mIGNvdW50ZXJzIHRoYXQgbmVlZHMgbW9yZSB0aGFuIG9uZSBwYXNzLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrUXVlcnlQb29sUGVyZm9ybWFuY2VDcmVhdGVJbmZvS0hSIHBlcmZfcXVlcnlfcG9vbF9jaXt9OworICAgIHBlcmZfcXVlcnlfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfUEVSRk9STUFOQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIHBlcmZfcXVlcnlfcG9vbF9jaS5xdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlJbmRleDsKKyAgICBwZXJmX3F1ZXJ5X3Bvb2xfY2kuY291bnRlckluZGV4Q291bnQgPSBjb3VudGVySW5kaWNlcy5zaXplKCk7CisgICAgcGVyZl9xdWVyeV9wb29sX2NpLnBDb3VudGVySW5kaWNlcyA9ICZjb3VudGVySW5kaWNlc1swXTsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jaXt9OworICAgIHF1ZXJ5X3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY2kucE5leHQgPSAmcGVyZl9xdWVyeV9wb29sX2NpOworICAgIHF1ZXJ5X3Bvb2xfY2kucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9LSFI7CisgICAgcXVlcnlfcG9vbF9jaS5xdWVyeUNvdW50ID0gMTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChkZXZpY2UoKSwgJnF1ZXJ5X3Bvb2xfY2ksIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKworICAgIFZrUXVldWUgcXVldWUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6R2V0RGV2aWNlUXVldWUoZGV2aWNlKCksIHF1ZXVlRmFtaWx5SW5kZXgsIDAsICZxdWV1ZSk7CisKKyAgICBQRk5fdmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiB2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSID0KKyAgICAgICAgKFBGTl92a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0FjcXVpcmVQcm9maWxpbmdMb2NrS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtBY3F1aXJlUHJvZmlsaW5nTG9ja0tIUiAhPSBudWxscHRyKTsKKyAgICBQRk5fdmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiB2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSID0KKyAgICAgICAgKFBGTl92a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtSZWxlYXNlUHJvZmlsaW5nTG9ja0tIUiAhPSBudWxscHRyKTsKKyAgICBQRk5fdmtSZXNldFF1ZXJ5UG9vbEVYVCBmcHZrUmVzZXRRdWVyeVBvb2xFWFQgPQorICAgICAgICAoUEZOX3ZrUmVzZXRRdWVyeVBvb2xFWFQpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrUmVzZXRRdWVyeVBvb2xFWFQiKTsKKworICAgIHsKKyAgICAgICAgVmtBY3F1aXJlUHJvZmlsaW5nTG9ja0luZm9LSFIgbG9ja19pbmZve307CisgICAgICAgIGxvY2tfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FDUVVJUkVfUFJPRklMSU5HX0xPQ0tfSU5GT19LSFI7CisgICAgICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrQWNxdWlyZVByb2ZpbGluZ0xvY2tLSFIoZGV2aWNlKCksICZsb2NrX2luZm8pOworICAgICAgICBBU1NFUlRfVFJVRShyZXN1bHQgPT0gVktfU1VDQ0VTUyk7CisgICAgfQorCisgICAgeworICAgICAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmX2luZm8gPSB7fTsKKyAgICAgICAgYnVmX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgICAgIGJ1Zl9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgICAgIGJ1Zl9pbmZvLnNpemUgPSA0MDk2OworICAgICAgICBidWZfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihkZXZpY2UoKSwgJmJ1Zl9pbmZvLCBOVUxMLCAmYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1fcmVxczsKKyAgICAgICAgdms6OkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UoKSwgYnVmZmVyLCAmbWVtX3JlcXMpOworCisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGFsbG9jX2luZm8gPSB7fTsKKyAgICAgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgICAgICBhbGxvY19pbmZvLmFsbG9jYXRpb25TaXplID0gNDA5NjsKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgICAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkoZGV2aWNlKCksICZhbGxvY19pbmZvLCBOVUxMLCAmbWVtKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAgICAgdms6OkJpbmRCdWZmZXJNZW1vcnkoZGV2aWNlKCksIGJ1ZmZlciwgbWVtLCAwKTsKKworICAgICAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29tbWFuZF9idWZmZXJfYmVnaW5faW5mb3t9OworICAgICAgICBjb21tYW5kX2J1ZmZlcl9iZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICAgICAgY29tbWFuZF9idWZmZXJfYmVnaW5faW5mby5mbGFncyA9IFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX1NJTVVMVEFORU9VU19VU0VfQklUOworCisgICAgICAgIGZwdmtSZXNldFF1ZXJ5UG9vbEVYVChtX2RldmljZS0+ZGV2aWNlKCksIHF1ZXJ5X3Bvb2wsIDAsIDApOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oJmNvbW1hbmRfYnVmZmVyX2JlZ2luX2luZm8pOworICAgICAgICB2azo6Q21kQmVnaW5RdWVyeShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAwKTsKKyAgICAgICAgdms6OkNtZEZpbGxCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLCAwLCA0MDk2LCAwKTsKKyAgICAgICAgdms6OkNtZEVuZFF1ZXJ5KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDApOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgICAgIC8vIEludmFsaWQgcGFzcyBpbmRleAorICAgICAgICB7CisgICAgICAgICAgICBWa1BlcmZvcm1hbmNlUXVlcnlTdWJtaXRJbmZvS0hSIHBlcmZfc3VibWl0X2luZm97fTsKKyAgICAgICAgICAgIHBlcmZfc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QRVJGT1JNQU5DRV9RVUVSWV9TVUJNSVRfSU5GT19LSFI7CisgICAgICAgICAgICBwZXJmX3N1Ym1pdF9pbmZvLmNvdW50ZXJQYXNzSW5kZXggPSBuUGFzc2VzOworICAgICAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZve307CisgICAgICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICAgICAgc3VibWl0X2luZm8ucE5leHQgPSAmcGVyZl9zdWJtaXRfaW5mbzsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgICAgICBzdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZXMgPSBOVUxMOworICAgICAgICAgICAgc3VibWl0X2luZm8ucFdhaXREc3RTdGFnZU1hc2sgPSBOVUxMOworICAgICAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgICAgICAgICAgc3VibWl0X2luZm8uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAwOworICAgICAgICAgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSBOVUxMOworCisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUi1jb3VudGVyUGFzc0luZGV4LTAzMjIxIik7CisgICAgICAgICAgICB2azo6UXVldWVTdWJtaXQocXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMZWF2ZSB0aGUgbGFzdCBwYXNzIG91dC4KKyAgICAgICAgZm9yICh1aW50MzJfdCBwYXNzSWR4ID0gMDsgcGFzc0lkeCA8IChuUGFzc2VzIC0gMSk7IHBhc3NJZHgrKykgeworICAgICAgICAgICAgVmtQZXJmb3JtYW5jZVF1ZXJ5U3VibWl0SW5mb0tIUiBwZXJmX3N1Ym1pdF9pbmZve307CisgICAgICAgICAgICBwZXJmX3N1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEVSRk9STUFOQ0VfUVVFUllfU1VCTUlUX0lORk9fS0hSOworICAgICAgICAgICAgcGVyZl9zdWJtaXRfaW5mby5jb3VudGVyUGFzc0luZGV4ID0gcGFzc0lkeDsKKyAgICAgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb3t9OworICAgICAgICAgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLnBOZXh0ID0gJnBlcmZfc3VibWl0X2luZm87CisgICAgICAgICAgICBzdWJtaXRfaW5mby53YWl0U2VtYXBob3JlQ291bnQgPSAwOworICAgICAgICAgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gTlVMTDsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gTlVMTDsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gTlVMTDsKKworICAgICAgICAgICAgdms6OlF1ZXVlU3VibWl0KHF1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICAgICAgfQorCisgICAgICAgIHZrOjpRdWV1ZVdhaXRJZGxlKHF1ZXVlKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUj4gcmVzdWx0czsKKyAgICAgICAgcmVzdWx0cy5yZXNpemUoY291bnRlckluZGljZXMuc2l6ZSgpKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrR2V0UXVlcnlQb29sUmVzdWx0cy1xdWVyeVR5cGUtMDMyMzEiKTsKKyAgICAgICAgdms6OkdldFF1ZXJ5UG9vbFJlc3VsdHMoZGV2aWNlKCksIHF1ZXJ5X3Bvb2wsIDAsIDEsIHNpemVvZihWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUikgKiByZXN1bHRzLnNpemUoKSwgJnJlc3VsdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUiksIFZLX1FVRVJZX1JFU1VMVF9XQUlUX0JJVCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIFZrUGVyZm9ybWFuY2VRdWVyeVN1Ym1pdEluZm9LSFIgcGVyZl9zdWJtaXRfaW5mb3t9OworICAgICAgICAgICAgcGVyZl9zdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BFUkZPUk1BTkNFX1FVRVJZX1NVQk1JVF9JTkZPX0tIUjsKKyAgICAgICAgICAgIHBlcmZfc3VibWl0X2luZm8uY291bnRlclBhc3NJbmRleCA9IG5QYXNzZXMgLSAxOworICAgICAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZve307CisgICAgICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICAgICAgc3VibWl0X2luZm8ucE5leHQgPSAmcGVyZl9zdWJtaXRfaW5mbzsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgICAgICBzdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZXMgPSBOVUxMOworICAgICAgICAgICAgc3VibWl0X2luZm8ucFdhaXREc3RTdGFnZU1hc2sgPSBOVUxMOworICAgICAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgICAgICAgICAgc3VibWl0X2luZm8uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAwOworICAgICAgICAgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSBOVUxMOworCisgICAgICAgICAgICB2azo6UXVldWVTdWJtaXQocXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgICAgICB9CisKKyAgICAgICAgdms6OlF1ZXVlV2FpdElkbGUocXVldWUpOworCisgICAgICAgIC8vIEludmFsaWQgc3RyaWRlCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIyOSIpOworICAgICAgICB2azo6R2V0UXVlcnlQb29sUmVzdWx0cyhkZXZpY2UoKSwgcXVlcnlfcG9vbCwgMCwgMSwgc2l6ZW9mKFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKSAqIHJlc3VsdHMuc2l6ZSgpLCAmcmVzdWx0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKSArIDQsIFZLX1FVRVJZX1JFU1VMVF9XQUlUX0JJVCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIC8vIEludmFsaWQgZmxhZ3MKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0dldFF1ZXJ5UG9vbFJlc3VsdHMtcXVlcnlUeXBlLTAzMjMwIik7CisgICAgICAgIHZrOjpHZXRRdWVyeVBvb2xSZXN1bHRzKGRldmljZSgpLCBxdWVyeV9wb29sLCAwLCAxLCBzaXplb2YoVmtQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIpICogcmVzdWx0cy5zaXplKCksICZyZXN1bHRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVmtQZXJmb3JtYW5jZUNvdW50ZXJSZXN1bHRLSFIpLCBWS19RVUVSWV9SRVNVTFRfV0lUSF9BVkFJTEFCSUxJVFlfQklUKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzMCIpOworICAgICAgICB2azo6R2V0UXVlcnlQb29sUmVzdWx0cyhkZXZpY2UoKSwgcXVlcnlfcG9vbCwgMCwgMSwgc2l6ZW9mKFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKSAqIHJlc3VsdHMuc2l6ZSgpLCAmcmVzdWx0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKSwgVktfUVVFUllfUkVTVUxUX1BBUlRJQUxfQklUKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtHZXRRdWVyeVBvb2xSZXN1bHRzLXF1ZXJ5VHlwZS0wMzIzMCIpOworICAgICAgICB2azo6R2V0UXVlcnlQb29sUmVzdWx0cyhkZXZpY2UoKSwgcXVlcnlfcG9vbCwgMCwgMSwgc2l6ZW9mKFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKSAqIHJlc3VsdHMuc2l6ZSgpLCAmcmVzdWx0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZrUGVyZm9ybWFuY2VDb3VudGVyUmVzdWx0S0hSKSwgVktfUVVFUllfUkVTVUxUXzY0X0JJVCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUKTsKKyAgICAgICAgdms6OkdldFF1ZXJ5UG9vbFJlc3VsdHMoZGV2aWNlKCksIHF1ZXJ5X3Bvb2wsIDAsIDEsIHNpemVvZihWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUikgKiByZXN1bHRzLnNpemUoKSwgJnJlc3VsdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWa1BlcmZvcm1hbmNlQ291bnRlclJlc3VsdEtIUiksIFZLX1FVRVJZX1JFU1VMVF9XQUlUX0JJVCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyKGRldmljZSgpLCBidWZmZXIsIG51bGxwdHIpOworICAgICAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgbWVtLCBOVUxMKTsKKyAgICB9CisKKyAgICB2a1JlbGVhc2VQcm9maWxpbmdMb2NrS0hSKGRldmljZSgpKTsKKworICAgIHZrOjpEZXN0cm95UXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgcXVlcnlfcG9vbCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUXVldWVTdWJtaXROb1RpbWVsaW5lU2VtYXBob3JlSW5mbykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlN1Ym1pdCBhIHF1ZXVlIHdpdGggYSB0aW1lbGluZSBzZW1hcGhvcmUgYnV0IG5vdCBhIFZrVGltZWxpbmVTZW1hcGhvcmVTdWJtaXRJbmZvS0hSLiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfVElNRUxJTkVfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9USU1FTElORV9TRU1BUEhPUkVfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9USU1FTElORV9TRU1BUEhPUkVfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisgICAgYXV0byB0aW1lbGluZWZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VUaW1lbGluZVNlbWFwaG9yZUZlYXR1cmVzS0hSPigpOworICAgIGF1dG8gZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFI+KCZ0aW1lbGluZWZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKyAgICBpZiAoIXRpbWVsaW5lZmVhdHVyZXMudGltZWxpbmVTZW1hcGhvcmUpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUaW1lbGluZSBzZW1hcGhvcmVzIGFyZSBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgVmtTZW1hcGhvcmVUeXBlQ3JlYXRlSW5mb0tIUiBzZW1hcGhvcmVfdHlwZV9jcmVhdGVfaW5mb3t9OworICAgIHNlbWFwaG9yZV90eXBlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX1RZUEVfQ1JFQVRFX0lORk9fS0hSOworICAgIHNlbWFwaG9yZV90eXBlX2NyZWF0ZV9pbmZvLnNlbWFwaG9yZVR5cGUgPSBWS19TRU1BUEhPUkVfVFlQRV9USU1FTElORV9LSFI7CisKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2VtYXBob3JlX2NyZWF0ZV9pbmZve307CisgICAgc2VtYXBob3JlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworICAgIHNlbWFwaG9yZV9jcmVhdGVfaW5mby5wTmV4dCA9ICZzZW1hcGhvcmVfdHlwZV9jcmVhdGVfaW5mbzsKKworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZSkpOworCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3RhZ2VGbGFncyA9IFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVDsKKyAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm9bMl0gPSB7fTsKKyAgICBzdWJtaXRfaW5mb1swXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvWzBdLmNvbW1hbmRCdWZmZXJDb3VudCA9IDA7CisgICAgc3VibWl0X2luZm9bMF0ucFdhaXREc3RTdGFnZU1hc2sgPSAmc3RhZ2VGbGFnczsKKyAgICBzdWJtaXRfaW5mb1swXS5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm9bMF0ucFNpZ25hbFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFdhaXRTZW1hcGhvcmVzLTAzMjM5Iik7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCBzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgVmtUaW1lbGluZVNlbWFwaG9yZVN1Ym1pdEluZm9LSFIgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZve307CisgICAgdWludDY0X3Qgc2lnbmFsVmFsdWUgPSAxOworICAgIHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1RJTUVMSU5FX1NFTUFQSE9SRV9TVUJNSVRfSU5GT19LSFI7CisgICAgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQgPSAxOworICAgIHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlVmFsdWVzID0gJnNpZ25hbFZhbHVlOworICAgIHN1Ym1pdF9pbmZvWzBdLnBOZXh0ID0gJnRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mbzsKKworICAgIHN1Ym1pdF9pbmZvWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm9bMV0uY29tbWFuZEJ1ZmZlckNvdW50ID0gMDsKKyAgICBzdWJtaXRfaW5mb1sxXS5wV2FpdERzdFN0YWdlTWFzayA9ICZzdGFnZUZsYWdzOworICAgIHN1Ym1pdF9pbmZvWzFdLndhaXRTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm9bMV0ucFdhaXRTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtTdWJtaXRJbmZvLXBXYWl0U2VtYXBob3Jlcy0wMzIzOSIpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMiwgc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBRdWV1ZVN1Ym1pdFRpbWVsaW5lU2VtYXBob3JlQmFkVmFsdWUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJTdWJtaXQgYSBxdWV1ZSB3aXRoIGEgdGltZWxpbmUgc2VtYXBob3JlIHVzaW5nIGEgd3JvbmcgcGF5bG9hZCB2YWx1ZS4iKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1RJTUVMSU5FX1NFTUFQSE9SRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfVElNRUxJTkVfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBub3Qgc3VwcG9ydGVkIGJ5IGRldmljZTsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19LSFJfVElNRUxJTkVfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworICAgIGF1dG8gdGltZWxpbmVmZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVGZWF0dXJlc0tIUj4oKTsKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmdGltZWxpbmVmZWF0dXJlcyk7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUihncHUoKSwgJmZlYXR1cmVzMik7CisgICAgaWYgKCF0aW1lbGluZWZlYXR1cmVzLnRpbWVsaW5lU2VtYXBob3JlKSB7CisgICAgICAgIHByaW50ZigiJXMgVGltZWxpbmUgc2VtYXBob3JlcyBhcmUgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzMktIUiAhPSBudWxscHRyKTsKKyAgICBhdXRvIHRpbWVsaW5lcHJvcGVydGllcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlVGltZWxpbmVTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSPigpOworICAgIGF1dG8gcHJvcDIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyS0hSPigmdGltZWxpbmVwcm9wZXJ0aWVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFIoZ3B1KCksICZwcm9wMik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBWa1NlbWFwaG9yZVR5cGVDcmVhdGVJbmZvS0hSIHNlbWFwaG9yZV90eXBlX2NyZWF0ZV9pbmZve307CisgICAgc2VtYXBob3JlX3R5cGVfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfVFlQRV9DUkVBVEVfSU5GT19LSFI7CisgICAgc2VtYXBob3JlX3R5cGVfY3JlYXRlX2luZm8uc2VtYXBob3JlVHlwZSA9IFZLX1NFTUFQSE9SRV9UWVBFX1RJTUVMSU5FX0tIUjsKKworICAgIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBzZW1hcGhvcmVfY3JlYXRlX2luZm97fTsKKyAgICBzZW1hcGhvcmVfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk87CisgICAgc2VtYXBob3JlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gJnNlbWFwaG9yZV90eXBlX2NyZWF0ZV9pbmZvOworCisgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpDcmVhdGVTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCAmc2VtYXBob3JlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmc2VtYXBob3JlKSk7CisKKyAgICBWa1RpbWVsaW5lU2VtYXBob3JlU3VibWl0SW5mb0tIUiB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8gPSB7fTsKKyAgICB1aW50NjRfdCBzaWduYWxWYWx1ZSA9IDE7CisgICAgdWludDY0X3Qgd2FpdFZhbHVlID0gMzsKKyAgICB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9USU1FTElORV9TRU1BUEhPUkVfU1VCTUlUX0lORk9fS0hSOworICAgIHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVWYWx1ZUNvdW50ID0gMTsKKyAgICB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZVZhbHVlcyA9ICZzaWduYWxWYWx1ZTsKKyAgICB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZVZhbHVlQ291bnQgPSAxOworICAgIHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZVZhbHVlcyA9ICZ3YWl0VmFsdWU7CisKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZUZsYWdzID0gVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklUOworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb1syXSA9IHt9OworICAgIHN1Ym1pdF9pbmZvWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm9bMF0ucE5leHQgPSAmdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvOworICAgIHN1Ym1pdF9pbmZvWzBdLnBXYWl0RHN0U3RhZ2VNYXNrID0gJnN0YWdlRmxhZ3M7CisgICAgc3VibWl0X2luZm9bMF0uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvWzBdLnBTaWduYWxTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKworICAgIHN1Ym1pdF9pbmZvWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm9bMV0ucE5leHQgPSAmdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvOworICAgIHN1Ym1pdF9pbmZvWzFdLnBXYWl0RHN0U3RhZ2VNYXNrID0gJnN0YWdlRmxhZ3M7CisgICAgc3VibWl0X2luZm9bMV0ud2FpdFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mb1sxXS5wV2FpdFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworCisgICAgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQgPSAwOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtTdWJtaXRJbmZvLXBOZXh0LTAzMjQxIik7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCBzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZVZhbHVlQ291bnQgPSAxOworICAgIHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mby53YWl0U2VtYXBob3JlVmFsdWVDb3VudCA9IDA7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrU3VibWl0SW5mby1wTmV4dC0wMzI0MCIpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMiwgc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlLCBudWxscHRyKTsKKworICAgIHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mby53YWl0U2VtYXBob3JlVmFsdWVDb3VudCA9IDE7CisgICAgc2VtYXBob3JlX3R5cGVfY3JlYXRlX2luZm8uaW5pdGlhbFZhbHVlID0gNTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZSkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNDIiKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsIHN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksIHNlbWFwaG9yZSwgbnVsbHB0cik7CisKKyAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdGVzdCB2aW9sYXRpb25zIG9mIG1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlCisgICAgaWYgKHRpbWVsaW5lcHJvcGVydGllcy5tYXhUaW1lbGluZVNlbWFwaG9yZVZhbHVlRGlmZmVyZW5jZSA8IFVJTlQ2NF9NQVgpIHsKKyAgICAgICAgc2VtYXBob3JlX3R5cGVfY3JlYXRlX2luZm8uaW5pdGlhbFZhbHVlID0gMDsKKworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZSkpOworCisgICAgICAgIHNpZ25hbFZhbHVlID0gdGltZWxpbmVwcm9wZXJ0aWVzLm1heFRpbWVsaW5lU2VtYXBob3JlVmFsdWVEaWZmZXJlbmNlICsgMTsKKyAgICAgICAgdGltZWxpbmVfc2VtYXBob3JlX3N1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVWYWx1ZXMgPSAmc2lnbmFsVmFsdWU7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1N1Ym1pdEluZm8tcFNpZ25hbFNlbWFwaG9yZXMtMDMyNDQiKTsKKyAgICAgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCBzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBpZiAoc2lnbmFsVmFsdWUgPCBVSU5UNjRfTUFYKSB7CisgICAgICAgICAgICB3YWl0VmFsdWUgPSBzaWduYWxWYWx1ZSArIDE7CisgICAgICAgICAgICBzaWduYWxWYWx1ZSA9IDE7CisKKyAgICAgICAgICAgIHRpbWVsaW5lX3NlbWFwaG9yZV9zdWJtaXRfaW5mby53YWl0U2VtYXBob3JlVmFsdWVDb3VudCA9IDE7CisgICAgICAgICAgICB0aW1lbGluZV9zZW1hcGhvcmVfc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVWYWx1ZXMgPSAmd2FpdFZhbHVlOworCisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrU3VibWl0SW5mby1wV2FpdFNlbWFwaG9yZXMtMDMyNDMiKTsKKyAgICAgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMiwgc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICB9CisKKyAgICAgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzZW1hcGhvcmUsIG51bGxwdHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19waXBlbGluZV9zaGFkZXIuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtsYXllcnRlc3RzX3BpcGVsaW5lX3NoYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5NmUxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrbGF5ZXJ0ZXN0c19waXBlbGluZV9zaGFkZXIuY3BwCkBAIC0wLDAgKzEsNjkwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5lQGdvb2dsZS5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjbm9ydGhyb3BAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKZXJlbXkgS25pYWdlciA8amVyZW15a0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBTaGFubm9uIE1jUGhlcnNvbiA8c2hhbm5vbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBKb2huIFp1bGF1ZiA8anp1bGF1ZkBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlICJjYXN0X3V0aWxzLmgiCisjaW5jbHVkZSAibGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5oIgorCitURVNUX0YoVmtMYXllclRlc3QsIFBTT1BvbHlnb25Nb2RlSW52YWxpZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gdXNlIGludmFsaWQgcG9seWdvbiBmaWxsIG1vZGVzLiIpOworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBkZXZpY2VfZmVhdHVyZXMgPSB7fTsKKyAgICBkZXZpY2VfZmVhdHVyZXMuZmlsbE1vZGVOb25Tb2xpZCA9IFZLX0ZBTFNFOworICAgIC8vIFRoZSBzYWNyaWZpY2lhbCBkZXZpY2Ugb2JqZWN0CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgmZGV2aWNlX2ZlYXR1cmVzKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvIHJzX2NpID0ge307CisgICAgcnNfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX0NSRUFURV9JTkZPOworICAgIHJzX2NpLnBOZXh0ID0gbnVsbHB0cjsKKyAgICByc19jaS5saW5lV2lkdGggPSAxLjBmOworICAgIHJzX2NpLnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID0gVktfVFJVRTsKKworICAgIGF1dG8gc2V0X3BvbHlnb25Nb2RlID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsgaGVscGVyLnJzX3N0YXRlX2NpXyA9IHJzX2NpOyB9OworCisgICAgLy8gU2V0IHBvbHlnb25Nb2RlIHRvIFBPSU5UIHdoaWxlIHRoZSBub24tc29saWQgZmlsbCBtb2RlIGZlYXR1cmUgaXMgZGlzYWJsZWQuCisgICAgLy8gSW50cm9kdWNlIGZhaWx1cmUgYnkgc2V0dGluZyB1bnN1cHBvcnRlZCBwb2x5Z29uIG1vZGUKKyAgICByc19jaS5wb2x5Z29uTW9kZSA9IFZLX1BPTFlHT05fTU9ERV9QT0lOVDsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9wb2x5Z29uTW9kZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb2x5Z29uTW9kZSBjYW5ub3QgYmUgVktfUE9MWUdPTl9NT0RFX1BPSU5UIG9yIFZLX1BPTFlHT05fTU9ERV9MSU5FIik7CisKKyAgICAvLyBTZXQgcG9seWdvbk1vZGUgdG8gTElORSB3aGlsZSB0aGUgbm9uLXNvbGlkIGZpbGwgbW9kZSBmZWF0dXJlIGlzIGRpc2FibGVkLgorICAgIC8vIEludHJvZHVjZSBmYWlsdXJlIGJ5IHNldHRpbmcgdW5zdXBwb3J0ZWQgcG9seWdvbiBtb2RlCisgICAgcnNfY2kucG9seWdvbk1vZGUgPSBWS19QT0xZR09OX01PREVfTElORTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9wb2x5Z29uTW9kZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb2x5Z29uTW9kZSBjYW5ub3QgYmUgVktfUE9MWUdPTl9NT0RFX1BPSU5UIG9yIFZLX1BPTFlHT05fTU9ERV9MSU5FIik7CisKKyAgICAvLyBTZXQgcG9seWdvbk1vZGUgdG8gRklMTF9SRUNUQU5HTEVfTlYgd2hpbGUgdGhlIGV4dGVuc2lvbiBpcyBub3QgZW5hYmxlZC4KKyAgICAvLyBJbnRyb2R1Y2UgZmFpbHVyZSBieSBzZXR0aW5nIHVuc3VwcG9ydGVkIHBvbHlnb24gbW9kZQorICAgIHJzX2NpLnBvbHlnb25Nb2RlID0gVktfUE9MWUdPTl9NT0RFX0ZJTExfUkVDVEFOR0xFX05WOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X3BvbHlnb25Nb2RlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8tcG9seWdvbk1vZGUtMDE0MTQiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBQaXBlbGluZU5vdEJvdW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUGFzcyBpbiBhbiBpbnZhbGlkIHBpcGVsaW5lIG9iamVjdCBoYW5kbGUgaW50byBhIFZ1bGthbiBBUEkgY2FsbC4iKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmUtcGFyYW1ldGVyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1BpcGVsaW5lIGJhZFBpcGVsaW5lID0gQ2FzdFRvSGFuZGxlPFZrUGlwZWxpbmUsIHVpbnRwdHJfdD4oMHhiYWFkYjFiZSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBiYWRQaXBlbGluZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBQaXBlbGluZVdyb25nQmluZFBvaW50R3JhcGhpY3MpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJCaW5kIGEgY29tcHV0ZSBwaXBlbGluZSBpbiB0aGUgZ3JhcGhpY3MgYmluZCBwb2ludCIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMDc3OSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lXyk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBQaXBlbGluZVdyb25nQmluZFBvaW50Q29tcHV0ZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkJpbmQgYSBncmFwaGljcyBwaXBlbGluZSBpbiB0aGUgY29tcHV0ZSBiaW5kIHBvaW50Iik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQmluZFBpcGVsaW5lLXBpcGVsaW5lQmluZFBvaW50LTAwNzgwIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgcGlwZS5waXBlbGluZV8pOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUGlwZWxpbmVXcm9uZ0JpbmRQb2ludFJheVRyYWNpbmcpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJCaW5kIGEgZ3JhcGhpY3MgcGlwZWxpbmUgaW4gdGhlIHJheS10cmFjaW5nIGJpbmQgcG9pbnQiKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX05WX1JBWV9UUkFDSU5HX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZEJpbmRQaXBlbGluZS1waXBlbGluZUJpbmRQb2ludC0wMjM5MiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGlmICghRW5hYmxlRGV2aWNlUHJvZmlsZUxheWVyKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBGYWlsZWQgdG8gZW5hYmxlIGRldmljZSBwcm9maWxlIGxheWVyLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX1JBWV9UUkFDSU5HX05WLCBwaXBlLnBpcGVsaW5lXyk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUJhZFZlcnRleEF0dHJpYnV0ZUZvcm1hdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdGhhdCBwaXBlbGluZSB2YWxpZGF0aW9uIGNhdGNoZXMgaW52YWxpZCB2ZXJ0ZXggYXR0cmlidXRlIGZvcm1hdHMiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gaW5wdXRfYmluZGluZzsKKyAgICBtZW1zZXQoJmlucHV0X2JpbmRpbmcsIDAsIHNpemVvZihpbnB1dF9iaW5kaW5nKSk7CisKKyAgICBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gaW5wdXRfYXR0cmliczsKKyAgICBtZW1zZXQoJmlucHV0X2F0dHJpYnMsIDAsIHNpemVvZihpbnB1dF9hdHRyaWJzKSk7CisKKyAgICAvLyBQaWNrIGEgcmVhbGx5IGJhZCBmb3JtYXQgZm9yIHRoaXMgcHVycG9zZSBhbmQgbWFrZSBzdXJlIGl0IHNob3VsZCBmYWlsCisgICAgaW5wdXRfYXR0cmlicy5mb3JtYXQgPSBWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLOworICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcHMgPSBtX2RldmljZS0+Zm9ybWF0X3Byb3BlcnRpZXMoaW5wdXRfYXR0cmlicy5mb3JtYXQpOworICAgIGlmICgoZm9ybWF0X3Byb3BzLmJ1ZmZlckZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfVkVSVEVYX0JVRkZFUl9CSVQpICE9IDApIHsKKyAgICAgICAgcHJpbnRmKCIlcyBGb3JtYXQgdW5zdWl0YWJsZSBmb3IgdGVzdDsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlucHV0X2F0dHJpYnMubG9jYXRpb24gPSAwOworCisgICAgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci52aV9jaV8ucFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgPSAmaW5wdXRfYmluZGluZzsKKyAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IDE7CisgICAgICAgIGhlbHBlci52aV9jaV8ucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9ICZpbnB1dF9hdHRyaWJzOworICAgICAgICBoZWxwZXIudmlfY2lfLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSAxOworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbi1mb3JtYXQtMDA2MjMiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBEaXNhYmxlZEluZGVwZW5kZW50QmxlbmQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiR2VuZXJhdGUgSU5ERVBFTkRFTlRfQkxFTkQgYnkgZGlzYWJsaW5nIGluZGVwZW5kZW50IGJsZW5kIGFuZCB0aGVuIHNwZWNpZnlpbmcgZGlmZmVyZW50IGJsZW5kIHN0YXRlcyBmb3IgdHdvICIKKyAgICAgICAgImF0dGFjaG1lbnRzIik7CisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGZlYXR1cmVzID0ge307CisgICAgZmVhdHVyZXMuaW5kZXBlbmRlbnRCbGVuZCA9IFZLX0ZBTFNFOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoJmZlYXR1cmVzKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiSW52YWxpZCBQaXBlbGluZSBDcmVhdGVJbmZvOiBJZiBpbmRlcGVuZGVudCBibGVuZCBmZWF0dXJlIG5vdCBlbmFibGVkLCBhbGwgZWxlbWVudHMgb2YgcEF0dGFjaG1lbnRzIG11c3QgYmUgaWRlbnRpY2FsIik7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRPYmogZGVzY3JpcHRvclNldChtX2RldmljZSk7CisgICAgZGVzY3JpcHRvclNldC5BcHBlbmREdW1teSgpOworICAgIGRlc2NyaXB0b3JTZXQuQ3JlYXRlVktEZXNjcmlwdG9yU2V0KG1fY29tbWFuZEJ1ZmZlcik7CisKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGVsaW5lKG1fZGV2aWNlKTsKKyAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHdpdGggdHdvIGNvbG9yIGF0dGFjaG1lbnRzCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGF0dGFjaG1lbnRzWzJdID0ge307CisgICAgYXR0YWNobWVudHNbMF0ubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgYXR0YWNobWVudHNbMV0uYXR0YWNobWVudCA9IDE7CisgICAgYXR0YWNobWVudHNbMV0ubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0ge307CisgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzOworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSAyOworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge307CisgICAgcnBjaS5zdWJwYXNzQ291bnQgPSAxOworICAgIHJwY2kucFN1YnBhc3NlcyA9ICZzdWJwYXNzOworICAgIHJwY2kuYXR0YWNobWVudENvdW50ID0gMjsKKworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaF9kZXNjWzJdID0ge307CisgICAgYXR0YWNoX2Rlc2NbMF0uZm9ybWF0ID0gVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOworICAgIGF0dGFjaF9kZXNjWzBdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgYXR0YWNoX2Rlc2NbMF0uaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgYXR0YWNoX2Rlc2NbMF0uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBhdHRhY2hfZGVzY1sxXS5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgYXR0YWNoX2Rlc2NbMV0uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2hfZGVzY1sxXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBhdHRhY2hfZGVzY1sxXS5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgcnBjaS5wQXR0YWNobWVudHMgPSBhdHRhY2hfZGVzYzsKKyAgICBycGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk87CisKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVycGFzczsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcmVuZGVycGFzcyk7CisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgcGlwZWxpbmUuQWRkU2hhZGVyKCZ2cyk7CisKKyAgICBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBhdHRfc3RhdGUxID0ge30sIGF0dF9zdGF0ZTIgPSB7fTsKKyAgICBhdHRfc3RhdGUxLmRzdEFscGhhQmxlbmRGYWN0b3IgPSBWS19CTEVORF9GQUNUT1JfQ09OU1RBTlRfQ09MT1I7CisgICAgYXR0X3N0YXRlMS5ibGVuZEVuYWJsZSA9IFZLX1RSVUU7CisgICAgYXR0X3N0YXRlMi5kc3RBbHBoYUJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0NPTE9SOworICAgIGF0dF9zdGF0ZTIuYmxlbmRFbmFibGUgPSBWS19GQUxTRTsKKyAgICBwaXBlbGluZS5BZGRDb2xvckF0dGFjaG1lbnQoMCwgYXR0X3N0YXRlMSk7CisgICAgcGlwZWxpbmUuQWRkQ29sb3JBdHRhY2htZW50KDEsIGF0dF9zdGF0ZTIpOworICAgIHBpcGVsaW5lLkNyZWF0ZVZLUGlwZWxpbmUoZGVzY3JpcHRvclNldC5HZXRQaXBlbGluZUxheW91dCgpLCByZW5kZXJwYXNzKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCByZW5kZXJwYXNzLCBOVUxMKTsKK30KKworLy8gSXMgdGhlIFBpcGVsaW5lIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhwZWN0YXRpb25zIG9mIHRoZSBSZW5kZXJwYXNzL3N1YnBhc3Nlcz8KK1RFU1RfRihWa0xheWVyVGVzdCwgUGlwZWxpbmVSZW5kZXJwYXNzQ29tcGF0aWJpbGl0eSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJDcmVhdGUgYSBncmFwaGljcyBwaXBlbGluZSB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgaXRzIGNvbnRhaW5lZCBSZW5kZXJwYXNzL3N1YnBhc3Nlcy4iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBhdHRfc3RhdGUxID0ge307CisgICAgYXR0X3N0YXRlMS5kc3RBbHBoYUJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0NPTE9SOworICAgIGF0dF9zdGF0ZTEuYmxlbmRFbmFibGUgPSBWS19UUlVFOworCisgICAgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5jYl9hdHRhY2htZW50c18gPSBhdHRfc3RhdGUxOworICAgICAgICBoZWxwZXIuZ3BfY2lfLnBDb2xvckJsZW5kU3RhdGUgPSBudWxscHRyOworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcmFzdGVyaXplckRpc2NhcmRFbmFibGUtMDA3NTMiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBQb2ludFNpemVGYWlsdXJlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgcGlwZWxpbmUgdXNpbmcgVE9QT0xPR1lfUE9JTlRfTElTVCBidXQgZG8gbm90IHNldCBQb2ludFNpemUgaW4gdmVydGV4IHNoYWRlci4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisKKyAgICAvLyBDcmVhdGUgVlMgZGVjbGFyaW5nIFBvaW50U2l6ZSBidXQgbm90IHdyaXRpbmcgdG8gaXQKKyAgICBjb25zdCBjaGFyIE5vUG9pbnRTaXplVmVydFNoYWRlcltdID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAidmVjMiB2ZXJ0aWNlc1szXTtcbiIKKyAgICAgICAgIm91dCBnbF9QZXJWZXJ0ZXhcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgICB2ZWM0IGdsX1Bvc2l0aW9uO1xuIgorICAgICAgICAiICAgIGZsb2F0IGdsX1BvaW50U2l6ZTtcbiIKKyAgICAgICAgIn07XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICAgdmVydGljZXNbMF0gPSB2ZWMyKC0xLjAsIC0xLjApO1xuIgorICAgICAgICAiICAgIHZlcnRpY2VzWzFdID0gdmVjMiggMS4wLCAtMS4wKTtcbiIKKyAgICAgICAgIiAgICB2ZXJ0aWNlc1syXSA9IHZlYzIoIDAuMCwgIDEuMCk7XG4iCisgICAgICAgICIgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHZlcnRpY2VzW2dsX1ZlcnRleEluZGV4ICUgM10sIDAuMCwgMS4wKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIE5vUG9pbnRTaXplVmVydFNoYWRlciwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworCisgICAgLy8gU2V0IElucHV0IEFzc2VtYmx5IHRvIFRPUE9MT0dZIFBPSU5UIExJU1QKKyAgICBhdXRvIHNldF9pbmZvID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgLy8gU2V0IElucHV0IEFzc2VtYmx5IHRvIFRPUE9MT0dZIFBPSU5UIExJU1QKKyAgICAgICAgaGVscGVyLmlhX2NpXy50b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUOworCisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgaGVscGVyLmZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJQaXBlbGluZSB0b3BvbG9neSBpcyBzZXQgdG8gUE9JTlRfTElTVCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRUb3BvbG9neSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkludmFsaWRUb3BvbG9neS4iKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZGV2aWNlRmVhdHVyZXMgPSB7fTsKKyAgICBkZXZpY2VGZWF0dXJlcy5nZW9tZXRyeVNoYWRlciA9IFZLX0ZBTFNFOworICAgIGRldmljZUZlYXR1cmVzLnRlc3NlbGxhdGlvblNoYWRlciA9IFZLX0ZBTFNFOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgmZGV2aWNlRmVhdHVyZXMpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0UG9pbnRTaXplU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworCisgICAgVmtQcmltaXRpdmVUb3BvbG9neSB0b3BvbG9neTsKKworICAgIGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuaWFfY2lfLnRvcG9sb2d5ID0gdG9wb2xvZ3k7CisgICAgICAgIGhlbHBlci5pYV9jaV8ucHJpbWl0aXZlUmVzdGFydEVuYWJsZSA9IFZLX1RSVUU7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgaGVscGVyLmZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIH07CisKKyAgICB0b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQyOCIpOworCisgICAgdG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9MSVNUOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQyOCIpOworCisgICAgdG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfTElTVDsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA0MjgiKTsKKworICAgIHRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVF9XSVRIX0FESkFDRU5DWTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RyaW5nPnsiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQyOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA0MjkifSk7CisKKyAgICB0b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9MSVNUX1dJVEhfQURKQUNFTkNZOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdHJpbmc+eyJWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXRvcG9sb2d5LTAwNDI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQyOSJ9KTsKKworICAgIHRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1Q7CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0cmluZz57IlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA0MjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvLXRvcG9sb2d5LTAwNDMwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXRvcG9sb2d5LTAwNzM3In0pOworCisgICAgdG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUF9XSVRIX0FESkFDRU5DWTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8tdG9wb2xvZ3ktMDA0MjkiKTsKKworICAgIHRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQX1dJVEhfQURKQUNFTkNZOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mby10b3BvbG9neS0wMDQyOSIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFBvaW50U2l6ZUdlb21TaGFkZXJGYWlsdXJlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkNyZWF0ZSBhIHBpcGVsaW5lIHVzaW5nIFRPUE9MT0dZX1BPSU5UX0xJU1QsIHNldCBQb2ludFNpemUgdmVydGV4IHNoYWRlciwgYnV0IG5vdCBpbiB0aGUgZmluYWwgZ2VvbWV0cnkgc3RhZ2UuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgaWYgKCghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkuZ2VvbWV0cnlTaGFkZXIpIHx8ICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkuc2hhZGVyVGVzc2VsbGF0aW9uQW5kR2VvbWV0cnlQb2ludFNpemUpKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIGdlb21ldHJ5IHNoYWRlciBmZWF0dXJlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKworICAgIC8vIENyZWF0ZSBWUyBkZWNsYXJpbmcgUG9pbnRTaXplIGFuZCB3cml0aW5nIHRvIGl0CisgICAgc3RhdGljIGNoYXIgY29uc3QgKmdzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAibGF5b3V0IChwb2ludHMpIGluO1xuIgorICAgICAgICAibGF5b3V0IChwb2ludHMpIG91dDtcbiIKKyAgICAgICAgImxheW91dCAobWF4X3ZlcnRpY2VzID0gMSkgb3V0O1xuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDEuMCwgMC41LCAwLjUsIDAuMCk7XG4iCisgICAgICAgICIgICBFbWl0VmVydGV4KCk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRQb2ludFNpemVTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZ3MobV9kZXZpY2UsIGdzU291cmNlLCBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklULCB0aGlzKTsKKworICAgIGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuaWFfY2lfLnRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BPSU5UX0xJU1Q7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZ3MuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGhlbHBlci5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJQaXBlbGluZSB0b3BvbG9neSBpcyBzZXQgdG8gUE9JTlRfTElTVCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEJ1aWx0aW5CbG9ja09yZGVyTWlzbWF0Y2hWc0dzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVXNlIGRpZmZlcmVudCBvcmRlciBvZiBnbF9Qb3NpdGlvbiBhbmQgZ2xfUG9pbnRTaXplIGluIGJ1aWx0aW4gYmxvY2sgaW50ZXJmYWNlIGJldHdlZW4gVlMgYW5kIEdTLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGlmICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkuZ2VvbWV0cnlTaGFkZXIpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBnZW9tZXRyeSBzaGFkZXJzOyBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworCisgICAgLy8gQ29tcGlsZWQgdXNpbmcgdGhlIEdMU0wgY29kZSBiZWxvdy4gR2xzbGFuZ1ZhbGlkYXRvciByZWFycmFuZ2VzIHRoZSBtZW1iZXJzLCBidXQgaGVyZSB0aGV5IGFyZSBrZXB0IGluIHRoZSBvcmRlciBwcm92aWRlZC4KKyAgICAvLyAjdmVyc2lvbiA0NTAKKyAgICAvLyBsYXlvdXQgKHBvaW50cykgaW47CisgICAgLy8gbGF5b3V0IChwb2ludHMpIG91dDsKKyAgICAvLyBsYXlvdXQgKG1heF92ZXJ0aWNlcyA9IDEpIG91dDsKKyAgICAvLyBpbiBnbF9QZXJWZXJ0ZXggeworICAgIC8vICAgICBmbG9hdCBnbF9Qb2ludFNpemU7CisgICAgLy8gICAgIHZlYzQgZ2xfUG9zaXRpb247CisgICAgLy8gfSBnbF9pbltdOworICAgIC8vIHZvaWQgbWFpbigpIHsKKyAgICAvLyAgICAgZ2xfUG9zaXRpb24gPSBnbF9pblswXS5nbF9Qb3NpdGlvbjsKKyAgICAvLyAgICAgZ2xfUG9pbnRTaXplID0gZ2xfaW5bMF0uZ2xfUG9pbnRTaXplOworICAgIC8vICAgICBFbWl0VmVydGV4KCk7CisgICAgLy8gfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZ3NTb3VyY2UgPSBSIigKKyAgICAgICAgICAgICAgIE9wQ2FwYWJpbGl0eSBHZW9tZXRyeQorICAgICAgICAgICAgICAgT3BDYXBhYmlsaXR5IEdlb21ldHJ5UG9pbnRTaXplCisgICAgICAgICAgJTEgPSBPcEV4dEluc3RJbXBvcnQgIkdMU0wuc3RkLjQ1MCIKKyAgICAgICAgICAgICAgIE9wTWVtb3J5TW9kZWwgTG9naWNhbCBHTFNMNDUwCisgICAgICAgICAgICAgICBPcEVudHJ5UG9pbnQgR2VvbWV0cnkgJW1haW4gIm1haW4iICVfICVnbF9pbgorICAgICAgICAgICAgICAgT3BFeGVjdXRpb25Nb2RlICVtYWluIElucHV0UG9pbnRzCisgICAgICAgICAgICAgICBPcEV4ZWN1dGlvbk1vZGUgJW1haW4gSW52b2NhdGlvbnMgMQorICAgICAgICAgICAgICAgT3BFeGVjdXRpb25Nb2RlICVtYWluIE91dHB1dFBvaW50cworICAgICAgICAgICAgICAgT3BFeGVjdXRpb25Nb2RlICVtYWluIE91dHB1dFZlcnRpY2VzIDEKKyAgICAgICAgICAgICAgIE9wU291cmNlIEdMU0wgNDUwCisgICAgICAgICAgICAgICBPcE1lbWJlckRlY29yYXRlICVnbF9QZXJWZXJ0ZXggMCBCdWlsdEluIFBvc2l0aW9uCisgICAgICAgICAgICAgICBPcE1lbWJlckRlY29yYXRlICVnbF9QZXJWZXJ0ZXggMSBCdWlsdEluIFBvaW50U2l6ZQorICAgICAgICAgICAgICAgT3BNZW1iZXJEZWNvcmF0ZSAlZ2xfUGVyVmVydGV4IDIgQnVpbHRJbiBDbGlwRGlzdGFuY2UKKyAgICAgICAgICAgICAgIE9wTWVtYmVyRGVjb3JhdGUgJWdsX1BlclZlcnRleCAzIEJ1aWx0SW4gQ3VsbERpc3RhbmNlCisgICAgICAgICAgICAgICBPcERlY29yYXRlICVnbF9QZXJWZXJ0ZXggQmxvY2sKKyAgICAgICAgICAgICAgIE9wTWVtYmVyRGVjb3JhdGUgJWdsX1BlclZlcnRleF8wIDAgQnVpbHRJbiBQb2ludFNpemUKKyAgICAgICAgICAgICAgIE9wTWVtYmVyRGVjb3JhdGUgJWdsX1BlclZlcnRleF8wIDEgQnVpbHRJbiBQb3NpdGlvbgorICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlZ2xfUGVyVmVydGV4XzAgQmxvY2sKKyAgICAgICAldm9pZCA9IE9wVHlwZVZvaWQKKyAgICAgICAgICAlMyA9IE9wVHlwZUZ1bmN0aW9uICV2b2lkCisgICAgICAlZmxvYXQgPSBPcFR5cGVGbG9hdCAzMgorICAgICV2NGZsb2F0ID0gT3BUeXBlVmVjdG9yICVmbG9hdCA0CisgICAgICAgJXVpbnQgPSBPcFR5cGVJbnQgMzIgMAorICAgICAldWludF8xID0gT3BDb25zdGFudCAldWludCAxCislX2Fycl9mbG9hdF91aW50XzEgPSBPcFR5cGVBcnJheSAlZmxvYXQgJXVpbnRfMQorJWdsX1BlclZlcnRleCA9IE9wVHlwZVN0cnVjdCAldjRmbG9hdCAlZmxvYXQgJV9hcnJfZmxvYXRfdWludF8xICVfYXJyX2Zsb2F0X3VpbnRfMQorJV9wdHJfT3V0cHV0X2dsX1BlclZlcnRleCA9IE9wVHlwZVBvaW50ZXIgT3V0cHV0ICVnbF9QZXJWZXJ0ZXgKKyAgICAgICAgICAlXyA9IE9wVmFyaWFibGUgJV9wdHJfT3V0cHV0X2dsX1BlclZlcnRleCBPdXRwdXQKKyAgICAgICAgJWludCA9IE9wVHlwZUludCAzMiAxCisgICAgICAlaW50XzAgPSBPcENvbnN0YW50ICVpbnQgMAorJWdsX1BlclZlcnRleF8wID0gT3BUeXBlU3RydWN0ICVmbG9hdCAldjRmbG9hdAorJV9hcnJfZ2xfUGVyVmVydGV4XzBfdWludF8xID0gT3BUeXBlQXJyYXkgJWdsX1BlclZlcnRleF8wICV1aW50XzEKKyVfcHRyX0lucHV0X19hcnJfZ2xfUGVyVmVydGV4XzBfdWludF8xID0gT3BUeXBlUG9pbnRlciBJbnB1dCAlX2Fycl9nbF9QZXJWZXJ0ZXhfMF91aW50XzEKKyAgICAgICVnbF9pbiA9IE9wVmFyaWFibGUgJV9wdHJfSW5wdXRfX2Fycl9nbF9QZXJWZXJ0ZXhfMF91aW50XzEgSW5wdXQKKyVfcHRyX0lucHV0X3Y0ZmxvYXQgPSBPcFR5cGVQb2ludGVyIElucHV0ICV2NGZsb2F0CislX3B0cl9PdXRwdXRfdjRmbG9hdCA9IE9wVHlwZVBvaW50ZXIgT3V0cHV0ICV2NGZsb2F0CisgICAgICAlaW50XzEgPSBPcENvbnN0YW50ICVpbnQgMQorJV9wdHJfSW5wdXRfZmxvYXQgPSBPcFR5cGVQb2ludGVyIElucHV0ICVmbG9hdAorJV9wdHJfT3V0cHV0X2Zsb2F0ID0gT3BUeXBlUG9pbnRlciBPdXRwdXQgJWZsb2F0CisgICAgICAgJW1haW4gPSBPcEZ1bmN0aW9uICV2b2lkIE5vbmUgJTMKKyAgICAgICAgICAlNSA9IE9wTGFiZWwKKyAgICAgICAgICUyMSA9IE9wQWNjZXNzQ2hhaW4gJV9wdHJfSW5wdXRfdjRmbG9hdCAlZ2xfaW4gJWludF8wICVpbnRfMQorICAgICAgICAgJTIyID0gT3BMb2FkICV2NGZsb2F0ICUyMQorICAgICAgICAgJTI0ID0gT3BBY2Nlc3NDaGFpbiAlX3B0cl9PdXRwdXRfdjRmbG9hdCAlXyAlaW50XzAKKyAgICAgICAgICAgICAgIE9wU3RvcmUgJTI0ICUyMgorICAgICAgICAgJTI3ID0gT3BBY2Nlc3NDaGFpbiAlX3B0cl9JbnB1dF9mbG9hdCAlZ2xfaW4gJWludF8wICVpbnRfMAorICAgICAgICAgJTI4ID0gT3BMb2FkICVmbG9hdCAlMjcKKyAgICAgICAgICUzMCA9IE9wQWNjZXNzQ2hhaW4gJV9wdHJfT3V0cHV0X2Zsb2F0ICVfICVpbnRfMQorICAgICAgICAgICAgICAgT3BTdG9yZSAlMzAgJTI4CisgICAgICAgICAgICAgICBPcEVtaXRWZXJ0ZXgKKyAgICAgICAgICAgICAgIE9wUmV0dXJuCisgICAgICAgICAgICAgICBPcEZ1bmN0aW9uRW5kCisgICAgICAgICkiOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRQb2ludFNpemVTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZ3MobV9kZXZpY2UsIGdzU291cmNlLCBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklULCB0aGlzKTsKKworICAgIGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuaWFfY2lfLnRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BPSU5UX0xJU1Q7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZ3MuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGhlbHBlci5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnVpbHRpbiB2YXJpYWJsZSBpbnNpZGUgYmxvY2sgZG9lc24ndCBtYXRjaCBiZXR3ZWVuIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQnVpbHRpbkJsb2NrU2l6ZU1pc21hdGNoVnNHcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlVzZSBkaWZmZXJlbnQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJ1aWx0aW4gYmxvY2sgaW50ZXJmYWNlIGJldHdlZW4gVlMgYW5kIEdTLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGlmICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkuZ2VvbWV0cnlTaGFkZXIpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBnZW9tZXRyeSBzaGFkZXJzOyBTa2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ3NTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJsYXlvdXQgKHBvaW50cykgaW47XG4iCisgICAgICAgICJsYXlvdXQgKHBvaW50cykgb3V0O1xuIgorICAgICAgICAibGF5b3V0IChtYXhfdmVydGljZXMgPSAxKSBvdXQ7XG4iCisgICAgICAgICJpbiBnbF9QZXJWZXJ0ZXhcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgICB2ZWM0IGdsX1Bvc2l0aW9uO1xuIgorICAgICAgICAiICAgIGZsb2F0IGdsX1BvaW50U2l6ZTtcbiIKKyAgICAgICAgIiAgICBmbG9hdCBnbF9DbGlwRGlzdGFuY2VbXTtcbiIKKyAgICAgICAgIn0gZ2xfaW5bXTtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgICAgZ2xfUG9zaXRpb24gPSBnbF9pblswXS5nbF9Qb3NpdGlvbjtcbiIKKyAgICAgICAgIiAgICBnbF9Qb2ludFNpemUgPSBnbF9pblswXS5nbF9Qb2ludFNpemU7XG4iCisgICAgICAgICIgICAgRW1pdFZlcnRleCgpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0UG9pbnRTaXplU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGdzKG1fZGV2aWNlLCBnc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCwgdGhpcyk7CisKKyAgICBhdXRvIHNldF9pbmZvID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLmlhX2NpXy50b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUOworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGdzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBoZWxwZXIuZnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBlbGVtZW50cyBpbnNpZGUgYnVpbHRpbiBibG9jayBkaWZmZXIgYmV0d2VlbiBzdGFnZXMiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUxheW91dEV4Y2VlZHNTZXRMaW1pdCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gY3JlYXRlIGEgcGlwZWxpbmUgbGF5b3V0IHVzaW5nIG1vcmUgdGhhbiB0aGUgcGh5c2ljYWwgbGltaXQgb2YgU2V0TGF5b3V0cy4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGxheW91dF9iaW5kaW5nID0ge307CisgICAgbGF5b3V0X2JpbmRpbmcuYmluZGluZyA9IDA7CisgICAgbGF5b3V0X2JpbmRpbmcuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgbGF5b3V0X2JpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBsYXlvdXRfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ7CisgICAgbGF5b3V0X2JpbmRpbmcucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKworICAgIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gZHNfbGF5b3V0X2NpID0ge307CisgICAgZHNfbGF5b3V0X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSAxOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSAmbGF5b3V0X2JpbmRpbmc7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRzX2xheW91dCA9IHt9OworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzX2xheW91dF9jaSwgTlVMTCwgJmRzX2xheW91dCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBEU0xzLCBvbmUgbGFyZ2VyIHRoYW4gdGhlIHBoeXNpY2FsIGxpbWl0CisgICAgY29uc3QgYXV0byBleGNlc3NfbGF5b3V0cyA9IDEgKyBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhCb3VuZERlc2NyaXB0b3JTZXRzOworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dD4gZHNsX2FycmF5KGV4Y2Vzc19sYXlvdXRzLCBkc19sYXlvdXQpOworCisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGlwZWxpbmVfbGF5b3V0X2NpID0ge307CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5wTmV4dCA9IE5VTEw7CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnNldExheW91dENvdW50ID0gZXhjZXNzX2xheW91dHM7CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnBTZXRMYXlvdXRzID0gZHNsX2FycmF5LmRhdGEoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tc2V0TGF5b3V0Q291bnQtMDAyODYiKTsKKyAgICBWa1BpcGVsaW5lTGF5b3V0IHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworICAgIGVyciA9IHZrOjpDcmVhdGVQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZwaXBlbGluZV9sYXlvdXRfY2ksIE5VTEwsICZwaXBlbGluZV9sYXlvdXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgLy8gQ2xlYW4gdXAKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc19sYXlvdXQsIE5VTEwpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lTGF5b3V0RXhjZXNzUGVyU3RhZ2VEZXNjcmlwdG9ycykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGVtcHQgdG8gY3JlYXRlIGEgcGlwZWxpbmUgbGF5b3V0IHdoZXJlIHRvdGFsIGRlc2NyaXB0b3JzIGV4Y2VlZCBwZXItc3RhZ2UgbGltaXRzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgdWludDMyX3QgbWF4X3VuaWZvcm1fYnVmZmVycyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzOworICAgIHVpbnQzMl90IG1heF9zdG9yYWdlX2J1ZmZlcnMgPSBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVyczsKKyAgICB1aW50MzJfdCBtYXhfc2FtcGxlZF9pbWFnZXMgPSBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVkSW1hZ2VzOworICAgIHVpbnQzMl90IG1heF9zdG9yYWdlX2ltYWdlcyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXM7CisgICAgdWludDMyX3QgbWF4X3NhbXBsZXJzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnM7CisgICAgdWludDMyX3QgbWF4X2NvbWJpbmVkID0gc3RkOjptaW4obWF4X3NhbXBsZXJzLCBtYXhfc2FtcGxlZF9pbWFnZXMpOworICAgIHVpbnQzMl90IG1heF9pbnB1dF9hdHRhY2htZW50cyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvcklucHV0QXR0YWNobWVudHM7CisKKyAgICB1aW50MzJfdCBzdW1fZHluX3VuaWZvcm1fYnVmZmVycyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyc0R5bmFtaWM7CisgICAgdWludDMyX3Qgc3VtX3VuaWZvcm1fYnVmZmVycyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heERlc2NyaXB0b3JTZXRVbmlmb3JtQnVmZmVyczsKKyAgICB1aW50MzJfdCBzdW1fZHluX3N0b3JhZ2VfYnVmZmVycyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyc0R5bmFtaWM7CisgICAgdWludDMyX3Qgc3VtX3N0b3JhZ2VfYnVmZmVycyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heERlc2NyaXB0b3JTZXRTdG9yYWdlQnVmZmVyczsKKyAgICB1aW50MzJfdCBzdW1fc2FtcGxlZF9pbWFnZXMgPSBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0U2FtcGxlZEltYWdlczsKKyAgICB1aW50MzJfdCBzdW1fc3RvcmFnZV9pbWFnZXMgPSBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0U3RvcmFnZUltYWdlczsKKyAgICB1aW50MzJfdCBzdW1fc2FtcGxlcnMgPSBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0U2FtcGxlcnM7CisgICAgdWludDMyX3Qgc3VtX2lucHV0X2F0dGFjaG1lbnRzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4RGVzY3JpcHRvclNldElucHV0QXR0YWNobWVudHM7CisKKyAgICAvLyBEZXZpY2VzIHRoYXQgcmVwb3J0IFVJTlQzMl9NQVggZm9yIGFueSBvZiB0aGVzZSBsaW1pdHMgY2FuJ3QgcnVuIHRoaXMgdGVzdAorICAgIGlmIChVSU5UMzJfTUFYID09IHN0ZDo6bWF4KHttYXhfdW5pZm9ybV9idWZmZXJzLCBtYXhfc3RvcmFnZV9idWZmZXJzLCBtYXhfc2FtcGxlZF9pbWFnZXMsIG1heF9zdG9yYWdlX2ltYWdlcywgbWF4X3NhbXBsZXJzfSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBQaHlzaWNhbCBkZXZpY2UgbGltaXRzIHJlcG9ydCBhcyAyXjMyLTEuIFNraXBwaW5nIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGRzbGIgPSB7fTsKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiBkc2xiX3ZlYyA9IHt9OworICAgIFZrRGVzY3JpcHRvclNldExheW91dCBkc19sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGRzX2xheW91dF9jaSA9IHt9OworICAgIGRzX2xheW91dF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBkc19sYXlvdXRfY2kucE5leHQgPSBOVUxMOworICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHBpcGVsaW5lX2xheW91dF9jaSA9IHt9OworICAgIHBpcGVsaW5lX2xheW91dF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2kucE5leHQgPSBOVUxMOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5zZXRMYXlvdXRDb3VudCA9IDE7CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnBTZXRMYXlvdXRzID0gJmRzX2xheW91dDsKKyAgICBWa1BpcGVsaW5lTGF5b3V0IHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworCisgICAgLy8gVlUgMGZlMDAyM2UgLSB0b28gbWFueSBzYW1wbGVyIHR5cGUgZGVzY3JpcHRvcnMgaW4gZnJhZ21lbnQgc3RhZ2UKKyAgICBkc2xiX3ZlYy5jbGVhcigpOworICAgIGRzbGIuYmluZGluZyA9IDA7CisgICAgZHNsYi5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOworICAgIGRzbGIuZGVzY3JpcHRvckNvdW50ID0gbWF4X3NhbXBsZXJzOworICAgIGRzbGIuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9BTExfR1JBUEhJQ1M7CisgICAgZHNsYi5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAxOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IG1heF9jb21iaW5lZDsKKyAgICBkc2xiLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSBkc2xiX3ZlYy5zaXplKCk7CisgICAgZHNfbGF5b3V0X2NpLnBCaW5kaW5ncyA9IGRzbGJfdmVjLmRhdGEoKTsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZkc19sYXlvdXRfY2ksIE5VTEwsICZkc19sYXlvdXQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjg3Iik7CisgICAgaWYgKChtYXhfc2FtcGxlcnMgKyBtYXhfY29tYmluZWQpID4gc3VtX3NhbXBsZXJzKSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjc3Iik7ICAvLyBleHBlY3QgYWxsLXN0YWdlcyBzdW0gdG9vCisgICAgfQorICAgIGlmIChtYXhfY29tYmluZWQgPiBzdW1fc2FtcGxlZF9pbWFnZXMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODIiKTsgIC8vIGV4cGVjdCBhbGwtc3RhZ2VzIHN1bSB0b28KKyAgICB9CisgICAgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIHBpcGVsaW5lX2xheW91dCwgTlVMTCk7ICAvLyBVbm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgaWYgdGVzdCBwYXNzZWQKKyAgICBwaXBlbGluZV9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc19sYXlvdXQsIE5VTEwpOworCisgICAgLy8gVlUgMGZlMDAyNDAgLSB0b28gbWFueSB1bmlmb3JtIGJ1ZmZlciB0eXBlIGRlc2NyaXB0b3JzIGluIHZlcnRleCBzdGFnZQorICAgIGRzbGJfdmVjLmNsZWFyKCk7CisgICAgZHNsYi5iaW5kaW5nID0gMDsKKyAgICBkc2xiLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRzbGIuZGVzY3JpcHRvckNvdW50ID0gbWF4X3VuaWZvcm1fYnVmZmVycyArIDE7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQgfCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAxOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzsKKyAgICBkc2xiLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI4OCIpOworICAgIGlmIChkc2xiLmRlc2NyaXB0b3JDb3VudCA+IHN1bV91bmlmb3JtX2J1ZmZlcnMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzgiKTsgIC8vIGV4cGVjdCBhbGwtc3RhZ2VzIHN1bSB0b28KKyAgICB9CisgICAgaWYgKGRzbGIuZGVzY3JpcHRvckNvdW50ID4gc3VtX2R5bl91bmlmb3JtX2J1ZmZlcnMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzkiKTsgIC8vIGV4cGVjdCBhbGwtc3RhZ2VzIHN1bSB0b28KKyAgICB9CisgICAgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIHBpcGVsaW5lX2xheW91dCwgTlVMTCk7ICAvLyBVbm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgaWYgdGVzdCBwYXNzZWQKKyAgICBwaXBlbGluZV9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc19sYXlvdXQsIE5VTEwpOworCisgICAgLy8gVlUgMGZlMDAyNDIgLSB0b28gbWFueSBzdG9yYWdlIGJ1ZmZlciB0eXBlIGRlc2NyaXB0b3JzIGluIGNvbXB1dGUgc3RhZ2UKKyAgICBkc2xiX3ZlYy5jbGVhcigpOworICAgIGRzbGIuYmluZGluZyA9IDA7CisgICAgZHNsYi5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IG1heF9zdG9yYWdlX2J1ZmZlcnMgKyAxOworICAgIGRzbGIuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9BTEw7CisgICAgZHNsYl92ZWMucHVzaF9iYWNrKGRzbGIpOworICAgIGRzbGIuYmluZGluZyA9IDE7CisgICAgZHNsYi5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAyOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSBkc2xiX3ZlYy5zaXplKCk7CisgICAgZHNfbGF5b3V0X2NpLnBCaW5kaW5ncyA9IGRzbGJfdmVjLmRhdGEoKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZkc19sYXlvdXRfY2ksIE5VTEwsICZkc19sYXlvdXQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjg5Iik7CisgICAgaWYgKGRzbGIuZGVzY3JpcHRvckNvdW50ID4gc3VtX2R5bl9zdG9yYWdlX2J1ZmZlcnMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODEiKTsgIC8vIGV4cGVjdCBhbGwtc3RhZ2VzIHN1bSB0b28KKyAgICB9CisgICAgaWYgKGRzbGJfdmVjWzBdLmRlc2NyaXB0b3JDb3VudCArIGRzbGJfdmVjWzJdLmRlc2NyaXB0b3JDb3VudCA+IHN1bV9zdG9yYWdlX2J1ZmZlcnMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2ODAiKTsgIC8vIGV4cGVjdCBhbGwtc3RhZ2VzIHN1bSB0b28KKyAgICB9CisgICAgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIHBpcGVsaW5lX2xheW91dCwgTlVMTCk7ICAvLyBVbm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgaWYgdGVzdCBwYXNzZWQKKyAgICBwaXBlbGluZV9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc19sYXlvdXQsIE5VTEwpOworCisgICAgLy8gVlUgMGZlMDAyNDQgLSB0b28gbWFueSBzYW1wbGVkIGltYWdlIHR5cGUgZGVzY3JpcHRvcnMgaW4gbXVsdGlwbGUgc3RhZ2VzCisgICAgZHNsYl92ZWMuY2xlYXIoKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAwOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IG1heF9zYW1wbGVkX2ltYWdlczsKKyAgICBkc2xiLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCB8IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgZHNsYl92ZWMucHVzaF9iYWNrKGRzbGIpOworICAgIGRzbGIuYmluZGluZyA9IDE7CisgICAgZHNsYi5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUjsKKyAgICBkc2xiLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfQUxMX0dSQVBISUNTOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAyOworICAgIGRzbGIuZGVzY3JpcHRvckNvdW50ID0gbWF4X2NvbWJpbmVkOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI5MCIpOworICAgIGlmIChtYXhfY29tYmluZWQgKyAyICogbWF4X3NhbXBsZWRfaW1hZ2VzID4gc3VtX3NhbXBsZWRfaW1hZ2VzKSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjgyIik7ICAvLyBleHBlY3QgYWxsLXN0YWdlcyBzdW0gdG9vCisgICAgfQorICAgIGlmIChtYXhfY29tYmluZWQgPiBzdW1fc2FtcGxlcnMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzciKTsgIC8vIGV4cGVjdCBhbGwtc3RhZ2VzIHN1bSB0b28KKyAgICB9CisgICAgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIHBpcGVsaW5lX2xheW91dCwgTlVMTCk7ICAvLyBVbm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgaWYgdGVzdCBwYXNzZWQKKyAgICBwaXBlbGluZV9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc19sYXlvdXQsIE5VTEwpOworCisgICAgLy8gVlUgMGZlMDAyNDYgLSB0b28gbWFueSBzdG9yYWdlIGltYWdlIHR5cGUgZGVzY3JpcHRvcnMgaW4gZnJhZ21lbnQgc3RhZ2UKKyAgICBkc2xiX3ZlYy5jbGVhcigpOworICAgIGRzbGIuYmluZGluZyA9IDA7CisgICAgZHNsYi5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFOworICAgIGRzbGIuZGVzY3JpcHRvckNvdW50ID0gMSArIChtYXhfc3RvcmFnZV9pbWFnZXMgLyAyKTsKKyAgICBkc2xiLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAxOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQgfCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUIHwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSBkc2xiX3ZlYy5zaXplKCk7CisgICAgZHNfbGF5b3V0X2NpLnBCaW5kaW5ncyA9IGRzbGJfdmVjLmRhdGEoKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZkc19sYXlvdXRfY2ksIE5VTEwsICZkc19sYXlvdXQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjkxIik7CisgICAgaWYgKDIgKiBkc2xiLmRlc2NyaXB0b3JDb3VudCA+IHN1bV9zdG9yYWdlX2ltYWdlcykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MyIpOyAgLy8gZXhwZWN0IGFsbC1zdGFnZXMgc3VtIHRvbworICAgIH0KKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgcGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsgIC8vIFVubmVjZXNzYXJ5IGJ1dCBoYXJtbGVzcyBpZiB0ZXN0IHBhc3NlZAorICAgIHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGRzX2xheW91dCwgTlVMTCk7CisKKyAgICAvLyBWVSAwZmUwMGQxOCAtIHRvbyBtYW55IGlucHV0IGF0dGFjaG1lbnRzIGluIGZyYWdtZW50IHN0YWdlCisgICAgZHNsYl92ZWMuY2xlYXIoKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAwOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVDsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IDEgKyBtYXhfaW5wdXRfYXR0YWNobWVudHM7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3NiIpOworICAgIGlmIChkc2xiLmRlc2NyaXB0b3JDb3VudCA+IHN1bV9pbnB1dF9hdHRhY2htZW50cykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4NCIpOyAgLy8gZXhwZWN0IGFsbC1zdGFnZXMgc3VtIHRvbworICAgIH0KKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgcGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsgIC8vIFVubmVjZXNzYXJ5IGJ1dCBoYXJtbGVzcyBpZiB0ZXN0IHBhc3NlZAorICAgIHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGRzX2xheW91dCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVMYXlvdXRFeGNlc3NEZXNjcmlwdG9yc092ZXJhbGwpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIGNyZWF0ZSBhIHBpcGVsaW5lIGxheW91dCB3aGVyZSB0b3RhbCBkZXNjcmlwdG9ycyBleGNlZWQgbGltaXRzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgdWludDMyX3QgbWF4X3VuaWZvcm1fYnVmZmVycyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclVuaWZvcm1CdWZmZXJzOworICAgIHVpbnQzMl90IG1heF9zdG9yYWdlX2J1ZmZlcnMgPSBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVyczsKKyAgICB1aW50MzJfdCBtYXhfc2FtcGxlZF9pbWFnZXMgPSBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhQZXJTdGFnZURlc2NyaXB0b3JTYW1wbGVkSW1hZ2VzOworICAgIHVpbnQzMl90IG1heF9zdG9yYWdlX2ltYWdlcyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VJbWFnZXM7CisgICAgdWludDMyX3QgbWF4X3NhbXBsZXJzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnM7CisgICAgdWludDMyX3QgbWF4X2lucHV0X2F0dGFjaG1lbnRzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5wdXRBdHRhY2htZW50czsKKworICAgIHVpbnQzMl90IHN1bV9keW5fdW5pZm9ybV9idWZmZXJzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzRHluYW1pYzsKKyAgICB1aW50MzJfdCBzdW1fdW5pZm9ybV9idWZmZXJzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4RGVzY3JpcHRvclNldFVuaWZvcm1CdWZmZXJzOworICAgIHVpbnQzMl90IHN1bV9keW5fc3RvcmFnZV9idWZmZXJzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzRHluYW1pYzsKKyAgICB1aW50MzJfdCBzdW1fc3RvcmFnZV9idWZmZXJzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4RGVzY3JpcHRvclNldFN0b3JhZ2VCdWZmZXJzOworICAgIHVpbnQzMl90IHN1bV9zYW1wbGVkX2ltYWdlcyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzOworICAgIHVpbnQzMl90IHN1bV9zdG9yYWdlX2ltYWdlcyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heERlc2NyaXB0b3JTZXRTdG9yYWdlSW1hZ2VzOworICAgIHVpbnQzMl90IHN1bV9zYW1wbGVycyA9IG1fZGV2aWNlLT5waHkoKS5wcm9wZXJ0aWVzKCkubGltaXRzLm1heERlc2NyaXB0b3JTZXRTYW1wbGVyczsKKyAgICB1aW50MzJfdCBzdW1faW5wdXRfYXR0YWNobWVudHMgPSBtX2RldmljZS0+cGh5KCkucHJvcGVydGllcygpLmxpbWl0cy5tYXhEZXNjcmlwdG9yU2V0SW5wdXRBdHRhY2htZW50czsKKworICAgIC8vIERldmljZXMgdGhhdCByZXBvcnQgVUlOVDMyX01BWCBmb3IgYW55IG9mIHRoZXNlIGxpbWl0cyBjYW4ndCBydW4gdGhpcyB0ZXN0CisgICAgaWYgKFVJTlQzMl9NQVggPT0gc3RkOjptYXgoe3N1bV9keW5fdW5pZm9ybV9idWZmZXJzLCBzdW1fdW5pZm9ybV9idWZmZXJzLCBzdW1fZHluX3N0b3JhZ2VfYnVmZmVycywgc3VtX3N0b3JhZ2VfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3NhbXBsZWRfaW1hZ2VzLCBzdW1fc3RvcmFnZV9pbWFnZXMsIHN1bV9zYW1wbGVycywgc3VtX2lucHV0X2F0dGFjaG1lbnRzfSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBQaHlzaWNhbCBkZXZpY2UgbGltaXRzIHJlcG9ydCBhcyAyXjMyLTEuIFNraXBwaW5nIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGRzbGIgPSB7fTsKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiBkc2xiX3ZlYyA9IHt9OworICAgIFZrRGVzY3JpcHRvclNldExheW91dCBkc19sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGRzX2xheW91dF9jaSA9IHt9OworICAgIGRzX2xheW91dF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBkc19sYXlvdXRfY2kucE5leHQgPSBOVUxMOworICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHBpcGVsaW5lX2xheW91dF9jaSA9IHt9OworICAgIHBpcGVsaW5lX2xheW91dF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2kucE5leHQgPSBOVUxMOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5zZXRMYXlvdXRDb3VudCA9IDE7CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnBTZXRMYXlvdXRzID0gJmRzX2xheW91dDsKKyAgICBWa1BpcGVsaW5lTGF5b3V0IHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworCisgICAgLy8gVlUgMGZlMDBkMWEgLSB0b28gbWFueSBzYW1wbGVyIHR5cGUgZGVzY3JpcHRvcnMgb3ZlcmFsbAorICAgIGRzbGJfdmVjLmNsZWFyKCk7CisgICAgZHNsYi5iaW5kaW5nID0gMDsKKyAgICBkc2xiLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI7CisgICAgZHNsYi5kZXNjcmlwdG9yQ291bnQgPSBzdW1fc2FtcGxlcnMgLyAyOworICAgIGRzbGIuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOworICAgIGRzbGIucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisgICAgZHNsYi5iaW5kaW5nID0gMTsKKyAgICBkc2xiLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVI7CisgICAgZHNsYi5kZXNjcmlwdG9yQ291bnQgPSBzdW1fc2FtcGxlcnMgLSBkc2xiLmRlc2NyaXB0b3JDb3VudCArIDE7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3NyIpOworICAgIGlmIChkc2xiLmRlc2NyaXB0b3JDb3VudCA+IG1heF9zYW1wbGVycykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjg3Iik7ICAvLyBFeHBlY3QgbWF4LXBlci1zdGFnZSBzYW1wbGVycyBleGNlZWRzIGxpbWl0cworICAgIH0KKyAgICBpZiAoZHNsYi5kZXNjcmlwdG9yQ291bnQgPiBzdW1fc2FtcGxlZF9pbWFnZXMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MiIpOyAgLy8gRXhwZWN0IG1heCBvdmVyYWxsIHNhbXBsZWQgaW1hZ2UgY291bnQgZXhjZWVkcyBsaW1pdHMKKyAgICB9CisgICAgaWYgKGRzbGIuZGVzY3JpcHRvckNvdW50ID4gbWF4X3NhbXBsZWRfaW1hZ2VzKSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyOTAiKTsgIC8vIEV4cGVjdCBtYXggcGVyLXN0YWdlIHNhbXBsZWQgaW1hZ2UgY291bnQgZXhjZWVkcyBsaW1pdHMKKyAgICB9CisgICAgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIHBpcGVsaW5lX2xheW91dCwgTlVMTCk7ICAvLyBVbm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgaWYgdGVzdCBwYXNzZWQKKyAgICBwaXBlbGluZV9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc19sYXlvdXQsIE5VTEwpOworCisgICAgLy8gVlUgMGZlMDBkMWMgLSB0b28gbWFueSB1bmlmb3JtIGJ1ZmZlciB0eXBlIGRlc2NyaXB0b3JzIG92ZXJhbGwKKyAgICBkc2xiX3ZlYy5jbGVhcigpOworICAgIGRzbGIuYmluZGluZyA9IDA7CisgICAgZHNsYi5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IHN1bV91bmlmb3JtX2J1ZmZlcnMgKyAxOworICAgIGRzbGIuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUIHwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBkc2xiLnBJbW11dGFibGVTYW1wbGVycyA9IE5VTEw7CisgICAgZHNsYl92ZWMucHVzaF9iYWNrKGRzbGIpOworCisgICAgZHNfbGF5b3V0X2NpLmJpbmRpbmdDb3VudCA9IGRzbGJfdmVjLnNpemUoKTsKKyAgICBkc19sYXlvdXRfY2kucEJpbmRpbmdzID0gZHNsYl92ZWMuZGF0YSgpOworICAgIGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzX2xheW91dF9jaSwgTlVMTCwgJmRzX2xheW91dCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDE2NzgiKTsKKyAgICBpZiAoZHNsYi5kZXNjcmlwdG9yQ291bnQgPiBtYXhfdW5pZm9ybV9idWZmZXJzKSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAwMjg4Iik7ICAvLyBleHBlY3QgbWF4LXBlci1zdGFnZSB0b28KKyAgICB9CisgICAgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIHBpcGVsaW5lX2xheW91dCwgTlVMTCk7ICAvLyBVbm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgaWYgdGVzdCBwYXNzZWQKKyAgICBwaXBlbGluZV9sYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc19sYXlvdXQsIE5VTEwpOworCisgICAgLy8gVlUgMGZlMDBkMWUgLSB0b28gbWFueSBkeW5hbWljIHVuaWZvcm0gYnVmZmVyIHR5cGUgZGVzY3JpcHRvcnMgb3ZlcmFsbAorICAgIGRzbGJfdmVjLmNsZWFyKCk7CisgICAgZHNsYi5iaW5kaW5nID0gMDsKKyAgICBkc2xiLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM7CisgICAgZHNsYi5kZXNjcmlwdG9yQ291bnQgPSBzdW1fZHluX3VuaWZvcm1fYnVmZmVycyArIDE7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQgfCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworICAgIGRzbGIucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3OSIpOworICAgIGlmIChkc2xiLmRlc2NyaXB0b3JDb3VudCA+IG1heF91bmlmb3JtX2J1ZmZlcnMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyODgiKTsgIC8vIGV4cGVjdCBtYXgtcGVyLXN0YWdlIHRvbworICAgIH0KKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgcGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsgIC8vIFVubmVjZXNzYXJ5IGJ1dCBoYXJtbGVzcyBpZiB0ZXN0IHBhc3NlZAorICAgIHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGRzX2xheW91dCwgTlVMTCk7CisKKyAgICAvLyBWVSAwZmUwMGQyMCAtIHRvbyBtYW55IHN0b3JhZ2UgYnVmZmVyIHR5cGUgZGVzY3JpcHRvcnMgb3ZlcmFsbAorICAgIGRzbGJfdmVjLmNsZWFyKCk7CisgICAgZHNsYi5iaW5kaW5nID0gMDsKKyAgICBkc2xiLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOworICAgIGRzbGIuZGVzY3JpcHRvckNvdW50ID0gc3VtX3N0b3JhZ2VfYnVmZmVycyArIDE7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQgfCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworICAgIGRzbGIucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MCIpOworICAgIGlmIChkc2xiLmRlc2NyaXB0b3JDb3VudCA+IG1heF9zdG9yYWdlX2J1ZmZlcnMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyODkiKTsgIC8vIGV4cGVjdCBtYXgtcGVyLXN0YWdlIHRvbworICAgIH0KKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgcGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsgIC8vIFVubmVjZXNzYXJ5IGJ1dCBoYXJtbGVzcyBpZiB0ZXN0IHBhc3NlZAorICAgIHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGRzX2xheW91dCwgTlVMTCk7CisKKyAgICAvLyBWVSAwZmUwMGQyMiAtIHRvbyBtYW55IGR5bmFtaWMgc3RvcmFnZSBidWZmZXIgdHlwZSBkZXNjcmlwdG9ycyBvdmVyYWxsCisgICAgZHNsYl92ZWMuY2xlYXIoKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAwOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IHN1bV9keW5fc3RvcmFnZV9idWZmZXJzICsgMTsKKyAgICBkc2xiLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCB8IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgZHNsYi5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKworICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSBkc2xiX3ZlYy5zaXplKCk7CisgICAgZHNfbGF5b3V0X2NpLnBCaW5kaW5ncyA9IGRzbGJfdmVjLmRhdGEoKTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZkc19sYXlvdXRfY2ksIE5VTEwsICZkc19sYXlvdXQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLXBTZXRMYXlvdXRzLTAxNjgxIik7CisgICAgaWYgKGRzbGIuZGVzY3JpcHRvckNvdW50ID4gbWF4X3N0b3JhZ2VfYnVmZmVycykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI4OSIpOyAgLy8gZXhwZWN0IG1heC1wZXItc3RhZ2UgdG9vCisgICAgfQorICAgIGVyciA9IHZrOjpDcmVhdGVQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZwaXBlbGluZV9sYXlvdXRfY2ksIE5VTEwsICZwaXBlbGluZV9sYXlvdXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBwaXBlbGluZV9sYXlvdXQsIE5VTEwpOyAgLy8gVW5uZWNlc3NhcnkgYnV0IGhhcm1sZXNzIGlmIHRlc3QgcGFzc2VkCisgICAgcGlwZWxpbmVfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfbGF5b3V0LCBOVUxMKTsKKworICAgIC8vIFZVIDBmZTAwZDI0IC0gdG9vIG1hbnkgc2FtcGxlZCBpbWFnZSB0eXBlIGRlc2NyaXB0b3JzIG92ZXJhbGwKKyAgICBkc2xiX3ZlYy5jbGVhcigpOworICAgIGRzbGIuYmluZGluZyA9IDA7CisgICAgZHNsYi5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGRzbGIuZGVzY3JpcHRvckNvdW50ID0gbWF4X3NhbXBsZXJzOworICAgIGRzbGIuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOworICAgIGRzbGIucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisgICAgZHNsYi5iaW5kaW5nID0gMTsKKyAgICBkc2xiLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U7CisgICAgLy8gcmV2aXNpdDogbm90IHJvYnVzdCB0byBvZGQgbGltaXRzLgorICAgIHVpbnQzMl90IHJlbWFpbmluZyA9IChtYXhfc2FtcGxlcnMgPiBzdW1fc2FtcGxlZF9pbWFnZXMgPyAwIDogKHN1bV9zYW1wbGVkX2ltYWdlcyAtIG1heF9zYW1wbGVycykgLyAyKTsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IDEgKyByZW1haW5pbmc7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisgICAgZHNsYi5iaW5kaW5nID0gMjsKKyAgICBkc2xiLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOworICAgIGRzbGIuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MiIpOworICAgIGlmIChzdGQ6Om1heChkc2xiX3ZlY1swXS5kZXNjcmlwdG9yQ291bnQsIGRzbGJfdmVjWzFdLmRlc2NyaXB0b3JDb3VudCkgPiBtYXhfc2FtcGxlZF9pbWFnZXMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI5MCIpOyAgLy8gRXhwZWN0IG1heC1wZXItc3RhZ2Ugc2FtcGxlZCBpbWFnZXMgdG8gZXhjZWVkIGxpbWl0cworICAgIH0KKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgcGlwZWxpbmVfbGF5b3V0LCBOVUxMKTsgIC8vIFVubmVjZXNzYXJ5IGJ1dCBoYXJtbGVzcyBpZiB0ZXN0IHBhc3NlZAorICAgIHBpcGVsaW5lX2xheW91dCA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGRzX2xheW91dCwgTlVMTCk7CisKKyAgICAvLyBWVSAwZmUwMGQyNiAtIHRvbyBtYW55IHN0b3JhZ2UgaW1hZ2UgdHlwZSBkZXNjcmlwdG9ycyBvdmVyYWxsCisgICAgZHNsYl92ZWMuY2xlYXIoKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAwOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTsKKyAgICBkc2xiLmRlc2NyaXB0b3JDb3VudCA9IHN1bV9zdG9yYWdlX2ltYWdlcyAvIDI7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ7CisgICAgZHNsYi5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworICAgIGRzbGJfdmVjLnB1c2hfYmFjayhkc2xiKTsKKyAgICBkc2xiLmJpbmRpbmcgPSAxOworICAgIGRzbGIuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI7CisgICAgZHNsYi5kZXNjcmlwdG9yQ291bnQgPSBzdW1fc3RvcmFnZV9pbWFnZXMgLSBkc2xiLmRlc2NyaXB0b3JDb3VudCArIDE7CisgICAgZHNsYi5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4MyIpOworICAgIGlmIChkc2xiLmRlc2NyaXB0b3JDb3VudCA+IG1heF9zdG9yYWdlX2ltYWdlcykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMDI5MSIpOyAgLy8gZXhwZWN0IG1heC1wZXItc3RhZ2UgdG9vCisgICAgfQorICAgIGVyciA9IHZrOjpDcmVhdGVQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZwaXBlbGluZV9sYXlvdXRfY2ksIE5VTEwsICZwaXBlbGluZV9sYXlvdXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBwaXBlbGluZV9sYXlvdXQsIE5VTEwpOyAgLy8gVW5uZWNlc3NhcnkgYnV0IGhhcm1sZXNzIGlmIHRlc3QgcGFzc2VkCisgICAgcGlwZWxpbmVfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfbGF5b3V0LCBOVUxMKTsKKworICAgIC8vIFZVIDBmZTAwZDI4IC0gdG9vIG1hbnkgaW5wdXQgYXR0YWNobWVudCB0eXBlIGRlc2NyaXB0b3JzIG92ZXJhbGwKKyAgICBkc2xiX3ZlYy5jbGVhcigpOworICAgIGRzbGIuYmluZGluZyA9IDA7CisgICAgZHNsYi5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOworICAgIGRzbGIuZGVzY3JpcHRvckNvdW50ID0gc3VtX2lucHV0X2F0dGFjaG1lbnRzICsgMTsKKyAgICBkc2xiLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworICAgIGRzbGIucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKyAgICBkc2xiX3ZlYy5wdXNoX2JhY2soZHNsYik7CisKKyAgICBkc19sYXlvdXRfY2kuYmluZGluZ0NvdW50ID0gZHNsYl92ZWMuc2l6ZSgpOworICAgIGRzX2xheW91dF9jaS5wQmluZGluZ3MgPSBkc2xiX3ZlYy5kYXRhKCk7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfbGF5b3V0X2NpLCBOVUxMLCAmZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY4NCIpOworICAgIGlmIChkc2xiLmRlc2NyaXB0b3JDb3VudCA+IG1heF9pbnB1dF9hdHRhY2htZW50cykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mby1wU2V0TGF5b3V0cy0wMTY3NiIpOyAgLy8gZXhwZWN0IG1heC1wZXItc3RhZ2UgdG9vCisgICAgfQorICAgIGVyciA9IHZrOjpDcmVhdGVQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZwaXBlbGluZV9sYXlvdXRfY2ksIE5VTEwsICZwaXBlbGluZV9sYXlvdXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBwaXBlbGluZV9sYXlvdXQsIE5VTEwpOyAgLy8gVW5uZWNlc3NhcnkgYnV0IGhhcm1sZXNzIGlmIHRlc3QgcGFzc2VkCisgICAgcGlwZWxpbmVfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfbGF5b3V0LCBOVUxMKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkQ21kQnVmZmVyUGlwZWxpbmVEZXN0cm95ZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIGRyYXcgd2l0aCBhIGNvbW1hbmQgYnVmZmVyIHRoYXQgaXMgaW52YWxpZCBkdWUgdG8gYSBwaXBlbGluZSBkZXBlbmRlbmN5IGJlaW5nIGRlc3Ryb3llZC4iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICB7CisgICAgICAgIC8vIFVzZSBoZWxwZXIgdG8gY3JlYXRlIGdyYXBoaWNzIHBpcGVsaW5lCisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIGhlbHBlcigqdGhpcyk7CisgICAgICAgIGhlbHBlci5Jbml0SW5mbygpOworICAgICAgICBoZWxwZXIuSW5pdFN0YXRlKCk7CisgICAgICAgIGhlbHBlci5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICAgICAgLy8gQmluZCBoZWxwZXIgcGlwZWxpbmUgdG8gY29tbWFuZCBidWZmZXIKKyAgICAgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgICAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIGhlbHBlci5waXBlbGluZV8pOworICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgICAgIC8vIHBpcGVsaW5lIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gaGVscGVyIGdvZXMgb3V0IG9mIHNjb3BlCisgICAgfQorCisgICAgLy8gQ2F1c2UgZXJyb3IgYnkgc3VibWl0dGluZyBjb21tYW5kIGJ1ZmZlciB0aGF0IHJlZmVyZW5jZXMgZGVzdHJveWVkIHBpcGVsaW5lCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtSW52YWxpZENvbW1hbmRCdWZmZXItVmtQaXBlbGluZSIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UXVldWVDb21tYW5kQnVmZmVyKGZhbHNlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkUGlwZWxpbmUpIHsKKyAgICB1aW50NjRfdCBmYWtlX3BpcGVsaW5lX2hhbmRsZSA9IDB4YmFhZDYwMDE7CisgICAgVmtQaXBlbGluZSBiYWRfcGlwZWxpbmUgPSByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmUgJj4oZmFrZV9waXBlbGluZV9oYW5kbGUpOworCisgICAgLy8gRW5hYmxlIFZLX0tIUl9kcmF3X2luZGlyZWN0X2NvdW50IGZvciBLSFIgdmFyaWFudHMKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfRFJBV19JTkRJUkVDVF9DT1VOVF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfRFJBV19JTkRJUkVDVF9DT1VOVF9FWFRFTlNJT05fTkFNRSk7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBib29sIGhhc19raHJfaW5kaXJlY3QgPSBEZXZpY2VFeHRlbnNpb25FbmFibGVkKFZLX0tIUl9EUkFXX0lORElSRUNUX0NPVU5UX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gQXR0ZW1wdCB0byBiaW5kIGFuIGludmFsaWQgUGlwZWxpbmUgdG8gYSB2YWxpZCBDb21tYW5kIEJ1ZmZlcgorICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRCaW5kUGlwZWxpbmUtcGlwZWxpbmUtcGFyYW1ldGVyIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgYmFkX3BpcGVsaW5lKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIFRyeSBlYWNoIG9mIHRoZSA2IGZsYXZvcnMgb2YgRHJhdygpCisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsgIC8vIERyYXcqKCkgY2FsbHMgbXVzdCBiZSBzdWJtaXR0ZWQgd2l0aGluIGEgcmVuZGVycGFzcworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXctTm9uZS0wMjcwMCIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZC1Ob25lLTAyNzAwIik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3SW5kZXhlZCgxLCAxLCAwLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gY2kgPSB7fTsKKyAgICBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBjaS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9JTkRJUkVDVF9CVUZGRVJfQklUOworICAgIGNpLnNpemUgPSAxMDI0OworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgY2kpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREcmF3SW5kaXJlY3QtTm9uZS0wMjcwMCIpOworICAgIHZrOjpDbWREcmF3SW5kaXJlY3QobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLmhhbmRsZSgpLCAwLCAxLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0LU5vbmUtMDI3MDAiKTsKKyAgICB2azo6Q21kRHJhd0luZGV4ZWRJbmRpcmVjdChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIDAsIDEsIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgaWYgKGhhc19raHJfaW5kaXJlY3QpIHsKKyAgICAgICAgYXV0byBmcENtZERyYXdJbmRpcmVjdENvdW50S0hSID0KKyAgICAgICAgICAgIChQRk5fdmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWREcmF3SW5kaXJlY3RDb3VudEtIUiIpOworICAgICAgICBBU1NFUlRfTkUoZnBDbWREcmF3SW5kaXJlY3RDb3VudEtIUiwgbnVsbHB0cik7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXdJbmRpcmVjdENvdW50S0hSLU5vbmUtMDI3MDAiKTsKKyAgICAgICAgLy8gc3RyaWRlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGFuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBzaXplb2YoVmtEcmF3SW5kaXJlY3RDb21tYW5kKQorICAgICAgICBmcENtZERyYXdJbmRpcmVjdENvdW50S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgMCwgYnVmZmVyLmhhbmRsZSgpLCA1MTIsIDEsIDUxMik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIGF1dG8gZnBDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIgPQorICAgICAgICAgICAgKFBGTl92a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWREcmF3SW5kZXhlZEluZGlyZWN0Q291bnRLSFIiKTsKKyAgICAgICAgQVNTRVJUX05FKGZwQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSLCBudWxscHRyKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERyYXdJbmRleGVkSW5kaXJlY3RDb3VudEtIUi1Ob25lLTAyNzAwIik7CisgICAgICAgIC8vIHN0cmlkZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gc2l6ZW9mKFZrRHJhd0luZGV4ZWRJbmRpcmVjdENvbW1hbmQpCisgICAgICAgIGZwQ21kRHJhd0luZGV4ZWRJbmRpcmVjdENvdW50S0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgMCwgYnVmZmVyLmhhbmRsZSgpLCA1MTIsIDEsIDUxMik7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIEFsc28gdHJ5IHRoZSBEaXNwYXRjaCB2YXJpYW50cworICAgIHZrOjpDbWRFbmRSZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOyAgLy8gQ29tcHV0ZSBzdWJtaXNzaW9ucyBtdXN0IGJlIG91dHNpZGUgYSByZW5kZXJwYXNzCisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRGlzcGF0Y2gtTm9uZS0wMjcwMCIpOworICAgIHZrOjpDbWREaXNwYXRjaChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREaXNwYXRjaEluZGlyZWN0LU5vbmUtMDI3MDAiKTsKKyAgICB2azo6Q21kRGlzcGF0Y2hJbmRpcmVjdChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENtZERpc3BhdGNoRXhjZWVkTGltaXRzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ29tcHV0ZSBkaXNwYXRjaCB3aXRoIGRpbWVuc2lvbnMgdGhhdCBleGNlZWQgZGV2aWNlIGxpbWl0cyIpOworCisgICAgLy8gRW5hYmxlIEtIWCBkZXZpY2UgZ3JvdXAgZXh0ZW5zaW9ucywgaWYgYXZhaWxhYmxlCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9ERVZJQ0VfR1JPVVBfQ1JFQVRJT05fRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfREVWSUNFX0dST1VQX0NSRUFUSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgYm9vbCBraHhfZGdfZXh0X2F2YWlsYWJsZSA9IGZhbHNlOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9ERVZJQ0VfR1JPVVBfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0RFVklDRV9HUk9VUF9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIGtoeF9kZ19leHRfYXZhaWxhYmxlID0gdHJ1ZTsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgdWludDMyX3QgeF9jb3VudF9saW1pdCA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzBdOworICAgIHVpbnQzMl90IHlfY291bnRfbGltaXQgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsxXTsKKyAgICB1aW50MzJfdCB6X2NvdW50X2xpbWl0ID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMl07CisgICAgaWYgKHN0ZDo6bWF4KHt4X2NvdW50X2xpbWl0LCB5X2NvdW50X2xpbWl0LCB6X2NvdW50X2xpbWl0fSkgPT0gVUlOVDMyX01BWCkgeworICAgICAgICBwcmludGYoIiVzIGRldmljZSBtYXhDb21wdXRlV29ya0dyb3VwQ291bnQgbGltaXQgcmVwb3J0cyBVSU5UMzJfTUFYLCB0ZXN0IG5vdCBwb3NzaWJsZSwgc2tpcHBpbmcuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCB4X3NpemVfbGltaXQgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heENvbXB1dGVXb3JrR3JvdXBTaXplWzBdOworICAgIHVpbnQzMl90IHlfc2l6ZV9saW1pdCA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMV07CisgICAgdWludDMyX3Qgel9zaXplX2xpbWl0ID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXTsKKworICAgIHN0ZDo6c3RyaW5nIHNwdl9zb3VyY2UgPSBSIigKKyAgICAgICAgT3BDYXBhYmlsaXR5IFNoYWRlcgorICAgICAgICBPcE1lbW9yeU1vZGVsIExvZ2ljYWwgR0xTTDQ1MAorICAgICAgICBPcEVudHJ5UG9pbnQgR0xDb21wdXRlICVtYWluICJtYWluIgorICAgICAgICBPcEV4ZWN1dGlvbk1vZGUgJW1haW4gTG9jYWxTaXplICkiOworICAgIHNwdl9zb3VyY2UuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHhfc2l6ZV9saW1pdCArIDEpICsgIiAiICsgc3RkOjp0b19zdHJpbmcoeV9zaXplX2xpbWl0ICsgMSkgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHpfc2l6ZV9saW1pdCArIDEpKTsKKyAgICBzcHZfc291cmNlLmFwcGVuZChSIigKKyAgICAgICAgJXZvaWQgPSBPcFR5cGVWb2lkCisgICAgICAgICAgICUzID0gT3BUeXBlRnVuY3Rpb24gJXZvaWQKKyAgICAgICAgJW1haW4gPSBPcEZ1bmN0aW9uICV2b2lkIE5vbmUgJTMKKyAgICAgICAgICAgJTUgPSBPcExhYmVsCisgICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgICBPcEZ1bmN0aW9uRW5kKSIpOworCisgICAgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLmNzXy5yZXNldChuZXcgVmtTaGFkZXJPYmoobV9kZXZpY2UsIHNwdl9zb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgdGhpcykpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJleGNlZWRzIGRldmljZSBsaW1pdCBtYXhDb21wdXRlV29ya0dyb3VwU2l6ZVswXSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgImV4Y2VlZHMgZGV2aWNlIGxpbWl0IG1heENvbXB1dGVXb3JrR3JvdXBTaXplWzFdIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiZXhjZWVkcyBkZXZpY2UgbGltaXQgbWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMl0iKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJmZWF0dXJlcy1saW1pdHMtbWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zIik7CisgICAgcGlwZS5DcmVhdGVDb21wdXRlUGlwZWxpbmUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIENyZWF0ZSBhIG1pbmltYWwgY29tcHV0ZSBwaXBlbGluZQorICAgIHhfc2l6ZV9saW1pdCA9ICh4X3NpemVfbGltaXQgPiAxMDI0KSA/IDEwMjQgOiB4X3NpemVfbGltaXQ7CisgICAgeV9zaXplX2xpbWl0ID0gKHlfc2l6ZV9saW1pdCA+IDEwMjQpID8gMTAyNCA6IHlfc2l6ZV9saW1pdDsKKyAgICB6X3NpemVfbGltaXQgPSAoel9zaXplX2xpbWl0ID4gNjQpID8gNjQgOiB6X3NpemVfbGltaXQ7CisKKyAgICB1aW50MzJfdCBpbnZvY2F0aW9uc19saW1pdCA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zOworICAgIHhfc2l6ZV9saW1pdCA9ICh4X3NpemVfbGltaXQgPiBpbnZvY2F0aW9uc19saW1pdCkgPyBpbnZvY2F0aW9uc19saW1pdCA6IHhfc2l6ZV9saW1pdDsKKyAgICBpbnZvY2F0aW9uc19saW1pdCAvPSB4X3NpemVfbGltaXQ7CisgICAgeV9zaXplX2xpbWl0ID0gKHlfc2l6ZV9saW1pdCA+IGludm9jYXRpb25zX2xpbWl0KSA/IGludm9jYXRpb25zX2xpbWl0IDogeV9zaXplX2xpbWl0OworICAgIGludm9jYXRpb25zX2xpbWl0IC89IHlfc2l6ZV9saW1pdDsKKyAgICB6X3NpemVfbGltaXQgPSAoel9zaXplX2xpbWl0ID4gaW52b2NhdGlvbnNfbGltaXQpID8gaW52b2NhdGlvbnNfbGltaXQgOiB6X3NpemVfbGltaXQ7CisKKyAgICBjaGFyIGNzX3RleHRbMTI4XSA9ICIiOworICAgIHNwcmludGYoY3NfdGV4dCwgIiN2ZXJzaW9uIDQ1MFxubGF5b3V0KGxvY2FsX3NpemVfeCA9ICVkLCBsb2NhbF9zaXplX3kgPSAlZCwgbG9jYWxfc2l6ZV96ID0gJWQpIGluO1xudm9pZCBtYWluKCkge31cbiIsCisgICAgICAgICAgICB4X3NpemVfbGltaXQsIHlfc2l6ZV9saW1pdCwgel9zaXplX2xpbWl0KTsKKworICAgIFZrU2hhZGVyT2JqIGNzX29iaihtX2RldmljZSwgY3NfdGV4dCwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCB0aGlzKTsKKyAgICBwaXBlLmNzXy5yZXNldChuZXcgVmtTaGFkZXJPYmoobV9kZXZpY2UsIGNzX3RleHQsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgdGhpcykpOworICAgIHBpcGUuQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lKCk7CisKKyAgICAvLyBCaW5kIHBpcGVsaW5lIHRvIGNvbW1hbmQgYnVmZmVyCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLCBwaXBlLnBpcGVsaW5lXyk7CisKKyAgICAvLyBEaXNwYXRjaCBjb3VudHMgdGhhdCBleGNlZWQgZGV2aWNlIGxpbWl0cworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREaXNwYXRjaC1ncm91cENvdW50WC0wMDM4NiIpOworICAgIHZrOjpDbWREaXNwYXRjaChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCB4X2NvdW50X2xpbWl0ICsgMSwgeV9jb3VudF9saW1pdCwgel9jb3VudF9saW1pdCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRGlzcGF0Y2gtZ3JvdXBDb3VudFktMDAzODciKTsKKyAgICB2azo6Q21kRGlzcGF0Y2gobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgeF9jb3VudF9saW1pdCwgeV9jb3VudF9saW1pdCArIDEsIHpfY291bnRfbGltaXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERpc3BhdGNoLWdyb3VwQ291bnRaLTAwMzg4Iik7CisgICAgdms6OkNtZERpc3BhdGNoKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHhfY291bnRfbGltaXQsIHlfY291bnRfbGltaXQsIHpfY291bnRfbGltaXQgKyAxKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIGlmIChraHhfZGdfZXh0X2F2YWlsYWJsZSkgeworICAgICAgICBQRk5fdmtDbWREaXNwYXRjaEJhc2VLSFIgZnBfdmtDbWREaXNwYXRjaEJhc2VLSFIgPQorICAgICAgICAgICAgKFBGTl92a0NtZERpc3BhdGNoQmFzZUtIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtDbWREaXNwYXRjaEJhc2VLSFIiKTsKKworICAgICAgICAvLyBCYXNlIGVxdWFscyBvciBleGNlZWRzIGxpbWl0CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtYmFzZUdyb3VwWC0wMDQyMSIpOworICAgICAgICBmcF92a0NtZERpc3BhdGNoQmFzZUtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCB4X2NvdW50X2xpbWl0LCB5X2NvdW50X2xpbWl0IC0gMSwgel9jb3VudF9saW1pdCAtIDEsIDAsIDAsIDApOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWJhc2VHcm91cFgtMDA0MjIiKTsKKyAgICAgICAgZnBfdmtDbWREaXNwYXRjaEJhc2VLSFIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgeF9jb3VudF9saW1pdCAtIDEsIHlfY291bnRfbGltaXQsIHpfY291bnRfbGltaXQgLSAxLCAwLCAwLCAwKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1iYXNlR3JvdXBaLTAwNDIzIik7CisgICAgICAgIGZwX3ZrQ21kRGlzcGF0Y2hCYXNlS0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHhfY291bnRfbGltaXQgLSAxLCB5X2NvdW50X2xpbWl0IC0gMSwgel9jb3VudF9saW1pdCwgMCwgMCwgMCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIC8vIChCYXNlICsgY291bnQpIGV4Y2VlZHMgbGltaXQKKyAgICAgICAgdWludDMyX3QgeF9iYXNlID0geF9jb3VudF9saW1pdCAvIDI7CisgICAgICAgIHVpbnQzMl90IHlfYmFzZSA9IHlfY291bnRfbGltaXQgLyAyOworICAgICAgICB1aW50MzJfdCB6X2Jhc2UgPSB6X2NvdW50X2xpbWl0IC8gMjsKKyAgICAgICAgeF9jb3VudF9saW1pdCAtPSB4X2Jhc2U7CisgICAgICAgIHlfY291bnRfbGltaXQgLT0geV9iYXNlOworICAgICAgICB6X2NvdW50X2xpbWl0IC09IHpfYmFzZTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kRGlzcGF0Y2hCYXNlLWdyb3VwQ291bnRYLTAwNDI0Iik7CisgICAgICAgIGZwX3ZrQ21kRGlzcGF0Y2hCYXNlS0hSKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHhfYmFzZSwgeV9iYXNlLCB6X2Jhc2UsIHhfY291bnRfbGltaXQgKyAxLCB5X2NvdW50X2xpbWl0LCB6X2NvdW50X2xpbWl0KTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERpc3BhdGNoQmFzZS1ncm91cENvdW50WS0wMDQyNSIpOworICAgICAgICBmcF92a0NtZERpc3BhdGNoQmFzZUtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCB4X2Jhc2UsIHlfYmFzZSwgel9iYXNlLCB4X2NvdW50X2xpbWl0LCB5X2NvdW50X2xpbWl0ICsgMSwgel9jb3VudF9saW1pdCk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWREaXNwYXRjaEJhc2UtZ3JvdXBDb3VudFotMDA0MjYiKTsKKyAgICAgICAgZnBfdmtDbWREaXNwYXRjaEJhc2VLSFIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgeF9iYXNlLCB5X2Jhc2UsIHpfYmFzZSwgeF9jb3VudF9saW1pdCwgeV9jb3VudF9saW1pdCwgel9jb3VudF9saW1pdCArIDEpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEtIWF9ERVZJQ0VfR1JPVVBfKiBleHRlbnNpb25zIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIENtZERpc3BhdGNoQmFzZUtIUigpIHRlc3RzLlxuIiwga1NraXBQcmVmaXgpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkUGlwZWxpbmVDcmVhdGVTdGF0ZSkgeworICAgIC8vIEF0dGVtcHQgdG8gQ3JlYXRlIEdmeCBQaXBlbGluZSB3L28gYSBWUworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHNoYWRlclN0YWdlID0gZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCk7ICAvLyBzaG91bGQgYmU6IHZzLkdldFN0YWdlQ3JlYXRlSW5mbygpOworCisgICAgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7IGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHtzaGFkZXJTdGFnZX07IH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IFZlcnRleCBTaGFkZXIgcmVxdWlyZWQiKTsKKworICAgIC8vIEZpbmFsbHksIGNoZWNrIHRoZSBzdHJpbmcgdmFsaWRhdGlvbiBmb3IgdGhlIHNoYWRlciBzdGFnZSBwTmFtZSB2YXJpYWJsZS4gIENvcnJlY3QgdGhlIHNoYWRlciBzdGFnZSBkYXRhLCBhbmQgYm9yayB0aGUKKyAgICAvLyBzdHJpbmcgYmVmb3JlIGNhbGxpbmcgYWdhaW4KKyAgICBzaGFkZXJTdGFnZSA9IHZzLkdldFN0YWdlQ3JlYXRlSW5mbygpOworICAgIGNvbnN0IHVpbnQ4X3QgY29udF9jaGFyID0gMHhmODsKKyAgICBjaGFyIGJhZF9zdHJpbmdbXSA9IHtzdGF0aWNfY2FzdDxjaGFyPihjb250X2NoYXIpLCBzdGF0aWNfY2FzdDxjaGFyPihjb250X2NoYXIpLCBzdGF0aWNfY2FzdDxjaGFyPihjb250X2NoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXI+KGNvbnRfY2hhcil9OworICAgIHNoYWRlclN0YWdlLnBOYW1lID0gYmFkX3N0cmluZzsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIG9yIGlzIGJhZGx5IGZvcm1lZCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRQaXBlbGluZVNhbXBsZVJhdGVGZWF0dXJlRGlzYWJsZSkgeworICAgIC8vIEVuYWJsZSBzYW1wbGUgc2hhZGluZyBpbiBwaXBlbGluZSB3aGVuIHRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLgorICAgIC8vIERpc2FibGUgc2FtcGxlUmF0ZVNoYWRpbmcgaGVyZQorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBkZXZpY2VfZmVhdHVyZXMgPSB7fTsKKyAgICBkZXZpY2VfZmVhdHVyZXMuc2FtcGxlUmF0ZVNoYWRpbmcgPSBWS19GQUxTRTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoJmRldmljZV9mZWF0dXJlcykpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBDYXVzZSB0aGUgZXJyb3IgYnkgZW5hYmxpbmcgc2FtcGxlIHNoYWRpbmcuLi4KKyAgICBhdXRvIHNldF9zaGFkaW5nX2VuYWJsZSA9IFtdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsgaGVscGVyLnBpcGVfbXNfc3RhdGVfY2lfLnNhbXBsZVNoYWRpbmdFbmFibGUgPSBWS19UUlVFOyB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X3NoYWRpbmdfZW5hYmxlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXNhbXBsZVNoYWRpbmdFbmFibGUtMDA3ODQiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkUGlwZWxpbmVTYW1wbGVSYXRlRmVhdHVyZUVuYWJsZSkgeworICAgIC8vIEVuYWJsZSBzYW1wbGUgc2hhZGluZyBpbiBwaXBlbGluZSB3aGVuIHRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgLy8gUmVxdWlyZSBzYW1wbGVSYXRlU2hhZGluZyBoZXJlCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGRldmljZV9mZWF0dXJlcyA9IHt9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoJmRldmljZV9mZWF0dXJlcykpOworICAgIGlmIChkZXZpY2VfZmVhdHVyZXMuc2FtcGxlUmF0ZVNoYWRpbmcgPT0gVktfRkFMU0UpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBTYW1wbGVSYXRlU2hhZGluZyBmZWF0dXJlIGlzIGRpc2FibGVkIC0tIHNraXBwaW5nIHJlbGF0ZWQgY2hlY2tzLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCZkZXZpY2VfZmVhdHVyZXMpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgYXV0byByYW5nZV90ZXN0ID0gW3RoaXNdKGZsb2F0IHZhbHVlLCBib29sIHBvc2l0aXZlX3Rlc3QpIHsKKyAgICAgICAgYXV0byBpbmZvX292ZXJyaWRlID0gW3ZhbHVlXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICBoZWxwZXIucGlwZV9tc19zdGF0ZV9jaV8uc2FtcGxlU2hhZGluZ0VuYWJsZSA9IFZLX1RSVUU7CisgICAgICAgICAgICBoZWxwZXIucGlwZV9tc19zdGF0ZV9jaV8ubWluU2FtcGxlU2hhZGluZyA9IHZhbHVlOworICAgICAgICB9OworICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGluZm9fb3ZlcnJpZGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLW1pblNhbXBsZVNoYWRpbmctMDA3ODYiLCBwb3NpdGl2ZV90ZXN0KTsKKyAgICB9OworCisgICAgcmFuZ2VfdGVzdChOZWFyZXN0U21hbGxlcigwLjBGKSwgZmFsc2UpOworICAgIHJhbmdlX3Rlc3QoTmVhcmVzdEdyZWF0ZXIoMS4wRiksIGZhbHNlKTsKKyAgICByYW5nZV90ZXN0KDAuMEYsIC8qIHBvc2l0aXZlX3Rlc3Q9ICovIHRydWUpOworICAgIHJhbmdlX3Rlc3QoMS4wRiwgLyogcG9zaXRpdmVfdGVzdD0gKi8gdHJ1ZSk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgSW52YWxpZFBpcGVsaW5lU2FtcGxlUE5leHQpIHsKKyAgICAvLyBFbmFibGUgc2FtcGxlIHNoYWRpbmcgaW4gcGlwZWxpbmUgd2hlbiB0aGUgZmVhdHVyZSBpcyBkaXNhYmxlZC4KKyAgICAvLyBDaGVjayBmb3IgVktfS0hSX2dldF9waHlzaWNhbF9kZXZpY2VfcHJvcGVydGllczIKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICAvLyBTZXQgdXAgdGhlIGV4dGVuc2lvbiBzdHJ1Y3RzCisgICAgYXV0byBzYW1wbGVMb2NhdGlvbnMgPSBjaGFpbl91dGlsOjpJbml0PFZrUGlwZWxpbmVTYW1wbGVMb2NhdGlvbnNTdGF0ZUNyZWF0ZUluZm9FWFQ+KCk7CisgICAgc2FtcGxlTG9jYXRpb25zLnNhbXBsZUxvY2F0aW9uc0luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVfTE9DQVRJT05TX0lORk9fRVhUOworICAgIGF1dG8gY292ZXJhZ2VUb0NvbG9yID0gY2hhaW5fdXRpbDo6SW5pdDxWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlY+KCk7CisgICAgYXV0byBjb3ZlcmFnZU1vZHVsYXRpb24gPSBjaGFpbl91dGlsOjpJbml0PFZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVj4oKTsKKyAgICBhdXRvIGRpc2NyaW1pbmF0cml4ID0gW3RoaXNdKGNvbnN0IGNoYXIgKm5hbWUpIHsgcmV0dXJuIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgbmFtZSk7IH07CisgICAgY2hhaW5fdXRpbDo6RXh0ZW5zaW9uQ2hhaW4gY2hhaW4oZGlzY3JpbWluYXRyaXgsICZtX2RldmljZV9leHRlbnNpb25fbmFtZXMpOworICAgIGNoYWluLkFkZChWS19FWFRfU0FNUExFX0xPQ0FUSU9OU19FWFRFTlNJT05fTkFNRSwgc2FtcGxlTG9jYXRpb25zKTsKKyAgICBjaGFpbi5BZGQoVktfTlZfRlJBR01FTlRfQ09WRVJBR0VfVE9fQ09MT1JfRVhURU5TSU9OX05BTUUsIGNvdmVyYWdlVG9Db2xvcik7CisgICAgY2hhaW4uQWRkKFZLX05WX0ZSQU1FQlVGRkVSX01JWEVEX1NBTVBMRVNfRVhURU5TSU9OX05BTUUsIGNvdmVyYWdlTW9kdWxhdGlvbik7CisgICAgY29uc3Qgdm9pZCAqZXh0ZW5zaW9uX2hlYWQgPSBjaGFpbi5IZWFkKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGlmIChleHRlbnNpb25faGVhZCkgeworICAgICAgICBhdXRvIGdvb2RfY2hhaW4gPSBbZXh0ZW5zaW9uX2hlYWRdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsgaGVscGVyLnBpcGVfbXNfc3RhdGVfY2lfLnBOZXh0ID0gZXh0ZW5zaW9uX2hlYWQ7IH07CisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgZ29vZF9jaGFpbiwgKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUIHwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZXJyb3IiLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFJlcXVpcmVkIGV4dGVuc2lvbiBub3QgcHJlc2VudCAtLSBza2lwcGluZyBwb3NpdGl2ZSBjaGVja3MuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgfQorCisgICAgYXV0byBpbnN0YW5jZV9jaSA9IGNoYWluX3V0aWw6OkluaXQ8VmtJbnN0YW5jZUNyZWF0ZUluZm8+KCk7CisgICAgYXV0byBiYWRfY2hhaW4gPSBbJmluc3RhbmNlX2NpXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7IGhlbHBlci5waXBlX21zX3N0YXRlX2NpXy5wTmV4dCA9ICZpbnN0YW5jZV9jaTsgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGJhZF9jaGFpbiwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvLXBOZXh0LXBOZXh0Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlR3JhcGhpY3NQaXBlbGluZVdpdGhCYWRCYXNlUG9pbnRlcikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBHcmFwaGljcyBQaXBlbGluZSB3aXRoIHBvaW50ZXJzIHRoYXQgbXVzdCBiZSBpZ25vcmVkIGJ5IGxheWVycyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZGVwdGhfc3RlbmNpbF9mbXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBBU1NFUlRfVFJVRShtX2RlcHRoX3N0ZW5jaWxfZm10ICE9IDApOworCisgICAgbV9kZXB0aFN0ZW5jaWwtPkluaXQobV9kZXZpY2UsIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fd2lkdGgpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihtX2hlaWdodCksIG1fZGVwdGhfc3RlbmNpbF9mbXQpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldChtX2RlcHRoU3RlbmNpbC0+QmluZEluZm8oKSkpOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gcGlwZWxpbmVfdmVydGV4X2lucHV0X3N0YXRlX2NyZWF0ZV9pbmZveworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIDAsIG51bGxwdHJ9OworCisgICAgY29uc3QgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gcGlwZWxpbmVfaW5wdXRfYXNzZW1ibHlfc3RhdGVfY3JlYXRlX2luZm97CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfTElTVCwgVktfRkFMU0V9OworCisgICAgY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gcGlwZWxpbmVfcmFzdGVyaXphdGlvbl9zdGF0ZV9jcmVhdGVfaW5mb190ZW1wbGF0ZXsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTywKKyAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgMCwKKyAgICAgICAgVktfRkFMU0UsCisgICAgICAgIFZLX0ZBTFNFLAorICAgICAgICBWS19QT0xZR09OX01PREVfRklMTCwKKyAgICAgICAgVktfQ1VMTF9NT0RFX05PTkUsCisgICAgICAgIFZLX0ZST05UX0ZBQ0VfQ09VTlRFUl9DTE9DS1dJU0UsCisgICAgICAgIFZLX0ZBTFNFLAorICAgICAgICAwLjBmLAorICAgICAgICAwLjBmLAorICAgICAgICAwLjBmLAorICAgICAgICAxLjBmfTsKKworICAgIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVfbGF5b3V0OworICAgIGF1dG8gcGlwZWxpbmVfbGF5b3V0X2NyZWF0ZV9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvPigpOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZwaXBlbGluZV9sYXlvdXRfY3JlYXRlX2luZm8sIG51bGxwdHIsICZwaXBlbGluZV9sYXlvdXQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV9yYXN0ZXJpemF0aW9uX3N0YXRlX2NyZWF0ZV9pbmZvID0KKyAgICAgICAgcGlwZWxpbmVfcmFzdGVyaXphdGlvbl9zdGF0ZV9jcmVhdGVfaW5mb190ZW1wbGF0ZTsKKyAgICBwaXBlbGluZV9yYXN0ZXJpemF0aW9uX3N0YXRlX2NyZWF0ZV9pbmZvLnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID0gVktfVFJVRTsKKworICAgIHVpbnQ2NF90IGZha2VfcGlwZWxpbmVfaWQgPSAweENBREVDQURFOworICAgIFZrUGlwZWxpbmUgZmFrZV9waXBlbGluZV9oYW5kbGUgPSByZWludGVycHJldF9jYXN0PFZrUGlwZWxpbmUgJj4oZmFrZV9waXBlbGluZV9pZCk7CisKKyAgICBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvIGdyYXBoaWNzX3BpcGVsaW5lX2NyZWF0ZV9pbmZve1ZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX0NSRUFURV9ERVJJVkFUSVZFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZWxpbmVfdmVydGV4X2lucHV0X3N0YXRlX2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGVsaW5lX2lucHV0X2Fzc2VtYmx5X3N0YXRlX2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZWxpbmVfcmFzdGVyaXphdGlvbl9zdGF0ZV9jcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZV9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JlbmRlclBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZV9waXBlbGluZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMX07CisKKyAgICBWa1BpcGVsaW5lIHBpcGVsaW5lOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1mbGFncy0wMDcyMiIpOworICAgIHZrOjpDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhtX2RldmljZS0+aGFuZGxlKCksIFZLX05VTExfSEFORExFLCAxLCAmZ3JhcGhpY3NfcGlwZWxpbmVfY3JlYXRlX2luZm8sIG51bGxwdHIsICZwaXBlbGluZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBncmFwaGljc19waXBlbGluZV9jcmVhdGVfaW5mby5iYXNlUGlwZWxpbmVIYW5kbGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBncmFwaGljc19waXBlbGluZV9jcmVhdGVfaW5mby5iYXNlUGlwZWxpbmVJbmRleCA9IDY7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLWZsYWdzLTAwNzIzIik7CisgICAgdms6OkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKG1fZGV2aWNlLT5oYW5kbGUoKSwgVktfTlVMTF9IQU5ETEUsIDEsICZncmFwaGljc19waXBlbGluZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnBpcGVsaW5lKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95UGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCBwaXBlbGluZV9sYXlvdXQsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFZlcnRleEF0dHJpYnV0ZURpdmlzb3JFeHRlbnNpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IFZVSURzIGFkZGVkIHdpdGggVktfRVhUX3ZlcnRleF9hdHRyaWJ1dGVfZGl2aXNvciBleHRlbnNpb24uIik7CisKKyAgICBib29sIGluc3RfZXh0ID0gSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoaW5zdF9leHQpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIH0KKyAgICBpZiAoaW5zdF9leHQgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgVktfRVhUX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIHZhZGYgPSB7fTsKKyAgICB2YWRmLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9GRUFUVVJFU19FWFQ7CisgICAgdmFkZi52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yID0gVktfVFJVRTsKKyAgICB2YWRmLnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZVplcm9EaXZpc29yID0gVktfVFJVRTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgcGRfZmVhdHVyZXMyID0ge307CisgICAgcGRfZmVhdHVyZXMyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzI7CisgICAgcGRfZmVhdHVyZXMyLnBOZXh0ID0gJnZhZGY7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBkX2ZlYXR1cmVzMikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCBWa1BoeXNpY2FsRGV2aWNlTGltaXRzICZkZXZfbGltaXRzID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0czsKKyAgICBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgcGR2YWRfcHJvcHMgPSB7fTsKKyAgICBwZHZhZF9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQ7CisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHBkX3Byb3BzMiA9IHt9OworICAgIHBkX3Byb3BzMi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzI7CisgICAgcGRfcHJvcHMyLnBOZXh0ID0gJnBkdmFkX3Byb3BzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKGdwdSgpLCAmcGRfcHJvcHMyKTsKKworICAgIFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUIHZpYmRkID0ge307CisgICAgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBwdmlkc19jaSA9IHt9OworICAgIHB2aWRzX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX0RJVklTT1JfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworICAgIHB2aWRzX2NpLnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQgPSAxOworICAgIHB2aWRzX2NpLnBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMgPSAmdmliZGQ7CisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiB2aWJkID0ge307CisgICAgdmliZC5zdHJpZGUgPSAxMjsKKyAgICB2aWJkLmlucHV0UmF0ZSA9IFZLX1ZFUlRFWF9JTlBVVF9SQVRFX1ZFUlRFWDsKKworICAgIGlmIChwZHZhZF9wcm9wcy5tYXhWZXJ0ZXhBdHRyaWJEaXZpc29yIDwgcHZpZHNfY2kudmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudCkgeworICAgICAgICBwcmludGYoIiVzVGhpcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCAlZCB2ZXJ0ZXhCaW5kaW5nRGl2aXNvcnMsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIHB2aWRzX2NpLnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdXNpbmcgc3RkOjp2ZWN0b3I7CisgICAgc3RydWN0IFRlc3RDYXNlIHsKKyAgICAgICAgdWludDMyX3QgZGl2X2JpbmRpbmc7CisgICAgICAgIHVpbnQzMl90IGRpdl9kaXZpc29yOworICAgICAgICB1aW50MzJfdCBkZXNjX2JpbmRpbmc7CisgICAgICAgIFZrVmVydGV4SW5wdXRSYXRlIGRlc2NfcmF0ZTsKKyAgICAgICAgdmVjdG9yPHN0ZDo6c3RyaW5nPiB2dWlkczsKKyAgICB9OworCisgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgIHZlY3RvcjxUZXN0Q2FzZT4gdGVzdF9jYXNlcyA9IHsKKyAgICAgICAgeyAgIDAsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIFZLX1ZFUlRFWF9JTlBVVF9SQVRFX1ZFUlRFWCwKKyAgICAgICAgICAgIHsiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC1pbnB1dFJhdGUtMDE4NzEifQorICAgICAgICB9LAorICAgICAgICB7ICAgZGV2X2xpbWl0cy5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzICsgMSwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgVktfVkVSVEVYX0lOUFVUX1JBVEVfSU5TVEFOQ0UsCisgICAgICAgICAgICB7IlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtYmluZGluZy0wMTg2OSIsCisgICAgICAgICAgICAgIlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtaW5wdXRSYXRlLTAxODcxIn0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBpZiAoVUlOVDMyX01BWCAhPSBwZHZhZF9wcm9wcy5tYXhWZXJ0ZXhBdHRyaWJEaXZpc29yKSB7ICAvLyBDYW4ndCB0ZXN0IG92ZXJmbG93IGlmIG1heFZBRCBpcyBVSU5UMzJfTUFYCisgICAgICAgIHRlc3RfY2FzZXMucHVzaF9iYWNrKAorICAgICAgICAgICAgeyAgIDAsCisgICAgICAgICAgICAgICAgcGR2YWRfcHJvcHMubWF4VmVydGV4QXR0cmliRGl2aXNvciArIDEsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBWS19WRVJURVhfSU5QVVRfUkFURV9JTlNUQU5DRSwKKyAgICAgICAgICAgICAgICB7IlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtZGl2aXNvci0wMTg3MCJ9CisgICAgICAgICAgICB9ICk7CisgICAgfQorICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorCisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0X2Nhc2UgOiB0ZXN0X2Nhc2VzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gYmFkX2Rpdmlzb3Jfc3RhdGUgPSBbJnRlc3RfY2FzZSwgJnZpYmRkLCAmcHZpZHNfY2ksICZ2aWJkXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICB2aWJkZC5iaW5kaW5nID0gdGVzdF9jYXNlLmRpdl9iaW5kaW5nOworICAgICAgICAgICAgdmliZGQuZGl2aXNvciA9IHRlc3RfY2FzZS5kaXZfZGl2aXNvcjsKKyAgICAgICAgICAgIHZpYmQuYmluZGluZyA9IHRlc3RfY2FzZS5kZXNjX2JpbmRpbmc7CisgICAgICAgICAgICB2aWJkLmlucHV0UmF0ZSA9IHRlc3RfY2FzZS5kZXNjX3JhdGU7CisgICAgICAgICAgICBoZWxwZXIudmlfY2lfLnBOZXh0ID0gJnB2aWRzX2NpOworICAgICAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IDE7CisgICAgICAgICAgICBoZWxwZXIudmlfY2lfLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gJnZpYmQ7CisgICAgICAgIH07CisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgYmFkX2Rpdmlzb3Jfc3RhdGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB0ZXN0X2Nhc2UudnVpZHMpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRGlzYWJsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IGluc3RhbmNlIGRpdmlzb3IgZmVhdHVyZSBkaXNhYmxlZCBmb3IgVktfRVhUX3ZlcnRleF9hdHRyaWJ1dGVfZGl2aXNvciBleHRlbnNpb24uIik7CisKKyAgICBib29sIGluc3RfZXh0ID0gSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAoaW5zdF9leHQpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIH0KKyAgICBpZiAoaW5zdF9leHQgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgVktfRVhUX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvckZlYXR1cmVzRVhUIHZhZGYgPSB7fTsKKyAgICB2YWRmLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9GRUFUVVJFU19FWFQ7CisgICAgdmFkZi52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yID0gVktfRkFMU0U7CisgICAgdmFkZi52ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVaZXJvRGl2aXNvciA9IFZLX0ZBTFNFOworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgcGRfZmVhdHVyZXMyID0ge307CisgICAgcGRfZmVhdHVyZXMyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzI7CisgICAgcGRfZmVhdHVyZXMyLnBOZXh0ID0gJnZhZGY7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJnBkX2ZlYXR1cmVzMikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlVmVydGV4QXR0cmlidXRlRGl2aXNvclByb3BlcnRpZXNFWFQgcGR2YWRfcHJvcHMgPSB7fTsKKyAgICBwZHZhZF9wcm9wcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfUFJPUEVSVElFU19FWFQ7CisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMyIHBkX3Byb3BzMiA9IHt9OworICAgIHBkX3Byb3BzMi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzI7CisgICAgcGRfcHJvcHMyLnBOZXh0ID0gJnBkdmFkX3Byb3BzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMyKGdwdSgpLCAmcGRfcHJvcHMyKTsKKworICAgIFZrVmVydGV4SW5wdXRCaW5kaW5nRGl2aXNvckRlc2NyaXB0aW9uRVhUIHZpYmRkID0ge307CisgICAgdmliZGQuYmluZGluZyA9IDA7CisgICAgdmliZGQuZGl2aXNvciA9IDI7CisgICAgVmtQaXBlbGluZVZlcnRleElucHV0RGl2aXNvclN0YXRlQ3JlYXRlSW5mb0VYVCBwdmlkc19jaSA9IHt9OworICAgIHB2aWRzX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX0RJVklTT1JfU1RBVEVfQ1JFQVRFX0lORk9fRVhUOworICAgIHB2aWRzX2NpLnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQgPSAxOworICAgIHB2aWRzX2NpLnBWZXJ0ZXhCaW5kaW5nRGl2aXNvcnMgPSAmdmliZGQ7CisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiB2aWJkID0ge307CisgICAgdmliZC5iaW5kaW5nID0gdmliZGQuYmluZGluZzsKKyAgICB2aWJkLnN0cmlkZSA9IDEyOworICAgIHZpYmQuaW5wdXRSYXRlID0gVktfVkVSVEVYX0lOUFVUX1JBVEVfSU5TVEFOQ0U7CisKKyAgICBpZiAocGR2YWRfcHJvcHMubWF4VmVydGV4QXR0cmliRGl2aXNvciA8IHB2aWRzX2NpLnZlcnRleEJpbmRpbmdEaXZpc29yQ291bnQpIHsKKyAgICAgICAgcHJpbnRmKCIlc1RoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgJWQgdmVydGV4QmluZGluZ0Rpdmlzb3JzLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBwdmlkc19jaS52ZXJ0ZXhCaW5kaW5nRGl2aXNvckNvdW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gaW5zdGFuY2VfcmF0ZSA9IFsmcHZpZHNfY2ksICZ2aWJkXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci52aV9jaV8ucE5leHQgPSAmcHZpZHNfY2k7CisgICAgICAgIGhlbHBlci52aV9jaV8udmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSAxOworICAgICAgICBoZWxwZXIudmlfY2lfLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gJnZpYmQ7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGluc3RhbmNlX3JhdGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rpdmlzb3JEZXNjcmlwdGlvbkVYVC12ZXJ0ZXhBdHRyaWJ1dGVJbnN0YW5jZVJhdGVEaXZpc29yLTAyMjI5Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVmVydGV4QXR0cmlidXRlRGl2aXNvckluc3RhbmNlUmF0ZVplcm8pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IGluc3RhbmNlUmF0ZVplcm8gZmVhdHVyZSBvZiBWS19FWFRfdmVydGV4X2F0dHJpYnV0ZV9kaXZpc29yIGV4dGVuc2lvbi4iKTsKKworICAgIGJvb2wgaW5zdF9leHQgPSBJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIGlmIChpbnN0X2V4dCkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgfQorICAgIGlmIChpbnN0X2V4dCAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9WRVJURVhfQVRUUklCVVRFX0RJVklTT1JfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX1ZFUlRFWF9BVFRSSUJVVEVfRElWSVNPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrUGh5c2ljYWxEZXZpY2VWZXJ0ZXhBdHRyaWJ1dGVEaXZpc29yRmVhdHVyZXNFWFQgdmFkZiA9IHt9OworICAgIHZhZGYuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfVkVSVEVYX0FUVFJJQlVURV9ESVZJU09SX0ZFQVRVUkVTX0VYVDsKKyAgICB2YWRmLnZlcnRleEF0dHJpYnV0ZUluc3RhbmNlUmF0ZURpdmlzb3IgPSBWS19UUlVFOworICAgIHZhZGYudmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3IgPSBWS19GQUxTRTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHBkX2ZlYXR1cmVzMiA9IHt9OworICAgIHBkX2ZlYXR1cmVzMi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9GRUFUVVJFU18yOworICAgIHBkX2ZlYXR1cmVzMi5wTmV4dCA9ICZ2YWRmOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZwZF9mZWF0dXJlczIpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQgdmliZGQgPSB7fTsKKyAgICB2aWJkZC5iaW5kaW5nID0gMDsKKyAgICB2aWJkZC5kaXZpc29yID0gMDsKKyAgICBWa1BpcGVsaW5lVmVydGV4SW5wdXREaXZpc29yU3RhdGVDcmVhdGVJbmZvRVhUIHB2aWRzX2NpID0ge307CisgICAgcHZpZHNfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfRElWSVNPUl9TVEFURV9DUkVBVEVfSU5GT19FWFQ7CisgICAgcHZpZHNfY2kudmVydGV4QmluZGluZ0Rpdmlzb3JDb3VudCA9IDE7CisgICAgcHZpZHNfY2kucFZlcnRleEJpbmRpbmdEaXZpc29ycyA9ICZ2aWJkZDsKKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIHZpYmQgPSB7fTsKKyAgICB2aWJkLmJpbmRpbmcgPSB2aWJkZC5iaW5kaW5nOworICAgIHZpYmQuc3RyaWRlID0gMTI7CisgICAgdmliZC5pbnB1dFJhdGUgPSBWS19WRVJURVhfSU5QVVRfUkFURV9JTlNUQU5DRTsKKworICAgIGNvbnN0IGF1dG8gaW5zdGFuY2VfcmF0ZSA9IFsmcHZpZHNfY2ksICZ2aWJkXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci52aV9jaV8ucE5leHQgPSAmcHZpZHNfY2k7CisgICAgICAgIGhlbHBlci52aV9jaV8udmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSAxOworICAgICAgICBoZWxwZXIudmlfY2lfLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gJnZpYmQ7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLCBpbnN0YW5jZV9yYXRlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEaXZpc29yRGVzY3JpcHRpb25FWFQtdmVydGV4QXR0cmlidXRlSW5zdGFuY2VSYXRlWmVyb0Rpdmlzb3ItMDIyMjgiKTsKK30KKworLyovLyBUT0RPIDogVGhpcyB0ZXN0IHNob3VsZCBiZSBnb29kLCBidXQgbmVlZHMgVGVzcyBzdXBwb3J0IGluIGNvbXBpbGVyIHRvIHJ1bgorVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkUGF0Y2hDb250cm9sUG9pbnRzKQoreworICAgIC8vIEF0dGVtcHQgdG8gQ3JlYXRlIEdmeCBQaXBlbGluZSB3L28gYSBWUworICAgIFZrUmVzdWx0ICAgICAgICBlcnI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJJbnZhbGlkIFBpcGVsaW5lIENyZWF0ZUluZm8gU3RhdGU6IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSAorcHJpbWl0aXZlICIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtEZXNjcmlwdG9yUG9vbFNpemUgZHNfdHlwZV9jb3VudCA9IHt9OworICAgICAgICBkc190eXBlX2NvdW50LnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgICAgIGRzX3R5cGVfY291bnQuZGVzY3JpcHRvckNvdW50ID0gMTsKKworICAgIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIGRzX3Bvb2xfY2kgPSB7fTsKKyAgICAgICAgZHNfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICAgICAgZHNfcG9vbF9jaS5wTmV4dCA9IE5VTEw7CisgICAgICAgIGRzX3Bvb2xfY2kucG9vbFNpemVDb3VudCA9IDE7CisgICAgICAgIGRzX3Bvb2xfY2kucFBvb2xTaXplcyA9ICZkc190eXBlX2NvdW50OworCisgICAgVmtEZXNjcmlwdG9yUG9vbCBkc19wb29sOworICAgIGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yUG9vbChtX2RldmljZS0+ZGV2aWNlKCksCitWS19ERVNDUklQVE9SX1BPT0xfVVNBR0VfTk9OX0ZSRUUsIDEsICZkc19wb29sX2NpLCBOVUxMLCAmZHNfcG9vbCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZHNsX2JpbmRpbmcgPSB7fTsKKyAgICAgICAgZHNsX2JpbmRpbmcuYmluZGluZyA9IDA7CisgICAgICAgIGRzbF9iaW5kaW5nLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgICAgICBkc2xfYmluZGluZy5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgICAgICBkc2xfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0FMTDsKKyAgICAgICAgZHNsX2JpbmRpbmcucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKworICAgIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gZHNfbGF5b3V0X2NpID0ge307CisgICAgICAgIGRzX2xheW91dF9jaS5zVHlwZSA9CitWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk87CisgICAgICAgIGRzX2xheW91dF9jaS5wTmV4dCA9IE5VTEw7CisgICAgICAgIGRzX2xheW91dF9jaS5iaW5kaW5nQ291bnQgPSAxOworICAgICAgICBkc19sYXlvdXRfY2kucEJpbmRpbmdzID0gJmRzbF9iaW5kaW5nOworCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRzX2xheW91dDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZkc19sYXlvdXRfY2ksIE5VTEwsCismZHNfbGF5b3V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQ7CisgICAgZXJyID0gdms6OkFsbG9jYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCBkc19wb29sLAorVktfREVTQ1JJUFRPUl9TRVRfVVNBR0VfTk9OX0ZSRUUsIDEsICZkc19sYXlvdXQsICZkZXNjcmlwdG9yU2V0KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGlwZWxpbmVfbGF5b3V0X2NpID0ge307CisgICAgICAgIHBpcGVsaW5lX2xheW91dF9jaS5zVHlwZSA9CitWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk87CisgICAgICAgIHBpcGVsaW5lX2xheW91dF9jaS5wTmV4dCA9IE5VTEw7CisgICAgICAgIHBpcGVsaW5lX2xheW91dF9jaS5zZXRMYXlvdXRDb3VudCA9IDE7CisgICAgICAgIHBpcGVsaW5lX2xheW91dF9jaS5wU2V0TGF5b3V0cyA9ICZkc19sYXlvdXQ7CisKKyAgICBWa1BpcGVsaW5lTGF5b3V0IHBpcGVsaW5lX2xheW91dDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLAorJnBpcGVsaW5lX2xheW91dCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc2hhZGVyU3RhZ2VzWzNdOworICAgIG1lbXNldCgmc2hhZGVyU3RhZ2VzLCAwLCAzICogc2l6ZW9mKFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8pKTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULAordGhpcyk7CisgICAgLy8gSnVzdCB1c2luZyBWUyB0eHQgZm9yIFRlc3Mgc2hhZGVycyBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGZ1bmN0aW9uYWxpdHkKKyAgICBWa1NoYWRlck9iagordGMobV9kZXZpY2UsYmluZFN0YXRlVmVydFNoYWRlclRleHQsVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCwKK3RoaXMpOworICAgIFZrU2hhZGVyT2JqCit0ZShtX2RldmljZSxiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCxWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklULAordGhpcyk7CisKKyAgICBzaGFkZXJTdGFnZXNbMF0uc1R5cGUgID0KK1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTzsKKyAgICBzaGFkZXJTdGFnZXNbMF0uc3RhZ2UgID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ7CisgICAgc2hhZGVyU3RhZ2VzWzBdLnNoYWRlciA9IHZzLmhhbmRsZSgpOworICAgIHNoYWRlclN0YWdlc1sxXS5zVHlwZSAgPQorVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgIHNoYWRlclN0YWdlc1sxXS5zdGFnZSAgPSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklUOworICAgIHNoYWRlclN0YWdlc1sxXS5zaGFkZXIgPSB0Yy5oYW5kbGUoKTsKKyAgICBzaGFkZXJTdGFnZXNbMl0uc1R5cGUgID0KK1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTzsKKyAgICBzaGFkZXJTdGFnZXNbMl0uc3RhZ2UgID0gVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVDsKKyAgICBzaGFkZXJTdGFnZXNbMl0uc2hhZGVyID0gdGUuaGFuZGxlKCk7CisKKyAgICBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyBpYUNJID0ge307CisgICAgICAgIGlhQ0kuc1R5cGUgPQorVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgICAgIGlhQ0kudG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVDsKKworICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gdHNDSSA9IHt9OworICAgICAgICB0c0NJLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPOworICAgICAgICB0c0NJLnBhdGNoQ29udHJvbFBvaW50cyA9IDA7IC8vIFRoaXMgd2lsbCBjYXVzZSBhbiBlcnJvcgorCisgICAgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBncF9jaSA9IHt9OworICAgICAgICBncF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPOworICAgICAgICBncF9jaS5wTmV4dCA9IE5VTEw7CisgICAgICAgIGdwX2NpLnN0YWdlQ291bnQgPSAzOworICAgICAgICBncF9jaS5wU3RhZ2VzID0gc2hhZGVyU3RhZ2VzOworICAgICAgICBncF9jaS5wVmVydGV4SW5wdXRTdGF0ZSA9IE5VTEw7CisgICAgICAgIGdwX2NpLnBJbnB1dEFzc2VtYmx5U3RhdGUgPSAmaWFDSTsKKyAgICAgICAgZ3BfY2kucFRlc3NlbGxhdGlvblN0YXRlID0gJnRzQ0k7CisgICAgICAgIGdwX2NpLnBWaWV3cG9ydFN0YXRlID0gTlVMTDsKKyAgICAgICAgZ3BfY2kucFJhc3Rlcml6YXRpb25TdGF0ZSA9IE5VTEw7CisgICAgICAgIGdwX2NpLnBNdWx0aXNhbXBsZVN0YXRlID0gTlVMTDsKKyAgICAgICAgZ3BfY2kucERlcHRoU3RlbmNpbFN0YXRlID0gTlVMTDsKKyAgICAgICAgZ3BfY2kucENvbG9yQmxlbmRTdGF0ZSA9IE5VTEw7CisgICAgICAgIGdwX2NpLmZsYWdzID0gVktfUElQRUxJTkVfQ1JFQVRFX0RJU0FCTEVfT1BUSU1JWkFUSU9OX0JJVDsKKyAgICAgICAgZ3BfY2kubGF5b3V0ID0gcGlwZWxpbmVfbGF5b3V0OworICAgICAgICBncF9jaS5yZW5kZXJQYXNzID0gcmVuZGVyUGFzcygpOworCisgICAgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBwY19jaSA9IHt9OworICAgICAgICBwY19jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NBQ0hFX0NSRUFURV9JTkZPOworICAgICAgICBwY19jaS5wTmV4dCA9IE5VTEw7CisgICAgICAgIHBjX2NpLmluaXRpYWxTaXplID0gMDsKKyAgICAgICAgcGNfY2kuaW5pdGlhbERhdGEgPSAwOworICAgICAgICBwY19jaS5tYXhTaXplID0gMDsKKworICAgIFZrUGlwZWxpbmUgcGlwZWxpbmU7CisgICAgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGU7CisKKyAgICBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVDYWNoZShtX2RldmljZS0+ZGV2aWNlKCksICZwY19jaSwgTlVMTCwKKyZwaXBlbGluZUNhY2hlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIGVyciA9IHZrOjpDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhtX2RldmljZS0+ZGV2aWNlKCksIHBpcGVsaW5lQ2FjaGUsIDEsCismZ3BfY2ksIE5VTEwsICZwaXBlbGluZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95UGlwZWxpbmVDYWNoZShtX2RldmljZS0+ZGV2aWNlKCksIHBpcGVsaW5lQ2FjaGUsIE5VTEwpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBwaXBlbGluZV9sYXlvdXQsIE5VTEwpOworICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGRzX2xheW91dCwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yUG9vbChtX2RldmljZS0+ZGV2aWNlKCksIGRzX3Bvb2wsIE5VTEwpOworfQorKi8KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBQU09WaWV3cG9ydFN0YXRlVGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyB2aWV3cG9ydCBhbmQgc2Npc3NvciBjb3VudCB2YWxpZGF0aW9uIGZvciBub24tbXVsdGlWaWV3cG9ydCIpOworCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGZlYXR1cmVze307CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgmZmVhdHVyZXMpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY29uc3QgYXV0byBicmVha192cF9zdGF0ZSA9IFtdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnJzX3N0YXRlX2NpXy5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA9IFZLX0ZBTFNFOworICAgICAgICBoZWxwZXIuZ3BfY2lfLnBWaWV3cG9ydFN0YXRlID0gbnVsbHB0cjsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgYnJlYWtfdnBfc3RhdGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlLTAwNzUwIik7CisKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAuMGYsIDAuMGYsIDY0LjBmLCA2NC4wZiwgMC4wZiwgMS4wZn07CisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHNbXSA9IHt2aWV3cG9ydCwgdmlld3BvcnR9OworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7NjQsIDY0fX07CisgICAgVmtSZWN0MkQgc2Npc3NvcnNbXSA9IHtzY2lzc29yLCBzY2lzc29yfTsKKworICAgIC8vIHRlc3Qgdmlld3BvcnQgYW5kIHNjaXNzb3IgYXJyYXlzCisgICAgdXNpbmcgc3RkOjp2ZWN0b3I7CisgICAgc3RydWN0IFRlc3RDYXNlIHsKKyAgICAgICAgdWludDMyX3Qgdmlld3BvcnRfY291bnQ7CisgICAgICAgIFZrVmlld3BvcnQgKnZpZXdwb3J0czsKKyAgICAgICAgdWludDMyX3Qgc2Npc3Nvcl9jb3VudDsKKyAgICAgICAgVmtSZWN0MkQgKnNjaXNzb3JzOworCisgICAgICAgIHZlY3RvcjxzdGQ6OnN0cmluZz4gdnVpZHM7CisgICAgfTsKKworICAgIHZlY3RvcjxUZXN0Q2FzZT4gdGVzdF9jYXNlcyA9IHsKKyAgICAgICAgezAsCisgICAgICAgICB2aWV3cG9ydHMsCisgICAgICAgICAxLAorICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAifX0sCisgICAgICAgIHsyLAorICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgMSwKKyAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LTAxMjE2IiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjIwIn19LAorICAgICAgICB7MSwKKyAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgIDAsCisgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjE3IiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjIwIn19LAorICAgICAgICB7MSwKKyAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgIDIsCisgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjE3IiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjIwIn19LAorICAgICAgICB7MCwKKyAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgIDAsCisgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC0wMTIxNiIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxNyJ9fSwKKyAgICAgICAgezIsCisgICAgICAgICB2aWV3cG9ydHMsCisgICAgICAgICAyLAorICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTcifX0sCisgICAgICAgIHswLAorICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgMiwKKyAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LTAxMjE2IiwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxNyIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIyMCJ9fSwKKyAgICAgICAgezIsCisgICAgICAgICB2aWV3cG9ydHMsCisgICAgICAgICAwLAorICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLCAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjE3IiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjIwIn19LAorICAgICAgICB7MSwgbnVsbHB0ciwgMSwgc2Npc3NvcnMsIHsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAwNzQ3In19LAorICAgICAgICB7MSwgdmlld3BvcnRzLCAxLCBudWxscHRyLCB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0OCJ9fSwKKyAgICAgICAgezEsCisgICAgICAgICBudWxscHRyLAorICAgICAgICAgMSwKKyAgICAgICAgIG51bGxwdHIsCisgICAgICAgICB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0NyIsICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDgifX0sCisgICAgICAgIHsyLAorICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgIDMsCisgICAgICAgICBudWxscHRyLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LTAxMjE2IiwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxNyIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIyMCIsICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDciLAorICAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDgifX0sCisgICAgICAgIHswLAorICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgIDAsCisgICAgICAgICBudWxscHRyLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LTAxMjE2IiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjE3In19LAorICAgIH07CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnRlc3RfY2FzZSA6IHRlc3RfY2FzZXMpIHsKKyAgICAgICAgY29uc3QgYXV0byBicmVha192cCA9IFsmdGVzdF9jYXNlXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnZpZXdwb3J0Q291bnQgPSB0ZXN0X2Nhc2Uudmlld3BvcnRfY291bnQ7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnBWaWV3cG9ydHMgPSB0ZXN0X2Nhc2Uudmlld3BvcnRzOworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5zY2lzc29yQ291bnQgPSB0ZXN0X2Nhc2Uuc2Npc3Nvcl9jb3VudDsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8ucFNjaXNzb3JzID0gdGVzdF9jYXNlLnNjaXNzb3JzOworICAgICAgICB9OworICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGJyZWFrX3ZwLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgdGVzdF9jYXNlLnZ1aWRzKTsKKyAgICB9CisKKyAgICB2ZWN0b3I8VGVzdENhc2U+IGR5bl90ZXN0X2Nhc2VzID0geworICAgICAgICB7MCwKKyAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgIDEsCisgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC0wMTIxNiIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIyMCJ9fSwKKyAgICAgICAgezIsCisgICAgICAgICB2aWV3cG9ydHMsCisgICAgICAgICAxLAorICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAifX0sCisgICAgICAgIHsxLAorICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgMCwKKyAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTciLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAifX0sCisgICAgICAgIHsxLAorICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgMiwKKyAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTciLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAifX0sCisgICAgICAgIHswLAorICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgMCwKKyAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LTAxMjE2IiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjE3In19LAorICAgICAgICB7MiwKKyAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgIDIsCisgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC0wMTIxNiIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxNyJ9fSwKKyAgICAgICAgezAsCisgICAgICAgICB2aWV3cG9ydHMsCisgICAgICAgICAyLAorICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLCAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjE3IiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjIwIn19LAorICAgICAgICB7MiwKKyAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgIDAsCisgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC0wMTIxNiIsICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTciLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAifX0sCisgICAgICAgIHsyLAorICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgIDMsCisgICAgICAgICBudWxscHRyLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LTAxMjE2IiwgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxNyIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIyMCJ9fSwKKyAgICAgICAgezAsCisgICAgICAgICBudWxscHRyLAorICAgICAgICAgMCwKKyAgICAgICAgIG51bGxwdHIsCisgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTYiLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTcifX0sCisgICAgfTsKKworICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bl9zdGF0ZXNbXSA9IHtWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1J9OworCisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0X2Nhc2UgOiBkeW5fdGVzdF9jYXNlcykgeworICAgICAgICBjb25zdCBhdXRvIGJyZWFrX3ZwID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGR5bl9zdGF0ZV9jaSA9IHt9OworICAgICAgICAgICAgZHluX3N0YXRlX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRFlOQU1JQ19TVEFURV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIGR5bl9zdGF0ZV9jaS5keW5hbWljU3RhdGVDb3VudCA9IHNpemUoZHluX3N0YXRlcyk7CisgICAgICAgICAgICBkeW5fc3RhdGVfY2kucER5bmFtaWNTdGF0ZXMgPSBkeW5fc3RhdGVzOworICAgICAgICAgICAgaGVscGVyLmR5bl9zdGF0ZV9jaV8gPSBkeW5fc3RhdGVfY2k7CisKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8udmlld3BvcnRDb3VudCA9IHRlc3RfY2FzZS52aWV3cG9ydF9jb3VudDsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8ucFZpZXdwb3J0cyA9IHRlc3RfY2FzZS52aWV3cG9ydHM7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnNjaXNzb3JDb3VudCA9IHRlc3RfY2FzZS5zY2lzc29yX2NvdW50OworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5wU2Npc3NvcnMgPSB0ZXN0X2Nhc2Uuc2Npc3NvcnM7CisgICAgICAgIH07CisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgYnJlYWtfdnAsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB0ZXN0X2Nhc2UudnVpZHMpOworICAgIH0KK30KKworLy8gU2V0IEV4dGVuc2lvbiBkeW5hbWljIHN0YXRlcyB3aXRob3V0IGVuYWJsaW5nIHRoZSByZXF1aXJlZCBFeHRlbnNpb25zLgorVEVTVF9GKFZrTGF5ZXJUZXN0LCBFeHRlbnNpb25EeW5hbWljU3RhdGVzU2V0V09FeHRlbnNpb25FbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgZ3JhcGhpY3MgcGlwZWxpbmUgd2l0aCBFeHRlbnNpb24gZHluYW1pYyBzdGF0ZXMgd2l0aG91dCBlbmFibGluZyB0aGUgcmVxdWlyZWQgRXh0ZW5zaW9ucy4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIHVzaW5nIHN0ZDo6dmVjdG9yOworICAgIHN0cnVjdCBUZXN0Q2FzZSB7CisgICAgICAgIHVpbnQzMl90IGR5bmFtaWNfc3RhdGVfY291bnQ7CisgICAgICAgIFZrRHluYW1pY1N0YXRlIGR5bmFtaWNfc3RhdGU7CisKKyAgICAgICAgY2hhciBjb25zdCAqZXJybXNnOworICAgIH07CisKKyAgICB2ZWN0b3I8VGVzdENhc2U+IGR5bl90ZXN0X2Nhc2VzID0geworICAgICAgICB7MSwgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9XX1NDQUxJTkdfTlYsCisgICAgICAgICAiY29udGFpbnMgVktfRFlOQU1JQ19TVEFURV9WSUVXUE9SVF9XX1NDQUxJTkdfTlYsIGJ1dCBWS19OVl9jbGlwX3NwYWNlX3dfc2NhbGluZyJ9LAorICAgICAgICB7MSwgVktfRFlOQU1JQ19TVEFURV9ESVNDQVJEX1JFQ1RBTkdMRV9FWFQsCisgICAgICAgICAiY29udGFpbnMgVktfRFlOQU1JQ19TVEFURV9ESVNDQVJEX1JFQ1RBTkdMRV9FWFQsIGJ1dCBWS19FWFRfZGlzY2FyZF9yZWN0YW5nbGVzIn0sCisgICAgICAgIHsxLCBWS19EWU5BTUlDX1NUQVRFX1NBTVBMRV9MT0NBVElPTlNfRVhULCAiY29udGFpbnMgVktfRFlOQU1JQ19TVEFURV9TQU1QTEVfTE9DQVRJT05TX0VYVCwgYnV0IFZLX0VYVF9zYW1wbGVfbG9jYXRpb25zIn0sCisgICAgfTsKKworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdF9jYXNlIDogZHluX3Rlc3RfY2FzZXMpIHsKKyAgICAgICAgVmtEeW5hbWljU3RhdGUgc3RhdGVbMV07CisgICAgICAgIHN0YXRlWzBdID0gdGVzdF9jYXNlLmR5bmFtaWNfc3RhdGU7CisgICAgICAgIGNvbnN0IGF1dG8gYnJlYWtfdnAgPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gZHluX3N0YXRlX2NpID0ge307CisgICAgICAgICAgICBkeW5fc3RhdGVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9EWU5BTUlDX1NUQVRFX0NSRUFURV9JTkZPOworICAgICAgICAgICAgZHluX3N0YXRlX2NpLmR5bmFtaWNTdGF0ZUNvdW50ID0gdGVzdF9jYXNlLmR5bmFtaWNfc3RhdGVfY291bnQ7CisgICAgICAgICAgICBkeW5fc3RhdGVfY2kucER5bmFtaWNTdGF0ZXMgPSBzdGF0ZTsKKyAgICAgICAgICAgIGhlbHBlci5keW5fc3RhdGVfY2lfID0gZHluX3N0YXRlX2NpOworICAgICAgICB9OworICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGJyZWFrX3ZwLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgdGVzdF9jYXNlLmVycm1zZyk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFBTT1ZpZXdwb3J0U3RhdGVNdWx0aVZpZXdwb3J0VGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyB2aWV3cG9ydCBhbmQgc2Npc3NvciBjb3VudCB2YWxpZGF0aW9uIGZvciBtdWx0aVZpZXdwb3J0IGZlYXR1cmUiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7ICAvLyBlbmFibGVzIGFsbCBzdXBwb3J0ZWQgZmVhdHVyZXMKKworICAgIGlmICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkubXVsdGlWaWV3cG9ydCkgeworICAgICAgICBwcmludGYoIiVzIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6bXVsdGlWaWV3cG9ydCBpcyBub3Qgc3VwcG9ydGVkIC0tIHNraXBwaW5nIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gYXQgbGVhc3QgMTYgdmlld3BvcnRzIHN1cHBvcnRlZCBmcm9tIGhlcmUgb24KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAuMGYsIDAuMGYsIDY0LjBmLCA2NC4wZiwgMC4wZiwgMS4wZn07CisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHNbXSA9IHt2aWV3cG9ydCwgdmlld3BvcnR9OworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7NjQsIDY0fX07CisgICAgVmtSZWN0MkQgc2Npc3NvcnNbXSA9IHtzY2lzc29yLCBzY2lzc29yfTsKKworICAgIHVzaW5nIHN0ZDo6dmVjdG9yOworICAgIHN0cnVjdCBUZXN0Q2FzZSB7CisgICAgICAgIHVpbnQzMl90IHZpZXdwb3J0X2NvdW50OworICAgICAgICBWa1ZpZXdwb3J0ICp2aWV3cG9ydHM7CisgICAgICAgIHVpbnQzMl90IHNjaXNzb3JfY291bnQ7CisgICAgICAgIFZrUmVjdDJEICpzY2lzc29yczsKKworICAgICAgICB2ZWN0b3I8c3RkOjpzdHJpbmc+IHZ1aWRzOworICAgIH07CisKKyAgICB2ZWN0b3I8VGVzdENhc2U+IHRlc3RfY2FzZXMgPSB7CisgICAgICAgIHswLAorICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgMiwKKyAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjIwIn19LAorICAgICAgICB7MiwKKyAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgIDAsCisgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjIwIn19LAorICAgICAgICB7MCwKKyAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgIDAsCisgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCJ9fSwKKyAgICAgICAgezIsIG51bGxwdHIsIDIsIHNjaXNzb3JzLCB7IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0NyJ9fSwKKyAgICAgICAgezIsIHZpZXdwb3J0cywgMiwgbnVsbHB0ciwgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDgifX0sCisgICAgICAgIHsyLAorICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgIDIsCisgICAgICAgICBudWxscHRyLAorICAgICAgICAgeyJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDciLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAwNzQ4In19LAorICAgICAgICB7MCwKKyAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAwLAorICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCJ9fSwKKyAgICB9OworCisgICAgY29uc3QgYXV0byBtYXhfdmlld3BvcnRzID0gbV9kZXZpY2UtPnBoeSgpLnByb3BlcnRpZXMoKS5saW1pdHMubWF4Vmlld3BvcnRzOworICAgIGNvbnN0IGJvb2wgbWF4X3ZpZXdwb3J0c19tYXh4ZWQgPSBtYXhfdmlld3BvcnRzID09IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUobWF4X3ZpZXdwb3J0cyk+OjptYXgoKTsKKyAgICBpZiAobWF4X3ZpZXdwb3J0c19tYXh4ZWQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWaWV3cG9ydHMgaXMgVUlOVDMyX01BWCAtLSBza2lwcGluZyBwYXJ0IG9mIHRlc3QgcmVxdWlyaW5nIHRvIGV4Y2VlZCBtYXhWaWV3cG9ydHMuXG4iLAorICAgICAgICAgICAgICAga1NraXBQcmVmaXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGF1dG8gdG9vX211Y2hfdmlld3BvcnRzID0gbWF4X3ZpZXdwb3J0cyArIDE7CisgICAgICAgIC8vIGF2b2lkIHBvdGVudGlhbGx5IGJpZyBhbGxvY2F0aW9ucyBieSB1c2luZyBvbmx5IG51bGxwdHIKKyAgICAgICAgdGVzdF9jYXNlcy5wdXNoX2JhY2soe3Rvb19tdWNoX3ZpZXdwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcER5bmFtaWNTdGF0ZXMtMDA3NDcifX0pOworICAgICAgICB0ZXN0X2Nhc2VzLnB1c2hfYmFjayh7MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb19tdWNoX3ZpZXdwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIyMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0OCJ9fSk7CisgICAgICAgIHRlc3RfY2FzZXMucHVzaF9iYWNrKAorICAgICAgICAgICAge3Rvb19tdWNoX3ZpZXdwb3J0cywKKyAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgIHRvb19tdWNoX3ZpZXdwb3J0cywKKyAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC0wMTIxOCIsCisgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTkiLCAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAwNzQ3IiwKKyAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wRHluYW1pY1N0YXRlcy0wMDc0OCJ9fSk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0X2Nhc2UgOiB0ZXN0X2Nhc2VzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gYnJlYWtfdnAgPSBbJnRlc3RfY2FzZV0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy52aWV3cG9ydENvdW50ID0gdGVzdF9jYXNlLnZpZXdwb3J0X2NvdW50OworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5wVmlld3BvcnRzID0gdGVzdF9jYXNlLnZpZXdwb3J0czsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8uc2Npc3NvckNvdW50ID0gdGVzdF9jYXNlLnNjaXNzb3JfY291bnQ7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnBTY2lzc29ycyA9IHRlc3RfY2FzZS5zY2lzc29yczsKKyAgICAgICAgfTsKKyAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBicmVha192cCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIHRlc3RfY2FzZS52dWlkcyk7CisgICAgfQorCisgICAgdmVjdG9yPFRlc3RDYXNlPiBkeW5fdGVzdF9jYXNlcyA9IHsKKyAgICAgICAgezAsCisgICAgICAgICB2aWV3cG9ydHMsCisgICAgICAgICAyLAorICAgICAgICAgc2Npc3NvcnMsCisgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAifX0sCisgICAgICAgIHsyLAorICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgMCwKKyAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtYXJyYXlsZW5ndGgiLAorICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAifX0sCisgICAgICAgIHswLAorICAgICAgICAgdmlld3BvcnRzLAorICAgICAgICAgMCwKKyAgICAgICAgIHNjaXNzb3JzLAorICAgICAgICAgeyJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby12aWV3cG9ydENvdW50LWFycmF5bGVuZ3RoIiwKKyAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LWFycmF5bGVuZ3RoIn19LAorICAgICAgICB7MCwKKyAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAwLAorICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC1hcnJheWxlbmd0aCIsCisgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC1hcnJheWxlbmd0aCJ9fSwKKyAgICB9OworCisgICAgaWYgKCFtYXhfdmlld3BvcnRzX21heHhlZCkgeworICAgICAgICBjb25zdCBhdXRvIHRvb19tdWNoX3ZpZXdwb3J0cyA9IG1heF92aWV3cG9ydHMgKyAxOworICAgICAgICAvLyBhdm9pZCBwb3RlbnRpYWxseSBiaWcgYWxsb2NhdGlvbnMgYnkgdXNpbmcgb25seSBudWxscHRyCisgICAgICAgIGR5bl90ZXN0X2Nhc2VzLnB1c2hfYmFjayh7dG9vX211Y2hfdmlld3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lzc29ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXZpZXdwb3J0Q291bnQtMDEyMTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tc2Npc3NvckNvdW50LTAxMjIwIn19KTsKKyAgICAgICAgZHluX3Rlc3RfY2FzZXMucHVzaF9iYWNrKHsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29fbXVjaF92aWV3cG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvLXNjaXNzb3JDb3VudC0wMTIxOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMjAifX0pOworICAgICAgICBkeW5fdGVzdF9jYXNlcy5wdXNoX2JhY2soe3Rvb19tdWNoX3ZpZXdwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb19tdWNoX3ZpZXdwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiVlVJRC1Wa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8tdmlld3BvcnRDb3VudC0wMTIxOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mby1zY2lzc29yQ291bnQtMDEyMTkifX0pOworICAgIH0KKworICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bl9zdGF0ZXNbXSA9IHtWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JULCBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1J9OworCisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0X2Nhc2UgOiBkeW5fdGVzdF9jYXNlcykgeworICAgICAgICBjb25zdCBhdXRvIGJyZWFrX3ZwID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIGR5bl9zdGF0ZV9jaSA9IHt9OworICAgICAgICAgICAgZHluX3N0YXRlX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfRFlOQU1JQ19TVEFURV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIGR5bl9zdGF0ZV9jaS5keW5hbWljU3RhdGVDb3VudCA9IHNpemUoZHluX3N0YXRlcyk7CisgICAgICAgICAgICBkeW5fc3RhdGVfY2kucER5bmFtaWNTdGF0ZXMgPSBkeW5fc3RhdGVzOworICAgICAgICAgICAgaGVscGVyLmR5bl9zdGF0ZV9jaV8gPSBkeW5fc3RhdGVfY2k7CisKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8udmlld3BvcnRDb3VudCA9IHRlc3RfY2FzZS52aWV3cG9ydF9jb3VudDsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8ucFZpZXdwb3J0cyA9IHRlc3RfY2FzZS52aWV3cG9ydHM7CisgICAgICAgICAgICBoZWxwZXIudnBfc3RhdGVfY2lfLnNjaXNzb3JDb3VudCA9IHRlc3RfY2FzZS5zY2lzc29yX2NvdW50OworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5wU2Npc3NvcnMgPSB0ZXN0X2Nhc2Uuc2Npc3NvcnM7CisgICAgICAgIH07CisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgYnJlYWtfdnAsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCB0ZXN0X2Nhc2UudnVpZHMpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBEeW5WaWV3cG9ydEFuZFNjaXNzb3JVbmRlZmluZWREcmF3U3RhdGUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHZpZXdwb3J0IGFuZCBzY2lzc29yIGR5bmFtaWMgc3RhdGUgdGhhdCBpcyBub3Qgc2V0IGJlZm9yZSBkcmF3Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgLy8gVE9ETzogc2hvdWxkIGFsc28gdGVzdCBvbiAhbXVsdGlWaWV3cG9ydAorICAgIGlmICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkubXVsdGlWaWV3cG9ydCkgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHZpZXdwb3J0cy9zY2lzc29yczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZWxpbmVfZHluX3ZwKG1fZGV2aWNlKTsKKyAgICBwaXBlbGluZV9keW5fdnAuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZWxpbmVfZHluX3ZwLkFkZFNoYWRlcigmZnMpOworICAgIHBpcGVsaW5lX2R5bl92cC5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZWxpbmVfZHluX3ZwLk1ha2VEeW5hbWljKFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQpOworICAgIHBpcGVsaW5lX2R5bl92cC5TZXRTY2lzc29yKG1fc2Npc3NvcnMpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHBpcGVsaW5lX2R5bl92cC5DcmVhdGVWS1BpcGVsaW5lKHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgbV9yZW5kZXJQYXNzKSk7CisKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGVsaW5lX2R5bl9zYyhtX2RldmljZSk7CisgICAgcGlwZWxpbmVfZHluX3NjLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGVsaW5lX2R5bl9zYy5BZGRTaGFkZXIoJmZzKTsKKyAgICBwaXBlbGluZV9keW5fc2MuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIHBpcGVsaW5lX2R5bl9zYy5TZXRWaWV3cG9ydChtX3ZpZXdwb3J0cyk7CisgICAgcGlwZWxpbmVfZHluX3NjLk1ha2VEeW5hbWljKFZLX0RZTkFNSUNfU1RBVEVfU0NJU1NPUik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MocGlwZWxpbmVfZHluX3NjLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCBtX3JlbmRlclBhc3MpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHluYW1pYyB2aWV3cG9ydChzKSAwIGFyZSB1c2VkIGJ5IHBpcGVsaW5lIHN0YXRlIG9iamVjdCwgIik7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZV9keW5fdnAuaGFuZGxlKCkpOworICAgIHZrOjpDbWRTZXRWaWV3cG9ydChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAmbV92aWV3cG9ydHNbMF0pOyAgLy8gRm9yZ2V0dGluZyB0byBzZXQgbmVlZGVkIDB0aCB2aWV3cG9ydCAoUFNPIHZpZXdwb3J0Q291bnQgPT0gMSkKKyAgICBtX2NvbW1hbmRCdWZmZXItPkRyYXcoMSwgMCwgMCwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJEeW5hbWljIHNjaXNzb3IocykgMCBhcmUgdXNlZCBieSBwaXBlbGluZSBzdGF0ZSBvYmplY3QsICIpOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfZHluX3NjLmhhbmRsZSgpKTsKKyAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICZtX3NjaXNzb3JzWzBdKTsgIC8vIEZvcmdldHRpbmcgdG8gc2V0IG5lZWRlZCAwdGggc2Npc3NvciAoUFNPIHNjaXNzb3JDb3VudCA9PSAxKQorICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgUFNPTGluZVdpZHRoSW52YWxpZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3Qgbm9uLTEuMCBsaW5lV2lkdGggZXJyb3JzIHdoZW4gcGlwZWxpbmUgaXMgY3JlYXRlZCBhbmQgaW4gdmtDbWRTZXRMaW5lV2lkdGgiKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdHVyZXN7fTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCZmZWF0dXJlcykpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gdGVzdF9jYXNlcyA9IHstMS4wZiwgMC4wZiwgTmVhcmVzdFNtYWxsZXIoMS4wZiksIE5lYXJlc3RHcmVhdGVyKDEuMGYpLCBOQU59OworCisgICAgLy8gdGVzdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbzo6bGluZVdpZHRoCisgICAgZm9yIChjb25zdCBhdXRvIHRlc3RfY2FzZSA6IHRlc3RfY2FzZXMpIHsKKyAgICAgICAgY29uc3QgYXV0byBzZXRfbGluZVdpZHRoID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsgaGVscGVyLnJzX3N0YXRlX2NpXy5saW5lV2lkdGggPSB0ZXN0X2Nhc2U7IH07CisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2xpbmVXaWR0aCwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXBEeW5hbWljU3RhdGVzLTAwNzQ5Iik7CisgICAgfQorCisgICAgLy8gdGVzdCB2azo6Q21kU2V0TGluZVdpZHRoCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgZm9yIChjb25zdCBhdXRvIHRlc3RfY2FzZSA6IHRlc3RfY2FzZXMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFNldExpbmVXaWR0aC1saW5lV2lkdGgtMDA3ODgiKTsKKyAgICAgICAgdms6OkNtZFNldExpbmVXaWR0aChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCB0ZXN0X2Nhc2UpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgVlVJRF9Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uX2JpbmRpbmdfMDA2MTgpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCBWVUlELVZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24tYmluZGluZy0wMDYxODogYmluZGluZyBtdXN0IGJlIGxlc3MgdGhhbiAiCisgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBUZXN0IHdoZW4gYmluZGluZyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRCaW5kaW5ncy4KKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIHZlcnRleF9pbnB1dF9iaW5kaW5nX2Rlc2NyaXB0aW9ue307CisgICAgdmVydGV4X2lucHV0X2JpbmRpbmdfZGVzY3JpcHRpb24uYmluZGluZyA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4VmVydGV4SW5wdXRCaW5kaW5nczsKKworICAgIGNvbnN0IGF1dG8gc2V0X2JpbmRpbmcgPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIudmlfY2lfLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gJnZlcnRleF9pbnB1dF9iaW5kaW5nX2Rlc2NyaXB0aW9uOworICAgICAgICBoZWxwZXIudmlfY2lfLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2JpbmRpbmcsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLWJpbmRpbmctMDA2MTgiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWVUlEX1ZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb25fc3RyaWRlXzAwNjE5KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgVlVJRC1Wa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLXN0cmlkZS0wMDYxOTogc3RyaWRlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIKKyAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gVGVzdCB3aGVuIHN0cmlkZSBpcyBncmVhdGVyIHRoYW4gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRCaW5kaW5nU3RyaWRlLgorICAgIFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gdmVydGV4X2lucHV0X2JpbmRpbmdfZGVzY3JpcHRpb257fTsKKyAgICB2ZXJ0ZXhfaW5wdXRfYmluZGluZ19kZXNjcmlwdGlvbi5zdHJpZGUgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heFZlcnRleElucHV0QmluZGluZ1N0cmlkZSArIDE7CisKKyAgICBjb25zdCBhdXRvIHNldF9iaW5kaW5nID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9ICZ2ZXJ0ZXhfaW5wdXRfYmluZGluZ19kZXNjcmlwdGlvbjsKKyAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IDE7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9iaW5kaW5nLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbi1zdHJpZGUtMDA2MTkiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWVUlEX1ZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbl9sb2NhdGlvbl8wMDYyMCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IFZVSUQtVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uLWxvY2F0aW9uLTAwNjIwOiBsb2NhdGlvbiBtdXN0IGJlIGxlc3MgdGhhbiAiCisgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIFRlc3Qgd2hlbiBsb2NhdGlvbiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzLgorICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiB2ZXJ0ZXhfaW5wdXRfYXR0cmlidXRlX2Rlc2NyaXB0aW9ue307CisgICAgdmVydGV4X2lucHV0X2F0dHJpYnV0ZV9kZXNjcmlwdGlvbi5sb2NhdGlvbiA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVzOworCisgICAgY29uc3QgYXV0byBzZXRfYXR0cmlidXRlID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gJnZlcnRleF9pbnB1dF9hdHRyaWJ1dGVfZGVzY3JpcHRpb247CisgICAgICAgIGhlbHBlci52aV9jaV8udmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCA9IDE7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9hdHRyaWJ1dGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPnsiVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tbG9jYXRpb24tMDA2MjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tYmluZGluZy0wMDYxNSJ9KTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWVUlEX1ZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbl9iaW5kaW5nXzAwNjIxKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgVlVJRC1Wa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24tYmluZGluZy0wMDYyMTogYmluZGluZyBtdXN0IGJlIGxlc3MgdGhhbiAiCisgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBUZXN0IHdoZW4gYmluZGluZyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4SW5wdXRCaW5kaW5ncy4KKyAgICBWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gdmVydGV4X2lucHV0X2F0dHJpYnV0ZV9kZXNjcmlwdGlvbnt9OworICAgIHZlcnRleF9pbnB1dF9hdHRyaWJ1dGVfZGVzY3JpcHRpb24uYmluZGluZyA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4VmVydGV4SW5wdXRCaW5kaW5nczsKKworICAgIGNvbnN0IGF1dG8gc2V0X2F0dHJpYnV0ZSA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci52aV9jaV8ucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9ICZ2ZXJ0ZXhfaW5wdXRfYXR0cmlidXRlX2Rlc2NyaXB0aW9uOworICAgICAgICBoZWxwZXIudmlfY2lfLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSAxOworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfYXR0cmlidXRlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz57IlZVSUQtVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uLWJpbmRpbmctMDA2MjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tYmluZGluZy0wMDYxNSJ9KTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWVUlEX1ZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbl9vZmZzZXRfMDA2MjIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCBWVUlELVZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbi1vZmZzZXQtMDA2MjI6IG9mZnNldCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiCisgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldCIpOworCisgICAgRW5hYmxlRGV2aWNlUHJvZmlsZUxheWVyKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIHVpbnQzMl90IG1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0ID0gMDsKKyAgICB7CisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIGRldmljZV9wcm9wcyA9IHt9OworICAgICAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKGdwdSgpLCAmZGV2aWNlX3Byb3BzKTsKKyAgICAgICAgbWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQgPSBkZXZpY2VfcHJvcHMubGltaXRzLm1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0OworICAgICAgICBpZiAobWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQgPT0gMHhGRkZGRkZGRikgeworICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBhcnRpZmljaWFsbHkgbG93ZXIgbWF4aW11bSBvZmZzZXQKKyAgICAgICAgICAgIFBGTl92a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIGZwdmtTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVCA9CisgICAgICAgICAgICAgICAgKFBGTl92a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUIik7CisgICAgICAgICAgICBpZiAoIWZwdmtTZXRQaHlzaWNhbERldmljZUxpbWl0c0VYVCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgQWxsIG9mZnNldHMgYXJlIHZhbGlkICYgZGV2aWNlX3Byb2ZpbGVfYXBpIG5vdCBmb3VuZDsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2VfcHJvcHMubGltaXRzLm1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0ID0gZGV2aWNlX3Byb3BzLmxpbWl0cy5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGUgLSAyOworICAgICAgICAgICAgZnB2a1NldFBoeXNpY2FsRGV2aWNlTGltaXRzRVhUKGdwdSgpLCAmZGV2aWNlX3Byb3BzLmxpbWl0cyk7CisgICAgICAgICAgICBtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZU9mZnNldCA9IGRldmljZV9wcm9wcy5saW1pdHMubWF4VmVydGV4SW5wdXRBdHRyaWJ1dGVPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIHZlcnRleF9pbnB1dF9iaW5kaW5nX2Rlc2NyaXB0aW9ue307CisgICAgdmVydGV4X2lucHV0X2JpbmRpbmdfZGVzY3JpcHRpb24uYmluZGluZyA9IDA7CisgICAgdmVydGV4X2lucHV0X2JpbmRpbmdfZGVzY3JpcHRpb24uc3RyaWRlID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdTdHJpZGU7CisgICAgdmVydGV4X2lucHV0X2JpbmRpbmdfZGVzY3JpcHRpb24uaW5wdXRSYXRlID0gVktfVkVSVEVYX0lOUFVUX1JBVEVfVkVSVEVYOworICAgIC8vIFRlc3Qgd2hlbiBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0uCisgICAgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIHZlcnRleF9pbnB1dF9hdHRyaWJ1dGVfZGVzY3JpcHRpb257fTsKKyAgICB2ZXJ0ZXhfaW5wdXRfYXR0cmlidXRlX2Rlc2NyaXB0aW9uLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOF9VTk9STTsKKyAgICB2ZXJ0ZXhfaW5wdXRfYXR0cmlidXRlX2Rlc2NyaXB0aW9uLm9mZnNldCA9IG1heFZlcnRleElucHV0QXR0cmlidXRlT2Zmc2V0ICsgMTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2F0dHJpYnV0ZSA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci52aV9jaV8ucFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgPSAmdmVydGV4X2lucHV0X2JpbmRpbmdfZGVzY3JpcHRpb247CisgICAgICAgIGhlbHBlci52aV9jaV8udmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSAxOworICAgICAgICBoZWxwZXIudmlfY2lfLnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgPSAmdmVydGV4X2lucHV0X2F0dHJpYnV0ZV9kZXNjcmlwdGlvbjsKKyAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2F0dHJpYnV0ZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbi1vZmZzZXQtMDA2MjIiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBOdW1TYW1wbGVzTWlzbWF0Y2gpIHsKKyAgICAvLyBDcmVhdGUgQ29tbWFuZEJ1ZmZlciB3aGVyZSBNU0FBIHNhbXBsZXMgZG9lc24ndCBtYXRjaCBSZW5kZXJQYXNzCisgICAgLy8gc2FtcGxlQ291bnQKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJOdW0gc2FtcGxlcyBtaXNtYXRjaCEgIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIHBpcGVfbXNfc3RhdGVfY2kgPSB7fTsKKyAgICBwaXBlX21zX3N0YXRlX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTVVMVElTQU1QTEVfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgcGlwZV9tc19zdGF0ZV9jaS5wTmV4dCA9IE5VTEw7CisgICAgcGlwZV9tc19zdGF0ZV9jaS5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKyAgICBwaXBlX21zX3N0YXRlX2NpLnNhbXBsZVNoYWRpbmdFbmFibGUgPSAwOworICAgIHBpcGVfbXNfc3RhdGVfY2kubWluU2FtcGxlU2hhZGluZyA9IDEuMDsKKyAgICBwaXBlX21zX3N0YXRlX2NpLnBTYW1wbGVNYXNrID0gTlVMTDsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRlc2NyaXB0b3Jfc2V0LmxheW91dF99KTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7ICAvLyBXZSBzaG91bGRuJ3QgbmVlZCBhIGZyYWdtZW50IHNoYWRlcgorICAgIC8vIGJ1dCBhZGQgaXQgdG8gYmUgYWJsZSB0byBydW4gb24gbW9yZSBkZXZpY2VzCisgICAgVmtQaXBlbGluZU9iaiBwaXBlKG1fZGV2aWNlKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZS5TZXRNU0FBKCZwaXBlX21zX3N0YXRlX2NpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAwNzU3Iik7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgcmVuZGVyUGFzcygpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAsIDAsIDE2LCAxNiwgMCwgMX07CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgVmtSZWN0MkQgc2Npc3NvciA9IHt7MCwgMH0sIHsxNiwgMTZ9fTsKKyAgICB2azo6Q21kU2V0U2Npc3NvcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAwLCAxLCAmc2Npc3Nvcik7CisKKyAgICAvLyBSZW5kZXIgdHJpYW5nbGUgKHRoZSBlcnJvciBzaG91bGQgdHJpZ2dlciBvbiB0aGUgYXR0ZW1wdCB0byBkcmF3KS4KKyAgICBtX2NvbW1hbmRCdWZmZXItPkRyYXcoMywgMSwgMCwgMCk7CisKKyAgICAvLyBGaW5hbGl6ZSByZWNvcmRpbmcgb2YgdGhlIGNvbW1hbmQgYnVmZmVyCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIE51bUJsZW5kQXR0YWNoTWlzbWF0Y2gpIHsKKyAgICAvLyBDcmVhdGUgUGlwZWxpbmUgd2hlcmUgdGhlIG51bWJlciBvZiBibGVuZCBhdHRhY2htZW50cyBkb2Vzbid0IG1hdGNoIHRoZQorICAgIC8vIG51bWJlciBvZiBjb2xvciBhdHRhY2htZW50cy4gIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3QgYWRkIGFueSBjb2xvcgorICAgIC8vIGJsZW5kIGF0dGFjaG1lbnRzIGV2ZW4gdGhvdWdoIHdlIGhhdmUgYSBjb2xvciBhdHRhY2htZW50LgorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIHBpcGVfbXNfc3RhdGVfY2kgPSB7fTsKKyAgICBwaXBlX21zX3N0YXRlX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTVVMVElTQU1QTEVfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgcGlwZV9tc19zdGF0ZV9jaS5wTmV4dCA9IE5VTEw7CisgICAgcGlwZV9tc19zdGF0ZV9jaS5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBwaXBlX21zX3N0YXRlX2NpLnNhbXBsZVNoYWRpbmdFbmFibGUgPSAwOworICAgIHBpcGVfbXNfc3RhdGVfY2kubWluU2FtcGxlU2hhZGluZyA9IDEuMDsKKyAgICBwaXBlX21zX3N0YXRlX2NpLnBTYW1wbGVNYXNrID0gTlVMTDsKKworICAgIGNvbnN0IGF1dG8gc2V0X01TQUEgPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIucGlwZV9tc19zdGF0ZV9jaV8gPSBwaXBlX21zX3N0YXRlX2NpOworICAgICAgICBoZWxwZXIuY2JfY2lfLmF0dGFjaG1lbnRDb3VudCA9IDA7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9NU0FBLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1hdHRhY2htZW50Q291bnQtMDA3NDYiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDbWRDbGVhckF0dGFjaG1lbnRUZXN0cykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZhcmlvdXMgdGVzdHMgZm9yIHZhbGlkYXRpbmcgdXNhZ2Ugb2YgdmtDbWRDbGVhckF0dGFjaG1lbnRzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKworICAgIC8vIE1haW4gdGhpbmcgd2UgY2FyZSBhYm91dCBmb3IgdGhpcyB0ZXN0IGlzIHRoYXQgdGhlIFZrSW1hZ2Ugb2JqIHdlJ3JlCisgICAgLy8gY2xlYXJpbmcgbWF0Y2hlcyBDb2xvciBBdHRhY2htZW50IG9mIEZCCisgICAgLy8gIEFsc28gcGFzcyBkb3duIG90aGVyIGR1bW15IHBhcmFtcyB0byBrZWVwIGRyaXZlciBhbmQgcGFyYW1jaGVja2VyIGhhcHB5CisgICAgVmtDbGVhckF0dGFjaG1lbnQgY29sb3JfYXR0YWNobWVudDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzBdID0gMS4wOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzFdID0gMS4wOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzJdID0gMS4wOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzNdID0gMS4wOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY29sb3JBdHRhY2htZW50ID0gMDsKKyAgICBWa0NsZWFyUmVjdCBjbGVhcl9yZWN0ID0ge3t7MCwgMH0sIHsodWludDMyX3QpbV93aWR0aCwgKHVpbnQzMl90KW1faGVpZ2h0fX0sIDAsIDF9OworCisgICAgY2xlYXJfcmVjdC5yZWN0LmV4dGVudC53aWR0aCA9IHJlbmRlclBhc3NCZWdpbkluZm8oKS5yZW5kZXJBcmVhLmV4dGVudC53aWR0aCArIDQ7CisgICAgY2xlYXJfcmVjdC5yZWN0LmV4dGVudC5oZWlnaHQgPSBjbGVhcl9yZWN0LnJlY3QuZXh0ZW50LmhlaWdodCAvIDI7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZENsZWFyQXR0YWNobWVudHMtcFJlY3RzLTAwMDE2Iik7CisgICAgdms6OkNtZENsZWFyQXR0YWNobWVudHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJmNvbG9yX2F0dGFjaG1lbnQsIDEsICZjbGVhcl9yZWN0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIC8vIGJhc2VMYXllciA+PSB2aWV3IGxheWVycworICAgIGNsZWFyX3JlY3QucmVjdC5leHRlbnQud2lkdGggPSAodWludDMyX3QpbV93aWR0aDsKKyAgICBjbGVhcl9yZWN0LmJhc2VBcnJheUxheWVyID0gMTsKKyAgICBjbGVhcl9yZWN0LmxheWVyQ291bnQgPSAxOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtdmtDbWRDbGVhckF0dGFjaG1lbnRzLXBSZWN0cy0wMDAxNyIpOworICAgIHZrOjpDbWRDbGVhckF0dGFjaG1lbnRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZjb2xvcl9hdHRhY2htZW50LCAxLCAmY2xlYXJfcmVjdCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICAvLyBiYXNlTGF5ZXIgKyBsYXllckNvdW50ID4gdmlldyBsYXllcnMKKyAgICBjbGVhcl9yZWN0LnJlY3QuZXh0ZW50LndpZHRoID0gKHVpbnQzMl90KW1fd2lkdGg7CisgICAgY2xlYXJfcmVjdC5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY2xlYXJfcmVjdC5sYXllckNvdW50ID0gMjsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kQ2xlYXJBdHRhY2htZW50cy1wUmVjdHMtMDAwMTciKTsKKyAgICB2azo6Q21kQ2xlYXJBdHRhY2htZW50cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmY29sb3JfYXR0YWNobWVudCwgMSwgJmNsZWFyX3JlY3QpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBWdHhCdWZmZXJCYWRJbmRleCkgeworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfUEVSRk9STUFOQ0VfV0FSTklOR19CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1EcmF3U3RhdGUtVnR4SW5kZXhPdXRPZkJvdW5kcyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyBwaXBlX21zX3N0YXRlX2NpID0ge307CisgICAgcGlwZV9tc19zdGF0ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX01VTFRJU0FNUExFX1NUQVRFX0NSRUFURV9JTkZPOworICAgIHBpcGVfbXNfc3RhdGVfY2kucE5leHQgPSBOVUxMOworICAgIHBpcGVfbXNfc3RhdGVfY2kucmFzdGVyaXphdGlvblNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgcGlwZV9tc19zdGF0ZV9jaS5zYW1wbGVTaGFkaW5nRW5hYmxlID0gMDsKKyAgICBwaXBlX21zX3N0YXRlX2NpLm1pblNhbXBsZVNoYWRpbmcgPSAxLjA7CisgICAgcGlwZV9tc19zdGF0ZV9jaS5wU2FtcGxlTWFzayA9IE5VTEw7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5waXBlX21zX3N0YXRlX2NpXyA9IHBpcGVfbXNfc3RhdGVfY2k7CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV8pOworICAgIC8vIERvbid0IGNhcmUgYWJvdXQgYWN0dWFsIGRhdGEsIGp1c3QgbmVlZCB0byBnZXQgdG8gZHJhdyB0byBmbGFnIGVycm9yCisgICAgY29uc3QgZmxvYXQgdmJvX2RhdGFbM10gPSB7MS5mLCAwLmYsIDEuZn07CisgICAgVmtDb25zdGFudEJ1ZmZlck9iaiB2Ym8obV9kZXZpY2UsIHNpemVvZih2Ym9fZGF0YSksIChjb25zdCB2b2lkICopJnZib19kYXRhLCBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmluZFZlcnRleEJ1ZmZlcigmdmJvLCAoVmtEZXZpY2VTaXplKTAsIDEpOyAgLy8gVkJPIGlkeCAxLCBidXQgbm8gVkJPIGluIFBTTworICAgIG1fY29tbWFuZEJ1ZmZlci0+RHJhdygxLCAwLCAwLCAwKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJBdHRlbXB0IHRvIGNyZWF0ZSBhIGdyYXBoaWNzIHBpcGVsaW5lIHdoZXJlOiIKKyAgICAgICAgIjEpIGNvdW50IG9mIHZlcnRleCBiaW5kaW5ncyBleGNlZWRzIGRldmljZSdzIG1heFZlcnRleElucHV0QmluZGluZ3MgbGltaXQiCisgICAgICAgICIyKSByZXF1ZXN0ZWQgYmluZGluZ3MgaW5jbHVkZSBhIGR1cGxpY2F0ZSBiaW5kaW5nIHZhbHVlIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCB1aW50MzJfdCBiaW5kaW5nX2NvdW50ID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhWZXJ0ZXhJbnB1dEJpbmRpbmdzICsgMTsKKworICAgIHN0ZDo6dmVjdG9yPFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24+IGlucHV0X2JpbmRpbmdzKGJpbmRpbmdfY291bnQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBiaW5kaW5nX2NvdW50OyArK2kpIHsKKyAgICAgICAgaW5wdXRfYmluZGluZ3NbaV0uYmluZGluZyA9IGk7CisgICAgICAgIGlucHV0X2JpbmRpbmdzW2ldLnN0cmlkZSA9IDQ7CisgICAgICAgIGlucHV0X2JpbmRpbmdzW2ldLmlucHV0UmF0ZSA9IFZLX1ZFUlRFWF9JTlBVVF9SQVRFX1ZFUlRFWDsKKyAgICB9CisgICAgLy8gTGV0IHRoZSBsYXN0IGJpbmRpbmcgZGVzY3JpcHRpb24gdXNlIHNhbWUgYmluZGluZyBhcyB0aGUgZmlyc3Qgb25lCisgICAgaW5wdXRfYmluZGluZ3NbYmluZGluZ19jb3VudCAtIDFdLmJpbmRpbmcgPSAwOworCisgICAgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIGlucHV0X2F0dHJpYjsKKyAgICBpbnB1dF9hdHRyaWIuYmluZGluZyA9IDA7CisgICAgaW5wdXRfYXR0cmliLmxvY2F0aW9uID0gMDsKKyAgICBpbnB1dF9hdHRyaWIuZm9ybWF0ID0gVktfRk9STUFUX1IzMkczMkIzMl9TRkxPQVQ7CisgICAgaW5wdXRfYXR0cmliLm9mZnNldCA9IDA7CisKKyAgICBjb25zdCBhdXRvIHNldF9JbmZvID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9IGlucHV0X2JpbmRpbmdzLmRhdGEoKTsKKyAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IGJpbmRpbmdfY291bnQ7CisgICAgICAgIGhlbHBlci52aV9jaV8ucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9ICZpbnB1dF9hdHRyaWI7CisgICAgICAgIGhlbHBlci52aV9jaV8udmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCA9IDE7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLCBzZXRfSW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby12ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudC0wMDYxMyIsCisgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby1wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucy0wMDYxNiJ9KTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkF0dGVtcHQgdG8gY3JlYXRlIGEgZ3JhcGhpY3MgcGlwZWxpbmUgd2hlcmU6IgorICAgICAgICAiMSkgY291bnQgb2YgdmVydGV4IGF0dHJpYnV0ZXMgZXhjZWVkcyBkZXZpY2UncyBtYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMgbGltaXQiCisgICAgICAgICIyKSByZXF1ZXN0ZWQgbG9jYXRpb24gaW5jbHVkZSBhIGR1cGxpY2F0ZSBsb2NhdGlvbiB2YWx1ZSIKKyAgICAgICAgIjMpIGJpbmRpbmcgdXNlZCBieSBvbmUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkIGJ5IGEgYmluZGluZyBkZXNjcmlwdGlvbiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBpbnB1dF9iaW5kaW5nOworICAgIGlucHV0X2JpbmRpbmcuYmluZGluZyA9IDA7CisgICAgaW5wdXRfYmluZGluZy5zdHJpZGUgPSA0OworICAgIGlucHV0X2JpbmRpbmcuaW5wdXRSYXRlID0gVktfVkVSVEVYX0lOUFVUX1JBVEVfVkVSVEVYOworCisgICAgY29uc3QgdWludDMyX3QgYXR0cmlidXRlX2NvdW50ID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhWZXJ0ZXhJbnB1dEF0dHJpYnV0ZXMgKyAxOworICAgIHN0ZDo6dmVjdG9yPFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbj4gaW5wdXRfYXR0cmlicyhhdHRyaWJ1dGVfY291bnQpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRyaWJ1dGVfY291bnQ7ICsraSkgeworICAgICAgICBpbnB1dF9hdHRyaWJzW2ldLmJpbmRpbmcgPSAwOworICAgICAgICBpbnB1dF9hdHRyaWJzW2ldLmxvY2F0aW9uID0gaTsKKyAgICAgICAgaW5wdXRfYXR0cmlic1tpXS5mb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVDsKKyAgICAgICAgaW5wdXRfYXR0cmlic1tpXS5vZmZzZXQgPSAwOworICAgIH0KKyAgICAvLyBMZXQgdGhlIGxhc3QgaW5wdXRfYXR0cmlicyBkZXNjcmlwdGlvbiB1c2Ugc2FtZSBsb2NhdGlvbiBhcyB0aGUgZmlyc3Qgb25lCisgICAgaW5wdXRfYXR0cmlic1thdHRyaWJ1dGVfY291bnQgLSAxXS5sb2NhdGlvbiA9IDA7CisgICAgLy8gTGV0IHRoZSBsYXN0IGlucHV0X2F0dHJpYnMgZGVzY3JpcHRpb24gdXNlIGJpbmRpbmcgd2hpY2ggaXMgbm90IGRlZmluZWQKKyAgICBpbnB1dF9hdHRyaWJzW2F0dHJpYnV0ZV9jb3VudCAtIDFdLmJpbmRpbmcgPSAxOworCisgICAgY29uc3QgYXV0byBzZXRfSW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci52aV9jaV8ucFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgPSAmaW5wdXRfYmluZGluZzsKKyAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IDE7CisgICAgICAgIGhlbHBlci52aV9jaV8ucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9IGlucHV0X2F0dHJpYnMuZGF0YSgpOworICAgICAgICBoZWxwZXIudmlfY2lfLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSBhdHRyaWJ1dGVfY291bnQ7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLCBzZXRfSW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJWVUlELVZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mby12ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50LTAwNjE0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLWJpbmRpbmctMDA2MTUiLAorICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8tcFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucy0wMDYxNyJ9KTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDb2xvckJsZW5kSW52YWxpZExvZ2ljT3ApIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IHRvIHVzZSBpbnZhbGlkIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvOjpsb2dpY09wIHZhbHVlLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsgIC8vIGVuYWJsZXMgYWxsIHN1cHBvcnRlZCBmZWF0dXJlcworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLmxvZ2ljT3ApIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBsb2dpY09wIGZlYXR1cmU7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIHNldF9zaGFkaW5nX2VuYWJsZSA9IFtdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLmNiX2NpXy5sb2dpY09wRW5hYmxlID0gVktfVFJVRTsKKyAgICAgICAgaGVscGVyLmNiX2NpXy5sb2dpY09wID0gc3RhdGljX2Nhc3Q8VmtMb2dpY09wPihWS19MT0dJQ19PUF9FTkRfUkFOR0UgKyAxKTsgIC8vIGludmFsaWQgbG9naWNPcCB0byBiZSB0ZXN0ZWQKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X3NoYWRpbmdfZW5hYmxlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8tbG9naWNPcEVuYWJsZS0wMDYwNyIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvbG9yQmxlbmRVbnN1cHBvcnRlZExvZ2ljT3ApIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJBdHRlbXB0IGVuYWJsaW5nIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvOjpsb2dpY09wRW5hYmxlIHdoZW4gbG9naWNPcCBmZWF0dXJlIGlzIGRpc2FibGVkLiIpOworCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGZlYXR1cmVze307CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgmZmVhdHVyZXMpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY29uc3QgYXV0byBzZXRfc2hhZGluZ19lbmFibGUgPSBbXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7IGhlbHBlci5jYl9jaV8ubG9naWNPcEVuYWJsZSA9IFZLX1RSVUU7IH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfc2hhZGluZ19lbmFibGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mby1sb2dpY09wRW5hYmxlLTAwNjA2Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ29sb3JCbGVuZFVuc3VwcG9ydGVkRHVhbFNvdXJjZUJsZW5kKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQXR0ZW1wdCB0byB1c2UgZHVhbC1zb3VyY2UgYmxlbmRpbmcgd2hlbiBkdWFsU3JjQmxlbmQgZmVhdHVyZSBpcyBkaXNhYmxlZC4iKTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBmZWF0dXJlc3t9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoJmZlYXR1cmVzKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlIGNiX2F0dGFjaG1lbnRzID0ge307CisKKyAgICBjb25zdCBhdXRvIHNldF9kc2Jfc3JjX2NvbG9yX2VuYWJsZSA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7IGhlbHBlci5jYl9hdHRhY2htZW50c18gPSBjYl9hdHRhY2htZW50czsgfTsKKworICAgIGNiX2F0dGFjaG1lbnRzLmJsZW5kRW5hYmxlID0gVktfVFJVRTsKKyAgICBjYl9hdHRhY2htZW50cy5zcmNDb2xvckJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX1NSQzFfQ09MT1I7ICAvLyBiYWQhCisgICAgY2JfYXR0YWNobWVudHMuZHN0Q29sb3JCbGVuZEZhY3RvciA9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDX0NPTE9SOworICAgIGNiX2F0dGFjaG1lbnRzLmNvbG9yQmxlbmRPcCA9IFZLX0JMRU5EX09QX0FERDsKKyAgICBjYl9hdHRhY2htZW50cy5zcmNBbHBoYUJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX1NSQ19BTFBIQTsKKyAgICBjYl9hdHRhY2htZW50cy5kc3RBbHBoYUJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkNfQUxQSEE7CisgICAgY2JfYXR0YWNobWVudHMuYWxwaGFCbGVuZE9wID0gVktfQkxFTkRfT1BfQUREOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2RzYl9zcmNfY29sb3JfZW5hYmxlLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUtc3JjQ29sb3JCbGVuZEZhY3Rvci0wMDYwOCIpOworCisgICAgY2JfYXR0YWNobWVudHMuYmxlbmRFbmFibGUgPSBWS19UUlVFOworICAgIGNiX2F0dGFjaG1lbnRzLnNyY0NvbG9yQmxlbmRGYWN0b3IgPSBWS19CTEVORF9GQUNUT1JfU1JDX0NPTE9SOworICAgIGNiX2F0dGFjaG1lbnRzLmRzdENvbG9yQmxlbmRGYWN0b3IgPSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQzFfQ09MT1I7ICAvLyBiYWQKKyAgICBjYl9hdHRhY2htZW50cy5jb2xvckJsZW5kT3AgPSBWS19CTEVORF9PUF9BREQ7CisgICAgY2JfYXR0YWNobWVudHMuc3JjQWxwaGFCbGVuZEZhY3RvciA9IFZLX0JMRU5EX0ZBQ1RPUl9TUkNfQUxQSEE7CisgICAgY2JfYXR0YWNobWVudHMuZHN0QWxwaGFCbGVuZEZhY3RvciA9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgIGNiX2F0dGFjaG1lbnRzLmFscGhhQmxlbmRPcCA9IFZLX0JMRU5EX09QX0FERDsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9kc2Jfc3JjX2NvbG9yX2VuYWJsZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWRzdENvbG9yQmxlbmRGYWN0b3ItMDA2MDkiKTsKKworICAgIGNiX2F0dGFjaG1lbnRzLmJsZW5kRW5hYmxlID0gVktfVFJVRTsKKyAgICBjYl9hdHRhY2htZW50cy5zcmNDb2xvckJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX1NSQ19DT0xPUjsKKyAgICBjYl9hdHRhY2htZW50cy5kc3RDb2xvckJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkNfQ09MT1I7CisgICAgY2JfYXR0YWNobWVudHMuY29sb3JCbGVuZE9wID0gVktfQkxFTkRfT1BfQUREOworICAgIGNiX2F0dGFjaG1lbnRzLnNyY0FscGhhQmxlbmRGYWN0b3IgPSBWS19CTEVORF9GQUNUT1JfU1JDMV9BTFBIQTsgIC8vIGJhZAorICAgIGNiX2F0dGFjaG1lbnRzLmRzdEFscGhhQmxlbmRGYWN0b3IgPSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQ19BTFBIQTsKKyAgICBjYl9hdHRhY2htZW50cy5hbHBoYUJsZW5kT3AgPSBWS19CTEVORF9PUF9BREQ7CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfZHNiX3NyY19jb2xvcl9lbmFibGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZS1zcmNBbHBoYUJsZW5kRmFjdG9yLTAwNjEwIik7CisKKyAgICBjYl9hdHRhY2htZW50cy5ibGVuZEVuYWJsZSA9IFZLX1RSVUU7CisgICAgY2JfYXR0YWNobWVudHMuc3JjQ29sb3JCbGVuZEZhY3RvciA9IFZLX0JMRU5EX0ZBQ1RPUl9TUkNfQ09MT1I7CisgICAgY2JfYXR0YWNobWVudHMuZHN0Q29sb3JCbGVuZEZhY3RvciA9IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDX0NPTE9SOworICAgIGNiX2F0dGFjaG1lbnRzLmNvbG9yQmxlbmRPcCA9IFZLX0JMRU5EX09QX0FERDsKKyAgICBjYl9hdHRhY2htZW50cy5zcmNBbHBoYUJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX1NSQ19BTFBIQTsKKyAgICBjYl9hdHRhY2htZW50cy5kc3RBbHBoYUJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0FMUEhBOyAgLy8gYmFkIQorICAgIGNiX2F0dGFjaG1lbnRzLmFscGhhQmxlbmRPcCA9IFZLX0JMRU5EX09QX0FERDsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9kc2Jfc3JjX2NvbG9yX2VuYWJsZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlLWRzdEFscGhhQmxlbmRGYWN0b3ItMDA2MTEiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBJbnZhbGlkU1BJUlZDb2RlU2l6ZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdGhhdCBlcnJvcnMgYXJlIHByb2R1Y2VkIGZvciBhIHNwaXJ2IG1vZHVsZXMgd2l0aCBpbnZhbGlkIGNvZGUgc2l6ZXMiKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIkludmFsaWQgU1BJUi1WIGhlYWRlciIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtTaGFkZXJNb2R1bGUgbW9kdWxlOworICAgIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBtb2R1bGVDcmVhdGVJbmZvOworICAgIHN0cnVjdCBpY2Rfc3B2X2hlYWRlciBzcHY7CisKKyAgICBzcHYubWFnaWMgPSBJQ0RfU1BWX01BR0lDOworICAgIHNwdi52ZXJzaW9uID0gSUNEX1NQVl9WRVJTSU9OOworICAgIHNwdi5nZW5fbWFnaWMgPSAwOworCisgICAgbW9kdWxlQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfQ1JFQVRFX0lORk87CisgICAgbW9kdWxlQ3JlYXRlSW5mby5wTmV4dCA9IE5VTEw7CisgICAgbW9kdWxlQ3JlYXRlSW5mby5wQ29kZSA9IChjb25zdCB1aW50MzJfdCAqKSZzcHY7CisgICAgbW9kdWxlQ3JlYXRlSW5mby5jb2RlU2l6ZSA9IDQ7CisgICAgbW9kdWxlQ3JlYXRlSW5mby5mbGFncyA9IDA7CisgICAgdms6OkNyZWF0ZVNoYWRlck1vZHVsZShtX2RldmljZS0+ZGV2aWNlKCksICZtb2R1bGVDcmVhdGVJbmZvLCBOVUxMLCAmbW9kdWxlKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8tcENvZGUtMDEzNzYiKTsKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IHNoYWRlcjsKKyAgICBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gbW9kdWxlX2NyZWF0ZV9pbmZvOworICAgIFZrU2hhZGVyTW9kdWxlIHNoYWRlcl9tb2R1bGU7CisgICAgbW9kdWxlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTzsKKyAgICBtb2R1bGVfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIHRoaXMtPkdMU0x0b1NQVigmbV9kZXZpY2UtPnByb3BzLmxpbWl0cywgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBzaGFkZXIpOworICAgIG1vZHVsZV9jcmVhdGVfaW5mby5wQ29kZSA9IHNoYWRlci5kYXRhKCk7CisgICAgLy8gSW50cm9kdWNlIGZhaWx1cmUgYnkgbWFraW5nIGNvZGVTaXplIGEgbm9uLW11bHRpcGxlIG9mIDQKKyAgICBtb2R1bGVfY3JlYXRlX2luZm8uY29kZVNpemUgPSBzaGFkZXIuc2l6ZSgpICogc2l6ZW9mKHVuc2lnbmVkIGludCkgLSAxOworICAgIG1vZHVsZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisgICAgdms6OkNyZWF0ZVNoYWRlck1vZHVsZShtX2RldmljZS0+aGFuZGxlKCksICZtb2R1bGVfY3JlYXRlX2luZm8sIE5VTEwsICZzaGFkZXJfbW9kdWxlKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIEludmFsaWRTUElSVk1hZ2ljKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBhIHNwaXJ2IG1vZHVsZSB3aXRoIGEgYmFkIG1hZ2ljIG51bWJlciIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiSW52YWxpZCBTUElSLVYgbWFnaWMgbnVtYmVyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1NoYWRlck1vZHVsZSBtb2R1bGU7CisgICAgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIG1vZHVsZUNyZWF0ZUluZm87CisgICAgc3RydWN0IGljZF9zcHZfaGVhZGVyIHNwdjsKKworICAgIHNwdi5tYWdpYyA9ICh1aW50MzJfdCl+SUNEX1NQVl9NQUdJQzsKKyAgICBzcHYudmVyc2lvbiA9IElDRF9TUFZfVkVSU0lPTjsKKyAgICBzcHYuZ2VuX21hZ2ljID0gMDsKKworICAgIG1vZHVsZUNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPOworICAgIG1vZHVsZUNyZWF0ZUluZm8ucE5leHQgPSBOVUxMOworICAgIG1vZHVsZUNyZWF0ZUluZm8ucENvZGUgPSAoY29uc3QgdWludDMyX3QgKikmc3B2OworICAgIG1vZHVsZUNyZWF0ZUluZm8uY29kZVNpemUgPSBzaXplb2Yoc3B2KSArIDE2OworICAgIG1vZHVsZUNyZWF0ZUluZm8uZmxhZ3MgPSAwOworICAgIHZrOjpDcmVhdGVTaGFkZXJNb2R1bGUobV9kZXZpY2UtPmRldmljZSgpLCAmbW9kdWxlQ3JlYXRlSW5mbywgTlVMTCwgJm1vZHVsZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZVZlcnRleE91dHB1dE5vdENvbnN1bWVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IGEgd2FybmluZyBpcyBwcm9kdWNlZCBmb3IgYSB2ZXJ0ZXggb3V0cHV0IHRoYXQgaXMgbm90IGNvbnN1bWVkIGJ5IHRoZSBmcmFnbWVudCBzdGFnZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IGZsb2F0IHg7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCgxKTtcbiIKKyAgICAgICAgIiAgIHggPSAwO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGhlbHBlci5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgY29uc3VtZWQgYnkgZnJhZ21lbnQgc2hhZGVyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVDaGVja1NoYWRlclNwZWNpYWxpemF0aW9uQXBwbGllZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJNYWtlIHN1cmUgc3BlY2lhbGl6YXRpb24gY29uc3RhbnRzIGdldCBhcHBsaWVkIGR1cmluZyBzaGFkZXIgdmFsaWRhdGlvbiBieSB1c2luZyBhIHZhbHVlIHRoYXQgYnJlYWtzIGNvbXBpbGF0aW9uLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gU2l6ZSBhbiBhcnJheSB1c2luZyBhIHNwZWNpYWxpemF0aW9uIGNvbnN0YW50IG9mIGRlZmF1bHQgdmFsdWUgZXF1YWwgdG8gMS4KKyAgICBzdGQ6OnN0cmluZyBjb25zdCBmc19zcmMgPSBSIigKKyAgICAgICAgICAgICAgIE9wQ2FwYWJpbGl0eSBTaGFkZXIKKyAgICAgICAgICAlMSA9IE9wRXh0SW5zdEltcG9ydCAiR0xTTC5zdGQuNDUwIgorICAgICAgICAgICAgICAgT3BNZW1vcnlNb2RlbCBMb2dpY2FsIEdMU0w0NTAKKyAgICAgICAgICAgICAgIE9wRW50cnlQb2ludCBGcmFnbWVudCAlbWFpbiAibWFpbiIKKyAgICAgICAgICAgICAgIE9wRXhlY3V0aW9uTW9kZSAlbWFpbiBPcmlnaW5VcHBlckxlZnQKKyAgICAgICAgICAgICAgIE9wU291cmNlIEdMU0wgNDUwCisgICAgICAgICAgICAgICBPcE5hbWUgJW1haW4gIm1haW4iCisgICAgICAgICAgICAgICBPcE5hbWUgJXNpemUgInNpemUiCisgICAgICAgICAgICAgICBPcE5hbWUgJWFycmF5ICJhcnJheSIKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJXNpemUgU3BlY0lkIDAKKyAgICAgICAldm9pZCA9IE9wVHlwZVZvaWQKKyAgICAgICAgICAlMyA9IE9wVHlwZUZ1bmN0aW9uICV2b2lkCisgICAgICAlZmxvYXQgPSBPcFR5cGVGbG9hdCAzMgorICAgICAgICAlaW50ID0gT3BUeXBlSW50IDMyIDEKKyAgICAgICAlc2l6ZSA9IE9wU3BlY0NvbnN0YW50ICVpbnQgMQorJV9hcnJfZmxvYXRfc2l6ZSA9IE9wVHlwZUFycmF5ICVmbG9hdCAlc2l6ZQorJV9wdHJfRnVuY3Rpb25fX2Fycl9mbG9hdF9zaXplID0gT3BUeXBlUG9pbnRlciBGdW5jdGlvbiAlX2Fycl9mbG9hdF9zaXplCisgICAgICAlaW50XzAgPSBPcENvbnN0YW50ICVpbnQgMAorICAgICVmbG9hdF8wID0gT3BDb25zdGFudCAlZmxvYXQgMAorJV9wdHJfRnVuY3Rpb25fZmxvYXQgPSBPcFR5cGVQb2ludGVyIEZ1bmN0aW9uICVmbG9hdAorICAgICAgICVtYWluID0gT3BGdW5jdGlvbiAldm9pZCBOb25lICUzCisgICAgICAgICAgJTUgPSBPcExhYmVsCisgICAgICAlYXJyYXkgPSBPcFZhcmlhYmxlICVfcHRyX0Z1bmN0aW9uX19hcnJfZmxvYXRfc2l6ZSBGdW5jdGlvbgorICAgICAgICAgJTE1ID0gT3BBY2Nlc3NDaGFpbiAlX3B0cl9GdW5jdGlvbl9mbG9hdCAlYXJyYXkgJWludF8wCisgICAgICAgICAgICAgICBPcFN0b3JlICUxNSAlZmxvYXRfMAorICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgIE9wRnVuY3Rpb25FbmQpIjsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNfc3JjLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIC8vIFNldCB0aGUgc3BlY2lhbGl6YXRpb24gY29uc3RhbnQgdG8gMC4KKyAgICBjb25zdCBWa1NwZWNpYWxpemF0aW9uTWFwRW50cnkgZW50cnkgPSB7CisgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIGlkCisgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICBzaXplb2YodWludDMyX3QpICAvLyBzaXplCisgICAgfTsKKyAgICB1aW50MzJfdCBkYXRhID0gMDsKKyAgICBjb25zdCBWa1NwZWNpYWxpemF0aW9uSW5mbyBzcGVjaWFsaXphdGlvbl9pbmZvID0geworICAgICAgICAxLAorICAgICAgICAmZW50cnksCisgICAgICAgIDEgKiBzaXplb2YodWludDMyX3QpLAorICAgICAgICAmZGF0YSwKKyAgICB9OworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHtoZWxwZXIudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc19bMV0ucFNwZWNpYWxpemF0aW9uSW5mbyA9ICZzcGVjaWFsaXphdGlvbl9pbmZvOworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJkb2VzIG5vdCBjb250YWluIHZhbGlkIHNwaXJ2Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVDaGVja1NoYWRlckJhZFNwZWNpYWxpemF0aW9uT2Zmc2V0T3V0T2ZCb3VuZHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDaGFsbGVuZ2UgY29yZV92YWxpZGF0aW9uIHdpdGggc2hhZGVyIHZhbGlkYXRpb24gaXNzdWVzIHJlbGF0ZWQgdG8gdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcy4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAibGF5b3V0IChjb25zdGFudF9pZCA9IDApIGNvbnN0IGZsb2F0IHIgPSAwLjBmO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IHZlYzQgdUZyYWdDb2xvcjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgdUZyYWdDb2xvciA9IHZlYzQociwxLDAsMSk7XG4iCisgICAgICAgICJ9XG4iOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICAvLyBFbnRyeSBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIGRhdGFTaXplLgorICAgIGNvbnN0IFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSBlbnRyeSA9IHswLCA1LCBzaXplb2YodWludDMyX3QpfTsKKworICAgIHVpbnQzMl90IGRhdGEgPSAxOworICAgIGNvbnN0IFZrU3BlY2lhbGl6YXRpb25JbmZvIHNwZWNpYWxpemF0aW9uX2luZm8gPSB7CisgICAgICAgIDEsCisgICAgICAgICZlbnRyeSwKKyAgICAgICAgMSAqIHNpemVvZihmbG9hdCksCisgICAgICAgICZkYXRhLAorICAgIH07CisKKyAgICBjb25zdCBhdXRvIHNldF9pbmZvID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge2hlbHBlci52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzX1sxXS5wU3BlY2lhbGl6YXRpb25JbmZvID0gJnNwZWNpYWxpemF0aW9uX2luZm87CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tb2Zmc2V0LTAwNzczIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVDaGVja1NoYWRlckJhZFNwZWNpYWxpemF0aW9uU2l6ZU91dE9mQm91bmRzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ2hhbGxlbmdlIGNvcmVfdmFsaWRhdGlvbiB3aXRoIHNoYWRlciB2YWxpZGF0aW9uIGlzc3VlcyByZWxhdGVkIHRvIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgImxheW91dCAoY29uc3RhbnRfaWQgPSAwKSBjb25zdCBmbG9hdCByID0gMC4wZjtcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IHVGcmFnQ29sb3I7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIHVGcmFnQ29sb3IgPSB2ZWM0KHIsMSwwLDEpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgLy8gRW50cnkgc2l6ZSBpcyBncmVhdGVyIHRoYW4gZGF0YVNpemUgbWludXMgb2Zmc2V0LgorICAgIGNvbnN0IFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSBlbnRyeSA9IHswLCAzLCBzaXplb2YodWludDMyX3QpfTsKKworICAgIHVpbnQzMl90IGRhdGEgPSAxOworICAgIGNvbnN0IFZrU3BlY2lhbGl6YXRpb25JbmZvIHNwZWNpYWxpemF0aW9uX2luZm8gPSB7CisgICAgICAgIDEsCisgICAgICAgICZlbnRyeSwKKyAgICAgICAgMSAqIHNpemVvZihmbG9hdCksCisgICAgICAgICZkYXRhLAorICAgIH07CisKKyAgICBjb25zdCBhdXRvIHNldF9pbmZvID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge2hlbHBlci52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzX1sxXS5wU3BlY2lhbGl6YXRpb25JbmZvID0gJnNwZWNpYWxpemF0aW9uX2luZm87CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTcGVjaWFsaXphdGlvbkluZm8tcE1hcEVudHJpZXMtMDA3NzQiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUNoZWNrU2hhZGVyRGVzY3JpcHRvclR5cGVNaXNtYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNoYWxsZW5nZSBjb3JlX3ZhbGlkYXRpb24gd2l0aCBzaGFkZXIgdmFsaWRhdGlvbiBpc3N1ZXMgcmVsYXRlZCB0byB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQgKHN0ZDE0MCwgc2V0ID0gMCwgYmluZGluZyA9IDApIHVuaWZvcm0gYnVmIHtcbiIKKyAgICAgICAgIiAgICBtYXQ0IG12cDtcbiIKKyAgICAgICAgIn0gdWJ1ZjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB1YnVmLm12cCAqIHZlYzQoMSk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgcGlwZS5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUucGlwZWxpbmVfbGF5b3V0XyA9IFZrUGlwZWxpbmVMYXlvdXRPYmoobV9kZXZpY2UsIHsmZGVzY3JpcHRvcl9zZXQubGF5b3V0X30pOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVHlwZSBtaXNtYXRjaCBvbiBkZXNjcmlwdG9yIHNsb3QgMC4wICIpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lQ2hlY2tTaGFkZXJEZXNjcmlwdG9yTm90QWNjZXNzaWJsZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJDcmVhdGUgYSBwaXBlbGluZSBpbiB3aGljaCBhIGRlc2NyaXB0b3IgdXNlZCBieSBhIHNoYWRlciBzdGFnZSBkb2VzIG5vdCBpbmNsdWRlIHRoYXQgc3RhZ2UgaW4gaXRzIHN0YWdlRmxhZ3MuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRzKG1fZGV2aWNlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQgLyohKi8sIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dCAoc3RkMTQwLCBzZXQgPSAwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSBidWYge1xuIgorICAgICAgICAiICAgIG1hdDQgbXZwO1xuIgorICAgICAgICAifSB1YnVmO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IHVidWYubXZwICogdmVjNCgxKTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBwaXBlLmZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5waXBlbGluZV9sYXlvdXRfID0gVmtQaXBlbGluZUxheW91dE9iaihtX2RldmljZSwgeyZkcy5sYXlvdXRffSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJTaGFkZXIgdXNlcyBkZXNjcmlwdG9yIHNsb3QgMC4wICIpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lQ2hlY2tTaGFkZXJQdXNoQ29uc3RhbnROb3REZWNsYXJlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJDcmVhdGUgYSBncmFwaGljcyBwaXBlbGluZSBpbiB3aGljaCBhIHB1c2ggY29uc3RhbnQgcmFuZ2UgY29udGFpbmluZyBhIHB1c2ggY29uc3RhbnQgYmxvY2sgbWVtYmVyIGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgIgorICAgICAgICAibGF5b3V0LiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChwdXNoX2NvbnN0YW50LCBzdGQ0MzApIHVuaWZvcm0gZm9vIHsgZmxvYXQgeDsgfSBjb25zdHM7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gdmVjNChjb25zdHMueCk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisKKyAgICAvLyBTZXQgdXAgYSBwdXNoIGNvbnN0YW50IHJhbmdlCisgICAgVmtQdXNoQ29uc3RhbnRSYW5nZSBwdXNoX2NvbnN0YW50X3JhbmdlID0ge307CisgICAgLy8gU2V0IHRvIHRoZSB3cm9uZyBzdGFnZSB0byBjaGFsbGVuZ2UgY29yZV92YWxpZGF0aW9uCisgICAgcHVzaF9jb25zdGFudF9yYW5nZS5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBwdXNoX2NvbnN0YW50X3JhbmdlLnNpemUgPSA0OworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQobV9kZXZpY2UsIHt9LCB7cHVzaF9jb25zdGFudF9yYW5nZX0pOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIHBpcGUuZnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLnBpcGVsaW5lX2xheW91dF8gPSBWa1BpcGVsaW5lTGF5b3V0T2JqKG1fZGV2aWNlLCB7fSwge3B1c2hfY29uc3RhbnRfcmFuZ2V9KTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1c2ggY29uc3RhbnQgcmFuZ2UgY292ZXJpbmcgdmFyaWFibGUgc3RhcnRpbmcgYXQgb2Zmc2V0IDAgbm90IGRlY2xhcmVkIGluIGxheW91dCIpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lQ2hlY2tTaGFkZXJOb3RFbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkNyZWF0ZSBhIGdyYXBoaWNzIHBpcGVsaW5lIGluIHdoaWNoIGEgY2FwYWJpbGl0eSBkZWNsYXJlZCBieSB0aGUgc2hhZGVyIHJlcXVpcmVzIGEgZmVhdHVyZSBub3QgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICAvLyBTb21lIGF3a3dhcmQgc3RlcHMgYXJlIHJlcXVpcmVkIHRvIHRlc3Qgd2l0aCBjdXN0b20gZGV2aWNlIGZlYXR1cmVzLgorICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBkZXZpY2VfZmVhdHVyZXMgPSB7fTsKKyAgICAvLyBEaXNhYmxlIHN1cHBvcnQgZm9yIDY0IGJpdCBmbG9hdHMKKyAgICBkZXZpY2VfZmVhdHVyZXMuc2hhZGVyRmxvYXQ2NCA9IGZhbHNlOworICAgIC8vIFRoZSBzYWNyaWZpY2lhbCBkZXZpY2Ugb2JqZWN0CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCZkZXZpY2VfZmVhdHVyZXMpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZHZlYzQgZ3JlZW4gPSB2ZWM0KDAuMCwgMS4wLCAwLjAsIDEuMCk7XG4iCisgICAgICAgICIgICBjb2xvciA9IHZlYzQoZ3JlZW4pO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7cGlwZS52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLnBpcGVsaW5lX2xheW91dF8gPSBWa1BpcGVsaW5lTGF5b3V0T2JqKG1fZGV2aWNlKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJTaGFkZXIgcmVxdWlyZXMgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjpzaGFkZXJGbG9hdDY0IGJ1dCBpcyBub3QgZW5hYmxlZCBvbiB0aGUgZGV2aWNlIik7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlU2hhZGVyTW9kdWxlQ2hlY2tCYWRDYXBhYmlsaXR5KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgc2hhZGVyIGluIHdoaWNoIGEgY2FwYWJpbGl0eSBkZWNsYXJlZCBieSB0aGUgc2hhZGVyIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgLy8gTm90ZSB0aGF0IHRoaXMgZmFpbHVyZSBtZXNzYWdlIGNvbWVzIGZyb20gc3BpcnYtdG9vbHMsIHNwZWNpZmljYWxseSB0aGUgdmFsaWRhdG9yLgorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3B2X3NvdXJjZSA9IFIiKAorICAgICAgICAgICAgICAgICAgT3BDYXBhYmlsaXR5IEltYWdlUmVjdAorICAgICAgICAgICAgICAgICAgT3BFbnRyeVBvaW50IFZlcnRleCAlbWFpbiAibWFpbiIKKyAgICAgICAgICAlbWFpbiA9IE9wRnVuY3Rpb24gJXZvaWQgTm9uZSAlMworICAgICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgICAgIE9wRnVuY3Rpb25FbmQKKyAgICAgICAgKSI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJDYXBhYmlsaXR5IEltYWdlUmVjdCBpcyBub3QgYWxsb3dlZCBieSBWdWxrYW4iKTsKKworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gc3B2OworICAgIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBtb2R1bGVfY3JlYXRlX2luZm87CisgICAgVmtTaGFkZXJNb2R1bGUgc2hhZGVyX21vZHVsZTsKKyAgICBtb2R1bGVfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TSEFERVJfTU9EVUxFX0NSRUFURV9JTkZPOworICAgIG1vZHVsZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgQVNNdG9TUFYoU1BWX0VOVl9WVUxLQU5fMV8wLCAwLCBzcHZfc291cmNlLmRhdGEoKSwgc3B2KTsKKyAgICBtb2R1bGVfY3JlYXRlX2luZm8ucENvZGUgPSBzcHYuZGF0YSgpOworICAgIG1vZHVsZV9jcmVhdGVfaW5mby5jb2RlU2l6ZSA9IHNwdi5zaXplKCkgKiBzaXplb2YodW5zaWduZWQgaW50KTsKKyAgICBtb2R1bGVfY3JlYXRlX2luZm8uZmxhZ3MgPSAwOworCisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVNoYWRlck1vZHVsZShtX2RldmljZS0+aGFuZGxlKCksICZtb2R1bGVfY3JlYXRlX2luZm8sIE5VTEwsICZzaGFkZXJfbW9kdWxlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lTaGFkZXJNb2R1bGUobV9kZXZpY2UtPmhhbmRsZSgpLCBzaGFkZXJfbW9kdWxlLCBOVUxMKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVGcmFnbWVudElucHV0Tm90UHJvdmlkZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBhIGZyYWdtZW50IHNoYWRlciBpbnB1dCB3aGljaCBpcyBub3QgcHJlc2VudCBpbiB0aGUgb3V0cHV0cyBvZiB0aGUgcHJldmlvdXMgc3RhZ2UiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgaW4gZmxvYXQgeDtcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgY29sb3IgPSB2ZWM0KHgpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHtoZWxwZXIudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJub3Qgd3JpdHRlbiBieSB2ZXJ0ZXggc2hhZGVyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVGcmFnbWVudElucHV0Tm90UHJvdmlkZWRJbkJsb2NrKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgYSBmcmFnbWVudCBzaGFkZXIgaW5wdXQgd2l0aGluIGFuIGludGVyYWNlIGJsb2NrLCB3aGljaCBpcyBub3QgcHJlc2VudCBpbiB0aGUgb3V0cHV0cyAiCisgICAgICAgICJvZiB0aGUgcHJldmlvdXMgc3RhZ2UuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiaW4gYmxvY2sgeyBsYXlvdXQobG9jYXRpb249MCkgZmxvYXQgeDsgfSBpbnM7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGNvbG9yID0gdmVjNChpbnMueCk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAibm90IHdyaXR0ZW4gYnkgdmVydGV4IHNoYWRlciIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lVnNGc1R5cGVNaXNtYXRjaEFycmF5U2l6ZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgbWlzbWF0Y2hlZCBhcnJheSBzaXplcyBhY3Jvc3MgdGhlIHZlcnRleC0+ZnJhZ21lbnQgc2hhZGVyIGludGVyZmFjZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgZmxvYXQgeFsyXTtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgeFswXSA9IDA7IHhbMV0gPSAwO1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDEpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIGluIGZsb2F0IHhbMV07XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGNvbG9yID0gdmVjNCh4WzBdKTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KAorICAgICAgICAqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiVHlwZSBtaXNtYXRjaCBvbiBsb2NhdGlvbiAwLjA6ICdwdHIgdG8gb3V0cHV0IGFyclsyXSBvZiBmbG9hdDMyJyB2cyAncHRyIHRvIGlucHV0IGFyclsxXSBvZiBmbG9hdDMyJyIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lVnNGc1R5cGVNaXNtYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgbWlzbWF0Y2hlZCB0eXBlcyBhY3Jvc3MgdGhlIHZlcnRleC0+ZnJhZ21lbnQgc2hhZGVyIGludGVyZmFjZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgaW50IHg7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIHggPSAwO1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDEpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIGluIGZsb2F0IHg7XG4iIC8qIFZTIHdyaXRlcyBpbnQgKi8KKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgY29sb3IgPSB2ZWM0KHgpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCB2c1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBjb25zdCBhdXRvIHNldF9pbmZvID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlR5cGUgbWlzbWF0Y2ggb24gbG9jYXRpb24gMCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lVnNGc1R5cGVNaXNtYXRjaEluQmxvY2spIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBtaXNtYXRjaGVkIHR5cGVzIGFjcm9zcyB0aGUgdmVydGV4LT5mcmFnbWVudCBzaGFkZXIgaW50ZXJmYWNlLCB3aGVuIHRoZSB2YXJpYWJsZSBpcyAiCisgICAgICAgICJjb250YWluZWQgd2l0aGluIGFuIGludGVyZmFjZSBibG9jayIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIm91dCBibG9jayB7IGxheW91dChsb2NhdGlvbj0wKSBpbnQgeDsgfSBvdXRzO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBvdXRzLnggPSAwO1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDEpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiaW4gYmxvY2sgeyBsYXlvdXQobG9jYXRpb249MCkgZmxvYXQgeDsgfSBpbnM7XG4iIC8qIFZTIHdyaXRlcyBpbnQgKi8KKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgY29sb3IgPSB2ZWM0KGlucy54KTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJUeXBlIG1pc21hdGNoIG9uIGxvY2F0aW9uIDAiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZVZzRnNNaXNtYXRjaEJ5TG9jYXRpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBsb2NhdGlvbiBtaXNtYXRjaGVzIGFjcm9zcyB0aGUgdmVydGV4LT5mcmFnbWVudCBzaGFkZXIgaW50ZXJmYWNlOyBUaGlzIHNob3VsZCBtYW5pZmVzdCAiCisgICAgICAgICJhcyBhIG5vdC13cml0dGVuL25vdC1jb25zdW1lZCBwYWlyLCBidXQgZmx1c2hlcyBvdXQgYnJva2VuIHdhbGtpbmcgb2YgdGhlIGludGVyZmFjZXMiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJvdXQgYmxvY2sgeyBsYXlvdXQobG9jYXRpb249MSkgZmxvYXQgeDsgfSBvdXRzO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBvdXRzLnggPSAwO1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDEpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiaW4gYmxvY2sgeyBsYXlvdXQobG9jYXRpb249MCkgZmxvYXQgeDsgfSBpbnM7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGNvbG9yID0gdmVjNChpbnMueCk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24gMC4wIHdoaWNoIGlzIG5vdCB3cml0dGVuIGJ5IHZlcnRleCBzaGFkZXIiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZVZzRnNNaXNtYXRjaEJ5Q29tcG9uZW50KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgY29tcG9uZW50IG1pc21hdGNoZXMgYWNyb3NzIHRoZSB2ZXJ0ZXgtPmZyYWdtZW50IHNoYWRlciBpbnRlcmZhY2UuIEl0J3Mgbm90IGVub3VnaCB0byAiCisgICAgICAgICJoYXZlIHRoZSBzYW1lIHNldCBvZiBsb2NhdGlvbnMgaW4gdXNlOyBtYXRjaGluZyBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIHNwaXJ2IHZhcmlhYmxlcy4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJvdXQgYmxvY2sgeyBsYXlvdXQobG9jYXRpb249MCwgY29tcG9uZW50PTApIGZsb2F0IHg7IH0gb3V0cztcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgb3V0cy54ID0gMDtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCgxKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImluIGJsb2NrIHsgbGF5b3V0KGxvY2F0aW9uPTAsIGNvbXBvbmVudD0xKSBmbG9hdCB4OyB9IGlucztcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgY29sb3IgPSB2ZWM0KGlucy54KTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbiAwLjEgd2hpY2ggaXMgbm90IHdyaXR0ZW4gYnkgdmVydGV4IHNoYWRlciIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lVnNGc01pc21hdGNoQnlQcmVjaXNpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHRoYXQgdGhlIFJlbGF4ZWRQcmVjaXNpb24gZGVjb3JhdGlvbiBpcyB2YWxpZGF0ZWQgdG8gbWF0Y2giKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCBtZWRpdW1wIGZsb2F0IHg7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7IGdsX1Bvc2l0aW9uID0gdmVjNCgwKTsgeCA9IDEuMDsgfVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBpbiBoaWdocCBmbG9hdCB4O1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCB2ZWM0IGNvbG9yO1xuIgorICAgICAgICAidm9pZCBtYWluKCkgeyBjb2xvciA9IHZlYzQoeCk7IH1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJkaWZmZXIgaW4gcHJlY2lzaW9uIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVWc0ZzTWlzbWF0Y2hCeVByZWNpc2lvbkJsb2NrKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IHRoZSBSZWxheGVkUHJlY2lzaW9uIGRlY29yYXRpb24gaXMgdmFsaWRhdGVkIHRvIG1hdGNoIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICp2c1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIm91dCBibG9jayB7IGxheW91dChsb2NhdGlvbj0wKSBtZWRpdW1wIGZsb2F0IHg7IH07XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7IGdsX1Bvc2l0aW9uID0gdmVjNCgwKTsgeCA9IDEuMDsgfVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgImluIGJsb2NrIHsgbGF5b3V0KGxvY2F0aW9uPTApIGhpZ2hwIGZsb2F0IHg7IH07XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7IGNvbG9yID0gdmVjNCh4KTsgfVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCB2c1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBjb25zdCBhdXRvIHNldF9pbmZvID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgImRpZmZlciBpbiBwcmVjaXNpb24iKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUF0dHJpYk5vdENvbnN1bWVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IGEgd2FybmluZyBpcyBwcm9kdWNlZCBmb3IgYSB2ZXJ0ZXggYXR0cmlidXRlIHdoaWNoIGlzIG5vdCBjb25zdW1lZCBieSB0aGUgdmVydGV4IHNoYWRlciIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBpbnB1dF9iaW5kaW5nOworICAgIG1lbXNldCgmaW5wdXRfYmluZGluZywgMCwgc2l6ZW9mKGlucHV0X2JpbmRpbmcpKTsKKworICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiBpbnB1dF9hdHRyaWI7CisgICAgbWVtc2V0KCZpbnB1dF9hdHRyaWIsIDAsIHNpemVvZihpbnB1dF9hdHRyaWIpKTsKKyAgICBpbnB1dF9hdHRyaWIuZm9ybWF0ID0gVktfRk9STUFUX1IzMl9TRkxPQVQ7CisKKyAgICBjb25zdCBhdXRvIHNldF9pbmZvID0gWyZdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9ICZpbnB1dF9iaW5kaW5nOworICAgICAgICBoZWxwZXIudmlfY2lfLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gJmlucHV0X2F0dHJpYjsKKyAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbiAwIG5vdCBjb25zdW1lZCBieSB2ZXJ0ZXggc2hhZGVyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVBdHRyaWJMb2NhdGlvbk1pc21hdGNoKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhIHdhcm5pbmcgaXMgcHJvZHVjZWQgZm9yIGEgbG9jYXRpb24gbWlzbWF0Y2ggb24gdmVydGV4IGF0dHJpYnV0ZXMuIFRoaXMgZmx1c2hlcyBvdXQgYmFkIGJlaGF2aW9yIGluIHRoZSAiCisgICAgICAgICJpbnRlcmZhY2Ugd2Fsa2VyIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIGlucHV0X2JpbmRpbmc7CisgICAgbWVtc2V0KCZpbnB1dF9iaW5kaW5nLCAwLCBzaXplb2YoaW5wdXRfYmluZGluZykpOworCisgICAgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIGlucHV0X2F0dHJpYjsKKyAgICBtZW1zZXQoJmlucHV0X2F0dHJpYiwgMCwgc2l6ZW9mKGlucHV0X2F0dHJpYikpOworICAgIGlucHV0X2F0dHJpYi5mb3JtYXQgPSBWS19GT1JNQVRfUjMyX1NGTE9BVDsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIudmlfY2lfLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gJmlucHV0X2JpbmRpbmc7CisgICAgICAgIGhlbHBlci52aV9jaV8udmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSAxOworICAgICAgICBoZWxwZXIudmlfY2lfLnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgPSAmaW5wdXRfYXR0cmliOworICAgICAgICBoZWxwZXIudmlfY2lfLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSAxOworICAgIH07CisgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVmVydGV4IHNoYWRlciBjb25zdW1lcyBpbnB1dCBhdCBsb2NhdGlvbiAxIGJ1dCBub3QgcHJvdmlkZWQiKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbiAwIG5vdCBjb25zdW1lZCBieSB2ZXJ0ZXggc2hhZGVyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVBdHRyaWJOb3RQcm92aWRlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgYSB2ZXJ0ZXggc2hhZGVyIGlucHV0IHdoaWNoIGlzIG5vdCBwcm92aWRlZCBieSBhIHZlcnRleCBhdHRyaWJ1dGUiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgaW4gdmVjNCB4O1xuIiAvKiBub3QgcHJvdmlkZWQgKi8KKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB4O1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGhlbHBlci5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVydGV4IHNoYWRlciBjb25zdW1lcyBpbnB1dCBhdCBsb2NhdGlvbiAwIGJ1dCBub3QgcHJvdmlkZWQiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUF0dHJpYlR5cGVNaXNtYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgYW4gZXJyb3IgaXMgcHJvZHVjZWQgZm9yIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgZnVuZGFtZW50YWwgdHlwZSAoZmxvYXQvaW50L3VpbnQpIG9mIGFuIGF0dHJpYnV0ZSBhbmQgdGhlICIKKyAgICAgICAgInZlcnRleCBzaGFkZXIgaW5wdXQgdGhhdCBjb25zdW1lcyBpdCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBpbnB1dF9iaW5kaW5nOworICAgIG1lbXNldCgmaW5wdXRfYmluZGluZywgMCwgc2l6ZW9mKGlucHV0X2JpbmRpbmcpKTsKKworICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiBpbnB1dF9hdHRyaWI7CisgICAgbWVtc2V0KCZpbnB1dF9hdHRyaWIsIDAsIHNpemVvZihpbnB1dF9hdHRyaWIpKTsKKyAgICBpbnB1dF9hdHRyaWIuZm9ybWF0ID0gVktfRk9STUFUX1IzMl9TRkxPQVQ7CisKKyAgICBjaGFyIGNvbnN0ICp2c1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIGluIGludCB4O1xuIiAvKiBhdHRyaWIgcHJvdmlkZWQgZmxvYXQgKi8KKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHgpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGhlbHBlci5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9ICZpbnB1dF9iaW5kaW5nOworICAgICAgICBoZWxwZXIudmlfY2lfLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gJmlucHV0X2F0dHJpYjsKKyAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24gMCBkb2VzIG5vdCBtYXRjaCB2ZXJ0ZXggc2hhZGVyIGlucHV0IHR5cGUiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUR1cGxpY2F0ZVN0YWdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBhIHBpcGVsaW5lIGNvbnRhaW5pbmcgbXVsdGlwbGUgc2hhZGVycyBmb3IgdGhlIHNhbWUgc3RhZ2UiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGhlbHBlci52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyLmZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIH07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBzaGFkZXJzIHByb3ZpZGVkIGZvciBzdGFnZSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lTWlzc2luZ0VudHJ5cG9pbnQpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMsICJmb28iKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiTm8gZW50cnlwb2ludCBmb3VuZCBuYW1lZCBgZm9vYCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lRGVwdGhTdGVuY2lsUmVxdWlyZWQpIHsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAicERlcHRoU3RlbmNpbFN0YXRlIGlzIE5VTEwgd2hlbiByYXN0ZXJpemF0aW9uIGlzIGVuYWJsZWQgYW5kIHN1YnBhc3MgdXNlcyBhIGRlcHRoL3N0ZW5jaWwgYXR0YWNobWVudCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworCisgICAgVmtEZXNjcmlwdG9yU2V0T2JqIGRlc2NyaXB0b3JTZXQobV9kZXZpY2UpOworICAgIGRlc2NyaXB0b3JTZXQuQXBwZW5kRHVtbXkoKTsKKyAgICBkZXNjcmlwdG9yU2V0LkNyZWF0ZVZLRGVzY3JpcHRvclNldChtX2NvbW1hbmRCdWZmZXIpOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudHNbXSA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwKKyAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAwLAorICAgICAgICAgICAgVktfRk9STUFUX0QxNl9VTk9STSwKKyAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgICAgIH0sCisgICAgfTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgcmVmc1tdID0geworICAgICAgICB7MCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH0sCisgICAgICAgIHsxLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgIH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCAmcmVmc1swXSwgbnVsbHB0ciwgJnJlZnNbMV0sIDAsIG51bGxwdHJ9OworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMiwgYXR0YWNobWVudHMsIDEsICZzdWJwYXNzLCAwLCBudWxscHRyfTsKKyAgICBWa1JlbmRlclBhc3MgcnA7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgbnVsbHB0ciwgJnJwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKGRlc2NyaXB0b3JTZXQuR2V0UGlwZWxpbmVMYXlvdXQoKSwgcnApOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVUZXNzUGF0Y2hEZWNvcmF0aW9uTWlzbWF0Y2gpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBhIHZhcmlhYmxlIG91dHB1dCBmcm9tIHRoZSBUQ1Mgd2l0aG91dCB0aGUgcGF0Y2ggZGVjb3JhdGlvbiwgYnV0IGNvbnN1bWVkIGluIHRoZSBURVMgIgorICAgICAgICAid2l0aCB0aGUgZGVjb3JhdGlvbi4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGlmICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkudGVzc2VsbGF0aW9uU2hhZGVyKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGVzc2VsbGF0aW9uIHNoYWRlcnM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjaGFyIGNvbnN0ICp0Y3NTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IGludCB4W107XG4iCisgICAgICAgICJsYXlvdXQodmVydGljZXM9Mykgb3V0O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBnbF9UZXNzTGV2ZWxPdXRlclswXSA9IGdsX1Rlc3NMZXZlbE91dGVyWzFdID0gZ2xfVGVzc0xldmVsT3V0ZXJbMl0gPSAxO1xuIgorICAgICAgICAiICAgZ2xfVGVzc0xldmVsSW5uZXJbMF0gPSAxO1xuIgorICAgICAgICAiICAgeFtnbF9JbnZvY2F0aW9uSURdID0gZ2xfSW52b2NhdGlvbklEO1xuIgorICAgICAgICAifVxuIjsKKyAgICBjaGFyIGNvbnN0ICp0ZXNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJsYXlvdXQodHJpYW5nbGVzLCBlcXVhbF9zcGFjaW5nLCBjdykgaW47XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgcGF0Y2ggaW4gaW50IHg7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uLnh5eiA9IGdsX1Rlc3NDb29yZDtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uLncgPSB4O1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiB0Y3MobV9kZXZpY2UsIHRjc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogdGVzKG1fZGV2aWNlLCB0ZXNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQsIHRoaXMpOworCisgICAgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gaWFzY2l7VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QsIFZLX0ZBTFNFfTsKKworICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gdHNjaXtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDN9OworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5ncF9jaV8ucFRlc3NlbGxhdGlvblN0YXRlID0gJnRzY2k7CisgICAgICAgIGhlbHBlci5ncF9jaV8ucElucHV0QXNzZW1ibHlTdGF0ZSA9ICZpYXNjaTsKKyAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfLmVtcGxhY2VfYmFjayh0Y3MuR2V0U3RhZ2VDcmVhdGVJbmZvKCkpOworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18uZW1wbGFjZV9iYWNrKHRlcy5HZXRTdGFnZUNyZWF0ZUluZm8oKSk7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJpcyBwZXItdmVydGV4IGluIHRlc3NlbGxhdGlvbiBjb250cm9sIHNoYWRlciBzdGFnZSBidXQgcGVyLXBhdGNoIGluIHRlc3NlbGxhdGlvbiBldmFsdWF0aW9uIHNoYWRlciBzdGFnZSIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lVGVzc0Vycm9ycykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdmFyaW91cyBlcnJvcnMgd2hlbiBjcmVhdGluZyBhIGdyYXBoaWNzIHBpcGVsaW5lIHdpdGggdGVzc2VsbGF0aW9uIHN0YWdlcyBhY3RpdmUuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnRlc3NlbGxhdGlvblNoYWRlcikgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRlc3NlbGxhdGlvbiBzaGFkZXJzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2hhciBjb25zdCAqdGNzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAibGF5b3V0KHZlcnRpY2VzPTMpIG91dDtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfVGVzc0xldmVsT3V0ZXJbMF0gPSBnbF9UZXNzTGV2ZWxPdXRlclsxXSA9IGdsX1Rlc3NMZXZlbE91dGVyWzJdID0gMTtcbiIKKyAgICAgICAgIiAgIGdsX1Rlc3NMZXZlbElubmVyWzBdID0gMTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgY2hhciBjb25zdCAqdGVzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAibGF5b3V0KHRyaWFuZ2xlcywgZXF1YWxfc3BhY2luZywgY3cpIGluO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbi54eXogPSBnbF9UZXNzQ29vcmQ7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbi53ID0gMDtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgVmtTaGFkZXJPYmogdGNzKG1fZGV2aWNlLCB0Y3NTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIHRlcyhtX2RldmljZSwgdGVzU291cmNlLCBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlhc2Npe1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNULCBWS19GQUxTRX07CisKKyAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIHRzY2l7VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAzfTsKKworICAgIHN0ZDo6dmVjdG9yPFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8+IHNoYWRlcl9zdGFnZXMgPSB7fTsKKyAgICBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyBpYXNjaV9iYWQgPSBpYXNjaTsKKyAgICBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyAqcF9pYXNjaSA9IG51bGxwdHI7CisgICAgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyB0c2NpX2JhZCA9IHRzY2k7CisgICAgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyAqcF90c2NpID0gbnVsbHB0cjsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuZ3BfY2lfLnBUZXNzZWxsYXRpb25TdGF0ZSA9IHBfdHNjaTsKKyAgICAgICAgaGVscGVyLmdwX2NpXy5wSW5wdXRBc3NlbWJseVN0YXRlID0gcF9pYXNjaTsKKyAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge2hlbHBlci52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBoZWxwZXIuZnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXy5pbnNlcnQoaGVscGVyLnNoYWRlcl9zdGFnZXNfLmVuZCgpLCBzaGFkZXJfc3RhZ2VzLmJlZ2luKCksIHNoYWRlcl9zdGFnZXMuZW5kKCkpOworICAgIH07CisKKyAgICBpYXNjaV9iYWQudG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfTElTVDsgIC8vIG90aGVyd2lzZSB3ZSBnZXQgYSBmYWlsdXJlIGFib3V0IGludmFsaWQgdG9wb2xvZ3kKKyAgICBwX2lhc2NpID0gJmlhc2NpX2JhZDsKKyAgICAvLyBQYXNzIGEgdGVzcyBjb250cm9sIHNoYWRlciB3aXRob3V0IGEgdGVzcyBldmFsIHNoYWRlcgorICAgIHNoYWRlcl9zdGFnZXMgPSB7dGNzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzI5Iik7CisKKyAgICAvLyBQYXNzIGEgdGVzcyBldmFsIHNoYWRlciB3aXRob3V0IGEgdGVzcyBjb250cm9sIHNoYWRlcgorICAgIHNoYWRlcl9zdGFnZXMgPSB7dGVzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzMwIik7CisKKyAgICBwX2lhc2NpID0gJmlhc2NpOworICAgIHNoYWRlcl9zdGFnZXMgPSB7fTsKKyAgICAvLyBQYXNzIHBhdGNoIHRvcG9sb2d5IHdpdGhvdXQgdGVzc2VsbGF0aW9uIHNoYWRlcnMKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby10b3BvbG9neS0wMDczNyIpOworCisgICAgc2hhZGVyX3N0YWdlcyA9IHt0Y3MuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIHRlcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgLy8gUGFzcyBhIE5VTEwgcFRlc3NlbGxhdGlvblN0YXRlICh3aXRoIGFjdGl2ZSB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlcykKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1wU3RhZ2VzLTAwNzMxIik7CisKKyAgICAvLyBQYXNzIGFuIGludmFsaWQgcFRlc3NlbGxhdGlvblN0YXRlIChiYWQgc1R5cGUpCisgICAgdHNjaV9iYWQuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBwX3RzY2kgPSAmdHNjaV9iYWQ7CisgICAgc2hhZGVyX3N0YWdlcyA9IHt0Y3MuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIHRlcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tc1R5cGUtc1R5cGUiKTsKKworICAgIC8vIFBhc3Mgb3V0LW9mLXJhbmdlIHBhdGNoQ29udHJvbFBvaW50cworICAgIHBfaWFzY2kgPSAmaWFzY2k7CisgICAgdHNjaV9iYWQgPSB0c2NpOworICAgIHRzY2lfYmFkLnBhdGNoQ29udHJvbFBvaW50cyA9IDA7CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tcGF0Y2hDb250cm9sUG9pbnRzLTAxMjE0Iik7CisKKyAgICB0c2NpX2JhZC5wYXRjaENvbnRyb2xQb2ludHMgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heFRlc3NlbGxhdGlvblBhdGNoU2l6ZSArIDE7CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8tcGF0Y2hDb250cm9sUG9pbnRzLTAxMjE0Iik7CisKKyAgICBwX3RzY2kgPSAmdHNjaTsKKyAgICAvLyBQYXNzIGFuIGludmFsaWQgcHJpbWl0aXZlIHRvcG9sb2d5CisgICAgaWFzY2lfYmFkID0gaWFzY2k7CisgICAgaWFzY2lfYmFkLnRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1Q7CisgICAgcF9pYXNjaSA9ICZpYXNjaV9iYWQ7CisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tcFN0YWdlcy0wMDczNiIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lQXR0cmliQmluZGluZ0NvbmZsaWN0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgYSB2ZXJ0ZXggYXR0cmlidXRlIHNldHVwIHdoZXJlIG11bHRpcGxlIGJpbmRpbmdzIHByb3ZpZGUgdGhlIHNhbWUgbG9jYXRpb24iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8qIFR3byBiaW5kaW5nIGRlc2NyaXB0aW9ucyBmb3IgYmluZGluZyAwICovCisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBpbnB1dF9iaW5kaW5nc1syXTsKKyAgICBtZW1zZXQoaW5wdXRfYmluZGluZ3MsIDAsIHNpemVvZihpbnB1dF9iaW5kaW5ncykpOworCisgICAgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIGlucHV0X2F0dHJpYjsKKyAgICBtZW1zZXQoJmlucHV0X2F0dHJpYiwgMCwgc2l6ZW9mKGlucHV0X2F0dHJpYikpOworICAgIGlucHV0X2F0dHJpYi5mb3JtYXQgPSBWS19GT1JNQVRfUjMyX1NGTE9BVDsKKworICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgaW4gZmxvYXQgeDtcbiIgLyogYXR0cmliIHByb3ZpZGVkIGZsb2F0ICovCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCh4KTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGhlbHBlci5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9IGlucHV0X2JpbmRpbmdzOworICAgICAgICBoZWxwZXIudmlfY2lfLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gMjsKKyAgICAgICAgaGVscGVyLnZpX2NpXy5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gJmlucHV0X2F0dHJpYjsKKyAgICAgICAgaGVscGVyLnZpX2NpXy52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICB9OworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvLXBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLTAwNjE2ICIpOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHZlcnRleCBpbnB1dCBiaW5kaW5nIGRlc2NyaXB0aW9ucyBmb3IgYmluZGluZyAwIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVGcmFnbWVudE91dHB1dE5vdFdyaXR0ZW4pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBhIGZyYWdtZW50IHNoYWRlciB3aGljaCBkb2VzIG5vdCBwcm92aWRlIGFuIG91dHB1dCBmb3Igb25lIG9mIHRoZSBwaXBlbGluZSdzIGNvbG9yICIKKyAgICAgICAgImF0dGFjaG1lbnRzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlTWluaW1hbFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHtoZWxwZXIudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICBoZWxwZXIuY2JfYXR0YWNobWVudHNfLmNvbG9yV3JpdGVNYXNrID0gMTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRhY2htZW50IDAgbm90IHdyaXR0ZW4gYnkgZnJhZ21lbnQgc2hhZGVyIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVGcmFnbWVudE91dHB1dE5vdENvbnN1bWVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhIHdhcm5pbmcgaXMgcHJvZHVjZWQgZm9yIGEgZnJhZ21lbnQgc2hhZGVyIHdoaWNoIHByb3ZpZGVzIGEgc3B1cmlvdXMgb3V0cHV0IHdpdGggbm8gbWF0Y2hpbmcgYXR0YWNobWVudCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTEpIG91dCB2ZWM0IHk7XG4iIC8qIG5vIG1hdGNoaW5nIGF0dGFjaG1lbnQgZm9yIHRoaXMgKi8KKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgeCA9IHZlYzQoMSk7XG4iCisgICAgICAgICIgICB5ID0gdmVjNCgxKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFnbWVudCBzaGFkZXIgd3JpdGVzIHRvIG91dHB1dCBsb2NhdGlvbiAxIHdpdGggbm8gbWF0Y2hpbmcgYXR0YWNobWVudCIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lRnJhZ21lbnROb091dHB1dExvY2F0aW9uMEJ1dEFscGhhVG9Db3ZlcmFnZUVuYWJsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHRoYXQgYW4gZXJyb3IgaXMgcHJvZHVjZWQgd2hlbiBhbHBoYSB0byBjb3ZlcmFnZSBpcyBlbmFibGVkIGJ1dCBubyBvdXRwdXQgYXQgbG9jYXRpb24gMCBpcyBkZWNsYXJlZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgwdSkpOworCisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZU1pbmltYWxTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyBtc19zdGF0ZV9jaSA9IHt9OworICAgIG1zX3N0YXRlX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTVVMVElTQU1QTEVfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgbXNfc3RhdGVfY2kucmFzdGVyaXphdGlvblNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgbXNfc3RhdGVfY2kuYWxwaGFUb0NvdmVyYWdlRW5hYmxlID0gVktfVFJVRTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICAgICAgaGVscGVyLnBpcGVfbXNfc3RhdGVfY2lfID0gbXNfc3RhdGVfY2k7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJmcmFnbWVudCBzaGFkZXIgZG9lc24ndCBkZWNsYXJlIGFscGhhIG91dHB1dCBhdCBsb2NhdGlvbiAwIGV2ZW4gdGhvdWdoIGFscGhhIHRvIGNvdmVyYWdlIGlzIGVuYWJsZWQuIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVGcmFnbWVudE5vQWxwaGFMb2NhdGlvbjBCdXRBbHBoYVRvQ292ZXJhZ2VFbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCB3aGVuIGFscGhhIHRvIGNvdmVyYWdlIGlzIGVuYWJsZWQgYnV0IG91dHB1dCBhdCBsb2NhdGlvbiAwIGRvZXNuJ3QgaGF2ZSBhbHBoYSBjaGFubmVsLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KDB1KSk7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjMyB4O1xuIgorICAgICAgICAiXG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIHggPSB2ZWMzKDEpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIG1zX3N0YXRlX2NpID0ge307CisgICAgbXNfc3RhdGVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBtc19zdGF0ZV9jaS5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBtc19zdGF0ZV9jaS5hbHBoYVRvQ292ZXJhZ2VFbmFibGUgPSBWS19UUlVFOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHtoZWxwZXIudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICBoZWxwZXIucGlwZV9tc19zdGF0ZV9jaV8gPSBtc19zdGF0ZV9jaTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgKKyAgICAgICAgKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgImZyYWdtZW50IHNoYWRlciBkb2Vzbid0IGRlY2xhcmUgYWxwaGEgb3V0cHV0IGF0IGxvY2F0aW9uIDAgZXZlbiB0aG91Z2ggYWxwaGEgdG8gY292ZXJhZ2UgaXMgZW5hYmxlZC4iKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUZyYWdtZW50T3V0cHV0VHlwZU1pc21hdGNoKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgYSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSBmdW5kYW1lbnRhbCB0eXBlIG9mIGFuIGZyYWdtZW50IHNoYWRlciBvdXRwdXQgdmFyaWFibGUsIGFuZCB0aGUgIgorICAgICAgICAiZm9ybWF0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IGl2ZWM0IHg7XG4iIC8qIG5vdCBVTk9STSAqLworICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB4ID0gaXZlYzQoMSk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2VzIG5vdCBtYXRjaCBmcmFnbWVudCBzaGFkZXIgb3V0cHV0IHR5cGUiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUV4Y2VlZE1heFZlcnRleE91dHB1dENvbXBvbmVudHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIHdoZW4gdGhlIG51bWJlciBvZiBvdXRwdXQgY29tcG9uZW50cyBmcm9tIHRoZSB2ZXJ0ZXggc3RhZ2UgZXhjZWVkcyB0aGUgZGV2aWNlIGxpbWl0Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBvdmVyZmxvdyA9PSAwOiBubyBvdmVyZmxvdywgMTogdG9vIG1hbnkgY29tcG9uZW50cywgMjogbG9jYXRpb24gbnVtYmVyIHRvbyBsYXJnZQorICAgIGZvciAoaW50IG92ZXJmbG93ID0gMDsgb3ZlcmZsb3cgPCAzOyArK292ZXJmbG93KSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5SZXNldCgpOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1heFZzT3V0Q29tcCA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyArIG92ZXJmbG93OworICAgICAgICBzdGQ6OnN0cmluZyB2c1NvdXJjZVN0ciA9ICIjdmVyc2lvbiA0NTBcblxuIjsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbnVtVmVjNCA9IG1heFZzT3V0Q29tcCAvIDQ7CisgICAgICAgIHVpbnQzMl90IGxvY2F0aW9uID0gMDsKKyAgICAgICAgaWYgKG92ZXJmbG93ID09IDIpIHsKKyAgICAgICAgICAgIHZzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKG51bVZlYzQgKyAxKSArICIpIG91dCB2ZWM0IHZuO1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1WZWM0OyBpKyspIHsKKyAgICAgICAgICAgICAgICB2c1NvdXJjZVN0ciArPSAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhsb2NhdGlvbikgKyAiKSBvdXQgdmVjNCB2IiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIjtcbiI7CisgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlbWFpbmRlciA9IG1heFZzT3V0Q29tcCAlIDQ7CisgICAgICAgICAgICBpZiAocmVtYWluZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluZGVyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdnNTb3VyY2VTdHIgKz0gImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcobG9jYXRpb24pICsgIikgb3V0IGZsb2F0IiArICIgdm47XG4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZzU291cmNlU3RyICs9CisgICAgICAgICAgICAgICAgICAgICAgICAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhsb2NhdGlvbikgKyAiKSBvdXQgdmVjIiArIHN0ZDo6dG9fc3RyaW5nKHJlbWFpbmRlcikgKyAiIHZuO1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2c1NvdXJjZVN0ciArPQorICAgICAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAgICAgIn1cbiI7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZnNTb3VyY2VTdHIgPQorICAgICAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgICAgICIgICAgY29sb3IgPSB2ZWM0KDEpO1xuIgorICAgICAgICAgICAgIn1cbiI7CisKKyAgICAgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzU291cmNlU3RyLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICAgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlU3RyLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgICAgIH07CisKKyAgICAgICAgc3dpdGNoIChvdmVyZmxvdykgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVydGV4IHNoYWRlciBvdXRwdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0IGV4Y2VlZHMgY29tcG9uZW50IGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFZlcnRleE91dHB1dENvbXBvbmVudHMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICAgICAgICAgICAgICp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJWZXJ0ZXggc2hhZGVyIGV4Y2VlZHMgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWZXJ0ZXggc2hhZGVyIG91dHB1dCB2YXJpYWJsZSB1c2VzIGxvY2F0aW9uIHRoYXQgZXhjZWVkcyBjb21wb25lbnQgbGltaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyJ9KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVFeGNlZWRNYXhUZXNzZWxsYXRpb25Db250cm9sSW5wdXRPdXRwdXRDb21wb25lbnRzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBlcnJvcnMgYXJlIHByb2R1Y2VkIHdoZW4gdGhlIG51bWJlciBvZiBwZXItdmVydGV4IGlucHV0IGFuZC9vciBvdXRwdXQgY29tcG9uZW50cyB0byB0aGUgdGVzc2VsbGF0aW9uIGNvbnRyb2wgIgorICAgICAgICAic3RhZ2UgZXhjZWVkcyB0aGUgZGV2aWNlIGxpbWl0Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBvdmVyZmxvdyA9PSAwOiBubyBvdmVyZmxvdywgMTogdG9vIG1hbnkgY29tcG9uZW50cywgMjogbG9jYXRpb24gbnVtYmVyIHRvbyBsYXJnZQorICAgIGZvciAoaW50IG92ZXJmbG93ID0gMDsgb3ZlcmZsb3cgPCAzOyArK292ZXJmbG93KSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5SZXNldCgpOworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdDsKKyAgICAgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoZ3B1KCksICZmZWF0KTsKKyAgICAgICAgaWYgKCFmZWF0LnRlc3NlbGxhdGlvblNoYWRlcikgeworICAgICAgICAgICAgcHJpbnRmKCIlcyB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlKHMpIHVuc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVzc2VsbGF0aW9uIGNvbnRyb2wgc3RhZ2UKKyAgICAgICAgc3RkOjpzdHJpbmcgdGNzU291cmNlU3RyID0KKyAgICAgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgICAgICJcbiI7CisgICAgICAgIC8vIElucHV0IGNvbXBvbmVudHMKKyAgICAgICAgY29uc3QgdWludDMyX3QgbWF4VGVzY0luQ29tcCA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleElucHV0Q29tcG9uZW50cyArIG92ZXJmbG93OworICAgICAgICBjb25zdCB1aW50MzJfdCBudW1JblZlYzQgPSBtYXhUZXNjSW5Db21wIC8gNDsKKyAgICAgICAgdWludDMyX3QgaW5Mb2NhdGlvbiA9IDA7CisgICAgICAgIGlmIChvdmVyZmxvdyA9PSAyKSB7CisgICAgICAgICAgICB0Y3NTb3VyY2VTdHIgKz0gImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcobnVtSW5WZWM0ICsgMSkgKyAiKSBpbiB2ZWM0IHZuSW5bXTtcbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtSW5WZWM0OyBpKyspIHsKKyAgICAgICAgICAgICAgICB0Y3NTb3VyY2VTdHIgKz0gImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcoaW5Mb2NhdGlvbikgKyAiKSBpbiB2ZWM0IHYiICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiSW5bXTtcbiI7CisgICAgICAgICAgICAgICAgaW5Mb2NhdGlvbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaW5SZW1haW5kZXIgPSBtYXhUZXNjSW5Db21wICUgNDsKKyAgICAgICAgICAgIGlmIChpblJlbWFpbmRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGluUmVtYWluZGVyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKGluTG9jYXRpb24pICsgIikgaW4gZmxvYXQiICsgIiB2bkluW107XG4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRjc1NvdXJjZVN0ciArPQorICAgICAgICAgICAgICAgICAgICAgICAgImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcoaW5Mb2NhdGlvbikgKyAiKSBpbiB2ZWMiICsgc3RkOjp0b19zdHJpbmcoaW5SZW1haW5kZXIpICsgIiB2bkluW107XG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbkxvY2F0aW9uICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPdXRwdXQgY29tcG9uZW50cworICAgICAgICBjb25zdCB1aW50MzJfdCBtYXhUZXNjT3V0Q29tcCA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMgKyBvdmVyZmxvdzsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbnVtT3V0VmVjNCA9IG1heFRlc2NPdXRDb21wIC8gNDsKKyAgICAgICAgdWludDMyX3Qgb3V0TG9jYXRpb24gPSAwOworICAgICAgICBpZiAob3ZlcmZsb3cgPT0gMikgeworICAgICAgICAgICAgdGNzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKG51bU91dFZlYzQgKyAxKSArICIpIG91dCB2ZWM0IHZuT3V0WzNdO1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1PdXRWZWM0OyBpKyspIHsKKyAgICAgICAgICAgICAgICB0Y3NTb3VyY2VTdHIgKz0gImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcob3V0TG9jYXRpb24pICsgIikgb3V0IHZlYzQgdiIgKyBzdGQ6OnRvX3N0cmluZyhpKSArICJPdXRbM107XG4iOworICAgICAgICAgICAgICAgIG91dExvY2F0aW9uICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBvdXRSZW1haW5kZXIgPSBtYXhUZXNjT3V0Q29tcCAlIDQ7CisgICAgICAgICAgICBpZiAob3V0UmVtYWluZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0UmVtYWluZGVyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKG91dExvY2F0aW9uKSArICIpIG91dCBmbG9hdCIgKyAiIHZuT3V0WzNdO1xuIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0Y3NTb3VyY2VTdHIgKz0gImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcob3V0TG9jYXRpb24pICsgIikgb3V0IHZlYyIgKyBzdGQ6OnRvX3N0cmluZyhvdXRSZW1haW5kZXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm5PdXRbM107XG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRMb2NhdGlvbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGNzU291cmNlU3RyICs9ICJsYXlvdXQodmVydGljZXM9Mykgb3V0O1xuIjsKKyAgICAgICAgLy8gRmluYWxpemUKKyAgICAgICAgdGNzU291cmNlU3RyICs9CisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICAgICAifVxuIjsKKworICAgICAgICBWa1NoYWRlck9iaiB0Y3MobV9kZXZpY2UsIHRjc1NvdXJjZVN0ci5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklULCB0aGlzKTsKKyAgICAgICAgVmtTaGFkZXJPYmogdGVzKG1fZGV2aWNlLCBiaW5kU3RhdGVUZXNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQsIHRoaXMpOworCisgICAgICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlucHV0QXNzZW1ibHlJbmZvID0ge307CisgICAgICAgIGlucHV0QXNzZW1ibHlJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgICAgIGlucHV0QXNzZW1ibHlJbmZvLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgaW5wdXRBc3NlbWJseUluZm8uZmxhZ3MgPSAwOworICAgICAgICBpbnB1dEFzc2VtYmx5SW5mby50b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNUOworICAgICAgICBpbnB1dEFzc2VtYmx5SW5mby5wcmltaXRpdmVSZXN0YXJ0RW5hYmxlID0gVktfRkFMU0U7CisKKyAgICAgICAgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyB0ZXNzSW5mbyA9IHt9OworICAgICAgICB0ZXNzSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICAgICAgdGVzc0luZm8ucE5leHQgPSBOVUxMOworICAgICAgICB0ZXNzSW5mby5mbGFncyA9IDA7CisgICAgICAgIHRlc3NJbmZvLnBhdGNoQ29udHJvbFBvaW50cyA9IDM7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItSW5wdXROb3RQcm9kdWNlZCIpOworCisgICAgICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge2hlbHBlci52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCB0Y3MuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIHRlcy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIuZnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgICAgICAgICBoZWxwZXIuZ3BfY2lfLnBUZXNzZWxsYXRpb25TdGF0ZSA9ICZ0ZXNzSW5mbzsKKyAgICAgICAgICAgIGhlbHBlci5ncF9jaV8ucElucHV0QXNzZW1ibHlTdGF0ZSA9ICZpbnB1dEFzc2VtYmx5SW5mbzsKKyAgICAgICAgfTsKKworICAgICAgICBzd2l0Y2ggKG92ZXJmbG93KSB7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KAorICAgICAgICAgICAgICAgICAgICAqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPnsiVGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIGlucHV0IHZhcmlhYmxlIHVzZXMgbG9jYXRpb24gdGhhdCBleGNlZWRzIGNvbXBvbmVudCBsaW1pdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3NlbGxhdGlvbiBjb250cm9sIHNoYWRlciBvdXRwdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0IGV4Y2VlZHMgY29tcG9uZW50IGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIn0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgKKyAgICAgICAgICAgICAgICAgICAgKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz57IlRlc3NlbGxhdGlvbiBjb250cm9sIHNoYWRlciBleGNlZWRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhJbnB1dENvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIGV4Y2VlZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGVzc2VsbGF0aW9uQ29udHJvbFBlclZlcnRleE91dHB1dENvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzc2VsbGF0aW9uIGNvbnRyb2wgc2hhZGVyIGlucHV0IHZhcmlhYmxlIHVzZXMgbG9jYXRpb24gdGhhdCBleGNlZWRzIGNvbXBvbmVudCBsaW1pdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXNzZWxsYXRpb25Db250cm9sUGVyVmVydGV4SW5wdXRDb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3NlbGxhdGlvbiBjb250cm9sIHNoYWRlciBvdXRwdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0IGV4Y2VlZHMgY29tcG9uZW50IGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFRlc3NlbGxhdGlvbkNvbnRyb2xQZXJWZXJ0ZXhPdXRwdXRDb21wb25lbnRzIn0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUV4Y2VlZE1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dE91dHB1dENvbXBvbmVudHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGVycm9ycyBhcmUgcHJvZHVjZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGlucHV0IGFuZC9vciBvdXRwdXQgY29tcG9uZW50cyB0byB0aGUgdGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc3RhZ2UgIgorICAgICAgICAiZXhjZWVkcyB0aGUgZGV2aWNlIGxpbWl0Iik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBvdmVyZmxvdyA9PSAwOiBubyBvdmVyZmxvdywgMTogdG9vIG1hbnkgY29tcG9uZW50cywgMjogbG9jYXRpb24gbnVtYmVyIHRvbyBsYXJnZQorICAgIGZvciAoaW50IG92ZXJmbG93ID0gMDsgb3ZlcmZsb3cgPCAzOyArK292ZXJmbG93KSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5SZXNldCgpOworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdDsKKyAgICAgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoZ3B1KCksICZmZWF0KTsKKyAgICAgICAgaWYgKCFmZWF0LnRlc3NlbGxhdGlvblNoYWRlcikgeworICAgICAgICAgICAgcHJpbnRmKCIlcyB0ZXNzZWxsYXRpb24gc2hhZGVyIHN0YWdlKHMpIHVuc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc3RhZ2UKKyAgICAgICAgc3RkOjpzdHJpbmcgdGVzU291cmNlU3RyID0KKyAgICAgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJsYXlvdXQgKHRyaWFuZ2xlcykgaW47XG4iCisgICAgICAgICAgICAiXG4iOworICAgICAgICAvLyBJbnB1dCBjb21wb25lbnRzCisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1heFRlc2VJbkNvbXAgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dENvbXBvbmVudHMgKyBvdmVyZmxvdzsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbnVtSW5WZWM0ID0gbWF4VGVzZUluQ29tcCAvIDQ7CisgICAgICAgIHVpbnQzMl90IGluTG9jYXRpb24gPSAwOworICAgICAgICBpZiAob3ZlcmZsb3cgPT0gMikgeworICAgICAgICAgICAgdGVzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKG51bUluVmVjNCArIDEpICsgIikgaW4gdmVjNCB2bkluW107XG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUluVmVjNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGVzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKGluTG9jYXRpb24pICsgIikgaW4gdmVjNCB2IiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIkluW107XG4iOworICAgICAgICAgICAgICAgIGluTG9jYXRpb24gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGluUmVtYWluZGVyID0gbWF4VGVzZUluQ29tcCAlIDQ7CisgICAgICAgICAgICBpZiAoaW5SZW1haW5kZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpblJlbWFpbmRlciA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRlc1NvdXJjZVN0ciArPSAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhpbkxvY2F0aW9uKSArICIpIGluIGZsb2F0IiArICIgdm5JbltdO1xuIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZXNTb3VyY2VTdHIgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKGluTG9jYXRpb24pICsgIikgaW4gdmVjIiArIHN0ZDo6dG9fc3RyaW5nKGluUmVtYWluZGVyKSArICIgdm5JbltdO1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5Mb2NhdGlvbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3V0cHV0IGNvbXBvbmVudHMKKyAgICAgICAgY29uc3QgdWludDMyX3QgbWF4VGVzZU91dENvbXAgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzICsgb3ZlcmZsb3c7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bU91dFZlYzQgPSBtYXhUZXNlT3V0Q29tcCAvIDQ7CisgICAgICAgIHVpbnQzMl90IG91dExvY2F0aW9uID0gMDsKKyAgICAgICAgaWYgKG92ZXJmbG93ID09IDIpIHsKKyAgICAgICAgICAgIHRlc1NvdXJjZVN0ciArPSAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhudW1PdXRWZWM0ICsgMSkgKyAiKSBvdXQgdmVjNCB2bk91dDtcbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtT3V0VmVjNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGVzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKG91dExvY2F0aW9uKSArICIpIG91dCB2ZWM0IHYiICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiT3V0O1xuIjsKKyAgICAgICAgICAgICAgICBvdXRMb2NhdGlvbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgb3V0UmVtYWluZGVyID0gbWF4VGVzZU91dENvbXAgJSA0OworICAgICAgICAgICAgaWYgKG91dFJlbWFpbmRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dFJlbWFpbmRlciA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRlc1NvdXJjZVN0ciArPSAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhvdXRMb2NhdGlvbikgKyAiKSBvdXQgZmxvYXQiICsgIiB2bk91dDtcbiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzU291cmNlU3RyICs9CisgICAgICAgICAgICAgICAgICAgICAgICAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhvdXRMb2NhdGlvbikgKyAiKSBvdXQgdmVjIiArIHN0ZDo6dG9fc3RyaW5nKG91dFJlbWFpbmRlcikgKyAiIHZuT3V0O1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0TG9jYXRpb24gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmFsaXplCisgICAgICAgIHRlc1NvdXJjZVN0ciArPQorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAgICAgIn1cbiI7CisKKyAgICAgICAgVmtTaGFkZXJPYmogdGNzKG1fZGV2aWNlLCBiaW5kU3RhdGVUc2NTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklULCB0aGlzKTsKKyAgICAgICAgVmtTaGFkZXJPYmogdGVzKG1fZGV2aWNlLCB0ZXNTb3VyY2VTdHIuY19zdHIoKSwgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCwgdGhpcyk7CisKKyAgICAgICAgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gaW5wdXRBc3NlbWJseUluZm8gPSB7fTsKKyAgICAgICAgaW5wdXRBc3NlbWJseUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICAgICAgaW5wdXRBc3NlbWJseUluZm8ucE5leHQgPSBOVUxMOworICAgICAgICBpbnB1dEFzc2VtYmx5SW5mby5mbGFncyA9IDA7CisgICAgICAgIGlucHV0QXNzZW1ibHlJbmZvLnRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1Q7CisgICAgICAgIGlucHV0QXNzZW1ibHlJbmZvLnByaW1pdGl2ZVJlc3RhcnRFbmFibGUgPSBWS19GQUxTRTsKKworICAgICAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIHRlc3NJbmZvID0ge307CisgICAgICAgIHRlc3NJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX1NUQVRFX0NSRUFURV9JTkZPOworICAgICAgICB0ZXNzSW5mby5wTmV4dCA9IE5VTEw7CisgICAgICAgIHRlc3NJbmZvLmZsYWdzID0gMDsKKyAgICAgICAgdGVzc0luZm8ucGF0Y2hDb250cm9sUG9pbnRzID0gMzsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0VW5leHBlY3RlZEVycm9yKCJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1JbnB1dE5vdFByb2R1Y2VkIik7CisKKyAgICAgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIHRjcy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgdGVzLkdldFN0YWdlQ3JlYXRlSW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlci5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICAgICAgICAgIGhlbHBlci5ncF9jaV8ucFRlc3NlbGxhdGlvblN0YXRlID0gJnRlc3NJbmZvOworICAgICAgICAgICAgaGVscGVyLmdwX2NpXy5wSW5wdXRBc3NlbWJseVN0YXRlID0gJmlucHV0QXNzZW1ibHlJbmZvOworICAgICAgICB9OworCisgICAgICAgIHN3aXRjaCAob3ZlcmZsb3cpIHsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICAgICAgICAgICAgICp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJUZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXIgaW5wdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0IGV4Y2VlZHMgY29tcG9uZW50IGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25JbnB1dENvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc2hhZGVyIG91dHB1dCB2YXJpYWJsZSB1c2VzIGxvY2F0aW9uIHRoYXQgZXhjZWVkcyBjb21wb25lbnQgbGltaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMifSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KAorICAgICAgICAgICAgICAgICAgICAqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJUZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXIgZXhjZWVkcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzaGFkZXIgZXhjZWVkcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhUZXNzZWxsYXRpb25FdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc2hhZGVyIGlucHV0IHZhcmlhYmxlIHVzZXMgbG9jYXRpb24gdGhhdCBleGNlZWRzIGNvbXBvbmVudCBsaW1pdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4VGVzc2VsbGF0aW9uRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGVzc2VsbGF0aW9uIGV2YWx1YXRpb24gc2hhZGVyIG91dHB1dCB2YXJpYWJsZSB1c2VzIGxvY2F0aW9uIHRoYXQgZXhjZWVkcyBjb21wb25lbnQgbGltaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heFRlc3NlbGxhdGlvbkV2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzIn0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUV4Y2VlZE1heEdlb21ldHJ5SW5wdXRPdXRwdXRDb21wb25lbnRzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBlcnJvcnMgYXJlIHByb2R1Y2VkIHdoZW4gdGhlIG51bWJlciBvZiBpbnB1dCBhbmQvb3Igb3V0cHV0IGNvbXBvbmVudHMgdG8gdGhlIGdlb21ldHJ5IHN0YWdlIGV4Y2VlZHMgdGhlIGRldmljZSAiCisgICAgICAgICJsaW1pdCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gb3ZlcmZsb3cgPT0gMDogbm8gb3ZlcmZsb3csIDE6IHRvbyBtYW55IGNvbXBvbmVudHMsIDI6IGxvY2F0aW9uIG51bWJlciB0b28gbGFyZ2UKKyAgICBmb3IgKGludCBvdmVyZmxvdyA9IDA7IG92ZXJmbG93IDwgMzsgKytvdmVyZmxvdykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+UmVzZXQoKTsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGZlYXQ7CisgICAgICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKGdwdSgpLCAmZmVhdCk7CisgICAgICAgIGlmICghZmVhdC5nZW9tZXRyeVNoYWRlcikgeworICAgICAgICAgICAgcHJpbnRmKCIlcyBnZW9tZXRyeSBzaGFkZXIgc3RhZ2UgdW5zdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBnc1NvdXJjZVN0ciA9CisgICAgICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAibGF5b3V0KHRyaWFuZ2xlcykgaW47XG4iCisgICAgICAgICAgICAibGF5b3V0KGludm9jYXRpb25zPTEpIGluO1xuIjsKKworICAgICAgICAvLyBJbnB1dCBjb21wb25lbnRzCisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1heEdlb21JbkNvbXAgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzICsgb3ZlcmZsb3c7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bUluVmVjNCA9IG1heEdlb21JbkNvbXAgLyA0OworICAgICAgICB1aW50MzJfdCBpbkxvY2F0aW9uID0gMDsKKyAgICAgICAgaWYgKG92ZXJmbG93ID09IDIpIHsKKyAgICAgICAgICAgIGdzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKG51bUluVmVjNCArIDEpICsgIikgaW4gdmVjNCB2bkluW107XG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUluVmVjNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ3NTb3VyY2VTdHIgKz0gImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcoaW5Mb2NhdGlvbikgKyAiKSBpbiB2ZWM0IHYiICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiSW5bXTtcbiI7CisgICAgICAgICAgICAgICAgaW5Mb2NhdGlvbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaW5SZW1haW5kZXIgPSBtYXhHZW9tSW5Db21wICUgNDsKKyAgICAgICAgICAgIGlmIChpblJlbWFpbmRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGluUmVtYWluZGVyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3NTb3VyY2VTdHIgKz0gImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcoaW5Mb2NhdGlvbikgKyAiKSBpbiBmbG9hdCIgKyAiIHZuSW5bXTtcbiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ3NTb3VyY2VTdHIgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKGluTG9jYXRpb24pICsgIikgaW4gdmVjIiArIHN0ZDo6dG9fc3RyaW5nKGluUmVtYWluZGVyKSArICIgdm5JbltdO1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5Mb2NhdGlvbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3V0cHV0IGNvbXBvbmVudHMKKyAgICAgICAgY29uc3QgdWludDMyX3QgbWF4R2VvbU91dENvbXAgPSBtX2RldmljZS0+cHJvcHMubGltaXRzLm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyArIG92ZXJmbG93OworICAgICAgICBjb25zdCB1aW50MzJfdCBudW1PdXRWZWM0ID0gbWF4R2VvbU91dENvbXAgLyA0OworICAgICAgICB1aW50MzJfdCBvdXRMb2NhdGlvbiA9IDA7CisgICAgICAgIGlmIChvdmVyZmxvdyA9PSAyKSB7CisgICAgICAgICAgICBnc1NvdXJjZVN0ciArPSAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhudW1PdXRWZWM0KSArICIpIG91dCB2ZWM0IHZuT3V0O1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1PdXRWZWM0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBnc1NvdXJjZVN0ciArPSAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhvdXRMb2NhdGlvbikgKyAiKSBvdXQgdmVjNCB2IiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIk91dDtcbiI7CisgICAgICAgICAgICAgICAgb3V0TG9jYXRpb24gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG91dFJlbWFpbmRlciA9IG1heEdlb21PdXRDb21wICUgNDsKKyAgICAgICAgICAgIGlmIChvdXRSZW1haW5kZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChvdXRSZW1haW5kZXIgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBnc1NvdXJjZVN0ciArPSAibGF5b3V0KGxvY2F0aW9uPSIgKyBzdGQ6OnRvX3N0cmluZyhvdXRMb2NhdGlvbikgKyAiKSBvdXQgZmxvYXQiICsgIiB2bk91dDtcbiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ3NTb3VyY2VTdHIgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKG91dExvY2F0aW9uKSArICIpIG91dCB2ZWMiICsgc3RkOjp0b19zdHJpbmcob3V0UmVtYWluZGVyKSArICIgdm5PdXQ7XG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRMb2NhdGlvbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmluYWxpemUKKyAgICAgICAgaW50IG1heF92ZXJ0aWNlcyA9IG92ZXJmbG93ID8gKG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHMgLyBtYXhHZW9tT3V0Q29tcCArIDEpIDogMTsKKyAgICAgICAgZ3NTb3VyY2VTdHIgKz0gImxheW91dCh0cmlhbmdsZV9zdHJpcCwgbWF4X3ZlcnRpY2VzID0gIiArIHN0ZDo6dG9fc3RyaW5nKG1heF92ZXJ0aWNlcykgKworICAgICAgICAgICAgICAgICAgICAgICAiKSBvdXQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAgICAgICAgICAgICAgICAifVxuIjsKKworICAgICAgICBWa1NoYWRlck9iaiBncyhtX2RldmljZSwgZ3NTb3VyY2VTdHIuY19zdHIoKSwgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCwgdGhpcyk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldFVuZXhwZWN0ZWRFcnJvcigiVU5BU1NJR05FRC1Db3JlVmFsaWRhdGlvbi1TaGFkZXItSW5wdXROb3RQcm9kdWNlZCIpOworCisgICAgICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge2hlbHBlci52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBncy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgaGVscGVyLmZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICB9OworCisgICAgICAgIHN3aXRjaCAob3ZlcmZsb3cpIHsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICAgICAgICAgICAgICp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJHZW9tZXRyeSBzaGFkZXIgaW5wdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0IGV4Y2VlZHMgY29tcG9uZW50IGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlb21ldHJ5IHNoYWRlciBvdXRwdXQgdmFyaWFibGUgdXNlcyBsb2NhdGlvbiB0aGF0IGV4Y2VlZHMgY29tcG9uZW50IGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyJ9KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICAgICAgICAgICAgICp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJHZW9tZXRyeSBzaGFkZXIgZXhjZWVkcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW9tZXRyeSBzaGFkZXIgZXhjZWVkcyBWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VvbWV0cnkgc2hhZGVyIGlucHV0IHZhcmlhYmxlIHVzZXMgbG9jYXRpb24gdGhhdCBleGNlZWRzIGNvbXBvbmVudCBsaW1pdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW9tZXRyeSBzaGFkZXIgb3V0cHV0IHZhcmlhYmxlIHVzZXMgbG9jYXRpb24gdGhhdCBleGNlZWRzIGNvbXBvbmVudCBsaW1pdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VvbWV0cnkgc2hhZGVyIGV4Y2VlZHMgVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHMifSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiIsIHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lRXhjZWVkTWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIHdoZW4gdGhlIG51bWJlciBvZiBpbnB1dCBjb21wb25lbnRzIGZyb20gdGhlIGZyYWdtZW50IHN0YWdlIGV4Y2VlZHMgdGhlIGRldmljZSBsaW1pdCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gb3ZlcmZsb3cgPT0gMDogbm8gb3ZlcmZsb3csIDE6IHRvbyBtYW55IGNvbXBvbmVudHMsIDI6IGxvY2F0aW9uIG51bWJlciB0b28gbGFyZ2UKKyAgICBmb3IgKGludCBvdmVyZmxvdyA9IDA7IG92ZXJmbG93IDwgMzsgKytvdmVyZmxvdykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+UmVzZXQoKTsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBtYXhGc0luQ29tcCA9IG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMgKyBvdmVyZmxvdzsKKyAgICAgICAgc3RkOjpzdHJpbmcgZnNTb3VyY2VTdHIgPSAiI3ZlcnNpb24gNDUwXG5cbiI7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bVZlYzQgPSBtYXhGc0luQ29tcCAvIDQ7CisgICAgICAgIHVpbnQzMl90IGxvY2F0aW9uID0gMDsKKyAgICAgICAgaWYgKG92ZXJmbG93ID09IDIpIHsKKyAgICAgICAgICAgIGZzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKG51bVZlYzQgKyAxKSArICIpIGluIGZsb2F0IiArICIgdm47XG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bVZlYzQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZzU291cmNlU3RyICs9ICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKGxvY2F0aW9uKSArICIpIGluIHZlYzQgdiIgKyBzdGQ6OnRvX3N0cmluZyhpKSArICI7XG4iOworICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCByZW1haW5kZXIgPSBtYXhGc0luQ29tcCAlIDQ7CisgICAgICAgICAgICBpZiAocmVtYWluZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluZGVyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZnNTb3VyY2VTdHIgKz0gImxheW91dChsb2NhdGlvbj0iICsgc3RkOjp0b19zdHJpbmcobG9jYXRpb24pICsgIikgaW4gZmxvYXQiICsgIiB2bjtcbiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnNTb3VyY2VTdHIgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQobG9jYXRpb249IiArIHN0ZDo6dG9fc3RyaW5nKGxvY2F0aW9uKSArICIpIGluIHZlYyIgKyBzdGQ6OnRvX3N0cmluZyhyZW1haW5kZXIpICsgIiB2bjtcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnNTb3VyY2VTdHIgKz0KKyAgICAgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7IgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAgICAgIiAgICBjb2xvciA9IHZlYzQoMSk7XG4iCisgICAgICAgICAgICAifVxuIjsKKyAgICAgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlU3RyLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlVOQVNTSUdORUQtQ29yZVZhbGlkYXRpb24tU2hhZGVyLUlucHV0Tm90UHJvZHVjZWQiKTsKKyAgICAgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICAgICAgfTsKKyAgICAgICAgc3dpdGNoIChvdmVyZmxvdykgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhZ21lbnQgc2hhZGVyIGlucHV0IHZhcmlhYmxlIHVzZXMgbG9jYXRpb24gdGhhdCBleGNlZWRzIGNvbXBvbmVudCBsaW1pdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlTGltaXRzOjptYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgKKyAgICAgICAgICAgICAgICAgICAgKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz57IkZyYWdtZW50IHNoYWRlciBleGNlZWRzIFZrUGh5c2ljYWxEZXZpY2VMaW1pdHM6Om1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYWdtZW50IHNoYWRlciBpbnB1dCB2YXJpYWJsZSB1c2VzIGxvY2F0aW9uIHRoYXQgZXhjZWVkcyBjb21wb25lbnQgbGltaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZUxpbWl0czo6bWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMifSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiIsIHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lRXhjZWVkTWF4R2VvbWV0cnlJbnN0YW5jZVZlcnRleENvdW50KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBlcnJvcnMgYXJlIHByb2R1Y2VkIHdoZW4gdGhlIG51bWJlciBvZiBvdXRwdXQgdmVydGljZXMvaW5zdGFuY2VzIGluIHRoZSBnZW9tZXRyeSBzdGFnZSBleGNlZWRzIHRoZSBkZXZpY2UgIgorICAgICAgICAibGltaXQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGZvciAoaW50IG92ZXJmbG93ID0gMDsgb3ZlcmZsb3cgPCAyOyArK292ZXJmbG93KSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5SZXNldCgpOworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdDsKKyAgICAgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoZ3B1KCksICZmZWF0KTsKKyAgICAgICAgaWYgKCFmZWF0Lmdlb21ldHJ5U2hhZGVyKSB7CisgICAgICAgICAgICBwcmludGYoIiVzIGdlb21ldHJ5IHNoYWRlciBzdGFnZSB1bnN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGdzU291cmNlU3RyID0gUiIoCisgICAgICAgICAgICAgICBPcENhcGFiaWxpdHkgR2VvbWV0cnkKKyAgICAgICAgICAgICAgIE9wTWVtb3J5TW9kZWwgTG9naWNhbCBHTFNMNDUwCisgICAgICAgICAgICAgICBPcEVudHJ5UG9pbnQgR2VvbWV0cnkgJW1haW4gIm1haW4iCisgICAgICAgICAgICAgICBPcEV4ZWN1dGlvbk1vZGUgJW1haW4gSW5wdXRQb2ludHMKKyAgICAgICAgICAgICAgIE9wRXhlY3V0aW9uTW9kZSAlbWFpbiBPdXRwdXRUcmlhbmdsZVN0cmlwCisgICAgICAgICAgICAgICApIjsKKyAgICAgICAgaWYgKG92ZXJmbG93KSB7CisgICAgICAgICAgICBnc1NvdXJjZVN0ciArPSAiT3BFeGVjdXRpb25Nb2RlICVtYWluIEludm9jYXRpb25zICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcobV9kZXZpY2UtPnByb3BzLmxpbWl0cy5tYXhHZW9tZXRyeVNoYWRlckludm9jYXRpb25zICsgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXAorICAgICAgICAgICAgICAgIE9wRXhlY3V0aW9uTW9kZSAlbWFpbiBPdXRwdXRWZXJ0aWNlcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKG1fZGV2aWNlLT5wcm9wcy5saW1pdHMubWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyArIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3NTb3VyY2VTdHIgKz0gUiIoCisgICAgICAgICAgICAgICBPcEV4ZWN1dGlvbk1vZGUgJW1haW4gSW52b2NhdGlvbnMgMQorICAgICAgICAgICAgICAgT3BFeGVjdXRpb25Nb2RlICVtYWluIE91dHB1dFZlcnRpY2VzIDEKKyAgICAgICAgICAgICAgICkiOworICAgICAgICB9CisgICAgICAgIGdzU291cmNlU3RyICs9IFIiKAorICAgICAgICAgICAgICAgT3BTb3VyY2UgR0xTTCA0NTAKKyAgICAgICAldm9pZCA9IE9wVHlwZVZvaWQKKyAgICAgICAgICAlMyA9IE9wVHlwZUZ1bmN0aW9uICV2b2lkCisgICAgICAgJW1haW4gPSBPcEZ1bmN0aW9uICV2b2lkIE5vbmUgJTMKKyAgICAgICAgICAlNSA9IE9wTGFiZWwKKyAgICAgICAgICAgICAgIE9wUmV0dXJuCisgICAgICAgICAgICAgICBPcEZ1bmN0aW9uRW5kCisgICAgICAgICkiOworICAgICAgICBWa1NoYWRlck9iaiBncyhtX2RldmljZSwgZ3NTb3VyY2VTdHIsIFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQsIHRoaXMpOworCisgICAgICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLnNoYWRlcl9zdGFnZXNfID0ge2hlbHBlci52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBncy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgaGVscGVyLmZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICB9OworICAgICAgICBpZiAob3ZlcmZsb3cpIHsKKyAgICAgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8tc3RhZ2UtMDA3MTUifSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIiIsIHRydWUpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lVW5pZm9ybUJsb2NrTm90UHJvdmlkZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBhIHNoYWRlciBjb25zdW1pbmcgYSB1bmlmb3JtIGJsb2NrIHdoaWNoIGhhcyBubyBjb3JyZXNwb25kaW5nIGJpbmRpbmcgaW4gdGhlIHBpcGVsaW5lICIKKyAgICAgICAgImxheW91dCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIm5vdCBkZWNsYXJlZCBpbiBwaXBlbGluZSBsYXlvdXQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1VuaWZvcm1TaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworCisgICAgLyogc2V0IHVwIENCIDA7IHR5cGUgaXMgVU5PUk0gYnkgZGVmYXVsdCAqLworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRPYmogZGVzY3JpcHRvclNldChtX2RldmljZSk7CisgICAgZGVzY3JpcHRvclNldC5DcmVhdGVWS0Rlc2NyaXB0b3JTZXQobV9jb21tYW5kQnVmZmVyKTsKKworICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShkZXNjcmlwdG9yU2V0LkdldFBpcGVsaW5lTGF5b3V0KCksIHJlbmRlclBhc3MoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZVB1c2hDb25zdGFudHNOb3RJbkxheW91dCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgYW4gZXJyb3IgaXMgcHJvZHVjZWQgZm9yIGEgc2hhZGVyIGNvbnN1bWluZyBwdXNoIGNvbnN0YW50cyB3aGljaCBhcmUgbm90IHByb3ZpZGVkIGluIHRoZSBwaXBlbGluZSBsYXlvdXQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQocHVzaF9jb25zdGFudCwgc3RkNDMwKSB1bmlmb3JtIGZvbyB7IGZsb2F0IHg7IH0gY29uc3RzO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IHZlYzQoY29uc3RzLngpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCB2c1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIHBpcGUuZnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLnBpcGVsaW5lX2xheW91dF8gPSBWa1BpcGVsaW5lTGF5b3V0T2JqKG1fZGV2aWNlLCB7fSk7CisgICAgLyogc2hvdWxkIGhhdmUgZ2VuZXJhdGVkIGFuIGVycm9yIC0tIG5vIHB1c2ggY29uc3RhbnQgcmFuZ2VzIHByb3ZpZGVkISAqLworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIm5vdCBkZWNsYXJlZCBpbiBsYXlvdXQiKTsKKyAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUlucHV0QXR0YWNobWVudE1pc3NpbmcpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IGFuIGVycm9yIGlzIHByb2R1Y2VkIGZvciBhIHNoYWRlciBjb25zdW1pbmcgYW4gaW5wdXQgYXR0YWNobWVudCB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHN1YnBhc3MgIgorICAgICAgICAiZGVzY3JpcHRpb24iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQoaW5wdXRfYXR0YWNobWVudF9pbmRleD0wLCBzZXQ9MCwgYmluZGluZz0wKSB1bmlmb3JtIHN1YnBhc3NJbnB1dCB4O1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCB2ZWM0IGNvbG9yO1xuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICAgY29sb3IgPSBzdWJwYXNzTG9hZCh4KTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHtoZWxwZXIudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICBoZWxwZXIuZHNsX2JpbmRpbmdzXyA9IHt7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIG51bGxwdHJ9fTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3VtZXMgaW5wdXQgYXR0YWNobWVudCBpbmRleCAwIGJ1dCBub3QgcHJvdmlkZWQgaW4gc3VicGFzcyIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lSW5wdXRBdHRhY2htZW50VHlwZU1pc21hdGNoKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgYSBzaGFkZXIgY29uc3VtaW5nIGFuIGlucHV0IGF0dGFjaG1lbnQgd2l0aCBhIGZvcm1hdCBoYXZpbmcgYSBkaWZmZXJlbnQgZnVuZGFtZW50YWwgIgorICAgICAgICAidHlwZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IGF0dGFjaG1lbnQgMCBmb3JtYXQgb2YgVktfRk9STUFUX1I4RzhCOEE4X1VJTlQgZG9lcyBub3QgbWF0Y2giKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGlucHV0X2F0dGFjaG1lbnRfaW5kZXg9MCwgc2V0PTAsIGJpbmRpbmc9MCkgdW5pZm9ybSBzdWJwYXNzSW5wdXQgeDtcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgIiAgIGNvbG9yID0gc3VicGFzc0xvYWQoeCk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGRzbGIgPSB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIG51bGxwdHJ9OworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dE9iaiBkc2wobV9kZXZpY2UsIHtkc2xifSk7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBsKG1fZGV2aWNlLCB7JmRzbH0pOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gZGVzY3NbMl0gPSB7CisgICAgICAgIHswLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkUsCisgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VJTlQsIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkUsCisgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMfSwKKyAgICB9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBjb2xvciA9IHsKKyAgICAgICAgMCwKKyAgICAgICAgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICB9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBpbnB1dCA9IHsKKyAgICAgICAgMSwKKyAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsCisgICAgfTsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHNkID0gezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDEsICZpbnB1dCwgMSwgJmNvbG9yLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMiwgZGVzY3MsIDEsICZzZCwgMCwgbnVsbHB0cn07CisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIG51bGxwdHIsICZycCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIGVycm9yIGhlcmUuCisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBsLmhhbmRsZSgpLCBycCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUlucHV0QXR0YWNobWVudE1pc3NpbmdBcnJheSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgYW4gZXJyb3IgaXMgcHJvZHVjZWQgZm9yIGEgc2hhZGVyIGNvbnN1bWluZyBhbiBpbnB1dCBhdHRhY2htZW50IHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc3VicGFzcyAiCisgICAgICAgICJkZXNjcmlwdGlvbiAtLSBhcnJheSBjYXNlIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGlucHV0X2F0dGFjaG1lbnRfaW5kZXg9MCwgc2V0PTAsIGJpbmRpbmc9MCkgdW5pZm9ybSBzdWJwYXNzSW5wdXQgeHNbMV07XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICBjb2xvciA9IHN1YnBhc3NMb2FkKHhzWzBdKTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zaGFkZXJfc3RhZ2VzXyA9IHtoZWxwZXIudnNfLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICBoZWxwZXIuZHNsX2JpbmRpbmdzXyA9IHt7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQsIDIsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIG51bGxwdHJ9fTsKKyAgICB9OworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3VtZXMgaW5wdXQgYXR0YWNobWVudCBpbmRleCAwIGJ1dCBub3QgcHJvdmlkZWQgaW4gc3VicGFzcyIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZUNvbXB1dGVQaXBlbGluZU1pc3NpbmdEZXNjcmlwdG9yKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgYSBjb21wdXRlIHBpcGVsaW5lIGNvbnN1bWluZyBhIGRlc2NyaXB0b3Igd2hpY2ggaXMgbm90IHByb3ZpZGVkIGluIHRoZSBwaXBlbGluZSAiCisgICAgICAgICJsYXlvdXQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICpjc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2FsX3NpemVfeD0xKSBpbjtcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0wKSBidWZmZXIgYmxvY2sgeyB2ZWM0IHg7IH07XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIHggPSB2ZWM0KDEpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIENyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5jc18ucmVzZXQobmV3IFZrU2hhZGVyT2JqKG1fZGV2aWNlLCBjc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCB0aGlzKSk7CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLnBpcGVsaW5lX2xheW91dF8gPSBWa1BpcGVsaW5lTGF5b3V0T2JqKG1fZGV2aWNlLCB7fSk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiU2hhZGVyIHVzZXMgZGVzY3JpcHRvciBzbG90IDAuMCIpOworICAgIHBpcGUuQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lRGVzY3JpcHRvclR5cGVNaXNtYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgYSBwaXBlbGluZSBjb25zdW1pbmcgYSBkZXNjcmlwdG9yLWJhY2tlZCByZXNvdXJjZSBvZiBhIG1pc21hdGNoZWQgdHlwZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGNoYXIgY29uc3QgKmNzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYWxfc2l6ZV94PTEpIGluO1xuIgorICAgICAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTApIGJ1ZmZlciBibG9jayB7IHZlYzQgeDsgfTtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgIiAgIHgueCA9IDEuMGY7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuY3NfLnJlc2V0KG5ldyBWa1NoYWRlck9iaihtX2RldmljZSwgY3NTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgdGhpcykpOworICAgICAgICBoZWxwZXIuZHNsX2JpbmRpbmdzXyA9IHt7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgbnVsbHB0cn19OworICAgIH07CisgICAgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBkZXNjcmlwdG9yIG9mIHR5cGUgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBNdWx0aXBsZVB1c2hEZXNjcmlwdG9yU2V0cykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZlcmlmeSBhbiBlcnJvciBtZXNzYWdlIGZvciBtdWx0aXBsZSBwdXNoIGRlc2NyaXB0b3Igc2V0cy4iKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRTsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgUHVzaCBEZXNjcmlwdG9ycyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBhdXRvIHB1c2hfZGVzY3JpcHRvcl9wcm9wID0gR2V0UHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzKGluc3RhbmNlKCksIGdwdSgpKTsKKyAgICBpZiAocHVzaF9kZXNjcmlwdG9yX3Byb3AubWF4UHVzaERlc2NyaXB0b3JzIDwgMSkgeworICAgICAgICAvLyBTb21lIGltcGxlbWVudGF0aW9ucyByZXBvcnQgYW4gaW52YWxpZCBtYXhQdXNoRGVzY3JpcHRvcnMgb2YgMAorICAgICAgICBwcmludGYoIiVzIG1heFB1c2hEZXNjcmlwdG9ycyBpcyB6ZXJvLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkc2xfYmluZGluZyA9IHt9OworICAgIGRzbF9iaW5kaW5nLmJpbmRpbmcgPSAwOworICAgIGRzbF9iaW5kaW5nLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRzbF9iaW5kaW5nLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZHNsX2JpbmRpbmcuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgZHNsX2JpbmRpbmcucEltbXV0YWJsZVNhbXBsZXJzID0gTlVMTDsKKworICAgIGNvbnN0IHVuc2lnbmVkIGludCBkZXNjcmlwdG9yX3NldF9sYXlvdXRfY291bnQgPSAyOworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dE9iaj4gZHNfbGF5b3V0czsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl9zZXRfbGF5b3V0X2NvdW50OyArK2kpIHsKKyAgICAgICAgZHNsX2JpbmRpbmcuYmluZGluZyA9IGk7CisgICAgICAgIGRzX2xheW91dHMuZW1wbGFjZV9iYWNrKG1fZGV2aWNlLCBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPigxLCBkc2xfYmluZGluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfUFVTSF9ERVNDUklQVE9SX0JJVF9LSFIpOworICAgIH0KKyAgICBjb25zdCBhdXRvICZkc192a19sYXlvdXRzID0gTWFrZVZrSGFuZGxlczxWa0Rlc2NyaXB0b3JTZXRMYXlvdXQ+KGRzX2xheW91dHMpOworCisgICAgVmtQaXBlbGluZUxheW91dCBwaXBlbGluZV9sYXlvdXQ7CisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGlwZWxpbmVfbGF5b3V0X2NpID0ge307CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5wTmV4dCA9IE5VTEw7CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnB1c2hDb25zdGFudFJhbmdlQ291bnQgPSAwOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5wUHVzaENvbnN0YW50UmFuZ2VzID0gTlVMTDsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2kuc2V0TGF5b3V0Q291bnQgPSBkc192a19sYXlvdXRzLnNpemUoKTsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2kucFNldExheW91dHMgPSBkc192a19sYXlvdXRzLmRhdGEoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8tcFNldExheW91dHMtMDAyOTMiKTsKKyAgICB2azo6Q3JlYXRlUGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCAmcGlwZWxpbmVfbGF5b3V0X2NpLCBOVUxMLCAmcGlwZWxpbmVfbGF5b3V0KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBBTURNaXhlZEF0dGFjaG1lbnRTYW1wbGVzVmFsaWRhdGVHcmFwaGljc1BpcGVsaW5lKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IGFuIGVycm9yIG1lc3NhZ2UgZm9yIGFuIGluY29ycmVjdCBncmFwaGljcyBwaXBlbGluZSByYXN0ZXJpemF0aW9uIHNhbXBsZSBjb3VudC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0FNRF9NSVhFRF9BVFRBQ0hNRU5UX1NBTVBMRVNfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfQU1EX01JWEVEX0FUVEFDSE1FTlRfU0FNUExFU19FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19BTURfTUlYRURfQVRUQUNITUVOVF9TQU1QTEVTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIFNldCBhIG1pc21hdGNoZWQgc2FtcGxlIGNvdW50CisgICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIG1zX3N0YXRlX2NpID0ge307CisgICAgbXNfc3RhdGVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBtc19zdGF0ZV9jaS5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF80X0JJVDsKKworICAgIGNvbnN0IGF1dG8gc2V0X2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeyBoZWxwZXIucGlwZV9tc19zdGF0ZV9jaV8gPSBtc19zdGF0ZV9jaTsgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAxNTA1Iik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRnJhbWVidWZmZXJNaXhlZFNhbXBsZXNOVikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZlcmlmeSBWS19OVl9mcmFtZWJ1ZmZlcl9taXhlZF9zYW1wbGVzLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19OVl9GUkFNRUJVRkZFUl9NSVhFRF9TQU1QTEVTX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX05WX0ZSQU1FQlVGRkVSX01JWEVEX1NBTVBMRVNfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgVktfTlZfRlJBTUVCVUZGRVJfTUlYRURfU0FNUExFU19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZGV2aWNlX2ZlYXR1cmVzID0ge307CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcygmZGV2aWNlX2ZlYXR1cmVzKSk7CisgICAgaWYgKFZLX1RSVUUgIT0gZGV2aWNlX2ZlYXR1cmVzLnNhbXBsZVJhdGVTaGFkaW5nKSB7CisgICAgICAgIHByaW50ZigiJXMgVGVzdCByZXF1aXJlcyB1bnN1cHBvcnRlZCBzYW1wbGVSYXRlU2hhZGluZyBmZWF0dXJlLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBzdHJ1Y3QgVGVzdENhc2UgeworICAgICAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgY29sb3Jfc2FtcGxlczsKKyAgICAgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIGRlcHRoX3NhbXBsZXM7CisgICAgICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyByYXN0ZXJfc2FtcGxlczsKKyAgICAgICAgVmtCb29sMzIgZGVwdGhfdGVzdDsKKyAgICAgICAgVmtCb29sMzIgc2FtcGxlX3NoYWRpbmc7CisgICAgICAgIHVpbnQzMl90IHRhYmxlX2NvdW50OworICAgICAgICBib29sIHBvc2l0aXZlVGVzdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgdnVpZDsKKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHRlc3RfY2FzZXMgPSB7CisgICAgICAgIHtWS19TQU1QTEVfQ09VTlRfNF9CSVQsIFZLX1NBTVBMRV9DT1VOVF80X0JJVCwgVktfU0FNUExFX0NPVU5UXzRfQklULCBWS19GQUxTRSwgVktfRkFMU0UsIDEsIHRydWUsCisgICAgICAgICAiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN1YnBhc3MtMDA3NTcifSwKKyAgICAgICAge1ZLX1NBTVBMRV9DT1VOVF80X0JJVCwgVktfU0FNUExFX0NPVU5UXzFfQklULCBWS19TQU1QTEVfQ09VTlRfOF9CSVQsIFZLX0ZBTFNFLCBWS19GQUxTRSwgNCwgZmFsc2UsCisgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYtY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGUtMDE0MDUifSwKKyAgICAgICAge1ZLX1NBTVBMRV9DT1VOVF80X0JJVCwgVktfU0FNUExFX0NPVU5UXzFfQklULCBWS19TQU1QTEVfQ09VTlRfOF9CSVQsIFZLX0ZBTFNFLCBWS19GQUxTRSwgMiwgdHJ1ZSwKKyAgICAgICAgICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZU1vZHVsYXRpb25TdGF0ZUNyZWF0ZUluZm9OVi1jb3ZlcmFnZU1vZHVsYXRpb25UYWJsZUVuYWJsZS0wMTQwNSJ9LAorICAgICAgICB7VktfU0FNUExFX0NPVU5UXzFfQklULCBWS19TQU1QTEVfQ09VTlRfNF9CSVQsIFZLX1NBTVBMRV9DT1VOVF84X0JJVCwgVktfVFJVRSwgVktfRkFMU0UsIDEsIGZhbHNlLAorICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAxNDExIn0sCisgICAgICAgIHtWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX1NBTVBMRV9DT1VOVF84X0JJVCwgVktfU0FNUExFX0NPVU5UXzhfQklULCBWS19UUlVFLCBWS19GQUxTRSwgMSwgdHJ1ZSwKKyAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMTQxMSJ9LAorICAgICAgICB7VktfU0FNUExFX0NPVU5UXzRfQklULCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgVktfRkFMU0UsIFZLX0ZBTFNFLCAxLCBmYWxzZSwKKyAgICAgICAgICJWVUlELVZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8tc3VicGFzcy0wMTQxMiJ9LAorICAgICAgICB7VktfU0FNUExFX0NPVU5UXzRfQklULCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX1NBTVBMRV9DT1VOVF80X0JJVCwgVktfRkFMU0UsIFZLX0ZBTFNFLCAxLCB0cnVlLAorICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAxNDEyIn0sCisgICAgICAgIHtWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX1NBTVBMRV9DT1VOVF80X0JJVCwgVktfU0FNUExFX0NPVU5UXzRfQklULCBWS19GQUxTRSwgVktfVFJVRSwgMSwgZmFsc2UsCisgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8tcmFzdGVyaXphdGlvblNhbXBsZXMtMDE0MTUifSwKKyAgICAgICAge1ZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgVktfU0FNUExFX0NPVU5UXzRfQklULCBWS19TQU1QTEVfQ09VTlRfNF9CSVQsIFZLX0ZBTFNFLCBWS19GQUxTRSwgMSwgdHJ1ZSwKKyAgICAgICAgICJWVUlELVZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mby1yYXN0ZXJpemF0aW9uU2FtcGxlcy0wMTQxNSJ9LAorICAgICAgICB7VktfU0FNUExFX0NPVU5UXzFfQklULCBWS19TQU1QTEVfQ09VTlRfNF9CSVQsIFZLX1NBTVBMRV9DT1VOVF84X0JJVCwgVktfRkFMU0UsIFZLX0ZBTFNFLCAxLCB0cnVlLAorICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAwNzU3In19OworCisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0X2Nhc2UgOiB0ZXN0X2Nhc2VzKSB7CisgICAgICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dFsyXSA9IHt7fSwge319OworICAgICAgICBhdHRbMF0uZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgICAgICBhdHRbMF0uc2FtcGxlcyA9IHRlc3RfY2FzZS5jb2xvcl9zYW1wbGVzOworICAgICAgICBhdHRbMF0uaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgICAgIGF0dFswXS5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisKKyAgICAgICAgYXR0WzFdLmZvcm1hdCA9IFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDsKKyAgICAgICAgYXR0WzFdLnNhbXBsZXMgPSB0ZXN0X2Nhc2UuZGVwdGhfc2FtcGxlczsKKyAgICAgICAgYXR0WzFdLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgICAgICBhdHRbMV0uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw7CisKKyAgICAgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGNyID0gezAsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9OworICAgICAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgZHIgPSB7MSwgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMfTsKKworICAgICAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzcCA9IHt9OworICAgICAgICBzcC5waXBlbGluZUJpbmRQb2ludCA9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M7CisgICAgICAgIHNwLmNvbG9yQXR0YWNobWVudENvdW50ID0gMTsKKyAgICAgICAgc3AucENvbG9yQXR0YWNobWVudHMgPSAmY3I7CisgICAgICAgIHNwLnBSZXNvbHZlQXR0YWNobWVudHMgPSBOVUxMOworICAgICAgICBzcC5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9ICZkcjsKKworICAgICAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GT307CisgICAgICAgIHJwaS5hdHRhY2htZW50Q291bnQgPSAyOworICAgICAgICBycGkucEF0dGFjaG1lbnRzID0gYXR0OworICAgICAgICBycGkuc3VicGFzc0NvdW50ID0gMTsKKyAgICAgICAgcnBpLnBTdWJwYXNzZXMgPSAmc3A7CisKKyAgICAgICAgVmtSZW5kZXJQYXNzIHJwOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrU3VicGFzc0Rlc2NyaXB0aW9uLXBEZXB0aFN0ZW5jaWxBdHRhY2htZW50LTAxNDE4Iik7CisgICAgICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwaSwgbnVsbHB0ciwgJnJwKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvIGRzID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk99OworICAgICAgICBWa1BpcGVsaW5lQ292ZXJhZ2VNb2R1bGF0aW9uU3RhdGVDcmVhdGVJbmZvTlYgY21pID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX01PRFVMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk9fTlZ9OworCisgICAgICAgIC8vIENyZWF0ZSBhIGR1bW15IG1vZHVsYXRpb24gdGFibGUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhlIHBvc2l0aXZlCisgICAgICAgIC8vIGNvdmVyYWdlTW9kdWxhdGlvblRhYmxlQ291bnQgdGVzdC4KKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGNtX3RhYmxle307CisKKyAgICAgICAgY29uc3QgYXV0byBicmVha19zYW1wbGVzID0gWyZjbWksICZycCwgJmRzLCAmY21fdGFibGUsICZ0ZXN0X2Nhc2VdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgICAgIGNtX3RhYmxlLnJlc2l6ZSh0ZXN0X2Nhc2UucmFzdGVyX3NhbXBsZXMgLyB0ZXN0X2Nhc2UuY29sb3Jfc2FtcGxlcyk7CisKKyAgICAgICAgICAgIGNtaS5mbGFncyA9IDA7CisgICAgICAgICAgICBjbWkuY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVFbmFibGUgPSAodGVzdF9jYXNlLnRhYmxlX2NvdW50ID4gMSk7CisgICAgICAgICAgICBjbWkuY292ZXJhZ2VNb2R1bGF0aW9uVGFibGVDb3VudCA9IHRlc3RfY2FzZS50YWJsZV9jb3VudDsKKyAgICAgICAgICAgIGNtaS5wQ292ZXJhZ2VNb2R1bGF0aW9uVGFibGUgPSBjbV90YWJsZS5kYXRhKCk7CisKKyAgICAgICAgICAgIGRzLmRlcHRoVGVzdEVuYWJsZSA9IHRlc3RfY2FzZS5kZXB0aF90ZXN0OworCisgICAgICAgICAgICBoZWxwZXIucGlwZV9tc19zdGF0ZV9jaV8ucE5leHQgPSAmY21pOworICAgICAgICAgICAgaGVscGVyLnBpcGVfbXNfc3RhdGVfY2lfLnJhc3Rlcml6YXRpb25TYW1wbGVzID0gdGVzdF9jYXNlLnJhc3Rlcl9zYW1wbGVzOworICAgICAgICAgICAgaGVscGVyLnBpcGVfbXNfc3RhdGVfY2lfLnNhbXBsZVNoYWRpbmdFbmFibGUgPSB0ZXN0X2Nhc2Uuc2FtcGxlX3NoYWRpbmc7CisKKyAgICAgICAgICAgIGhlbHBlci5ncF9jaV8ucmVuZGVyUGFzcyA9IHJwOworICAgICAgICAgICAgaGVscGVyLmdwX2NpXy5wRGVwdGhTdGVuY2lsU3RhdGUgPSAmZHM7CisgICAgICAgIH07CisKKyAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBicmVha19zYW1wbGVzLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgdGVzdF9jYXNlLnZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Nhc2UucG9zaXRpdmVUZXN0KTsKKworICAgICAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgbnVsbHB0cik7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIEZyYW1lYnVmZmVyTWl4ZWRTYW1wbGVzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IHRoYXQgdGhlIGV4cGVjdGVkIFZVSWRzIGFyZSBoaXRzIHdoZW4gVktfTlZfZnJhbWVidWZmZXJfbWl4ZWRfc2FtcGxlcyBpcyBkaXNhYmxlZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgc3RydWN0IFRlc3RDYXNlIHsKKyAgICAgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIGNvbG9yX3NhbXBsZXM7CisgICAgICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyBkZXB0aF9zYW1wbGVzOworICAgICAgICBWa1NhbXBsZUNvdW50RmxhZ0JpdHMgcmFzdGVyX3NhbXBsZXM7CisgICAgICAgIGJvb2wgcG9zaXRpdmVUZXN0OworICAgIH07CisKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gdGVzdF9jYXNlcyA9IHsKKyAgICAgICAge1ZLX1NBTVBMRV9DT1VOVF8yX0JJVCwgVktfU0FNUExFX0NPVU5UXzRfQklULCBWS19TQU1QTEVfQ09VTlRfOF9CSVQsCisgICAgICAgICBmYWxzZX0sICAvLyBGYWlscyB2azo6Q3JlYXRlUmVuZGVyUGFzcyBhbmQgdms6OkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUKKyAgICAgICAge1ZLX1NBTVBMRV9DT1VOVF80X0JJVCwgVktfU0FNUExFX0NPVU5UXzRfQklULCBWS19TQU1QTEVfQ09VTlRfOF9CSVQsIGZhbHNlfSwgIC8vIEZhaWxzIHZrOjpDcmVhdGVHcmFwaGljc1BpcGVsaW5lCisgICAgICAgIHtWS19TQU1QTEVfQ09VTlRfNF9CSVQsIFZLX1NBTVBMRV9DT1VOVF80X0JJVCwgVktfU0FNUExFX0NPVU5UXzRfQklULCB0cnVlfSAgICAvLyBQYXNzCisgICAgfTsKKworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdF9jYXNlIDogdGVzdF9jYXNlcykgeworICAgICAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRbMl0gPSB7e30sIHt9fTsKKyAgICAgICAgYXR0WzBdLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICAgICAgYXR0WzBdLnNhbXBsZXMgPSB0ZXN0X2Nhc2UuY29sb3Jfc2FtcGxlczsKKyAgICAgICAgYXR0WzBdLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgICAgICBhdHRbMF0uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworCisgICAgICAgIGF0dFsxXS5mb3JtYXQgPSBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQ7CisgICAgICAgIGF0dFsxXS5zYW1wbGVzID0gdGVzdF9jYXNlLmRlcHRoX3NhbXBsZXM7CisgICAgICAgIGF0dFsxXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICAgICAgYXR0WzFdLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOworCisgICAgICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBjciA9IHswLCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfTsKKyAgICAgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGRyID0gezEsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTH07CisKKyAgICAgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3AgPSB7fTsKKyAgICAgICAgc3AucGlwZWxpbmVCaW5kUG9pbnQgPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTOworICAgICAgICBzcC5jb2xvckF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgICAgIHNwLnBDb2xvckF0dGFjaG1lbnRzID0gJmNyOworICAgICAgICBzcC5wUmVzb2x2ZUF0dGFjaG1lbnRzID0gTlVMTDsKKyAgICAgICAgc3AucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSAmZHI7CisKKyAgICAgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk99OworICAgICAgICBycGkuYXR0YWNobWVudENvdW50ID0gMjsKKyAgICAgICAgcnBpLnBBdHRhY2htZW50cyA9IGF0dDsKKyAgICAgICAgcnBpLnN1YnBhc3NDb3VudCA9IDE7CisgICAgICAgIHJwaS5wU3VicGFzc2VzID0gJnNwOworCisgICAgICAgIFZrUmVuZGVyUGFzcyBycDsKKworICAgICAgICBpZiAodGVzdF9jYXNlLmNvbG9yX3NhbXBsZXMgPT0gdGVzdF9jYXNlLmRlcHRoX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtTdWJwYXNzRGVzY3JpcHRpb24tcERlcHRoU3RlbmNpbEF0dGFjaG1lbnQtMDE0MTgiKTsKKyAgICAgICAgfQorCisgICAgICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwaSwgbnVsbHB0ciwgJnJwKTsKKworICAgICAgICBpZiAodGVzdF9jYXNlLmNvbG9yX3NhbXBsZXMgPT0gdGVzdF9jYXNlLmRlcHRoX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAgICAgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyBkcyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9ERVBUSF9TVEVOQ0lMX1NUQVRFX0NSRUFURV9JTkZPfTsKKworICAgICAgICBjb25zdCBhdXRvIGJyZWFrX3NhbXBsZXMgPSBbJnJwLCAmZHMsICZ0ZXN0X2Nhc2VdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsKKyAgICAgICAgICAgIGhlbHBlci5waXBlX21zX3N0YXRlX2NpXy5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IHRlc3RfY2FzZS5yYXN0ZXJfc2FtcGxlczsKKworICAgICAgICAgICAgaGVscGVyLmdwX2NpXy5yZW5kZXJQYXNzID0gcnA7CisgICAgICAgICAgICBoZWxwZXIuZ3BfY2lfLnBEZXB0aFN0ZW5jaWxTdGF0ZSA9ICZkczsKKyAgICAgICAgfTsKKworICAgICAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIGJyZWFrX3NhbXBsZXMsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdWJwYXNzLTAwNzU3IiwgdGVzdF9jYXNlLnBvc2l0aXZlVGVzdCk7CisKKyAgICAgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworICAgIH0KK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBGcmFnbWVudENvdmVyYWdlVG9Db2xvck5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IFZLX05WX2ZyYWdtZW50X2NvdmVyYWdlX3RvX2NvbG9yLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19OVl9GUkFHTUVOVF9DT1ZFUkFHRV9UT19DT0xPUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19OVl9GUkFHTUVOVF9DT1ZFUkFHRV9UT19DT0xPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBWS19OVl9GUkFHTUVOVF9DT1ZFUkFHRV9UT19DT0xPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIHN0cnVjdCBUZXN0Q2FzZSB7CisgICAgICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICAgICAgVmtCb29sMzIgZW5hYmxlZDsKKyAgICAgICAgdWludDMyX3QgbG9jYXRpb247CisgICAgICAgIGJvb2wgcG9zaXRpdmU7CisgICAgfTsKKworICAgIGNvbnN0IHN0ZDo6YXJyYXk8VGVzdENhc2UsIDk+IHRlc3RfY2FzZXMgPSB7eworICAgICAgICB7VktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19GQUxTRSwgMCwgdHJ1ZX0sCisgICAgICAgIHtWS19GT1JNQVRfUjhfVUlOVCwgVktfVFJVRSwgMSwgdHJ1ZX0sCisgICAgICAgIHtWS19GT1JNQVRfUjE2X1VJTlQsIFZLX1RSVUUsIDEsIHRydWV9LAorICAgICAgICB7VktfRk9STUFUX1IxNl9TSU5ULCBWS19UUlVFLCAxLCB0cnVlfSwKKyAgICAgICAge1ZLX0ZPUk1BVF9SMzJfVUlOVCwgVktfVFJVRSwgMSwgdHJ1ZX0sCisgICAgICAgIHtWS19GT1JNQVRfUjMyX1NJTlQsIFZLX1RSVUUsIDEsIHRydWV9LAorICAgICAgICB7VktfRk9STUFUX1IzMl9TSU5ULCBWS19UUlVFLCAyLCBmYWxzZX0sCisgICAgICAgIHtWS19GT1JNQVRfUjhfU0lOVCwgVktfVFJVRSwgMywgZmFsc2V9LAorICAgICAgICB7VktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19UUlVFLCAxLCBmYWxzZX0sCisgICAgfX07CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnRlc3RfY2FzZSA6IHRlc3RfY2FzZXMpIHsKKyAgICAgICAgc3RkOjphcnJheTxWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiwgMj4gYXR0ID0ge3t7fSwge319fTsKKyAgICAgICAgYXR0WzBdLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICAgICAgYXR0WzBdLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgICAgIGF0dFswXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICAgICAgYXR0WzBdLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKworICAgICAgICBhdHRbMV0uZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgICAgICBhdHRbMV0uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICAgICAgYXR0WzFdLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgICAgICBhdHRbMV0uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworCisgICAgICAgIGlmICh0ZXN0X2Nhc2UubG9jYXRpb24gPCBhdHQuc2l6ZSgpKSB7CisgICAgICAgICAgICBhdHRbdGVzdF9jYXNlLmxvY2F0aW9uXS5mb3JtYXQgPSB0ZXN0X2Nhc2UuZm9ybWF0OworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RkOjphcnJheTxWa0F0dGFjaG1lbnRSZWZlcmVuY2UsIDM+IGNyID0ge3t7MCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWS19BVFRBQ0hNRU5UX1VOVVNFRCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH19fTsKKworICAgICAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzcCA9IHt9OworICAgICAgICBzcC5waXBlbGluZUJpbmRQb2ludCA9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M7CisgICAgICAgIHNwLmNvbG9yQXR0YWNobWVudENvdW50ID0gY3Iuc2l6ZSgpOworICAgICAgICBzcC5wQ29sb3JBdHRhY2htZW50cyA9IGNyLmRhdGEoKTsKKworICAgICAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GT307CisgICAgICAgIHJwaS5hdHRhY2htZW50Q291bnQgPSBhdHQuc2l6ZSgpOworICAgICAgICBycGkucEF0dGFjaG1lbnRzID0gYXR0LmRhdGEoKTsKKyAgICAgICAgcnBpLnN1YnBhc3NDb3VudCA9IDE7CisgICAgICAgIHJwaS5wU3VicGFzc2VzID0gJnNwOworCisgICAgICAgIGNvbnN0IHN0ZDo6YXJyYXk8VmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUsIDM+IGNiYSA9IHt7e30sIHt9LCB7fX19OworCisgICAgICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIGNiaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GT307CisgICAgICAgIGNiaS5hdHRhY2htZW50Q291bnQgPSBjYmEuc2l6ZSgpOworICAgICAgICBjYmkucEF0dGFjaG1lbnRzID0gY2JhLmRhdGEoKTsKKworICAgICAgICBWa1JlbmRlclBhc3MgcnA7CisgICAgICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwaSwgbnVsbHB0ciwgJnJwKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICBWa1BpcGVsaW5lQ292ZXJhZ2VUb0NvbG9yU3RhdGVDcmVhdGVJbmZvTlYgY2NpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPVkVSQUdFX1RPX0NPTE9SX1NUQVRFX0NSRUFURV9JTkZPX05WfTsKKworICAgICAgICBjb25zdCBhdXRvIGJyZWFrX3NhbXBsZXMgPSBbJmNjaSwgJmNiaSwgJnJwLCAmdGVzdF9jYXNlXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICBjY2kuY292ZXJhZ2VUb0NvbG9yRW5hYmxlID0gdGVzdF9jYXNlLmVuYWJsZWQ7CisgICAgICAgICAgICBjY2kuY292ZXJhZ2VUb0NvbG9yTG9jYXRpb24gPSB0ZXN0X2Nhc2UubG9jYXRpb247CisKKyAgICAgICAgICAgIGhlbHBlci5waXBlX21zX3N0YXRlX2NpXy5wTmV4dCA9ICZjY2k7CisgICAgICAgICAgICBoZWxwZXIuZ3BfY2lfLnJlbmRlclBhc3MgPSBycDsKKyAgICAgICAgICAgIGhlbHBlci5ncF9jaV8ucENvbG9yQmxlbmRTdGF0ZSA9ICZjYmk7CisgICAgICAgIH07CisKKyAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBicmVha19zYW1wbGVzLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVDb3ZlcmFnZVRvQ29sb3JTdGF0ZUNyZWF0ZUluZm9OVi1jb3ZlcmFnZVRvQ29sb3JFbmFibGUtMDE0MDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlLnBvc2l0aXZlKTsKKworICAgICAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgbnVsbHB0cik7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFZpZXdwb3J0U3dpenpsZU5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IFZLX05WX3ZpZXdwcm90X3N3aXp6bGUuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX05WX1ZJRVdQT1JUX1NXSVpaTEVfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfTlZfVklFV1BPUlRfU1dJWlpMRV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBWS19OVl9WSUVXUE9SVF9TV0laWkxFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtWaWV3cG9ydFN3aXp6bGVOViBpbnZhbGlkX3N3aXp6bGVzID0geworICAgICAgICBWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVigtMSksCisgICAgICAgIFZrVmlld3BvcnRDb29yZGluYXRlU3dpenpsZU5WKC0xKSwKKyAgICAgICAgVmtWaWV3cG9ydENvb3JkaW5hdGVTd2l6emxlTlYoLTEpLAorICAgICAgICBWa1ZpZXdwb3J0Q29vcmRpbmF0ZVN3aXp6bGVOVigtMSksCisgICAgfTsKKworICAgIFZrUGlwZWxpbmVWaWV3cG9ydFN3aXp6bGVTdGF0ZUNyZWF0ZUluZm9OViB2cF9zd2l6emxlX3N0YXRlID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TV0laWkxFX1NUQVRFX0NSRUFURV9JTkZPX05WfTsKKyAgICB2cF9zd2l6emxlX3N0YXRlLnZpZXdwb3J0Q291bnQgPSAxOworICAgIHZwX3N3aXp6bGVfc3RhdGUucFZpZXdwb3J0U3dpenpsZXMgPSAmaW52YWxpZF9zd2l6emxlczsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBleHBlY3RlZF92dWlkcyA9IHsiVlVJRC1Wa1ZpZXdwb3J0U3dpenpsZU5WLXgtcGFyYW1ldGVyIiwgIlZVSUQtVmtWaWV3cG9ydFN3aXp6bGVOVi15LXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrVmlld3BvcnRTd2l6emxlTlYtei1wYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1ZpZXdwb3J0U3dpenpsZU5WLXctcGFyYW1ldGVyIn07CisKKyAgICBhdXRvIGJyZWFrX3N3aXp6bGVzID0gWyZ2cF9zd2l6emxlX3N0YXRlXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7IGhlbHBlci52cF9zdGF0ZV9jaV8ucE5leHQgPSAmdnBfc3dpenpsZV9zdGF0ZTsgfTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgYnJlYWtfc3dpenpsZXMsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCBleHBlY3RlZF92dWlkcyk7CisKKyAgICBzdHJ1Y3QgVGVzdENhc2UgeworICAgICAgICBWa0Jvb2wzMiByYXN0ZXJpemVyRGlzY2FyZEVuYWJsZTsKKyAgICAgICAgdWludDMyX3QgdnBfY291bnQ7CisgICAgICAgIHVpbnQzMl90IHN3aXp6ZWxfdnBfY291bnQ7CisgICAgICAgIGJvb2wgcG9zaXRpdmU7CisgICAgfTsKKworICAgIGNvbnN0IHN0ZDo6YXJyYXk8VGVzdENhc2UsIDM+IHRlc3RfY2FzZXMgPSB7e3tWS19UUlVFLCAxLCAyLCB0cnVlfSwge1ZLX0ZBTFNFLCAxLCAxLCB0cnVlfSwge1ZLX0ZBTFNFLCAxLCAyLCBmYWxzZX19fTsKKworICAgIHN0ZDo6YXJyYXk8VmtWaWV3cG9ydFN3aXp6bGVOViwgMj4gc3dpenpsZXMgPSB7CisgICAgICAgIHt7VktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1hfTlYsIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9ZX05WLAorICAgICAgICAgIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9aX05WLCBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfV19OVn0sCisgICAgICAgICB7VktfVklFV1BPUlRfQ09PUkRJTkFURV9TV0laWkxFX1BPU0lUSVZFX1hfTlYsIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9ZX05WLAorICAgICAgICAgIFZLX1ZJRVdQT1JUX0NPT1JESU5BVEVfU1dJWlpMRV9QT1NJVElWRV9aX05WLCBWS19WSUVXUE9SVF9DT09SRElOQVRFX1NXSVpaTEVfUE9TSVRJVkVfV19OVn19fTsKKworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdF9jYXNlIDogdGVzdF9jYXNlcykgeworICAgICAgICBhc3NlcnQodGVzdF9jYXNlLnZwX2NvdW50IDw9IHN3aXp6bGVzLnNpemUoKSk7CisKKyAgICAgICAgdnBfc3dpenpsZV9zdGF0ZS52aWV3cG9ydENvdW50ID0gdGVzdF9jYXNlLnN3aXp6ZWxfdnBfY291bnQ7CisgICAgICAgIHZwX3N3aXp6bGVfc3RhdGUucFZpZXdwb3J0U3dpenpsZXMgPSBzd2l6emxlcy5kYXRhKCk7CisKKyAgICAgICAgYXV0byBicmVha192cF9jb3VudCA9IFsmdnBfc3dpenpsZV9zdGF0ZSwgJnRlc3RfY2FzZV0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLnJzX3N0YXRlX2NpXy5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA9IHRlc3RfY2FzZS5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZTsKKyAgICAgICAgICAgIGhlbHBlci52cF9zdGF0ZV9jaV8udmlld3BvcnRDb3VudCA9IHRlc3RfY2FzZS52cF9jb3VudDsKKworICAgICAgICAgICAgaGVscGVyLnZwX3N0YXRlX2NpXy5wTmV4dCA9ICZ2cF9zd2l6emxlX3N0YXRlOworICAgICAgICB9OworCisgICAgICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgYnJlYWtfdnBfY291bnQsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVZpZXdwb3J0U3dpenpsZVN0YXRlQ3JlYXRlSW5mb05WLXZpZXdwb3J0Q291bnQtMDEyMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlLnBvc2l0aXZlKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ29vcGVyYXRpdmVNYXRyaXhOVikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgVktfTlZfY29vcGVyYXRpdmVfbWF0cml4LiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgaW5zdGFuY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIHN0ZDo6YXJyYXk8Y29uc3QgY2hhciAqLCAyPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHsKKyAgICAgICAge1ZLX05WX0NPT1BFUkFUSVZFX01BVFJJWF9FWFRFTlNJT05fTkFNRSwgVktfS0hSX1NIQURFUl9GTE9BVDE2X0lOVDhfRVhURU5TSU9OX05BTUV9fTsKKyAgICBmb3IgKGF1dG8gZGV2aWNlX2V4dGVuc2lvbiA6IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zKSB7CisgICAgICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIGRldmljZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKGRldmljZV9leHRlbnNpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChEZXZpY2VJc01vY2tJQ0QoKSB8fCBEZXZpY2VTaW11bGF0aW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBUZXN0IG5vdCBzdXBwb3J0ZWQgYnkgTW9ja0lDRCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgYXV0byBmbG9hdDE2X2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGbG9hdDE2SW50OEZlYXR1cmVzS0hSPigpOworICAgIGF1dG8gY29vcGVyYXRpdmVfbWF0cml4X2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VDb29wZXJhdGl2ZU1hdHJpeEZlYXR1cmVzTlY+KCZmbG9hdDE2X2ZlYXR1cmVzKTsKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmY29vcGVyYXRpdmVfbWF0cml4X2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAmZmVhdHVyZXMyKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiBiaW5kaW5ncygwKTsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogZHNsKG1fZGV2aWNlLCBiaW5kaW5ncyk7CisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwbChtX2RldmljZSwgeyZkc2x9KTsKKworICAgIGNoYXIgY29uc3QgKmNzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9OVl9jb29wZXJhdGl2ZV9tYXRyaXggOiBlbmFibGVcbiIKKyAgICAgICAgIiNleHRlbnNpb24gR0xfS0hSX3NoYWRlcl9zdWJncm91cF9iYXNpYyA6IGVuYWJsZVxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9LSFJfbWVtb3J5X3Njb3BlX3NlbWFudGljcyA6IGVuYWJsZVxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX2V4cGxpY2l0X2FyaXRobWV0aWNfdHlwZXNfZmxvYXQxNiA6IGVuYWJsZVxuIgorICAgICAgICAibGF5b3V0KGxvY2FsX3NpemVfeCA9IDMyKSBpbjtcbiIKKyAgICAgICAgImxheW91dChjb25zdGFudF9pZCA9IDApIGNvbnN0IHVpbnQgQzAgPSAxOyIKKyAgICAgICAgImxheW91dChjb25zdGFudF9pZCA9IDEpIGNvbnN0IHVpbnQgQzEgPSAxOyIKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgLy8gQmFkIHR5cGUKKyAgICAgICAgIiAgIGZjb29wbWF0TlY8MTYsIGdsX1Njb3BlU3ViZ3JvdXAsIDMsIDU+IGJhZFNpemUgPSBmY29vcG1hdE5WPDE2LCBnbF9TY29wZVN1Ymdyb3VwLCAzLCA1PihmbG9hdDE2X3QoMC4wKSk7XG4iCisgICAgICAgIC8vIE5vdCBhIHZhbGlkIG11bHRpcGx5IHdoZW4gQzAgIT0gQzEKKyAgICAgICAgIiAgIGZjb29wbWF0TlY8MTYsIGdsX1Njb3BlU3ViZ3JvdXAsIEMwLCBDMT4gQTtcbiIKKyAgICAgICAgIiAgIGZjb29wbWF0TlY8MTYsIGdsX1Njb3BlU3ViZ3JvdXAsIEMwLCBDMT4gQjtcbiIKKyAgICAgICAgIiAgIGZjb29wbWF0TlY8MTYsIGdsX1Njb3BlU3ViZ3JvdXAsIEMwLCBDMT4gQztcbiIKKyAgICAgICAgIiAgIGNvb3BNYXRNdWxBZGROVihBLCBCLCBDKTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBjb25zdCB1aW50MzJfdCBzcGVjRGF0YVtdID0geworICAgICAgICAxNiwKKyAgICAgICAgOCwKKyAgICB9OworICAgIFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSBlbnRyaWVzW10gPSB7CisgICAgICAgIHswLCBzaXplb2YodWludDMyX3QpICogMCwgc2l6ZW9mKHVpbnQzMl90KX0sCisgICAgICAgIHsxLCBzaXplb2YodWludDMyX3QpICogMSwgc2l6ZW9mKHVpbnQzMl90KX0sCisgICAgfTsKKworICAgIFZrU3BlY2lhbGl6YXRpb25JbmZvIHNwZWNJbmZvID0geworICAgICAgICAyLAorICAgICAgICBlbnRyaWVzLAorICAgICAgICBzaXplb2Yoc3BlY0RhdGEpLAorICAgICAgICBzcGVjRGF0YSwKKyAgICB9OworCisgICAgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLmNzXy5yZXNldChuZXcgVmtTaGFkZXJPYmoobV9kZXZpY2UsIGNzU291cmNlLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIHRoaXMsICJtYWluIiwgZmFsc2UsICZzcGVjSW5mbykpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5waXBlbGluZV9sYXlvdXRfID0gVmtQaXBlbGluZUxheW91dE9iaihtX2RldmljZSwge30pOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1tb2R1bGUtcGFyYW1ldGVyIik7CisgICAgcGlwZS5DcmVhdGVDb21wdXRlUGlwZWxpbmUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1Db29wZXJhdGl2ZU1hdHJpeFR5cGUiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLVNoYWRlci1Db29wZXJhdGl2ZU1hdHJpeE11bEFkZCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXRVbmV4cGVjdGVkRXJyb3IoIlZVSUQtVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mby1tb2R1bGUtcGFyYW1ldGVyIik7CisgICAgcGlwZS5DcmVhdGVDb21wdXRlUGlwZWxpbmUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTdWJncm91cFN1cHBvcnRlZE9wZXJhdGlvbnMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHNoYWRlciB2YWxpZGF0aW9uIHN1cHBvcnQgZm9yIHN1Ymdyb3VwIHN1cHBvcnRlZE9wZXJhdGlvbnMuIik7CisKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyAxLjEgYW5kIHVwIG9ubHkuCisgICAgaWYgKG1fZGV2aWNlLT5wcm9wcy5hcGlWZXJzaW9uIDwgVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIHByaW50ZigiJXMgVnVsa2FuIDEuMSBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoRGV2aWNlSXNNb2NrSUNEKCkgfHwgRGV2aWNlU2ltdWxhdGlvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2U2ltIGRvZXNuJ3Qgc3VwcG9ydCBWdWxrYW4gMS4xLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyBzdWJncm91cF9wcm9wID0gR2V0U3ViZ3JvdXBQcm9wZXJ0aWVzKGluc3RhbmNlKCksIGdwdSgpKTsKKworICAgIC8vIENyZWF0ZVBpcGVsaW5lTGF5b3V0CisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGlwZWxpbmVfbGF5b3V0X2NpID0ge307CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5wTmV4dCA9IE5VTEw7CisgICAgcGlwZWxpbmVfbGF5b3V0X2NpLmZsYWdzID0gMDsKKyAgICBwaXBlbGluZV9sYXlvdXRfY2kuc2V0TGF5b3V0Q291bnQgPSAwOworICAgIHBpcGVsaW5lX2xheW91dF9jaS5wU2V0TGF5b3V0cyA9IFZLX05VTExfSEFORExFOworICAgIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVfbGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jaSwgTlVMTCwgJnBpcGVsaW5lX2xheW91dCk7CisKKyAgICBjb25zdCBzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCBWa1N1Ymdyb3VwRmVhdHVyZUZsYWdCaXRzPiBjYXBhYmlsaXRpZXNbXSA9IHsKKyAgICAgICAgeyJHcm91cE5vblVuaWZvcm0iLCBWS19TVUJHUk9VUF9GRUFUVVJFX0JBU0lDX0JJVH0sCisgICAgICAgIHsiR3JvdXBOb25Vbmlmb3JtVm90ZSIsIFZLX1NVQkdST1VQX0ZFQVRVUkVfVk9URV9CSVR9LAorICAgICAgICB7Ikdyb3VwTm9uVW5pZm9ybUFyaXRobWV0aWMiLCBWS19TVUJHUk9VUF9GRUFUVVJFX0FSSVRITUVUSUNfQklUfSwKKyAgICAgICAgeyJHcm91cE5vblVuaWZvcm1CYWxsb3QiLCBWS19TVUJHUk9VUF9GRUFUVVJFX0JBTExPVF9CSVR9LAorICAgICAgICB7Ikdyb3VwTm9uVW5pZm9ybVNodWZmbGUiLCBWS19TVUJHUk9VUF9GRUFUVVJFX1NIVUZGTEVfQklUfSwKKyAgICAgICAgeyJHcm91cE5vblVuaWZvcm1TaHVmZmxlUmVsYXRpdmUiLCBWS19TVUJHUk9VUF9GRUFUVVJFX1NIVUZGTEVfUkVMQVRJVkVfQklUfSwKKyAgICAgICAgeyJHcm91cE5vblVuaWZvcm1DbHVzdGVyZWQiLCBWS19TVUJHUk9VUF9GRUFUVVJFX0NMVVNURVJFRF9CSVR9LAorICAgICAgICB7Ikdyb3VwTm9uVW5pZm9ybVF1YWQiLCBWS19TVUJHUk9VUF9GRUFUVVJFX1FVQURfQklUfSwKKyAgICB9OworCisgICAgZm9yIChhdXRvICZjYXBhYmlsaXR5IDogY2FwYWJpbGl0aWVzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNwdl9zb3VyY2VbM107CisKKyAgICAgICAgc3B2X3NvdXJjZVswXSA9ICJPcENhcGFiaWxpdHkgIiArIHN0ZDo6c3RyaW5nKGNhcGFiaWxpdHkuZmlyc3QpICsgIlxuIiArIFIiKAorICAgICAgICAgICAgICAgICAgIE9wQ2FwYWJpbGl0eSBTaGFkZXIKKyAgICAgICAgICAgICAgICAgICBPcE1lbW9yeU1vZGVsIExvZ2ljYWwgR0xTTDQ1MAorICAgICAgICAgICAgICAgICAgIE9wRW50cnlQb2ludCBHTENvbXB1dGUgJW1haW4gIm1haW4iCisgICAgICAgICAgICAgICAgICAgT3BFeGVjdXRpb25Nb2RlICVtYWluIExvY2FsU2l6ZSAxIDEgMQorICAgICAgICAgICAldm9pZCA9IE9wVHlwZVZvaWQKKyAgICAgICAgICAgJWZ1bmMgPSBPcFR5cGVGdW5jdGlvbiAldm9pZAorICAgICAgICAgICAlbWFpbiA9IE9wRnVuY3Rpb24gJXZvaWQgTm9uZSAlZnVuYworICAgICAgICAgICAgICU0MCA9IE9wTGFiZWwKKyAgICAgICAgICAgICAgICAgICBPcFJldHVybgorICAgICAgICAgICAgICAgICAgIE9wRnVuY3Rpb25FbmQKKyAgICAgICAgKSI7CisKKyAgICAgICAgc3B2X3NvdXJjZVsxXSA9ICJPcENhcGFiaWxpdHkgIiArIHN0ZDo6c3RyaW5nKGNhcGFiaWxpdHkuZmlyc3QpICsgIlxuIiArIFIiKAorICAgICAgICAgICAgICAgICAgIE9wQ2FwYWJpbGl0eSBTaGFkZXIKKyAgICAgICAgICAgICAgICAgICBPcE1lbW9yeU1vZGVsIExvZ2ljYWwgR0xTTDQ1MAorICAgICAgICAgICAgICAgICAgIE9wRW50cnlQb2ludCBWZXJ0ZXggJW1haW4gIm1haW4iCisgICAgICAgICAgICV2b2lkID0gT3BUeXBlVm9pZAorICAgICAgICAgICAlZnVuYyA9IE9wVHlwZUZ1bmN0aW9uICV2b2lkCisgICAgICAgICAgICVtYWluID0gT3BGdW5jdGlvbiAldm9pZCBOb25lICVmdW5jCisgICAgICAgICAgICAgJTQwID0gT3BMYWJlbAorICAgICAgICAgICAgICAgICAgIE9wUmV0dXJuCisgICAgICAgICAgICAgICAgICAgT3BGdW5jdGlvbkVuZAorICAgICAgICApIjsKKworICAgICAgICBzcHZfc291cmNlWzJdID0gIk9wQ2FwYWJpbGl0eSAiICsgc3RkOjpzdHJpbmcoY2FwYWJpbGl0eS5maXJzdCkgKyAiXG4iICsgUiIoCisgICAgICAgICAgICAgICAgICAgT3BDYXBhYmlsaXR5IFNoYWRlcgorICAgICAgICAgICAgICAgICAgIE9wTWVtb3J5TW9kZWwgTG9naWNhbCBHTFNMNDUwCisgICAgICAgICAgICAgICAgICAgT3BFbnRyeVBvaW50IEZyYWdtZW50ICVtYWluICJtYWluIgorICAgICAgICAgICAgICAgICAgIE9wRXhlY3V0aW9uTW9kZSAlbWFpbiBPcmlnaW5VcHBlckxlZnQKKyAgICAgICAgICAgJXZvaWQgPSBPcFR5cGVWb2lkCisgICAgICAgICAgICVmdW5jID0gT3BUeXBlRnVuY3Rpb24gJXZvaWQKKyAgICAgICAgICAgJW1haW4gPSBPcEZ1bmN0aW9uICV2b2lkIE5vbmUgJWZ1bmMKKyAgICAgICAgICAgICAlNDAgPSBPcExhYmVsCisgICAgICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgICAgICBPcEZ1bmN0aW9uRW5kCisgICAgICAgICkiOworCisgICAgICAgIFZrU2hhZGVyTW9kdWxlIHNoYWRlcl9tb2R1bGVbM107CisgICAgICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc3RhZ2VbM107CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZVNoYWRlck1vZHVsZQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBzcHY7CisgICAgICAgICAgICBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gbW9kdWxlX2NyZWF0ZV9pbmZvOworICAgICAgICAgICAgbW9kdWxlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIG1vZHVsZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgICAgICAgICBBU010b1NQVihTUFZfRU5WX1ZVTEtBTl8xXzEsIDAsIHNwdl9zb3VyY2VbaV0uZGF0YSgpLCBzcHYpOworICAgICAgICAgICAgbW9kdWxlX2NyZWF0ZV9pbmZvLnBDb2RlID0gc3B2LmRhdGEoKTsKKyAgICAgICAgICAgIG1vZHVsZV9jcmVhdGVfaW5mby5jb2RlU2l6ZSA9IHNwdi5zaXplKCkgKiBzaXplb2YodW5zaWduZWQgaW50KTsKKyAgICAgICAgICAgIG1vZHVsZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisKKyAgICAgICAgICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrOjpDcmVhdGVTaGFkZXJNb2R1bGUobV9kZXZpY2UtPmhhbmRsZSgpLCAmbW9kdWxlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmc2hhZGVyX21vZHVsZVtpXSk7CisKKyAgICAgICAgICAgIC8vIE5PVEU6IEl0IGFwcGVhcnMgdGhhdCBmb3IgdGhlIGNhc2Ugb2YgaW52YWxpZCBjYXBhYmlsaXRpZXMgc29tZSBkcml2ZXJzIChyZWNlbnQgQU1EKSBmYWlsIGF0IENyZWF0ZVNoYWRlck1vZHVsZSB0aW1lLgorICAgICAgICAgICAgLy8gICAgICAgTGlrZWx5IHRoZSBjYXBhYmlsaXR5IHRlc3Qgc2hvdWxkIGJlIG1vdmVkIHVwIHRvIENTTSB0aW1lLCBpbXBsZW1lbnRpbmcgU2hhZGVyTW9kdWxlQ3JlYXRlSW5mby1wQ29kZS0wMTA5MAorICAgICAgICAgICAgLy8gICAgICAgTm90ZSgyKSAtLSB5ZXMgSSB0cnVuY2F0ZWQgdGhlIGFib3ZlIFZVSUQgcy50LiB0aGUgVlVJRCBjaGVja2luZyB0b29scyB3b3VsZCBub3QgY2F0Y2ggaXQuCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHNoYWRlcl9tb2R1bGVbaV0gPSBWS19OVUxMX0hBTkRMRTsKKworICAgICAgICAgICAgc3RhZ2VbaV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgICAgICBzdGFnZVtpXS5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGFnZVtpXS5mbGFncyA9IDA7CisgICAgICAgICAgICAvLyBzdGFnZVtpXS5zdGFnZSBpbml0aWFsaXplZCBsYXRlcjsKKyAgICAgICAgICAgIHN0YWdlW2ldLm1vZHVsZSA9IHNoYWRlcl9tb2R1bGVbaV07CisgICAgICAgICAgICBzdGFnZVtpXS5wTmFtZSA9ICJtYWluIjsKKyAgICAgICAgICAgIHN0YWdlW2ldLnBTcGVjaWFsaXphdGlvbkluZm8gPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcworICAgICAgICBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gcGlwZWxpbmVfaW5mbyA9IHt9OworICAgICAgICBwaXBlbGluZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NUFVURV9QSVBFTElORV9DUkVBVEVfSU5GTzsKKyAgICAgICAgcGlwZWxpbmVfaW5mby5wTmV4dCA9IG51bGxwdHI7CisgICAgICAgIHBpcGVsaW5lX2luZm8uZmxhZ3MgPSAwOworICAgICAgICBwaXBlbGluZV9pbmZvLmxheW91dCA9IHBpcGVsaW5lX2xheW91dDsKKyAgICAgICAgcGlwZWxpbmVfaW5mby5iYXNlUGlwZWxpbmVIYW5kbGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICAgICAgcGlwZWxpbmVfaW5mby5iYXNlUGlwZWxpbmVJbmRleCA9IC0xOworICAgICAgICBwaXBlbGluZV9pbmZvLnN0YWdlID0gc3RhZ2VbMF07CisgICAgICAgIHBpcGVsaW5lX2luZm8uc3RhZ2Uuc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQ7CisKKyAgICAgICAgaWYgKHBpcGVsaW5lX2luZm8uc3RhZ2UubW9kdWxlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICBpZiAoIShzdWJncm91cF9wcm9wLnN1cHBvcnRlZE9wZXJhdGlvbnMgJiBjYXBhYmlsaXR5LnNlY29uZCkpIHsKKyAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpzdXBwb3J0ZWRPcGVyYXRpb25zIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShzdWJncm91cF9wcm9wLnN1cHBvcnRlZFN0YWdlcyAmIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCkpIHsKKyAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpzdXBwb3J0ZWRTdGFnZXMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmtQaXBlbGluZSBjc19waXBlbGluZTsKKyAgICAgICAgICAgIHZrOjpDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2luZm8sIG51bGxwdHIsICZjc19waXBlbGluZSk7CisgICAgICAgICAgICB2azo6RGVzdHJveVBpcGVsaW5lKGRldmljZSgpLCBjc19waXBlbGluZSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzdGFnZVsxXS5tb2R1bGUgIT0gVktfTlVMTF9IQU5ETEUpICYmIChzdGFnZVsyXS5tb2R1bGUgIT0gVktfTlVMTF9IQU5ETEUpKSB7CisgICAgICAgICAgICBzdGFnZVsxXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOworICAgICAgICAgICAgc3RhZ2VbMl0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOworCisgICAgICAgICAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgICAgICAgICAgcGlwZS5BZGRTaGFkZXIoc3RhZ2VbMV0pOworICAgICAgICAgICAgcGlwZS5BZGRTaGFkZXIoc3RhZ2VbMl0pOworICAgICAgICAgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisKKyAgICAgICAgICAgIGlmICghKHN1Ymdyb3VwX3Byb3Auc3VwcG9ydGVkT3BlcmF0aW9ucyAmIGNhcGFiaWxpdHkuc2Vjb25kKSkgeworICAgICAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXM6OnN1cHBvcnRlZE9wZXJhdGlvbnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHN1Ymdyb3VwX3Byb3Auc3VwcG9ydGVkU3RhZ2VzICYgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQpKSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllczo6c3VwcG9ydGVkU3RhZ2VzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShzdWJncm91cF9wcm9wLnN1cHBvcnRlZE9wZXJhdGlvbnMgJiBjYXBhYmlsaXR5LnNlY29uZCkpIHsKKyAgICAgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzOjpzdXBwb3J0ZWRPcGVyYXRpb25zIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShzdWJncm91cF9wcm9wLnN1cHBvcnRlZFN0YWdlcyAmIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQpKSB7CisgICAgICAgICAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllczo6c3VwcG9ydGVkU3RhZ2VzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LCByZW5kZXJQYXNzKCkpOworCisgICAgICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZrOjpEZXN0cm95U2hhZGVyTW9kdWxlKGRldmljZSgpLCBzaGFkZXJfbW9kdWxlWzBdLCBudWxscHRyKTsKKyAgICAgICAgdms6OkRlc3Ryb3lTaGFkZXJNb2R1bGUoZGV2aWNlKCksIHNoYWRlcl9tb2R1bGVbMV0sIG51bGxwdHIpOworICAgICAgICB2azo6RGVzdHJveVNoYWRlck1vZHVsZShkZXZpY2UoKSwgc2hhZGVyX21vZHVsZVsyXSwgbnVsbHB0cik7CisgICAgfQorCisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dChkZXZpY2UoKSwgcGlwZWxpbmVfbGF5b3V0LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTdWJncm91cFJlcXVpcmVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkgZm9yIHN1Ymdyb3VwcyBpcyBwcmVzZW50LiIpOworCisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIC8vIDEuMSBhbmQgdXAgb25seS4KKyAgICBpZiAobV9kZXZpY2UtPnByb3BzLmFwaVZlcnNpb24gPCBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBWdWxrYW4gMS4xIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChEZXZpY2VJc01vY2tJQ0QoKSB8fCBEZXZpY2VTaW11bGF0aW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEZXZTaW0gZG9lc24ndCBzdXBwb3J0IFZ1bGthbiAxLjEsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlU3ViZ3JvdXBQcm9wZXJ0aWVzIHN1Ymdyb3VwX3Byb3AgPSBHZXRTdWJncm91cFByb3BlcnRpZXMoaW5zdGFuY2UoKSwgZ3B1KCkpOworCisgICAgYXV0byBxdWV1ZV9mYW1pbHlfcHJvcGVydGllcyA9IG1fZGV2aWNlLT5waHkoKS5xdWV1ZV9wcm9wZXJ0aWVzKCk7CisKKyAgICBib29sIGZvdW5kR3JhcGhpY3MgPSBmYWxzZTsKKyAgICBib29sIGZvdW5kQ29tcHV0ZSA9IGZhbHNlOworCisgICAgZm9yIChhdXRvIHF1ZXVlX2ZhbWlseSA6IHF1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzKSB7CisgICAgICAgIGlmIChxdWV1ZV9mYW1pbHkucXVldWVGbGFncyAmIFZLX1FVRVVFX0NPTVBVVEVfQklUKSB7CisgICAgICAgICAgICBmb3VuZENvbXB1dGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWVfZmFtaWx5LnF1ZXVlRmxhZ3MgJiBWS19RVUVVRV9HUkFQSElDU19CSVQpIHsKKyAgICAgICAgICAgIGZvdW5kR3JhcGhpY3MgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCEoZm91bmRHcmFwaGljcyB8fCBmb3VuZENvbXB1dGUpKSByZXR1cm47CisKKyAgICBBU1NFUlRfR0Uoc3ViZ3JvdXBfcHJvcC5zdWJncm91cFNpemUsIDF1KTsKKworICAgIGlmIChmb3VuZENvbXB1dGUpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoc3ViZ3JvdXBfcHJvcC5zdXBwb3J0ZWRTdGFnZXMgJiBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQpOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHN1Ymdyb3VwX3Byb3Auc3VwcG9ydGVkT3BlcmF0aW9ucyAmIFZLX1NVQkdST1VQX0ZFQVRVUkVfQkFTSUNfQklUKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTdWJncm91cEV4dGVuZGVkVHlwZXNFbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBWS19LSFJfc2hhZGVyX3N1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzLiIpOworICAgIFNldFRhcmdldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8xKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBzdGQ6OmFycmF5PGNvbnN0IGNoYXIgKiwgMj4gcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMgPSB7CisgICAgICAgIHtWS19LSFJfU0hBREVSX1NVQkdST1VQX0VYVEVOREVEX1RZUEVTX0VYVEVOU0lPTl9OQU1FLCBWS19LSFJfU0hBREVSX0ZMT0FUMTZfSU5UOF9FWFRFTlNJT05fTkFNRX19OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2aWNlX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIGRldmljZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisKKyAgICBhdXRvIGZsb2F0MTZfZmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZsb2F0MTZJbnQ4RmVhdHVyZXNLSFI+KCk7CisgICAgYXV0byBleHRlbmRlZF90eXBlc19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFI+KCZmbG9hdDE2X2ZlYXR1cmVzKTsKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmZXh0ZW5kZWRfdHlwZXNfZmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoZ3B1KCksICZmZWF0dXJlczIpOworCisgICAgVmtQaHlzaWNhbERldmljZVN1Ymdyb3VwUHJvcGVydGllcyBzdWJncm91cF9wcm9wID0gR2V0U3ViZ3JvdXBQcm9wZXJ0aWVzKGluc3RhbmNlKCksIGdwdSgpKTsKKyAgICBpZiAoIShzdWJncm91cF9wcm9wLnN1cHBvcnRlZE9wZXJhdGlvbnMgJiBWS19TVUJHUk9VUF9GRUFUVVJFX0FSSVRITUVUSUNfQklUKSB8fAorICAgICAgICAhKHN1Ymdyb3VwX3Byb3Auc3VwcG9ydGVkU3RhZ2VzICYgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUKSB8fCAhZmxvYXQxNl9mZWF0dXJlcy5zaGFkZXJGbG9hdDE2IHx8CisgICAgICAgICFleHRlbmRlZF90eXBlc19mZWF0dXJlcy5zaGFkZXJTdWJncm91cEV4dGVuZGVkVHlwZXMpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBSZXF1aXJlZCBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZmZWF0dXJlczIpKTsKKworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc+IGJpbmRpbmdzKDApOworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dE9iaiBkc2wobV9kZXZpY2UsIGJpbmRpbmdzKTsKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBsKG1fZGV2aWNlLCB7JmRzbH0pOworCisgICAgY2hhciBjb25zdCAqY3NTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICIjZXh0ZW5zaW9uIEdMX0tIUl9zaGFkZXJfc3ViZ3JvdXBfYXJpdGhtZXRpYyA6IGVuYWJsZVxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3N1Ymdyb3VwX2V4dGVuZGVkX3R5cGVzX2Zsb2F0MTYgOiBlbmFibGVcbiIKKyAgICAgICAgIiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl9leHBsaWNpdF9hcml0aG1ldGljX3R5cGVzX2Zsb2F0MTYgOiBlbmFibGVcbiIKKyAgICAgICAgImxheW91dChsb2NhbF9zaXplX3ggPSAzMikgaW47XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICBzdWJncm91cEFkZChmbG9hdDE2X3QoMC4wKSk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLmNzXy5yZXNldCgKKyAgICAgICAgbmV3IFZrU2hhZGVyT2JqKG1fZGV2aWNlLCBjc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCB0aGlzLCAibWFpbiIsIGZhbHNlLCBudWxscHRyLCAvKlNQSVItViAxLjMqLyAzKSk7CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLnBpcGVsaW5lX2xheW91dF8gPSBWa1BpcGVsaW5lTGF5b3V0T2JqKG1fZGV2aWNlLCB7fSk7CisgICAgcGlwZS5DcmVhdGVDb21wdXRlUGlwZWxpbmUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBTdWJncm91cEV4dGVuZGVkVHlwZXNEaXNhYmxlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgVktfS0hSX3NoYWRlcl9zdWJncm91cF9leHRlbmRlZF90eXBlcy4iKTsKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCByZXF1aXJlZCBpbnN0YW5jZSBleHRlbnNpb24gJXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgc3RkOjphcnJheTxjb25zdCBjaGFyICosIDI+IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zID0geworICAgICAgICB7VktfS0hSX1NIQURFUl9TVUJHUk9VUF9FWFRFTkRFRF9UWVBFU19FWFRFTlNJT05fTkFNRSwgVktfS0hSX1NIQURFUl9GTE9BVDE2X0lOVDhfRVhURU5TSU9OX05BTUV9fTsKKyAgICBmb3IgKGF1dG8gZGV2aWNlX2V4dGVuc2lvbiA6IHJlcXVpcmVkX2RldmljZV9leHRlbnNpb25zKSB7CisgICAgICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIGRldmljZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKGRldmljZV9leHRlbnNpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBkZXZpY2VfZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSICE9IG51bGxwdHIpOworCisgICAgYXV0byBmbG9hdDE2X2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGbG9hdDE2SW50OEZlYXR1cmVzS0hSPigpOworICAgIGF1dG8gZXh0ZW5kZWRfdHlwZXNfZmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZVNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlc0ZlYXR1cmVzS0hSPigmZmxvYXQxNl9mZWF0dXJlcyk7CisgICAgYXV0byBmZWF0dXJlczIgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUj4oJmV4dGVuZGVkX3R5cGVzX2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VTdWJncm91cFByb3BlcnRpZXMgc3ViZ3JvdXBfcHJvcCA9IEdldFN1Ymdyb3VwUHJvcGVydGllcyhpbnN0YW5jZSgpLCBncHUoKSk7CisgICAgaWYgKCEoc3ViZ3JvdXBfcHJvcC5zdXBwb3J0ZWRPcGVyYXRpb25zICYgVktfU1VCR1JPVVBfRkVBVFVSRV9BUklUSE1FVElDX0JJVCkgfHwKKyAgICAgICAgIShzdWJncm91cF9wcm9wLnN1cHBvcnRlZFN0YWdlcyAmIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCkgfHwgIWZsb2F0MTZfZmVhdHVyZXMuc2hhZGVyRmxvYXQxNikgeworICAgICAgICBwcmludGYoIiVzIFJlcXVpcmVkIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEaXNhYmxlZCBleHRlbmRlZCB0eXBlcyBzdXBwb3J0LCBhbmQgZXhwZWN0IGFuIGVycm9yCisgICAgZXh0ZW5kZWRfdHlwZXNfZmVhdHVyZXMuc2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzID0gVktfRkFMU0U7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmZlYXR1cmVzMikpOworCisgICAgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZz4gYmluZGluZ3MoMCk7CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzbChtX2RldmljZSwgYmluZGluZ3MpOworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGwobV9kZXZpY2UsIHsmZHNsfSk7CisKKyAgICBjaGFyIGNvbnN0ICpjc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIiNleHRlbnNpb24gR0xfS0hSX3NoYWRlcl9zdWJncm91cF9hcml0aG1ldGljIDogZW5hYmxlXG4iCisgICAgICAgICIjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfc3ViZ3JvdXBfZXh0ZW5kZWRfdHlwZXNfZmxvYXQxNiA6IGVuYWJsZVxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX2V4cGxpY2l0X2FyaXRobWV0aWNfdHlwZXNfZmxvYXQxNiA6IGVuYWJsZVxuIgorICAgICAgICAibGF5b3V0KGxvY2FsX3NpemVfeCA9IDMyKSBpbjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgIiAgIHN1Ymdyb3VwQWRkKGZsb2F0MTZfdCgwLjApKTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuY3NfLnJlc2V0KAorICAgICAgICBuZXcgVmtTaGFkZXJPYmoobV9kZXZpY2UsIGNzU291cmNlLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIHRoaXMsICJtYWluIiwgZmFsc2UsIG51bGxwdHIsIC8qU1BJUi1WIDEuMyovIDMpKTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUucGlwZWxpbmVfbGF5b3V0XyA9IFZrUGlwZWxpbmVMYXlvdXRPYmoobV9kZXZpY2UsIHt9KTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWa1BoeXNpY2FsRGV2aWNlU2hhZGVyU3ViZ3JvdXBFeHRlbmRlZFR5cGVzRmVhdHVyZXNLSFI6OnNoYWRlclN1Ymdyb3VwRXh0ZW5kZWRUeXBlcyIpOworICAgIHBpcGUuQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgR3JhcGhpY3NQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBncmFwaGljcyBwaXBlbGluZSBmZWVkYmFjayBzdGFnZSBjb3VudCBjaGVjay4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfRVhUX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGF1dG8gZmVlZGJhY2tfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQ+KCk7CisgICAgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tFWFQgZmVlZGJhY2tzWzNdID0ge307CisgICAgLy8gU2V0IGZsYWdzIHRvIGtub3duIHZhbHVlIHRoYXQgdGhlIGRyaXZlciBoYXMgdG8gb3ZlcndyaXRlCisgICAgZmVlZGJhY2tzWzBdLmZsYWdzID0gVktfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfRkxBR19CSVRTX01BWF9FTlVNX0VYVDsKKworICAgIGZlZWRiYWNrX2luZm8ucFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9ICZmZWVkYmFja3NbMF07CisgICAgZmVlZGJhY2tfaW5mby5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ID0gMjsKKyAgICBmZWVkYmFja19pbmZvLnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgPSAmZmVlZGJhY2tzWzFdOworCisgICAgYXV0byBzZXRfZmVlZGJhY2sgPSBbJmZlZWRiYWNrX2luZm9dKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsgaGVscGVyLmdwX2NpXy5wTmV4dCA9ICZmZWVkYmFja19pbmZvOyB9OworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfZmVlZGJhY2ssIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0NyZWF0ZUluZm9FWFQtcGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudC0wMjY2OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworCisgICAgaWYgKERldmljZUlzTW9ja0lDRCgpIHx8IERldmljZVNpbXVsYXRpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIERyaXZlciBkYXRhIHdyaXRlYmFjayBjaGVjayBub3Qgc3VwcG9ydGVkIGJ5IE1vY2tJQ0QsIHNraXBwaW5nLlxuIiwga1NraXBQcmVmaXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgICAgIGlmIChmZWVkYmFja19pbmZvLnBQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2stPmZsYWdzID09IFZLX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0ZMQUdfQklUU19NQVhfRU5VTV9FWFQpIHsKKyAgICAgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXRFcnJvcigiVmFsaWRhdGlvbkxheWVycyBkaWQgbm90IHJldHVybiBHcmFwaGljc1BpcGVsaW5lRmVlZGJhY2sgZHJpdmVyIGRhdGEgcHJvcGVybHkuIik7CisgICAgICAgIH0KKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgfQorCisgICAgZmVlZGJhY2tfaW5mby5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ID0gMTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9mZWVkYmFjaywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50LTAyNjY4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENvbXB1dGVQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBjb21wdXRlIHBpcGVsaW5lIGZlZWRiYWNrIHN0YWdlIGNvdW50IGNoZWNrLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUIGZlZWRiYWNrX2luZm8gPSB7fTsKKyAgICBWa1BpcGVsaW5lQ3JlYXRpb25GZWVkYmFja0VYVCBmZWVkYmFja3NbM10gPSB7fTsKKyAgICBmZWVkYmFja19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfQ1JFQVRFX0lORk9fRVhUOworICAgIGZlZWRiYWNrX2luZm8ucFBpcGVsaW5lQ3JlYXRpb25GZWVkYmFjayA9ICZmZWVkYmFja3NbMF07CisgICAgZmVlZGJhY2tfaW5mby5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ID0gMTsKKyAgICBmZWVkYmFja19pbmZvLnBQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja3MgPSAmZmVlZGJhY2tzWzFdOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeyBoZWxwZXIuY3BfY2lfLnBOZXh0ID0gJmZlZWRiYWNrX2luZm87IH07CisKKyAgICBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXI6Ok9uZXNob3RUZXN0KCp0aGlzLCBzZXRfaW5mbywgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICIiLCB0cnVlKTsKKworICAgIGZlZWRiYWNrX2luZm8ucGlwZWxpbmVTdGFnZUNyZWF0aW9uRmVlZGJhY2tDb3VudCA9IDI7CisgICAgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgKKyAgICAgICAgKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlZVSUQtVmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhULXBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQtMDI2NjkiKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBOVlJheVRyYWNpbmdQaXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBOViByYXkgdHJhY2luZyBwaXBlbGluZSBmZWVkYmFjayBzdGFnZSBjb3VudCBjaGVjay4iKTsKKworICAgIGlmICghQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkluaXRJbnN0YW5jZUV4dGVuc2lvbnMoKnRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX1BJUEVMSU5FX0NSRUFUSU9OX0ZFRURCQUNLX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9QSVBFTElORV9DUkVBVElPTl9GRUVEQkFDS19FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfUElQRUxJTkVfQ1JFQVRJT05fRkVFREJBQ0tfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFDcmVhdGVOVlJheVRyYWNpbmdQaXBlbGluZUhlbHBlcjo6SW5pdERldmljZUV4dGVuc2lvbnMoKnRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBhdXRvIGZlZWRiYWNrX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaXBlbGluZUNyZWF0aW9uRmVlZGJhY2tDcmVhdGVJbmZvRVhUPigpOworICAgIFZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrRVhUIGZlZWRiYWNrc1s0XSA9IHt9OworCisgICAgZmVlZGJhY2tfaW5mby5wUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrID0gJmZlZWRiYWNrc1swXTsKKyAgICBmZWVkYmFja19pbmZvLnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQgPSAyOworICAgIGZlZWRiYWNrX2luZm8ucFBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrcyA9ICZmZWVkYmFja3NbMV07CisKKyAgICBhdXRvIHNldF9mZWVkYmFjayA9IFsmZmVlZGJhY2tfaW5mb10oQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeyBoZWxwZXIucnBfY2lfLnBOZXh0ID0gJmZlZWRiYWNrX2luZm87IH07CisKKyAgICBmZWVkYmFja19pbmZvLnBpcGVsaW5lU3RhZ2VDcmVhdGlvbkZlZWRiYWNrQ291bnQgPSAzOworICAgIENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyOjpPbmVzaG90UG9zaXRpdmVUZXN0KCp0aGlzLCBzZXRfZmVlZGJhY2spOworCisgICAgZmVlZGJhY2tfaW5mby5waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50ID0gMjsKKyAgICBDcmVhdGVOVlJheVRyYWNpbmdQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLCBzZXRfZmVlZGJhY2ssICJWVUlELVZrUGlwZWxpbmVDcmVhdGlvbkZlZWRiYWNrQ3JlYXRlSW5mb0VYVC1waXBlbGluZVN0YWdlQ3JlYXRpb25GZWVkYmFja0NvdW50LTAyNjcwIik7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVDaGVja1NoYWRlckltYWdlRm9vdHByaW50RW5hYmxlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHBpcGVsaW5lIHJlcXVpcmluZyB0aGUgc2hhZGVyIGltYWdlIGZvb3RwcmludCBmZWF0dXJlIHdoaWNoIGhhcyBub3QgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGlmICghRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19OVl9TSEFERVJfSU1BR0VfRk9PVFBSSU5UX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX05WX1NIQURFUl9JTUFHRV9GT09UUFJJTlRfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBkZXZpY2VfZXh0ZW5zaW9uX25hbWVzOworICAgIGF1dG8gZmVhdHVyZXMgPSBtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKTsKKworICAgIC8vIERpc2FibGUgdGhlIGltYWdlIGZvb3RwcmludCBmZWF0dXJlLgorICAgIGF1dG8gaW1hZ2VfZm9vdHByaW50X2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJJbWFnZUZvb3RwcmludEZlYXR1cmVzTlY+KCk7CisgICAgaW1hZ2VfZm9vdHByaW50X2ZlYXR1cmVzLmltYWdlRm9vdHByaW50ID0gVktfRkFMU0U7CisKKyAgICBWa0RldmljZU9iaiB0ZXN0X2RldmljZSgwLCBncHUoKSwgZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgJmZlYXR1cmVzLCAmaW1hZ2VfZm9vdHByaW50X2ZlYXR1cmVzKTsKKworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9OVl9zaGFkZXJfdGV4dHVyZV9mb290cHJpbnQgIDogcmVxdWlyZVxuIgorICAgICAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTApIHVuaWZvcm0gc2FtcGxlcjJEIHM7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IHZlYzQgY29sb3I7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgZ2xfVGV4dHVyZUZvb3RwcmludDJETlYgZm9vdHByaW50O1xuIgorICAgICAgICAiICBpZiAodGV4dHVyZUZvb3RwcmludE5WKHMsIHZlYzIoMS4wKSwgNSwgZmFsc2UsIGZvb3RwcmludCkpIHtcbiIKKyAgICAgICAgIiAgICBjb2xvciA9IHZlYzQoMC4wLCAxLjAsIDAuMCwgMS4wKTtcbiIKKyAgICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICAgIiAgICBjb2xvciA9IHZlYzQodmVjMihmb290cHJpbnQuYW5jaG9yKSwgdmVjMihmb290cHJpbnQub2Zmc2V0KSk7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cygmdGVzdF9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMoJnRlc3RfZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1JlbmRlcnBhc3NPYmogcmVuZGVyX3Bhc3MoJnRlc3RfZGV2aWNlKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZSgmdGVzdF9kZXZpY2UpOworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgYmluZGluZyA9IHswLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgbnVsbHB0cn07CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzX2xheW91dCgmdGVzdF9kZXZpY2UsIHtiaW5kaW5nfSk7CisgICAgQVNTRVJUX1RSVUUoZHNfbGF5b3V0LmluaXRpYWxpemVkKCkpOworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQoJnRlc3RfZGV2aWNlLCB7JmRzX2xheW91dH0pOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlNoYWRlciByZXF1aXJlcyBWa1BoeXNpY2FsRGV2aWNlU2hhZGVySW1hZ2VGb290cHJpbnRGZWF0dXJlc05WOjppbWFnZUZvb3RwcmludCBidXQgaXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNoYWRlciByZXF1aXJlcyBleHRlbnNpb24gVmtQaHlzaWNhbERldmljZVNoYWRlckltYWdlRm9vdHByaW50RmVhdHVyZXNOVjo6aW1hZ2VGb290cHJpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGlzIG5vdCBlbmFibGVkIG9uIHRoZSBkZXZpY2UiKTsKKyAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJfcGFzcy5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVDaGVja0ZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNFbmFibGVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgcGlwZWxpbmUgcmVxdWlyaW5nIHRoZSBmcmFnbWVudCBzaGFkZXIgYmFyeWNlbnRyaWMgZmVhdHVyZSB3aGljaCBoYXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGRldmljZV9leHRlbnNpb25fbmFtZXM7CisgICAgYXV0byBmZWF0dXJlcyA9IG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworCisgICAgLy8gRGlzYWJsZSB0aGUgZnJhZ21lbnQgc2hhZGVyIGJhcnljZW50cmljIGZlYXR1cmUuCisgICAgYXV0byBmcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWNfZmVhdHVyZXMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVyQmFyeWNlbnRyaWNGZWF0dXJlc05WPigpOworICAgIGZyYWdtZW50X3NoYWRlcl9iYXJ5Y2VudHJpY19mZWF0dXJlcy5mcmFnbWVudFNoYWRlckJhcnljZW50cmljID0gVktfRkFMU0U7CisKKyAgICBWa0RldmljZU9iaiB0ZXN0X2RldmljZSgwLCBncHUoKSwgZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgJmZlYXR1cmVzLCAmZnJhZ21lbnRfc2hhZGVyX2JhcnljZW50cmljX2ZlYXR1cmVzKTsKKworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9OVl9mcmFnbWVudF9zaGFkZXJfYmFyeWNlbnRyaWMgOiByZXF1aXJlXG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgb3V0IGZsb2F0IHZhbHVlO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgIHZhbHVlID0gZ2xfQmFyeUNvb3JkTlYueDtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cygmdGVzdF9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMoJnRlc3RfZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1JlbmRlcnBhc3NPYmogcmVuZGVyX3Bhc3MoJnRlc3RfZGV2aWNlKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZSgmdGVzdF9kZXZpY2UpOworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KCZ0ZXN0X2RldmljZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiU2hhZGVyIHJlcXVpcmVzIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVjo6ZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyBidXQgaXMgbm90IGVuYWJsZWQgb24gdGhlICIKKyAgICAgICAgImRldmljZSIpOworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJTaGFkZXIgcmVxdWlyZXMgZXh0ZW5zaW9uIFZrUGh5c2ljYWxEZXZpY2VGcmFnbWVudFNoYWRlckJhcnljZW50cmljRmVhdHVyZXNOVjo6ZnJhZ21lbnRTaGFkZXJCYXJ5Y2VudHJpYyBidXQgaXMgbm90ICIKKyAgICAgICAgImVuYWJsZWQgb24gdGhlIGRldmljZSIpOworICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIHJlbmRlcl9wYXNzLmhhbmRsZSgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKK30KKworVEVTVF9GKFZrTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUNoZWNrQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRW5hYmxlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHBpcGVsaW5lIHJlcXVpcmluZyB0aGUgY29tcHV0ZSBzaGFkZXIgZGVyaXZhdGl2ZXMgZmVhdHVyZSB3aGljaCBoYXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGRldmljZV9leHRlbnNpb25fbmFtZXM7CisgICAgYXV0byBmZWF0dXJlcyA9IG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworCisgICAgLy8gRGlzYWJsZSB0aGUgY29tcHV0ZSBzaGFkZXIgZGVyaXZhdGl2ZXMgZmVhdHVyZXMuCisgICAgYXV0byBjb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlc19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVj4oKTsKKyAgICBjb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlc19mZWF0dXJlcy5jb21wdXRlRGVyaXZhdGl2ZUdyb3VwTGluZWFyID0gVktfRkFMU0U7CisgICAgY29tcHV0ZV9zaGFkZXJfZGVyaXZhdGl2ZXNfZmVhdHVyZXMuY29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzID0gVktfRkFMU0U7CisKKyAgICBWa0RldmljZU9iaiB0ZXN0X2RldmljZSgwLCBncHUoKSwgZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgJmZlYXR1cmVzLCAmY29tcHV0ZV9zaGFkZXJfZGVyaXZhdGl2ZXNfZmVhdHVyZXMpOworCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBiaW5kaW5nID0gezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCBudWxscHRyfTsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogZHNsKCZ0ZXN0X2RldmljZSwge2JpbmRpbmd9KTsKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBsKCZ0ZXN0X2RldmljZSwgeyZkc2x9KTsKKworICAgIGNoYXIgY29uc3QgKmNzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9OVl9jb21wdXRlX3NoYWRlcl9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2FsX3NpemVfeD0yLCBsb2NhbF9zaXplX3k9NCkgaW47XG4iCisgICAgICAgICJsYXlvdXQoZGVyaXZhdGl2ZV9ncm91cF9xdWFkc05WKSBpbjtcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTApIGJ1ZmZlciBJbnB1dE91dHB1dEJ1ZmZlciB7XG4iCisgICAgICAgICIgIGZsb2F0IHZhbHVlc1tdO1xuIgorICAgICAgICAifTtcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB2YWx1ZXNbZ2xfTG9jYWxJbnZvY2F0aW9uSW5kZXhdID0gZEZkeCh2YWx1ZXNbZ2xfTG9jYWxJbnZvY2F0aW9uSW5kZXhdKTsiCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogY3MoJnRlc3RfZGV2aWNlLCBjc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCB0aGlzKTsKKworICAgIFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyBjcGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgY3MuaGFuZGxlKCksICJtYWluIiwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGwuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTF9OworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlNoYWRlciByZXF1aXJlcyBWa1BoeXNpY2FsRGV2aWNlQ29tcHV0ZVNoYWRlckRlcml2YXRpdmVzRmVhdHVyZXNOVjo6Y29tcHV0ZURlcml2YXRpdmVHcm91cFF1YWRzIGJ1dCBpcyBub3QgZW5hYmxlZCBvbiB0aGUgIgorICAgICAgICAiZGV2aWNlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlNoYWRlciByZXF1aXJlcyBleHRlbnNpb24gVmtQaHlzaWNhbERldmljZUNvbXB1dGVTaGFkZXJEZXJpdmF0aXZlc0ZlYXR1cmVzTlY6OmNvbXB1dGVEZXJpdmF0aXZlR3JvdXBRdWFkcyBidXQgaXMgbm90ICIKKyAgICAgICAgImVuYWJsZWQgb24gdGhlIGRldmljZSIpOworCisgICAgVmtQaXBlbGluZSBwaXBlID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkNyZWF0ZUNvbXB1dGVQaXBlbGluZXModGVzdF9kZXZpY2UuZGV2aWNlKCksIFZLX05VTExfSEFORExFLCAxLCAmY3BjaSwgbnVsbHB0ciwgJnBpcGUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmUodGVzdF9kZXZpY2UuZGV2aWNlKCksIHBpcGUsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lQ2hlY2tGcmFnbWVudFNoYWRlckludGVybG9ja0VuYWJsZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYSBwaXBlbGluZSByZXF1aXJpbmcgdGhlIGZyYWdtZW50IHNoYWRlciBpbnRlcmxvY2sgZmVhdHVyZSB3aGljaCBoYXMgbm90IGVuYWJsZWQgb24gdGhlIGRldmljZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGRldmljZV9leHRlbnNpb25fbmFtZXM7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfRVhUX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIC8vIE5vdGU6IHdlIGludGVudGlvbmFsbHkgZG8gbm90IGFkZCB0aGUgcmVxdWlyZWQgZXh0ZW5zaW9uIHRvIHRoZSBkZXZpY2UgZXh0ZW5zaW9uIGxpc3QuCisgICAgICAgIC8vICAgICAgIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgZXJyb3IgYmVsb3cKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBza2lwIHRoaXMgdGVzdCBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciBhcyBpbiBzb21lIGNhc2VzIHRoaXMgd2lsbCBjYXVzZQorICAgICAgICAvLyB0aGUgdms6OkNyZWF0ZVNoYWRlck1vZHVsZSB0byBmYWlsIHdpdGhvdXQgZ2VuZXJhdGluZyBhbiBlcnJvciBtZXNzYWdlCisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfRVhUX0ZSQUdNRU5UX1NIQURFUl9JTlRFUkxPQ0tfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBmZWF0dXJlcyA9IG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworCisgICAgLy8gRGlzYWJsZSB0aGUgZnJhZ21lbnQgc2hhZGVyIGludGVybG9jayBmZWF0dXJlLgorICAgIGF1dG8gZnJhZ21lbnRfc2hhZGVyX2ludGVybG9ja19mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRnJhZ21lbnRTaGFkZXJJbnRlcmxvY2tGZWF0dXJlc0VYVD4oKTsKKyAgICBmcmFnbWVudF9zaGFkZXJfaW50ZXJsb2NrX2ZlYXR1cmVzLmZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrID0gVktfRkFMU0U7CisgICAgZnJhZ21lbnRfc2hhZGVyX2ludGVybG9ja19mZWF0dXJlcy5mcmFnbWVudFNoYWRlclBpeGVsSW50ZXJsb2NrID0gVktfRkFMU0U7CisgICAgZnJhZ21lbnRfc2hhZGVyX2ludGVybG9ja19mZWF0dXJlcy5mcmFnbWVudFNoYWRlclNoYWRpbmdSYXRlSW50ZXJsb2NrID0gVktfRkFMU0U7CisKKyAgICBWa0RldmljZU9iaiB0ZXN0X2RldmljZSgwLCBncHUoKSwgZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgJmZlYXR1cmVzLCAmZnJhZ21lbnRfc2hhZGVyX2ludGVybG9ja19mZWF0dXJlcyk7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIiNleHRlbnNpb24gR0xfQVJCX2ZyYWdtZW50X3NoYWRlcl9pbnRlcmxvY2sgOiByZXF1aXJlXG4iCisgICAgICAgICJsYXlvdXQoc2FtcGxlX2ludGVybG9ja19vcmRlcmVkKSBpbjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKCZ0ZXN0X2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcygmdGVzdF9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUmVuZGVycGFzc09iaiByZW5kZXJfcGFzcygmdGVzdF9kZXZpY2UpOworCisgICAgVmtQaXBlbGluZU9iaiBwaXBlKCZ0ZXN0X2RldmljZSk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQoJnRlc3RfZGV2aWNlKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZygKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICJTaGFkZXIgcmVxdWlyZXMgVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQ6OmZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrIGJ1dCBpcyBub3QgZW5hYmxlZCBvbiAiCisgICAgICAgICJ0aGUgZGV2aWNlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlNoYWRlciByZXF1aXJlcyBleHRlbnNpb24gVmtQaHlzaWNhbERldmljZUZyYWdtZW50U2hhZGVySW50ZXJsb2NrRmVhdHVyZXNFWFQ6OmZyYWdtZW50U2hhZGVyU2FtcGxlSW50ZXJsb2NrIGJ1dCBpcyBub3QgIgorICAgICAgICAiZW5hYmxlZCBvbiB0aGUgZGV2aWNlIik7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgcmVuZGVyX3Bhc3MuaGFuZGxlKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lQ2hlY2tEZW1vdGVUb0hlbHBlckludm9jYXRpb24pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYSBwaXBlbGluZSByZXF1aXJpbmcgdGhlIGRlbW90ZSB0byBoZWxwZXIgaW52b2NhdGlvbiBmZWF0dXJlIHdoaWNoIGhhcyBub3QgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gZGV2aWNlX2V4dGVuc2lvbl9uYW1lczsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfU0hBREVSX0RFTU9URV9UT19IRUxQRVJfSU5WT0NBVElPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgLy8gTm90ZTogd2UgaW50ZW50aW9uYWxseSBkbyBub3QgYWRkIHRoZSByZXF1aXJlZCBleHRlbnNpb24gdG8gdGhlIGRldmljZSBleHRlbnNpb24gbGlzdC4KKyAgICAgICAgLy8gICAgICAgaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBlcnJvciBiZWxvdworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlIHNraXAgdGhpcyB0ZXN0IGlmIHRoZSBleHRlbnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyIGFzIGluIHNvbWUgY2FzZXMgdGhpcyB3aWxsIGNhdXNlCisgICAgICAgIC8vIHRoZSB2azo6Q3JlYXRlU2hhZGVyTW9kdWxlIHRvIGZhaWwgd2l0aG91dCBnZW5lcmF0aW5nIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfU0hBREVSX0RFTU9URV9UT19IRUxQRVJfSU5WT0NBVElPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGZlYXR1cmVzID0gbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCk7CisKKyAgICAvLyBEaXNhYmxlIHRoZSBkZW1vdGUgdG8gaGVscGVyIGludm9jYXRpb24gZmVhdHVyZS4KKyAgICBhdXRvIGRlbW90ZV9mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlU2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uRmVhdHVyZXNFWFQ+KCk7CisgICAgZGVtb3RlX2ZlYXR1cmVzLnNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbiA9IFZLX0ZBTFNFOworCisgICAgVmtEZXZpY2VPYmogdGVzdF9kZXZpY2UoMCwgZ3B1KCksIGRldmljZV9leHRlbnNpb25fbmFtZXMsICZmZWF0dXJlcywgJmRlbW90ZV9mZWF0dXJlcyk7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIiNleHRlbnNpb24gR0xfRVhUX2RlbW90ZV90b19oZWxwZXJfaW52b2NhdGlvbiA6IHJlcXVpcmVcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgIGRlbW90ZTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cygmdGVzdF9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMoJnRlc3RfZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1JlbmRlcnBhc3NPYmogcmVuZGVyX3Bhc3MoJnRlc3RfZGV2aWNlKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZSgmdGVzdF9kZXZpY2UpOworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KCZ0ZXN0X2RldmljZSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAiU2hhZGVyIHJlcXVpcmVzIFZrUGh5c2ljYWxEZXZpY2VTaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb25GZWF0dXJlc0VYVDo6c2hhZGVyRGVtb3RlVG9IZWxwZXJJbnZvY2F0aW9uIGJ1dCBpcyBub3QgIgorICAgICAgICAiZW5hYmxlZCBvbiAiCisgICAgICAgICJ0aGUgZGV2aWNlIik7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgIlNoYWRlciByZXF1aXJlcyBleHRlbnNpb24gVmtQaHlzaWNhbERldmljZVNoYWRlckRlbW90ZVRvSGVscGVySW52b2NhdGlvbkZlYXR1cmVzRVhUOjpzaGFkZXJEZW1vdGVUb0hlbHBlckludm9jYXRpb24gYnV0ICIKKyAgICAgICAgImlzIG5vdCAiCisgICAgICAgICJlbmFibGVkIG9uIHRoZSBkZXZpY2UiKTsKKyAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJfcGFzcy5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVDaGVja0xpbmVSYXN0ZXJpemF0aW9uKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBWS19FWFRfbGluZV9yYXN0ZXJpemF0aW9uIHN0YXRlIGFnYWluc3QgZmVhdHVyZSBlbmFibGVzLiIpOworCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgaW5zdGFuY2UgZXh0ZW5zaW9uICVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIHN0ZDo6YXJyYXk8Y29uc3QgY2hhciAqLCAxPiByZXF1aXJlZF9kZXZpY2VfZXh0ZW5zaW9ucyA9IHt7VktfRVhUX0xJTkVfUkFTVEVSSVpBVElPTl9FWFRFTlNJT05fTkFNRX19OworICAgIGZvciAoYXV0byBkZXZpY2VfZXh0ZW5zaW9uIDogcmVxdWlyZWRfZGV2aWNlX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZGV2aWNlX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZGV2aWNlX2V4dGVuc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIEV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgsIGRldmljZV9leHRlbnNpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisKKyAgICBhdXRvIGxpbmVfcmFzdGVyaXphdGlvbl9mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlTGluZVJhc3Rlcml6YXRpb25GZWF0dXJlc0VYVD4oKTsKKyAgICBhdXRvIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmbGluZV9yYXN0ZXJpemF0aW9uX2ZlYXR1cmVzKTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgIGxpbmVfcmFzdGVyaXphdGlvbl9mZWF0dXJlcy5yZWN0YW5ndWxhckxpbmVzID0gVktfRkFMU0U7CisgICAgbGluZV9yYXN0ZXJpemF0aW9uX2ZlYXR1cmVzLmJyZXNlbmhhbUxpbmVzID0gVktfRkFMU0U7CisgICAgbGluZV9yYXN0ZXJpemF0aW9uX2ZlYXR1cmVzLnNtb290aExpbmVzID0gVktfRkFMU0U7CisgICAgbGluZV9yYXN0ZXJpemF0aW9uX2ZlYXR1cmVzLnN0aXBwbGVkUmVjdGFuZ3VsYXJMaW5lcyA9IFZLX0ZBTFNFOworICAgIGxpbmVfcmFzdGVyaXphdGlvbl9mZWF0dXJlcy5zdGlwcGxlZEJyZXNlbmhhbUxpbmVzID0gVktfRkFMU0U7CisgICAgbGluZV9yYXN0ZXJpemF0aW9uX2ZlYXR1cmVzLnN0aXBwbGVkU21vb3RoTGluZXMgPSBWS19GQUxTRTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAmZmVhdHVyZXMyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLAorICAgICAgICBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLmxpbmVfc3RhdGVfY2lfLmxpbmVSYXN0ZXJpemF0aW9uTW9kZSA9IFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX0JSRVNFTkhBTV9FWFQ7CisgICAgICAgICAgICBoZWxwZXIucGlwZV9tc19zdGF0ZV9jaV8uYWxwaGFUb0NvdmVyYWdlRW5hYmxlID0gVktfVFJVRTsKKyAgICAgICAgfSwKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj57IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1saW5lUmFzdGVyaXphdGlvbk1vZGUtMDI3NjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1saW5lUmFzdGVyaXphdGlvbk1vZGUtMDI3NjkifSk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLAorICAgICAgICBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLmxpbmVfc3RhdGVfY2lfLmxpbmVSYXN0ZXJpemF0aW9uTW9kZSA9IFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX0JSRVNFTkhBTV9FWFQ7CisgICAgICAgICAgICBoZWxwZXIubGluZV9zdGF0ZV9jaV8uc3RpcHBsZWRMaW5lRW5hYmxlID0gVktfVFJVRTsKKyAgICAgICAgfSwKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj57IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGlwcGxlZExpbmVFbmFibGUtMDI3NjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1saW5lUmFzdGVyaXphdGlvbk1vZGUtMDI3NjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzIifSk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoCisgICAgICAgICp0aGlzLAorICAgICAgICBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICAgICAgaGVscGVyLmxpbmVfc3RhdGVfY2lfLmxpbmVSYXN0ZXJpemF0aW9uTW9kZSA9IFZLX0xJTkVfUkFTVEVSSVpBVElPTl9NT0RFX1JFQ1RBTkdVTEFSX0VYVDsKKyAgICAgICAgICAgIGhlbHBlci5saW5lX3N0YXRlX2NpXy5zdGlwcGxlZExpbmVFbmFibGUgPSBWS19UUlVFOworICAgICAgICB9LAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPnsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0aXBwbGVkTGluZUVuYWJsZS0wMjc2NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULWxpbmVSYXN0ZXJpemF0aW9uTW9kZS0wMjc2OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULXN0aXBwbGVkTGluZUVuYWJsZS0wMjc3MSJ9KTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgKKyAgICAgICAgKnRoaXMsCisgICAgICAgIFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICBoZWxwZXIubGluZV9zdGF0ZV9jaV8ubGluZVJhc3Rlcml6YXRpb25Nb2RlID0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfUkVDVEFOR1VMQVJfU01PT1RIX0VYVDsKKyAgICAgICAgICAgIGhlbHBlci5saW5lX3N0YXRlX2NpXy5zdGlwcGxlZExpbmVFbmFibGUgPSBWS19UUlVFOworICAgICAgICB9LAorICAgICAgICBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPnsiVlVJRC1Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvLXN0aXBwbGVkTGluZUVuYWJsZS0wMjc2NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULWxpbmVSYXN0ZXJpemF0aW9uTW9kZS0wMjc3MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhULXN0aXBwbGVkTGluZUVuYWJsZS0wMjc3MyJ9KTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgKKyAgICAgICAgKnRoaXMsCisgICAgICAgIFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgICAgICBoZWxwZXIubGluZV9zdGF0ZV9jaV8ubGluZVJhc3Rlcml6YXRpb25Nb2RlID0gVktfTElORV9SQVNURVJJWkFUSU9OX01PREVfREVGQVVMVF9FWFQ7CisgICAgICAgICAgICBoZWxwZXIubGluZV9zdGF0ZV9jaV8uc3RpcHBsZWRMaW5lRW5hYmxlID0gVktfVFJVRTsKKyAgICAgICAgfSwKKyAgICAgICAgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj57IlZVSUQtVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mby1zdGlwcGxlZExpbmVFbmFibGUtMDI3NjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVC1zdGlwcGxlZExpbmVFbmFibGUtMDI3NzQifSk7CisKKyAgICBQRk5fdmtDbWRTZXRMaW5lU3RpcHBsZUVYVCB2a0NtZFNldExpbmVTdGlwcGxlRVhUID0KKyAgICAgICAgKFBGTl92a0NtZFNldExpbmVTdGlwcGxlRVhUKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0NtZFNldExpbmVTdGlwcGxlRVhUIik7CisgICAgQVNTRVJUX1RSVUUodmtDbWRTZXRMaW5lU3RpcHBsZUVYVCAhPSBudWxscHRyKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kU2V0TGluZVN0aXBwbGVFWFQtbGluZVN0aXBwbGVGYWN0b3ItMDI3NzYiKTsKKyAgICB2a0NtZFNldExpbmVTdGlwcGxlRVhUKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIHZrQ21kU2V0TGluZVN0aXBwbGVFWFQobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgRmlsbFJlY3RhbmdsZU5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IFZLX05WX2ZpbGxfcmVjdGFuZ2xlIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBkZXZpY2VfZmVhdHVyZXMgPSB7fTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKCZkZXZpY2VfZmVhdHVyZXMpKTsKKworICAgIC8vIERpc2FibGUgbm9uLXNvbGlkIGZpbGwgbW9kZXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHVzYWdlIG9mIFZLX1BPTFlHT05fTU9ERV9MSU5FIGFuZAorICAgIC8vIFZLX1BPTFlHT05fTU9ERV9QT0lOVCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gdGhlIFZLX05WX2ZpbGxfcmVjdGFuZ2xlIGV4dGVuc2lvbiBpcyBlbmFibGVkLgorICAgIGRldmljZV9mZWF0dXJlcy5maWxsTW9kZU5vblNvbGlkID0gVktfRkFMU0U7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19OVl9GSUxMX1JFQ1RBTkdMRV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19OVl9GSUxMX1JFQ1RBTkdMRV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBWS19OVl9GSUxMX1JFQ1RBTkdMRV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoJmRldmljZV9mZWF0dXJlcykpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1BvbHlnb25Nb2RlIHBvbHlnb25fbW9kZSA9IFZLX1BPTFlHT05fTU9ERV9MSU5FOworCisgICAgYXV0byBzZXRfcG9seWdvbl9tb2RlID0gWyZwb2x5Z29uX21vZGVdKENyZWF0ZVBpcGVsaW5lSGVscGVyICZoZWxwZXIpIHsgaGVscGVyLnJzX3N0YXRlX2NpXy5wb2x5Z29uTW9kZSA9IHBvbHlnb25fbW9kZTsgfTsKKworICAgIC8vIFNldCB1bnN1cHBvcnRlZCBwb2x5Z29uIG1vZGUgVktfUE9MWUdPTl9NT0RFX0xJTkUKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9wb2x5Z29uX21vZGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1wb2x5Z29uTW9kZS0wMTUwNyIsIGZhbHNlKTsKKworICAgIC8vIFNldCB1bnN1cHBvcnRlZCBwb2x5Z29uIG1vZGUgVktfUE9MWUdPTl9NT0RFX1BPSU5UCisgICAgcG9seWdvbl9tb2RlID0gVktfUE9MWUdPTl9NT0RFX1BPSU5UOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X3BvbHlnb25fbW9kZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLTAxNTA3IiwgZmFsc2UpOworCisgICAgLy8gU2V0IHN1cHBvcnRlZCBwb2x5Z29uIG1vZGUgVktfUE9MWUdPTl9NT0RFX0ZJTEwKKyAgICBwb2x5Z29uX21vZGUgPSBWS19QT0xZR09OX01PREVfRklMTDsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9wb2x5Z29uX21vZGUsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mby1wb2x5Z29uTW9kZS0wMTUwNyIsIHRydWUpOworCisgICAgLy8gU2V0IHN1cHBvcnRlZCBwb2x5Z29uIG1vZGUgVktfUE9MWUdPTl9NT0RFX0ZJTExfUkVDVEFOR0xFX05WCisgICAgcG9seWdvbl9tb2RlID0gVktfUE9MWUdPTl9NT0RFX0ZJTExfUkVDVEFOR0xFX05WOworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyOjpPbmVzaG90VGVzdCgqdGhpcywgc2V0X3BvbHlnb25fbW9kZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVUlELVZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvLXBvbHlnb25Nb2RlLTAxNTA3IiwgdHJ1ZSk7Cit9CisKK1RFU1RfRihWa0xheWVyVGVzdCwgTm90Q29tcGF0aWJsZUZvclNldCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNoZWNrIHRoYXQgdmFsaWRhdGlvbiBwYXRoIGNhdGNoZXMgcGlwZWxpbmUgbGF5b3V0IGluY29uc2lzdGVuY2llcyBmb3IgYmluZCB2cy4gZGlzcGF0Y2giKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBhdXRvIGNfcXVldWUgPSBtX2RldmljZS0+R2V0RGVmYXVsdENvbXB1dGVRdWV1ZSgpOworICAgIGlmIChudWxscHRyID09IGNfcXVldWUpIHsKKyAgICAgICAgcHJpbnRmKCJDb21wdXRlIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3QgcWZpID0gMDsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYmNpID0ge307CisgICAgYmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJjaS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQ7CisgICAgYmNpLnNpemUgPSA0OworICAgIGJjaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAxOworICAgIGJjaS5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKyAgICBWa0J1ZmZlck9iaiBzdG9yYWdlX2J1ZmZlcjsKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgbWVtX3Byb3BzID0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQ7CisgICAgc3RvcmFnZV9idWZmZXIuaW5pdCgqbV9kZXZpY2UsIGJjaSwgbWVtX3Byb3BzKTsKKworICAgIFZrQnVmZmVyT2JqIHVuaWZvcm1fYnVmZmVyOworICAgIGJjaS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQ7CisgICAgYmNpLnNpemUgPSAyMDsKKyAgICB1bmlmb3JtX2J1ZmZlci5pbml0KCptX2RldmljZSwgYmNpLCBtZW1fcHJvcHMpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldDo6QmluZGluZ3MgYmluZGluZ19kZWZzID0geworICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgezEsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgfTsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogcGlwZWxpbmVfZHNsKG1fZGV2aWNlLCBiaW5kaW5nX2RlZnMpOworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JnBpcGVsaW5lX2RzbH0pOworCisgICAgLy8gV2Ugbm93IHdpbGwgdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IExheW91dCBkZWZpbml0aW9uIGZvciB0aGUgZGVzY3JpcHRvcnMgd2UgYWN1dGFsbHkgYmluZCB3aXRoIChidXQgdGhhdCB3b3VsZCBzdGlsbCBiZQorICAgIC8vIGNvcnJlY3QgZm9yIHRoZSBzaGFkZXIKKyAgICBiaW5kaW5nX2RlZnNbMV0uc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVDsKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGJpbmRpbmdfZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIGJpbmRpbmdfZGVmcyk7CisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBiaW5kaW5nX3BpcGVsaW5lX2xheW91dChtX2RldmljZSwgeyZiaW5kaW5nX2Rlc2NyaXB0b3Jfc2V0LmxheW91dF99KTsKKworICAgIFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gc3RvcmFnZV9idWZmZXJfaW5mbyA9IHtzdG9yYWdlX2J1ZmZlci5oYW5kbGUoKSwgMCwgc2l6ZW9mKHVpbnQzMl90KX07CisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyB1bmlmb3JtX2J1ZmZlcl9pbmZvID0ge3VuaWZvcm1fYnVmZmVyLmhhbmRsZSgpLCAwLCA1ICogc2l6ZW9mKHVpbnQzMl90KX07CisKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlc1syXSA9IHt9OworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0uZHN0U2V0ID0gYmluZGluZ19kZXNjcmlwdG9yX3NldC5zZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0uZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0ucEJ1ZmZlckluZm8gPSAmc3RvcmFnZV9idWZmZXJfaW5mbzsKKworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZHN0U2V0ID0gYmluZGluZ19kZXNjcmlwdG9yX3NldC5zZXRfOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLmRzdEJpbmRpbmcgPSAxOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLmRlc2NyaXB0b3JDb3VudCA9IDE7ICAvLyBXcml0ZSA0IGJ5dGVzIHRvIHZhbAorICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLnBCdWZmZXJJbmZvID0gJnVuaWZvcm1fYnVmZmVyX2luZm87CisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMiwgZGVzY3JpcHRvcl93cml0ZXMsIDAsIE5VTEwpOworCisgICAgY2hhciBjb25zdCAqY3NTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICIjZXh0ZW5zaW9uIEdMX0VYVF9ub251bmlmb3JtX3F1YWxpZmllciA6IGVuYWJsZVxuICIKKyAgICAgICAgImxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMCkgYnVmZmVyIFN0b3JhZ2VCdWZmZXIgeyB1aW50IGluZGV4OyB9IHVfaW5kZXg7IgorICAgICAgICAibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAxKSB1bmlmb3JtIFVuaWZvcm1TdHJ1Y3QgeyBpdmVjNCBkdW1teTsgaW50IHZhbDsgfSB1Ym87XG4iCisKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgIiAgICB1X2luZGV4LmluZGV4ID0gdWJvLnZhbDtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiBzaGFkZXJfbW9kdWxlKG1fZGV2aWNlLCBjc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc3RhZ2U7CisgICAgc3RhZ2Uuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgc3RhZ2UucE5leHQgPSBudWxscHRyOworICAgIHN0YWdlLmZsYWdzID0gMDsKKyAgICBzdGFnZS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVDsKKyAgICBzdGFnZS5tb2R1bGUgPSBzaGFkZXJfbW9kdWxlLmhhbmRsZSgpOworICAgIHN0YWdlLnBOYW1lID0gIm1haW4iOworICAgIHN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8gPSBudWxscHRyOworCisgICAgLy8gQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcworICAgIFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyBwaXBlbGluZV9pbmZvID0ge307CisgICAgcGlwZWxpbmVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk87CisgICAgcGlwZWxpbmVfaW5mby5wTmV4dCA9IG51bGxwdHI7CisgICAgcGlwZWxpbmVfaW5mby5mbGFncyA9IDA7CisgICAgcGlwZWxpbmVfaW5mby5sYXlvdXQgPSBwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCk7CisgICAgcGlwZWxpbmVfaW5mby5iYXNlUGlwZWxpbmVIYW5kbGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBwaXBlbGluZV9pbmZvLmJhc2VQaXBlbGluZUluZGV4ID0gLTE7CisgICAgcGlwZWxpbmVfaW5mby5zdGFnZSA9IHN0YWdlOworCisgICAgVmtQaXBlbGluZSBjX3BpcGVsaW5lOworICAgIHZrOjpDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2luZm8sIG51bGxwdHIsICZjX3BpcGVsaW5lKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgY19waXBlbGluZSk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsIGJpbmRpbmdfcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpbmRpbmdfZGVzY3JpcHRvcl9zZXQuc2V0XywgMCwgbnVsbHB0cik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZERpc3BhdGNoLU5vbmUtMDI2OTciKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTkFTU0lHTkVELUNvcmVWYWxpZGF0aW9uLURyYXdTdGF0ZS1QaXBlbGluZUxheW91dHNJbmNvbXBhdGlibGUiKTsKKyAgICB2azo6Q21kRGlzcGF0Y2gobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgMSwgMSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95UGlwZWxpbmUoZGV2aWNlKCksIGNfcGlwZWxpbmUsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtMYXllclRlc3QsIFJheVRyYWNpbmdQaXBlbGluZVNoYWRlckdyb3VwcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZhbGlkYXRlIHNoYWRlciBncm91cHMgZHVyaW5nIHJheS10cmFjaW5nIHBpcGVsaW5lIGNyZWF0aW9uIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19OVl9SQVlfVFJBQ0lOR19FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBrU2tpcFByZWZpeCwgVktfTlZfUkFZX1RSQUNJTkdfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogZW1wdHlfcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7fSk7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBlbXB0eV9zaGFkZXIgPSBSImdsc2woI3ZlcnNpb24gNDYwCisgICAgICAgICNleHRlbnNpb24gR0xfTlZfcmF5X3RyYWNpbmcgOiByZXF1aXJlCisgICAgICAgIHZvaWQgbWFpbigpIHt9CisgICAgKWdsc2wiOworCisgICAgVmtTaGFkZXJPYmogcmdlbl9zaGFkZXIobV9kZXZpY2UsIGVtcHR5X3NoYWRlci5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OViwgdGhpcywgIm1haW4iKTsKKyAgICBWa1NoYWRlck9iaiBhaGl0X3NoYWRlcihtX2RldmljZSwgZW1wdHlfc2hhZGVyLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9BTllfSElUX0JJVF9OViwgdGhpcywgIm1haW4iKTsKKyAgICBWa1NoYWRlck9iaiBjaGl0X3NoYWRlcihtX2RldmljZSwgZW1wdHlfc2hhZGVyLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlYsIHRoaXMsICJtYWluIik7CisgICAgVmtTaGFkZXJPYmogbWlzc19zaGFkZXIobV9kZXZpY2UsIGVtcHR5X3NoYWRlci5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfTUlTU19CSVRfTlYsIHRoaXMsICJtYWluIik7CisgICAgVmtTaGFkZXJPYmogaW50cl9zaGFkZXIobV9kZXZpY2UsIGVtcHR5X3NoYWRlci5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfSU5URVJTRUNUSU9OX0JJVF9OViwgdGhpcywgIm1haW4iKTsKKyAgICBWa1NoYWRlck9iaiBjYWxsX3NoYWRlcihtX2RldmljZSwgZW1wdHlfc2hhZGVyLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9DQUxMQUJMRV9CSVRfTlYsIHRoaXMsICJtYWluIik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIFBGTl92a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOViA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WPih2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYiKSk7CisgICAgQVNTRVJUX1RSVUUodmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYgIT0gbnVsbHB0cik7CisKKyAgICBWa1BpcGVsaW5lIHBpcGVsaW5lID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICAvLyBObyByYXlnZW4gc3RhZ2UKKyAgICB7CisgICAgICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc3RhZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvLnN0YWdlID0gVktfU0hBREVSX1NUQUdFX0NMT1NFU1RfSElUX0JJVF9OVjsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm8ubW9kdWxlID0gY2hpdF9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvLnBOYW1lID0gIm1haW4iOworCisgICAgICAgIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGdyb3VwX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mby50eXBlID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm8uZ2VuZXJhbFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvLmNsb3Nlc3RIaXRTaGFkZXIgPSAwOworICAgICAgICBncm91cF9jcmVhdGVfaW5mby5hbnlIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mby5pbnRlcnNlY3Rpb25TaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworCisgICAgICAgIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIHBpcGVsaW5lX2NpID0ge307CisgICAgICAgIHBpcGVsaW5lX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIHBpcGVsaW5lX2NpLnN0YWdlQ291bnQgPSAxOworICAgICAgICBwaXBlbGluZV9jaS5wU3RhZ2VzID0gJnN0YWdlX2NyZWF0ZV9pbmZvOworICAgICAgICBwaXBlbGluZV9jaS5ncm91cENvdW50ID0gMTsKKyAgICAgICAgcGlwZWxpbmVfY2kucEdyb3VwcyA9ICZncm91cF9jcmVhdGVfaW5mbzsKKyAgICAgICAgcGlwZWxpbmVfY2kubGF5b3V0ID0gZW1wdHlfcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtc3RhZ2UtMDI0MDgiKTsKKyAgICAgICAgdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYobV9kZXZpY2UtPmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2NpLCBudWxscHRyLCAmcGlwZWxpbmUpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBUd28gcmF5Z2VuIHN0YWdlcworICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdGFnZV9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVjsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLm1vZHVsZSA9IHJnZW5fc2hhZGVyLmhhbmRsZSgpOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVjsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLm1vZHVsZSA9IHJnZW5fc2hhZGVyLmhhbmRsZSgpOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgZ3JvdXBfY3JlYXRlX2luZm9zWzJdID0ge307CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLnR5cGUgPSBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9UUklBTkdMRVNfSElUX0dST1VQX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uZ2VuZXJhbFNoYWRlciA9IDA7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5jbG9zZXN0SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmFueUhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5pbnRlcnNlY3Rpb25TaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworCisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9DUkVBVEVfSU5GT19OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLnR5cGUgPSBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9UUklBTkdMRVNfSElUX0dST1VQX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uZ2VuZXJhbFNoYWRlciA9IDE7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5jbG9zZXN0SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmFueUhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5pbnRlcnNlY3Rpb25TaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworCisgICAgICAgIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIHBpcGVsaW5lX2NpID0ge307CisgICAgICAgIHBpcGVsaW5lX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIHBpcGVsaW5lX2NpLnN0YWdlQ291bnQgPSAyOworICAgICAgICBwaXBlbGluZV9jaS5wU3RhZ2VzID0gc3RhZ2VfY3JlYXRlX2luZm9zOworICAgICAgICBwaXBlbGluZV9jaS5ncm91cENvdW50ID0gMjsKKyAgICAgICAgcGlwZWxpbmVfY2kucEdyb3VwcyA9IGdyb3VwX2NyZWF0ZV9pbmZvczsKKyAgICAgICAgcGlwZWxpbmVfY2kubGF5b3V0ID0gZW1wdHlfcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYtc3RhZ2UtMDI0MDgiKTsKKyAgICAgICAgdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYobV9kZXZpY2UtPmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2NpLCBudWxscHRyLCAmcGlwZWxpbmUpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBHZW5lcmFsIHNoYWRlciBpbmRleCBkb2Vzbid0IGV4aXN0CisgICAgeworICAgICAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHN0YWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mby5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mby5tb2R1bGUgPSByZ2VuX3NoYWRlci5oYW5kbGUoKTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm8ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYgZ3JvdXBfY3JlYXRlX2luZm8gPSB7fTsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvLnR5cGUgPSBWS19SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfVFlQRV9HRU5FUkFMX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mby5nZW5lcmFsU2hhZGVyID0gMTsgIC8vIEJhZCBpbmRleCBoZXJlCisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mby5hbnlIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mby5pbnRlcnNlY3Rpb25TaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworCisgICAgICAgIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIHBpcGVsaW5lX2NpID0ge307CisgICAgICAgIHBpcGVsaW5lX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIHBpcGVsaW5lX2NpLnN0YWdlQ291bnQgPSAxOworICAgICAgICBwaXBlbGluZV9jaS5wU3RhZ2VzID0gJnN0YWdlX2NyZWF0ZV9pbmZvOworICAgICAgICBwaXBlbGluZV9jaS5ncm91cENvdW50ID0gMTsKKyAgICAgICAgcGlwZWxpbmVfY2kucEdyb3VwcyA9ICZncm91cF9jcmVhdGVfaW5mbzsKKyAgICAgICAgcGlwZWxpbmVfY2kubGF5b3V0ID0gZW1wdHlfcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxMyIpOworICAgICAgICB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihtX2RldmljZS0+aGFuZGxlKCksIFZLX05VTExfSEFORExFLCAxLCAmcGlwZWxpbmVfY2ksIG51bGxwdHIsICZwaXBlbGluZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIEdlbmVyYWwgc2hhZGVyIGluZGV4IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIHJheWdlbi9taXNzL2NhbGxhYmxlIHNoYWRlcgorICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdGFnZV9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVjsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLm1vZHVsZSA9IHJnZW5fc2hhZGVyLmhhbmRsZSgpOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0ubW9kdWxlID0gY2hpdF9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBncm91cF9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5nZW5lcmFsU2hhZGVyID0gMDsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5nZW5lcmFsU2hhZGVyID0gMTsgIC8vIEluZGV4IDEgY29ycmVzcG9uZHMgdG8gYSBjbG9zZXN0IGhpdCBzaGFkZXIKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgcGlwZWxpbmVfY2kgPSB7fTsKKyAgICAgICAgcGlwZWxpbmVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19QSVBFTElORV9DUkVBVEVfSU5GT19OVjsKKyAgICAgICAgcGlwZWxpbmVfY2kuc3RhZ2VDb3VudCA9IDI7CisgICAgICAgIHBpcGVsaW5lX2NpLnBTdGFnZXMgPSBzdGFnZV9jcmVhdGVfaW5mb3M7CisgICAgICAgIHBpcGVsaW5lX2NpLmdyb3VwQ291bnQgPSAyOworICAgICAgICBwaXBlbGluZV9jaS5wR3JvdXBzID0gZ3JvdXBfY3JlYXRlX2luZm9zOworICAgICAgICBwaXBlbGluZV9jaS5sYXlvdXQgPSBlbXB0eV9waXBlbGluZV9sYXlvdXQuaGFuZGxlKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi10eXBlLTAyNDEzIik7CisgICAgICAgIHZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKG1fZGV2aWNlLT5oYW5kbGUoKSwgVktfTlVMTF9IQU5ETEUsIDEsICZwaXBlbGluZV9jaSwgbnVsbHB0ciwgJnBpcGVsaW5lKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gR2VuZXJhbCBzaGFkZXIgZ3JvdXAgc2hvdWxkIG5vdCBzcGVjaWZ5IG5vbiBnZW5lcmFsIHNoYWRlcgorICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdGFnZV9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVjsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLm1vZHVsZSA9IHJnZW5fc2hhZGVyLmhhbmRsZSgpOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0ubW9kdWxlID0gY2hpdF9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBncm91cF9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5nZW5lcmFsU2hhZGVyID0gMDsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5nZW5lcmFsU2hhZGVyID0gMDsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmNsb3Nlc3RIaXRTaGFkZXIgPSAwOyAgLy8gVGhpcyBzaG91bGQgbm90IGJlIHNldCBmb3IgYSBnZW5lcmFsIHNoYWRlciBncm91cAorICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgcGlwZWxpbmVfY2kgPSB7fTsKKyAgICAgICAgcGlwZWxpbmVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19QSVBFTElORV9DUkVBVEVfSU5GT19OVjsKKyAgICAgICAgcGlwZWxpbmVfY2kuc3RhZ2VDb3VudCA9IDI7CisgICAgICAgIHBpcGVsaW5lX2NpLnBTdGFnZXMgPSBzdGFnZV9jcmVhdGVfaW5mb3M7CisgICAgICAgIHBpcGVsaW5lX2NpLmdyb3VwQ291bnQgPSAyOworICAgICAgICBwaXBlbGluZV9jaS5wR3JvdXBzID0gZ3JvdXBfY3JlYXRlX2luZm9zOworICAgICAgICBwaXBlbGluZV9jaS5sYXlvdXQgPSBlbXB0eV9waXBlbGluZV9sYXlvdXQuaGFuZGxlKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi10eXBlLTAyNDE0Iik7CisgICAgICAgIHZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKG1fZGV2aWNlLT5oYW5kbGUoKSwgVktfTlVMTF9IQU5ETEUsIDEsICZwaXBlbGluZV9jaSwgbnVsbHB0ciwgJnBpcGVsaW5lKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gSW50ZXJzZWN0aW9uIHNoYWRlciBpbnZhbGlkIGluZGV4CisgICAgeworICAgICAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHN0YWdlX2NyZWF0ZV9pbmZvc1syXSA9IHt9OworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1swXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ubW9kdWxlID0gcmdlbl9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1swXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9JTlRFUlNFQ1RJT05fQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0ubW9kdWxlID0gaW50cl9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBncm91cF9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5nZW5lcmFsU2hhZGVyID0gMDsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1BST0NFRFVSQUxfSElUX0dST1VQX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uZ2VuZXJhbFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5jbG9zZXN0SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmFueUhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5pbnRlcnNlY3Rpb25TaGFkZXIgPSA1OyAgLy8gaW52YWxpZCBpbmRleAorCisgICAgICAgIFZrUmF5VHJhY2luZ1BpcGVsaW5lQ3JlYXRlSW5mb05WIHBpcGVsaW5lX2NpID0ge307CisgICAgICAgIHBpcGVsaW5lX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfUElQRUxJTkVfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIHBpcGVsaW5lX2NpLnN0YWdlQ291bnQgPSAyOworICAgICAgICBwaXBlbGluZV9jaS5wU3RhZ2VzID0gc3RhZ2VfY3JlYXRlX2luZm9zOworICAgICAgICBwaXBlbGluZV9jaS5ncm91cENvdW50ID0gMjsKKyAgICAgICAgcGlwZWxpbmVfY2kucEdyb3VwcyA9IGdyb3VwX2NyZWF0ZV9pbmZvczsKKyAgICAgICAgcGlwZWxpbmVfY2kubGF5b3V0ID0gZW1wdHlfcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXREZXNpcmVkRmFpbHVyZU1zZyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtdHlwZS0wMjQxNSIpOworICAgICAgICB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihtX2RldmljZS0+aGFuZGxlKCksIFZLX05VTExfSEFORExFLCAxLCAmcGlwZWxpbmVfY2ksIG51bGxwdHIsICZwaXBlbGluZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIEludGVyc2VjdGlvbiBzaGFkZXIgaW5kZXggZG9lcyBub3QgY29ycmVzcG9uZCB0byBpbnRlcnNlY3Rpb24gc2hhZGVyCisgICAgeworICAgICAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHN0YWdlX2NyZWF0ZV9pbmZvc1syXSA9IHt9OworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1swXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ubW9kdWxlID0gcmdlbl9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1swXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9JTlRFUlNFQ1RJT05fQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0ubW9kdWxlID0gaW50cl9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBncm91cF9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5nZW5lcmFsU2hhZGVyID0gMDsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1BST0NFRFVSQUxfSElUX0dST1VQX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uZ2VuZXJhbFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5jbG9zZXN0SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmFueUhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5pbnRlcnNlY3Rpb25TaGFkZXIgPSAwOyAgLy8gSW5kZXggMCBjb3JyZXNwb25kcyB0byBhIHJheWdlbiBzaGFkZXIKKworICAgICAgICBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViBwaXBlbGluZV9jaSA9IHt9OworICAgICAgICBwaXBlbGluZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WOworICAgICAgICBwaXBlbGluZV9jaS5zdGFnZUNvdW50ID0gMjsKKyAgICAgICAgcGlwZWxpbmVfY2kucFN0YWdlcyA9IHN0YWdlX2NyZWF0ZV9pbmZvczsKKyAgICAgICAgcGlwZWxpbmVfY2kuZ3JvdXBDb3VudCA9IDI7CisgICAgICAgIHBpcGVsaW5lX2NpLnBHcm91cHMgPSBncm91cF9jcmVhdGVfaW5mb3M7CisgICAgICAgIHBpcGVsaW5lX2NpLmxheW91dCA9IGVtcHR5X3BpcGVsaW5lX2xheW91dC5oYW5kbGUoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELVZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WLXR5cGUtMDI0MTUiKTsKKyAgICAgICAgdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYobV9kZXZpY2UtPmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2NpLCBudWxscHRyLCAmcGlwZWxpbmUpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBJbnRlcnNlY3Rpb24gc2hhZGVyIG11c3Qgbm90IGJlIHNwZWNpZmllZCBmb3IgdHJpYW5nbGUgaGl0IGdyb3VwCisgICAgeworICAgICAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHN0YWdlX2NyZWF0ZV9pbmZvc1syXSA9IHt9OworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1swXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ubW9kdWxlID0gcmdlbl9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1swXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9JTlRFUlNFQ1RJT05fQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0ubW9kdWxlID0gaW50cl9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBncm91cF9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5nZW5lcmFsU2hhZGVyID0gMDsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1RSSUFOR0xFU19ISVRfR1JPVVBfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5nZW5lcmFsU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmludGVyc2VjdGlvblNoYWRlciA9IDE7CisKKyAgICAgICAgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgcGlwZWxpbmVfY2kgPSB7fTsKKyAgICAgICAgcGlwZWxpbmVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19QSVBFTElORV9DUkVBVEVfSU5GT19OVjsKKyAgICAgICAgcGlwZWxpbmVfY2kuc3RhZ2VDb3VudCA9IDI7CisgICAgICAgIHBpcGVsaW5lX2NpLnBTdGFnZXMgPSBzdGFnZV9jcmVhdGVfaW5mb3M7CisgICAgICAgIHBpcGVsaW5lX2NpLmdyb3VwQ291bnQgPSAyOworICAgICAgICBwaXBlbGluZV9jaS5wR3JvdXBzID0gZ3JvdXBfY3JlYXRlX2luZm9zOworICAgICAgICBwaXBlbGluZV9jaS5sYXlvdXQgPSBlbXB0eV9waXBlbGluZV9sYXlvdXQuaGFuZGxlKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi10eXBlLTAyNDE2Iik7CisgICAgICAgIHZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKG1fZGV2aWNlLT5oYW5kbGUoKSwgVktfTlVMTF9IQU5ETEUsIDEsICZwaXBlbGluZV9jaSwgbnVsbHB0ciwgJnBpcGVsaW5lKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorCisgICAgLy8gQW55IGhpdCBzaGFkZXIgaW5kZXggaW52YWxpZAorICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdGFnZV9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVjsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLm1vZHVsZSA9IHJnZW5fc2hhZGVyLmhhbmRsZSgpOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfQU5ZX0hJVF9CSVRfTlY7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5tb2R1bGUgPSBhaGl0X3NoYWRlci5oYW5kbGUoKTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnBOYW1lID0gIm1haW4iOworCisgICAgICAgIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGdyb3VwX2NyZWF0ZV9pbmZvc1syXSA9IHt9OworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS50eXBlID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfR0VORVJBTF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmdlbmVyYWxTaGFkZXIgPSAwOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uY2xvc2VzdEhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5hbnlIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uaW50ZXJzZWN0aW9uU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS50eXBlID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmdlbmVyYWxTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uY2xvc2VzdEhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5hbnlIaXRTaGFkZXIgPSA1OyAgLy8gSW52YWxpZCBpbmRleAorICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uaW50ZXJzZWN0aW9uU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKworICAgICAgICBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViBwaXBlbGluZV9jaSA9IHt9OworICAgICAgICBwaXBlbGluZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WOworICAgICAgICBwaXBlbGluZV9jaS5zdGFnZUNvdW50ID0gMjsKKyAgICAgICAgcGlwZWxpbmVfY2kucFN0YWdlcyA9IHN0YWdlX2NyZWF0ZV9pbmZvczsKKyAgICAgICAgcGlwZWxpbmVfY2kuZ3JvdXBDb3VudCA9IDI7CisgICAgICAgIHBpcGVsaW5lX2NpLnBHcm91cHMgPSBncm91cF9jcmVhdGVfaW5mb3M7CisgICAgICAgIHBpcGVsaW5lX2NpLmxheW91dCA9IGVtcHR5X3BpcGVsaW5lX2xheW91dC5oYW5kbGUoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi1hbnlIaXRTaGFkZXItMDI0MTgiKTsKKyAgICAgICAgdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYobV9kZXZpY2UtPmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2NpLCBudWxscHRyLCAmcGlwZWxpbmUpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBBbnkgaGl0IHNoYWRlciBpbmRleCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIGFueSBoaXQgc2hhZGVyCisgICAgeworICAgICAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIHN0YWdlX2NyZWF0ZV9pbmZvc1syXSA9IHt9OworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1swXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9SQVlHRU5fQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ubW9kdWxlID0gcmdlbl9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1swXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk87CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlY7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5tb2R1bGUgPSBjaGl0X3NoYWRlci5oYW5kbGUoKTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnBOYW1lID0gIm1haW4iOworCisgICAgICAgIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGdyb3VwX2NyZWF0ZV9pbmZvc1syXSA9IHt9OworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS50eXBlID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfR0VORVJBTF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmdlbmVyYWxTaGFkZXIgPSAwOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uY2xvc2VzdEhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5hbnlIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uaW50ZXJzZWN0aW9uU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS50eXBlID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmdlbmVyYWxTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uY2xvc2VzdEhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5hbnlIaXRTaGFkZXIgPSAxOyAgLy8gSW5kZXggMSBjb3JyZXNwb25kcyB0byBhIGNsb3Nlc3QgaGl0IHNoYWRlcgorICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uaW50ZXJzZWN0aW9uU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKworICAgICAgICBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViBwaXBlbGluZV9jaSA9IHt9OworICAgICAgICBwaXBlbGluZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WOworICAgICAgICBwaXBlbGluZV9jaS5zdGFnZUNvdW50ID0gMjsKKyAgICAgICAgcGlwZWxpbmVfY2kucFN0YWdlcyA9IHN0YWdlX2NyZWF0ZV9pbmZvczsKKyAgICAgICAgcGlwZWxpbmVfY2kuZ3JvdXBDb3VudCA9IDI7CisgICAgICAgIHBpcGVsaW5lX2NpLnBHcm91cHMgPSBncm91cF9jcmVhdGVfaW5mb3M7CisgICAgICAgIHBpcGVsaW5lX2NpLmxheW91dCA9IGVtcHR5X3BpcGVsaW5lX2xheW91dC5oYW5kbGUoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi1hbnlIaXRTaGFkZXItMDI0MTgiKTsKKyAgICAgICAgdmtDcmVhdGVSYXlUcmFjaW5nUGlwZWxpbmVzTlYobV9kZXZpY2UtPmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2NpLCBudWxscHRyLCAmcGlwZWxpbmUpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBDbG9zZXN0IGhpdCBzaGFkZXIgaW5kZXggaW52YWxpZAorICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdGFnZV9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVjsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLm1vZHVsZSA9IHJnZW5fc2hhZGVyLmhhbmRsZSgpOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfQ0xPU0VTVF9ISVRfQklUX05WOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0ubW9kdWxlID0gY2hpdF9zaGFkZXIuaGFuZGxlKCk7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5wTmFtZSA9ICJtYWluIjsKKworICAgICAgICBWa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OViBncm91cF9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX0dFTkVSQUxfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5nZW5lcmFsU2hhZGVyID0gMDsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmNsb3Nlc3RIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX0NSRUFURV9JTkZPX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0udHlwZSA9IFZLX1JBWV9UUkFDSU5HX1NIQURFUl9HUk9VUF9UWVBFX1RSSUFOR0xFU19ISVRfR1JPVVBfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5nZW5lcmFsU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmNsb3Nlc3RIaXRTaGFkZXIgPSA1OyAgLy8gSW52YWxpZCBpbmRleAorICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uYW55SGl0U2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmludGVyc2VjdGlvblNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisKKyAgICAgICAgVmtSYXlUcmFjaW5nUGlwZWxpbmVDcmVhdGVJbmZvTlYgcGlwZWxpbmVfY2kgPSB7fTsKKyAgICAgICAgcGlwZWxpbmVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19QSVBFTElORV9DUkVBVEVfSU5GT19OVjsKKyAgICAgICAgcGlwZWxpbmVfY2kuc3RhZ2VDb3VudCA9IDI7CisgICAgICAgIHBpcGVsaW5lX2NpLnBTdGFnZXMgPSBzdGFnZV9jcmVhdGVfaW5mb3M7CisgICAgICAgIHBpcGVsaW5lX2NpLmdyb3VwQ291bnQgPSAyOworICAgICAgICBwaXBlbGluZV9jaS5wR3JvdXBzID0gZ3JvdXBfY3JlYXRlX2luZm9zOworICAgICAgICBwaXBlbGluZV9jaS5sYXlvdXQgPSBlbXB0eV9waXBlbGluZV9sYXlvdXQuaGFuZGxlKCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZVSUQtVmtSYXlUcmFjaW5nU2hhZGVyR3JvdXBDcmVhdGVJbmZvTlYtY2xvc2VzdEhpdFNoYWRlci0wMjQxNyIpOworICAgICAgICB2a0NyZWF0ZVJheVRyYWNpbmdQaXBlbGluZXNOVihtX2RldmljZS0+aGFuZGxlKCksIFZLX05VTExfSEFORExFLCAxLCAmcGlwZWxpbmVfY2ksIG51bGxwdHIsICZwaXBlbGluZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlGb3VuZCgpOworICAgIH0KKworICAgIC8vIENsb3Nlc3QgaGl0IHNoYWRlciBpbmRleCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIGNsb3Nlc3QgaGl0IHNoYWRlcgorICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdGFnZV9jcmVhdGVfaW5mb3NbMl0gPSB7fTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfUkFZR0VOX0JJVF9OVjsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzBdLm1vZHVsZSA9IHJnZW5fc2hhZGVyLmhhbmRsZSgpOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMF0ucE5hbWUgPSAibWFpbiI7CisKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgICAgICBzdGFnZV9jcmVhdGVfaW5mb3NbMV0uc3RhZ2UgPSBWS19TSEFERVJfU1RBR0VfQU5ZX0hJVF9CSVRfTlY7CisgICAgICAgIHN0YWdlX2NyZWF0ZV9pbmZvc1sxXS5tb2R1bGUgPSBhaGl0X3NoYWRlci5oYW5kbGUoKTsKKyAgICAgICAgc3RhZ2VfY3JlYXRlX2luZm9zWzFdLnBOYW1lID0gIm1haW4iOworCisgICAgICAgIFZrUmF5VHJhY2luZ1NoYWRlckdyb3VwQ3JlYXRlSW5mb05WIGdyb3VwX2NyZWF0ZV9pbmZvc1syXSA9IHt9OworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS50eXBlID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfR0VORVJBTF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzBdLmdlbmVyYWxTaGFkZXIgPSAwOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uY2xvc2VzdEhpdFNoYWRlciA9IFZLX1NIQURFUl9VTlVTRURfTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1swXS5hbnlIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMF0uaW50ZXJzZWN0aW9uU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SQVlfVFJBQ0lOR19TSEFERVJfR1JPVVBfQ1JFQVRFX0lORk9fTlY7CisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS50eXBlID0gVktfUkFZX1RSQUNJTkdfU0hBREVSX0dST1VQX1RZUEVfVFJJQU5HTEVTX0hJVF9HUk9VUF9OVjsKKyAgICAgICAgZ3JvdXBfY3JlYXRlX2luZm9zWzFdLmdlbmVyYWxTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uY2xvc2VzdEhpdFNoYWRlciA9IDE7ICAvLyBJbmRleCAxIGNvcnJlc3BvbmRzIHRvIGFuIGFueSBoaXQgc2hhZGVyCisgICAgICAgIGdyb3VwX2NyZWF0ZV9pbmZvc1sxXS5hbnlIaXRTaGFkZXIgPSBWS19TSEFERVJfVU5VU0VEX05WOworICAgICAgICBncm91cF9jcmVhdGVfaW5mb3NbMV0uaW50ZXJzZWN0aW9uU2hhZGVyID0gVktfU0hBREVSX1VOVVNFRF9OVjsKKworICAgICAgICBWa1JheVRyYWNpbmdQaXBlbGluZUNyZWF0ZUluZm9OViBwaXBlbGluZV9jaSA9IHt9OworICAgICAgICBwaXBlbGluZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JBWV9UUkFDSU5HX1BJUEVMSU5FX0NSRUFURV9JTkZPX05WOworICAgICAgICBwaXBlbGluZV9jaS5zdGFnZUNvdW50ID0gMjsKKyAgICAgICAgcGlwZWxpbmVfY2kucFN0YWdlcyA9IHN0YWdlX2NyZWF0ZV9pbmZvczsKKyAgICAgICAgcGlwZWxpbmVfY2kuZ3JvdXBDb3VudCA9IDI7CisgICAgICAgIHBpcGVsaW5lX2NpLnBHcm91cHMgPSBncm91cF9jcmVhdGVfaW5mb3M7CisgICAgICAgIHBpcGVsaW5lX2NpLmxheW91dCA9IGVtcHR5X3BpcGVsaW5lX2xheW91dC5oYW5kbGUoKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlVJRC1Wa1JheVRyYWNpbmdTaGFkZXJHcm91cENyZWF0ZUluZm9OVi1jbG9zZXN0SGl0U2hhZGVyLTAyNDE3Iik7CisgICAgICAgIHZrQ3JlYXRlUmF5VHJhY2luZ1BpcGVsaW5lc05WKG1fZGV2aWNlLT5oYW5kbGUoKSwgVktfTlVMTF9IQU5ETEUsIDEsICZwaXBlbGluZV9jaSwgbnVsbHB0ciwgJnBpcGVsaW5lKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtMYXllclRlc3QsIFBpcGVsaW5lU3RhZ2VDb25kaXRpb25hbFJlbmRlcmluZ1dpdGhXcm9uZ1F1ZXVlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUnVuIENtZFBpcGVsaW5lQmFycmllciB3aXRoIFZLX1BJUEVMSU5FX1NUQUdFX0NPTkRJVElPTkFMX1JFTkRFUklOR19CSVRfRVhUIGFuZCB3cm9uZyBWa1F1ZXVlRmxhZ0JpdHMiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIC8vIG1fZGV2aWNlLT5tX3F1ZXVlID0gbV9kZXZpY2UtPmRtYV9xdWV1ZXMoKVswXS0+aGFuZGxlKCk7CisgICAgdWludDMyX3Qgb25seV90cmFuc2Zlcl9xdWV1ZUZhbWlseUluZGV4ID0gVUlOVDMyX01BWDsKKworICAgIGNvbnN0IGF1dG8gcV9wcm9wcyA9IHZrX3Rlc3Rpbmc6OlBoeXNpY2FsRGV2aWNlKGdwdSgpKS5xdWV1ZV9wcm9wZXJ0aWVzKCk7CisgICAgQVNTRVJUX1RSVUUocV9wcm9wcy5zaXplKCkgPiAwKTsKKyAgICBBU1NFUlRfVFJVRShxX3Byb3BzWzBdLnF1ZXVlQ291bnQgPiAwKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAodWludDMyX3QpcV9wcm9wcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAocV9wcm9wc1tpXS5xdWV1ZUZsYWdzID09IFZLX1FVRVVFX1RSQU5TRkVSX0JJVCkgeworICAgICAgICAgICAgb25seV90cmFuc2Zlcl9xdWV1ZUZhbWlseUluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9ubHlfdHJhbnNmZXJfcXVldWVGYW1pbHlJbmRleCA9PSBVSU5UMzJfTUFYKSB7CisgICAgICAgIHByaW50ZigiJXMgT25seSBWS19RVUVVRV9UUkFOU0ZFUl9CSVQgUXVldWUgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEEgcmVuZGVycGFzcyB3aXRoIGEgc2luZ2xlIHN1YnBhc3MgdGhhdCBkZWNsYXJlZCBhIHNlbGYtZGVwZW5kZW5jeQorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaFtdID0geworICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICB9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSByZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCAmcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICB9OworCisgICAgVmtTdWJwYXNzRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gezAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1ZFUlRFWF9TSEFERVJfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19DT05ESVRJT05BTF9SRU5ERVJJTkdfUkVBRF9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmtEZXBlbmRlbmN5RmxhZ3MpMH07CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAxLCBhdHRhY2gsIDEsIHN1YnBhc3NlcywgMSwgJmRlcGVuZGVuY3l9OworICAgIFZrUmVuZGVyUGFzcyBycDsKKworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIG51bGxwdHIsICZycCk7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCk7CisgICAgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3ID0gaW1hZ2UudGFyZ2V0VmlldyhWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0pOworCisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmJjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIDEsICZpbWFnZVZpZXcsIDMyLCAzMiwgMX07CisgICAgVmtGcmFtZWJ1ZmZlciBmYjsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZmJjaSwgbnVsbHB0ciwgJmZiKTsKKworICAgIFZrQ29tbWFuZFBvb2xPYmogY29tbWFuZFBvb2wobV9kZXZpY2UsIG9ubHlfdHJhbnNmZXJfcXVldWVGYW1pbHlJbmRleCk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNvbW1hbmRCdWZmZXIobV9kZXZpY2UsICZjb21tYW5kUG9vbCk7CisKKyAgICBjb21tYW5kQnVmZmVyLmJlZ2luKCk7CisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJwYmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMyLCAzMn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyLmhhbmRsZSgpLCAmcnBiaSwgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworCisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1iID0ge307CisgICAgaW1iLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI7CisgICAgaW1iLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBpbWIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUOworICAgIGltYi5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0NPTkRJVElPTkFMX1JFTkRFUklOR19SRUFEX0JJVF9FWFQ7CisgICAgaW1iLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1iLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1iLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbWIuZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltYi5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgIGltYi5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGltYi5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1iLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgaW1iLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGltYi5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldERlc2lyZWRGYWlsdXJlTXNnKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULCAiVlVJRC12a0NtZFBpcGVsaW5lQmFycmllci1zcmNTdGFnZU1hc2stMDExODMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJWVUlELXZrQ21kUGlwZWxpbmVCYXJyaWVyLXNyY1N0YWdlTWFzay0wMTE4MyIpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIoY29tbWFuZEJ1ZmZlci5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCwgMCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltYik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeUZvdW5kKCk7CisKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyLmhhbmRsZSgpKTsKKyAgICBjb21tYW5kQnVmZmVyLmVuZCgpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIG51bGxwdHIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtwb3NpdGl2ZWxheWVydGVzdHMuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtwb3NpdGl2ZWxheWVydGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWU3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a3Bvc2l0aXZlbGF5ZXJ0ZXN0cy5jcHAKQEAgLTAsMCArMSw4Nzg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZkBpancuY28ubno+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWlrZSBTdHJveWFuIDxtaWtlQEx1bmFyRy5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbmVAZ29vZ2xlLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNub3J0aHJvcEBnb29nbGUuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEplcmVteSBLbmlhZ2VyIDxqZXJlbXlrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFNoYW5ub24gTWNQaGVyc29uIDxzaGFubm9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvaG4gWnVsYXVmIDxqenVsYXVmQGx1bmFyZy5jb20+CisgKi8KKworI2luY2x1ZGUgImNhc3RfdXRpbHMuaCIKKyNpbmNsdWRlICJsYXllcl92YWxpZGF0aW9uX3Rlc3RzLmgiCisvLworLy8gUE9TSVRJVkUgVkFMSURBVElPTiBURVNUUworLy8KKy8vIFRoZXNlIHRlc3RzIGRvIG5vdCBleHBlY3QgdG8gZW5jb3VudGVyIEFOWSB2YWxpZGF0aW9uIGVycm9ycyBwYXNzIG9ubHkgaWYgdGhpcyBpcyB0cnVlCisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBOdWxsRnVuY3Rpb25Qb2ludGVyKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiT24gMV8wIGluc3RhbmNlICwgY2FsbCBHZXREZXZpY2VQcm9jQWRkciBvbiBwcm9tb3RlZCAxXzEgZGV2aWNlLWxldmVsIGVudHJ5cG9pbnQiKTsKKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsICJWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyIikpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjaygiVktfS0hSX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzMiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgVktfS0hSX2dldF9tZW1vcnlfcmVxaXJlbWVudHMyIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyBOdWxsRnVuY3Rpb25Qb2ludGVyIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgYXV0byBmcEdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyA9CisgICAgICAgIChQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czIiKTsKKyAgICBpZiAoZnBHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMpIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlNldEVycm9yKCJOdWxsIHdhcyBleHBlY3RlZCEiKTsKKyAgICB9CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBTZWNvbmRhcnlDb21tYW5kQnVmZmVyQmFycmllcikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkFkZCBhIHBpcGVsaW5lIGJhcnJpZXIgaW4gYSBzZWNvbmRhcnkgY29tbWFuZCBidWZmZXIiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIC8vIEEgcmVuZGVycGFzcyB3aXRoIGEgc2luZ2xlIHN1YnBhc3MgdGhhdCBkZWNsYXJlZCBhIHNlbGYtZGVwZW5kZW5jeQorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaFtdID0geworICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICB9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSByZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCAmcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICB9OworICAgIFZrU3VicGFzc0RlcGVuZGVuY3kgZGVwID0gezAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUfTsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDEsIGF0dGFjaCwgMSwgc3VicGFzc2VzLCAxLCAmZGVwfTsKKyAgICBWa1JlbmRlclBhc3MgcnA7CisKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIFZrSW1hZ2VWaWV3IGltYWdlVmlldyA9IGltYWdlLnRhcmdldFZpZXcoVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNKTsKKworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZiY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIHJwLCAxLCAmaW1hZ2VWaWV3LCAzMiwgMzIsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZiY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBycGJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMiwgMzJ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHJ9OworCisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcnBiaSwgVktfU1VCUEFTU19DT05URU5UU19TRUNPTkRBUllfQ09NTUFORF9CVUZGRVJTKTsKKworICAgIFZrQ29tbWFuZFBvb2xPYmogcG9vbChtX2RldmljZSwgbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIHNlY29uZGFyeShtX2RldmljZSwgJnBvb2wsIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY2JpaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwgIC8vIFNldCB0byBOVUxMIEZCIGhhbmRsZSBpbnRlbnRpb25hbGx5IHRvIGZsZXNoIG91dCBhbnkgZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY2JiaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQgfCBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNiaWl9OworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoc2Vjb25kYXJ5LmhhbmRsZSgpLCAmY2JiaSk7CisgICAgVmtNZW1vcnlCYXJyaWVyIG1lbV9iYXJyaWVyID0ge307CisgICAgbWVtX2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQkFSUklFUjsKKyAgICBtZW1fYmFycmllci5wTmV4dCA9IE5VTEw7CisgICAgbWVtX2JhcnJpZXIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUOworICAgIG1lbV9iYXJyaWVyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1dSSVRFX0JJVDsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKHNlY29uZGFyeS5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVCwgMSwgJm1lbV9iYXJyaWVyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKworICAgIGltYWdlLkltYWdlTWVtb3J5QmFycmllcigmc2Vjb25kYXJ5LCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19BQ0NFU1NfU0hBREVSX1dSSVRFX0JJVCwgVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQpOworICAgIHNlY29uZGFyeS5lbmQoKTsKKworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY29uZGFyeS5oYW5kbGUoKSk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgUmVuZGVyUGFzc0NyZWF0ZUF0dGFjaG1lbnRVc2VkVHdpY2VPSykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkF0dGFjaG1lbnQgaXMgdXNlZCBzaW11bHRhbmVvdXNseSBhcyBjb2xvciBhbmQgaW5wdXQsIHdpdGggdGhlIHNhbWUgbGF5b3V0LiBUaGlzIGlzIE9LLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaFtdID0geworICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FELCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9LAorICAgIH07CisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIHJlZiA9IHswLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTH07CisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc2VzW10gPSB7CisgICAgICAgIHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAxLCAmcmVmLCAxLCAmcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfSwKKyAgICB9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAxLCBhdHRhY2gsIDEsIHN1YnBhc3NlcywgMCwgbnVsbHB0cn07CisgICAgVmtSZW5kZXJQYXNzIHJwOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVJbml0aWFsTGF5b3V0VW5kZWZpbmVkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkVuc3VyZSB0aGF0IENtZEJlZ2luUmVuZGVyUGFzcyB3aXRoIGFuIGF0dGFjaG1lbnQncyBpbml0aWFsTGF5b3V0IG9mIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQgd29ya3Mgd2hlbiB0aGUgY29tbWFuZCAiCisgICAgICAgICJidWZmZXIgaGFzIHByaW9yIGtub3dsZWRnZSBvZiB0aGF0IGF0dGFjaG1lbnQncyBsYXlvdXQuIik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIEEgcmVuZGVycGFzcyB3aXRoIG9uZSBjb2xvciBhdHRhY2htZW50LgorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnQgPSB7MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9OworCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGF0dF9yZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH07CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0gezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDEsICZhdHRfcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMSwgJmF0dGFjaG1lbnQsIDEsICZzdWJwYXNzLCAwLCBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBBIGNvbXBhdGlibGUgZnJhbWVidWZmZXIuCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpdmNpID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPLAorICAgICAgICBudWxscHRyLAorICAgICAgICAwLAorICAgICAgICBpbWFnZS5oYW5kbGUoKSwKKyAgICAgICAgVktfSU1BR0VfVklFV19UWVBFXzJELAorICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgICAgIHtWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSwgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFl9LAorICAgICAgICB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMX0sCisgICAgfTsKKyAgICBWa0ltYWdlVmlldyB2aWV3OworICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaXZjaSwgbnVsbHB0ciwgJnZpZXcpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIHJwLCAxLCAmdmlldywgMzIsIDMyLCAxfTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZiOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIFJlY29yZCBhIHNpbmdsZSBjb21tYW5kIGJ1ZmZlciB3aGljaCB1c2VzIHRoaXMgcmVuZGVycGFzcyB0d2ljZS4gVGhlCisgICAgLy8gYnVnIGlzIHRyaWdnZXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgcmVuZGVycGFzcywgd2hlbiB0aGUKKyAgICAvLyBjb21tYW5kIGJ1ZmZlciBhbHJlYWR5IGhhcyBhIGxheW91dCByZWNvcmRlZCBmb3IgdGhlIGF0dGFjaG1lbnQuCisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJwYmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTywgbnVsbHB0ciwgcnAsIGZiLCB7ezAsIDB9LCB7MzIsIDMyfX0sIDAsIG51bGxwdHJ9OworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycGJpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcnBiaSwgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCB2aWV3LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFJlbmRlclBhc3NDcmVhdGVBdHRhY2htZW50TGF5b3V0V2l0aExvYWRPcFRoZW5SZWFkT25seSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJQb3NpdGl2ZSB0ZXN0IHdoZXJlIHdlIGNyZWF0ZSBhIHJlbmRlcnBhc3Mgd2l0aCBhbiBhdHRhY2htZW50IHRoYXQgdXNlcyBMT0FEX09QX0NMRUFSLCB0aGUgZmlyc3Qgc3VicGFzcyBoYXMgYSB2YWxpZCAiCisgICAgICAgICJsYXlvdXQsIGFuZCBhIHNlY29uZCBzdWJwYXNzIHRoZW4gdXNlcyBhIHZhbGlkICpSRUFEX09OTFkqIGxheW91dC4iKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgYXV0byBkZXB0aF9mb3JtYXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBpZiAoIWRlcHRoX2Zvcm1hdCkgeworICAgICAgICBwcmludGYoIiVzIE5vIERlcHRoICsgU3RlbmNpbCBmb3JtYXQgZm91bmQuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgYXR0YWNoWzJdID0ge307CisgICAgYXR0YWNoWzBdLmF0dGFjaG1lbnQgPSAwOworICAgIGF0dGFjaFswXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgYXR0YWNoWzFdLmF0dGFjaG1lbnQgPSAwOworICAgIGF0dGFjaFsxXS5sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzZXNbMl0gPSB7fTsKKyAgICAvLyBGaXJzdCBzdWJwYXNzIGNsZWFycyBEUyBhdHRhY2ggb24gbG9hZAorICAgIHN1YnBhc3Nlc1swXS5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCA9ICZhdHRhY2hbMF07CisgICAgLy8gMm5kIHN1YnBhc3MgcmVhZHMgaW4gRFMgYXMgaW5wdXQgYXR0YWNobWVudAorICAgIHN1YnBhc3Nlc1sxXS5pbnB1dEF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgc3VicGFzc2VzWzFdLnBJbnB1dEF0dGFjaG1lbnRzID0gJmF0dGFjaFsxXTsKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2hfZGVzYyA9IHt9OworICAgIGF0dGFjaF9kZXNjLmZvcm1hdCA9IGRlcHRoX2Zvcm1hdDsKKyAgICBhdHRhY2hfZGVzYy5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGF0dGFjaF9kZXNjLnN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFOworICAgIGF0dGFjaF9kZXNjLnN0ZW5jaWxTdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkU7CisgICAgYXR0YWNoX2Rlc2MubG9hZE9wID0gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSOworICAgIGF0dGFjaF9kZXNjLnN0ZW5jaWxMb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI7CisgICAgYXR0YWNoX2Rlc2MuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHt9OworICAgIHJwY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBycGNpLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgcnBjaS5wQXR0YWNobWVudHMgPSAmYXR0YWNoX2Rlc2M7CisgICAgcnBjaS5zdWJwYXNzQ291bnQgPSAyOworICAgIHJwY2kucFN1YnBhc3NlcyA9IHN1YnBhc3NlczsKKworICAgIC8vIE5vdyBjcmVhdGUgUmVuZGVyUGFzcyBhbmQgdmVyaWZ5IG5vIGVycm9ycworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBOVUxMLCAmcnApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIE5VTEwpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgUmVuZGVyUGFzc0JlZ2luU3VicGFzc1plcm9UcmFuc2l0aW9uc0FwcGxpZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJFbnN1cmUgdGhhdCBDbWRCZWdpblJlbmRlclBhc3MgYXBwbGllcyB0aGUgbGF5b3V0IHRyYW5zaXRpb25zIGZvciB0aGUgZmlyc3Qgc3VicGFzcyIpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICAvLyBBIHJlbmRlcnBhc3Mgd2l0aCBvbmUgY29sb3IgYXR0YWNobWVudC4KKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50ID0gezAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfTsKKworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRfcmVmID0gezAsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9OworCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCAmYXR0X3JlZiwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisKKyAgICBWa1N1YnBhc3NEZXBlbmRlbmN5IGRlcCA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFUEVOREVOQ1lfQllfUkVHSU9OX0JJVH07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDEsICZhdHRhY2htZW50LCAxLCAmc3VicGFzcywgMSwgJmRlcH07CisKKyAgICBWa1Jlc3VsdCBlcnI7CisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIG51bGxwdHIsICZycCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEEgY29tcGF0aWJsZSBmcmFtZWJ1ZmZlci4KKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworCisgICAgVmtJbWFnZVZpZXcgdmlldyA9IGltYWdlLnRhcmdldFZpZXcoVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNKTsKKworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIDEsICZ2aWV3LCAzMiwgMzIsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZjaSwgbnVsbHB0ciwgJmZiKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gUmVjb3JkIGEgc2luZ2xlIGNvbW1hbmQgYnVmZmVyIHdoaWNoIGlzc3VlcyBhIHBpcGVsaW5lIGJhcnJpZXIgdy8KKyAgICAvLyBpbWFnZSBtZW1vcnkgYmFycmllciBmb3IgdGhlIGF0dGFjaG1lbnQuIFRoaXMgZGV0ZWN0cyB0aGUgcHJldmlvdXNseQorICAgIC8vIG1pc3NpbmcgdHJhY2tpbmcgb2YgdGhlIHN1YnBhc3MgbGF5b3V0IGJ5IHRocm93aW5nIGEgdmFsaWRhdGlvbiBlcnJvcgorICAgIC8vIGlmIGl0IGRvZXNuJ3Qgb2NjdXIuCisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJwYmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTywgbnVsbHB0ciwgcnAsIGZiLCB7ezAsIDB9LCB7MzIsIDMyfX0sIDAsIG51bGxwdHJ9OworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycGJpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisKKyAgICBpbWFnZS5JbWFnZU1lbW9yeUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQpOworCisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgUmVuZGVyUGFzc0JlZ2luVHJhbnNpdGlvbnNBdHRhY2htZW50VW51c2VkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkVuc3VyZSB0aGF0IGxheW91dCB0cmFuc2l0aW9ucyB3b3JrIGNvcnJlY3RseSB3aXRob3V0IGVycm9ycywgd2hlbiBhbiBhdHRhY2htZW50IHJlZmVyZW5jZSBpcyBWS19BVFRBQ0hNRU5UX1VOVVNFRCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICAvLyBBIHJlbmRlcnBhc3Mgd2l0aCBubyBhdHRhY2htZW50cworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRfcmVmID0ge1ZLX0FUVEFDSE1FTlRfVU5VU0VELCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfTsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMCwgbnVsbHB0ciwgMSwgJmF0dF9yZWYsIG51bGxwdHIsIG51bGxwdHIsIDAsIG51bGxwdHJ9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCAxLCAmc3VicGFzcywgMCwgbnVsbHB0cn07CisKKyAgICBWa1JlbmRlclBhc3MgcnA7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgbnVsbHB0ciwgJnJwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gQSBjb21wYXRpYmxlIGZyYW1lYnVmZmVyLgorICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIDAsIG51bGxwdHIsIDMyLCAzMiwgMX07CisgICAgVmtGcmFtZWJ1ZmZlciBmYjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZmNpLCBudWxscHRyLCAmZmIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBSZWNvcmQgYSBjb21tYW5kIGJ1ZmZlciB3aGljaCBqdXN0IGJlZ2lucyBhbmQgZW5kcyB0aGUgcmVuZGVycGFzcy4gVGhlCisgICAgLy8gYnVnIG1hbmlmZXN0cyBpbiBCZWdpblJlbmRlclBhc3MuCisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJwYmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQkVHSU5fSU5GTywgbnVsbHB0ciwgcnAsIGZiLCB7ezAsIDB9LCB7MzIsIDMyfX0sIDAsIG51bGxwdHJ9OworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycGJpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgUmVuZGVyUGFzc0JlZ2luU3RlbmNpbExvYWRPcCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHN0ZW5jaWwtb25seSBhdHRhY2htZW50IHdpdGggYSBMT0FEX09QIHNldCB0byBDTEVBUi4gc3RlbmNpbFtMb2FkfFN0b3JlXU9wIHVzZWQgdG8gYmUgaWdub3JlZC4iKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBWS19TVUNDRVNTOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgYXV0byBkZXB0aF9mb3JtYXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBpZiAoIWRlcHRoX2Zvcm1hdCkgeworICAgICAgICBwcmludGYoIiVzIE5vIERlcHRoICsgU3RlbmNpbCBmb3JtYXQgZm91bmQuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgZm9ybWF0UHJvcHM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKGdwdSgpLCBkZXB0aF9mb3JtYXQsIFZLX0lNQUdFX1RZUEVfMkQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdFByb3BzKTsKKyAgICBpZiAoZm9ybWF0UHJvcHMubWF4RXh0ZW50LndpZHRoIDwgMTAwIHx8IGZvcm1hdFByb3BzLm1heEV4dGVudC5oZWlnaHQgPCAxMDApIHsKKyAgICAgICAgcHJpbnRmKCIlcyBJbWFnZSBmb3JtYXQgbWF4IGV4dGVudCBpcyB0b28gc21hbGwuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0Zvcm1hdCBkZXB0aF9zdGVuY2lsX2ZtdCA9IGRlcHRoX2Zvcm1hdDsKKyAgICBtX2RlcHRoU3RlbmNpbC0+SW5pdChtX2RldmljZSwgMTAwLCAxMDAsIGRlcHRoX3N0ZW5jaWxfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUKTsKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHQgPSB7fTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgcmVmID0ge307CisgICAgYXR0LmZvcm1hdCA9IGRlcHRoX3N0ZW5jaWxfZm10OworICAgIGF0dC5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGF0dC5sb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFOworICAgIGF0dC5zdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkU7CisgICAgYXR0LnN0ZW5jaWxMb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVI7CisgICAgYXR0LnN0ZW5jaWxTdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRTsKKyAgICBhdHQuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBhdHQuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw7CisKKyAgICBWa0NsZWFyVmFsdWUgY2xlYXI7CisgICAgY2xlYXIuZGVwdGhTdGVuY2lsLmRlcHRoID0gMS4wOworICAgIGNsZWFyLmRlcHRoU3RlbmNpbC5zdGVuY2lsID0gMDsKKyAgICByZWYuYXR0YWNobWVudCA9IDA7CisgICAgcmVmLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3MgPSB7fTsKKyAgICBzdWJwYXNzLnBpcGVsaW5lQmluZFBvaW50ID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzsKKyAgICBzdWJwYXNzLmZsYWdzID0gMDsKKyAgICBzdWJwYXNzLmlucHV0QXR0YWNobWVudENvdW50ID0gMDsKKyAgICBzdWJwYXNzLnBJbnB1dEF0dGFjaG1lbnRzID0gTlVMTDsKKyAgICBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50ID0gMDsKKyAgICBzdWJwYXNzLnBDb2xvckF0dGFjaG1lbnRzID0gTlVMTDsKKyAgICBzdWJwYXNzLnBSZXNvbHZlQXR0YWNobWVudHMgPSBOVUxMOworICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSAmcmVmOworICAgIHN1YnBhc3MucHJlc2VydmVBdHRhY2htZW50Q291bnQgPSAwOworICAgIHN1YnBhc3MucFByZXNlcnZlQXR0YWNobWVudHMgPSBOVUxMOworCisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBfaW5mbyA9IHt9OworICAgIHJwX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBycF9pbmZvLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgcnBfaW5mby5wQXR0YWNobWVudHMgPSAmYXR0OworICAgIHJwX2luZm8uc3VicGFzc0NvdW50ID0gMTsKKyAgICBycF9pbmZvLnBTdWJwYXNzZXMgPSAmc3VicGFzczsKKyAgICByZXN1bHQgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhkZXZpY2UoKSwgJnJwX2luZm8sIE5VTEwsICZycCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MocmVzdWx0KTsKKworICAgIFZrSW1hZ2VWaWV3ICpkZXB0aFZpZXcgPSBtX2RlcHRoU3RlbmNpbC0+QmluZEluZm8oKTsKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmYl9pbmZvID0ge307CisgICAgZmJfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGZiX2luZm8ucE5leHQgPSBOVUxMOworICAgIGZiX2luZm8ucmVuZGVyUGFzcyA9IHJwOworICAgIGZiX2luZm8uYXR0YWNobWVudENvdW50ID0gMTsKKyAgICBmYl9pbmZvLnBBdHRhY2htZW50cyA9IGRlcHRoVmlldzsKKyAgICBmYl9pbmZvLndpZHRoID0gMTAwOworICAgIGZiX2luZm8uaGVpZ2h0ID0gMTAwOworICAgIGZiX2luZm8ubGF5ZXJzID0gMTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZiOworICAgIHJlc3VsdCA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UoKSwgJmZiX2luZm8sIE5VTEwsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MocmVzdWx0KTsKKworICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBycGJpbmZvID0ge307CisgICAgcnBiaW5mby5jbGVhclZhbHVlQ291bnQgPSAxOworICAgIHJwYmluZm8ucENsZWFyVmFsdWVzID0gJmNsZWFyOworICAgIHJwYmluZm8ucE5leHQgPSBOVUxMOworICAgIHJwYmluZm8ucmVuZGVyUGFzcyA9IHJwOworICAgIHJwYmluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPOworICAgIHJwYmluZm8ucmVuZGVyQXJlYS5leHRlbnQud2lkdGggPSAxMDA7CisgICAgcnBiaW5mby5yZW5kZXJBcmVhLmV4dGVudC5oZWlnaHQgPSAxMDA7CisgICAgcnBiaW5mby5yZW5kZXJBcmVhLm9mZnNldC54ID0gMDsKKyAgICBycGJpbmZvLnJlbmRlckFyZWEub2Zmc2V0LnkgPSAwOworICAgIHJwYmluZm8uZnJhbWVidWZmZXIgPSBmYjsKKworICAgIFZrRmVuY2VPYmogZmVuY2U7CisgICAgZmVuY2UuaW5pdCgqbV9kZXZpY2UsIFZrRmVuY2VPYmo6OmNyZWF0ZV9pbmZvKCkpOworICAgIEFTU0VSVF9UUlVFKGZlbmNlLmluaXRpYWxpemVkKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKHJwYmluZm8pOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5RdWV1ZUNvbW1hbmRCdWZmZXIoZmVuY2UpOworCisgICAgVmtJbWFnZU9iaiBkZXN0SW1hZ2UobV9kZXZpY2UpOworICAgIGRlc3RJbWFnZS5Jbml0KDEwMCwgMTAwLCAxLCBkZXB0aF9zdGVuY2lsX2ZtdCwgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQsCisgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIGZlbmNlLndhaXQoVktfVFJVRSwgVUlOVDY0X01BWCk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNtZGJ1ZihtX2RldmljZSwgbV9jb21tYW5kUG9vbCk7CisgICAgY21kYnVmLmJlZ2luKCk7CisKKyAgICBtX2RlcHRoU3RlbmNpbC0+SW1hZ2VNZW1vcnlCYXJyaWVyKCZjbWRidWYsIFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfVFJBTlNGRVJfUkVBRF9CSVQgfCBWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1JFQURfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCB8IFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMKTsKKworICAgIGRlc3RJbWFnZS5JbWFnZU1lbW9yeUJhcnJpZXIoJmNtZGJ1ZiwgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19UUkFOU0ZFUl9XUklURV9CSVQgfCBWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1dSSVRFX0JJVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCk7CisgICAgVmtJbWFnZUNvcHkgY3JlZ2lvbjsKKyAgICBjcmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworICAgIGNyZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNyZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNyZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY3JlZ2lvbi5zcmNPZmZzZXQueCA9IDA7CisgICAgY3JlZ2lvbi5zcmNPZmZzZXQueSA9IDA7CisgICAgY3JlZ2lvbi5zcmNPZmZzZXQueiA9IDA7CisgICAgY3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKyAgICBjcmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNyZWdpb24uZHN0T2Zmc2V0LnggPSAwOworICAgIGNyZWdpb24uZHN0T2Zmc2V0LnkgPSAwOworICAgIGNyZWdpb24uZHN0T2Zmc2V0LnogPSAwOworICAgIGNyZWdpb24uZXh0ZW50LndpZHRoID0gMTAwOworICAgIGNyZWdpb24uZXh0ZW50LmhlaWdodCA9IDEwMDsKKyAgICBjcmVnaW9uLmV4dGVudC5kZXB0aCA9IDE7CisgICAgY21kYnVmLkNvcHlJbWFnZShtX2RlcHRoU3RlbmNpbC0+aGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwgZGVzdEltYWdlLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLCAmY3JlZ2lvbik7CisgICAgY21kYnVmLmVuZCgpOworCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvOworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8ucE5leHQgPSBOVUxMOworICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gTlVMTDsKKyAgICBzdWJtaXRfaW5mby5wV2FpdERzdFN0YWdlTWFzayA9IE5VTEw7CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY21kYnVmLmhhbmRsZSgpOworICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEw7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBSZW5kZXJQYXNzQmVnaW5JbmxpbmVBbmRTZWNvbmRhcnlDb21tYW5kQnVmZmVycykgeworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZtX3JlbmRlclBhc3NCZWdpbkluZm8sIFZLX1NVQlBBU1NfQ09OVEVOVFNfU0VDT05EQVJZX0NPTU1BTkRfQlVGRkVSUyk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmbV9yZW5kZXJQYXNzQmVnaW5JbmZvLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgUmVuZGVyUGFzc0JlZ2luRGVwdGhTdGVuY2lsTGF5b3V0VHJhbnNpdGlvbkZyb21VbmRlZmluZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQ3JlYXRlIGEgcmVuZGVyIHBhc3Mgd2l0aCBkZXB0aC1zdGVuY2lsIGF0dGFjaG1lbnQgd2hlcmUgbGF5b3V0IHRyYW5zaXRpb24gZnJvbSBVTkRFRklORUQgVE8gRFNfUkVBRF9PTkxZX09QVElNQUwgaXMgc2V0ICIKKyAgICAgICAgImJ5IHJlbmRlciBwYXNzIGFuZCB2ZXJpZnkgdGhhdCB0cmFuc2l0aW9uIGhhcyBjb3JyZWN0bHkgb2NjdXJyZWQgYXQgcXVldWUgc3VibWl0IHRpbWUgd2l0aCBubyB2YWxpZGF0aW9uIGVycm9ycy4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgYXV0byBkZXB0aF9mb3JtYXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBpZiAoIWRlcHRoX2Zvcm1hdCkgeworICAgICAgICBwcmludGYoIiVzIE5vIERlcHRoICsgU3RlbmNpbCBmb3JtYXQgZm91bmQuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtJbWFnZUZvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUltYWdlRm9ybWF0UHJvcGVydGllcyhncHUoKSwgZGVwdGhfZm9ybWF0LCBWS19JTUFHRV9UWVBFXzJELCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCwgMCwgJmZvcm1hdF9wcm9wcyk7CisgICAgaWYgKGZvcm1hdF9wcm9wcy5tYXhFeHRlbnQud2lkdGggPCAzMiB8fCBmb3JtYXRfcHJvcHMubWF4RXh0ZW50LmhlaWdodCA8IDMyKSB7CisgICAgICAgIHByaW50ZigiJXMgRGVwdGggZXh0ZW50IHRvbyBzbWFsbCwgUmVuZGVyUGFzc0RlcHRoU3RlbmNpbExheW91dFRyYW5zaXRpb24gc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIEEgcmVuZGVycGFzcyB3aXRoIG9uZSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQuCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudCA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0FNUExFX0NPVU5UXzFfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTH07CisKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgYXR0X3JlZiA9IHswLCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUx9OworCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyLCAmYXR0X3JlZiwgMCwgbnVsbHB0cn07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDEsICZhdHRhY2htZW50LCAxLCAmc3VicGFzcywgMCwgbnVsbHB0cn07CisKKyAgICBWa1JlbmRlclBhc3MgcnA7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgbnVsbHB0ciwgJnJwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIC8vIEEgY29tcGF0aWJsZSBkcyBpbWFnZS4KKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgZGVwdGhfZm9ybWF0LCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTywKKyAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgMCwKKyAgICAgICAgaW1hZ2UuaGFuZGxlKCksCisgICAgICAgIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCwKKyAgICAgICAgZGVwdGhfZm9ybWF0LAorICAgICAgICB7VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLCBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSwKKyAgICAgICAgIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZfSwKKyAgICAgICAge1ZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQsIDAsIDEsIDAsIDF9LAorICAgIH07CisgICAgVmtJbWFnZVZpZXcgdmlldzsKKyAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJml2Y2ksIG51bGxwdHIsICZ2aWV3KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCBycCwgMSwgJnZpZXcsIDMyLCAzMiwgMX07CisgICAgVmtGcmFtZWJ1ZmZlciBmYjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZmNpLCBudWxscHRyLCAmZmIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gcnBiaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLCBudWxscHRyLCBycCwgZmIsIHt7MCwgMH0sIHszMiwgMzJ9fSwgMCwgbnVsbHB0cn07CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UXVldWVDb21tYW5kQnVmZmVyKGZhbHNlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIENsZWFudXAKKyAgICB2azo6RGVzdHJveUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIHZpZXcsIE5VTEwpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIE5VTEwpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgRGVzdHJveVBpcGVsaW5lUmVuZGVyUGFzcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkRyYXcgdXNpbmcgYSBwaXBlbGluZSB3aG9zZSBjcmVhdGUgcmVuZGVyUGFzcyBoYXMgYmVlbiBkZXN0cm95ZWQuIik7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHRoYXQncyBjb21wYXRpYmxlIHdpdGggRHJhdy10aW1lIHJlbmRlclBhc3MKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHQgPSB7fTsKKyAgICBhdHQuZm9ybWF0ID0gbV9yZW5kZXJfdGFyZ2V0X2ZtdDsKKyAgICBhdHQuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHQubG9hZE9wID0gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSOworICAgIGF0dC5zdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRTsKKyAgICBhdHQuc3RlbmNpbExvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkU7CisgICAgYXR0LnN0ZW5jaWxTdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkU7CisgICAgYXR0LmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGF0dC5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgcmVmID0ge307CisgICAgcmVmLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgcmVmLmF0dGFjaG1lbnQgPSAwOworCisgICAgbV9yZW5kZXJQYXNzQ2xlYXJWYWx1ZXMuY2xlYXIoKTsKKyAgICBWa0NsZWFyVmFsdWUgY2xlYXIgPSB7fTsKKyAgICBjbGVhci5jb2xvciA9IG1fY2xlYXJfY29sb3I7CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0ge307CisgICAgc3VicGFzcy5waXBlbGluZUJpbmRQb2ludCA9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M7CisgICAgc3VicGFzcy5mbGFncyA9IDA7CisgICAgc3VicGFzcy5pbnB1dEF0dGFjaG1lbnRDb3VudCA9IDA7CisgICAgc3VicGFzcy5wSW5wdXRBdHRhY2htZW50cyA9IE5VTEw7CisgICAgc3VicGFzcy5jb2xvckF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50cyA9ICZyZWY7CisgICAgc3VicGFzcy5wUmVzb2x2ZUF0dGFjaG1lbnRzID0gTlVMTDsKKworICAgIHN1YnBhc3MucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBOVUxMOworICAgIHN1YnBhc3MucHJlc2VydmVBdHRhY2htZW50Q291bnQgPSAwOworICAgIHN1YnBhc3MucFByZXNlcnZlQXR0YWNobWVudHMgPSBOVUxMOworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycF9pbmZvID0ge307CisgICAgcnBfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOworICAgIHJwX2luZm8uYXR0YWNobWVudENvdW50ID0gMTsKKyAgICBycF9pbmZvLnBBdHRhY2htZW50cyA9ICZhdHQ7CisgICAgcnBfaW5mby5zdWJwYXNzQ291bnQgPSAxOworICAgIHJwX2luZm8ucFN1YnBhc3NlcyA9ICZzdWJwYXNzOworCisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIGVyciA9IHZrOjpDcmVhdGVSZW5kZXJQYXNzKGRldmljZSgpLCAmcnBfaW5mbywgTlVMTCwgJnJwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworICAgIFZrVmlld3BvcnQgdmlld3BvcnQgPSB7MC4wZiwgMC4wZiwgNjQuMGYsIDY0LjBmLCAwLjBmLCAxLjBmfTsKKyAgICBtX3ZpZXdwb3J0cy5wdXNoX2JhY2sodmlld3BvcnQpOworICAgIHBpcGUuU2V0Vmlld3BvcnQobV92aWV3cG9ydHMpOworICAgIFZrUmVjdDJEIHJlY3QgPSB7ezAsIDB9LCB7NjQsIDY0fX07CisgICAgbV9zY2lzc29ycy5wdXNoX2JhY2socmVjdCk7CisgICAgcGlwZS5TZXRTY2lzc29yKG1fc2Npc3NvcnMpOworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwbChtX2RldmljZSk7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBsLmhhbmRsZSgpLCBycCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUuaGFuZGxlKCkpOworICAgIC8vIERlc3Ryb3kgcmVuZGVyUGFzcyBiZWZvcmUgcGlwZWxpbmUgaXMgdXNlZCBpbiBEcmF3CisgICAgLy8gIFdlIGRlbGF5IHVudGlsIGFmdGVyIENtZEJpbmRQaXBlbGluZSB0byB2ZXJpZnkgdGhhdCBpbnZhbGlkIGJpbmRpbmcgaXNuJ3QKKyAgICAvLyAgY3JlYXRlZCBiZXR3ZWVuIENCICYgcmVuZGVyUGFzcywgd2hpY2ggd2UgdXNlZCB0byBkby4KKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgbnVsbHB0cik7CisgICAgdms6OkNtZERyYXcobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMywgMSwgMCwgMCk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFJlc2V0UXVlcnlQb29sRnJvbURpZmZlcmVudENCKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUmVzZXQgYSBxdWVyeSBvbiBvbmUgQ0IgYW5kIHVzZSBpdCBpbiBhbm90aGVyLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBWa1F1ZXJ5UG9vbCBxdWVyeV9wb29sOworICAgIFZrUXVlcnlQb29sQ3JlYXRlSW5mbyBxdWVyeV9wb29sX2NyZWF0ZV9pbmZve307CisgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk87CisgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5xdWVyeVR5cGUgPSBWS19RVUVSWV9UWVBFX09DQ0xVU0lPTjsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5Q291bnQgPSAxOworICAgIHZrOjpDcmVhdGVRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcXVlcnlfcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnF1ZXJ5X3Bvb2wpOworCisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyWzJdOworICAgIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZve307CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kUG9vbCA9IG1fY29tbWFuZFBvb2wtPmhhbmRsZSgpOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMjsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksICZjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLCBjb21tYW5kX2J1ZmZlcik7CisKKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworCisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0sICZiZWdpbl9pbmZvKTsKKyAgICAgICAgdms6OkNtZFJlc2V0UXVlcnlQb29sKGNvbW1hbmRfYnVmZmVyWzBdLCBxdWVyeV9wb29sLCAwLCAxKTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0pOworCisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMV0sICZiZWdpbl9pbmZvKTsKKyAgICAgICAgdms6OkNtZEJlZ2luUXVlcnkoY29tbWFuZF9idWZmZXJbMV0sIHF1ZXJ5X3Bvb2wsIDAsIDApOworICAgICAgICB2azo6Q21kRW5kUXVlcnkoY29tbWFuZF9idWZmZXJbMV0sIHF1ZXJ5X3Bvb2wsIDApOworICAgICAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclsxXSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvWzJde307CisgICAgICAgIHN1Ym1pdF9pbmZvWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgIHN1Ym1pdF9pbmZvWzBdLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvWzBdLnBDb21tYW5kQnVmZmVycyA9ICZjb21tYW5kX2J1ZmZlclswXTsKKyAgICAgICAgc3VibWl0X2luZm9bMF0uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAwOworICAgICAgICBzdWJtaXRfaW5mb1swXS5wU2lnbmFsU2VtYXBob3JlcyA9IG51bGxwdHI7CisKKyAgICAgICAgc3VibWl0X2luZm9bMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgc3VibWl0X2luZm9bMV0uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm9bMV0ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyWzFdOworICAgICAgICBzdWJtaXRfaW5mb1sxXS5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgIHN1Ym1pdF9pbmZvWzFdLnBTaWduYWxTZW1hcGhvcmVzID0gbnVsbHB0cjsKKworICAgICAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDIsICZzdWJtaXRfaW5mb1swXSwgVktfTlVMTF9IQU5ETEUpOworICAgIH0KKworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIHZrOjpEZXN0cm95UXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgcXVlcnlfcG9vbCwgbnVsbHB0cik7CisgICAgdms6OkZyZWVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksIG1fY29tbWFuZFBvb2wtPmhhbmRsZSgpLCAyLCBjb21tYW5kX2J1ZmZlcik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIEJhc2ljUXVlcnkpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJVc2UgYSBjb3VwbGUgb2NjbHVzaW9uIHF1ZXJpZXMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIHVpbnQzMl90IHFmaSA9IDA7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJjaSA9IHt9OworICAgIGJjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBiY2kudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUIHwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgYmNpLnNpemUgPSA0ICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICBiY2kucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICBiY2kucFF1ZXVlRmFtaWx5SW5kaWNlcyA9ICZxZmk7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fcHJvcHMgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDsKKyAgICBidWZmZXIuaW5pdCgqbV9kZXZpY2UsIGJjaSwgbWVtX3Byb3BzKTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfaW5mbzsKKyAgICBxdWVyeV9wb29sX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgcXVlcnlfcG9vbF9pbmZvLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OOworICAgIHF1ZXJ5X3Bvb2xfaW5mby5mbGFncyA9IDA7CisgICAgcXVlcnlfcG9vbF9pbmZvLnF1ZXJ5Q291bnQgPSAyOworICAgIHF1ZXJ5X3Bvb2xfaW5mby5waXBlbGluZVN0YXRpc3RpY3MgPSAwOworCisgICAgVmtSZXN1bHQgcmVzID0gdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+aGFuZGxlKCksICZxdWVyeV9wb29sX2luZm8sIE5VTEwsICZxdWVyeV9wb29sKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhyZXMpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZFJlc2V0UXVlcnlQb29sKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgdms6OkNtZEJlZ2luUXVlcnkobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMCk7CisgICAgdms6OkNtZEVuZFF1ZXJ5KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDApOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV8pOworICAgIHZrOjpDbWRCZWdpblF1ZXJ5KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDEsIDApOworICAgIHZrOjpDbWREcmF3KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDMsIDEsIDAsIDApOworICAgIHZrOjpDbWRFbmRSZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworICAgIHZrOjpDbWRFbmRRdWVyeShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAxKTsKKyAgICB2azo6Q21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgMCwgMiwgYnVmZmVyLmhhbmRsZSgpLCAwLCBzaXplb2YodWludDY0X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19RVUVSWV9SRVNVTFRfNjRfQklUIHwgVktfUVVFUllfUkVTVUxUX1dBSVRfQklUKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgdWludDY0X3Qgc2FtcGxlc19wYXNzZWRbNF07CisgICAgcmVzID0gdms6OkdldFF1ZXJ5UG9vbFJlc3VsdHMobV9kZXZpY2UtPmhhbmRsZSgpLCBxdWVyeV9wb29sLCAwLCAyLCBzaXplb2Yoc2FtcGxlc19wYXNzZWQpLCBzYW1wbGVzX3Bhc3NlZCwgc2l6ZW9mKHVpbnQ2NF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19RVUVSWV9SRVNVTFRfNjRfQklUIHwgVktfUVVFUllfUkVTVUxUX1dBSVRfQklUKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhyZXMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIHZrOjpEZXN0cm95UXVlcnlQb29sKG1fZGV2aWNlLT5oYW5kbGUoKSwgcXVlcnlfcG9vbCwgTlVMTCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBNdWx0aXBsYW5lR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlBvc2l0aXZlIHRlc3QsIHF1ZXJ5IGxheW91dCBvZiBhIHNpbmdsZSBwbGFuZSBvZiBhIG11bHRpcGxhbmUgaW1hZ2UuIChyZXBybyBHaXRodWIgIzI1MzApIik7CisKKyAgICAvLyBFbmFibGUgS0hSIG11bHRpcGxhbmUgcmVxJ2QgZXh0ZW5zaW9ucworICAgIGJvb2wgbXBfZXh0ZW5zaW9ucyA9IEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9TUEVDX1ZFUlNJT04pOworICAgIGlmIChtcF9leHRlbnNpb25zKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKG1wX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgdGVzdCByZXF1aXJlcyBLSFIgbXVsdGlwbGFuZSBleHRlbnNpb25zLCBub3QgYXZhaWxhYmxlLiAgU2tpcHBpbmcuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgVmtJbWFnZUNyZWF0ZUluZm8gY2kgPSB7fTsKKyAgICBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGNpLnBOZXh0ID0gTlVMTDsKKyAgICBjaS5mbGFncyA9IDA7CisgICAgY2kuaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBjaS5mb3JtYXQgPSBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STV9LSFI7CisgICAgY2kuZXh0ZW50ID0gezEyOCwgMTI4LCAxfTsKKyAgICBjaS5taXBMZXZlbHMgPSAxOworICAgIGNpLmFycmF5TGF5ZXJzID0gMTsKKyAgICBjaS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGNpLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVI7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgIGNpLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBjaS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKworICAgIC8vIFZlcmlmeSBmb3JtYXQKKyAgICBib29sIHN1cHBvcnRlZCA9IEltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoaW5zdGFuY2UoKSwgZ3B1KCksIGNpLCBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUKTsKKyAgICBpZiAoIXN1cHBvcnRlZCkgeworICAgICAgICBwcmludGYoIiVzIE11bHRpcGxhbmUgaW1hZ2UgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuICBTa2lwcGluZyB0ZXN0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47ICAvLyBBc3N1bWUgdGhlcmUncyBsb3cgUk9JIG9uIHNlYXJjaGluZyBmb3IgZGlmZmVyZW50IG1wIGZvcm1hdHMKKyAgICB9CisKKyAgICBWa0ltYWdlIGltYWdlOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVJbWFnZShkZXZpY2UoKSwgJmNpLCBOVUxMLCAmaW1hZ2UpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBRdWVyeSBsYXlvdXQgb2YgM3JkIHBsYW5lCisgICAgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlcyA9IHt9OworICAgIHN1YnJlcy5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzJfQklUX0tIUjsKKyAgICBzdWJyZXMubWlwTGV2ZWwgPSAwOworICAgIHN1YnJlcy5hcnJheUxheWVyID0gMDsKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0IGxheW91dCA9IHt9OworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB2azo6R2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChkZXZpY2UoKSwgaW1hZ2UsICZzdWJyZXMsICZsYXlvdXQpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lJbWFnZShkZXZpY2UoKSwgaW1hZ2UsIE5VTEwpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgT3duZXJzaGlwVHJhbmZlcnNJbWFnZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZhbGlkIGltYWdlIG93bmVyc2hpcCB0cmFuc2ZlcnMgdGhhdCBzaG91bGRuJ3QgY3JlYXRlIGVycm9ycyIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIHVpbnQzMl90IG5vX2dmeCA9IG1fZGV2aWNlLT5RdWV1ZUZhbWlseVdpdGhvdXRDYXBhYmlsaXRpZXMoVktfUVVFVUVfR1JBUEhJQ1NfQklUKTsKKyAgICBpZiAobm9fZ2Z4ID09IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBSZXF1aXJlZCBxdWV1ZSBmYW1pbGllcyBub3QgcHJlc2VudCAobm9uLWdyYXBoaWNzIGNhcGFibGUgcmVxdWlyZWQpLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFZrUXVldWVPYmogKm5vX2dmeF9xdWV1ZSA9IG1fZGV2aWNlLT5xdWV1ZV9mYW1pbHlfcXVldWVzKG5vX2dmeClbMF0uZ2V0KCk7CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIG5vX2dmeF9wb29sKG1fZGV2aWNlLCBub19nZngsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogbm9fZ2Z4X2NiKG1fZGV2aWNlLCAmbm9fZ2Z4X3Bvb2wsIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlksIG5vX2dmeF9xdWV1ZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gImV4Y2x1c2l2ZSIgaW1hZ2Ugb3duZWQgYnkgdGhlIGdyYXBoaWNzIHF1ZXVlLgorICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIFZrRmxhZ3MgaW1hZ2VfdXNlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQ7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgaW1hZ2VfdXNlLCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgMCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisgICAgYXV0byBpbWFnZV9zdWJyZXMgPSBpbWFnZS5zdWJyZXNvdXJjZV9yYW5nZShWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAxKTsKKyAgICBhdXRvIGltYWdlX2JhcnJpZXIgPSBpbWFnZS5pbWFnZV9tZW1vcnlfYmFycmllcigwLCAwLCBpbWFnZS5MYXlvdXQoKSwgaW1hZ2UuTGF5b3V0KCksIGltYWdlX3N1YnJlcyk7CisgICAgaW1hZ2VfYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIGltYWdlX2JhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IG5vX2dmeDsKKworICAgIFZhbGlkT3duZXJzaGlwVHJhbnNmZXIobV9lcnJvck1vbml0b3IsIG1fY29tbWFuZEJ1ZmZlciwgJm5vX2dmeF9jYiwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0dSQVBISUNTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCwgbnVsbHB0ciwgJmltYWdlX2JhcnJpZXIpOworCisgICAgLy8gQ2hhbmdlIGxheW91dHMgd2hpbGUgY2hhbmdpbmcgb3duZXJzaGlwCisgICAgaW1hZ2VfYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4ID0gbm9fZ2Z4OworICAgIGltYWdlX2JhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBpbWFnZV9iYXJyaWVyLm9sZExheW91dCA9IGltYWdlLkxheW91dCgpOworICAgIC8vIE1ha2Ugc3VyZSB0aGUgbmV3IGxheW91dCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkCisgICAgaWYgKGltYWdlX2JhcnJpZXIub2xkTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwpIHsKKyAgICAgICAgaW1hZ2VfYmFycmllci5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMOworICAgIH0gZWxzZSB7CisgICAgICAgIGltYWdlX2JhcnJpZXIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICB9CisKKyAgICBWYWxpZE93bmVyc2hpcFRyYW5zZmVyKG1fZXJyb3JNb25pdG9yLCAmbm9fZ2Z4X2NiLCBtX2NvbW1hbmRCdWZmZXIsIFZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9HUkFQSElDU19CSVQsIG51bGxwdHIsICZpbWFnZV9iYXJyaWVyKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIE93bmVyc2hpcFRyYW5mZXJzQnVmZmVyKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmFsaWQgYnVmZmVyIG93bmVyc2hpcCB0cmFuc2ZlcnMgdGhhdCBzaG91bGRuJ3QgY3JlYXRlIGVycm9ycyIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQobnVsbHB0ciwgbnVsbHB0ciwgVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQpKTsKKworICAgIHVpbnQzMl90IG5vX2dmeCA9IG1fZGV2aWNlLT5RdWV1ZUZhbWlseVdpdGhvdXRDYXBhYmlsaXRpZXMoVktfUVVFVUVfR1JBUEhJQ1NfQklUKTsKKyAgICBpZiAobm9fZ2Z4ID09IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBSZXF1aXJlZCBxdWV1ZSBmYW1pbGllcyBub3QgcHJlc2VudCAobm9uLWdyYXBoaWNzIGNhcGFibGUgcmVxdWlyZWQpLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFZrUXVldWVPYmogKm5vX2dmeF9xdWV1ZSA9IG1fZGV2aWNlLT5xdWV1ZV9mYW1pbHlfcXVldWVzKG5vX2dmeClbMF0uZ2V0KCk7CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIG5vX2dmeF9wb29sKG1fZGV2aWNlLCBub19nZngsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogbm9fZ2Z4X2NiKG1fZGV2aWNlLCAmbm9fZ2Z4X3Bvb2wsIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlksIG5vX2dmeF9xdWV1ZSk7CisKKyAgICAvLyBDcmVhdGUgYSBidWZmZXIKKyAgICBjb25zdCBWa0RldmljZVNpemUgYnVmZmVyX3NpemUgPSAyNTY7CisgICAgdWludDhfdCBkYXRhW2J1ZmZlcl9zaXplXSA9IHsweEZGfTsKKyAgICBWa0NvbnN0YW50QnVmZmVyT2JqIGJ1ZmZlcihtX2RldmljZSwgYnVmZmVyX3NpemUsIGRhdGEsIFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX1RFWEVMX0JVRkZFUl9CSVQpOworICAgIEFTU0VSVF9UUlVFKGJ1ZmZlci5pbml0aWFsaXplZCgpKTsKKyAgICBhdXRvIGJ1ZmZlcl9iYXJyaWVyID0gYnVmZmVyLmJ1ZmZlcl9tZW1vcnlfYmFycmllcigwLCAwLCAwLCBWS19XSE9MRV9TSVpFKTsKKworICAgIC8vIExldCBnZnggb3duIGl0LgorICAgIGJ1ZmZlcl9iYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisgICAgYnVmZmVyX2JhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBWYWxpZE93bmVyc2hpcFRyYW5zZmVyT3AobV9lcnJvck1vbml0b3IsIG1fY29tbWFuZEJ1ZmZlciwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0dSQVBISUNTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyX2JhcnJpZXIsIG51bGxwdHIpOworCisgICAgLy8gVHJhbnNmZXIgaXQgdG8gbm9uLWdmeAorICAgIGJ1ZmZlcl9iYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBub19nZng7CisgICAgVmFsaWRPd25lcnNoaXBUcmFuc2ZlcihtX2Vycm9yTW9uaXRvciwgbV9jb21tYW5kQnVmZmVyLCAmbm9fZ2Z4X2NiLCBWS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklULCAmYnVmZmVyX2JhcnJpZXIsIG51bGxwdHIpOworCisgICAgLy8gVHJhbnNmZXIgaXQgdG8gZ2Z4CisgICAgYnVmZmVyX2JhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IG5vX2dmeDsKKyAgICBidWZmZXJfYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIFZhbGlkT3duZXJzaGlwVHJhbnNmZXIobV9lcnJvck1vbml0b3IsICZub19nZnhfY2IsIG1fY29tbWFuZEJ1ZmZlciwgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQUxMX0dSQVBISUNTX0JJVCwgJmJ1ZmZlcl9iYXJyaWVyLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIExheW91dEZyb21QcmVzZW50V2l0aG91dEFjY2Vzc01lbW9yeVJlYWQpIHsKKyAgICAvLyBUcmFuc2l0aW9uIGFuIGltYWdlIGF3YXkgZnJvbSBQUkVTRU5UX1NSQ19LSFIgd2l0aG91dCBBQ0NFU1NfTUVNT1JZX1JFQUQKKyAgICAvLyBpbiBzcmNBY2Nlc3NNYXNrLgorCisgICAgLy8gVGhlIHJlcXVpcmVkIGJlaGF2aW9yIGhlcmUgd2FzIGEgYml0IHVuY2xlYXIgaW4gZWFybGllciB2ZXJzaW9ucyBvZiB0aGUKKyAgICAvLyBzcGVjLCBidXQgdGhlcmUgaXMgbm8gbWVtb3J5IGRlcGVuZGVuY3kgcmVxdWlyZWQgaGVyZSwgc28gdGhpcyBzaG91bGQKKyAgICAvLyB3b3JrIHdpdGhvdXQgd2FybmluZ3MuCisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCAoVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKSwKKyAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGJhcnJpZXIgPSB7fTsKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSByYW5nZTsKKyAgICBiYXJyaWVyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI7CisgICAgYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUOworICAgIGJhcnJpZXIuZHN0QWNjZXNzTWFzayA9IDA7CisgICAgYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIGJhcnJpZXIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUjsKKyAgICBiYXJyaWVyLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgcmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgcmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICByYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICByYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgcmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgYmFycmllci5zdWJyZXNvdXJjZVJhbmdlID0gcmFuZ2U7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNtZGJ1ZihtX2RldmljZSwgbV9jb21tYW5kUG9vbCk7CisgICAgY21kYnVmLmJlZ2luKCk7CisgICAgY21kYnVmLlBpcGVsaW5lQmFycmllcihWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhcnJpZXIpOworICAgIGJhcnJpZXIub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUjsKKyAgICBiYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDsKKyAgICBiYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSAwOworICAgIGJhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19UUkFOU0ZFUl9XUklURV9CSVQ7CisgICAgY21kYnVmLlBpcGVsaW5lQmFycmllcihWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhcnJpZXIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDb3B5Tm9udXBkYXRlZERlc2NyaXB0b3JzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ29weSBub24tdXBkYXRlZCBkZXNjcmlwdG9ycyIpOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IHNyY19kZXNjcmlwdG9yX3NldChtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkc3RfZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvcHlfc2l6ZSA9IDI7CisgICAgVmtDb3B5RGVzY3JpcHRvclNldCBjb3B5X2RzX3VwZGF0ZVtjb3B5X3NpemVdOworICAgIG1lbXNldChjb3B5X2RzX3VwZGF0ZSwgMCwgc2l6ZW9mKGNvcHlfZHNfdXBkYXRlKSk7CisgICAgZm9yIChpID0gMDsgaSA8IGNvcHlfc2l6ZTsgaSsrKSB7CisgICAgICAgIGNvcHlfZHNfdXBkYXRlW2ldLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09QWV9ERVNDUklQVE9SX1NFVDsKKyAgICAgICAgY29weV9kc191cGRhdGVbaV0uc3JjU2V0ID0gc3JjX2Rlc2NyaXB0b3Jfc2V0LnNldF87CisgICAgICAgIGNvcHlfZHNfdXBkYXRlW2ldLnNyY0JpbmRpbmcgPSBpOworICAgICAgICBjb3B5X2RzX3VwZGF0ZVtpXS5kc3RTZXQgPSBkc3RfZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICAgICAgY29weV9kc191cGRhdGVbaV0uZHN0QmluZGluZyA9IGk7CisgICAgICAgIGNvcHlfZHNfdXBkYXRlW2ldLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgfQorICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDAsIE5VTEwsIGNvcHlfc2l6ZSwgY29weV9kc191cGRhdGUpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDb25maXJtTm9WTEVycm9yV2hlblZrQ21kQ2xlYXJBdHRhY2htZW50c0NhbGxlZEluU2Vjb25kYXJ5Q0IpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGhpcyB0ZXN0IGlzIHRvIHZlcmlmeSB0aGF0IHdoZW4gdmtDbWRDbGVhckF0dGFjaG1lbnRzIGlzIGNhbGxlZCBieSBhIHNlY29uZGFyeSBjb21tYW5kYnVmZmVyLCB0aGUgdmFsaWRhdGlvbiBsYXllcnMgZG8gIgorICAgICAgICAibm90IHRocm93IGFuIGVycm9yIGlmIHRoZSBwcmltYXJ5IGNvbW1hbmRidWZmZXIgYmVnaW5zIGEgcmVuZGVycGFzcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBzZWNvbmRhcnkgY29tbWFuZGJ1ZmZlci4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBzZWNvbmRhcnkobV9kZXZpY2UsIG1fY29tbWFuZFBvb2wsIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWSk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gaW5mbyA9IHt9OworICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBoaW5mbyA9IHt9OworICAgIGluZm8uZmxhZ3MgPSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUIHwgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfUkVOREVSX1BBU1NfQ09OVElOVUVfQklUOworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIGluZm8ucEluaGVyaXRhbmNlSW5mbyA9ICZoaW5mbzsKKyAgICBoaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk87CisgICAgaGluZm8ucE5leHQgPSBOVUxMOworICAgIGhpbmZvLnJlbmRlclBhc3MgPSByZW5kZXJQYXNzKCk7CisgICAgaGluZm8uc3VicGFzcyA9IDA7CisgICAgaGluZm8uZnJhbWVidWZmZXIgPSBtX2ZyYW1lYnVmZmVyOworICAgIGhpbmZvLm9jY2x1c2lvblF1ZXJ5RW5hYmxlID0gVktfRkFMU0U7CisgICAgaGluZm8ucXVlcnlGbGFncyA9IDA7CisgICAgaGluZm8ucGlwZWxpbmVTdGF0aXN0aWNzID0gMDsKKworICAgIHNlY29uZGFyeS5iZWdpbigmaW5mbyk7CisgICAgVmtDbGVhckF0dGFjaG1lbnQgY29sb3JfYXR0YWNobWVudDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzBdID0gMC4wOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzFdID0gMC4wOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzJdID0gMC4wOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzNdID0gMC4wOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY29sb3JBdHRhY2htZW50ID0gMDsKKyAgICBWa0NsZWFyUmVjdCBjbGVhcl9yZWN0ID0ge3t7MCwgMH0sIHsodWludDMyX3QpbV93aWR0aCwgKHVpbnQzMl90KW1faGVpZ2h0fX0sIDAsIDF9OworICAgIHZrOjpDbWRDbGVhckF0dGFjaG1lbnRzKHNlY29uZGFyeS5oYW5kbGUoKSwgMSwgJmNvbG9yX2F0dGFjaG1lbnQsIDEsICZjbGVhcl9yZWN0KTsKKyAgICBzZWNvbmRhcnkuZW5kKCk7CisgICAgLy8gTW9kaWZ5IGNsZWFyIHJlY3QgaGVyZSB0byB2ZXJpZnkgdGhhdCBpdCBkb2Vzbid0IGNhdXNlIHZhbGlkYXRpb24gZXJyb3IKKyAgICBjbGVhcl9yZWN0ID0ge3t7MCwgMH0sIHs5OTk5OTk5OSwgOTk5OTk5OTl9fSwgMCwgMH07CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmbV9yZW5kZXJQYXNzQmVnaW5JbmZvLCBWS19TVUJQQVNTX0NPTlRFTlRTX1NFQ09OREFSWV9DT01NQU5EX0JVRkZFUlMpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY29uZGFyeS5oYW5kbGUoKSk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lQ29tcGxleFR5cGVzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiU21va2UgdGVzdCBmb3IgY29tcGxleCB0eXBlcyBhY3Jvc3MgVlMvRlMgYm91bmRhcnkiKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnRlc3NlbGxhdGlvblNoYWRlcikgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRlc3NlbGxhdGlvbiBzaGFkZXJzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIHRjcyhtX2RldmljZSwgYmluZFN0YXRlVHNjU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogdGVzKG1fZGV2aWNlLCBiaW5kU3RhdGVUZXNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyBpYXNjaXtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QUklNSVRJVkVfVE9QT0xPR1lfUEFUQ0hfTElTVCwgVktfRkFMU0V9OworICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gdHNjaXtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDN9OworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuZ3BfY2lfLnBUZXNzZWxsYXRpb25TdGF0ZSA9ICZ0c2NpOworICAgIHBpcGUuZ3BfY2lfLnBJbnB1dEFzc2VtYmx5U3RhdGUgPSAmaWFzY2k7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgdGNzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCB0ZXMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgU2hhZGVyUmVsYXhlZEJsb2NrTGF5b3V0KSB7CisgICAgLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QsIG5vIGVycm9ycyBleHBlY3RlZAorICAgIC8vIFZlcmlmaWVzIHRoZSBhYmlsaXR5IHRvIHJlbGF4IGJsb2NrIGxheW91dCBydWxlcyB3aXRoIGEgc2hhZGVyIHRoYXQgcmVxdWlyZXMgdGhlbSB0byBiZSByZWxheGVkCisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgc2hhZGVyIHRoYXQgcmVxdWlyZXMgcmVsYXhlZCBibG9jayBsYXlvdXQuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIC8vIFRoZSBSZWxheGVkIEJsb2NrIExheW91dCBleHRlbnNpb24gd2FzIHByb21vdGVkIHRvIGNvcmUgaW4gMS4xLgorICAgIC8vIEdvIGFoZWFkIGFuZCBjaGVjayBmb3IgaXQgYW5kIHR1cm4gaXQgb24gaW4gY2FzZSBhIDEuMCBkZXZpY2UgaGFzIGl0LgorICAgIGlmICghRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfUkVMQVhFRF9CTE9DS19MQVlPVVRfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRoaXMgcGFzcy4gXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX1JFTEFYRURfQkxPQ0tfTEFZT1VUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9SRUxBWEVEX0JMT0NLX0xBWU9VVF9FWFRFTlNJT05fTkFNRSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICAvLyBWZXJ0ZXggc2hhZGVyIHJlcXVpcmluZyByZWxheGVkIGxheW91dC4KKyAgICAvLyBXaXRob3V0IHJlbGF4ZWQgbGF5b3V0LCB3ZSB3b3VsZCBleHBlY3QgYSBtZXNzYWdlIGxpa2U6CisgICAgLy8gIlN0cnVjdHVyZSBpZCAyIGRlY29yYXRlZCBhcyBCbG9jayBmb3IgdmFyaWFibGUgaW4gVW5pZm9ybSBzdG9yYWdlIGNsYXNzCisgICAgLy8gbXVzdCBmb2xsb3cgc3RhbmRhcmQgdW5pZm9ybSBidWZmZXIgbGF5b3V0IHJ1bGVzOiBtZW1iZXIgMSBhdCBvZmZzZXQgNCBpcyBub3QgYWxpZ25lZCB0byAxNiIKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNwdl9zb3VyY2UgPSBSIigKKyAgICAgICAgICAgICAgICAgIE9wQ2FwYWJpbGl0eSBTaGFkZXIKKyAgICAgICAgICAgICAgICAgIE9wTWVtb3J5TW9kZWwgTG9naWNhbCBHTFNMNDUwCisgICAgICAgICAgICAgICAgICBPcEVudHJ5UG9pbnQgVmVydGV4ICVtYWluICJtYWluIgorICAgICAgICAgICAgICAgICAgT3BTb3VyY2UgR0xTTCA0NTAKKyAgICAgICAgICAgICAgICAgIE9wTWVtYmVyRGVjb3JhdGUgJVMgMCBPZmZzZXQgMAorICAgICAgICAgICAgICAgICAgT3BNZW1iZXJEZWNvcmF0ZSAlUyAxIE9mZnNldCA0CisgICAgICAgICAgICAgICAgICBPcERlY29yYXRlICVTIEJsb2NrCisgICAgICAgICAgICAgICAgICBPcERlY29yYXRlICVCIERlc2NyaXB0b3JTZXQgMAorICAgICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlQiBCaW5kaW5nIDAKKyAgICAgICAgICAldm9pZCA9IE9wVHlwZVZvaWQKKyAgICAgICAgICAgICAlMyA9IE9wVHlwZUZ1bmN0aW9uICV2b2lkCisgICAgICAgICAlZmxvYXQgPSBPcFR5cGVGbG9hdCAzMgorICAgICAgICV2M2Zsb2F0ID0gT3BUeXBlVmVjdG9yICVmbG9hdCAzCisgICAgICAgICAgICAgJVMgPSBPcFR5cGVTdHJ1Y3QgJWZsb2F0ICV2M2Zsb2F0CislX3B0cl9Vbmlmb3JtX1MgPSBPcFR5cGVQb2ludGVyIFVuaWZvcm0gJVMKKyAgICAgICAgICAgICAlQiA9IE9wVmFyaWFibGUgJV9wdHJfVW5pZm9ybV9TIFVuaWZvcm0KKyAgICAgICAgICAlbWFpbiA9IE9wRnVuY3Rpb24gJXZvaWQgTm9uZSAlMworICAgICAgICAgICAgICU1ID0gT3BMYWJlbAorICAgICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgICAgIE9wRnVuY3Rpb25FbmQKKyAgICAgICAgKSI7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgc3B2X3NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgU2hhZGVyVWJvU3RkNDMwTGF5b3V0KSB7CisgICAgLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QsIG5vIGVycm9ycyBleHBlY3RlZAorICAgIC8vIFZlcmlmaWVzIHRoZSBhYmlsaXR5IHRvIHNjYWxhciBibG9jayBsYXlvdXQgcnVsZXMgd2l0aCBhIHNoYWRlciB0aGF0IHJlcXVpcmVzIHRoZW0gdG8gYmUgcmVsYXhlZAorICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHNoYWRlciB0aGF0IHJlcXVpcmVzIFVCTyBzdGQ0MzAgbGF5b3V0LiIpOworICAgIC8vIEVuYWJsZSByZXEnZCBleHRlbnNpb25zCisgICAgaWYgKCFJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRoaXMgcGFzcy4gXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICAvLyBDaGVjayBmb3IgdGhlIFVCTyBzdGFuZGFyZCBibG9jayBsYXlvdXQgZXh0ZW5zaW9uIGFuZCB0dXJuIGl0IG9uIGlmIGl0J3MgYXZhaWxhYmxlCisgICAgaWYgKCFEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRoaXMgcGFzcy4gXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9VTklGT1JNX0JVRkZFUl9TVEFOREFSRF9MQVlPVVRfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1VOSUZPUk1fQlVGRkVSX1NUQU5EQVJEX0xBWU9VVF9FWFRFTlNJT05fTkFNRSk7CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisKKyAgICBhdXRvIHVuaWZvcm1fYnVmZmVyX3N0YW5kYXJkX2xheW91dF9mZWF0dXJlcyA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlVW5pZm9ybUJ1ZmZlclN0YW5kYXJkTGF5b3V0RmVhdHVyZXNLSFI+KE5VTEwpOworICAgIHVuaWZvcm1fYnVmZmVyX3N0YW5kYXJkX2xheW91dF9mZWF0dXJlcy51bmlmb3JtQnVmZmVyU3RhbmRhcmRMYXlvdXQgPSBWS19UUlVFOworICAgIGF1dG8gcXVlcnlfZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI+KCZ1bmlmb3JtX2J1ZmZlcl9zdGFuZGFyZF9sYXlvdXRfZmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoZ3B1KCksICZxdWVyeV9mZWF0dXJlczIpOworCisgICAgYXV0byBzZXRfZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI+KCZ1bmlmb3JtX2J1ZmZlcl9zdGFuZGFyZF9sYXlvdXRfZmVhdHVyZXMpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZzZXRfZmVhdHVyZXMyKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIFZlcnRleCBzaGFkZXIgcmVxdWlyaW5nIHN0ZDQzMCBpbiBhIHVuaWZvcm0gYnVmZmVyLgorICAgIC8vIFdpdGhvdXQgdW5pZm9ybSBidWZmZXIgc3RhbmRhcmQgbGF5b3V0LCB3ZSB3b3VsZCBleHBlY3QgYSBtZXNzYWdlIGxpa2U6CisgICAgLy8gIlN0cnVjdHVyZSBpZCAzIGRlY29yYXRlZCBhcyBCbG9jayBmb3IgdmFyaWFibGUgaW4gVW5pZm9ybSBzdG9yYWdlIGNsYXNzCisgICAgLy8gbXVzdCBmb2xsb3cgc3RhbmRhcmQgdW5pZm9ybSBidWZmZXIgbGF5b3V0IHJ1bGVzOiBtZW1iZXIgMCBpcyBhbiBhcnJheQorICAgIC8vIHdpdGggc3RyaWRlIDQgbm90IHNhdGlzZnlpbmcgYWxpZ25tZW50IHRvIDE2IgorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3B2X3NvdXJjZSA9IFIiKAorICAgICAgICAgICAgICAgT3BDYXBhYmlsaXR5IFNoYWRlcgorICAgICAgICAgICAgICAgT3BNZW1vcnlNb2RlbCBMb2dpY2FsIEdMU0w0NTAKKyAgICAgICAgICAgICAgIE9wRW50cnlQb2ludCBWZXJ0ZXggJW1haW4gIm1haW4iCisgICAgICAgICAgICAgICBPcFNvdXJjZSBHTFNMIDQ2MAorICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlX2Fycl9mbG9hdF91aW50XzggQXJyYXlTdHJpZGUgNAorICAgICAgICAgICAgICAgT3BNZW1iZXJEZWNvcmF0ZSAlZm9vIDAgT2Zmc2V0IDAKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJWZvbyBCbG9jaworICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlYiBEZXNjcmlwdG9yU2V0IDAKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJWIgQmluZGluZyAwCisgICAgICAgJXZvaWQgPSBPcFR5cGVWb2lkCisgICAgICAgICAgJTMgPSBPcFR5cGVGdW5jdGlvbiAldm9pZAorICAgICAgJWZsb2F0ID0gT3BUeXBlRmxvYXQgMzIKKyAgICAgICAldWludCA9IE9wVHlwZUludCAzMiAwCisgICAgICV1aW50XzggPSBPcENvbnN0YW50ICV1aW50IDgKKyVfYXJyX2Zsb2F0X3VpbnRfOCA9IE9wVHlwZUFycmF5ICVmbG9hdCAldWludF84CisgICAgICAgICVmb28gPSBPcFR5cGVTdHJ1Y3QgJV9hcnJfZmxvYXRfdWludF84CislX3B0cl9Vbmlmb3JtX2ZvbyA9IE9wVHlwZVBvaW50ZXIgVW5pZm9ybSAlZm9vCisgICAgICAgICAgJWIgPSBPcFZhcmlhYmxlICVfcHRyX1VuaWZvcm1fZm9vIFVuaWZvcm0KKyAgICAgICAlbWFpbiA9IE9wRnVuY3Rpb24gJXZvaWQgTm9uZSAlMworICAgICAgICAgICU1ID0gT3BMYWJlbAorICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgIE9wRnVuY3Rpb25FbmQKKyAgICAgICAgKSI7CisKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IHNwdjsKKyAgICBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gbW9kdWxlX2NyZWF0ZV9pbmZvOworICAgIFZrU2hhZGVyTW9kdWxlIHNoYWRlcl9tb2R1bGU7CisgICAgbW9kdWxlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTzsKKyAgICBtb2R1bGVfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgIEFTTXRvU1BWKFNQVl9FTlZfVlVMS0FOXzFfMCwgMCwgc3B2X3NvdXJjZS5kYXRhKCksIHNwdik7CisgICAgbW9kdWxlX2NyZWF0ZV9pbmZvLnBDb2RlID0gc3B2LmRhdGEoKTsKKyAgICBtb2R1bGVfY3JlYXRlX2luZm8uY29kZVNpemUgPSBzcHYuc2l6ZSgpICogc2l6ZW9mKHVuc2lnbmVkIGludCk7CisgICAgbW9kdWxlX2NyZWF0ZV9pbmZvLmZsYWdzID0gMDsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVNoYWRlck1vZHVsZShtX2RldmljZS0+aGFuZGxlKCksICZtb2R1bGVfY3JlYXRlX2luZm8sIE5VTEwsICZzaGFkZXJfbW9kdWxlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lTaGFkZXJNb2R1bGUobV9kZXZpY2UtPmhhbmRsZSgpLCBzaGFkZXJfbW9kdWxlLCBOVUxMKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBTaGFkZXJTY2FsYXJCbG9ja0xheW91dCkgeworICAgIC8vIFRoaXMgaXMgYSBwb3NpdGl2ZSB0ZXN0LCBubyBlcnJvcnMgZXhwZWN0ZWQKKyAgICAvLyBWZXJpZmllcyB0aGUgYWJpbGl0eSB0byBzY2FsYXIgYmxvY2sgbGF5b3V0IHJ1bGVzIHdpdGggYSBzaGFkZXIgdGhhdCByZXF1aXJlcyB0aGVtIHRvIGJlIHJlbGF4ZWQKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYSBzaGFkZXIgdGhhdCByZXF1aXJlcyBzY2FsYXIgYmxvY2sgbGF5b3V0LiIpOworICAgIC8vIEVuYWJsZSByZXEnZCBleHRlbnNpb25zCisgICAgaWYgKCFJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZW5zaW9uICVzIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRoaXMgcGFzcy4gXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICAvLyBDaGVjayBmb3IgdGhlIFNjYWxhciBCbG9jayBMYXlvdXQgZXh0ZW5zaW9uIGFuZCB0dXJuIGl0IG9uIGlmIGl0J3MgYXZhaWxhYmxlCisgICAgaWYgKCFEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0aGlzIHBhc3MuIFxuIiwga1NraXBQcmVmaXgsIFZLX0VYVF9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9TQ0FMQVJfQkxPQ0tfTEFZT1VUX0VYVEVOU0lPTl9OQU1FKTsKKworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIiKTsKKworICAgIGF1dG8gc2NhbGFyX2Jsb2NrX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VTY2FsYXJCbG9ja0xheW91dEZlYXR1cmVzRVhUPihOVUxMKTsKKyAgICBzY2FsYXJfYmxvY2tfZmVhdHVyZXMuc2NhbGFyQmxvY2tMYXlvdXQgPSBWS19UUlVFOworICAgIGF1dG8gcXVlcnlfZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI+KCZzY2FsYXJfYmxvY2tfZmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczIoZ3B1KCksICZxdWVyeV9mZWF0dXJlczIpOworCisgICAgYXV0byBzZXRfZmVhdHVyZXMyID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczI+KCZzY2FsYXJfYmxvY2tfZmVhdHVyZXMpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsICZzZXRfZmVhdHVyZXMyKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIFZlcnRleCBzaGFkZXIgcmVxdWlyaW5nIHNjYWxhciBsYXlvdXQuCisgICAgLy8gV2l0aG91dCBzY2FsYXIgbGF5b3V0LCB3ZSB3b3VsZCBleHBlY3QgYSBtZXNzYWdlIGxpa2U6CisgICAgLy8gIlN0cnVjdHVyZSBpZCAyIGRlY29yYXRlZCBhcyBCbG9jayBmb3IgdmFyaWFibGUgaW4gVW5pZm9ybSBzdG9yYWdlIGNsYXNzCisgICAgLy8gbXVzdCBmb2xsb3cgc3RhbmRhcmQgdW5pZm9ybSBidWZmZXIgbGF5b3V0IHJ1bGVzOiBtZW1iZXIgMSBhdCBvZmZzZXQgNCBpcyBub3QgYWxpZ25lZCB0byAxNiIKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNwdl9zb3VyY2UgPSBSIigKKyAgICAgICAgICAgICAgICAgIE9wQ2FwYWJpbGl0eSBTaGFkZXIKKyAgICAgICAgICAgICAgICAgIE9wTWVtb3J5TW9kZWwgTG9naWNhbCBHTFNMNDUwCisgICAgICAgICAgICAgICAgICBPcEVudHJ5UG9pbnQgVmVydGV4ICVtYWluICJtYWluIgorICAgICAgICAgICAgICAgICAgT3BTb3VyY2UgR0xTTCA0NTAKKyAgICAgICAgICAgICAgICAgIE9wTWVtYmVyRGVjb3JhdGUgJVMgMCBPZmZzZXQgMAorICAgICAgICAgICAgICAgICAgT3BNZW1iZXJEZWNvcmF0ZSAlUyAxIE9mZnNldCA0CisgICAgICAgICAgICAgICAgICBPcE1lbWJlckRlY29yYXRlICVTIDIgT2Zmc2V0IDgKKyAgICAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJVMgQmxvY2sKKyAgICAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJUIgRGVzY3JpcHRvclNldCAwCisgICAgICAgICAgICAgICAgICBPcERlY29yYXRlICVCIEJpbmRpbmcgMAorICAgICAgICAgICV2b2lkID0gT3BUeXBlVm9pZAorICAgICAgICAgICAgICUzID0gT3BUeXBlRnVuY3Rpb24gJXZvaWQKKyAgICAgICAgICVmbG9hdCA9IE9wVHlwZUZsb2F0IDMyCisgICAgICAgJXYzZmxvYXQgPSBPcFR5cGVWZWN0b3IgJWZsb2F0IDMKKyAgICAgICAgICAgICAlUyA9IE9wVHlwZVN0cnVjdCAlZmxvYXQgJWZsb2F0ICV2M2Zsb2F0CislX3B0cl9Vbmlmb3JtX1MgPSBPcFR5cGVQb2ludGVyIFVuaWZvcm0gJVMKKyAgICAgICAgICAgICAlQiA9IE9wVmFyaWFibGUgJV9wdHJfVW5pZm9ybV9TIFVuaWZvcm0KKyAgICAgICAgICAlbWFpbiA9IE9wRnVuY3Rpb24gJXZvaWQgTm9uZSAlMworICAgICAgICAgICAgICU1ID0gT3BMYWJlbAorICAgICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgICAgIE9wRnVuY3Rpb25FbmQKKyAgICAgICAgKSI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBzcHZfc291cmNlLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBTcGlydkdyb3VwRGVjb3JhdGlvbnMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHNoYWRlciB2YWxpZGF0aW9uIHN1cHBvcnQgZm9yIGdyb3VwIGRlY29yYXRpb25zLiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3B2X3NvdXJjZSA9IFIiKAorICAgICAgICAgICAgICBPcENhcGFiaWxpdHkgU2hhZGVyCisgICAgICAgICAgICAgICBPcE1lbW9yeU1vZGVsIExvZ2ljYWwgR0xTTDQ1MAorICAgICAgICAgICAgICAgT3BFbnRyeVBvaW50IEdMQ29tcHV0ZSAlbWFpbiAibWFpbiIgJWdsX0dsb2JhbEludm9jYXRpb25JRAorICAgICAgICAgICAgICAgT3BFeGVjdXRpb25Nb2RlICVtYWluIExvY2FsU2l6ZSAxIDEgMQorICAgICAgICAgICAgICAgT3BTb3VyY2UgR0xTTCA0MzAKKyAgICAgICAgICAgICAgIE9wTmFtZSAlbWFpbiAibWFpbiIKKyAgICAgICAgICAgICAgIE9wTmFtZSAlZ2xfR2xvYmFsSW52b2NhdGlvbklEICJnbF9HbG9iYWxJbnZvY2F0aW9uSUQiCisgICAgICAgICAgICAgICBPcERlY29yYXRlICVnbF9HbG9iYWxJbnZvY2F0aW9uSUQgQnVpbHRJbiBHbG9iYWxJbnZvY2F0aW9uSWQKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJV9ydW50aW1lYXJyX2Zsb2F0IEFycmF5U3RyaWRlIDQKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJTQgQnVmZmVyQmxvY2sKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJTUgT2Zmc2V0IDAKKyAgICAgICAgICAlNCA9IE9wRGVjb3JhdGlvbkdyb3VwCisgICAgICAgICAgJTUgPSBPcERlY29yYXRpb25Hcm91cAorICAgICAgICAgICAgICAgT3BHcm91cERlY29yYXRlICU0ICVfc3RydWN0XzYgJV9zdHJ1Y3RfNyAlX3N0cnVjdF84ICVfc3RydWN0XzkgJV9zdHJ1Y3RfMTAgJV9zdHJ1Y3RfMTEKKyAgICAgICAgICAgICAgIE9wR3JvdXBNZW1iZXJEZWNvcmF0ZSAlNSAlX3N0cnVjdF82IDAgJV9zdHJ1Y3RfNyAwICVfc3RydWN0XzggMCAlX3N0cnVjdF85IDAgJV9zdHJ1Y3RfMTAgMCAlX3N0cnVjdF8xMSAwCisgICAgICAgICAgICAgICBPcERlY29yYXRlICUxMiBEZXNjcmlwdG9yU2V0IDAKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJTEzIERlc2NyaXB0b3JTZXQgMAorICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlMTMgTm9uV3JpdGFibGUKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJTEzIFJlc3RyaWN0CisgICAgICAgICAlMTQgPSBPcERlY29yYXRpb25Hcm91cAorICAgICAgICAgJTEyID0gT3BEZWNvcmF0aW9uR3JvdXAKKyAgICAgICAgICUxMyA9IE9wRGVjb3JhdGlvbkdyb3VwCisgICAgICAgICAgICAgICBPcEdyb3VwRGVjb3JhdGUgJTEyICUxNQorICAgICAgICAgICAgICAgT3BHcm91cERlY29yYXRlICUxMiAlMTUKKyAgICAgICAgICAgICAgIE9wR3JvdXBEZWNvcmF0ZSAlMTIgJTE1CisgICAgICAgICAgICAgICBPcERlY29yYXRlICUxNSBEZXNjcmlwdG9yU2V0IDAKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJTE1IEJpbmRpbmcgNQorICAgICAgICAgICAgICAgT3BHcm91cERlY29yYXRlICUxNCAlMTYKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJTE2IERlc2NyaXB0b3JTZXQgMAorICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlMTYgQmluZGluZyAwCisgICAgICAgICAgICAgICBPcEdyb3VwRGVjb3JhdGUgJTEyICUxNworICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlMTcgQmluZGluZyAxCisgICAgICAgICAgICAgICBPcEdyb3VwRGVjb3JhdGUgJTEzICUxOCAlMTkKKyAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJTE4IEJpbmRpbmcgMgorICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlMTkgQmluZGluZyAzCisgICAgICAgICAgICAgICBPcEdyb3VwRGVjb3JhdGUgJTE0ICUyMAorICAgICAgICAgICAgICAgT3BHcm91cERlY29yYXRlICUxMiAlMjAKKyAgICAgICAgICAgICAgIE9wR3JvdXBEZWNvcmF0ZSAlMTMgJTIwCisgICAgICAgICAgICAgICBPcERlY29yYXRlICUyMCBCaW5kaW5nIDQKKyAgICAgICAlYm9vbCA9IE9wVHlwZUJvb2wKKyAgICAgICAldm9pZCA9IE9wVHlwZVZvaWQKKyAgICAgICAgICUyMyA9IE9wVHlwZUZ1bmN0aW9uICV2b2lkCisgICAgICAgJXVpbnQgPSBPcFR5cGVJbnQgMzIgMAorICAgICAgICAlaW50ID0gT3BUeXBlSW50IDMyIDEKKyAgICAgICVmbG9hdCA9IE9wVHlwZUZsb2F0IDMyCisgICAgICV2M3VpbnQgPSBPcFR5cGVWZWN0b3IgJXVpbnQgMworICAgICV2M2Zsb2F0ID0gT3BUeXBlVmVjdG9yICVmbG9hdCAzCislX3B0cl9JbnB1dF92M3VpbnQgPSBPcFR5cGVQb2ludGVyIElucHV0ICV2M3VpbnQKKyVfcHRyX1VuaWZvcm1faW50ID0gT3BUeXBlUG9pbnRlciBVbmlmb3JtICVpbnQKKyVfcHRyX1VuaWZvcm1fZmxvYXQgPSBPcFR5cGVQb2ludGVyIFVuaWZvcm0gJWZsb2F0CislX3J1bnRpbWVhcnJfaW50ID0gT3BUeXBlUnVudGltZUFycmF5ICVpbnQKKyVfcnVudGltZWFycl9mbG9hdCA9IE9wVHlwZVJ1bnRpbWVBcnJheSAlZmxvYXQKKyVnbF9HbG9iYWxJbnZvY2F0aW9uSUQgPSBPcFZhcmlhYmxlICVfcHRyX0lucHV0X3YzdWludCBJbnB1dAorICAgICAgJWludF8wID0gT3BDb25zdGFudCAlaW50IDAKKyAgJV9zdHJ1Y3RfNiA9IE9wVHlwZVN0cnVjdCAlX3J1bnRpbWVhcnJfZmxvYXQKKyVfcHRyX1VuaWZvcm1fX3N0cnVjdF82ID0gT3BUeXBlUG9pbnRlciBVbmlmb3JtICVfc3RydWN0XzYKKyAgICAgICAgICUxNSA9IE9wVmFyaWFibGUgJV9wdHJfVW5pZm9ybV9fc3RydWN0XzYgVW5pZm9ybQorICAlX3N0cnVjdF83ID0gT3BUeXBlU3RydWN0ICVfcnVudGltZWFycl9mbG9hdAorJV9wdHJfVW5pZm9ybV9fc3RydWN0XzcgPSBPcFR5cGVQb2ludGVyIFVuaWZvcm0gJV9zdHJ1Y3RfNworICAgICAgICAgJTE2ID0gT3BWYXJpYWJsZSAlX3B0cl9Vbmlmb3JtX19zdHJ1Y3RfNyBVbmlmb3JtCisgICVfc3RydWN0XzggPSBPcFR5cGVTdHJ1Y3QgJV9ydW50aW1lYXJyX2Zsb2F0CislX3B0cl9Vbmlmb3JtX19zdHJ1Y3RfOCA9IE9wVHlwZVBvaW50ZXIgVW5pZm9ybSAlX3N0cnVjdF84CisgICAgICAgICAlMTcgPSBPcFZhcmlhYmxlICVfcHRyX1VuaWZvcm1fX3N0cnVjdF84IFVuaWZvcm0KKyAgJV9zdHJ1Y3RfOSA9IE9wVHlwZVN0cnVjdCAlX3J1bnRpbWVhcnJfZmxvYXQKKyVfcHRyX1VuaWZvcm1fX3N0cnVjdF85ID0gT3BUeXBlUG9pbnRlciBVbmlmb3JtICVfc3RydWN0XzkKKyAgICAgICAgICUxOCA9IE9wVmFyaWFibGUgJV9wdHJfVW5pZm9ybV9fc3RydWN0XzkgVW5pZm9ybQorICVfc3RydWN0XzEwID0gT3BUeXBlU3RydWN0ICVfcnVudGltZWFycl9mbG9hdAorJV9wdHJfVW5pZm9ybV9fc3RydWN0XzEwID0gT3BUeXBlUG9pbnRlciBVbmlmb3JtICVfc3RydWN0XzEwCisgICAgICAgICAlMTkgPSBPcFZhcmlhYmxlICVfcHRyX1VuaWZvcm1fX3N0cnVjdF8xMCBVbmlmb3JtCisgJV9zdHJ1Y3RfMTEgPSBPcFR5cGVTdHJ1Y3QgJV9ydW50aW1lYXJyX2Zsb2F0CislX3B0cl9Vbmlmb3JtX19zdHJ1Y3RfMTEgPSBPcFR5cGVQb2ludGVyIFVuaWZvcm0gJV9zdHJ1Y3RfMTEKKyAgICAgICAgICUyMCA9IE9wVmFyaWFibGUgJV9wdHJfVW5pZm9ybV9fc3RydWN0XzExIFVuaWZvcm0KKyAgICAgICAlbWFpbiA9IE9wRnVuY3Rpb24gJXZvaWQgTm9uZSAlMjMKKyAgICAgICAgICU0MCA9IE9wTGFiZWwKKyAgICAgICAgICU0MSA9IE9wTG9hZCAldjN1aW50ICVnbF9HbG9iYWxJbnZvY2F0aW9uSUQKKyAgICAgICAgICU0MiA9IE9wQ29tcG9zaXRlRXh0cmFjdCAldWludCAlNDEgMAorICAgICAgICAgJTQzID0gT3BBY2Nlc3NDaGFpbiAlX3B0cl9Vbmlmb3JtX2Zsb2F0ICUxNiAlaW50XzAgJTQyCisgICAgICAgICAlNDQgPSBPcEFjY2Vzc0NoYWluICVfcHRyX1VuaWZvcm1fZmxvYXQgJTE3ICVpbnRfMCAlNDIKKyAgICAgICAgICU0NSA9IE9wQWNjZXNzQ2hhaW4gJV9wdHJfVW5pZm9ybV9mbG9hdCAlMTggJWludF8wICU0MgorICAgICAgICAgJTQ2ID0gT3BBY2Nlc3NDaGFpbiAlX3B0cl9Vbmlmb3JtX2Zsb2F0ICUxOSAlaW50XzAgJTQyCisgICAgICAgICAlNDcgPSBPcEFjY2Vzc0NoYWluICVfcHRyX1VuaWZvcm1fZmxvYXQgJTIwICVpbnRfMCAlNDIKKyAgICAgICAgICU0OCA9IE9wQWNjZXNzQ2hhaW4gJV9wdHJfVW5pZm9ybV9mbG9hdCAlMTUgJWludF8wICU0MgorICAgICAgICAgJTQ5ID0gT3BMb2FkICVmbG9hdCAlNDMKKyAgICAgICAgICU1MCA9IE9wTG9hZCAlZmxvYXQgJTQ0CisgICAgICAgICAlNTEgPSBPcExvYWQgJWZsb2F0ICU0NQorICAgICAgICAgJTUyID0gT3BMb2FkICVmbG9hdCAlNDYKKyAgICAgICAgICU1MyA9IE9wTG9hZCAlZmxvYXQgJTQ3CisgICAgICAgICAlNTQgPSBPcEZBZGQgJWZsb2F0ICU0OSAlNTAKKyAgICAgICAgICU1NSA9IE9wRkFkZCAlZmxvYXQgJTU0ICU1MQorICAgICAgICAgJTU2ID0gT3BGQWRkICVmbG9hdCAlNTUgJTUyCisgICAgICAgICAlNTcgPSBPcEZBZGQgJWZsb2F0ICU1NiAlNTMKKyAgICAgICAgICAgICAgIE9wU3RvcmUgJTQ4ICU1NworICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgIE9wRnVuY3Rpb25FbmQKKykiOworCisgICAgLy8gQ3JlYXRlRGVzY3JpcHRvclNldExheW91dAorICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZHNsYls2XSA9IHt9OworICAgIHNpemVfdCBkc2xiX3NpemUgPSBzaXplKGRzbGIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZHNsYl9zaXplOyBpKyspIHsKKyAgICAgICAgZHNsYltpXS5iaW5kaW5nID0gaTsKKyAgICAgICAgZHNsYltpXS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgICAgICBkc2xiW2ldLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOworICAgICAgICBkc2xiW2ldLnBJbW11dGFibGVTYW1wbGVycyA9IE5VTEw7CisgICAgICAgIGRzbGJbaV0uc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCB8IFZLX1NIQURFUl9TVEFHRV9BTEw7CisgICAgfQorICAgIGlmIChtX2RldmljZS0+cHJvcHMubGltaXRzLm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VCdWZmZXJzIDwgZHNsYl9zaXplKSB7CisgICAgICAgIHByaW50ZigiJXNOZWVkZWQgc3RvcmFnZSBidWZmZXIgYmluZGluZ3MgZXhjZWVkcyB0aGlzIGRldmljZXMgbGltaXQuICBTa2lwcGluZyB0ZXN0cy5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENyZWF0ZUNvbXB1dGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5kc2xfYmluZGluZ3NfLnJlc2l6ZShkc2xiX3NpemUpOworICAgIG1lbWNweShwaXBlLmRzbF9iaW5kaW5nc18uZGF0YSgpLCBkc2xiLCBkc2xiX3NpemUgKiBzaXplb2YoVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZykpOworICAgIHBpcGUuY3NfLnJlc2V0KG5ldyBWa1NoYWRlck9iaihtX2RldmljZSwgYmluZFN0YXRlTWluaW1hbFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgdGhpcykpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBwaXBlLkNyZWF0ZUNvbXB1dGVQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVDaGVja1NoYWRlckNhcGFiaWxpdHlFeHRlbnNpb24xb2YyKSB7CisgICAgLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QsIG5vIGVycm9ycyBleHBlY3RlZAorICAgIC8vIFZlcmlmaWVzIHRoZSBhYmlsaXR5IHRvIGRlYWwgd2l0aCBhIHNoYWRlciB0aGF0IGRlY2xhcmVzIGEgbm9uLXVuaXF1ZSBTUElSViBjYXBhYmlsaXR5IElECisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgc2hhZGVyIGluIHdoaWNoIHVzZXMgYSBub24tdW5pcXVlIGNhcGFiaWxpdHkgSUQgZXh0ZW5zaW9uLCAxIG9mIDIiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmICghRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfU0hBREVSX1ZJRVdQT1JUX0lOREVYX0xBWUVSX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0aGlzIHBhc3MuIFxuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19FWFRfU0hBREVSX1ZJRVdQT1JUX0lOREVYX0xBWUVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9TSEFERVJfVklFV1BPUlRfSU5ERVhfTEFZRVJfRVhURU5TSU9OX05BTUUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIC8vIFRoZXNlIHRlc3RzIHJlcXVpcmUgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnQgbXVsdGlWaWV3cG9ydAorICAgIGlmICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkubXVsdGlWaWV3cG9ydCkgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpVmlld3BvcnQsIHRlc3Qgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgLy8gVmVydGV4IHNoYWRlciB1c2luZyB2aWV3cG9ydCBhcnJheSBjYXBhYmlsaXR5CisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICIjZXh0ZW5zaW9uIEdMX0FSQl9zaGFkZXJfdmlld3BvcnRfbGF5ZXJfYXJyYXkgOiBlbmFibGVcbiIKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgIiAgICBnbF9WaWV3cG9ydEluZGV4ID0gMTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUNoZWNrU2hhZGVyQ2FwYWJpbGl0eUV4dGVuc2lvbjJvZjIpIHsKKyAgICAvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdCwgbm8gZXJyb3JzIGV4cGVjdGVkCisgICAgLy8gVmVyaWZpZXMgdGhlIGFiaWxpdHkgdG8gZGVhbCB3aXRoIGEgc2hhZGVyIHRoYXQgZGVjbGFyZXMgYSBub24tdW5pcXVlIFNQSVJWIGNhcGFiaWxpdHkgSUQKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYSBzaGFkZXIgaW4gd2hpY2ggdXNlcyBhIG5vbi11bmlxdWUgY2FwYWJpbGl0eSBJRCBleHRlbnNpb24sIDIgb2YgMiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgaWYgKCFEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX05WX1ZJRVdQT1JUX0FSUkFZMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlbnNpb24gJXMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGhpcyBwYXNzLiBcbiIsIGtTa2lwUHJlZml4LCBWS19OVl9WSUVXUE9SVF9BUlJBWTJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfTlZfVklFV1BPUlRfQVJSQVkyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICAvLyBUaGVzZSB0ZXN0cyByZXF1aXJlIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0IG11bHRpVmlld3BvcnQKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLm11bHRpVmlld3BvcnQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aVZpZXdwb3J0LCB0ZXN0IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIFZlcnRleCBzaGFkZXIgdXNpbmcgdmlld3BvcnQgYXJyYXkgY2FwYWJpbGl0eQorICAgIGNoYXIgY29uc3QgKnZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9BUkJfc2hhZGVyX3ZpZXdwb3J0X2xheWVyX2FycmF5IDogZW5hYmxlXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICAgZ2xfVmlld3BvcnRJbmRleCA9IDE7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVGcmFnbWVudE91dHB1dE5vdFdyaXR0ZW5CdXRNYXNrZWQpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IG5vIGVycm9yIGlzIHByb2R1Y2VkIHdoZW4gdGhlIGZyYWdtZW50IHNoYWRlciBmYWlscyB0byBkZWNsYXJlIGFuIG91dHB1dCwgYnV0IHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQncyAiCisgICAgICAgICJ3cml0ZSBtYXNrIGlzIDAuIik7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworCisgICAgLyogc2V0IHVwIENCIDAsIG5vdCB3cml0dGVuLCBidXQgYWxzbyBtYXNrZWQgKi8KKyAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoMCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrRGVzY3JpcHRvclNldE9iaiBkZXNjcmlwdG9yU2V0KG1fZGV2aWNlKTsKKyAgICBkZXNjcmlwdG9yU2V0LkFwcGVuZER1bW15KCk7CisgICAgZGVzY3JpcHRvclNldC5DcmVhdGVWS0Rlc2NyaXB0b3JTZXQobV9jb21tYW5kQnVmZmVyKTsKKworICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShkZXNjcmlwdG9yU2V0LkdldFBpcGVsaW5lTGF5b3V0KCksIHJlbmRlclBhc3MoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFN0YXRlbGVzc1ZhbGlkYXRpb25EaXNhYmxlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiU3BlY2lmeSBhIG5vbi16ZXJvIHZhbHVlIGZvciBhIHJlc2VydmVkIHBhcmFtZXRlciB3aXRoIHN0YXRlbGVzcyB2YWxpZGF0aW9uIGRpc2FibGVkIik7CisKKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVCBkaXNhYmxlc1tdID0ge1ZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0FQSV9QQVJBTUVURVJTX0VYVH07CisgICAgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgZmVhdHVyZXMgPSB7fTsKKyAgICBmZWF0dXJlcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUOworICAgIGZlYXR1cmVzLmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCA9IDE7CisgICAgZmVhdHVyZXMucERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gZGlzYWJsZXM7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIHBvb2xfZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KG51bGxwdHIsIG51bGxwdHIsIHBvb2xfZmxhZ3MsICZmZWF0dXJlcykpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICAvLyBTcGVjaWZ5IDAgZm9yIGEgcmVzZXJ2ZWQgVmtGbGFncyBwYXJhbWV0ZXIuIE5vcm1hbGx5IHRoaXMgaXMgZXhwZWN0ZWQgdG8gdHJpZ2dlciBhbiBzdGF0ZWxlc3MgdmFsaWRhdGlvbiBlcnJvciwgYnV0IHRoaXMKKyAgICAvLyB2YWxpZGF0aW9uIHdhcyBkaXNhYmxlZCB2aWEgdGhlIGZlYXR1cmVzIGV4dGVuc2lvbiwgc28gbm8gZXJyb3JzIHNob3VsZCBiZSBmb3J0aGNvbWluZy4KKyAgICBWa0V2ZW50IGV2ZW50X2hhbmRsZSA9IFZLX05VTExfSEFORExFOworICAgIFZrRXZlbnRDcmVhdGVJbmZvIGV2ZW50X2luZm8gPSB7fTsKKyAgICBldmVudF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisgICAgZXZlbnRfaW5mby5mbGFncyA9IDE7CisgICAgdms6OkNyZWF0ZUV2ZW50KGRldmljZSgpLCAmZXZlbnRfaW5mbywgTlVMTCwgJmV2ZW50X2hhbmRsZSk7CisgICAgdms6OkRlc3Ryb3lFdmVudChkZXZpY2UoKSwgZXZlbnRfaGFuZGxlLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFBvaW50U2l6ZVdyaXRlSW5GdW5jdGlvbikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBhIHBpcGVsaW5lIHVzaW5nIFRPUE9MT0dZX1BPSU5UX0xJU1QgYW5kIHdyaXRlIFBvaW50U2l6ZSBpbiB2ZXJ0ZXggc2hhZGVyIGZ1bmN0aW9uLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworCisgICAgLy8gQ3JlYXRlIFZTIGRlY2xhcmluZyBQb2ludFNpemUgYW5kIHdyaXRlIHRvIGl0IGluIGEgZnVuY3Rpb24gY2FsbC4KKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFBvaW50U2l6ZVNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBwcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworICAgIHsKKyAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICAgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgcHMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICBwaXBlLmlhX2NpXy50b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUOworICAgICAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgICAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKyAgICB9CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBQb2ludFNpemVHZW9tU2hhZGVyU3VjY2VzcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJDcmVhdGUgYSBwaXBlbGluZSB1c2luZyBUT1BPTE9HWV9QT0lOVF9MSVNULCBzZXQgUG9pbnRTaXplIHZlcnRleCBzaGFkZXIsIGFuZCB3cml0ZSBpbiB0aGUgZmluYWwgZ2VvbWV0cnkgc3RhZ2UuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBpZiAoKCFtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKS5nZW9tZXRyeVNoYWRlcikgfHwgKCFtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKS5zaGFkZXJUZXNzZWxsYXRpb25BbmRHZW9tZXRyeVBvaW50U2l6ZSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgZ2VvbWV0cnkgc2hhZGVyIGZlYXR1cmVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworCisgICAgLy8gQ3JlYXRlIFZTIGRlY2xhcmluZyBQb2ludFNpemUgYW5kIHdyaXRpbmcgdG8gaXQKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFBvaW50U2l6ZVNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBncyhtX2RldmljZSwgYmluZFN0YXRlR2VvbVBvaW50U2l6ZVNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIHBzKG1fZGV2aWNlLCBiaW5kU3RhdGVGcmFnU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZ3MuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIHBzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICAvLyBTZXQgSW5wdXQgQXNzZW1ibHkgdG8gVE9QT0xPR1kgUE9JTlQgTElTVAorICAgIHBpcGUuaWFfY2lfLnRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BPSU5UX0xJU1Q7CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIExvb3NlUG9pbnRTaXplV3JpdGUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDcmVhdGUgYSBwaXBlbGluZSB1c2luZyBUT1BPTE9HWV9QT0lOVF9MSVNUIGFuZCB3cml0ZSBQb2ludFNpemUgb3V0c2lkZSBvZiBhIHN0cnVjdHVyZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIExvb3NlUG9pbnRTaXplV3JpdGUgPSBSIigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wQ2FwYWJpbGl0eSBTaGFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSA9IE9wRXh0SW5zdEltcG9ydCAiR0xTTC5zdGQuNDUwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BNZW1vcnlNb2RlbCBMb2dpY2FsIEdMU0w0NTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wRW50cnlQb2ludCBWZXJ0ZXggJW1haW4gIm1haW4iICVnbHBvc2l0aW9uICVnbHBvaW50c2l6ZSAlZ2xfVmVydGV4SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wU291cmNlIEdMU0wgNDUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcE5hbWUgJW1haW4gIm1haW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcE5hbWUgJXZlcnRpY2VzICJ2ZXJ0aWNlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wTmFtZSAlZ2xwb3NpdGlvbiAiZ2xwb3NpdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wTmFtZSAlZ2xwb2ludHNpemUgImdscG9pbnRzaXplIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BOYW1lICVnbF9WZXJ0ZXhJbmRleCAiZ2xfVmVydGV4SW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcERlY29yYXRlICVnbHBvc2l0aW9uIEJ1aWx0SW4gUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJWdscG9pbnRzaXplIEJ1aWx0SW4gUG9pbnRTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcERlY29yYXRlICVnbF9WZXJ0ZXhJbmRleCBCdWlsdEluIFZlcnRleEluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXZvaWQgPSBPcFR5cGVWb2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTMgPSBPcFR5cGVGdW5jdGlvbiAldm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWZsb2F0ID0gT3BUeXBlRmxvYXQgMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAldjJmbG9hdCA9IE9wVHlwZVZlY3RvciAlZmxvYXQgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV1aW50ID0gT3BUeXBlSW50IDMyIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXVpbnRfMyA9IE9wQ29uc3RhbnQgJXVpbnQgMworICAgICAgICAgICAgICAgICVfYXJyX3YyZmxvYXRfdWludF8zID0gT3BUeXBlQXJyYXkgJXYyZmxvYXQgJXVpbnRfMworICAgJV9wdHJfUHJpdmF0ZV9fYXJyX3YyZmxvYXRfdWludF8zID0gT3BUeXBlUG9pbnRlciBQcml2YXRlICVfYXJyX3YyZmxvYXRfdWludF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAldmVydGljZXMgPSBPcFZhcmlhYmxlICVfcHRyX1ByaXZhdGVfX2Fycl92MmZsb2F0X3VpbnRfMyBQcml2YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVpbnQgPSBPcFR5cGVJbnQgMzIgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWludF8wID0gT3BDb25zdGFudCAlaW50IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICVmbG9hdF9uMSA9IE9wQ29uc3RhbnQgJWZsb2F0IC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMTYgPSBPcENvbnN0YW50Q29tcG9zaXRlICV2MmZsb2F0ICVmbG9hdF9uMSAlZmxvYXRfbjEKKyAgICAgICAgICAgICAgICVfcHRyX1ByaXZhdGVfdjJmbG9hdCA9IE9wVHlwZVBvaW50ZXIgUHJpdmF0ZSAldjJmbG9hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWludF8xID0gT3BDb25zdGFudCAlaW50IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZmxvYXRfMSA9IE9wQ29uc3RhbnQgJWZsb2F0IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUyMSA9IE9wQ29uc3RhbnRDb21wb3NpdGUgJXYyZmxvYXQgJWZsb2F0XzEgJWZsb2F0X24xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlaW50XzIgPSBPcENvbnN0YW50ICVpbnQgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICVmbG9hdF8wID0gT3BDb25zdGFudCAlZmxvYXQgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTI1ID0gT3BDb25zdGFudENvbXBvc2l0ZSAldjJmbG9hdCAlZmxvYXRfMCAlZmxvYXRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICV2NGZsb2F0ID0gT3BUeXBlVmVjdG9yICVmbG9hdCA0CisgICAgICAgICAgICAlX3B0cl9PdXRwdXRfZ2xfUG9zaXRpb24gPSBPcFR5cGVQb2ludGVyIE91dHB1dCAldjRmbG9hdAorICAgICAgICAgICAgICAgICAgICAgICAgICVnbHBvc2l0aW9uID0gT3BWYXJpYWJsZSAlX3B0cl9PdXRwdXRfZ2xfUG9zaXRpb24gT3V0cHV0CisgICAgICAgICAgICVfcHRyX091dHB1dF9nbF9Qb2ludFNpemUgPSBPcFR5cGVQb2ludGVyIE91dHB1dCAlZmxvYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICVnbHBvaW50c2l6ZSA9IE9wVmFyaWFibGUgJV9wdHJfT3V0cHV0X2dsX1BvaW50U2l6ZSBPdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICVfcHRyX0lucHV0X2ludCA9IE9wVHlwZVBvaW50ZXIgSW5wdXQgJWludAorICAgICAgICAgICAgICAgICAgICAgJWdsX1ZlcnRleEluZGV4ID0gT3BWYXJpYWJsZSAlX3B0cl9JbnB1dF9pbnQgSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVpbnRfMyA9IE9wQ29uc3RhbnQgJWludCAzCisgICAgICAgICAgICAgICAgJV9wdHJfT3V0cHV0X3Y0ZmxvYXQgPSBPcFR5cGVQb2ludGVyIE91dHB1dCAldjRmbG9hdAorICAgICAgICAgICAgICAgICAgJV9wdHJfT3V0cHV0X2Zsb2F0ID0gT3BUeXBlUG9pbnRlciBPdXRwdXQgJWZsb2F0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJW1haW4gPSBPcEZ1bmN0aW9uICV2b2lkIE5vbmUgJTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlNSA9IE9wTGFiZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxOCA9IE9wQWNjZXNzQ2hhaW4gJV9wdHJfUHJpdmF0ZV92MmZsb2F0ICV2ZXJ0aWNlcyAlaW50XzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wU3RvcmUgJTE4ICUxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTIyID0gT3BBY2Nlc3NDaGFpbiAlX3B0cl9Qcml2YXRlX3YyZmxvYXQgJXZlcnRpY2VzICVpbnRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BTdG9yZSAlMjIgJTIxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMjYgPSBPcEFjY2Vzc0NoYWluICVfcHRyX1ByaXZhdGVfdjJmbG9hdCAldmVydGljZXMgJWludF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFN0b3JlICUyNiAlMjUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUzMyA9IE9wTG9hZCAlaW50ICVnbF9WZXJ0ZXhJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTM1ID0gT3BTTW9kICVpbnQgJTMzICVpbnRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTM2ID0gT3BBY2Nlc3NDaGFpbiAlX3B0cl9Qcml2YXRlX3YyZmxvYXQgJXZlcnRpY2VzICUzNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTM3ID0gT3BMb2FkICV2MmZsb2F0ICUzNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTM4ID0gT3BDb21wb3NpdGVFeHRyYWN0ICVmbG9hdCAlMzcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTM5ID0gT3BDb21wb3NpdGVFeHRyYWN0ICVmbG9hdCAlMzcgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTQwID0gT3BDb21wb3NpdGVDb25zdHJ1Y3QgJXY0ZmxvYXQgJTM4ICUzOSAlZmxvYXRfMCAlZmxvYXRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTQyID0gT3BBY2Nlc3NDaGFpbiAlX3B0cl9PdXRwdXRfdjRmbG9hdCAlZ2xwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BTdG9yZSAlNDIgJTQwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFN0b3JlICVnbHBvaW50c2l6ZSAlZmxvYXRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BSZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wRnVuY3Rpb25FbmQKKyAgICAgICAgKSI7CisKKyAgICAvLyBDcmVhdGUgVlMgZGVjbGFyaW5nIFBvaW50U2l6ZSBhbmQgd3JpdGUgdG8gaXQgaW4gYSBmdW5jdGlvbiBjYWxsLgorICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBMb29zZVBvaW50U2l6ZVdyaXRlLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogcHMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIHsKKyAgICAgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICAgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgcHMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgICAgICAvLyBTZXQgSW5wdXQgQXNzZW1ibHkgdG8gVE9QT0xPR1kgUE9JTlQgTElTVAorICAgICAgICBwaXBlLmlhX2NpXy50b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUOworICAgICAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgICAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKyAgICB9CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBVbmNvbXByZXNzZWRUb0NvbXByZXNzZWRJbWFnZUNvcHkpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJJbWFnZSBjb3BpZXMgYmV0d2VlbiBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgaW1hZ2VzIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIFZlcmlmeSBmb3JtYXQgc3VwcG9ydAorICAgIC8vIFNpemUtY29tcGF0aWJsZSAoNjQtYml0KSBmb3JtYXRzLiBVbmNvbXByZXNzZWQgaXMgNjQgYml0cyBwZXIgdGV4ZWwsIGNvbXByZXNzZWQgaXMgNjQgYml0cyBwZXIgNHg0IGJsb2NrIChvciA0YnB0KS4KKyAgICBpZiAoIUltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoZ3B1KCksIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVUlOVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVRfS0hSIHwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVF9LSFIpIHx8CisgICAgICAgICFJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGdwdSgpLCBWS19GT1JNQVRfQkMxX1JHQkFfU1JHQl9CTE9DSywgVktfSU1BR0VfVElMSU5HX09QVElNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVRfS0hSIHwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVF9LSFIpKSB7CisgICAgICAgIHByaW50ZigiJXMgUmVxdWlyZWQgZm9ybWF0cy9mZWF0dXJlcyBub3Qgc3VwcG9ydGVkIC0gVW5jb21wcmVzc2VkVG9Db21wcmVzc2VkSW1hZ2VDb3B5IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0ltYWdlT2JqIHVuY29tcF8xMHgxMHRfaW1hZ2UobV9kZXZpY2UpOyAgICAgICAvLyBTaXplID0gMTAgKiAxMCAqIDY0ID0gNjQwMAorICAgIFZrSW1hZ2VPYmogY29tcF8xMHgxMGJfNDB4NDB0X2ltYWdlKG1fZGV2aWNlKTsgIC8vIFNpemUgPSA0MCAqIDQwICogNCAgPSA2NDAwCisKKyAgICB1bmNvbXBfMTB4MTB0X2ltYWdlLkluaXQoMTAsIDEwLCAxLCBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgY29tcF8xMHgxMGJfNDB4NDB0X2ltYWdlLkluaXQoNDAsIDQwLCAxLCBWS19GT1JNQVRfQkMxX1JHQkFfU1JHQl9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworCisgICAgaWYgKCF1bmNvbXBfMTB4MTB0X2ltYWdlLmluaXRpYWxpemVkKCkgfHwgIWNvbXBfMTB4MTBiXzQweDQwdF9pbWFnZS5pbml0aWFsaXplZCgpKSB7CisgICAgICAgIHByaW50ZigiJXMgVW5hYmxlIHRvIGluaXRpYWxpemUgc3VyZmFjZXMgLSBVbmNvbXByZXNzZWRUb0NvbXByZXNzZWRJbWFnZUNvcHkgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEJvdGggY29waWVzIHJlcHJlc2VudCB0aGUgc2FtZSBudW1iZXIgb2YgYnl0ZXMuIEJ5dGVzIFBlciBUZXhlbCA9IDEgZm9yIGJjNiwgMTYgZm9yIHVuY29tcHJlc3NlZAorICAgIC8vIENvcHkgY29tcHJlc3NlZCB0byB1bmNvbXByZXNzZWQKKyAgICBWa0ltYWdlQ29weSBjb3B5X3JlZ2lvbiA9IHt9OworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQgPSB7MCwgMCwgMH07CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0ID0gezAsIDAsIDB9OworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBDb3B5IGZyb20gdW5jb21wcmVzc2VkIHRvIGNvbXByZXNzZWQKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQgPSB7MTAsIDEwLCAxfTsgIC8vIERpbWVuc2lvbnMgaW4gKHVuY29tcHJlc3NlZCkgdGV4ZWxzCisgICAgdms6OkNtZENvcHlJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCB1bmNvbXBfMTB4MTB0X2ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbXBfMTB4MTBiXzQweDQwdF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5X3JlZ2lvbik7CisKKyAgICAvLyBBbmQgZnJvbSBjb21wcmVzc2VkIHRvIHVuY29tcHJlc3NlZAorICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IHs0MCwgNDAsIDF9OyAgLy8gRGltZW5zaW9ucyBpbiAoY29tcHJlc3NlZCkgdGV4ZWxzCisgICAgdms6OkNtZENvcHlJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBjb21wXzEweDEwYl80MHg0MHRfaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICAgICAgICAgICAgICAgdW5jb21wXzEweDEwdF9pbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5X3JlZ2lvbik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgRGVsZXRlRGVzY3JpcHRvclNldExheW91dHNCZWZvcmVEZXNjcmlwdG9yU2V0cykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSBEU0xheW91dHMgYW5kIERlc2NyaXB0b3JTZXRzIGFuZCB0aGVuIGRlbGV0ZSB0aGUgRFNMYXlvdXRzIGJlZm9yZSB0aGUgRGVzY3JpcHRvclNldHMuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIFZrUmVzdWx0IGVycjsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sU2l6ZSBkc190eXBlX2NvdW50ID0ge307CisgICAgZHNfdHlwZV9jb3VudC50eXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI7CisgICAgZHNfdHlwZV9jb3VudC5kZXNjcmlwdG9yQ291bnQgPSAxOworCisgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gZHNfcG9vbF9jaSA9IHt9OworICAgIGRzX3Bvb2xfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk87CisgICAgZHNfcG9vbF9jaS5wTmV4dCA9IE5VTEw7CisgICAgZHNfcG9vbF9jaS5mbGFncyA9IFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfRlJFRV9ERVNDUklQVE9SX1NFVF9CSVQ7CisgICAgZHNfcG9vbF9jaS5tYXhTZXRzID0gMTsKKyAgICBkc19wb29sX2NpLnBvb2xTaXplQ291bnQgPSAxOworICAgIGRzX3Bvb2xfY2kucFBvb2xTaXplcyA9ICZkc190eXBlX2NvdW50OworCisgICAgVmtEZXNjcmlwdG9yUG9vbCBkc19wb29sX29uZTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmZHNfcG9vbF9jaSwgTlVMTCwgJmRzX3Bvb2xfb25lKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkc2xfYmluZGluZyA9IHt9OworICAgIGRzbF9iaW5kaW5nLmJpbmRpbmcgPSAwOworICAgIGRzbF9iaW5kaW5nLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkc2xfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0FMTDsKKyAgICBkc2xfYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgVmtEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3JTZXQ7CisgICAgeworICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogZHNfbGF5b3V0KG1fZGV2aWNlLCB7ZHNsX2JpbmRpbmd9KTsKKworICAgICAgICBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgICAgICBhbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTzsKKyAgICAgICAgYWxsb2NfaW5mby5kZXNjcmlwdG9yU2V0Q291bnQgPSAxOworICAgICAgICBhbGxvY19pbmZvLmRlc2NyaXB0b3JQb29sID0gZHNfcG9vbF9vbmU7CisgICAgICAgIGFsbG9jX2luZm8ucFNldExheW91dHMgPSAmZHNfbGF5b3V0LmhhbmRsZSgpOworICAgICAgICBlcnIgPSB2azo6QWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCAmZGVzY3JpcHRvclNldCk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgfSAgLy8gZHNfbGF5b3V0IGRlc3Ryb3llZAorICAgIGVyciA9IHZrOjpGcmVlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCBkc19wb29sX29uZSwgMSwgJmRlc2NyaXB0b3JTZXQpOworCisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yUG9vbChtX2RldmljZS0+ZGV2aWNlKCksIGRzX3Bvb2xfb25lLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENvbW1hbmRQb29sRGVsZXRlV2l0aFJlZmVyZW5jZXMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJFbnN1cmUgdGhlIHZhbGlkYXRpb24gbGF5ZXJzIGJvb2trZWVwaW5nIHRyYWNrcyB0aGUgaW1wbGljaXQgY29tbWFuZCBidWZmZXIgZnJlZXMuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIGNtZF9wb29sX2luZm8gPSB7fTsKKyAgICBjbWRfcG9vbF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPOworICAgIGNtZF9wb29sX2luZm8ucE5leHQgPSBOVUxMOworICAgIGNtZF9wb29sX2luZm8ucXVldWVGYW1pbHlJbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBjbWRfcG9vbF9pbmZvLmZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ7CisgICAgY21kX3Bvb2xfaW5mby5mbGFncyA9IDA7CisKKyAgICBWa0NvbW1hbmRQb29sIHNlY29uZGFyeV9jbWRfcG9vbDsKKyAgICBWa1Jlc3VsdCByZXMgPSB2azo6Q3JlYXRlQ29tbWFuZFBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCAmY21kX3Bvb2xfaW5mbywgTlVMTCwgJnNlY29uZGFyeV9jbWRfcG9vbCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MocmVzKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjbWRhbGxvYyA9IHZrX3Rlc3Rpbmc6OkNvbW1hbmRCdWZmZXI6OmNyZWF0ZV9pbmZvKHNlY29uZGFyeV9jbWRfcG9vbCk7CisgICAgY21kYWxsb2MubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgc2Vjb25kYXJ5X2NtZHM7CisgICAgcmVzID0gdms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmhhbmRsZSgpLCAmY21kYWxsb2MsICZzZWNvbmRhcnlfY21kcyk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY21kX2J1Zl9pbmhlcml0YW5jZV9pbmZvID0ge307CisgICAgY21kX2J1Zl9pbmhlcml0YW5jZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfSU5IRVJJVEFOQ0VfSU5GTzsKKyAgICBjbWRfYnVmX2luaGVyaXRhbmNlX2luZm8ucE5leHQgPSBOVUxMOworICAgIGNtZF9idWZfaW5oZXJpdGFuY2VfaW5mby5yZW5kZXJQYXNzID0gVktfTlVMTF9IQU5ETEU7CisgICAgY21kX2J1Zl9pbmhlcml0YW5jZV9pbmZvLnN1YnBhc3MgPSAwOworICAgIGNtZF9idWZfaW5oZXJpdGFuY2VfaW5mby5mcmFtZWJ1ZmZlciA9IFZLX05VTExfSEFORExFOworICAgIGNtZF9idWZfaW5oZXJpdGFuY2VfaW5mby5vY2NsdXNpb25RdWVyeUVuYWJsZSA9IFZLX0ZBTFNFOworICAgIGNtZF9idWZfaW5oZXJpdGFuY2VfaW5mby5xdWVyeUZsYWdzID0gMDsKKyAgICBjbWRfYnVmX2luaGVyaXRhbmNlX2luZm8ucGlwZWxpbmVTdGF0aXN0aWNzID0gMDsKKworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBzZWNvbmRhcnlfYmVnaW4gPSB7fTsKKyAgICBzZWNvbmRhcnlfYmVnaW4uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIHNlY29uZGFyeV9iZWdpbi5wTmV4dCA9IE5VTEw7CisgICAgc2Vjb25kYXJ5X2JlZ2luLmZsYWdzID0gVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfT05FX1RJTUVfU1VCTUlUX0JJVDsKKyAgICBzZWNvbmRhcnlfYmVnaW4ucEluaGVyaXRhbmNlSW5mbyA9ICZjbWRfYnVmX2luaGVyaXRhbmNlX2luZm87CisKKyAgICByZXMgPSB2azo6QmVnaW5Db21tYW5kQnVmZmVyKHNlY29uZGFyeV9jbWRzLCAmc2Vjb25kYXJ5X2JlZ2luKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhyZXMpOworICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKHNlY29uZGFyeV9jbWRzKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kRXhlY3V0ZUNvbW1hbmRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDEsICZzZWNvbmRhcnlfY21kcyk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIC8vIERlc3Ryb3lDb21tYW5kUG9vbCAqaW1wbGljaXRseSogZnJlZXMgdGhlIGNvbW1hbmQgYnVmZmVycyBhbGxvY2F0ZWQgZnJvbSBpdAorICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmhhbmRsZSgpLCBzZWNvbmRhcnlfY21kX3Bvb2wsIE5VTEwpOworICAgIC8vIElmIGJvb2trZWVwaW5nIGhhcyBiZWVuIGxheCwgdmFsaWRhdGluZyB0aGUgcmVzZXQgd2lsbCBhdHRlbXB0IHRvIHRvdWNoIGRlbGV0ZWQgZGF0YQorICAgIHJlcyA9IHZrOjpSZXNldENvbW1hbmRQb29sKG1fZGV2aWNlLT5oYW5kbGUoKSwgbV9jb21tYW5kUG9vbC0+aGFuZGxlKCksIDApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHJlcyk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBTZWNvbmRhcnlDb21tYW5kQnVmZmVyQ2xlYXJDb2xvckF0dGFjaG1lbnRzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgc2Vjb25kYXJ5IGNvbW1hbmQgYnVmZmVyIGFuZCByZWNvcmQgYSBDbWRDbGVhckF0dGFjaG1lbnRzIGNhbGwgaW50byBpdCIpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8gPSB7fTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRQb29sID0gbV9jb21tYW5kUG9vbC0+aGFuZGxlKCk7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1NFQ09OREFSWTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgc2Vjb25kYXJ5X2NvbW1hbmRfYnVmZmVyOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8sICZzZWNvbmRhcnlfY29tbWFuZF9idWZmZXIpKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29tbWFuZF9idWZmZXJfYmVnaW5faW5mbyA9IHt9OworICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBjb21tYW5kX2J1ZmZlcl9pbmhlcml0YW5jZV9pbmZvID0ge307CisgICAgY29tbWFuZF9idWZmZXJfaW5oZXJpdGFuY2VfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk87CisgICAgY29tbWFuZF9idWZmZXJfaW5oZXJpdGFuY2VfaW5mby5yZW5kZXJQYXNzID0gbV9yZW5kZXJQYXNzOworICAgIGNvbW1hbmRfYnVmZmVyX2luaGVyaXRhbmNlX2luZm8uZnJhbWVidWZmZXIgPSBtX2ZyYW1lYnVmZmVyOworCisgICAgY29tbWFuZF9idWZmZXJfYmVnaW5faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgY29tbWFuZF9idWZmZXJfYmVnaW5faW5mby5mbGFncyA9CisgICAgICAgIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQgfCBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9SRU5ERVJfUEFTU19DT05USU5VRV9CSVQ7CisgICAgY29tbWFuZF9idWZmZXJfYmVnaW5faW5mby5wSW5oZXJpdGFuY2VJbmZvID0gJmNvbW1hbmRfYnVmZmVyX2luaGVyaXRhbmNlX2luZm87CisKKyAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKHNlY29uZGFyeV9jb21tYW5kX2J1ZmZlciwgJmNvbW1hbmRfYnVmZmVyX2JlZ2luX2luZm8pOworICAgIFZrQ2xlYXJBdHRhY2htZW50IGNvbG9yX2F0dGFjaG1lbnQ7CisgICAgY29sb3JfYXR0YWNobWVudC5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlswXSA9IDA7CisgICAgY29sb3JfYXR0YWNobWVudC5jbGVhclZhbHVlLmNvbG9yLmZsb2F0MzJbMV0gPSAwOworICAgIGNvbG9yX2F0dGFjaG1lbnQuY2xlYXJWYWx1ZS5jb2xvci5mbG9hdDMyWzJdID0gMDsKKyAgICBjb2xvcl9hdHRhY2htZW50LmNsZWFyVmFsdWUuY29sb3IuZmxvYXQzMlszXSA9IDA7CisgICAgY29sb3JfYXR0YWNobWVudC5jb2xvckF0dGFjaG1lbnQgPSAwOworICAgIFZrQ2xlYXJSZWN0IGNsZWFyX3JlY3QgPSB7e3swLCAwfSwgezMyLCAzMn19LCAwLCAxfTsKKyAgICB2azo6Q21kQ2xlYXJBdHRhY2htZW50cyhzZWNvbmRhcnlfY29tbWFuZF9idWZmZXIsIDEsICZjb2xvcl9hdHRhY2htZW50LCAxLCAmY2xlYXJfcmVjdCk7CisgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoc2Vjb25kYXJ5X2NvbW1hbmRfYnVmZmVyKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmbV9yZW5kZXJQYXNzQmVnaW5JbmZvLCBWS19TVUJQQVNTX0NPTlRFTlRTX1NFQ09OREFSWV9DT01NQU5EX0JVRkZFUlMpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgJnNlY29uZGFyeV9jb21tYW5kX2J1ZmZlcik7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFNlY29uZGFyeUNvbW1hbmRCdWZmZXJJbWFnZUxheW91dFRyYW5zaXRpb25zKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUGVyZm9ybSBhbiBpbWFnZSBsYXlvdXQgdHJhbnNpdGlvbiBpbiBhIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciBmb2xsb3dlZCBieSBhIHRyYW5zaXRpb24gaW4gdGhlIHByaW1hcnkuIik7CisgICAgVmtSZXN1bHQgZXJyOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBhdXRvIGRlcHRoX2Zvcm1hdCA9IEZpbmRTdXBwb3J0ZWREZXB0aFN0ZW5jaWxGb3JtYXQoZ3B1KCkpOworICAgIGlmICghZGVwdGhfZm9ybWF0KSB7CisgICAgICAgIHByaW50ZigiJXMgQ291bGRuJ3QgZmluZCBkZXB0aCBzdGVuY2lsIGZvcm1hdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIC8vIEFsbG9jYXRlIGEgc2Vjb25kYXJ5IGFuZCBwcmltYXJ5IGNtZCBidWZmZXIKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbyA9IHt9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBtX2NvbW1hbmRQb29sLT5oYW5kbGUoKTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfU0VDT05EQVJZOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBzZWNvbmRhcnlfY29tbWFuZF9idWZmZXI7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCAmY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbywgJnNlY29uZGFyeV9jb21tYW5kX2J1ZmZlcikpOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8ubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworICAgIFZrQ29tbWFuZEJ1ZmZlciBwcmltYXJ5X2NvbW1hbmRfYnVmZmVyOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8sICZwcmltYXJ5X2NvbW1hbmRfYnVmZmVyKSk7CisgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNvbW1hbmRfYnVmZmVyX2JlZ2luX2luZm8gPSB7fTsKKyAgICBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gY29tbWFuZF9idWZmZXJfaW5oZXJpdGFuY2VfaW5mbyA9IHt9OworICAgIGNvbW1hbmRfYnVmZmVyX2luaGVyaXRhbmNlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9JTkhFUklUQU5DRV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2JlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2JlZ2luX2luZm8uZmxhZ3MgPSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUOworICAgIGNvbW1hbmRfYnVmZmVyX2JlZ2luX2luZm8ucEluaGVyaXRhbmNlSW5mbyA9ICZjb21tYW5kX2J1ZmZlcl9pbmhlcml0YW5jZV9pbmZvOworCisgICAgZXJyID0gdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihzZWNvbmRhcnlfY29tbWFuZF9idWZmZXIsICZjb21tYW5kX2J1ZmZlcl9iZWdpbl9pbmZvKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLkluaXQoMTI4LCAxMjgsIDEsIGRlcHRoX2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltZ19iYXJyaWVyID0ge307CisgICAgaW1nX2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUjsKKyAgICBpbWdfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUOworICAgIGltZ19iYXJyaWVyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUOworICAgIGltZ19iYXJyaWVyLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgaW1nX2JhcnJpZXIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIGltZ19iYXJyaWVyLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaW1nX2JhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihzZWNvbmRhcnlfY29tbWFuZF9idWZmZXIsIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCwgMCwgMCwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG51bGxwdHIsIDEsICZpbWdfYmFycmllcik7CisgICAgZXJyID0gdms6OkVuZENvbW1hbmRCdWZmZXIoc2Vjb25kYXJ5X2NvbW1hbmRfYnVmZmVyKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gTm93IHVwZGF0ZSBwcmltYXJ5IGNtZCBidWZmZXIgdG8gZXhlY3V0ZSBzZWNvbmRhcnkgYW5kIHRyYW5zaXRpb25zIGltYWdlCisgICAgY29tbWFuZF9idWZmZXJfYmVnaW5faW5mby5wSW5oZXJpdGFuY2VJbmZvID0gbnVsbHB0cjsKKyAgICBlcnIgPSB2azo6QmVnaW5Db21tYW5kQnVmZmVyKHByaW1hcnlfY29tbWFuZF9idWZmZXIsICZjb21tYW5kX2J1ZmZlcl9iZWdpbl9pbmZvKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIHZrOjpDbWRFeGVjdXRlQ29tbWFuZHMocHJpbWFyeV9jb21tYW5kX2J1ZmZlciwgMSwgJnNlY29uZGFyeV9jb21tYW5kX2J1ZmZlcik7CisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIyID0ge307CisgICAgaW1nX2JhcnJpZXIyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVI7CisgICAgaW1nX2JhcnJpZXIyLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfSE9TVF9XUklURV9CSVQ7CisgICAgaW1nX2JhcnJpZXIyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUOworICAgIGltZ19iYXJyaWVyMi5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXIyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBpbWdfYmFycmllcjIuaW1hZ2UgPSBpbWFnZS5oYW5kbGUoKTsKKyAgICBpbWdfYmFycmllcjIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyMi5kc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIyLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgaW1nX2JhcnJpZXIyLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGltZ19iYXJyaWVyMi5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1nX2JhcnJpZXIyLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1nX2JhcnJpZXIyLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihwcmltYXJ5X2NvbW1hbmRfYnVmZmVyLCBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQsIDAsIDAsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIyKTsKKyAgICBlcnIgPSB2azo6RW5kQ29tbWFuZEJ1ZmZlcihwcmltYXJ5X2NvbW1hbmRfYnVmZmVyKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmcHJpbWFyeV9jb21tYW5kX2J1ZmZlcjsKKyAgICBlcnIgPSB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgZXJyID0gdms6OkRldmljZVdhaXRJZGxlKG1fZGV2aWNlLT5kZXZpY2UoKSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB2azo6RnJlZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9jb21tYW5kUG9vbC0+aGFuZGxlKCksIDEsICZzZWNvbmRhcnlfY29tbWFuZF9idWZmZXIpOworICAgIHZrOjpGcmVlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCBtX2NvbW1hbmRQb29sLT5oYW5kbGUoKSwgMSwgJnByaW1hcnlfY29tbWFuZF9idWZmZXIpOworfQorCisvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdC4gTm8gZmFpbHVyZXMgYXJlIGV4cGVjdGVkLgorVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIElnbm9yZVVucmVsYXRlZERlc2NyaXB0b3IpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiRW5zdXJlIHRoYXQgdGhlIHZrVXBkYXRlRGVzY3JpcHRvclNldHMgdmFsaWRhdGlvbiBjb2RlIGlzIGlnbm9yaW5nIFZrV3JpdGVEZXNjcmlwdG9yU2V0IG1lbWJlcnMgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gIgorICAgICAgICAidGhlIGRlc2NyaXB0b3IgdHlwZSBzcGVjaWZpZWQgYnkgVmtXcml0ZURlc2NyaXB0b3JTZXQ6OmRlc2NyaXB0b3JUeXBlLiAgQ29ycmVjdCB2YWxpZGF0aW9uIGJlaGF2aW9yIHdpbGwgcmVzdWx0IGluIHRoZSAiCisgICAgICAgICJ0ZXN0IHJ1bm5pbmcgdG8gY29tcGxldGlvbiB3aXRob3V0IHZhbGlkYXRpb24gZXJyb3JzLiIpOworCisgICAgY29uc3QgdWludHB0cl90IGludmFsaWRfcHRyID0gMHhjZGNkY2RjZDsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICAvLyBWZXJpZnkgVktfRk9STUFUX1I4X1VOT1JNIHN1cHBvcnRzIFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQKKyAgICBjb25zdCBWa0Zvcm1hdCBmb3JtYXRfdGV4ZWxfY2FzZSA9IFZLX0ZPUk1BVF9SOF9VTk9STTsKKyAgICBjb25zdCBjaGFyICpmb3JtYXRfdGV4ZWxfY2FzZV9zdHJpbmcgPSAiVktfRk9STUFUX1I4X1VOT1JNIjsKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BlcnRpZXM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhncHUoKSwgZm9ybWF0X3RleGVsX2Nhc2UsICZmb3JtYXRfcHJvcGVydGllcyk7CisgICAgaWYgKCEoZm9ybWF0X3Byb3BlcnRpZXMuYnVmZmVyRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQpKSB7CisgICAgICAgIHByaW50ZigiJXMgVGVzdCByZXF1aXJlcyAlcyB0byBzdXBwb3J0IFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVRcbiIsIGtTa2lwUHJlZml4LCBmb3JtYXRfdGV4ZWxfY2FzZV9zdHJpbmcpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW1hZ2UgQ2FzZQorICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgICAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICAgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKworICAgICAgICBWa0ltYWdlVmlldyB2aWV3ID0gaW1hZ2UudGFyZ2V0VmlldyhWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0pOworCisgICAgICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIFZrRGVzY3JpcHRvckltYWdlSW5mbyBpbWFnZV9pbmZvID0ge307CisgICAgICAgIGltYWdlX2luZm8uaW1hZ2VWaWV3ID0gdmlldzsKKyAgICAgICAgaW1hZ2VfaW5mby5pbWFnZUxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw7CisKKyAgICAgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZTsKKyAgICAgICAgbWVtc2V0KCZkZXNjcmlwdG9yX3dyaXRlLCAwLCBzaXplb2YoZGVzY3JpcHRvcl93cml0ZSkpOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9ICZpbWFnZV9pbmZvOworCisgICAgICAgIC8vIFNldCBwQnVmZmVySW5mbyBhbmQgcFRleGVsQnVmZmVyVmlldyB0byBpbnZhbGlkIHZhbHVlcywgd2hpY2ggc2hvdWxkCisgICAgICAgIC8vIGJlCisgICAgICAgIC8vICBpZ25vcmVkIGZvciBkZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRS4KKyAgICAgICAgLy8gVGhpcyB3aWxsIG1vc3QgbGlrZWx5IHByb2R1Y2UgYSBjcmFzaCBpZiB0aGUgcGFyYW1ldGVyX3ZhbGlkYXRpb24KKyAgICAgICAgLy8gbGF5ZXIKKyAgICAgICAgLy8gZG9lcyBub3QgY29ycmVjdGx5IGlnbm9yZSBwQnVmZmVySW5mby4KKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5wQnVmZmVySW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyAqPihpbnZhbGlkX3B0cik7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUucFRleGVsQnVmZmVyVmlldyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtCdWZmZXJWaWV3ICo+KGludmFsaWRfcHRyKTsKKworICAgICAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZSwgMCwgTlVMTCk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgfQorCisgICAgLy8gQnVmZmVyIENhc2UKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICAgICAgdWludDMyX3QgcXVldWVfZmFtaWx5X2luZGV4ID0gMDsKKyAgICAgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHt9OworICAgICAgICBidWZmZXJfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gMTAyNDsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnF1ZXVlX2ZhbWlseV9pbmRleDsKKworICAgICAgICBWa0J1ZmZlck9iaiBidWZmZXI7CisgICAgICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZmVyX2NyZWF0ZV9pbmZvKTsKKworICAgICAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmZXJfaW5mbyA9IHt9OworICAgICAgICBidWZmZXJfaW5mby5idWZmZXIgPSBidWZmZXIuaGFuZGxlKCk7CisgICAgICAgIGJ1ZmZlcl9pbmZvLm9mZnNldCA9IDA7CisgICAgICAgIGJ1ZmZlcl9pbmZvLnJhbmdlID0gMTAyNDsKKworICAgICAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlOworICAgICAgICBtZW1zZXQoJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIHNpemVvZihkZXNjcmlwdG9yX3dyaXRlKSk7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RTZXQgPSBkZXNjcmlwdG9yX3NldC5zZXRfOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAwOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSAmYnVmZmVyX2luZm87CisKKyAgICAgICAgLy8gU2V0IHBJbWFnZUluZm8gYW5kIHBUZXhlbEJ1ZmZlclZpZXcgdG8gaW52YWxpZCB2YWx1ZXMsIHdoaWNoIHNob3VsZAorICAgICAgICAvLyBiZQorICAgICAgICAvLyAgaWdub3JlZCBmb3IgZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLgorICAgICAgICAvLyBUaGlzIHdpbGwgbW9zdCBsaWtlbHkgcHJvZHVjZSBhIGNyYXNoIGlmIHRoZSBwYXJhbWV0ZXJfdmFsaWRhdGlvbgorICAgICAgICAvLyBsYXllcgorICAgICAgICAvLyBkb2VzIG5vdCBjb3JyZWN0bHkgaWdub3JlIHBJbWFnZUluZm8uCisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvICo+KGludmFsaWRfcHRyKTsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5wVGV4ZWxCdWZmZXJWaWV3ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa0J1ZmZlclZpZXcgKj4oaW52YWxpZF9wdHIpOworCisgICAgICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICB9CisKKyAgICAvLyBUZXhlbCBCdWZmZXIgQ2FzZQorICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgICAgICB1aW50MzJfdCBxdWV1ZV9mYW1pbHlfaW5kZXggPSAwOworICAgICAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNpemUgPSAxMDI0OworICAgICAgICBidWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUOworICAgICAgICBidWZmZXJfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICAgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSAmcXVldWVfZmFtaWx5X2luZGV4OworCisgICAgICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICAgICAgYnVmZmVyLmluaXQoKm1fZGV2aWNlLCBidWZmZXJfY3JlYXRlX2luZm8pOworCisgICAgICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gYnVmZl92aWV3X2NpID0ge307CisgICAgICAgIGJ1ZmZfdmlld19jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9WSUVXX0NSRUFURV9JTkZPOworICAgICAgICBidWZmX3ZpZXdfY2kuYnVmZmVyID0gYnVmZmVyLmhhbmRsZSgpOworICAgICAgICBidWZmX3ZpZXdfY2kuZm9ybWF0ID0gZm9ybWF0X3RleGVsX2Nhc2U7CisgICAgICAgIGJ1ZmZfdmlld19jaS5yYW5nZSA9IFZLX1dIT0xFX1NJWkU7CisgICAgICAgIFZrQnVmZmVyVmlldyBidWZmZXJfdmlldzsKKyAgICAgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlclZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmYnVmZl92aWV3X2NpLCBOVUxMLCAmYnVmZmVyX3ZpZXcpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICBPbmVPZmZEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0KG1fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZTsKKyAgICAgICAgbWVtc2V0KCZkZXNjcmlwdG9yX3dyaXRlLCAwLCBzaXplb2YoZGVzY3JpcHRvcl93cml0ZSkpOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kc3RCaW5kaW5nID0gMDsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSOworICAgICAgICBkZXNjcmlwdG9yX3dyaXRlLnBUZXhlbEJ1ZmZlclZpZXcgPSAmYnVmZmVyX3ZpZXc7CisKKyAgICAgICAgLy8gU2V0IHBJbWFnZUluZm8gYW5kIHBCdWZmZXJJbmZvIHRvIGludmFsaWQgdmFsdWVzLCB3aGljaCBzaG91bGQgYmUKKyAgICAgICAgLy8gIGlnbm9yZWQgZm9yIGRlc2NyaXB0b3JUeXBlID09CisgICAgICAgIC8vICBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVIuCisgICAgICAgIC8vIFRoaXMgd2lsbCBtb3N0IGxpa2VseSBwcm9kdWNlIGEgY3Jhc2ggaWYgdGhlIHBhcmFtZXRlcl92YWxpZGF0aW9uCisgICAgICAgIC8vIGxheWVyCisgICAgICAgIC8vIGRvZXMgbm90IGNvcnJlY3RseSBpZ25vcmUgcEltYWdlSW5mbyBhbmQgcEJ1ZmZlckluZm8uCisgICAgICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvICo+KGludmFsaWRfcHRyKTsKKyAgICAgICAgZGVzY3JpcHRvcl93cml0ZS5wQnVmZmVySW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyAqPihpbnZhbGlkX3B0cik7CisKKyAgICAgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIE5VTEwpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIHZrOjpEZXN0cm95QnVmZmVyVmlldyhtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlcl92aWV3LCBOVUxMKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBJbW11dGFibGVTYW1wbGVyT25seURlc2NyaXB0b3IpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJCaW5kIGEgRGVzY3JpcHRvclNldCB3aXRoIG9ubHkgYW4gaW1tdXRhYmxlIHNhbXBsZXIgYW5kIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHdhcm4gZm9yIG5vIHVwZGF0ZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIFZrU2FtcGxlckNyZWF0ZUluZm8gc2FtcGxlcl9jaSA9IFNhZmVTYW5lU2FtcGxlckNyZWF0ZUluZm8oKTsKKyAgICBWa1NhbXBsZXIgc2FtcGxlcjsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksICZzYW1wbGVyX2NpLCBOVUxMLCAmc2FtcGxlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRlc2NyaXB0b3Jfc2V0LmxheW91dF99KTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldC5zZXRfLCAwLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIsIE5VTEwpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QuIE5vIGZhaWx1cmVzIGFyZSBleHBlY3RlZC4KK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBFbXB0eURlc2NyaXB0b3JVcGRhdGVUZXN0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVXBkYXRlIGxhc3QgZGVzY3JpcHRvciBpbiBhIHNldCB0aGF0IGluY2x1ZGVzIGFuIGVtcHR5IGJpbmRpbmciKTsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICAvLyBDcmVhdGUgbGF5b3V0IHdpdGggdHdvIHVuaWZvcm0gYnVmZmVyIGRlc2NyaXB0b3JzIHcvIGVtcHR5IGJpbmRpbmcgYmV0d2VlbiB0aGVtCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkcyhtX2RldmljZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQUxMLCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMCAvKiEqLywgMCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9BTEwsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgLy8gQ3JlYXRlIGEgYnVmZmVyIHRvIGJlIHVzZWQgZm9yIHVwZGF0ZQorICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmX2NpID0ge307CisgICAgYnVmZl9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZmX2NpLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICBidWZmX2NpLnNpemUgPSAyNTY7CisgICAgYnVmZl9jaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgVmtCdWZmZXIgYnVmZmVyOworICAgIGVyciA9IHZrOjpDcmVhdGVCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmYnVmZl9jaSwgTlVMTCwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAvLyBIYXZlIHRvIGJpbmQgbWVtb3J5IHRvIGJ1ZmZlciBiZWZvcmUgZGVzY3JpcHRvciB1cGRhdGUKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1fYWxsb2MgPSB7fTsKKyAgICBtZW1fYWxsb2Muc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICBtZW1fYWxsb2MucE5leHQgPSBOVUxMOworICAgIG1lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IDUxMjsgIC8vIG9uZSBhbGxvY2F0aW9uIGZvciBib3RoIGJ1ZmZlcnMKKyAgICBtZW1fYWxsb2MubWVtb3J5VHlwZUluZGV4ID0gMDsKKworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsICZtZW1fcmVxcyk7CisgICAgYm9vbCBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJm1lbV9hbGxvYywgMCk7CisgICAgaWYgKCFwYXNzKSB7CisgICAgICAgIHByaW50ZigiJXMgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgdms6OkRlc3Ryb3lCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsIE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIE1ha2Ugc3VyZSBhbGxvY2F0aW9uIGlzIHN1ZmZpY2llbnRseSBsYXJnZSB0byBhY2NvbW1vZGF0ZSBidWZmZXIgcmVxdWlyZW1lbnRzCisgICAgaWYgKG1lbV9yZXFzLnNpemUgPiBtZW1fYWxsb2MuYWxsb2NhdGlvblNpemUpIHsKKyAgICAgICAgbWVtX2FsbG9jLmFsbG9jYXRpb25TaXplID0gbWVtX3JlcXMuc2l6ZTsKKyAgICB9CisKKyAgICBWa0RldmljZU1lbW9yeSBtZW07CisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1lbV9hbGxvYywgTlVMTCwgJm1lbSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBlcnIgPSB2azo6QmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgbWVtLCAwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gT25seSB1cGRhdGUgdGhlIGRlc2NyaXB0b3IgYXQgYmluZGluZyAyCisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmX2luZm8gPSB7fTsKKyAgICBidWZmX2luZm8uYnVmZmVyID0gYnVmZmVyOworICAgIGJ1ZmZfaW5mby5vZmZzZXQgPSAwOworICAgIGJ1ZmZfaW5mby5yYW5nZSA9IFZLX1dIT0xFX1NJWkU7CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZSA9IHt9OworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBUZXhlbEJ1ZmZlclZpZXcgPSBudWxscHRyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSAmYnVmZl9pbmZvOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9IG51bGxwdHI7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IGRzLnNldF87CisKKyAgICB2azo6VXBkYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZGVzY3JpcHRvcl93cml0ZSwgMCwgTlVMTCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICAvLyBDbGVhbnVwCisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIE5VTEwpOworICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBOVUxMKTsKK30KKworLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QuIE5vIGZhaWx1cmVzIGFyZSBleHBlY3RlZC4KK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBQdXNoRGVzY3JpcHRvck51bGxEc3RTZXRUZXN0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVXNlIG51bGwgZHN0U2V0IGluIENtZFB1c2hEZXNjcmlwdG9yU2V0S0hSIik7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIERpZCBub3QgZmluZCBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUU7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIFB1c2ggRGVzY3JpcHRvcnMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBhdXRvIHB1c2hfZGVzY3JpcHRvcl9wcm9wID0gR2V0UHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzKGluc3RhbmNlKCksIGdwdSgpKTsKKyAgICBpZiAocHVzaF9kZXNjcmlwdG9yX3Byb3AubWF4UHVzaERlc2NyaXB0b3JzIDwgMSkgeworICAgICAgICAvLyBTb21lIGltcGxlbWVudGF0aW9ucyByZXBvcnQgYW4gaW52YWxpZCBtYXhQdXNoRGVzY3JpcHRvcnMgb2YgMAorICAgICAgICBwcmludGYoIiVzIG1heFB1c2hEZXNjcmlwdG9ycyBpcyB6ZXJvLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGRzbF9iaW5kaW5nID0ge307CisgICAgZHNsX2JpbmRpbmcuYmluZGluZyA9IDI7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkc2xfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBkc2xfYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzX2xheW91dChtX2RldmljZSwge2RzbF9iaW5kaW5nfSk7CisgICAgLy8gQ3JlYXRlIHB1c2ggZGVzY3JpcHRvciBzZXQgbGF5b3V0CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIHB1c2hfZHNfbGF5b3V0KG1fZGV2aWNlLCB7ZHNsX2JpbmRpbmd9LCBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSKTsKKworICAgIC8vIFVzZSBoZWxwZXIgdG8gY3JlYXRlIGdyYXBoaWNzIHBpcGVsaW5lCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgaGVscGVyKCp0aGlzKTsKKyAgICBoZWxwZXIuSW5pdEluZm8oKTsKKyAgICBoZWxwZXIuSW5pdFN0YXRlKCk7CisgICAgaGVscGVyLnBpcGVsaW5lX2xheW91dF8gPSBWa1BpcGVsaW5lTGF5b3V0T2JqKG1fZGV2aWNlLCB7JnB1c2hfZHNfbGF5b3V0LCAmZHNfbGF5b3V0fSk7CisgICAgaGVscGVyLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKworICAgIGNvbnN0IGZsb2F0IHZib19kYXRhWzNdID0gezEuZiwgMC5mLCAxLmZ9OworICAgIFZrQ29uc3RhbnRCdWZmZXJPYmogdmJvKG1fZGV2aWNlLCBzaXplb2YodmJvX2RhdGEpLCAoY29uc3Qgdm9pZCAqKSZ2Ym9fZGF0YSwgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVCk7CisKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZfaW5mbzsKKyAgICBidWZmX2luZm8uYnVmZmVyID0gdmJvLmhhbmRsZSgpOworICAgIGJ1ZmZfaW5mby5vZmZzZXQgPSAwOworICAgIGJ1ZmZfaW5mby5yYW5nZSA9IHNpemVvZih2Ym9fZGF0YSk7CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZSA9IHt9OworICAgIGRlc2NyaXB0b3Jfd3JpdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XUklURV9ERVNDUklQVE9SX1NFVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLnBUZXhlbEJ1ZmZlclZpZXcgPSBudWxscHRyOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEJ1ZmZlckluZm8gPSAmYnVmZl9pbmZvOworICAgIGRlc2NyaXB0b3Jfd3JpdGUucEltYWdlSW5mbyA9IG51bGxwdHI7CisgICAgZGVzY3JpcHRvcl93cml0ZS5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdFNldCA9IDA7ICAvLyBTaG91bGQgbm90IGNhdXNlIGEgdmFsaWRhdGlvbiBlcnJvcgorCisgICAgLy8gRmluZCBhZGRyZXNzIG9mIGV4dGVuc2lvbiBjYWxsIGFuZCBtYWtlIHRoZSBjYWxsCisgICAgUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiA9CisgICAgICAgIChQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIpOworICAgIGFzc2VydCh2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSICE9IG51bGxwdHIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gSW4gSW50ZWwgR1BVLCBpdCBuZWVkcyB0byBiaW5kIHBpcGVsaW5lIGJlZm9yZSBwdXNoIGRlc2NyaXB0b3Igc2V0LgorICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgaGVscGVyLnBpcGVsaW5lXyk7CisgICAgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBoZWxwZXIucGlwZWxpbmVfbGF5b3V0Xy5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3dyaXRlKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCisvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdC4gTm8gZmFpbHVyZXMgYXJlIGV4cGVjdGVkLgorVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFB1c2hEZXNjcmlwdG9yVW5ib3VuZFNldFRlc3QpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJFbnN1cmUgdGhhdCBubyB2YWxpZGF0aW9uIGVycm9ycyBhcmUgcHJvZHVjZWQgZm9yIG5vdCBib3VuZCBwdXNoIGRlc2NyaXB0b3Igc2V0cyIpOworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRTsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgUHVzaCBEZXNjcmlwdG9ycyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBhdXRvIHB1c2hfZGVzY3JpcHRvcl9wcm9wID0gR2V0UHVzaERlc2NyaXB0b3JQcm9wZXJ0aWVzKGluc3RhbmNlKCksIGdwdSgpKTsKKyAgICBpZiAocHVzaF9kZXNjcmlwdG9yX3Byb3AubWF4UHVzaERlc2NyaXB0b3JzIDwgMSkgeworICAgICAgICAvLyBTb21lIGltcGxlbWVudGF0aW9ucyByZXBvcnQgYW4gaW52YWxpZCBtYXhQdXNoRGVzY3JpcHRvcnMgb2YgMAorICAgICAgICBwcmludGYoIiVzIG1heFB1c2hEZXNjcmlwdG9ycyBpcyB6ZXJvLCBza2lwcGluZyB0ZXN0c1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIC8vIENyZWF0ZSBkZXNjcmlwdG9yIHNldCBsYXlvdXQKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGRzbF9iaW5kaW5nID0ge307CisgICAgZHNsX2JpbmRpbmcuYmluZGluZyA9IDI7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkc2xfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBkc2xfYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwge2RzbF9iaW5kaW5nfSwgMCwgbnVsbHB0ciwgVktfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9GUkVFX0RFU0NSSVBUT1JfU0VUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworCisgICAgLy8gQ3JlYXRlIHB1c2ggZGVzY3JpcHRvciBzZXQgbGF5b3V0CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIHB1c2hfZHNfbGF5b3V0KG1fZGV2aWNlLCB7ZHNsX2JpbmRpbmd9LCBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSKTsKKworICAgIC8vIENyZWF0ZSBQU08KKyAgICBjaGFyIGNvbnN0IGZzU291cmNlW10gPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAibGF5b3V0KHNldD0wKSBsYXlvdXQoYmluZGluZz0yKSB1bmlmb3JtIGZvbzEgeyBmbG9hdCB4OyB9IGJhcjE7XG4iCisgICAgICAgICJsYXlvdXQoc2V0PTEpIGxheW91dChiaW5kaW5nPTIpIHVuaWZvcm0gZm9vMiB7IGZsb2F0IHk7IH0gYmFyMjtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgeCA9IHZlYzQoYmFyMS54KSArIHZlYzQoYmFyMi55KTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgLy8gTm93IHVzZSB0aGUgZGVzY3JpcHRvciBsYXlvdXRzIHRvIGNyZWF0ZSBhIHBpcGVsaW5lIGxheW91dAorICAgIHBpcGUucGlwZWxpbmVfbGF5b3V0XyA9IFZrUGlwZWxpbmVMYXlvdXRPYmoobV9kZXZpY2UsIHsmcHVzaF9kc19sYXlvdXQsICZkZXNjcmlwdG9yX3NldC5sYXlvdXRffSk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBjb25zdCBmbG9hdCBib19kYXRhWzFdID0gezEuZn07CisgICAgVmtDb25zdGFudEJ1ZmZlck9iaiBidWZmZXIobV9kZXZpY2UsIHNpemVvZihib19kYXRhKSwgKGNvbnN0IHZvaWQgKikmYm9fZGF0YSwgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVCk7CisKKyAgICAvLyBVcGRhdGUgZGVzY3JpcHRvciBzZXQKKyAgICBkZXNjcmlwdG9yX3NldC5Xcml0ZURlc2NyaXB0b3JCdWZmZXJJbmZvKDIsIGJ1ZmZlci5oYW5kbGUoKSwgc2l6ZW9mKGJvX2RhdGEpKTsKKyAgICBkZXNjcmlwdG9yX3NldC5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworCisgICAgUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiA9CisgICAgICAgIChQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIpOworICAgIGFzc2VydCh2a0NtZFB1c2hEZXNjcmlwdG9yU2V0S0hSICE9IG51bGxwdHIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+QmVnaW5SZW5kZXJQYXNzKG1fcmVuZGVyUGFzc0JlZ2luSW5mbyk7CisgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lXyk7CisKKyAgICAvLyBQdXNoIGRlc2NyaXB0b3JzIGFuZCBiaW5kIGRlc2NyaXB0b3Igc2V0CisgICAgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC5kZXNjcmlwdG9yX3dyaXRlcy5kYXRhKCkpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV9sYXlvdXRfLmhhbmRsZSgpLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfc2V0LnNldF8sIDAsIE5VTEwpOworCisgICAgLy8gTm8gZXJyb3JzIHNob3VsZCBiZSBnZW5lcmF0ZWQuCisgICAgdms6OkNtZERyYXcobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMywgMSwgMCwgMCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBQdXNoRGVzY3JpcHRvclNldFVwZGF0aW5nU2V0TnVtYmVyKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIkVuc3VyZSB0aGF0IG5vIHZhbGlkYXRpb24gZXJyb3JzIGFyZSBwcm9kdWNlZCB3aGVuIHRoZSBwdXNoIGRlc2NyaXB0b3Igc2V0IG51bWJlciBjaGFuZ2VzICIKKyAgICAgICAgImJldHdlZW4gdHdvIHZrOjpDbWRQdXNoRGVzY3JpcHRvclNldEtIUiBjYWxscy4iKTsKKworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwKKyAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9QVVNIX0RFU0NSSVBUT1JfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIGF1dG8gcHVzaF9kZXNjcmlwdG9yX3Byb3AgPSBHZXRQdXNoRGVzY3JpcHRvclByb3BlcnRpZXMoaW5zdGFuY2UoKSwgZ3B1KCkpOworICAgIGlmIChwdXNoX2Rlc2NyaXB0b3JfcHJvcC5tYXhQdXNoRGVzY3JpcHRvcnMgPCAxKSB7CisgICAgICAgIC8vIFNvbWUgaW1wbGVtZW50YXRpb25zIHJlcG9ydCBhbiBpbnZhbGlkIG1heFB1c2hEZXNjcmlwdG9ycyBvZiAwCisgICAgICAgIHByaW50ZigiJXMgbWF4UHVzaERlc2NyaXB0b3JzIGlzIHplcm8sIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFZpZXdwb3J0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgdG8gcHVzaAorICAgIGNvbnN0IHVpbnQzMl90IGJ1ZmZlcl9kYXRhWzRdID0gezQsIDUsIDYsIDd9OworICAgIFZrQ29uc3RhbnRCdWZmZXJPYmogYnVmZmVyX29iaigKKyAgICAgICAgbV9kZXZpY2UsIHNpemVvZihidWZmZXJfZGF0YSksICZidWZmZXJfZGF0YSwKKyAgICAgICAgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQpOworICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcl9vYmouaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZlcl9pbmZvID0ge2J1ZmZlcl9vYmouaGFuZGxlKCksIDAsIFZLX1dIT0xFX1NJWkV9OworCisgICAgUEZOX3ZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiA9CisgICAgICAgIChQRk5fdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrQ21kUHVzaERlc2NyaXB0b3JTZXRLSFIgIT0gbnVsbHB0cik7CisKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGRzX2JpbmRpbmdfMCA9IHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkc19iaW5kaW5nXzEgPSB7MSwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHJ9OworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dE9iaiBkc19sYXlvdXQobV9kZXZpY2UsIHtkc19iaW5kaW5nXzAsIGRzX2JpbmRpbmdfMX0pOworICAgIEFTU0VSVF9UUlVFKGRzX2xheW91dC5pbml0aWFsaXplZCgpKTsKKworICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgcHVzaF9kc19iaW5kaW5nXzAgPSB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIHB1c2hfZHNfbGF5b3V0KG1fZGV2aWNlLCB7cHVzaF9kc19iaW5kaW5nXzB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX1BVU0hfREVTQ1JJUFRPUl9CSVRfS0hSKTsKKyAgICBBU1NFUlRfVFJVRShwdXNoX2RzX2xheW91dC5pbml0aWFsaXplZCgpKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgVmtQaXBlbGluZU9iaiBwaXBlMChtX2RldmljZSk7CisgICAgVmtQaXBlbGluZU9iaiBwaXBlMShtX2RldmljZSk7CisgICAgeworICAgICAgICAvLyBOb3RlOiB0aGUgcHVzaCBkZXNjcmlwdG9yIHNldCBpcyBzZXQgbnVtYmVyIDIuCisgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KG1fZGV2aWNlLCB7JmRzX2xheW91dCwgJmRzX2xheW91dCwgJnB1c2hfZHNfbGF5b3V0LCAmZHNfbGF5b3V0fSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHBpcGVsaW5lX2xheW91dC5pbml0aWFsaXplZCgpKTsKKworICAgICAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCB2ZWM0IHg7XG4iCisgICAgICAgICAgICAibGF5b3V0KHNldD0yKSBsYXlvdXQoYmluZGluZz0wKSB1bmlmb3JtIGZvbyB7IHZlYzQgeTsgfSBiYXI7XG4iCisgICAgICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICAgICAiICAgeCA9IGJhci55O1xuIgorICAgICAgICAgICAgIn1cbiI7CisKKyAgICAgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisgICAgICAgIFZrUGlwZWxpbmVPYmogJnBpcGUgPSBwaXBlMDsKKyAgICAgICAgcGlwZS5TZXRWaWV3cG9ydChtX3ZpZXdwb3J0cyk7CisgICAgICAgIHBpcGUuU2V0U2Npc3NvcihtX3NjaXNzb3JzKTsKKyAgICAgICAgcGlwZS5BZGRTaGFkZXIoJnZzKTsKKyAgICAgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKyAgICAgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIHJlbmRlclBhc3MoKSk7CisKKyAgICAgICAgdms6OkNtZEJpbmRQaXBlbGluZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLmhhbmRsZSgpKTsKKworICAgICAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlID0gdmtfdGVzdGluZzo6RGV2aWNlOjp3cml0ZV9kZXNjcmlwdG9yX3NldCgKKyAgICAgICAgICAgIHZrX3Rlc3Rpbmc6OkRlc2NyaXB0b3JTZXQoKSwgMCwgMCwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSLCAxLCAmYnVmZmVyX2luZm8pOworCisgICAgICAgIC8vIE5vdGU6IHB1c2hpbmcgdG8gZGVzY2lwdG9yIHNldCBudW1iZXIgMi4KKyAgICAgICAgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIDIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfd3JpdGUpOworICAgICAgICB2azo6Q21kRHJhdyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAzLCAxLCAwLCAwKTsKKyAgICB9CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIHsKKyAgICAgICAgLy8gTm90ZTogdGhlIHB1c2ggZGVzY3JpcHRvciBzZXQgaXMgbm93IHNldCBudW1iZXIgMy4KKyAgICAgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQobV9kZXZpY2UsIHsmZHNfbGF5b3V0LCAmZHNfbGF5b3V0LCAmZHNfbGF5b3V0LCAmcHVzaF9kc19sYXlvdXR9KTsKKyAgICAgICAgQVNTRVJUX1RSVUUocGlwZWxpbmVfbGF5b3V0LmluaXRpYWxpemVkKCkpOworCisgICAgICAgIGNvbnN0IFZrV3JpdGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfd3JpdGUgPSB2a190ZXN0aW5nOjpEZXZpY2U6OndyaXRlX2Rlc2NyaXB0b3Jfc2V0KAorICAgICAgICAgICAgdmtfdGVzdGluZzo6RGVzY3JpcHRvclNldCgpLCAwLCAwLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIsIDEsICZidWZmZXJfaW5mbyk7CisKKyAgICAgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAgICAgImxheW91dChzZXQ9MykgbGF5b3V0KGJpbmRpbmc9MCkgdW5pZm9ybSBmb28geyB2ZWM0IHk7IH0gYmFyO1xuIgorICAgICAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAgICAgIiAgIHggPSBiYXIueTtcbiIKKyAgICAgICAgICAgICJ9XG4iOworCisgICAgICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgICAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworICAgICAgICBWa1BpcGVsaW5lT2JqICZwaXBlID0gcGlwZTE7CisgICAgICAgIHBpcGUuU2V0Vmlld3BvcnQobV92aWV3cG9ydHMpOworICAgICAgICBwaXBlLlNldFNjaXNzb3IobV9zY2lzc29ycyk7CisgICAgICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisgICAgICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisgICAgICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworICAgICAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCByZW5kZXJQYXNzKCkpOworCisgICAgICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5oYW5kbGUoKSk7CisKKyAgICAgICAgLy8gTm90ZTogbm93IHB1c2hpbmcgdG8gZGVzY2lwdG9yIHNldCBudW1iZXIgMy4KKyAgICAgICAgdmtDbWRQdXNoRGVzY3JpcHRvclNldEtIUihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCksIDMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfd3JpdGUpOworICAgICAgICB2azo6Q21kRHJhdyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAzLCAxLCAwLCAwKTsKKyAgICB9CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7Cit9CisKKy8vIFRoaXMgaXMgYSBwb3NpdGl2ZSB0ZXN0LiBObyBmYWlsdXJlcyBhcmUgZXhwZWN0ZWQuCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgVGVzdEFsaWFzZWRNZW1vcnlUcmFja2luZykgeworICAgIFZrUmVzdWx0IGVycjsKKyAgICBib29sIHBhc3M7CisKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiQ3JlYXRlIGEgYnVmZmVyLCBhbGxvY2F0ZSBtZW1vcnksIGJpbmQgbWVtb3J5LCBkZXN0cm95IHRoZSBidWZmZXIsIGNyZWF0ZSBhbiBpbWFnZSwgYW5kIGJpbmQgdGhlIHNhbWUgbWVtb3J5IHRvIGl0Iik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIFZrQnVmZmVyIGJ1ZmZlcjsKKyAgICBWa0ltYWdlIGltYWdlOworICAgIFZrRGV2aWNlTWVtb3J5IG1lbTsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1fcmVxczsKKworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZfaW5mbyA9IHt9OworICAgIGJ1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1Zl9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBidWZfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQ7CisgICAgYnVmX2luZm8uc2l6ZSA9IDI1NjsKKyAgICBidWZfaW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGJ1Zl9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGJ1Zl9pbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBidWZfaW5mby5mbGFncyA9IDA7CisgICAgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZidWZfaW5mbywgTlVMTCwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIHZrOjpHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsICZtZW1fcmVxcyk7CisKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBhbGxvY19pbmZvID0ge307CisgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIGFsbG9jX2luZm8ucE5leHQgPSBOVUxMOworICAgIGFsbG9jX2luZm8ubWVtb3J5VHlwZUluZGV4ID0gMDsKKworICAgIC8vIEVuc3VyZSBtZW1vcnkgaXMgYmlnIGVub3VnaCBmb3IgYm90aCBiaW5kaW5ncworICAgIGFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgPSAweDEwMDAwOworCisgICAgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUobWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsICZhbGxvY19pbmZvLCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCk7CisgICAgaWYgKCFwYXNzKSB7CisgICAgICAgIHByaW50ZigiJXMgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgdms6OkRlc3Ryb3lCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBidWZmZXIsIE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZtZW0pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICB1aW50OF90ICpwRGF0YTsKKyAgICBlcnIgPSB2azo6TWFwTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtLCAwLCBtZW1fcmVxcy5zaXplLCAwLCAodm9pZCAqKikmcERhdGEpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBtZW1zZXQocERhdGEsIDB4Q0FERUNBREUsIHN0YXRpY19jYXN0PHNpemVfdD4obWVtX3JlcXMuc2l6ZSkpOworCisgICAgdms6OlVubWFwTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtKTsKKworICAgIGVyciA9IHZrOjpCaW5kQnVmZmVyTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBtZW0sIDApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBOT1csIGRlc3Ryb3kgdGhlIGJ1ZmZlci4gT2J2aW91c2x5LCB0aGUgcmVzb3VyY2Ugbm8gbG9uZ2VyIG9jY3VwaWVzIHRoaXMKKyAgICAvLyBtZW1vcnkuIEluIGZhY3QsIGl0IHdhcyBuZXZlciB1c2VkIGJ5IHRoZSBHUFUuCisgICAgLy8gSnVzdCBiZSBzdXJlLCB3YWl0IGZvciBpZGxlLgorICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBOVUxMKTsKKyAgICB2azo6RGV2aWNlV2FpdElkbGUobV9kZXZpY2UtPmRldmljZSgpKTsKKworICAgIC8vIFVzZSBvcHRpbWFsIGFzIHNvbWUgcGxhdGZvcm1zIHJlcG9ydCBsaW5lYXIgc3VwcG9ydCBidXQgdGhlbiBmYWlsIGltYWdlIGNyZWF0aW9uCisgICAgVmtJbWFnZVRpbGluZyBpbWFnZV90aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBWa0ltYWdlRm9ybWF0UHJvcGVydGllcyBpbWFnZV9mb3JtYXRfcHJvcGVydGllczsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoZ3B1KCksIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVFlQRV8yRCwgaW1hZ2VfdGlsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklULCAwLCAmaW1hZ2VfZm9ybWF0X3Byb3BlcnRpZXMpOworICAgIGlmIChpbWFnZV9mb3JtYXRfcHJvcGVydGllcy5tYXhFeHRlbnQud2lkdGggPT0gMCkgeworICAgICAgICBwcmludGYoIiVzIEltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSA2NDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IGltYWdlX3RpbGluZzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSBOVUxMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IDA7CisKKyAgICAvKiBDcmVhdGUgYSBtYXBwYWJsZSBpbWFnZS4gIEl0IHdpbGwgYmUgdGhlIHRleHR1cmUgaWYgbGluZWFyIGltYWdlcyBhcmUgT0sKKyAgICAgKiB0byBiZSB0ZXh0dXJlcyBvciBpdCB3aWxsIGJlIHRoZSBzdGFnaW5nIGltYWdlIGlmIHRoZXkgYXJlIG5vdC4KKyAgICAgKi8KKyAgICBlcnIgPSB2azo6Q3JlYXRlSW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCAmaW1hZ2VfY3JlYXRlX2luZm8sIE5VTEwsICZpbWFnZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCAmbWVtX3JlcXMpOworCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtX2FsbG9jID0ge307CisgICAgbWVtX2FsbG9jLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtX2FsbG9jLnBOZXh0ID0gTlVMTDsKKyAgICBtZW1fYWxsb2MuYWxsb2NhdGlvblNpemUgPSAwOworICAgIG1lbV9hbGxvYy5tZW1vcnlUeXBlSW5kZXggPSAwOworICAgIG1lbV9hbGxvYy5hbGxvY2F0aW9uU2l6ZSA9IG1lbV9yZXFzLnNpemU7CisKKyAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJm1lbV9hbGxvYywgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQpOworICAgIGlmICghcGFzcykgeworICAgICAgICBwcmludGYoIiVzIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtLCBOVUxMKTsKKyAgICAgICAgdms6OkRlc3Ryb3lJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZBTElEQVRJT04gRkFJTFVSRToKKyAgICBlcnIgPSB2azo6QmluZEltYWdlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsIG1lbSwgMCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIE5VTEwpOworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZSwgTlVMTCk7Cit9CisKKy8vIFRoaXMgaXMgYSBwb3NpdGl2ZSB0ZXN0LiBObyBmYWlsdXJlcyBhcmUgZXhwZWN0ZWQuCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgVGVzdERlc3Ryb3lGcmVlTnVsbEhhbmRsZXMpIHsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDYWxsIGFsbCBhcHBsaWNhYmxlIGRlc3Ryb3kgYW5kIGZyZWUgcm91dGluZXMgd2l0aCBOVUxMIGhhbmRsZXMsIGV4cGVjdGluZyBubyB2YWxpZGF0aW9uIGVycm9ycyIpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgdms6OkRlc3Ryb3lCdWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lCdWZmZXJWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgVktfTlVMTF9IQU5ETEUsIE5VTEwpOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yUG9vbChtX2RldmljZS0+ZGV2aWNlKCksIFZLX05VTExfSEFORExFLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lEZXZpY2UoVktfTlVMTF9IQU5ETEUsIE5VTEwpOworICAgIHZrOjpEZXN0cm95RXZlbnQobV9kZXZpY2UtPmRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIFZLX05VTExfSEFORExFLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgVktfTlVMTF9IQU5ETEUsIE5VTEwpOworICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lJbnN0YW5jZShWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZShtX2RldmljZS0+ZGV2aWNlKCksIFZLX05VTExfSEFORExFLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lQ2FjaGUobV9kZXZpY2UtPmRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dChtX2RldmljZS0+ZGV2aWNlKCksIFZLX05VTExfSEFORExFLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksIFZLX05VTExfSEFORExFLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgVktfTlVMTF9IQU5ETEUsIE5VTEwpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgVktfTlVMTF9IQU5ETEUsIE5VTEwpOworICAgIHZrOjpEZXN0cm95U2hhZGVyTW9kdWxlKG1fZGV2aWNlLT5kZXZpY2UoKSwgVktfTlVMTF9IQU5ETEUsIE5VTEwpOworCisgICAgVmtDb21tYW5kUG9vbCBjb21tYW5kX3Bvb2w7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gcG9vbF9jcmVhdGVfaW5mb3t9OworICAgIHBvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk87CisgICAgcG9vbF9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIHBvb2xfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICB2azo6Q3JlYXRlQ29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmNvbW1hbmRfcG9vbCk7CisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyc1szXSA9IHt9OworICAgIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZve307CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kUG9vbCA9IGNvbW1hbmRfcG9vbDsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlk7CisgICAgdms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCAmY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbywgJmNvbW1hbmRfYnVmZmVyc1sxXSk7CisgICAgdms6OkZyZWVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksIGNvbW1hbmRfcG9vbCwgMywgY29tbWFuZF9idWZmZXJzKTsKKyAgICB2azo6RGVzdHJveUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCBOVUxMKTsKKworICAgIFZrRGVzY3JpcHRvclBvb2xTaXplIGRzX3R5cGVfY291bnQgPSB7fTsKKyAgICBkc190eXBlX2NvdW50LnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzsKKyAgICBkc190eXBlX2NvdW50LmRlc2NyaXB0b3JDb3VudCA9IDE7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBkc19wb29sX2NpID0ge307CisgICAgZHNfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBkc19wb29sX2NpLnBOZXh0ID0gTlVMTDsKKyAgICBkc19wb29sX2NpLm1heFNldHMgPSAxOworICAgIGRzX3Bvb2xfY2kucG9vbFNpemVDb3VudCA9IDE7CisgICAgZHNfcG9vbF9jaS5mbGFncyA9IFZLX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfRlJFRV9ERVNDUklQVE9SX1NFVF9CSVQ7CisgICAgZHNfcG9vbF9jaS5wUG9vbFNpemVzID0gJmRzX3R5cGVfY291bnQ7CisKKyAgICBWa0Rlc2NyaXB0b3JQb29sIGRzX3Bvb2w7CisgICAgZXJyID0gdms6OkNyZWF0ZURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzX3Bvb2xfY2ksIE5VTEwsICZkc19wb29sKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkc2xfYmluZGluZyA9IHt9OworICAgIGRzbF9iaW5kaW5nLmJpbmRpbmcgPSAyOworICAgIGRzbF9iaW5kaW5nLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM7CisgICAgZHNsX2JpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBkc2xfYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDsKKyAgICBkc2xfYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzX2xheW91dChtX2RldmljZSwge2RzbF9iaW5kaW5nfSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXRzWzNdID0ge307CisgICAgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGFsbG9jX2luZm8gPSB7fTsKKyAgICBhbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTzsKKyAgICBhbGxvY19pbmZvLmRlc2NyaXB0b3JTZXRDb3VudCA9IDE7CisgICAgYWxsb2NfaW5mby5kZXNjcmlwdG9yUG9vbCA9IGRzX3Bvb2w7CisgICAgYWxsb2NfaW5mby5wU2V0TGF5b3V0cyA9ICZkc19sYXlvdXQuaGFuZGxlKCk7CisgICAgZXJyID0gdms6OkFsbG9jYXRlRGVzY3JpcHRvclNldHMobV9kZXZpY2UtPmRldmljZSgpLCAmYWxsb2NfaW5mbywgJmRlc2NyaXB0b3Jfc2V0c1sxXSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB2azo6RnJlZURlc2NyaXB0b3JTZXRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfcG9vbCwgMywgZGVzY3JpcHRvcl9zZXRzKTsKKyAgICB2azo6RGVzdHJveURlc2NyaXB0b3JQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgZHNfcG9vbCwgTlVMTCk7CisKKyAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIFZLX05VTExfSEFORExFLCBOVUxMKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgUXVldWVTdWJtaXRTZW1hcGhvcmVzQW5kTGF5b3V0VHJhY2tpbmcpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJTdWJtaXQgbXVsdGlwbGUgY29tbWFuZCBidWZmZXJzIHdpdGggY2hhaW5lZCBzZW1hcGhvcmUgc2lnbmFscyBhbmQgbGF5b3V0IHRyYW5zaXRpb25zIik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBWa0NvbW1hbmRCdWZmZXIgY21kX2J1ZnNbNF07CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGFsbG9jX2luZm87CisgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgYWxsb2NfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgYWxsb2NfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSA0OworICAgIGFsbG9jX2luZm8uY29tbWFuZFBvb2wgPSBtX2NvbW1hbmRQb29sLT5oYW5kbGUoKTsKKyAgICBhbGxvY19pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksICZhbGxvY19pbmZvLCBjbWRfYnVmcyk7CisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgxMjgsIDEyOCwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLAorICAgICAgICAgICAgICAgKFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQpLAorICAgICAgICAgICAgICAgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmluaXRpYWxpemVkKCkpOworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjYl9iaW5mbzsKKyAgICBjYl9iaW5mby5wTmV4dCA9IE5VTEw7CisgICAgY2JfYmluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIGNiX2JpbmZvLnBJbmhlcml0YW5jZUluZm8gPSBWS19OVUxMX0hBTkRMRTsKKyAgICBjYl9iaW5mby5mbGFncyA9IDA7CisgICAgLy8gVXNlIDQgY29tbWFuZCBidWZmZXJzLCBlYWNoIHdpdGggYW4gaW1hZ2UgbGF5b3V0IHRyYW5zaXRpb24sIENvbG9yQU8tPkdlbmVyYWwtPkNvbG9yQU8tPlRyYW5zZmVyU3JjLT5UcmFuc2ZlckRzdAorICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZnNbMF0sICZjYl9iaW5mbyk7CisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgaW1nX2JhcnJpZXIgPSB7fTsKKyAgICBpbWdfYmFycmllci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSOworICAgIGltZ19iYXJyaWVyLnBOZXh0ID0gTlVMTDsKKyAgICBpbWdfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUOworICAgIGltZ19iYXJyaWVyLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfSE9TVF9XUklURV9CSVQ7CisgICAgaW1nX2JhcnJpZXIub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBpbWdfYmFycmllci5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICBpbWdfYmFycmllci5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgIGltZ19iYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbWdfYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIoY21kX2J1ZnNbMF0sIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCwgMCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWdfYmFycmllcik7CisgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY21kX2J1ZnNbMF0pOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZnNbMV0sICZjYl9iaW5mbyk7CisgICAgaW1nX2JhcnJpZXIub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgaW1nX2JhcnJpZXIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKGNtZF9idWZzWzFdLCBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQsIDAsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1nX2JhcnJpZXIpOworICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNtZF9idWZzWzFdKTsKKyAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNtZF9idWZzWzJdLCAmY2JfYmluZm8pOworICAgIGltZ19iYXJyaWVyLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIoY21kX2J1ZnNbMl0sIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCwgMCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWdfYmFycmllcik7CisgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY21kX2J1ZnNbMl0pOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZnNbM10sICZjYl9iaW5mbyk7CisgICAgaW1nX2JhcnJpZXIub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMOworICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKGNtZF9idWZzWzNdLCBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQsIDAsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1nX2JhcnJpZXIpOworICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNtZF9idWZzWzNdKTsKKworICAgIC8vIFN1Ym1pdCA0IGNvbW1hbmQgYnVmZmVycyBpbiAzIHN1Ym1pdHMsIHdpdGggc3VibWl0cyAyIGFuZCAzIHdhaXRpbmcgZm9yIHNlbWFwaG9yZXMgZnJvbSBzdWJtaXRzIDEgYW5kIDIKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmUxLCBzZW1hcGhvcmUyOworICAgIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBzZW1hcGhvcmVfY3JlYXRlX2luZm97fTsKKyAgICBzZW1hcGhvcmVfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk87CisgICAgdms6OkNyZWF0ZVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksICZzZW1hcGhvcmVfY3JlYXRlX2luZm8sIG51bGxwdHIsICZzZW1hcGhvcmUxKTsKKyAgICB2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZTIpOworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGZsYWdzW117VktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVH07CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvWzNdOworICAgIHN1Ym1pdF9pbmZvWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm9bMF0ucE5leHQgPSBudWxscHRyOworICAgIHN1Ym1pdF9pbmZvWzBdLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm9bMF0ucENvbW1hbmRCdWZmZXJzID0gJmNtZF9idWZzWzBdOworICAgIHN1Ym1pdF9pbmZvWzBdLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mb1swXS5wU2lnbmFsU2VtYXBob3JlcyA9ICZzZW1hcGhvcmUxOworICAgIHN1Ym1pdF9pbmZvWzBdLndhaXRTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgc3VibWl0X2luZm9bMF0ucFdhaXREc3RTdGFnZU1hc2sgPSBudWxscHRyOworICAgIHN1Ym1pdF9pbmZvWzBdLnBXYWl0RHN0U3RhZ2VNYXNrID0gZmxhZ3M7CisgICAgc3VibWl0X2luZm9bMV0uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mb1sxXS5wTmV4dCA9IG51bGxwdHI7CisgICAgc3VibWl0X2luZm9bMV0uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mb1sxXS5wQ29tbWFuZEJ1ZmZlcnMgPSAmY21kX2J1ZnNbMV07CisgICAgc3VibWl0X2luZm9bMV0ud2FpdFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mb1sxXS5wV2FpdFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlMTsKKyAgICBzdWJtaXRfaW5mb1sxXS5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm9bMV0ucFNpZ25hbFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlMjsKKyAgICBzdWJtaXRfaW5mb1sxXS5wV2FpdERzdFN0YWdlTWFzayA9IGZsYWdzOworICAgIHN1Ym1pdF9pbmZvWzJdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm9bMl0ucE5leHQgPSBudWxscHRyOworICAgIHN1Ym1pdF9pbmZvWzJdLmNvbW1hbmRCdWZmZXJDb3VudCA9IDI7CisgICAgc3VibWl0X2luZm9bMl0ucENvbW1hbmRCdWZmZXJzID0gJmNtZF9idWZzWzJdOworICAgIHN1Ym1pdF9pbmZvWzJdLndhaXRTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgc3VibWl0X2luZm9bMl0ucFdhaXRTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTI7CisgICAgc3VibWl0X2luZm9bMl0uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAwOworICAgIHN1Ym1pdF9pbmZvWzJdLnBTaWduYWxTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICBzdWJtaXRfaW5mb1syXS5wV2FpdERzdFN0YWdlTWFzayA9IGZsYWdzOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMywgc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisKKyAgICB2azo6RGVzdHJveVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksIHNlbWFwaG9yZTEsIE5VTEwpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlMiwgTlVMTCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBEeW5hbWljT2Zmc2V0V2l0aEluYWN0aXZlQmluZGluZykgeworICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3JTZXQgdy8gZHluYW1pYyBkZXNjcmlwdG9ycyB3aGVyZSAxIGJpbmRpbmcgaXMgaW5hY3RpdmUKKyAgICAvLyBXZSBwcmV2aW91c2x5IGhhZCBhIGJ1ZyB3aGVyZSBkeW5hbWljIG9mZnNldCBvZiBpbmFjdGl2ZSBiaW5kaW5ncyB3YXMgc3RpbGwgYmVpbmcgdXNlZAorICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRWaWV3cG9ydCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgT25lT2ZmRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldChtX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUMsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIG51bGxwdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQywgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgLy8gQ3JlYXRlIHR3byBidWZmZXJzIHRvIHVwZGF0ZSB0aGUgZGVzY3JpcHRvcnMgd2l0aAorICAgIC8vIFRoZSBmaXJzdCB3aWxsIGJlIDJrIGFuZCB1c2VkIGZvciBiaW5kaW5ncyAwICYgMSwgdGhlIHNlY29uZCBpcyAxayBmb3IgYmluZGluZyAyCisgICAgdWludDMyX3QgcWZpID0gMDsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZkNJID0ge307CisgICAgYnVmZkNJLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1ZmZDSS5zaXplID0gMjA0ODsKKyAgICBidWZmQ0kudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVU5JRk9STV9CVUZGRVJfQklUOworICAgIGJ1ZmZDSS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAxOworICAgIGJ1ZmZDSS5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKworICAgIFZrQnVmZmVyT2JqIGR5bmFtaWNfdW5pZm9ybV9idWZmZXJfMSwgZHluYW1pY191bmlmb3JtX2J1ZmZlcl8yOworICAgIGR5bmFtaWNfdW5pZm9ybV9idWZmZXJfMS5pbml0KCptX2RldmljZSwgYnVmZkNJKTsKKyAgICBidWZmQ0kuc2l6ZSA9IDEwMjQ7CisgICAgZHluYW1pY191bmlmb3JtX2J1ZmZlcl8yLmluaXQoKm1fZGV2aWNlLCBidWZmQ0kpOworCisgICAgLy8gVXBkYXRlIGRlc2NyaXB0b3JzCisgICAgY29uc3QgdWludDMyX3QgQklORElOR19DT1VOVCA9IDM7CisgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyBidWZmX2luZm9bQklORElOR19DT1VOVF0gPSB7fTsKKyAgICBidWZmX2luZm9bMF0uYnVmZmVyID0gZHluYW1pY191bmlmb3JtX2J1ZmZlcl8xLmhhbmRsZSgpOworICAgIGJ1ZmZfaW5mb1swXS5vZmZzZXQgPSAwOworICAgIGJ1ZmZfaW5mb1swXS5yYW5nZSA9IDI1NjsKKyAgICBidWZmX2luZm9bMV0uYnVmZmVyID0gZHluYW1pY191bmlmb3JtX2J1ZmZlcl8xLmhhbmRsZSgpOworICAgIGJ1ZmZfaW5mb1sxXS5vZmZzZXQgPSAyNTY7CisgICAgYnVmZl9pbmZvWzFdLnJhbmdlID0gNTEyOworICAgIGJ1ZmZfaW5mb1syXS5idWZmZXIgPSBkeW5hbWljX3VuaWZvcm1fYnVmZmVyXzIuaGFuZGxlKCk7CisgICAgYnVmZl9pbmZvWzJdLm9mZnNldCA9IDA7CisgICAgYnVmZl9pbmZvWzJdLnJhbmdlID0gNTEyOworCisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl93cml0ZTsKKyAgICBtZW1zZXQoJmRlc2NyaXB0b3Jfd3JpdGUsIDAsIHNpemVvZihkZXNjcmlwdG9yX3dyaXRlKSk7CisgICAgZGVzY3JpcHRvcl93cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRzdEJpbmRpbmcgPSAwOworICAgIGRlc2NyaXB0b3Jfd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gQklORElOR19DT1VOVDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM7CisgICAgZGVzY3JpcHRvcl93cml0ZS5wQnVmZmVySW5mbyA9IGJ1ZmZfaW5mbzsKKworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZkZXNjcmlwdG9yX3dyaXRlLCAwLCBOVUxMKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworCisgICAgLy8gQ3JlYXRlIFBTTyB0byBiZSB1c2VkIGZvciBkcmF3LXRpbWUgZXJyb3JzIGJlbG93CisgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAibGF5b3V0KHNldD0wKSBsYXlvdXQoYmluZGluZz0wKSB1bmlmb3JtIGZvbzEgeyBpbnQgeDsgaW50IHk7IH0gYmFyMTtcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCkgbGF5b3V0KGJpbmRpbmc9MikgdW5pZm9ybSBmb28yIHsgaW50IHg7IGludCB5OyB9IGJhcjI7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIHggPSB2ZWM0KGJhcjEueSkgKyB2ZWM0KGJhcjIueSk7XG4iCisgICAgICAgICJ9XG4iOworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgcGlwZS5waXBlbGluZV9sYXlvdXRfID0gVmtQaXBlbGluZUxheW91dE9iaihtX2RldmljZSwgeyZkZXNjcmlwdG9yX3NldC5sYXlvdXRffSk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUucGlwZWxpbmVfKTsKKyAgICAvLyBUaGlzIHVwZGF0ZSBzaG91bGQgc3VjY2VlZCwgYnV0IG9mZnNldCBvZiBpbmFjdGl2ZSBiaW5kaW5nIDEgb3ZlcnN0ZXBzIGJpbmRpbmcgMiBidWZmZXIgc2l6ZQorICAgIC8vICAgd2UgdXNlZCB0byBoYXZlIGEgYnVnIGluIHRoaXMgY2FzZS4KKyAgICB1aW50MzJfdCBkeW5fb2ZmW0JJTkRJTkdfQ09VTlRdID0gezAsIDEwMjQsIDI1Nn07CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBwaXBlLnBpcGVsaW5lX2xheW91dF8uaGFuZGxlKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvcl9zZXQuc2V0XywgQklORElOR19DT1VOVCwgZHluX29mZik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5FbmRSZW5kZXJQYXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIE5vbkNvaGVyZW50TWVtb3J5TWFwcGluZykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJFbnN1cmUgdGhhdCB2YWxpZGF0aW9ucyBoYW5kbGluZyBvZiBub24tY29oZXJlbnQgbWVtb3J5IG1hcHBpbmcgd2hpbGUgdXNpbmcgVktfV0hPTEVfU0laRSBkb2VzIG5vdCBjYXVzZSBhY2Nlc3MgIgorICAgICAgICAidmlvbGF0aW9ucyIpOworICAgIFZrUmVzdWx0IGVycjsKKyAgICB1aW50OF90ICpwRGF0YTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgVmtEZXZpY2VNZW1vcnkgbWVtOworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbV9yZXFzOworICAgIG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzID0gMHhGRkZGRkZGRjsKKyAgICBjb25zdCBWa0RldmljZVNpemUgYXRvbV9zaXplID0gbV9kZXZpY2UtPnByb3BzLmxpbWl0cy5ub25Db2hlcmVudEF0b21TaXplOworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGFsbG9jX2luZm8gPSB7fTsKKyAgICBhbGxvY19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgYWxsb2NfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgYWxsb2NfaW5mby5tZW1vcnlUeXBlSW5kZXggPSAwOworCisgICAgc3RhdGljIGNvbnN0IFZrRGV2aWNlU2l6ZSBhbGxvY2F0aW9uX3NpemUgPSAzMiAqIGF0b21fc2l6ZTsKKyAgICBhbGxvY19pbmZvLmFsbG9jYXRpb25TaXplID0gYWxsb2NhdGlvbl9zaXplOworCisgICAgLy8gRmluZCBhIG1lbW9yeSBjb25maWd1cmF0aW9ucyBXSVRIT1VUIGEgQ09IRVJFTlQgYml0LCBvdGhlcndpc2UgZXhpdAorICAgIGJvb2wgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUobWVtX3JlcXMubWVtb3J5VHlwZUJpdHMsICZhbGxvY19pbmZvLCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCk7CisgICAgaWYgKCFwYXNzKSB7CisgICAgICAgIHBhc3MgPSBtX2RldmljZS0+cGh5KCkuc2V0X21lbW9yeV90eXBlKG1lbV9yZXFzLm1lbW9yeVR5cGVCaXRzLCAmYWxsb2NfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUKTsKKyAgICAgICAgaWYgKCFwYXNzKSB7CisgICAgICAgICAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZSgKKyAgICAgICAgICAgICAgICBtZW1fcmVxcy5tZW1vcnlUeXBlQml0cywgJmFsbG9jX2luZm8sCisgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NBQ0hFRF9CSVQsCisgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUKTsKKyAgICAgICAgICAgIGlmICghcGFzcykgeworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgQ291bGRuJ3QgZmluZCBhIG1lbW9yeSB0eXBlIHdpaHRvdXQgYSBDT0hFUkVOVCBiaXQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZtZW0pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBNYXAvRmx1c2gvSW52YWxpZGF0ZSB1c2luZyBXSE9MRV9TSVpFIGFuZCB6ZXJvIG9mZnNldHMgYW5kIGVudGlyZSBtYXBwZWQgcmFuZ2UKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIGVyciA9IHZrOjpNYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIDAsIFZLX1dIT0xFX1NJWkUsIDAsICh2b2lkICoqKSZwRGF0YSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBWa01hcHBlZE1lbW9yeVJhbmdlIG1tciA9IHt9OworICAgIG1tci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0U7CisgICAgbW1yLm1lbW9yeSA9IG1lbTsKKyAgICBtbXIub2Zmc2V0ID0gMDsKKyAgICBtbXIuc2l6ZSA9IFZLX1dIT0xFX1NJWkU7CisgICAgZXJyID0gdms6OkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJm1tcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBlcnIgPSB2azo6SW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZtbXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgdms6OlVubWFwTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtKTsKKworICAgIC8vIE1hcC9GbHVzaC9JbnZhbGlkYXRlIHVzaW5nIFdIT0xFX1NJWkUgYW5kIGFuIG9mZnNldCBhbmQgZW50aXJlIG1hcHBlZCByYW5nZQorICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgZXJyID0gdms6Ok1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgNSAqIGF0b21fc2l6ZSwgVktfV0hPTEVfU0laRSwgMCwgKHZvaWQgKiopJnBEYXRhKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIG1tci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0U7CisgICAgbW1yLm1lbW9yeSA9IG1lbTsKKyAgICBtbXIub2Zmc2V0ID0gNiAqIGF0b21fc2l6ZTsKKyAgICBtbXIuc2l6ZSA9IFZLX1dIT0xFX1NJWkU7CisgICAgZXJyID0gdms6OkZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJm1tcik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBlcnIgPSB2azo6SW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZtbXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgdms6OlVubWFwTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtKTsKKworICAgIC8vIE1hcCB3aXRoIG9mZnNldCBhbmQgc2l6ZQorICAgIC8vIEZsdXNoL0ludmFsaWRhdGUgc3VicmFuZ2Ugb2YgbWFwcGVkIGFyZWEgd2l0aCBvZmZzZXQgYW5kIHNpemUKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIGVyciA9IHZrOjpNYXBNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW0sIDMgKiBhdG9tX3NpemUsIDkgKiBhdG9tX3NpemUsIDAsICh2b2lkICoqKSZwRGF0YSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBtbXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NQVBQRURfTUVNT1JZX1JBTkdFOworICAgIG1tci5tZW1vcnkgPSBtZW07CisgICAgbW1yLm9mZnNldCA9IDQgKiBhdG9tX3NpemU7CisgICAgbW1yLnNpemUgPSAyICogYXRvbV9zaXplOworICAgIGVyciA9IHZrOjpGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZtbXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgZXJyID0gdms6OkludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmbW1yKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIHZrOjpVbm1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSk7CisKKyAgICAvLyBNYXAgd2l0aG91dCBvZmZzZXQgYW5kIGZsdXNoIFdIT0xFX1NJWkUgd2l0aCB0d28gc2VwYXJhdGUgb2Zmc2V0cworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgZXJyID0gdms6Ok1hcE1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1lbSwgMCwgVktfV0hPTEVfU0laRSwgMCwgKHZvaWQgKiopJnBEYXRhKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIG1tci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0U7CisgICAgbW1yLm1lbW9yeSA9IG1lbTsKKyAgICBtbXIub2Zmc2V0ID0gYWxsb2NhdGlvbl9zaXplIC0gKDQgKiBhdG9tX3NpemUpOworICAgIG1tci5zaXplID0gVktfV0hPTEVfU0laRTsKKyAgICBlcnIgPSB2azo6Rmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmbW1yKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIG1tci5vZmZzZXQgPSBhbGxvY2F0aW9uX3NpemUgLSAoNiAqIGF0b21fc2l6ZSk7CisgICAgbW1yLnNpemUgPSBWS19XSE9MRV9TSVpFOworICAgIGVyciA9IHZrOjpGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZtbXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgdms6OlVubWFwTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtKTsKKworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtLCBOVUxMKTsKK30KKworLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QuIFdlIHVzZWQgdG8gZXhwZWN0IGVycm9yIGluIHRoaXMgY2FzZSBidXQgc3BlYyBub3cgYWxsb3dzIGl0CitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgUmVzZXRVbnNpZ25hbGVkRmVuY2UpIHsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrX3Rlc3Rpbmc6OkZlbmNlIHRlc3RGZW5jZTsKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmZW5jZUluZm8gPSB7fTsKKyAgICBmZW5jZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTzsKKyAgICBmZW5jZUluZm8ucE5leHQgPSBOVUxMOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICB0ZXN0RmVuY2UuaW5pdCgqbV9kZXZpY2UsIGZlbmNlSW5mbyk7CisgICAgVmtGZW5jZSBmZW5jZXNbMV0gPSB7dGVzdEZlbmNlLmhhbmRsZSgpfTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2azo6UmVzZXRGZW5jZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCBmZW5jZXMpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHJlc3VsdCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENvbW1hbmRCdWZmZXJTaW11bHRhbmVvdXNVc2VTeW5jKSB7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtSZXN1bHQgZXJyOworCisgICAgLy8gUmVjb3JkIChlbXB0eSEpIGNvbW1hbmQgYnVmZmVyIHRoYXQgY2FuIGJlIHN1Ym1pdHRlZCBtdWx0aXBsZSB0aW1lcworICAgIC8vIHNpbXVsdGFuZW91c2x5LgorICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjYmJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09NTUFORF9CVUZGRVJfVVNBR0VfU0lNVUxUQU5FT1VTX1VTRV9CSVQsIG51bGxwdHJ9OworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oJmNiYmkpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDB9OworICAgIFZrRmVuY2UgZmVuY2U7CisgICAgZXJyID0gdms6OkNyZWF0ZUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZjaSwgbnVsbHB0ciwgJmZlbmNlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDB9OworICAgIFZrU2VtYXBob3JlIHMxLCBzMjsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNjaSwgbnVsbHB0ciwgJnMxKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIGVyciA9IHZrOjpDcmVhdGVTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCAmc2NpLCBudWxscHRyLCAmczIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBTdWJtaXQgQ0Igb25jZSBzaWduYWxpbmcgczEsIHdpdGggZmVuY2Ugc28gd2UgY2FuIHJvbGwgZm9yd2FyZCB0byBpdHMgcmV0aXJlbWVudC4KKyAgICBWa1N1Ym1pdEluZm8gc2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8sIG51bGxwdHIsIDAsIG51bGxwdHIsIG51bGxwdHIsIDEsICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAmczF9OworICAgIGVyciA9IHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnNpLCBmZW5jZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIFN1Ym1pdCBDQiBhZ2Fpbiwgc2lnbmFsaW5nIHMyLgorICAgIHNpLnBTaWduYWxTZW1hcGhvcmVzID0gJnMyOworICAgIGVyciA9IHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnNpLCBWS19OVUxMX0hBTkRMRSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIFdhaXQgZm9yIGZlbmNlLgorICAgIGVyciA9IHZrOjpXYWl0Rm9yRmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmZlbmNlLCBWS19UUlVFLCBVSU5UNjRfTUFYKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gQ0IgaXMgc3RpbGwgaW4gZmxpZ2h0IGZyb20gc2Vjb25kIHN1Ym1pc3Npb24sIGJ1dCBzZW1hcGhvcmUgczEgaXMgbm8KKyAgICAvLyBsb25nZXIgaW4gZmxpZ2h0LiBkZWxldGUgaXQuCisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzMSwgbnVsbHB0cik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIEZvcmNlIGRldmljZSBpZGxlIGFuZCBjbGVhbiB1cCByZW1haW5pbmcgb2JqZWN0cworICAgIHZrOjpEZXZpY2VXYWl0SWRsZShtX2RldmljZS0+ZGV2aWNlKCkpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgczIsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95RmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCBmZW5jZSwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBGZW5jZUNyZWF0ZVNpZ25hbGVkV2FpdEhhbmRsaW5nKSB7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtSZXN1bHQgZXJyOworCisgICAgLy8gQSBmZW5jZSBjcmVhdGVkIHNpZ25hbGVkCisgICAgVmtGZW5jZUNyZWF0ZUluZm8gZmNpMSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTywgbnVsbHB0ciwgVktfRkVOQ0VfQ1JFQVRFX1NJR05BTEVEX0JJVH07CisgICAgVmtGZW5jZSBmMTsKKyAgICBlcnIgPSB2azo6Q3JlYXRlRmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCAmZmNpMSwgbnVsbHB0ciwgJmYxKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gQSBmZW5jZSBjcmVhdGVkIG5vdAorICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZjaTIgPSB7VktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDB9OworICAgIFZrRmVuY2UgZjI7CisgICAgZXJyID0gdms6OkNyZWF0ZUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZjaTIsIG51bGxwdHIsICZmMik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIFN1Ym1pdCB0aGUgdW5zaWduYWxlZCBmZW5jZQorICAgIFZrU3VibWl0SW5mbyBzaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgbnVsbHB0ciwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisgICAgZXJyID0gdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc2ksIGYyKTsKKworICAgIC8vIFdhaXQgb24gYm90aCBmZW5jZXMsIHdpdGggc2lnbmFsZWQgZmlyc3QuCisgICAgVmtGZW5jZSBmZW5jZXNbXSA9IHtmMSwgZjJ9OworICAgIHZrOjpXYWl0Rm9yRmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMiwgZmVuY2VzLCBWS19UUlVFLCBVSU5UNjRfTUFYKTsKKworICAgIC8vIFNob3VsZCBoYXZlIGJvdGggcmV0aXJlZCEKKyAgICB2azo6RGVzdHJveUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgZjEsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95RmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCBmMiwgbnVsbHB0cik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZUltYWdlVmlld0ZvbGxvd3NQYXJhbWV0ZXJDb21wYXRpYmlsaXR5UmVxdWlyZW1lbnRzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IHRoYXQgY3JlYXRpbmcgYW4gSW1hZ2VWaWV3IHdpdGggdmFsaWQgdXNhZ2UgZG9lcyBub3QgZ2VuZXJhdGUgdmFsaWRhdGlvbiBlcnJvcnMuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltZ0luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfQ1JFQVRFX01VVEFCTEVfRk9STUFUX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RZUEVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTI4LCAxMjgsIDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRH07CisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuaW5pdCgmaW1nSW5mbyk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisgICAgaW1hZ2UudGFyZ2V0VmlldyhWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0pOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgVmFsaWRVc2FnZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlZlcmlmeSB0aGF0IGNyZWF0aW5nIGFuIGltYWdlIHZpZXcgZnJvbSBhbiBpbWFnZSB3aXRoIHZhbGlkIHVzYWdlIGRvZXNuJ3QgZ2VuZXJhdGUgdmFsaWRhdGlvbiBlcnJvcnMiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBjcmVhdGUgYSB2aWV3IHdpdGggdXNhZ2UgSU5QVVRfQVRUQUNITUVOVAorICAgIFZrSW1hZ2VPYmogaW1hZ2UobV9kZXZpY2UpOworICAgIGltYWdlLkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBWa0ltYWdlVmlldyBpbWFnZVZpZXc7CisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGl2Y2kgPSB7fTsKKyAgICBpdmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpdmNpLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKworICAgIHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaXZjaSwgTlVMTCwgJmltYWdlVmlldyk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZVZpZXcsIE5VTEwpOworfQorCisvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdC4gTm8gZmFpbHVyZXMgYXJlIGV4cGVjdGVkLgorVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIEJpbmRTcGFyc2UpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJCaW5kIDIgbWVtb3J5IHJhbmdlcyB0byBvbmUgaW1hZ2UgdXNpbmcgdmtRdWV1ZUJpbmRTcGFyc2UsIGRlc3Ryb3kgdGhlIGltYWdlIGFuZCB0aGVuIGZyZWUgdGhlIG1lbW9yeSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGF1dG8gaW5kZXggPSBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisgICAgaWYgKCEobV9kZXZpY2UtPnF1ZXVlX3Byb3BzW2luZGV4XS5xdWV1ZUZsYWdzICYgVktfUVVFVUVfU1BBUlNFX0JJTkRJTkdfQklUKSkgeworICAgICAgICBwcmludGYoIiVzIEdyYXBoaWNzIHF1ZXVlIGRvZXMgbm90IGhhdmUgc3BhcnNlIGJpbmRpbmcgYml0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkuc3BhcnNlQmluZGluZykgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHNwYXJzZSBiaW5kaW5ncy5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUIHwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCk7CisKKyAgICBWa0ltYWdlIGltYWdlOworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltYWdlX2NyZWF0ZV9pbmZvID0ge307CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9IE5VTEw7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDY0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJmltYWdlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtb3J5X3JlcXM7CisgICAgVmtEZXZpY2VNZW1vcnkgbWVtb3J5X29uZSwgbWVtb3J5X3R3bzsKKyAgICBib29sIHBhc3M7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtb3J5X2luZm8gPSB7fTsKKyAgICBtZW1vcnlfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbW9yeV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBtZW1vcnlfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IDA7CisgICAgbWVtb3J5X2luZm8ubWVtb3J5VHlwZUluZGV4ID0gMDsKKyAgICB2azo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZSwgJm1lbW9yeV9yZXFzKTsKKyAgICAvLyBGaW5kIGFuIGltYWdlIGJpZyBlbm91Z2ggdG8gYWxsb3cgc3BhcnNlIG1hcHBpbmcgb2YgMiBtZW1vcnkgcmVnaW9ucworICAgIC8vIEluY3JlYXNlIHRoZSBpbWFnZSBzaXplIHVudGlsIGl0IGlzIGF0IGxlYXN0IHR3aWNlIHRoZQorICAgIC8vIHNpemUgb2YgdGhlIHJlcXVpcmVkIGFsaWdubWVudCwgdG8gZW5zdXJlIHdlIGNhbiBiaW5kIGJvdGgKKyAgICAvLyBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrcyB0byB0aGUgaW1hZ2Ugb24gYWxpZ25lZCBvZmZzZXRzLgorICAgIHdoaWxlIChtZW1vcnlfcmVxcy5zaXplIDwgKG1lbW9yeV9yZXFzLmFsaWdubWVudCAqIDIpKSB7CisgICAgICAgIHZrOjpEZXN0cm95SW1hZ2UobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZSwgbnVsbHB0cik7CisgICAgICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC53aWR0aCAqPSAyOworICAgICAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ICo9IDI7CisgICAgICAgIGVyciA9IHZrOjpDcmVhdGVJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmltYWdlKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsICZtZW1vcnlfcmVxcyk7CisgICAgfQorICAgIC8vIEFsbG9jYXRlIDIgbWVtb3J5IHJlZ2lvbnMgb2YgbWluaW11bSBhbGlnbm1lbnQgc2l6ZSwgYmluZCBvbmUgYXQgMCwgdGhlIG90aGVyCisgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QKKyAgICBtZW1vcnlfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IG1lbW9yeV9yZXFzLmFsaWdubWVudDsKKyAgICBwYXNzID0gbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1vcnlfcmVxcy5tZW1vcnlUeXBlQml0cywgJm1lbW9yeV9pbmZvLCAwKTsKKyAgICBBU1NFUlRfVFJVRShwYXNzKTsKKyAgICBlcnIgPSB2azo6QWxsb2NhdGVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCAmbWVtb3J5X2luZm8sIE5VTEwsICZtZW1vcnlfb25lKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksICZtZW1vcnlfaW5mbywgTlVMTCwgJm1lbW9yeV90d28pOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgVmtTcGFyc2VNZW1vcnlCaW5kIGJpbmRzWzJdOworICAgIGJpbmRzWzBdLmZsYWdzID0gMDsKKyAgICBiaW5kc1swXS5tZW1vcnkgPSBtZW1vcnlfb25lOworICAgIGJpbmRzWzBdLm1lbW9yeU9mZnNldCA9IDA7CisgICAgYmluZHNbMF0ucmVzb3VyY2VPZmZzZXQgPSAwOworICAgIGJpbmRzWzBdLnNpemUgPSBtZW1vcnlfaW5mby5hbGxvY2F0aW9uU2l6ZTsKKyAgICBiaW5kc1sxXS5mbGFncyA9IDA7CisgICAgYmluZHNbMV0ubWVtb3J5ID0gbWVtb3J5X3R3bzsKKyAgICBiaW5kc1sxXS5tZW1vcnlPZmZzZXQgPSAwOworICAgIGJpbmRzWzFdLnJlc291cmNlT2Zmc2V0ID0gbWVtb3J5X2luZm8uYWxsb2NhdGlvblNpemU7CisgICAgYmluZHNbMV0uc2l6ZSA9IG1lbW9yeV9pbmZvLmFsbG9jYXRpb25TaXplOworCisgICAgVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvIG9wYXF1ZUJpbmRJbmZvOworICAgIG9wYXF1ZUJpbmRJbmZvLmltYWdlID0gaW1hZ2U7CisgICAgb3BhcXVlQmluZEluZm8uYmluZENvdW50ID0gMjsKKyAgICBvcGFxdWVCaW5kSW5mby5wQmluZHMgPSBiaW5kczsKKworICAgIFZrRmVuY2UgZmVuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0JpbmRTcGFyc2VJbmZvIGJpbmRTcGFyc2VJbmZvID0ge307CisgICAgYmluZFNwYXJzZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX1NQQVJTRV9JTkZPOworICAgIGJpbmRTcGFyc2VJbmZvLmltYWdlT3BhcXVlQmluZENvdW50ID0gMTsKKyAgICBiaW5kU3BhcnNlSW5mby5wSW1hZ2VPcGFxdWVCaW5kcyA9ICZvcGFxdWVCaW5kSW5mbzsKKworICAgIHZrOjpRdWV1ZUJpbmRTcGFyc2UobV9kZXZpY2UtPm1fcXVldWUsIDEsICZiaW5kU3BhcnNlSW5mbywgZmVuY2UpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsIE5VTEwpOworICAgIHZrOjpGcmVlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgbWVtb3J5X29uZSwgTlVMTCk7CisgICAgdms6OkZyZWVNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBtZW1vcnlfdHdvLCBOVUxMKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIEJpbmRTcGFyc2VNZXRhZGF0YSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkJpbmQgbWVtb3J5IGZvciB0aGUgbWV0YWRhdGEgYXNwZWN0IG9mIGEgc3BhcnNlIGltYWdlIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgYXV0byBpbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBpZiAoIShtX2RldmljZS0+cXVldWVfcHJvcHNbaW5kZXhdLnF1ZXVlRmxhZ3MgJiBWS19RVUVVRV9TUEFSU0VfQklORElOR19CSVQpKSB7CisgICAgICAgIHByaW50ZigiJXMgR3JhcGhpY3MgcXVldWUgZG9lcyBub3QgaGF2ZSBzcGFyc2UgYmluZGluZyBiaXQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKS5zcGFyc2VSZXNpZGVuY3lJbWFnZTJEKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgc3BhcnNlIHJlc2lkZW5jeSBmb3IgaW1hZ2VzLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQgfCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUKTsKKworICAgIC8vIENyZWF0ZSBhIHNwYXJzZSBpbWFnZQorICAgIFZrSW1hZ2UgaW1hZ2U7CisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSA2NDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfU1BBUlNFX0JJTkRJTkdfQklUIHwgVktfSU1BR0VfQ1JFQVRFX1NQQVJTRV9SRVNJREVOQ1lfQklUOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksICZpbWFnZV9jcmVhdGVfaW5mbywgTlVMTCwgJmltYWdlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gUXVlcnkgaW1hZ2UgbWVtb3J5IHJlcXVpcmVtZW50cworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbW9yeV9yZXFzOworICAgIHZrOjpHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCAmbWVtb3J5X3JlcXMpOworCisgICAgLy8gUXVlcnkgc3BhcnNlIG1lbW9yeSByZXF1aXJlbWVudHMKKyAgICB1aW50MzJfdCBzcGFyc2VfcmVxc19jb3VudCA9IDA7CisgICAgdms6OkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2UsICZzcGFyc2VfcmVxc19jb3VudCwgbnVsbHB0cik7CisgICAgc3RkOjp2ZWN0b3I8VmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cz4gc3BhcnNlX3JlcXMoc3BhcnNlX3JlcXNfY291bnQpOworICAgIHZrOjpHZXRJbWFnZVNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyhtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCAmc3BhcnNlX3JlcXNfY291bnQsIHNwYXJzZV9yZXFzLmRhdGEoKSk7CisKKyAgICAvLyBGaW5kIHJlcXVpcmVtZW50cyBmb3IgbWV0YWRhdGEgYXNwZWN0CisgICAgY29uc3QgVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyAqbWV0YWRhdGFfcmVxcyA9IG51bGxwdHI7CisgICAgZm9yIChhdXRvIGNvbnN0ICZhc3BlY3Rfc3BhcnNlX3JlcXMgOiBzcGFyc2VfcmVxcykgeworICAgICAgICBpZiAoYXNwZWN0X3NwYXJzZV9yZXFzLmZvcm1hdFByb3BlcnRpZXMuYXNwZWN0TWFzayA9PSBWS19JTUFHRV9BU1BFQ1RfTUVUQURBVEFfQklUKSB7CisgICAgICAgICAgICBtZXRhZGF0YV9yZXFzID0gJmFzcGVjdF9zcGFyc2VfcmVxczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbWV0YWRhdGFfcmVxcykgeworICAgICAgICBwcmludGYoIiVzIFNwYXJzZSBpbWFnZSBkb2VzIG5vdCByZXF1aXJlIG1lbW9yeSBmb3IgbWV0YWRhdGEuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbWV0YWRhdGEKKyAgICAgICAgVmtEZXZpY2VNZW1vcnkgbWV0YWRhdGFfbWVtb3J5ID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1ldGFkYXRhX21lbW9yeV9pbmZvID0ge307CisgICAgICAgIG1ldGFkYXRhX21lbW9yeV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgICAgIG1ldGFkYXRhX21lbW9yeV9pbmZvLmFsbG9jYXRpb25TaXplID0gbWV0YWRhdGFfcmVxcy0+aW1hZ2VNaXBUYWlsU2l6ZTsKKyAgICAgICAgbV9kZXZpY2UtPnBoeSgpLnNldF9tZW1vcnlfdHlwZShtZW1vcnlfcmVxcy5tZW1vcnlUeXBlQml0cywgJm1ldGFkYXRhX21lbW9yeV9pbmZvLCAwKTsKKyAgICAgICAgZXJyID0gdms6OkFsbG9jYXRlTWVtb3J5KG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1ldGFkYXRhX21lbW9yeV9pbmZvLCBOVUxMLCAmbWV0YWRhdGFfbWVtb3J5KTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICAvLyBCaW5kIG1ldGFkYXRhCisgICAgICAgIFZrU3BhcnNlTWVtb3J5QmluZCBzcGFyc2VfYmluZCA9IHt9OworICAgICAgICBzcGFyc2VfYmluZC5yZXNvdXJjZU9mZnNldCA9IG1ldGFkYXRhX3JlcXMtPmltYWdlTWlwVGFpbE9mZnNldDsKKyAgICAgICAgc3BhcnNlX2JpbmQuc2l6ZSA9IG1ldGFkYXRhX3JlcXMtPmltYWdlTWlwVGFpbFNpemU7CisgICAgICAgIHNwYXJzZV9iaW5kLm1lbW9yeSA9IG1ldGFkYXRhX21lbW9yeTsKKyAgICAgICAgc3BhcnNlX2JpbmQubWVtb3J5T2Zmc2V0ID0gMDsKKyAgICAgICAgc3BhcnNlX2JpbmQuZmxhZ3MgPSBWS19TUEFSU0VfTUVNT1JZX0JJTkRfTUVUQURBVEFfQklUOworCisgICAgICAgIFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyBvcGFxdWVfYmluZF9pbmZvID0ge307CisgICAgICAgIG9wYXF1ZV9iaW5kX2luZm8uaW1hZ2UgPSBpbWFnZTsKKyAgICAgICAgb3BhcXVlX2JpbmRfaW5mby5iaW5kQ291bnQgPSAxOworICAgICAgICBvcGFxdWVfYmluZF9pbmZvLnBCaW5kcyA9ICZzcGFyc2VfYmluZDsKKworICAgICAgICBWa0JpbmRTcGFyc2VJbmZvIGJpbmRfaW5mbyA9IHt9OworICAgICAgICBiaW5kX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX1NQQVJTRV9JTkZPOworICAgICAgICBiaW5kX2luZm8uaW1hZ2VPcGFxdWVCaW5kQ291bnQgPSAxOworICAgICAgICBiaW5kX2luZm8ucEltYWdlT3BhcXVlQmluZHMgPSAmb3BhcXVlX2JpbmRfaW5mbzsKKworICAgICAgICB2azo6UXVldWVCaW5kU3BhcnNlKG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmYmluZF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIC8vIENsZWFudXAKKyAgICAgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgICAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIG1ldGFkYXRhX21lbW9yeSwgTlVMTCk7CisgICAgfQorCisgICAgdms6OkRlc3Ryb3lJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIEZyYW1lYnVmZmVyQmluZGluZ0Rlc3Ryb3lDb21tYW5kUG9vbCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUaGlzIHRlc3Qgc2hvdWxkIHBhc3MuIENyZWF0ZSBhIEZyYW1lYnVmZmVyIGFuZCBjb21tYW5kIGJ1ZmZlciwgYmluZCB0aGVtIHRvZ2V0aGVyLCB0aGVuIGRlc3Ryb3kgY29tbWFuZCBwb29sIGFuZCAiCisgICAgICAgICJmcmFtZWJ1ZmZlciBhbmQgdmVyaWZ5IHRoZXJlIGFyZSBubyBlcnJvcnMuIik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIC8vIEEgcmVuZGVycGFzcyB3aXRoIG9uZSBjb2xvciBhdHRhY2htZW50LgorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnQgPSB7MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9OworCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGF0dF9yZWYgPSB7MCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH07CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0gezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDEsICZhdHRfcmVmLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMSwgJmF0dGFjaG1lbnQsIDEsICZzdWJwYXNzLCAwLCBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBBIGNvbXBhdGlibGUgZnJhbWVidWZmZXIuCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKworICAgIFZrSW1hZ2VWaWV3IHZpZXcgPSBpbWFnZS50YXJnZXRWaWV3KFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSk7CisKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIHJwLCAxLCAmdmlldywgMzIsIDMyLCAxfTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZiOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEV4cGxpY2l0bHkgY3JlYXRlIGEgY29tbWFuZCBidWZmZXIgdG8gYmluZCB0aGUgRkIgdG8gc28gdGhhdCB3ZSBjYW4gdGhlbgorICAgIC8vICBkZXN0cm95IHRoZSBjb21tYW5kIHBvb2wgaW4gb3JkZXIgdG8gaW1wbGljaXRseSBmcmVlIGNvbW1hbmQgYnVmZmVyCisgICAgVmtDb21tYW5kUG9vbCBjb21tYW5kX3Bvb2w7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gcG9vbF9jcmVhdGVfaW5mb3t9OworICAgIHBvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk87CisgICAgcG9vbF9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIHBvb2xfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICB2azo6Q3JlYXRlQ29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmNvbW1hbmRfcG9vbCk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXI7CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm97fTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRQb29sID0gY29tbWFuZF9wb29sOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksICZjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLCAmY29tbWFuZF9idWZmZXIpOworCisgICAgLy8gQmVnaW4gb3VyIGNtZCBidWZmZXIgd2l0aCByZW5kZXJwYXNzIHVzaW5nIG91ciBmcmFtZWJ1ZmZlcgorICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBycGJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sIG51bGxwdHIsIHJwLCBmYiwge3swLCAwfSwgezMyLCAzMn19LCAwLCBudWxscHRyfTsKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5faW5mb3t9OworICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXIsICZiZWdpbl9pbmZvKTsKKworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZF9idWZmZXIsICZycGJpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MoY29tbWFuZF9idWZmZXIpOworICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyKTsKKyAgICAvLyBEZXN0cm95IGNvbW1hbmQgcG9vbCB0byBpbXBsaWNpdGx5IGZyZWUgY29tbWFuZCBidWZmZXIKKyAgICB2azo6RGVzdHJveUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIEZyYW1lYnVmZmVyQ3JlYXRlRGVwdGhTdGVuY2lsTGF5b3V0VHJhbnNpdGlvbkZvckRlcHRoT25seUltYWdlVmlldykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJWYWxpZGF0ZSB0aGF0IHdoZW4gYW4gaW1hZ2VWaWV3IG9mIGEgZGVwdGgvc3RlbmNpbCBpbWFnZSBpcyB1c2VkIGFzIGEgZGVwdGgvc3RlbmNpbCBmcmFtZWJ1ZmZlciBhdHRhY2htZW50LCB0aGUgIgorICAgICAgICAiYXNwZWN0TWFzayBpcyBpZ25vcmVkIGFuZCBib3RoIGRlcHRoIGFuZCBzdGVuY2lsIGltYWdlIHN1YnJlc291cmNlcyBhcmUgdXNlZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wZXJ0aWVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoZ3B1KCksIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQsICZmb3JtYXRfcHJvcGVydGllcyk7CisgICAgaWYgKCEoZm9ybWF0X3Byb3BlcnRpZXMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQpKSB7CisgICAgICAgIHByaW50ZigiJXMgSW1hZ2UgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgc2FtcGxpbmcuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudCA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMfTsKKworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRfcmVmID0gezAsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTH07CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0gezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIG51bGxwdHIsICZhdHRfcmVmLCAwLCBudWxscHRyfTsKKworICAgIFZrU3VicGFzc0RlcGVuZGVuY3kgZGVwID0gezAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUfTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMSwgJmF0dGFjaG1lbnQsIDEsICZzdWJwYXNzLCAxLCAmZGVwfTsKKworICAgIFZrUmVzdWx0IGVycjsKKyAgICBWa1JlbmRlclBhc3MgcnA7CisgICAgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgbnVsbHB0ciwgJnJwKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdE5vTGF5b3V0KDMyLCAzMiwgMSwgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgMHgyNiwgIC8vIHVzYWdlCisgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBpbWFnZS5TZXRMYXlvdXQoMHg2LCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwpOworCisgICAgVmtJbWFnZVZpZXcgdmlldyA9IGltYWdlLnRhcmdldFZpZXcoVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVCwgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCk7CisKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIHJwLCAxLCAmdmlldywgMzIsIDMyLCAxfTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZiOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltYiA9IHt9OworICAgIGltYi5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSOworICAgIGltYi5wTmV4dCA9IG51bGxwdHI7CisgICAgaW1iLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1dSSVRFX0JJVDsKKyAgICBpbWIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQ7CisgICAgaW1iLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBpbWIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDsKKyAgICBpbWIuc3JjUXVldWVGYW1pbHlJbmRleCA9IDA7CisgICAgaW1iLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSAwOworICAgIGltYi5pbWFnZSA9IGltYWdlLmhhbmRsZSgpOworICAgIGltYi5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSAweDY7CisgICAgaW1iLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWIuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMHgxOworICAgIGltYi5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBpbWIuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMHgxOworCisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9FQVJMWV9GUkFHTUVOVF9URVNUU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklULCBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbWIpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPlF1ZXVlQ29tbWFuZEJ1ZmZlcihmYWxzZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKK30KKworLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QuICBObyBlcnJvcnMgc2hvdWxkIGJlIGdlbmVyYXRlZC4KK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBCYXJyaWVyTGF5b3V0VG9JbWFnZVVzYWdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiRW5zdXJlIGJhcnJpZXJzJyBuZXcgYW5kIG9sZCBWa0ltYWdlTGF5b3V0IGFyZSBjb21wYXRpYmxlIHdpdGggdGhlaXIgaW1hZ2VzJyBWa0ltYWdlVXNhZ2VGbGFncyIpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgYXV0byBkZXB0aF9mb3JtYXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBpZiAoIWRlcHRoX2Zvcm1hdCkgeworICAgICAgICBwcmludGYoIiVzIE5vIERlcHRoICsgU3RlbmNpbCBmb3JtYXQgZm91bmQuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltZ19iYXJyaWVyID0ge307CisgICAgaW1nX2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUjsKKyAgICBpbWdfYmFycmllci5wTmV4dCA9IE5VTEw7CisgICAgaW1nX2JhcnJpZXIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19IT1NUX1dSSVRFX0JJVDsKKyAgICBpbWdfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1NIQURFUl9SRUFEX0JJVDsKKyAgICBpbWdfYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisgICAgaW1nX2JhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisKKyAgICB7CisgICAgICAgIFZrSW1hZ2VPYmogaW1nX2NvbG9yKG1fZGV2aWNlKTsKKyAgICAgICAgaW1nX2NvbG9yLkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW1nX2NvbG9yLmluaXRpYWxpemVkKCkpOworCisgICAgICAgIFZrSW1hZ2VPYmogaW1nX2RzMShtX2RldmljZSk7CisgICAgICAgIGltZ19kczEuSW5pdCgxMjgsIDEyOCwgMSwgZGVwdGhfZm9ybWF0LCBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltZ19kczEuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgVmtJbWFnZU9iaiBpbWdfZHMyKG1fZGV2aWNlKTsKKyAgICAgICAgaW1nX2RzMi5Jbml0KDEyOCwgMTI4LCAxLCBkZXB0aF9mb3JtYXQsIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW1nX2RzMi5pbml0aWFsaXplZCgpKTsKKworICAgICAgICBWa0ltYWdlT2JqIGltZ194ZmVyX3NyYyhtX2RldmljZSk7CisgICAgICAgIGltZ194ZmVyX3NyYy5Jbml0KDEyOCwgMTI4LCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW1nX3hmZXJfc3JjLmluaXRpYWxpemVkKCkpOworCisgICAgICAgIFZrSW1hZ2VPYmogaW1nX3hmZXJfZHN0KG1fZGV2aWNlKTsKKyAgICAgICAgaW1nX3hmZXJfZHN0LkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworICAgICAgICBBU1NFUlRfVFJVRShpbWdfeGZlcl9kc3QuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgVmtJbWFnZU9iaiBpbWdfc2FtcGxlZChtX2RldmljZSk7CisgICAgICAgIGltZ19zYW1wbGVkLkluaXQoMzIsIDMyLCAxLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltZ19zYW1wbGVkLmluaXRpYWxpemVkKCkpOworCisgICAgICAgIFZrSW1hZ2VPYmogaW1nX2lucHV0KG1fZGV2aWNlKTsKKyAgICAgICAgaW1nX2lucHV0LkluaXQoMTI4LCAxMjgsIDEsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfSU5QVVRfQVRUQUNITUVOVF9CSVQsIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW1nX2lucHV0LmluaXRpYWxpemVkKCkpOworCisgICAgICAgIGNvbnN0IHN0cnVjdCB7CisgICAgICAgICAgICBWa0ltYWdlT2JqICZpbWFnZV9vYmo7CisgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IG9sZF9sYXlvdXQ7CisgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IG5ld19sYXlvdXQ7CisgICAgICAgIH0gYnVmZmVyX2xheW91dHNbXSA9IHsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgICAgICAgIHtpbWdfY29sb3IsICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9LAorICAgICAgICAgICAge2ltZ19kczEsICAgICAgVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTH0sCisgICAgICAgICAgICB7aW1nX2RzMiwgICAgICBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCwgIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMfSwKKyAgICAgICAgICAgIHtpbWdfc2FtcGxlZCwgIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUwsICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9LAorICAgICAgICAgICAge2ltZ19pbnB1dCwgICAgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCwgICAgICAgICBWS19JTUFHRV9MQVlPVVRfR0VORVJBTH0sCisgICAgICAgICAgICB7aW1nX3hmZXJfc3JjLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMfSwKKyAgICAgICAgICAgIHtpbWdfeGZlcl9kc3QsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUx9LAorICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGxheW91dF9jb3VudCA9IHNpemVvZihidWZmZXJfbGF5b3V0cykgLyBzaXplb2YoYnVmZmVyX2xheW91dHNbMF0pOworCisgICAgICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dF9jb3VudDsgKytpKSB7CisgICAgICAgICAgICBpbWdfYmFycmllci5pbWFnZSA9IGJ1ZmZlcl9sYXlvdXRzW2ldLmltYWdlX29iai5oYW5kbGUoKTsKKyAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlID0gYnVmZmVyX2xheW91dHNbaV0uaW1hZ2Vfb2JqLnVzYWdlKCk7CisgICAgICAgICAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSAodXNhZ2UgPT0gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKworICAgICAgICAgICAgaW1nX2JhcnJpZXIub2xkTGF5b3V0ID0gYnVmZmVyX2xheW91dHNbaV0ub2xkX2xheW91dDsKKyAgICAgICAgICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IGJ1ZmZlcl9sYXlvdXRzW2ldLm5ld19sYXlvdXQ7CisgICAgICAgICAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltZ19iYXJyaWVyKTsKKworICAgICAgICAgICAgaW1nX2JhcnJpZXIub2xkTGF5b3V0ID0gYnVmZmVyX2xheW91dHNbaV0ubmV3X2xheW91dDsKKyAgICAgICAgICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IGJ1ZmZlcl9sYXlvdXRzW2ldLm9sZF9sYXlvdXQ7CisgICAgICAgICAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltZ19iYXJyaWVyKTsKKyAgICAgICAgfQorICAgICAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworCisgICAgICAgIGltZ19iYXJyaWVyLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgICAgICBpbWdfYmFycmllci5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKKyAgICB9CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKKy8vIFRoaXMgaXMgYSBwb3NpdGl2ZSB0ZXN0LiAgTm8gZXJyb3JzIHNob3VsZCBiZSBnZW5lcmF0ZWQuCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgV2FpdEV2ZW50VGhlblNldCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIldhaXQgb24gYSBldmVudCB0aGVuIHNldCBpdCBhZnRlciB0aGUgd2FpdCBoYXMgYmVlbiBzdWJtaXR0ZWQuIik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBWa0V2ZW50IGV2ZW50OworICAgIFZrRXZlbnRDcmVhdGVJbmZvIGV2ZW50X2NyZWF0ZV9pbmZve307CisgICAgZXZlbnRfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTzsKKyAgICB2azo6Q3JlYXRlRXZlbnQobV9kZXZpY2UtPmRldmljZSgpLCAmZXZlbnRfY3JlYXRlX2luZm8sIG51bGxwdHIsICZldmVudCk7CisKKyAgICBWa0NvbW1hbmRQb29sIGNvbW1hbmRfcG9vbDsKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZve307CisgICAgcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisgICAgcG9vbF9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZwb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY29tbWFuZF9wb29sKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlcjsKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mb3t9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBjb21tYW5kX3Bvb2w7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8ubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworICAgIHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8sICZjb21tYW5kX2J1ZmZlcik7CisKKyAgICBWa1F1ZXVlIHF1ZXVlID0gVktfTlVMTF9IQU5ETEU7CisgICAgdms6OkdldERldmljZVF1ZXVlKG1fZGV2aWNlLT5kZXZpY2UoKSwgbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfLCAwLCAmcXVldWUpOworCisgICAgeworICAgICAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5faW5mb3t9OworICAgICAgICBiZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICAgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlciwgJmJlZ2luX2luZm8pOworCisgICAgICAgIHZrOjpDbWRXYWl0RXZlbnRzKGNvbW1hbmRfYnVmZmVyLCAxLCAmZXZlbnQsIFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklULCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyKTsKKyAgICAgICAgdms6OkNtZFJlc2V0RXZlbnQoY29tbWFuZF9idWZmZXIsIGV2ZW50LCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUKTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXIpOworICAgIH0KKyAgICB7CisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb3t9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZF9idWZmZXI7CisgICAgICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICAgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSBudWxscHRyOworICAgICAgICB2azo6UXVldWVTdWJtaXQocXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIH0KKyAgICB7IHZrOjpTZXRFdmVudChtX2RldmljZS0+ZGV2aWNlKCksIGV2ZW50KTsgfQorCisgICAgdms6OlF1ZXVlV2FpdElkbGUocXVldWUpOworCisgICAgdms6OkRlc3Ryb3lFdmVudChtX2RldmljZS0+ZGV2aWNlKCksIGV2ZW50LCBudWxscHRyKTsKKyAgICB2azo6RnJlZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCAxLCAmY29tbWFuZF9idWZmZXIpOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdC4gIE5vIGVycm9ycyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFF1ZXJ5QW5kQ29weVNlY29uZGFyeUNvbW1hbmRCdWZmZXJzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiSXNzdWUgYSBxdWVyeSBvbiBhIHNlY29uZGFyeSBjb21tYW5kIGJ1ZmZlciBhbmQgY29weSBpdCBvbiBhIHByaW1hcnkuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIGlmICgobV9kZXZpY2UtPnF1ZXVlX3Byb3BzLmVtcHR5KCkpIHx8IChtX2RldmljZS0+cXVldWVfcHJvcHNbMF0ucXVldWVDb3VudCA8IDIpKSB7CisgICAgICAgIHByaW50ZigiJXMgUXVldWUgZmFtaWx5IG5lZWRzIHRvIGhhdmUgbXVsdGlwbGUgcXVldWVzIHRvIHJ1biB0aGlzIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgVmtRdWVyeVBvb2wgcXVlcnlfcG9vbDsKKyAgICBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gcXVlcnlfcG9vbF9jcmVhdGVfaW5mb3t9OworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9RVUVSWV9QT09MX0NSRUFURV9JTkZPOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9USU1FU1RBTVA7CisgICAgcXVlcnlfcG9vbF9jcmVhdGVfaW5mby5xdWVyeUNvdW50ID0gMTsKKyAgICB2azo6Q3JlYXRlUXVlcnlQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKworICAgIFZrQ29tbWFuZFBvb2xPYmogY29tbWFuZF9wb29sKG1fZGV2aWNlLCBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8sIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKTsKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogcHJpbWFyeV9idWZmZXIobV9kZXZpY2UsICZjb21tYW5kX3Bvb2wpOworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBzZWNvbmRhcnlfYnVmZmVyKG1fZGV2aWNlLCAmY29tbWFuZF9wb29sLCBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9TRUNPTkRBUlkpOworCisgICAgVmtRdWV1ZSBxdWV1ZSA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpHZXREZXZpY2VRdWV1ZShtX2RldmljZS0+ZGV2aWNlKCksIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XywgMSwgJnF1ZXVlKTsKKworICAgIHVpbnQzMl90IHFmaSA9IDA7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZfY3JlYXRlX2luZm8gPSB7fTsKKyAgICBidWZmX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1ZmZfY3JlYXRlX2luZm8uc2l6ZSA9IDEwMjQ7CisgICAgYnVmZl9jcmVhdGVfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUOworICAgIGJ1ZmZfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICBidWZmX2NyZWF0ZV9pbmZvLnBRdWV1ZUZhbWlseUluZGljZXMgPSAmcWZpOworCisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0KCptX2RldmljZSwgYnVmZl9jcmVhdGVfaW5mbyk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gaGluZm8gPSB7fTsKKyAgICBoaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk87CisgICAgaGluZm8ucmVuZGVyUGFzcyA9IFZLX05VTExfSEFORExFOworICAgIGhpbmZvLnN1YnBhc3MgPSAwOworICAgIGhpbmZvLmZyYW1lYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgICAgaGluZm8ub2NjbHVzaW9uUXVlcnlFbmFibGUgPSBWS19GQUxTRTsKKyAgICBoaW5mby5xdWVyeUZsYWdzID0gMDsKKyAgICBoaW5mby5waXBlbGluZVN0YXRpc3RpY3MgPSAwOworCisgICAgeworICAgICAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5faW5mb3t9OworICAgICAgICBiZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICAgICAgYmVnaW5faW5mby5wSW5oZXJpdGFuY2VJbmZvID0gJmhpbmZvOworICAgICAgICBzZWNvbmRhcnlfYnVmZmVyLmJlZ2luKCZiZWdpbl9pbmZvKTsKKyAgICAgICAgdms6OkNtZFJlc2V0UXVlcnlQb29sKHNlY29uZGFyeV9idWZmZXIuaGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDEpOworICAgICAgICB2azo6Q21kV3JpdGVUaW1lc3RhbXAoc2Vjb25kYXJ5X2J1ZmZlci5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0dSQVBISUNTX0JJVCwgcXVlcnlfcG9vbCwgMCk7CisgICAgICAgIHNlY29uZGFyeV9idWZmZXIuZW5kKCk7CisKKyAgICAgICAgcHJpbWFyeV9idWZmZXIuYmVnaW4oKTsKKyAgICAgICAgdms6OkNtZEV4ZWN1dGVDb21tYW5kcyhwcmltYXJ5X2J1ZmZlci5oYW5kbGUoKSwgMSwgJnNlY29uZGFyeV9idWZmZXIuaGFuZGxlKCkpOworICAgICAgICB2azo6Q21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMocHJpbWFyeV9idWZmZXIuaGFuZGxlKCksIHF1ZXJ5X3Bvb2wsIDAsIDEsIGJ1ZmZlci5oYW5kbGUoKSwgMCwgMCwgVktfUVVFUllfUkVTVUxUX1dBSVRfQklUKTsKKyAgICAgICAgcHJpbWFyeV9idWZmZXIuZW5kKCk7CisgICAgfQorCisgICAgcHJpbWFyeV9idWZmZXIuUXVldWVDb21tYW5kQnVmZmVyKCk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUocXVldWUpOworCisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBudWxscHRyKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QuICBObyBlcnJvcnMgc2hvdWxkIGJlIGdlbmVyYXRlZC4KK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBRdWVyeUFuZENvcHlNdWx0aXBsZUNvbW1hbmRCdWZmZXJzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiSXNzdWUgYSBxdWVyeSBhbmQgY29weSBmcm9tIGl0IG9uIGEgc2Vjb25kIGNvbW1hbmQgYnVmZmVyLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBpZiAoKG1fZGV2aWNlLT5xdWV1ZV9wcm9wcy5lbXB0eSgpKSB8fCAobV9kZXZpY2UtPnF1ZXVlX3Byb3BzWzBdLnF1ZXVlQ291bnQgPCAyKSkgeworICAgICAgICBwcmludGYoIiVzIFF1ZXVlIGZhbWlseSBuZWVkcyB0byBoYXZlIG11bHRpcGxlIHF1ZXVlcyB0byBydW4gdGhpcyB0ZXN0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm97fTsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlDb3VudCA9IDE7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisKKyAgICBWa0NvbW1hbmRQb29sIGNvbW1hbmRfcG9vbDsKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZve307CisgICAgcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisgICAgcG9vbF9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZwb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY29tbWFuZF9wb29sKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlclsyXTsKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mb3t9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBjb21tYW5kX3Bvb2w7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAyOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8ubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworICAgIHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8sIGNvbW1hbmRfYnVmZmVyKTsKKworICAgIFZrUXVldWUgcXVldWUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6R2V0RGV2aWNlUXVldWUobV9kZXZpY2UtPmRldmljZSgpLCBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8sIDEsICZxdWV1ZSk7CisKKyAgICB1aW50MzJfdCBxZmkgPSAwOworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmX2NyZWF0ZV9pbmZvID0ge307CisgICAgYnVmZl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZmX2NyZWF0ZV9pbmZvLnNpemUgPSAxMDI0OworICAgIGJ1ZmZfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBidWZmX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDE7CisgICAgYnVmZl9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBidWZmZXIuaW5pdCgqbV9kZXZpY2UsIGJ1ZmZfY3JlYXRlX2luZm8pOworCisgICAgeworICAgICAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5faW5mb3t9OworICAgICAgICBiZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICAgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclswXSwgJmJlZ2luX2luZm8pOworCisgICAgICAgIHZrOjpDbWRSZXNldFF1ZXJ5UG9vbChjb21tYW5kX2J1ZmZlclswXSwgcXVlcnlfcG9vbCwgMCwgMSk7CisgICAgICAgIHZrOjpDbWRXcml0ZVRpbWVzdGFtcChjb21tYW5kX2J1ZmZlclswXSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0dSQVBISUNTX0JJVCwgcXVlcnlfcG9vbCwgMCk7CisKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0pOworCisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMV0sICZiZWdpbl9pbmZvKTsKKworICAgICAgICB2azo6Q21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoY29tbWFuZF9idWZmZXJbMV0sIHF1ZXJ5X3Bvb2wsIDAsIDEsIGJ1ZmZlci5oYW5kbGUoKSwgMCwgMCwgVktfUVVFUllfUkVTVUxUX1dBSVRfQklUKTsKKworICAgICAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclsxXSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZve307CisgICAgICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDI7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9IGNvbW1hbmRfYnVmZmVyOworICAgICAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gbnVsbHB0cjsKKyAgICAgICAgdms6OlF1ZXVlU3VibWl0KHF1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICB9CisKKyAgICB2azo6UXVldWVXYWl0SWRsZShxdWV1ZSk7CisKKyAgICB2azo6RGVzdHJveVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksIHF1ZXJ5X3Bvb2wsIG51bGxwdHIpOworICAgIHZrOjpGcmVlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIDIsIGNvbW1hbmRfYnVmZmVyKTsKKyAgICB2azo6RGVzdHJveUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCBOVUxMKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCisvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdC4gIE5vIGVycm9ycyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFR3b0ZlbmNlc1RocmVlRnJhbWVzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlR3byBjb21tYW5kIGJ1ZmZlcnMgd2l0aCB0d28gc2VwYXJhdGUgZmVuY2VzIGFyZSBlYWNoIHJ1biB0aHJvdWdoIGEgU3VibWl0ICYgV2FpdEZvckZlbmNlcyBjeWNsZSAzIHRpbWVzLiBUaGlzIHByZXZpb3VzbHkgIgorICAgICAgICAicmV2ZWFsZWQgYSBidWcgc28gcnVubmluZyB0aGlzIHBvc2l0aXZlIHRlc3QgdG8gcHJldmVudCBhIHJlZ3Jlc3Npb24uIik7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtRdWV1ZSBxdWV1ZSA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpHZXREZXZpY2VRdWV1ZShtX2RldmljZS0+ZGV2aWNlKCksIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XywgMCwgJnF1ZXVlKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBOVU1fT0JKRUNUUyA9IDI7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE5VTV9GUkFNRVMgPSAzOworICAgIFZrQ29tbWFuZEJ1ZmZlciBjbWRfYnVmZmVyc1tOVU1fT0JKRUNUU10gPSB7fTsKKyAgICBWa0ZlbmNlIGZlbmNlc1tOVU1fT0JKRUNUU10gPSB7fTsKKworICAgIFZrQ29tbWFuZFBvb2wgY21kX3Bvb2w7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gY21kX3Bvb2xfY2kgPSB7fTsKKyAgICBjbWRfcG9vbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBjbWRfcG9vbF9jaS5xdWV1ZUZhbWlseUluZGV4ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIGNtZF9wb29sX2NpLmZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNtZF9wb29sX2NpLCBudWxscHRyLCAmY21kX3Bvb2wpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY21kX2J1Zl9pbmZvID0ge307CisgICAgY21kX2J1Zl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICBjbWRfYnVmX2luZm8uY29tbWFuZFBvb2wgPSBjbWRfcG9vbDsKKyAgICBjbWRfYnVmX2luZm8ubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworICAgIGNtZF9idWZfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworCisgICAgVmtGZW5jZUNyZWF0ZUluZm8gZmVuY2VfY2kgPSB7fTsKKyAgICBmZW5jZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPOworICAgIGZlbmNlX2NpLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBmZW5jZV9jaS5mbGFncyA9IDA7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTlVNX09CSkVDVFM7ICsraSkgeworICAgICAgICBlcnIgPSB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksICZjbWRfYnVmX2luZm8sICZjbWRfYnVmZmVyc1tpXSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIGVyciA9IHZrOjpDcmVhdGVGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksICZmZW5jZV9jaSwgbnVsbHB0ciwgJmZlbmNlc1tpXSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBmcmFtZSA9IDA7IGZyYW1lIDwgTlVNX0ZSQU1FUzsgKytmcmFtZSkgeworICAgICAgICBmb3IgKHVpbnQzMl90IG9iaiA9IDA7IG9iaiA8IE5VTV9PQkpFQ1RTOyArK29iaikgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGVtcHR5IGNtZCBidWZmZXIKKyAgICAgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjbWRCdWZCZWdpbkRlc2MgPSB7fTsKKyAgICAgICAgICAgIGNtZEJ1ZkJlZ2luRGVzYy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisKKyAgICAgICAgICAgIGVyciA9IHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY21kX2J1ZmZlcnNbb2JqXSwgJmNtZEJ1ZkJlZ2luRGVzYyk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICAgICAgZXJyID0gdms6OkVuZENvbW1hbmRCdWZmZXIoY21kX2J1ZmZlcnNbb2JqXSk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm8gPSB7fTsKKyAgICAgICAgICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICAgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNtZF9idWZmZXJzW29ial07CisgICAgICAgICAgICAvLyBTdWJtaXQgY21kIGJ1ZmZlciBhbmQgd2FpdCBmb3IgZmVuY2UKKyAgICAgICAgICAgIGVyciA9IHZrOjpRdWV1ZVN1Ym1pdChxdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBmZW5jZXNbb2JqXSk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICAgICAgZXJyID0gdms6OldhaXRGb3JGZW5jZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZmVuY2VzW29ial0sIFZLX1RSVUUsIFVJTlQ2NF9NQVgpOworICAgICAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICAgICAgICAgIGVyciA9IHZrOjpSZXNldEZlbmNlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZmZW5jZXNbb2JqXSk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICB9CisgICAgfQorICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBjbWRfcG9vbCwgTlVMTCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE5VTV9PQkpFQ1RTOyArK2kpIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIGZlbmNlc1tpXSwgbnVsbHB0cik7CisgICAgfQorfQorLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QuICBObyBlcnJvcnMgc2hvdWxkIGJlIGdlbmVyYXRlZC4KK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBUd29RdWV1ZVN1Ym1pdHNTZXBhcmF0ZVF1ZXVlc1dpdGhTZW1hcGhvcmVBbmRPbmVGZW5jZVFXSSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUd28gY29tbWFuZCBidWZmZXJzLCBlYWNoIGluIGEgc2VwYXJhdGUgUXVldWVTdWJtaXQgY2FsbCBzdWJtaXR0ZWQgb24gc2VwYXJhdGUgcXVldWVzIGZvbGxvd2VkIGJ5IGEgUXVldWVXYWl0SWRsZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgaWYgKChtX2RldmljZS0+cXVldWVfcHJvcHMuZW1wdHkoKSkgfHwgKG1fZGV2aWNlLT5xdWV1ZV9wcm9wc1swXS5xdWV1ZUNvdW50IDwgMikpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBRdWV1ZSBmYW1pbHkgbmVlZHMgdG8gaGF2ZSBtdWx0aXBsZSBxdWV1ZXMgdG8gcnVuIHRoaXMgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNlbWFwaG9yZV9jcmVhdGVfaW5mb3t9OworICAgIHNlbWFwaG9yZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTzsKKyAgICB2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZSk7CisKKyAgICBWa0NvbW1hbmRQb29sIGNvbW1hbmRfcG9vbDsKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZve307CisgICAgcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisgICAgcG9vbF9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZwb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY29tbWFuZF9wb29sKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlclsyXTsKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mb3t9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBjb21tYW5kX3Bvb2w7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAyOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8ubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworICAgIHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8sIGNvbW1hbmRfYnVmZmVyKTsKKworICAgIFZrUXVldWUgcXVldWUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6R2V0RGV2aWNlUXVldWUobV9kZXZpY2UtPmRldmljZSgpLCBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8sIDEsICZxdWV1ZSk7CisKKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzBdLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihjb21tYW5kX2J1ZmZlclswXSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0e307CisgICAgICAgIHZpZXdwb3J0Lm1heERlcHRoID0gMS4wZjsKKyAgICAgICAgdmlld3BvcnQubWluRGVwdGggPSAwLjBmOworICAgICAgICB2aWV3cG9ydC53aWR0aCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQuaGVpZ2h0ID0gNTEyOworICAgICAgICB2aWV3cG9ydC54ID0gMDsKKyAgICAgICAgdmlld3BvcnQueSA9IDA7CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChjb21tYW5kX2J1ZmZlclswXSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0pOworICAgIH0KKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzFdLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHt9OworICAgICAgICB2aWV3cG9ydC5tYXhEZXB0aCA9IDEuMGY7CisgICAgICAgIHZpZXdwb3J0Lm1pbkRlcHRoID0gMC4wZjsKKyAgICAgICAgdmlld3BvcnQud2lkdGggPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LmhlaWdodCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQueCA9IDA7CisgICAgICAgIHZpZXdwb3J0LnkgPSAwOworICAgICAgICB2azo6Q21kU2V0Vmlld3BvcnQoY29tbWFuZF9idWZmZXJbMV0sIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzFdKTsKKyAgICB9CisgICAgeworICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm97fTsKKyAgICAgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyWzBdOworICAgICAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKyAgICAgICAgdms6OlF1ZXVlU3VibWl0KHF1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICB9CisgICAgeworICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBmbGFnc1tde1ZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVR9OworICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm97fTsKKyAgICAgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyWzFdOworICAgICAgICBzdWJtaXRfaW5mby53YWl0U2VtYXBob3JlQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworICAgICAgICBzdWJtaXRfaW5mby5wV2FpdERzdFN0YWdlTWFzayA9IGZsYWdzOworICAgICAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIH0KKworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlLCBudWxscHRyKTsKKyAgICB2azo6RnJlZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCAyLCAmY29tbWFuZF9idWZmZXJbMF0pOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKKy8vIFRoaXMgaXMgYSBwb3NpdGl2ZSB0ZXN0LiAgTm8gZXJyb3JzIHNob3VsZCBiZSBnZW5lcmF0ZWQuCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgVHdvUXVldWVTdWJtaXRzU2VwYXJhdGVRdWV1ZXNXaXRoU2VtYXBob3JlQW5kT25lRmVuY2VRV0lGZW5jZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUd28gY29tbWFuZCBidWZmZXJzLCBlYWNoIGluIGEgc2VwYXJhdGUgUXVldWVTdWJtaXQgY2FsbCBzdWJtaXR0ZWQgb24gc2VwYXJhdGUgcXVldWVzLCB0aGUgc2Vjb25kIGhhdmluZyBhIGZlbmNlIGZvbGxvd2VkICIKKyAgICAgICAgImJ5IGEgUXVldWVXYWl0SWRsZS4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgaWYgKChtX2RldmljZS0+cXVldWVfcHJvcHMuZW1wdHkoKSkgfHwgKG1fZGV2aWNlLT5xdWV1ZV9wcm9wc1swXS5xdWV1ZUNvdW50IDwgMikpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBRdWV1ZSBmYW1pbHkgbmVlZHMgdG8gaGF2ZSBtdWx0aXBsZSBxdWV1ZXMgdG8gcnVuIHRoaXMgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZlbmNlX2NyZWF0ZV9pbmZve307CisgICAgZmVuY2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTzsKKyAgICB2azo6Q3JlYXRlRmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCAmZmVuY2VfY3JlYXRlX2luZm8sIG51bGxwdHIsICZmZW5jZSk7CisKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNlbWFwaG9yZV9jcmVhdGVfaW5mb3t9OworICAgIHNlbWFwaG9yZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTzsKKyAgICB2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZSk7CisKKyAgICBWa0NvbW1hbmRQb29sIGNvbW1hbmRfcG9vbDsKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZve307CisgICAgcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisgICAgcG9vbF9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZwb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY29tbWFuZF9wb29sKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlclsyXTsKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mb3t9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBjb21tYW5kX3Bvb2w7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAyOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8ubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworICAgIHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8sIGNvbW1hbmRfYnVmZmVyKTsKKworICAgIFZrUXVldWUgcXVldWUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6R2V0RGV2aWNlUXVldWUobV9kZXZpY2UtPmRldmljZSgpLCBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8sIDEsICZxdWV1ZSk7CisKKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzBdLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihjb21tYW5kX2J1ZmZlclswXSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0e307CisgICAgICAgIHZpZXdwb3J0Lm1heERlcHRoID0gMS4wZjsKKyAgICAgICAgdmlld3BvcnQubWluRGVwdGggPSAwLjBmOworICAgICAgICB2aWV3cG9ydC53aWR0aCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQuaGVpZ2h0ID0gNTEyOworICAgICAgICB2aWV3cG9ydC54ID0gMDsKKyAgICAgICAgdmlld3BvcnQueSA9IDA7CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChjb21tYW5kX2J1ZmZlclswXSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0pOworICAgIH0KKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzFdLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHt9OworICAgICAgICB2aWV3cG9ydC5tYXhEZXB0aCA9IDEuMGY7CisgICAgICAgIHZpZXdwb3J0Lm1pbkRlcHRoID0gMC4wZjsKKyAgICAgICAgdmlld3BvcnQud2lkdGggPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LmhlaWdodCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQueCA9IDA7CisgICAgICAgIHZpZXdwb3J0LnkgPSAwOworICAgICAgICB2azo6Q21kU2V0Vmlld3BvcnQoY29tbWFuZF9idWZmZXJbMV0sIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzFdKTsKKyAgICB9CisgICAgeworICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm97fTsKKyAgICAgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyWzBdOworICAgICAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKyAgICAgICAgdms6OlF1ZXVlU3VibWl0KHF1ZXVlLCAxLCAmc3VibWl0X2luZm8sIFZLX05VTExfSEFORExFKTsKKyAgICB9CisgICAgeworICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBmbGFnc1tde1ZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVR9OworICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm97fTsKKyAgICAgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyWzFdOworICAgICAgICBzdWJtaXRfaW5mby53YWl0U2VtYXBob3JlQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wV2FpdFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworICAgICAgICBzdWJtaXRfaW5mby5wV2FpdERzdFN0YWdlTWFzayA9IGZsYWdzOworICAgICAgICB2azo6UXVldWVTdWJtaXQobV9kZXZpY2UtPm1fcXVldWUsIDEsICZzdWJtaXRfaW5mbywgZmVuY2UpOworICAgIH0KKworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKworICAgIHZrOjpEZXN0cm95RmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCBmZW5jZSwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzZW1hcGhvcmUsIG51bGxwdHIpOworICAgIHZrOjpGcmVlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIDIsICZjb21tYW5kX2J1ZmZlclswXSk7CisgICAgdms6OkRlc3Ryb3lDb21tYW5kUG9vbChtX2RldmljZS0+ZGV2aWNlKCksIGNvbW1hbmRfcG9vbCwgTlVMTCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QuICBObyBlcnJvcnMgc2hvdWxkIGJlIGdlbmVyYXRlZC4KK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBUd29RdWV1ZVN1Ym1pdHNTZXBhcmF0ZVF1ZXVlc1dpdGhTZW1hcGhvcmVBbmRPbmVGZW5jZVR3b1dGRikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUd28gY29tbWFuZCBidWZmZXJzLCBlYWNoIGluIGEgc2VwYXJhdGUgUXVldWVTdWJtaXQgY2FsbCBzdWJtaXR0ZWQgb24gc2VwYXJhdGUgcXVldWVzLCB0aGUgc2Vjb25kIGhhdmluZyBhIGZlbmNlIGZvbGxvd2VkICIKKyAgICAgICAgImJ5IHR3byBjb25zZWN1dGl2ZSBXYWl0Rm9yRmVuY2VzIGNhbGxzIG9uIHRoZSBzYW1lIGZlbmNlLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBpZiAoKG1fZGV2aWNlLT5xdWV1ZV9wcm9wcy5lbXB0eSgpKSB8fCAobV9kZXZpY2UtPnF1ZXVlX3Byb3BzWzBdLnF1ZXVlQ291bnQgPCAyKSkgeworICAgICAgICBwcmludGYoIiVzIFF1ZXVlIGZhbWlseSBuZWVkcyB0byBoYXZlIG11bHRpcGxlIHF1ZXVlcyB0byBydW4gdGhpcyB0ZXN0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIFZrRmVuY2UgZmVuY2U7CisgICAgVmtGZW5jZUNyZWF0ZUluZm8gZmVuY2VfY3JlYXRlX2luZm97fTsKKyAgICBmZW5jZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksICZmZW5jZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmZlbmNlKTsKKworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2VtYXBob3JlX2NyZWF0ZV9pbmZve307CisgICAgc2VtYXBob3JlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCAmc2VtYXBob3JlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmc2VtYXBob3JlKTsKKworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZF9wb29sOworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHBvb2xfY3JlYXRlX2luZm97fTsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPOworICAgIHBvb2xfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLmZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ7CisgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb21tYW5kX3Bvb2wpOworCisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyWzJdOworICAgIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZve307CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kUG9vbCA9IGNvbW1hbmRfcG9vbDsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDI7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlk7CisgICAgdms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCAmY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbywgY29tbWFuZF9idWZmZXIpOworCisgICAgVmtRdWV1ZSBxdWV1ZSA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpHZXREZXZpY2VRdWV1ZShtX2RldmljZS0+ZGV2aWNlKCksIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XywgMSwgJnF1ZXVlKTsKKworICAgIHsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGJlZ2luX2luZm97fTsKKyAgICAgICAgYmVnaW5faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0sICZiZWdpbl9pbmZvKTsKKworICAgICAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRfYnVmZmVyWzBdLCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIpOworCisgICAgICAgIFZrVmlld3BvcnQgdmlld3BvcnR7fTsKKyAgICAgICAgdmlld3BvcnQubWF4RGVwdGggPSAxLjBmOworICAgICAgICB2aWV3cG9ydC5taW5EZXB0aCA9IDAuMGY7CisgICAgICAgIHZpZXdwb3J0LndpZHRoID0gNTEyOworICAgICAgICB2aWV3cG9ydC5oZWlnaHQgPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LnggPSAwOworICAgICAgICB2aWV3cG9ydC55ID0gMDsKKyAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KGNvbW1hbmRfYnVmZmVyWzBdLCAwLCAxLCAmdmlld3BvcnQpOworICAgICAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclswXSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGJlZ2luX2luZm97fTsKKyAgICAgICAgYmVnaW5faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMV0sICZiZWdpbl9pbmZvKTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0e307CisgICAgICAgIHZpZXdwb3J0Lm1heERlcHRoID0gMS4wZjsKKyAgICAgICAgdmlld3BvcnQubWluRGVwdGggPSAwLjBmOworICAgICAgICB2aWV3cG9ydC53aWR0aCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQuaGVpZ2h0ID0gNTEyOworICAgICAgICB2aWV3cG9ydC54ID0gMDsKKyAgICAgICAgdmlld3BvcnQueSA9IDA7CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChjb21tYW5kX2J1ZmZlclsxXSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMV0pOworICAgIH0KKyAgICB7CisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb3t9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZF9idWZmZXJbMF07CisgICAgICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworICAgICAgICB2azo6UXVldWVTdWJtaXQocXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIH0KKyAgICB7CisgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGZsYWdzW117VktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVH07CisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb3t9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZF9idWZmZXJbMV07CisgICAgICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0U2VtYXBob3JlcyA9ICZzZW1hcGhvcmU7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gZmxhZ3M7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBmZW5jZSk7CisgICAgfQorCisgICAgdms6OldhaXRGb3JGZW5jZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZmVuY2UsIFZLX1RSVUUsIFVJTlQ2NF9NQVgpOworICAgIHZrOjpXYWl0Rm9yRmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmZlbmNlLCBWS19UUlVFLCBVSU5UNjRfTUFYKTsKKworICAgIHZrOjpEZXN0cm95RmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCBmZW5jZSwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBzZW1hcGhvcmUsIG51bGxwdHIpOworICAgIHZrOjpGcmVlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIDIsICZjb21tYW5kX2J1ZmZlclswXSk7CisgICAgdms6OkRlc3Ryb3lDb21tYW5kUG9vbChtX2RldmljZS0+ZGV2aWNlKCksIGNvbW1hbmRfcG9vbCwgTlVMTCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFR3b1F1ZXVlc0Vuc3VyZUNvcnJlY3RSZXRpcmVtZW50V2l0aFdvcmtTdG9sZW4pIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIGlmICgobV9kZXZpY2UtPnF1ZXVlX3Byb3BzLmVtcHR5KCkpIHx8IChtX2RldmljZS0+cXVldWVfcHJvcHNbMF0ucXVldWVDb3VudCA8IDIpKSB7CisgICAgICAgIHByaW50ZigiJXMgVGVzdCByZXF1aXJlcyB0d28gcXVldWVzLCBza2lwcGluZ1xuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtSZXN1bHQgZXJyOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIFZrUXVldWUgcTAgPSBtX2RldmljZS0+bV9xdWV1ZTsKKyAgICBWa1F1ZXVlIHExID0gbnVsbHB0cjsKKyAgICB2azo6R2V0RGV2aWNlUXVldWUobV9kZXZpY2UtPmRldmljZSgpLCBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8sIDEsICZxMSk7CisgICAgQVNTRVJUX05FKHExLCBudWxscHRyKTsKKworICAgIC8vIEFuIChlbXB0eSkgY29tbWFuZCBidWZmZXIuIFdlIG11c3QgaGF2ZSB3b3JrIGluIHRoZSBmaXJzdCBzdWJtaXNzaW9uIC0tCisgICAgLy8gdGhlIGxheWVyIHRyZWF0cyB1bmZlbmNlZCB3b3JrIGRpZmZlcmVudGx5IGZyb20gZmVuY2VkIHdvcmsuCisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gY3BjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDB9OworICAgIFZrQ29tbWFuZFBvb2wgcG9vbDsKKyAgICBlcnIgPSB2azo6Q3JlYXRlQ29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmY3BjaSwgbnVsbHB0ciwgJnBvb2wpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNiYWkgPSB7VktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTywgbnVsbHB0ciwgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZLCAxfTsKKyAgICBWa0NvbW1hbmRCdWZmZXIgY2I7CisgICAgZXJyID0gdms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCAmY2JhaSwgJmNiKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjYmJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sIG51bGxwdHIsIDAsIG51bGxwdHJ9OworICAgIGVyciA9IHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY2IsICZjYmJpKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIGVyciA9IHZrOjpFbmRDb21tYW5kQnVmZmVyKGNiKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gQSBzZW1hcGhvcmUKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2NpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMH07CisgICAgVmtTZW1hcGhvcmUgczsKKyAgICBlcnIgPSB2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNjaSwgbnVsbHB0ciwgJnMpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBGaXJzdCBzdWJtaXNzaW9uLCB0byBxMAorICAgIFZrU3VibWl0SW5mbyBzMCA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgbnVsbHB0ciwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgMSwgJmNiLCAxLCAmc307CisKKyAgICBlcnIgPSB2azo6UXVldWVTdWJtaXQocTAsIDEsICZzMCwgVktfTlVMTF9IQU5ETEUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBTZWNvbmQgc3VibWlzc2lvbiwgdG8gcTEsIHdhaXRpbmcgb24gcworICAgIFZrRmxhZ3Mgd2FpdG1hc2sgPSBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQ7ICAvLyBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hhdCB0aGlzIHZhbHVlIGlzLgorICAgIFZrU3VibWl0SW5mbyBzMSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgbnVsbHB0ciwgMSwgJnMsICZ3YWl0bWFzaywgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisKKyAgICBlcnIgPSB2azo6UXVldWVTdWJtaXQocTEsIDEsICZzMSwgVktfTlVMTF9IQU5ETEUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBXYWl0IGZvciBxMCBpZGxlCisgICAgZXJyID0gdms6OlF1ZXVlV2FpdElkbGUocTApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBDb21tYW5kIGJ1ZmZlciBzaG91bGQgaGF2ZSBiZWVuIGNvbXBsZXRlZCAoaXQgd2FzIG9uIHEwKTsgcmVzZXQgdGhlIHBvb2wuCisgICAgdms6OkZyZWVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksIHBvb2wsIDEsICZjYik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgIC8vIEZvcmNlIGRldmljZSBjb21wbGV0ZWx5IGlkbGUgYW5kIGNsZWFuIHVwIHJlc291cmNlcworICAgIHZrOjpEZXZpY2VXYWl0SWRsZShtX2RldmljZS0+ZGV2aWNlKCkpOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBwb29sLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksIHMsIG51bGxwdHIpOworfQorCisvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdC4gIE5vIGVycm9ycyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFR3b1F1ZXVlU3VibWl0c1NlcGFyYXRlUXVldWVzV2l0aFNlbWFwaG9yZUFuZE9uZUZlbmNlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlR3byBjb21tYW5kIGJ1ZmZlcnMsIGVhY2ggaW4gYSBzZXBhcmF0ZSBRdWV1ZVN1Ym1pdCBjYWxsIHN1Ym1pdHRlZCBvbiBzZXBhcmF0ZSBxdWV1ZXMsIHRoZSBzZWNvbmQgaGF2aW5nIGEgZmVuY2UsICIKKyAgICAgICAgImZvbGxvd2VkIGJ5IGEgV2FpdEZvckZlbmNlcyBjYWxsLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBpZiAoKG1fZGV2aWNlLT5xdWV1ZV9wcm9wcy5lbXB0eSgpKSB8fCAobV9kZXZpY2UtPnF1ZXVlX3Byb3BzWzBdLnF1ZXVlQ291bnQgPCAyKSkgeworICAgICAgICBwcmludGYoIiVzIFF1ZXVlIGZhbWlseSBuZWVkcyB0byBoYXZlIG11bHRpcGxlIHF1ZXVlcyB0byBydW4gdGhpcyB0ZXN0LlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIFZrRmVuY2UgZmVuY2U7CisgICAgVmtGZW5jZUNyZWF0ZUluZm8gZmVuY2VfY3JlYXRlX2luZm97fTsKKyAgICBmZW5jZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksICZmZW5jZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmZlbmNlKTsKKworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2VtYXBob3JlX2NyZWF0ZV9pbmZve307CisgICAgc2VtYXBob3JlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCAmc2VtYXBob3JlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmc2VtYXBob3JlKTsKKworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZF9wb29sOworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHBvb2xfY3JlYXRlX2luZm97fTsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPOworICAgIHBvb2xfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLmZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ7CisgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb21tYW5kX3Bvb2wpOworCisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyWzJdOworICAgIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZve307CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kUG9vbCA9IGNvbW1hbmRfcG9vbDsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDI7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlk7CisgICAgdms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCAmY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbywgY29tbWFuZF9idWZmZXIpOworCisgICAgVmtRdWV1ZSBxdWV1ZSA9IFZLX05VTExfSEFORExFOworICAgIHZrOjpHZXREZXZpY2VRdWV1ZShtX2RldmljZS0+ZGV2aWNlKCksIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XywgMSwgJnF1ZXVlKTsKKworICAgIHsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGJlZ2luX2luZm97fTsKKyAgICAgICAgYmVnaW5faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0sICZiZWdpbl9pbmZvKTsKKworICAgICAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRfYnVmZmVyWzBdLCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIpOworCisgICAgICAgIFZrVmlld3BvcnQgdmlld3BvcnR7fTsKKyAgICAgICAgdmlld3BvcnQubWF4RGVwdGggPSAxLjBmOworICAgICAgICB2aWV3cG9ydC5taW5EZXB0aCA9IDAuMGY7CisgICAgICAgIHZpZXdwb3J0LndpZHRoID0gNTEyOworICAgICAgICB2aWV3cG9ydC5oZWlnaHQgPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LnggPSAwOworICAgICAgICB2aWV3cG9ydC55ID0gMDsKKyAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KGNvbW1hbmRfYnVmZmVyWzBdLCAwLCAxLCAmdmlld3BvcnQpOworICAgICAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclswXSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGJlZ2luX2luZm97fTsKKyAgICAgICAgYmVnaW5faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMV0sICZiZWdpbl9pbmZvKTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0e307CisgICAgICAgIHZpZXdwb3J0Lm1heERlcHRoID0gMS4wZjsKKyAgICAgICAgdmlld3BvcnQubWluRGVwdGggPSAwLjBmOworICAgICAgICB2aWV3cG9ydC53aWR0aCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQuaGVpZ2h0ID0gNTEyOworICAgICAgICB2aWV3cG9ydC54ID0gMDsKKyAgICAgICAgdmlld3BvcnQueSA9IDA7CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChjb21tYW5kX2J1ZmZlclsxXSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMV0pOworICAgIH0KKyAgICB7CisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb3t9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZF9idWZmZXJbMF07CisgICAgICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSAmc2VtYXBob3JlOworICAgICAgICB2azo6UXVldWVTdWJtaXQocXVldWUsIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIH0KKyAgICB7CisgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGZsYWdzW117VktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVH07CisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb3t9OworICAgICAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmY29tbWFuZF9idWZmZXJbMV07CisgICAgICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0U2VtYXBob3JlcyA9ICZzZW1hcGhvcmU7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gZmxhZ3M7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBmZW5jZSk7CisgICAgfQorCisgICAgdms6OldhaXRGb3JGZW5jZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZmVuY2UsIFZLX1RSVUUsIFVJTlQ2NF9NQVgpOworCisgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIGZlbmNlLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksIHNlbWFwaG9yZSwgbnVsbHB0cik7CisgICAgdms6OkZyZWVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksIGNvbW1hbmRfcG9vbCwgMiwgJmNvbW1hbmRfYnVmZmVyWzBdKTsKKyAgICB2azo6RGVzdHJveUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCBOVUxMKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCisvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdC4gIE5vIGVycm9ycyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFR3b1F1ZXVlU3VibWl0c09uZVF1ZXVlV2l0aFNlbWFwaG9yZUFuZE9uZUZlbmNlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlR3byBjb21tYW5kIGJ1ZmZlcnMsIGVhY2ggaW4gYSBzZXBhcmF0ZSBRdWV1ZVN1Ym1pdCBjYWxsIG9uIHRoZSBzYW1lIHF1ZXVlLCBzaGFyaW5nIGEgc2lnbmFsL3dhaXQgc2VtYXBob3JlLCB0aGUgc2Vjb25kICIKKyAgICAgICAgImhhdmluZyBhIGZlbmNlLCBmb2xsb3dlZCBieSBhIFdhaXRGb3JGZW5jZXMgY2FsbC4iKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIFZrRmVuY2UgZmVuY2U7CisgICAgVmtGZW5jZUNyZWF0ZUluZm8gZmVuY2VfY3JlYXRlX2luZm97fTsKKyAgICBmZW5jZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksICZmZW5jZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmZlbmNlKTsKKworICAgIFZrU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2VtYXBob3JlX2NyZWF0ZV9pbmZve307CisgICAgc2VtYXBob3JlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0NSRUFURV9JTkZPOworICAgIHZrOjpDcmVhdGVTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCAmc2VtYXBob3JlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmc2VtYXBob3JlKTsKKworICAgIFZrQ29tbWFuZFBvb2wgY29tbWFuZF9wb29sOworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIHBvb2xfY3JlYXRlX2luZm97fTsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9QT09MX0NSRUFURV9JTkZPOworICAgIHBvb2xfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleCA9IG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4XzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLmZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQ7CisgICAgdms6OkNyZWF0ZUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBvb2xfY3JlYXRlX2luZm8sIG51bGxwdHIsICZjb21tYW5kX3Bvb2wpOworCisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRfYnVmZmVyWzJdOworICAgIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZve307CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk87CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kUG9vbCA9IGNvbW1hbmRfcG9vbDsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDI7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5sZXZlbCA9IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlk7CisgICAgdms6OkFsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMobV9kZXZpY2UtPmRldmljZSgpLCAmY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mbywgY29tbWFuZF9idWZmZXIpOworCisgICAgeworICAgICAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5faW5mb3t9OworICAgICAgICBiZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICAgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclswXSwgJmJlZ2luX2luZm8pOworCisgICAgICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIoY29tbWFuZF9idWZmZXJbMF0sIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cik7CisKKyAgICAgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHt9OworICAgICAgICB2aWV3cG9ydC5tYXhEZXB0aCA9IDEuMGY7CisgICAgICAgIHZpZXdwb3J0Lm1pbkRlcHRoID0gMC4wZjsKKyAgICAgICAgdmlld3BvcnQud2lkdGggPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LmhlaWdodCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQueCA9IDA7CisgICAgICAgIHZpZXdwb3J0LnkgPSAwOworICAgICAgICB2azo6Q21kU2V0Vmlld3BvcnQoY29tbWFuZF9idWZmZXJbMF0sIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzBdKTsKKyAgICB9CisgICAgeworICAgICAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gYmVnaW5faW5mb3t9OworICAgICAgICBiZWdpbl9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQkVHSU5fSU5GTzsKKyAgICAgICAgdms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclsxXSwgJmJlZ2luX2luZm8pOworCisgICAgICAgIFZrVmlld3BvcnQgdmlld3BvcnR7fTsKKyAgICAgICAgdmlld3BvcnQubWF4RGVwdGggPSAxLjBmOworICAgICAgICB2aWV3cG9ydC5taW5EZXB0aCA9IDAuMGY7CisgICAgICAgIHZpZXdwb3J0LndpZHRoID0gNTEyOworICAgICAgICB2aWV3cG9ydC5oZWlnaHQgPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LnggPSAwOworICAgICAgICB2aWV3cG9ydC55ID0gMDsKKyAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KGNvbW1hbmRfYnVmZmVyWzFdLCAwLCAxLCAmdmlld3BvcnQpOworICAgICAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclsxXSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZve307CisgICAgICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZjb21tYW5kX2J1ZmZlclswXTsKKyAgICAgICAgc3VibWl0X2luZm8uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlcyA9ICZzZW1hcGhvcmU7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZmxhZ3NbXXtWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUfTsKKyAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZve307CisgICAgICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZjb21tYW5kX2J1ZmZlclsxXTsKKyAgICAgICAgc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKyAgICAgICAgc3VibWl0X2luZm8ucFdhaXREc3RTdGFnZU1hc2sgPSBmbGFnczsKKyAgICAgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc3VibWl0X2luZm8sIGZlbmNlKTsKKyAgICB9CisKKyAgICB2azo6V2FpdEZvckZlbmNlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZmZW5jZSwgVktfVFJVRSwgVUlOVDY0X01BWCk7CisKKyAgICB2azo6RGVzdHJveUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmVuY2UsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlLCBudWxscHRyKTsKKyAgICB2azo6RnJlZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCAyLCAmY29tbWFuZF9idWZmZXJbMF0pOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKKy8vIFRoaXMgaXMgYSBwb3NpdGl2ZSB0ZXN0LiAgTm8gZXJyb3JzIHNob3VsZCBiZSBnZW5lcmF0ZWQuCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgVHdvUXVldWVTdWJtaXRzT25lUXVldWVOdWxsUXVldWVTdWJtaXRXaXRoRmVuY2UpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVHdvIGNvbW1hbmQgYnVmZmVycywgZWFjaCBpbiBhIHNlcGFyYXRlIFF1ZXVlU3VibWl0IGNhbGwgb24gdGhlIHNhbWUgcXVldWUsIG5vIGZlbmNlcywgZm9sbG93ZWQgYnkgYSB0aGlyZCBRdWV1ZVN1Ym1pdCAiCisgICAgICAgICJ3aXRoIE5PIFN1Ym1pdEluZm9zIGJ1dCB3aXRoIGEgZmVuY2UsIGZvbGxvd2VkIGJ5IGEgV2FpdEZvckZlbmNlcyBjYWxsLiIpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtGZW5jZSBmZW5jZTsKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmZW5jZV9jcmVhdGVfaW5mb3t9OworICAgIGZlbmNlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk87CisgICAgdms6OkNyZWF0ZUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZlbmNlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmZmVuY2UpOworCisgICAgVmtDb21tYW5kUG9vbCBjb21tYW5kX3Bvb2w7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gcG9vbF9jcmVhdGVfaW5mb3t9OworICAgIHBvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk87CisgICAgcG9vbF9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIHBvb2xfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICB2azo6Q3JlYXRlQ29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmNvbW1hbmRfcG9vbCk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXJbMl07CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm97fTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRQb29sID0gY29tbWFuZF9wb29sOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMjsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksICZjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLCBjb21tYW5kX2J1ZmZlcik7CisKKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzBdLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihjb21tYW5kX2J1ZmZlclswXSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0e307CisgICAgICAgIHZpZXdwb3J0Lm1heERlcHRoID0gMS4wZjsKKyAgICAgICAgdmlld3BvcnQubWluRGVwdGggPSAwLjBmOworICAgICAgICB2aWV3cG9ydC53aWR0aCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQuaGVpZ2h0ID0gNTEyOworICAgICAgICB2aWV3cG9ydC54ID0gMDsKKyAgICAgICAgdmlld3BvcnQueSA9IDA7CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChjb21tYW5kX2J1ZmZlclswXSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0pOworICAgIH0KKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzFdLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHt9OworICAgICAgICB2aWV3cG9ydC5tYXhEZXB0aCA9IDEuMGY7CisgICAgICAgIHZpZXdwb3J0Lm1pbkRlcHRoID0gMC4wZjsKKyAgICAgICAgdmlld3BvcnQud2lkdGggPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LmhlaWdodCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQueCA9IDA7CisgICAgICAgIHZpZXdwb3J0LnkgPSAwOworICAgICAgICB2azo6Q21kU2V0Vmlld3BvcnQoY29tbWFuZF9idWZmZXJbMV0sIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzFdKTsKKyAgICB9CisgICAgeworICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm97fTsKKyAgICAgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyWzBdOworICAgICAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZmxhZ3NbXXtWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUfTsKKyAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZve307CisgICAgICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZjb21tYW5kX2J1ZmZlclsxXTsKKyAgICAgICAgc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICAgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gZmxhZ3M7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgfQorCisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAwLCBOVUxMLCBmZW5jZSk7CisKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6V2FpdEZvckZlbmNlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZmZW5jZSwgVktfVFJVRSwgVUlOVDY0X01BWCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIHZrOjpEZXN0cm95RmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCBmZW5jZSwgbnVsbHB0cik7CisgICAgdms6OkZyZWVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksIGNvbW1hbmRfcG9vbCwgMiwgJmNvbW1hbmRfYnVmZmVyWzBdKTsKKyAgICB2azo6RGVzdHJveUNvbW1hbmRQb29sKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCBOVUxMKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCisvLyBUaGlzIGlzIGEgcG9zaXRpdmUgdGVzdC4gIE5vIGVycm9ycyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFR3b1F1ZXVlU3VibWl0c09uZVF1ZXVlT25lRmVuY2UpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVHdvIGNvbW1hbmQgYnVmZmVycywgZWFjaCBpbiBhIHNlcGFyYXRlIFF1ZXVlU3VibWl0IGNhbGwgb24gdGhlIHNhbWUgcXVldWUsIHRoZSBzZWNvbmQgaGF2aW5nIGEgZmVuY2UsIGZvbGxvd2VkIGJ5IGEgIgorICAgICAgICAiV2FpdEZvckZlbmNlcyBjYWxsLiIpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgVmtGZW5jZSBmZW5jZTsKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmZW5jZV9jcmVhdGVfaW5mb3t9OworICAgIGZlbmNlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk87CisgICAgdms6OkNyZWF0ZUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZlbmNlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmZmVuY2UpOworCisgICAgVmtDb21tYW5kUG9vbCBjb21tYW5kX3Bvb2w7CisgICAgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gcG9vbF9jcmVhdGVfaW5mb3t9OworICAgIHBvb2xfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk87CisgICAgcG9vbF9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4ID0gbV9kZXZpY2UtPmdyYXBoaWNzX3F1ZXVlX25vZGVfaW5kZXhfOworICAgIHBvb2xfY3JlYXRlX2luZm8uZmxhZ3MgPSBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVDsKKyAgICB2azo6Q3JlYXRlQ29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCAmcG9vbF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJmNvbW1hbmRfcG9vbCk7CisKKyAgICBWa0NvbW1hbmRCdWZmZXIgY29tbWFuZF9idWZmZXJbMl07CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm97fTsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmNvbW1hbmRQb29sID0gY29tbWFuZF9wb29sOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMjsKKyAgICBjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWTsKKyAgICB2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhtX2RldmljZS0+ZGV2aWNlKCksICZjb21tYW5kX2J1ZmZlcl9hbGxvY2F0ZV9pbmZvLCBjb21tYW5kX2J1ZmZlcik7CisKKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzBdLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihjb21tYW5kX2J1ZmZlclswXSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0e307CisgICAgICAgIHZpZXdwb3J0Lm1heERlcHRoID0gMS4wZjsKKyAgICAgICAgdmlld3BvcnQubWluRGVwdGggPSAwLjBmOworICAgICAgICB2aWV3cG9ydC53aWR0aCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQuaGVpZ2h0ID0gNTEyOworICAgICAgICB2aWV3cG9ydC54ID0gMDsKKyAgICAgICAgdmlld3BvcnQueSA9IDA7CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChjb21tYW5kX2J1ZmZlclswXSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0pOworICAgIH0KKyAgICB7CisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBiZWdpbl9pbmZve307CisgICAgICAgIGJlZ2luX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgICAgICB2azo6QmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzFdLCAmYmVnaW5faW5mbyk7CisKKyAgICAgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHt9OworICAgICAgICB2aWV3cG9ydC5tYXhEZXB0aCA9IDEuMGY7CisgICAgICAgIHZpZXdwb3J0Lm1pbkRlcHRoID0gMC4wZjsKKyAgICAgICAgdmlld3BvcnQud2lkdGggPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LmhlaWdodCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQueCA9IDA7CisgICAgICAgIHZpZXdwb3J0LnkgPSAwOworICAgICAgICB2azo6Q21kU2V0Vmlld3BvcnQoY29tbWFuZF9idWZmZXJbMV0sIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgICAgIHZrOjpFbmRDb21tYW5kQnVmZmVyKGNvbW1hbmRfYnVmZmVyWzFdKTsKKyAgICB9CisgICAgeworICAgICAgICBWa1N1Ym1pdEluZm8gc3VibWl0X2luZm97fTsKKyAgICAgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICAgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gJmNvbW1hbmRfYnVmZmVyWzBdOworICAgICAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZmxhZ3NbXXtWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUfTsKKyAgICAgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZve307CisgICAgICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZjb21tYW5kX2J1ZmZlclsxXTsKKyAgICAgICAgc3VibWl0X2luZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICAgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIHN1Ym1pdF9pbmZvLnBXYWl0RHN0U3RhZ2VNYXNrID0gZmxhZ3M7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBmZW5jZSk7CisgICAgfQorCisgICAgdms6OldhaXRGb3JGZW5jZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZmVuY2UsIFZLX1RSVUUsIFVJTlQ2NF9NQVgpOworCisgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIGZlbmNlLCBudWxscHRyKTsKKyAgICB2azo6RnJlZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCAyLCAmY29tbWFuZF9idWZmZXJbMF0pOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKKy8vIFRoaXMgaXMgYSBwb3NpdGl2ZSB0ZXN0LiAgTm8gZXJyb3JzIHNob3VsZCBiZSBnZW5lcmF0ZWQuCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgVHdvU3VibWl0SW5mb3NXaXRoU2VtYXBob3JlT25lUXVldWVTdWJtaXRzT25lRmVuY2UpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVHdvIGNvbW1hbmQgYnVmZmVycyBlYWNoIGluIGEgc2VwYXJhdGUgU3VibWl0SW5mbyBzZW50IGluIGEgc2luZ2xlIFF1ZXVlU3VibWl0IGNhbGwgZm9sbG93ZWQgYnkgYSBXYWl0Rm9yRmVuY2VzIGNhbGwuIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZlbmNlX2NyZWF0ZV9pbmZve307CisgICAgZmVuY2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTzsKKyAgICB2azo6Q3JlYXRlRmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCAmZmVuY2VfY3JlYXRlX2luZm8sIG51bGxwdHIsICZmZW5jZSk7CisKKyAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNlbWFwaG9yZV9jcmVhdGVfaW5mb3t9OworICAgIHNlbWFwaG9yZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTzsKKyAgICB2azo6Q3JlYXRlU2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNlbWFwaG9yZV9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnNlbWFwaG9yZSk7CisKKyAgICBWa0NvbW1hbmRQb29sIGNvbW1hbmRfcG9vbDsKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBwb29sX2NyZWF0ZV9pbmZve307CisgICAgcG9vbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBwb29sX2NyZWF0ZV9pbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisgICAgcG9vbF9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIHZrOjpDcmVhdGVDb21tYW5kUG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZwb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmY29tbWFuZF9wb29sKTsKKworICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kX2J1ZmZlclsyXTsKKyAgICBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mb3t9OworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8uY29tbWFuZFBvb2wgPSBjb21tYW5kX3Bvb2w7CisgICAgY29tbWFuZF9idWZmZXJfYWxsb2NhdGVfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAyOworICAgIGNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8ubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZOworICAgIHZrOjpBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmNvbW1hbmRfYnVmZmVyX2FsbG9jYXRlX2luZm8sIGNvbW1hbmRfYnVmZmVyKTsKKworICAgIHsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGJlZ2luX2luZm97fTsKKyAgICAgICAgYmVnaW5faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMF0sICZiZWdpbl9pbmZvKTsKKworICAgICAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRfYnVmZmVyWzBdLCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCBWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklULCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIpOworCisgICAgICAgIFZrVmlld3BvcnQgdmlld3BvcnR7fTsKKyAgICAgICAgdmlld3BvcnQubWF4RGVwdGggPSAxLjBmOworICAgICAgICB2aWV3cG9ydC5taW5EZXB0aCA9IDAuMGY7CisgICAgICAgIHZpZXdwb3J0LndpZHRoID0gNTEyOworICAgICAgICB2aWV3cG9ydC5oZWlnaHQgPSA1MTI7CisgICAgICAgIHZpZXdwb3J0LnggPSAwOworICAgICAgICB2aWV3cG9ydC55ID0gMDsKKyAgICAgICAgdms6OkNtZFNldFZpZXdwb3J0KGNvbW1hbmRfYnVmZmVyWzBdLCAwLCAxLCAmdmlld3BvcnQpOworICAgICAgICB2azo6RW5kQ29tbWFuZEJ1ZmZlcihjb21tYW5kX2J1ZmZlclswXSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGJlZ2luX2luZm97fTsKKyAgICAgICAgYmVnaW5faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk87CisgICAgICAgIHZrOjpCZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMV0sICZiZWdpbl9pbmZvKTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0e307CisgICAgICAgIHZpZXdwb3J0Lm1heERlcHRoID0gMS4wZjsKKyAgICAgICAgdmlld3BvcnQubWluRGVwdGggPSAwLjBmOworICAgICAgICB2aWV3cG9ydC53aWR0aCA9IDUxMjsKKyAgICAgICAgdmlld3BvcnQuaGVpZ2h0ID0gNTEyOworICAgICAgICB2aWV3cG9ydC54ID0gMDsKKyAgICAgICAgdmlld3BvcnQueSA9IDA7CisgICAgICAgIHZrOjpDbWRTZXRWaWV3cG9ydChjb21tYW5kX2J1ZmZlclsxXSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICAgICAgdms6OkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZF9idWZmZXJbMV0pOworICAgIH0KKyAgICB7CisgICAgICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mb1syXTsKKyAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZmxhZ3NbXXtWS19QSVBFTElORV9TVEFHRV9BTExfQ09NTUFORFNfQklUfTsKKworICAgICAgICBzdWJtaXRfaW5mb1swXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mb1swXS5wTmV4dCA9IE5VTEw7CisgICAgICAgIHN1Ym1pdF9pbmZvWzBdLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvWzBdLnBDb21tYW5kQnVmZmVycyA9ICZjb21tYW5kX2J1ZmZlclswXTsKKyAgICAgICAgc3VibWl0X2luZm9bMF0uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAxOworICAgICAgICBzdWJtaXRfaW5mb1swXS5wU2lnbmFsU2VtYXBob3JlcyA9ICZzZW1hcGhvcmU7CisgICAgICAgIHN1Ym1pdF9pbmZvWzBdLndhaXRTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgICAgIHN1Ym1pdF9pbmZvWzBdLnBXYWl0U2VtYXBob3JlcyA9IE5VTEw7CisgICAgICAgIHN1Ym1pdF9pbmZvWzBdLnBXYWl0RHN0U3RhZ2VNYXNrID0gMDsKKworICAgICAgICBzdWJtaXRfaW5mb1sxXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgICAgICBzdWJtaXRfaW5mb1sxXS5wTmV4dCA9IE5VTEw7CisgICAgICAgIHN1Ym1pdF9pbmZvWzFdLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgICAgIHN1Ym1pdF9pbmZvWzFdLnBDb21tYW5kQnVmZmVycyA9ICZjb21tYW5kX2J1ZmZlclsxXTsKKyAgICAgICAgc3VibWl0X2luZm9bMV0ud2FpdFNlbWFwaG9yZUNvdW50ID0gMTsKKyAgICAgICAgc3VibWl0X2luZm9bMV0ucFdhaXRTZW1hcGhvcmVzID0gJnNlbWFwaG9yZTsKKyAgICAgICAgc3VibWl0X2luZm9bMV0ucFdhaXREc3RTdGFnZU1hc2sgPSBmbGFnczsKKyAgICAgICAgc3VibWl0X2luZm9bMV0uc2lnbmFsU2VtYXBob3JlQ291bnQgPSAwOworICAgICAgICBzdWJtaXRfaW5mb1sxXS5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEw7CisgICAgICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMiwgJnN1Ym1pdF9pbmZvWzBdLCBmZW5jZSk7CisgICAgfQorCisgICAgdms6OldhaXRGb3JGZW5jZXMobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmZmVuY2UsIFZLX1RSVUUsIFVJTlQ2NF9NQVgpOworCisgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIGZlbmNlLCBudWxscHRyKTsKKyAgICB2azo6RnJlZUNvbW1hbmRCdWZmZXJzKG1fZGV2aWNlLT5kZXZpY2UoKSwgY29tbWFuZF9wb29sLCAyLCAmY29tbWFuZF9idWZmZXJbMF0pOworICAgIHZrOjpEZXN0cm95Q29tbWFuZFBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBjb21tYW5kX3Bvb2wsIE5VTEwpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgc2VtYXBob3JlLCBudWxscHRyKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVBdHRyaWJNYXRyaXhUeXBlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IHBpcGVsaW5lIHZhbGlkYXRpb24gYWNjZXB0cyBtYXRyaWNlcyBwYXNzZWQgYXMgdmVydGV4IGF0dHJpYnV0ZXMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBpbnB1dF9iaW5kaW5nOworICAgIG1lbXNldCgmaW5wdXRfYmluZGluZywgMCwgc2l6ZW9mKGlucHV0X2JpbmRpbmcpKTsKKworICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiBpbnB1dF9hdHRyaWJzWzJdOworICAgIG1lbXNldChpbnB1dF9hdHRyaWJzLCAwLCBzaXplb2YoaW5wdXRfYXR0cmlicykpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgaW5wdXRfYXR0cmlic1tpXS5mb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVDsKKyAgICAgICAgaW5wdXRfYXR0cmlic1tpXS5sb2NhdGlvbiA9IGk7CisgICAgfQorCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBpbiBtYXQyeDQgeDtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB4WzBdICsgeFsxXTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUudmlfY2lfLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gJmlucHV0X2JpbmRpbmc7CisgICAgcGlwZS52aV9jaV8udmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSAxOworICAgIHBpcGUudmlfY2lfLnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgPSBpbnB1dF9hdHRyaWJzOworICAgIHBpcGUudmlfY2lfLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSAyOworICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIC8qIGV4cGVjdCBzdWNjZXNzICovCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUF0dHJpYkFycmF5VHlwZSkgeworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIGlucHV0X2JpbmRpbmc7CisgICAgbWVtc2V0KCZpbnB1dF9iaW5kaW5nLCAwLCBzaXplb2YoaW5wdXRfYmluZGluZykpOworCisgICAgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIGlucHV0X2F0dHJpYnNbMl07CisgICAgbWVtc2V0KGlucHV0X2F0dHJpYnMsIDAsIHNpemVvZihpbnB1dF9hdHRyaWJzKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpbnB1dF9hdHRyaWJzW2ldLmZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0ZMT0FUOworICAgICAgICBpbnB1dF9hdHRyaWJzW2ldLmxvY2F0aW9uID0gaTsKKyAgICB9CisKKyAgICBjaGFyIGNvbnN0ICp2c1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIGluIHZlYzQgeFsyXTtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB4WzBdICsgeFsxXTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgdnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUudmlfY2lfLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gJmlucHV0X2JpbmRpbmc7CisgICAgcGlwZS52aV9jaV8udmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSAxOworICAgIHBpcGUudmlfY2lfLnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgPSBpbnB1dF9hdHRyaWJzOworICAgIHBpcGUudmlfY2lfLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSAyOworICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7dnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZUF0dHJpYkNvbXBvbmVudHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCB0aGF0IHBpcGVsaW5lIHZhbGlkYXRpb24gYWNjZXB0cyBjb25zdW1pbmcgYSB2ZXJ0ZXggYXR0cmlidXRlIHRocm91Z2ggbXVsdGlwbGUgdmVydGV4IHNoYWRlciBpbnB1dHMsIGVhY2ggY29uc3VtaW5nICIKKyAgICAgICAgImEgZGlmZmVyZW50IHN1YnNldCBvZiB0aGUgY29tcG9uZW50cywgYW5kIHRoYXQgZnJhZ21lbnQgc2hhZGVyLWF0dGFjaG1lbnQgdmFsaWRhdGlvbiB0b2xlcmF0ZXMgbXVsdGlwbGUgZHVwbGljYXRlICIKKyAgICAgICAgImxvY2F0aW9uIG91dHB1dHMiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcyhWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCB8IFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiBpbnB1dF9iaW5kaW5nOworICAgIG1lbXNldCgmaW5wdXRfYmluZGluZywgMCwgc2l6ZW9mKGlucHV0X2JpbmRpbmcpKTsKKworICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiBpbnB1dF9hdHRyaWJzWzNdOworICAgIG1lbXNldChpbnB1dF9hdHRyaWJzLCAwLCBzaXplb2YoaW5wdXRfYXR0cmlicykpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW5wdXRfYXR0cmlic1tpXS5mb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVDsKKyAgICAgICAgaW5wdXRfYXR0cmlic1tpXS5sb2NhdGlvbiA9IGk7CisgICAgfQorCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBpbiB2ZWM0IHg7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MSkgaW4gdmVjMyB5MTtcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0xLCBjb21wb25lbnQ9MykgaW4gZmxvYXQgeTI7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MikgaW4gdmVjNCB6O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IHggKyB2ZWM0KHkxLCB5MikgKyB6O1xuIgorICAgICAgICAifVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTAsIGNvbXBvbmVudD0wKSBvdXQgZmxvYXQgY29sb3IwO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTAsIGNvbXBvbmVudD0xKSBvdXQgZmxvYXQgY29sb3IxO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTAsIGNvbXBvbmVudD0yKSBvdXQgZmxvYXQgY29sb3IyO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTAsIGNvbXBvbmVudD0zKSBvdXQgZmxvYXQgY29sb3IzO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTEsIGNvbXBvbmVudD0wKSBvdXQgdmVjMiBzZWNvbmRfY29sb3IwO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTEsIGNvbXBvbmVudD0yKSBvdXQgdmVjMiBzZWNvbmRfY29sb3IxO1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBjb2xvcjAgPSBmbG9hdCgxKTtcbiIKKyAgICAgICAgIiAgIHNlY29uZF9jb2xvcjAgPSB2ZWMyKDEpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCB2c1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworCisgICAgVmtEZXNjcmlwdG9yU2V0T2JqIGRlc2NyaXB0b3JTZXQobV9kZXZpY2UpOworICAgIGRlc2NyaXB0b3JTZXQuQXBwZW5kRHVtbXkoKTsKKyAgICBkZXNjcmlwdG9yU2V0LkNyZWF0ZVZLRGVzY3JpcHRvclNldChtX2NvbW1hbmRCdWZmZXIpOworCisgICAgLy8gQ3JlYXRlIGEgcmVuZGVyUGFzcyB3aXRoIHR3byBjb2xvciBhdHRhY2htZW50cworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRhY2htZW50c1syXSA9IHt9OworICAgIGF0dGFjaG1lbnRzWzBdLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGF0dGFjaG1lbnRzWzFdLmF0dGFjaG1lbnQgPSAxOworICAgIGF0dGFjaG1lbnRzWzFdLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHt9OworICAgIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHMgPSBhdHRhY2htZW50czsKKyAgICBzdWJwYXNzLmNvbG9yQXR0YWNobWVudENvdW50ID0gMjsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHt9OworICAgIHJwY2kuc3VicGFzc0NvdW50ID0gMTsKKyAgICBycGNpLnBTdWJwYXNzZXMgPSAmc3VicGFzczsKKyAgICBycGNpLmF0dGFjaG1lbnRDb3VudCA9IDI7CisKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2hfZGVzY1syXSA9IHt9OworICAgIGF0dGFjaF9kZXNjWzBdLmZvcm1hdCA9IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICBhdHRhY2hfZGVzY1swXS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGF0dGFjaF9kZXNjWzBdLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGF0dGFjaF9kZXNjWzBdLmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisgICAgYXR0YWNoX2Rlc2NbMF0ubG9hZE9wID0gVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRTsKKyAgICBhdHRhY2hfZGVzY1sxXS5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgYXR0YWNoX2Rlc2NbMV0uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2hfZGVzY1sxXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBhdHRhY2hfZGVzY1sxXS5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworICAgIGF0dGFjaF9kZXNjWzFdLmxvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkU7CisKKyAgICBycGNpLnBBdHRhY2htZW50cyA9IGF0dGFjaF9kZXNjOworICAgIHJwY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKworICAgIFZrUmVuZGVyUGFzcyByZW5kZXJwYXNzOworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIE5VTEwsICZyZW5kZXJwYXNzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisKKyAgICBWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSBhdHRfc3RhdGUxID0ge307CisgICAgYXR0X3N0YXRlMS5kc3RBbHBoYUJsZW5kRmFjdG9yID0gVktfQkxFTkRfRkFDVE9SX0NPTlNUQU5UX0NPTE9SOworICAgIGF0dF9zdGF0ZTEuYmxlbmRFbmFibGUgPSBWS19GQUxTRTsKKworICAgIHBpcGUuQWRkQ29sb3JBdHRhY2htZW50KDAsIGF0dF9zdGF0ZTEpOworICAgIHBpcGUuQWRkQ29sb3JBdHRhY2htZW50KDEsIGF0dF9zdGF0ZTEpOworICAgIHBpcGUuQWRkVmVydGV4SW5wdXRCaW5kaW5ncygmaW5wdXRfYmluZGluZywgMSk7CisgICAgcGlwZS5BZGRWZXJ0ZXhJbnB1dEF0dHJpYnMoaW5wdXRfYXR0cmlicywgMyk7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKGRlc2NyaXB0b3JTZXQuR2V0UGlwZWxpbmVMYXlvdXQoKSwgcmVuZGVycGFzcyk7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcmVuZGVycGFzcywgbnVsbHB0cik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lU2ltcGxlUG9zaXRpdmUpIHsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lUmVsYXhlZFR5cGVNYXRjaCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgcGlwZWxpbmUgdmFsaWRhdGlvbiBhY2NlcHRzIHRoZSByZWxheGVkIHR5cGUgbWF0Y2hpbmcgcnVsZXMgc2V0IG91dCBpbiAxNC4xLjM6IGZ1bmRhbWVudGFsIHR5cGUgbXVzdCBtYXRjaCwgYW5kICIKKyAgICAgICAgInByb2R1Y2VyIHNpZGUgbXVzdCBoYXZlIGF0IGxlYXN0IGFzIG1hbnkgY29tcG9uZW50cyIpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICAvLyBWSyAxLjAuOCBTcGVjaWZpY2F0aW9uLCAxNC4xLjMgIkFkZGl0aW9uYWxseSwuLi4iIGJsb2NrCisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICp2c1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjMyB4O1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTEpIG91dCBpdmVjMyB5O1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTIpIG91dCB2ZWMzIHo7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCgwKTtcbiIKKyAgICAgICAgIiAgIHggPSB2ZWMzKDApOyB5ID0gaXZlYzMoMCk7IHogPSB2ZWMzKDApO1xuIgorICAgICAgICAifVxuIjsKKyAgICBjaGFyIGNvbnN0ICpmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCB2ZWM0IGNvbG9yO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIGluIGZsb2F0IHg7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MSkgZmxhdCBpbiBpbnQgeTtcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0yKSBpbiB2ZWMyIHo7XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGNvbG9yID0gdmVjNCgxICsgeCArIHkgKyB6LngpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCB2c1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lVGVzc1BlclZlcnRleCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdGhhdCBwaXBlbGluZSB2YWxpZGF0aW9uIGFjY2VwdHMgcGVyLXZlcnRleCB2YXJpYWJsZXMgcGFzc2VkIGJldHdlZW4gdGhlIFRDUyBhbmQgVEVTIHN0YWdlcyIpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnRlc3NlbGxhdGlvblNoYWRlcikgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRlc3NlbGxhdGlvbiBzaGFkZXJzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2hhciBjb25zdCAqdGNzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCBpbnQgeFtdO1xuIgorICAgICAgICAibGF5b3V0KHZlcnRpY2VzPTMpIG91dDtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfVGVzc0xldmVsT3V0ZXJbMF0gPSBnbF9UZXNzTGV2ZWxPdXRlclsxXSA9IGdsX1Rlc3NMZXZlbE91dGVyWzJdID0gMTtcbiIKKyAgICAgICAgIiAgIGdsX1Rlc3NMZXZlbElubmVyWzBdID0gMTtcbiIKKyAgICAgICAgIiAgIHhbZ2xfSW52b2NhdGlvbklEXSA9IGdsX0ludm9jYXRpb25JRDtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgY2hhciBjb25zdCAqdGVzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAibGF5b3V0KHRyaWFuZ2xlcywgZXF1YWxfc3BhY2luZywgY3cpIGluO1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIGluIGludCB4W107XG4iCisgICAgICAgICJ2b2lkIG1haW4oKXtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uLnh5eiA9IGdsX1Rlc3NDb29yZDtcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uLncgPSB4WzBdICsgeFsxXSArIHhbMl07XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZU1pbmltYWxTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogdGNzKG1fZGV2aWNlLCB0Y3NTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIHRlcyhtX2RldmljZSwgdGVzU291cmNlLCBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gaWFzY2l7VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1QsIFZLX0ZBTFNFfTsKKworICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gdHNjaXtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDN9OworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuZ3BfY2lfLnBUZXNzZWxsYXRpb25TdGF0ZSA9ICZ0c2NpOworICAgIHBpcGUuZ3BfY2lfLnBJbnB1dEFzc2VtYmx5U3RhdGUgPSAmaWFzY2k7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgdGNzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCB0ZXMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVHZW9tZXRyeUlucHV0QmxvY2tQb3NpdGl2ZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgcGlwZWxpbmUgdmFsaWRhdGlvbiBhY2NlcHRzIGEgdXNlci1kZWZpbmVkIGludGVyZmFjZSBibG9jayBwYXNzZWQgaW50byB0aGUgZ2VvbWV0cnkgc2hhZGVyLiBUaGlzIGlzIGludGVyZXN0aW5nICIKKyAgICAgICAgImJlY2F1c2UgdGhlICdleHRyYScgYXJyYXkgbGV2ZWwgaXMgbm90IHByZXNlbnQgb24gdGhlIG1lbWJlciB0eXBlLCBidXQgb24gdGhlIGJsb2NrIGluc3RhbmNlLiIpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLmdlb21ldHJ5U2hhZGVyKSB7CisgICAgICAgIHByaW50ZigiJXMgRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgZ2VvbWV0cnkgc2hhZGVyczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNoYXIgY29uc3QgKmdzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAibGF5b3V0KHRyaWFuZ2xlcykgaW47XG4iCisgICAgICAgICJsYXlvdXQodHJpYW5nbGVfc3RyaXAsIG1heF92ZXJ0aWNlcz0zKSBvdXQ7XG4iCisgICAgICAgICJsYXlvdXQobG9jYXRpb249MCkgaW4gVmVydGV4RGF0YSB7IHZlYzQgeDsgfSBnc19pbltdO1xuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSBnc19pblswXS54O1xuIgorICAgICAgICAiICAgRW1pdFZlcnRleCgpO1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGdzKG1fZGV2aWNlLCBnc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBncy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDcmVhdGVQaXBlbGluZTY0Qml0QXR0cmlidXRlc1Bvc2l0aXZlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBwaXBlbGluZSB2YWxpZGF0aW9uIGFjY2VwdHMgYmFzaWMgdXNlIG9mIDY0Yml0IHZlcnRleCBhdHRyaWJ1dGVzLiBUaGlzIGlzIGludGVyZXN0aW5nIGJlY2F1c2UgdGhleSBjb25zdW1lICIKKyAgICAgICAgIm11bHRpcGxlIGxvY2F0aW9ucy4iKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgaWYgKCFFbmFibGVEZXZpY2VQcm9maWxlTGF5ZXIoKSkgeworICAgICAgICBwcmludGYoIiVzIEZhaWxlZCB0byBlbmFibGUgZGV2aWNlIHByb2ZpbGUgbGF5ZXIuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIGlmICghbV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkuc2hhZGVyRmxvYXQ2NCkgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IDY0Yml0IHZlcnRleCBhdHRyaWJ1dGVzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFNldCA2NGJpdCBmb3JtYXQgdG8gc3VwcG9ydCBWVFggQnVmZmVyIGZlYXR1cmUKKyAgICBQRk5fdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgZnB2a1NldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCA9IG51bGxwdHI7CisgICAgUEZOX3ZrR2V0T3JpZ2luYWxQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQgZnB2a0dldE9yaWdpbmFsUGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUID0gbnVsbHB0cjsKKworICAgIC8vIExvYWQgcmVxdWlyZWQgZnVuY3Rpb25zCisgICAgaWYgKCFMb2FkRGV2aWNlUHJvZmlsZUxheWVyKGZwdmtTZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXNFWFQsIGZwdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BzOworICAgIGZwdmtHZXRPcmlnaW5hbFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllc0VYVChncHUoKSwgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TRkxPQVQsICZmb3JtYXRfcHJvcHMpOworICAgIGZvcm1hdF9wcm9wcy5idWZmZXJGZWF0dXJlcyB8PSBWS19GT1JNQVRfRkVBVFVSRV9WRVJURVhfQlVGRkVSX0JJVDsKKyAgICBmcHZrU2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzRVhUKGdwdSgpLCBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVCwgZm9ybWF0X3Byb3BzKTsKKworICAgIFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gaW5wdXRfYmluZGluZ3NbMV07CisgICAgbWVtc2V0KGlucHV0X2JpbmRpbmdzLCAwLCBzaXplb2YoaW5wdXRfYmluZGluZ3MpKTsKKworICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiBpbnB1dF9hdHRyaWJzWzRdOworICAgIG1lbXNldChpbnB1dF9hdHRyaWJzLCAwLCBzaXplb2YoaW5wdXRfYXR0cmlicykpOworICAgIGlucHV0X2F0dHJpYnNbMF0ubG9jYXRpb24gPSAwOworICAgIGlucHV0X2F0dHJpYnNbMF0ub2Zmc2V0ID0gMDsKKyAgICBpbnB1dF9hdHRyaWJzWzBdLmZvcm1hdCA9IFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0ZMT0FUOworICAgIGlucHV0X2F0dHJpYnNbMV0ubG9jYXRpb24gPSAyOworICAgIGlucHV0X2F0dHJpYnNbMV0ub2Zmc2V0ID0gMzI7CisgICAgaW5wdXRfYXR0cmlic1sxXS5mb3JtYXQgPSBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVDsKKyAgICBpbnB1dF9hdHRyaWJzWzJdLmxvY2F0aW9uID0gNDsKKyAgICBpbnB1dF9hdHRyaWJzWzJdLm9mZnNldCA9IDY0OworICAgIGlucHV0X2F0dHJpYnNbMl0uZm9ybWF0ID0gVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TRkxPQVQ7CisgICAgaW5wdXRfYXR0cmlic1szXS5sb2NhdGlvbiA9IDY7CisgICAgaW5wdXRfYXR0cmlic1szXS5vZmZzZXQgPSA5NjsKKyAgICBpbnB1dF9hdHRyaWJzWzNdLmZvcm1hdCA9IFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0ZMT0FUOworCisgICAgY2hhciBjb25zdCAqdnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBpbiBkbWF0NCB4O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IHZlYzQoeFswXVswXSk7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLnZpX2NpXy5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9IGlucHV0X2JpbmRpbmdzOworICAgIHBpcGUudmlfY2lfLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gMTsKKyAgICBwaXBlLnZpX2NpXy5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gaW5wdXRfYXR0cmliczsKKyAgICBwaXBlLnZpX2NpXy52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gNDsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lSW5wdXRBdHRhY2htZW50UG9zaXRpdmUpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJQb3NpdGl2ZSB0ZXN0IGZvciBhIGNvcnJlY3RseSBtYXRjaGVkIGlucHV0IGF0dGFjaG1lbnQiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGNoYXIgY29uc3QgKmZzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQoaW5wdXRfYXR0YWNobWVudF9pbmRleD0wLCBzZXQ9MCwgYmluZGluZz0wKSB1bmlmb3JtIHN1YnBhc3NJbnB1dCB4O1xuIgorICAgICAgICAibGF5b3V0KGxvY2F0aW9uPTApIG91dCB2ZWM0IGNvbG9yO1xuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICAgY29sb3IgPSBzdWJwYXNzTG9hZCh4KTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgZnNTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgVmtQaXBlbGluZU9iaiBwaXBlKG1fZGV2aWNlKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgZHNsYiA9IHswLCBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVCwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgbnVsbHB0cn07CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqIGRzbChtX2RldmljZSwge2RzbGJ9KTsKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBsKG1fZGV2aWNlLCB7JmRzbH0pOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gZGVzY3NbMl0gPSB7CisgICAgICAgIHswLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwgVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkUsCisgICAgICAgICBWS19BVFRBQ0hNRU5UX0xPQURfT1BfTE9BRCwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9LAorICAgICAgICB7MCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FELCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfU1RPUkUsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTH0sCisgICAgfTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgY29sb3IgPSB7CisgICAgICAgIDAsCisgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgfTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgaW5wdXQgPSB7CisgICAgICAgIDEsCisgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgIH07CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzZCA9IHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAxLCAmaW5wdXQsIDEsICZjb2xvciwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDIsIGRlc2NzLCAxLCAmc2QsIDAsIG51bGxwdHJ9OworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBzaG91bGQgYmUgT0suIHdvdWxkIGdvIHdyb25nIGhlcmUgaWYgaXQncyBnb2luZyB0by4uLgorICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShwbC5oYW5kbGUoKSwgcnApOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycCwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDcmVhdGVDb21wdXRlUGlwZWxpbmVNaXNzaW5nRGVzY3JpcHRvclVudXNlZFBvc2l0aXZlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigKKyAgICAgICAgIlRlc3QgdGhhdCBwaXBlbGluZSB2YWxpZGF0aW9uIGFjY2VwdHMgYSBjb21wdXRlIHBpcGVsaW5lIHdoaWNoIGRlY2xhcmVzIGEgZGVzY3JpcHRvci1iYWNrZWQgcmVzb3VyY2Ugd2hpY2ggaXMgbm90ICIKKyAgICAgICAgInByb3ZpZGVkLCBidXQgdGhlIHNoYWRlciBkb2VzIG5vdCBzdGF0aWNhbGx5IHVzZSBpdC4gVGhpcyBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIGl0IHJlcXVpcmVzIGNvbXB1dGUgcGlwZWxpbmVzIHRvIGhhdmUgYSAiCisgICAgICAgICJwcm9wZXIgZGVzY3JpcHRvciB1c2Ugd2Fsaywgd2hpY2ggdGhleSBkaWRuJ3QgZm9yIHNvbWUgdGltZS4iKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGNoYXIgY29uc3QgKmNzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYWxfc2l6ZV94PTEpIGluO1xuIgorICAgICAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTApIGJ1ZmZlciBibG9jayB7IHZlYzQgeDsgfTtcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgLy8geCBpcyBub3QgdXNlZC5cbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuY3NfLnJlc2V0KG5ldyBWa1NoYWRlck9iaihtX2RldmljZSwgY3NTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgdGhpcykpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVDb21wdXRlUGlwZWxpbmUoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lQ29tYmluZWRJbWFnZVNhbXBsZXJDb25zdW1lZEFzU2FtcGxlcikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgcGlwZWxpbmUgdmFsaWRhdGlvbiBhY2NlcHRzIGEgc2hhZGVyIGNvbnN1bWluZyBvbmx5IHRoZSBzYW1wbGVyIHBvcnRpb24gb2YgYSBjb21iaW5lZCBpbWFnZSArIHNhbXBsZXIiKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmc+IGJpbmRpbmdzID0geworICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgbnVsbHB0cn0sCisgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSwgMSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCBudWxscHRyfSwKKyAgICAgICAgezIsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklULCBudWxscHRyfSwKKyAgICB9OworCisgICAgY2hhciBjb25zdCAqY3NTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhbF9zaXplX3g9MSkgaW47XG4iCisgICAgICAgICJsYXlvdXQoc2V0PTAsIGJpbmRpbmc9MCkgdW5pZm9ybSBzYW1wbGVyIHM7XG4iCisgICAgICAgICJsYXlvdXQoc2V0PTAsIGJpbmRpbmc9MSkgdW5pZm9ybSB0ZXh0dXJlMkQgdDtcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0yKSBidWZmZXIgYmxvY2sgeyB2ZWM0IHg7IH07XG4iCisgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICIgICB4ID0gdGV4dHVyZShzYW1wbGVyMkQodCwgcyksIHZlYzIoMCkpO1xuIgorICAgICAgICAifVxuIjsKKyAgICBDcmVhdGVDb21wdXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuZHNsX2JpbmRpbmdzXy5yZXNpemUoYmluZGluZ3Muc2l6ZSgpKTsKKyAgICBtZW1jcHkocGlwZS5kc2xfYmluZGluZ3NfLmRhdGEoKSwgYmluZGluZ3MuZGF0YSgpLCBiaW5kaW5ncy5zaXplKCkgKiBzaXplb2YoVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZykpOworICAgIHBpcGUuY3NfLnJlc2V0KG5ldyBWa1NoYWRlck9iaihtX2RldmljZSwgY3NTb3VyY2UsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgdGhpcykpOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBwaXBlLkNyZWF0ZUNvbXB1dGVQaXBlbGluZSgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDcmVhdGVDb21wdXRlUGlwZWxpbmVDb21iaW5lZEltYWdlU2FtcGxlckNvbnN1bWVkQXNJbWFnZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgcGlwZWxpbmUgdmFsaWRhdGlvbiBhY2NlcHRzIGEgc2hhZGVyIGNvbnN1bWluZyBvbmx5IHRoZSBpbWFnZSBwb3J0aW9uIG9mIGEgY29tYmluZWQgaW1hZ2UgKyBzYW1wbGVyIik7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiBiaW5kaW5ncyA9IHsKKyAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIG51bGxwdHJ9LAorICAgICAgICB7MSwgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgbnVsbHB0cn0sCisgICAgICAgIHsyLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVCwgbnVsbHB0cn0sCisgICAgfTsKKworICAgIGNoYXIgY29uc3QgKmNzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiXG4iCisgICAgICAgICJsYXlvdXQobG9jYWxfc2l6ZV94PTEpIGluO1xuIgorICAgICAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTApIHVuaWZvcm0gdGV4dHVyZTJEIHQ7XG4iCisgICAgICAgICJsYXlvdXQoc2V0PTAsIGJpbmRpbmc9MSkgdW5pZm9ybSBzYW1wbGVyIHM7XG4iCisgICAgICAgICJsYXlvdXQoc2V0PTAsIGJpbmRpbmc9MikgYnVmZmVyIGJsb2NrIHsgdmVjNCB4OyB9O1xuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICAgeCA9IHRleHR1cmUoc2FtcGxlcjJEKHQsIHMpLCB2ZWMyKDApKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLmRzbF9iaW5kaW5nc18ucmVzaXplKGJpbmRpbmdzLnNpemUoKSk7CisgICAgbWVtY3B5KHBpcGUuZHNsX2JpbmRpbmdzXy5kYXRhKCksIGJpbmRpbmdzLmRhdGEoKSwgYmluZGluZ3Muc2l6ZSgpICogc2l6ZW9mKFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcpKTsKKyAgICBwaXBlLmNzXy5yZXNldChuZXcgVmtTaGFkZXJPYmoobV9kZXZpY2UsIGNzU291cmNlLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIHRoaXMpKTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgcGlwZS5DcmVhdGVDb21wdXRlUGlwZWxpbmUoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lQ29tYmluZWRJbWFnZVNhbXBsZXJDb25zdW1lZEFzQm90aCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgcGlwZWxpbmUgdmFsaWRhdGlvbiBhY2NlcHRzIGEgc2hhZGVyIGNvbnN1bWluZyBib3RoIHRoZSBzYW1wbGVyIGFuZCB0aGUgaW1hZ2Ugb2YgYSBjb21iaW5lZCBpbWFnZStzYW1wbGVyIGJ1dCAiCisgICAgICAgICJ2aWEgc2VwYXJhdGUgdmFyaWFibGVzIik7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiBiaW5kaW5ncyA9IHsKKyAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIG51bGxwdHJ9LAorICAgICAgICB7MSwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIG51bGxwdHJ9LAorICAgIH07CisKKyAgICBjaGFyIGNvbnN0ICpjc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KGxvY2FsX3NpemVfeD0xKSBpbjtcbiIKKyAgICAgICAgImxheW91dChzZXQ9MCwgYmluZGluZz0wKSB1bmlmb3JtIHRleHR1cmUyRCB0O1xuIgorICAgICAgICAibGF5b3V0KHNldD0wLCBiaW5kaW5nPTApIHVuaWZvcm0gc2FtcGxlciBzOyAgLy8gYm90aCBiaW5kaW5nIDAhXG4iCisgICAgICAgICJsYXlvdXQoc2V0PTAsIGJpbmRpbmc9MSkgYnVmZmVyIGJsb2NrIHsgdmVjNCB4OyB9O1xuIgorICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAiICAgeCA9IHRleHR1cmUoc2FtcGxlcjJEKHQsIHMpLCB2ZWMyKDApKTtcbiIKKyAgICAgICAgIn1cbiI7CisgICAgQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLmRzbF9iaW5kaW5nc18ucmVzaXplKGJpbmRpbmdzLnNpemUoKSk7CisgICAgbWVtY3B5KHBpcGUuZHNsX2JpbmRpbmdzXy5kYXRhKCksIGJpbmRpbmdzLmRhdGEoKSwgYmluZGluZ3Muc2l6ZSgpICogc2l6ZW9mKFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcpKTsKKyAgICBwaXBlLmNzXy5yZXNldChuZXcgVmtTaGFkZXJPYmoobV9kZXZpY2UsIGNzU291cmNlLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIHRoaXMpKTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgcGlwZS5DcmVhdGVDb21wdXRlUGlwZWxpbmUoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlRGVzY3JpcHRvclNldEJpbmRpbmdXaXRoSWdub3JlZFNhbXBsZXJzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGF0IGxheWVycyBjb25kaXRpb25hbGx5IGRvIGlnbm9yZSB0aGUgcEltbXV0YWJsZVNhbXBsZXJzIG9uIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCIpOworCisgICAgYm9vbCBwcm9wMl9mb3VuZCA9IGZhbHNlOworICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBwcm9wMl9mb3VuZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgcHVzaCBkZXNjcmlwdG9yIHN1Yi10ZXN0c1xuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGJvb2wgcHVzaF9kZXNjcmlwdG9yX2ZvdW5kID0gZmFsc2U7CisgICAgaWYgKHByb3AyX2ZvdW5kICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX1BVU0hfREVTQ1JJUFRPUl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKTsKKworICAgICAgICAvLyBJbiBhZGRpdGlvbiB0byB0aGUgZXh0ZW5zaW9uIGJlaW5nIHN1cHBvcnRlZCB3ZSBuZWVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGF2YWlsYWJsZQorICAgICAgICAvLyBTb21lIGltcGxlbWVudGF0aW9ucyByZXBvcnQgYW4gaW52YWxpZCBtYXhQdXNoRGVzY3JpcHRvcnMgb2YgMAorICAgICAgICBwdXNoX2Rlc2NyaXB0b3JfZm91bmQgPSBHZXRQdXNoRGVzY3JpcHRvclByb3BlcnRpZXMoaW5zdGFuY2UoKSwgZ3B1KCkpLm1heFB1c2hEZXNjcmlwdG9ycyA+IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgcHVzaCBkZXNjcmlwdG9yIHN1Yi10ZXN0c1xuIiwga1NraXBQcmVmaXgsCisgICAgICAgICAgICAgICBWS19LSFJfUFVTSF9ERVNDUklQVE9SX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisgICAgY29uc3QgdWludDY0X3QgZmFrZV9hZGRyZXNzXzY0ID0gMHhDRENEQ0RDRENEQ0RDRENEOworICAgIGNvbnN0IHVpbnQ2NF90IGZha2VfYWRkcmVzc18zMiA9IDB4Q0RDRENEQ0Q7CisgICAgY29uc3Qgdm9pZCAqZmFrZV9wb2ludGVyID0KKyAgICAgICAgc2l6ZW9mKHZvaWQgKikgPT0gOCA/IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihmYWtlX2FkZHJlc3NfNjQpIDogcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGZha2VfYWRkcmVzc18zMik7CisgICAgY29uc3QgVmtTYW1wbGVyICpob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1NhbXBsZXIgKj4oZmFrZV9wb2ludGVyKTsKKworICAgIC8vIHJlZ3VsYXIgZGVzY3JpcHRvcnMKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHsKKyAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBub25fc2FtcGxlcl9iaW5kaW5nc1tdID0geworICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyfSwKKyAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcn0sCisgICAgICAgICAgICB7MiwgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyfSwKKyAgICAgICAgICAgIHszLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVIsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIGhvcGVmdWxseV91bmRlcmVmZXJlbmNhYmxlX3BvaW50ZXJ9LAorICAgICAgICAgICAgezQsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcn0sCisgICAgICAgICAgICB7NSwgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyfSwKKyAgICAgICAgICAgIHs2LCBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQywgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcn0sCisgICAgICAgICAgICB7NywgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUMsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIGhvcGVmdWxseV91bmRlcmVmZXJlbmNhYmxlX3BvaW50ZXJ9LAorICAgICAgICAgICAgezgsIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5ULCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyfSwKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyBkc2xjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemUobm9uX3NhbXBsZXJfYmluZGluZ3MpKSwgbm9uX3NhbXBsZXJfYmluZGluZ3N9OworICAgICAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgZHNsOworICAgICAgICBjb25zdCBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksICZkc2xjaSwgbnVsbHB0ciwgJmRzbCk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtX2RldmljZS0+ZGV2aWNlKCksIGRzbCwgbnVsbHB0cik7CisgICAgfQorICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgaWYgKHB1c2hfZGVzY3JpcHRvcl9mb3VuZCkgeworICAgICAgICAvLyBwdXNoIGRlc2NyaXB0b3JzCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgbm9uX3NhbXBsZXJfYmluZGluZ3NbXSA9IHsKKyAgICAgICAgICAgICAgICB7MCwgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0UsIDEsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIGhvcGVmdWxseV91bmRlcmVmZXJlbmNhYmxlX3BvaW50ZXJ9LAorICAgICAgICAgICAgICAgIHsxLCBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcn0sCisgICAgICAgICAgICAgICAgezIsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX1RFWEVMX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcn0sCisgICAgICAgICAgICAgICAgezMsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcn0sCisgICAgICAgICAgICAgICAgezQsIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcn0sCisgICAgICAgICAgICAgICAgezUsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcn0sCisgICAgICAgICAgICAgICAgezYsIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5ULCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyfSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGRzbGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9QVVNIX0RFU0NSSVBUT1JfQklUX0tIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemUobm9uX3NhbXBsZXJfYmluZGluZ3MpKSwgbm9uX3NhbXBsZXJfYmluZGluZ3N9OworICAgICAgICAgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGRzbDsKKyAgICAgICAgICAgIGNvbnN0IFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJmRzbGNpLCBudWxscHRyLCAmZHNsKTsKKyAgICAgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgICAgICB2azo6RGVzdHJveURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmRldmljZSgpLCBkc2wsIG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIH0KK30KK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBHcHVWYWxpZGF0aW9uSW5saW5lVW5pZm9ybUJsb2NrQW5kTWlzY0dwdSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJHUFUgdmFsaWRhdGlvbjogTWFrZSBzdXJlIGlubGluZSB1bmlmb3JtIGJsb2NrcyBkb24ndCBnZW5lcmF0ZSBmYWxzZSB2YWxpZGF0aW9uIGVycm9ycywgdmVyaWZ5IHJlc2VydmVkIGRlc2NyaXB0b3Igc2xvdCAiCisgICAgICAgICJhbmQgdmVyaWZ5IHBpcGVsaW5lIHJlY292ZXJ5Iik7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlRW5hYmxlRVhUIGVuYWJsZXNbXSA9IHtWS19WQUxJREFUSU9OX0ZFQVRVUkVfRU5BQkxFX0dQVV9BU1NJU1RFRF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfUkVTRVJWRV9CSU5ESU5HX1NMT1RfRVhUfTsKKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlc0VYVCBmZWF0dXJlcyA9IHt9OworICAgIGZlYXR1cmVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfVkFMSURBVElPTl9GRUFUVVJFU19FWFQ7CisgICAgZmVhdHVyZXMuZW5hYmxlZFZhbGlkYXRpb25GZWF0dXJlQ291bnQgPSAyOworICAgIGZlYXR1cmVzLnBFbmFibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gZW5hYmxlczsKKyAgICBib29sIGRlc2NyaXB0b3JfaW5kZXhpbmcgPSBDaGVja0Rlc2NyaXB0b3JJbmRleGluZ1N1cHBvcnRBbmRJbml0RnJhbWV3b3JrKHRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLCAmZmVhdHVyZXMsIG1fZXJyb3JNb25pdG9yKTsKKyAgICBpZiAoRGV2aWNlSXNNb2NrSUNEKCkgfHwgRGV2aWNlU2ltdWxhdGlvbigpKSB7CisgICAgICAgIHByaW50ZigiJXMgVGVzdCBub3Qgc3VwcG9ydGVkIGJ5IE1vY2tJQ0QsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBmZWF0dXJlczIgPSB7fTsKKyAgICBhdXRvIGluZGV4aW5nX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VEZXNjcmlwdG9ySW5kZXhpbmdGZWF0dXJlc0VYVD4oKTsKKyAgICBhdXRvIGlubGluZV91bmlmb3JtX2Jsb2NrX2ZlYXR1cmVzID0gbHZsX2luaXRfc3RydWN0PFZrUGh5c2ljYWxEZXZpY2VJbmxpbmVVbmlmb3JtQmxvY2tGZWF0dXJlc0VYVD4oJmluZGV4aW5nX2ZlYXR1cmVzKTsKKyAgICBib29sIGlubGluZV91bmlmb3JtX2Jsb2NrID0gRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19FWFRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhURU5TSU9OX05BTUUpOworICAgIGlmICghKGRlc2NyaXB0b3JfaW5kZXhpbmcgJiYgaW5saW5lX3VuaWZvcm1fYmxvY2spKSB7CisgICAgICAgIHByaW50ZigiRGVzY3JpcHRvciBpbmRleGluZyBhbmQvb3IgaW5saW5lIHVuaWZvcm0gYmxvY2sgbm90IHN1cHBvcnRlZCBTa2lwcGluZyB0ZXN0XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpOworICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfRVhUX0lOTElORV9VTklGT1JNX0JMT0NLX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKworICAgIGZlYXR1cmVzMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSPigmaW5saW5lX3VuaWZvcm1fYmxvY2tfZmVhdHVyZXMpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIoZ3B1KCksICZmZWF0dXJlczIpOworICAgIGlmICghaW5kZXhpbmdfZmVhdHVyZXMuZGVzY3JpcHRvckJpbmRpbmdQYXJ0aWFsbHlCb3VuZCB8fCAhaW5saW5lX3VuaWZvcm1fYmxvY2tfZmVhdHVyZXMuaW5saW5lVW5pZm9ybUJsb2NrKSB7CisgICAgICAgIHByaW50ZigiTm90IGFsbCBmZWF0dXJlcyBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gaW5saW5lX3VuaWZvcm1fcHJvcHMgPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtQaHlzaWNhbERldmljZUlubGluZVVuaWZvcm1CbG9ja1Byb3BlcnRpZXNFWFQ+KCk7CisgICAgYXV0byBwcm9wMiA9IGx2bF9pbml0X3N0cnVjdDxWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllczJLSFI+KCZpbmxpbmVfdW5pZm9ybV9wcm9wcyk7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczIoZ3B1KCksICZwcm9wMik7CisKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgcG9vbF9mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAmZmVhdHVyZXMyLCBwb29sX2ZsYWdzKSk7CisgICAgaWYgKG1fZGV2aWNlLT5wcm9wcy5hcGlWZXJzaW9uIDwgVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIHByaW50ZigiJXMgR1BVLUFzc2lzdGVkIHZhbGlkYXRpb24gdGVzdCByZXF1aXJlcyBWdWxrYW4gMS4xKy5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdXRvIGNfcXVldWUgPSBtX2RldmljZS0+R2V0RGVmYXVsdENvbXB1dGVRdWV1ZSgpOworICAgIGlmIChudWxscHRyID09IGNfcXVldWUpIHsKKyAgICAgICAgcHJpbnRmKCJDb21wdXRlIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3QgcWZpID0gMDsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYmNpID0ge307CisgICAgYmNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJjaS51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX0JVRkZFUl9CSVQ7CisgICAgYmNpLnNpemUgPSA0OworICAgIGJjaS5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAxOworICAgIGJjaS5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKyAgICBWa0J1ZmZlck9iaiBidWZmZXIwOworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fcHJvcHMgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDsKKyAgICBidWZmZXIwLmluaXQoKm1fZGV2aWNlLCBiY2ksIG1lbV9wcm9wcyk7CisKKyAgICBWa0Rlc2NyaXB0b3JCaW5kaW5nRmxhZ3NFWFQgZHNfYmluZGluZ19mbGFnc1syXSA9IHt9OworICAgIGRzX2JpbmRpbmdfZmxhZ3NbMV0gPSBWS19ERVNDUklQVE9SX0JJTkRJTkdfUEFSVElBTExZX0JPVU5EX0JJVF9FWFQ7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ0ZsYWdzQ3JlYXRlSW5mb0VYVCBsYXlvdXRfY3JlYXRlaW5mb19iaW5kaW5nX2ZsYWdzWzFdID0ge307CisgICAgbGF5b3V0X2NyZWF0ZWluZm9fYmluZGluZ19mbGFnc1swXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9CSU5ESU5HX0ZMQUdTX0NSRUFURV9JTkZPX0VYVDsKKyAgICBsYXlvdXRfY3JlYXRlaW5mb19iaW5kaW5nX2ZsYWdzWzBdLnBOZXh0ID0gTlVMTDsKKyAgICBsYXlvdXRfY3JlYXRlaW5mb19iaW5kaW5nX2ZsYWdzWzBdLmJpbmRpbmdDb3VudCA9IDI7CisgICAgbGF5b3V0X2NyZWF0ZWluZm9fYmluZGluZ19mbGFnc1swXS5wQmluZGluZ0ZsYWdzID0gZHNfYmluZGluZ19mbGFnczsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIFZLX0RFU0NSSVBUT1JfVFlQRV9JTkxJTkVfVU5JRk9STV9CTE9DS19FWFQsIDIwLCBWS19TSEFERVJfU1RBR0VfQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyfSwgIC8vIDE2IGJ5dGVzIGZvciBpdmVjNCwgNCBtb3JlIGZvciBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBsYXlvdXRfY3JlYXRlaW5mb19iaW5kaW5nX2ZsYWdzLCAwKTsKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBpcGVsaW5lX2xheW91dChtX2RldmljZSwgeyZkZXNjcmlwdG9yX3NldC5sYXlvdXRffSk7CisKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIGJ1ZmZlcl9pbmZvWzFdID0ge307CisgICAgYnVmZmVyX2luZm9bMF0uYnVmZmVyID0gYnVmZmVyMC5oYW5kbGUoKTsKKyAgICBidWZmZXJfaW5mb1swXS5vZmZzZXQgPSAwOworICAgIGJ1ZmZlcl9pbmZvWzBdLnJhbmdlID0gc2l6ZW9mKHVpbnQzMl90KTsKKworICAgIGNvbnN0IHVpbnQzMl90IHRlc3RfZGF0YSA9IDB4ZGVhZGNhNzsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldElubGluZVVuaWZvcm1CbG9ja0VYVCB3cml0ZV9pbmxpbmVfdW5pZm9ybSA9IHt9OworICAgIHdyaXRlX2lubGluZV91bmlmb3JtLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVRfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOworICAgIHdyaXRlX2lubGluZV91bmlmb3JtLmRhdGFTaXplID0gNDsKKyAgICB3cml0ZV9pbmxpbmVfdW5pZm9ybS5wRGF0YSA9ICZ0ZXN0X2RhdGE7CisKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3dyaXRlc1syXSA9IHt9OworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMF0uZHN0U2V0ID0gZGVzY3JpcHRvcl9zZXQuc2V0XzsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5kc3RCaW5kaW5nID0gMDsKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1swXS5kZXNjcmlwdG9yQ291bnQgPSAxOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzBdLnBCdWZmZXJJbmZvID0gYnVmZmVyX2luZm87CisKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1sxXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLmRzdFNldCA9IGRlc2NyaXB0b3Jfc2V0LnNldF87CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZHN0QmluZGluZyA9IDE7CisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZHN0QXJyYXlFbGVtZW50ID0gMTY7ICAvLyBTa2lwIGZpcnN0IDE2IGJ5dGVzIChkdW1teSkKKyAgICBkZXNjcmlwdG9yX3dyaXRlc1sxXS5kZXNjcmlwdG9yQ291bnQgPSA0OyAgIC8vIFdyaXRlIDQgYnl0ZXMgdG8gdmFsCisgICAgZGVzY3JpcHRvcl93cml0ZXNbMV0uZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOworICAgIGRlc2NyaXB0b3Jfd3JpdGVzWzFdLnBOZXh0ID0gJndyaXRlX2lubGluZV91bmlmb3JtOworICAgIHZrOjpVcGRhdGVEZXNjcmlwdG9yU2V0cyhtX2RldmljZS0+ZGV2aWNlKCksIDIsIGRlc2NyaXB0b3Jfd3JpdGVzLCAwLCBOVUxMKTsKKworICAgIGNoYXIgY29uc3QgKmNzU291cmNlID0KKyAgICAgICAgIiN2ZXJzaW9uIDQ1MFxuIgorICAgICAgICAiI2V4dGVuc2lvbiBHTF9FWFRfbm9udW5pZm9ybV9xdWFsaWZpZXIgOiBlbmFibGVcbiAiCisgICAgICAgICJsYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDApIGJ1ZmZlciBTdG9yYWdlQnVmZmVyIHsgdWludCBpbmRleDsgfSB1X2luZGV4OyIKKyAgICAgICAgImxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMSkgdW5pZm9ybSBpbmxpbmV1Ym9kZWYgeyBpdmVjNCBkdW1teTsgaW50IHZhbDsgfSBpbmxpbmV1Ym87XG4iCisKKyAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgIiAgICB1X2luZGV4LmluZGV4ID0gaW5saW5ldWJvLnZhbDtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBhdXRvIHNoYWRlcl9tb2R1bGUgPSBuZXcgVmtTaGFkZXJPYmoobV9kZXZpY2UsIGNzU291cmNlLCBWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIHRoaXMpOworCisgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBzdGFnZTsKKyAgICBzdGFnZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTzsKKyAgICBzdGFnZS5wTmV4dCA9IG51bGxwdHI7CisgICAgc3RhZ2UuZmxhZ3MgPSAwOworICAgIHN0YWdlLnN0YWdlID0gVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUOworICAgIHN0YWdlLm1vZHVsZSA9IHNoYWRlcl9tb2R1bGUtPmhhbmRsZSgpOworICAgIHN0YWdlLnBOYW1lID0gIm1haW4iOworICAgIHN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8gPSBudWxscHRyOworCisgICAgLy8gQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcworICAgIFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyBwaXBlbGluZV9pbmZvID0ge307CisgICAgcGlwZWxpbmVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTVBVVEVfUElQRUxJTkVfQ1JFQVRFX0lORk87CisgICAgcGlwZWxpbmVfaW5mby5wTmV4dCA9IG51bGxwdHI7CisgICAgcGlwZWxpbmVfaW5mby5mbGFncyA9IDA7CisgICAgcGlwZWxpbmVfaW5mby5sYXlvdXQgPSBwaXBlbGluZV9sYXlvdXQuaGFuZGxlKCk7CisgICAgcGlwZWxpbmVfaW5mby5iYXNlUGlwZWxpbmVIYW5kbGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBwaXBlbGluZV9pbmZvLmJhc2VQaXBlbGluZUluZGV4ID0gLTE7CisgICAgcGlwZWxpbmVfaW5mby5zdGFnZSA9IHN0YWdlOworCisgICAgVmtQaXBlbGluZSBjX3BpcGVsaW5lOworICAgIHZrOjpDcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJnBpcGVsaW5lX2luZm8sIG51bGxwdHIsICZjX3BpcGVsaW5lKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgY19waXBlbGluZSk7CisgICAgdms6OkNtZEJpbmREZXNjcmlwdG9yU2V0cyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEUsIHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3NldC5zZXRfLCAwLCBudWxscHRyKTsKKyAgICB2azo6Q21kRGlzcGF0Y2gobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMSwgMSwgMSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbyA9IHt9OworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICB2azo6UXVldWVTdWJtaXQoY19xdWV1ZS0+aGFuZGxlKCksIDEsICZzdWJtaXRfaW5mbywgVktfTlVMTF9IQU5ETEUpOworICAgIHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lKG1fZGV2aWNlLT5oYW5kbGUoKSwgY19waXBlbGluZSwgTlVMTCk7CisKKyAgICB1aW50MzJfdCAqZGF0YSA9ICh1aW50MzJfdCAqKWJ1ZmZlcjAubWVtb3J5KCkubWFwKCk7CisgICAgQVNTRVJUX1RSVUUoKmRhdGEgPSB0ZXN0X2RhdGEpOworICAgICpkYXRhID0gMDsKKyAgICBidWZmZXIwLm1lbW9yeSgpLnVubWFwKCk7CisKKyAgICAvLyBBbHNvIHZlcmlmeSB0aGF0IGJpbmRpbmcgc2xvdCByZXNlcnZhdGlvbiBpcyB3b3JraW5nCisgICAgVmtJbnN0YW5jZUNyZWF0ZUluZm8gaW5zdF9pbmZvID0ge307CisgICAgVmtJbnN0YW5jZSB0ZXN0X2luc3Q7CisgICAgaW5zdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU5TVEFOQ0VfQ1JFQVRFX0lORk87CisgICAgdms6OkNyZWF0ZUluc3RhbmNlKCZpbnN0X2luZm8sIE5VTEwsICZ0ZXN0X2luc3QpOworICAgIHVpbnQzMl90IGdwdV9jb3VudDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIG9ianNbNF07CisgICAgdms6OkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyh0ZXN0X2luc3QsICZncHVfY291bnQsIE5VTEwpOworICAgIGlmIChncHVfY291bnQgPiA0KSBncHVfY291bnQgPSA0OworICAgIHZrOjpFbnVtZXJhdGVQaHlzaWNhbERldmljZXModGVzdF9pbnN0LCAmZ3B1X2NvdW50LCBvYmpzKTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMob2Jqc1swXSwgJnByb3BlcnRpZXMpOworICAgIGlmIChtX2RldmljZS0+cHJvcHMubGltaXRzLm1heEJvdW5kRGVzY3JpcHRvclNldHMgIT0gcHJvcGVydGllcy5saW1pdHMubWF4Qm91bmREZXNjcmlwdG9yU2V0cyAtIDEpCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXRFcnJvcigiVktfVkFMSURBVElPTl9GRUFUVVJFX0VOQUJMRV9HUFVfQVNTSVNURURfUkVTRVJWRV9CSU5ESU5HX1NMT1RfRVhUIG5vdCBmdW5jdGlvbmluZyBhcyBleHBlY3RlZCIpOworICAgIHZrOjpEZXN0cm95SW5zdGFuY2UodGVzdF9pbnN0LCBOVUxMKTsKKworICAgIC8vIE5vdyBiZSBzdXJlIHRoYXQgcmVjb3ZlcnkgZnJvbSBhbiB1bmF2YWlsYWJsZSBkZXNjcmlwdG9yIHNldCB3b3JrcyBhbmQgdGhhdCB1bmluc3RydW1lbnRlZCBzaGFkZXJzIGFyZSB1c2VkCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkc2xfYmluZGluZ1syXSA9IHt9OworICAgIGRzbF9iaW5kaW5nWzBdLmJpbmRpbmcgPSAwOworICAgIGRzbF9iaW5kaW5nWzBdLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOworICAgIGRzbF9iaW5kaW5nWzBdLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgZHNsX2JpbmRpbmdbMF0uc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9BTEw7CisgICAgZHNsX2JpbmRpbmdbMV0uYmluZGluZyA9IDE7CisgICAgZHNsX2JpbmRpbmdbMV0uZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfSU5MSU5FX1VOSUZPUk1fQkxPQ0tfRVhUOworICAgIGRzbF9iaW5kaW5nWzFdLmRlc2NyaXB0b3JDb3VudCA9IDIwOworICAgIGRzbF9iaW5kaW5nWzFdLnN0YWdlRmxhZ3MgPSBWS19TSEFERVJfU1RBR0VfQUxMOworICAgIFZrRGVzY3JpcHRvclNldExheW91dCBsYXlvdXRzWzMyXTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGRzbF9jcmVhdGVfaW5mbyA9IHt9OworICAgIGRzbF9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBkc2xfY3JlYXRlX2luZm8ucE5leHQgPSBsYXlvdXRfY3JlYXRlaW5mb19iaW5kaW5nX2ZsYWdzOworICAgIGRzbF9jcmVhdGVfaW5mby5wQmluZGluZ3MgPSBkc2xfYmluZGluZzsKKyAgICBkc2xfY3JlYXRlX2luZm8uYmluZGluZ0NvdW50ID0gMjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgdms6OkNyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCAmZHNsX2NyZWF0ZV9pbmZvLCBOVUxMLCAmbGF5b3V0c1tpXSk7CisgICAgfQorICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHBsX2NyZWF0ZV9pbmZvID0ge307CisgICAgVmtQaXBlbGluZUxheW91dCBwbF9sYXlvdXQ7CisgICAgcGxfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk87CisgICAgcGxfY3JlYXRlX2luZm8uc2V0TGF5b3V0Q291bnQgPSAzMjsKKyAgICBwbF9jcmVhdGVfaW5mby5wU2V0TGF5b3V0cyA9IGxheW91dHM7CisgICAgdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgJnBsX2NyZWF0ZV9pbmZvLCBOVUxMLCAmcGxfbGF5b3V0KTsKKyAgICBwaXBlbGluZV9pbmZvLmxheW91dCA9IHBsX2xheW91dDsKKyAgICB2azo6Q3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhkZXZpY2UoKSwgVktfTlVMTF9IQU5ETEUsIDEsICZwaXBlbGluZV9pbmZvLCBudWxscHRyLCAmY19waXBlbGluZSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9DT01QVVRFLCBjX3BpcGVsaW5lKTsKKyAgICB2azo6Q21kQmluZERlc2NyaXB0b3JTZXRzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURSwgcGxfbGF5b3V0LCAwLCAxLCAmZGVzY3JpcHRvcl9zZXQuc2V0XywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIHZrOjpDbWREaXNwYXRjaChtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAxLCAxLCAxKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChjX3F1ZXVlLT5oYW5kbGUoKSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgdms6OlF1ZXVlV2FpdElkbGUobV9kZXZpY2UtPm1fcXVldWUpOworICAgIHZrOjpEZXN0cm95U2hhZGVyTW9kdWxlKG1fZGV2aWNlLT5oYW5kbGUoKSwgc2hhZGVyX21vZHVsZS0+aGFuZGxlKCksIE5VTEwpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmVMYXlvdXQobV9kZXZpY2UtPmhhbmRsZSgpLCBwbF9sYXlvdXQsIE5VTEwpOworICAgIHZrOjpEZXN0cm95UGlwZWxpbmUobV9kZXZpY2UtPmhhbmRsZSgpLCBjX3BpcGVsaW5lLCBOVUxMKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgdms6OkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgbGF5b3V0c1tpXSwgTlVMTCk7CisgICAgfQorICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIGRhdGEgPSAodWludDMyX3QgKilidWZmZXIwLm1lbW9yeSgpLm1hcCgpOworICAgIGlmICgqZGF0YSAhPSB0ZXN0X2RhdGEpIG1fZXJyb3JNb25pdG9yLT5TZXRFcnJvcigiUGlwZWxpbmUgcmVjb3Zlcnkgd2hlbiByZXNvdXJjZXMgdW5hdmFpbGFibGUgbm90IGZ1bmN0aW9uaW5nIGFzIGV4cGVjdGVkIik7CisgICAgYnVmZmVyMC5tZW1vcnkoKS51bm1hcCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgTWFpbnRlbmFuY2UxVGVzdHMpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJWYWxpZGF0ZSB2YXJpb3VzIHNwZWNpYWwgY2FzZXMgZm9yIHRoZSBNYWludGVuYW5jZTFfS0hSIGV4dGVuc2lvbiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIE1haW50ZW5hbmNlMSBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNtZF9idWYobV9kZXZpY2UsIG1fY29tbWFuZFBvb2wpOworICAgIGNtZF9idWYuYmVnaW4oKTsKKyAgICAvLyBTZXQgTmVnYXRpdmUgaGVpZ2h0LCBzaG91bGQgZ2l2ZSBlcnJvciBpZiBNYWludGVuYW5jZSAxIGlzIG5vdCBlbmFibGVkCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgLTE2LCAwLCAxfTsKKyAgICB2azo6Q21kU2V0Vmlld3BvcnQoY21kX2J1Zi5oYW5kbGUoKSwgMCwgMSwgJnZpZXdwb3J0KTsKKyAgICBjbWRfYnVmLmVuZCgpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBWYWxpZFN0cnVjdFBOZXh0KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IHRoYXQgYSB2YWxpZCBwTmV4dCB2YWx1ZSBpcyBoYW5kbGVkIGNvcnJlY3RseSIpOworCisgICAgLy8gUG9zaXRpdmUgdGVzdCB0byBjaGVjayBwYXJhbWV0ZXJfdmFsaWRhdGlvbiBhbmQgdW5pcXVlX29iamVjdHMgc3VwcG9ydCBmb3IgTlZfZGVkaWNhdGVkX2FsbG9jYXRpb24KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBWS19OVl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBWa0RlZGljYXRlZEFsbG9jYXRpb25CdWZmZXJDcmVhdGVJbmZvTlYgZGVkaWNhdGVkX2J1ZmZlcl9jcmVhdGVfaW5mbyA9IHt9OworICAgIGRlZGljYXRlZF9idWZmZXJfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9CVUZGRVJfQ1JFQVRFX0lORk9fTlY7CisgICAgZGVkaWNhdGVkX2J1ZmZlcl9jcmVhdGVfaW5mby5wTmV4dCA9IG51bGxwdHI7CisgICAgZGVkaWNhdGVkX2J1ZmZlcl9jcmVhdGVfaW5mby5kZWRpY2F0ZWRBbGxvY2F0aW9uID0gVktfVFJVRTsKKworICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleCA9IDA7CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGJ1ZmZlcl9jcmVhdGVfaW5mbyA9IHt9OworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8ucE5leHQgPSAmZGVkaWNhdGVkX2J1ZmZlcl9jcmVhdGVfaW5mbzsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8uc2l6ZSA9IDEwMjQ7CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVDsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8ucXVldWVGYW1pbHlJbmRleENvdW50ID0gMTsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8ucFF1ZXVlRmFtaWx5SW5kaWNlcyA9ICZxdWV1ZV9mYW1pbHlfaW5kZXg7CisKKyAgICBWa0J1ZmZlciBidWZmZXI7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZidWZmZXJfY3JlYXRlX2luZm8sIE5VTEwsICZidWZmZXIpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1vcnlfcmVxczsKKyAgICB2azo6R2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCAmbWVtb3J5X3JlcXMpOworCisgICAgVmtEZWRpY2F0ZWRBbGxvY2F0aW9uTWVtb3J5QWxsb2NhdGVJbmZvTlYgZGVkaWNhdGVkX21lbW9yeV9pbmZvID0ge307CisgICAgZGVkaWNhdGVkX21lbW9yeV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlY7CisgICAgZGVkaWNhdGVkX21lbW9yeV9pbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBkZWRpY2F0ZWRfbWVtb3J5X2luZm8uYnVmZmVyID0gYnVmZmVyOworICAgIGRlZGljYXRlZF9tZW1vcnlfaW5mby5pbWFnZSA9IFZLX05VTExfSEFORExFOworCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtb3J5X2luZm8gPSB7fTsKKyAgICBtZW1vcnlfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbW9yeV9pbmZvLnBOZXh0ID0gJmRlZGljYXRlZF9tZW1vcnlfaW5mbzsKKyAgICBtZW1vcnlfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IG1lbW9yeV9yZXFzLnNpemU7CisKKyAgICBib29sIHBhc3M7CisgICAgcGFzcyA9IG1fZGV2aWNlLT5waHkoKS5zZXRfbWVtb3J5X3R5cGUobWVtb3J5X3JlcXMubWVtb3J5VHlwZUJpdHMsICZtZW1vcnlfaW5mbywgMCk7CisgICAgQVNTRVJUX1RSVUUocGFzcyk7CisKKyAgICBWa0RldmljZU1lbW9yeSBidWZmZXJfbWVtb3J5OworICAgIGVyciA9IHZrOjpBbGxvY2F0ZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksICZtZW1vcnlfaW5mbywgTlVMTCwgJmJ1ZmZlcl9tZW1vcnkpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBlcnIgPSB2azo6QmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlciwgYnVmZmVyX21lbW9yeSwgMCk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIHZrOjpEZXN0cm95QnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgYnVmZmVyLCBOVUxMKTsKKyAgICB2azo6RnJlZU1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlcl9tZW1vcnksIE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBQU09Qb2x5Z29uTW9kZVZhbGlkKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVmVyaWZ5IHRoYXQgdXNpbmcgYSBzb2xpZCBwb2x5Z29uIGZpbGwgbW9kZSB3b3JrcyBjb3JyZWN0bHkuIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGRldmljZV9leHRlbnNpb25fbmFtZXM7CisgICAgYXV0byBmZWF0dXJlcyA9IG1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworICAgIC8vIEFydGlmaWNpYWxseSBkaXNhYmxlIHN1cHBvcnQgZm9yIG5vbi1zb2xpZCBmaWxsIG1vZGVzCisgICAgZmVhdHVyZXMuZmlsbE1vZGVOb25Tb2xpZCA9IGZhbHNlOworICAgIC8vIFRoZSBzYWNyaWZpY2lhbCBkZXZpY2Ugb2JqZWN0CisgICAgVmtEZXZpY2VPYmogdGVzdF9kZXZpY2UoMCwgZ3B1KCksIGRldmljZV9leHRlbnNpb25fbmFtZXMsICZmZWF0dXJlcyk7CisKKyAgICBWa1JlbmRlcnBhc3NPYmogcmVuZGVyX3Bhc3MoJnRlc3RfZGV2aWNlKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRPYmogcGlwZWxpbmVfbGF5b3V0KCZ0ZXN0X2RldmljZSk7CisKKyAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyByc19jaSA9IHt9OworICAgIHJzX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICByc19jaS5wTmV4dCA9IG51bGxwdHI7CisgICAgcnNfY2kubGluZVdpZHRoID0gMS4wZjsKKyAgICByc19jaS5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA9IGZhbHNlOworCisgICAgVmtTaGFkZXJPYmogdnMoJnRlc3RfZGV2aWNlLCBiaW5kU3RhdGVWZXJ0U2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGZzKCZ0ZXN0X2RldmljZSwgYmluZFN0YXRlRnJhZ1NoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworCisgICAgLy8gU2V0IHBvbHlnb25Nb2RlPUZJTEwuIE5vIGVycm9yIGlzIGV4cGVjdGVkCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICB7CisgICAgICAgIFZrUGlwZWxpbmVPYmogcGlwZSgmdGVzdF9kZXZpY2UpOworICAgICAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgICAgICBwaXBlLkFkZFNoYWRlcigmZnMpOworICAgICAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICAgICAgLy8gU2V0IHBvbHlnb25Nb2RlIHRvIGEgZ29vZCB2YWx1ZQorICAgICAgICByc19jaS5wb2x5Z29uTW9kZSA9IFZLX1BPTFlHT05fTU9ERV9GSUxMOworICAgICAgICBwaXBlLlNldFJhc3Rlcml6YXRpb24oJnJzX2NpKTsKKyAgICAgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgcmVuZGVyX3Bhc3MuaGFuZGxlKCkpOworICAgIH0KKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIExvbmdTZW1hcGhvcmVDaGFpbikgeworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIFZrUmVzdWx0IGVycjsKKworICAgIHN0ZDo6dmVjdG9yPFZrU2VtYXBob3JlPiBzZW1hcGhvcmVzOworCisgICAgY29uc3QgaW50IGNoYWluTGVuZ3RoID0gMzI3Njg7CisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZmxhZ3MgPSBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQ7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYWluTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDB9OworICAgICAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgICAgIGVyciA9IHZrOjpDcmVhdGVTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCAmc2NpLCBudWxscHRyLCAmc2VtYXBob3JlKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICBzZW1hcGhvcmVzLnB1c2hfYmFjayhzZW1hcGhvcmUpOworCisgICAgICAgIFZrU3VibWl0SW5mbyBzaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmVzLnNpemUoKSA+IDEgPyAxdSA6IDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3Jlcy5zaXplKCkgPiAxID8gJnNlbWFwaG9yZXNbc2VtYXBob3Jlcy5zaXplKCkgLSAyXSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VtYXBob3Jlc1tzZW1hcGhvcmVzLnNpemUoKSAtIDFdfTsKKyAgICAgICAgZXJyID0gdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAxLCAmc2ksIFZLX05VTExfSEFORExFKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDB9OworICAgIFZrRmVuY2UgZmVuY2U7CisgICAgZXJyID0gdms6OkNyZWF0ZUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZjaSwgbnVsbHB0ciwgJmZlbmNlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIFZrU3VibWl0SW5mbyBzaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywgbnVsbHB0ciwgMSwgJnNlbWFwaG9yZXMuYmFjaygpLCAmZmxhZ3MsIDAsIG51bGxwdHIsIDAsIG51bGxwdHJ9OworICAgIGVyciA9IHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnNpLCBmZW5jZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIHZrOjpXYWl0Rm9yRmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmZlbmNlLCBWS19UUlVFLCBVSU5UNjRfTUFYKTsKKworICAgIGZvciAoYXV0byBzZW1hcGhvcmUgOiBzZW1hcGhvcmVzKSB2azo6RGVzdHJveVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksIHNlbWFwaG9yZSwgbnVsbHB0cik7CisKKyAgICB2azo6RGVzdHJveUZlbmNlKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmVuY2UsIG51bGxwdHIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBFeHRlcm5hbFNlbWFwaG9yZSkgeworI2lmZGVmIF9XSU4zMgorICAgIGNvbnN0IGF1dG8gZXh0ZW5zaW9uX25hbWUgPSBWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX1dJTjMyX0VYVEVOU0lPTl9OQU1FOworICAgIGNvbnN0IGF1dG8gaGFuZGxlX3R5cGUgPSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0tNVF9CSVRfS0hSOworI2Vsc2UKKyAgICBjb25zdCBhdXRvIGV4dGVuc2lvbl9uYW1lID0gVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9GRF9FWFRFTlNJT05fTkFNRTsKKyAgICBjb25zdCBhdXRvIGhhbmRsZV90eXBlID0gVktfRVhURVJOQUxfU0VNQVBIT1JFX0hBTkRMRV9UWVBFX09QQVFVRV9GRF9CSVRfS0hSOworI2VuZGlmCisgICAgLy8gQ2hlY2sgZm9yIGV4dGVybmFsIHNlbWFwaG9yZSBpbnN0YW5jZSBleHRlbnNpb25zCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVybmFsIHNlbWFwaG9yZSBleHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgLy8gQ2hlY2sgZm9yIGV4dGVybmFsIHNlbWFwaG9yZSBkZXZpY2UgZXh0ZW5zaW9ucworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIGV4dGVuc2lvbl9uYW1lKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKGV4dGVuc2lvbl9uYW1lKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfRVhURVJOQUxfU0VNQVBIT1JFX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIEV4dGVybmFsIHNlbWFwaG9yZSBleHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIC8vIENoZWNrIGZvciBleHRlcm5hbCBzZW1hcGhvcmUgaW1wb3J0IGFuZCBleHBvcnQgY2FwYWJpbGl0eQorICAgIFZrUGh5c2ljYWxEZXZpY2VFeHRlcm5hbFNlbWFwaG9yZUluZm9LSFIgZXNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFRFUk5BTF9TRU1BUEhPUkVfSU5GT19LSFIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3R5cGV9OworICAgIFZrRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIGVzcCA9IHtWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9TRU1BUEhPUkVfUFJPUEVSVElFU19LSFIsIG51bGxwdHJ9OworICAgIGF1dG8gdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICAgICAgICAgIGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzS0hSIik7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllc0tIUihncHUoKSwgJmVzaSwgJmVzcCk7CisKKyAgICBpZiAoIShlc3AuZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlcyAmIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0VYUE9SVEFCTEVfQklUX0tIUikgfHwKKyAgICAgICAgIShlc3AuZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlcyAmIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFX0lNUE9SVEFCTEVfQklUX0tIUikpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlcm5hbCBzZW1hcGhvcmUgZG9lcyBub3Qgc3VwcG9ydCBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZywgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtSZXN1bHQgZXJyOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICAvLyBDcmVhdGUgYSBzZW1hcGhvcmUgdG8gZXhwb3J0IHBheWxvYWQgZnJvbQorICAgIFZrRXhwb3J0U2VtYXBob3JlQ3JlYXRlSW5mb0tIUiBlc2NpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9TRU1BUEhPUkVfQ1JFQVRFX0lORk9fS0hSLCBudWxscHRyLCBoYW5kbGVfdHlwZX07CisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9TRU1BUEhPUkVfQ1JFQVRFX0lORk8sICZlc2NpLCAwfTsKKworICAgIFZrU2VtYXBob3JlIGV4cG9ydF9zZW1hcGhvcmU7CisgICAgZXJyID0gdms6OkNyZWF0ZVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksICZzY2ksIG51bGxwdHIsICZleHBvcnRfc2VtYXBob3JlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgLy8gQ3JlYXRlIGEgc2VtYXBob3JlIHRvIGltcG9ydCBwYXlsb2FkIGludG8KKyAgICBzY2kucE5leHQgPSBudWxscHRyOworICAgIFZrU2VtYXBob3JlIGltcG9ydF9zZW1hcGhvcmU7CisgICAgZXJyID0gdms6OkNyZWF0ZVNlbWFwaG9yZShtX2RldmljZS0+ZGV2aWNlKCksICZzY2ksIG51bGxwdHIsICZpbXBvcnRfc2VtYXBob3JlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisjaWZkZWYgX1dJTjMyCisgICAgLy8gRXhwb3J0IHNlbWFwaG9yZSBwYXlsb2FkIHRvIGFuIG9wYXF1ZSBoYW5kbGUKKyAgICBIQU5ETEUgaGFuZGxlID0gbnVsbHB0cjsKKyAgICBWa1NlbWFwaG9yZUdldFdpbjMySGFuZGxlSW5mb0tIUiBnaGkgPSB7VktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIsIG51bGxwdHIsIGV4cG9ydF9zZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90eXBlfTsKKyAgICBhdXRvIHZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrR2V0U2VtYXBob3JlV2luMzJIYW5kbGVLSFIiKTsKKyAgICBlcnIgPSB2a0dldFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmdoaSwgJmhhbmRsZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIC8vIEltcG9ydCBvcGFxdWUgaGFuZGxlIGV4cG9ydGVkIGFib3ZlCisgICAgVmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUluZm9LSFIgaWhpID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfU0VNQVBIT1JFX1dJTjMyX0hBTkRMRV9JTkZPX0tIUiwgbnVsbHB0ciwgaW1wb3J0X3NlbWFwaG9yZSwgMCwgaGFuZGxlX3R5cGUsIGhhbmRsZSwgbnVsbHB0cn07CisgICAgYXV0byB2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSID0KKyAgICAgICAgKFBGTl92a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0ltcG9ydFNlbWFwaG9yZVdpbjMySGFuZGxlS0hSIik7CisgICAgZXJyID0gdmtJbXBvcnRTZW1hcGhvcmVXaW4zMkhhbmRsZUtIUihtX2RldmljZS0+ZGV2aWNlKCksICZpaGkpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisjZWxzZQorICAgIC8vIEV4cG9ydCBzZW1hcGhvcmUgcGF5bG9hZCB0byBhbiBvcGFxdWUgaGFuZGxlCisgICAgaW50IGZkID0gMDsKKyAgICBWa1NlbWFwaG9yZUdldEZkSW5mb0tIUiBnaGkgPSB7VktfU1RSVUNUVVJFX1RZUEVfU0VNQVBIT1JFX0dFVF9GRF9JTkZPX0tIUiwgbnVsbHB0ciwgZXhwb3J0X3NlbWFwaG9yZSwgaGFuZGxlX3R5cGV9OworICAgIGF1dG8gdmtHZXRTZW1hcGhvcmVGZEtIUiA9IChQRk5fdmtHZXRTZW1hcGhvcmVGZEtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtHZXRTZW1hcGhvcmVGZEtIUiIpOworICAgIGVyciA9IHZrR2V0U2VtYXBob3JlRmRLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmZ2hpLCAmZmQpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBJbXBvcnQgb3BhcXVlIGhhbmRsZSBleHBvcnRlZCBhYm92ZQorICAgIFZrSW1wb3J0U2VtYXBob3JlRmRJbmZvS0hSIGloaSA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUiwgbnVsbHB0ciwgaW1wb3J0X3NlbWFwaG9yZSwgMCwgaGFuZGxlX3R5cGUsIGZkfTsKKyAgICBhdXRvIHZrSW1wb3J0U2VtYXBob3JlRmRLSFIgPSAoUEZOX3ZrSW1wb3J0U2VtYXBob3JlRmRLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrSW1wb3J0U2VtYXBob3JlRmRLSFIiKTsKKyAgICBlcnIgPSB2a0ltcG9ydFNlbWFwaG9yZUZkS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmloaSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyNlbmRpZgorCisgICAgLy8gU2lnbmFsIHRoZSBleHBvcnRlZCBzZW1hcGhvcmUgYW5kIHdhaXQgb24gdGhlIGltcG9ydGVkIHNlbWFwaG9yZQorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGZsYWdzID0gVktfUElQRUxJTkVfU1RBR0VfQk9UVE9NX09GX1BJUEVfQklUOworICAgIFZrU3VibWl0SW5mbyBzaVtdID0geworICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8sIG51bGxwdHIsIDAsIG51bGxwdHIsICZmbGFncywgMCwgbnVsbHB0ciwgMSwgJmV4cG9ydF9zZW1hcGhvcmV9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8sIG51bGxwdHIsIDEsICZpbXBvcnRfc2VtYXBob3JlLCAmZmxhZ3MsIDAsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8sIG51bGxwdHIsIDAsIG51bGxwdHIsICZmbGFncywgMCwgbnVsbHB0ciwgMSwgJmV4cG9ydF9zZW1hcGhvcmV9LAorICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk8sIG51bGxwdHIsIDEsICZpbXBvcnRfc2VtYXBob3JlLCAmZmxhZ3MsIDAsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgIH07CisgICAgZXJyID0gdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCA0LCBzaSwgVktfTlVMTF9IQU5ETEUpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBpZiAobV9kZXZpY2UtPnBoeSgpLmZlYXR1cmVzKCkuc3BhcnNlQmluZGluZykgeworICAgICAgICAvLyBTaWduYWwgdGhlIGltcG9ydGVkIHNlbWFwaG9yZSBhbmQgd2FpdCBvbiB0aGUgZXhwb3J0ZWQgc2VtYXBob3JlCisgICAgICAgIFZrQmluZFNwYXJzZUluZm8gYmlbXSA9IHsKKyAgICAgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX1NQQVJTRV9JTkZPLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1wb3J0X3NlbWFwaG9yZX0sCisgICAgICAgICAgICB7VktfU1RSVUNUVVJFX1RZUEVfQklORF9TUEFSU0VfSU5GTywgbnVsbHB0ciwgMSwgJmV4cG9ydF9zZW1hcGhvcmUsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHJ9LAorICAgICAgICAgICAge1ZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfU1BBUlNFX0lORk8sIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbXBvcnRfc2VtYXBob3JlfSwKKyAgICAgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX1NQQVJTRV9JTkZPLCBudWxscHRyLCAxLCAmZXhwb3J0X3NlbWFwaG9yZSwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0cn0sCisgICAgICAgIH07CisgICAgICAgIGVyciA9IHZrOjpRdWV1ZUJpbmRTcGFyc2UobV9kZXZpY2UtPm1fcXVldWUsIDQsIGJpLCBWS19OVUxMX0hBTkRMRSk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgfQorCisgICAgLy8gQ2xlYW51cAorICAgIGVyciA9IHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIHZrOjpEZXN0cm95U2VtYXBob3JlKG1fZGV2aWNlLT5kZXZpY2UoKSwgZXhwb3J0X3NlbWFwaG9yZSwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lTZW1hcGhvcmUobV9kZXZpY2UtPmRldmljZSgpLCBpbXBvcnRfc2VtYXBob3JlLCBudWxscHRyKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgRXh0ZXJuYWxGZW5jZSkgeworI2lmZGVmIF9XSU4zMgorICAgIGNvbnN0IGF1dG8gZXh0ZW5zaW9uX25hbWUgPSBWS19LSFJfRVhURVJOQUxfRkVOQ0VfV0lOMzJfRVhURU5TSU9OX05BTUU7CisgICAgY29uc3QgYXV0byBoYW5kbGVfdHlwZSA9IFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX09QQVFVRV9XSU4zMl9CSVRfS0hSOworI2Vsc2UKKyAgICBjb25zdCBhdXRvIGV4dGVuc2lvbl9uYW1lID0gVktfS0hSX0VYVEVSTkFMX0ZFTkNFX0ZEX0VYVEVOU0lPTl9OQU1FOworICAgIGNvbnN0IGF1dG8gaGFuZGxlX3R5cGUgPSBWS19FWFRFUk5BTF9GRU5DRV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUjsKKyNlbmRpZgorICAgIC8vIENoZWNrIGZvciBleHRlcm5hbCBmZW5jZSBpbnN0YW5jZSBleHRlbnNpb25zCisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfRVhURVJOQUxfRkVOQ0VfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlcm5hbCBmZW5jZSBleHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgLy8gQ2hlY2sgZm9yIGV4dGVybmFsIGZlbmNlIGRldmljZSBleHRlbnNpb25zCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgZXh0ZW5zaW9uX25hbWUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soZXh0ZW5zaW9uX25hbWUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9GRU5DRV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBFeHRlcm5hbCBmZW5jZSBleHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIC8vIENoZWNrIGZvciBleHRlcm5hbCBmZW5jZSBpbXBvcnQgYW5kIGV4cG9ydCBjYXBhYmlsaXR5CisgICAgVmtQaHlzaWNhbERldmljZUV4dGVybmFsRmVuY2VJbmZvS0hSIGVmaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhURVJOQUxfRkVOQ0VfSU5GT19LSFIsIG51bGxwdHIsIGhhbmRsZV90eXBlfTsKKyAgICBWa0V4dGVybmFsRmVuY2VQcm9wZXJ0aWVzS0hSIGVmcCA9IHtWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTX0tIUiwgbnVsbHB0cn07CisgICAgYXV0byB2a0dldFBoeXNpY2FsRGV2aWNlRXh0ZXJuYWxGZW5jZVByb3BlcnRpZXNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcigKKyAgICAgICAgaW5zdGFuY2UoKSwgInZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUiIpOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEZlbmNlUHJvcGVydGllc0tIUihncHUoKSwgJmVmaSwgJmVmcCk7CisKKyAgICBpZiAoIShlZnAuZXh0ZXJuYWxGZW5jZUZlYXR1cmVzICYgVktfRVhURVJOQUxfRkVOQ0VfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9LSFIpIHx8CisgICAgICAgICEoZWZwLmV4dGVybmFsRmVuY2VGZWF0dXJlcyAmIFZLX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfS0hSKSkgeworICAgICAgICBwcmludGYoIiVzIEV4dGVybmFsIGZlbmNlIGRvZXMgbm90IHN1cHBvcnQgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrUmVzdWx0IGVycjsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgLy8gQ3JlYXRlIGEgZmVuY2UgdG8gZXhwb3J0IHBheWxvYWQgZnJvbQorICAgIFZrRmVuY2UgZXhwb3J0X2ZlbmNlOworICAgIHsKKyAgICAgICAgVmtFeHBvcnRGZW5jZUNyZWF0ZUluZm9LSFIgZWZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfRkVOQ0VfQ1JFQVRFX0lORk9fS0hSLCBudWxscHRyLCBoYW5kbGVfdHlwZX07CisgICAgICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTywgJmVmY2ksIDB9OworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCAmZmNpLCBudWxscHRyLCAmZXhwb3J0X2ZlbmNlKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBmZW5jZSB0byBpbXBvcnQgcGF5bG9hZCBpbnRvCisgICAgVmtGZW5jZSBpbXBvcnRfZmVuY2U7CisgICAgeworICAgICAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDB9OworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlRmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCAmZmNpLCBudWxscHRyLCAmaW1wb3J0X2ZlbmNlKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyNpZmRlZiBfV0lOMzIKKyAgICAvLyBFeHBvcnQgZmVuY2UgcGF5bG9hZCB0byBhbiBvcGFxdWUgaGFuZGxlCisgICAgSEFORExFIGhhbmRsZSA9IG51bGxwdHI7CisgICAgeworICAgICAgICBWa0ZlbmNlR2V0V2luMzJIYW5kbGVJbmZvS0hSIGdoaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfV0lOMzJfSEFORExFX0lORk9fS0hSLCBudWxscHRyLCBleHBvcnRfZmVuY2UsIGhhbmRsZV90eXBlfTsKKyAgICAgICAgYXV0byB2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIgPQorICAgICAgICAgICAgKFBGTl92a0dldEZlbmNlV2luMzJIYW5kbGVLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrR2V0RmVuY2VXaW4zMkhhbmRsZUtIUiIpOworICAgICAgICBlcnIgPSB2a0dldEZlbmNlV2luMzJIYW5kbGVLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmZ2hpLCAmaGFuZGxlKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyAgICAvLyBJbXBvcnQgb3BhcXVlIGhhbmRsZSBleHBvcnRlZCBhYm92ZQorICAgIHsKKyAgICAgICAgVmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlSW5mb0tIUiBpZmkgPSB7CisgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTVBPUlRfRkVOQ0VfV0lOMzJfSEFORExFX0lORk9fS0hSLCBudWxscHRyLCBpbXBvcnRfZmVuY2UsIDAsIGhhbmRsZV90eXBlLCBoYW5kbGUsIG51bGxwdHJ9OworICAgICAgICBhdXRvIHZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUiA9CisgICAgICAgICAgICAoUEZOX3ZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtJbXBvcnRGZW5jZVdpbjMySGFuZGxlS0hSIik7CisgICAgICAgIGVyciA9IHZrSW1wb3J0RmVuY2VXaW4zMkhhbmRsZUtIUihtX2RldmljZS0+ZGV2aWNlKCksICZpZmkpOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIH0KKyNlbHNlCisgICAgLy8gRXhwb3J0IGZlbmNlIHBheWxvYWQgdG8gYW4gb3BhcXVlIGhhbmRsZQorICAgIGludCBmZCA9IDA7CisgICAgeworICAgICAgICBWa0ZlbmNlR2V0RmRJbmZvS0hSIGdmaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9HRVRfRkRfSU5GT19LSFIsIG51bGxwdHIsIGV4cG9ydF9mZW5jZSwgaGFuZGxlX3R5cGV9OworICAgICAgICBhdXRvIHZrR2V0RmVuY2VGZEtIUiA9IChQRk5fdmtHZXRGZW5jZUZkS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a0dldEZlbmNlRmRLSFIiKTsKKyAgICAgICAgZXJyID0gdmtHZXRGZW5jZUZkS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmdmaSwgJmZkKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisKKyAgICAvLyBJbXBvcnQgb3BhcXVlIGhhbmRsZSBleHBvcnRlZCBhYm92ZQorICAgIHsKKyAgICAgICAgVmtJbXBvcnRGZW5jZUZkSW5mb0tIUiBpZmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX0ZFTkNFX0ZEX0lORk9fS0hSLCBudWxscHRyLCBpbXBvcnRfZmVuY2UsIDAsIGhhbmRsZV90eXBlLCBmZH07CisgICAgICAgIGF1dG8gdmtJbXBvcnRGZW5jZUZkS0hSID0gKFBGTl92a0ltcG9ydEZlbmNlRmRLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrSW1wb3J0RmVuY2VGZEtIUiIpOworICAgICAgICBlcnIgPSB2a0ltcG9ydEZlbmNlRmRLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmaWZpKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIFNpZ25hbCB0aGUgZXhwb3J0ZWQgZmVuY2UgYW5kIHdhaXQgb24gdGhlIGltcG9ydGVkIGZlbmNlCisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAwLCBudWxscHRyLCBleHBvcnRfZmVuY2UpOworICAgIHZrOjpXYWl0Rm9yRmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmltcG9ydF9mZW5jZSwgVktfVFJVRSwgMTAwMDAwMDAwMCk7CisgICAgdms6OlJlc2V0RmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmltcG9ydF9mZW5jZSk7CisgICAgdms6OlF1ZXVlU3VibWl0KG1fZGV2aWNlLT5tX3F1ZXVlLCAwLCBudWxscHRyLCBleHBvcnRfZmVuY2UpOworICAgIHZrOjpXYWl0Rm9yRmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmltcG9ydF9mZW5jZSwgVktfVFJVRSwgMTAwMDAwMDAwMCk7CisgICAgdms6OlJlc2V0RmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmltcG9ydF9mZW5jZSk7CisKKyAgICAvLyBTaWduYWwgdGhlIGltcG9ydGVkIGZlbmNlIGFuZCB3YWl0IG9uIHRoZSBleHBvcnRlZCBmZW5jZQorICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMCwgbnVsbHB0ciwgaW1wb3J0X2ZlbmNlKTsKKyAgICB2azo6V2FpdEZvckZlbmNlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZleHBvcnRfZmVuY2UsIFZLX1RSVUUsIDEwMDAwMDAwMDApOworICAgIHZrOjpSZXNldEZlbmNlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZleHBvcnRfZmVuY2UpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMCwgbnVsbHB0ciwgaW1wb3J0X2ZlbmNlKTsKKyAgICB2azo6V2FpdEZvckZlbmNlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZleHBvcnRfZmVuY2UsIFZLX1RSVUUsIDEwMDAwMDAwMDApOworICAgIHZrOjpSZXNldEZlbmNlcyhtX2RldmljZS0+ZGV2aWNlKCksIDEsICZleHBvcnRfZmVuY2UpOworCisgICAgLy8gQ2xlYW51cAorICAgIGVyciA9IHZrOjpRdWV1ZVdhaXRJZGxlKG1fZGV2aWNlLT5tX3F1ZXVlKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIHZrOjpEZXN0cm95RmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCBleHBvcnRfZmVuY2UsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95RmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCBpbXBvcnRfZmVuY2UsIG51bGxwdHIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBUaHJlYWROdWxsRmVuY2VDb2xsaXNpb24pIHsKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZCB0aHJlYWQ7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+U2V0RGVzaXJlZEZhaWx1cmVNc2coVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsICJUSFJFQURJTkcgRVJST1IiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfc3RydWN0IGRhdGE7CisgICAgZGF0YS5kZXZpY2UgPSBtX2RldmljZS0+ZGV2aWNlKCk7CisgICAgYm9vbCBiYWlsb3V0ID0gZmFsc2U7CisgICAgZGF0YS5iYWlsb3V0ID0gJmJhaWxvdXQ7CisgICAgbV9lcnJvck1vbml0b3ItPlNldEJhaWxvdXQoZGF0YS5iYWlsb3V0KTsKKworICAgIC8vIENhbGwgdms6OkRlc3Ryb3lGZW5jZSBvZiBWS19OVUxMX0hBTkRMRSByZXBlYXRlZGx5IHVzaW5nIG11bHRpcGxlIHRocmVhZHMuCisgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIHZhbGlkYXRpb24gZXJyb3IgZnJvbSBjb2xsaXNpb24gb2YgdGhhdCBub24tb2JqZWN0LgorICAgIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBSZWxlYXNlTnVsbEZlbmNlLCAodm9pZCAqKSZkYXRhKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwMDAwOyBpKyspIHsKKyAgICAgICAgdms6OkRlc3Ryb3lGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksIFZLX05VTExfSEFORExFLCBOVUxMKTsKKyAgICB9CisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfam9pbih0aHJlYWQsIE5VTEwpOworCisgICAgbV9lcnJvck1vbml0b3ItPlNldEJhaWxvdXQoTlVMTCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENsZWFyQ29sb3JJbWFnZVdpdGhWYWxpZFJhbmdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUmVjb3JkIGNsZWFyIGNvbG9yIHdpdGggYSB2YWxpZCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworICAgIEFTU0VSVF9UUlVFKGltYWdlLmNyZWF0ZV9pbmZvKCkuYXJyYXlMYXllcnMgPT0gMSk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisgICAgaW1hZ2UuU2V0TGF5b3V0KFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCk7CisKKyAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSBjbGVhcl9jb2xvciA9IHt7MC4wZiwgMC4wZiwgMC4wZiwgMS4wZn19OworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIGNvbnN0IGF1dG8gY2JfaGFuZGxlID0gbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKworICAgIC8vIFRyeSBnb29kIGNhc2UKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDEsIDAsIDF9OworICAgICAgICB2azo6Q21kQ2xlYXJDb2xvckltYWdlKGNiX2hhbmRsZSwgaW1hZ2UuaGFuZGxlKCksIGltYWdlLkxheW91dCgpLCAmY2xlYXJfY29sb3IsIDEsICZyYW5nZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIH0KKworICAgIC8vIFRyeSBnb29kIGNhc2Ugd2l0aCBWS19SRU1BSU5JTkcKKyAgICB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIFZLX1JFTUFJTklOR19NSVBfTEVWRUxTLCAwLCBWS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTfTsKKyAgICAgICAgdms6OkNtZENsZWFyQ29sb3JJbWFnZShjYl9oYW5kbGUsIGltYWdlLmhhbmRsZSgpLCBpbWFnZS5MYXlvdXQoKSwgJmNsZWFyX2NvbG9yLCAxLCAmcmFuZ2UpOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKyAgICB9Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBDbGVhckRlcHRoU3RlbmNpbFdpdGhWYWxpZFJhbmdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUmVjb3JkIGNsZWFyIGRlcHRoIHdpdGggYSB2YWxpZCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgYXV0byBkZXB0aF9mb3JtYXQgPSBGaW5kU3VwcG9ydGVkRGVwdGhTdGVuY2lsRm9ybWF0KGdwdSgpKTsKKyAgICBpZiAoIWRlcHRoX2Zvcm1hdCkgeworICAgICAgICBwcmludGYoIiVzIE5vIERlcHRoICsgU3RlbmNpbCBmb3JtYXQgZm91bmQuIFNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgZGVwdGhfZm9ybWF0LCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuY3JlYXRlX2luZm8oKS5hcnJheUxheWVycyA9PSAxKTsKKyAgICBBU1NFUlRfVFJVRShpbWFnZS5pbml0aWFsaXplZCgpKTsKKyAgICBjb25zdCBWa0ltYWdlQXNwZWN0RmxhZ3MgZHNfYXNwZWN0ID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKyAgICBpbWFnZS5TZXRMYXlvdXQoZHNfYXNwZWN0LCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwpOworCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGNsZWFyX3ZhbHVlID0ge307CisKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgY29uc3QgYXV0byBjYl9oYW5kbGUgPSBtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworCisgICAgLy8gVHJ5IGdvb2QgY2FzZQorICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7ZHNfYXNwZWN0LCAwLCAxLCAwLCAxfTsKKyAgICAgICAgdms6OkNtZENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoY2JfaGFuZGxlLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2UuTGF5b3V0KCksICZjbGVhcl92YWx1ZSwgMSwgJnJhbmdlKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgfQorCisgICAgLy8gVHJ5IGdvb2QgY2FzZSB3aXRoIFZLX1JFTUFJTklORworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7ZHNfYXNwZWN0LCAwLCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUywgMCwgVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSU307CisgICAgICAgIHZrOjpDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKGNiX2hhbmRsZSwgaW1hZ2UuaGFuZGxlKCksIGltYWdlLkxheW91dCgpLCAmY2xlYXJfdmFsdWUsIDEsICZyYW5nZSk7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIH0KK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZUdyYXBoaWNzUGlwZWxpbmVXaXRoSWdub3JlZFBvaW50ZXJzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIEdyYXBoaWNzIFBpcGVsaW5lIHdpdGggcG9pbnRlcnMgdGhhdCBtdXN0IGJlIGlnbm9yZWQgYnkgbGF5ZXJzIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworCisgICAgbV9kZXB0aF9zdGVuY2lsX2ZtdCA9IEZpbmRTdXBwb3J0ZWREZXB0aFN0ZW5jaWxGb3JtYXQoZ3B1KCkpOworICAgIEFTU0VSVF9UUlVFKG1fZGVwdGhfc3RlbmNpbF9mbXQgIT0gMCk7CisKKyAgICBtX2RlcHRoU3RlbmNpbC0+SW5pdChtX2RldmljZSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obV93aWR0aCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1faGVpZ2h0KSwgbV9kZXB0aF9zdGVuY2lsX2ZtdCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KG1fZGVwdGhTdGVuY2lsLT5CaW5kSW5mbygpKSk7CisKKyAgICBjb25zdCB1aW50NjRfdCBmYWtlX2FkZHJlc3NfNjQgPSAweENEQ0RDRENEQ0RDRENEQ0Q7CisgICAgY29uc3QgdWludDY0X3QgZmFrZV9hZGRyZXNzXzMyID0gMHhDRENEQ0RDRDsKKyAgICB2b2lkICpob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyID0KKyAgICAgICAgc2l6ZW9mKHZvaWQgKikgPT0gOCA/IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihmYWtlX2FkZHJlc3NfNjQpIDogcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGZha2VfYWRkcmVzc18zMik7CisKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV92ZXJ0ZXhfaW5wdXRfc3RhdGVfY3JlYXRlX2luZm97CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZFUlRFWF9JTlBVVF9TVEFURV9DUkVBVEVfSU5GTywKKyAgICAgICAgbnVsbHB0ciwgIC8vIHBOZXh0CisgICAgICAgIDAsICAgICAgICAvLyBmbGFncworICAgICAgICAwLAorICAgICAgICBudWxscHRyLCAgLy8gYmluZGluZ3MKKyAgICAgICAgMCwKKyAgICAgICAgbnVsbHB0ciAgLy8gYXR0cmlidXRlcworICAgIH07CisKKyAgICBjb25zdCBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV9pbnB1dF9hc3NlbWJseV9zdGF0ZV9jcmVhdGVfaW5mb3sKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgICAgIG51bGxwdHIsICAvLyBwTmV4dAorICAgICAgICAwLCAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1QsCisgICAgICAgIFZLX0ZBTFNFICAvLyBwcmltaXRpdmUgcmVzdGFydAorICAgIH07CisKKyAgICBjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV9yYXN0ZXJpemF0aW9uX3N0YXRlX2NyZWF0ZV9pbmZvX3RlbXBsYXRleworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICBudWxscHRyLCAgIC8vIHBOZXh0CisgICAgICAgIDAsICAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgVktfRkFMU0UsICAvLyBkZXB0aENsYW1wCisgICAgICAgIFZLX0ZBTFNFLCAgLy8gcmFzdGVyaXplckRpc2NhcmRFbmFibGUKKyAgICAgICAgVktfUE9MWUdPTl9NT0RFX0ZJTEwsCisgICAgICAgIFZLX0NVTExfTU9ERV9OT05FLAorICAgICAgICBWS19GUk9OVF9GQUNFX0NPVU5URVJfQ0xPQ0tXSVNFLAorICAgICAgICBWS19GQUxTRSwgIC8vIGRlcHRoQmlhcworICAgICAgICAwLjBmLAorICAgICAgICAwLjBmLAorICAgICAgICAwLjBmLCAgLy8gZGVwdGhCaWFzIHBhcmFtcworICAgICAgICAxLjBmICAgLy8gbGluZVdpZHRoCisgICAgfTsKKworICAgIFZrUGlwZWxpbmVMYXlvdXQgcGlwZWxpbmVfbGF5b3V0OworICAgIHsKKyAgICAgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGlwZWxpbmVfbGF5b3V0X2NyZWF0ZV9pbmZveworICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBOZXh0CisgICAgICAgICAgICAwLCAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBudWxscHRyLCAgLy8gbGF5b3V0cworICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIG51bGxwdHIgIC8vIHB1c2ggY29uc3RhbnRzCisgICAgICAgIH07CisKKyAgICAgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5kZXZpY2UoKSwgJnBpcGVsaW5lX2xheW91dF9jcmVhdGVfaW5mbywgbnVsbHB0ciwgJnBpcGVsaW5lX2xheW91dCk7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgfQorCisgICAgLy8gdHJ5IGRpc2FibGVkIHJhc3Rlcml6ZXIgYW5kIG5vIHRlc3NlbGxhdGlvbgorICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgICAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV9yYXN0ZXJpemF0aW9uX3N0YXRlX2NyZWF0ZV9pbmZvID0KKyAgICAgICAgICAgIHBpcGVsaW5lX3Jhc3Rlcml6YXRpb25fc3RhdGVfY3JlYXRlX2luZm9fdGVtcGxhdGU7CisgICAgICAgIHBpcGVsaW5lX3Jhc3Rlcml6YXRpb25fc3RhdGVfY3JlYXRlX2luZm8ucmFzdGVyaXplckRpc2NhcmRFbmFibGUgPSBWS19UUlVFOworCisgICAgICAgIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gZ3JhcGhpY3NfcGlwZWxpbmVfY3JlYXRlX2luZm97CisgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIG51bGxwdHIsICAvLyBwTmV4dAorICAgICAgICAgICAgMCwgICAgICAgIC8vIGZsYWdzCisgICAgICAgICAgICAxLCAgICAgICAgLy8gc3RhZ2VDb3VudAorICAgICAgICAgICAgJnZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLAorICAgICAgICAgICAgJnBpcGVsaW5lX3ZlcnRleF9pbnB1dF9zdGF0ZV9jcmVhdGVfaW5mbywKKyAgICAgICAgICAgICZwaXBlbGluZV9pbnB1dF9hc3NlbWJseV9zdGF0ZV9jcmVhdGVfaW5mbywKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyAqPihob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvICo+KGhvcGVmdWxseV91bmRlcmVmZXJlbmNhYmxlX3BvaW50ZXIpLAorICAgICAgICAgICAgJnBpcGVsaW5lX3Jhc3Rlcml6YXRpb25fc3RhdGVfY3JlYXRlX2luZm8sCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyAqPihob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyAqPihob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8gKj4oaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlciksCisgICAgICAgICAgICBudWxscHRyLCAgLy8gZHluYW1pYyBzdGF0ZXMKKyAgICAgICAgICAgIHBpcGVsaW5lX2xheW91dCwKKyAgICAgICAgICAgIG1fcmVuZGVyUGFzcywKKyAgICAgICAgICAgIDAsICAvLyBzdWJwYXNzCisgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgIDB9OworCisgICAgICAgIFZrUGlwZWxpbmUgcGlwZWxpbmU7CisgICAgICAgIHZrOjpDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhtX2RldmljZS0+aGFuZGxlKCksIFZLX05VTExfSEFORExFLCAxLCAmZ3JhcGhpY3NfcGlwZWxpbmVfY3JlYXRlX2luZm8sIG51bGxwdHIsICZwaXBlbGluZSk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgdms6OkRlc3Ryb3lQaXBlbGluZShtX2RldmljZS0+aGFuZGxlKCksIHBpcGVsaW5lLCBudWxscHRyKTsKKyAgICB9CisKKyAgICBjb25zdCBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gcGlwZWxpbmVfbXVsdGlzYW1wbGVfc3RhdGVfY3JlYXRlX2luZm97CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX01VTFRJU0FNUExFX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICBudWxscHRyLCAgLy8gcE5leHQKKyAgICAgICAgMCwgICAgICAgIC8vIGZsYWdzCisgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgVktfRkFMU0UsICAvLyBzYW1wbGUgc2hhZGluZworICAgICAgICAwLjBmLCAgICAgIC8vIG1pblNhbXBsZVNoYWRpbmcKKyAgICAgICAgbnVsbHB0ciwgICAvLyBwU2FtcGxlTWFzaworICAgICAgICBWS19GQUxTRSwgIC8vIGFscGhhVG9Db3ZlcmFnZUVuYWJsZQorICAgICAgICBWS19GQUxTRSAgIC8vIGFscGhhVG9PbmVFbmFibGUKKyAgICB9OworCisgICAgLy8gdHJ5IGVuYWJsZWQgcmFzdGVyaXplciBidXQgbm8gc3VicGFzcyBhdHRhY2htZW50cworICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgICAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV9yYXN0ZXJpemF0aW9uX3N0YXRlX2NyZWF0ZV9pbmZvID0KKyAgICAgICAgICAgIHBpcGVsaW5lX3Jhc3Rlcml6YXRpb25fc3RhdGVfY3JlYXRlX2luZm9fdGVtcGxhdGU7CisgICAgICAgIHBpcGVsaW5lX3Jhc3Rlcml6YXRpb25fc3RhdGVfY3JlYXRlX2luZm8ucmFzdGVyaXplckRpc2NhcmRFbmFibGUgPSBWS19GQUxTRTsKKworICAgICAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0ID0gezAuMGYsIDAuMGYsIDEuMGYsIDEuMGYsIDAuMGYsIDEuMGZ9OworICAgICAgICBWa1JlY3QyRCBzY2lzc29yID0ge3swLCAwfSwge3N0YXRpY19jYXN0PHVpbnQzMl90PihtX3dpZHRoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1faGVpZ2h0KX19OworCisgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV92aWV3cG9ydF9zdGF0ZV9jcmVhdGVfaW5mb3sKKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBOZXh0CisgICAgICAgICAgICAwLCAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAmdmlld3BvcnQsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgJnNjaXNzb3J9OworCisgICAgICAgIFZrUmVuZGVyUGFzcyByZW5kZXJfcGFzczsKKyAgICAgICAgeworICAgICAgICAgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzc19kZXNjID0ge307CisKKyAgICAgICAgICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcmVuZGVyX3Bhc3NfY3JlYXRlX2luZm97CisgICAgICAgICAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBOZXh0CisgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIGZsYWdzCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBudWxscHRyLCAgLy8gYXR0YWNobWVudHMKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICZzdWJwYXNzX2Rlc2MsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBudWxscHRyICAvLyBzdWJwYXNzIGRlcGVuZGVuY2llcworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVJlbmRlclBhc3MobV9kZXZpY2UtPmhhbmRsZSgpLCAmcmVuZGVyX3Bhc3NfY3JlYXRlX2luZm8sIG51bGxwdHIsICZyZW5kZXJfcGFzcyk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgICAgICB9CisKKyAgICAgICAgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBncmFwaGljc19waXBlbGluZV9jcmVhdGVfaW5mb3sKKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBOZXh0CisgICAgICAgICAgICAwLCAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgICAgIDEsICAgICAgICAvLyBzdGFnZUNvdW50CisgICAgICAgICAgICAmdnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksCisgICAgICAgICAgICAmcGlwZWxpbmVfdmVydGV4X2lucHV0X3N0YXRlX2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgJnBpcGVsaW5lX2lucHV0X2Fzc2VtYmx5X3N0YXRlX2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICZwaXBlbGluZV92aWV3cG9ydF9zdGF0ZV9jcmVhdGVfaW5mbywKKyAgICAgICAgICAgICZwaXBlbGluZV9yYXN0ZXJpemF0aW9uX3N0YXRlX2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgJnBpcGVsaW5lX211bHRpc2FtcGxlX3N0YXRlX2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICo+KGhvcGVmdWxseV91bmRlcmVmZXJlbmNhYmxlX3BvaW50ZXIpLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyAqPihob3BlZnVsbHlfdW5kZXJlZmVyZW5jYWJsZV9wb2ludGVyKSwKKyAgICAgICAgICAgIG51bGxwdHIsICAvLyBkeW5hbWljIHN0YXRlcworICAgICAgICAgICAgcGlwZWxpbmVfbGF5b3V0LAorICAgICAgICAgICAgcmVuZGVyX3Bhc3MsCisgICAgICAgICAgICAwLCAgLy8gc3VicGFzcworICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAwfTsKKworICAgICAgICBWa1BpcGVsaW5lIHBpcGVsaW5lOworICAgICAgICB2azo6Q3JlYXRlR3JhcGhpY3NQaXBlbGluZXMobV9kZXZpY2UtPmhhbmRsZSgpLCBWS19OVUxMX0hBTkRMRSwgMSwgJmdyYXBoaWNzX3BpcGVsaW5lX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcGlwZWxpbmUpOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgICAgIHZrOjpEZXN0cm95UGlwZWxpbmUobV9kZXZpY2UtPmhhbmRsZSgpLCBwaXBlbGluZSwgbnVsbHB0cik7CisgICAgICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+aGFuZGxlKCksIHJlbmRlcl9wYXNzLCBudWxscHRyKTsKKyAgICB9CisKKyAgICAvLyB0cnkgZHluYW1pYyB2aWV3cG9ydCBhbmQgc2Npc3NvcgorICAgIHsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgICAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV9yYXN0ZXJpemF0aW9uX3N0YXRlX2NyZWF0ZV9pbmZvID0KKyAgICAgICAgICAgIHBpcGVsaW5lX3Jhc3Rlcml6YXRpb25fc3RhdGVfY3JlYXRlX2luZm9fdGVtcGxhdGU7CisgICAgICAgIHBpcGVsaW5lX3Jhc3Rlcml6YXRpb25fc3RhdGVfY3JlYXRlX2luZm8ucmFzdGVyaXplckRpc2NhcmRFbmFibGUgPSBWS19GQUxTRTsKKworICAgICAgICBjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gcGlwZWxpbmVfdmlld3BvcnRfc3RhdGVfY3JlYXRlX2luZm97CisgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WSUVXUE9SVF9TVEFURV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIG51bGxwdHIsICAvLyBwTmV4dAorICAgICAgICAgICAgMCwgICAgICAgIC8vIGZsYWdzCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWa1ZpZXdwb3J0ICo+KGhvcGVmdWxseV91bmRlcmVmZXJlbmNhYmxlX3BvaW50ZXIpLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmtSZWN0MkQgKj4oaG9wZWZ1bGx5X3VuZGVyZWZlcmVuY2FibGVfcG9pbnRlcil9OworCisgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gcGlwZWxpbmVfZGVwdGhfc3RlbmNpbF9zdGF0ZV9jcmVhdGVfaW5mb3sKKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RFUFRIX1NURU5DSUxfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICBudWxscHRyLCAgLy8gcE5leHQKKyAgICAgICAgICAgIDAsICAgICAgICAvLyBmbGFncworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlIHBpcGVsaW5lX2NvbG9yX2JsZW5kX2F0dGFjaG1lbnRfc3RhdGUgPSB7fTsKKworICAgICAgICBjb25zdCBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyBwaXBlbGluZV9jb2xvcl9ibGVuZF9zdGF0ZV9jcmVhdGVfaW5mb3sKKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBOZXh0CisgICAgICAgICAgICAwLCAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgICAgIFZLX0ZBTFNFLAorICAgICAgICAgICAgVktfTE9HSUNfT1BfQ0xFQVIsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgJnBpcGVsaW5lX2NvbG9yX2JsZW5kX2F0dGFjaG1lbnRfc3RhdGUsCisgICAgICAgICAgICB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn19OworCisgICAgICAgIGNvbnN0IFZrRHluYW1pY1N0YXRlIGR5bmFtaWNfc3RhdGVzWzJdID0ge1ZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQsIFZLX0RZTkFNSUNfU1RBVEVfU0NJU1NPUn07CisKKyAgICAgICAgY29uc3QgVmtQaXBlbGluZUR5bmFtaWNTdGF0ZUNyZWF0ZUluZm8gcGlwZWxpbmVfZHluYW1pY19zdGF0ZV9jcmVhdGVfaW5mb3sKKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICBudWxscHRyLCAgLy8gcE5leHQKKyAgICAgICAgICAgIDAsICAgICAgICAvLyBmbGFncworICAgICAgICAgICAgMiwgZHluYW1pY19zdGF0ZXN9OworCisgICAgICAgIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gZ3JhcGhpY3NfcGlwZWxpbmVfY3JlYXRlX2luZm97VktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBOZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIGZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgIC8vIHN0YWdlQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGVsaW5lX3ZlcnRleF9pbnB1dF9zdGF0ZV9jcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZWxpbmVfaW5wdXRfYXNzZW1ibHlfc3RhdGVfY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZWxpbmVfdmlld3BvcnRfc3RhdGVfY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGVsaW5lX3Jhc3Rlcml6YXRpb25fc3RhdGVfY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGVsaW5lX211bHRpc2FtcGxlX3N0YXRlX2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXBlbGluZV9kZXB0aF9zdGVuY2lsX3N0YXRlX2NyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXBlbGluZV9jb2xvcl9ibGVuZF9zdGF0ZV9jcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlwZWxpbmVfZHluYW1pY19zdGF0ZV9jcmVhdGVfaW5mbywgIC8vIGR5bmFtaWMgc3RhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcmVuZGVyUGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gc3VicGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTExfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworCisgICAgICAgIFZrUGlwZWxpbmUgcGlwZWxpbmU7CisgICAgICAgIHZrOjpDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhtX2RldmljZS0+aGFuZGxlKCksIFZLX05VTExfSEFORExFLCAxLCAmZ3JhcGhpY3NfcGlwZWxpbmVfY3JlYXRlX2luZm8sIG51bGxwdHIsICZwaXBlbGluZSk7CisKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICAgICAgdms6OkRlc3Ryb3lQaXBlbGluZShtX2RldmljZS0+aGFuZGxlKCksIHBpcGVsaW5lLCBudWxscHRyKTsKKyAgICB9CisKKyAgICB2azo6RGVzdHJveVBpcGVsaW5lTGF5b3V0KG1fZGV2aWNlLT5oYW5kbGUoKSwgcGlwZWxpbmVfbGF5b3V0LCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIEV4dGVybmFsTWVtb3J5KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUGVyZm9ybSBhIGNvcHkgdGhyb3VnaCBhIHBhaXIgb2YgYnVmZmVycyBsaW5rZWQgYnkgZXh0ZXJuYWwgbWVtb3J5Iik7CisKKyNpZmRlZiBfV0lOMzIKKyAgICBjb25zdCBhdXRvIGV4dF9tZW1fZXh0ZW5zaW9uX25hbWUgPSBWS19LSFJfRVhURVJOQUxfTUVNT1JZX1dJTjMyX0VYVEVOU0lPTl9OQU1FOworICAgIGNvbnN0IGF1dG8gaGFuZGxlX3R5cGUgPSBWS19FWFRFUk5BTF9NRU1PUllfSEFORExFX1RZUEVfT1BBUVVFX1dJTjMyX0JJVF9LSFI7CisjZWxzZQorICAgIGNvbnN0IGF1dG8gZXh0X21lbV9leHRlbnNpb25fbmFtZSA9IFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRkRfRVhURU5TSU9OX05BTUU7CisgICAgY29uc3QgYXV0byBoYW5kbGVfdHlwZSA9IFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9PUEFRVUVfRkRfQklUX0tIUjsKKyNlbmRpZgorCisgICAgLy8gQ2hlY2sgZm9yIGV4dGVybmFsIG1lbW9yeSBpbnN0YW5jZSBleHRlbnNpb25zCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiByZXFkX2luc3RhbmNlX2V4dGVuc2lvbnMgPSB7CisgICAgICAgIHtWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUsIFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfQ0FQQUJJTElUSUVTX0VYVEVOU0lPTl9OQU1FfX07CisgICAgZm9yIChhdXRvIGV4dGVuc2lvbl9uYW1lIDogcmVxZF9pbnN0YW5jZV9leHRlbnNpb25zKSB7CisgICAgICAgIGlmIChJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChleHRlbnNpb25fbmFtZSkpIHsKKyAgICAgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhleHRlbnNpb25fbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVzIFJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCwgZXh0ZW5zaW9uX25hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICAvLyBDaGVjayBmb3IgaW1wb3J0L2V4cG9ydCBjYXBhYmlsaXR5CisgICAgVmtQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVySW5mb0tIUiBlYmkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVEVSTkFMX0JVRkZFUl9JTkZPX0tIUiwgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBoYW5kbGVfdHlwZX07CisgICAgVmtFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgZWJwID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX0JVRkZFUl9QUk9QRVJUSUVTX0tIUiwgbnVsbHB0ciwgezAsIDAsIDB9fTsKKyAgICBhdXRvIHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoCisgICAgICAgICAgICBpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlcm5hbEJ1ZmZlclByb3BlcnRpZXNLSFIgIT0gbnVsbHB0cik7CisgICAgdmtHZXRQaHlzaWNhbERldmljZUV4dGVybmFsQnVmZmVyUHJvcGVydGllc0tIUihncHUoKSwgJmViaSwgJmVicCk7CisgICAgaWYgKCEoZWJwLmV4dGVybmFsTWVtb3J5UHJvcGVydGllcy5jb21wYXRpYmxlSGFuZGxlVHlwZXMgJiBoYW5kbGVfdHlwZSkgfHwKKyAgICAgICAgIShlYnAuZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzLmV4dGVybmFsTWVtb3J5RmVhdHVyZXMgJiBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9FWFBPUlRBQkxFX0JJVF9LSFIpIHx8CisgICAgICAgICEoZWJwLmV4dGVybmFsTWVtb3J5UHJvcGVydGllcy5leHRlcm5hbE1lbW9yeUZlYXR1cmVzICYgVktfRVhURVJOQUxfTUVNT1JZX0ZFQVRVUkVfSU1QT1JUQUJMRV9CSVRfS0hSKSkgeworICAgICAgICBwcmludGYoIiVzIEV4dGVybmFsIGJ1ZmZlciBkb2VzIG5vdCBzdXBwb3J0IGltcG9ydGluZyBhbmQgZXhwb3J0aW5nLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBkZWRpY2F0ZWQgYWxsb2NhdGlvbiBpcyByZXF1aXJlZAorICAgIGJvb2wgZGVkaWNhdGVkX2FsbG9jYXRpb24gPQorICAgICAgICBlYnAuZXh0ZXJuYWxNZW1vcnlQcm9wZXJ0aWVzLmV4dGVybmFsTWVtb3J5RmVhdHVyZXMgJiBWS19FWFRFUk5BTF9NRU1PUllfRkVBVFVSRV9ERURJQ0FURURfT05MWV9CSVRfS0hSOworICAgIGlmIChkZWRpY2F0ZWRfYWxsb2NhdGlvbikgeworICAgICAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfREVESUNBVEVEX0FMTE9DQVRJT05fRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9ERURJQ0FURURfQUxMT0NBVElPTl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgRGVkaWNhdGVkIGFsbG9jYXRpb24gZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGZvciBleHRlcm5hbCBtZW1vcnkgZGV2aWNlIGV4dGVuc2lvbnMKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBleHRfbWVtX2V4dGVuc2lvbl9uYW1lKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKGV4dF9tZW1fZXh0ZW5zaW9uX25hbWUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRXh0ZXJuYWwgbWVtb3J5IGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQgfCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUKTsKKworICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fZmxhZ3MgPSAwOworICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBidWZmZXJfc2l6ZSA9IDEwMjQ7CisKKyAgICAvLyBDcmVhdGUgZXhwb3J0IGFuZCBpbXBvcnQgYnVmZmVycworICAgIGNvbnN0IFZrRXh0ZXJuYWxNZW1vcnlCdWZmZXJDcmVhdGVJbmZvS0hSIGV4dGVybmFsX2J1ZmZlcl9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0VYVEVSTkFMX01FTU9SWV9CVUZGRVJfQ1JFQVRFX0lORk9fS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIGhhbmRsZV90eXBlfTsKKyAgICBhdXRvIGJ1ZmZlcl9pbmZvID0gVmtCdWZmZXJPYmo6OmNyZWF0ZV9pbmZvKGJ1ZmZlcl9zaXplLCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKTsKKyAgICBidWZmZXJfaW5mby5wTmV4dCA9ICZleHRlcm5hbF9idWZmZXJfaW5mbzsKKyAgICBWa0J1ZmZlck9iaiBidWZmZXJfZXhwb3J0OworICAgIGJ1ZmZlcl9leHBvcnQuaW5pdF9ub19tZW0oKm1fZGV2aWNlLCBidWZmZXJfaW5mbyk7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyX2ltcG9ydDsKKyAgICBidWZmZXJfaW1wb3J0LmluaXRfbm9fbWVtKCptX2RldmljZSwgYnVmZmVyX2luZm8pOworCisgICAgLy8gQWxsb2NhdGlvbiBpbmZvCisgICAgYXV0byBhbGxvY19pbmZvID0gdmtfdGVzdGluZzo6RGV2aWNlTWVtb3J5OjpnZXRfcmVzb3VyY2VfYWxsb2NfaW5mbygqbV9kZXZpY2UsIGJ1ZmZlcl9leHBvcnQubWVtb3J5X3JlcXVpcmVtZW50cygpLCBtZW1fZmxhZ3MpOworCisgICAgLy8gQWRkIGV4cG9ydCBhbGxvY2F0aW9uIGluZm8gdG8gcE5leHQgY2hhaW4KKyAgICBWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb0tIUiBleHBvcnRfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9FWFBPUlRfTUVNT1JZX0FMTE9DQVRFX0lORk9fS0hSLCBudWxscHRyLCBoYW5kbGVfdHlwZX07CisgICAgYWxsb2NfaW5mby5wTmV4dCA9ICZleHBvcnRfaW5mbzsKKworICAgIC8vIEFkZCBkZWRpY2F0ZWQgYWxsb2NhdGlvbiBpbmZvIHRvIHBOZXh0IGNoYWluIGlmIHJlcXVpcmVkCisgICAgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm9LSFIgZGVkaWNhdGVkX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPX0tIUiwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwgYnVmZmVyX2V4cG9ydC5oYW5kbGUoKX07CisgICAgaWYgKGRlZGljYXRlZF9hbGxvY2F0aW9uKSB7CisgICAgICAgIGV4cG9ydF9pbmZvLnBOZXh0ID0gJmRlZGljYXRlZF9pbmZvOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeSB0byBiZSBleHBvcnRlZAorICAgIHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeSBtZW1vcnlfZXhwb3J0OworICAgIG1lbW9yeV9leHBvcnQuaW5pdCgqbV9kZXZpY2UsIGFsbG9jX2luZm8pOworCisgICAgLy8gQmluZCBleHBvcnRlZCBtZW1vcnkKKyAgICBidWZmZXJfZXhwb3J0LmJpbmRfbWVtb3J5KG1lbW9yeV9leHBvcnQsIDApOworCisjaWZkZWYgX1dJTjMyCisgICAgLy8gRXhwb3J0IG1lbW9yeSB0byBoYW5kbGUKKyAgICBhdXRvIHZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIpdms6OkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UoKSwgInZrR2V0TWVtb3J5V2luMzJIYW5kbGVLSFIiKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSICE9IG51bGxwdHIpOworICAgIFZrTWVtb3J5R2V0V2luMzJIYW5kbGVJbmZvS0hSIG1naGkgPSB7VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0dFVF9XSU4zMl9IQU5ETEVfSU5GT19LSFIsIG51bGxwdHIsIG1lbW9yeV9leHBvcnQuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfdHlwZX07CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2a0dldE1lbW9yeVdpbjMySGFuZGxlS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJm1naGksICZoYW5kbGUpKTsKKworICAgIFZrSW1wb3J0TWVtb3J5V2luMzJIYW5kbGVJbmZvS0hSIGltcG9ydF9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fS0hSLCBudWxscHRyLCBoYW5kbGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGV9OworI2Vsc2UKKyAgICAvLyBFeHBvcnQgbWVtb3J5IHRvIGZkCisgICAgYXV0byB2a0dldE1lbW9yeUZkS0hSID0gKFBGTl92a0dldE1lbW9yeUZkS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldE1lbW9yeUZkS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRNZW1vcnlGZEtIUiAhPSBudWxscHRyKTsKKyAgICBWa01lbW9yeUdldEZkSW5mb0tIUiBtZ2ZpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9HRVRfRkRfSU5GT19LSFIsIG51bGxwdHIsIG1lbW9yeV9leHBvcnQuaGFuZGxlKCksIGhhbmRsZV90eXBlfTsKKyAgICBpbnQgZmQ7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1ModmtHZXRNZW1vcnlGZEtIUihtX2RldmljZS0+ZGV2aWNlKCksICZtZ2ZpLCAmZmQpKTsKKworICAgIFZrSW1wb3J0TWVtb3J5RmRJbmZvS0hSIGltcG9ydF9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9NRU1PUllfRkRfSU5GT19LSFIsIG51bGxwdHIsIGhhbmRsZV90eXBlLCBmZH07CisjZW5kaWYKKworICAgIC8vIEltcG9ydCBtZW1vcnkKKyAgICBhbGxvY19pbmZvID0gdmtfdGVzdGluZzo6RGV2aWNlTWVtb3J5OjpnZXRfcmVzb3VyY2VfYWxsb2NfaW5mbygqbV9kZXZpY2UsIGJ1ZmZlcl9pbXBvcnQubWVtb3J5X3JlcXVpcmVtZW50cygpLCBtZW1fZmxhZ3MpOworICAgIGFsbG9jX2luZm8ucE5leHQgPSAmaW1wb3J0X2luZm87CisgICAgdmtfdGVzdGluZzo6RGV2aWNlTWVtb3J5IG1lbW9yeV9pbXBvcnQ7CisgICAgbWVtb3J5X2ltcG9ydC5pbml0KCptX2RldmljZSwgYWxsb2NfaW5mbyk7CisKKyAgICAvLyBCaW5kIGltcG9ydGVkIG1lbW9yeQorICAgIGJ1ZmZlcl9pbXBvcnQuYmluZF9tZW1vcnkobWVtb3J5X2ltcG9ydCwgMCk7CisKKyAgICAvLyBDcmVhdGUgdGVzdCBidWZmZXJzIGFuZCBmaWxsIGlucHV0IGJ1ZmZlcgorICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fcHJvcCA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDsKKyAgICBWa0J1ZmZlck9iaiBidWZmZXJfaW5wdXQ7CisgICAgYnVmZmVyX2lucHV0LmluaXRfYXNfc3JjX2FuZF9kc3QoKm1fZGV2aWNlLCBidWZmZXJfc2l6ZSwgbWVtX3Byb3ApOworICAgIGF1dG8gaW5wdXRfbWVtID0gKHVpbnQ4X3QgKilidWZmZXJfaW5wdXQubWVtb3J5KCkubWFwKCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJ1ZmZlcl9zaXplOyBpKyspIHsKKyAgICAgICAgaW5wdXRfbWVtW2ldID0gKGkgJiAweEZGKTsKKyAgICB9CisgICAgYnVmZmVyX2lucHV0Lm1lbW9yeSgpLnVubWFwKCk7CisgICAgVmtCdWZmZXJPYmogYnVmZmVyX291dHB1dDsKKyAgICBidWZmZXJfb3V0cHV0LmluaXRfYXNfc3JjX2FuZF9kc3QoKm1fZGV2aWNlLCBidWZmZXJfc2l6ZSwgbWVtX3Byb3ApOworCisgICAgLy8gQ29weSBmcm9tIGlucHV0IGJ1ZmZlciB0byBvdXRwdXQgYnVmZmVyIHRocm91Z2ggdGhlIGV4cG9ydGVkL2ltcG9ydGVkIG1lbW9yeQorICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBWa0J1ZmZlckNvcHkgY29weV9pbmZvID0gezAsIDAsIGJ1ZmZlcl9zaXplfTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfaW5wdXQuaGFuZGxlKCksIGJ1ZmZlcl9leHBvcnQuaGFuZGxlKCksIDEsICZjb3B5X2luZm8pOworICAgIC8vIEluc2VydCBtZW1vcnkgYmFycmllciB0byBndWFyYW50ZWUgY29weSBvcmRlcgorICAgIFZrTWVtb3J5QmFycmllciBtZW1fYmFycmllciA9IHtWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQkFSUklFUiwgbnVsbHB0ciwgVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklUfTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklULCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbV9iYXJyaWVyLCAwLCBudWxscHRyLCAwLCBudWxscHRyKTsKKyAgICB2azo6Q21kQ29weUJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXJfaW1wb3J0LmhhbmRsZSgpLCBidWZmZXJfb3V0cHV0LmhhbmRsZSgpLCAxLCAmY29weV9pbmZvKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UXVldWVDb21tYW5kQnVmZmVyKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFBhcmFtZXRlckxheWVyRmVhdHVyZXMyQ2FwdHVyZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkVuc3VyZSBwYXJhbWV0ZXJfdmFsaWRhdGlvbl9sYXllciBjb3JyZWN0bHkgY2FwdHVyZXMgcGh5c2ljYWwgZGV2aWNlIGZlYXR1cmVzIik7CisgICAgaWYgKEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlKCksICJ2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIik7CisgICAgQVNTRVJUX1RSVUUodmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiAhPSBudWxscHRyKTsKKworICAgIFZrUmVzdWx0IGVycjsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBmZWF0dXJlczI7CisgICAgZmVhdHVyZXMyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzJfS0hSOworICAgIGZlYXR1cmVzMi5wTmV4dCA9IG51bGxwdHI7CisKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSKGdwdSgpLCAmZmVhdHVyZXMyKTsKKworICAgIC8vIFdlJ3JlIG5vdCBjcmVhdGluZyBhIHZhbGlkIG1fZGV2aWNlLCBidXQgdGhlIHBoeSB3cmFwcGVyIGlzIHVzZWZ1bAorICAgIHZrX3Rlc3Rpbmc6OlBoeXNpY2FsRGV2aWNlIHBoeXNpY2FsX2RldmljZShncHUoKSk7CisgICAgdmtfdGVzdGluZzo6UXVldWVDcmVhdGVJbmZvQXJyYXkgcXVldWVfaW5mbyhwaHlzaWNhbF9kZXZpY2UucXVldWVfcHJvcGVydGllcygpKTsKKyAgICAvLyBPbmx5IHJlcXVlc3QgY3JlYXRpb24gd2l0aCBxdWV1ZWZhbWlsaWVzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgcXVldWUKKyAgICBzdGQ6OnZlY3RvcjxWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbz4gY3JlYXRlX3F1ZXVlX2luZm9zOworICAgIGF1dG8gcWNpID0gcXVldWVfaW5mby5kYXRhKCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHF1ZXVlX2luZm8uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHFjaVtpXS5xdWV1ZUNvdW50KSB7CisgICAgICAgICAgICBjcmVhdGVfcXVldWVfaW5mb3MucHVzaF9iYWNrKHFjaVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gZGV2X2luZm8gPSB7fTsKKyAgICBkZXZfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTzsKKyAgICBkZXZfaW5mby5wTmV4dCA9ICZmZWF0dXJlczI7CisgICAgZGV2X2luZm8uZmxhZ3MgPSAwOworICAgIGRldl9pbmZvLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gY3JlYXRlX3F1ZXVlX2luZm9zLnNpemUoKTsKKyAgICBkZXZfaW5mby5wUXVldWVDcmVhdGVJbmZvcyA9IGNyZWF0ZV9xdWV1ZV9pbmZvcy5kYXRhKCk7CisgICAgZGV2X2luZm8uZW5hYmxlZExheWVyQ291bnQgPSAwOworICAgIGRldl9pbmZvLnBwRW5hYmxlZExheWVyTmFtZXMgPSBudWxscHRyOworICAgIGRldl9pbmZvLmVuYWJsZWRFeHRlbnNpb25Db3VudCA9IDA7CisgICAgZGV2X2luZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBudWxscHRyOworICAgIGRldl9pbmZvLnBFbmFibGVkRmVhdHVyZXMgPSBudWxscHRyOworCisgICAgVmtEZXZpY2UgZGV2aWNlOworICAgIGVyciA9IHZrOjpDcmVhdGVEZXZpY2UoZ3B1KCksICZkZXZfaW5mbywgbnVsbHB0ciwgJmRldmljZSk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIGlmIChmZWF0dXJlczIuZmVhdHVyZXMuc2FtcGxlckFuaXNvdHJvcHkpIHsKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBwYXJhbWV0ZXIgbGF5ZXIgaXMgY2FjaGluZyB0aGUgZmVhdHVyZXMgY29ycmVjdGx5IHVzaW5nIENyZWF0ZVNhbXBsZXIKKyAgICAgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzYW1wbGVyX2NpID0gU2FmZVNhbmVTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgICAgICAvLyBJZiB0aGUgZmVhdHVyZXMgd2VyZSBub3QgY2FwdHVyZWQgY29ycmVjdGx5LCB0aGlzIHNob3VsZCBjYXVzZSBhbiBlcnJvcgorICAgICAgICBzYW1wbGVyX2NpLmFuaXNvdHJvcHlFbmFibGUgPSBWS19UUlVFOworICAgICAgICBzYW1wbGVyX2NpLm1heEFuaXNvdHJvcHkgPSBwaHlzaWNhbF9kZXZpY2UucHJvcGVydGllcygpLmxpbWl0cy5tYXhTYW1wbGVyQW5pc290cm9weTsKKworICAgICAgICBWa1NhbXBsZXIgc2FtcGxlciA9IFZLX05VTExfSEFORExFOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlU2FtcGxlcihkZXZpY2UsICZzYW1wbGVyX2NpLCBudWxscHRyLCAmc2FtcGxlcik7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgICAgIHZrOjpEZXN0cm95U2FtcGxlcihkZXZpY2UsIHNhbXBsZXIsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRmVhdHVyZSBzYW1wbGVyQW5pc290cm9weSBub3QgZW5hYmxlZDsgIHBhcmFtZXRlcl9sYXllciBjaGVjayBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgIH0KKworICAgIC8vIFZlcmlmeSB0aGUgY29yZSB2YWxpZGF0aW9uIGxheWVyIGhhcyBjYXB0dXJlZCB0aGUgcGh5c2ljYWwgZGV2aWNlIGZlYXR1cmVzIGJ5IGNyZWF0aW5nIGEgYSBxdWVyeSBwb29sLgorICAgIGlmIChmZWF0dXJlczIuZmVhdHVyZXMucGlwZWxpbmVTdGF0aXN0aWNzUXVlcnkpIHsKKyAgICAgICAgVmtRdWVyeVBvb2wgcXVlcnlfcG9vbDsKKyAgICAgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHFwY2l7fTsKKyAgICAgICAgcXBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk87CisgICAgICAgIHFwY2kucXVlcnlUeXBlID0gVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTOworICAgICAgICBxcGNpLnF1ZXJ5Q291bnQgPSAxOworICAgICAgICBlcnIgPSB2azo6Q3JlYXRlUXVlcnlQb29sKGRldmljZSwgJnFwY2ksIG51bGxwdHIsICZxdWVyeV9wb29sKTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgICAgICB2azo6RGVzdHJveVF1ZXJ5UG9vbChkZXZpY2UsIHF1ZXJ5X3Bvb2wsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgRmVhdHVyZSBwaXBlbGluZVN0YXRpc3RpY3NRdWVyeSBub3QgZW5hYmxlZDsgIGNvcmVfdmFsaWRhdGlvbl9sYXllciBjaGVjayBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgIH0KKworICAgIHZrOjpEZXN0cm95RGV2aWNlKGRldmljZSwgbnVsbHB0cik7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIEdldE1lbW9yeVJlcXVpcmVtZW50czIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiR2V0IG1lbW9yeSByZXF1aXJlbWVudHMgd2l0aCBWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMyIGluc3RlYWQgb2YgY29yZSBlbnRyeSBwb2ludHMgYW5kIHZlcmlmeSBsYXllcnMgZG8gbm90IGVtaXQgIgorICAgICAgICAiZXJyb3JzIHdoZW4gb2JqZWN0cyBhcmUgYm91bmQgYW5kIHVzZWQiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgLy8gQ2hlY2sgZm9yIFZLX0tIUl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50ZXMyIGV4dGVuc2lvbnMKKyAgICBpZiAoRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQgfCBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUKTsKKworICAgIC8vIENyZWF0ZSBhIHRlc3QgYnVmZmVyCisgICAgVmtCdWZmZXJPYmogYnVmZmVyOworICAgIGJ1ZmZlci5pbml0X25vX21lbSgqbV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIFZrQnVmZmVyT2JqOjpjcmVhdGVfaW5mbygxMDI0LCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKSk7CisKKyAgICAvLyBVc2UgZXh0ZW5zaW9uIHRvIGdldCBidWZmZXIgbWVtb3J5IHJlcXVpcmVtZW50cworICAgIGF1dG8gdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSID0gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSPigKKyAgICAgICAgdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzMktIUiIpKTsKKyAgICBBU1NFUlRfVFJVRSh2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czJLSFIgIT0gbnVsbHB0cik7CisgICAgVmtCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiBidWZmZXJfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfTUVNT1JZX1JFUVVJUkVNRU5UU19JTkZPXzJfS0hSLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmhhbmRsZSgpfTsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czJLSFIgYnVmZmVyX3JlcXMgPSB7VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0tIUn07CisgICAgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMyS0hSKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmJ1ZmZlcl9pbmZvLCAmYnVmZmVyX3JlcXMpOworCisgICAgLy8gQWxsb2NhdGUgYW5kIGJpbmQgYnVmZmVyIG1lbW9yeQorICAgIHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeSBidWZmZXJfbWVtb3J5OworICAgIGJ1ZmZlcl9tZW1vcnkuaW5pdCgqbV9kZXZpY2UsIHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeTo6Z2V0X3Jlc291cmNlX2FsbG9jX2luZm8oKm1fZGV2aWNlLCBidWZmZXJfcmVxcy5tZW1vcnlSZXF1aXJlbWVudHMsIDApKTsKKyAgICB2azo6QmluZEJ1ZmZlck1lbW9yeShtX2RldmljZS0+ZGV2aWNlKCksIGJ1ZmZlci5oYW5kbGUoKSwgYnVmZmVyX21lbW9yeS5oYW5kbGUoKSwgMCk7CisKKyAgICAvLyBDcmVhdGUgYSB0ZXN0IGltYWdlCisgICAgYXV0byBpbWFnZV9jaSA9IHZrX3Rlc3Rpbmc6OkltYWdlOjpjcmVhdGVfaW5mbygpOworICAgIGltYWdlX2NpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY2kuZXh0ZW50LndpZHRoID0gMzI7CisgICAgaW1hZ2VfY2kuZXh0ZW50LmhlaWdodCA9IDMyOworICAgIGltYWdlX2NpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbWFnZV9jaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgdmtfdGVzdGluZzo6SW1hZ2UgaW1hZ2U7CisgICAgaW1hZ2UuaW5pdF9ub19tZW0oKm1fZGV2aWNlLCBpbWFnZV9jaSk7CisKKyAgICAvLyBVc2UgZXh0ZW5zaW9uIHRvIGdldCBpbWFnZSBtZW1vcnkgcmVxdWlyZW1lbnRzCisgICAgYXV0byB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSPigKKyAgICAgICAgdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIikpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSICE9IG51bGxwdHIpOworICAgIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMktIUiBpbWFnZV9pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yX0tIUiwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5oYW5kbGUoKX07CisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyS0hSIGltYWdlX3JlcXMgPSB7VktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0tIUn07CisgICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIobV9kZXZpY2UtPmRldmljZSgpLCAmaW1hZ2VfaW5mbywgJmltYWdlX3JlcXMpOworCisgICAgLy8gQWxsb2NhdGUgYW5kIGJpbmQgaW1hZ2UgbWVtb3J5CisgICAgdmtfdGVzdGluZzo6RGV2aWNlTWVtb3J5IGltYWdlX21lbW9yeTsKKyAgICBpbWFnZV9tZW1vcnkuaW5pdCgqbV9kZXZpY2UsIHZrX3Rlc3Rpbmc6OkRldmljZU1lbW9yeTo6Z2V0X3Jlc291cmNlX2FsbG9jX2luZm8oKm1fZGV2aWNlLCBpbWFnZV9yZXFzLm1lbW9yeVJlcXVpcmVtZW50cywgMCkpOworICAgIHZrOjpCaW5kSW1hZ2VNZW1vcnkobV9kZXZpY2UtPmRldmljZSgpLCBpbWFnZS5oYW5kbGUoKSwgaW1hZ2VfbWVtb3J5LmhhbmRsZSgpLCAwKTsKKworICAgIC8vIE5vdyBleGVjdXRlIGFyYml0cmFyeSBjb21tYW5kcyB0aGF0IHVzZSB0aGUgdGVzdCBidWZmZXIgYW5kIGltYWdlCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgLy8gRmlsbCBidWZmZXIgd2l0aCAwCisgICAgdms6OkNtZEZpbGxCdWZmZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgYnVmZmVyLmhhbmRsZSgpLCAwLCBWS19XSE9MRV9TSVpFLCAwKTsKKworICAgIC8vIFRyYW5zaXRpb24gYW5kIGNsZWFyIGltYWdlCisgICAgY29uc3QgYXV0byBzdWJyZXNvdXJjZV9yYW5nZSA9IGltYWdlLnN1YnJlc291cmNlX3JhbmdlKFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQpOworICAgIGNvbnN0IGF1dG8gYmFycmllciA9IGltYWdlLmltYWdlX21lbW9yeV9iYXJyaWVyKDAsIFZLX0FDQ0VTU19UUkFOU0ZFUl9XUklURV9CSVQsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIHN1YnJlc291cmNlX3JhbmdlKTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmYmFycmllcik7CisgICAgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUgY29sb3IgPSB7fTsKKyAgICB2azo6Q21kQ2xlYXJDb2xvckltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgJmNvbG9yLCAxLCAmc3VicmVzb3VyY2VfcmFuZ2UpOworCisgICAgLy8gU3VibWl0IGFuZCB2ZXJpZnkgbm8gdmFsaWRhdGlvbiBlcnJvcnMKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+UXVldWVDb21tYW5kQnVmZmVyKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBCaW5kTWVtb3J5MikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJCaW5kIG1lbW9yeSB3aXRoIFZLX0tIUl9iaW5kX21lbW9yeTIgaW5zdGVhZCBvZiBjb3JlIGVudHJ5IHBvaW50cyBhbmQgdmVyaWZ5IGxheWVycyBkbyBub3QgZW1pdCBlcnJvcnMgd2hlbiBvYmplY3RzIGFyZSAiCisgICAgICAgICJ1c2VkIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIC8vIENoZWNrIGZvciBWS19LSFJfZ2V0X21lbW9yeV9yZXF1aXJlbWVudGVzMiBleHRlbnNpb25zCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgsIFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUIHwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCk7CisKKyAgICAvLyBDcmVhdGUgYSB0ZXN0IGJ1ZmZlcgorICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBidWZmZXIuaW5pdF9ub19tZW0oKm1fZGV2aWNlLCBWa0J1ZmZlck9iajo6Y3JlYXRlX2luZm8oMTAyNCwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQpKTsKKworICAgIC8vIEFsbG9jYXRlIGJ1ZmZlciBtZW1vcnkKKyAgICB2a190ZXN0aW5nOjpEZXZpY2VNZW1vcnkgYnVmZmVyX21lbW9yeTsKKyAgICBidWZmZXJfbWVtb3J5LmluaXQoKm1fZGV2aWNlLCB2a190ZXN0aW5nOjpEZXZpY2VNZW1vcnk6OmdldF9yZXNvdXJjZV9hbGxvY19pbmZvKCptX2RldmljZSwgYnVmZmVyLm1lbW9yeV9yZXF1aXJlbWVudHMoKSwgMCkpOworCisgICAgLy8gQmluZCBidWZmZXIgbWVtb3J5IHdpdGggZXh0ZW5zaW9uCisgICAgYXV0byB2a0JpbmRCdWZmZXJNZW1vcnkyS0hSID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtCaW5kQnVmZmVyTWVtb3J5MktIUj4odms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrQmluZEJ1ZmZlck1lbW9yeTJLSFIiKSk7CisgICAgQVNTRVJUX1RSVUUodmtCaW5kQnVmZmVyTWVtb3J5MktIUiAhPSBudWxscHRyKTsKKyAgICBWa0JpbmRCdWZmZXJNZW1vcnlJbmZvS0hSIGJ1ZmZlcl9iaW5kX2luZm8gPSB7VktfU1RSVUNUVVJFX1RZUEVfQklORF9CVUZGRVJfTUVNT1JZX0lORk9fS0hSLCBudWxscHRyLCBidWZmZXIuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9tZW1vcnkuaGFuZGxlKCksIDB9OworICAgIHZrQmluZEJ1ZmZlck1lbW9yeTJLSFIobV9kZXZpY2UtPmRldmljZSgpLCAxLCAmYnVmZmVyX2JpbmRfaW5mbyk7CisKKyAgICAvLyBDcmVhdGUgYSB0ZXN0IGltYWdlCisgICAgYXV0byBpbWFnZV9jaSA9IHZrX3Rlc3Rpbmc6OkltYWdlOjpjcmVhdGVfaW5mbygpOworICAgIGltYWdlX2NpLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQ7CisgICAgaW1hZ2VfY2kuZXh0ZW50LndpZHRoID0gMzI7CisgICAgaW1hZ2VfY2kuZXh0ZW50LmhlaWdodCA9IDMyOworICAgIGltYWdlX2NpLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbWFnZV9jaS50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jaS51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgdmtfdGVzdGluZzo6SW1hZ2UgaW1hZ2U7CisgICAgaW1hZ2UuaW5pdF9ub19tZW0oKm1fZGV2aWNlLCBpbWFnZV9jaSk7CisKKyAgICAvLyBBbGxvY2F0ZSBpbWFnZSBtZW1vcnkKKyAgICB2a190ZXN0aW5nOjpEZXZpY2VNZW1vcnkgaW1hZ2VfbWVtb3J5OworICAgIGltYWdlX21lbW9yeS5pbml0KCptX2RldmljZSwgdmtfdGVzdGluZzo6RGV2aWNlTWVtb3J5OjpnZXRfcmVzb3VyY2VfYWxsb2NfaW5mbygqbV9kZXZpY2UsIGltYWdlLm1lbW9yeV9yZXF1aXJlbWVudHMoKSwgMCkpOworCisgICAgLy8gQmluZCBpbWFnZSBtZW1vcnkgd2l0aCBleHRlbnNpb24KKyAgICBhdXRvIHZrQmluZEltYWdlTWVtb3J5MktIUiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrQmluZEltYWdlTWVtb3J5MktIUj4odms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrQmluZEltYWdlTWVtb3J5MktIUiIpKTsKKyAgICBBU1NFUlRfVFJVRSh2a0JpbmRJbWFnZU1lbW9yeTJLSFIgIT0gbnVsbHB0cik7CisgICAgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvS0hSIGltYWdlX2JpbmRfaW5mbyA9IHtWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0lNQUdFX01FTU9SWV9JTkZPX0tIUiwgbnVsbHB0ciwgaW1hZ2UuaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9tZW1vcnkuaGFuZGxlKCksIDB9OworICAgIHZrQmluZEltYWdlTWVtb3J5MktIUihtX2RldmljZS0+ZGV2aWNlKCksIDEsICZpbWFnZV9iaW5kX2luZm8pOworCisgICAgLy8gTm93IGV4ZWN1dGUgYXJiaXRyYXJ5IGNvbW1hbmRzIHRoYXQgdXNlIHRoZSB0ZXN0IGJ1ZmZlciBhbmQgaW1hZ2UKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisKKyAgICAvLyBGaWxsIGJ1ZmZlciB3aXRoIDAKKyAgICB2azo6Q21kRmlsbEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBidWZmZXIuaGFuZGxlKCksIDAsIFZLX1dIT0xFX1NJWkUsIDApOworCisgICAgLy8gVHJhbnNpdGlvbiBhbmQgY2xlYXIgaW1hZ2UKKyAgICBjb25zdCBhdXRvIHN1YnJlc291cmNlX3JhbmdlID0gaW1hZ2Uuc3VicmVzb3VyY2VfcmFuZ2UoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCk7CisgICAgY29uc3QgYXV0byBiYXJyaWVyID0gaW1hZ2UuaW1hZ2VfbWVtb3J5X2JhcnJpZXIoMCwgVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCwgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgc3VicmVzb3VyY2VfcmFuZ2UpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZiYXJyaWVyKTsKKyAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSBjb2xvciA9IHt9OworICAgIHZrOjpDbWRDbGVhckNvbG9ySW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgaW1hZ2UuaGFuZGxlKCksIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCAmY29sb3IsIDEsICZzdWJyZXNvdXJjZV9yYW5nZSk7CisKKyAgICAvLyBTdWJtaXQgYW5kIHZlcmlmeSBubyB2YWxpZGF0aW9uIGVycm9ycworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5RdWV1ZUNvbW1hbmRCdWZmZXIoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lV2l0aENvcmVDaGVja3NEaXNhYmxlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgQ3JlYXRlUGlwZWxpbmUgd2hpbGUgdGhlIENvcmVDaGVja3MgdmFsaWRhdGlvbiBvYmplY3QgaXMgZGlzYWJsZWQiKTsKKworICAgIC8vIEVuYWJsZSBLSFIgdmFsaWRhdGlvbiBmZWF0dXJlcyBleHRlbnNpb24KKyAgICBWa1ZhbGlkYXRpb25GZWF0dXJlRGlzYWJsZUVYVCBkaXNhYmxlc1tdID0ge1ZLX1ZBTElEQVRJT05fRkVBVFVSRV9ESVNBQkxFX0NPUkVfQ0hFQ0tTX0VYVH07CisgICAgVmtWYWxpZGF0aW9uRmVhdHVyZXNFWFQgZmVhdHVyZXMgPSB7fTsKKyAgICBmZWF0dXJlcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1ZBTElEQVRJT05fRkVBVFVSRVNfRVhUOworICAgIGZlYXR1cmVzLmRpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVDb3VudCA9IDE7CisgICAgZmVhdHVyZXMucERpc2FibGVkVmFsaWRhdGlvbkZlYXR1cmVzID0gZGlzYWJsZXM7CisKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgcG9vbF9mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQobnVsbHB0ciwgbnVsbHB0ciwgcG9vbF9mbGFncywgJmZlYXR1cmVzKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKyAgICBWa1NoYWRlck9iaiB2cyhtX2RldmljZSwgYmluZFN0YXRlVmVydFNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiBmcyhtX2RldmljZSwgYmluZFN0YXRlRnJhZ1NoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHRoaXMpOworICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlhc2Npe1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNULCBWS19GQUxTRX07CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5ncF9jaV8ucElucHV0QXNzZW1ibHlTdGF0ZSA9ICZpYXNjaTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge3ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBmcy5HZXRTdGFnZUNyZWF0ZUluZm8oKX07CisgICAgcGlwZS5Jbml0U3RhdGUoKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlUGlwZWluZVdpdGhUZXNzZWxsYXRpb25Eb21haW5PcmlnaW4pIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKAorICAgICAgICAiVGVzdCBDcmVhdGVQaXBlbGluZSB3aGVuIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8ucE5leHQgaW5jbHVkZSAiCisgICAgICAgICJWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIik7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBpZiAoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLnRlc3NlbGxhdGlvblNoYWRlcikgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRlc3NlbGxhdGlvbiBzaGFkZXJzOyBza2lwcGVkLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogdGNzKG1fZGV2aWNlLCBiaW5kU3RhdGVUc2NTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklULCB0aGlzKTsKKyAgICBWa1NoYWRlck9iaiB0ZXMobV9kZXZpY2UsIGJpbmRTdGF0ZVRlc2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlhc2Npe1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNULCBWS19GQUxTRX07CisKKyAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uRG9tYWluT3JpZ2luU3RhdGVDcmVhdGVJbmZvIHRlc3NlbGxhdGlvbkRvbWFpbk9yaWdpblN0YXRlSW5mbyA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVEVTU0VMTEFUSU9OX0RPTUFJTl9PUklHSU5fU1RBVEVfQ1JFQVRFX0lORk8sIFZLX05VTExfSEFORExFLAorICAgICAgICBWS19URVNTRUxMQVRJT05fRE9NQUlOX09SSUdJTl9VUFBFUl9MRUZUfTsKKworICAgIFZrUGlwZWxpbmVUZXNzZWxsYXRpb25TdGF0ZUNyZWF0ZUluZm8gdHNjaXtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9URVNTRUxMQVRJT05fU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXNzZWxsYXRpb25Eb21haW5PcmlnaW5TdGF0ZUluZm8sIDAsIDN9OworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuZ3BfY2lfLnBUZXNzZWxsYXRpb25TdGF0ZSA9ICZ0c2NpOworICAgIHBpcGUuZ3BfY2lfLnBJbnB1dEFzc2VtYmx5U3RhdGUgPSAmaWFzY2k7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgdGNzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCB0ZXMuR2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBNdWx0aXBsYW5lSW1hZ2VDb3B5QnVmZmVyVG9JbWFnZSkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlBvc2l0aXZlIHRlc3Qgb2YgbXVsdGlwbGFuZSBjb3B5IGJ1ZmZlciB0byBpbWFnZSIpOworICAgIC8vIEVuYWJsZSBLSFIgbXVsdGlwbGFuZSByZXEnZCBleHRlbnNpb25zCisgICAgYm9vbCBtcF9leHRlbnNpb25zID0gSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9TUEVDX1ZFUlNJT04pOworICAgIGlmIChtcF9leHRlbnNpb25zKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0KKyAgICBTZXRUYXJnZXRBcGlWZXJzaW9uKFZLX0FQSV9WRVJTSU9OXzFfMSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9HRVRfTUVNT1JZX1JFUVVJUkVNRU5UU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBtcF9leHRlbnNpb25zID0gbXBfZXh0ZW5zaW9ucyAmJiBEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICAgIGlmIChtcF9leHRlbnNpb25zKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9NRU1PUllfUkVRVUlSRU1FTlRTXzJfRVhURU5TSU9OX05BTUUpOworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9CSU5EX01FTU9SWV8yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzIHRlc3QgcmVxdWlyZXMgS0hSIG11bHRpcGxhbmUgZXh0ZW5zaW9ucywgbm90IGF2YWlsYWJsZS4gIFNraXBwaW5nLlxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCBudWxscHRyLCBWS19DT01NQU5EX1BPT0xfQ1JFQVRFX1JFU0VUX0NPTU1BTkRfQlVGRkVSX0JJVCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBjaSA9IHt9OworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDQ0X1VOT1JNX0tIUjsgIC8vIEFsbCBwbGFuZXMgb2YgZXF1YWwgZXh0ZW50CisgICAgY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgIGNpLmV4dGVudCA9IHsxNiwgMTYsIDF9OworICAgIGNpLm1pcExldmVscyA9IDE7CisgICAgY2kuYXJyYXlMYXllcnMgPSAxOworICAgIGNpLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ7CisgICAgY2kuc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgIGNpLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworCisgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZmVhdHVyZXMgPSBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBib29sIHN1cHBvcnRlZCA9IEltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoaW5zdGFuY2UoKSwgZ3B1KCksIGNpLCBmZWF0dXJlcyk7CisgICAgaWYgKCFzdXBwb3J0ZWQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBNdWx0aXBsYW5lIGltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiAgU2tpcHBpbmcgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOyAgLy8gQXNzdW1lIHRoZXJlJ3MgbG93IFJPSSBvbiBzZWFyY2hpbmcgZm9yIGRpZmZlcmVudCBtcCBmb3JtYXRzCisgICAgfQorCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuaW5pdCgmY2kpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5yZXNldCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIGltYWdlLkltYWdlTWVtb3J5QmFycmllcihtX2NvbW1hbmRCdWZmZXIsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIFZLX0FDQ0VTU19UUkFOU0ZFUl9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCk7CisKKyAgICBzdGQ6OmFycmF5PFZrSW1hZ2VBc3BlY3RGbGFnQml0cywgMz4gYXNwZWN0cyA9IHtWS19JTUFHRV9BU1BFQ1RfUExBTkVfMF9CSVQsIFZLX0lNQUdFX0FTUEVDVF9QTEFORV8xX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMl9CSVR9OworICAgIHN0ZDo6YXJyYXk8VmtCdWZmZXJPYmosIDM+IGJ1ZmZlcnM7CisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIHJlcXMgPSAwOworCisgICAgVmtCdWZmZXJJbWFnZUNvcHkgY29weSA9IHt9OworICAgIGNvcHkuaW1hZ2VTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5LmltYWdlRXh0ZW50LmRlcHRoID0gMTsKKyAgICBjb3B5LmltYWdlRXh0ZW50LmhlaWdodCA9IDE2OworICAgIGNvcHkuaW1hZ2VFeHRlbnQud2lkdGggPSAxNjsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXNwZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBidWZmZXJzW2ldLmluaXRfYXNfc3JjKCptX2RldmljZSwgKFZrRGV2aWNlU2l6ZSkxNiAqIDE2ICogMSwgcmVxcyk7CisgICAgICAgIGNvcHkuaW1hZ2VTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gYXNwZWN0c1tpXTsKKyAgICAgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlcnNbaV0uaGFuZGxlKCksIGltYWdlLmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLCAmY29weSk7CisgICAgfQorICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBNdWx0aXBsYW5lSW1hZ2VUZXN0cykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlBvc2l0aXZlIHRlc3Qgb2YgbXVsdGlwbGFuZSBpbWFnZSBvcGVyYXRpb25zIik7CisKKyAgICAvLyBFbmFibGUgS0hSIG11bHRpcGxhbmUgcmVxJ2QgZXh0ZW5zaW9ucworICAgIGJvb2wgbXBfZXh0ZW5zaW9ucyA9IEluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfU1BFQ19WRVJTSU9OKTsKKyAgICBpZiAobXBfZXh0ZW5zaW9ucykgeworICAgICAgICBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICB9CisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIG1wX2V4dGVuc2lvbnMgPSBtcF9leHRlbnNpb25zICYmIERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgbXBfZXh0ZW5zaW9ucyA9IG1wX2V4dGVuc2lvbnMgJiYgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKGdwdSgpLCBudWxscHRyLCBWS19LSFJfQklORF9NRU1PUllfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgaWYgKG1wX2V4dGVuc2lvbnMpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfTUFJTlRFTkFOQ0UxX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgdGVzdCByZXF1aXJlcyBLSFIgbXVsdGlwbGFuZSBleHRlbnNpb25zLCBub3QgYXZhaWxhYmxlLiAgU2tpcHBpbmcuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKG51bGxwdHIsIG51bGxwdHIsIFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklUKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKworICAgIC8vIENyZWF0ZSBhbGlhc2VkIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciAxLjAgYW5kIDEuMSBjb250ZXh0cworCisgICAgUEZOX3ZrQmluZEltYWdlTWVtb3J5MktIUiB2a0JpbmRJbWFnZU1lbW9yeTJGdW5jdGlvbiA9IG51bGxwdHI7CisgICAgUEZOX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyRnVuY3Rpb24gPSBudWxscHRyOworICAgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyRnVuY3Rpb24gPSBudWxscHRyOworCisgICAgaWYgKERldmljZVZhbGlkYXRpb25WZXJzaW9uKCkgPj0gVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIHZrQmluZEltYWdlTWVtb3J5MkZ1bmN0aW9uID0gdms6OkJpbmRJbWFnZU1lbW9yeTI7CisgICAgICAgIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyRnVuY3Rpb24gPSB2azo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyOworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJGdW5jdGlvbiA9IHZrOjpHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyOworICAgIH0gZWxzZSB7CisgICAgICAgIHZrQmluZEltYWdlTWVtb3J5MkZ1bmN0aW9uID0gKFBGTl92a0JpbmRJbWFnZU1lbW9yeTJLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5oYW5kbGUoKSwgInZrQmluZEltYWdlTWVtb3J5MktIUiIpOworICAgICAgICB2a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMkZ1bmN0aW9uID0KKyAgICAgICAgICAgIChQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIpdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5oYW5kbGUoKSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIik7CisgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMkZ1bmN0aW9uID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJLSFIpdms6OkdldERldmljZVByb2NBZGRyKAorICAgICAgICAgICAgbV9kZXZpY2UtPmhhbmRsZSgpLCAidmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyS0hSIik7CisgICAgfQorCisgICAgaWYgKCF2a0JpbmRJbWFnZU1lbW9yeTJGdW5jdGlvbiB8fCAhdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJGdW5jdGlvbiB8fCAhdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMyRnVuY3Rpb24pIHsKKyAgICAgICAgcHJpbnRmKCIlcyBEaWQgbm90IGZpbmQgcmVxdWlyZWQgZGV2aWNlIGV4dGVuc2lvbiBzdXBwb3J0OyB0ZXN0IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBjaSA9IHt9OworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgY2kucE5leHQgPSBOVUxMOworICAgIGNpLmZsYWdzID0gMDsKKyAgICBjaS5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDQ0X1VOT1JNX0tIUjsgIC8vIEFsbCBwbGFuZXMgb2YgZXF1YWwgZXh0ZW50CisgICAgY2kudGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgY2kudXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgIGNpLmV4dGVudCA9IHsxMjgsIDEyOCwgMX07CisgICAgY2kubWlwTGV2ZWxzID0gMTsKKyAgICBjaS5hcnJheUxheWVycyA9IDE7CisgICAgY2kuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBjaS5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgY2kuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisKKyAgICAvLyBWZXJpZnkgZm9ybWF0CisgICAgVmtGb3JtYXRGZWF0dXJlRmxhZ3MgZmVhdHVyZXMgPSBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBib29sIHN1cHBvcnRlZCA9IEltYWdlRm9ybWF0QW5kRmVhdHVyZXNTdXBwb3J0ZWQoaW5zdGFuY2UoKSwgZ3B1KCksIGNpLCBmZWF0dXJlcyk7CisgICAgaWYgKCFzdXBwb3J0ZWQpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBNdWx0aXBsYW5lIGltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiAgU2tpcHBpbmcgdGVzdC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOyAgLy8gQXNzdW1lIHRoZXJlJ3MgbG93IFJPSSBvbiBzZWFyY2hpbmcgZm9yIGRpZmZlcmVudCBtcCBmb3JtYXRzCisgICAgfQorCisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6Q3JlYXRlSW1hZ2UoZGV2aWNlKCksICZjaSwgTlVMTCwgJmltYWdlKSk7CisKKyAgICAvLyBBbGxvY2F0ZSAmIGJpbmQgbWVtb3J5CisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgcGh5c19tZW1fcHJvcHM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhncHUoKSwgJnBoeXNfbWVtX3Byb3BzKTsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1fcmVxczsKKyAgICB2azo6R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlKCksIGltYWdlLCAmbWVtX3JlcXMpOworICAgIFZrRGV2aWNlTWVtb3J5IG1lbV9vYmogPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ0JpdHMgbWVtX3Byb3BzID0gVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQ7CisgICAgZm9yICh1aW50MzJfdCB0eXBlID0gMDsgdHlwZSA8IHBoeXNfbWVtX3Byb3BzLm1lbW9yeVR5cGVDb3VudDsgdHlwZSsrKSB7CisgICAgICAgIGlmICgobWVtX3JlcXMubWVtb3J5VHlwZUJpdHMgJiAoMSA8PCB0eXBlKSkgJiYKKyAgICAgICAgICAgICgocGh5c19tZW1fcHJvcHMubWVtb3J5VHlwZXNbdHlwZV0ucHJvcGVydHlGbGFncyAmIG1lbV9wcm9wcykgPT0gbWVtX3Byb3BzKSkgeworICAgICAgICAgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgICAgICAgICAgYWxsb2NfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgICAgICAgICAgYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IG1lbV9yZXFzLnNpemU7CisgICAgICAgICAgICBhbGxvY19pbmZvLm1lbW9yeVR5cGVJbmRleCA9IHR5cGU7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6QWxsb2NhdGVNZW1vcnkoZGV2aWNlKCksICZhbGxvY19pbmZvLCBOVUxMLCAmbWVtX29iaikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoVktfTlVMTF9IQU5ETEUgPT0gbWVtX29iaikgeworICAgICAgICBwcmludGYoIiVzIFVuYWJsZSB0byBhbGxvY2F0ZSBpbWFnZSBtZW1vcnkuIFNraXBwaW5nIHRlc3QuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHZrOjpEZXN0cm95SW1hZ2UoZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6QmluZEltYWdlTWVtb3J5KGRldmljZSgpLCBpbWFnZSwgbWVtX29iaiwgMCkpOworCisgICAgLy8gQ29weSBwbGFuZSAwIHRvIHBsYW5lIDIKKyAgICBWa0ltYWdlQ29weSBjb3B5UmVnaW9uID0ge307CisgICAgY29weVJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX1BMQU5FXzBfQklUX0tIUjsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5UmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlSZWdpb24uc3JjT2Zmc2V0ID0gezAsIDAsIDB9OworICAgIGNvcHlSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVF9LSFI7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weVJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5UmVnaW9uLmRzdE9mZnNldCA9IHswLCAwLCAwfTsKKyAgICBjb3B5UmVnaW9uLmV4dGVudC53aWR0aCA9IDEyODsKKyAgICBjb3B5UmVnaW9uLmV4dGVudC5oZWlnaHQgPSAxMjg7CisgICAgY29weVJlZ2lvbi5leHRlbnQuZGVwdGggPSAxOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5Db3B5SW1hZ2UoaW1hZ2UsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLCBpbWFnZSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5UmVnaW9uKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIG1lbV9vYmosIE5VTEwpOworICAgIHZrOjpEZXN0cm95SW1hZ2UoZGV2aWNlKCksIGltYWdlLCBOVUxMKTsKKworICAgIC8vIFJlcGVhdCBiaW5kIHRlc3Qgb24gYSBESVNKT0lOVCBtdWx0aS1wbGFuYXIgaW1hZ2UsIHdpdGggcGVyLXBsYW5lIG1lbW9yeSBvYmplY3RzLCB1c2luZyBBUEkyIHZhcmlhbnRzCisgICAgLy8KKyAgICBmZWF0dXJlcyB8PSBWS19GT1JNQVRfRkVBVFVSRV9ESVNKT0lOVF9CSVQ7CisgICAgY2kuZmxhZ3MgPSBWS19JTUFHRV9DUkVBVEVfRElTSk9JTlRfQklUOworICAgIGlmIChJbWFnZUZvcm1hdEFuZEZlYXR1cmVzU3VwcG9ydGVkKGluc3RhbmNlKCksIGdwdSgpLCBjaSwgZmVhdHVyZXMpKSB7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpDcmVhdGVJbWFnZShkZXZpY2UoKSwgJmNpLCBOVUxMLCAmaW1hZ2UpKTsKKworICAgICAgICAvLyBBbGxvY2F0ZSAmIGJpbmQgbWVtb3J5CisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzMiBwaHlzX21lbV9wcm9wczIgPSB7VktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX01FTU9SWV9QUk9QRVJUSUVTXzJ9OworICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllczJGdW5jdGlvbihncHUoKSwgJnBoeXNfbWVtX3Byb3BzMik7CisgICAgICAgIFZrSW1hZ2VQbGFuZU1lbW9yeVJlcXVpcmVtZW50c0luZm8gaW1hZ2VfcGxhbmVfcmVxID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1BMQU5FX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT307CisgICAgICAgIFZrSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHNJbmZvMiBtZW1fcmVxX2luZm8yID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yfTsKKyAgICAgICAgbWVtX3JlcV9pbmZvMi5wTmV4dCA9ICZpbWFnZV9wbGFuZV9yZXE7CisgICAgICAgIG1lbV9yZXFfaW5mbzIuaW1hZ2UgPSBpbWFnZTsKKyAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyIG1lbV9yZXFzMiA9IHtWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzJ9OworCisgICAgICAgIFZrRGV2aWNlTWVtb3J5IHAwX21lbSwgcDFfbWVtLCBwMl9tZW07CisgICAgICAgIG1lbV9wcm9wcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9ERVZJQ0VfTE9DQUxfQklUOworICAgICAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBhbGxvY19pbmZvID0ge1ZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPfTsKKworICAgICAgICAvLyBQbGFuZSAwCisgICAgICAgIGltYWdlX3BsYW5lX3JlcS5wbGFuZUFzcGVjdCA9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8wX0JJVDsKKyAgICAgICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJGdW5jdGlvbihkZXZpY2UoKSwgJm1lbV9yZXFfaW5mbzIsICZtZW1fcmVxczIpOworICAgICAgICB1aW50MzJfdCBtZW1fdHlwZSA9IDA7CisgICAgICAgIGZvciAobWVtX3R5cGUgPSAwOyBtZW1fdHlwZSA8IHBoeXNfbWVtX3Byb3BzMi5tZW1vcnlQcm9wZXJ0aWVzLm1lbW9yeVR5cGVDb3VudDsgbWVtX3R5cGUrKykgeworICAgICAgICAgICAgaWYgKChtZW1fcmVxczIubWVtb3J5UmVxdWlyZW1lbnRzLm1lbW9yeVR5cGVCaXRzICYgKDEgPDwgbWVtX3R5cGUpKSAmJgorICAgICAgICAgICAgICAgICgocGh5c19tZW1fcHJvcHMyLm1lbW9yeVByb3BlcnRpZXMubWVtb3J5VHlwZXNbbWVtX3R5cGVdLnByb3BlcnR5RmxhZ3MgJiBtZW1fcHJvcHMpID09IG1lbV9wcm9wcykpIHsKKyAgICAgICAgICAgICAgICBhbGxvY19pbmZvLm1lbW9yeVR5cGVJbmRleCA9IG1lbV90eXBlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFsbG9jX2luZm8uYWxsb2NhdGlvblNpemUgPSBtZW1fcmVxczIubWVtb3J5UmVxdWlyZW1lbnRzLnNpemU7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKHZrOjpBbGxvY2F0ZU1lbW9yeShkZXZpY2UoKSwgJmFsbG9jX2luZm8sIE5VTEwsICZwMF9tZW0pKTsKKworICAgICAgICAvLyBQbGFuZSAxICYgMiB1c2Ugc2FtZSBtZW1vcnkgdHlwZQorICAgICAgICBpbWFnZV9wbGFuZV9yZXEucGxhbmVBc3BlY3QgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVQ7CisgICAgICAgIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyRnVuY3Rpb24oZGV2aWNlKCksICZtZW1fcmVxX2luZm8yLCAmbWVtX3JlcXMyKTsKKyAgICAgICAgYWxsb2NfaW5mby5hbGxvY2F0aW9uU2l6ZSA9IG1lbV9yZXFzMi5tZW1vcnlSZXF1aXJlbWVudHMuc2l6ZTsKKyAgICAgICAgQVNTRVJUX1ZLX1NVQ0NFU1Modms6OkFsbG9jYXRlTWVtb3J5KGRldmljZSgpLCAmYWxsb2NfaW5mbywgTlVMTCwgJnAxX21lbSkpOworCisgICAgICAgIGltYWdlX3BsYW5lX3JlcS5wbGFuZUFzcGVjdCA9IFZLX0lNQUdFX0FTUEVDVF9QTEFORV8yX0JJVDsKKyAgICAgICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJGdW5jdGlvbihkZXZpY2UoKSwgJm1lbV9yZXFfaW5mbzIsICZtZW1fcmVxczIpOworICAgICAgICBhbGxvY19pbmZvLmFsbG9jYXRpb25TaXplID0gbWVtX3JlcXMyLm1lbW9yeVJlcXVpcmVtZW50cy5zaXplOworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyh2azo6QWxsb2NhdGVNZW1vcnkoZGV2aWNlKCksICZhbGxvY19pbmZvLCBOVUxMLCAmcDJfbWVtKSk7CisKKyAgICAgICAgLy8gU2V0IHVwIDMtcGxhbmUgYmluZGluZworICAgICAgICBWa0JpbmRJbWFnZU1lbW9yeUluZm8gYmluZF9pbmZvWzNdOworICAgICAgICBmb3IgKGludCBwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgeworICAgICAgICAgICAgYmluZF9pbmZvW3BsYW5lXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JJTkRfSU1BR0VfTUVNT1JZX0lORk87CisgICAgICAgICAgICBiaW5kX2luZm9bcGxhbmVdLnBOZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGJpbmRfaW5mb1twbGFuZV0uaW1hZ2UgPSBpbWFnZTsKKyAgICAgICAgICAgIGJpbmRfaW5mb1twbGFuZV0ubWVtb3J5T2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBiaW5kX2luZm9bMF0ubWVtb3J5ID0gcDBfbWVtOworICAgICAgICBiaW5kX2luZm9bMV0ubWVtb3J5ID0gcDFfbWVtOworICAgICAgICBiaW5kX2luZm9bMl0ubWVtb3J5ID0gcDJfbWVtOworCisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgICAgIHZrQmluZEltYWdlTWVtb3J5MkZ1bmN0aW9uKGRldmljZSgpLCAzLCBiaW5kX2luZm8pOworICAgICAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKKworICAgICAgICB2azo6RnJlZU1lbW9yeShkZXZpY2UoKSwgcDBfbWVtLCBOVUxMKTsKKyAgICAgICAgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIHAxX21lbSwgTlVMTCk7CisgICAgICAgIHZrOjpGcmVlTWVtb3J5KGRldmljZSgpLCBwMl9tZW0sIE5VTEwpOworICAgICAgICB2azo6RGVzdHJveUltYWdlKGRldmljZSgpLCBpbWFnZSwgTlVMTCk7CisgICAgfQorCisgICAgLy8gVGVzdCB0aGF0IGNoYW5naW5nIHRoZSBsYXlvdXQgb2YgQVNQRUNUX0NPTE9SIGFsc28gY2hhbmdlcyB0aGUgbGF5b3V0IG9mIHRoZSBpbmRpdmlkdWFsIHBsYW5lcworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IDA7CisgICAgYnVmZmVyLmluaXRfYXNfc3JjKCptX2RldmljZSwgKFZrRGV2aWNlU2l6ZSkxMjggKiAxMjggKiAzLCByZXFzKTsKKyAgICBWa0ltYWdlT2JqIG1waW1hZ2UobV9kZXZpY2UpOworICAgIG1waW1hZ2UuSW5pdCgyNTYsIDI1NiwgMSwgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjJfVU5PUk1fS0hSLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQsCisgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMLCAwKTsKKyAgICBWa0J1ZmZlckltYWdlQ29weSBjb3B5X3JlZ2lvbiA9IHt9OworICAgIGNvcHlfcmVnaW9uLmJ1ZmZlclJvd0xlbmd0aCA9IDEyODsKKyAgICBjb3B5X3JlZ2lvbi5idWZmZXJJbWFnZUhlaWdodCA9IDEyODsKKyAgICBjb3B5X3JlZ2lvbi5pbWFnZVN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfUExBTkVfMV9CSVRfS0hSOworICAgIGNvcHlfcmVnaW9uLmltYWdlU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uaW1hZ2VFeHRlbnQuaGVpZ2h0ID0gNjQ7CisgICAgY29weV9yZWdpb24uaW1hZ2VFeHRlbnQud2lkdGggPSA2NDsKKyAgICBjb3B5X3JlZ2lvbi5pbWFnZUV4dGVudC5kZXB0aCA9IDE7CisKKyAgICB2azo6UmVzZXRDb21tYW5kQnVmZmVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDApOworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtcGltYWdlLkltYWdlTWVtb3J5QmFycmllcihtX2NvbW1hbmRCdWZmZXIsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDAsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCk7CisgICAgdms6OkNtZENvcHlCdWZmZXJUb0ltYWdlKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIGJ1ZmZlci5oYW5kbGUoKSwgbXBpbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29weV9yZWdpb24pOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5RdWV1ZUNvbW1hbmRCdWZmZXIoZmFsc2UpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgLy8gVGVzdCB0byB2ZXJpZnkgdGhhdCB2aWV3cyBvZiBtdWx0aXBsYW5hciBpbWFnZXMgaGF2ZSBsYXlvdXRzIHRyYWNrZWQgY29ycmVjdGx5CisgICAgLy8gYnkgY2hhbmdpbmcgdGhlIGltYWdlJ3MgbGF5b3V0IHRoZW4gdXNpbmcgYSB2aWV3IG9mIHRoYXQgaW1hZ2UKKyAgICBWa0ltYWdlVmlldyB2aWV3OworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpdmNpID0ge307CisgICAgaXZjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgaXZjaS5pbWFnZSA9IG1waW1hZ2UuaGFuZGxlKCk7CisgICAgaXZjaS52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICBpdmNpLmZvcm1hdCA9IFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNX0tIUjsKKyAgICBpdmNpLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaXZjaS5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIGl2Y2kuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICB2azo6Q3JlYXRlSW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgJml2Y2ksIG51bGxwdHIsICZ2aWV3KTsKKworICAgIE9uZU9mZkRlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQobV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLCAxLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCBudWxscHRyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzYW1wbGVyX2NpID0gU2FmZVNhbmVTYW1wbGVyQ3JlYXRlSW5mbygpOworICAgIFZrU2FtcGxlciBzYW1wbGVyOworCisgICAgVmtSZXN1bHQgZXJyOworICAgIGVyciA9IHZrOjpDcmVhdGVTYW1wbGVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnNhbXBsZXJfY2ksIE5VTEwsICZzYW1wbGVyKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwaXBlbGluZV9sYXlvdXQobV9kZXZpY2UsIHsmZGVzY3JpcHRvcl9zZXQubGF5b3V0X30pOworICAgIGRlc2NyaXB0b3Jfc2V0LldyaXRlRGVzY3JpcHRvckltYWdlSW5mbygwLCB2aWV3LCBzYW1wbGVyKTsKKyAgICBkZXNjcmlwdG9yX3NldC5VcGRhdGVEZXNjcmlwdG9yU2V0cygpOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIGJpbmRTdGF0ZVZlcnRTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTYW1wbGVyU2hhZGVyVGV4dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisgICAgVmtQaXBlbGluZU9iaiBwaXBlKG1fZGV2aWNlKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZmcyk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZS5DcmVhdGVWS1BpcGVsaW5lKHBpcGVsaW5lX2xheW91dC5oYW5kbGUoKSwgcmVuZGVyUGFzcygpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltZ19iYXJyaWVyID0ge307CisgICAgaW1nX2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUjsKKyAgICBpbWdfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQ7CisgICAgaW1nX2JhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUOworICAgIGltZ19iYXJyaWVyLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDsKKyAgICBpbWdfYmFycmllci5uZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMOworICAgIGltZ19iYXJyaWVyLmltYWdlID0gbXBpbWFnZS5oYW5kbGUoKTsKKyAgICBpbWdfYmFycmllci5zcmNRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICB2azo6Q21kUGlwZWxpbmVCYXJyaWVyKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQsIDAsIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbWdfYmFycmllcik7CisgICAgbV9jb21tYW5kQnVmZmVyLT5CZWdpblJlbmRlclBhc3MobV9yZW5kZXJQYXNzQmVnaW5JbmZvKTsKKyAgICB2azo6Q21kQmluZFBpcGVsaW5lKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIHBpcGUuaGFuZGxlKCkpOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3Jfc2V0LnNldF8sIDAsIG51bGxwdHIpOworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydCA9IHswLCAwLCAxNiwgMTYsIDAsIDF9OworICAgIFZrUmVjdDJEIHNjaXNzb3IgPSB7ezAsIDB9LCB7MTYsIDE2fX07CisgICAgdms6OkNtZFNldFZpZXdwb3J0KG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksIDAsIDEsICZ2aWV3cG9ydCk7CisgICAgdms6OkNtZFNldFNjaXNzb3IobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMCwgMSwgJnNjaXNzb3IpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5EcmF3KDEsIDAsIDAsIDApOworICAgIG1fY29tbWFuZEJ1ZmZlci0+RW5kUmVuZGVyUGFzcygpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvID0ge307CisgICAgc3VibWl0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTzsKKyAgICBzdWJtaXRfaW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdF9pbmZvLnBDb21tYW5kQnVmZmVycyA9ICZtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6UXVldWVXYWl0SWRsZShtX2RldmljZS0+bV9xdWV1ZSk7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCB2aWV3LCBOVUxMKTsKKyAgICB2azo6RGVzdHJveVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCBzYW1wbGVyLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIEFwaVZlcnNpb25aZXJvKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ2hlY2sgdGhhdCBhcGlWZXJzaW9uID0gMCBpcyB2YWxpZC4iKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIGFwcF9pbmZvLmFwaVZlcnNpb24gPSAwVTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFJheVRyYWNpbmdQaXBlbGluZU5WKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBWS19OVl9yYXlfdHJhY2luZy4iKTsKKworICAgIGlmICghQ3JlYXRlTlZSYXlUcmFjaW5nUGlwZWxpbmVIZWxwZXI6OkluaXRJbnN0YW5jZUV4dGVuc2lvbnMoKnRoaXMsIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2azo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSgpLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICAgIEFTU0VSVF9UUlVFKHZrR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczJLSFIgIT0gbnVsbHB0cik7CisKKyAgICBpZiAoIUNyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyOjpJbml0RGV2aWNlRXh0ZW5zaW9ucygqdGhpcywgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIGF1dG8gaWdub3JlX3VwZGF0ZSA9IFtdKENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyICZoZWxwZXIpIHt9OworICAgIENyZWF0ZU5WUmF5VHJhY2luZ1BpcGVsaW5lSGVscGVyOjpPbmVzaG90UG9zaXRpdmVUZXN0KCp0aGlzLCBpZ25vcmVfdXBkYXRlKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFZpZXdwb3J0QXJyYXkyTlYpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHRvIHZhbGlkYXRlIFZLX05WX3ZpZXdwb3J0X2FycmF5MiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgYXZhaWxhYmxlX2ZlYXR1cmVzID0ge307CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcygmYXZhaWxhYmxlX2ZlYXR1cmVzKSk7CisKKyAgICBpZiAoIWF2YWlsYWJsZV9mZWF0dXJlcy5tdWx0aVZpZXdwb3J0KSB7CisgICAgICAgIHByaW50ZigiJXMgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjptdWx0aVZpZXdwb3J0IGlzIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFhdmFpbGFibGVfZmVhdHVyZXMudGVzc2VsbGF0aW9uU2hhZGVyKSB7CisgICAgICAgIHByaW50ZigiJXMgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzOjp0ZXNzZWxsYXRpb25TaGFkZXIgaXMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWF2YWlsYWJsZV9mZWF0dXJlcy5nZW9tZXRyeVNoYWRlcikgeworICAgICAgICBwcmludGYoIiVzIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6Z2VvbWV0cnlTaGFkZXIgaXMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX05WX1ZJRVdQT1JUX0FSUkFZMl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19OVl9WSUVXUE9SVF9BUlJBWTJfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgVktfTlZfVklFV1BPUlRfQVJSQVkyX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY29uc3QgY2hhciB0Y3Nfc3JjW10gPSBSIigKKyAgICAgICAgI3ZlcnNpb24gNDUwCisgICAgICAgIGxheW91dCh2ZXJ0aWNlcyA9IDMpIG91dDsKKworICAgICAgICB2b2lkIG1haW4oKSB7CisgICAgICAgICAgICBnbF9UZXNzTGV2ZWxPdXRlclswXSA9IDQuMGY7CisgICAgICAgICAgICBnbF9UZXNzTGV2ZWxPdXRlclsxXSA9IDQuMGY7CisgICAgICAgICAgICBnbF9UZXNzTGV2ZWxPdXRlclsyXSA9IDQuMGY7CisgICAgICAgICAgICBnbF9UZXNzTGV2ZWxJbm5lclswXSA9IDMuMGY7CisKKyAgICAgICAgICAgIGdsX291dFtnbF9JbnZvY2F0aW9uSURdLmdsX1Bvc2l0aW9uID0gZ2xfaW5bZ2xfSW52b2NhdGlvbklEXS5nbF9Qb3NpdGlvbjsKKyAgICAgICAgfSkiOworCisgICAgLy8gQ3JlYXRlIHRlc3NlbGxhdGlvbiBjb250cm9sIGFuZCBmcmFnbWVudCBzaGFkZXIgaGVyZSBzaW5jZSB0aGV5IHdpbGwgbm90IGJlCisgICAgLy8gbW9kaWZpZWQgYnkgdGhlIGRpZmZlcmVudCB0ZXN0IGNhc2VzLgorICAgIFZrU2hhZGVyT2JqIHRjcyhtX2RldmljZSwgdGNzX3NyYywgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVCwgdGhpcyk7CisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGJpbmRTdGF0ZUZyYWdTaGFkZXJUZXh0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIHN0ZDo6dmVjdG9yPFZrVmlld3BvcnQ+IHZwcyA9IHt7MC4wZiwgMC4wZiwgbV93aWR0aCAvIDIuMGYsIG1faGVpZ2h0fSwge21fd2lkdGggLyAyLjBmLCAwLjBmLCBtX3dpZHRoIC8gMi4wZiwgbV9oZWlnaHR9fTsKKyAgICBzdGQ6OnZlY3RvcjxWa1JlY3QyRD4gc2NzID0geworICAgICAgICB7ezAsIDB9LCB7c3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1fd2lkdGgpIC8gMiwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1faGVpZ2h0KX19LAorICAgICAgICB7e3N0YXRpY19jYXN0PGludDMyX3Q+KG1fd2lkdGgpIC8gMiwgMH0sIHtzdGF0aWNfY2FzdDx1aW50MzJfdD4obV93aWR0aCkgLyAyLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4obV9oZWlnaHQpfX19OworCisgICAgZW51bSBjbGFzcyBUZXN0U3RhZ2UgeyBWRVJURVggPSAwLCBURVNTRUxMQVRJT05fRVZBTCA9IDEsIEdFT01FVFJZID0gMiB9OworICAgIHN0ZDo6YXJyYXk8VGVzdFN0YWdlLCAzPiB2ZXJ0ZXhfc3RhZ2VzID0ge3tUZXN0U3RhZ2U6OlZFUlRFWCwgVGVzdFN0YWdlOjpURVNTRUxMQVRJT05fRVZBTCwgVGVzdFN0YWdlOjpHRU9NRVRSWX19OworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHVzYWdlIG9mIGdsX1ZpZXdwb3J0TWFza1tdIGluIHRoZSBhbGxvd2VkIHZlcnRleCBwcm9jZXNzaW5nCisgICAgLy8gc3RhZ2VzIGRvZXMgbm90IGNhdXNlIGFueSBlcnJvcnMuCisgICAgZm9yIChhdXRvIHN0YWdlIDogdmVydGV4X3N0YWdlcykgeworICAgICAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlhY2kgPSB7VktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk99OworICAgICAgICBpYWNpLnRvcG9sb2d5ID0gKHN0YWdlICE9IFRlc3RTdGFnZTo6VkVSVEVYKSA/IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QQVRDSF9MSVNUIDogVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1Q7CisKKyAgICAgICAgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyB0c2NpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1RFU1NFTExBVElPTl9TVEFURV9DUkVBVEVfSU5GT307CisgICAgICAgIHRzY2kucGF0Y2hDb250cm9sUG9pbnRzID0gMzsKKworICAgICAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBsKG1fZGV2aWNlKTsKKworICAgICAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgICAgICBwaXBlLkFkZERlZmF1bHRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICAgICAgcGlwZS5TZXRJbnB1dEFzc2VtYmx5KCZpYWNpKTsKKyAgICAgICAgcGlwZS5TZXRWaWV3cG9ydCh2cHMpOworICAgICAgICBwaXBlLlNldFNjaXNzb3Ioc2NzKTsKKyAgICAgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSB2c19zcmMsIHRlc19zcmMsIGdlb21fc3JjOworCisgICAgICAgIHZzX3NyYyA8PCBSIigKKyAgICAgICAgICAgICN2ZXJzaW9uIDQ1MAorICAgICAgICAgICAgI2V4dGVuc2lvbiBHTF9OVl92aWV3cG9ydF9hcnJheTIgOiByZXF1aXJlCisKKyAgICAgICAgICAgIHZlYzIgcG9zaXRpb25zWzNdID0geyB2ZWMyKCAwLjBmLCAtMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMiggMC41ZiwgIDAuNWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoLTAuNWYsICAwLjVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgdm9pZCBtYWluKCkgeykiOworICAgICAgICAvLyBXcml0ZSB2aWV3cG9ydE1hc2sgaWYgdGhlIHZlcnRleCBzaGFkZXIgaXMgdGhlIGxhc3QgdmVydGV4IHByb2Nlc3Npbmcgc3RhZ2UuCisgICAgICAgIGlmIChzdGFnZSA9PSBUZXN0U3RhZ2U6OlZFUlRFWCkgeworICAgICAgICAgICAgdnNfc3JjIDw8ICJnbF9WaWV3cG9ydE1hc2tbMF0gPSAzO1xuIjsKKyAgICAgICAgfQorICAgICAgICB2c19zcmMgPDwgUiIoCisgICAgICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uc1tnbF9WZXJ0ZXhJbmRleCAlIDNdLCAwLjAsIDEuMCk7CisgICAgICAgICAgICB9KSI7CisKKyAgICAgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzX3NyYy5zdHIoKS5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgdGhpcyk7CisgICAgICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFZrU2hhZGVyT2JqPiB0ZXMsIGdlb207CisKKyAgICAgICAgaWYgKHN0YWdlID49IFRlc3RTdGFnZTo6VEVTU0VMTEFUSU9OX0VWQUwpIHsKKyAgICAgICAgICAgIHRlc19zcmMgPDwgUiIoCisgICAgICAgICAgICAgICAgI3ZlcnNpb24gNDUwCisgICAgICAgICAgICAgICAgI2V4dGVuc2lvbiBHTF9OVl92aWV3cG9ydF9hcnJheTIgOiByZXF1aXJlCisgICAgICAgICAgICAgICAgbGF5b3V0KHRyaWFuZ2xlcykgaW47CisKKyAgICAgICAgICAgICAgICB2b2lkIG1haW4oKSB7CisgICAgICAgICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSAoZ2xfaW5bMF0uZ2xfUG9zaXRpb24gKiBnbF9UZXNzQ29vcmQueCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfaW5bMV0uZ2xfUG9zaXRpb24gKiBnbF9UZXNzQ29vcmQueSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfaW5bMl0uZ2xfUG9zaXRpb24gKiBnbF9UZXNzQ29vcmQueik7KSI7CisgICAgICAgICAgICAvLyBXcml0ZSB2aWV3cG9ydE1hc2sgaWYgdGhlIHRlc3MgZXZhbCBzaGFkZXIgaXMgdGhlIGxhc3QgdmVydGV4IHByb2Nlc3Npbmcgc3RhZ2UuCisgICAgICAgICAgICBpZiAoc3RhZ2UgPT0gVGVzdFN0YWdlOjpURVNTRUxMQVRJT05fRVZBTCkgeworICAgICAgICAgICAgICAgIHRlc19zcmMgPDwgImdsX1ZpZXdwb3J0TWFza1swXSA9IDM7XG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVzX3NyYyA8PCAifSI7CisKKyAgICAgICAgICAgIHRlcyA9IHN0ZDo6dW5pcXVlX3B0cjxWa1NoYWRlck9iaj4oCisgICAgICAgICAgICAgICAgbmV3IFZrU2hhZGVyT2JqKG1fZGV2aWNlLCB0ZXNfc3JjLnN0cigpLmNfc3RyKCksIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQsIHRoaXMpKTsKKyAgICAgICAgICAgIHBpcGUuQWRkU2hhZGVyKHRlcy5nZXQoKSk7CisgICAgICAgICAgICBwaXBlLkFkZFNoYWRlcigmdGNzKTsKKyAgICAgICAgICAgIHBpcGUuU2V0VGVzc2VsbGF0aW9uKCZ0c2NpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFnZSA+PSBUZXN0U3RhZ2U6OkdFT01FVFJZKSB7CisgICAgICAgICAgICBnZW9tX3NyYyA8PCBSIigKKyAgICAgICAgICAgICAgICAjdmVyc2lvbiA0NTAKKyAgICAgICAgICAgICAgICAjZXh0ZW5zaW9uIEdMX05WX3ZpZXdwb3J0X2FycmF5MiA6IHJlcXVpcmUKKyAgICAgICAgICAgICAgICBsYXlvdXQodHJpYW5nbGVzKSAgIGluOworICAgICAgICAgICAgICAgIGxheW91dCh0cmlhbmdsZV9zdHJpcCwgbWF4X3ZlcnRpY2VzID0gMykgb3V0OworCisgICAgICAgICAgICAgICAgdm9pZCBtYWluKCkgeworICAgICAgICAgICAgICAgICAgIGdsX1ZpZXdwb3J0TWFza1swXSA9IDM7CisgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IGdsX2luW2ldLmdsX1Bvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICBFbWl0VmVydGV4KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KSI7CisKKyAgICAgICAgICAgIGdlb20gPQorICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxWa1NoYWRlck9iaj4obmV3IFZrU2hhZGVyT2JqKG1fZGV2aWNlLCBnZW9tX3NyYy5zdHIoKS5jX3N0cigpLCBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklULCB0aGlzKSk7CisgICAgICAgICAgICBwaXBlLkFkZFNoYWRlcihnZW9tLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShwbC5oYW5kbGUoKSwgcmVuZGVyUGFzcygpKTsKKyAgICAgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgfQorfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgSG9zdFF1ZXJ5UmVzZXRTdWNjZXNzKSB7CisgICAgLy8gVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QuIE5vIGZhaWx1cmVzIGFyZSBleHBlY3RlZC4KKyAgICBURVNUX0RFU0NSSVBUSU9OKCJVc2UgdmtSZXNldFF1ZXJ5UG9vbEVYVCBub3JtYWxseSIpOworCisgICAgaWYgKCFJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIHByaW50ZigiJXMgRGlkIG5vdCBmaW5kIHJlcXVpcmVkIGluc3RhbmNlIGV4dGVuc2lvbiAlczsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LAorICAgICAgICAgICAgICAgVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfR0VUX1BIWVNJQ0FMX0RFVklDRV9QUk9QRVJUSUVTXzJfRVhURU5TSU9OX05BTUUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKCFEZXZpY2VFeHRlbnNpb25TdXBwb3J0ZWQoZ3B1KCksIG51bGxwdHIsIFZLX0VYVF9IT1NUX1FVRVJZX1JFU0VUX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBwcmludGYoIiVzIEV4dGVuc2lvbiAlcyBub3Qgc3VwcG9ydGVkIGJ5IGRldmljZTsgc2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4LCBWS19FWFRfSE9TVF9RVUVSWV9SRVNFVF9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0VYVF9IT1NUX1FVRVJZX1JFU0VUX0VYVEVOU0lPTl9OQU1FKTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VIb3N0UXVlcnlSZXNldEZlYXR1cmVzRVhUIGhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXN7fTsKKyAgICBob3N0X3F1ZXJ5X3Jlc2V0X2ZlYXR1cmVzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0hPU1RfUVVFUllfUkVTRVRfRkVBVFVSRVNfRVhUOworICAgIGhvc3RfcXVlcnlfcmVzZXRfZmVhdHVyZXMuaG9zdFF1ZXJ5UmVzZXQgPSBWS19UUlVFOworCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMiBwZF9mZWF0dXJlczJ7fTsKKyAgICBwZF9mZWF0dXJlczIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRkVBVFVSRVNfMjsKKyAgICBwZF9mZWF0dXJlczIucE5leHQgPSAmaG9zdF9xdWVyeV9yZXNldF9mZWF0dXJlczsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZShudWxscHRyLCAmcGRfZmVhdHVyZXMyKSk7CisKKyAgICBhdXRvIGZwdmtSZXNldFF1ZXJ5UG9vbEVYVCA9IChQRk5fdmtSZXNldFF1ZXJ5UG9vbEVYVCl2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtSZXNldFF1ZXJ5UG9vbEVYVCIpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKworICAgIFZrUXVlcnlQb29sIHF1ZXJ5X3Bvb2w7CisgICAgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm97fTsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUVVFUllfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLnF1ZXJ5VHlwZSA9IFZLX1FVRVJZX1RZUEVfVElNRVNUQU1QOworICAgIHF1ZXJ5X3Bvb2xfY3JlYXRlX2luZm8ucXVlcnlDb3VudCA9IDE7CisgICAgdms6OkNyZWF0ZVF1ZXJ5UG9vbChtX2RldmljZS0+ZGV2aWNlKCksICZxdWVyeV9wb29sX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmcXVlcnlfcG9vbCk7CisgICAgZnB2a1Jlc2V0UXVlcnlQb29sRVhUKG1fZGV2aWNlLT5kZXZpY2UoKSwgcXVlcnlfcG9vbCwgMCwgMSk7CisgICAgdms6OkRlc3Ryb3lRdWVyeVBvb2wobV9kZXZpY2UtPmRldmljZSgpLCBxdWVyeV9wb29sLCBudWxscHRyKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVGcmFnbWVudE91dHB1dE5vdENvbnN1bWVkQnV0QWxwaGFUb0NvdmVyYWdlRW5hYmxlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oCisgICAgICAgICJUZXN0IHRoYXQgbm8gd2FybmluZyBpcyBwcm9kdWNlZCB3aGVuIHdyaXRpbmcgdG8gbm9uLWV4aXN0aW5nIGNvbG9yIGF0dGFjaG1lbnQgaWYgYWxwaGEgdG8gY292ZXJhZ2UgaXMgZW5hYmxlZC4iKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgwdSkpOworCisgICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIG1zX3N0YXRlX2NpID0ge307CisgICAgbXNfc3RhdGVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBtc19zdGF0ZV9jaS5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBtc19zdGF0ZV9jaS5hbHBoYVRvQ292ZXJhZ2VFbmFibGUgPSBWS19UUlVFOworCisgICAgY29uc3QgYXV0byBzZXRfaW5mbyA9IFsmXShDcmVhdGVQaXBlbGluZUhlbHBlciAmaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5waXBlX21zX3N0YXRlX2NpXyA9IG1zX3N0YXRlX2NpOworICAgICAgICBoZWxwZXIuY2JfY2lfLmF0dGFjaG1lbnRDb3VudCA9IDA7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIHNldF9pbmZvLCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCB8IFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsICIiLCB0cnVlKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIENyZWF0ZVBpcGVsaW5lQXR0YWNobWVudFVudXNlZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIk1ha2Ugc3VyZSB1bnVzZWQgYXR0YWNobWVudHMgYXJlIGNvcnJlY3RseSBpZ25vcmVkLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY2hhciBjb25zdCAqZnNTb3VyY2UgPQorICAgICAgICAiI3ZlcnNpb24gNDUwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImxheW91dChsb2NhdGlvbj0wKSBvdXQgdmVjNCB4O1xuIgorICAgICAgICAidm9pZCBtYWluKCl7XG4iCisgICAgICAgICIgICB4ID0gdmVjNCgxKTtcbiIgIC8vIGF0dGFjaG1lbnQgaXMgdW51c2VkCisgICAgICAgICJ9XG4iOworICAgIFZrU2hhZGVyT2JqIGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgY29uc3QgY29sb3JfYXR0YWNobWVudHNbMV17e1ZLX0FUVEFDSE1FTlRfVU5VU0VELCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfX07CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBjb25zdCBzdWJwYXNzX2Rlc2NyaXB0aW9uc1sxXXsKKyAgICAgICAgezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIG51bGxwdHIsIDEsIGNvbG9yX2F0dGFjaG1lbnRzLCBudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyfX07CisKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBjb25zdCBhdHRhY2htZW50X2Rlc2NyaXB0aW9uc1sxXXt7MCwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUiwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9fTsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gY29uc3QgcmVuZGVyX3Bhc3NfaW5mb3sKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sIG51bGxwdHIsIDAsIDEsIGF0dGFjaG1lbnRfZGVzY3JpcHRpb25zLCAxLCBzdWJwYXNzX2Rlc2NyaXB0aW9ucywgMCwgbnVsbHB0cn07CisKKyAgICBWa1JlbmRlclBhc3MgcmVuZGVyX3Bhc3M7CisgICAgYXV0byByZXN1bHQgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZyZW5kZXJfcGFzc19pbmZvLCBudWxscHRyLCAmcmVuZGVyX3Bhc3MpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHJlc3VsdCk7CisKKyAgICBjb25zdCBhdXRvIG92ZXJyaWRlX2luZm8gPSBbJl0oQ3JlYXRlUGlwZWxpbmVIZWxwZXIgJmhlbHBlcikgeworICAgICAgICBoZWxwZXIuc2hhZGVyX3N0YWdlc18gPSB7aGVscGVyLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCksIGZzLkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICAgICAgaGVscGVyLmdwX2NpXy5yZW5kZXJQYXNzID0gcmVuZGVyX3Bhc3M7CisgICAgfTsKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlcjo6T25lc2hvdFRlc3QoKnRoaXMsIG92ZXJyaWRlX2luZm8sIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUIHwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcmVuZGVyX3Bhc3MsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgVXNlRmlyc3RRdWV1ZVVucXVlcmllZCkgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlVzZSBmaXJzdCBxdWV1ZSBmYW1pbHkgYW5kIG9uZSBxdWV1ZSB3aXRob3V0IGZpcnN0IHF1ZXJ5aW5nIHdpdGggdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBjb25zdCBmbG9hdCBxX3ByaW9yaXR5W10gPSB7MS4wZn07CisgICAgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gcXVldWVfY2kgPSB7fTsKKyAgICBxdWV1ZV9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTzsKKyAgICBxdWV1ZV9jaS5xdWV1ZUZhbWlseUluZGV4ID0gMDsKKyAgICBxdWV1ZV9jaS5xdWV1ZUNvdW50ID0gMTsKKyAgICBxdWV1ZV9jaS5wUXVldWVQcmlvcml0aWVzID0gcV9wcmlvcml0eTsKKworICAgIFZrRGV2aWNlQ3JlYXRlSW5mbyBkZXZpY2VfY2kgPSB7fTsKKyAgICBkZXZpY2VfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk87CisgICAgZGV2aWNlX2NpLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMTsKKyAgICBkZXZpY2VfY2kucFF1ZXVlQ3JlYXRlSW5mb3MgPSAmcXVldWVfY2k7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIFZrRGV2aWNlIHRlc3RfZGV2aWNlOworICAgIHZrOjpDcmVhdGVEZXZpY2UoZ3B1KCksICZkZXZpY2VfY2ksIG51bGxwdHIsICZ0ZXN0X2RldmljZSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveURldmljZSh0ZXN0X2RldmljZSwgbnVsbHB0cik7Cit9CisKKy8vIEFuZHJvaWQgbG9hZGVyIHJldHVybnMgYW4gZXJyb3IgaW4gdGhpcyBjYXNlCisjaWYgIWRlZmluZWQoQU5EUk9JRCkKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBHZXREZXZQcm9jQWRkck51bGxQdHIpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJDYWxsIEdldERldmljZVByb2NBZGRyIG9uIGFuIGVuYWJsZWQgaW5zdGFuY2UgZXh0ZW5zaW9uIGV4cGVjdGluZyBudWxscHRyIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBpZiAoSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1faW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgYXV0byBmcERlc3Ryb3lTdXJmYWNlID0gKFBGTl92a0NyZWF0ZVZhbGlkYXRpb25DYWNoZUVYVCl2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmRldmljZSgpLCAidmtEZXN0cm95U3VyZmFjZUtIUiIpOworICAgIGlmIChmcERlc3Ryb3lTdXJmYWNlKSB7CisgICAgICAgIG1fZXJyb3JNb25pdG9yLT5TZXRFcnJvcigiTnVsbCB3YXMgZXhwZWN0ZWQhIik7CisgICAgfQorICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgR2V0RGV2UHJvY0FkZHJFeHRlbnNpb25zKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ2FsbCBHZXREZXZpY2VQcm9jQWRkciB3aXRoIGFuZCB3aXRob3V0IGV4dGVuc2lvbiBlbmFibGVkIik7CisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmIChEZXZpY2VWYWxpZGF0aW9uVmVyc2lvbigpIDwgVktfQVBJX1ZFUlNJT05fMV8xKSB7CisgICAgICAgIHByaW50ZigiJXMgR2V0RGV2UHJvY0FkZHJFeHRlbnNpb25zIHJlcXVpcmVzIFZ1bGthbiAxLjErLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBhdXRvIHZrVHJpbUNvbW1hbmRQb29sID0gdms6OkdldERldmljZVByb2NBZGRyKG1fZGV2aWNlLT5kZXZpY2UoKSwgInZrVHJpbUNvbW1hbmRQb29sIik7CisgICAgYXV0byB2a1RyaW1Db21tYW5kUG9vbEtIUiA9IHZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+ZGV2aWNlKCksICJ2a1RyaW1Db21tYW5kUG9vbEtIUiIpOworICAgIGlmIChudWxscHRyID09IHZrVHJpbUNvbW1hbmRQb29sKSBtX2Vycm9yTW9uaXRvci0+U2V0RXJyb3IoIlVuZXhwZWN0ZWQgbnVsbCBwb2ludGVyIik7CisgICAgaWYgKG51bGxwdHIgIT0gdmtUcmltQ29tbWFuZFBvb2xLSFIpIG1fZXJyb3JNb25pdG9yLT5TZXRFcnJvcigiRGlkbid0IHJlY2VpdmUgZXhwZWN0ZWQgbnVsbCBwb2ludGVyIik7CisKKyAgICBjb25zdCBjaGFyICpjb25zdCBleHRlbnNpb24gPSB7VktfS0hSX01BSU5URU5BTkNFMV9FWFRFTlNJT05fTkFNRX07CisgICAgY29uc3QgZmxvYXQgcV9wcmlvcml0eVtdID0gezEuMGZ9OworICAgIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIHF1ZXVlX2NpID0ge307CisgICAgcXVldWVfY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfQ1JFQVRFX0lORk87CisgICAgcXVldWVfY2kucXVldWVGYW1pbHlJbmRleCA9IDA7CisgICAgcXVldWVfY2kucXVldWVDb3VudCA9IDE7CisgICAgcXVldWVfY2kucFF1ZXVlUHJpb3JpdGllcyA9IHFfcHJpb3JpdHk7CisKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gZGV2aWNlX2NpID0ge307CisgICAgZGV2aWNlX2NpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVWSUNFX0NSRUFURV9JTkZPOworICAgIGRldmljZV9jaS5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSAxOworICAgIGRldmljZV9jaS5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9ICZleHRlbnNpb247CisgICAgZGV2aWNlX2NpLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMTsKKyAgICBkZXZpY2VfY2kucFF1ZXVlQ3JlYXRlSW5mb3MgPSAmcXVldWVfY2k7CisKKyAgICBWa0RldmljZSBkZXZpY2U7CisgICAgdms6OkNyZWF0ZURldmljZShncHUoKSwgJmRldmljZV9jaSwgTlVMTCwgJmRldmljZSk7CisKKyAgICB2a1RyaW1Db21tYW5kUG9vbEtIUiA9IHZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsICJ2a1RyaW1Db21tYW5kUG9vbEtIUiIpOworICAgIGlmIChudWxscHRyID09IHZrVHJpbUNvbW1hbmRQb29sS0hSKSBtX2Vycm9yTW9uaXRvci0+U2V0RXJyb3IoIlVuZXhwZWN0ZWQgbnVsbCBwb2ludGVyIik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisgICAgdms6OkRlc3Ryb3lEZXZpY2UoZGV2aWNlLCBudWxscHRyKTsKK30KKyNlbmRpZgorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ21kQ29weVN3YXBjaGFpbkltYWdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiUnVuIHZrQ21kQ29weUltYWdlIHdpdGggYSBzd2FwY2hhaW4gaW1hZ2UiKTsKKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKQorICAgIHByaW50ZigKKyAgICAgICAgIiVzIEFjY29yZGluZyB0byB2YWxpZCB1c2FnZSwgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeSBzaG91bGQgYmUgTlVMTC4gQnV0IEFuZHJvaWQgd2lsbCBjcmFzaCBpZiBtZW1vcnkgaXMgTlVMTCwgIgorICAgICAgICAic2tpcHBpbmcgQ21kQ29weVN3YXBjaGFpbkltYWdlIHRlc3RcbiIsCisgICAgICAgIGtTa2lwUHJlZml4KTsKKyAgICByZXR1cm47CisjZW5kaWYKKworICAgIFNldFRhcmdldEFwaVZlcnNpb24oVktfQVBJX1ZFUlNJT05fMV8xKTsKKworICAgIGlmICghQWRkU3VyZmFjZUluc3RhbmNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzdXJmYWNlIGV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgQ21kQ29weVN3YXBjaGFpbkltYWdlIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKCFBZGRTd2FwY2hhaW5EZXZpY2VFeHRlbnNpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIHN3YXBjaGFpbiBleHRlbnNpb25zIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIENtZENvcHlTd2FwY2hhaW5JbWFnZSB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoRGV2aWNlVmFsaWRhdGlvblZlcnNpb24oKSA8IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICBwcmludGYoIiVzIFZrQmluZEltYWdlTWVtb3J5SW5mbyByZXF1aXJlcyBWdWxrYW4gMS4xKywgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisgICAgaWYgKCFJbml0U3dhcGNoYWluKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBDYW5ub3QgY3JlYXRlIHN1cmZhY2Ugb3Igc3dhcGNoYWluLCBza2lwcGluZyBDbWRDb3B5U3dhcGNoYWluSW1hZ2UgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBpbWFnZV9jcmVhdGVfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0ltYWdlQ3JlYXRlSW5mbz4oKTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQud2lkdGggPSA2NDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5leHRlbnQuaGVpZ2h0ID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmRlcHRoID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5taXBMZXZlbHMgPSAxOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmFycmF5TGF5ZXJzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFSU5JVElBTElaRUQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKworICAgIFZrSW1hZ2VPYmogc3JjSW1hZ2UobV9kZXZpY2UpOworICAgIHNyY0ltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKworICAgIGF1dG8gaW1hZ2Vfc3dhcGNoYWluX2NyZWF0ZV9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrSW1hZ2VTd2FwY2hhaW5DcmVhdGVJbmZvS0hSPigpOworICAgIGltYWdlX3N3YXBjaGFpbl9jcmVhdGVfaW5mby5zd2FwY2hhaW4gPSBtX3N3YXBjaGFpbjsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5wTmV4dCA9ICZpbWFnZV9zd2FwY2hhaW5fY3JlYXRlX2luZm87CisKKyAgICBWa0ltYWdlIGltYWdlX2Zyb21fc3dhcGNoYWluOworICAgIHZrOjpDcmVhdGVJbWFnZShkZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmaW1hZ2VfZnJvbV9zd2FwY2hhaW4pOworCisgICAgYXV0byBiaW5kX3N3YXBjaGFpbl9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUj4oKTsKKyAgICBiaW5kX3N3YXBjaGFpbl9pbmZvLnN3YXBjaGFpbiA9IG1fc3dhcGNoYWluOworICAgIGJpbmRfc3dhcGNoYWluX2luZm8uaW1hZ2VJbmRleCA9IDA7CisKKyAgICBhdXRvIGJpbmRfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0JpbmRJbWFnZU1lbW9yeUluZm8+KCZiaW5kX3N3YXBjaGFpbl9pbmZvKTsKKyAgICBiaW5kX2luZm8uaW1hZ2UgPSBpbWFnZV9mcm9tX3N3YXBjaGFpbjsKKyAgICBiaW5kX2luZm8ubWVtb3J5ID0gVktfTlVMTF9IQU5ETEU7CisgICAgYmluZF9pbmZvLm1lbW9yeU9mZnNldCA9IDA7CisKKyAgICB2azo6QmluZEltYWdlTWVtb3J5MihtX2RldmljZS0+ZGV2aWNlKCksIDEsICZiaW5kX2luZm8pOworCisgICAgVmtJbWFnZUNvcHkgY29weV9yZWdpb24gPSB7fTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubGF5ZXJDb3VudCA9IDE7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0ID0gezAsIDAsIDB9OworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldCA9IHswLCAwLCAwfTsKKyAgICBjb3B5X3JlZ2lvbi5leHRlbnQgPSB7MTAsIDEwLCAxfTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OkNtZENvcHlJbWFnZShtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBzcmNJbWFnZS5oYW5kbGUoKSwgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIGltYWdlX2Zyb21fc3dhcGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwsIDEsICZjb3B5X3JlZ2lvbik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6RGVzdHJveUltYWdlKG1fZGV2aWNlLT5kZXZpY2UoKSwgaW1hZ2VfZnJvbV9zd2FwY2hhaW4sIE5VTEwpOworICAgIERlc3Ryb3lTd2FwY2hhaW4oKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFRyYW5zZmVySW1hZ2VUb1N3YXBjaGFpbkRldmljZUdyb3VwKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVHJhbnNmZXIgYW4gaW1hZ2UgdG8gYSBzd2FwY2hhaW4ncyBpbWFnZSAgYmV0d2VlbiBkZXZpY2UgZ3JvdXAiKTsKKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSKQorICAgIHByaW50ZigKKyAgICAgICAgIiVzIEFjY29yZGluZyB0byB2YWxpZCB1c2FnZSwgVmtCaW5kSW1hZ2VNZW1vcnlJbmZvLW1lbW9yeSBzaG91bGQgYmUgTlVMTC4gQnV0IEFuZHJvaWQgd2lsbCBjcmFzaCBpZiBtZW1vcnkgaXMgTlVMTCwgIgorICAgICAgICAic2tpcHBpbmcgdGVzdFxuIiwKKyAgICAgICAga1NraXBQcmVmaXgpOworICAgIHJldHVybjsKKyNlbmRpZgorCisgICAgU2V0VGFyZ2V0QXBpVmVyc2lvbihWS19BUElfVkVSU0lPTl8xXzEpOworCisgICAgaWYgKCFBZGRTdXJmYWNlSW5zdGFuY2VFeHRlbnNpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIHN1cmZhY2UgZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKworICAgIGlmICghQWRkU3dhcGNoYWluRGV2aWNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzd2FwY2hhaW4gZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoRGV2aWNlVmFsaWRhdGlvblZlcnNpb24oKSA8IFZLX0FQSV9WRVJTSU9OXzFfMSkgeworICAgICAgICBwcmludGYoIiVzIFZrQmluZEltYWdlTWVtb3J5SW5mbyByZXF1aXJlcyBWdWxrYW4gMS4xKywgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQzMl90IHBoeXNpY2FsX2RldmljZV9ncm91cF9jb3VudCA9IDA7CisgICAgdms6OkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlR3JvdXBzKGluc3RhbmNlKCksICZwaHlzaWNhbF9kZXZpY2VfZ3JvdXBfY291bnQsIG51bGxwdHIpOworCisgICAgaWYgKHBoeXNpY2FsX2RldmljZV9ncm91cF9jb3VudCA9PSAwKSB7CisgICAgICAgIHByaW50ZigiJXMgcGh5c2ljYWxfZGV2aWNlX2dyb3VwX2NvdW50IGlzIDAsIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFZrUGh5c2ljYWxEZXZpY2VHcm91cFByb3BlcnRpZXM+IHBoeXNpY2FsX2RldmljZV9ncm91cChwaHlzaWNhbF9kZXZpY2VfZ3JvdXBfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWS19TVFJVQ1RVUkVfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfR1JPVVBfUFJPUEVSVElFU30pOworICAgIHZrOjpFbnVtZXJhdGVQaHlzaWNhbERldmljZUdyb3VwcyhpbnN0YW5jZSgpLCAmcGh5c2ljYWxfZGV2aWNlX2dyb3VwX2NvdW50LCBwaHlzaWNhbF9kZXZpY2VfZ3JvdXAuZGF0YSgpKTsKKyAgICBWa0RldmljZUdyb3VwRGV2aWNlQ3JlYXRlSW5mbyBjcmVhdGVfZGV2aWNlX3BuZXh0ID0ge307CisgICAgY3JlYXRlX2RldmljZV9wbmV4dC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9HUk9VUF9ERVZJQ0VfQ1JFQVRFX0lORk87CisgICAgY3JlYXRlX2RldmljZV9wbmV4dC5waHlzaWNhbERldmljZUNvdW50ID0gcGh5c2ljYWxfZGV2aWNlX2dyb3VwWzBdLnBoeXNpY2FsRGV2aWNlQ291bnQ7CisgICAgY3JlYXRlX2RldmljZV9wbmV4dC5wUGh5c2ljYWxEZXZpY2VzID0gcGh5c2ljYWxfZGV2aWNlX2dyb3VwWzBdLnBoeXNpY2FsRGV2aWNlczsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0U3RhdGUobnVsbHB0ciwgJmNyZWF0ZV9kZXZpY2VfcG5leHQpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworICAgIGlmICghSW5pdFN3YXBjaGFpbihWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKSkgeworICAgICAgICBwcmludGYoIiVzIENhbm5vdCBjcmVhdGUgc3VyZmFjZSBvciBzd2FwY2hhaW4sIHNraXBwaW5nIHRlc3RcbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gaW1hZ2VfY3JlYXRlX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtJbWFnZUNyZWF0ZUluZm8+KCk7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LndpZHRoID0gNjQ7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uZXh0ZW50LmhlaWdodCA9IDY0OworICAgIGltYWdlX2NyZWF0ZV9pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5hcnJheUxheWVycyA9IDE7CisgICAgaW1hZ2VfY3JlYXRlX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1BSRUlOSVRJQUxJWkVEOworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisKKyAgICBWa0ltYWdlT2JqIHNyY19JbWFnZShtX2RldmljZSk7CisgICAgc3JjX0ltYWdlLmluaXQoJmltYWdlX2NyZWF0ZV9pbmZvKTsKKworICAgIGltYWdlX2NyZWF0ZV9pbmZvLnVzYWdlID0gVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICBpbWFnZV9jcmVhdGVfaW5mby5mbGFncyA9IFZLX0lNQUdFX0NSRUFURV9BTElBU19CSVQ7CisKKyAgICBhdXRvIGltYWdlX3N3YXBjaGFpbl9jcmVhdGVfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0ltYWdlU3dhcGNoYWluQ3JlYXRlSW5mb0tIUj4oKTsKKyAgICBpbWFnZV9zd2FwY2hhaW5fY3JlYXRlX2luZm8uc3dhcGNoYWluID0gbV9zd2FwY2hhaW47CisgICAgaW1hZ2VfY3JlYXRlX2luZm8ucE5leHQgPSAmaW1hZ2Vfc3dhcGNoYWluX2NyZWF0ZV9pbmZvOworCisgICAgVmtJbWFnZSBwZWVyX2ltYWdlOworICAgIHZrOjpDcmVhdGVJbWFnZShkZXZpY2UoKSwgJmltYWdlX2NyZWF0ZV9pbmZvLCBOVUxMLCAmcGVlcl9pbWFnZSk7CisKKyAgICBhdXRvIGJpbmRfZGV2aWNlZ3JvdXBfaW5mbyA9IGx2bF9pbml0X3N0cnVjdDxWa0JpbmRJbWFnZU1lbW9yeURldmljZUdyb3VwSW5mbz4oKTsKKyAgICBiaW5kX2RldmljZWdyb3VwX2luZm8uZGV2aWNlSW5kZXhDb3VudCA9IDI7CisgICAgc3RkOjphcnJheTx1aW50MzJfdCwgMj4gZGV2aWNlSW5kaWNlcyA9IHswLCAwfTsKKyAgICBiaW5kX2RldmljZWdyb3VwX2luZm8ucERldmljZUluZGljZXMgPSBkZXZpY2VJbmRpY2VzLmRhdGEoKTsKKyAgICBiaW5kX2RldmljZWdyb3VwX2luZm8uc3BsaXRJbnN0YW5jZUJpbmRSZWdpb25Db3VudCA9IDA7CisgICAgYmluZF9kZXZpY2Vncm91cF9pbmZvLnBTcGxpdEluc3RhbmNlQmluZFJlZ2lvbnMgPSBudWxscHRyOworCisgICAgYXV0byBiaW5kX3N3YXBjaGFpbl9pbmZvID0gbHZsX2luaXRfc3RydWN0PFZrQmluZEltYWdlTWVtb3J5U3dhcGNoYWluSW5mb0tIUj4oJmJpbmRfZGV2aWNlZ3JvdXBfaW5mbyk7CisgICAgYmluZF9zd2FwY2hhaW5faW5mby5zd2FwY2hhaW4gPSBtX3N3YXBjaGFpbjsKKyAgICBiaW5kX3N3YXBjaGFpbl9pbmZvLmltYWdlSW5kZXggPSAwOworCisgICAgYXV0byBiaW5kX2luZm8gPSBsdmxfaW5pdF9zdHJ1Y3Q8VmtCaW5kSW1hZ2VNZW1vcnlJbmZvPigmYmluZF9zd2FwY2hhaW5faW5mbyk7CisgICAgYmluZF9pbmZvLmltYWdlID0gcGVlcl9pbWFnZTsKKyAgICBiaW5kX2luZm8ubWVtb3J5ID0gVktfTlVMTF9IQU5ETEU7CisgICAgYmluZF9pbmZvLm1lbW9yeU9mZnNldCA9IDA7CisKKyAgICB2azo6QmluZEltYWdlTWVtb3J5MihtX2RldmljZS0+ZGV2aWNlKCksIDEsICZiaW5kX2luZm8pOworCisgICAgdWludDMyX3Qgc3dhcGNoYWluX2ltYWdlc19jb3VudCA9IDA7CisgICAgdms6OkdldFN3YXBjaGFpbkltYWdlc0tIUihkZXZpY2UoKSwgbV9zd2FwY2hhaW4sICZzd2FwY2hhaW5faW1hZ2VzX2NvdW50LCBudWxscHRyKTsKKyAgICBzdGQ6OnZlY3RvcjxWa0ltYWdlPiBzd2FwY2hhaW5faW1hZ2VzOworICAgIHN3YXBjaGFpbl9pbWFnZXMucmVzaXplKHN3YXBjaGFpbl9pbWFnZXNfY291bnQpOworICAgIHZrOjpHZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlKCksIG1fc3dhcGNoYWluLCAmc3dhcGNoYWluX2ltYWdlc19jb3VudCwgc3dhcGNoYWluX2ltYWdlcy5kYXRhKCkpOworCisgICAgbV9jb21tYW5kQnVmZmVyLT5iZWdpbigpOworCisgICAgYXV0byBpbWdfYmFycmllciA9IGx2bF9pbml0X3N0cnVjdDxWa0ltYWdlTWVtb3J5QmFycmllcj4oKTsKKyAgICBpbWdfYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDsKKyAgICBpbWdfYmFycmllci5pbWFnZSA9IHN3YXBjaGFpbl9pbWFnZXNbMF07CisgICAgaW1nX2JhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltZ19iYXJyaWVyLmRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQgPSAxOworICAgIGltZ19iYXJyaWVyLnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgdms6OkNtZFBpcGVsaW5lQmFycmllcihtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDAsIG51bGxwdHIsIDEsICZpbWdfYmFycmllcik7CisKKyAgICBWa0ltYWdlQ29weSBjb3B5X3JlZ2lvbiA9IHt9OworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbCA9IDA7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQgPSB7MCwgMCwgMH07CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0ID0gezAsIDAsIDB9OworICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IHsxMCwgMTAsIDF9OworICAgIHZrOjpDbWRDb3B5SW1hZ2UobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgc3JjX0ltYWdlLmhhbmRsZSgpLCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCwgcGVlcl9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwgJmNvcHlfcmVnaW9uKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPlF1ZXVlQ29tbWFuZEJ1ZmZlcigpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworCisgICAgdms6OkRlc3Ryb3lJbWFnZShtX2RldmljZS0+ZGV2aWNlKCksIHBlZXJfaW1hZ2UsIE5VTEwpOworICAgIERlc3Ryb3lTd2FwY2hhaW4oKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFJlbmRlclBhc3NWYWxpZFN0YWdlcykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSByZW5kZXIgcGFzcyB3aXRoIHZhbGlkIHN0YWdlcyIpOworCisgICAgYm9vbCBycDJfc3VwcG9ydGVkID0gSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgICBpZiAocnAyX3N1cHBvcnRlZCkgbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX0tIUl9HRVRfUEhZU0lDQUxfREVWSUNFX1BST1BFUlRJRVNfMl9FWFRFTlNJT05fTkFNRSk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RnJhbWV3b3JrKG15RGJnRnVuYywgbV9lcnJvck1vbml0b3IpKTsKKyAgICBpZiAocnAyX3N1cHBvcnRlZCkgcnAyX3N1cHBvcnRlZCA9IENoZWNrQ3JlYXRlUmVuZGVyUGFzczJTdXBwb3J0KHRoaXMsIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc2NpWzJdID0ge307CisgICAgc2NpWzBdLnBpcGVsaW5lQmluZFBvaW50ID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzsKKyAgICBzY2lbMV0ucGlwZWxpbmVCaW5kUG9pbnQgPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTOworCisgICAgVmtTdWJwYXNzRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0ge307CisgICAgLy8gdG8gYmUgZmlsbGVkIGxhdGVyIGJ5IHRlc3RzCisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7fTsKKyAgICBycGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk87CisgICAgcnBjaS5zdWJwYXNzQ291bnQgPSAyOworICAgIHJwY2kucFN1YnBhc3NlcyA9IHNjaTsKKyAgICBycGNpLmRlcGVuZGVuY3lDb3VudCA9IDE7CisgICAgcnBjaS5wRGVwZW5kZW5jaWVzID0gJmRlcGVuZGVuY3k7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBrR3JhcGhpY3NTdGFnZXMgPQorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9BTExfR1JBUEhJQ1NfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfRFJBV19JTkRJUkVDVF9CSVQgfAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfSU5QVVRfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9GUkFHTUVOVF9TSEFERVJfQklUIHwKKyAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfRUFSTFlfRlJBR01FTlRfVEVTVFNfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfTEFURV9GUkFHTUVOVF9URVNUU19CSVQgfAorICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9CT1RUT01fT0ZfUElQRV9CSVQ7CisKKyAgICBkZXBlbmRlbmN5LnNyY1N1YnBhc3MgPSAwOworICAgIGRlcGVuZGVuY3kuZHN0U3VicGFzcyA9IDE7CisgICAgZGVwZW5kZW5jeS5zcmNTdGFnZU1hc2sgPSBrR3JhcGhpY3NTdGFnZXM7CisgICAgZGVwZW5kZW5jeS5kc3RTdGFnZU1hc2sgPSBrR3JhcGhpY3NTdGFnZXM7CisgICAgUG9zaXRpdmVUZXN0UmVuZGVyUGFzc0NyZWF0ZShtX2Vycm9yTW9uaXRvciwgbV9kZXZpY2UtPmRldmljZSgpLCAmcnBjaSwgcnAyX3N1cHBvcnRlZCk7CisKKyAgICBkZXBlbmRlbmN5LnNyY1N1YnBhc3MgPSBWS19TVUJQQVNTX0VYVEVSTkFMOworICAgIGRlcGVuZGVuY3kuZHN0U3VicGFzcyA9IDA7CisgICAgZGVwZW5kZW5jeS5zcmNTdGFnZU1hc2sgPSBrR3JhcGhpY3NTdGFnZXMgfCBWS19QSVBFTElORV9TVEFHRV9IT1NUX0JJVDsKKyAgICBkZXBlbmRlbmN5LmRzdFN0YWdlTWFzayA9IGtHcmFwaGljc1N0YWdlczsKKyAgICBQb3NpdGl2ZVRlc3RSZW5kZXJQYXNzQ3JlYXRlKG1fZXJyb3JNb25pdG9yLCBtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBycDJfc3VwcG9ydGVkKTsKKworICAgIGRlcGVuZGVuY3kuc3JjU3VicGFzcyA9IDA7CisgICAgZGVwZW5kZW5jeS5kc3RTdWJwYXNzID0gVktfU1VCUEFTU19FWFRFUk5BTDsKKyAgICBkZXBlbmRlbmN5LnNyY1N0YWdlTWFzayA9IGtHcmFwaGljc1N0YWdlczsKKyAgICBkZXBlbmRlbmN5LmRzdFN0YWdlTWFzayA9IFZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUOworICAgIFBvc2l0aXZlVGVzdFJlbmRlclBhc3NDcmVhdGUobV9lcnJvck1vbml0b3IsIG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIHJwMl9zdXBwb3J0ZWQpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgU2FtcGxlTWFza092ZXJyaWRlQ292ZXJhZ2VOVikgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIlRlc3QgdG8gdmFsaWRhdGUgVktfTlZfc2FtcGxlX21hc2tfb3ZlcnJpZGVfY292ZXJhZ2UiKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfTlZfU0FNUExFX01BU0tfT1ZFUlJJREVfQ09WRVJBR0VfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfTlZfU0FNUExFX01BU0tfT1ZFUlJJREVfQ09WRVJBR0VfRVhURU5TSU9OX05BTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgRXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBrU2tpcFByZWZpeCwgVktfTlZfU0FNUExFX01BU0tfT1ZFUlJJREVfQ09WRVJBR0VfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworCisgICAgY29uc3QgY2hhciB2c19zcmNbXSA9IFIiKAorICAgICAgICAjdmVyc2lvbiA0NTAKKyAgICAgICAgbGF5b3V0KGxvY2F0aW9uPTApIG91dCB2ZWM0ICBmcmFnQ29sb3I7CisKKyAgICAgICAgY29uc3QgdmVjMiBwb3NbM10gPSB7IHZlYzIoIDAuMGYsIC0wLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoIDAuNWYsICAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoLTAuNWYsICAwLjVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIHZvaWQgbWFpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NbZ2xfVmVydGV4SW5kZXggJSAzXSwgMC4wZiwgMS4wZik7CisgICAgICAgICAgICBmcmFnQ29sb3IgPSB2ZWM0KDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpOworICAgICAgICB9KSI7CisKKyAgICBjb25zdCBjaGFyIGZzX3NyY1tdID0gUiIoCisgICAgICAgICN2ZXJzaW9uIDQ1MAorICAgICAgICAjZXh0ZW5zaW9uIEdMX05WX3NhbXBsZV9tYXNrX292ZXJyaWRlX2NvdmVyYWdlIDogcmVxdWlyZQorCisgICAgICAgIGxheW91dChsb2NhdGlvbiA9IDApIGluICB2ZWM0IGZyYWdDb2xvcjsKKyAgICAgICAgbGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IHZlYzQgb3V0Q29sb3I7CisKKyAgICAgICAgbGF5b3V0KG92ZXJyaWRlX2NvdmVyYWdlKSBvdXQgaW50IGdsX1NhbXBsZU1hc2tbXTsKKworICAgICAgICB2b2lkIG1haW4oKQorICAgICAgICB7CisgICAgICAgICAgICBnbF9TYW1wbGVNYXNrWzBdID0gMHhmZjsKKyAgICAgICAgICAgIG91dENvbG9yID0gZnJhZ0NvbG9yOworICAgICAgICB9KSI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgY29uc3QgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZUNvdW50ID0gVktfU0FNUExFX0NPVU5UXzhfQklUOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gY0F0dGFjaG1lbnQgPSB7fTsKKyAgICBjQXR0YWNobWVudC5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgY0F0dGFjaG1lbnQuc2FtcGxlcyA9IHNhbXBsZUNvdW50OworICAgIGNBdHRhY2htZW50LmxvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9DTEVBUjsKKyAgICBjQXR0YWNobWVudC5zdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRTsKKyAgICBjQXR0YWNobWVudC5zdGVuY2lsTG9hZE9wID0gVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRTsKKyAgICBjQXR0YWNobWVudC5zdGVuY2lsU3RvcmVPcCA9IFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFOworICAgIGNBdHRhY2htZW50LmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworICAgIGNBdHRhY2htZW50LmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBjQXR0YWNoUmVmID0ge307CisgICAgY0F0dGFjaFJlZi5hdHRhY2htZW50ID0gMDsKKyAgICBjQXR0YWNoUmVmLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw7CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0ge307CisgICAgc3VicGFzcy5waXBlbGluZUJpbmRQb2ludCA9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M7CisgICAgc3VicGFzcy5jb2xvckF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50cyA9ICZjQXR0YWNoUmVmOworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPfTsKKyAgICBycGNpLmF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgcnBjaS5wQXR0YWNobWVudHMgPSAmY0F0dGFjaG1lbnQ7CisgICAgcnBjaS5zdWJwYXNzQ291bnQgPSAxOworICAgIHJwY2kucFN1YnBhc3NlcyA9ICZzdWJwYXNzOworCisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIG51bGxwdHIsICZycCk7CisKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0T2JqIHBsKG1fZGV2aWNlKTsKKworICAgIFZrU2FtcGxlTWFzayBzYW1wbGVNYXNrID0gMHgwMTsKKyAgICBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gbXNhYSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GT307CisgICAgbXNhYS5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IHNhbXBsZUNvdW50OworICAgIG1zYWEuc2FtcGxlU2hhZGluZ0VuYWJsZSA9IFZLX0ZBTFNFOworICAgIG1zYWEucFNhbXBsZU1hc2sgPSAmc2FtcGxlTWFzazsKKworICAgIFZrUGlwZWxpbmVPYmogcGlwZShtX2RldmljZSk7CisgICAgcGlwZS5BZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KCk7CisgICAgcGlwZS5TZXRNU0FBKCZtc2FhKTsKKworICAgIFZrU2hhZGVyT2JqIHZzKG1fZGV2aWNlLCB2c19zcmMsIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULCB0aGlzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmdnMpOworCisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzX3NyYywgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKworICAgIC8vIENyZWF0ZSBwaXBlbGluZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHVzYWdlIG9mIE5WX3NhbXBsZV9tYXNrX292ZXJyaWRlX2NvdmVyYWdlCisgICAgLy8gaW4gdGhlIGZyYWdtZW50IHNoYWRlciBkb2VzIG5vdCBjYXVzZSBhbnkgZXJyb3JzLgorICAgIHBpcGUuQ3JlYXRlVktQaXBlbGluZShwbC5oYW5kbGUoKSwgcnApOworCisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworCisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBUZXN0UmFzdGVyaXphdGlvbkRpc2NhcmRFbmFibGVUcnVlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiRW5zdXJlIGl0IGRvZXNuJ3QgY3Jhc2ggYW5kIHRyaWdnZXIgZXJyb3IgbXNnIHdoZW4gcmFzdGVyaXplckRpc2NhcmRFbmFibGUgPSB0cnVlIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0WzFdID0ge3t9fTsKKyAgICBhdHRbMF0uZm9ybWF0ID0gVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgIGF0dFswXS5zYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzRfQklUOworICAgIGF0dFswXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBhdHRbMF0uZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBjciA9IHswLCBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfTsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzcCA9IHt9OworICAgIHNwLnBpcGVsaW5lQmluZFBvaW50ID0gVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzsKKyAgICBzcC5jb2xvckF0dGFjaG1lbnRDb3VudCA9IDE7CisgICAgc3AucENvbG9yQXR0YWNobWVudHMgPSAmY3I7CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGkgPSB7VktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk99OworICAgIHJwaS5hdHRhY2htZW50Q291bnQgPSAxOworICAgIHJwaS5wQXR0YWNobWVudHMgPSBhdHQ7CisgICAgcnBpLnN1YnBhc3NDb3VudCA9IDE7CisgICAgcnBpLnBTdWJwYXNzZXMgPSAmc3A7CisgICAgVmtSZW5kZXJQYXNzIHJwOworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwaSwgbnVsbHB0ciwgJnJwKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLmdwX2NpXy5wVmlld3BvcnRTdGF0ZSA9IG51bGxwdHI7CisgICAgcGlwZS5ncF9jaV8ucE11bHRpc2FtcGxlU3RhdGUgPSBudWxscHRyOworICAgIHBpcGUuZ3BfY2lfLnBEZXB0aFN0ZW5jaWxTdGF0ZSA9IG51bGxwdHI7CisgICAgcGlwZS5ncF9jaV8ucENvbG9yQmxlbmRTdGF0ZSA9IG51bGxwdHI7CisgICAgcGlwZS5ncF9jaV8ucmVuZGVyUGFzcyA9IHJwOworCisgICAgbV9lcnJvck1vbml0b3ItPkV4cGVjdFN1Y2Nlc3MoKTsKKyAgICAvLyBTa2lwIHRoZSB0ZXN0IGluIE5leHVzUGxheWVyLiBUaGUgZHJpdmVyIGNyYXNoZXMgd2hlbiBwVmlld3BvcnRTdGF0ZSwgcE11bHRpc2FtcGxlU3RhdGUsIHBEZXB0aFN0ZW5jaWxTdGF0ZSwgcENvbG9yQmxlbmRTdGF0ZQorICAgIC8vIGFyZSBOVUxMLgorICAgIHBpcGUucnNfc3RhdGVfY2lfLnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID0gVktfVFJVRTsKKyAgICBwaXBlLkluaXRTdGF0ZSgpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFRlc3RTYW1wbGVyRGF0YUZvckNvbWJpbmVkSW1hZ2VTYW1wbGVyKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiU2hhZGVyIGNvZGUgdXNlcyBzYW1wbGVyIGRhdGEgZm9yIENvbWJpbmVkSW1hZ2VTYW1wbGVyIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0UmVuZGVyVGFyZ2V0KCkpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZnNTb3VyY2UgPSBSIigKKyAgICAgICAgICAgICAgICAgICBPcENhcGFiaWxpdHkgU2hhZGVyCisgICAgICAgICAgICAgICAgICAgT3BNZW1vcnlNb2RlbCBMb2dpY2FsIEdMU0w0NTAKKyAgICAgICAgICAgICAgICAgICBPcEVudHJ5UG9pbnQgRnJhZ21lbnQgJW1haW4gIm1haW4iCisgICAgICAgICAgICAgICAgICAgT3BFeGVjdXRpb25Nb2RlICVtYWluIE9yaWdpblVwcGVyTGVmdAorCisgICAgICAgICAgICAgICAgICAgT3BEZWNvcmF0ZSAlSW5wdXREYXRhIERlc2NyaXB0b3JTZXQgMAorICAgICAgICAgICAgICAgICAgIE9wRGVjb3JhdGUgJUlucHV0RGF0YSBCaW5kaW5nIDAKKyAgICAgICAgICAgICAgICAgICBPcERlY29yYXRlICVTYW1wbGVyRGF0YSBEZXNjcmlwdG9yU2V0IDAKKyAgICAgICAgICAgICAgICAgICBPcERlY29yYXRlICVTYW1wbGVyRGF0YSBCaW5kaW5nIDAKKworICAgICAgICAgICAgICAgJXZvaWQgPSBPcFR5cGVWb2lkCisgICAgICAgICAgICAgICAgJWYzMiA9IE9wVHlwZUZsb2F0IDMyCisgICAgICAgICAgICAgICVJbWFnZSA9IE9wVHlwZUltYWdlICVmMzIgMkQgMCAwIDAgMSBSZ2JhMzJmCisgICAgICAgICAgICVJbWFnZVB0ciA9IE9wVHlwZVBvaW50ZXIgVW5pZm9ybUNvbnN0YW50ICVJbWFnZQorICAgICAgICAgICVJbnB1dERhdGEgPSBPcFZhcmlhYmxlICVJbWFnZVB0ciBVbmlmb3JtQ29uc3RhbnQKKyAgICAgICAgICAgICVTYW1wbGVyID0gT3BUeXBlU2FtcGxlcgorICAgICAgICAgJVNhbXBsZXJQdHIgPSBPcFR5cGVQb2ludGVyIFVuaWZvcm1Db25zdGFudCAlU2FtcGxlcgorICAgICAgICAlU2FtcGxlckRhdGEgPSBPcFZhcmlhYmxlICVTYW1wbGVyUHRyIFVuaWZvcm1Db25zdGFudAorICAgICAgICVTYW1wbGVkSW1hZ2UgPSBPcFR5cGVTYW1wbGVkSW1hZ2UgJUltYWdlCisKKyAgICAgICAgICAgICAgICVmdW5jID0gT3BUeXBlRnVuY3Rpb24gJXZvaWQKKyAgICAgICAgICAgICAgICVtYWluID0gT3BGdW5jdGlvbiAldm9pZCBOb25lICVmdW5jCisgICAgICAgICAgICAgICAgICU0MCA9IE9wTGFiZWwKKyAgICAgICAgICAgJWNhbGxfc21wID0gT3BMb2FkICVTYW1wbGVyICVTYW1wbGVyRGF0YQorICAgICAgICAgICAgICAgICAgIE9wUmV0dXJuCisgICAgICAgICAgICAgICAgICAgT3BGdW5jdGlvbkVuZCkiOworCisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzU291cmNlLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCB0aGlzKTsKKworICAgIENyZWF0ZVBpcGVsaW5lSGVscGVyIHBpcGUoKnRoaXMpOworICAgIHBpcGUuSW5pdEluZm8oKTsKKyAgICBwaXBlLmRzbF9iaW5kaW5nc18gPSB7CisgICAgICAgIHswLCBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgMSwgVktfU0hBREVSX1NUQUdFX0FMTCwgbnVsbHB0cn0sCisgICAgfTsKKyAgICBwaXBlLnNoYWRlcl9zdGFnZXNfID0ge2ZzLkdldFN0YWdlQ3JlYXRlSW5mbygpLCBwaXBlLnZzXy0+R2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisgICAgcGlwZS5DcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCwgVktfSU1BR0VfVElMSU5HX09QVElNQUwsIDApOworICAgIFZrSW1hZ2VWaWV3IHZpZXcgPSBpbWFnZS50YXJnZXRWaWV3KFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSk7CisKKyAgICBWa1NhbXBsZXJDcmVhdGVJbmZvIHNhbXBsZXJfY2kgPSBTYWZlU2FuZVNhbXBsZXJDcmVhdGVJbmZvKCk7CisgICAgVmtTYW1wbGVyIHNhbXBsZXI7CisgICAgdms6OkNyZWF0ZVNhbXBsZXIobV9kZXZpY2UtPmRldmljZSgpLCAmc2FtcGxlcl9jaSwgbnVsbHB0ciwgJnNhbXBsZXIpOworCisgICAgdWludDMyX3QgcWZpID0gMDsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyX2NyZWF0ZV9pbmZvID0ge307CisgICAgYnVmZmVyX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX0NSRUFURV9JTkZPOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5zaXplID0gMTAyNDsKKyAgICBidWZmZXJfY3JlYXRlX2luZm8udXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklUOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAxOworICAgIGJ1ZmZlcl9jcmVhdGVfaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnFmaTsKKworICAgIFZrQnVmZmVyT2JqIGJ1ZmZlcjsKKyAgICBidWZmZXIuaW5pdCgqbV9kZXZpY2UsIGJ1ZmZlcl9jcmVhdGVfaW5mbyk7CisKKyAgICBwaXBlLmRlc2NyaXB0b3Jfc2V0Xy0+V3JpdGVEZXNjcmlwdG9ySW1hZ2VJbmZvKDAsIHZpZXcsIHNhbXBsZXIsIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSKTsKKyAgICBwaXBlLmRlc2NyaXB0b3Jfc2V0Xy0+VXBkYXRlRGVzY3JpcHRvclNldHMoKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPkJlZ2luUmVuZGVyUGFzcyhtX3JlbmRlclBhc3NCZWdpbkluZm8pOworICAgIHZrOjpDbWRCaW5kUGlwZWxpbmUobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV8pOworICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgcGlwZS5waXBlbGluZV9sYXlvdXRfLmhhbmRsZSgpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGUuZGVzY3JpcHRvcl9zZXRfLT5zZXRfLCAwLCBOVUxMKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisgICAgdms6OkNtZERyYXcobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgMywgMSwgMCwgMCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIHZrOjpEZXN0cm95U2FtcGxlcihtX2RldmljZS0+ZGV2aWNlKCksIHNhbXBsZXIsIE5VTEwpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgTm90UG9pbnRTaXplR2VvbWV0cnlTaGFkZXJTdWNjZXNzKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiQ3JlYXRlIGEgcGlwZWxpbmUgdXNpbmcgVE9QT0xPR1lfUE9JTlRfTElTVCwgYnV0IGdlb21ldHJ5IHNoYWRlciBkb2Vzbid0IGluY2x1ZGUgUG9pbnRTaXplLiIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdCgpKTsKKworICAgIGlmICgoIW1fZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpLmdlb21ldHJ5U2hhZGVyKSkgeworICAgICAgICBwcmludGYoIiVzIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1aXJlZCBnZW9tZXRyeSBzaGFkZXIgZmVhdHVyZXM7IHNraXBwZWQuXG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFJlbmRlclRhcmdldCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Vmlld3BvcnQoKSk7CisKKyAgICBWa1NoYWRlck9iaiBncyhtX2RldmljZSwgYmluZFN0YXRlR2VvbVNoYWRlclRleHQsIFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQsIHRoaXMpOworCisgICAgQ3JlYXRlUGlwZWxpbmVIZWxwZXIgcGlwZSgqdGhpcyk7CisgICAgcGlwZS5Jbml0SW5mbygpOworICAgIHBpcGUuc2hhZGVyX3N0YWdlc18gPSB7cGlwZS52c18tPkdldFN0YWdlQ3JlYXRlSW5mbygpLCBncy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgcGlwZS5mc18tPkdldFN0YWdlQ3JlYXRlSW5mbygpfTsKKyAgICBwaXBlLmlhX2NpXy50b3BvbG9neSA9IFZLX1BSSU1JVElWRV9UT1BPTE9HWV9QT0lOVF9MSVNUOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHBpcGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpOworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgU3VicGFzc1dpdGhSZWFkT25seUxheW91dFdpdGhvdXREZXBlbmRlbmN5KSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiV2hlbiBib3RoIHN1YnBhc3NlcycgYXR0YWNobWVudHMgYXJlIHRoZSBzYW1lIGFuZCBsYXlvdXRzIGFyZSByZWFkLW9ubHksIHRoZXkgZG9uJ3QgbmVlZCBkZXBlbmRlbmN5LiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICBhdXRvIGRlcHRoX2Zvcm1hdCA9IEZpbmRTdXBwb3J0ZWREZXB0aFN0ZW5jaWxGb3JtYXQoZ3B1KCkpOworICAgIGlmICghZGVwdGhfZm9ybWF0KSB7CisgICAgICAgIHByaW50ZigiJXMgTm8gRGVwdGggKyBTdGVuY2lsIGZvcm1hdCBmb3VuZC4gU2tpcHBlZC5cbiIsIGtTa2lwUHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEEgcmVuZGVycGFzcyB3aXRoIG9uZSBjb2xvciBhdHRhY2htZW50LgorICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnQgPSB7MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMfTsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IDI7CisgICAgc3RkOjphcnJheTxWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiwgc2l6ZT4gYXR0YWNobWVudHMgPSB7YXR0YWNobWVudCwgYXR0YWNobWVudH07CisKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgYXR0X3JlZl9kZXB0aF9zdGVuY2lsID0gezAsIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMfTsKKworICAgIHN0ZDo6YXJyYXk8VmtTdWJwYXNzRGVzY3JpcHRpb24sIHNpemU+IHN1YnBhc3NlczsKKyAgICBzdWJwYXNzZXNbMF0gPSB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMCwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgJmF0dF9yZWZfZGVwdGhfc3RlbmNpbCwgMCwgbnVsbHB0cn07CisgICAgc3VicGFzc2VzWzFdID0gezAsIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIDAsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsICZhdHRfcmVmX2RlcHRoX3N0ZW5jaWwsIDAsIG51bGxwdHJ9OworCisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgc2l6ZSwgYXR0YWNobWVudHMuZGF0YSgpLCBzaXplLCBzdWJwYXNzZXMuZGF0YSgpLCAwLCBudWxscHRyfTsKKworICAgIFZrUmVuZGVyUGFzcyBycDsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnApOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICAvLyBBIGNvbXBhdGlibGUgZnJhbWVidWZmZXIuCisgICAgVmtJbWFnZU9iaiBpbWFnZShtX2RldmljZSk7CisgICAgaW1hZ2UuSW5pdCgzMiwgMzIsIDEsIGRlcHRoX2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCwgVktfSU1BR0VfVElMSU5HX0xJTkVBUiwgMCk7CisgICAgQVNTRVJUX1RSVUUoaW1hZ2UuaW5pdGlhbGl6ZWQoKSk7CisKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9WSUVXX1RZUEVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSwgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1ZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQsIDAsIDEsIDAsIDF9fTsKKworICAgIFZrSW1hZ2VWaWV3IHZpZXc7CisgICAgZXJyID0gdms6OkNyZWF0ZUltYWdlVmlldyhtX2RldmljZS0+ZGV2aWNlKCksICZpdmNpLCBudWxscHRyLCAmdmlldyk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBzdGQ6OmFycmF5PFZrSW1hZ2VWaWV3LCBzaXplPiB2aWV3cyA9IHt2aWV3LCB2aWV3fTsKKworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvIGZjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIHNpemUsIHZpZXdzLmRhdGEoKSwgMzIsIDMyLCAxfTsKKyAgICBWa0ZyYW1lYnVmZmVyIGZiOworICAgIGVyciA9IHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksICZmY2ksIG51bGxwdHIsICZmYik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKworICAgIFZrUmVuZGVyUGFzc0JlZ2luSW5mbyBycGJpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sIG51bGxwdHIsIHJwLCBmYiwge3swLCAwfSwgezMyLCAzMn19LCAwLCBudWxscHRyfTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcnBiaSwgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworICAgIHZrOjpDbWROZXh0U3VicGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgdms6OkNtZEVuZFJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgbV9jb21tYW5kQnVmZmVyLT5lbmQoKTsKKworICAgIHZrOjpEZXN0cm95RnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCBmYiwgbnVsbHB0cik7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAsIG51bGxwdHIpOworICAgIHZrOjpEZXN0cm95SW1hZ2VWaWV3KG1fZGV2aWNlLT5kZXZpY2UoKSwgdmlldywgbnVsbHB0cik7Cit9CisKK1RFU1RfRihWa1Bvc2l0aXZlTGF5ZXJUZXN0LCBHZW9tZXRyeVNoYWRlclBhc3N0aHJvdWdoTlYpIHsKKyAgICBURVNUX0RFU0NSSVBUSU9OKCJUZXN0IHRvIHZhbGlkYXRlIFZLX05WX2dlb21ldHJ5X3NoYWRlcl9wYXNzdGhyb3VnaCIpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdEZyYW1ld29yayhteURiZ0Z1bmMsIG1fZXJyb3JNb25pdG9yKSk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgYXZhaWxhYmxlX2ZlYXR1cmVzID0ge307CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcygmYXZhaWxhYmxlX2ZlYXR1cmVzKSk7CisKKyAgICBpZiAoIWF2YWlsYWJsZV9mZWF0dXJlcy5nZW9tZXRyeVNoYWRlcikgeworICAgICAgICBwcmludGYoIiVzIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczo6Z2VvbWV0cnlTaGFkZXIgaXMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChncHUoKSwgbnVsbHB0ciwgVktfTlZfR0VPTUVUUllfU0hBREVSX1BBU1NUSFJPVUdIX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBtX2RldmljZV9leHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKFZLX05WX0dFT01FVFJZX1NIQURFUl9QQVNTVEhST1VHSF9FWFRFTlNJT05fTkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyAlcyBFeHRlbnNpb24gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcgdGVzdHNcbiIsIGtTa2lwUHJlZml4LCBWS19OVl9HRU9NRVRSWV9TSEFERVJfUEFTU1RIUk9VR0hfRVhURU5TSU9OX05BTUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdFN0YXRlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjb25zdCBjaGFyIHZzX3NyY1tdID0gUiIoCisgICAgICAgICN2ZXJzaW9uIDQ1MAorCisgICAgICAgIG91dCBnbF9QZXJWZXJ0ZXggeworICAgICAgICAgICAgdmVjNCBnbF9Qb3NpdGlvbjsKKyAgICAgICAgfTsKKworICAgICAgICBsYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgQ29sb3JCbG9jayB7dmVjNCB2ZXJ0ZXhDb2xvcjt9OworCisgICAgICAgIGNvbnN0IHZlYzIgcG9zaXRpb25zWzNdID0geyB2ZWMyKCAwLjBmLCAtMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCAwLjVmLCAgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKC0wLjVmLCAgMC41ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgIGNvbnN0IHZlYzQgY29sb3JzWzNdID0geyB2ZWM0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNCgwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICB2b2lkIG1haW4oKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJ0ZXhDb2xvciA9IGNvbG9yc1tnbF9WZXJ0ZXhJbmRleCAlIDNdOworICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uc1tnbF9WZXJ0ZXhJbmRleCAlIDNdLCAwLjAsIDEuMCk7CisgICAgICAgIH0pIjsKKworICAgIGNvbnN0IGNoYXIgZ3Nfc3JjW10gPSBSIigKKyAgICAgICAgI3ZlcnNpb24gNDUwCisgICAgICAgICNleHRlbnNpb24gR0xfTlZfZ2VvbWV0cnlfc2hhZGVyX3Bhc3N0aHJvdWdoOiByZXF1aXJlCisKKyAgICAgICAgbGF5b3V0KHRyaWFuZ2xlcykgaW47CisgICAgICAgIGxheW91dCh0cmlhbmdsZV9zdHJpcCwgbWF4X3ZlcnRpY2VzID0gMykgb3V0OworCisgICAgICAgIGxheW91dChwYXNzdGhyb3VnaCkgaW4gZ2xfUGVyVmVydGV4IHt2ZWM0IGdsX1Bvc2l0aW9uO307CisgICAgICAgIGxheW91dChsb2NhdGlvbiA9IDAsIHBhc3N0aHJvdWdoKSBpbiBDb2xvckJsb2NrIHt2ZWM0IHZlcnRleENvbG9yO307CisKKyAgICAgICAgdm9pZCBtYWluKCkKKyAgICAgICAgeworICAgICAgICAgICBnbF9MYXllciA9IDA7CisgICAgICAgIH0pIjsKKworICAgIGNvbnN0IGNoYXIgZnNfc3JjW10gPSBSIigKKyAgICAgICAgI3ZlcnNpb24gNDUwCisKKyAgICAgICAgbGF5b3V0KGxvY2F0aW9uID0gMCkgaW4gQ29sb3JCbG9jayB7dmVjNCB2ZXJ0ZXhDb2xvcjt9OworICAgICAgICBsYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCBvdXRDb2xvcjsKKworICAgICAgICB2b2lkIG1haW4oKSB7CisgICAgICAgICAgICBvdXRDb2xvciA9IHZlcnRleENvbG9yOworICAgICAgICB9KSI7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dE9iaiBwbChtX2RldmljZSk7CisKKyAgICBWa1BpcGVsaW5lT2JqIHBpcGUobV9kZXZpY2UpOworICAgIHBpcGUuQWRkRGVmYXVsdENvbG9yQXR0YWNobWVudCgpOworCisgICAgVmtTaGFkZXJPYmogdnMobV9kZXZpY2UsIHZzX3NyYywgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIHBpcGUuQWRkU2hhZGVyKCZ2cyk7CisKKyAgICBWa1NoYWRlck9iaiBncyhtX2RldmljZSwgZ3Nfc3JjLCBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklULCB0aGlzKTsKKyAgICBwaXBlLkFkZFNoYWRlcigmZ3MpOworCisgICAgVmtTaGFkZXJPYmogZnMobV9kZXZpY2UsIGZzX3NyYywgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisgICAgcGlwZS5BZGRTaGFkZXIoJmZzKTsKKworICAgIC8vIENyZWF0ZSBwaXBlbGluZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHVzYWdlIG9mIE5WX2dlb21ldHJ5X3NoYWRlcl9wYXNzdGhyb3VnaAorICAgIC8vIGluIHRoZSBmcmFnbWVudCBzaGFkZXIgZG9lcyBub3QgY2F1c2UgYW55IGVycm9ycy4KKyAgICBwaXBlLkNyZWF0ZVZLUGlwZWxpbmUocGwuaGFuZGxlKCksIHJlbmRlclBhc3MoKSk7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+VmVyaWZ5Tm90Rm91bmQoKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFN3YXBjaGFpbkltYWdlTGF5b3V0KSB7CisgICAgaWYgKCFBZGRTdXJmYWNlSW5zdGFuY2VFeHRlbnNpb24oKSkgeworICAgICAgICBwcmludGYoIiVzIHN1cmZhY2UgZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyBDbWRDb3B5U3dhcGNoYWluSW1hZ2UgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRGcmFtZXdvcmsobXlEYmdGdW5jLCBtX2Vycm9yTW9uaXRvcikpOworICAgIGlmICghQWRkU3dhcGNoYWluRGV2aWNlRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyBzd2FwY2hhaW4gZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyBDbWRDb3B5U3dhcGNoYWluSW1hZ2UgdGVzdFxuIiwga1NraXBQcmVmaXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRTdGF0ZSgpKTsKKyAgICBpZiAoIUluaXRTd2FwY2hhaW4oKSkgeworICAgICAgICBwcmludGYoIiVzIENhbm5vdCBjcmVhdGUgc3VyZmFjZSBvciBzd2FwY2hhaW4sIHNraXBwaW5nIENtZENvcHlTd2FwY2hhaW5JbWFnZSB0ZXN0XG4iLCBrU2tpcFByZWZpeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDMyX3QgaW1hZ2VfaW5kZXggPSAwLCBpbWFnZV9jb3VudDsKKyAgICBQRk5fdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIgZnBHZXRTd2FwY2hhaW5JbWFnZXNLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKXZrOjpHZXREZXZpY2VQcm9jQWRkcihtX2RldmljZS0+aGFuZGxlKCksICJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIpOworICAgIGZwR2V0U3dhcGNoYWluSW1hZ2VzS0hSKG1fZGV2aWNlLT5oYW5kbGUoKSwgbV9zd2FwY2hhaW4sICZpbWFnZV9jb3VudCwgTlVMTCk7CisgICAgVmtJbWFnZSAqc3dhcGNoYWluSW1hZ2VzID0gKFZrSW1hZ2UgKiltYWxsb2MoaW1hZ2VfY291bnQgKiBzaXplb2YoVmtJbWFnZSkpOworICAgIGZwR2V0U3dhcGNoYWluSW1hZ2VzS0hSKG1fZGV2aWNlLT5oYW5kbGUoKSwgbV9zd2FwY2hhaW4sICZpbWFnZV9jb3VudCwgc3dhcGNoYWluSW1hZ2VzKTsKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmZW5jZWNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPLCBudWxscHRyLCAwfTsKKyAgICBWa0ZlbmNlIGZlbmNlOworICAgIFZrUmVzdWx0IHJldCA9IHZrOjpDcmVhdGVGZW5jZShtX2RldmljZS0+ZGV2aWNlKCksICZmZW5jZWNpLCBudWxscHRyLCAmZmVuY2UpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHJldCk7CisgICAgUEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUiBmcEFjcXVpcmVOZXh0SW1hZ2VLSFIgPQorICAgICAgICAoUEZOX3ZrQWNxdWlyZU5leHRJbWFnZUtIUil2azo6R2V0RGV2aWNlUHJvY0FkZHIobV9kZXZpY2UtPmhhbmRsZSgpLCAidmtBY3F1aXJlTmV4dEltYWdlS0hSIik7CisgICAgcmV0ID0gZnBBY3F1aXJlTmV4dEltYWdlS0hSKG1fZGV2aWNlLT5oYW5kbGUoKSwgbV9zd2FwY2hhaW4sIFVJTlQ2NF9NQVgsIFZLX05VTExfSEFORExFLCBmZW5jZSwgJmltYWdlX2luZGV4KTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhyZXQpOworICAgIFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaFtdID0geworICAgICAgICB7MCwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19TQU1QTEVfQ09VTlRfMV9CSVQsIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLAorICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRSwgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfSwKKyAgICB9OworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRfcmVmID0gezAsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9OworCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHswLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCAwLCBudWxscHRyLCAxLCAmYXR0X3JlZiwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0cn07CisgICAgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBycGNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAxLCBhdHRhY2gsIDEsICZzdWJwYXNzLCAwLCBudWxscHRyfTsKKyAgICBWa1JlbmRlclBhc3MgcnAxLCBycDI7CisKKyAgICByZXQgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnAxKTsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhyZXQpOworICAgIGF0dGFjaFswXS5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICByZXQgPSB2azo6Q3JlYXRlUmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksICZycGNpLCBudWxscHRyLCAmcnAyKTsKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaXZjaSA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTywKKyAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgMCwKKyAgICAgICAgc3dhcGNoYWluSW1hZ2VzW2ltYWdlX2luZGV4XSwKKyAgICAgICAgVktfSU1BR0VfVklFV19UWVBFXzJELAorICAgICAgICBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sCisgICAgICAgIHtWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSwgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFl9LAorICAgICAgICB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMX0sCisgICAgfTsKKyAgICBWa0ltYWdlVmlldyB2aWV3OworICAgIHJldCA9IHZrOjpDcmVhdGVJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCAmaXZjaSwgbnVsbHB0ciwgJnZpZXcpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKHJldCk7CisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmNpID0ge1ZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCBycDEsIDEsICZ2aWV3LCAzMiwgMzIsIDF9OworICAgIFZrRnJhbWVidWZmZXIgZmIxLCBmYjI7CisgICAgcmV0ID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZjaSwgbnVsbHB0ciwgJmZiMSk7CisgICAgZmNpLnJlbmRlclBhc3MgPSBycDI7CisgICAgcmV0ID0gdms6OkNyZWF0ZUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgJmZjaSwgbnVsbHB0ciwgJmZiMik7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MocmV0KTsKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gcnBiaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLCBudWxscHRyLCBycDEsIGZiMSwge3swLCAwfSwgezMyLCAzMn19LCAwLCBudWxscHRyfTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmJlZ2luKCk7CisgICAgdms6OkNtZEJlZ2luUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpLCAmcnBiaSwgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworICAgIHZrOjpDbWRFbmRSZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCkpOworICAgIHJwYmkuZnJhbWVidWZmZXIgPSBmYjI7CisgICAgcnBiaS5yZW5kZXJQYXNzID0gcnAyOworICAgIHZrOjpDbWRCZWdpblJlbmRlclBhc3MobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgJnJwYmksIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKworICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGltZ19iYXJyaWVyID0ge307CisgICAgaW1nX2JhcnJpZXIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUjsKKyAgICBpbWdfYmFycmllci5zcmNBY2Nlc3NNYXNrID0gMDsKKyAgICBpbWdfYmFycmllci5kc3RBY2Nlc3NNYXNrID0gMDsKKyAgICBpbWdfYmFycmllci5vbGRMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIGltZ19iYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFI7CisgICAgaW1nX2JhcnJpZXIuaW1hZ2UgPSBzd2FwY2hhaW5JbWFnZXNbaW1hZ2VfaW5kZXhdOworICAgIGltZ19iYXJyaWVyLnNyY1F1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRDsKKyAgICBpbWdfYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW1nX2JhcnJpZXIuc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gMTsKKyAgICBpbWdfYmFycmllci5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSAxOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklULCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCAxLCAmaW1nX2JhcnJpZXIpOworICAgIG1fY29tbWFuZEJ1ZmZlci0+ZW5kKCk7CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdF9pbmZvOworICAgIHN1Ym1pdF9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU1VCTUlUX0lORk87CisgICAgc3VibWl0X2luZm8ucE5leHQgPSBOVUxMOworICAgIHN1Ym1pdF9pbmZvLndhaXRTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgc3VibWl0X2luZm8ucFdhaXRTZW1hcGhvcmVzID0gTlVMTDsKKyAgICBzdWJtaXRfaW5mby5wV2FpdERzdFN0YWdlTWFzayA9IE5VTEw7CisgICAgc3VibWl0X2luZm8uY29tbWFuZEJ1ZmZlckNvdW50ID0gMTsKKyAgICBzdWJtaXRfaW5mby5wQ29tbWFuZEJ1ZmZlcnMgPSAmbV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKTsKKyAgICBzdWJtaXRfaW5mby5zaWduYWxTZW1hcGhvcmVDb3VudCA9IDA7CisgICAgc3VibWl0X2luZm8ucFNpZ25hbFNlbWFwaG9yZXMgPSBOVUxMOworICAgIHZrOjpXYWl0Rm9yRmVuY2VzKG1fZGV2aWNlLT5kZXZpY2UoKSwgMSwgJmZlbmNlLCBWS19UUlVFLCBVSU5UNjRfTUFYKTsKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpRdWV1ZVN1Ym1pdChtX2RldmljZS0+bV9xdWV1ZSwgMSwgJnN1Ym1pdF9pbmZvLCBWS19OVUxMX0hBTkRMRSk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBmcmVlKHN3YXBjaGFpbkltYWdlcyk7CisgICAgdms6OkRlc3Ryb3lGcmFtZWJ1ZmZlcihtX2RldmljZS0+ZGV2aWNlKCksIGZiMSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgcnAxLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIyLCBOVUxMKTsKKyAgICB2azo6RGVzdHJveVJlbmRlclBhc3MobV9kZXZpY2UtPmRldmljZSgpLCBycDIsIE5VTEwpOworICAgIHZrOjpEZXN0cm95RmVuY2UobV9kZXZpY2UtPmRldmljZSgpLCBmZW5jZSwgTlVMTCk7CisgICAgdms6OkRlc3Ryb3lJbWFnZVZpZXcobV9kZXZpY2UtPmRldmljZSgpLCB2aWV3LCBOVUxMKTsKK30KKworVEVTVF9GKFZrUG9zaXRpdmVMYXllclRlc3QsIFBpcGVsaW5lU3RhZ2VDb25kaXRpb25hbFJlbmRlcmluZykgeworICAgIFRFU1RfREVTQ1JJUFRJT04oIkNyZWF0ZSByZW5kZXJwYXNzIGFuZCBDbWRQaXBlbGluZUJhcnJpZXIgd2l0aCBWS19QSVBFTElORV9TVEFHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXQoKSk7CisKKyAgICAvLyBBIHJlbmRlcnBhc3Mgd2l0aCBhIHNpbmdsZSBzdWJwYXNzIHRoYXQgZGVjbGFyZWQgYSBzZWxmLWRlcGVuZGVuY3kKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2hbXSA9IHsKKyAgICAgICAgezAsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSwgVktfU0FNUExFX0NPVU5UXzFfQklULCBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLCBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgIFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9ET05UX0NBUkUsIFZLX0FUVEFDSE1FTlRfU1RPUkVfT1BfRE9OVF9DQVJFLCBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELAorICAgICAgICAgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTH0sCisgICAgfTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgcmVmID0gezAsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUx9OworICAgIFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3Nlc1tdID0geworICAgICAgICB7MCwgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUywgMCwgbnVsbHB0ciwgMSwgJnJlZiwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbnVsbHB0cn0sCisgICAgfTsKKworICAgIFZrU3VicGFzc0RlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9WRVJURVhfU0hBREVSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfQ09ORElUSU9OQUxfUkVOREVSSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfQ09ORElUSU9OQUxfUkVOREVSSU5HX1JFQURfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZrRGVwZW5kZW5jeUZsYWdzKTB9OworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgMSwgYXR0YWNoLCAxLCBzdWJwYXNzZXMsIDEsICZkZXBlbmRlbmN5fTsKKyAgICBWa1JlbmRlclBhc3MgcnA7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpDcmVhdGVSZW5kZXJQYXNzKG1fZGV2aWNlLT5kZXZpY2UoKSwgJnJwY2ksIG51bGxwdHIsICZycCk7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICBWa0ltYWdlT2JqIGltYWdlKG1fZGV2aWNlKTsKKyAgICBpbWFnZS5Jbml0KDMyLCAzMiwgMSwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCk7CisgICAgVmtJbWFnZVZpZXcgaW1hZ2VWaWV3ID0gaW1hZ2UudGFyZ2V0VmlldyhWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0pOworCisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmJjaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTywgbnVsbHB0ciwgMCwgcnAsIDEsICZpbWFnZVZpZXcsIDMyLCAzMiwgMX07CisgICAgVmtGcmFtZWJ1ZmZlciBmYjsKKyAgICB2azo6Q3JlYXRlRnJhbWVidWZmZXIobV9kZXZpY2UtPmRldmljZSgpLCAmZmJjaSwgbnVsbHB0ciwgJmZiKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlci0+YmVnaW4oKTsKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gcnBiaSA9IHtWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MzIsIDMyfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyfTsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKG1fY29tbWFuZEJ1ZmZlci0+aGFuZGxlKCksICZycGJpLCBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisKKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWIgPSB7fTsKKyAgICBpbWIuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUjsKKyAgICBpbWIucE5leHQgPSBudWxscHRyOworICAgIGltYi5zcmNBY2Nlc3NNYXNrID0gVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQ7CisgICAgaW1iLmRzdEFjY2Vzc01hc2sgPSBWS19BQ0NFU1NfQ09ORElUSU9OQUxfUkVOREVSSU5HX1JFQURfQklUX0VYVDsKKyAgICBpbWIub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBpbWIubmV3TGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICBpbWIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgIGltYi5kc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgaW1iLmltYWdlID0gaW1hZ2UuaGFuZGxlKCk7CisgICAgaW1iLnN1YnJlc291cmNlUmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgaW1iLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICBpbWIuc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpbWIuc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgaW1iLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisKKyAgICBtX2Vycm9yTW9uaXRvci0+RXhwZWN0U3VjY2VzcygpOworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIobV9jb21tYW5kQnVmZmVyLT5oYW5kbGUoKSwgVktfUElQRUxJTkVfU1RBR0VfVkVSVEVYX1NIQURFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9DT05ESVRJT05BTF9SRU5ERVJJTkdfQklUX0VYVCwgMCwgMCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMSwgJmltYik7CisgICAgbV9lcnJvck1vbml0b3ItPlZlcmlmeU5vdEZvdW5kKCk7CisKKyAgICB2azo6Q21kRW5kUmVuZGVyUGFzcyhtX2NvbW1hbmRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICBtX2NvbW1hbmRCdWZmZXItPmVuZCgpOworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhtX2RldmljZS0+ZGV2aWNlKCksIHJwLCBudWxscHRyKTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKG1fZGV2aWNlLT5kZXZpY2UoKSwgZmIsIG51bGxwdHIpOworfQorCitURVNUX0YoVmtQb3NpdGl2ZUxheWVyVGVzdCwgQ3JlYXRlUGlwZWxpbmVPdmVybGFwcGluZ1B1c2hDb25zdGFudFJhbmdlKSB7CisgICAgVEVTVF9ERVNDUklQVElPTigiVGVzdCBvdmVybGFwcGluZyBwdXNoLWNvbnN0YW50IHJhbmdlcy4iKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5FeHBlY3RTdWNjZXNzKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRSZW5kZXJUYXJnZXQoKSk7CisKKyAgICBjaGFyIGNvbnN0ICpjb25zdCB2c1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KHB1c2hfY29uc3RhbnQsIHN0ZDQzMCkgdW5pZm9ybSBmb28geyBmbG9hdCB4WzhdOyB9IGNvbnN0YW50cztcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAiICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNvbnN0YW50cy54WzBdKTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICBjaGFyIGNvbnN0ICpjb25zdCBmc1NvdXJjZSA9CisgICAgICAgICIjdmVyc2lvbiA0NTBcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAibGF5b3V0KHB1c2hfY29uc3RhbnQsIHN0ZDQzMCkgdW5pZm9ybSBmb28geyBmbG9hdCB4WzRdOyB9IGNvbnN0YW50cztcbiIKKyAgICAgICAgInZvaWQgbWFpbigpe1xuIgorICAgICAgICAifVxuIjsKKworICAgIFZrU2hhZGVyT2JqIGNvbnN0IHZzKG1fZGV2aWNlLCB2c1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsIHRoaXMpOworICAgIFZrU2hhZGVyT2JqIGNvbnN0IGZzKG1fZGV2aWNlLCBmc1NvdXJjZSwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgdGhpcyk7CisKKyAgICBWa1B1c2hDb25zdGFudFJhbmdlIHB1c2hfY29uc3RhbnRfcmFuZ2VzWzJde3tWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgMCwgc2l6ZW9mKGZsb2F0KSAqIDh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1ZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIDAsIHNpemVvZihmbG9hdCkgKiA0fX07CisKKyAgICBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBjb25zdCBwaXBlbGluZV9sYXlvdXRfaW5mb3sKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTEFZT1VUX0NSRUFURV9JTkZPLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCAyLCBwdXNoX2NvbnN0YW50X3Jhbmdlc307CisKKyAgICBDcmVhdGVQaXBlbGluZUhlbHBlciBwaXBlKCp0aGlzKTsKKyAgICBwaXBlLkluaXRJbmZvKCk7CisgICAgcGlwZS5zaGFkZXJfc3RhZ2VzXyA9IHt2cy5HZXRTdGFnZUNyZWF0ZUluZm8oKSwgZnMuR2V0U3RhZ2VDcmVhdGVJbmZvKCl9OworICAgIHBpcGUucGlwZWxpbmVfbGF5b3V0X2NpXyA9IHBpcGVsaW5lX2xheW91dF9pbmZvOworICAgIHBpcGUuSW5pdFN0YXRlKCk7CisKKyAgICBwaXBlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKTsKKworICAgIG1fZXJyb3JNb25pdG9yLT5WZXJpZnlOb3RGb3VuZCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtyZW5kZXJmcmFtZXdvcmsuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtyZW5kZXJmcmFtZXdvcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNmVmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a3JlbmRlcmZyYW1ld29yay5jcHAKQEAgLTAsMCArMSwyMDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgR29vZ2xlLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogRGF2ZSBIb3VsdG9uIDxkYXZlaEBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlICJ2a3JlbmRlcmZyYW1ld29yay5oIgorI2luY2x1ZGUgInZrX2Zvcm1hdF91dGlscy5oIgorCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKworRXJyb3JNb25pdG9yOjpFcnJvck1vbml0b3IoKSB7CisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfY3JlYXRlX211dGV4KCZtdXRleF8pOworICAgIHRlc3RfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm11dGV4Xyk7CisgICAgUmVzZXQoKTsKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm11dGV4Xyk7Cit9CisKK0Vycm9yTW9uaXRvcjo6fkVycm9yTW9uaXRvcigpIHsgdGVzdF9wbGF0Zm9ybV90aHJlYWRfZGVsZXRlX211dGV4KCZtdXRleF8pOyB9CisKK3ZvaWQgRXJyb3JNb25pdG9yOjpSZXNldCgpIHsKKyAgICBtZXNzYWdlX2ZsYWdzXyA9IDA7CisgICAgYmFpbG91dF8gPSBOVUxMOworICAgIG1lc3NhZ2VfZm91bmRfID0gVktfRkFMU0U7CisgICAgZmFpbHVyZV9tZXNzYWdlX3N0cmluZ3NfLmNsZWFyKCk7CisgICAgZGVzaXJlZF9tZXNzYWdlX3N0cmluZ3NfLmNsZWFyKCk7CisgICAgaWdub3JlX21lc3NhZ2Vfc3RyaW5nc18uY2xlYXIoKTsKKyAgICBhbGxvd2VkX21lc3NhZ2Vfc3RyaW5nc18uY2xlYXIoKTsKKyAgICBvdGhlcl9tZXNzYWdlc18uY2xlYXIoKTsKK30KKwordm9pZCBFcnJvck1vbml0b3I6OlNldERlc2lyZWRGYWlsdXJlTXNnKGNvbnN0IFZrRmxhZ3MgbXNnRmxhZ3MsIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZykgeworICAgIFNldERlc2lyZWRGYWlsdXJlTXNnKG1zZ0ZsYWdzLCBtc2cuY19zdHIoKSk7Cit9CisKK3ZvaWQgRXJyb3JNb25pdG9yOjpTZXREZXNpcmVkRmFpbHVyZU1zZyhjb25zdCBWa0ZsYWdzIG1zZ0ZsYWdzLCBjb25zdCBjaGFyICpjb25zdCBtc2dTdHJpbmcpIHsKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZtdXRleF8pOworICAgIGRlc2lyZWRfbWVzc2FnZV9zdHJpbmdzXy5pbnNlcnQobXNnU3RyaW5nKTsKKyAgICBtZXNzYWdlX2ZsYWdzXyB8PSBtc2dGbGFnczsKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm11dGV4Xyk7Cit9CisKK3ZvaWQgRXJyb3JNb25pdG9yOjpTZXRBbGxvd2VkRmFpbHVyZU1zZyhjb25zdCBjaGFyICpjb25zdCBtc2cpIHsKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZtdXRleF8pOworICAgIGFsbG93ZWRfbWVzc2FnZV9zdHJpbmdzXy5lbXBsYWNlX2JhY2sobXNnKTsKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm11dGV4Xyk7Cit9CisKK3ZvaWQgRXJyb3JNb25pdG9yOjpTZXRVbmV4cGVjdGVkRXJyb3IoY29uc3QgY2hhciAqY29uc3QgbXNnKSB7CisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmbXV0ZXhfKTsKKworICAgIGlnbm9yZV9tZXNzYWdlX3N0cmluZ3NfLmVtcGxhY2VfYmFjayhtc2cpOworCisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZtdXRleF8pOworfQorCitWa0Jvb2wzMiBFcnJvck1vbml0b3I6OkNoZWNrRm9yRGVzaXJlZE1zZyhjb25zdCBjaGFyICpjb25zdCBtc2dTdHJpbmcpIHsKKyAgICBWa0Jvb2wzMiByZXN1bHQgPSBWS19GQUxTRTsKKyAgICB0ZXN0X3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZtdXRleF8pOworICAgIGlmIChiYWlsb3V0XyAhPSBudWxscHRyKSB7CisgICAgICAgICpiYWlsb3V0XyA9IHRydWU7CisgICAgfQorICAgIHN0cmluZyBlcnJvclN0cmluZyhtc2dTdHJpbmcpOworICAgIGJvb2wgZm91bmRfZXhwZWN0ZWQgPSBmYWxzZTsKKworICAgIGlmICghSWdub3JlTWVzc2FnZShlcnJvclN0cmluZykpIHsKKyAgICAgICAgZm9yIChhdXRvIGRlc2lyZWRfbXNnX2l0ID0gZGVzaXJlZF9tZXNzYWdlX3N0cmluZ3NfLmJlZ2luKCk7IGRlc2lyZWRfbXNnX2l0ICE9IGRlc2lyZWRfbWVzc2FnZV9zdHJpbmdzXy5lbmQoKTsKKyAgICAgICAgICAgICArK2Rlc2lyZWRfbXNnX2l0KSB7CisgICAgICAgICAgICBpZiAoKCpkZXNpcmVkX21zZ19pdCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEFuIGVtcHR5IGRlc2lyZWRfbXNnIHN0cmluZyAiIiBpbmRpY2F0ZXMgYSBwb3NpdGl2ZSB0ZXN0IC0gbm90IGV4cGVjdGluZyBhbiBlcnJvci4KKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdHJ1ZSB0byBhdm9pZCBjYWxsaW5nIGxheWVycy9kcml2ZXIgd2l0aCB0aGlzIGVycm9yLgorICAgICAgICAgICAgICAgIC8vIEFuZCBkb24ndCBlcmFzZSB0aGUgIiIgc3RyaW5nLCBzbyBpdCByZW1haW5zIGlmIGFub3RoZXIgZXJyb3IgaXMgZm91bmQuCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gVktfVFJVRTsKKyAgICAgICAgICAgICAgICBmb3VuZF9leHBlY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbWVzc2FnZV9mb3VuZF8gPSB0cnVlOworICAgICAgICAgICAgICAgIGZhaWx1cmVfbWVzc2FnZV9zdHJpbmdzXy5pbnNlcnQoZXJyb3JTdHJpbmcpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvclN0cmluZy5maW5kKCpkZXNpcmVkX21zZ19pdCkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgZm91bmRfZXhwZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGZhaWx1cmVfbWVzc2FnZV9zdHJpbmdzXy5pbnNlcnQoZXJyb3JTdHJpbmcpOworICAgICAgICAgICAgICAgIG1lc3NhZ2VfZm91bmRfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBWS19UUlVFOworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhIG1heGltdW0gb2Ygb25lIGZhaWx1cmUgbWVzc2FnZSBmcm9tIHRoZSBzZXQKKyAgICAgICAgICAgICAgICAvLyBNdWx0aXNldCBtdXRhdGlvbiBpcyBhY2NlcHRhYmxlIGJlY2F1c2UgYGJyZWFrYCBjYXVzZXMgZmxvdyBvZiBjb250cm9sIHRvIGV4aXQgdGhlIGZvciBsb29wCisgICAgICAgICAgICAgICAgZGVzaXJlZF9tZXNzYWdlX3N0cmluZ3NfLmVyYXNlKGRlc2lyZWRfbXNnX2l0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZm91bmRfZXhwZWN0ZWQgJiYgYWxsb3dlZF9tZXNzYWdlX3N0cmluZ3NfLnNpemUoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGFsbG93ZWRfbXNnX2l0ID0gYWxsb3dlZF9tZXNzYWdlX3N0cmluZ3NfLmJlZ2luKCk7IGFsbG93ZWRfbXNnX2l0ICE9IGFsbG93ZWRfbWVzc2FnZV9zdHJpbmdzXy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgKythbGxvd2VkX21zZ19pdCkgeworICAgICAgICAgICAgICAgIGlmIChlcnJvclN0cmluZy5maW5kKCphbGxvd2VkX21zZ19pdCkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2V4cGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3VuZF9leHBlY3RlZCkgeworICAgICAgICAgICAgcHJpbnRmKCJVbmV4cGVjdGVkOiAlc1xuIiwgbXNnU3RyaW5nKTsKKyAgICAgICAgICAgIG90aGVyX21lc3NhZ2VzXy5wdXNoX2JhY2soZXJyb3JTdHJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZtdXRleF8pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZlY3RvcjxzdHJpbmc+IEVycm9yTW9uaXRvcjo6R2V0T3RoZXJGYWlsdXJlTXNncygpIGNvbnN0IHsgcmV0dXJuIG90aGVyX21lc3NhZ2VzXzsgfQorCitWa0RlYnVnUmVwb3J0RmxhZ3NFWFQgRXJyb3JNb25pdG9yOjpHZXRNZXNzYWdlRmxhZ3MoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlX2ZsYWdzXzsgfQorCitib29sIEVycm9yTW9uaXRvcjo6QW55RGVzaXJlZE1zZ0ZvdW5kKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZV9mb3VuZF87IH0KKworYm9vbCBFcnJvck1vbml0b3I6OkFsbERlc2lyZWRNc2dzRm91bmQoKSBjb25zdCB7IHJldHVybiBkZXNpcmVkX21lc3NhZ2Vfc3RyaW5nc18uZW1wdHkoKTsgfQorCit2b2lkIEVycm9yTW9uaXRvcjo6U2V0RXJyb3IoY29uc3QgY2hhciAqY29uc3QgZXJyb3JTdHJpbmcpIHsKKyAgICBtZXNzYWdlX2ZvdW5kXyA9IHRydWU7CisgICAgZmFpbHVyZV9tZXNzYWdlX3N0cmluZ3NfLmluc2VydChlcnJvclN0cmluZyk7Cit9CisKK3ZvaWQgRXJyb3JNb25pdG9yOjpTZXRCYWlsb3V0KGJvb2wgKmJhaWxvdXQpIHsgYmFpbG91dF8gPSBiYWlsb3V0OyB9CisKK3ZvaWQgRXJyb3JNb25pdG9yOjpEdW1wRmFpbHVyZU1zZ3MoKSBjb25zdCB7CisgICAgdmVjdG9yPHN0cmluZz4gb3RoZXJNc2dzID0gR2V0T3RoZXJGYWlsdXJlTXNncygpOworICAgIGlmIChvdGhlck1zZ3Muc2l6ZSgpKSB7CisgICAgICAgIGNvdXQgPDwgIk90aGVyIGVycm9yIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgdGhpcyB0ZXN0IHdlcmU6IiA8PCBlbmRsOworICAgICAgICBmb3IgKGF1dG8gaXRlciA9IG90aGVyTXNncy5iZWdpbigpOyBpdGVyICE9IG90aGVyTXNncy5lbmQoKTsgaXRlcisrKSB7CisgICAgICAgICAgICBjb3V0IDw8ICIgICAgICIgPDwgKml0ZXIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFcnJvck1vbml0b3I6OkV4cGVjdFN1Y2Nlc3MoVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUIGNvbnN0IG1lc3NhZ2VfZmxhZ19tYXNrKSB7CisgICAgLy8gTWF0Y2ggQU5ZIG1lc3NhZ2UgbWF0Y2hpbmcgc3BlY2lmaWVkIHR5cGUKKyAgICBTZXREZXNpcmVkRmFpbHVyZU1zZyhtZXNzYWdlX2ZsYWdfbWFzaywgIiIpOworICAgIG1lc3NhZ2VfZmxhZ3NfID0gbWVzc2FnZV9mbGFnX21hc2s7ICAvLyBvdmVycmlkZSBtYXNrIGhhbmRsaW5nIGluIFNldERlc2lyZWQuLi4KK30KKwordm9pZCBFcnJvck1vbml0b3I6OlZlcmlmeUZvdW5kKCkgeworICAgIC8vIE5vdCByZWNlaXZpbmcgZXhwZWN0ZWQgbWVzc2FnZShzKSBpcyBhIGZhaWx1cmUuIC9CZWZvcmUvIHRocm93aW5nLCBkdW1wIGFueSBvdGhlciBtZXNzYWdlcworICAgIGlmICghQWxsRGVzaXJlZE1zZ3NGb3VuZCgpKSB7CisgICAgICAgIER1bXBGYWlsdXJlTXNncygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gZGVzaXJlZF9tc2cgOiBkZXNpcmVkX21lc3NhZ2Vfc3RyaW5nc18pIHsKKyAgICAgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBlcnJvciAnIiA8PCBkZXNpcmVkX21zZyA8PCAiJyI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEdldE90aGVyRmFpbHVyZU1zZ3MoKS5zaXplKCkgPiAwKSB7CisgICAgICAgIC8vIEZhaWwgdGVzdCBjYXNlIGZvciBhbnkgdW5leHBlY3RlZCBlcnJvcnMKKyNpZiBkZWZpbmVkKEFORFJPSUQpCisgICAgICAgIC8vIFRoaXMgd2lsbCBnZXQgdW5leHBlY3RlZCBlcnJvcnMgaW50byB0aGUgYWRiIGxvZworICAgICAgICBmb3IgKGF1dG8gbXNnIDogb3RoZXJfbWVzc2FnZXNfKSB7CisgICAgICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cyIsICJbIFVORVhQRUNURURfRVJSIF0gJyVzJyIsIG1zZy5jX3N0cigpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBlcnJvcihzKS4iOworI2VuZGlmCisgICAgfQorICAgIFJlc2V0KCk7Cit9CisKK3ZvaWQgRXJyb3JNb25pdG9yOjpWZXJpZnlOb3RGb3VuZCgpIHsKKyAgICAvLyBFeHBlY3RTdWNjZXNzKCkgY29uZmlndXJlZCB1cyB0byBtYXRjaCBhbnl0aGluZy4gQW55IGVycm9yIGlzIGEgZmFpbHVyZS4KKyAgICBpZiAoQW55RGVzaXJlZE1zZ0ZvdW5kKCkpIHsKKyAgICAgICAgRHVtcEZhaWx1cmVNc2dzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byBtc2cgOiBmYWlsdXJlX21lc3NhZ2Vfc3RyaW5nc18pIHsKKyAgICAgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIHRvIHN1Y2NlZWQgYnV0IGdvdCBlcnJvcjogIiA8PCBtc2c7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEdldE90aGVyRmFpbHVyZU1zZ3MoKS5zaXplKCkgPiAwKSB7CisgICAgICAgIC8vIEZhaWwgdGVzdCBjYXNlIGZvciBhbnkgdW5leHBlY3RlZCBlcnJvcnMKKyNpZiBkZWZpbmVkKEFORFJPSUQpCisgICAgICAgIC8vIFRoaXMgd2lsbCBnZXQgdW5leHBlY3RlZCBlcnJvcnMgaW50byB0aGUgYWRiIGxvZworICAgICAgICBmb3IgKGF1dG8gbXNnIDogb3RoZXJfbWVzc2FnZXNfKSB7CisgICAgICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJWdWxrYW5MYXllclZhbGlkYXRpb25UZXN0cyIsICJbIFVORVhQRUNURURfRVJSIF0gJyVzJyIsIG1zZy5jX3N0cigpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBlcnJvcihzKS4iOworI2VuZGlmCisgICAgfQorICAgIFJlc2V0KCk7Cit9CisKK2Jvb2wgRXJyb3JNb25pdG9yOjpJZ25vcmVNZXNzYWdlKHN0ZDo6c3RyaW5nIGNvbnN0ICZtc2cpIGNvbnN0IHsKKyAgICBpZiAoaWdub3JlX21lc3NhZ2Vfc3RyaW5nc18uZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihpZ25vcmVfbWVzc2FnZV9zdHJpbmdzXy5iZWdpbigpLCBpZ25vcmVfbWVzc2FnZV9zdHJpbmdzXy5lbmQoKSwgWyZtc2ddKHN0ZDo6c3RyaW5nIGNvbnN0ICZzdHIpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBtc2cuZmluZChzdHIpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICAgICB9KSAhPSBpZ25vcmVfbWVzc2FnZV9zdHJpbmdzXy5lbmQoKTsKK30KKworVmtSZW5kZXJGcmFtZXdvcms6OlZrUmVuZGVyRnJhbWV3b3JrKCkKKyAgICA6IGluc3QoVktfTlVMTF9IQU5ETEUpLAorICAgICAgbV9kZXZpY2UoTlVMTCksCisgICAgICBtX2NvbW1hbmRQb29sKFZLX05VTExfSEFORExFKSwKKyAgICAgIG1fY29tbWFuZEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1fcmVuZGVyUGFzcyhWS19OVUxMX0hBTkRMRSksCisgICAgICBtX2ZyYW1lYnVmZmVyKFZLX05VTExfSEFORExFKSwKKyAgICAgIG1fc3VyZmFjZShWS19OVUxMX0hBTkRMRSksCisgICAgICBtX3N3YXBjaGFpbihWS19OVUxMX0hBTkRMRSksCisgICAgICBtX2FkZFJlbmRlclBhc3NTZWxmRGVwZW5kZW5jeShmYWxzZSksCisgICAgICBtX3dpZHRoKDI1Ni4wKSwgICAvLyBkZWZhdWx0IHdpbmRvdyB3aWR0aAorICAgICAgbV9oZWlnaHQoMjU2LjApLCAgLy8gZGVmYXVsdCB3aW5kb3cgaGVpZ2h0CisgICAgICBtX3JlbmRlcl90YXJnZXRfZm10KFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSksCisgICAgICBtX2RlcHRoX3N0ZW5jaWxfZm10KFZLX0ZPUk1BVF9VTkRFRklORUQpLAorICAgICAgbV9jbGVhcl92aWFfbG9hZF9vcCh0cnVlKSwKKyAgICAgIG1fZGVwdGhfY2xlYXJfY29sb3IoMS4wKSwKKyAgICAgIG1fc3RlbmNpbF9jbGVhcl9jb2xvcigwKSwKKyAgICAgIG1fZGVwdGhTdGVuY2lsKE5VTEwpLAorICAgICAgbV9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrKFZLX05VTExfSEFORExFKSwKKyAgICAgIG1fRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2soVktfTlVMTF9IQU5ETEUpLAorICAgICAgbV9nbG9iYWxNc2dDYWxsYmFjayhWS19OVUxMX0hBTkRMRSksCisgICAgICBtX2Rldk1zZ0NhbGxiYWNrKFZLX05VTExfSEFORExFKSB7CisgICAgbWVtc2V0KCZtX3JlbmRlclBhc3NCZWdpbkluZm8sIDAsIHNpemVvZihtX3JlbmRlclBhc3NCZWdpbkluZm8pKTsKKyAgICBtX3JlbmRlclBhc3NCZWdpbkluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPOworCisgICAgbV9lcnJvck1vbml0b3IgPSBuZXcgRXJyb3JNb25pdG9yOworCisgICAgLy8gY2xlYXIgdGhlIGJhY2sgYnVmZmVyIHRvIGRhcmsgZ3JleQorICAgIG1fY2xlYXJfY29sb3IuZmxvYXQzMlswXSA9IDAuMjVmOworICAgIG1fY2xlYXJfY29sb3IuZmxvYXQzMlsxXSA9IDAuMjVmOworICAgIG1fY2xlYXJfY29sb3IuZmxvYXQzMlsyXSA9IDAuMjVmOworICAgIG1fY2xlYXJfY29sb3IuZmxvYXQzMlszXSA9IDAuMGY7Cit9CisKK1ZrUmVuZGVyRnJhbWV3b3JrOjp+VmtSZW5kZXJGcmFtZXdvcmsoKSB7IFNodXRkb3duRnJhbWV3b3JrKCk7IH0KKworVmtQaHlzaWNhbERldmljZSBWa1JlbmRlckZyYW1ld29yazo6Z3B1KCkgeworICAgIEVYUEVDVF9ORSgoVmtJbnN0YW5jZSkwLCBpbnN0KTsgIC8vIEludmFsaWQgdG8gcmVxdWVzdCBncHUgYmVmb3JlIGluc3RhbmNlIGV4aXN0cworICAgIHJldHVybiBvYmpzWzBdOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBsYXllciBuYW1lIGlzIGZvdW5kIGFuZCBzcGVjK2ltcGxlbWVudGF0aW9uIHZhbHVlcyBhcmUgPj0gcmVxdWVzdGVkIHZhbHVlcworYm9vbCBWa1JlbmRlckZyYW1ld29yazo6SW5zdGFuY2VMYXllclN1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBzcGVjLCB1aW50MzJfdCBpbXBsZW1lbnRhdGlvbikgeworICAgIHVpbnQzMl90IGxheWVyX2NvdW50ID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxWa0xheWVyUHJvcGVydGllcz4gbGF5ZXJfcHJvcHM7CisKKyAgICBWa1Jlc3VsdCByZXMgPSB2azo6RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoJmxheWVyX2NvdW50LCBOVUxMKTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSByZXMpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoMCA9PSBsYXllcl9jb3VudCkgcmV0dXJuIGZhbHNlOworCisgICAgbGF5ZXJfcHJvcHMucmVzaXplKGxheWVyX2NvdW50KTsKKyAgICByZXMgPSB2azo6RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoJmxheWVyX2NvdW50LCBsYXllcl9wcm9wcy5kYXRhKCkpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChhdXRvICZpdCA6IGxheWVyX3Byb3BzKSB7CisgICAgICAgIGlmICgwID09IHN0cm5jbXAobmFtZSwgaXQubGF5ZXJOYW1lLCBWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGl0LnNwZWNWZXJzaW9uID49IHNwZWMpICYmIChpdC5pbXBsZW1lbnRhdGlvblZlcnNpb24gPj0gaW1wbGVtZW50YXRpb24pKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEVuYWJsZSBkZXZpY2UgcHJvZmlsZSBhcyBsYXN0IGxheWVyIG9uIHN0YWNrIG92ZXJyaWRpbmcgZGV2c2ltIGlmIHRoZXJlLCBvciByZXR1cm4gaWYgbm90IGF2YWlsYWJsZQorYm9vbCBWa1JlbmRlckZyYW1ld29yazo6RW5hYmxlRGV2aWNlUHJvZmlsZUxheWVyKCkgeworICAgIGlmIChJbnN0YW5jZUxheWVyU3VwcG9ydGVkKCJWS19MQVlFUl9MVU5BUkdfZGV2aWNlX3Byb2ZpbGVfYXBpIikpIHsKKyAgICAgICAgaWYgKFZrVGVzdEZyYW1ld29yazo6bV9kZXZzaW1fbGF5ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCgwID09IHN0cmNtcChtX2luc3RhbmNlX2xheWVyX25hbWVzLmJhY2soKSwgIlZLX0xBWUVSX0xVTkFSR19kZXZpY2Vfc2ltdWxhdGlvbiIpKTsKKyAgICAgICAgICAgIG1faW5zdGFuY2VfbGF5ZXJfbmFtZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIG1faW5zdGFuY2VfbGF5ZXJfbmFtZXMucHVzaF9iYWNrKCJWS19MQVlFUl9MVU5BUkdfZGV2aWNlX3Byb2ZpbGVfYXBpIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2luc3RhbmNlX2xheWVyX25hbWVzLnB1c2hfYmFjaygiVktfTEFZRVJfTFVOQVJHX2RldmljZV9wcm9maWxlX2FwaSIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgICAgRGlkIG5vdCBmaW5kIFZLX0xBWUVSX0xVTkFSR19kZXZpY2VfcHJvZmlsZV9hcGkgbGF5ZXI7IHNraXBwZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIG5hbWUgaXMgZm91bmQgYW5kIHNwZWMgdmFsdWUgaXMgPj0gcmVxdWVzdGVkIHNwZWMgdmFsdWUKK2Jvb2wgVmtSZW5kZXJGcmFtZXdvcms6Okluc3RhbmNlRXh0ZW5zaW9uU3VwcG9ydGVkKGNvbnN0IGNoYXIgKmV4dF9uYW1lLCB1aW50MzJfdCBzcGVjKSB7CisgICAgdWludDMyX3QgZXh0X2NvdW50ID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IGV4dF9wcm9wczsKKyAgICBWa1Jlc3VsdCByZXMgPSB2azo6RW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIsICZleHRfY291bnQsIG51bGxwdHIpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgcmV0dXJuIGZhbHNlOworICAgIGlmICgwID09IGV4dF9jb3VudCkgcmV0dXJuIGZhbHNlOworCisgICAgZXh0X3Byb3BzLnJlc2l6ZShleHRfY291bnQpOworICAgIHJlcyA9IHZrOjpFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMobnVsbHB0ciwgJmV4dF9jb3VudCwgZXh0X3Byb3BzLmRhdGEoKSk7CisgICAgaWYgKFZLX1NVQ0NFU1MgIT0gcmVzKSByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKGF1dG8gJml0IDogZXh0X3Byb3BzKSB7CisgICAgICAgIGlmICgwID09IHN0cm5jbXAoZXh0X25hbWUsIGl0LmV4dGVuc2lvbk5hbWUsIFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFKSkgeworICAgICAgICAgICAgcmV0dXJuIChpdC5zcGVjVmVyc2lvbiA+PSBzcGVjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIGluc3RhbmNlIGV4aXN0cyBhbmQgZXh0ZW5zaW9uIG5hbWUgaXMgaW4gdGhlIGxpc3QKK2Jvb2wgVmtSZW5kZXJGcmFtZXdvcms6Okluc3RhbmNlRXh0ZW5zaW9uRW5hYmxlZChjb25zdCBjaGFyICpleHRfbmFtZSkgeworICAgIGlmICghaW5zdCkgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBleHRfZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gZXh0IDogbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoZXh0LCBleHRfbmFtZSkpIHsKKyAgICAgICAgICAgIGV4dF9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXh0X2ZvdW5kOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gbmFtZSBpcyBmb3VuZCBhbmQgc3BlYyB2YWx1ZSBpcyA+PSByZXF1ZXN0ZWQgc3BlYyB2YWx1ZQorYm9vbCBWa1JlbmRlckZyYW1ld29yazo6RGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZrUGh5c2ljYWxEZXZpY2UgZGV2LCBjb25zdCBjaGFyICpsYXllciwgY29uc3QgY2hhciAqZXh0X25hbWUsIHVpbnQzMl90IHNwZWMpIHsKKyAgICBpZiAoIWluc3QpIHsKKyAgICAgICAgRVhQRUNUX05FKChWa0luc3RhbmNlKTAsIGluc3QpOyAgLy8gQ29tcGxhaW4sIG5vdCBjb29sIHdpdGhvdXQgYW4gaW5zdGFuY2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1aW50MzJfdCBleHRfY291bnQgPSAwOworICAgIHN0ZDo6dmVjdG9yPFZrRXh0ZW5zaW9uUHJvcGVydGllcz4gZXh0X3Byb3BzOworICAgIFZrUmVzdWx0IHJlcyA9IHZrOjpFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGRldiwgbGF5ZXIsICZleHRfY291bnQsIG51bGxwdHIpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgcmV0dXJuIGZhbHNlOworICAgIGlmICgwID09IGV4dF9jb3VudCkgcmV0dXJuIGZhbHNlOworCisgICAgZXh0X3Byb3BzLnJlc2l6ZShleHRfY291bnQpOworICAgIHJlcyA9IHZrOjpFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGRldiwgbGF5ZXIsICZleHRfY291bnQsIGV4dF9wcm9wcy5kYXRhKCkpOworICAgIGlmIChWS19TVUNDRVNTICE9IHJlcykgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChhdXRvICZpdCA6IGV4dF9wcm9wcykgeworICAgICAgICBpZiAoMCA9PSBzdHJuY21wKGV4dF9uYW1lLCBpdC5leHRlbnNpb25OYW1lLCBWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoaXQuc3BlY1ZlcnNpb24gPj0gc3BlYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiBkZXZpY2UgaXMgY3JlYXRlZCBhbmQgZXh0ZW5zaW9uIG5hbWUgaXMgZm91bmQgaW4gdGhlIGxpc3QKK2Jvb2wgVmtSZW5kZXJGcmFtZXdvcms6OkRldmljZUV4dGVuc2lvbkVuYWJsZWQoY29uc3QgY2hhciAqZXh0X25hbWUpIHsKKyAgICBpZiAoTlVMTCA9PSBtX2RldmljZSkgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBleHRfZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gZXh0IDogbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzKSB7CisgICAgICAgIGlmICghc3RyY21wKGV4dCwgZXh0X25hbWUpKSB7CisgICAgICAgICAgICBleHRfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGV4dF9mb3VuZDsKK30KKworLy8gV0FSTklORzogIFRoZSBEZXZTaW0gbGF5ZXIgY2FuIG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHRlc3RlZCBoZXJlLCBtYWtpbmcgdGhlIHJlc3VsdCBvZgorLy8gdGhpcyBmdW5jdGlvbiBkdWJpb3VzIHdoZW4gRGV2U2ltIGlzIGFjdGl2ZS4KK2Jvb2wgVmtSZW5kZXJGcmFtZXdvcms6OkRldmljZUlzTW9ja0lDRCgpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBwcm9wcyA9IHZrX3Rlc3Rpbmc6OlBoeXNpY2FsRGV2aWNlKGdwdSgpKS5wcm9wZXJ0aWVzKCk7CisgICAgaWYgKChwcm9wcy52ZW5kb3JJRCA9PSAweGJhNWViYTExKSAmJiAocHJvcHMuZGV2aWNlSUQgPT0gMHhmMDA1YmExMSkgJiYgKDAgPT0gc3RyY21wKCJWdWxrYW4gTW9jayBEZXZpY2UiLCBwcm9wcy5kZXZpY2VOYW1lKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gU29tZSB0ZXN0cyBtYXkgbmVlZCB0byBiZSBza2lwcGVkIGlmIHRoZSBkZXZzaW0gbGF5ZXIgaXMgaW4gdXNlLgorYm9vbCBWa1JlbmRlckZyYW1ld29yazo6RGV2aWNlU2ltdWxhdGlvbigpIHsgcmV0dXJuIG1fZGV2c2ltX2xheWVyOyB9CisKK3ZvaWQgVmtSZW5kZXJGcmFtZXdvcms6OkluaXRGcmFtZXdvcmsoUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBkYmdGdW5jdGlvbiwgdm9pZCAqdXNlckRhdGEsIHZvaWQgKmluc3RhbmNlX3BuZXh0KSB7CisgICAgLy8gT25seSBlbmFibGUgZGV2aWNlIHByb2ZpbGUgbGF5ZXIgYnkgZGVmYXVsdCBpZiBkZXZzaW0gaXMgbm90IGVuYWJsZWQKKyAgICBpZiAoIVZrVGVzdEZyYW1ld29yazo6bV9kZXZzaW1fbGF5ZXIgJiYgSW5zdGFuY2VMYXllclN1cHBvcnRlZCgiVktfTEFZRVJfTFVOQVJHX2RldmljZV9wcm9maWxlX2FwaSIpKSB7CisgICAgICAgIG1faW5zdGFuY2VfbGF5ZXJfbmFtZXMucHVzaF9iYWNrKCJWS19MQVlFUl9MVU5BUkdfZGV2aWNlX3Byb2ZpbGVfYXBpIik7CisgICAgfQorCisgICAgLy8gQXNzZXJ0IG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgQVNTRVJUX0VRKChWa0luc3RhbmNlKTAsIGluc3QpOworCisgICAgLy8gUmVtb3ZlIGFueSB1bnN1cHBvcnRlZCBsYXllciBuYW1lcyBmcm9tIGxpc3QKKyAgICBmb3IgKGF1dG8gbGF5ZXIgPSBtX2luc3RhbmNlX2xheWVyX25hbWVzLmJlZ2luKCk7IGxheWVyICE9IG1faW5zdGFuY2VfbGF5ZXJfbmFtZXMuZW5kKCk7KSB7CisgICAgICAgIGlmICghSW5zdGFuY2VMYXllclN1cHBvcnRlZCgqbGF5ZXIpKSB7CisgICAgICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJJbml0RnJhbWV3b3JrKCk6IFJlcXVlc3RlZCBsYXllciAiIDw8ICpsYXllciA8PCAiIHdhcyBub3QgZm91bmQuIERpc2FibGVkLiI7CisgICAgICAgICAgICBsYXllciA9IG1faW5zdGFuY2VfbGF5ZXJfbmFtZXMuZXJhc2UobGF5ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytsYXllcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlbW92ZSBhbnkgdW5zdXBwb3J0ZWQgaW5zdGFuY2UgZXh0ZW5zaW9uIG5hbWVzIGZyb20gbGlzdAorICAgIGZvciAoYXV0byBleHQgPSBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5iZWdpbigpOyBleHQgIT0gbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMuZW5kKCk7KSB7CisgICAgICAgIGlmICghSW5zdGFuY2VFeHRlbnNpb25TdXBwb3J0ZWQoKmV4dCkpIHsKKyAgICAgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkluaXRGcmFtZXdvcmsoKTogUmVxdWVzdGVkIGV4dGVuc2lvbiAiIDw8ICpleHQgPDwgIiB3YXMgbm90IGZvdW5kLiBEaXNhYmxlZC4iOworICAgICAgICAgICAgZXh0ID0gbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXMuZXJhc2UoZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsrZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgVmtJbnN0YW5jZUNyZWF0ZUluZm8gaW5zdEluZm8gPSB7fTsKKyAgICBpbnN0SW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPOworICAgIGluc3RJbmZvLnBOZXh0ID0gaW5zdGFuY2VfcG5leHQ7CisgICAgaW5zdEluZm8ucEFwcGxpY2F0aW9uSW5mbyA9ICZhcHBfaW5mbzsKKyAgICBpbnN0SW5mby5lbmFibGVkTGF5ZXJDb3VudCA9IG1faW5zdGFuY2VfbGF5ZXJfbmFtZXMuc2l6ZSgpOworICAgIGluc3RJbmZvLnBwRW5hYmxlZExheWVyTmFtZXMgPSBtX2luc3RhbmNlX2xheWVyX25hbWVzLmRhdGEoKTsKKyAgICBpbnN0SW5mby5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5zaXplKCk7CisgICAgaW5zdEluZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBtX2luc3RhbmNlX2V4dGVuc2lvbl9uYW1lcy5kYXRhKCk7CisKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUIGRiZ0NyZWF0ZUluZm87CisgICAgaWYgKGRiZ0Z1bmN0aW9uKSB7CisgICAgICAgIC8vIEVuYWJsZSBjcmVhdGUgdGltZSBkZWJ1ZyBtZXNzYWdlcworICAgICAgICBtZW1zZXQoJmRiZ0NyZWF0ZUluZm8sIDAsIHNpemVvZihkYmdDcmVhdGVJbmZvKSk7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ1JFQVRFX0lORk9fRVhUOworICAgICAgICBkYmdDcmVhdGVJbmZvLmZsYWdzID0KKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUIHwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCB8IFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQ7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8ucGZuQ2FsbGJhY2sgPSBkYmdGdW5jdGlvbjsKKyAgICAgICAgZGJnQ3JlYXRlSW5mby5wVXNlckRhdGEgPSB1c2VyRGF0YTsKKworICAgICAgICBkYmdDcmVhdGVJbmZvLnBOZXh0ID0gaW5zdEluZm8ucE5leHQ7CisgICAgICAgIGluc3RJbmZvLnBOZXh0ID0gJmRiZ0NyZWF0ZUluZm87CisgICAgfQorCisgICAgVmtSZXN1bHQgZXJyOworCisgICAgZXJyID0gdms6OkNyZWF0ZUluc3RhbmNlKCZpbnN0SW5mbywgTlVMTCwgJnRoaXMtPmluc3QpOworICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisKKyAgICBlcnIgPSB2azo6RW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKGluc3QsICZ0aGlzLT5ncHVfY291bnQsIE5VTEwpOworICAgIEFTU0VSVF9MRSh0aGlzLT5ncHVfY291bnQsIEFSUkFZX1NJWkUob2JqcykpIDw8ICJUb28gbWFueSBncHVzIjsKKyAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIGVyciA9IHZrOjpFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdCwgJnRoaXMtPmdwdV9jb3VudCwgb2Jqcyk7CisgICAgQVNTRVJUX1ZLX1NVQ0NFU1MoZXJyKTsKKyAgICBBU1NFUlRfR0UodGhpcy0+Z3B1X2NvdW50LCAodWludDMyX3QpMSkgPDwgIk5vIEdQVSBhdmFpbGFibGUiOworCisgICAgaWYgKGRiZ0Z1bmN0aW9uKSB7CisgICAgICAgIG1fQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFjayA9CisgICAgICAgICAgICAoUEZOX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCl2azo6R2V0SW5zdGFuY2VQcm9jQWRkcih0aGlzLT5pbnN0LCAidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIik7CisgICAgICAgIEFTU0VSVF9ORShtX0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2ssIChQRk5fdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKU5VTEwpCisgICAgICAgICAgICA8PCAiRGlkIG5vdCBnZXQgZnVuY3Rpb24gcG9pbnRlciBmb3IgQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFjayI7CisgICAgICAgIGlmIChtX0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2spIHsKKyAgICAgICAgICAgIGRiZ0NyZWF0ZUluZm8ucE5leHQgPSBudWxscHRyOyAgLy8gY2xlYW4gdXAgZnJvbSB1c2FnZSBpbiBDcmVhdGVJbnN0YW5jZSBhYm92ZQorICAgICAgICAgICAgZXJyID0gbV9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrKHRoaXMtPmluc3QsICZkYmdDcmVhdGVJbmZvLCBOVUxMLCAmbV9nbG9iYWxNc2dDYWxsYmFjayk7CisgICAgICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworCisgICAgICAgICAgICBtX0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAoUEZOX3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpdms6OkdldEluc3RhbmNlUHJvY0FkZHIodGhpcy0+aW5zdCwgInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShtX0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrLCAoUEZOX3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQpTlVMTCkKKyAgICAgICAgICAgICAgICA8PCAiRGlkIG5vdCBnZXQgZnVuY3Rpb24gcG9pbnRlciBmb3IgRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2siOworICAgICAgICAgICAgbV9EZWJ1Z1JlcG9ydE1lc3NhZ2UgPSAoUEZOX3ZrRGVidWdSZXBvcnRNZXNzYWdlRVhUKXZrOjpHZXRJbnN0YW5jZVByb2NBZGRyKHRoaXMtPmluc3QsICJ2a0RlYnVnUmVwb3J0TWVzc2FnZUVYVCIpOworICAgICAgICAgICAgQVNTRVJUX05FKG1fRGVidWdSZXBvcnRNZXNzYWdlLCAoUEZOX3ZrRGVidWdSZXBvcnRNZXNzYWdlRVhUKU5VTEwpCisgICAgICAgICAgICAgICAgPDwgIkRpZCBub3QgZ2V0IGZ1bmN0aW9uIHBvaW50ZXIgZm9yIERlYnVnUmVwb3J0TWVzc2FnZSI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVmtSZW5kZXJGcmFtZXdvcms6OlNodXRkb3duRnJhbWV3b3JrKCkgeworICAgIC8vIE5vdGhpbmcgdG8gc2h1dCBkb3duIHdpdGhvdXQgYSBWa0luc3RhbmNlCisgICAgaWYgKCF0aGlzLT5pbnN0KSByZXR1cm47CisKKyAgICBkZWxldGUgbV9jb21tYW5kQnVmZmVyOworICAgIG1fY29tbWFuZEJ1ZmZlciA9IG51bGxwdHI7CisgICAgZGVsZXRlIG1fY29tbWFuZFBvb2w7CisgICAgbV9jb21tYW5kUG9vbCA9IG51bGxwdHI7CisgICAgaWYgKG1fZnJhbWVidWZmZXIpIHZrOjpEZXN0cm95RnJhbWVidWZmZXIoZGV2aWNlKCksIG1fZnJhbWVidWZmZXIsIE5VTEwpOworICAgIG1fZnJhbWVidWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBpZiAobV9yZW5kZXJQYXNzKSB2azo6RGVzdHJveVJlbmRlclBhc3MoZGV2aWNlKCksIG1fcmVuZGVyUGFzcywgTlVMTCk7CisgICAgbV9yZW5kZXJQYXNzID0gVktfTlVMTF9IQU5ETEU7CisKKyAgICBpZiAobV9nbG9iYWxNc2dDYWxsYmFjaykgbV9EZXN0cm95RGVidWdSZXBvcnRDYWxsYmFjayh0aGlzLT5pbnN0LCBtX2dsb2JhbE1zZ0NhbGxiYWNrLCBOVUxMKTsKKyAgICBtX2dsb2JhbE1zZ0NhbGxiYWNrID0gVktfTlVMTF9IQU5ETEU7CisgICAgaWYgKG1fZGV2TXNnQ2FsbGJhY2spIG1fRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2sodGhpcy0+aW5zdCwgbV9kZXZNc2dDYWxsYmFjaywgTlVMTCk7CisgICAgbV9kZXZNc2dDYWxsYmFjayA9IFZLX05VTExfSEFORExFOworCisgICAgbV9yZW5kZXJUYXJnZXRzLmNsZWFyKCk7CisKKyAgICBkZWxldGUgbV9kZXB0aFN0ZW5jaWw7CisgICAgbV9kZXB0aFN0ZW5jaWwgPSBudWxscHRyOworCisgICAgLy8gcmVzZXQgdGhlIGRyaXZlcgorICAgIGRlbGV0ZSBtX2RldmljZTsKKyAgICBtX2RldmljZSA9IG51bGxwdHI7CisKKyAgICBpZiAodGhpcy0+aW5zdCkgdms6OkRlc3Ryb3lJbnN0YW5jZSh0aGlzLT5pbnN0LCBOVUxMKTsKKyAgICBkZWxldGUgbV9lcnJvck1vbml0b3I7CisgICAgdGhpcy0+aW5zdCA9IChWa0luc3RhbmNlKTA7ICAvLyBJbiBjYXNlIHdlIHdhbnQgdG8gcmUtaW5pdGlhbGl6ZQorfQorCitFcnJvck1vbml0b3IgKlZrUmVuZGVyRnJhbWV3b3JrOjpNb25pdG9yKCkgeyByZXR1cm4gbV9lcnJvck1vbml0b3I7IH0KKwordm9pZCBWa1JlbmRlckZyYW1ld29yazo6R2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyhWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgKmZlYXR1cmVzKSB7CisgICAgaWYgKE5VTEwgPT0gbV9kZXZpY2UpIHsKKyAgICAgICAgVmtEZXZpY2VPYmogKnRlbXBfZGV2aWNlID0gbmV3IFZrRGV2aWNlT2JqKDAsIG9ianNbMF0sIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcyk7CisgICAgICAgICpmZWF0dXJlcyA9IHRlbXBfZGV2aWNlLT5waHkoKS5mZWF0dXJlcygpOworICAgICAgICBkZWxldGUgKHRlbXBfZGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZmVhdHVyZXMgPSBtX2RldmljZS0+cGh5KCkuZmVhdHVyZXMoKTsKKyAgICB9Cit9CisKK3ZvaWQgVmtSZW5kZXJGcmFtZXdvcms6OkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyAqcHJvcHMpIHsKKyAgICAqcHJvcHMgPSB2a190ZXN0aW5nOjpQaHlzaWNhbERldmljZShncHUoKSkucHJvcGVydGllcygpOworfQorCit2b2lkIFZrUmVuZGVyRnJhbWV3b3JrOjpJbml0U3RhdGUoVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpmZWF0dXJlcywgdm9pZCAqY3JlYXRlX2RldmljZV9wbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgZmxhZ3MpIHsKKyAgICAvLyBSZW1vdmUgYW55IHVuc3VwcG9ydGVkIGRldmljZSBleHRlbnNpb24gbmFtZXMgZnJvbSBsaXN0CisgICAgZm9yIChhdXRvIGV4dCA9IG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcy5iZWdpbigpOyBleHQgIT0gbV9kZXZpY2VfZXh0ZW5zaW9uX25hbWVzLmVuZCgpOykgeworICAgICAgICBpZiAoIURldmljZUV4dGVuc2lvblN1cHBvcnRlZChvYmpzWzBdLCBudWxscHRyLCAqZXh0KSkgeworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChhdXRvIGxheWVyID0gbV9pbnN0YW5jZV9sYXllcl9uYW1lcy5iZWdpbigpOyBsYXllciAhPSBtX2luc3RhbmNlX2xheWVyX25hbWVzLmVuZCgpOyArK2xheWVyKSB7CisgICAgICAgICAgICAgICAgaWYgKERldmljZUV4dGVuc2lvblN1cHBvcnRlZChvYmpzWzBdLCAqbGF5ZXIsICpleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkluaXRTdGF0ZSgpOiBUaGUgcmVxdWVzdGVkIGRldmljZSBleHRlbnNpb24gIiA8PCAqZXh0IDw8ICIgd2FzIG5vdCBmb3VuZC4gRGlzYWJsZWQuIjsKKyAgICAgICAgICAgICAgICBleHQgPSBtX2RldmljZV9leHRlbnNpb25fbmFtZXMuZXJhc2UoZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytleHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2V4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fZGV2aWNlID0gbmV3IFZrRGV2aWNlT2JqKDAsIG9ianNbMF0sIG1fZGV2aWNlX2V4dGVuc2lvbl9uYW1lcywgZmVhdHVyZXMsIGNyZWF0ZV9kZXZpY2VfcG5leHQpOworICAgIG1fZGV2aWNlLT5TZXREZXZpY2VRdWV1ZSgpOworCisgICAgbV9kZXB0aFN0ZW5jaWwgPSBuZXcgVmtEZXB0aFN0ZW5jaWxPYmoobV9kZXZpY2UpOworCisgICAgbV9yZW5kZXJfdGFyZ2V0X2ZtdCA9IFZrVGVzdEZyYW1ld29yazo6R2V0Rm9ybWF0KGluc3QsIG1fZGV2aWNlKTsKKworICAgIG1fbGluZVdpZHRoID0gMS4wZjsKKworICAgIG1fZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IgPSAwLjBmOworICAgIG1fZGVwdGhCaWFzQ2xhbXAgPSAwLjBmOworICAgIG1fZGVwdGhCaWFzU2xvcGVGYWN0b3IgPSAwLjBmOworCisgICAgbV9ibGVuZENvbnN0YW50c1swXSA9IDEuMGY7CisgICAgbV9ibGVuZENvbnN0YW50c1sxXSA9IDEuMGY7CisgICAgbV9ibGVuZENvbnN0YW50c1syXSA9IDEuMGY7CisgICAgbV9ibGVuZENvbnN0YW50c1szXSA9IDEuMGY7CisKKyAgICBtX21pbkRlcHRoQm91bmRzID0gMC5mOworICAgIG1fbWF4RGVwdGhCb3VuZHMgPSAxLmY7CisKKyAgICBtX2NvbXBhcmVNYXNrID0gMHhmZjsKKyAgICBtX3dyaXRlTWFzayA9IDB4ZmY7CisgICAgbV9yZWZlcmVuY2UgPSAwOworCisgICAgbV9jb21tYW5kUG9vbCA9IG5ldyBWa0NvbW1hbmRQb29sT2JqKG1fZGV2aWNlLCBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8sIGZsYWdzKTsKKworICAgIG1fY29tbWFuZEJ1ZmZlciA9IG5ldyBWa0NvbW1hbmRCdWZmZXJPYmoobV9kZXZpY2UsIG1fY29tbWFuZFBvb2wpOworfQorCit2b2lkIFZrUmVuZGVyRnJhbWV3b3JrOjpJbml0Vmlld3BvcnQoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgeworICAgIFZrVmlld3BvcnQgdmlld3BvcnQ7CisgICAgVmtSZWN0MkQgc2Npc3NvcjsKKyAgICB2aWV3cG9ydC54ID0gMDsKKyAgICB2aWV3cG9ydC55ID0gMDsKKyAgICB2aWV3cG9ydC53aWR0aCA9IDEuZiAqIHdpZHRoOworICAgIHZpZXdwb3J0LmhlaWdodCA9IDEuZiAqIGhlaWdodDsKKyAgICB2aWV3cG9ydC5taW5EZXB0aCA9IDAuZjsKKyAgICB2aWV3cG9ydC5tYXhEZXB0aCA9IDEuZjsKKyAgICBtX3ZpZXdwb3J0cy5wdXNoX2JhY2sodmlld3BvcnQpOworCisgICAgc2Npc3Nvci5leHRlbnQud2lkdGggPSAoaW50MzJfdCl3aWR0aDsKKyAgICBzY2lzc29yLmV4dGVudC5oZWlnaHQgPSAoaW50MzJfdCloZWlnaHQ7CisgICAgc2Npc3Nvci5vZmZzZXQueCA9IDA7CisgICAgc2Npc3Nvci5vZmZzZXQueSA9IDA7CisgICAgbV9zY2lzc29ycy5wdXNoX2JhY2soc2Npc3Nvcik7CisKKyAgICBtX3dpZHRoID0gd2lkdGg7CisgICAgbV9oZWlnaHQgPSBoZWlnaHQ7Cit9CisKK3ZvaWQgVmtSZW5kZXJGcmFtZXdvcms6OkluaXRWaWV3cG9ydCgpIHsgSW5pdFZpZXdwb3J0KG1fd2lkdGgsIG1faGVpZ2h0KTsgfQorCitib29sIFZrUmVuZGVyRnJhbWV3b3JrOjpJbml0U3VyZmFjZSgpIHsgcmV0dXJuIEluaXRTdXJmYWNlKG1fd2lkdGgsIG1faGVpZ2h0KTsgfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorTFJFU1VMVCBDQUxMQkFDSyBXaW5kb3dQcm9jKEhXTkQgaHduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKSB7CisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworfQorI2VuZGlmICAvLyBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisKK2Jvb2wgVmtSZW5kZXJGcmFtZXdvcms6OkluaXRTdXJmYWNlKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKKyNpZiBkZWZpbmVkKFZLX1VTRV9QTEFURk9STV9XSU4zMl9LSFIpCisgICAgSElOU1RBTkNFIHdpbmRvd19pbnN0YW5jZSA9IEdldE1vZHVsZUhhbmRsZShudWxscHRyKTsKKyAgICBjb25zdCBjaGFyIGNsYXNzX25hbWVbXSA9ICJ0ZXN0IjsKKyAgICBXTkRDTEFTUyB3YyA9IHt9OworICAgIHdjLmxwZm5XbmRQcm9jID0gV2luZG93UHJvYzsKKyAgICB3Yy5oSW5zdGFuY2UgPSB3aW5kb3dfaW5zdGFuY2U7CisgICAgd2MubHBzekNsYXNzTmFtZSA9IGNsYXNzX25hbWU7CisgICAgUmVnaXN0ZXJDbGFzcygmd2MpOworICAgIEhXTkQgd2luZG93ID0gQ3JlYXRlV2luZG93RXgoMCwgY2xhc3NfbmFtZSwgMCwgMCwgMCwgMCwgKGludCltX3dpZHRoLCAoaW50KW1faGVpZ2h0LCBOVUxMLCBOVUxMLCB3aW5kb3dfaW5zdGFuY2UsIE5VTEwpOworICAgIFNob3dXaW5kb3cod2luZG93LCBTV19ISURFKTsKKworICAgIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBzdXJmYWNlX2NyZWF0ZV9pbmZvID0ge307CisgICAgc3VyZmFjZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dJTjMyX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIHN1cmZhY2VfY3JlYXRlX2luZm8uaGluc3RhbmNlID0gd2luZG93X2luc3RhbmNlOworICAgIHN1cmZhY2VfY3JlYXRlX2luZm8uaHduZCA9IHdpbmRvdzsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlV2luMzJTdXJmYWNlS0hSKGluc3RhbmNlKCksICZzdXJmYWNlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmbV9zdXJmYWNlKTsKKyAgICBpZiAoZXJyICE9IFZLX1NVQ0NFU1MpIHJldHVybiBmYWxzZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIpICYmIGRlZmluZWQoVkFMSURBVElPTl9BUEspCisgICAgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIgc3VyZmFjZV9jcmVhdGVfaW5mbyA9IHt9OworICAgIHN1cmZhY2VfY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIHN1cmZhY2VfY3JlYXRlX2luZm8ud2luZG93ID0gVmtUZXN0RnJhbWV3b3JrOjp3aW5kb3c7CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKGluc3RhbmNlKCksICZzdXJmYWNlX2NyZWF0ZV9pbmZvLCBudWxscHRyLCAmbV9zdXJmYWNlKTsKKyAgICBpZiAoZXJyICE9IFZLX1NVQ0NFU1MpIHJldHVybiBmYWxzZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWExJQl9LSFIpCisgICAgRGlzcGxheSAqZHB5ID0gWE9wZW5EaXNwbGF5KE5VTEwpOworICAgIGlmIChkcHkpIHsKKyAgICAgICAgaW50IHMgPSBEZWZhdWx0U2NyZWVuKGRweSk7CisgICAgICAgIFdpbmRvdyB3aW5kb3cgPSBYQ3JlYXRlU2ltcGxlV2luZG93KGRweSwgUm9vdFdpbmRvdyhkcHksIHMpLCAwLCAwLCAoaW50KW1fd2lkdGgsIChpbnQpbV9oZWlnaHQsIDEsIEJsYWNrUGl4ZWwoZHB5LCBzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpdGVQaXhlbChkcHksIHMpKTsKKyAgICAgICAgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIgc3VyZmFjZV9jcmVhdGVfaW5mbyA9IHt9OworICAgICAgICBzdXJmYWNlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfWExJQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICAgICAgc3VyZmFjZV9jcmVhdGVfaW5mby5kcHkgPSBkcHk7CisgICAgICAgIHN1cmZhY2VfY3JlYXRlX2luZm8ud2luZG93ID0gd2luZG93OworICAgICAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlWGxpYlN1cmZhY2VLSFIoaW5zdGFuY2UoKSwgJnN1cmZhY2VfY3JlYXRlX2luZm8sIG51bGxwdHIsICZtX3N1cmZhY2UpOworICAgICAgICBpZiAoZXJyICE9IFZLX1NVQ0NFU1MpIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIpCisgICAgaWYgKG1fc3VyZmFjZSA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjb25uZWN0aW9uID0geGNiX2Nvbm5lY3QoTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChjb25uZWN0aW9uKSB7CisgICAgICAgICAgICB4Y2Jfd2luZG93X3Qgd2luZG93ID0geGNiX2dlbmVyYXRlX2lkKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiBzdXJmYWNlX2NyZWF0ZV9pbmZvID0ge307CisgICAgICAgICAgICBzdXJmYWNlX2NyZWF0ZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgICAgICAgICAgc3VyZmFjZV9jcmVhdGVfaW5mby5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgIHN1cmZhY2VfY3JlYXRlX2luZm8ud2luZG93ID0gd2luZG93OworICAgICAgICAgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVhjYlN1cmZhY2VLSFIoaW5zdGFuY2UoKSwgJnN1cmZhY2VfY3JlYXRlX2luZm8sIG51bGxwdHIsICZtX3N1cmZhY2UpOworICAgICAgICAgICAgaWYgKGVyciAhPSBWS19TVUNDRVNTKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiAobV9zdXJmYWNlID09IFZLX05VTExfSEFORExFKSA/IGZhbHNlIDogdHJ1ZTsKK30KKworYm9vbCBWa1JlbmRlckZyYW1ld29yazo6SW5pdFN3YXBjaGFpbihWa0ltYWdlVXNhZ2VGbGFncyBpbWFnZVVzYWdlLCBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBwcmVUcmFuc2Zvcm0pIHsKKyAgICBpZiAoSW5pdFN1cmZhY2UoKSkgeworICAgICAgICByZXR1cm4gSW5pdFN3YXBjaGFpbihtX3N1cmZhY2UsIGltYWdlVXNhZ2UsIHByZVRyYW5zZm9ybSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBWa1JlbmRlckZyYW1ld29yazo6SW5pdFN3YXBjaGFpbihWa1N1cmZhY2VLSFIgJnN1cmZhY2UsIFZrSW1hZ2VVc2FnZUZsYWdzIGltYWdlVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VyZmFjZVRyYW5zZm9ybUZsYWdCaXRzS0hSIHByZVRyYW5zZm9ybSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9kZXZpY2UtPnF1ZXVlX3Byb3BzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZrQm9vbDMyIHByZXNlbnRTdXBwb3J0ID0gZmFsc2U7CisgICAgICAgIHZrOjpHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKG1fZGV2aWNlLT5waHkoKS5oYW5kbGUoKSwgaSwgc3VyZmFjZSwgJnByZXNlbnRTdXBwb3J0KTsKKyAgICB9CisKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIgY2FwYWJpbGl0aWVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBzdXJmYWNlLCAmY2FwYWJpbGl0aWVzKTsKKworICAgIHVpbnQzMl90IGZvcm1hdF9jb3VudDsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIHN1cmZhY2UsICZmb3JtYXRfY291bnQsIG51bGxwdHIpOworICAgIHN0ZDo6dmVjdG9yPFZrU3VyZmFjZUZvcm1hdEtIUj4gZm9ybWF0czsKKyAgICBpZiAoZm9ybWF0X2NvdW50ICE9IDApIHsKKyAgICAgICAgZm9ybWF0cy5yZXNpemUoZm9ybWF0X2NvdW50KTsKKyAgICAgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBzdXJmYWNlLCAmZm9ybWF0X2NvdW50LCBmb3JtYXRzLmRhdGEoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgcHJlc2VudF9tb2RlX2NvdW50OworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBzdXJmYWNlLCAmcHJlc2VudF9tb2RlX2NvdW50LCBudWxscHRyKTsKKyAgICBzdGQ6OnZlY3RvcjxWa1ByZXNlbnRNb2RlS0hSPiBwcmVzZW50X21vZGVzOworICAgIGlmIChwcmVzZW50X21vZGVfY291bnQgIT0gMCkgeworICAgICAgICBwcmVzZW50X21vZGVzLnJlc2l6ZShwcmVzZW50X21vZGVfY291bnQpOworICAgICAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKG1fZGV2aWNlLT5waHkoKS5oYW5kbGUoKSwgc3VyZmFjZSwgJnByZXNlbnRfbW9kZV9jb3VudCwgcHJlc2VudF9tb2Rlcy5kYXRhKCkpOworICAgIH0KKworICAgIFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiBzd2FwY2hhaW5fY3JlYXRlX2luZm8gPSB7fTsKKyAgICBzd2FwY2hhaW5fY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TV0FQQ0hBSU5fQ1JFQVRFX0lORk9fS0hSOworICAgIHN3YXBjaGFpbl9jcmVhdGVfaW5mby5wTmV4dCA9IDA7CisgICAgc3dhcGNoYWluX2NyZWF0ZV9pbmZvLnN1cmZhY2UgPSBzdXJmYWNlOworICAgIHN3YXBjaGFpbl9jcmVhdGVfaW5mby5taW5JbWFnZUNvdW50ID0gY2FwYWJpbGl0aWVzLm1pbkltYWdlQ291bnQ7CisgICAgc3dhcGNoYWluX2NyZWF0ZV9pbmZvLmltYWdlRm9ybWF0ID0gZm9ybWF0c1swXS5mb3JtYXQ7CisgICAgc3dhcGNoYWluX2NyZWF0ZV9pbmZvLmltYWdlQ29sb3JTcGFjZSA9IGZvcm1hdHNbMF0uY29sb3JTcGFjZTsKKyAgICBzd2FwY2hhaW5fY3JlYXRlX2luZm8uaW1hZ2VFeHRlbnQgPSB7Y2FwYWJpbGl0aWVzLm1pbkltYWdlRXh0ZW50LndpZHRoLCBjYXBhYmlsaXRpZXMubWluSW1hZ2VFeHRlbnQuaGVpZ2h0fTsKKyAgICBzd2FwY2hhaW5fY3JlYXRlX2luZm8uaW1hZ2VBcnJheUxheWVycyA9IDE7CisgICAgc3dhcGNoYWluX2NyZWF0ZV9pbmZvLmltYWdlVXNhZ2UgPSBpbWFnZVVzYWdlOworICAgIHN3YXBjaGFpbl9jcmVhdGVfaW5mby5pbWFnZVNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBzd2FwY2hhaW5fY3JlYXRlX2luZm8ucHJlVHJhbnNmb3JtID0gcHJlVHJhbnNmb3JtOworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgIHN3YXBjaGFpbl9jcmVhdGVfaW5mby5jb21wb3NpdGVBbHBoYSA9IFZLX0NPTVBPU0lURV9BTFBIQV9JTkhFUklUX0JJVF9LSFI7CisjZWxzZQorICAgIHN3YXBjaGFpbl9jcmVhdGVfaW5mby5jb21wb3NpdGVBbHBoYSA9IFZLX0NPTVBPU0lURV9BTFBIQV9PUEFRVUVfQklUX0tIUjsKKyNlbmRpZgorICAgIHN3YXBjaGFpbl9jcmVhdGVfaW5mby5wcmVzZW50TW9kZSA9IHByZXNlbnRfbW9kZXNbMF07CisgICAgc3dhcGNoYWluX2NyZWF0ZV9pbmZvLmNsaXBwZWQgPSBWS19GQUxTRTsKKyAgICBzd2FwY2hhaW5fY3JlYXRlX2luZm8ub2xkU3dhcGNoYWluID0gMDsKKworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVTd2FwY2hhaW5LSFIoZGV2aWNlKCksICZzd2FwY2hhaW5fY3JlYXRlX2luZm8sIG51bGxwdHIsICZtX3N3YXBjaGFpbik7CisgICAgaWYgKGVyciAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDMyX3QgaW1hZ2VDb3VudCA9IDA7CisgICAgdms6OkdldFN3YXBjaGFpbkltYWdlc0tIUihkZXZpY2UoKSwgbV9zd2FwY2hhaW4sICZpbWFnZUNvdW50LCBudWxscHRyKTsKKyAgICBzdGQ6OnZlY3RvcjxWa0ltYWdlPiBzd2FwY2hhaW5JbWFnZXM7CisgICAgc3dhcGNoYWluSW1hZ2VzLnJlc2l6ZShpbWFnZUNvdW50KTsKKyAgICB2azo6R2V0U3dhcGNoYWluSW1hZ2VzS0hSKGRldmljZSgpLCBtX3N3YXBjaGFpbiwgJmltYWdlQ291bnQsIHN3YXBjaGFpbkltYWdlcy5kYXRhKCkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFZrUmVuZGVyRnJhbWV3b3JrOjpEZXN0cm95U3dhcGNoYWluKCkgeworICAgIGlmIChtX3N3YXBjaGFpbiAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB2azo6RGVzdHJveVN3YXBjaGFpbktIUihkZXZpY2UoKSwgbV9zd2FwY2hhaW4sIG51bGxwdHIpOworICAgICAgICBtX3N3YXBjaGFpbiA9IFZLX05VTExfSEFORExFOworICAgIH0KKyAgICBpZiAobV9zdXJmYWNlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHZrOjpEZXN0cm95U3VyZmFjZUtIUihpbnN0YW5jZSgpLCBtX3N1cmZhY2UsIG51bGxwdHIpOworICAgICAgICBtX3N1cmZhY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9Cit9CisKK3ZvaWQgVmtSZW5kZXJGcmFtZXdvcms6OkluaXRSZW5kZXJUYXJnZXQoKSB7IEluaXRSZW5kZXJUYXJnZXQoMSk7IH0KKwordm9pZCBWa1JlbmRlckZyYW1ld29yazo6SW5pdFJlbmRlclRhcmdldCh1aW50MzJfdCB0YXJnZXRzKSB7IEluaXRSZW5kZXJUYXJnZXQodGFyZ2V0cywgTlVMTCk7IH0KKwordm9pZCBWa1JlbmRlckZyYW1ld29yazo6SW5pdFJlbmRlclRhcmdldChWa0ltYWdlVmlldyAqZHNCaW5kaW5nKSB7IEluaXRSZW5kZXJUYXJnZXQoMSwgZHNCaW5kaW5nKTsgfQorCit2b2lkIFZrUmVuZGVyRnJhbWV3b3JrOjpJbml0UmVuZGVyVGFyZ2V0KHVpbnQzMl90IHRhcmdldHMsIFZrSW1hZ2VWaWV3ICpkc0JpbmRpbmcpIHsKKyAgICBzdGQ6OnZlY3RvcjxWa0F0dGFjaG1lbnREZXNjcmlwdGlvbj4gYXR0YWNobWVudHM7CisgICAgc3RkOjp2ZWN0b3I8VmtBdHRhY2htZW50UmVmZXJlbmNlPiBjb2xvcl9yZWZlcmVuY2VzOworICAgIHN0ZDo6dmVjdG9yPFZrSW1hZ2VWaWV3PiBiaW5kaW5nczsKKyAgICBhdHRhY2htZW50cy5yZXNlcnZlKHRhcmdldHMgKyAxKTsgIC8vICsxIGZvciBkc0JpbmRpbmcKKyAgICBjb2xvcl9yZWZlcmVuY2VzLnJlc2VydmUodGFyZ2V0cyk7CisgICAgYmluZGluZ3MucmVzZXJ2ZSh0YXJnZXRzICsgMSk7ICAvLyArMSBmb3IgZHNCaW5kaW5nCisKKyAgICBWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHQgPSB7fTsKKyAgICBhdHQuZm9ybWF0ID0gbV9yZW5kZXJfdGFyZ2V0X2ZtdDsKKyAgICBhdHQuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHQubG9hZE9wID0gKG1fY2xlYXJfdmlhX2xvYWRfb3ApID8gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSIDogVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQ7CisgICAgYXR0LnN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFOworICAgIGF0dC5zdGVuY2lsTG9hZE9wID0gVktfQVRUQUNITUVOVF9MT0FEX09QX0RPTlRfQ0FSRTsKKyAgICBhdHQuc3RlbmNpbFN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRTsKKyAgICBhdHQuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgYXR0LmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKworICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSByZWYgPSB7fTsKKyAgICByZWYubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDsKKworICAgIG1fcmVuZGVyUGFzc0NsZWFyVmFsdWVzLmNsZWFyKCk7CisgICAgVmtDbGVhclZhbHVlIGNsZWFyID0ge307CisgICAgY2xlYXIuY29sb3IgPSBtX2NsZWFyX2NvbG9yOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHRhcmdldHM7IGkrKykgeworICAgICAgICBhdHRhY2htZW50cy5wdXNoX2JhY2soYXR0KTsKKworICAgICAgICByZWYuYXR0YWNobWVudCA9IGk7CisgICAgICAgIGNvbG9yX3JlZmVyZW5jZXMucHVzaF9iYWNrKHJlZik7CisKKyAgICAgICAgbV9yZW5kZXJQYXNzQ2xlYXJWYWx1ZXMucHVzaF9iYWNrKGNsZWFyKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmtJbWFnZU9iaj4gaW1nKG5ldyBWa0ltYWdlT2JqKG1fZGV2aWNlKSk7CisKKyAgICAgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIHByb3BzOworCisgICAgICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMobV9kZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBtX3JlbmRlcl90YXJnZXRfZm10LCAmcHJvcHMpOworCisgICAgICAgIGlmIChwcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUKSB7CisgICAgICAgICAgICBpbWctPkluaXQoKHVpbnQzMl90KW1fd2lkdGgsICh1aW50MzJfdCltX2hlaWdodCwgMSwgbV9yZW5kZXJfdGFyZ2V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULAorICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19MSU5FQVIpOworICAgICAgICB9IGVsc2UgaWYgKHByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUKSB7CisgICAgICAgICAgICBpbWctPkluaXQoKHVpbnQzMl90KW1fd2lkdGgsICh1aW50MzJfdCltX2hlaWdodCwgMSwgbV9yZW5kZXJfdGFyZ2V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULAorICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1RJTElOR19PUFRJTUFMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiTmVpdGhlciBMaW5lYXIgbm9yIE9wdGltYWwgYWxsb3dlZCBmb3IgcmVuZGVyIHRhcmdldCI7CisgICAgICAgIH0KKworICAgICAgICBiaW5kaW5ncy5wdXNoX2JhY2soaW1nLT50YXJnZXRWaWV3KG1fcmVuZGVyX3RhcmdldF9mbXQpKTsKKyAgICAgICAgbV9yZW5kZXJUYXJnZXRzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW1nKSk7CisgICAgfQorCisgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gc3VicGFzcyA9IHt9OworICAgIHN1YnBhc3MucGlwZWxpbmVCaW5kUG9pbnQgPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTOworICAgIHN1YnBhc3MuZmxhZ3MgPSAwOworICAgIHN1YnBhc3MuaW5wdXRBdHRhY2htZW50Q291bnQgPSAwOworICAgIHN1YnBhc3MucElucHV0QXR0YWNobWVudHMgPSBOVUxMOworICAgIHN1YnBhc3MuY29sb3JBdHRhY2htZW50Q291bnQgPSB0YXJnZXRzOworICAgIHN1YnBhc3MucENvbG9yQXR0YWNobWVudHMgPSBjb2xvcl9yZWZlcmVuY2VzLmRhdGEoKTsKKyAgICBzdWJwYXNzLnBSZXNvbHZlQXR0YWNobWVudHMgPSBOVUxMOworCisgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlIGRzX3JlZmVyZW5jZTsKKyAgICBpZiAoZHNCaW5kaW5nKSB7CisgICAgICAgIGF0dC5mb3JtYXQgPSBtX2RlcHRoX3N0ZW5jaWxfZm10OworICAgICAgICBhdHQubG9hZE9wID0gKG1fY2xlYXJfdmlhX2xvYWRfb3ApID8gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSIDogVktfQVRUQUNITUVOVF9MT0FEX09QX0xPQUQ7CisgICAgICAgIDsKKyAgICAgICAgYXR0LnN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFOworICAgICAgICBhdHQuc3RlbmNpbExvYWRPcCA9IFZLX0FUVEFDSE1FTlRfTE9BRF9PUF9MT0FEOworICAgICAgICBhdHQuc3RlbmNpbFN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFOworICAgICAgICBhdHQuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDsKKyAgICAgICAgYXR0LmZpbmFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOworICAgICAgICBhdHRhY2htZW50cy5wdXNoX2JhY2soYXR0KTsKKworICAgICAgICBjbGVhci5kZXB0aFN0ZW5jaWwuZGVwdGggPSBtX2RlcHRoX2NsZWFyX2NvbG9yOworICAgICAgICBjbGVhci5kZXB0aFN0ZW5jaWwuc3RlbmNpbCA9IG1fc3RlbmNpbF9jbGVhcl9jb2xvcjsKKyAgICAgICAgbV9yZW5kZXJQYXNzQ2xlYXJWYWx1ZXMucHVzaF9iYWNrKGNsZWFyKTsKKworICAgICAgICBiaW5kaW5ncy5wdXNoX2JhY2soKmRzQmluZGluZyk7CisKKyAgICAgICAgZHNfcmVmZXJlbmNlLmF0dGFjaG1lbnQgPSB0YXJnZXRzOworICAgICAgICBkc19yZWZlcmVuY2UubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9PUFRJTUFMOworICAgICAgICBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gJmRzX3JlZmVyZW5jZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdWJwYXNzLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gTlVMTDsKKyAgICB9CisKKyAgICBzdWJwYXNzLnByZXNlcnZlQXR0YWNobWVudENvdW50ID0gMDsKKyAgICBzdWJwYXNzLnBQcmVzZXJ2ZUF0dGFjaG1lbnRzID0gTlVMTDsKKworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcnBfaW5mbyA9IHt9OworICAgIHJwX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTzsKKyAgICBycF9pbmZvLmF0dGFjaG1lbnRDb3VudCA9IGF0dGFjaG1lbnRzLnNpemUoKTsKKyAgICBycF9pbmZvLnBBdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzLmRhdGEoKTsKKyAgICBycF9pbmZvLnN1YnBhc3NDb3VudCA9IDE7CisgICAgcnBfaW5mby5wU3VicGFzc2VzID0gJnN1YnBhc3M7CisgICAgVmtTdWJwYXNzRGVwZW5kZW5jeSBzdWJwYXNzX2RlcCA9IHt9OworICAgIGlmIChtX2FkZFJlbmRlclBhc3NTZWxmRGVwZW5kZW5jeSkgeworICAgICAgICAvLyBBZGQgYSBzdWJwYXNzIHNlbGYtZGVwZW5kZW5jeSB0byBzdWJwYXNzIDAgb2YgZGVmYXVsdCByZW5kZXJQYXNzCisgICAgICAgIHN1YnBhc3NfZGVwLnNyY1N1YnBhc3MgPSAwOworICAgICAgICBzdWJwYXNzX2RlcC5kc3RTdWJwYXNzID0gMDsKKyAgICAgICAgLy8gSnVzdCB1c2luZyBhbGwgZnJhbWVidWZmZXItc3BhY2UgcGlwZWxpbmUgc3RhZ2VzIGluIG9yZGVyIHRvIGdldCBhIHJlYXNvbmFibHkgbGFyZ2UKKyAgICAgICAgLy8gIHNldCBvZiBiaXRzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGJvdGggc3JjICYgZHN0CisgICAgICAgIHN1YnBhc3NfZGVwLnNyY1N0YWdlTWFzayA9IFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQgfCBWS19QSVBFTElORV9TVEFHRV9FQVJMWV9GUkFHTUVOVF9URVNUU19CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19QSVBFTElORV9TVEFHRV9MQVRFX0ZSQUdNRU5UX1RFU1RTX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0NPTE9SX0FUVEFDSE1FTlRfT1VUUFVUX0JJVDsKKyAgICAgICAgc3VicGFzc19kZXAuZHN0U3RhZ2VNYXNrID0gVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVCB8IFZLX1BJUEVMSU5FX1NUQUdFX0VBUkxZX0ZSQUdNRU5UX1RFU1RTX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0xBVEVfRlJBR01FTlRfVEVTVFNfQklUIHwgVktfUElQRUxJTkVfU1RBR0VfQ09MT1JfQVRUQUNITUVOVF9PVVRQVVRfQklUOworICAgICAgICAvLyBBZGQgYWxsIG9mIHRoZSBnZnggbWVtIGFjY2VzcyBiaXRzIHRoYXQgY29ycmVsYXRlIHRvIHRoZSBmYi1zcGFjZSBwaXBlbGluZSBzdGFnZXMKKyAgICAgICAgc3VicGFzc19kZXAuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19VTklGT1JNX1JFQURfQklUIHwgVktfQUNDRVNTX0lOUFVUX0FUVEFDSE1FTlRfUkVBRF9CSVQgfCBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUIHwgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfUkVBRF9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUIHwgVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9SRUFEX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1dSSVRFX0JJVDsKKyAgICAgICAgc3VicGFzc19kZXAuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19VTklGT1JNX1JFQURfQklUIHwgVktfQUNDRVNTX0lOUFVUX0FUVEFDSE1FTlRfUkVBRF9CSVQgfCBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUIHwgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfUkVBRF9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUIHwgVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9SRUFEX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1dSSVRFX0JJVDsKKyAgICAgICAgLy8gTXVzdCBpbmNsdWRlIGRlcF9ieV9yZWdpb24gYml0IHdoZW4gc3JjICYgZHN0IGJvdGggaW5jbHVkZSBmcmFtZWJ1ZmZlci1zcGFjZSBzdGFnZXMKKyAgICAgICAgc3VicGFzc19kZXAuZGVwZW5kZW5jeUZsYWdzID0gVktfREVQRU5ERU5DWV9CWV9SRUdJT05fQklUOworICAgICAgICBycF9pbmZvLmRlcGVuZGVuY3lDb3VudCA9IDE7CisgICAgICAgIHJwX2luZm8ucERlcGVuZGVuY2llcyA9ICZzdWJwYXNzX2RlcDsKKyAgICB9CisKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhkZXZpY2UoKSwgJnJwX2luZm8sIE5VTEwsICZtX3JlbmRlclBhc3MpOworICAgIHJlbmRlclBhc3NfaW5mb18gPSBycF9pbmZvOyAgLy8gU2F2ZSBhd2F5IGEgY29weSBmb3IgdGVzdHMgdGhhdCBuZWVkIGFjY2VzcyB0byB0aGUgcmVuZGVyIHBhc3Mgc3RhdGUKKyAgICAvLyBDcmVhdGUgRnJhbWVidWZmZXIgYW5kIFJlbmRlclBhc3Mgd2l0aCBjb2xvciBhdHRhY2htZW50cyBhbmQgYW55CisgICAgLy8gZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50CisgICAgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8gZmJfaW5mbyA9IHt9OworICAgIGZiX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9GUkFNRUJVRkZFUl9DUkVBVEVfSU5GTzsKKyAgICBmYl9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBmYl9pbmZvLnJlbmRlclBhc3MgPSBtX3JlbmRlclBhc3M7CisgICAgZmJfaW5mby5hdHRhY2htZW50Q291bnQgPSBiaW5kaW5ncy5zaXplKCk7CisgICAgZmJfaW5mby5wQXR0YWNobWVudHMgPSBiaW5kaW5ncy5kYXRhKCk7CisgICAgZmJfaW5mby53aWR0aCA9ICh1aW50MzJfdCltX3dpZHRoOworICAgIGZiX2luZm8uaGVpZ2h0ID0gKHVpbnQzMl90KW1faGVpZ2h0OworICAgIGZiX2luZm8ubGF5ZXJzID0gMTsKKworICAgIHZrOjpDcmVhdGVGcmFtZWJ1ZmZlcihkZXZpY2UoKSwgJmZiX2luZm8sIE5VTEwsICZtX2ZyYW1lYnVmZmVyKTsKKworICAgIG1fcmVuZGVyUGFzc0JlZ2luSW5mby5yZW5kZXJQYXNzID0gbV9yZW5kZXJQYXNzOworICAgIG1fcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9IG1fZnJhbWVidWZmZXI7CisgICAgbV9yZW5kZXJQYXNzQmVnaW5JbmZvLnJlbmRlckFyZWEuZXh0ZW50LndpZHRoID0gKGludDMyX3QpbV93aWR0aDsKKyAgICBtX3JlbmRlclBhc3NCZWdpbkluZm8ucmVuZGVyQXJlYS5leHRlbnQuaGVpZ2h0ID0gKGludDMyX3QpbV9oZWlnaHQ7CisgICAgbV9yZW5kZXJQYXNzQmVnaW5JbmZvLmNsZWFyVmFsdWVDb3VudCA9IG1fcmVuZGVyUGFzc0NsZWFyVmFsdWVzLnNpemUoKTsKKyAgICBtX3JlbmRlclBhc3NCZWdpbkluZm8ucENsZWFyVmFsdWVzID0gbV9yZW5kZXJQYXNzQ2xlYXJWYWx1ZXMuZGF0YSgpOworfQorCit2b2lkIFZrUmVuZGVyRnJhbWV3b3JrOjpEZXN0cm95UmVuZGVyVGFyZ2V0KCkgeworICAgIHZrOjpEZXN0cm95UmVuZGVyUGFzcyhkZXZpY2UoKSwgbV9yZW5kZXJQYXNzLCBudWxscHRyKTsKKyAgICBtX3JlbmRlclBhc3MgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB2azo6RGVzdHJveUZyYW1lYnVmZmVyKGRldmljZSgpLCBtX2ZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICBtX2ZyYW1lYnVmZmVyID0gVktfTlVMTF9IQU5ETEU7Cit9CisKK1ZrRGV2aWNlT2JqOjpWa0RldmljZU9iaih1aW50MzJfdCBpZCwgVmtQaHlzaWNhbERldmljZSBvYmopIDogdmtfdGVzdGluZzo6RGV2aWNlKG9iaiksIGlkKGlkKSB7CisgICAgaW5pdCgpOworCisgICAgcHJvcHMgPSBwaHkoKS5wcm9wZXJ0aWVzKCk7CisgICAgcXVldWVfcHJvcHMgPSBwaHkoKS5xdWV1ZV9wcm9wZXJ0aWVzKCk7Cit9CisKK1ZrRGV2aWNlT2JqOjpWa0RldmljZU9iaih1aW50MzJfdCBpZCwgVmtQaHlzaWNhbERldmljZSBvYmosIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJmV4dGVuc2lvbl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgKmZlYXR1cmVzLCB2b2lkICpjcmVhdGVfZGV2aWNlX3BuZXh0KQorICAgIDogdmtfdGVzdGluZzo6RGV2aWNlKG9iaiksIGlkKGlkKSB7CisgICAgaW5pdChleHRlbnNpb25fbmFtZXMsIGZlYXR1cmVzLCBjcmVhdGVfZGV2aWNlX3BuZXh0KTsKKworICAgIHByb3BzID0gcGh5KCkucHJvcGVydGllcygpOworICAgIHF1ZXVlX3Byb3BzID0gcGh5KCkucXVldWVfcHJvcGVydGllcygpOworfQorCit1aW50MzJfdCBWa0RldmljZU9iajo6UXVldWVGYW1pbHlNYXRjaGluZyhWa1F1ZXVlRmxhZ3Mgd2l0aCwgVmtRdWV1ZUZsYWdzIHdpdGhvdXQsIGJvb2wgYWxsX2JpdHMpIHsKKyAgICAvLyBGaW5kIGEgcXVldWUgZmFtaWx5IHdpdGggYW5kIHdpdGhvdXQgZGVzaXJlZCBjYXBhYmlsaXRpZXMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcXVldWVfcHJvcHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXV0byBmbGFncyA9IHF1ZXVlX3Byb3BzW2ldLnF1ZXVlRmxhZ3M7CisgICAgICAgIGJvb2wgbWF0Y2hlcyA9IGFsbF9iaXRzID8gKGZsYWdzICYgd2l0aCkgPT0gd2l0aCA6IChmbGFncyAmIHdpdGgpICE9IDA7CisgICAgICAgIGlmIChtYXRjaGVzICYmICgoZmxhZ3MgJiB3aXRob3V0KSA9PSAwKSAmJiAocXVldWVfcHJvcHNbaV0ucXVldWVDb3VudCA+IDApKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVUlOVDMyX01BWDsKK30KKwordm9pZCBWa0RldmljZU9iajo6U2V0RGV2aWNlUXVldWUoKSB7CisgICAgQVNTRVJUX05FKHRydWUsIGdyYXBoaWNzX3F1ZXVlcygpLmVtcHR5KCkpOworICAgIG1fcXVldWUgPSBncmFwaGljc19xdWV1ZXMoKVswXS0+aGFuZGxlKCk7Cit9CisKK1ZrUXVldWVPYmogKlZrRGV2aWNlT2JqOjpHZXREZWZhdWx0UXVldWUoKSB7CisgICAgaWYgKGdyYXBoaWNzX3F1ZXVlcygpLmVtcHR5KCkpIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBncmFwaGljc19xdWV1ZXMoKVswXTsKK30KKworVmtRdWV1ZU9iaiAqVmtEZXZpY2VPYmo6OkdldERlZmF1bHRDb21wdXRlUXVldWUoKSB7CisgICAgaWYgKGNvbXB1dGVfcXVldWVzKCkuZW1wdHkoKSkgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGNvbXB1dGVfcXVldWVzKClbMF07Cit9CisKK1ZrRGVzY3JpcHRvclNldExheW91dE9iajo6VmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqKGNvbnN0IFZrRGV2aWNlT2JqICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nPiAmZGVzY3JpcHRvcl9zZXRfYmluZGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVGbGFncyBmbGFncywgdm9pZCAqcE5leHQpIHsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGRzbF9jaSA9IHt9OworICAgIGRzbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBkc2xfY2kucE5leHQgPSBwTmV4dDsKKyAgICBkc2xfY2kuZmxhZ3MgPSBmbGFnczsKKyAgICBkc2xfY2kuYmluZGluZ0NvdW50ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3Jfc2V0X2JpbmRpbmdzLnNpemUoKSk7CisgICAgZHNsX2NpLnBCaW5kaW5ncyA9IGRlc2NyaXB0b3Jfc2V0X2JpbmRpbmdzLmRhdGEoKTsKKworICAgIGluaXQoKmRldmljZSwgZHNsX2NpKTsKK30KKworVmtEZXNjcmlwdG9yU2V0T2JqOjpWa0Rlc2NyaXB0b3JTZXRPYmooVmtEZXZpY2VPYmogKmRldmljZSkgOiBtX2RldmljZShkZXZpY2UpLCBtX25leHRTbG90KDApIHt9CisKK1ZrRGVzY3JpcHRvclNldE9iajo6flZrRGVzY3JpcHRvclNldE9iaigpIHsKKyAgICBpZiAobV9zZXQpIHsKKyAgICAgICAgZGVsZXRlIG1fc2V0OworICAgIH0KK30KKworaW50IFZrRGVzY3JpcHRvclNldE9iajo6QXBwZW5kRHVtbXkoKSB7CisgICAgLyogcmVxdWVzdCBhIGRlc2NyaXB0b3IgYnV0IGRvIG5vdCB1cGRhdGUgaXQgKi8KKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGJpbmRpbmcgPSB7fTsKKyAgICBiaW5kaW5nLmRlc2NyaXB0b3JUeXBlID0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOworICAgIGJpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBiaW5kaW5nLmJpbmRpbmcgPSBtX2xheW91dF9iaW5kaW5ncy5zaXplKCk7CisgICAgYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0FMTDsKKyAgICBiaW5kaW5nLnBJbW11dGFibGVTYW1wbGVycyA9IE5VTEw7CisKKyAgICBtX2xheW91dF9iaW5kaW5ncy5wdXNoX2JhY2soYmluZGluZyk7CisgICAgbV90eXBlX2NvdW50c1tWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJdICs9IGJpbmRpbmcuZGVzY3JpcHRvckNvdW50OworCisgICAgcmV0dXJuIG1fbmV4dFNsb3QrKzsKK30KKworaW50IFZrRGVzY3JpcHRvclNldE9iajo6QXBwZW5kQnVmZmVyKFZrRGVzY3JpcHRvclR5cGUgdHlwZSwgVmtDb25zdGFudEJ1ZmZlck9iaiAmY29uc3RhbnRCdWZmZXIpIHsKKyAgICBhc3NlcnQodHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVIgfHwgdHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQyB8fAorICAgICAgICAgICB0eXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUiB8fCB0eXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDKTsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nIGJpbmRpbmcgPSB7fTsKKyAgICBiaW5kaW5nLmRlc2NyaXB0b3JUeXBlID0gdHlwZTsKKyAgICBiaW5kaW5nLmRlc2NyaXB0b3JDb3VudCA9IDE7CisgICAgYmluZGluZy5iaW5kaW5nID0gbV9sYXlvdXRfYmluZGluZ3Muc2l6ZSgpOworICAgIGJpbmRpbmcuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9BTEw7CisgICAgYmluZGluZy5wSW1tdXRhYmxlU2FtcGxlcnMgPSBOVUxMOworCisgICAgbV9sYXlvdXRfYmluZGluZ3MucHVzaF9iYWNrKGJpbmRpbmcpOworICAgIG1fdHlwZV9jb3VudHNbdHlwZV0gKz0gYmluZGluZy5kZXNjcmlwdG9yQ291bnQ7CisKKyAgICBtX3dyaXRlcy5wdXNoX2JhY2sodmtfdGVzdGluZzo6RGV2aWNlOjp3cml0ZV9kZXNjcmlwdG9yX3NldCh2a190ZXN0aW5nOjpEZXNjcmlwdG9yU2V0KCksIG1fbmV4dFNsb3QsIDAsIHR5cGUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnN0YW50QnVmZmVyLm1fZGVzY3JpcHRvckJ1ZmZlckluZm8pKTsKKworICAgIHJldHVybiBtX25leHRTbG90Kys7Cit9CisKK2ludCBWa0Rlc2NyaXB0b3JTZXRPYmo6OkFwcGVuZFNhbXBsZXJUZXh0dXJlKFZrU2FtcGxlck9iaiAqc2FtcGxlciwgVmtUZXh0dXJlT2JqICp0ZXh0dXJlKSB7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBiaW5kaW5nID0ge307CisgICAgYmluZGluZy5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOworICAgIGJpbmRpbmcuZGVzY3JpcHRvckNvdW50ID0gMTsKKyAgICBiaW5kaW5nLmJpbmRpbmcgPSBtX2xheW91dF9iaW5kaW5ncy5zaXplKCk7CisgICAgYmluZGluZy5zdGFnZUZsYWdzID0gVktfU0hBREVSX1NUQUdFX0FMTDsKKyAgICBiaW5kaW5nLnBJbW11dGFibGVTYW1wbGVycyA9IE5VTEw7CisKKyAgICBtX2xheW91dF9iaW5kaW5ncy5wdXNoX2JhY2soYmluZGluZyk7CisgICAgbV90eXBlX2NvdW50c1tWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUl0gKz0gYmluZGluZy5kZXNjcmlwdG9yQ291bnQ7CisgICAgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvIHRtcCA9IHRleHR1cmUtPkRlc2NyaXB0b3JJbWFnZUluZm8oKTsKKyAgICB0bXAuc2FtcGxlciA9IHNhbXBsZXItPmhhbmRsZSgpOworICAgIG1faW1hZ2VTYW1wbGVyRGVzY3JpcHRvcnMucHVzaF9iYWNrKHRtcCk7CisKKyAgICBtX3dyaXRlcy5wdXNoX2JhY2sodmtfdGVzdGluZzo6RGV2aWNlOjp3cml0ZV9kZXNjcmlwdG9yX3NldCh2a190ZXN0aW5nOjpEZXNjcmlwdG9yU2V0KCksIG1fbmV4dFNsb3QsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIsIDEsICZ0bXApKTsKKworICAgIHJldHVybiBtX25leHRTbG90Kys7Cit9CisKK1ZrUGlwZWxpbmVMYXlvdXQgVmtEZXNjcmlwdG9yU2V0T2JqOjpHZXRQaXBlbGluZUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIG1fcGlwZWxpbmVfbGF5b3V0LmhhbmRsZSgpOyB9CisKK1ZrRGVzY3JpcHRvclNldCBWa0Rlc2NyaXB0b3JTZXRPYmo6OkdldERlc2NyaXB0b3JTZXRIYW5kbGUoKSBjb25zdCB7CisgICAgaWYgKG1fc2V0KQorICAgICAgICByZXR1cm4gbV9zZXQtPmhhbmRsZSgpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFZLX05VTExfSEFORExFOworfQorCit2b2lkIFZrRGVzY3JpcHRvclNldE9iajo6Q3JlYXRlVktEZXNjcmlwdG9yU2V0KFZrQ29tbWFuZEJ1ZmZlck9iaiAqY29tbWFuZEJ1ZmZlcikgeworICAgIGlmIChtX3R5cGVfY291bnRzLnNpemUoKSkgeworICAgICAgICAvLyBjcmVhdGUgVmtEZXNjcmlwdG9yUG9vbAorICAgICAgICBWa0Rlc2NyaXB0b3JQb29sU2l6ZSBwb29sU2l6ZTsKKyAgICAgICAgdmVjdG9yPFZrRGVzY3JpcHRvclBvb2xTaXplPiBzaXplczsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbV90eXBlX2NvdW50cy5iZWdpbigpOyBpdCAhPSBtX3R5cGVfY291bnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBwb29sU2l6ZS5kZXNjcmlwdG9yQ291bnQgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgcG9vbFNpemUudHlwZSA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIHNpemVzLnB1c2hfYmFjayhwb29sU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gcG9vbCA9IHt9OworICAgICAgICBwb29sLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9QT09MX0NSRUFURV9JTkZPOworICAgICAgICBwb29sLnBvb2xTaXplQ291bnQgPSBzaXplcy5zaXplKCk7CisgICAgICAgIHBvb2wubWF4U2V0cyA9IDE7CisgICAgICAgIHBvb2wucFBvb2xTaXplcyA9IHNpemVzLmRhdGEoKTsKKyAgICAgICAgaW5pdCgqbV9kZXZpY2UsIHBvb2wpOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvIGxheW91dCA9IHt9OworICAgIGxheW91dC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBsYXlvdXQuYmluZGluZ0NvdW50ID0gbV9sYXlvdXRfYmluZGluZ3Muc2l6ZSgpOworICAgIGxheW91dC5wQmluZGluZ3MgPSBtX2xheW91dF9iaW5kaW5ncy5kYXRhKCk7CisKKyAgICBtX2xheW91dC5pbml0KCptX2RldmljZSwgbGF5b3V0KTsKKyAgICB2ZWN0b3I8Y29uc3QgdmtfdGVzdGluZzo6RGVzY3JpcHRvclNldExheW91dCAqPiBsYXlvdXRzOworICAgIGxheW91dHMucHVzaF9iYWNrKCZtX2xheW91dCk7CisKKyAgICAvLyBjcmVhdGUgVmtQaXBlbGluZUxheW91dAorICAgIFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvIHBpcGVsaW5lX2xheW91dCA9IHt9OworICAgIHBpcGVsaW5lX2xheW91dC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBwaXBlbGluZV9sYXlvdXQuc2V0TGF5b3V0Q291bnQgPSBsYXlvdXRzLnNpemUoKTsKKyAgICBwaXBlbGluZV9sYXlvdXQucFNldExheW91dHMgPSBOVUxMOworCisgICAgbV9waXBlbGluZV9sYXlvdXQuaW5pdCgqbV9kZXZpY2UsIHBpcGVsaW5lX2xheW91dCwgbGF5b3V0cyk7CisKKyAgICBpZiAobV90eXBlX2NvdW50cy5zaXplKCkpIHsKKyAgICAgICAgLy8gY3JlYXRlIFZrRGVzY3JpcHRvclNldAorICAgICAgICBtX3NldCA9IGFsbG9jX3NldHMoKm1fZGV2aWNlLCBtX2xheW91dCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHVwZGF0ZSBhcnJheQorICAgICAgICBzaXplX3QgaW1hZ2VTYW1wbGVyQ291bnQgPSAwOworICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPFZrV3JpdGVEZXNjcmlwdG9yU2V0Pjo6aXRlcmF0b3IgaXQgPSBtX3dyaXRlcy5iZWdpbigpOyBpdCAhPSBtX3dyaXRlcy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgaXQtPmRzdFNldCA9IG1fc2V0LT5oYW5kbGUoKTsKKyAgICAgICAgICAgIGlmIChpdC0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIpCisgICAgICAgICAgICAgICAgaXQtPnBJbWFnZUluZm8gPSAmbV9pbWFnZVNhbXBsZXJEZXNjcmlwdG9yc1tpbWFnZVNhbXBsZXJDb3VudCsrXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIHRoZSB1cGRhdGVzCisgICAgICAgIG1fZGV2aWNlLT51cGRhdGVfZGVzY3JpcHRvcl9zZXRzKG1fd3JpdGVzKTsKKyAgICB9Cit9CisKK1ZrUmVuZGVycGFzc09iajo6VmtSZW5kZXJwYXNzT2JqKFZrRGV2aWNlT2JqICpkZXYpIHsKKyAgICAvLyBDcmVhdGUgYSByZW5kZXJQYXNzIHdpdGggYSBzaW5nbGUgY29sb3IgYXR0YWNobWVudAorICAgIFZrQXR0YWNobWVudFJlZmVyZW5jZSBhdHRhY2ggPSB7fTsKKyAgICBhdHRhY2gubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUw7CisKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzID0ge307CisgICAgc3VicGFzcy5wQ29sb3JBdHRhY2htZW50cyA9ICZhdHRhY2g7CisgICAgc3VicGFzcy5jb2xvckF0dGFjaG1lbnRDb3VudCA9IDE7CisKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJwY2kgPSB7fTsKKyAgICBycGNpLnN1YnBhc3NDb3VudCA9IDE7CisgICAgcnBjaS5wU3VicGFzc2VzID0gJnN1YnBhc3M7CisgICAgcnBjaS5hdHRhY2htZW50Q291bnQgPSAxOworCisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNoX2Rlc2MgPSB7fTsKKyAgICBhdHRhY2hfZGVzYy5mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgYXR0YWNoX2Rlc2Muc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBhdHRhY2hfZGVzYy5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRDsKKyAgICBhdHRhY2hfZGVzYy5maW5hbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOworCisgICAgcnBjaS5wQXR0YWNobWVudHMgPSAmYXR0YWNoX2Rlc2M7CisgICAgcnBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0NSRUFURV9JTkZPOworCisgICAgZGV2aWNlID0gZGV2LT5kZXZpY2UoKTsKKyAgICB2azo6Q3JlYXRlUmVuZGVyUGFzcyhkZXZpY2UsICZycGNpLCBOVUxMLCAmbV9yZW5kZXJwYXNzKTsKK30KKworVmtSZW5kZXJwYXNzT2JqOjp+VmtSZW5kZXJwYXNzT2JqKCkgeyB2azo6RGVzdHJveVJlbmRlclBhc3MoZGV2aWNlLCBtX3JlbmRlcnBhc3MsIE5VTEwpOyB9CisKK1ZrSW1hZ2VPYmo6OlZrSW1hZ2VPYmooVmtEZXZpY2VPYmogKmRldikgeworICAgIG1fZGV2aWNlID0gZGV2OworICAgIG1fZGVzY3JpcHRvckltYWdlSW5mby5pbWFnZVZpZXcgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBtX2Rlc2NyaXB0b3JJbWFnZUluZm8uaW1hZ2VMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfR0VORVJBTDsKK30KKworLy8gY2xhbmctZm9ybWF0IG9mZgordm9pZCBWa0ltYWdlT2JqOjpJbWFnZU1lbW9yeUJhcnJpZXIoVmtDb21tYW5kQnVmZmVyT2JqICpjbWRfYnVmLCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGbGFncyBvdXRwdXRfbWFzayAvKj0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19IT1NUX1dSSVRFX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfU0hBREVSX1dSSVRFX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9XUklURV9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX09VVFBVVF9DT1BZX0JJVCovLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmxhZ3MgaW5wdXRfbWFzayAvKj0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19IT1NUX1JFQURfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19JTkRJUkVDVF9DT01NQU5EX1JFQURfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19JTkRFWF9SRUFEX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfVkVSVEVYX0FUVFJJQlVURV9SRUFEX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfVU5JRk9STV9SRUFEX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1JFQURfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfUkVBRF9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX0lOUFVUX0NPUFlfQklUKi8sIFZrSW1hZ2VMYXlvdXQgaW1hZ2VfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjX3N0YWdlcywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZGVzdF9zdGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNRdWV1ZUZhbWlseUluZGV4LCB1aW50MzJfdCBkc3RRdWV1ZUZhbWlseUluZGV4KSB7CisgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgICAgLy8gVE9ETzogTWFsaSBkZXZpY2UgY3Jhc2hpbmcgd2l0aCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUworICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN1YnJlc291cmNlUmFuZ2UgPQorICAgICAgICBzdWJyZXNvdXJjZV9yYW5nZShhc3BlY3QsIDAsIC8qVktfUkVNQUlOSU5HX01JUF9MRVZFTFMqLyAxLCAwLCAxIC8qVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUyovKTsKKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciBiYXJyaWVyOworICAgIGJhcnJpZXIgPSBpbWFnZV9tZW1vcnlfYmFycmllcihvdXRwdXRfbWFzaywgaW5wdXRfbWFzaywgTGF5b3V0KCksIGltYWdlX2xheW91dCwgc3VicmVzb3VyY2VSYW5nZSwgc3JjUXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UXVldWVGYW1pbHlJbmRleCk7CisKKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciAqcG1lbW9yeV9iYXJyaWVyID0gJmJhcnJpZXI7CisKKyAgICAvLyB3cml0ZSBiYXJyaWVyIHRvIHRoZSBjb21tYW5kIGJ1ZmZlcgorICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIoY21kX2J1Zi0+aGFuZGxlKCksIHNyY19zdGFnZXMsIGRlc3Rfc3RhZ2VzLCBWS19ERVBFTkRFTkNZX0JZX1JFR0lPTl9CSVQsIDAsIE5VTEwsIDAsIE5VTEwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWVtb3J5X2JhcnJpZXIpOworfQorCit2b2lkIFZrSW1hZ2VPYmo6OlNldExheW91dChWa0NvbW1hbmRCdWZmZXJPYmogKmNtZF9idWYsIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3QsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VfbGF5b3V0KSB7CisgICAgVmtGbGFncyBzcmNfbWFzaywgZHN0X21hc2s7CisgICAgY29uc3QgVmtGbGFncyBhbGxfY2FjaGVfb3V0cHV0cyA9IFZLX0FDQ0VTU19IT1NUX1dSSVRFX0JJVCB8IFZLX0FDQ0VTU19TSEFERVJfV1JJVEVfQklUIHwgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQUNDRVNTX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9XUklURV9CSVQgfCBWS19BQ0NFU1NfVFJBTlNGRVJfV1JJVEVfQklUOworICAgIGNvbnN0IFZrRmxhZ3MgYWxsX2NhY2hlX2lucHV0cyA9IFZLX0FDQ0VTU19IT1NUX1JFQURfQklUIHwgVktfQUNDRVNTX0lORElSRUNUX0NPTU1BTkRfUkVBRF9CSVQgfCBWS19BQ0NFU1NfSU5ERVhfUkVBRF9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19WRVJURVhfQVRUUklCVVRFX1JFQURfQklUIHwgVktfQUNDRVNTX1VOSUZPUk1fUkVBRF9CSVQgfCBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9SRUFEX0JJVCB8IFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfUkVBRF9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0FDQ0VTU19NRU1PUllfUkVBRF9CSVQ7CisKKyAgICBpZiAoaW1hZ2VfbGF5b3V0ID09IG1fZGVzY3JpcHRvckltYWdlSW5mby5pbWFnZUxheW91dCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChpbWFnZV9sYXlvdXQpIHsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw6CisgICAgICAgICAgICBpZiAobV9kZXNjcmlwdG9ySW1hZ2VJbmZvLmltYWdlTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwpCisgICAgICAgICAgICAgICAgc3JjX21hc2sgPSBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3JjX21hc2sgPSBWS19BQ0NFU1NfVFJBTlNGRVJfV1JJVEVfQklUOworICAgICAgICAgICAgZHN0X21hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUIHwgVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklUOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw6CisgICAgICAgICAgICBpZiAobV9kZXNjcmlwdG9ySW1hZ2VJbmZvLmltYWdlTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwpCisgICAgICAgICAgICAgICAgc3JjX21hc2sgPSBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQ7CisgICAgICAgICAgICBlbHNlIGlmIChtX2Rlc2NyaXB0b3JJbWFnZUluZm8uaW1hZ2VMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTCkKKyAgICAgICAgICAgICAgICBzcmNfbWFzayA9IFZLX0FDQ0VTU19JTlBVVF9BVFRBQ0hNRU5UX1JFQURfQklUOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNyY19tYXNrID0gVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVDsKKyAgICAgICAgICAgIGRzdF9tYXNrID0gVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDoKKyAgICAgICAgICAgIGlmIChtX2Rlc2NyaXB0b3JJbWFnZUluZm8uaW1hZ2VMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMKQorICAgICAgICAgICAgICAgIHNyY19tYXNrID0gVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcmNfbWFzayA9IFZLX0FDQ0VTU19JTlBVVF9BVFRBQ0hNRU5UX1JFQURfQklUOworICAgICAgICAgICAgZHN0X21hc2sgPSBWS19BQ0NFU1NfU0hBREVSX1JFQURfQklUIHwgVktfQUNDRVNTX01FTU9SWV9SRUFEX0JJVDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTDoKKyAgICAgICAgICAgIGlmIChtX2Rlc2NyaXB0b3JJbWFnZUluZm8uaW1hZ2VMYXlvdXQgPT0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMKQorICAgICAgICAgICAgICAgIHNyY19tYXNrID0gVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklUOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNyY19tYXNrID0gMDsKKyAgICAgICAgICAgIGRzdF9tYXNrID0gVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklUOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw6CisgICAgICAgICAgICBkc3RfbWFzayA9IFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklUOworICAgICAgICAgICAgc3JjX21hc2sgPSBhbGxfY2FjaGVfb3V0cHV0czsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzcmNfbWFzayA9IGFsbF9jYWNoZV9vdXRwdXRzOworICAgICAgICAgICAgZHN0X21hc2sgPSBhbGxfY2FjaGVfaW5wdXRzOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1fZGVzY3JpcHRvckltYWdlSW5mby5pbWFnZUxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEKSBzcmNfbWFzayA9IDA7CisKKyAgICBJbWFnZU1lbW9yeUJhcnJpZXIoY21kX2J1ZiwgYXNwZWN0LCBzcmNfbWFzaywgZHN0X21hc2ssIGltYWdlX2xheW91dCk7CisgICAgbV9kZXNjcmlwdG9ySW1hZ2VJbmZvLmltYWdlTGF5b3V0ID0gaW1hZ2VfbGF5b3V0OworfQorCit2b2lkIFZrSW1hZ2VPYmo6OlNldExheW91dChWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0LCBWa0ltYWdlTGF5b3V0IGltYWdlX2xheW91dCkgeworICAgIGlmIChpbWFnZV9sYXlvdXQgPT0gbV9kZXNjcmlwdG9ySW1hZ2VJbmZvLmltYWdlTGF5b3V0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIHBvb2wobV9kZXZpY2UsIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4Xyk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNtZF9idWYobV9kZXZpY2UsICZwb29sKTsKKworICAgIC8qIEJ1aWxkIGNvbW1hbmQgYnVmZmVyIHRvIHNldCBpbWFnZSBsYXlvdXQgaW4gdGhlIGRyaXZlciAqLworICAgIGNtZF9idWYuYmVnaW4oKTsKKyAgICBTZXRMYXlvdXQoJmNtZF9idWYsIGFzcGVjdCwgaW1hZ2VfbGF5b3V0KTsKKyAgICBjbWRfYnVmLmVuZCgpOworCisgICAgY21kX2J1Zi5RdWV1ZUNvbW1hbmRCdWZmZXIoKTsKK30KKworYm9vbCBWa0ltYWdlT2JqOjpJc0NvbXBhdGlibGUoY29uc3QgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2VzLCBjb25zdCBWa0Zvcm1hdEZlYXR1cmVGbGFncyBmZWF0dXJlcykgeworICAgIFZrRm9ybWF0RmVhdHVyZUZsYWdzIGFsbF9mZWF0dXJlX2ZsYWdzID0KKyAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQgfCBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0JJVCB8IFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQVRPTUlDX0JJVCB8CisgICAgICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCB8IFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0JJVCB8CisgICAgICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfVEVYRUxfQlVGRkVSX0FUT01JQ19CSVQgfCBWS19GT1JNQVRfRkVBVFVSRV9WRVJURVhfQlVGRkVSX0JJVCB8CisgICAgICAgIFZLX0ZPUk1BVF9GRUFUVVJFX0NPTE9SX0FUVEFDSE1FTlRfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CTEVORF9CSVQgfAorICAgICAgICBWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9TUkNfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUIHwKKyAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVDsKKyAgICBpZiAobV9kZXZpY2UtPklzRW5hYmxlZEV4dGVuc2lvbihWS19JTUdfRklMVEVSX0NVQklDX0VYVEVOU0lPTl9OQU1FKSkgeworICAgICAgICBhbGxfZmVhdHVyZV9mbGFncyB8PSBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9DVUJJQ19CSVRfSU1HOworICAgIH0KKworICAgIGlmIChtX2RldmljZS0+SXNFbmFibGVkRXh0ZW5zaW9uKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIGFsbF9mZWF0dXJlX2ZsYWdzIHw9IFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX1NSQ19CSVRfS0hSIHwgVktfRk9STUFUX0ZFQVRVUkVfVFJBTlNGRVJfRFNUX0JJVF9LSFI7CisgICAgfQorCisgICAgaWYgKG1fZGV2aWNlLT5Jc0VuYWJsZWRFeHRlbnNpb24oVktfRVhUX1NBTVBMRVJfRklMVEVSX01JTk1BWF9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgYWxsX2ZlYXR1cmVfZmxhZ3MgfD0gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTUlOTUFYX0JJVF9FWFQ7CisgICAgfQorCisgICAgaWYgKG1fZGV2aWNlLT5Jc0VuYWJsZWRFeHRlbnNpb24oVktfS0hSX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9FWFRFTlNJT05fTkFNRSkpIHsKKyAgICAgICAgYWxsX2ZlYXR1cmVfZmxhZ3MgfD0gVktfRk9STUFUX0ZFQVRVUkVfTUlEUE9JTlRfQ0hST01BX1NBTVBMRVNfQklUX0tIUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfWUNCQ1JfQ09OVkVSU0lPTl9MSU5FQVJfRklMVEVSX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fU0VQQVJBVEVfUkVDT05TVFJVQ1RJT05fRklMVEVSX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0JJVF9LSFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX1lDQkNSX0NPTlZFUlNJT05fQ0hST01BX1JFQ09OU1RSVUNUSU9OX0VYUExJQ0lUX0ZPUkNFQUJMRV9CSVRfS0hSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfRElTSk9JTlRfQklUX0tIUiB8IFZLX0ZPUk1BVF9GRUFUVVJFX0NPU0lURURfQ0hST01BX1NBTVBMRVNfQklUX0tIUjsKKyAgICB9CisKKyAgICBpZiAoKGZlYXR1cmVzICYgYWxsX2ZlYXR1cmVfZmxhZ3MpID09IDApIHJldHVybiBmYWxzZTsgIC8vIHdob2xlIGZvcm1hdCB1bnN1cHBvcnRlZAorCisgICAgaWYgKCh1c2FnZXMgJiBWS19JTUFHRV9VU0FHRV9TQU1QTEVEX0JJVCkgJiYgIShmZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICgodXNhZ2VzICYgVktfSU1BR0VfVVNBR0VfU1RPUkFHRV9CSVQpICYmICEoZmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9TVE9SQUdFX0lNQUdFX0JJVCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoKHVzYWdlcyAmIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUKSAmJiAhKGZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCh1c2FnZXMgJiBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKSAmJiAhKGZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX2RldmljZS0+SXNFbmFibGVkRXh0ZW5zaW9uKFZLX0tIUl9NQUlOVEVOQU5DRTFfRVhURU5TSU9OX05BTUUpKSB7CisgICAgICAgIC8vIFdPUktBUk9VTkQ6IGZvciBEZXZTaW0gbm90IHJlcG9ydGluZyBleHRlbmRlZCBlbnVtcywgYW5kIHBvc3NpYmx5IHNvbWUgZHJpdmVycyB0b28KKyAgICAgICAgY29uc3QgYXV0byBhbGxfbm9udHJhbnNmZXJfZmVhdHVyZV9mbGFncyA9CisgICAgICAgICAgICBhbGxfZmVhdHVyZV9mbGFncyBeIChWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUX0tIUiB8IFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVRfS0hSKTsKKyAgICAgICAgY29uc3QgYm9vbCB0cmFuc2Zlcl9wcm9iYWJseV9zdXBwb3J0ZWRfYW55d2F5ID0gKGZlYXR1cmVzICYgYWxsX25vbnRyYW5zZmVyX2ZlYXR1cmVfZmxhZ3MpID4gMDsKKyAgICAgICAgaWYgKCF0cmFuc2Zlcl9wcm9iYWJseV9zdXBwb3J0ZWRfYW55d2F5KSB7CisgICAgICAgICAgICBpZiAoKHVzYWdlcyAmIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQpICYmICEoZmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9UUkFOU0ZFUl9TUkNfQklUX0tIUikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICgodXNhZ2VzICYgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCkgJiYgIShmZWF0dXJlcyAmIFZLX0ZPUk1BVF9GRUFUVVJFX1RSQU5TRkVSX0RTVF9CSVRfS0hSKSkgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVmtJbWFnZU9iajo6SW5pdE5vTGF5b3V0KHVpbnQzMl90IGNvbnN0IHdpZHRoLCB1aW50MzJfdCBjb25zdCBoZWlnaHQsIHVpbnQzMl90IGNvbnN0IG1pcExldmVscywgVmtGb3JtYXQgY29uc3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGbGFncyBjb25zdCB1c2FnZSwgVmtJbWFnZVRpbGluZyBjb25zdCByZXF1ZXN0ZWRfdGlsaW5nLCBWa01lbW9yeVByb3BlcnR5RmxhZ3MgY29uc3QgcmVxcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqcXVldWVfZmFtaWxpZXMsIGJvb2wgbWVtb3J5KSB7CisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGltYWdlX2ZtdDsKKyAgICBWa0ltYWdlVGlsaW5nIHRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworCisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIGZvcm1hdCwgJmltYWdlX2ZtdCk7CisKKyAgICBpZiAocmVxdWVzdGVkX3RpbGluZyA9PSBWS19JTUFHRV9USUxJTkdfTElORUFSKSB7CisgICAgICAgIGlmIChJc0NvbXBhdGlibGUodXNhZ2UsIGltYWdlX2ZtdC5saW5lYXJUaWxpbmdGZWF0dXJlcykpIHsKKyAgICAgICAgICAgIHRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19MSU5FQVI7CisgICAgICAgIH0gZWxzZSBpZiAoSXNDb21wYXRpYmxlKHVzYWdlLCBpbWFnZV9mbXQub3B0aW1hbFRpbGluZ0ZlYXR1cmVzKSkgeworICAgICAgICAgICAgdGlsaW5nID0gVktfSU1BR0VfVElMSU5HX09QVElNQUw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGQUlMKCkgPDwgIlZrSW1hZ2VPYmo6OmluaXQoKSBlcnJvcjogdW5zdXBwb3J0ZWQgdGlsaW5nIGNvbmZpZ3VyYXRpb24uIFVzYWdlOiAiIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2hvd2Jhc2UgPDwgdXNhZ2UKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBzdXBwb3J0ZWQgbGluZWFyIGZlYXR1cmVzOiAiIDw8IGltYWdlX2ZtdC5saW5lYXJUaWxpbmdGZWF0dXJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoSXNDb21wYXRpYmxlKHVzYWdlLCBpbWFnZV9mbXQub3B0aW1hbFRpbGluZ0ZlYXR1cmVzKSkgeworICAgICAgICB0aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICB9IGVsc2UgaWYgKElzQ29tcGF0aWJsZSh1c2FnZSwgaW1hZ2VfZm10LmxpbmVhclRpbGluZ0ZlYXR1cmVzKSkgeworICAgICAgICB0aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfTElORUFSOworICAgIH0gZWxzZSB7CisgICAgICAgIEZBSUwoKSA8PCAiVmtJbWFnZU9iajo6aW5pdCgpIGVycm9yOiB1bnN1cHBvcnRlZCB0aWxpbmcgY29uZmlndXJhdGlvbi4gVXNhZ2U6ICIgPDwgc3RkOjpoZXggPDwgc3RkOjpzaG93YmFzZSA8PCB1c2FnZQorICAgICAgICAgICAgICAgPDwgIiwgc3VwcG9ydGVkIG9wdGltYWwgZmVhdHVyZXM6ICIgPDwgaW1hZ2VfZm10Lm9wdGltYWxUaWxpbmdGZWF0dXJlczsKKyAgICB9CisKKyAgICBWa0ltYWdlQ3JlYXRlSW5mbyBpbWFnZUNyZWF0ZUluZm8gPSB2a190ZXN0aW5nOjpJbWFnZTo6Y3JlYXRlX2luZm8oKTsKKyAgICBpbWFnZUNyZWF0ZUluZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWFnZUNyZWF0ZUluZm8uZm9ybWF0ID0gZm9ybWF0OworICAgIGltYWdlQ3JlYXRlSW5mby5leHRlbnQud2lkdGggPSB3aWR0aDsKKyAgICBpbWFnZUNyZWF0ZUluZm8uZXh0ZW50LmhlaWdodCA9IGhlaWdodDsKKyAgICBpbWFnZUNyZWF0ZUluZm8ubWlwTGV2ZWxzID0gbWlwTGV2ZWxzOworICAgIGltYWdlQ3JlYXRlSW5mby50aWxpbmcgPSB0aWxpbmc7CisgICAgaW1hZ2VDcmVhdGVJbmZvLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVEOworCisgICAgLy8gQXV0b21hdGljYWxseSBzZXQgc2hhcmluZyBtb2RlIGV0Yy4gYmFzZWQgb24gcXVldWUgZmFtaWx5IGluZm9ybWF0aW9uCisgICAgaWYgKHF1ZXVlX2ZhbWlsaWVzICYmIChxdWV1ZV9mYW1pbGllcy0+c2l6ZSgpID4gMSkpIHsKKyAgICAgICAgaW1hZ2VDcmVhdGVJbmZvLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQ7CisgICAgICAgIGltYWdlQ3JlYXRlSW5mby5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocXVldWVfZmFtaWxpZXMtPnNpemUoKSk7CisgICAgICAgIGltYWdlQ3JlYXRlSW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gcXVldWVfZmFtaWxpZXMtPmRhdGEoKTsKKyAgICB9CisKKyAgICBMYXlvdXQoaW1hZ2VDcmVhdGVJbmZvLmluaXRpYWxMYXlvdXQpOworICAgIGltYWdlQ3JlYXRlSW5mby51c2FnZSA9IHVzYWdlOworICAgIGlmIChtZW1vcnkpCisgICAgICAgIHZrX3Rlc3Rpbmc6OkltYWdlOjppbml0KCptX2RldmljZSwgaW1hZ2VDcmVhdGVJbmZvLCByZXFzKTsKKyAgICBlbHNlCisgICAgICAgIHZrX3Rlc3Rpbmc6OkltYWdlOjppbml0X25vX21lbSgqbV9kZXZpY2UsIGltYWdlQ3JlYXRlSW5mbyk7Cit9CisKK3ZvaWQgVmtJbWFnZU9iajo6SW5pdCh1aW50MzJfdCBjb25zdCB3aWR0aCwgdWludDMyX3QgY29uc3QgaGVpZ2h0LCB1aW50MzJfdCBjb25zdCBtaXBMZXZlbHMsIFZrRm9ybWF0IGNvbnN0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBWa0ZsYWdzIGNvbnN0IHVzYWdlLCBWa0ltYWdlVGlsaW5nIGNvbnN0IHJlcXVlc3RlZF90aWxpbmcsIFZrTWVtb3J5UHJvcGVydHlGbGFncyBjb25zdCByZXFzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqcXVldWVfZmFtaWxpZXMsIGJvb2wgbWVtb3J5KSB7CisgICAgSW5pdE5vTGF5b3V0KHdpZHRoLCBoZWlnaHQsIG1pcExldmVscywgZm9ybWF0LCB1c2FnZSwgcmVxdWVzdGVkX3RpbGluZywgcmVxcywgcXVldWVfZmFtaWxpZXMsIG1lbW9yeSk7CisKKyAgICBpZiAoIWluaXRpYWxpemVkKCkgfHwgIW1lbW9yeSkgcmV0dXJuOyAgLy8gV2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIGhhbmRsZSBmcm9tIGVhcmx5IHN0YWdlIGluaXQsIGFuZCB0aHVzIFNldExheW91dCB3aWxsIGZhaWwKKworICAgIFZrSW1hZ2VMYXlvdXQgbmV3TGF5b3V0OworICAgIGlmICh1c2FnZSAmIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUKQorICAgICAgICBuZXdMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMOworICAgIGVsc2UgaWYgKHVzYWdlICYgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQpCisgICAgICAgIG5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw7CisgICAgZWxzZQorICAgICAgICBuZXdMYXlvdXQgPSBtX2Rlc2NyaXB0b3JJbWFnZUluZm8uaW1hZ2VMYXlvdXQ7CisKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgaW1hZ2VfYXNwZWN0ID0gMDsKKyAgICBpZiAoRm9ybWF0SXNEZXB0aEFuZFN0ZW5jaWwoZm9ybWF0KSkgeworICAgICAgICBpbWFnZV9hc3BlY3QgPSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIH0gZWxzZSBpZiAoRm9ybWF0SXNEZXB0aE9ubHkoZm9ybWF0KSkgeworICAgICAgICBpbWFnZV9hc3BlY3QgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIH0gZWxzZSBpZiAoRm9ybWF0SXNTdGVuY2lsT25seShmb3JtYXQpKSB7CisgICAgICAgIGltYWdlX2FzcGVjdCA9IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKyAgICB9IGVsc2UgeyAgLy8gY29sb3IKKyAgICAgICAgaW1hZ2VfYXNwZWN0ID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICB9CisgICAgU2V0TGF5b3V0KGltYWdlX2FzcGVjdCwgbmV3TGF5b3V0KTsKK30KKwordm9pZCBWa0ltYWdlT2JqOjppbml0KGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICpjcmVhdGVfaW5mbykgeworICAgIFZrRm9ybWF0UHJvcGVydGllcyBpbWFnZV9mbXQ7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhtX2RldmljZS0+cGh5KCkuaGFuZGxlKCksIGNyZWF0ZV9pbmZvLT5mb3JtYXQsICZpbWFnZV9mbXQpOworCisgICAgc3dpdGNoIChjcmVhdGVfaW5mby0+dGlsaW5nKSB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVElMSU5HX09QVElNQUw6CisgICAgICAgICAgICBpZiAoIUlzQ29tcGF0aWJsZShjcmVhdGVfaW5mby0+dXNhZ2UsIGltYWdlX2ZtdC5vcHRpbWFsVGlsaW5nRmVhdHVyZXMpKSB7CisgICAgICAgICAgICAgICAgRkFJTCgpIDw8ICJWa0ltYWdlT2JqOjppbml0KCkgZXJyb3I6IHVuc3VwcG9ydGVkIHRpbGluZyBjb25maWd1cmF0aW9uLiBVc2FnZTogIiA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNob3diYXNlCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGNyZWF0ZV9pbmZvLT51c2FnZSA8PCAiLCBzdXBwb3J0ZWQgb3B0aW1hbCBmZWF0dXJlczogIiA8PCBpbWFnZV9mbXQub3B0aW1hbFRpbGluZ0ZlYXR1cmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVElMSU5HX0xJTkVBUjoKKyAgICAgICAgICAgIGlmICghSXNDb21wYXRpYmxlKGNyZWF0ZV9pbmZvLT51c2FnZSwgaW1hZ2VfZm10LmxpbmVhclRpbGluZ0ZlYXR1cmVzKSkgeworICAgICAgICAgICAgICAgIEZBSUwoKSA8PCAiVmtJbWFnZU9iajo6aW5pdCgpIGVycm9yOiB1bnN1cHBvcnRlZCB0aWxpbmcgY29uZmlndXJhdGlvbi4gVXNhZ2U6ICIgPDwgc3RkOjpoZXggPDwgc3RkOjpzaG93YmFzZQorICAgICAgICAgICAgICAgICAgICAgICA8PCBjcmVhdGVfaW5mby0+dXNhZ2UgPDwgIiwgc3VwcG9ydGVkIGxpbmVhciBmZWF0dXJlczogIiA8PCBpbWFnZV9mbXQubGluZWFyVGlsaW5nRmVhdHVyZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBMYXlvdXQoY3JlYXRlX2luZm8tPmluaXRpYWxMYXlvdXQpOworCisgICAgdmtfdGVzdGluZzo6SW1hZ2U6OmluaXQoKm1fZGV2aWNlLCAqY3JlYXRlX2luZm8sIDApOworCisgICAgVmtJbWFnZUFzcGVjdEZsYWdzIGltYWdlX2FzcGVjdCA9IDA7CisgICAgaWYgKEZvcm1hdElzRGVwdGhBbmRTdGVuY2lsKGNyZWF0ZV9pbmZvLT5mb3JtYXQpKSB7CisgICAgICAgIGltYWdlX2FzcGVjdCA9IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgfSBlbHNlIGlmIChGb3JtYXRJc0RlcHRoT25seShjcmVhdGVfaW5mby0+Zm9ybWF0KSkgeworICAgICAgICBpbWFnZV9hc3BlY3QgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgIH0gZWxzZSBpZiAoRm9ybWF0SXNTdGVuY2lsT25seShjcmVhdGVfaW5mby0+Zm9ybWF0KSkgeworICAgICAgICBpbWFnZV9hc3BlY3QgPSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgfSBlbHNlIHsgIC8vIGNvbG9yCisgICAgICAgIGltYWdlX2FzcGVjdCA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgfQorICAgIFNldExheW91dChpbWFnZV9hc3BlY3QsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMKTsKK30KKworVmtSZXN1bHQgVmtJbWFnZU9iajo6Q29weUltYWdlKFZrSW1hZ2VPYmogJnNyY19pbWFnZSkgeworICAgIFZrSW1hZ2VMYXlvdXQgc3JjX2ltYWdlX2xheW91dCwgZGVzdF9pbWFnZV9sYXlvdXQ7CisKKyAgICBWa0NvbW1hbmRQb29sT2JqIHBvb2wobV9kZXZpY2UsIG1fZGV2aWNlLT5ncmFwaGljc19xdWV1ZV9ub2RlX2luZGV4Xyk7CisgICAgVmtDb21tYW5kQnVmZmVyT2JqIGNtZF9idWYobV9kZXZpY2UsICZwb29sKTsKKworICAgIC8qIEJ1aWxkIGNvbW1hbmQgYnVmZmVyIHRvIGNvcHkgc3RhZ2luZyB0ZXh0dXJlIHRvIHVzYWJsZSB0ZXh0dXJlICovCisgICAgY21kX2J1Zi5iZWdpbigpOworCisgICAgLyogVE9ETzogQ2FuIHdlIGRldGVybWluZSBpbWFnZSBhc3BlY3QgZnJvbSBpbWFnZSBvYmplY3Q/ICovCisgICAgc3JjX2ltYWdlX2xheW91dCA9IHNyY19pbWFnZS5MYXlvdXQoKTsKKyAgICBzcmNfaW1hZ2UuU2V0TGF5b3V0KCZjbWRfYnVmLCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwpOworCisgICAgZGVzdF9pbWFnZV9sYXlvdXQgPSAodGhpcy0+TGF5b3V0KCkgPT0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCkgPyBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCA6IHRoaXMtPkxheW91dCgpOworICAgIHRoaXMtPlNldExheW91dCgmY21kX2J1ZiwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMKTsKKworICAgIFZrSW1hZ2VDb3B5IGNvcHlfcmVnaW9uID0ge307CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQueCA9IDA7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0LnkgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY09mZnNldC56ID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldC54ID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQueSA9IDA7CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0LnogPSAwOworICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IHNyY19pbWFnZS5leHRlbnQoKTsKKworICAgIHZrOjpDbWRDb3B5SW1hZ2UoY21kX2J1Zi5oYW5kbGUoKSwgc3JjX2ltYWdlLmhhbmRsZSgpLCBzcmNfaW1hZ2UuTGF5b3V0KCksIGhhbmRsZSgpLCBMYXlvdXQoKSwgMSwgJmNvcHlfcmVnaW9uKTsKKworICAgIHNyY19pbWFnZS5TZXRMYXlvdXQoJmNtZF9idWYsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIHNyY19pbWFnZV9sYXlvdXQpOworCisgICAgdGhpcy0+U2V0TGF5b3V0KCZjbWRfYnVmLCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBkZXN0X2ltYWdlX2xheW91dCk7CisKKyAgICBjbWRfYnVmLmVuZCgpOworCisgICAgY21kX2J1Zi5RdWV1ZUNvbW1hbmRCdWZmZXIoKTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisvLyBTYW1lIGFzIENvcHlJbWFnZSwgYnV0IGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24KK1ZrUmVzdWx0IFZrSW1hZ2VPYmo6OkNvcHlJbWFnZU91dChWa0ltYWdlT2JqICZkc3RfaW1hZ2UpIHsKKyAgICBWa0ltYWdlTGF5b3V0IHNyY19pbWFnZV9sYXlvdXQsIGRlc3RfaW1hZ2VfbGF5b3V0OworCisgICAgVmtDb21tYW5kUG9vbE9iaiBwb29sKG1fZGV2aWNlLCBtX2RldmljZS0+Z3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8pOworICAgIFZrQ29tbWFuZEJ1ZmZlck9iaiBjbWRfYnVmKG1fZGV2aWNlLCAmcG9vbCk7CisKKyAgICBjbWRfYnVmLmJlZ2luKCk7CisKKyAgICBzcmNfaW1hZ2VfbGF5b3V0ID0gdGhpcy0+TGF5b3V0KCk7CisgICAgdGhpcy0+U2V0TGF5b3V0KCZjbWRfYnVmLCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwpOworCisgICAgZGVzdF9pbWFnZV9sYXlvdXQgPSAoZHN0X2ltYWdlLkxheW91dCgpID09IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQpID8gVktfSU1BR0VfTEFZT1VUX0dFTkVSQUwgOiBkc3RfaW1hZ2UuTGF5b3V0KCk7CisgICAgZHN0X2ltYWdlLlNldExheW91dCgmY21kX2J1ZiwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMKTsKKworICAgIFZrSW1hZ2VDb3B5IGNvcHlfcmVnaW9uID0ge307CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgY29weV9yZWdpb24uc3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY1N1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5zcmNTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICBjb3B5X3JlZ2lvbi5zcmNPZmZzZXQueCA9IDA7CisgICAgY29weV9yZWdpb24uc3JjT2Zmc2V0LnkgPSAwOworICAgIGNvcHlfcmVnaW9uLnNyY09mZnNldC56ID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgY29weV9yZWdpb24uZHN0U3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgIGNvcHlfcmVnaW9uLmRzdFN1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgIGNvcHlfcmVnaW9uLmRzdE9mZnNldC54ID0gMDsKKyAgICBjb3B5X3JlZ2lvbi5kc3RPZmZzZXQueSA9IDA7CisgICAgY29weV9yZWdpb24uZHN0T2Zmc2V0LnogPSAwOworICAgIGNvcHlfcmVnaW9uLmV4dGVudCA9IGRzdF9pbWFnZS5leHRlbnQoKTsKKworICAgIHZrOjpDbWRDb3B5SW1hZ2UoY21kX2J1Zi5oYW5kbGUoKSwgaGFuZGxlKCksIExheW91dCgpLCBkc3RfaW1hZ2UuaGFuZGxlKCksIGRzdF9pbWFnZS5MYXlvdXQoKSwgMSwgJmNvcHlfcmVnaW9uKTsKKworICAgIHRoaXMtPlNldExheW91dCgmY21kX2J1ZiwgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgc3JjX2ltYWdlX2xheW91dCk7CisKKyAgICBkc3RfaW1hZ2UuU2V0TGF5b3V0KCZjbWRfYnVmLCBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBkZXN0X2ltYWdlX2xheW91dCk7CisKKyAgICBjbWRfYnVmLmVuZCgpOworCisgICAgY21kX2J1Zi5RdWV1ZUNvbW1hbmRCdWZmZXIoKTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisvLyBSZXR1cm4gMTZ4MTYgcGl4ZWwgYmxvY2sKK3N0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50MzJfdCwgMTY+LCAxNj4gVmtJbWFnZU9iajo6UmVhZCgpIHsKKyAgICBWa0ltYWdlT2JqIHN0YWdpbmdJbWFnZShtX2RldmljZSk7CisgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIHJlcXMgPSBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVDsKKworICAgIHN0YWdpbmdJbWFnZS5Jbml0KDE2LCAxNiwgMSwgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfTElORUFSLCByZXFzKTsKKyAgICBzdGFnaW5nSW1hZ2UuU2V0TGF5b3V0KFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMKTsKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0IGxheW91dCA9IHN0YWdpbmdJbWFnZS5zdWJyZXNvdXJjZV9sYXlvdXQoc3VicmVzb3VyY2UoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMCkpOworICAgIENvcHlJbWFnZU91dChzdGFnaW5nSW1hZ2UpOworICAgIHZvaWQgKmRhdGEgPSBzdGFnaW5nSW1hZ2UuTWFwTWVtb3J5KCk7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQzMl90LCAxNj4sIDE2PiBtID0ge307CisgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IHN0YWdpbmdJbWFnZS5leHRlbnQoKS5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgdWludDMyX3QgKnJvdyA9ICh1aW50MzJfdCAqKSgoY2hhciAqKWRhdGEgKyBsYXlvdXQucm93UGl0Y2ggKiB5KTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCBzdGFnaW5nSW1hZ2UuZXh0ZW50KCkud2lkdGg7IHgrKykgbVt5XVt4XSA9IHJvd1t4XTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGFnaW5nSW1hZ2UuVW5tYXBNZW1vcnkoKTsKKyAgICByZXR1cm4gbTsKK30KKworVmtUZXh0dXJlT2JqOjpWa1RleHR1cmVPYmooVmtEZXZpY2VPYmogKmRldmljZSwgdWludDMyX3QgKmNvbG9ycykgOiBWa0ltYWdlT2JqKGRldmljZSkgeworICAgIG1fZGV2aWNlID0gZGV2aWNlOworICAgIGNvbnN0IFZrRm9ybWF0IHRleF9mb3JtYXQgPSBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgdWludDMyX3QgdGV4X2NvbG9yc1syXSA9IHsweGZmZmYwMDAwLCAweGZmMDBmZjAwfTsKKyAgICB2b2lkICpkYXRhOworICAgIHVpbnQzMl90IHgsIHk7CisgICAgVmtJbWFnZU9iaiBzdGFnaW5nSW1hZ2UoZGV2aWNlKTsKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUOworCisgICAgc3RhZ2luZ0ltYWdlLkluaXQoMTYsIDE2LCAxLCB0ZXhfZm9ybWF0LCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9USUxJTkdfTElORUFSLCByZXFzKTsKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0IGxheW91dCA9IHN0YWdpbmdJbWFnZS5zdWJyZXNvdXJjZV9sYXlvdXQoc3VicmVzb3VyY2UoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMCkpOworCisgICAgaWYgKGNvbG9ycyA9PSBOVUxMKSBjb2xvcnMgPSB0ZXhfY29sb3JzOworCisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIHZpZXcgPSB7fTsKKyAgICB2aWV3LnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICB2aWV3LnBOZXh0ID0gTlVMTDsKKyAgICB2aWV3LmltYWdlID0gVktfTlVMTF9IQU5ETEU7CisgICAgdmlldy52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICB2aWV3LmZvcm1hdCA9IHRleF9mb3JtYXQ7CisgICAgdmlldy5jb21wb25lbnRzLnIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9SOworICAgIHZpZXcuY29tcG9uZW50cy5nID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfRzsKKyAgICB2aWV3LmNvbXBvbmVudHMuYiA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0I7CisgICAgdmlldy5jb21wb25lbnRzLmEgPSBWS19DT01QT05FTlRfU1dJWlpMRV9BOworICAgIHZpZXcuc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICB2aWV3LnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICB2aWV3LnN1YnJlc291cmNlUmFuZ2UubGV2ZWxDb3VudCA9IDE7CisgICAgdmlldy5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICB2aWV3LnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisKKyAgICAvKiBjcmVhdGUgaW1hZ2UgKi8KKyAgICBJbml0KDE2LCAxNiwgMSwgdGV4X2Zvcm1hdCwgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQgfCBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9EU1RfQklULCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCk7CisgICAgc3RhZ2luZ0ltYWdlLlNldExheW91dChWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCBWS19JTUFHRV9MQVlPVVRfR0VORVJBTCk7CisKKyAgICAvKiBjcmVhdGUgaW1hZ2UgdmlldyAqLworICAgIHZpZXcuaW1hZ2UgPSBoYW5kbGUoKTsKKyAgICBtX3RleHR1cmVWaWV3LmluaXQoKm1fZGV2aWNlLCB2aWV3KTsKKyAgICBtX2Rlc2NyaXB0b3JJbWFnZUluZm8uaW1hZ2VWaWV3ID0gbV90ZXh0dXJlVmlldy5oYW5kbGUoKTsKKworICAgIGRhdGEgPSBzdGFnaW5nSW1hZ2UuTWFwTWVtb3J5KCk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgZXh0ZW50KCkuaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgdWludDMyX3QgKnJvdyA9ICh1aW50MzJfdCAqKSgoY2hhciAqKWRhdGEgKyBsYXlvdXQucm93UGl0Y2ggKiB5KTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGV4dGVudCgpLndpZHRoOyB4KyspIHJvd1t4XSA9IGNvbG9yc1soeCAmIDEpIF4gKHkgJiAxKV07CisgICAgfQorICAgIHN0YWdpbmdJbWFnZS5Vbm1hcE1lbW9yeSgpOworICAgIHN0YWdpbmdJbWFnZS5TZXRMYXlvdXQoVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMKTsKKyAgICBWa0ltYWdlT2JqOjpDb3B5SW1hZ2Uoc3RhZ2luZ0ltYWdlKTsKK30KKworVmtTYW1wbGVyT2JqOjpWa1NhbXBsZXJPYmooVmtEZXZpY2VPYmogKmRldmljZSkgeworICAgIG1fZGV2aWNlID0gZGV2aWNlOworCisgICAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzYW1wbGVyQ3JlYXRlSW5mbzsKKyAgICBtZW1zZXQoJnNhbXBsZXJDcmVhdGVJbmZvLCAwLCBzaXplb2Yoc2FtcGxlckNyZWF0ZUluZm8pKTsKKyAgICBzYW1wbGVyQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk87CisgICAgc2FtcGxlckNyZWF0ZUluZm8ubWFnRmlsdGVyID0gVktfRklMVEVSX05FQVJFU1Q7CisgICAgc2FtcGxlckNyZWF0ZUluZm8ubWluRmlsdGVyID0gVktfRklMVEVSX05FQVJFU1Q7CisgICAgc2FtcGxlckNyZWF0ZUluZm8ubWlwbWFwTW9kZSA9IFZLX1NBTVBMRVJfTUlQTUFQX01PREVfTkVBUkVTVDsKKyAgICBzYW1wbGVyQ3JlYXRlSW5mby5hZGRyZXNzTW9kZVUgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9SRVBFQVQ7CisgICAgc2FtcGxlckNyZWF0ZUluZm8uYWRkcmVzc01vZGVWID0gVktfU0FNUExFUl9BRERSRVNTX01PREVfUkVQRUFUOworICAgIHNhbXBsZXJDcmVhdGVJbmZvLmFkZHJlc3NNb2RlVyA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX1JFUEVBVDsKKyAgICBzYW1wbGVyQ3JlYXRlSW5mby5taXBMb2RCaWFzID0gMC4wOworICAgIHNhbXBsZXJDcmVhdGVJbmZvLmFuaXNvdHJvcHlFbmFibGUgPSBWS19GQUxTRTsKKyAgICBzYW1wbGVyQ3JlYXRlSW5mby5tYXhBbmlzb3Ryb3B5ID0gMTsKKyAgICBzYW1wbGVyQ3JlYXRlSW5mby5jb21wYXJlT3AgPSBWS19DT01QQVJFX09QX05FVkVSOworICAgIHNhbXBsZXJDcmVhdGVJbmZvLm1pbkxvZCA9IDAuMDsKKyAgICBzYW1wbGVyQ3JlYXRlSW5mby5tYXhMb2QgPSAwLjA7CisgICAgc2FtcGxlckNyZWF0ZUluZm8uYm9yZGVyQ29sb3IgPSBWS19CT1JERVJfQ09MT1JfRkxPQVRfT1BBUVVFX1dISVRFOworICAgIHNhbXBsZXJDcmVhdGVJbmZvLnVubm9ybWFsaXplZENvb3JkaW5hdGVzID0gVktfRkFMU0U7CisKKyAgICBpbml0KCptX2RldmljZSwgc2FtcGxlckNyZWF0ZUluZm8pOworfQorCisvKgorICogQmFzaWMgQ29uc3RhbnRCdWZmZXIgY29uc3RydWN0b3IuIFRoZW4gdXNlIGNyZWF0ZSBtZXRob2RzIHRvIGZpbGwgaW4gdGhlCisgKiBkZXRhaWxzLgorICovCitWa0NvbnN0YW50QnVmZmVyT2JqOjpWa0NvbnN0YW50QnVmZmVyT2JqKFZrRGV2aWNlT2JqICpkZXZpY2UsIFZrQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgeworICAgIG1fZGV2aWNlID0gZGV2aWNlOworCisgICAgbWVtc2V0KCZtX2Rlc2NyaXB0b3JCdWZmZXJJbmZvLCAwLCBzaXplb2YobV9kZXNjcmlwdG9yQnVmZmVySW5mbykpOworCisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB1c2FnZXMgb3V0c2lkZSBvZiBvcmlnaW5hbCBsaW1pdHMgb2YgZnJhbWV3b3JrCisgICAgaWYgKChWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKSAhPSB1c2FnZSkgeworICAgICAgICBpbml0X25vX21lbSgqbV9kZXZpY2UsIGNyZWF0ZV9pbmZvKDAsIHVzYWdlKSk7CisgICAgfQorfQorCitWa0NvbnN0YW50QnVmZmVyT2JqOjpWa0NvbnN0YW50QnVmZmVyT2JqKFZrRGV2aWNlT2JqICpkZXZpY2UsIFZrRGV2aWNlU2l6ZSBhbGxvY2F0aW9uU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKSB7CisgICAgbV9kZXZpY2UgPSBkZXZpY2U7CisKKyAgICBtZW1zZXQoJm1fZGVzY3JpcHRvckJ1ZmZlckluZm8sIDAsIHNpemVvZihtX2Rlc2NyaXB0b3JCdWZmZXJJbmZvKSk7CisKKyAgICBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUOworCisgICAgaWYgKChWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKSA9PSB1c2FnZSkgeworICAgICAgICBpbml0X2FzX3NyY19hbmRfZHN0KCptX2RldmljZSwgYWxsb2NhdGlvblNpemUsIHJlcXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluaXQoKm1fZGV2aWNlLCBjcmVhdGVfaW5mbyhhbGxvY2F0aW9uU2l6ZSwgdXNhZ2UpLCByZXFzKTsKKyAgICB9CisKKyAgICB2b2lkICpwRGF0YSA9IG1lbW9yeSgpLm1hcCgpOworICAgIG1lbWNweShwRGF0YSwgZGF0YSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihhbGxvY2F0aW9uU2l6ZSkpOworICAgIG1lbW9yeSgpLnVubWFwKCk7CisKKyAgICAvKgorICAgICAqIENvbnN0YW50IGJ1ZmZlcnMgYXJlIGdvaW5nIHRvIGJlIHVzZWQgYXMgdmVydGV4IGlucHV0IGJ1ZmZlcnMKKyAgICAgKiBvciBhcyBzaGFkZXIgdW5pZm9ybSBidWZmZXJzLiBTbywgd2UnbGwgY3JlYXRlIHRoZSBzaGFkZXJidWZmZXIKKyAgICAgKiBkZXNjcmlwdG9yIGhlcmUgc28gaXQncyByZWFkeSBpZiBuZWVkZWQuCisgICAgICovCisgICAgdGhpcy0+bV9kZXNjcmlwdG9yQnVmZmVySW5mby5idWZmZXIgPSBoYW5kbGUoKTsKKyAgICB0aGlzLT5tX2Rlc2NyaXB0b3JCdWZmZXJJbmZvLm9mZnNldCA9IDA7CisgICAgdGhpcy0+bV9kZXNjcmlwdG9yQnVmZmVySW5mby5yYW5nZSA9IGFsbG9jYXRpb25TaXplOworfQorCitWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIGNvbnN0ICZWa1NoYWRlck9iajo6R2V0U3RhZ2VDcmVhdGVJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9zdGFnZV9pbmZvOyB9CisKK1ZrU2hhZGVyT2JqOjpWa1NoYWRlck9iaihWa0RldmljZU9iaiAqZGV2aWNlLCBjb25zdCBjaGFyICpzaGFkZXJfY29kZSwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHN0YWdlLCBWa1JlbmRlckZyYW1ld29yayAqZnJhbWV3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIGJvb2wgZGVidWcsIFZrU3BlY2lhbGl6YXRpb25JbmZvICpzcGVjSW5mbywgdWludDMyX3Qgc3BpcnZfbWlub3JfdmVyc2lvbikgeworICAgIG1fZGV2aWNlID0gZGV2aWNlOworICAgIG1fc3RhZ2VfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTzsKKyAgICBtX3N0YWdlX2luZm8ucE5leHQgPSBudWxscHRyOworICAgIG1fc3RhZ2VfaW5mby5mbGFncyA9IDA7CisgICAgbV9zdGFnZV9pbmZvLnN0YWdlID0gc3RhZ2U7CisgICAgbV9zdGFnZV9pbmZvLm1vZHVsZSA9IFZLX05VTExfSEFORExFOworICAgIG1fc3RhZ2VfaW5mby5wTmFtZSA9IG5hbWU7CisgICAgbV9zdGFnZV9pbmZvLnBTcGVjaWFsaXphdGlvbkluZm8gPSBzcGVjSW5mbzsKKworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gc3B2OworICAgIGZyYW1ld29yay0+R0xTTHRvU1BWKCZkZXZpY2UtPnByb3BzLmxpbWl0cywgc3RhZ2UsIHNoYWRlcl9jb2RlLCBzcHYsIGRlYnVnLCBzcGlydl9taW5vcl92ZXJzaW9uKTsKKworICAgIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBtb2R1bGVDcmVhdGVJbmZvID0ge307CisgICAgbW9kdWxlQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfQ1JFQVRFX0lORk87CisgICAgbW9kdWxlQ3JlYXRlSW5mby5jb2RlU2l6ZSA9IHNwdi5zaXplKCkgKiBzaXplb2YodW5zaWduZWQgaW50KTsKKyAgICBtb2R1bGVDcmVhdGVJbmZvLnBDb2RlID0gc3B2LmRhdGEoKTsKKworICAgIGluaXQoKm1fZGV2aWNlLCBtb2R1bGVDcmVhdGVJbmZvKTsKKyAgICBtX3N0YWdlX2luZm8ubW9kdWxlID0gaGFuZGxlKCk7Cit9CisKK1ZrU2hhZGVyT2JqOjpWa1NoYWRlck9iaihWa0RldmljZU9iaiAqZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyBzcHZfc291cmNlLCBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmtSZW5kZXJGcmFtZXdvcmsgKmZyYW1ld29yaywgY2hhciBjb25zdCAqbmFtZSwgVmtTcGVjaWFsaXphdGlvbkluZm8gKnNwZWNJbmZvKSB7CisgICAgbV9kZXZpY2UgPSBkZXZpY2U7CisgICAgbV9zdGFnZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfU0hBREVSX1NUQUdFX0NSRUFURV9JTkZPOworICAgIG1fc3RhZ2VfaW5mby5wTmV4dCA9IG51bGxwdHI7CisgICAgbV9zdGFnZV9pbmZvLmZsYWdzID0gMDsKKyAgICBtX3N0YWdlX2luZm8uc3RhZ2UgPSBzdGFnZTsKKyAgICBtX3N0YWdlX2luZm8ubW9kdWxlID0gVktfTlVMTF9IQU5ETEU7CisgICAgbV9zdGFnZV9pbmZvLnBOYW1lID0gbmFtZTsKKyAgICBtX3N0YWdlX2luZm8ucFNwZWNpYWxpemF0aW9uSW5mbyA9IHNwZWNJbmZvOworCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBzcHY7CisgICAgZnJhbWV3b3JrLT5BU010b1NQVihTUFZfRU5WX1ZVTEtBTl8xXzAsIDAsIHNwdl9zb3VyY2UuZGF0YSgpLCBzcHYpOworCisgICAgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIG1vZHVsZUNyZWF0ZUluZm8gPSB7fTsKKyAgICBtb2R1bGVDcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTzsKKyAgICBtb2R1bGVDcmVhdGVJbmZvLmNvZGVTaXplID0gc3B2LnNpemUoKSAqIHNpemVvZih1bnNpZ25lZCBpbnQpOworICAgIG1vZHVsZUNyZWF0ZUluZm8ucENvZGUgPSBzcHYuZGF0YSgpOworCisgICAgaW5pdCgqbV9kZXZpY2UsIG1vZHVsZUNyZWF0ZUluZm8pOworICAgIG1fc3RhZ2VfaW5mby5tb2R1bGUgPSBoYW5kbGUoKTsKK30KKworVmtQaXBlbGluZUxheW91dE9iajo6VmtQaXBlbGluZUxheW91dE9iaihWa0RldmljZU9iaiAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogKj4gJmRlc2NyaXB0b3JfbGF5b3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtQdXNoQ29uc3RhbnRSYW5nZT4gJnB1c2hfY29uc3RhbnRfcmFuZ2VzKSB7CisgICAgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gcGxfY2kgPSB7fTsKKyAgICBwbF9jaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTzsKKyAgICBwbF9jaS5wdXNoQ29uc3RhbnRSYW5nZUNvdW50ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHB1c2hfY29uc3RhbnRfcmFuZ2VzLnNpemUoKSk7CisgICAgcGxfY2kucFB1c2hDb25zdGFudFJhbmdlcyA9IHB1c2hfY29uc3RhbnRfcmFuZ2VzLmRhdGEoKTsKKworICAgIGF1dG8gZGVzY3JpcHRvcl9sYXlvdXRzX3Vud3JhcHBlZCA9IE1ha2VUZXN0YmluZGluZ0hhbmRsZXM8Y29uc3QgdmtfdGVzdGluZzo6RGVzY3JpcHRvclNldExheW91dD4oZGVzY3JpcHRvcl9sYXlvdXRzKTsKKworICAgIGluaXQoKmRldmljZSwgcGxfY2ksIGRlc2NyaXB0b3JfbGF5b3V0c191bndyYXBwZWQpOworfQorCit2b2lkIFZrUGlwZWxpbmVMYXlvdXRPYmo6OlJlc2V0KCkgeyAqdGhpcyA9IFZrUGlwZWxpbmVMYXlvdXRPYmooKTsgfQorCitWa1BpcGVsaW5lT2JqOjpWa1BpcGVsaW5lT2JqKFZrRGV2aWNlT2JqICpkZXZpY2UpIHsKKyAgICBtX2RldmljZSA9IGRldmljZTsKKworICAgIG1fdmlfc3RhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgbV92aV9zdGF0ZS5wTmV4dCA9IG51bGxwdHI7CisgICAgbV92aV9zdGF0ZS5mbGFncyA9IDA7CisgICAgbV92aV9zdGF0ZS52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IDA7CisgICAgbV92aV9zdGF0ZS5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9IG51bGxwdHI7CisgICAgbV92aV9zdGF0ZS52ZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbkNvdW50ID0gMDsKKyAgICBtX3ZpX3N0YXRlLnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgPSBudWxscHRyOworCisgICAgbV9pYV9zdGF0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPOworICAgIG1faWFfc3RhdGUucE5leHQgPSBudWxscHRyOworICAgIG1faWFfc3RhdGUuZmxhZ3MgPSAwOworICAgIG1faWFfc3RhdGUudG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfTElTVDsKKyAgICBtX2lhX3N0YXRlLnByaW1pdGl2ZVJlc3RhcnRFbmFibGUgPSBWS19GQUxTRTsKKworICAgIG1fdGVfc3RhdGUgPSBudWxscHRyOworCisgICAgbV92cF9zdGF0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPOworICAgIG1fdnBfc3RhdGUucE5leHQgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBtX3ZwX3N0YXRlLmZsYWdzID0gMDsKKyAgICBtX3ZwX3N0YXRlLnZpZXdwb3J0Q291bnQgPSAxOworICAgIG1fdnBfc3RhdGUuc2Npc3NvckNvdW50ID0gMTsKKyAgICBtX3ZwX3N0YXRlLnBWaWV3cG9ydHMgPSBudWxscHRyOworICAgIG1fdnBfc3RhdGUucFNjaXNzb3JzID0gbnVsbHB0cjsKKworICAgIG1fcnNfc3RhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9SQVNURVJJWkFUSU9OX1NUQVRFX0NSRUFURV9JTkZPOworICAgIG1fcnNfc3RhdGUucE5leHQgPSAmbV9saW5lX3N0YXRlOworICAgIG1fcnNfc3RhdGUuZmxhZ3MgPSAwOworICAgIG1fcnNfc3RhdGUuZGVwdGhDbGFtcEVuYWJsZSA9IFZLX0ZBTFNFOworICAgIG1fcnNfc3RhdGUucmFzdGVyaXplckRpc2NhcmRFbmFibGUgPSBWS19GQUxTRTsKKyAgICBtX3JzX3N0YXRlLnBvbHlnb25Nb2RlID0gVktfUE9MWUdPTl9NT0RFX0ZJTEw7CisgICAgbV9yc19zdGF0ZS5jdWxsTW9kZSA9IFZLX0NVTExfTU9ERV9CQUNLX0JJVDsKKyAgICBtX3JzX3N0YXRlLmZyb250RmFjZSA9IFZLX0ZST05UX0ZBQ0VfQ0xPQ0tXSVNFOworICAgIG1fcnNfc3RhdGUuZGVwdGhCaWFzRW5hYmxlID0gVktfRkFMU0U7CisgICAgbV9yc19zdGF0ZS5kZXB0aEJpYXNDb25zdGFudEZhY3RvciA9IDAuMGY7CisgICAgbV9yc19zdGF0ZS5kZXB0aEJpYXNDbGFtcCA9IDAuMGY7CisgICAgbV9yc19zdGF0ZS5kZXB0aEJpYXNTbG9wZUZhY3RvciA9IDAuMGY7CisgICAgbV9yc19zdGF0ZS5saW5lV2lkdGggPSAxLjBmOworCisgICAgbV9saW5lX3N0YXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9MSU5FX1NUQVRFX0NSRUFURV9JTkZPX0VYVDsKKyAgICBtX2xpbmVfc3RhdGUucE5leHQgPSBudWxscHRyOworICAgIG1fbGluZV9zdGF0ZS5saW5lUmFzdGVyaXphdGlvbk1vZGUgPSBWS19MSU5FX1JBU1RFUklaQVRJT05fTU9ERV9ERUZBVUxUX0VYVDsKKyAgICBtX2xpbmVfc3RhdGUuc3RpcHBsZWRMaW5lRW5hYmxlID0gVktfRkFMU0U7CisgICAgbV9saW5lX3N0YXRlLmxpbmVTdGlwcGxlRmFjdG9yID0gMDsKKyAgICBtX2xpbmVfc3RhdGUubGluZVN0aXBwbGVQYXR0ZXJuID0gMDsKKworICAgIG1fbXNfc3RhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9NVUxUSVNBTVBMRV9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBtX21zX3N0YXRlLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBtX21zX3N0YXRlLmZsYWdzID0gMDsKKyAgICBtX21zX3N0YXRlLnJhc3Rlcml6YXRpb25TYW1wbGVzID0gVktfU0FNUExFX0NPVU5UXzFfQklUOworICAgIG1fbXNfc3RhdGUuc2FtcGxlU2hhZGluZ0VuYWJsZSA9IFZLX0ZBTFNFOworICAgIG1fbXNfc3RhdGUubWluU2FtcGxlU2hhZGluZyA9IDAuMGY7CisgICAgbV9tc19zdGF0ZS5wU2FtcGxlTWFzayA9IG51bGxwdHI7CisgICAgbV9tc19zdGF0ZS5hbHBoYVRvQ292ZXJhZ2VFbmFibGUgPSBWS19GQUxTRTsKKyAgICBtX21zX3N0YXRlLmFscGhhVG9PbmVFbmFibGUgPSBWS19GQUxTRTsKKworICAgIG1fZHNfc3RhdGUgPSBudWxscHRyOworCisgICAgbWVtc2V0KCZtX2NiX3N0YXRlLCAwLCBzaXplb2YobV9jYl9zdGF0ZSkpOworICAgIG1fY2Jfc3RhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTzsKKyAgICBtX2NiX3N0YXRlLmJsZW5kQ29uc3RhbnRzWzBdID0gMS4wZjsKKyAgICBtX2NiX3N0YXRlLmJsZW5kQ29uc3RhbnRzWzFdID0gMS4wZjsKKyAgICBtX2NiX3N0YXRlLmJsZW5kQ29uc3RhbnRzWzJdID0gMS4wZjsKKyAgICBtX2NiX3N0YXRlLmJsZW5kQ29uc3RhbnRzWzNdID0gMS4wZjsKKworICAgIG1lbXNldCgmbV9wZF9zdGF0ZSwgMCwgc2l6ZW9mKG1fcGRfc3RhdGUpKTsKK30KKwordm9pZCBWa1BpcGVsaW5lT2JqOjpBZGRTaGFkZXIoVmtTaGFkZXJPYmogKnNoYWRlcikgeyBtX3NoYWRlclN0YWdlcy5wdXNoX2JhY2soc2hhZGVyLT5HZXRTdGFnZUNyZWF0ZUluZm8oKSk7IH0KKwordm9pZCBWa1BpcGVsaW5lT2JqOjpBZGRTaGFkZXIoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBjb25zdCAmY3JlYXRlSW5mbykgeyBtX3NoYWRlclN0YWdlcy5wdXNoX2JhY2soY3JlYXRlSW5mbyk7IH0KKwordm9pZCBWa1BpcGVsaW5lT2JqOjpBZGRWZXJ0ZXhJbnB1dEF0dHJpYnMoVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uICp2aV9hdHRyaWIsIHVpbnQzMl90IGNvdW50KSB7CisgICAgbV92aV9zdGF0ZS5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gdmlfYXR0cmliOworICAgIG1fdmlfc3RhdGUudmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCA9IGNvdW50OworfQorCit2b2lkIFZrUGlwZWxpbmVPYmo6OkFkZFZlcnRleElucHV0QmluZGluZ3MoVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiAqdmlfYmluZGluZywgdWludDMyX3QgY291bnQpIHsKKyAgICBtX3ZpX3N0YXRlLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gdmlfYmluZGluZzsKKyAgICBtX3ZpX3N0YXRlLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ID0gY291bnQ7Cit9CisKK3ZvaWQgVmtQaXBlbGluZU9iajo6QWRkQ29sb3JBdHRhY2htZW50KHVpbnQzMl90IGJpbmRpbmcsIGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlICZhdHQpIHsKKyAgICBpZiAoYmluZGluZyArIDEgPiBtX2NvbG9yQXR0YWNobWVudHMuc2l6ZSgpKSB7CisgICAgICAgIG1fY29sb3JBdHRhY2htZW50cy5yZXNpemUoYmluZGluZyArIDEpOworICAgIH0KKyAgICBtX2NvbG9yQXR0YWNobWVudHNbYmluZGluZ10gPSBhdHQ7Cit9CisKK3ZvaWQgVmtQaXBlbGluZU9iajo6U2V0RGVwdGhTdGVuY2lsKGNvbnN0IFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gKmRzX3N0YXRlKSB7IG1fZHNfc3RhdGUgPSBkc19zdGF0ZTsgfQorCit2b2lkIFZrUGlwZWxpbmVPYmo6OlNldFZpZXdwb3J0KGNvbnN0IHZlY3RvcjxWa1ZpZXdwb3J0PiB2aWV3cG9ydHMpIHsKKyAgICBtX3ZpZXdwb3J0cyA9IHZpZXdwb3J0czsKKyAgICAvLyBJZiB3ZSBleHBsaWNpdGx5IHNldCBhIG51bGwgdmlld3BvcnQsIHBhc3MgaXQgdGhyb3VnaCB0byBjcmVhdGUgaW5mbworICAgIC8vIGJ1dCBwcmVzZXJ2ZSB2aWV3cG9ydENvdW50IGJlY2F1c2UgaXQgbXVzbid0IGNoYW5nZQorICAgIGlmIChtX3ZpZXdwb3J0cy5zaXplKCkgPT0gMCkgeworICAgICAgICBtX3ZwX3N0YXRlLnBWaWV3cG9ydHMgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBWa1BpcGVsaW5lT2JqOjpTZXRTY2lzc29yKGNvbnN0IHZlY3RvcjxWa1JlY3QyRD4gc2Npc3NvcnMpIHsKKyAgICBtX3NjaXNzb3JzID0gc2Npc3NvcnM7CisgICAgLy8gSWYgd2UgZXhwbGljaXRseSBzZXQgYSBudWxsIHNjaXNzb3IsIHBhc3MgaXQgdGhyb3VnaCB0byBjcmVhdGUgaW5mbworICAgIC8vIGJ1dCBwcmVzZXJ2ZSBzY2lzc29yQ291bnQgYmVjYXVzZSBpdCBtdXNuJ3QgY2hhbmdlCisgICAgaWYgKG1fc2Npc3NvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgbV92cF9zdGF0ZS5wU2Npc3NvcnMgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBWa1BpcGVsaW5lT2JqOjpNYWtlRHluYW1pYyhWa0R5bmFtaWNTdGF0ZSBzdGF0ZSkgeworICAgIC8qIE9ubHkgYWRkIGEgc3RhdGUgb25jZSAqLworICAgIGZvciAoYXV0byBpdCA9IG1fZHluYW1pY19zdGF0ZV9lbmFibGVzLmJlZ2luKCk7IGl0ICE9IG1fZHluYW1pY19zdGF0ZV9lbmFibGVzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmICgoKml0KSA9PSBzdGF0ZSkgcmV0dXJuOworICAgIH0KKyAgICBtX2R5bmFtaWNfc3RhdGVfZW5hYmxlcy5wdXNoX2JhY2soc3RhdGUpOworfQorCit2b2lkIFZrUGlwZWxpbmVPYmo6OlNldE1TQUEoY29uc3QgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvICptc19zdGF0ZSkgeyBtX21zX3N0YXRlID0gKm1zX3N0YXRlOyB9CisKK3ZvaWQgVmtQaXBlbGluZU9iajo6U2V0SW5wdXRBc3NlbWJseShjb25zdCBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyAqaWFfc3RhdGUpIHsgbV9pYV9zdGF0ZSA9ICppYV9zdGF0ZTsgfQorCit2b2lkIFZrUGlwZWxpbmVPYmo6OlNldFJhc3Rlcml6YXRpb24oY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gKnJzX3N0YXRlKSB7CisgICAgbV9yc19zdGF0ZSA9ICpyc19zdGF0ZTsKKyAgICBtX3JzX3N0YXRlLnBOZXh0ID0gJm1fbGluZV9zdGF0ZTsKK30KKwordm9pZCBWa1BpcGVsaW5lT2JqOjpTZXRUZXNzZWxsYXRpb24oY29uc3QgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyAqdGVfc3RhdGUpIHsgbV90ZV9zdGF0ZSA9IHRlX3N0YXRlOyB9CisKK3ZvaWQgVmtQaXBlbGluZU9iajo6U2V0TGluZVN0YXRlKGNvbnN0IFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uTGluZVN0YXRlQ3JlYXRlSW5mb0VYVCAqbGluZV9zdGF0ZSkgeyBtX2xpbmVfc3RhdGUgPSAqbGluZV9zdGF0ZTsgfQorCit2b2lkIFZrUGlwZWxpbmVPYmo6OkluaXRHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyhWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICpncF9jaSkgeworICAgIGdwX2NpLT5zdGFnZUNvdW50ID0gbV9zaGFkZXJTdGFnZXMuc2l6ZSgpOworICAgIGdwX2NpLT5wU3RhZ2VzID0gbV9zaGFkZXJTdGFnZXMuc2l6ZSgpID8gbV9zaGFkZXJTdGFnZXMuZGF0YSgpIDogbnVsbHB0cjsKKworICAgIG1fdmlfc3RhdGUuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZ3BfY2ktPnBWZXJ0ZXhJbnB1dFN0YXRlID0gJm1fdmlfc3RhdGU7CisKKyAgICBtX2lhX3N0YXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfSU5QVVRfQVNTRU1CTFlfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgZ3BfY2ktPnBJbnB1dEFzc2VtYmx5U3RhdGUgPSAmbV9pYV9zdGF0ZTsKKworICAgIGdwX2NpLT5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPOworICAgIGdwX2NpLT5wTmV4dCA9IE5VTEw7CisgICAgZ3BfY2ktPmZsYWdzID0gMDsKKworICAgIG1fY2Jfc3RhdGUuYXR0YWNobWVudENvdW50ID0gbV9jb2xvckF0dGFjaG1lbnRzLnNpemUoKTsKKyAgICBtX2NiX3N0YXRlLnBBdHRhY2htZW50cyA9IG1fY29sb3JBdHRhY2htZW50cy5kYXRhKCk7CisKKyAgICBpZiAobV92aWV3cG9ydHMuc2l6ZSgpID4gMCkgeworICAgICAgICBtX3ZwX3N0YXRlLnZpZXdwb3J0Q291bnQgPSBtX3ZpZXdwb3J0cy5zaXplKCk7CisgICAgICAgIG1fdnBfc3RhdGUucFZpZXdwb3J0cyA9IG1fdmlld3BvcnRzLmRhdGEoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNYWtlRHluYW1pYyhWS19EWU5BTUlDX1NUQVRFX1ZJRVdQT1JUKTsKKyAgICB9CisKKyAgICBpZiAobV9zY2lzc29ycy5zaXplKCkgPiAwKSB7CisgICAgICAgIG1fdnBfc3RhdGUuc2Npc3NvckNvdW50ID0gbV9zY2lzc29ycy5zaXplKCk7CisgICAgICAgIG1fdnBfc3RhdGUucFNjaXNzb3JzID0gbV9zY2lzc29ycy5kYXRhKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTWFrZUR5bmFtaWMoVktfRFlOQU1JQ19TVEFURV9TQ0lTU09SKTsKKyAgICB9CisKKyAgICBtZW1zZXQoJm1fcGRfc3RhdGUsIDAsIHNpemVvZihtX3BkX3N0YXRlKSk7CisgICAgaWYgKG1fZHluYW1pY19zdGF0ZV9lbmFibGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgbV9wZF9zdGF0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0RZTkFNSUNfU1RBVEVfQ1JFQVRFX0lORk87CisgICAgICAgIG1fcGRfc3RhdGUuZHluYW1pY1N0YXRlQ291bnQgPSBtX2R5bmFtaWNfc3RhdGVfZW5hYmxlcy5zaXplKCk7CisgICAgICAgIG1fcGRfc3RhdGUucER5bmFtaWNTdGF0ZXMgPSBtX2R5bmFtaWNfc3RhdGVfZW5hYmxlcy5kYXRhKCk7CisgICAgICAgIGdwX2NpLT5wRHluYW1pY1N0YXRlID0gJm1fcGRfc3RhdGU7CisgICAgfQorCisgICAgZ3BfY2ktPnN1YnBhc3MgPSAwOworICAgIGdwX2NpLT5wVmlld3BvcnRTdGF0ZSA9ICZtX3ZwX3N0YXRlOworICAgIGdwX2NpLT5wUmFzdGVyaXphdGlvblN0YXRlID0gJm1fcnNfc3RhdGU7CisgICAgZ3BfY2ktPnBNdWx0aXNhbXBsZVN0YXRlID0gJm1fbXNfc3RhdGU7CisgICAgZ3BfY2ktPnBEZXB0aFN0ZW5jaWxTdGF0ZSA9IG1fZHNfc3RhdGU7CisgICAgZ3BfY2ktPnBDb2xvckJsZW5kU3RhdGUgPSAmbV9jYl9zdGF0ZTsKKyAgICBncF9jaS0+cFRlc3NlbGxhdGlvblN0YXRlID0gbV90ZV9zdGF0ZTsKK30KKworVmtSZXN1bHQgVmtQaXBlbGluZU9iajo6Q3JlYXRlVktQaXBlbGluZShWa1BpcGVsaW5lTGF5b3V0IGxheW91dCwgVmtSZW5kZXJQYXNzIHJlbmRlcl9wYXNzLCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICpncF9jaSkgeworICAgIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gaW5mbyA9IHt9OworCisgICAgLy8gaWYgbm90IGdpdmVuIGEgQ3JlYXRlSW5mbywgY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbG9jYWwgb25lLgorICAgIGlmIChncF9jaSA9PSBudWxscHRyKSB7CisgICAgICAgIGdwX2NpID0gJmluZm87CisgICAgICAgIEluaXRHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyhncF9jaSk7CisgICAgfQorCisgICAgZ3BfY2ktPmxheW91dCA9IGxheW91dDsKKyAgICBncF9jaS0+cmVuZGVyUGFzcyA9IHJlbmRlcl9wYXNzOworCisgICAgcmV0dXJuIGluaXRfdHJ5KCptX2RldmljZSwgKmdwX2NpKTsKK30KKworVmtDb21tYW5kQnVmZmVyT2JqOjpWa0NvbW1hbmRCdWZmZXJPYmooVmtEZXZpY2VPYmogKmRldmljZSwgVmtDb21tYW5kUG9vbE9iaiAqcG9vbCwgVmtDb21tYW5kQnVmZmVyTGV2ZWwgbGV2ZWwsIFZrUXVldWVPYmogKnF1ZXVlKSB7CisgICAgbV9kZXZpY2UgPSBkZXZpY2U7CisgICAgaWYgKHF1ZXVlKSB7CisgICAgICAgIG1fcXVldWUgPSBxdWV1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3F1ZXVlID0gbV9kZXZpY2UtPkdldERlZmF1bHRRdWV1ZSgpOworICAgIH0KKyAgICBhc3NlcnQobV9xdWV1ZSk7CisKKyAgICBhdXRvIGNyZWF0ZV9pbmZvID0gdmtfdGVzdGluZzo6Q29tbWFuZEJ1ZmZlcjo6Y3JlYXRlX2luZm8ocG9vbC0+aGFuZGxlKCkpOworICAgIGNyZWF0ZV9pbmZvLmxldmVsID0gbGV2ZWw7CisgICAgaW5pdCgqZGV2aWNlLCBjcmVhdGVfaW5mbyk7Cit9CisKK3ZvaWQgVmtDb21tYW5kQnVmZmVyT2JqOjpQaXBlbGluZUJhcnJpZXIoVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjX3N0YWdlcywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZGVzdF9zdGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVwZW5kZW5jeUZsYWdzIGRlcGVuZGVuY3lGbGFncywgdWludDMyX3QgbWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIgKnBNZW1vcnlCYXJyaWVycywgdWludDMyX3QgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKnBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyICpwSW1hZ2VNZW1vcnlCYXJyaWVycykgeworICAgIHZrOjpDbWRQaXBlbGluZUJhcnJpZXIoaGFuZGxlKCksIHNyY19zdGFnZXMsIGRlc3Rfc3RhZ2VzLCBkZXBlbmRlbmN5RmxhZ3MsIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7Cit9CisKK3ZvaWQgVmtDb21tYW5kQnVmZmVyT2JqOjpDbGVhckFsbEJ1ZmZlcnMoY29uc3QgdmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxWa0ltYWdlT2JqPj4gJmNvbG9yX29ianMsIFZrQ2xlYXJDb2xvclZhbHVlIGNsZWFyX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlcHRoU3RlbmNpbE9iaiAqZGVwdGhfc3RlbmNpbF9vYmosIGZsb2F0IGRlcHRoX2NsZWFyX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGVuY2lsX2NsZWFyX3ZhbHVlKSB7CisgICAgLy8gd2hhdGV2ZXIgd2Ugd2FudCB0byBkbywgd2UgZG8gaXQgdG8gdGhlIHdob2xlIGJ1ZmZlcgorICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN1YnJhbmdlID0ge307CisgICAgLy8gc3JSYW5nZS5hc3BlY3RNYXNrIHRvIGJlIHNldCBsYXRlcgorICAgIHN1YnJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgLy8gVE9ETzogTWFsaSBkZXZpY2UgY3Jhc2hpbmcgd2l0aCBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUworICAgIHN1YnJhbmdlLmxldmVsQ291bnQgPSAxOyAgLy8gVktfUkVNQUlOSU5HX01JUF9MRVZFTFM7CisgICAgc3VicmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIC8vIFRPRE86IE1lc2EgY3Jhc2hpbmcgd2l0aCBWS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTCisgICAgc3VicmFuZ2UubGF5ZXJDb3VudCA9IDE7ICAvLyBWS19SRU1BSU5JTkdfQVJSQVlfTEFZRVJTOworCisgICAgY29uc3QgVmtJbWFnZUxheW91dCBjbGVhcl9sYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNvbG9yX29iaiA6IGNvbG9yX29ianMpIHsKKyAgICAgICAgc3VicmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIGNvbG9yX29iai0+TGF5b3V0KFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQpOworICAgICAgICBjb2xvcl9vYmotPlNldExheW91dCh0aGlzLCBzdWJyYW5nZS5hc3BlY3RNYXNrLCBjbGVhcl9sYXlvdXQpOworICAgICAgICBDbGVhckNvbG9ySW1hZ2UoY29sb3Jfb2JqLT5pbWFnZSgpLCBjbGVhcl9sYXlvdXQsICZjbGVhcl9jb2xvciwgMSwgJnN1YnJhbmdlKTsKKyAgICB9CisKKyAgICBpZiAoZGVwdGhfc3RlbmNpbF9vYmogJiYgZGVwdGhfc3RlbmNpbF9vYmotPkluaXRpYWxpemVkKCkpIHsKKyAgICAgICAgc3VicmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQgfCBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisgICAgICAgIGlmIChGb3JtYXRJc0RlcHRoT25seShkZXB0aF9zdGVuY2lsX29iai0+Zm9ybWF0KCkpKSBzdWJyYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsKKyAgICAgICAgaWYgKEZvcm1hdElzU3RlbmNpbE9ubHkoZGVwdGhfc3RlbmNpbF9vYmotPmZvcm1hdCgpKSkgc3VicmFuZ2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKworICAgICAgICBkZXB0aF9zdGVuY2lsX29iai0+TGF5b3V0KFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQpOworICAgICAgICBkZXB0aF9zdGVuY2lsX29iai0+U2V0TGF5b3V0KHRoaXMsIHN1YnJhbmdlLmFzcGVjdE1hc2ssIGNsZWFyX2xheW91dCk7CisKKyAgICAgICAgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlIGNsZWFyX3ZhbHVlID0ge2RlcHRoX2NsZWFyX3ZhbHVlLCBzdGVuY2lsX2NsZWFyX3ZhbHVlfTsKKyAgICAgICAgQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShkZXB0aF9zdGVuY2lsX29iai0+aGFuZGxlKCksIGNsZWFyX2xheW91dCwgJmNsZWFyX3ZhbHVlLCAxLCAmc3VicmFuZ2UpOworICAgIH0KK30KKwordm9pZCBWa0NvbW1hbmRCdWZmZXJPYmo6OkZpbGxCdWZmZXIoVmtCdWZmZXIgYnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgZmlsbF9zaXplLCB1aW50MzJfdCBkYXRhKSB7CisgICAgdms6OkNtZEZpbGxCdWZmZXIoaGFuZGxlKCksIGJ1ZmZlciwgb2Zmc2V0LCBmaWxsX3NpemUsIGRhdGEpOworfQorCit2b2lkIFZrQ29tbWFuZEJ1ZmZlck9iajo6VXBkYXRlQnVmZmVyKFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIGRhdGFTaXplLCBjb25zdCB2b2lkICpwRGF0YSkgeworICAgIHZrOjpDbWRVcGRhdGVCdWZmZXIoaGFuZGxlKCksIGJ1ZmZlciwgZHN0T2Zmc2V0LCBkYXRhU2l6ZSwgcERhdGEpOworfQorCit2b2lkIFZrQ29tbWFuZEJ1ZmZlck9iajo6Q29weUltYWdlKFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSAqcFJlZ2lvbnMpIHsKKyAgICB2azo6Q21kQ29weUltYWdlKGhhbmRsZSgpLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVnaW9uQ291bnQsIHBSZWdpb25zKTsKK30KKwordm9pZCBWa0NvbW1hbmRCdWZmZXJPYmo6OlJlc29sdmVJbWFnZShWa0ltYWdlIHNyY0ltYWdlLCBWa0ltYWdlTGF5b3V0IHNyY0ltYWdlTGF5b3V0LCBWa0ltYWdlIGRzdEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZVJlc29sdmUgKnBSZWdpb25zKSB7CisgICAgdms6OkNtZFJlc29sdmVJbWFnZShoYW5kbGUoKSwgc3JjSW1hZ2UsIHNyY0ltYWdlTGF5b3V0LCBkc3RJbWFnZSwgZHN0SW1hZ2VMYXlvdXQsIHJlZ2lvbkNvdW50LCBwUmVnaW9ucyk7Cit9CisKK3ZvaWQgVmtDb21tYW5kQnVmZmVyT2JqOjpDbGVhckNvbG9ySW1hZ2UoVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUgKnBDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZ2VDb3VudCwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgKnBSYW5nZXMpIHsKKyAgICB2azo6Q21kQ2xlYXJDb2xvckltYWdlKGhhbmRsZSgpLCBpbWFnZSwgaW1hZ2VMYXlvdXQsIHBDb2xvciwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7Cit9CisKK3ZvaWQgVmtDb21tYW5kQnVmZmVyT2JqOjpDbGVhckRlcHRoU3RlbmNpbEltYWdlKFZrSW1hZ2UgaW1hZ2UsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VMYXlvdXQsIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSAqcENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZ2VDb3VudCwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgKnBSYW5nZXMpIHsKKyAgICB2azo6Q21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZShoYW5kbGUoKSwgaW1hZ2UsIGltYWdlTGF5b3V0LCBwQ29sb3IsIHJhbmdlQ291bnQsIHBSYW5nZXMpOworfQorCit2b2lkIFZrQ29tbWFuZEJ1ZmZlck9iajo6QnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmUoVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmogKmFzLCBWa0J1ZmZlciBzY3JhdGNoQnVmZmVyKSB7CisgICAgQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmUoYXMsIHNjcmF0Y2hCdWZmZXIsIFZLX05VTExfSEFORExFKTsKK30KKwordm9pZCBWa0NvbW1hbmRCdWZmZXJPYmo6OkJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlKFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlT2JqICphcywgVmtCdWZmZXIgc2NyYXRjaEJ1ZmZlciwgVmtCdWZmZXIgaW5zdGFuY2VEYXRhKSB7CisgICAgUEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViB2a0NtZEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPQorICAgICAgICAoUEZOX3ZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVil2azo6R2V0RGV2aWNlUHJvY0FkZHIoYXMtPmRldigpLCAidmtDbWRCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIik7CisgICAgYXNzZXJ0KHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAhPSBudWxscHRyKTsKKworICAgIHZrQ21kQnVpbGRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVihoYW5kbGUoKSwgJmFzLT5pbmZvKCksIGluc3RhbmNlRGF0YSwgMCwgVktfRkFMU0UsIGFzLT5oYW5kbGUoKSwgVktfTlVMTF9IQU5ETEUsIHNjcmF0Y2hCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworfQorCit2b2lkIFZrQ29tbWFuZEJ1ZmZlck9iajo6UHJlcGFyZUF0dGFjaG1lbnRzKGNvbnN0IHZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmtJbWFnZU9iaj4+ICZjb2xvcl9hdHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlcHRoU3RlbmNpbE9iaiAqZGVwdGhfc3RlbmNpbF9hdHQpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNvbG9yX2F0dCA6IGNvbG9yX2F0dHMpIHsKKyAgICAgICAgY29sb3JfYXR0LT5TZXRMYXlvdXQodGhpcywgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCk7CisgICAgfQorCisgICAgaWYgKGRlcHRoX3N0ZW5jaWxfYXR0ICYmIGRlcHRoX3N0ZW5jaWxfYXR0LT5Jbml0aWFsaXplZCgpKSB7CisgICAgICAgIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3QgPSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworICAgICAgICBpZiAoRm9ybWF0SXNEZXB0aE9ubHkoZGVwdGhfc3RlbmNpbF9hdHQtPkZvcm1hdCgpKSkgYXNwZWN0ID0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVDsKKyAgICAgICAgaWYgKEZvcm1hdElzU3RlbmNpbE9ubHkoZGVwdGhfc3RlbmNpbF9hdHQtPkZvcm1hdCgpKSkgYXNwZWN0ID0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOworCisgICAgICAgIGRlcHRoX3N0ZW5jaWxfYXR0LT5TZXRMYXlvdXQodGhpcywgYXNwZWN0LCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwpOworICAgIH0KK30KKwordm9pZCBWa0NvbW1hbmRCdWZmZXJPYmo6OkJlZ2luUmVuZGVyUGFzcyhjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gJmluZm8pIHsKKyAgICB2azo6Q21kQmVnaW5SZW5kZXJQYXNzKGhhbmRsZSgpLCAmaW5mbywgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworfQorCit2b2lkIFZrQ29tbWFuZEJ1ZmZlck9iajo6RW5kUmVuZGVyUGFzcygpIHsgdms6OkNtZEVuZFJlbmRlclBhc3MoaGFuZGxlKCkpOyB9CisKK3ZvaWQgVmtDb21tYW5kQnVmZmVyT2JqOjpTZXRWaWV3cG9ydCh1aW50MzJfdCBmaXJzdFZpZXdwb3J0LCB1aW50MzJfdCB2aWV3cG9ydENvdW50LCBjb25zdCBWa1ZpZXdwb3J0ICpwVmlld3BvcnRzKSB7CisgICAgdms6OkNtZFNldFZpZXdwb3J0KGhhbmRsZSgpLCBmaXJzdFZpZXdwb3J0LCB2aWV3cG9ydENvdW50LCBwVmlld3BvcnRzKTsKK30KKwordm9pZCBWa0NvbW1hbmRCdWZmZXJPYmo6OlNldFN0ZW5jaWxSZWZlcmVuY2UoVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCByZWZlcmVuY2UpIHsKKyAgICB2azo6Q21kU2V0U3RlbmNpbFJlZmVyZW5jZShoYW5kbGUoKSwgZmFjZU1hc2ssIHJlZmVyZW5jZSk7Cit9CisKK3ZvaWQgVmtDb21tYW5kQnVmZmVyT2JqOjpEcmF3SW5kZXhlZCh1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluc3RhbmNlKSB7CisgICAgdms6OkNtZERyYXdJbmRleGVkKGhhbmRsZSgpLCBpbmRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdEluZGV4LCB2ZXJ0ZXhPZmZzZXQsIGZpcnN0SW5zdGFuY2UpOworfQorCit2b2lkIFZrQ29tbWFuZEJ1ZmZlck9iajo6RHJhdyh1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RWZXJ0ZXgsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UpIHsKKyAgICB2azo6Q21kRHJhdyhoYW5kbGUoKSwgdmVydGV4Q291bnQsIGluc3RhbmNlQ291bnQsIGZpcnN0VmVydGV4LCBmaXJzdEluc3RhbmNlKTsKK30KKwordm9pZCBWa0NvbW1hbmRCdWZmZXJPYmo6OlF1ZXVlQ29tbWFuZEJ1ZmZlcihib29sIGNoZWNrU3VjY2VzcykgeworICAgIFZrRmVuY2VPYmogbnVsbEZlbmNlOworICAgIFF1ZXVlQ29tbWFuZEJ1ZmZlcihudWxsRmVuY2UsIGNoZWNrU3VjY2Vzcyk7Cit9CisKK3ZvaWQgVmtDb21tYW5kQnVmZmVyT2JqOjpRdWV1ZUNvbW1hbmRCdWZmZXIoY29uc3QgVmtGZW5jZU9iaiAmZmVuY2UsIGJvb2wgY2hlY2tTdWNjZXNzKSB7CisgICAgVmtSZXN1bHQgZXJyID0gVktfU1VDQ0VTUzsKKworICAgIGVyciA9IG1fcXVldWUtPnN1Ym1pdCgqdGhpcywgZmVuY2UsIGNoZWNrU3VjY2Vzcyk7CisgICAgaWYgKGNoZWNrU3VjY2VzcykgeworICAgICAgICBBU1NFUlRfVktfU1VDQ0VTUyhlcnIpOworICAgIH0KKworICAgIGVyciA9IG1fcXVldWUtPndhaXQoKTsKKyAgICBpZiAoY2hlY2tTdWNjZXNzKSB7CisgICAgICAgIEFTU0VSVF9WS19TVUNDRVNTKGVycik7CisgICAgfQorCisgICAgLy8gVE9ETzogRGV0ZXJtaW5lIGlmIHdlIHJlYWxseSB3YW50IHRoaXMgc2VyaWFsaXphdGlvbiBoZXJlCisgICAgLy8gV2FpdCBmb3Igd29yayB0byBmaW5pc2ggYmVmb3JlIGNsZWFuaW5nIHVwLgorICAgIHZrOjpEZXZpY2VXYWl0SWRsZShtX2RldmljZS0+ZGV2aWNlKCkpOworfQorCit2b2lkIFZrQ29tbWFuZEJ1ZmZlck9iajo6QmluZERlc2NyaXB0b3JTZXQoVmtEZXNjcmlwdG9yU2V0T2JqICZkZXNjcmlwdG9yU2V0KSB7CisgICAgVmtEZXNjcmlwdG9yU2V0IHNldF9vYmogPSBkZXNjcmlwdG9yU2V0LkdldERlc2NyaXB0b3JTZXRIYW5kbGUoKTsKKworICAgIC8vIGJpbmQgcGlwZWxpbmUsIHZlcnRleCBidWZmZXIgKGRlc2NyaXB0b3Igc2V0KSBhbmQgV1ZQIChkeW5hbWljIGJ1ZmZlciB2aWV3KQorICAgIGlmIChzZXRfb2JqKSB7CisgICAgICAgIHZrOjpDbWRCaW5kRGVzY3JpcHRvclNldHMoaGFuZGxlKCksIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIGRlc2NyaXB0b3JTZXQuR2V0UGlwZWxpbmVMYXlvdXQoKSwgMCwgMSwgJnNldF9vYmosIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorfQorCit2b2lkIFZrQ29tbWFuZEJ1ZmZlck9iajo6QmluZEluZGV4QnVmZmVyKFZrQnVmZmVyT2JqICppbmRleEJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtJbmRleFR5cGUgaW5kZXhUeXBlKSB7CisgICAgdms6OkNtZEJpbmRJbmRleEJ1ZmZlcihoYW5kbGUoKSwgaW5kZXhCdWZmZXItPmhhbmRsZSgpLCBvZmZzZXQsIGluZGV4VHlwZSk7Cit9CisKK3ZvaWQgVmtDb21tYW5kQnVmZmVyT2JqOjpCaW5kVmVydGV4QnVmZmVyKFZrQ29uc3RhbnRCdWZmZXJPYmogKnZlcnRleEJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgYmluZGluZykgeworICAgIHZrOjpDbWRCaW5kVmVydGV4QnVmZmVycyhoYW5kbGUoKSwgYmluZGluZywgMSwgJnZlcnRleEJ1ZmZlci0+aGFuZGxlKCksICZvZmZzZXQpOworfQorCitWa0NvbW1hbmRQb29sT2JqOjpWa0NvbW1hbmRQb29sT2JqKFZrRGV2aWNlT2JqICpkZXZpY2UsIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleCwgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIGZsYWdzKSB7CisgICAgaW5pdCgqZGV2aWNlLCB2a190ZXN0aW5nOjpDb21tYW5kUG9vbDo6Y3JlYXRlX2luZm8ocXVldWVfZmFtaWx5X2luZGV4LCBmbGFncykpOworfQorCitib29sIFZrRGVwdGhTdGVuY2lsT2JqOjpJbml0aWFsaXplZCgpIHsgcmV0dXJuIG1faW5pdGlhbGl6ZWQ7IH0KK1ZrRGVwdGhTdGVuY2lsT2JqOjpWa0RlcHRoU3RlbmNpbE9iaihWa0RldmljZU9iaiAqZGV2aWNlKSA6IFZrSW1hZ2VPYmooZGV2aWNlKSB7IG1faW5pdGlhbGl6ZWQgPSBmYWxzZTsgfQorCitWa0ltYWdlVmlldyAqVmtEZXB0aFN0ZW5jaWxPYmo6OkJpbmRJbmZvKCkgeyByZXR1cm4gJm1fYXR0YWNobWVudEJpbmRJbmZvOyB9CisKK1ZrRm9ybWF0IFZrRGVwdGhTdGVuY2lsT2JqOjpGb3JtYXQoKSBjb25zdCB7IHJldHVybiB0aGlzLT5tX2RlcHRoX3N0ZW5jaWxfZm10OyB9CisKK3ZvaWQgVmtEZXB0aFN0ZW5jaWxPYmo6OkluaXQoVmtEZXZpY2VPYmogKmRldmljZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIFZrRm9ybWF0IGZvcm1hdCwgVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2UpIHsKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gdmlld19pbmZvID0ge307CisKKyAgICBtX2RldmljZSA9IGRldmljZTsKKyAgICBtX2luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBtX2RlcHRoX3N0ZW5jaWxfZm10ID0gZm9ybWF0OworCisgICAgLyogY3JlYXRlIGltYWdlICovCisgICAgVmtJbWFnZU9iajo6SW5pdCh3aWR0aCwgaGVpZ2h0LCAxLCBtX2RlcHRoX3N0ZW5jaWxfZm10LCB1c2FnZSwgVktfSU1BR0VfVElMSU5HX09QVElNQUwpOworCisgICAgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdCA9IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCB8IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgaWYgKEZvcm1hdElzRGVwdGhPbmx5KGZvcm1hdCkpCisgICAgICAgIGFzcGVjdCA9IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQ7CisgICAgZWxzZSBpZiAoRm9ybWF0SXNTdGVuY2lsT25seShmb3JtYXQpKQorICAgICAgICBhc3BlY3QgPSBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQ7CisKKyAgICBTZXRMYXlvdXQoYXNwZWN0LCBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUwpOworCisgICAgdmlld19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICB2aWV3X2luZm8ucE5leHQgPSBOVUxMOworICAgIHZpZXdfaW5mby5pbWFnZSA9IFZLX05VTExfSEFORExFOworICAgIHZpZXdfaW5mby5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBhc3BlY3Q7CisgICAgdmlld19pbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gMDsKKyAgICB2aWV3X2luZm8uc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICB2aWV3X2luZm8uc3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgdmlld19pbmZvLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisgICAgdmlld19pbmZvLmZsYWdzID0gMDsKKyAgICB2aWV3X2luZm8uZm9ybWF0ID0gbV9kZXB0aF9zdGVuY2lsX2ZtdDsKKyAgICB2aWV3X2luZm8uaW1hZ2UgPSBoYW5kbGUoKTsKKyAgICB2aWV3X2luZm8udmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkQ7CisgICAgbV9pbWFnZVZpZXcuaW5pdCgqbV9kZXZpY2UsIHZpZXdfaW5mbyk7CisKKyAgICBtX2F0dGFjaG1lbnRCaW5kSW5mbyA9IG1faW1hZ2VWaWV3LmhhbmRsZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmtyZW5kZXJmcmFtZXdvcmsuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrcmVuZGVyZnJhbWV3b3JrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2OTEzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrcmVuZGVyZnJhbWV3b3JrLmgKQEAgLTAsMCArMSw1NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBEYXZlIEhvdWx0b24gPGRhdmVoQGx1bmFyZy5jb20+CisgKi8KKworI2lmbmRlZiBWS1JFTkRFUkZSQU1FV09SS19ICisjZGVmaW5lIFZLUkVOREVSRlJBTUVXT1JLX0gKKworI2luY2x1ZGUgImx2dF9mdW5jdGlvbl9wb2ludGVycy5oIgorCisjaWZkZWYgQU5EUk9JRAorI2luY2x1ZGUgInZrdGVzdGZyYW1ld29ya2FuZHJvaWQuaCIKK2NsYXNzIFZrSW1hZ2VPYmo7CisjZWxzZQorI2luY2x1ZGUgInZrdGVzdGZyYW1ld29yay5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFORFJPSUQpCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpZiBkZWZpbmVkKFZBTElEQVRJT05fQVBLKQorI2luY2x1ZGUgPGFuZHJvaWRfbmF0aXZlX2FwcF9nbHVlLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3VzaW5nIHZrX3Rlc3Rpbmc6Ok1ha2VWa0hhbmRsZXM7CisKK3RlbXBsYXRlIDxjbGFzcyBEc3QsIGNsYXNzIFNyYz4KK3N0ZDo6dmVjdG9yPERzdCAqPiBNYWtlVGVzdGJpbmRpbmdIYW5kbGVzKGNvbnN0IHN0ZDo6dmVjdG9yPFNyYyAqPiAmdikgeworICAgIHN0ZDo6dmVjdG9yPERzdCAqPiBoYW5kbGVzOworICAgIGhhbmRsZXMucmVzZXJ2ZSh2LnNpemUoKSk7CisgICAgc3RkOjp0cmFuc2Zvcm0odi5iZWdpbigpLCB2LmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoaGFuZGxlcyksIFtdKGNvbnN0IFNyYyAqbykgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RHN0ICo+KG8pOyB9KTsKKyAgICByZXR1cm4gaGFuZGxlczsKK30KKwordHlwZWRlZiB2a190ZXN0aW5nOjpRdWV1ZSBWa1F1ZXVlT2JqOworY2xhc3MgVmtEZXZpY2VPYmogOiBwdWJsaWMgdmtfdGVzdGluZzo6RGV2aWNlIHsKKyAgcHVibGljOgorICAgIFZrRGV2aWNlT2JqKHVpbnQzMl90IGlkLCBWa1BoeXNpY2FsRGV2aWNlIG9iaik7CisgICAgVmtEZXZpY2VPYmoodWludDMyX3QgaWQsIFZrUGh5c2ljYWxEZXZpY2Ugb2JqLCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+ICZleHRlbnNpb25fbmFtZXMsCisgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpmZWF0dXJlcyA9IG51bGxwdHIsIHZvaWQgKmNyZWF0ZV9kZXZpY2VfcG5leHQgPSBudWxscHRyKTsKKworICAgIHVpbnQzMl90IFF1ZXVlRmFtaWx5TWF0Y2hpbmcoVmtRdWV1ZUZsYWdzIHdpdGgsIFZrUXVldWVGbGFncyB3aXRob3V0LCBib29sIGFsbF9iaXRzID0gdHJ1ZSk7CisgICAgdWludDMyX3QgUXVldWVGYW1pbHlXaXRob3V0Q2FwYWJpbGl0aWVzKFZrUXVldWVGbGFncyBjYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgLy8gYW4gYWxsX2JpdHMgbWF0Y2ggd2l0aCAwIG1hdGNoZXMgYWxsCisgICAgICAgIHJldHVybiBRdWV1ZUZhbWlseU1hdGNoaW5nKFZrUXVldWVGbGFncygwKSwgY2FwYWJpbGl0aWVzLCB0cnVlIC8qIGFsbF9iaXRzIHdpdGggKi8pOworICAgIH0KKworICAgIFZrRGV2aWNlIGRldmljZSgpIHsgcmV0dXJuIGhhbmRsZSgpOyB9CisgICAgdm9pZCBTZXREZXZpY2VRdWV1ZSgpOworICAgIFZrUXVldWVPYmogKkdldERlZmF1bHRRdWV1ZSgpOworICAgIFZrUXVldWVPYmogKkdldERlZmF1bHRDb21wdXRlUXVldWUoKTsKKworICAgIHVpbnQzMl90IGlkOworICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIHByb3BzOworICAgIHN0ZDo6dmVjdG9yPFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzPiBxdWV1ZV9wcm9wczsKKworICAgIFZrUXVldWUgbV9xdWV1ZTsKK307CisKKy8vIEVycm9yTW9uaXRvciBVc2FnZToKKy8vCisvLyBDYWxsIFNldERlc2lyZWRGYWlsdXJlTXNnIHdpdGggYSBzdHJpbmcgdG8gYmUgY29tcGFyZWQgYWdhaW5zdCBhbGwKKy8vIGVuY291bnRlcmVkIGxvZyBtZXNzYWdlcywgb3IgYSB2YWxpZGF0aW9uIGVycm9yIGVudW0gaWRlbnRpZnlpbmcKKy8vIGRlc2lyZWQgZXJyb3IgbWVzc2FnZS4gUGFzc2luZyBOVUxMIG9yIFZBTElEQVRJT05fRVJST1JfTUFYX0VOVU0KKy8vIHdpbGwgbWF0Y2ggYWxsIGxvZyBtZXNzYWdlcy4gbG9nTXNnIHdpbGwgcmV0dXJuIHRydWUgZm9yIHNraXBDYWxsCisvLyBvbmx5IGlmIG1zZyBpcyBtYXRjaGVkIG9yIE5VTEwuCisvLworLy8gQ2FsbCBWZXJpZnlGb3VuZCB0byBkZXRlcm1pbmUgaWYgYWxsIGRlc2lyZWQgZmFpbHVyZSBtZXNzYWdlcworLy8gd2VyZSBlbmNvdW50ZXJlZC4gQ2FsbCBWZXJpZnlOb3RGb3VuZCB0byBkZXRlcm1pbmUgaWYgYW55IHVuZXhwZWN0ZWQKKy8vIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkLgorY2xhc3MgRXJyb3JNb25pdG9yIHsKKyAgcHVibGljOgorICAgIEVycm9yTW9uaXRvcigpOworCisgICAgfkVycm9yTW9uaXRvcigpIE5PRVhDRVBUOworCisgICAgLy8gU2V0IG1vbml0b3IgdG8gcHJpc3RpbmUgc3RhdGUKKyAgICB2b2lkIFJlc2V0KCk7CisKKyAgICAvLyBFcnJvck1vbml0b3Igd2lsbCBsb29rIGZvciBhbiBlcnJvciBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBzdHJpbmcocykKKyAgICB2b2lkIFNldERlc2lyZWRGYWlsdXJlTXNnKGNvbnN0IFZrRmxhZ3MgbXNnRmxhZ3MsIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZyk7CisgICAgdm9pZCBTZXREZXNpcmVkRmFpbHVyZU1zZyhjb25zdCBWa0ZsYWdzIG1zZ0ZsYWdzLCBjb25zdCBjaGFyICpjb25zdCBtc2dTdHJpbmcpOworCisgICAgLy8gRXJyb3JNb25pdG9yIHdpbGwgbG9vayBmb3IgYW4gZXJyb3IgbWVzc2FnZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgc3RyaW5nKHMpCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CisgICAgdm9pZCBTZXREZXNpcmVkRmFpbHVyZU1zZyhjb25zdCBWa0ZsYWdzIG1zZ0ZsYWdzLCBJdGVyIGl0ZXIsIGNvbnN0IEl0ZXIgZW5kKSB7CisgICAgICAgIGZvciAoOyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgICAgICBTZXREZXNpcmVkRmFpbHVyZU1zZyhtc2dGbGFncywgKml0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGFuIGVycm9yIHRoYXQgdGhlIGVycm9yIG1vbml0b3Igd2lsbCBpZ25vcmUuIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiBpZiB5b3UgYXJlIGNyZWF0aW5nIGEgbmV3IHRlc3QuCisgICAgLy8gVE9ETzogVGhpcyBpcyBzdG9wZ2FwIHRvIGJsb2NrIG5ldyB1bmV4cGVjdGVkIGVycm9ycyBmcm9tIGJlaW5nIGludHJvZHVjZWQuIFRoZSBsb25nLXRlcm0gZ29hbCBpcyB0byByZW1vdmUgdGhlIHVzZSBvZiB0aGlzCisgICAgLy8gZnVuY3Rpb24gYW5kIGl0cyBkZWZpbml0aW9uLgorICAgIHZvaWQgU2V0VW5leHBlY3RlZEVycm9yKGNvbnN0IGNoYXIgKmNvbnN0IG1zZyk7CisKKyAgICAvLyBTZXQgYW4gZXJyb3IgdGhhdCBzaG91bGQgbm90IGNhdXNlIGEgdGVzdCBmYWlsdXJlCisgICAgdm9pZCBTZXRBbGxvd2VkRmFpbHVyZU1zZyhjb25zdCBjaGFyICpjb25zdCBtc2cpOworCisgICAgVmtCb29sMzIgQ2hlY2tGb3JEZXNpcmVkTXNnKGNvbnN0IGNoYXIgKmNvbnN0IG1zZ1N0cmluZyk7CisgICAgdmVjdG9yPHN0cmluZz4gR2V0T3RoZXJGYWlsdXJlTXNncygpIGNvbnN0OworICAgIFZrRGVidWdSZXBvcnRGbGFnc0VYVCBHZXRNZXNzYWdlRmxhZ3MoKSBjb25zdDsKKyAgICBib29sIEFueURlc2lyZWRNc2dGb3VuZCgpIGNvbnN0OworICAgIGJvb2wgQWxsRGVzaXJlZE1zZ3NGb3VuZCgpIGNvbnN0OworICAgIHZvaWQgU2V0RXJyb3IoY29uc3QgY2hhciAqY29uc3QgZXJyb3JTdHJpbmcpOworICAgIHZvaWQgU2V0QmFpbG91dChib29sICpiYWlsb3V0KTsKKyAgICB2b2lkIER1bXBGYWlsdXJlTXNncygpIGNvbnN0OworCisgICAgLy8gSGVscGVycworCisgICAgLy8gRXhwZWN0U3VjY2VzcyBub3cgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgYWxsb3dpbmcgYSBjdXN0b20gY29tYmluYXRpb24gb2YgZGVidWcgZmxhZ3MKKyAgICB2b2lkIEV4cGVjdFN1Y2Nlc3MoVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUIGNvbnN0IG1lc3NhZ2VfZmxhZ19tYXNrID0gVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQpOworCisgICAgdm9pZCBWZXJpZnlGb3VuZCgpOworICAgIHZvaWQgVmVyaWZ5Tm90Rm91bmQoKTsKKworICBwcml2YXRlOgorICAgIC8vIFRPRE86IFRoaXMgaXMgc3RvcGdhcCB0byBibG9jayBuZXcgdW5leHBlY3RlZCBlcnJvcnMgZnJvbSBiZWluZyBpbnRyb2R1Y2VkLiBUaGUgbG9uZy10ZXJtIGdvYWwgaXMgdG8gcmVtb3ZlIHRoZSB1c2Ugb2YgdGhpcworICAgIC8vIGZ1bmN0aW9uIGFuZCBpdHMgZGVmaW5pdGlvbi4KKyAgICBib29sIElnbm9yZU1lc3NhZ2Uoc3RkOjpzdHJpbmcgY29uc3QgJm1zZykgY29uc3Q7CisKKyAgICBWa0ZsYWdzIG1lc3NhZ2VfZmxhZ3NfOworICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PHN0ZDo6c3RyaW5nPiBkZXNpcmVkX21lc3NhZ2Vfc3RyaW5nc187CisgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQ8c3RkOjpzdHJpbmc+IGZhaWx1cmVfbWVzc2FnZV9zdHJpbmdzXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWdub3JlX21lc3NhZ2Vfc3RyaW5nc187CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFsbG93ZWRfbWVzc2FnZV9zdHJpbmdzXzsKKyAgICB2ZWN0b3I8c3RyaW5nPiBvdGhlcl9tZXNzYWdlc187CisgICAgdGVzdF9wbGF0Zm9ybV90aHJlYWRfbXV0ZXggbXV0ZXhfOworICAgIGJvb2wgKmJhaWxvdXRfOworICAgIGJvb2wgbWVzc2FnZV9mb3VuZF87Cit9OworCitjbGFzcyBWa0NvbW1hbmRQb29sT2JqOworY2xhc3MgVmtDb21tYW5kQnVmZmVyT2JqOworY2xhc3MgVmtEZXB0aFN0ZW5jaWxPYmo7CisKK2NsYXNzIFZrUmVuZGVyRnJhbWV3b3JrIDogcHVibGljIFZrVGVzdEZyYW1ld29yayB7CisgIHB1YmxpYzoKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlKCkgeyByZXR1cm4gaW5zdDsgfQorICAgIFZrRGV2aWNlIGRldmljZSgpIHsgcmV0dXJuIG1fZGV2aWNlLT5kZXZpY2UoKTsgfQorICAgIFZrRGV2aWNlT2JqICpEZXZpY2VPYmooKSBjb25zdCB7IHJldHVybiBtX2RldmljZTsgfQorICAgIFZrUGh5c2ljYWxEZXZpY2UgZ3B1KCk7CisgICAgVmtSZW5kZXJQYXNzIHJlbmRlclBhc3MoKSB7IHJldHVybiBtX3JlbmRlclBhc3M7IH0KKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICZSZW5kZXJQYXNzSW5mbygpIGNvbnN0IHsgcmV0dXJuIHJlbmRlclBhc3NfaW5mb187IH07CisgICAgVmtGcmFtZWJ1ZmZlciBmcmFtZWJ1ZmZlcigpIHsgcmV0dXJuIG1fZnJhbWVidWZmZXI7IH0KKyAgICBFcnJvck1vbml0b3IgKk1vbml0b3IoKTsKKworICAgIHZvaWQgSW5pdFZpZXdwb3J0KGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpOworICAgIHZvaWQgSW5pdFZpZXdwb3J0KCk7CisgICAgYm9vbCBJbml0U3VyZmFjZSgpOworICAgIGJvb2wgSW5pdFN1cmZhY2UoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCk7CisgICAgYm9vbCBJbml0U3dhcGNoYWluKFZrU3VyZmFjZUtIUiAmc3VyZmFjZSwgVmtJbWFnZVVzYWdlRmxhZ3MgaW1hZ2VVc2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBwcmVUcmFuc2Zvcm0gPSBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSKTsKKyAgICBib29sIEluaXRTd2FwY2hhaW4oVmtJbWFnZVVzYWdlRmxhZ3MgaW1hZ2VVc2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklULAorICAgICAgICAgICAgICAgICAgICAgICBWa1N1cmZhY2VUcmFuc2Zvcm1GbGFnQml0c0tIUiBwcmVUcmFuc2Zvcm0gPSBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSKTsKKyAgICB2b2lkIERlc3Ryb3lTd2FwY2hhaW4oKTsKKyAgICB2b2lkIEluaXRSZW5kZXJUYXJnZXQoKTsKKyAgICB2b2lkIEluaXRSZW5kZXJUYXJnZXQodWludDMyX3QgdGFyZ2V0cyk7CisgICAgdm9pZCBJbml0UmVuZGVyVGFyZ2V0KFZrSW1hZ2VWaWV3ICpkc0JpbmRpbmcpOworICAgIHZvaWQgSW5pdFJlbmRlclRhcmdldCh1aW50MzJfdCB0YXJnZXRzLCBWa0ltYWdlVmlldyAqZHNCaW5kaW5nKTsKKyAgICB2b2lkIERlc3Ryb3lSZW5kZXJUYXJnZXQoKTsKKyAgICB2b2lkIEluaXRGcmFtZXdvcmsoUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCA9IE5VTEwsIHZvaWQgKnVzZXJEYXRhID0gTlVMTCwgdm9pZCAqaW5zdGFuY2VfcG5leHQgPSBOVUxMKTsKKworICAgIHZvaWQgU2h1dGRvd25GcmFtZXdvcmsoKTsKKyAgICB2b2lkIEdldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpmZWF0dXJlcyk7CisgICAgdm9pZCBHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgKnByb3BzKTsKKyAgICB2b2lkIEluaXRTdGF0ZShWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgKmZlYXR1cmVzID0gbnVsbHB0ciwgdm9pZCAqY3JlYXRlX2RldmljZV9wbmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIGZsYWdzID0gMCk7CisKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gJnJlbmRlclBhc3NCZWdpbkluZm8oKSBjb25zdCB7IHJldHVybiBtX3JlbmRlclBhc3NCZWdpbkluZm87IH0KKworICAgIGJvb2wgSW5zdGFuY2VMYXllclN1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBzcGVjVmVyc2lvbiA9IDAsIHVpbnQzMl90IGltcGxlbWVudGF0aW9uVmVyc2lvbiA9IDApOworICAgIGJvb2wgRW5hYmxlRGV2aWNlUHJvZmlsZUxheWVyKCk7CisgICAgYm9vbCBJbnN0YW5jZUV4dGVuc2lvblN1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBzcGVjVmVyc2lvbiA9IDApOworICAgIGJvb2wgSW5zdGFuY2VFeHRlbnNpb25FbmFibGVkKGNvbnN0IGNoYXIgKm5hbWUpOworICAgIGJvb2wgRGV2aWNlRXh0ZW5zaW9uU3VwcG9ydGVkKFZrUGh5c2ljYWxEZXZpY2UgZGV2LCBjb25zdCBjaGFyICpsYXllciwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3Qgc3BlY1ZlcnNpb24gPSAwKTsKKyAgICBib29sIERldmljZUV4dGVuc2lvbkVuYWJsZWQoY29uc3QgY2hhciAqbmFtZSk7CisgICAgYm9vbCBEZXZpY2VJc01vY2tJQ0QoKTsKKyAgICBib29sIERldmljZVNpbXVsYXRpb24oKTsKKworICBwcm90ZWN0ZWQ6CisgICAgVmtSZW5kZXJGcmFtZXdvcmsoKTsKKyAgICB2aXJ0dWFsIH5Wa1JlbmRlckZyYW1ld29yaygpID0gMDsKKworICAgIFZrQXBwbGljYXRpb25JbmZvIGFwcF9pbmZvOworICAgIFZrSW5zdGFuY2UgaW5zdDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIG9ianNbMTZdOworICAgIHVpbnQzMl90IGdwdV9jb3VudDsKKyAgICBWa0RldmljZU9iaiAqbV9kZXZpY2U7CisgICAgVmtDb21tYW5kUG9vbE9iaiAqbV9jb21tYW5kUG9vbDsKKyAgICBWa0NvbW1hbmRCdWZmZXJPYmogKm1fY29tbWFuZEJ1ZmZlcjsKKyAgICBWa1JlbmRlclBhc3MgbV9yZW5kZXJQYXNzOworICAgIFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gcmVuZGVyUGFzc19pbmZvXyA9IHt9OworICAgIFZrRnJhbWVidWZmZXIgbV9mcmFtZWJ1ZmZlcjsKKyAgICBWa1N1cmZhY2VLSFIgbV9zdXJmYWNlOworICAgIFZrU3dhcGNoYWluS0hSIG1fc3dhcGNoYWluOworICAgIEVycm9yTW9uaXRvciAqbV9lcnJvck1vbml0b3IgPSB7fTsKKyAgICBzdGQ6OnZlY3RvcjxWa1ZpZXdwb3J0PiBtX3ZpZXdwb3J0czsKKyAgICBzdGQ6OnZlY3RvcjxWa1JlY3QyRD4gbV9zY2lzc29yczsKKyAgICBmbG9hdCBtX2xpbmVXaWR0aDsKKyAgICBmbG9hdCBtX2RlcHRoQmlhc0NvbnN0YW50RmFjdG9yOworICAgIGZsb2F0IG1fZGVwdGhCaWFzQ2xhbXA7CisgICAgZmxvYXQgbV9kZXB0aEJpYXNTbG9wZUZhY3RvcjsKKyAgICBmbG9hdCBtX2JsZW5kQ29uc3RhbnRzWzRdOworICAgIGZsb2F0IG1fbWluRGVwdGhCb3VuZHM7CisgICAgZmxvYXQgbV9tYXhEZXB0aEJvdW5kczsKKyAgICB1aW50MzJfdCBtX2NvbXBhcmVNYXNrOworICAgIHVpbnQzMl90IG1fd3JpdGVNYXNrOworICAgIHVpbnQzMl90IG1fcmVmZXJlbmNlOworICAgIGJvb2wgbV9hZGRSZW5kZXJQYXNzU2VsZkRlcGVuZGVuY3k7CisgICAgc3RkOjp2ZWN0b3I8VmtDbGVhclZhbHVlPiBtX3JlbmRlclBhc3NDbGVhclZhbHVlczsKKyAgICBWa1JlbmRlclBhc3NCZWdpbkluZm8gbV9yZW5kZXJQYXNzQmVnaW5JbmZvOworICAgIHZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmtJbWFnZU9iaj4+IG1fcmVuZGVyVGFyZ2V0czsKKyAgICBmbG9hdCBtX3dpZHRoLCBtX2hlaWdodDsKKyAgICBWa0Zvcm1hdCBtX3JlbmRlcl90YXJnZXRfZm10OworICAgIFZrRm9ybWF0IG1fZGVwdGhfc3RlbmNpbF9mbXQ7CisgICAgVmtDbGVhckNvbG9yVmFsdWUgbV9jbGVhcl9jb2xvcjsKKyAgICBib29sIG1fY2xlYXJfdmlhX2xvYWRfb3A7CisgICAgZmxvYXQgbV9kZXB0aF9jbGVhcl9jb2xvcjsKKyAgICB1aW50MzJfdCBtX3N0ZW5jaWxfY2xlYXJfY29sb3I7CisgICAgVmtEZXB0aFN0ZW5jaWxPYmogKm1fZGVwdGhTdGVuY2lsOworICAgIFBGTl92a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgbV9DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrOworICAgIFBGTl92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIG1fRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2s7CisgICAgUEZOX3ZrRGVidWdSZXBvcnRNZXNzYWdlRVhUIG1fRGVidWdSZXBvcnRNZXNzYWdlOworICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBtX2dsb2JhbE1zZ0NhbGxiYWNrOworICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBtX2Rldk1zZ0NhbGxiYWNrOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBtX2luc3RhbmNlX2xheWVyX25hbWVzOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gbV9pbnN0YW5jZV9leHRlbnNpb25fbmFtZXM7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBtX2RldmljZV9leHRlbnNpb25fbmFtZXM7Cit9OworCitjbGFzcyBWa0Rlc2NyaXB0b3JTZXRPYmo7CitjbGFzcyBWa0NvbnN0YW50QnVmZmVyT2JqOworY2xhc3MgVmtQaXBlbGluZU9iajsKK2NsYXNzIFZrRGVzY3JpcHRvclNldE9iajsKK3R5cGVkZWYgdmtfdGVzdGluZzo6RmVuY2UgVmtGZW5jZU9iajsKK3R5cGVkZWYgdmtfdGVzdGluZzo6QnVmZmVyIFZrQnVmZmVyT2JqOwordHlwZWRlZiB2a190ZXN0aW5nOjpBY2NlbGVyYXRpb25TdHJ1Y3R1cmUgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVPYmo7CisKK2NsYXNzIFZrQ29tbWFuZFBvb2xPYmogOiBwdWJsaWMgdmtfdGVzdGluZzo6Q29tbWFuZFBvb2wgeworICBwdWJsaWM6CisgICAgVmtDb21tYW5kUG9vbE9iaihWa0RldmljZU9iaiAqZGV2aWNlLCB1aW50MzJfdCBxdWV1ZV9mYW1pbHlfaW5kZXgsIFZrQ29tbWFuZFBvb2xDcmVhdGVGbGFncyBmbGFncyA9IDApOworfTsKKworY2xhc3MgVmtDb21tYW5kQnVmZmVyT2JqIDogcHVibGljIHZrX3Rlc3Rpbmc6OkNvbW1hbmRCdWZmZXIgeworICBwdWJsaWM6CisgICAgVmtDb21tYW5kQnVmZmVyT2JqKFZrRGV2aWNlT2JqICpkZXZpY2UsIFZrQ29tbWFuZFBvb2xPYmogKnBvb2wsIFZrQ29tbWFuZEJ1ZmZlckxldmVsIGxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgVmtRdWV1ZU9iaiAqcXVldWUgPSBudWxscHRyKTsKKyAgICB2b2lkIFBpcGVsaW5lQmFycmllcihWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNfc3RhZ2VzLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkZXN0X3N0YWdlcywgVmtEZXBlbmRlbmN5RmxhZ3MgZGVwZW5kZW5jeUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyICpwTWVtb3J5QmFycmllcnMsIHVpbnQzMl90IGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKnBCdWZmZXJNZW1vcnlCYXJyaWVycywgdWludDMyX3QgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKyAgICB2b2lkIENsZWFyQWxsQnVmZmVycyhjb25zdCB2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFZrSW1hZ2VPYmo+PiAmY29sb3Jfb2JqcywgVmtDbGVhckNvbG9yVmFsdWUgY2xlYXJfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXB0aFN0ZW5jaWxPYmogKmRlcHRoX3N0ZW5jaWxfb2JqLCBmbG9hdCBkZXB0aF9jbGVhcl92YWx1ZSwgdWludDMyX3Qgc3RlbmNpbF9jbGVhcl92YWx1ZSk7CisgICAgdm9pZCBQcmVwYXJlQXR0YWNobWVudHMoY29uc3QgdmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxWa0ltYWdlT2JqPj4gJmNvbG9yX2F0dHMsIFZrRGVwdGhTdGVuY2lsT2JqICpkZXB0aF9zdGVuY2lsX2F0dCk7CisgICAgdm9pZCBCaW5kRGVzY3JpcHRvclNldChWa0Rlc2NyaXB0b3JTZXRPYmogJmRlc2NyaXB0b3JTZXQpOworICAgIHZvaWQgQmluZEluZGV4QnVmZmVyKFZrQnVmZmVyT2JqICppbmRleEJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtJbmRleFR5cGUgaW5kZXhUeXBlKTsKKyAgICB2b2lkIEJpbmRWZXJ0ZXhCdWZmZXIoVmtDb25zdGFudEJ1ZmZlck9iaiAqdmVydGV4QnVmZmVyLCBWa0RldmljZVNpemUgb2Zmc2V0LCB1aW50MzJfdCBiaW5kaW5nKTsKKyAgICB2b2lkIEJlZ2luUmVuZGVyUGFzcyhjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gJmluZm8pOworICAgIHZvaWQgRW5kUmVuZGVyUGFzcygpOworICAgIHZvaWQgRmlsbEJ1ZmZlcihWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBmaWxsX3NpemUsIHVpbnQzMl90IGRhdGEpOworICAgIHZvaWQgRHJhdyh1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RWZXJ0ZXgsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UpOworICAgIHZvaWQgRHJhd0luZGV4ZWQodWludDMyX3QgaW5kZXhDb3VudCwgdWludDMyX3QgaW5zdGFuY2VDb3VudCwgdWludDMyX3QgZmlyc3RJbmRleCwgaW50MzJfdCB2ZXJ0ZXhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdEluc3RhbmNlKTsKKyAgICB2b2lkIFF1ZXVlQ29tbWFuZEJ1ZmZlcihib29sIGNoZWNrU3VjY2VzcyA9IHRydWUpOworICAgIHZvaWQgUXVldWVDb21tYW5kQnVmZmVyKGNvbnN0IFZrRmVuY2VPYmogJmZlbmNlLCBib29sIGNoZWNrU3VjY2VzcyA9IHRydWUpOworICAgIHZvaWQgU2V0Vmlld3BvcnQodWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydCAqcFZpZXdwb3J0cyk7CisgICAgdm9pZCBTZXRTdGVuY2lsUmVmZXJlbmNlKFZrU3RlbmNpbEZhY2VGbGFncyBmYWNlTWFzaywgdWludDMyX3QgcmVmZXJlbmNlKTsKKyAgICB2b2lkIFVwZGF0ZUJ1ZmZlcihWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBkc3RPZmZzZXQsIFZrRGV2aWNlU2l6ZSBkYXRhU2l6ZSwgY29uc3Qgdm9pZCAqcERhdGEpOworICAgIHZvaWQgQ29weUltYWdlKFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnaW9uQ291bnQsIGNvbnN0IFZrSW1hZ2VDb3B5ICpwUmVnaW9ucyk7CisgICAgdm9pZCBSZXNvbHZlSW1hZ2UoVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtJbWFnZVJlc29sdmUgKnBSZWdpb25zKTsKKyAgICB2b2lkIENsZWFyQ29sb3JJbWFnZShWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSAqcENvbG9yLCB1aW50MzJfdCByYW5nZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKTsKKyAgICB2b2lkIENsZWFyRGVwdGhTdGVuY2lsSW1hZ2UoVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlICpwQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmdlQ291bnQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpwUmFuZ2VzKTsKKyAgICB2b2lkIEJ1aWxkQWNjZWxlcmF0aW9uU3RydWN0dXJlKFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlT2JqICphcywgVmtCdWZmZXIgc2NyYXRjaEJ1ZmZlcik7CisgICAgdm9pZCBCdWlsZEFjY2VsZXJhdGlvblN0cnVjdHVyZShWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU9iaiAqYXMsIFZrQnVmZmVyIHNjcmF0Y2hCdWZmZXIsIFZrQnVmZmVyIGluc3RhbmNlRGF0YSk7CisKKyAgcHJvdGVjdGVkOgorICAgIFZrRGV2aWNlT2JqICptX2RldmljZTsKKyAgICBWa1F1ZXVlT2JqICptX3F1ZXVlOworfTsKKworY2xhc3MgVmtDb25zdGFudEJ1ZmZlck9iaiA6IHB1YmxpYyBWa0J1ZmZlck9iaiB7CisgIHB1YmxpYzoKKyAgICBWa0NvbnN0YW50QnVmZmVyT2JqKFZrRGV2aWNlT2JqICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8IFZLX0JVRkZFUl9VU0FHRV9UUkFOU0ZFUl9EU1RfQklUKTsKKyAgICBWa0NvbnN0YW50QnVmZmVyT2JqKFZrRGV2aWNlT2JqICpkZXZpY2UsIFZrRGV2aWNlU2l6ZSBzaXplLCBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgVmtCdWZmZXJVc2FnZUZsYWdzIHVzYWdlID0gVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCk7CisKKyAgICBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvIG1fZGVzY3JpcHRvckJ1ZmZlckluZm87CisKKyAgcHJvdGVjdGVkOgorICAgIFZrRGV2aWNlT2JqICptX2RldmljZTsKK307CisKK2NsYXNzIFZrUmVuZGVycGFzc09iaiB7CisgIHB1YmxpYzoKKyAgICBWa1JlbmRlcnBhc3NPYmooVmtEZXZpY2VPYmogKmRldmljZSk7CisgICAgflZrUmVuZGVycGFzc09iaigpIE5PRVhDRVBUOworICAgIFZrUmVuZGVyUGFzcyBoYW5kbGUoKSB7IHJldHVybiBtX3JlbmRlcnBhc3M7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgVmtSZW5kZXJQYXNzIG1fcmVuZGVycGFzczsKKyAgICBWa0RldmljZSBkZXZpY2U7Cit9OworCitjbGFzcyBWa0ltYWdlT2JqIDogcHVibGljIHZrX3Rlc3Rpbmc6OkltYWdlIHsKKyAgcHVibGljOgorICAgIFZrSW1hZ2VPYmooVmtEZXZpY2VPYmogKmRldik7CisgICAgYm9vbCBJc0NvbXBhdGlibGUoVmtJbWFnZVVzYWdlRmxhZ3MgdXNhZ2VzLCBWa0Zvcm1hdEZlYXR1cmVGbGFncyBmZWF0dXJlcyk7CisKKyAgcHVibGljOgorICAgIHZvaWQgSW5pdCh1aW50MzJfdCBjb25zdCB3aWR0aCwgdWludDMyX3QgY29uc3QgaGVpZ2h0LCB1aW50MzJfdCBjb25zdCBtaXBMZXZlbHMsIFZrRm9ybWF0IGNvbnN0IGZvcm1hdCwgVmtGbGFncyBjb25zdCB1c2FnZSwKKyAgICAgICAgICAgICAgVmtJbWFnZVRpbGluZyBjb25zdCB0aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfTElORUFSLCBWa01lbW9yeVByb3BlcnR5RmxhZ3MgY29uc3QgcmVxcyA9IDAsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqcXVldWVfZmFtaWxpZXMgPSBudWxscHRyLCBib29sIG1lbW9yeSA9IHRydWUpOworICAgIHZvaWQgaW5pdChjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqY3JlYXRlX2luZm8pOworCisgICAgdm9pZCBJbml0Tm9MYXlvdXQodWludDMyX3QgY29uc3Qgd2lkdGgsIHVpbnQzMl90IGNvbnN0IGhlaWdodCwgdWludDMyX3QgY29uc3QgbWlwTGV2ZWxzLCBWa0Zvcm1hdCBjb25zdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgVmtGbGFncyBjb25zdCB1c2FnZSwgVmtJbWFnZVRpbGluZyB0aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfTElORUFSLCBWa01lbW9yeVByb3BlcnR5RmxhZ3MgcmVxcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICpxdWV1ZV9mYW1pbGllcyA9IG51bGxwdHIsIGJvb2wgbWVtb3J5ID0gdHJ1ZSk7CisKKyAgICAvLyAgICB2b2lkIGNsZWFyKCBDb21tYW5kQnVmZmVyKiwgdWludDMyX3RbNF0gKTsKKworICAgIHZvaWQgTGF5b3V0KFZrSW1hZ2VMYXlvdXQgY29uc3QgbGF5b3V0KSB7IG1fZGVzY3JpcHRvckltYWdlSW5mby5pbWFnZUxheW91dCA9IGxheW91dDsgfQorCisgICAgVmtEZXZpY2VNZW1vcnkgbWVtb3J5KCkgY29uc3QgeyByZXR1cm4gSW1hZ2U6Om1lbW9yeSgpLmhhbmRsZSgpOyB9CisKKyAgICB2b2lkICpNYXBNZW1vcnkoKSB7IHJldHVybiBJbWFnZTo6bWVtb3J5KCkubWFwKCk7IH0KKworICAgIHZvaWQgVW5tYXBNZW1vcnkoKSB7IEltYWdlOjptZW1vcnkoKS51bm1hcCgpOyB9CisKKyAgICB2b2lkIEltYWdlTWVtb3J5QmFycmllcihWa0NvbW1hbmRCdWZmZXJPYmogKmNtZCwgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdCwgVmtGbGFncyBvdXRwdXRfbWFzaywgVmtGbGFncyBpbnB1dF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgaW1hZ2VfbGF5b3V0LCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNfc3RhZ2VzID0gVktfUElQRUxJTkVfU1RBR0VfQUxMX0NPTU1BTkRTX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkZXN0X3N0YWdlcyA9IFZLX1BJUEVMSU5FX1NUQUdFX0FMTF9DT01NQU5EU19CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFF1ZXVlRmFtaWx5SW5kZXggPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCk7CisKKyAgICBWa1Jlc3VsdCBDb3B5SW1hZ2UoVmtJbWFnZU9iaiAmc3JjX2ltYWdlKTsKKworICAgIFZrUmVzdWx0IENvcHlJbWFnZU91dChWa0ltYWdlT2JqICZkc3RfaW1hZ2UpOworCisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQzMl90LCAxNj4sIDE2PiBSZWFkKCk7CisKKyAgICBWa0ltYWdlIGltYWdlKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlKCk7IH0KKworICAgIFZrSW1hZ2VWaWV3IHRhcmdldFZpZXcoVmtGb3JtYXQgZm9ybWF0LCBWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0ID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCkgeworICAgICAgICBpZiAoIW1fdGFyZ2V0Vmlldy5pbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gY3JlYXRlVmlldyA9IHt9OworICAgICAgICAgICAgY3JlYXRlVmlldy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk87CisgICAgICAgICAgICBjcmVhdGVWaWV3LmltYWdlID0gaGFuZGxlKCk7CisgICAgICAgICAgICBjcmVhdGVWaWV3LnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJEOworICAgICAgICAgICAgY3JlYXRlVmlldy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICBjcmVhdGVWaWV3LmNvbXBvbmVudHMuciA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX1I7CisgICAgICAgICAgICBjcmVhdGVWaWV3LmNvbXBvbmVudHMuZyA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0c7CisgICAgICAgICAgICBjcmVhdGVWaWV3LmNvbXBvbmVudHMuYiA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0I7CisgICAgICAgICAgICBjcmVhdGVWaWV3LmNvbXBvbmVudHMuYSA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0E7CisgICAgICAgICAgICBjcmVhdGVWaWV3LnN1YnJlc291cmNlUmFuZ2UgPSB7YXNwZWN0LCAwLCAxLCAwLCAxfTsKKyAgICAgICAgICAgIGNyZWF0ZVZpZXcuZmxhZ3MgPSAwOworICAgICAgICAgICAgbV90YXJnZXRWaWV3LmluaXQoKm1fZGV2aWNlLCBjcmVhdGVWaWV3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbV90YXJnZXRWaWV3LmhhbmRsZSgpOworICAgIH0KKworICAgIHZvaWQgU2V0TGF5b3V0KFZrQ29tbWFuZEJ1ZmZlck9iaiAqY21kX2J1ZiwgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdCwgVmtJbWFnZUxheW91dCBpbWFnZV9sYXlvdXQpOworICAgIHZvaWQgU2V0TGF5b3V0KFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3QsIFZrSW1hZ2VMYXlvdXQgaW1hZ2VfbGF5b3V0KTsKKworICAgIFZrSW1hZ2VMYXlvdXQgTGF5b3V0KCkgY29uc3QgeyByZXR1cm4gbV9kZXNjcmlwdG9ySW1hZ2VJbmZvLmltYWdlTGF5b3V0OyB9CisgICAgdWludDMyX3Qgd2lkdGgoKSBjb25zdCB7IHJldHVybiBleHRlbnQoKS53aWR0aDsgfQorICAgIHVpbnQzMl90IGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGV4dGVudCgpLmhlaWdodDsgfQorICAgIFZrRGV2aWNlT2JqICpkZXZpY2UoKSBjb25zdCB7IHJldHVybiBtX2RldmljZTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBWa0RldmljZU9iaiAqbV9kZXZpY2U7CisKKyAgICB2a190ZXN0aW5nOjpJbWFnZVZpZXcgbV90YXJnZXRWaWV3OworICAgIFZrRGVzY3JpcHRvckltYWdlSW5mbyBtX2Rlc2NyaXB0b3JJbWFnZUluZm87Cit9OworCitjbGFzcyBWa1RleHR1cmVPYmogOiBwdWJsaWMgVmtJbWFnZU9iaiB7CisgIHB1YmxpYzoKKyAgICBWa1RleHR1cmVPYmooVmtEZXZpY2VPYmogKmRldmljZSwgdWludDMyX3QgKmNvbG9ycyA9IE5VTEwpOworCisgICAgY29uc3QgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvICZEZXNjcmlwdG9ySW1hZ2VJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9kZXNjcmlwdG9ySW1hZ2VJbmZvOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIFZrRGV2aWNlT2JqICptX2RldmljZTsKKyAgICB2a190ZXN0aW5nOjpJbWFnZVZpZXcgbV90ZXh0dXJlVmlldzsKK307CisKK2NsYXNzIFZrRGVwdGhTdGVuY2lsT2JqIDogcHVibGljIFZrSW1hZ2VPYmogeworICBwdWJsaWM6CisgICAgVmtEZXB0aFN0ZW5jaWxPYmooVmtEZXZpY2VPYmogKmRldmljZSk7CisgICAgdm9pZCBJbml0KFZrRGV2aWNlT2JqICpkZXZpY2UsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlID0gVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCk7CisgICAgYm9vbCBJbml0aWFsaXplZCgpOworICAgIFZrSW1hZ2VWaWV3ICpCaW5kSW5mbygpOworCisgICAgVmtGb3JtYXQgRm9ybWF0KCkgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIFZrRGV2aWNlT2JqICptX2RldmljZTsKKyAgICBib29sIG1faW5pdGlhbGl6ZWQ7CisgICAgdmtfdGVzdGluZzo6SW1hZ2VWaWV3IG1faW1hZ2VWaWV3OworICAgIFZrRm9ybWF0IG1fZGVwdGhfc3RlbmNpbF9mbXQ7CisgICAgVmtJbWFnZVZpZXcgbV9hdHRhY2htZW50QmluZEluZm87Cit9OworCitjbGFzcyBWa1NhbXBsZXJPYmogOiBwdWJsaWMgdmtfdGVzdGluZzo6U2FtcGxlciB7CisgIHB1YmxpYzoKKyAgICBWa1NhbXBsZXJPYmooVmtEZXZpY2VPYmogKmRldmljZSk7CisKKyAgcHJvdGVjdGVkOgorICAgIFZrRGV2aWNlT2JqICptX2RldmljZTsKK307CisKK2NsYXNzIFZrRGVzY3JpcHRvclNldExheW91dE9iaiA6IHB1YmxpYyB2a190ZXN0aW5nOjpEZXNjcmlwdG9yU2V0TGF5b3V0IHsKKyAgcHVibGljOgorICAgIFZrRGVzY3JpcHRvclNldExheW91dE9iaigpID0gZGVmYXVsdDsKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmooY29uc3QgVmtEZXZpY2VPYmogKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZz4gJmRlc2NyaXB0b3Jfc2V0X2JpbmRpbmdzID0ge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUZsYWdzIGZsYWdzID0gMCwgdm9pZCAqcE5leHQgPSBOVUxMKTsKKworICAgIC8vIE1vdmUgY29uc3RydWN0b3IgYW5kIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvciBmb3IgVmlzdWFsIFN0dWRpbyAyMDEzCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0T2JqKFZrRGVzY3JpcHRvclNldExheW91dE9iaiAmJnNyYykgTk9FWENFUFQgOiBEZXNjcmlwdG9yU2V0TGF5b3V0KHN0ZDo6bW92ZShzcmMpKXt9OworICAgIFZrRGVzY3JpcHRvclNldExheW91dE9iaiAmb3BlcmF0b3I9KFZrRGVzY3JpcHRvclNldExheW91dE9iaiAmJnNyYykgTk9FWENFUFQgeworICAgICAgICBEZXNjcmlwdG9yU2V0TGF5b3V0OjpvcGVyYXRvcj0oc3RkOjptb3ZlKHNyYykpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorfTsKKworY2xhc3MgVmtEZXNjcmlwdG9yU2V0T2JqIDogcHVibGljIHZrX3Rlc3Rpbmc6OkRlc2NyaXB0b3JQb29sIHsKKyAgcHVibGljOgorICAgIFZrRGVzY3JpcHRvclNldE9iaihWa0RldmljZU9iaiAqZGV2aWNlKTsKKyAgICB+VmtEZXNjcmlwdG9yU2V0T2JqKCkgTk9FWENFUFQ7CisKKyAgICBpbnQgQXBwZW5kRHVtbXkoKTsKKyAgICBpbnQgQXBwZW5kQnVmZmVyKFZrRGVzY3JpcHRvclR5cGUgdHlwZSwgVmtDb25zdGFudEJ1ZmZlck9iaiAmY29uc3RhbnRCdWZmZXIpOworICAgIGludCBBcHBlbmRTYW1wbGVyVGV4dHVyZShWa1NhbXBsZXJPYmogKnNhbXBsZXIsIFZrVGV4dHVyZU9iaiAqdGV4dHVyZSk7CisgICAgdm9pZCBDcmVhdGVWS0Rlc2NyaXB0b3JTZXQoVmtDb21tYW5kQnVmZmVyT2JqICpjb21tYW5kQnVmZmVyKTsKKworICAgIFZrRGVzY3JpcHRvclNldCBHZXREZXNjcmlwdG9yU2V0SGFuZGxlKCkgY29uc3Q7CisgICAgVmtQaXBlbGluZUxheW91dCBHZXRQaXBlbGluZUxheW91dCgpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKyAgICBWa0RldmljZU9iaiAqbV9kZXZpY2U7CisgICAgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZz4gbV9sYXlvdXRfYmluZGluZ3M7CisgICAgc3RkOjptYXA8VmtEZXNjcmlwdG9yVHlwZSwgaW50PiBtX3R5cGVfY291bnRzOworICAgIGludCBtX25leHRTbG90OworCisgICAgdmVjdG9yPFZrRGVzY3JpcHRvckltYWdlSW5mbz4gbV9pbWFnZVNhbXBsZXJEZXNjcmlwdG9yczsKKyAgICB2ZWN0b3I8VmtXcml0ZURlc2NyaXB0b3JTZXQ+IG1fd3JpdGVzOworCisgICAgdmtfdGVzdGluZzo6RGVzY3JpcHRvclNldExheW91dCBtX2xheW91dDsKKyAgICB2a190ZXN0aW5nOjpQaXBlbGluZUxheW91dCBtX3BpcGVsaW5lX2xheW91dDsKKyAgICB2a190ZXN0aW5nOjpEZXNjcmlwdG9yU2V0ICptX3NldCA9IE5VTEw7Cit9OworCitjbGFzcyBWa1NoYWRlck9iaiA6IHB1YmxpYyB2a190ZXN0aW5nOjpTaGFkZXJNb2R1bGUgeworICBwdWJsaWM6CisgICAgVmtTaGFkZXJPYmooVmtEZXZpY2VPYmogKmRldmljZSwgY29uc3QgY2hhciAqc2hhZGVyVGV4dCwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHN0YWdlLCBWa1JlbmRlckZyYW1ld29yayAqZnJhbWV3b3JrLAorICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUgPSAibWFpbiIsIGJvb2wgZGVidWcgPSBmYWxzZSwgVmtTcGVjaWFsaXphdGlvbkluZm8gKnNwZWNJbmZvID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzcGlydl9taW5vcl92ZXJzaW9uID0gMCk7CisgICAgVmtTaGFkZXJPYmooVmtEZXZpY2VPYmogKmRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcgc3B2X3NvdXJjZSwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHN0YWdlLCBWa1JlbmRlckZyYW1ld29yayAqZnJhbWV3b3JrLAorICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUgPSAibWFpbiIsIFZrU3BlY2lhbGl6YXRpb25JbmZvICpzcGVjSW5mbyA9IG51bGxwdHIpOworICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gY29uc3QgJkdldFN0YWdlQ3JlYXRlSW5mbygpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKyAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvIG1fc3RhZ2VfaW5mbzsKKyAgICBWa0RldmljZU9iaiAqbV9kZXZpY2U7Cit9OworCitjbGFzcyBWa1BpcGVsaW5lTGF5b3V0T2JqIDogcHVibGljIHZrX3Rlc3Rpbmc6OlBpcGVsaW5lTGF5b3V0IHsKKyAgcHVibGljOgorICAgIFZrUGlwZWxpbmVMYXlvdXRPYmooKSA9IGRlZmF1bHQ7CisgICAgVmtQaXBlbGluZUxheW91dE9iaihWa0RldmljZU9iaiAqZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRPYmogKj4gJmRlc2NyaXB0b3JfbGF5b3V0cyA9IHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtQdXNoQ29uc3RhbnRSYW5nZT4gJnB1c2hfY29uc3RhbnRfcmFuZ2VzID0ge30pOworCisgICAgLy8gTW92ZSBjb25zdHJ1Y3RvciBhbmQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yIGZvciBWaXN1YWwgU3R1ZGlvIDIwMTMKKyAgICBWa1BpcGVsaW5lTGF5b3V0T2JqKFZrUGlwZWxpbmVMYXlvdXRPYmogJiZzcmMpIE5PRVhDRVBUIDogUGlwZWxpbmVMYXlvdXQoc3RkOjptb3ZlKHNyYykpIHt9CisgICAgVmtQaXBlbGluZUxheW91dE9iaiAmb3BlcmF0b3I9KFZrUGlwZWxpbmVMYXlvdXRPYmogJiZzcmMpIE5PRVhDRVBUIHsKKyAgICAgICAgUGlwZWxpbmVMYXlvdXQ6Om9wZXJhdG9yPShzdGQ6Om1vdmUoc3JjKSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkIFJlc2V0KCk7Cit9OworCitjbGFzcyBWa1BpcGVsaW5lT2JqIDogcHVibGljIHZrX3Rlc3Rpbmc6OlBpcGVsaW5lIHsKKyAgcHVibGljOgorICAgIFZrUGlwZWxpbmVPYmooVmtEZXZpY2VPYmogKmRldmljZSk7CisgICAgdm9pZCBBZGRTaGFkZXIoVmtTaGFkZXJPYmogKnNoYWRlck9iaik7CisgICAgdm9pZCBBZGRTaGFkZXIoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyBjb25zdCAmY3JlYXRlSW5mbyk7CisgICAgdm9pZCBBZGRWZXJ0ZXhJbnB1dEF0dHJpYnMoVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uICp2aV9hdHRyaWIsIHVpbnQzMl90IGNvdW50KTsKKyAgICB2b2lkIEFkZFZlcnRleElucHV0QmluZGluZ3MoVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiAqdmlfYmluZGluZywgdWludDMyX3QgY291bnQpOworICAgIHZvaWQgQWRkQ29sb3JBdHRhY2htZW50KHVpbnQzMl90IGJpbmRpbmcsIGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlICZhdHQpOworICAgIHZvaWQgTWFrZUR5bmFtaWMoVmtEeW5hbWljU3RhdGUgc3RhdGUpOworCisgICAgdm9pZCBBZGREZWZhdWx0Q29sb3JBdHRhY2htZW50KFZrQ29sb3JDb21wb25lbnRGbGFncyB3cml0ZU1hc2sgPSAweGYgLyo9UnxHfEJ8QSovKSB7CisgICAgICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlIGF0dCA9IHt9OworICAgICAgICBhdHQuYmxlbmRFbmFibGUgPSBWS19GQUxTRTsKKyAgICAgICAgYXR0LmNvbG9yV3JpdGVNYXNrID0gd3JpdGVNYXNrOworICAgICAgICBBZGRDb2xvckF0dGFjaG1lbnQoMCwgYXR0KTsKKyAgICB9CisKKyAgICB2b2lkIFNldERlcHRoU3RlbmNpbChjb25zdCBWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvICopOworICAgIHZvaWQgU2V0TVNBQShjb25zdCBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gKm1zX3N0YXRlKTsKKyAgICB2b2lkIFNldElucHV0QXNzZW1ibHkoY29uc3QgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gKmlhX3N0YXRlKTsKKyAgICB2b2lkIFNldFJhc3Rlcml6YXRpb24oY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gKnJzX3N0YXRlKTsKKyAgICB2b2lkIFNldFRlc3NlbGxhdGlvbihjb25zdCBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvICp0ZV9zdGF0ZSk7CisgICAgdm9pZCBTZXRWaWV3cG9ydChjb25zdCB2ZWN0b3I8VmtWaWV3cG9ydD4gdmlld3BvcnRzKTsKKyAgICB2b2lkIFNldFNjaXNzb3IoY29uc3QgdmVjdG9yPFZrUmVjdDJEPiBzY2lzc29ycyk7CisgICAgdm9pZCBTZXRMaW5lU3RhdGUoY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUICpsaW5lX3N0YXRlKTsKKworICAgIHZvaWQgSW5pdEdyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKmdwX2NpKTsKKworICAgIFZrUmVzdWx0IENyZWF0ZVZLUGlwZWxpbmUoVmtQaXBlbGluZUxheW91dCBsYXlvdXQsIFZrUmVuZGVyUGFzcyByZW5kZXJfcGFzcywgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqZ3BfY2kgPSBudWxscHRyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvIG1fdmlfc3RhdGU7CisgICAgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gbV9pYV9zdGF0ZTsKKyAgICBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyBtX3JzX3N0YXRlOworICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIG1fY2Jfc3RhdGU7CisgICAgVmtQaXBlbGluZURlcHRoU3RlbmNpbFN0YXRlQ3JlYXRlSW5mbyBjb25zdCAqbV9kc19zdGF0ZTsKKyAgICBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gbV92cF9zdGF0ZTsKKyAgICBWa1BpcGVsaW5lTXVsdGlzYW1wbGVTdGF0ZUNyZWF0ZUluZm8gbV9tc19zdGF0ZTsKKyAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvIGNvbnN0ICptX3RlX3N0YXRlOworICAgIFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvIG1fcGRfc3RhdGU7CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25MaW5lU3RhdGVDcmVhdGVJbmZvRVhUIG1fbGluZV9zdGF0ZTsKKyAgICB2ZWN0b3I8VmtEeW5hbWljU3RhdGU+IG1fZHluYW1pY19zdGF0ZV9lbmFibGVzOworICAgIHZlY3RvcjxWa1ZpZXdwb3J0PiBtX3ZpZXdwb3J0czsKKyAgICB2ZWN0b3I8VmtSZWN0MkQ+IG1fc2Npc3NvcnM7CisgICAgVmtEZXZpY2VPYmogKm1fZGV2aWNlOworICAgIHZlY3RvcjxWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvPiBtX3NoYWRlclN0YWdlczsKKyAgICB2ZWN0b3I8VmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGU+IG1fY29sb3JBdHRhY2htZW50czsKK307CisKKyNlbmRpZiAgLy8gVktSRU5ERVJGUkFNRVdPUktfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0YmluZGluZy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a3Rlc3RiaW5kaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZkOWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0YmluZGluZy5jcHAKQEAgLTAsMCArMSw4NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqLworCisjaW5jbHVkZSAidmt0ZXN0YmluZGluZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBtZW1zZXQoKSwgbWVtY21wKCkKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgInZrX3R5cGVtYXBfaGVscGVyLmgiCisKK25hbWVzcGFjZSB7CisKKyNkZWZpbmUgTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfSU5JVChjcmVhdGVfZnVuYywgZGV2LCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhhbmRsZV90eXBlIGhhbmRsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEVYUEVDVChjcmVhdGVfZnVuYyhkZXYuaGFuZGxlKCksIF9fVkFfQVJHU19fLCBOVUxMLCAmaGFuZGxlKSA9PSBWS19TVUNDRVNTKSkgXAorICAgICAgICAgICAgTm9uRGlzcEhhbmRsZTo6aW5pdChkZXYuaGFuZGxlKCksIGhhbmRsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9EVE9SKGNscywgZGVzdHJveV9mdW5jKSAgICAgICAgICAgIFwKKyAgICBjbHM6On5jbHMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpbml0aWFsaXplZCgpKSBkZXN0cm95X2Z1bmMoZGV2aWNlKCksIGhhbmRsZSgpLCBOVUxMKTsgXAorICAgIH0KKworI2RlZmluZSBTVFJJTkdJRlkoeCkgI3gKKyNkZWZpbmUgRVhQRUNUKGV4cHIpICgoZXhwcikgPyB0cnVlIDogZXhwZWN0X2ZhaWx1cmUoU1RSSU5HSUZZKGV4cHIpLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykpCisKK3ZrX3Rlc3Rpbmc6OkVycm9yQ2FsbGJhY2sgZXJyb3JfY2FsbGJhY2s7CisKK2Jvb2wgZXhwZWN0X2ZhaWx1cmUoY29uc3QgY2hhciAqZXhwciwgY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uKSB7CisgICAgaWYgKGVycm9yX2NhbGxiYWNrKSB7CisgICAgICAgIGVycm9yX2NhbGxiYWNrKGV4cHIsIGZpbGUsIGxpbmUsIGZ1bmN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmNlcnIgPDwgZmlsZSA8PCAiOiIgPDwgbGluZSA8PCAiOiAiIDw8IGZ1bmN0aW9uIDw8ICI6IEV4cGVjdGF0aW9uIGAiIDw8IGV4cHIgPDwgIicgZmFpbGVkLlxuIjsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgdmtfdGVzdGluZyB7CisKK3ZvaWQgc2V0X2Vycm9yX2NhbGxiYWNrKEVycm9yQ2FsbGJhY2sgY2FsbGJhY2spIHsgZXJyb3JfY2FsbGJhY2sgPSBjYWxsYmFjazsgfQorCitWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBQaHlzaWNhbERldmljZTo6cHJvcGVydGllcygpIGNvbnN0IHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBpbmZvOworCisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcyhoYW5kbGUoKSwgJmluZm8pOworCisgICAgcmV0dXJuIGluZm87Cit9CisKK3N0ZDo6dmVjdG9yPFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzPiBQaHlzaWNhbERldmljZTo6cXVldWVfcHJvcGVydGllcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllcz4gaW5mbzsKKyAgICB1aW50MzJfdCBjb3VudDsKKworICAgIC8vIENhbGwgb25jZSB3aXRoIE5VTEwgZGF0YSB0byByZWNlaXZlIGNvdW50CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKGhhbmRsZSgpLCAmY291bnQsIE5VTEwpOworICAgIGluZm8ucmVzaXplKGNvdW50KTsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoaGFuZGxlKCksICZjb3VudCwgaW5mby5kYXRhKCkpOworCisgICAgcmV0dXJuIGluZm87Cit9CisKK1ZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIFBoeXNpY2FsRGV2aWNlOjptZW1vcnlfcHJvcGVydGllcygpIGNvbnN0IHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBpbmZvOworCisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhoYW5kbGUoKSwgJmluZm8pOworCisgICAgcmV0dXJuIGluZm87Cit9CisKK1ZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBQaHlzaWNhbERldmljZTo6ZmVhdHVyZXMoKSBjb25zdCB7CisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzIGZlYXR1cmVzOworICAgIHZrOjpHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKGhhbmRsZSgpLCAmZmVhdHVyZXMpOworICAgIHJldHVybiBmZWF0dXJlczsKK30KKworLyoKKyAqIFJldHVybiBsaXN0IG9mIEdsb2JhbCBsYXllcnMgYXZhaWxhYmxlCisgKi8KK3N0ZDo6dmVjdG9yPFZrTGF5ZXJQcm9wZXJ0aWVzPiBHZXRHbG9iYWxMYXllcnMoKSB7CisgICAgVmtSZXN1bHQgZXJyOworICAgIHN0ZDo6dmVjdG9yPFZrTGF5ZXJQcm9wZXJ0aWVzPiBsYXllcnM7CisgICAgdWludDMyX3QgbGF5ZXJfY291bnQ7CisKKyAgICBkbyB7CisgICAgICAgIGxheWVyX2NvdW50ID0gMDsKKyAgICAgICAgZXJyID0gdms6OkVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKCZsYXllcl9jb3VudCwgTlVMTCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBsYXllcnMucmVzZXJ2ZShsYXllcl9jb3VudCk7CisgICAgICAgICAgICBlcnIgPSB2azo6RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoJmxheWVyX2NvdW50LCBsYXllcnMuZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGVyciA9PSBWS19JTkNPTVBMRVRFKTsKKworICAgIGFzc2VydChlcnIgPT0gVktfU1VDQ0VTUyk7CisKKyAgICByZXR1cm4gbGF5ZXJzOworfQorCisvKgorICogUmV0dXJuIGxpc3Qgb2YgR2xvYmFsIGV4dGVuc2lvbnMgcHJvdmlkZWQgYnkgdGhlIElDRCAvIExvYWRlcgorICovCitzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IEdldEdsb2JhbEV4dGVuc2lvbnMoKSB7IHJldHVybiBHZXRHbG9iYWxFeHRlbnNpb25zKE5VTEwpOyB9CisKKy8qCisgKiBSZXR1cm4gbGlzdCBvZiBHbG9iYWwgZXh0ZW5zaW9ucyBwcm92aWRlZCBieSB0aGUgc3BlY2lmaWVkIGxheWVyCisgKiBJZiBwTGF5ZXJOYW1lIGlzIE5VTEwsIHdpbGwgcmV0dXJuIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGxvYWRlciAvCisgKiBJQ0RzCisgKi8KK3N0ZDo6dmVjdG9yPFZrRXh0ZW5zaW9uUHJvcGVydGllcz4gR2V0R2xvYmFsRXh0ZW5zaW9ucyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lKSB7CisgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBleHRzOworICAgIHVpbnQzMl90IGV4dF9jb3VudDsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBkbyB7CisgICAgICAgIGV4dF9jb3VudCA9IDA7CisgICAgICAgIGVyciA9IHZrOjpFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMocExheWVyTmFtZSwgJmV4dF9jb3VudCwgTlVMTCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBleHRzLnJlc2l6ZShleHRfY291bnQpOworICAgICAgICAgICAgZXJyID0gdms6OkVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhwTGF5ZXJOYW1lLCAmZXh0X2NvdW50LCBleHRzLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChlcnIgPT0gVktfSU5DT01QTEVURSk7CisKKyAgICBhc3NlcnQoZXJyID09IFZLX1NVQ0NFU1MpOworCisgICAgcmV0dXJuIGV4dHM7Cit9CisKKy8qCisgKiBSZXR1cm4gbGlzdCBvZiBQaHlzaWNhbERldmljZSBleHRlbnNpb25zIHByb3ZpZGVkIGJ5IHRoZSBJQ0QgLyBMb2FkZXIKKyAqLworc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBQaHlzaWNhbERldmljZTo6ZXh0ZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIGV4dGVuc2lvbnMoTlVMTCk7IH0KKworLyoKKyAqIFJldHVybiBsaXN0IG9mIFBoeXNpY2FsRGV2aWNlIGV4dGVuc2lvbnMgcHJvdmlkZWQgYnkgdGhlIHNwZWNpZmllZCBsYXllcgorICogSWYgcExheWVyTmFtZSBpcyBOVUxMLCB3aWxsIHJldHVybiBleHRlbnNpb25zIGZvciBJQ0QgLyBsb2FkZXIuCisgKi8KK3N0ZDo6dmVjdG9yPFZrRXh0ZW5zaW9uUHJvcGVydGllcz4gUGh5c2ljYWxEZXZpY2U6OmV4dGVuc2lvbnMoY29uc3QgY2hhciAqcExheWVyTmFtZSkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFZrRXh0ZW5zaW9uUHJvcGVydGllcz4gZXh0czsKKyAgICBWa1Jlc3VsdCBlcnI7CisKKyAgICBkbyB7CisgICAgICAgIHVpbnQzMl90IGV4dENvdW50ID0gMDsKKyAgICAgICAgZXJyID0gdms6OkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoaGFuZGxlKCksIHBMYXllck5hbWUsICZleHRDb3VudCwgTlVMTCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBleHRzLnJlc2l6ZShleHRDb3VudCk7CisgICAgICAgICAgICBlcnIgPSB2azo6RW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhoYW5kbGUoKSwgcExheWVyTmFtZSwgJmV4dENvdW50LCBleHRzLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChlcnIgPT0gVktfSU5DT01QTEVURSk7CisKKyAgICBhc3NlcnQoZXJyID09IFZLX1NVQ0NFU1MpOworCisgICAgcmV0dXJuIGV4dHM7Cit9CisKK2Jvb2wgUGh5c2ljYWxEZXZpY2U6OnNldF9tZW1vcnlfdHlwZShjb25zdCB1aW50MzJfdCB0eXBlX2JpdHMsIFZrTWVtb3J5QWxsb2NhdGVJbmZvICppbmZvLCBjb25zdCBWa0ZsYWdzIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtGbGFncyBmb3JiaWQpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0eXBlX21hc2sgPSB0eXBlX2JpdHM7CisgICAgLy8gU2VhcmNoIG1lbXR5cGVzIHRvIGZpbmQgZmlyc3QgaW5kZXggd2l0aCB0aG9zZSBwcm9wZXJ0aWVzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1lbW9yeV9wcm9wZXJ0aWVzXy5tZW1vcnlUeXBlQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoKHR5cGVfbWFzayAmIDEpID09IDEpIHsKKyAgICAgICAgICAgIC8vIFR5cGUgaXMgYXZhaWxhYmxlLCBkb2VzIGl0IG1hdGNoIHVzZXIgcHJvcGVydGllcz8KKyAgICAgICAgICAgIGlmICgobWVtb3J5X3Byb3BlcnRpZXNfLm1lbW9yeVR5cGVzW2ldLnByb3BlcnR5RmxhZ3MgJiBwcm9wZXJ0aWVzKSA9PSBwcm9wZXJ0aWVzICYmCisgICAgICAgICAgICAgICAgKG1lbW9yeV9wcm9wZXJ0aWVzXy5tZW1vcnlUeXBlc1tpXS5wcm9wZXJ0eUZsYWdzICYgZm9yYmlkKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5mby0+bWVtb3J5VHlwZUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0eXBlX21hc2sgPj49IDE7CisgICAgfQorICAgIC8vIE5vIG1lbW9yeSB0eXBlcyBtYXRjaGVkLCByZXR1cm4gZmFpbHVyZQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIFJldHVybiBsaXN0IG9mIFBoeXNpY2FsRGV2aWNlIGxheWVycworICovCitzdGQ6OnZlY3RvcjxWa0xheWVyUHJvcGVydGllcz4gUGh5c2ljYWxEZXZpY2U6OmxheWVycygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxWa0xheWVyUHJvcGVydGllcz4gbGF5ZXJfcHJvcHM7CisgICAgVmtSZXN1bHQgZXJyOworCisgICAgZG8geworICAgICAgICB1aW50MzJfdCBsYXllcl9jb3VudCA9IDA7CisgICAgICAgIGVyciA9IHZrOjpFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoaGFuZGxlKCksICZsYXllcl9jb3VudCwgTlVMTCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBsYXllcl9wcm9wcy5yZXNlcnZlKGxheWVyX2NvdW50KTsKKyAgICAgICAgICAgIGVyciA9IHZrOjpFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoaGFuZGxlKCksICZsYXllcl9jb3VudCwgbGF5ZXJfcHJvcHMuZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGVyciA9PSBWS19JTkNPTVBMRVRFKTsKKworICAgIGFzc2VydChlcnIgPT0gVktfU1VDQ0VTUyk7CisKKyAgICByZXR1cm4gbGF5ZXJfcHJvcHM7Cit9CisKK1F1ZXVlQ3JlYXRlSW5mb0FycmF5OjpRdWV1ZUNyZWF0ZUluZm9BcnJheShjb25zdCBzdGQ6OnZlY3RvcjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllcz4gJnF1ZXVlX3Byb3BzKQorICAgIDogcXVldWVfaW5mb18oKSwgcXVldWVfcHJpb3JpdGllc18oKSB7CisgICAgcXVldWVfaW5mb18ucmVzZXJ2ZShxdWV1ZV9wcm9wcy5zaXplKCkpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICh1aW50MzJfdClxdWV1ZV9wcm9wcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAocXVldWVfcHJvcHNbaV0ucXVldWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIHFpID0ge307CisgICAgICAgICAgICBxaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgICAgIHFpLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIHFpLnF1ZXVlRmFtaWx5SW5kZXggPSBpOworICAgICAgICAgICAgcWkucXVldWVDb3VudCA9IHF1ZXVlX3Byb3BzW2ldLnF1ZXVlQ291bnQ7CisgICAgICAgICAgICBxdWV1ZV9wcmlvcml0aWVzXy5lbXBsYWNlX2JhY2socWkucXVldWVDb3VudCwgMC4wZik7CisgICAgICAgICAgICBxaS5wUXVldWVQcmlvcml0aWVzID0gcXVldWVfcHJpb3JpdGllc19baV0uZGF0YSgpOworICAgICAgICAgICAgcXVldWVfaW5mb18ucHVzaF9iYWNrKHFpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworRGV2aWNlOjp+RGV2aWNlKCkgeworICAgIGlmICghaW5pdGlhbGl6ZWQoKSkgcmV0dXJuOworCisgICAgdms6OkRlc3Ryb3lEZXZpY2UoaGFuZGxlKCksIE5VTEwpOworfQorCit2b2lkIERldmljZTo6aW5pdChzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+ICZleHRlbnNpb25zLCBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgKmZlYXR1cmVzLCB2b2lkICpjcmVhdGVfZGV2aWNlX3BuZXh0KSB7CisgICAgLy8gcmVxdWVzdCBhbGwgcXVldWVzCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM+IHF1ZXVlX3Byb3BzID0gcGh5Xy5xdWV1ZV9wcm9wZXJ0aWVzKCk7CisgICAgUXVldWVDcmVhdGVJbmZvQXJyYXkgcXVldWVfaW5mbyhwaHlfLnF1ZXVlX3Byb3BlcnRpZXMoKSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICh1aW50MzJfdClxdWV1ZV9wcm9wcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAocXVldWVfcHJvcHNbaV0ucXVldWVGbGFncyAmIFZLX1FVRVVFX0dSQVBISUNTX0JJVCkgeworICAgICAgICAgICAgZ3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF8gPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gT25seSByZXF1ZXN0IGNyZWF0aW9uIHdpdGggcXVldWVmYW1pbGllcyB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIHF1ZXVlCisgICAgc3RkOjp2ZWN0b3I8VmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8+IGNyZWF0ZV9xdWV1ZV9pbmZvczsKKyAgICBhdXRvIHFjaSA9IHF1ZXVlX2luZm8uZGF0YSgpOworICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBxdWV1ZV9pbmZvLnNpemUoKTsgKytqKSB7CisgICAgICAgIGlmIChxY2lbal0ucXVldWVDb3VudCkgeworICAgICAgICAgICAgY3JlYXRlX3F1ZXVlX2luZm9zLnB1c2hfYmFjayhxY2lbal0pOworICAgICAgICB9CisgICAgfQorCisgICAgZW5hYmxlZF9leHRlbnNpb25zXyA9IGV4dGVuc2lvbnM7CisKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gZGV2X2luZm8gPSB7fTsKKyAgICBkZXZfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTzsKKyAgICBkZXZfaW5mby5wTmV4dCA9IGNyZWF0ZV9kZXZpY2VfcG5leHQ7CisgICAgZGV2X2luZm8ucXVldWVDcmVhdGVJbmZvQ291bnQgPSBjcmVhdGVfcXVldWVfaW5mb3Muc2l6ZSgpOworICAgIGRldl9pbmZvLnBRdWV1ZUNyZWF0ZUluZm9zID0gY3JlYXRlX3F1ZXVlX2luZm9zLmRhdGEoKTsKKyAgICBkZXZfaW5mby5lbmFibGVkTGF5ZXJDb3VudCA9IDA7CisgICAgZGV2X2luZm8ucHBFbmFibGVkTGF5ZXJOYW1lcyA9IE5VTEw7CisgICAgZGV2X2luZm8uZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gZXh0ZW5zaW9ucy5zaXplKCk7CisgICAgZGV2X2luZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBleHRlbnNpb25zLmRhdGEoKTsKKworICAgIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyBhbGxfZmVhdHVyZXM7CisgICAgLy8gTGV0IFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlczIgdGFrZSBwcmlvcml0eSBvdmVyIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcywKKyAgICAvLyBzaW5jZSBpdCBzdXBwb3J0cyBleHRlbnNpb25zCisKKyAgICBpZiAoIShsdmxfZmluZF9pbl9jaGFpbjxWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMyPihkZXZfaW5mby5wTmV4dCkpKSB7CisgICAgICAgIGlmIChmZWF0dXJlcykgeworICAgICAgICAgICAgZGV2X2luZm8ucEVuYWJsZWRGZWF0dXJlcyA9IGZlYXR1cmVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVxdWVzdCBhbGwgc3VwcG9ydGFibGUgZmVhdHVyZXMgZW5hYmxlZAorICAgICAgICAgICAgYWxsX2ZlYXR1cmVzID0gcGh5KCkuZmVhdHVyZXMoKTsKKyAgICAgICAgICAgIGRldl9pbmZvLnBFbmFibGVkRmVhdHVyZXMgPSAmYWxsX2ZlYXR1cmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaW5pdChkZXZfaW5mbyk7Cit9CisKK3ZvaWQgRGV2aWNlOjppbml0KGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAmaW5mbykgeworICAgIFZrRGV2aWNlIGRldjsKKworICAgIGlmIChFWFBFQ1Qodms6OkNyZWF0ZURldmljZShwaHlfLmhhbmRsZSgpLCAmaW5mbywgTlVMTCwgJmRldikgPT0gVktfU1VDQ0VTUykpIEhhbmRsZTo6aW5pdChkZXYpOworCisgICAgaW5pdF9xdWV1ZXMoKTsKKyAgICBpbml0X2Zvcm1hdHMoKTsKK30KKwordm9pZCBEZXZpY2U6OmluaXRfcXVldWVzKCkgeworICAgIHVpbnQzMl90IHF1ZXVlX25vZGVfY291bnQ7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeV8uaGFuZGxlKCksICZxdWV1ZV9ub2RlX2NvdW50LCBOVUxMKTsKKyAgICBFWFBFQ1QocXVldWVfbm9kZV9jb3VudCA+PSAxKTsKKworICAgIHN0ZDo6dmVjdG9yPFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzPiBxdWV1ZV9wcm9wcyhxdWV1ZV9ub2RlX2NvdW50KTsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5Xy5oYW5kbGUoKSwgJnF1ZXVlX25vZGVfY291bnQsIHF1ZXVlX3Byb3BzLmRhdGEoKSk7CisKKyAgICBxdWV1ZV9mYW1pbGllc18ucmVzaXplKHF1ZXVlX25vZGVfY291bnQpOworICAgIGZvciAodWludDMyX3QgcXVldWVfZmFtaWx5X2kgPSAwOyBxdWV1ZV9mYW1pbHlfaSA8IHF1ZXVlX25vZGVfY291bnQ7ICsrcXVldWVfZmFtaWx5X2kpIHsKKyAgICAgICAgY29uc3QgYXV0byAmcXVldWVfcHJvcCA9IHF1ZXVlX3Byb3BzW3F1ZXVlX2ZhbWlseV9pXTsKKworICAgICAgICBRdWV1ZUZhbWlseVF1ZXVlcyAmcXVldWVfc3RvcmFnZSA9IHF1ZXVlX2ZhbWlsaWVzX1txdWV1ZV9mYW1pbHlfaV07CisgICAgICAgIHF1ZXVlX3N0b3JhZ2UucmVzZXJ2ZShxdWV1ZV9wcm9wLnF1ZXVlQ291bnQpOworICAgICAgICBmb3IgKHVpbnQzMl90IHF1ZXVlX2kgPSAwOyBxdWV1ZV9pIDwgcXVldWVfcHJvcC5xdWV1ZUNvdW50OyArK3F1ZXVlX2kpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IE5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIHNlcGFyYXRlIE1FTU1HUiBhbmQgd29yayBxdWV1ZXMsCisgICAgICAgICAgICAvLyBpbmNsdWRpbmcgc3luY2hyb25pemF0aW9uCisgICAgICAgICAgICBWa1F1ZXVlIHF1ZXVlOworICAgICAgICAgICAgdms6OkdldERldmljZVF1ZXVlKGhhbmRsZSgpLCBxdWV1ZV9mYW1pbHlfaSwgcXVldWVfaSwgJnF1ZXVlKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgc2luZ2xlIGNvcHkgb2YgdGhlIHF1ZXVlIG9iamVjdCB0aGF0IHdpbGwgc2VsZiBkZXN0cnVjdAorICAgICAgICAgICAgcXVldWVfc3RvcmFnZS5lbXBsYWNlX2JhY2sobmV3IFF1ZXVlKHF1ZXVlLCBxdWV1ZV9mYW1pbHlfaSkpOworCisgICAgICAgICAgICBpZiAocXVldWVfcHJvcC5xdWV1ZUZsYWdzICYgVktfUVVFVUVfR1JBUEhJQ1NfQklUKSB7CisgICAgICAgICAgICAgICAgcXVldWVzX1tHUkFQSElDU10ucHVzaF9iYWNrKHF1ZXVlX3N0b3JhZ2UuYmFjaygpLmdldCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHF1ZXVlX3Byb3AucXVldWVGbGFncyAmIFZLX1FVRVVFX0NPTVBVVEVfQklUKSB7CisgICAgICAgICAgICAgICAgcXVldWVzX1tDT01QVVRFXS5wdXNoX2JhY2socXVldWVfc3RvcmFnZS5iYWNrKCkuZ2V0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocXVldWVfcHJvcC5xdWV1ZUZsYWdzICYgVktfUVVFVUVfVFJBTlNGRVJfQklUKSB7CisgICAgICAgICAgICAgICAgcXVldWVzX1tETUFdLnB1c2hfYmFjayhxdWV1ZV9zdG9yYWdlLmJhY2soKS5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBFWFBFQ1QoIXF1ZXVlc19bR1JBUEhJQ1NdLmVtcHR5KCkgfHwgIXF1ZXVlc19bQ09NUFVURV0uZW1wdHkoKSk7Cit9CisKK2NvbnN0IERldmljZTo6UXVldWVGYW1pbHlRdWV1ZXMgJkRldmljZTo6cXVldWVfZmFtaWx5X3F1ZXVlcyh1aW50MzJfdCBxdWV1ZV9mYW1pbHkpIGNvbnN0IHsKKyAgICBhc3NlcnQocXVldWVfZmFtaWx5IDwgcXVldWVfZmFtaWxpZXNfLnNpemUoKSk7CisgICAgcmV0dXJuIHF1ZXVlX2ZhbWlsaWVzX1txdWV1ZV9mYW1pbHldOworfQorCit2b2lkIERldmljZTo6aW5pdF9mb3JtYXRzKCkgeworICAgIGZvciAoaW50IGYgPSBWS19GT1JNQVRfQkVHSU5fUkFOR0U7IGYgPD0gVktfRk9STUFUX0VORF9SQU5HRTsgZisrKSB7CisgICAgICAgIGNvbnN0IFZrRm9ybWF0IGZtdCA9IHN0YXRpY19jYXN0PFZrRm9ybWF0PihmKTsKKyAgICAgICAgY29uc3QgVmtGb3JtYXRQcm9wZXJ0aWVzIHByb3BzID0gZm9ybWF0X3Byb3BlcnRpZXMoZm10KTsKKworICAgICAgICBpZiAocHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IEZvcm1hdCB0bXAgPSB7Zm10LCBWS19JTUFHRV9USUxJTkdfTElORUFSLCBwcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlc307CisgICAgICAgICAgICBmb3JtYXRzXy5wdXNoX2JhY2sodG1wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9wcy5vcHRpbWFsVGlsaW5nRmVhdHVyZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IEZvcm1hdCB0bXAgPSB7Zm10LCBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwgcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzfTsKKyAgICAgICAgICAgIGZvcm1hdHNfLnB1c2hfYmFjayh0bXApOworICAgICAgICB9CisgICAgfQorCisgICAgRVhQRUNUKCFmb3JtYXRzXy5lbXB0eSgpKTsKK30KKworYm9vbCBEZXZpY2U6OklzRW5hYmxlZEV4dGVuc2lvbihjb25zdCBjaGFyICpleHRlbnNpb24pIHsKKyAgICBjb25zdCBhdXRvIGlzX3ggPSBbJmV4dGVuc2lvbl0oY29uc3QgY2hhciAqZW5hYmxlZF9leHRlbnNpb24pIHsgcmV0dXJuIHN0cmNtcChleHRlbnNpb24sIGVuYWJsZWRfZXh0ZW5zaW9uKSA9PSAwOyB9OworICAgIHJldHVybiBzdGQ6OmFueV9vZihlbmFibGVkX2V4dGVuc2lvbnNfLmJlZ2luKCksIGVuYWJsZWRfZXh0ZW5zaW9uc18uZW5kKCksIGlzX3gpOworfQorCitWa0Zvcm1hdFByb3BlcnRpZXMgRGV2aWNlOjpmb3JtYXRfcHJvcGVydGllcyhWa0Zvcm1hdCBmb3JtYXQpIHsKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZGF0YTsKKyAgICB2azo6R2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKHBoeSgpLmhhbmRsZSgpLCBmb3JtYXQsICZkYXRhKTsKKworICAgIHJldHVybiBkYXRhOworfQorCit2b2lkIERldmljZTo6d2FpdCgpIHsgRVhQRUNUKHZrOjpEZXZpY2VXYWl0SWRsZShoYW5kbGUoKSkgPT0gVktfU1VDQ0VTUyk7IH0KKworVmtSZXN1bHQgRGV2aWNlOjp3YWl0KGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZlbmNlICo+ICZmZW5jZXMsIGJvb2wgd2FpdF9hbGwsIHVpbnQ2NF90IHRpbWVvdXQpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa0ZlbmNlPiBmZW5jZV9oYW5kbGVzID0gTWFrZVZrSGFuZGxlczxWa0ZlbmNlPihmZW5jZXMpOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpXYWl0Rm9yRmVuY2VzKGhhbmRsZSgpLCBmZW5jZV9oYW5kbGVzLnNpemUoKSwgZmVuY2VfaGFuZGxlcy5kYXRhKCksIHdhaXRfYWxsLCB0aW1lb3V0KTsKKyAgICBFWFBFQ1QoZXJyID09IFZLX1NVQ0NFU1MgfHwgZXJyID09IFZLX1RJTUVPVVQpOworCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBEZXZpY2U6OnVwZGF0ZV9kZXNjcmlwdG9yX3NldHMoY29uc3Qgc3RkOjp2ZWN0b3I8VmtXcml0ZURlc2NyaXB0b3JTZXQ+ICZ3cml0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa0NvcHlEZXNjcmlwdG9yU2V0PiAmY29waWVzKSB7CisgICAgdms6OlVwZGF0ZURlc2NyaXB0b3JTZXRzKGhhbmRsZSgpLCB3cml0ZXMuc2l6ZSgpLCB3cml0ZXMuZGF0YSgpLCBjb3BpZXMuc2l6ZSgpLCBjb3BpZXMuZGF0YSgpKTsKK30KKworVmtSZXN1bHQgUXVldWU6OnN1Ym1pdChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDb21tYW5kQnVmZmVyICo+ICZjbWRzLCBjb25zdCBGZW5jZSAmZmVuY2UsIGJvb2wgZXhwZWN0X3N1Y2Nlc3MpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa0NvbW1hbmRCdWZmZXI+IGNtZF9oYW5kbGVzID0gTWFrZVZrSGFuZGxlczxWa0NvbW1hbmRCdWZmZXI+KGNtZHMpOworICAgIFZrU3VibWl0SW5mbyBzdWJtaXRfaW5mbzsKKyAgICBzdWJtaXRfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdF9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBzdWJtaXRfaW5mby53YWl0U2VtYXBob3JlQ291bnQgPSAwOworICAgIHN1Ym1pdF9pbmZvLnBXYWl0U2VtYXBob3JlcyA9IE5VTEw7CisgICAgc3VibWl0X2luZm8ucFdhaXREc3RTdGFnZU1hc2sgPSBOVUxMOworICAgIHN1Ym1pdF9pbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9ICh1aW50MzJfdCljbWRfaGFuZGxlcy5zaXplKCk7CisgICAgc3VibWl0X2luZm8ucENvbW1hbmRCdWZmZXJzID0gY21kX2hhbmRsZXMuZGF0YSgpOworICAgIHN1Ym1pdF9pbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRfaW5mby5wU2lnbmFsU2VtYXBob3JlcyA9IE5VTEw7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSB2azo6UXVldWVTdWJtaXQoaGFuZGxlKCksIDEsICZzdWJtaXRfaW5mbywgZmVuY2UuaGFuZGxlKCkpOworICAgIGlmIChleHBlY3Rfc3VjY2VzcykgRVhQRUNUKHJlc3VsdCA9PSBWS19TVUNDRVNTKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWa1Jlc3VsdCBRdWV1ZTo6c3VibWl0KGNvbnN0IENvbW1hbmRCdWZmZXIgJmNtZCwgY29uc3QgRmVuY2UgJmZlbmNlLCBib29sIGV4cGVjdF9zdWNjZXNzKSB7CisgICAgcmV0dXJuIHN1Ym1pdChzdGQ6OnZlY3Rvcjxjb25zdCBDb21tYW5kQnVmZmVyICo+KDEsICZjbWQpLCBmZW5jZSwgZXhwZWN0X3N1Y2Nlc3MpOworfQorCitWa1Jlc3VsdCBRdWV1ZTo6c3VibWl0KGNvbnN0IENvbW1hbmRCdWZmZXIgJmNtZCwgYm9vbCBleHBlY3Rfc3VjY2VzcykgeworICAgIEZlbmNlIGZlbmNlOworICAgIHJldHVybiBzdWJtaXQoY21kLCBmZW5jZSk7Cit9CisKK1ZrUmVzdWx0IFF1ZXVlOjp3YWl0KCkgeworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHZrOjpRdWV1ZVdhaXRJZGxlKGhhbmRsZSgpKTsKKyAgICBFWFBFQ1QocmVzdWx0ID09IFZLX1NVQ0NFU1MpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0RldmljZU1lbW9yeTo6fkRldmljZU1lbW9yeSgpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZWQoKSkgdms6OkZyZWVNZW1vcnkoZGV2aWNlKCksIGhhbmRsZSgpLCBOVUxMKTsKK30KKwordm9pZCBEZXZpY2VNZW1vcnk6OmluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvICZpbmZvKSB7CisgICAgTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfSU5JVCh2azo6QWxsb2NhdGVNZW1vcnksIGRldiwgJmluZm8pOworfQorCitjb25zdCB2b2lkICpEZXZpY2VNZW1vcnk6Om1hcChWa0ZsYWdzIGZsYWdzKSBjb25zdCB7CisgICAgdm9pZCAqZGF0YTsKKyAgICBpZiAoIUVYUEVDVCh2azo6TWFwTWVtb3J5KGRldmljZSgpLCBoYW5kbGUoKSwgMCwgVktfV0hPTEVfU0laRSwgZmxhZ3MsICZkYXRhKSA9PSBWS19TVUNDRVNTKSkgZGF0YSA9IE5VTEw7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKwordm9pZCAqRGV2aWNlTWVtb3J5OjptYXAoVmtGbGFncyBmbGFncykgeworICAgIHZvaWQgKmRhdGE7CisgICAgaWYgKCFFWFBFQ1Qodms6Ok1hcE1lbW9yeShkZXZpY2UoKSwgaGFuZGxlKCksIDAsIFZLX1dIT0xFX1NJWkUsIGZsYWdzLCAmZGF0YSkgPT0gVktfU1VDQ0VTUykpIGRhdGEgPSBOVUxMOworCisgICAgcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgRGV2aWNlTWVtb3J5Ojp1bm1hcCgpIGNvbnN0IHsgdms6OlVubWFwTWVtb3J5KGRldmljZSgpLCBoYW5kbGUoKSk7IH0KKworVmtNZW1vcnlBbGxvY2F0ZUluZm8gRGV2aWNlTWVtb3J5OjpnZXRfcmVzb3VyY2VfYWxsb2NfaW5mbyhjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMgJnJlcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fcHJvcHMpIHsKKyAgICAvLyBGaW5kIGFwcHJvcHJpYXRlIG1lbW9yeSB0eXBlIGZvciBnaXZlbiByZXFzCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgZGV2X21lbV9wcm9wcyA9IGRldi5waHkoKS5tZW1vcnlfcHJvcGVydGllcygpOworICAgIHVpbnQzMl90IG1lbV90eXBlX2luZGV4ID0gMDsKKyAgICBmb3IgKG1lbV90eXBlX2luZGV4ID0gMDsgbWVtX3R5cGVfaW5kZXggPCBkZXZfbWVtX3Byb3BzLm1lbW9yeVR5cGVDb3VudDsgKyttZW1fdHlwZV9pbmRleCkgeworICAgICAgICBpZiAobWVtX3Byb3BzID09IChtZW1fcHJvcHMgJiBkZXZfbWVtX3Byb3BzLm1lbW9yeVR5cGVzW21lbV90eXBlX2luZGV4XS5wcm9wZXJ0eUZsYWdzKSkgYnJlYWs7CisgICAgfQorICAgIC8vIElmIHdlIGV4Y2VlZGVkIHR5cGVzLCB0aGVuIHRoaXMgZGV2aWNlIGRvZXNuJ3QgaGF2ZSB0aGUgbWVtb3J5IHdlIG5lZWQKKyAgICBhc3NlcnQobWVtX3R5cGVfaW5kZXggPCBkZXZfbWVtX3Byb3BzLm1lbW9yeVR5cGVDb3VudCk7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gaW5mbyA9IGFsbG9jX2luZm8ocmVxcy5zaXplLCBtZW1fdHlwZV9pbmRleCk7CisgICAgRVhQRUNUKGRldi5waHkoKS5zZXRfbWVtb3J5X3R5cGUocmVxcy5tZW1vcnlUeXBlQml0cywgJmluZm8sIG1lbV9wcm9wcykpOworICAgIHJldHVybiBpbmZvOworfQorCitOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9EVE9SKEZlbmNlLCB2azo6RGVzdHJveUZlbmNlKQorCit2b2lkIEZlbmNlOjppbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyAmaW5mbykgeyBOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9JTklUKHZrOjpDcmVhdGVGZW5jZSwgZGV2LCAmaW5mbyk7IH0KKworVmtSZXN1bHQgRmVuY2U6OndhaXQoVmtCb29sMzIgd2FpdF9hbGwsIHVpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKKyAgICBWa0ZlbmNlIGZlbmNlID0gaGFuZGxlKCk7CisgICAgcmV0dXJuIHZrOjpXYWl0Rm9yRmVuY2VzKGRldmljZSgpLCAxLCAmZmVuY2UsIHdhaXRfYWxsLCB0aW1lb3V0KTsKK30KKworTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfRFRPUihTZW1hcGhvcmUsIHZrOjpEZXN0cm95U2VtYXBob3JlKQorCit2b2lkIFNlbWFwaG9yZTo6aW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvICZpbmZvKSB7CisgICAgTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfSU5JVCh2azo6Q3JlYXRlU2VtYXBob3JlLCBkZXYsICZpbmZvKTsKK30KKworTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfRFRPUihFdmVudCwgdms6OkRlc3Ryb3lFdmVudCkKKwordm9pZCBFdmVudDo6aW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtFdmVudENyZWF0ZUluZm8gJmluZm8pIHsgTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfSU5JVCh2azo6Q3JlYXRlRXZlbnQsIGRldiwgJmluZm8pOyB9CisKK3ZvaWQgRXZlbnQ6OnNldCgpIHsgRVhQRUNUKHZrOjpTZXRFdmVudChkZXZpY2UoKSwgaGFuZGxlKCkpID09IFZLX1NVQ0NFU1MpOyB9CisKK3ZvaWQgRXZlbnQ6OnJlc2V0KCkgeyBFWFBFQ1Qodms6OlJlc2V0RXZlbnQoZGV2aWNlKCksIGhhbmRsZSgpKSA9PSBWS19TVUNDRVNTKTsgfQorCitOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9EVE9SKFF1ZXJ5UG9vbCwgdms6OkRlc3Ryb3lRdWVyeVBvb2wpCisKK3ZvaWQgUXVlcnlQb29sOjppbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa1F1ZXJ5UG9vbENyZWF0ZUluZm8gJmluZm8pIHsKKyAgICBOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9JTklUKHZrOjpDcmVhdGVRdWVyeVBvb2wsIGRldiwgJmluZm8pOworfQorCitWa1Jlc3VsdCBRdWVyeVBvb2w6OnJlc3VsdHModWludDMyX3QgZmlyc3QsIHVpbnQzMl90IGNvdW50LCBzaXplX3Qgc2l6ZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHN0cmlkZSkgeworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpHZXRRdWVyeVBvb2xSZXN1bHRzKGRldmljZSgpLCBoYW5kbGUoKSwgZmlyc3QsIGNvdW50LCBzaXplLCBkYXRhLCBzdHJpZGUsIDApOworICAgIEVYUEVDVChlcnIgPT0gVktfU1VDQ0VTUyB8fCBlcnIgPT0gVktfTk9UX1JFQURZKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK05PTl9ESVNQQVRDSEFCTEVfSEFORExFX0RUT1IoQnVmZmVyLCB2azo6RGVzdHJveUJ1ZmZlcikKKwordm9pZCBCdWZmZXI6OmluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyAmaW5mbywgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbV9wcm9wcykgeworICAgIGluaXRfbm9fbWVtKGRldiwgaW5mbyk7CisKKyAgICBpbnRlcm5hbF9tZW1fLmluaXQoZGV2LCBEZXZpY2VNZW1vcnk6OmdldF9yZXNvdXJjZV9hbGxvY19pbmZvKGRldiwgbWVtb3J5X3JlcXVpcmVtZW50cygpLCBtZW1fcHJvcHMpKTsKKyAgICBiaW5kX21lbW9yeShpbnRlcm5hbF9tZW1fLCAwKTsKK30KKwordm9pZCBCdWZmZXI6OmluaXRfbm9fbWVtKGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gJmluZm8pIHsKKyAgICBOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9JTklUKHZrOjpDcmVhdGVCdWZmZXIsIGRldiwgJmluZm8pOworICAgIGNyZWF0ZV9pbmZvXyA9IGluZm87Cit9CisKK1ZrTWVtb3J5UmVxdWlyZW1lbnRzIEJ1ZmZlcjo6bWVtb3J5X3JlcXVpcmVtZW50cygpIGNvbnN0IHsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyByZXFzOworCisgICAgdms6OkdldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cyhkZXZpY2UoKSwgaGFuZGxlKCksICZyZXFzKTsKKworICAgIHJldHVybiByZXFzOworfQorCit2b2lkIEJ1ZmZlcjo6YmluZF9tZW1vcnkoY29uc3QgRGV2aWNlTWVtb3J5ICZtZW0sIFZrRGV2aWNlU2l6ZSBtZW1fb2Zmc2V0KSB7CisgICAgRVhQRUNUKHZrOjpCaW5kQnVmZmVyTWVtb3J5KGRldmljZSgpLCBoYW5kbGUoKSwgbWVtLmhhbmRsZSgpLCBtZW1fb2Zmc2V0KSA9PSBWS19TVUNDRVNTKTsKK30KKworTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfRFRPUihCdWZmZXJWaWV3LCB2azo6RGVzdHJveUJ1ZmZlclZpZXcpCisKK3ZvaWQgQnVmZmVyVmlldzo6aW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyAmaW5mbykgeworICAgIE5PTl9ESVNQQVRDSEFCTEVfSEFORExFX0lOSVQodms6OkNyZWF0ZUJ1ZmZlclZpZXcsIGRldiwgJmluZm8pOworfQorCitOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9EVE9SKEltYWdlLCB2azo6RGVzdHJveUltYWdlKQorCit2b2lkIEltYWdlOjppbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAmaW5mbywgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbV9wcm9wcykgeworICAgIGluaXRfbm9fbWVtKGRldiwgaW5mbyk7CisKKyAgICBpZiAoaW5pdGlhbGl6ZWQoKSkgeworICAgICAgICBpbnRlcm5hbF9tZW1fLmluaXQoZGV2LCBEZXZpY2VNZW1vcnk6OmdldF9yZXNvdXJjZV9hbGxvY19pbmZvKGRldiwgbWVtb3J5X3JlcXVpcmVtZW50cygpLCBtZW1fcHJvcHMpKTsKKyAgICAgICAgYmluZF9tZW1vcnkoaW50ZXJuYWxfbWVtXywgMCk7CisgICAgfQorfQorCit2b2lkIEltYWdlOjppbml0X25vX21lbShjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gJmluZm8pIHsKKyAgICBOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9JTklUKHZrOjpDcmVhdGVJbWFnZSwgZGV2LCAmaW5mbyk7CisgICAgaWYgKGluaXRpYWxpemVkKCkpIHsKKyAgICAgICAgaW5pdF9pbmZvKGRldiwgaW5mbyk7CisgICAgfQorfQorCit2b2lkIEltYWdlOjppbml0X2luZm8oY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZpbmZvKSB7CisgICAgY3JlYXRlX2luZm9fID0gaW5mbzsKKworICAgIGZvciAoc3RkOjp2ZWN0b3I8RGV2aWNlOjpGb3JtYXQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGRldi5mb3JtYXRzKCkuYmVnaW4oKTsgaXQgIT0gZGV2LmZvcm1hdHMoKS5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAobWVtY21wKCZpdC0+Zm9ybWF0LCAmY3JlYXRlX2luZm9fLmZvcm1hdCwgc2l6ZW9mKGl0LT5mb3JtYXQpKSA9PSAwICYmIGl0LT50aWxpbmcgPT0gY3JlYXRlX2luZm9fLnRpbGluZykgeworICAgICAgICAgICAgZm9ybWF0X2ZlYXR1cmVzXyA9IGl0LT5mZWF0dXJlczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitWa01lbW9yeVJlcXVpcmVtZW50cyBJbWFnZTo6bWVtb3J5X3JlcXVpcmVtZW50cygpIGNvbnN0IHsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyByZXFzOworCisgICAgdms6OkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSgpLCBoYW5kbGUoKSwgJnJlcXMpOworCisgICAgcmV0dXJuIHJlcXM7Cit9CisKK3ZvaWQgSW1hZ2U6OmJpbmRfbWVtb3J5KGNvbnN0IERldmljZU1lbW9yeSAmbWVtLCBWa0RldmljZVNpemUgbWVtX29mZnNldCkgeworICAgIEVYUEVDVCh2azo6QmluZEltYWdlTWVtb3J5KGRldmljZSgpLCBoYW5kbGUoKSwgbWVtLmhhbmRsZSgpLCBtZW1fb2Zmc2V0KSA9PSBWS19TVUNDRVNTKTsKK30KKworVmtTdWJyZXNvdXJjZUxheW91dCBJbWFnZTo6c3VicmVzb3VyY2VfbGF5b3V0KGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSAmc3VicmVzKSBjb25zdCB7CisgICAgVmtTdWJyZXNvdXJjZUxheW91dCBkYXRhOworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGRhdGEpOworICAgIHZrOjpHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KGRldmljZSgpLCBoYW5kbGUoKSwgJnN1YnJlcywgJmRhdGEpOworICAgIGlmIChzaXplICE9IHNpemVvZihkYXRhKSkgbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCisgICAgcmV0dXJuIGRhdGE7Cit9CisKK1ZrU3VicmVzb3VyY2VMYXlvdXQgSW1hZ2U6OnN1YnJlc291cmNlX2xheW91dChjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgJnN1YnJlc2NvcHkpIGNvbnN0IHsKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0IGRhdGE7CisgICAgVmtJbWFnZVN1YnJlc291cmNlIHN1YnJlcyA9IHN1YnJlc291cmNlKHN1YnJlc2NvcHkuYXNwZWN0TWFzaywgc3VicmVzY29weS5taXBMZXZlbCwgc3VicmVzY29weS5iYXNlQXJyYXlMYXllcik7CisgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoZGF0YSk7CisgICAgdms6OkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoZGV2aWNlKCksIGhhbmRsZSgpLCAmc3VicmVzLCAmZGF0YSk7CisgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGRhdGEpKSBtZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworYm9vbCBJbWFnZTo6dHJhbnNwYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIChjcmVhdGVfaW5mb18udGlsaW5nID09IFZLX0lNQUdFX1RJTElOR19MSU5FQVIgJiYgY3JlYXRlX2luZm9fLnNhbXBsZXMgPT0gVktfU0FNUExFX0NPVU5UXzFfQklUICYmCisgICAgICAgICAgICAhKGNyZWF0ZV9pbmZvXy51c2FnZSAmIChWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8IFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQpKSk7Cit9CisKK05PTl9ESVNQQVRDSEFCTEVfSEFORExFX0RUT1IoSW1hZ2VWaWV3LCB2azo6RGVzdHJveUltYWdlVmlldykKKwordm9pZCBJbWFnZVZpZXc6OmluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyAmaW5mbykgeworICAgIE5PTl9ESVNQQVRDSEFCTEVfSEFORExFX0lOSVQodms6OkNyZWF0ZUltYWdlVmlldywgZGV2LCAmaW5mbyk7Cit9CisKK0FjY2VsZXJhdGlvblN0cnVjdHVyZTo6fkFjY2VsZXJhdGlvblN0cnVjdHVyZSgpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZWQoKSkgeworICAgICAgICBQRk5fdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPQorICAgICAgICAgICAgKFBGTl92a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOVil2azo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlKCksICJ2a0Rlc3Ryb3lBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViIpOworICAgICAgICBhc3NlcnQodmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgIT0gbnVsbHB0cik7CisKKyAgICAgICAgdmtEZXN0cm95QWNjZWxlcmF0aW9uU3RydWN0dXJlTlYoZGV2aWNlKCksIGhhbmRsZSgpLCBudWxscHRyKTsKKyAgICB9Cit9CisKK1ZrTWVtb3J5UmVxdWlyZW1lbnRzMiBBY2NlbGVyYXRpb25TdHJ1Y3R1cmU6Om1lbW9yeV9yZXF1aXJlbWVudHMoKSBjb25zdCB7CisgICAgUEZOX3ZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYgdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViA9CisgICAgICAgIChQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVil2azo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzTlYiKTsKKyAgICBhc3NlcnQodmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViAhPSBudWxscHRyKTsKKworICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5UmVxdWlyZW1lbnRzSW5mb05WIG1lbW9yeVJlcXVpcmVtZW50c0luZm8gPSB7fTsKKyAgICBtZW1vcnlSZXF1aXJlbWVudHNJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX0lORk9fTlY7CisgICAgbWVtb3J5UmVxdWlyZW1lbnRzSW5mby50eXBlID0gVktfQUNDRUxFUkFUSU9OX1NUUlVDVFVSRV9NRU1PUllfUkVRVUlSRU1FTlRTX1RZUEVfT0JKRUNUX05WOworICAgIG1lbW9yeVJlcXVpcmVtZW50c0luZm8uYWNjZWxlcmF0aW9uU3RydWN0dXJlID0gaGFuZGxlKCk7CisKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIgbWVtb3J5UmVxdWlyZW1lbnRzID0ge307CisgICAgdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVihkZXZpY2UoKSwgJm1lbW9yeVJlcXVpcmVtZW50c0luZm8sICZtZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHJldHVybiBtZW1vcnlSZXF1aXJlbWVudHM7Cit9CisKK1ZrTWVtb3J5UmVxdWlyZW1lbnRzMiBBY2NlbGVyYXRpb25TdHJ1Y3R1cmU6OmJ1aWxkX3NjcmF0Y2hfbWVtb3J5X3JlcXVpcmVtZW50cygpIGNvbnN0IHsKKyAgICBQRk5fdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViB2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WID0KKyAgICAgICAgKFBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WKXZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXZpY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOViIpOworICAgIGFzc2VydCh2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeVJlcXVpcmVtZW50c05WICE9IG51bGxwdHIpOworCisgICAgVmtBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNJbmZvTlYgbWVtb3J5UmVxdWlyZW1lbnRzSW5mbyA9IHt9OworICAgIG1lbW9yeVJlcXVpcmVtZW50c0luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT19OVjsKKyAgICBtZW1vcnlSZXF1aXJlbWVudHNJbmZvLnR5cGUgPSBWS19BQ0NFTEVSQVRJT05fU1RSVUNUVVJFX01FTU9SWV9SRVFVSVJFTUVOVFNfVFlQRV9CVUlMRF9TQ1JBVENIX05WOworICAgIG1lbW9yeVJlcXVpcmVtZW50c0luZm8uYWNjZWxlcmF0aW9uU3RydWN0dXJlID0gaGFuZGxlKCk7CisKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIgbWVtb3J5UmVxdWlyZW1lbnRzID0ge307CisgICAgdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVihkZXZpY2UoKSwgJm1lbW9yeVJlcXVpcmVtZW50c0luZm8sICZtZW1vcnlSZXF1aXJlbWVudHMpOworICAgIHJldHVybiBtZW1vcnlSZXF1aXJlbWVudHM7Cit9CisKK3ZvaWQgQWNjZWxlcmF0aW9uU3RydWN0dXJlOjppbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAmaW5mbywgYm9vbCBpbml0X21lbW9yeSkgeworICAgIFBGTl92a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WIHZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYgPQorICAgICAgICAoUEZOX3ZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYpdms6OkdldERldmljZVByb2NBZGRyKGRldi5oYW5kbGUoKSwgInZrQ3JlYXRlQWNjZWxlcmF0aW9uU3RydWN0dXJlTlYiKTsKKyAgICBhc3NlcnQodmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViAhPSBudWxscHRyKTsKKworICAgIE5PTl9ESVNQQVRDSEFCTEVfSEFORExFX0lOSVQodmtDcmVhdGVBY2NlbGVyYXRpb25TdHJ1Y3R1cmVOViwgZGV2LCAmaW5mbyk7CisKKyAgICBpbmZvXyA9IGluZm8uaW5mbzsKKworICAgIGlmIChpbml0X21lbW9yeSkgeworICAgICAgICBtZW1vcnlfLmluaXQoZGV2LCBEZXZpY2VNZW1vcnk6OmdldF9yZXNvdXJjZV9hbGxvY19pbmZvKGRldiwgbWVtb3J5X3JlcXVpcmVtZW50cygpLm1lbW9yeVJlcXVpcmVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCkpOworCisgICAgICAgIFBGTl92a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViB2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViA9CisgICAgICAgICAgICAoUEZOX3ZrQmluZEFjY2VsZXJhdGlvblN0cnVjdHVyZU1lbW9yeU5WKXZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXYuaGFuZGxlKCksICJ2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOViIpOworICAgICAgICBhc3NlcnQodmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5TlYgIT0gbnVsbHB0cik7CisKKyAgICAgICAgVmtCaW5kQWNjZWxlcmF0aW9uU3RydWN0dXJlTWVtb3J5SW5mb05WIGJpbmRfaW5mbyA9IHt9OworICAgICAgICBiaW5kX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CSU5EX0FDQ0VMRVJBVElPTl9TVFJVQ1RVUkVfTUVNT1JZX0lORk9fTlY7CisgICAgICAgIGJpbmRfaW5mby5hY2NlbGVyYXRpb25TdHJ1Y3R1cmUgPSBoYW5kbGUoKTsKKyAgICAgICAgYmluZF9pbmZvLm1lbW9yeSA9IG1lbW9yeV8uaGFuZGxlKCk7CisgICAgICAgIEVYUEVDVCh2a0JpbmRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlOVihkZXYuaGFuZGxlKCksIDEsICZiaW5kX2luZm8pID09IFZLX1NVQ0NFU1MpOworCisgICAgICAgIFBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIHZrR2V0QWNjZWxlcmF0aW9uU3RydWN0dXJlSGFuZGxlTlYgPQorICAgICAgICAgICAgKFBGTl92a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WKXZrOjpHZXREZXZpY2VQcm9jQWRkcihkZXYuaGFuZGxlKCksICJ2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WIik7CisgICAgICAgIGFzc2VydCh2a0dldEFjY2VsZXJhdGlvblN0cnVjdHVyZUhhbmRsZU5WICE9IG51bGxwdHIpOworICAgICAgICBFWFBFQ1QodmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVIYW5kbGVOVihkZXYuaGFuZGxlKCksIGhhbmRsZSgpLCBzaXplb2YodWludDY0X3QpLCAmb3BhcXVlX2hhbmRsZV8pID09IFZLX1NVQ0NFU1MpOworICAgIH0KK30KKwordm9pZCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmU6OmNyZWF0ZV9zY3JhdGNoX2J1ZmZlcihjb25zdCBEZXZpY2UgJmRldiwgQnVmZmVyICpidWZmZXIpIHsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBzY3JhdGNoX2J1ZmZlcl9tZW1vcnlfcmVxdWlyZW1lbnRzID0gYnVpbGRfc2NyYXRjaF9tZW1vcnlfcmVxdWlyZW1lbnRzKCkubWVtb3J5UmVxdWlyZW1lbnRzOworCisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvID0ge307CisgICAgY3JlYXRlX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgY3JlYXRlX2luZm8uc2l6ZSA9IHNjcmF0Y2hfYnVmZmVyX21lbW9yeV9yZXF1aXJlbWVudHMuc2l6ZTsKKyAgICBjcmVhdGVfaW5mby51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9SQVlfVFJBQ0lOR19CSVRfTlY7CisgICAgcmV0dXJuIGJ1ZmZlci0+aW5pdChkZXYsIGNyZWF0ZV9pbmZvLCBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVCk7Cit9CisKK05PTl9ESVNQQVRDSEFCTEVfSEFORExFX0RUT1IoU2hhZGVyTW9kdWxlLCB2azo6RGVzdHJveVNoYWRlck1vZHVsZSkKKwordm9pZCBTaGFkZXJNb2R1bGU6OmluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyAmaW5mbykgeworICAgIE5PTl9ESVNQQVRDSEFCTEVfSEFORExFX0lOSVQodms6OkNyZWF0ZVNoYWRlck1vZHVsZSwgZGV2LCAmaW5mbyk7Cit9CisKK1ZrUmVzdWx0IFNoYWRlck1vZHVsZTo6aW5pdF90cnkoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyAmaW5mbykgeworICAgIFZrU2hhZGVyTW9kdWxlIG1vZDsKKworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVTaGFkZXJNb2R1bGUoZGV2LmhhbmRsZSgpLCAmaW5mbywgTlVMTCwgJm1vZCk7CisgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSBOb25EaXNwSGFuZGxlOjppbml0KGRldi5oYW5kbGUoKSwgbW9kKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK05PTl9ESVNQQVRDSEFCTEVfSEFORExFX0RUT1IoUGlwZWxpbmUsIHZrOjpEZXN0cm95UGlwZWxpbmUpCisKK3ZvaWQgUGlwZWxpbmU6OmluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gJmluZm8pIHsKKyAgICBWa1BpcGVsaW5lQ2FjaGUgY2FjaGU7CisgICAgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyBjaTsKKyAgICBtZW1zZXQoKHZvaWQgKikmY2ksIDAsIHNpemVvZihWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKSk7CisgICAgY2kuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTzsKKyAgICBWa1Jlc3VsdCBlcnIgPSB2azo6Q3JlYXRlUGlwZWxpbmVDYWNoZShkZXYuaGFuZGxlKCksICZjaSwgTlVMTCwgJmNhY2hlKTsKKyAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfSU5JVCh2azo6Q3JlYXRlR3JhcGhpY3NQaXBlbGluZXMsIGRldiwgY2FjaGUsIDEsICZpbmZvKTsKKyAgICAgICAgdms6OkRlc3Ryb3lQaXBlbGluZUNhY2hlKGRldi5oYW5kbGUoKSwgY2FjaGUsIE5VTEwpOworICAgIH0KK30KKworVmtSZXN1bHQgUGlwZWxpbmU6OmluaXRfdHJ5KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICZpbmZvKSB7CisgICAgVmtQaXBlbGluZSBwaXBlOworICAgIFZrUGlwZWxpbmVDYWNoZSBjYWNoZTsKKyAgICBWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvIGNpOworICAgIG1lbXNldCgodm9pZCAqKSZjaSwgMCwgc2l6ZW9mKFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8pKTsKKyAgICBjaS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NBQ0hFX0NSRUFURV9JTkZPOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpDcmVhdGVQaXBlbGluZUNhY2hlKGRldi5oYW5kbGUoKSwgJmNpLCBOVUxMLCAmY2FjaGUpOworICAgIEVYUEVDVChlcnIgPT0gVktfU1VDQ0VTUyk7CisgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIGVyciA9IHZrOjpDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhkZXYuaGFuZGxlKCksIGNhY2hlLCAxLCAmaW5mbywgTlVMTCwgJnBpcGUpOworICAgICAgICBpZiAoZXJyID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIE5vbkRpc3BIYW5kbGU6OmluaXQoZGV2LmhhbmRsZSgpLCBwaXBlKTsKKyAgICAgICAgfQorICAgICAgICB2azo6RGVzdHJveVBpcGVsaW5lQ2FjaGUoZGV2LmhhbmRsZSgpLCBjYWNoZSwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBQaXBlbGluZTo6aW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICZpbmZvKSB7CisgICAgVmtQaXBlbGluZUNhY2hlIGNhY2hlOworICAgIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gY2k7CisgICAgbWVtc2V0KCh2b2lkICopJmNpLCAwLCBzaXplb2YoVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbykpOworICAgIGNpLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfQ0FDSEVfQ1JFQVRFX0lORk87CisgICAgVmtSZXN1bHQgZXJyID0gdms6OkNyZWF0ZVBpcGVsaW5lQ2FjaGUoZGV2LmhhbmRsZSgpLCAmY2ksIE5VTEwsICZjYWNoZSk7CisgICAgaWYgKGVyciA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIE5PTl9ESVNQQVRDSEFCTEVfSEFORExFX0lOSVQodms6OkNyZWF0ZUNvbXB1dGVQaXBlbGluZXMsIGRldiwgY2FjaGUsIDEsICZpbmZvKTsKKyAgICAgICAgdms6OkRlc3Ryb3lQaXBlbGluZUNhY2hlKGRldi5oYW5kbGUoKSwgY2FjaGUsIE5VTEwpOworICAgIH0KK30KKworTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfRFRPUihQaXBlbGluZUxheW91dCwgdms6OkRlc3Ryb3lQaXBlbGluZUxheW91dCkKKwordm9pZCBQaXBlbGluZUxheW91dDo6aW5pdChjb25zdCBEZXZpY2UgJmRldiwgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gJmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXQgKj4gJmxheW91dHMpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JTZXRMYXlvdXQ+IGxheW91dF9oYW5kbGVzID0gTWFrZVZrSGFuZGxlczxWa0Rlc2NyaXB0b3JTZXRMYXlvdXQ+KGxheW91dHMpOworICAgIGluZm8uc2V0TGF5b3V0Q291bnQgPSBsYXlvdXRfaGFuZGxlcy5zaXplKCk7CisgICAgaW5mby5wU2V0TGF5b3V0cyA9IGxheW91dF9oYW5kbGVzLmRhdGEoKTsKKworICAgIE5PTl9ESVNQQVRDSEFCTEVfSEFORExFX0lOSVQodms6OkNyZWF0ZVBpcGVsaW5lTGF5b3V0LCBkZXYsICZpbmZvKTsKK30KKworTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfRFRPUihTYW1wbGVyLCB2azo6RGVzdHJveVNhbXBsZXIpCisKK3ZvaWQgU2FtcGxlcjo6aW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyAmaW5mbykgeworICAgIE5PTl9ESVNQQVRDSEFCTEVfSEFORExFX0lOSVQodms6OkNyZWF0ZVNhbXBsZXIsIGRldiwgJmluZm8pOworfQorCitOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9EVE9SKERlc2NyaXB0b3JTZXRMYXlvdXQsIHZrOjpEZXN0cm95RGVzY3JpcHRvclNldExheW91dCkKKwordm9pZCBEZXNjcmlwdG9yU2V0TGF5b3V0Ojppbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICZpbmZvKSB7CisgICAgTk9OX0RJU1BBVENIQUJMRV9IQU5ETEVfSU5JVCh2azo6Q3JlYXRlRGVzY3JpcHRvclNldExheW91dCwgZGV2LCAmaW5mbyk7Cit9CisKK05PTl9ESVNQQVRDSEFCTEVfSEFORExFX0RUT1IoRGVzY3JpcHRvclBvb2wsIHZrOjpEZXN0cm95RGVzY3JpcHRvclBvb2wpCisKK3ZvaWQgRGVzY3JpcHRvclBvb2w6OmluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICZpbmZvKSB7CisgICAgc2V0RHluYW1pY1VzYWdlKGluZm8uZmxhZ3MgJiBWS19ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0ZSRUVfREVTQ1JJUFRPUl9TRVRfQklUKTsKKyAgICBOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9JTklUKHZrOjpDcmVhdGVEZXNjcmlwdG9yUG9vbCwgZGV2LCAmaW5mbyk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclBvb2w6OnJlc2V0KCkgeyBFWFBFQ1Qodms6OlJlc2V0RGVzY3JpcHRvclBvb2woZGV2aWNlKCksIGhhbmRsZSgpLCAwKSA9PSBWS19TVUNDRVNTKTsgfQorCitzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yU2V0ICo+IERlc2NyaXB0b3JQb29sOjphbGxvY19zZXRzKGNvbnN0IERldmljZSAmZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0ICo+ICZsYXlvdXRzKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0TGF5b3V0PiBsYXlvdXRfaGFuZGxlcyA9IE1ha2VWa0hhbmRsZXM8VmtEZXNjcmlwdG9yU2V0TGF5b3V0PihsYXlvdXRzKTsKKworICAgIHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvclNldD4gc2V0X2hhbmRsZXM7CisgICAgc2V0X2hhbmRsZXMucmVzaXplKGxheW91dF9oYW5kbGVzLnNpemUoKSk7CisKKyAgICBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8gYWxsb2NfaW5mbyA9IHt9OworICAgIGFsbG9jX2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPOworICAgIGFsbG9jX2luZm8uZGVzY3JpcHRvclNldENvdW50ID0gbGF5b3V0X2hhbmRsZXMuc2l6ZSgpOworICAgIGFsbG9jX2luZm8uZGVzY3JpcHRvclBvb2wgPSBoYW5kbGUoKTsKKyAgICBhbGxvY19pbmZvLnBTZXRMYXlvdXRzID0gbGF5b3V0X2hhbmRsZXMuZGF0YSgpOworICAgIFZrUmVzdWx0IGVyciA9IHZrOjpBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKGRldmljZSgpLCAmYWxsb2NfaW5mbywgc2V0X2hhbmRsZXMuZGF0YSgpKTsKKyAgICBFWFBFQ1QoZXJyID09IFZLX1NVQ0NFU1MpOworCisgICAgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvclNldCAqPiBzZXRzOworICAgIGZvciAoc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yU2V0Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzZXRfaGFuZGxlcy5iZWdpbigpOyBpdCAhPSBzZXRfaGFuZGxlcy5lbmQoKTsgaXQrKykgeworICAgICAgICAvLyBkbyBkZXNjcmlwdG9yIHNldHMgbmVlZCBtZW1vcmllcyBib3VuZD8KKyAgICAgICAgRGVzY3JpcHRvclNldCAqZGVzY3JpcHRvclNldCA9IG5ldyBEZXNjcmlwdG9yU2V0KGRldiwgdGhpcywgKml0KTsKKyAgICAgICAgc2V0cy5wdXNoX2JhY2soZGVzY3JpcHRvclNldCk7CisgICAgfQorICAgIHJldHVybiBzZXRzOworfQorCitzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yU2V0ICo+IERlc2NyaXB0b3JQb29sOjphbGxvY19zZXRzKGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0ICZsYXlvdXQsIHVpbnQzMl90IGNvdW50KSB7CisgICAgcmV0dXJuIGFsbG9jX3NldHMoZGV2LCBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0ICo+KGNvdW50LCAmbGF5b3V0KSk7Cit9CisKK0Rlc2NyaXB0b3JTZXQgKkRlc2NyaXB0b3JQb29sOjphbGxvY19zZXRzKGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBEZXNjcmlwdG9yU2V0TGF5b3V0ICZsYXlvdXQpIHsKKyAgICBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yU2V0ICo+IHNldCA9IGFsbG9jX3NldHMoZGV2LCBsYXlvdXQsIDEpOworICAgIHJldHVybiAoc2V0LmVtcHR5KCkpID8gTlVMTCA6IHNldFswXTsKK30KKworRGVzY3JpcHRvclNldDo6fkRlc2NyaXB0b3JTZXQoKSB7CisgICAgaWYgKGluaXRpYWxpemVkKCkpIHsKKyAgICAgICAgLy8gT25seSBjYWxsIHZrOjpGcmVlKiBvbiBzZXRzIGFsbG9jYXRlZCBmcm9tIHBvb2wgd2l0aCB1c2FnZSAqX0RZTkFNSUMKKyAgICAgICAgaWYgKGNvbnRhaW5pbmdfcG9vbF8tPmdldER5bmFtaWNVc2FnZSgpKSB7CisgICAgICAgICAgICBWa0Rlc2NyaXB0b3JTZXQgc2V0c1sxXSA9IHtoYW5kbGUoKX07CisgICAgICAgICAgICBFWFBFQ1Qodms6OkZyZWVEZXNjcmlwdG9yU2V0cyhkZXZpY2UoKSwgY29udGFpbmluZ19wb29sXy0+R2V0T2JqKCksIDEsIHNldHMpID09IFZLX1NVQ0NFU1MpOworICAgICAgICB9CisgICAgfQorfQorCitOT05fRElTUEFUQ0hBQkxFX0hBTkRMRV9EVE9SKENvbW1hbmRQb29sLCB2azo6RGVzdHJveUNvbW1hbmRQb29sKQorCit2b2lkIENvbW1hbmRQb29sOjppbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyAmaW5mbykgeworICAgIE5PTl9ESVNQQVRDSEFCTEVfSEFORExFX0lOSVQodms6OkNyZWF0ZUNvbW1hbmRQb29sLCBkZXYsICZpbmZvKTsKK30KKworQ29tbWFuZEJ1ZmZlcjo6fkNvbW1hbmRCdWZmZXIoKSB7CisgICAgaWYgKGluaXRpYWxpemVkKCkpIHsKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyIGNtZHNbXSA9IHtoYW5kbGUoKX07CisgICAgICAgIHZrOjpGcmVlQ29tbWFuZEJ1ZmZlcnMoZGV2X2hhbmRsZV8sIGNtZF9wb29sXywgMSwgY21kcyk7CisgICAgfQorfQorCit2b2lkIENvbW1hbmRCdWZmZXI6OmluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAmaW5mbykgeworICAgIFZrQ29tbWFuZEJ1ZmZlciBjbWQ7CisKKyAgICAvLyBNYWtlIHN1cmUgY29tbWFuZFBvb2wgaXMgc2V0CisgICAgYXNzZXJ0KGluZm8uY29tbWFuZFBvb2wpOworCisgICAgaWYgKEVYUEVDVCh2azo6QWxsb2NhdGVDb21tYW5kQnVmZmVycyhkZXYuaGFuZGxlKCksICZpbmZvLCAmY21kKSA9PSBWS19TVUNDRVNTKSkgeworICAgICAgICBIYW5kbGU6OmluaXQoY21kKTsKKyAgICAgICAgZGV2X2hhbmRsZV8gPSBkZXYuaGFuZGxlKCk7CisgICAgICAgIGNtZF9wb29sXyA9IGluZm8uY29tbWFuZFBvb2w7CisgICAgfQorfQorCit2b2lkIENvbW1hbmRCdWZmZXI6OmJlZ2luKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAqaW5mbykgeyBFWFBFQ1Qodms6OkJlZ2luQ29tbWFuZEJ1ZmZlcihoYW5kbGUoKSwgaW5mbykgPT0gVktfU1VDQ0VTUyk7IH0KKwordm9pZCBDb21tYW5kQnVmZmVyOjpiZWdpbigpIHsKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gaW5mbyA9IHt9OworICAgIFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyBoaW5mbyA9IHt9OworICAgIGluZm8uZmxhZ3MgPSBWS19DT01NQU5EX0JVRkZFUl9VU0FHRV9PTkVfVElNRV9TVUJNSVRfQklUOworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPOworICAgIGluZm8ucEluaGVyaXRhbmNlSW5mbyA9ICZoaW5mbzsKKyAgICBoaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0lOSEVSSVRBTkNFX0lORk87CisgICAgaGluZm8ucE5leHQgPSBOVUxMOworICAgIGhpbmZvLnJlbmRlclBhc3MgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBoaW5mby5zdWJwYXNzID0gMDsKKyAgICBoaW5mby5mcmFtZWJ1ZmZlciA9IFZLX05VTExfSEFORExFOworICAgIGhpbmZvLm9jY2x1c2lvblF1ZXJ5RW5hYmxlID0gVktfRkFMU0U7CisgICAgaGluZm8ucXVlcnlGbGFncyA9IDA7CisgICAgaGluZm8ucGlwZWxpbmVTdGF0aXN0aWNzID0gMDsKKworICAgIGJlZ2luKCZpbmZvKTsKK30KKwordm9pZCBDb21tYW5kQnVmZmVyOjplbmQoKSB7IEVYUEVDVCh2azo6RW5kQ29tbWFuZEJ1ZmZlcihoYW5kbGUoKSkgPT0gVktfU1VDQ0VTUyk7IH0KKwordm9pZCBDb21tYW5kQnVmZmVyOjpyZXNldChWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzKSB7IEVYUEVDVCh2azo6UmVzZXRDb21tYW5kQnVmZmVyKGhhbmRsZSgpLCBmbGFncykgPT0gVktfU1VDQ0VTUyk7IH0KKworfSAgLy8gbmFtZXNwYWNlIHZrX3Rlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrdGVzdGJpbmRpbmcuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrdGVzdGJpbmRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTMyNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0YmluZGluZy5oCkBAIC0wLDAgKzEsMTAyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCAyMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCAyMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNvZHlAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9obiBadWxhdWYgPGp6dWxhdWZAbHVuYXJnLmNvbT4KKyAqLworCisjaWZuZGVmIFZLVEVTVEJJTkRJTkdfSAorI2RlZmluZSBWS1RFU1RCSU5ESU5HX0gKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJsdnRfZnVuY3Rpb25fcG9pbnRlcnMuaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbi5oIgorCituYW1lc3BhY2UgdmtfdGVzdGluZyB7CisKK3RlbXBsYXRlIDxjbGFzcyBEc3QsIGNsYXNzIFNyYz4KK3N0ZDo6dmVjdG9yPERzdD4gTWFrZVZrSGFuZGxlcyhjb25zdCBzdGQ6OnZlY3RvcjxTcmM+ICZ2KSB7CisgICAgc3RkOjp2ZWN0b3I8RHN0PiBoYW5kbGVzOworICAgIGhhbmRsZXMucmVzZXJ2ZSh2LnNpemUoKSk7CisgICAgc3RkOjp0cmFuc2Zvcm0odi5iZWdpbigpLCB2LmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoaGFuZGxlcyksIFtdKGNvbnN0IFNyYyAmbykgeyByZXR1cm4gby5oYW5kbGUoKTsgfSk7CisgICAgcmV0dXJuIGhhbmRsZXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEc3QsIGNsYXNzIFNyYz4KK3N0ZDo6dmVjdG9yPERzdD4gTWFrZVZrSGFuZGxlcyhjb25zdCBzdGQ6OnZlY3RvcjxTcmMgKj4gJnYpIHsKKyAgICBzdGQ6OnZlY3RvcjxEc3Q+IGhhbmRsZXM7CisgICAgaGFuZGxlcy5yZXNlcnZlKHYuc2l6ZSgpKTsKKyAgICBzdGQ6OnRyYW5zZm9ybSh2LmJlZ2luKCksIHYuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihoYW5kbGVzKSwgW10oY29uc3QgU3JjICpvKSB7IHJldHVybiBvLT5oYW5kbGUoKTsgfSk7CisgICAgcmV0dXJuIGhhbmRsZXM7Cit9CisKK3R5cGVkZWYgdm9pZCAoKkVycm9yQ2FsbGJhY2spKGNvbnN0IGNoYXIgKmV4cHIsIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbik7Cit2b2lkIHNldF9lcnJvcl9jYWxsYmFjayhFcnJvckNhbGxiYWNrIGNhbGxiYWNrKTsKKworY2xhc3MgUGh5c2ljYWxEZXZpY2U7CitjbGFzcyBEZXZpY2U7CitjbGFzcyBRdWV1ZTsKK2NsYXNzIERldmljZU1lbW9yeTsKK2NsYXNzIEZlbmNlOworY2xhc3MgU2VtYXBob3JlOworY2xhc3MgRXZlbnQ7CitjbGFzcyBRdWVyeVBvb2w7CitjbGFzcyBCdWZmZXI7CitjbGFzcyBCdWZmZXJWaWV3OworY2xhc3MgSW1hZ2U7CitjbGFzcyBJbWFnZVZpZXc7CitjbGFzcyBEZXB0aFN0ZW5jaWxWaWV3OworY2xhc3MgU2hhZGVyOworY2xhc3MgUGlwZWxpbmU7CitjbGFzcyBQaXBlbGluZURlbHRhOworY2xhc3MgU2FtcGxlcjsKK2NsYXNzIERlc2NyaXB0b3JTZXRMYXlvdXQ7CitjbGFzcyBQaXBlbGluZUxheW91dDsKK2NsYXNzIERlc2NyaXB0b3JTZXRQb29sOworY2xhc3MgRGVzY3JpcHRvclNldDsKK2NsYXNzIENvbW1hbmRCdWZmZXI7CitjbGFzcyBDb21tYW5kUG9vbDsKKworc3RkOjp2ZWN0b3I8VmtMYXllclByb3BlcnRpZXM+IEdldEdsb2JhbExheWVycygpOworc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBHZXRHbG9iYWxFeHRlbnNpb25zKCk7CitzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IEdldEdsb2JhbEV4dGVuc2lvbnMoY29uc3QgY2hhciAqcExheWVyTmFtZSk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgSGFuZGxlIHsKKyAgcHVibGljOgorICAgIGNvbnN0IFQgJmhhbmRsZSgpIGNvbnN0IE5PRVhDRVBUIHsgcmV0dXJuIGhhbmRsZV87IH0KKyAgICBib29sIGluaXRpYWxpemVkKCkgY29uc3QgTk9FWENFUFQgeyByZXR1cm4gKGhhbmRsZV8gIT0gVHt9KTsgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIFQgaGFuZGxlX3R5cGU7CisKKyAgICBleHBsaWNpdCBIYW5kbGUoKSBOT0VYQ0VQVCA6IGhhbmRsZV97fSB7fQorICAgIGV4cGxpY2l0IEhhbmRsZShUIGhhbmRsZSkgTk9FWENFUFQgOiBoYW5kbGVfKGhhbmRsZSkge30KKworICAgIC8vIGhhbmRsZXMgYXJlIG5vbi1jb3B5YWJsZQorICAgIEhhbmRsZShjb25zdCBIYW5kbGUgJikgPSBkZWxldGU7CisgICAgSGFuZGxlICZvcGVyYXRvcj0oY29uc3QgSGFuZGxlICYpID0gZGVsZXRlOworCisgICAgLy8gaGFuZGxlcyBjYW4gYmUgbW92ZWQgb3V0CisgICAgSGFuZGxlKEhhbmRsZSAmJnNyYykgTk9FWENFUFQgOiBoYW5kbGVfe3NyYy5oYW5kbGVffSB7IHNyYy5oYW5kbGVfID0ge307IH0KKyAgICBIYW5kbGUgJm9wZXJhdG9yPShIYW5kbGUgJiZzcmMpIE5PRVhDRVBUIHsKKyAgICAgICAgaGFuZGxlXyA9IHNyYy5oYW5kbGVfOworICAgICAgICBzcmMuaGFuZGxlXyA9IHt9OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBpbml0KFQgaGFuZGxlKSBOT0VYQ0VQVCB7CisgICAgICAgIGFzc2VydCghaW5pdGlhbGl6ZWQoKSk7CisgICAgICAgIGhhbmRsZV8gPSBoYW5kbGU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVCBoYW5kbGVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBOb25EaXNwSGFuZGxlIDogcHVibGljIEhhbmRsZTxUPiB7CisgIHByb3RlY3RlZDoKKyAgICBleHBsaWNpdCBOb25EaXNwSGFuZGxlKCkgTk9FWENFUFQgOiBIYW5kbGU8VD4oKSwgZGV2X2hhbmRsZV8oVktfTlVMTF9IQU5ETEUpIHt9CisgICAgZXhwbGljaXQgTm9uRGlzcEhhbmRsZShWa0RldmljZSBkZXYsIFQgaGFuZGxlKSBOT0VYQ0VQVCA6IEhhbmRsZTxUPihoYW5kbGUpLCBkZXZfaGFuZGxlXyhkZXYpIHt9CisKKyAgICBOb25EaXNwSGFuZGxlKE5vbkRpc3BIYW5kbGUgJiZzcmMpIE5PRVhDRVBUIDogSGFuZGxlPFQ+KHN0ZDo6bW92ZShzcmMpKSB7CisgICAgICAgIGRldl9oYW5kbGVfID0gc3JjLmRldl9oYW5kbGVfOworICAgICAgICBzcmMuZGV2X2hhbmRsZV8gPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisgICAgTm9uRGlzcEhhbmRsZSAmb3BlcmF0b3I9KE5vbkRpc3BIYW5kbGUgJiZzcmMpIE5PRVhDRVBUIHsKKyAgICAgICAgSGFuZGxlPFQ+OjpvcGVyYXRvcj0oc3RkOjptb3ZlKHNyYykpOworICAgICAgICBkZXZfaGFuZGxlXyA9IHNyYy5kZXZfaGFuZGxlXzsKKyAgICAgICAgc3JjLmRldl9oYW5kbGVfID0gVktfTlVMTF9IQU5ETEU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBjb25zdCBWa0RldmljZSAmZGV2aWNlKCkgY29uc3QgTk9FWENFUFQgeyByZXR1cm4gZGV2X2hhbmRsZV87IH0KKworICAgIHZvaWQgaW5pdChWa0RldmljZSBkZXYsIFQgaGFuZGxlKSBOT0VYQ0VQVCB7CisgICAgICAgIGFzc2VydCghSGFuZGxlPFQ+Ojppbml0aWFsaXplZCgpICYmIGRldl9oYW5kbGVfID09IFZLX05VTExfSEFORExFKTsKKyAgICAgICAgSGFuZGxlPFQ+Ojppbml0KGhhbmRsZSk7CisgICAgICAgIGRldl9oYW5kbGVfID0gZGV2OworICAgIH0KKworICBwcml2YXRlOgorICAgIFZrRGV2aWNlIGRldl9oYW5kbGVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK2NsYXNzIFBoeXNpY2FsRGV2aWNlIDogcHVibGljIGludGVybmFsOjpIYW5kbGU8VmtQaHlzaWNhbERldmljZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUGh5c2ljYWxEZXZpY2UoVmtQaHlzaWNhbERldmljZSBwaHkpIDogSGFuZGxlKHBoeSkgeworICAgICAgICBtZW1vcnlfcHJvcGVydGllc18gPSBtZW1vcnlfcHJvcGVydGllcygpOworICAgICAgICBkZXZpY2VfcHJvcGVydGllc18gPSBwcm9wZXJ0aWVzKCk7CisgICAgfQorCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgcHJvcGVydGllcygpIGNvbnN0OworICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIG1lbW9yeV9wcm9wZXJ0aWVzKCkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM+IHF1ZXVlX3Byb3BlcnRpZXMoKSBjb25zdDsKKyAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMgZmVhdHVyZXMoKSBjb25zdDsKKworICAgIGJvb2wgc2V0X21lbW9yeV90eXBlKGNvbnN0IHVpbnQzMl90IHR5cGVfYml0cywgVmtNZW1vcnlBbGxvY2F0ZUluZm8gKmluZm8sIGNvbnN0IFZrTWVtb3J5UHJvcGVydHlGbGFncyBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWVtb3J5UHJvcGVydHlGbGFncyBmb3JiaWQgPSAwKSBjb25zdDsKKworICAgIC8vIHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcygpCisgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBleHRlbnNpb25zKCkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBleHRlbnNpb25zKGNvbnN0IGNoYXIgKnBMYXllck5hbWUpIGNvbnN0OworCisgICAgLy8gdmtFbnVtZXJhdGVMYXllcnMoKQorICAgIHN0ZDo6dmVjdG9yPFZrTGF5ZXJQcm9wZXJ0aWVzPiBsYXllcnMoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHZvaWQgYWRkX2V4dGVuc2lvbl9kZXBlbmRlbmNpZXModWludDMyX3QgZGVwZW5kZW5jeV9jb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpkZXBlbmNlbmN5X3Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiAmZXh0X2xpc3QpOworCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgbWVtb3J5X3Byb3BlcnRpZXNfOworCisgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgZGV2aWNlX3Byb3BlcnRpZXNfOworfTsKKworY2xhc3MgUXVldWVDcmVhdGVJbmZvQXJyYXkgeworICBwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvPiBxdWV1ZV9pbmZvXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxmbG9hdD4+IHF1ZXVlX3ByaW9yaXRpZXNfOworCisgIHB1YmxpYzoKKyAgICBRdWV1ZUNyZWF0ZUluZm9BcnJheShjb25zdCBzdGQ6OnZlY3RvcjxWa1F1ZXVlRmFtaWx5UHJvcGVydGllcz4gJnF1ZXVlX3Byb3BzKTsKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHF1ZXVlX2luZm9fLnNpemUoKTsgfQorICAgIGNvbnN0IFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvICpkYXRhKCkgY29uc3QgeyByZXR1cm4gcXVldWVfaW5mb18uZGF0YSgpOyB9Cit9OworCitjbGFzcyBEZXZpY2UgOiBwdWJsaWMgaW50ZXJuYWw6OkhhbmRsZTxWa0RldmljZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgcGh5KSA6IHBoeV8ocGh5KSB7fQorICAgIH5EZXZpY2UoKSBOT0VYQ0VQVDsKKworICAgIC8vIHZrQ3JlYXRlRGV2aWNlKCkKKyAgICB2b2lkIGluaXQoY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICZpbmZvKTsKKyAgICB2b2lkIGluaXQoc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiAmZXh0ZW5zaW9ucywgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzICpmZWF0dXJlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgIHZvaWQgKmNyZWF0ZV9kZXZpY2VfcG5leHQgPSBudWxscHRyKTsgIC8vIGFsbCBxdWV1ZXMsIGFsbCBleHRlbnNpb25zLCBldGMKKyAgICB2b2lkIGluaXQoKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gZXh0ZW5zaW9uczsKKyAgICAgICAgaW5pdChleHRlbnNpb25zKTsKKyAgICB9OworCisgICAgY29uc3QgUGh5c2ljYWxEZXZpY2UgJnBoeSgpIGNvbnN0IHsgcmV0dXJuIHBoeV87IH0KKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gR2V0RW5hYmxlZEV4dGVuc2lvbnMoKSB7IHJldHVybiBlbmFibGVkX2V4dGVuc2lvbnNfOyB9CisgICAgYm9vbCBJc0VuYWJsZWRFeHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uKTsKKworICAgIC8vIHZrR2V0RGV2aWNlUHJvY0FkZHIoKQorICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBnZXRfcHJvYyhjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7IHJldHVybiB2azo6R2V0RGV2aWNlUHJvY0FkZHIoaGFuZGxlKCksIG5hbWUpOyB9CisKKyAgICAvLyB2a0dldERldmljZVF1ZXVlKCkKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxRdWV1ZSAqPiAmZ3JhcGhpY3NfcXVldWVzKCkgY29uc3QgeyByZXR1cm4gcXVldWVzX1tHUkFQSElDU107IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxRdWV1ZSAqPiAmY29tcHV0ZV9xdWV1ZXMoKSB7IHJldHVybiBxdWV1ZXNfW0NPTVBVVEVdOyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UXVldWUgKj4gJmRtYV9xdWV1ZXMoKSB7IHJldHVybiBxdWV1ZXNfW0RNQV07IH0KKworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFF1ZXVlPj4gUXVldWVGYW1pbHlRdWV1ZXM7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxRdWV1ZUZhbWlseVF1ZXVlcz4gUXVldWVGYW1pbGllczsKKyAgICBjb25zdCBRdWV1ZUZhbWlseVF1ZXVlcyAmcXVldWVfZmFtaWx5X3F1ZXVlcyh1aW50MzJfdCBxdWV1ZV9mYW1pbHkpIGNvbnN0OworCisgICAgdWludDMyX3QgZ3JhcGhpY3NfcXVldWVfbm9kZV9pbmRleF87CisKKyAgICBzdHJ1Y3QgRm9ybWF0IHsKKyAgICAgICAgVmtGb3JtYXQgZm9ybWF0OworICAgICAgICBWa0ltYWdlVGlsaW5nIHRpbGluZzsKKyAgICAgICAgVmtGbGFncyBmZWF0dXJlczsKKyAgICB9OworICAgIC8vIHZrR2V0Rm9ybWF0SW5mbygpCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzIGZvcm1hdF9wcm9wZXJ0aWVzKFZrRm9ybWF0IGZvcm1hdCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Rm9ybWF0PiAmZm9ybWF0cygpIGNvbnN0IHsgcmV0dXJuIGZvcm1hdHNfOyB9CisKKyAgICAvLyB2a0RldmljZVdhaXRJZGxlKCkKKyAgICB2b2lkIHdhaXQoKTsKKworICAgIC8vIHZrV2FpdEZvckZlbmNlcygpCisgICAgVmtSZXN1bHQgd2FpdChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGZW5jZSAqPiAmZmVuY2VzLCBib29sIHdhaXRfYWxsLCB1aW50NjRfdCB0aW1lb3V0KTsKKyAgICBWa1Jlc3VsdCB3YWl0KGNvbnN0IEZlbmNlICZmZW5jZSkgeyByZXR1cm4gd2FpdChzdGQ6OnZlY3Rvcjxjb25zdCBGZW5jZSAqPigxLCAmZmVuY2UpLCB0cnVlLCAodWludDY0X3QpLTEpOyB9CisKKyAgICAvLyB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCkKKyAgICB2b2lkIHVwZGF0ZV9kZXNjcmlwdG9yX3NldHMoY29uc3Qgc3RkOjp2ZWN0b3I8VmtXcml0ZURlc2NyaXB0b3JTZXQ+ICZ3cml0ZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPFZrQ29weURlc2NyaXB0b3JTZXQ+ICZjb3BpZXMpOworICAgIHZvaWQgdXBkYXRlX2Rlc2NyaXB0b3Jfc2V0cyhjb25zdCBzdGQ6OnZlY3RvcjxWa1dyaXRlRGVzY3JpcHRvclNldD4gJndyaXRlcykgeworICAgICAgICByZXR1cm4gdXBkYXRlX2Rlc2NyaXB0b3Jfc2V0cyh3cml0ZXMsIHN0ZDo6dmVjdG9yPFZrQ29weURlc2NyaXB0b3JTZXQ+KCkpOworICAgIH0KKworICAgIHN0YXRpYyBWa1dyaXRlRGVzY3JpcHRvclNldCB3cml0ZV9kZXNjcmlwdG9yX3NldChjb25zdCBEZXNjcmlwdG9yU2V0ICZzZXQsIHVpbnQzMl90IGJpbmRpbmcsIHVpbnQzMl90IGFycmF5X2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclR5cGUgdHlwZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvckltYWdlSW5mbyAqaW1hZ2VfaW5mbyk7CisgICAgc3RhdGljIFZrV3JpdGVEZXNjcmlwdG9yU2V0IHdyaXRlX2Rlc2NyaXB0b3Jfc2V0KGNvbnN0IERlc2NyaXB0b3JTZXQgJnNldCwgdWludDMyX3QgYmluZGluZywgdWludDMyX3QgYXJyYXlfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyAqYnVmZmVyX2luZm8pOworICAgIHN0YXRpYyBWa1dyaXRlRGVzY3JpcHRvclNldCB3cml0ZV9kZXNjcmlwdG9yX3NldChjb25zdCBEZXNjcmlwdG9yU2V0ICZzZXQsIHVpbnQzMl90IGJpbmRpbmcsIHVpbnQzMl90IGFycmF5X2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclR5cGUgdHlwZSwgdWludDMyX3QgY291bnQsIGNvbnN0IFZrQnVmZmVyVmlldyAqYnVmZmVyX3ZpZXdzKTsKKyAgICBzdGF0aWMgVmtXcml0ZURlc2NyaXB0b3JTZXQgd3JpdGVfZGVzY3JpcHRvcl9zZXQoY29uc3QgRGVzY3JpcHRvclNldCAmc2V0LCB1aW50MzJfdCBiaW5kaW5nLCB1aW50MzJfdCBhcnJheV9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPFZrRGVzY3JpcHRvckltYWdlSW5mbz4gJmltYWdlX2luZm8pOworICAgIHN0YXRpYyBWa1dyaXRlRGVzY3JpcHRvclNldCB3cml0ZV9kZXNjcmlwdG9yX3NldChjb25zdCBEZXNjcmlwdG9yU2V0ICZzZXQsIHVpbnQzMl90IGJpbmRpbmcsIHVpbnQzMl90IGFycmF5X2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yQnVmZmVySW5mbz4gJmJ1ZmZlcl9pbmZvKTsKKyAgICBzdGF0aWMgVmtXcml0ZURlc2NyaXB0b3JTZXQgd3JpdGVfZGVzY3JpcHRvcl9zZXQoY29uc3QgRGVzY3JpcHRvclNldCAmc2V0LCB1aW50MzJfdCBiaW5kaW5nLCB1aW50MzJfdCBhcnJheV9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPFZrQnVmZmVyVmlldz4gJmJ1ZmZlcl92aWV3cyk7CisKKyAgICBzdGF0aWMgVmtDb3B5RGVzY3JpcHRvclNldCBjb3B5X2Rlc2NyaXB0b3Jfc2V0KGNvbnN0IERlc2NyaXB0b3JTZXQgJnNyY19zZXQsIHVpbnQzMl90IHNyY19iaW5kaW5nLCB1aW50MzJfdCBzcmNfYXJyYXlfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JTZXQgJmRzdF9zZXQsIHVpbnQzMl90IGRzdF9iaW5kaW5nLCB1aW50MzJfdCBkc3RfYXJyYXlfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50KTsKKworICBwcml2YXRlOgorICAgIGVudW0gUXVldWVJbmRleCB7CisgICAgICAgIEdSQVBISUNTLAorICAgICAgICBDT01QVVRFLAorICAgICAgICBETUEsCisgICAgICAgIFFVRVVFX0NPVU5ULAorICAgIH07CisKKyAgICB2b2lkIGluaXRfcXVldWVzKCk7CisgICAgdm9pZCBpbml0X2Zvcm1hdHMoKTsKKworICAgIFBoeXNpY2FsRGV2aWNlIHBoeV87CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGVuYWJsZWRfZXh0ZW5zaW9uc187CisKKyAgICBRdWV1ZUZhbWlsaWVzIHF1ZXVlX2ZhbWlsaWVzXzsKKyAgICBzdGQ6OnZlY3RvcjxRdWV1ZSAqPiBxdWV1ZXNfW1FVRVVFX0NPVU5UXTsKKyAgICBzdGQ6OnZlY3RvcjxGb3JtYXQ+IGZvcm1hdHNfOworfTsKKworY2xhc3MgUXVldWUgOiBwdWJsaWMgaW50ZXJuYWw6OkhhbmRsZTxWa1F1ZXVlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBRdWV1ZShWa1F1ZXVlIHF1ZXVlLCBpbnQgaW5kZXgpIDogSGFuZGxlKHF1ZXVlKSB7IGZhbWlseV9pbmRleF8gPSBpbmRleDsgfQorCisgICAgLy8gdmtRdWV1ZVN1Ym1pdCgpCisgICAgVmtSZXN1bHQgc3VibWl0KGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IENvbW1hbmRCdWZmZXIgKj4gJmNtZHMsIGNvbnN0IEZlbmNlICZmZW5jZSwgYm9vbCBleHBlY3Rfc3VjY2VzcyA9IHRydWUpOworICAgIFZrUmVzdWx0IHN1Ym1pdChjb25zdCBDb21tYW5kQnVmZmVyICZjbWQsIGNvbnN0IEZlbmNlICZmZW5jZSwgYm9vbCBleHBlY3Rfc3VjY2VzcyA9IHRydWUpOworICAgIFZrUmVzdWx0IHN1Ym1pdChjb25zdCBDb21tYW5kQnVmZmVyICZjbWQsIGJvb2wgZXhwZWN0X3N1Y2Nlc3MgPSB0cnVlKTsKKworICAgIC8vIHZrUXVldWVXYWl0SWRsZSgpCisgICAgVmtSZXN1bHQgd2FpdCgpOworCisgICAgaW50IGdldF9mYW1pbHlfaW5kZXgoKSB7IHJldHVybiBmYW1pbHlfaW5kZXhfOyB9CisKKyAgcHJpdmF0ZToKKyAgICBpbnQgZmFtaWx5X2luZGV4XzsKK307CisKK2NsYXNzIERldmljZU1lbW9yeSA6IHB1YmxpYyBpbnRlcm5hbDo6Tm9uRGlzcEhhbmRsZTxWa0RldmljZU1lbW9yeT4geworICBwdWJsaWM6CisgICAgfkRldmljZU1lbW9yeSgpIE5PRVhDRVBUOworCisgICAgLy8gdmtBbGxvY2F0ZU1lbW9yeSgpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyAmaW5mbyk7CisKKyAgICAvLyB2a01hcE1lbW9yeSgpCisgICAgY29uc3Qgdm9pZCAqbWFwKFZrRmxhZ3MgZmxhZ3MpIGNvbnN0OworICAgIHZvaWQgKm1hcChWa0ZsYWdzIGZsYWdzKTsKKyAgICBjb25zdCB2b2lkICptYXAoKSBjb25zdCB7IHJldHVybiBtYXAoMCk7IH0KKyAgICB2b2lkICptYXAoKSB7IHJldHVybiBtYXAoMCk7IH0KKworICAgIC8vIHZrVW5tYXBNZW1vcnkoKQorICAgIHZvaWQgdW5tYXAoKSBjb25zdDsKKworICAgIHN0YXRpYyBWa01lbW9yeUFsbG9jYXRlSW5mbyBhbGxvY19pbmZvKFZrRGV2aWNlU2l6ZSBzaXplLCB1aW50MzJfdCBtZW1vcnlfdHlwZV9pbmRleCk7CisgICAgc3RhdGljIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGdldF9yZXNvdXJjZV9hbGxvY19pbmZvKGNvbnN0IHZrX3Rlc3Rpbmc6OkRldmljZSAmZGV2LCBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyAmcmVxcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzIG1lbV9wcm9wcyk7Cit9OworCitjbGFzcyBGZW5jZSA6IHB1YmxpYyBpbnRlcm5hbDo6Tm9uRGlzcEhhbmRsZTxWa0ZlbmNlPiB7CisgIHB1YmxpYzoKKyAgICB+RmVuY2UoKSBOT0VYQ0VQVDsKKworICAgIC8vIHZrQ3JlYXRlRmVuY2UoKQorICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8gJmluZm8pOworCisgICAgLy8gdmtHZXRGZW5jZVN0YXR1cygpCisgICAgVmtSZXN1bHQgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gdms6OkdldEZlbmNlU3RhdHVzKGRldmljZSgpLCBoYW5kbGUoKSk7IH0KKyAgICBWa1Jlc3VsdCB3YWl0KFZrQm9vbDMyIHdhaXRfYWxsLCB1aW50NjRfdCB0aW1lb3V0KSBjb25zdDsKKworICAgIHN0YXRpYyBWa0ZlbmNlQ3JlYXRlSW5mbyBjcmVhdGVfaW5mbyhWa0ZlbmNlQ3JlYXRlRmxhZ3MgZmxhZ3MpOworICAgIHN0YXRpYyBWa0ZlbmNlQ3JlYXRlSW5mbyBjcmVhdGVfaW5mbygpOworfTsKKworY2xhc3MgU2VtYXBob3JlIDogcHVibGljIGludGVybmFsOjpOb25EaXNwSGFuZGxlPFZrU2VtYXBob3JlPiB7CisgIHB1YmxpYzoKKyAgICB+U2VtYXBob3JlKCkgTk9FWENFUFQ7CisKKyAgICAvLyB2a0NyZWF0ZVNlbWFwaG9yZSgpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gJmluZm8pOworCisgICAgc3RhdGljIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBjcmVhdGVfaW5mbyhWa0ZsYWdzIGZsYWdzKTsKK307CisKK2NsYXNzIEV2ZW50IDogcHVibGljIGludGVybmFsOjpOb25EaXNwSGFuZGxlPFZrRXZlbnQ+IHsKKyAgcHVibGljOgorICAgIH5FdmVudCgpIE5PRVhDRVBUOworCisgICAgLy8gdmtDcmVhdGVFdmVudCgpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyAmaW5mbyk7CisKKyAgICAvLyB2a0dldEV2ZW50U3RhdHVzKCkKKyAgICAvLyB2a1NldEV2ZW50KCkKKyAgICAvLyB2a1Jlc2V0RXZlbnQoKQorICAgIFZrUmVzdWx0IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIHZrOjpHZXRFdmVudFN0YXR1cyhkZXZpY2UoKSwgaGFuZGxlKCkpOyB9CisgICAgdm9pZCBzZXQoKTsKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICBzdGF0aWMgVmtFdmVudENyZWF0ZUluZm8gY3JlYXRlX2luZm8oVmtGbGFncyBmbGFncyk7Cit9OworCitjbGFzcyBRdWVyeVBvb2wgOiBwdWJsaWMgaW50ZXJuYWw6Ok5vbkRpc3BIYW5kbGU8VmtRdWVyeVBvb2w+IHsKKyAgcHVibGljOgorICAgIH5RdWVyeVBvb2woKSBOT0VYQ0VQVDsKKworICAgIC8vIHZrQ3JlYXRlUXVlcnlQb29sKCkKKyAgICB2b2lkIGluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyAmaW5mbyk7CisKKyAgICAvLyB2a0dldFF1ZXJ5UG9vbFJlc3VsdHMoKQorICAgIFZrUmVzdWx0IHJlc3VsdHModWludDMyX3QgZmlyc3QsIHVpbnQzMl90IGNvdW50LCBzaXplX3Qgc2l6ZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHN0cmlkZSk7CisKKyAgICBzdGF0aWMgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvKFZrUXVlcnlUeXBlIHR5cGUsIHVpbnQzMl90IHNsb3RfY291bnQpOworfTsKKworY2xhc3MgQnVmZmVyIDogcHVibGljIGludGVybmFsOjpOb25EaXNwSGFuZGxlPFZrQnVmZmVyPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIoKSA6IE5vbkRpc3BIYW5kbGUoKSB7fQorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvICZpbmZvKSB7IGluaXQoZGV2LCBpbmZvKTsgfQorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBEZXZpY2UgJmRldiwgVmtEZXZpY2VTaXplIHNpemUpIHsgaW5pdChkZXYsIHNpemUpOyB9CisKKyAgICB+QnVmZmVyKCkgTk9FWENFUFQ7CisKKyAgICAvLyB2a0NyZWF0ZUJ1ZmZlcigpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gJmluZm8sIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fcHJvcHMpOworICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvICZpbmZvKSB7IGluaXQoZGV2LCBpbmZvLCAwKTsgfQorICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgVmtEZXZpY2VTaXplIHNpemUsIFZrTWVtb3J5UHJvcGVydHlGbGFncyBtZW1fcHJvcHMsCisgICAgICAgICAgICAgIFZrQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9VTklGT1JNX0JVRkZFUl9CSVQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAmcXVldWVfZmFtaWxpZXMgPSB7fSkgeworICAgICAgICBpbml0KGRldiwgY3JlYXRlX2luZm8oc2l6ZSwgdXNhZ2UsICZxdWV1ZV9mYW1pbGllcyksIG1lbV9wcm9wcyk7CisgICAgfQorICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgVmtEZXZpY2VTaXplIHNpemUpIHsgaW5pdChkZXYsIHNpemUsIDApOyB9CisgICAgdm9pZCBpbml0X2FzX3NyYyhjb25zdCBEZXZpY2UgJmRldiwgVmtEZXZpY2VTaXplIHNpemUsIFZrTWVtb3J5UHJvcGVydHlGbGFncyAmcmVxcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqcXVldWVfZmFtaWxpZXMgPSBudWxscHRyKSB7CisgICAgICAgIGluaXQoZGV2LCBjcmVhdGVfaW5mbyhzaXplLCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCwgcXVldWVfZmFtaWxpZXMpLCByZXFzKTsKKyAgICB9CisgICAgdm9pZCBpbml0X2FzX2RzdChjb25zdCBEZXZpY2UgJmRldiwgVmtEZXZpY2VTaXplIHNpemUsIFZrTWVtb3J5UHJvcGVydHlGbGFncyAmcmVxcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqcXVldWVfZmFtaWxpZXMgPSBudWxscHRyKSB7CisgICAgICAgIGluaXQoZGV2LCBjcmVhdGVfaW5mbyhzaXplLCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgcXVldWVfZmFtaWxpZXMpLCByZXFzKTsKKyAgICB9CisgICAgdm9pZCBpbml0X2FzX3NyY19hbmRfZHN0KGNvbnN0IERldmljZSAmZGV2LCBWa0RldmljZVNpemUgc2l6ZSwgVmtNZW1vcnlQcm9wZXJ0eUZsYWdzICZyZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gKnF1ZXVlX2ZhbWlsaWVzID0gbnVsbHB0ciwgYm9vbCBtZW1vcnkgPSB0cnVlKSB7CisgICAgICAgIGlmIChtZW1vcnkpCisgICAgICAgICAgICBpbml0KGRldiwgY3JlYXRlX2luZm8oc2l6ZSwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgcXVldWVfZmFtaWxpZXMpLCByZXFzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5pdF9ub19tZW0oZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX2luZm8oc2l6ZSwgVktfQlVGRkVSX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQgfCBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwgcXVldWVfZmFtaWxpZXMpKTsKKyAgICB9CisgICAgdm9pZCBpbml0X25vX21lbShjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvICZpbmZvKTsKKworICAgIC8vIGdldCB0aGUgaW50ZXJuYWwgbWVtb3J5CisgICAgY29uc3QgRGV2aWNlTWVtb3J5ICZtZW1vcnkoKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbF9tZW1fOyB9CisgICAgRGV2aWNlTWVtb3J5ICZtZW1vcnkoKSB7IHJldHVybiBpbnRlcm5hbF9tZW1fOyB9CisKKyAgICAvLyB2a0dldE9iamVjdE1lbW9yeVJlcXVpcmVtZW50cygpCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtb3J5X3JlcXVpcmVtZW50cygpIGNvbnN0OworCisgICAgLy8gdmtCaW5kT2JqZWN0TWVtb3J5KCkKKyAgICB2b2lkIGJpbmRfbWVtb3J5KGNvbnN0IERldmljZU1lbW9yeSAmbWVtLCBWa0RldmljZVNpemUgbWVtX29mZnNldCk7CisKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gJmNyZWF0ZV9pbmZvKCkgY29uc3QgeyByZXR1cm4gY3JlYXRlX2luZm9fOyB9CisgICAgc3RhdGljIFZrQnVmZmVyQ3JlYXRlSW5mbyBjcmVhdGVfaW5mbyhWa0RldmljZVNpemUgc2l6ZSwgVmtGbGFncyB1c2FnZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICpxdWV1ZV9mYW1pbGllcyA9IG51bGxwdHIpOworCisgICAgVmtCdWZmZXJNZW1vcnlCYXJyaWVyIGJ1ZmZlcl9tZW1vcnlfYmFycmllcihWa0ZsYWdzIG91dHB1dF9tYXNrLCBWa0ZsYWdzIGlucHV0X21hc2ssIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgc2l6ZSkgY29uc3QgeworICAgICAgICBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgYmFycmllciA9IHt9OworICAgICAgICBiYXJyaWVyLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQlVGRkVSX01FTU9SWV9CQVJSSUVSOworICAgICAgICBiYXJyaWVyLmJ1ZmZlciA9IGhhbmRsZSgpOworICAgICAgICBiYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBvdXRwdXRfbWFzazsKKyAgICAgICAgYmFycmllci5kc3RBY2Nlc3NNYXNrID0gaW5wdXRfbWFzazsKKyAgICAgICAgYmFycmllci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIGJhcnJpZXIuc2l6ZSA9IHNpemU7CisgICAgICAgIGlmIChjcmVhdGVfaW5mb18uc2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQpIHsKKyAgICAgICAgICAgIGJhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgICAgICAgICAgYmFycmllci5kc3RRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJhcnJpZXI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvXzsKKworICAgIERldmljZU1lbW9yeSBpbnRlcm5hbF9tZW1fOworfTsKKworY2xhc3MgQnVmZmVyVmlldyA6IHB1YmxpYyBpbnRlcm5hbDo6Tm9uRGlzcEhhbmRsZTxWa0J1ZmZlclZpZXc+IHsKKyAgcHVibGljOgorICAgIH5CdWZmZXJWaWV3KCkgTk9FWENFUFQ7CisKKyAgICAvLyB2a0NyZWF0ZUJ1ZmZlclZpZXcoKQorICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyAmaW5mbyk7CisgICAgc3RhdGljIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gY3JlYXRlSW5mbyhWa0J1ZmZlciBidWZmZXIsIFZrRm9ybWF0IGZvcm1hdCwgVmtEZXZpY2VTaXplIG9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgcmFuZ2UgPSBWS19XSE9MRV9TSVpFKTsKK307CisKK2lubGluZSBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvIEJ1ZmZlclZpZXc6OmNyZWF0ZUluZm8oVmtCdWZmZXIgYnVmZmVyLCBWa0Zvcm1hdCBmb3JtYXQsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSByYW5nZSkgeworICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gaW5mbyA9IHt9OworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBpbmZvLmZsYWdzID0gVmtGbGFncygwKTsKKyAgICBpbmZvLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBpbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBpbmZvLm9mZnNldCA9IG9mZnNldDsKKyAgICBpbmZvLnJhbmdlID0gcmFuZ2U7CisgICAgcmV0dXJuIGluZm87Cit9CisKK2NsYXNzIEltYWdlIDogcHVibGljIGludGVybmFsOjpOb25EaXNwSGFuZGxlPFZrSW1hZ2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEltYWdlKCkgOiBOb25EaXNwSGFuZGxlKCksIGZvcm1hdF9mZWF0dXJlc18oMCkge30KKyAgICBleHBsaWNpdCBJbWFnZShjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gJmluZm8pIDogZm9ybWF0X2ZlYXR1cmVzXygwKSB7IGluaXQoZGV2LCBpbmZvKTsgfQorCisgICAgfkltYWdlKCkgTk9FWENFUFQ7CisKKyAgICAvLyB2a0NyZWF0ZUltYWdlKCkKKyAgICB2b2lkIGluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZpbmZvLCBWa01lbW9yeVByb3BlcnR5RmxhZ3MgbWVtX3Byb3BzKTsKKyAgICB2b2lkIGluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZpbmZvKSB7IGluaXQoZGV2LCBpbmZvLCAwKTsgfQorICAgIHZvaWQgaW5pdF9ub19tZW0oY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZpbmZvKTsKKworICAgIC8vIGdldCB0aGUgaW50ZXJuYWwgbWVtb3J5CisgICAgY29uc3QgRGV2aWNlTWVtb3J5ICZtZW1vcnkoKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbF9tZW1fOyB9CisgICAgRGV2aWNlTWVtb3J5ICZtZW1vcnkoKSB7IHJldHVybiBpbnRlcm5hbF9tZW1fOyB9CisKKyAgICAvLyB2a0dldE9iamVjdE1lbW9yeVJlcXVpcmVtZW50cygpCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtb3J5X3JlcXVpcmVtZW50cygpIGNvbnN0OworCisgICAgLy8gdmtCaW5kT2JqZWN0TWVtb3J5KCkKKyAgICB2b2lkIGJpbmRfbWVtb3J5KGNvbnN0IERldmljZU1lbW9yeSAmbWVtLCBWa0RldmljZVNpemUgbWVtX29mZnNldCk7CisKKyAgICAvLyB2a0dldEltYWdlU3VicmVzb3VyY2VMYXlvdXQoKQorICAgIFZrU3VicmVzb3VyY2VMYXlvdXQgc3VicmVzb3VyY2VfbGF5b3V0KGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSAmc3VicmVzKSBjb25zdDsKKyAgICBWa1N1YnJlc291cmNlTGF5b3V0IHN1YnJlc291cmNlX2xheW91dChjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgJnN1YnJlcykgY29uc3Q7CisKKyAgICBib29sIHRyYW5zcGFyZW50KCkgY29uc3Q7CisgICAgYm9vbCBjb3B5YWJsZSgpIGNvbnN0IHsgcmV0dXJuIChmb3JtYXRfZmVhdHVyZXNfICYgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQpOyB9CisKKyAgICBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBzdWJyZXNvdXJjZV9yYW5nZShWa0ltYWdlQXNwZWN0RmxhZ3MgYXNwZWN0KSBjb25zdCB7IHJldHVybiBzdWJyZXNvdXJjZV9yYW5nZShjcmVhdGVfaW5mb18sIGFzcGVjdCk7IH0KKyAgICBWa0V4dGVudDNEIGV4dGVudCgpIGNvbnN0IHsgcmV0dXJuIGNyZWF0ZV9pbmZvXy5leHRlbnQ7IH0KKyAgICBWa0V4dGVudDNEIGV4dGVudCh1aW50MzJfdCBtaXBfbGV2ZWwpIGNvbnN0IHsgcmV0dXJuIGV4dGVudChjcmVhdGVfaW5mb18uZXh0ZW50LCBtaXBfbGV2ZWwpOyB9CisgICAgVmtGb3JtYXQgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gY3JlYXRlX2luZm9fLmZvcm1hdDsgfQorICAgIFZrSW1hZ2VVc2FnZUZsYWdzIHVzYWdlKCkgY29uc3QgeyByZXR1cm4gY3JlYXRlX2luZm9fLnVzYWdlOyB9CisgICAgVmtTaGFyaW5nTW9kZSBzaGFyaW5nX21vZGUoKSBjb25zdCB7IHJldHVybiBjcmVhdGVfaW5mb18uc2hhcmluZ01vZGU7IH0KKyAgICBWa0ltYWdlTWVtb3J5QmFycmllciBpbWFnZV9tZW1vcnlfYmFycmllcihWa0ZsYWdzIG91dHB1dF9tYXNrLCBWa0ZsYWdzIGlucHV0X21hc2ssIFZrSW1hZ2VMYXlvdXQgb2xkX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlTGF5b3V0IG5ld19sYXlvdXQsIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNRdWV1ZUZhbWlseUluZGV4ID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEKSBjb25zdCB7CisgICAgICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGJhcnJpZXIgPSB7fTsKKyAgICAgICAgYmFycmllci5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSOworICAgICAgICBiYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBvdXRwdXRfbWFzazsKKyAgICAgICAgYmFycmllci5kc3RBY2Nlc3NNYXNrID0gaW5wdXRfbWFzazsKKyAgICAgICAgYmFycmllci5vbGRMYXlvdXQgPSBvbGRfbGF5b3V0OworICAgICAgICBiYXJyaWVyLm5ld0xheW91dCA9IG5ld19sYXlvdXQ7CisgICAgICAgIGJhcnJpZXIuaW1hZ2UgPSBoYW5kbGUoKTsKKyAgICAgICAgYmFycmllci5zdWJyZXNvdXJjZVJhbmdlID0gcmFuZ2U7CisgICAgICAgIGJhcnJpZXIuc3JjUXVldWVGYW1pbHlJbmRleCA9IHNyY1F1ZXVlRmFtaWx5SW5kZXg7CisgICAgICAgIGJhcnJpZXIuZHN0UXVldWVGYW1pbHlJbmRleCA9IGRzdFF1ZXVlRmFtaWx5SW5kZXg7CisgICAgICAgIHJldHVybiBiYXJyaWVyOworICAgIH0KKworICAgIHN0YXRpYyBWa0ltYWdlQ3JlYXRlSW5mbyBjcmVhdGVfaW5mbygpOworICAgIHN0YXRpYyBWa0ltYWdlU3VicmVzb3VyY2Ugc3VicmVzb3VyY2UoVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdCwgdWludDMyX3QgbWlwX2xldmVsLCB1aW50MzJfdCBhcnJheV9sYXllcik7CisgICAgc3RhdGljIFZrSW1hZ2VTdWJyZXNvdXJjZSBzdWJyZXNvdXJjZShjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmcmFuZ2UsIHVpbnQzMl90IG1pcF9sZXZlbCwgdWludDMyX3QgYXJyYXlfbGF5ZXIpOworICAgIHN0YXRpYyBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgc3VicmVzb3VyY2UoVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdCwgdWludDMyX3QgbWlwX2xldmVsLCB1aW50MzJfdCBhcnJheV9sYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFycmF5X3NpemUpOworICAgIHN0YXRpYyBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgc3VicmVzb3VyY2UoY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnJhbmdlLCB1aW50MzJfdCBtaXBfbGV2ZWwsIHVpbnQzMl90IGFycmF5X2xheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJyYXlfc2l6ZSk7CisgICAgc3RhdGljIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHN1YnJlc291cmNlX3JhbmdlKFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RfbWFzaywgdWludDMyX3QgYmFzZV9taXBfbGV2ZWwsIHVpbnQzMl90IG1pcF9sZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhc2VfYXJyYXlfbGF5ZXIsIHVpbnQzMl90IG51bV9sYXllcnMpOworICAgIHN0YXRpYyBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBzdWJyZXNvdXJjZV9yYW5nZShjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAmaW5mbywgVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdF9tYXNrKTsKKyAgICBzdGF0aWMgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2Ugc3VicmVzb3VyY2VfcmFuZ2UoY29uc3QgVmtJbWFnZVN1YnJlc291cmNlICZzdWJyZXMpOworCisgICAgc3RhdGljIFZrRXh0ZW50MkQgZXh0ZW50KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICBzdGF0aWMgVmtFeHRlbnQyRCBleHRlbnQoY29uc3QgVmtFeHRlbnQyRCAmZXh0ZW50LCB1aW50MzJfdCBtaXBfbGV2ZWwpOworICAgIHN0YXRpYyBWa0V4dGVudDJEIGV4dGVudChjb25zdCBWa0V4dGVudDNEICZleHRlbnQpOworCisgICAgc3RhdGljIFZrRXh0ZW50M0QgZXh0ZW50KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGRlcHRoKTsKKyAgICBzdGF0aWMgVmtFeHRlbnQzRCBleHRlbnQoY29uc3QgVmtFeHRlbnQzRCAmZXh0ZW50LCB1aW50MzJfdCBtaXBfbGV2ZWwpOworCisgIHByaXZhdGU6CisgICAgdm9pZCBpbml0X2luZm8oY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICZpbmZvKTsKKworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvXzsKKyAgICBWa0ZsYWdzIGZvcm1hdF9mZWF0dXJlc187CisKKyAgICBEZXZpY2VNZW1vcnkgaW50ZXJuYWxfbWVtXzsKK307CisKK2NsYXNzIEltYWdlVmlldyA6IHB1YmxpYyBpbnRlcm5hbDo6Tm9uRGlzcEhhbmRsZTxWa0ltYWdlVmlldz4geworICBwdWJsaWM6CisgICAgfkltYWdlVmlldygpIE5PRVhDRVBUOworCisgICAgLy8gdmtDcmVhdGVJbWFnZVZpZXcoKQorICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvICZpbmZvKTsKK307CisKK2NsYXNzIEFjY2VsZXJhdGlvblN0cnVjdHVyZSA6IHB1YmxpYyBpbnRlcm5hbDo6Tm9uRGlzcEhhbmRsZTxWa0FjY2VsZXJhdGlvblN0cnVjdHVyZU5WPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBY2NlbGVyYXRpb25TdHJ1Y3R1cmUoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlQ3JlYXRlSW5mb05WICZpbmZvLCBib29sIGluaXRfbWVtb3J5ID0gdHJ1ZSkgeworICAgICAgICBpbml0KGRldiwgaW5mbywgaW5pdF9tZW1vcnkpOworICAgIH0KKyAgICB+QWNjZWxlcmF0aW9uU3RydWN0dXJlKCk7CisKKyAgICAvLyB2a0NyZWF0ZUFjY2VsZXJhdGlvblN0cnVjdHVyZU5WCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0FjY2VsZXJhdGlvblN0cnVjdHVyZUNyZWF0ZUluZm9OViAmaW5mbywgYm9vbCBpbml0X21lbW9yeSA9IHRydWUpOworCisgICAgLy8gdmtHZXRBY2NlbGVyYXRpb25TdHJ1Y3R1cmVNZW1vcnlSZXF1aXJlbWVudHNOVigpCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMyIG1lbW9yeV9yZXF1aXJlbWVudHMoKSBjb25zdDsKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50czIgYnVpbGRfc2NyYXRjaF9tZW1vcnlfcmVxdWlyZW1lbnRzKCkgY29uc3Q7CisKKyAgICB1aW50NjRfdCBvcGFxdWVfaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gb3BhcXVlX2hhbmRsZV87IH0KKworICAgIGNvbnN0IFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WICZpbmZvKCkgY29uc3QgeyByZXR1cm4gaW5mb187IH0KKworICAgIGNvbnN0IFZrRGV2aWNlICZkZXYoKSBjb25zdCB7IHJldHVybiBkZXZpY2UoKTsgfQorCisgICAgdm9pZCBjcmVhdGVfc2NyYXRjaF9idWZmZXIoY29uc3QgRGV2aWNlICZkZXYsIEJ1ZmZlciAqYnVmZmVyKTsKKworICBwcml2YXRlOgorICAgIFZrQWNjZWxlcmF0aW9uU3RydWN0dXJlSW5mb05WIGluZm9fOworICAgIERldmljZU1lbW9yeSBtZW1vcnlfOworICAgIHVpbnQ2NF90IG9wYXF1ZV9oYW5kbGVfOworfTsKKworY2xhc3MgU2hhZGVyTW9kdWxlIDogcHVibGljIGludGVybmFsOjpOb25EaXNwSGFuZGxlPFZrU2hhZGVyTW9kdWxlPiB7CisgIHB1YmxpYzoKKyAgICB+U2hhZGVyTW9kdWxlKCkgTk9FWENFUFQ7CisKKyAgICAvLyB2a0NyZWF0ZVNoYWRlck1vZHVsZSgpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gJmluZm8pOworICAgIFZrUmVzdWx0IGluaXRfdHJ5KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gJmluZm8pOworCisgICAgc3RhdGljIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBjcmVhdGVfaW5mbyhzaXplX3QgY29kZV9zaXplLCBjb25zdCB1aW50MzJfdCAqY29kZSwgVmtGbGFncyBmbGFncyk7Cit9OworCitjbGFzcyBQaXBlbGluZSA6IHB1YmxpYyBpbnRlcm5hbDo6Tm9uRGlzcEhhbmRsZTxWa1BpcGVsaW5lPiB7CisgIHB1YmxpYzoKKyAgICB+UGlwZWxpbmUoKSBOT0VYQ0VQVDsKKworICAgIC8vIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICZpbmZvKTsKKyAgICAvLyB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVEZXJpdmF0aXZlKCkKKyAgICB2b2lkIGluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gJmluZm8sIGNvbnN0IFZrUGlwZWxpbmUgYmFzZVBpcGVsaW5lKTsKKyAgICAvLyB2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZSgpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8gJmluZm8pOworICAgIC8vIHZrTG9hZFBpcGVsaW5lKCkKKyAgICB2b2lkIGluaXQoY29uc3QgRGV2aWNlICZkZXYsIHNpemVfdCBzaXplLCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICAvLyB2a0xvYWRQaXBlbGluZURlcml2YXRpdmUoKQorICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgc2l6ZV90IHNpemUsIGNvbnN0IHZvaWQgKmRhdGEsIFZrUGlwZWxpbmUgYmFzZVBpcGVsaW5lKTsKKworICAgIC8vIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSB3aXRoIGVycm9yIHJldHVybgorICAgIFZrUmVzdWx0IGluaXRfdHJ5KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICZpbmZvKTsKKworICAgIC8vIHZrU3RvcmVQaXBlbGluZSgpCisgICAgc2l6ZV90IHN0b3JlKHNpemVfdCBzaXplLCB2b2lkICpkYXRhKTsKK307CisKK2NsYXNzIFBpcGVsaW5lTGF5b3V0IDogcHVibGljIGludGVybmFsOjpOb25EaXNwSGFuZGxlPFZrUGlwZWxpbmVMYXlvdXQ+IHsKKyAgcHVibGljOgorICAgIFBpcGVsaW5lTGF5b3V0KCkgTk9FWENFUFQgOiBOb25EaXNwSGFuZGxlKCkge30KKyAgICB+UGlwZWxpbmVMYXlvdXQoKSBOT0VYQ0VQVDsKKworICAgIC8vIE1vdmUgY29uc3RydWN0b3IgZm9yIFZpc3VhbCBTdHVkaW8gMjAxMworICAgIFBpcGVsaW5lTGF5b3V0KFBpcGVsaW5lTGF5b3V0ICYmc3JjKSBOT0VYQ0VQVCA6IE5vbkRpc3BIYW5kbGUoc3RkOjptb3ZlKHNyYykpe307CisKKyAgICBQaXBlbGluZUxheW91dCAmb3BlcmF0b3I9KFBpcGVsaW5lTGF5b3V0ICYmc3JjKSBOT0VYQ0VQVCB7CisgICAgICAgIHRoaXMtPn5QaXBlbGluZUxheW91dCgpOworICAgICAgICB0aGlzLT5Ob25EaXNwSGFuZGxlOjpvcGVyYXRvcj0oc3RkOjptb3ZlKHNyYykpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfTsKKworICAgIC8vIHZDcmVhdGVQaXBlbGluZUxheW91dCgpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyAmaW5mbywgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvclNldExheW91dCAqPiAmbGF5b3V0cyk7Cit9OworCitjbGFzcyBTYW1wbGVyIDogcHVibGljIGludGVybmFsOjpOb25EaXNwSGFuZGxlPFZrU2FtcGxlcj4geworICBwdWJsaWM6CisgICAgflNhbXBsZXIoKSBOT0VYQ0VQVDsKKworICAgIC8vIHZrQ3JlYXRlU2FtcGxlcigpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvICZpbmZvKTsKK307CisKK2NsYXNzIERlc2NyaXB0b3JTZXRMYXlvdXQgOiBwdWJsaWMgaW50ZXJuYWw6Ok5vbkRpc3BIYW5kbGU8VmtEZXNjcmlwdG9yU2V0TGF5b3V0PiB7CisgIHB1YmxpYzoKKyAgICBEZXNjcmlwdG9yU2V0TGF5b3V0KCkgTk9FWENFUFQgOiBOb25EaXNwSGFuZGxlKCl7fTsKKyAgICB+RGVzY3JpcHRvclNldExheW91dCgpIE5PRVhDRVBUOworCisgICAgLy8gTW92ZSBjb25zdHJ1Y3RvciBmb3IgVmlzdWFsIFN0dWRpbyAyMDEzCisgICAgRGVzY3JpcHRvclNldExheW91dChEZXNjcmlwdG9yU2V0TGF5b3V0ICYmc3JjKSBOT0VYQ0VQVCA6IE5vbkRpc3BIYW5kbGUoc3RkOjptb3ZlKHNyYykpe307CisKKyAgICBEZXNjcmlwdG9yU2V0TGF5b3V0ICZvcGVyYXRvcj0oRGVzY3JpcHRvclNldExheW91dCAmJnNyYykgTk9FWENFUFQgeworICAgICAgICB0aGlzLT5+RGVzY3JpcHRvclNldExheW91dCgpOworICAgICAgICB0aGlzLT5Ob25EaXNwSGFuZGxlOjpvcGVyYXRvcj0oc3RkOjptb3ZlKHNyYykpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KCkKKyAgICB2b2lkIGluaXQoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gJmluZm8pOworfTsKKworY2xhc3MgRGVzY3JpcHRvclBvb2wgOiBwdWJsaWMgaW50ZXJuYWw6Ok5vbkRpc3BIYW5kbGU8VmtEZXNjcmlwdG9yUG9vbD4geworICBwdWJsaWM6CisgICAgfkRlc2NyaXB0b3JQb29sKCkgTk9FWENFUFQ7CisKKyAgICAvLyBEZXNjcmlwdG9yIHNldHMgYWxsb2NhdGVkIGZyb20gdGhpcyBwb29sIHdpbGwgbmVlZCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsCisgICAgLy8gb2JqZWN0CisgICAgVmtEZXNjcmlwdG9yUG9vbCBHZXRPYmooKSB7IHJldHVybiBwb29sXzsgfQorCisgICAgLy8gdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCgpCisgICAgdm9pZCBpbml0KGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAmaW5mbyk7CisKKyAgICAvLyB2a1Jlc2V0RGVzY3JpcHRvclBvb2woKQorICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIHZrRnJlZURlc2NyaXB0b3JTZXQoKQorICAgIHZvaWQgc2V0RHluYW1pY1VzYWdlKGJvb2wgaXNEeW5hbWljKSB7IGR5bmFtaWNfdXNhZ2VfID0gaXNEeW5hbWljOyB9CisgICAgYm9vbCBnZXREeW5hbWljVXNhZ2UoKSB7IHJldHVybiBkeW5hbWljX3VzYWdlXzsgfQorCisgICAgLy8gdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCkKKyAgICBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yU2V0ICo+IGFsbG9jX3NldHMoY29uc3QgRGV2aWNlICZkZXYsIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3JTZXRMYXlvdXQgKj4gJmxheW91dHMpOworICAgIHN0ZDo6dmVjdG9yPERlc2NyaXB0b3JTZXQgKj4gYWxsb2Nfc2V0cyhjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgRGVzY3JpcHRvclNldExheW91dCAmbGF5b3V0LCB1aW50MzJfdCBjb3VudCk7CisgICAgRGVzY3JpcHRvclNldCAqYWxsb2Nfc2V0cyhjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgRGVzY3JpcHRvclNldExheW91dCAmbGF5b3V0KTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQb29sU2l6ZXM+CisgICAgc3RhdGljIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvKFZrRGVzY3JpcHRvclBvb2xDcmVhdGVGbGFncyBmbGFncywgdWludDMyX3QgbWF4X3NldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvb2xTaXplcyAmcG9vbF9zaXplcyk7CisKKyAgcHJpdmF0ZToKKyAgICBWa0Rlc2NyaXB0b3JQb29sIHBvb2xfOworCisgICAgLy8gVHJhY2sgd2hldGhlciB0aGlzIHBvb2wncyB1c2FnZSBpcyBWS19ERVNDUklQVE9SX1BPT0xfVVNBR0VfRFlOQU1JQworICAgIGJvb2wgZHluYW1pY191c2FnZV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9vbFNpemVzPgoraW5saW5lIFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvIERlc2NyaXB0b3JQb29sOjpjcmVhdGVfaW5mbyhWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlRmxhZ3MgZmxhZ3MsIHVpbnQzMl90IG1heF9zZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb29sU2l6ZXMgJnBvb2xfc2l6ZXMpIHsKKyAgICBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBpbmZve307CisgICAgaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBpbmZvLnBOZXh0ID0gbnVsbHB0cjsKKyAgICBpbmZvLmZsYWdzID0gZmxhZ3M7CisgICAgaW5mby5tYXhTZXRzID0gbWF4X3NldHM7CisgICAgaW5mby5wb29sU2l6ZUNvdW50ID0gcG9vbF9zaXplcy5zaXplKCk7CisgICAgaW5mby5wUG9vbFNpemVzID0gKGluZm8ucG9vbFNpemVDb3VudCkgPyBwb29sX3NpemVzLmRhdGEoKSA6IG51bGxwdHI7CisgICAgcmV0dXJuIGluZm87Cit9CisKK2NsYXNzIERlc2NyaXB0b3JTZXQgOiBwdWJsaWMgaW50ZXJuYWw6Ok5vbkRpc3BIYW5kbGU8VmtEZXNjcmlwdG9yU2V0PiB7CisgIHB1YmxpYzoKKyAgICB+RGVzY3JpcHRvclNldCgpIE5PRVhDRVBUOworCisgICAgZXhwbGljaXQgRGVzY3JpcHRvclNldCgpIDogTm9uRGlzcEhhbmRsZSgpIHt9CisgICAgZXhwbGljaXQgRGVzY3JpcHRvclNldChjb25zdCBEZXZpY2UgJmRldiwgRGVzY3JpcHRvclBvb2wgKnBvb2wsIFZrRGVzY3JpcHRvclNldCBzZXQpIDogTm9uRGlzcEhhbmRsZShkZXYuaGFuZGxlKCksIHNldCkgeworICAgICAgICBjb250YWluaW5nX3Bvb2xfID0gcG9vbDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBEZXNjcmlwdG9yUG9vbCAqY29udGFpbmluZ19wb29sXzsKK307CisKK2NsYXNzIENvbW1hbmRQb29sIDogcHVibGljIGludGVybmFsOjpOb25EaXNwSGFuZGxlPFZrQ29tbWFuZFBvb2w+IHsKKyAgcHVibGljOgorICAgIH5Db21tYW5kUG9vbCgpIE5PRVhDRVBUOworCisgICAgZXhwbGljaXQgQ29tbWFuZFBvb2woKSA6IE5vbkRpc3BIYW5kbGUoKSB7fQorICAgIGV4cGxpY2l0IENvbW1hbmRQb29sKGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyAmaW5mbykgeyBpbml0KGRldiwgaW5mbyk7IH0KKworICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gJmluZm8pOworCisgICAgc3RhdGljIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIGNyZWF0ZV9pbmZvKHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleCwgVmtDb21tYW5kUG9vbENyZWF0ZUZsYWdzIGZsYWdzKTsKK307CisKK2lubGluZSBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBDb21tYW5kUG9vbDo6Y3JlYXRlX2luZm8odWludDMyX3QgcXVldWVfZmFtaWx5X2luZGV4LCBWa0NvbW1hbmRQb29sQ3JlYXRlRmxhZ3MgZmxhZ3MpIHsKKyAgICBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBpbmZvID0ge307CisgICAgaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfUE9PTF9DUkVBVEVfSU5GTzsKKyAgICBpbmZvLnF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZV9mYW1pbHlfaW5kZXg7CisgICAgaW5mby5mbGFncyA9IGZsYWdzOworICAgIHJldHVybiBpbmZvOworfQorCitjbGFzcyBDb21tYW5kQnVmZmVyIDogcHVibGljIGludGVybmFsOjpIYW5kbGU8VmtDb21tYW5kQnVmZmVyPiB7CisgIHB1YmxpYzoKKyAgICB+Q29tbWFuZEJ1ZmZlcigpIE5PRVhDRVBUOworCisgICAgZXhwbGljaXQgQ29tbWFuZEJ1ZmZlcigpIDogSGFuZGxlKCkge30KKyAgICBleHBsaWNpdCBDb21tYW5kQnVmZmVyKGNvbnN0IERldmljZSAmZGV2LCBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gJmluZm8pIHsgaW5pdChkZXYsIGluZm8pOyB9CisKKyAgICAvLyB2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoKQorICAgIHZvaWQgaW5pdChjb25zdCBEZXZpY2UgJmRldiwgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICZpbmZvKTsKKworICAgIC8vIHZrQmVnaW5Db21tYW5kQnVmZmVyKCkKKyAgICB2b2lkIGJlZ2luKGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAqaW5mbyk7CisgICAgdm9pZCBiZWdpbigpOworCisgICAgLy8gdmtFbmRDb21tYW5kQnVmZmVyKCkKKyAgICAvLyB2a1Jlc2V0Q29tbWFuZEJ1ZmZlcigpCisgICAgdm9pZCBlbmQoKTsKKyAgICB2b2lkIHJlc2V0KFZrQ29tbWFuZEJ1ZmZlclJlc2V0RmxhZ3MgZmxhZ3MpOworICAgIHZvaWQgcmVzZXQoKSB7IHJlc2V0KFZLX0NPTU1BTkRfQlVGRkVSX1JFU0VUX1JFTEVBU0VfUkVTT1VSQ0VTX0JJVCk7IH0KKworICAgIHN0YXRpYyBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY3JlYXRlX2luZm8oVmtDb21tYW5kUG9vbCBjb25zdCAmcG9vbCk7CisKKyAgcHJpdmF0ZToKKyAgICBWa0RldmljZSBkZXZfaGFuZGxlXzsKKyAgICBWa0NvbW1hbmRQb29sIGNtZF9wb29sXzsKK307CisKK2lubGluZSBWa01lbW9yeUFsbG9jYXRlSW5mbyBEZXZpY2VNZW1vcnk6OmFsbG9jX2luZm8oVmtEZXZpY2VTaXplIHNpemUsIHVpbnQzMl90IG1lbW9yeV90eXBlX2luZGV4KSB7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gaW5mbyA9IHt9OworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICBpbmZvLmFsbG9jYXRpb25TaXplID0gc2l6ZTsKKyAgICBpbmZvLm1lbW9yeVR5cGVJbmRleCA9IG1lbW9yeV90eXBlX2luZGV4OworICAgIHJldHVybiBpbmZvOworfQorCitpbmxpbmUgVmtCdWZmZXJDcmVhdGVJbmZvIEJ1ZmZlcjo6Y3JlYXRlX2luZm8oVmtEZXZpY2VTaXplIHNpemUsIFZrRmxhZ3MgdXNhZ2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqcXVldWVfZmFtaWxpZXMpIHsKKyAgICBWa0J1ZmZlckNyZWF0ZUluZm8gaW5mbyA9IHt9OworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk87CisgICAgaW5mby5zaXplID0gc2l6ZTsKKyAgICBpbmZvLnVzYWdlID0gdXNhZ2U7CisKKyAgICBpZiAocXVldWVfZmFtaWxpZXMgJiYgcXVldWVfZmFtaWxpZXMtPnNpemUoKSA+IDEpIHsKKyAgICAgICAgaW5mby5zaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UOworICAgICAgICBpbmZvLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihxdWV1ZV9mYW1pbGllcy0+c2l6ZSgpKTsKKyAgICAgICAgaW5mby5wUXVldWVGYW1pbHlJbmRpY2VzID0gcXVldWVfZmFtaWxpZXMtPmRhdGEoKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW5mbzsKK30KKworaW5saW5lIFZrRmVuY2VDcmVhdGVJbmZvIEZlbmNlOjpjcmVhdGVfaW5mbyhWa0ZlbmNlQ3JlYXRlRmxhZ3MgZmxhZ3MpIHsKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBpbmZvID0ge307CisgICAgaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPOworICAgIGluZm8uZmxhZ3MgPSBmbGFnczsKKyAgICByZXR1cm4gaW5mbzsKK30KKworaW5saW5lIFZrRmVuY2VDcmVhdGVJbmZvIEZlbmNlOjpjcmVhdGVfaW5mbygpIHsKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBpbmZvID0ge307CisgICAgaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPOworICAgIHJldHVybiBpbmZvOworfQorCitpbmxpbmUgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIFNlbWFwaG9yZTo6Y3JlYXRlX2luZm8oVmtGbGFncyBmbGFncykgeworICAgIFZrU2VtYXBob3JlQ3JlYXRlSW5mbyBpbmZvID0ge307CisgICAgaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTzsKKyAgICBpbmZvLmZsYWdzID0gZmxhZ3M7CisgICAgcmV0dXJuIGluZm87Cit9CisKK2lubGluZSBWa0V2ZW50Q3JlYXRlSW5mbyBFdmVudDo6Y3JlYXRlX2luZm8oVmtGbGFncyBmbGFncykgeworICAgIFZrRXZlbnRDcmVhdGVJbmZvIGluZm8gPSB7fTsKKyAgICBpbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVZFTlRfQ1JFQVRFX0lORk87CisgICAgaW5mby5mbGFncyA9IGZsYWdzOworICAgIHJldHVybiBpbmZvOworfQorCitpbmxpbmUgVmtRdWVyeVBvb2xDcmVhdGVJbmZvIFF1ZXJ5UG9vbDo6Y3JlYXRlX2luZm8oVmtRdWVyeVR5cGUgdHlwZSwgdWludDMyX3Qgc2xvdF9jb3VudCkgeworICAgIFZrUXVlcnlQb29sQ3JlYXRlSW5mbyBpbmZvID0ge307CisgICAgaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk87CisgICAgaW5mby5xdWVyeVR5cGUgPSB0eXBlOworICAgIGluZm8ucXVlcnlDb3VudCA9IHNsb3RfY291bnQ7CisgICAgcmV0dXJuIGluZm87Cit9CisKK2lubGluZSBWa0ltYWdlQ3JlYXRlSW5mbyBJbWFnZTo6Y3JlYXRlX2luZm8oKSB7CisgICAgVmtJbWFnZUNyZWF0ZUluZm8gaW5mbyA9IHt9OworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTzsKKyAgICBpbmZvLmV4dGVudC53aWR0aCA9IDE7CisgICAgaW5mby5leHRlbnQuaGVpZ2h0ID0gMTsKKyAgICBpbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW5mby5taXBMZXZlbHMgPSAxOworICAgIGluZm8uYXJyYXlMYXllcnMgPSAxOworICAgIGluZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICByZXR1cm4gaW5mbzsKK30KKworaW5saW5lIFZrSW1hZ2VTdWJyZXNvdXJjZSBJbWFnZTo6c3VicmVzb3VyY2UoVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdCwgdWludDMyX3QgbWlwX2xldmVsLCB1aW50MzJfdCBhcnJheV9sYXllcikgeworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZSBzdWJyZXMgPSB7fTsKKyAgICBpZiAoYXNwZWN0ID09IDApIHsKKyAgICAgICAgYXNzZXJ0KCEiSW52YWxpZCBWa0ltYWdlQXNwZWN0RmxhZ3MiKTsKKyAgICB9CisgICAgc3VicmVzLmFzcGVjdE1hc2sgPSBhc3BlY3Q7CisgICAgc3VicmVzLm1pcExldmVsID0gbWlwX2xldmVsOworICAgIHN1YnJlcy5hcnJheUxheWVyID0gYXJyYXlfbGF5ZXI7CisgICAgcmV0dXJuIHN1YnJlczsKK30KKworaW5saW5lIFZrSW1hZ2VTdWJyZXNvdXJjZSBJbWFnZTo6c3VicmVzb3VyY2UoY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgJnJhbmdlLCB1aW50MzJfdCBtaXBfbGV2ZWwsIHVpbnQzMl90IGFycmF5X2xheWVyKSB7CisgICAgcmV0dXJuIHN1YnJlc291cmNlKHJhbmdlLmFzcGVjdE1hc2ssIHJhbmdlLmJhc2VNaXBMZXZlbCArIG1pcF9sZXZlbCwgcmFuZ2UuYmFzZUFycmF5TGF5ZXIgKyBhcnJheV9sYXllcik7Cit9CisKK2lubGluZSBWa0ltYWdlU3VicmVzb3VyY2VMYXllcnMgSW1hZ2U6OnN1YnJlc291cmNlKFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3QsIHVpbnQzMl90IG1pcF9sZXZlbCwgdWludDMyX3QgYXJyYXlfbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcnJheV9zaXplKSB7CisgICAgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzIHN1YnJlcyA9IHt9OworICAgIHN3aXRjaCAoYXNwZWN0KSB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDoKKyAgICAgICAgY2FzZSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOgorICAgICAgICBjYXNlIFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDoKKyAgICAgICAgY2FzZSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUOgorICAgICAgICAgICAgLyogdmFsaWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KCEiSW52YWxpZCBWa0ltYWdlQXNwZWN0RmxhZ3MiKTsKKyAgICB9CisgICAgc3VicmVzLmFzcGVjdE1hc2sgPSBhc3BlY3Q7CisgICAgc3VicmVzLm1pcExldmVsID0gbWlwX2xldmVsOworICAgIHN1YnJlcy5iYXNlQXJyYXlMYXllciA9IGFycmF5X2xheWVyOworICAgIHN1YnJlcy5sYXllckNvdW50ID0gYXJyYXlfc2l6ZTsKKyAgICByZXR1cm4gc3VicmVzOworfQorCitpbmxpbmUgVmtJbWFnZVN1YnJlc291cmNlTGF5ZXJzIEltYWdlOjpzdWJyZXNvdXJjZShjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAmcmFuZ2UsIHVpbnQzMl90IG1pcF9sZXZlbCwgdWludDMyX3QgYXJyYXlfbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcnJheV9zaXplKSB7CisgICAgcmV0dXJuIHN1YnJlc291cmNlKHJhbmdlLmFzcGVjdE1hc2ssIHJhbmdlLmJhc2VNaXBMZXZlbCArIG1pcF9sZXZlbCwgcmFuZ2UuYmFzZUFycmF5TGF5ZXIgKyBhcnJheV9sYXllciwgYXJyYXlfc2l6ZSk7Cit9CisKK2lubGluZSBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBJbWFnZTo6c3VicmVzb3VyY2VfcmFuZ2UoVmtJbWFnZUFzcGVjdEZsYWdzIGFzcGVjdF9tYXNrLCB1aW50MzJfdCBiYXNlX21pcF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWlwX2xldmVscywgdWludDMyX3QgYmFzZV9hcnJheV9sYXllciwgdWludDMyX3QgbnVtX2xheWVycykgeworICAgIFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlIHJhbmdlID0ge307CisgICAgaWYgKGFzcGVjdF9tYXNrID09IDApIHsKKyAgICAgICAgYXNzZXJ0KCEiSW52YWxpZCBWa0ltYWdlQXNwZWN0RmxhZ3MiKTsKKyAgICB9CisgICAgcmFuZ2UuYXNwZWN0TWFzayA9IGFzcGVjdF9tYXNrOworICAgIHJhbmdlLmJhc2VNaXBMZXZlbCA9IGJhc2VfbWlwX2xldmVsOworICAgIHJhbmdlLmxldmVsQ291bnQgPSBtaXBfbGV2ZWxzOworICAgIHJhbmdlLmJhc2VBcnJheUxheWVyID0gYmFzZV9hcnJheV9sYXllcjsKKyAgICByYW5nZS5sYXllckNvdW50ID0gbnVtX2xheWVyczsKKyAgICByZXR1cm4gcmFuZ2U7Cit9CisKK2lubGluZSBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBJbWFnZTo6c3VicmVzb3VyY2VfcmFuZ2UoY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gJmluZm8sIFZrSW1hZ2VBc3BlY3RGbGFncyBhc3BlY3RfbWFzaykgeworICAgIHJldHVybiBzdWJyZXNvdXJjZV9yYW5nZShhc3BlY3RfbWFzaywgMCwgaW5mby5taXBMZXZlbHMsIDAsIGluZm8uYXJyYXlMYXllcnMpOworfQorCitpbmxpbmUgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgSW1hZ2U6OnN1YnJlc291cmNlX3JhbmdlKGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSAmc3VicmVzKSB7CisgICAgcmV0dXJuIHN1YnJlc291cmNlX3JhbmdlKHN1YnJlcy5hc3BlY3RNYXNrLCBzdWJyZXMubWlwTGV2ZWwsIDEsIHN1YnJlcy5hcnJheUxheWVyLCAxKTsKK30KKworaW5saW5lIFZrRXh0ZW50MkQgSW1hZ2U6OmV4dGVudChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIFZrRXh0ZW50MkQgZXh0ZW50ID0ge307CisgICAgZXh0ZW50LndpZHRoID0gd2lkdGg7CisgICAgZXh0ZW50LmhlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4gZXh0ZW50OworfQorCitpbmxpbmUgVmtFeHRlbnQyRCBJbWFnZTo6ZXh0ZW50KGNvbnN0IFZrRXh0ZW50MkQgJmV4dGVudCwgdWludDMyX3QgbWlwX2xldmVsKSB7CisgICAgY29uc3QgaW50MzJfdCB3aWR0aCA9IChleHRlbnQud2lkdGggPj4gbWlwX2xldmVsKSA/IGV4dGVudC53aWR0aCA+PiBtaXBfbGV2ZWwgOiAxOworICAgIGNvbnN0IGludDMyX3QgaGVpZ2h0ID0gKGV4dGVudC5oZWlnaHQgPj4gbWlwX2xldmVsKSA/IGV4dGVudC5oZWlnaHQgPj4gbWlwX2xldmVsIDogMTsKKyAgICByZXR1cm4gSW1hZ2U6OmV4dGVudCh3aWR0aCwgaGVpZ2h0KTsKK30KKworaW5saW5lIFZrRXh0ZW50MkQgSW1hZ2U6OmV4dGVudChjb25zdCBWa0V4dGVudDNEICZleHRlbnQpIHsgcmV0dXJuIEltYWdlOjpleHRlbnQoZXh0ZW50LndpZHRoLCBleHRlbnQuaGVpZ2h0KTsgfQorCitpbmxpbmUgVmtFeHRlbnQzRCBJbWFnZTo6ZXh0ZW50KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGRlcHRoKSB7CisgICAgVmtFeHRlbnQzRCBleHRlbnQgPSB7fTsKKyAgICBleHRlbnQud2lkdGggPSB3aWR0aDsKKyAgICBleHRlbnQuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGV4dGVudC5kZXB0aCA9IGRlcHRoOworICAgIHJldHVybiBleHRlbnQ7Cit9CisKK2lubGluZSBWa0V4dGVudDNEIEltYWdlOjpleHRlbnQoY29uc3QgVmtFeHRlbnQzRCAmZXh0ZW50LCB1aW50MzJfdCBtaXBfbGV2ZWwpIHsKKyAgICBjb25zdCBpbnQzMl90IHdpZHRoID0gKGV4dGVudC53aWR0aCA+PiBtaXBfbGV2ZWwpID8gZXh0ZW50LndpZHRoID4+IG1pcF9sZXZlbCA6IDE7CisgICAgY29uc3QgaW50MzJfdCBoZWlnaHQgPSAoZXh0ZW50LmhlaWdodCA+PiBtaXBfbGV2ZWwpID8gZXh0ZW50LmhlaWdodCA+PiBtaXBfbGV2ZWwgOiAxOworICAgIGNvbnN0IGludDMyX3QgZGVwdGggPSAoZXh0ZW50LmRlcHRoID4+IG1pcF9sZXZlbCkgPyBleHRlbnQuZGVwdGggPj4gbWlwX2xldmVsIDogMTsKKyAgICByZXR1cm4gSW1hZ2U6OmV4dGVudCh3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7Cit9CisKK2lubGluZSBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gU2hhZGVyTW9kdWxlOjpjcmVhdGVfaW5mbyhzaXplX3QgY29kZV9zaXplLCBjb25zdCB1aW50MzJfdCAqY29kZSwgVmtGbGFncyBmbGFncykgeworICAgIFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBpbmZvID0ge307CisgICAgaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfQ1JFQVRFX0lORk87CisgICAgaW5mby5jb2RlU2l6ZSA9IGNvZGVfc2l6ZTsKKyAgICBpbmZvLnBDb2RlID0gY29kZTsKKyAgICBpbmZvLmZsYWdzID0gZmxhZ3M7CisgICAgcmV0dXJuIGluZm87Cit9CisKK2lubGluZSBWa1dyaXRlRGVzY3JpcHRvclNldCBEZXZpY2U6OndyaXRlX2Rlc2NyaXB0b3Jfc2V0KGNvbnN0IERlc2NyaXB0b3JTZXQgJnNldCwgdWludDMyX3QgYmluZGluZywgdWludDMyX3QgYXJyYXlfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclR5cGUgdHlwZSwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gKmltYWdlX2luZm8pIHsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCB3cml0ZSA9IHt9OworICAgIHdyaXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgd3JpdGUuZHN0U2V0ID0gc2V0LmhhbmRsZSgpOworICAgIHdyaXRlLmRzdEJpbmRpbmcgPSBiaW5kaW5nOworICAgIHdyaXRlLmRzdEFycmF5RWxlbWVudCA9IGFycmF5X2VsZW1lbnQ7CisgICAgd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gY291bnQ7CisgICAgd3JpdGUuZGVzY3JpcHRvclR5cGUgPSB0eXBlOworICAgIHdyaXRlLnBJbWFnZUluZm8gPSBpbWFnZV9pbmZvOworICAgIHJldHVybiB3cml0ZTsKK30KKworaW5saW5lIFZrV3JpdGVEZXNjcmlwdG9yU2V0IERldmljZTo6d3JpdGVfZGVzY3JpcHRvcl9zZXQoY29uc3QgRGVzY3JpcHRvclNldCAmc2V0LCB1aW50MzJfdCBiaW5kaW5nLCB1aW50MzJfdCBhcnJheV9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvckJ1ZmZlckluZm8gKmJ1ZmZlcl9pbmZvKSB7CisgICAgVmtXcml0ZURlc2NyaXB0b3JTZXQgd3JpdGUgPSB7fTsKKyAgICB3cml0ZS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1dSSVRFX0RFU0NSSVBUT1JfU0VUOworICAgIHdyaXRlLmRzdFNldCA9IHNldC5oYW5kbGUoKTsKKyAgICB3cml0ZS5kc3RCaW5kaW5nID0gYmluZGluZzsKKyAgICB3cml0ZS5kc3RBcnJheUVsZW1lbnQgPSBhcnJheV9lbGVtZW50OworICAgIHdyaXRlLmRlc2NyaXB0b3JDb3VudCA9IGNvdW50OworICAgIHdyaXRlLmRlc2NyaXB0b3JUeXBlID0gdHlwZTsKKyAgICB3cml0ZS5wQnVmZmVySW5mbyA9IGJ1ZmZlcl9pbmZvOworICAgIHJldHVybiB3cml0ZTsKK30KKworaW5saW5lIFZrV3JpdGVEZXNjcmlwdG9yU2V0IERldmljZTo6d3JpdGVfZGVzY3JpcHRvcl9zZXQoY29uc3QgRGVzY3JpcHRvclNldCAmc2V0LCB1aW50MzJfdCBiaW5kaW5nLCB1aW50MzJfdCBhcnJheV9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtCdWZmZXJWaWV3ICpidWZmZXJfdmlld3MpIHsKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCB3cml0ZSA9IHt9OworICAgIHdyaXRlLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQ7CisgICAgd3JpdGUuZHN0U2V0ID0gc2V0LmhhbmRsZSgpOworICAgIHdyaXRlLmRzdEJpbmRpbmcgPSBiaW5kaW5nOworICAgIHdyaXRlLmRzdEFycmF5RWxlbWVudCA9IGFycmF5X2VsZW1lbnQ7CisgICAgd3JpdGUuZGVzY3JpcHRvckNvdW50ID0gY291bnQ7CisgICAgd3JpdGUuZGVzY3JpcHRvclR5cGUgPSB0eXBlOworICAgIHdyaXRlLnBUZXhlbEJ1ZmZlclZpZXcgPSBidWZmZXJfdmlld3M7CisgICAgcmV0dXJuIHdyaXRlOworfQorCitpbmxpbmUgVmtXcml0ZURlc2NyaXB0b3JTZXQgRGV2aWNlOjp3cml0ZV9kZXNjcmlwdG9yX3NldChjb25zdCBEZXNjcmlwdG9yU2V0ICZzZXQsIHVpbnQzMl90IGJpbmRpbmcsIHVpbnQzMl90IGFycmF5X2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxWa0Rlc2NyaXB0b3JJbWFnZUluZm8+ICZpbWFnZV9pbmZvKSB7CisgICAgcmV0dXJuIHdyaXRlX2Rlc2NyaXB0b3Jfc2V0KHNldCwgYmluZGluZywgYXJyYXlfZWxlbWVudCwgdHlwZSwgaW1hZ2VfaW5mby5zaXplKCksICZpbWFnZV9pbmZvWzBdKTsKK30KKworaW5saW5lIFZrV3JpdGVEZXNjcmlwdG9yU2V0IERldmljZTo6d3JpdGVfZGVzY3JpcHRvcl9zZXQoY29uc3QgRGVzY3JpcHRvclNldCAmc2V0LCB1aW50MzJfdCBiaW5kaW5nLCB1aW50MzJfdCBhcnJheV9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtEZXNjcmlwdG9yQnVmZmVySW5mbz4gJmJ1ZmZlcl9pbmZvKSB7CisgICAgcmV0dXJuIHdyaXRlX2Rlc2NyaXB0b3Jfc2V0KHNldCwgYmluZGluZywgYXJyYXlfZWxlbWVudCwgdHlwZSwgYnVmZmVyX2luZm8uc2l6ZSgpLCAmYnVmZmVyX2luZm9bMF0pOworfQorCitpbmxpbmUgVmtXcml0ZURlc2NyaXB0b3JTZXQgRGV2aWNlOjp3cml0ZV9kZXNjcmlwdG9yX3NldChjb25zdCBEZXNjcmlwdG9yU2V0ICZzZXQsIHVpbnQzMl90IGJpbmRpbmcsIHVpbnQzMl90IGFycmF5X2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPFZrQnVmZmVyVmlldz4gJmJ1ZmZlcl92aWV3cykgeworICAgIHJldHVybiB3cml0ZV9kZXNjcmlwdG9yX3NldChzZXQsIGJpbmRpbmcsIGFycmF5X2VsZW1lbnQsIHR5cGUsIGJ1ZmZlcl92aWV3cy5zaXplKCksICZidWZmZXJfdmlld3NbMF0pOworfQorCitpbmxpbmUgVmtDb3B5RGVzY3JpcHRvclNldCBEZXZpY2U6OmNvcHlfZGVzY3JpcHRvcl9zZXQoY29uc3QgRGVzY3JpcHRvclNldCAmc3JjX3NldCwgdWludDMyX3Qgc3JjX2JpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX2FycmF5X2VsZW1lbnQsIGNvbnN0IERlc2NyaXB0b3JTZXQgJmRzdF9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0X2JpbmRpbmcsIHVpbnQzMl90IGRzdF9hcnJheV9lbGVtZW50LCB1aW50MzJfdCBjb3VudCkgeworICAgIFZrQ29weURlc2NyaXB0b3JTZXQgY29weSA9IHt9OworICAgIGNvcHkuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT1BZX0RFU0NSSVBUT1JfU0VUOworICAgIGNvcHkuc3JjU2V0ID0gc3JjX3NldC5oYW5kbGUoKTsKKyAgICBjb3B5LnNyY0JpbmRpbmcgPSBzcmNfYmluZGluZzsKKyAgICBjb3B5LnNyY0FycmF5RWxlbWVudCA9IHNyY19hcnJheV9lbGVtZW50OworICAgIGNvcHkuZHN0U2V0ID0gZHN0X3NldC5oYW5kbGUoKTsKKyAgICBjb3B5LmRzdEJpbmRpbmcgPSBkc3RfYmluZGluZzsKKyAgICBjb3B5LmRzdEFycmF5RWxlbWVudCA9IGRzdF9hcnJheV9lbGVtZW50OworICAgIGNvcHkuZGVzY3JpcHRvckNvdW50ID0gY291bnQ7CisKKyAgICByZXR1cm4gY29weTsKK30KKworaW5saW5lIFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBDb21tYW5kQnVmZmVyOjpjcmVhdGVfaW5mbyhWa0NvbW1hbmRQb29sIGNvbnN0ICZwb29sKSB7CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGluZm8gPSB7fTsKKyAgICBpbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTzsKKyAgICBpbmZvLmNvbW1hbmRQb29sID0gcG9vbDsKKyAgICBpbmZvLmNvbW1hbmRCdWZmZXJDb3VudCA9IDE7CisgICAgcmV0dXJuIGluZm87Cit9CisKK30gIC8vIG5hbWVzcGFjZSB2a190ZXN0aW5nCisKKyNlbmRpZiAgLy8gVktURVNUQklORElOR19ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a3Rlc3RmcmFtZXdvcmsuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjBkOGUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrLmNwcApAQCAtMCwwICsxLDg2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICovCisKKyNpbmNsdWRlICJ2a3Rlc3RmcmFtZXdvcmsuaCIKKyNpbmNsdWRlICJ2a3JlbmRlcmZyYW1ld29yay5oIgorCisvLyBGb3IgdmVyc2lvbnMgcHJpb3IgdG8gVlMgMjAxNSwgc3VwcHJlc3MgdGhlIHdhcm5pbmcKKy8vIGNhdXNlZCBieSB0aGUgaW5jb25zaXN0ZW50IHJlZGVmaW5pdGlvbiBvZiBzbnByaW50ZgorLy8gYmV0d2VlbiBhIHZ1bGthbiBoZWFkZXIgYW5kIGEgZ2xzbGFuZyBoZWFkZXIuCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMCAvKnZzMjAxNSovKQorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQwMDUpCisjZW5kaWYKKy8vIFRPRE8gRklYTUUgcmVtb3ZlIHRoaXMgb25jZSBnbHNsYW5nIGRvZXNuJ3QgZGVmaW5lIHRoaXMKKyN1bmRlZiBCYWRWYWx1ZQorI2luY2x1ZGUgIlNQSVJWL0dsc2xhbmdUb1Nwdi5oIgorI2luY2x1ZGUgIlNQSVJWL1NQVlJlbWFwcGVyLmgiCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMCAvKnZzMjAxNSovKQorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGNtYXRoPgorCisjaWYgZGVmaW5lZChQQVRIX01BWCkgJiYgIWRlZmluZWQoTUFYX1BBVEgpCisjZGVmaW5lIE1BWF9QQVRIIFBBVEhfTUFYCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBFUlJfRVhJVChlcnJfbXNnLCBlcnJfY2xhc3MpICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWVzc2FnZUJveChOVUxMLCBlcnJfbXNnLCBlcnJfY2xhc3MsIE1CX09LKTsgXAorICAgICAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNlbHNlICAvLyBfV0lOMzIKKworI2RlZmluZSBFUlJfRVhJVChlcnJfbXNnLCBlcnJfY2xhc3MpIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ZihlcnJfbXNnKTsgICAgICAgICAgICAgXAorICAgICAgICBmZmx1c2goc3Rkb3V0KTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNlbmRpZiAgLy8gX1dJTjMyCisKKy8vIENvbW1hbmQtbGluZSBvcHRpb25zCitlbnVtIFRPcHRpb25zIHsKKyAgICBFT3B0aW9uTm9uZSA9IDB4MDAwLAorICAgIEVPcHRpb25JbnRlcm1lZGlhdGUgPSAweDAwMSwKKyAgICBFT3B0aW9uU3VwcHJlc3NJbmZvbG9nID0gMHgwMDIsCisgICAgRU9wdGlvbk1lbW9yeUxlYWtNb2RlID0gMHgwMDQsCisgICAgRU9wdGlvblJlbGF4ZWRFcnJvcnMgPSAweDAwOCwKKyAgICBFT3B0aW9uR2l2ZVdhcm5pbmdzID0gMHgwMTAsCisgICAgRU9wdGlvbkxpbmtQcm9ncmFtID0gMHgwMjAsCisgICAgRU9wdGlvbk11bHRpVGhyZWFkZWQgPSAweDA0MCwKKyAgICBFT3B0aW9uRHVtcENvbmZpZyA9IDB4MDgwLAorICAgIEVPcHRpb25EdW1wUmVmbGVjdGlvbiA9IDB4MTAwLAorICAgIEVPcHRpb25TdXBwcmVzc1dhcm5pbmdzID0gMHgyMDAsCisgICAgRU9wdGlvbkR1bXBWZXJzaW9ucyA9IDB4NDAwLAorICAgIEVPcHRpb25TcHYgPSAweDgwMCwKKyAgICBFT3B0aW9uRGVmYXVsdERlc2t0b3AgPSAweDEwMDAsCit9OworCitzdHJ1Y3QgU3dhcGNoYWluQnVmZmVycyB7CisgICAgVmtJbWFnZSBpbWFnZTsKKyAgICBWa0NvbW1hbmRCdWZmZXIgY21kOworICAgIFZrSW1hZ2VWaWV3IHZpZXc7Cit9OworCisjaWZuZGVmIF9XSU4zMgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworaW50IGZvcGVuX3MoRklMRSAqKnBGaWxlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgeworICAgIGlmICghcEZpbGUgfHwgIWZpbGVuYW1lIHx8ICFtb2RlKSB7CisgICAgICAgIHJldHVybiBFSU5WQUw7CisgICAgfQorCisgICAgRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgaWYgKGVycm5vICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJubzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBGaWxlID0gZjsKKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKKworLy8gU2V0IHVwIGVudmlyb25tZW50IGZvciBHTFNMIGNvbXBpbGVyCisvLyBNdXN0IGJlIGRvbmUgb25jZSBwZXIgcHJvY2Vzcwordm9pZCBUZXN0RW52aXJvbm1lbnQ6OlNldFVwKCkgeworICAgIC8vIEluaXRpYWxpemUgR0xTTCB0byBTUFYgY29tcGlsZXIgdXRpbGl0eQorICAgIGdsc2xhbmc6OkluaXRpYWxpemVQcm9jZXNzKCk7CisKKyAgICB2a190ZXN0aW5nOjpzZXRfZXJyb3JfY2FsbGJhY2sodGVzdF9lcnJvcl9jYWxsYmFjayk7CisKKyAgICB2azo6SW5pdERpc3BhdGNoVGFibGUoKTsKK30KKwordm9pZCBUZXN0RW52aXJvbm1lbnQ6OlRlYXJEb3duKCkgeyBnbHNsYW5nOjpGaW5hbGl6ZVByb2Nlc3MoKTsgfQorCitWa1Rlc3RGcmFtZXdvcms6OlZrVGVzdEZyYW1ld29yaygpIDogbV9jb21waWxlX29wdGlvbnMoMCksIG1fbnVtX3NoYWRlcl9zdHJpbmdzKDApIHt9CisKK1ZrVGVzdEZyYW1ld29yazo6flZrVGVzdEZyYW1ld29yaygpIHt9CisKKy8vIERlZmluZSBhbGwgdGhlIHN0YXRpYyBlbGVtZW50cworYm9vbCBWa1Rlc3RGcmFtZXdvcms6Om1fY2Fub25pY2FsaXplX3NwdiA9IGZhbHNlOworYm9vbCBWa1Rlc3RGcmFtZXdvcms6Om1fc3RyaXBfc3B2ID0gZmFsc2U7Citib29sIFZrVGVzdEZyYW1ld29yazo6bV9kb19ldmVyeXRoaW5nX3NwdiA9IGZhbHNlOworYm9vbCBWa1Rlc3RGcmFtZXdvcms6Om1fZGV2c2ltX2xheWVyID0gZmFsc2U7CitpbnQgVmtUZXN0RnJhbWV3b3JrOjptX3dpZHRoID0gMDsKK2ludCBWa1Rlc3RGcmFtZXdvcms6Om1faGVpZ2h0ID0gMDsKKworYm9vbCBWa1Rlc3RGcmFtZXdvcms6Om9wdGlvbk1hdGNoKGNvbnN0IGNoYXIgKm9wdGlvbiwgY2hhciAqb3B0aW9uTGluZSkgeworICAgIGlmIChzdHJuY21wKG9wdGlvbiwgb3B0aW9uTGluZSwgc3RybGVuKG9wdGlvbikpID09IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFZrVGVzdEZyYW1ld29yazo6SW5pdEFyZ3MoaW50ICphcmdjLCBjaGFyICphcmd2W10pIHsKKyAgICBpbnQgaSwgbjsKKworICAgIGZvciAoaSA9IDEsIG4gPSAxOyBpIDwgKmFyZ2M7IGkrKykgeworICAgICAgICBpZiAob3B0aW9uTWF0Y2goIi0tc3RyaXAtU1BWIiwgYXJndltpXSkpCisgICAgICAgICAgICBtX3N0cmlwX3NwdiA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKG9wdGlvbk1hdGNoKCItLWNhbm9uaWNhbGl6ZS1TUFYiLCBhcmd2W2ldKSkKKyAgICAgICAgICAgIG1fY2Fub25pY2FsaXplX3NwdiA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKG9wdGlvbk1hdGNoKCItLWRldnNpbSIsIGFyZ3ZbaV0pKQorICAgICAgICAgICAgbV9kZXZzaW1fbGF5ZXIgPSB0cnVlOworICAgICAgICBlbHNlIGlmIChvcHRpb25NYXRjaCgiLS1oZWxwIiwgYXJndltpXSkgfHwgb3B0aW9uTWF0Y2goIi1oIiwgYXJndltpXSkpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG5PdGhlciBvcHRpb25zOlxuIik7CisgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgIlx0LS1zaG93LWltYWdlc1xuIgorICAgICAgICAgICAgICAgICJcdFx0RGlzcGxheSB0ZXN0IGltYWdlcyBpbiB2aWV3ZXIgYWZ0ZXIgdGVzdHMgY29tcGxldGUuXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAiXHQtLXNhdmUtaW1hZ2VzXG4iCisgICAgICAgICAgICAgICAgIlx0XHRTYXZlIHRlc3RzIGltYWdlcyBhcyBwcG0gZmlsZXMgaW4gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiIKKyAgICAgICAgICAgICAgICAiXHRcdFVzZWQgdG8gZ2VuZXJhdGUgZ29sZGVuIGltYWdlcyBmb3IgY29tcGFyZS1pbWFnZXMuXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAiXHQtLWNvbXBhcmUtaW1hZ2VzXG4iCisgICAgICAgICAgICAgICAgIlx0XHRDb21wYXJlIHRlc3QgaW1hZ2VzIHRvICdnb2xkZW4nIGltYWdlIGluIGdvbGRlbiBmb2xkZXIuXG4iCisgICAgICAgICAgICAgICAgIlx0XHRBbHNvIHNhdmVzIHRoZSBnZW5lcmF0ZWQgdGVzdCBpbWFnZSBpbiBjdXJyZW50IHdvcmtpbmdcbiIKKyAgICAgICAgICAgICAgICAiXHRcdFx0ZGlyZWN0b3J5IGJ1dCBvbmx5IGlmIHRoZSBpbWFnZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZ29sZGVuXG4iCisgICAgICAgICAgICAgICAgIlx0XHRTZXR0aW5nIFJFTkRFUlRFU1RfR09MREVOX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gc3BlY2lmeVxuIgorICAgICAgICAgICAgICAgICJcdFx0XHRkaWZmZXJlbnQgZGlyZWN0b3J5IGZvciBnb2xkZW4gaW1hZ2VzXG4iCisgICAgICAgICAgICAgICAgIlx0XHRTaWduYWwgdGVzdCBmYWlsdXJlIGlmIGRpZmZlcmVudC5cbiIpOworICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICJcdC0tbm8tU1BWXG4iCisgICAgICAgICAgICAgICAgIlx0XHRVc2UgYnVpbHQtaW4gR0xTTCBjb21waWxlciByYXRoZXIgdGhhbiBTUFYgY29kZSBwYXRoLlxuIik7CisgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgIlx0LS1zdHJpcC1TUFZcbiIKKyAgICAgICAgICAgICAgICAiXHRcdFN0cmlwIFNQSVItViBkZWJ1ZyBpbmZvcm1hdGlvbiAobGluZSBudW1iZXJzLCBuYW1lcywgZXRjKS5cbiIpOworICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICJcdC0tY2Fub25pY2FsaXplLVNQVlxuIgorICAgICAgICAgICAgICAgICJcdFx0UmVtYXAgU1BJUi1WIGlkcyBiZWZvcmUgc3VibWlzc2lvbiB0byBhaWQgY29tcHJlc3Npb24uXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIlxuVW5yZWNvZ25pemVkIG9wdGlvbjogJXNcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgcHJpbnRmKCJcblVzZSAtLWhlbHAgb3IgLWggZm9yIG9wdGlvbiBsaXN0LlxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2luY2UgdGhlIGFib3ZlICJjb25zdW1lIiBpbnB1dHMsIHVwZGF0ZSBhcmd2CisgICAgICAgICAqIHNvIHRoYXQgaXQgY29udGFpbnMgdGhlIHRyaW1tZWQgbGlzdCBvZiBhcmdzIGZvciBnbHV0SW5pdAorICAgICAgICAgKi8KKworICAgICAgICBhcmd2W25dID0gYXJndltpXTsKKyAgICAgICAgbisrOworICAgIH0KK30KKworVmtGb3JtYXQgVmtUZXN0RnJhbWV3b3JrOjpHZXRGb3JtYXQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdmtfdGVzdGluZzo6RGV2aWNlICpkZXZpY2UpIHsKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgZm9ybWF0X3Byb3BzOworCisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhkZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sICZmb3JtYXRfcHJvcHMpOworICAgIGlmIChmb3JtYXRfcHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8fAorICAgICAgICBmb3JtYXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICB9CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhkZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sICZmb3JtYXRfcHJvcHMpOworICAgIGlmIChmb3JtYXRfcHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8fAorICAgICAgICBmb3JtYXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICB9CisgICAgcHJpbnRmKCJFcnJvciAtIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSBub3IgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNIC0gZXhpdGluZ1xuIik7CisgICAgZXhpdCgxKTsKK30KKwordm9pZCBWa1Rlc3RGcmFtZXdvcms6OkZpbmlzaCgpIHt9CisKKy8vCisvLyBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgcmVzb3VyY2VzIGZvciBUQnVpbHRJblJlc291cmNlcywgdXNlZCBmb3IgYm90aAorLy8gIC0gcGFyc2luZyB0aGlzIHN0cmluZyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgZGlkbid0IHN1cHBseSBvbmUKKy8vICAtIGR1bXBpbmcgb3V0IGEgdGVtcGxhdGUgZm9yIHVzZXIgY29uc3RydWN0aW9uIG9mIGEgY29uZmlnIGZpbGUKKy8vCitzdGF0aWMgY29uc3QgY2hhciAqRGVmYXVsdENvbmZpZyA9CisgICAgIk1heExpZ2h0cyAzMlxuIgorICAgICJNYXhDbGlwUGxhbmVzIDZcbiIKKyAgICAiTWF4VGV4dHVyZVVuaXRzIDMyXG4iCisgICAgIk1heFRleHR1cmVDb29yZHMgMzJcbiIKKyAgICAiTWF4VmVydGV4QXR0cmlicyA2NFxuIgorICAgICJNYXhWZXJ0ZXhVbmlmb3JtQ29tcG9uZW50cyA0MDk2XG4iCisgICAgIk1heFZhcnlpbmdGbG9hdHMgNjRcbiIKKyAgICAiTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgMzJcbiIKKyAgICAiTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA4MFxuIgorICAgICJNYXhUZXh0dXJlSW1hZ2VVbml0cyAzMlxuIgorICAgICJNYXhGcmFnbWVudFVuaWZvcm1Db21wb25lbnRzIDQwOTZcbiIKKyAgICAiTWF4RHJhd0J1ZmZlcnMgMzJcbiIKKyAgICAiTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgMTI4XG4iCisgICAgIk1heFZhcnlpbmdWZWN0b3JzIDhcbiIKKyAgICAiTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyAxNlxuIgorICAgICJNYXhWZXJ0ZXhPdXRwdXRWZWN0b3JzIDE2XG4iCisgICAgIk1heEZyYWdtZW50SW5wdXRWZWN0b3JzIDE1XG4iCisgICAgIk1pblByb2dyYW1UZXhlbE9mZnNldCAtOFxuIgorICAgICJNYXhQcm9ncmFtVGV4ZWxPZmZzZXQgN1xuIgorICAgICJNYXhDbGlwRGlzdGFuY2VzIDhcbiIKKyAgICAiTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WCA2NTUzNVxuIgorICAgICJNYXhDb21wdXRlV29ya0dyb3VwQ291bnRZIDY1NTM1XG4iCisgICAgIk1heENvbXB1dGVXb3JrR3JvdXBDb3VudFogNjU1MzVcbiIKKyAgICAiTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVYIDEwMjRcbiIKKyAgICAiTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVZIDEwMjRcbiIKKyAgICAiTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVaIDY0XG4iCisgICAgIk1heENvbXB1dGVVbmlmb3JtQ29tcG9uZW50cyAxMDI0XG4iCisgICAgIk1heENvbXB1dGVUZXh0dXJlSW1hZ2VVbml0cyAxNlxuIgorICAgICJNYXhDb21wdXRlSW1hZ2VVbmlmb3JtcyA4XG4iCisgICAgIk1heENvbXB1dGVBdG9taWNDb3VudGVycyA4XG4iCisgICAgIk1heENvbXB1dGVBdG9taWNDb3VudGVyQnVmZmVycyAxXG4iCisgICAgIk1heFZhcnlpbmdDb21wb25lbnRzIDYwXG4iCisgICAgIk1heFZlcnRleE91dHB1dENvbXBvbmVudHMgNjRcbiIKKyAgICAiTWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMgNjRcbiIKKyAgICAiTWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIDEyOFxuIgorICAgICJNYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyAxMjhcbiIKKyAgICAiTWF4SW1hZ2VVbml0cyA4XG4iCisgICAgIk1heENvbWJpbmVkSW1hZ2VVbml0c0FuZEZyYWdtZW50T3V0cHV0cyA4XG4iCisgICAgIk1heENvbWJpbmVkU2hhZGVyT3V0cHV0UmVzb3VyY2VzIDhcbiIKKyAgICAiTWF4SW1hZ2VTYW1wbGVzIDBcbiIKKyAgICAiTWF4VmVydGV4SW1hZ2VVbmlmb3JtcyAwXG4iCisgICAgIk1heFRlc3NDb250cm9sSW1hZ2VVbmlmb3JtcyAwXG4iCisgICAgIk1heFRlc3NFdmFsdWF0aW9uSW1hZ2VVbmlmb3JtcyAwXG4iCisgICAgIk1heEdlb21ldHJ5SW1hZ2VVbmlmb3JtcyAwXG4iCisgICAgIk1heEZyYWdtZW50SW1hZ2VVbmlmb3JtcyA4XG4iCisgICAgIk1heENvbWJpbmVkSW1hZ2VVbmlmb3JtcyA4XG4iCisgICAgIk1heEdlb21ldHJ5VGV4dHVyZUltYWdlVW5pdHMgMTZcbiIKKyAgICAiTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyAyNTZcbiIKKyAgICAiTWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHMgMTAyNFxuIgorICAgICJNYXhHZW9tZXRyeVVuaWZvcm1Db21wb25lbnRzIDEwMjRcbiIKKyAgICAiTWF4R2VvbWV0cnlWYXJ5aW5nQ29tcG9uZW50cyA2NFxuIgorICAgICJNYXhUZXNzQ29udHJvbElucHV0Q29tcG9uZW50cyAxMjhcbiIKKyAgICAiTWF4VGVzc0NvbnRyb2xPdXRwdXRDb21wb25lbnRzIDEyOFxuIgorICAgICJNYXhUZXNzQ29udHJvbFRleHR1cmVJbWFnZVVuaXRzIDE2XG4iCisgICAgIk1heFRlc3NDb250cm9sVW5pZm9ybUNvbXBvbmVudHMgMTAyNFxuIgorICAgICJNYXhUZXNzQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyA0MDk2XG4iCisgICAgIk1heFRlc3NFdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzIDEyOFxuIgorICAgICJNYXhUZXNzRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMgMTI4XG4iCisgICAgIk1heFRlc3NFdmFsdWF0aW9uVGV4dHVyZUltYWdlVW5pdHMgMTZcbiIKKyAgICAiTWF4VGVzc0V2YWx1YXRpb25Vbmlmb3JtQ29tcG9uZW50cyAxMDI0XG4iCisgICAgIk1heFRlc3NQYXRjaENvbXBvbmVudHMgMTIwXG4iCisgICAgIk1heFBhdGNoVmVydGljZXMgMzJcbiIKKyAgICAiTWF4VGVzc0dlbkxldmVsIDY0XG4iCisgICAgIk1heFZpZXdwb3J0cyAxNlxuIgorICAgICJNYXhWZXJ0ZXhBdG9taWNDb3VudGVycyAwXG4iCisgICAgIk1heFRlc3NDb250cm9sQXRvbWljQ291bnRlcnMgMFxuIgorICAgICJNYXhUZXNzRXZhbHVhdGlvbkF0b21pY0NvdW50ZXJzIDBcbiIKKyAgICAiTWF4R2VvbWV0cnlBdG9taWNDb3VudGVycyAwXG4iCisgICAgIk1heEZyYWdtZW50QXRvbWljQ291bnRlcnMgOFxuIgorICAgICJNYXhDb21iaW5lZEF0b21pY0NvdW50ZXJzIDhcbiIKKyAgICAiTWF4QXRvbWljQ291bnRlckJpbmRpbmdzIDFcbiIKKyAgICAiTWF4VmVydGV4QXRvbWljQ291bnRlckJ1ZmZlcnMgMFxuIgorICAgICJNYXhUZXNzQ29udHJvbEF0b21pY0NvdW50ZXJCdWZmZXJzIDBcbiIKKyAgICAiTWF4VGVzc0V2YWx1YXRpb25BdG9taWNDb3VudGVyQnVmZmVycyAwXG4iCisgICAgIk1heEdlb21ldHJ5QXRvbWljQ291bnRlckJ1ZmZlcnMgMFxuIgorICAgICJNYXhGcmFnbWVudEF0b21pY0NvdW50ZXJCdWZmZXJzIDFcbiIKKyAgICAiTWF4Q29tYmluZWRBdG9taWNDb3VudGVyQnVmZmVycyAxXG4iCisgICAgIk1heEF0b21pY0NvdW50ZXJCdWZmZXJTaXplIDE2Mzg0XG4iCisgICAgIk1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyA0XG4iCisgICAgIk1heFRyYW5zZm9ybUZlZWRiYWNrSW50ZXJsZWF2ZWRDb21wb25lbnRzIDY0XG4iCisgICAgIk1heEN1bGxEaXN0YW5jZXMgOFxuIgorICAgICJNYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzIDhcbiIKKyAgICAiTWF4U2FtcGxlcyA0XG4iCisgICAgIk1heE1lc2hPdXRwdXRWZXJ0aWNlc05WIDI1NlxuIgorICAgICJNYXhNZXNoT3V0cHV0UHJpbWl0aXZlc05WIDUxMlxuIgorICAgICJNYXhNZXNoV29ya0dyb3VwU2l6ZVhfTlYgMzJcbiIKKyAgICAiTWF4TWVzaFdvcmtHcm91cFNpemVZX05WIDFcbiIKKyAgICAiTWF4TWVzaFdvcmtHcm91cFNpemVaX05WIDFcbiIKKyAgICAiTWF4VGFza1dvcmtHcm91cFNpemVYX05WIDMyXG4iCisgICAgIk1heFRhc2tXb3JrR3JvdXBTaXplWV9OViAxXG4iCisgICAgIk1heFRhc2tXb3JrR3JvdXBTaXplWl9OViAxXG4iCisgICAgIk1heE1lc2hWaWV3Q291bnROViA0XG4iCisKKyAgICAibm9uSW5kdWN0aXZlRm9yTG9vcHMgMVxuIgorICAgICJ3aGlsZUxvb3BzIDFcbiIKKyAgICAiZG9XaGlsZUxvb3BzIDFcbiIKKyAgICAiZ2VuZXJhbFVuaWZvcm1JbmRleGluZyAxXG4iCisgICAgImdlbmVyYWxBdHRyaWJ1dGVNYXRyaXhWZWN0b3JJbmRleGluZyAxXG4iCisgICAgImdlbmVyYWxWYXJ5aW5nSW5kZXhpbmcgMVxuIgorICAgICJnZW5lcmFsU2FtcGxlckluZGV4aW5nIDFcbiIKKyAgICAiZ2VuZXJhbFZhcmlhYmxlSW5kZXhpbmcgMVxuIgorICAgICJnZW5lcmFsQ29uc3RhbnRNYXRyaXhWZWN0b3JJbmRleGluZyAxXG4iOworCisvLworLy8gKi5jb25mID0+IHRoaXMgaXMgYSBjb25maWcgZmlsZSB0aGF0IGNhbiBzZXQgbGltaXRzL3Jlc291cmNlcworLy8KK2Jvb2wgVmtUZXN0RnJhbWV3b3JrOjpTZXRDb25maWdGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CisgICAgaWYgKG5hbWUuc2l6ZSgpIDwgNSkgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG5hbWUuY29tcGFyZShuYW1lLnNpemUoKSAtIDUsIDUsICIuY29uZiIpID09IDApIHsKKyAgICAgICAgQ29uZmlnRmlsZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8KKy8vIFBhcnNlIGVpdGhlciBhIC5jb25mIGZpbGUgcHJvdmlkZWQgYnkgdGhlIHVzZXIgb3IgdGhlIGRlZmF1bHQgc3RyaW5nIGFib3ZlLgorLy8KK3ZvaWQgVmtUZXN0RnJhbWV3b3JrOjpQcm9jZXNzQ29uZmlnRmlsZShWa1BoeXNpY2FsRGV2aWNlTGltaXRzIGNvbnN0ICpjb25zdCBkZXZpY2VfbGltaXRzKSB7CisgICAgY2hhciAqKmNvbmZpZ1N0cmluZ3MgPSAwOworICAgIGNoYXIgKmNvbmZpZyA9IDA7CisgICAgYm9vbCBjb25maWdfZmlsZV9zcGVjaWZpZWQgPSBmYWxzZTsKKyAgICBpZiAoQ29uZmlnRmlsZS5zaXplKCkgPiAwKSB7CisgICAgICAgIGNvbmZpZ1N0cmluZ3MgPSBSZWFkRmlsZURhdGEoQ29uZmlnRmlsZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGNvbmZpZ1N0cmluZ3MpIHsKKyAgICAgICAgICAgIGNvbmZpZyA9ICpjb25maWdTdHJpbmdzOworICAgICAgICAgICAgY29uZmlnX2ZpbGVfc3BlY2lmaWVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3Igb3BlbmluZyBjb25maWd1cmF0aW9uIGZpbGU7IHdpbGwgaW5zdGVhZCB1c2UgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvblxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uZmlnID09IDApIHsKKyAgICAgICAgY29uZmlnID0gKGNoYXIgKilhbGxvY2Eoc3RybGVuKERlZmF1bHRDb25maWcpICsgMSk7CisgICAgICAgIHN0cmNweShjb25maWcsIERlZmF1bHRDb25maWcpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmRlbGltcyA9ICIgXHRcblxyIjsKKyAgICBjb25zdCBjaGFyICp0b2tlbiA9IHN0cnRvayhjb25maWcsIGRlbGltcyk7CisgICAgd2hpbGUgKHRva2VuKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlU3RyID0gc3RydG9rKDAsIGRlbGltcyk7CisgICAgICAgIGlmICh2YWx1ZVN0ciA9PSAwIHx8ICEodmFsdWVTdHJbMF0gPT0gJy0nIHx8ICh2YWx1ZVN0clswXSA+PSAnMCcgJiYgdmFsdWVTdHJbMF0gPD0gJzknKSkpIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3I6ICclcycgYmFkIC5jb25mIGZpbGUuICBFYWNoIG5hbWUgbXVzdCBiZSBmb2xsb3dlZCBieSBvbmUgbnVtYmVyLlxuIiwgdmFsdWVTdHIgPyB2YWx1ZVN0ciA6ICIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgdmFsdWUgPSBhdG9pKHZhbHVlU3RyKTsKKworICAgICAgICBpZiAoc3RyY21wKHRva2VuLCAiTWF4TGlnaHRzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhMaWdodHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4Q2xpcFBsYW5lcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q2xpcFBsYW5lcyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUZXh0dXJlVW5pdHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRleHR1cmVVbml0cyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUZXh0dXJlQ29vcmRzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUZXh0dXJlQ29vcmRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFZlcnRleEF0dHJpYnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFZlcnRleEF0dHJpYnMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VmVydGV4VW5pZm9ybUNvbXBvbmVudHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFZlcnRleFVuaWZvcm1Db21wb25lbnRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFZhcnlpbmdGbG9hdHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFZhcnlpbmdGbG9hdHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VGV4dHVyZUltYWdlVW5pdHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRleHR1cmVJbWFnZVVuaXRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEZyYWdtZW50VW5pZm9ybUNvbXBvbmVudHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heEZyYWdtZW50VW5pZm9ybUNvbXBvbmVudHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4RHJhd0J1ZmZlcnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heERyYXdCdWZmZXJzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFZlcnRleFVuaWZvcm1WZWN0b3JzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhWZXJ0ZXhVbmlmb3JtVmVjdG9ycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhWYXJ5aW5nVmVjdG9ycyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VmFyeWluZ1ZlY3RvcnMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhWZXJ0ZXhPdXRwdXRWZWN0b3JzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhWZXJ0ZXhPdXRwdXRWZWN0b3JzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEZyYWdtZW50SW5wdXRWZWN0b3JzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhGcmFnbWVudElucHV0VmVjdG9ycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNaW5Qcm9ncmFtVGV4ZWxPZmZzZXQiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1pblByb2dyYW1UZXhlbE9mZnNldCA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhQcm9ncmFtVGV4ZWxPZmZzZXQiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFByb2dyYW1UZXhlbE9mZnNldCA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhDbGlwRGlzdGFuY2VzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhDbGlwRGlzdGFuY2VzID0gKGNvbmZpZ19maWxlX3NwZWNpZmllZCA/IHZhbHVlIDogZGV2aWNlX2xpbWl0cy0+bWF4Q2xpcERpc3RhbmNlcyk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbXB1dGVXb3JrR3JvdXBDb3VudFgiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFggPSAoY29uZmlnX2ZpbGVfc3BlY2lmaWVkID8gdmFsdWUgOiBkZXZpY2VfbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMF0pOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhDb21wdXRlV29ya0dyb3VwQ291bnRZIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRZID0gKGNvbmZpZ19maWxlX3NwZWNpZmllZCA/IHZhbHVlIDogZGV2aWNlX2xpbWl0cy0+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzFdKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WiIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WiA9IChjb25maWdfZmlsZV9zcGVjaWZpZWQgPyB2YWx1ZSA6IGRldmljZV9saW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsyXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbXB1dGVXb3JrR3JvdXBTaXplWCIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q29tcHV0ZVdvcmtHcm91cFNpemVYID0gKGNvbmZpZ19maWxlX3NwZWNpZmllZCA/IHZhbHVlIDogZGV2aWNlX2xpbWl0cy0+bWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMF0pOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhDb21wdXRlV29ya0dyb3VwU2l6ZVkiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heENvbXB1dGVXb3JrR3JvdXBTaXplWSA9IChjb25maWdfZmlsZV9zcGVjaWZpZWQgPyB2YWx1ZSA6IGRldmljZV9saW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBTaXplWzFdKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVaIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVogPSAoY29uZmlnX2ZpbGVfc3BlY2lmaWVkID8gdmFsdWUgOiBkZXZpY2VfbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbXB1dGVVbmlmb3JtQ29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q29tcHV0ZVVuaWZvcm1Db21wb25lbnRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbXB1dGVUZXh0dXJlSW1hZ2VVbml0cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q29tcHV0ZVRleHR1cmVJbWFnZVVuaXRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbXB1dGVJbWFnZVVuaWZvcm1zIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhDb21wdXRlSW1hZ2VVbmlmb3JtcyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhDb21wdXRlQXRvbWljQ291bnRlcnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heENvbXB1dGVBdG9taWNDb3VudGVycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhDb21wdXRlQXRvbWljQ291bnRlckJ1ZmZlcnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heENvbXB1dGVBdG9taWNDb3VudGVyQnVmZmVycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhWYXJ5aW5nQ29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VmFyeWluZ0NvbXBvbmVudHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyA9IChjb25maWdfZmlsZV9zcGVjaWZpZWQgPyB2YWx1ZSA6IGRldmljZV9saW1pdHMtPm1heFZlcnRleE91dHB1dENvbXBvbmVudHMpOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMgPSAoY29uZmlnX2ZpbGVfc3BlY2lmaWVkID8gdmFsdWUgOiBkZXZpY2VfbGltaXRzLT5tYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzID0gKGNvbmZpZ19maWxlX3NwZWNpZmllZCA/IHZhbHVlIDogZGV2aWNlX2xpbWl0cy0+bWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzID0gKGNvbmZpZ19maWxlX3NwZWNpZmllZCA/IHZhbHVlIDogZGV2aWNlX2xpbWl0cy0+bWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMpOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhJbWFnZVVuaXRzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhJbWFnZVVuaXRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbWJpbmVkSW1hZ2VVbml0c0FuZEZyYWdtZW50T3V0cHV0cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q29tYmluZWRJbWFnZVVuaXRzQW5kRnJhZ21lbnRPdXRwdXRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbWJpbmVkU2hhZGVyT3V0cHV0UmVzb3VyY2VzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhDb21iaW5lZFNoYWRlck91dHB1dFJlc291cmNlcyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhJbWFnZVNhbXBsZXMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heEltYWdlU2FtcGxlcyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhWZXJ0ZXhJbWFnZVVuaWZvcm1zIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhWZXJ0ZXhJbWFnZVVuaWZvcm1zID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFRlc3NDb250cm9sSW1hZ2VVbmlmb3JtcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VGVzc0NvbnRyb2xJbWFnZVVuaWZvcm1zID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFRlc3NFdmFsdWF0aW9uSW1hZ2VVbmlmb3JtcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VGVzc0V2YWx1YXRpb25JbWFnZVVuaWZvcm1zID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEdlb21ldHJ5SW1hZ2VVbmlmb3JtcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4R2VvbWV0cnlJbWFnZVVuaWZvcm1zID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEZyYWdtZW50SW1hZ2VVbmlmb3JtcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4RnJhZ21lbnRJbWFnZVVuaWZvcm1zID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heENvbWJpbmVkSW1hZ2VVbmlmb3JtcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q29tYmluZWRJbWFnZVVuaWZvcm1zID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEdlb21ldHJ5VGV4dHVyZUltYWdlVW5pdHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heEdlb21ldHJ5VGV4dHVyZUltYWdlVW5pdHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyA9IChjb25maWdfZmlsZV9zcGVjaWZpZWQgPyB2YWx1ZSA6IGRldmljZV9saW1pdHMtPm1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMpOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHMgPQorICAgICAgICAgICAgICAgIChjb25maWdfZmlsZV9zcGVjaWZpZWQgPyB2YWx1ZSA6IGRldmljZV9saW1pdHMtPm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4R2VvbWV0cnlVbmlmb3JtQ29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4R2VvbWV0cnlVbmlmb3JtQ29tcG9uZW50cyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhHZW9tZXRyeVZhcnlpbmdDb21wb25lbnRzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhHZW9tZXRyeVZhcnlpbmdDb21wb25lbnRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFRlc3NDb250cm9sSW5wdXRDb21wb25lbnRzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUZXNzQ29udHJvbElucHV0Q29tcG9uZW50cyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUZXNzQ29udHJvbE91dHB1dENvbXBvbmVudHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRlc3NDb250cm9sT3V0cHV0Q29tcG9uZW50cyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUZXNzQ29udHJvbFRleHR1cmVJbWFnZVVuaXRzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUZXNzQ29udHJvbFRleHR1cmVJbWFnZVVuaXRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFRlc3NDb250cm9sVW5pZm9ybUNvbXBvbmVudHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRlc3NDb250cm9sVW5pZm9ybUNvbXBvbmVudHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VGVzc0NvbnRyb2xUb3RhbE91dHB1dENvbXBvbmVudHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRlc3NDb250cm9sVG90YWxPdXRwdXRDb21wb25lbnRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFRlc3NFdmFsdWF0aW9uSW5wdXRDb21wb25lbnRzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUZXNzRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUZXNzRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRlc3NFdmFsdWF0aW9uT3V0cHV0Q29tcG9uZW50cyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUZXNzRXZhbHVhdGlvblRleHR1cmVJbWFnZVVuaXRzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUZXNzRXZhbHVhdGlvblRleHR1cmVJbWFnZVVuaXRzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFRlc3NFdmFsdWF0aW9uVW5pZm9ybUNvbXBvbmVudHMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRlc3NFdmFsdWF0aW9uVW5pZm9ybUNvbXBvbmVudHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VGVzc1BhdGNoQ29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VGVzc1BhdGNoQ29tcG9uZW50cyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhQYXRjaFZlcnRpY2VzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhQYXRjaFZlcnRpY2VzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFRlc3NHZW5MZXZlbCIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VGVzc0dlbkxldmVsID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFZpZXdwb3J0cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Vmlld3BvcnRzID0gKGNvbmZpZ19maWxlX3NwZWNpZmllZCA/IHZhbHVlIDogZGV2aWNlX2xpbWl0cy0+bWF4Vmlld3BvcnRzKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VmVydGV4QXRvbWljQ291bnRlcnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFZlcnRleEF0b21pY0NvdW50ZXJzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFRlc3NDb250cm9sQXRvbWljQ291bnRlcnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRlc3NDb250cm9sQXRvbWljQ291bnRlcnMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VGVzc0V2YWx1YXRpb25BdG9taWNDb3VudGVycyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VGVzc0V2YWx1YXRpb25BdG9taWNDb3VudGVycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhHZW9tZXRyeUF0b21pY0NvdW50ZXJzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhHZW9tZXRyeUF0b21pY0NvdW50ZXJzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEZyYWdtZW50QXRvbWljQ291bnRlcnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heEZyYWdtZW50QXRvbWljQ291bnRlcnMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4Q29tYmluZWRBdG9taWNDb3VudGVycyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q29tYmluZWRBdG9taWNDb3VudGVycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhBdG9taWNDb3VudGVyQmluZGluZ3MiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heEF0b21pY0NvdW50ZXJCaW5kaW5ncyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhWZXJ0ZXhBdG9taWNDb3VudGVyQnVmZmVycyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VmVydGV4QXRvbWljQ291bnRlckJ1ZmZlcnMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VGVzc0NvbnRyb2xBdG9taWNDb3VudGVyQnVmZmVycyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VGVzc0NvbnRyb2xBdG9taWNDb3VudGVyQnVmZmVycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUZXNzRXZhbHVhdGlvbkF0b21pY0NvdW50ZXJCdWZmZXJzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUZXNzRXZhbHVhdGlvbkF0b21pY0NvdW50ZXJCdWZmZXJzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEdlb21ldHJ5QXRvbWljQ291bnRlckJ1ZmZlcnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heEdlb21ldHJ5QXRvbWljQ291bnRlckJ1ZmZlcnMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4RnJhZ21lbnRBdG9taWNDb3VudGVyQnVmZmVycyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4RnJhZ21lbnRBdG9taWNDb3VudGVyQnVmZmVycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhDb21iaW5lZEF0b21pY0NvdW50ZXJCdWZmZXJzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhDb21iaW5lZEF0b21pY0NvdW50ZXJCdWZmZXJzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heEF0b21pY0NvdW50ZXJCdWZmZXJTaXplIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhBdG9taWNDb3VudGVyQnVmZmVyU2l6ZSA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVycyA9IHZhbHVlOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhUcmFuc2Zvcm1GZWVkYmFja0ludGVybGVhdmVkQ29tcG9uZW50cyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4VHJhbnNmb3JtRmVlZGJhY2tJbnRlcmxlYXZlZENvbXBvbmVudHMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4Q3VsbERpc3RhbmNlcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubWF4Q3VsbERpc3RhbmNlcyA9IChjb25maWdfZmlsZV9zcGVjaWZpZWQgPyB2YWx1ZSA6IGRldmljZV9saW1pdHMtPm1heEN1bGxEaXN0YW5jZXMpOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJNYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhDb21iaW5lZENsaXBBbmRDdWxsRGlzdGFuY2VzID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heFNhbXBsZXMiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heFNhbXBsZXMgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4TWVzaE91dHB1dFZlcnRpY2VzTlYiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heE1lc2hPdXRwdXRWZXJ0aWNlc05WID0gdmFsdWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1heE1lc2hPdXRwdXRQcmltaXRpdmVzTlYiKSA9PSAwKQorICAgICAgICAgICAgUmVzb3VyY2VzLm1heE1lc2hPdXRwdXRQcmltaXRpdmVzTlYgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4TWVzaFdvcmtHcm91cFNpemVYX05WIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhNZXNoV29ya0dyb3VwU2l6ZVhfTlYgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4TWVzaFdvcmtHcm91cFNpemVZX05WIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhNZXNoV29ya0dyb3VwU2l6ZVlfTlYgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4TWVzaFdvcmtHcm91cFNpemVaX05WIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhNZXNoV29ya0dyb3VwU2l6ZVpfTlYgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VGFza1dvcmtHcm91cFNpemVYX05WIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUYXNrV29ya0dyb3VwU2l6ZVhfTlYgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VGFza1dvcmtHcm91cFNpemVZX05WIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUYXNrV29ya0dyb3VwU2l6ZVlfTlYgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4VGFza1dvcmtHcm91cFNpemVaX05WIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhUYXNrV29ya0dyb3VwU2l6ZVpfTlYgPSB2YWx1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiTWF4TWVzaFZpZXdDb3VudE5WIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5tYXhNZXNoVmlld0NvdW50TlYgPSB2YWx1ZTsKKworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJub25JbmR1Y3RpdmVGb3JMb29wcyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubGltaXRzLm5vbkluZHVjdGl2ZUZvckxvb3BzID0gKHZhbHVlICE9IDApOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ3aGlsZUxvb3BzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5saW1pdHMud2hpbGVMb29wcyA9ICh2YWx1ZSAhPSAwKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiZG9XaGlsZUxvb3BzIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5saW1pdHMuZG9XaGlsZUxvb3BzID0gKHZhbHVlICE9IDApOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJnZW5lcmFsVW5pZm9ybUluZGV4aW5nIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5saW1pdHMuZ2VuZXJhbFVuaWZvcm1JbmRleGluZyA9ICh2YWx1ZSAhPSAwKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiZ2VuZXJhbEF0dHJpYnV0ZU1hdHJpeFZlY3RvckluZGV4aW5nIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5saW1pdHMuZ2VuZXJhbEF0dHJpYnV0ZU1hdHJpeFZlY3RvckluZGV4aW5nID0gKHZhbHVlICE9IDApOworICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJnZW5lcmFsVmFyeWluZ0luZGV4aW5nIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5saW1pdHMuZ2VuZXJhbFZhcnlpbmdJbmRleGluZyA9ICh2YWx1ZSAhPSAwKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiZ2VuZXJhbFNhbXBsZXJJbmRleGluZyIpID09IDApCisgICAgICAgICAgICBSZXNvdXJjZXMubGltaXRzLmdlbmVyYWxTYW1wbGVySW5kZXhpbmcgPSAodmFsdWUgIT0gMCk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgImdlbmVyYWxWYXJpYWJsZUluZGV4aW5nIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5saW1pdHMuZ2VuZXJhbFZhcmlhYmxlSW5kZXhpbmcgPSAodmFsdWUgIT0gMCk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgImdlbmVyYWxDb25zdGFudE1hdHJpeFZlY3RvckluZGV4aW5nIikgPT0gMCkKKyAgICAgICAgICAgIFJlc291cmNlcy5saW1pdHMuZ2VuZXJhbENvbnN0YW50TWF0cml4VmVjdG9ySW5kZXhpbmcgPSAodmFsdWUgIT0gMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogdW5yZWNvZ25pemVkIGxpbWl0ICglcykgaW4gY29uZmlndXJhdGlvbiBmaWxlLlxuIiwgdG9rZW4pOworCisgICAgICAgIHRva2VuID0gc3RydG9rKDAsIGRlbGltcyk7CisgICAgfQorICAgIGlmIChjb25maWdTdHJpbmdzKSBGcmVlRmlsZURhdGEoY29uZmlnU3RyaW5ncyk7Cit9CisKK3ZvaWQgVmtUZXN0RnJhbWV3b3JrOjpTZXRNZXNzYWdlT3B0aW9ucyhFU2hNZXNzYWdlcyAmbWVzc2FnZXMpIHsKKyAgICBpZiAobV9jb21waWxlX29wdGlvbnMgJiBFT3B0aW9uUmVsYXhlZEVycm9ycykgbWVzc2FnZXMgPSAoRVNoTWVzc2FnZXMpKG1lc3NhZ2VzIHwgRVNoTXNnUmVsYXhlZEVycm9ycyk7CisgICAgaWYgKG1fY29tcGlsZV9vcHRpb25zICYgRU9wdGlvbkludGVybWVkaWF0ZSkgbWVzc2FnZXMgPSAoRVNoTWVzc2FnZXMpKG1lc3NhZ2VzIHwgRVNoTXNnQVNUKTsKKyAgICBpZiAobV9jb21waWxlX29wdGlvbnMgJiBFT3B0aW9uU3VwcHJlc3NXYXJuaW5ncykgbWVzc2FnZXMgPSAoRVNoTWVzc2FnZXMpKG1lc3NhZ2VzIHwgRVNoTXNnU3VwcHJlc3NXYXJuaW5ncyk7Cit9CisKKy8vCisvLyAgIE1hbGxvYyBhIHN0cmluZyBvZiBzdWZmaWNpZW50IHNpemUgYW5kIHJlYWQgYSBzdHJpbmcgaW50byBpdC4KKy8vCitjaGFyICoqVmtUZXN0RnJhbWV3b3JrOjpSZWFkRmlsZURhdGEoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKyAgICBGSUxFICppbjsKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfX0dOVUNfXykKKyAgICBpbiA9IGZvcGVuKGZpbGVOYW1lLCAiciIpOworICAgIGludCBlcnJvckNvZGUgPSBpbiA/IDAgOiAxOworI2Vsc2UKKyAgICBpbnQgZXJyb3JDb2RlID0gZm9wZW5fcygmaW4sIGZpbGVOYW1lLCAiciIpOworI2VuZGlmCisKKyAgICBjaGFyICpmZGF0YTsKKyAgICBzaXplX3QgY291bnQgPSAwOworICAgIGNvbnN0IGludCBtYXhTb3VyY2VTdHJpbmdzID0gNTsKKyAgICBjaGFyICoqcmV0dXJuX2RhdGEgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiAobWF4U291cmNlU3RyaW5ncyArIDEpKTsKKworICAgIGlmIChlcnJvckNvZGUpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogdW5hYmxlIHRvIG9wZW4gaW5wdXQgZmlsZTogJXNcbiIsIGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd2hpbGUgKGZnZXRjKGluKSAhPSBFT0YpIGNvdW50Kys7CisKKyAgICBmc2VlayhpbiwgMCwgU0VFS19TRVQpOworCisgICAgaWYgKCEoZmRhdGEgPSAoY2hhciAqKW1hbGxvYyhjb3VudCArIDIpKSkgeworICAgICAgICBwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChmcmVhZChmZGF0YSwgMSwgY291bnQsIGluKSAhPSBjb3VudCkgeworICAgICAgICBwcmludGYoIkVycm9yIHJlYWRpbmcgaW5wdXQgZmlsZTogJXNcbiIsIGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZkYXRhW2NvdW50XSA9ICdcMCc7CisgICAgZmNsb3NlKGluKTsKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICByZXR1cm5fZGF0YVswXSA9IChjaGFyICopbWFsbG9jKGNvdW50ICsgMik7CisgICAgICAgIHJldHVybl9kYXRhWzBdWzBdID0gJ1wwJzsKKyAgICAgICAgbV9udW1fc2hhZGVyX3N0cmluZ3MgPSAwOworICAgICAgICByZXR1cm4gcmV0dXJuX2RhdGE7CisgICAgfSBlbHNlCisgICAgICAgIG1fbnVtX3NoYWRlcl9zdHJpbmdzID0gMTsKKworICAgIHNpemVfdCBsZW4gPSAoaW50KShjZWlsKSgoZmxvYXQpY291bnQgLyAoZmxvYXQpbV9udW1fc2hhZGVyX3N0cmluZ3MpOworICAgIHNpemVfdCBwdHJfbGVuID0gMCwgaSA9IDA7CisgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICByZXR1cm5fZGF0YVtpXSA9IChjaGFyICopbWFsbG9jKGxlbiArIDIpOworICAgICAgICBtZW1jcHkocmV0dXJuX2RhdGFbaV0sIGZkYXRhICsgcHRyX2xlbiwgbGVuKTsKKyAgICAgICAgcmV0dXJuX2RhdGFbaV1bbGVuXSA9ICdcMCc7CisgICAgICAgIGNvdW50IC09IChsZW4pOworICAgICAgICBwdHJfbGVuICs9IChsZW4pOworICAgICAgICBpZiAoY291bnQgPCBsZW4pIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbV9udW1fc2hhZGVyX3N0cmluZ3MgPSAoaSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuID0gY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuX2RhdGE7Cit9CisKK3ZvaWQgVmtUZXN0RnJhbWV3b3JrOjpGcmVlRmlsZURhdGEoY2hhciAqKmRhdGEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbnVtX3NoYWRlcl9zdHJpbmdzOyBpKyspIGZyZWUoZGF0YVtpXSk7Cit9CisKKy8vCisvLyAgIERlZHVjZSB0aGUgbGFuZ3VhZ2UgZnJvbSB0aGUgZmlsZW5hbWUuICBGaWxlcyBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlCisvLyAgIGZvbGxvd2luZyBleHRlbnNpb25zOgorLy8KKy8vICAgLnZlcnQgPSB2ZXJ0ZXgKKy8vICAgLnRlc2MgPSB0ZXNzZWxsYXRpb24gY29udHJvbAorLy8gICAudGVzZSA9IHRlc3NlbGxhdGlvbiBldmFsdWF0aW9uCisvLyAgIC5nZW9tID0gZ2VvbWV0cnkKKy8vICAgLmZyYWcgPSBmcmFnbWVudAorLy8gICAuY29tcCA9IGNvbXB1dGUKKy8vCitFU2hMYW5ndWFnZSBWa1Rlc3RGcmFtZXdvcms6OkZpbmRMYW5ndWFnZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgIHNpemVfdCBleHQgPSBuYW1lLnJmaW5kKCcuJyk7CisgICAgaWYgKGV4dCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gRVNoTGFuZ1ZlcnRleDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzdWZmaXggPSBuYW1lLnN1YnN0cihleHQgKyAxLCBzdGQ6OnN0cmluZzo6bnBvcyk7CisgICAgaWYgKHN1ZmZpeCA9PSAidmVydCIpCisgICAgICAgIHJldHVybiBFU2hMYW5nVmVydGV4OworICAgIGVsc2UgaWYgKHN1ZmZpeCA9PSAidGVzYyIpCisgICAgICAgIHJldHVybiBFU2hMYW5nVGVzc0NvbnRyb2w7CisgICAgZWxzZSBpZiAoc3VmZml4ID09ICJ0ZXNlIikKKyAgICAgICAgcmV0dXJuIEVTaExhbmdUZXNzRXZhbHVhdGlvbjsKKyAgICBlbHNlIGlmIChzdWZmaXggPT0gImdlb20iKQorICAgICAgICByZXR1cm4gRVNoTGFuZ0dlb21ldHJ5OworICAgIGVsc2UgaWYgKHN1ZmZpeCA9PSAiZnJhZyIpCisgICAgICAgIHJldHVybiBFU2hMYW5nRnJhZ21lbnQ7CisgICAgZWxzZSBpZiAoc3VmZml4ID09ICJjb21wIikKKyAgICAgICAgcmV0dXJuIEVTaExhbmdDb21wdXRlOworCisgICAgcmV0dXJuIEVTaExhbmdWZXJ0ZXg7Cit9CisKKy8vCisvLyBDb252ZXJ0IFZLIHNoYWRlciB0eXBlIHRvIGNvbXBpbGVyJ3MKKy8vCitFU2hMYW5ndWFnZSBWa1Rlc3RGcmFtZXdvcms6OkZpbmRMYW5ndWFnZShjb25zdCBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc2hhZGVyX3R5cGUpIHsKKyAgICBzd2l0Y2ggKHNoYWRlcl90eXBlKSB7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gRVNoTGFuZ1ZlcnRleDsKKworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gRVNoTGFuZ1Rlc3NDb250cm9sOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVDoKKyAgICAgICAgICAgIHJldHVybiBFU2hMYW5nVGVzc0V2YWx1YXRpb247CisKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOgorICAgICAgICAgICAgcmV0dXJuIEVTaExhbmdHZW9tZXRyeTsKKworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gRVNoTGFuZ0ZyYWdtZW50OworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUOgorICAgICAgICAgICAgcmV0dXJuIEVTaExhbmdDb21wdXRlOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1JBWUdFTl9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gRVNoTGFuZ1JheUdlbk5WOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0FOWV9ISVRfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuIEVTaExhbmdBbnlIaXROVjsKKworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9DTE9TRVNUX0hJVF9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gRVNoTGFuZ0Nsb3Nlc3RIaXROVjsKKworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9NSVNTX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiBFU2hMYW5nTWlzc05WOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0lOVEVSU0VDVElPTl9CSVRfTlY6CisgICAgICAgICAgICByZXR1cm4gRVNoTGFuZ0ludGVyc2VjdE5WOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0NBTExBQkxFX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiBFU2hMYW5nQ2FsbGFibGVOVjsKKworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9UQVNLX0JJVF9OVjoKKyAgICAgICAgICAgIHJldHVybiBFU2hMYW5nVGFza05WOworCisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX01FU0hfQklUX05WOgorICAgICAgICAgICAgcmV0dXJuIEVTaExhbmdNZXNoTlY7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBFU2hMYW5nVmVydGV4OworICAgIH0KK30KKworLy8KKy8vIENvbXBpbGUgYSBnaXZlbiBzdHJpbmcgY29udGFpbmluZyBHTFNMIGludG8gU1BWIGZvciB1c2UgYnkgVksKKy8vIFJldHVybiB2YWx1ZSBvZiBmYWxzZSBtZWFucyBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQuCisvLworYm9vbCBWa1Rlc3RGcmFtZXdvcms6OkdMU0x0b1NQVihWa1BoeXNpY2FsRGV2aWNlTGltaXRzIGNvbnN0ICpjb25zdCBkZXZpY2VfbGltaXRzLCBjb25zdCBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc2hhZGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzaGFkZXIsIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gJnNwaXJ2LCBib29sIGRlYnVnLCB1aW50MzJfdCBzcGlydl9taW5vcl92ZXJzaW9uKSB7CisgICAgZ2xzbGFuZzo6VFByb2dyYW0gcHJvZ3JhbTsKKyAgICBjb25zdCBjaGFyICpzaGFkZXJTdHJpbmdzWzFdOworCisgICAgLy8gVE9ETzogRG8gd2Ugd2FudCB0byBsb2FkIGEgc3BlY2lhbCBjb25maWcgZmlsZSBkZXBlbmRpbmcgb24gdGhlCisgICAgLy8gc2hhZGVyIHNvdXJjZT8gT3B0aW9uYWwgbmFtZSBtYXliZT8KKyAgICAvLyAgICBTZXRDb25maWdGaWxlKGZpbGVOYW1lKTsKKworICAgIFByb2Nlc3NDb25maWdGaWxlKGRldmljZV9saW1pdHMpOworCisgICAgRVNoTWVzc2FnZXMgbWVzc2FnZXMgPSBFU2hNc2dEZWZhdWx0OworICAgIFNldE1lc3NhZ2VPcHRpb25zKG1lc3NhZ2VzKTsKKyAgICBtZXNzYWdlcyA9IHN0YXRpY19jYXN0PEVTaE1lc3NhZ2VzPihtZXNzYWdlcyB8IEVTaE1zZ1NwdlJ1bGVzIHwgRVNoTXNnVnVsa2FuUnVsZXMpOworICAgIGlmIChkZWJ1ZykgeworICAgICAgICBtZXNzYWdlcyA9IHN0YXRpY19jYXN0PEVTaE1lc3NhZ2VzPihtZXNzYWdlcyB8IEVTaE1zZ0RlYnVnSW5mbyk7CisgICAgfQorCisgICAgRVNoTGFuZ3VhZ2Ugc3RhZ2UgPSBGaW5kTGFuZ3VhZ2Uoc2hhZGVyX3R5cGUpOworICAgIGdsc2xhbmc6OlRTaGFkZXIgKnNoYWRlciA9IG5ldyBnbHNsYW5nOjpUU2hhZGVyKHN0YWdlKTsKKyAgICBzd2l0Y2ggKHNwaXJ2X21pbm9yX3ZlcnNpb24pIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc2hhZGVyLT5zZXRFbnZUYXJnZXQoZ2xzbGFuZzo6RVNoVGFyZ2V0U3B2LCBnbHNsYW5nOjpFU2hUYXJnZXRTcHZfMV8wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzaGFkZXItPnNldEVudlRhcmdldChnbHNsYW5nOjpFU2hUYXJnZXRTcHYsIGdsc2xhbmc6OkVTaFRhcmdldFNwdl8xXzEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNoYWRlci0+c2V0RW52VGFyZ2V0KGdsc2xhbmc6OkVTaFRhcmdldFNwdiwgZ2xzbGFuZzo6RVNoVGFyZ2V0U3B2XzFfMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc2hhZGVyLT5zZXRFbnZUYXJnZXQoZ2xzbGFuZzo6RVNoVGFyZ2V0U3B2LCBnbHNsYW5nOjpFU2hUYXJnZXRTcHZfMV8zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzaGFkZXItPnNldEVudlRhcmdldChnbHNsYW5nOjpFU2hUYXJnZXRTcHYsIGdsc2xhbmc6OkVTaFRhcmdldFNwdl8xXzQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHNoYWRlci0+c2V0RW52VGFyZ2V0KGdsc2xhbmc6OkVTaFRhcmdldFNwdiwgZ2xzbGFuZzo6RVNoVGFyZ2V0U3B2XzFfNSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzaGFkZXJTdHJpbmdzWzBdID0gcHNoYWRlcjsKKyAgICBzaGFkZXItPnNldFN0cmluZ3Moc2hhZGVyU3RyaW5ncywgMSk7CisKKyAgICBpZiAoIXNoYWRlci0+cGFyc2UoJlJlc291cmNlcywgKG1fY29tcGlsZV9vcHRpb25zICYgRU9wdGlvbkRlZmF1bHREZXNrdG9wKSA/IDExMCA6IDEwMCwgZmFsc2UsIG1lc3NhZ2VzKSkgeworICAgICAgICBpZiAoIShtX2NvbXBpbGVfb3B0aW9ucyAmIEVPcHRpb25TdXBwcmVzc0luZm9sb2cpKSB7CisgICAgICAgICAgICBwdXRzKHNoYWRlci0+Z2V0SW5mb0xvZygpKTsKKyAgICAgICAgICAgIHB1dHMoc2hhZGVyLT5nZXRJbmZvRGVidWdMb2coKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBzb21ldGhpbmcgZGlkbid0IHdvcmsKKyAgICB9CisKKyAgICBwcm9ncmFtLmFkZFNoYWRlcihzaGFkZXIpOworCisgICAgLy8KKyAgICAvLyBQcm9ncmFtLWxldmVsIHByb2Nlc3NpbmcuLi4KKyAgICAvLworCisgICAgaWYgKCFwcm9ncmFtLmxpbmsobWVzc2FnZXMpKSB7CisgICAgICAgIGlmICghKG1fY29tcGlsZV9vcHRpb25zICYgRU9wdGlvblN1cHByZXNzSW5mb2xvZykpIHsKKyAgICAgICAgICAgIHB1dHMoc2hhZGVyLT5nZXRJbmZvTG9nKCkpOworICAgICAgICAgICAgcHV0cyhzaGFkZXItPmdldEluZm9EZWJ1Z0xvZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobV9jb21waWxlX29wdGlvbnMgJiBFT3B0aW9uRHVtcFJlZmxlY3Rpb24pIHsKKyAgICAgICAgcHJvZ3JhbS5idWlsZFJlZmxlY3Rpb24oKTsKKyAgICAgICAgcHJvZ3JhbS5kdW1wUmVmbGVjdGlvbigpOworICAgIH0KKworICAgIGdsc2xhbmc6OlNwdk9wdGlvbnMgc3B2X29wdGlvbnM7CisgICAgaWYgKGRlYnVnKSB7CisgICAgICAgIHNwdl9vcHRpb25zLmdlbmVyYXRlRGVidWdJbmZvID0gdHJ1ZTsKKyAgICB9CisgICAgZ2xzbGFuZzo6R2xzbGFuZ1RvU3B2KCpwcm9ncmFtLmdldEludGVybWVkaWF0ZShzdGFnZSksIHNwaXJ2LCAmc3B2X29wdGlvbnMpOworCisgICAgLy8KKyAgICAvLyBUZXN0IHRoZSBkaWZmZXJlbnQgbW9kZXMgb2YgU1BJUi1WIG1vZGlmaWNhdGlvbgorICAgIC8vCisgICAgaWYgKHRoaXMtPm1fY2Fub25pY2FsaXplX3NwdikgeworICAgICAgICBzcHY6OnNwaXJ2YmluX3QoMCkucmVtYXAoc3BpcnYsIHNwdjo6c3BpcnZiaW5fdDo6QUxMX0JVVF9TVFJJUCk7CisgICAgfQorCisgICAgaWYgKHRoaXMtPm1fc3RyaXBfc3B2KSB7CisgICAgICAgIHNwdjo6c3BpcnZiaW5fdCgwKS5yZW1hcChzcGlydiwgc3B2OjpzcGlydmJpbl90OjpTVFJJUCk7CisgICAgfQorCisgICAgaWYgKHRoaXMtPm1fZG9fZXZlcnl0aGluZ19zcHYpIHsKKyAgICAgICAgc3B2OjpzcGlydmJpbl90KDApLnJlbWFwKHNwaXJ2LCBzcHY6OnNwaXJ2YmluX3Q6OkRPX0VWRVJZVEhJTkcpOworICAgIH0KKworICAgIGRlbGV0ZSBzaGFkZXI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8KKy8vIENvbXBpbGUgYSBnaXZlbiBzdHJpbmcgY29udGFpbmluZyBTUElSLVYgYXNzZW1ibHkgaW50byBTUFYgZm9yIHVzZSBieSBWSworLy8gUmV0dXJuIHZhbHVlIG9mIGZhbHNlIG1lYW5zIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KKy8vCitib29sIFZrVGVzdEZyYW1ld29yazo6QVNNdG9TUFYoY29uc3Qgc3B2X3RhcmdldF9lbnYgdGFyZ2V0X2VudiwgY29uc3QgdWludDMyX3Qgb3B0aW9ucywgY29uc3QgY2hhciAqcGFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZzcHYpIHsKKyAgICBzcHZfYmluYXJ5IGJpbmFyeTsKKyAgICBzcHZfZGlhZ25vc3RpYyBkaWFnbm9zdGljID0gbnVsbHB0cjsKKyAgICBzcHZfY29udGV4dCBjb250ZXh0ID0gc3B2Q29udGV4dENyZWF0ZSh0YXJnZXRfZW52KTsKKyAgICBzcHZfcmVzdWx0X3QgZXJyb3IgPSBzcHZUZXh0VG9CaW5hcnlXaXRoT3B0aW9ucyhjb250ZXh0LCBwYXNtLCBzdHJsZW4ocGFzbSksIG9wdGlvbnMsICZiaW5hcnksICZkaWFnbm9zdGljKTsKKyAgICBzcHZDb250ZXh0RGVzdHJveShjb250ZXh0KTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgc3B2RGlhZ25vc3RpY1ByaW50KGRpYWdub3N0aWMpOworICAgICAgICBzcHZEaWFnbm9zdGljRGVzdHJveShkaWFnbm9zdGljKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcHYuaW5zZXJ0KHNwdi5lbmQoKSwgYmluYXJ5LT5jb2RlLCBiaW5hcnktPmNvZGUgKyBiaW5hcnktPndvcmRDb3VudCk7CisgICAgc3B2QmluYXJ5RGVzdHJveShiaW5hcnkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a3Rlc3RmcmFtZXdvcmsuaCBiL3NyYy90aGlyZF9wYXJ0eS92dWxrYW4tdmFsaWRhdGlvbi1sYXllcnMvc3JjL3Rlc3RzL3ZrdGVzdGZyYW1ld29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTZhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a3Rlc3RmcmFtZXdvcmsuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKi8KKworI2lmbmRlZiBWS1RFU1RGUkFNRVdPUktfSAorI2RlZmluZSBWS1RFU1RGUkFNRVdPUktfSAorCisjaW5jbHVkZSAiU1BJUlYvR0xTTC5zdGQuNDUwLmgiCisjaW5jbHVkZSAic3BpcnYtdG9vbHMvbGlic3BpcnYuaCIKKyNpbmNsdWRlICJnbHNsYW5nL1B1YmxpYy9TaGFkZXJMYW5nLmgiCisjaW5jbHVkZSAiaWNkLXNwdi5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAidGVzdF9lbnZpcm9ubWVudC5oIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX1dJTjMyCisjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKy8vIENhbiBiZSB1c2VkIGJ5IHRlc3RzIHRvIHJlY29yZCBhZGRpdGlvbmFsIGRldGFpbHMgLyBkZXNjcmlwdGlvbiBvZiB0ZXN0CisjZGVmaW5lIFRFU1RfREVTQ1JJUFRJT04oZGVzYykgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzYykKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgVmtJbWFnZU9iajsKKworY2xhc3MgVmtUZXN0RnJhbWV3b3JrIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHB1YmxpYzoKKyAgICBWa0Zvcm1hdCBHZXRGb3JtYXQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdmtfdGVzdGluZzo6RGV2aWNlICpkZXZpY2UpOworICAgIHN0YXRpYyBib29sIG9wdGlvbk1hdGNoKGNvbnN0IGNoYXIgKm9wdGlvbiwgY2hhciAqb3B0aW9uTGluZSk7CisgICAgc3RhdGljIHZvaWQgSW5pdEFyZ3MoaW50ICphcmdjLCBjaGFyICphcmd2W10pOworICAgIHN0YXRpYyB2b2lkIEZpbmlzaCgpOworCisgICAgYm9vbCBHTFNMdG9TUFYoVmtQaHlzaWNhbERldmljZUxpbWl0cyBjb25zdCAqY29uc3QgZGV2aWNlX2xpbWl0cywgY29uc3QgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHNoYWRlcl90eXBlLCBjb25zdCBjaGFyICpwc2hhZGVyLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gJnNwdiwgYm9vbCBkZWJ1ZyA9IGZhbHNlLCB1aW50MzJfdCBzcGlydl9taW5vcl92ZXJzaW9uID0gMCk7CisgICAgYm9vbCBBU010b1NQVihjb25zdCBzcHZfdGFyZ2V0X2VudiB0YXJnZXRfZW52LCBjb25zdCB1aW50MzJfdCBvcHRpb25zLCBjb25zdCBjaGFyICpwYXNtLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZzcHYpOworICAgIHN0YXRpYyBib29sIG1fY2Fub25pY2FsaXplX3NwdjsKKyAgICBzdGF0aWMgYm9vbCBtX3N0cmlwX3NwdjsKKyAgICBzdGF0aWMgYm9vbCBtX2RvX2V2ZXJ5dGhpbmdfc3B2OworICAgIHN0YXRpYyBib29sIG1fZGV2c2ltX2xheWVyOworCisgICAgY2hhciAqKlJlYWRGaWxlRGF0YShjb25zdCBjaGFyICpmaWxlTmFtZSk7CisgICAgdm9pZCBGcmVlRmlsZURhdGEoY2hhciAqKmRhdGEpOworCisgIHByb3RlY3RlZDoKKyAgICBWa1Rlc3RGcmFtZXdvcmsoKTsKKyAgICB2aXJ0dWFsIH5Wa1Rlc3RGcmFtZXdvcmsoKSA9IDA7CisKKyAgcHJpdmF0ZToKKyAgICBpbnQgbV9jb21waWxlX29wdGlvbnM7CisgICAgaW50IG1fbnVtX3NoYWRlcl9zdHJpbmdzOworICAgIFRCdWlsdEluUmVzb3VyY2UgUmVzb3VyY2VzOworICAgIHZvaWQgU2V0TWVzc2FnZU9wdGlvbnMoRVNoTWVzc2FnZXMgJm1lc3NhZ2VzKTsKKyAgICB2b2lkIFByb2Nlc3NDb25maWdGaWxlKFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgY29uc3QgKmNvbnN0IGRldmljZV9saW1pdHMpOworICAgIEVTaExhbmd1YWdlIEZpbmRMYW5ndWFnZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisgICAgRVNoTGFuZ3VhZ2UgRmluZExhbmd1YWdlKGNvbnN0IFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzaGFkZXJfdHlwZSk7CisgICAgc3RkOjpzdHJpbmcgQ29uZmlnRmlsZTsKKyAgICBib29sIFNldENvbmZpZ0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIHN0YXRpYyBpbnQgbV93aWR0aDsKKyAgICBzdGF0aWMgaW50IG1faGVpZ2h0OworICAgIHN0cmluZyBtX3Rlc3ROYW1lOworfTsKKworY2xhc3MgVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpOworCisgICAgdm9pZCBUZWFyRG93bigpOworfTsKKworI2VuZGlmICAvLyBWS1RFU1RGUkFNRVdPUktfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrYW5kcm9pZC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a3Rlc3RmcmFtZXdvcmthbmRyb2lkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI1OTRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrYW5kcm9pZC5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8vICBWSyB0ZXN0cworLy8KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisvLyAgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgVmFsdmUgQ29ycG9yYXRpb24KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBMdW5hckcsIEluYy4KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBHb29nbGUsIEluYy4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInZrdGVzdGZyYW1ld29ya2FuZHJvaWQuaCIKKyNpbmNsdWRlICJzaGFkZXJjL3NoYWRlcmMuaHBwIgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisKK1ZrVGVzdEZyYW1ld29yazo6VmtUZXN0RnJhbWV3b3JrKCkge30KK1ZrVGVzdEZyYW1ld29yazo6flZrVGVzdEZyYW1ld29yaygpIHt9CisKKy8vIERlZmluZSBzdGF0aWMgZWxlbWVudHMKK2Jvb2wgVmtUZXN0RnJhbWV3b3JrOjptX2RldnNpbV9sYXllciA9IGZhbHNlOworQU5hdGl2ZVdpbmRvdyAqVmtUZXN0RnJhbWV3b3JrOjp3aW5kb3cgPSBudWxscHRyOworCitWa0Zvcm1hdCBWa1Rlc3RGcmFtZXdvcms6OkdldEZvcm1hdChWa0luc3RhbmNlIGluc3RhbmNlLCB2a190ZXN0aW5nOjpEZXZpY2UgKmRldmljZSkgeworICAgIFZrRm9ybWF0UHJvcGVydGllcyBmb3JtYXRfcHJvcHM7CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhkZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sICZmb3JtYXRfcHJvcHMpOworICAgIGlmIChmb3JtYXRfcHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8fAorICAgICAgICBmb3JtYXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICB9CisgICAgdms6OkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyhkZXZpY2UtPnBoeSgpLmhhbmRsZSgpLCBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0sICZmb3JtYXRfcHJvcHMpOworICAgIGlmIChmb3JtYXRfcHJvcHMubGluZWFyVGlsaW5nRmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCB8fAorICAgICAgICBmb3JtYXRfcHJvcHMub3B0aW1hbFRpbGluZ0ZlYXR1cmVzICYgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICB9CisgICAgcHJpbnRmKCJFcnJvciAtIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STSBub3IgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNIC0gZXhpdGluZ1xuIik7CisgICAgZXhpdCgwKTsKK30KKwordm9pZCBWa1Rlc3RGcmFtZXdvcms6OkluaXRBcmdzKGludCAqYXJnYywgY2hhciAqYXJndltdKSB7fQordm9pZCBWa1Rlc3RGcmFtZXdvcms6OkZpbmlzaCgpIHt9CisKK3ZvaWQgVGVzdEVudmlyb25tZW50OjpTZXRVcCgpIHsKKyAgICB2a190ZXN0aW5nOjpzZXRfZXJyb3JfY2FsbGJhY2sodGVzdF9lcnJvcl9jYWxsYmFjayk7CisKKyAgICB2azo6SW5pdERpc3BhdGNoVGFibGUoKTsKK30KKwordm9pZCBUZXN0RW52aXJvbm1lbnQ6OlRlYXJEb3duKCkge30KKworLy8gQW5kcm9pZCBzcGVjaWZpYyBoZWxwZXIgZnVuY3Rpb25zIGZvciBzaGFkZXJjLgorc3RydWN0IHNoYWRlcl90eXBlX21hcHBpbmcgeworICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyB2a3NoYWRlcl90eXBlOworICAgIHNoYWRlcmNfc2hhZGVyX2tpbmQgc2hhZGVyY190eXBlOworfTsKKworc3RhdGljIGNvbnN0IHNoYWRlcl90eXBlX21hcHBpbmcgc2hhZGVyX21hcF90YWJsZVtdID0geworICAgIHtWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCwgc2hhZGVyY19nbHNsX3ZlcnRleF9zaGFkZXJ9LAorICAgIHtWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0NPTlRST0xfQklULCBzaGFkZXJjX2dsc2xfdGVzc19jb250cm9sX3NoYWRlcn0sCisgICAge1ZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQsIHNoYWRlcmNfZ2xzbF90ZXNzX2V2YWx1YXRpb25fc2hhZGVyfSwKKyAgICB7VktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCwgc2hhZGVyY19nbHNsX2dlb21ldHJ5X3NoYWRlcn0sCisgICAge1ZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIHNoYWRlcmNfZ2xzbF9mcmFnbWVudF9zaGFkZXJ9LAorICAgIHtWS19TSEFERVJfU1RBR0VfQ09NUFVURV9CSVQsIHNoYWRlcmNfZ2xzbF9jb21wdXRlX3NoYWRlcn0sCit9OworCitzaGFkZXJjX3NoYWRlcl9raW5kIE1hcFNoYWRlcmNUeXBlKFZrU2hhZGVyU3RhZ2VGbGFnQml0cyB2a1NoYWRlcikgeworICAgIGZvciAoYXV0byBzaGFkZXIgOiBzaGFkZXJfbWFwX3RhYmxlKSB7CisgICAgICAgIGlmIChzaGFkZXIudmtzaGFkZXJfdHlwZSA9PSB2a1NoYWRlcikgeworICAgICAgICAgICAgcmV0dXJuIHNoYWRlci5zaGFkZXJjX3R5cGU7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICByZXR1cm4gc2hhZGVyY19nbHNsX2luZmVyX2Zyb21fc291cmNlOworfQorCisvLyBDb21waWxlIGEgZ2l2ZW4gc3RyaW5nIGNvbnRhaW5pbmcgR0xTTCBpbnRvIFNQSVItVgorLy8gUmV0dXJuIHZhbHVlIG9mIGZhbHNlIG1lYW5zIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZAorYm9vbCBWa1Rlc3RGcmFtZXdvcms6OkdMU0x0b1NQVihWa1BoeXNpY2FsRGV2aWNlTGltaXRzIGNvbnN0ICpjb25zdCBkZXZpY2VfbGltaXRzLCBjb25zdCBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc2hhZGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzaGFkZXIsIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gJnNwaXJ2LCBib29sIGRlYnVnLCB1aW50MzJfdCBzcGlydl9taW5vcl92ZXJzaW9uKSB7CisgICAgLy8gT24gQW5kcm9pZCwgdXNlIHNoYWRlcmMgaW5zdGVhZC4KKyAgICBzaGFkZXJjOjpDb21waWxlciBjb21waWxlcjsKKyAgICBzaGFkZXJjOjpDb21waWxlT3B0aW9ucyBvcHRpb25zOworICAgIGlmIChkZWJ1ZykgeworICAgICAgICBvcHRpb25zLlNldE9wdGltaXphdGlvbkxldmVsKHNoYWRlcmNfb3B0aW1pemF0aW9uX2xldmVsX3plcm8pOworICAgICAgICBvcHRpb25zLlNldEdlbmVyYXRlRGVidWdJbmZvKCk7CisgICAgfQorCisgICAgc3dpdGNoIChzcGlydl9taW5vcl92ZXJzaW9uKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIG9wdGlvbnMuU2V0VGFyZ2V0U3BpcnYoc2hhZGVyY19zcGlydl92ZXJzaW9uXzFfMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgb3B0aW9ucy5TZXRUYXJnZXRTcGlydihzaGFkZXJjX3NwaXJ2X3ZlcnNpb25fMV8xKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBvcHRpb25zLlNldFRhcmdldFNwaXJ2KHNoYWRlcmNfc3BpcnZfdmVyc2lvbl8xXzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIG9wdGlvbnMuU2V0VGFyZ2V0U3BpcnYoc2hhZGVyY19zcGlydl92ZXJzaW9uXzFfMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgb3B0aW9ucy5TZXRUYXJnZXRTcGlydihzaGFkZXJjX3NwaXJ2X3ZlcnNpb25fMV80KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIE92ZXJyaWRlIGdsc2xhbmcgYnVpbHQtaW4gR0wgc2V0dGluZ3Mgd2l0aCBhY3R1YWwgaGFyZHdhcmUgdmFsdWVzCisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9jbGlwX2Rpc3RhbmNlcywgZGV2aWNlX2xpbWl0cy0+bWF4Q2xpcERpc3RhbmNlcyk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9jb21wdXRlX3dvcmtfZ3JvdXBfY291bnRfeCwgZGV2aWNlX2xpbWl0cy0+bWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzBdKTsKKyAgICBvcHRpb25zLlNldExpbWl0KHNoYWRlcmNfbGltaXRfbWF4X2NvbXB1dGVfd29ya19ncm91cF9jb3VudF95LCBkZXZpY2VfbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0pOworICAgIG9wdGlvbnMuU2V0TGltaXQoc2hhZGVyY19saW1pdF9tYXhfY29tcHV0ZV93b3JrX2dyb3VwX2NvdW50X3osIGRldmljZV9saW1pdHMtPm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsyXSk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9jb21wdXRlX3dvcmtfZ3JvdXBfc2l6ZV94LCBkZXZpY2VfbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVswXSk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9jb21wdXRlX3dvcmtfZ3JvdXBfc2l6ZV95LCBkZXZpY2VfbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsxXSk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9jb21wdXRlX3dvcmtfZ3JvdXBfc2l6ZV96LCBkZXZpY2VfbGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9jdWxsX2Rpc3RhbmNlcywgZGV2aWNlX2xpbWl0cy0+bWF4Q3VsbERpc3RhbmNlcyk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9mcmFnbWVudF9pbnB1dF9jb21wb25lbnRzLCBkZXZpY2VfbGltaXRzLT5tYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9nZW9tZXRyeV9pbnB1dF9jb21wb25lbnRzLCBkZXZpY2VfbGltaXRzLT5tYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9nZW9tZXRyeV9vdXRwdXRfY29tcG9uZW50cywgZGV2aWNlX2xpbWl0cy0+bWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzKTsKKyAgICBvcHRpb25zLlNldExpbWl0KHNoYWRlcmNfbGltaXRfbWF4X2dlb21ldHJ5X291dHB1dF92ZXJ0aWNlcywgZGV2aWNlX2xpbWl0cy0+bWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyk7CisgICAgb3B0aW9ucy5TZXRMaW1pdChzaGFkZXJjX2xpbWl0X21heF9nZW9tZXRyeV90b3RhbF9vdXRwdXRfY29tcG9uZW50cywgZGV2aWNlX2xpbWl0cy0+bWF4R2VvbWV0cnlUb3RhbE91dHB1dENvbXBvbmVudHMpOworICAgIG9wdGlvbnMuU2V0TGltaXQoc2hhZGVyY19saW1pdF9tYXhfdmVydGV4X291dHB1dF9jb21wb25lbnRzLCBkZXZpY2VfbGltaXRzLT5tYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzKTsKKyAgICBvcHRpb25zLlNldExpbWl0KHNoYWRlcmNfbGltaXRfbWF4X3ZpZXdwb3J0cywgZGV2aWNlX2xpbWl0cy0+bWF4Vmlld3BvcnRzKTsKKworICAgIHNoYWRlcmM6OlNwdkNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9CisgICAgICAgIGNvbXBpbGVyLkNvbXBpbGVHbHNsVG9TcHYocHNoYWRlciwgc3RybGVuKHBzaGFkZXIpLCBNYXBTaGFkZXJjVHlwZShzaGFkZXJfdHlwZSksICJzaGFkZXIiLCBvcHRpb25zKTsKKyAgICBpZiAocmVzdWx0LkdldENvbXBpbGF0aW9uU3RhdHVzKCkgIT0gc2hhZGVyY19jb21waWxhdGlvbl9zdGF0dXNfc3VjY2VzcykgeworICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCAiVnVsa2FuTGF5ZXJWYWxpZGF0aW9uVGVzdHMiLCAiR0xTTHRvU1BWIGNvbXBpbGF0aW9uIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5HZXRFcnJvck1lc3NhZ2UoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoYXV0byBpdGVyID0gcmVzdWx0LmJlZ2luKCk7IGl0ZXIgIT0gcmVzdWx0LmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgc3BpcnYucHVzaF9iYWNrKCppdGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8KKy8vIENvbXBpbGUgYSBnaXZlbiBzdHJpbmcgY29udGFpbmluZyBTUElSLVYgYXNzZW1ibHkgaW50byBTUFYgZm9yIHVzZSBieSBWSworLy8gUmV0dXJuIHZhbHVlIG9mIGZhbHNlIG1lYW5zIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KKy8vCitib29sIFZrVGVzdEZyYW1ld29yazo6QVNNdG9TUFYoY29uc3Qgc3B2X3RhcmdldF9lbnYgdGFyZ2V0X2VudiwgY29uc3QgdWludDMyX3Qgb3B0aW9ucywgY29uc3QgY2hhciAqcGFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZzcHYpIHsKKyAgICBzcHZfYmluYXJ5IGJpbmFyeTsKKyAgICBzcHZfZGlhZ25vc3RpYyBkaWFnbm9zdGljID0gbnVsbHB0cjsKKyAgICBzcHZfY29udGV4dCBjb250ZXh0ID0gc3B2Q29udGV4dENyZWF0ZSh0YXJnZXRfZW52KTsKKyAgICBzcHZfcmVzdWx0X3QgZXJyb3IgPSBzcHZUZXh0VG9CaW5hcnlXaXRoT3B0aW9ucyhjb250ZXh0LCBwYXNtLCBzdHJsZW4ocGFzbSksIG9wdGlvbnMsICZiaW5hcnksICZkaWFnbm9zdGljKTsKKyAgICBzcHZDb250ZXh0RGVzdHJveShjb250ZXh0KTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgIlZrTGF5ZXJWYWxpZGF0aW9uVGVzdCIsICJBU010b1NQViBjb21waWxhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgc3B2RGlhZ25vc3RpY0Rlc3Ryb3koZGlhZ25vc3RpYyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3B2Lmluc2VydChzcHYuZW5kKCksIGJpbmFyeS0+Y29kZSwgYmluYXJ5LT5jb2RlICsgYmluYXJ5LT53b3JkQ291bnQpOworICAgIHNwdkJpbmFyeURlc3Ryb3koYmluYXJ5KTsKKworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrYW5kcm9pZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Z1bGthbi12YWxpZGF0aW9uLWxheWVycy9zcmMvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrYW5kcm9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzYyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdnVsa2FuLXZhbGlkYXRpb24tbGF5ZXJzL3NyYy90ZXN0cy92a3Rlc3RmcmFtZXdvcmthbmRyb2lkLmgKQEAgLTAsMCArMSw1NCBAQAorLy8gIFZLIHRlc3RzCisvLworLy8gIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBWYWx2ZSBDb3Jwb3JhdGlvbgorLy8gIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEx1bmFyRywgSW5jLgorLy8gIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IEdvb2dsZSwgSW5jLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIFZLVEVTVEZSQU1FV09SS0FORFJPSURfSAorI2RlZmluZSBWS1RFU1RGUkFNRVdPUktBTkRST0lEX0gKKworI2luY2x1ZGUgInNwaXJ2LXRvb2xzL2xpYnNwaXJ2LmgiCisjaW5jbHVkZSAidGVzdF9jb21tb24uaCIKKworLy8gQ2FuIGJlIHVzZWQgYnkgdGVzdHMgdG8gcmVjb3JkIGFkZGl0aW9uYWwgZGV0YWlscyAvIGRlc2NyaXB0aW9uIG9mIHRlc3QKKyNkZWZpbmUgVEVTVF9ERVNDUklQVElPTihkZXNjKSBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjKQorCisjZGVmaW5lIElDRF9TUFZfTUFHSUMgMHgwNzIzMDIwMworCitjbGFzcyBWa1Rlc3RGcmFtZXdvcmsgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIFZrVGVzdEZyYW1ld29yaygpOworICAgIH5Wa1Rlc3RGcmFtZXdvcmsoKTsKKworICAgIHN0YXRpYyB2b2lkIEluaXRBcmdzKGludCAqYXJnYywgY2hhciAqYXJndltdKTsKKyAgICBzdGF0aWMgdm9pZCBGaW5pc2goKTsKKworICAgIFZrRm9ybWF0IEdldEZvcm1hdChWa0luc3RhbmNlIGluc3RhbmNlLCB2a190ZXN0aW5nOjpEZXZpY2UgKmRldmljZSk7CisgICAgYm9vbCBHTFNMdG9TUFYoVmtQaHlzaWNhbERldmljZUxpbWl0cyBjb25zdCAqY29uc3QgZGV2aWNlX2xpbWl0cywgY29uc3QgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHNoYWRlcl90eXBlLCBjb25zdCBjaGFyICpwc2hhZGVyLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gJnNwdiwgYm9vbCBkZWJ1ZyA9IGZhbHNlLCB1aW50MzJfdCBzcGlydl9taW5vcl92ZXJzaW9uID0gMCk7CisgICAgYm9vbCBBU010b1NQVihjb25zdCBzcHZfdGFyZ2V0X2VudiB0YXJnZXRfZW52LCBjb25zdCB1aW50MzJfdCBvcHRpb25zLCBjb25zdCBjaGFyICpwYXNtLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZzcHYpOworICAgIHN0YXRpYyBib29sIG1fZGV2c2ltX2xheWVyOworICAgIHN0YXRpYyBBTmF0aXZlV2luZG93ICp3aW5kb3c7Cit9OworCitjbGFzcyBUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICB2b2lkIFNldFVwKCk7CisKKyAgICB2b2lkIFRlYXJEb3duKCk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS96bGliL3psaWIuZ3lwIGIvc3JjL3RoaXJkX3BhcnR5L3psaWIvemxpYi5neXAKaW5kZXggZDhiZGY5Ni4uODkyMzhmYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3psaWIvemxpYi5neXAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3psaWIvemxpYi5neXAKQEAgLTUxLDYgKzUxLDEyIEBACiAgICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKICAgICAgICAgICAgICcuJywKICAgICAgICAgICBdLAorICAgICAgICAgICdhbGxfZGVwZW5kZW50X3NldHRpbmdzJzogeworICAgICAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgICAgICAjIFRvIHByZXZlbnQgWmxpYiBldmVyIGZyb20gcmVkZWZpbmluZyBjb25zdCBrZXl3b3JkIGluIHpjb25mLmgKKyAgICAgICAgICAgICAgJ1NUREMnCisgICAgICAgICAgICBdCisgICAgICAgICAgfSwKICAgICAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKICAgICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCiAgICAgICAgICAgICAgICcuJywKZGlmZiAtLWdpdCBhL3NyYy91cmwvcnVuX2FsbF91bml0dGVzdHMuY2MgYi9zcmMvdXJsL3J1bl9hbGxfdW5pdHRlc3RzLmNjCmluZGV4IGNmYzZhNDMuLjkxNmEzZWIgMTAwNjQ0Ci0tLSBhL3NyYy91cmwvcnVuX2FsbF91bml0dGVzdHMuY2MKKysrIGIvc3JjL3VybC9ydW5fYWxsX3VuaXR0ZXN0cy5jYwpAQCAtMiwxNSArMiwyOCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgPG1lbW9yeT4KLQogI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvdGVzdC9sYXVuY2hlci91bml0X3Rlc3RfbGF1bmNoZXIuaCIKLSNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF9pb190aHJlYWQuaCIKICNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF9zdWl0ZS5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgogCi0jaWYgIWRlZmluZWQoT1NfSU9TKSAmJiAhZGVmaW5lZChTVEFSQk9BUkQpCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvd3JhcF9tYWluL3dyYXBfbWFpbi5oIgorCitpbnQgVGVzdFN1aXRlUnVuKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBiYXNlOjpUZXN0U3VpdGUgdGVzdF9zdWl0ZShhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIGJhc2U6OlRlc3RTdWl0ZShhcmdjLCBhcmd2KS5SdW4oKTsKK30KKworU1RBUkJPQVJEX1dSQVBfU0lNUExFX01BSU4oVGVzdFN1aXRlUnVuKTsKKworI2Vsc2UKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJiYXNlL3Rlc3QvbGF1bmNoZXIvdW5pdF90ZXN0X2xhdW5jaGVyLmgiCisjaW5jbHVkZSAiYmFzZS90ZXN0L3Rlc3RfaW9fdGhyZWFkLmgiCisKKyNpZiAhZGVmaW5lZChPU19JT1MpCiAjaW5jbHVkZSAibW9qby9jb3JlL2VtYmVkZGVyL2VtYmVkZGVyLmgiICAvLyBub2duY2hlY2sKICNlbmRpZgogCkBAIC0yNSwzICszOCw1IEBACiAgICAgICBhcmdjLCBhcmd2LAogICAgICAgYmFzZTo6QmluZE9uY2UoJmJhc2U6OlRlc3RTdWl0ZTo6UnVuLCBiYXNlOjpVbnJldGFpbmVkKCZ0ZXN0X3N1aXRlKSkpOwogfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy91cmwvdXJsLmd5cCBiL3NyYy91cmwvdXJsLmd5cAppbmRleCA1MTAyMzM5Li5mODMxMzViIDEwMDY0NAotLS0gYS9zcmMvdXJsL3VybC5neXAKKysrIGIvc3JjL3VybC91cmwuZ3lwCkBAIC04OCw4ICs4OCw4IEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6YmFzZV9pMThuJywKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDp0ZXN0X3N1cHBvcnRfYmFzZScsCisgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9pY3UvaWN1Lmd5cDppY3V1YycsCiAgICAgICAgICd1cmwnLApAQCAtOTcsNiArOTcsNyBAQAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICdndXJsX3VuaXR0ZXN0LmNjJywKICAgICAgICAgJ29yaWdpbl91bml0dGVzdC5jYycsCisgICAgICAgICdydW5fYWxsX3VuaXR0ZXN0cy5jYycsCiAgICAgICAgICdzY2hlbWVfaG9zdF9wb3J0X3VuaXR0ZXN0LmNjJywKICAgICAgICAgJ3VybF9jYW5vbl9pY3VfdW5pdHRlc3QuY2MnLAogICAgICAgICAndXJsX2Nhbm9uX3VuaXR0ZXN0LmNjJywK